commit d8901e1a879f696e512e13d389d666baae33dc84 Author: Hamza-Ayed Date: Tue Jun 9 08:40:31 2026 +0300 first commit diff --git a/README.md b/README.md new file mode 100644 index 0000000..0f57517 --- /dev/null +++ b/README.md @@ -0,0 +1,3 @@ +# Siro Project + +Welcome to the Siro project. diff --git a/backend/.gitignore b/backend/.gitignore new file mode 100644 index 0000000..d512a54 --- /dev/null +++ b/backend/.gitignore @@ -0,0 +1,5 @@ +.DS_Store +logs/ +*.log +.gemini/ +portrate_captain_image/ diff --git a/backend/Admin/AdminCaptain/add.php b/backend/Admin/AdminCaptain/add.php new file mode 100644 index 0000000..e69de29 diff --git a/backend/Admin/AdminCaptain/delete.php b/backend/Admin/AdminCaptain/delete.php new file mode 100644 index 0000000..e69de29 diff --git a/backend/Admin/AdminCaptain/error_log b/backend/Admin/AdminCaptain/error_log new file mode 100644 index 0000000..e69de29 diff --git a/backend/Admin/AdminCaptain/get.php b/backend/Admin/AdminCaptain/get.php new file mode 100644 index 0000000..73c9b43 --- /dev/null +++ b/backend/Admin/AdminCaptain/get.php @@ -0,0 +1,75 @@ +prepare($sql); +$stmt->execute(); +$result = $stmt->fetchAll(PDO::FETCH_ASSOC); + +// فك تشفير الحقول الحساسة +foreach ($result as &$row) { + $row['phone'] = $encryptionHelper->decryptData($row['phone']); + $row['email'] = $encryptionHelper->decryptData($row['email']); + $row['gender'] = $encryptionHelper->decryptData($row['gender']); + $row['birthdate'] = $encryptionHelper->decryptData($row['birthdate']); + $row['site'] = $encryptionHelper->decryptData($row['site']); + $row['first_name'] = $encryptionHelper->decryptData($row['first_name']); + $row['last_name'] = $encryptionHelper->decryptData($row['last_name']); + $row['employmentType'] = $encryptionHelper->decryptData($row['employmentType']); + $row['maritalStatus'] = $encryptionHelper->decryptData($row['maritalStatus']); +} + +if (count($result) > 0) { + jsonSuccess($result); +} else { + jsonError("No records found"); +} +?> \ No newline at end of file diff --git a/backend/Admin/AdminCaptain/getCaptainDetailsByEmailOrIDOrPhone.php b/backend/Admin/AdminCaptain/getCaptainDetailsByEmailOrIDOrPhone.php new file mode 100644 index 0000000..5902c44 --- /dev/null +++ b/backend/Admin/AdminCaptain/getCaptainDetailsByEmailOrIDOrPhone.php @@ -0,0 +1,86 @@ +encryptData(filterRequest("driverEmail")); +$driverPhone = $encryptionHelper->encryptData(filterRequest("driverPhone")); + +$sql = "SELECT + `driver`.`id`, + `driver`.`phone`, + `driver`.`email`, + `driver`.`gender`, + `driver`.`status`, + `driver`.`birthdate`, + `driver`.`site`, + `driver`.`first_name`, + `driver`.`last_name`, + `driver`.`education`, + `driver`.`employmentType`, + `driver`.`maritalStatus`, + `driver`.`created_at`, + `driver`.`updated_at`, + ( + SELECT COUNT(*) FROM `driver` + ) AS countPassenger, + ( + SELECT CAST(AVG(`rating`) AS DECIMAL(10, 2)) + FROM `ratingPassenger` + WHERE `ratingPassenger`.`driverID` = `driver`.`id` + ) AS ratingPassenger, + ( + SELECT COUNT(*) FROM `ratingPassenger` WHERE `driverID` = `driver`.`id` + ) AS countDriverRate, + ( + SELECT COUNT(*) FROM `canecl` WHERE `driverID` = `driver`.`id` + ) AS countPassengerCancel, + ( + SELECT CAST(AVG(`rating`) AS DECIMAL(10, 2)) + FROM `ratingDriver` + WHERE `driver_id` = `driver`.`id` + ) AS passengerAverageRating, + ( + SELECT COUNT(*) FROM `ratingDriver` WHERE `driver_id` = `driver`.`id` + ) AS countPassengerRate, + ( + SELECT COUNT(*) FROM `ride` WHERE `driver_id` = `driver`.`id` + ) AS countPassengerRide, + ( + SELECT `token` + FROM `driverToken` + WHERE `captain_id` = `driver`.`id` + LIMIT 1 + ) AS passengerToken +FROM `driver` +WHERE `driver`.`email` = :email OR `driver`.`phone` = :phone OR `driver`.`id` = :id +ORDER BY passengerAverageRating DESC +LIMIT 10 +"; + +$stmt = $con->prepare($sql); +$stmt->bindParam(":email", $driverEmail); +$stmt->bindParam(":phone", $driverPhone); +$stmt->bindParam(":id", $driver_id); +$stmt->execute(); +$result = $stmt->fetchAll(PDO::FETCH_ASSOC); + +// فك تشفير الحقول الحساسة +foreach ($result as &$row) { + $row['phone'] = $encryptionHelper->decryptData($row['phone']); + $row['email'] = $encryptionHelper->decryptData($row['email']); + $row['gender'] = $encryptionHelper->decryptData($row['gender']); + $row['birthdate'] = $encryptionHelper->decryptData($row['birthdate']); + $row['site'] = $encryptionHelper->decryptData($row['site']); + $row['first_name'] = $encryptionHelper->decryptData($row['first_name']); + $row['last_name'] = $encryptionHelper->decryptData($row['last_name']); + $row['education'] = $encryptionHelper->decryptData($row['education']); + $row['employmentType'] = $encryptionHelper->decryptData($row['employmentType']); + $row['maritalStatus'] = $encryptionHelper->decryptData($row['maritalStatus']); +} + +if ($stmt->rowCount() > 0) { + jsonSuccess($result); +} else { + jsonError("No records found"); +} +?> \ No newline at end of file diff --git a/backend/Admin/AdminCaptain/getCaptainDetailsById.php b/backend/Admin/AdminCaptain/getCaptainDetailsById.php new file mode 100644 index 0000000..a9cb985 --- /dev/null +++ b/backend/Admin/AdminCaptain/getCaptainDetailsById.php @@ -0,0 +1,87 @@ +prepare($sql); +$stmt->bindParam(':driver_id', $driver_id); +$stmt->execute(); + +$result = $stmt->fetchAll(PDO::FETCH_ASSOC); + +// فك تشفير الحقول الحساسة بعد الجلب +foreach ($result as &$row) { + $row['phone'] = $encryptionHelper->decryptData($row['phone']); + $row['email'] = $encryptionHelper->decryptData($row['email']); + $row['gender'] = $encryptionHelper->decryptData($row['gender']); + $row['birthdate'] = $encryptionHelper->decryptData($row['birthdate']); + $row['site'] = $encryptionHelper->decryptData($row['site']); + $row['first_name'] = $encryptionHelper->decryptData($row['first_name']); + $row['last_name'] = $encryptionHelper->decryptData($row['last_name']); + $row['education'] = $encryptionHelper->decryptData($row['education']); + $row['employmentType'] = $encryptionHelper->decryptData($row['employmentType']); + $row['maritalStatus'] = $encryptionHelper->decryptData($row['maritalStatus']); +} + +if ($stmt->rowCount() > 0) { + jsonSuccess($result); +} else { + jsonError("No records found"); +} +?> \ No newline at end of file diff --git a/backend/Admin/AdminCaptain/getDriversPhonesAndTokens.php b/backend/Admin/AdminCaptain/getDriversPhonesAndTokens.php new file mode 100755 index 0000000..4743600 --- /dev/null +++ b/backend/Admin/AdminCaptain/getDriversPhonesAndTokens.php @@ -0,0 +1,33 @@ +prepare($sql); +$stmt->execute(); +$result = $stmt->fetchAll(PDO::FETCH_ASSOC); + +// فك التشفير للحقول الحساسة +foreach ($result as &$row) { + $row['phone'] = $encryptionHelper->decryptData($row['phone']); + if (!empty($row['token'])) { + $row['token'] = $encryptionHelper->decryptData($row['token']); + } +} + +if ($stmt->rowCount() > 0) { + jsonSuccess($result); +} else { + jsonError("No records found"); +} +?> \ No newline at end of file diff --git a/backend/Admin/AdminCaptain/update.php b/backend/Admin/AdminCaptain/update.php new file mode 100644 index 0000000..e69de29 diff --git a/backend/Admin/AdminRide/get.php b/backend/Admin/AdminRide/get.php new file mode 100644 index 0000000..84b7b6d --- /dev/null +++ b/backend/Admin/AdminRide/get.php @@ -0,0 +1,79 @@ +prepare($sql); +$stmt->execute(); +$result = $stmt->fetchAll(PDO::FETCH_ASSOC); + +if ($stmt->rowCount() > 0) { + jsonSuccess($result); +} else { + jsonError("No records found"); +} +?> \ No newline at end of file diff --git a/backend/Admin/AdminRide/getRidesPerMonth.php b/backend/Admin/AdminRide/getRidesPerMonth.php new file mode 100644 index 0000000..7b8c523 --- /dev/null +++ b/backend/Admin/AdminRide/getRidesPerMonth.php @@ -0,0 +1,52 @@ +prepare($sql); +$stmt->execute(); +$dailyRides = $stmt->fetchAll(PDO::FETCH_ASSOC); + +// SQL to get current month's total ride count +$sqlMonth = " +SELECT COUNT(*) AS current_month_rides_count +FROM ride +WHERE MONTH(date) = :currentMonth AND YEAR(date) = :currentYear +"; +$stmtMonth = $con->prepare($sqlMonth); +$stmtMonth->bindParam(':currentMonth', $currentMonth); +$stmtMonth->bindParam(':currentYear', $currentYear); +$stmtMonth->execute(); +$monthRides = $stmtMonth->fetch(PDO::FETCH_ASSOC); + +// Append current month total to each row (if needed) +foreach ($dailyRides as &$row) { + $row['current_month_rides_count'] = $monthRides['current_month_rides_count']; +} + +// Return result +if ($dailyRides) { + jsonSuccess($dailyRides); +} else { + jsonError("No records found"); +} +?> \ No newline at end of file diff --git a/backend/Admin/Staff/add.php b/backend/Admin/Staff/add.php new file mode 100644 index 0000000..b881e4f --- /dev/null +++ b/backend/Admin/Staff/add.php @@ -0,0 +1,91 @@ +query("SELECT COUNT(*) FROM adminUser")->fetchColumn(); +// if ($count > 0) die("Access Denied: Admin already initialized."); + // $auth = JwtService::authenticate($redis); + // if ($auth['role'] !== 'super_admin' && $auth['role'] !== 'admin') { + // jsonError("Unauthorized. Only Admins can add staff."); + // exit; + // } + +$name = filterRequest("name"); +$phone = filterRequest("phone"); +$email = filterRequest("email"); +$password = filterRequest("password"); +$role = filterRequest("role"); // 'admin' or 'service' +$fingerprint = filterRequest("fingerprint") ?: ''; +$gender = filterRequest("gender") ?? 'Male'; +$birthdate = filterRequest("birthdate") ?? date('Y-m-d'); +$site = filterRequest("site") ?? 'main'; + +if (empty($name) || empty($password) || empty($role)) { + jsonError("Missing required fields (name, password, role)."); + exit; +} + +try { + $hashedPassword = password_hash($password, PASSWORD_DEFAULT); + + // تشفير البيانات الحساسة + $encName = $encryptionHelper->encryptData($name); + $encPhone = $encryptionHelper->encryptData($phone); + $encEmail = $encryptionHelper->encryptData($email); + + // تشفير البصمة وهش البصمة (إذا تم إرسالها) + $encFp = $fingerprint ? $encryptionHelper->encryptData($fingerprint) : ''; + $fpHash = $fingerprint ? hash('sha256', $fingerprint) : ''; + $uniqueId = bin2hex(random_bytes(16)); + + if ($role === 'admin') { + // الإضافة لجدول المديرين + $sql = "INSERT INTO adminUser (id, fingerprint, fingerprint_hash, name, password, role, created_at) + VALUES (:id, :fp, :fp_hash, :name, :pass, :role, NOW())"; + $stmt = $con->prepare($sql); + $stmt->execute([ + ':id' => $uniqueId, + ':fp' => $encFp, + ':fp_hash' => $fpHash, + ':name' => $encName, + ':pass' => $hashedPassword, + ':role' => $role + ]); + } else { + // الإضافة لجدول المستخدمين (خدمة العملاء) + // أضفنا site و last_name (كقيمة افتراضية فارغة إذا لم تتوفر) + $sql = "INSERT INTO users (id, fingerprint, fingerprint_hash, phone, email, gender, password, birthdate, user_type, first_name, last_name, site, created_at) + VALUES (:id, :fp, :fp_hash, :phone, :email, :gender, :pass, :bdate, 'service', :fname, :lname, :site, NOW())"; + $stmt = $con->prepare($sql); + $stmt->execute([ + ':id' => $uniqueId, + ':fp' => $encFp, + ':fp_hash' => $fpHash, + ':phone' => $encPhone, + ':email' => $encEmail, + ':gender' => $gender, + ':pass' => $hashedPassword, + ':bdate' => $birthdate, + ':fname' => $encName, + ':lname' => '', // last_name is empty for now + ':site' => $site + ]); + } + + if ($stmt->rowCount() > 0) { + jsonSuccess("Staff member added successfully."); + } else { + jsonError("Failed to add staff member."); + } + +} catch (Exception $e) { + error_log("[Staff Add Error] " . $e->getMessage()); + jsonError("Server error: " . $e->getMessage()); +} diff --git a/backend/Admin/Staff/setup.php b/backend/Admin/Staff/setup.php new file mode 100644 index 0000000..1cdba10 --- /dev/null +++ b/backend/Admin/Staff/setup.php @@ -0,0 +1,56 @@ +query("SELECT COUNT(*) FROM adminUser")->fetchColumn(); +// if ($count > 0) { +// die("Access Denied: Admin already initialized."); +// } + +$password = "malDev@2101"; // كلمة المرور المؤقتة +$hashedPass = password_hash($password, PASSWORD_DEFAULT); + +// قائمة بالمسؤولين الأوائل (بصمات أجهزتك) +$admins = [ + [ + 'name' => 'Hamza (iPhone)', + 'fp' => 'D386663E-51E1-4322-B1E2-F469C7E58063_iPhone', // مثال بناءً على وصفك (deviceId_model) + 'role' => 'admin' + ], + [ + 'name' => 'Hamza (MacBook)', + 'fp' => '5449E3D3-E427-50D7-91A6-D86D973DC6E0_Mac15,3', // مثال للماك بوك + 'role' => 'admin' + ] +]; + +try { + $con->exec("DELETE FROM adminUser"); + foreach ($admins as $admin) { + $encName = $encryptionHelper->encryptData($admin['name']); + $encFp = $encryptionHelper->encryptData($admin['fp']); + $fpHash = hash('sha256', $admin['fp']); + $uniqueId = bin2hex(random_bytes(16)); + + $sql = "INSERT INTO adminUser (id, fingerprint, fingerprint_hash, name, password, role, created_at) + VALUES (:id, :fp, :fp_hash, :name, :pass, :role, NOW())"; + $stmt = $con->prepare($sql); + $stmt->execute([ + ':id' => $uniqueId, + ':fp' => $encFp, + ':fp_hash' => $fpHash, + ':name' => $encName, + ':pass' => $hashedPass, + ':role' => $admin['role'] + ]); + } + echo "

Initialization Successful

"; +} catch (Exception $e) { + echo "Error: " . $e->getMessage(); +} diff --git a/backend/Admin/adminUser/add.php b/backend/Admin/adminUser/add.php new file mode 100644 index 0000000..9a1d226 --- /dev/null +++ b/backend/Admin/adminUser/add.php @@ -0,0 +1,46 @@ +prepare($sql); + $stmt->execute([ + ':deviceNumber' => $deviceNumber, + ':name' => $name, + ':password' => $hashedPassword, + ':role' => $role + ]); + + if ($stmt->rowCount() > 0) { + jsonSuccess("Admin user data saved successfully"); + } else { + jsonError("Failed to save admin user data"); + } +} catch (Exception $e) { + error_log("[Admin Add Error] " . $e->getMessage()); + jsonError("Database error: " . $e->getMessage()); +} +?> + diff --git a/backend/Admin/adminUser/add_invoice.php b/backend/Admin/adminUser/add_invoice.php new file mode 100755 index 0000000..b89ee83 --- /dev/null +++ b/backend/Admin/adminUser/add_invoice.php @@ -0,0 +1,86 @@ + 'error', 'message' => 'Invalid file type.']); + exit; + } + + $finfo = finfo_open(FILEINFO_MIME_TYPE); + $mime_type = finfo_file($finfo, $image_file['tmp_name']); + finfo_close($finfo); + + $allowed_mime_types = ['image/jpeg', 'image/png', 'image/jpg']; + if (!in_array($mime_type, $allowed_mime_types)) { + error_log("[add_invoice.php] ❌ Invalid MIME type: $mime_type"); + echo json_encode(['status' => 'error', 'message' => 'Invalid file type (MIME mismatch).']); + exit; + } + + $new_filename = $invoiceNumber . "_" . $driverID . '.' . $image_extension; + $target_dir = "invoice_images/"; + $target_file = $target_dir . $new_filename; + + if (!is_dir($target_dir)) { + if (!mkdir($target_dir, 0755, true)) { + error_log("[add_invoice.php] ❌ Failed to create directory: $target_dir"); + } + } + + if (!move_uploaded_file($image_file['tmp_name'], $target_file)) { + error_log("[add_invoice.php] ❌ Failed to move uploaded file."); + echo json_encode(['status' => 'error', 'message' => 'Failed to upload image.']); + exit; + } + + $linkImage = 'https://intaleq.xyz/intaleq/Admin/adminUser/invoice_images/' . $new_filename; + error_log("[add_invoice.php] ✅ Image uploaded successfully: $linkImage"); +} + +try { + $stmt = $con->prepare("INSERT INTO invoice_records (driverID, invoice_number,name, amount, date, image_link, created_at) + VALUES (?, ?, ?,?, ?, ?, ?)"); + $stmt->execute([$driverID, $invoiceNumber,$name, $amount, $date, $linkImage, $uploadDate]); + + echo json_encode([ + 'status' => 'success', + 'message' => 'Invoice data saved.', + 'image' => $linkImage + ]); + + error_log("[add_invoice.php] ✅ Invoice saved successfully."); +} catch (PDOException $e) { + $errorMsg = $e->getMessage(); + error_log("[add_invoice.php] 🛑 PDO ERROR: $errorMsg"); + + echo json_encode([ + 'status' => 'error', + 'message' => "Database error: $errorMsg" + ]); +} \ No newline at end of file diff --git a/backend/Admin/adminUser/delete.php b/backend/Admin/adminUser/delete.php new file mode 100644 index 0000000..e69de29 diff --git a/backend/Admin/adminUser/error_log b/backend/Admin/adminUser/error_log new file mode 100644 index 0000000..e69de29 diff --git a/backend/Admin/adminUser/get.php b/backend/Admin/adminUser/get.php new file mode 100644 index 0000000..82ff4cb --- /dev/null +++ b/backend/Admin/adminUser/get.php @@ -0,0 +1,24 @@ +prepare($sql); +$stmt->execute(); +$result = $stmt->fetchAll(PDO::FETCH_ASSOC); + +if (count($result) === 1) { + // Print the first record as a success message + jsonSuccess($result[0]); +} else { + // Print a failure message + jsonError($message = "Failed to retrieve Password or user name incorrect"); +} +?> \ No newline at end of file diff --git a/backend/Admin/adminUser/invoice_images/INV-20250729-224_123.jpg b/backend/Admin/adminUser/invoice_images/INV-20250729-224_123.jpg new file mode 100644 index 0000000..b4da1a8 Binary files /dev/null and b/backend/Admin/adminUser/invoice_images/INV-20250729-224_123.jpg differ diff --git a/backend/Admin/adminUser/invoice_images/INV-20250729-592_123.jpg b/backend/Admin/adminUser/invoice_images/INV-20250729-592_123.jpg new file mode 100644 index 0000000..b4da1a8 Binary files /dev/null and b/backend/Admin/adminUser/invoice_images/INV-20250729-592_123.jpg differ diff --git a/backend/Admin/adminUser/invoice_images/INV-20250810-859_123.jpg b/backend/Admin/adminUser/invoice_images/INV-20250810-859_123.jpg new file mode 100644 index 0000000..65b3696 Binary files /dev/null and b/backend/Admin/adminUser/invoice_images/INV-20250810-859_123.jpg differ diff --git a/backend/Admin/adminUser/invoice_images/INV-20250812-737_123.jpg b/backend/Admin/adminUser/invoice_images/INV-20250812-737_123.jpg new file mode 100644 index 0000000..ebde934 Binary files /dev/null and b/backend/Admin/adminUser/invoice_images/INV-20250812-737_123.jpg differ diff --git a/backend/Admin/adminUser/invoice_total.php b/backend/Admin/adminUser/invoice_total.php new file mode 100755 index 0000000..b3d464f --- /dev/null +++ b/backend/Admin/adminUser/invoice_total.php @@ -0,0 +1,28 @@ +prepare("SELECT * FROM invoice_records ORDER BY date DESC"); + $stmt->execute(); + $invoices = $stmt->fetchAll(PDO::FETCH_ASSOC); + + // ✅ حساب عدد الفواتير ومجموع المبالغ + $count = count($invoices); + $totalAmount = array_sum(array_column($invoices, 'amount')); + + echo json_encode([ + "status" => "success", + "data" => $invoices, + "summary" => [ + "count" => $count, + "total" => $totalAmount + ] + ]); +} catch (PDOException $e) { + echo json_encode([ + "status" => "error", + "message" => "Database error: " . $e->getMessage() + ]); +} +?> \ No newline at end of file diff --git a/backend/Admin/adminUser/update.php b/backend/Admin/adminUser/update.php new file mode 100644 index 0000000..e69de29 diff --git a/backend/Admin/auth/approve_admin.php b/backend/Admin/auth/approve_admin.php new file mode 100644 index 0000000..1f0d20e --- /dev/null +++ b/backend/Admin/auth/approve_admin.php @@ -0,0 +1,48 @@ + 'Forbidden. Super Admin access required.']); + exit; +} + +$targetId = filterRequest('admin_id'); +$action = filterRequest('action'); // approved, rejected, suspended + +if (empty($targetId) || empty($action)) { + jsonError("Admin ID and action are required."); + exit; +} + +if (!in_array($action, ['approved', 'rejected', 'suspended'])) { + jsonError("Invalid action."); + exit; +} + +try { + $con = Database::get('main'); + + $sql = "UPDATE adminUser SET status = :status, approved_by = :by, approved_at = NOW() WHERE id = :id"; + $stmt = $con->prepare($sql); + $stmt->execute([ + ':status' => $action, + ':by' => $user_id, // السوبر أدمن الحالي + ':id' => $targetId + ]); + + if ($stmt->rowCount() > 0) { + printSuccess(null, "Admin status updated to $action."); + } else { + jsonError("Admin not found or status already updated."); + } + +} catch (Exception $e) { + error_log("[Approve Admin Error] " . $e->getMessage()); + jsonError("Server Error: " . $e->getMessage()); +} diff --git a/backend/Admin/auth/debug_login.php b/backend/Admin/auth/debug_login.php new file mode 100644 index 0000000..57ee58d --- /dev/null +++ b/backend/Admin/auth/debug_login.php @@ -0,0 +1,74 @@ +getMessage() . ' in ' . $e->getFile() . ':' . $e->getLine(); +} + +// 3. التحقق من الدوال المطلوبة +$checks['filterRequest_exists'] = function_exists('filterRequest'); +$checks['jsonError_exists'] = function_exists('jsonError'); +$checks['sendWhatsAppFromServer_exists'] = function_exists('sendWhatsAppFromServer'); + +// 4. التحقق من قاعدة البيانات +try { + $con = Database::get('main'); + $checks['db_connected'] = true; + + // التحقق من بنية الجدول + $stmt = $con->query("DESCRIBE adminUser"); + $columns = $stmt->fetchAll(PDO::FETCH_COLUMN); + $checks['adminUser_columns'] = $columns; + + // هل يوجد جدول token_verification_admin؟ + $stmt2 = $con->query("SHOW TABLES LIKE 'token_verification_admin'"); + $checks['token_verification_admin_exists'] = $stmt2->rowCount() > 0; + + if (!$checks['token_verification_admin_exists']) { + $checks['CRITICAL'] = 'Table token_verification_admin does NOT exist! This is why login fails.'; + } +} catch (Throwable $e) { + $checks['db_connected'] = false; + $checks['db_error'] = $e->getMessage(); +} + +// 5. التحقق من PHP error log الأخير +$logPath = '/home/intaleq-api/logs/php_errors.log'; +if (file_exists($logPath)) { + $lines = file($logPath); + $checks['last_5_errors'] = array_map('trim', array_slice($lines, -5)); +} else { + $logPath2 = __DIR__ . '/../../logs/php_errors.log'; + if (file_exists($logPath2)) { + $lines = file($logPath2); + $checks['last_5_errors'] = array_map('trim', array_slice($lines, -5)); + } else { + $checks['error_log'] = 'Log file not found'; + } +} + +// 6. نسخة PHP +$checks['php_version'] = PHP_VERSION; + +echo json_encode($checks, JSON_PRETTY_PRINT | JSON_UNESCAPED_UNICODE); diff --git a/backend/Admin/auth/list_pending.php b/backend/Admin/auth/list_pending.php new file mode 100644 index 0000000..6e4af20 --- /dev/null +++ b/backend/Admin/auth/list_pending.php @@ -0,0 +1,33 @@ + 'Forbidden. Super Admin access required.']); + exit; +} + +try { + $con = Database::get('main'); + + $stmt = $con->prepare("SELECT id, name, phone, created_at FROM adminUser WHERE status = 'pending' ORDER BY created_at DESC"); + $stmt->execute(); + $pending = $stmt->fetchAll(PDO::FETCH_ASSOC); + + // فك تشفير الأسماء + foreach ($pending as &$admin) { + $admin['name'] = $encryptionHelper->decryptData($admin['name']) ?: $admin['name']; + } + + printSuccess($pending); + +} catch (Exception $e) { + error_log("[List Pending Admins Error] " . $e->getMessage()); + jsonError("Server Error: " . $e->getMessage()); +} diff --git a/backend/Admin/auth/login.php b/backend/Admin/auth/login.php new file mode 100755 index 0000000..e92a7d8 --- /dev/null +++ b/backend/Admin/auth/login.php @@ -0,0 +1,120 @@ +prepare("SELECT * FROM adminUser WHERE fingerprint_hash = :fp LIMIT 1"); + $stmt->execute([':fp' => $fpHash]); + $admin = $stmt->fetch(PDO::FETCH_ASSOC); + + if ($admin) { + // 1. التحقق من حالة الحساب + if ($admin['status'] === 'pending') { + jsonError("حسابك قيد المراجعة حالياً. يرجى الانتظار للموافقة."); + exit; + } elseif ($admin['status'] === 'suspended') { + jsonError("هذا الحساب معلق. يرجى التواصل مع المدير."); + exit; + } elseif ($admin['status'] === 'rejected') { + jsonError("تم رفض طلب الانضمام لهذا الحساب."); + exit; + } + + // 2. التحقق من كلمة المرور + if (password_verify($password, $admin['password'])) { + + // إذا كان هذا مجرد تجديد للتوكن (إعادة الدخول التلقائي من التطبيق)، فلا داعي لإرسال OTP + if ($isRenewal) { + $jwtService = new JwtService($redis); + $role = $admin['role'] ?? 'admin'; + + // إلغاء التوكن القديم إذا وجد في Redis + if ($redis) { + $oldJti = $redis->get("active_jti:" . $admin['id']); + if ($oldJti) { + $jwtService->revokeToken($oldJti, 3600); + } + } + + $jwt = $jwtService->generateAccessToken($admin['id'], $role, $audience, $fingerprint); + + // فك تشفير البيانات للعرض + $admin['name'] = $encryptionHelper->decryptData($admin['name']) ?: $admin['name']; + unset($admin['password']); + + printSuccess([ + "message" => "Login successful", + "admin" => $admin, + "jwt" => $jwt, + "expires_in" => 3600 + ]); + exit; + } + + // 3. توليد رمز تحقق OTP وإرساله عبر WhatsApp + $otp = rand(10000, 99999); + $encryptedPhone = $admin['phone'] ?? ''; + + if (empty($encryptedPhone)) { + jsonError("رقم الهاتف غير مسجل لهذا الحساب. يرجى مراجعة الإدارة."); + exit; + } + + // فك تشفير رقم الهاتف (مخزن مشفراً في قاعدة البيانات) + $phone = $encryptionHelper->decryptData($encryptedPhone); + if (!$phone || empty($phone)) { + // إذا فشل فك التشفير، قد يكون الرقم مخزناً بدون تشفير + $phone = $encryptedPhone; + } + + $messageBody = "رمز التحقق الخاص بك للدخول إلى لوحة الإدارة هو: $otp"; + $success = sendWhatsAppFromServer($phone, $messageBody); + + if ($success) { + // حفظ الرمز مشفراً في قاعدة البيانات (وحفظ رقم الهاتف مشفراً أيضاً) + $encryptedOtp = $encryptionHelper->encryptData((string)$otp); + + $stmt = $con->prepare("INSERT INTO token_verification_admin (phone_number, token, expiration_time) + VALUES (?, ?, DATE_ADD(NOW(), INTERVAL 10 MINUTE)) + ON DUPLICATE KEY UPDATE token = VALUES(token), expiration_time = VALUES(expiration_time)"); + $stmt->execute([$encryptedPhone, $encryptedOtp]); + + // إخفاء جزء من الرقم في الاستجابة للأمان + $maskedPhone = substr($phone, 0, 4) . '****' . substr($phone, -3); + + printSuccess([ + "status" => "otp_required", + "message" => "تم إرسال رمز التحقق إلى WhatsApp الخاص بك.", + "phone" => $maskedPhone + ]); + } else { + jsonError("فشل في إرسال رمز التحقق عبر WhatsApp."); + } + } else { + jsonError("كلمة المرور غير صحيحة."); + } + } else { + jsonError("الجهاز غير مسجل كمشرف."); + } +} catch (Exception $e) { + error_log("[Admin Login Error] " . $e->getMessage()); + jsonError("خطأ في السيرفر: " . $e->getMessage()); +} \ No newline at end of file diff --git a/backend/Admin/auth/loginWallet.php b/backend/Admin/auth/loginWallet.php new file mode 100644 index 0000000..095139a --- /dev/null +++ b/backend/Admin/auth/loginWallet.php @@ -0,0 +1,93 @@ +authenticate(); + +error_log("[Wallet_SSO] Authenticated Admin ID: " . ($admin->user_id ?? 'N/A') . " | Role: " . ($admin->role ?? 'N/A')); + +if ($admin->role !== 'admin' && $admin->role !== 'super_admin') { + jsonError("Unauthorized. Admin access required."); + exit; +} + +try { + // جلب المفتاح المشترك لسيرفر المحفظة + $payKeyPath = '/home/intaleq-api/.secret_key_pay'; + $payKey = file_exists($payKeyPath) ? trim(file_get_contents($payKeyPath)) : getenv('SECRET_KEY_PAY'); + + if (empty($payKey)) { + $payKey = trim(@file_get_contents('/home/intaleq-api/.secret_key')); + } + + if (empty($payKey)) { + jsonError("Internal configuration error: Shared secret key missing."); + exit; + } + + $issuer = 'Tripz-Wallet'; + $audience = 'Tripz-Wallet'; + $hmacSecret = getenv('SECRET_KEY_HMAC') ?: ''; + + $ttl = 600; // 10 دقائق + $iat = time(); + $exp = $iat + $ttl; + $jti = bin2hex(random_bytes(16)); + + // محتوى التوكن (Payload) + $payload = [ + 'iss' => $issuer, + 'aud' => $audience, + 'user_id' => $admin->user_id, + 'role' => 'admin', // نرسل 'admin' للمحفظة لضمان التوافق مع برمجياتها القديمة + 'iat' => $iat, + 'exp' => $exp, + 'jti' => $jti + ]; + + // إلغاء التوكن القديم إذا وجد في Redis + if ($redis) { + $oldJtiKey = "wallet_jti:" . $admin->user_id; + $oldJti = $redis->get($oldJtiKey); + if ($oldJti) { + // إضافة التوكن القديم للقائمة السوداء + $redis->setex("jwt:blacklist:$oldJti", $ttl + 60, '1'); + } + // تخزين الـ JTI الجديد + $redis->setex($oldJtiKey, $ttl, $jti); + } + + // إضافة بصمة الجهاز للتوكن لزيادة الأمان + $fpHeader = $_SERVER['HTTP_X_DEVICE_FP'] ?? null; + $fpPepper = getenv('FP_PEPPER'); + if ($fpHeader && $fpPepper) { + $payload['fingerPrint'] = hash('sha256', $fpHeader . $fpPepper); + } + + // توليد التوكن + $jwt = JWT::encode($payload, $payKey, 'HS256'); + + // حساب الـ HMAC Hash المطلوب لسيرفر المحفظة + $hmacHash = hash_hmac('sha256', (string)$admin->user_id, $hmacSecret); + + printSuccess([ + "status" => "success", + "jwt" => $jwt, + "hmac" => $hmacHash, + "expires_in" => $ttl + ]); + +} catch (Exception $e) { + error_log("[Admin Wallet SSO Error] " . $e->getMessage()); + jsonError("Server Error: " . $e->getMessage()); +} diff --git a/backend/Admin/auth/migrate_db.php b/backend/Admin/auth/migrate_db.php new file mode 100644 index 0000000..d5cbbcc --- /dev/null +++ b/backend/Admin/auth/migrate_db.php @@ -0,0 +1,28 @@ +query("SHOW COLUMNS FROM adminUser LIKE 'status'"); + if ($check->rowCount() == 0) { + $sql = "ALTER TABLE adminUser + ADD COLUMN status ENUM('pending', 'approved', 'suspended', 'rejected') NOT NULL DEFAULT 'pending' AFTER role, + ADD COLUMN phone VARCHAR(50) DEFAULT NULL AFTER name, + ADD COLUMN email VARCHAR(255) DEFAULT NULL AFTER phone, + ADD COLUMN approved_by VARCHAR(64) DEFAULT NULL AFTER status, + ADD COLUMN approved_at DATETIME DEFAULT NULL AFTER approved_by"; + + $con->exec($sql); + + // Update existing admins to approved and super_admin + $con->exec("UPDATE adminUser SET status = 'approved', role = 'super_admin' WHERE id IS NOT NULL"); + + echo json_encode(["status" => "success", "message" => "Migration completed successfully."]); + } else { + echo json_encode(["status" => "success", "message" => "Columns already exist."]); + } +} catch (Exception $e) { + echo json_encode(["status" => "error", "message" => $e->getMessage()]); +} diff --git a/backend/Admin/auth/migration_cryptography.php b/backend/Admin/auth/migration_cryptography.php new file mode 100644 index 0000000..2f8546e --- /dev/null +++ b/backend/Admin/auth/migration_cryptography.php @@ -0,0 +1,128 @@ + [ + 'phone', 'email', 'gender', 'birthdate', 'site', + 'first_name', 'last_name', 'accountBank', 'education', + 'employmentType', 'maritalStatus', 'national_number', + 'name_arabic', 'address' + ], + 'passengers' => [ + 'phone', 'email', 'gender', 'birthdate', + 'first_name', 'last_name', 'token' + ], + 'CarRegistration' => [ + 'vin', 'car_plate', 'owner', 'address' + ], + 'carPlateEdit' => [ + 'carPlate', 'owner' + ], + 'phone_verification' => [ + 'phone_number' + ], + 'phone_verification_passenger' => [ + 'phone_number' + ], + 'driverToken' => [ + 'token' + ], + 'passengerToken' => [ + 'token' + ], + 'mishwari' => [ + 'phone', 'gender', 'name', 'name_english', 'car_plate', 'token', 'education', 'national_number', 'age' + ], + 'rate_app' => [ + 'email', 'phone' + ], + 'admins' => [ + 'name', 'phone', 'email', 'fp' + ], + 'driver_assurance' => [ + 'assured', 'health_insurance_provider' + ], + 'blacklist_drivers' => [ + 'phone' + ], + 'blacklist_passengers' => [ + 'phone' + ], + 'feedBack' => [ + 'feedBack' + ] +]; + +$totalUpdated = 0; + +foreach ($tables as $table => $columns) { + echo "Processing table: $table ...\n"; + ob_flush(); flush(); + + try { + $sql = "SELECT `id`, `" . implode("`, `", $columns) . "` FROM `$table`"; + $stmt = $con->query($sql); + if (!$stmt) { + echo "Skipped $table (Not found or missing columns).\n"; + continue; + } + $rows = $stmt->fetchAll(PDO::FETCH_ASSOC); + } catch (Exception $e) { + echo "Skipped $table due to error: " . $e->getMessage() . "\n"; + continue; + } + + $tableUpdatedCount = 0; + + foreach ($rows as $row) { + $id = $row['id']; + $needsUpdate = false; + $updateValues = []; + $params = [':id' => $id]; + + foreach ($columns as $col) { + $value = $row[$col]; + + // تحقق إذا كان الحقل يحتوي على قيمة وإذا لم يكن مشفر بالنظام الجديد + if (!empty($value) && strpos($value, 'GCM:') !== 0) { + // محاولة فك التشفير القديم (CBC) + try { + $decrypted = $encryptionHelper->decryptData($value); + if ($decrypted !== false && $decrypted !== '') { + // إعادة التشفير (سيستخدم GCM الآن) + $newEncrypted = $encryptionHelper->encryptData($decrypted); + $updateValues[] = "`$col` = :$col"; + $params[":$col"] = $newEncrypted; + $needsUpdate = true; + } + } catch (Exception $e) { + error_log("Failed to migrate $col for ID $id in $table: " . $e->getMessage()); + } + } + } + + if ($needsUpdate) { + $setClause = implode(", ", $updateValues); + $updateSql = "UPDATE `$table` SET $setClause WHERE `id` = :id"; + $updateStmt = $con->prepare($updateSql); + $updateStmt->execute($params); + $tableUpdatedCount++; + } + } + + echo "Finished $table. Updated rows: $tableUpdatedCount\n"; + $totalUpdated += $tableUpdatedCount; + ob_flush(); flush(); +} + +echo "Migration completed! Total rows updated: $totalUpdated\n"; +?> diff --git a/backend/Admin/auth/register.php b/backend/Admin/auth/register.php new file mode 100644 index 0000000..693d862 --- /dev/null +++ b/backend/Admin/auth/register.php @@ -0,0 +1,59 @@ +prepare("SELECT id FROM adminUser WHERE phone = ? OR fingerprint_hash = ? LIMIT 1"); + $check->execute([$phone, $fpHash]); + + if ($check->rowCount() > 0) { + jsonError("هذا الحساب أو الجهاز مسجل مسبقاً."); + exit; + } + + // 2. تجهيز البيانات + $id = bin2hex(random_bytes(16)); + $hashedPassword = password_hash($password, PASSWORD_DEFAULT); + $encName = $encryptionHelper->encryptData($name); + $encFp = $encryptionHelper->encryptData($fingerprint); + + // 3. الإدخال في قاعدة البيانات (الحالة الافتراضية هي pending) + $sql = "INSERT INTO adminUser (id, name, phone, password, fingerprint, fingerprint_hash, role, status, created_at) + VALUES (:id, :name, :phone, :pass, :fp, :fp_hash, 'admin', 'pending', NOW())"; + + $stmt = $con->prepare($sql); + $stmt->execute([ + ':id' => $id, + ':name' => $encName, + ':phone' => $phone, + ':pass' => $hashedPassword, + ':fp' => $encFp, + ':fp_hash' => $fpHash + ]); + + printSuccess([ + "status" => "pending", + "message" => "تم تقديم طلب التسجيل بنجاح. يرجى انتظار موافقة الإدارة." + ]); + +} catch (Exception $e) { + error_log("[Admin Register Error] " . $e->getMessage()); + jsonError("خطأ في السيرفر: " . $e->getMessage()); +} diff --git a/backend/Admin/auth/send_otp_admin.php b/backend/Admin/auth/send_otp_admin.php new file mode 100755 index 0000000..0bcd15f --- /dev/null +++ b/backend/Admin/auth/send_otp_admin.php @@ -0,0 +1,56 @@ +prepare("INSERT INTO token_verification_admin (phone_number, token, expiration_time) + VALUES (?, ?, DATE_ADD(NOW(), INTERVAL 5 MINUTE)) + ON DUPLICATE KEY UPDATE token = VALUES(token), expiration_time = VALUES(expiration_time)"); + $stmt->execute([$receiver, $otp]); + // error_log("[send_otp_admin] OTP saved to database successfully for $receiver"); + + jsonSuccess(null, "OTP sent successfully."); + } catch (PDOException $e) { + // error_log("[send_otp_admin] Database error: " . $e->getMessage()); + jsonError("حدث خطأ في حفظ الرمز."); + } +} else { + // error_log("[send_otp_admin] Failed to send WhatsApp message to $receiver"); + jsonError("فشل في إرسال الرمز عبر WhatsApp."); +} + +//error_log("--- [send_otp_admin] Script ended ---"); +?> \ No newline at end of file diff --git a/backend/Admin/auth/verify_login.php b/backend/Admin/auth/verify_login.php new file mode 100644 index 0000000..0a11157 --- /dev/null +++ b/backend/Admin/auth/verify_login.php @@ -0,0 +1,83 @@ +prepare("SELECT * FROM adminUser WHERE fingerprint_hash = :fp LIMIT 1"); + $stmt->execute([':fp' => $fpHash]); + $admin = $stmt->fetch(PDO::FETCH_ASSOC); + + if (!$admin) { + jsonError("المسؤول غير موجود أو البصمة غير مطابقة."); + exit; + } + + // 2. رقم الهاتف المشفر (للاستخدام في جدول OTP) + $encryptedPhone = $admin['phone'] ?? ''; + + // فك تشفيره لو احتجنا إرساله أو عرضه، لكن هنا نحن نحتاج المشفر للبحث + // $phone = $encryptionHelper->decryptData($encryptedPhone); + + // تشفير الرمز (OTP) القادم من التطبيق للمقارنة + $encryptedOtp = $encryptionHelper->encryptData((string)$otp); + + // 3. التحقق من الـ OTP (باستخدام القيم المشفرة) + $stmt = $con->prepare("SELECT * FROM token_verification_admin + WHERE phone_number = ? AND token = ? + AND expiration_time >= NOW()"); + $stmt->execute([$encryptedPhone, $encryptedOtp]); + + if ($stmt->rowCount() === 0) { + jsonError("رمز التحقق غير صالح أو منتهي الصلاحية."); + exit; + } + + // حذف الرمز بعد استخدامه لمرة واحدة (باستخدام الرقم المشفر) + $con->prepare("DELETE FROM token_verification_admin WHERE phone_number = ?")->execute([$encryptedPhone]); + + // 4. إصدار التوكن النهائي + $jwtService = new JwtService($redis); + $role = $admin['role'] ?? 'admin'; + + // إلغاء التوكن القديم إذا وجد في Redis (Token Revocation) + if ($redis) { + $oldJti = $redis->get("active_jti:" . $admin['id']); + if ($oldJti) { + $jwtService->revokeToken($oldJti, 3600); + } + } + + $jwt = $jwtService->generateAccessToken($admin['id'], $role, $audience, $fingerprint); + + // فك تشفير البيانات للعرض + $admin['name'] = $encryptionHelper->decryptData($admin['name']) ?: $admin['name']; + unset($admin['password']); + + printSuccess([ + "message" => "Login successful", + "admin" => $admin, + "jwt" => $jwt, + "expires_in" => 3600 + ]); + +} catch (Exception $e) { + error_log("[Admin Verify OTP Error] " . $e->getMessage()); + jsonError("خطأ في السيرفر: " . $e->getMessage()); +} diff --git a/backend/Admin/auth/verify_otp_admin.php b/backend/Admin/auth/verify_otp_admin.php new file mode 100755 index 0000000..55cee72 --- /dev/null +++ b/backend/Admin/auth/verify_otp_admin.php @@ -0,0 +1,46 @@ +prepare("SELECT * FROM token_verification_admin + WHERE phone_number = ? AND token = ? + AND expiration_time >= NOW()"); +$stmt->execute([$phone, $otp]); + +if ($stmt->rowCount() > 0) { + // ✅ تحقق ناجح - ننتقل إلى إدخال أو تحديث سجل adminUser + + // تحقق إن كان المستخدم موجود مسبقًا + $checkAdmin = $con->prepare("SELECT * FROM adminUser WHERE name = ?"); + $checkAdmin->execute([$phone]); + + $now = date("Y-m-d H:i:s"); + + if ($checkAdmin->rowCount() > 0) { + // المستخدم موجود ✅ تحديث device_number و updated_at + $update = $con->prepare("UPDATE adminUser + SET device_number = ?, updated_at = ? + WHERE name = ?"); + $update->execute([$deviceNumber, $now, $phone]); + jsonSuccess(["message" => "verified and updated existing admin"]); + } else { + // المستخدم غير موجود ✅ إدخال جديد + $insert = $con->prepare("INSERT INTO adminUser (device_number, name, created_at, updated_at) + VALUES (?, ?, ?, ?)"); + $insert->execute([$deviceNumber, $phone, $now, $now]); + jsonSuccess(["message" => "verified and new admin created"]); + } + +} else { + // ❌ رمز التحقق غير صالح + jsonError("رمز التحقق غير صالح أو منتهي."); +} \ No newline at end of file diff --git a/backend/Admin/dashbord.php b/backend/Admin/dashbord.php new file mode 100644 index 0000000..96f1e29 --- /dev/null +++ b/backend/Admin/dashbord.php @@ -0,0 +1,73 @@ + 'Unauthorized access. Admin role required.']); + exit; +} + +$sql = " +SELECT + -- العدادات العامة + (SELECT COUNT(*) FROM passengers) AS countPassengers, + (SELECT COUNT(*) FROM driver) AS countDriver, + (SELECT COUNT(*) FROM ride) AS countRide, + + -- إحصائيات الشهر الحالي + (SELECT COUNT(*) FROM passengers WHERE created_at BETWEEN DATE_FORMAT(CURDATE(), '%Y-%m-01') AND LAST_DAY(CURDATE())) AS countPassengersThisMonth, + (SELECT COUNT(*) FROM driver WHERE created_at BETWEEN DATE_FORMAT(CURDATE(), '%Y-%m-01') AND LAST_DAY(CURDATE())) AS countDriverThisMonth, + (SELECT COUNT(*) FROM ride WHERE created_at BETWEEN DATE_FORMAT(CURDATE(), '%Y-%m-01') AND LAST_DAY(CURDATE())) AS countRideThisMonth, + (SELECT COUNT(*) FROM CarRegistration WHERE created_at BETWEEN DATE_FORMAT(CURDATE(), '%Y-%m-01') AND LAST_DAY(CURDATE())) AS countCarRegistrationThisMonth, + + -- شكاوى + (SELECT COUNT(*) FROM complaint WHERE date_filed BETWEEN DATE_FORMAT(CURDATE(), '%Y-%m-01') AND LAST_DAY(CURDATE())) AS countComplaintThisMonth, + (SELECT COUNT(*) FROM complaint WHERE date_filed BETWEEN DATE_SUB(CURDATE(), INTERVAL WEEKDAY(CURDATE()) DAY) AND DATE_ADD(DATE_SUB(CURDATE(), INTERVAL WEEKDAY(CURDATE()) DAY), INTERVAL 6 DAY)) AS countComplaintThisWeek, + (SELECT COUNT(*) FROM complaint WHERE DATE(date_filed) = CURDATE()) AS countComplaintToday, + + -- المحافظ والتحويلات + + -- إحصائيات وقت ومسافة الرحلات + (SELECT TIME_FORMAT(SEC_TO_TIME(AVG(TIMESTAMPDIFF(SECOND, rideTimeStart, rideTimeFinish))), '%Hh %im') FROM ride WHERE rideTimeStart IS NOT NULL AND rideTimeFinish IS NOT NULL) AS driver_avg_duration, + (SELECT MAX(SEC_TO_TIME(TIMESTAMPDIFF(SECOND, rideTimeStart, rideTimeFinish))) FROM ride WHERE rideTimeStart IS NOT NULL AND rideTimeFinish IS NOT NULL) AS longest_duration, + (SELECT ROUND(SUM(distance),2) FROM ride) AS total_distance, + (SELECT ROUND(AVG(distance),2) FROM ride) AS average_distance, + (SELECT ROUND(MAX(distance),2) FROM ride) AS longest_distance, + + -- أرباح السائق والشركة + (SELECT SUM(price_for_driver) FROM ride WHERE status = 'Finished') AS total_driver_earnings, + (SELECT ROUND(AVG(price_for_passenger),2) FROM ride) AS avg_passenger_price, + + -- توزيع الرحلات حسب الوقت + (SELECT COUNT(*) FROM ride WHERE HOUR(created_at) BETWEEN 6 AND 11) AS morning_ride_count, + (SELECT COUNT(*) FROM ride WHERE HOUR(created_at) BETWEEN 12 AND 17) AS evening_ride_count, + (SELECT COUNT(*) FROM ride WHERE HOUR(created_at) BETWEEN 18 AND 23 OR HOUR(created_at) BETWEEN 0 AND 5) AS night_ride_count, + + -- أنواع الرحلات + (SELECT COUNT(*) FROM ride WHERE carType = 'Comfort') AS comfort, + (SELECT COUNT(*) FROM ride WHERE carType = 'Speed') AS speed, + (SELECT COUNT(*) FROM ride WHERE carType = 'Lady') AS lady, + + -- حالة الرحلات + (SELECT COUNT(*) FROM ride WHERE status = 'wait') AS ongoing_rides, + (SELECT COUNT(*) FROM ride WHERE status = 'Finished') AS completed_rides, + (SELECT COUNT(*) FROM ride WHERE status = 'cancel') AS cancelled_rides, + + -- عدد السائقين الفريدين + (SELECT COUNT(*) FROM (SELECT driver_id FROM ride GROUP BY driver_id) AS sub) AS num_Driver, + + -- التحويلات البنكية + (SELECT COUNT(*) FROM payments WHERE payment_method = 'TransferFrom') AS transfer_from_count +"; + +$stmt = $con->prepare($sql); +$stmt->execute(); +$result = $stmt->fetchAll(PDO::FETCH_ASSOC); + +if ($result) { + jsonSuccess($result); +} else { + jsonError("No dashboard data found"); +} +?> \ No newline at end of file diff --git a/backend/Admin/debug/check_driver_phones.php b/backend/Admin/debug/check_driver_phones.php new file mode 100644 index 0000000..c885595 --- /dev/null +++ b/backend/Admin/debug/check_driver_phones.php @@ -0,0 +1,13 @@ +query("SELECT phone FROM driver LIMIT 10"); + $rows = $stmt->fetchAll(PDO::FETCH_ASSOC); + foreach ($rows as $row) { + echo "Raw: " . $row['phone'] . " | Decrypted: " . $encryptionHelper->decryptData($row['phone']) . "\n"; + } +} catch (Exception $e) { + echo $e->getMessage(); +} +?> diff --git a/backend/Admin/debug/check_users_cols.php b/backend/Admin/debug/check_users_cols.php new file mode 100644 index 0000000..63af04f --- /dev/null +++ b/backend/Admin/debug/check_users_cols.php @@ -0,0 +1,11 @@ +query("DESCRIBE users"); + $cols = $stmt->fetchAll(PDO::FETCH_ASSOC); + echo json_encode($cols, JSON_PRETTY_PRINT); +} catch (Exception $e) { + echo $e->getMessage(); +} +?> diff --git a/backend/Admin/debug/debug_phone.php b/backend/Admin/debug/debug_phone.php new file mode 100644 index 0000000..2613f5a --- /dev/null +++ b/backend/Admin/debug/debug_phone.php @@ -0,0 +1,23 @@ +encryptData($v); + + $stmt = $con->prepare("SELECT id, phone, first_name FROM driver WHERE phone = ? OR phone = ?"); + $stmt->execute([$v, $enc]); + $res = $stmt->fetch(); + + if ($res) { + echo "FOUND! ID: {$res['id']}, Name: {$res['first_name']}, Phone in DB: {$res['phone']}\n"; + exit; + } +} + +echo "NOT FOUND in driver table.\n"; diff --git a/backend/Admin/debug/env_test.php b/backend/Admin/debug/env_test.php new file mode 100644 index 0000000..afe0cc0 --- /dev/null +++ b/backend/Admin/debug/env_test.php @@ -0,0 +1,57 @@ + 'error', + 'message' => 'Access denied for this admin phone.', + ]); + exit; +} + +// 3) التحقق من بقية المدخلات (action + text) +$action = $data['action'] ?? ''; +$text = trim($data['text'] ?? ''); + +if ($text === '' || ($action !== 'encrypt' && $action !== 'decrypt')) { + http_response_code(400); + echo json_encode([ + 'status' => 'error', + 'message' => 'Invalid input: need action=encrypt|decrypt and non-empty text.', + ]); + exit; +} + +// 4) تنفيذ التشفير / الفك +try { + // require_once __DIR__ . '/encrypt_decrypt.php'; + + if ($action === 'encrypt') { + $result = $encryptionHelper->encryptData($text); + } else { // decrypt + $result = $encryptionHelper->decryptData($text); + } + + echo json_encode([ + 'status' => 'success', + 'action' => $action, + 'result' => (string) $result, + ]); +} catch (Exception $e) { + http_response_code(500); + echo json_encode([ + 'status' => 'error', + 'message' => 'Operation failed.', + ]); +} \ No newline at end of file diff --git a/backend/Admin/debug/scratch_db_check.php b/backend/Admin/debug/scratch_db_check.php new file mode 100644 index 0000000..f182a6f --- /dev/null +++ b/backend/Admin/debug/scratch_db_check.php @@ -0,0 +1,23 @@ +prepare("SELECT id, name, role FROM admin"); + $stmt->execute(); + $admins = $stmt->fetchAll(PDO::FETCH_ASSOC); + print_r($admins); +} catch (Exception $e) { + echo "Error: " . $e->getMessage() . "\n"; +} + +echo "\n--- DATABASES ---\n"; +try { + $stmt = $con->prepare("SHOW DATABASES"); + $stmt->execute(); + $dbs = $stmt->fetchAll(PDO::FETCH_COLUMN); + print_r($dbs); +} catch (Exception $e) { + echo "Error: " . $e->getMessage() . "\n"; +} +?> diff --git a/backend/Admin/debug/scratch_log_path.php b/backend/Admin/debug/scratch_log_path.php new file mode 100644 index 0000000..28066fc --- /dev/null +++ b/backend/Admin/debug/scratch_log_path.php @@ -0,0 +1,2 @@ +geoadd('geo:rides:waiting', 36.0, 32.0, 'test_ride'); +$res = $redis->georadius('geo:rides:waiting', 36.0, 32.0, 10, 'km', ['WITHDIST' => true]); +print_r($res); +echo json_encode($res) . "\n"; diff --git a/backend/Admin/driver/deleteCaptain.php b/backend/Admin/driver/deleteCaptain.php new file mode 100755 index 0000000..04ee748 --- /dev/null +++ b/backend/Admin/driver/deleteCaptain.php @@ -0,0 +1,41 @@ +encryptData($phone); + + // حذف السائق من جدول driver + $sqlDel = "DELETE FROM driver WHERE id = :id"; + $stmtDel = $con->prepare($sqlDel); + $stmtDel->bindParam(':id', $driver_id, PDO::PARAM_INT); + $stmtDel->execute(); + + if ($stmtDel->rowCount() > 0) { + // إضافة بيانات السائق المحذوف إلى البلاك ليست + $sqlInsert = "INSERT INTO blacklist_driver (driver_id, phone, reason) + VALUES (:driver_id, :phone, :reason)"; + $stmtInsert = $con->prepare($sqlInsert); + $stmtInsert->execute([ + 'driver_id' => $driver_id, + 'phone' => $encPhone, + 'reason' => !empty($reason) ? $reason : "Deleted & blacklisted by admin" + ]); + + jsonSuccess(null, "Driver deleted and blacklisted successfully."); + } else { + jsonError("No driver found with the provided ID."); + } + +} catch (PDOException $e) { + jsonError("Error: " . $e->getMessage()); +} \ No newline at end of file diff --git a/backend/Admin/driver/deleteRecord.php b/backend/Admin/driver/deleteRecord.php new file mode 100755 index 0000000..f470ce1 --- /dev/null +++ b/backend/Admin/driver/deleteRecord.php @@ -0,0 +1,30 @@ +prepare($sql); + +// Bind the driver_id parameter +$stmt->bindParam(':driver_id', $driver_id, PDO::PARAM_STR); + +try { + // Execute the query + $stmt->execute(); + + if ($stmt->rowCount() > 0) { + // Success response + jsonSuccess(null, "Record(s) deleted successfully."); + } else { + // Failure response: no records found to delete + jsonError("No records found for the provided driver ID."); + } +} catch (PDOException $e) { + // Handle any SQL errors + jsonError("Error deleting records: " . $e->getMessage()); +} + +?> \ No newline at end of file diff --git a/backend/Admin/driver/find_driver_by_phone.php b/backend/Admin/driver/find_driver_by_phone.php new file mode 100755 index 0000000..285eb37 --- /dev/null +++ b/backend/Admin/driver/find_driver_by_phone.php @@ -0,0 +1,55 @@ +encryptData($phone); + + // احضار كل الأعمدة باستثناء كلمة المرور + $sql = "SELECT * + FROM driver + WHERE phone = :phone + LIMIT 1"; + $stmt = $con->prepare($sql); + $stmt->execute([':phone' => $encPhone]); + + $driver = $stmt->fetch(PDO::FETCH_ASSOC); + + if ($driver) { + // ✅ الحقول المشفرة اللي لازم تنفك: + $encryptedFields = [ + 'phone', + 'email', + 'first_name', + 'last_name', + 'national_number', + 'address','gender','site', + 'birthdate', + 'name_arabic', + ]; + + foreach ($encryptedFields as $field) { + if (!empty($driver[$field])) { + $driver[$field] = $encryptionHelper->decryptData($driver[$field]); + } + } + + // ❌ احذف كلمة المرور من النتيجة + unset($driver['password']); + + jsonSuccess($driver); + + } else { + jsonError("No driver found with this phone."); + } + +} catch (PDOException $e) { + jsonError("Error searching driver: " . $e->getMessage()); +} \ No newline at end of file diff --git a/backend/Admin/driver/getBestDriver.php b/backend/Admin/driver/getBestDriver.php new file mode 100755 index 0000000..3aac1ff --- /dev/null +++ b/backend/Admin/driver/getBestDriver.php @@ -0,0 +1,48 @@ + TIMESTAMP(DATE_SUB(NOW(), INTERVAL 7 DAY)) +GROUP BY + driver.id +ORDER BY + driver_count DESC +LIMIT 19; +"; + +$stmt = $con->prepare($sql); +$stmt->execute(); + +if ($stmt->rowCount() > 0) { + $rows = $stmt->fetchAll(PDO::FETCH_ASSOC); + + // فك التشفير للحقول الحساسة + foreach ($rows as &$row) { + if (!empty($row['phone'])) { + $row['phone'] = $encryptionHelper->decryptData($row['phone']); + } + if (!empty($row['name_arabic'])) { + $row['name_arabic'] = $encryptionHelper->decryptData($row['name_arabic']); + } + if (!empty($row['token'])) { + $row['token'] = $encryptionHelper->decryptData($row['token']); + } + } + + jsonSuccess($rows); +} else { + jsonError($message = "No recent driver location activity found"); +} + +?> \ No newline at end of file diff --git a/backend/Admin/driver/getDriverGiftPayment.php b/backend/Admin/driver/getDriverGiftPayment.php new file mode 100755 index 0000000..4831695 --- /dev/null +++ b/backend/Admin/driver/getDriverGiftPayment.php @@ -0,0 +1,71 @@ +encryptData($v); +} + +error_log("[GIFT_CHECK] Received Phone: " . $phone); +error_log("[GIFT_CHECK] Variants: " . implode(', ', $phoneVariants)); + +// بناء استعلام يبحث عن كل الاحتمالات (المشفرة وغير المشفرة) +$placeholders = []; +$params = []; + +foreach ($encVariants as $i => $ev) { + $placeholders[] = "phone = :enc$i"; + $params[":enc$i"] = $ev; +} +foreach ($phoneVariants as $i => $pv) { + $placeholders[] = "phone = :raw$i"; + $params[":raw$i"] = $pv; +} + +$sql = "SELECT * FROM `driver` WHERE " . implode(" OR ", $placeholders); + +$stmt = $con->prepare($sql); +foreach ($params as $key => $val) { + $stmt->bindValue($key, $val); +} + +$stmt->execute(); + +if ($stmt->rowCount() > 0) { + + $rows = $stmt->fetchAll(PDO::FETCH_ASSOC); + + // Decrypt sensitive fields + foreach ($rows as &$row) { + if (!empty($row['phone'])) { + $row['phone'] = $encryptionHelper->decryptData($row['phone']); + } + if (!empty($row['name_arabic'])) { + $row['name_arabic'] = $encryptionHelper->decryptData($row['name_arabic']); + } + } + + jsonSuccess($rows); + +} else { + jsonError("No recent driver location activity found"); +} + +?> diff --git a/backend/Admin/driver/remove_from_blacklist.php b/backend/Admin/driver/remove_from_blacklist.php new file mode 100755 index 0000000..a4f4a3b --- /dev/null +++ b/backend/Admin/driver/remove_from_blacklist.php @@ -0,0 +1,27 @@ +encryptData($phone); + + $sql = "DELETE FROM blacklist_driver WHERE phone = :phone"; + $stmt = $con->prepare($sql); + $stmt->execute([':phone' => $encPhone]); + + if ($stmt->rowCount() > 0) { + jsonSuccess(null, "Driver removed from blacklist successfully."); + } else { + jsonError("No driver found in blacklist with this phone."); + } + +} catch (PDOException $e) { + jsonError("Error removing from blacklist: " . $e->getMessage()); +} \ No newline at end of file diff --git a/backend/Admin/driver/updateDriverFromAdmin.php b/backend/Admin/driver/updateDriverFromAdmin.php new file mode 100755 index 0000000..d04a1c1 --- /dev/null +++ b/backend/Admin/driver/updateDriverFromAdmin.php @@ -0,0 +1,31 @@ +encryptData($phone); + +$sql = "UPDATE `driver` SET `phone` = :encphone WHERE `id` = :id"; +$stmt = $con->prepare($sql); + +// Bind values +$stmt->bindParam(':encphone', $encphone, PDO::PARAM_STR); +$stmt->bindParam(':id', $driver_id, PDO::PARAM_STR); + +try { + $stmt->execute(); + + if ($stmt->rowCount() > 0) { + // تم التحديث بنجاح + logAudit($con, $user_id, "تعديل رقم هاتف سائق", "driver", $driver_id, ["phone" => $phone]); + jsonSuccess(null, "Phone updated successfully."); + } else { + // لم يتم العثور على أي سجل للتحديث + jsonError("No records updated. Please check the driver ID."); + } +} catch (PDOException $e) { + jsonError("Error updating record: " . $e->getMessage()); +} +?> \ No newline at end of file diff --git a/backend/Admin/employee/add.php b/backend/Admin/employee/add.php new file mode 100755 index 0000000..81b3ebe --- /dev/null +++ b/backend/Admin/employee/add.php @@ -0,0 +1,31 @@ +prepare($sql); +$stmt->execute([$id, $name, $education, $site, $phone, $created_at, $status]); + +// Check if the query successfully inserted the record +if ($stmt->rowCount() > 0) { + // If a row was inserted, print success + jsonSuccess($message = "Employee record added successfully"); +} else { + // If no rows were inserted, print failure + jsonError($message = "Failed to add employee record"); +} +?> \ No newline at end of file diff --git a/backend/Admin/employee/get.php b/backend/Admin/employee/get.php new file mode 100755 index 0000000..0dd72e9 --- /dev/null +++ b/backend/Admin/employee/get.php @@ -0,0 +1,29 @@ +prepare($sql); +$stmt->execute(); + +// Fetch all records as an associative array +$employee_data = $stmt->fetchAll(PDO::FETCH_ASSOC); + +// Check if any records were retrieved +if ($employee_data) { + // If records were found, print the data as JSON + jsonSuccess($data = $employee_data); +} else { + // If no records were found, print a failure message + jsonError($message = "No employee records found"); +} +?> \ No newline at end of file diff --git a/backend/Admin/error/error_list_last20.php b/backend/Admin/error/error_list_last20.php new file mode 100755 index 0000000..2bea5d0 --- /dev/null +++ b/backend/Admin/error/error_list_last20.php @@ -0,0 +1,18 @@ +prepare($sql); + $stmt->execute(); + $rows = $stmt->fetchAll(PDO::FETCH_ASSOC); + + jsonSuccess($rows); +} catch (Exception $e) { + error_log("error_list_last20.php: " . $e->getMessage()); + jsonError($message = "Failed to fetch last 20 errors"); +} \ No newline at end of file diff --git a/backend/Admin/error/error_search_by_phone.php b/backend/Admin/error/error_search_by_phone.php new file mode 100755 index 0000000..2be4f5e --- /dev/null +++ b/backend/Admin/error/error_search_by_phone.php @@ -0,0 +1,32 @@ +encryptData(trim($phone)); + // ثم بدّل الحقل في WHERE إلى phone = :ph + $sql = "SELECT `id`, `error`, `userId`, `userType`, `phone`, `created_at`, `device`, `details`, `status` + FROM `error` + WHERE `phone` = :ph OR `phone` LIKE :phLike + ORDER BY `created_at` DESC + LIMIT 20"; + + $stmt = $con->prepare($sql); + $stmt->execute([ + ":ph" => trim($phone), + ":phLike" => '%' . trim($phone) . '%', // يسمح بجزء من الرقم إن أردت + ]); + + $rows = $stmt->fetchAll(PDO::FETCH_ASSOC); + jsonSuccess($rows); +} catch (Exception $e) { + error_log("error_search_by_phone.php: " . $e->getMessage()); + jsonError($message = "Failed to search errors by phone"); +} \ No newline at end of file diff --git a/backend/Admin/errorApp.php b/backend/Admin/errorApp.php new file mode 100755 index 0000000..04bbf05 --- /dev/null +++ b/backend/Admin/errorApp.php @@ -0,0 +1,40 @@ +prepare($sql); + +// ربط المتغيرات بالقيم +$stmt->bindParam(':error', $error); +$stmt->bindParam(':userId', $userId); +$stmt->bindParam(':userType', $userType); +$stmt->bindParam(':phone', $phone); +$stmt->bindParam(':device', $device); +$stmt->bindParam(':details', $details); // <-- ربط المتغير الجديد + +$stmt->execute(); + +if ($stmt->rowCount() > 0) { + // طباعة رسالة نجاح مع تفاصيل الخطأ لسهولة التتبع في الكونسول + jsonSuccess($error); +} else { + // طباعة رسالة فشل + jsonError("Failed to save error data"); +} +?> diff --git a/backend/Admin/error_log b/backend/Admin/error_log new file mode 100644 index 0000000..e69de29 diff --git a/backend/Admin/facebook.php b/backend/Admin/facebook.php new file mode 100755 index 0000000..e1cf1e8 --- /dev/null +++ b/backend/Admin/facebook.php @@ -0,0 +1,37 @@ + $appId, + 'app_secret' => $appSecret, + 'default_graph_version' => 'v16.0', // Adjust based on your API version +]); + +try { + // Generate the app token + $appToken = $appId . '|' . $appSecret; + + // Debug the token + $response = $fb->get('/debug_token?input_token=' . $accessToken, $appToken); + $tokenData = $response->getDecodedBody(); + + // Display the token details + echo "Token Data:\n"; + print_r($tokenData); + + if (isset($tokenData['data']['expires_at'])) { + echo "Expires At: " . date('Y-m-d H:i:s', $tokenData['data']['expires_at']) . "\n"; + } else { + echo "The token does not have an expiration time.\n"; + } +} catch (Facebook\Exceptions\FacebookResponseException $e) { + echo 'Graph API Error: ' . $e->getMessage(); +} catch (Facebook\Exceptions\FacebookSDKException $e) { + echo 'SDK Error: ' . $e->getMessage(); +} \ No newline at end of file diff --git a/backend/Admin/getPassengerDetails.php b/backend/Admin/getPassengerDetails.php new file mode 100644 index 0000000..1cfa740 --- /dev/null +++ b/backend/Admin/getPassengerDetails.php @@ -0,0 +1,100 @@ +prepare($sql); +$stmt->execute(); +$result = $stmt->fetchAll(PDO::FETCH_ASSOC); + +// ✅ فك التشفير للحقول الحساسة +foreach ($result as &$row) { + $fieldsToDecrypt = [ + "phone", "email", "gender", "birthdate", "site", + "first_name", "last_name", "sosPhone", + "education", "employmentType", "maritalStatus", "passengerToken" + ]; + + foreach ($fieldsToDecrypt as $field) { + if (isset($row[$field]) && $row[$field] !== null) { + $decrypted = $encryptionHelper->decryptData($row[$field]); + if ($decrypted !== false) { + $row[$field] = $decrypted; + } else { + // سجل أو تجاهل القيم التي فشل فك تشفيرها + $row[$field] = null; // أو احتفظ بالقيمة المشفرة + error_log("Failed to decrypt field '$field' for passenger ID: " . $row['id']); + } + } +} +} + +if ($stmt->rowCount() > 0) { + jsonSuccess($data = $result); +} else { + jsonError("No records found"); +} +?> \ No newline at end of file diff --git a/backend/Admin/getPassengerDetailsByPassengerID.php b/backend/Admin/getPassengerDetailsByPassengerID.php new file mode 100644 index 0000000..9fe8a38 --- /dev/null +++ b/backend/Admin/getPassengerDetailsByPassengerID.php @@ -0,0 +1,96 @@ +prepare($sql); +$stmt->execute(); +$result = $stmt->fetchAll(PDO::FETCH_ASSOC); + +// ✅ فك تشفير الحقول الحساسة +foreach ($result as &$row) { + $fieldsToDecrypt = [ + "phone", "email", "gender", "birthdate", "site", + "first_name", "last_name", "sosPhone", + "education", "employmentType", "maritalStatus", "passengerToken" + ]; + + foreach ($fieldsToDecrypt as $field) { + if (isset($row[$field]) && $row[$field] !== null) { + $row[$field] = $encryptionHelper->decryptData($row[$field]); + } + } +} + +if ($stmt->rowCount() > 0) { + jsonSuccess($result); +} else { + jsonError("No records found"); +} +?> \ No newline at end of file diff --git a/backend/Admin/getPassengerbyEmail.php b/backend/Admin/getPassengerbyEmail.php new file mode 100644 index 0000000..0b31982 --- /dev/null +++ b/backend/Admin/getPassengerbyEmail.php @@ -0,0 +1,91 @@ +encryptData(filterRequest("passengerEmail")); +$passengerId = filterRequest("passengerId"); +$passengerphone = $encryptionHelper->encryptData(filterRequest("passengerphone")); + +$sql = "SELECT + `passengers`.`id`, + `passengers`.`phone`, + `passengers`.`email`, + `passengers`.`gender`, + `passengers`.`status`, + `passengers`.`birthdate`, + `passengers`.`site`, + `passengers`.`first_name`, + `passengers`.`last_name`, + `passengers`.`sosPhone`, + `passengers`.`education`, + `passengers`.`employmentType`, + `passengers`.`maritalStatus`, + `passengers`.`created_at`, + `passengers`.`updated_at`, + ( + SELECT COUNT(`id`) FROM `passengers` + ) AS countPassenger, + ( + SELECT COUNT(`id`) FROM `feedBack` + ) AS countFeedback, + ( + SELECT CAST(AVG(`rating`) AS DECIMAL(10, 2)) FROM `ratingPassenger` + WHERE `passenger_id` = `passengers`.`id` + ) AS ratingPassenger, + ( + SELECT COUNT(`driverID`) FROM `ratingPassenger` + WHERE `passenger_id` = `passengers`.`id` + ) AS countDriverRate, + ( + SELECT COUNT(`passengerID`) FROM `canecl` + WHERE `passengerID` = `passengers`.`id` + ) AS countPassengerCancel, + ( + SELECT CAST(AVG(`rating`) AS DECIMAL(10, 2)) FROM `ratingDriver` + WHERE `passenger_iD` = `passengers`.`id` + ) AS passengerAverageRating, + ( + SELECT COUNT(`driver_id`) FROM `ratingDriver` + WHERE `passenger_id` = `passengers`.`id` + ) AS countPassengerRate, + ( + SELECT COUNT(`passenger_id`) FROM `ride` + WHERE `passenger_id` = `passengers`.`id` + ) AS countPassengerRide, + ( + SELECT `token` FROM `tokens` + WHERE `passengerID` = `passengers`.`id` + ) AS passengerToken +FROM + `passengers` +WHERE + passengers.email = :email OR passengers.phone = :phone OR passengers.id = :id +"; + +$stmt = $con->prepare($sql); +$stmt->bindParam(":email", $passengerEmail); +$stmt->bindParam(":phone", $passengerphone); +$stmt->bindParam(":id", $passengerId); +$stmt->execute(); +$result = $stmt->fetchAll(PDO::FETCH_ASSOC); + +// فك التشفير للحقول الحساسة +foreach ($result as &$row) { + $fieldsToDecrypt = [ + "phone", "email", "gender", "birthdate", "site", + "first_name", "last_name", "sosPhone", + "education", "employmentType", "maritalStatus" + ]; + + foreach ($fieldsToDecrypt as $field) { + if (isset($row[$field])) { + $row[$field] = $encryptionHelper->decryptData($row[$field]); + } + } +} + +if ($stmt->rowCount() > 0) { + jsonSuccess($data = $result); +} else { + jsonError("No records found"); +} +?> \ No newline at end of file diff --git a/backend/Admin/getVisaForEachDriver.php b/backend/Admin/getVisaForEachDriver.php new file mode 100644 index 0000000..8325021 --- /dev/null +++ b/backend/Admin/getVisaForEachDriver.php @@ -0,0 +1,48 @@ + 0 AND total_amount > 100 +LIMIT 0, 25"; + +$stmt = $con->prepare($sql); +$stmt->execute(); +$result = $stmt->fetchAll(PDO::FETCH_ASSOC); + +// فك التشفير للحقول المطلوبة +foreach ($result as &$row) { + $fieldsToDecrypt = ['phone', 'email', 'accountBank', 'bankCode', 'name_arabic']; + foreach ($fieldsToDecrypt as $field) { + if (isset($row[$field]) && $row[$field] !== null) { + $row[$field] = $encryptionHelper->decryptData($row[$field]); + } + } +} + +if ($stmt->rowCount() > 0) { + jsonSuccess($result); +} else { + jsonError("No wallet record found"); +} +?> \ No newline at end of file diff --git a/backend/Admin/ggg.php b/backend/Admin/ggg.php new file mode 100644 index 0000000..ac80fd1 --- /dev/null +++ b/backend/Admin/ggg.php @@ -0,0 +1,53 @@ + $adminPhoneParam]); + jsonError('Access denied for this admin phone.', 403); +} + +if (empty($text) || ($action !== 'encrypt' && $action !== 'decrypt')) { + jsonError('Invalid input: need action=encrypt|decrypt and non-empty text.', 400); +} + +// 4) تنفيذ التشفير / الفك (التوافق مع CBC الحالي) +try { + if ($action === 'encrypt') { + $result = $encryptionHelper->encryptData($text); + } else { // decrypt + $result = $encryptionHelper->decryptData($text); + } + + jsonSuccess([ + 'action' => $action, + 'result' => (string) $result, + ]); +} catch (Exception $e) { + securityLog("Encryption tool failed", ['error' => $e->getMessage()]); + jsonError('Operation failed.', 500); +} \ No newline at end of file diff --git a/backend/Admin/jwtService.php b/backend/Admin/jwtService.php new file mode 100755 index 0000000..16f46d9 --- /dev/null +++ b/backend/Admin/jwtService.php @@ -0,0 +1,77 @@ +enforce(RateLimiter::identifier(), 'login'); + +try { + $email = filterRequest('email') ?? ''; + $password = filterRequest('password') ?? ''; + $audience = filterRequest('aud') ?? ''; + + $allowed1 = getenv('allowedService1'); + $allowed2 = getenv('allowedService2'); + $allowedAudiences = array_values(array_filter([$allowed1, $allowed2])); + + if (empty($email) || empty($password) || empty($audience)) { + jsonError('Email and password are required.', 400); + } + + if (!in_array($audience, $allowedAudiences, true)) { + jsonError('Invalid audience', 400); + } + + $con = Database::get('main'); + + // استخدام user table ويفضل استخدام password_hash لاحقا مثل admin_users + $stmt = $con->prepare("SELECT `id`, `password`, `email` FROM `users` WHERE email = :email LIMIT 1"); + $stmt->execute([':email' => $email]); + $user = $stmt->fetch(); + + $startTime = microtime(true); + + // دعم password_verify مع البقاء على التوافق مع كلمات السر القديمة (Plain Text) + if ($user && (password_verify($password, $user['password']) || $user['password'] === $password)) { + + $limiter->reset(RateLimiter::identifier(), 'login'); + + $jwtService = new JwtService($redis); + $jwt = $jwtService->generateAccessToken($user['id'], 'service', $audience); + $refresh = $jwtService->generateRefreshToken($user['id']); + + jsonSuccess([ + 'jwt' => $jwt, + 'refresh_token' => $refresh['token'], + 'expires_in' => 900 // أو 6600 كما كان في الكود الأصلي + ]); + + } else { + $elapsed = microtime(true) - $startTime; + if ($elapsed < 0.1) usleep((int)((0.1 - $elapsed) * 1000000)); + + securityLog("Service login failed", ['email' => $email]); + jsonError('Invalid email or password', 401); + } + +} catch (PDOException $e) { + securityLog("Service Login PDO Error", ['msg' => $e->getMessage()]); + jsonError('Login failed: Database error', 500); +} catch (Exception $e) { + securityLog("Service Login Error", ['msg' => $e->getMessage()]); + jsonError('Login failed: Server error', 500); +} \ No newline at end of file diff --git a/backend/Admin/passenger/admin_delete_and_blacklist_passenger.php b/backend/Admin/passenger/admin_delete_and_blacklist_passenger.php new file mode 100755 index 0000000..c895384 --- /dev/null +++ b/backend/Admin/passenger/admin_delete_and_blacklist_passenger.php @@ -0,0 +1,52 @@ +beginTransaction(); + + // احضر السجل + if (!empty($id)) { + $sel = $con->prepare("SELECT id, phone FROM passengers WHERE id = :id LIMIT 1"); + $sel->execute(['id' => $id]); + } else { + $sel = $con->prepare("SELECT id, phone FROM passengers WHERE phone = :ph LIMIT 1"); + $sel->execute(['ph' => $phone]); + } + $p = $sel->fetch(PDO::FETCH_ASSOC); + if (!$p) { throw new Exception("Passenger not found"); } + + $phRaw = $p['phone']; + $phNorm= normalize_phone($phRaw); + + // أدخِل/حدّث في البلاك ليست + $ins = $con->prepare(" + INSERT INTO passenger_blacklist (phone, phone_normalized, reason, expires_at) + VALUES (:ph, :phn, :r, :exp) + ON DUPLICATE KEY UPDATE reason = VALUES(reason), expires_at = VALUES(expires_at) + "); + $ins->execute([ + 'ph' => $phRaw, + 'phn' => $phNorm, + 'r' => $reason ?: 'Deleted & blacklisted', + 'exp' => $exp ?: null + ]); + + // حذف فعلي + $del = $con->prepare("DELETE FROM passengers WHERE id = :id"); + $del->execute(['id' => $p['id']]); + + $con->commit(); + jsonSuccess(null, "Passenger deleted and blacklisted"); +} catch (Throwable $e) { + $con->rollBack(); + jsonError("Failed: ".$e->getMessage()); +} \ No newline at end of file diff --git a/backend/Admin/passenger/admin_unblacklist.php b/backend/Admin/passenger/admin_unblacklist.php new file mode 100755 index 0000000..0710216 --- /dev/null +++ b/backend/Admin/passenger/admin_unblacklist.php @@ -0,0 +1,14 @@ +prepare("DELETE FROM passenger_blacklist WHERE phone_normalized = :phn"); +$stmt->execute(['phn' => $phn]); + +if ($stmt->rowCount() > 0) { jsonSuccess(null, "Removed from blacklist"); } +else { jsonError("Phone was not blacklisted"); } \ No newline at end of file diff --git a/backend/Admin/passenger/admin_update_passenger.php b/backend/Admin/passenger/admin_update_passenger.php new file mode 100755 index 0000000..837d56d --- /dev/null +++ b/backend/Admin/passenger/admin_update_passenger.php @@ -0,0 +1,50 @@ +encryptData($new_phone); + $first_name = $encryptionHelper->encryptData($first_name); + $last_name = $encryptionHelper->encryptData($last_name); + + $enc_norm = $encryptionHelper->encryptData($norm); +if ($first_name !== null) { $sets[] = "first_name = :first_name"; $params['first_name'] = trim($first_name); } +if ($last_name !== null) { $sets[] = "last_name = :last_name"; $params['last_name'] = trim($last_name); } +if ($new_phone !== null) { + $sets[] = "phone = :phone"; + $params['phone'] = trim($new_phone); + + // منع تكرار الهاتف على راكب آخر + $q = $con->prepare("SELECT id FROM passengers WHERE phone = :ph LIMIT 1"); + $q->execute(['ph' => $params['phone']]); + $row = $q->fetch(PDO::FETCH_ASSOC); + if ($row) { + if (!empty($id) && $row['id'] != $id) { jsonError("Phone already used by another passenger"); exit; } + if (empty($id) && $row['id'] != $phoneLookup) { jsonError("Phone already used by another passenger"); exit; } + } +} + +$whereSql = ""; +$whereParams = []; +if (!empty($id)) { $whereSql = "id = :pid"; $whereParams['pid'] = $id; } +else { $whereSql = "phone = :plk"; $whereParams['plk'] = $phoneLookup; } + +$sql = "UPDATE passengers SET ".implode(", ", $sets).", updated_at = CURRENT_TIMESTAMP WHERE $whereSql"; +$stmt = $con->prepare($sql); +$ok = $stmt->execute(array_merge($params, $whereParams)); + +if ($ok && $stmt->rowCount() > 0) { jsonSuccess(null, "Passenger updated"); } +else { jsonError("No change or passenger not found"); } \ No newline at end of file diff --git a/backend/Admin/rides/admin_get_rides_by_phone.php b/backend/Admin/rides/admin_get_rides_by_phone.php new file mode 100755 index 0000000..af1bee8 --- /dev/null +++ b/backend/Admin/rides/admin_get_rides_by_phone.php @@ -0,0 +1,103 @@ +encryptData($raw); + +try { + error_log("[get_last_ride] Searching passenger with phone=$raw"); + + // 1) ابحث عن الراكب بالهاتف المشفّر + $selP = $con->prepare(" + SELECT id, first_name, last_name, phone + FROM passengers + WHERE phone =:enc_raw + LIMIT 1 + "); + $selP->execute(['enc_raw' => $enc_raw]); + $passenger = $selP->fetch(PDO::FETCH_ASSOC); + + if (!$passenger) { + error_log("[get_last_ride] Passenger not found (phone=$raw)"); + jsonError('Passenger not found for provided phone'); + exit; + } + + error_log("[get_last_ride] Passenger found id=" . $passenger['id']); + + // 2) آخر رحلة لهذا الراكب + $rideStmt = $con->prepare(" + SELECT + r.id, + r.start_location, + r.end_location, + r.date, + r.time, + r.endtime, + r.status, + r.paymentMethod, + r.carType, + r.price, + r.price_for_driver, + r.price_for_passenger, + r.distance, + r.driver_id, + r.passenger_id, + r.created_at, + r.updated_at, + r.DriverIsGoingToPassenger, + r.rideTimeStart, + r.rideTimeFinish, + d.first_name AS driver_first_name, + d.last_name AS driver_last_name + FROM ride r + LEFT JOIN driver d ON d.id = r.driver_id + WHERE r.passenger_id = :pid + ORDER BY r.created_at DESC, r.id DESC + LIMIT 1 + "); + $rideStmt->execute(['pid' => $passenger['id']]); + $ride = $rideStmt->fetch(PDO::FETCH_ASSOC); + + if (!$ride) { + error_log("[get_last_ride] No rides found for passenger_id=" . $passenger['id']); + jsonError('No rides found for this passenger'); + exit; + } + + error_log("[get_last_ride] Found ride id=" . $ride['id'] . " for passenger_id=" . $passenger['id']); + + // فك التشفير + $passenger['first_name'] = $encryptionHelper->decryptData($passenger['first_name']); + $passenger['last_name'] = $encryptionHelper->decryptData($passenger['last_name']); + $passenger['phone'] = $encryptionHelper->decryptData($passenger['phone']); + $ride['driver_first_name'] = $encryptionHelper->decryptData($ride['driver_first_name']); + $ride['driver_last_name'] = $encryptionHelper->decryptData($ride['driver_last_name']); + + // 3) اطبع النتيجة + $response = [ + 'passenger' => [ + 'id' => $passenger['id'], + 'first_name' => $passenger['first_name'], + 'last_name' => $passenger['last_name'], + 'phone' => $passenger['phone'], + ], + 'ride' => $ride + ]; + + error_log("[get_last_ride] Success response for passenger_id=" . $passenger['id']); + jsonSuccess($response); + +} catch (Throwable $e) { + error_log("[get_last_ride] Exception: " . $e->getMessage()); + jsonError("Error: " . $e->getMessage()); +} \ No newline at end of file diff --git a/backend/Admin/rides/admin_update_ride_status.php b/backend/Admin/rides/admin_update_ride_status.php new file mode 100755 index 0000000..b49b98c --- /dev/null +++ b/backend/Admin/rides/admin_update_ride_status.php @@ -0,0 +1,87 @@ +beginTransaction(); + + // إن أردت ختم وقت النهاية تلقائيًا عند الإكمال + if ($status === 'Completed') { + $sql = "UPDATE ride + SET status = :st, rideTimeFinish = IFNULL(rideTimeFinish, NOW()), updated_at = CURRENT_TIMESTAMP + WHERE id = :id"; + } else { + $sql = "UPDATE ride + SET status = :st, updated_at = CURRENT_TIMESTAMP + WHERE id = :id"; + } + + $stmt = $con->prepare($sql); + $ok = $stmt->execute(['st' => $status, 'id' => $rideId]); + + if (!$ok || $stmt->rowCount() === 0) { + $con->rollBack(); + jsonError("Ride not found or no change"); + exit; + } + + // أعِدّ بيانات الرحلة المحدّثة (للتحديث الفوري في الواجهة) + $fetch = $con->prepare(" + SELECT + r.id, + r.start_location, + r.end_location, + r.date, + r.time, + r.endtime, + r.status, + r.paymentMethod, + r.carType, + r.price, + r.price_for_driver, + r.price_for_passenger, + r.distance, + r.driver_id, + r.passenger_id, + r.created_at, + r.updated_at, + r.DriverIsGoingToPassenger, + r.rideTimeStart, + r.rideTimeFinish, + d.first_name AS driver_first_name, + d.last_name AS driver_last_name + FROM ride r + LEFT JOIN driver d ON d.id = r.driver_id + WHERE r.id = :id + LIMIT 1 + "); + $fetch->execute(['id' => $rideId]); + $ride = $fetch->fetch(PDO::FETCH_ASSOC); + + $con->commit(); + jsonSuccess(['ride' => $ride, 'message' => 'Status updated']); +} catch (Throwable $e) { + if ($con->inTransaction()) $con->rollBack(); + jsonError("Error: ".$e->getMessage()); +} \ No newline at end of file diff --git a/backend/Admin/rides/get_driver_live_pos.php b/backend/Admin/rides/get_driver_live_pos.php new file mode 100755 index 0000000..dd3ee6a --- /dev/null +++ b/backend/Admin/rides/get_driver_live_pos.php @@ -0,0 +1,50 @@ +prepare($sql); + $stmt->execute([$driver_id]); + $data = $stmt->fetch(PDO::FETCH_ASSOC); + + if ($data) { + jsonSuccess($data); + } else { + // السائق ليس له موقع مسجل (ربما لم يشغل التطبيق بعد) + jsonError("No location found for this driver"); + } + +} catch (PDOException $e) { + jsonError("Database Error: " . $e->getMessage()); +} +?> \ No newline at end of file diff --git a/backend/Admin/rides/get_rides_by_status.php b/backend/Admin/rides/get_rides_by_status.php new file mode 100755 index 0000000..bd6ba25 --- /dev/null +++ b/backend/Admin/rides/get_rides_by_status.php @@ -0,0 +1,108 @@ +prepare($sql); + $stmt->execute($params); + $rides = $stmt->fetchAll(PDO::FETCH_ASSOC); + + $data = []; + + foreach ($rides as $row) { + // فك التشفير + try { $row['d_fname'] = $encryptionHelper->decryptData($row['d_fname']); } catch(Exception $e){} + try { $row['d_lname'] = $encryptionHelper->decryptData($row['d_lname']); } catch(Exception $e){} + try { $row['d_phone'] = $encryptionHelper->decryptData($row['d_phone']); } catch(Exception $e){} + + try { $row['p_fname'] = $encryptionHelper->decryptData($row['p_fname']); } catch(Exception $e){} + try { $row['p_lname'] = $encryptionHelper->decryptData($row['p_lname']); } catch(Exception $e){} + try { $row['p_phone'] = $encryptionHelper->decryptData($row['p_phone']); } catch(Exception $e){} + + $row['driver_full_name'] = trim($row['d_fname'] . ' ' . $row['d_lname']); + $row['passenger_full_name'] = trim($row['p_fname'] . ' ' . $row['p_lname']); + + if(empty($row['driver_full_name'])) $row['driver_full_name'] = "Unknown Driver"; + if(empty($row['passenger_full_name'])) $row['passenger_full_name'] = "Unknown Passenger"; + + $data[] = $row; + } + + jsonSuccess($data); + +} catch (PDOException $e) { + jsonError("Database Error: " . $e->getMessage()); +} +?> \ No newline at end of file diff --git a/backend/Admin/rides/monitorRide.php b/backend/Admin/rides/monitorRide.php new file mode 100755 index 0000000..b6900a9 --- /dev/null +++ b/backend/Admin/rides/monitorRide.php @@ -0,0 +1,150 @@ +encryptData($phone); +error_log("[MONITOR_RIDE] 2. Encrypted Phone: " . $encPhone); + +// Check Driver Table +$driverQuery = $con->prepare("SELECT id AS driverID FROM driver WHERE phone = :phone LIMIT 1"); +$driverQuery->execute([':phone' => $encPhone]); +$driver = $driverQuery->fetch(PDO::FETCH_ASSOC); + +// Check Passenger Table +$customerQuery = $con->prepare("SELECT id AS customerID FROM passengers WHERE phone = :phone LIMIT 1"); +$customerQuery->execute([':phone' => $encPhone]); +$customer = $customerQuery->fetch(PDO::FETCH_ASSOC); + + +// حدد نوع المستخدم +$userType = ''; +$driverID = null; +$customerID = null; + +if ($driver) { + $userType = 'driver'; + $driverID = $driver['driverID']; + error_log("[MONITOR_RIDE] 3. User Found: Type = DRIVER, ID = " . $driverID); +} elseif ($customer) { + $userType = 'customer'; + $customerID = $customer['customerID']; + error_log("[MONITOR_RIDE] 3. User Found: Type = CUSTOMER, ID = " . $customerID); +} else { + error_log("[MONITOR_RIDE] 3. FAILURE: Phone number not found in Driver or Passenger tables."); + jsonError("رقم الهاتف غير موجود في النظام."); + exit; +} + +//------------------------------------------------------------------------ +// 2) جلب آخر رحلة حالتها "بدأت" بناءً على نوع المستخدم +//------------------------------------------------------------------------ + +if ($userType == 'driver') { + error_log("[MONITOR_RIDE] 4. Searching for active ride for Driver ID: " . $driverID); + $rideQuery = $con->prepare(" + SELECT * FROM ride + WHERE driver_id = :driverID AND status = 'Begin' + ORDER BY id DESC LIMIT 1 + "); + $rideQuery->execute([':driverID' => $driverID]); +} else { + error_log("[MONITOR_RIDE] 4. Searching for active ride for Customer ID: " . $customerID); + $rideQuery = $con->prepare(" + SELECT * FROM ride + WHERE passenger_id = :customerID AND status = 'Begin' + ORDER BY id DESC LIMIT 1 + "); + $rideQuery->execute([':customerID' => $customerID]); +} + +$ride = $rideQuery->fetch(PDO::FETCH_ASSOC); + +if (!$ride) { + error_log("[MONITOR_RIDE] 4. FAILURE: No ride with status 'Begin' found."); + jsonError("لا توجد رحلة بدأت لهذا المستخدم."); + exit; +} else { + error_log("[MONITOR_RIDE] 4. SUCCESS: Active Ride Found. Ride ID: " . $ride['id']); +} + +//------------------------------------------------------------------------ +// 3) جلب معلومات السائق من الرحلة +//------------------------------------------------------------------------ + +// FIX 1: Safe assignment of driver ID (checking driverID vs driver_id) +$rideDriverID = $ride['driverID'] ?? $ride['driver_id']; + +error_log("[MONITOR_RIDE] 5. Fetching info for Driver ID from Ride: " . $rideDriverID); + +// FIX 2: Select first_name and last_name instead of fullname +$driverInfoQuery = $con->prepare(" + SELECT id, first_name, last_name, phone + FROM driver + WHERE id = :driverID + LIMIT 1 +"); + +$driverInfoQuery->execute([':driverID' => $rideDriverID]); +$driverInfo = $driverInfoQuery->fetch(PDO::FETCH_ASSOC); + +if ($driverInfo) { + // فك التشفير للهاتف + $driverInfo['phone'] = $encryptionHelper->decryptData($driverInfo['phone']); + + // FIX 4: Decrypt First Name and Last Name + $driverInfo['first_name'] = $encryptionHelper->decryptData($driverInfo['first_name']); + $driverInfo['last_name'] = $encryptionHelper->decryptData($driverInfo['last_name']); + + // Construct fullname for the response + $fullName = $driverInfo['first_name'] . " " . $driverInfo['last_name']; + $driverInfo['fullname'] = $fullName; + + error_log("[MONITOR_RIDE] 5. Driver Info Found: " . $fullName); +} else { + error_log("[MONITOR_RIDE] 5. WARNING: Driver info not found for ID " . $rideDriverID); +} + +//------------------------------------------------------------------------ +// 4) جلب آخر موقع للسائق من جدول driver_location بشرط الحالة ON +//------------------------------------------------------------------------ + +error_log("[MONITOR_RIDE] 6. Querying Tracking DB for Driver ID: " . $rideDriverID); + +// FIX 3: Changed ORDER BY id DESC to ORDER BY updated_at DESC +$locationQuery = $con_tracking->prepare(" + SELECT latitude, longitude, speed, heading, updated_at + FROM car_locations + WHERE driver_id = :driverID AND status = 'ON' + ORDER BY updated_at DESC LIMIT 1 +"); +$locationQuery->execute([':driverID' => $rideDriverID]); +$location = $locationQuery->fetch(PDO::FETCH_ASSOC); + +if ($location) { + error_log("[MONITOR_RIDE] 6. Location Found: Lat=" . $location['latitude'] . " Lng=" . $location['longitude'] . " Updated=" . $location['updated_at']); +} else { + error_log("[MONITOR_RIDE] 6. WARNING: No live location found (status=ON) or list empty."); +} + +//------------------------------------------------------------------------ +// 5) تجهيز البيانات للرد +//------------------------------------------------------------------------ + +$response = [ + "ride_details" => $ride, + "driver_details" => $driverInfo, + "driver_location" => $location ?: "No live location" +]; + +error_log("[MONITOR_RIDE] 7. Sending Success Response."); +jsonSuccess($response); + +?> \ No newline at end of file diff --git a/backend/Admin/sendEmailToDrivertransaction.php b/backend/Admin/sendEmailToDrivertransaction.php new file mode 100644 index 0000000..9d09fbb --- /dev/null +++ b/backend/Admin/sendEmailToDrivertransaction.php @@ -0,0 +1,87 @@ + + + + + +
+ $appName Logo +

Payment Sent - $appName

+

Thank you for being a valued driver on the $appName platform.

+

We have sent a payment of $totalAmount EGP to your account $accountBank.

+

Please note that it may take a few days for your bank to process this transaction.

+

We appreciate your efforts and are proud to have you on board with $appName.

+

Regards,
tripz Team

+

tripz, Egypt | $domain

+
+ +"; + +// محتوى الإيميل - باللغة العربية +$bodyEmailAr = " + + + + +
+ $appName +

تم إرسال الدفعة - $appName

+

شكرًا لك لكونك سائقًا مميزًا على منصة $appName.

+

لقد تم إرسال دفعة قدرها $totalAmount جنيه إلى حسابك $accountBank.

+

يرجى ملاحظة أن عملية التحويل قد تستغرق بضعة أيام حسب إجراءات البنك.

+

نقدّر جهودك ونتطلع إلى استمرار الشراكة معك على تطبيق $appName.

+

مع التحية،
فريق $appName

+

$appName - مصر | $domain

+
+ +"; + +// إعدادات الإيميل +$supportEmail = 'support@tripz-egypt.com'; +$headers = "MIME-Version: 1.0\r\n"; +$headers .= "Content-Type: text/html; charset=UTF-8\r\n"; +$headers .= "From: tripz Egypt <$supportEmail>\r\n"; + +// إرسال الإيميل إن وُجد عنوان صالح +if (!empty($driverEmail)) { + $subject = "Payment Sent - $appName"; + $message = ($language === 'ar') ? $bodyEmailAr : $bodyEmail; + + if (mail($driverEmail, $subject, $message, $headers)) { + jsonSuccess(null, "Email sent successfully to $driverEmail"); + } else { + jsonError("Failed to send email to $driverEmail"); + } +} else { + jsonError("Invalid or missing driver email address."); +} +?> \ No newline at end of file diff --git a/backend/Admin/send_whatsapp_message.php b/backend/Admin/send_whatsapp_message.php new file mode 100755 index 0000000..f2bf31f --- /dev/null +++ b/backend/Admin/send_whatsapp_message.php @@ -0,0 +1,79 @@ + $receiver, + "type" => "text", + "message" => $message, + "instance_id" => $instanceId, + "access_token"=> $accessToken +]; + +error_log("[send_whatsapp_message.php] Sending payload: " . json_encode($payload)); + +// إرسال الطلب +$response = callAPI("POST", $apiUrl, json_encode($payload)); +error_log("[send_whatsapp_message.php] Raw response: " . print_r($response, true)); + +// فحص الاستجابة +if ($response && !isset($response->error) && (isset($response->status) && $response->status == 'success' || isset($response->message))) { + jsonSuccess(null, "Message sent successfully."); +} else { + $errorMessage = isset($response->message) ? $response->message : "Unknown error."; + error_log("[send_whatsapp_message.php] Failed to send: $errorMessage"); + jsonError("Failed to send message: $errorMessage"); +} + +// دالة cURL +function callAPI($method, $url, $data) +{ + $curl = curl_init(); + curl_setopt_array($curl, [ + CURLOPT_URL => $url, + CURLOPT_RETURNTRANSFER => true, + CURLOPT_ENCODING => "", + CURLOPT_MAXREDIRS => 10, + CURLOPT_TIMEOUT => 30, + CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1, + CURLOPT_CUSTOMREQUEST => $method, + CURLOPT_POSTFIELDS => $data, + CURLOPT_HTTPHEADER => [ + "Content-Type: application/json", + "Accept: application/json" + ], + ]); + $response = curl_exec($curl); + $err = curl_error($curl); + curl_close($curl); + + if ($err) { + error_log("[callAPI] cURL Error: $err"); + return null; + } else { + return json_decode($response); + } +} +?> \ No newline at end of file diff --git a/backend/Admin/v2/analytics/driver_ranking.php b/backend/Admin/v2/analytics/driver_ranking.php new file mode 100644 index 0000000..5e8491f --- /dev/null +++ b/backend/Admin/v2/analytics/driver_ranking.php @@ -0,0 +1,43 @@ + 'Unauthorized access.']); + exit; +} + +try { + // أفضل 10 كباتن حسب عدد الرحلات المكتملة + $stmt = $con->prepare(" + SELECT + d.id, d.first_name, d.last_name, d.phone, + COUNT(r.id) as completed_rides, + SUM(r.price) as total_revenue + FROM driver d + JOIN ride r ON d.id = r.driver_id + WHERE r.status = 'Finished' + GROUP BY d.id, d.first_name, d.last_name, d.phone + ORDER BY completed_rides DESC + LIMIT 10 + "); + $stmt->execute(); + $top_drivers = $stmt->fetchAll(PDO::FETCH_ASSOC); + + // فك تشفير الأسماء + foreach ($top_drivers as &$driver) { + $driver['first_name'] = $encryptionHelper->decryptData($driver['first_name']); + $driver['last_name'] = $encryptionHelper->decryptData($driver['last_name']); + $driver['phone'] = $encryptionHelper->decryptData($driver['phone']); + } + + echo json_encode([ + 'status' => 'success', + 'data' => $top_drivers + ]); +} catch (Exception $e) { + http_response_code(500); + echo json_encode(['status' => 'error', 'message' => $e->getMessage()]); +} +?> diff --git a/backend/Admin/v2/analytics/growth.php b/backend/Admin/v2/analytics/growth.php new file mode 100644 index 0000000..92a3141 --- /dev/null +++ b/backend/Admin/v2/analytics/growth.php @@ -0,0 +1,58 @@ + 'Unauthorized access.']); + exit; +} + +try { + // نمو الركاب لآخر 30 يوم + $stmt = $con->prepare(" + SELECT DATE(created_at) as date, COUNT(*) as new_passengers + FROM passengers + WHERE created_at >= DATE_SUB(CURDATE(), INTERVAL 30 DAY) + GROUP BY DATE(created_at) + ORDER BY date ASC + "); + $stmt->execute(); + $passenger_growth = $stmt->fetchAll(PDO::FETCH_ASSOC); + + // نمو السائقين لآخر 30 يوم + $stmt = $con->prepare(" + SELECT DATE(created_at) as date, COUNT(*) as new_drivers + FROM driver + WHERE created_at >= DATE_SUB(CURDATE(), INTERVAL 30 DAY) + GROUP BY DATE(created_at) + ORDER BY date ASC + "); + $stmt->execute(); + $driver_growth = $stmt->fetchAll(PDO::FETCH_ASSOC); + + // إجمالي الأعداد الحالية + $stmt = $con->prepare("SELECT COUNT(*) FROM passengers"); + $stmt->execute(); + $total_passengers = $stmt->fetchColumn(); + + $stmt = $con->prepare("SELECT COUNT(*) FROM driver"); + $stmt->execute(); + $total_drivers = $stmt->fetchColumn(); + + echo json_encode([ + 'status' => 'success', + 'data' => [ + 'passenger_daily' => $passenger_growth, + 'driver_daily' => $driver_growth, + 'totals' => [ + 'passengers' => (int)$total_passengers, + 'drivers' => (int)$total_drivers + ] + ] + ]); +} catch (Exception $e) { + http_response_code(500); + echo json_encode(['status' => 'error', 'message' => $e->getMessage()]); +} +?> diff --git a/backend/Admin/v2/analytics/revenue.php b/backend/Admin/v2/analytics/revenue.php new file mode 100644 index 0000000..f97a3ad --- /dev/null +++ b/backend/Admin/v2/analytics/revenue.php @@ -0,0 +1,52 @@ + 'Unauthorized access.']); + exit; +} + +try { + // إحصائيات الإيرادات لآخر 30 يوم + $stmt = $con->prepare(" + SELECT + DATE(created_at) as date, + SUM(price) as total_revenue, + SUM(price - price_for_driver) as company_profit, + COUNT(*) as total_rides + FROM ride + WHERE status = 'Finished' + AND created_at >= DATE_SUB(CURDATE(), INTERVAL 30 DAY) + GROUP BY DATE(created_at) + ORDER BY date ASC + "); + $stmt->execute(); + $daily_stats = $stmt->fetchAll(PDO::FETCH_ASSOC); + + // ملخص عام + $stmt = $con->prepare(" + SELECT + SUM(price) as total_revenue_all, + SUM(price - price_for_driver) as total_profit_all, + AVG(price) as avg_ride_price + FROM ride + WHERE status = 'Finished' + AND created_at >= DATE_SUB(CURDATE(), INTERVAL 30 DAY) + "); + $stmt->execute(); + $summary = $stmt->fetch(PDO::FETCH_ASSOC); + + echo json_encode([ + 'status' => 'success', + 'data' => [ + 'daily' => $daily_stats, + 'summary' => $summary + ] + ]); +} catch (Exception $e) { + http_response_code(500); + echo json_encode(['status' => 'error', 'message' => $e->getMessage()]); +} +?> diff --git a/backend/Admin/v2/financial/settlements.php b/backend/Admin/v2/financial/settlements.php new file mode 100644 index 0000000..91774a8 --- /dev/null +++ b/backend/Admin/v2/financial/settlements.php @@ -0,0 +1,44 @@ + 'Unauthorized access.']); + exit; +} + +try { + // جلب السائقين الذين لديهم مستحقات أو مديونية + // الحسبة: إجمالي (price_for_driver) من الرحلات المكتملة + $stmt = $con->prepare(" + SELECT + d.id, d.first_name, d.last_name, d.phone, + SUM(r.price_for_driver) as total_earned, + COUNT(r.id) as total_rides + FROM driver d + LEFT JOIN ride r ON d.id = r.driver_id AND r.status = 'Finished' + GROUP BY d.id + HAVING total_earned > 0 + ORDER BY total_earned DESC + LIMIT 50 + "); + $stmt->execute(); + $drivers = $stmt->fetchAll(PDO::FETCH_ASSOC); + + // فك تشفير البيانات + foreach ($drivers as &$driver) { + $driver['first_name'] = $encryptionHelper->decryptData($driver['first_name']); + $driver['last_name'] = $encryptionHelper->decryptData($driver['last_name']); + $driver['phone'] = $encryptionHelper->decryptData($driver['phone']); + } + + echo json_encode([ + 'status' => 'success', + 'data' => $drivers + ]); +} catch (Exception $e) { + http_response_code(500); + echo json_encode(['status' => 'error', 'message' => $e->getMessage()]); +} +?> diff --git a/backend/Admin/v2/financial/stats.php b/backend/Admin/v2/financial/stats.php new file mode 100644 index 0000000..d0f19d9 --- /dev/null +++ b/backend/Admin/v2/financial/stats.php @@ -0,0 +1,34 @@ + 'Unauthorized access.']); + exit; +} + +try { + // إحصائيات مالية عامة + $stmt = $con->prepare(" + SELECT + SUM(price_for_passenger) as total_revenue, + SUM(price_for_driver) as total_driver_pay, + SUM(price_for_passenger - price_for_driver) as total_platform_commission, + (SELECT SUM(amount) FROM payments WHERE payment_method = 'Cash') as cash_payments, + (SELECT SUM(amount) FROM payments WHERE payment_method != 'Cash') as digital_payments + FROM ride + WHERE status = 'Finished' + "); + $stmt->execute(); + $stats = $stmt->fetch(PDO::FETCH_ASSOC); + + echo json_encode([ + 'status' => 'success', + 'data' => $stats + ]); +} catch (Exception $e) { + http_response_code(500); + echo json_encode(['status' => 'error', 'message' => $e->getMessage()]); +} +?> diff --git a/backend/Admin/v2/quality/blacklist_manager.php b/backend/Admin/v2/quality/blacklist_manager.php new file mode 100644 index 0000000..319646e --- /dev/null +++ b/backend/Admin/v2/quality/blacklist_manager.php @@ -0,0 +1,102 @@ +prepare(" + SELECT id, driver_id, phone, reason, created_at, 'driver' as type + FROM blacklist_driver + ORDER BY created_at DESC + "); + $stmt_drivers->execute(); + $blocked_drivers = $stmt_drivers->fetchAll(PDO::FETCH_ASSOC); + + // جلب قائمة الركاب المحظورين + $stmt_passengers = $con->prepare(" + SELECT id, phone, phone_normalized, reason, expires_at, created_at, 'passenger' as type + FROM passenger_blacklist + ORDER BY created_at DESC + "); + $stmt_passengers->execute(); + $blocked_passengers = $stmt_passengers->fetchAll(PDO::FETCH_ASSOC); + + // فك التشفير عن الأرقام إذا كانت مشفرة + foreach ($blocked_drivers as &$bd) { + $decrypted_phone = $encryptionHelper->decryptData($bd['phone']); + if ($decrypted_phone) $bd['phone'] = $decrypted_phone; + } + + foreach ($blocked_passengers as &$bp) { + $decrypted_phone = $encryptionHelper->decryptData($bp['phone']); + if ($decrypted_phone) $bp['phone'] = $decrypted_phone; + } + + jsonSuccess([ + 'drivers' => $blocked_drivers, + 'passengers' => $blocked_passengers + ]); + exit; + } + + if ($action_type === 'unblock_driver') { + $phone = filterRequest('phone'); + if (!$phone) jsonError("Phone is required"); + + $enc_phone = $encryptionHelper->encryptData($phone); + + $stmt = $con->prepare("DELETE FROM blacklist_driver WHERE phone = ? OR phone = ?"); + $stmt->execute([$phone, $enc_phone]); + + if ($stmt->rowCount() > 0) { + // تسجيل في الـ Audit Log + $log_stmt = $con->prepare("INSERT INTO admin_audit_log (admin_id, admin_phone, action, table_name, entity_type, details) VALUES (?, ?, ?, ?, ?, ?)"); + $log_stmt->execute([ + $user_id, 'Admin', 'unblock_driver', 'blacklist_driver', 'driver', + json_encode(['phone' => $phone, 'action' => 'Unblocked driver']) + ]); + + jsonSuccess(null, "Driver unblocked successfully"); + } else { + jsonError("Driver not found in blacklist"); + } + exit; + } + + if ($action_type === 'unblock_passenger') { + $phone_normalized = filterRequest('phone_normalized'); + if (!$phone_normalized) jsonError("Normalized Phone is required"); + + $stmt = $con->prepare("DELETE FROM passenger_blacklist WHERE phone_normalized = ?"); + $stmt->execute([$phone_normalized]); + + if ($stmt->rowCount() > 0) { + // تسجيل في الـ Audit Log + $log_stmt = $con->prepare("INSERT INTO admin_audit_log (admin_id, admin_phone, action, table_name, entity_type, details) VALUES (?, ?, ?, ?, ?, ?)"); + $log_stmt->execute([ + $user_id, 'Admin', 'unblock_passenger', 'passenger_blacklist', 'passenger', + json_encode(['phone_normalized' => $phone_normalized, 'action' => 'Unblocked passenger']) + ]); + + jsonSuccess(null, "Passenger unblocked successfully"); + } else { + jsonError("Passenger not found in blacklist"); + } + exit; + } + + jsonError("Invalid action_type", 400); + +} catch (Exception $e) { + jsonError("Blacklist action failed: " . $e->getMessage(), 500); +} +?> diff --git a/backend/Admin/v2/quality/driver_scorecard.php b/backend/Admin/v2/quality/driver_scorecard.php new file mode 100644 index 0000000..7679c27 --- /dev/null +++ b/backend/Admin/v2/quality/driver_scorecard.php @@ -0,0 +1,105 @@ +prepare(" + SELECT id, first_name, last_name, phone, status, created_at, expiry_date + FROM driver + WHERE id = ? + "); + $stmt->execute([$driver_id]); + $driver = $stmt->fetch(PDO::FETCH_ASSOC); + + if (!$driver) { + jsonError("Driver not found", 404); + } + + // فك التشفير للبيانات الأساسية + if (!empty($driver['first_name'])) $driver['first_name'] = $encryptionHelper->decryptData($driver['first_name']) ?: $driver['first_name']; + if (!empty($driver['last_name'])) $driver['last_name'] = $encryptionHelper->decryptData($driver['last_name']) ?: $driver['last_name']; + if (!empty($driver['phone'])) $driver['phone'] = $encryptionHelper->decryptData($driver['phone']) ?: $driver['phone']; + + $scorecard['basic_info'] = $driver; + + // 2. إحصائيات الرحلات (نسبة الإنجاز والإلغاء) + $stmt = $con->prepare(" + SELECT + COUNT(*) as total_rides, + SUM(CASE WHEN status = 'Finished' THEN 1 ELSE 0 END) as completed_rides, + SUM(CASE WHEN status = 'cancel' AND cancel_by = 'driver' THEN 1 ELSE 0 END) as driver_cancellations, + SUM(CASE WHEN status = 'cancel' AND cancel_by = 'passenger' THEN 1 ELSE 0 END) as passenger_cancellations + FROM ride + WHERE driver_id = ? + "); + $stmt->execute([$driver_id]); + $rides = $stmt->fetch(PDO::FETCH_ASSOC); + + // حساب نسبة الإنجاز + $total = (int)$rides['total_rides']; + $completed = (int)$rides['completed_rides']; + $rides['completion_rate'] = $total > 0 ? round(($completed / $total) * 100, 2) : 0; + + $scorecard['rides_stats'] = $rides; + + // 3. التقييمات + $stmt = $con->prepare("SELECT IFNULL(AVG(rating_driver), 0) as avg_rating FROM ride WHERE driver_id = ? AND rating_driver > 0"); + $stmt->execute([$driver_id]); + $scorecard['rating'] = round($stmt->fetchColumn(), 2); + + // 4. تحليل السلوك (Behavior) + // نستخدم جدول driver_behavior لجمع المتوسطات + $stmt = $con->prepare(" + SELECT + IFNULL(AVG(behavior_score), 100) as avg_behavior_score, + IFNULL(AVG(max_speed), 0) as avg_max_speed, + IFNULL(SUM(hard_brakes), 0) as total_hard_brakes, + IFNULL(SUM(rapid_accelerations), 0) as total_rapid_accel + FROM driver_behavior + WHERE driver_id = ? + "); + $stmt->execute([$driver_id]); + $scorecard['behavior'] = $stmt->fetch(PDO::FETCH_ASSOC); + + // 5. الشكاوى (Complaints) + $stmt = $con->prepare(" + SELECT + COUNT(*) as total_complaints, + SUM(CASE WHEN statusComplaint = 'Open' THEN 1 ELSE 0 END) as open_complaints, + SUM(CASE WHEN statusComplaint = 'Resolved' THEN 1 ELSE 0 END) as resolved_complaints + FROM complaint + WHERE driver_id = ? + "); + $stmt->execute([$driver_id]); + $scorecard['complaints'] = $stmt->fetch(PDO::FETCH_ASSOC); + + // 6. تقييم شامل (Overall Score) من 100 + // وزن التقييم: 40% إنجاز رحلات، 30% تقييم ركاب (محول لـ 100)، 30% سلوك قيادة، وخصم للشكاوى + $completion_score = $rides['completion_rate'] * 0.4; + $rating_score = ($scorecard['rating'] / 5) * 100 * 0.3; + $behavior_score = $scorecard['behavior']['avg_behavior_score'] * 0.3; + $complaint_penalty = $scorecard['complaints']['total_complaints'] * 5; // خصم 5 نقاط عن كل شكوى + + $overall = $completion_score + $rating_score + $behavior_score - $complaint_penalty; + $scorecard['overall_score'] = max(0, min(100, round($overall, 1))); + + jsonSuccess($scorecard); + +} catch (Exception $e) { + jsonError("Failed to fetch scorecard: " . $e->getMessage(), 500); +} +?> diff --git a/backend/Admin/v2/realtime_dashboard.php b/backend/Admin/v2/realtime_dashboard.php new file mode 100644 index 0000000..71d8a08 --- /dev/null +++ b/backend/Admin/v2/realtime_dashboard.php @@ -0,0 +1,62 @@ + 'Unauthorized access. Admin role required.']); + exit; +} + +$response = [ + 'status' => 'success', + 'message' => [] +]; + +try { + // 1. الرحلات النشطة حالياً + $stmt = $con->prepare("SELECT COUNT(*) FROM ride WHERE status IN ('wait', 'started', 'arrived')"); + $stmt->execute(); + $active_rides = $stmt->fetchColumn(); + + // 2. السائقون المتصلون حالياً (أونلاين) + $stmt = $con->prepare("SELECT COUNT(*) FROM car_locations WHERE status = 'on'"); + $stmt->execute(); + $online_drivers = $stmt->fetchColumn(); + + // 3. إيرادات اليوم + $stmt = $con->prepare("SELECT IFNULL(SUM(price_for_passenger), 0) FROM ride WHERE status = 'Finished' AND DATE(created_at) = CURDATE()"); + $stmt->execute(); + $revenue_today = $stmt->fetchColumn(); + + // إيرادات الأمس (للمقارنة) + $stmt = $con->prepare("SELECT IFNULL(SUM(price_for_passenger), 0) FROM ride WHERE status = 'Finished' AND DATE(created_at) = DATE_SUB(CURDATE(), INTERVAL 1 DAY)"); + $stmt->execute(); + $revenue_yesterday = $stmt->fetchColumn(); + + // 4. شكاوى جديدة اليوم + $stmt = $con->prepare("SELECT COUNT(*) FROM complaint WHERE DATE(date_filed) = CURDATE() AND statusComplaint = 'Open'"); + $stmt->execute(); + $new_complaints = $stmt->fetchColumn(); + + // 5. رخص تنتهي هذا الشهر + $stmt = $con->prepare("SELECT COUNT(*) FROM driver WHERE expiry_date BETWEEN CURDATE() AND DATE_ADD(CURDATE(), INTERVAL 30 DAY)"); + $stmt->execute(); + $expiring_licenses = $stmt->fetchColumn(); + + $response['message'] = [ + 'active_rides' => (int)$active_rides, + 'online_drivers' => (int)$online_drivers, + 'revenue_today' => (float)$revenue_today, + 'revenue_yesterday' => (float)$revenue_yesterday, + 'new_complaints' => (int)$new_complaints, + 'expiring_licenses' => (int)$expiring_licenses + ]; + + echo json_encode($response); +} catch (Exception $e) { + http_response_code(500); + echo json_encode(['status' => 'error', 'message' => $e->getMessage()]); +} +?> diff --git a/backend/Admin/v2/security/audit_logs.php b/backend/Admin/v2/security/audit_logs.php new file mode 100644 index 0000000..77fd848 --- /dev/null +++ b/backend/Admin/v2/security/audit_logs.php @@ -0,0 +1,66 @@ +getMessage() . "\n", FILE_APPEND); + http_response_code(500); + echo json_encode(['status' => 'failure', 'message' => 'loading failed: ' . $e->getMessage()]); + exit; +} + +// ── فحص الصلاحيات ──────────────────────────────────────── +if ($role !== 'super_admin' && $role !== 'admin') { + @file_put_contents($debugFile, " → BLOCKED: role=$role\n", FILE_APPEND); + jsonError("Unauthorized. role=$role", 403); +} + +try { + // استعلام لجلب السجلات مع محاولة جلب الاسم من جدول الموظفين أو جدول المشرفين + $stmt = $con->prepare(" + SELECT + l.id, l.admin_id, l.action, l.table_name, l.record_id, l.details, l.created_at, + COALESCE(e.name, au.name) as admin_name_raw + FROM admin_audit_log l + LEFT JOIN employee e ON l.admin_id COLLATE utf8mb4_general_ci = e.id COLLATE utf8mb4_general_ci + LEFT JOIN adminUser au ON l.admin_id COLLATE utf8mb4_general_ci = au.id COLLATE utf8mb4_general_ci + OR l.admin_id COLLATE utf8mb4_general_ci = au.email COLLATE utf8mb4_general_ci + ORDER BY l.created_at DESC + LIMIT 100 + "); + $stmt->execute(); + $logs = $stmt->fetchAll(PDO::FETCH_ASSOC); + + // معالجة البيانات: فك تشفير الأسماء إذا كانت مشفرة + foreach ($logs as &$log) { + $rawName = $log['admin_name_raw']; + if (!empty($rawName)) { + // محاولة فك التشفير + $decrypted = $encryptionHelper->decryptData($rawName); + $log['admin_name'] = ($decrypted !== false) ? $decrypted : $rawName; + } else { + $log['admin_name'] = 'أدمن غير معروف'; + } + unset($log['admin_name_raw']); + } + + $count = count($logs); + @file_put_contents($debugFile, " → SUCCESS: fetched $count logs\n", FILE_APPEND); + + jsonSuccess($logs); + +} catch (Exception $e) { + @file_put_contents($debugFile, " → QUERY ERROR: " . $e->getMessage() . "\n", FILE_APPEND); + jsonError('Query failed: ' . $e->getMessage(), 500); +} +?> diff --git a/backend/Admin/v2/smart_alerts.php b/backend/Admin/v2/smart_alerts.php new file mode 100644 index 0000000..d6d8aa4 --- /dev/null +++ b/backend/Admin/v2/smart_alerts.php @@ -0,0 +1,77 @@ + 'Unauthorized access. Admin role required.']); + exit; +} + +$alerts = []; + +try { + // 1. شكاوى جديدة غير محلولة (مفتوحة) + $stmt = $con->prepare("SELECT id, ride_id, complaint_type, date_filed FROM complaint WHERE statusComplaint = 'Open' ORDER BY date_filed DESC LIMIT 10"); + $stmt->execute(); + $open_complaints = $stmt->fetchAll(PDO::FETCH_ASSOC); + foreach($open_complaints as $c) { + $alerts[] = [ + 'type' => 'complaint', + 'severity' => 'high', + 'title' => 'شكوى جديدة (' . $c['complaint_type'] . ')', + 'description' => "يوجد شكوى جديدة للرحلة رقم " . $c['ride_id'] . " تحتاج للمراجعة.", + 'date' => $c['date_filed'], + 'action_id' => $c['id'] + ]; + } + + // 2. رحلات عالقة (في الانتظار لأكثر من 15 دقيقة) + $stmt = $con->prepare("SELECT id, created_at FROM ride WHERE status = 'wait' AND created_at < DATE_SUB(NOW(), INTERVAL 15 MINUTE) LIMIT 10"); + $stmt->execute(); + $stuck_rides = $stmt->fetchAll(PDO::FETCH_ASSOC); + foreach($stuck_rides as $r) { + $alerts[] = [ + 'type' => 'ride', + 'severity' => 'medium', + 'title' => 'رحلة عالقة قيد الانتظار', + 'description' => "الرحلة رقم " . $r['id'] . " عالقة في حالة انتظار لأكثر من 15 دقيقة.", + 'date' => $r['created_at'], + 'action_id' => $r['id'] + ]; + } + + // 3. رخص قيادة شارفت على الانتهاء (خلال 15 يوم القادمة) + $stmt = $con->prepare("SELECT id, first_name, last_name, phone, expiry_date FROM driver WHERE expiry_date BETWEEN CURDATE() AND DATE_ADD(CURDATE(), INTERVAL 15 DAY) LIMIT 10"); + $stmt->execute(); + $expiring_drivers = $stmt->fetchAll(PDO::FETCH_ASSOC); + foreach($expiring_drivers as $d) { + // فك تشفير البيانات الحساسة + $firstName = $encryptionHelper->decryptData($d['first_name']); + $lastName = $encryptionHelper->decryptData($d['last_name']); + + $alerts[] = [ + 'type' => 'license', + 'severity' => 'warning', + 'title' => 'رخصة كابتن قاربت على الانتهاء', + 'description' => "رخصة الكابتن " . $firstName . " " . $lastName . " ستنتهي بتاريخ " . $d['expiry_date'] . ".", + 'date' => date('Y-m-d H:i:s'), + 'action_id' => $d['id'] + ]; + } + + // ترتيب التنبيهات حسب الأحدث + usort($alerts, function($a, $b) { + return strtotime($b['date']) - strtotime($a['date']); + }); + + echo json_encode([ + 'status' => 'success', + 'message' => $alerts + ]); +} catch (Exception $e) { + http_response_code(500); + echo json_encode(['status' => 'error', 'message' => $e->getMessage()]); +} +?> diff --git a/backend/Admin/view_errors.php b/backend/Admin/view_errors.php new file mode 100755 index 0000000..21bde82 --- /dev/null +++ b/backend/Admin/view_errors.php @@ -0,0 +1,31 @@ +prepare("SELECT * FROM `error` WHERE `status` = ? ORDER BY `created_at` DESC"); + $stmt->execute(array($status)); +} else { + // إذا لم يتم تحديد status، قم بجلب جميع الأخطاء + $stmt = $con->prepare("SELECT * FROM `error` ORDER BY `created_at` DESC"); + $stmt->execute(); +} + +// جلب جميع النتائج +$errors = $stmt->fetchAll(PDO::FETCH_ASSOC); + +$count = $stmt->rowCount(); + +if ($count > 0) { + // إرجاع البيانات كـ JSON مع رسالة نجاح + echo json_encode(array("status" => "success", "data" => $errors)); +} else { + // في حال عدم وجود أخطاء، إرجاع رسالة نجاح مع بيانات فارغة + echo json_encode(array("status" => "success", "data" => [])); +} + +?> diff --git a/backend/EgyptDocuments/error_log b/backend/EgyptDocuments/error_log new file mode 100644 index 0000000..e69de29 diff --git a/backend/EgyptDocuments/uploadEgyptIdBack.php b/backend/EgyptDocuments/uploadEgyptIdBack.php new file mode 100644 index 0000000..96ccfbb --- /dev/null +++ b/backend/EgyptDocuments/uploadEgyptIdBack.php @@ -0,0 +1,71 @@ + "Failed to save image")); ; + exit; +} + +// Store additional information (modify based on your needs) +$image_url = $target_dir . $new_filename; // Update if needed +$image_details = [ + "name" => $image_name, + "size" => $image_size, + "extension" => $image_extension, + "url" => $image_url, +]; + +// Use the image details for further processing (e.g., display, store in database) +// ... + + echo json_encode(array('status' => 'Image uploaded successfully!')); + +?> diff --git a/backend/EgyptDocuments/uploadEgyptidFront.php b/backend/EgyptDocuments/uploadEgyptidFront.php new file mode 100644 index 0000000..357805c --- /dev/null +++ b/backend/EgyptDocuments/uploadEgyptidFront.php @@ -0,0 +1,71 @@ + "Failed to save image")); ; + exit; +} + +// Store additional information (modify based on your needs) +$image_url = $target_dir . $new_filename; // Update if needed +$image_details = [ + "name" => $image_name, + "size" => $image_size, + "extension" => $image_extension, + "url" => $image_url, +]; + +// Use the image details for further processing (e.g., display, store in database) +// ... + + echo json_encode(array('status' => 'Image uploaded successfully!')); + +?> diff --git a/backend/aggregate_files.py b/backend/aggregate_files.py new file mode 100644 index 0000000..a0b6fe7 --- /dev/null +++ b/backend/aggregate_files.py @@ -0,0 +1,40 @@ +import os + +# Configuration +PROJECT_DIR = '.' +OUTPUT_FILE = 'intaleq_v1_secure_latest.md' +EXCLUDED_DIRS = {'.git', 'vendor', 'node_modules', '.gemini'} +EXCLUDED_FILES = {OUTPUT_FILE, 'aggregate_files.py'} + +def aggregate_files(): + with open(OUTPUT_FILE, 'w', encoding='utf-8') as outfile: + outfile.write(f'# Intaleq V1 - Secure Latest Version\n\n') + + for root, dirs, files in os.walk(PROJECT_DIR): + # Prune excluded directories + dirs[:] = [d for d in dirs if d not in EXCLUDED_DIRS] + + for file in files: + if file in EXCLUDED_FILES: + continue + + filepath = os.path.join(root, file) + rel_path = os.path.relpath(filepath, PROJECT_DIR) + + # We mainly want to include code files + if any(file.endswith(ext) for ext in ['.php', '.sql', '.ini', '.json', '.md', '.txt', '.py', '.sh']): + try: + with open(filepath, 'r', encoding='utf-8', errors='ignore') as infile: + content = infile.read() + + outfile.write(f'## File: {rel_path}\n') + outfile.write(f'```\n') + outfile.write(content) + outfile.write(f'\n```\n\n') + print(f"Added: {rel_path}") + except Exception as e: + print(f"Could not read {rel_path}: {e}") + +if __name__ == "__main__": + aggregate_files() + print(f"\nDone! File created: {OUTPUT_FILE}") diff --git a/backend/auth/Tester/error_log b/backend/auth/Tester/error_log new file mode 100644 index 0000000..e69de29 diff --git a/backend/auth/Tester/getTesterApp.php b/backend/auth/Tester/getTesterApp.php new file mode 100644 index 0000000..625f035 --- /dev/null +++ b/backend/auth/Tester/getTesterApp.php @@ -0,0 +1,29 @@ +prepare($sql); +$stmt->execute(); +$result = $stmt->fetchAll(PDO::FETCH_ASSOC); + +if ($stmt->rowCount() > 0) { + // Print the retrieved data + // echo json_encode($result); + jsonSuccess($data = $result); +} else { + // Print a failure message + + jsonError($message = "No driver order data found"); +} + +?> \ No newline at end of file diff --git a/backend/auth/Tester/updateTesterApp.php b/backend/auth/Tester/updateTesterApp.php new file mode 100644 index 0000000..b7b98c2 --- /dev/null +++ b/backend/auth/Tester/updateTesterApp.php @@ -0,0 +1,23 @@ +prepare($sql); +$stmt->execute(); + +if ($stmt->rowCount() > 0) { + // Print a success message + jsonSuccess($message = "Test data updated successfully"); +} else { + // Print a failure message + jsonError($message = "Failed to update driver order data"); +} +?> \ No newline at end of file diff --git a/backend/auth/captin/addCriminalDocuments.php b/backend/auth/captin/addCriminalDocuments.php new file mode 100644 index 0000000..819e9eb --- /dev/null +++ b/backend/auth/captin/addCriminalDocuments.php @@ -0,0 +1,35 @@ +prepare($sql); + + // Bind parameters + $stmt->bindParam(':driverId', $driverId, PDO::PARAM_INT); + $stmt->bindParam(':issueDate', $issueDate, PDO::PARAM_STR); + $stmt->bindParam(':inspectionResult', $inspectionResult, PDO::PARAM_STR); + + // Execute the statement + $stmt->execute(); + + // Check if the insertion was successful + if ($stmt->rowCount() > 0) { + jsonSuccess(null, "Criminal document data saved successfully"); + } else { + jsonError("Failed to save criminal document data"); + } +} catch (PDOException $e) { + // Log the error and print a generic failure message + error_log("Database Error: " . $e->getMessage()); + jsonError("An error occurred while saving the data"); +} +?> \ No newline at end of file diff --git a/backend/auth/captin/deletecaptainAccounr.php b/backend/auth/captin/deletecaptainAccounr.php new file mode 100644 index 0000000..9ee0d05 --- /dev/null +++ b/backend/auth/captin/deletecaptainAccounr.php @@ -0,0 +1,60 @@ +prepare("SELECT phone FROM `driver` WHERE `id` = :id"); + $stmtPhone->bindParam(':id', $id, PDO::PARAM_INT); + $stmtPhone->execute(); + $driverData = $stmtPhone->fetch(PDO::FETCH_ASSOC); + + // التحقق من وجود السائق + if (!$driverData) { + jsonError("Driver not found"); + exit(); + } + + $phone = $driverData['phone']; + + // 2. تحديث حالة السائق + $sql = "UPDATE `driver` SET `status` = 'deleteFromHimself' WHERE `id` = :id"; + $stmt = $con->prepare($sql); + $stmt->bindParam(':id', $id, PDO::PARAM_INT); + $stmt->execute(); + + if ($stmt->rowCount() > 0) { + // 3. الإضافة إلى القائمة السوداء (blacklist_driver) + // نستخدم NOW() لتسجيل الوقت الحالي تلقائياً + // لا نمرر id العمود الأول لأنه غالباً Auto Increment في قاعدة البيانات + $insertSql = "INSERT INTO `blacklist_driver` (`driver_id`, `phone`, `reason`, `created_at`) + VALUES (:driver_id, :phone, :reason, NOW())"; + + $insertStmt = $con->prepare($insertSql); + $insertStmt->execute([ + ':driver_id' => $id, + ':phone' => $phone, + ':reason' => $reason + ]); + + jsonSuccess(null, "Record marked as deleted and added to blacklist successfully"); + } else { + jsonError("Failed to update record or no change made"); + } + +} catch (PDOException $e) { + // في حال حدوث خطأ في قاعدة البيانات (مثلاً تكرار الإضافة) + jsonError("Database Error: " . $e->getMessage()); +} +?> \ No newline at end of file diff --git a/backend/auth/captin/error_log b/backend/auth/captin/error_log new file mode 100644 index 0000000..7e42402 --- /dev/null +++ b/backend/auth/captin/error_log @@ -0,0 +1,15 @@ +[21-May-2025 12:28:44 Europe/Berlin] PHP Fatal error: Uncaught PDOException: SQLSTATE[42S22]: Column not found: 1054 Unknown column 'driver.education' in 'field list' in /home2/seferli1/server.sefer.live/sefer.click/sefer/auth/captin/loginFromGoogle.php:43 +Stack trace: +#0 /home2/seferli1/server.sefer.live/sefer.click/sefer/auth/captin/loginFromGoogle.php(43): PDO->prepare('SELECT\n driv...') +#1 {main} + thrown in /home2/seferli1/server.sefer.live/sefer.click/sefer/auth/captin/loginFromGoogle.php on line 43 +[21-May-2025 21:09:18 Europe/Berlin] PHP Fatal error: Uncaught PDOException: SQLSTATE[42S22]: Column not found: 1054 Unknown column 'driver.education' in 'field list' in /home2/seferli1/server.sefer.live/sefer.click/sefer/auth/captin/loginFromGoogle.php:43 +Stack trace: +#0 /home2/seferli1/server.sefer.live/sefer.click/sefer/auth/captin/loginFromGoogle.php(43): PDO->prepare('SELECT\n driv...') +#1 {main} + thrown in /home2/seferli1/server.sefer.live/sefer.click/sefer/auth/captin/loginFromGoogle.php on line 43 +[22-May-2025 03:30:03 Europe/Berlin] PHP Fatal error: Uncaught PDOException: SQLSTATE[42S22]: Column not found: 1054 Unknown column 'driver.education' in 'field list' in /home2/seferli1/server.sefer.live/sefer.click/sefer/auth/captin/loginFromGoogle.php:43 +Stack trace: +#0 /home2/seferli1/server.sefer.live/sefer.click/sefer/auth/captin/loginFromGoogle.php(43): PDO->prepare('SELECT\n driv...') +#1 {main} + thrown in /home2/seferli1/server.sefer.live/sefer.click/sefer/auth/captin/loginFromGoogle.php on line 43 diff --git a/backend/auth/captin/forgetPassword.php b/backend/auth/captin/forgetPassword.php new file mode 100644 index 0000000..e69de29 diff --git a/backend/auth/captin/getAccount.php b/backend/auth/captin/getAccount.php new file mode 100644 index 0000000..436241c --- /dev/null +++ b/backend/auth/captin/getAccount.php @@ -0,0 +1,24 @@ +prepare($sql); +$stmt->bindParam(':id', $driverID, PDO::PARAM_INT); +$stmt->execute(); + +if ($stmt->rowCount() > 0) { + $row = $stmt->fetchAll(PDO::FETCH_ASSOC); + jsonSuccess($row); +} else { + jsonError("No account bank record found"); +} +?> \ No newline at end of file diff --git a/backend/auth/captin/getAllDriverSecure.php b/backend/auth/captin/getAllDriverSecure.php new file mode 100644 index 0000000..f566663 --- /dev/null +++ b/backend/auth/captin/getAllDriverSecure.php @@ -0,0 +1,39 @@ +prepare($sql); +$stmt->execute(); + +if ($stmt->rowCount() > 0) { + $rows = $stmt->fetchAll(PDO::FETCH_ASSOC); + + // فك تشفير الحقول الحساسة + foreach ($rows as &$row) { + $row['phone'] = $encryptionHelper->decryptData($row['phone']); + $row['email'] = $encryptionHelper->decryptData($row['email']); + $row['gender'] = $encryptionHelper->decryptData($row['gender']); + $row['birthdate'] = $encryptionHelper->decryptData($row['birthdate']); + $row['first_name'] = $encryptionHelper->decryptData($row['first_name']); + $row['last_name'] = $encryptionHelper->decryptData($row['last_name']); + $row['sosPhone'] = $encryptionHelper->decryptData($row['sosPhone']); + } + + jsonSuccess($rows); +} else { + jsonError("No wallet record found"); +} +?> \ No newline at end of file diff --git a/backend/auth/captin/getPromptDriverDocumentsEgypt.php b/backend/auth/captin/getPromptDriverDocumentsEgypt.php new file mode 100644 index 0000000..7ea4054 --- /dev/null +++ b/backend/auth/captin/getPromptDriverDocumentsEgypt.php @@ -0,0 +1,23 @@ +prepare($sql); +$stmt->execute(); + +if ($stmt->rowCount() > 0) { + // Fetch the record + $row = $stmt->fetchAll(PDO::FETCH_ASSOC); + + jsonSuccess($row); + +} + else{ + // Print a failure message + jsonError($message = "No wallet record found"); +} +?> \ No newline at end of file diff --git a/backend/auth/captin/login.php b/backend/auth/captin/login.php new file mode 100644 index 0000000..eb27381 --- /dev/null +++ b/backend/auth/captin/login.php @@ -0,0 +1,66 @@ +encryptData($email); +$phone = $encryptionHelper->encryptData($phone); + +$sql = "SELECT + driver.id, + driver.phone, + driver.email, + driver.password, + driver.gender, + driver.birthdate, + driver.site, + driver.first_name, + driver.last_name, + driver.education, + driver.employmentType, + driver.maritalStatus, + driver.created_at, + driver.updated_at, + email_verifications.verified +FROM + driver +LEFT JOIN email_verifications ON email_verifications.email = driver.email +WHERE + driver.phone = :phone AND driver.email = :email"; + +$stmt = $con->prepare($sql); +$stmt->bindParam(':email', $email); +$stmt->bindParam(':phone', $phone); +$stmt->execute(); +$data = $stmt->fetchAll(PDO::FETCH_ASSOC); +$count = $stmt->rowCount(); + +if ($count > 0) { + $stored_password = $data[0]['password']; + if (password_verify($password, $stored_password)) { + + // فك التشفير للحقول الحساسة + $data[0]['phone'] = $encryptionHelper->decryptData($data[0]['phone']); + $data[0]['email'] = $encryptionHelper->decryptData($data[0]['email']); + $data[0]['gender'] = $encryptionHelper->decryptData($data[0]['gender']); + $data[0]['birthdate'] = $encryptionHelper->decryptData($data[0]['birthdate']); + $data[0]['site'] = $encryptionHelper->decryptData($data[0]['site']); + $data[0]['first_name'] = $encryptionHelper->decryptData($data[0]['first_name']); + $data[0]['last_name'] = $encryptionHelper->decryptData($data[0]['last_name']); + $data[0]['education'] = $encryptionHelper->decryptData($data[0]['education']); + $data[0]['employmentType'] = $encryptionHelper->decryptData($data[0]['employmentType']); + $data[0]['maritalStatus'] = $encryptionHelper->decryptData($data[0]['maritalStatus']); + + unset($data[0]['password']); // لا نرجّع الباسورد + jsonSuccess($data); + } else { + jsonError("Incorrect password."); + } +} else { + jsonError("User does not exist."); +} +?> \ No newline at end of file diff --git a/backend/auth/captin/loginFromGoogle.php b/backend/auth/captin/loginFromGoogle.php new file mode 100755 index 0000000..de3d1b8 --- /dev/null +++ b/backend/auth/captin/loginFromGoogle.php @@ -0,0 +1,111 @@ +encryptData($emailRaw); + // error_log("[Debug] Email (encrypted): $emailEnc"); + + /* ──────────────────────────────── + 3) إعداد الاستعلام الموحَّد + ───────────────────────────────── */ + $sql = " + SELECT + driver.id, driver.phone, driver.email, driver.gender, driver.birthdate, + driver.site, driver.first_name, driver.last_name, driver.bankCode, + driver.accountBank, driver.employmentType,driver.status, driver.maritalStatus, + driver.created_at, driver.updated_at, + phone_verification.is_verified, + CarRegistration.make, CarRegistration.model, CarRegistration.year, + df.is_claimed, inv.isInstall, inv.isGiftToken + FROM driver + LEFT JOIN phone_verification ON phone_verification.phone_number = driver.phone + LEFT JOIN driver_gifts df ON df.driver_id = driver.id + LEFT JOIN CarRegistration ON CarRegistration.driverID = driver.id + LEFT JOIN invites inv ON inv.driverId = driver.id + WHERE + + driver.id = :id + -- AND phone_verification.is_verified = '1' + LIMIT 1 + "; + + // error_log("[Debug] queryString:\n$sql"); + + $stmt = $con->prepare($sql); + + // باراميترات الربط + $params = [ + //':email' => $emailEnc, + ':id' => $driverID, + ]; + foreach ($params as $k => $v) { + $stmt->bindValue($k, $v); + } + + /* ───────── dumpParams (اختياري) ───────── */ + ob_start(); + $stmt->debugDumpParams(); + error_log("[Debug] dumpParams:\n" . ob_get_clean()); + + /* ──────────────────────────────── + 4) تنفيذ الاستعلام + ───────────────────────────────── */ + $stmt->execute(); + error_log("[Debug] stmt->rowCount(): " . $stmt->rowCount()); + + $rows = $stmt->fetchAll(PDO::FETCH_ASSOC); + // error_log("[Debug] Raw fetched JSON: " . json_encode($rows, JSON_UNESCAPED_UNICODE)); + + if (!$rows) { + jsonError("User does not exist or phone not verified."); + exit; + } + + /* ──────────────────────────────── + 5) فك التشفير للحقول الحسّاسة + ───────────────────────────────── */ + $data = &$rows[0]; // مرجع لتوفير الذاكرة + + $decryptIfNotNull = function($field) use (&$data, $encryptionHelper) { + if (isset($data[$field]) && $data[$field] !== null) { + $data[$field] = $encryptionHelper->decryptData($data[$field]); + } + }; + + foreach ([ + 'phone', 'email', 'gender', 'birthdate', 'site', + 'first_name', 'last_name' + ] as $field) { + $decryptIfNotNull($field); + } +error_log("[Debug] Raw fetched JSON: " . json_encode($rows, JSON_UNESCAPED_UNICODE)); + + echo json_encode([ + "status" => "success", + "count" => 1, + "data" => $rows // نتيجة واحدة فقط + ], JSON_UNESCAPED_UNICODE); +} catch (PDOException $e) { + error_log("[PDO ERROR] " . $e->getMessage()); + jsonError("Database error: ".$e->getCode()); +} catch (Exception $e) { + error_log("[GENERAL ERROR] " . $e->getMessage()); + jsonError("Error occurred."); +} finally { + $stmt = null; + $con = null; +} +?> \ No newline at end of file diff --git a/backend/auth/captin/loginUsingCredentialsWithoutGoogle.php b/backend/auth/captin/loginUsingCredentialsWithoutGoogle.php new file mode 100755 index 0000000..68e22f6 --- /dev/null +++ b/backend/auth/captin/loginUsingCredentialsWithoutGoogle.php @@ -0,0 +1,77 @@ +encryptData($email); + +// SQL لاسترجاع المستخدم بناءً على البريد الإلكتروني المشفر +$sql = "SELECT + driver.id, + driver.phone, + driver.email, + driver.gender, + driver.birthdate, + driver.site, + driver.first_name, + driver.last_name, + driver.bankCode, + driver.accountBank, + driver.education, + driver.employmentType, + driver.maritalStatus, + driver.created_at, + driver.updated_at, + driver.password, + phone_verification.is_verified, + CarRegistration.make, + CarRegistration.model, + CarRegistration.year +FROM + driver +LEFT JOIN phone_verification ON phone_verification.phone_number = driver.phone +LEFT JOIN CarRegistration ON CarRegistration.driverID = driver.id +WHERE + driver.email = :email AND phone_verification.is_verified = '1' +LIMIT 1"; + +$stmt = $con->prepare($sql); +$stmt->bindParam(':email', $encryptedEmail); +$stmt->execute(); + +$data = $stmt->fetch(PDO::FETCH_ASSOC); + +if ($data) { + if (password_verify($password, $data['password'])) { + unset($data['password']); + + // فك تشفير الحقول الحساسة + $data['phone'] = $encryptionHelper->decryptData($data['phone']); + $data['email'] = $encryptionHelper->decryptData($data['email']); + $data['gender'] = $encryptionHelper->decryptData($data['gender']); + $data['birthdate'] = $encryptionHelper->decryptData($data['birthdate']); + $data['site'] = $encryptionHelper->decryptData($data['site']); + $data['first_name'] = $encryptionHelper->decryptData($data['first_name']); + $data['last_name'] = $encryptionHelper->decryptData($data['last_name']); + $data['education'] = $encryptionHelper->decryptData($data['education']); + $data['employmentType'] = $encryptionHelper->decryptData($data['employmentType']); + $data['maritalStatus'] = $encryptionHelper->decryptData($data['maritalStatus']); + + echo json_encode([ + "status" => "success", + "data" => $data + ]); + } else { + jsonError("Incorrect password."); + } +} else { + jsonError("User does not exist or phone number not verified."); +} + +$stmt = null; +$con = null; +exit(); +?> \ No newline at end of file diff --git a/backend/auth/captin/register.php b/backend/auth/captin/register.php new file mode 100755 index 0000000..bf67bcc --- /dev/null +++ b/backend/auth/captin/register.php @@ -0,0 +1,132 @@ +encryptData($data[$f]); + } + } + + /* =========== 3) توليد driver ID (id) إذا لم يُرسَل =========== */ + + + /* =========== 4) هَش كلمة المرور =========== */ + $data['password_hashed'] = password_hash($data['password'], PASSWORD_DEFAULT); + + /* =========== 5) منع التكرار في الهاتف / الإيميل =========== */ + $dup = $con->prepare( + "SELECT id FROM driver WHERE phone = :phone OR email = :email" + ); + $dup->execute([ + ':phone' => $data['phone'], + ':email' => $data['email'] + ]); + if ($dup->rowCount() > 0) { + jsonError("Phone or email already registered."); + exit; + } + + /* =========== 6) إدخال السجل الجديد =========== */ + $sql = " + INSERT INTO driver ( + id, phone, email, password, gender, license_type, national_number, + name_arabic, issue_date, expiry_date, license_categories, + address, licenseIssueDate, status, birthdate, site, + first_name, last_name, accountBank, bankCode, + employmentType, maritalStatus, fullNameMaritial, expirationDate, + created_at, updated_at + ) VALUES ( + :id, :phone, :email, :pwd, :gender, :license_type, :national_number, + :name_arabic, :issue_date, :expiry_date, :license_categories, + :address, :licenseIssueDate, :status, :birthdate, :site, + :first_name, :last_name, :accountBank, :bankCode, + :employmentType, :maritalStatus, :fullNameMaritial, :expirationDate, + NOW(), NOW() + ) + "; + + $ins = $con->prepare($sql); + + // خريطة الربط (تطابق تمامًا أسماء الـ placeholders في الـ SQL أعلاه) + $bind = [ + 'id' => $data['id'], + 'phone' => $data['phone'], + 'email' => $data['email'], + 'pwd' => $data['password_hashed'], + 'gender' => $data['gender'], + 'license_type' => $data['license_type'], + 'national_number' => $data['national_number'], + 'name_arabic' => $data['name_arabic'], + 'issue_date' => $data['issue_date'], + 'expiry_date' => $data['expiry_date'], + 'license_categories'=> $data['license_categories']?? 'B', + 'address' => $data['address'], + 'licenseIssueDate' => $data['licenseIssueDate'], + 'status' => $data['status'] ?? 'yet', + 'birthdate' => $data['birthdate'], + 'site' => $data['site'], + 'first_name' => $data['first_name'], + 'last_name' => $data['last_name'], + 'accountBank' => 'yet', + 'bankCode' => 'yet', + 'employmentType' => $data['employmentType']?? 'yet', + 'maritalStatus' => $data['maritalStatus']?? 'yet', + 'fullNameMaritial' => $data['fullNameMaritial']?? 'yet', + 'expirationDate' => $data['expirationDate']?? 'yet', + ]; + + foreach ($bind as $key => $value) { + $ins->bindValue(":$key", $value); + } + + if ($ins->execute()) { + jsonSuccess($data['id']); // ترجع driver ID + } else { + jsonError("Failed to insert driver record."); + } + +} catch (PDOException $e) { + error_log("DriverInsert PDO: " . $e->getMessage()); + jsonError("Database error."); +} +?> \ No newline at end of file diff --git a/backend/auth/captin/removeAccount.php b/backend/auth/captin/removeAccount.php new file mode 100644 index 0000000..e23b2ca --- /dev/null +++ b/backend/auth/captin/removeAccount.php @@ -0,0 +1,16 @@ +prepare($sql); +$stmt->bindParam(':id', $id, PDO::PARAM_INT); +$stmt->execute(); + +if ($stmt->rowCount() > 0) { + jsonSuccess(null, "Passenger deleted successfully."); +} else { + jsonError("Failed to delete passenger."); +} +?> \ No newline at end of file diff --git a/backend/auth/captin/sendOtpMessageDriver.php b/backend/auth/captin/sendOtpMessageDriver.php new file mode 100755 index 0000000..69c51b3 --- /dev/null +++ b/backend/auth/captin/sendOtpMessageDriver.php @@ -0,0 +1,140 @@ +exists($redisKey)) { + jsonError("Please wait before requesting a new OTP."); + exit; + } + $redis->setex($redisKey, 60, "1"); // حظر لمدة 60 ثانية +} + +// توليد رمز تحقق مكوّن من 5 أرقام +$token_code = str_pad(random_int(0, 99999), 5, '0', STR_PAD_LEFT); + +// تشفير البيانات الحساسة +$encryptedPhone = $encryptionHelper->encryptData($phone_number); +$encryptedToken = $encryptionHelper->encryptData($token_code); +$encryptedEmail = $encryptionHelper->encryptData($email); // اختياري إذا بتحب تشفيره + +// التحقق من وجود الرقم مسبقاً في قاعدة البيانات +$sqlCheck = "SELECT * FROM `phone_verification` WHERE `phone_number` = :phone"; +$stmtCheck = $con->prepare($sqlCheck); +$stmtCheck->bindParam(":phone", $encryptedPhone); +$stmtCheck->execute(); + +$success = false; + +// إذا كان الرقم موجود → تحديث +if ($stmtCheck->rowCount() > 0) { + $sqlUpdate = "UPDATE `phone_verification` + SET `token_code` = :token, + `expiration_time` = DATE_ADD(NOW(), INTERVAL 5 MINUTE) + WHERE `phone_number` = :phone"; + $stmt = $con->prepare($sqlUpdate); + $stmt->bindParam(":token", $encryptedToken); + $stmt->bindParam(":phone", $encryptedPhone); + $stmt->execute(); + $success = $stmt->rowCount() > 0; +} else { + // إذا الرقم غير موجود → إدخال جديد + $sqlInsert = "INSERT INTO `phone_verification` + (`phone_number`, `driverId`, `email`, `token_code`, `expiration_time`, `is_verified`, `created_at`) + VALUES + (:phone, :driverId, :email, :token, DATE_ADD(NOW(), INTERVAL 5 MINUTE), 0, NOW())"; + $stmt = $con->prepare($sqlInsert); + $stmt->bindParam(":phone", $encryptedPhone); + $stmt->bindParam(":driverId", $driverId); + $stmt->bindParam(":email", $encryptedEmail); + $stmt->bindParam(":token", $encryptedToken); + $stmt->execute(); + $success = $stmt->rowCount() > 0; +} + +// إذا تم الحفظ بنجاح → أرسل الرمز عبر SMS +if ($success) { + // تحميل بيانات الاتصال بالـ SMS API من المتغيرات البيئية + $username = getenv('SMS_USERNAME'); + $password = getenv('SMS_PASSWORD_EGYPT'); + $sender = getenv('SMS_SENDER'); + + if (!$username || !$password || !$sender) { + jsonError("SMS credentials are missing"); + exit; + } + + $message = "Tripz app code is " . $token_code; + $receiver = $phone_number; + + $apiUrl = 'https://sms.kazumi.me/api/sms/send-sms'; + $payload = [ + 'username' => $username, + 'password' => $password, + 'language' => 'e', + 'sender' => $sender, + 'receiver' => $receiver, + 'message' => $message + ]; + + $jsonPayload = json_encode($payload); + $smsResponse = callAPI("POST", $apiUrl, $jsonPayload); + + if ($smsResponse) { + jsonSuccess(null, "Verification code sent and saved successfully"); + } else { + jsonError("Code saved, but SMS sending failed"); + } +} else { + jsonError("Failed to save verification data"); +} + +// دالة الاتصال بالـ API +function callAPI($method, $url, $data) { + $curl = curl_init(); + curl_setopt_array($curl, [ + CURLOPT_URL => $url, + CURLOPT_RETURNTRANSFER => true, + CURLOPT_CUSTOMREQUEST => $method, + CURLOPT_POSTFIELDS => $data, + CURLOPT_HTTPHEADER => [ + "Content-Type: application/json", + "Accept: application/json" + ], + CURLOPT_TIMEOUT => 30, + CURLOPT_CONNECTTIMEOUT => 10 + ]); + + $api_raw_response = curl_exec($curl); + + if (curl_errno($curl)) { + error_log("cURL Error [".curl_errno($curl)."]: " . curl_error($curl)); + curl_close($curl); + return false; + } + + curl_close($curl); + $decoded_response = json_decode($api_raw_response, true); + + if (json_last_error() !== JSON_ERROR_NONE) { + error_log("Invalid JSON response from SMS API."); + return false; + } + + error_log("SMS API response: " . print_r($decoded_response, true)); + return $decoded_response; +} +?> \ No newline at end of file diff --git a/backend/auth/captin/updateAccountBank.php b/backend/auth/captin/updateAccountBank.php new file mode 100644 index 0000000..4bede50 --- /dev/null +++ b/backend/auth/captin/updateAccountBank.php @@ -0,0 +1,53 @@ + $id]; + +// الحقول التي تحتاج تشفير +$fieldsToEncrypt = [ + "phone", "email", "gender", "birthdate", "site", + "first_name", "last_name", "accountBank", "education", + "employmentType", "maritalStatus" +]; + +// الحقول غير المشفرة +$plainFields = ["status", "bankCode", "updated_at"]; + +foreach ($_POST as $key => $value) { + $filtered = filterRequest($key); + + if ($key === "password") { + // هاش لكلمة المرور + $hashed = password_hash($filtered, PASSWORD_DEFAULT); + $columnValues[] = "`password` = :password"; + $params[':password'] = $hashed; + } elseif (in_array($key, $fieldsToEncrypt)) { + $encrypted = $encryptionHelper->encryptData($filtered); + $columnValues[] = "`$key` = :$key"; + $params[":$key"] = $encrypted; + } elseif (in_array($key, $plainFields)) { + $columnValues[] = "`$key` = :$key"; + $params[":$key"] = $filtered; + } +} + +// بناء جملة التحديث +if (empty($columnValues)) { + jsonError("No data provided to update."); + exit; +} + +$setClause = implode(", ", $columnValues); +$sql = "UPDATE `driver` SET $setClause WHERE `id` = :id"; + +$stmt = $con->prepare($sql); +$stmt->execute($params); + +if ($stmt->rowCount() > 0) { + jsonSuccess(null, "Driver data updated successfully"); +} else { + jsonError("Failed to update driver data"); +} +?> \ No newline at end of file diff --git a/backend/auth/captin/updateDriverClaim.php b/backend/auth/captin/updateDriverClaim.php new file mode 100755 index 0000000..b1c1a89 --- /dev/null +++ b/backend/auth/captin/updateDriverClaim.php @@ -0,0 +1,38 @@ +prepare($checkSql); + $checkStmt->bindParam(':driverId', $driverId, PDO::PARAM_INT); + $checkStmt->execute(); + $giftExists = $checkStmt->fetchColumn(); + + if ($giftExists > 0) { + jsonError("Gift already exists for this driver"); + exit; + } + + // Insert a new claimed gift + $sql = "INSERT INTO driver_gifts (driver_id, gift_description, is_claimed) + VALUES (:driverId, 'new account 300 le', 1)"; + $stmt = $con->prepare($sql); + $stmt->bindParam(':driverId', $driverId, PDO::PARAM_INT); + $stmt->execute(); + + if ($stmt->rowCount() > 0) { + jsonSuccess(null, "Gift data saved successfully"); + } else { + jsonError("Failed to save gift data"); + } + +} catch (PDOException $e) { + error_log("Database Error: " . $e->getMessage()); + jsonError("An error occurred while saving the data"); +} +?> \ No newline at end of file diff --git a/backend/auth/captin/updateDriverSecure.php b/backend/auth/captin/updateDriverSecure.php new file mode 100644 index 0000000..0597d86 --- /dev/null +++ b/backend/auth/captin/updateDriverSecure.php @@ -0,0 +1,56 @@ +encryptData($value); + $columnValues[] = "`$field` = ?"; + $params[] = $encryptedValue; + } +} + +// تحقق من أن هناك حقول للتحديث +if (empty($columnValues)) { + jsonError("No valid encrypted passenger data provided for update."); + exit; +} + +// تركيب جملة SQL +$setClause = implode(", ", $columnValues); +$params[] = $id; + +$sql = "UPDATE `passengers` SET $setClause WHERE `id` = ?"; + +try { + $stmt = $con->prepare($sql); + + foreach ($params as $index => $value) { + $stmt->bindValue($index + 1, $value); + } + + if ($stmt->execute()) { + jsonSuccess(null, "Passenger data updated successfully with encryption"); + } else { + jsonError("Failed to update passenger data"); + } + +} catch (PDOException $e) { + jsonError("Database error: " . $e->getMessage()); +} +?> \ No newline at end of file diff --git a/backend/auth/captin/updateShamCashDriver.php b/backend/auth/captin/updateShamCashDriver.php new file mode 100755 index 0000000..b8af407 --- /dev/null +++ b/backend/auth/captin/updateShamCashDriver.php @@ -0,0 +1,39 @@ +encryptData($accountBank); + + // 2. كود المحفظة يبقى كما هو (حسب القواعد bankCode غير مشفر) + $plainBankCode = $encryptionHelper->encryptData($bankCode); + + // 3. جملة التحديث + $stmt = $con->prepare("UPDATE `driver` SET `accountBank` = ?, `bankCode` = ? WHERE `id` = ?"); + + $stmt->execute(array($encryptedAccountBank, $plainBankCode, $id)); + + // التحقق من نجاح العملية + // rowCount > 0 يعني تم التحديث، أحياناً يعطي 0 إذا كانت البيانات هي نفسها لم تتغير + // لذا نرسل نجاح في كلتا الحالتين طالما لم يحدث Error + jsonSuccess(null, "ShamCash info updated successfully"); + + } catch (PDOException $e) { + // في حال وجود خطأ في قاعدة البيانات + jsonError("Database Error: " . $e->getMessage()); + } + +} else { + jsonError("Missing required fields: id, accountBank, or bankCode"); +} +?> \ No newline at end of file diff --git a/backend/auth/captin/verifyEmail.php b/backend/auth/captin/verifyEmail.php new file mode 100644 index 0000000..e69de29 diff --git a/backend/auth/captin/verifyOtpDriver.php b/backend/auth/captin/verifyOtpDriver.php new file mode 100755 index 0000000..0d6ba7b --- /dev/null +++ b/backend/auth/captin/verifyOtpDriver.php @@ -0,0 +1,39 @@ +encryptData($phone_number); +$encryptedToken = $encryptionHelper->encryptData($token_code); + +// Check if the phone number and token code match +$sql = "SELECT + `id`, + `phone_number`, + `token_code`, + `expiration_time`, + `is_verified`, + `created_at` +FROM + `phone_verification` +WHERE + `phone_number` = :phone_number AND `token_code` = :token_code -- AND `expiration_time` > NOW()"; +$stmt = $con->prepare($sql); +$stmt->bindParam(':phone_number', $encryptedPhone, PDO::PARAM_STR); +$stmt->bindParam(':token_code', $encryptedToken, PDO::PARAM_STR); +$stmt->execute(); +$result = $stmt->fetch(); + +if ($result) { + // $id = $result["id"]; + $sql = "UPDATE `phone_verification` SET `is_verified` = 1 WHERE `phone_number` = :phone_number"; + $stmt = $con->prepare($sql); + $stmt->bindParam(':phone_number', $phone_number, PDO::PARAM_STR); + $stmt->execute(); + + jsonSuccess($message = "Your phone number has been verified."); +} else { + jsonError($message = "Your phone number could not be verified. Please try again."); +} +?> \ No newline at end of file diff --git a/backend/auth/checkPhoneNumberISVerfiedDriver.php b/backend/auth/checkPhoneNumberISVerfiedDriver.php new file mode 100644 index 0000000..cb098c9 --- /dev/null +++ b/backend/auth/checkPhoneNumberISVerfiedDriver.php @@ -0,0 +1,21 @@ +encryptData($phoneNumber); + +// تجهيز الاستعلام باستخدام bindParam للحماية +$sql = "SELECT * FROM `phone_verification` WHERE `phone_number` = :phone_number"; +$stmt = $con->prepare($sql); +$stmt->bindParam(":phone_number", $phoneNumber); +$stmt->execute(); + +if ($stmt->rowCount() > 0) { + $rows = $stmt->fetchAll(PDO::FETCH_ASSOC); + jsonSuccess($rows); +} else { + jsonError("No phone verified yet found"); +} +?> \ No newline at end of file diff --git a/backend/auth/checkPhoneNumberISVerfiedPassenger.php b/backend/auth/checkPhoneNumberISVerfiedPassenger.php new file mode 100755 index 0000000..8e6ba47 --- /dev/null +++ b/backend/auth/checkPhoneNumberISVerfiedPassenger.php @@ -0,0 +1,39 @@ +encryptData($phoneNumber); +$email = $encryptionHelper->encryptData($email); + +// تنفيذ الاستعلام +$sql = " + SELECT + pv.*, + p.email + FROM + `phone_verification_passenger` pv + INNER JOIN + `passengers` p ON pv.phone_number = p.phone + WHERE + pv.phone_number = :phoneNumber AND p.email = :email +"; +$stmt = $con->prepare($sql); +$stmt->bindParam(':phoneNumber', $phoneNumber, PDO::PARAM_STR); +$stmt->bindParam(':email', $email, PDO::PARAM_STR); +$stmt->execute(); + +if ($stmt->rowCount() > 0) { + $rows = $stmt->fetchAll(PDO::FETCH_ASSOC); + + // يمكنك هنا لاحقًا تفكيك تشفير أي حقل إذا كنت ترجع phone/email مثلاً للمستخدم، لكن في حالتنا ما في حاجة. + + jsonSuccess($rows); +} else { + jsonError("No Phone verified or related email found"); +} +?> \ No newline at end of file diff --git a/backend/auth/cnMap.php b/backend/auth/cnMap.php new file mode 100644 index 0000000..68f4df5 --- /dev/null +++ b/backend/auth/cnMap.php @@ -0,0 +1,23 @@ + "3", + "1" => "7", + "2" => "1", + "3" => "9", + "4" => "0", + "5" => "5", + "6" => "2", + "7" => "6", + "8" => "4", + "9" => "8" +); + +// Convert the map to a JSON string with JSON_FORCE_OBJECT option +$jsonString = json_encode($cn, JSON_FORCE_OBJECT); + +// Send the JSON string to the Flutter app +echo $jsonString; +?> diff --git a/backend/auth/cn_map.json b/backend/auth/cn_map.json new file mode 100644 index 0000000..c398c06 --- /dev/null +++ b/backend/auth/cn_map.json @@ -0,0 +1 @@ +["3","7","1","9","0","5","2","6","4","8"] \ No newline at end of file diff --git a/backend/auth/document_syria/ai_document.php b/backend/auth/document_syria/ai_document.php new file mode 100755 index 0000000..f8b4715 --- /dev/null +++ b/backend/auth/document_syria/ai_document.php @@ -0,0 +1,256 @@ + 'image/jpeg', + 'png' => 'image/png', + default => 'application/octet-stream', +}; + +$prompts = [ + "id_front_sy" => << << << << << << [ + ["role" => "user", "parts" => [["text" => $prompt]]], + ["role" => "user", "parts" => [["inlineData" => ["mimeType" => $mimeType, "data" => $imageBase64]]]] + ] +]; + +$ch = curl_init($apiURL); +curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); +curl_setopt($ch, CURLOPT_POST, true); +curl_setopt($ch, CURLOPT_HTTPHEADER, $headers); +curl_setopt($ch, CURLOPT_POSTFIELDS, json_encode($payload)); + +$response = curl_exec($ch); + +if (curl_errno($ch)) { + $error_msg = curl_error($ch); + error_log("CURL error: $error_msg"); + jsonError("AI Error: $error_msg"); + curl_close($ch); + exit; +} + +curl_close($ch); +error_log("AI raw response: $response"); + +$data = json_decode($response, true); +if (json_last_error() !== JSON_ERROR_NONE) { + error_log("JSON decode error: " . json_last_error_msg()); + jsonError("Failed to parse AI response"); + exit; +} + +$textRaw = $data['candidates'][0]['content']['parts'][0]['text'] ?? ''; +$textRaw = trim(preg_replace('/```json|```/', '', $textRaw)); +$json = json_decode($textRaw, true); + +$requiredKey = match ($type) { + 'id_front_sy' => 'national_number', + 'id_back_sy' => 'gender', + 'driving_license_sy' => 'license_type', + 'vehicle_license_sy' => 'chassis', + default => null, +}; + +if (!$json || ($requiredKey && !isset($json[$requiredKey]))) { + error_log("AI response missing required key '$requiredKey': $textRaw"); + jsonError("AI failed to extract required information"); + exit; +} + +printSuccess([ + "image_url" => $imageUrl, + "data" => $json +]); \ No newline at end of file diff --git a/backend/auth/document_syria/uploadDocSyria.php b/backend/auth/document_syria/uploadDocSyria.php new file mode 100755 index 0000000..6acb2d4 --- /dev/null +++ b/backend/auth/document_syria/uploadDocSyria.php @@ -0,0 +1,97 @@ +file($file['tmp_name']) ?: 'application/octet-stream'; +$allowedMime = ['image/jpeg', 'image/png']; +if (!in_array($mime, $allowedMime, true)) { + error_log("Unsupported MIME type: $mime"); + jsonError("Unsupported image MIME type"); + exit; +} + +// (اختياري) حد أقصى للحجم 10MB +$maxBytes = 10 * 1024 * 1024; +if ($file['size'] > $maxBytes) { + error_log("Image too large: {$file['size']} bytes"); + jsonError("Image too large (max 10MB)"); + exit; +} + +// 📁 مسارات الحفظ +$uploadDir = "../uploads/documents/"; +if (!is_dir($uploadDir)) { + if (!mkdir($uploadDir, 0755, true) && !is_dir($uploadDir)) { + error_log("Failed to create upload directory: $uploadDir"); + jsonError("Server error: cannot create upload directory"); + exit; + } +} + + +$baseName = "driver_{$type}_{$driverId}"; +$uniqueName = $baseName . "." . $extension; +$uploadPath = $uploadDir . $uniqueName; + +// ⬆️ نقل الملف +if (!move_uploaded_file($file['tmp_name'], $uploadPath)) { + error_log("Failed to move uploaded file to $uploadPath"); + jsonError("Failed to move uploaded image"); + exit; +} + +// 🔒 منع التنفيذ لو رُفع PHP بالخطأ +@chmod($uploadPath, 0644); + +// 🌐 توليد BASE_URL آمن (يدعم ENV أو يعتمد على المضيف الحالي) +if (!defined('BASE_URL')) { + $APP_BASE_URL = rtrim(getenv('APP_BASE_URL') ?: '', '/'); + if ($APP_BASE_URL === '') { + $scheme = isset($_SERVER['REQUEST_SCHEME']) ? $_SERVER['REQUEST_SCHEME'] : ((isset($_SERVER['HTTPS']) && $_SERVER['HTTPS'] !== 'off') ? 'https' : 'http'); + $host = $_SERVER['HTTP_HOST'] ?? 'localhost'; + define('BASE_URL', $scheme . '://' . $host); + } else { + define('BASE_URL', $APP_BASE_URL); + } +} + +// ⚙️ مسار الرابط العام (عدّل المسار حسب نشر مشروعك) +$publicPath = "/intaleq/auth/uploads/documents/" . $uniqueName; +$imageUrl = rtrim(BASE_URL, '/') . $publicPath; + +// ✅ نتيجة نهائية: فقط رابط الصورة وبعض البيانات المفيدة +printSuccess([ + $imageUrl, + +]); \ No newline at end of file diff --git a/backend/auth/error_log b/backend/auth/error_log new file mode 100644 index 0000000..e69de29 diff --git a/backend/auth/google_auth/callback.php b/backend/auth/google_auth/callback.php new file mode 100755 index 0000000..70e7e53 --- /dev/null +++ b/backend/auth/google_auth/callback.php @@ -0,0 +1,64 @@ + $authCode, + 'client_id' => $clientID, + 'client_secret' => $clientSecret, + 'redirect_uri' => $redirectUri, + 'grant_type' => 'authorization_code' +]; + +$ch = curl_init(); +curl_setopt($ch, CURLOPT_URL, $tokenUrl); +curl_setopt($ch, CURLOPT_POST, 1); +curl_setopt($ch, CURLOPT_POSTFIELDS, http_build_query($postData)); +curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); +$response = curl_exec($ch); +curl_close($ch); +$tokenData = json_decode($response, true); + +if (isset($tokenData['access_token'])) { + // 4. جلب بيانات المستخدم + $userInfoUrl = 'https://www.googleapis.com/oauth2/v2/userinfo?access_token=' . $tokenData['access_token']; + $userInfoResponse = file_get_contents($userInfoUrl); + $userData = json_decode($userInfoResponse, true); + + if (isset($userData['id'])) { + // 5. تحديث ملف الجلسة بالبيانات الجديدة + $finalData = [ + 'status' => 'success', + 'userData' => $userData + ]; + file_put_contents($sessionFile, json_encode($finalData)); + } +} + +// 6. عرض صفحة نجاح للمستخدم في المتصفح +echo 'Success

Authentication Successful

You can now return to the Tripz app.

'; +exit(); +?> \ No newline at end of file diff --git a/backend/auth/google_auth/check_status.php b/backend/auth/google_auth/check_status.php new file mode 100755 index 0000000..26d2649 --- /dev/null +++ b/backend/auth/google_auth/check_status.php @@ -0,0 +1,38 @@ + 'error', 'message' => 'Login token is missing.']); + exit(); +} +$loginToken = basename($input['loginToken']); // حماية + +// 2. التحقق من ملف الجلسة +$pollDir = __DIR__ . '/polls'; +$sessionFile = $pollDir . '/' . $loginToken . '.json'; + +if (file_exists($sessionFile)) { + $sessionData = json_decode(file_get_contents($sessionFile), true); + + // إذا نجحت العملية، أرجع البيانات واحذف الملف + if ($sessionData['status'] === 'success') { + echo json_encode($sessionData); + unlink($sessionFile); // حذف الملف بعد النجاح + } else { + // إذا كانت لا تزال معلقة + echo json_encode(['status' => 'pending']); + } +} else { + // إذا انتهت المهلة أو حدث خطأ + http_response_code(404); + echo json_encode(['status' => 'expired', 'message' => 'Session not found or expired.']); +} +exit(); +?> diff --git a/backend/auth/google_auth/google_auth.php b/backend/auth/google_auth/google_auth.php new file mode 100755 index 0000000..4e9362b --- /dev/null +++ b/backend/auth/google_auth/google_auth.php @@ -0,0 +1,55 @@ + false, + 'error' => null, + 'data' => null, +]; + +try { + if (!isset($_POST['code'])) { + throw new Exception("Missing authorization code."); + } + + $code = $_POST['code']; + + $client = new Client(); + $client->setClientId('1086900987150-j8brn0i5s97315kh1ej9jr72grkfqgh5.apps.googleusercontent.com'); + $client->setClientSecret('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'); + $client->setRedirectUri('postmessage'); + $client->addScope('email'); + $client->addScope('profile'); + + $token = $client->fetchAccessTokenWithAuthCode($code); + + if (isset($token['error'])) { + throw new Exception("Access token error: " . $token['error']); + } + + $client->setAccessToken($token['access_token']); + + $oauth2 = new Google_Service_Oauth2($client); + $userinfo = $oauth2->userinfo->get(); + + $response['success'] = true; + $response['data'] = [ + 'id' => $userinfo->id, + 'email' => $userinfo->email, + 'name' => $userinfo->name, + 'picture' => $userinfo->picture, + ]; + +} catch (Exception $e) { + $response['error'] = $e->getMessage(); +} + +echo json_encode($response); \ No newline at end of file diff --git a/backend/auth/google_auth/login.php b/backend/auth/google_auth/login.php new file mode 100755 index 0000000..4842a1f --- /dev/null +++ b/backend/auth/google_auth/login.php @@ -0,0 +1,41 @@ + 'pending'])); + +// 5. بناء رابط جوجل مع تمرير المعرف الفريد في متغير 'state' +$authUrl = 'https://accounts.google.com/o/oauth2/v2/auth?' . http_build_query([ + 'client_id' => $clientID, + 'redirect_uri' => $redirectUri, + 'response_type' => 'code', + 'scope' => $scopes, + 'access_type' => 'offline', + 'state' => $loginToken // مهم جداً +]); + +// 6. إرجاع الرابط والمعرف للتطبيق +header('Content-Type: application/json'); +echo json_encode([ + 'authUrl' => $authUrl, + 'loginToken' => $loginToken +]); +exit(); +?> \ No newline at end of file diff --git a/backend/auth/login.php b/backend/auth/login.php new file mode 100644 index 0000000..0313d08 --- /dev/null +++ b/backend/auth/login.php @@ -0,0 +1,67 @@ +prepare($sql); +$stmt->bindParam(':email', $email); +$stmt->bindParam(':phone', $phone); +$stmt->execute(); +$data = $stmt->fetchAll(PDO::FETCH_ASSOC); +$count = $stmt->rowCount(); + +if ($count > 0) { + $stored_password = $data[0]['password']; + if (password_verify($password, $stored_password)) { + unset($data[0]['password']); + echo json_encode([ + "status" => "success", + "count" => $count, + "data" => $data + ]); + } else { + // The password is incorrect + echo json_encode([ + "status" => "Failure", + "data" => "Incorrect password." + ]); + // jsonError("Incorrect password."); + } +} else { + // The user does not exist + echo json_encode([ + "status" => "Failure", + "data" => "User does not exist." + ]); + // jsonError("User does not exist."); +} +$conn->close(); + +?> diff --git a/backend/auth/loginFromGooglePassenger.php b/backend/auth/loginFromGooglePassenger.php new file mode 100755 index 0000000..9126df8 --- /dev/null +++ b/backend/auth/loginFromGooglePassenger.php @@ -0,0 +1,104 @@ +encryptData($email); + +// تجهيز الاستعلام +$sql = "SELECT + p.`id`, + p.`phone`, + p.`email`, + p.`gender`, + p.`status`, + p.`birthdate`, + p.`site`, + p.`first_name`, + p.`last_name`, + p.`sosPhone`, + p.`education`, + p.`employmentType`, + p.`maritalStatus`, + p.`created_at`, + p.`updated_at`, + phone_verification_passenger.verified, + invitesToPassengers.isInstall, + invitesToPassengers.inviteCode, + invitesToPassengers.isGiftToken, + (SELECT `version` FROM `packageInfo` WHERE platform = :platform AND appName = :appName) AS package, + promos.promo_code AS promo, + promos.amount AS discount, + promos.validity_end_date AS validity, + t.token AS fcm_token, + t.fingerPrint AS fcm_fingerprint +FROM passengers p +LEFT JOIN phone_verification_passenger + ON phone_verification_passenger.phone_number = p.phone +LEFT JOIN invitesToPassengers + ON invitesToPassengers.inviterPassengerPhone = p.phone +LEFT JOIN promos + ON promos.passengerID = p.id +LEFT JOIN tokens t + ON t.passengerID = p.id +WHERE p.email = :email AND p.id = :id AND phone_verification_passenger.verified = '1' +LIMIT 1"; + +// تنفيذ الاستعلام +$stmt = $con->prepare($sql); +$stmt->bindParam(':email', $email); +$stmt->bindParam(':id', $id); +$stmt->bindParam(':appName', $appName); +$stmt->bindParam(':platform', $platform); +$stmt->execute(); + +$data = $stmt->fetchAll(PDO::FETCH_ASSOC); +$count = $stmt->rowCount(); + +// تجهيز الرد +header('Content-Type: application/json'); + +if ($count > 0) { + foreach ($data as &$row) { + // فك تشفير الحقول الحساسة + $row['phone'] = $encryptionHelper->decryptData($row['phone']); + $row['email'] = $encryptionHelper->decryptData($row['email']); + $row['gender'] = $encryptionHelper->decryptData($row['gender']); + $row['birthdate'] = $encryptionHelper->decryptData($row['birthdate']); + $row['site'] = $encryptionHelper->decryptData($row['site']); + $row['first_name'] = $encryptionHelper->decryptData($row['first_name']); + $row['last_name'] = $encryptionHelper->decryptData($row['last_name']); + $row['sosPhone'] = $encryptionHelper->decryptData($row['sosPhone']); + $row['education'] = $encryptionHelper->decryptData($row['education']); + $row['employmentType'] = $encryptionHelper->decryptData($row['employmentType']); + $row['maritalStatus'] = $encryptionHelper->decryptData($row['maritalStatus']); + + // فك تشفير توكن FCM إذا وجد + if (!empty($row['fcm_token'])) { + $row['fcm_token'] = $encryptionHelper->decryptData($row['fcm_token']); + } + } + + echo json_encode([ + "status" => "success", + "count" => $count, + "data" => $data + ]); +} else { + error_log("User does not exist: " . $email); + echo json_encode([ + "status" => "Failure", + "data" => "User does not exist." + ]); +} + +// تنظيف الموارد +$stmt = null; +$con = null; +exit(); \ No newline at end of file diff --git a/backend/auth/otpmessage.php b/backend/auth/otpmessage.php new file mode 100755 index 0000000..9cef175 --- /dev/null +++ b/backend/auth/otpmessage.php @@ -0,0 +1,88 @@ + $username, + 'password' => $password, + 'language' => 'e' , // Assuming 'e' is for English as per original + 'sender' => $sender, + 'receiver' => $receiver, + 'message' => $message +]; +$jsonPayload = json_encode($payload); +$response = callAPI("POST", $apiUrl, $jsonPayload); + +if ($response && isset($response->message) && $response->message == 'Success') { + // 3. تخزين في Redis بدلاً من MySQL (أسرع وأكثر أماناً مع TTL تلقائي) + if ($redis) { + try { + $redis->setex("otp:passenger:$receiver", 300, $otp); // صلاحية 5 دقائق + jsonSuccess(null, "OTP sent and saved to Redis successfully"); + } catch (Exception $e) { + error_log("Redis Error (OTP): " . $e->getMessage()); + jsonError("OTP sent but failed to save in Redis"); + } + } else { + jsonError("Redis service unavailable"); + } +} else { + jsonError("OTP not sent (SMS API failed or invalid response)"); +} + +// دالة الاتصال بالـ API +function callAPI($method, $url, $data) { + + $curl = curl_init(); + curl_setopt_array($curl, [ + CURLOPT_URL => $url, + CURLOPT_RETURNTRANSFER => true, + CURLOPT_CUSTOMREQUEST => $method, + CURLOPT_POSTFIELDS => $data, + CURLOPT_HTTPHEADER => [ + "Content-Type: application/json", + "Accept: application/json" // Often good to add + ], + CURLOPT_TIMEOUT => 30, // Set a timeout + CURLOPT_CONNECTTIMEOUT => 10 // Set a connection timeout + ]); + $api_raw_response = curl_exec($curl); + + if (curl_errno($curl)) { + $curl_error_msg = curl_error($curl); + $curl_error_no = curl_errno($curl); + error_log("cURL Error (callAPI): [{$curl_error_no}] " . $curl_error_msg); + curl_close($curl); + return false; // Indicate cURL failure clearly + } + curl_close($curl); + + $decoded_response = json_decode($api_raw_response); + if (json_last_error() !== JSON_ERROR_NONE) { + return null; // Indicate JSON decode failure + } + error_log("callAPI: Decoded response: " . print_r($decoded_response, true)); + return $decoded_response; +} +?> \ No newline at end of file diff --git a/backend/auth/packageInfo.php b/backend/auth/packageInfo.php new file mode 100644 index 0000000..18e7cce --- /dev/null +++ b/backend/auth/packageInfo.php @@ -0,0 +1,30 @@ +prepare($sql); +$stmt->execute(); +$result = $stmt->fetchAll(PDO::FETCH_ASSOC); + +if ($stmt->rowCount() > 0) { + // Print all the records + // printData($result); + jsonSuccess($data = $result); +} else { + // Print a failure message + jsonError($message = "No records found"); +} +?> \ No newline at end of file diff --git a/backend/auth/passengerOTP/error_log b/backend/auth/passengerOTP/error_log new file mode 100644 index 0000000..e69de29 diff --git a/backend/auth/passengerOTP/sendOtpPassenger.php b/backend/auth/passengerOTP/sendOtpPassenger.php new file mode 100644 index 0000000..fe74e40 --- /dev/null +++ b/backend/auth/passengerOTP/sendOtpPassenger.php @@ -0,0 +1,42 @@ +prepare($sql); +$stmt->execute(); + +$rowCount = $stmt->rowCount(); + +if ($rowCount > 0) { + // The phone number already exists, so update the data + $sql = "UPDATE `phone_verification_passenger` SET `token_code` = '$token_code', `expiration_time` = DATE_ADD(NOW(), INTERVAL 5 MINUTE) WHERE `phone_number` = '$phone_number'"; + $stmt = $con->prepare($sql); + $stmt->execute(); + + if ($stmt->rowCount() > 0) { + // The update was successful + jsonSuccess($message = "Phone verification data updated successfully"); + } else { + // The update was unsuccessful + jsonError($message = "Failed to update phone verification data"); + } +} else { + // The phone number does not exist, so insert the data + $sql = "INSERT INTO `phone_verification_passenger` (`phone_number`, `token_code`, `expiration_time`, `is_verified`, `created_at`) VALUES ('$phone_number', '$token_code', DATE_ADD(NOW(), INTERVAL 5 MINUTE), 0, NOW())"; + $stmt = $con->prepare($sql); + $stmt->execute(); + + if ($stmt->rowCount() > 0) { + // The insertion was successful + jsonSuccess($message = "Phone verification data saved successfully"); + } else { + // The insertion was unsuccessful + jsonError($message = "Failed to save phone verification data"); + } +} +?> \ No newline at end of file diff --git a/backend/auth/passengerOTP/verifyOtpPassenger.php b/backend/auth/passengerOTP/verifyOtpPassenger.php new file mode 100644 index 0000000..12d953b --- /dev/null +++ b/backend/auth/passengerOTP/verifyOtpPassenger.php @@ -0,0 +1,28 @@ +encryptData(filterRequest("phone_number")); +$token_code = $encryptionHelper->encryptData(filterRequest("token")); + +// error_log("phone=$phone_number, token=$token_code"); + +// Check if the phone number and token code match +$sql = "SELECT * FROM `phone_verification_passenger` WHERE `phone_number` = '$phone_number' AND `token` = '$token_code' +AND `verified` = 0 "; +// error_log("sql is =$sql"); + +$stmt = $con->prepare($sql); +$stmt->execute(); +$result = $stmt->fetch(); + +if ($result) { + // $id = $result["id"]; + $sql = "UPDATE `phone_verification_passenger` SET `verified` = 1 WHERE `phone_number` = '$phone_number'"; + $stmt = $con->prepare($sql); + $stmt->execute(); + + jsonSuccess($message = "Your phone number has been verified."); +} else { + jsonError($message = "Your phone number could not be verified. Please try again."); +} +?> \ No newline at end of file diff --git a/backend/auth/passengerRemovedAccountEmail.php b/backend/auth/passengerRemovedAccountEmail.php new file mode 100644 index 0000000..e3e5b14 --- /dev/null +++ b/backend/auth/passengerRemovedAccountEmail.php @@ -0,0 +1,30 @@ + \ No newline at end of file diff --git a/backend/auth/resetPassword.php b/backend/auth/resetPassword.php new file mode 100644 index 0000000..e69de29 diff --git a/backend/auth/sendEmail.php b/backend/auth/sendEmail.php new file mode 100755 index 0000000..e18e13f --- /dev/null +++ b/backend/auth/sendEmail.php @@ -0,0 +1,34 @@ + + +Verify your email address + + +

Hi [$email],

+ +

We recently received a request to verify your email address for your account on SEFER App.

+ +

To verify your email address, please write this to app .

+$token + +

If you did not request to verify your email address, please ignore this email.

+ +

Thank you,

+SEFER Team. + + +"; + +mail($email, $subject, $bodyEmail, $headers); \ No newline at end of file diff --git a/backend/auth/sendVerifyEmail.php b/backend/auth/sendVerifyEmail.php new file mode 100644 index 0000000..d37aae3 --- /dev/null +++ b/backend/auth/sendVerifyEmail.php @@ -0,0 +1,72 @@ +prepare($sql); +$stmt->execute(); + +$rowCount = $stmt->rowCount(); + +$admin='support@mobile-app.store'; +$headers = "MIME-Version: 1.0" . "\r\n"; +$headers .= "Content-type: text/html; charset=UTF-8" . "\r\n"; +$headers .= "From: $admin" . "\r\n"; + +$subject = "Verify your email address"; +$bodyEmail = " + + +Verify your email address + + +

Hi [$email],

+ +

We recently received a request to verify your email address for your account on SEFER App.

+ +

To verify your email address, please write this to app .

+$token + +

If you did not request to verify your email address, please ignore this email.

+ +

Thank you,

+SEFER Team. + + +"; + + + +if ($rowCount > 0) { + // The email already exists, so update the data + $sql = "UPDATE `email_verifications` SET `token` = '$token' WHERE `email` = '$email'"; + $stmt = $con->prepare($sql); + $stmt->execute(); + + if ($stmt->rowCount() > 0) { + // The update was successful + jsonSuccess($message = "Email verification data updated successfully"); + mail($email, $subject, $bodyEmail, $headers); + } else { + // The update was unsuccessful + jsonError($message = "Failed to update email verification data"); + } +} else { + // The email does not exist, so insert the data + $sql = "INSERT INTO `email_verifications` (`email`, `token`) VALUES ('$email', '$token')"; + $stmt = $con->prepare($sql); + $stmt->execute(); + + if ($stmt->rowCount() > 0) { + // The insertion was successful + jsonSuccess($message = "Email verification data saved successfully"); + mail($email, $subject, $bodyEmail, $headers); + } else { + // The insertion was unsuccessful + jsonError($message = "Failed to save email verification data"); + } +} +?> + diff --git a/backend/auth/signup.php b/backend/auth/signup.php new file mode 100644 index 0000000..f4bffdc --- /dev/null +++ b/backend/auth/signup.php @@ -0,0 +1,70 @@ +encryptData($phone); +$email = $encryptionHelper->encryptData($email); +$gender = $encryptionHelper->encryptData($gender); +$birthdate = $encryptionHelper->encryptData($birthdate); +$site = $encryptionHelper->encryptData($site); +$first_name = $encryptionHelper->encryptData($first_name); +$last_name = $encryptionHelper->encryptData($last_name); + +// تشفير الباسورد +$hashedPassword = password_hash($password, PASSWORD_DEFAULT); + +try { + // التحقق من وجود الإيميل أو رقم الهاتف مسبقًا + $sql = "SELECT * FROM passengers WHERE phone = :phone OR email = :email"; + $stmt = $con->prepare($sql); + $stmt->bindParam(":phone", $phone); + $stmt->bindParam(":email", $email); + $stmt->execute(); + $results = $stmt->fetchAll(); + + if (count($results) > 0) { + jsonError("The email or phone number is already registered."); + exit; + } + + // إدخال البيانات الجديدة + $sql = "INSERT INTO passengers ( + id, phone, email, password, gender, birthdate, site, first_name, last_name + ) VALUES ( + :id, :phone, :email, :password, :gender, :birthdate, :site, :first_name, :last_name + )"; + $stmt = $con->prepare($sql); + $stmt->bindParam(":id", $id); + $stmt->bindParam(":phone", $phone); + $stmt->bindParam(":email", $email); + $stmt->bindParam(":password", $hashedPassword); + $stmt->bindParam(":gender", $gender); + $stmt->bindParam(":birthdate", $birthdate); + $stmt->bindParam(":site", $site); + $stmt->bindParam(":first_name", $first_name); + $stmt->bindParam(":last_name", $last_name); + $stmt->execute(); + + if ($stmt->rowCount() > 0) { + jsonSuccess(null, "success to save passenger data"); + } else { + jsonError("Failed to save passenger data"); + } + +} catch (PDOException $e) { + error_log("Database Error: " . $e->getMessage()); + jsonError("An error occurred while saving the data."); +} +?> \ No newline at end of file diff --git a/backend/auth/sms/error_log b/backend/auth/sms/error_log new file mode 100644 index 0000000..e69de29 diff --git a/backend/auth/sms/getSender.php b/backend/auth/sms/getSender.php new file mode 100644 index 0000000..70b0817 --- /dev/null +++ b/backend/auth/sms/getSender.php @@ -0,0 +1,28 @@ +prepare($sql); +$stmt->execute(); +$result = $stmt->fetchAll(PDO::FETCH_ASSOC); + +if ($stmt->rowCount() > 0) { + + jsonSuccess($data = $result); +} else { + + + jsonError($message = "No driver order data found"); +} + +?> \ No newline at end of file diff --git a/backend/auth/sms/sms_to_user_change_fingerprint.php b/backend/auth/sms/sms_to_user_change_fingerprint.php new file mode 100644 index 0000000..b6b9504 --- /dev/null +++ b/backend/auth/sms/sms_to_user_change_fingerprint.php @@ -0,0 +1,68 @@ +encryptData($phone); +$otpEncrypted = $encryptionHelper->encryptData($otp); + +// 4️⃣ تخزين OTP في قاعدة البيانات +try { + $insertOtp = "INSERT INTO otp_verification_fingerPrint (phone, otp) VALUES (?, ?)"; + $stmt = $con->prepare($insertOtp); + $stmt->execute([$phoneEncrypted, $otpEncrypted]); +} catch (PDOException $e) { + error_log("DB Insert Error: " . $e->getMessage()); + jsonError("Failed to save OTP to the database"); + exit; +} + +// 5️⃣ إرسال الرسالة عبر API +$message = "$appName app code is $otp\ncopy it to app"; + +$payload = json_encode([ + "username" => $username, + "password" => $password, + "message" => $message, + "language" => $language, + "sender" => $sender, + "receiver" => $phone +]); + +$ch = curl_init($apiEndpoint); +curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); +curl_setopt($ch, CURLOPT_HTTPHEADER, ['Content-Type: application/json']); +curl_setopt($ch, CURLOPT_POST, true); +curl_setopt($ch, CURLOPT_POSTFIELDS, $payload); +$response = curl_exec($ch); +$httpCode = curl_getinfo($ch, CURLINFO_HTTP_CODE); +curl_close($ch); + +// 6️⃣ التحقق من نجاح الإرسال +if ($httpCode != 200) { + error_log("SMS API Failed. HTTP Code: $httpCode. Response: " . $response); + jsonError("Failed to send OTP SMS"); + exit; +} + +// 7️⃣ إرجاع النتيجة +jsonSuccess(["message" => "OTP sent successfully"]); +?> \ No newline at end of file diff --git a/backend/auth/sms/updatePhoneInvalidSMS.php b/backend/auth/sms/updatePhoneInvalidSMS.php new file mode 100644 index 0000000..f4c3272 --- /dev/null +++ b/backend/auth/sms/updatePhoneInvalidSMS.php @@ -0,0 +1,27 @@ +encryptData($phone_number); + +// Prepare the SQL query to verify the phone +$sql = "UPDATE phone_verification SET is_verified = 1 WHERE phone_number = :phone_number"; + +// Prepare the statement +$stmt = $con->prepare($sql); +$stmt->bindParam(":phone_number", $phone_number); + +// Execute the query +$stmt->execute(); +$affectedRows = $stmt->rowCount(); + +// Check if the update was successful +if ($affectedRows > 0) { + jsonSuccess(["message" => "Phone number verified successfully"]); +} else { + jsonError("No phone number found or verification failed"); +} +?> \ No newline at end of file diff --git a/backend/auth/sms/updatePhoneInvalidSMSPassenger.php b/backend/auth/sms/updatePhoneInvalidSMSPassenger.php new file mode 100644 index 0000000..a0c9aba --- /dev/null +++ b/backend/auth/sms/updatePhoneInvalidSMSPassenger.php @@ -0,0 +1,23 @@ +encryptData($phone_number); + +// تنفيذ الاستعلام +$sql = "UPDATE phone_verification_passenger SET verified = 1 WHERE phone_number = :phone_number"; +$stmt = $con->prepare($sql); +$stmt->bindParam(":phone_number", $phone_number); +$stmt->execute(); + +$affectedRows = $stmt->rowCount(); + +// إرجاع النتيجة +if ($affectedRows > 0) { + jsonSuccess(["message" => "Phone number verified successfully"]); +} else { + jsonError("No phone number found or verification failed"); +} +?> \ No newline at end of file diff --git a/backend/auth/sms_new_backend/error_log b/backend/auth/sms_new_backend/error_log new file mode 100644 index 0000000..e69de29 diff --git a/backend/auth/sms_new_backend/rasel_whatsapp.php b/backend/auth/sms_new_backend/rasel_whatsapp.php new file mode 100755 index 0000000..fff7c2e --- /dev/null +++ b/backend/auth/sms_new_backend/rasel_whatsapp.php @@ -0,0 +1,134 @@ + $receiver, // رقم المستلم + "type" => "text", + "message" => $messageBody, + "instance_id" => "6863C59A7AFBD", // المعرف المأخوذ من مثال cURL + "access_token"=> "68617b9b8fe53" // مفتاح الوصول المأخوذ من مثال cURL +]; + +error_log("Sending OTP to $receiver via RaseelPlus. Message: $messageBody"); + +// استدعاء الـ API +$response = callAPI("POST", $apiUrl, json_encode($payload)); + +error_log("RaseelPlus API Response: " . print_r($response, true)); + +// --- نهاية التعديل --- + + +// التحقق من الاستجابة من الـ API +// ملاحظة: قد تحتاج إلى تعديل هذا الشرط بناءً على شكل الاستجابة الفعلي من RaseelPlus +// نفترض هنا أن الاستجابة الناجحة تحتوي على "status":"success" أو شيء مشابه +if ($response && !isset($response->error) && (isset($response->status) && $response->status == 'success' || isset($response->message))) { + + // تحديد وقت انتهاء صلاحية الرمز (بعد 5 دقائق) + $expiration_time = date('Y-m-d H:i:s', strtotime('+5 minutes')); + $created_at = date('Y-m-d H:i:s'); + + error_log("API call successful. Saving to DB: phone=$receiver, token=$otp, expires=$expiration_time"); + + try { + // تشفير البيانات قبل حفظها (ممارسة أمنية جيدة) + // $receiver_encrypted = $encryptionHelper->encryptData($receiver); + // $otp_encrypted = $encryptionHelper->encryptData($otp); + + // استخدام البيانات غير المشفرة مؤقتاً إذا لم تكن تستخدم التشفير حالياً + $receiver_to_db = $receiver; + $otp_to_db = $otp; + + $stmt = $con->prepare(" + INSERT INTO phone_verification_passenger + (phone_number, token, expiration_time, verified, created_at) + VALUES (?, ?, ?, 0, ?) + "); + $success = $stmt->execute([$receiver_to_db, $otp_to_db, $expiration_time, $created_at]); + + if ($success) { + error_log("OTP saved successfully to DB."); + // jsonSuccess() هي دالة مخصصة لديك لطباعة استجابة نجاح + jsonSuccess(null, 'OTP sent and saved successfully'); + } else { + error_log("SQL execution failed."); + // jsonError() هي دالة مخصصة لديك لطباعة استجابة فشل + jsonError('OTP sent but failed to save to database'); + } + + } catch (PDOException $e) { + error_log("Database Error: " . $e->getMessage()); + jsonError('Database error occurred'); + } + +} else { + // فشل إرسال الـ OTP + $errorMessage = isset($response->message) ? $response->message : "Unknown error"; + error_log("Failed to send OTP. API response: " . $errorMessage); + jsonError('Failed to send OTP: ' . $errorMessage); +} + +/** + * دالة لإجراء استدعاءات API باستخدام cURL + * @param string $method نوع الطلب (e.g., "POST", "GET") + * @param string $url عنوان URL للـ API + * @param mixed $data البيانات المراد إرسالها + * @return mixed الاستجابة من الـ API بعد فك تشفير JSON + */ +function callAPI($method, $url, $data) +{ + $curl = curl_init(); + + curl_setopt_array($curl, [ + CURLOPT_URL => $url, + CURLOPT_RETURNTRANSFER => true, // إرجاع الاستجابة كنص بدلاً من طباعتها + CURLOPT_ENCODING => "", + CURLOPT_MAXREDIRS => 10, + CURLOPT_TIMEOUT => 30, // مهلة زمنية للطلب + CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1, + CURLOPT_CUSTOMREQUEST => $method, + CURLOPT_POSTFIELDS => $data, + CURLOPT_HTTPHEADER => [ + "Content-Type: application/json", + "Accept: application/json" + ], + ]); + + $response = curl_exec($curl); + $err = curl_error($curl); + + curl_close($curl); + + if ($err) { + error_log("cURL Error #: " . $err); + return null; // إرجاع null في حالة وجود خطأ في cURL + } else { + return json_decode($response); // فك تشفير استجابة JSON + } +} + +// مثال على دالة طباعة النجاح (ضعها في ملف functions.php) + + +?> diff --git a/backend/auth/sms_new_backend/sendOtpPassenger.php b/backend/auth/sms_new_backend/sendOtpPassenger.php new file mode 100644 index 0000000..14af08a --- /dev/null +++ b/backend/auth/sms_new_backend/sendOtpPassenger.php @@ -0,0 +1,107 @@ +encryptData($text); + +$username = getenv('SMS_USERNAME'); +$password = getenv('SMS_PASSWORD_EGYPT'); +$sender = getenv('SMS_SENDER'); + +$language = filterRequest("language"); +$receiver = filterRequest("receiver"); + +// Rate Limiting للحماية من هجمات استنزاف الرسائل +if (isset($redis) && !empty($receiver)) { + $redisKey = "otp_limit:passenger:$receiver"; + if ($redis->exists($redisKey)) { + jsonError("Please wait before requesting a new OTP."); + exit; + } + $redis->setex($redisKey, 60, "1"); // حظر لمدة 60 ثانية +} + +$otp = rand(10000, 99999); +$message0 = "Tripz app code is " . $otp; + +$apiUrl = 'https://sms.kazumi.me/api/sms/send-sms'; + +$payload = [ + 'username' => $username, + 'password' => $password, + 'language' => $language, + 'sender' => $sender, + 'receiver' => $receiver, + 'message' => $message0 +]; + +error_log("Sending SMS to $receiver with OTP: $otp"); + +$response = callAPI("POST", $apiUrl, json_encode($payload)); + +error_log("API Response: " . print_r($response, true)); + +// التحقق من رسالة الاستجابة +if ($response && isset($response->message) && $response->message == "Success") { + $expiration_time = date('Y-m-d H:i:s', strtotime('+5 minutes')); + $created_at = date('Y-m-d H:i:s'); + + error_log("Saving to DB: phone=$receiver, token=$otp, expires=$expiration_time"); + + try { + $receiver1=$encryptionHelper->encryptData($receiver); + $otp1=$encryptionHelper->encryptData($otp); + + $stmt = $con->prepare(" + INSERT INTO phone_verification_passenger + (phone_number, token, expiration_time, verified, created_at) + VALUES (?, ?, ?, 0, ?) + "); + $success = $stmt->execute([$receiver1, $otp1, $expiration_time, $created_at]); + + if ($success) { + error_log("OTP saved successfully to DB."); + jsonSuccess(null, 'OTP sent and saved successfully'); + } else { + error_log("SQL execution failed."); + jsonError('OTP sent but not saved to database'); + } + + } catch (PDOException $e) { + error_log("Database Error: " . $e->getMessage()); + jsonError('Database error'); + } + +} else { + error_log("OTP not sent. API response did not indicate success. Response: " . print_r($response, true)); + jsonError('OTP not sent'); +} + +// دالة التعامل مع API +function callAPI($method, $url, $data) +{ + $curl = curl_init(); + + curl_setopt_array($curl, [ + CURLOPT_URL => $url, + CURLOPT_RETURNTRANSFER => true, + CURLOPT_CUSTOMREQUEST => $method, + CURLOPT_POSTFIELDS => $data, + CURLOPT_HTTPHEADER => ["Content-Type: application/json"] + ]); + + $response = curl_exec($curl); + + if (curl_errno($curl)) { + error_log("cURL Error: " . curl_error($curl)); + } + + curl_close($curl); + + return json_decode($response); +} + +?> \ No newline at end of file diff --git a/backend/auth/syria/auth_proxy.php b/backend/auth/syria/auth_proxy.php new file mode 100755 index 0000000..beb4ac0 --- /dev/null +++ b/backend/auth/syria/auth_proxy.php @@ -0,0 +1,75 @@ +setClientId($clientID); +$client->setClientSecret($clientSecret); +$client->setRedirectUri($redirectUri); +$client->addScope("email"); +$client->addScope("profile"); + +// 4. LOGIC: Handle the authentication flow +if (isset($_GET['code'])) { + // A. User has been redirected back from Google with an authorization code. + try { + // Exchange the authorization code for an access token. + $token = $client->fetchAccessTokenWithAuthCode($_GET['code']); + + if (isset($token['error'])) { + // Handle error from Google + throw new Exception('Error fetching access token: ' . $token['error_description']); + } + + $client->setAccessToken($token['access_token']); + + // Get user profile information from Google. + $google_oauth = new Google_Service_Oauth2($client); + $google_account_info = $google_oauth->userinfo->get(); + + $id = $google_account_info->id; + $email = $google_account_info->email; + $name = $google_account_info->name; + $picture = $google_account_info->picture; + + // B. Redirect back to the Flutter app with the user data in the URL. + // We use urlencode to ensure data is passed correctly. + $redirectUrl = $appRedirectScheme . + '?status=success' . + '&id=' . urlencode($id) . + '&email=' . urlencode($email) . + '&name=' . urlencode($name) . + '&picture=' . urlencode($picture); + + header('Location: ' . $redirectUrl); + exit(); + + } catch (Exception $e) { + // C. Handle any errors and redirect back to the app with an error status. + $error_message = urlencode($e->getMessage()); + header('Location: ' . $appRedirectScheme . '?status=error&message=' . $error_message); + exit(); + } +} else { + // D. This is the initial request from the Flutter app. + // Redirect the user to Google's OAuth 2.0 server for authentication. + $authUrl = $client->createAuthUrl(); + header('Location: ' . $authUrl); + exit(); +} +?> diff --git a/backend/auth/syria/delete_old_images.php b/backend/auth/syria/delete_old_images.php new file mode 100755 index 0000000..ebca543 --- /dev/null +++ b/backend/auth/syria/delete_old_images.php @@ -0,0 +1,85 @@ +isFile()) continue; + $checked++; + + $path = $node->getPathname(); + $ext = strtolower($node->getExtension()); + + // فلترة الامتدادات + if (!in_array($ext, ALLOWED_EXTS, true)) continue; + + // فلترة اسم الملف (حماية من حذف ملفات أخرى) + $name = $node->getBasename(); + if (!preg_match('/^[A-Za-z0-9_-]+__(' . $docTypesRegex . ')\.(jpg|png|webp)$/i', $name)) { + continue; + } + + $age = $now - $node->getMTime(); + if ($age >= $ttlSeconds) { + if (@unlink($path)) { + $deleted++; + $logln("🗑 Deleted: {$path} | age=" . round($age/3600, 1) . "h"); + } else { + $logln("⚠️ Failed to delete: {$path}"); + } + } +} + +$logln("Done. checked={$checked}, deleted={$deleted}"); +if ($log) @fclose($log); \ No newline at end of file diff --git a/backend/auth/syria/driver/driver_details.php b/backend/auth/syria/driver/driver_details.php new file mode 100755 index 0000000..d68f49b --- /dev/null +++ b/backend/auth/syria/driver/driver_details.php @@ -0,0 +1,49 @@ +prepare($sql); + $stmt->execute([':id' => $driverId]); + $driver = $stmt->fetch(PDO::FETCH_ASSOC); + + if (!$driver) { + jsonError("Driver not found."); + exit; + } + + // فك التشفير للحقول الحساسة + foreach ($driver as $k => $v) { + if (in_array($k, ['phone', + 'email', + 'first_name', + 'last_name', + 'national_number', + 'address','gender','site', + 'birthdate', + 'name_arabic'])) { + $driver[$k] = $encryptionHelper->decryptData($v); + } + } + + // الوثائق + $sql2 = "SELECT doc_type, image_name, link FROM driver_documents WHERE driverID = :id"; + $stmt2 = $con->prepare($sql2); + $stmt2->execute([':id' => $driverId]); + $docs = $stmt2->fetchAll(PDO::FETCH_ASSOC); + + printSuccess([ + "driver" => $driver, + "documents" => $docs + ]); +} catch (PDOException $e) { + jsonError("Error: " . $e->getMessage()); +} \ No newline at end of file diff --git a/backend/auth/syria/driver/drivers_pending_list.php b/backend/auth/syria/driver/drivers_pending_list.php new file mode 100755 index 0000000..5ef5f56 --- /dev/null +++ b/backend/auth/syria/driver/drivers_pending_list.php @@ -0,0 +1,25 @@ + 'active' ORDER BY id DESC LIMIT :limit OFFSET :offset"; + $stmt = $con->prepare($sql); + $stmt->bindValue(':limit', $limit, PDO::PARAM_INT); + $stmt->bindValue(':offset', $offset, PDO::PARAM_INT); + $stmt->execute(); + $rows = $stmt->fetchAll(PDO::FETCH_ASSOC); + + // فك التشفير + foreach ($rows as &$r) { + $r['phone'] = $encryptionHelper->decryptData($r['phone']); + $r['first_name'] = $encryptionHelper->decryptData($r['first_name']); + $r['last_name'] = $encryptionHelper->decryptData($r['last_name']); + } + + jsonSuccess($rows); // يرجع كـ message: [...] +} catch (PDOException $e) { + jsonError("Error: " . $e->getMessage()); +} \ No newline at end of file diff --git a/backend/auth/syria/driver/isPhoneVerified.php b/backend/auth/syria/driver/isPhoneVerified.php new file mode 100755 index 0000000..5f94a3d --- /dev/null +++ b/backend/auth/syria/driver/isPhoneVerified.php @@ -0,0 +1,26 @@ +encryptData($phoneNumber); + +try { + // الاستعلام عن السائق حسب رقم الهاتف وحالة التحقق + $stmt = $con->prepare(" + SELECT * FROM phone_verification + WHERE phone_number = ? AND is_verified = 1 + "); + $stmt->execute([$phoneNumber_encrypted]); + $driver = $stmt->fetch(PDO::FETCH_ASSOC); + + if ($driver) { + jsonSuccess(null, "Phone number is verified."); + } else { + jsonError("Phone number is not verified or does not exist."); + } + +} catch (PDOException $e) { + jsonError("Database error: " . $e->getMessage()); +} \ No newline at end of file diff --git a/backend/auth/syria/driver/register_driver_and_car.php b/backend/auth/syria/driver/register_driver_and_car.php new file mode 100755 index 0000000..ccdc85d --- /dev/null +++ b/backend/auth/syria/driver/register_driver_and_car.php @@ -0,0 +1,391 @@ + 3) { + if (strpos($phone, '9639') !== 0) { + $phone = '9639' . substr($phone, 3); + } + } + + $data['phone'] = $phone; + } + /* ================== 🔴 END PHONE FORMATTING LOGIC 🔴 ================== */ + + + // تجهيز تاريخ الميلاد قبل التشفير + if (!empty($data['birthdate'])) { + $data['birthdate'] = trim($data['birthdate']); + $data['birthdate'] = $data['birthdate'] . '-01-01'; + } else { + $data['birthdate'] = '1970-01-01'; + } + + // Read car fields + $car = []; + foreach ($carRequired as $f) { + $v = filterRequest($f); + if ($v === null || $v === '') { + jsonError("Missing required field: $f"); + exit; + } + $car[$f] = $v; + } + + // Read document links + $docUrls = []; + foreach ($docKeys as $k) { + $u = filterRequest($k); + if ($u === null || $u === '') { + jsonError("Missing document URL: $k"); + exit; + } + if (!filter_var($u, FILTER_VALIDATE_URL)) { + jsonError("Invalid document URL: $k"); + exit; + } + $docUrls[$k] = $u; + } + + /* ================== 2) Generate default id/email ================== */ + if (empty($data['id'])) { + $data['id'] = 'DRV' . date('YmdHis') . random_int(1000, 9999); + } + if ($data['email'] === null) { + $data['email'] = $data['phone'] . '@intaleqapp.com'; + } + + /* ================== 3) Encrypt sensitive fields ================== */ + $toEncryptDriver = [ + "phone","email","first_name","last_name","name_arabic","gender", + "national_number","address","site","fullNameMaritial","birthdate" + ]; + + foreach ($toEncryptDriver as $f) { + if (!empty($data[$f])) { + $data[$f] = $encryptionHelper->encryptData($data[$f]); + } + } + + // Encrypt car sensitive data + $car['vin'] = $encryptionHelper->encryptData($car['vin']); + $car['car_plate'] = $encryptionHelper->encryptData($car['car_plate']); + $car['owner'] = $encryptionHelper->encryptData($car['owner']); + + /* ================== 4) Hash password (HMAC + password_hash) ================== */ + +// نقرأ الـ HMAC key من env +$pepper = getenv('SECRET_KEY_HMAC'); + +// نبني baseString من أكثر من بارامتر +// هنا نستخدم id + phone (بعد ما طبّقنا منطق تنسيق الهاتف) +$baseParts = [ + $data['id'], + $data['phone'], +]; + +// نضيف رقم وطني أو سنة الميلاد إن توفروا (كما في الـ migration) +if (!empty($data['national_number'])) { + $baseParts[] = $data['national_number']; +} elseif (!empty($data['birthdate'])) { + // birthdate حالياً أصبح بصيغة YYYY-01-01 + $year = substr($data['birthdate'], 0, 4); + if (preg_match('/^\d{4}$/', $year)) { + $baseParts[] = $year; + } +} + +$baseString = implode('|', $baseParts); + +// نشتق السر الخام باستخدام HMAC-SHA256 مع SECRET_KEY_HMAC +$rawSecret = hash_hmac('sha256', $baseString, $pepper, true); + +// نخزّن فقط الهاش الناتج من password_hash في قاعدة البيانات +$pwdHashed = password_hash($rawSecret, PASSWORD_DEFAULT); + + /* ================== 5) Start transaction ================== */ + $con->beginTransaction(); + + /* ================== 6) Check duplicate ================== */ + $dup = $con->prepare("SELECT id FROM driver WHERE phone = :p OR email = :e"); + $dup->execute([':p' => $data['phone'], ':e' => $data['email']]); + if ($dup->rowCount() > 0) { + $con->rollBack(); + jsonError("Phone or email already registered."); + exit; + } + + /* ================== 7) Insert Driver ================== */ + $sqlDriver = " + INSERT INTO driver ( + id, phone, email, password, gender, license_type, national_number, + name_arabic, issue_date, expiry_date, license_categories, + address, licenseIssueDate, status, birthdate, site, + first_name, last_name, accountBank, bankCode, + employmentType, maritalStatus, fullNameMaritial, expirationDate, + created_at, updated_at + ) VALUES ( + :id, :phone, :email, :pwd, :gender, :license_type, :national_number, + :name_arabic, :issue_date, :expiry_date, :license_categories, + :address, :licenseIssueDate, :status, :birthdate, :site, + :first_name, :last_name, :accountBank, :bankCode, + :employmentType, :maritalStatus, :fullNameMaritial, :expirationDate, + NOW(), NOW() + ) + "; + $insD = $con->prepare($sqlDriver); + $okD = $insD->execute([ + ':id' => $data['id'], + ':phone' => $data['phone'], + ':email' => $data['email'], + ':pwd' => $pwdHashed, + ':gender' => !empty($data['gender']) ? $data['gender'] : 'Male', + ':license_type' => !empty($data['license_type']) ? $data['license_type'] : 'yet', + ':national_number' => $data['national_number'], + ':name_arabic' => $data['name_arabic'], + ':issue_date' => !empty($data['issue_date']) ? $data['issue_date'] : '2020-01-01', + ':expiry_date' => !empty($data['expiry_date']) ? $data['expiry_date'] : 'yet', + ':license_categories' => !empty($data['license_categories']) ? $data['license_categories'] : 'B', + ':address' => $data['address'], + ':licenseIssueDate' => !empty($data['licenseIssueDate']) ? $data['licenseIssueDate'] : '2020-01-01', + ':status' => !empty($data['status']) ? $data['status'] : 'yet', + ':birthdate' => $data['birthdate'], + ':site' => !empty($data['site']) ? $data['site'] : 'demascus', + ':first_name' => $data['first_name'], + ':last_name' => $data['last_name'], + ':accountBank' => 'yet', + ':bankCode' => 'yet', + ':employmentType' => !empty($data['employmentType']) ? $data['employmentType'] : 'yet', + ':maritalStatus' => !empty($data['maritalStatus']) ? $data['maritalStatus'] : 'yet', + ':fullNameMaritial' => !empty($data['fullNameMaritial']) ? $data['fullNameMaritial'] : 'yet', + ':expirationDate' => !empty($data['expirationDate']) ? $data['expirationDate'] : 'yet', + ]); + if (!$okD) { + $con->rollBack(); + jsonError("Failed to insert driver."); + exit; + } + + $driverID = $data['id']; + + /* ================== 8) Insert Vehicle ================== */ + // ✅ استقبال القيم الجديدة (التصنيف والوقود) مع تعيين افتراضي 1 + $vCatID = filterRequest("vehicle_category_id"); + $vCatID = ($vCatID !== null && $vCatID !== '') ? $vCatID : 1; // 1 = Car + + $fTypeID = filterRequest("fuel_type_id"); + $fTypeID = ($fTypeID !== null && $fTypeID !== '') ? $fTypeID : 1; // 1 = Petrol + + $hasCar = $con->prepare("SELECT 1 FROM CarRegistration WHERE driverID = :d LIMIT 1"); + $hasCar->execute([':d' => $driverID]); + $isDefault = $hasCar->rowCount() === 0 ? 1 : 0; + + $sqlCar = " + INSERT INTO CarRegistration ( + driverID, vin, car_plate, make, model, year, expiration_date, + color, owner, color_hex, fuel, + vehicle_category_id, fuel_type_id, + isDefault, created_at, status + ) VALUES ( + :driverID, :vin, :car_plate, :make, :model, :year, :expiration_date, + :color, :owner, :color_hex, :fuel, + :vehicle_category_id, :fuel_type_id, + :isDefault, NOW(), 'yet' + ) + "; + $insC = $con->prepare($sqlCar); + $okC = $insC->execute([ + ':driverID' => $driverID, + ':vin' => $car['vin'], + ':car_plate' => $car['car_plate'], + ':make' => $car['make'], + ':model' => $car['model'], + ':year' => $car['year'], + ':expiration_date' => $car['expiration_date'], + ':color' => $car['color'], + ':owner' => $car['owner'], + ':color_hex' => $car['color_hex'], + ':fuel' => $car['fuel'], // النص القديم (للتوافق) + ':vehicle_category_id' => $vCatID, // ✅ العمود الجديد + ':fuel_type_id' => $fTypeID, // ✅ العمود الجديد + ':isDefault' => $isDefault, + ]); + if (!$okC) { + $con->rollBack(); + jsonError("Failed to insert car registration."); + exit; + } + + $carRegID = $con->lastInsertId(); + + /* ================== 9) Store document links ================== */ + $insDoc = $con->prepare(" + INSERT INTO driver_documents (driverID, doc_type, image_name, link, upload_date) + VALUES (:driverID, :doc_type, :image_name, :link, NOW()) + "); + + foreach ($docKeys as $k) { + $url = $docUrls[$k]; + $name = basename(parse_url($url, PHP_URL_PATH) ?? ''); + if ($name === '') { $name = $k . '_' . time() . '.jpg'; } + + $insDoc->execute([ + ':driverID' => $driverID, + ':doc_type' => $k, + ':image_name' => $name, + ':link' => $url, + ]); + } + + /* ================== 10) Commit ================== */ + $con->commit(); + + /* ================== 11) Notification ================== */ + try { + $fcmSendUrl = 'https://api.intaleq.xyz/intaleq/ride/firebase/send_fcm.php'; + + $driverFullName = $raw_first_name . ' ' . $raw_last_name; + $notificationTitle = 'تسجيل سائق جديد'; + $notificationBody = "سائق جديد ($driverFullName) سجل برقم ID: $driverID وهو بانتظار المراجعة والتفعيل."; + + $notificationPayload = json_encode([ + 'target' => 'service', + 'title' => $notificationTitle, + 'body' => $notificationBody, + 'isTopic' => true, + 'category' => 'new_driver_registration' + ]); + + $ch = curl_init(); + curl_setopt($ch, CURLOPT_URL, $fcmSendUrl); + curl_setopt($ch, CURLOPT_POST, true); + curl_setopt($ch, CURLOPT_HTTPHEADER, ['Content-Type: application/json; charset=UTF-8']); + curl_setopt($ch, CURLOPT_POSTFIELDS, $notificationPayload); + curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); + curl_setopt($ch, CURLOPT_TIMEOUT, 5); + curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false); + curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, false); + + curl_exec($ch); + curl_close($ch); + + } catch (Exception $notifyEx) { + error_log("register_driver_and_car NOTIFY ERROR: " . $notifyEx->getMessage()); + } + + printSuccess([ + 'status' => 'success', + 'driverID' => $driverID, + 'carRegID' => $carRegID, + 'documents' => $docUrls + ]); + +} catch (Exception $e) { + if (isset($con) && $con instanceof PDO && $con->inTransaction()) { + $con->rollBack(); + } + error_log("register_driver_and_car ERROR: " . $e->getMessage()); + jsonError("Server error: " . $e->getMessage()); +} catch (PDOException $e) { + if (isset($con) && $con instanceof PDO && $con->inTransaction()) { + $con->rollBack(); + } + error_log("register_driver_and_car PDO: " . $e->getMessage()); + jsonError("Database error."); +} +?> \ No newline at end of file diff --git a/backend/auth/syria/driver/register_driver_and_car_signed.php b/backend/auth/syria/driver/register_driver_and_car_signed.php new file mode 100755 index 0000000..e715879 --- /dev/null +++ b/backend/auth/syria/driver/register_driver_and_car_signed.php @@ -0,0 +1,303 @@ +encryptData($data[$f]); + } + } + // حساسات السيارة + $car['vin'] = $encryptionHelper->encryptData($car['vin']); + $car['car_plate'] = $encryptionHelper->encryptData($car['car_plate']); + $car['owner'] = $encryptionHelper->encryptData($car['owner']); + + /* ========== 4) هَش كلمة المرور ========== */ + $pwdHashed = password_hash(filterRequest('password'), PASSWORD_DEFAULT); + + /* ========== 5) بدء معاملة ========== */ + $con->beginTransaction(); + + /* ========== 6) فحص تكرار هاتف/ايميل (المشفّرين) ========== */ + $dup = $con->prepare("SELECT id FROM driver WHERE phone = :p OR email = :e"); + $dup->execute([':p' => $data['phone'], ':e' => $data['email']]); + if ($dup->rowCount() > 0) { + $con->rollBack(); + jsonError("Phone or email already registered."); + exit; + } + + /* ========== 7) إدراج السائق ========== */ + $sqlDriver = " + INSERT INTO driver ( + id, phone, email, password, gender, license_type, national_number, + name_arabic, issue_date, expiry_date, license_categories, + address, licenseIssueDate, status, birthdate, site, + first_name, last_name, accountBank, bankCode, + employmentType, maritalStatus, fullNameMaritial, expirationDate, + created_at, updated_at + ) VALUES ( + :id, :phone, :email, :pwd, :gender, :license_type, :national_number, + :name_arabic, :issue_date, :expiry_date, :license_categories, + :address, :licenseIssueDate, :status, :birthdate, :site, + :first_name, :last_name, :accountBank, :bankCode, + :employmentType, :maritalStatus, :fullNameMaritial, :expirationDate, + NOW(), NOW() + ) + "; + $insD = $con->prepare($sqlDriver); + $okD = $insD->execute([ + ':id' => $driverID, + ':phone' => $data['phone'], + ':email' => $data['email'], + ':pwd' => $pwdHashed, + ':gender' => $data['gender'], + ':license_type' => $data['license_type'], + ':national_number' => $data['national_number'], + ':name_arabic' => $data['name_arabic'], + ':issue_date' => $data['issue_date'], + ':expiry_date' => $data['expiry_date'], + ':license_categories'=> !empty($data['license_categories']) ? $data['license_categories'] : 'B', + ':address' => $data['address'], + ':licenseIssueDate' => $data['licenseIssueDate'], + ':status' => !empty($data['status']) ? $data['status'] : 'yet', + ':birthdate' => $data['birthdate'], + ':site' => $data['site'], + ':first_name' => $data['first_name'], + ':last_name' => $data['last_name'], + ':accountBank' => 'yet', + ':bankCode' => 'yet', + ':employmentType' => !empty($data['employmentType']) ? $data['employmentType'] : 'yet', + ':maritalStatus' => !empty($data['maritalStatus']) ? $data['maritalStatus'] : 'yet', + ':fullNameMaritial' => !empty($data['fullNameMaritial']) ? $data['fullNameMaritial'] : 'yet', + ':expirationDate' => !empty($data['expirationDate']) ? $data['expirationDate'] : 'yet', + ]); + if (!$okD) { $con->rollBack(); jsonError("Failed to insert driver."); exit; } + + /* ========== 8) إدراج السيارة ========== */ + $hasCar = $con->prepare("SELECT 1 FROM CarRegistration WHERE driverID = :d LIMIT 1"); + $hasCar->execute([':d' => $driverID]); + $isDefault = $hasCar->rowCount() === 0 ? 1 : 0; + + $sqlCar = " + INSERT INTO CarRegistration ( + driverID, vin, car_plate, make, model, year, expiration_date, + color, owner, color_hex, fuel, isDefault, created_at, status + ) VALUES ( + :driverID, :vin, :car_plate, :make, :model, :year, :expiration_date, + :color, :owner, :color_hex, :fuel, :isDefault, NOW(), 'yet' + ) + "; + $insC = $con->prepare($sqlCar); + $okC = $insC->execute([ + ':driverID' => $driverID, + ':vin' => $car['vin'], + ':car_plate' => $car['car_plate'], + ':make' => $car['make'], + ':model' => $car['model'], + ':year' => $car['year'], + ':expiration_date' => $car['expiration_date'], + ':color' => $car['color'], + ':owner' => $car['owner'], + ':color_hex' => $car['color_hex'], + ':fuel' => $car['fuel'], + ':isDefault' => $isDefault, + ]); + if (!$okC) { $con->rollBack(); jsonError("Failed to insert car registration."); exit; } + + $carRegID = $con->lastInsertId(); + + /* ========== 9) التحقّق من الروابط الموقّعة وحفظها ========== */ + + // دالة مساعدة تتحقّق من شكل الرابط وتستخرج doc_type/ext + $validateSignedUrl = function(string $url) use ($allowedDocTypes, $allowedExts) { + $parts = parse_url($url); + if (!$parts || empty($parts['scheme']) || empty($parts['host']) || empty($parts['path'])) { + throw new Exception("Invalid URL format."); + } + if (!in_array($parts['host'], $ALLOWED_SIGNED_HOSTS, true)) { + throw new Exception("URL host not allowed: {$parts['host']}"); + } + if (stripos($parts['path'], 'secure_image.php') === false) { + throw new Exception("URL path not allowed."); + } + if (empty($parts['query'])) { + throw new Exception("URL missing query string."); + } + parse_str($parts['query'], $q); + foreach (['driver_id','doc_type','ext','expires','signature'] as $k) { + if (empty($q[$k])) throw new Exception("URL missing param: $k"); + } + if (!in_array($q['doc_type'], $allowedDocTypes, true)) { + throw new Exception("Invalid doc_type in URL."); + } + if (!in_array(strtolower($q['ext']), $allowedExts, true)) { + throw new Exception("Invalid ext in URL."); + } + return [ + 'doc_type' => $q['doc_type'], + 'ext' => strtolower($q['ext']), + // بإمكانك التحقق من driver_id = $driverID إذا تحب تربطهما + 'driver_id_in_url' => $q['driver_id'], + ]; + }; + + $docsToInsert = []; // [['doc_type'=>..., 'link'=>..., 'image_name'=>...], ...] + foreach ($docUrlKeys as $k) { + $link = $docUrls[$k]; + $meta = $validateSignedUrl($link); + // image_name ليس ضروريًا هنا (الرابط موقّع إلى بوابة قراءة)، احفظ doc_type + link فقط + $docsToInsert[] = [ + 'doc_type' => $meta['doc_type'], // يجب أن يتطابق مع $k منطقيًا + 'link' => $link, + 'image_name' => $meta['doc_type'] . '.' . $meta['ext'], // اسماً رمزياً فقط + ]; + } + + // إدراج في driver_documents + // CREATE TABLE driver_documents ( + // id INT AUTO_INCREMENT PRIMARY KEY, + // driverID VARCHAR(64) NOT NULL, + // doc_type VARCHAR(64) NOT NULL, + // image_name VARCHAR(255) NULL, + // link VARCHAR(1024) NOT NULL, + // upload_date DATETIME NOT NULL, + // INDEX(driverID) + // ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4; + $insDoc = $con->prepare(" + INSERT INTO driver_documents (driverID, doc_type, image_name, link, upload_date) + VALUES (:driverID, :doc_type, :image_name, :link, NOW()) + "); + foreach ($docsToInsert as $row) { + $insDoc->execute([ + ':driverID' => $driverID, + ':doc_type' => $row['doc_type'], + ':image_name' => $row['image_name'], + ':link' => $row['link'], + ]); + } + + /* ========== 10) إنهاء المعاملة ========== */ + $con->commit(); + + printSuccess([ + 'driverID' => $driverID, + 'carRegID' => $carRegID, + 'documents' => [ + 'driver_license_front_url' => $docUrls['driver_license_front_url'], + 'driver_license_back_url' => $docUrls['driver_license_back_url'], + 'car_license_front_url' => $docUrls['car_license_front_url'], + 'car_license_back_url' => $docUrls['car_license_back_url'], + ] + ]); + +} catch (Exception $e) { + if (isset($con) && $con->inTransaction()) { $con->rollBack(); } + error_log("register_driver_and_car ERROR: " . $e->getMessage()); + jsonError("Server error: " . $e->getMessage()); +} catch (PDOException $e) { + if (isset($con) && $con->inTransaction()) { $con->rollBack(); } + error_log("register_driver_and_car PDO: " . $e->getMessage()); + jsonError("Database error."); +} \ No newline at end of file diff --git a/backend/auth/syria/driver/sendWhatsAppDriver.php b/backend/auth/syria/driver/sendWhatsAppDriver.php new file mode 100755 index 0000000..74545fb --- /dev/null +++ b/backend/auth/syria/driver/sendWhatsAppDriver.php @@ -0,0 +1,107 @@ +encryptData($raw); + + $sql = "SELECT 1 FROM blacklist_driver WHERE phone = :ph LIMIT 1"; + $q = $con->prepare($sql); + $q->execute(['ph' => $enc_raw]); + + return (bool)$q->fetchColumn(); +} + +/* 0) استقبل الرقم وتحقق من البلاك ليست */ +$receiver = filterRequest("receiver"); + +if (!$receiver) { + jsonError('Phone number is required.'); + error_log("[send_otp_driver.php] Error: phone empty"); + exit(); +} + +if (is_blacklisted_driver($con, $encryptionHelper, $receiver)) { + jsonError('This driver is blacklisted and cannot receive OTP.'); + error_log("[send_otp_driver.php] BLOCKED (blacklisted): $receiver"); + exit(); +} + +/* 1) توليد الـ OTP (3 خانات) */ +$otp = (string)rand(100, 999); + +/* 2) إرسال الرمز عبر بوابة الفلاش كول / واتساب */ +$nabehUrl = 'https://otp.intaleqapp.com/api/request-otp.php'; +$appKey = getenv('NABEH_OTP_APP_KEY'); + +$payload = [ + 'phone' => $receiver, + 'device_type' => 'android', + 'method' => 'whatsapp', + 'code' => $otp +]; + +$ch = curl_init($nabehUrl); +curl_setopt_array($ch, [ + CURLOPT_POST => true, + CURLOPT_RETURNTRANSFER => true, + CURLOPT_POSTFIELDS => json_encode($payload), + CURLOPT_HTTPHEADER => [ + 'Content-Type: application/json', + "X-App-Key: $appKey" + ], + CURLOPT_TIMEOUT => 15, + CURLOPT_CONNECTTIMEOUT => 5 +]); + +$res = curl_exec($ch); +$httpCode = curl_getinfo($ch, CURLINFO_HTTP_CODE); +$error = curl_error($ch); +curl_close($ch); + +if ($error) { + error_log("⚠️ [Flash Call OTP Driver] Curl Error: $error"); + jsonError('Failed to connect to OTP service'); + exit; +} + +$decoded = json_decode((string)$res, true); +if ($httpCode !== 200 || !($decoded['success'] ?? false)) { + error_log("❌ [Flash Call OTP Driver] Failed response: Code $httpCode | Body: " . (string)$res); + jsonError($decoded['message'] ?? 'Failed to request verification code'); + exit; +} + +/* 3) حفظ الـ OTP في قاعدة البيانات */ +$receiver_enc = $encryptionHelper->encryptData($receiver); +$otp_enc = $encryptionHelper->encryptData($otp); + +$exp = date('Y-m-d H:i:s', strtotime('+5 minutes')); +$now = date('Y-m-d H:i:s'); + +try { + // حذف أي رموز سابقة لنفس الرقم + $con->prepare("DELETE FROM phone_verification WHERE phone_number = ?") + ->execute([$receiver_enc]); + + $stmt = $con->prepare(" + INSERT INTO phone_verification + (phone_number, token_code, expiration_time, is_verified, created_at) + VALUES (?, ?, ?, 0, ?) + "); + $stmt->execute([$receiver_enc, $otp_enc, $exp, $now]); + + jsonSuccess(null, 'OTP sent and saved successfully'); + error_log("[send_otp_driver.php] OTP saved for driver $receiver"); + +} catch (PDOException $e) { + error_log("[send_otp_driver.php] DB error: ".$e->getMessage()); + jsonError('OTP generated but failed to save to database'); +} +?> diff --git a/backend/auth/syria/driver/verifyOtp.php b/backend/auth/syria/driver/verifyOtp.php new file mode 100755 index 0000000..035b5f3 --- /dev/null +++ b/backend/auth/syria/driver/verifyOtp.php @@ -0,0 +1,96 @@ +encryptData($phoneNumber); +$email_encrypted = $encryptionHelper->encryptData($email); + +try { + // 🔍 1. التحقق من السجل المخزن في قاعدة البيانات + $stmtSelect = $con->prepare("SELECT * FROM phone_verification WHERE phone_number = ? ORDER BY created_at DESC LIMIT 1"); + $stmtSelect->execute([$phoneNumber_encrypted]); + $record = $stmtSelect->fetch(PDO::FETCH_ASSOC); + + if (!$record) { + jsonError("Verification session not found. Please request a new code."); + exit(); + } + + // 🔍 2. فك تشفير ومقارنة الرمز + $decryptedOtp = $encryptionHelper->decryptData($record['token_code']); + if ($decryptedOtp !== $otp) { + jsonError("Invalid verification code."); + exit(); + } + + // 🔍 3. التحقق من الصلاحية + $now = date('Y-m-d H:i:s'); + if ($record['expiration_time'] && $record['expiration_time'] < $now) { + jsonError("Verification code has expired. Please request a new one."); + exit(); + } + + // 🧹 حذف أي رموز قديمة لنفس الرقم + $con->prepare("DELETE FROM phone_verification WHERE phone_number = ?") + ->execute([$phoneNumber_encrypted]); + + // 🧾 توليد driverID فريد + $raw = $phoneNumber; + $driverID = substr(md5($raw), 2, 20); + + // 🔐 توليد رمز تجريبي (بدون OTP حقيقي لتجنب Null) + $dummyToken = $encryptionHelper->encryptData('AUTO'); + + // ✅ إدخال سجل تحقق مباشر + $stmt = $con->prepare(" + INSERT INTO phone_verification + (phone_number, token_code, email, driverId, expiration_time, is_verified, created_at) + VALUES (?, ?, ?, ?, NULL, 1, ?) + "); + $stmt->execute([$phoneNumber_encrypted, $dummyToken, $email_encrypted, $driverID, $now]); + + error_log("✅ [verifyOtp.php] Verification record inserted successfully for $phoneNumber"); + + // 🔍 التحقق إذا السائق موجود مسبقاً + $checkDriverStmt = $con->prepare("SELECT * FROM driver WHERE phone = ?"); + $checkDriverStmt->execute([$phoneNumber_encrypted]); + $driver = $checkDriverStmt->fetch(PDO::FETCH_ASSOC); + + if ($driver) { + error_log("👤 [verifyOtp.php] Driver already registered. Returning driver info."); + printSuccess([ + "message" => "Driver already registered.", + "isRegistered" => true, + "driver" => [ + "id" => $driver['id'], + "first_name" => $encryptionHelper->decryptData($driver['first_name']), + "last_name" => $encryptionHelper->decryptData($driver['last_name']), + "email" => $encryptionHelper->decryptData($driver['email']), + "phone" => $phoneNumber + ] + ]); + } else { + error_log("🆕 [verifyOtp.php] Phone verified. Driver not found."); + printSuccess([ + "message" => "Phone number verified successfully.", + "isRegistered" => false, + "driverID" => $driverID + ]); + } + +} catch (PDOException $e) { + error_log("💥 [verifyOtp.php] PDO ERROR: " . $e->getMessage()); + jsonError("Database error: " . $e->getMessage()); +} +?> diff --git a/backend/auth/syria/register_passenger.php b/backend/auth/syria/register_passenger.php new file mode 100755 index 0000000..addd06f --- /dev/null +++ b/backend/auth/syria/register_passenger.php @@ -0,0 +1,155 @@ +encryptData($phoneNumber); + $firstName_encrypted = $encryptionHelper->encryptData($firstName); + $lastName_encrypted = $encryptionHelper->encryptData($lastName); + $email_encrypted = $encryptionHelper->encryptData($email); + $password_hashed = password_hash($email, PASSWORD_DEFAULT); + $unknown_encrypted = $encryptionHelper->encryptData("unknown yet"); + + // ====================================================== + // Step 5: إنشاء ID فريد + // ====================================================== + $step = 5; + // $uniqueId = substr(md5(uniqid(mt_rand(), true)), 0, 20); + + $uniqueId = substr(md5($phoneNumber_encrypted), 0, 20); + + error_log("$logTag Step 5: Generated Unique ID: $uniqueId"); + + // ====================================================== + // Step 6: التحقق من وجود المستخدم (Database Check) + // ====================================================== + $step = 6; + $checkStmt = $con->prepare("SELECT id FROM passengers WHERE phone = ?"); + $checkStmt->execute([$phoneNumber_encrypted]); + + if ($checkStmt->rowCount() > 0) { + error_log("$logTag Step 6 Error: User already exists."); + jsonError("User with this phone number or email already exists."); + exit(); + } + + // ====================================================== + // Step 7: الإضافة (Insert User) + // ====================================================== + $step = 7; + error_log("$logTag Step 7: Inserting into passengers table..."); + + $insertStmt = $con->prepare(" + INSERT INTO passengers (id, first_name, last_name, email, phone, password, gender, birthdate, site, sosPhone, education, employmentType, maritalStatus, status, created_at, updated_at) + VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, 'active', NOW(), NOW()) + "); + $success = $insertStmt->execute([ + $uniqueId, + $firstName_encrypted, + $lastName_encrypted, + $email_encrypted, + $phoneNumber_encrypted, + $password_hashed, + $unknown_encrypted, + $unknown_encrypted, + $unknown_encrypted, + $unknown_encrypted, + $unknown_encrypted, + $unknown_encrypted, + $unknown_encrypted + ]); + + if (!$success) { + $errorInfo = $insertStmt->errorInfo(); + // طباعة تفاصيل خطأ الـ SQL في اللوج + error_log("$logTag Step 7 Error: SQL Insert Failed. Details: " . json_encode($errorInfo)); + jsonError("Failed to create user account."); + exit(); + } + + + // ====================================================== + // Step 9: جلب البيانات لإعادتها + // ====================================================== + $step = 9; + $userStmt = $con->prepare("SELECT * FROM passengers WHERE id = ?"); + $userStmt->execute([$uniqueId]); + $newUser = $userStmt->fetch(PDO::FETCH_ASSOC); + + // ====================================================== + // Step 10: فك التشفير وإرسال الرد + // ====================================================== + $step = 10; + if ($newUser) { + unset($newUser['password']); + foreach ($newUser as $key => &$value) { + if ($key !== 'id' && $key !== 'status' && $key !== 'created_at' && $key !== 'updated_at' && !is_null($value)) { + $value = $encryptionHelper->decryptData($value); + } + } + } + + error_log("$logTag Success: User registered successfully."); + jsonSuccess(["status" => "registration_success", "data" => $newUser]); + +} catch (PDOException $e) { + // طباعة خطأ قاعدة البيانات في اللوج + error_log("$logTag PDO Exception at Step $step: " . $e->getMessage()); + jsonError("Database Error."); +} catch (Exception $e) { + // طباعة الأخطاء العامة في اللوج + error_log("$logTag General Exception at Step $step: " . $e->getMessage()); + jsonError("General Error."); +} +?> \ No newline at end of file diff --git a/backend/auth/syria/secure_image.php b/backend/auth/syria/secure_image.php new file mode 100755 index 0000000..9683ff7 --- /dev/null +++ b/backend/auth/syria/secure_image.php @@ -0,0 +1,72 @@ +file($path) ?: 'application/octet-stream'; + +header('Content-Type: ' . $mime); +header('Content-Length: ' . filesize($path)); +header('X-Content-Type-Options: nosniff'); +// (اختياري) اطلب توكن وصول إضافي عبر Authorization للتحكم الأدق. +// مثال: تحقق من $_SERVER['HTTP_AUTHORIZATION'] هنا إن أردت. +readfile($path); \ No newline at end of file diff --git a/backend/auth/syria/sendWhatsOpt.php b/backend/auth/syria/sendWhatsOpt.php new file mode 100755 index 0000000..0c7360d --- /dev/null +++ b/backend/auth/syria/sendWhatsOpt.php @@ -0,0 +1,117 @@ +encryptData($raw); + $enc_norm = $encryptionHelper->encryptData($norm); + + $sql = "SELECT 1 + FROM passenger_blacklist + WHERE phone IN (:enc_raw, :enc_norm) + AND (expires_at IS NULL OR expires_at > NOW()) + LIMIT 1"; + + $q = $con->prepare($sql); + $q->execute([ + 'enc_raw' => $enc_raw, + 'enc_norm' => $enc_norm, + ]); + + return (bool)$q->fetchColumn(); +} + +/* 0) Get phone number */ +$receiver = filterRequest("receiver"); +if (!$receiver) { + jsonError('Phone number is required.'); + exit(); +} + +if (is_blacklisted($con, $encryptionHelper, $receiver)) { + jsonError('This phone is blacklisted and cannot receive OTP.'); + error_log("[send_otp] BLOCKED (blacklisted): $receiver"); + exit(); +} + +/* 1) Generate OTP (3 digits) */ +$otp = (string)rand(100, 999); + +/* 2) Send via Flash Call / WhatsApp Gateway */ +$nabehUrl = 'https://otp.intaleqapp.com/api/request-otp.php'; +$appKey = getenv('NABEH_OTP_APP_KEY'); + +$payload = [ + 'phone' => $receiver, + 'device_type' => 'android', + 'method' => 'whatsapp', + 'code' => $otp +]; + +$ch = curl_init($nabehUrl); +curl_setopt_array($ch, [ + CURLOPT_POST => true, + CURLOPT_RETURNTRANSFER => true, + CURLOPT_POSTFIELDS => json_encode($payload), + CURLOPT_HTTPHEADER => [ + 'Content-Type: application/json', + "X-App-Key: $appKey" + ], + CURLOPT_TIMEOUT => 15, + CURLOPT_CONNECTTIMEOUT => 5 +]); + +$res = curl_exec($ch); +$httpCode = curl_getinfo($ch, CURLINFO_HTTP_CODE); +$error = curl_error($ch); +curl_close($ch); + +if ($error) { + error_log("⚠️ [Flash Call OTP Passenger] Curl Error: $error"); + jsonError('Failed to connect to OTP service'); + exit; +} + +$decoded = json_decode((string)$res, true); +if ($httpCode !== 200 || !($decoded['success'] ?? false)) { + error_log("❌ [Flash Call OTP Passenger] Failed response: Code $httpCode | Body: " . (string)$res); + jsonError($decoded['message'] ?? 'Failed to request verification code'); + exit; +} + +/* 3) Save OTP (encrypted) */ +$receiver_enc = $encryptionHelper->encryptData($receiver); +$otp_enc = $encryptionHelper->encryptData($otp); + +$exp = date('Y-m-d H:i:s', strtotime('+5 minutes')); +$now = date('Y-m-d H:i:s'); + +try { + $con->prepare("DELETE FROM phone_verification_passenger WHERE phone_number = ?") + ->execute([$receiver_enc]); + + $stmt = $con->prepare(" + INSERT INTO phone_verification_passenger + (phone_number, token, expiration_time, verified, created_at) + VALUES (?, ?, ?, 0, ?) + "); + $stmt->execute([$receiver_enc, $otp_enc, $exp, $now]); + + jsonSuccess(null, 'OTP sent and saved successfully'); + error_log("[send_otp] OTP saved successfully for $receiver"); + +} catch (PDOException $e) { + error_log("[send_otp] DB error: ".$e->getMessage()); + jsonError('OTP generated but failed to save to database'); +} diff --git a/backend/auth/syria/send_survey.php b/backend/auth/syria/send_survey.php new file mode 100755 index 0000000..6d088da --- /dev/null +++ b/backend/auth/syria/send_survey.php @@ -0,0 +1,52 @@ + "buttons", + "header" => [ + "type" => "text", + "text" => "استطلاع رأي سريع 🌟" + ], + "body" => [ + "text" => "هل كانت تجربة التسجيل في تطبيق *انطلق* سهلة بالنسبة لك؟\n\n👇 اضغط أحد الخيارات:" + ], + "footer" => [ + "text" => "للتواصل: +962 7XXXXXXX - رابط التطبيق: https://intaleq.xyz" + ], + "buttons" => [ + [ + "type" => "reply", + "reply" => [ + "id" => "feedback_yes", + "title" => "👍 نعم" + ] + ], + [ + "type" => "reply", + "reply" => [ + "id" => "feedback_no", + "title" => "👎 لا" + ] + ] + ] +]; + +// استدعاء الدالة لإرسال الرسالة +$response = sendWhatsAppFromServer($receiver, $surveyMessage); +if ($response && isset($response["status"]) && $response["status"] === "sent") { + jsonSuccess(null, "تم إرسال استطلاع الرأي بنجاح بعد $delay ثانية."); +} else { + jsonError("فشل في إرسال استطلاع الرأي"); +} +?> \ No newline at end of file diff --git a/backend/auth/syria/uploadSyrianDocs.php b/backend/auth/syria/uploadSyrianDocs.php new file mode 100755 index 0000000..d5e69ff --- /dev/null +++ b/backend/auth/syria/uploadSyrianDocs.php @@ -0,0 +1,129 @@ + MAX_FILE_MB * 1024 * 1024) { + jsonError("File too large. Max " . MAX_FILE_MB . " MB."); exit; +} + +// MIME دقيق +$finfo = new finfo(FILEINFO_MIME_TYPE); +$mime = $finfo->file($tmpPath) ?: 'application/octet-stream'; +if (!in_array($mime, ALLOWED_MIMES, true)) { + jsonError("Unsupported file type: $mime"); exit; +} + +// لاحقة الامتداد +$extMap = [ + 'image/jpeg' => '.jpg', + 'image/png' => '.png', + 'image/webp' => '.webp', +]; +$ext = $extMap[$mime]; + +// --------- توليد مسار حتمي بدون تاريخ --------- +// تنظيف driver_id لاسم ملف آمن +$driverIdSafe = preg_replace('/[^A-Za-z0-9_\-]/', '_', $driverId); +// شجرة مجلدات ثابتة من hash(driver_id) لتوزيع الملفات +$h = hash('sha1', $driverIdSafe); +$subdir = substr($h, 0, 2) . '/' . substr($h, 2, 2); +$destDir = UPLOAD_ROOT . '/' . $subdir; +if (!is_dir($destDir)) { @mkdir($destDir, 0700, true); } + +// الاسم النهائي بدون تاريخ +$serverName = "{$driverIdSafe}__{$docType}{$ext}"; +$destPath = $destDir . '/' . $serverName; + +// استبدال أي نسخة قديمة عن قصد (overwrite) +if (is_file($destPath)) { @unlink($destPath); } + +// نقل الملف +if (!move_uploaded_file($tmpPath, $destPath)) { + jsonError("Failed to save the uploaded file."); + exit; +} +@chmod($destPath, 0600); + +// --------- Signed URL --------- +// سنضمّن driver_id و doc_type و ext في الرابط والتوقيع. +// ext بدون النقطة +$extShort = ltrim($ext, '.'); +$expires = time() + SIGNED_TTL_SEC; + +// الرسالة الموقّعة: driver_id:doc_type:ext:expires +$message = $driverIdSafe . ':' . $docType . ':' . $extShort . ':' . $expires; +$signature = hash_hmac('sha256', $message, SIGN_SECRET); + +// رابط القراءة عبر البوابة الآمنة فقط +// ملاحظة: لا نُرجع المسار الحقيقي، فقط معطيات موقّعة +$fileUrl = PUBLIC_BASE . "/secure_image.php" + . "?driver_id={$driverIdSafe}" + . "&doc_type={$docType}" + . "&ext={$extShort}" + . "&expires={$expires}" + . "&signature={$signature}"; + +// --------- استجابة --------- +printSuccess([ + "status" => "success", + "success_file" => true, + "file_url" => $fileUrl, + "file_name" => $serverName, // الاسم الفعلي المحفوظ + "driver_id" => $driverIdSafe, + "doc_type" => $docType, + "mime_type" => $mime, + "size_bytes" => $size, + "expires_at" => date('c', $expires) +]); \ No newline at end of file diff --git a/backend/auth/syria/verifyOtp.php b/backend/auth/syria/verifyOtp.php new file mode 100755 index 0000000..ce2974a --- /dev/null +++ b/backend/auth/syria/verifyOtp.php @@ -0,0 +1,114 @@ +encryptData($phoneNumber); +error_log("[Auth_Debug] Phone number encrypted successfully."); + +try { + // ✅ 1. التحقق من السجل المخزن في قاعدة البيانات + $stmtSelect = $con->prepare("SELECT * FROM phone_verification_passenger WHERE phone_number = ? ORDER BY created_at DESC LIMIT 1"); + $stmtSelect->execute([$phoneNumber_encrypted]); + $record = $stmtSelect->fetch(PDO::FETCH_ASSOC); + + if (!$record) { + error_log("[Auth_Error] No verification record found for this number."); + jsonError("Verification session not found. Please request a new code."); + exit(); + } + + // ✅ 2. فك تشفير ومقارنة الرمز + $decryptedOtp = $encryptionHelper->decryptData($record['token']); + if ($decryptedOtp !== $otp) { + error_log("[Auth_Error] OTP mismatch. Expected: $decryptedOtp, Got: $otp"); + jsonError("Invalid verification code."); + exit(); + } + + // ✅ 3. التحقق من الصلاحية (خلال 5 دقائق) + $now = date('Y-m-d H:i:s'); + if ($record['expiration_time'] && $record['expiration_time'] < $now) { + error_log("[Auth_Error] OTP expired."); + jsonError("Verification code has expired. Please request a new one."); + exit(); + } + + // ✅ 4. حذف السجلات القديمة وإدخال سجل مؤكد (verified = 1) + error_log("[Auth_Step_1] Deleting old verification records for this phone..."); + $stmtDelete = $con->prepare("DELETE FROM phone_verification_passenger WHERE phone_number = ?"); + $stmtDelete->execute([$phoneNumber_encrypted]); + + $stmtInsert = $con->prepare(" + INSERT INTO phone_verification_passenger (phone_number, token, expiration_time, verified, created_at) + VALUES (?, NULL, NULL, 1, ?) + "); + $stmtInsert->execute([$phoneNumber_encrypted, $now]); + error_log("[Auth_Step_1] Inserted verified record."); + + // ✅ 5. فحص هل الراكب موجود مسبقاً + error_log("[Auth_Step_3] Checking if passenger exists in passengers table..."); + + $checkPassengerStmt = $con->prepare(" + SELECT * FROM passengers WHERE phone = ? + "); + $checkPassengerStmt->execute([$phoneNumber_encrypted]); + $passenger = $checkPassengerStmt->fetch(PDO::FETCH_ASSOC); + + if ($passenger) { + // ✅ الراكب موجود + error_log("[Auth_Result] Passenger Found. ID: " . $passenger['id']); + + printSuccess([ + "message" => "Passenger already registered.", + "isRegistered" => true, + "passenger" => [ + "id" => $passenger['id'], + "first_name" => $encryptionHelper->decryptData($passenger['first_name']), + "last_name" => $encryptionHelper->decryptData($passenger['last_name']), + "email" => $encryptionHelper->decryptData($passenger['email']), + "phone" => $phoneNumber + ] + ]); + } else { + // ✅ الراكب جديد + error_log("[Auth_Result] Passenger Not Found. Treating as new user."); + + printSuccess([ + "message" => "Phone number verified successfully.", + "isRegistered" => false + ]); + } + +} catch (PDOException $e) { + error_log("[Auth_DB_Exception] Error: " . $e->getMessage() . " | File: " . $e->getFile() . " | Line: " . $e->getLine()); + jsonError("Database error occurred. Please contact support."); +} catch (Exception $e) { + error_log("[Auth_General_Exception] Error: " . $e->getMessage()); + jsonError("An unexpected error occurred."); +} + +// تسجيل نهاية الطلب +error_log("[Auth_Debug] Request processing finished."); +?> \ No newline at end of file diff --git a/backend/auth/token_passenger/driver/send_otp_driver.php b/backend/auth/token_passenger/driver/send_otp_driver.php new file mode 100755 index 0000000..2e0d5ce --- /dev/null +++ b/backend/auth/token_passenger/driver/send_otp_driver.php @@ -0,0 +1,87 @@ + $receiver, + 'device_type' => 'android', + 'method' => 'whatsapp', + 'code' => $otp +]; + +$ch = curl_init($nabehUrl); +curl_setopt_array($ch, [ + CURLOPT_POST => true, + CURLOPT_RETURNTRANSFER => true, + CURLOPT_POSTFIELDS => json_encode($payload), + CURLOPT_HTTPHEADER => [ + 'Content-Type: application/json', + "X-App-Key: $appKey" + ], + CURLOPT_TIMEOUT => 15, + CURLOPT_CONNECTTIMEOUT => 5 +]); + +$res = curl_exec($ch); +$httpCode = curl_getinfo($ch, CURLINFO_HTTP_CODE); +$error = curl_error($ch); +curl_close($ch); + +if ($error) { + error_log("⚠️ [Flash Call OTP Token Driver] Curl Error: $error"); + jsonError('Failed to connect to OTP service'); + exit; +} + +$decoded = json_decode((string)$res, true); +$sentOK = ($httpCode === 200 && ($decoded['success'] ?? false)); + +if ($sentOK) { + /* 3) تشفير البيانات وحفظها في DB ----------------------------------- */ + $receiver_enc = $encryptionHelper->encryptData($receiver); + $otp_enc = $encryptionHelper->encryptData($otp); + + $exp = date('Y-m-d H:i:s', strtotime('+5 minutes')); + $now = date('Y-m-d H:i:s'); + + try { + // حذف رموز قديمة + $con->prepare("DELETE FROM token_verification_driver WHERE phone_number = ?") + ->execute([$receiver_enc]); + + $stmt = $con->prepare(" + INSERT INTO token_verification_driver + (phone_number, token, expiration_time, verified, created_at) + VALUES (?, ?, ?, 0, ?) + "); + $stmt->execute([$receiver_enc, $otp_enc, $exp, $now]); + + jsonSuccess(null, 'OTP sent and saved successfully'); + + } catch (PDOException $e) { + jsonError('OTP sent but failed to save to database'); + } + +} else { + $errMsg = $decoded['message'] ?? 'Unknown error'; + jsonError('Failed to send OTP: ' . $errMsg); +} + +/* ----------------------------------------------------------------------- + * أبقينا callAPI() فقط إذا كان يُستخدم في ملفات أخرى – احذفه إن شئت. + * --------------------------------------------------------------------- */ +function callAPI($method, $url, $data) { /* … */ } +?> \ No newline at end of file diff --git a/backend/auth/token_passenger/driver/verify_otp_driver.php b/backend/auth/token_passenger/driver/verify_otp_driver.php new file mode 100755 index 0000000..ce04e98 --- /dev/null +++ b/backend/auth/token_passenger/driver/verify_otp_driver.php @@ -0,0 +1,81 @@ +encryptData($phoneNumber); +$otp_encrypted = $encryptionHelper->encryptData($otp); + +try { + $stmt = $con->prepare(" + SELECT * FROM token_verification_driver + WHERE phone_number = ? AND token = ? + "); + $stmt->execute([$phoneNumber_encrypted, $otp_encrypted]); + $result = $stmt->fetch(PDO::FETCH_ASSOC); + + if ($result) { + $expiration_time = strtotime($result['expiration_time']); + + if (time() <= $expiration_time) { + $con->prepare("UPDATE token_verification_driver SET verified = 1 WHERE id = ?") + ->execute([$result['id']]); + + $driverStmt = $con->prepare("SELECT id FROM driver WHERE phone = ?"); + $driverStmt->execute([$phoneNumber_encrypted]); + $driver = $driverStmt->fetch(PDO::FETCH_ASSOC); + + if ($driver) { + $driverID = $driver['id']; + $newToken = filterRequest("token"); + $fingerPrint = filterRequest("fingerPrint"); + + if ($newToken && $fingerPrint) { + $tokenEncrypted = $encryptionHelper->encryptData($newToken); + + $checkTokenStmt = $con->prepare("SELECT id FROM driverToken WHERE captain_id = ?"); + $checkTokenStmt->execute([$driverID]); + + if ($checkTokenStmt->rowCount() > 0) { + $con->prepare("UPDATE driverToken SET token = ?, fingerPrint = ? WHERE captain_id = ?") + ->execute([$tokenEncrypted, $fingerPrint, $driverID]); + } else { + $con->prepare("INSERT INTO driverToken (token, fingerPrint, captain_id, created_at) VALUES (?, ?, ?, NOW())") + ->execute([$tokenEncrypted, $fingerPrint, $driverID]); + } + + $response = [ + "message" => "Driver token verified and updated.", + "isRegistered" => true, + "driverID" => $driverID + ]; + jsonSuccess($response); + + } else { + jsonError("Token or fingerprint missing."); + } + + } else { + printSuccess([ + "message" => "Phone verified, but driver not found.", + "isRegistered" => false + ]); + } + + } else { + jsonError("OTP expired. Request a new one."); + } + + } else { + jsonError("Invalid OTP."); + } + +} catch (PDOException $e) { + jsonError("Database error occurred."); +} \ No newline at end of file diff --git a/backend/auth/token_passenger/send_otp.php b/backend/auth/token_passenger/send_otp.php new file mode 100755 index 0000000..4e0a518 --- /dev/null +++ b/backend/auth/token_passenger/send_otp.php @@ -0,0 +1,86 @@ + $receiver, + 'device_type' => 'android', + 'method' => 'whatsapp', + 'code' => $otp +]; + +$ch = curl_init($nabehUrl); +curl_setopt_array($ch, [ + CURLOPT_POST => true, + CURLOPT_RETURNTRANSFER => true, + CURLOPT_POSTFIELDS => json_encode($payload), + CURLOPT_HTTPHEADER => [ + 'Content-Type: application/json', + "X-App-Key: $appKey" + ], + CURLOPT_TIMEOUT => 15, + CURLOPT_CONNECTTIMEOUT => 5 +]); + +$res = curl_exec($ch); +$httpCode = curl_getinfo($ch, CURLINFO_HTTP_CODE); +$error = curl_error($ch); +curl_close($ch); + +if ($error) { + error_log("⚠️ [Flash Call OTP Token Passenger] Curl Error: $error"); + jsonError('Failed to connect to OTP service'); + exit; +} + +$decoded = json_decode((string)$res, true); +$sentOK = ($httpCode === 200 && ($decoded['success'] ?? false)); + +if ($sentOK) { + /* 3) تشفير البيانات وحفظ الرمز في قاعدة البيانات */ + $receiver_enc = $encryptionHelper->encryptData($receiver); + $otp_enc = $encryptionHelper->encryptData($otp); + + $exp = date('Y-m-d H:i:s', strtotime('+5 minutes')); + $now = date('Y-m-d H:i:s'); + + try { + $con->prepare("DELETE FROM token_verification WHERE phone_number = ?") + ->execute([$receiver_enc]); + + $stmt = $con->prepare(" + INSERT INTO token_verification + (phone_number, token, expiration_time, verified, created_at) + VALUES (?, ?, ?, 0, ?) + "); + $stmt->execute([$receiver_enc, $otp_enc, $exp, $now]); + + jsonSuccess(null, 'OTP sent and saved successfully'); + + } catch (PDOException $e) { + jsonError('OTP sent but failed to save to database'); + } + +} else { + $errMsg = $decoded['message'] ?? 'Unknown error'; + jsonError('Failed to send OTP: ' . $errMsg); +} + +/* ----------------------------------------------------------------- + * يمكن حذف callAPI() تمامًا إن لم يعد مستخدمًا في أي ملف آخر. + * ---------------------------------------------------------------- */ +function callAPI($method, $url, $data) { /* … (أبقِها أو احذفها) */ } +?> \ No newline at end of file diff --git a/backend/auth/token_passenger/verify_otp.php b/backend/auth/token_passenger/verify_otp.php new file mode 100755 index 0000000..cdc13db --- /dev/null +++ b/backend/auth/token_passenger/verify_otp.php @@ -0,0 +1,80 @@ +encryptData($phoneNumber); +$otp_encrypted = $encryptionHelper->encryptData($otp); + +try { + // 1. التحقق من Redis بدلاً من MySQL + if (!$redis) { + jsonError("Security service unavailable"); + exit; + } + + $cachedOtp = $redis->get("otp:passenger:$phoneNumber"); + + if ($cachedOtp && $cachedOtp == $otp) { + // ننجح في التحقق ونحذف المفتاح من Redis لمنع استخدامه مرة أخرى (One-time use) + $redis->del("otp:passenger:$phoneNumber"); + + error_log("[verify_otp.php] OTP verified via Redis for phone: $phoneNumber"); + + // 2. التحقق من وجود الراكب في قاعدة البيانات + $passengerStmt = $con->prepare("SELECT id FROM passengers WHERE phone = ?"); + $passengerStmt->execute([$phoneNumber_encrypted]); + $passenger = $passengerStmt->fetch(PDO::FETCH_ASSOC); + + if ($passenger) { + $passengerID = $passenger['id']; + + // تحديث التوكن والبصمة إن وجدا + $newToken = filterRequest("token"); + $fingerPrint = filterRequest("fingerPrint"); + + if ($newToken && $fingerPrint) { + $tokenEncrypted = $encryptionHelper->encryptData($newToken); + $updateTokenStmt = $con->prepare("UPDATE tokens SET token = ?, fingerPrint = ? WHERE passengerID = ?"); + $updateTokenStmt->execute([$tokenEncrypted, $fingerPrint, $passengerID]); + } + + printSuccess([ + "message" => "Token verified and updated.", + "isRegistered" => true, + "passengerID" => $passengerID + ]); + + } else { + printSuccess([ + "message" => "Phone verified, passenger not found.", + "isRegistered" => false + ]); + } + + } else { + error_log("[verify_otp.php] Invalid or expired OTP for phone: $phoneNumber"); + jsonError("Invalid or expired OTP."); + } + +} catch (Exception $e) { + // Log the detailed database error message for debugging. + error_log("[verify_otp.php] FATAL DATABASE ERROR: " . $e->getMessage()); + jsonError("Database error: " . $e->getMessage()); +} +?> \ No newline at end of file diff --git a/backend/auth/uploads/documents/driver_driving_license_sy_back_34feffd3fa72d6bee56b.jpg b/backend/auth/uploads/documents/driver_driving_license_sy_back_34feffd3fa72d6bee56b.jpg new file mode 100644 index 0000000..8f2d858 Binary files /dev/null and b/backend/auth/uploads/documents/driver_driving_license_sy_back_34feffd3fa72d6bee56b.jpg differ diff --git a/backend/auth/uploads/documents/driver_driving_license_sy_back_eddfdfdgfd.jpg b/backend/auth/uploads/documents/driver_driving_license_sy_back_eddfdfdgfd.jpg new file mode 100644 index 0000000..612d377 Binary files /dev/null and b/backend/auth/uploads/documents/driver_driving_license_sy_back_eddfdfdgfd.jpg differ diff --git a/backend/auth/uploads/documents/driver_driving_license_sy_front_34feffd3fa72d6bee56b.jpg b/backend/auth/uploads/documents/driver_driving_license_sy_front_34feffd3fa72d6bee56b.jpg new file mode 100644 index 0000000..9ceab20 Binary files /dev/null and b/backend/auth/uploads/documents/driver_driving_license_sy_front_34feffd3fa72d6bee56b.jpg differ diff --git a/backend/auth/uploads/documents/driver_driving_license_sy_front_eddfdfdgfd.jpg b/backend/auth/uploads/documents/driver_driving_license_sy_front_eddfdfdgfd.jpg new file mode 100644 index 0000000..f5f1309 Binary files /dev/null and b/backend/auth/uploads/documents/driver_driving_license_sy_front_eddfdfdgfd.jpg differ diff --git a/backend/auth/uploads/documents/driver_generic_unknown.jpg b/backend/auth/uploads/documents/driver_generic_unknown.jpg new file mode 100644 index 0000000..d291986 Binary files /dev/null and b/backend/auth/uploads/documents/driver_generic_unknown.jpg differ diff --git a/backend/auth/uploads/documents/driver_id_back_sy_34feffd3fa72d6bee56b.jpg b/backend/auth/uploads/documents/driver_id_back_sy_34feffd3fa72d6bee56b.jpg new file mode 100644 index 0000000..39c2dc1 Binary files /dev/null and b/backend/auth/uploads/documents/driver_id_back_sy_34feffd3fa72d6bee56b.jpg differ diff --git a/backend/auth/uploads/documents/driver_id_back_sy_eddfdfdgfd.jpg b/backend/auth/uploads/documents/driver_id_back_sy_eddfdfdgfd.jpg new file mode 100644 index 0000000..bbf2889 Binary files /dev/null and b/backend/auth/uploads/documents/driver_id_back_sy_eddfdfdgfd.jpg differ diff --git a/backend/auth/uploads/documents/driver_id_front_sy_34feffd3fa72d6bee56b.jpg b/backend/auth/uploads/documents/driver_id_front_sy_34feffd3fa72d6bee56b.jpg new file mode 100644 index 0000000..7ad8146 Binary files /dev/null and b/backend/auth/uploads/documents/driver_id_front_sy_34feffd3fa72d6bee56b.jpg differ diff --git a/backend/auth/uploads/documents/driver_id_front_sy_eddfdfdgfd.jpg b/backend/auth/uploads/documents/driver_id_front_sy_eddfdfdgfd.jpg new file mode 100644 index 0000000..4139987 Binary files /dev/null and b/backend/auth/uploads/documents/driver_id_front_sy_eddfdfdgfd.jpg differ diff --git a/backend/auth/uploads/documents/driver_vehicle_license_sy_back_34feffd3fa72d6bee56b.jpg b/backend/auth/uploads/documents/driver_vehicle_license_sy_back_34feffd3fa72d6bee56b.jpg new file mode 100644 index 0000000..02749ec Binary files /dev/null and b/backend/auth/uploads/documents/driver_vehicle_license_sy_back_34feffd3fa72d6bee56b.jpg differ diff --git a/backend/auth/uploads/documents/driver_vehicle_license_sy_back_eddfdfdgfd.jpg b/backend/auth/uploads/documents/driver_vehicle_license_sy_back_eddfdfdgfd.jpg new file mode 100644 index 0000000..02749ec Binary files /dev/null and b/backend/auth/uploads/documents/driver_vehicle_license_sy_back_eddfdfdgfd.jpg differ diff --git a/backend/auth/uploads/documents/driver_vehicle_license_sy_front_34feffd3fa72d6bee56b.jpg b/backend/auth/uploads/documents/driver_vehicle_license_sy_front_34feffd3fa72d6bee56b.jpg new file mode 100644 index 0000000..cacd260 Binary files /dev/null and b/backend/auth/uploads/documents/driver_vehicle_license_sy_front_34feffd3fa72d6bee56b.jpg differ diff --git a/backend/auth/uploads/documents/driver_vehicle_license_sy_front_eddfdfdgfd.jpg b/backend/auth/uploads/documents/driver_vehicle_license_sy_front_eddfdfdgfd.jpg new file mode 100644 index 0000000..06f9fe0 Binary files /dev/null and b/backend/auth/uploads/documents/driver_vehicle_license_sy_front_eddfdfdgfd.jpg differ diff --git a/backend/auth/verifyEmail.php b/backend/auth/verifyEmail.php new file mode 100644 index 0000000..8506cbb --- /dev/null +++ b/backend/auth/verifyEmail.php @@ -0,0 +1,39 @@ +prepare($sql); +$stmt->execute([':email' => $email, ':token' => $token]); +$result = $stmt->fetch(); + +if ($result) { + $id = $result["id"]; + $sql = "UPDATE `email_verifications` SET `verified` = 1 WHERE `id` = :id"; + $stmt = $con->prepare($sql); + $stmt->execute([':id' => $id]); + + $admin='support@sefer.com'; + $headers = "MIME-Version: 1.0" . "\r\n"; + $headers .= "Content-type: text/html; charset=UTF-8" . "\r\n"; + $headers .= "From: $admin" . "\r\n"; + + $subject = " Verify your email address"; + $bodyEmail="Subject: Verify your email address + +Hi [$email], + +Your email address has been verified. + +Thank you, +SEFER Team"; + + mail($email, $subject, $bodyEmail, $headers); + + jsonSuccess($message = "Your email address has been verified."); +} else { + jsonError($message ="Your email address could not be verified. Please try again."); +} +?> \ No newline at end of file diff --git a/backend/auth/verifyOtpMessage.php b/backend/auth/verifyOtpMessage.php new file mode 100755 index 0000000..267de68 --- /dev/null +++ b/backend/auth/verifyOtpMessage.php @@ -0,0 +1,60 @@ +prepare($sql); + +// Log the parameters used in the SQL query for debugging +error_log("Executing SELECT SQL: " . $sql . " with phone_number=" . $phone_number . " and token_code=" . $token_code); + +$stmt->bindParam(':phone_number', $phone_number, PDO::PARAM_STR); +$stmt->bindParam(':token_code', $token_code, PDO::PARAM_STR); + +if ($stmt->execute()) { + $result = $stmt->fetch(); + + if ($result) { + // Update the verified status + $sql = "UPDATE `phone_verification_passenger` SET `verified` = 1 WHERE `phone_number` = :phone_number"; + $stmt = $con->prepare($sql); + + // Log the update query execution + error_log("Executing UPDATE SQL: " . $sql . " with phone_number=" . $phone_number); + + $stmt->bindParam(':phone_number', $phone_number, PDO::PARAM_STR); + + if ($stmt->execute()) { + jsonSuccess(null, "Your phone number has been verified."); + } else { + // Log if the update query fails + error_log("Error executing UPDATE SQL: " . implode(", ", $stmt->errorInfo())); + jsonError("An error occurred while verifying your phone number. Please try again."); + } + + } else { + // Log if no matching record was found + error_log("No matching record found for phone_number=" . $phone_number . " and token_code=" . $token_code); + jsonError("Your phone number could not be verified. Please try again."); + } + +} else { + // Log if the select query fails + error_log("Error executing SELECT SQL: " . implode(", ", $stmt->errorInfo())); + jsonError("An error occurred while verifying your phone number. Please try again."); +} +?> \ No newline at end of file diff --git a/backend/card_image/criminalRecord-1b73bad5ed4f147d688e.jpg b/backend/card_image/criminalRecord-1b73bad5ed4f147d688e.jpg new file mode 100644 index 0000000..ffaa58c Binary files /dev/null and b/backend/card_image/criminalRecord-1b73bad5ed4f147d688e.jpg differ diff --git a/backend/card_image/idFrontEmployee-795C0P4Z.jpg b/backend/card_image/idFrontEmployee-795C0P4Z.jpg new file mode 100644 index 0000000..f571f5d Binary files /dev/null and b/backend/card_image/idFrontEmployee-795C0P4Z.jpg differ diff --git a/backend/card_image/idFrontEmployee-AYZHXEIE.jpg b/backend/card_image/idFrontEmployee-AYZHXEIE.jpg new file mode 100644 index 0000000..156b1af Binary files /dev/null and b/backend/card_image/idFrontEmployee-AYZHXEIE.jpg differ diff --git a/backend/card_image/idbackEmployee-795C0P4Z.jpg b/backend/card_image/idbackEmployee-795C0P4Z.jpg new file mode 100644 index 0000000..1f660b7 Binary files /dev/null and b/backend/card_image/idbackEmployee-795C0P4Z.jpg differ diff --git a/backend/card_image/idbackEmployee-AYZHXEIE.jpg b/backend/card_image/idbackEmployee-AYZHXEIE.jpg new file mode 100644 index 0000000..9000963 Binary files /dev/null and b/backend/card_image/idbackEmployee-AYZHXEIE.jpg differ diff --git a/backend/composer.json b/backend/composer.json new file mode 100755 index 0000000..d7c6bb7 --- /dev/null +++ b/backend/composer.json @@ -0,0 +1,5 @@ +{ + "require": { + "vlucas/phpdotenv": "^5.6" + } +} diff --git a/backend/composer.lock b/backend/composer.lock new file mode 100755 index 0000000..0b8b027 --- /dev/null +++ b/backend/composer.lock @@ -0,0 +1,479 @@ +{ + "_readme": [ + "This file locks the dependencies of your project to a known state", + "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies", + "This file is @generated automatically" + ], + "content-hash": "108be68e4e2b97fed51d36a10eed0849", + "packages": [ + { + "name": "graham-campbell/result-type", + "version": "v1.1.2", + "source": { + "type": "git", + "url": "https://github.com/GrahamCampbell/Result-Type.git", + "reference": "fbd48bce38f73f8a4ec8583362e732e4095e5862" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/GrahamCampbell/Result-Type/zipball/fbd48bce38f73f8a4ec8583362e732e4095e5862", + "reference": "fbd48bce38f73f8a4ec8583362e732e4095e5862", + "shasum": "" + }, + "require": { + "php": "^7.2.5 || ^8.0", + "phpoption/phpoption": "^1.9.2" + }, + "require-dev": { + "phpunit/phpunit": "^8.5.34 || ^9.6.13 || ^10.4.2" + }, + "type": "library", + "autoload": { + "psr-4": { + "GrahamCampbell\\ResultType\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Graham Campbell", + "email": "hello@gjcampbell.co.uk", + "homepage": "https://github.com/GrahamCampbell" + } + ], + "description": "An Implementation Of The Result Type", + "keywords": [ + "Graham Campbell", + "GrahamCampbell", + "Result Type", + "Result-Type", + "result" + ], + "support": { + "issues": "https://github.com/GrahamCampbell/Result-Type/issues", + "source": "https://github.com/GrahamCampbell/Result-Type/tree/v1.1.2" + }, + "funding": [ + { + "url": "https://github.com/GrahamCampbell", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/graham-campbell/result-type", + "type": "tidelift" + } + ], + "time": "2023-11-12T22:16:48+00:00" + }, + { + "name": "phpoption/phpoption", + "version": "1.9.2", + "source": { + "type": "git", + "url": "https://github.com/schmittjoh/php-option.git", + "reference": "80735db690fe4fc5c76dfa7f9b770634285fa820" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/schmittjoh/php-option/zipball/80735db690fe4fc5c76dfa7f9b770634285fa820", + "reference": "80735db690fe4fc5c76dfa7f9b770634285fa820", + "shasum": "" + }, + "require": { + "php": "^7.2.5 || ^8.0" + }, + "require-dev": { + "bamarni/composer-bin-plugin": "^1.8.2", + "phpunit/phpunit": "^8.5.34 || ^9.6.13 || ^10.4.2" + }, + "type": "library", + "extra": { + "bamarni-bin": { + "bin-links": true, + "forward-command": true + }, + "branch-alias": { + "dev-master": "1.9-dev" + } + }, + "autoload": { + "psr-4": { + "PhpOption\\": "src/PhpOption/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "Apache-2.0" + ], + "authors": [ + { + "name": "Johannes M. Schmitt", + "email": "schmittjoh@gmail.com", + "homepage": "https://github.com/schmittjoh" + }, + { + "name": "Graham Campbell", + "email": "hello@gjcampbell.co.uk", + "homepage": "https://github.com/GrahamCampbell" + } + ], + "description": "Option Type for PHP", + "keywords": [ + "language", + "option", + "php", + "type" + ], + "support": { + "issues": "https://github.com/schmittjoh/php-option/issues", + "source": "https://github.com/schmittjoh/php-option/tree/1.9.2" + }, + "funding": [ + { + "url": "https://github.com/GrahamCampbell", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/phpoption/phpoption", + "type": "tidelift" + } + ], + "time": "2023-11-12T21:59:55+00:00" + }, + { + "name": "symfony/polyfill-ctype", + "version": "v1.29.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/polyfill-ctype.git", + "reference": "ef4d7e442ca910c4764bce785146269b30cb5fc4" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/polyfill-ctype/zipball/ef4d7e442ca910c4764bce785146269b30cb5fc4", + "reference": "ef4d7e442ca910c4764bce785146269b30cb5fc4", + "shasum": "" + }, + "require": { + "php": ">=7.1" + }, + "provide": { + "ext-ctype": "*" + }, + "suggest": { + "ext-ctype": "For best performance" + }, + "type": "library", + "extra": { + "thanks": { + "name": "symfony/polyfill", + "url": "https://github.com/symfony/polyfill" + } + }, + "autoload": { + "files": [ + "bootstrap.php" + ], + "psr-4": { + "Symfony\\Polyfill\\Ctype\\": "" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Gert de Pagter", + "email": "BackEndTea@gmail.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Symfony polyfill for ctype functions", + "homepage": "https://symfony.com", + "keywords": [ + "compatibility", + "ctype", + "polyfill", + "portable" + ], + "support": { + "source": "https://github.com/symfony/polyfill-ctype/tree/v1.29.0" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2024-01-29T20:11:03+00:00" + }, + { + "name": "symfony/polyfill-mbstring", + "version": "v1.29.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/polyfill-mbstring.git", + "reference": "9773676c8a1bb1f8d4340a62efe641cf76eda7ec" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/polyfill-mbstring/zipball/9773676c8a1bb1f8d4340a62efe641cf76eda7ec", + "reference": "9773676c8a1bb1f8d4340a62efe641cf76eda7ec", + "shasum": "" + }, + "require": { + "php": ">=7.1" + }, + "provide": { + "ext-mbstring": "*" + }, + "suggest": { + "ext-mbstring": "For best performance" + }, + "type": "library", + "extra": { + "thanks": { + "name": "symfony/polyfill", + "url": "https://github.com/symfony/polyfill" + } + }, + "autoload": { + "files": [ + "bootstrap.php" + ], + "psr-4": { + "Symfony\\Polyfill\\Mbstring\\": "" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Nicolas Grekas", + "email": "p@tchwork.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Symfony polyfill for the Mbstring extension", + "homepage": "https://symfony.com", + "keywords": [ + "compatibility", + "mbstring", + "polyfill", + "portable", + "shim" + ], + "support": { + "source": "https://github.com/symfony/polyfill-mbstring/tree/v1.29.0" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2024-01-29T20:11:03+00:00" + }, + { + "name": "symfony/polyfill-php80", + "version": "v1.29.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/polyfill-php80.git", + "reference": "87b68208d5c1188808dd7839ee1e6c8ec3b02f1b" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/polyfill-php80/zipball/87b68208d5c1188808dd7839ee1e6c8ec3b02f1b", + "reference": "87b68208d5c1188808dd7839ee1e6c8ec3b02f1b", + "shasum": "" + }, + "require": { + "php": ">=7.1" + }, + "type": "library", + "extra": { + "thanks": { + "name": "symfony/polyfill", + "url": "https://github.com/symfony/polyfill" + } + }, + "autoload": { + "files": [ + "bootstrap.php" + ], + "psr-4": { + "Symfony\\Polyfill\\Php80\\": "" + }, + "classmap": [ + "Resources/stubs" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Ion Bazan", + "email": "ion.bazan@gmail.com" + }, + { + "name": "Nicolas Grekas", + "email": "p@tchwork.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Symfony polyfill backporting some PHP 8.0+ features to lower PHP versions", + "homepage": "https://symfony.com", + "keywords": [ + "compatibility", + "polyfill", + "portable", + "shim" + ], + "support": { + "source": "https://github.com/symfony/polyfill-php80/tree/v1.29.0" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2024-01-29T20:11:03+00:00" + }, + { + "name": "vlucas/phpdotenv", + "version": "v5.6.0", + "source": { + "type": "git", + "url": "https://github.com/vlucas/phpdotenv.git", + "reference": "2cf9fb6054c2bb1d59d1f3817706ecdb9d2934c4" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/vlucas/phpdotenv/zipball/2cf9fb6054c2bb1d59d1f3817706ecdb9d2934c4", + "reference": "2cf9fb6054c2bb1d59d1f3817706ecdb9d2934c4", + "shasum": "" + }, + "require": { + "ext-pcre": "*", + "graham-campbell/result-type": "^1.1.2", + "php": "^7.2.5 || ^8.0", + "phpoption/phpoption": "^1.9.2", + "symfony/polyfill-ctype": "^1.24", + "symfony/polyfill-mbstring": "^1.24", + "symfony/polyfill-php80": "^1.24" + }, + "require-dev": { + "bamarni/composer-bin-plugin": "^1.8.2", + "ext-filter": "*", + "phpunit/phpunit": "^8.5.34 || ^9.6.13 || ^10.4.2" + }, + "suggest": { + "ext-filter": "Required to use the boolean validator." + }, + "type": "library", + "extra": { + "bamarni-bin": { + "bin-links": true, + "forward-command": true + }, + "branch-alias": { + "dev-master": "5.6-dev" + } + }, + "autoload": { + "psr-4": { + "Dotenv\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Graham Campbell", + "email": "hello@gjcampbell.co.uk", + "homepage": "https://github.com/GrahamCampbell" + }, + { + "name": "Vance Lucas", + "email": "vance@vancelucas.com", + "homepage": "https://github.com/vlucas" + } + ], + "description": "Loads environment variables from `.env` to `getenv()`, `$_ENV` and `$_SERVER` automagically.", + "keywords": [ + "dotenv", + "env", + "environment" + ], + "support": { + "issues": "https://github.com/vlucas/phpdotenv/issues", + "source": "https://github.com/vlucas/phpdotenv/tree/v5.6.0" + }, + "funding": [ + { + "url": "https://github.com/GrahamCampbell", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/vlucas/phpdotenv", + "type": "tidelift" + } + ], + "time": "2023-11-12T22:43:29+00:00" + } + ], + "packages-dev": [], + "aliases": [], + "minimum-stability": "stable", + "stability-flags": [], + "prefer-stable": false, + "prefer-lowest": false, + "platform": [], + "platform-dev": [], + "plugin-api-version": "2.6.0" +} diff --git a/backend/connect.php b/backend/connect.php new file mode 100755 index 0000000..ad702f6 --- /dev/null +++ b/backend/connect.php @@ -0,0 +1,28 @@ +enforce(RateLimiter::identifier(), 'api'); + +// 2. JWT Authentication +$jwtService = new JwtService($redis); +$decoded = $jwtService->authenticate(); + +// متغيرات مساعدة للمطور +$user_id = $decoded->user_id ?? null; +$role = $decoded->role ?? 'passenger'; + +// 3. Database Connection +try { + $con = Database::get('main'); +} catch (Exception $e) { + http_response_code(500); + exit(json_encode(['error' => 'Database connection failed'])); +} \ No newline at end of file diff --git a/backend/core/Auth/JwtService.php b/backend/core/Auth/JwtService.php new file mode 100644 index 0000000..2702db5 --- /dev/null +++ b/backend/core/Auth/JwtService.php @@ -0,0 +1,313 @@ +secretKey = trim(file_get_contents('/home/intaleq-api/.secret_key')); + $this->hmacSecret = getenv('SECRET_KEY_HMAC') ?: ''; + $this->fpPepper = getenv('FP_PEPPER') ?: ''; + $this->issuer = (string)(getenv('APP_ISSUER') ?: ''); + $this->redis = $redis; + + // Debugging fpPepper + if (empty($this->fpPepper)) { + error_log("[JWT_DEBUG] fpPepper is EMPTY in constructor"); + } else { + error_log("[JWT_DEBUG] fpPepper is SET (length: " . strlen($this->fpPepper) . ")"); + } + } + + + // ── توليد Access Token ────────────────────────────────── + public function generateAccessToken( + int|string $userId, + string $role, + string $audience, + ?string $fingerprint = null + ): string { + $jti = bin2hex(random_bytes(16)); + + $ttl = 3600; + if ($role === 'driver') { + $ttl = 14400; + } elseif ($role === 'passenger') { + $ttl = 3600; + } elseif ($role === 'service') { + $ttl = 14400; // 4 hours as requested + } + + $payload = [ + 'iss' => $this->issuer, + 'aud' => $audience, + 'user_id' => $userId, + 'role' => $role, + 'token_type' => 'access', + 'jti' => $jti, + 'iat' => time(), + 'exp' => time() + $ttl, + ]; + + if ($fingerprint && $this->fpPepper) { + $payload['fingerPrint'] = hash('sha256', $fingerprint . $this->fpPepper); + } + + $token = JWT::encode($payload, $this->secretKey, self::ALGO); + + // تخزين في Redis لضمان عدم التكرار وإمكانية الإلغاء + if ($this->redis) { + $this->redis->setex("active_jti:{$userId}", $ttl, $jti); + $this->redis->setex("active_token:{$userId}:{$audience}", $ttl, $token); + } + + return $token; + } + + // ── فك تشفير التوكن للتحقق الداخلي ──────────────────────── + public function decodeToken(string $token): ?object + { + try { + return JWT::decode($token, new Key($this->secretKey, self::ALGO)); + } catch (Exception $e) { + return null; + } + } + + + // ── توليد Refresh Token ───────────────────────────────── + public function generateRefreshToken(int|string $userId): array + { + $token = bin2hex(random_bytes(32)); + $exp = time() + self::REFRESH_TTL; + + // تخزين في Redis + if ($this->redis) { + $this->redis->setex( + "refresh:{$userId}:{$token}", + self::REFRESH_TTL, + json_encode(['user_id' => $userId, 'created_at' => time()]) + ); + } + + return ['token' => $token, 'expires_at' => $exp]; + } + + // ── التحقق الكامل من التوكن ──────────────────────────── + public function authenticate(): object + { + // 1. استخراج التوكن + $authHeader = $_SERVER['HTTP_AUTHORIZATION'] ?? ''; + $token = null; + if (preg_match('/Bearer\s(\S+)/', $authHeader, $m)) { + $token = $m[1]; + } + + if (!$token) { + self::abort(401, 'Authorization token required'); + } + + // 2. Decode + try { + $decoded = JWT::decode($token, new Key($this->secretKey, self::ALGO)); + } catch (ExpiredException $e) { + self::abort(401, 'Token expired'); + } catch (SignatureInvalidException $e) { + // محاولة فك التشفير بمفتاح المحفظة (Wallet secret fallback) + $payKeyPath = '/home/intaleq-api/.secret_key_pay'; + $payKey = file_exists($payKeyPath) ? trim(file_get_contents($payKeyPath)) : ''; + + if ($payKey) { + try { + $decoded = JWT::decode($token, new Key($payKey, self::ALGO)); + } catch (Exception $e2) { + self::abort(401, 'Invalid token signature'); + } + } else { + self::abort(401, 'Invalid token signature'); + } + } catch (BeforeValidException $e) { + self::abort(401, 'Token not yet valid'); + } catch (Exception $e) { + self::abort(401, 'Invalid token'); + } + + // 3. Issuer (Only check if configured) + if (!empty($this->issuer) && ($decoded->iss ?? '') !== $this->issuer) { + self::abort(401, 'Invalid token issuer: expected ' . $this->issuer . ' but got ' . ($decoded->iss ?? 'none')); + } + + // 3.1 App Signature Verification (Service Only) + $role = $decoded->role ?? 'unknown'; + if ($role === 'service') { + $appSignature = $_SERVER['HTTP_X_APP_SIGNATURE'] ?? null; + if ($appSignature === null && function_exists('getallheaders')) { + $headers = array_change_key_case(getallheaders(), CASE_LOWER); + $appSignature = $headers['x-app-signature'] ?? null; + } + + // نقبل بصمة الـ Release أو الـ Debug + $allowedSignatures = array_filter([ + getenv('APP_SIGNATURE_SERVICE_RELEASE'), + getenv('APP_SIGNATURE_SERVICE_DEBUG'), + getenv('APP_SIGNATURE_HASH') // Fallback + ]); + + if (!empty($allowedSignatures)) { + if ($appSignature === null || !in_array($appSignature, $allowedSignatures)) { + error_log("[SECURITY_ERROR] App Signature Mismatch! Role: $role | Got: " . ($appSignature ?? 'NONE') . " | User: " . ($decoded->user_id ?? 'unknown')); + self::abort(403, 'App integrity check failed. Please use the official app.'); + } + } + } + + // 4. User ID + $userId = $decoded->user_id ?? $decoded->sub ?? null; + if (!$userId) { + self::abort(401, 'Invalid JWT payload'); + } + + // 5. JTI Blacklist (تحقق من توكنات ملغاة) + $jti = $decoded->jti ?? null; + if ($jti && $this->redis) { + if ($this->redis->exists("jwt:blacklist:$jti")) { + self::abort(401, 'Token has been revoked'); + } + } + + // 6. token_type — قيّد registration endpoints + $tokenType = $decoded->token_type ?? 'access'; + if ($tokenType === 'registration' || $tokenType === 'new') { + $currentFile = basename($_SERVER['PHP_SELF'], '.php'); + $allowed = false; + foreach (self::REGISTRATION_ENDPOINTS as $ep) { + if (strcasecmp($currentFile, $ep) === 0) { + $allowed = true; + break; + } + } + if (!$allowed) { + error_log("[SECURITY] Registration token blocked on: $currentFile | user: $userId"); + self::abort(403, 'Token not authorized for this action'); + } + } + + // 7. Device Fingerprint (إلزامي للـ Access Tokens) + if ($this->fpPepper && $tokenType === 'access') { + $fpInToken = $decoded->fingerPrint ?? null; + $fpHeader = $_SERVER['HTTP_X_DEVICE_FP'] ?? null; + + // محاولة جلب الهيدر بطرق بديلة إذا لم يوجد في $_SERVER + if ($fpHeader === null && function_exists('getallheaders')) { + $headers = array_change_key_case(getallheaders(), CASE_LOWER); + $fpHeader = $headers['x-device-fp'] ?? null; + } + + if ($fpInToken === null || $fpHeader === null) { + $allHeaders = json_encode(getallheaders()); + error_log("[SECURITY] Fingerprint missing | user: $userId | fpInToken: " . ($fpInToken ?? 'NULL') . " | fpHeader: " . ($fpHeader ?? 'NULL') . " | Headers: $allHeaders"); + self::abort(403, 'Device verification required'); + } + + $expected = hash('sha256', $fpHeader . $this->fpPepper); + if (!hash_equals($expected, $fpInToken)) { + error_log("[SECURITY] Device mismatch | user: $userId | IP: " . ($_SERVER['REMOTE_ADDR'] ?? '?')); + self::abort(403, 'Device mismatch'); + } + } + + // 8. HMAC Verification (Derived Secret for Service) + $hmacHeader = $_SERVER['HTTP_X_HMAC_AUTH'] ?? null; + if ($hmacHeader !== null) { + $timestamp = $_SERVER['HTTP_X_TIMESTAMP'] ?? ''; + $nonce = $_SERVER['HTTP_X_NONCE'] ?? ''; + $body = file_get_contents('php://input') ?: ''; + + // اشتقاق مفتاح الـ HMAC الخاص بهذا المستخدم + $userSecret = hash_hmac('sha256', (string)$userId, $this->hmacSecret); + + // المعادلة الموحدة: Body + Timestamp + Nonce + $payloadToSign = $body . $timestamp . $nonce; + $expectedHmac = hash_hmac('sha256', $payloadToSign, $userSecret); + + if (!hash_equals($expectedHmac, $hmacHeader)) { + $debugMsg = "User: $userId | Expected: $expectedHmac | Got: $hmacHeader | DerivedSecret: $userSecret | MasterSecret(4): " . substr($this->hmacSecret, 0, 4) . " | Body($bodyLen): '$body' | TS: '$timestamp' | Nonce: '$nonce'"; + $bodyLen = strlen($body); + error_log("[SECURITY] HMAC mismatch | " . $debugMsg); + // TEMPORARY: expose debug in response for diagnosis + http_response_code(403); + echo json_encode(['error' => 'HMAC_DEBUG', 'debug' => $debugMsg]); + exit; + } + } + + return $decoded; + } + + // ── إلغاء توكن (Logout / Password Change) ────────────── + public function revokeToken(string $jti, int $remainingTTL = 900): void + { + if ($this->redis && $jti) { + $this->redis->setex("jwt:blacklist:$jti", $remainingTTL + 60, '1'); + } + } + + // ── Internal API Key — للـ get_connect.php ───────────── + public static function validateInternalKey(): void + { + $keyPath = getenv('INTERNAL_SOCKET_KEY_PATH'); + $sent = $_SERVER['HTTP_X_INTERNAL_KEY'] ?? ''; + $expected = (file_exists($keyPath) ? trim(file_get_contents($keyPath)) : '') ?: 'Intaleq_Secure_Bridge_Key_2026_@!socket'; + + if (!$expected || !hash_equals($expected, $sent)) { + error_log('[SECURITY] Invalid internal key from: ' . ($_SERVER['REMOTE_ADDR'] ?? '?')); + http_response_code(403); + echo json_encode(['error' => 'Unauthorized internal request']); + exit; + } + } + + public function getFpPepper(): string + { + return $this->fpPepper; + } + + private static function abort(int $code, string $message) + { + error_log("[JWT_AUTH_FAILED] Code: $code | Message: $message | IP: " . ($_SERVER['REMOTE_ADDR'] ?? '?') . " | URI: " . ($_SERVER['REQUEST_URI'] ?? '?')); + http_response_code($code); + echo json_encode(['error' => $message]); + exit; + } +} diff --git a/backend/core/Auth/RateLimiter.php b/backend/core/Auth/RateLimiter.php new file mode 100644 index 0000000..2f85022 --- /dev/null +++ b/backend/core/Auth/RateLimiter.php @@ -0,0 +1,82 @@ + ['requests' => 5, 'window' => 60], // 5 محاولات / دقيقة + 'otp' => ['requests' => 3, 'window' => 300], // 3 محاولات / 5 دقائق + 'register' => ['requests' => 3, 'window' => 3600], // 3 محاولات / ساعة + 'api' => ['requests' => 120, 'window' => 60], // 120 طلب / دقيقة + 'ride' => ['requests' => 30, 'window' => 60], // 30 طلب / دقيقة + 'upload' => ['requests' => 10, 'window' => 300], // 10 رفع / 5 دقائق + ]; + + public function __construct(?Redis $redis) + { + $this->redis = $redis; + } + + // ── فحص الحد ───────────────────────────────────────────── + // $identifier: IP:userId أو IP فقط + // $type: login | otp | api | ride | upload + public function check(string $identifier, string $type = 'api'): bool + { + if (!$this->redis) { + return true; // بدون Redis نمرر (fallback) + } + + $limit = self::LIMITS[$type] ?? self::LIMITS['api']; + $window = $limit['window']; + $max = $limit['requests']; + + $key = "rate:{$type}:{$identifier}"; + $current = $this->redis->incr($key); + + if ($current === 1) { + $this->redis->expire($key, $window); + } + + return $current <= $max; + } + + // ── تطبيق الحد وإيقاف الطلب إن تجاوز ───────────────────── + public function enforce(string $identifier, string $type = 'api'): void + { + if (!$this->check($identifier, $type)) { + $limit = self::LIMITS[$type] ?? self::LIMITS['api']; + $window = $limit['window']; + + error_log("[RATE_LIMIT] Blocked: $identifier | type: $type"); + + http_response_code(429); + header("Retry-After: $window"); + echo json_encode([ + 'error' => 'Too many requests. Please slow down.', + 'retry_after' => $window, + ]); + exit; + } + } + + // ── بناء معرّف المستخدم ──────────────────────────────────── + public static function identifier(?string $userId = null): string + { + $ip = $_SERVER['REMOTE_ADDR'] ?? 'unknown'; + return $userId ? "{$ip}:{$userId}" : $ip; + } + + // ── إعادة تعيين عداد (مثلاً بعد تسجيل دخول ناجح) ─────────── + public function reset(string $identifier, string $type = 'login'): void + { + if ($this->redis) { + $this->redis->del("rate:{$type}:{$identifier}"); + } + } +} diff --git a/backend/core/Database/Database.php b/backend/core/Database/Database.php new file mode 100644 index 0000000..8564704 --- /dev/null +++ b/backend/core/Database/Database.php @@ -0,0 +1,79 @@ + [ + 'name' => 'DB_PRIMARY_NAME_V2', + 'host' => 'DB_PRIMARY_HOST_V2', + 'user' => 'DB_PRIMARY_USER_V2', + 'pass' => 'DB_PRIMARY_PASS_V2', + ], + 'tracking' => [ + 'name' => 'DB_TRACKING_NAME', + 'host' => 'DB_TRACKING_HOST', + 'user' => 'DB_TRACKING_USER', + 'pass' => 'DB_TRACKING_PASS', + ], + 'ride' => [ + 'name' => 'DB_RIDE_NAME', + 'host' => 'DB_RIDE_HOST', + 'user' => 'DB_RIDE_USER', + 'pass' => 'DB_RIDE_PASS', + ], + ]; + + public static function get(string $name = 'main'): PDO + { + if (!isset(self::$instances[$name])) { + self::$instances[$name] = self::connect($name); + } + return self::$instances[$name]; + } + + private static function connect(string $name): PDO + { + if (!isset(self::$map[$name])) { + throw new InvalidArgumentException("Unknown database: $name"); + } + + $cfg = self::$map[$name]; + + $dbname = getenv($cfg['name']); + $host = getenv($cfg['host']) ?: 'localhost'; + $user = getenv($cfg['user']); + $pass = getenv($cfg['pass']); + + if (!$dbname || !$user) { + error_log("[FATAL] Database config missing for: $name (Check ENV keys: {$cfg['name']}, {$cfg['user']})"); + throw new RuntimeException("Database configuration error."); + } + + $dsn = "mysql:host=$host;dbname=$dbname;charset=utf8mb4"; + $options = [ + PDO::ATTR_EMULATE_PREPARES => false, + PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION, + PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_ASSOC, + PDO::ATTR_PERSISTENT => true, + PDO::MYSQL_ATTR_INIT_COMMAND => "SET NAMES utf8mb4 COLLATE utf8mb4_unicode_ci", + PDO::ATTR_TIMEOUT => 10, + ]; + + try { + return new PDO($dsn, $user, $pass, $options); + } catch (PDOException $e) { + error_log("[DB] Connection failed ($name) at $host: " . $e->getMessage()); + throw $e; + } + } + + private function __construct() {} + private function __clone() {} +} diff --git a/backend/core/Security/EncryptionHelper.php b/backend/core/Security/EncryptionHelper.php new file mode 100644 index 0000000..853e92c --- /dev/null +++ b/backend/core/Security/EncryptionHelper.php @@ -0,0 +1,87 @@ +key = $key; + // IV القديم للتوافقية أثناء مرحلة المايغريشن + $this->cbcIv = $cbcIv ?: getenv('initializationVector') ?: str_repeat('0', 16); + } + + // ─── تشفير نص باستخدام AES-256-GCM ── + public function encryptData(string $plainText): string + { + $plainText = mb_convert_encoding($plainText, 'UTF-8'); + $iv = random_bytes(self::IV_LEN_GCM); + $tag = ''; + $encrypted = openssl_encrypt($plainText, self::ALGO_GCM, $this->key, OPENSSL_RAW_DATA, $iv, $tag, "", self::TAG_LEN); + return self::PREFIX_GCM . base64_encode($iv . $tag . $encrypted); + } + + // ─── فك تشفير نص (يدعم CBC والـ GCM المستقبلي) ─────────── + public function decryptData(string $cipherText): string|false + { + // تحقق إن كان مشفر بالنظام الجديد + if (str_starts_with($cipherText, self::PREFIX_GCM)) { + $raw = base64_decode(substr($cipherText, strlen(self::PREFIX_GCM)), true); + if ($raw === false || strlen($raw) < self::IV_LEN_GCM + self::TAG_LEN) return false; + + $iv = substr($raw, 0, self::IV_LEN_GCM); + $tag = substr($raw, self::IV_LEN_GCM, self::TAG_LEN); + $cipher = substr($raw, self::IV_LEN_GCM + self::TAG_LEN); + + $plain = openssl_decrypt($cipher, self::ALGO_GCM, $this->key, OPENSSL_RAW_DATA, $iv, $tag); + return $plain !== false ? $plain : false; + } + + // وإلا استخدم CBC القديم + $decoded = base64_decode($cipherText, true); + if ($decoded === false) return false; + + $decrypted = openssl_decrypt($decoded, self::ALGO_CBC, $this->key, OPENSSL_RAW_DATA, $this->cbcIv); + if ($decrypted === false) return false; + + $pad = ord($decrypted[strlen($decrypted) - 1]); + if ($pad < 1 || $pad > 16) return false; + + return substr($decrypted, 0, -$pad); + } + + // ─── تشفير/فك تشفير Binary (صور، ملفات) ─────────────── + public function encryptBinary(string $data): string + { + return openssl_encrypt($data, self::ALGO_CBC, $this->key, OPENSSL_RAW_DATA, $this->cbcIv); + } + + public function decryptBinary(string $data): string|false + { + return openssl_decrypt($data, self::ALGO_CBC, $this->key, OPENSSL_RAW_DATA, $this->cbcIv); + } + + // --------- دوال الـ Padding للـ CBC ---------- + private function addPadding($data, $blockSize = 16) { + $pad = $blockSize - (strlen($data) % $blockSize); + return $data . str_repeat(chr($pad), $pad); + } + + private function removePadding($data) { + $pad = ord($data[strlen($data) - 1]); + return substr($data, 0, -$pad); + } +} diff --git a/backend/core/Services/FcmService.php b/backend/core/Services/FcmService.php new file mode 100644 index 0000000..c178a80 --- /dev/null +++ b/backend/core/Services/FcmService.php @@ -0,0 +1,163 @@ +redis = $redis; + // المسار بناء على بنية المشروع + $this->serviceAccountFile = getenv('FIREBASE_SERVICE_ACCOUNT_PATH'); + } + + // ── إرسال إشعار ──────────────────────────────────────── + public function send( + string $token, + string $title, + string $body, + array $data = [], + string $category = 'Order', + string $tone = 'ding' + ): array { + $accessToken = $this->getAccessToken(); + if (!$accessToken) { + return ['status' => 'error', 'message' => 'No access token']; + } + + if (!file_exists($this->serviceAccountFile)) { + return ['status' => 'error', 'message' => 'Service account file missing']; + } + + $creds = json_decode(file_get_contents($this->serviceAccountFile), true); + $projectId = $creds['project_id']; + $fcmUrl = "https://fcm.googleapis.com/v1/projects/$projectId/messages:send"; + + $finalData = array_merge($data, [ + 'title' => $title, + 'body' => $body, + 'tone' => $tone, + 'category' => $category, + 'type' => $category, + ]); + + // FCM يشترط أن تكون كل القيم strings + $processedData = array_map( + fn($v) => is_array($v) || is_object($v) + ? json_encode($v, JSON_UNESCAPED_UNICODE) + : (string)$v, + $finalData + ); + + $payload = [ + 'message' => [ + 'token' => $token, + 'data' => $processedData, + 'android' => ['priority' => 'HIGH'], + 'apns' => [ + 'headers' => ['apns-priority' => '10', 'apns-push-type' => 'background'], + 'payload' => ['aps' => ['content-available' => 1]], + ], + ], + ]; + + if (!empty($title) && !empty($body)) { + $payload['message']['notification'] = [ + 'title' => $title, + 'body' => $body, + ]; + } + + $ch = curl_init($fcmUrl); + curl_setopt_array($ch, [ + CURLOPT_POST => true, + CURLOPT_HTTPHEADER => [ + "Authorization: Bearer $accessToken", + 'Content-Type: application/json; charset=UTF-8', + ], + CURLOPT_POSTFIELDS => json_encode($payload, JSON_UNESCAPED_UNICODE), + CURLOPT_RETURNTRANSFER => true, + CURLOPT_TIMEOUT => 8, + CURLOPT_CONNECTTIMEOUT => 3, + CURLOPT_FRESH_CONNECT => false, // إعادة استخدام الاتصال + CURLOPT_FORBID_REUSE => false, + CURLOPT_TCP_KEEPALIVE => 1, + ]); + + $result = curl_exec($ch); + $httpCode = curl_getinfo($ch, CURLINFO_HTTP_CODE); + $curlErr = curl_errno($ch); + curl_close($ch); + + if ($curlErr) { + return ['status' => 'error', 'message' => 'CURL error']; + } + + return $httpCode === 200 + ? ['status' => 'success'] + : ['status' => 'error', 'code' => $httpCode, 'response' => $result]; + } + + // ── Access Token مع Redis Cache ───────────────────────── + private function getAccessToken(): ?string + { + // 1. من Redis + if ($this->redis) { + $cached = $this->redis->get('google_fcm_access_token'); + if ($cached) return $cached; + } + + // 2. طلب جديد + $token = $this->fetchGoogleToken(); + + if ($token && $this->redis) { + $this->redis->setex('google_fcm_access_token', 3500, $token); + } + + return $token; + } + + private function fetchGoogleToken(): ?string + { + if (!file_exists($this->serviceAccountFile)) return null; + + $creds = json_decode(file_get_contents($this->serviceAccountFile), true); + $clientEmail = $creds['client_email']; + $privateKey = $creds['private_key']; + $now = time(); + + $header = rtrim(strtr(base64_encode(json_encode(['alg' => 'RS256', 'typ' => 'JWT'])), '+/', '-_'), '='); + $claim = rtrim(strtr(base64_encode(json_encode([ + 'iss' => $clientEmail, + 'scope' => 'https://www.googleapis.com/auth/firebase.messaging', + 'aud' => 'https://oauth2.googleapis.com/token', + 'exp' => $now + 3600, + 'iat' => $now, + ])), '+/', '-_'), '='); + + $signature = ''; + openssl_sign("$header.$claim", $signature, $privateKey, 'SHA256'); + $jwt = "$header.$claim." . rtrim(strtr(base64_encode($signature), '+/', '-_'), '='); + + $ch = curl_init('https://oauth2.googleapis.com/token'); + curl_setopt_array($ch, [ + CURLOPT_POST => true, + CURLOPT_POSTFIELDS => http_build_query([ + 'grant_type' => 'urn:ietf:params:oauth:grant-type:jwt-bearer', + 'assertion' => $jwt, + ]), + CURLOPT_RETURNTRANSFER => true, + CURLOPT_TIMEOUT => 10, + ]); + + $res = curl_exec($ch); + curl_close($ch); + + return json_decode($res, true)['access_token'] ?? null; + } +} diff --git a/backend/core/Services/OtpService.php b/backend/core/Services/OtpService.php new file mode 100644 index 0000000..0a8104b --- /dev/null +++ b/backend/core/Services/OtpService.php @@ -0,0 +1,77 @@ +redis = $redis; + } + + // ── توليد وحفظ OTP ───────────────────────────────────── + public function generate(string $phone): string + { + // OTP آمن (6 أرقام عشوائية) + $otp = str_pad((string)random_int(100000, 999999), 6, '0', STR_PAD_LEFT); + + if ($this->redis) { + $key = "otp:{$phone}"; + $this->redis->setex($key, self::OTP_TTL, password_hash($otp, PASSWORD_BCRYPT)); + // إعادة تعيين عداد المحاولات + $this->redis->del("otp:attempts:{$phone}"); + } + + return $otp; + } + + // ── التحقق من OTP ─────────────────────────────────────── + public function verify(string $phone, string $inputOtp): bool + { + if (!$this->redis) return false; + + // فحص الـ lockout + if ($this->redis->exists("otp:locked:{$phone}")) { + return false; + } + + $key = "otp:{$phone}"; + $stored = $this->redis->get($key); + + if (!$stored) { + return false; // انتهت صلاحية الـ OTP + } + + $attemptsKey = "otp:attempts:{$phone}"; + + if (!password_verify($inputOtp, $stored)) { + $attempts = $this->redis->incr($attemptsKey); + $this->redis->expire($attemptsKey, self::OTP_TTL); + + if ($attempts >= self::MAX_ATTEMPTS) { + // قفل لمدة 30 دقيقة + $this->redis->setex("otp:locked:{$phone}", self::LOCKOUT_TTL, '1'); + $this->redis->del($key); + } + return false; + } + + // نجح التحقق — احذف الـ OTP + $this->redis->del($key); + $this->redis->del($attemptsKey); + return true; + } + + // ── فحص هل الرقم مقفل ────────────────────────────────── + public function isLocked(string $phone): bool + { + return $this->redis && (bool)$this->redis->exists("otp:locked:{$phone}"); + } +} diff --git a/backend/core/bootstrap.php b/backend/core/bootstrap.php new file mode 100644 index 0000000..5a4029f --- /dev/null +++ b/backend/core/bootstrap.php @@ -0,0 +1,91 @@ +connect($redisHost, $redisPort, 1.5)) { + if ($redisPass) $redis->auth($redisPass); + $redis->setOption(Redis::OPT_PREFIX, 'intaleq:'); + } else { + $redis = null; + } + } +} catch (Exception $e) { + error_log("[REDIS] Connection failed: " . $e->getMessage()); + $redis = null; +} + +// 5. تحميل الـ Services الأساسية +require_once __DIR__ . '/Security/EncryptionHelper.php'; +require_once __DIR__ . '/Database/Database.php'; +require_once __DIR__ . '/Auth/RateLimiter.php'; +require_once __DIR__ . '/Auth/JwtService.php'; +// لا نحمّل OtpService و FcmService إلا عند الحاجة (Lazy) + +// 6. تهيئة Encryption Helper العام (للتوافقية) +// يتم استخدام .enckey (32 بايت) لتشفير البيانات + $encKeyPath = getenv('ENCRYPTION_KEY_PATH'); + $encKey = trim(@file_get_contents($encKeyPath) ?: ''); + if (!$encKey) { + $encKey = getenv('ENC_KEY') ?: ''; + } + +if (!$encKey || strlen($encKey) !== 32) { + error_log("[FATAL] Encryption key (.enckey) is missing or invalid length (must be 32 bytes)."); + http_response_code(500); + exit(json_encode(['error' => 'Server configuration error: Encryption key issue'])); +} + +$encryptionHelper = new EncryptionHelper($encKey); diff --git a/backend/core/helpers.php b/backend/core/helpers.php new file mode 100644 index 0000000..25ffa1c --- /dev/null +++ b/backend/core/helpers.php @@ -0,0 +1,178 @@ + filter_var($value, FILTER_VALIDATE_INT) !== false ? (int)$value : null, + 'float' => filter_var($value, FILTER_VALIDATE_FLOAT) !== false ? (float)$value : null, + 'email' => filter_var($value, FILTER_VALIDATE_EMAIL) ?: null, + 'url' => filter_var($value, FILTER_VALIDATE_URL) ?: null, + 'bool' => filter_var($value, FILTER_VALIDATE_BOOLEAN, FILTER_NULL_ON_FAILURE), + default => $value, // string — بدون htmlspecialchars (نتركه لـ PDO) + }; +} + +// ── ردود JSON موحدة ───────────────────────────────────────── +function jsonSuccess(mixed $data = null, string $message = 'success', int $code = 200): never +{ + http_response_code($code); + // توحيد الأسلوب ليكون متوافقاً مع الكود القديم (وضع البيانات في message) + $payload = ($data !== null && (!empty($data) || is_array($data))) ? $data : $message; + echo json_encode(['status' => 'success', 'message' => $payload], JSON_UNESCAPED_UNICODE | JSON_UNESCAPED_SLASHES); + exit; +} + +function jsonError(string $message, int $code = 400, mixed $extra = null): never +{ + http_response_code($code); + $response = ['status' => 'failure', 'message' => $message]; + if ($extra !== null) $response['details'] = $extra; + echo json_encode($response, JSON_UNESCAPED_UNICODE | JSON_UNESCAPED_SLASHES); + exit; +} + +// (للتوافق مع الكود القديم) +function printSuccess(mixed $message = 'success'): void +{ + echo json_encode(['status' => 'success', 'message' => $message], JSON_UNESCAPED_UNICODE); +} +function printFailure(mixed $message = 'failure'): void +{ + echo json_encode(['status' => 'failure', 'message' => $message], JSON_UNESCAPED_UNICODE); +} +function result(int $count): void +{ + if ($count > 0) { + printSuccess(); + } else { + printFailure(); + } +} +function sendEmail(string $from, string $to, string $title, string $body): void +{ + $header = "From: $from\nCC: $from"; + mail($to, $title, $body, $header); +} + +// ── رفع صورة آمن ────────────────────────────────────────────── +function uploadImageSecure( + string $fileKey, + string $targetDir, + string $prefix = '', + array $allowedMimes = ['image/jpeg', 'image/png', 'image/webp'] +): array { + if (!isset($_FILES[$fileKey]) || $_FILES[$fileKey]['error'] !== UPLOAD_ERR_OK) { + return ['success' => false, 'error' => 'File upload error']; + } + + $file = $_FILES[$fileKey]; + $maxSize = 5 * 1024 * 1024; // 5MB + + // حجم الملف + if ($file['size'] > $maxSize) { + return ['success' => false, 'error' => 'File too large (max 5MB)']; + } + + // MIME validation حقيقي (ليس extension فقط) + $finfo = new finfo(FILEINFO_MIME_TYPE); + $mimeType = $finfo->file($file['tmp_name']); + + if (!in_array($mimeType, $allowedMimes, true)) { + return ['success' => false, 'error' => "Invalid file type: $mimeType"]; + } + + // اسم ملف آمن وعشوائي + $ext = match ($mimeType) { + 'image/jpeg' => 'jpg', + 'image/png' => 'png', + 'image/webp' => 'webp', + default => 'bin', + }; + $filename = ($prefix ? "{$prefix}_" : '') . bin2hex(random_bytes(8)) . ".$ext"; + + if (!is_dir($targetDir)) { + mkdir($targetDir, 0750, true); + } + + $targetPath = rtrim($targetDir, '/') . '/' . $filename; + + if (!move_uploaded_file($file['tmp_name'], $targetPath)) { + return ['success' => false, 'error' => 'Failed to move uploaded file']; + } + + return ['success' => true, 'filename' => $filename, 'path' => $targetPath]; +} + +// ── تحميل ملف .env ─────────────────────────────────────────── +function loadEnvironment(string $path): void +{ + if (!file_exists($path)) { + error_log("[ENV] File not found: $path"); + return; + } + $lines = file($path, FILE_IGNORE_NEW_LINES | FILE_SKIP_EMPTY_LINES); + foreach ($lines as $line) { + if (str_starts_with(trim($line), '#')) continue; + if (!str_contains($line, '=')) continue; + [$key, $value] = explode('=', $line, 2); + $key = trim($key); + $value = trim($value, " \t\n\r\0\x0B\"'"); + if ($key && !getenv($key)) { + putenv("$key=$value"); + $_ENV[$key] = $value; + } + } +} + +// ── Logging منظم ────────────────────────────────────────────── +function securityLog(string $message, array $context = []): void +{ + $logDir = __DIR__ . '/../logs'; + if (!is_dir($logDir)) { + @mkdir($logDir, 0777, true); + } + $entry = date('Y-m-d H:i:s') . ' [SECURITY] ' . $message; + if ($context) $entry .= ' | ' . json_encode($context, JSON_UNESCAPED_UNICODE); + @error_log($entry . PHP_EOL, 3, $logDir . '/security.log'); +} + +function appLog(string $message, string $level = 'INFO'): void +{ + $logDir = __DIR__ . '/../logs'; + if (!is_dir($logDir)) { + @mkdir($logDir, 0777, true); + } + $entry = date('Y-m-d H:i:s') . " [$level] " . $message; + @error_log($entry . PHP_EOL, 3, $logDir . '/app.log'); +} + +function debugLog(string $message): void +{ + appLog($message, 'DEBUG'); +} diff --git a/backend/driver_assurance/add.php b/backend/driver_assurance/add.php new file mode 100755 index 0000000..9ea8363 --- /dev/null +++ b/backend/driver_assurance/add.php @@ -0,0 +1,35 @@ +encryptData($assured); +// $health_insurance_provider = $encryptionHelper->encryptData($health_insurance_provider); + +// SQL using bind parameters +$sql = "INSERT INTO `driver_health_assurance` ( + `driver_id`, + `assured`, + `health_insurance_provider` +) VALUES ( + :driver_id, + :assured, + :health_insurance_provider +)"; + +$stmt = $con->prepare($sql); +$stmt->bindParam(':driver_id', $driver_id); +$stmt->bindParam(':assured', $assured); +$stmt->bindParam(':health_insurance_provider', $health_insurance_provider); + +if ($stmt->execute()) { + jsonSuccess(null, "Health assurance data saved successfully"); +} else { + jsonError("Failed to save health assurance data"); +} +?> \ No newline at end of file diff --git a/backend/driver_assurance/get.php b/backend/driver_assurance/get.php new file mode 100755 index 0000000..e69de29 diff --git a/backend/driver_assurance/update.php b/backend/driver_assurance/update.php new file mode 100755 index 0000000..e69de29 diff --git a/backend/driver_socket.php b/backend/driver_socket.php new file mode 100644 index 0000000..9f24cfb --- /dev/null +++ b/backend/driver_socket.php @@ -0,0 +1,547 @@ +ping(); + return $redis; + } catch (\Exception $e) { + logMsg('⚠️ Redis ping failed, reconnecting...'); + $redis = null; + } + } + + try { + $client = new RedisClient([ + 'scheme' => 'tcp', + 'host' => '127.0.0.1', + 'port' => 6379, + 'password' => $redisPass, + 'read_write_timeout' => 0, + ]); + $client->connect(); + $redis = $client; + return $redis; + } catch (\Exception $e) { + logMsg('❌ Redis Error: ' . $e->getMessage()); + return null; + } +} + +// ============================================================ +// 📐 Haversine Distance (متر) +// ============================================================ +function haversineDistance(float $lat1, float $lng1, float $lat2, float $lng2): float { + $R = 6371000; + $dLat = deg2rad($lat2 - $lat1); + $dLng = deg2rad($lng2 - $lng1); + $a = sin($dLat / 2) ** 2 + + cos(deg2rad($lat1)) * cos(deg2rad($lat2)) * sin($dLng / 2) ** 2; + return $R * 2 * atan2(sqrt($a), sqrt(1 - $a)); +} + +// ============================================================ +// 📡 Forward موقع السائق → سيرفر الراكب (ASYNC) +// ============================================================ +function forwardLocationToPassengerSocket( + string $driverId, + string $passengerId, + array $payload, + string $internalKey, + array &$fwdThrottle +): void { + if (empty($passengerId)) return; + + $now = time(); + $last = $fwdThrottle[$driverId] ?? null; + + if ($last !== null) { + $timeDiff = $now - $last['ts']; + $dist = haversineDistance( + $last['lat'], $last['lng'], + (float)$payload['lat'], (float)$payload['lng'] + ); + if ($dist < FORWARD_MIN_METERS && $timeDiff < FORWARD_MAX_SECONDS) return; + } + + $fwdThrottle[$driverId] = [ + 'ts' => $now, + 'lat' => (float)$payload['lat'], + 'lng' => (float)$payload['lng'], + ]; + + $http = new AsyncHttp(); + $http->request( + 'http://127.0.0.1:3031', + [ + 'method' => 'POST', + 'data' => http_build_query([ + 'action' => 'update_driver_location', + 'passenger_id' => $passengerId, + 'payload' => json_encode($payload), + ]), + 'headers' => [ + 'Content-Type' => 'application/x-www-form-urlencoded', + 'x-internal-key' => $internalKey, + 'Connection' => 'close', + ], + 'timeout' => 3, + ], + null, + fn(\Exception $e) => logMsg('⚠️ Forward failed: ' . $e->getMessage()) + ); +} + +// ============================================================ +// 📲 FCM (ASYNC) +// ============================================================ +function sendFCM_Async(string $token, string $title, string $body, array $rideData): void { + if (empty($token)) return; + + $http = new AsyncHttp(); + $http->request( + 'https://api.intaleq.xyz/intaleq/ride/firebase/send_fcm.php', + [ + 'method' => 'POST', + 'data' => json_encode([ + 'target' => $token, + 'title' => $title, + 'body' => $body, + 'isTopic' => false, + 'category' => 'Order', + 'tone' => 'start', + 'passengerList' => json_encode($rideData), + ]), + 'headers' => ['Content-Type' => 'application/json; charset=UTF-8'], + 'timeout' => 5, + ], + null, + fn(\Exception $e) => logMsg('⚠️ FCM failed: ' . $e->getMessage()) + ); +} + +// ============================================================ +// 🧠 Memory State & Event Buffer +// ============================================================ +$connectedDrivers = []; +$active_orders_drivers = []; +$driverState = []; +$fwdThrottle = []; +$eventBuffer = []; // 🚀 Level 2: مصفوفة تجميع الأحداث لـ Redis + +// ============================================================ +// 🚀 Socket.IO — بورت 2020 +// ============================================================ +$io = new SocketIO(2020); + +// ============================================================ +// A. Internal HTTP Server & Redis Batch Processor (Worker Start) +// ============================================================ +$io->on('workerStart', function () use ($io, $INTERNAL_KEY) { + + // 🚀 1. Redis Pipeline Batch Processor (Level 2) + // يعمل كل نصف ثانية، يجمع كل الأوامر ويرسلها لـ Redis دفعة واحدة + Timer::add(REDIS_BATCH_INTERVAL, function() { + global $eventBuffer; + if (empty($eventBuffer)) return; + + $redis = getRedis(); + if (!$redis) return; + + try { + $pipe = $redis->pipeline(); + $processedCount = 0; + + foreach ($eventBuffer as $driverId => $ops) { + $profileKey = "driver:profile:$driverId"; + $processedCount++; + + if (isset($ops['hmset'])) { + $pipe->hmset($profileKey, $ops['hmset']); + } + if (isset($ops['expire'])) { + $pipe->expire($profileKey, $ops['expire']); + } + if (isset($ops['status_change'])) { + $oldStatus = $ops['status_change']['old']; + $newStatus = $ops['status_change']['new']; + + if ($oldStatus === 'on') $pipe->zrem('geo:drivers:busy', $driverId); + if ($oldStatus === 'off') $pipe->zrem('geo:drivers:available', $driverId); + + if ($newStatus === 'close' || $newStatus === 'blocked') { + $pipe->zrem('geo:drivers:available', $driverId); + $pipe->zrem('geo:drivers:busy', $driverId); + } + } + if (isset($ops['geoadd'])) { + $st = $ops['geoadd']['status']; + $lng = $ops['geoadd']['lng']; + $lat = $ops['geoadd']['lat']; + + if ($st === 'off') { + $pipe->geoadd('geo:drivers:available', $lng, $lat, $driverId); + } elseif ($st === 'on') { + $pipe->geoadd('geo:drivers:busy', $lng, $lat, $driverId); + } + } + } + + $pipe->execute(); + $eventBuffer = []; // إفراغ المصفوفة بعد التنفيذ الناجح + // logMsg("⚡ Processed Redis Batch: $processedCount drivers updated in 1 network call."); + + } catch (\Exception $e) { + logMsg("⚠️ Redis Pipeline Error: " . $e->getMessage()); + } + }); + + // 🌐 2. Internal HTTP Server — بورت 2021 + $innerHttp = new Worker('http://0.0.0.0:2021'); + + $innerHttp->onMessage = function ($connection, $request) use ($io, $INTERNAL_KEY) { + global $active_orders_drivers, $connectedDrivers; + + $headers = $request->header(); + if (($headers['x-internal-key'] ?? '') !== $INTERNAL_KEY) { + $connection->send('Unauthorized'); + return; + } + + $post = $request->post(); + $action = trim($post['action'] ?? ''); + $redis = getRedis(); + + // ── 1. Dispatch Order ──────────────────────────────── + if ($action === 'dispatch_order') { + $rideId = $post['ride_id'] ?? null; + $drivers = json_decode($post['drivers_ids'] ?? '[]', true); + $payload = $post['payload'] ?? []; + if (is_array($payload)) $payload = array_values($payload); + + if ($rideId && !empty($drivers)) { + $active_orders_drivers[$rideId] = $drivers; + logMsg("🚀 Dispatch Ride #$rideId → " . count($drivers) . ' drivers.'); + } + + foreach ($drivers as $driverId) { + if (!isset($connectedDrivers[$driverId])) continue; + $io->to('driver_' . $driverId)->emit('new_ride_request', $payload); + + $platform = $connectedDrivers[$driverId]['platform'] ?? 'android'; + $token = $connectedDrivers[$driverId]['token'] ?? ''; + if (!empty($token)) { + sendFCM_Async($token, 'طلب جديد', 'لديك رحلة جديدة قريبة منك', $payload); + } + } + $connection->send('Dispatched'); + + // ── 2. Market New Ride ──────────────────────────────── + } elseif ($action === 'market_new_ride') { + $payload = $post['payload'] ?? []; + $rideId = $payload['id'] ?? null; + $lat = (float)($payload['start_lat'] ?? 0); + $lng = (float)($payload['start_lng'] ?? 0); + + if (!$redis || !$rideId || $lat == 0 || $lng == 0) { + $connection->send('Error: Redis unavailable or invalid coords'); + return; + } + + $redis->geoadd('geo:rides:waiting', $lng, $lat, $rideId); + $nearbyDrivers = $redis->georadius('geo:drivers:available', $lng, $lat, 50, 'km'); + + $count = 0; + foreach ($nearbyDrivers as $driverId) { + if (isset($connectedDrivers[$driverId])) { + $io->to('driver_' . $driverId)->emit('market_new_ride', $payload); + $count++; + } + } + logMsg("📢 Market Ride #$rideId → $count drivers."); + $connection->send("Broadcasted to $count drivers"); + + // ── 3. Get Nearby Ride IDs ──────────────────────────── + } elseif ($action === 'get_nearby_ride_ids') { + $lat = (float)($post['lat'] ?? 0); + $lng = (float)($post['lng'] ?? 0); + $radius = (float)($post['radius'] ?? 9); + + if (!$redis) { $connection->send(json_encode([])); return; } + + $results = $redis->georadius( + 'geo:rides:waiting', $lng, $lat, $radius, 'km', + ['WITHDIST' => true, 'SORT' => 'ASC', 'COUNT' => 40] + ); + $connection->send(json_encode($results)); + + // ── 4. Ride Taken ───────────────────────────────────── + } elseif ($action === 'ride_taken_event') { + $rideId = $post['ride_id'] ?? null; + $winnerDriverId = $post['taken_by_driver_id'] ?? null; + + if (!$rideId) { $connection->send('Error: Missing ride_id'); return; } + + if ($redis) $redis->zrem('geo:rides:waiting', $rideId); + + $io->emit('ride_taken', [ + 'ride_id' => $rideId, + 'taken_by_driver_id' => $winnerDriverId, + ]); + + unset($active_orders_drivers[$rideId]); + logMsg("✅ Ride #$rideId taken by #$winnerDriverId."); + $connection->send('OK'); + + // ── 5. Force Disconnect ─────────────────────────────── + } elseif ($action === 'force_disconnect') { + $driverId = $post['driver_id'] ?? null; + + if ($driverId && isset($connectedDrivers[$driverId])) { + $connectedDrivers[$driverId]['conn']->disconnect(); + unset($connectedDrivers[$driverId]); + + if ($redis) { + $redis->zrem('geo:drivers:available', $driverId); + $redis->zrem('geo:drivers:busy', $driverId); + } + logMsg("🚫 Driver #$driverId force-disconnected."); + $connection->send('Disconnected'); + } else { + $connection->send('Driver not connected'); + } + + } else { + $connection->send('Unknown action'); + } + }; + + $innerHttp->listen(); +}); + +// ============================================================ +// B. WebSocket Events للسائقين +// ============================================================ +$io->on('connection', function ($socket) use ($INTERNAL_KEY) { + global $connectedDrivers, $driverState, $fwdThrottle, $eventBuffer; + + $query = $socket->handshake['query'] ?? []; + $driverId = $query['driver_id'] ?? null; + $platform = $query['platform'] ?? 'android'; + $token = $query['token'] ?? ''; + + if (!$driverId) { + $socket->disconnect(); + return; + } + + $socket->join('driver_' . $driverId); + $connectedDrivers[$driverId] = [ + 'conn' => $socket, + 'platform' => $platform, + 'token' => $token, + ]; + + if (!isset($driverState[$driverId])) { + $driverState[$driverId] = [ + 'lat' => 0.0, + 'lng' => 0.0, + 'speed' => -999.0, + 'heading' => -999.0, + 'status' => '', + 'expire_ts' => 0, + ]; + } + + logMsg("✅ Driver Connected: #$driverId ($platform)"); + + $socket->on('ping_alive', function () { + // Socket.IO handles pong automatically + }); + + $socket->on('update_location', function ($data) + use ($driverId, $INTERNAL_KEY, &$driverState, &$fwdThrottle, &$eventBuffer) + { + global $connectedDrivers; + + $data = (array) $data; + + $lat = isset($data['lat']) ? (float)$data['lat'] : null; + $lng = isset($data['lng']) ? (float)$data['lng'] : null; + $heading = (float)($data['heading'] ?? 0); + $speed = (float)($data['speed'] ?? 0); + $status = (string)($data['status'] ?? 'off'); + $distance = (float)($data['distance'] ?? 0); + $passengerId = (string)($data['passenger_id'] ?? ''); + $rideId = $data['ride_id'] ?? null; + + if ($lat === null || $lng === null) return; + + $state = &$driverState[$driverId]; + $now = time(); + + // 1. Forward للراكب (ASYNC + throttle) + if (!empty($passengerId)) { + forwardLocationToPassengerSocket( + $driverId, $passengerId, + [ + 'latitude' => $lat, + 'longitude' => $lng, + 'heading' => $heading, + 'speed' => $speed, + 'ride_id' => $rideId, + 'driver_id' => $driverId, + ], + $INTERNAL_KEY, $fwdThrottle + ); + } + + // 2. حساب ماذا تغيّر لتجنب ضغط Redis + $movedMeters = ($state['lat'] == 0.0 && $state['lng'] == 0.0) + ? 999.0 + : haversineDistance($state['lat'], $state['lng'], $lat, $lng); + + $didMove = $movedMeters >= MIN_MOVE_METERS; + $speedMs = $speed / 3.6; + $speedChanged = abs($speedMs - $state['speed']) >= HMSET_SPEED_DELTA; + $headingChanged = abs($heading - $state['heading']) >= HMSET_HEADING_DELTA; + $statusChanged = ($status !== $state['status']); + + $needHmset = $speedChanged || $headingChanged || $statusChanged; + $needGeoadd = $didMove; + $needExpireRefresh = ($now - $state['expire_ts']) >= EXPIRE_REFRESH_SECONDS; + + if (!$needHmset && (!$needGeoadd && !$statusChanged) && !$needExpireRefresh) { + return; // لم يتغير شيء مهم، تجاهل تماماً (0 عمليات Redis) + } + + // 🚀 3. Buffering Event بدل الإرسال المباشر لـ Redis (Level 2 Magic) + if (!isset($eventBuffer[$driverId])) { + $eventBuffer[$driverId] = []; + } + + if ($needHmset) { + $eventBuffer[$driverId]['hmset'] = [ + 'id' => $driverId, 'heading' => $heading, 'speed' => $speed, 'status' => $status, 'updated_at' => $now + ]; + $state['speed'] = $speedMs; + $state['heading'] = $heading; + } + + if ($needExpireRefresh || $needHmset) { + $eventBuffer[$driverId]['expire'] = 900; + $state['expire_ts'] = $now; + } + + if ($statusChanged) { + $eventBuffer[$driverId]['status_change'] = [ + 'old' => $state['status'], + 'new' => $status + ]; + $state['status'] = $status; + + // Auto disconnect if blocked + if ($status === 'blocked') { + if (isset($connectedDrivers[$driverId])) { + $connectedDrivers[$driverId]['conn']->disconnect(); + unset($connectedDrivers[$driverId]); + } + } + } + + if ($needGeoadd || $statusChanged) { + $eventBuffer[$driverId]['geoadd'] = [ + 'status' => $status, + 'lng' => $lng, + 'lat' => $lat + ]; + if ($needGeoadd) { + $state['lat'] = $lat; + $state['lng'] = $lng; + } + } + }); + + $socket->on('disconnect', function () use ($driverId) { + global $connectedDrivers, $driverState, $fwdThrottle; + + unset($connectedDrivers[$driverId]); + unset($driverState[$driverId]); + unset($fwdThrottle[$driverId]); + + logMsg("❌ Driver Disconnected: #$driverId"); + }); +}); + +Worker::runAll(); \ No newline at end of file diff --git a/backend/email/sendTripEmail.php b/backend/email/sendTripEmail.php new file mode 100755 index 0000000..eb9adc7 --- /dev/null +++ b/backend/email/sendTripEmail.php @@ -0,0 +1,119 @@ +authenticate(); +$EMAIL_ADDRESS = 'hamzaayed@intaleqapp.com'; + +// 2. استقبال البيانات وتطهيرها (Sanitization) +$passengerName = htmlspecialchars(filterRequest('name') ?? 'User', ENT_QUOTES, 'UTF-8'); +$passengerEmail = filter_var(filterRequest('email'), FILTER_SANITIZE_EMAIL); +$passengerPhone = htmlspecialchars(filterRequest('phone') ?? '', ENT_QUOTES, 'UTF-8'); +$fee = floatval(filterRequest('fee') ?? 0); +$startNameLocation = htmlspecialchars(filterRequest('startNameLocation') ?? '', ENT_QUOTES, 'UTF-8'); +$endNameLocation = htmlspecialchars(filterRequest('endNameLocation') ?? '', ENT_QUOTES, 'UTF-8'); +$timeOfTrip = htmlspecialchars(filterRequest('timeOfTrip') ?? date('Y-m-d H:i:s'), ENT_QUOTES, 'UTF-8'); + +if (!$passengerEmail || !filter_var($passengerEmail, FILTER_VALIDATE_EMAIL)) { + jsonError("Invalid email address"); +} + +$INTALEQ_SMTP_PASSWORD = getenv('INTALEQ_SMTP_PASSWORD'); + +// بناء محتوى الإيميل بتصميم عصري وبريميوم +$bodyEmail = " + + + + + + + +
+
+

INTALEQ

+

Your journey, our priority

+
+
+
Hello, $passengerName!
+

Thank you for choosing INTALEQ. Your trip has been successfully confirmed. Here is your digital receipt:

+ +
+
+ From: + $startNameLocation +
+
+ To: + $endNameLocation +
+
+ Date & Time: + $timeOfTrip +
+
+ Phone: + $passengerPhone +
+
+ +
+
Total Amount
+
$$fee
+
+ +

If you have any questions, feel free to contact our support team at any time.

+
+ +
+ +"; + +$mail = new PHPMailer(true); +try { + $mail->isSMTP(); + $mail->Host = 'smtp.hostinger.com'; + $mail->SMTPAuth = true; + $mail->Username = $EMAIL_ADDRESS; + $mail->Password = $INTALEQ_SMTP_PASSWORD; + $mail->SMTPSecure = PHPMailer::ENCRYPTION_STARTTLS; + $mail->Port = 587; + + $mail->setFrom($EMAIL_ADDRESS, 'INTALEQ'); + $mail->addAddress($passengerEmail, $passengerName); + $mail->isHTML(true); + $mail->Subject = 'Your INTALEQ Trip Details'; + $mail->Body = $bodyEmail; + + $mail->send(); + jsonSuccess(null, "Email sent successfully"); +} catch (Exception $e) { + jsonError("Failed to send email: " . $mail->ErrorInfo); +} \ No newline at end of file diff --git a/backend/encrypt_decrypt.php b/backend/encrypt_decrypt.php new file mode 100755 index 0000000..80187fd --- /dev/null +++ b/backend/encrypt_decrypt.php @@ -0,0 +1,108 @@ +key = $key; + $this->iv = $iv; + } + + // --------- النصوص ---------- + private function addPadding($data, $blockSize = 16) { + $pad = $blockSize - (strlen($data) % $blockSize); + return $data . str_repeat(chr($pad), $pad); + } + + private function removePadding($data) { + $pad = ord($data[strlen($data) - 1]); + return substr($data, 0, -$pad); + } + + public function encryptData($plainText) { + $plainText = mb_convert_encoding($plainText, 'UTF-8'); + $paddedText = $this->addPadding($plainText); + $encrypted = openssl_encrypt($paddedText, 'AES-256-CBC', $this->key, OPENSSL_RAW_DATA, $this->iv); + return base64_encode($encrypted); + } + + public function decryptData($encryptedText) { + $decoded = base64_decode($encryptedText, true); + + if ($decoded === false) { + error_log("[ERROR] base64_decode failed for input: $encryptedText"); + return false; + } + + $decrypted = openssl_decrypt($decoded, 'AES-256-CBC', $this->key, OPENSSL_RAW_DATA, $this->iv); + + if ($decrypted === false) { + error_log("[ERROR] openssl_decrypt failed for input: $encryptedText"); + return false; + } + + // Verify padding is valid before removal + $pad = ord($decrypted[strlen($decrypted) - 1]); + if ($pad < 1 || $pad > 16) { + error_log("[ERROR] Invalid padding value ($pad) for decrypted input: $encryptedText"); + return false; + } + + return substr($decrypted, 0, -$pad); +} + + public function decryptFile($encryptedFilePath, $destinationPath) { + if (!file_exists($encryptedFilePath)) { + throw new Exception("❌ الملف المشفر غير موجود: $encryptedFilePath"); + } + + $encryptedData = file_get_contents($encryptedFilePath); + $decryptedData = openssl_decrypt($encryptedData, 'AES-256-CBC', $this->key, OPENSSL_RAW_DATA, $this->iv); + + file_put_contents($destinationPath, $decryptedData); + return true; + } + public function encryptBinary($data) { + $encrypted = openssl_encrypt($data, 'AES-256-CBC', $this->key, OPENSSL_RAW_DATA, $this->iv); + return $encrypted; + } + + public function decryptBinary($data) { + $decrypted = openssl_decrypt($data, 'AES-256-CBC', $this->key, OPENSSL_RAW_DATA, $this->iv); + return $decrypted; + } +} +// ✅ Load the key and IV from .env or use default values + +// ✅ Ensure the lengths are correct + //echo "Key Length: " . $key . PHP_EOL; + //echo "IV Length: " . $iv . PHP_EOL; + +try { + $encryptionHelper = new EncryptionHelper($key, $iv); + + +} catch (Exception $e) { + echo "Error: " . $e->getMessage() . PHP_EOL; +} + +?> \ No newline at end of file diff --git a/backend/functions.php b/backend/functions.php new file mode 100755 index 0000000..7ea50f1 --- /dev/null +++ b/backend/functions.php @@ -0,0 +1,484 @@ + $action, + ...$data + ]; + + $ch = curl_init(); + curl_setopt($ch, CURLOPT_URL, $url); + curl_setopt($ch, CURLOPT_POST, 1); + curl_setopt($ch, CURLOPT_POSTFIELDS, http_build_query($postData)); + curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); + curl_setopt($ch, CURLOPT_TIMEOUT_MS, 500); // سريع جداً + curl_setopt($ch, CURLOPT_HTTPHEADER, ["x-internal-key: $INTERNAL_KEY"]); + curl_exec($ch); + curl_close($ch); +} + +function findBestDrivers($con, $lat, $lng, $carType) { + // 1. الاتصال بـ Redis لجلب الأقرب + $locationServerUrl = "https://location.intaleq.xyz/api_get_nearby.php"; + $INTERNAL_KEY = trim((string)@file_get_contents('/home/intaleq-api/.internal_socket_key')); + + $postData = ['lat' => $lat, 'lng' => $lng, 'radius' => 5, 'limit' => 100]; + + $ch = curl_init(); + curl_setopt($ch, CURLOPT_URL, $locationServerUrl); + curl_setopt($ch, CURLOPT_POST, 1); + curl_setopt($ch, CURLOPT_POSTFIELDS, http_build_query($postData)); + curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); + curl_setopt($ch, CURLOPT_TIMEOUT, 3); + curl_setopt($ch, CURLOPT_HTTPHEADER, ["x-internal-key: $INTERNAL_KEY"]); + + $response = curl_exec($ch); + $info = curl_getinfo($ch); + curl_close($ch); + + error_log("[findBestDrivers] HTTP Code: " . $info['http_code'] . " Response: " . $response); + + if ($info['http_code'] !== 200) return []; + + $json = json_decode($response, true); + $nearbyDrivers = ($json['status'] ?? false) ? $json['data'] : []; + + if (empty($nearbyDrivers)) return []; + + // 2. تجهيز البيانات للفلترة + $driverIds = []; + $redisMap = []; + foreach ($nearbyDrivers as $d) { + $driverIds[] = $d['id']; + $redisMap[$d['id']] = $d; + } + + $placeholders = implode(',', array_fill(0, count($driverIds), '?')); + + // تعريف الثوابت + $CAT_CAR = 1; $CAT_BIKE = 2; $CAT_VAN = 3; $FUEL_ELECTRIC = 3; + + // 3. الاستعلام (بدون platform) + $sql = "SELECT + d.id AS driver_id, + dt.token, + cr.year, + cr.vehicle_category_id, + d.gender + FROM driver d + JOIN CarRegistration cr ON cr.driverID = d.id + JOIN driverToken dt ON dt.captain_id = d.id + WHERE d.id IN ($placeholders) "; + + $carType = trim($carType); + switch ($carType) { + case 'Comfort': + $sql .= " AND cr.vehicle_category_id = $CAT_CAR AND CAST(TRIM(cr.year) AS UNSIGNED) > 2017 "; + break; + case 'Mishwar Vip': + $sql .= " AND cr.vehicle_category_id = $CAT_CAR AND CAST(TRIM(cr.year) AS UNSIGNED) > 2020 "; + break; + case 'Scooter': + case 'Pink Bike': + $sql .= " AND cr.vehicle_category_id = $CAT_BIKE "; + break; + case 'Electric': + $sql .= " AND cr.vehicle_category_id = $CAT_CAR AND cr.fuel_type_id = $FUEL_ELECTRIC "; + break; + case 'Lady': + $femaleHash = 'bQ6yWJ2EVXKZooHdGclvmFiDlZCM8UYeO+ILFjDUvpQ='; + $sql .= " AND cr.vehicle_category_id = $CAT_CAR AND d.gender = '$femaleHash' "; + break; + case 'Van': + $sql .= " AND cr.vehicle_category_id = $CAT_VAN "; + break; + case 'Awfar Car': + $sql .= " AND cr.vehicle_category_id = $CAT_CAR AND CAST(TRIM(cr.year) AS UNSIGNED) > 1995 "; + break; + case 'Fixed Price': + case 'Speed': + case 'Rayeh Gai': + default: + $sql .= " AND cr.vehicle_category_id = $CAT_CAR AND CAST(TRIM(cr.year) AS UNSIGNED) > 2000 "; + break; + } + + try { + $stmt = $con->prepare($sql); + $stmt->execute($driverIds); + $finalDrivers = $stmt->fetchAll(PDO::FETCH_ASSOC); + + // دمج البيانات + foreach ($finalDrivers as &$driver) { + $did = $driver['driver_id']; + if (isset($redisMap[$did])) { + $driver['distance_km'] = $redisMap[$did]['distance']; + $driver['lat'] = $redisMap[$did]['lat']; + $driver['lng'] = $redisMap[$did]['lng']; + } else { + $driver['distance_km'] = 999; + } + } + + // الترتيب + usort($finalDrivers, function($a, $b) { + return $a['distance_km'] <=> $b['distance_km']; + }); + + return array_slice($finalDrivers, 0, 30); + } catch (Exception $e) { + error_log("FindBestDrivers Error: " . $e->getMessage()); + return []; + } +} +// --- دالة مساعدة لمخاطبة سيرفر السائقين (Location Socket) --- +function notifyDriversRideTaken($rideId, $winnerDriverId) { + // رابط سيرفر السائقين الداخلي (نفس البورت المستخدم في driver_socket.php) + $url = "http://188.68.36.205:2021"; + $INTERNAL_KEY = trim((string)@file_get_contents('/home/intaleq-api/.internal_socket_key')); + + $postData = [ + 'action' => 'ride_taken_event', // هذا الأكشن الجديد في السوكيت + 'ride_id' => $rideId, + 'taken_by_driver_id' => $winnerDriverId + ]; + + $ch = curl_init(); + curl_setopt($ch, CURLOPT_URL, $url); + curl_setopt($ch, CURLOPT_POST, 1); + curl_setopt($ch, CURLOPT_POSTFIELDS, http_build_query($postData)); + curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); + curl_setopt($ch, CURLOPT_TIMEOUT_MS, 500); // نصف ثانية فقط، لا نريد تعطيل الـ API + curl_setopt($ch, CURLOPT_HTTPHEADER, ["x-internal-key: $INTERNAL_KEY"]); + + $response = curl_exec($ch); + curl_close($ch); +} +function notifyDriversOnLocationServer($drivers_ids_array, $payload, $rideId = null) { + // رابط سيرفر اللوكيشن الخارجي + $url = "http://188.68.36.205:2021"; + $INTERNAL_KEY = trim((string)@file_get_contents('/home/intaleq-api/.internal_socket_key')); + + $postData = [ + 'action' => 'dispatch_order', // اسم الحدث المتفق عليه في socket_server.php هناك + 'drivers_ids' => json_encode($drivers_ids_array), // نحول المصفوفة لنص JSON + 'ride_id' => $rideId ?? '', // ✅ تصحيح اسم المتغير + 'payload' => $payload + ]; + + $ch = curl_init(); + curl_setopt($ch, CURLOPT_URL, $url); + curl_setopt($ch, CURLOPT_POST, 1); + curl_setopt($ch, CURLOPT_POSTFIELDS, http_build_query($postData)); + curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); + curl_setopt($ch, CURLOPT_TIMEOUT_MS, 1000); // لا تنتظر أكثر من ثانية + curl_setopt($ch, CURLOPT_HTTPHEADER, [ + "x-internal-key: $INTERNAL_KEY" + ]); + + $response = curl_exec($ch); + + if (curl_errno($ch)) { + error_log("Curl Error (Location Socket): " . curl_error($ch)); + } + + curl_close($ch); + return $response; +} + +/** + * 🚀 دالة إشعار الراكب (تعمل على سيرفر الرحلات) + * تخاطب السوكيت الموجود محلياً على نفس السيرفر + */ +function notifyPassengerOnRideServer($passenger_id, $payload) { + // الرابط لسيرفر سوكيت الركاب — IP مباشر لتجاوز مشاكل الجدار الناري والدومين + $url = "http://188.68.36.205:3031"; + $INTERNAL_KEY = trim((string)@file_get_contents('/home/intaleq-api/.internal_socket_key')); + + if (empty($INTERNAL_KEY)) { + error_log("[SOCKET_CRITICAL] Internal key missing at /home/intaleq-api/.internal_socket_key"); + } + + $postData = [ + 'action' => 'update_ride_status', + 'passenger_id' => $passenger_id, + 'payload' => $payload + ]; + + $ch = curl_init(); + curl_setopt($ch, CURLOPT_URL, $url); + curl_setopt($ch, CURLOPT_POST, 1); + curl_setopt($ch, CURLOPT_POSTFIELDS, http_build_query($postData)); + curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); + curl_setopt($ch, CURLOPT_TIMEOUT_MS, 3000); + curl_setopt($ch, CURLOPT_HTTPHEADER, [ + "x-internal-key: $INTERNAL_KEY" + ]); + + $response = curl_exec($ch); + $httpCode = curl_getinfo($ch, CURLINFO_HTTP_CODE); + + if (curl_errno($ch)) { + error_log("[SOCKET_DEBUG] Curl Error (Passenger Socket) to $url: " . curl_error($ch)); + } else { + error_log("[SOCKET_DEBUG] Sent to Passenger Socket $url | HTTP: $httpCode | Response: $response | Passenger: $passenger_id"); + } + + curl_close($ch); + return $response; +} + +// ============================================================================ +// دالة توزيع الطلب (محدثة لاستخدام sendFCM_Internal) +// ============================================================================ +// ============================================================================ +// دالة توزيع الطلب (Dispatch Function) - النسخة المصححة +// ============================================================================ +function dispatchRideToDrivers($driversData, $rideId, $payloadTemplate, $startNameLoc, $encryptionHelper) { + $countDrivers = count($driversData); + error_log("🚀 [DISPATCH_START] RideID: $rideId | Drivers Count: $countDrivers"); + + $socketUrl = 'http://188.68.36.205:2021'; + $internalKeyPath = '/home/intaleq-api/.internal_socket_key'; + $internalKey = file_exists($internalKeyPath) ? trim((string)@file_get_contents($internalKeyPath)) : ''; + + foreach ($driversData as $driver) { + $driverId = $driver['driver_id']; + $rawToken = $driver['token'] ?? ''; + + error_log("--------------------------------------------------"); + error_log("👤 [DRIVER_PROCESS] Processing Driver ID: $driverId"); + + // 1. معالجة التوكن + $driverToken = processDriverToken($rawToken, $encryptionHelper); + + // تجهيز البيانات الخاصة بالسائق + $payloadForDriver = $payloadTemplate; + $payloadForDriver[6] = (string)$driverId; + $payloadForDriver[18] = (string)$driverId; + + // 2. إرسال السوكيت + sendSocketNotification($driverId, $rideId, $payloadForDriver, $socketUrl, $internalKey); + + // 3. إرسال FCM + if (!empty($driverToken)) { + $fcmData = [ + 'DriverList' => $payloadForDriver, + 'order_id' => (string)$rideId + ]; + $fcmResult = sendFcmNotification( + $driverToken, + "طلب جديد 🔔", + "هناك رحلة جديدة من " . $startNameLoc, + $fcmData, + "Order", + "ding" + ); + error_log("📲 [FCM_RESULT] " . json_encode($fcmResult)); + } else { + error_log("⚠️ [FCM_SKIP] No valid token for Driver $driverId"); + } + } + error_log("🏁 [DISPATCH_END] RideID: $rideId"); +} + +/** + * معالجة توكن السائق وفك تشفيره + */ +function processDriverToken($rawToken, $encryptionHelper) { + if (empty($rawToken)) { + error_log("🚫 [TOKEN_MISSING] No token found."); + return ''; + } + try { + $decrypted = $encryptionHelper->decryptData($rawToken); + if ($decrypted !== false && !empty($decrypted)) { + error_log("✅ [TOKEN_DECRYPT] Success."); + return trim($decrypted); + } + error_log("⚠️ [TOKEN_DECRYPT] Failed. Using Raw."); + return $rawToken; + } catch (Exception $e) { + error_log("❌ [TOKEN_EXCEPTION] Error. Using Raw."); + return $rawToken; + } +} + +/** + * إرسال إشعار السوكيت لسيرفر اللوكيشن + */ +function sendSocketNotification($driverId, $rideId, $payload, $url, $internalKey) { + $postData = [ + 'action' => 'dispatch_order', + 'drivers_ids' => json_encode([$driverId]), + 'ride_id' => $rideId, + 'payload' => $payload + ]; + + $ch = curl_init($url); + curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); + curl_setopt($ch, CURLOPT_POST, true); + curl_setopt($ch, CURLOPT_POSTFIELDS, http_build_query($postData)); + if (!empty($internalKey)) curl_setopt($ch, CURLOPT_HTTPHEADER, ["x-internal-key: $internalKey"]); + curl_setopt($ch, CURLOPT_TIMEOUT, 1); + curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, 1); + + $res = curl_exec($ch); + $httpCode = curl_getinfo($ch, CURLINFO_HTTP_CODE); + curl_close($ch); + + error_log("📡 [SOCKET_SEND] Driver $driverId | HTTP: $httpCode"); +} + +/** + * إرسال إشعار FCM الموحد + */ +function sendFcmNotification($token, $title, $body, $data, $category, $tone) { + if (class_exists('FcmService')) { + global $redis; + $fcmService = new FcmService($redis ?? null); + return $fcmService->send($token, $title, $body, $data, $category, $tone); + } elseif (function_exists('sendFCM_Internal')) { + return sendFCM_Internal($token, $title, $body, $data, $category, false, $tone); + } + return ['status' => 'error', 'message' => 'FCM service not loaded']; +} + + + + +function authenticateJWT(): object +{ + global $redis; + if (!class_exists('JwtService')) { + require_once __DIR__ . '/core/Auth/JwtService.php'; + } + $jwtService = new JwtService($redis ?? null); + return $jwtService->authenticate(); +} +define("MB", 1048576); + +/** + * Send WhatsApp message using your server's API + * + * @param string $to The recipient phone number (e.g., 96279xxxxxxx) + * @param string $message The message to send + * @return mixed API response object or false on failure + */ + +function sendWhatsAppFromServer($to, $message) +{ + // 1) قائمة السيرفرات المتاحة + $servers = [ + //"https://botmasa.intaleq.xyz/send",//mayar + // "https://botmasa2.intaleq.xyz/send",//shad + "https://bot5.intaleq.xyz/send",//ramat bus + "https://bot3.intaleq.xyz/send",//shahd + //"https://whatsapp.tripz-egypt.com/send"//tripz + ]; + + // 2) محاولة الإرسال (Primary -> Fallback) + $response = null; + $success = false; + + foreach ($servers as $url) { + $curl = curl_init(); + curl_setopt_array($curl, [ + CURLOPT_URL => $url, + CURLOPT_RETURNTRANSFER => true, + CURLOPT_TIMEOUT => 3, // مهلة قصيرة للمحاولة + CURLOPT_CUSTOMREQUEST => "POST", + CURLOPT_POSTFIELDS => json_encode([ + "to" => $to, + "message" => $message + ], JSON_UNESCAPED_UNICODE), + CURLOPT_HTTPHEADER => ["Content-Type: application/json"], + ]); + + $response = curl_exec($curl); + $err = curl_error($curl); + curl_close($curl); + + if (!$err) { + $success = true; + break; + } else { + error_log("[sendWhatsAppFromServer] Server $url failed, trying next... Error: $err"); + } + } + + if (!$success) return false; + return json_decode($response, true); +} + + + + + + +function sendFCM_Internal( + $target, + $title, + $body, + $customData = [], + $category = 'Order', + $isTopic = false, + $tone = 'order' +) { + global $redis; + if (!class_exists('FcmService')) { + require_once __DIR__ . '/core/Services/FcmService.php'; + } + $fcm = new FcmService($redis ?? null); + + return $fcm->send($target, $title, $body, is_array($customData) ? $customData : [], $category, $tone); +} + + + +function logAudit($con, $adminId, $action, $tableName = null, $recordId = null, $details = null) { + try { + if (empty($adminId)) { + $adminId = 'unknown_admin'; + } + $stmt = $con->prepare(" + INSERT INTO `admin_audit_log` (`admin_id`, `action`, `table_name`, `record_id`, `details`) + VALUES (:admin_id, :action, :table_name, :record_id, :details) + "); + $stmt->execute([ + ':admin_id' => $adminId, + ':action' => $action, + ':table_name' => $tableName, + ':record_id' => $recordId, + ':details' => is_array($details) ? json_encode($details, JSON_UNESCAPED_UNICODE) : $details + ]); + return true; + } catch (Exception $e) { + error_log("Audit Log Error: " . $e->getMessage()); + return $e->getMessage(); + } +} diff --git a/backend/get_connect.php b/backend/get_connect.php new file mode 100644 index 0000000..43b5f2b --- /dev/null +++ b/backend/get_connect.php @@ -0,0 +1,22 @@ +enforce(RateLimiter::identifier(), 'api'); + +// 3. الاتصال الافتراضي بقاعدة البيانات (Lazy Load) +try { + $con = Database::get('main'); +} catch (Exception $e) { + http_response_code(500); + exit(json_encode(['error' => 'Database connection failed'])); +} diff --git a/backend/ggg.php b/backend/ggg.php new file mode 100644 index 0000000..9030112 --- /dev/null +++ b/backend/ggg.php @@ -0,0 +1,78 @@ + 'error', + 'message' => 'Access denied for this admin phone.', + ]); + exit; +} + +// 3) التحقق من بقية المدخلات (action + text) +$action = $data['action'] ?? ''; +$text = trim($data['text'] ?? ''); + +if ($text === '' || ($action !== 'encrypt' && $action !== 'decrypt')) { + http_response_code(400); + echo json_encode([ + 'status' => 'error', + 'message' => 'Invalid input: need action=encrypt|decrypt and non-empty text.', + ]); + exit; +} + +// 4) تنفيذ التشفير / الفك +try { + // require_once __DIR__ . '/encrypt_decrypt.php'; + + if ($action === 'encrypt') { + $result = $encryptionHelper->encryptData($text); + } else { // decrypt + $result = $encryptionHelper->decryptData($text); + } + + echo json_encode([ + 'status' => 'success', + 'action' => $action, + 'result' => (string) $result, + ]); +} catch (Exception $e) { + http_response_code(500); + echo json_encode([ + 'status' => 'error', + 'message' => 'Operation failed.', + ]); +} \ No newline at end of file diff --git a/backend/git_push.sh b/backend/git_push.sh new file mode 100755 index 0000000..7569b84 --- /dev/null +++ b/backend/git_push.sh @@ -0,0 +1,17 @@ +#!/bin/zsh + +# الحصول على التاريخ الحالي +CURRENT_DATE=$(date +"%Y-%m-%d-%H") + +echo "--- 🚀 Starting Deployment ($CURRENT_DATE) ---" + +# إضافة جميع الملفات +git add . + +# تنفيذ الكوميت مع التاريخ +git commit -m "add new features like realtime $CURRENT_DATE" + +# الرفع إلى السيرفر +git push myserver main + +echo "--- ✅ Done ---" diff --git a/backend/imageForUsingApp/order_page.jpg b/backend/imageForUsingApp/order_page.jpg new file mode 100644 index 0000000..c8c6a3d Binary files /dev/null and b/backend/imageForUsingApp/order_page.jpg differ diff --git a/backend/instructions_web/animation.mp4 b/backend/instructions_web/animation.mp4 new file mode 100644 index 0000000..3db5d2a Binary files /dev/null and b/backend/instructions_web/animation.mp4 differ diff --git a/backend/instructions_web/delete_account.html b/backend/instructions_web/delete_account.html new file mode 100644 index 0000000..e999ef6 --- /dev/null +++ b/backend/instructions_web/delete_account.html @@ -0,0 +1,67 @@ + + + + + Delete Account + + + + + + App logo + +

Delete Account

+ + + +

To delete your account, please open the app and go to the Profile page. Then, tap on + the "Delete My Account" button and follow the instructions.

+ + +

+ © + All rights reserved by SEFER +

+ + + + + \ No newline at end of file diff --git a/backend/instructions_web/logo.gif b/backend/instructions_web/logo.gif new file mode 100644 index 0000000..4dd5d9c Binary files /dev/null and b/backend/instructions_web/logo.gif differ diff --git a/backend/instructions_web/logo.png b/backend/instructions_web/logo.png new file mode 100644 index 0000000..3e0026b Binary files /dev/null and b/backend/instructions_web/logo.png differ diff --git a/backend/intaleq_v1.code-workspace b/backend/intaleq_v1.code-workspace new file mode 100644 index 0000000..7909573 --- /dev/null +++ b/backend/intaleq_v1.code-workspace @@ -0,0 +1,20 @@ +{ + "folders": [ + { + "path": "." + }, + { + "path": "../../../development/App/Intaleq" + }, + { + "path": "../../../development/App/intaleq_driver" + }, + { + "path": "../../../development/App/intaleq_admin" + }, + { + "path": "../../../development/App/service_intaleq" + } + ], + "settings": {} +} \ No newline at end of file diff --git a/backend/intaleq_v1_secure_latest.md b/backend/intaleq_v1_secure_latest.md new file mode 100644 index 0000000..908030c --- /dev/null +++ b/backend/intaleq_v1_secure_latest.md @@ -0,0 +1,33608 @@ +# Intaleq V1 - Secure Latest Version + +## File: functions.php +``` + $action, + ...$data + ]; + + $ch = curl_init(); + curl_setopt($ch, CURLOPT_URL, $url); + curl_setopt($ch, CURLOPT_POST, 1); + curl_setopt($ch, CURLOPT_POSTFIELDS, http_build_query($postData)); + curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); + curl_setopt($ch, CURLOPT_TIMEOUT_MS, 500); // سريع جداً + curl_setopt($ch, CURLOPT_HTTPHEADER, ["x-internal-key: $INTERNAL_KEY"]); + curl_exec($ch); + curl_close($ch); +} + +function findBestDrivers($con, $lat, $lng, $carType) { + // 1. الاتصال بـ Redis لجلب الأقرب + $locationServerUrl = "https://location.intaleq.xyz/api_get_nearby.php"; + $INTERNAL_KEY = trim(@file_get_contents('/home/intaleq-api/.internal_socket_key')); + + $postData = ['lat' => $lat, 'lng' => $lng, 'radius' => 5, 'limit' => 100]; + + $ch = curl_init(); + curl_setopt($ch, CURLOPT_URL, $locationServerUrl); + curl_setopt($ch, CURLOPT_POST, 1); + curl_setopt($ch, CURLOPT_POSTFIELDS, http_build_query($postData)); + curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); + curl_setopt($ch, CURLOPT_TIMEOUT, 3); + curl_setopt($ch, CURLOPT_HTTPHEADER, ["x-internal-key: $INTERNAL_KEY"]); + + $response = curl_exec($ch); + $info = curl_getinfo($ch); + curl_close($ch); + + if ($info['http_code'] !== 200) return []; + + $json = json_decode($response, true); + $nearbyDrivers = ($json['status'] ?? false) ? $json['data'] : []; + + if (empty($nearbyDrivers)) return []; + + // 2. تجهيز البيانات للفلترة + $driverIds = []; + $redisMap = []; + foreach ($nearbyDrivers as $d) { + $driverIds[] = $d['id']; + $redisMap[$d['id']] = $d; + } + + $placeholders = implode(',', array_fill(0, count($driverIds), '?')); + + // تعريف الثوابت + $CAT_CAR = 1; $CAT_BIKE = 2; $CAT_VAN = 3; $FUEL_ELECTRIC = 3; + + // 3. الاستعلام (بدون platform) + $sql = "SELECT + d.id AS driver_id, + dt.token, + cr.year, + cr.vehicle_category_id, + d.gender + FROM driver d + JOIN CarRegistration cr ON cr.driverID = d.id + JOIN driverToken dt ON dt.captain_id = d.id + WHERE d.id IN ($placeholders) "; + + $carType = trim($carType); + switch ($carType) { + case 'Comfort': + $sql .= " AND cr.vehicle_category_id = $CAT_CAR AND CAST(TRIM(cr.year) AS UNSIGNED) > 2017 "; + break; + case 'Mishwar Vip': + $sql .= " AND cr.vehicle_category_id = $CAT_CAR AND CAST(TRIM(cr.year) AS UNSIGNED) > 2020 "; + break; + case 'Scooter': + case 'Pink Bike': + $sql .= " AND cr.vehicle_category_id = $CAT_BIKE "; + break; + case 'Electric': + $sql .= " AND cr.vehicle_category_id = $CAT_CAR AND cr.fuel_type_id = $FUEL_ELECTRIC "; + break; + case 'Lady': + $femaleHash = 'bQ6yWJ2EVXKZooHdGclvmFiDlZCM8UYeO+ILFjDUvpQ='; + $sql .= " AND cr.vehicle_category_id = $CAT_CAR AND d.gender = '$femaleHash' "; + break; + case 'Van': + $sql .= " AND cr.vehicle_category_id = $CAT_VAN "; + break; + case 'Awfar Car': + $sql .= " AND cr.vehicle_category_id = $CAT_CAR AND CAST(TRIM(cr.year) AS UNSIGNED) > 1995 "; + break; + case 'Fixed Price': + case 'Speed': + case 'Rayeh Gai': + default: + $sql .= " AND cr.vehicle_category_id = $CAT_CAR AND CAST(TRIM(cr.year) AS UNSIGNED) > 2000 "; + break; + } + + try { + $stmt = $con->prepare($sql); + $stmt->execute($driverIds); + $finalDrivers = $stmt->fetchAll(PDO::FETCH_ASSOC); + + // دمج البيانات + foreach ($finalDrivers as &$driver) { + $did = $driver['driver_id']; + if (isset($redisMap[$did])) { + $driver['distance_km'] = $redisMap[$did]['distance']; + $driver['lat'] = $redisMap[$did]['lat']; + $driver['lng'] = $redisMap[$did]['lng']; + } else { + $driver['distance_km'] = 999; + } + } + + // الترتيب + usort($finalDrivers, function($a, $b) { + return $a['distance_km'] <=> $b['distance_km']; + }); + + return array_slice($finalDrivers, 0, 30); + } catch (Exception $e) { + error_log("FindBestDrivers Error: " . $e->getMessage()); + return []; + } +} +// --- دالة مساعدة لمخاطبة سيرفر السائقين (Location Socket) --- +function notifyDriversRideTaken($rideId, $winnerDriverId) { + // رابط سيرفر السائقين الداخلي (نفس البورت المستخدم في driver_socket.php) + $url = getenv('LOCATION_SOCKET_URL'); + if (!$url) throw new RuntimeException('LOCATION_SOCKET_URL not configured'); + $INTERNAL_KEY = trim(@file_get_contents('/home/intaleq-api/.internal_socket_key')); + + $postData = [ + 'action' => 'ride_taken_event', // هذا الأكشن الجديد في السوكيت + 'ride_id' => $rideId, + 'taken_by_driver_id' => $winnerDriverId + ]; + + $ch = curl_init(); + curl_setopt($ch, CURLOPT_URL, $url); + curl_setopt($ch, CURLOPT_POST, 1); + curl_setopt($ch, CURLOPT_POSTFIELDS, http_build_query($postData)); + curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); + curl_setopt($ch, CURLOPT_TIMEOUT_MS, 500); // نصف ثانية فقط، لا نريد تعطيل الـ API + curl_setopt($ch, CURLOPT_HTTPHEADER, ["x-internal-key: $INTERNAL_KEY"]); + + $response = curl_exec($ch); + curl_close($ch); +} +function notifyDriversOnLocationServer($drivers_ids_array, $payload, $rideId = null) { + // رابط سيرفر اللوكيشن الخارجي + $url = getenv('LOCATION_SOCKET_URL'); + if (!$url) throw new RuntimeException('LOCATION_SOCKET_URL not configured'); + $INTERNAL_KEY = trim(@file_get_contents('/home/intaleq-api/.internal_socket_key')); + + $postData = [ + 'action' => 'dispatch_order', // اسم الحدث المتفق عليه في socket_server.php هناك + 'drivers_ids' => json_encode($drivers_ids_array), // نحول المصفوفة لنص JSON + 'ride_id' => $rideId ?? '', // ✅ تصحيح اسم المتغير + 'payload' => $payload + ]; + + $ch = curl_init(); + curl_setopt($ch, CURLOPT_URL, $url); + curl_setopt($ch, CURLOPT_POST, 1); + curl_setopt($ch, CURLOPT_POSTFIELDS, http_build_query($postData)); + curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); + curl_setopt($ch, CURLOPT_TIMEOUT_MS, 1000); // لا تنتظر أكثر من ثانية + curl_setopt($ch, CURLOPT_HTTPHEADER, [ + "x-internal-key: $INTERNAL_KEY" + ]); + + $response = curl_exec($ch); + + if (curl_errno($ch)) { + error_log("Curl Error (Location Socket): " . curl_error($ch)); + } + + curl_close($ch); + return $response; +} + +/** + * 🚀 دالة إشعار الراكب (تعمل على سيرفر الرحلات) + * تخاطب السوكيت الموجود محلياً على نفس السيرفر + */ +function notifyPassengerOnRideServer($passenger_id, $payload) { + // الرابط المحلي لسيرفر سوكيت الركاب + $url = getenv('PASSENGER_SOCKET_URL'); + if (!$url) { + error_log("[FATAL] PASSENGER_SOCKET_URL not configured"); + throw new RuntimeException('PASSENGER_SOCKET_URL not configured'); + } + $INTERNAL_KEY = trim(@file_get_contents('/home/intaleq-api/.internal_socket_key')); + + $postData = [ + 'action' => 'update_ride_status', + 'passenger_id' => $passenger_id, + 'payload' => $payload + ]; + + $ch = curl_init(); + curl_setopt($ch, CURLOPT_URL, $url); + curl_setopt($ch, CURLOPT_POST, 1); + curl_setopt($ch, CURLOPT_POSTFIELDS, http_build_query($postData)); + curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); + curl_setopt($ch, CURLOPT_TIMEOUT_MS, 1000); + curl_setopt($ch, CURLOPT_HTTPHEADER, [ + "x-internal-key: $INTERNAL_KEY" + ]); + + $response = curl_exec($ch); + + if (curl_errno($ch)) { + error_log("Curl Error (Passenger Socket): " . curl_error($ch)); + } + + curl_close($ch); + return $response; +} + +// ============================================================================ +// دالة توزيع الطلب (محدثة لاستخدام sendFCM_Internal) +// ============================================================================ +// ============================================================================ +// دالة توزيع الطلب (Dispatch Function) - النسخة المصححة +// ============================================================================ +function dispatchRideToDrivers($driversData, $rideId, $payloadTemplate, $startNameLoc, $encryptionHelper) { + $countDrivers = count($driversData); + error_log("🚀 [DISPATCH_START] RideID: $rideId | Drivers Count: $countDrivers"); + + $socketUrl = getenv('LOCATION_SOCKET_URL'); + if (!$socketUrl) throw new RuntimeException('LOCATION_SOCKET_URL not configured'); + + $internalKeyPath = '/home/intaleq-api/.internal_socket_key'; + $internalKey = file_exists($internalKeyPath) ? trim(file_get_contents($internalKeyPath)) : ''; + + foreach ($driversData as $driver) { + $driverId = $driver['driver_id']; + $rawToken = $driver['token'] ?? ''; + + error_log("--------------------------------------------------"); + error_log("👤 [DRIVER_PROCESS] Processing Driver ID: $driverId"); + + // 1. معالجة التوكن + $driverToken = processDriverToken($rawToken, $encryptionHelper); + + // تجهيز البيانات الخاصة بالسائق + $payloadForDriver = $payloadTemplate; + $payloadForDriver[6] = (string)$driverId; + $payloadForDriver[18] = (string)$driverId; + + // 2. إرسال السوكيت + sendSocketNotification($driverId, $rideId, $payloadForDriver, $socketUrl, $internalKey); + + // 3. إرسال FCM + if (!empty($driverToken)) { + $fcmData = [ + 'DriverList' => $payloadForDriver, + 'order_id' => (string)$rideId + ]; + $fcmResult = sendFcmNotification( + $driverToken, + "طلب جديد 🔔", + "هناك رحلة جديدة من " . $startNameLoc, + $fcmData, + "Order", + "ding" + ); + error_log("📲 [FCM_RESULT] " . json_encode($fcmResult)); + } else { + error_log("⚠️ [FCM_SKIP] No valid token for Driver $driverId"); + } + } + error_log("🏁 [DISPATCH_END] RideID: $rideId"); +} + +/** + * معالجة توكن السائق وفك تشفيره + */ +function processDriverToken($rawToken, $encryptionHelper) { + if (empty($rawToken)) { + error_log("🚫 [TOKEN_MISSING] No token found."); + return ''; + } + try { + $decrypted = $encryptionHelper->decryptData($rawToken); + if ($decrypted !== false && !empty($decrypted)) { + error_log("✅ [TOKEN_DECRYPT] Success."); + return trim($decrypted); + } + error_log("⚠️ [TOKEN_DECRYPT] Failed. Using Raw."); + return $rawToken; + } catch (Exception $e) { + error_log("❌ [TOKEN_EXCEPTION] Error. Using Raw."); + return $rawToken; + } +} + +/** + * إرسال إشعار السوكيت لسيرفر اللوكيشن + */ +function sendSocketNotification($driverId, $rideId, $payload, $url, $internalKey) { + $postData = [ + 'action' => 'dispatch_order', + 'drivers_ids' => json_encode([$driverId]), + 'ride_id' => $rideId, + 'payload' => $payload + ]; + + $ch = curl_init($url); + curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); + curl_setopt($ch, CURLOPT_POST, true); + curl_setopt($ch, CURLOPT_POSTFIELDS, http_build_query($postData)); + if (!empty($internalKey)) curl_setopt($ch, CURLOPT_HTTPHEADER, ["x-internal-key: $internalKey"]); + curl_setopt($ch, CURLOPT_TIMEOUT, 1); + curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, 1); + + $res = curl_exec($ch); + $httpCode = curl_getinfo($ch, CURLINFO_HTTP_CODE); + curl_close($ch); + + error_log("📡 [SOCKET_SEND] Driver $driverId | HTTP: $httpCode"); +} + +/** + * إرسال إشعار FCM الموحد + */ +function sendFcmNotification($token, $title, $body, $data, $category, $tone) { + if (class_exists('FcmService')) { + global $redis; + $fcmService = new FcmService($redis ?? null); + return $fcmService->send($token, $title, $body, $data, $category, $tone); + } elseif (function_exists('sendFCM_Internal')) { + return sendFCM_Internal($token, $title, $body, $data, $category, false, $tone); + } + return ['status' => 'error', 'message' => 'FCM service not loaded']; +} + + + +// ═══════════════════════════════════════════════════════════════ +// authenticateJWT() — النسخة النهائية الكاملة +// ─────────────────────────────────────────────────────────────── +// قائمة allowedFiles مبنية على هيكل الملفات الفعلي: +// intaleq_v1/ ← الجذر +// intaleq_v1/auth/ ← مشترك راكب/سائق +// intaleq_v1/auth/syria/ ← تسجيل سوريا +// intaleq_v1/auth/captin/ ← تسجيل السائق +// ═══════════════════════════════════════════════════════════════ + +function authenticateJWT(): object +{ + $secretKey = trim(file_get_contents('/home/intaleq-api/.secret_key')); + $hmacSecret = getenv('SECRET_KEY_HMAC'); + $fpPepper = getenv('FP_PEPPER'); + + if (!$secretKey || !$hmacSecret) { + http_response_code(500); + echo json_encode(['error' => 'Internal server configuration error.']); + exit; + } + + // ── 1. استخراج الـ JWT من Authorization header ───────────── + $authHeader = $_SERVER['HTTP_AUTHORIZATION'] ?? ''; + $token = null; + + if (preg_match('/Bearer\s(\S+)/', $authHeader, $matches)) { + $token = $matches[1]; + } + + if (!$token) { + http_response_code(401); + echo json_encode(['error' => 'Authorization token required']); + exit; + } + + // ── 2. فك التشفير والتحقق من التوقيع والصلاحية ───────────── + try { + $decoded = JWT::decode($token, new Key($secretKey, 'HS256')); + + } catch (ExpiredException $e) { + http_response_code(401); + echo json_encode(['error' => 'Token expired']); + exit; + + } catch (SignatureInvalidException $e) { + http_response_code(401); + echo json_encode(['error' => 'Invalid token signature']); + exit; + + } catch (BeforeValidException $e) { + http_response_code(401); + echo json_encode(['error' => 'Token not yet valid']); + exit; + + } catch (Exception $e) { + http_response_code(401); + echo json_encode(['error' => 'Invalid token']); + exit; + } + + // ── 3. التحقق من الـ Issuer ───────────────────────────────── + $expectedIssuer = getenv('APP_ISSUER') ; + if (($decoded->iss ?? '') !== $expectedIssuer) { + http_response_code(401); + echo json_encode(['error' => 'Invalid token issuer']); + exit; + } + + // استخراج user_id من الـ payload + $userId = $decoded->user_id ?? $decoded->sub ?? null; + if (!$userId) { + http_response_code(401); + echo json_encode(['error' => 'Invalid JWT payload']); + exit; + } + + // ── 4. فحص token_type ─────────────────────────────────────── + // توكن التسجيل (loginFirstTime) نوعه 'registration' + // مدته 150 ثانية فقط ومقيّد بـ endpoints التسجيل + // ─────────────────────────────────────────────────────────── + // ── 4. فحص token_type ─────────────────────────────────────── + $tokenType = $decoded->token_type ?? 'access'; + + // حل مؤقت: دمج صلاحيات 'registration' و 'new' على نفس القائمة البيضاء + if ($tokenType === 'registration' || $tokenType === 'new') { + + $allowedFiles = [ + 'loginFirstTime', + 'loginFirstTimeDriver', + 'checkPhoneNumberISVerfiedDriver', + 'checkPhoneNumberISVerfiedPassenger', + 'loginFromGooglePassenger', + 'otpmessage', + 'signup', + 'verifyEmail', + 'verifyOtpMessage', + 'sendVerifyEmail', + 'sendWhatsAppDriver', + 'register_passenger', + 'sendWhatsOpt', + 'verifyOtp', + 'auth_proxy', + 'addToken', + 'loginFromGoogle', + 'loginUsingCredentialsWithoutGoogle', + 'register', + 'sendOtpMessageDriver', + 'getTokensPassenger', + 'send_otp', + 'verify_otp', + ]; + + $currentFile = basename($_SERVER['PHP_SELF'], '.php'); + $isAllowed = false; + + foreach ($allowedFiles as $allowed) { + if (strcasecmp($currentFile, $allowed) === 0) { + $isAllowed = true; + break; + } + } + + if (!$isAllowed) { + error_log(sprintf( + '⚠️ [SECURITY] Auth token blocked | type=%s | file=%s | user=%s | IP=%s', + $tokenType, + $currentFile, + $userId, + $_SERVER['REMOTE_ADDR'] ?? 'unknown' + )); + http_response_code(403); + echo json_encode(['error' => 'Token not authorized for this action']); + exit; + } + } + + // ── 5. التحقق من بصمة الجهاز ─────────────────────────────── + // Flutter يرسل fp_encrypted في X-Device-FP header + // السيرفر يحسب: sha256(fp_encrypted + FP_PEPPER) + // يقارنه مع JWT.fingerPrint المخزن عند تسجيل الدخول + // ─────────────────────────────────────────────────────────── + // backward compatibility: + // توكنات قبل الأبديت ليس فيها fingerPrint → نسمح مؤقتاً + // بعد انتهاء كل التوكنات القديمة (15 دقيقة من النشر) + // احذف الشرط الداخلي واجعل الفحص إلزامياً دائماً + // ─────────────────────────────────────────────────────────── + if ($fpPepper) { + $fpInToken = $decoded->fingerPrint ?? null; + $fpHeader = $_SERVER['HTTP_X_DEVICE_FP'] ?? null; + + if ($fpInToken === null || $fpHeader === null) { + error_log(sprintf('⚠️ [SECURITY] Fingerprint missing | user=%s', $userId)); + http_response_code(403); + echo json_encode(['error' => 'Device verification required']); + exit; + } + + $expectedFp = hash('sha256', $fpHeader . $fpPepper); + + if (!hash_equals($expectedFp, $fpInToken)) { + error_log(sprintf( + '⚠️ [SECURITY] Device mismatch | user=%s | IP=%s', + $userId, + $_SERVER['REMOTE_ADDR'] ?? 'unknown' + )); + http_response_code(403); + echo json_encode(['error' => 'Device mismatch']); + exit; + } + } + + // ── 6. التحقق من الـ HMAC — للـ wallet فقط ───────────────── + // X-HMAC-Auth موجود فقط في طلبات المحفظة + // لو موجود → نتحقق منه إلزامياً + // ─────────────────────────────────────────────────────────── + $hmacHeader = $_SERVER['HTTP_X_HMAC_AUTH'] ?? null; + + if ($hmacHeader !== null) { + $expectedHmac = hash_hmac('sha256', $userId, $hmacSecret); + + if (!hash_equals($expectedHmac, $hmacHeader)) { + error_log(sprintf( + '⚠️ [SECURITY] HMAC mismatch | user=%s | IP=%s', + $userId, + $_SERVER['REMOTE_ADDR'] ?? 'unknown' + )); + http_response_code(403); + echo json_encode(['error' => 'Invalid HMAC']); + exit; + } + } + + // ✅ كل التحققات نجحت — نرجع الـ payload + return $decoded; +} +define("MB", 1048576); + +/** + * Send WhatsApp message using your server's API + * + * @param string $to The recipient phone number (e.g., 96279xxxxxxx) + * @param string $message The message to send + * @return mixed API response object or false on failure + */ + +function sendWhatsAppFromServer($to, $message) +{ + // 1) قائمة السيرفرات المتاحة + $servers = [ + //"https://botmasa.intaleq.xyz/send",//mayar + // "https://botmasa2.intaleq.xyz/send",//shad + "https://bot5.intaleq.xyz/send",//ramat bus + "https://bot3.intaleq.xyz/send",//shahd + //"https://whatsapp.tripz-egypt.com/send"//tripz + ]; + + // 2) محاولة الإرسال (Primary -> Fallback) + $response = null; + $success = false; + + foreach ($servers as $url) { + $curl = curl_init(); + curl_setopt_array($curl, [ + CURLOPT_URL => $url, + CURLOPT_RETURNTRANSFER => true, + CURLOPT_TIMEOUT => 3, // مهلة قصيرة للمحاولة + CURLOPT_CUSTOMREQUEST => "POST", + CURLOPT_POSTFIELDS => json_encode([ + "to" => $to, + "message" => $message + ], JSON_UNESCAPED_UNICODE), + CURLOPT_HTTPHEADER => ["Content-Type: application/json"], + ]); + + $response = curl_exec($curl); + $err = curl_error($curl); + curl_close($curl); + + if (!$err) { + $success = true; + break; + } else { + error_log("[sendWhatsAppFromServer] Server $url failed, trying next... Error: $err"); + } + } + + if (!$success) return false; + return json_decode($response, true); +} + +/* + $url, + CURLOPT_RETURNTRANSFER => true, + CURLOPT_ENCODING => '', + CURLOPT_MAXREDIRS => 10, + CURLOPT_TIMEOUT => 0, + CURLOPT_FOLLOWLOCATION => true, + CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1, + CURLOPT_CUSTOMREQUEST => 'GET', + CURLOPT_HTTPHEADER => [ + 'Content-Type: application/x-www-form-urlencoded' + ], + ]); + + // تنفيذ الطلب + $response = curl_exec($curl); + $err = curl_error($curl); + curl_close($curl); + + // التحقق من الأخطاء + if ($err) { + error_log("[sendWhatsAppFromServer] cURL Error: $err"); + return false; + } + + return $response; +} + +*/ + + +function debugLog($message) { + error_log($message); +} + +// [DELETED] filterRequest and imageUpload moved to core/helpers.php + + + + + + +function sendFCM_Internal( + $target, + $title, + $body, + $customData = [], + $category = 'Order', + $isTopic = false, + $tone = 'order' +) { + // مسار ملف الصلاحيات + $serviceAccountFile = __DIR__ . '/service-account.json'; + $tokenCacheFile = sys_get_temp_dir() . '/fcm_access_token.json'; + + // 1. الحصول على Access Token من الكاش أو من جوجل + $accessToken = getCachedAccessToken($serviceAccountFile, $tokenCacheFile); + if (!$accessToken) { + error_log("❌ [FCM] Failed to get Access Token."); + return ['status' => 'error', 'message' => 'Auth Failed']; + } + + // 2. جلب project_id وبناء رابط FCM + $creds = json_decode(file_get_contents($serviceAccountFile), true); + $projectId = $creds['project_id']; + $fcmUrl = "https://fcm.googleapis.com/v1/projects/$projectId/messages:send"; + + // ============================================================ + // 3. تجهيز الـ Data Payload الموحد (المهم لـ Flutter) + // ============================================================ + // نبدأ بالـ customData (مثلاً ride_id, driver_id, ... إلخ) + $finalData = is_array($customData) ? $customData : []; + + // نضيف الحقول القياسية التي سيقرأها Flutter دائماً + $finalData['title'] = $title; + $finalData['body'] = $body; + $finalData['tone'] = $tone; + $finalData['category'] = $category; // ✅ الحقل الرسمي الذي يتحقق منه Flutter + $finalData['type'] = $category; // (اختياري) للتماشي مع أي كود قديم + + // تحويل كل القيم إلى نصوص (شرط FCM: data values must be strings) + $processedData = []; + foreach ($finalData as $key => $val) { + if (is_array($val) || is_object($val)) { + $processedData[$key] = json_encode($val, JSON_UNESCAPED_UNICODE | JSON_UNESCAPED_SLASHES); + } else { + $processedData[$key] = (string)$val; + } + } + + // ============================================================ + // 4. بناء الرسالة: Data-Only (بدون Notification Block) + // ============================================================ + $messagePayload = [ + 'message' => [ + 'data' => $processedData, // ✅ كل شيء داخل data فقط + + 'android' => [ + 'priority' => 'HIGH', + ], + 'apns' => [ + 'headers' => [ + 'apns-priority' => '10', + 'apns-push-type' => 'background', + ], + 'payload' => [ + 'aps' => [ + 'content-available' => 1, + // لا نضع alert هنا حتى لا يظهر إشعار نظام تلقائي + ], + ], + ], + ], + ]; + + // تحديد المستلم (Token أو Topic) + if ($isTopic) { + $messagePayload['message']['topic'] = $target; + } else { + $messagePayload['message']['token'] = $target; + } + + // ============================================================ + // 5. الإرسال عبر CURL + // ============================================================ + $ch = curl_init($fcmUrl); + curl_setopt($ch, CURLOPT_POST, true); + curl_setopt($ch, CURLOPT_HTTPHEADER, [ + 'Authorization: Bearer ' . $accessToken, + 'Content-Type: application/json; charset=UTF-8', + ]); + curl_setopt($ch, CURLOPT_POSTFIELDS, json_encode($messagePayload, JSON_UNESCAPED_UNICODE)); + curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); + curl_setopt($ch, CURLOPT_TIMEOUT, 10); + + $result = curl_exec($ch); + $httpCode = curl_getinfo($ch, CURLINFO_HTTP_CODE); + + if (curl_errno($ch)) { + $error_msg = curl_error($ch); + curl_close($ch); + return ['status' => 'error', 'message' => 'CURL Error: ' . $error_msg]; + } + + curl_close($ch); + + if ($httpCode == 200) { + return ['status' => 'success', 'response' => json_decode($result, true)]; + } else { + error_log("❌ [FCM Error] Code: $httpCode | Response: $result"); + return ['status' => 'error', 'code' => $httpCode, 'response' => $result]; + } +} +// -------------------------------------------------------------------------- +// دوال مساعدة (Helper Functions) +// -------------------------------------------------------------------------- + +function getCachedAccessToken($credentialsPath, $cacheFile) { + global $redis; + + // 1. محاولة القراءة من Redis (أسرع وأكثر أماناً) + if ($redis) { + $token = $redis->get('fcm:access_token'); + if ($token) return $token; + } + + // 2. إذا لم يوجد، نطلب واحد جديد + $newToken = getGoogleAccessToken($credentialsPath); + + if ($newToken && $redis) { + // حفظ في Redis لمدة ساعة (3500 ثانية) + $redis->setex('fcm:access_token', 3500, $newToken); + } + + return $newToken; +} + +function getGoogleAccessToken($credentialsPath) { + if (!file_exists($credentialsPath)) return null; + + $credentials = json_decode(file_get_contents($credentialsPath), true); + $clientEmail = $credentials['client_email']; + $privateKey = $credentials['private_key']; + + $now = time(); + $header = rtrim(strtr(base64_encode(json_encode(['alg' => 'RS256', 'typ' => 'JWT'])), '+/', '-_'), '='); + $claim = rtrim(strtr(base64_encode(json_encode([ + 'iss' => $clientEmail, + 'scope' => 'https://www.googleapis.com/auth/firebase.messaging', + 'aud' => 'https://oauth2.googleapis.com/token', + 'exp' => $now + 3600, + 'iat' => $now + ])), '+/', '-_'), '='); + + $signature = ''; + openssl_sign("$header.$claim", $signature, $privateKey, 'SHA256'); + $jwt = "$header.$claim." . rtrim(strtr(base64_encode($signature), '+/', '-_'), '='); + + $ch = curl_init("https://oauth2.googleapis.com/token"); + curl_setopt($ch, CURLOPT_POST, 1); + curl_setopt($ch, CURLOPT_POSTFIELDS, http_build_query([ + 'grant_type' => 'urn:ietf:params:oauth:grant-type:jwt-bearer', + 'assertion' => $jwt + ])); + curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); + $res = curl_exec($ch); + curl_close($ch); + + return json_decode($res, true)['access_token'] ?? null; +} + + + + + +////////// + +function jsonError($message = "none") +{ + echo json_encode(array("status" => "failure", "message" => $message)); +} +function jsonSuccess($message = "none") +{ + echo json_encode(array("status" => "success", "message" => $message)); +} + +function result($count) +{ + if ($count > 0) { + jsonSuccess(); + } else { + jsonError(); + } +} + +function sendEmail($from,$to, $title, $body) +{ + $header = "From: $from" . "\n" . "CC: $from"; + mail($to, $title, $body, $header); +} + +``` + +## File: uploadImagePortrate.php +``` +enforce(RateLimiter::identifier($user_id ?? null), 'upload'); + + $driverID = filterRequest("driverID"); + appLog("📥 Received driverID: $driverID"); + + if (empty($driverID)) { + jsonError('Driver ID is required.', 400); + } + + // 2. استخدام دالة الرفع الآمنة (MIME check, random name, 5MB limit) + $target_dir = __DIR__ . "/portrate_captain_image/"; + $uploadResult = uploadImageSecure('image', $target_dir, $driverID); + + if (!$uploadResult['success']) { + securityLog("❌ Image upload failed", ['driverID' => $driverID, 'error' => $uploadResult['error']]); + jsonError($uploadResult['error'], 400); + } + + $new_filename = $uploadResult['filename']; + appLog("✅ File moved successfully to: " . $uploadResult['path']); + + // 3. تحديث قاعدة البيانات + $linkImage = 'https://intaleq.xyz/portrate_captain_image/' . $new_filename; + $uploadDate = date("Y-m-d H:i:s"); + + // تأكد من أن الاتصال قادم من connect.php أو اجلبه + $con = Database::get('main'); + + // التحقق من وجود السائق + $stmt = $con->prepare("SELECT COUNT(*) FROM card_images WHERE driverID = ?"); + $stmt->execute([$driverID]); + $count = $stmt->fetchColumn(); + + if ($count > 0) { + // تحديث + $updateSQL = "UPDATE card_images SET upload_date = ?, image_name = ?, link = ? WHERE driverID = ?"; + $updateStmt = $con->prepare($updateSQL); + $success = $updateStmt->execute([$uploadDate, $new_filename, $linkImage, $driverID]); + } else { + // إدخال جديد + $insertSQL = "INSERT INTO imageProfileCaptain (driverID, image_name, link) VALUES (?, ?, ?)"; + $insertStmt = $con->prepare($insertSQL); + $success = $insertStmt->execute([$driverID, $new_filename, $linkImage]); + } + + if ($success) { + appLog("✅ Record updated for driverID: $driverID"); + jsonSuccess(['file_link' => $linkImage], 'Record updated successfully.'); + } else { + appLog("❌ Failed to update DB record for driverID: $driverID"); + jsonError('Failed to update record.', 500); + } + +} catch (PDOException $e) { + securityLog("💥 PDO ERROR in uploadImage", ['error' => $e->getMessage()]); + jsonError('Database error.', 500); +} catch (Exception $e) { + securityLog("💥 GENERAL ERROR in uploadImage", ['error' => $e->getMessage()]); + jsonError('Server error.', 500); +} +``` + +## File: loginAdmin.php +``` +enforce(RateLimiter::identifier(), 'login'); + +try { + $id = filterRequest('id') ?? ''; + $password = filterRequest('password') ?? ''; + $audience = filterRequest('aud') ?? ''; + + $allowed1 = getenv('allowedDriver1'); + $allowed2 = getenv('allowedDriver2'); + $allowedAudiences = array_values(array_filter([$allowed1, $allowed2])); + + if (empty($id) || empty($password) || empty($audience)) { + jsonError('ID and password are required.', 400); + } + + if (!in_array($audience, $allowedAudiences, true)) { + jsonError('Invalid audience.', 400); + } + + $con = Database::get('main'); + + // ── جلب بيانات المشرف ──────────────────────────────────── + // ملاحظة: جدول admin_users سيتم إنشاؤه في Phase 4 (db_improvements.sql) + $stmt = $con->prepare("SELECT id, password, email, role FROM admin_users WHERE username = :id OR email = :id LIMIT 1"); + $stmt->execute([':id' => $id]); + $admin = $stmt->fetch(); + + $startTime = microtime(true); + + if ($admin && password_verify($password, $admin['password'])) { + + $limiter->reset(RateLimiter::identifier(), 'login'); + + $jwtService = new JwtService($redis); + + // استخدام Role المخصص أو 'admin' + $role = $admin['role'] ?? 'admin'; + + $jwt = $jwtService->generateAccessToken($admin['id'], $role, $audience); + $refresh = $jwtService->generateRefreshToken($admin['id']); + + jsonSuccess([ + 'jwt' => $jwt, + 'refresh_token' => $refresh['token'], + 'expires_in' => 900 + ]); + + } else { + // حماية من Timing Attack + $elapsed = microtime(true) - $startTime; + if ($elapsed < 0.1) usleep((int)((0.1 - $elapsed) * 1000000)); + + jsonError('Invalid ID or password.', 401); + } + +} catch (PDOException $e) { + securityLog("Admin Login PDO Error", ['msg' => $e->getMessage()]); + jsonError('Login failed: Database error', 500); +} catch (Exception $e) { + securityLog("Admin Login Error", ['msg' => $e->getMessage()]); + jsonError('Login failed: Server error', 500); +} +``` + +## File: schema_primary.sql +``` +-- MySQL dump 10.13 Distrib 8.0.43, for Linux (x86_64) +-- +-- Host: localhost Database: intaleqDB1 +-- ------------------------------------------------------ +-- Server version 8.0.43-0ubuntu0.22.04.2 + +/*!40101 SET @OLD_CHARACTER_SET_CLIENT=@@CHARACTER_SET_CLIENT */; +/*!40101 SET @OLD_CHARACTER_SET_RESULTS=@@CHARACTER_SET_RESULTS */; +/*!40101 SET @OLD_COLLATION_CONNECTION=@@COLLATION_CONNECTION */; +/*!50503 SET NAMES utf8mb4 */; +/*!40103 SET @OLD_TIME_ZONE=@@TIME_ZONE */; +/*!40103 SET TIME_ZONE='+00:00' */; +/*!40014 SET @OLD_UNIQUE_CHECKS=@@UNIQUE_CHECKS, UNIQUE_CHECKS=0 */; +/*!40014 SET @OLD_FOREIGN_KEY_CHECKS=@@FOREIGN_KEY_CHECKS, FOREIGN_KEY_CHECKS=0 */; +/*!40101 SET @OLD_SQL_MODE=@@SQL_MODE, SQL_MODE='NO_AUTO_VALUE_ON_ZERO' */; +/*!40111 SET @OLD_SQL_NOTES=@@SQL_NOTES, SQL_NOTES=0 */; + +-- +-- Table structure for table `CarRegistration` +-- + +DROP TABLE IF EXISTS `CarRegistration`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!50503 SET character_set_client = utf8mb4 */; +CREATE TABLE `CarRegistration` ( + `id` int NOT NULL AUTO_INCREMENT, + `driverID` varchar(100) CHARACTER SET utf8mb3 COLLATE utf8mb3_general_ci NOT NULL, + `vin` varchar(100) CHARACTER SET utf8mb3 COLLATE utf8mb3_general_ci NOT NULL, + `car_plate` varchar(150) CHARACTER SET utf8mb3 COLLATE utf8mb3_general_ci DEFAULT NULL, + `make` varchar(255) CHARACTER SET utf8mb3 COLLATE utf8mb3_general_ci NOT NULL, + `model` varchar(255) CHARACTER SET utf8mb3 COLLATE utf8mb3_general_ci NOT NULL, + `year` int NOT NULL, + `expiration_date` varchar(30) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL, + `color` varchar(255) CHARACTER SET utf8mb3 COLLATE utf8mb3_general_ci NOT NULL, + `owner` varchar(255) CHARACTER SET utf8mb3 COLLATE utf8mb3_general_ci NOT NULL, + `color_hex` varchar(20) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL, + `fuel` varchar(100) CHARACTER SET utf8mb3 COLLATE utf8mb3_general_ci NOT NULL, + `isDefault` tinyint(1) NOT NULL DEFAULT '0', + `created_at` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP, + `status` varchar(20) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL DEFAULT 'yet', + `vehicle_category_id` tinyint(1) DEFAULT '1', + `fuel_type_id` tinyint DEFAULT '1', + PRIMARY KEY (`id`), + KEY `idx_driverID` (`driverID`) +) ENGINE=InnoDB AUTO_INCREMENT=1796 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci; +/*!40101 SET character_set_client = @saved_cs_client */; + +-- +-- Table structure for table `adminUser` +-- + +DROP TABLE IF EXISTS `adminUser`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!50503 SET character_set_client = utf8mb4 */; +CREATE TABLE `adminUser` ( + `id` int NOT NULL AUTO_INCREMENT, + `device_number` varchar(300) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL, + `name` varchar(150) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL, + `created_at` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP, + `updated_at` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP, + PRIMARY KEY (`id`) +) ENGINE=InnoDB AUTO_INCREMENT=8 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci; +/*!40101 SET character_set_client = @saved_cs_client */; + +-- +-- Table structure for table `api_keys` +-- + +DROP TABLE IF EXISTS `api_keys`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!50503 SET character_set_client = utf8mb4 */; +CREATE TABLE `api_keys` ( + `id` int NOT NULL AUTO_INCREMENT, + `name` varchar(20) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL, + `hashed_key` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL, + PRIMARY KEY (`id`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci; +/*!40101 SET character_set_client = @saved_cs_client */; + +-- +-- Table structure for table `blacklist_driver` +-- + +DROP TABLE IF EXISTS `blacklist_driver`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!50503 SET character_set_client = utf8mb4 */; +CREATE TABLE `blacklist_driver` ( + `id` int NOT NULL AUTO_INCREMENT, + `driver_id` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL, + `phone` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL, + `reason` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT 'Violation', + `created_at` timestamp NULL DEFAULT CURRENT_TIMESTAMP, + PRIMARY KEY (`id`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci; +/*!40101 SET character_set_client = @saved_cs_client */; + +-- +-- Table structure for table `canecl` +-- + +DROP TABLE IF EXISTS `canecl`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!50503 SET character_set_client = utf8mb4 */; +CREATE TABLE `canecl` ( + `id` int NOT NULL AUTO_INCREMENT, + `driverID` varchar(111) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL, + `passengerID` varchar(111) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL, + `rideID` varchar(111) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL, + `note` varchar(200) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL DEFAULT 'nothing', + `created_at` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP, + PRIMARY KEY (`id`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci; +/*!40101 SET character_set_client = @saved_cs_client */; + +-- +-- Table structure for table `captains_car` +-- + +DROP TABLE IF EXISTS `captains_car`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!50503 SET character_set_client = utf8mb4 */; +CREATE TABLE `captains_car` ( + `id` int NOT NULL AUTO_INCREMENT, + `driverID` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL, + `vin` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL, + `car_plate` varchar(20) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL, + `make` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL, + `model` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL, + `year` varchar(6) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL, + `expiration_date` varchar(20) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL, + `color` varchar(30) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL, + `owner` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL, + `color_hex` char(15) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL, + `address` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL, + `displacement` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL, + `fuel` varchar(20) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL, + `registration_date` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL, + `isDefault` tinyint(1) NOT NULL DEFAULT '0', + `created_at` timestamp NULL DEFAULT CURRENT_TIMESTAMP, + PRIMARY KEY (`id`), + UNIQUE KEY `car_plate` (`car_plate`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci; +/*!40101 SET character_set_client = @saved_cs_client */; + +-- +-- Table structure for table `carPlateEdit` +-- + +DROP TABLE IF EXISTS `carPlateEdit`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!50503 SET character_set_client = utf8mb4 */; +CREATE TABLE `carPlateEdit` ( + `id` int NOT NULL AUTO_INCREMENT, + `driverId` varchar(50) NOT NULL, + `carPlate` varchar(155) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL, + `color` varchar(20) NOT NULL, + `make` varchar(50) NOT NULL, + `model` varchar(20) NOT NULL, + `expiration_date` varchar(50) NOT NULL, + `owner` varchar(155) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL, + `year` int NOT NULL, + `isEdit` tinyint(1) NOT NULL DEFAULT '0', + `employee` varchar(30) NOT NULL DEFAULT 'any', + `createdAt` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP, + PRIMARY KEY (`id`), + UNIQUE KEY `driverId` (`driverId`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci; +/*!40101 SET character_set_client = @saved_cs_client */; + +-- +-- Table structure for table `car_locations` +-- + +DROP TABLE IF EXISTS `car_locations`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!50503 SET character_set_client = utf8mb4 */; +CREATE TABLE `car_locations` ( + `driver_id` varchar(100) NOT NULL, + `latitude` decimal(10,7) NOT NULL, + `longitude` decimal(10,7) NOT NULL, + `heading` decimal(10,2) NOT NULL, + `speed` double(10,3) NOT NULL, + `distance` decimal(10,2) NOT NULL, + `status` varchar(6) NOT NULL DEFAULT 'off', + `carType` varchar(100) NOT NULL DEFAULT 'Awfar', + `created_at` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP, + `updated_at` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, + `location_point` point NOT NULL /*!80003 SRID 4326 */, + PRIMARY KEY (`driver_id`), + KEY `idx_loc_status_time` (`status`,`updated_at`,`latitude`,`longitude`), + SPATIAL KEY `idx_location_point` (`location_point`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb3; +/*!40101 SET character_set_client = @saved_cs_client */; +/*!50003 SET @saved_cs_client = @@character_set_client */ ; +/*!50003 SET @saved_cs_results = @@character_set_results */ ; +/*!50003 SET @saved_col_connection = @@collation_connection */ ; +/*!50003 SET character_set_client = utf8mb4 */ ; +/*!50003 SET character_set_results = utf8mb4 */ ; +/*!50003 SET collation_connection = utf8mb4_0900_ai_ci */ ; +/*!50003 SET @saved_sql_mode = @@sql_mode */ ; +/*!50003 SET sql_mode = 'NO_AUTO_VALUE_ON_ZERO' */ ; +DELIMITER ;; +/*!50003 CREATE*/ /*!50017 DEFINER=`intaleqUserDB1`@`%`*/ /*!50003 TRIGGER `trg_before_insert_car_locations` BEFORE INSERT ON `car_locations` FOR EACH ROW BEGIN +SET NEW.location_point = ST_PointFromText(CONCAT('POINT(', NEW.longitude, ' ', NEW.latitude, ')'), 4326); +END */;; +DELIMITER ; +/*!50003 SET sql_mode = @saved_sql_mode */ ; +/*!50003 SET character_set_client = @saved_cs_client */ ; +/*!50003 SET character_set_results = @saved_cs_results */ ; +/*!50003 SET collation_connection = @saved_col_connection */ ; +/*!50003 SET @saved_cs_client = @@character_set_client */ ; +/*!50003 SET @saved_cs_results = @@character_set_results */ ; +/*!50003 SET @saved_col_connection = @@collation_connection */ ; +/*!50003 SET character_set_client = utf8mb4 */ ; +/*!50003 SET character_set_results = utf8mb4 */ ; +/*!50003 SET collation_connection = utf8mb4_0900_ai_ci */ ; +/*!50003 SET @saved_sql_mode = @@sql_mode */ ; +/*!50003 SET sql_mode = 'NO_AUTO_VALUE_ON_ZERO' */ ; +DELIMITER ;; +/*!50003 CREATE*/ /*!50017 DEFINER=`intaleqUserDB1`@`%`*/ /*!50003 TRIGGER `trg_before_update_car_locations` BEFORE UPDATE ON `car_locations` FOR EACH ROW BEGIN +IF NEW.latitude <> OLD.latitude OR NEW.longitude <> OLD.longitude THEN +SET NEW.location_point = ST_PointFromText(CONCAT('POINT(', NEW.longitude, ' ', NEW.latitude, ')'), 4326); +END IF; +END */;; +DELIMITER ; +/*!50003 SET sql_mode = @saved_sql_mode */ ; +/*!50003 SET character_set_client = @saved_cs_client */ ; +/*!50003 SET character_set_results = @saved_cs_results */ ; +/*!50003 SET collation_connection = @saved_col_connection */ ; + +-- +-- Table structure for table `car_tracks` +-- + +DROP TABLE IF EXISTS `car_tracks`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!50503 SET character_set_client = utf8mb4 */; +CREATE TABLE `car_tracks` ( + `id` int NOT NULL AUTO_INCREMENT, + `driver_id` varchar(100) NOT NULL, + `latitude` decimal(10,7) NOT NULL, + `longitude` decimal(10,7) NOT NULL, + `heading` float DEFAULT NULL, + `speed` float DEFAULT NULL, + `distance` float DEFAULT NULL, + `status` enum('on','off') DEFAULT 'off', + `created_at` timestamp NULL DEFAULT CURRENT_TIMESTAMP, + PRIMARY KEY (`id`) +) ENGINE=InnoDB AUTO_INCREMENT=10484 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci; +/*!40101 SET character_set_client = @saved_cs_client */; + +-- +-- Table structure for table `card_images` +-- + +DROP TABLE IF EXISTS `card_images`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!50503 SET character_set_client = utf8mb4 */; +CREATE TABLE `card_images` ( + `id` int NOT NULL AUTO_INCREMENT, + `driverID` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL, + `image_name` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL, + `upload_date` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP, + `link` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL, + PRIMARY KEY (`id`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci; +/*!40101 SET character_set_client = @saved_cs_client */; + +-- +-- Table structure for table `carsToWork` +-- + +DROP TABLE IF EXISTS `carsToWork`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!50503 SET character_set_client = utf8mb4 */; +CREATE TABLE `carsToWork` ( + `id` int NOT NULL AUTO_INCREMENT, + `owner_name` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL, + `phone` varchar(70) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL, + `car_number` varchar(77) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL, + `manufacture_year` year DEFAULT NULL, + `car_model` varchar(77) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL, + `car_type` varchar(77) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL, + `site` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL, + `registration_date` date NOT NULL, + `created_at` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP, + PRIMARY KEY (`id`) +) ENGINE=InnoDB AUTO_INCREMENT=2 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci; +/*!40101 SET character_set_client = @saved_cs_client */; + +-- +-- Table structure for table `complaint` +-- + +DROP TABLE IF EXISTS `complaint`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!50503 SET character_set_client = utf8mb4 */; +CREATE TABLE `complaint` ( + `id` int NOT NULL AUTO_INCREMENT, + `ride_id` varchar(255) NOT NULL, + `passenger_id` varchar(255) DEFAULT NULL, + `driver_id` varchar(255) DEFAULT NULL, + `complaint_type` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL, + `description` text, + `date_filed` timestamp NULL DEFAULT CURRENT_TIMESTAMP, + `statusComplaint` enum('Open','In Progress','Resolved') NOT NULL DEFAULT 'Open', + `resolution` text, + `passenger_report` text, + `driver_report` text, + `cs_solutions` text, + `fault_determination` varchar(255) DEFAULT NULL, + `complaint_nature` varchar(255) DEFAULT NULL, + `date_resolved` timestamp NULL DEFAULT NULL, + PRIMARY KEY (`id`) +) ENGINE=InnoDB AUTO_INCREMENT=6 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci; +/*!40101 SET character_set_client = @saved_cs_client */; + +-- +-- Table structure for table `contactEgypt` +-- + +DROP TABLE IF EXISTS `contactEgypt`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!50503 SET character_set_client = utf8mb4 */; +CREATE TABLE `contactEgypt` ( + `id` int NOT NULL AUTO_INCREMENT, + `phones` varchar(20) NOT NULL, + `name` varchar(100) NOT NULL, + `phones2` varchar(60) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL, + `createdAt` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP, + PRIMARY KEY (`id`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci; +/*!40101 SET character_set_client = @saved_cs_client */; + +-- +-- Table structure for table `contactSyria` +-- + +DROP TABLE IF EXISTS `contactSyria`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!50503 SET character_set_client = utf8mb4 */; +CREATE TABLE `contactSyria` ( + `id` int NOT NULL AUTO_INCREMENT, + `driverId` varchar(255) NOT NULL COMMENT 'معرّف السائق الذي قام بمزامنة جهة الاتصال', + `name` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci DEFAULT NULL COMMENT 'اسم جهة الاتصال', + `phone` varchar(50) NOT NULL COMMENT 'رقم هاتف جهة الاتصال', + `sync_timestamp` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT 'وقت المزامنة', + PRIMARY KEY (`id`), + UNIQUE KEY `driver_contact_unique` (`driverId`,`phone`) +) ENGINE=InnoDB AUTO_INCREMENT=83699 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci; +/*!40101 SET character_set_client = @saved_cs_client */; + +-- +-- Table structure for table `criminalDocuments` +-- + +DROP TABLE IF EXISTS `criminalDocuments`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!50503 SET character_set_client = utf8mb4 */; +CREATE TABLE `criminalDocuments` ( + `id` int NOT NULL AUTO_INCREMENT, + `driverId` varchar(50) NOT NULL, + `IssueDate` varchar(20) NOT NULL, + `createdAt` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP, + `InspectionResult` varchar(100) NOT NULL, + PRIMARY KEY (`id`), + UNIQUE KEY `driverId` (`driverId`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci; +/*!40101 SET character_set_client = @saved_cs_client */; + +-- +-- Table structure for table `driver` +-- + +DROP TABLE IF EXISTS `driver`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!50503 SET character_set_client = utf8mb4 */; +CREATE TABLE `driver` ( + `idn` int NOT NULL AUTO_INCREMENT, + `id` varchar(100) NOT NULL, + `phone` varchar(255) CHARACTER SET utf8mb3 COLLATE utf8mb3_general_ci NOT NULL, + `email` varchar(255) NOT NULL, + `password` varchar(255) NOT NULL, + `gender` varchar(255) CHARACTER SET utf8mb3 COLLATE utf8mb3_general_ci NOT NULL DEFAULT 'Male', + `license_type` varchar(255) DEFAULT NULL, + `national_number` varchar(255) DEFAULT NULL, + `name_arabic` varchar(255) DEFAULT NULL, + `issue_date` date DEFAULT NULL, + `expiry_date` date DEFAULT NULL, + `license_categories` varchar(255) DEFAULT NULL, + `address` text, + `licenseIssueDate` varchar(50) DEFAULT NULL, + `status` varchar(20) NOT NULL DEFAULT 'notDeleted', + `birthdate` varchar(255) CHARACTER SET utf8mb3 COLLATE utf8mb3_general_ci NOT NULL, + `site` varchar(255) NOT NULL, + `first_name` varchar(255) NOT NULL, + `last_name` varchar(255) NOT NULL, + `accountBank` varchar(255) CHARACTER SET utf8mb3 COLLATE utf8mb3_general_ci NOT NULL DEFAULT 'yet', + `bankCode` varchar(255) CHARACTER SET utf8mb3 COLLATE utf8mb3_general_ci NOT NULL DEFAULT 'CIB', + `employmentType` varchar(255) CHARACTER SET utf8mb3 COLLATE utf8mb3_general_ci DEFAULT NULL, + `maritalStatus` varchar(50) CHARACTER SET utf8mb3 COLLATE utf8mb3_general_ci DEFAULT NULL, + `fullNameMaritial` varchar(255) DEFAULT NULL, + `expirationDate` varchar(50) CHARACTER SET utf8mb3 COLLATE utf8mb3_general_ci DEFAULT NULL, + `created_at` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP, + `updated_at` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, + PRIMARY KEY (`idn`), + UNIQUE KEY `national_number` (`national_number`) +) ENGINE=InnoDB AUTO_INCREMENT=2085 DEFAULT CHARSET=utf8mb3; +/*!40101 SET character_set_client = @saved_cs_client */; + +-- +-- Table structure for table `driverToken` +-- + +DROP TABLE IF EXISTS `driverToken`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!50503 SET character_set_client = utf8mb4 */; +CREATE TABLE `driverToken` ( + `id` int NOT NULL AUTO_INCREMENT, + `token` varchar(300) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL, + `captain_id` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL, + `fingerPrint` varchar(155) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL, + `created_at` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP, + PRIMARY KEY (`id`), + KEY `idx_captain_id` (`captain_id`) +) ENGINE=InnoDB AUTO_INCREMENT=1460 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci; +/*!40101 SET character_set_client = @saved_cs_client */; + +-- +-- Table structure for table `driverWallet` +-- + +DROP TABLE IF EXISTS `driverWallet`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!50503 SET character_set_client = utf8mb4 */; +CREATE TABLE `driverWallet` ( + `id` int NOT NULL AUTO_INCREMENT, + `driverID` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL, + `paymentID` varchar(200) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL, + `dateCreated` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP, + `amount` varchar(5) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL, + `paymentMethod` varchar(20) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL, + `dateUpdated` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP, + PRIMARY KEY (`id`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci; +/*!40101 SET character_set_client = @saved_cs_client */; + +-- +-- Table structure for table `driver_behavior` +-- + +DROP TABLE IF EXISTS `driver_behavior`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!50503 SET character_set_client = utf8mb4 */; +CREATE TABLE `driver_behavior` ( + `id` int NOT NULL, + `driver_id` varchar(255) NOT NULL, + `trip_id` varchar(255) NOT NULL, + `max_speed` double DEFAULT '0', + `avg_speed` double DEFAULT '0', + `hard_brakes` int DEFAULT '0', + `total_distance` double DEFAULT '0', + `behavior_score` double DEFAULT '0', + `created_at` timestamp NULL DEFAULT CURRENT_TIMESTAMP +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci; +/*!40101 SET character_set_client = @saved_cs_client */; + +-- +-- Table structure for table `driver_documents` +-- + +DROP TABLE IF EXISTS `driver_documents`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!50503 SET character_set_client = utf8mb4 */; +CREATE TABLE `driver_documents` ( + `id` int NOT NULL AUTO_INCREMENT, + `driverID` varchar(64) NOT NULL, + `doc_type` varchar(64) NOT NULL, + `image_name` varchar(255) NOT NULL, + `link` varchar(512) NOT NULL, + `upload_date` datetime NOT NULL, + PRIMARY KEY (`id`), + KEY `driverID` (`driverID`) +) ENGINE=InnoDB AUTO_INCREMENT=5089 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci; +/*!40101 SET character_set_client = @saved_cs_client */; + +-- +-- Table structure for table `driver_gifts` +-- + +DROP TABLE IF EXISTS `driver_gifts`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!50503 SET character_set_client = utf8mb4 */; +CREATE TABLE `driver_gifts` ( + `id` int NOT NULL AUTO_INCREMENT, + `driver_id` varchar(70) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL, + `gift_description` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL, + `gift_date` datetime DEFAULT CURRENT_TIMESTAMP, + `is_claimed` tinyint(1) DEFAULT '0', + PRIMARY KEY (`id`), + UNIQUE KEY `driver_id` (`driver_id`) +) ENGINE=InnoDB AUTO_INCREMENT=1377 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci; +/*!40101 SET character_set_client = @saved_cs_client */; + +-- +-- Table structure for table `driver_health_assurance` +-- + +DROP TABLE IF EXISTS `driver_health_assurance`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!50503 SET character_set_client = utf8mb4 */; +CREATE TABLE `driver_health_assurance` ( + `id` int NOT NULL AUTO_INCREMENT, + `driver_id` varchar(155) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL, + `assured` tinyint(1) DEFAULT '0', + `date_created` timestamp NULL DEFAULT CURRENT_TIMESTAMP, + `health_insurance_provider` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL, + PRIMARY KEY (`id`), + UNIQUE KEY `driver_id` (`driver_id`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci; +/*!40101 SET character_set_client = @saved_cs_client */; + +-- +-- Table structure for table `driver_orders` +-- + +DROP TABLE IF EXISTS `driver_orders`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!50503 SET character_set_client = utf8mb4 */; +CREATE TABLE `driver_orders` ( + `id` int NOT NULL AUTO_INCREMENT, + `driver_id` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL, + `order_id` varchar(99) CHARACTER SET utf8mb3 COLLATE utf8mb3_general_ci NOT NULL, + `notes` varchar(200) CHARACTER SET utf8mb3 COLLATE utf8mb3_general_ci NOT NULL DEFAULT 'nothing', + `created_at` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP, + `status` varchar(30) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT 'applied', + PRIMARY KEY (`id`) +) ENGINE=InnoDB AUTO_INCREMENT=286 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci; +/*!40101 SET character_set_client = @saved_cs_client */; + +-- +-- Table structure for table `driver_ride_scam` +-- + +DROP TABLE IF EXISTS `driver_ride_scam`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!50503 SET character_set_client = utf8mb4 */; +CREATE TABLE `driver_ride_scam` ( + `id` int NOT NULL AUTO_INCREMENT, + `driverID` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL, + `passengerID` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL, + `rideID` varchar(20) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL, + `isDriverCallPassenger` varchar(10) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL, + `dateCreated` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP, + PRIMARY KEY (`id`) +) ENGINE=InnoDB AUTO_INCREMENT=38 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci; +/*!40101 SET character_set_client = @saved_cs_client */; + +-- +-- Table structure for table `driversWantWork` +-- + +DROP TABLE IF EXISTS `driversWantWork`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!50503 SET character_set_client = utf8mb4 */; +CREATE TABLE `driversWantWork` ( + `id` int NOT NULL AUTO_INCREMENT, + `driver_name` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL, + `phone` varchar(77) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL, + `national_id` varchar(77) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL, + `birth_date` varchar(77) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL, + `license_type` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL, + `site` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL, + `created_at` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP, + PRIMARY KEY (`id`), + UNIQUE KEY `national_id` (`national_id`), + UNIQUE KEY `phone` (`phone`) +) ENGINE=InnoDB AUTO_INCREMENT=2 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci; +/*!40101 SET character_set_client = @saved_cs_client */; + +-- +-- Table structure for table `email_verifications` +-- + +DROP TABLE IF EXISTS `email_verifications`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!50503 SET character_set_client = utf8mb4 */; +CREATE TABLE `email_verifications` ( + `id` int NOT NULL AUTO_INCREMENT, + `email` varchar(255) NOT NULL, + `token` varchar(255) NOT NULL, + `created_at` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP, + `updated_at` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP, + `verified` tinyint(1) NOT NULL DEFAULT '0', + PRIMARY KEY (`id`), + UNIQUE KEY `email` (`email`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci; +/*!40101 SET character_set_client = @saved_cs_client */; + +-- +-- Table structure for table `employee` +-- + +DROP TABLE IF EXISTS `employee`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!50503 SET character_set_client = utf8mb4 */; +CREATE TABLE `employee` ( + `id` varchar(20) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL, + `name` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL, + `education` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL, + `site` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL, + `phone` varchar(20) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL, + `created_at` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP, + `status` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL, + PRIMARY KEY (`id`), + UNIQUE KEY `phone` (`phone`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci; +/*!40101 SET character_set_client = @saved_cs_client */; + +-- +-- Table structure for table `error` +-- + +DROP TABLE IF EXISTS `error`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!50503 SET character_set_client = utf8mb4 */; +CREATE TABLE `error` ( + `id` int NOT NULL AUTO_INCREMENT, + `error` varchar(400) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL, + `userId` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL, + `userType` varchar(30) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL, + `phone` varchar(20) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL, + `created_at` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP, + `device` varchar(300) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL, + `details` text CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci, + `status` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL DEFAULT 'new', + PRIMARY KEY (`id`), + KEY `idx_error_created_at` (`created_at`), + KEY `idx_error_phone` (`phone`) +) ENGINE=InnoDB AUTO_INCREMENT=115339 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci; +/*!40101 SET character_set_client = @saved_cs_client */; + +-- +-- Table structure for table `feedBack` +-- + +DROP TABLE IF EXISTS `feedBack`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!50503 SET character_set_client = utf8mb4 */; +CREATE TABLE `feedBack` ( + `id` int NOT NULL AUTO_INCREMENT, + `passengerId` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL, + `feedBack` text CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL, + `datecreated` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP, + PRIMARY KEY (`id`) +) ENGINE=InnoDB AUTO_INCREMENT=3 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci; +/*!40101 SET character_set_client = @saved_cs_client */; + +-- +-- Table structure for table `helpCenter` +-- + +DROP TABLE IF EXISTS `helpCenter`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!50503 SET character_set_client = utf8mb4 */; +CREATE TABLE `helpCenter` ( + `id` int NOT NULL AUTO_INCREMENT, + `driverID` varchar(89) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL, + `helpQuestion` varchar(300) CHARACTER SET utf8mb3 COLLATE utf8mb3_general_ci NOT NULL, + `replay` varchar(400) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL DEFAULT 'not yet', + `datecreated` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP, + PRIMARY KEY (`id`) +) ENGINE=InnoDB AUTO_INCREMENT=72 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci; +/*!40101 SET character_set_client = @saved_cs_client */; + +-- +-- Table structure for table `hotels` +-- + +DROP TABLE IF EXISTS `hotels`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!50503 SET character_set_client = utf8mb4 */; +CREATE TABLE `hotels` ( + `id` int NOT NULL, + `nameEnglish` varchar(255) DEFAULT NULL, + `nameArabic` varchar(255) DEFAULT NULL, + `phone` varchar(20) DEFAULT NULL, + `countReview` int DEFAULT NULL, + `rate` float DEFAULT NULL, + `stars` varchar(50) DEFAULT NULL, + `address` text, + `website` varchar(255) DEFAULT NULL, + `email` varchar(255) DEFAULT NULL, + `PlusCode` varchar(50) DEFAULT NULL, + `closeTime` varchar(50) DEFAULT NULL, + `latitude` decimal(10,6) DEFAULT NULL, + `longitude` decimal(10,6) DEFAULT NULL, + `instagram` varchar(255) DEFAULT NULL, + `facebook` varchar(255) DEFAULT NULL, + `linkedin` varchar(255) DEFAULT NULL, + `twitter` varchar(255) DEFAULT NULL, + `photo` varchar(255) DEFAULT NULL +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci; +/*!40101 SET character_set_client = @saved_cs_client */; + +-- +-- Table structure for table `imageProfileCaptain` +-- + +DROP TABLE IF EXISTS `imageProfileCaptain`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!50503 SET character_set_client = utf8mb4 */; +CREATE TABLE `imageProfileCaptain` ( + `id` int NOT NULL AUTO_INCREMENT, + `driverID` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL, + `image_name` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL, + `upload_date` datetime DEFAULT CURRENT_TIMESTAMP, + `link` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL, + PRIMARY KEY (`id`) +) ENGINE=InnoDB AUTO_INCREMENT=552 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci; +/*!40101 SET character_set_client = @saved_cs_client */; + +-- +-- Table structure for table `invites` +-- + +DROP TABLE IF EXISTS `invites`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!50503 SET character_set_client = utf8mb4 */; +CREATE TABLE `invites` ( + `id` int NOT NULL AUTO_INCREMENT, + `driverId` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL, + `inviterDriverPhone` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL, + `createdAt` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP, + `inviteCode` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL, + `isInstall` tinyint(1) NOT NULL DEFAULT '0', + `isGiftToken` tinyint(1) NOT NULL DEFAULT '0', + `expirationTime` datetime NOT NULL, + PRIMARY KEY (`id`), + UNIQUE KEY `inviterDriverId` (`inviterDriverPhone`), + UNIQUE KEY `inviteCode` (`inviteCode`) +) ENGINE=InnoDB AUTO_INCREMENT=129 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci; +/*!40101 SET character_set_client = @saved_cs_client */; + +-- +-- Table structure for table `invitesToPassengers` +-- + +DROP TABLE IF EXISTS `invitesToPassengers`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!50503 SET character_set_client = utf8mb4 */; +CREATE TABLE `invitesToPassengers` ( + `id` int NOT NULL AUTO_INCREMENT, + `driverId` varchar(70) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL, + `passengerID` varchar(80) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL DEFAULT 'yet', + `inviterPassengerPhone` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL, + `inviteCode` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL, + `expirationTime` datetime NOT NULL, + `createdAt` datetime DEFAULT CURRENT_TIMESTAMP, + `isInstall` tinyint(1) DEFAULT '0', + `isGiftToken` tinyint(1) NOT NULL DEFAULT '0', + PRIMARY KEY (`id`), + UNIQUE KEY `inviteCode` (`inviteCode`) +) ENGINE=InnoDB AUTO_INCREMENT=143 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci; +/*!40101 SET character_set_client = @saved_cs_client */; + +-- +-- Table structure for table `invoice_records` +-- + +DROP TABLE IF EXISTS `invoice_records`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!50503 SET character_set_client = utf8mb4 */; +CREATE TABLE `invoice_records` ( + `id` int NOT NULL AUTO_INCREMENT, + `driverID` int NOT NULL, + `invoice_number` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL, + `name` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL, + `amount` decimal(10,2) DEFAULT NULL, + `date` date DEFAULT NULL, + `image_link` text CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci, + `created_at` datetime DEFAULT NULL, + PRIMARY KEY (`id`) +) ENGINE=InnoDB AUTO_INCREMENT=36 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci; +/*!40101 SET character_set_client = @saved_cs_client */; + +-- +-- Table structure for table `invoicesAdmin` +-- + +DROP TABLE IF EXISTS `invoicesAdmin`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!50503 SET character_set_client = utf8mb4 */; +CREATE TABLE `invoicesAdmin` ( + `id` int NOT NULL AUTO_INCREMENT, + `item_name` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL, + `amount` decimal(10,2) NOT NULL, + `image_url` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL, + `created_at` timestamp NULL DEFAULT CURRENT_TIMESTAMP, + PRIMARY KEY (`id`) +) ENGINE=InnoDB AUTO_INCREMENT=22 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci; +/*!40101 SET character_set_client = @saved_cs_client */; + +-- +-- Table structure for table `kazan` +-- + +DROP TABLE IF EXISTS `kazan`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!50503 SET character_set_client = utf8mb4 */; +CREATE TABLE `kazan` ( + `id` int NOT NULL AUTO_INCREMENT, + `country` varchar(30) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL, + `kazan` varchar(10) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL, + `comfortPrice` varchar(10) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL, + `speedPrice` varchar(10) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL, + `familyPrice` varchar(4) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL, + `deliveryPrice` varchar(11) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL, + `freePrice` varchar(11) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL, + `latePrice` varchar(10) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL, + `heavyPrice` varchar(10) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL, + `adminId` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL, + `createdAt` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP, + `naturePrice` varchar(10) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL, + `fuelPrice` varchar(6) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL, + PRIMARY KEY (`id`) +) ENGINE=InnoDB AUTO_INCREMENT=2 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci; +/*!40101 SET character_set_client = @saved_cs_client */; + +-- +-- Table structure for table `lisenceDetails` +-- + +DROP TABLE IF EXISTS `lisenceDetails`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!50503 SET character_set_client = utf8mb4 */; +CREATE TABLE `lisenceDetails` ( + `id` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL, + `driverID` text CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL, + `name` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci DEFAULT NULL, + `licenseClass` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci DEFAULT NULL, + `documentNo` varchar(30) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci DEFAULT NULL, + `address` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci DEFAULT NULL, + `height` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci DEFAULT NULL, + `postalCode` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci DEFAULT NULL, + `sex` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci DEFAULT NULL, + `stateCode` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci DEFAULT NULL, + `expireDate` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci DEFAULT NULL, + `dateOfBirth` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci DEFAULT NULL, + `dateCreated` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP, + PRIMARY KEY (`id`), + UNIQUE KEY `documentNo` (`documentNo`) +) ENGINE=MyISAM DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci; +/*!40101 SET character_set_client = @saved_cs_client */; + +-- +-- Table structure for table `login_attempts` +-- + +DROP TABLE IF EXISTS `login_attempts`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!50503 SET character_set_client = utf8mb4 */; +CREATE TABLE `login_attempts` ( + `id` int NOT NULL AUTO_INCREMENT, + `ip_address` varchar(45) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL, + `attempt_time` timestamp NULL DEFAULT CURRENT_TIMESTAMP, + PRIMARY KEY (`id`) +) ENGINE=InnoDB AUTO_INCREMENT=18 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci; +/*!40101 SET character_set_client = @saved_cs_client */; + +-- +-- Table structure for table `login_attempts_drivers` +-- + +DROP TABLE IF EXISTS `login_attempts_drivers`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!50503 SET character_set_client = utf8mb4 */; +CREATE TABLE `login_attempts_drivers` ( + `id` int NOT NULL AUTO_INCREMENT, + `ip_address` varchar(45) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL, + `attempt_time` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP, + PRIMARY KEY (`id`) +) ENGINE=InnoDB AUTO_INCREMENT=11 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci; +/*!40101 SET character_set_client = @saved_cs_client */; + +-- +-- Table structure for table `mishwaritrips` +-- + +DROP TABLE IF EXISTS `mishwaritrips`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!50503 SET character_set_client = utf8mb4 */; +CREATE TABLE `mishwaritrips` ( + `id` int NOT NULL AUTO_INCREMENT, + `driverId` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL, + `phone` varchar(15) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL, + `gender` varchar(20) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL, + `name` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL, + `name_english` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL, + `address` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL, + `religion` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL, + `age` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL, + `startNameAddress` varchar(150) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL DEFAULT 'none', + `locationCoordinate` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL DEFAULT 'none', + `education` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL, + `license_type` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL, + `national_number` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL, + `car_plate` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL, + `make` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL, + `model` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL, + `color` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL, + `color_hex` char(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL, + `token` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL, + `rating` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL, + `countRide` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL, + `passengerId` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL, + `timeSelected` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL, + `createdAt` timestamp NULL DEFAULT CURRENT_TIMESTAMP, + `status` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT 'pending', + PRIMARY KEY (`id`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci; +/*!40101 SET character_set_client = @saved_cs_client */; + +-- +-- Table structure for table `notesForDriverService` +-- + +DROP TABLE IF EXISTS `notesForDriverService`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!50503 SET character_set_client = utf8mb4 */; +CREATE TABLE `notesForDriverService` ( + `id` int NOT NULL AUTO_INCREMENT, + `phone` varchar(70) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL, + `note` varchar(250) NOT NULL, + `editor` varchar(50) NOT NULL, + `createdAt` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP, + PRIMARY KEY (`id`), + UNIQUE KEY `phone` (`phone`) +) ENGINE=InnoDB AUTO_INCREMENT=1814 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci; +/*!40101 SET character_set_client = @saved_cs_client */; + +-- +-- Table structure for table `notesForPassengerService` +-- + +DROP TABLE IF EXISTS `notesForPassengerService`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!50503 SET character_set_client = utf8mb4 */; +CREATE TABLE `notesForPassengerService` ( + `id` int NOT NULL AUTO_INCREMENT, + `phone` int NOT NULL, + `note` varchar(250) NOT NULL, + `editor` varchar(50) NOT NULL, + `createdAt` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP, + PRIMARY KEY (`id`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci; +/*!40101 SET character_set_client = @saved_cs_client */; + +-- +-- Table structure for table `notificationCaptain` +-- + +DROP TABLE IF EXISTS `notificationCaptain`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!50503 SET character_set_client = utf8mb4 */; +CREATE TABLE `notificationCaptain` ( + `id` int NOT NULL AUTO_INCREMENT, + `driverID` varchar(80) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL, + `title` varchar(100) CHARACTER SET utf8mb3 COLLATE utf8mb3_general_ci NOT NULL, + `body` varchar(200) CHARACTER SET utf8mb3 COLLATE utf8mb3_general_ci NOT NULL, + `isShown` varchar(6) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL DEFAULT 'false', + `isPin` varchar(10) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL DEFAULT 'unPin', + `dateCreated` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP, + PRIMARY KEY (`id`) +) ENGINE=InnoDB AUTO_INCREMENT=6 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci; +/*!40101 SET character_set_client = @saved_cs_client */; + +-- +-- Table structure for table `notifications` +-- + +DROP TABLE IF EXISTS `notifications`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!50503 SET character_set_client = utf8mb4 */; +CREATE TABLE `notifications` ( + `id` int NOT NULL AUTO_INCREMENT, + `title` varchar(111) NOT NULL, + `body` varchar(265) NOT NULL, + `passenger_id` varchar(111) NOT NULL, + `isShown` varchar(255) CHARACTER SET utf8mb3 COLLATE utf8mb3_general_ci NOT NULL DEFAULT 'false', + `created_at` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP, + `updated_at` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, + PRIMARY KEY (`id`) +) ENGINE=InnoDB AUTO_INCREMENT=9 DEFAULT CHARSET=utf8mb3; +/*!40101 SET character_set_client = @saved_cs_client */; + +-- +-- Table structure for table `otp_verification_fingerPrint` +-- + +DROP TABLE IF EXISTS `otp_verification_fingerPrint`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!50503 SET character_set_client = utf8mb4 */; +CREATE TABLE `otp_verification_fingerPrint` ( + `id` int NOT NULL, + `phone` varchar(20) NOT NULL, + `otp` varchar(6) NOT NULL, + `createdAt` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci; +/*!40101 SET character_set_client = @saved_cs_client */; + +-- +-- Table structure for table `packageInfo` +-- + +DROP TABLE IF EXISTS `packageInfo`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!50503 SET character_set_client = utf8mb4 */; +CREATE TABLE `packageInfo` ( + `id` int NOT NULL AUTO_INCREMENT, + `platform` varchar(50) NOT NULL, + `appName` varchar(20) NOT NULL, + `createdAt` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP, + `version` varchar(10) NOT NULL, + PRIMARY KEY (`id`) +) ENGINE=InnoDB AUTO_INCREMENT=5 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci; +/*!40101 SET character_set_client = @saved_cs_client */; + +-- +-- Table structure for table `palces11` +-- + +DROP TABLE IF EXISTS `palces11`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!50503 SET character_set_client = utf8mb4 */; +CREATE TABLE `palces11` ( + `id` int NOT NULL AUTO_INCREMENT, + `latitude` varchar(50) NOT NULL, + `longitude` varchar(50) NOT NULL, + `name` varchar(180) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci DEFAULT NULL, + `name_ar` varchar(200) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci DEFAULT NULL, + `name_en` varchar(200) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci DEFAULT NULL, + `address` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci DEFAULT NULL, + `category` varchar(55) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci DEFAULT NULL, + `created_at` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP, + `location` point DEFAULT NULL, + PRIMARY KEY (`id`), + FULLTEXT KEY `idx_fulltext_search` (`name`,`name_ar`,`name_en`,`address`,`category`) +) ENGINE=InnoDB AUTO_INCREMENT=37946 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci; +/*!40101 SET character_set_client = @saved_cs_client */; + +-- +-- Table structure for table `passengerWallet` +-- + +DROP TABLE IF EXISTS `passengerWallet`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!50503 SET character_set_client = utf8mb4 */; +CREATE TABLE `passengerWallet` ( + `id` int NOT NULL AUTO_INCREMENT, + `passenger_id` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL, + `balance` decimal(10,2) NOT NULL, + `created_at` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP, + `updated_at` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, + PRIMARY KEY (`id`), + KEY `passenger_id` (`passenger_id`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci; +/*!40101 SET character_set_client = @saved_cs_client */; + +-- +-- Table structure for table `passenger_blacklist` +-- + +DROP TABLE IF EXISTS `passenger_blacklist`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!50503 SET character_set_client = utf8mb4 */; +CREATE TABLE `passenger_blacklist` ( + `id` bigint unsigned NOT NULL AUTO_INCREMENT, + `phone` varchar(150) NOT NULL, + `phone_normalized` varchar(64) NOT NULL, + `reason` varchar(255) DEFAULT NULL, + `expires_at` datetime DEFAULT CURRENT_TIMESTAMP, + `created_at` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP, + PRIMARY KEY (`id`), + UNIQUE KEY `uq_phone_norm` (`phone_normalized`), + KEY `idx_expires` (`expires_at`) +) ENGINE=InnoDB AUTO_INCREMENT=2 DEFAULT CHARSET=utf8mb3; +/*!40101 SET character_set_client = @saved_cs_client */; + +-- +-- Table structure for table `passengerlocation` +-- + +DROP TABLE IF EXISTS `passengerlocation`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!50503 SET character_set_client = utf8mb4 */; +CREATE TABLE `passengerlocation` ( + `id` int NOT NULL AUTO_INCREMENT, + `passengerId` varchar(60) NOT NULL, + `lat` varchar(20) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL, + `lng` varchar(20) NOT NULL, + `rideId` varchar(10) NOT NULL, + `createdAt` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP, + PRIMARY KEY (`id`) +) ENGINE=InnoDB AUTO_INCREMENT=725 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci; +/*!40101 SET character_set_client = @saved_cs_client */; + +-- +-- Table structure for table `passengers` +-- + +DROP TABLE IF EXISTS `passengers`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!50503 SET character_set_client = utf8mb4 */; +CREATE TABLE `passengers` ( + `id` varchar(100) NOT NULL, + `phone` varchar(150) CHARACTER SET utf8mb3 COLLATE utf8mb3_general_ci NOT NULL, + `email` varchar(255) NOT NULL, + `password` varchar(100) NOT NULL, + `gender` varchar(150) CHARACTER SET utf8mb3 COLLATE utf8mb3_general_ci NOT NULL, + `status` varchar(150) CHARACTER SET utf8mb3 COLLATE utf8mb3_general_ci NOT NULL DEFAULT 'notDeleted', + `birthdate` varchar(150) CHARACTER SET utf8mb3 COLLATE utf8mb3_general_ci NOT NULL, + `site` varchar(255) NOT NULL, + `first_name` varchar(255) NOT NULL, + `last_name` varchar(255) NOT NULL, + `sosPhone` varchar(150) CHARACTER SET utf8mb3 COLLATE utf8mb3_general_ci NOT NULL DEFAULT 'sos', + `education` varchar(150) CHARACTER SET utf8mb3 COLLATE utf8mb3_general_ci NOT NULL DEFAULT 'none', + `employmentType` varchar(150) CHARACTER SET utf8mb3 COLLATE utf8mb3_general_ci NOT NULL DEFAULT 'none', + `maritalStatus` varchar(150) CHARACTER SET utf8mb3 COLLATE utf8mb3_general_ci NOT NULL DEFAULT 'none', + `created_at` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP, + `updated_at` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, + PRIMARY KEY (`id`), + UNIQUE KEY `phone` (`phone`,`email`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb3; +/*!40101 SET character_set_client = @saved_cs_client */; + +-- +-- Table structure for table `payment_tokens` +-- + +DROP TABLE IF EXISTS `payment_tokens`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!50503 SET character_set_client = utf8mb4 */; +CREATE TABLE `payment_tokens` ( + `id` int NOT NULL AUTO_INCREMENT, + `token` varchar(255) NOT NULL, + `driverID` varchar(255) NOT NULL, + `dateCreated` datetime NOT NULL, + `amount` decimal(10,2) NOT NULL, + `isUsed` tinyint(1) DEFAULT '0', + PRIMARY KEY (`id`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci; +/*!40101 SET character_set_client = @saved_cs_client */; + +-- +-- Table structure for table `payment_tokens_passenger` +-- + +DROP TABLE IF EXISTS `payment_tokens_passenger`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!50503 SET character_set_client = utf8mb4 */; +CREATE TABLE `payment_tokens_passenger` ( + `id` int NOT NULL AUTO_INCREMENT, + `token` varchar(255) NOT NULL, + `passengerId` varchar(255) NOT NULL, + `dateCreated` datetime NOT NULL, + `amount` decimal(10,2) NOT NULL, + `isUsed` tinyint(1) DEFAULT '0', + PRIMARY KEY (`id`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci; +/*!40101 SET character_set_client = @saved_cs_client */; + +-- +-- Table structure for table `payments` +-- + +DROP TABLE IF EXISTS `payments`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!50503 SET character_set_client = utf8mb4 */; +CREATE TABLE `payments` ( + `id` varchar(111) NOT NULL, + `amount` decimal(10,2) NOT NULL, + `payment_method` varchar(255) NOT NULL, + `passengerID` varchar(100) NOT NULL, + `rideId` varchar(100) NOT NULL, + `driverID` varchar(100) NOT NULL, + `created_at` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP, + `updated_at` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, + `isGiven` varchar(20) NOT NULL DEFAULT 'waiting', + PRIMARY KEY (`id`), + UNIQUE KEY `rideId` (`rideId`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb3; +/*!40101 SET character_set_client = @saved_cs_client */; + +-- +-- Table structure for table `paymentsDriverPoints` +-- + +DROP TABLE IF EXISTS `paymentsDriverPoints`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!50503 SET character_set_client = utf8mb4 */; +CREATE TABLE `paymentsDriverPoints` ( + `id` int NOT NULL AUTO_INCREMENT, + `amount` decimal(10,2) NOT NULL, + `payment_method` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL, + `driverID` varchar(60) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL, + `created_at` datetime DEFAULT CURRENT_TIMESTAMP, + `updated_at` datetime DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, + PRIMARY KEY (`id`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci; +/*!40101 SET character_set_client = @saved_cs_client */; + +-- +-- Table structure for table `phone_verification` +-- + +DROP TABLE IF EXISTS `phone_verification`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!50503 SET character_set_client = utf8mb4 */; +CREATE TABLE `phone_verification` ( + `id` int NOT NULL AUTO_INCREMENT, + `phone_number` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL, + `driverId` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL DEFAULT 'yet', + `email` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL DEFAULT 'yet', + `token_code` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci DEFAULT NULL, + `expiration_time` datetime DEFAULT NULL, + `is_verified` tinyint(1) DEFAULT '0', + `created_at` timestamp NULL DEFAULT CURRENT_TIMESTAMP, + PRIMARY KEY (`id`) +) ENGINE=InnoDB AUTO_INCREMENT=10531 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci; +/*!40101 SET character_set_client = @saved_cs_client */; + +-- +-- Table structure for table `phone_verification_passenger` +-- + +DROP TABLE IF EXISTS `phone_verification_passenger`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!50503 SET character_set_client = utf8mb4 */; +CREATE TABLE `phone_verification_passenger` ( + `id` int NOT NULL AUTO_INCREMENT, + `phone_number` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci DEFAULT NULL, + `token` varchar(255) DEFAULT NULL, + `expiration_time` varchar(255) DEFAULT NULL, + `verified` tinyint(1) DEFAULT '0', + `created_at` timestamp NULL DEFAULT CURRENT_TIMESTAMP, + `status` varchar(22) NOT NULL DEFAULT 'yet', + PRIMARY KEY (`id`) +) ENGINE=InnoDB AUTO_INCREMENT=7304 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci; +/*!40101 SET character_set_client = @saved_cs_client */; + +-- +-- Table structure for table `places` +-- + +DROP TABLE IF EXISTS `places`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!50503 SET character_set_client = utf8mb4 */; +CREATE TABLE `places` ( + `id` int NOT NULL AUTO_INCREMENT, + `latitude` double NOT NULL, + `longitude` double NOT NULL, + `name` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL, + `name_ar` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL, + `name_en` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL, + `address` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL, + `category` varchar(200) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL, + `created_at` timestamp NULL DEFAULT CURRENT_TIMESTAMP, + PRIMARY KEY (`id`) +) ENGINE=InnoDB AUTO_INCREMENT=70783 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci; +/*!40101 SET character_set_client = @saved_cs_client */; + +-- +-- Table structure for table `placesEgypt` +-- + +DROP TABLE IF EXISTS `placesEgypt`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!50503 SET character_set_client = utf8mb4 */; +CREATE TABLE `placesEgypt` ( + `id` int NOT NULL, + `nameEnglish` varchar(255) DEFAULT NULL, + `nameArabic` varchar(255) DEFAULT NULL, + `phone` varchar(20) DEFAULT NULL, + `countReview` int DEFAULT NULL, + `rate` float DEFAULT NULL, + `stars` varchar(50) DEFAULT NULL, + `address` text, + `website` varchar(255) DEFAULT NULL, + `email` varchar(255) DEFAULT NULL, + `PlusCode` varchar(50) DEFAULT NULL, + `closeTime` varchar(50) DEFAULT NULL, + `latitude` decimal(10,6) DEFAULT NULL, + `longitude` decimal(10,6) DEFAULT NULL, + `instagram` varchar(255) DEFAULT NULL, + `facebook` varchar(255) DEFAULT NULL, + `linkedin` varchar(255) DEFAULT NULL, + `twitter` varchar(255) DEFAULT NULL, + `photo` varchar(255) DEFAULT NULL +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci; +/*!40101 SET character_set_client = @saved_cs_client */; + +-- +-- Table structure for table `promos` +-- + +DROP TABLE IF EXISTS `promos`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!50503 SET character_set_client = utf8mb4 */; +CREATE TABLE `promos` ( + `id` int NOT NULL AUTO_INCREMENT, + `promo_code` varchar(14) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL, + `amount` varchar(4) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL DEFAULT '0', + `description` varchar(100) CHARACTER SET utf8mb3 COLLATE utf8mb3_general_ci DEFAULT NULL, + `passengerID` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL DEFAULT 'none', + `validity_start_date` date DEFAULT NULL, + `validity_end_date` date DEFAULT NULL, + PRIMARY KEY (`id`), + UNIQUE KEY `passengerID` (`passengerID`) +) ENGINE=InnoDB AUTO_INCREMENT=637 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci; +/*!40101 SET character_set_client = @saved_cs_client */; + +-- +-- Table structure for table `promptDriverIDEgypt` +-- + +DROP TABLE IF EXISTS `promptDriverIDEgypt`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!50503 SET character_set_client = utf8mb4 */; +CREATE TABLE `promptDriverIDEgypt` ( + `id` int NOT NULL AUTO_INCREMENT, + `type` varchar(30) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL, + `prompt` longtext CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL, + `createdAt` timestamp NULL DEFAULT CURRENT_TIMESTAMP, + `updatedAt` timestamp NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, + PRIMARY KEY (`id`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci; +/*!40101 SET character_set_client = @saved_cs_client */; + +-- +-- Table structure for table `ratingApp` +-- + +DROP TABLE IF EXISTS `ratingApp`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!50503 SET character_set_client = utf8mb4 */; +CREATE TABLE `ratingApp` ( + `id` int NOT NULL AUTO_INCREMENT, + `name` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL, + `email` varchar(150) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL, + `phone` varchar(80) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL, + `userId` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL, + `userType` varchar(20) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL, + `rating` varchar(2) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL, + `comment` varchar(300) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL, + `created_at` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP, + PRIMARY KEY (`id`) +) ENGINE=InnoDB AUTO_INCREMENT=118 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci; +/*!40101 SET character_set_client = @saved_cs_client */; + +-- +-- Table structure for table `ratingDriver` +-- + +DROP TABLE IF EXISTS `ratingDriver`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!50503 SET character_set_client = utf8mb4 */; +CREATE TABLE `ratingDriver` ( + `id` int NOT NULL AUTO_INCREMENT, + `passenger_id` text CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci, + `driver_id` varchar(33) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL, + `ride_id` int DEFAULT NULL, + `rating` float DEFAULT NULL, + `comment` text CHARACTER SET utf8mb3 COLLATE utf8mb3_general_ci, + `created_at` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP, + PRIMARY KEY (`id`), + UNIQUE KEY `ride_id` (`ride_id`), + KEY `idx_driver_id` (`driver_id`) +) ENGINE=InnoDB AUTO_INCREMENT=46 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci; +/*!40101 SET character_set_client = @saved_cs_client */; + +-- +-- Table structure for table `ratingPassenger` +-- + +DROP TABLE IF EXISTS `ratingPassenger`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!50503 SET character_set_client = utf8mb4 */; +CREATE TABLE `ratingPassenger` ( + `id` int NOT NULL AUTO_INCREMENT, + `passenger_id` text CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL, + `driverID` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL, + `rideId` varchar(30) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL, + `rating` float NOT NULL, + `comment` text CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci, + `created_at` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP, + PRIMARY KEY (`id`), + UNIQUE KEY `rideId` (`rideId`) +) ENGINE=InnoDB AUTO_INCREMENT=39 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci; +/*!40101 SET character_set_client = @saved_cs_client */; + +-- +-- Table structure for table `ride` +-- + +DROP TABLE IF EXISTS `ride`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!50503 SET character_set_client = utf8mb4 */; +CREATE TABLE `ride` ( + `id` int NOT NULL AUTO_INCREMENT, + `start_location` varchar(255) NOT NULL, + `end_location` varchar(255) NOT NULL, + `date` date NOT NULL, + `time` time NOT NULL, + `endtime` time NOT NULL, + `price` decimal(10,2) NOT NULL DEFAULT '0.00', + `passenger_id` varchar(111) NOT NULL, + `driver_id` varchar(111) NOT NULL, + `status` varchar(200) NOT NULL DEFAULT 'nothing', + `paymentMethod` varchar(20) NOT NULL DEFAULT 'Cash', + `carType` varchar(20) NOT NULL DEFAULT 'Speed', + `created_at` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, + `updated_at` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, + `DriverIsGoingToPassenger` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP, + `rideTimeStart` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP, + `rideTimeFinish` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP, + `price_for_driver` decimal(10,2) NOT NULL DEFAULT '0.00', + `price_for_passenger` decimal(10,2) NOT NULL DEFAULT '0.00', + `distance` float DEFAULT '0', + PRIMARY KEY (`id`), + KEY `passengerfk` (`passenger_id`), + KEY `driverfk` (`driver_id`) +) ENGINE=InnoDB AUTO_INCREMENT=831 DEFAULT CHARSET=utf8mb3; +/*!40101 SET character_set_client = @saved_cs_client */; + +-- +-- Table structure for table `seferWallet` +-- + +DROP TABLE IF EXISTS `seferWallet`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!50503 SET character_set_client = utf8mb4 */; +CREATE TABLE `seferWallet` ( + `id` int NOT NULL AUTO_INCREMENT, + `driverId` varchar(100) NOT NULL, + `passengerId` varchar(100) NOT NULL, + `amount` varchar(10) NOT NULL, + `paymentMethod` varchar(50) NOT NULL, + `token` varchar(100) NOT NULL, + `createdAt` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP, + PRIMARY KEY (`id`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci; +/*!40101 SET character_set_client = @saved_cs_client */; + +-- +-- Table structure for table `server_locations` +-- + +DROP TABLE IF EXISTS `server_locations`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!50503 SET character_set_client = utf8mb4 */; +CREATE TABLE `server_locations` ( + `id` int NOT NULL AUTO_INCREMENT, + `name` varchar(255) NOT NULL, + `min_latitude` decimal(10,6) NOT NULL, + `max_latitude` decimal(10,6) NOT NULL, + `min_longitude` decimal(10,6) NOT NULL, + `max_longitude` decimal(10,6) NOT NULL, + `server_link` varchar(255) NOT NULL, + PRIMARY KEY (`id`), + UNIQUE KEY `name` (`name`) +) ENGINE=InnoDB AUTO_INCREMENT=2 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci; +/*!40101 SET character_set_client = @saved_cs_client */; + +-- +-- Table structure for table `smsSender` +-- + +DROP TABLE IF EXISTS `smsSender`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!50503 SET character_set_client = utf8mb4 */; +CREATE TABLE `smsSender` ( + `id` int NOT NULL AUTO_INCREMENT, + `senderId` varchar(20) NOT NULL, + PRIMARY KEY (`id`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci; +/*!40101 SET character_set_client = @saved_cs_client */; + +-- +-- Table structure for table `test` +-- + +DROP TABLE IF EXISTS `test`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!50503 SET character_set_client = utf8mb4 */; +CREATE TABLE `test` ( + `id` int NOT NULL AUTO_INCREMENT, + `name` varchar(22) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL, + PRIMARY KEY (`id`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci; +/*!40101 SET character_set_client = @saved_cs_client */; + +-- +-- Table structure for table `testApp` +-- + +DROP TABLE IF EXISTS `testApp`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!50503 SET character_set_client = utf8mb4 */; +CREATE TABLE `testApp` ( + `id` int NOT NULL AUTO_INCREMENT, + `isTest` tinyint(1) NOT NULL, + `createdAt` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP, + `appPlatform` varchar(20) NOT NULL, + PRIMARY KEY (`id`) +) ENGINE=InnoDB AUTO_INCREMENT=3 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci; +/*!40101 SET character_set_client = @saved_cs_client */; + +-- +-- Table structure for table `tips` +-- + +DROP TABLE IF EXISTS `tips`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!50503 SET character_set_client = utf8mb4 */; +CREATE TABLE `tips` ( + `id` int NOT NULL AUTO_INCREMENT, + `driverID` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL, + `passengerID` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL, + `rideID` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL, + `tipAmount` decimal(10,2) DEFAULT NULL, + PRIMARY KEY (`id`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci; +/*!40101 SET character_set_client = @saved_cs_client */; + +-- +-- Table structure for table `token_verification` +-- + +DROP TABLE IF EXISTS `token_verification`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!50503 SET character_set_client = utf8mb4 */; +CREATE TABLE `token_verification` ( + `id` int NOT NULL AUTO_INCREMENT, + `phone_number` text CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL, + `token` text CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL, + `expiration_time` datetime NOT NULL, + `verified` tinyint(1) DEFAULT '0', + `created_at` datetime DEFAULT CURRENT_TIMESTAMP, + PRIMARY KEY (`id`) +) ENGINE=InnoDB AUTO_INCREMENT=88 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci; +/*!40101 SET character_set_client = @saved_cs_client */; + +-- +-- Table structure for table `token_verification_admin` +-- + +DROP TABLE IF EXISTS `token_verification_admin`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!50503 SET character_set_client = utf8mb4 */; +CREATE TABLE `token_verification_admin` ( + `id` int NOT NULL AUTO_INCREMENT, + `phone_number` varchar(20) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL, + `token` varchar(10) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL, + `expiration_time` datetime NOT NULL, + PRIMARY KEY (`id`), + UNIQUE KEY `phone_number` (`phone_number`) +) ENGINE=InnoDB AUTO_INCREMENT=51 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci; +/*!40101 SET character_set_client = @saved_cs_client */; + +-- +-- Table structure for table `token_verification_driver` +-- + +DROP TABLE IF EXISTS `token_verification_driver`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!50503 SET character_set_client = utf8mb4 */; +CREATE TABLE `token_verification_driver` ( + `id` int NOT NULL AUTO_INCREMENT, + `phone_number` text CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL, + `token` text CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL, + `expiration_time` datetime NOT NULL, + `verified` tinyint(1) NOT NULL DEFAULT '0', + `created_at` datetime DEFAULT CURRENT_TIMESTAMP, + PRIMARY KEY (`id`) +) ENGINE=InnoDB AUTO_INCREMENT=2210 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci; +/*!40101 SET character_set_client = @saved_cs_client */; + +-- +-- Table structure for table `tokens` +-- + +DROP TABLE IF EXISTS `tokens`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!50503 SET character_set_client = utf8mb4 */; +CREATE TABLE `tokens` ( + `id` int NOT NULL AUTO_INCREMENT, + `token` varchar(333) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL, + `passengerID` varchar(80) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL, + `fingerPrint` varchar(250) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL, + `status` varchar(22) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL DEFAULT 'yet', + PRIMARY KEY (`id`), + UNIQUE KEY `passengerID` (`passengerID`) +) ENGINE=InnoDB AUTO_INCREMENT=2604 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci; +/*!40101 SET character_set_client = @saved_cs_client */; + +-- +-- Table structure for table `users` +-- + +DROP TABLE IF EXISTS `users`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!50503 SET character_set_client = utf8mb4 */; +CREATE TABLE `users` ( + `id` varchar(111) NOT NULL, + `phone` varchar(15) NOT NULL, + `email` varchar(255) NOT NULL, + `gender` varchar(10) NOT NULL, + `password` varchar(100) NOT NULL, + `birthdate` date NOT NULL, + `site` varchar(255) NOT NULL, + `first_name` varchar(255) NOT NULL, + `last_name` varchar(255) NOT NULL, + `created_at` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP, + `updated_at` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, + `user_type` varchar(44) NOT NULL, + PRIMARY KEY (`id`), + UNIQUE KEY `email` (`email`), + UNIQUE KEY `phone` (`phone`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb3; +/*!40101 SET character_set_client = @saved_cs_client */; + +-- +-- Table structure for table `vehicles` +-- + +DROP TABLE IF EXISTS `vehicles`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!50503 SET character_set_client = utf8mb4 */; +CREATE TABLE `vehicles` ( + `id` int NOT NULL AUTO_INCREMENT, + `driverID` varchar(100) NOT NULL, + `make` varchar(255) NOT NULL, + `model` varchar(255) NOT NULL, + `license_plate` varchar(255) NOT NULL, + `seats` int NOT NULL, + `created_at` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP, + `updated_at` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, + PRIMARY KEY (`id`), + UNIQUE KEY `license_plate` (`license_plate`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb3; +/*!40101 SET character_set_client = @saved_cs_client */; + +-- +-- Table structure for table `videos` +-- + +DROP TABLE IF EXISTS `videos`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!50503 SET character_set_client = utf8mb4 */; +CREATE TABLE `videos` ( + `id` int NOT NULL AUTO_INCREMENT, + `title` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL, + `description` varchar(200) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL, + `url` varchar(150) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL, + `created_at` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP, + PRIMARY KEY (`id`) +) ENGINE=InnoDB AUTO_INCREMENT=4 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci; +/*!40101 SET character_set_client = @saved_cs_client */; + +-- +-- Table structure for table `waitingRides` +-- + +DROP TABLE IF EXISTS `waitingRides`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!50503 SET character_set_client = utf8mb4 */; +CREATE TABLE `waitingRides` ( + `id` varchar(100) NOT NULL, + `start_location` varchar(255) NOT NULL, + `start_lat` decimal(10,7) DEFAULT NULL, + `start_lng` decimal(10,7) DEFAULT NULL, + `end_location` varchar(255) NOT NULL, + `end_lat` decimal(10,7) DEFAULT NULL, + `end_lng` decimal(10,7) DEFAULT NULL, + `date` date NOT NULL, + `time` time NOT NULL, + `price` decimal(10,2) NOT NULL DEFAULT '0.00', + `passenger_id` varchar(111) NOT NULL, + `status` varchar(200) NOT NULL DEFAULT 'nothing', + `carType` varchar(19) NOT NULL, + `passengerRate` decimal(10,2) NOT NULL, + `created_at` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, + `price_for_passenger` decimal(10,2) NOT NULL DEFAULT '0.00', + `distance` varchar(255) NOT NULL, + `duration` varchar(10) NOT NULL DEFAULT '0', + `payment_method` varchar(10) NOT NULL DEFAULT 'cash', + `passenger_wallet` varchar(6) NOT NULL DEFAULT '0', + PRIMARY KEY (`id`), + KEY `idx_location_status` (`start_lat`,`start_lng`,`status`,`created_at`), + KEY `idx_status_created` (`status`,`created_at`), + KEY `idx_passenger` (`passenger_id`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb3; +/*!40101 SET character_set_client = @saved_cs_client */; + +-- +-- Table structure for table `welcomeDriverCall` +-- + +DROP TABLE IF EXISTS `welcomeDriverCall`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!50503 SET character_set_client = utf8mb4 */; +CREATE TABLE `welcomeDriverCall` ( + `id` int NOT NULL AUTO_INCREMENT, + `driverId` varchar(50) NOT NULL, + `isCall` tinyint(1) NOT NULL DEFAULT '0', + `notes` varchar(255) NOT NULL, + `createdAt` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP, + PRIMARY KEY (`id`) +) ENGINE=InnoDB AUTO_INCREMENT=1648 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci; +/*!40101 SET character_set_client = @saved_cs_client */; + +-- +-- Table structure for table `write_argument_after_applied_from_background` +-- + +DROP TABLE IF EXISTS `write_argument_after_applied_from_background`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!50503 SET character_set_client = utf8mb4 */; +CREATE TABLE `write_argument_after_applied_from_background` ( + `id` int unsigned NOT NULL AUTO_INCREMENT, + `ride_id` varchar(50) NOT NULL, + `driver_id` varchar(50) NOT NULL, + `passenger_id` varchar(50) NOT NULL, + `passenger_location` varchar(30) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL, + `passenger_destination` varchar(30) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL, + `duration` varchar(255) NOT NULL, + `duration_to_passenger` varchar(255) NOT NULL, + `duration_of_ride` varchar(255) NOT NULL, + `distance` varchar(255) NOT NULL, + `total_cost` varchar(255) NOT NULL, + `payment_amount` varchar(255) NOT NULL, + `payment_method` enum('visa','cash') NOT NULL, + `wallet_checked` varchar(255) NOT NULL, + `has_steps` varchar(255) NOT NULL, + `step0` varchar(255) DEFAULT NULL, + `step1` varchar(255) DEFAULT NULL, + `step2` varchar(255) DEFAULT NULL, + `step3` varchar(255) DEFAULT NULL, + `step4` varchar(255) DEFAULT NULL, + `passenger_wallet_burc` varchar(33) NOT NULL, + `token_passenger` varchar(255) NOT NULL, + `name` varchar(100) NOT NULL, + `phone` varchar(20) NOT NULL, + `email` varchar(150) NOT NULL, + `start_name_location` varchar(255) NOT NULL, + `end_name_location` varchar(255) NOT NULL, + `car_type` varchar(50) NOT NULL, + `kazan` varchar(255) NOT NULL, + `direction_url` text NOT NULL, + `time_of_order` datetime NOT NULL, + `total_passenger` varchar(255) NOT NULL, + PRIMARY KEY (`id`) +) ENGINE=InnoDB AUTO_INCREMENT=9 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci; +/*!40101 SET character_set_client = @saved_cs_client */; + +-- +-- Dumping events for database 'intaleqDB1' +-- + +-- +-- Dumping routines for database 'intaleqDB1' +-- +/*!40103 SET TIME_ZONE=@OLD_TIME_ZONE */; + +/*!40101 SET SQL_MODE=@OLD_SQL_MODE */; +/*!40014 SET FOREIGN_KEY_CHECKS=@OLD_FOREIGN_KEY_CHECKS */; +/*!40014 SET UNIQUE_CHECKS=@OLD_UNIQUE_CHECKS */; +/*!40101 SET CHARACTER_SET_CLIENT=@OLD_CHARACTER_SET_CLIENT */; +/*!40101 SET CHARACTER_SET_RESULTS=@OLD_CHARACTER_SET_RESULTS */; +/*!40101 SET COLLATION_CONNECTION=@OLD_COLLATION_CONNECTION */; +/*!40111 SET SQL_NOTES=@OLD_SQL_NOTES */; + +-- Dump completed on 2026-04-22 19:40:54 + +``` + +## File: login.php +``` +enforce(RateLimiter::identifier(), 'login'); + + $passengerId = filterRequest('id'); + $fingerprint = filterRequest('fingerPrint') ?? filterRequest('fingerprint'); + $audience = filterRequest('aud'); + + if (empty($passengerId) || empty($fingerprint) || empty($audience)) { + jsonError('Missing required parameters', 400); + } + + $con = Database::get('main'); + + // التحقق من الجهاز من خلال البصمة + $stmt = $con->prepare(' + SELECT passengerID, fingerprint + FROM tokens + WHERE passengerID = :pid + LIMIT 1 + '); + $stmt->execute([':pid' => $passengerId]); + $row = $stmt->fetch(); + + $fpVerified = false; + if ($row) { + $fpPepper = getenv('FP_PEPPER') ?: ''; + $storedFp = $row['fingerprint']; + + // دعم الطريقة الجديدة (hash) والقديمة (مباشر) + if ($fpPepper) { + $expectedHash = hash('sha256', $fingerprint . $fpPepper); + $fpVerified = hash_equals($storedFp, $expectedHash); + if (!$fpVerified) { + $fpVerified = hash_equals($storedFp, $fingerprint); + } + } else { + $fpVerified = hash_equals($storedFp, $fingerprint); + } + } + + // وقت رد ثابت لمنع Timing Attack + $elapsed = microtime(true) - $startTime; + if ($elapsed < 0.1) usleep((int)((0.1 - $elapsed) * 1000000)); + + if (!$fpVerified) { + securityLog("Invalid login fingerprint", ['passengerId' => $passengerId]); + jsonError('Invalid credentials', 401); + } + + $limiter->reset(RateLimiter::identifier(), 'login'); + + $jwtService = new JwtService($redis); + $jwt = $jwtService->generateAccessToken($passengerId, 'passenger', $audience, $fingerprint); + $refresh = $jwtService->generateRefreshToken($passengerId); + + jsonSuccess([ + 'jwt' => $jwt, + 'refresh_token' => $refresh['token'], + 'expires_in' => 900 + ]); + +} catch (PDOException $e) { + securityLog("Login PDO Error", ['msg' => $e->getMessage()]); + jsonError('Database error', 500); +} catch (Exception $e) { + securityLog("Login Error", ['msg' => $e->getMessage()]); + jsonError('Server error', 500); +} +``` + +## File: privacy_policy1.php +``` + + + + + +سياسة الخصوصية وشروط الخدمة – Intaleq Driver + + + + + +
+

سياسة الخصوصية وشروط الخدمة – تطبيق Intaleq Driver

+

آخر تحديث: 14-08-2025

+

المشغّل/المتحكم بالبيانات: انطلق لنقل الركاب

+

البريد للتواصل: support@intaleqapp.com

+
+ +
+

إفصاح بارز عن البيانات الحساسة – الموقع الجغرافي

+

يجمع تطبيق Intaleq Driver بيانات الموقع الدقيقة من جهاز السائق أثناء فتح التطبيق وأيضًا أثناء عمله في الخلفية/وعند إغلاقه، لغايات إسناد الرحلات القريبة، وتتبع الرحلة حيًا، واحتساب المسافة والأجرة بدقة.

+
    +
  • في الواجهة (Foreground): عرض موقع السائق على الخريطة وإتاحة الطلبات المناسبة.
  • +
  • في الخلفية/عند الإغلاق: استقبال طلبات جديدة قريبة، وتمكين تتبع الراكب للمسار، وحساب المسافة/الوقت/الأجرة.
  • +
+

يمكنك إدارة إذن الموقع من إعدادات النظام. تعطيل الإذن سيمنع الوظائف الأساسية للتطبيق.

+
+ +
+

1) الفئات الكاملة للبيانات التي نجمعها

+
+
+

أ. بيانات يقدّمها السائق

+
    +
  • هوية: الاسم الكامل، رقم الهاتف، صورة الملف.
  • +
  • مركبة: النوع/الطراز، رقم اللوحة، صور المركبة.
  • +
  • وثائق قانونية: رخصة القيادة، رخصة المركبة، وأي مستندات مطلوبة للامتثال.
  • +
  • إعدادات الحساب والتفضيلات.
  • +
+
+
+

ب. بيانات تُجمع تلقائيًا

+
    +
  • الموقع: دقيق/تقريبي، في الواجهة والخلفية كما ورد أعلاه.
  • +
  • بيانات الرحلات والاستخدام: سجل الرحلات، نقاط الانطلاق/الوصول، المدد والمسافات، التقييمات.
  • +
  • بيانات الجهاز والمعرّفات: طراز الجهاز، نظام التشغيل، معرّفات إشعارات (FCM token)، عنوان IP، سجلات الأداء والأعطال.
  • +
  • بيانات الدفع والعوائد (إن وُجدت): المبالغ المستحقة، سجلات السحب/التسوية.
  • +
+
+
+
+ +
+

2) الأغراض القانونية لاستخدام البيانات

+
    +
  • تشغيل الخدمة الأساسية وإسناد الرحلات والملاحة وتتبع الرحلة واحتساب الأجرة.
  • +
  • السلامة ومنع الاحتيال والتحقق من الأهلية القانونية للسائق.
  • +
  • الدعم الفني وتحسين الجودة والتحليلات المجمّعة.
  • +
  • الالتزام بواجبات محاسبية/ضريبية وقانونية.
  • +
+

الأساس القانوني: تنفيذ العقد، المصلحة المشروعة (السلامة/منع الاحتيال/التحسين)، والموافقة للأذونات الحساسة مثل الموقع في الخلفية.

+
+ +
+

3) المشاركة والجهات المتلقّية

+
    +
  • مزودو الخرائط/الملاحة (مثل Google Maps Platform) لمعالجة الخرائط والتوجيه.
  • +
  • خدمات الإشعارات والأداء/الأعطال (مثل Firebase Cloud Messaging وCrashlytics/Analytics).
  • +
  • مزودو الدفع والتحقق والامتثال حسب السوق (مثل MTN، Syriatel، eCash/الهرم) عند الحاجة.
  • +
  • جهات رسمية/رقابية عند وجود التزام قانوني.
  • +
+

لا نبيع بياناتك الشخصية. وأي مشاركة مقيّدة باتفاقيات ومعايير أمان مناسبة.

+
+ +
+

4) الاحتفاظ بالبيانات

+
    +
  • بيانات الحساب والهوية: طالما الحساب فعّال، ثم لمدة معقولة بعد الإنهاء للامتثال/حل النزاعات.
  • +
  • بيانات الرحلات والفوترة: وفق المتطلبات القانونية المحلية (عادة بين 3–5 سنوات).
  • +
  • سجلات الأداء والأعطال: لفترات أقصر (عادة حتى 12 شهرًا).
  • +
+
+ +
+

5) أمان المعلومات

+
    +
  • تشفير أثناء النقل (TLS) وتدابير وصول مقيّدة وسجلات تدقيق.
  • +
  • مراجعات دورية وإصلاح الثغرات عند اكتشافها.
  • +
+

لا توجد وسيلة نقل/تخزين إلكترونية آمنة تمامًا، لكننا نطبّق أفضل الممارسات المناسبة للخدمة.

+
+ +
+

6) القاصرون

+

خدمتنا موجّهة للسائقين البالغين قانونيًا فقط. لا نستهدف القاصرين ولا نجمع عن علم بيانات لمن هم دون السن القانوني المناسب لسوقنا. إن علمنا بذلك سنحذف البيانات ونعطّل الحساب.

+
+ +
+

7) حقوقك

+
    +
  • الاطلاع على بياناتك والحصول على نسخة منها.
  • +
  • تصحيح البيانات غير الدقيقة.
  • +
  • طلب الحذف (مع مراعاة الالتزامات القانونية للاحتفاظ).
  • +
  • تقييد أو الاعتراض على المعالجة في حالات محددة.
  • +
  • سحب الموافقة للأذونات الحساسة (مثل الموقع في الخلفية) من إعدادات الجهاز، دون أن يؤثر ذلك على قانونية المعالجة السابقة للسحب.
  • +
+

لممارسة أي من هذه الحقوق أو لتقديم شكوى، تواصل معنا عبر: support@intaleqapp.com.

+
+ +
+

8) النقل الدولي للبيانات

+

قد تُعالَج البيانات على خوادم/مزودين خارج بلدك. نتخذ تدابير تعاقدية وفنية مع شركائنا لضمان مستوى حماية مناسب.

+
+ +
+

9) ملفات تعريف الارتباط (Cookies) والمواقع

+

قد يستخدم موقعنا الإلكتروني كوكيز ضرورية للتشغيل و/أو تحليلات أساسية. يمكنك التحكم بها عبر إعدادات المتصفح. تطبيق الهاتف لا يعتمد على كوكيز، لكنه قد يستخدم معرّفات أجهزة لأغراض إشعارات/تحليلات.

+
+ +
+

10) أذونات أخرى قد يطلبها التطبيق

+
    +
  • الإشعارات (Push): لإعلام السائق بالطلبات والرسائل.
  • +
  • الكاميرا/الصور: لالتقاط/رفع صور الوثائق أو المركبة (إن طُلبت).
  • +
  • التخزين: لحفظ/قراءة صور الوثائق (إن لزم).
  • +
+
+ +
+

11) إدارة الأذونات

+

على Android: الإعدادات > التطبيقات > Intaleq Driver > الأذونات (الموقع/الكاميرا/الصور/الإشعارات…). تعطيل بعض الأذونات قد يوقف الميزات الأساسية كاستلام الطلبات.

+
+ +
+

12) التعديلات على هذه السياسة

+

قد نحدّث هذه السياسة من وقت لآخر. سنغيّر تاريخ "آخر تحديث" أعلاه، وقد نرسل إشعارًا داخل التطبيق عند التغييرات الجوهرية.

+
+ +
+

13) حذف الحساب والتواصل

+

يمكنك طلب حذف حسابك وبياناتك عبر البريد: support@intaleqapp.com. نعالج الطلب خلال 30 يومًا ما لم تمنعنا متطلبات قانونية من ذلك.

+
+ +
+ + +
+

Privacy Policy (English)

+

Last Updated: 14 Aug 2025 – Data Controller: Intaleq for Passenger Transport – Contact: support@intaleqapp.com

+ +
+

Prominent Disclosure – Location

+

The Intaleq Driver app collects precise location data while the app is in the foreground and also in the background/when closed, to dispatch nearby jobs, enable live trip tracking, and accurately compute distance and fares.

+
    +
  • Foreground: show driver location and enable dispatch.
  • +
  • Background/closed: receive new requests, rider trip-tracking, and route/fare computation.
  • +
+

Permissions can be managed in system settings; disabling location prevents core functionality.

+
+ +

Data We Collect

+
    +
  • Driver-provided: name, phone, profile photo; vehicle details; legal documents; account settings.
  • +
  • Automatically collected: precise/approximate location (foreground & background), trip history, start/finish points, durations/distances, ratings; device info and identifiers (e.g., FCM token), IP, performance/crash logs; payout/billing data where applicable.
  • +
+ +

Purposes & Legal Bases

+
    +
  • Core service operation (dispatch, navigation, tracking, fare computation); safety & fraud prevention; support; analytics; legal compliance.
  • +
  • Legal bases: contract performance; legitimate interests (safety, fraud prevention, improvement); consent for sensitive permissions such as background location.
  • +
+ +

Sharing

+
    +
  • Map/navigation providers (e.g., Google Maps Platform), notifications/performance/crash services (e.g., Firebase), payment/verification partners (e.g., MTN, Syriatel, eCash/Al-Haram as applicable), and authorities when legally required. No sale of personal data.
  • +
+ +

Retention

+
    +
  • Account/identity: while the account is active and for a reasonable period thereafter.
  • +
  • Trips/billing: per legal requirements (typically 3–5 years).
  • +
  • Performance/crash logs: typically up to 12 months.
  • +
+ +

Security

+

TLS in transit, restricted access, audit logs, and reasonable technical/organizational measures.

+ +

Minors

+

Service is intended for legally adult drivers only. We do not knowingly collect data from minors; if identified, we will delete data and disable the account.

+ +

Your Rights

+
    +
  • Access, rectification, deletion (subject to legal retention), restriction/objection, data portability where applicable, and consent withdrawal for sensitive permissions.
  • +
+ +

International Transfers

+

Data may be processed on servers/providers outside your country; we use contractual and technical safeguards with partners.

+ +

Cookies & Websites

+

Our website may use essential/analytics cookies; you can control them in your browser. The mobile app uses device identifiers instead of cookies.

+ +

Other Permissions

+

Push notifications; camera/photos for document/vehicle images; storage for saving/reading such images.

+ +

Changes

+

We may update this policy and will adjust the “Last Updated” date; material changes may be notified in-app.

+ +

Account Deletion & Contact

+

Email us at support@intaleqapp.com. We aim to fulfill deletion requests within 30 days unless legal obligations prevent immediate deletion.

+
+ +
+ +
+

شروط الخدمة المختصرة

+
    +
  • باستخدام التطبيق، تُقرّ بالتزامك بالقوانين المحلية وبسياسة الخصوصية.
  • +
  • تقديم معلومات دقيقة والمحافظة على سلوك مهني وسلامة المركبة.
  • +
+
+ +
+

© 2025 انطلق لنقل الركاب – جميع الحقوق محفوظة.

+
+ + + +``` + +## File: migrate_driver_passwords.php +``` + false, + PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION, + PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_ASSOC, + PDO::MYSQL_ATTR_INIT_COMMAND => "SET NAMES UTF8", + ]; + $pdo = new PDO($dsn, $dbUser, $dbPass, $options); + + // نجلب الحقول التي نحتاجها لبناء السر + $sql = "SELECT id, phone, birthdate, national_number FROM driver"; + $stmt = $pdo->query($sql); + + $update = $pdo->prepare("UPDATE driver SET password = :pwd WHERE id = :id"); + + $count = 0; + $skipped = 0; + $startTime = microtime(true); + + while ($row = $stmt->fetch()) { + $id = $row['id']; + $encPhone = $row['phone']; + $encBirth = $row['birthdate'] ?? null; + $encNat = $row['national_number'] ?? null; + + // نفك التشفير – قد يرجع null لو الحقل فاضي + $phone = $encPhone ? $encryptionHelper->decryptData($encPhone) : null; + $birth = $encBirth ? $encryptionHelper->decryptData($encBirth) : null; + $nat = $encNat ? $encryptionHelper->decryptData($encNat) : null; + + if (empty($id) || empty($phone)) { + // لو ناقصين، نتجاوز السطر مع تسجيل في اللوج + error_log("[MIGRATE] Skip driver id={$id}: missing phone or id."); + $skipped++; + continue; + } + + // في الوضع المثالي عندك nat + birthdate لكل السائقين + // لو حاب تجبرهم يكونوا موجودين: + /* + if (empty($nat) || empty($birth)) { + error_log("[MIGRATE] Skip driver id={$id}: missing nat or birthdate."); + $skipped++; + continue; + } + */ + + // phone مفروض يكون أصلاً مطبّع (9639...) من سكربت التسجيل + $normalizedPhone = trim($phone); + + // نبني baseString: الأساس id + phone + $parts = [$id, $normalizedPhone]; + + // نضيف رقم وطني أو سنة الميلاد (حسب الموجود) + if (!empty($nat)) { + $parts[] = trim($nat); + } elseif (!empty($birth)) { + // birthdate متوقعة بصيغة YYYY-01-01 -> نأخذ السنة فقط + $year = substr($birth, 0, 4); + if (preg_match('/^\d{4}$/', $year)) { + $parts[] = $year; + } + } + + $baseString = implode('|', $parts); + + // اشتقاق السر النهائي (HEX string، بدون باينري) + $hmacHex = hash_hmac('sha256', $baseString, $pepper, false); + + // نخزن فقط الهاش باستخدام password_hash + $pwdHash = password_hash($hmacHex, PASSWORD_DEFAULT); + + $update->execute([ + ':pwd' => $pwdHash, + ':id' => $id, + ]); + + $count++; + + // لوج بسيط كل 100 سائق + if ($count % 100 === 0) { + $elapsed = round(microtime(true) - $startTime, 2); + error_log("[MIGRATE] Progress: updated {$count} drivers, skipped {$skipped}, elapsed {$elapsed}s"); + } + } + + $totalTime = round(microtime(true) - $startTime, 2); + error_log("[MIGRATE] Done. Updated {$count} driver passwords, skipped {$skipped}. Total time: {$totalTime}s"); + echo "Migration finished. Updated {$count} drivers, skipped {$skipped}. Time: {$totalTime}s\n"; + +} catch (PDOException $e) { + error_log("[MIGRATE][PDO] " . $e->getMessage()); + echo "Migration failed (DB error).\n"; + exit(1); +} catch (Exception $e) { + error_log("[MIGRATE][GENERAL] " . $e->getMessage()); + echo "Migration failed (general error).\n"; + exit(1); +} +``` + +## File: loginJwtWalletDriver.php +``` +enforce(RateLimiter::identifier(), 'login'); + + $id = filterRequest('id'); + $password = filterRequest('password'); + $audience = filterRequest('aud'); + $fingerPrint = filterRequest('fingerPrint') ?? filterRequest('fingerprint'); + + $allowed1 = getenv('allowedWallet1'); + $allowed2 = getenv('allowedWallet2'); + $allowedAudiences = array_values(array_filter([$allowed1, $allowed2])); + $passwordnewpassenger = getenv('passwordnewpassenger'); + $fpPepper = getenv('FP_PEPPER') ?: ''; + + if (empty($id) || empty($password) || empty($audience) || empty($fingerPrint)) { + jsonError('Missing required parameters', 400); + } + + if (!in_array($audience, $allowedAudiences, true)) { + jsonError('Invalid audience', 400); + } + + if (!password_verify($password, $passwordnewpassenger)) { + securityLog("WalletDriver login failed (password)", ['id' => $id]); + jsonError('Invalid credentials', 401); + } + + $con = Database::get('main'); + + $stmt = $con->prepare(' + SELECT captain_id, fingerPrint + FROM driverToken + WHERE captain_id = :captain_id + LIMIT 1 + '); + $stmt->execute([':captain_id' => $id]); + $tokenData = $stmt->fetch(); + + $storedFp = $tokenData['fingerPrint'] ?? ''; + + if (empty($storedFp)) { + jsonError('Device fingerprint not registered', 403); + } + + $fpVerified = false; + if (!empty($fpPepper)) { + $expectedHash = hash('sha256', $fingerPrint . $fpPepper); + $fpVerified = hash_equals($storedFp, $expectedHash); + if (!$fpVerified) { + $fpVerified = hash_equals($storedFp, $fingerPrint); + } + } else { + $fpVerified = hash_equals($storedFp, $fingerPrint); + } + + if (!$fpVerified) { + securityLog("WalletDriver FP mismatch", ['id' => $id]); + jsonError('Device verification failed', 403); + } + + $limiter->reset(RateLimiter::identifier(), 'login'); + + $fpHash = hash('sha256', $fingerPrint . $fpPepper); + + $payload = [ + 'user_id' => $id, + 'fingerPrint' => $fpHash, + 'exp' => time() + 300, // 5 دقائق تم إصلاحه (كان 60) + 'iat' => time(), + 'iss' => 'Tripz-Wallet', + 'aud' => $audience, + 'jti' => bin2hex(random_bytes(16)), + ]; + + $secretKey = trim(file_get_contents('/home/intaleq-api/.secret_key_pay')); + $jwt = Firebase\JWT\JWT::encode($payload, $secretKey, 'HS256'); + + $hmac = hash_hmac('sha256', $id, getenv('SECRET_KEY_HMAC')); + + jsonSuccess([ + 'status' => 'success', + 'jwt' => $jwt, + 'hmac' => $hmac, + 'expires_in' => 300, // تم التعديل + ]); + +} catch (PDOException $e) { + securityLog("LoginWalletDriver PDO Error", ['msg' => $e->getMessage()]); + jsonError('Database error', 500); +} catch (Exception $e) { + securityLog("LoginWalletDriver Error", ['msg' => $e->getMessage()]); + jsonError('Server error', 500); +} +``` + +## File: loginFirstTimeDriver.php +``` +enforce(RateLimiter::identifier(), 'register'); + + $id = filterRequest('id'); + $password = filterRequest('password'); + $audience = filterRequest('aud'); + $fingerprint = filterRequest('fingerprint') ?? filterRequest('fingerPrint'); + + $allowed1 = getenv('allowedDriver1'); + $allowed2 = getenv('allowedDriver2'); + $allowedAudiences = array_values(array_filter([$allowed1, $allowed2])); + $passwordnewpassenger = getenv('passwordnewpassenger'); + + if (empty($id) || empty($password) || empty($audience)) { + jsonError('Missing input fields.', 400); + } + + if (!in_array($audience, $allowedAudiences, true)) { + jsonError('Invalid audience', 400); + } + + if (!password_verify($password, $passwordnewpassenger)) { + securityLog("FirstTimeDriver login failed (password)", ['id' => $id]); + jsonError('Invalid credentials.', 401); + } + + $fpPepper = getenv('FP_PEPPER') ?: ''; + $fpHash = (!empty($fingerprint) && !empty($fpPepper)) + ? hash('sha256', $fingerprint . $fpPepper) + : null; + + $payload = [ + 'user_id' => 'new', + 'sub' => $id, + 'token_type' => 'registration', + 'exp' => time() + 450, + 'iat' => time(), + 'iss' => 'Tripz', + 'aud' => $audience, + 'jti' => bin2hex(random_bytes(16)), + ]; + + if ($fpHash !== null) { + $payload['fingerPrint'] = $fpHash; + } + + $secretKey = trim(file_get_contents('/home/intaleq-api/.secret_key')); + $jwt = Firebase\JWT\JWT::encode($payload, $secretKey, 'HS256'); + + jsonSuccess([ + 'jwt' => $jwt, + 'expires_in' => 450, + ]); + +} catch (Exception $e) { + securityLog("LoginFirstTimeDriver Error", ['msg' => $e->getMessage()]); + jsonError('Server error', 500); +} +``` + +## File: loginWallet.php +``` +enforce(RateLimiter::identifier(), 'login'); + + $id = filterRequest('id'); + $password = filterRequest('password'); + $audience = filterRequest('aud'); + $fingerPrint = filterRequest('fingerPrint') ?? filterRequest('fingerprint'); + + $allowed1 = getenv('allowed1'); + $allowed2 = getenv('allowed2'); + $allowedAudiences = array_values(array_filter([$allowed1, $allowed2])); + $passwordnewpassenger = getenv('passwordnewpassenger'); + + if (empty($id) || empty($password) || empty($audience) || empty($fingerPrint)) { + jsonError('Missing required parameters', 400); + } + + if (!in_array($audience, $allowedAudiences, true)) { + jsonError('Invalid audience', 400); + } + + if (!password_verify($password, $passwordnewpassenger)) { + securityLog("Wallet login failed (password)", ['id' => $id]); + jsonError('Invalid credentials', 401); + } + + $con = Database::get('main'); + + $stmt = $con->prepare(' + SELECT passengerID, fingerPrint + FROM tokens + WHERE passengerID = :pid + LIMIT 1 + '); + $stmt->execute([':pid' => $id]); + $tokenData = $stmt->fetch(); + + if (!$tokenData || !hash_equals($tokenData['fingerPrint'], $fingerPrint)) { + securityLog("Wallet FP mismatch", ['id' => $id]); + jsonError('Device verification failed', 403); + } + + $limiter->reset(RateLimiter::identifier(), 'login'); + + $jwtService = new JwtService($redis); + + $fpPepper = getenv('FP_PEPPER') ?: ''; + $fpHash = hash('sha256', $fingerPrint . $fpPepper); + + $payload = [ + 'user_id' => $id, + 'sub' => $id, + 'fingerPrint' => $fpHash, + 'exp' => time() + 300, // 5 دقائق تم إصلاحه + 'iat' => time(), + 'iss' => 'Tripz-Wallet', + 'aud' => $audience, + 'jti' => bin2hex(random_bytes(16)), + ]; + + $secretKey = trim(file_get_contents('/home/intaleq-api/.secret_key')); + $jwt = Firebase\JWT\JWT::encode($payload, $secretKey, 'HS256'); + + $hmac = hash_hmac('sha256', $id, getenv('SECRET_KEY_HMAC')); + + jsonSuccess([ + 'jwt' => $jwt, + 'hmac' => $hmac, + 'expires_in' => 300, + ]); + +} catch (PDOException $e) { + securityLog("LoginWallet PDO Error", ['msg' => $e->getMessage()]); + jsonError('Database error', 500); +} catch (Exception $e) { + securityLog("LoginWallet Error", ['msg' => $e->getMessage()]); + jsonError('Server error', 500); +} +``` + +## File: logout.php +``` +authenticate(); + + $jti = $decoded->jti ?? null; + $exp = $decoded->exp ?? 0; + $remaining = $exp - time(); + + if ($jti && $remaining > 0) { + $jwtService->revokeToken($jti, $remaining); + securityLog("User logged out and token revoked", ['user_id' => $decoded->user_id, 'jti' => $jti]); + } + + jsonSuccess(null, "Logged out successfully"); + +} catch (Exception $e) { + jsonError("Logout failed", 500); +} + +``` + +## File: load_env.php +``` +enforce(RateLimiter::identifier(), 'api'); + +// 2. JWT Authentication +$jwtService = new JwtService($redis); +$decoded = $jwtService->authenticate(); + +// متغيرات مساعدة للمطور +$user_id = $decoded->user_id ?? null; +$role = $decoded->role ?? 'passenger'; + +// 3. Database Connection +try { + $con = Database::get('main'); +} catch (Exception $e) { + http_response_code(500); + exit(json_encode(['error' => 'Database connection failed'])); +} +``` + +## File: loginFirstTime.php +``` +enforce(RateLimiter::identifier(), 'register'); + + $id = filterRequest('id'); + $password = filterRequest('password'); + $audience = filterRequest('aud'); + $fingerprint = filterRequest('fingerprint') ?? filterRequest('fingerPrint'); + + $allowed1 = getenv('allowed1'); + $allowed2 = getenv('allowed2'); + $allowedAudiences = array_values(array_filter([$allowed1, $allowed2])); + $passwordnewpassenger = getenv('passwordnewpassenger'); + + if (empty($id) || empty($password) || empty($audience)) { + jsonError('Missing input fields.', 400); + } + + if (!in_array($audience, $allowedAudiences, true)) { + jsonError('Invalid audience', 400); + } + + if (!password_verify($password, $passwordnewpassenger)) { + securityLog("FirstTime login failed (password)", ['id' => $id]); + jsonError('Invalid password.', 401); + } + + $jwtService = new JwtService($redis); + + // استخدام override للـ TTL في الـ Access Token (نحتاج 150 ثانية فقط) + // لتوليد التوكن بتفاصيل خاصة، نستخدم الدالة generateAccessToken لكن بتعديل إن لزم، + // أو نولد التوكن يدوياً هنا للسرعة كما كان: + $fpPepper = getenv('FP_PEPPER') ?: ''; + $fpHash = (!empty($fingerprint) && !empty($fpPepper)) + ? hash('sha256', $fingerprint . $fpPepper) + : null; + + $payload = [ + 'user_id' => 'new', + 'sub' => $id, + 'token_type' => 'registration', + 'exp' => time() + 150, // 150 ثانية + 'iat' => time(), + 'iss' => 'Tripz', + 'aud' => $audience, + 'jti' => bin2hex(random_bytes(16)), + ]; + + if ($fpHash !== null) { + $payload['fingerPrint'] = $fpHash; + } + + $secretKey = trim(file_get_contents('/home/intaleq-api/.secret_key')); + $jwt = Firebase\JWT\JWT::encode($payload, $secretKey, 'HS256'); + + jsonSuccess([ + 'jwt' => $jwt, + 'expires_in' => 150, + ]); + +} catch (Exception $e) { + securityLog("LoginFirstTime Error", ['msg' => $e->getMessage()]); + jsonError('Server error', 500); +} +``` + +## File: privacy_policy.php +``` + + + + + + Intaleq - Privacy Policy & Terms + + + + +
+ +
+

الشروط والخصوصية

+
+ تاريخ النفاذ: 09/08/2025     آخر تحديث: 14/08/2025 +
+ +
+

1. شروط الاستخدام والتعريفات

+

شروط الاستخدام

+

عند تحميل أو تصفح أو استخدام تطبيق إنطلق ("التطبيق")، فإنك توافق على الالتزام بهذه الشروط والأحكام. يحق لإنطلق تعديل هذه الشروط في أي وقت. إذا لم توافق على أي جزء من هذه الشروط، يجب عليك التوقف فورًا عن استخدام التطبيق. استمرارك في الاستخدام يعني موافقتك على الشروط وأي تعديلات لاحقة.

+

التعريفات

+
    +
  • "إنطلق" أو "التطبيق": يشير إلى تطبيق الهاتف الذكي الذي يسهل خدمات النقل بين الركاب ("المستخدمين") والسائقين ("مقدمو الخدمة"). وهو منصة حجز رحلات تعمل كوسيط ولا توظف السائقين مباشرة.
  • +
  • "مقدمو الخدمة" (السائقون): الأفراد أو الكيانات المسجلة لتقديم خدمات النقل عبر إنطلق. يدفعون رسوم عمولة عن كل رحلة مكتملة.
  • +
  • "المستخدمون" (الركاب): الأفراد الذين يحجزون الرحلات عبر التطبيق.
  • +
  • "الخدمات": جميع خدمات النقل المقدمة من قبل مقدمي الخدمة عبر التطبيق.
  • +
+
+ +
+

2. سياسة الخصوصية

+

نحن نؤمن بالشفافية الكاملة فيما يتعلق ببياناتك. نوضح أدناه ما نجمعه، ولماذا، وكيف نحميه. يُعد استخدامنا لبيانات الموقع أمراً بالغ الأهمية لخدمتنا، ولذلك يتم شرحه أولاً.

+
+

إفصاح بارز: استخدام بيانات الموقع

+

لتوفير خدماتنا الأساسية لتوصيل الركاب، يقوم تطبيق إنطلق بجمع بيانات الموقع الدقيقة من جهازك المحمول. الوصول إلى موقعك ضروري لكي يعمل التطبيق.

+

نقوم بجمع هذه البيانات في الأوقات التالية:

+
    +
  • عندما يكون التطبيق مفتوحاً على الشاشة (يعمل في الواجهة): لتحديد موقع الانطلاق الخاص بك، وعرضه على الخريطة، وإظهار السائقين القريبين منك.
  • +
  • عندما يعمل التطبيق في الخلفية (بعد منحك الإذن): هذا الأمر حاسم لإيجاد رحلة لك أثناء استخدامك لتطبيقات أخرى، ولتتبع مسار الرحلة لضمان السلامة ودقة حساب الأجرة، ولتمكين مزايا الأمان مثل مشاركة حالة رحلتك.
  • +
+

الغرض من الاستخدام: ببساطة، بدون بيانات موقعك، لا يمكننا إيجاد سائقين لك، أو توجيههم إلى نقطة انطلاقك، أو حساب أجرة رحلتك. يمكنك إدارة أو تعطيل خدمات الموقع من خلال إعدادات جهازك، ولكن يرجى العلم أن القيام بذلك سيمنع تطبيق إنطلق من تقديم خدماته.

+
+

البيانات التي تقدمها بنفسك

+
    +
  • بيانات الهوية (للسائقين): الاسم الكامل، رقم الهاتف، صورة شخصية، ومعلومات الثبوتيات الشخصية للتحقق من الأهلية.
  • +
  • بيانات الدفع: نحن لا نجمع أو نحتفظ بأي بيانات دفع. بدلاً من ذلك، نربطك مع مزودي خدمات دفع محليين مرخصين.
  • +
+

بيانات أخرى يتم جمعها تلقائياً

+
    +
  • بيانات الجهاز والاتصال: طراز جهازك، نظام التشغيل، معرفات الجهاز الفريدة، وعنوان IP لأمان الحساب والتحقق منه.
  • +
  • بيانات الاستخدام: معلومات حول كيفية تفاعلك مع التطبيق، مثل الميزات التي تستخدمها، وسجل رحلاتك، وتقييماتك، وذلك لتحسين خدماتنا.
  • +
+
+ +
+

3. التزامات المستخدم والسلوكيات

+

معلومات دقيقة

+

يجب على المستخدمين تقديم معلومات صحيحة وكاملة وحديثة أثناء التسجيل. سيؤدي استخدام حسابات مزيفة أو أنشطة احتيالية إلى تعليق الحساب.

+

السلوكيات المحظورة

+

يمنع على المستخدمين:

+
    +
  • استخدام التطبيق في أنشطة غير قانونية.
  • +
  • مضايقة السائقين أو الركاب الآخرين.
  • +
  • إلحاق الضرر بالمركبة.
  • +
+
+ +
+

4. حقوق وواجبات الشركة

+

واجباتنا

+
    +
  • حماية بياناتك الشخصية.
  • +
  • إبلاغك بأي تغييرات جوهرية في هذه السياسة.
  • +
  • توفير آليات واضحة لك لممارسة حقوقك المتعلقة بالبيانات.
  • +
+

حقوقنا

+
    +
  • تحديث التطبيق وشروط الخدمة.
  • +
  • اتخاذ الإجراءات اللازمة في حال مخالفة المستخدم للسياسة.
  • +
  • رفض تقديم الخدمة لأي سبب مشروع.
  • +
+
+ +
+

5. سياسات الرحلات والسلامة

+

سياسة منع التدخين

+

يُحظر التدخين منعاً باتاً في جميع المركبات.

+

إجراءات السلامة لكوفيد-19

+

نحث جميع المستخدمين والسائقين على اتباع الإرشادات الصحية المحلية.

+
+ +
+

6. إخلاء المسؤولية

+

يقدم التطبيق والخدمات "كما هي" دون أي ضمانات. إنطلق هي منصة وسيطة ولا تتحمل المسؤولية عن أفعال السائقين أو المستخدمين.

+
+ +
+

7. التعديل على السياسة

+

في حال قمنا بإجراء تعديلات جوهرية على هذه الشروط، سنتعهد بإبلاغك بشكل واضح داخل التطبيق. سيُطلب منك قبول الشروط الجديدة لمواصلة استخدام الخدمة.

+
+ +
+

8. حذف الحساب والتواصل معنا

+

لحذف حسابك أو بياناتك، يرجى مراسلتنا على البريد الإلكتروني. يتم الرد على الطلبات خلال 30 يومًا.

+

لأي استفسارات، يرجى التواصل عبر: support@intaleqapp.com

+
+ +
+ +
+

Policy & Terms

+
+ Effective Date: 09/08/2025     Last Updated: 14/08/2025 +
+ +
+

1. Terms of Use & Definitions

+

Terms of Use

+

By downloading, browsing, or using the Intaleq application ("the App"), you agree to be bound by these Terms and Conditions. Intaleq reserves the right to modify these terms at any time. Continued use constitutes acceptance of the terms.

+

Definitions

+
    +
  • "Intaleq" or "the App": Refers to the smartphone application that facilitates ride-hailing services.
  • +
  • "Service Providers" (Drivers): Individuals or entities registered to provide transportation services through Intaleq.
  • +
  • "Users" (Passengers): Individuals who book rides through the App.
  • +
  • "Services": All transportation services provided by Service Providers via the App.
  • +
+
+ +
+

2. Privacy Policy

+

We believe in full transparency regarding your data. Our use of location data is critical to our service and is explained first.

+
+

Prominent Disclosure: Use of Location Data

+

To provide our core ride-hailing services, the Intaleq app collects precise location data from your mobile device. Access to your location is essential for the app to function.

+

We collect this data:

+
    +
  • When the app is open and visible (in the foreground): To determine your pickup location and show you nearby drivers.
  • +
  • When the app is running in the background (after you grant permission): This is crucial to connect you with a ride, track the trip's progress for safety and fare calculation.
  • +
+

Purpose of Use: Without your location data, we cannot find drivers for you, guide them to your pickup point, or calculate your fare. Disabling location services will prevent the app from providing its services.

+
+

Data You Provide Yourself

+
    +
  • Identity Data (for Drivers): Full name, phone number, profile picture, and personal identification to verify eligibility.
  • +
  • Payment Data: We do not collect or store any payment data like card numbers. We connect you with licensed local payment providers.
  • +
+

Other Automatically Collected Data

+
    +
  • Device & Connection Data: Your device's model, OS, unique identifiers, and IP address for security.
  • +
  • Usage Data: Information about how you interact with the app, such as trip history and ratings, to improve our services.
  • +
+
+ +
+

3. User Obligations & Conduct

+

Accurate Information

+

Users must provide true, complete, and up-to-date information. Fake accounts will result in account suspension.

+

Prohibited Conduct

+

Users must not:

+
    +
  • Use the App for illegal activities.
  • +
  • Harass drivers or other passengers.
  • +
  • Damage the vehicle.
  • +
+
+ +
+

4. Company Rights and Duties

+

Our Duties

+
    +
  • To protect your personal data.
  • +
  • To inform you of material changes to this policy.
  • +
  • To provide clear mechanisms to exercise your data rights.
  • +
+

Our Rights

+
    +
  • To update the application and terms of service.
  • +
  • To take necessary actions in case of user violation.
  • +
  • To refuse service for any legitimate reason.
  • +
+
+ +
+

5. Ride & Safety Policies

+

No-Smoking Policy

+

Smoking is strictly prohibited in all vehicles.

+

COVID-19 Safety

+

We urge all users and drivers to follow local health guidelines.

+
+ +
+

6. Disclaimer of Liability

+

The App and services are provided "as is". Intaleq is an intermediary platform and is not liable for the acts of any user or driver.

+
+ +
+

7. Policy Modifications

+

If we make material changes, we will inform you clearly within the app. You will be required to accept the new terms to continue using the service.

+
+ +
+

8. Account Deletion & Contact Us

+

To delete your account or data, please email us. Requests are processed within 30 days.

+

For any questions, contact us at: support@intaleqapp.com

+
+
+ +
+ + + +``` + +## File: schema_tracking.sql +``` +-- MySQL dump 10.13 Distrib 8.0.36-28, for Linux (x86_64) +-- +-- Host: 188.68.36.205 Database: locationDB +-- ------------------------------------------------------ +-- Server version 8.0.36-28 + +/*!40101 SET @OLD_CHARACTER_SET_CLIENT=@@CHARACTER_SET_CLIENT */; +/*!40101 SET @OLD_CHARACTER_SET_RESULTS=@@CHARACTER_SET_RESULTS */; +/*!40101 SET @OLD_COLLATION_CONNECTION=@@COLLATION_CONNECTION */; +/*!50503 SET NAMES utf8mb4 */; +/*!40103 SET @OLD_TIME_ZONE=@@TIME_ZONE */; +/*!40103 SET TIME_ZONE='+00:00' */; +/*!40014 SET @OLD_UNIQUE_CHECKS=@@UNIQUE_CHECKS, UNIQUE_CHECKS=0 */; +/*!40014 SET @OLD_FOREIGN_KEY_CHECKS=@@FOREIGN_KEY_CHECKS, FOREIGN_KEY_CHECKS=0 */; +/*!40101 SET @OLD_SQL_MODE=@@SQL_MODE, SQL_MODE='NO_AUTO_VALUE_ON_ZERO' */; +/*!40111 SET @OLD_SQL_NOTES=@@SQL_NOTES, SQL_NOTES=0 */; +/*!50717 SELECT COUNT(*) INTO @rocksdb_has_p_s_session_variables FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_SCHEMA = 'performance_schema' AND TABLE_NAME = 'session_variables' */; +/*!50717 SET @rocksdb_get_is_supported = IF (@rocksdb_has_p_s_session_variables, 'SELECT COUNT(*) INTO @rocksdb_is_supported FROM performance_schema.session_variables WHERE VARIABLE_NAME=\'rocksdb_bulk_load\'', 'SELECT 0') */; +/*!50717 PREPARE s FROM @rocksdb_get_is_supported */; +/*!50717 EXECUTE s */; +/*!50717 DEALLOCATE PREPARE s */; +/*!50717 SET @rocksdb_enable_bulk_load = IF (@rocksdb_is_supported, 'SET SESSION rocksdb_bulk_load = 1', 'SET @rocksdb_dummy_bulk_load = 0') */; +/*!50717 PREPARE s FROM @rocksdb_enable_bulk_load */; +/*!50717 EXECUTE s */; +/*!50717 DEALLOCATE PREPARE s */; + +-- +-- Table structure for table `CarRegistration` +-- + +DROP TABLE IF EXISTS `CarRegistration`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!50503 SET character_set_client = utf8mb4 */; +CREATE TABLE `CarRegistration` ( + `id` int NOT NULL AUTO_INCREMENT, + `driverID` varchar(100) CHARACTER SET utf8mb3 COLLATE utf8mb3_general_ci NOT NULL, + `vin` varchar(100) CHARACTER SET utf8mb3 COLLATE utf8mb3_general_ci NOT NULL, + `car_plate` varchar(150) CHARACTER SET utf8mb3 COLLATE utf8mb3_general_ci DEFAULT NULL, + `make` varchar(255) CHARACTER SET utf8mb3 COLLATE utf8mb3_general_ci NOT NULL, + `model` varchar(255) CHARACTER SET utf8mb3 COLLATE utf8mb3_general_ci NOT NULL, + `year` varchar(10) CHARACTER SET utf32 COLLATE utf32_general_ci NOT NULL, + `expiration_date` varchar(30) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL, + `color` varchar(255) CHARACTER SET utf8mb3 COLLATE utf8mb3_general_ci NOT NULL, + `owner` varchar(255) CHARACTER SET utf8mb3 COLLATE utf8mb3_general_ci NOT NULL, + `color_hex` varchar(20) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL, + `fuel` varchar(100) CHARACTER SET utf8mb3 COLLATE utf8mb3_general_ci NOT NULL, + `isDefault` tinyint(1) NOT NULL DEFAULT '0', + `created_at` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP, + `status` varchar(20) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL DEFAULT 'yet', + PRIMARY KEY (`id`), + UNIQUE KEY `car_plate` (`car_plate`), + KEY `idx_driverID` (`driverID`) +) ENGINE=InnoDB AUTO_INCREMENT=14 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci; +/*!40101 SET character_set_client = @saved_cs_client */; + +-- +-- Table structure for table `adminUser` +-- + +DROP TABLE IF EXISTS `adminUser`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!50503 SET character_set_client = utf8mb4 */; +CREATE TABLE `adminUser` ( + `id` int NOT NULL AUTO_INCREMENT, + `device_number` varchar(300) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL, + `name` varchar(150) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL, + `created_at` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP, + `updated_at` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP, + PRIMARY KEY (`id`) +) ENGINE=InnoDB AUTO_INCREMENT=3 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci; +/*!40101 SET character_set_client = @saved_cs_client */; + +-- +-- Table structure for table `api_keys` +-- + +DROP TABLE IF EXISTS `api_keys`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!50503 SET character_set_client = utf8mb4 */; +CREATE TABLE `api_keys` ( + `id` int NOT NULL AUTO_INCREMENT, + `name` varchar(20) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL, + `hashed_key` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL, + PRIMARY KEY (`id`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci; +/*!40101 SET character_set_client = @saved_cs_client */; + +-- +-- Table structure for table `blacklist_driver` +-- + +DROP TABLE IF EXISTS `blacklist_driver`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!50503 SET character_set_client = utf8mb4 */; +CREATE TABLE `blacklist_driver` ( + `id` int NOT NULL AUTO_INCREMENT, + `driver_id` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL, + `phone` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL, + `reason` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT 'Violation', + `created_at` timestamp NULL DEFAULT CURRENT_TIMESTAMP, + PRIMARY KEY (`id`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci; +/*!40101 SET character_set_client = @saved_cs_client */; + +-- +-- Table structure for table `canecl` +-- + +DROP TABLE IF EXISTS `canecl`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!50503 SET character_set_client = utf8mb4 */; +CREATE TABLE `canecl` ( + `id` int NOT NULL AUTO_INCREMENT, + `driverID` varchar(111) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL, + `passengerID` varchar(111) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL, + `rideID` varchar(111) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL, + `note` varchar(200) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL DEFAULT 'nothing', + `created_at` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP, + PRIMARY KEY (`id`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci; +/*!40101 SET character_set_client = @saved_cs_client */; + +-- +-- Table structure for table `captains_car` +-- + +DROP TABLE IF EXISTS `captains_car`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!50503 SET character_set_client = utf8mb4 */; +CREATE TABLE `captains_car` ( + `id` int NOT NULL AUTO_INCREMENT, + `driverID` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL, + `vin` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL, + `car_plate` varchar(20) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL, + `make` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL, + `model` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL, + `year` varchar(6) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL, + `expiration_date` varchar(20) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL, + `color` varchar(30) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL, + `owner` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL, + `color_hex` char(15) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL, + `address` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL, + `displacement` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL, + `fuel` varchar(20) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL, + `registration_date` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL, + `isDefault` tinyint(1) NOT NULL DEFAULT '0', + `created_at` timestamp NULL DEFAULT CURRENT_TIMESTAMP, + PRIMARY KEY (`id`), + UNIQUE KEY `car_plate` (`car_plate`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci; +/*!40101 SET character_set_client = @saved_cs_client */; + +-- +-- Table structure for table `carPlateEdit` +-- + +DROP TABLE IF EXISTS `carPlateEdit`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!50503 SET character_set_client = utf8mb4 */; +CREATE TABLE `carPlateEdit` ( + `id` int NOT NULL AUTO_INCREMENT, + `driverId` varchar(50) NOT NULL, + `carPlate` varchar(155) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL, + `color` varchar(20) NOT NULL, + `make` varchar(50) NOT NULL, + `model` varchar(20) NOT NULL, + `expiration_date` varchar(50) NOT NULL, + `owner` varchar(155) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL, + `year` int NOT NULL, + `isEdit` tinyint(1) NOT NULL DEFAULT '0', + `employee` varchar(30) NOT NULL DEFAULT 'any', + `createdAt` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP, + PRIMARY KEY (`id`), + UNIQUE KEY `driverId` (`driverId`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci; +/*!40101 SET character_set_client = @saved_cs_client */; + +-- +-- Table structure for table `car_locations` +-- + +DROP TABLE IF EXISTS `car_locations`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!50503 SET character_set_client = utf8mb4 */; +CREATE TABLE `car_locations` ( + `driver_id` varchar(100) NOT NULL, + `latitude` decimal(10,7) NOT NULL, + `longitude` decimal(10,7) NOT NULL, + `heading` decimal(10,2) NOT NULL, + `speed` double(10,3) NOT NULL, + `distance` decimal(10,2) NOT NULL, + `status` varchar(6) NOT NULL DEFAULT 'off', + `carType` varchar(100) NOT NULL DEFAULT 'Awfar', + `created_at` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP, + `updated_at` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, + `location_point` point NOT NULL /*!80003 SRID 4326 */, + PRIMARY KEY (`driver_id`), + KEY `idx_loc_status_time` (`status`,`updated_at`,`latitude`,`longitude`), + SPATIAL KEY `idx_location_point` (`location_point`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb3; +/*!40101 SET character_set_client = @saved_cs_client */; +/*!50003 SET @saved_cs_client = @@character_set_client */ ; +/*!50003 SET @saved_cs_results = @@character_set_results */ ; +/*!50003 SET @saved_col_connection = @@collation_connection */ ; +/*!50003 SET character_set_client = utf8mb4 */ ; +/*!50003 SET character_set_results = utf8mb4 */ ; +/*!50003 SET collation_connection = utf8mb4_0900_ai_ci */ ; +/*!50003 SET @saved_sql_mode = @@sql_mode */ ; +/*!50003 SET sql_mode = 'NO_AUTO_VALUE_ON_ZERO' */ ; +DELIMITER ;; +/*!50003 CREATE*/ /*!50017 DEFINER=`intaleqLocation`@`%`*/ /*!50003 TRIGGER `trg_before_insert_car_locations` BEFORE INSERT ON `car_locations` FOR EACH ROW BEGIN +SET NEW.location_point = ST_PointFromText(CONCAT('POINT(', NEW.longitude, ' ', NEW.latitude, ')'), 4326); +END */;; +DELIMITER ; +/*!50003 SET sql_mode = @saved_sql_mode */ ; +/*!50003 SET character_set_client = @saved_cs_client */ ; +/*!50003 SET character_set_results = @saved_cs_results */ ; +/*!50003 SET collation_connection = @saved_col_connection */ ; +/*!50003 SET @saved_cs_client = @@character_set_client */ ; +/*!50003 SET @saved_cs_results = @@character_set_results */ ; +/*!50003 SET @saved_col_connection = @@collation_connection */ ; +/*!50003 SET character_set_client = utf8mb4 */ ; +/*!50003 SET character_set_results = utf8mb4 */ ; +/*!50003 SET collation_connection = utf8mb4_0900_ai_ci */ ; +/*!50003 SET @saved_sql_mode = @@sql_mode */ ; +/*!50003 SET sql_mode = 'NO_AUTO_VALUE_ON_ZERO' */ ; +DELIMITER ;; +/*!50003 CREATE*/ /*!50017 DEFINER=`intaleqLocation`@`%`*/ /*!50003 TRIGGER `trg_before_update_car_locations` BEFORE UPDATE ON `car_locations` FOR EACH ROW BEGIN +IF NEW.latitude <> OLD.latitude OR NEW.longitude <> OLD.longitude THEN +SET NEW.location_point = ST_PointFromText(CONCAT('POINT(', NEW.longitude, ' ', NEW.latitude, ')'), 4326); +END IF; +END */;; +DELIMITER ; +/*!50003 SET sql_mode = @saved_sql_mode */ ; +/*!50003 SET character_set_client = @saved_cs_client */ ; +/*!50003 SET character_set_results = @saved_cs_results */ ; +/*!50003 SET collation_connection = @saved_col_connection */ ; + +-- +-- Table structure for table `car_tracks` +-- + +DROP TABLE IF EXISTS `car_tracks`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!50503 SET character_set_client = utf8mb4 */; +CREATE TABLE `car_tracks` ( + `id` int NOT NULL AUTO_INCREMENT, + `driver_id` varchar(100) NOT NULL, + `latitude` decimal(10,7) NOT NULL, + `longitude` decimal(10,7) NOT NULL, + `heading` float DEFAULT NULL, + `speed` float DEFAULT NULL, + `distance` float DEFAULT NULL, + `status` enum('on','off') DEFAULT 'off', + `created_at` timestamp NULL DEFAULT CURRENT_TIMESTAMP, + PRIMARY KEY (`id`), + KEY `idx_driver_time` (`driver_id`,`created_at`) +) ENGINE=InnoDB AUTO_INCREMENT=2559370 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci; +/*!40101 SET character_set_client = @saved_cs_client */; + +-- +-- Table structure for table `card_images` +-- + +DROP TABLE IF EXISTS `card_images`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!50503 SET character_set_client = utf8mb4 */; +CREATE TABLE `card_images` ( + `id` int NOT NULL AUTO_INCREMENT, + `driverID` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL, + `image_name` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL, + `upload_date` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP, + `link` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL, + PRIMARY KEY (`id`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci; +/*!40101 SET character_set_client = @saved_cs_client */; + +-- +-- Table structure for table `carsToWork` +-- + +DROP TABLE IF EXISTS `carsToWork`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!50503 SET character_set_client = utf8mb4 */; +CREATE TABLE `carsToWork` ( + `id` int NOT NULL AUTO_INCREMENT, + `owner_name` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL, + `phone` varchar(15) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL, + `car_number` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL, + `manufacture_year` year NOT NULL, + `car_model` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL, + `car_type` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL, + `site` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL, + `registration_date` date NOT NULL, + `created_at` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP, + PRIMARY KEY (`id`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci; +/*!40101 SET character_set_client = @saved_cs_client */; + +-- +-- Table structure for table `complaint` +-- + +DROP TABLE IF EXISTS `complaint`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!50503 SET character_set_client = utf8mb4 */; +CREATE TABLE `complaint` ( + `id` int NOT NULL AUTO_INCREMENT, + `ride_id` varchar(255) NOT NULL, + `passenger_id` varchar(255) DEFAULT NULL, + `driver_id` varchar(255) DEFAULT NULL, + `complaint_type` enum('Driver','Passenger','Both') NOT NULL, + `description` text, + `date_filed` timestamp NULL DEFAULT CURRENT_TIMESTAMP, + `statusComplaint` enum('Open','In Progress','Resolved') NOT NULL DEFAULT 'Open', + `resolution` text, + `passenger_report` text, + `driver_report` text, + `cs_solutions` text, + `fault_determination` varchar(255) DEFAULT NULL, + `complaint_nature` varchar(255) DEFAULT NULL, + `date_resolved` timestamp NULL DEFAULT NULL, + PRIMARY KEY (`id`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci; +/*!40101 SET character_set_client = @saved_cs_client */; + +-- +-- Table structure for table `contactEgypt` +-- + +DROP TABLE IF EXISTS `contactEgypt`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!50503 SET character_set_client = utf8mb4 */; +CREATE TABLE `contactEgypt` ( + `id` int NOT NULL AUTO_INCREMENT, + `phones` varchar(20) NOT NULL, + `name` varchar(100) NOT NULL, + `phones2` varchar(60) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL, + `createdAt` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP, + PRIMARY KEY (`id`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci; +/*!40101 SET character_set_client = @saved_cs_client */; + +-- +-- Table structure for table `contactSyria` +-- + +DROP TABLE IF EXISTS `contactSyria`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!50503 SET character_set_client = utf8mb4 */; +CREATE TABLE `contactSyria` ( + `id` int NOT NULL AUTO_INCREMENT, + `driverId` varchar(255) NOT NULL COMMENT 'معرّف السائق الذي قام بمزامنة جهة الاتصال', + `name` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci DEFAULT NULL COMMENT 'اسم جهة الاتصال', + `phone` varchar(50) NOT NULL COMMENT 'رقم هاتف جهة الاتصال', + `sync_timestamp` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT 'وقت المزامنة', + PRIMARY KEY (`id`), + UNIQUE KEY `driver_contact_unique` (`driverId`,`phone`) +) ENGINE=InnoDB AUTO_INCREMENT=10 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci; +/*!40101 SET character_set_client = @saved_cs_client */; + +-- +-- Table structure for table `criminalDocuments` +-- + +DROP TABLE IF EXISTS `criminalDocuments`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!50503 SET character_set_client = utf8mb4 */; +CREATE TABLE `criminalDocuments` ( + `id` int NOT NULL AUTO_INCREMENT, + `driverId` varchar(50) NOT NULL, + `IssueDate` varchar(20) NOT NULL, + `createdAt` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP, + `InspectionResult` varchar(100) NOT NULL, + PRIMARY KEY (`id`), + UNIQUE KEY `driverId` (`driverId`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci; +/*!40101 SET character_set_client = @saved_cs_client */; + +-- +-- Table structure for table `driver` +-- + +DROP TABLE IF EXISTS `driver`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!50503 SET character_set_client = utf8mb4 */; +CREATE TABLE `driver` ( + `idn` int NOT NULL AUTO_INCREMENT, + `id` varchar(100) NOT NULL, + `phone` varchar(255) CHARACTER SET utf8mb3 COLLATE utf8mb3_general_ci NOT NULL, + `email` varchar(255) NOT NULL, + `password` varchar(255) NOT NULL, + `gender` varchar(255) CHARACTER SET utf8mb3 COLLATE utf8mb3_general_ci NOT NULL DEFAULT 'Male', + `license_type` varchar(255) DEFAULT NULL, + `national_number` varchar(255) DEFAULT NULL, + `name_arabic` varchar(255) DEFAULT NULL, + `issue_date` date DEFAULT NULL, + `expiry_date` date DEFAULT NULL, + `license_categories` varchar(255) DEFAULT NULL, + `address` text, + `licenseIssueDate` varchar(50) DEFAULT NULL, + `status` varchar(20) NOT NULL DEFAULT 'notDeleted', + `birthdate` varchar(255) CHARACTER SET utf8mb3 COLLATE utf8mb3_general_ci NOT NULL, + `site` varchar(255) NOT NULL, + `first_name` varchar(255) NOT NULL, + `last_name` varchar(255) NOT NULL, + `accountBank` varchar(255) CHARACTER SET utf8mb3 COLLATE utf8mb3_general_ci NOT NULL DEFAULT 'yet', + `bankCode` varchar(255) CHARACTER SET utf8mb3 COLLATE utf8mb3_general_ci NOT NULL DEFAULT 'CIB', + `employmentType` varchar(255) CHARACTER SET utf8mb3 COLLATE utf8mb3_general_ci DEFAULT NULL, + `maritalStatus` varchar(50) CHARACTER SET utf8mb3 COLLATE utf8mb3_general_ci DEFAULT NULL, + `fullNameMaritial` varchar(255) DEFAULT NULL, + `expirationDate` varchar(50) CHARACTER SET utf8mb3 COLLATE utf8mb3_general_ci DEFAULT NULL, + `created_at` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP, + `updated_at` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, + PRIMARY KEY (`idn`) +) ENGINE=InnoDB AUTO_INCREMENT=12 DEFAULT CHARSET=utf8mb3; +/*!40101 SET character_set_client = @saved_cs_client */; + +-- +-- Table structure for table `driverToken` +-- + +DROP TABLE IF EXISTS `driverToken`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!50503 SET character_set_client = utf8mb4 */; +CREATE TABLE `driverToken` ( + `id` int NOT NULL AUTO_INCREMENT, + `token` varchar(300) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL, + `captain_id` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL, + `fingerPrint` varchar(155) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL, + `created_at` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP, + PRIMARY KEY (`id`), + KEY `idx_captain_id` (`captain_id`) +) ENGINE=InnoDB AUTO_INCREMENT=9 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci; +/*!40101 SET character_set_client = @saved_cs_client */; + +-- +-- Table structure for table `driverWallet` +-- + +DROP TABLE IF EXISTS `driverWallet`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!50503 SET character_set_client = utf8mb4 */; +CREATE TABLE `driverWallet` ( + `id` int NOT NULL AUTO_INCREMENT, + `driverID` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL, + `paymentID` varchar(200) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL, + `dateCreated` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP, + `amount` varchar(5) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL, + `paymentMethod` varchar(20) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL, + `dateUpdated` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP, + PRIMARY KEY (`id`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci; +/*!40101 SET character_set_client = @saved_cs_client */; + +-- +-- Table structure for table `driver_behavior` +-- + +DROP TABLE IF EXISTS `driver_behavior`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!50503 SET character_set_client = utf8mb4 */; +CREATE TABLE `driver_behavior` ( + `id` int NOT NULL AUTO_INCREMENT, + `driver_id` varchar(255) NOT NULL, + `trip_id` varchar(255) NOT NULL, + `max_speed` double DEFAULT '0', + `avg_speed` double DEFAULT '0', + `hard_brakes` int DEFAULT '0', + `total_distance` double DEFAULT '0', + `behavior_score` double DEFAULT '0', + `created_at` timestamp NULL DEFAULT CURRENT_TIMESTAMP, + PRIMARY KEY (`id`) +) ENGINE=InnoDB AUTO_INCREMENT=22 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci; +/*!40101 SET character_set_client = @saved_cs_client */; + +-- +-- Table structure for table `driver_daily_summary` +-- + +DROP TABLE IF EXISTS `driver_daily_summary`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!50503 SET character_set_client = utf8mb4 */; +CREATE TABLE `driver_daily_summary` ( + `id` int NOT NULL AUTO_INCREMENT, + `driver_id` varchar(33) CHARACTER SET utf8mb3 COLLATE utf8mb3_general_ci NOT NULL, + `date` date NOT NULL, + `total_seconds` int DEFAULT '0', + `last_updated_at` timestamp NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, + PRIMARY KEY (`id`), + UNIQUE KEY `unique_driver_date` (`driver_id`,`date`) +) ENGINE=InnoDB AUTO_INCREMENT=308443 DEFAULT CHARSET=utf8mb3; +/*!40101 SET character_set_client = @saved_cs_client */; + +-- +-- Table structure for table `driver_daily_work` +-- + +DROP TABLE IF EXISTS `driver_daily_work`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!50503 SET character_set_client = utf8mb4 */; +CREATE TABLE `driver_daily_work` ( + `driver_id` int NOT NULL, + `work_date` date NOT NULL, + `total_seconds` int NOT NULL DEFAULT '0', + `last_point_at` datetime DEFAULT NULL, + `last_status` enum('on','off') CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT 'off', + `updated_at` datetime NOT NULL, + PRIMARY KEY (`driver_id`,`work_date`), + KEY `idx_driver_date` (`driver_id`,`work_date`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci; +/*!40101 SET character_set_client = @saved_cs_client */; + +-- +-- Table structure for table `driver_documents` +-- + +DROP TABLE IF EXISTS `driver_documents`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!50503 SET character_set_client = utf8mb4 */; +CREATE TABLE `driver_documents` ( + `id` int NOT NULL AUTO_INCREMENT, + `driverID` varchar(64) NOT NULL, + `doc_type` varchar(64) NOT NULL, + `image_name` varchar(255) NOT NULL, + `link` varchar(512) NOT NULL, + `upload_date` datetime NOT NULL, + PRIMARY KEY (`id`), + KEY `driverID` (`driverID`) +) ENGINE=InnoDB AUTO_INCREMENT=33 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci; +/*!40101 SET character_set_client = @saved_cs_client */; + +-- +-- Table structure for table `driver_gifts` +-- + +DROP TABLE IF EXISTS `driver_gifts`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!50503 SET character_set_client = utf8mb4 */; +CREATE TABLE `driver_gifts` ( + `id` int NOT NULL AUTO_INCREMENT, + `driver_id` varchar(70) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL, + `gift_description` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL, + `gift_date` datetime DEFAULT CURRENT_TIMESTAMP, + `is_claimed` tinyint(1) DEFAULT '0', + PRIMARY KEY (`id`), + UNIQUE KEY `driver_id` (`driver_id`) +) ENGINE=InnoDB AUTO_INCREMENT=10 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci; +/*!40101 SET character_set_client = @saved_cs_client */; + +-- +-- Table structure for table `driver_health_assurance` +-- + +DROP TABLE IF EXISTS `driver_health_assurance`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!50503 SET character_set_client = utf8mb4 */; +CREATE TABLE `driver_health_assurance` ( + `id` int NOT NULL AUTO_INCREMENT, + `driver_id` varchar(155) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL, + `assured` tinyint(1) DEFAULT '0', + `date_created` timestamp NULL DEFAULT CURRENT_TIMESTAMP, + `health_insurance_provider` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL, + PRIMARY KEY (`id`), + UNIQUE KEY `driver_id` (`driver_id`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci; +/*!40101 SET character_set_client = @saved_cs_client */; + +-- +-- Table structure for table `driver_orders` +-- + +DROP TABLE IF EXISTS `driver_orders`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!50503 SET character_set_client = utf8mb4 */; +CREATE TABLE `driver_orders` ( + `id` int NOT NULL AUTO_INCREMENT, + `driver_id` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL, + `order_id` varchar(99) CHARACTER SET utf8mb3 COLLATE utf8mb3_general_ci NOT NULL, + `notes` varchar(200) CHARACTER SET utf8mb3 COLLATE utf8mb3_general_ci NOT NULL DEFAULT 'nothing', + `created_at` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP, + `status` varchar(30) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT 'applied', + PRIMARY KEY (`id`) +) ENGINE=InnoDB AUTO_INCREMENT=44 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci; +/*!40101 SET character_set_client = @saved_cs_client */; + +-- +-- Table structure for table `driver_ride_scam` +-- + +DROP TABLE IF EXISTS `driver_ride_scam`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!50503 SET character_set_client = utf8mb4 */; +CREATE TABLE `driver_ride_scam` ( + `id` int NOT NULL AUTO_INCREMENT, + `driverID` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL, + `passendgerID` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL, + `rideID` varchar(20) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL, + `isDriverCallPassenger` varchar(10) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL, + `dateCreated` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP, + PRIMARY KEY (`id`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci; +/*!40101 SET character_set_client = @saved_cs_client */; + +-- +-- Table structure for table `driversWantWork` +-- + +DROP TABLE IF EXISTS `driversWantWork`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!50503 SET character_set_client = utf8mb4 */; +CREATE TABLE `driversWantWork` ( + `id` int NOT NULL AUTO_INCREMENT, + `driver_name` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL, + `phone` varchar(15) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL, + `national_id` varchar(20) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL, + `birth_date` varchar(15) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL, + `license_type` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL, + `site` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL, + `created_at` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP, + PRIMARY KEY (`id`), + UNIQUE KEY `national_id` (`national_id`), + UNIQUE KEY `phone` (`phone`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci; +/*!40101 SET character_set_client = @saved_cs_client */; + +-- +-- Table structure for table `email_verifications` +-- + +DROP TABLE IF EXISTS `email_verifications`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!50503 SET character_set_client = utf8mb4 */; +CREATE TABLE `email_verifications` ( + `id` int NOT NULL AUTO_INCREMENT, + `email` varchar(255) NOT NULL, + `token` varchar(255) NOT NULL, + `created_at` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP, + `updated_at` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP, + `verified` tinyint(1) NOT NULL DEFAULT '0', + PRIMARY KEY (`id`), + UNIQUE KEY `email` (`email`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci; +/*!40101 SET character_set_client = @saved_cs_client */; + +-- +-- Table structure for table `employee` +-- + +DROP TABLE IF EXISTS `employee`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!50503 SET character_set_client = utf8mb4 */; +CREATE TABLE `employee` ( + `id` varchar(20) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL, + `name` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL, + `education` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL, + `site` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL, + `phone` varchar(20) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL, + `created_at` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP, + `status` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL, + PRIMARY KEY (`id`), + UNIQUE KEY `phone` (`phone`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci; +/*!40101 SET character_set_client = @saved_cs_client */; + +-- +-- Table structure for table `error` +-- + +DROP TABLE IF EXISTS `error`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!50503 SET character_set_client = utf8mb4 */; +CREATE TABLE `error` ( + `id` int NOT NULL AUTO_INCREMENT, + `error` varchar(400) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL, + `userId` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL, + `userType` varchar(30) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL, + `phone` varchar(20) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL, + `created_at` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP, + `device` varchar(300) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL, + `details` text CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci, + `status` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL DEFAULT 'new', + PRIMARY KEY (`id`), + KEY `idx_error_created_at` (`created_at`), + KEY `idx_error_phone` (`phone`) +) ENGINE=InnoDB AUTO_INCREMENT=14316 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci; +/*!40101 SET character_set_client = @saved_cs_client */; + +-- +-- Table structure for table `feedBack` +-- + +DROP TABLE IF EXISTS `feedBack`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!50503 SET character_set_client = utf8mb4 */; +CREATE TABLE `feedBack` ( + `id` int NOT NULL AUTO_INCREMENT, + `passengerId` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL, + `feedBack` text CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL, + `datecreated` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP, + PRIMARY KEY (`id`) +) ENGINE=InnoDB AUTO_INCREMENT=3 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci; +/*!40101 SET character_set_client = @saved_cs_client */; + +-- +-- Table structure for table `helpCenter` +-- + +DROP TABLE IF EXISTS `helpCenter`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!50503 SET character_set_client = utf8mb4 */; +CREATE TABLE `helpCenter` ( + `id` int NOT NULL AUTO_INCREMENT, + `driverID` varchar(89) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL, + `helpQuestion` varchar(300) CHARACTER SET utf8mb3 COLLATE utf8mb3_general_ci NOT NULL, + `replay` varchar(400) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL DEFAULT 'not yet', + `datecreated` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP, + PRIMARY KEY (`id`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci; +/*!40101 SET character_set_client = @saved_cs_client */; + +-- +-- Table structure for table `hotels` +-- + +DROP TABLE IF EXISTS `hotels`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!50503 SET character_set_client = utf8mb4 */; +CREATE TABLE `hotels` ( + `id` int NOT NULL, + `nameEnglish` varchar(255) DEFAULT NULL, + `nameArabic` varchar(255) DEFAULT NULL, + `phone` varchar(20) DEFAULT NULL, + `countReview` int DEFAULT NULL, + `rate` float DEFAULT NULL, + `stars` varchar(50) DEFAULT NULL, + `address` text, + `website` varchar(255) DEFAULT NULL, + `email` varchar(255) DEFAULT NULL, + `PlusCode` varchar(50) DEFAULT NULL, + `closeTime` varchar(50) DEFAULT NULL, + `latitude` decimal(10,6) DEFAULT NULL, + `longitude` decimal(10,6) DEFAULT NULL, + `instagram` varchar(255) DEFAULT NULL, + `facebook` varchar(255) DEFAULT NULL, + `linkedin` varchar(255) DEFAULT NULL, + `twitter` varchar(255) DEFAULT NULL, + `photo` varchar(255) DEFAULT NULL +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci; +/*!40101 SET character_set_client = @saved_cs_client */; + +-- +-- Table structure for table `imageProfileCaptain` +-- + +DROP TABLE IF EXISTS `imageProfileCaptain`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!50503 SET character_set_client = utf8mb4 */; +CREATE TABLE `imageProfileCaptain` ( + `id` int NOT NULL AUTO_INCREMENT, + `driverID` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL, + `image_name` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL, + `upload_date` datetime DEFAULT CURRENT_TIMESTAMP, + `link` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL, + PRIMARY KEY (`id`) +) ENGINE=InnoDB AUTO_INCREMENT=4 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci; +/*!40101 SET character_set_client = @saved_cs_client */; + +-- +-- Table structure for table `invites` +-- + +DROP TABLE IF EXISTS `invites`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!50503 SET character_set_client = utf8mb4 */; +CREATE TABLE `invites` ( + `id` int NOT NULL AUTO_INCREMENT, + `driverId` varchar(50) NOT NULL, + `inviterDriverPhone` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL, + `createdAt` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP, + `inviteCode` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL, + `isInstall` tinyint(1) NOT NULL DEFAULT '0', + `isGiftToken` tinyint(1) NOT NULL DEFAULT '0', + `expirationTime` datetime NOT NULL, + PRIMARY KEY (`id`), + UNIQUE KEY `inviterDriverId` (`inviterDriverPhone`), + UNIQUE KEY `inviteCode` (`inviteCode`) +) ENGINE=InnoDB AUTO_INCREMENT=5 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci; +/*!40101 SET character_set_client = @saved_cs_client */; + +-- +-- Table structure for table `invitesToPassengers` +-- + +DROP TABLE IF EXISTS `invitesToPassengers`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!50503 SET character_set_client = utf8mb4 */; +CREATE TABLE `invitesToPassengers` ( + `id` int NOT NULL AUTO_INCREMENT, + `driverId` varchar(70) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL, + `passengerID` varchar(80) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL DEFAULT 'yet', + `inviterPassengerPhone` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL, + `inviteCode` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL, + `expirationTime` datetime NOT NULL, + `createdAt` datetime DEFAULT CURRENT_TIMESTAMP, + `isInstall` tinyint(1) DEFAULT '0', + `isGiftToken` tinyint(1) NOT NULL DEFAULT '0', + PRIMARY KEY (`id`), + UNIQUE KEY `inviteCode` (`inviteCode`) +) ENGINE=InnoDB AUTO_INCREMENT=11 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci; +/*!40101 SET character_set_client = @saved_cs_client */; + +-- +-- Table structure for table `invoice_records` +-- + +DROP TABLE IF EXISTS `invoice_records`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!50503 SET character_set_client = utf8mb4 */; +CREATE TABLE `invoice_records` ( + `id` int NOT NULL AUTO_INCREMENT, + `driverID` int NOT NULL, + `invoice_number` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL, + `name` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL, + `amount` decimal(10,2) DEFAULT NULL, + `date` date DEFAULT NULL, + `image_link` text CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci, + `created_at` datetime DEFAULT NULL, + PRIMARY KEY (`id`) +) ENGINE=InnoDB AUTO_INCREMENT=36 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci; +/*!40101 SET character_set_client = @saved_cs_client */; + +-- +-- Table structure for table `invoicesAdmin` +-- + +DROP TABLE IF EXISTS `invoicesAdmin`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!50503 SET character_set_client = utf8mb4 */; +CREATE TABLE `invoicesAdmin` ( + `id` int NOT NULL AUTO_INCREMENT, + `item_name` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL, + `amount` decimal(10,2) NOT NULL, + `image_url` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL, + `created_at` timestamp NULL DEFAULT CURRENT_TIMESTAMP, + PRIMARY KEY (`id`) +) ENGINE=InnoDB AUTO_INCREMENT=22 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci; +/*!40101 SET character_set_client = @saved_cs_client */; + +-- +-- Table structure for table `kazan` +-- + +DROP TABLE IF EXISTS `kazan`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!50503 SET character_set_client = utf8mb4 */; +CREATE TABLE `kazan` ( + `id` int NOT NULL AUTO_INCREMENT, + `country` varchar(30) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL, + `kazan` varchar(10) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL, + `comfortPrice` varchar(10) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL, + `speedPrice` varchar(10) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL, + `familyPrice` varchar(4) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL, + `deliveryPrice` varchar(11) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL, + `freePrice` varchar(11) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL, + `latePrice` varchar(10) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL, + `heavyPrice` varchar(10) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL, + `adminId` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL, + `createdAt` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP, + `naturePrice` varchar(10) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL, + `fuelPrice` varchar(6) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL, + PRIMARY KEY (`id`) +) ENGINE=InnoDB AUTO_INCREMENT=2 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci; +/*!40101 SET character_set_client = @saved_cs_client */; + +-- +-- Table structure for table `lisenceDetails` +-- + +DROP TABLE IF EXISTS `lisenceDetails`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!50503 SET character_set_client = utf8mb4 */; +CREATE TABLE `lisenceDetails` ( + `id` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL, + `driverID` text CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL, + `name` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci DEFAULT NULL, + `licenseClass` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci DEFAULT NULL, + `documentNo` varchar(30) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci DEFAULT NULL, + `address` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci DEFAULT NULL, + `height` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci DEFAULT NULL, + `postalCode` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci DEFAULT NULL, + `sex` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci DEFAULT NULL, + `stateCode` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci DEFAULT NULL, + `expireDate` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci DEFAULT NULL, + `dateOfBirth` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci DEFAULT NULL, + `dateCreated` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP, + PRIMARY KEY (`id`), + UNIQUE KEY `documentNo` (`documentNo`) +) ENGINE=MyISAM DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci; +/*!40101 SET character_set_client = @saved_cs_client */; + +-- +-- Table structure for table `login_attempts` +-- + +DROP TABLE IF EXISTS `login_attempts`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!50503 SET character_set_client = utf8mb4 */; +CREATE TABLE `login_attempts` ( + `id` int NOT NULL AUTO_INCREMENT, + `ip_address` varchar(45) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL, + `attempt_time` timestamp NULL DEFAULT CURRENT_TIMESTAMP, + PRIMARY KEY (`id`) +) ENGINE=InnoDB AUTO_INCREMENT=18 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci; +/*!40101 SET character_set_client = @saved_cs_client */; + +-- +-- Table structure for table `login_attempts_drivers` +-- + +DROP TABLE IF EXISTS `login_attempts_drivers`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!50503 SET character_set_client = utf8mb4 */; +CREATE TABLE `login_attempts_drivers` ( + `id` int NOT NULL AUTO_INCREMENT, + `ip_address` varchar(45) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL, + `attempt_time` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP, + PRIMARY KEY (`id`) +) ENGINE=InnoDB AUTO_INCREMENT=11 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci; +/*!40101 SET character_set_client = @saved_cs_client */; + +-- +-- Table structure for table `mishwaritrips` +-- + +DROP TABLE IF EXISTS `mishwaritrips`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!50503 SET character_set_client = utf8mb4 */; +CREATE TABLE `mishwaritrips` ( + `id` int NOT NULL AUTO_INCREMENT, + `driverId` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL, + `phone` varchar(15) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL, + `gender` varchar(20) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL, + `name` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL, + `name_english` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL, + `address` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL, + `religion` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL, + `age` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL, + `startNameAddress` varchar(150) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL DEFAULT 'none', + `locationCoordinate` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL DEFAULT 'none', + `education` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL, + `license_type` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL, + `national_number` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL, + `car_plate` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL, + `make` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL, + `model` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL, + `color` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL, + `color_hex` char(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL, + `token` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL, + `rating` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL, + `countRide` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL, + `passengerId` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL, + `timeSelected` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL, + `createdAt` timestamp NULL DEFAULT CURRENT_TIMESTAMP, + `status` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT 'pending', + PRIMARY KEY (`id`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci; +/*!40101 SET character_set_client = @saved_cs_client */; + +-- +-- Table structure for table `notesForDriverService` +-- + +DROP TABLE IF EXISTS `notesForDriverService`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!50503 SET character_set_client = utf8mb4 */; +CREATE TABLE `notesForDriverService` ( + `id` int NOT NULL AUTO_INCREMENT, + `phone` varchar(70) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL, + `note` varchar(250) NOT NULL, + `editor` varchar(50) NOT NULL, + `createdAt` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP, + PRIMARY KEY (`id`), + UNIQUE KEY `phone` (`phone`) +) ENGINE=InnoDB AUTO_INCREMENT=5 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci; +/*!40101 SET character_set_client = @saved_cs_client */; + +-- +-- Table structure for table `notesForPassengerService` +-- + +DROP TABLE IF EXISTS `notesForPassengerService`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!50503 SET character_set_client = utf8mb4 */; +CREATE TABLE `notesForPassengerService` ( + `id` int NOT NULL AUTO_INCREMENT, + `phone` int NOT NULL, + `note` varchar(250) NOT NULL, + `editor` varchar(50) NOT NULL, + `createdAt` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP, + PRIMARY KEY (`id`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci; +/*!40101 SET character_set_client = @saved_cs_client */; + +-- +-- Table structure for table `notificationCaptain` +-- + +DROP TABLE IF EXISTS `notificationCaptain`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!50503 SET character_set_client = utf8mb4 */; +CREATE TABLE `notificationCaptain` ( + `id` int NOT NULL AUTO_INCREMENT, + `driverID` varchar(80) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL, + `title` varchar(100) CHARACTER SET utf8mb3 COLLATE utf8mb3_general_ci NOT NULL, + `body` varchar(200) CHARACTER SET utf8mb3 COLLATE utf8mb3_general_ci NOT NULL, + `isShown` varchar(6) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL DEFAULT 'false', + `isPin` varchar(10) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL DEFAULT 'unPin', + `dateCreated` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP, + PRIMARY KEY (`id`) +) ENGINE=InnoDB AUTO_INCREMENT=6 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci; +/*!40101 SET character_set_client = @saved_cs_client */; + +-- +-- Table structure for table `notifications` +-- + +DROP TABLE IF EXISTS `notifications`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!50503 SET character_set_client = utf8mb4 */; +CREATE TABLE `notifications` ( + `id` int NOT NULL AUTO_INCREMENT, + `title` varchar(111) NOT NULL, + `body` varchar(265) NOT NULL, + `passenger_id` varchar(111) NOT NULL, + `isShown` varchar(255) CHARACTER SET utf8mb3 COLLATE utf8mb3_general_ci NOT NULL DEFAULT 'false', + `created_at` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP, + `updated_at` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, + PRIMARY KEY (`id`) +) ENGINE=InnoDB AUTO_INCREMENT=9 DEFAULT CHARSET=utf8mb3; +/*!40101 SET character_set_client = @saved_cs_client */; + +-- +-- Table structure for table `otp_verification_fingerPrint` +-- + +DROP TABLE IF EXISTS `otp_verification_fingerPrint`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!50503 SET character_set_client = utf8mb4 */; +CREATE TABLE `otp_verification_fingerPrint` ( + `id` int NOT NULL, + `phone` varchar(20) NOT NULL, + `otp` varchar(6) NOT NULL, + `createdAt` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci; +/*!40101 SET character_set_client = @saved_cs_client */; + +-- +-- Table structure for table `packageInfo` +-- + +DROP TABLE IF EXISTS `packageInfo`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!50503 SET character_set_client = utf8mb4 */; +CREATE TABLE `packageInfo` ( + `id` int NOT NULL AUTO_INCREMENT, + `platform` varchar(50) NOT NULL, + `appName` varchar(20) NOT NULL, + `createdAt` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP, + `version` varchar(10) NOT NULL, + PRIMARY KEY (`id`) +) ENGINE=InnoDB AUTO_INCREMENT=5 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci; +/*!40101 SET character_set_client = @saved_cs_client */; + +-- +-- Table structure for table `palces11` +-- + +DROP TABLE IF EXISTS `palces11`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!50503 SET character_set_client = utf8mb4 */; +CREATE TABLE `palces11` ( + `id` int NOT NULL AUTO_INCREMENT, + `latitude` varchar(50) NOT NULL, + `longitude` varchar(50) NOT NULL, + `name` varchar(180) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci DEFAULT NULL, + `name_ar` varchar(200) NOT NULL, + `name_en` varchar(200) NOT NULL, + `address` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci DEFAULT NULL, + `category` varchar(55) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci DEFAULT NULL, + `created_at` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP, + `location` point NOT NULL, + PRIMARY KEY (`id`), + SPATIAL KEY `idx_spatial_location` (`location`), + FULLTEXT KEY `idx_fulltext_search` (`name`,`name_ar`,`name_en`,`address`,`category`) +) ENGINE=InnoDB AUTO_INCREMENT=28951 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci; +/*!40101 SET character_set_client = @saved_cs_client */; + +-- +-- Table structure for table `passengerWallet` +-- + +DROP TABLE IF EXISTS `passengerWallet`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!50503 SET character_set_client = utf8mb4 */; +CREATE TABLE `passengerWallet` ( + `id` int NOT NULL AUTO_INCREMENT, + `passenger_id` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL, + `balance` decimal(10,2) NOT NULL, + `created_at` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP, + `updated_at` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, + PRIMARY KEY (`id`), + KEY `passenger_id` (`passenger_id`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci; +/*!40101 SET character_set_client = @saved_cs_client */; + +-- +-- Table structure for table `passenger_blacklist` +-- + +DROP TABLE IF EXISTS `passenger_blacklist`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!50503 SET character_set_client = utf8mb4 */; +CREATE TABLE `passenger_blacklist` ( + `id` bigint unsigned NOT NULL AUTO_INCREMENT, + `phone` varchar(150) NOT NULL, + `phone_normalized` varchar(64) NOT NULL, + `reason` varchar(255) DEFAULT NULL, + `expires_at` datetime DEFAULT CURRENT_TIMESTAMP, + `created_at` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP, + PRIMARY KEY (`id`), + UNIQUE KEY `uq_phone_norm` (`phone_normalized`), + KEY `idx_expires` (`expires_at`) +) ENGINE=InnoDB AUTO_INCREMENT=2 DEFAULT CHARSET=utf8mb3; +/*!40101 SET character_set_client = @saved_cs_client */; + +-- +-- Table structure for table `passengerlocation` +-- + +DROP TABLE IF EXISTS `passengerlocation`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!50503 SET character_set_client = utf8mb4 */; +CREATE TABLE `passengerlocation` ( + `id` int NOT NULL AUTO_INCREMENT, + `passengerId` varchar(60) NOT NULL, + `lat` varchar(20) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL, + `lng` varchar(20) NOT NULL, + `rideId` varchar(10) NOT NULL, + `createdAt` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP, + PRIMARY KEY (`id`) +) ENGINE=InnoDB AUTO_INCREMENT=3172 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci; +/*!40101 SET character_set_client = @saved_cs_client */; + +-- +-- Table structure for table `passengers` +-- + +DROP TABLE IF EXISTS `passengers`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!50503 SET character_set_client = utf8mb4 */; +CREATE TABLE `passengers` ( + `id` varchar(100) NOT NULL, + `phone` varchar(150) CHARACTER SET utf8mb3 COLLATE utf8mb3_general_ci NOT NULL, + `email` varchar(255) NOT NULL, + `password` varchar(100) NOT NULL, + `gender` varchar(150) CHARACTER SET utf8mb3 COLLATE utf8mb3_general_ci NOT NULL, + `status` varchar(150) CHARACTER SET utf8mb3 COLLATE utf8mb3_general_ci NOT NULL DEFAULT 'notDeleted', + `birthdate` varchar(150) CHARACTER SET utf8mb3 COLLATE utf8mb3_general_ci NOT NULL, + `site` varchar(255) NOT NULL, + `first_name` varchar(255) NOT NULL, + `last_name` varchar(255) NOT NULL, + `sosPhone` varchar(150) CHARACTER SET utf8mb3 COLLATE utf8mb3_general_ci NOT NULL DEFAULT 'sos', + `education` varchar(150) CHARACTER SET utf8mb3 COLLATE utf8mb3_general_ci NOT NULL DEFAULT 'none', + `employmentType` varchar(150) CHARACTER SET utf8mb3 COLLATE utf8mb3_general_ci NOT NULL DEFAULT 'none', + `maritalStatus` varchar(150) CHARACTER SET utf8mb3 COLLATE utf8mb3_general_ci NOT NULL DEFAULT 'none', + `created_at` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP, + `updated_at` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, + PRIMARY KEY (`id`), + UNIQUE KEY `phone` (`phone`,`email`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb3; +/*!40101 SET character_set_client = @saved_cs_client */; + +-- +-- Table structure for table `payment_tokens` +-- + +DROP TABLE IF EXISTS `payment_tokens`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!50503 SET character_set_client = utf8mb4 */; +CREATE TABLE `payment_tokens` ( + `id` int NOT NULL AUTO_INCREMENT, + `token` varchar(255) NOT NULL, + `driverID` varchar(255) NOT NULL, + `dateCreated` datetime NOT NULL, + `amount` decimal(10,2) NOT NULL, + `isUsed` tinyint(1) DEFAULT '0', + PRIMARY KEY (`id`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci; +/*!40101 SET character_set_client = @saved_cs_client */; + +-- +-- Table structure for table `payment_tokens_passenger` +-- + +DROP TABLE IF EXISTS `payment_tokens_passenger`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!50503 SET character_set_client = utf8mb4 */; +CREATE TABLE `payment_tokens_passenger` ( + `id` int NOT NULL AUTO_INCREMENT, + `token` varchar(255) NOT NULL, + `passengerId` varchar(255) NOT NULL, + `dateCreated` datetime NOT NULL, + `amount` decimal(10,2) NOT NULL, + `isUsed` tinyint(1) DEFAULT '0', + PRIMARY KEY (`id`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci; +/*!40101 SET character_set_client = @saved_cs_client */; + +-- +-- Table structure for table `payments` +-- + +DROP TABLE IF EXISTS `payments`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!50503 SET character_set_client = utf8mb4 */; +CREATE TABLE `payments` ( + `id` varchar(111) NOT NULL, + `amount` decimal(10,2) NOT NULL, + `payment_method` varchar(255) NOT NULL, + `passengerID` varchar(100) NOT NULL, + `rideId` varchar(100) NOT NULL, + `driverID` varchar(100) NOT NULL, + `created_at` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP, + `updated_at` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, + `isGiven` varchar(20) NOT NULL DEFAULT 'waiting', + PRIMARY KEY (`id`), + UNIQUE KEY `rideId` (`rideId`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb3; +/*!40101 SET character_set_client = @saved_cs_client */; + +-- +-- Table structure for table `paymentsDriverPoints` +-- + +DROP TABLE IF EXISTS `paymentsDriverPoints`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!50503 SET character_set_client = utf8mb4 */; +CREATE TABLE `paymentsDriverPoints` ( + `id` int NOT NULL AUTO_INCREMENT, + `amount` decimal(10,2) NOT NULL, + `payment_method` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL, + `driverID` varchar(60) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL, + `created_at` datetime DEFAULT CURRENT_TIMESTAMP, + `updated_at` datetime DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, + PRIMARY KEY (`id`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci; +/*!40101 SET character_set_client = @saved_cs_client */; + +-- +-- Table structure for table `phone_verification` +-- + +DROP TABLE IF EXISTS `phone_verification`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!50503 SET character_set_client = utf8mb4 */; +CREATE TABLE `phone_verification` ( + `id` int NOT NULL AUTO_INCREMENT, + `phone_number` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL, + `driverId` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL DEFAULT 'yet', + `email` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL DEFAULT 'yet', + `token_code` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL, + `expiration_time` datetime NOT NULL, + `is_verified` tinyint(1) DEFAULT '0', + `created_at` timestamp NULL DEFAULT CURRENT_TIMESTAMP, + PRIMARY KEY (`id`) +) ENGINE=InnoDB AUTO_INCREMENT=111 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci; +/*!40101 SET character_set_client = @saved_cs_client */; + +-- +-- Table structure for table `phone_verification_passenger` +-- + +DROP TABLE IF EXISTS `phone_verification_passenger`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!50503 SET character_set_client = utf8mb4 */; +CREATE TABLE `phone_verification_passenger` ( + `id` int NOT NULL AUTO_INCREMENT, + `phone_number` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci DEFAULT NULL, + `token` varchar(80) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL, + `expiration_time` datetime NOT NULL, + `verified` tinyint(1) DEFAULT '0', + `created_at` timestamp NULL DEFAULT CURRENT_TIMESTAMP, + `status` varchar(22) NOT NULL DEFAULT 'yet', + PRIMARY KEY (`id`) +) ENGINE=InnoDB AUTO_INCREMENT=109 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci; +/*!40101 SET character_set_client = @saved_cs_client */; + +-- +-- Table structure for table `places` +-- + +DROP TABLE IF EXISTS `places`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!50503 SET character_set_client = utf8mb4 */; +CREATE TABLE `places` ( + `id` int NOT NULL AUTO_INCREMENT, + `latitude` double NOT NULL, + `longitude` double NOT NULL, + `name` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL, + `name_ar` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL, + `name_en` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL, + `address` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL, + `category` varchar(200) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL, + `created_at` timestamp NULL DEFAULT CURRENT_TIMESTAMP, + PRIMARY KEY (`id`) +) ENGINE=InnoDB AUTO_INCREMENT=8996 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci; +/*!40101 SET character_set_client = @saved_cs_client */; + +-- +-- Table structure for table `placesEgypt` +-- + +DROP TABLE IF EXISTS `placesEgypt`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!50503 SET character_set_client = utf8mb4 */; +CREATE TABLE `placesEgypt` ( + `id` int NOT NULL, + `nameEnglish` varchar(255) DEFAULT NULL, + `nameArabic` varchar(255) DEFAULT NULL, + `phone` varchar(20) DEFAULT NULL, + `countReview` int DEFAULT NULL, + `rate` float DEFAULT NULL, + `stars` varchar(50) DEFAULT NULL, + `address` text, + `website` varchar(255) DEFAULT NULL, + `email` varchar(255) DEFAULT NULL, + `PlusCode` varchar(50) DEFAULT NULL, + `closeTime` varchar(50) DEFAULT NULL, + `latitude` decimal(10,6) DEFAULT NULL, + `longitude` decimal(10,6) DEFAULT NULL, + `instagram` varchar(255) DEFAULT NULL, + `facebook` varchar(255) DEFAULT NULL, + `linkedin` varchar(255) DEFAULT NULL, + `twitter` varchar(255) DEFAULT NULL, + `photo` varchar(255) DEFAULT NULL +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci; +/*!40101 SET character_set_client = @saved_cs_client */; + +-- +-- Table structure for table `promos` +-- + +DROP TABLE IF EXISTS `promos`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!50503 SET character_set_client = utf8mb4 */; +CREATE TABLE `promos` ( + `id` int NOT NULL AUTO_INCREMENT, + `promo_code` varchar(10) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL, + `amount` varchar(4) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL DEFAULT '0', + `description` varchar(100) CHARACTER SET utf8mb3 COLLATE utf8mb3_general_ci DEFAULT NULL, + `passengerID` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL DEFAULT 'none', + `validity_start_date` date DEFAULT NULL, + `validity_end_date` date DEFAULT NULL, + PRIMARY KEY (`id`), + UNIQUE KEY `passengerID` (`passengerID`) +) ENGINE=InnoDB AUTO_INCREMENT=2 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci; +/*!40101 SET character_set_client = @saved_cs_client */; + +-- +-- Table structure for table `promptDriverIDEgypt` +-- + +DROP TABLE IF EXISTS `promptDriverIDEgypt`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!50503 SET character_set_client = utf8mb4 */; +CREATE TABLE `promptDriverIDEgypt` ( + `id` int NOT NULL AUTO_INCREMENT, + `type` varchar(30) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL, + `prompt` longtext CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL, + `createdAt` timestamp NULL DEFAULT CURRENT_TIMESTAMP, + `updatedAt` timestamp NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, + PRIMARY KEY (`id`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci; +/*!40101 SET character_set_client = @saved_cs_client */; + +-- +-- Table structure for table `ratingApp` +-- + +DROP TABLE IF EXISTS `ratingApp`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!50503 SET character_set_client = utf8mb4 */; +CREATE TABLE `ratingApp` ( + `id` int NOT NULL AUTO_INCREMENT, + `name` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL, + `email` varchar(150) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL, + `phone` varchar(80) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL, + `userId` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL, + `userType` varchar(20) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL, + `rating` varchar(2) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL, + `comment` varchar(300) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL, + `created_at` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP, + PRIMARY KEY (`id`) +) ENGINE=InnoDB AUTO_INCREMENT=11 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci; +/*!40101 SET character_set_client = @saved_cs_client */; + +-- +-- Table structure for table `ratingDriver` +-- + +DROP TABLE IF EXISTS `ratingDriver`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!50503 SET character_set_client = utf8mb4 */; +CREATE TABLE `ratingDriver` ( + `id` int NOT NULL AUTO_INCREMENT, + `passenger_id` text CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci, + `driver_id` varchar(33) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL, + `ride_id` int DEFAULT NULL, + `rating` float DEFAULT NULL, + `comment` text CHARACTER SET utf8mb3 COLLATE utf8mb3_general_ci, + `created_at` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP, + PRIMARY KEY (`id`), + UNIQUE KEY `ride_id` (`ride_id`), + KEY `idx_driver_id` (`driver_id`) +) ENGINE=InnoDB AUTO_INCREMENT=17 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci; +/*!40101 SET character_set_client = @saved_cs_client */; + +-- +-- Table structure for table `ratingPassenger` +-- + +DROP TABLE IF EXISTS `ratingPassenger`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!50503 SET character_set_client = utf8mb4 */; +CREATE TABLE `ratingPassenger` ( + `id` int NOT NULL AUTO_INCREMENT, + `passenger_id` text CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL, + `driverID` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL, + `rideId` varchar(30) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL, + `rating` float NOT NULL, + `comment` text CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci, + `created_at` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP, + PRIMARY KEY (`id`), + UNIQUE KEY `rideId` (`rideId`) +) ENGINE=InnoDB AUTO_INCREMENT=17 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci; +/*!40101 SET character_set_client = @saved_cs_client */; + +-- +-- Table structure for table `ride` +-- + +DROP TABLE IF EXISTS `ride`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!50503 SET character_set_client = utf8mb4 */; +CREATE TABLE `ride` ( + `id` int NOT NULL AUTO_INCREMENT, + `start_location` varchar(255) NOT NULL, + `end_location` varchar(255) NOT NULL, + `date` date NOT NULL, + `time` time NOT NULL, + `endtime` time NOT NULL, + `price` decimal(10,2) NOT NULL DEFAULT '0.00', + `passenger_id` varchar(111) NOT NULL, + `driver_id` varchar(111) NOT NULL, + `status` varchar(200) NOT NULL DEFAULT 'nothing', + `paymentMethod` varchar(20) NOT NULL DEFAULT 'Cash', + `carType` varchar(20) NOT NULL DEFAULT 'Speed', + `created_at` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, + `updated_at` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, + `DriverIsGoingToPassenger` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP, + `rideTimeStart` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP, + `rideTimeFinish` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP, + `price_for_driver` decimal(10,2) NOT NULL DEFAULT '0.00', + `price_for_passenger` decimal(10,2) NOT NULL DEFAULT '0.00', + `distance` float DEFAULT '0', + PRIMARY KEY (`id`), + KEY `passengerfk` (`passenger_id`), + KEY `driverfk` (`driver_id`) +) ENGINE=InnoDB AUTO_INCREMENT=94 DEFAULT CHARSET=utf8mb3; +/*!40101 SET character_set_client = @saved_cs_client */; + +-- +-- Table structure for table `seferWallet` +-- + +DROP TABLE IF EXISTS `seferWallet`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!50503 SET character_set_client = utf8mb4 */; +CREATE TABLE `seferWallet` ( + `id` int NOT NULL AUTO_INCREMENT, + `driverId` varchar(100) NOT NULL, + `passengerId` varchar(100) NOT NULL, + `amount` varchar(10) NOT NULL, + `paymentMethod` varchar(50) NOT NULL, + `token` varchar(100) NOT NULL, + `createdAt` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP, + PRIMARY KEY (`id`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci; +/*!40101 SET character_set_client = @saved_cs_client */; + +-- +-- Table structure for table `server_locations` +-- + +DROP TABLE IF EXISTS `server_locations`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!50503 SET character_set_client = utf8mb4 */; +CREATE TABLE `server_locations` ( + `id` int NOT NULL AUTO_INCREMENT, + `name` varchar(255) NOT NULL, + `min_latitude` decimal(10,6) NOT NULL, + `max_latitude` decimal(10,6) NOT NULL, + `min_longitude` decimal(10,6) NOT NULL, + `max_longitude` decimal(10,6) NOT NULL, + `server_link` varchar(255) NOT NULL, + PRIMARY KEY (`id`), + UNIQUE KEY `name` (`name`) +) ENGINE=InnoDB AUTO_INCREMENT=2 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci; +/*!40101 SET character_set_client = @saved_cs_client */; + +-- +-- Table structure for table `smsSender` +-- + +DROP TABLE IF EXISTS `smsSender`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!50503 SET character_set_client = utf8mb4 */; +CREATE TABLE `smsSender` ( + `id` int NOT NULL AUTO_INCREMENT, + `senderId` varchar(20) NOT NULL, + PRIMARY KEY (`id`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci; +/*!40101 SET character_set_client = @saved_cs_client */; + +-- +-- Table structure for table `test` +-- + +DROP TABLE IF EXISTS `test`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!50503 SET character_set_client = utf8mb4 */; +CREATE TABLE `test` ( + `id` int NOT NULL AUTO_INCREMENT, + `name` varchar(22) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL, + PRIMARY KEY (`id`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci; +/*!40101 SET character_set_client = @saved_cs_client */; + +-- +-- Table structure for table `testApp` +-- + +DROP TABLE IF EXISTS `testApp`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!50503 SET character_set_client = utf8mb4 */; +CREATE TABLE `testApp` ( + `id` int NOT NULL AUTO_INCREMENT, + `isTest` tinyint(1) NOT NULL, + `createdAt` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP, + `appPlatform` varchar(20) NOT NULL, + PRIMARY KEY (`id`) +) ENGINE=InnoDB AUTO_INCREMENT=3 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci; +/*!40101 SET character_set_client = @saved_cs_client */; + +-- +-- Table structure for table `tips` +-- + +DROP TABLE IF EXISTS `tips`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!50503 SET character_set_client = utf8mb4 */; +CREATE TABLE `tips` ( + `id` int NOT NULL AUTO_INCREMENT, + `driverID` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL, + `passengerID` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL, + `rideID` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL, + `tipAmount` decimal(10,2) DEFAULT NULL, + PRIMARY KEY (`id`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci; +/*!40101 SET character_set_client = @saved_cs_client */; + +-- +-- Table structure for table `token_verification` +-- + +DROP TABLE IF EXISTS `token_verification`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!50503 SET character_set_client = utf8mb4 */; +CREATE TABLE `token_verification` ( + `id` int NOT NULL AUTO_INCREMENT, + `phone_number` text CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL, + `token` text CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL, + `expiration_time` datetime NOT NULL, + `verified` tinyint(1) DEFAULT '0', + `created_at` datetime DEFAULT CURRENT_TIMESTAMP, + PRIMARY KEY (`id`) +) ENGINE=InnoDB AUTO_INCREMENT=49 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci; +/*!40101 SET character_set_client = @saved_cs_client */; + +-- +-- Table structure for table `token_verification_admin` +-- + +DROP TABLE IF EXISTS `token_verification_admin`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!50503 SET character_set_client = utf8mb4 */; +CREATE TABLE `token_verification_admin` ( + `id` int NOT NULL AUTO_INCREMENT, + `phone_number` varchar(20) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL, + `token` varchar(10) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL, + `expiration_time` datetime NOT NULL, + PRIMARY KEY (`id`), + UNIQUE KEY `phone_number` (`phone_number`) +) ENGINE=InnoDB AUTO_INCREMENT=29 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci; +/*!40101 SET character_set_client = @saved_cs_client */; + +-- +-- Table structure for table `token_verification_driver` +-- + +DROP TABLE IF EXISTS `token_verification_driver`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!50503 SET character_set_client = utf8mb4 */; +CREATE TABLE `token_verification_driver` ( + `id` int NOT NULL AUTO_INCREMENT, + `phone_number` text CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL, + `token` text CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL, + `expiration_time` datetime NOT NULL, + `verified` tinyint(1) NOT NULL DEFAULT '0', + `created_at` datetime DEFAULT CURRENT_TIMESTAMP, + PRIMARY KEY (`id`) +) ENGINE=InnoDB AUTO_INCREMENT=49 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci; +/*!40101 SET character_set_client = @saved_cs_client */; + +-- +-- Table structure for table `tokens` +-- + +DROP TABLE IF EXISTS `tokens`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!50503 SET character_set_client = utf8mb4 */; +CREATE TABLE `tokens` ( + `id` int NOT NULL AUTO_INCREMENT, + `token` varchar(333) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL, + `passengerID` varchar(80) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL, + `fingerPrint` varchar(250) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL, + `status` varchar(22) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL DEFAULT 'yet', + PRIMARY KEY (`id`), + UNIQUE KEY `passengerID` (`passengerID`) +) ENGINE=InnoDB AUTO_INCREMENT=53 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci; +/*!40101 SET character_set_client = @saved_cs_client */; + +-- +-- Table structure for table `users` +-- + +DROP TABLE IF EXISTS `users`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!50503 SET character_set_client = utf8mb4 */; +CREATE TABLE `users` ( + `id` varchar(111) NOT NULL, + `phone` varchar(15) NOT NULL, + `email` varchar(255) NOT NULL, + `gender` varchar(10) NOT NULL, + `password` varchar(100) NOT NULL, + `birthdate` date NOT NULL, + `site` varchar(255) NOT NULL, + `first_name` varchar(255) NOT NULL, + `last_name` varchar(255) NOT NULL, + `created_at` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP, + `updated_at` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, + `user_type` varchar(44) NOT NULL, + PRIMARY KEY (`id`), + UNIQUE KEY `email` (`email`), + UNIQUE KEY `phone` (`phone`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb3; +/*!40101 SET character_set_client = @saved_cs_client */; + +-- +-- Table structure for table `vehicles` +-- + +DROP TABLE IF EXISTS `vehicles`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!50503 SET character_set_client = utf8mb4 */; +CREATE TABLE `vehicles` ( + `id` int NOT NULL AUTO_INCREMENT, + `driverID` varchar(100) NOT NULL, + `make` varchar(255) NOT NULL, + `model` varchar(255) NOT NULL, + `license_plate` varchar(255) NOT NULL, + `seats` int NOT NULL, + `created_at` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP, + `updated_at` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, + PRIMARY KEY (`id`), + UNIQUE KEY `license_plate` (`license_plate`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb3; +/*!40101 SET character_set_client = @saved_cs_client */; + +-- +-- Table structure for table `videos` +-- + +DROP TABLE IF EXISTS `videos`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!50503 SET character_set_client = utf8mb4 */; +CREATE TABLE `videos` ( + `id` int NOT NULL AUTO_INCREMENT, + `title` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL, + `description` varchar(200) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL, + `url` varchar(150) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL, + `created_at` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP, + PRIMARY KEY (`id`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci; +/*!40101 SET character_set_client = @saved_cs_client */; + +-- +-- Table structure for table `waitingRides` +-- + +DROP TABLE IF EXISTS `waitingRides`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!50503 SET character_set_client = utf8mb4 */; +CREATE TABLE `waitingRides` ( + `id` varchar(100) NOT NULL, + `start_location` varchar(255) NOT NULL, + `end_location` varchar(255) NOT NULL, + `date` date NOT NULL, + `time` time NOT NULL, + `price` decimal(10,2) NOT NULL DEFAULT '0.00', + `passenger_id` varchar(111) NOT NULL, + `status` varchar(200) NOT NULL DEFAULT 'nothing', + `carType` varchar(19) NOT NULL, + `passengerRate` decimal(10,2) NOT NULL, + `created_at` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, + `price_for_passenger` decimal(10,2) NOT NULL DEFAULT '0.00', + `distance` varchar(255) NOT NULL, + `duration` varchar(10) NOT NULL DEFAULT '0', + PRIMARY KEY (`id`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb3; +/*!40101 SET character_set_client = @saved_cs_client */; + +-- +-- Table structure for table `welcomeDriverCall` +-- + +DROP TABLE IF EXISTS `welcomeDriverCall`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!50503 SET character_set_client = utf8mb4 */; +CREATE TABLE `welcomeDriverCall` ( + `id` int NOT NULL AUTO_INCREMENT, + `driverId` varchar(50) NOT NULL, + `isCall` tinyint(1) NOT NULL DEFAULT '0', + `notes` varchar(255) NOT NULL, + `createdAt` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP, + PRIMARY KEY (`id`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci; +/*!40101 SET character_set_client = @saved_cs_client */; + +-- +-- Table structure for table `write_argument_after_applied_from_background` +-- + +DROP TABLE IF EXISTS `write_argument_after_applied_from_background`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!50503 SET character_set_client = utf8mb4 */; +CREATE TABLE `write_argument_after_applied_from_background` ( + `id` int unsigned NOT NULL AUTO_INCREMENT, + `ride_id` varchar(50) NOT NULL, + `driver_id` varchar(50) NOT NULL, + `passenger_id` varchar(50) NOT NULL, + `passenger_location` varchar(30) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL, + `passenger_destination` varchar(30) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL, + `duration` varchar(255) NOT NULL, + `duration_to_passenger` varchar(255) NOT NULL, + `duration_of_ride` varchar(255) NOT NULL, + `distance` varchar(255) NOT NULL, + `total_cost` varchar(255) NOT NULL, + `payment_amount` varchar(255) NOT NULL, + `payment_method` enum('visa','cash') NOT NULL, + `wallet_checked` varchar(255) NOT NULL, + `has_steps` varchar(255) NOT NULL, + `step0` varchar(255) DEFAULT NULL, + `step1` varchar(255) DEFAULT NULL, + `step2` varchar(255) DEFAULT NULL, + `step3` varchar(255) DEFAULT NULL, + `step4` varchar(255) DEFAULT NULL, + `passenger_wallet_burc` varchar(33) NOT NULL, + `token_passenger` varchar(255) NOT NULL, + `name` varchar(100) NOT NULL, + `phone` varchar(20) NOT NULL, + `email` varchar(150) NOT NULL, + `start_name_location` varchar(255) NOT NULL, + `end_name_location` varchar(255) NOT NULL, + `car_type` varchar(50) NOT NULL, + `kazan` varchar(255) NOT NULL, + `direction_url` text NOT NULL, + `time_of_order` datetime NOT NULL, + `total_passenger` varchar(255) NOT NULL, + PRIMARY KEY (`id`) +) ENGINE=InnoDB AUTO_INCREMENT=3 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci; +/*!40101 SET character_set_client = @saved_cs_client */; + +-- +-- Dumping events for database 'locationDB' +-- + +-- +-- Dumping routines for database 'locationDB' +-- +/*!50112 SET @disable_bulk_load = IF (@is_rocksdb_supported, 'SET SESSION rocksdb_bulk_load = @old_rocksdb_bulk_load', 'SET @dummy_rocksdb_bulk_load = 0') */; +/*!50112 PREPARE s FROM @disable_bulk_load */; +/*!50112 EXECUTE s */; +/*!50112 DEALLOCATE PREPARE s */; +/*!40103 SET TIME_ZONE=@OLD_TIME_ZONE */; + +/*!40101 SET SQL_MODE=@OLD_SQL_MODE */; +/*!40014 SET FOREIGN_KEY_CHECKS=@OLD_FOREIGN_KEY_CHECKS */; +/*!40014 SET UNIQUE_CHECKS=@OLD_UNIQUE_CHECKS */; +/*!40101 SET CHARACTER_SET_CLIENT=@OLD_CHARACTER_SET_CLIENT */; +/*!40101 SET CHARACTER_SET_RESULTS=@OLD_CHARACTER_SET_RESULTS */; +/*!40101 SET COLLATION_CONNECTION=@OLD_COLLATION_CONNECTION */; +/*!40111 SET SQL_NOTES=@OLD_SQL_NOTES */; + +-- Dump completed on 2026-04-22 20:48:59 + +``` + +## File: loginJwtDriver.php +``` +enforce(RateLimiter::identifier(), 'login'); + + $id = filterRequest('id'); + $audience = filterRequest('aud'); + $fingerprint = filterRequest('fingerPrint') ?? filterRequest('fingerprint'); + + $aud1 = getenv('allowedDriver1'); + $aud2 = getenv('allowedDriver2'); + $allowedAudiences = array_values(array_filter([$aud1, $aud2])); + + if (empty($id) || empty($audience)) { + jsonError('Missing required fields', 400); + } + + if (!in_array($audience, $allowedAudiences, true)) { + jsonError('Invalid audience', 400); + } + + $con = Database::get('main'); + $pepper = getenv('SECRET_KEY_HMAC'); + + $stmt = $con->prepare(' + SELECT id, phone, national_number, email, password + FROM driver + WHERE id = :id + LIMIT 1 + '); + $stmt->execute([':id' => $id]); + $driver = $stmt->fetch(); + + if (!$driver || empty($driver['password'])) { + unauthorizedDriver(); + } + + $decPhone = !empty($driver['phone']) ? $encryptionHelper->decryptData($driver['phone']) : null; + $decNat = !empty($driver['national_number']) ? $encryptionHelper->decryptData($driver['national_number']) : null; + + if (empty($decPhone) || empty($decNat)) { + unauthorizedDriver(); + } + + $baseString = $driver['id'] . '|' . trim($decPhone) . '|' . trim($decNat); + $hmacHex = hash_hmac('sha256', $baseString, $pepper, false); + + if (!password_verify($hmacHex, $driver['password'])) { + unauthorizedDriver(); + } + + $limiter->reset(RateLimiter::identifier(), 'login'); + + $jwtService = new JwtService($redis); + $jwt = $jwtService->generateAccessToken($driver['id'], 'driver', $audience, $fingerprint); + $refresh = $jwtService->generateRefreshToken($driver['id']); + + jsonSuccess([ + 'jwt' => $jwt, + 'refresh_token' => $refresh['token'], + 'expires_in' => 900 + ]); + +} catch (PDOException $e) { + securityLog("LoginDriver PDO Error", ['msg' => $e->getMessage()]); + jsonError('Database error', 500); +} catch (Exception $e) { + securityLog("LoginDriver Error", ['msg' => $e->getMessage()]); + jsonError('Server error', 500); +} +``` + +## File: get_connect.php +``` +enforce(RateLimiter::identifier(), 'api'); + +// 3. الاتصال الافتراضي بقاعدة البيانات (Lazy Load) +try { + $con = Database::get('main'); +} catch (Exception $e) { + http_response_code(500); + exit(json_encode(['error' => 'Database connection failed'])); +} + +``` + +## File: composer.json +``` +{ + "require": { + "vlucas/phpdotenv": "^5.6" + } +} + +``` + +## File: upload_audio.php +``` + 'The audio file was not uploaded successfully.')); + exit; +} + +// Get the file name and extension of the audio file +$audio_name = $audio_file['name']; +$audio_extension = pathinfo($audio_name, PATHINFO_EXTENSION); + +// Check if the audio file is a valid audio format +if (!in_array($audio_extension, array('m4a', 'mp3', 'wav'))) { + echo json_encode(array('status' => 'The audio file is not a valid format.')); + exit; +} + +// Generate a new filename using the passenger ID to avoid conflicts +$new_filename = $audio_name . '.' . $audio_extension; + +// Move the audio file to the uploads directory with the new filename +$target_dir = "audio_uploads/"; +if (!is_dir($target_dir)) { + mkdir($target_dir, 0755, true); // Create directory if it doesn't exist +} +$target_file = $target_dir . $new_filename; +if (!move_uploaded_file($audio_file['tmp_name'], $target_file)) { + error_log("Failed to move file to target directory: " . print_r($audio_file, true)); + echo json_encode(array('status' => 'Failed to move the audio file.')); + exit; +} + +// Construct the link to the uploaded audio file +$base_url = 'https://sefer.click/sefer/audio_uploads/'; // Replace with your actual domain +$linkAudio = $base_url . $new_filename; + +// Respond with success and the audio file link +echo json_encode(array('status' => 'Audio file uploaded successfully.', 'link' => $linkAudio)); + +// Close the database connection if it was established +if (isset($conn)) { + mysqli_close($conn); +} +?> +``` + +## File: schema_ride.sql +``` +-- MySQL dump 10.13 Distrib 8.0.36-28, for Linux (x86_64) +-- +-- Host: localhost Database: intaleq-ridesDB +-- ------------------------------------------------------ +-- Server version 8.0.36-28 + +/*!40101 SET @OLD_CHARACTER_SET_CLIENT=@@CHARACTER_SET_CLIENT */; +/*!40101 SET @OLD_CHARACTER_SET_RESULTS=@@CHARACTER_SET_RESULTS */; +/*!40101 SET @OLD_COLLATION_CONNECTION=@@COLLATION_CONNECTION */; +/*!50503 SET NAMES utf8mb4 */; +/*!40103 SET @OLD_TIME_ZONE=@@TIME_ZONE */; +/*!40103 SET TIME_ZONE='+00:00' */; +/*!40014 SET @OLD_UNIQUE_CHECKS=@@UNIQUE_CHECKS, UNIQUE_CHECKS=0 */; +/*!40014 SET @OLD_FOREIGN_KEY_CHECKS=@@FOREIGN_KEY_CHECKS, FOREIGN_KEY_CHECKS=0 */; +/*!40101 SET @OLD_SQL_MODE=@@SQL_MODE, SQL_MODE='NO_AUTO_VALUE_ON_ZERO' */; +/*!40111 SET @OLD_SQL_NOTES=@@SQL_NOTES, SQL_NOTES=0 */; +/*!50717 SELECT COUNT(*) INTO @rocksdb_has_p_s_session_variables FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_SCHEMA = 'performance_schema' AND TABLE_NAME = 'session_variables' */; +/*!50717 SET @rocksdb_get_is_supported = IF (@rocksdb_has_p_s_session_variables, 'SELECT COUNT(*) INTO @rocksdb_is_supported FROM performance_schema.session_variables WHERE VARIABLE_NAME=\'rocksdb_bulk_load\'', 'SELECT 0') */; +/*!50717 PREPARE s FROM @rocksdb_get_is_supported */; +/*!50717 EXECUTE s */; +/*!50717 DEALLOCATE PREPARE s */; +/*!50717 SET @rocksdb_enable_bulk_load = IF (@rocksdb_is_supported, 'SET SESSION rocksdb_bulk_load = 1', 'SET @rocksdb_dummy_bulk_load = 0') */; +/*!50717 PREPARE s FROM @rocksdb_enable_bulk_load */; +/*!50717 EXECUTE s */; +/*!50717 DEALLOCATE PREPARE s */; + +-- +-- Table structure for table `CarRegistration` +-- + +DROP TABLE IF EXISTS `CarRegistration`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!50503 SET character_set_client = utf8mb4 */; +CREATE TABLE `CarRegistration` ( + `id` int NOT NULL AUTO_INCREMENT, + `driverID` varchar(100) CHARACTER SET utf8mb3 COLLATE utf8mb3_general_ci NOT NULL, + `vin` varchar(100) CHARACTER SET utf8mb3 COLLATE utf8mb3_general_ci NOT NULL, + `car_plate` varchar(150) CHARACTER SET utf8mb3 COLLATE utf8mb3_general_ci DEFAULT NULL, + `make` varchar(255) CHARACTER SET utf8mb3 COLLATE utf8mb3_general_ci NOT NULL, + `model` varchar(255) CHARACTER SET utf8mb3 COLLATE utf8mb3_general_ci NOT NULL, + `year` varchar(10) CHARACTER SET utf32 COLLATE utf32_general_ci NOT NULL, + `expiration_date` varchar(30) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL, + `color` varchar(255) CHARACTER SET utf8mb3 COLLATE utf8mb3_general_ci NOT NULL, + `owner` varchar(255) CHARACTER SET utf8mb3 COLLATE utf8mb3_general_ci NOT NULL, + `color_hex` varchar(20) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL, + `fuel` varchar(100) CHARACTER SET utf8mb3 COLLATE utf8mb3_general_ci NOT NULL, + `isDefault` tinyint(1) NOT NULL DEFAULT '0', + `created_at` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP, + `status` varchar(20) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL DEFAULT 'yet', + PRIMARY KEY (`id`), + UNIQUE KEY `car_plate` (`car_plate`), + KEY `idx_driverID` (`driverID`) +) ENGINE=InnoDB AUTO_INCREMENT=14 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci; +/*!40101 SET character_set_client = @saved_cs_client */; + +-- +-- Table structure for table `adminUser` +-- + +DROP TABLE IF EXISTS `adminUser`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!50503 SET character_set_client = utf8mb4 */; +CREATE TABLE `adminUser` ( + `id` int NOT NULL AUTO_INCREMENT, + `device_number` varchar(300) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL, + `name` varchar(150) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL, + `created_at` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP, + `updated_at` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP, + PRIMARY KEY (`id`) +) ENGINE=InnoDB AUTO_INCREMENT=3 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci; +/*!40101 SET character_set_client = @saved_cs_client */; + +-- +-- Table structure for table `api_keys` +-- + +DROP TABLE IF EXISTS `api_keys`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!50503 SET character_set_client = utf8mb4 */; +CREATE TABLE `api_keys` ( + `id` int NOT NULL AUTO_INCREMENT, + `name` varchar(20) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL, + `hashed_key` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL, + PRIMARY KEY (`id`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci; +/*!40101 SET character_set_client = @saved_cs_client */; + +-- +-- Table structure for table `blacklist_driver` +-- + +DROP TABLE IF EXISTS `blacklist_driver`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!50503 SET character_set_client = utf8mb4 */; +CREATE TABLE `blacklist_driver` ( + `id` int NOT NULL AUTO_INCREMENT, + `driver_id` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL, + `phone` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL, + `reason` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT 'Violation', + `created_at` timestamp NULL DEFAULT CURRENT_TIMESTAMP, + PRIMARY KEY (`id`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci; +/*!40101 SET character_set_client = @saved_cs_client */; + +-- +-- Table structure for table `canecl` +-- + +DROP TABLE IF EXISTS `canecl`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!50503 SET character_set_client = utf8mb4 */; +CREATE TABLE `canecl` ( + `id` int NOT NULL AUTO_INCREMENT, + `driverID` varchar(111) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL, + `passengerID` varchar(111) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL, + `rideID` varchar(111) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL, + `note` varchar(200) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL DEFAULT 'nothing', + `created_at` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP, + PRIMARY KEY (`id`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci; +/*!40101 SET character_set_client = @saved_cs_client */; + +-- +-- Table structure for table `captains_car` +-- + +DROP TABLE IF EXISTS `captains_car`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!50503 SET character_set_client = utf8mb4 */; +CREATE TABLE `captains_car` ( + `id` int NOT NULL AUTO_INCREMENT, + `driverID` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL, + `vin` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL, + `car_plate` varchar(20) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL, + `make` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL, + `model` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL, + `year` varchar(6) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL, + `expiration_date` varchar(20) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL, + `color` varchar(30) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL, + `owner` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL, + `color_hex` char(15) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL, + `address` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL, + `displacement` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL, + `fuel` varchar(20) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL, + `registration_date` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL, + `isDefault` tinyint(1) NOT NULL DEFAULT '0', + `created_at` timestamp NULL DEFAULT CURRENT_TIMESTAMP, + PRIMARY KEY (`id`), + UNIQUE KEY `car_plate` (`car_plate`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci; +/*!40101 SET character_set_client = @saved_cs_client */; + +-- +-- Table structure for table `carPlateEdit` +-- + +DROP TABLE IF EXISTS `carPlateEdit`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!50503 SET character_set_client = utf8mb4 */; +CREATE TABLE `carPlateEdit` ( + `id` int NOT NULL AUTO_INCREMENT, + `driverId` varchar(50) NOT NULL, + `carPlate` varchar(155) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL, + `color` varchar(20) NOT NULL, + `make` varchar(50) NOT NULL, + `model` varchar(20) NOT NULL, + `expiration_date` varchar(50) NOT NULL, + `owner` varchar(155) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL, + `year` int NOT NULL, + `isEdit` tinyint(1) NOT NULL DEFAULT '0', + `employee` varchar(30) NOT NULL DEFAULT 'any', + `createdAt` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP, + PRIMARY KEY (`id`), + UNIQUE KEY `driverId` (`driverId`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci; +/*!40101 SET character_set_client = @saved_cs_client */; + +-- +-- Table structure for table `car_locations` +-- + +DROP TABLE IF EXISTS `car_locations`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!50503 SET character_set_client = utf8mb4 */; +CREATE TABLE `car_locations` ( + `driver_id` varchar(100) NOT NULL, + `latitude` decimal(10,7) NOT NULL, + `longitude` decimal(10,7) NOT NULL, + `heading` decimal(10,2) NOT NULL, + `speed` double(10,3) NOT NULL, + `distance` decimal(10,2) NOT NULL, + `status` varchar(6) NOT NULL DEFAULT 'off', + `carType` varchar(100) NOT NULL DEFAULT 'Awfar', + `created_at` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP, + `updated_at` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, + `location_point` point NOT NULL /*!80003 SRID 4326 */, + PRIMARY KEY (`driver_id`), + KEY `idx_loc_status_time` (`status`,`updated_at`,`latitude`,`longitude`), + SPATIAL KEY `idx_location_point` (`location_point`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb3; +/*!40101 SET character_set_client = @saved_cs_client */; +/*!50003 SET @saved_cs_client = @@character_set_client */ ; +/*!50003 SET @saved_cs_results = @@character_set_results */ ; +/*!50003 SET @saved_col_connection = @@collation_connection */ ; +/*!50003 SET character_set_client = utf8mb4 */ ; +/*!50003 SET character_set_results = utf8mb4 */ ; +/*!50003 SET collation_connection = utf8mb4_0900_ai_ci */ ; +/*!50003 SET @saved_sql_mode = @@sql_mode */ ; +/*!50003 SET sql_mode = 'NO_AUTO_VALUE_ON_ZERO' */ ; +DELIMITER ;; +/*!50003 CREATE*/ /*!50017 DEFINER=`intaleq-rides`@`%`*/ /*!50003 TRIGGER `trg_before_insert_car_locations` BEFORE INSERT ON `car_locations` FOR EACH ROW BEGIN +SET NEW.location_point = ST_PointFromText(CONCAT('POINT(', NEW.longitude, ' ', NEW.latitude, ')'), 4326); +END */;; +DELIMITER ; +/*!50003 SET sql_mode = @saved_sql_mode */ ; +/*!50003 SET character_set_client = @saved_cs_client */ ; +/*!50003 SET character_set_results = @saved_cs_results */ ; +/*!50003 SET collation_connection = @saved_col_connection */ ; +/*!50003 SET @saved_cs_client = @@character_set_client */ ; +/*!50003 SET @saved_cs_results = @@character_set_results */ ; +/*!50003 SET @saved_col_connection = @@collation_connection */ ; +/*!50003 SET character_set_client = utf8mb4 */ ; +/*!50003 SET character_set_results = utf8mb4 */ ; +/*!50003 SET collation_connection = utf8mb4_0900_ai_ci */ ; +/*!50003 SET @saved_sql_mode = @@sql_mode */ ; +/*!50003 SET sql_mode = 'NO_AUTO_VALUE_ON_ZERO' */ ; +DELIMITER ;; +/*!50003 CREATE*/ /*!50017 DEFINER=`intaleq-rides`@`%`*/ /*!50003 TRIGGER `trg_before_update_car_locations` BEFORE UPDATE ON `car_locations` FOR EACH ROW BEGIN +IF NEW.latitude <> OLD.latitude OR NEW.longitude <> OLD.longitude THEN +SET NEW.location_point = ST_PointFromText(CONCAT('POINT(', NEW.longitude, ' ', NEW.latitude, ')'), 4326); +END IF; +END */;; +DELIMITER ; +/*!50003 SET sql_mode = @saved_sql_mode */ ; +/*!50003 SET character_set_client = @saved_cs_client */ ; +/*!50003 SET character_set_results = @saved_cs_results */ ; +/*!50003 SET collation_connection = @saved_col_connection */ ; + +-- +-- Table structure for table `car_tracks` +-- + +DROP TABLE IF EXISTS `car_tracks`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!50503 SET character_set_client = utf8mb4 */; +CREATE TABLE `car_tracks` ( + `id` int NOT NULL AUTO_INCREMENT, + `driver_id` varchar(100) NOT NULL, + `latitude` decimal(10,7) NOT NULL, + `longitude` decimal(10,7) NOT NULL, + `heading` float DEFAULT NULL, + `speed` float DEFAULT NULL, + `distance` float DEFAULT NULL, + `status` enum('on','off') DEFAULT 'off', + `created_at` timestamp NULL DEFAULT CURRENT_TIMESTAMP, + PRIMARY KEY (`id`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci; +/*!40101 SET character_set_client = @saved_cs_client */; + +-- +-- Table structure for table `card_images` +-- + +DROP TABLE IF EXISTS `card_images`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!50503 SET character_set_client = utf8mb4 */; +CREATE TABLE `card_images` ( + `id` int NOT NULL AUTO_INCREMENT, + `driverID` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL, + `image_name` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL, + `upload_date` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP, + `link` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL, + PRIMARY KEY (`id`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci; +/*!40101 SET character_set_client = @saved_cs_client */; + +-- +-- Table structure for table `carsToWork` +-- + +DROP TABLE IF EXISTS `carsToWork`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!50503 SET character_set_client = utf8mb4 */; +CREATE TABLE `carsToWork` ( + `id` int NOT NULL AUTO_INCREMENT, + `owner_name` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL, + `phone` varchar(15) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL, + `car_number` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL, + `manufacture_year` year NOT NULL, + `car_model` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL, + `car_type` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL, + `site` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL, + `registration_date` date NOT NULL, + `created_at` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP, + PRIMARY KEY (`id`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci; +/*!40101 SET character_set_client = @saved_cs_client */; + +-- +-- Table structure for table `complaint` +-- + +DROP TABLE IF EXISTS `complaint`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!50503 SET character_set_client = utf8mb4 */; +CREATE TABLE `complaint` ( + `id` int NOT NULL AUTO_INCREMENT, + `ride_id` varchar(255) NOT NULL, + `passenger_id` varchar(255) DEFAULT NULL, + `driver_id` varchar(255) DEFAULT NULL, + `complaint_type` enum('Driver','Passenger','Both') NOT NULL, + `description` text, + `date_filed` timestamp NULL DEFAULT CURRENT_TIMESTAMP, + `statusComplaint` enum('Open','In Progress','Resolved') NOT NULL DEFAULT 'Open', + `resolution` text, + `passenger_report` text, + `driver_report` text, + `cs_solutions` text, + `fault_determination` varchar(255) DEFAULT NULL, + `complaint_nature` varchar(255) DEFAULT NULL, + `date_resolved` timestamp NULL DEFAULT NULL, + PRIMARY KEY (`id`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci; +/*!40101 SET character_set_client = @saved_cs_client */; + +-- +-- Table structure for table `contactEgypt` +-- + +DROP TABLE IF EXISTS `contactEgypt`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!50503 SET character_set_client = utf8mb4 */; +CREATE TABLE `contactEgypt` ( + `id` int NOT NULL AUTO_INCREMENT, + `phones` varchar(20) NOT NULL, + `name` varchar(100) NOT NULL, + `phones2` varchar(60) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL, + `createdAt` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP, + PRIMARY KEY (`id`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci; +/*!40101 SET character_set_client = @saved_cs_client */; + +-- +-- Table structure for table `contactSyria` +-- + +DROP TABLE IF EXISTS `contactSyria`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!50503 SET character_set_client = utf8mb4 */; +CREATE TABLE `contactSyria` ( + `id` int NOT NULL AUTO_INCREMENT, + `driverId` varchar(255) NOT NULL COMMENT 'معرّف السائق الذي قام بمزامنة جهة الاتصال', + `name` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci DEFAULT NULL COMMENT 'اسم جهة الاتصال', + `phone` varchar(50) NOT NULL COMMENT 'رقم هاتف جهة الاتصال', + `sync_timestamp` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT 'وقت المزامنة', + PRIMARY KEY (`id`), + UNIQUE KEY `driver_contact_unique` (`driverId`,`phone`) +) ENGINE=InnoDB AUTO_INCREMENT=10 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci; +/*!40101 SET character_set_client = @saved_cs_client */; + +-- +-- Table structure for table `criminalDocuments` +-- + +DROP TABLE IF EXISTS `criminalDocuments`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!50503 SET character_set_client = utf8mb4 */; +CREATE TABLE `criminalDocuments` ( + `id` int NOT NULL AUTO_INCREMENT, + `driverId` varchar(50) NOT NULL, + `IssueDate` varchar(20) NOT NULL, + `createdAt` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP, + `InspectionResult` varchar(100) NOT NULL, + PRIMARY KEY (`id`), + UNIQUE KEY `driverId` (`driverId`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci; +/*!40101 SET character_set_client = @saved_cs_client */; + +-- +-- Table structure for table `driver` +-- + +DROP TABLE IF EXISTS `driver`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!50503 SET character_set_client = utf8mb4 */; +CREATE TABLE `driver` ( + `idn` int NOT NULL AUTO_INCREMENT, + `id` varchar(100) NOT NULL, + `phone` varchar(255) CHARACTER SET utf8mb3 COLLATE utf8mb3_general_ci NOT NULL, + `email` varchar(255) NOT NULL, + `password` varchar(255) NOT NULL, + `gender` varchar(255) CHARACTER SET utf8mb3 COLLATE utf8mb3_general_ci NOT NULL DEFAULT 'Male', + `license_type` varchar(255) DEFAULT NULL, + `national_number` varchar(255) DEFAULT NULL, + `name_arabic` varchar(255) DEFAULT NULL, + `issue_date` date DEFAULT NULL, + `expiry_date` date DEFAULT NULL, + `license_categories` varchar(255) DEFAULT NULL, + `address` text, + `licenseIssueDate` varchar(50) DEFAULT NULL, + `status` varchar(20) NOT NULL DEFAULT 'notDeleted', + `birthdate` varchar(255) CHARACTER SET utf8mb3 COLLATE utf8mb3_general_ci NOT NULL, + `site` varchar(255) NOT NULL, + `first_name` varchar(255) NOT NULL, + `last_name` varchar(255) NOT NULL, + `accountBank` varchar(255) CHARACTER SET utf8mb3 COLLATE utf8mb3_general_ci NOT NULL DEFAULT 'yet', + `bankCode` varchar(255) CHARACTER SET utf8mb3 COLLATE utf8mb3_general_ci NOT NULL DEFAULT 'CIB', + `employmentType` varchar(255) CHARACTER SET utf8mb3 COLLATE utf8mb3_general_ci DEFAULT NULL, + `maritalStatus` varchar(50) CHARACTER SET utf8mb3 COLLATE utf8mb3_general_ci DEFAULT NULL, + `fullNameMaritial` varchar(255) DEFAULT NULL, + `expirationDate` varchar(50) CHARACTER SET utf8mb3 COLLATE utf8mb3_general_ci DEFAULT NULL, + `created_at` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP, + `updated_at` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, + PRIMARY KEY (`idn`) +) ENGINE=InnoDB AUTO_INCREMENT=12 DEFAULT CHARSET=utf8mb3; +/*!40101 SET character_set_client = @saved_cs_client */; + +-- +-- Table structure for table `driverToken` +-- + +DROP TABLE IF EXISTS `driverToken`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!50503 SET character_set_client = utf8mb4 */; +CREATE TABLE `driverToken` ( + `id` int NOT NULL AUTO_INCREMENT, + `token` varchar(300) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL, + `captain_id` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL, + `fingerPrint` varchar(155) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL, + `created_at` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP, + PRIMARY KEY (`id`), + KEY `idx_captain_id` (`captain_id`) +) ENGINE=InnoDB AUTO_INCREMENT=9 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci; +/*!40101 SET character_set_client = @saved_cs_client */; + +-- +-- Table structure for table `driverWallet` +-- + +DROP TABLE IF EXISTS `driverWallet`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!50503 SET character_set_client = utf8mb4 */; +CREATE TABLE `driverWallet` ( + `id` int NOT NULL AUTO_INCREMENT, + `driverID` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL, + `paymentID` varchar(200) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL, + `dateCreated` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP, + `amount` varchar(5) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL, + `paymentMethod` varchar(20) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL, + `dateUpdated` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP, + PRIMARY KEY (`id`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci; +/*!40101 SET character_set_client = @saved_cs_client */; + +-- +-- Table structure for table `driver_behavior` +-- + +DROP TABLE IF EXISTS `driver_behavior`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!50503 SET character_set_client = utf8mb4 */; +CREATE TABLE `driver_behavior` ( + `id` int NOT NULL, + `driver_id` varchar(255) NOT NULL, + `trip_id` varchar(255) NOT NULL, + `max_speed` double DEFAULT '0', + `avg_speed` double DEFAULT '0', + `hard_brakes` int DEFAULT '0', + `total_distance` double DEFAULT '0', + `behavior_score` double DEFAULT '0', + `created_at` timestamp NULL DEFAULT CURRENT_TIMESTAMP +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci; +/*!40101 SET character_set_client = @saved_cs_client */; + +-- +-- Table structure for table `driver_documents` +-- + +DROP TABLE IF EXISTS `driver_documents`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!50503 SET character_set_client = utf8mb4 */; +CREATE TABLE `driver_documents` ( + `id` int NOT NULL AUTO_INCREMENT, + `driverID` varchar(64) NOT NULL, + `doc_type` varchar(64) NOT NULL, + `image_name` varchar(255) NOT NULL, + `link` varchar(512) NOT NULL, + `upload_date` datetime NOT NULL, + PRIMARY KEY (`id`), + KEY `driverID` (`driverID`) +) ENGINE=InnoDB AUTO_INCREMENT=33 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci; +/*!40101 SET character_set_client = @saved_cs_client */; + +-- +-- Table structure for table `driver_gifts` +-- + +DROP TABLE IF EXISTS `driver_gifts`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!50503 SET character_set_client = utf8mb4 */; +CREATE TABLE `driver_gifts` ( + `id` int NOT NULL AUTO_INCREMENT, + `driver_id` varchar(70) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL, + `gift_description` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL, + `gift_date` datetime DEFAULT CURRENT_TIMESTAMP, + `is_claimed` tinyint(1) DEFAULT '0', + PRIMARY KEY (`id`), + UNIQUE KEY `driver_id` (`driver_id`) +) ENGINE=InnoDB AUTO_INCREMENT=10 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci; +/*!40101 SET character_set_client = @saved_cs_client */; + +-- +-- Table structure for table `driver_health_assurance` +-- + +DROP TABLE IF EXISTS `driver_health_assurance`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!50503 SET character_set_client = utf8mb4 */; +CREATE TABLE `driver_health_assurance` ( + `id` int NOT NULL AUTO_INCREMENT, + `driver_id` varchar(155) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL, + `assured` tinyint(1) DEFAULT '0', + `date_created` timestamp NULL DEFAULT CURRENT_TIMESTAMP, + `health_insurance_provider` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL, + PRIMARY KEY (`id`), + UNIQUE KEY `driver_id` (`driver_id`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci; +/*!40101 SET character_set_client = @saved_cs_client */; + +-- +-- Table structure for table `driver_orders` +-- + +DROP TABLE IF EXISTS `driver_orders`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!50503 SET character_set_client = utf8mb4 */; +CREATE TABLE `driver_orders` ( + `id` int NOT NULL AUTO_INCREMENT, + `driver_id` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL, + `order_id` varchar(99) CHARACTER SET utf8mb3 COLLATE utf8mb3_general_ci NOT NULL, + `notes` varchar(200) CHARACTER SET utf8mb3 COLLATE utf8mb3_general_ci NOT NULL DEFAULT 'nothing', + `created_at` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP, + `status` varchar(30) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT 'applied', + PRIMARY KEY (`id`) +) ENGINE=InnoDB AUTO_INCREMENT=44 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci; +/*!40101 SET character_set_client = @saved_cs_client */; + +-- +-- Table structure for table `driver_ride_scam` +-- + +DROP TABLE IF EXISTS `driver_ride_scam`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!50503 SET character_set_client = utf8mb4 */; +CREATE TABLE `driver_ride_scam` ( + `id` int NOT NULL AUTO_INCREMENT, + `driverID` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL, + `passendgerID` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL, + `rideID` varchar(20) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL, + `isDriverCallPassenger` varchar(10) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL, + `dateCreated` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP, + PRIMARY KEY (`id`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci; +/*!40101 SET character_set_client = @saved_cs_client */; + +-- +-- Table structure for table `driversWantWork` +-- + +DROP TABLE IF EXISTS `driversWantWork`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!50503 SET character_set_client = utf8mb4 */; +CREATE TABLE `driversWantWork` ( + `id` int NOT NULL AUTO_INCREMENT, + `driver_name` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL, + `phone` varchar(15) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL, + `national_id` varchar(20) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL, + `birth_date` varchar(15) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL, + `license_type` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL, + `site` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL, + `created_at` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP, + PRIMARY KEY (`id`), + UNIQUE KEY `national_id` (`national_id`), + UNIQUE KEY `phone` (`phone`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci; +/*!40101 SET character_set_client = @saved_cs_client */; + +-- +-- Table structure for table `email_verifications` +-- + +DROP TABLE IF EXISTS `email_verifications`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!50503 SET character_set_client = utf8mb4 */; +CREATE TABLE `email_verifications` ( + `id` int NOT NULL AUTO_INCREMENT, + `email` varchar(255) NOT NULL, + `token` varchar(255) NOT NULL, + `created_at` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP, + `updated_at` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP, + `verified` tinyint(1) NOT NULL DEFAULT '0', + PRIMARY KEY (`id`), + UNIQUE KEY `email` (`email`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci; +/*!40101 SET character_set_client = @saved_cs_client */; + +-- +-- Table structure for table `employee` +-- + +DROP TABLE IF EXISTS `employee`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!50503 SET character_set_client = utf8mb4 */; +CREATE TABLE `employee` ( + `id` varchar(20) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL, + `name` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL, + `education` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL, + `site` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL, + `phone` varchar(20) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL, + `created_at` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP, + `status` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL, + PRIMARY KEY (`id`), + UNIQUE KEY `phone` (`phone`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci; +/*!40101 SET character_set_client = @saved_cs_client */; + +-- +-- Table structure for table `error` +-- + +DROP TABLE IF EXISTS `error`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!50503 SET character_set_client = utf8mb4 */; +CREATE TABLE `error` ( + `id` int NOT NULL AUTO_INCREMENT, + `error` varchar(400) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL, + `userId` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL, + `userType` varchar(30) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL, + `phone` varchar(20) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL, + `created_at` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP, + `device` varchar(300) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL, + `details` text CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci, + `status` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL DEFAULT 'new', + PRIMARY KEY (`id`), + KEY `idx_error_created_at` (`created_at`), + KEY `idx_error_phone` (`phone`) +) ENGINE=InnoDB AUTO_INCREMENT=14316 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci; +/*!40101 SET character_set_client = @saved_cs_client */; + +-- +-- Table structure for table `feedBack` +-- + +DROP TABLE IF EXISTS `feedBack`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!50503 SET character_set_client = utf8mb4 */; +CREATE TABLE `feedBack` ( + `id` int NOT NULL AUTO_INCREMENT, + `passengerId` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL, + `feedBack` text CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL, + `datecreated` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP, + PRIMARY KEY (`id`) +) ENGINE=InnoDB AUTO_INCREMENT=3 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci; +/*!40101 SET character_set_client = @saved_cs_client */; + +-- +-- Table structure for table `helpCenter` +-- + +DROP TABLE IF EXISTS `helpCenter`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!50503 SET character_set_client = utf8mb4 */; +CREATE TABLE `helpCenter` ( + `id` int NOT NULL AUTO_INCREMENT, + `driverID` varchar(89) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL, + `helpQuestion` varchar(300) CHARACTER SET utf8mb3 COLLATE utf8mb3_general_ci NOT NULL, + `replay` varchar(400) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL DEFAULT 'not yet', + `datecreated` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP, + PRIMARY KEY (`id`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci; +/*!40101 SET character_set_client = @saved_cs_client */; + +-- +-- Table structure for table `hotels` +-- + +DROP TABLE IF EXISTS `hotels`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!50503 SET character_set_client = utf8mb4 */; +CREATE TABLE `hotels` ( + `id` int NOT NULL, + `nameEnglish` varchar(255) DEFAULT NULL, + `nameArabic` varchar(255) DEFAULT NULL, + `phone` varchar(20) DEFAULT NULL, + `countReview` int DEFAULT NULL, + `rate` float DEFAULT NULL, + `stars` varchar(50) DEFAULT NULL, + `address` text, + `website` varchar(255) DEFAULT NULL, + `email` varchar(255) DEFAULT NULL, + `PlusCode` varchar(50) DEFAULT NULL, + `closeTime` varchar(50) DEFAULT NULL, + `latitude` decimal(10,6) DEFAULT NULL, + `longitude` decimal(10,6) DEFAULT NULL, + `instagram` varchar(255) DEFAULT NULL, + `facebook` varchar(255) DEFAULT NULL, + `linkedin` varchar(255) DEFAULT NULL, + `twitter` varchar(255) DEFAULT NULL, + `photo` varchar(255) DEFAULT NULL +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci; +/*!40101 SET character_set_client = @saved_cs_client */; + +-- +-- Table structure for table `imageProfileCaptain` +-- + +DROP TABLE IF EXISTS `imageProfileCaptain`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!50503 SET character_set_client = utf8mb4 */; +CREATE TABLE `imageProfileCaptain` ( + `id` int NOT NULL AUTO_INCREMENT, + `driverID` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL, + `image_name` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL, + `upload_date` datetime DEFAULT CURRENT_TIMESTAMP, + `link` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL, + PRIMARY KEY (`id`) +) ENGINE=InnoDB AUTO_INCREMENT=4 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci; +/*!40101 SET character_set_client = @saved_cs_client */; + +-- +-- Table structure for table `invites` +-- + +DROP TABLE IF EXISTS `invites`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!50503 SET character_set_client = utf8mb4 */; +CREATE TABLE `invites` ( + `id` int NOT NULL AUTO_INCREMENT, + `driverId` varchar(50) NOT NULL, + `inviterDriverPhone` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL, + `createdAt` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP, + `inviteCode` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL, + `isInstall` tinyint(1) NOT NULL DEFAULT '0', + `isGiftToken` tinyint(1) NOT NULL DEFAULT '0', + `expirationTime` datetime NOT NULL, + PRIMARY KEY (`id`), + UNIQUE KEY `inviterDriverId` (`inviterDriverPhone`), + UNIQUE KEY `inviteCode` (`inviteCode`) +) ENGINE=InnoDB AUTO_INCREMENT=5 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci; +/*!40101 SET character_set_client = @saved_cs_client */; + +-- +-- Table structure for table `invitesToPassengers` +-- + +DROP TABLE IF EXISTS `invitesToPassengers`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!50503 SET character_set_client = utf8mb4 */; +CREATE TABLE `invitesToPassengers` ( + `id` int NOT NULL AUTO_INCREMENT, + `driverId` varchar(70) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL, + `passengerID` varchar(80) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL DEFAULT 'yet', + `inviterPassengerPhone` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL, + `inviteCode` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL, + `expirationTime` datetime NOT NULL, + `createdAt` datetime DEFAULT CURRENT_TIMESTAMP, + `isInstall` tinyint(1) DEFAULT '0', + `isGiftToken` tinyint(1) NOT NULL DEFAULT '0', + PRIMARY KEY (`id`), + UNIQUE KEY `inviteCode` (`inviteCode`) +) ENGINE=InnoDB AUTO_INCREMENT=11 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci; +/*!40101 SET character_set_client = @saved_cs_client */; + +-- +-- Table structure for table `invoice_records` +-- + +DROP TABLE IF EXISTS `invoice_records`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!50503 SET character_set_client = utf8mb4 */; +CREATE TABLE `invoice_records` ( + `id` int NOT NULL AUTO_INCREMENT, + `driverID` int NOT NULL, + `invoice_number` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL, + `name` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL, + `amount` decimal(10,2) DEFAULT NULL, + `date` date DEFAULT NULL, + `image_link` text CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci, + `created_at` datetime DEFAULT NULL, + PRIMARY KEY (`id`) +) ENGINE=InnoDB AUTO_INCREMENT=36 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci; +/*!40101 SET character_set_client = @saved_cs_client */; + +-- +-- Table structure for table `invoicesAdmin` +-- + +DROP TABLE IF EXISTS `invoicesAdmin`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!50503 SET character_set_client = utf8mb4 */; +CREATE TABLE `invoicesAdmin` ( + `id` int NOT NULL AUTO_INCREMENT, + `item_name` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL, + `amount` decimal(10,2) NOT NULL, + `image_url` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL, + `created_at` timestamp NULL DEFAULT CURRENT_TIMESTAMP, + PRIMARY KEY (`id`) +) ENGINE=InnoDB AUTO_INCREMENT=22 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci; +/*!40101 SET character_set_client = @saved_cs_client */; + +-- +-- Table structure for table `kazan` +-- + +DROP TABLE IF EXISTS `kazan`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!50503 SET character_set_client = utf8mb4 */; +CREATE TABLE `kazan` ( + `id` int NOT NULL AUTO_INCREMENT, + `country` varchar(30) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL, + `kazan` varchar(10) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL, + `comfortPrice` varchar(10) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL, + `speedPrice` varchar(10) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL, + `familyPrice` varchar(4) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL, + `deliveryPrice` varchar(11) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL, + `freePrice` varchar(11) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL, + `latePrice` varchar(10) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL, + `heavyPrice` varchar(10) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL, + `adminId` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL, + `createdAt` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP, + `naturePrice` varchar(10) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL, + `fuelPrice` varchar(6) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL, + PRIMARY KEY (`id`) +) ENGINE=InnoDB AUTO_INCREMENT=2 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci; +/*!40101 SET character_set_client = @saved_cs_client */; + +-- +-- Table structure for table `lisenceDetails` +-- + +DROP TABLE IF EXISTS `lisenceDetails`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!50503 SET character_set_client = utf8mb4 */; +CREATE TABLE `lisenceDetails` ( + `id` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL, + `driverID` text CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL, + `name` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci DEFAULT NULL, + `licenseClass` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci DEFAULT NULL, + `documentNo` varchar(30) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci DEFAULT NULL, + `address` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci DEFAULT NULL, + `height` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci DEFAULT NULL, + `postalCode` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci DEFAULT NULL, + `sex` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci DEFAULT NULL, + `stateCode` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci DEFAULT NULL, + `expireDate` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci DEFAULT NULL, + `dateOfBirth` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci DEFAULT NULL, + `dateCreated` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP, + PRIMARY KEY (`id`), + UNIQUE KEY `documentNo` (`documentNo`) +) ENGINE=MyISAM DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci; +/*!40101 SET character_set_client = @saved_cs_client */; + +-- +-- Table structure for table `login_attempts` +-- + +DROP TABLE IF EXISTS `login_attempts`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!50503 SET character_set_client = utf8mb4 */; +CREATE TABLE `login_attempts` ( + `id` int NOT NULL AUTO_INCREMENT, + `ip_address` varchar(45) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL, + `attempt_time` timestamp NULL DEFAULT CURRENT_TIMESTAMP, + PRIMARY KEY (`id`) +) ENGINE=InnoDB AUTO_INCREMENT=18 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci; +/*!40101 SET character_set_client = @saved_cs_client */; + +-- +-- Table structure for table `login_attempts_drivers` +-- + +DROP TABLE IF EXISTS `login_attempts_drivers`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!50503 SET character_set_client = utf8mb4 */; +CREATE TABLE `login_attempts_drivers` ( + `id` int NOT NULL AUTO_INCREMENT, + `ip_address` varchar(45) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL, + `attempt_time` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP, + PRIMARY KEY (`id`) +) ENGINE=InnoDB AUTO_INCREMENT=11 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci; +/*!40101 SET character_set_client = @saved_cs_client */; + +-- +-- Table structure for table `mishwaritrips` +-- + +DROP TABLE IF EXISTS `mishwaritrips`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!50503 SET character_set_client = utf8mb4 */; +CREATE TABLE `mishwaritrips` ( + `id` int NOT NULL AUTO_INCREMENT, + `driverId` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL, + `phone` varchar(15) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL, + `gender` varchar(20) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL, + `name` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL, + `name_english` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL, + `address` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL, + `religion` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL, + `age` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL, + `startNameAddress` varchar(150) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL DEFAULT 'none', + `locationCoordinate` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL DEFAULT 'none', + `education` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL, + `license_type` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL, + `national_number` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL, + `car_plate` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL, + `make` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL, + `model` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL, + `color` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL, + `color_hex` char(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL, + `token` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL, + `rating` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL, + `countRide` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL, + `passengerId` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL, + `timeSelected` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL, + `createdAt` timestamp NULL DEFAULT CURRENT_TIMESTAMP, + `status` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT 'pending', + PRIMARY KEY (`id`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci; +/*!40101 SET character_set_client = @saved_cs_client */; + +-- +-- Table structure for table `notesForDriverService` +-- + +DROP TABLE IF EXISTS `notesForDriverService`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!50503 SET character_set_client = utf8mb4 */; +CREATE TABLE `notesForDriverService` ( + `id` int NOT NULL AUTO_INCREMENT, + `phone` varchar(70) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL, + `note` varchar(250) NOT NULL, + `editor` varchar(50) NOT NULL, + `createdAt` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP, + PRIMARY KEY (`id`), + UNIQUE KEY `phone` (`phone`) +) ENGINE=InnoDB AUTO_INCREMENT=5 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci; +/*!40101 SET character_set_client = @saved_cs_client */; + +-- +-- Table structure for table `notesForPassengerService` +-- + +DROP TABLE IF EXISTS `notesForPassengerService`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!50503 SET character_set_client = utf8mb4 */; +CREATE TABLE `notesForPassengerService` ( + `id` int NOT NULL AUTO_INCREMENT, + `phone` int NOT NULL, + `note` varchar(250) NOT NULL, + `editor` varchar(50) NOT NULL, + `createdAt` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP, + PRIMARY KEY (`id`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci; +/*!40101 SET character_set_client = @saved_cs_client */; + +-- +-- Table structure for table `notificationCaptain` +-- + +DROP TABLE IF EXISTS `notificationCaptain`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!50503 SET character_set_client = utf8mb4 */; +CREATE TABLE `notificationCaptain` ( + `id` int NOT NULL AUTO_INCREMENT, + `driverID` varchar(80) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL, + `title` varchar(100) CHARACTER SET utf8mb3 COLLATE utf8mb3_general_ci NOT NULL, + `body` varchar(200) CHARACTER SET utf8mb3 COLLATE utf8mb3_general_ci NOT NULL, + `isShown` varchar(6) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL DEFAULT 'false', + `isPin` varchar(10) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL DEFAULT 'unPin', + `dateCreated` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP, + PRIMARY KEY (`id`) +) ENGINE=InnoDB AUTO_INCREMENT=6 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci; +/*!40101 SET character_set_client = @saved_cs_client */; + +-- +-- Table structure for table `notifications` +-- + +DROP TABLE IF EXISTS `notifications`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!50503 SET character_set_client = utf8mb4 */; +CREATE TABLE `notifications` ( + `id` int NOT NULL AUTO_INCREMENT, + `title` varchar(111) NOT NULL, + `body` varchar(265) NOT NULL, + `passenger_id` varchar(111) NOT NULL, + `isShown` varchar(255) CHARACTER SET utf8mb3 COLLATE utf8mb3_general_ci NOT NULL DEFAULT 'false', + `created_at` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP, + `updated_at` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, + PRIMARY KEY (`id`) +) ENGINE=InnoDB AUTO_INCREMENT=9 DEFAULT CHARSET=utf8mb3; +/*!40101 SET character_set_client = @saved_cs_client */; + +-- +-- Table structure for table `otp_verification_fingerPrint` +-- + +DROP TABLE IF EXISTS `otp_verification_fingerPrint`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!50503 SET character_set_client = utf8mb4 */; +CREATE TABLE `otp_verification_fingerPrint` ( + `id` int NOT NULL, + `phone` varchar(20) NOT NULL, + `otp` varchar(6) NOT NULL, + `createdAt` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci; +/*!40101 SET character_set_client = @saved_cs_client */; + +-- +-- Table structure for table `packageInfo` +-- + +DROP TABLE IF EXISTS `packageInfo`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!50503 SET character_set_client = utf8mb4 */; +CREATE TABLE `packageInfo` ( + `id` int NOT NULL AUTO_INCREMENT, + `platform` varchar(50) NOT NULL, + `appName` varchar(20) NOT NULL, + `createdAt` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP, + `version` varchar(10) NOT NULL, + PRIMARY KEY (`id`) +) ENGINE=InnoDB AUTO_INCREMENT=5 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci; +/*!40101 SET character_set_client = @saved_cs_client */; + +-- +-- Table structure for table `palces11` +-- + +DROP TABLE IF EXISTS `palces11`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!50503 SET character_set_client = utf8mb4 */; +CREATE TABLE `palces11` ( + `id` int NOT NULL AUTO_INCREMENT, + `latitude` varchar(50) NOT NULL, + `longitude` varchar(50) NOT NULL, + `name` varchar(180) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci DEFAULT NULL, + `name_ar` varchar(200) NOT NULL, + `name_en` varchar(200) NOT NULL, + `address` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci DEFAULT NULL, + `category` varchar(55) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci DEFAULT NULL, + `created_at` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP, + `location` point NOT NULL, + PRIMARY KEY (`id`), + SPATIAL KEY `idx_spatial_location` (`location`), + FULLTEXT KEY `idx_fulltext_search` (`name`,`name_ar`,`name_en`,`address`,`category`) +) ENGINE=InnoDB AUTO_INCREMENT=28951 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci; +/*!40101 SET character_set_client = @saved_cs_client */; + +-- +-- Table structure for table `passengerWallet` +-- + +DROP TABLE IF EXISTS `passengerWallet`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!50503 SET character_set_client = utf8mb4 */; +CREATE TABLE `passengerWallet` ( + `id` int NOT NULL AUTO_INCREMENT, + `passenger_id` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL, + `balance` decimal(10,2) NOT NULL, + `created_at` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP, + `updated_at` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, + PRIMARY KEY (`id`), + KEY `passenger_id` (`passenger_id`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci; +/*!40101 SET character_set_client = @saved_cs_client */; + +-- +-- Table structure for table `passenger_blacklist` +-- + +DROP TABLE IF EXISTS `passenger_blacklist`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!50503 SET character_set_client = utf8mb4 */; +CREATE TABLE `passenger_blacklist` ( + `id` bigint unsigned NOT NULL AUTO_INCREMENT, + `phone` varchar(150) NOT NULL, + `phone_normalized` varchar(64) NOT NULL, + `reason` varchar(255) DEFAULT NULL, + `expires_at` datetime DEFAULT CURRENT_TIMESTAMP, + `created_at` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP, + PRIMARY KEY (`id`), + UNIQUE KEY `uq_phone_norm` (`phone_normalized`), + KEY `idx_expires` (`expires_at`) +) ENGINE=InnoDB AUTO_INCREMENT=2 DEFAULT CHARSET=utf8mb3; +/*!40101 SET character_set_client = @saved_cs_client */; + +-- +-- Table structure for table `passengerlocation` +-- + +DROP TABLE IF EXISTS `passengerlocation`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!50503 SET character_set_client = utf8mb4 */; +CREATE TABLE `passengerlocation` ( + `id` int NOT NULL AUTO_INCREMENT, + `passengerId` varchar(60) NOT NULL, + `lat` varchar(20) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL, + `lng` varchar(20) NOT NULL, + `rideId` varchar(10) NOT NULL, + `createdAt` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP, + PRIMARY KEY (`id`) +) ENGINE=InnoDB AUTO_INCREMENT=31 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci; +/*!40101 SET character_set_client = @saved_cs_client */; + +-- +-- Table structure for table `passengers` +-- + +DROP TABLE IF EXISTS `passengers`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!50503 SET character_set_client = utf8mb4 */; +CREATE TABLE `passengers` ( + `id` varchar(100) NOT NULL, + `phone` varchar(150) CHARACTER SET utf8mb3 COLLATE utf8mb3_general_ci NOT NULL, + `email` varchar(255) NOT NULL, + `password` varchar(100) NOT NULL, + `gender` varchar(150) CHARACTER SET utf8mb3 COLLATE utf8mb3_general_ci NOT NULL, + `status` varchar(150) CHARACTER SET utf8mb3 COLLATE utf8mb3_general_ci NOT NULL DEFAULT 'notDeleted', + `birthdate` varchar(150) CHARACTER SET utf8mb3 COLLATE utf8mb3_general_ci NOT NULL, + `site` varchar(255) NOT NULL, + `first_name` varchar(255) NOT NULL, + `last_name` varchar(255) NOT NULL, + `sosPhone` varchar(150) CHARACTER SET utf8mb3 COLLATE utf8mb3_general_ci NOT NULL DEFAULT 'sos', + `education` varchar(150) CHARACTER SET utf8mb3 COLLATE utf8mb3_general_ci NOT NULL DEFAULT 'none', + `employmentType` varchar(150) CHARACTER SET utf8mb3 COLLATE utf8mb3_general_ci NOT NULL DEFAULT 'none', + `maritalStatus` varchar(150) CHARACTER SET utf8mb3 COLLATE utf8mb3_general_ci NOT NULL DEFAULT 'none', + `created_at` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP, + `updated_at` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, + PRIMARY KEY (`id`), + UNIQUE KEY `phone` (`phone`,`email`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb3; +/*!40101 SET character_set_client = @saved_cs_client */; + +-- +-- Table structure for table `payment_tokens` +-- + +DROP TABLE IF EXISTS `payment_tokens`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!50503 SET character_set_client = utf8mb4 */; +CREATE TABLE `payment_tokens` ( + `id` int NOT NULL AUTO_INCREMENT, + `token` varchar(255) NOT NULL, + `driverID` varchar(255) NOT NULL, + `dateCreated` datetime NOT NULL, + `amount` decimal(10,2) NOT NULL, + `isUsed` tinyint(1) DEFAULT '0', + PRIMARY KEY (`id`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci; +/*!40101 SET character_set_client = @saved_cs_client */; + +-- +-- Table structure for table `payment_tokens_passenger` +-- + +DROP TABLE IF EXISTS `payment_tokens_passenger`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!50503 SET character_set_client = utf8mb4 */; +CREATE TABLE `payment_tokens_passenger` ( + `id` int NOT NULL AUTO_INCREMENT, + `token` varchar(255) NOT NULL, + `passengerId` varchar(255) NOT NULL, + `dateCreated` datetime NOT NULL, + `amount` decimal(10,2) NOT NULL, + `isUsed` tinyint(1) DEFAULT '0', + PRIMARY KEY (`id`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci; +/*!40101 SET character_set_client = @saved_cs_client */; + +-- +-- Table structure for table `payments` +-- + +DROP TABLE IF EXISTS `payments`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!50503 SET character_set_client = utf8mb4 */; +CREATE TABLE `payments` ( + `id` varchar(111) NOT NULL, + `amount` decimal(10,2) NOT NULL, + `payment_method` varchar(255) NOT NULL, + `passengerID` varchar(100) NOT NULL, + `rideId` varchar(100) NOT NULL, + `driverID` varchar(100) NOT NULL, + `created_at` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP, + `updated_at` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, + `isGiven` varchar(20) NOT NULL DEFAULT 'waiting', + PRIMARY KEY (`id`), + UNIQUE KEY `rideId` (`rideId`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb3; +/*!40101 SET character_set_client = @saved_cs_client */; + +-- +-- Table structure for table `paymentsDriverPoints` +-- + +DROP TABLE IF EXISTS `paymentsDriverPoints`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!50503 SET character_set_client = utf8mb4 */; +CREATE TABLE `paymentsDriverPoints` ( + `id` int NOT NULL AUTO_INCREMENT, + `amount` decimal(10,2) NOT NULL, + `payment_method` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL, + `driverID` varchar(60) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL, + `created_at` datetime DEFAULT CURRENT_TIMESTAMP, + `updated_at` datetime DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, + PRIMARY KEY (`id`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci; +/*!40101 SET character_set_client = @saved_cs_client */; + +-- +-- Table structure for table `phone_verification` +-- + +DROP TABLE IF EXISTS `phone_verification`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!50503 SET character_set_client = utf8mb4 */; +CREATE TABLE `phone_verification` ( + `id` int NOT NULL AUTO_INCREMENT, + `phone_number` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL, + `driverId` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL DEFAULT 'yet', + `email` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL DEFAULT 'yet', + `token_code` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL, + `expiration_time` datetime NOT NULL, + `is_verified` tinyint(1) DEFAULT '0', + `created_at` timestamp NULL DEFAULT CURRENT_TIMESTAMP, + PRIMARY KEY (`id`) +) ENGINE=InnoDB AUTO_INCREMENT=111 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci; +/*!40101 SET character_set_client = @saved_cs_client */; + +-- +-- Table structure for table `phone_verification_passenger` +-- + +DROP TABLE IF EXISTS `phone_verification_passenger`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!50503 SET character_set_client = utf8mb4 */; +CREATE TABLE `phone_verification_passenger` ( + `id` int NOT NULL AUTO_INCREMENT, + `phone_number` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci DEFAULT NULL, + `token` varchar(80) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL, + `expiration_time` datetime NOT NULL, + `verified` tinyint(1) DEFAULT '0', + `created_at` timestamp NULL DEFAULT CURRENT_TIMESTAMP, + `status` varchar(22) NOT NULL DEFAULT 'yet', + PRIMARY KEY (`id`) +) ENGINE=InnoDB AUTO_INCREMENT=109 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci; +/*!40101 SET character_set_client = @saved_cs_client */; + +-- +-- Table structure for table `places` +-- + +DROP TABLE IF EXISTS `places`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!50503 SET character_set_client = utf8mb4 */; +CREATE TABLE `places` ( + `id` int NOT NULL AUTO_INCREMENT, + `latitude` double NOT NULL, + `longitude` double NOT NULL, + `name` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL, + `name_ar` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL, + `name_en` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL, + `address` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL, + `category` varchar(200) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL, + `created_at` timestamp NULL DEFAULT CURRENT_TIMESTAMP, + PRIMARY KEY (`id`) +) ENGINE=InnoDB AUTO_INCREMENT=58830 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci; +/*!40101 SET character_set_client = @saved_cs_client */; + +-- +-- Table structure for table `placesEgypt` +-- + +DROP TABLE IF EXISTS `placesEgypt`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!50503 SET character_set_client = utf8mb4 */; +CREATE TABLE `placesEgypt` ( + `id` int NOT NULL, + `nameEnglish` varchar(255) DEFAULT NULL, + `nameArabic` varchar(255) DEFAULT NULL, + `phone` varchar(20) DEFAULT NULL, + `countReview` int DEFAULT NULL, + `rate` float DEFAULT NULL, + `stars` varchar(50) DEFAULT NULL, + `address` text, + `website` varchar(255) DEFAULT NULL, + `email` varchar(255) DEFAULT NULL, + `PlusCode` varchar(50) DEFAULT NULL, + `closeTime` varchar(50) DEFAULT NULL, + `latitude` decimal(10,6) DEFAULT NULL, + `longitude` decimal(10,6) DEFAULT NULL, + `instagram` varchar(255) DEFAULT NULL, + `facebook` varchar(255) DEFAULT NULL, + `linkedin` varchar(255) DEFAULT NULL, + `twitter` varchar(255) DEFAULT NULL, + `photo` varchar(255) DEFAULT NULL +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci; +/*!40101 SET character_set_client = @saved_cs_client */; + +-- +-- Table structure for table `promos` +-- + +DROP TABLE IF EXISTS `promos`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!50503 SET character_set_client = utf8mb4 */; +CREATE TABLE `promos` ( + `id` int NOT NULL AUTO_INCREMENT, + `promo_code` varchar(10) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL, + `amount` varchar(4) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL DEFAULT '0', + `description` varchar(100) CHARACTER SET utf8mb3 COLLATE utf8mb3_general_ci DEFAULT NULL, + `passengerID` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL DEFAULT 'none', + `validity_start_date` date DEFAULT NULL, + `validity_end_date` date DEFAULT NULL, + PRIMARY KEY (`id`), + UNIQUE KEY `passengerID` (`passengerID`) +) ENGINE=InnoDB AUTO_INCREMENT=2 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci; +/*!40101 SET character_set_client = @saved_cs_client */; + +-- +-- Table structure for table `promptDriverIDEgypt` +-- + +DROP TABLE IF EXISTS `promptDriverIDEgypt`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!50503 SET character_set_client = utf8mb4 */; +CREATE TABLE `promptDriverIDEgypt` ( + `id` int NOT NULL AUTO_INCREMENT, + `type` varchar(30) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL, + `prompt` longtext CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL, + `createdAt` timestamp NULL DEFAULT CURRENT_TIMESTAMP, + `updatedAt` timestamp NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, + PRIMARY KEY (`id`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci; +/*!40101 SET character_set_client = @saved_cs_client */; + +-- +-- Table structure for table `ratingApp` +-- + +DROP TABLE IF EXISTS `ratingApp`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!50503 SET character_set_client = utf8mb4 */; +CREATE TABLE `ratingApp` ( + `id` int NOT NULL AUTO_INCREMENT, + `name` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL, + `email` varchar(150) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL, + `phone` varchar(80) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL, + `userId` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL, + `userType` varchar(20) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL, + `rating` varchar(2) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL, + `comment` varchar(300) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL, + `created_at` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP, + PRIMARY KEY (`id`) +) ENGINE=InnoDB AUTO_INCREMENT=11 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci; +/*!40101 SET character_set_client = @saved_cs_client */; + +-- +-- Table structure for table `ratingDriver` +-- + +DROP TABLE IF EXISTS `ratingDriver`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!50503 SET character_set_client = utf8mb4 */; +CREATE TABLE `ratingDriver` ( + `id` int NOT NULL AUTO_INCREMENT, + `passenger_id` text CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci, + `driver_id` varchar(33) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL, + `ride_id` int DEFAULT NULL, + `rating` float DEFAULT NULL, + `comment` text CHARACTER SET utf8mb3 COLLATE utf8mb3_general_ci, + `created_at` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP, + PRIMARY KEY (`id`), + UNIQUE KEY `ride_id` (`ride_id`), + KEY `idx_driver_id` (`driver_id`) +) ENGINE=InnoDB AUTO_INCREMENT=17 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci; +/*!40101 SET character_set_client = @saved_cs_client */; + +-- +-- Table structure for table `ratingPassenger` +-- + +DROP TABLE IF EXISTS `ratingPassenger`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!50503 SET character_set_client = utf8mb4 */; +CREATE TABLE `ratingPassenger` ( + `id` int NOT NULL AUTO_INCREMENT, + `passenger_id` text CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL, + `driverID` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL, + `rideId` varchar(30) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL, + `rating` float NOT NULL, + `comment` text CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci, + `created_at` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP, + PRIMARY KEY (`id`), + UNIQUE KEY `rideId` (`rideId`) +) ENGINE=InnoDB AUTO_INCREMENT=17 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci; +/*!40101 SET character_set_client = @saved_cs_client */; + +-- +-- Table structure for table `ride` +-- + +DROP TABLE IF EXISTS `ride`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!50503 SET character_set_client = utf8mb4 */; +CREATE TABLE `ride` ( + `id` int NOT NULL AUTO_INCREMENT, + `start_location` varchar(255) NOT NULL, + `end_location` varchar(255) NOT NULL, + `date` date NOT NULL, + `time` time NOT NULL, + `endtime` time NOT NULL, + `price` decimal(10,2) NOT NULL DEFAULT '0.00', + `passenger_id` varchar(111) NOT NULL, + `driver_id` varchar(111) NOT NULL, + `status` varchar(200) NOT NULL DEFAULT 'nothing', + `paymentMethod` varchar(20) NOT NULL DEFAULT 'Cash', + `carType` varchar(20) NOT NULL DEFAULT 'Speed', + `created_at` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, + `updated_at` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, + `DriverIsGoingToPassenger` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP, + `rideTimeStart` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP, + `rideTimeFinish` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP, + `price_for_driver` decimal(10,2) NOT NULL DEFAULT '0.00', + `price_for_passenger` decimal(10,2) NOT NULL DEFAULT '0.00', + `distance` float DEFAULT '0', + PRIMARY KEY (`id`), + KEY `passengerfk` (`passenger_id`), + KEY `driverfk` (`driver_id`) +) ENGINE=InnoDB AUTO_INCREMENT=831 DEFAULT CHARSET=utf8mb3; +/*!40101 SET character_set_client = @saved_cs_client */; + +-- +-- Table structure for table `seferWallet` +-- + +DROP TABLE IF EXISTS `seferWallet`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!50503 SET character_set_client = utf8mb4 */; +CREATE TABLE `seferWallet` ( + `id` int NOT NULL AUTO_INCREMENT, + `driverId` varchar(100) NOT NULL, + `passengerId` varchar(100) NOT NULL, + `amount` varchar(10) NOT NULL, + `paymentMethod` varchar(50) NOT NULL, + `token` varchar(100) NOT NULL, + `createdAt` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP, + PRIMARY KEY (`id`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci; +/*!40101 SET character_set_client = @saved_cs_client */; + +-- +-- Table structure for table `server_locations` +-- + +DROP TABLE IF EXISTS `server_locations`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!50503 SET character_set_client = utf8mb4 */; +CREATE TABLE `server_locations` ( + `id` int NOT NULL AUTO_INCREMENT, + `name` varchar(255) NOT NULL, + `min_latitude` decimal(10,6) NOT NULL, + `max_latitude` decimal(10,6) NOT NULL, + `min_longitude` decimal(10,6) NOT NULL, + `max_longitude` decimal(10,6) NOT NULL, + `server_link` varchar(255) NOT NULL, + PRIMARY KEY (`id`), + UNIQUE KEY `name` (`name`) +) ENGINE=InnoDB AUTO_INCREMENT=2 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci; +/*!40101 SET character_set_client = @saved_cs_client */; + +-- +-- Table structure for table `smsSender` +-- + +DROP TABLE IF EXISTS `smsSender`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!50503 SET character_set_client = utf8mb4 */; +CREATE TABLE `smsSender` ( + `id` int NOT NULL AUTO_INCREMENT, + `senderId` varchar(20) NOT NULL, + PRIMARY KEY (`id`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci; +/*!40101 SET character_set_client = @saved_cs_client */; + +-- +-- Table structure for table `test` +-- + +DROP TABLE IF EXISTS `test`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!50503 SET character_set_client = utf8mb4 */; +CREATE TABLE `test` ( + `id` int NOT NULL AUTO_INCREMENT, + `name` varchar(22) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL, + PRIMARY KEY (`id`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci; +/*!40101 SET character_set_client = @saved_cs_client */; + +-- +-- Table structure for table `testApp` +-- + +DROP TABLE IF EXISTS `testApp`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!50503 SET character_set_client = utf8mb4 */; +CREATE TABLE `testApp` ( + `id` int NOT NULL AUTO_INCREMENT, + `isTest` tinyint(1) NOT NULL, + `createdAt` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP, + `appPlatform` varchar(20) NOT NULL, + PRIMARY KEY (`id`) +) ENGINE=InnoDB AUTO_INCREMENT=3 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci; +/*!40101 SET character_set_client = @saved_cs_client */; + +-- +-- Table structure for table `tips` +-- + +DROP TABLE IF EXISTS `tips`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!50503 SET character_set_client = utf8mb4 */; +CREATE TABLE `tips` ( + `id` int NOT NULL AUTO_INCREMENT, + `driverID` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL, + `passengerID` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL, + `rideID` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL, + `tipAmount` decimal(10,2) DEFAULT NULL, + PRIMARY KEY (`id`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci; +/*!40101 SET character_set_client = @saved_cs_client */; + +-- +-- Table structure for table `token_verification` +-- + +DROP TABLE IF EXISTS `token_verification`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!50503 SET character_set_client = utf8mb4 */; +CREATE TABLE `token_verification` ( + `id` int NOT NULL AUTO_INCREMENT, + `phone_number` text CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL, + `token` text CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL, + `expiration_time` datetime NOT NULL, + `verified` tinyint(1) DEFAULT '0', + `created_at` datetime DEFAULT CURRENT_TIMESTAMP, + PRIMARY KEY (`id`) +) ENGINE=InnoDB AUTO_INCREMENT=49 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci; +/*!40101 SET character_set_client = @saved_cs_client */; + +-- +-- Table structure for table `token_verification_admin` +-- + +DROP TABLE IF EXISTS `token_verification_admin`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!50503 SET character_set_client = utf8mb4 */; +CREATE TABLE `token_verification_admin` ( + `id` int NOT NULL AUTO_INCREMENT, + `phone_number` varchar(20) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL, + `token` varchar(10) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL, + `expiration_time` datetime NOT NULL, + PRIMARY KEY (`id`), + UNIQUE KEY `phone_number` (`phone_number`) +) ENGINE=InnoDB AUTO_INCREMENT=29 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci; +/*!40101 SET character_set_client = @saved_cs_client */; + +-- +-- Table structure for table `token_verification_driver` +-- + +DROP TABLE IF EXISTS `token_verification_driver`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!50503 SET character_set_client = utf8mb4 */; +CREATE TABLE `token_verification_driver` ( + `id` int NOT NULL AUTO_INCREMENT, + `phone_number` text CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL, + `token` text CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL, + `expiration_time` datetime NOT NULL, + `verified` tinyint(1) NOT NULL DEFAULT '0', + `created_at` datetime DEFAULT CURRENT_TIMESTAMP, + PRIMARY KEY (`id`) +) ENGINE=InnoDB AUTO_INCREMENT=49 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci; +/*!40101 SET character_set_client = @saved_cs_client */; + +-- +-- Table structure for table `tokens` +-- + +DROP TABLE IF EXISTS `tokens`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!50503 SET character_set_client = utf8mb4 */; +CREATE TABLE `tokens` ( + `id` int NOT NULL AUTO_INCREMENT, + `token` varchar(333) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL, + `passengerID` varchar(80) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL, + `fingerPrint` varchar(250) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL, + `status` varchar(22) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL DEFAULT 'yet', + PRIMARY KEY (`id`), + UNIQUE KEY `passengerID` (`passengerID`) +) ENGINE=InnoDB AUTO_INCREMENT=53 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci; +/*!40101 SET character_set_client = @saved_cs_client */; + +-- +-- Table structure for table `users` +-- + +DROP TABLE IF EXISTS `users`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!50503 SET character_set_client = utf8mb4 */; +CREATE TABLE `users` ( + `id` varchar(111) NOT NULL, + `phone` varchar(15) NOT NULL, + `email` varchar(255) NOT NULL, + `gender` varchar(10) NOT NULL, + `password` varchar(100) NOT NULL, + `birthdate` date NOT NULL, + `site` varchar(255) NOT NULL, + `first_name` varchar(255) NOT NULL, + `last_name` varchar(255) NOT NULL, + `created_at` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP, + `updated_at` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, + `user_type` varchar(44) NOT NULL, + PRIMARY KEY (`id`), + UNIQUE KEY `email` (`email`), + UNIQUE KEY `phone` (`phone`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb3; +/*!40101 SET character_set_client = @saved_cs_client */; + +-- +-- Table structure for table `vehicles` +-- + +DROP TABLE IF EXISTS `vehicles`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!50503 SET character_set_client = utf8mb4 */; +CREATE TABLE `vehicles` ( + `id` int NOT NULL AUTO_INCREMENT, + `driverID` varchar(100) NOT NULL, + `make` varchar(255) NOT NULL, + `model` varchar(255) NOT NULL, + `license_plate` varchar(255) NOT NULL, + `seats` int NOT NULL, + `created_at` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP, + `updated_at` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, + PRIMARY KEY (`id`), + UNIQUE KEY `license_plate` (`license_plate`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb3; +/*!40101 SET character_set_client = @saved_cs_client */; + +-- +-- Table structure for table `videos` +-- + +DROP TABLE IF EXISTS `videos`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!50503 SET character_set_client = utf8mb4 */; +CREATE TABLE `videos` ( + `id` int NOT NULL AUTO_INCREMENT, + `title` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL, + `description` varchar(200) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL, + `url` varchar(150) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL, + `created_at` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP, + PRIMARY KEY (`id`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci; +/*!40101 SET character_set_client = @saved_cs_client */; + +-- +-- Table structure for table `waitingRides` +-- + +DROP TABLE IF EXISTS `waitingRides`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!50503 SET character_set_client = utf8mb4 */; +CREATE TABLE `waitingRides` ( + `id` varchar(100) NOT NULL, + `start_location` varchar(255) NOT NULL, + `end_location` varchar(255) NOT NULL, + `date` date NOT NULL, + `time` time NOT NULL, + `price` decimal(10,2) NOT NULL DEFAULT '0.00', + `passenger_id` varchar(111) NOT NULL, + `status` varchar(200) NOT NULL DEFAULT 'nothing', + `carType` varchar(19) NOT NULL, + `passengerRate` decimal(10,2) NOT NULL, + `created_at` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, + `price_for_passenger` decimal(10,2) NOT NULL DEFAULT '0.00', + `distance` varchar(255) NOT NULL, + `duration` varchar(10) NOT NULL DEFAULT '0', + PRIMARY KEY (`id`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb3; +/*!40101 SET character_set_client = @saved_cs_client */; + +-- +-- Table structure for table `welcomeDriverCall` +-- + +DROP TABLE IF EXISTS `welcomeDriverCall`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!50503 SET character_set_client = utf8mb4 */; +CREATE TABLE `welcomeDriverCall` ( + `id` int NOT NULL AUTO_INCREMENT, + `driverId` varchar(50) NOT NULL, + `isCall` tinyint(1) NOT NULL DEFAULT '0', + `notes` varchar(255) NOT NULL, + `createdAt` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP, + PRIMARY KEY (`id`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci; +/*!40101 SET character_set_client = @saved_cs_client */; + +-- +-- Table structure for table `write_argument_after_applied_from_background` +-- + +DROP TABLE IF EXISTS `write_argument_after_applied_from_background`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!50503 SET character_set_client = utf8mb4 */; +CREATE TABLE `write_argument_after_applied_from_background` ( + `id` int unsigned NOT NULL AUTO_INCREMENT, + `ride_id` varchar(50) NOT NULL, + `driver_id` varchar(50) NOT NULL, + `passenger_id` varchar(50) NOT NULL, + `passenger_location` varchar(30) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL, + `passenger_destination` varchar(30) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL, + `duration` varchar(255) NOT NULL, + `duration_to_passenger` varchar(255) NOT NULL, + `duration_of_ride` varchar(255) NOT NULL, + `distance` varchar(255) NOT NULL, + `total_cost` varchar(255) NOT NULL, + `payment_amount` varchar(255) NOT NULL, + `payment_method` enum('visa','cash') NOT NULL, + `wallet_checked` varchar(255) NOT NULL, + `has_steps` varchar(255) NOT NULL, + `step0` varchar(255) DEFAULT NULL, + `step1` varchar(255) DEFAULT NULL, + `step2` varchar(255) DEFAULT NULL, + `step3` varchar(255) DEFAULT NULL, + `step4` varchar(255) DEFAULT NULL, + `passenger_wallet_burc` varchar(33) NOT NULL, + `token_passenger` varchar(255) NOT NULL, + `name` varchar(100) NOT NULL, + `phone` varchar(20) NOT NULL, + `email` varchar(150) NOT NULL, + `start_name_location` varchar(255) NOT NULL, + `end_name_location` varchar(255) NOT NULL, + `car_type` varchar(50) NOT NULL, + `kazan` varchar(255) NOT NULL, + `direction_url` text NOT NULL, + `time_of_order` datetime NOT NULL, + `total_passenger` varchar(255) NOT NULL, + PRIMARY KEY (`id`) +) ENGINE=InnoDB AUTO_INCREMENT=3 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci; +/*!40101 SET character_set_client = @saved_cs_client */; + +-- +-- Dumping events for database 'intaleq-ridesDB' +-- + +-- +-- Dumping routines for database 'intaleq-ridesDB' +-- +/*!50112 SET @disable_bulk_load = IF (@is_rocksdb_supported, 'SET SESSION rocksdb_bulk_load = @old_rocksdb_bulk_load', 'SET @dummy_rocksdb_bulk_load = 0') */; +/*!50112 PREPARE s FROM @disable_bulk_load */; +/*!50112 EXECUTE s */; +/*!50112 DEALLOCATE PREPARE s */; +/*!40103 SET TIME_ZONE=@OLD_TIME_ZONE */; + +/*!40101 SET SQL_MODE=@OLD_SQL_MODE */; +/*!40014 SET FOREIGN_KEY_CHECKS=@OLD_FOREIGN_KEY_CHECKS */; +/*!40014 SET UNIQUE_CHECKS=@OLD_UNIQUE_CHECKS */; +/*!40101 SET CHARACTER_SET_CLIENT=@OLD_CHARACTER_SET_CLIENT */; +/*!40101 SET CHARACTER_SET_RESULTS=@OLD_CHARACTER_SET_RESULTS */; +/*!40101 SET COLLATION_CONNECTION=@OLD_COLLATION_CONNECTION */; +/*!40111 SET SQL_NOTES=@OLD_SQL_NOTES */; + +-- Dump completed on 2026-04-22 20:58:51 + +``` + +## File: encrypt_decrypt.php +``` +key = $key; + $this->iv = $iv; + } + + // --------- النصوص ---------- + private function addPadding($data, $blockSize = 16) { + $pad = $blockSize - (strlen($data) % $blockSize); + return $data . str_repeat(chr($pad), $pad); + } + + private function removePadding($data) { + $pad = ord($data[strlen($data) - 1]); + return substr($data, 0, -$pad); + } + + public function encryptData($plainText) { + $plainText = mb_convert_encoding($plainText, 'UTF-8'); + $paddedText = $this->addPadding($plainText); + $encrypted = openssl_encrypt($paddedText, 'AES-256-CBC', $this->key, OPENSSL_RAW_DATA, $this->iv); + return base64_encode($encrypted); + } + + public function decryptData($encryptedText) { + $decoded = base64_decode($encryptedText, true); + + if ($decoded === false) { + error_log("[ERROR] base64_decode failed for input: $encryptedText"); + return false; + } + + $decrypted = openssl_decrypt($decoded, 'AES-256-CBC', $this->key, OPENSSL_RAW_DATA, $this->iv); + + if ($decrypted === false) { + error_log("[ERROR] openssl_decrypt failed for input: $encryptedText"); + return false; + } + + // Verify padding is valid before removal + $pad = ord($decrypted[strlen($decrypted) - 1]); + if ($pad < 1 || $pad > 16) { + error_log("[ERROR] Invalid padding value ($pad) for decrypted input: $encryptedText"); + return false; + } + + return substr($decrypted, 0, -$pad); +} + + public function decryptFile($encryptedFilePath, $destinationPath) { + if (!file_exists($encryptedFilePath)) { + throw new Exception("❌ الملف المشفر غير موجود: $encryptedFilePath"); + } + + $encryptedData = file_get_contents($encryptedFilePath); + $decryptedData = openssl_decrypt($encryptedData, 'AES-256-CBC', $this->key, OPENSSL_RAW_DATA, $this->iv); + + file_put_contents($destinationPath, $decryptedData); + return true; + } + public function encryptBinary($data) { + $encrypted = openssl_encrypt($data, 'AES-256-CBC', $this->key, OPENSSL_RAW_DATA, $this->iv); + return $encrypted; + } + + public function decryptBinary($data) { + $decrypted = openssl_decrypt($data, 'AES-256-CBC', $this->key, OPENSSL_RAW_DATA, $this->iv); + return $decrypted; + } +} +// ✅ Load the key and IV from .env or use default values + +// ✅ Ensure the lengths are correct + //echo "Key Length: " . $key . PHP_EOL; + //echo "IV Length: " . $iv . PHP_EOL; + +try { + $encryptionHelper = new EncryptionHelper($key, $iv); + + +} catch (Exception $e) { + echo "Error: " . $e->getMessage() . PHP_EOL; +} + +?> +``` + +## File: core/bootstrap.php +``` +connect($redisHost, $redisPort, 1.5)) { + if ($redisPass) $redis->auth($redisPass); + $redis->setOption(Redis::OPT_PREFIX, 'intaleq:'); + } else { + $redis = null; + } + } +} catch (Exception $e) { + error_log("[REDIS] Connection failed: " . $e->getMessage()); + $redis = null; +} + +// 5. تحميل الـ Services الأساسية +require_once __DIR__ . '/Security/EncryptionHelper.php'; +require_once __DIR__ . '/Database/Database.php'; +require_once __DIR__ . '/Auth/RateLimiter.php'; +require_once __DIR__ . '/Auth/JwtService.php'; +// لا نحمّل OtpService و FcmService إلا عند الحاجة (Lazy) + +// 6. تهيئة Encryption Helper العام (للتوافقية) +$secretKey = trim(@file_get_contents('/home/intaleq-api/.secret_key')) ?: getenv('SECRET_KEY'); +if (!$secretKey) { + error_log("[FATAL] Secret key is missing."); + http_response_code(500); + exit(json_encode(['error' => 'Server configuration error'])); +} + +$encryptionHelper = new EncryptionHelper($secretKey); + +``` + +## File: core/helpers.php +``` + filter_var($value, FILTER_VALIDATE_INT) !== false ? (int)$value : null, + 'float' => filter_var($value, FILTER_VALIDATE_FLOAT) !== false ? (float)$value : null, + 'email' => filter_var($value, FILTER_VALIDATE_EMAIL) ?: null, + 'url' => filter_var($value, FILTER_VALIDATE_URL) ?: null, + 'bool' => filter_var($value, FILTER_VALIDATE_BOOLEAN, FILTER_NULL_ON_FAILURE), + default => $value, // string — بدون htmlspecialchars (نتركه لـ PDO) + }; +} + +// ── ردود JSON موحدة ───────────────────────────────────────── +function jsonSuccess(mixed $data = null, string $message = 'success', int $code = 200): never +{ + http_response_code($code); + $response = ['status' => 'success']; + if ($message !== 'success') $response['message'] = $message; + if ($data !== null) $response['data'] = $data; + echo json_encode($response, JSON_UNESCAPED_UNICODE | JSON_UNESCAPED_SLASHES); + exit; +} + +function jsonError(string $message, int $code = 400, mixed $extra = null): never +{ + http_response_code($code); + $response = ['status' => 'error', 'message' => $message]; + if ($extra !== null) $response['details'] = $extra; + echo json_encode($response, JSON_UNESCAPED_UNICODE | JSON_UNESCAPED_SLASHES); + exit; +} + +// (للتوافق مع الكود القديم) +function printSuccess(string $message = 'success'): void +{ + echo json_encode(['status' => 'success', 'message' => $message], JSON_UNESCAPED_UNICODE); +} +function printFailure(string $message = 'failure'): void +{ + echo json_encode(['status' => 'failure', 'message' => $message], JSON_UNESCAPED_UNICODE); +} +function result(int $count): void +{ + if ($count > 0) { + printSuccess(); + } else { + printFailure(); + } +} +function sendEmail(string $from, string $to, string $title, string $body): void +{ + $header = "From: $from\nCC: $from"; + mail($to, $title, $body, $header); +} + +// ── رفع صورة آمن ────────────────────────────────────────────── +function uploadImageSecure( + string $fileKey, + string $targetDir, + string $prefix = '', + array $allowedMimes = ['image/jpeg', 'image/png', 'image/webp'] +): array { + if (!isset($_FILES[$fileKey]) || $_FILES[$fileKey]['error'] !== UPLOAD_ERR_OK) { + return ['success' => false, 'error' => 'File upload error']; + } + + $file = $_FILES[$fileKey]; + $maxSize = 5 * 1024 * 1024; // 5MB + + // حجم الملف + if ($file['size'] > $maxSize) { + return ['success' => false, 'error' => 'File too large (max 5MB)']; + } + + // MIME validation حقيقي (ليس extension فقط) + $finfo = new finfo(FILEINFO_MIME_TYPE); + $mimeType = $finfo->file($file['tmp_name']); + + if (!in_array($mimeType, $allowedMimes, true)) { + return ['success' => false, 'error' => "Invalid file type: $mimeType"]; + } + + // اسم ملف آمن وعشوائي + $ext = match ($mimeType) { + 'image/jpeg' => 'jpg', + 'image/png' => 'png', + 'image/webp' => 'webp', + default => 'bin', + }; + $filename = ($prefix ? "{$prefix}_" : '') . bin2hex(random_bytes(8)) . ".$ext"; + + if (!is_dir($targetDir)) { + mkdir($targetDir, 0750, true); + } + + $targetPath = rtrim($targetDir, '/') . '/' . $filename; + + if (!move_uploaded_file($file['tmp_name'], $targetPath)) { + return ['success' => false, 'error' => 'Failed to move uploaded file']; + } + + return ['success' => true, 'filename' => $filename, 'path' => $targetPath]; +} + +// ── تحميل ملف .env ─────────────────────────────────────────── +function loadEnvironment(string $path): void +{ + if (!file_exists($path)) { + error_log("[ENV] File not found: $path"); + return; + } + $lines = file($path, FILE_IGNORE_NEW_LINES | FILE_SKIP_EMPTY_LINES); + foreach ($lines as $line) { + if (str_starts_with(trim($line), '#')) continue; + if (!str_contains($line, '=')) continue; + [$key, $value] = explode('=', $line, 2); + $key = trim($key); + $value = trim($value, " \t\n\r\0\x0B\"'"); + if ($key && !getenv($key)) { + putenv("$key=$value"); + $_ENV[$key] = $value; + } + } +} + +// ── Logging منظم ────────────────────────────────────────────── +function securityLog(string $message, array $context = []): void +{ + $entry = date('Y-m-d H:i:s') . ' [SECURITY] ' . $message; + if ($context) $entry .= ' | ' . json_encode($context, JSON_UNESCAPED_UNICODE); + error_log($entry, 3, '/home/intaleq-api/logs/security.log'); +} + +function appLog(string $message, string $level = 'INFO'): void +{ + $entry = date('Y-m-d H:i:s') . " [$level] " . $message; + error_log($entry, 3, '/home/intaleq-api/logs/app.log'); +} + +function debugLog(string $message): void +{ + appLog($message, 'DEBUG'); +} + +``` + +## File: core/Database/Database.php +``` + 'dbname', // متغير ENV لاسم DB الرئيسي + 'tracking' => 'dbname_track', // متغير ENV لقاعدة التتبع + 'ride' => 'dbname_ride', // متغير ENV لقاعدة الرحلات + ]; + + public static function get(string $name = 'main'): PDO + { + if (!isset(self::$instances[$name])) { + self::$instances[$name] = self::connect($name); + } + return self::$instances[$name]; + } + + private static function connect(string $name): PDO + { + if (!isset(self::$map[$name])) { + throw new InvalidArgumentException("Unknown database: $name"); + } + + $dbEnvKey = self::$map[$name]; + $dbname = getenv($dbEnvKey); + $user = getenv('USER'); + $pass = getenv('PASS'); + $host = getenv('DB_HOST') ?: 'localhost'; + + if (!$dbname || !$user) { + throw new RuntimeException("Database config missing for: $name"); + } + + $dsn = "mysql:host=$host;dbname=$dbname;charset=utf8mb4"; + $options = [ + PDO::ATTR_EMULATE_PREPARES => false, + PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION, + PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_ASSOC, + PDO::ATTR_PERSISTENT => true, // connection reuse + PDO::MYSQL_ATTR_INIT_COMMAND => "SET NAMES utf8mb4 COLLATE utf8mb4_unicode_ci", + PDO::ATTR_TIMEOUT => 10, + ]; + + try { + return new PDO($dsn, $user, $pass, $options); + } catch (PDOException $e) { + error_log("[DB] Connection failed ($name): " . $e->getMessage()); + throw $e; + } + } + + // منع الاستنساخ + private function __construct() {} + private function __clone() {} +} + +``` + +## File: core/Security/EncryptionHelper.php +``` +key = $key; + // IV القديم للتوافقية أثناء مرحلة المايغريشن + $this->cbcIv = $cbcIv ?: getenv('initializationVector') ?: str_repeat('0', 16); + } + + // ─── تشفير نص (CBC مؤقتاً للتوافق التام كما طلب المستخدم) ── + // سيتم تغييره لاحقاً لـ GCM بعد تفريغ قاعدة البيانات القديمة + public function encryptData(string $plainText): string + { + // بناءً على طلب المستخدم: إبقاء التشفير الحالي CBC حتى نقوم بالترحيل لاحقاً + $plainText = mb_convert_encoding($plainText, 'UTF-8'); + $paddedText = $this->addPadding($plainText); + $encrypted = openssl_encrypt($paddedText, self::ALGO_CBC, $this->key, OPENSSL_RAW_DATA, $this->cbcIv); + return base64_encode($encrypted); + } + + // ─── فك تشفير نص (يدعم CBC والـ GCM المستقبلي) ─────────── + public function decryptData(string $cipherText): string|false + { + // تحقق إن كان مشفر بالنظام الجديد + if (str_starts_with($cipherText, self::PREFIX_GCM)) { + $raw = base64_decode(substr($cipherText, strlen(self::PREFIX_GCM)), true); + if ($raw === false || strlen($raw) < self::IV_LEN_GCM + self::TAG_LEN) return false; + + $iv = substr($raw, 0, self::IV_LEN_GCM); + $tag = substr($raw, self::IV_LEN_GCM, self::TAG_LEN); + $cipher = substr($raw, self::IV_LEN_GCM + self::TAG_LEN); + + $plain = openssl_decrypt($cipher, self::ALGO_GCM, $this->key, OPENSSL_RAW_DATA, $iv, $tag); + return $plain !== false ? $plain : false; + } + + // وإلا استخدم CBC القديم + $decoded = base64_decode($cipherText, true); + if ($decoded === false) return false; + + $decrypted = openssl_decrypt($decoded, self::ALGO_CBC, $this->key, OPENSSL_RAW_DATA, $this->cbcIv); + if ($decrypted === false) return false; + + $pad = ord($decrypted[strlen($decrypted) - 1]); + if ($pad < 1 || $pad > 16) return false; + + return substr($decrypted, 0, -$pad); + } + + // ─── تشفير/فك تشفير Binary (صور، ملفات) ─────────────── + public function encryptBinary(string $data): string + { + return openssl_encrypt($data, self::ALGO_CBC, $this->key, OPENSSL_RAW_DATA, $this->cbcIv); + } + + public function decryptBinary(string $data): string|false + { + return openssl_decrypt($data, self::ALGO_CBC, $this->key, OPENSSL_RAW_DATA, $this->cbcIv); + } + + // --------- دوال الـ Padding للـ CBC ---------- + private function addPadding($data, $blockSize = 16) { + $pad = $blockSize - (strlen($data) % $blockSize); + return $data . str_repeat(chr($pad), $pad); + } + + private function removePadding($data) { + $pad = ord($data[strlen($data) - 1]); + return substr($data, 0, -$pad); + } +} + +``` + +## File: core/Auth/JwtService.php +``` +secretKey = trim(file_get_contents('/home/intaleq-api/.secret_key')); + $this->hmacSecret = getenv('SECRET_KEY_HMAC') ?: ''; + $this->fpPepper = getenv('FP_PEPPER') ?: ''; + $this->issuer = getenv('APP_ISSUER') ; + $this->redis = $redis; + } + + // ── توليد Access Token ────────────────────────────────── + public function generateAccessToken( + int|string $userId, + string $role, + string $audience, + ?string $fingerprint = null + ): string { + $jti = bin2hex(random_bytes(16)); + + $payload = [ + 'iss' => $this->issuer, + 'aud' => $audience, + 'user_id' => $userId, + 'role' => $role, + 'token_type' => 'access', + 'jti' => $jti, + 'iat' => time(), + 'exp' => time() + self::ACCESS_TTL, + ]; + + if ($fingerprint && $this->fpPepper) { + $payload['fingerPrint'] = hash('sha256', $fingerprint . $this->fpPepper); + } + + return JWT::encode($payload, $this->secretKey, self::ALGO); + } + + // ── توليد Refresh Token ───────────────────────────────── + public function generateRefreshToken(int|string $userId): array + { + $token = bin2hex(random_bytes(32)); + $exp = time() + self::REFRESH_TTL; + + // تخزين في Redis + if ($this->redis) { + $this->redis->setex( + "refresh:{$userId}:{$token}", + self::REFRESH_TTL, + json_encode(['user_id' => $userId, 'created_at' => time()]) + ); + } + + return ['token' => $token, 'expires_at' => $exp]; + } + + // ── التحقق الكامل من التوكن ──────────────────────────── + public function authenticate(): object + { + // 1. استخراج التوكن + $authHeader = $_SERVER['HTTP_AUTHORIZATION'] ?? ''; + $token = null; + if (preg_match('/Bearer\s(\S+)/', $authHeader, $m)) { + $token = $m[1]; + } + + if (!$token) { + self::abort(401, 'Authorization token required'); + } + + // 2. Decode + try { + $decoded = JWT::decode($token, new Key($this->secretKey, self::ALGO)); + } catch (ExpiredException $e) { + self::abort(401, 'Token expired'); + } catch (SignatureInvalidException $e) { + self::abort(401, 'Invalid token signature'); + } catch (BeforeValidException $e) { + self::abort(401, 'Token not yet valid'); + } catch (Exception $e) { + self::abort(401, 'Invalid token'); + } + + // 3. Issuer + if (($decoded->iss ?? '') !== $this->issuer) { + self::abort(401, 'Invalid token issuer'); + } + + // 4. User ID + $userId = $decoded->user_id ?? $decoded->sub ?? null; + if (!$userId) { + self::abort(401, 'Invalid JWT payload'); + } + + // 5. JTI Blacklist (تحقق من توكنات ملغاة) + $jti = $decoded->jti ?? null; + if ($jti && $this->redis) { + if ($this->redis->exists("jwt:blacklist:$jti")) { + self::abort(401, 'Token has been revoked'); + } + } + + // 6. token_type — قيّد registration endpoints + $tokenType = $decoded->token_type ?? 'access'; + if ($tokenType === 'registration' || $tokenType === 'new') { + $currentFile = basename($_SERVER['PHP_SELF'], '.php'); + $allowed = false; + foreach (self::REGISTRATION_ENDPOINTS as $ep) { + if (strcasecmp($currentFile, $ep) === 0) { + $allowed = true; + break; + } + } + if (!$allowed) { + error_log("[SECURITY] Registration token blocked on: $currentFile | user: $userId"); + self::abort(403, 'Token not authorized for this action'); + } + } + + // 7. Device Fingerprint (إلزامي للـ Access Tokens) + if ($this->fpPepper && $tokenType === 'access') { + $fpInToken = $decoded->fingerPrint ?? null; + $fpHeader = $_SERVER['HTTP_X_DEVICE_FP'] ?? null; + + if ($fpInToken === null || $fpHeader === null) { + error_log("[SECURITY] Fingerprint missing | user: $userId"); + self::abort(403, 'Device verification required'); + } + + $expected = hash('sha256', $fpHeader . $this->fpPepper); + if (!hash_equals($expected, $fpInToken)) { + error_log("[SECURITY] Device mismatch | user: $userId | IP: " . ($_SERVER['REMOTE_ADDR'] ?? '?')); + self::abort(403, 'Device mismatch'); + } + } + + // 8. HMAC — مطلوب للعمليات الحساسة (Wallet/Logout) + $hmacHeader = $_SERVER['HTTP_X_HMAC_AUTH'] ?? null; + if ($hmacHeader !== null) { + $timestamp = $_SERVER['HTTP_X_TIMESTAMP'] ?? ''; + $nonce = $_SERVER['HTTP_X_NONCE'] ?? ''; + $body = file_get_contents('php://input') ?: ''; + + // التوقيع يضم الـ Body + Timestamp + Nonce لمنع التكرار والتلاعب + $payloadToSign = $body . $timestamp . $nonce; + $expectedHmac = hash_hmac('sha256', $payloadToSign, $this->hmacSecret); + + if (!hash_equals($expectedHmac, $hmacHeader)) { + error_log("[SECURITY] HMAC mismatch | user: $userId | IP: " . ($_SERVER['REMOTE_ADDR'] ?? '?')); + self::abort(403, 'Invalid HMAC signature'); + } + } + + return $decoded; + } + + // ── إلغاء توكن (Logout / Password Change) ────────────── + public function revokeToken(string $jti, int $remainingTTL = 900): void + { + if ($this->redis && $jti) { + $this->redis->setex("jwt:blacklist:$jti", $remainingTTL + 60, '1'); + } + } + + // ── Internal API Key — للـ get_connect.php ───────────── + public static function validateInternalKey(): void + { + $keyPath = '/home/intaleq-api/.internal_socket_key'; + $sent = $_SERVER['HTTP_X_INTERNAL_KEY'] ?? ''; + $expected = file_exists($keyPath) ? trim(file_get_contents($keyPath)) : ''; + + if (!$expected || !hash_equals($expected, $sent)) { + error_log('[SECURITY] Invalid internal key from: ' . ($_SERVER['REMOTE_ADDR'] ?? '?')); + http_response_code(403); + echo json_encode(['error' => 'Unauthorized internal request']); + exit; + } + } + + private static function abort(int $code, string $message): never + { + http_response_code($code); + echo json_encode(['error' => $message]); + exit; + } +} + +``` + +## File: core/Auth/RateLimiter.php +``` + ['requests' => 5, 'window' => 60], // 5 محاولات / دقيقة + 'otp' => ['requests' => 3, 'window' => 300], // 3 محاولات / 5 دقائق + 'register' => ['requests' => 3, 'window' => 3600], // 3 محاولات / ساعة + 'api' => ['requests' => 120, 'window' => 60], // 120 طلب / دقيقة + 'ride' => ['requests' => 30, 'window' => 60], // 30 طلب / دقيقة + 'upload' => ['requests' => 10, 'window' => 300], // 10 رفع / 5 دقائق + ]; + + public function __construct(?Redis $redis) + { + $this->redis = $redis; + } + + // ── فحص الحد ───────────────────────────────────────────── + // $identifier: IP:userId أو IP فقط + // $type: login | otp | api | ride | upload + public function check(string $identifier, string $type = 'api'): bool + { + if (!$this->redis) { + return true; // بدون Redis نمرر (fallback) + } + + $limit = self::LIMITS[$type] ?? self::LIMITS['api']; + $window = $limit['window']; + $max = $limit['requests']; + + $key = "rate:{$type}:{$identifier}"; + $current = $this->redis->incr($key); + + if ($current === 1) { + $this->redis->expire($key, $window); + } + + return $current <= $max; + } + + // ── تطبيق الحد وإيقاف الطلب إن تجاوز ───────────────────── + public function enforce(string $identifier, string $type = 'api'): void + { + if (!$this->check($identifier, $type)) { + $limit = self::LIMITS[$type] ?? self::LIMITS['api']; + $window = $limit['window']; + + error_log("[RATE_LIMIT] Blocked: $identifier | type: $type"); + + http_response_code(429); + header("Retry-After: $window"); + echo json_encode([ + 'error' => 'Too many requests. Please slow down.', + 'retry_after' => $window, + ]); + exit; + } + } + + // ── بناء معرّف المستخدم ──────────────────────────────────── + public static function identifier(?string $userId = null): string + { + $ip = $_SERVER['REMOTE_ADDR'] ?? 'unknown'; + return $userId ? "{$ip}:{$userId}" : $ip; + } + + // ── إعادة تعيين عداد (مثلاً بعد تسجيل دخول ناجح) ─────────── + public function reset(string $identifier, string $type = 'login'): void + { + if ($this->redis) { + $this->redis->del("rate:{$type}:{$identifier}"); + } + } +} + +``` + +## File: core/Services/OtpService.php +``` +redis = $redis; + } + + // ── توليد وحفظ OTP ───────────────────────────────────── + public function generate(string $phone): string + { + // OTP آمن (6 أرقام عشوائية) + $otp = str_pad((string)random_int(100000, 999999), 6, '0', STR_PAD_LEFT); + + if ($this->redis) { + $key = "otp:{$phone}"; + $this->redis->setex($key, self::OTP_TTL, password_hash($otp, PASSWORD_BCRYPT)); + // إعادة تعيين عداد المحاولات + $this->redis->del("otp:attempts:{$phone}"); + } + + return $otp; + } + + // ── التحقق من OTP ─────────────────────────────────────── + public function verify(string $phone, string $inputOtp): bool + { + if (!$this->redis) return false; + + // فحص الـ lockout + if ($this->redis->exists("otp:locked:{$phone}")) { + return false; + } + + $key = "otp:{$phone}"; + $stored = $this->redis->get($key); + + if (!$stored) { + return false; // انتهت صلاحية الـ OTP + } + + $attemptsKey = "otp:attempts:{$phone}"; + + if (!password_verify($inputOtp, $stored)) { + $attempts = $this->redis->incr($attemptsKey); + $this->redis->expire($attemptsKey, self::OTP_TTL); + + if ($attempts >= self::MAX_ATTEMPTS) { + // قفل لمدة 30 دقيقة + $this->redis->setex("otp:locked:{$phone}", self::LOCKOUT_TTL, '1'); + $this->redis->del($key); + } + return false; + } + + // نجح التحقق — احذف الـ OTP + $this->redis->del($key); + $this->redis->del($attemptsKey); + return true; + } + + // ── فحص هل الرقم مقفل ────────────────────────────────── + public function isLocked(string $phone): bool + { + return $this->redis && (bool)$this->redis->exists("otp:locked:{$phone}"); + } +} + +``` + +## File: core/Services/FcmService.php +``` +redis = $redis; + // المسار بناء على بنية المشروع + $this->serviceAccountFile = __DIR__ . '/../../service-account.json'; + } + + // ── إرسال إشعار ──────────────────────────────────────── + public function send( + string $token, + string $title, + string $body, + array $data = [], + string $category = 'Order', + string $tone = 'ding' + ): array { + $accessToken = $this->getAccessToken(); + if (!$accessToken) { + return ['status' => 'error', 'message' => 'No access token']; + } + + if (!file_exists($this->serviceAccountFile)) { + return ['status' => 'error', 'message' => 'Service account file missing']; + } + + $creds = json_decode(file_get_contents($this->serviceAccountFile), true); + $projectId = $creds['project_id']; + $fcmUrl = "https://fcm.googleapis.com/v1/projects/$projectId/messages:send"; + + $finalData = array_merge($data, [ + 'title' => $title, + 'body' => $body, + 'tone' => $tone, + 'category' => $category, + 'type' => $category, + ]); + + // FCM يشترط أن تكون كل القيم strings + $processedData = array_map( + fn($v) => is_array($v) || is_object($v) + ? json_encode($v, JSON_UNESCAPED_UNICODE) + : (string)$v, + $finalData + ); + + $payload = [ + 'message' => [ + 'token' => $token, + 'data' => $processedData, + 'android' => ['priority' => 'HIGH'], + 'apns' => [ + 'headers' => ['apns-priority' => '10', 'apns-push-type' => 'background'], + 'payload' => ['aps' => ['content-available' => 1]], + ], + ], + ]; + + $ch = curl_init($fcmUrl); + curl_setopt_array($ch, [ + CURLOPT_POST => true, + CURLOPT_HTTPHEADER => [ + "Authorization: Bearer $accessToken", + 'Content-Type: application/json; charset=UTF-8', + ], + CURLOPT_POSTFIELDS => json_encode($payload, JSON_UNESCAPED_UNICODE), + CURLOPT_RETURNTRANSFER => true, + CURLOPT_TIMEOUT => 8, + CURLOPT_CONNECTTIMEOUT => 3, + CURLOPT_FRESH_CONNECT => false, // إعادة استخدام الاتصال + CURLOPT_FORBID_REUSE => false, + CURLOPT_TCP_KEEPALIVE => 1, + ]); + + $result = curl_exec($ch); + $httpCode = curl_getinfo($ch, CURLINFO_HTTP_CODE); + $curlErr = curl_errno($ch); + curl_close($ch); + + if ($curlErr) { + return ['status' => 'error', 'message' => 'CURL error']; + } + + return $httpCode === 200 + ? ['status' => 'success'] + : ['status' => 'error', 'code' => $httpCode, 'response' => $result]; + } + + // ── Access Token مع Redis Cache ───────────────────────── + private function getAccessToken(): ?string + { + // 1. من Redis + if ($this->redis) { + $cached = $this->redis->get('google_fcm_access_token'); + if ($cached) return $cached; + } + + // 2. طلب جديد + $token = $this->fetchGoogleToken(); + + if ($token && $this->redis) { + $this->redis->setex('google_fcm_access_token', 3500, $token); + } + + return $token; + } + + private function fetchGoogleToken(): ?string + { + if (!file_exists($this->serviceAccountFile)) return null; + + $creds = json_decode(file_get_contents($this->serviceAccountFile), true); + $clientEmail = $creds['client_email']; + $privateKey = $creds['private_key']; + $now = time(); + + $header = rtrim(strtr(base64_encode(json_encode(['alg' => 'RS256', 'typ' => 'JWT'])), '+/', '-_'), '='); + $claim = rtrim(strtr(base64_encode(json_encode([ + 'iss' => $clientEmail, + 'scope' => 'https://www.googleapis.com/auth/firebase.messaging', + 'aud' => 'https://oauth2.googleapis.com/token', + 'exp' => $now + 3600, + 'iat' => $now, + ])), '+/', '-_'), '='); + + $signature = ''; + openssl_sign("$header.$claim", $signature, $privateKey, 'SHA256'); + $jwt = "$header.$claim." . rtrim(strtr(base64_encode($signature), '+/', '-_'), '='); + + $ch = curl_init('https://oauth2.googleapis.com/token'); + curl_setopt_array($ch, [ + CURLOPT_POST => true, + CURLOPT_POSTFIELDS => http_build_query([ + 'grant_type' => 'urn:ietf:params:oauth:grant-type:jwt-bearer', + 'assertion' => $jwt, + ]), + CURLOPT_RETURNTRANSFER => true, + CURLOPT_TIMEOUT => 10, + ]); + + $res = curl_exec($ch); + curl_close($ch); + + return json_decode($res, true)['access_token'] ?? null; + } +} + +``` + +## File: webhook_sms/webhook.php +``` + 'error', 'message' => 'Unauthorized Access']); + exit(); +} + +// --- 2. قراءة البيانات المرسلة --- +$json_data = file_get_contents('php://input'); +$data = json_decode($json_data, true); + +if ($data === null || !isset($data['sender']) || !isset($data['message'])) { + http_response_code(400); + echo json_encode(['status' => 'error', 'message' => 'Invalid data received']); + exit(); +} + +// --- 3. استخراج البيانات والتحضير للمعالجة --- +$sender = $data['sender']; +$message_body = $data['message']; +$received_at = date('Y-m-d H:i:s'); +$log_entry = "[$received_at] From: $sender | Message: $message_body"; + +// --- 4. تحليل الرسالة (يركز على Orange Money فقط حالياً) --- + +// تعريف المتغيرات التي سنستخرجها +$amount = 0; +$payer_phone = null; +$currency = null; + +// النمط الوحيد الفعّال حالياً: لرسائل Orange Money الأردنية +$pattern_orangemoney_jo = '/تم استقبال حوالة مالية من (\d+)\s+من مزود الخدمة:\s+Orange Money إلى محفظتك بمبلغ ([\d,.]+)\s+دينار/'; + +/* +// أنماط أخرى يمكن تفعيلها لاحقاً +// $pattern_chambank = '/حوالة واردة خارجية بمبلغ\s+([\d,.]+)\s+ليرة سورية/'; +// $pattern_wallet_syr = '/تم استلام مبلغ ([\d,.]+) ل\.س من الرقم (09\d{8})/'; +*/ + +if (preg_match($pattern_orangemoney_jo, $message_body, $matches)) { + // --- تطابق نمط Orange Money الأردني --- + $payer_phone = $matches[1]; + $amount_str = $matches[2]; + $amount = (float) str_replace(',', '', $amount_str); + $currency = 'JOD'; // دينار أردني + + $log_entry .= " | MATCH: Orange Money JO | SUCCESS: Parsed Amount = $amount, Payer Phone = $payer_phone, Currency = $currency" . PHP_EOL; + + // TODO: اكتب منطق قاعدة البيانات هنا + /* + - ابحث عن معاملة "pending" تطابق المبلغ $amount ورقم الهاتف $payer_phone. + - $sql = "UPDATE transactions SET status = 'completed' WHERE amount = ? AND phone_number = ? AND currency = 'JOD' AND status = 'pending' LIMIT 1"; + */ + +} else { + // إذا لم تتطابق الرسالة مع نمط Orange Money + $log_entry .= " | INFO: Message did not match the Orange Money pattern. Ignored." . PHP_EOL; +} + +// كتابة كل شيء في ملف السجل +file_put_contents('sms_log.txt', $log_entry, FILE_APPEND); + + +// --- 5. إرسال رد إلى تطبيق الأندرويد --- +http_response_code(200); +echo json_encode(['status' => 'success', 'message' => 'Data received and processed.']); +?> + + +``` + +## File: auth/sendEmail.php +``` + + +Verify your email address + + +

Hi [$email],

+ +

We recently received a request to verify your email address for your account on SEFER App.

+ +

To verify your email address, please write this to app .

+$token + +

If you did not request to verify your email address, please ignore this email.

+ +

Thank you,

+SEFER Team. + + +"; + +mail($email, $subject, $bodyEmail, $headers); +``` + +## File: auth/login.php +``` +prepare($sql); +$stmt->bindParam(':email', $email); +$stmt->bindParam(':phone', $phone); +$stmt->execute(); +$data = $stmt->fetchAll(PDO::FETCH_ASSOC); +$count = $stmt->rowCount(); + +if ($count > 0) { + $stored_password = $data[0]['password']; + if (password_verify($password, $stored_password)) { + unset($data[0]['password']); + echo json_encode([ + "status" => "success", + "count" => $count, + "data" => $data + ]); + } else { + // The password is incorrect + echo json_encode([ + "status" => "Failure", + "data" => "Incorrect password." + ]); + // jsonError("Incorrect password."); + } +} else { + // The user does not exist + echo json_encode([ + "status" => "Failure", + "data" => "User does not exist." + ]); + // jsonError("User does not exist."); +} +$conn->close(); + +?> + +``` + +## File: auth/verifyOtpMessage.php +``` +prepare($sql); + +// Log the parameters used in the SQL query for debugging +error_log("Executing SELECT SQL: " . $sql . " with phone_number=" . $phone_number . " and token_code=" . $token_code); + +$stmt->bindParam(':phone_number', $phone_number, PDO::PARAM_STR); +$stmt->bindParam(':token_code', $token_code, PDO::PARAM_STR); + +if ($stmt->execute()) { + $result = $stmt->fetch(); + + if ($result) { + // Update the verified status + $sql = "UPDATE `phone_verification_passenger` SET `verified` = 1 WHERE `phone_number` = :phone_number"; + $stmt = $con->prepare($sql); + + // Log the update query execution + error_log("Executing UPDATE SQL: " . $sql . " with phone_number=" . $phone_number); + + $stmt->bindParam(':phone_number', $phone_number, PDO::PARAM_STR); + + if ($stmt->execute()) { + jsonSuccess(null, "Your phone number has been verified."); + } else { + // Log if the update query fails + error_log("Error executing UPDATE SQL: " . implode(", ", $stmt->errorInfo())); + jsonError("An error occurred while verifying your phone number. Please try again."); + } + + } else { + // Log if no matching record was found + error_log("No matching record found for phone_number=" . $phone_number . " and token_code=" . $token_code); + jsonError("Your phone number could not be verified. Please try again."); + } + +} else { + // Log if the select query fails + error_log("Error executing SELECT SQL: " . implode(", ", $stmt->errorInfo())); + jsonError("An error occurred while verifying your phone number. Please try again."); +} +?> +``` + +## File: auth/packageInfo.php +``` +prepare($sql); +$stmt->execute(); +$result = $stmt->fetchAll(PDO::FETCH_ASSOC); + +if ($stmt->rowCount() > 0) { + // Print all the records + // printData($result); + jsonSuccess($data = $result); +} else { + // Print a failure message + jsonError($message = "No records found"); +} +?> +``` + +## File: auth/passengerRemovedAccountEmail.php +``` + +``` + +## File: auth/sendVerifyEmail.php +``` +prepare($sql); +$stmt->execute(); + +$rowCount = $stmt->rowCount(); + +$admin='support@mobile-app.store'; +$headers = "MIME-Version: 1.0" . "\r\n"; +$headers .= "Content-type: text/html; charset=UTF-8" . "\r\n"; +$headers .= "From: $admin" . "\r\n"; + +$subject = "Verify your email address"; +$bodyEmail = " + + +Verify your email address + + +

Hi [$email],

+ +

We recently received a request to verify your email address for your account on SEFER App.

+ +

To verify your email address, please write this to app .

+$token + +

If you did not request to verify your email address, please ignore this email.

+ +

Thank you,

+SEFER Team. + + +"; + + + +if ($rowCount > 0) { + // The email already exists, so update the data + $sql = "UPDATE `email_verifications` SET `token` = '$token' WHERE `email` = '$email'"; + $stmt = $con->prepare($sql); + $stmt->execute(); + + if ($stmt->rowCount() > 0) { + // The update was successful + jsonSuccess($message = "Email verification data updated successfully"); + mail($email, $subject, $bodyEmail, $headers); + } else { + // The update was unsuccessful + jsonError($message = "Failed to update email verification data"); + } +} else { + // The email does not exist, so insert the data + $sql = "INSERT INTO `email_verifications` (`email`, `token`) VALUES ('$email', '$token')"; + $stmt = $con->prepare($sql); + $stmt->execute(); + + if ($stmt->rowCount() > 0) { + // The insertion was successful + jsonSuccess($message = "Email verification data saved successfully"); + mail($email, $subject, $bodyEmail, $headers); + } else { + // The insertion was unsuccessful + jsonError($message = "Failed to save email verification data"); + } +} +?> + + +``` + +## File: auth/signup.php +``` +encryptData($phone); +$email = $encryptionHelper->encryptData($email); +$gender = $encryptionHelper->encryptData($gender); +$birthdate = $encryptionHelper->encryptData($birthdate); +$site = $encryptionHelper->encryptData($site); +$first_name = $encryptionHelper->encryptData($first_name); +$last_name = $encryptionHelper->encryptData($last_name); + +// تشفير الباسورد +$hashedPassword = password_hash($password, PASSWORD_DEFAULT); + +try { + // التحقق من وجود الإيميل أو رقم الهاتف مسبقًا + $sql = "SELECT * FROM passengers WHERE phone = :phone OR email = :email"; + $stmt = $con->prepare($sql); + $stmt->bindParam(":phone", $phone); + $stmt->bindParam(":email", $email); + $stmt->execute(); + $results = $stmt->fetchAll(); + + if (count($results) > 0) { + jsonError("The email or phone number is already registered."); + exit; + } + + // إدخال البيانات الجديدة + $sql = "INSERT INTO passengers ( + id, phone, email, password, gender, birthdate, site, first_name, last_name + ) VALUES ( + :id, :phone, :email, :password, :gender, :birthdate, :site, :first_name, :last_name + )"; + $stmt = $con->prepare($sql); + $stmt->bindParam(":id", $id); + $stmt->bindParam(":phone", $phone); + $stmt->bindParam(":email", $email); + $stmt->bindParam(":password", $hashedPassword); + $stmt->bindParam(":gender", $gender); + $stmt->bindParam(":birthdate", $birthdate); + $stmt->bindParam(":site", $site); + $stmt->bindParam(":first_name", $first_name); + $stmt->bindParam(":last_name", $last_name); + $stmt->execute(); + + if ($stmt->rowCount() > 0) { + jsonSuccess(null, "success to save passenger data"); + } else { + jsonError("Failed to save passenger data"); + } + +} catch (PDOException $e) { + error_log("Database Error: " . $e->getMessage()); + jsonError("An error occurred while saving the data."); +} +?> +``` + +## File: auth/resetPassword.php +``` + +``` + +## File: auth/cnMap.php +``` + "3", + "1" => "7", + "2" => "1", + "3" => "9", + "4" => "0", + "5" => "5", + "6" => "2", + "7" => "6", + "8" => "4", + "9" => "8" +); + +// Convert the map to a JSON string with JSON_FORCE_OBJECT option +$jsonString = json_encode($cn, JSON_FORCE_OBJECT); + +// Send the JSON string to the Flutter app +echo $jsonString; +?> + +``` + +## File: auth/checkPhoneNumberISVerfiedPassenger.php +``` +encryptData($phoneNumber); +$email = $encryptionHelper->encryptData($email); + +// تنفيذ الاستعلام +$sql = " + SELECT + pv.*, + p.email + FROM + `phone_verification_passenger` pv + INNER JOIN + `passengers` p ON pv.phone_number = p.phone + WHERE + pv.phone_number = :phoneNumber AND p.email = :email +"; +$stmt = $con->prepare($sql); +$stmt->bindParam(':phoneNumber', $phoneNumber, PDO::PARAM_STR); +$stmt->bindParam(':email', $email, PDO::PARAM_STR); +$stmt->execute(); + +if ($stmt->rowCount() > 0) { + $rows = $stmt->fetchAll(PDO::FETCH_ASSOC); + + // يمكنك هنا لاحقًا تفكيك تشفير أي حقل إذا كنت ترجع phone/email مثلاً للمستخدم، لكن في حالتنا ما في حاجة. + + jsonSuccess($rows); +} else { + jsonError("No Phone verified or related email found"); +} +?> +``` + +## File: auth/cn_map.json +``` +["3","7","1","9","0","5","2","6","4","8"] +``` + +## File: auth/otpmessage.php +``` + $username, + 'password' => $password, + 'language' => 'e' , // Assuming 'e' is for English as per original + 'sender' => $sender, + 'receiver' => $receiver, + 'message' => $message +]; +$jsonPayload = json_encode($payload); +$response = callAPI("POST", $apiUrl, $jsonPayload); + +if ($response && isset($response->message) && $response->message == 'Success') { + // 3. تخزين في Redis بدلاً من MySQL (أسرع وأكثر أماناً مع TTL تلقائي) + if ($redis) { + try { + $redis->setex("otp:passenger:$receiver", 300, $otp); // صلاحية 5 دقائق + jsonSuccess(null, "OTP sent and saved to Redis successfully"); + } catch (Exception $e) { + error_log("Redis Error (OTP): " . $e->getMessage()); + jsonError("OTP sent but failed to save in Redis"); + } + } else { + jsonError("Redis service unavailable"); + } +} else { + jsonError("OTP not sent (SMS API failed or invalid response)"); +} + +// دالة الاتصال بالـ API +function callAPI($method, $url, $data) { + + $curl = curl_init(); + curl_setopt_array($curl, [ + CURLOPT_URL => $url, + CURLOPT_RETURNTRANSFER => true, + CURLOPT_CUSTOMREQUEST => $method, + CURLOPT_POSTFIELDS => $data, + CURLOPT_HTTPHEADER => [ + "Content-Type: application/json", + "Accept: application/json" // Often good to add + ], + CURLOPT_TIMEOUT => 30, // Set a timeout + CURLOPT_CONNECTTIMEOUT => 10 // Set a connection timeout + ]); + $api_raw_response = curl_exec($curl); + + if (curl_errno($curl)) { + $curl_error_msg = curl_error($curl); + $curl_error_no = curl_errno($curl); + error_log("cURL Error (callAPI): [{$curl_error_no}] " . $curl_error_msg); + curl_close($curl); + return false; // Indicate cURL failure clearly + } + curl_close($curl); + + $decoded_response = json_decode($api_raw_response); + if (json_last_error() !== JSON_ERROR_NONE) { + return null; // Indicate JSON decode failure + } + error_log("callAPI: Decoded response: " . print_r($decoded_response, true)); + return $decoded_response; +} +?> +``` + +## File: auth/checkPhoneNumberISVerfiedDriver.php +``` +encryptData($phoneNumber); + +// تجهيز الاستعلام باستخدام bindParam للحماية +$sql = "SELECT * FROM `phone_verification` WHERE `phone_number` = :phone_number"; +$stmt = $con->prepare($sql); +$stmt->bindParam(":phone_number", $phoneNumber); +$stmt->execute(); + +if ($stmt->rowCount() > 0) { + $rows = $stmt->fetchAll(PDO::FETCH_ASSOC); + jsonSuccess($rows); +} else { + jsonError("No phone verified yet found"); +} +?> +``` + +## File: auth/verifyEmail.php +``` +prepare($sql); +$stmt->execute(); +$result = $stmt->fetch(); + +if ($result) { + $id = $result["id"]; + $sql = "UPDATE `email_verifications` SET `verified` = 1 WHERE `id` = $id"; + $stmt = $con->prepare($sql); + $stmt->execute(); + + $admin='support@sefer.com'; + $headers = "MIME-Version: 1.0" . "\r\n"; + $headers .= "Content-type: text/html; charset=UTF-8" . "\r\n"; + $headers .= "From: $admin" . "\r\n"; + + $subject = " Verify your email address"; + $bodyEmail="Subject: Verify your email address + +Hi [$email], + +Your email address has been verified. + +Thank you, +SEFER Team"; + + mail($email, $subject, $bodyEmail, $headers); + + jsonSuccess($message = "Your email address has been verified."); +} else { + jsonError($message ="Your email address could not be verified. Please try again."); +} +?> +``` + +## File: auth/loginFromGooglePassenger.php +``` +encryptData($email); + +// تجهيز الاستعلام +$sql = "SELECT + p.`id`, + p.`phone`, + p.`email`, + p.`gender`, + p.`status`, + p.`birthdate`, + p.`site`, + p.`first_name`, + p.`last_name`, + p.`sosPhone`, + p.`education`, + p.`employmentType`, + p.`maritalStatus`, + p.`created_at`, + p.`updated_at`, + phone_verification_passenger.verified, + invitesToPassengers.isInstall, + invitesToPassengers.inviteCode, + invitesToPassengers.isGiftToken, + (SELECT `version` FROM `packageInfo` WHERE platform = :platform AND appName = :appName) AS package, + promos.promo_code AS promo, + promos.amount AS discount, + promos.validity_end_date AS validity +FROM passengers p +LEFT JOIN phone_verification_passenger + ON phone_verification_passenger.phone_number = p.phone +LEFT JOIN invitesToPassengers + ON invitesToPassengers.inviterPassengerPhone = p.phone +LEFT JOIN promos + ON promos.passengerID = p.id +WHERE p.email = :email AND p.id = :id AND phone_verification_passenger.verified = '1'"; + +// تنفيذ الاستعلام +$stmt = $con->prepare($sql); +$stmt->bindParam(':email', $email); +$stmt->bindParam(':id', $id); +$stmt->bindParam(':appName', $appName); +$stmt->bindParam(':platform', $platform); +$stmt->execute(); + +$data = $stmt->fetchAll(PDO::FETCH_ASSOC); +$count = $stmt->rowCount(); + +// تجهيز الرد +header('Content-Type: application/json'); + +if ($count > 0) { + foreach ($data as &$row) { + // فك تشفير الحقول الحساسة + $row['phone'] = $encryptionHelper->decryptData($row['phone']); + $row['email'] = $encryptionHelper->decryptData($row['email']); + $row['gender'] = $encryptionHelper->decryptData($row['gender']); + $row['birthdate'] = $encryptionHelper->decryptData($row['birthdate']); + $row['site'] = $encryptionHelper->decryptData($row['site']); + $row['first_name'] = $encryptionHelper->decryptData($row['first_name']); + $row['last_name'] = $encryptionHelper->decryptData($row['last_name']); + $row['sosPhone'] = $encryptionHelper->decryptData($row['sosPhone']); + $row['education'] = $encryptionHelper->decryptData($row['education']); + $row['employmentType'] = $encryptionHelper->decryptData($row['employmentType']); + $row['maritalStatus'] = $encryptionHelper->decryptData($row['maritalStatus']); + } + + echo json_encode([ + "status" => "success", + "count" => $count, + "data" => $data + ]); +} else { + error_log("User does not exist: " . $email); + echo json_encode([ + "status" => "Failure", + "data" => "User does not exist." + ]); +} + +// تنظيف الموارد +$stmt = null; +$con = null; +exit(); +``` + +## File: auth/syria/verifyOtp.php +``` +encryptData($phoneNumber); +error_log("[Auth_Debug] Phone number encrypted successfully."); + +try { + // ✅ 1. حذف أي رموز قديمة لنفس الرقم + error_log("[Auth_Step_1] Deleting old verification records for this phone..."); + + $stmtDelete = $con->prepare("DELETE FROM phone_verification_passenger WHERE phone_number = ?"); + $stmtDelete->execute([$phoneNumber_encrypted]); + + error_log("[Auth_Step_1] Old records deleted (if any)."); + + // ✅ 2. إدخال سجل جديد مع تحقق مباشر (بدون OTP) + $now = date('Y-m-d H:i:s'); + error_log("[Auth_Step_2] Inserting new verified record at: " . $now); + + $stmt = $con->prepare(" + INSERT INTO phone_verification_passenger (phone_number, token, expiration_time, verified, created_at) + VALUES (?, NULL, NULL, 1, ?) + "); + $stmt->execute([$phoneNumber_encrypted, $now]); + + error_log("[Auth_Step_2] New record inserted successfully."); + + // ✅ 3. فحص هل الراكب موجود مسبقاً + error_log("[Auth_Step_3] Checking if passenger exists in passengers table..."); + + $checkPassengerStmt = $con->prepare(" + SELECT * FROM passengers WHERE phone = ? + "); + $checkPassengerStmt->execute([$phoneNumber_encrypted]); + $passenger = $checkPassengerStmt->fetch(PDO::FETCH_ASSOC); + + if ($passenger) { + // ✅ الراكب موجود + error_log("[Auth_Result] Passenger Found. ID: " . $passenger['id']); + + printSuccess([ + "message" => "Passenger already registered.", + "isRegistered" => true, + "passenger" => [ + "id" => $passenger['id'], + "first_name" => $encryptionHelper->decryptData($passenger['first_name']), + "last_name" => $encryptionHelper->decryptData($passenger['last_name']), + "email" => $encryptionHelper->decryptData($passenger['email']), + "phone" => $phoneNumber + ] + ]); + } else { + // ✅ الراكب جديد + error_log("[Auth_Result] Passenger Not Found. Treating as new user."); + + printSuccess([ + "message" => "Phone number verified automatically (no OTP required).", + "isRegistered" => false + ]); + } + +} catch (PDOException $e) { + // تسجيل الخطأ بالتفصيل في ملف اللوج + error_log("[Auth_DB_Exception] Error: " . $e->getMessage() . " | File: " . $e->getFile() . " | Line: " . $e->getLine()); + + // طباعة رسالة الخطأ للمستخدم (يفضل عدم إظهار تفاصيل الـ SQL للمستخدم النهائي لأسباب أمنية) + jsonError("Database error occurred. Please contact support."); +} catch (Exception $e) { + // التقاط أي أخطاء عامة أخرى + error_log("[Auth_General_Exception] Error: " . $e->getMessage()); + jsonError("An unexpected error occurred."); +} + +// تسجيل نهاية الطلب +error_log("[Auth_Debug] Request processing finished."); + +?> +``` + +## File: auth/syria/send_survey.php +``` + "buttons", + "header" => [ + "type" => "text", + "text" => "استطلاع رأي سريع 🌟" + ], + "body" => [ + "text" => "هل كانت تجربة التسجيل في تطبيق *انطلق* سهلة بالنسبة لك؟\n\n👇 اضغط أحد الخيارات:" + ], + "footer" => [ + "text" => "للتواصل: +962 7XXXXXXX - رابط التطبيق: https://intaleq.xyz" + ], + "buttons" => [ + [ + "type" => "reply", + "reply" => [ + "id" => "feedback_yes", + "title" => "👍 نعم" + ] + ], + [ + "type" => "reply", + "reply" => [ + "id" => "feedback_no", + "title" => "👎 لا" + ] + ] + ] +]; + +// استدعاء الدالة لإرسال الرسالة +$response = sendWhatsAppFromServer($receiver, $surveyMessage); +if ($response && isset($response["status"]) && $response["status"] === "sent") { + jsonSuccess(null, "تم إرسال استطلاع الرأي بنجاح بعد $delay ثانية."); +} else { + jsonError("فشل في إرسال استطلاع الرأي"); +} +?> +``` + +## File: auth/syria/secure_image.php +``` +file($path) ?: 'application/octet-stream'; + +header('Content-Type: ' . $mime); +header('Content-Length: ' . filesize($path)); +header('X-Content-Type-Options: nosniff'); +// (اختياري) اطلب توكن وصول إضافي عبر Authorization للتحكم الأدق. +// مثال: تحقق من $_SERVER['HTTP_AUTHORIZATION'] هنا إن أردت. +readfile($path); +``` + +## File: auth/syria/register_passenger.php +``` +encryptData($phoneNumber); + $firstName_encrypted = $encryptionHelper->encryptData($firstName); + $lastName_encrypted = $encryptionHelper->encryptData($lastName); + $email_encrypted = $encryptionHelper->encryptData($email); + $password_hashed = password_hash($email, PASSWORD_DEFAULT); + $unknown_encrypted = $encryptionHelper->encryptData("unknown yet"); + + // ====================================================== + // Step 5: إنشاء ID فريد + // ====================================================== + $step = 5; + // $uniqueId = substr(md5(uniqid(mt_rand(), true)), 0, 20); + + $uniqueId = substr(md5($phoneNumber_encrypted), 0, 20); + + error_log("$logTag Step 5: Generated Unique ID: $uniqueId"); + + // ====================================================== + // Step 6: التحقق من وجود المستخدم (Database Check) + // ====================================================== + $step = 6; + $checkStmt = $con->prepare("SELECT id FROM passengers WHERE phone = ?"); + $checkStmt->execute([$phoneNumber_encrypted]); + + if ($checkStmt->rowCount() > 0) { + error_log("$logTag Step 6 Error: User already exists."); + jsonError("User with this phone number or email already exists."); + exit(); + } + + // ====================================================== + // Step 7: الإضافة (Insert User) + // ====================================================== + $step = 7; + error_log("$logTag Step 7: Inserting into passengers table..."); + + $insertStmt = $con->prepare(" + INSERT INTO passengers (id, first_name, last_name, email, phone, password, gender, birthdate, site, sosPhone, education, employmentType, maritalStatus, status, created_at, updated_at) + VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, 'active', NOW(), NOW()) + "); + $success = $insertStmt->execute([ + $uniqueId, + $firstName_encrypted, + $lastName_encrypted, + $email_encrypted, + $phoneNumber_encrypted, + $password_hashed, + $unknown_encrypted, + $unknown_encrypted, + $unknown_encrypted, + $unknown_encrypted, + $unknown_encrypted, + $unknown_encrypted, + $unknown_encrypted + ]); + + if (!$success) { + $errorInfo = $insertStmt->errorInfo(); + // طباعة تفاصيل خطأ الـ SQL في اللوج + error_log("$logTag Step 7 Error: SQL Insert Failed. Details: " . json_encode($errorInfo)); + jsonError("Failed to create user account."); + exit(); + } + + + // ====================================================== + // Step 9: جلب البيانات لإعادتها + // ====================================================== + $step = 9; + $userStmt = $con->prepare("SELECT * FROM passengers WHERE id = ?"); + $userStmt->execute([$uniqueId]); + $newUser = $userStmt->fetch(PDO::FETCH_ASSOC); + + // ====================================================== + // Step 10: فك التشفير وإرسال الرد + // ====================================================== + $step = 10; + if ($newUser) { + unset($newUser['password']); + foreach ($newUser as $key => &$value) { + if ($key !== 'id' && $key !== 'status' && $key !== 'created_at' && $key !== 'updated_at' && !is_null($value)) { + $value = $encryptionHelper->decryptData($value); + } + } + } + + error_log("$logTag Success: User registered successfully."); + jsonSuccess(["status" => "registration_success", "data" => $newUser]); + +} catch (PDOException $e) { + // طباعة خطأ قاعدة البيانات في اللوج + error_log("$logTag PDO Exception at Step $step: " . $e->getMessage()); + jsonError("Database Error."); +} catch (Exception $e) { + // طباعة الأخطاء العامة في اللوج + error_log("$logTag General Exception at Step $step: " . $e->getMessage()); + jsonError("General Error."); +} +?> +``` + +## File: auth/syria/uploadSyrianDocs.php +``` + MAX_FILE_MB * 1024 * 1024) { + jsonError("File too large. Max " . MAX_FILE_MB . " MB."); exit; +} + +// MIME دقيق +$finfo = new finfo(FILEINFO_MIME_TYPE); +$mime = $finfo->file($tmpPath) ?: 'application/octet-stream'; +if (!in_array($mime, ALLOWED_MIMES, true)) { + jsonError("Unsupported file type: $mime"); exit; +} + +// لاحقة الامتداد +$extMap = [ + 'image/jpeg' => '.jpg', + 'image/png' => '.png', + 'image/webp' => '.webp', +]; +$ext = $extMap[$mime]; + +// --------- توليد مسار حتمي بدون تاريخ --------- +// تنظيف driver_id لاسم ملف آمن +$driverIdSafe = preg_replace('/[^A-Za-z0-9_\-]/', '_', $driverId); +// شجرة مجلدات ثابتة من hash(driver_id) لتوزيع الملفات +$h = hash('sha1', $driverIdSafe); +$subdir = substr($h, 0, 2) . '/' . substr($h, 2, 2); +$destDir = UPLOAD_ROOT . '/' . $subdir; +if (!is_dir($destDir)) { @mkdir($destDir, 0700, true); } + +// الاسم النهائي بدون تاريخ +$serverName = "{$driverIdSafe}__{$docType}{$ext}"; +$destPath = $destDir . '/' . $serverName; + +// استبدال أي نسخة قديمة عن قصد (overwrite) +if (is_file($destPath)) { @unlink($destPath); } + +// نقل الملف +if (!move_uploaded_file($tmpPath, $destPath)) { + jsonError("Failed to save the uploaded file."); + exit; +} +@chmod($destPath, 0600); + +// --------- Signed URL --------- +// سنضمّن driver_id و doc_type و ext في الرابط والتوقيع. +// ext بدون النقطة +$extShort = ltrim($ext, '.'); +$expires = time() + SIGNED_TTL_SEC; + +// الرسالة الموقّعة: driver_id:doc_type:ext:expires +$message = $driverIdSafe . ':' . $docType . ':' . $extShort . ':' . $expires; +$signature = hash_hmac('sha256', $message, SIGN_SECRET); + +// رابط القراءة عبر البوابة الآمنة فقط +// ملاحظة: لا نُرجع المسار الحقيقي، فقط معطيات موقّعة +$fileUrl = PUBLIC_BASE . "/secure_image.php" + . "?driver_id={$driverIdSafe}" + . "&doc_type={$docType}" + . "&ext={$extShort}" + . "&expires={$expires}" + . "&signature={$signature}"; + +// --------- استجابة --------- +printSuccess([ + "status" => "success", + "success_file" => true, + "file_url" => $fileUrl, + "file_name" => $serverName, // الاسم الفعلي المحفوظ + "driver_id" => $driverIdSafe, + "doc_type" => $docType, + "mime_type" => $mime, + "size_bytes" => $size, + "expires_at" => date('c', $expires) +]); +``` + +## File: auth/syria/delete_old_images.php +``` +isFile()) continue; + $checked++; + + $path = $node->getPathname(); + $ext = strtolower($node->getExtension()); + + // فلترة الامتدادات + if (!in_array($ext, ALLOWED_EXTS, true)) continue; + + // فلترة اسم الملف (حماية من حذف ملفات أخرى) + $name = $node->getBasename(); + if (!preg_match('/^[A-Za-z0-9_-]+__(' . $docTypesRegex . ')\.(jpg|png|webp)$/i', $name)) { + continue; + } + + $age = $now - $node->getMTime(); + if ($age >= $ttlSeconds) { + if (@unlink($path)) { + $deleted++; + $logln("🗑 Deleted: {$path} | age=" . round($age/3600, 1) . "h"); + } else { + $logln("⚠️ Failed to delete: {$path}"); + } + } +} + +$logln("Done. checked={$checked}, deleted={$deleted}"); +if ($log) @fclose($log); +``` + +## File: auth/syria/sendWhatsOpt.php +``` +encryptData($raw); + $enc_norm = $encryptionHelper->encryptData($norm); + + $sql = "SELECT 1 + FROM passenger_blacklist + WHERE phone IN (:enc_raw, :enc_norm) + AND (expires_at IS NULL OR expires_at > NOW()) + LIMIT 1"; + + $q = $con->prepare($sql); + $q->execute([ + 'enc_raw' => $enc_raw, + 'enc_norm' => $enc_norm, + ]); + + return (bool)$q->fetchColumn(); +} + +/* 0) Get phone number */ +$receiver = filterRequest("receiver"); +if (!$receiver) { + jsonError('Phone number is required.'); + exit(); +} + +if (is_blacklisted($con, $encryptionHelper, $receiver)) { + jsonError('This phone is blacklisted and cannot receive OTP.'); + error_log("[send_otp] BLOCKED (blacklisted): $receiver"); + exit(); +} + +/* 1) Generate OTP */ +$otp = rand(10000, 99999); +$messageBody = "Your verification code for Intaleq is: " . $otp; + +/* 🟢 2) Skip sending and log instead */ +error_log("[send_otp] Skipping actual send. OTP generated for $receiver: $otp"); + +/* 3) Save OTP (encrypted) */ +$receiver_enc = $encryptionHelper->encryptData($receiver); +$otp_enc = $encryptionHelper->encryptData($otp); + +$exp = date('Y-m-d H:i:s', strtotime('+5 minutes')); +$now = date('Y-m-d H:i:s'); + +try { + $con->prepare("DELETE FROM phone_verification_passenger WHERE phone_number = ?") + ->execute([$receiver_enc]); + + $stmt = $con->prepare(" + INSERT INTO phone_verification_passenger + (phone_number, token, expiration_time, verified, created_at) + VALUES (?, ?, ?, 0, ?) + "); + $stmt->execute([$receiver_enc, $otp_enc, $exp, $now]); + + jsonSuccess(null, 'OTP generated and saved successfully (no message sent)'); + error_log("[send_otp] OTP saved successfully for $receiver"); + +} catch (PDOException $e) { + error_log("[send_otp] DB error: ".$e->getMessage()); + jsonError('OTP generated but failed to save to database'); +} + +/* +require_once __DIR__ . '/../../connect.php'; + +error_log("--- [send_otp.php] Started ---"); + + +function normalize_phone($s) { return preg_replace('/\D+/', '', (string)$s); } + + +function is_blacklisted(PDO $con, $encryptionHelper, string $phone): bool { + $raw = trim($phone); + $norm = normalize_phone($raw); + + // شَفِّر قبل السؤال + $enc_raw = $encryptionHelper->encryptData($raw); + $enc_norm = $encryptionHelper->encryptData($norm); + + $sql = "SELECT 1 + FROM passenger_blacklist + WHERE phone IN (:enc_raw, :enc_norm) + AND (expires_at IS NULL OR expires_at > NOW()) + LIMIT 1"; + + $q = $con->prepare($sql); + $q->execute([ + 'enc_raw' => $enc_raw, + 'enc_norm' => $enc_norm, + ]); + + return (bool)$q->fetchColumn(); +} + +$receiver = filterRequest("receiver"); +if (!$receiver) { jsonError('Phone number is required.'); exit(); } + +if (is_blacklisted($con, $encryptionHelper, $receiver)) { + jsonError('This phone is blacklisted and cannot receive OTP.'); + error_log("[send_otp] BLOCKED (blacklisted): $receiver"); + exit(); +} + +$otp = rand(10000, 99999); +$messageBody = "Your verification code for Intaleq is: " . $otp; + +function normalize($raw) { + if (is_string($raw)) return json_decode($raw, true) ?: []; + if ($raw instanceof stdClass) return (array)$raw; + return is_array($raw) ? $raw : []; +} + +$response = normalize(sendWhatsAppFromServer($receiver, $messageBody)); +$sentOK = $response['success'] ?? false; + +if (!$sentOK) { + error_log("[send_otp] WA-Server failed ⇒ ".(($response['message'] ?? null) ?: json_encode($response))); + + $payload = [ + "number" => $receiver, + "type" => "text", + "message" => $messageBody, + "instance_id" => getenv("RASEEL_DRIVER_INSTANCE_ID"), + "access_token" => getenv("RASEEL_DRIVER_ACCESS_TOKEN") + ]; + $response = callAPI("POST", "https://raseelplus.com/api/send", json_encode($payload)); + $response = normalize($response); + + $sentOK = ($response['status'] ?? '') === 'success'; + if (!$sentOK) { + error_log("[send_otp] RaseelPlus failed ⇒ ".json_encode($response)); + jsonError('Failed to send OTP: '.($response['message'] ?? 'Unknown error')); + exit(); + } +} + +$receiver_enc = $encryptionHelper->encryptData($receiver); // الهاتف المُرسل (خام) مُشفّر +$otp_enc = $encryptionHelper->encryptData($otp); + +$exp = date('Y-m-d H:i:s', strtotime('+5 minutes')); +$now = date('Y-m-d H:i:s'); + +try { + $con->prepare("DELETE FROM phone_verification_passenger WHERE phone_number = ?") + ->execute([$receiver_enc]); + + $stmt = $con->prepare(" + INSERT INTO phone_verification_passenger + (phone_number, token, expiration_time, verified, created_at) + VALUES (?, ?, ?, 0, ?) + "); + $stmt->execute([$receiver_enc, $otp_enc, $exp, $now]); + + jsonSuccess(null, 'OTP sent and saved successfully'); + error_log("[send_otp] OTP saved for $receiver"); + +} catch (PDOException $e) { + error_log("[send_otp] DB error: ".$e->getMessage()); + jsonError('OTP sent but failed to save to database'); +} + +function callAPI($method, $url, $data) { + $ch = curl_init(); + curl_setopt_array($ch, [ + CURLOPT_URL => $url, + CURLOPT_RETURNTRANSFER => true, + CURLOPT_CUSTOMREQUEST => $method, + CURLOPT_POSTFIELDS => $data, + CURLOPT_HTTPHEADER => [ + "Content-Type: application/json", + "Accept: application/json" + ], + ]); + $body = curl_exec($ch); + $err = curl_error($ch); + curl_close($ch); + return $err ? [] : json_decode($body, true); +} +*/ + +``` + +## File: auth/syria/auth_proxy.php +``` +setClientId($clientID); +$client->setClientSecret($clientSecret); +$client->setRedirectUri($redirectUri); +$client->addScope("email"); +$client->addScope("profile"); + +// 4. LOGIC: Handle the authentication flow +if (isset($_GET['code'])) { + // A. User has been redirected back from Google with an authorization code. + try { + // Exchange the authorization code for an access token. + $token = $client->fetchAccessTokenWithAuthCode($_GET['code']); + + if (isset($token['error'])) { + // Handle error from Google + throw new Exception('Error fetching access token: ' . $token['error_description']); + } + + $client->setAccessToken($token['access_token']); + + // Get user profile information from Google. + $google_oauth = new Google_Service_Oauth2($client); + $google_account_info = $google_oauth->userinfo->get(); + + $id = $google_account_info->id; + $email = $google_account_info->email; + $name = $google_account_info->name; + $picture = $google_account_info->picture; + + // B. Redirect back to the Flutter app with the user data in the URL. + // We use urlencode to ensure data is passed correctly. + $redirectUrl = $appRedirectScheme . + '?status=success' . + '&id=' . urlencode($id) . + '&email=' . urlencode($email) . + '&name=' . urlencode($name) . + '&picture=' . urlencode($picture); + + header('Location: ' . $redirectUrl); + exit(); + + } catch (Exception $e) { + // C. Handle any errors and redirect back to the app with an error status. + $error_message = urlencode($e->getMessage()); + header('Location: ' . $appRedirectScheme . '?status=error&message=' . $error_message); + exit(); + } +} else { + // D. This is the initial request from the Flutter app. + // Redirect the user to Google's OAuth 2.0 server for authentication. + $authUrl = $client->createAuthUrl(); + header('Location: ' . $authUrl); + exit(); +} +?> + +``` + +## File: auth/syria/driver/isPhoneVerified.php +``` +encryptData($phoneNumber); + +try { + // الاستعلام عن السائق حسب رقم الهاتف وحالة التحقق + $stmt = $con->prepare(" + SELECT * FROM phone_verification + WHERE phone_number = ? AND is_verified = 1 + "); + $stmt->execute([$phoneNumber_encrypted]); + $driver = $stmt->fetch(PDO::FETCH_ASSOC); + + if ($driver) { + jsonSuccess(null, "Phone number is verified."); + } else { + jsonError("Phone number is not verified or does not exist."); + } + +} catch (PDOException $e) { + jsonError("Database error: " . $e->getMessage()); +} +``` + +## File: auth/syria/driver/verifyOtp.php +``` +encryptData($phoneNumber); +$email_encrypted = $encryptionHelper->encryptData($email); + +try { + // 🧹 حذف أي رموز قديمة لنفس الرقم + $con->prepare("DELETE FROM phone_verification WHERE phone_number = ?") + ->execute([$phoneNumber_encrypted]); + + // 🧾 توليد driverID فريد + $raw = $phoneNumber; + $driverID = substr(md5($raw), 2, 20); + + // 🔐 توليد رمز تجريبي (بدون OTP حقيقي لتجنب Null) + $dummyToken = $encryptionHelper->encryptData('AUTO'); + + // 🕒 الوقت الحالي + $now = date('Y-m-d H:i:s'); + + // ✅ إدخال سجل تحقق مباشر + $stmt = $con->prepare(" + INSERT INTO phone_verification + (phone_number, token_code, email, driverId, expiration_time, is_verified, created_at) + VALUES (?, ?, ?, ?, NULL, 1, ?) + "); + $stmt->execute([$phoneNumber_encrypted, $dummyToken, $email_encrypted, $driverID, $now]); + + error_log("✅ [verifyOtp.php] Auto verification record inserted successfully for $phoneNumber"); + + // 🔍 التحقق إذا السائق موجود مسبقاً + $checkDriverStmt = $con->prepare("SELECT * FROM driver WHERE phone = ?"); + $checkDriverStmt->execute([$phoneNumber_encrypted]); + $driver = $checkDriverStmt->fetch(PDO::FETCH_ASSOC); + + if ($driver) { + error_log("👤 [verifyOtp.php] Driver already registered. Returning driver info."); + printSuccess([ + "message" => "Driver already registered.", + "isRegistered" => true, + "driver" => [ + "id" => $driver['id'], + "first_name" => $encryptionHelper->decryptData($driver['first_name']), + "last_name" => $encryptionHelper->decryptData($driver['last_name']), + "email" => $encryptionHelper->decryptData($driver['email']), + "phone" => $phoneNumber + ] + ]); + } else { + error_log("🆕 [verifyOtp.php] Phone verified automatically. Driver not found."); + printSuccess([ + "message" => "Phone number verified automatically (no OTP required).", + "isRegistered" => false, + "driverID" => $driverID + ]); + } + +} catch (PDOException $e) { + error_log("💥 [verifyOtp.php] PDO ERROR: " . $e->getMessage()); + jsonError("Database error: " . $e->getMessage()); +} +?> + +``` + +## File: auth/syria/driver/driver_details.php +``` +prepare($sql); + $stmt->execute([':id' => $driverId]); + $driver = $stmt->fetch(PDO::FETCH_ASSOC); + + if (!$driver) { + jsonError("Driver not found."); + exit; + } + + // فك التشفير للحقول الحساسة + foreach ($driver as $k => $v) { + if (in_array($k, ['phone', + 'email', + 'first_name', + 'last_name', + 'national_number', + 'address','gender','site', + 'birthdate', + 'name_arabic'])) { + $driver[$k] = $encryptionHelper->decryptData($v); + } + } + + // الوثائق + $sql2 = "SELECT doc_type, image_name, link FROM driver_documents WHERE driverID = :id"; + $stmt2 = $con->prepare($sql2); + $stmt2->execute([':id' => $driverId]); + $docs = $stmt2->fetchAll(PDO::FETCH_ASSOC); + + printSuccess([ + "driver" => $driver, + "documents" => $docs + ]); +} catch (PDOException $e) { + jsonError("Error: " . $e->getMessage()); +} +``` + +## File: auth/syria/driver/register_driver_and_car_signed.php +``` +encryptData($data[$f]); + } + } + // حساسات السيارة + $car['vin'] = $encryptionHelper->encryptData($car['vin']); + $car['car_plate'] = $encryptionHelper->encryptData($car['car_plate']); + $car['owner'] = $encryptionHelper->encryptData($car['owner']); + + /* ========== 4) هَش كلمة المرور ========== */ + $pwdHashed = password_hash(filterRequest('password'), PASSWORD_DEFAULT); + + /* ========== 5) بدء معاملة ========== */ + $con->beginTransaction(); + + /* ========== 6) فحص تكرار هاتف/ايميل (المشفّرين) ========== */ + $dup = $con->prepare("SELECT id FROM driver WHERE phone = :p OR email = :e"); + $dup->execute([':p' => $data['phone'], ':e' => $data['email']]); + if ($dup->rowCount() > 0) { + $con->rollBack(); + jsonError("Phone or email already registered."); + exit; + } + + /* ========== 7) إدراج السائق ========== */ + $sqlDriver = " + INSERT INTO driver ( + id, phone, email, password, gender, license_type, national_number, + name_arabic, issue_date, expiry_date, license_categories, + address, licenseIssueDate, status, birthdate, site, + first_name, last_name, accountBank, bankCode, + employmentType, maritalStatus, fullNameMaritial, expirationDate, + created_at, updated_at + ) VALUES ( + :id, :phone, :email, :pwd, :gender, :license_type, :national_number, + :name_arabic, :issue_date, :expiry_date, :license_categories, + :address, :licenseIssueDate, :status, :birthdate, :site, + :first_name, :last_name, :accountBank, :bankCode, + :employmentType, :maritalStatus, :fullNameMaritial, :expirationDate, + NOW(), NOW() + ) + "; + $insD = $con->prepare($sqlDriver); + $okD = $insD->execute([ + ':id' => $driverID, + ':phone' => $data['phone'], + ':email' => $data['email'], + ':pwd' => $pwdHashed, + ':gender' => $data['gender'], + ':license_type' => $data['license_type'], + ':national_number' => $data['national_number'], + ':name_arabic' => $data['name_arabic'], + ':issue_date' => $data['issue_date'], + ':expiry_date' => $data['expiry_date'], + ':license_categories'=> !empty($data['license_categories']) ? $data['license_categories'] : 'B', + ':address' => $data['address'], + ':licenseIssueDate' => $data['licenseIssueDate'], + ':status' => !empty($data['status']) ? $data['status'] : 'yet', + ':birthdate' => $data['birthdate'], + ':site' => $data['site'], + ':first_name' => $data['first_name'], + ':last_name' => $data['last_name'], + ':accountBank' => 'yet', + ':bankCode' => 'yet', + ':employmentType' => !empty($data['employmentType']) ? $data['employmentType'] : 'yet', + ':maritalStatus' => !empty($data['maritalStatus']) ? $data['maritalStatus'] : 'yet', + ':fullNameMaritial' => !empty($data['fullNameMaritial']) ? $data['fullNameMaritial'] : 'yet', + ':expirationDate' => !empty($data['expirationDate']) ? $data['expirationDate'] : 'yet', + ]); + if (!$okD) { $con->rollBack(); jsonError("Failed to insert driver."); exit; } + + /* ========== 8) إدراج السيارة ========== */ + $hasCar = $con->prepare("SELECT 1 FROM CarRegistration WHERE driverID = :d LIMIT 1"); + $hasCar->execute([':d' => $driverID]); + $isDefault = $hasCar->rowCount() === 0 ? 1 : 0; + + $sqlCar = " + INSERT INTO CarRegistration ( + driverID, vin, car_plate, make, model, year, expiration_date, + color, owner, color_hex, fuel, isDefault, created_at, status + ) VALUES ( + :driverID, :vin, :car_plate, :make, :model, :year, :expiration_date, + :color, :owner, :color_hex, :fuel, :isDefault, NOW(), 'yet' + ) + "; + $insC = $con->prepare($sqlCar); + $okC = $insC->execute([ + ':driverID' => $driverID, + ':vin' => $car['vin'], + ':car_plate' => $car['car_plate'], + ':make' => $car['make'], + ':model' => $car['model'], + ':year' => $car['year'], + ':expiration_date' => $car['expiration_date'], + ':color' => $car['color'], + ':owner' => $car['owner'], + ':color_hex' => $car['color_hex'], + ':fuel' => $car['fuel'], + ':isDefault' => $isDefault, + ]); + if (!$okC) { $con->rollBack(); jsonError("Failed to insert car registration."); exit; } + + $carRegID = $con->lastInsertId(); + + /* ========== 9) التحقّق من الروابط الموقّعة وحفظها ========== */ + + // دالة مساعدة تتحقّق من شكل الرابط وتستخرج doc_type/ext + $validateSignedUrl = function(string $url) use ($allowedDocTypes, $allowedExts) { + $parts = parse_url($url); + if (!$parts || empty($parts['scheme']) || empty($parts['host']) || empty($parts['path'])) { + throw new Exception("Invalid URL format."); + } + if (!in_array($parts['host'], $ALLOWED_SIGNED_HOSTS, true)) { + throw new Exception("URL host not allowed: {$parts['host']}"); + } + if (stripos($parts['path'], 'secure_image.php') === false) { + throw new Exception("URL path not allowed."); + } + if (empty($parts['query'])) { + throw new Exception("URL missing query string."); + } + parse_str($parts['query'], $q); + foreach (['driver_id','doc_type','ext','expires','signature'] as $k) { + if (empty($q[$k])) throw new Exception("URL missing param: $k"); + } + if (!in_array($q['doc_type'], $allowedDocTypes, true)) { + throw new Exception("Invalid doc_type in URL."); + } + if (!in_array(strtolower($q['ext']), $allowedExts, true)) { + throw new Exception("Invalid ext in URL."); + } + return [ + 'doc_type' => $q['doc_type'], + 'ext' => strtolower($q['ext']), + // بإمكانك التحقق من driver_id = $driverID إذا تحب تربطهما + 'driver_id_in_url' => $q['driver_id'], + ]; + }; + + $docsToInsert = []; // [['doc_type'=>..., 'link'=>..., 'image_name'=>...], ...] + foreach ($docUrlKeys as $k) { + $link = $docUrls[$k]; + $meta = $validateSignedUrl($link); + // image_name ليس ضروريًا هنا (الرابط موقّع إلى بوابة قراءة)، احفظ doc_type + link فقط + $docsToInsert[] = [ + 'doc_type' => $meta['doc_type'], // يجب أن يتطابق مع $k منطقيًا + 'link' => $link, + 'image_name' => $meta['doc_type'] . '.' . $meta['ext'], // اسماً رمزياً فقط + ]; + } + + // إدراج في driver_documents + // CREATE TABLE driver_documents ( + // id INT AUTO_INCREMENT PRIMARY KEY, + // driverID VARCHAR(64) NOT NULL, + // doc_type VARCHAR(64) NOT NULL, + // image_name VARCHAR(255) NULL, + // link VARCHAR(1024) NOT NULL, + // upload_date DATETIME NOT NULL, + // INDEX(driverID) + // ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4; + $insDoc = $con->prepare(" + INSERT INTO driver_documents (driverID, doc_type, image_name, link, upload_date) + VALUES (:driverID, :doc_type, :image_name, :link, NOW()) + "); + foreach ($docsToInsert as $row) { + $insDoc->execute([ + ':driverID' => $driverID, + ':doc_type' => $row['doc_type'], + ':image_name' => $row['image_name'], + ':link' => $row['link'], + ]); + } + + /* ========== 10) إنهاء المعاملة ========== */ + $con->commit(); + + printSuccess([ + 'driverID' => $driverID, + 'carRegID' => $carRegID, + 'documents' => [ + 'driver_license_front_url' => $docUrls['driver_license_front_url'], + 'driver_license_back_url' => $docUrls['driver_license_back_url'], + 'car_license_front_url' => $docUrls['car_license_front_url'], + 'car_license_back_url' => $docUrls['car_license_back_url'], + ] + ]); + +} catch (Exception $e) { + if (isset($con) && $con->inTransaction()) { $con->rollBack(); } + error_log("register_driver_and_car ERROR: " . $e->getMessage()); + jsonError("Server error: " . $e->getMessage()); +} catch (PDOException $e) { + if (isset($con) && $con->inTransaction()) { $con->rollBack(); } + error_log("register_driver_and_car PDO: " . $e->getMessage()); + jsonError("Database error."); +} +``` + +## File: auth/syria/driver/register_driver_and_car.php +``` + 3) { + if (strpos($phone, '9639') !== 0) { + $phone = '9639' . substr($phone, 3); + } + } + + $data['phone'] = $phone; + } + /* ================== 🔴 END PHONE FORMATTING LOGIC 🔴 ================== */ + + + // تجهيز تاريخ الميلاد قبل التشفير + if (!empty($data['birthdate'])) { + $data['birthdate'] = trim($data['birthdate']); + $data['birthdate'] = $data['birthdate'] . '-01-01'; + } else { + $data['birthdate'] = '1970-01-01'; + } + + // Read car fields + $car = []; + foreach ($carRequired as $f) { + $v = filterRequest($f); + if ($v === null || $v === '') { + jsonError("Missing required field: $f"); + exit; + } + $car[$f] = $v; + } + + // Read document links + $docUrls = []; + foreach ($docKeys as $k) { + $u = filterRequest($k); + if ($u === null || $u === '') { + jsonError("Missing document URL: $k"); + exit; + } + if (!filter_var($u, FILTER_VALIDATE_URL)) { + jsonError("Invalid document URL: $k"); + exit; + } + $docUrls[$k] = $u; + } + + /* ================== 2) Generate default id/email ================== */ + if (empty($data['id'])) { + $data['id'] = 'DRV' . date('YmdHis') . random_int(1000, 9999); + } + if ($data['email'] === null) { + $data['email'] = $data['phone'] . '@intaleqapp.com'; + } + + /* ================== 3) Encrypt sensitive fields ================== */ + $toEncryptDriver = [ + "phone","email","first_name","last_name","name_arabic","gender", + "national_number","address","site","fullNameMaritial","birthdate" + ]; + + foreach ($toEncryptDriver as $f) { + if (!empty($data[$f])) { + $data[$f] = $encryptionHelper->encryptData($data[$f]); + } + } + + // Encrypt car sensitive data + $car['vin'] = $encryptionHelper->encryptData($car['vin']); + $car['car_plate'] = $encryptionHelper->encryptData($car['car_plate']); + $car['owner'] = $encryptionHelper->encryptData($car['owner']); + + /* ================== 4) Hash password (HMAC + password_hash) ================== */ + +// نقرأ الـ HMAC key من env +$pepper = getenv('SECRET_KEY_HMAC'); + +// نبني baseString من أكثر من بارامتر +// هنا نستخدم id + phone (بعد ما طبّقنا منطق تنسيق الهاتف) +$baseParts = [ + $data['id'], + $data['phone'], +]; + +// نضيف رقم وطني أو سنة الميلاد إن توفروا (كما في الـ migration) +if (!empty($data['national_number'])) { + $baseParts[] = $data['national_number']; +} elseif (!empty($data['birthdate'])) { + // birthdate حالياً أصبح بصيغة YYYY-01-01 + $year = substr($data['birthdate'], 0, 4); + if (preg_match('/^\d{4}$/', $year)) { + $baseParts[] = $year; + } +} + +$baseString = implode('|', $baseParts); + +// نشتق السر الخام باستخدام HMAC-SHA256 مع SECRET_KEY_HMAC +$rawSecret = hash_hmac('sha256', $baseString, $pepper, true); + +// نخزّن فقط الهاش الناتج من password_hash في قاعدة البيانات +$pwdHashed = password_hash($rawSecret, PASSWORD_DEFAULT); + + /* ================== 5) Start transaction ================== */ + $con->beginTransaction(); + + /* ================== 6) Check duplicate ================== */ + $dup = $con->prepare("SELECT id FROM driver WHERE phone = :p OR email = :e"); + $dup->execute([':p' => $data['phone'], ':e' => $data['email']]); + if ($dup->rowCount() > 0) { + $con->rollBack(); + jsonError("Phone or email already registered."); + exit; + } + + /* ================== 7) Insert Driver ================== */ + $sqlDriver = " + INSERT INTO driver ( + id, phone, email, password, gender, license_type, national_number, + name_arabic, issue_date, expiry_date, license_categories, + address, licenseIssueDate, status, birthdate, site, + first_name, last_name, accountBank, bankCode, + employmentType, maritalStatus, fullNameMaritial, expirationDate, + created_at, updated_at + ) VALUES ( + :id, :phone, :email, :pwd, :gender, :license_type, :national_number, + :name_arabic, :issue_date, :expiry_date, :license_categories, + :address, :licenseIssueDate, :status, :birthdate, :site, + :first_name, :last_name, :accountBank, :bankCode, + :employmentType, :maritalStatus, :fullNameMaritial, :expirationDate, + NOW(), NOW() + ) + "; + $insD = $con->prepare($sqlDriver); + $okD = $insD->execute([ + ':id' => $data['id'], + ':phone' => $data['phone'], + ':email' => $data['email'], + ':pwd' => $pwdHashed, + ':gender' => !empty($data['gender']) ? $data['gender'] : 'Male', + ':license_type' => !empty($data['license_type']) ? $data['license_type'] : 'yet', + ':national_number' => $data['national_number'], + ':name_arabic' => $data['name_arabic'], + ':issue_date' => !empty($data['issue_date']) ? $data['issue_date'] : '2020-01-01', + ':expiry_date' => !empty($data['expiry_date']) ? $data['expiry_date'] : 'yet', + ':license_categories' => !empty($data['license_categories']) ? $data['license_categories'] : 'B', + ':address' => $data['address'], + ':licenseIssueDate' => !empty($data['licenseIssueDate']) ? $data['licenseIssueDate'] : '2020-01-01', + ':status' => !empty($data['status']) ? $data['status'] : 'yet', + ':birthdate' => $data['birthdate'], + ':site' => !empty($data['site']) ? $data['site'] : 'demascus', + ':first_name' => $data['first_name'], + ':last_name' => $data['last_name'], + ':accountBank' => 'yet', + ':bankCode' => 'yet', + ':employmentType' => !empty($data['employmentType']) ? $data['employmentType'] : 'yet', + ':maritalStatus' => !empty($data['maritalStatus']) ? $data['maritalStatus'] : 'yet', + ':fullNameMaritial' => !empty($data['fullNameMaritial']) ? $data['fullNameMaritial'] : 'yet', + ':expirationDate' => !empty($data['expirationDate']) ? $data['expirationDate'] : 'yet', + ]); + if (!$okD) { + $con->rollBack(); + jsonError("Failed to insert driver."); + exit; + } + + $driverID = $data['id']; + + /* ================== 8) Insert Vehicle ================== */ + // ✅ استقبال القيم الجديدة (التصنيف والوقود) مع تعيين افتراضي 1 + $vCatID = filterRequest("vehicle_category_id"); + $vCatID = ($vCatID !== null && $vCatID !== '') ? $vCatID : 1; // 1 = Car + + $fTypeID = filterRequest("fuel_type_id"); + $fTypeID = ($fTypeID !== null && $fTypeID !== '') ? $fTypeID : 1; // 1 = Petrol + + $hasCar = $con->prepare("SELECT 1 FROM CarRegistration WHERE driverID = :d LIMIT 1"); + $hasCar->execute([':d' => $driverID]); + $isDefault = $hasCar->rowCount() === 0 ? 1 : 0; + + $sqlCar = " + INSERT INTO CarRegistration ( + driverID, vin, car_plate, make, model, year, expiration_date, + color, owner, color_hex, fuel, + vehicle_category_id, fuel_type_id, + isDefault, created_at, status + ) VALUES ( + :driverID, :vin, :car_plate, :make, :model, :year, :expiration_date, + :color, :owner, :color_hex, :fuel, + :vehicle_category_id, :fuel_type_id, + :isDefault, NOW(), 'yet' + ) + "; + $insC = $con->prepare($sqlCar); + $okC = $insC->execute([ + ':driverID' => $driverID, + ':vin' => $car['vin'], + ':car_plate' => $car['car_plate'], + ':make' => $car['make'], + ':model' => $car['model'], + ':year' => $car['year'], + ':expiration_date' => $car['expiration_date'], + ':color' => $car['color'], + ':owner' => $car['owner'], + ':color_hex' => $car['color_hex'], + ':fuel' => $car['fuel'], // النص القديم (للتوافق) + ':vehicle_category_id' => $vCatID, // ✅ العمود الجديد + ':fuel_type_id' => $fTypeID, // ✅ العمود الجديد + ':isDefault' => $isDefault, + ]); + if (!$okC) { + $con->rollBack(); + jsonError("Failed to insert car registration."); + exit; + } + + $carRegID = $con->lastInsertId(); + + /* ================== 9) Store document links ================== */ + $insDoc = $con->prepare(" + INSERT INTO driver_documents (driverID, doc_type, image_name, link, upload_date) + VALUES (:driverID, :doc_type, :image_name, :link, NOW()) + "); + + foreach ($docKeys as $k) { + $url = $docUrls[$k]; + $name = basename(parse_url($url, PHP_URL_PATH) ?? ''); + if ($name === '') { $name = $k . '_' . time() . '.jpg'; } + + $insDoc->execute([ + ':driverID' => $driverID, + ':doc_type' => $k, + ':image_name' => $name, + ':link' => $url, + ]); + } + + /* ================== 10) Commit ================== */ + $con->commit(); + + /* ================== 11) Notification ================== */ + try { + $fcmSendUrl = 'https://api.intaleq.xyz/intaleq/ride/firebase/send_fcm.php'; + + $driverFullName = $raw_first_name . ' ' . $raw_last_name; + $notificationTitle = 'تسجيل سائق جديد'; + $notificationBody = "سائق جديد ($driverFullName) سجل برقم ID: $driverID وهو بانتظار المراجعة والتفعيل."; + + $notificationPayload = json_encode([ + 'target' => 'service', + 'title' => $notificationTitle, + 'body' => $notificationBody, + 'isTopic' => true, + 'category' => 'new_driver_registration' + ]); + + $ch = curl_init(); + curl_setopt($ch, CURLOPT_URL, $fcmSendUrl); + curl_setopt($ch, CURLOPT_POST, true); + curl_setopt($ch, CURLOPT_HTTPHEADER, ['Content-Type: application/json; charset=UTF-8']); + curl_setopt($ch, CURLOPT_POSTFIELDS, $notificationPayload); + curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); + curl_setopt($ch, CURLOPT_TIMEOUT, 5); + curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false); + curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, false); + + curl_exec($ch); + curl_close($ch); + + } catch (Exception $notifyEx) { + error_log("register_driver_and_car NOTIFY ERROR: " . $notifyEx->getMessage()); + } + + printSuccess([ + 'status' => 'success', + 'driverID' => $driverID, + 'carRegID' => $carRegID, + 'documents' => $docUrls + ]); + +} catch (Exception $e) { + if (isset($con) && $con instanceof PDO && $con->inTransaction()) { + $con->rollBack(); + } + error_log("register_driver_and_car ERROR: " . $e->getMessage()); + jsonError("Server error: " . $e->getMessage()); +} catch (PDOException $e) { + if (isset($con) && $con instanceof PDO && $con->inTransaction()) { + $con->rollBack(); + } + error_log("register_driver_and_car PDO: " . $e->getMessage()); + jsonError("Database error."); +} +?> +``` + +## File: auth/syria/driver/drivers_pending_list.php +``` + 'active' ORDER BY id DESC"; + $stmt = $con->prepare($sql); + $stmt->execute(); + $rows = $stmt->fetchAll(PDO::FETCH_ASSOC); + + // فك التشفير + foreach ($rows as &$r) { + $r['phone'] = $encryptionHelper->decryptData($r['phone']); + $r['first_name'] = $encryptionHelper->decryptData($r['first_name']); + $r['last_name'] = $encryptionHelper->decryptData($r['last_name']); + } + + jsonSuccess($rows); // يرجع كـ message: [...] +} catch (PDOException $e) { + jsonError("Error: " . $e->getMessage()); +} +``` + +## File: auth/syria/driver/sendWhatsAppDriver.php +``` +encryptData($raw); + + $sql = "SELECT 1 FROM blacklist_driver WHERE phone = :ph LIMIT 1"; + $q = $con->prepare($sql); + $q->execute(['ph' => $enc_raw]); + + return (bool)$q->fetchColumn(); +} + +/* 0) استقبل الرقم وتحقق من البلاك ليست */ +$receiver = filterRequest("receiver"); + +if (!$receiver) { + jsonError('Phone number is required.'); + error_log("[send_otp_driver.php] Error: phone empty"); + exit(); +} + +if (is_blacklisted_driver($con, $encryptionHelper, $receiver)) { + jsonError('This driver is blacklisted and cannot receive OTP.'); + error_log("[send_otp_driver.php] BLOCKED (blacklisted): $receiver"); + exit(); +} + +/* 1) توليد الـ OTP */ +$otp = rand(10000, 99999); +$messageBody = "Your verification code for Intaleq is: " . $otp; + +/* 🟢 2) تخطي الإرسال الفعلي */ +error_log("[send_otp_driver.php] Skipping actual WhatsApp send. OTP for $receiver: $otp"); + +/* 3) حفظ الـ OTP في قاعدة البيانات */ +$receiver_enc = $encryptionHelper->encryptData($receiver); +$otp_enc = $encryptionHelper->encryptData($otp); + +$exp = date('Y-m-d H:i:s', strtotime('+5 minutes')); +$now = date('Y-m-d H:i:s'); + +try { + // حذف أي رموز سابقة لنفس الرقم + $con->prepare("DELETE FROM phone_verification WHERE phone_number = ?") + ->execute([$receiver_enc]); + + $stmt = $con->prepare(" + INSERT INTO phone_verification + (phone_number, token_code, expiration_time, is_verified, created_at) + VALUES (?, ?, ?, 0, ?) + "); + $stmt->execute([$receiver_enc, $otp_enc, $exp, $now]); + + jsonSuccess(null, 'OTP generated and saved successfully (no message sent)'); + error_log("[send_otp_driver.php] OTP saved for driver $receiver"); + +} catch (PDOException $e) { + error_log("[send_otp_driver.php] DB error: ".$e->getMessage()); + jsonError('OTP generated but failed to save to database'); +} +?> + +``` + +## File: auth/sms_new_backend/sendOtpPassenger.php +``` +encryptData($text); + +$username = getenv('SMS_USERNAME'); +$password = getenv('SMS_PASSWORD_EGYPT'); +$sender = getenv('SMS_SENDER'); + +$language = filterRequest("language"); +$receiver = filterRequest("receiver"); + +$otp = rand(10000, 99999); +$message0 = "Tripz app code is " . $otp; + +$apiUrl = 'https://sms.kazumi.me/api/sms/send-sms'; + +$payload = [ + 'username' => $username, + 'password' => $password, + 'language' => $language, + 'sender' => $sender, + 'receiver' => $receiver, + 'message' => $message0 +]; + +error_log("Sending SMS to $receiver with OTP: $otp"); + +$response = callAPI("POST", $apiUrl, json_encode($payload)); + +error_log("API Response: " . print_r($response, true)); + +// التحقق من رسالة الاستجابة +if ($response && isset($response->message) && $response->message == "Success") { + $expiration_time = date('Y-m-d H:i:s', strtotime('+5 minutes')); + $created_at = date('Y-m-d H:i:s'); + + error_log("Saving to DB: phone=$receiver, token=$otp, expires=$expiration_time"); + + try { + $receiver1=$encryptionHelper->encryptData($receiver); + $otp1=$encryptionHelper->encryptData($otp); + + $stmt = $con->prepare(" + INSERT INTO phone_verification_passenger + (phone_number, token, expiration_time, verified, created_at) + VALUES (?, ?, ?, 0, ?) + "); + $success = $stmt->execute([$receiver1, $otp1, $expiration_time, $created_at]); + + if ($success) { + error_log("OTP saved successfully to DB."); + jsonSuccess(null, 'OTP sent and saved successfully'); + } else { + error_log("SQL execution failed."); + jsonError('OTP sent but not saved to database'); + } + + } catch (PDOException $e) { + error_log("Database Error: " . $e->getMessage()); + jsonError('Database error'); + } + +} else { + error_log("OTP not sent. API response did not indicate success. Response: " . print_r($response, true)); + jsonError('OTP not sent'); +} + +// دالة التعامل مع API +function callAPI($method, $url, $data) +{ + $curl = curl_init(); + + curl_setopt_array($curl, [ + CURLOPT_URL => $url, + CURLOPT_RETURNTRANSFER => true, + CURLOPT_CUSTOMREQUEST => $method, + CURLOPT_POSTFIELDS => $data, + CURLOPT_HTTPHEADER => ["Content-Type: application/json"] + ]); + + $response = curl_exec($curl); + + if (curl_errno($curl)) { + error_log("cURL Error: " . curl_error($curl)); + } + + curl_close($curl); + + return json_decode($response); +} + +?> +``` + +## File: auth/sms_new_backend/rasel_whatsapp.php +``` + $receiver, // رقم المستلم + "type" => "text", + "message" => $messageBody, + "instance_id" => "6863C59A7AFBD", // المعرف المأخوذ من مثال cURL + "access_token"=> "68617b9b8fe53" // مفتاح الوصول المأخوذ من مثال cURL +]; + +error_log("Sending OTP to $receiver via RaseelPlus. Message: $messageBody"); + +// استدعاء الـ API +$response = callAPI("POST", $apiUrl, json_encode($payload)); + +error_log("RaseelPlus API Response: " . print_r($response, true)); + +// --- نهاية التعديل --- + + +// التحقق من الاستجابة من الـ API +// ملاحظة: قد تحتاج إلى تعديل هذا الشرط بناءً على شكل الاستجابة الفعلي من RaseelPlus +// نفترض هنا أن الاستجابة الناجحة تحتوي على "status":"success" أو شيء مشابه +if ($response && !isset($response->error) && (isset($response->status) && $response->status == 'success' || isset($response->message))) { + + // تحديد وقت انتهاء صلاحية الرمز (بعد 5 دقائق) + $expiration_time = date('Y-m-d H:i:s', strtotime('+5 minutes')); + $created_at = date('Y-m-d H:i:s'); + + error_log("API call successful. Saving to DB: phone=$receiver, token=$otp, expires=$expiration_time"); + + try { + // تشفير البيانات قبل حفظها (ممارسة أمنية جيدة) + // $receiver_encrypted = $encryptionHelper->encryptData($receiver); + // $otp_encrypted = $encryptionHelper->encryptData($otp); + + // استخدام البيانات غير المشفرة مؤقتاً إذا لم تكن تستخدم التشفير حالياً + $receiver_to_db = $receiver; + $otp_to_db = $otp; + + $stmt = $con->prepare(" + INSERT INTO phone_verification_passenger + (phone_number, token, expiration_time, verified, created_at) + VALUES (?, ?, ?, 0, ?) + "); + $success = $stmt->execute([$receiver_to_db, $otp_to_db, $expiration_time, $created_at]); + + if ($success) { + error_log("OTP saved successfully to DB."); + // jsonSuccess() هي دالة مخصصة لديك لطباعة استجابة نجاح + jsonSuccess(null, 'OTP sent and saved successfully'); + } else { + error_log("SQL execution failed."); + // jsonError() هي دالة مخصصة لديك لطباعة استجابة فشل + jsonError('OTP sent but failed to save to database'); + } + + } catch (PDOException $e) { + error_log("Database Error: " . $e->getMessage()); + jsonError('Database error occurred'); + } + +} else { + // فشل إرسال الـ OTP + $errorMessage = isset($response->message) ? $response->message : "Unknown error"; + error_log("Failed to send OTP. API response: " . $errorMessage); + jsonError('Failed to send OTP: ' . $errorMessage); +} + +/** + * دالة لإجراء استدعاءات API باستخدام cURL + * @param string $method نوع الطلب (e.g., "POST", "GET") + * @param string $url عنوان URL للـ API + * @param mixed $data البيانات المراد إرسالها + * @return mixed الاستجابة من الـ API بعد فك تشفير JSON + */ +function callAPI($method, $url, $data) +{ + $curl = curl_init(); + + curl_setopt_array($curl, [ + CURLOPT_URL => $url, + CURLOPT_RETURNTRANSFER => true, // إرجاع الاستجابة كنص بدلاً من طباعتها + CURLOPT_ENCODING => "", + CURLOPT_MAXREDIRS => 10, + CURLOPT_TIMEOUT => 30, // مهلة زمنية للطلب + CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1, + CURLOPT_CUSTOMREQUEST => $method, + CURLOPT_POSTFIELDS => $data, + CURLOPT_HTTPHEADER => [ + "Content-Type: application/json", + "Accept: application/json" + ], + ]); + + $response = curl_exec($curl); + $err = curl_error($curl); + + curl_close($curl); + + if ($err) { + error_log("cURL Error #: " . $err); + return null; // إرجاع null في حالة وجود خطأ في cURL + } else { + return json_decode($response); // فك تشفير استجابة JSON + } +} + +// مثال على دالة طباعة النجاح (ضعها في ملف functions.php) + + +?> + +``` + +## File: auth/captin/updateDriverSecure.php +``` +encryptData($value); + $columnValues[] = "`$field` = ?"; + $params[] = $encryptedValue; + } +} + +// تحقق من أن هناك حقول للتحديث +if (empty($columnValues)) { + jsonError("No valid encrypted passenger data provided for update."); + exit; +} + +// تركيب جملة SQL +$setClause = implode(", ", $columnValues); +$params[] = $id; + +$sql = "UPDATE `passengers` SET $setClause WHERE `id` = ?"; + +try { + $stmt = $con->prepare($sql); + + foreach ($params as $index => $value) { + $stmt->bindValue($index + 1, $value); + } + + if ($stmt->execute()) { + jsonSuccess(null, "Passenger data updated successfully with encryption"); + } else { + jsonError("Failed to update passenger data"); + } + +} catch (PDOException $e) { + jsonError("Database error: " . $e->getMessage()); +} +?> +``` + +## File: auth/captin/sendOtpMessageDriver.php +``` +encryptData($phone_number); +$encryptedToken = $encryptionHelper->encryptData($token_code); +$encryptedEmail = $encryptionHelper->encryptData($email); // اختياري إذا بتحب تشفيره + +// التحقق من وجود الرقم مسبقاً في قاعدة البيانات +$sqlCheck = "SELECT * FROM `phone_verification` WHERE `phone_number` = :phone"; +$stmtCheck = $con->prepare($sqlCheck); +$stmtCheck->bindParam(":phone", $encryptedPhone); +$stmtCheck->execute(); + +$success = false; + +// إذا كان الرقم موجود → تحديث +if ($stmtCheck->rowCount() > 0) { + $sqlUpdate = "UPDATE `phone_verification` + SET `token_code` = :token, + `expiration_time` = DATE_ADD(NOW(), INTERVAL 5 MINUTE) + WHERE `phone_number` = :phone"; + $stmt = $con->prepare($sqlUpdate); + $stmt->bindParam(":token", $encryptedToken); + $stmt->bindParam(":phone", $encryptedPhone); + $stmt->execute(); + $success = $stmt->rowCount() > 0; +} else { + // إذا الرقم غير موجود → إدخال جديد + $sqlInsert = "INSERT INTO `phone_verification` + (`phone_number`, `driverId`, `email`, `token_code`, `expiration_time`, `is_verified`, `created_at`) + VALUES + (:phone, :driverId, :email, :token, DATE_ADD(NOW(), INTERVAL 5 MINUTE), 0, NOW())"; + $stmt = $con->prepare($sqlInsert); + $stmt->bindParam(":phone", $encryptedPhone); + $stmt->bindParam(":driverId", $driverId); + $stmt->bindParam(":email", $encryptedEmail); + $stmt->bindParam(":token", $encryptedToken); + $stmt->execute(); + $success = $stmt->rowCount() > 0; +} + +// إذا تم الحفظ بنجاح → أرسل الرمز عبر SMS +if ($success) { + // تحميل بيانات الاتصال بالـ SMS API من المتغيرات البيئية + $username = getenv('SMS_USERNAME'); + $password = getenv('SMS_PASSWORD_EGYPT'); + $sender = getenv('SMS_SENDER'); + + if (!$username || !$password || !$sender) { + jsonError("SMS credentials are missing"); + exit; + } + + $message = "Tripz app code is " . $token_code; + $receiver = $phone_number; + + $apiUrl = 'https://sms.kazumi.me/api/sms/send-sms'; + $payload = [ + 'username' => $username, + 'password' => $password, + 'language' => 'e', + 'sender' => $sender, + 'receiver' => $receiver, + 'message' => $message + ]; + + $jsonPayload = json_encode($payload); + $smsResponse = callAPI("POST", $apiUrl, $jsonPayload); + + if ($smsResponse) { + jsonSuccess(null, "Verification code sent and saved successfully"); + } else { + jsonError("Code saved, but SMS sending failed"); + } +} else { + jsonError("Failed to save verification data"); +} + +// دالة الاتصال بالـ API +function callAPI($method, $url, $data) { + $curl = curl_init(); + curl_setopt_array($curl, [ + CURLOPT_URL => $url, + CURLOPT_RETURNTRANSFER => true, + CURLOPT_CUSTOMREQUEST => $method, + CURLOPT_POSTFIELDS => $data, + CURLOPT_HTTPHEADER => [ + "Content-Type: application/json", + "Accept: application/json" + ], + CURLOPT_TIMEOUT => 30, + CURLOPT_CONNECTTIMEOUT => 10 + ]); + + $api_raw_response = curl_exec($curl); + + if (curl_errno($curl)) { + error_log("cURL Error [".curl_errno($curl)."]: " . curl_error($curl)); + curl_close($curl); + return false; + } + + curl_close($curl); + $decoded_response = json_decode($api_raw_response, true); + + if (json_last_error() !== JSON_ERROR_NONE) { + error_log("Invalid JSON response from SMS API."); + return false; + } + + error_log("SMS API response: " . print_r($decoded_response, true)); + return $decoded_response; +} +?> +``` + +## File: auth/captin/login.php +``` +encryptData($email); +$phone = $encryptionHelper->encryptData($phone); + +$sql = "SELECT + driver.id, + driver.phone, + driver.email, + driver.password, + driver.gender, + driver.birthdate, + driver.site, + driver.first_name, + driver.last_name, + driver.education, + driver.employmentType, + driver.maritalStatus, + driver.created_at, + driver.updated_at, + email_verifications.verified +FROM + driver +LEFT JOIN email_verifications ON email_verifications.email = driver.email +WHERE + driver.phone = :phone AND driver.email = :email"; + +$stmt = $con->prepare($sql); +$stmt->bindParam(':email', $email); +$stmt->bindParam(':phone', $phone); +$stmt->execute(); +$data = $stmt->fetchAll(PDO::FETCH_ASSOC); +$count = $stmt->rowCount(); + +if ($count > 0) { + $stored_password = $data[0]['password']; + if (password_verify($password, $stored_password)) { + + // فك التشفير للحقول الحساسة + $data[0]['phone'] = $encryptionHelper->decryptData($data[0]['phone']); + $data[0]['email'] = $encryptionHelper->decryptData($data[0]['email']); + $data[0]['gender'] = $encryptionHelper->decryptData($data[0]['gender']); + $data[0]['birthdate'] = $encryptionHelper->decryptData($data[0]['birthdate']); + $data[0]['site'] = $encryptionHelper->decryptData($data[0]['site']); + $data[0]['first_name'] = $encryptionHelper->decryptData($data[0]['first_name']); + $data[0]['last_name'] = $encryptionHelper->decryptData($data[0]['last_name']); + $data[0]['education'] = $encryptionHelper->decryptData($data[0]['education']); + $data[0]['employmentType'] = $encryptionHelper->decryptData($data[0]['employmentType']); + $data[0]['maritalStatus'] = $encryptionHelper->decryptData($data[0]['maritalStatus']); + + unset($data[0]['password']); // لا نرجّع الباسورد + jsonSuccess($data); + } else { + jsonError("Incorrect password."); + } +} else { + jsonError("User does not exist."); +} +?> +``` + +## File: auth/captin/updateAccountBank.php +``` + $value) { + $filtered = filterRequest($key); + + if ($key === "password") { + // هاش لكلمة المرور + $hashed = password_hash($filtered, PASSWORD_DEFAULT); + $columnValues[] = "`password` = '$hashed'"; + } elseif (in_array($key, $fieldsToEncrypt)) { + $encrypted = $encryptionHelper->encryptData($filtered); + $columnValues[] = "`$key` = '$encrypted'"; + } elseif (in_array($key, $plainFields)) { + $columnValues[] = "`$key` = '$filtered'"; + } +} + +// بناء جملة التحديث +$setClause = implode(", ", $columnValues); +$sql = "UPDATE `driver` SET $setClause WHERE `id` = '$id'"; + +$stmt = $con->prepare($sql); +$stmt->execute(); + +if ($stmt->rowCount() > 0) { + jsonSuccess(null, "Driver data updated successfully"); +} else { + jsonError("Failed to update driver data"); +} +?> +``` + +## File: auth/captin/verifyOtpDriver.php +``` +encryptData($phone_number); +$encryptedToken = $encryptionHelper->encryptData($token_code); + +// Check if the phone number and token code match +$sql = "SELECT + `id`, + `phone_number`, + `token_code`, + `expiration_time`, + `is_verified`, + `created_at` +FROM + `phone_verification` +WHERE + `phone_number` = :phone_number AND `token_code` = :token_code -- AND `expiration_time` > NOW()"; +$stmt = $con->prepare($sql); +$stmt->bindParam(':phone_number', $encryptedPhone, PDO::PARAM_STR); +$stmt->bindParam(':token_code', $encryptedToken, PDO::PARAM_STR); +$stmt->execute(); +$result = $stmt->fetch(); + +if ($result) { + // $id = $result["id"]; + $sql = "UPDATE `phone_verification` SET `is_verified` = 1 WHERE `phone_number` = :phone_number"; + $stmt = $con->prepare($sql); + $stmt->bindParam(':phone_number', $phone_number, PDO::PARAM_STR); + $stmt->execute(); + + jsonSuccess($message = "Your phone number has been verified."); +} else { + jsonError($message = "Your phone number could not be verified. Please try again."); +} +?> +``` + +## File: auth/captin/loginUsingCredentialsWithoutGoogle.php +``` +encryptData($email); + +// SQL لاسترجاع المستخدم بناءً على البريد الإلكتروني المشفر +$sql = "SELECT + driver.id, + driver.phone, + driver.email, + driver.gender, + driver.birthdate, + driver.site, + driver.first_name, + driver.last_name, + driver.bankCode, + driver.accountBank, + driver.education, + driver.employmentType, + driver.maritalStatus, + driver.created_at, + driver.updated_at, + driver.password, + phone_verification.is_verified, + CarRegistration.make, + CarRegistration.model, + CarRegistration.year +FROM + driver +LEFT JOIN phone_verification ON phone_verification.phone_number = driver.phone +LEFT JOIN CarRegistration ON CarRegistration.driverID = driver.id +WHERE + driver.email = :email AND phone_verification.is_verified = '1' +LIMIT 1"; + +$stmt = $con->prepare($sql); +$stmt->bindParam(':email', $encryptedEmail); +$stmt->execute(); + +$data = $stmt->fetch(PDO::FETCH_ASSOC); + +if ($data) { + if (password_verify($password, $data['password'])) { + unset($data['password']); + + // فك تشفير الحقول الحساسة + $data['phone'] = $encryptionHelper->decryptData($data['phone']); + $data['email'] = $encryptionHelper->decryptData($data['email']); + $data['gender'] = $encryptionHelper->decryptData($data['gender']); + $data['birthdate'] = $encryptionHelper->decryptData($data['birthdate']); + $data['site'] = $encryptionHelper->decryptData($data['site']); + $data['first_name'] = $encryptionHelper->decryptData($data['first_name']); + $data['last_name'] = $encryptionHelper->decryptData($data['last_name']); + $data['education'] = $encryptionHelper->decryptData($data['education']); + $data['employmentType'] = $encryptionHelper->decryptData($data['employmentType']); + $data['maritalStatus'] = $encryptionHelper->decryptData($data['maritalStatus']); + + echo json_encode([ + "status" => "success", + "data" => $data + ]); + } else { + jsonError("Incorrect password."); + } +} else { + jsonError("User does not exist or phone number not verified."); +} + +$stmt = null; +$con = null; +exit(); +?> +``` + +## File: auth/captin/updateDriverClaim.php +``` +prepare($checkSql); + $checkStmt->bindParam(':driverId', $driverId, PDO::PARAM_INT); + $checkStmt->execute(); + $giftExists = $checkStmt->fetchColumn(); + + if ($giftExists > 0) { + jsonError("Gift already exists for this driver"); + exit; + } + + // Insert a new claimed gift + $sql = "INSERT INTO driver_gifts (driver_id, gift_description, is_claimed) + VALUES (:driverId, 'new account 300 le', 1)"; + $stmt = $con->prepare($sql); + $stmt->bindParam(':driverId', $driverId, PDO::PARAM_INT); + $stmt->execute(); + + if ($stmt->rowCount() > 0) { + jsonSuccess(null, "Gift data saved successfully"); + } else { + jsonError("Failed to save gift data"); + } + +} catch (PDOException $e) { + error_log("Database Error: " . $e->getMessage()); + jsonError("An error occurred while saving the data"); +} +?> +``` + +## File: auth/captin/register.php +``` +encryptData($data[$f]); + } + } + + /* =========== 3) توليد driver ID (id) إذا لم يُرسَل =========== */ + + + /* =========== 4) هَش كلمة المرور =========== */ + $data['password_hashed'] = password_hash($data['password'], PASSWORD_DEFAULT); + + /* =========== 5) منع التكرار في الهاتف / الإيميل =========== */ + $dup = $con->prepare( + "SELECT id FROM driver WHERE phone = :phone OR email = :email" + ); + $dup->execute([ + ':phone' => $data['phone'], + ':email' => $data['email'] + ]); + if ($dup->rowCount() > 0) { + jsonError("Phone or email already registered."); + exit; + } + + /* =========== 6) إدخال السجل الجديد =========== */ + $sql = " + INSERT INTO driver ( + id, phone, email, password, gender, license_type, national_number, + name_arabic, issue_date, expiry_date, license_categories, + address, licenseIssueDate, status, birthdate, site, + first_name, last_name, accountBank, bankCode, + employmentType, maritalStatus, fullNameMaritial, expirationDate, + created_at, updated_at + ) VALUES ( + :id, :phone, :email, :pwd, :gender, :license_type, :national_number, + :name_arabic, :issue_date, :expiry_date, :license_categories, + :address, :licenseIssueDate, :status, :birthdate, :site, + :first_name, :last_name, :accountBank, :bankCode, + :employmentType, :maritalStatus, :fullNameMaritial, :expirationDate, + NOW(), NOW() + ) + "; + + $ins = $con->prepare($sql); + + // خريطة الربط (تطابق تمامًا أسماء الـ placeholders في الـ SQL أعلاه) + $bind = [ + 'id' => $data['id'], + 'phone' => $data['phone'], + 'email' => $data['email'], + 'pwd' => $data['password_hashed'], + 'gender' => $data['gender'], + 'license_type' => $data['license_type'], + 'national_number' => $data['national_number'], + 'name_arabic' => $data['name_arabic'], + 'issue_date' => $data['issue_date'], + 'expiry_date' => $data['expiry_date'], + 'license_categories'=> $data['license_categories']?? 'B', + 'address' => $data['address'], + 'licenseIssueDate' => $data['licenseIssueDate'], + 'status' => $data['status'] ?? 'yet', + 'birthdate' => $data['birthdate'], + 'site' => $data['site'], + 'first_name' => $data['first_name'], + 'last_name' => $data['last_name'], + 'accountBank' => 'yet', + 'bankCode' => 'yet', + 'employmentType' => $data['employmentType']?? 'yet', + 'maritalStatus' => $data['maritalStatus']?? 'yet', + 'fullNameMaritial' => $data['fullNameMaritial']?? 'yet', + 'expirationDate' => $data['expirationDate']?? 'yet', + ]; + + foreach ($bind as $key => $value) { + $ins->bindValue(":$key", $value); + } + + if ($ins->execute()) { + jsonSuccess($data['id']); // ترجع driver ID + } else { + jsonError("Failed to insert driver record."); + } + +} catch (PDOException $e) { + error_log("DriverInsert PDO: " . $e->getMessage()); + jsonError("Database error."); +} +?> +``` + +## File: auth/captin/loginFromGoogle.php +``` +encryptData($emailRaw); + // error_log("[Debug] Email (encrypted): $emailEnc"); + + /* ──────────────────────────────── + 3) إعداد الاستعلام الموحَّد + ───────────────────────────────── */ + $sql = " + SELECT + driver.id, driver.phone, driver.email, driver.gender, driver.birthdate, + driver.site, driver.first_name, driver.last_name, driver.bankCode, + driver.accountBank, driver.employmentType,driver.status, driver.maritalStatus, + driver.created_at, driver.updated_at, + phone_verification.is_verified, + CarRegistration.make, CarRegistration.model, CarRegistration.year, + df.is_claimed, inv.isInstall, inv.isGiftToken + FROM driver + LEFT JOIN phone_verification ON phone_verification.phone_number = driver.phone + LEFT JOIN driver_gifts df ON df.driver_id = driver.id + LEFT JOIN CarRegistration ON CarRegistration.driverID = driver.id + LEFT JOIN invites inv ON inv.driverId = driver.id + WHERE + + driver.id = :id + -- AND phone_verification.is_verified = '1' + LIMIT 1 + "; + + // error_log("[Debug] queryString:\n$sql"); + + $stmt = $con->prepare($sql); + + // باراميترات الربط + $params = [ + //':email' => $emailEnc, + ':id' => $driverID, + ]; + foreach ($params as $k => $v) { + $stmt->bindValue($k, $v); + } + + /* ───────── dumpParams (اختياري) ───────── */ + ob_start(); + $stmt->debugDumpParams(); + error_log("[Debug] dumpParams:\n" . ob_get_clean()); + + /* ──────────────────────────────── + 4) تنفيذ الاستعلام + ───────────────────────────────── */ + $stmt->execute(); + error_log("[Debug] stmt->rowCount(): " . $stmt->rowCount()); + + $rows = $stmt->fetchAll(PDO::FETCH_ASSOC); + // error_log("[Debug] Raw fetched JSON: " . json_encode($rows, JSON_UNESCAPED_UNICODE)); + + if (!$rows) { + jsonError("User does not exist or phone not verified."); + exit; + } + + /* ──────────────────────────────── + 5) فك التشفير للحقول الحسّاسة + ───────────────────────────────── */ + $data = &$rows[0]; // مرجع لتوفير الذاكرة + + $decryptIfNotNull = function($field) use (&$data, $encryptionHelper) { + if (isset($data[$field]) && $data[$field] !== null) { + $data[$field] = $encryptionHelper->decryptData($data[$field]); + } + }; + + foreach ([ + 'phone', 'email', 'gender', 'birthdate', 'site', + 'first_name', 'last_name' + ] as $field) { + $decryptIfNotNull($field); + } +error_log("[Debug] Raw fetched JSON: " . json_encode($rows, JSON_UNESCAPED_UNICODE)); + + echo json_encode([ + "status" => "success", + "count" => 1, + "data" => $rows // نتيجة واحدة فقط + ], JSON_UNESCAPED_UNICODE); +} catch (PDOException $e) { + error_log("[PDO ERROR] " . $e->getMessage()); + jsonError("Database error: ".$e->getCode()); +} catch (Exception $e) { + error_log("[GENERAL ERROR] " . $e->getMessage()); + jsonError("Error occurred."); +} finally { + $stmt = null; + $con = null; +} +?> +``` + +## File: auth/captin/updateShamCashDriver.php +``` +encryptData($accountBank); + + // 2. كود المحفظة يبقى كما هو (حسب القواعد bankCode غير مشفر) + $plainBankCode = $encryptionHelper->encryptData($bankCode); + + // 3. جملة التحديث + $stmt = $con->prepare("UPDATE `driver` SET `accountBank` = ?, `bankCode` = ? WHERE `id` = ?"); + + $stmt->execute(array($encryptedAccountBank, $plainBankCode, $id)); + + // التحقق من نجاح العملية + // rowCount > 0 يعني تم التحديث، أحياناً يعطي 0 إذا كانت البيانات هي نفسها لم تتغير + // لذا نرسل نجاح في كلتا الحالتين طالما لم يحدث Error + jsonSuccess(null, "ShamCash info updated successfully"); + + } catch (PDOException $e) { + // في حال وجود خطأ في قاعدة البيانات + jsonError("Database Error: " . $e->getMessage()); + } + +} else { + jsonError("Missing required fields: id, accountBank, or bankCode"); +} +?> +``` + +## File: auth/captin/forgetPassword.php +``` + +``` + +## File: auth/captin/removeAccount.php +``` +prepare($sql); +$stmt->bindParam(':id', $id, PDO::PARAM_INT); +$stmt->execute(); + +if ($stmt->rowCount() > 0) { + jsonSuccess(null, "Passenger deleted successfully."); +} else { + jsonError("Failed to delete passenger."); +} +?> +``` + +## File: auth/captin/addCriminalDocuments.php +``` +prepare($sql); + + // Bind parameters + $stmt->bindParam(':driverId', $driverId, PDO::PARAM_INT); + $stmt->bindParam(':issueDate', $issueDate, PDO::PARAM_STR); + $stmt->bindParam(':inspectionResult', $inspectionResult, PDO::PARAM_STR); + + // Execute the statement + $stmt->execute(); + + // Check if the insertion was successful + if ($stmt->rowCount() > 0) { + jsonSuccess(null, "Criminal document data saved successfully"); + } else { + jsonError("Failed to save criminal document data"); + } +} catch (PDOException $e) { + // Log the error and print a generic failure message + error_log("Database Error: " . $e->getMessage()); + jsonError("An error occurred while saving the data"); +} +?> +``` + +## File: auth/captin/deletecaptainAccounr.php +``` +prepare("SELECT phone FROM `driver` WHERE `id` = :id"); + $stmtPhone->bindParam(':id', $id, PDO::PARAM_INT); + $stmtPhone->execute(); + $driverData = $stmtPhone->fetch(PDO::FETCH_ASSOC); + + // التحقق من وجود السائق + if (!$driverData) { + jsonError("Driver not found"); + exit(); + } + + $phone = $driverData['phone']; + + // 2. تحديث حالة السائق + $sql = "UPDATE `driver` SET `status` = 'deleteFromHimself' WHERE `id` = :id"; + $stmt = $con->prepare($sql); + $stmt->bindParam(':id', $id, PDO::PARAM_INT); + $stmt->execute(); + + if ($stmt->rowCount() > 0) { + // 3. الإضافة إلى القائمة السوداء (blacklist_driver) + // نستخدم NOW() لتسجيل الوقت الحالي تلقائياً + // لا نمرر id العمود الأول لأنه غالباً Auto Increment في قاعدة البيانات + $insertSql = "INSERT INTO `blacklist_driver` (`driver_id`, `phone`, `reason`, `created_at`) + VALUES (:driver_id, :phone, :reason, NOW())"; + + $insertStmt = $con->prepare($insertSql); + $insertStmt->execute([ + ':driver_id' => $id, + ':phone' => $phone, + ':reason' => $reason + ]); + + jsonSuccess(null, "Record marked as deleted and added to blacklist successfully"); + } else { + jsonError("Failed to update record or no change made"); + } + +} catch (PDOException $e) { + // في حال حدوث خطأ في قاعدة البيانات (مثلاً تكرار الإضافة) + jsonError("Database Error: " . $e->getMessage()); +} +?> +``` + +## File: auth/captin/getAccount.php +``` +prepare($sql); +$stmt->bindParam(':id', $driverID, PDO::PARAM_INT); +$stmt->execute(); + +if ($stmt->rowCount() > 0) { + $row = $stmt->fetchAll(PDO::FETCH_ASSOC); + jsonSuccess($row); +} else { + jsonError("No account bank record found"); +} +?> +``` + +## File: auth/captin/getAllDriverSecure.php +``` +prepare($sql); +$stmt->execute(); + +if ($stmt->rowCount() > 0) { + $rows = $stmt->fetchAll(PDO::FETCH_ASSOC); + + // فك تشفير الحقول الحساسة + foreach ($rows as &$row) { + $row['phone'] = $encryptionHelper->decryptData($row['phone']); + $row['email'] = $encryptionHelper->decryptData($row['email']); + $row['gender'] = $encryptionHelper->decryptData($row['gender']); + $row['birthdate'] = $encryptionHelper->decryptData($row['birthdate']); + $row['first_name'] = $encryptionHelper->decryptData($row['first_name']); + $row['last_name'] = $encryptionHelper->decryptData($row['last_name']); + $row['sosPhone'] = $encryptionHelper->decryptData($row['sosPhone']); + } + + jsonSuccess($rows); +} else { + jsonError("No wallet record found"); +} +?> +``` + +## File: auth/captin/verifyEmail.php +``` + +``` + +## File: auth/captin/getPromptDriverDocumentsEgypt.php +``` +prepare($sql); +$stmt->execute(); + +if ($stmt->rowCount() > 0) { + // Fetch the record + $row = $stmt->fetchAll(PDO::FETCH_ASSOC); + + jsonSuccess($row); + +} + else{ + // Print a failure message + jsonError($message = "No wallet record found"); +} +?> +``` + +## File: auth/sms/sms_to_user_change_fingerprint.php +``` +encryptData($phone); +$otpEncrypted = $encryptionHelper->encryptData($otp); + +// 4️⃣ تخزين OTP في قاعدة البيانات +try { + $insertOtp = "INSERT INTO otp_verification_fingerPrint (phone, otp) VALUES (?, ?)"; + $stmt = $con->prepare($insertOtp); + $stmt->execute([$phoneEncrypted, $otpEncrypted]); +} catch (PDOException $e) { + error_log("DB Insert Error: " . $e->getMessage()); + jsonError("Failed to save OTP to the database"); + exit; +} + +// 5️⃣ إرسال الرسالة عبر API +$message = "$appName app code is $otp\ncopy it to app"; + +$payload = json_encode([ + "username" => $username, + "password" => $password, + "message" => $message, + "language" => $language, + "sender" => $sender, + "receiver" => $phone +]); + +$ch = curl_init($apiEndpoint); +curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); +curl_setopt($ch, CURLOPT_HTTPHEADER, ['Content-Type: application/json']); +curl_setopt($ch, CURLOPT_POST, true); +curl_setopt($ch, CURLOPT_POSTFIELDS, $payload); +$response = curl_exec($ch); +$httpCode = curl_getinfo($ch, CURLINFO_HTTP_CODE); +curl_close($ch); + +// 6️⃣ التحقق من نجاح الإرسال +if ($httpCode != 200) { + error_log("SMS API Failed. HTTP Code: $httpCode. Response: " . $response); + jsonError("Failed to send OTP SMS"); + exit; +} + +// 7️⃣ إرجاع النتيجة +jsonSuccess(["message" => "OTP sent successfully"]); +?> +``` + +## File: auth/sms/updatePhoneInvalidSMS.php +``` +encryptData($phone_number); + +// Prepare the SQL query to verify the phone +$sql = "UPDATE phone_verification SET is_verified = 1 WHERE phone_number = :phone_number"; + +// Prepare the statement +$stmt = $con->prepare($sql); +$stmt->bindParam(":phone_number", $phone_number); + +// Execute the query +$stmt->execute(); +$affectedRows = $stmt->rowCount(); + +// Check if the update was successful +if ($affectedRows > 0) { + jsonSuccess(["message" => "Phone number verified successfully"]); +} else { + jsonError("No phone number found or verification failed"); +} +?> +``` + +## File: auth/sms/updatePhoneInvalidSMSPassenger.php +``` +encryptData($phone_number); + +// تنفيذ الاستعلام +$sql = "UPDATE phone_verification_passenger SET verified = 1 WHERE phone_number = :phone_number"; +$stmt = $con->prepare($sql); +$stmt->bindParam(":phone_number", $phone_number); +$stmt->execute(); + +$affectedRows = $stmt->rowCount(); + +// إرجاع النتيجة +if ($affectedRows > 0) { + jsonSuccess(["message" => "Phone number verified successfully"]); +} else { + jsonError("No phone number found or verification failed"); +} +?> +``` + +## File: auth/sms/getSender.php +``` +prepare($sql); +$stmt->execute(); +$result = $stmt->fetchAll(PDO::FETCH_ASSOC); + +if ($stmt->rowCount() > 0) { + + jsonSuccess($data = $result); +} else { + + + jsonError($message = "No driver order data found"); +} + +?> +``` + +## File: auth/google_auth/check_status.php +``` + 'error', 'message' => 'Login token is missing.']); + exit(); +} +$loginToken = basename($input['loginToken']); // حماية + +// 2. التحقق من ملف الجلسة +$pollDir = __DIR__ . '/polls'; +$sessionFile = $pollDir . '/' . $loginToken . '.json'; + +if (file_exists($sessionFile)) { + $sessionData = json_decode(file_get_contents($sessionFile), true); + + // إذا نجحت العملية، أرجع البيانات واحذف الملف + if ($sessionData['status'] === 'success') { + echo json_encode($sessionData); + unlink($sessionFile); // حذف الملف بعد النجاح + } else { + // إذا كانت لا تزال معلقة + echo json_encode(['status' => 'pending']); + } +} else { + // إذا انتهت المهلة أو حدث خطأ + http_response_code(404); + echo json_encode(['status' => 'expired', 'message' => 'Session not found or expired.']); +} +exit(); +?> + +``` + +## File: auth/google_auth/google_auth.php +``` + false, + 'error' => null, + 'data' => null, +]; + +try { + if (!isset($_POST['code'])) { + throw new Exception("Missing authorization code."); + } + + $code = $_POST['code']; + + $client = new Client(); + $client->setClientId('1086900987150-j8brn0i5s97315kh1ej9jr72grkfqgh5.apps.googleusercontent.com'); + $client->setClientSecret('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'); + $client->setRedirectUri('postmessage'); + $client->addScope('email'); + $client->addScope('profile'); + + $token = $client->fetchAccessTokenWithAuthCode($code); + + if (isset($token['error'])) { + throw new Exception("Access token error: " . $token['error']); + } + + $client->setAccessToken($token['access_token']); + + $oauth2 = new Google_Service_Oauth2($client); + $userinfo = $oauth2->userinfo->get(); + + $response['success'] = true; + $response['data'] = [ + 'id' => $userinfo->id, + 'email' => $userinfo->email, + 'name' => $userinfo->name, + 'picture' => $userinfo->picture, + ]; + +} catch (Exception $e) { + $response['error'] = $e->getMessage(); +} + +echo json_encode($response); +``` + +## File: auth/google_auth/login.php +``` + 'pending'])); + +// 5. بناء رابط جوجل مع تمرير المعرف الفريد في متغير 'state' +$authUrl = 'https://accounts.google.com/o/oauth2/v2/auth?' . http_build_query([ + 'client_id' => $clientID, + 'redirect_uri' => $redirectUri, + 'response_type' => 'code', + 'scope' => $scopes, + 'access_type' => 'offline', + 'state' => $loginToken // مهم جداً +]); + +// 6. إرجاع الرابط والمعرف للتطبيق +header('Content-Type: application/json'); +echo json_encode([ + 'authUrl' => $authUrl, + 'loginToken' => $loginToken +]); +exit(); +?> +``` + +## File: auth/google_auth/callback.php +``` + $authCode, + 'client_id' => $clientID, + 'client_secret' => $clientSecret, + 'redirect_uri' => $redirectUri, + 'grant_type' => 'authorization_code' +]; + +$ch = curl_init(); +curl_setopt($ch, CURLOPT_URL, $tokenUrl); +curl_setopt($ch, CURLOPT_POST, 1); +curl_setopt($ch, CURLOPT_POSTFIELDS, http_build_query($postData)); +curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); +$response = curl_exec($ch); +curl_close($ch); +$tokenData = json_decode($response, true); + +if (isset($tokenData['access_token'])) { + // 4. جلب بيانات المستخدم + $userInfoUrl = 'https://www.googleapis.com/oauth2/v2/userinfo?access_token=' . $tokenData['access_token']; + $userInfoResponse = file_get_contents($userInfoUrl); + $userData = json_decode($userInfoResponse, true); + + if (isset($userData['id'])) { + // 5. تحديث ملف الجلسة بالبيانات الجديدة + $finalData = [ + 'status' => 'success', + 'userData' => $userData + ]; + file_put_contents($sessionFile, json_encode($finalData)); + } +} + +// 6. عرض صفحة نجاح للمستخدم في المتصفح +echo 'Success

Authentication Successful

You can now return to the Tripz app.

'; +exit(); +?> +``` + +## File: auth/token_passenger/send_otp.php +``` + true, + * 'details' => ['status' => 'PENDING' | 'SENT' | …] + * ] + */ +$sentOK = $response['success'] ?? false; +$statusOK = in_array($response['details']['status'] ?? '', ['PENDING', 'SENT', 'DELIVERED'], true); + +if ($sentOK ) { + + /* 3) تشفير البيانات وحفظ الرمز في قاعدة البيانات */ + $receiver_enc = $encryptionHelper->encryptData($receiver); + $otp_enc = $encryptionHelper->encryptData($otp); + + $exp = date('Y-m-d H:i:s', strtotime('+5 minutes')); + $now = date('Y-m-d H:i:s'); + + try { + $con->prepare("DELETE FROM token_verification WHERE phone_number = ?") + ->execute([$receiver_enc]); + + $stmt = $con->prepare(" + INSERT INTO token_verification + (phone_number, token, expiration_time, verified, created_at) + VALUES (?, ?, ?, 0, ?) + "); + $stmt->execute([$receiver_enc, $otp_enc, $exp, $now]); + + jsonSuccess(null, 'OTP sent and saved successfully'); + + } catch (PDOException $e) { + jsonError('OTP sent but failed to save to database'); + } + +} else { + $errMsg = $response['message'] ?? 'Unknown error'; + jsonError('Failed to send OTP: ' . $errMsg); +} + +/* ----------------------------------------------------------------- + * يمكن حذف callAPI() تمامًا إن لم يعد مستخدمًا في أي ملف آخر. + * ---------------------------------------------------------------- */ +function callAPI($method, $url, $data) { /* … (أبقِها أو احذفها) */ } +?> +``` + +## File: auth/token_passenger/verify_otp.php +``` +encryptData($phoneNumber); +$otp_encrypted = $encryptionHelper->encryptData($otp); + +try { + // 1. التحقق من Redis بدلاً من MySQL + if (!$redis) { + jsonError("Security service unavailable"); + exit; + } + + $cachedOtp = $redis->get("otp:passenger:$phoneNumber"); + + if ($cachedOtp && $cachedOtp == $otp) { + // ننجح في التحقق ونحذف المفتاح من Redis لمنع استخدامه مرة أخرى (One-time use) + $redis->del("otp:passenger:$phoneNumber"); + + error_log("[verify_otp.php] OTP verified via Redis for phone: $phoneNumber"); + + // 2. التحقق من وجود الراكب في قاعدة البيانات + $passengerStmt = $con->prepare("SELECT id FROM passengers WHERE phone = ?"); + $passengerStmt->execute([$phoneNumber_encrypted]); + $passenger = $passengerStmt->fetch(PDO::FETCH_ASSOC); + + if ($passenger) { + $passengerID = $passenger['id']; + + // تحديث التوكن والبصمة إن وجدا + $newToken = filterRequest("token"); + $fingerPrint = filterRequest("fingerPrint"); + + if ($newToken && $fingerPrint) { + $tokenEncrypted = $encryptionHelper->encryptData($newToken); + $updateTokenStmt = $con->prepare("UPDATE tokens SET token = ?, fingerPrint = ? WHERE passengerID = ?"); + $updateTokenStmt->execute([$tokenEncrypted, $fingerPrint, $passengerID]); + } + + printSuccess([ + "message" => "Token verified and updated.", + "isRegistered" => true, + "passengerID" => $passengerID + ]); + + } else { + printSuccess([ + "message" => "Phone verified, passenger not found.", + "isRegistered" => false + ]); + } + + } else { + error_log("[verify_otp.php] Invalid or expired OTP for phone: $phoneNumber"); + jsonError("Invalid or expired OTP."); + } + +} catch (Exception $e) { + // Log the detailed database error message for debugging. + error_log("[verify_otp.php] FATAL DATABASE ERROR: " . $e->getMessage()); + jsonError("Database error: " . $e->getMessage()); +} +?> +``` + +## File: auth/token_passenger/driver/verify_otp_driver.php +``` +encryptData($phoneNumber); +$otp_encrypted = $encryptionHelper->encryptData($otp); + +try { + $stmt = $con->prepare(" + SELECT * FROM token_verification_driver + WHERE phone_number = ? AND token = ? + "); + $stmt->execute([$phoneNumber_encrypted, $otp_encrypted]); + $result = $stmt->fetch(PDO::FETCH_ASSOC); + + if ($result) { + $expiration_time = strtotime($result['expiration_time']); + + if (time() <= $expiration_time) { + $con->prepare("UPDATE token_verification_driver SET verified = 1 WHERE id = ?") + ->execute([$result['id']]); + + $driverStmt = $con->prepare("SELECT id FROM driver WHERE phone = ?"); + $driverStmt->execute([$phoneNumber_encrypted]); + $driver = $driverStmt->fetch(PDO::FETCH_ASSOC); + + if ($driver) { + $driverID = $driver['id']; + $newToken = filterRequest("token"); + $fingerPrint = filterRequest("fingerPrint"); + + if ($newToken && $fingerPrint) { + $tokenEncrypted = $encryptionHelper->encryptData($newToken); + + $checkTokenStmt = $con->prepare("SELECT id FROM driverToken WHERE captain_id = ?"); + $checkTokenStmt->execute([$driverID]); + + if ($checkTokenStmt->rowCount() > 0) { + $con->prepare("UPDATE driverToken SET token = ?, fingerPrint = ? WHERE captain_id = ?") + ->execute([$tokenEncrypted, $fingerPrint, $driverID]); + } else { + $con->prepare("INSERT INTO driverToken (token, fingerPrint, captain_id, created_at) VALUES (?, ?, ?, NOW())") + ->execute([$tokenEncrypted, $fingerPrint, $driverID]); + } + + $response = [ + "message" => "Driver token verified and updated.", + "isRegistered" => true, + "driverID" => $driverID + ]; + jsonSuccess($response); + + } else { + jsonError("Token or fingerprint missing."); + } + + } else { + printSuccess([ + "message" => "Phone verified, but driver not found.", + "isRegistered" => false + ]); + } + + } else { + jsonError("OTP expired. Request a new one."); + } + + } else { + jsonError("Invalid OTP."); + } + +} catch (PDOException $e) { + jsonError("Database error occurred."); +} +``` + +## File: auth/token_passenger/driver/send_otp_driver.php +``` + true/false, + * 'message' => 'Message sent successfully!', + * 'details' => ['status' => 'PENDING' | 'SENT' | …] + * ] + */ +$raw = sendWhatsAppFromServer($receiver, $messageBody); +$response = is_string($raw) ? json_decode($raw, true) : (array) $raw; + +$sentOK = $response['success'] ?? false; +$waStatus = $response['details']['status'] ?? ''; + +if ($sentOK ) { + + /* 3) تشفير البيانات وحفظها في DB ----------------------------------- */ + $receiver_enc = $encryptionHelper->encryptData($receiver); + $otp_enc = $encryptionHelper->encryptData($otp); + + $exp = date('Y-m-d H:i:s', strtotime('+5 minutes')); + $now = date('Y-m-d H:i:s'); + + try { + // حذف رموز قديمة + $con->prepare("DELETE FROM token_verification_driver WHERE phone_number = ?") + ->execute([$receiver_enc]); + + $stmt = $con->prepare(" + INSERT INTO token_verification_driver + (phone_number, token, expiration_time, verified, created_at) + VALUES (?, ?, ?, 0, ?) + "); + $stmt->execute([$receiver_enc, $otp_enc, $exp, $now]); + + jsonSuccess(null, 'OTP sent and saved successfully'); + + } catch (PDOException $e) { + jsonError('OTP sent but failed to save to database'); + } + +} else { + $errMsg = $response['message'] ?? 'Unknown error'; + jsonError('Failed to send OTP: ' . $errMsg); +} + +/* ----------------------------------------------------------------------- + * أبقينا callAPI() فقط إذا كان يُستخدم في ملفات أخرى – احذفه إن شئت. + * --------------------------------------------------------------------- */ +function callAPI($method, $url, $data) { /* … */ } +?> +``` + +## File: auth/document_syria/ai_document.php +``` + 'image/jpeg', + 'png' => 'image/png', + default => 'application/octet-stream', +}; + +$prompts = [ + "id_front_sy" => << << << << << << [ + ["role" => "user", "parts" => [["text" => $prompt]]], + ["role" => "user", "parts" => [["inlineData" => ["mimeType" => $mimeType, "data" => $imageBase64]]]] + ] +]; + +$ch = curl_init($apiURL); +curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); +curl_setopt($ch, CURLOPT_POST, true); +curl_setopt($ch, CURLOPT_HTTPHEADER, $headers); +curl_setopt($ch, CURLOPT_POSTFIELDS, json_encode($payload)); + +$response = curl_exec($ch); + +if (curl_errno($ch)) { + $error_msg = curl_error($ch); + error_log("CURL error: $error_msg"); + jsonError("AI Error: $error_msg"); + curl_close($ch); + exit; +} + +curl_close($ch); +error_log("AI raw response: $response"); + +$data = json_decode($response, true); +if (json_last_error() !== JSON_ERROR_NONE) { + error_log("JSON decode error: " . json_last_error_msg()); + jsonError("Failed to parse AI response"); + exit; +} + +$textRaw = $data['candidates'][0]['content']['parts'][0]['text'] ?? ''; +$textRaw = trim(preg_replace('/```json|```/', '', $textRaw)); +$json = json_decode($textRaw, true); + +$requiredKey = match ($type) { + 'id_front_sy' => 'national_number', + 'id_back_sy' => 'gender', + 'driving_license_sy' => 'license_type', + 'vehicle_license_sy' => 'chassis', + default => null, +}; + +if (!$json || ($requiredKey && !isset($json[$requiredKey]))) { + error_log("AI response missing required key '$requiredKey': $textRaw"); + jsonError("AI failed to extract required information"); + exit; +} + +printSuccess([ + "image_url" => $imageUrl, + "data" => $json +]); +``` + +## File: auth/document_syria/uploadDocSyria.php +``` +file($file['tmp_name']) ?: 'application/octet-stream'; +$allowedMime = ['image/jpeg', 'image/png']; +if (!in_array($mime, $allowedMime, true)) { + error_log("Unsupported MIME type: $mime"); + jsonError("Unsupported image MIME type"); + exit; +} + +// (اختياري) حد أقصى للحجم 10MB +$maxBytes = 10 * 1024 * 1024; +if ($file['size'] > $maxBytes) { + error_log("Image too large: {$file['size']} bytes"); + jsonError("Image too large (max 10MB)"); + exit; +} + +// 📁 مسارات الحفظ +$uploadDir = "../uploads/documents/"; +if (!is_dir($uploadDir)) { + if (!mkdir($uploadDir, 0755, true) && !is_dir($uploadDir)) { + error_log("Failed to create upload directory: $uploadDir"); + jsonError("Server error: cannot create upload directory"); + exit; + } +} + + +$baseName = "driver_{$type}_{$driverId}"; +$uniqueName = $baseName . "." . $extension; +$uploadPath = $uploadDir . $uniqueName; + +// ⬆️ نقل الملف +if (!move_uploaded_file($file['tmp_name'], $uploadPath)) { + error_log("Failed to move uploaded file to $uploadPath"); + jsonError("Failed to move uploaded image"); + exit; +} + +// 🔒 منع التنفيذ لو رُفع PHP بالخطأ +@chmod($uploadPath, 0644); + +// 🌐 توليد BASE_URL آمن (يدعم ENV أو يعتمد على المضيف الحالي) +if (!defined('BASE_URL')) { + $APP_BASE_URL = rtrim(getenv('APP_BASE_URL') ?: '', '/'); + if ($APP_BASE_URL === '') { + $scheme = isset($_SERVER['REQUEST_SCHEME']) ? $_SERVER['REQUEST_SCHEME'] : ((isset($_SERVER['HTTPS']) && $_SERVER['HTTPS'] !== 'off') ? 'https' : 'http'); + $host = $_SERVER['HTTP_HOST'] ?? 'localhost'; + define('BASE_URL', $scheme . '://' . $host); + } else { + define('BASE_URL', $APP_BASE_URL); + } +} + +// ⚙️ مسار الرابط العام (عدّل المسار حسب نشر مشروعك) +$publicPath = "/intaleq/auth/uploads/documents/" . $uniqueName; +$imageUrl = rtrim(BASE_URL, '/') . $publicPath; + +// ✅ نتيجة نهائية: فقط رابط الصورة وبعض البيانات المفيدة +printSuccess([ + $imageUrl, + +]); +``` + +## File: auth/Tester/getTesterApp.php +``` +prepare($sql); +$stmt->execute(); +$result = $stmt->fetchAll(PDO::FETCH_ASSOC); + +if ($stmt->rowCount() > 0) { + // Print the retrieved data + // echo json_encode($result); + jsonSuccess($data = $result); +} else { + // Print a failure message + + jsonError($message = "No driver order data found"); +} + +?> +``` + +## File: auth/Tester/updateTesterApp.php +``` +prepare($sql); +$stmt->execute(); + +if ($stmt->rowCount() > 0) { + // Print a success message + jsonSuccess($message = "Test data updated successfully"); +} else { + // Print a failure message + jsonError($message = "Failed to update driver order data"); +} +?> +``` + +## File: auth/passengerOTP/sendOtpPassenger.php +``` +prepare($sql); +$stmt->execute(); + +$rowCount = $stmt->rowCount(); + +if ($rowCount > 0) { + // The phone number already exists, so update the data + $sql = "UPDATE `phone_verification_passenger` SET `token_code` = '$token_code', `expiration_time` = DATE_ADD(NOW(), INTERVAL 5 MINUTE) WHERE `phone_number` = '$phone_number'"; + $stmt = $con->prepare($sql); + $stmt->execute(); + + if ($stmt->rowCount() > 0) { + // The update was successful + jsonSuccess($message = "Phone verification data updated successfully"); + } else { + // The update was unsuccessful + jsonError($message = "Failed to update phone verification data"); + } +} else { + // The phone number does not exist, so insert the data + $sql = "INSERT INTO `phone_verification_passenger` (`phone_number`, `token_code`, `expiration_time`, `is_verified`, `created_at`) VALUES ('$phone_number', '$token_code', DATE_ADD(NOW(), INTERVAL 5 MINUTE), 0, NOW())"; + $stmt = $con->prepare($sql); + $stmt->execute(); + + if ($stmt->rowCount() > 0) { + // The insertion was successful + jsonSuccess($message = "Phone verification data saved successfully"); + } else { + // The insertion was unsuccessful + jsonError($message = "Failed to save phone verification data"); + } +} +?> +``` + +## File: auth/passengerOTP/verifyOtpPassenger.php +``` +encryptData(filterRequest("phone_number")); +$token_code = $encryptionHelper->encryptData(filterRequest("token")); + +// error_log("phone=$phone_number, token=$token_code"); + +// Check if the phone number and token code match +$sql = "SELECT * FROM `phone_verification_passenger` WHERE `phone_number` = '$phone_number' AND `token` = '$token_code' +AND `verified` = 0 "; +// error_log("sql is =$sql"); + +$stmt = $con->prepare($sql); +$stmt->execute(); +$result = $stmt->fetch(); + +if ($result) { + // $id = $result["id"]; + $sql = "UPDATE `phone_verification_passenger` SET `verified` = 1 WHERE `phone_number` = '$phone_number'"; + $stmt = $con->prepare($sql); + $stmt->execute(); + + jsonSuccess($message = "Your phone number has been verified."); +} else { + jsonError($message = "Your phone number could not be verified. Please try again."); +} +?> +``` + +## File: serviceapp/getDriversPhoneNotComplete.php +``` += (NOW() - INTERVAL 6 DAY) -- تم الإنشاء خلال آخر 3 أيام +ORDER BY RAND() +LIMIT 1; + +"; + +$stmt = $con->prepare($sql); +$stmt->execute(); + +if ($stmt->rowCount() > 0) { + + $rows = $stmt->fetchAll(PDO::FETCH_ASSOC); + + // فك تشفير أرقام الهاتف والإيميل + foreach ($rows as &$r) { + + if (isset($r['phone_number']) && $r['phone_number'] != null) { + $r['phone_number'] = $encryptionHelper->decryptData($r['phone_number']); + } + + if (isset($r['email']) && $r['email'] != null) { + $r['email'] = $encryptionHelper->decryptData($r['email']); + } + } + + jsonSuccess($rows); + +} else { + jsonError("No phone numbers found in the last 5 days"); +} +?> + +``` + +## File: serviceapp/getCarPlateNotEdit.php +``` +prepare($sql); +$stmt->execute(); + +if ($stmt->rowCount() > 0) { + $rows = $stmt->fetchAll(PDO::FETCH_ASSOC); + + foreach ($rows as &$row) { + $row['vin'] = $encryptionHelper->decryptData($row['vin']); + $row['car_plate'] = $encryptionHelper->decryptData($row['car_plate']); + $row['owner'] = $encryptionHelper->decryptData($row['owner']); + $row['address'] = $encryptionHelper->decryptData($row['address']); + $row['phone'] = $encryptionHelper->decryptData($row['phone']); + } + + jsonSuccess($rows); +} else { + jsonError($message = "No Car verified yet found"); +} +?> + +``` + +## File: serviceapp/getDriverByPhone.php +``` +encryptData($phone); // تشفير الهاتف + +$sql = "SELECT + COALESCE( + ( + SELECT COUNT(*) FROM `ride` WHERE `ride`.`driver_id` = d.id + ), + 0) AS countRide, + + COALESCE( + ( + SELECT AVG(`ratingDriver`.`rating`) + FROM ratingDriver + WHERE `ratingDriver`.`driver_id` = d.id + ), + 0) AS rating, + + COALESCE( + ( + SELECT SUM(pd.amount) + FROM `payments` pd + WHERE pd.driverID = d.id + ), + 0) AS totalPayment, + + COALESCE( + ( + SELECT SUM(dw.amount) + FROM `driverWallet` dw + WHERE dw.driverID = d.id + ), + 0) AS totalDriverWallet, + + COALESCE( + ( + SELECT COUNT(*) + FROM complaint + WHERE complaint.driver_id = d.id + ), + 0) AS countComplaint, + + COALESCE( + ( + SELECT COUNT(*) + FROM driver_ride_scam scam + WHERE scam.driverID = d.id + ), + 0) AS countScam, + + COALESCE( + ( + SELECT complaint.description + FROM complaint + WHERE complaint.driver_id = d.id + ORDER BY complaint.date_resolved DESC + LIMIT 1 + ), + '' + ) AS complaint, + + COALESCE( + ( + SELECT COUNT(*) + FROM ratingPassenger + WHERE ratingPassenger.driverID = d.id + ), + 0) AS DRatingPassengersCount, + + COALESCE( + ( + SELECT AVG(ratingPassenger.rating) + FROM ratingPassenger + WHERE ratingPassenger.driverID = d.id + ), + 0) AS avgDRatingPassenger, + + cr.*, + d.* +FROM driver d +LEFT JOIN CarRegistration cr ON cr.driverID = d.id +WHERE d.phone = :phone; +"; + +$stmt = $con->prepare($sql); +$stmt->bindParam(':phone', $encryptedPhone); +$stmt->execute(); + +if ($stmt->rowCount() > 0) { + $row = $stmt->fetchAll(PDO::FETCH_ASSOC); + + // فك تشفير الحقول المهمة + foreach ($row as &$r) { + if (isset($r['phone'])) $r['phone'] = $encryptionHelper->decryptData($r['phone']); + if (isset($r['email'])) $r['email'] = $encryptionHelper->decryptData($r['email']); + if (isset($r['first_name'])) $r['first_name'] = $encryptionHelper->decryptData($r['first_name']); + if (isset($r['last_name'])) $r['last_name'] = $encryptionHelper->decryptData($r['last_name']); + if (isset($r['gender'])) $r['gender'] = $encryptionHelper->decryptData($r['gender']); + if (isset($r['birthdate'])) $r['birthdate'] = $encryptionHelper->decryptData($r['birthdate']); + if (isset($r['site'])) $r['site'] = $encryptionHelper->decryptData($r['site']); + if (isset($r['name_arabic'])) $r['name_arabic'] = $encryptionHelper->decryptData($r['name_arabic']); + if (isset($r['national_number'])) $r['national_number'] = $encryptionHelper->decryptData($r['national_number']); + if (isset($r['maritalStatus'])) $r['maritalStatus'] = $encryptionHelper->decryptData($r['maritalStatus']); + if (isset($r['sosPhone'])) $r['sosPhone'] = $encryptionHelper->decryptData($r['sosPhone']); + if (isset($r['car_plate'])) $r['car_plate'] = $encryptionHelper->decryptData($r['car_plate']); + if (isset($r['owner'])) $r['owner'] = $encryptionHelper->decryptData($r['owner']); + if (isset($r['address'])) $r['address'] = $encryptionHelper->decryptData($r['address']); + if (isset($r['vin'])) $r['vin'] = $encryptionHelper->decryptData($r['vin']); + unset($r['password']); + } + + jsonSuccess($row); +} else { + jsonError("No wallet record found"); +} +?> +``` + +## File: serviceapp/driverWhoregisterFfterCall.php +``` +prepare($sql); +$stmt->execute(); + +if ($stmt->rowCount() > 0) { + $row = $stmt->fetchAll(PDO::FETCH_ASSOC); + jsonSuccess($row); +} else { + jsonError("No driver records found with notes this month."); +} +?> +``` + +## File: serviceapp/getdriverWithoutCar.php +``` +prepare($sql); +$stmt->execute(); + +if ($stmt->rowCount() > 0) { + $rows = $stmt->fetchAll(PDO::FETCH_ASSOC); + + // فك التشفير للحقول الحساسة + foreach ($rows as &$row) { + $row['phone'] = $encryptionHelper->decryptData($row['phone']); + $row['name_arabic'] = $encryptionHelper->decryptData($row['name_arabic']); + } + + jsonSuccess($rows); +} else { + jsonError("No Car verified yet found"); +} +``` + +## File: serviceapp/login.php +``` + "failure", + "message" => "Email and password are required." + ]); + exit(); +} + +// SQL to check for user with provided email +$sql = "SELECT * FROM `users` WHERE `email` = :email"; + +$stmt = $con->prepare($sql); +$stmt->bindParam(':email', $email); +$stmt->execute(); + +$user = $stmt->fetch(PDO::FETCH_ASSOC); + +header('Content-Type: application/json'); // Ensure the response is JSON + +if ($user) { + // Verify the password + if ($password=== $user['password']) { + // Password is correct + unset($user['password']); // Remove password from the response + echo json_encode([ + "status" => "success", + "message" => "Login successful", + "data" => $user + ]); + } else { + // Password is incorrect + echo json_encode([ + "status" => "failure", + "message" => "Incorrect password", + "password"=>$password, + "password1"=>$user['password'], + ]); + } +} else { + // User not found + echo json_encode([ + "status" => "failure", + "message" => "User not found" + ]); +} + +$stmt = null; // Close the statement +$con = null; // Close the connection +exit(); // Ensure no further output +``` + +## File: serviceapp/getComplaintAllData.php +``` +prepare($sql); +$stmt->execute(); + +if ($stmt->rowCount() > 0) { + $row = $stmt->fetchAll(PDO::FETCH_ASSOC); + + foreach ($row as &$item) { + if (isset($item['passengerName'])) { + $item['passengerName'] = $encryptionHelper->decryptData($item['passengerName']); + } + if (isset($item['driverName'])) { + $item['driverName'] = $encryptionHelper->decryptData($item['driverName']); + } + if (isset($item['gender'])) { + $item['gender'] = $encryptionHelper->decryptData($item['gender']); + } + if (isset($item['driverToken'])) { + $item['driverToken'] = $encryptionHelper->decryptData($item['driverToken']); + } + if (isset($item['passengerToken'])) { + $item['passengerToken'] = $encryptionHelper->decryptData($item['passengerToken']); + } + } + + jsonSuccess($row); +} else { + jsonError("No wallet record found"); +} +?> +``` + +## File: serviceapp/getDriverNotCompleteRegistration.php +``` +prepare($sql); +$stmt->execute(); + +if ($stmt->rowCount() > 0) { + $rows = $stmt->fetchAll(PDO::FETCH_ASSOC); + + // فك تشفير أرقام الهواتف فقط للإخراج + foreach ($rows as &$row) { + if (!empty($row['phone'])) { + $row['phone'] = $encryptionHelper->decryptData($row['phone']); + } + if (!empty($row['email'])) { + $row['email'] = $encryptionHelper->decryptData($row['email']); + } + if (isset($row['phone_number'])) { + $row['phone_number'] = $encryptionHelper->decryptData($row['phone_number']); + } + } + + + jsonSuccess($rows); +} else { + jsonError("No Phone verified yet found"); +} +?> +``` + +## File: serviceapp/getPackages.php +``` +prepare($sql); +$stmt->execute(); +$passenger_data = $stmt->fetchAll(PDO::FETCH_ASSOC); + +if ($passenger_data) { + // Print the passenger data as JSON + jsonSuccess($data = $passenger_data); +} else { + // Print a failure message + jsonError($message = "No passenger data found"); +} +?> +``` + +## File: serviceapp/updateDriver.php +``` + $driverID]; + +foreach ($driverFieldsAllowed as $field) { + if (isset($_POST[$field]) && $_POST[$field] !== "") { + $value = filterRequest($field); + + if (in_array($field, $encryptedDriverFields)) { + $value = $encryptionHelper->encryptData($value); + } + + $driverSet[] = "`$field` = :$field"; + $driverParams[":$field"] = $value; + } +} + +// Execute Driver Update +$driverUpdated = false; +if (!empty($driverSet)) { + $driverSql = "UPDATE `driver` SET " . implode(", ", $driverSet) . " WHERE `id` = :id"; + $stmt = $con->prepare($driverSql); + $stmt->execute($driverParams); + $driverUpdated = $stmt->rowCount() > 0; +} + +/* --------------------------------------------------------- + CAR REGISTRATION TABLE +--------------------------------------------------------- */ +$carFieldsAllowed = [ + "id", "vin", "car_plate", "make", "model", "year", + "expiration_date", "color", "owner", "color_hex", "fuel", + "isDefault", "created_at", "status" +]; + +$carSet = []; +$carParams = [":driverID" => $driverID]; + +foreach ($carFieldsAllowed as $field) { + if ($field === "id") continue; // skip primary key in SET + if (isset($_POST[$field]) && $_POST[$field] !== "") { + $value = filterRequest($field); + $carSet[] = "`$field` = :$field"; + $carParams[":$field"] = $value; + } +} + +// Execute Car Update +$carUpdated = false; +if (!empty($carSet)) { + $carSql = "UPDATE `CarRegistration` SET " . implode(", ", $carSet) . " WHERE `driverID` = :driverID"; + $stmtCar = $con->prepare($carSql); + $stmtCar->execute($carParams); + $carUpdated = $stmtCar->rowCount() > 0; +} + +/* --------------------------------------------------------- + RESPONSE +--------------------------------------------------------- */ +if ($driverUpdated || $carUpdated) { + jsonSuccess(null, "Driver & Car updated successfully"); +} else { + jsonError("No changes were applied"); +} +?> + +``` + +## File: serviceapp/getDriverByNational.php +``` +encryptData($national_number); + +$sql = "SELECT + COALESCE( + ( + SELECT COUNT(*) FROM `ride` WHERE `ride`.`driver_id` = d.id + ), + 0) AS countRide, + + COALESCE( + ( + SELECT AVG(`ratingDriver`.`rating`) + FROM ratingDriver + WHERE `ratingDriver`.`driver_id` = d.id + ), + 0) AS rating, + + COALESCE( + ( + SELECT SUM(pd.amount) + FROM `payments` pd + WHERE pd.driverID = d.id + ), + 0) AS totalPayment, + + COALESCE( + ( + SELECT SUM(dw.amount) + FROM `driverWallet` dw + WHERE dw.driverID = d.id + ), + 0) AS totalDriverWallet, + + COALESCE( + ( + SELECT COUNT(*) + FROM complaint + WHERE complaint.driver_id = d.id + ), + 0) AS countComplaint, + + COALESCE( + ( + SELECT COUNT(*) + FROM driver_ride_scam scam + WHERE scam.driverID = d.id + ), + 0) AS countScam, + + COALESCE( + ( + SELECT complaint.description + FROM complaint + WHERE complaint.driver_id = d.id + ORDER BY complaint.date_resolved DESC + LIMIT 1 + ), + '' + ) AS complaint, + + COALESCE( + ( + SELECT COUNT(*) + FROM ratingPassenger + WHERE ratingPassenger.driverID = d.id + ), + 0) AS DRatingPassengersCount, + + COALESCE( + ( + SELECT AVG(ratingPassenger.rating) + FROM ratingPassenger + WHERE ratingPassenger.driverID = d.id + ), + 0) AS avgDRatingPassenger, + + cr.*, + d.* +FROM driver d +LEFT JOIN CarRegistration cr ON cr.driverID = d.id +WHERE d.national_number = :national_number; +"; +// 3. تم تعديل الشرط أعلاه للبحث بالرقم الوطني + +$stmt = $con->prepare($sql); +// 4. ربط الباراميتر الجديد +$stmt->bindParam(':national_number', $encryptedNationalNumber); +$stmt->execute(); + +if ($stmt->rowCount() > 0) { + $row = $stmt->fetchAll(PDO::FETCH_ASSOC); + + // فك تشفير الحقول المهمة + foreach ($row as &$r) { + if (isset($r['phone'])) $r['phone'] = $encryptionHelper->decryptData($r['phone']); + if (isset($r['email'])) $r['email'] = $encryptionHelper->decryptData($r['email']); + if (isset($r['first_name'])) $r['first_name'] = $encryptionHelper->decryptData($r['first_name']); + if (isset($r['last_name'])) $r['last_name'] = $encryptionHelper->decryptData($r['last_name']); + if (isset($r['gender'])) $r['gender'] = $encryptionHelper->decryptData($r['gender']); + if (isset($r['birthdate'])) $r['birthdate'] = $encryptionHelper->decryptData($r['birthdate']); + if (isset($r['site'])) $r['site'] = $encryptionHelper->decryptData($r['site']); + if (isset($r['name_arabic'])) $r['name_arabic'] = $encryptionHelper->decryptData($r['name_arabic']); + if (isset($r['national_number'])) $r['national_number'] = $encryptionHelper->decryptData($r['national_number']); + if (isset($r['maritalStatus'])) $r['maritalStatus'] = $encryptionHelper->decryptData($r['maritalStatus']); + if (isset($r['sosPhone'])) $r['sosPhone'] = $encryptionHelper->decryptData($r['sosPhone']); + if (isset($r['car_plate'])) $r['car_plate'] = $encryptionHelper->decryptData($r['car_plate']); + if (isset($r['owner'])) $r['owner'] = $encryptionHelper->decryptData($r['owner']); + if (isset($r['address'])) $r['address'] = $encryptionHelper->decryptData($r['address']); + if (isset($r['vin'])) $r['vin'] = $encryptionHelper->decryptData($r['vin']); + unset($r['password']); + } + + jsonSuccess($row); +} else { + // يمكنك تعديل الرسالة لتكون "No driver found" بدلاً من wallet record + jsonError("No record found for this national number"); +} +?> +``` + +## File: serviceapp/getEditorStatsCalls.php +``` +prepare($sql); + $stmt->execute(); + $data = $stmt->fetchAll(PDO::FETCH_ASSOC); + + if ($data) { + echo json_encode(array("status" => "success", "message" => $data)); + } else { + echo json_encode(array("status" => "success", "message" => [])); + } +} catch (PDOException $e) { + echo json_encode(array("status" => "failure", "message" => $e->getMessage())); +} +?> +``` + +## File: serviceapp/editCarPlate.php +``` +encryptData(filterRequest("carPlate")); +$color = filterRequest("color"); +$color_hex = filterRequest("color_hex"); +$make = filterRequest("make"); +$model = filterRequest("model"); +$expiration_date = filterRequest("expiration_date"); +$owner = $encryptionHelper->encryptData(filterRequest("owner")); +$year = filterRequest("year"); +$employee = filterRequest("employee"); + +// تحديث CarRegistration +$sqlUpdate = " + UPDATE `CarRegistration` + SET + `car_plate` = :carPlate, + `color` = :color, + `color_hex` = :color_hex, + `make` = :make, + `model` = :model, + `year` = :year, + `expiration_date` = :expiration_date, + `owner` = :owner + WHERE `driverID` = :driverId"; + +$stmtUpdate = $con->prepare($sqlUpdate); +$stmtUpdate->execute([ + ':carPlate' => $carPlate, + ':color' => $color, + ':color_hex' => $color_hex, + ':make' => $make, + ':model' => $model, + ':year' => $year, + ':expiration_date' => $expiration_date, + ':owner' => $owner, + ':driverId' => $driverId +]); + +if ($stmtUpdate->rowCount() > 0) { + // تسجيل التعديل + $sqlInsert = "INSERT INTO `carPlateEdit` + (`driverId`, `carPlate`, `color`, `make`, `model`, `expiration_date`, `owner`, `year`, `employee`, `isEdit`) + VALUES (:driverId, :carPlate, :color, :make, :model, :expiration_date, :owner, :year, :employee, 1)"; + $stmtInsert = $con->prepare($sqlInsert); + $stmtInsert->execute([ + ':driverId' => $driverId, + ':carPlate' => $carPlate, + ':color' => $color, + ':make' => $make, + ':model' => $model, + ':expiration_date' => $expiration_date, + ':owner' => $owner, + ':year' => $year, + ':employee' => $employee + ]); + + jsonSuccess(null, "Car data updated and edit logged successfully."); +} else { + jsonError("No changes were made to the car data."); +} +``` + +## File: serviceapp/getPassengersByPhone.php +``` +encryptData($phone); + +$sql = "SELECT + p.*, + COALESCE(r.id, 0) AS ride_id, + COALESCE(r.start_location, '') AS start_location, + COALESCE(r.end_location, '') AS end_location, + COALESCE(r.date, '1970-01-01') AS ride_date, + COALESCE(r.time, '00:00:00') AS ride_time, + COALESCE(r.endtime, '00:00:00') AS ride_endtime, + COALESCE(r.price, 0) AS price, + COALESCE(r.passenger_id, 0) AS ride_passenger_id, + COALESCE(r.driver_id, 0) AS driver_id, + COALESCE(r.status, '') AS ride_status, + COALESCE(r.paymentMethod, '') AS ride_payment_method, + COALESCE(r.carType, '') AS car_type, + COALESCE(r.created_at, '1970-01-01 00:00:00') AS ride_created_at, + COALESCE(r.updated_at, '1970-01-01 00:00:00') AS ride_updated_at, + COALESCE(r.DriverIsGoingToPassenger, 0) AS driver_is_going_to_passenger, + COALESCE(r.rideTimeStart, '1970-01-01 00:00:00') AS ride_time_start, + COALESCE(r.rideTimeFinish, '1970-01-01 00:00:00') AS ride_time_finish, + COALESCE(r.price_for_driver, 0) AS price_for_driver, + COALESCE(r.price_for_passenger, 0) AS price_for_passenger, + COALESCE(r.distance, 0) AS distance, + COALESCE(pw.balance, 0) AS passenger_wallet_balance, + COALESCE(pay.amount, 0) AS passenger_payment_amount, + COALESCE(pay.payment_method, '') AS passenger_payment_method, + COALESCE(dw.amount, 0) AS driver_payment_amount, + COALESCE(dw.paymentMethod, '') AS driver_payment_method +FROM + passengers p +LEFT JOIN + ride r ON p.id = r.passenger_id +LEFT JOIN + passengerWallet pw ON p.id = pw.passenger_id +LEFT JOIN + payments pay ON r.id = pay.rideId +LEFT JOIN + driverWallet dw ON r.driver_id = dw.driverID AND pay.id = dw.paymentID +WHERE + p.phone = :phone + AND r.id = ( + SELECT id + FROM ride + WHERE passenger_id = p.id + ORDER BY date DESC, time DESC + LIMIT 1 + )"; + +$stmt = $con->prepare($sql); +$stmt->bindParam(':phone', $phoneEncrypted); +$stmt->execute(); + +if ($stmt->rowCount() > 0) { + $rows = $stmt->fetchAll(PDO::FETCH_ASSOC); + + // فك التشفير للحقول الحساسة + foreach ($rows as &$row) { + if (isset($row['phone'])) $row['phone'] = $encryptionHelper->decryptData($row['phone']); + if (isset($row['email'])) $row['email'] = $encryptionHelper->decryptData($row['email']); + if (isset($row['gender'])) $row['gender'] = $encryptionHelper->decryptData($row['gender']); + if (isset($row['birthdate'])) $row['birthdate'] = $encryptionHelper->decryptData($row['birthdate']); + if (isset($row['site'])) $row['site'] = $encryptionHelper->decryptData($row['site']); + if (isset($row['first_name'])) $row['first_name'] = $encryptionHelper->decryptData($row['first_name']); + if (isset($row['last_name'])) $row['last_name'] = $encryptionHelper->decryptData($row['last_name']); + if (isset($row['employmentType']))$row['employmentType'] = $encryptionHelper->decryptData($row['employmentType']); + if (isset($row['maritalStatus'])) $row['maritalStatus'] = $encryptionHelper->decryptData($row['maritalStatus']); + unset($r['password']); + } + + jsonSuccess($rows); +} else { + jsonError("No wallet record found"); +} +?> +``` + +## File: serviceapp/addNotesPassenger.php +``` +encryptData($phone); + +// SQL query to insert into notesForPassengerService +$sql = "INSERT INTO `notesForPassengerService` (`phone`, `note`, `editor`) + VALUES (:phone, :note, :editor)"; + +// Prepare the statement +$stmt = $con->prepare($sql); +$stmt->bindParam(':phone', $encryptedPhone); +$stmt->bindParam(':note', $note); +$stmt->bindParam(':editor', $editor); + +// Execute and respond +$stmt->execute(); + +if ($stmt->rowCount() > 0) { + jsonSuccess(null, "Note inserted successfully"); +} else { + jsonError("Failed to insert note"); +} +?> +``` + +## File: serviceapp/updateDriverToActive.php +``` +beginTransaction(); + +try { + // --- 1. معالجة وتشفير البيانات --- + $nameArabic = $firstName . ' ' . $lastName; + $address = $site; + + // تشفير الحقول الحساسة + $encryptedFirstName = $encryptionHelper->encryptData($firstName); + $encryptedLastName = $encryptionHelper->encryptData($lastName); + $encryptedSite = $encryptionHelper->encryptData($site); + $encryptedAddress = $encryptionHelper->encryptData($address); + $encryptedNameArabic = $encryptionHelper->encryptData($nameArabic); + $encryptedNationalNumber = $encryptionHelper->encryptData($nationalNumber); + $encryptedOwner = $encryptionHelper->encryptData($owner); + $encryptedCarPlate = $encryptionHelper->encryptData($carPlate); + $encryptedBirthdate = $encryptionHelper->encryptData($birthdate); + $encryptedGender = $encryptionHelper->encryptData($gender); + + // --- 2. تحديث جدول السائق --- + $sqlDriver = "UPDATE `driver` SET + `first_name` = :first_name, + `last_name` = :last_name, + `site` = :site, + `address` = :address, + `national_number` = :national_number, + `license_categories` = :license_categories, + `expiry_date` = :expiry_date, + `issue_date` = :issue_date, + `gender` = :gender, + `birthdate` = :birthdate, + `name_arabic` = :name_arabic, + `maritalStatus` = :maritalStatus, + `status` = 'actives' + WHERE `id` = :driverId"; + + $stmtDriver = $con->prepare($sqlDriver); + $stmtDriver->execute([ + ':first_name' => $encryptedFirstName, + ':last_name' => $encryptedLastName, + ':site' => $encryptedSite, + ':address' => $encryptedAddress, + ':national_number' => $encryptedNationalNumber, + ':license_categories' => $licenseCategories, + ':expiry_date' => $expiryDate, + ':issue_date' => $licenseIssueDate, + ':gender' => $encryptedGender, + ':birthdate' => $encryptedBirthdate, + ':name_arabic' => $encryptedNameArabic, + ':driverId' => $driverId, + ':maritalStatus' =>$maritalStatus + ]); + + // --- 3. تحديث جدول السيارة --- + $sqlCar = "UPDATE `CarRegistration` SET + `owner` = :owner, + `color` = :color, + `color_hex` = :color_hex, + `model` = :model, + `car_plate` = :car_plate, + `make` = :make, + `fuel` = :fuel, + `year` = :year, + `expiration_date` = :expiration_date + WHERE `driverID` = :driverId"; + + $stmtCar = $con->prepare($sqlCar); + $stmtCar->execute([ + ':owner' => $encryptedOwner, + ':color' => $color, + ':color_hex' => $colorHex, + ':model' => $model, + ':car_plate' => $encryptedCarPlate, + ':make' => $make, + ':fuel' => $fuel, + ':year' => $year, + ':expiration_date' => $carExpirationDate, + ':driverId' => $driverId + ]); + + // --- 4. تأكيد المعاملة --- + $con->commit(); + jsonSuccess(["message" => "Driver and car data updated successfully."]); + + // --- 5. إرسال رسالة واتساب مبسطة وآمنة (باختيار رقم عشوائي) --- + + // 5.1. تعريف الأرقام + $supportPhones = ['0952475740', '0952475742']; // يمكنك إضافة المزيد من الأرقام هنا + + // 5.2. اختيار رقم عشوائي من القائمة + $randomIndex = array_rand($supportPhones); // يختار "مفتاح" عشوائي (index) + $phoneToUse = $supportPhones[$randomIndex]; // يحصل على الرقم من المفتاح + + + // --- !!! التعديل: إضافة رقم عشوائي --- + // هذا يضيف رقم عشوائي (4-6 خانات) لجعل الرسالة فريدة + $randomNumber = rand(1000, 999999); + + // 5.5. إعداد نص الرسالة بالرقم المتغير + $messageBody = "أهلاً وسهلاً كابتن $firstName 👋\n" + . "تم تفعيل حسابك على تطبيق *انطلق*.\n" + . "يمكنك الآن تسجيل الدخول والبدء بالعمل مباشرة.\n" + . "للمساعدة تواصل معنا على الرقم: $phoneToUse\n" // <-- تم استخدام المتغير العشوائي هنا + . "نتمنى لك عمل موفق 🚖\n\n" + . "معرف الرسالة: $randomNumber"; // <-- إضافة الرقم العشوائي + + // 5.6. إرسال الرسالة + sendWhatsAppFromServer($phone, $messageBody); + +} catch (Exception $e) { + // --- 6. التراجع في حال الخطأ --- + $con->rollBack(); + jsonError("An error occurred: " . $e->getMessage()); +} + +?> + + +``` + +## File: serviceapp/getNewDriverRegister.php +``` +prepare($sql); +$stmt->execute(); + +if ($stmt->rowCount() > 0) { + // Fetch the records + $rows = $stmt->fetchAll(PDO::FETCH_ASSOC); + +// فك التشفير للحقول الحساسة +foreach ($rows as &$row) { + $row['phone'] = $encryptionHelper->decryptData($row['phone']); + $row['email'] = $encryptionHelper->decryptData($row['email']); + $row['gender'] = $encryptionHelper->decryptData($row['gender']); + $row['birthdate'] = $encryptionHelper->decryptData($row['birthdate']); + $row['national_number'] = $encryptionHelper->decryptData($row['national_number']); + $row['site'] = $encryptionHelper->decryptData($row['site']); + $row['first_name'] = $encryptionHelper->decryptData($row['first_name']); + $row['last_name'] = $encryptionHelper->decryptData($row['last_name']); + // $row['employmentType'] = $encryptionHelper->decryptData($row['employmentType']); + // $row['maritalStatus'] = $encryptionHelper->decryptData($row['maritalStatus']); +} + +jsonSuccess($rows); +} else { + // Print a failure message + jsonError($message = "No Phone verified yet found"); +} + +?> +``` + +## File: serviceapp/getPassengersNotCompleteRegistration.php +``` += DATE_SUB(CURDATE(), INTERVAL 4 DAY) +ORDER BY + phone_verification_passenger.created_at DESC +LIMIT 25; +"; + +$stmt = $con->prepare($sql); +$stmt->execute(); + +$rows = $stmt->fetchAll(PDO::FETCH_ASSOC); + +// فك التشفير إذا كان مطلوباً (مثلاً إذا phone_number مشفّر) +foreach ($rows as &$row) { + if (isset($row['phone_number'])) { + $row['phone_number'] = $encryptionHelper->decryptData($row['phone_number']); + } + if (isset($row['note'])) { + $row['note'] = $encryptionHelper->decryptData($row['note']); // إذا كانت مضافة مشفّرة + } +} + +if ($rows) { + jsonSuccess($rows); +} else { + jsonError("No phone verified passengers found"); +} +?> +``` + +## File: serviceapp/updatePackages.php +``` +prepare($sql); +$stmt->execute(); +error_log("Updating package: ID = $sql, Version = $version"); + + +// Debugging: Check if the query affected any rows +if ($stmt->rowCount() > 0) { + // If rows were affected, print success + echo json_encode(['status' => 'success', 'message' => "Package version updated successfully for ID $id"]); +} else { + // If no rows were affected, print failure and debug the query + echo json_encode(['status' => 'failure', 'message' => "Failed to update package version. No rows affected. ID: $id, Version: $version"]); +} +?> +``` + +## File: serviceapp/addCartoDriver.php +``` +encryptData(filterRequest("vin")); +$carPlate = $encryptionHelper->encryptData(filterRequest("car_plate")); +$make = filterRequest("make"); +$model = filterRequest("model"); +$year = filterRequest("year"); +$expirationDate = filterRequest("expiration_date"); +$color = filterRequest("color"); +$owner = $encryptionHelper->encryptData(filterRequest("owner")); +$colorHex = filterRequest("color_hex"); +$address = $encryptionHelper->encryptData(filterRequest("address")); +$displacement = filterRequest("displacement"); +$fuel = filterRequest("fuel"); +$registrationDate = filterRequest("registration_date"); + +// تحقق من الحقول المطلوبة +if ( + is_null($driverID) || is_null($vin) || is_null($carPlate) || + is_null($make) || is_null($model) || is_null($year) || + is_null($expirationDate) || is_null($color) || is_null($owner) || + is_null($colorHex) || is_null($address) || is_null($displacement) || + is_null($fuel) || is_null($registrationDate) +) { + jsonError("One or more required parameters are missing."); + exit(); +} + +$con->beginTransaction(); + +try { + $checkSql = "SELECT * FROM `CarRegistration` WHERE `driverID` = :driverID"; + $checkStmt = $con->prepare($checkSql); + $checkStmt->bindParam(':driverID', $driverID); + $checkStmt->execute(); + + if ($checkStmt->rowCount() > 0) { + jsonError("Car has already been registered for this driver."); + exit(); + } + + // إدخال السيارة + $sqlInsert = "INSERT INTO `CarRegistration` ( + `driverID`, `vin`, `car_plate`, `make`, `model`, `year`, `expiration_date`, + `color`, `owner`, `color_hex`, `address`, `displacement`, `fuel`, `registration_date` + ) VALUES ( + :driverID, :vin, :carPlate, :make, :model, :year, :expirationDate, + :color, :owner, :colorHex, :address, :displacement, :fuel, :registrationDate + )"; + + $stmtInsert = $con->prepare($sqlInsert); + $stmtInsert->bindParam(':driverID', $driverID); + $stmtInsert->bindParam(':vin', $vin); + $stmtInsert->bindParam(':carPlate', $carPlate); + $stmtInsert->bindParam(':make', $make); + $stmtInsert->bindParam(':model', $model); + $stmtInsert->bindParam(':year', $year); + $stmtInsert->bindParam(':expirationDate', $expirationDate); + $stmtInsert->bindParam(':color', $color); + $stmtInsert->bindParam(':owner', $owner); + $stmtInsert->bindParam(':colorHex', $colorHex); + $stmtInsert->bindParam(':address', $address); + $stmtInsert->bindParam(':displacement', $displacement); + $stmtInsert->bindParam(':fuel', $fuel); + $stmtInsert->bindParam(':registrationDate', $registrationDate); + + $stmtInsert->execute(); + + if ($stmtInsert->rowCount() > 0) { + // سجل في carPlateEdit + $sqlLog = "INSERT INTO `carPlateEdit` + (`driverId`, `carPlate`, `color`, `make`, `model`, `expiration_date`, `owner`, `year`, `isEdit`) + VALUES (:driverID, :carPlate, :color, :make, :model, :expirationDate, :owner, :year, 0)"; + + $stmtLog = $con->prepare($sqlLog); + $stmtLog->bindParam(':driverID', $driverID); + $stmtLog->bindParam(':carPlate', $carPlate); + $stmtLog->bindParam(':color', $color); + $stmtLog->bindParam(':make', $make); + $stmtLog->bindParam(':model', $model); + $stmtLog->bindParam(':expirationDate', $expirationDate); + $stmtLog->bindParam(':owner', $owner); + $stmtLog->bindParam(':year', $year); + + $stmtLog->execute(); + + $con->commit(); + jsonSuccess(null, "Car registration data saved and logged successfully"); + } else { + $con->rollBack(); + jsonError("Failed to save car registration data"); + } +} catch (Exception $e) { + $con->rollBack(); + jsonError("An error occurred: " . $e->getMessage()); +} +?> +``` + +## File: serviceapp/addWelcomeDriverNote.php +``` +prepare($sql); + +// Bind parameters +$stmt->bindParam(':driverId', $driverId); +$stmt->bindParam(':notes', $notes); + +// Execute the statement +$success = $stmt->execute(); + +if ($success) { + jsonSuccess(null, "Record inserted/updated successfully"); +} else { + jsonError("Failed to insert or update record"); +} + +?> + +``` + +## File: serviceapp/drivers_list.txt +``` +Phone: 963995473295 | Note: No Note +Phone: 963932997741 | Note: No Note +Phone: 963946792550 | Note: No Note +Phone: | Note: لا يوجد رقم +Phone: 963930124895 | Note: No Note +Phone: 963932845375 | Note: No Note +Phone: 9630937563437 | Note: No Note +Phone: 963937563437 | Note: No Note +Phone: 963933014381 | Note: No Note +Phone: 963940740211 | Note: No Note +Phone: 963997731147 | Note: No Note +Phone: 9630982494498 | Note: No Note +Phone: 963982494498 | Note: No Note +Phone: 963936780435 | Note: No Note +Phone: 963932894042 | Note: No Note +Phone: 963955609157 | Note: No Note +Phone: 963943433943 | Note: No Note +Phone: 963934020587 | Note: No Note +Phone: 963991486923 | Note: No Note +Phone: 963930246282 | Note: No Note +Phone: 963936388893 | Note: No Note +Phone: 963965444917 | Note: No Note +Phone: 963968622928 | Note: No Note +Phone: 963941588818 | Note: No Note +Phone: 9630941588818 | Note: No Note +Phone: 963998557963 | Note: No Note +Phone: 963995737121 | Note: ماعندو واتس وخطو مسكر +Phone: 963996673522 | Note: No Note +Phone: 963992159193 | Note: No Note +Phone: 963933231038 | Note: No Note +Phone: 963990320212 | Note: تم +Phone: 963991918177 | Note: No Note +Phone: 963962293692 | Note: No Note +Phone: 963980043065 | Note: No Note +Phone: 963933665775 | Note: No Note +Phone: 963997678811 | Note: No Note +Phone: 963935541277 | Note: No Note +Phone: 963937173449 | Note: تم +Phone: 963998235145 | Note: No Note +Phone: 963991514602 | Note: No Note +Phone: 963993725589 | Note: No Note +Phone: 963939761870 | Note: No Note +Phone: 963956825657 | Note: No Note +Phone: 963933642491 | Note: No Note +Phone: 963956906783 | Note: No Note +Phone: 9630956906783 | Note: No Note +Phone: 9630936984029 | Note: No Note +Phone: 963941418151 | Note: No Note +Phone: 9630941418151 | Note: No Note +Phone: 963981237272 | Note: No Note +Phone: 963933897890 | Note: No Note +Phone: 963944344937 | Note: No Note +Phone: 963993828902 | Note: No Note +Phone: 963933659200 | Note: No Note +Phone: 963955414963 | Note: No Note +Phone: 963942024560 | Note: No Note +Phone: 9639494022840 | Note: No Note +Phone: 9639639362485 | Note: No Note +Phone: 963965833448 | Note: مشغول +Phone: 9630930291349 | Note: بدو يفعل +Phone: 963945267161 | Note: تم +Phone: 9630934627741 | Note: No Note +Phone: 963934627741 | Note: No Note +Phone: 963935777840 | Note: No Note +Phone: 963994436621 | Note: No Note +Phone: 963940031237 | Note: No Note +Phone: 963957833531 | Note: No Note +Phone: 963943949925 | Note: No Note +Phone: 963953263161 | Note: ما برن +Phone: 963980486635 | Note: No Note +Phone: 963٩٩٢٩٩٩٠٨٣ | Note: No Note +Phone: 963950505715 | Note: No Note +Phone: 963934443912 | Note: كان بدو يشتري سيارة وفقست بس يكفي رح يسجل +Phone: 963945452222 | Note: رح يكفي تسجيل +Phone: 963948899644 | Note: No Note +Phone: 963937525133 | Note: رح يكفي تسجيل +Phone: 963934441423 | Note: No Note +Phone: 963968044972 | Note: تم التواصل +Phone: 963984137014 | Note: مابدو +Phone: 963796377987 | Note: No Note +Phone: 963988455623 | Note: No Note +Phone: 9630939386057 | Note: No Note +Phone: 963939386057 | Note: No Note +Phone: 963966880940 | Note: تم +Phone: 963932928765 | Note: تم +Phone: 963993641405 | Note: تم +Phone: 963933027735 | Note: No Note +Phone: 963933433725 | Note: تم +Phone: 963988870417 | Note: تم +Phone: 963951670237 | Note: تم +Phone: 963930795196 | Note: تم +Phone: 963991960766 | Note: تم +Phone: 963935998441 | Note: تم +Phone: 963947938918 | Note: تم +Phone: 963992435599 | Note: تم +Phone: 963954364865 | Note: تم +Phone: 963995438666 | Note: تم +Phone: 963991420279 | Note: تم +Phone: 963933969836 | Note: تم +Phone: 963095874505 | Note: الرقم خطأ +Phone: 963933586167 | Note: تم +Phone: 963997791974 | Note: تم +Phone: 963938092584 | Note: تم +Phone: 963936412209 | Note: تم +Phone: 963993998201 | Note: تم +Phone: 963954845028 | Note: No Note +Phone: 963985472276 | Note: No Note +Phone: 963983727779 | Note: تم +Phone: 963935005982 | Note: تم +Phone: 963996095507 | Note: No Note +Phone: 963993952009 | Note: تم +Phone: 9630993952009 | Note: No Note +Phone: 963940056304 | Note: تم +Phone: 963995797246 | Note: تم +Phone: 963993492062 | Note: No Note +Phone: 963988493310 | Note: تم +Phone: 971567312720 | Note: No Note +Phone: 963991748590 | Note: تم +Phone: 963996807389 | Note: تم +Phone: 963933624099 | Note: تم +Phone: 963981997355 | Note: تم +Phone: 9630983758855 | Note: تم +Phone: 963986198636 | Note: No Note +Phone: 963932392061 | Note: No Note +Phone: 963944087759 | Note: No Note +Phone: 9630944087759 | Note: No Note +Phone: 963996489269 | Note: No Note +Phone: 963956465908 | Note: No Note +Phone: 963937829076 | Note: No Note +Phone: 963952398851 | Note: No Note +Phone: 963947785627 | Note: No Note +Phone: 963944725825 | Note: No Note +Phone: 963985041549 | Note: No Note +Phone: 963992485425 | Note: No Note +Phone: 963990462939 | Note: No Note +Phone: 963997451873 | Note: No Note +Phone: 9630992952235 | Note: No Note +Phone: 963991543059 | Note: No Note +Phone: 963938800414 | Note: No Note +Phone: 963955915110 | Note: No Note +Phone: 963933436896 | Note: No Note +Phone: 963962203899 | Note: No Note +Phone: 963980561370 | Note: No Note +Phone: 963938449446 | Note: No Note +Phone: 963933989564 | Note: No Note +Phone: 963952726606 | Note: No Note +Phone: 963954152143 | Note: No Note +Phone: 963095272660 | Note: No Note +Phone: 963985131776 | Note: No Note +Phone: 963093184436 | Note: No Note +Phone: 963933751093 | Note: No Note +Phone: 963937475542 | Note: No Note +Phone: 963944619801 | Note: No Note +Phone: 963994776559 | Note: No Note +Phone: 963931802363 | Note: No Note +Phone: 963986312807 | Note: No Note +Phone: 963933502898 | Note: No Note +Phone: 963992667679 | Note: No Note +Phone: 963988514496 | Note: No Note +Phone: 963954251613 | Note: No Note +Phone: 963955630089 | Note: No Note +Phone: 963096491319 | Note: رقم غلط +Phone: 963999352010 | Note: تم +Phone: 963997823542 | Note: No Note +Phone: 963935561540 | Note: No Note +Phone: 963991907984 | Note: تم التواصل +Phone: 963963992952 | Note: غير موضوع بالخدمة +Phone: 919154792561 | Note: غلط +Phone: 963095371707 | Note: غير صحيح +Phone: 963964701914 | Note: تم +Phone: 963991175918 | Note: No Note +Phone: 963962215103 | Note: تم +Phone: 963099295223 | Note: خطأ +Phone: 963990368364 | Note: تم التواصل +Phone: 963931447359 | Note: No Note +Phone: 963994875810 | Note: تم التواصل +Phone: 963998047263 | Note: تم التواصل +Phone: 963988892598 | Note: تم التواصل +Phone: 963996136343 | Note: تم التواصل +Phone: 963934245841 | Note: تم التواصل +Phone: 963933944881 | Note: تم التواصل +Phone: 963993484762 | Note: تم التواصل +Phone: 963997386925 | Note: تم التواصل +Phone: 963955300562 | Note: تم التواصل +Phone: 963099123427 | Note: الرقم خطأ +Phone: 963998752835 | Note: تم التواصل +Phone: 963986164501 | Note: تم التواصل +Phone: 963994221981 | Note: تم +Phone: 963985111107 | Note: تم +Phone: 963965665584 | Note: تم +Phone: 963093309389 | Note: الرقم خطأ +Phone: 963933009411 | Note: تم التواصل +Phone: 963997226674 | Note: تم التواصل +Phone: 963985322261 | Note: تم التواصل +Phone: 963944585751 | Note: تم +Phone: 963936520446 | Note: تم +Phone: 963942272548 | Note: تم +Phone: 963932784840 | Note: تم +Phone: 963966337233 | Note: تم +Phone: 963982498933 | Note: تم +Phone: 963934792333 | Note: تم +Phone: 963992323421 | Note: No Note +Phone: 963937512107 | Note: تم +Phone: 963095247574 | Note: No Note +Phone: 963994800068 | Note: تم +Phone: 963955809725 | Note: No Note +Phone: 963933823485 | Note: No Note +Phone: 963949204755 | Note: تم +Phone: 963983691808 | Note: No Note +Phone: 963983626721 | Note: No Note +Phone: 963981610336 | Note: No Note +Phone: 963937927500 | Note: No Note +Phone: 963959853846 | Note: No Note +Phone: 963997073925 | Note: تم +Phone: 963956732767 | Note: غلط +Phone: 963947021104 | Note: تم +Phone: 963940052998 | Note: تم +Phone: 963944662446 | Note: تم +Phone: 963982678522 | Note: تم +Phone: 963962135909 | Note: تم +Phone: 963936610855 | Note: تم التواصل +Phone: 963994299736 | Note: تم التواصل +Phone: 963994202784 | Note: تم التواصل +Phone: 963938506392 | Note: تم التواصل +Phone: 963996355773 | Note: تم التواصل +Phone: 963993211641 | Note: تم التواصل +Phone: 963958885#01 | Note: خطأ +Phone: 963993214588 | Note: تم التواصل +Phone: 963930690439 | Note: تم التواصل +Phone: 963981320471 | Note: No Note +Phone: 963958749567 | Note: No Note +Phone: 963955399707 | Note: السيارة بالتصليح +Phone: 963981661357 | Note: تم +Phone: 963935151385 | Note: تم +Phone: 963933524019 | Note: تم +Phone: 963969079332 | Note: تم +Phone: 963982380563 | Note: تم +Phone: 963998817414 | Note: تم +Phone: 963962864640 | Note: تم +Phone: 963954932302 | Note: تم +Phone: 963951628380 | Note: No Note +Phone: 963956742311 | Note: تم +Phone: 963988605516 | Note: No Note +Phone: 963933122432 | Note: No Note +Phone: 963943562177 | Note: No Note +Phone: 963936700433 | Note: No Note +Phone: 963991539595 | Note: No Note +Phone: 963997634135 | Note: No Note +Phone: 963954512319 | Note: No Note +Phone: 963991392595 | Note: No Note +Phone: 963930053897 | Note: No Note +Phone: 963941494393 | Note: No Note +Phone: 963938963278 | Note: No Note +Phone: 963996725663 | Note: No Note +Phone: 963932998203 | Note: No Note +Phone: 963984743097 | Note: No Note +Phone: 963+20952653 | Note: No Note +Phone: 963933263408 | Note: No Note +Phone: 963992603003 | Note: No Note +Phone: 963999186608 | Note: No Note +Phone: 963093319092 | Note: No Note +Phone: 963992200572 | Note: No Note +Phone: 963935860379 | Note: تم التواصل +Phone: 963932612511 | Note: No Note +Phone: 963955665828 | Note: No Note +Phone: 963958748659 | Note: No Note +Phone: 963948956757 | Note: No Note +Phone: 963991527216 | Note: No Note +Phone: 963967434852 | Note: No Note +Phone: 963933473946 | Note: No Note +Phone: 963959281303 | Note: No Note +Phone: 963937506427 | Note: No Note +Phone: 963945017743 | Note: No Note +Phone: 963941973355 | Note: No Note +Phone: 963969369322 | Note: No Note +Phone: 963935221144 | Note: No Note +Phone: 963991933762 | Note: No Note +Phone: 963991331539 | Note: No Note +Phone: 963995940170 | Note: No Note +Phone: 963996450146 | Note: No Note +Phone: 963942283959 | Note: No Note +Phone: 963936825881 | Note: No Note +Phone: 963994058290 | Note: تم التواصل +Phone: 963980387211 | Note: No Note +Phone: 963960003815 | Note: No Note +Phone: 963938705215 | Note: No Note +Phone: 963930097924 | Note: No Note +Phone: 963982872652 | Note: تم التواصل +Phone: 963985327571 | Note: No Note +Phone: 963958786360 | Note: No Note +Phone: 963968840086 | Note: No Note +Phone: 963937536957 | Note: No Note +Phone: 963953925409 | Note: No Note +Phone: 963947157325 | Note: No Note +Phone: 963981489190 | Note: No Note +Phone: 963937583931 | Note: No Note +Phone: 963949631384 | Note: No Note +Phone: 963953344805 | Note: No Note +Phone: 963930104547 | Note: No Note +Phone: 963952300665 | Note: No Note +Phone: 963095230066 | Note: No Note +Phone: 963988510023 | Note: No Note +Phone: 963992274229 | Note: No Note +Phone: 963991506951 | Note: تم التواصل +Phone: 963954894895 | Note: تم التواصل +Phone: 963955585012 | Note: خارج الخدمة +Phone: 963996307122 | Note: تم التواصل +Phone: 963991610683 | Note: تم التواصل +Phone: 963991355714 | Note: تم التواصل +Phone: 963937557764 | Note: تم التواصل +Phone: 963988514321 | Note: تم التواصل +Phone: 963944077035 | Note: تم التواصل +Phone: 963938129427 | Note: تم التواصل +Phone: 963990444099 | Note: تم التواصل +Phone: 963956786668 | Note: تم التواصل +Phone: 963940728564 | Note: تم التواصل +Phone: 963954402659 | Note: خارج الخدمة وتس واتصال +Phone: 963936765364 | Note: تم التواصل +Phone: 963933078901 | Note: تم التواصل +Phone: 963934417178 | Note: تم التواصل +Phone: 963930447695 | Note: تم التواصل +Phone: 963094051564 | Note: الرقم خطأ +Phone: 963992417040 | Note: تم التواصل +Phone: 963958922780 | Note: تم الاتصال سكودا +Phone: 963951379303 | Note: تم التواصل +Phone: 963953858808 | Note: تم التواصل +Phone: 963964646415 | Note: تم التواصل +Phone: 963960098818 | Note: تم التواصل +Phone: 963933899771 | Note: تم التواصل +Phone: 963096949698 | Note: الرقم خطأ +Phone: 963982861634 | Note: No Note +Phone: 963938252876 | Note: No Note +Phone: 963986561347 | Note: No Note +Phone: 963933700937 | Note: No Note +Phone: 963960078368 | Note: No Note +Phone: 963933737355 | Note: No Note +Phone: 963983755054 | Note: hvta +Phone: 963940907547 | Note: No Note +Phone: 963949757956 | Note: No Note +Phone: 963938938514 | Note: No Note +Phone: 963980457705 | Note: No Note +Phone: 963944404002 | Note: No Note +Phone: 963965410313 | Note: No Note +Phone: 963982325766 | Note: No Note +Phone: 963981289181 | Note: No Note +Phone: 963993462192 | Note: No Note +Phone: 963968504915 | Note: No Note +Phone: 963936628380 | Note: No Note +Phone: 963951366246 | Note: No Note +Phone: 963998727408 | Note: No Note +Phone: 963953877512 | Note: No Note +Phone: 963940478435 | Note: No Note +Phone: 963984625505 | Note: No Note +Phone: 963954659494 | Note: No Note +Phone: 963947653804 | Note: No Note +Phone: 963959218092 | Note: No Note +Phone: 963994511053 | Note: No Note +Phone: 963938341514 | Note: No Note +Phone: 963982672582 | Note: No Note +Phone: 963992495126 | Note: No Note +Phone: 963993163487 | Note: No Note +Phone: 963966516151 | Note: No Note +Phone: 963958472195 | Note: No Note +Phone: 963954611914 | Note: No Note +Phone: 963940865211 | Note: No Note +Phone: 963955875120 | Note: No Note +Phone: 963985347924 | Note: No Note +Phone: 963951450015 | Note: No Note +Phone: 963991449908 | Note: No Note +Phone: 963939715983 | Note: No Note +Phone: 963932166786 | Note: No Note +Phone: 963932334792 | Note: No Note +Phone: 963998615843 | Note: No Note +Phone: 963995232226 | Note: No Note +Phone: 963983772298 | Note: No Note +Phone: 963988736467 | Note: No Note +Phone: 963959109269 | Note: No Note +Phone: 963934770200 | Note: No Note +Phone: 963995149210 | Note: No Note +Phone: 963985665216 | Note: No Note +Phone: 963962423870 | Note: No Note +Phone: 963939894588 | Note: No Note +Phone: 963930018143 | Note: No Note +Phone: 963944940930 | Note: No Note +Phone: 963930354266 | Note: No Note +Phone: 963952380026 | Note: No Note +Phone: 963932838183 | Note: No Note +Phone: 963988131966 | Note: No Note +Phone: 963993300063 | Note: No Note +Phone: 963949754561 | Note: No Note +Phone: 963935927218 | Note: No Note +Phone: 963935595928 | Note: No Note +Phone: 963949282497 | Note: No Note +Phone: 963934392382 | Note: No Note +Phone: 963937593945 | Note: No Note +Phone: 963938883892 | Note: No Note +Phone: 963093727926 | Note: No Note +Phone: 963999062031 | Note: No Note +Phone: 963938059209 | Note: No Note +Phone: 963964685561 | Note: No Note +Phone: 963944344299 | Note: No Note +Phone: 963955355766 | Note: No Note +Phone: 963999823383 | Note: No Note +Phone: 963944439897 | Note: No Note +Phone: 963995127821 | Note: No Note +Phone: 963994257265 | Note: No Note +Phone: 963936490987 | Note: No Note +Phone: 963993530236 | Note: No Note +Phone: 963 959 503 | Note: No Note +Phone: 963986797797 | Note: No Note +Phone: 963933529331 | Note: No Note +Phone: 963951343947 | Note: No Note +Phone: 963997585651 | Note: No Note +Phone: 963991907052 | Note: No Note +Phone: 963988964744 | Note: No Note +Phone: 963099161662 | Note: No Note +Phone: 963933175809 | Note: No Note +Phone: 963937590105 | Note: No Note +Phone: 963984222103 | Note: No Note +Phone: 963099467874 | Note: No Note +Phone: 963930301422 | Note: No Note +Phone: 963988561330 | Note: No Note +Phone: 963986769366 | Note: No Note +Phone: 963940554896 | Note: No Note +Phone: 963934825832 | Note: No Note +Phone: 963980823984 | Note: No Note +Phone: 963993761215 | Note: No Note +Phone: 963+96399339 | Note: No Note +Phone: 963992811392 | Note: No Note +Phone: 963993292569 | Note: No Note +Phone: 963985774901 | Note: No Note +Phone: 963992475789 | Note: No Note +Phone: 963995953364 | Note: No Note +Phone: 96385166225 | Note: No Note +Phone: 96398516622 | Note: No Note +Phone: 963935689658 | Note: No Note +Phone: 963933572705 | Note: No Note +Phone: 963935722215 | Note: No Note +Phone: 963981140916 | Note: No Note +Phone: 963985215116 | Note: No Note +Phone: 963932762035 | Note: No Note +Phone: 963946120103 | Note: No Note +Phone: 963933818455 | Note: No Note +Phone: 963964858616 | Note: No Note +Phone: 963944390916 | Note: No Note +Phone: 963945739489 | Note: No Note +Phone: 963932776772 | Note: No Note +Phone: 963933333813 | Note: No Note +Phone: 963980874584 | Note: No Note +Phone: 963980294990 | Note: No Note +Phone: 963934185580 | Note: No Note +Phone: 963936921204 | Note: No Note +Phone: 963093554127 | Note: No Note +Phone: 963095965191 | Note: No Note +Phone: 963093352887 | Note: No Note +Phone: 963988128853 | Note: No Note +Phone: 963094729812 | Note: No Note +Phone: 963998748039 | Note: No Note +Phone: 963955374066 | Note: تم +Phone: 963095537406 | Note: No Note +Phone: 963949005027 | Note: تم +Phone: 963959651915 | Note: لاااااا +Phone: 963094906005 | Note: No Note +Phone: 963988617564 | Note: No Note +Phone: 963992652773 | Note: No Note +Phone: 963996727211 | Note: No Note +Phone: 963991363270 | Note: No Note +Phone: 963946790074 | Note: No Note +Phone: 963939297072 | Note: No Note +Phone: 963991197416 | Note: No Note +Phone: 963980362067 | Note: No Note +Phone: 963987076781 | Note: No Note +Phone: 963945458695 | Note: No Note +Phone: 963936408390 | Note: No Note +Phone: 963991431763 | Note: No Note +Phone: 963964795089 | Note: No Note +Phone: 963965800050 | Note: No Note +Phone: 963953677959 | Note: No Note +Phone: 963099310584 | Note: No Note +Phone: 963934108410 | Note: No Note +Phone: 963944498647 | Note: No Note +Phone: 963943569855 | Note: No Note +Phone: 963992000214 | Note: No Note +Phone: 963988733184 | Note: No Note +Phone: 963997357928 | Note: No Note +Phone: 963968217127 | Note: No Note +Phone: 963984213886 | Note: No Note +Phone: 963969955380 | Note: No Note +Phone: 963093039426 | Note: No Note +Phone: 963993067534 | Note: No Note +Phone: 963996882906 | Note: No Note +Phone: 963930981086 | Note: No Note +Phone: 2979639929 | Note: No Note +Phone: 963948320564 | Note: No Note +Phone: 963933236526 | Note: No Note +Phone: 963935731025 | Note: No Note +Phone: 963940005693 | Note: No Note +Phone: 963093435196 | Note: No Note +Phone: 963933147140 | Note: رح يكمل تسجيل +Phone: 963982950096 | Note: عم يصلح سيارتو بس تجهز رح يكمل تسجيل +Phone: 963992304426 | Note: سيارتو جيب مصروفات كبير +Phone: 963093412182 | Note: رقمو غلط +Phone: 963944707024 | Note: راح النت من عندو واليوم رح يرجع يسجل +Phone: 963997952574 | Note: No Note +Phone: 963932863040 | Note: سيارتو بالتصليح +Phone: 963942074619 | Note: مابدو +Phone: 963934146486 | Note: تم التواصل +Phone: 963992566299 | Note: تم التواصل +Phone: 96348‏‪94573 | Note: رقم غلط +Phone: 963933383373 | Note: تم التواصل +Phone: 963962419880 | Note: تم التواصل +Phone: 963938105556 | Note: تم التواصل +Phone: 963981347112 | Note: تم التواصل +Phone: 963959052791 | Note: تم التواصل +Phone: 963949608050 | Note: تم التواصل +Phone: 963998977934 | Note: تم التواصل +Phone: 963931839232 | Note: تم التواصل +Phone: 963935140176 | Note: تم التواصل +Phone: 963932033543 | Note: تم التواصل +Phone: 963991172711 | Note: تم التواصل +Phone: 963959164134 | Note: تم التواصل +Phone: 963943919419 | Note: ماعندو واتس رقمو مسكر +Phone: 963994000556 | Note: تم التواصل +Phone: 963098084512 | Note: رقم غلط +Phone: 963932254575 | Note: تم التواصل +Phone: 963945117692 | Note: تم التواصل +Phone: 963932119678 | Note: تم التواصل +Phone: 963993034046 | Note: تم التواصل +Phone: 963954183741 | Note: تم التواصل +Phone: 963951433826 | Note: ماعندو واتس خطو مسكر +Phone: 963093661085 | Note: رقم غلط +Phone: 963998287801 | Note: تم التواصل +Phone: 963988912182 | Note: ماعندو واتس +Phone: 963996024113 | Note: تم التواصل +Phone: 963931677655 | Note: تم التواصل +Phone: 963933921336 | Note: تم التواصل +Phone: 963936374163 | Note: تم التواصل +Phone: 963942047365 | Note: تم التواصل +Phone: 963981360800 | Note: تم التواصل +Phone: 963956396223 | Note: تم التواصل +Phone: 963963899416 | Note: رقم غلط +Phone: 963934493911 | Note: تم التواصل +Phone: 963934950868 | Note: تم التواصل +Phone: 963936659081 | Note: تم التواصل +Phone: 963945973939 | Note: تم التواصل +Phone: 963983444102 | Note: تم التواصل +Phone: 963951844719 | Note: تم التواصل +Phone: 963932663633 | Note: تم التواصل +Phone: 963093266363 | Note: رقم غلط +Phone: 963937271849 | Note: تم التواصل معو بيك اب +Phone: 963938728361 | Note: تم التواصل +Phone: 963947640146 | Note: تم التواصل +Phone: 963992439500 | Note: No Note +Phone: 963997489672 | Note: تم التواصل +Phone: 963094850489 | Note: رقم غلط +Phone: 963990115156 | Note: تم التواصل +Phone: 963962311317 | Note: ماعندو واتس وخطو مسكر +Phone: 963093172947 | Note: الرقم غلط +Phone: 963993762515 | Note: تم التواصل +Phone: 963931799545 | Note: تم التواصل +Phone: 963945187714 | Note: تم التواصل +Phone: 963968911015 | Note: ماعندو واتس رقمو مسكر +Phone: 963944750715 | Note: تم التواصل +Phone: 963998134492 | Note: تم التواصل +Phone: 963099813449 | Note: رقمو غلط +Phone: 963932727476 | Note: تم التواصل +Phone: 963933518336 | Note: تم التواصل +Phone: 963998885309 | Note: تم التواصل +Phone: 963988248185 | Note: تم التواصل +Phone: 963093067938 | Note: No Note +Phone: 963981383714 | Note: تم التواصل +Phone: 963939362191 | Note: رقمو مغلق وماعندو واتس +Phone: 963933440323 | Note: تم التواصل +Phone: 963982143227 | Note: تم التواصل +Phone: 963938145916 | Note: تم التواصل +Phone: 963933718454 | Note: تم التواصل +Phone: 963931800533 | Note: تم التواصل +Phone: 963934294133 | Note: تم التواصل +Phone: 963939808314 | Note: رقم غلط ومسكر خطو +Phone: 963935745914 | Note: تم التواصل +Phone: 963969902667 | Note: تم التواصل +Phone: 963933735326 | Note: ماعندو واتس رقمو غلط +Phone: 963998699541 | Note: تم التواصل +Phone: 963093333839 | Note: رقم غلط +Phone: 963966313126 | Note: تم التواصل +Phone: 963956451887 | Note: تم التواصل +Phone: 963967415296 | Note: تم التواصل +Phone: 963997766064 | Note: تم التواصل +Phone: 963962854801 | Note: تم التواصل +Phone: 963998190089 | Note: تم التواصل +Phone: 963981634358 | Note: تم التواصل +Phone: 963938289156 | Note: تم التواصل +Phone: 963095645188 | Note: رقم غلط +Phone: 963936908818 | Note: تم التواصل +Phone: 963941385190 | Note: تم التواصل +Phone: 963009639885 | Note: رقم غلط +Phone: 963935777750 | Note: تم التواصل +Phone: 963985578199 | Note: تم التواصل +Phone: 963099317895 | Note: رقم غلط +Phone: 963990417834 | Note: تم التواصل +Phone: 963093727184 | Note: رقم غلط +Phone: 963968750666 | Note: ماعندو واتس ورقمو مسكر +Phone: 963998668125 | Note: تم التواصل +Phone: 963991833068 | Note: تم التواصل +Phone: 963940740151 | Note: ماعندي واتس ورقمو مسكر +Phone: 963955544813 | Note: تم التواصل +Phone: 963933202022 | Note: ماعندو واتساب ورخطو مسكر +Phone: 963933221881 | Note: ماعندو واتس وخطو مسكر +Phone: 963943358179 | Note: تم التواصل +Phone: 963+96393349 | Note: رقم غلط +Phone: 963933804760 | Note: تم التواصل +Phone: 963988214321 | Note: تم التواصل +Phone: 963991903251 | Note: تم التواصل +Phone: 963933400489 | Note: تم التواصل +Phone: 963940340848 | Note: تم التواصل +Phone: 963992458425 | Note: تم التواصل +Phone: 963932555452 | Note: تم التواصل +Phone: 963965218471 | Note: تم التواصل +Phone: 963933292470 | Note: تم التواصل +Phone: 963943889236 | Note: تم التواصل وكمل تسجيلو +Phone: 963988133863 | Note: تم التواصل +Phone: 963094444810 | Note: رقمو غلط +Phone: 963930946809 | Note: تم التواصل +Phone: 963968191496 | Note: تم التواصل +Phone: 963935090886 | Note: تم التواصل +Phone: 963991922952 | Note: تم التواصل +Phone: 963991112991 | Note: تم التواصل +Phone: 963986170776 | Note: تم التواصل +Phone: 963999743765 | Note: تم التواصل +Phone: 963932111786 | Note: تم التواصل +Phone: 963933681672 | Note: تم التواصل +Phone: 963938552167 | Note: تم التواصل +Phone: 963933206306 | Note: تم التواصل +Phone: 963957346118 | Note: تم التواصل +Phone: 963997392413 | Note: تم التواصل +Phone: 963988227272 | Note: تم التواصل +Phone: 963988029059 | Note: تم التواصل +Phone: 963945832988 | Note: تم التواصل +Phone: 963997944590 | Note: تم التواصل +Phone: 963980363715 | Note: تم التواصل +Phone: 963935102639 | Note: تم التواصل +Phone: 963954438781 | Note: تم التواصل +Phone: 963945223878 | Note: تم التواصل +Phone: 963980581094 | Note: تم التواصل +Phone: 963939164164 | Note: تم التواصل +Phone: 963938124006 | Note: تم التواصل +Phone: 963944349036 | Note: تم التواصل +Phone: 963992057768 | Note: غير مهتم +Phone: 963988177909 | Note: تم التواصل +Phone: 963932049144 | Note: No Note +Phone: 963992393038 | Note: No Note +Phone: 963952391236 | Note: No Note +Phone: 963935039644 | Note: No Note +Phone: 963985924850 | Note: No Note +Phone: 963932377014 | Note: No Note +Phone: 963993235215 | Note: No Note +Phone: 963980541950 | Note: No Note +Phone: 963945957334 | Note: No Note +Phone: 963981355144 | Note: No Note +Phone: 963938139830 | Note: No Note +Phone: 963932562745 | Note: No Note +Phone: 963994661362 | Note: No Note +Phone: 963988342603 | Note: No Note +Phone: 963994011134 | Note: No Note +Phone: 963936104080 | Note: No Note +Phone: 963992788749 | Note: No Note +Phone: 963998892720 | Note: No Note +Phone: 963996682748 | Note: No Note +Phone: 963938570002 | Note: No Note +Phone: 963931745699 | Note: No Note +Phone: 963992165521 | Note: No Note +Phone: 963993595631 | Note: No Note +Phone: 963933949753 | Note: No Note +Phone: 963934629935 | Note: No Note +Phone: 963965778887 | Note: اجدب +Phone: 963980212534 | Note: No Note +Phone: 963956784191 | Note: No Note +Phone: 963935443899 | Note: No Note +Phone: 963958642713 | Note: No Note +Phone: 963999138915 | Note: No Note +Phone: 963948941187 | Note: No Note +Phone: 963953459606 | Note: تم +Phone: 963934146288 | Note: تم +Phone: 963933256528 | Note: تم +Phone: 963998883027 | Note: تم +Phone: 963968481449 | Note: تم +Phone: 963965247307 | Note: ما معو سيارة +Phone: 963956761624 | Note: تم +Phone: 963939724962 | Note: تم +Phone: 963936030548 | Note: تم +Phone: 962781821306 | Note: خطأ +Phone: 963960040775 | Note: No Note +Phone: 963996642236 | Note: No Note +Phone: 963934293954 | Note: تم +Phone: 963934928537 | Note: تم +Phone: 963941440312 | Note: No Note +Phone: 963937214172 | Note: No Note +Phone: 963933824331 | Note: No Note +Phone: 963945555043 | Note: No Note +Phone: 963938676742 | Note: تم +Phone: 963933306898 | Note: تم +Phone: 963933708476 | Note: No Note +Phone: 963994795950 | Note: No Note +Phone: 963990329520 | Note: تم +Phone: 963960977309 | Note: تم +Phone: 963933267955 | Note: تم +Phone: 963996186195 | Note: تم +Phone: 916364908545 | Note: تم +Phone: 919154792575 | Note: تم +Phone: 963998119558 | Note: تم +Phone: 919606970074 | Note: خطأ +Phone: 916364908621 | Note: خطأ +Phone: 962772735902 | Note: No Note +Phone: 916366356713 | Note: No Note +Phone: 16693334444 | Note: No Note +Phone: 962782700835 | Note: No Note +Phone: 962782070515 | Note: No Note +Phone: 963984429412 | Note: No Note +Phone: 963966673673 | Note: No Note +Phone: 962796377987 | Note: No Note +Phone: 963947222548 | Note: No Note +Phone: 639276036618 | Note: No Note +Phone: 963798583052 | Note: No Note + +``` + +## File: serviceapp/deleteDriverNotCompleteRegistration.php +``` +encryptData($phone); + + +// 2. تنفيذ الحذف بشرط تطابق الهاتف وأن الحالة 'yet' +$sql = "DELETE FROM driver + WHERE phone = ? + AND employmentType = 'yet'"; + +$stmt = $con->prepare($sql); +$stmt->execute(array($phone)); + +$count = $stmt->rowCount(); + +if ($count > 0) { + // 3. إرسال رد النجاح ليتم عرضه في التطبيق (Get.snackbar) + jsonSuccess(null, "Driver deleted successfully"); +} else { + // إرسال رد فشل (إذا لم يتم العثور على الرقم أو كان السائق مكتملاً) + jsonError("Driver not found or already active"); +} + +?> +``` + +## File: serviceapp/getDriversWaitingActive.php +``` +prepare($sql); +$stmt->execute(); + +if ($stmt->rowCount() > 0) { + $rows = $stmt->fetchAll(PDO::FETCH_ASSOC); + + // فك تشفير أرقام الهواتف فقط للإخراج + foreach ($rows as &$row) { + if (!empty($row['phone_number'])) { + $row['phone_number'] = $encryptionHelper->decryptData($row['phone_number']); + } + if (!empty($row['first_name'])) { + $row['first_name'] = $encryptionHelper->decryptData($row['first_name']); + } + if (isset($row['last_name'])) { + $row['last_name'] = $encryptionHelper->decryptData($row['last_name']); + } + } + + + jsonSuccess($rows); +} else { + jsonError("No Phone verified yet found"); +} +?> +``` + +## File: serviceapp/getDriverDetailsForActivate.php +``` +prepare($sql); +$stmt->execute([':driverId' => $driverId]); + +if ($stmt->rowCount() > 0) { + $row = $stmt->fetch(PDO::FETCH_ASSOC); + + // فك التشفير للحقول المطلوبة + $fieldsToDecrypt = [ + 'phone','email','gender','national_number','first_name','last_name', + 'name_arabic','address','site','vin','car_plate','owner' + ]; + foreach ($fieldsToDecrypt as $field) { + if (isset($row[$field]) && $row[$field] !== '') { + try { + $row[$field] = $encryptionHelper->decryptData($row[$field]); + } catch (Exception $e) { + $row[$field] = "Decryption Failed"; + } + } + } + + // ✅ إزالة الحقول الحسّاسة من الاستجابة + $fieldsToRemove = ['password', 'password_hash', 'salt', 'reset_token']; + foreach ($fieldsToRemove as $f) { + if (array_key_exists($f, $row)) { + unset($row[$f]); + } + } + + // إرسال الاستجابة + jsonSuccess([$row]); + +} else { + jsonError("No data found for the specified driver ID"); +} +``` + +## File: serviceapp/getComplaintAllDataForDriver.php +``` +prepare($sql); +$stmt->execute(); + +if ($stmt->rowCount() > 0) { + $row = $stmt->fetchAll(PDO::FETCH_ASSOC); + + foreach ($row as &$item) { + if (isset($item['passengerName'])) { + $item['passengerName'] = $encryptionHelper->decryptData($item['passengerName']); + } + if (isset($item['driverName'])) { + $item['driverName'] = $encryptionHelper->decryptData($item['driverName']); + } + if (isset($item['gender'])) { + $item['gender'] = $encryptionHelper->decryptData($item['gender']); + } + if (isset($item['driverToken'])) { + $item['driverToken'] = $encryptionHelper->decryptData($item['driverToken']); + } + if (isset($item['passengerToken'])) { + $item['passengerToken'] = $encryptionHelper->decryptData($item['passengerToken']); + } + } + + jsonSuccess($row); +} else { + jsonError($message = $sql); +} +?> +``` + +## File: serviceapp/getJsonFile.php +``` += DATE_SUB(NOW(), INTERVAL 5 DAY) +ORDER BY + pv.created_at DESC; +"; + +$stmt = $con->prepare($sql); +$stmt->execute(); + +if ($stmt->rowCount() > 0) { + $rows = $stmt->fetchAll(PDO::FETCH_ASSOC); + + // فتح الملف للكتابة (Mode 'w' يقوم بإنشاء الملف أو مسح محتواه السابق والكتابة من جديد) + $fileHandle = fopen($filename, 'w'); + + // التحقق من أن الملف فُتح بنجاح + if ($fileHandle) { + + foreach ($rows as $r) { + $phone = ""; + $note = "No Note"; // القيمة الافتراضية إذا لم توجد ملاحظة + + // 1. فك تشفير رقم الهاتف + if (isset($r['phone_number']) && $r['phone_number'] != null) { + $phone = $encryptionHelper->decryptData($r['phone_number']); + } + + // 2. تجهيز نص الملاحظة + if (isset($r['note']) && $r['note'] != null) { + $note = $r['note']; + } + + // 3. تنسيق السطر الذي سيتم حفظه + // الشكل: Phone: 0123456789 | Note: مهتم بالتسجيل + $line = "Phone: " . $phone . " | Note: " . $note . PHP_EOL; + + // 4. الكتابة داخل الملف + fwrite($fileHandle, $line); + } + + // إغلاق الملف بعد الانتهاء + fclose($fileHandle); + + // طباعة رسالة نجاح مع رابط للملف (اختياري) + echo json_encode([ + "status" => "success", + "message" => "File created successfully", + "file" => $filename, + "count" => count($rows) + ]); + + } else { + jsonError("Unable to open file for writing."); + } + +} else { + jsonError("No phone numbers found in the last 5 days"); +} +?> +``` + +## File: serviceapp/registerDriverAndCarService.php +``` +beginTransaction(); + logStep(1, "Transaction started via beginTransaction()"); + + // --- 2. Recolección de Datos (Conductor + Coche) --- + $phone = filterRequest("phone"); + $password = filterRequest("password"); + $firstName = filterRequest("first_name"); + $lastName = filterRequest("last_name"); + + // تسجيل البيانات المبدئية (بدون كلمات المرور) للتأكد من وصولها + logStep(2, "Inputs received -> Phone: $phone, Name: $firstName $lastName"); + + // التحقق من الحقول الإجبارية + if (empty($phone) || empty($password) || empty($firstName) || empty($lastName)) { + throw new Exception("Required fields missing (phone, password, first_name, last_name)."); + } + + // --- 3. Generar ID de Conductor --- + $driverId = substr(md5($phone), 0, 20); + logStep(3, "Driver ID generated: $driverId"); + + // --- 4. Procesamiento de Datos del Conductor --- + $password_hashed = password_hash($password, PASSWORD_DEFAULT); + $email = filterRequest("email"); + + if (empty($email) || $email === 'Not specified') { + $email = $phone . '@intaleqapp.com'; + } + + $nameArabic = $firstName . ' ' . $lastName; + $site = filterRequest("site"); + $address = $site; + + // بيانات إضافية + $gender = filterRequest("gender"); + $license_type = filterRequest("license_type"); + $nationalNumber = filterRequest("national_number"); + $issue_date = filterRequest("issue_date"); + $expiry_date = filterRequest("expiry_date"); + $licenseCategories = filterRequest("license_categories"); + $licenseIssueDate = filterRequest("license_issue_date"); + $birthdate = filterRequest("birthdate"); + $maritalStatus = filterRequest("maritalStatus"); + + // --- 5. Recolección de Datos del Coche --- + $owner = filterRequest("owner"); + $color = filterRequest("color"); + $colorHex = filterRequest("color_hex"); + $model = filterRequest("model"); + $carPlate = filterRequest("car_plate"); + $make = filterRequest("make"); + $fuel = filterRequest("fuel"); + $year = filterRequest("year"); + $vin = filterRequest("vin"); + + if (empty($vin)) { + $vin = 'unknown'; + } + + $carExpirationDate = filterRequest("expiration_date"); + + logStep(4, "Data processing completed. Car Plate: $carPlate, VIN: $vin"); + + // --- 6. Cifrado de Datos --- + try { + $encryptedPhone = $encryptionHelper->encryptData($phone); + $encryptedEmail = $encryptionHelper->encryptData($email); + $encryptedFirstName = $encryptionHelper->encryptData($firstName); + $encryptedLastName = $encryptionHelper->encryptData($lastName); + $encryptedNameArabic = $encryptionHelper->encryptData($nameArabic); + $encryptedGender = $encryptionHelper->encryptData($gender); + $encryptedNationalNumber = $encryptionHelper->encryptData($nationalNumber); + $encryptedAddress = $encryptionHelper->encryptData($address); + $encryptedSite = $encryptionHelper->encryptData($site); + $encryptedBirthdate = $encryptionHelper->encryptData($birthdate); + $encryptedOwner = $encryptionHelper->encryptData($owner); + $encryptedCarPlate = $encryptionHelper->encryptData($carPlate); + + logStep(5, "Encryption successful for sensitive fields."); + } catch (Exception $encEx) { + throw new Exception("Encryption Error: " . $encEx->getMessage()); + } + + // --- 7. Comprobación de Duplicados --- + // ملاحظة: إذا كان التشفير عشوائياً، فلن يجد التكرار هنا. + $dup = $con->prepare("SELECT id FROM driver WHERE phone = :phone OR email = :email OR national_number = :national_number"); + $dup->execute([':phone' => $encryptedPhone, ':email' => $encryptedEmail, ':national_number' =>$encryptedNationalNumber]); + + if ($dup->rowCount() > 0) { + logStep(6, "Duplicate found! Phone or Email or encryptedNationalNumber already exists."); + throw new Exception("Phone or email already registered."); + } + logStep(6, "No duplicates found. Proceeding."); + + // --- 8. INSERCIÓN 1: Tabla 'driver' --- + $sqlDriver = " + INSERT INTO driver ( + id, phone, email, password, gender, license_type, national_number, + name_arabic, issue_date, expiry_date, license_categories, + address, licenseIssueDate, status, birthdate, site, + first_name, last_name, accountBank, bankCode, + employmentType, maritalStatus, fullNameMaritial, expirationDate, + created_at, updated_at + ) VALUES ( + :id, :phone, :email, :pwd, :gender, :license_type, :national_number, + :name_arabic, :issue_date, :expiry_date, :license_categories, + :address, :licenseIssueDate, :status, :birthdate, :site, + :first_name, :last_name, :accountBank, :bankCode, + :employmentType, :maritalStatus, :fullNameMaritial, :expirationDate, + NOW(), NOW() + ) + "; + + $stmtDriver = $con->prepare($sqlDriver); + + // تم توحيد المفاتيح لتشمل النقطتين (:) + $driverData = [ + ':id' => $driverId, + ':phone' => $encryptedPhone, + ':email' => $encryptedEmail, + ':pwd' => $password_hashed, + ':gender' => $encryptedGender, + ':license_type' => $license_type, + ':national_number' => $encryptedNationalNumber, + ':name_arabic' => $encryptedNameArabic, + ':issue_date' => $issue_date, + ':expiry_date' => $expiry_date, + ':license_categories' => $licenseCategories ?? 'B', + ':address' => $encryptedAddress, + ':licenseIssueDate' => $licenseIssueDate, + ':status' => 'actives', + ':birthdate' => $encryptedBirthdate, + ':site' => $encryptedSite, + ':first_name' => $encryptedFirstName, + ':last_name' => $encryptedLastName, + ':accountBank' => 'yet', + ':bankCode' => 'yet', + ':employmentType' => $maritalStatus ?? 'yet', + ':maritalStatus' => $maritalStatus ?? 'yet', + ':fullNameMaritial' => 'yet', + ':expirationDate' => 'yet', + ]; + + if (!$stmtDriver->execute($driverData)) { + // تسجيل خطأ SQL بالتفصيل + $errInfo = $stmtDriver->errorInfo(); + throw new Exception("Driver Insert Failed: " . $errInfo[2]); + } + logStep(7, "Driver table insert successful."); + + // --- 9. INSERCIÓN 2: Tabla 'CarRegistration' --- + $sqlCar = " + INSERT INTO CarRegistration ( + driverID, vin, owner, color, color_hex, model, car_plate, + make, fuel, `year`, expiration_date, created_at + ) VALUES ( + :driverId, :vin, :owner, :color, :color_hex, :model, :car_plate, + :make, :fuel, :year, :expiration_date, NOW() + ) + "; + + $stmtCar = $con->prepare($sqlCar); + $carData = [ + ':driverId' => $driverId, + ':vin' => $vin, + ':owner' => $encryptedOwner, + ':color' => $color, + ':color_hex' => $colorHex, + ':model' => $model, + ':car_plate' => $encryptedCarPlate, + ':make' => $make, + ':fuel' => $fuel, + ':year' => $year, + ':expiration_date' => $carExpirationDate + ]; + + if (!$stmtCar->execute($carData)) { + $errInfo = $stmtCar->errorInfo(); + throw new Exception("Car Insert Failed: " . $errInfo[2]); + } + logStep(8, "CarRegistration insert successful."); + + // --- 10. Confirmar Transacción --- + $con->commit(); + logStep(9, "COMMIT successful. Sending Success Response."); + + jsonSuccess(["driverId" => $driverId, "message" => "Driver and car registered successfully."]); + + // --- 11. Enviar Notificación (خارج المعاملة يفضل، ولكن هنا كما في الكود الأصلي) --- + try { + $supportPhones = ['0952475740', '0952475742']; + $randomIndex = array_rand($supportPhones); + $phoneToUse = $supportPhones[$randomIndex]; + $randomNumber = rand(1000, 999999); + + $messageBody = "أهلاً وسهلاً كابتن $firstName 👋\n" + . "تم تفعيل حسابك على تطبيق *انطلق*.\n" + . "يمكنك الآن تسجيل الدخول والبدء بالعمل مباشرة.\n" + . "للمساعدة تواصل معنا على الرقم: $phoneToUse\n" + . "نتمنى لك عمل موفق 🚖\n\n" + . "معرف الرسالة: $randomNumber"; + + sendWhatsAppFromServer($phone, $messageBody); + logStep(10, "WhatsApp notification sent."); + } catch (Exception $waError) { + // لا نوقف العملية إذا فشل الواتساب، فقط نسجل الخطأ + logStep(10, "WhatsApp Warning: " . $waError->getMessage()); + } + +} catch (PDOException $e) { + $con->rollBack(); + $errorMsg = "Database Error (PDO): " . $e->getMessage(); + logStep("ERROR-PDO", $errorMsg); + // إظهار رسالة عامة للمستخدم، وتسجيل التفاصيل في السيرفر + jsonError("System error during registration. Please contact support."); +} catch (Exception $e) { + // إذا كانت المعاملة مفتوحة، قم بإلغائها + if ($con->inTransaction()) { + $con->rollBack(); + } + $errorMsg = "General Error: " . $e->getMessage(); + logStep("ERROR-GEN", $errorMsg); + jsonError($e->getMessage()); +} +?> +``` + +## File: serviceapp/getdriverstotalMonthly.php +``` +prepare($sql); + $stmt->execute(); + $data = $stmt->fetchAll(PDO::FETCH_ASSOC); + + if ($data) { + echo json_encode(array("status" => "success", "message" => $data)); + } else { + echo json_encode(array("status" => "success", "message" => [])); + } +} catch (PDOException $e) { + echo json_encode(array("status" => "failure", "message" => $e->getMessage())); +} +?> +``` + +## File: serviceapp/addNotesDriver.php +``` +encryptData($phone); + +// SQL query: insert new row OR update existing one if phone already exists +$sql = "INSERT INTO `notesForDriverService` (`phone`, `note`, `editor`) + VALUES (:phone, :note, :editor) + ON DUPLICATE KEY UPDATE + `note` = VALUES(`note`), + `editor` = VALUES(`editor`)"; + +// Prepare the SQL statement +$stmt = $con->prepare($sql); + +// Bind the parameters +$stmt->bindParam(':phone', $encryptedPhone); +$stmt->bindParam(':note', $note); +$stmt->bindParam(':editor', $editor); + +// Execute the query +$success = $stmt->execute(); + +if ($success) { + if ($stmt->rowCount() > 0) { + jsonSuccess(null, "Note inserted/updated successfully"); + } else { + jsonError("No changes were made"); + } +} else { + jsonError("Database error"); +} +?> +``` + +## File: serviceapp/getNotesForEmployee.php +``` +prepare($sql); + $stmt->execute(); + $notes_data = $stmt->fetchAll(PDO::FETCH_ASSOC); + + if ($notes_data) { + // التصحيح: استخدام حلقة التكرار وتمرير الصف كمرجع (&) لتعديل البيانات الأصلية + foreach ($notes_data as &$row) { + // التأكد من وجود عمود الهاتف قبل فك التشفير + if (isset($row['phone'])) { + // استخدام دالة فك التشفير (تأكد أن الدالة decrypt موجودة في connect.php) + // أو استخدم $encryptionHelper->decryptData($row['phone']) إذا كنت تستخدم كلاس + $row['phone'] = $encryptionHelper->decryptData($row['phone']); + } + } + unset($row); // كسر الارتباط بالمتغير الأخير لضمان سلامة الكود + + jsonSuccess($notes_data); + } else { + jsonError("No notes found for this date"); + } + +} catch (PDOException $e) { + jsonError("Database error: " . $e->getMessage()); +} +?> +``` + +## File: serviceapp/getEmployeeDriverAfterCallingRegister.php +``` += '$start_date' + AND DATE(created_at) <= '$end_date' + GROUP BY + employmentType"; + +try { + $stmt = $con->prepare($sql); + $stmt->execute(); + $stats_data = $stmt->fetchAll(PDO::FETCH_ASSOC); + + if ($stats_data) { + // طباعة البيانات كـ JSON مع إضافة التواريخ المستخدمة للعلم + printSuccess([ + "data" => $stats_data, + "period" => [ + "start" => $start_date, + "end" => $end_date + ] + ]); + } else { + jsonError("No data found for the selected period"); + } + +} catch (PDOException $e) { + // في حال حدوث خطأ في قاعدة البيانات + jsonError("Database error: " . $e->getMessage()); +} +?> +``` + +## File: serviceapp/getRidesStatic.php +``` += '$start_date' + AND ride.created_at <= '$end_date 23:59:59' + AND ride.status = 'Finished') AS totalMonthly + +FROM + date_series +LEFT JOIN + ride ON DATE(ride.created_at) = date_series.date + AND ride.status = 'Finished' +WHERE + date_series.date >= '$start_date' + AND date_series.date <= '$end_date' +GROUP BY + date_series.date +ORDER BY + date_series.date ASC; +"; + +$stmt = $con->prepare($sql); +$stmt->execute(); +$data = $stmt->fetchAll(PDO::FETCH_ASSOC); + +if ($data) { + jsonSuccess($data); +} else { + jsonError("No data found"); +} +?> +``` + +## File: serviceapp/getEmployeeStatic.php +``` += '$first_day_of_month' + AND DATE(d.created_at) <= '$last_day_of_month' +GROUP BY + `date`, d.`maritalStatus` +ORDER BY + `date` ASC; +"; + +$stmt = $con->prepare($sql); +$stmt->execute(); +$passenger_data = $stmt->fetchAll(PDO::FETCH_ASSOC); + +if ($passenger_data) { + // طباعة البيانات كـ JSON + jsonSuccess($data = $passenger_data); +} else { + // طباعة رسالة فشل + jsonError($message = "No data found"); +} +?> +``` + +## File: serviceapp/getPassengersStatic.php +``` +prepare($sql); + $stmt->execute(); + $passenger_data = $stmt->fetchAll(PDO::FETCH_ASSOC); + + if ($passenger_data) { + echo json_encode(array("status" => "success", "message" => $passenger_data)); + } else { + echo json_encode(array("status" => "success", "message" => [])); + } +} catch (PDOException $e) { + echo json_encode(array("status" => "failure", "message" => $e->getMessage())); +} +?> +``` + +## File: serviceapp/web/getDrivers.php +``` +exec("set names utf8mb4"); +} + +$phone = ""; +if (isset($_GET['phone_number'])) { + $phone = htmlspecialchars(strip_tags($_GET['phone_number'])); +} elseif (isset($_POST['phone_number'])) { + $phone = htmlspecialchars(strip_tags($_POST['phone_number'])); +} else { + $phone = filterRequest("phone_number"); +} + +if (empty($phone)) { + jsonError("Phone number is required"); + exit; +} + +// تشفير الرقم للبحث +$phoneEncrypted = $encryptionHelper->encryptData($phone); + +// الاستعلام: نختار الحقول بدقة لتجنب التضارب +$sql = "SELECT + d.id as driver_id, + d.name_arabic as driver_name_encrypted, -- الاسم من جدول السائق + d.phone as phone_encrypted, + d.gender as gender_encrypted + + FROM + `driver` d + + WHERE + d.phone = ? + LIMIT 1"; + +try { + $stmt = $con->prepare($sql); + $stmt->execute([$phoneEncrypted]); + + if ($stmt->rowCount() > 0) { + $rows = $stmt->fetchAll(PDO::FETCH_ASSOC); + + foreach ($rows as &$item) { + // ============================================ + // 1. فك تشفير الحقول المشفرة فقط (حسب ملف CSV) + // ============================================ + + // بيانات السائق + if (!empty($item['driver_name_encrypted'])) { + $item['driverName'] = $encryptionHelper->decryptData($item['driver_name_encrypted']); + } + if (!empty($item['phone_encrypted'])) { + $item['phone'] = $encryptionHelper->decryptData($item['phone_encrypted']); + } + if (!empty($item['gender_encrypted'])) { + $item['gender'] = $encryptionHelper->decryptData($item['gender_encrypted']); + } + + + + } + + jsonSuccess($rows); + + } else { + jsonError("No driver found with this phone number"); + } + +} catch (PDOException $e) { + error_log("SQL Error: " . $e->getMessage()); + jsonError("Database error"); +} catch (Exception $e) { + error_log("General Error: " . $e->getMessage()); + jsonError("System error"); +} +?> +``` + +## File: serviceapp/work/addDriverWantWork.php +``` +prepare($sql); + +// ربط القيم +$stmt->bindParam(':driver_name', $driver_name); +$stmt->bindParam(':phone', $phone); +$stmt->bindParam(':national_id', $national_id); +$stmt->bindParam(':birth_date', $birth_date); +$stmt->bindParam(':license_type', $license_type); +$stmt->bindParam(':site', $site); + +// تنفيذ الاستعلام +if ($stmt->execute()) { + jsonSuccess(null, "Driver data saved successfully"); +} else { + jsonError("Failed to save driver data"); +} +?> +``` + +## File: serviceapp/work/addCarWantWork.php +``` +encryptData(filterRequest("owner_name")); +$phone = $encryptionHelper->encryptData(filterRequest("phone")); // 🔒 +$car_number = $encryptionHelper->encryptData(filterRequest("car_number")); +$manufacture_year = filterRequest("manufacture_year"); +$car_model = filterRequest("car_model"); +$car_type = filterRequest("car_type"); +$site = filterRequest("site"); +$registration_date = filterRequest("registration_date"); + +// تحقق بسيط من القيم المطلوبة +if (empty($owner_name) || empty($phone)) { + jsonError("Missing required fields", 422); +} + +// SQL مع bind parameters +$sql = "INSERT INTO `carsToWork`( + `owner_name`, + `phone`, + `car_number`, + `manufacture_year`, + `car_model`, + `car_type`, + `site`, + `registration_date` +) VALUES ( + :owner_name, + :phone, + :car_number, + :manufacture_year, + :car_model, + :car_type, + :site, + :registration_date +)"; + +try { + $stmt = $con->prepare($sql); + + $stmt->bindParam(':owner_name', $owner_name); + $stmt->bindParam(':phone', $phone); + $stmt->bindParam(':car_number', $car_number); + $stmt->bindParam(':manufacture_year', $manufacture_year); + $stmt->bindParam(':car_model', $car_model); + $stmt->bindParam(':car_type', $car_type); + $stmt->bindParam(':site', $site); + $stmt->bindParam(':registration_date', $registration_date); + + if ($stmt->execute()) { + printSuccess("Car data saved successfully", ["insert_id" => $con->lastInsertId()]); + } else { + $err = $stmt->errorInfo(); + jsonError("Failed to save car data: " . ($err[2] ?? 'unknown error'), 500); + } +} catch (Exception $e) { + jsonError("Exception: " . $e->getMessage(), 500); +} +?> +``` + +## File: ride/rate/add.php +``` +prepare($sql); +$stmt->bindParam(':passenger_id', $passenger_id); +$stmt->bindParam(':driverID', $driverID); +$stmt->bindParam(':rideId', $rideId); +$stmt->bindParam(':rating', $rating); +$stmt->bindParam(':comment', $comment); + +$stmt->execute(); + +if ($stmt->rowCount() > 0) { + jsonSuccess(null, "Rate inserted successfully"); +} else { + jsonError("Failed to save rating information"); +} +?> +``` + +## File: ride/rate/add_rate_app.php +``` +encryptData($email); +$phone = $encryptionHelper->encryptData($phone); + +// Insert into `ratingApp` table +$sql = "INSERT INTO `ratingApp`(`id`, `name`, `email`, `phone`, `userId`, `userType`, `rating`, `comment`) + VALUES (null, :name, :email, :phone, :userId, :userType, :rating, :comment)"; + +$stmt = $con->prepare($sql); +$stmt->bindParam(':name', $name); +$stmt->bindParam(':email', $email); +$stmt->bindParam(':phone', $phone); +$stmt->bindParam(':userId', $userId); +$stmt->bindParam(':userType', $userType); +$stmt->bindParam(':rating', $rating); +$stmt->bindParam(':comment', $comment); +$stmt->execute(); + +if ($stmt->rowCount() > 0) { + jsonSuccess($message = 'Rating inserted successfully'); +} else { + jsonError($message = "Failed to save rating information"); +} +?> +``` + +## File: ride/rate/addRateToDriver.php +``` +prepare($sql); + $stmt->bindParam(':passenger_id', $passenger_id); + $stmt->bindParam(':driver_id', $driver_id); + $stmt->bindParam(':ride_id', $ride_id); + $stmt->bindParam(':rating', $rating); + $stmt->bindParam(':comment', $comment); + + $stmt->execute(); + + if ($stmt->rowCount() > 0) { + jsonSuccess(null, "Rate inserted successfully"); + } else { + // في حال لم يتم الإدخال ولكن لم يحدث خطأ فني (نادرة الحدوث في Insert) + jsonError("Failed to save rating information"); + } + +} catch (PDOException $e) { + // --- هذا القسم خاص بأخطاء قاعدة البيانات --- + + // 1. تسجيل الخطأ في ملف نصي على السيرفر (للمطور فقط) + // سيتم إنشاء ملف اسمه errors.log في نفس المجلد إذا لم يكن موجوداً + $errorMsg = "[" . date("Y-m-d H:i:s") . "] DB Error: " . $e->getMessage() . " | RideID: $ride_id \n"; + file_put_contents("errors.log", $errorMsg, FILE_APPEND); + + // 2. إرجاع رسالة خطأ عامة للتطبيق + jsonError("Database Error: Could not save rating"); + +} catch (Exception $e) { + // --- هذا القسم خاص بالأخطاء العامة الأخرى --- + + $errorMsg = "[" . date("Y-m-d H:i:s") . "] General Error: " . $e->getMessage() . "\n"; + file_put_contents("errors.log", $errorMsg, FILE_APPEND); + + jsonError("Error: " . $e->getMessage()); +} +?> +``` + +## File: ride/rate/getPassengerRate.php +``` +prepare($sql); +$stmt->bindParam(':passenger_id', $passengerId); +$stmt->execute(); + +if ($stmt->rowCount() > 0) { + $row = $stmt->fetch(PDO::FETCH_ASSOC); + jsonSuccess($row); +} else { + jsonError("No rating record found"); +} +?> +``` + +## File: ride/rate/sendEmailRateingApp.php +``` + +

أهلاً كابتن $name،

+

نشكرك جزيل الشكر على تقييمك لتطبيق انطلق!

+

لقد استلمنا تقييمك وهو $rating نجوم.

+

تعليقك: \"$comment\"

+

نحن نقدر ملاحظاتك، ونسعد دائماً بتواصلك معنا لتحسين تجربتك. إذا كان لديك أي استفسار، لا تتردد بالرد على هذا البريد.

+

مع خالص الشكر،

+

فريق انطلق.

+"; + +if (mail($email, $subject, $bodyEmail, $headers)) { + echo "Email sent successfully to $email."; +} else { + echo "Failed to send email."; +} +?> + + +``` + +## File: ride/rate/getDriverRate.php +``` +prepare($sql); +$stmt->bindParam(':driver_id', $driver_id); +$stmt->execute(); + +if ($stmt->rowCount() > 0) { + // Fetch the record + $row = $stmt->fetchAll(PDO::FETCH_ASSOC); + + jsonSuccess($row); +} else { + // Print a failure message + jsonError($message = "No rating record found"); +} +?> + +``` + +## File: ride/places_syria/add.php +``` + +``` + +## File: ride/places_syria/get.php +``` +setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); +} catch (PDOException $e) { + // تجاهل الخطأ إذا كان قد تم تعيينه بالفعل +} + +// 1. استقبال المدخلات باستخدام دالة filterRequest الخاصة بك +$query = trim((string) filterRequest("query")); +$latMin = filterRequest("lat_min"); +$latMax = filterRequest("lat_max"); +$lngMin = filterRequest("lng_min"); +$lngMax = filterRequest("lng_max"); + +// 2. التحقق من المدخلات +if ($query === "" || $latMin === null || $latMax === null || $lngMin === null || $lngMax === null) { + jsonError("Missing required parameters: query, lat_min, lat_max, lng_min, lng_max"); + exit; +} + +// تحويل الإحداثيات إلى أرقام عشرية +$latMin = (float) $latMin; +$latMax = (float) $latMax; +$lngMin = (float) $lngMin; +$lngMax = (float) $lngMax; + + +// 3. بناء الاستعلام الذكي (الجزء المحدّث) + +// تحضير كلمة البحث لوضعها في MATCH() AGAINST() +// نضيف '*' لكل كلمة للبحث عن الكلمات التي تبدأ بهذا الجزء +$search_terms = preg_split('/\s+/', $query, -1, PREG_SPLIT_NO_EMPTY); +$search_boolean = ''; +foreach ($search_terms as $term) { + $search_boolean .= '+' . $term . '* '; // '+' تعني أن الكلمة يجب أن تكون موجودة +} +$search_boolean = trim($search_boolean); + + +// بناء المضلع الجغرافي (Bounding Box Polygon) للفهرس المكاني +$bbox_wkt = sprintf( + 'POLYGON((%f %f, %f %f, %f %f, %f %f, %f %f))', + $lngMin, $latMin, + $lngMax, $latMin, + $lngMax, $latMax, + $lngMin, $latMax, + $lngMin, $latMin +); + + +// الاستعلام النهائي الذي يجمع بين البحث النصي والجغرافي +$sql = " + SELECT + id, latitude, longitude, name, name_ar, name_en, address, category, created_at + FROM + `{$tableName}` + WHERE + -- الشرط الأول: البحث بالنص الكامل (سريع جداً) + MATCH(name, name_ar, name_en, address, category) AGAINST(? IN BOOLEAN MODE) + + -- الشرط الثاني: البحث الجغرافي (سريع جداً) + AND ST_CONTAINS(ST_GEOMFROMTEXT(?), location) + LIMIT 50; -- حد أعلى للنتائج الأولية +"; + +// 4. تنفيذ الاستعلام وإرجاع النتيجة +try { + $stmt = $con->prepare($sql); + + // ربط المتغيرات بالاستعلام بالترتيب + $stmt->execute([$search_boolean, $bbox_wkt]); + + $rows = $stmt->fetchAll(PDO::FETCH_ASSOC); + + jsonSuccess($rows); + +} catch (PDOException $e) { + // يمكنك استخدام هذا السطر أثناء التطوير لعرض الخطأ الفعلي + // jsonError('DB Error: ' . $e->getMessage()); exit; + + // تسجيل الخطأ في سجلات الخادم للرجوع إليه لاحقاً + error_log("search_places_optimized.php error: " . $e->getMessage()); + jsonError("Database query error occurred"); +} +?> + +``` + +## File: ride/places_syria/reverse_geocode.php +``` + 'error', 'message' => 'Missing lat or lon parameters']); + exit; +} + +// --- الاتصال بقاعدة البيانات --- +$conn = new mysqli($servername, $username, $password, $dbname); +$conn->set_charset("utf8mb4"); +if ($conn->connect_error) { + echo json_encode(['status' => 'error', 'message' => 'Database connection failed: ' . $conn->connect_error]); + exit; +} + +// --- دالة لتحليل other_tags (نفس الدالة من السكربت السابق) --- +function parseHstoreValue($hstoreString, $keyToFind) { + if (empty($hstoreString) || empty($keyToFind)) return null; + if (preg_match('/"' . preg_quote($keyToFind, '/') . '"\s*=>\s*"([^"]+)"/', $hstoreString, $matches)) { + $value = $matches[1]; + $decodedValue = urldecode($value); + $decodedValue = urldecode($decodedValue); + $cleanedValue = iconv('UTF-8', 'UTF-8//IGNORE', $decodedValue); + return ($cleanedValue === false || trim($cleanedValue) === '') ? null : $cleanedValue; + } + return null; +} + + +// --- الاستعلام الرئيسي: البحث عن أقرب نقطة باستخدام الفهرس المكاني --- +// نختار الأعمدة الأساسية + أعمدة المناطق المحسوبة مسبقاً + other_tags +$sql = " + SELECT + p.name, + p.neighbourhood_name, + p.city_name, + p.other_tags, + ST_Distance_Sphere( + p.geom, + ST_PointFromText(CONCAT('POINT(', ?, ' ', ?, ')'), 4326) + ) AS distance_meters + FROM + osm_points_with_area p + WHERE + -- استخدام MBRContains للفلترة الأولية السريعة (باستخدام الفهرس المكاني) + MBRContains( + ST_Buffer(ST_PointFromText(CONCAT('POINT(', ?, ' ', ?, ')'), 4326), 0.01), -- مربع بحث ~ 1 كم + p.geom + ) + -- الترتيب الدقيق حسب المسافة الأقرب (يستخدم الفهرس المكاني بكفاءة) + ORDER BY + p.geom <-> ST_PointFromText(CONCAT('POINT(', ?, ' ', ?, ')'), 4326) + LIMIT 1"; // نريد أقرب نقطة فقط + +$stmt = $conn->prepare($sql); +if ($stmt === false) { + echo json_encode(['status' => 'error', 'message' => 'Failed to prepare statement: ' . $conn->error]); + $conn->close(); + exit; +} + +// ربط المتغيرات (6 متغيرات: lon, lat مرتين للمربع ومرة للمسافة) +$stmt->bind_param("dddddd", $input_lon, $input_lat, $input_lon, $input_lat, $input_lon, $input_lat); + +$stmt->execute(); +$result = $stmt->get_result(); + +// --- تنسيق وإرجاع النتيجة --- +if ($result->num_rows > 0) { + $row = $result->fetch_assoc(); + + // استخراج التفاصيل الإضافية من other_tags + $name_ar = parseHstoreValue($row['other_tags'], 'name:ar'); + $addr_street = parseHstoreValue($row['other_tags'], 'addr:street'); + $amenity = parseHstoreValue($row['other_tags'], 'amenity'); + $shop = parseHstoreValue($row['other_tags'], 'shop'); + + // بناء اسم وصفي (الأولوية للعربي إن وجد) + $primaryName = $name_ar ?? $row['name'] ?? $addr_street ?? null; // الاسم الأساسي للنقطة + $displayName = $primaryName ?? 'موقع قريب'; // اسم افتراضي إذا لم يوجد اسم + + // إضافة اسم الحي والمدينة (المحسوبة مسبقاً) + $addressParts = array_filter([ + $row['neighbourhood_name'], + $row['city_name'] + ]); + if (!empty($addressParts)) { + // تجنب تكرار اسم المدينة إذا كان هو نفسه اسم النقطة + if ($primaryName !== $row['city_name']) { + $displayName .= '، ' . implode('، ', $addressParts); + } elseif ($row['neighbourhood_name'] && $primaryName !== $row['neighbourhood_name']) { + $displayName .= '، ' . $row['neighbourhood_name']; + } + } + + // إرجاع النتيجة كـ JSON + echo json_encode([ + 'status' => 'ok', + 'display_name' => $displayName, // الاسم المنسق للعرض + 'name' => $row['name'], // الاسم الأصلي (إن وجد) + 'name_ar' => $name_ar, // الاسم العربي (إن وجد) + 'street' => $addr_street, // اسم الشارع (إن وجد) + 'neighbourhood' => $row['neighbourhood_name'], // اسم الحي (المحسوب مسبقاً) + 'city' => $row['city_name'], // اسم المدينة (المحسوب مسبقاً) + 'amenity' => $amenity, // نوع الخدمة (إن وجد) + 'shop' => $shop, // نوع المحل (إن وجد) + 'distance_meters' => round($row['distance_meters'], 1) // المسافة لأقرب POI + ], JSON_UNESCAPED_UNICODE); // مهم لعرض العربية بشكل صحيح + +} else { + // لم يتم العثور على نقطة قريبة، ابحث عن أقرب مدينة/حي كحل بديل + $areaSqlFallback = " + SELECT name, other_tags, place_type + FROM osm_areas + ORDER BY ST_Distance_Sphere(geom, ST_PointFromText(CONCAT('POINT(', ?, ' ', ?, ')'), 4326)) ASC + LIMIT 1"; + $stmtFallback = $conn->prepare($areaSqlFallback); + if ($stmtFallback) { + $stmtFallback->bind_param("dd", $input_lon, $input_lat); + $stmtFallback->execute(); + $fallbackResult = $stmtFallback->get_result()->fetch_assoc(); + $stmtFallback->close(); + + if ($fallbackResult) { + $fallbackNameAr = parseHstoreValue($fallbackResult['other_tags'], 'name:ar'); + $fallbackDisplayName = $fallbackNameAr ?? $fallbackResult['name'] ?? 'منطقة غير معروفة'; + echo json_encode([ + 'status' => 'ok', + 'display_name' => $fallbackDisplayName, + ($fallbackResult['place_type'] === 'city' || $fallbackResult['place_type'] === 'town' || $fallbackResult['place_type'] === 'village') ? 'city' : 'neighbourhood' => $fallbackDisplayName + ], JSON_UNESCAPED_UNICODE); + } else { + echo json_encode(['status' => 'not_found', 'message' => 'No nearby places or areas found']); + } + } else { + echo json_encode(['status' => 'error', 'message' => 'Fallback query failed: ' . $conn->error]); + } +} + +$stmt->close(); +$conn->close(); +?> +``` + +## File: ride/rides/start_ride.php +``` +prepare("UPDATE ride SET status = ?, rideTimeStart = NOW() WHERE id = ?"); + $stmtRemote->execute([$status, $ride_id]); + + if ($stmtRemote->rowCount() == 0) { + // ملاحظة: أحياناً التحديث لا يؤثر بصفوف إذا كانت البيانات نفسها، + // لكن هنا نفترض الفشل إذا لم يجد الرحلة. + // يمكنك إكمال التنفيذ إذا كنت متأكداً أن الرحلة موجودة. + } + + // 2. تحديث السيرفر المحلي (Local DB) والمعاملات + $con->beginTransaction(); + + // تحديث الرحلة محلياً + $stmtMainRide = $con->prepare("UPDATE ride SET status = ?, rideTimeStart = NOW() WHERE id = ?"); + $stmtMainRide->execute([$status, $ride_id]); + + // تحديث أو إدخال في جدول Driver Orders + $checkSql = "SELECT `order_id` FROM `driver_orders` WHERE `order_id` = ?"; + $checkStmt = $con->prepare($checkSql); + $checkStmt->execute([$ride_id]); + + if ($checkStmt->rowCount() > 0) { + $updateSql = "UPDATE `driver_orders` SET `driver_id` = ?, `status` = ?, `created_at` = NOW() WHERE `order_id` = ?"; + $con->prepare($updateSql)->execute([$driver_id, $status, $ride_id]); + } else { + $insertSql = "INSERT INTO `driver_orders` (`driver_id`, `order_id`, `created_at`, `status`) VALUES (?, ?, NOW(), ?)"; + $con->prepare($insertSql)->execute([$driver_id, $ride_id, $status]); + } + + // ================================================================= + // 🔥 الخطوة 3: إشعار الراكب (Socket + FCM) + // ================================================================= + + // جلب بيانات الراكب من قاعدة البيانات لضمان الدقة + $stmtPas = $con_ride->prepare("SELECT passenger_id FROM ride WHERE id = ?"); + $stmtPas->execute([$ride_id]); + $passenger_id = $stmtPas->fetchColumn(); + + if ($passenger_id) { + + // أ) إرسال السوكيت (Socket) + // تم إلغاء التعليق عنه ليكون السيرفر هو المسؤول + $socketPayload = [ + 'ride_id' => $ride_id, + 'status' => 'started', // أو 'Begin' حسب ما يتوقعه التطبيق + 'msg' => 'بدأت الرحلة، نتمنى لك سلامة الوصول 🚀' + ]; + + if (function_exists('notifyPassengerOnRideServer')) { + notifyPassengerOnRideServer($passenger_id, $socketPayload); + } + + // ب) إرسال FCM (Internal) + if (!empty($passengerToken)) { + $fcmData = [ + 'ride_id' => (string)$ride_id + ]; + + // 🔥 استخدام sendFCM_Internal + sendFCM_Internal( + $passengerToken, // الهدف + "بدأت الرحلة 🏁", // العنوان + "نتمنى لك رحلة آمنة ومريحة.", // النص + $fcmData, // البيانات + "Trip is Begin", // التصنيف (حافظنا عليه كما هو في التطبيق) + false // ليس Topic + ); + } + } + + $con->commit(); + jsonSuccess(null, "Ride started successfully"); + +} catch (PDOException $e) { + if ($con->inTransaction()) { + $con->rollBack(); + } + jsonError("Exception: " . $e->getMessage()); +} +?> +``` + +## File: ride/rides/add.php +``` + $start_location, + ":end_location" => $end_location, + ":date" => $date_formatted, // نستخدم الصيغة المعالجة + ":time" => $time_formatted, // نستخدم الصيغة المعالجة + ":endtime" => $endtime_formatted, + ":price" => $price, + ":passenger_id" => $passenger_id, + ":driver_id" => $driver_id, + ":status" => $status, + ":carType" => $carType, + ":price_for_driver" => $price_for_driver, + ":price_for_passenger" => $price_for_passenger, + ":distance" => $distance, +]; + +// تسجيل البيانات التي سيتم إدخالها للتأكد +error_log("ℹ️ [add_ride.php] Prepared Data: " . json_encode($data)); + +// --------------------------------------------------------- +// 3. الإضافة في السيرفر المحلي (Main DB) +// --------------------------------------------------------- + +$sql = "INSERT INTO `ride` ( + `start_location`, `end_location`, `date`, `time`, `endtime`, + `price`, `passenger_id`, `driver_id`, `status`, `carType`, + `price_for_driver`, `price_for_passenger`, `distance` +) VALUES ( + :start_location, :end_location, :date, :time, :endtime, + :price, :passenger_id, :driver_id, :status, :carType, + :price_for_driver, :price_for_passenger, :distance +)"; + +try { + error_log("🔄 [add_ride.php] Inserting into LOCAL DB..."); + + $stmt = $con->prepare($sql); + $stmt->execute($data); + + $insertedId = $con->lastInsertId(); + $count = $stmt->rowCount(); + + error_log("✅ [add_ride.php] Local Insert Success. ID: $insertedId"); + + if ($count > 0) { + + // --------------------------------------------------------- + // 4. الإضافة في سيرفر التتبع (Tracking DB) + // --------------------------------------------------------- + + $sqlRemote = "INSERT INTO `ride` ( + `id`, `start_location`, `end_location`, `date`, `time`, `endtime`, + `price`, `passenger_id`, `driver_id`, `status`, `carType`, + `price_for_driver`, `price_for_passenger`, `distance` + ) VALUES ( + :id, :start_location, :end_location, :date, :time, :endtime, + :price, :passenger_id, :driver_id, :status, :carType, + :price_for_driver, :price_for_passenger, :distance + )"; + + // إضافة الـ ID للمصفوفة + $data[':id'] = $insertedId; + + try { + error_log("🔄 [add_ride.php] Inserting into REMOTE DB..."); + + $stmtRemote = $con_ride->prepare($sqlRemote); + $stmtRemote->execute($data); + + error_log("✅ [add_ride.php] Remote Insert Success."); + + } catch (PDOException $eRemote) { + // نسجل خطأ الريموت لكن لا نوقف العملية لأن اللوكل تم بنجاح + error_log("⚠️ [add_ride.php] Remote DB Error: " . $eRemote->getMessage()); + } + + // طباعة النجاح (JSON صحيح) + jsonSuccess($insertedId); + + } else { + error_log("❌ [add_ride.php] Failed to insert locally (Rows affected 0)."); + jsonError("Failed to save ride information locally"); + } + +} catch (PDOException $e) { + // تسجيل الخطأ بدقة + error_log("❌ [add_ride.php] SQL Error: " . $e->getMessage()); + jsonError("Database Error: " . $e->getMessage()); +} +?> +``` + +## File: ride/rides/updateStausFromSpeed.php +``` +prepare("UPDATE `ride` + SET `status` = :status, + `driver_id` = :driverId, + `rideTimeStart` = NOW() + WHERE `id` = :id + AND `status` IN ('waiting', 'wait') + "); + + $stmtRideRemote->execute([ + ':status' => $status, + ':driverId' => $driverId, + ':id' => $rideId + ]); + + $count = $stmtRideRemote->rowCount(); + error_log("ℹ️ [accept_ride.php] Remote DB Rows Affected: $count"); + + // نتحقق: هل نجح التحديث في سيرفر التتبع؟ + if ($count > 0) { + + // --------------------------------------------------------- + // 2. التحديث على السيرفر الرئيسي (تثبيت السجل فقط) + // --------------------------------------------------------- + + error_log("🔄 [accept_ride.php] Remote success. Updating LOCAL Main DB..."); + + $sqlUpdate = "UPDATE `ride` + SET `driver_id` = :driverId, + `status` = :status, + `rideTimeStart` = NOW() + WHERE id = :rideId + AND `status` IN ('waiting', 'wait') "; + + $stmtUpdate = $con->prepare($sqlUpdate); + $stmtUpdate->bindParam(":driverId", $driverId); + $stmtUpdate->bindParam(":status", $status); + $stmtUpdate->bindParam(":rideId", $rideId); + $stmtUpdate->execute(); + + error_log("✅ [accept_ride.php] Ride accepted and started successfully for Driver: $driverId"); + jsonSuccess(null, "Ride accepted and started successfully at " . date('Y-m-d H:i:s')); + + } else { + error_log("⚠️ [accept_ride.php] Failed to accept ride. It might be already taken, canceled, or invalid status."); + jsonError("Ride cannot be accepted (Already taken, Canceled, or Invalid Status)."); + } + +} catch (PDOException $e) { + error_log("❌ [accept_ride.php] Database Error: " . $e->getMessage()); + jsonError("Database Error: " . $e->getMessage()); +} +?> +``` + +## File: ride/rides/gterideForDriverManyTime.php +``` +prepare($sql); +$stmt->execute(); + +$row = $stmt->fetch(PDO::FETCH_ASSOC); + +echo json_encode([ + "status" => "success", + "data" => $row +]); +?> +``` + +## File: ride/rides/getRideStatusFromStartApp.php +``` +prepare(" + SELECT + id AS rideId, + status, + start_location, + end_location, + carType, + driver_id,distance, + price, + created_at + FROM ride + WHERE passenger_id = ? + AND ( + status IN ( 'Apply', 'Begin') AND created_at >= NOW() - INTERVAL 2 HOUR + OR (status = 'Finished' AND created_at >= NOW() - INTERVAL 24 HOUR) + ) + ORDER BY created_at DESC + LIMIT 1 + "); + + $stmt->execute([$passenger_id]); + $ride = $stmt->fetch(PDO::FETCH_ASSOC); + + if (!$ride) { + echo json_encode(["status" => "failure", "message" => "No active ride found"]); + exit; + } + + // ========================================================= + // 2. السيرفر الرئيسي: جلب اسم السائق + متوسط تقييمه العام + // ========================================================= + + // ملاحظة: تم الحفاظ على الاستعلام كما هو + // rateDriver: هو الاسم الذي سنستخدمه في PHP + $stmt2 = $con->prepare(" + SELECT + d.first_name AS driverName, + (SELECT AVG(rating) FROM ratingDriver WHERE driver_id = d.id) AS rateDriver, + (SELECT COUNT(*) FROM ratingDriver WHERE ride_id = ?) AS thisRideRated + FROM driver d + WHERE d.id = ? + "); + + $stmt2->execute([$ride['rideId'], $ride['driver_id']]); + $driverData = $stmt2->fetch(PDO::FETCH_ASSOC); + + // ========================================================= + // 3. المعالجة النهائية + // ========================================================= + + if ($driverData) { + // فك التشفير + $ride['driverName'] = $encryptionHelper->decryptData($driverData['driverName']); + + // --- تصحيح الخطأ هنا --- + // كان يستدعي driverAvg وهو غير موجود، تم تغييره لـ rateDriver + $ride['rateDriver'] = $driverData['rateDriver'] ? round($driverData['rateDriver'], 2) : 5; + + // --- منطق هل تحتاج الرحلة لتقييم (needsReview) --- + $isFinished = ($ride['status'] === 'Finished'); + $isRated = ($driverData['thisRideRated'] > 0); + + $ride['needsReview'] = ($isFinished && !$isRated) ? 1 : 0; + + } else { + // حالة عدم وجود سائق (نادراً ما تحدث إذا كان driver_id موجوداً في جدول الرحلات) + $ride['driverName'] = null; + $ride['rateDriver'] = 5; + $ride['needsReview'] = 0; + } + + // تنظيف البيانات + unset($ride['created_at']); + + echo json_encode([ + "status" => "success", + "data" => $ride + ]); + +} catch (Exception $e) { + echo json_encode(["status" => "failure", "message" => $e->getMessage()]); +} +?> +``` + +## File: ride/rides/update.php +``` + $id]; + +// قائمة الحقول القابلة للتحديث +$fields = [ + "start_location", "end_location", "date", "time", "endtime", "price", + "passenger_id", "driver_id", "status", "created_at", "updated_at", + "rideTimeStart", "rideTimeFinish", "price_for_driver", "driverGoToPassengerTime", + "price_for_passenger", "distance" +]; + +// بناء الاستعلام ديناميكياً باستخدام filterRequest +foreach ($fields as $field) { + // نتحقق من وجود المفتاح في الـ POST + if (isset($_POST[$field])) { + // نستخدم دالة الفلترة الخاصة بك + $value = filterRequest($field); + + $columnValues[] = "`$field` = :$field"; + $params[":$field"] = $value; + } +} + +// إذا لم يتم إرسال أي حقول للتحديث +if (empty($columnValues)) { + error_log("⚠️ [update.php] No data provided in request to update."); + jsonError("No data provided for update."); + exit; +} + +// تجميع جملة SQL +$setClause = implode(", ", $columnValues); +$sql = "UPDATE `ride` SET $setClause WHERE `id` = :id"; + +try { + // --------------------------------------------------------- + // 1. التحديث على سيرفر التتبع (Remote DB) - هو الأساس + // --------------------------------------------------------- + error_log("🔄 [update.php] Attempting to update REMOTE Tracking DB for Ride ID: $id"); + + $stmtRemote = $con_ride->prepare($sql); + $stmtRemote->execute($params); + + $count = $stmtRemote->rowCount(); + error_log("ℹ️ [update.php] Remote DB Rows Affected: $count"); + + // التحقق: هل نجح التحديث هناك؟ + if ($count > 0) { + + // --------------------------------------------------------- + // 2. التحديث على السيرفر المحلي (Local DB) للمطابقة + // --------------------------------------------------------- + error_log("🔄 [update.php] Remote success. Updating LOCAL Main DB..."); + + $stmtLocal = $con->prepare($sql); + $stmtLocal->execute($params); + + error_log("✅ [update.php] Update successful on both servers."); + + // استخدام دالة النجاح الخاصة بك + jsonSuccess(null, "Ride data updated successfully"); + + } else { + // لم يتم التحديث (إما البيانات نفسها لم تتغير، أو المعرف غير موجود في السيرفر البعيد) + error_log("⚠️ [update.php] Remote Update returned 0 rows (Data same or ID not found)."); + + // استخدام دالة الفشل (يمكنك تغيير الرسالة لتكون success إذا كنت لا تعتبر عدم تغيير البيانات خطأ) + jsonError("No changes made (Remote DB affected 0 rows). Check ID or Data."); + } + +} catch (PDOException $e) { + error_log("❌ [update.php] Database Error: " . $e->getMessage()); + jsonError("Database Error: " . $e->getMessage()); +} +?> +``` + +## File: ride/rides/cancel_ride_by_passenger.php +``` +prepare("SELECT driver_id, status FROM ride WHERE id = ?"); + $stmt->execute([$rideId]); + $ride = $stmt->fetch(PDO::FETCH_ASSOC); + + if (!$ride) { + jsonError("Ride not found"); + exit; + } + + $driverId = $ride['driver_id']; + $currentStatus = $ride['status']; + + if ($currentStatus == 'Begin') { + jsonError("Cannot cancel started ride"); + exit; + } + + // ================================================================= + // 1. تحديث قواعد البيانات (Transaction) + // ================================================================= + $con->beginTransaction(); + + // تحديث waitingRides + $updateWaiting = $con->prepare("UPDATE waitingRides SET status = ? WHERE id = ?"); + $updateWaiting->execute(['cancelled_by_passenger', $rideId]); + + // تحديث ride (محلي) + $updateRide = $con->prepare("UPDATE ride SET status = ?, updated_at = NOW() WHERE id = ?"); + $updateRide->execute(['cancelled_by_passenger', $rideId]); + + // تحديث driver_orders + if ($driverId > 0) { + $updateOrder = $con->prepare("UPDATE driver_orders SET status = 'cancelled_by_passenger', notes = ? WHERE order_id = ? AND driver_id = ?"); + $updateOrder->execute([$reason, $rideId, $driverId]); + } + + $con->commit(); + + // تحديث السيرفر البعيد (Remote DB) + if (isset($con_ride)) { + try { + $updateRide2 = $con_ride->prepare("UPDATE ride SET status = ?, updated_at = NOW() WHERE id = ?"); + $updateRide2->execute(['cancelled_by_passenger', $rideId]); + } catch (PDOException $e) { + error_log("Secondary DB update failed: " . $e->getMessage()); + } + } + + // ================================================================= + // 2. إشعار السائق (Socket + FCM) + // ================================================================= + if ($driverId > 0) { + + // أ) Socket (إشعار السائق في التطبيق فوراً) + $socketUrl = 'http://188.68.36.205:2021'; + $internalKeyPath = '/home/intaleq-api/.internal_socket_key'; + $internalKey = file_exists($internalKeyPath) ? trim(file_get_contents($internalKeyPath)) : ''; + + $ch = curl_init($socketUrl); + curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); + curl_setopt($ch, CURLOPT_POST, true); + curl_setopt($ch, CURLOPT_POSTFIELDS, http_build_query([ + 'action' => 'cancel_ride', + 'driver_id' => $driverId, + 'ride_id' => $rideId, + 'reason' => $reason + ])); + if (!empty($internalKey)) curl_setopt($ch, CURLOPT_HTTPHEADER, ["x-internal-key: $internalKey"]); + curl_setopt($ch, CURLOPT_TIMEOUT_MS, 500); + curl_setopt($ch, CURLOPT_NOSIGNAL, 1); + @curl_exec($ch); + curl_close($ch); + + // ب) FCM (باستخدام الدالة الجديدة مع فك التشفير) + $stmtToken = $con->prepare("SELECT token FROM driverToken WHERE captain_id = ?"); + $stmtToken->execute([$driverId]); + $rawToken = $stmtToken->fetchColumn(); + + if ($rawToken) { + $driverToken = $rawToken; + + // 🔥 محاولة فك التشفير (لأن التوكنات غالباً مشفرة) + if (!empty($encryptionHelper)) { + try { + $decrypted = $encryptionHelper->decryptData($rawToken); + if ($decrypted !== false && !empty($decrypted)) { + $driverToken = trim($decrypted); + } + } catch (Exception $e) { + // في حال الفشل نستخدم الخام + } + } + + // تجهيز البيانات + $fcmData = [ + 'category' => 'Cancel Trip', + 'ride_id' => (string)$rideId, + 'reason' => $reason + ]; + + // إرسال الإشعار + sendFCM_Internal( + $driverToken, // الهدف + "إلغاء الرحلة 🚫", // العنوان + "قام الراكب بإلغاء الرحلة: $reason", // النص + $fcmData, // البيانات + 'Cancel Trip', // التصنيف + false // ليس Topic + ); + } + } + + jsonSuccess(null, "Ride cancelled successfully"); + +} catch (PDOException $e) { + if ($con->inTransaction()) $con->rollBack(); + error_log("Cancel ride error: " . $e->getMessage()); + jsonError("Database error occurred"); +} +?> +``` + +## File: ride/rides/get.php +``` +prepare($baseSql); + $stmt->execute($params); + $row = $stmt->fetch(PDO::FETCH_ASSOC); + $total_rows = $row['total_rows'] ?? 0; + + if ($total_rows > 0) { + // Step 2: Fetch the latest 10 ride records + $rideSql = "SELECT * FROM `ride`"; + if (!empty($passenger_id)) { + $rideSql .= " WHERE passenger_id = :passenger_id ORDER BY created_at DESC LIMIT 10"; + } elseif (!empty($driver_id)) { + $rideSql .= " WHERE driver_id = :driver_id ORDER BY created_at DESC LIMIT 10"; + } + + $rideStmt = $con->prepare($rideSql); + $rideStmt->execute($params); + $rides = $rideStmt->fetchAll(PDO::FETCH_ASSOC); + + echo json_encode([ + "status" => "success", + "data" => $rides + ]); + } else { + jsonError("No rides found"); + } +} catch (PDOException $e) { + jsonError("Database error: " . $e->getMessage()); +} +?> +``` + +## File: ride/rides/get_driver_location.php +``` + "failure", "message" => "Missing Parameters"]); + exit; +} + +try { + // ================================================================= + // الخطوة 1: الاتصال بسيرفر الرحلات ($con_ride) + // الهدف: جلب driver_id وحالة الرحلة للتحقق + // ================================================================= + + $sqlRide = "SELECT driver_id, status FROM ride WHERE id = :rideID LIMIT 1"; + $stmtRide = $con_ride->prepare($sqlRide); + $stmtRide->bindParam(':rideID', $rideID); + $stmtRide->execute(); + $rideData = $stmtRide->fetch(PDO::FETCH_ASSOC); + + // إذا لم توجد الرحلة + if (!$rideData) { + echo json_encode(["status" => "failure", "message" => "Ride not found"]); + exit; + } + + $driverID = $rideData['driver_id']; + $status = $rideData['status']; + + // ================================================================= + // الخطوة 2: التحقق الأمني (Hashing Validation) + // القاعدة: Token = MD5(rideID + driverID + SecretSalt) + // هذا يضمن أن الرابط تم توليده بواسطة التطبيق ولم يتم تخمينه + // ================================================================= + + // * هام: هذه الكلمة السرية يجب أن تكون مطابقة تماماً للموجودة في تطبيق Flutter + $secretSalt = getenv("secretSaltParent"); + + // إعادة بناء الهاش للمقارنة + $generatedToken = md5($rideID . $driverID . $secretSalt); + + if ($token !== $generatedToken) { + http_response_code(403); + echo json_encode(["status" => "failure", "message" => "Invalid Security Token"]); + exit; + } + + // ================================================================= + // الخطوة 3: التحقق من حالة الرحلة (Logic Check) + // الشرط: التتبع يعمل فقط إذا كانت الرحلة قد بدأت + // ================================================================= + + // يمكنك إضافة 'Applied' أو 'Arrived' إذا أردت التتبع قبل الركوب + $allowedStatuses = ['Begin', 'inProgress']; + + if (!in_array($status, $allowedStatuses)) { + echo json_encode(["status" => "failure", "message" => "Ride is not active", "ride_status" => $status]); + exit; + } + + // ================================================================= + // الخطوة 4: الاتصال بسيرفر التتبع ($con_tracking) + // الهدف: جلب أحدث إحداثيات للسائق + // ================================================================= + + $sqlLoc = "SELECT latitude, longitude, heading, speed, updated_at + FROM car_locations + WHERE driver_id = :driverID + ORDER BY updated_at DESC LIMIT 1"; + + $stmtLoc = $con_tracking->prepare($sqlLoc); + $stmtLoc->bindParam(':driverID', $driverID); + $stmtLoc->execute(); + $locData = $stmtLoc->fetch(PDO::FETCH_ASSOC); + + if (!$locData) { + // السائق لم يرسل موقعه بعد + echo json_encode(["status" => "failure", "message" => "Waiting for driver signal..."]); + exit; + } + + // ================================================================= + // الخطوة 5: الاتصال بالسيرفر الرئيسي ($con) + // الهدف: جلب اسم السائق وموديل السيارة للعرض (اختياري لجمالية الصفحة) + // ================================================================= + + $sqlDriver = "SELECT + d.first_name, + d.last_name, + c.model, + c.color, + c.car_plate + FROM driver d + LEFT JOIN CarRegistration c ON d.id = c.driverID + WHERE d.id = :driverID LIMIT 1"; + + $stmtDriver = $con->prepare($sqlDriver); + $stmtDriver->bindParam(':driverID', $driverID); + $stmtDriver->execute(); + $driverInfo = $stmtDriver->fetch(PDO::FETCH_ASSOC); + + // فك التشفير إذا لزم الأمر (أسماء السائقين واللوحات غالباً مشفرة) + if ($driverInfo) { + // فك تشفير الاسم + if (!empty($driverInfo['first_name'])) { + $driverInfo['first_name'] = $encryptionHelper->decryptData($driverInfo['first_name']); + } + // فك تشفير اللوحة + if (!empty($driverInfo['car_plate'])) { + $driverInfo['car_plate'] = $encryptionHelper->decryptData($driverInfo['car_plate']); + } + // يمكنك فك تشفير باقي الحقول حسب الحاجة + } + + // ================================================================= + // الخطوة 6: تجميع البيانات وإرسال الرد النهائي + // ================================================================= + + $response = [ + "status" => "success", + "data" => [ + "lat" => $locData['latitude'], + "lng" => $locData['longitude'], + "heading" => $locData['heading'], + "speed" => $locData['speed'], + "last_update" => $locData['updated_at'], + "driver_name" => $driverInfo['first_name'] ?? "Captain", + "car_model" => $driverInfo['model'] ?? "", + "car_color" => $driverInfo['color'] ?? "", + "plate" => $driverInfo['car_plate'] ?? "" + ] + ]; + + echo json_encode($response); + +} catch (Exception $e) { + // تسجيل الخطأ دون إظهاره للمستخدم العام + error_log("Tracking Error: " . $e->getMessage()); + echo json_encode(["status" => "failure", "message" => "Server Error"]); +} +?> +``` + +## File: ride/rides/update_ride_cancel_wait.php +``` +beginTransaction(); + + // 1. تحديث جدول الرحلات + $stmtRide = $con->prepare("UPDATE ride SET status = ?, rideTimeStart = NOW() WHERE id = ?"); + $stmtRide->execute([$status, $rideId]); + + // 2. تحديث جدول طلبات السائقين + // نستخدم Check لضمان عدم تكرار التحديث إذا كان محدثاً مسبقاً + $stmtOrder = $con->prepare("UPDATE driver_orders SET status = ? WHERE order_id = ? AND driver_id = ?"); + $stmtOrder->execute([$status, $rideId, $driverId]); + + $con->commit(); + jsonSuccess(null, "Ride status updated"); + +} catch (PDOException $e) { + $con->rollBack(); + jsonError("DB Error"); +} +?> +``` + +## File: ride/rides/updateRideAndCheckIfApplied.php +``` +prepare($sqlCheck); +$stmtCheck->bindParam(":rideId", $rideId); +$stmtCheck->execute(); + +$ride = $stmtCheck->fetch(PDO::FETCH_ASSOC); + +if (!$ride) { + jsonError("Ride not found."); + exit; +} + +if ($ride['status'] === 'Apply') { + jsonError("This ride is already applied by another driver."); + exit; +} + +// Step 2: تحديث حالة الرحلة وربط السائق بها +$sqlUpdate = "UPDATE `ride` + SET `driver_id` = :driverId, + `status` = 'Apply', + `rideTimeStart` = :rideTimeStart + WHERE `id` = :rideId"; + +$stmtUpdate = $con->prepare($sqlUpdate); +$stmtUpdate->bindParam(":driverId", $driverId); +$stmtUpdate->bindParam(":rideTimeStart", $rideTimeStart); +$stmtUpdate->bindParam(":rideId", $rideId); + +$stmtUpdate->execute(); + +if ($stmtUpdate->rowCount() > 0) { + jsonSuccess(null, "Ride data updated successfully"); + // يمكنك هنا إرسال إشعار للسائقين الآخرين إذا أردت + // FirebaseMessagesController()->sendNotificationToOtherDrivers(...) +} else { + jsonError("Failed to update ride data."); +} +?> +``` + +## File: ride/rides/retry_search_drivers.php +``` +prepare("UPDATE ride SET status = 'waiting', driver_id = 0, updated_at = NOW() WHERE id = ?"); + $updateStmt->execute([$rideId]); + + // 3. حساب العمولة (Kazan) + $kazan = (double)$price - (double)$priceForDriver; + + // 4. بناء Payload مطابق لـ add_ride.php (0 - 33) + $payloadTemplate = []; + $payloadTemplate[0] = (string)$startLat; + $payloadTemplate[1] = (string)$startLng; + $payloadTemplate[2] = (string)number_format((float)$price, 2, '.', ''); + $payloadTemplate[3] = (string)$endLat; + $payloadTemplate[4] = (string)$endLng; + $payloadTemplate[5] = (string)$distanceText; + $payloadTemplate[6] = ""; // Driver ID placeholder + $payloadTemplate[7] = (string)$passengerId; + $payloadTemplate[8] = (string)$passengerName; + $payloadTemplate[9] = (string)$passengerToken; + $payloadTemplate[10] = (string)$passengerPhone; + $payloadTemplate[11] = (string)$distance; + $payloadTemplate[12] = "1"; + $payloadTemplate[13] = (string)$isWallet; + $payloadTemplate[14] = (string)$distance; + $payloadTemplate[15] = (string)$durationText; + $payloadTemplate[16] = (string)$rideId; + $payloadTemplate[17] = ""; + $payloadTemplate[18] = ""; // Driver ID placeholder + $payloadTemplate[19] = (string)$durationText; + $payloadTemplate[20] = (string)$hasSteps; + $payloadTemplate[21] = (string)$step0; + $payloadTemplate[22] = (string)$step1; + $payloadTemplate[23] = (string)$step2; + $payloadTemplate[24] = (string)$step3; + $payloadTemplate[25] = (string)$step4; + $payloadTemplate[26] = (string)number_format((float)$priceForDriver, 2, '.', ''); + $payloadTemplate[27] = (string)$passengerWallet; + $payloadTemplate[28] = (string)$passengerEmail; + $payloadTemplate[29] = (string)$startName; + $payloadTemplate[30] = (string)$endName; + $payloadTemplate[31] = (string)$carType; + $payloadTemplate[32] = (string)number_format($kazan, 2, '.', ''); + $payloadTemplate[33] = (string)$passengerRating; + + ksort($payloadTemplate); + $payloadTemplate = array_values($payloadTemplate); + + // 5. البحث عن السائقين وإرسال الطلب (Using Helper Function) + $latVal = doubleval($startLat); + $lngVal = doubleval($startLng); + + $driversData = findBestDrivers($con, $con_tracking, $latVal, $lngVal, $carType); + + if (!empty($driversData)) { + // استدعاء دالة الإرسال الموحدة (الموجودة في functions.php) + dispatchRideToDrivers($driversData, $rideId, $payloadTemplate, $startName); + } + + jsonSuccess(null, "Ride reset and resent to drivers"); + +} catch (PDOException $e) { + jsonError("DB Error: " . $e->getMessage()); +} +?> +``` + +## File: ride/rides/acceptRide.php +``` +prepare(" + UPDATE `ride` + SET `status` = ?, `driver_id` = ?, `rideTimeStart` = NOW() + WHERE `id` = ? AND `status` IN ('waiting', 'wait') + "); + $stmtRemote->execute([$status, $driverId, $rideId]); + + // Check if the update actually changed a row. + // If rowCount > 0, IT MEANS SUCCESS! This driver won the ride. + if ($stmtRemote->rowCount() > 0) { + + // 4. Synchronization: Update Local Database + // Now that we secured the ride, we update the main server's DB ($con) to match. + if (isset($con)) { + $stmtLocal = $con->prepare("UPDATE `ride` SET `driver_id` = ?, `status` = ?, `rideTimeStart` = NOW() WHERE id = ?"); + $stmtLocal->execute([$driverId, $status, $rideId]); + } + + // 5. Update/Insert Driver Orders Table + // This tracks the driver's history or active orders. + $checkSql = "SELECT `order_id` FROM `driver_orders` WHERE `order_id` = ?"; + $checkStmt = $con->prepare($checkSql); + $checkStmt->execute([$rideId]); + + if ($checkStmt->rowCount() > 0) { + // If entry exists, update it + $updateSql = "UPDATE `driver_orders` SET `driver_id` = ?, `status` = ?, `created_at` = NOW() WHERE `order_id` = ?"; + $con->prepare($updateSql)->execute([$driverId, $status, $rideId]); + } else { + // If not, insert new record + $insertSql = "INSERT INTO `driver_orders` (`driver_id`, `order_id`, `created_at`, `status`) VALUES (?, ?, NOW(), ?)"; + $con->prepare($insertSql)->execute([$driverId, $rideId, $status]); + } + + // ================================================================= + // 6. 👤 GET DRIVER INFO (For the Passenger) + // We need to fetch driver details (Car, Name, Rating) to show to the passenger. + // ================================================================= + + $driverInfo = []; + + $sqlDetails = "SELECT + d.id as driver_id, + d.first_name, + d.last_name, + d.gender, + d.phone, + c.make, + c.model, + c.car_plate, + c.year, + c.color, + c.color_hex, + (SELECT ROUND(AVG(rating), 2) FROM ratingDriver WHERE driver_id = d.id) AS ratingDriver, + dt.token + FROM driver d + LEFT JOIN CarRegistration c ON c.driverID = d.id + LEFT JOIN driverToken dt ON dt.captain_id = d.id + WHERE d.id = ?"; + + $stmtDetails = $con->prepare($sqlDetails); + $stmtDetails->execute([$driverId]); + $driverRawData = $stmtDetails->fetch(PDO::FETCH_ASSOC); + + if ($driverRawData) { + // List of encrypted fields that need decryption + $fieldsToDecrypt = ['first_name', 'last_name', 'gender', 'phone', 'car_plate', 'token']; + + foreach ($driverRawData as $key => $value) { + if (in_array($key, $fieldsToDecrypt) && !empty($value)) { + // Decrypt sensitive data + $driverInfo[$key] = $encryptionHelper->decryptData($value); + } else { + $driverInfo[$key] = $value; + } + } + + // Format Full Name + $driverInfo['driverName'] = trim(($driverInfo['first_name'] ?? '') . ' ' . ($driverInfo['last_name'] ?? '')); + + // Default rating if null + if (empty($driverInfo['ratingDriver'])) { + $driverInfo['ratingDriver'] = "5.0"; + } + } + + // ================================================================= + // 7. 🔔 NOTIFY PASSENGER (Socket + FCM) + // Inform the passenger that a driver has been found. + // ================================================================= + + // Fetch Passenger ID based on Ride ID + $stmtPas = $con->prepare("SELECT passenger_id FROM ride WHERE id = ?"); + $stmtPas->execute([$rideId]); + $passenger_id = $stmtPas->fetchColumn(); + + if ($passenger_id) { + // A. Send Socket Notification (Real-time update on map) + if (function_exists('notifyPassengerOnRideServer')) { + notifyPassengerOnRideServer($passenger_id, [ + 'status' => 'accepted', + 'ride_id' => $rideId, + 'driver_id' => $driverId, + 'driver_info' => $driverInfo + ]); + } + + // B. Send FCM Notification (Push Notification) + if (!empty($passengerToken)) { + // Using the standardized FCM function + sendFCM_Internal( + $passengerToken, + "Ride Accepted 🚖", // Title + "Captain " . ($driverInfo['driverName'] ?? 'Driver') . " is coming to you.", // Body + ['ride_id' => (string)$rideId, 'driver_info' => $driverInfo], // Data Payload + "Accepted Ride", // Category + false // Not a topic + ); + } + } + + // ================================================================= + // 8. 🧹 MARKETPLACE CLEANUP (Notify Location Server) + // Crucial Step: We tell the Location Server that this ride is taken. + // The Location Server will: + // 1. Remove the ride from Redis (geo:rides:waiting). + // 2. Broadcast 'ride_taken' to other drivers to remove it from their screens. + // ================================================================= + sendToLocationServer('ride_taken_event', [ + 'ride_id' => $rideId, + 'taken_by_driver_id' => $driverId + ]); + + // 9. Final Response to the Driver App + echo json_encode([ + "status" => "success", + "message" => "Ride Accepted", + "data" => $driverInfo + ]); + + } else { + // Failure: This means rowCount was 0. + // Reason: The ride status was NOT 'waiting' (another driver took it milliseconds ago). + jsonError("Ride not available (Already taken)"); + } + +} catch (Exception $e) { + // Handle unexpected errors + jsonError("Error: " . $e->getMessage()); +} +?> +``` + +## File: ride/rides/heatmap_live.json +``` +[] +``` + +## File: ride/rides/getRealTimeHeatmap.php +``` +prepare("SELECT start_lat, start_lng FROM waitingRides WHERE status IN ('wait', 'waiting')"); + $stmtW->execute(); + while ($row = $stmtW->fetch(PDO::FETCH_ASSOC)) { + addToGrid($grid, $row['start_lat'], $row['start_lng'], $precision, $WEIGHT_WAITING); + } + + // 2. طلبات ضائعة (Timeout) + $stmtM = $con->prepare("SELECT start_location FROM ride WHERE (status = 'timeout' OR status = 'cancelled_no_driver_found') AND created_at >= DATE_SUB(NOW(), INTERVAL 20 MINUTE)"); + $stmtM->execute(); + while ($row = $stmtM->fetch(PDO::FETCH_ASSOC)) { + $parts = explode(',', $row['start_location']); + if (count($parts) == 2) addToGrid($grid, $parts[0], $parts[1], $precision, $WEIGHT_MISSED); + } + + // 3. طلبات نشطة (Active) + $stmtA = $con->prepare("SELECT start_location FROM ride WHERE created_at >= DATE_SUB(NOW(), INTERVAL 15 MINUTE) AND status NOT IN ('timeout', 'cancelled_no_driver_found')"); + $stmtA->execute(); + while ($row = $stmtA->fetch(PDO::FETCH_ASSOC)) { + $parts = explode(',', $row['start_location']); + if (count($parts) == 2) addToGrid($grid, $parts[0], $parts[1], $precision, $WEIGHT_ACTIVE); + } + + // تجهيز البيانات النهائية + $finalData = []; + foreach ($grid as $cell) { + $score = $cell['score']; // مجموع النقاط (الوزن) + $count = $cell['count']; // العدد الحقيقي للطلبات + + // 🧠 المنطق المزدوج: نحدد اللون بناءً على النقاط أو العدد + $intensity = "low"; + $surge = 1.0; + + // المعادلة: منطقة حمراء إذا كان السكور عالي جداً (مشاكل) أو العدد كبير جداً (زحمة) + if ($score >= 15 || $count >= 5) { + $intensity = "high"; // أحمر (خطر/فرصة ذهبية) + $surge = 1.5; + } elseif ($score >= 8 || $count >= 3) { + $intensity = "medium"; // برتقالي + $surge = 1.2; + } elseif ($score >= 3 || $count >= 1) { + $intensity = "normal"; // أصفر + } + + if ($score > 0) { + $finalData[] = [ + 'lat' => $cell['lat'], + 'lng' => $cell['lng'], + 'count' => $count, // ✅ العدد الحقيقي (مهم للعرض) + 'intensity' => $intensity, // ✅ التصنيف الذكي + 'surge' => $surge + ]; + } + } + + file_put_contents('heatmap_live.json', json_encode($finalData)); // الكاش + + echo json_encode(["status" => "success", "data" => $finalData]); + +} catch (Exception $e) { + echo json_encode(["status" => "failure", "message" => $e->getMessage()]); +} + +function addToGrid(&$grid, $lat, $lng, $precision, $weight) { + if (empty($lat) || empty($lng)) return; + $rLat = round(floatval($lat), $precision); + $rLng = round(floatval($lng), $precision); + $key = "$rLat,$rLng"; + + if (!isset($grid[$key])) { + $grid[$key] = ['lat' => $rLat, 'lng' => $rLng, 'count' => 0, 'score' => 0]; + } + $grid[$key]['count']++; // زيادة العدد (+1 دائماً) + $grid[$key]['score'] += $weight; // زيادة الوزن (حسب نوع الطلب) +} +?> +``` + +## File: ride/rides/getTripCountByCaptain.php +``` +prepare($sql); +$stmt->bindParam(':driver_id', $driver_id, PDO::PARAM_INT); // أو PARAM_STR حسب نوع الـ ID + +$stmt->execute(); + +if ($stmt->rowCount() > 0) { + $row = $stmt->fetch(PDO::FETCH_ASSOC); + jsonSuccess($row); +} else { + jsonError($message = "No finished ride records found for this driver"); +} +?> +``` + +## File: ride/rides/arrive_ride.php +``` +prepare("UPDATE ride SET status = 'arrived', updated_at = NOW() WHERE id = ? AND driver_id = ? AND status = 'Apply'"); + $stmtRemote->execute([$rideId, $driverId]); + + // 2. تحديث الحالة في السيرفر المحلي (Local DB - con) + if (isset($con)) { + $stmtLocal = $con->prepare("UPDATE ride SET status = 'arrived', updated_at = NOW() WHERE id = ? AND driver_id = ? AND status = 'Apply'"); + $stmtLocal->execute([$rideId, $driverId]); + } + + // 3. جلب بيانات الراكب للإرسال + // نستخدم con_ride لضمان الدقة + $stmtPas = $con_ride->prepare("SELECT passenger_id FROM ride WHERE id = ?"); + $stmtPas->execute([$rideId]); + $passenger_id = $stmtPas->fetchColumn(); + + if ($passenger_id) { + + // أ) إرسال Socket (الأسرع) + $payload = [ + 'status' => 'arrived', + 'ride_id' => $rideId, + 'msg' => 'السائق وصل إلى موقعك 🚖' + ]; + + if (function_exists('notifyPassengerOnRideServer')) { + notifyPassengerOnRideServer($passenger_id, $payload); + } + + // ب) إرسال FCM (باستخدام الدالة الجديدة) + if (!empty($passengerToken)) { + $fcmData = [ + 'category' => 'Arrive Ride', // نفس الاسم القديم لضمان عمل التطبيق + 'ride_id' => (string)$rideId + ]; + + // 🔥 استخدام sendFCM_Internal + sendFCM_Internal( + $passengerToken, // الهدف + "السائق وصل 📍", // العنوان + "الكابتن ينتظرك في الموقع المحدد.", // النص + $fcmData, // البيانات + "Arrive Ride", // التصنيف + false // ليس Topic + ); + } + } + + jsonSuccess(null, "Arrival notified successfully"); + +} catch (Exception $e) { + jsonError("Error: " . $e->getMessage()); +} +?> +``` + +## File: ride/rides/add_ride.php +``` + (string)$rideId, + 'start_lat' => $lat, + 'start_lng' => $lng, + 'price' => $payloadData[2], // السعر + 'carType' => $payloadData[31], // نوع السيارة + 'startName' => $payloadData[29], // اسم موقع البدء + 'endName' => $payloadData[30], // اسم موقع الوصول + 'distance' => $payloadData[11], // المسافة + 'duration' => $payloadData[15], // الوقت + 'passengerRate' => $payloadData[33], // تقييم الراكب + // يمكنك إضافة المزيد هنا حسب الحاجة + ]; + + $postData = [ + 'action' => 'market_new_ride', // اسم الحدث في السوكيت + 'payload' => $marketPayload + ]; + + // إرسال الطلب (cURL) + $ch = curl_init(); + curl_setopt($ch, CURLOPT_URL, $url); + curl_setopt($ch, CURLOPT_POST, 1); + curl_setopt($ch, CURLOPT_POSTFIELDS, http_build_query($postData)); + curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); + // وقت انتظار قصير جداً (200ms) لأننا لا نريد تأخير استجابة الراكب + curl_setopt($ch, CURLOPT_TIMEOUT_MS, 200); + curl_setopt($ch, CURLOPT_HTTPHEADER, ["x-internal-key: $INTERNAL_KEY"]); + curl_exec($ch); + curl_close($ch); +} + +// ================================================================================= +// 2. استقبال وتصفية البيانات من التطبيق +// ================================================================================= +$start_location = filterRequest("start_location"); +$end_location = filterRequest("end_location"); +$date_raw = filterRequest("date"); +$time_raw = filterRequest("time"); +$endtime_raw = filterRequest("endtime"); +$price = filterRequest("price"); +$passenger_id = filterRequest("passenger_id"); +$driver_id = filterRequest("driver_id") ?: 0; +$status = filterRequest("status"); +$price_for_driver = filterRequest("price_for_driver"); +$price_for_passenger = filterRequest("price_for_passenger"); +$distance = filterRequest("distance"); +$carType = filterRequest("carType"); + +// بيانات الراكب الإضافية +$passenger_name = filterRequest("passenger_name"); +$passenger_phone = filterRequest("passenger_phone"); +$passenger_token = filterRequest("passenger_token"); +$passenger_email = filterRequest("passenger_email"); +$passenger_wallet = filterRequest("passenger_wallet"); +$passenger_rating = filterRequest("passenger_rating"); + +// تفاصيل الرحلة والنصوص +$start_name_loc = filterRequest("start_name"); +$end_name_loc = filterRequest("end_name"); +$duration_text = filterRequest("duration_text"); +$distance_text = filterRequest("distance_text"); +$is_wallet = filterRequest("is_wallet"); +$has_steps = filterRequest("has_steps"); + +$step0 = filterRequest("step0"); $step1 = filterRequest("step1"); +$step2 = filterRequest("step2"); $step3 = filterRequest("step3"); +$step4 = filterRequest("step4"); + +// معالجة الإحداثيات (فصل النص إلى Lat/Lng) +$startLat = ""; $startLng = ""; +if (!empty($start_location)) { + $parts = explode(',', $start_location); + $startLat = trim($parts[0] ?? ""); $startLng = trim($parts[1] ?? ""); +} + +$endLat = ""; $endLng = ""; +if (!empty($end_location)) { + $parts = explode(',', $end_location); + $endLat = trim($parts[0] ?? ""); $endLng = trim($parts[1] ?? ""); +} + +// تنسيق التواريخ +$date_formatted = date("Y-m-d", strtotime($date_raw)); +$time_formatted = date("H:i:s", strtotime($time_raw)); +$endtime_formatted = $endtime_raw ? date("H:i:s", strtotime($endtime_raw)) : "00:00:00"; + +// مصفوفة البيانات للإدخال +$data = [ + ":start_location" => $start_location, + ":end_location" => $end_location, + ":date" => $date_formatted, + ":time" => $time_formatted, + ":endtime" => $endtime_formatted, + ":price" => $price, + ":passenger_id" => $passenger_id, + ":driver_id" => $driver_id, + ":status" => $status, + ":carType" => $carType, + ":price_for_driver" => $price_for_driver, + ":price_for_passenger" => $price_for_passenger, + ":distance" => $distance, +]; + +// جملة SQL للإدخال +$sql = "INSERT INTO `ride` ( + `start_location`, `end_location`, `date`, `time`, `endtime`, + `price`, `passenger_id`, `driver_id`, `status`, `carType`, + `price_for_driver`, `price_for_passenger`, `distance` +) VALUES ( + :start_location, :end_location, :date, :time, :endtime, + :price, :passenger_id, :driver_id, :status, :carType, + :price_for_driver, :price_for_passenger, :distance +)"; + +try { + // 3. الإدخال في قاعدة البيانات الرئيسية (Main DB) + $stmtMain = $con->prepare($sql); + $stmtMain->execute($data); + $insertedId = $con->lastInsertId(); // ID الرحلة الجديد + + // 4. الإدخال في قاعدة بيانات الرحلات (Ride DB) للأرشفة والتزامن + try { + $stmtRide = $con_ride->prepare($sql); + $stmtRide->execute($data); + } catch (Exception $e) { + error_log("⚠️ RideDB Insert Warning: " . $e->getMessage()); + } + + if ($insertedId) { + error_log("📝 Ride #$insertedId added successfully."); + + // 5. تجهيز الـ Payload (قائمة البيانات للتطبيق) + $kazan = (double)$price - (double)$price_for_driver; + $payloadTemplate = []; + // تعبئة البيانات بالترتيب الذي يتوقعه التطبيق (Indices 0-33) + $payloadTemplate[0] = (string)$startLat; + $payloadTemplate[1] = (string)$startLng; + $payloadTemplate[2] = (string)number_format($price, 2, '.', ''); + $payloadTemplate[3] = (string)$endLat; + $payloadTemplate[4] = (string)$endLng; + $payloadTemplate[5] = (string)$distance_text; + $payloadTemplate[6] = ""; + $payloadTemplate[7] = (string)$passenger_id; + $payloadTemplate[8] = (string)$passenger_name; + $payloadTemplate[9] = (string)$passenger_token; + $payloadTemplate[10] = (string)$passenger_phone; + $payloadTemplate[11] = (string)$distance; + $payloadTemplate[12] = "1"; + $payloadTemplate[13] = (string)$is_wallet; + $payloadTemplate[14] = (string)$distance; + $payloadTemplate[15] = (string)$duration_text; + $payloadTemplate[16] = (string)$insertedId; + $payloadTemplate[17] = ""; + $payloadTemplate[18] = ""; + $payloadTemplate[19] = (string)$duration_text; + $payloadTemplate[20] = $has_steps ?: 'false'; + $payloadTemplate[21] = (string)$step0; + $payloadTemplate[22] = (string)$step1; + $payloadTemplate[23] = (string)$step2; + $payloadTemplate[24] = (string)$step3; + $payloadTemplate[25] = (string)$step4; + $payloadTemplate[26] = (string)number_format($price_for_driver, 2, '.', ''); + $payloadTemplate[27] = (string)$passenger_wallet; + $payloadTemplate[28] = (string)$passenger_email; + $payloadTemplate[29] = (string)$start_name_loc; + $payloadTemplate[30] = (string)$end_name_loc; + $payloadTemplate[31] = (string)$carType; + $payloadTemplate[32] = (string)number_format($kazan, 2, '.', ''); + $payloadTemplate[33] = (string)$passenger_rating; + + ksort($payloadTemplate); + $payloadTemplate = array_values($payloadTemplate); + + // 6. البحث عن السائقين للتوزيع المباشر (Direct Dispatch) + $driversData = findBestDrivers($con, $startLat, $startLng, $carType); + + // متغير لنعرف هل وجدنا سائقين للتوجيه المباشر أم لا + $foundDirectDrivers = false; + + if (!empty($driversData)) { + // أ. إرسال إشعار مباشر للسائقين المختارين + dispatchRideToDrivers($driversData, $insertedId, $payloadTemplate, $start_name_loc, $encryptionHelper); + error_log("📨 Dispatched Ride #$insertedId to " . count($driversData) . " drivers."); + $foundDirectDrivers = true; + } else { + error_log("⚠️ No specific drivers found for Direct Dispatch for Ride #$insertedId. Moved to Market only."); + } + + // ب. 🔥 نشر الرحلة في السوق المفتوح (Marketplace) دائماً 🔥 + // هذا هو طوق النجاة: حتى لو لم نجد سائقين أعلاه، نضعها في السوق + broadcastRideToMarket($insertedId, $startLat, $startLng, $payloadTemplate); + + // ج. ✅ إرجاع نجاح للتطبيق دائماً (ليبقى الراكب في شاشة البحث) + // يمكنك إرسال معلومة إضافية للتطبيق أن البحث "عام" وليس "مباشر" إذا أردت + jsonSuccess($insertedId); + + // ملاحظة: قمنا بإزالة كود الإلغاء (UPDATE ride SET status = 'cancelled...') + // لأننا نريد منح الفرصة للسائقين البعيدين قليلاً أو الذين فتحوا التطبيق للتو + + + /* + else { + // 🛑 حالة عدم العثور على سائقين + error_log("⚠️ No drivers found for Ride #$insertedId."); + + // أ. إلغاء الرحلة فوراً في قواعد البيانات + // ملاحظة: غيرنا الحالة إلى رسالة واضحة + $con->prepare("UPDATE ride SET status = 'cancelled_no_driver_found' WHERE id = ?")->execute([$insertedId]); + $con_ride->prepare("UPDATE ride SET status = 'cancelled_no_driver_found' WHERE id = ?")->execute([$insertedId]); + + // ب. إشعار الراكب عبر السوكيت (لإظهار Popup) + if (function_exists('notifyPassengerSocket')) { + notifyPassengerSocket($passenger_id, 'no_drivers_found', [ + 'ride_id' => $insertedId, + 'message' => 'No drivers available nearby' + ]); + } + + // ج. إرجاع فشل للتطبيق + jsonError("no_drivers_found"); + */ + } else { + jsonError("Failed to add ride"); + } + +} catch (Exception $e) { + error_log("AddRide Critical Error: " . $e->getMessage()); + jsonError("Database Error"); +} +?> +``` + +## File: ride/rides/cancelRideFromDriver.php +``` +prepare($sql); + $stmtRemote->execute([$newStatus, $id]); + + $count = $stmtRemote->rowCount(); + error_log("ℹ️ [cancelRide.php] Remote DB Rows Affected: $count"); + + // التحقق: هل تم التحديث؟ + if ($count > 0) { + + // --------------------------------------------------------- + // 2. التحديث على السيرفر المحلي (Local DB) + // --------------------------------------------------------- + // نبدأ معاملة لضمان تكامل البيانات + if (isset($con)) { + $con->beginTransaction(); + try { + $stmtLocal = $con->prepare($sql); + $stmtLocal->execute([$newStatus, $id]); + + // تحديث جدول driver_orders أيضاً لتوحيد الحالة (اختياري ولكنه مفضل) + $stmtDriverOrder = $con->prepare("UPDATE driver_orders SET status = ? WHERE order_id = ?"); + $stmtDriverOrder->execute([$newStatus, $id]); + + $con->commit(); + } catch (Exception $eLocal) { + $con->rollBack(); + error_log("⚠️ Local DB Update Failed: " . $eLocal->getMessage()); + } + } + + // --------------------------------------------------------- + // 3. 🔥 إشعار الراكب عبر السوكيت (القطعة المفقودة) 🔥 + // --------------------------------------------------------- + + // أ. جلب معرف الراكب لإرسال الإشعار له + // نستخدم connection الرحلات لضمان وجود البيانات + $stmtPas = $con_ride->prepare("SELECT passenger_id FROM ride WHERE id = ?"); + $stmtPas->execute([$id]); + $passenger_id = $stmtPas->fetchColumn(); + + if ($passenger_id) { + $payload = [ + 'ride_id' => $id, + 'status' => 'cancelled', // هذه الحالة يستقبلها الفلاتر ويغلق الواجهة + 'msg' => 'للأسف، قام السائق بإلغاء الرحلة.' + ]; + + // استدعاء الدالة المعرفة في functions.php/connect.php + if (function_exists('notifyPassengerOnRideServer')) { + notifyPassengerOnRideServer($passenger_id, $payload); + error_log("📡 [cancelRide.php] Notification sent to Passenger ID: $passenger_id"); + } else { + error_log("⚠️ [cancelRide.php] Function notifyPassengerOnRideServer not found!"); + } + } + + // --------------------------------------------------------- + // 4. إنهاء العملية + // --------------------------------------------------------- + error_log("✅ [cancelRide.php] Ride cancelled successfully."); + jsonSuccess(null, "Ride cancelled successfully"); + + } else { + // الفشل يعني أن الرحلة غير موجودة أو حالتها لا تسمح بالإلغاء (مثلاً بدأت بالفعل) + error_log("⚠️ [cancelRide.php] Failed. ID invalid OR Status not allowed (maybe started?)."); + jsonError("Cannot cancel ride. Status might be started or already completed."); + } + +} catch (PDOException $e) { + error_log("❌ [cancelRide.php] Database Error: " . $e->getMessage()); + jsonError("Database Error: " . $e->getMessage()); +} +?> +``` + +## File: ride/rides/finish_ride_updates.php +``` +prepare("UPDATE ride SET status = ?, rideTimeFinish = NOW(), price = ? WHERE id = ? AND status = 'Begin'"); + $stmtRemote->execute([$newStatus, $price, $rideId]); + + if ($stmtRemote->rowCount() == 0) { + // إذا لم يجد الصف (ربما تم إنهاؤها بالفعل) + // jsonError("Could not finish ride (Remote)."); + // exit; + // ملاحظة: الأفضل إكمال العملية محلياً احتياطاً + } + + // 2. التحديث المحلي (Local DB) + $con->beginTransaction(); + + $con->prepare("UPDATE ride SET status = ?, rideTimeFinish = NOW(), price = ? WHERE id = ? AND status = 'Begin'") + ->execute([$newStatus, $price, $rideId]); + + // تحديث driver_orders + $checkStmt = $con->prepare("SELECT order_id FROM driver_orders WHERE order_id = ?"); + $checkStmt->execute([$rideId]); + + if ($checkStmt->rowCount() > 0) { + $con->prepare("UPDATE driver_orders SET driver_id = ?, status = ?, created_at = NOW() WHERE order_id = ?") + ->execute([$driver_id, $newStatus, $rideId]); + } else { + $con->prepare("INSERT INTO driver_orders (driver_id, order_id, created_at, status) VALUES (?, ?, NOW(), ?)") + ->execute([$driver_id, $rideId, $newStatus]); + } + + // ================================================================= + // 🔥 الخطوة 3: إشعار الراكب (Socket + FCM) + // ================================================================= + + + + + if ($passenger_id) { + + // تجهيز القائمة المتوافقة مع الكود القديم (Legacy List) + // [driver_id, ride_id, driver_token, price] + $legacyList = [ + (string)$driver_id, + (string)$rideId, + (string)$driver_token, + (string)$price + ]; + + // أ) إرسال Socket + $socketPayload = [ + 'ride_id' => $rideId, + 'status' => 'finished', + 'price' => $price, + 'DriverList' => $legacyList // إرسال القائمة للسوكيت أيضاً + ]; + + if (function_exists('notifyPassengerOnRideServer')) { + notifyPassengerOnRideServer($passenger_id, $socketPayload); + } + + // ب) إرسال FCM (Internal) + if (!empty($passengerToken)) { + $fcmData = [ + 'ride_id' => (string)$rideId, + 'price' => (string)$price, + 'DriverList' => $legacyList // ✅ نمرر المصفوفة، والدالة الداخلية تحولها لـ JSON + ]; + + sendFCM_Internal( + $passengerToken, // الهدف + "تم إنهاء الرحلة 🏁", // العنوان + "المبلغ المطلوب: " . $price . " ل.س", // النص (أضفت العملة افتراضياً) + $fcmData, // البيانات + 'Driver Finish Trip', // التصنيف (كما هو في التطبيق القديم) + false // ليس Topic + ); + } + } + + $con->commit(); + jsonSuccess(null, "Ride finished successfully"); + +} catch (PDOException $e) { + if ($con->inTransaction()) $con->rollBack(); + jsonError("DB Error: " . $e->getMessage()); +} +?> +``` + +## File: ride/rides/getRideStatusBegin.php +``` +prepare($sql); +$stmt->bindParam(':ride_id', $ride_id, PDO::PARAM_INT); +$stmt->execute(); + +$row = $stmt->fetch(PDO::FETCH_ASSOC); + +if ($row) { + echo json_encode([ + "status" => "success", + "data" => $row + ]); +} else { + jsonError("Ride not found."); +} +?> +``` + +## File: ride/rides/cron_ride_timeout.php +``` +prepare($sqlUpdate); + $stmtUpdate->execute(); + $updatedCount = $stmtUpdate->rowCount(); + + // ========================================================= + // الخطوة 2: الحذف من جدول الانتظار (تنظيف Hot Data) + // ========================================================= + + $sqlDelete = "DELETE FROM waitingRides + WHERE created_at < DATE_SUB(NOW(), INTERVAL $minutesLimit MINUTE)"; + + $stmtDelete = $con->prepare($sqlDelete); + $stmtDelete->execute(); + $deletedCount = $stmtDelete->rowCount(); + + // ========================================================= + // الخطوة 3: (اختياري) تنظيف الريدز + // ========================================================= + // بما أنك تستخدم Redis، المفترض أن تحذفها منه أيضاً. + // لكن بما أن الريدز يعتمد على TTL (Expire) أو سيتم تحديثه عند الطلب القادم، + // فالحذف من الـ MySQL يكفي لأن getRideWaiting سيفحص MySQL ولن يجدها. + + // تقرير العملية + if ($deletedCount > 0) { + $msg = "✅ [Cleanup Cron] Success: Timed out $updatedCount rides in Main DB, and Deleted $deletedCount rides from Waiting DB."; + error_log($msg); + echo json_encode(["status" => "success", "message" => $msg]); + } else { + $msg = "💤 [Cleanup Cron] No expired rides found."; + error_log($msg); + echo json_encode(["status" => "success", "message" => "Nothing to clean."]); + } + +} catch (PDOException $e) { + $errorMsg = "❌ [Cleanup Cron] Error: " . $e->getMessage(); + error_log($errorMsg); + echo json_encode(["status" => "failure", "message" => $e->getMessage()]); +} +?> +``` + +## File: ride/rides/delete.php +``` +prepare($sql); +$stmt->bindParam(':id', $id, PDO::PARAM_INT); +$stmt->execute(); + +// التحقق من نجاح العملية +if ($stmt->rowCount() > 0) { + jsonSuccess(null, "Ride deleted successfully"); +} else { + jsonError("Failed to delete ride"); +} +?> +``` + +## File: ride/rides/public_track_location.php +``` + "failure", "message" => $message], $extra)); + exit; +} + +try { + $rideID = filter_input(INPUT_GET, 'id', FILTER_SANITIZE_NUMBER_INT); + $token = filter_input(INPUT_GET, 'token', FILTER_SANITIZE_SPECIAL_CHARS); + + if (!$rideID || !$token) { + sendError("Missing parameters"); + } + + $stmtRide = $con_ride->prepare("SELECT driver_id, status FROM ride WHERE id = ? LIMIT 1"); + $stmtRide->execute([$rideID]); + $rideData = $stmtRide->fetch(PDO::FETCH_ASSOC); + + if (!$rideData) sendError("Ride not found"); + + $driverID = $rideData['driver_id']; + $status = $rideData['status']; + $secretSalt = "Intaleq_Secure_Track_2025"; + $generatedToken = md5(trim(strval($rideID)) . trim(strval($driverID)) . $secretSalt); + + if ($token !== $generatedToken) sendError("Invalid Token"); + + $allowedStatuses = ['Applied', 'Arrived', 'Begin', 'inProgress']; + if (!in_array($status, $allowedStatuses)) { + sendError("Ride not active", 200, ["current_status" => $status]); + } + + $stmtLoc = $con_tracking->prepare("SELECT latitude, longitude, heading, speed, updated_at FROM car_locations WHERE driver_id = ? ORDER BY updated_at DESC LIMIT 1"); + $stmtLoc->execute([$driverID]); + $locData = $stmtLoc->fetch(PDO::FETCH_ASSOC); + + if (!$locData) sendError("Waiting for driver signal...", 200); + + $stmtDriver = $con->prepare("SELECT d.first_name, c.model, c.color, c.car_plate FROM driver d LEFT JOIN CarRegistration c ON d.id = c.driverID WHERE d.id = ? LIMIT 1"); + $stmtDriver->execute([$driverID]); + $driverInfo = $stmtDriver->fetch(PDO::FETCH_ASSOC); + + $driverName = "Captain"; + $carModel = "Car"; + $carColor = ""; + $plate = ""; + + if ($driverInfo) { + if (!empty($driverInfo['first_name'])) $driverName = $encryptionHelper->decryptData($driverInfo['first_name']); + if (!empty($driverInfo['model'])) $carModel = $driverInfo['model']; + if (!empty($driverInfo['color'])) $carColor = $driverInfo['color']; + if (!empty($driverInfo['car_plate'])) $plate = $encryptionHelper->decryptData($driverInfo['car_plate']); + } + + $response = [ + "status" => "success", + "data" => [ + "lat" => $locData['latitude'], + "lng" => $locData['longitude'], + "heading" => $locData['heading'], + "speed" => $locData['speed'], + "last_update" => $locData['updated_at'], + "driver_name" => $driverName, + "car_model" => $carModel, + "car_color" => $carColor, + "plate" => $plate, + "ride_status" => $status + ] + ]; + + // التنظيف النهائي قبل الطباعة + ob_clean(); + echo json_encode($response); + +} catch (Exception $e) { + error_log("Tracking API Error: " . $e->getMessage()); + sendError("Server Error"); +} +``` + +## File: ride/rides/getRideOrderID.php +``` +prepare($sqlRide); + + // ربط المتغيرات حسب نوع البحث + if (!empty($rideID)) { + $stmtRide->bindParam(':rideID', $rideID); + } else { + $stmtRide->bindParam(':passengerID', $passengerID); + } + + $stmtRide->execute(); + + $rideData = $stmtRide->fetch(PDO::FETCH_ASSOC); + + // إذا لم يتم العثور على رحلة في سيرفر الرحلات، نوقف العملية + if (!$rideData) { + echo json_encode(["status" => "failure", "message" => "No ride found"]); + exit; + } + + // ================================================================= + // 2. الخطوة الثانية: جلب البيانات الثابتة (سائق، سيارة، تقييم) من السيرفر الرئيسي ($con) + // نستخدم المعرفات التي حصلنا عليها من نتيجة الاستعلام الأول + // ================================================================= + + $driverID = $rideData['driver_id']; + $pID = $rideData['passenger_id']; // نأخذ معرف الراكب من الرحلة نفسها لضمان التطابق + + // ملاحظة: استخدام :driverID_Sub في الاستعلام الفرعي لتجنب أخطاء PDO + $sqlDetails = "SELECT + passengers.first_name AS passengerName, + passengers.last_name, + + CarRegistration.make, + CarRegistration.model, + CarRegistration.car_plate, + CarRegistration.year, + CarRegistration.color, + CarRegistration.color_hex, + + driver.first_name AS driverName, + driver.gender, + driver.phone, + + ( + SELECT ROUND(AVG(ratingDriver.rating), 2) + FROM ratingDriver + WHERE ratingDriver.driver_id = :driverID_Sub + ) AS ratingDriver, + + driverToken.token AS token + + FROM driver + LEFT JOIN passengers ON passengers.id = :passengerID + LEFT JOIN CarRegistration ON CarRegistration.driverID = driver.id + LEFT JOIN driverToken ON driverToken.captain_id = driver.id + WHERE driver.id = :driverID"; + + // نستخدم المتغير الأصلي $con للسيرفر الرئيسي + $stmtDetails = $con->prepare($sqlDetails); + + // نربط المتغيرات + $stmtDetails->bindParam(':driverID', $driverID); + $stmtDetails->bindParam(':driverID_Sub', $driverID); + $stmtDetails->bindParam(':passengerID', $pID); + + $stmtDetails->execute(); + + $detailsData = $stmtDetails->fetch(PDO::FETCH_ASSOC); + + // ================================================================= + // 3. الخطوة الثالثة: دمج البيانات وتجهيز الرد + // ================================================================= + + $finalData = []; + + if ($detailsData) { + // دمج مصفوفة الرحلة (من سيرفر الرحلات) مع مصفوفة التفاصيل (من الرئيسي) + $finalData = array_merge($rideData, $detailsData); + } else { + // في حال كانت الرحلة بدون سائق بعد، نكتفي ببيانات الرحلة + $finalData = $rideData; + } + + // ================================================================= + // 4. فك التشفير (Decrypt) + // ================================================================= + + if ($finalData) { + $fieldsToDecrypt = ['driverName', 'gender', 'phone', 'car_plate', 'passengerName', 'last_name', 'token']; + + foreach ($fieldsToDecrypt as $field) { + if (!empty($finalData[$field])) { + $finalData[$field] = $encryptionHelper->decryptData($finalData[$field]); + } + } + } + + echo json_encode([ + "status" => "success", + "data" => $finalData + ]); + +} catch (Exception $e) { + error_log("API Error: " . $e->getMessage()); + http_response_code(500); + echo json_encode(["status" => "failure", "message" => "Server Error: " . $e->getMessage()]); +} +?> +``` + +## File: ride/rides/test_notification.php +``` + 'dispatch_order', + 'drivers_ids' => json_encode([$driverId]), + 'ride_id' => $rideId, + 'payload' => $payload +]; + +$ch = curl_init($socketUrl); +curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); +curl_setopt($ch, CURLOPT_POST, true); +curl_setopt($ch, CURLOPT_POSTFIELDS, http_build_query($postData)); +curl_setopt($ch, CURLOPT_HTTPHEADER, ["x-internal-key: $INTERNAL_KEY"]); +curl_setopt($ch, CURLOPT_TIMEOUT, 3); + +$response = curl_exec($ch); +$httpCode = curl_getinfo($ch, CURLINFO_HTTP_CODE); + +if (curl_errno($ch)) { + die("Curl error: " . curl_error($ch)); +} +curl_close($ch); + +echo "HTTP Code: $httpCode\n"; +echo "Response: $response\n"; + +``` + +## File: ride/rides/getRideStatus.php +``` +prepare($sql); +$stmt->bindParam(':id', $id, PDO::PARAM_INT); +$stmt->execute(); + +$row = $stmt->fetch(PDO::FETCH_ASSOC); + +if ($row && isset($row['status'])) { + echo json_encode([ + "status" => "success", + "data" => $row['status'] + ]); +} else { + jsonError("Ride not found."); +} +?> +``` + +## File: ride/rides/cancel_ride_by_driver.php +``` +beginTransaction(); + + // --------------------------------------------------------- + // 1. معالجة driver_orders (Insert or Update) + // --------------------------------------------------------- + $checkStmt = $con->prepare("SELECT order_id FROM driver_orders WHERE order_id = ? AND driver_id = ?"); + $checkStmt->execute([$rideId, $driverId]); + + if ($checkStmt->rowCount() > 0) { + // موجود: تحديث + $stmtLog = $con->prepare("UPDATE driver_orders SET status = ?, notes = ?, created_at = NOW() WHERE order_id = ? AND driver_id = ?"); + $stmtLog->execute([$statusText, $reason, $rideId, $driverId]); + } else { + // غير موجود: إدخال + $stmtLog = $con->prepare("INSERT INTO driver_orders (driver_id, order_id, status, created_at, notes) VALUES (?, ?, ?, NOW(), ?)"); + $stmtLog->execute([$driverId, $rideId, $statusText, $reason]); + } + + // --------------------------------------------------------- + // 2. منطق الحظر (Business Logic) + // --------------------------------------------------------- + $stmtCount = $con->prepare(" + SELECT COUNT(*) FROM driver_orders + WHERE driver_id = ? + AND status = ? + AND created_at >= NOW() - INTERVAL 1 DAY + "); + $stmtCount->execute([$driverId, $statusText]); + $cancelCount = $stmtCount->fetchColumn(); + + $isBlocked = false; + $blockUntil = ""; + + if ($cancelCount >= 3) { + $isBlocked = true; + $blockUntil = date('Y-m-d H:i:s', strtotime('+4 hours')); + // يمكنك هنا تحديث حالة السائق في جدول driver إذا لزم الأمر + } + + // --------------------------------------------------------- + // 3. تحديث حالة الرحلة في جدول ride + // --------------------------------------------------------- + $sqlRide = "UPDATE ride SET status = ?, driver_id = 0 WHERE id = ?"; + + // Local DB + $con->prepare($sqlRide)->execute([$statusText, $rideId]); + + // Remote DB (إن وجد) + if (isset($con_ride)) { + $con_ride->prepare($sqlRide)->execute([$statusText, $rideId]); + } + + // --------------------------------------------------------- + // 4. إشعار الراكب + // --------------------------------------------------------- + + // أ) Socket (يحتاج Passenger ID) + $stmtPas = $con->prepare("SELECT passenger_id FROM ride WHERE id = ?"); + $stmtPas->execute([$rideId]); + $passenger_id = $stmtPas->fetchColumn(); + + if ($passenger_id) { + $socketPayload = [ + 'ride_id' => $rideId, + 'status' => 'cancelled_by_driver', + 'msg' => 'تم إلغاء الرحلة من قبل السائق' + ]; + if (function_exists('notifyPassengerOnRideServer')) { + notifyPassengerOnRideServer($passenger_id, $socketPayload); + } + } + + // ب) FCM (Internal) + if (!empty($passengerToken)) { + $fcmData = [ + 'ride_id' => (string)$rideId + ]; + + // 🔥 استخدام الدالة الجديدة + sendFCM_Internal( + $passengerToken, // الهدف + "تم إلغاء الرحلة ❌", // العنوان + "عذراً، قام السائق بإلغاء الرحلة.", // النص + $fcmData, // البيانات + "Cancel Trip from driver", // التصنيف (تأكد أنه يطابق ما في تطبيق الراكب) + false // ليس Topic + ); + } + + $con->commit(); + + // 5. الرد للفلاتر + echo json_encode([ + "status" => "success", + "cancel_count" => $cancelCount, + "is_blocked" => $isBlocked, + "block_until" => $blockUntil + ]); + +} catch (PDOException $e) { + if ($con->inTransaction()) $con->rollBack(); + jsonError("DB Error: " . $e->getMessage()); +} +?> +``` + +## File: ride/rides/emailToPassengerTripDetail.php +``` + + + + + +Tripz Logo +

Hi $passengerName,

+

Thank you for booking your ride with Tripz. Here are the details of your recent trip:

+ + + + + + + + + + +
DetailValue
Passenger$passengerName
Email$passengerEmail
Phone$passengerPhone
Fee$$fee
Start Location$startLocation ($startNameLocation)
End Location$endLocation ($endNameLocation)
Time of Trip$timeOfTrip
Duration$duration minutes
"; + +if ($discount > 0) { + $bodyEmail .= "

You have received a 12% discount on your trip from $startNameLocation to $endNameLocation. The original fee was $$beforDiscount. Your discounted fee is $$fee.

"; +} + +$bodyEmail .= "

Thank you for using Tripz. We hope you have a great day!

Best regards,
Tripz Team

"; + +// إعداد البريد +$mail = new PHPMailer(true); + +try { + $mail->isSMTP(); + $mail->Host = 'smtp.hostinger.com'; + $mail->SMTPAuth = true; + $mail->Username = 'hamzaayed@tripz-egypt.com'; + $mail->Password = $TRIPZ_SMTP_PASSWORD; + $mail->SMTPSecure = PHPMailer::ENCRYPTION_STARTTLS; + $mail->Port = 587; + + $mail->setFrom('hamzaayed@tripz-egypt.com', 'Tripz'); + $mail->addAddress($passengerEmail, $passengerName); + $mail->isHTML(true); + $mail->Subject = 'Your Tripz Trip Details'; + $mail->Body = $bodyEmail; + + $mail->send(); + echo json_encode(["status" => "success", "message" => "Email sent successfully"]); +} catch (Exception $e) { + echo json_encode(["status" => "error", "message" => $mail->ErrorInfo]); +} +``` + +## File: ride/rides/getRideOrderIDNew.php +``` +prepare($sqlRide); + + // ربط المتغيرات حسب نوع البحث + if (!empty($rideID)) { + $stmtRide->bindParam(':rideID', $rideID); + } else { + $stmtRide->bindParam(':passengerID', $passengerID); + } + + $stmtRide->execute(); + + $rideData = $stmtRide->fetch(PDO::FETCH_ASSOC); + + // إذا لم يتم العثور على رحلة في سيرفر الرحلات، نوقف العملية + if (!$rideData) { + echo json_encode(["status" => "failure", "message" => "No ride found"]); + exit; + } + + // ================================================================= + // 2. الخطوة الثانية: جلب البيانات الثابتة (سائق، سيارة، تقييم) من السيرفر الرئيسي ($con) + // نستخدم المعرفات التي حصلنا عليها من نتيجة الاستعلام الأول + // ================================================================= + + $driverID = $rideData['driver_id']; + $pID = $rideData['passenger_id']; // نأخذ معرف الراكب من الرحلة نفسها لضمان التطابق + + // ملاحظة: استخدام :driverID_Sub في الاستعلام الفرعي لتجنب أخطاء PDO + $sqlDetails = "SELECT + passengers.first_name AS passengerName, + passengers.last_name, + + CarRegistration.make, + CarRegistration.model, + CarRegistration.car_plate, + CarRegistration.year, + CarRegistration.color, + CarRegistration.color_hex, + + driver.first_name AS driverName, + driver.gender, + driver.phone, + + ( + SELECT ROUND(AVG(ratingDriver.rating), 2) + FROM ratingDriver + WHERE ratingDriver.driver_id = :driverID_Sub + ) AS ratingDriver, + + driverToken.token AS token + + FROM driver + LEFT JOIN passengers ON passengers.id = :passengerID + LEFT JOIN CarRegistration ON CarRegistration.driverID = driver.id + LEFT JOIN driverToken ON driverToken.captain_id = driver.id + WHERE driver.id = :driverID"; + + // نستخدم المتغير الأصلي $con للسيرفر الرئيسي + $stmtDetails = $con->prepare($sqlDetails); + + // نربط المتغيرات + $stmtDetails->bindParam(':driverID', $driverID); + $stmtDetails->bindParam(':driverID_Sub', $driverID); + $stmtDetails->bindParam(':passengerID', $pID); + + $stmtDetails->execute(); + + $detailsData = $stmtDetails->fetch(PDO::FETCH_ASSOC); + + // ================================================================= + // 3. الخطوة الثالثة: دمج البيانات وتجهيز الرد + // ================================================================= + + $finalData = []; + + if ($detailsData) { + // دمج مصفوفة الرحلة (من سيرفر الرحلات) مع مصفوفة التفاصيل (من الرئيسي) + $finalData = array_merge($rideData, $detailsData); + } else { + // في حال كانت الرحلة بدون سائق بعد، نكتفي ببيانات الرحلة + $finalData = $rideData; + } + + // ================================================================= + // 4. فك التشفير (Decrypt) + // ================================================================= + + if ($finalData) { + $fieldsToDecrypt = ['driverName', 'gender', 'phone', 'car_plate', 'passengerName', 'last_name', 'token']; + + foreach ($fieldsToDecrypt as $field) { + if (!empty($finalData[$field])) { + $finalData[$field] = $encryptionHelper->decryptData($finalData[$field]); + } + } + } + + echo json_encode([ + "status" => "success", + "data" => $finalData + ]); + +} catch (Exception $e) { + error_log("API Error: " . $e->getMessage()); + http_response_code(500); + echo json_encode(["status" => "failure", "message" => "Server Error: " . $e->getMessage()]); +} +?> +``` + +## File: ride/license/add.php +``` +prepare($sql); +$stmt->bindParam(':driverID', $driverID); +$stmt->bindParam(':name', $name); +$stmt->bindParam(':licenseClass', $licenseClass); +$stmt->bindParam(':documentNo', $documentNo); +$stmt->bindParam(':address', $address); +$stmt->bindParam(':height', $height); +$stmt->bindParam(':postalCode', $postalCode); +$stmt->bindParam(':sex', $sex); +$stmt->bindParam(':stateCode', $stateCode); +$stmt->bindParam(':expireDate', $expireDate); +$stmt->bindParam(':dateOfBirth', $dateOfBirth); +$stmt->execute(); + +if ($stmt->rowCount() > 0) { + // Print a success message + jsonSuccess($message = "Data saved successfully"); +} else { + // Print a failure message + jsonError($message = "Failed to save data"); +} +?> +``` + +## File: ride/license/update.php +``` + +``` + +## File: ride/license/get.php +``` +prepare($sql); +$stmt->execute(); +$result = $stmt->fetchAll(PDO::FETCH_ASSOC); + +if ($result) { + // Print all promo records + jsonSuccess($result); +} else { + // Print a failure message + jsonError($message = "Failed to retrieve promo records"); + +} +?> +``` + +## File: ride/license/delete.php +``` + +``` + +## File: ride/notificationPassenger/add.php +``` +prepare($sql); +$stmt->execute([ + ':title' => $title, + ':body' => $body, + ':passengerID' => $passengerID +]); + +if ($stmt->rowCount() > 0) { + jsonSuccess(null, "Notification data saved successfully"); +} else { + jsonError("Failed to save notification data"); +} + +?> +``` + +## File: ride/notificationPassenger/update.php +``` + $id]; + +$mapping = [ + "title" => "title", + "body" => "body", + "passengerID" => "passenger_id", + "isShown" => "isShown", + "updatedAt" => "updated_at" +]; + +// تجهيز الـ SET والأرقام المقابلة +foreach ($mapping as $requestKey => $dbColumn) { + if (isset($_POST[$requestKey])) { + $value = filterRequest($requestKey); + $fields[] = "`$dbColumn` = :$requestKey"; + $params[":$requestKey"] = $value; + } +} + +if (empty($fields)) { + jsonError("No fields to update"); + exit; +} + +$setClause = implode(", ", $fields); +$sql = "UPDATE `notifications` SET $setClause WHERE `id` = :id"; + +$stmt = $con->prepare($sql); +$stmt->execute($params); + +if ($stmt->rowCount() > 0) { + jsonSuccess(null, "Notification data updated successfully"); +} else { + jsonError("Failed to update notification data"); +} +?> +``` + +## File: ride/notificationPassenger/get.php +``` += CURDATE() - INTERVAL 7 DAY +ORDER BY `created_at` DESC +LIMIT 10"; + +$stmt = $con->prepare($sql); +$stmt->bindParam(':passenger_id', $passenger_id, PDO::PARAM_STR); +$stmt->execute(); +$notifications = $stmt->fetchAll(PDO::FETCH_ASSOC); + +if ($notifications) { + jsonSuccess($notifications); +} else { + jsonError("No notification data found"); +} + +?> +``` + +## File: ride/notificationPassenger/delete.php +``` + +``` + +## File: ride/card-image-driver/add.php +``` + + +// require_once __DIR__ . '/../../connect.php'; + +// $driverID = filterRequest("driver_id"); +// $imageName = filterRequest("image_name"); +// $link = filterRequest("link"); + +// // Check if the driverID exists in the table +// $checkSQL = "SELECT * FROM `card_images` WHERE `driver_id` = '$driverID'"; +// $checkStmt = $con->prepare($checkSQL); +// $checkStmt->execute(); + +// if ($checkStmt->rowCount() > 0) { +// // Driver ID found, update the upload_date +// $uploadDate = date("Y-m-d H:i:s"); + +// $updateSQL = "UPDATE `card_images` SET `upload_date` = '$uploadDate' WHERE `driver_id` = '$driverID'"; +// $updateStmt = $con->prepare($updateSQL); +// $updateStmt->execute(); + +// if ($updateStmt->rowCount() > 0) { +// // Print a success message for update +// jsonSuccess($message = "Record updated successfully"); +// } else { +// // Print a failure message for update +// jsonError($message = "Failed to update record"); +// } +// } else { +// // Driver ID not found, insert a new record +// $sql = "INSERT INTO `card_images` (`id`, `driver_id`, `image_name`, `link`) +// VALUES (SHA2(UUID(), 256), '$driverID', '$imageName', '$link')"; + +// $stmt = $con->prepare($sql); +// $stmt->execute(); + +// if ($stmt->rowCount() > 0) { +// // Print a success message for insert +// jsonSuccess($message = "Record inserted successfully"); +// } else { +// // Print a failure message for insert +// jsonError($message = "Failed to insert record"); +// } +// } + + + + + + 'The image file was not uploaded successfully.')); + exit; +} + +// Get the file name of the image file. +$image_name = $image_file['name']; + +// Get the file extension of the image file. +$image_extension = pathinfo($image_name, PATHINFO_EXTENSION); + +// Check if the image file is a valid image file. +if (!in_array($image_extension, array('jpg', 'jpeg', 'png'))) { + echo json_encode(array('status' => 'The image file is not a valid image file.')); + exit; +} + +// Generate a new filename using the driver ID. +$new_filename = $driverID . '.' . $image_extension; + +// Move the image file to the uploads directory with the new filename. +$target_dir = "card_image/"; +$target_file = $target_dir . $new_filename; +move_uploaded_file($image_file['tmp_name'], $target_file); + +// Update the image name variable with the new filename. +$image_name = $new_filename; + +// Check if the driverID already exists in the database. +$sql = "SELECT * FROM card_images WHERE driver_id = '$driverID'"; +$result = mysqli_query($conn, $sql); + +if (mysqli_num_rows($result) > 0) { + // The driverID already exists in the database, so update the upload_date + $uploadDate = date("Y-m-d H:i:s"); + $linlImage='https://ride.mobile-app.store/card_image/'.$image_name; + $updateSQL = "UPDATE card_images SET upload_date = '$uploadDate' WHERE driver_id = '$driverID'"; + mysqli_query($conn, $updateSQL); + + if (mysqli_affected_rows($conn) > 0) { + // Print a success message for update + echo json_encode(array('status' => 'Record updated successfully')); + } else { + // Print a failure message for update + echo json_encode(array('status' => 'Failed to update record')); + } +} else { + // The driverID does not exist in the database, so insert a new row. + $insertSQL = "INSERT INTO card_images (id, driver_id, image_name, `link`) + VALUES (SHA2(UUID(), 256), '$driverID', '$image_name',)"; + mysqli_query($conn, $insertSQL); + + if (mysqli_affected_rows($conn) > 0) { + // Print a success message for insert + echo json_encode(array('status' => 'Record inserted successfully')); + } else { + // Print a failure message for insert + echo json_encode(array('status' => 'Failed to insert record')); + } +} + +?> +``` + +## File: ride/card-image-driver/update.php +``` + +``` + +## File: ride/card-image-driver/get.php +``` + +``` + +## File: ride/card-image-driver/delete.php +``` + +``` + +## File: ride/mishwari/add.php +``` +encryptData($phone); +$gender = $encryptionHelper->encryptData($gender); +$name = $encryptionHelper->encryptData($name); +$name_english = $encryptionHelper->encryptData($name_english); +$car_plate = $encryptionHelper->encryptData($car_plate); +$token = $encryptionHelper->encryptData($token); +$education = $encryptionHelper->encryptData($education); +$national_number = $encryptionHelper->encryptData($national_number); +$age = $encryptionHelper->encryptData($age); + +// ⏰ تحويل الوقت للفحص +$selectedTime = new DateTime($timeSelected); +$startTime = $selectedTime->format('Y-m-d H:i:s'); +$endTime = $selectedTime->add(new DateInterval('PT6H'))->format('Y-m-d H:i:s'); + +// ✅ فحص هل السائق لديه أكثر من رحلتين خلال 6 ساعات +$sqlCheck = "SELECT COUNT(*) as trip_count + FROM `mishwaritrips` + WHERE `driverId` = :driverId + AND `timeSelected` BETWEEN :startTime AND :endTime"; +$stmtCheck = $con->prepare($sqlCheck); +$stmtCheck->bindParam(':driverId', $driverId); +$stmtCheck->bindParam(':startTime', $startTime); +$stmtCheck->bindParam(':endTime', $endTime); +$stmtCheck->execute(); +$result = $stmtCheck->fetch(PDO::FETCH_ASSOC); + +if ($result['trip_count'] >= 2) { + jsonError("Driver already has 2 trips within the specified period."); + exit; +} + +// ✅ فحص إن الراكب لا يملك رحلة فعالة بنفس اليوم +$sqlCheckPassenger = " +SELECT * +FROM `mishwaritrips` +WHERE `passengerId` = :passengerId +AND `status` != 'Finished' +AND DATE(`timeSelected`) = CURDATE() +"; +$stmtCheckPassenger = $con->prepare($sqlCheckPassenger); +$stmtCheckPassenger->bindParam(':passengerId', $passengerId); +$stmtCheckPassenger->execute(); +$existingTrip = $stmtCheckPassenger->fetch(PDO::FETCH_ASSOC); + +// إذا كانت موجودة يتم التحديث +if ($existingTrip) { + $sqlUpdate = "UPDATE `mishwaritrips` SET + `driverId` = :driverId, + `phone` = :phone, + `gender` = :gender, + `name` = :name, + `name_english` = :name_english, + `address` = :address, + `religion` = :religion, + `age` = :age, + `startNameAddress` = :startNameAddress, + `locationCoordinate` = :locationCoordinate, + `education` = :education, + `license_type` = :license_type, + `national_number` = :national_number, + `car_plate` = :car_plate, + `make` = :make, + `model` = :model, + `color` = :color, + `color_hex` = :color_hex, + `token` = :token, + `rating` = :rating, + `countRide` = :countRide, + `timeSelected` = :timeSelected, + `status` = :status + WHERE `passengerId` = :passengerId"; + + $stmtUpdate = $con->prepare($sqlUpdate); + $stmtUpdate->execute([ + ':driverId' => $driverId, + ':phone' => $phone, + ':gender' => $gender, + ':name' => $name, + ':name_english' => $name_english, + ':address' => $address, + ':religion' => $religion, + ':age' => $age, + ':startNameAddress' => $startNameAddress, + ':locationCoordinate' => $locationCoordinate, + ':education' => $education, + ':license_type' => $license_type, + ':national_number' => $national_number, + ':car_plate' => $car_plate, + ':make' => $make, + ':model' => $model, + ':color' => $color, + ':color_hex' => $color_hex, + ':token' => $token, + ':rating' => $rating, + ':countRide' => $countRide, + ':timeSelected' => $timeSelected, + ':status' => $status, + ':passengerId' => $passengerId + ]); + + if ($stmtUpdate->rowCount() > 0) { + jsonSuccess(null, "Trip updated successfully"); + } else { + jsonError("Failed to update trip data"); + } + +} else { + // إدخال رحلة جديدة + $sqlInsert = "INSERT INTO `mishwaritrips` ( + `driverId`, `phone`, `gender`, `name`, `name_english`, `address`, `religion`, + `age`, `startNameAddress`, `locationCoordinate`, `education`, `license_type`, + `national_number`, `car_plate`, `make`, `model`, `color`, `color_hex`, `token`, + `rating`, `countRide`, `passengerId`, `timeSelected`, `createdAt`, `status` + ) VALUES ( + :driverId, :phone, :gender, :name, :name_english, :address, :religion, + :age, :startNameAddress, :locationCoordinate, :education, :license_type, + :national_number, :car_plate, :make, :model, :color, :color_hex, :token, + :rating, :countRide, :passengerId, :timeSelected, NOW(), :status + )"; + + $stmtInsert = $con->prepare($sqlInsert); + $stmtInsert->execute([ + ':driverId' => $driverId, + ':phone' => $phone, + ':gender' => $gender, + ':name' => $name, + ':name_english' => $name_english, + ':address' => $address, + ':religion' => $religion, + ':age' => $age, + ':startNameAddress' => $startNameAddress, + ':locationCoordinate' => $locationCoordinate, + ':education' => $education, + ':license_type' => $license_type, + ':national_number' => $national_number, + ':car_plate' => $car_plate, + ':make' => $make, + ':model' => $model, + ':color' => $color, + ':color_hex' => $color_hex, + ':token' => $token, + ':rating' => $rating, + ':countRide' => $countRide, + ':passengerId' => $passengerId, + ':timeSelected' => $timeSelected, + ':status' => $status + ]); + + if ($stmtInsert->rowCount() > 0) { + jsonSuccess(null, "New trip inserted successfully"); + } else { + jsonError("Failed to insert new trip data"); + } +} +?> +``` + +## File: ride/mishwari/get.php +``` += CURDATE() - INTERVAL 4 DAY + AND mi.timeSelected > NOW() +ORDER BY + mi. `createdAt` +DESC +LIMIT 1 + + "; +$stmt = $con->prepare($sql); +$stmt->bindParam(':driverId', $driverId, PDO::PARAM_STR); +$stmt->execute(); + +if ($stmt->rowCount() > 0) { + // Fetch the record + $row = $stmt->fetchAll(PDO::FETCH_ASSOC); + + jsonSuccess($row); + +} + else{ + // Print a failure message + jsonError($message = "No wallet record found"); +} +?> +``` + +## File: ride/mishwari/cancel.php +``` +prepare($sql); +$stmt->bindParam(':status', $status, PDO::PARAM_STR); +$stmt->bindParam(':id', $id, PDO::PARAM_INT); // Bind the ID parameter + +// Execute the update +if ($stmt->execute()) { + // Check if the update was successful + if ($stmt->rowCount() > 0) { + // Trip status updated successfully + jsonSuccess(null, "Trip cancelled successfully."); + } else { + // No rows updated, meaning the trip might not have been found or was already cancelled + jsonError("No trip found to cancel."); + } +} else { + // Print failure if the update query failed + $errorInfo = $stmt->errorInfo(); + error_log('SQL Error: ' . implode(", ", $errorInfo)); + jsonError("Failed to cancel the trip."); +} +?> +``` + +## File: ride/mishwari/getDriver.php +``` += CURDATE() - INTERVAL 4 DAY + AND mi.timeSelected > NOW() +ORDER BY + mi. `createdAt` +DESC +LIMIT 1 + + "; +$stmt = $con->prepare($sql); +$stmt->bindParam(':driverId', $driverId, PDO::PARAM_STR); +$stmt->execute(); + +if ($stmt->rowCount() > 0) { + // Fetch the record + $row = $stmt->fetchAll(PDO::FETCH_ASSOC); + + jsonSuccess($row); + +} + else{ + // Print a failure message + jsonError($message = "No wallet record found"); +} +?> +``` + +## File: ride/mishwari/test.php +``` +prepare($sql); +$stmt->execute(); + +if ($stmt->rowCount() > 0) { + $rows = $stmt->fetchAll(PDO::FETCH_ASSOC); + + // فك التشفير للحقول الحساسة + foreach ($rows as &$row) { + $row['phone'] = $encryptionHelper->decryptData($row['phone']); + $row['email'] = $encryptionHelper->decryptData($row['email']); + $row['gender'] = $encryptionHelper->decryptData($row['gender']); + $row['birthdate'] = $encryptionHelper->decryptData($row['birthdate']); + $row['site'] = $encryptionHelper->decryptData($row['site']); + $row['first_name'] = $encryptionHelper->decryptData($row['first_name']); + $row['last_name'] = $encryptionHelper->decryptData($row['last_name']); + $row['sosPhone'] = $encryptionHelper->decryptData($row['sosPhone']); + $row['education'] = $encryptionHelper->decryptData($row['education']); + $row['employmentType'] = $encryptionHelper->decryptData($row['employmentType']); + $row['maritalStatus'] = $encryptionHelper->decryptData($row['maritalStatus']); + } + + jsonSuccess($rows); +} else { + jsonError("No passengers found"); +} +?> +``` + +## File: ride/driverWallet/driverStatistic.php +``` +prepare($sql); +$stmt->execute(); + +if ($stmt->rowCount() > 0) { + // Fetch the record + $row = $stmt->fetchAll(PDO::FETCH_ASSOC); + + jsonSuccess($row); + +} + else{ + // Print a failure message + jsonError($message = "No wallet record found"); +} +?> +``` + +## File: ride/driverWallet/add.php +``` +prepare("SELECT * FROM payment_tokens WHERE token = :token AND isUsed = FALSE"); +$stmt->execute(array( + ':token' => $token +)); + +$tokenData = $stmt->fetch(); + +if ($tokenData) { + // Add payment to the driver's wallet table + $sql = "INSERT INTO `driverWallet` ( + `driverID`, + `paymentID`, + `amount`, + `paymentMethod` + ) VALUES ( + :driverID, + :paymentID, + :amount, + :paymentMethod + );"; + + $stmt = $con->prepare($sql); + $stmt->execute(array( + ':driverID' => $driverID, + ':paymentID' => $paymentID, + ':amount' => $amount, + ':paymentMethod' => $paymentMethod + )); + + if ($stmt->rowCount() > 0) { + // Print a success message + jsonSuccess(null, "Record saved successfully"); + + // Mark the token as used in the database + $stmt = $con->prepare("UPDATE payment_tokens SET isUsed = TRUE WHERE id = :tokenID"); + $stmt->execute(array( + ':tokenID' => $tokenData['id'] + )); + } else { + // Print a failure message + jsonError("Failed to save record"); + } +} else { + jsonError("Invalid or already used token"); +} + +``` + +## File: ride/driverWallet/update.php +``` + +``` + +## File: ride/driverWallet/get.php +``` +prepare($sql); +$stmt->execute(); + +if ($stmt->rowCount() > 0) { + // Fetch the record + $row = $stmt->fetchAll(PDO::FETCH_ASSOC); + + jsonSuccess($row); + +} + else{ + // Print a failure message + jsonError($message = "No wallet record found"); +} +?> +``` + +## File: ride/driverWallet/getDriverWeekPaymentMove.php +``` += DATE_SUB(NOW(), INTERVAL 1 WEEK) + ) AS totalAmount +FROM `driverWallet` +WHERE `driverID` = '$driverID' +AND `dateCreated` >= DATE_SUB(NOW(), INTERVAL 1 WEEK) +ORDER BY `dateCreated` DESC; +"; +$stmt = $con->prepare($sql); +$stmt->execute(); + +if ($stmt->rowCount() > 0) { + // Fetch the record + $row = $stmt->fetchAll(PDO::FETCH_ASSOC); + + jsonSuccess($row); + +} + else{ + // Print a failure message + jsonError($message = "No wallet record found"); +} +?> +``` + +## File: ride/driverWallet/getWalletByDriver.php +``` += DATE_SUB(NOW(), INTERVAL 1 MONTH) +ORDER BY + `paymentsDriverPoints`.`id` +DESC"; +$stmt = $con->prepare($sql); +$stmt->execute(); + +if ($stmt->rowCount() > 0) { + // Fetch the record + $row = $stmt->fetchAll(PDO::FETCH_ASSOC); + + jsonSuccess($row); + +} + else{ + // Print a failure message + jsonError($message = "No wallet record found"); +} +?> +``` + +## File: ride/driverWallet/getDriverDetails.php +``` +prepare($sql); +$stmt->execute(); +$data = $stmt->fetchAll(PDO::FETCH_ASSOC); + +if ($data) { + // Print the car location data as JSON + echo json_encode([ + 'status' => 'success', + + 'data' => $data + ]); +} else { + // Print a failure message + jsonError($message = "No car locations found"); +} + +?> +``` + +## File: ride/driverWallet/sendEmailTransfer.php +``` + + + + + +
+

تفاصيل نقلك على سفر

+

شكراً لاستخدام خدمتنا. نتمنى لك يوماً رائعاً!

+

نريد إعلامك أن مبلغ $amount تم نقله من حسابك إلى السائق الجديد، $newDriverName (هاتف: $driverPhone).

+

مع خالص التحية،
فريق سفر

+
+ + "; +} else { + $bodyEmail = " + + + + +
+ SEFER App Logo + +

Your SEFER Transfer Details

+

Thank you for using our service. We hope you have a great day!

+

We want to inform you that an amount of $amount has been transferred from your account to the new driver: $newDriverName (Phone: $driverPhone).

+

Regards,
SEFER Team

+
+ + "; +} + +// Email headers +$supportEmail = 'seferteam@sefer.live'; +$headers = "MIME-Version: 1.0\r\n"; +$headers .= "Content-Type: text/html; charset=UTF-8\r\n"; +$headers .= "From: $supportEmail\r\n"; + +// Send email +if (!empty($driverEmail)) { + if (mail($driverEmail, "Your SEFER Transfer Details", $bodyEmail, $headers)) { + + mail($newEmail, "Your SEFER Transfer Details", $bodyEmail, $headers); + echo "Email sent successfully."; + } else { + echo "Email sending failed."; + } +} else { + echo "Invalid email address: $driverEmail"; +} + +``` + +## File: ride/driverWallet/delete.php +``` + +``` + +## File: ride/driverWallet/addPaymentToken.php +``` +prepare("INSERT INTO payment_tokens (token, driverID, dateCreated, amount) VALUES (?, ?, NOW(), ?)"); + +try { + $stmt->execute([$token, $driverID, $amount]); + if ($stmt->rowCount() > 0) { + jsonSuccess($token); + } else { + jsonError("Failed to save record"); + } +} catch (PDOException $e) { + jsonError("Database error: " . $e->getMessage()); +} + +function generateSecureToken($driverID, $amount) { + global $secretKey; + // Concatenate the parameters + $data = $driverID . $amount . time(); + + // Add the secret key from the environment variable + $data .= $secretKey; + + // Generate a hash + $hash = hash('sha256', $data); + + // Add some randomness + $randomBytes = bin2hex(random_bytes(16)); + + // Combine hash and random bytes + $token = $hash . $randomBytes; + + // Truncate to a reasonable length (e.g., 64 characters) + return substr($token, 0, 64); +} +``` + +## File: ride/location/getSpeed.php +``` += NOW() - INTERVAL :freshSeconds SECOND + ORDER BY updated_at DESC + LIMIT 100; -- نجلب 100 مرشح محتمل + "; + + $stmt_locations = $con_tracking->prepare($sql_locations); + $stmt_locations->bindValue(':boundingBox', $boundingBoxWKT); + $stmt_locations->bindValue(':freshSeconds', $freshSeconds, PDO::PARAM_INT); + $stmt_locations->execute(); + $locations = $stmt_locations->fetchAll(PDO::FETCH_ASSOC); + + if (!$locations) { + jsonError("No car locations found in the specified area."); + exit; + } + + // ================================================================= + // الخطوة 2: تجميع معرفات السائقين (driver_id) + // ================================================================= + $driver_ids = array_column($locations, 'driver_id'); + + // ================================================================= + // الخطوة 3: جلب البيانات الثابتة من القاعدة الأساسية وتطبيق الفلاتر الإضافية + // ================================================================= + $drivers_info = []; + if (!empty($driver_ids)) { + $placeholders = implode(',', array_fill(0, count($driver_ids), '?')); + + // هنا نطبق الشروط الخاصة بهذا السكريبت (موديل السيارة > 2000) + $sql_drivers_info = " + SELECT + d.id AS driver_id, d.phone, d.email, d.birthdate, d.first_name, d.last_name, d.gender, d.maritalStatus, + cr.make, cr.model, cr.color, cr.color_hex, cr.year, + dt.token, + COALESCE(rdAvg.ratingDriver, 0) AS ratingDriver, + COALESCE(rdAvg.ratingCount, 0) AS ratingCount + FROM driver d + LEFT JOIN CarRegistration cr ON cr.driverID = d.id + LEFT JOIN driverToken dt ON dt.captain_id = d.id + LEFT JOIN ( + SELECT driver_id, AVG(rating) AS ratingDriver, COUNT(id) AS ratingCount + FROM ratingDriver + GROUP BY driver_id + ) rdAvg ON rdAvg.driver_id = d.id + WHERE d.id IN ($placeholders) + -- AND COALESCE(cr.year, 0) > 2000 -- ⭐ الشرط الخاص بهذا السكريبت + -- AND (cr.make NOT LIKE '%دراج%' AND cr.model NOT LIKE '%دراج%') + AND (cr.model NOT LIKE '%Van%' AND cr.make NOT LIKE '%Van%') + "; + + $stmt_drivers_info = $con->prepare($sql_drivers_info); + $stmt_drivers_info->execute($driver_ids); + $drivers_info_raw = $stmt_drivers_info->fetchAll(PDO::FETCH_ASSOC); + + // تحويل المصفوفة لتسهيل عملية الدمج لاحقاً + foreach ($drivers_info_raw as $driver) { + $drivers_info[$driver['driver_id']] = $driver; + } + } + + // ================================================================= + // الخطوة 4: دمج النتائج في PHP + // ================================================================= + $final_results = []; + foreach ($locations as $location) { + $driver_id = $location['driver_id']; + if (isset($drivers_info[$driver_id])) { + $final_results[] = array_merge($location, $drivers_info[$driver_id]); + } + } + + // ================================================================= + // الخطوة 5: تطبيق الترتيب والحد النهائي في PHP + // ================================================================= + usort($final_results, function ($a, $b) { + if ($a['ratingDriver'] != $b['ratingDriver']) { + return $b['ratingDriver'] <=> $a['ratingDriver']; + } + if ($a['ratingCount'] != $b['ratingCount']) { + return $b['ratingCount'] <=> $a['ratingCount']; + } + return strtotime($b['updated_at']) <=> strtotime($a['updated_at']); + }); + + $limited_results = array_slice($final_results, 0, 10); + + if (empty($limited_results)) { + jsonError("No cars matching the specific criteria (year > 2000) found."); + exit; + } + + // ================================================================= + // الخطوة 6: فك التشفير وحساب العمر (بدون تغيير) + // ================================================================= + $fieldsToDecrypt = [ 'phone','email','gender','birthdate', 'first_name','last_name', 'token','car_plate','vin' ]; + foreach ($limited_results as &$row) { + foreach ($fieldsToDecrypt as $field) { + if (isset($row[$field]) && !empty($row[$field])) { + try { $row[$field] = $encryptionHelper->decryptData($row[$field]); } + catch (Exception $e) { $row[$field] = null; } + } + } + if (!empty($row['birthdate'])) { + try { + $birthDate = new DateTime($row['birthdate']); + $today = new DateTime(); + $row['age'] = $today->diff($birthDate)->y; + } catch (Exception $e) { $row['age'] = null; } + } else { + $row['age'] = null; + } + } + unset($row); + + jsonSuccess($limited_results); + +} catch (PDOException $e) { + jsonError("Database error: " . $e->getMessage()); +} catch (Throwable $e) { + jsonError("Internal error: " . $e->getMessage()); +} + +``` + +## File: ride/location/add.php +``` + 99999999.99) { $dist = 99999999.99; } + if ($dist < -99999999.99){ $dist = -99999999.99; } + + if (empty($driver_id) || ($lat == 0.0 && $lng == 0.0)) { + jsonError("Invalid payload"); + exit; + } + + $created_at = date("Y-m-d H:i:s"); + + $sql = "INSERT INTO `car_tracks` + (`driver_id`,`latitude`,`longitude`,`heading`,`speed`,`distance`,`status`,`created_at`) + VALUES + (:driver_id,:latitude,:longitude,:heading,:speed,:distance,:status,:created_at)"; + + $stmt = $con->prepare($sql); + $ok = $stmt->execute([ + ':driver_id' => $driver_id, + ':latitude' => $lat, + ':longitude' => $lng, + ':heading' => $head, + ':speed' => $spd, + ':distance' => $dist, // ← now DECIMAL(10,2)-friendly + ':status' => (string)($status ?? 'on'), + ':created_at' => $created_at, + ]); + + if ($ok) { + jsonSuccess(null, "car_tracks saved successfully"); + } else { + jsonError("Failed to save car track"); + } +} catch (PDOException $e) { + error_log("car_tracks insert error: " . $e->getMessage()); + jsonError("Database error"); +} catch (Throwable $e) { + error_log("car_tracks insert fatal: " . $e->getMessage()); + jsonError("Server error"); +} +``` + +## File: ride/location/getfemalbehavior.php +``` += :southwestLat AND cl.latitude <= :northeastLat + AND cl.longitude >= :southwestLon AND cl.longitude <= :northeastLon + AND cl.status = 'off' + AND cl.updated_at >= NOW() - INTERVAL 5 SECOND + AND (cr.make NOT LIKE '%دراجة%' OR cr.model NOT LIKE '%دراجة%') + AND d.gender = 'Female' +GROUP BY cl.driver_id +ORDER BY ratingDriver DESC, cl.updated_at DESC +LIMIT 10; +"; + + $stmt = $con->prepare($sql); + $stmt->bindParam(':southwestLat', $southwestLat); + $stmt->bindParam(':southwestLon', $southwestLon); + $stmt->bindParam(':northeastLat', $northeastLat); + $stmt->bindParam(':northeastLon', $northeastLon); + + $stmt->execute(); + $car_locations = $stmt->fetchAll(PDO::FETCH_ASSOC); + + if ($car_locations) { + jsonSuccess($car_locations); + } else { + jsonError("No car locations found"); + } +} catch (PDOException $e) { + jsonError("Database error: " . $e->getMessage()); +} +?> +``` + +## File: ride/location/getDriverTimeOnline.php +``` += DATE_SUB(CURDATE(), INTERVAL ? DAY) + GROUP BY driver_id + HAVING grand_total_seconds > 60 -- (اختياري) تجاهل من عمل أقل من دقيقة + ORDER BY grand_total_seconds DESC + "; + + $stmt = $con_tracking->prepare($sql_summary); + $stmt->execute([$daysToLookBack]); + $summary_data = $stmt->fetchAll(PDO::FETCH_ASSOC); + + if (empty($summary_data)) { + // حفظ ملف فارغ وإنهاء + saveJsonFile($savePath, ["last_updated" => date('Y-m-d H:i:s'), "data" => []]); + printSuccess("No active drivers found in summary.", $savePath); + exit; + } + + // ================================================================= + // 2. جلب تفاصيل السائقين (الأسماء) من السيرفر الرئيسي 📝 + // ================================================================= + + // استخراج الـ IDs + $driver_ids = array_column($summary_data, 'driver_id'); + + // تجهيز الـ Placeholders (?,?,?) + $placeholders = implode(',', array_fill(0, count($driver_ids), '?')); + + $sql_drivers = "SELECT id, name_arabic, phone, created_at FROM driver WHERE id IN ($placeholders)"; + + $stmt_d = $con->prepare($sql_drivers); + $stmt_d->execute($driver_ids); + $drivers_raw = $stmt_d->fetchAll(PDO::FETCH_ASSOC); + + // تحويل البيانات لـ Map لسرعة الدمج: [id => data] + $drivers_map = []; + foreach ($drivers_raw as $d) { + $drivers_map[$d['id']] = $d; + } + + // ================================================================= + // 3. دمج البيانات وفك التشفير وتنسيق الوقت 🔄 + // ================================================================= + + $final_report = []; + $fieldsToDecrypt = ['phone', 'name_arabic']; // الحقول المشفرة + + foreach ($summary_data as $row) { + $did = $row['driver_id']; + $seconds = $row['grand_total_seconds']; + + // البيانات الشخصية + $personalData = isset($drivers_map[$did]) ? $drivers_map[$did] : ['name_arabic' => 'Unknown', 'phone' => '']; + + // فك التشفير + foreach ($fieldsToDecrypt as $field) { + if (!empty($personalData[$field])) { + try { + $personalData[$field] = $encryptionHelper->decryptData($personalData[$field]); + } catch (Exception $e) { + // ابقها مشفرة أو ضع قيمة افتراضية عند الفشل + } + } + } + + // تنسيق الوقت (مقروء للبشر) + $hours = floor($seconds / 3600); + $minutes = floor(($seconds % 3600) / 60); + $human_time = sprintf("%d ساعة و %d دقيقة", $hours, $minutes); + + // بناء الصف النهائي + $final_report[] = [ + 'driver_id' => $did, + 'name' => $personalData['name_arabic'], + 'phone' => $personalData['phone'], + 'join_date' => $personalData['created_at'], // تاريخ انضمام السائق + 'total_seconds' => $seconds, + 'active_time' => $human_time, + 'days_active' => $row['days_worked'] // عدد الأيام التي عمل فيها خلال الـ 10 أيام + ]; + } + + // ================================================================= + // 4. الحفظ والنشر 💾 + // ================================================================= + + $output = [ + "last_updated" => date('Y-m-d H:i:s'), + "period_days" => $daysToLookBack, + "total_drivers" => count($final_report), + "data" => $final_report + ]; + + saveJsonFile($savePath, $output); + printSuccess("Report generated based on Daily Summary.", $savePath); + +} catch (Exception $e) { + jsonError("Error: " . $e->getMessage()); +} + +// --- دوال مساعدة --- +function saveJsonFile($path, $data) { + $json = json_encode($data, JSON_UNESCAPED_UNICODE | JSON_PRETTY_PRINT); + file_put_contents($path, $json); +} +?> +``` + +## File: ride/location/update.php +``` +prepare($sql); + + // The execute method returns true on success and false on failure. + $success = $stmt->execute([ + ':latitude' => $latitude, + ':longitude' => $longitude, + ':heading' => $heading, + ':speed' => $speed, + ':distance' => $distance, + ':status' => $status, + ':updated_at' => $updated_at, + ':driver_id' => $driver_id + ]); + + // The reliable way to check for success is if execute() returns true + // and doesn't throw an exception. We no longer need rowCount(). + if ($success) { + // Print a success message + jsonSuccess(null, "Car location updated successfully"); + } else { + // This case is rare but might happen if execute fails without an exception + jsonError("Failed to update car location"); + } + +} catch (PDOException $e) { + // A real database error occurred. + http_response_code(500); + // You can log the detailed error for debugging + // error_log('Database error: ' . $e->getMessage()); + jsonError('Database error occurred'); +} +?> + +``` + +## File: ride/location/get.php +``` + $lat, + 'lng' => $lng, + 'radius' => 5, // 5 كم كافية للعرض + 'limit' => 50 + ])); + curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); + curl_setopt($ch, CURLOPT_TIMEOUT, 3); + curl_setopt($ch, CURLOPT_HTTPHEADER, ["x-internal-key: $INTERNAL_KEY"]); + + $response = curl_exec($ch); + $httpCode = curl_getinfo($ch, CURLINFO_HTTP_CODE); + curl_close($ch); + + $redisDrivers = []; + if ($httpCode == 200 && $response) { + $json = json_decode($response, true); + if (isset($json['status']) && $json['status'] === true) { + $redisDrivers = $json['data']; + } + } + + if (empty($redisDrivers)) { + jsonError("No drivers nearby"); + exit; + } + + // تجهيز خريطة لدمج البيانات لاحقاً (ID => RedisData) + $driversMap = []; + $driverIds = []; + foreach ($redisDrivers as $d) { + $driverIds[] = $d['id']; + $driversMap[$d['id']] = $d; + } + + // ========================================== + // 3. جلب التفاصيل الكاملة من MySQL (مثل الملف القديم تماماً) + // ========================================== + + // تجهيز الـ Placeholders + $placeholders = implode(',', array_fill(0, count($driverIds), '?')); + + // الاستعلام الشامل (نفس الحقول القديمة) + $sql_drivers_info = " + SELECT + d.id AS driver_id, + d.phone, d.email, d.birthdate, d.first_name, d.last_name, d.gender, d.maritalStatus, + cr.make, cr.car_plate, cr.model, cr.color, cr.vin, cr.color_hex, cr.year, cr.vehicle_category_id, + dt.token, + COALESCE(rdAvg.ratingDriver, 0) AS ratingDriver + FROM driver d + LEFT JOIN CarRegistration cr ON cr.driverID = d.id + LEFT JOIN driverToken dt ON dt.captain_id = d.id + LEFT JOIN ( + SELECT driver_id, AVG(rating) AS ratingDriver + FROM ratingDriver + GROUP BY driver_id + ) rdAvg ON rdAvg.driver_id = d.id + WHERE d.id IN ($placeholders) + AND COALESCE(cr.year, 0) > 2000 + AND (cr.make NOT LIKE '%دراج%' AND cr.model NOT LIKE '%دراج%') + "; + + $stmt = $con->prepare($sql_drivers_info); + $stmt->execute($driverIds); + $drivers_db = $stmt->fetchAll(PDO::FETCH_ASSOC); + + if (empty($drivers_db)) { + jsonError("No matching drivers in DB"); + exit; + } + + // ========================================== + // 4. معالجة البيانات، الدمج، وفك التشفير + // ========================================== + + $final_result = []; + $serverNow = date('Y-m-d H:i:s'); + $fieldsToDecrypt = ['phone','email','gender','birthdate','first_name','last_name','token','car_plate','vin']; + + // الهاش الخاص بالإناث (لتحديد النوع لاحقاً إذا لزم الأمر) + // $femaleHash = 'bQ6yWJ2EVXKZooHdGclvmFiDlZCM8UYeO+ILFjDUvpQ='; + + foreach ($drivers_db as $row) { + $did = $row['driver_id']; + + // دمج بيانات الموقع الحية من الريدز (أهم خطوة) + if (isset($driversMap[$did])) { + $redisInfo = $driversMap[$did]; + $row['latitude'] = $redisInfo['lat']; + $row['longitude'] = $redisInfo['lng']; + $row['heading'] = $redisInfo['heading']; + $row['speed'] = $redisInfo['speed']; + // $row['distance'] = $redisInfo['distance']; // إذا أردت إضافتها + } else { + // حالة نادرة: السائق موجود في الاستعلام ولكن ليس في مصفوفة الريدز (لا يجب أن تحدث) + continue; + } + + $row['serverNow'] = $serverNow; + + // فك التشفير (Decrypt) + foreach ($fieldsToDecrypt as $field) { + if (isset($row[$field]) && $row[$field] !== null && $row[$field] !== '') { + try { + $row[$field] = $encryptionHelper->decryptData($row[$field]); + } catch (Exception $e) { + $row[$field] = null; + } + } + } + + // حساب العمر + if (!empty($row['birthdate'])) { + try { + $birthdate = new DateTime($row['birthdate']); + $today = new DateTime(); + $row['age'] = $today->diff($birthdate)->y; + } catch (Exception $e) { $row['age'] = null; } + } else { + $row['age'] = null; + } + + // إضافة نوع السيارة البسيط (اختياري، إذا كان التطبيق يعتمد عليه) + /* + $type = 'car'; + if ($row['vehicle_category_id'] == 2) $type = 'bike'; + elseif ($row['gender'] == 'female') $type = 'lady'; // بعد فك التشفير تكون female + $row['type'] = $type; + */ + + $final_result[] = $row; + } + + // إرجاع النتيجة بنفس الهيكل القديم + jsonSuccess($final_result); + +} catch (PDOException $e) { + jsonError("Database error: " . $e->getMessage()); +} catch (Throwable $e) { + jsonError("Internal error: " . $e->getMessage()); +} +?> +``` + +## File: ride/location/getPinkBike.php +``` += NOW() - INTERVAL 5 SECOND + AND (cr.make LIKE '%دراجة%' OR cr.model LIKE '%دراجة%') + GROUP BY cl.driver_id + ORDER BY ratingDriver DESC, cl.updated_at DESC + LIMIT 10; + "; + + $stmt = $con->prepare($sql); + $stmt->bindParam(':southwestLat', $southwestLat); + $stmt->bindParam(':southwestLon', $southwestLon); + $stmt->bindParam(':northeastLat', $northeastLat); + $stmt->bindParam(':northeastLon', $northeastLon); + $stmt->execute(); + + $rows = $stmt->fetchAll(PDO::FETCH_ASSOC); + + if ($rows) { + $fieldsToDecrypt = [ + 'phone', 'email', 'gender', 'birthdate', + 'first_name', 'last_name', 'maritalStatus', 'token', + 'make', 'car_plate', 'vin' + ]; + + $filteredRows = []; + + foreach ($rows as &$row) { + foreach ($fieldsToDecrypt as $field) { + if (isset($row[$field])) { + $row[$field] = $encryptionHelper->decryptData($row[$field]); + } + } + + // فلترة حسب الجنس + if (strtolower($row['gender']) !== 'female') { + continue; + } + + // حساب العمر + if (!empty($row['birthdate'])) { + $birthDate = new DateTime($row['birthdate']); + $today = new DateTime(); + $row['age'] = $today->diff($birthDate)->y; + } else { + $row['age'] = null; + } + + $filteredRows[] = $row; + } + + jsonSuccess($filteredRows); + } else { + jsonError("No car locations found"); + } +} catch (PDOException $e) { + jsonError("Database error: " . $e->getMessage()); +} +``` + +## File: ride/location/get_location_area_links.php +``` +prepare($sql); + + $stmt->execute(); + + $car_locations = $stmt->fetchAll(PDO::FETCH_ASSOC); + + if ($car_locations) { + jsonSuccess($car_locations); + } else { + jsonError("No car locations found"); + } +} catch (PDOException $e) { + jsonError("Database error: " . $e->getMessage()); +} +``` + +## File: ride/location/getLocationParents.php +``` + يتصل بقاعدة البيانات الأساسية (driver, CarRegistration) +// $con_tracking -> يتصل بقاعدة بيانات التتبع (car_locations) +require_once __DIR__ . '/../../connect.php'; + +try { + $driver_id = filterRequest("driver_id"); + + if ($driver_id === false || empty($driver_id)) { + jsonError("Invalid driver_id provided"); + exit; + } + + // ================================================================= + // الخطوة 1: جلب آخر موقع للسائق من قاعدة بيانات التتبع + // ================================================================= + // هذا الاستعلام يعمل على قاعدة بيانات التتبع السريعة + // (ملاحظة: تم التغيير إلى ORDER BY updated_at لجلب آخر تحديث) + $sql_location = "SELECT + id, + driver_id, + latitude, + longitude, + heading, + speed, + status, + created_at, + updated_at + FROM + car_locations + WHERE + driver_id = ? + ORDER BY + updated_at DESC + LIMIT 1"; + + $stmt_location = $con_tracking->prepare($sql_location); + $stmt_location->execute([$driver_id]); + $location_data = $stmt_location->fetch(PDO::FETCH_ASSOC); + + // إذا لم نجد أي موقع، لا داعي لإكمال البحث + if (empty($location_data)) { + jsonError("No car locations found"); + exit; + } + + // ================================================================= + // الخطوة 2: جلب البيانات الثابتة للسائق من القاعدة الأساسية + // ================================================================= + // هذا الاستعلام يعمل على قاعدة البيانات الأساسية الهادئة + // (ملاحظة: تم إصلاح الخطأ في جملة JOIN) + $sql_driver_info = "SELECT + d.gender, + cr.model + FROM + driver d + LEFT JOIN CarRegistration cr ON d.id = cr.driverID + WHERE + d.id = ?"; + + $stmt_driver_info = $con->prepare($sql_driver_info); + $stmt_driver_info->execute([$driver_id]); + $driver_info = $stmt_driver_info->fetch(PDO::FETCH_ASSOC); + + // ================================================================= + // الخطوة 3: دمج النتائج (Application-Side Join) + // ================================================================= + + // دمج بيانات الموقع مع بيانات السائق + if (empty($driver_info)) { + $driver_info = []; // اجعله مصفوفة فارغة لتجنب خطأ في الدمج + } + + $final_result = array_merge($location_data, $driver_info); + + // السكربت الأصلي كان يستخدم fetchAll، لذا كان يرجع مصفوفة بداخلها عنصر واحد + // [ [ ... بيانات ... ] ] + // سنحافظ على نفس البنية لإرجاع البيانات + jsonSuccess([$final_result]); + + +} catch (PDOException $e) { + jsonError("Database error: " . $e->getMessage()); +} catch (Throwable $e) { + jsonError("Internal error: " . $e->getMessage()); +} +?> +``` + +## File: ride/location/getUpdatedLocationForAdmin.php +``` += NOW() - INTERVAL $freshSeconds SECOND"; + } + + // تحديد المسار الكامل بدقة + $savePath = __DIR__ . '/' . $fileName; + + // === فحص صلاحيات الكتابة === + if (!is_writable(__DIR__)) { + // إذا لم تكن هناك صلاحية، سنطبع الخطأ ونوقف التنفيذ + echo json_encode([ + "status" => "error", + "message" => "Permission Denied: Cannot write to directory. Please chmod 777 this folder.", + "path" => __DIR__ + ]); + exit; + } + + // 1. جلب المواقع + $sql_locations = " + SELECT t.driver_id, + t.latitude AS lat, + t.longitude AS lon, + t.heading, + t.speed, + t.created_at + FROM car_tracks t + INNER JOIN ( + SELECT driver_id, MAX(id) AS max_id + FROM car_tracks + WHERE $timeCondition + GROUP BY driver_id + ) latest + ON t.id = latest.max_id + ORDER BY t.created_at DESC +"; + $stmt = $con_tracking->prepare($sql_locations); + $stmt->execute(); + $locations = $stmt->fetchAll(PDO::FETCH_ASSOC); + + // 2. جلب بيانات السائقين + $driver_ids = array_unique(array_column($locations, 'driver_id')); + $drivers_info = []; + + if (!empty($driver_ids)) { + $placeholders = implode(',', array_fill(0, count($driver_ids), '?')); + $sql_drivers = "SELECT id, first_name, last_name, phone, + (SELECT COUNT(*) FROM ride WHERE driver_id = driver.id AND status = 'Completed') as completed, + (SELECT COUNT(*) FROM ride WHERE driver_id = driver.id AND status = 'CancelFromDriverAfterApply') as cancelled + FROM driver WHERE id IN ($placeholders)"; + $stmt_drivers = $con->prepare($sql_drivers); + $stmt_drivers->execute(array_values($driver_ids)); + foreach ($stmt_drivers->fetchAll(PDO::FETCH_ASSOC) as $row) { + $drivers_info[$row['id']] = $row; + } + } + + // 3. الدمج + $final_drivers = []; + foreach ($locations as $loc) { + $d_id = $loc['driver_id']; + $merged = [ + 'id' => $d_id, + 'lat' => $loc['lat'], + 'lon' => $loc['lon'], + 'heading' => $loc['heading'], + 'speed' => $loc['speed'], + 'name' => 'Unknown', + 'phone' => '', + 'completed' => 0, + 'cancelled' => 0 + ]; + + if (isset($drivers_info[$d_id])) { + $info = $drivers_info[$d_id]; + // فك التشفير البسيط (تأكد من عمل encryptionHelper) + if (isset($encryptionHelper)) { + try { $info['first_name'] = $encryptionHelper->decryptData($info['first_name']); } catch(Exception $e){} + try { $info['last_name'] = $encryptionHelper->decryptData($info['last_name']); } catch(Exception $e){} + try { $info['phone'] = $encryptionHelper->decryptData($info['phone']); } catch(Exception $e){} + } + + $merged['name'] = trim(($info['first_name']??'') . ' ' . ($info['last_name']??'')); + $merged['phone'] = $info['phone'] ?? ''; + $merged['completed'] = $info['completed'] ?? 0; + $merged['cancelled'] = $info['cancelled'] ?? 0; + } + $final_drivers[] = $merged; + } + + // 4. الحفظ + $jsonContent = json_encode(['drivers' => $final_drivers, 'last_updated' => date('Y-m-d H:i:s')], JSON_UNESCAPED_UNICODE); + + // محاولة الحفظ + if (file_put_contents($savePath, $jsonContent) !== false) { + echo json_encode(["status" => "success", "message" => "File written successfully to $savePath"]); + } else { + echo json_encode(["status" => "error", "message" => "Failed to write file. Check permissions."]); + } + +} catch (Exception $e) { + echo json_encode(["status" => "error", "message" => $e->getMessage()]); +} +?> +``` + +## File: ride/location/save_behavior.php +``` + يتصل بقاعدة البيانات الأساسية +// $con_tracking -> يتصل بقاعدة بيانات التتبع (driver_behavior, car_locations) +require_once __DIR__ . '/../../connect.php'; + +try { + // استلام البيانات من Flutter + $driver_id = filterRequest("driver_id"); + $trip_id = filterRequest("trip_id"); + $max_speed = filterRequest("max_speed"); + $avg_speed = filterRequest("avg_speed"); + $hard_brakes = filterRequest("hard_brakes"); + $total_distance = filterRequest("total_distance"); + $behavior_score = filterRequest("behavior_score"); + + // تحقق من القيم الأساسية + if (empty($driver_id) || empty($trip_id)) { + jsonError("Missing driver_id or trip_id"); + exit(); + } + + // إدخال البيانات في جدول driver_behavior باستخدام اتصال التتبع + // تم تغيير $con إلى $con_tracking + $stmt = $con_tracking->prepare(" + INSERT INTO driver_behavior ( + driver_id, trip_id, max_speed, avg_speed, + hard_brakes, total_distance, behavior_score + ) VALUES (?, ?, ?, ?, ?, ?, ?) + "); + + $stmt->execute([ + $driver_id, + $trip_id, + $max_speed, + $avg_speed, + $hard_brakes, + $total_distance, + $behavior_score + ]); + + // التحقق من نجاح العملية + if ($stmt->rowCount() > 0) { + jsonSuccess(null, "Behavior data saved"); + } else { + // في حالة عدم حدوث خطأ، ولكن لم يتم إدخال صف (قد يحدث)، + // من الأفضل إرجاع رسالة فشل عامة. + jsonError("Failed to save data (No rows affected)"); + } + +} catch (PDOException $e) { + jsonError("Database error: " . $e->getMessage()); +} catch (Throwable $e) { + jsonError("Internal error: " . $e->getMessage()); +} + +// تم حذف exit() من هنا ليتم التعامل معها داخل try/catch +?> +``` + +## File: ride/location/getDriverCarsLocationToPassengerAfterApplied.php +``` + يتصل بقاعدة البيانات الأساسية (driver, CarRegistration) +// $con_tracking -> يتصل بقاعدة بيانات التتبع (car_locations) +// وأنه يحتوي على كائن التشفير $encryptionHelper +require_once __DIR__ . '/../../connect.php'; + +try { + $driver_id = filterRequest("driver_id"); + + if ($driver_id === false || empty($driver_id)) { + jsonError("Invalid driver_id provided"); + exit; + } + + // ================================================================= + // الخطوة 1: جلب آخر موقع للسائق من قاعدة بيانات التتبع + // ================================================================= + $sql_location = "SELECT + driver_id, + latitude, + longitude, + heading, + speed, + status, + created_at, + updated_at + FROM + car_locations + WHERE + driver_id = ? + ORDER BY + updated_at DESC + LIMIT 1"; + + $stmt_location = $con_tracking->prepare($sql_location); + $stmt_location->execute([$driver_id]); + $location_data = $stmt_location->fetch(PDO::FETCH_ASSOC); + + // إذا لم نجد أي موقع، لا داعي لإكمال البحث + if (empty($location_data)) { + jsonError("No car locations found"); + exit; + } + + // ================================================================= + // الخطوة 2: جلب البيانات الثابتة للسائق من القاعدة الأساسية + // ================================================================= + $sql_driver_info = "SELECT + d.gender, + cr.model + FROM + driver d + LEFT JOIN CarRegistration cr ON d.id = cr.driverID + WHERE + d.id = ?"; + + $stmt_driver_info = $con->prepare($sql_driver_info); + $stmt_driver_info->execute([$driver_id]); + // نستخدم fetch وليس fetchAll لأننا نتوقع سائق واحد فقط + $driver_info = $stmt_driver_info->fetch(PDO::FETCH_ASSOC); + + // ================================================================= + // الخطوة 2.5: فك تشفير الجندر (New Step) + // ================================================================= + if (!empty($driver_info)) { + // التحقق من وجود قيمة في حقل الجندر قبل فك تشفيرها + if (isset($driver_info['gender']) && !empty($driver_info['gender'])) { + $driver_info['gender'] = $encryptionHelper->decryptData($driver_info['gender']); + } + } else { + $driver_info = []; // اجعله مصفوفة فارغة لتجنب خطأ في الدمج + } + + // ================================================================= + // الخطوة 3: دمج النتائج (Application-Side Join) + // ================================================================= + + // دمج بيانات الموقع مع بيانات السائق (التي تم فك تشفيرها الآن) + $final_result = array_merge($location_data, $driver_info); + + // إرجاع النتيجة داخل مصفوفة كما في السكربت الأصلي + jsonSuccess([$final_result]); + + +} catch (PDOException $e) { + jsonError("Database error: " . $e->getMessage()); +} catch (Throwable $e) { + jsonError("Internal error: " . $e->getMessage()); +} +?> +``` + +## File: ride/location/print.php +``` + +

⚠️ Error: Data File Not Found

+

Please ensure '.$source_file.' exists in the same directory.

+ '); +} + +// Get content +$json_data = file_get_contents($source_file); +$data = json_decode($json_data, true); + +if (!$data) { + die('Error decoding JSON data.'); +} + +$drivers = $data['data']; +$last_updated = $data['last_updated'] ?? date('Y-m-d H:i:s'); + +// ============================================================ +// 2. DATA PROCESSING (Logic Layer) +// ============================================================ + +$processed_drivers = []; +$stats = [ + 'total' => 0, + 'elite' => 0, // +50 hours + 'stable' => 0, // +20 hours + 'experimental' => 0, // +5 hours + 'inactive' => 0 +]; + +foreach ($drivers as $driver) { + // Parse Active Time String (e.g., "293 ساعة و 48 دقيقة") + $timeStr = $driver['active_time'] ?? "0 ساعة و 0 دقيقة"; + preg_match('/(\d+)\s*ساعة/', $timeStr, $hoursMatch); + preg_match('/(\d+)\s*دقيقة/', $timeStr, $minsMatch); + + $hours = isset($hoursMatch[1]) ? (int)$hoursMatch[1] : 0; + $mins = isset($minsMatch[1]) ? (int)$minsMatch[1] : 0; + $totalMinutes = ($hours * 60) + $mins; + + // Categorize Driver + $category = 'inactive'; + $catLabel = 'خامل'; + $catClass = 'cat-inactive'; + + if ($totalMinutes >= 3000) { // 50 hours + $category = 'elite'; + $catLabel = 'نخبة'; + $catClass = 'cat-elite'; + $stats['elite']++; + } elseif ($totalMinutes >= 1200) { // 20 hours + $category = 'stable'; + $catLabel = 'مستقر'; + $catClass = 'cat-stable'; + $stats['stable']++; + } elseif ($totalMinutes >= 300) { // 5 hours + $category = 'experimental'; + $catLabel = 'تجريبي'; + $catClass = 'cat-experimental'; + $stats['experimental']++; + } else { + $stats['inactive']++; + } + + $driver['total_minutes'] = $totalMinutes; + $driver['category_label'] = $catLabel; + $driver['category_class'] = $catClass; + $processed_drivers[] = $driver; +} + +$stats['total'] = count($processed_drivers); + +// Sort by Active Time (High to Low) +usort($processed_drivers, function($a, $b) { + return $b['total_minutes'] <=> $a['total_minutes']; +}); + +?> + + + + + + تقرير السائقين - Intaleq + + + + + +
+ + +
+ +
+
+
+

تقرير أداء السائقين

+
تاريخ الطباعة:
+
+
+

Intaleq

+
:آخر تحديث بيانات
+
+
+ +
+
+ إجمالي السائقين + +
+
+ النخبة (+50 ساعة) + +
+
+ مستقرون (+20 ساعة) + +
+
+ يحتاجون متابعة + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + +
#اسم السائقرقم الهاتفساعات النشاطالحالةتاريخ الانضمامملاحظات إدارية
+ + + + + + + + + +
+
+ + + +``` + +## File: ride/location/getTotalDriverDurationToday.php +``` += '$current_date' + AND car_tracks.created_at < DATE_ADD('$current_date', INTERVAL 1 DAY);"; + +$stmt = $con->prepare($sql); +$stmt->execute(); +$car_locations = $stmt->fetchAll(PDO::FETCH_ASSOC); + +if ($car_locations) { + // Print the car location data as JSON + jsonSuccess($car_locations); +} else { + // Print a failure message + jsonError($message = "No car locations found"); +} + +?> + +``` + +## File: ride/location/getCarsLocationByPassengerVan.php +``` += NOW() - INTERVAL :freshSeconds SECOND + ORDER BY updated_at DESC + LIMIT 100; -- نجلب 100 مرشح محتمل + "; + + $stmt_locations = $con_tracking->prepare($sql_locations); + $stmt_locations->bindValue(':boundingBox', $boundingBoxWKT); + $stmt_locations->bindValue(':freshSeconds', $freshSeconds, PDO::PARAM_INT); + $stmt_locations->execute(); + $locations = $stmt_locations->fetchAll(PDO::FETCH_ASSOC); + + if (!$locations) { + jsonError("No car locations found in the specified area."); + exit; + } + + // ================================================================= + // الخطوة 2: تجميع معرفات السائقين (driver_id) + // ================================================================= + $driver_ids = array_column($locations, 'driver_id'); + + // ================================================================= + // الخطوة 3: جلب البيانات الثابتة من القاعدة الأساسية وتطبيق الفلاتر الإضافية + // ================================================================= + $drivers_info = []; + if (!empty($driver_ids)) { + $placeholders = implode(',', array_fill(0, count($driver_ids), '?')); + + // هنا نطبق الشروط الخاصة بهذا السكريبت (سيارات كهربائية فقط) + $sql_drivers_info = " + SELECT + d.id AS driver_id, d.phone, d.email, d.birthdate, d.first_name, d.last_name, + cr.make, cr.model, cr.color, cr.color_hex, cr.year, cr.fuel, + dt.token, + COALESCE(rdAvg.ratingDriver, 0) AS ratingDriver, + COALESCE(rdAvg.ratingCount, 0) AS ratingCount + FROM driver d + LEFT JOIN CarRegistration cr ON cr.driverID = d.id + LEFT JOIN driverToken dt ON dt.captain_id = d.id + LEFT JOIN ( + SELECT driver_id, AVG(rating) AS ratingDriver, COUNT(*) AS ratingCount + FROM ratingDriver + GROUP BY driver_id + ) rdAvg ON rdAvg.driver_id = d.id + WHERE d.id IN ($placeholders) + AND cr.make = 'Van'or cr.model='Van' + + "; + + $stmt_drivers_info = $con->prepare($sql_drivers_info); + $stmt_drivers_info->execute($driver_ids); + $drivers_info_raw = $stmt_drivers_info->fetchAll(PDO::FETCH_ASSOC); + + // تحويل المصفوفة لتسهيل عملية الدمج لاحقاً + foreach ($drivers_info_raw as $driver) { + $drivers_info[$driver['driver_id']] = $driver; + } + } + + // ================================================================= + // الخطوة 4: دمج النتائج في PHP + // ================================================================= + $final_results = []; + foreach ($locations as $location) { + $driver_id = $location['driver_id']; + // ندمج فقط السائقين الذين طابقوا شروطنا في الاستعلام الثاني + if (isset($drivers_info[$driver_id])) { + $final_results[] = array_merge($location, $drivers_info[$driver_id]); + } + } + + // ================================================================= + // الخطوة 5: تطبيق الترتيب والحد النهائي في PHP + // ================================================================= + usort($final_results, function ($a, $b) { + if ($a['ratingDriver'] != $b['ratingDriver']) { + return $b['ratingDriver'] <=> $a['ratingDriver']; + } + if ($a['ratingCount'] != $b['ratingCount']) { + return $b['ratingCount'] <=> $a['ratingCount']; + } + return strtotime($b['updated_at']) <=> strtotime($a['updated_at']); + }); + + // وأخيراً، نأخذ أفضل 10 نتائج فقط + $limited_results = array_slice($final_results, 0, 10); + + if (empty($limited_results)) { + jsonError("No electric cars matching the criteria found."); + exit; + } + + // ================================================================= + // الخطوة 6: فك التشفير وحساب العمر (بدون تغيير) + // ================================================================= + $fieldsToDecrypt = [ 'phone','email','gender','birthdate', 'first_name','last_name', 'token','car_plate','vin' ]; + foreach ($limited_results as &$row) { + foreach ($fieldsToDecrypt as $field) { + if (isset($row[$field]) && !empty($row[$field])) { + try { $row[$field] = $encryptionHelper->decryptData($row[$field]); } + catch (Exception $e) { $row[$field] = null; } + } + } + if (!empty($row['birthdate'])) { + try { + $birthDate = new DateTime($row['birthdate']); + $today = new DateTime(); + $row['age'] = $today->diff($birthDate)->y; + } catch (Exception $e) { $row['age'] = null; } + } else { + $row['age'] = null; + } + } + unset($row); + + jsonSuccess($limited_results); + +} catch (PDOException $e) { + jsonError("Database error: " . $e->getMessage()); +} catch (Throwable $e) { + jsonError("Internal error: " . $e->getMessage()); +} + +``` + +## File: ride/location/getTotalDriverDuration.php +``` += :first_day_of_month + AND car_tracks.created_at < :last_day_of_month +GROUP BY + day +ORDER BY + day ASC;"; + +$stmt = $con->prepare($sql); +$stmt->bindParam(':driver_id', $driver_id, PDO::PARAM_STR); +$stmt->bindParam(':first_day_of_month', $first_day_of_month, PDO::PARAM_STR); +$stmt->bindParam(':last_day_of_month', $last_day_of_month, PDO::PARAM_STR); +$stmt->execute(); + +$car_locations = $stmt->fetchAll(PDO::FETCH_ASSOC); + +if ($car_locations) { + // Print the car location data as JSON + jsonSuccess($data = $car_locations); +} else { + // Print a failure message + jsonError($message = "No car locations found"); +} + +?> +``` + +## File: ride/location/getComfort.php +``` += NOW() - INTERVAL :freshSeconds SECOND + ORDER BY updated_at DESC + LIMIT 100; -- نجلب 100 مرشح محتمل + "; + + $stmt_locations = $con_tracking->prepare($sql_locations); + $stmt_locations->bindValue(':boundingBox', $boundingBoxWKT); + $stmt_locations->bindValue(':freshSeconds', $freshSeconds, PDO::PARAM_INT); + $stmt_locations->execute(); + $locations = $stmt_locations->fetchAll(PDO::FETCH_ASSOC); + + if (!$locations) { + jsonError("No car locations found in the specified area."); + exit; + } + + // ================================================================= + // الخطوة 2: تجميع معرفات السائقين (driver_id) + // ================================================================= + $driver_ids = array_column($locations, 'driver_id'); + + // ================================================================= + // الخطوة 3: جلب البيانات الثابتة من القاعدة الأساسية وتطبيق الفلاتر الإضافية + // ================================================================= + $drivers_info = []; + if (!empty($driver_ids)) { + $placeholders = implode(',', array_fill(0, count($driver_ids), '?')); + + // هنا نطبق الشروط الخاصة بهذا السكريبت (موديل السيارة > 2017) + $sql_drivers_info = " + SELECT + d.id AS driver_id, d.phone, d.email, d.birthdate, d.first_name, d.last_name, + cr.make, cr.model, cr.color, cr.color_hex, cr.year, + dt.token, + COALESCE(rdAvg.ratingDriver, 0) AS ratingDriver, + COALESCE(rdAvg.ratingCount, 0) AS ratingCount + FROM driver d + -- 1. تغيير LEFT JOIN إلى INNER JOIN لضمان عدم جلب سائق إلا إذا كانت بيانات سيارته مطابقة تماماً + INNER JOIN CarRegistration cr ON cr.driverID = d.id + LEFT JOIN driverToken dt ON dt.captain_id = d.id + LEFT JOIN ( + SELECT driver_id, AVG(rating) AS ratingDriver, COUNT(*) AS ratingCount + FROM ratingDriver + GROUP BY driver_id + ) rdAvg ON rdAvg.driver_id = d.id + WHERE d.id IN ($placeholders) + -- 2. الفلترة الصارمة للسنة + AND cr.year IS NOT NULL + AND TRIM(cr.year) != '' + AND CAST(TRIM(cr.year) AS UNSIGNED) > 2017 + + + AND (cr.make NOT LIKE '%دراج%' AND cr.model NOT LIKE '%دراج%') + AND (cr.model NOT LIKE '%Van%' AND cr.make NOT LIKE '%Van%') + "; + $stmt_drivers_info = $con->prepare($sql_drivers_info); + $stmt_drivers_info->execute($driver_ids); + $drivers_info_raw = $stmt_drivers_info->fetchAll(PDO::FETCH_ASSOC); + + // تحويل المصفوفة لتسهيل عملية الدمج لاحقاً + foreach ($drivers_info_raw as $driver) { + $drivers_info[$driver['driver_id']] = $driver; + } + } + + // ================================================================= + // الخطوة 4: دمج النتائج في PHP + // ================================================================= + $final_results = []; + foreach ($locations as $location) { + $driver_id = $location['driver_id']; + // ندمج فقط السائقين الذين طابقوا شروطنا في الاستعلام الثاني + if (isset($drivers_info[$driver_id])) { + $final_results[] = array_merge($location, $drivers_info[$driver_id]); + } + } + + // ================================================================= + // الخطوة 5: تطبيق الترتيب والحد النهائي في PHP + // ================================================================= + // الآن بعد أن دمجنا كل البيانات، يمكننا تطبيق الترتيب المعقد + usort($final_results, function ($a, $b) { + // الترتيب الأول: حسب التقييم (تنازلي) + if ($a['ratingDriver'] != $b['ratingDriver']) { + return $b['ratingDriver'] <=> $a['ratingDriver']; + } + // الترتيب الثاني: حسب عدد التقييمات (تنازلي) + if ($a['ratingCount'] != $b['ratingCount']) { + return $b['ratingCount'] <=> $a['ratingCount']; + } + // الترتيب الثالث: حسب حداثة الموقع (تنازلي) + return strtotime($b['updated_at']) <=> strtotime($a['updated_at']); + }); + + // وأخيراً، نأخذ أفضل 5 نتائج فقط + $limited_results = array_slice($final_results, 0, 5); + + if (empty($limited_results)) { + jsonError("No cars matching the specific criteria (year > 2017) found."); + exit; + } + + // ================================================================= + // الخطوة 6: فك التشفير وحساب العمر (بدون تغيير) + // ================================================================= + $fieldsToDecrypt = [ 'phone','email','gender','birthdate', 'first_name','last_name', 'token','car_plate','vin' ]; + foreach ($limited_results as &$row) { + foreach ($fieldsToDecrypt as $field) { + if (isset($row[$field]) && !empty($row[$field])) { + try { $row[$field] = $encryptionHelper->decryptData($row[$field]); } + catch (Exception $e) { $row[$field] = null; } + } + } + if (!empty($row['birthdate'])) { + try { + $birthDate = new DateTime($row['birthdate']); + $today = new DateTime(); + $row['age'] = $today->diff($birthDate)->y; + } catch (Exception $e) { $row['age'] = null; } + } else { + $row['age'] = null; + } + } + unset($row); + + jsonSuccess($limited_results); + +} catch (PDOException $e) { + jsonError("Database error: " . $e->getMessage()); +} catch (Throwable $e) { + jsonError("Internal error: " . $e->getMessage()); +} + +``` + +## File: ride/location/delete.php +``` +prepare($sql); +$stmt->execute(); + +if ($stmt->rowCount() > 0) { + // Print a success message + jsonSuccess($message = "Car location deleted successfully"); +} else { + // Print a failure message + jsonError($message = "Failed to delete car location"); +} + +?> +``` + +## File: ride/location/getBalash.php +``` += NOW() - INTERVAL :freshSeconds SECOND + ORDER BY updated_at DESC + LIMIT 20; -- نجلب 100 مرشح محتمل للفلترة والترتيب لاحقاً + "; + + $stmt_locations = $con_tracking->prepare($sql_locations); + $stmt_locations->bindValue(':boundingBox', $boundingBoxWKT); + $stmt_locations->bindValue(':freshSeconds', $freshSeconds, PDO::PARAM_INT); + $stmt_locations->execute(); + $locations = $stmt_locations->fetchAll(PDO::FETCH_ASSOC); + + if (!$locations) { + jsonError("No car locations found in the specified area."); + exit; + } + + // ================================================================= + // الخطوة 2: تجميع معرفات السائقين (driver_id) + // ================================================================= + $driver_ids = array_column($locations, 'driver_id'); + + // ================================================================= + // الخطوة 3: جلب البيانات الثابتة من القاعدة الأساسية وتطبيق الفلاتر الإضافية + // ================================================================= + $drivers_info = []; + if (!empty($driver_ids)) { + $placeholders = implode(',', array_fill(0, count($driver_ids), '?')); + + // هنا نطبق الشروط الخاصة بهذا السكريبت (موديل السيارة < 2000) + $sql_drivers_info = " + SELECT + d.id AS driver_id, d.phone, d.email, d.birthdate, d.first_name, d.last_name, + cr.make, cr.model, cr.color, cr.color_hex, cr.year, + dt.token, + COALESCE(rdAvg.ratingDriver, 0) AS ratingDriver, + COALESCE(rdAvg.ratingCount, 0) AS ratingCount + FROM driver d + LEFT JOIN CarRegistration cr ON cr.driverID = d.id + LEFT JOIN driverToken dt ON dt.captain_id = d.id + LEFT JOIN ( + SELECT driver_id, AVG(rating) AS ratingDriver, COUNT(id) AS ratingCount + FROM ratingDriver + GROUP BY driver_id + ) rdAvg ON rdAvg.driver_id = d.id + WHERE d.id IN ($placeholders) + AND COALESCE(cr.year, 0) < 2000 -- ⭐ الشرط الخاص بهذا السكريبت + AND (cr.make NOT LIKE '%دراج%' AND cr.model NOT LIKE '%دراج%') + AND (cr.model NOT LIKE '%Van%' AND cr.make NOT LIKE '%Van%') + "; + + $stmt_drivers_info = $con->prepare($sql_drivers_info); + $stmt_drivers_info->execute($driver_ids); + $drivers_info_raw = $stmt_drivers_info->fetchAll(PDO::FETCH_ASSOC); + + // تحويل المصفوفة لتسهيل عملية الدمج لاحقاً + foreach ($drivers_info_raw as $driver) { + $drivers_info[$driver['driver_id']] = $driver; + } + } + + // ================================================================= + // الخطوة 4: دمج النتائج في PHP + // ================================================================= + $final_results = []; + foreach ($locations as $location) { + $driver_id = $location['driver_id']; + // ندمج فقط السائقين الذين طابقوا شروطنا في الاستعلام الثاني + if (isset($drivers_info[$driver_id])) { + $final_results[] = array_merge($location, $drivers_info[$driver_id]); + } + } + + // ================================================================= + // الخطوة 5: تطبيق الترتيب والحد النهائي في PHP + // ================================================================= + // الآن بعد أن دمجنا كل البيانات، يمكننا تطبيق الترتيب المعقد + usort($final_results, function ($a, $b) { + // الترتيب الأول: حسب التقييم (تنازلي) + if ($a['ratingDriver'] != $b['ratingDriver']) { + return $b['ratingDriver'] <=> $a['ratingDriver']; + } + // الترتيب الثاني: حسب عدد التقييمات (تنازلي) + if ($a['ratingCount'] != $b['ratingCount']) { + return $b['ratingCount'] <=> $a['ratingCount']; + } + // الترتيب الثالث: حسب حداثة الموقع (تنازلي) + return strtotime($b['updated_at']) <=> strtotime($a['updated_at']); + }); + + // وأخيراً، نأخذ أفضل 5 نتائج فقط + $limited_results = array_slice($final_results, 0, 5); + + if (empty($limited_results)) { + jsonError("No cars matching the specific criteria (year < 2000) found."); + exit; + } + + // ================================================================= + // الخطوة 6: فك التشفير وحساب العمر (بدون تغيير) + // ================================================================= + $fieldsToDecrypt = [ 'phone','email','gender','birthdate', 'first_name','last_name', 'token','car_plate','vin' ]; + foreach ($limited_results as &$row) { + foreach ($fieldsToDecrypt as $field) { + if (isset($row[$field]) && !empty($row[$field])) { + try { $row[$field] = $encryptionHelper->decryptData($row[$field]); } + catch (Exception $e) { $row[$field] = null; } + } + } + if (!empty($row['birthdate'])) { + try { + $birthDate = new DateTime($row['birthdate']); + $today = new DateTime(); + $row['age'] = $today->diff($birthDate)->y; + } catch (Exception $e) { $row['age'] = null; } + } else { + $row['age'] = null; + } + } + unset($row); + + jsonSuccess($limited_results); + +} catch (PDOException $e) { + jsonError("Database error: " . $e->getMessage()); +} catch (Throwable $e) { + jsonError("Internal error: " . $e->getMessage()); +} + +``` + +## File: ride/location/getLatestLocationPassenger.php +``` +prepare($sql); +$stmt->execute([':rideId' => $rideId]); +$car_locations = $stmt->fetchAll(PDO::FETCH_ASSOC); + +if ($car_locations) { + // Print the car location data as JSON + jsonSuccess($data = $car_locations); +} else { + // Print a failure message + jsonError($message = "No car locations found"); +} + +?> +``` + +## File: ride/location/getRidesDriverByDay.php +``` += :first_day_total AND `ride`.created_at < :last_day_total AND `ride`.`status` = 'Finished' + ) AS totalPrice, + ( + SELECT + COUNT(`ride`.`id`) + FROM + `ride` + WHERE + `ride`.`driver_id` = :driver_id_count AND `ride`.`created_at` >= :first_day_count AND `ride`.created_at < :last_day_count AND `ride`.`status` = 'Finished' + ) AS totalCount +FROM + `ride` +WHERE + `ride`.`driver_id` = :driver_id_main AND `ride`.`created_at` >= :first_day_main AND `ride`.created_at < :last_day_main AND `ride`.`status` = 'Finished' +GROUP BY + day +ORDER BY + day ASC;"; + +$stmt = $con->prepare($sql); + +// Bind each parameter uniquely +$stmt->bindParam(':driver_id_total', $driver_id, PDO::PARAM_STR); +$stmt->bindParam(':first_day_total', $first_day_of_month, PDO::PARAM_STR); +$stmt->bindParam(':last_day_total', $last_day_of_month, PDO::PARAM_STR); + +$stmt->bindParam(':driver_id_count', $driver_id, PDO::PARAM_STR); +$stmt->bindParam(':first_day_count', $first_day_of_month, PDO::PARAM_STR); +$stmt->bindParam(':last_day_count', $last_day_of_month, PDO::PARAM_STR); + +$stmt->bindParam(':driver_id_main', $driver_id, PDO::PARAM_STR); +$stmt->bindParam(':first_day_main', $first_day_of_month, PDO::PARAM_STR); +$stmt->bindParam(':last_day_main', $last_day_of_month, PDO::PARAM_STR); + +$stmt->execute(); + +$car_locations = $stmt->fetchAll(PDO::FETCH_ASSOC); +if ($car_locations) { + // Print the car location data as JSON + jsonSuccess($data = $car_locations); +} else { + // Print a failure message + jsonError($message = "No car locations found"); +} +?> +``` + +## File: ride/location/getFemalDriver.php +``` += NOW() - INTERVAL :freshSeconds SECOND + ORDER BY updated_at DESC + LIMIT 100; -- نجلب 100 مرشح محتمل + "; + + $stmt_locations = $con_tracking->prepare($sql_locations); + $stmt_locations->bindValue(':boundingBox', $boundingBoxWKT); + $stmt_locations->bindValue(':freshSeconds', $freshSeconds, PDO::PARAM_INT); + $stmt_locations->execute(); + $locations = $stmt_locations->fetchAll(PDO::FETCH_ASSOC); + + if (!$locations) { + jsonError("No car locations found in the specified area."); + exit; + } + + // ================================================================= + // الخطوة 2: تجميع معرفات السائقين (driver_id) + // ================================================================= + $driver_ids = array_column($locations, 'driver_id'); + + // ================================================================= + // الخطوة 3: جلب البيانات الثابتة من القاعدة الأساسية وتطبيق الفلاتر الإضافية + // ================================================================= + $drivers_info = []; + if (!empty($driver_ids)) { + $placeholders = implode(',', array_fill(0, count($driver_ids), '?')); + + // هنا نطبق الشروط الخاصة بهذا السكريبت (سائقات إناث فقط) + $sql_drivers_info = " + SELECT + d.id AS driver_id, d.phone, d.email, d.birthdate, d.first_name, d.last_name, d.gender, d.maritalStatus, + cr.make, cr.model, cr.color, cr.color_hex, cr.year, + dt.token, + COALESCE(AVG(rd.rating), 0) AS ratingDriver, + COUNT(rd.id) AS ratingCount + FROM driver d + LEFT JOIN CarRegistration cr ON cr.driverID = d.id + LEFT JOIN driverToken dt ON dt.captain_id = d.id + LEFT JOIN ratingDriver rd ON rd.driver_id = d.id + WHERE d.id IN ($placeholders) + AND d.gender = 'Female' -- ⭐ الشرط الخاص بهذا السكريبت + AND (cr.make NOT LIKE '%دراجة%' AND cr.model NOT LIKE '%دراجة%') + AND (cr.model NOT LIKE '%Van%' AND cr.make NOT LIKE '%Van%') + GROUP BY d.id -- تجميع النتائج حسب السائق لحساب التقييم بشكل صحيح + "; + + $stmt_drivers_info = $con->prepare($sql_drivers_info); + $stmt_drivers_info->execute($driver_ids); + $drivers_info_raw = $stmt_drivers_info->fetchAll(PDO::FETCH_ASSOC); + + // تحويل المصفوفة لتسهيل عملية الدمج لاحقاً + foreach ($drivers_info_raw as $driver) { + $drivers_info[$driver['driver_id']] = $driver; + } + } + + // ================================================================= + // الخطوة 4: دمج النتائج في PHP + // ================================================================= + $final_results = []; + foreach ($locations as $location) { + $driver_id = $location['driver_id']; + // ندمج فقط السائقين الذين طابقوا شروطنا في الاستعلام الثاني (أنثى) + if (isset($drivers_info[$driver_id])) { + $final_results[] = array_merge($location, $drivers_info[$driver_id]); + } + } + + // ================================================================= + // الخطوة 5: تطبيق الترتيب والحد النهائي في PHP + // ================================================================= + usort($final_results, function ($a, $b) { + if ($a['ratingDriver'] != $b['ratingDriver']) { + return $b['ratingDriver'] <=> $a['ratingDriver']; + } + if ($a['ratingCount'] != $b['ratingCount']) { + return $b['ratingCount'] <=> $a['ratingCount']; + } + return strtotime($b['updated_at']) <=> strtotime($a['updated_at']); + }); + + // وأخيراً، نأخذ أفضل 10 نتائج فقط + $limited_results = array_slice($final_results, 0, 10); + + if (empty($limited_results)) { + jsonError("No female drivers matching the criteria found."); + exit; + } + + // ================================================================= + // الخطوة 6: فك التشفير وحساب العمر (بدون تغيير) + // ================================================================= + $fieldsToDecrypt = [ 'phone','email','gender','birthdate', 'first_name','last_name', 'token','car_plate','vin' ]; + foreach ($limited_results as &$row) { + foreach ($fieldsToDecrypt as $field) { + if (isset($row[$field]) && !empty($row[$field])) { + try { $row[$field] = $encryptionHelper->decryptData($row[ + $field]); } + catch (Exception $e) { $row[$field] = null; } + } + } + if (!empty($row['birthdate'])) { + try { + $birthDate = new DateTime($row['birthdate']); + $today = new DateTime(); + $row['age'] = $today->diff($birthDate)->y; + } catch (Exception $e) { $row['age'] = null; } + } else { + $row['age'] = null; + } + } + unset($row); + + jsonSuccess($limited_results); + +} catch (PDOException $e) { + jsonError("Database error: " . $e->getMessage()); +} catch (Throwable $e) { + jsonError("Internal error: " . $e->getMessage()); +} + +``` + +## File: ride/location/getDelivery.php +``` += NOW() - INTERVAL :freshSeconds SECOND + ORDER BY updated_at DESC + LIMIT 100; -- نجلب 100 مرشح محتمل + "; + + $stmt_locations = $con_tracking->prepare($sql_locations); + $stmt_locations->bindValue(':boundingBox', $boundingBoxWKT); + $stmt_locations->bindValue(':freshSeconds', $freshSeconds, PDO::PARAM_INT); + $stmt_locations->execute(); + $locations = $stmt_locations->fetchAll(PDO::FETCH_ASSOC); + + if (!$locations) { + jsonError("No car locations found in the specified area."); + exit; + } + + // ================================================================= + // الخطوة 2: تجميع معرفات السائقين (driver_id) + // ================================================================= + $driver_ids = array_column($locations, 'driver_id'); + + // ================================================================= + // الخطوة 3: جلب البيانات الثابتة من القاعدة الأساسية وتطبيق الفلاتر الإضافية + // ================================================================= + $drivers_info = []; + if (!empty($driver_ids)) { + $placeholders = implode(',', array_fill(0, count($driver_ids), '?')); + + // هنا نطبق الشروط الخاصة بهذا السكريبت (دراجات فقط) + $sql_drivers_info = " + SELECT + d.id AS driver_id, d.phone, d.email, d.birthdate, d.first_name, d.last_name, + cr.make, cr.model, cr.color, cr.color_hex, cr.year, + dt.token, + COALESCE(rdAvg.ratingDriver, 0) AS ratingDriver, + COALESCE(rdAvg.ratingCount, 0) AS ratingCount + FROM driver d + LEFT JOIN CarRegistration cr ON cr.driverID = d.id + LEFT JOIN driverToken dt ON dt.captain_id = d.id + LEFT JOIN ( + SELECT driver_id, AVG(rating) AS ratingDriver, COUNT(*) AS ratingCount + FROM ratingDriver + GROUP BY driver_id + ) rdAvg ON rdAvg.driver_id = d.id + WHERE d.id IN ($placeholders) + AND (cr.make LIKE '%دراج%' OR cr.model LIKE '%دراج%') -- ⭐ الشرط الخاص بهذا السكريبت + "; + + $stmt_drivers_info = $con->prepare($sql_drivers_info); + $stmt_drivers_info->execute($driver_ids); + $drivers_info_raw = $stmt_drivers_info->fetchAll(PDO::FETCH_ASSOC); + + // تحويل المصفوفة لتسهيل عملية الدمج لاحقاً + foreach ($drivers_info_raw as $driver) { + $drivers_info[$driver['driver_id']] = $driver; + } + } + + // ================================================================= + // الخطوة 4: دمج النتائج في PHP + // ================================================================= + $final_results = []; + foreach ($locations as $location) { + $driver_id = $location['driver_id']; + // ندمج فقط السائقين الذين طابقوا شروطنا في الاستعلام الثاني + if (isset($drivers_info[$driver_id])) { + $final_results[] = array_merge($location, $drivers_info[$driver_id]); + } + } + + // ================================================================= + // الخطوة 5: تطبيق الترتيب والحد النهائي في PHP + // ================================================================= + usort($final_results, function ($a, $b) { + if ($a['ratingDriver'] != $b['ratingDriver']) { + return $b['ratingDriver'] <=> $a['ratingDriver']; + } + if ($a['ratingCount'] != $b['ratingCount']) { + return $b['ratingCount'] <=> $a['ratingCount']; + } + return strtotime($b['updated_at']) <=> strtotime($a['updated_at']); + }); + + // وأخيراً، نأخذ أفضل 10 نتائج فقط + $limited_results = array_slice($final_results, 0, 10); + + if (empty($limited_results)) { + jsonError("No motorcycles matching the criteria found."); + exit; + } + + // ================================================================= + // الخطوة 6: فك التشفير وحساب العمر (بدون تغيير) + // ================================================================= + $fieldsToDecrypt = [ 'phone','email','gender','birthdate', 'first_name','last_name','maritalStatus', 'token','make','car_plate','vin' ]; + foreach ($limited_results as &$row) { + foreach ($fieldsToDecrypt as $field) { + if (isset($row[$field]) && !empty($row[$field])) { + try { $row[$field] = $encryptionHelper->decryptData($row[$field]); } + catch (Exception $e) { $row[$field] = null; } + } + } + if (!empty($row['birthdate'])) { + try { + $birthDate = new DateTime($row['birthdate']); + $today = new DateTime(); + $row['age'] = $today->diff($birthDate)->y; + } catch (Exception $e) { $row['age'] = null; } + } else { + $row['age'] = null; + } + } + unset($row); + + jsonSuccess($limited_results); + +} catch (PDOException $e) { + jsonError("Database error: " . $e->getMessage()); +} catch (Throwable $e) { + jsonError("Internal error: " . $e->getMessage()); +} + +``` + +## File: ride/location/getElectric.php +``` += NOW() - INTERVAL :freshSeconds SECOND + ORDER BY updated_at DESC + LIMIT 100; -- نجلب 100 مرشح محتمل + "; + + $stmt_locations = $con_tracking->prepare($sql_locations); + $stmt_locations->bindValue(':boundingBox', $boundingBoxWKT); + $stmt_locations->bindValue(':freshSeconds', $freshSeconds, PDO::PARAM_INT); + $stmt_locations->execute(); + $locations = $stmt_locations->fetchAll(PDO::FETCH_ASSOC); + + if (!$locations) { + jsonError("No car locations found in the specified area."); + exit; + } + + // ================================================================= + // الخطوة 2: تجميع معرفات السائقين (driver_id) + // ================================================================= + $driver_ids = array_column($locations, 'driver_id'); + + // ================================================================= + // الخطوة 3: جلب البيانات الثابتة من القاعدة الأساسية وتطبيق الفلاتر الإضافية + // ================================================================= + $drivers_info = []; + if (!empty($driver_ids)) { + $placeholders = implode(',', array_fill(0, count($driver_ids), '?')); + + // هنا نطبق الشروط الخاصة بهذا السكريبت (سيارات كهربائية فقط) + $sql_drivers_info = " + SELECT + d.id AS driver_id, d.phone, d.email, d.birthdate, d.first_name, d.last_name, + cr.make, cr.model, cr.color, cr.color_hex, cr.year, cr.fuel, + dt.token, + COALESCE(rdAvg.ratingDriver, 0) AS ratingDriver, + COALESCE(rdAvg.ratingCount, 0) AS ratingCount + FROM driver d + LEFT JOIN CarRegistration cr ON cr.driverID = d.id + LEFT JOIN driverToken dt ON dt.captain_id = d.id + LEFT JOIN ( + SELECT driver_id, AVG(rating) AS ratingDriver, COUNT(*) AS ratingCount + FROM ratingDriver + GROUP BY driver_id + ) rdAvg ON rdAvg.driver_id = d.id + WHERE d.id IN ($placeholders) + AND cr.fuel = 'كهربائي' + AND (cr.make NOT LIKE '%دراج%' AND cr.model NOT LIKE '%دراج%') + AND (cr.model NOT LIKE '%Van%' AND cr.make NOT LIKE '%Van%') + "; + + $stmt_drivers_info = $con->prepare($sql_drivers_info); + $stmt_drivers_info->execute($driver_ids); + $drivers_info_raw = $stmt_drivers_info->fetchAll(PDO::FETCH_ASSOC); + + // تحويل المصفوفة لتسهيل عملية الدمج لاحقاً + foreach ($drivers_info_raw as $driver) { + $drivers_info[$driver['driver_id']] = $driver; + } + } + + // ================================================================= + // الخطوة 4: دمج النتائج في PHP + // ================================================================= + $final_results = []; + foreach ($locations as $location) { + $driver_id = $location['driver_id']; + // ندمج فقط السائقين الذين طابقوا شروطنا في الاستعلام الثاني + if (isset($drivers_info[$driver_id])) { + $final_results[] = array_merge($location, $drivers_info[$driver_id]); + } + } + + // ================================================================= + // الخطوة 5: تطبيق الترتيب والحد النهائي في PHP + // ================================================================= + usort($final_results, function ($a, $b) { + if ($a['ratingDriver'] != $b['ratingDriver']) { + return $b['ratingDriver'] <=> $a['ratingDriver']; + } + if ($a['ratingCount'] != $b['ratingCount']) { + return $b['ratingCount'] <=> $a['ratingCount']; + } + return strtotime($b['updated_at']) <=> strtotime($a['updated_at']); + }); + + // وأخيراً، نأخذ أفضل 10 نتائج فقط + $limited_results = array_slice($final_results, 0, 10); + + if (empty($limited_results)) { + jsonError("No electric cars matching the criteria found."); + exit; + } + + // ================================================================= + // الخطوة 6: فك التشفير وحساب العمر (بدون تغيير) + // ================================================================= + $fieldsToDecrypt = [ 'phone','email','gender','birthdate', 'first_name','last_name', 'token','car_plate','vin' ]; + foreach ($limited_results as &$row) { + foreach ($fieldsToDecrypt as $field) { + if (isset($row[$field]) && !empty($row[$field])) { + try { $row[$field] = $encryptionHelper->decryptData($row[$field]); } + catch (Exception $e) { $row[$field] = null; } + } + } + if (!empty($row['birthdate'])) { + try { + $birthDate = new DateTime($row['birthdate']); + $today = new DateTime(); + $row['age'] = $today->diff($birthDate)->y; + } catch (Exception $e) { $row['age'] = null; } + } else { + $row['age'] = null; + } + } + unset($row); + + jsonSuccess($limited_results); + +} catch (PDOException $e) { + jsonError("Database error: " . $e->getMessage()); +} catch (Throwable $e) { + jsonError("Internal error: " . $e->getMessage()); +} + +``` + +## File: ride/location/addpassengerLocation.php +``` +prepare($sql); + +// Bind the parameters to the SQL query +$stmt->bindParam(':passengerId', $passengerId); +$stmt->bindParam(':lat', $lat); +$stmt->bindParam(':lng', $lng); +$stmt->bindParam(':rideId', $rideId); + +// Execute the statement +if ($stmt->execute()) { + // Print a success message + jsonSuccess(null, "Passenger location saved successfully"); +} else { + // Print a failure message + jsonError("Failed to save passenger location"); +} +?> + +``` + +## File: ride/payment/add.php +``` +prepare("SELECT * FROM payment_tokens WHERE token = :token AND isUsed = FALSE"); +$stmt->execute(array( + ':token' => $token +)); + +$tokenData = $stmt->fetch(); + +if ($tokenData) { + +$sql = "INSERT INTO `payments` (`id`,`amount`, `payment_method`, `passengerID`, `rideId`, `driverID`) + VALUES ( SHA2(UUID(), 256),'$amount', '$payment_method', '$passengerID', '$rideId', '$driverID')"; +$stmt = $con->prepare($sql); +$stmt->execute(); + +if ($stmt->rowCount() > 0) { + // Print a success message + jsonSuccess(null, "Payment record created successfully"); + // Mark the token as used in the database + $stmt = $con->prepare("UPDATE payment_tokens SET isUsed = TRUE WHERE id = :tokenID"); + $stmt->execute(array( + ':tokenID' => $tokenData['id'] + )); + } else { + // Print a failure message + jsonError("Failed to save record"); + } +} else { + jsonError("Invalid or already used token"); +} +``` + +## File: ride/payment/update.php +``` +prepare($sql); +$stmt->execute(); + +if ($stmt->rowCount() > 0) { + // Print a success message + jsonSuccess($message = "Payment data updated successfully"); +} else { + // Print a failure message + jsonError($message = "Failed to update payment data"); +} +?> +``` + +## File: ride/payment/get.php +``` +prepare($sql); +$stmt->execute(); + +if ($stmt->rowCount() > 0) { + // Fetch the record + $row = $stmt->fetchAll(PDO::FETCH_ASSOC); + $count = $stmt->rowCount(); + + // $response = array( + + // "message" => "Payment data saved successfully", + // "id" => "0", + // "count" => $count, + // "data" => $rows + // ); + + // echo json_encode($response); + jsonSuccess($row); + +} + else{ + // Print a failure message + jsonError($message = "No wallet record found"); +} +?> +``` + +## File: ride/payment/getAllPayment.php +``` + CURRENT_DATE() - INTERVAL 1 WEEK + ) AS total_amount_last_week +FROM + dual +LIMIT 1; + + + "; +$stmt = $con->prepare($sql); +$stmt->execute(); + +if ($stmt->rowCount() > 0) { + // Fetch the record + $row = $stmt->fetchAll(PDO::FETCH_ASSOC); + + jsonSuccess($row); + +} + else{ + // Print a failure message + jsonError($message = "No wallet record found"); +} +?> +``` + +## File: ride/payment/getAllPaymentVisa.php +``` +prepare($sql); +$stmt->execute(); + +if ($stmt->rowCount() > 0) { + // Fetch the record + $row = $stmt->fetchAll(PDO::FETCH_ASSOC); + + jsonSuccess($row); + +} + else{ + // Print a failure message + jsonError($message = "No wallet record found"); +} +?> +``` + +## File: ride/payment/getCountRide.php +``` += CURDATE(); +"; +$stmt = $con->prepare($sql); +$stmt->execute(); + +if ($stmt->rowCount() > 0) { + // Fetch the record + $row = $stmt->fetchAll(PDO::FETCH_ASSOC); + + + jsonSuccess($row); + +} + else{ + // Print a failure message + jsonError($message = "No wallet record found"); +} +?> +``` + +## File: ride/payment/updatePaymetToPaid.php +``` +prepare($sql); +$stmt->execute(); + +if ($stmt->rowCount() > 0) { + // Print a success message + jsonSuccess($message = "Payment data updated successfully"); +} else { + // Print a failure message + jsonError($message = "Failed to update payment data"); +} +?> +``` + +## File: ride/payment/delete.php +``` + +``` + +## File: ride/places/add.php +``` +prepare($sql); +$stmt->execute(); + +if ($stmt->rowCount() > 0) { + // Print a success message + jsonSuccess($message = 'Place inserted successfully'); +} else { + // Print a failure message for duplicate + jsonSuccess($message = 'Duplicate place, no new entry added'); +} +?> +``` + +## File: ride/cancelRide/add.php +``` +prepare($sql); +$stmt->bindParam(':driverID', $driverID); +$stmt->bindParam(':passengerID', $passengerID); +$stmt->bindParam(':rideID', $rideID); +$stmt->bindParam(':note', $note); +$stmt->execute(); + +if ($stmt->rowCount() > 0) { + jsonSuccess(null, "Record inserted successfully"); +} else { + jsonError("Failed to insert record"); +} +?> +``` + +## File: ride/cancelRide/update.php +``` +prepare($sql); +$stmt->execute($params); + +// التحقق من النتيجة +if ($stmt->rowCount() > 0) { + jsonSuccess(null, "Data updated successfully"); +} else { + jsonError("Failed to update data or no changes made"); +} +?> +``` + +## File: ride/cancelRide/get.php +``` +prepare($sql); +$stmt->execute(); + +$result = $stmt->fetchAll(PDO::FETCH_ASSOC); + +if ($stmt->rowCount() > 0) { + jsonSuccess($result); +} else { + jsonError("No records found"); +} +?> +``` + +## File: ride/cancelRide/addCancelTripFromDriverAfterApplied.php +``` + $rideId]; + +try { + // ================================================================================= + // المرحلة الأولى: إلغاء الرحلة (نفس منطق السكريبت الأول) + // ================================================================================= + + // 1. التحديث على سيرفر التتبع (Remote DB) + error_log("🔄 [Step 1] Attempting to cancel on REMOTE Tracking DB..."); + $stmtRemote = $con_ride->prepare($sqlCancel); + $stmtRemote->execute($params); + $count = $stmtRemote->rowCount(); + + // إذا نجح التحديث في السيرفر البعيد (أو لم ينجح نتحقق من المحلي أيضا لضمان التزامن) + // لكن المنطق الأساسي يعتمد على أن الرحلة قابلة للتعديل + if ($count > 0) { + + // 2. التحديث على السيرفر المحلي (Local DB) + error_log("🔄 [Step 1] Remote success. Cancelling on LOCAL Main DB..."); + $stmtLocal = $con->prepare($sqlCancel); + $stmtLocal->execute($params); + + error_log("✅ [Step 1] Ride cancelled successfully on database."); + + // ================================================================================= + // المرحلة الثانية: تسجيل الطلب وتنظيف البيانات (نفس منطق السكريبت الثاني) + // لن يتم الدخول هنا إلا إذا نجح الإلغاء فعلياً + // ================================================================================= + + error_log("🔄 [Step 2] Inserting into driver_orders and cleaning background tasks..."); + + // أ. إضافة سجل في driver_orders + $orderStatus = 'pending'; // كما في السكريبت الثاني + $sqlInsertOrder = "INSERT INTO driver_orders (driver_id, order_id, notes, status) + VALUES (?, ?, ?, ?)"; + $stmtInsert = $con->prepare($sqlInsertOrder); + $stmtInsert->execute([$driverID, $rideId, $note, $orderStatus]); + + // ب. حذف آخر سجل من write_argument_after_applied_from_background + // نستخدم نفس الاستعلام الفرعي الذي كنت تستخدمه + $sqlDelete = "DELETE FROM write_argument_after_applied_from_background + WHERE id = ( + SELECT id FROM ( + SELECT id + FROM write_argument_after_applied_from_background + WHERE driver_id = ? + ORDER BY time_of_order DESC + LIMIT 1 + ) AS t + )"; + $stmtDelete = $con->prepare($sqlDelete); + $stmtDelete->execute([$driverID]); + + error_log("✅ [Step 2] Driver order logged and background task cleaned."); + + // ================================================================================= + // النهاية: إرجاع رسالة النجاح + // ================================================================================= + jsonSuccess(null, "Ride cancelled and driver log updated successfully"); + + } else { + // فشل الإلغاء (الرحلة غير موجودة أو حالتها لا تسمح) + error_log("⚠️ [cancelRideAndLog.php] Failed to cancel. Status might be started/completed or ID invalid."); + jsonError("Cannot cancel ride. Status might be started or already completed."); + } + +} catch (PDOException $e) { + error_log("❌ [cancelRideAndLog.php] Database Error: " . $e->getMessage()); + jsonError("Database Error: " . $e->getMessage()); +*/ + +require_once __DIR__ . '/../../connect.php'; + +$rideId = filterRequest("id"); +$driverID = filterRequest("driver_id"); +$note = filterRequest("notes"); +$status = "cancelRideFromDriver"; + +if (!$rideId || !$driverID) { + jsonError("Missing Data"); + exit; +} + +try { + // 1. محاولة الإلغاء في السيرفر البعيد + $stmtRemote = $con_ride->prepare("UPDATE `ride` SET `status` = ?, `updated_at` = NOW() WHERE `id` = ? AND `status` IN ('wait', 'waiting', 'Apply', 'accepted')"); + $stmtRemote->execute([$status, $rideId]); + + if ($stmtRemote->rowCount() > 0) { + // 2. التحديث المحلي + $con->prepare("UPDATE `ride` SET `status` = ?, `updated_at` = NOW() WHERE `id` = ?")->execute([$status, $rideId]); + + // 3. تسجيل اللوج (كما في ملفك) + $con->prepare("INSERT INTO driver_orders (driver_id, order_id, notes, status) VALUES (?, ?, ?, 'pending')")->execute([$driverID, $rideId, $note]); + + // تنظيف الخلفية (اختياري حسب الحاجة) + // ... كود التنظيف ... + + // 4. 🔥 إشعار الراكب بالإلغاء 🔥 + $stmtPas = $con->prepare("SELECT passenger_id FROM ride WHERE id = ?"); + $stmtPas->execute([$rideId]); + $passenger_id = $stmtPas->fetchColumn(); + + if ($passenger_id) { + notifyPassengerOnRideServer($passenger_id, [ + 'ride_id' => $rideId, + 'status' => 'cancelled', + 'msg' => 'نعتذر، قام السائق بإلغاء الرحلة' + ]); + } + + jsonSuccess(null, "Ride Cancelled"); + } else { + jsonError("Cannot cancel ride (Status might be started or finished)"); + } + +} catch (PDOException $e) { + jsonError("DB Error: " . $e->getMessage()); +} +?> +?> +``` + +## File: ride/cancelRide/delete.php +``` +prepare($sql); +$stmt->bindParam(":id", $id, PDO::PARAM_INT); // تأكيد أن id رقم +$stmt->execute(); + +if ($stmt->rowCount() > 0) { + jsonSuccess(null, "Record deleted successfully"); +} else { + jsonError("Failed to delete record"); +} +?> +``` + +## File: ride/helpCenter/add.php +``` +prepare($sql); +$stmt->bindParam(':driverID', $driverID); +$stmt->bindParam(':helpQuestion', $helpQuestion); +$stmt->execute(); + +if ($stmt->rowCount() > 0) { + jsonSuccess(null, "Help question saved successfully"); +} else { + jsonError("Failed to save help question"); +} +?> +``` + +## File: ride/helpCenter/update.php +``` +prepare($sql); +$stmt->bindParam(':helpQuestion', $newHelpQuestion); +$stmt->bindParam(':id', $helpID, PDO::PARAM_INT); +$stmt->execute(); + +if ($stmt->rowCount() > 0) { + jsonSuccess(null, "Help question updated successfully"); +} else { + jsonError("Failed to update help question"); +} +?> +``` + +## File: ride/helpCenter/get.php +``` +prepare($sql); +$stmt->bindParam(':driverID', $driverID, PDO::PARAM_STR); +$stmt->execute(); + +if ($stmt->rowCount() > 0) { + $record = $stmt->fetchAll(PDO::FETCH_ASSOC); + jsonSuccess($record); +} else { + jsonError("Help question not found"); +} +?> +``` + +## File: ride/helpCenter/getById.php +``` +prepare($sql); +$stmt->bindParam(':id', $helpID, PDO::PARAM_INT); +$stmt->execute(); + +if ($stmt->rowCount() > 0) { + $record = $stmt->fetch(PDO::FETCH_ASSOC); + jsonSuccess($record); +} else { + jsonError("Help question not found"); +} +?> +``` + +## File: ride/helpCenter/delete.php +``` +prepare($sql); +$stmt->bindParam(':id', $helpID, PDO::PARAM_INT); +$stmt->execute(); + +if ($stmt->rowCount() > 0) { + jsonSuccess(null, "Help question deleted successfully"); +} else { + jsonError("Failed to delete help question"); +} +?> +``` + +## File: ride/feedBack/add.php +``` +encryptData($feedBack); + +$sql = "INSERT INTO `feedBack`( `passengerId`, `feedBack`, `datecreated`) VALUES ( + + :passengerId, + :feedBack, + NOW() +)"; + +$stmt = $con->prepare($sql); +$stmt->bindParam(':passengerId', $passengerId); +$stmt->bindParam(':feedBack', $feedBack); +$stmt->execute(); + + +if ($stmt->rowCount() > 0) { + // Success response + echo json_encode([ + "status" => "success", + "message" => "Feedback data saved successfully" + ]); +} else { + // Failure response + echo json_encode([ + "status" => "failure", + "message" => "Failed to save feedback data" + ]); +} +?> + +``` + +## File: ride/feedBack/update.php +``` + +``` + +## File: ride/feedBack/get.php +``` +prepare($sql); +$stmt->bindParam(':passengerId', $passengerId, PDO::PARAM_STR); +$stmt->execute(); +$result = $stmt->fetchAll(PDO::FETCH_ASSOC); + +if ($result) { + // Print all promo records + jsonSuccess($result); +} else { + // Print a failure message + jsonError($message = "Failed to retrieve promo records"); + +} +?> +``` + +## File: ride/feedBack/delete.php +``` + +``` + +## File: ride/feedBack/add_solve_all.php +``` +prepare("SELECT * FROM ride WHERE id = ? AND (status = 'Finished' OR status = 'Begin')"); +$stmt->execute([$rideId]); +$ride = $stmt->fetch(PDO::FETCH_ASSOC); + + +if (!$ride) { + // رسالة خطأ أوضح للمستخدم + error_log("WARNING: Complaint filing failed for ride ID: $rideId. Ride not found or status is invalid."); // ⚠️ تسجيل الخطأ + jsonError("Complaint cannot be filed for this ride. It may not have been completed or started."); + exit; +} + +$passengerId = $ride['passenger_id']; +$driverId = $ride['driver_id']; + +// --- دوال مساعدة لجلب البيانات (تم افتراض أن الدوال تصل إلى $con و $encryptionHelper عبر النطاق global أو تمريرها كـ arguments) --- + +/** + * جلب بيانات ومعلومات تقييم السائق + */ +function getDriverFullProfile($con, $encryptionHelper, $driverId) { + $profile = ['info' => null, 'ratings' => null, 'comments' => []]; + + // جلب معلومات السائق الأساسية + $stmt = $con->prepare("SELECT id, first_name, last_name, created_at FROM driver WHERE id = ?"); + $stmt->execute([$driverId]); + $driverInfo = $stmt->fetch(PDO::FETCH_ASSOC); + + // فك تشفير البيانات الحساسة + if ($driverInfo) { + // التحقق من وجود ودوال فك التشفير قبل الاستخدام + if (isset($encryptionHelper) && method_exists($encryptionHelper, 'decryptData')) { + $decryptedFirstName = $encryptionHelper->decryptData($driverInfo['first_name']); + $decryptedLastName = $encryptionHelper->decryptData($driverInfo['last_name']); + $driverInfo['full_name'] = trim($decryptedFirstName . ' ' . $decryptedLastName); + } else { + $driverInfo['full_name'] = 'Decryption Failed'; + } + + unset($driverInfo['first_name'], $driverInfo['last_name']); // إزالة الحقول المشفرة + $profile['info'] = $driverInfo; + } + + // جلب ملخص التقييمات والتعليقات + $stmt = $con->prepare("SELECT AVG(rating) as avg_rating, COUNT(id) as total_ratings FROM ratingDriver WHERE driver_id = ?"); + $stmt->execute([$driverId]); + $profile['ratings'] = $stmt->fetch(PDO::FETCH_ASSOC); + + $stmt = $con->prepare("SELECT comment FROM ratingDriver WHERE driver_id = ? AND comment IS NOT NULL AND comment != '' ORDER BY created_at DESC LIMIT 5"); + $stmt->execute([$driverId]); + $profile['comments'] = $stmt->fetchAll(PDO::FETCH_COLUMN); + + return $profile; +} + +/** + * جلب بيانات ومعلومات تقييم الراكب + */ +function getPassengerFullProfile($con, $encryptionHelper, $passengerId) { + $profile = ['info' => null, 'ratings' => null, 'comments' => []]; + + $stmt = $con->prepare("SELECT id, first_name, last_name, created_at FROM passengers WHERE id = ?"); + $stmt->execute([$passengerId]); + $passengerInfo = $stmt->fetch(PDO::FETCH_ASSOC); + + // فك تشفير البيانات الحساسة + if ($passengerInfo) { + if (isset($encryptionHelper) && method_exists($encryptionHelper, 'decryptData')) { + $decryptedFirstName = $encryptionHelper->decryptData($passengerInfo['first_name']); + $decryptedLastName = $encryptionHelper->decryptData($passengerInfo['last_name']); + $passengerInfo['full_name'] = trim($decryptedFirstName . ' ' . $decryptedLastName); + } else { + $passengerInfo['full_name'] = 'Decryption Failed'; + } + + unset($passengerInfo['first_name'], $passengerInfo['last_name']); + $profile['info'] = $passengerInfo; + } + + $stmt = $con->prepare("SELECT AVG(rating) as avg_rating, COUNT(id) as total_ratings FROM ratingPassenger WHERE passenger_id = ?"); + $stmt->execute([$passengerId]); + $profile['ratings'] = $stmt->fetch(PDO::FETCH_ASSOC); + + $stmt = $con->prepare("SELECT comment FROM ratingPassenger WHERE passenger_id = ? AND comment IS NOT NULL AND comment != '' ORDER BY created_at DESC LIMIT 5"); + $stmt->execute([$passengerId]); + $profile['comments'] = $stmt->fetchAll(PDO::FETCH_COLUMN); + + return $profile; +} + +/** + * جلب بيانات سلوك السائق في الرحلة المحددة + */ +function getDriverBehavior($con, $rideId, $driverId) { + $stmt = $con->prepare("SELECT max_speed, avg_speed, hard_brakes, behavior_score FROM driver_behavior WHERE trip_id = ? AND driver_id = ?"); + $stmt->execute([$rideId, $driverId]); + return $stmt->fetch(PDO::FETCH_ASSOC) ?: null; +} + +// استدعاء الدوال لجلب البيانات +$passengerProfile = getPassengerFullProfile($con, $encryptionHelper, $passengerId); +$driverProfile = getDriverFullProfile($con, $encryptionHelper, $driverId); +$driverBehavior = getDriverBehavior($con, $rideId, $driverId); + +// --- 4. بناء الـ Prompt وإرساله إلى Gemini --- +$prompt = " +أنت خبير في حل النزاعات في خدمات نقل الركاب لتطبيق intaleqapp.com. قم بتحليل الشكوى التالية بين راكب وسائق بناءً على البيانات الشاملة التالية: + +**1. تفاصيل الرحلة:** +" . json_encode($ride, JSON_UNESCAPED_UNICODE | JSON_PRETTY_PRINT) . " + +**2. ملف الراكب:** +" . json_encode($passengerProfile, JSON_UNESCAPED_UNICODE | JSON_PRETTY_PRINT) . " + +**3. ملف السائق:** +" . json_encode($driverProfile, JSON_UNESCAPED_UNICODE | JSON_PRETTY_PRINT) . " + +**4. بيانات سلوك السائق (في هذه الرحلة):** +" . json_encode($driverBehavior, JSON_UNESCAPED_UNICODE | JSON_PRETTY_PRINT) . " + +**5. الشكوى نفسها:** +- نص الشكوى من الراكب: '" . $complaintText . "' +- رابط تسجيل صوتي للشكوى (إن وجد): " . $audioLink . " + +**مهمتك هي:** +1. تحليل جميع البيانات المتاحة لتحديد الطرف المخطئ على الأرجح. +2. تحديد ما إذا كانت الشكوى كيدية أم حقيقية. +3. **تصنيف الشكوى** (مثال: سلوك السائق، مشكلة في الأجرة، مسار الرحلة، حالة السيارة، أخرى). +4. اقتراح حلين واضحين ومختلفين لفريق خدمة العملاء. +5. كتابة تقرير موجز ومناسب للراكب. +6. كتابة تقرير موجز ومناسب للسائق. + +**الخرج المطلوب:** +أعد الرد بصيغة JSON فقط، بدون أي نصوص إضافية، وباللغة العربية (لهجة مصرية)، بالهيكل التالي: +{ + \"customerServiceSolutions\": [\"الحل المقترح الأول\", \"الحل المقترح الثاني\"], + \"passengerReport\": { \"title\": \"بخصوص شكوتك في رحلة Intaleq\", \"body\": \"رسالة واضحة للراكب بنتيجة الشكوى\" }, + \"driverReport\": { \"title\": \"بخصوص بلاغ رحلتك الأخيرة في Intaleq\", \"body\": \"رسالة واضحة للسائق بنتيجة الشكوى\" }, + \"fault_determination\": \"الطرف المخطئ (الراكب/السائق/كلاهما/غير واضح)\", + \"complaint_nature\": \"طبيعة الشكوى (حقيقية/كيدية/نزاع بسيط)\", + \"complaint_type\": \"تصنيف الشكوى الذي حددته\" +} +"; + +// استخدام نموذج Gemini 1.5 Flash Lite +$apiURL = "https://generativelanguage.googleapis.com/v1beta/models/gemini-flash-lite-latest:generateContent?key=$geminiApiKey"; +$headers = ["Content-Type: application/json"]; +$payload = ['contents' => [['parts' => [['text' => $prompt]]]]]; + +error_log("INFO: Submitting complaint analysis to Gemini for ride ID: $rideId."); // ℹ️ تسجيل الحدث + +$ch = curl_init($apiURL); +curl_setopt_array($ch, [ + CURLOPT_RETURNTRANSFER => true, + CURLOPT_POST => true, + CURLOPT_HTTPHEADER => $headers, + CURLOPT_POSTFIELDS => json_encode($payload), + CURLOPT_TIMEOUT => 60 +]); +$response = curl_exec($ch); + +if (curl_errno($ch)) { + $errorMsg = curl_error($ch); + error_log("ERROR: AI Service Curl Error for ride $rideId: $errorMsg"); // ⚠️ تسجيل الخطأ + jsonError("AI Service Error: " . $errorMsg); + curl_close($ch); + exit; +} +curl_close($ch); + +$data = json_decode($response, true); +$analysisResultText = $data['candidates'][0]['content']['parts'][0]['text'] ?? ''; +$analysisResultJson = trim(preg_replace('/```json|```/', '', $analysisResultText)); +$analysisResult = json_decode($analysisResultJson, true); + +if (json_last_error() !== JSON_ERROR_NONE || !isset($analysisResult['passengerReport']) || !isset($analysisResult['driverReport'])) { + error_log("ERROR: Failed to parse AI response for ride $rideId. Raw Response: " . substr($response, 0, 500)); // ⚠️ تسجيل الخطأ + jsonError("Failed to parse AI response. Please try again later."); + exit; +} + +error_log("INFO: Gemini analysis successful for ride $rideId. Type: " . ($analysisResult['complaint_type'] ?? 'N/A')); // ℹ️ تسجيل الحدث + +// --- 5. تنفيذ الإجراءات بناءً على التحليل --- + +// تجميع الوصف الكامل للشكوى +$fullDescription = $complaintText; +if (!empty($audioLink)) { + $fullDescription .= "\n\n[رابط صوتي مرفق: " . $audioLink . "]"; +} + +// ** التعديل: تم تحديث جملة الحفظ لتشمل جميع مخرجات التحليل ** +$stmt = $con->prepare(" + INSERT INTO complaint ( + ride_id, passenger_id, driver_id, complaint_type, description, + date_filed, statusComplaint, resolution, passenger_report, driver_report, + cs_solutions, fault_determination, complaint_nature, date_resolved + ) + VALUES (?, ?, ?, ?, ?, NOW(), ?, ?, ?, ?, ?, ?, ?, NOW()) +"); + +try { + $success = $stmt->execute([ + $rideId, + $passengerId, + $driverId, + $analysisResult['complaint_type'] ?? 'General', + $fullDescription, + 'Resolved', // statusComplaint + $analysisResultJson, // resolution (الـ JSON الكامل) + json_encode($analysisResult['passengerReport'] ?? null, JSON_UNESCAPED_UNICODE), // passenger_report + json_encode($analysisResult['driverReport'] ?? null, JSON_UNESCAPED_UNICODE), // driver_report + json_encode($analysisResult['customerServiceSolutions'] ?? null, JSON_UNESCAPED_UNICODE), // cs_solutions + $analysisResult['fault_determination'] ?? 'N/A', // fault_determination + $analysisResult['complaint_nature'] ?? 'N/A' // complaint_nature + ]); + + if (!$success) { + // يمكنك تسجيل رسالة الخطأ من PDO إذا كانت متاحة (للتصحيح فقط وليس للإنتاج) + error_log("CRITICAL: Failed to save complaint to DB for ride $rideId. PDO Error Info: " . json_encode($stmt->errorInfo())); // ⚠️ تسجيل الخطأ + } + + $complaintId = $con->lastInsertId(); + error_log("SUCCESS: Complaint ID $complaintId processed and saved for ride $rideId."); // ✅ تسجيل النجاح + +} catch (PDOException $e) { + error_log("CRITICAL: PDO Exception when saving complaint for ride $rideId: " . $e->getMessage()); // ⚠️ تسجيل خطأ قاعدة البيانات + jsonError("A database error occurred while saving the complaint."); + exit; +} + +// إرسال رسالة WhatsApp لخدمة العملاء +if (function_exists('sendWhatsAppFromServer') && !empty($customerServiceWhatsapp)) { + $csMessage = "*شكوى جديدة (رقم $complaintId)*\n" . + "*- الرحلة:* $rideId\n" . + "*- تصنيف الشكوى:* " . ($analysisResult['complaint_type'] ?? 'غير محدد') . "\n" . + "*- المخطئ (تقدير النظام):* " . $analysisResult['fault_determination'] . "\n" . + "*- طبيعة الشكوى:* " . $analysisResult['complaint_nature'] . "\n\n" . + "*حلول مقترحة:*\n1. " . ($analysisResult['customerServiceSolutions'][0] ?? 'N/A') . "\n" . + "2. " . ($analysisResult['customerServiceSolutions'][1] ?? 'N/A'); + sendWhatsAppFromServer($customerServiceWhatsapp, $csMessage); + error_log("INFO: WhatsApp notification sent to customer service for complaint ID $complaintId."); // ℹ️ تسجيل الحدث +} + + +// --- 6. إرسال الرد النهائي للتطبيق --- +printSuccess([ + 'message' => 'Complaint processed successfully.', + 'passenger_response' => $analysisResult['passengerReport'], + 'driver_response' => $analysisResult['driverReport'] +]); + +?> +``` + +## File: ride/driverPayment/add.php +``` +prepare($sql); +$stmt->execute(); + +if ($stmt->rowCount() > 0) { + + $insertedID = $con->lastInsertId(); // Get the last inserted ID + jsonSuccess($message = $insertedID); +} else { + $response = array( + "success" => false, + "message" => "Failed to save payment data" + ); + echo json_encode($response); +} +?> +``` + +## File: ride/driverPayment/update.php +``` +prepare($sql); +$stmt->execute(); + +if ($stmt->rowCount() > 0) { + // Print a success message + echo "Record updated successfully"; +} else { + // Print a failure message + echo "Failed to update the record"; +} +?> +``` + +## File: ride/driverPayment/get.php +``` +prepare($sql); +$stmt->execute(); + +if ($stmt->rowCount() > 0) { + // Fetch the record + $row = $stmt->fetchAll(PDO::FETCH_ASSOC); + + jsonSuccess($row); + +} else { + // No records found + echo "No records found."; +} +?> +``` + +## File: ride/driverPayment/delete.php +``` +prepare($sql); +$stmt->execute(); + +if ($stmt->rowCount() > 0) { + // Print a success message + echo "Record deleted successfully"; +} else { + // Print a failure message + echo "Failed to delete the record"; +} +?> +``` + +## File: ride/kazan/add.php +``` +prepare($sql); + +// Bind the parameters to the SQL query +$stmt->bindParam(':kazan', $kazan); +$stmt->bindParam(':comfortPrice', $comfortPrice); +$stmt->bindParam(':speedPrice', $speedPrice); +$stmt->bindParam(':deliveryPrice', $deliveryPrice); +$stmt->bindParam(':freePrice', $freePrice); +$stmt->bindParam(':latePrice', $latePrice); +$stmt->bindParam(':heavyPrice', $heavyPrice); +$stmt->bindParam(':adminId', $adminId); +$stmt->bindParam(':naturePrice', $naturePrice); +$stmt->bindParam(':country', $country); +$stmt->bindParam(':fuelPrice', $fuelPrice); + +// Execute the statement +if ($stmt->execute()) { + // Print a success message + jsonSuccess(null, "Kazan saved successfully"); +} else { + // Print a failure message + jsonError("Failed to save Kazan"); +} + +// Close the statement +$stmt->close(); +?> + +``` + +## File: ride/kazan/update.php +``` +prepare($sql); +$stmt->execute($params); + +if ($stmt->rowCount() > 0) { + jsonSuccess(null, "Kazan data updated successfully"); +} else { + jsonError("Failed to update kazan data"); +} +?> +``` + +## File: ride/kazan/get.php +``` +prepare($sql); +$stmt->bindParam(':country', $country, PDO::PARAM_STR); +$stmt->execute(); + +$row = $stmt->fetchAll(PDO::FETCH_ASSOC); + +if ($row) { + jsonSuccess($row); +} else { + jsonError("No Kazan record found"); +} +?> +``` + +## File: ride/kazan/delete.php +``` + +``` + +## File: ride/apiKey/add.php +``` + +``` + +## File: ride/apiKey/update.php +``` + +``` + +## File: ride/apiKey/get.php +``` +prepare($sql); + $stmt->execute(); + $result = $stmt->fetchAll(PDO::FETCH_ASSOC); + + return $result; +} + + +?> +``` + +## File: ride/apiKey/delete.php +``` + +``` + +## File: ride/firebase/addToken.php +``` +encryptData($token); + +// التحقق مما إذا كان السجل موجودًا +$sqlCheck = "SELECT * FROM `tokens` WHERE `passengerID` = :passengerID"; +$stmtCheck = $con->prepare($sqlCheck); +$stmtCheck->bindParam(':passengerID', $passengerID); +$stmtCheck->execute(); + +$result = $stmtCheck->fetch(PDO::FETCH_ASSOC); + +if ($result) { + // تحديث السجل الموجود + $sqlUpdate = "UPDATE `tokens` SET `token` = :token, `fingerPrint` = :fingerPrint WHERE `passengerID` = :passengerID"; + $stmtUpdate = $con->prepare($sqlUpdate); + $stmtUpdate->bindParam(':token', $tokenEncrypted); + $stmtUpdate->bindParam(':fingerPrint', $fingerPrint); // بدون تشفير إضافي + $stmtUpdate->bindParam(':passengerID', $passengerID); + $stmtUpdate->execute(); + + jsonSuccess(null, "Token updated successfully"); + +} else { + // إدخال سجل جديد + $sqlInsert = "INSERT INTO `tokens` (`token`, `passengerID`, `fingerPrint`) VALUES (:token, :passengerID, :fingerPrint)"; + $stmtInsert = $con->prepare($sqlInsert); + $stmtInsert->bindParam(':token', $tokenEncrypted); + $stmtInsert->bindParam(':passengerID', $passengerID); + $stmtInsert->bindParam(':fingerPrint', $fingerPrint); // بدون تشفير إضافي + $stmtInsert->execute(); + + if ($stmtInsert->rowCount() > 0) { + jsonSuccess(null, "Token inserted successfully"); + } else { + jsonError("Failed to insert token"); + } +} +?> +``` + +## File: ride/firebase/add.php +``` +encryptData($token); + +// التحقق مما إذا كان السجل موجودًا +$sqlCheck = "SELECT * FROM `tokens` WHERE `passengerID` = :passengerID"; +$stmtCheck = $con->prepare($sqlCheck); +$stmtCheck->bindParam(':passengerID', $passengerID); +$stmtCheck->execute(); + +$result = $stmtCheck->fetch(PDO::FETCH_ASSOC); + +if ($result) { + // تحديث السجل الموجود + $sqlUpdate = "UPDATE `tokens` SET `token` = :token, `fingerPrint` = :fingerPrint WHERE `passengerID` = :passengerID"; + $stmtUpdate = $con->prepare($sqlUpdate); + $stmtUpdate->bindParam(':token', $tokenEncrypted); + $stmtUpdate->bindParam(':fingerPrint', $fingerPrint); // بدون تشفير إضافي + $stmtUpdate->bindParam(':passengerID', $passengerID); + $stmtUpdate->execute(); + + jsonSuccess(null, "Token updated successfully"); + +} else { + // إدخال سجل جديد + $sqlInsert = "INSERT INTO `tokens` (`token`, `passengerID`, `fingerPrint`) VALUES (:token, :passengerID, :fingerPrint)"; + $stmtInsert = $con->prepare($sqlInsert); + $stmtInsert->bindParam(':token', $tokenEncrypted); + $stmtInsert->bindParam(':passengerID', $passengerID); + $stmtInsert->bindParam(':fingerPrint', $fingerPrint); // بدون تشفير إضافي + $stmtInsert->execute(); + + if ($stmtInsert->rowCount() > 0) { + jsonSuccess(null, "Token inserted successfully"); + } else { + jsonError("Failed to insert token"); + } +} +?> +``` + +## File: ride/firebase/get.php +``` +prepare($sql); +$stmt->bindParam(':passengerID', $passengerID, PDO::PARAM_STR); +$stmt->execute(); + +$data = $stmt->fetch(PDO::FETCH_ASSOC); + +if ($data) { + // فك تشفير التوكن فقط + $data['token'] = $encryptionHelper->decryptData($data['token']); + jsonSuccess($data); + +} else { + jsonError("No token found for this passenger"); +} +?> +``` + +## File: ride/firebase/getTokensPassenger.php +``` +prepare($sql); +$stmt->bindParam(':passengerID', $passengerID, PDO::PARAM_STR); +$stmt->execute(); + +$data = $stmt->fetch(PDO::FETCH_ASSOC); + +if ($data) { + // فك تشفير التوكن فقط + $data['token'] = $encryptionHelper->decryptData($data['token']); + jsonSuccess($data); + +} else { + jsonError("No token found for this passenger"); +} +?> +``` + +## File: ride/firebase/fcm_fun.php +``` + 'RS256', 'typ' => 'JWT'])); + $claim = base64UrlEncode(json_encode([ + 'iss' => $clientEmail, + 'scope' => 'https://www.googleapis.com/auth/firebase.messaging', + 'aud' => 'https://oauth2.googleapis.com/token', + 'exp' => $now + 3600, + 'iat' => $now + ])); + + $signature = ''; + openssl_sign("$header.$claim", $signature, $privateKey, 'SHA256'); + $jwt = "$header.$claim." . base64UrlEncode($signature); + + $ch = curl_init("https://oauth2.googleapis.com/token"); + curl_setopt($ch, CURLOPT_POST, 1); + curl_setopt($ch, CURLOPT_POSTFIELDS, http_build_query([ + 'grant_type' => 'urn:ietf:params:oauth:grant-type:jwt-bearer', + 'assertion' => $jwt + ])); + curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); + curl_setopt($ch, CURLOPT_TIMEOUT, 10); + + $res = curl_exec($ch); + $httpCode = curl_getinfo($ch, CURLINFO_HTTP_CODE); + curl_close($ch); + + if ($httpCode != 200) { + error_log("❌ FCM OAuth Error ($httpCode): $res"); + return null; + } + + return json_decode($res, true)['access_token'] ?? null; +} + +// ============================================================================ +// 🔥 الدالة الرئيسية: إرسال إشعار FCM (داخلي - بدون HTTP) +// ============================================================================ +function sendFCMNotification($params) { + // استخراج البارامترات + $token = $params['token'] ?? null; + $title = $params['title'] ?? ''; + $body = $params['body'] ?? ''; + $category = $params['category'] ?? ''; + $data = $params['data'] ?? []; + $tone = $params['tone'] ?? 'default'; + $isTopic = $params['isTopic'] ?? false; + $serviceAccountPath = $params['service_account_path'] ?? __DIR__ . '/service-account.json'; + + // التحقق من البيانات الأساسية + if (empty($token) || empty($title) || empty($body)) { + error_log("❌ FCM: Missing required fields (token, title, or body)"); + return [ + 'success' => false, + 'error' => 'Missing required parameters', + 'http_code' => 400 + ]; + } + + // الحصول على Access Token + $accessToken = getFCMAccessToken($serviceAccountPath); + if (!$accessToken) { + return [ + 'success' => false, + 'error' => 'Failed to get Access Token', + 'http_code' => 500 + ]; + } + + // جلب Project ID + $creds = json_decode(file_get_contents($serviceAccountPath), true); + $projectId = $creds['project_id']; + $fcmUrl = "https://fcm.googleapis.com/v1/projects/$projectId/messages:send"; + + // بناء الـ Payload + $messagePayload = [ + 'message' => [ + 'notification' => [ + 'title' => $title, + 'body' => $body + ], + 'android' => [ + 'priority' => 'HIGH', + 'notification' => [ + 'sound' => $tone, + 'channel_id' => 'high_importance_channel' + ] + ], + 'apns' => [ + 'headers' => ['apns-priority' => '10'], + 'payload' => [ + 'aps' => [ + 'sound' => $tone . '.caf', + 'content-available' => 1 + ] + ] + ] + ] + ]; + + // تحديد الهدف + if ($isTopic) { + $messagePayload['message']['topic'] = $token; + } else { + $messagePayload['message']['token'] = $token; + } + + // إضافة الـ Data Payload + $customData = ['category' => (string)$category]; + if (is_array($data) && !empty($data)) { + $customData = array_merge($customData, $data); + } + + // تحويل كل القيم إلى String (FCM requirement) + $processedData = []; + foreach ($customData as $key => $val) { + if (is_array($val) || is_object($val)) { + $processedData[$key] = json_encode($val, JSON_UNESCAPED_UNICODE | JSON_UNESCAPED_SLASHES); + } else { + $processedData[$key] = (string)$val; + } + } + $messagePayload['message']['data'] = $processedData; + + // الإرسال إلى FCM + $ch = curl_init($fcmUrl); + curl_setopt($ch, CURLOPT_POST, true); + curl_setopt($ch, CURLOPT_HTTPHEADER, [ + 'Authorization: Bearer ' . $accessToken, + 'Content-Type: application/json; charset=UTF-8' + ]); + curl_setopt($ch, CURLOPT_POSTFIELDS, json_encode($messagePayload, JSON_UNESCAPED_UNICODE)); + curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); + curl_setopt($ch, CURLOPT_TIMEOUT, 10); + + $result = curl_exec($ch); + $httpCode = curl_getinfo($ch, CURLINFO_HTTP_CODE); + $curlError = curl_error($ch); + curl_close($ch); + + // معالجة النتيجة + if ($httpCode == 200) { + error_log("✅ FCM Sent: Category=$category, Token=" . substr($token, 0, 15) . "..."); + return [ + 'success' => true, + 'http_code' => $httpCode, + 'response' => json_decode($result, true) + ]; + } else { + error_log("❌ FCM Error ($httpCode): $result | CURL: $curlError"); + return [ + 'success' => false, + 'http_code' => $httpCode, + 'error' => json_decode($result, true), + 'curl_error' => $curlError + ]; + } +} + +// ============================================================================ +// 🎯 دوال مُساعدة جاهزة للاستخدام المباشر +// ============================================================================ + +/** + * إرسال إشعار "وصول السائق" + */ +function notifyDriverArrival($passengerToken, $driverName, $rideId) { + return sendFCMNotification([ + 'token' => $passengerToken, + 'title' => "السائق وصل إليك 📍", + 'body' => "$driverName في انتظارك الآن.", + 'category' => 'Arrive Ride', + 'tone' => 'tone1', + 'data' => [ + 'ride_id' => (string)$rideId, + 'timestamp' => date('Y-m-d H:i:s') + ] + ]); +} + +/** + * إرسال إشعار "بدأت الرحلة" + */ +function notifyTripBegin($passengerToken, $driverName, $rideId) { + return sendFCMNotification([ + 'token' => $passengerToken, + 'title' => "بدأت الرحلة 🚗", + 'body' => "السائق $driverName بدأ رحلتك الآن.", + 'category' => 'Trip is Begin', + 'tone' => 'start', + 'data' => [ + 'ride_id' => (string)$rideId, + 'start_time' => date('Y-m-d H:i:s') + ] + ]); +} + +/** + * إرسال إشعار "قبول الطلب" + */ +function notifyRideAccepted($passengerToken, $driverInfo, $rideId) { + return sendFCMNotification([ + 'token' => $passengerToken, + 'title' => "تم قبول الطلب 🚖", + 'body' => "الكابتن {$driverInfo['driverName']} قادم إليك.", + 'category' => 'Accepted Ride', + 'tone' => 'start', + 'data' => [ + 'ride_id' => (string)$rideId, + 'driver_id' => (string)$driverInfo['driverId'], + 'driver_info' => $driverInfo // سيتم تحويلها لـ JSON تلقائياً + ] + ]); +} + +/** + * إرسال إشعار "إلغاء الرحلة من السائق" + */ +function notifyRideCancelled($passengerToken, $rideId, $reason = '') { + return sendFCMNotification([ + 'token' => $passengerToken, + 'title' => "تم إلغاء الرحلة ❌", + 'body' => "السائق اعتذر عن إكمال الرحلة.", + 'category' => 'Cancel Trip from driver', + 'tone' => 'cancel', + 'data' => [ + 'ride_id' => (string)$rideId, + 'reason' => $reason, + 'cancelled_at' => date('Y-m-d H:i:s') + ] + ]); +} + +/** + * إرسال إشعار "انتهاء الرحلة" + */ +function notifyTripFinished($passengerToken, $tripData) { + return sendFCMNotification([ + 'token' => $passengerToken, + 'title' => "انتهت الرحلة 🏁", + 'body' => "شكرًا لاستخدامك تطبيق Tripz", + 'category' => 'Driver Finish Trip', + 'tone' => 'default', + 'data' => [ + 'DriverList' => $tripData // Array سيتم تحويلها لـ JSON + ] + ]); +} +?> + +``` + +## File: ride/firebase/getTokenParent.php +``` +encryptData($phone); + +// 1️⃣ جلب passengerID بناءً على رقم الهاتف +$sql = "SELECT `id` FROM `passengers` WHERE `phone` = :phone"; +$stmt = $con->prepare($sql); +$stmt->bindParam(':phone', $phoneEncrypted); +$stmt->execute(); +$data = $stmt->fetch(PDO::FETCH_ASSOC); + +if ($data) { + $passengerID = $data['id']; +} else { + jsonError("No passenger found for the given phone number"); + exit; +} + +// 2️⃣ جلب التوكنات المرتبطة بـ passengerID +$sql1 = "SELECT * FROM `tokens` WHERE `passengerID` = :passengerID"; +$stmt = $con->prepare($sql1); +$stmt->bindParam(':passengerID', $passengerID); +$stmt->execute(); +$data = $stmt->fetchAll(PDO::FETCH_ASSOC); + +if ($data) { + // فك تشفير التوكن فقط + foreach ($data as &$row) { + $row['token'] = $encryptionHelper->decryptData($row['token']); + // fingerPrint يبقى كما هو + } + + echo json_encode([ + 'status' => 'success', + 'count' => count($data), + 'data' => $data + ]); +} else { + jsonError("No tokens found for the passenger"); +} +?> +``` + +## File: ride/firebase/addDriver.php +``` +encryptData($token); + +// التحقق مما إذا كان السجل موجودًا +$sqlCheck = "SELECT * FROM `driverToken` WHERE `captain_id` = :captain_id"; +$stmtCheck = $con->prepare($sqlCheck); +$stmtCheck->bindParam(':captain_id', $captain_id); +$stmtCheck->execute(); + +$result = $stmtCheck->fetch(PDO::FETCH_ASSOC); + +if ($result) { + // تحديث السجل + $sqlUpdate = "UPDATE `driverToken` SET `token` = :token, `fingerPrint` = :fingerPrint WHERE `captain_id` = :captain_id"; + $stmtUpdate = $con->prepare($sqlUpdate); + $stmtUpdate->bindParam(':token', $tokenEncrypted); + $stmtUpdate->bindParam(':fingerPrint', $fingerPrint); // بدون إعادة تشفير + $stmtUpdate->bindParam(':captain_id', $captain_id); + $stmtUpdate->execute(); + + jsonSuccess(null, "Token updated successfully"); + +} else { + // إدخال سجل جديد + $sqlInsert = "INSERT INTO `driverToken` (`token`, `captain_id`, `fingerPrint`) VALUES (:token, :captain_id, :fingerPrint)"; + $stmtInsert = $con->prepare($sqlInsert); + $stmtInsert->bindParam(':token', $tokenEncrypted); + $stmtInsert->bindParam(':captain_id', $captain_id); + $stmtInsert->bindParam(':fingerPrint', $fingerPrint); // بدون إعادة تشفير + $stmtInsert->execute(); + + if ($stmtInsert->rowCount() > 0) { + jsonSuccess(null, "Token inserted successfully"); + } else { + jsonError("Failed to insert token"); + } +} +?> +``` + +## File: ride/firebase/notify_driver_arrival.php +``` + 'test'], // بيانات إضافية بسيطة + "General" // التصنيف +); + +// 3. طباعة النتيجة +//echo "النتيجة:\n"; +print_r($result); + +?> +``` + +## File: ride/firebase/getAllTokenPassengers.php +``` +prepare($sql); +$stmt->execute(); +$data = $stmt->fetchAll(PDO::FETCH_ASSOC); + +if ($data) { + // فك تشفير token فقط + foreach ($data as &$item) { + $item['token'] = $encryptionHelper->decryptData($item['token']); + // fingerPrint يبقى كما هو (مشفّر من التطبيق) + } + + echo json_encode([ + 'status' => 'success', + 'data' => $data + ]); +} else { + jsonError("No token records found"); +} +?> +``` + +## File: ride/firebase/delete.php +``` +prepare($sql); +$stmt->bindParam(':id', $id, PDO::PARAM_INT); +$stmt->execute(); + +if ($stmt->rowCount() > 0) { + jsonSuccess(null, "Token deleted successfully"); +} else { + jsonError("Failed to delete token"); +} +?> +``` + +## File: ride/firebase/getDriverToken.php +``` +prepare($sql); +$stmt->bindParam(':captain_id', $captain_id, PDO::PARAM_STR); +$stmt->execute(); +$data = $stmt->fetchAll(PDO::FETCH_ASSOC); + +if ($data) { + // فك تشفير token فقط + foreach ($data as &$item) { + $item['token'] = $encryptionHelper->decryptData($item['token']); + // fingerPrint يبقى كما هو + } + + echo json_encode([ + 'status' => 'success', + 'data' => $data + ]); +} else { + jsonError("No driver token found"); +} +?> +``` + +## File: ride/firebase/send_fcm.php +``` + 'error', 'message' => 'Only POST allowed.']); + exit; +} + +// استقبال البيانات +$json_input = file_get_contents('php://input'); +$requestData = json_decode($json_input, true); + +$target = $requestData['target'] ?? null; +$title = $requestData['title'] ?? null; +$body = $requestData['body'] ?? null; +$isTopic = $requestData['isTopic'] ?? false; +$tone = $requestData['tone'] ?? 'default'; +$customData = $requestData['data'] ?? []; + +if (!$target) { + http_response_code(400); + echo json_encode(['status' => 'error', 'message' => 'Missing: target, title, or body.']); + exit; +} + +// ============================================================================ +// دالة Base64 URL-Safe Encoding (ضرورية للـ JWT) +// ============================================================================ +function base64UrlEncode($data) { + return rtrim(strtr(base64_encode($data), '+/', '-_'), '='); +} + +// ============================================================================ +// دالة المصادقة (Google OAuth2) +// ============================================================================ +function getAccessToken($credentialsPath) { + if (!file_exists($credentialsPath)) return null; + + $credentials = json_decode(file_get_contents($credentialsPath), true); + $clientEmail = $credentials['client_email']; + $privateKey = $credentials['private_key']; + + $now = time(); + $header = base64UrlEncode(json_encode(['alg' => 'RS256', 'typ' => 'JWT'])); + $claim = base64UrlEncode(json_encode([ + 'iss' => $clientEmail, + 'scope' => 'https://www.googleapis.com/auth/firebase.messaging', + 'aud' => 'https://oauth2.googleapis.com/token', + 'exp' => $now + 3600, + 'iat' => $now + ])); + + $signature = ''; + openssl_sign("$header.$claim", $signature, $privateKey, 'SHA256'); + $jwt = "$header.$claim." . base64UrlEncode($signature); + + $ch = curl_init("https://oauth2.googleapis.com/token"); + curl_setopt($ch, CURLOPT_POST, 1); + curl_setopt($ch, CURLOPT_POSTFIELDS, http_build_query([ + 'grant_type' => 'urn:ietf:params:oauth:grant-type:jwt-bearer', + 'assertion' => $jwt + ])); + curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); + $res = curl_exec($ch); + curl_close($ch); + + return json_decode($res, true)['access_token'] ?? null; +} + +// الحصول على Access Token +$accessToken = getAccessToken($serviceAccountFile); +if (!$accessToken) { + http_response_code(500); + echo json_encode(['status' => 'error', 'message' => 'Failed to get Access Token.']); + exit; +} + +// جلب Project ID +$creds = json_decode(file_get_contents($serviceAccountFile), true); +$projectId = $creds['project_id']; +$fcmUrl = "https://fcm.googleapis.com/v1/projects/$projectId/messages:send"; + +// ============================================================================ +// بناء هيكل الرسالة +// ============================================================================ +$messagePayload = [ + 'message' => [ + 'notification' => [ + 'title' => $title, + 'body' => $body + ], + 'android' => [ + 'priority' => 'HIGH', + 'notification' => [ + 'sound' => $tone, + 'channel_id' => 'high_importance_channel' // تأكد من تطابقه مع Android + ] + ], + 'apns' => [ + 'headers' => ['apns-priority' => '10'], + 'payload' => [ + 'aps' => [ + 'sound' => $tone . '.caf', + 'content-available' => 1 + ] + ] + ] + ] +]; + +// تحديد الهدف (Topic أو Token) +if ($isTopic) { + $messagePayload['message']['topic'] = $target; +} else { + $messagePayload['message']['token'] = $target; +} + +// ============================================================================ +// 🔥 معالجة Data Payload (يجب أن تكون String: String فقط) +// ============================================================================ +if (!empty($customData)) { + $processedData = []; + foreach ($customData as $key => $val) { + if (is_array($val) || is_object($val)) { + // تحويل المصفوفات/الكائنات إلى JSON String + $processedData[$key] = json_encode($val, JSON_UNESCAPED_UNICODE | JSON_UNESCAPED_SLASHES); + } else { + // تحويل أي قيمة أخرى إلى String + $processedData[$key] = (string)$val; + } + } + $messagePayload['message']['data'] = $processedData; +} + +// ============================================================================ +// الإرسال الفعلي إلى FCM +// ============================================================================ +$ch = curl_init($fcmUrl); +curl_setopt($ch, CURLOPT_POST, true); +curl_setopt($ch, CURLOPT_HTTPHEADER, [ + 'Authorization: Bearer ' . $accessToken, + 'Content-Type: application/json; charset=UTF-8' +]); +curl_setopt($ch, CURLOPT_POSTFIELDS, json_encode($messagePayload, JSON_UNESCAPED_UNICODE)); +curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); + +$result = curl_exec($ch); +$httpCode = curl_getinfo($ch, CURLINFO_HTTP_CODE); +curl_close($ch); + +// الرد +if ($httpCode == 200) { + echo json_encode([ + 'status' => 'success', + 'message' => 'Notification sent successfully', + 'fcm_response' => json_decode($result) + ], JSON_UNESCAPED_UNICODE); +} else { + http_response_code($httpCode); + echo json_encode([ + 'status' => 'error', + 'message' => 'FCM request failed', + 'fcm_response' => json_decode($result) + ], JSON_UNESCAPED_UNICODE); +} +?> + +``` + +## File: ride/firebase/getALlTokenDrivers.php +``` +prepare($sql); +$stmt->execute(); +$data = $stmt->fetchAll(PDO::FETCH_ASSOC); + +if ($data) { + // فك تشفير token فقط لكل سجل + foreach ($data as &$item) { + $item['token'] = $encryptionHelper->decryptData($item['token']); + // لا يتم فك تشفير fingerPrint لأنه مشفّر من Flutter + } + + echo json_encode([ + 'status' => 'success', + 'data' => $data + ]); +} else { + jsonError("No driver tokens found"); +} +?> +``` + +## File: ride/RegisrationCar/add.php +``` + $driverID, + 'vin' => $vin, + 'car_plate' => $carPlate, + 'make' => $make, + 'model' => $model, + 'year' => $year, + 'expirationDate' => $expirationDate, + 'color' => $color, + 'owner' => $owner, + 'colorHex' => $colorHex, + 'fuel' => $fuel, +]; + +foreach ($required as $field => $val) { + if ($val === null || $val === '') { + jsonError("Missing required field: $field"); + exit; + } +} + +/* ───── 3) تشفير الحقول الحساسة ───── */ +$vin = $encryptionHelper->encryptData($vin); +$carPlate = $encryptionHelper->encryptData($carPlate); +$owner = $encryptionHelper->encryptData($owner); + +/* ───── 4) هل لدى السائق مركبة مُسجلة سابقًا؟ ───── */ +$hasCar = $con->prepare("SELECT 1 FROM CarRegistration WHERE driverID = :d LIMIT 1"); +$hasCar->execute([':d' => $driverID]); +$isDefault = $hasCar->rowCount() === 0 ? 1 : 0; + +/* ───── 5) إدراج السجل ───── */ +$sql = " + INSERT INTO CarRegistration ( + driverID, vin, car_plate, make, model, year, expiration_date, + color, owner, color_hex, fuel, isDefault, created_at, status + ) VALUES ( + :driverID, :vin, :carPlate, :make, :model, :year, :expirationDate, + :color, :owner, :colorHex, :fuel, :isDefault, NOW(), 'yet' + ) +"; + +$ins = $con->prepare($sql); +$ins->execute([ + ':driverID' => $driverID, + ':vin' => $vin, + ':carPlate' => $carPlate, + ':make' => $make, + ':model' => $model, + ':year' => $year, + ':expirationDate' => $expirationDate, + ':color' => $color, + ':owner' => $owner, + ':colorHex' => $colorHex, + ':fuel' => $fuel, + ':isDefault' => $isDefault, +]); + +if ($ins->rowCount() > 0) { + jsonSuccess(null, "Car registration saved."); +} else { + jsonError("Failed to save car registration."); +} +``` + +## File: ride/RegisrationCar/selectDriverAndCarForMishwariTrip.php +``` += NOW() - INTERVAL 1 DAY + AND cr.make NOT LIKE '%دراج%' + AND cr.model NOT LIKE '%دراج%' + ) + SELECT + d.id AS driver_id, + d.phone, + d.gender, + d.name_arabic AS name_arabic, + d.name_english, + d.address, + ll.latitude, + ll.longitude, + FLOOR(DATEDIFF(CURDATE(), STR_TO_DATE(CONCAT(d.birthdate, '-01-01'), '%Y-%m-%d')) / 365.25) AS age, + c.car_plate, + c.make, + c.model, + c.year, + c.color, + c.fuel, + c.displacement, + c.color_hex, + dt.token, + COALESCE(avg_rating.rating, 5) AS rating, + COALESCE(ride_count.count, 0) AS ride_count + FROM driver d + JOIN CarRegistration c ON c.driverID = d.id + JOIN LatestLocations ll ON ll.driver_id = d.id AND ll.row_num = 1 + LEFT JOIN driverToken dt ON dt.captain_id = d.id + LEFT JOIN ( + SELECT driver_id, AVG(rating) AS rating + FROM ratingDriver + GROUP BY driver_id + ) avg_rating ON avg_rating.driver_id = d.id + LEFT JOIN ( + SELECT driver_id, COUNT(*) AS count + FROM ride + WHERE status = 'Finished' + GROUP BY driver_id + ) ride_count ON ride_count.driver_id = d.id + WHERE c.year BETWEEN ? AND ? + ORDER BY rating DESC, c.year DESC, ride_count DESC + LIMIT 10"; + + $stmt = $con->prepare($sql); + $stmt->execute([ + $swLat, $neLat, $swLon, $neLon, + $yearMin, $yearMax, + $yearMin, $yearMax + ]); + + $rows = $stmt->fetchAll(PDO::FETCH_ASSOC); + + // فك التشفير عن الحقول الحساسة + foreach ($rows as &$row) { + $row['phone'] = $encryptionHelper->decryptData($row['phone']); + $row['gender'] = $encryptionHelper->decryptData($row['gender']); + $row['name_arabic'] = $encryptionHelper->decryptData($row['name_arabic']); + $row['name_english'] = $encryptionHelper->decryptData($row['name_english']); + $row['address'] = $encryptionHelper->decryptData($row['address']); + $row['car_plate'] = $encryptionHelper->decryptData($row['car_plate']); + $row['token'] = $encryptionHelper->decryptData($row['token']); + } + + if (count($rows) > 0) { + jsonSuccess($rows); + } else { + jsonError("No drivers found in the specified area"); + } + +} catch (PDOException $e) { + jsonError("Database error: " . $e->getMessage()); +} catch (Exception $e) { + jsonError("Error: " . $e->getMessage()); +} +``` + +## File: ride/RegisrationCar/update.php +``` +encryptData($value); + } + $columnValues[$column] = $value; + } + } +} + +// بناء جملة SET للتحديث +$setClause = []; +foreach ($columnValues as $column => $value) { + $setClause[] = "`$column` = :$column"; +} +$setClause = implode(", ", $setClause); + +// التحقق من وجود بيانات للتحديث +if (empty($setClause)) { + jsonError("No data provided to update."); + exit(); +} + +// ✅ تأكد من اسم الجدول الصحيح +$sql = "UPDATE `CarRegistration` SET $setClause WHERE `driverID` = :driverID AND `id` = :id"; + +$stmt = $con->prepare($sql); + +// ربط القيم بالاستعلام +foreach ($columnValues as $column => $value) { + $stmt->bindValue(":$column", $value); +} +$stmt->bindValue(':driverID', $driverID); +$stmt->bindValue(':id', $id); + +$stmt->execute(); + +if ($stmt->rowCount() > 0) { + jsonSuccess(null, "Car registration data updated successfully"); +} else { + jsonError("Failed to update car registration data"); +} +?> +``` + +## File: ride/RegisrationCar/get.php +``` + +``` + +## File: ride/RegisrationCar/makeDefaultCar.php +``` +prepare($sql1); + $stmt1->bindParam(':driverID', $driverID); + $stmt1->execute(); + + // ثانياً: تعيين السيارة المحددة كافتراضية + $sql2 = "UPDATE `CarRegistration` SET `isDefault` = 1 WHERE `id` = :id"; + $stmt2 = $con->prepare($sql2); + $stmt2->bindParam(':id', $id); + $stmt2->execute(); + + if ($stmt2->rowCount() > 0) { + jsonSuccess(null, "Default car updated successfully."); + } else { + jsonError("Failed to update default car."); + } +} catch (PDOException $e) { + error_log("DB Error: " . $e->getMessage()); + jsonError("Database error occurred."); +} +?> +``` + +## File: ride/RegisrationCar/delete.php +``` + +``` + +## File: ride/videos_driver/get.php +``` +prepare($sql); +$stmt->execute(); +$data = $stmt->fetchAll(PDO::FETCH_ASSOC); + +if ($data) { + jsonSuccess($data); +} else { + jsonError("No video records found"); +} +?> +``` + +## File: ride/egyptPhones/add.php +``` +prepare($sql); +$stmt->bindParam(':phones', $phones); +$stmt->bindParam(':name', $name); +$stmt->bindParam(':phones2', $phones2); + +try { + $stmt->execute(); + if ($stmt->rowCount() > 0) { + // Print a success message + jsonSuccess($message = "Contact data saved successfully"); + } else { + // Print a failure message + jsonError($message = "Failed to save contact data"); + } +} catch (PDOException $e) { + // Print error message + jsonError($message = "Database error: " . $e->getMessage()); +} +?> + +``` + +## File: ride/egyptPhones/syrianAdd.php +``` +prepare($sql); +$stmt->bindParam(':driverId', $driverId); +$stmt->bindParam(':name', $name); +$stmt->bindParam(':phone', $phone); + +try { + $stmt->execute(); + // rowCount() ستكون 1 عند إضافة سجل جديد، و 0 عند تجاهل سجل مكرر + if ($stmt->rowCount() > 0) { + jsonSuccess(null, "New contact saved successfully"); + } else { + jsonSuccess(null, "Contact already exists for this driver."); + } +} catch (PDOException $e) { + // إرجاع رسالة خطأ في حال حدوث مشكلة في قاعدة البيانات + jsonError("Database error: " . $e->getMessage()); +} +?> + +``` + +## File: ride/egyptPhones/get.php +``` + +``` + +## File: ride/profile/updateDriverEmail.php +``` +encryptData($email); + +// تنفيذ التحديث +$sql = "UPDATE driver SET email = :email WHERE id = :id"; +$stmt = $con->prepare($sql); +$success = $stmt->execute([ + ":email" => $encryptedEmail, + ":id" => $id +]); + +if ($success && $stmt->rowCount() > 0) { + jsonSuccess(null, "Email updated successfully"); +} else { + jsonError("Failed to update email"); +} +?> +``` + +## File: ride/profile/update.php +``` + $id]; + +$encryptedFields = [ + "phone", "sosPhone", "birthdate", "site", "gender", + "first_name", "last_name", "education", "employmentType", "maritalStatus" +]; + +foreach ($encryptedFields as $field) { + if (isset($_POST[$field]) && !empty($_POST[$field])) { + $value = filterRequest($field); + $encryptedValue = $encryptionHelper->encryptData($value); + $fields[] = "`$field` = :$field"; + $params[":$field"] = $encryptedValue; + } +} + +if (!empty($fields)) { + $setClause = implode(", ", $fields); + $sql = "UPDATE `passengers` SET $setClause WHERE `id` = :id"; + $stmt = $con->prepare($sql); + $stmt->execute($params); + + if ($stmt->rowCount() > 0) { + jsonSuccess(null, "Passenger data updated successfully"); + } else { + jsonError("Failed to update passenger data"); + } +} else { + jsonError("No fields to update"); +} +?> +``` + +## File: ride/profile/get.php +``` +prepare($sql); +$stmt->bindParam(':id', $id, PDO::PARAM_STR); +$stmt->execute(); +$result = $stmt->fetch(PDO::FETCH_ASSOC); + +if ($result) { + unset($result['password']); // إخفاء الباسورد + + // فك تشفير الحقول الحساسة + $fieldsToDecrypt = [ + 'phone', 'email', 'gender', 'birthdate', 'site', + 'first_name', 'last_name', 'sosPhone', + 'education', 'employmentType', 'maritalStatus' + ]; + + foreach ($fieldsToDecrypt as $field) { + if (isset($result[$field])) { + $result[$field] = $encryptionHelper->decryptData($result[$field]); + } + } + + echo json_encode([ + "status" => "success", + "data" => $result + ]); +} else { + jsonError("Failed to retrieve passenger data"); +} +?> +``` + +## File: ride/profile/getCaptainProfile.php +``` +prepare($sql); +$stmt->bindParam(':id', $id, PDO::PARAM_STR); +$stmt->execute(); +$result = $stmt->fetch(PDO::FETCH_ASSOC); + +if (!$result) { + jsonError("Failed to retrieve driver data"); + exit; +} + +// فك تشفير حقل birthdate أولاً لحساب العمر +if (!empty($result['birthdate'])) { + $result['birthdate'] = $encryptionHelper->decryptData($result['birthdate']); + + try { + $dob = new DateTime($result['birthdate']); + $today = new DateTime(); + $age = $today->diff($dob)->y; + } catch (Exception $e) { + $age = null; + } +} else { + $age = null; +} +$result['age'] = $age; + +// فك تشفير بقية الحقول +$driverFieldsToDecrypt = [ + 'phone', 'email', 'gender', 'site', + 'first_name', 'last_name' +]; + +foreach ($driverFieldsToDecrypt as $field) { + if (!empty($result[$field])) { + $result[$field] = $encryptionHelper->decryptData($result[$field]); + } +} + +// فك تشفير حقول السيارة +$vehicleFieldsToDecrypt = ['vin', 'car_plate']; +foreach ($vehicleFieldsToDecrypt as $field) { + if (!empty($result[$field])) { + $result[$field] = $encryptionHelper->decryptData($result[$field]); + } +} + +jsonSuccess($result); +?> +``` + +## File: ride/driver_order/add.php +``` +prepare($checkSql); +$checkStmt->execute([$order_id]); + +if ($checkStmt->rowCount() > 0) { + // تحديث السجل إذا كان موجودًا + $updateSql = "UPDATE `driver_orders` SET `driver_id` = ?, `status` = ?, `created_at` = NOW() WHERE `order_id` = ?"; + $updateStmt = $con->prepare($updateSql); + $updateStmt->execute([$driver_id, $status, $order_id]); + + if ($updateStmt->rowCount() > 0) { + jsonSuccess(null, "Driver order data updated successfully"); + } else { + jsonError("Failed to update driver order data"); + } +} else { + // إدخال سجل جديد إذا لم يكن موجودًا + $insertSql = "INSERT INTO `driver_orders` (`driver_id`, `order_id`, `created_at`, `status`) VALUES (?, ?, NOW(), ?)"; + $insertStmt = $con->prepare($insertSql); + $insertStmt->execute([$driver_id, $order_id, $status]); + + if ($insertStmt->rowCount() > 0) { + jsonSuccess(null, "Driver order data saved successfully"); + } else { + jsonError("Failed to save driver order data"); + } +} +?> +``` + +## File: ride/driver_order/update.php +``` +prepare($sql); +$stmt->bindParam(":status", $status); +$stmt->bindParam(":order_id", $order_id); +$stmt->bindParam(":notes", $notes); + +$stmt->execute(); + +// التحقق من النتيجة +if ($stmt->rowCount() > 0) { + jsonSuccess(null, "Driver order data updated successfully"); +} else { + jsonError("Failed to update driver order data"); // أو لم يحدث تغيير في البيانات +} +?> +``` + +## File: ride/driver_order/getOrderCancelStatus.php +``` +prepare($sql); +$stmt->bindParam(":order_id", $order_id, PDO::PARAM_STR); +$stmt->execute(); + +$row = $stmt->fetch(PDO::FETCH_ASSOC); + +if ($row) { + echo json_encode([ + "status" => "success", + "data" => $row + ]); +} else { + echo json_encode([ + "status" => "failure", + "message" => "No driver order data found for the specified order_id" + ]); +} +?> +``` + +## File: ride/driver_order/get.php +``` +prepare($stats_sql); + $stats_stmt->execute([':driver_id' => $driver_id]); + $stats = $stats_stmt->fetch(PDO::FETCH_ASSOC); + + // Calculate the average + if ($stats && $stats['total_rides'] > 0) { + $stats['averageApplied'] = $stats['total_applied'] / $stats['total_rides']; + } else { + $stats['averageApplied'] = 0; + } + + + // 2. Second, get the actual order history + $orders_sql = " + SELECT * FROM driver_orders + WHERE + driver_id = :driver_id + AND MONTH(created_at) = MONTH(CURRENT_DATE()) + AND YEAR(created_at) = YEAR(CURRENT_DATE()) + ORDER BY created_at DESC + "; + $orders_stmt = $con->prepare($orders_sql); + $orders_stmt->execute([':driver_id' => $driver_id]); + $orders = $orders_stmt->fetchAll(PDO::FETCH_ASSOC); + + // 3. Combine the results into one response + + + jsonSuccess($orders); + + +} elseif ($order_id != null) { + // This part remains the same, but let's ensure it's correct + $sql = " + SELECT * FROM driver_orders + WHERE order_id = :order_id + AND MONTH(created_at) = MONTH(CURRENT_DATE()) + AND YEAR(created_at) = YEAR(CURRENT_DATE()) + "; + $stmt = $con->prepare($sql); + $stmt->execute([':order_id' => $order_id]); + $result = $stmt->fetchAll(PDO::FETCH_ASSOC); + + if ($stmt->rowCount() > 0) { + jsonSuccess($result); + } else { + jsonError("No driver order data found for this order_id"); + } + +} else { + jsonError("No driver_id or order_id provided"); +} + +?> +``` + +## File: ride/driver_order/delete.php +``` + +``` + +## File: ride/tips/add.php +``` + 99999999.99) { + jsonError("Invalid tip amount."); + exit(); +} + +// إدراج بيانات البقشيش +$sql = "INSERT INTO `tips` (`driverID`, `passengerID`, `rideID`, `tipAmount`) + VALUES (:driverID, :passengerID, :rideID, :tipAmount)"; + +$stmt = $con->prepare($sql); +$stmt->bindParam(':driverID', $driverID); +$stmt->bindParam(':passengerID', $passengerID); +$stmt->bindParam(':rideID', $rideID); +$stmt->bindParam(':tipAmount', $tipAmount); + +// تنفيذ العملية +if ($stmt->execute() && $stmt->rowCount() > 0) { + jsonSuccess(null, "Tip inserted successfully"); +} else { + jsonError("Failed to save tip information"); +} +?> +``` + +## File: ride/tips/get.php +``` +prepare($sql); +$stmt->bindParam(':driverID', $driverID); +$stmt->bindParam(':passengerID', $passengerID); + +$stmt->execute(); +$data = $stmt->fetchAll(PDO::FETCH_ASSOC); + +// فحص النتائج +if ($data) { + jsonSuccess($data); +} else { + jsonError("No tips records found"); +} +?> +``` + +## File: ride/driver_scam/add.php +``` +prepare($sql); +$stmt->bindParam(":driverID", $driverID); +$stmt->bindParam(":passengerID", $passengerID); +$stmt->bindParam(":rideID", $rideID); +$stmt->bindParam(":isDriverCallPassenger", $isDriverCallPassenger); +$stmt->bindParam(":dateCreated", $dateCreated); + +// تنفيذ الإدخال +$stmt->execute(); + +if ($stmt->rowCount() > 0) { + jsonSuccess(null, "Driver ride scam data saved successfully"); +} else { + jsonError("Failed to save driver ride scam data"); +} +?> +``` + +## File: ride/driver_scam/update.php +``` + +``` + +## File: ride/driver_scam/get.php +``` += CURDATE() + AND driver_ride_scam.dateCreated < DATE_ADD(CURDATE(), INTERVAL 1 DAY) +GROUP BY + DATE(driver_ride_scam.dateCreated) +ORDER BY + date DESC"; + +try { + $stmt = $con->prepare($sql); + $stmt->bindParam(':driverID', $driverID); + $stmt->execute(); + + $rows = $stmt->fetchAll(PDO::FETCH_ASSOC); + + if (!empty($rows)) { + // --- FIX IS HERE --- + // Your Flutter app looks for d['message']. + // We manually create the array with the key "message" to match your app. + echo json_encode(array("status" => "success", "message" => $rows)); + } else { + jsonError("No ride scam record found"); + } + +} catch (PDOException $e) { + jsonError("Database Error: " . $e->getMessage()); +} +?> +``` + +## File: ride/driver_scam/delete.php +``` + +``` + +## File: ride/passengerWallet/add.php +``` +prepare("SELECT * FROM payment_tokens_passenger WHERE token = :token AND isUsed = FALSE"); +$stmt->execute([':token' => $token]); + +$tokenData = $stmt->fetch(); + +if ($tokenData) { + // Insert into passengerWallet securely using prepared statements + $sql = "INSERT INTO `passengerWallet` (`passenger_id`, `balance`) VALUES (:passenger_id, :balance)"; + $stmt = $con->prepare($sql); + $stmt->execute([':passenger_id' => $passenger_id, ':balance' => $balance]); + + if ($stmt->rowCount() > 0) { + // Mark the token as used + $updateTokenStmt = $con->prepare("UPDATE payment_tokens_passenger SET isUsed = TRUE WHERE token = :token"); + $updateTokenStmt->execute([':token' => $token]); + + jsonSuccess(null, "Wallet record created successfully"); + } else { + jsonError("Failed to create wallet record"); + } +} else { + jsonError("Invalid or already used token"); +} +?> +``` + +## File: ride/passengerWallet/update.php +``` + +prepare($sql); +$stmt->execute(); + +if ($stmt->rowCount() > 0) { + // Print a success message + jsonSuccess($message = "Wallet record updated successfully"); +} else { + // Print a failure message + jsonError($message = "Failed to update wallet record"); +} +?> +``` + +## File: ride/passengerWallet/get.php +``` +prepare($sql); +$stmt->execute(); + +if ($stmt->rowCount() > 0) { + // Fetch the record + $row = $stmt->fetchAll(PDO::FETCH_ASSOC); + + jsonSuccess($row); + +} + else{ + // Print a failure message + jsonError($message = "No wallet record found"); +} +?> +``` + +## File: ride/passengerWallet/addPaymentTokenPassenger.php +``` +prepare("INSERT INTO payment_tokens_passenger (token, passengerId, dateCreated, amount) VALUES (?, ?, NOW(), ?)"); + +try { + $stmt->execute([$token, $passengerId, $amount]); + if ($stmt->rowCount() > 0) { + jsonSuccess($token); + } else { + jsonError("Failed to save record"); + } +} catch (PDOException $e) { + jsonError("Database error: " . $e->getMessage()); +} + +// Rest of your code including the generateSecureToken function... + +// Rest of your code including the generateSecureToken function... + +function generateSecureToken($passengerId, $amount, $dateCreated) { + global $secretKey; + // Concatenate the parameters + $data = $passengerId . $amount . $dateCreated; + + // Add the secret key from the environment variable + $data .= $secretKey; + + // Generate a hash + $hash = hash('sha256', $data); + + // Add some randomness + $randomBytes = bin2hex(random_bytes(16)); + + // Combine hash and random bytes + $token = $hash . $randomBytes; + + // Truncate to a reasonable length (e.g., 64 characters) + return substr($token, 0, 64); +} +``` + +## File: ride/passengerWallet/getPassengerWalletArchive.php +``` += DATE_SUB(NOW(), INTERVAL 1 MONTH) +ORDER BY + `passengerWallet`.`id` +DESC"; +$stmt = $con->prepare($sql); +$stmt->execute(); + +if ($stmt->rowCount() > 0) { + // Fetch the record + $row = $stmt->fetchAll(PDO::FETCH_ASSOC); + + jsonSuccess($row); + +} + else{ + // Print a failure message + jsonError($message = "No wallet record found"); +} +?> +``` + +## File: ride/passengerWallet/getWalletByPassenger.php +``` +prepare($sql); +$stmt->execute(); + +if ($stmt->rowCount() > 0) { + // Fetch the record + $row = $stmt->fetchAll(PDO::FETCH_ASSOC); + + jsonSuccess($row); + +} + else{ + // Print a failure message + jsonError($message = "No wallet record found"); +} +?> +``` + +## File: ride/passengerWallet/getAllPassengerTransaction.php +``` +prepare($sql); +$stmt->execute(); + +if ($stmt->rowCount() > 0) { + // Fetch the record + $row = $stmt->fetchAll(PDO::FETCH_ASSOC); + + jsonSuccess($row); + +} + else{ + // Print a failure message + jsonError($message = "No wallet record found"); +} +?> +``` + +## File: ride/passengerWallet/delete.php +``` +prepare($sql); +$stmt->execute(); + +if ($stmt->rowCount() > 0) { + // Print a success message + jsonSuccess($message = "Wallet record deleted successfully"); +} else { + // Print a failure message + jsonError($message = "Failed to delete wallet record"); +} +?> + +``` + +## File: ride/driver_behavior/get_driver_behavior.php +``` +prepare($sql_average); + $stmt_avg->bindParam(':driver_id', $driver_id); + $stmt_avg->execute(); + $average = $stmt_avg->fetch(PDO::FETCH_ASSOC); + + // ✅ ثانياً: جلب آخر 10 رحلات + $sql_last10 = "SELECT id, trip_id, max_speed, avg_speed, hard_brakes, total_distance, behavior_score, created_at + FROM driver_behavior + WHERE driver_id = :driver_id + ORDER BY id DESC + LIMIT 10"; + + $stmt_last10 = $con->prepare($sql_last10); + $stmt_last10->bindParam(':driver_id', $driver_id); + $stmt_last10->execute(); + $last10 = $stmt_last10->fetchAll(PDO::FETCH_ASSOC); + + // ✅ تجهيز الاستجابة النهائية + $response = [ + 'overall_behavior_score' => $average['overall_behavior_score'], + 'last_10_trips' => $last10 + ]; + + jsonSuccess($response); + +} catch (PDOException $e) { + jsonError("Database error: " . $e->getMessage()); +} +?> +``` + +## File: ride/invitor/add.php +``` +prepare("SELECT COUNT(*) FROM invites WHERE inviteCode = ?"); + $stmt->execute([$code]); + + if ($stmt->fetchColumn() == 0) { + return $code; + } + } +} + +$driverId = filterRequest("driverId"); +$inviterDriverPhone = filterRequest("inviterDriverPhone"); + +// 🔐 تشفير رقم الهاتف +$inviterDriverPhoneEncrypted = $encryptionHelper->encryptData($inviterDriverPhone); + +// تحقق من وجود رقم الهاتف مسبقًا +$checkSql = "SELECT `id`, `inviteCode`, `isInstall` FROM `invites` WHERE `inviterDriverPhone` = :inviterDriverPhone"; +$checkStmt = $con->prepare($checkSql); +$checkStmt->bindParam(':inviterDriverPhone', $inviterDriverPhoneEncrypted, PDO::PARAM_STR); +$checkStmt->execute(); + +if ($checkStmt->rowCount() > 0) { + $existingInvite = $checkStmt->fetch(PDO::FETCH_ASSOC); + + if ($existingInvite['isInstall'] == 1) { + jsonError($existingInvite['inviteCode']); + } else { + // تحديث الدعوة الحالية + $updateSql = "UPDATE `invites` SET `driverId` = :driverId, `expirationTime` = :expirationTime, `createdAt` = NOW() WHERE `id` = :id"; + $updateStmt = $con->prepare($updateSql); + $expirationTime = date('Y-m-d H:i:s', strtotime('+1 hour')); + $updateStmt->bindParam(':driverId', $driverId, PDO::PARAM_INT); + $updateStmt->bindParam(':expirationTime', $expirationTime); + $updateStmt->bindParam(':id', $existingInvite['id'], PDO::PARAM_INT); + + try { + $updateStmt->execute(); + printSuccess([ + "message" => "Invite updated successfully", + "inviteId" => $existingInvite['id'], + "inviteCode" => $existingInvite['inviteCode'], + "expirationTime" => $expirationTime + ]); + } catch (PDOException $e) { + jsonError("Database error: " . $e->getMessage()); + } + } + +} else { + // إنشاء دعوة جديدة + $inviteCode = generateUniqueCode($con); + $expirationTime = date('Y-m-d H:i:s', strtotime('+1 hour')); + + $sql = "INSERT INTO `invites` (`driverId`, `inviterDriverPhone`, `inviteCode`, `expirationTime`, `createdAt`, `isInstall`) + VALUES (:driverId, :inviterDriverPhone, :inviteCode, :expirationTime, NOW(), 0)"; + $stmt = $con->prepare($sql); + $stmt->bindParam(':driverId', $driverId, PDO::PARAM_INT); + $stmt->bindParam(':inviterDriverPhone', $inviterDriverPhoneEncrypted, PDO::PARAM_STR); + $stmt->bindParam(':inviteCode', $inviteCode); + $stmt->bindParam(':expirationTime', $expirationTime); + + try { + $stmt->execute(); + if ($stmt->rowCount() > 0) { + $insertedID = $con->lastInsertId(); + printSuccess([ + "message" => "Invite created successfully", + "inviteId" => $insertedID, + "inviteCode" => $inviteCode, + "expirationTime" => $expirationTime + ]); + } else { + jsonError("Failed to save invite data"); + } + } catch (PDOException $e) { + jsonError("Database error: " . $e->getMessage()); + } +} +?> +``` + +## File: ride/invitor/update.php +``` +prepare($sql); +$stmt->bindParam(':id', $id, PDO::PARAM_INT); +$stmt->execute(); + +if ($stmt->rowCount() > 0) { + jsonSuccess(null, "Record updated successfully."); +} else { + jsonError("No records were updated"); +} +?> +``` + +## File: ride/invitor/getDriverInvitationToPassengers.php +``` +prepare($sql); +$stmt->bindParam(':driverId', $driverId, PDO::PARAM_INT); +$stmt->execute(); + +if ($stmt->rowCount() > 0) { + $rows = $stmt->fetchAll(PDO::FETCH_ASSOC); + + // 🔓 فك التشفير للحقول المطلوبة + foreach ($rows as &$row) { + $row['inviterPassengerPhone'] = $encryptionHelper->decryptData($row['inviterPassengerPhone']); + $row['passengerName'] = $encryptionHelper->decryptData($row['passengerName']); + } + + jsonSuccess($rows); +} else { + jsonError("No records found."); +} +?> +``` + +## File: ride/invitor/get.php +``` +prepare($sql); +$stmt->bindParam(':driverId', $driverId, PDO::PARAM_INT); +$stmt->execute(); + +if ($stmt->rowCount() > 0) { + $rows = $stmt->fetchAll(PDO::FETCH_ASSOC); + + // 🔓 فك التشفير للحقول المطلوبة + foreach ($rows as &$row) { + $row['inviterDriverPhone'] = $encryptionHelper->decryptData($row['inviterDriverPhone']); + $row['invitorPhone'] = $encryptionHelper->decryptData($row['invitorPhone']); + $row['invitorName'] = $encryptionHelper->decryptData($row['invitorName']); + } + + jsonSuccess($rows); +} else { + jsonError("No records found."); +} +?> +``` + +## File: ride/invitor/updatePassengersInvitation.php +``` +encryptData($inviteCode); + +try { + $checkSql = "SELECT `id`, `expirationTime` FROM `invitesToPassengers` + WHERE `inviteCode` = :inviteCode + AND `isInstall` = 0 + AND `isGiftToken` = 0"; + + $checkStmt = $con->prepare($checkSql); + $checkStmt->bindParam(':inviteCode', $inviteCodeEncrypted); + $checkStmt->execute(); + + if ($checkStmt->rowCount() > 0) { + $invite = $checkStmt->fetch(PDO::FETCH_ASSOC); + + $updateSql = "UPDATE `invitesToPassengers` + SET `isInstall` = 1, `passengerID` = :passengerID + WHERE `id` = :id"; + + $updateStmt = $con->prepare($updateSql); + $updateStmt->bindParam(':id', $invite['id'], PDO::PARAM_INT); + $updateStmt->bindParam(':passengerID', $passengerID); + $updateStmt->execute(); + + if ($updateStmt->rowCount() > 0) { + jsonSuccess(null, "Invite code successfully used and marked as installed."); + } else { + jsonError("Invite found but update failed."); + } + } else { + jsonError("Invalid invite code, already used, or marked as gift."); + } +} catch (PDOException $e) { + jsonError("Database error: " . $e->getMessage()); +} +?> +``` + +## File: ride/invitor/updatePassengerGift.php +``` +prepare($sql); +$stmt->bindParam(':id', $id, PDO::PARAM_INT); +$stmt->execute(); + +if ($stmt->rowCount() > 0) { + jsonSuccess(null, "Record updated successfully."); +} else { + jsonError("No records were updated"); +} +?> +``` + +## File: ride/invitor/addInvitationPassenger.php +``` +prepare("SELECT COUNT(*) FROM invitesToPassengers WHERE inviteCode = ?"); + $stmt->execute([$code]); + + if ($stmt->fetchColumn() == 0) { + return $code; + } + } +} + +$driverId = filterRequest("driverId"); +$inviterPassengerPhone = filterRequest("inviterPassengerPhone"); + +// 🔐 تشفير رقم الهاتف +$inviterPassengerPhoneEncrypted = $encryptionHelper->encryptData($inviterPassengerPhone); + +// التحقق من وجود الرقم مسبقًا +$checkSql = "SELECT `id`, `inviteCode`, `isInstall`, `isGiftToken` FROM `invitesToPassengers` WHERE `inviterPassengerPhone` = :inviterPassengerPhone"; +$checkStmt = $con->prepare($checkSql); +$checkStmt->bindParam(':inviterPassengerPhone', $inviterPassengerPhoneEncrypted, PDO::PARAM_STR); +$checkStmt->execute(); + +if ($checkStmt->rowCount() > 0) { + $existingInvite = $checkStmt->fetch(PDO::FETCH_ASSOC); + + if ($existingInvite['isInstall'] == 1 || $existingInvite['isGiftToken'] == 1) { + printFailure([ + "message" => "Invite code already used or gift token already applied", + "inviteCode" => $existingInvite['inviteCode'] + ]); + } else { + // تحديث الدعوة + $updateSql = "UPDATE `invitesToPassengers` SET `driverId` = :driverId, `expirationTime` = :expirationTime, `createdAt` = NOW() WHERE `id` = :id"; + $updateStmt = $con->prepare($updateSql); + $expirationTime = date('Y-m-d H:i:s', strtotime('+1 hour')); + $updateStmt->bindParam(':driverId', $driverId, PDO::PARAM_INT); + $updateStmt->bindParam(':expirationTime', $expirationTime); + $updateStmt->bindParam(':id', $existingInvite['id'], PDO::PARAM_INT); + + try { + $updateStmt->execute(); + printSuccess([ + "message" => "Invite updated successfully", + "inviteId" => $existingInvite['id'], + "inviteCode" => $existingInvite['inviteCode'], + "expirationTime" => $expirationTime + ]); + } catch (PDOException $e) { + jsonError("Database error: " . $e->getMessage()); + } + } +} else { + // إنشاء دعوة جديدة + $inviteCode = generateUniqueCode($con); + $expirationTime = date('Y-m-d H:i:s', strtotime('+4 hour')); + + $sql = "INSERT INTO `invitesToPassengers` + (`driverId`, `inviterPassengerPhone`, `inviteCode`, `expirationTime`, `createdAt`, `isInstall`, `isGiftToken`) + VALUES + (:driverId, :inviterPassengerPhone, :inviteCode, :expirationTime, NOW(), 0, 0)"; + + $stmt = $con->prepare($sql); + $stmt->bindParam(':driverId', $driverId, PDO::PARAM_INT); + $stmt->bindParam(':inviterPassengerPhone', $inviterPassengerPhoneEncrypted, PDO::PARAM_STR); + $stmt->bindParam(':inviteCode', $inviteCode); + $stmt->bindParam(':expirationTime', $expirationTime); + + try { + $stmt->execute(); + if ($stmt->rowCount() > 0) { + $insertedID = $con->lastInsertId(); + printSuccess([ + "message" => "Invite created successfully", + "inviteId" => $insertedID, + "inviteCode" => $inviteCode, + "expirationTime" => $expirationTime + ]); + } else { + jsonError("Failed to save invite data"); + } + } catch (PDOException $e) { + jsonError("Database error: " . $e->getMessage()); + } +} +?> +``` + +## File: ride/invitor/updateInvitationCodeFromRegister.php +``` + NOW()"; + + $checkStmt = $con->prepare($checkSql); + $checkStmt->bindParam(':inviteCode', $inviteCode); + $checkStmt->execute(); + + if ($checkStmt->rowCount() > 0) { + $invite = $checkStmt->fetch(PDO::FETCH_ASSOC); + + $updateSql = "UPDATE `invites` SET `isInstall` = 1 WHERE `id` = :id"; + $updateStmt = $con->prepare($updateSql); + $updateStmt->bindParam(':id', $invite['id'], PDO::PARAM_INT); + $updateStmt->execute(); + + if ($updateStmt->rowCount() > 0) { + printSuccess([ + "message" => "Invite code successfully used and marked as installed.", + "driverId" => $invite['driverId'], + "expirationTime" => $invite['expirationTime'] + ]); + } else { + jsonError("Failed to update the invite record."); + } + } else { + jsonError("Invalid invite code, already installed, or expired."); + } +} catch (PDOException $e) { + jsonError("Database error: " . $e->getMessage()); +} +?> +``` + +## File: ride/invitor/updateDriverInvitationDirectly.php +``` +encryptData($inviterDriverPhone); + + // ✅ الآن الاستعلام نظيف وطبيعي جداً لأن قاعدة البيانات تم إصلاحها + $fetchSql = "SELECT + i.`id`, + i.`driverId`, + i.`inviterDriverPhone`, + i.`createdAt`, + i.`inviteCode`, + i.`isInstall`, + i.`isGiftToken`, + i.`expirationTime`, + dt.token + FROM `invites` i + LEFT JOIN `driverToken` dt ON dt.captain_id = i.driverId + WHERE i.`inviterDriverPhone` = :inviterDriverPhone + AND i.`expirationTime` > NOW()"; + + $fetchStmt = $con->prepare($fetchSql); + $fetchStmt->bindParam(':inviterDriverPhone', $inviterDriverPhoneEncrypted); + $fetchStmt->execute(); + + if ($fetchStmt->rowCount() > 0) { + $invite = $fetchStmt->fetch(PDO::FETCH_ASSOC); + + // فك التشفير + $invite['inviterDriverPhone'] = $encryptionHelper->decryptData($invite['inviterDriverPhone']); + if (!empty($invite['token'])) { + $invite['token'] = $encryptionHelper->decryptData($invite['token']); + } + + // التحديث + $updateSql = "UPDATE `invites` SET `isInstall` = 1 WHERE `id` = :id"; + $updateStmt = $con->prepare($updateSql); + $updateStmt->bindParam(':id', $invite['id'], PDO::PARAM_INT); + $updateStmt->execute(); + + printSuccess("Record found and updated successfully.", $invite); + } else { + jsonError("No records found."); + } + +} catch (PDOException $e) { + error_log("DB Error: " . $e->getMessage()); + jsonError("Database error: " . $e->getMessage()); +} +?> +``` + +## File: ride/seferWallet/add.php +``` +prepare($sql); +$stmt->bindParam(':driver_id', $driver_id, PDO::PARAM_STR); +$stmt->bindParam(':passenger_id', $passenger_id, PDO::PARAM_STR); +$stmt->bindParam(':amount', $amount, PDO::PARAM_STR); +$stmt->bindParam(':payment_method', $payment_method, PDO::PARAM_STR); +$stmt->bindParam(':token', $token, PDO::PARAM_STR); + +if ($stmt->execute()) { + // Print a success message + jsonSuccess($message = "Wallet data saved successfully"); +} else { + // Print a failure message + jsonError($message = "Failed to save wallet data"); +} +?> +``` + +## File: ride/seferWallet/get.php +``` +prepare($sql); +$stmt->execute(); +$result = $stmt->fetchAll(PDO::FETCH_ASSOC); + +if ($stmt->rowCount() > 0) { + // Print the retrieved data + // echo json_encode($result); + jsonSuccess($data = $result); +} else { + // Print a failure message + + jsonError($message = "No driver order data found"); +} + +?> +``` + +## File: ride/notificationCaptain/add.php +``` +prepare($sql); +$stmt->execute([ + ':driverID' => $driverID, + ':title' => $title, + ':body' => $body, + ':isPin' => $isPin +]); + +if ($stmt->rowCount() > 0) { + jsonSuccess(null, "Notification data saved successfully"); +} else { + jsonError("Failed to save notification data"); +} + +?> +``` + +## File: ride/notificationCaptain/update.php +``` + $id]; + +if (isset($_POST["driverID"])) { + $columnValues[] = "`driverID` = :driverID"; + $params[':driverID'] = filterRequest("driverID"); +} + +if (isset($_POST["title"])) { + $columnValues[] = "`title` = :title"; + $params[':title'] = filterRequest("title"); +} + +if (isset($_POST["body"])) { + $columnValues[] = "`body` = :body"; + $params[':body'] = filterRequest("body"); +} + +if (isset($_POST["isShown"])) { + $columnValues[] = "`isShown` = :isShown"; + $params[':isShown'] = filterRequest("isShown"); +} + +if (isset($_POST["dateCreated"])) { + $columnValues[] = "`dateCreated` = :dateCreated"; + $params[':dateCreated'] = filterRequest("dateCreated"); +} + +// Check if there are fields to update +if (empty($columnValues)) { + jsonError("No fields to update"); + exit; +} + +$setClause = implode(", ", $columnValues); +$sql = "UPDATE `notificationCaptain` SET $setClause WHERE `id` = :id"; + +$stmt = $con->prepare($sql); +$stmt->execute($params); + +if ($stmt->rowCount() > 0) { + jsonSuccess(null, "Notification data updated successfully"); +} else { + jsonError("Failed to update notification data"); +} +?> +``` + +## File: ride/notificationCaptain/get.php +``` + DATE_SUB(NOW(), INTERVAL 2 DAY) + ORDER BY `dateCreated` DESC + LIMIT 10"; + +$stmt = $con->prepare($sql); +$stmt->bindParam(':driverID', $driverID, PDO::PARAM_STR); +$stmt->execute(); + +$notifications = $stmt->fetchAll(PDO::FETCH_ASSOC); + +if ($notifications) { + jsonSuccess($notifications); +} else { + jsonError("No notification data found"); +} +?> +``` + +## File: ride/notificationCaptain/addWaitingRide.php +``` +prepare($sql); + $stmt->execute($params); + + if ($stmt->rowCount() > 0) { + jsonSuccess(null, "Operation completed successfully"); + } else { + jsonSuccess(null, "No changes made"); + } + +} catch (PDOException $e) { + error_log("Database error in addWaitingRide: " . $e->getMessage()); + jsonError("Database error: " . $e->getMessage()); +} catch (Exception $e) { + jsonError("Error: " . $e->getMessage()); +} +?> + +``` + +## File: ride/notificationCaptain/deleteAvailableRide.php +``` +prepare($sql); + $stmt->bindParam(':id', $id, PDO::PARAM_INT); + $stmt->execute(); + + // Check the result and print the appropriate message + if ($stmt->rowCount() > 0) { + jsonSuccess(null, "Record with ID $id deleted successfully."); + } else { + jsonError("No record found with ID $id."); + } +} catch (PDOException $e) { + jsonError("Database error: " . $e->getMessage()); +} catch (Exception $e) { + jsonError("Error: " . $e->getMessage()); +} +?> +``` + +## File: ride/notificationCaptain/delete.php +``` +prepare($sql); +$stmt->bindParam(':id', $notificationID, PDO::PARAM_INT); +$stmt->execute(); + +if ($stmt->rowCount() > 0) { + jsonSuccess(null, "Notification data deleted successfully"); +} else { + jsonError("Failed to delete notification data"); +} + +?> +``` + +## File: ride/notificationCaptain/getRideWaiting.php +``` + 'get_nearby_ride_ids', + 'lat' => $lat, + 'lng' => $lng, + 'radius' => $radius + ]; + + $ch = curl_init(); + curl_setopt($ch, CURLOPT_URL, $locationServerUrl); + curl_setopt($ch, CURLOPT_POST, 1); + curl_setopt($ch, CURLOPT_POSTFIELDS, http_build_query($postData)); + curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); + curl_setopt($ch, CURLOPT_TIMEOUT_MS, 500); + curl_setopt($ch, CURLOPT_HTTPHEADER, ["x-internal-key: $INTERNAL_KEY"]); + + $response = curl_exec($ch); + $httpCode = curl_getinfo($ch, CURLINFO_HTTP_CODE); + curl_close($ch); + + if ($httpCode == 200 && $response) { + $jsonResults = json_decode($response, true); + if (is_array($jsonResults) && !empty($jsonResults)) { + foreach ($jsonResults as $res) { + $rideIds[] = $res[0]; + $redisResultsMap[$res[0]] = $res[1]; + } + } + } +} catch (Exception $e) { + // نتابع للخطة ب +} + +// 2. جلب البيانات (إما عبر IDs أو بحث مباشر) +try { + if (!empty($rideIds)) { + // --- الحالة أ: الريدز وجد رحلات --- + $placeholders = implode(',', array_fill(0, count($rideIds), '?')); + + $sql = " + SELECT + wr.id, wr.start_location AS startName, wr.end_location AS endName, + wr.date, wr.time, wr.price, wr.passenger_id, wr.status, wr.carType, + wr.passengerRate, wr.created_at, wr.price_for_passenger, + wr.distance, wr.duration, wr.start_lat, wr.start_lng, + wr.end_lat, wr.end_lng, wr.payment_method, wr.passenger_wallet, + p.email, p.first_name, p.phone, p.id AS passengerId, t.token AS passengerToken + FROM waitingRides wr + INNER JOIN passengers p ON p.id = wr.passenger_id + LEFT JOIN tokens t ON t.passengerID = wr.passenger_id + LEFT JOIN passengerWallet pw ON pw.passenger_id = wr.passenger_id + WHERE wr.id IN ($placeholders) AND wr.status IN ('wait', 'waiting') + "; + + $stmt = $con->prepare($sql); + $stmt->execute($rideIds); + $waitingRides = $stmt->fetchAll(PDO::FETCH_ASSOC); + + } else { + // --- الحالة ب: بحث مباشر MySQL (Fallback) --- + // 🔥 التصحيح هنا: استخدام أسماء فريدة (:lat1, :lat2) لتجنب خطأ التكرار + + $haversine = "( 6371 * acos( cos( radians(:lat1) ) * cos( radians( wr.start_lat ) ) * cos( radians( wr.start_lng ) - radians(:lng) ) + sin( radians(:lat2) ) * sin( radians( wr.start_lat ) ) ) )"; + + $sql = " + SELECT + wr.id, wr.start_location AS startName, wr.end_location AS endName, + wr.date, wr.time, wr.price, wr.passenger_id, wr.status, wr.carType, + wr.passengerRate, wr.created_at, wr.price_for_passenger, + wr.distance, wr.duration, wr.start_lat, wr.start_lng, + wr.end_lat, wr.end_lng, wr.payment_method, wr.passenger_wallet, + p.email, p.first_name, p.phone, p.id AS passengerId, t.token AS passengerToken, + {$haversine} AS driver_distance_km + FROM waitingRides wr + INNER JOIN passengers p ON p.id = wr.passenger_id + LEFT JOIN tokens t ON t.passengerID = wr.passenger_id + LEFT JOIN passengerWallet pw ON pw.passenger_id = wr.passenger_id + WHERE + wr.status IN ('wait', 'waiting') + AND wr.created_at >= DATE_SUB(NOW(), INTERVAL 24 HOUR) + AND wr.start_lat IS NOT NULL + HAVING driver_distance_km <= :radius + ORDER BY driver_distance_km ASC + LIMIT 50 + "; + + $stmt = $con->prepare($sql); + + // نمرر القيمة مرتين للمفتاحين المختلفين + $stmt->execute([ + ':lat1' => $lat, + ':lng' => $lng, + ':lat2' => $lat, // تكرار القيمة للمتغير الثاني + ':radius' => $radius + ]); + + $waitingRides = $stmt->fetchAll(PDO::FETCH_ASSOC); + } + + // 3. التنسيق + foreach ($waitingRides as $ride) { + $ride['phone'] = $encryptionHelper->decryptData($ride['phone'] ?? ''); + $ride['first_name'] = $encryptionHelper->decryptData($ride['first_name'] ?? ''); + $ride['email'] = $encryptionHelper->decryptData($ride['email'] ?? ''); + + $ride['start_location'] = $ride['start_lat'] . ',' . $ride['start_lng']; + $ride['end_location'] = (!empty($ride['end_lat'])) + ? $ride['end_lat'] . ',' . $ride['end_lng'] + : $ride['endName']; + + $ride['id'] = (string)$ride['id']; + + if (isset($ride['driver_distance_km'])) { + $ride['driver_distance_km'] = number_format((float)$ride['driver_distance_km'], 1); + } elseif (isset($redisResultsMap[$ride['id']])) { + $ride['driver_distance_km'] = number_format((float)$redisResultsMap[$ride['id']], 1); + } else { + $ride['driver_distance_km'] = "0.0"; + } + + $finalRides[] = $ride; + } + + usort($finalRides, function($a, $b) { + return $a['driver_distance_km'] <=> $b['driver_distance_km']; + }); + + jsonSuccess($finalRides); + +} catch (PDOException $e) { + error_log("DB Error getRideWaiting: " . $e->getMessage()); + jsonError("Database error"); +} +?> +``` + +## File: ride/notificationCaptain/updateWaitingTrip.php +``` + $id]; + +$possibleFields = [ + 'start_location', 'end_location', 'date', 'time', 'price', + 'passenger_id', 'status', 'carType', 'passengerRate', + 'price_for_passenger', 'distance', 'duration' +]; + +foreach ($possibleFields as $field) { + if (isset($_POST[$field])) { + $value = filterRequest($field); + $fields[] = "`$field` = :$field"; + $params[":$field"] = $value; + } +} + +if (empty($fields)) { + jsonError("No fields provided for update"); + exit; +} + +$setClause = implode(", ", $fields); +$sql = "UPDATE `waitingRides` SET $setClause WHERE `id` = :id"; + +$stmt = $con->prepare($sql); +$stmt->execute($params); + +if ($stmt->rowCount() > 0) { + jsonSuccess(null, "Waiting ride data updated successfully"); +} else { + jsonError("Failed to update waiting ride data"); +} +?> +``` + +## File: ride/overLay/add.php +``` +prepare($sql); + + // --- التعديل الرئيسي هنا في bindValue --- + $stmt->bindValue(':rideId', $data['rideId']); + $stmt->bindValue(':driver_id', $data['driver_id']); + $stmt->bindValue(':passengerId', $data['passengerId']); + + // Bind the locations as simple strings + $stmt->bindValue(':passengerLocation', $data['passengerLocation']); + $stmt->bindValue(':passengerDestination', $data['passengerDestination']); + + // باقي الـ bindValue تبقى كما هي + $stmt->bindValue(':Duration', intval($data['Duration']), PDO::PARAM_INT); + $stmt->bindValue(':DurationToPassenger', intval($data['DurationToPassenger']), PDO::PARAM_INT); + $stmt->bindValue(':durationOfRideValue', intval($data['durationOfRideValue']), PDO::PARAM_INT); + $stmt->bindValue(':Distance', (float)$data['Distance']); + $stmt->bindValue(':totalCost', (float)$data['totalCost']); + $stmt->bindValue(':paymentAmount', (float)$data['paymentAmount']); + $stmt->bindValue(':paymentMethod', $data['paymentMethod']); + $stmt->bindValue(':WalletChecked', $data['WalletChecked'] === 'true' ? 1 : 0, PDO::PARAM_INT); + $stmt->bindValue(':isHaveSteps', !empty($data['isHaveSteps']) ? 1 : 0, PDO::PARAM_INT); + $stmt->bindValue(':step0', $data['step0']); + $stmt->bindValue(':step1', $data['step1']); + $stmt->bindValue(':step2', $data['step2']); + $stmt->bindValue(':step3', $data['step3']); + $stmt->bindValue(':step4', $data['step4']); + $stmt->bindValue(':passengerWalletBurc', (float)$data['passengerWalletBurc']); + $stmt->bindValue(':tokenPassenger', $data['tokenPassenger']); + $stmt->bindValue(':name', $data['name']); + $stmt->bindValue(':phone', $data['phone']); + $stmt->bindValue(':email', $data['email']); + $stmt->bindValue(':startNameLocation', $data['startNameLocation']); + $stmt->bindValue(':endNameLocation', $data['endNameLocation']); + $stmt->bindValue(':carType', $data['carType']); + $stmt->bindValue(':kazan', (float)$data['kazan']); + $stmt->bindValue(':direction', $data['direction']); + $stmt->bindValue(':timeOfOrder', $data['timeOfOrder']); + $stmt->bindValue(':totalPassenger', intval($data['totalPassenger']), PDO::PARAM_INT); + + log_message("SQL statement prepared successfully. Attempting to execute..."); + + if ($stmt->execute()) { + log_message("SUCCESS: Database insert was successful for rideId: " . $data['rideId']); + jsonSuccess(null, "نجحت الإضافة"); + } else { + $errorInfo = $stmt->errorInfo(); + $error_msg = "FAILURE: Database insert failed. PDO Error: " . implode(" | ", $errorInfo); + log_message($error_msg); + jsonError("failure"); + } +} catch (Exception $e) { + $error_msg = "EXCEPTION: An unexpected error occurred: " . $e->getMessage(); + log_message($error_msg); + jsonError("failure"); +} + +?> +``` + +## File: ride/overLay/deletArgumets.php +``` +prepare($sql); +$stmt->bindParam(':driver_id', $driver_id); +$stmt->execute(); + +// Check if any rows were actually deleted +$count = $stmt->rowCount(); + +if ($count > 0) { + jsonSuccess(null, "Record deleted successfully"); +} else { + // Failure occurs if no record exists OR if the record is older than 2 minutes + jsonError('No data found to delete (or time limit exceeded)'); +} +?> +``` + +## File: ride/overLay/get.php +``` += NOW() - INTERVAL 2 MINUTE +ORDER BY + r.created_at DESC +LIMIT 1; +"; + +$stmt = $con->prepare($sql); +$stmt->bindParam(':driver_id', $driver_id, PDO::PARAM_INT); +$stmt->execute(); + +$row = $stmt->fetch(PDO::FETCH_ASSOC); + +// 3) إرجاع النتيجة أو رسالة خطأ +if ($row) { + jsonSuccess($row); +} else { + jsonError("Ride not found."); +} +``` + +## File: ride/overLay/_log.txt +``` +[2025-06-20 17:42:27] --- New Request Received --- +[2025-06-20 17:42:27] Incoming POST data: {"driver_id":"109270481246447459618","status":"Apply","passengerLocation":"32.1117875,36.0669891","passengerDestination":"32.0798703,36.0749472","Duration":"528","totalCost":"6.99","Distance":"5.64","name":"hamza","phone":"+201010101010","email":"hamzaayedflutter@gmail.com","WalletChecked":"true","tokenPassenger":"e4QWqe7K607luM7qUMOPCL:APA91bFjX4XBM4I5COJl9fyxCTKJ1ZQpT3vzY7iEbOTuT4uo0-OSCAt5zgVhlhw4aC33s-VhyucDnP1tQGFd9svaazQ8A_SKgolPk3owzug8dCsiXoPeJ0k","direction":"https:\/\/maps.googleapis.com\/maps\/api\/staticmap?size=600x150&maptype=roadmap&markers=color:green%7Clabel:S%7C32.1117875%2C36.0669891&markers=color:red%7Clabel:D%7C32.0798703%2C36.0749472&path=color:0x007bff%7Cweight:5%7C32.1117875%2C36.0669891%7C32.0798703%2C36.0749472&key=AIzaSyCyfwRXTwSTLOFQSQgN5p7QZgGJVZnEKq0","DurationToPassenger":"1","rideId":"1292","passengerId":"113172279072358305645","durationOfRideValue":"528","paymentAmount":"33.78","paymentMethod":"visa","isHaveSteps":"startEnd","step0":"32.09571771505668,36.06855209916831","step1":"","step2":"","step3":"","step4":"","passengerWalletBurc":"6.99","carType":"Speed","kazan":"8","startNameLocation":"4368+PPP\u060c \u0627\u0644\u0633\u062e\u0646\u0629\u060c \u0627\u0644\u0623\u0631\u062f\u0646","endNameLocation":"33HG+R6R\u060c \u0627\u0644\u0632\u0631\u0642\u0627\u0621\u060c \u0627\u0644\u0623\u0631\u062f\u0646","timeOfOrder":"2025-06-20T17:42:26.285449","totalPassenger":"33.78"} +[2025-06-20 17:42:27] Critical error: Missing required fields (rideId, driverId, or locations). +[2025-06-20 17:45:59] --- New Request Received --- +[2025-06-20 17:45:59] Incoming POST data: {"driver_id":"109270481246447459618","status":"Apply","passengerLocation":"32.1117875,36.0669891","passengerDestination":"32.0798703,36.0749472","Duration":"528","totalCost":"6.99","Distance":"5.64","name":"hamza","phone":"+201010101010","email":"hamzaayedflutter@gmail.com","WalletChecked":"true","tokenPassenger":"e4QWqe7K607luM7qUMOPCL:APA91bFjX4XBM4I5COJl9fyxCTKJ1ZQpT3vzY7iEbOTuT4uo0-OSCAt5zgVhlhw4aC33s-VhyucDnP1tQGFd9svaazQ8A_SKgolPk3owzug8dCsiXoPeJ0k","direction":"https:\/\/maps.googleapis.com\/maps\/api\/staticmap?size=600x150&maptype=roadmap&markers=color:green%7Clabel:S%7C32.1117875%2C36.0669891&markers=color:red%7Clabel:D%7C32.0798703%2C36.0749472&path=color:0x007bff%7Cweight:5%7C32.1117875%2C36.0669891%7C32.0798703%2C36.0749472&key=AIzaSyCyfwRXTwSTLOFQSQgN5p7QZgGJVZnEKq0","DurationToPassenger":"3","rideId":"1293","passengerId":"113172279072358305645","durationOfRideValue":"528","paymentAmount":"33.78","paymentMethod":"visa","isHaveSteps":"startEnd","step0":"32.09571771505668,36.06855209916831","step1":"","step2":"","step3":"","step4":"","passengerWalletBurc":"6.99","carType":"Speed","kazan":"8","startNameLocation":"4368+PPP\u060c \u0627\u0644\u0633\u062e\u0646\u0629\u060c \u0627\u0644\u0623\u0631\u062f\u0646","endNameLocation":"33HG+R6R\u060c \u0627\u0644\u0632\u0631\u0642\u0627\u0621\u060c \u0627\u0644\u0623\u0631\u062f\u0646","timeOfOrder":"2025-06-20T17:45:58.817633","totalPassenger":"33.78"} +[2025-06-20 17:45:59] Critical error: Missing required fields (rideId, driverId, or locations). +[2025-06-20 17:47:00] --- New Request Received --- +[2025-06-20 17:47:00] Incoming POST data: {"driver_id":"109270481246447459618","status":"Apply","passengerLocation":"32.1117875,36.0669891","passengerDestination":"32.1364001,36.0707479","Duration":"434","totalCost":"5.42","Distance":"4.38","name":"hamza","phone":"+201010101010","email":"hamzaayedflutter@gmail.com","WalletChecked":"true","tokenPassenger":"e4QWqe7K607luM7qUMOPCL:APA91bFjX4XBM4I5COJl9fyxCTKJ1ZQpT3vzY7iEbOTuT4uo0-OSCAt5zgVhlhw4aC33s-VhyucDnP1tQGFd9svaazQ8A_SKgolPk3owzug8dCsiXoPeJ0k","direction":"https:\/\/maps.googleapis.com\/maps\/api\/staticmap?size=600x150&maptype=roadmap&markers=color:green%7Clabel:S%7C32.1117875%2C36.0669891&markers=color:red%7Clabel:D%7C32.1364001%2C36.0707479&path=color:0x007bff%7Cweight:5%7C32.1117875%2C36.0669891%7C32.1364001%2C36.0707479&key=AIzaSyCyfwRXTwSTLOFQSQgN5p7QZgGJVZnEKq0","DurationToPassenger":"2","rideId":"1294","passengerId":"113172279072358305645","durationOfRideValue":"434","paymentAmount":"27.82","paymentMethod":"visa","isHaveSteps":"startEnd","step0":"32.12404505187645,36.06566168367863","step1":"","step2":"","step3":"","step4":"","passengerWalletBurc":"5.42","carType":"Speed","kazan":"8","startNameLocation":"4368+PPP\u060c \u0627\u0644\u0633\u062e\u0646\u0629\u060c \u0627\u0644\u0623\u0631\u062f\u0646","endNameLocation":"43PC+C4G\u060c \u0627\u0644\u0633\u062e\u0646\u0629\u060c \u0627\u0644\u0623\u0631\u062f\u0646","timeOfOrder":"2025-06-20T17:46:59.188875","totalPassenger":"27.82"} +[2025-06-20 17:47:00] Parsed Locations: passenger_lat=32.1117875, passenger_lng=36.0669891 | destination_lat=32.1364001, destination_lng=36.0707479 +[2025-06-20 17:47:00] SQL statement prepared successfully. Attempting to execute... +[2025-06-20 17:47:00] SUCCESS: Database insert was successful for rideId: 1294 +[2025-06-20 17:49:18] --- New Request Received --- +[2025-06-20 17:49:18] Incoming POST data: {"driver_id":"109270481246447459618","status":"Apply","passengerLocation":"32.1117875,36.0669891","passengerDestination":"32.0798703,36.0749472","Duration":"528","totalCost":"6.99","Distance":"5.64","name":"hamza","phone":"+201010101010","email":"hamzaayedflutter@gmail.com","WalletChecked":"true","tokenPassenger":"e4QWqe7K607luM7qUMOPCL:APA91bFjX4XBM4I5COJl9fyxCTKJ1ZQpT3vzY7iEbOTuT4uo0-OSCAt5zgVhlhw4aC33s-VhyucDnP1tQGFd9svaazQ8A_SKgolPk3owzug8dCsiXoPeJ0k","direction":"https:\/\/maps.googleapis.com\/maps\/api\/staticmap?size=600x150&maptype=roadmap&markers=color:green%7Clabel:S%7C32.1117875%2C36.0669891&markers=color:red%7Clabel:D%7C32.0798703%2C36.0749472&path=color:0x007bff%7Cweight:5%7C32.1117875%2C36.0669891%7C32.0798703%2C36.0749472&key=AIzaSyCyfwRXTwSTLOFQSQgN5p7QZgGJVZnEKq0","DurationToPassenger":"1","rideId":"1295","passengerId":"113172279072358305645","durationOfRideValue":"528","paymentAmount":"33.78","paymentMethod":"visa","isHaveSteps":"startEnd","step0":"32.09571771505668,36.06855209916831","step1":"","step2":"","step3":"","step4":"","passengerWalletBurc":"6.99","carType":"Speed","kazan":"8","startNameLocation":"4368+PPP\u060c \u0627\u0644\u0633\u062e\u0646\u0629\u060c \u0627\u0644\u0623\u0631\u062f\u0646","endNameLocation":"33HG+R6R\u060c \u0627\u0644\u0632\u0631\u0642\u0627\u0621\u060c \u0627\u0644\u0623\u0631\u062f\u0646","timeOfOrder":"2025-06-20T17:49:16.916262","totalPassenger":"33.78"} +[2025-06-20 17:49:18] Parsed Locations: passenger_lat=32.1117875, passenger_lng=36.0669891 | destination_lat=32.0798703, destination_lng=36.0749472 +[2025-06-20 17:49:18] SQL statement prepared successfully. Attempting to execute... +[2025-06-20 17:49:18] EXCEPTION: An unexpected error occurred: SQLSTATE[HY000]: General error: 1366 Incorrect string value: '\x84\x0DO\x0E@@...' for column 'passenger_location' at row 1 +[2025-06-20 17:52:06] --- New Request Received --- +[2025-06-20 17:52:06] Incoming POST data: {"driver_id":"109270481246447459618","status":"Apply","passengerLocation":"32.1117875,36.0669891","passengerDestination":"32.1364001,36.0707479","Duration":"434","totalCost":"5.42","Distance":"4.38","name":"hamza","phone":"+201010101010","email":"hamzaayedflutter@gmail.com","WalletChecked":"true","tokenPassenger":"e4QWqe7K607luM7qUMOPCL:APA91bFjX4XBM4I5COJl9fyxCTKJ1ZQpT3vzY7iEbOTuT4uo0-OSCAt5zgVhlhw4aC33s-VhyucDnP1tQGFd9svaazQ8A_SKgolPk3owzug8dCsiXoPeJ0k","direction":"https:\/\/maps.googleapis.com\/maps\/api\/staticmap?size=600x150&maptype=roadmap&markers=color:green%7Clabel:S%7C32.1117875%2C36.0669891&markers=color:red%7Clabel:D%7C32.1364001%2C36.0707479&path=color:0x007bff%7Cweight:5%7C32.1117875%2C36.0669891%7C32.1364001%2C36.0707479&key=AIzaSyCyfwRXTwSTLOFQSQgN5p7QZgGJVZnEKq0","DurationToPassenger":"5","rideId":"1296","passengerId":"113172279072358305645","durationOfRideValue":"434","paymentAmount":"27.82","paymentMethod":"visa","isHaveSteps":"startEnd","step0":"32.12404505187645,36.06566168367863","step1":"","step2":"","step3":"","step4":"","passengerWalletBurc":"5.42","carType":"Speed","kazan":"8","startNameLocation":"4368+PPP\u060c \u0627\u0644\u0633\u062e\u0646\u0629\u060c \u0627\u0644\u0623\u0631\u062f\u0646","endNameLocation":"43PC+C4G\u060c \u0627\u0644\u0633\u062e\u0646\u0629\u060c \u0627\u0644\u0623\u0631\u062f\u0646","timeOfOrder":"2025-06-20T17:52:05.601313","totalPassenger":"27.82"} +[2025-06-20 17:52:06] SQL statement prepared successfully. Attempting to execute... +[2025-06-20 17:52:06] EXCEPTION: An unexpected error occurred: SQLSTATE[22001]: String data, right truncated: 1406 Data too long for column 'passenger_location' at row 1 +[2025-06-20 17:53:56] --- New Request Received --- +[2025-06-20 17:53:56] Incoming POST data: {"driver_id":"109270481246447459618","status":"Apply","passengerLocation":"32.1117875,36.0669891","passengerDestination":"32.0798703,36.0749472","Duration":"528","totalCost":"6.99","Distance":"5.64","name":"hamza","phone":"+201010101010","email":"hamzaayedflutter@gmail.com","WalletChecked":"true","tokenPassenger":"e4QWqe7K607luM7qUMOPCL:APA91bFjX4XBM4I5COJl9fyxCTKJ1ZQpT3vzY7iEbOTuT4uo0-OSCAt5zgVhlhw4aC33s-VhyucDnP1tQGFd9svaazQ8A_SKgolPk3owzug8dCsiXoPeJ0k","direction":"https:\/\/maps.googleapis.com\/maps\/api\/staticmap?size=600x150&maptype=roadmap&markers=color:green%7Clabel:S%7C32.1117875%2C36.0669891&markers=color:red%7Clabel:D%7C32.0798703%2C36.0749472&path=color:0x007bff%7Cweight:5%7C32.1117875%2C36.0669891%7C32.0798703%2C36.0749472&key=AIzaSyCyfwRXTwSTLOFQSQgN5p7QZgGJVZnEKq0","DurationToPassenger":"3","rideId":"1297","passengerId":"113172279072358305645","durationOfRideValue":"528","paymentAmount":"33.78","paymentMethod":"visa","isHaveSteps":"startEnd","step0":"32.09571771505668,36.06855209916831","step1":"","step2":"","step3":"","step4":"","passengerWalletBurc":"6.99","carType":"Speed","kazan":"8","startNameLocation":"4368+PPP\u060c \u0627\u0644\u0633\u062e\u0646\u0629\u060c \u0627\u0644\u0623\u0631\u062f\u0646","endNameLocation":"33HG+R6R\u060c \u0627\u0644\u0632\u0631\u0642\u0627\u0621\u060c \u0627\u0644\u0623\u0631\u062f\u0646","timeOfOrder":"2025-06-20T17:53:56.195146","totalPassenger":"33.78"} +[2025-06-20 17:53:56] SQL statement prepared successfully. Attempting to execute... +[2025-06-20 17:53:56] SUCCESS: Database insert was successful for rideId: 1297 +[2025-06-21 23:49:45] --- New Request Received --- +[2025-06-21 23:49:45] Incoming POST data: {"driver_id":"109270481246447459618","status":"Apply","passengerLocation":"32.1117875,36.0669891","passengerDestination":"32.0798703,36.0749472","Duration":"528","totalCost":"6.99","Distance":"5.64","name":"hamza","phone":"+201010101010","email":"hamzaayedflutter@gmail.com","WalletChecked":"true","tokenPassenger":"e4QWqe7K607luM7qUMOPCL:APA91bFjX4XBM4I5COJl9fyxCTKJ1ZQpT3vzY7iEbOTuT4uo0-OSCAt5zgVhlhw4aC33s-VhyucDnP1tQGFd9svaazQ8A_SKgolPk3owzug8dCsiXoPeJ0k","direction":"https:\/\/maps.googleapis.com\/maps\/api\/staticmap?size=600x150&maptype=roadmap&markers=color:green%7Clabel:S%7C32.1117875%2C36.0669891&markers=color:red%7Clabel:D%7C32.0798703%2C36.0749472&path=color:0x007bff%7Cweight:5%7C32.1117875%2C36.0669891%7C32.0798703%2C36.0749472&key=AIzaSyCyfwRXTwSTLOFQSQgN5p7QZgGJVZnEKq0","DurationToPassenger":"1","rideId":"1298","passengerId":"113172279072358305645","durationOfRideValue":"528","paymentAmount":"29.81","paymentMethod":"visa","isHaveSteps":"startEnd","step0":"32.09571771505668,36.06855209916831","step1":"","step2":"","step3":"","step4":"","passengerWalletBurc":"6.99","carType":"Speed","kazan":"8","startNameLocation":"4368+PPP\u060c \u0627\u0644\u0633\u062e\u0646\u0629\u060c \u0627\u0644\u0623\u0631\u062f\u0646","endNameLocation":"33HG+R6R\u060c \u0627\u0644\u0632\u0631\u0642\u0627\u0621\u060c \u0627\u0644\u0623\u0631\u062f\u0646","timeOfOrder":"2025-06-21T23:49:42.340702","totalPassenger":"29.81"} +[2025-06-21 23:49:45] SQL statement prepared successfully. Attempting to execute... +[2025-06-21 23:49:45] SUCCESS: Database insert was successful for rideId: 1298 +[2025-07-08 18:34:43] --- New Request Received --- +[2025-07-08 18:34:43] Incoming POST data: {"driver_id":"109270481246447459618","status":"Apply","passengerLocation":"33.4934292,36.3335578","passengerDestination":"33.5165162,36.3174916","Duration":"842","totalCost":"6.32","Distance":"5.11","name":"hamza","phone":"+201010101010","email":"hamzaayedflutter@gmail.com","WalletChecked":"true","tokenPassenger":"e4QWqe7K607luM7qUMOPCL:APA91bFjX4XBM4I5COJl9fyxCTKJ1ZQpT3vzY7iEbOTuT4uo0-OSCAt5zgVhlhw4aC33s-VhyucDnP1tQGFd9svaazQ8A_SKgolPk3owzug8dCsiXoPeJ0k","direction":"https:\/\/maps.googleapis.com\/maps\/api\/staticmap?size=600x150&maptype=roadmap&markers=color:green%7Clabel:S%7C33.4934292%2C36.3335578&markers=color:red%7Clabel:D%7C33.5165162%2C36.3174916&path=color:0x007bff%7Cweight:5%7C33.4934292%2C36.3335578%7C33.5165162%2C36.3174916&key=AIzaSyCyfwRXTwSTLOFQSQgN5p7QZgGJVZnEKq0","DurationToPassenger":"11","rideId":"1315","passengerId":"113172279072358305645","durationOfRideValue":"842","paymentAmount":"34.78","paymentMethod":"visa","isHaveSteps":"startEnd","step0":"33.505157730332385,36.32586847990751","step1":"","step2":"","step3":"","step4":"","passengerWalletBurc":"6.32","carType":"Speed","kazan":"8","startNameLocation":"F8VM+C95\u060c \u062f\u0645\u0634\u0642\u060c \u0633\u0648\u0631\u064a\u0627","endNameLocation":"G888+MV4\u060c \u062f\u0645\u0634\u0642\u060c \u0633\u0648\u0631\u064a\u0627","timeOfOrder":"2025-07-08T18:34:14.861836","totalPassenger":"34.78"} +[2025-07-08 18:34:43] SQL statement prepared successfully. Attempting to execute... +[2025-07-08 18:34:43] SUCCESS: Database insert was successful for rideId: 1315 +[2025-07-27 16:51:54] --- New Request Received --- +[2025-07-27 16:51:54] Incoming POST data: {"driver_id":"34feffd3fa72d6bee56b","status":"Apply","passengerLocation":"32.1117875,36.0669891","passengerDestination":"32.1324686,36.0710479","Duration":"346","totalCost":"2767.81","Distance":"2.64","name":"hamza","phone":"963992952235","email":"963992952235@intaleqapp.com","WalletChecked":"false","tokenPassenger":"eskhRGH3gkzOmUQou8xJjg:APA91bGkbGdXRTuB3QTZ5BjHGiYLZNugjVlW7o89ck9KPDmJrT7v1DBSjdamRSLc4oqT56xNpZ_LgkFKhRWkprlLUvZx5HLCOTXMk0WBiQ0UibiSWqw10oI","direction":"https:\/\/maps.googleapis.com\/maps\/api\/staticmap?size=600x150&maptype=roadmap&markers=color:green%7Clabel:S%7C32.1117875%2C36.0669891&markers=color:red%7Clabel:D%7C32.1324686%2C36.0710479&path=color:0x007bff%7Cweight:5%7C32.1117875%2C36.0669891%7C32.1324686%2C36.0710479&key=QOsqYdTCyHNapgBsg2Kn-nTKbhaWhEAGOjUeU78","DurationToPassenger":"1","rideId":"2","passengerId":"0b24f04061d6853df4b9","durationOfRideValue":"346","paymentAmount":"10532.56","paymentMethod":"cash","isHaveSteps":"startEnd","step0":"32.122128403255125,36.07006452977657","step1":"","step2":"","step3":"","step4":"","passengerWalletBurc":"2767.81","carType":"Speed","kazan":"15","startNameLocation":"4368+PPP\u060c \u0627\u0644\u0633\u062e\u0646\u0629\u060c \u0627\u0644\u0623\u0631\u062f\u0646","endNameLocation":"43MC+374\u060c \u0627\u0644\u0633\u062e\u0646\u0629\u060c \u0627\u0644\u0623\u0631\u062f\u0646","timeOfOrder":"2025-07-27T16:51:53.436851","totalPassenger":"10532.56"} +[2025-07-27 16:51:54] SQL statement prepared successfully. Attempting to execute... +[2025-07-27 16:51:54] SUCCESS: Database insert was successful for rideId: 2 +[2025-08-05 12:13:28] --- New Request Received --- +[2025-08-05 12:13:28] Incoming POST data: {"driver_id":"34feffd3fa72d6bee56b","status":"Apply","passengerLocation":"32.1117131,36.067405","passengerDestination":"32.1278332,36.0702951","Duration":"253","totalCost":"2126.67","Distance":"2.03","name":"hamza","phone":"963992952235","email":"963992952235@intaleqapp.com","WalletChecked":"false","tokenPassenger":"dwDRLsWhZEIqum1oxaaTWY:APA91bHhImBb0-kyeRE8zP8jL-ps_K4Xt09g1YNRWbVx007FO4N9U4b9lPAoNOU029qM5-GU65doySW7dfsdQ_mDogqGtQnGtJz1uVOb_3_v-tuoL9irixo","direction":"https:\/\/maps.googleapis.com\/maps\/api\/staticmap?size=600x150&maptype=roadmap&markers=color:green%7Clabel:S%7C32.1117131%2C36.067405&markers=color:red%7Clabel:D%7C32.1278332%2C36.0702951&path=color:0x007bff%7Cweight:5%7C32.1117131%2C36.067405%7C32.1278332%2C36.0702951&key=AIzaSyCFsWBqvkXzk1Gb-bCGxwqTwJQKIeHjH64","DurationToPassenger":"3","rideId":"23","passengerId":"0b24f04061d6853df4b9","durationOfRideValue":"253","paymentAmount":"5938.31","paymentMethod":"cash","isHaveSteps":"startEnd","step0":"32.119773283888684,36.06956731528044","step1":"","step2":"","step3":"","step4":"","passengerWalletBurc":"2126.67","carType":"Speed","kazan":"15","startNameLocation":"4368+PPP\u060c \u0627\u0644\u0633\u062e\u0646\u0629\u060c \u0627\u0644\u0623\u0631\u062f\u0646","endNameLocation":"43H9+3V8\u060c \u0627\u0644\u0633\u062e\u0646\u0629\u060c \u0627\u0644\u0623\u0631\u062f\u0646","timeOfOrder":"2025-08-05T12:13:27.287381","totalPassenger":"5938.31"} +[2025-08-05 12:13:28] SQL statement prepared successfully. Attempting to execute... +[2025-08-05 12:13:28] SUCCESS: Database insert was successful for rideId: 23 +[2025-11-03 16:54:25] --- New Request Received --- +[2025-11-03 16:54:25] Incoming POST data: {"driver_id":"90393d64b8cd7488c4df","status":"Apply","passengerLocation":"33.4323,36.24325","passengerDestination":"33.4277,36.23907","Duration":"111","totalCost":"0.00","Distance":"0.72","name":"\u062d\u0645\u0632\u0647","phone":"963992952235","email":"963992952235@intaleqapp.com","WalletChecked":"false","tokenPassenger":"eznj5vRWRnqwKNtKJBaYNg:APA91bHhJ2DJ1KQa3KRx6wQtX8BkFHq6I_-dXGxT16p6pnV5AwI0bWOeiTJOI35VfTBaK4YSCKmAB4SsRnpARK0MTJ96xtpPmwAKfkvsZFga8OoGMeb3PmA","direction":"https:\/\/maps.googleapis.com\/maps\/api\/staticmap?size=600x150&maptype=roadmap&markers=color:green%7Clabel:S%7C33.4323%2C36.24325&markers=color:red%7Clabel:D%7C33.4277%2C36.23907&path=color:0x007bff%7Cweight:5%7C33.4323%2C36.24325%7C33.4277%2C36.23907&key=AIzaSyAPFR_XbRN0XZ5Iz3AYDjNYHGJG2s2QWwM","DurationToPassenger":"0","rideId":"5","passengerId":"f1e06c5908dcae1f5bf2","durationOfRideValue":"111","paymentAmount":"17280.00","paymentMethod":"cash","isHaveSteps":"startEnd","step0":"33.430078683118474,36.241159960627556","step1":"","step2":"","step3":"","step4":"","passengerWalletBurc":"0.00","carType":"Speed","kazan":"8","startNameLocation":"home","endNameLocation":"destination","timeOfOrder":"2025-11-03T16:54:23.416130","totalPassenger":"17280.00"} +[2025-11-03 16:54:25] SQL statement prepared successfully. Attempting to execute... +[2025-11-03 16:54:25] SUCCESS: Database insert was successful for rideId: 5 +[2025-11-18 18:07:16] --- New Request Received --- +[2025-11-18 18:07:16] Incoming POST data: {"driver_id":"ca60f0f65d7d6de23e5c","status":"Apply","passengerLocation":"36.16167,37.15408","passengerDestination":"36.2431,37.1496","Duration":"1254","totalCost":"0.00","Distance":"11.53","name":"George","phone":"447441447609","email":"sahrsa6@gmail.com","WalletChecked":"false","tokenPassenger":"eoHpQeewTbKL3ZU5ioLgP5:APA91bG0FhuTixe_kuDw49onLPdOjxdyRvmbT_TG5Va81lI7RqOpoHqaho6NThvybVJZaelkobwTDCZeC9WKLW-RytE1mUl3MfRiYiTPkHGZ2bCe9Raehtc","direction":"https:\/\/maps.googleapis.com\/maps\/api\/staticmap?size=600x150&maptype=roadmap&markers=color:green%7Clabel:S%7C36.16167%2C37.15408&markers=color:red%7Clabel:D%7C36.2431%2C37.1496&path=color:0x007bff%7Cweight:5%7C36.16167%2C37.15408%7C36.2431%2C37.1496&key=AIzaSyAPFR_XbRN0XZ5Iz3AYDjNYHGJG2s2QWwM","DurationToPassenger":"0","rideId":"124","passengerId":"21c382cde919795e93bb","durationOfRideValue":"1254","paymentAmount":"56469.00","paymentMethod":"cash","isHaveSteps":"startEnd","step0":"36.174937765937635,37.15724665671587","step1":"","step2":"","step3":"","step4":"","passengerWalletBurc":"0.00","carType":"Speed","kazan":"8","startNameLocation":"home","endNameLocation":"destination","timeOfOrder":"2025-11-18T18:07:15.160122","totalPassenger":"56469.00"} +[2025-11-18 18:07:16] SQL statement prepared successfully. Attempting to execute... +[2025-11-18 18:07:16] SUCCESS: Database insert was successful for rideId: 124 +[2025-11-20 10:07:35] --- New Request Received --- +[2025-11-20 10:07:35] Incoming POST data: {"driver_id":"34feffd3fa72d6bee56b","status":"Apply","passengerLocation":"33.4323,36.24325","passengerDestination":"33.43575,36.2483","Duration":"203","totalCost":"0.00","Distance":"0.96","name":"\u062d\u0645\u0632\u0647","phone":"963992952235","email":"963992952235@intaleqapp.com","WalletChecked":"false","tokenPassenger":"clZNZD6JTNeytuyvhqAjAs:APA91bEfEgnGduR3yy2ND3V57d1-qT_OS_A-gGimALeYNwSla-IVMBfYgfDYucNN5Whf0wJODjkOYuT03JLr5AJ4eqRXKxUbkbBis-GYFDdly_3o5nDEiWo","direction":"https:\/\/maps.googleapis.com\/maps\/api\/staticmap?size=600x150&maptype=roadmap&markers=color:green%7Clabel:S%7C33.4323%2C36.24325&markers=color:red%7Clabel:D%7C33.43575%2C36.2483&path=color:0x007bff%7Cweight:5%7C33.4323%2C36.24325%7C33.43575%2C36.2483&key=AIzaSyAPFR_XbRN0XZ5Iz3AYDjNYHGJG2s2QWwM","DurationToPassenger":"0","rideId":"143","passengerId":"849a9faf3e68c1aeb708","durationOfRideValue":"203","paymentAmount":"17280.00","paymentMethod":"cash","isHaveSteps":"startEnd","step0":"33.43403283445615,36.24521479010582","step1":"","step2":"","step3":"","step4":"","passengerWalletBurc":"0.00","carType":"Speed","kazan":"8","startNameLocation":"home","endNameLocation":"destination","timeOfOrder":"2025-11-20T10:07:33.481734","totalPassenger":"17280.00"} +[2025-11-20 10:07:35] SQL statement prepared successfully. Attempting to execute... +[2025-11-20 10:07:35] SUCCESS: Database insert was successful for rideId: 143 +[2025-11-25 20:16:54] --- New Request Received --- +[2025-11-25 20:16:54] Incoming POST data: {"driver_id":"7939eb03eb3b912ffb49","status":"Apply","passengerLocation":"35.12533,36.76929","passengerDestination":"35.13223,36.7536","Duration":"292","totalCost":"0.00","Distance":"2.81","name":"\u0639\u0628\u062f\u0627\u0644\u0644\u0647","phone":"963098198141","email":"bdallhlwany@gmail.com","WalletChecked":"false","tokenPassenger":"e-z9_8IRZEEsjwL3qFQAzN:APA91bHZEIWbF418RCnLeo3yVsGHkD7xDqoIHZzbw7tiXoImzSDi5KlOQbhIrEFxrtxNJ1uvStUk9jobI3k1p1LBr-Er7O2fhWG-P-HSHsChgGWoEjEZ15o","direction":"https:\/\/maps.googleapis.com\/maps\/api\/staticmap?size=600x150&maptype=roadmap&markers=color:green%7Clabel:S%7C35.12533%2C36.76929&markers=color:red%7Clabel:D%7C35.13223%2C36.7536&path=color:0x007bff%7Cweight:5%7C35.12533%2C36.76929%7C35.13223%2C36.7536&key=AIzaSyAPFR_XbRN0XZ5Iz3AYDjNYHGJG2s2QWwM","DurationToPassenger":"0","rideId":"229","passengerId":"64070ab2e6cfa4be0c58","durationOfRideValue":"292","paymentAmount":"17280.00","paymentMethod":"cash","isHaveSteps":"startEnd","step0":"35.1270850911746,36.76192492246628","step1":"","step2":"","step3":"","step4":"","passengerWalletBurc":"0.00","carType":"Speed","kazan":"8","startNameLocation":"\u062f\u0648\u0627\u0631 \u0627\u0644\u0627\u0633\u0643\u0627\u0646","endNameLocation":"\u062d\u0645\u0627\u0629","timeOfOrder":"2025-11-25T20:16:53.203785","totalPassenger":"17280.00"} +[2025-11-25 20:16:54] SQL statement prepared successfully. Attempting to execute... +[2025-11-25 20:16:54] SUCCESS: Database insert was successful for rideId: 229 +[2025-11-29 13:25:59] --- New Request Received --- +[2025-11-29 13:25:59] Incoming POST data: {"driver_id":"f48c50ef7bb6f55e710c","status":"Apply","passengerLocation":"33.43231,36.24297","passengerDestination":"33.43562,36.16933","Duration":"1419","totalCost":"0.00","Distance":"12.68","name":"\u062d\u0645\u0632\u0647","phone":"963992952235","email":"963992952235@intaleqapp.com","WalletChecked":"false","tokenPassenger":"eduBTsgC501SmEff3v4MGi:APA91bGf2PpOdgC3dEK7h3E4Kccu30tw7rbZeAJe7Co5JmHrrkwsz0pijAXFcjrbNkWQLI867bTogGGjL847OBNQ8FHSQJN9Gs1RY-GwaXh9ubffApwEdd0","direction":"https:\/\/maps.googleapis.com\/maps\/api\/staticmap?size=600x150&maptype=roadmap&markers=color:green%7Clabel:S%7C33.43231%2C36.24297&markers=color:red%7Clabel:D%7C33.43562%2C36.16933&path=color:0x007bff%7Cweight:5%7C33.43231%2C36.24297%7C33.43562%2C36.16933&key=AIzaSyAPFR_XbRN0XZ5Iz3AYDjNYHGJG2s2QWwM","DurationToPassenger":"0","rideId":"290","passengerId":"849a9faf3e68c1aeb708","durationOfRideValue":"1419","paymentAmount":"60710.00","paymentMethod":"cash","isHaveSteps":"startEnd","step0":"33.449831692690715,36.20406500995159","step1":"","step2":"","step3":"","step4":"","passengerWalletBurc":"0.00","carType":"Speed","kazan":"8","startNameLocation":"\u0623\u0634\u0631\u0641\u064a\u0629","endNameLocation":"\u062c\u062f\u064a\u062f\u0629 \u0639\u0631\u0637\u0648\u0632","timeOfOrder":"2025-11-29T13:25:58.938290","totalPassenger":"60710.00"} +[2025-11-29 13:25:59] SQL statement prepared successfully. Attempting to execute... +[2025-11-29 13:25:59] SUCCESS: Database insert was successful for rideId: 290 +[2025-12-01 10:28:09] --- New Request Received --- +[2025-12-01 10:28:09] Incoming POST data: {"driver_id":"b21737ec0edb0d02eb86","status":"Apply","passengerLocation":"33.4323,36.24329","passengerDestination":"33.41301,36.23664","Duration":"575","totalCost":"0.00","Distance":"3.64","name":"\u062d\u0645\u0632\u0647","phone":"963992952235","email":"963992952235@intaleqapp.com","WalletChecked":"false","tokenPassenger":"eduBTsgC501SmEff3v4MGi:APA91bGf2PpOdgC3dEK7h3E4Kccu30tw7rbZeAJe7Co5JmHrrkwsz0pijAXFcjrbNkWQLI867bTogGGjL847OBNQ8FHSQJN9Gs1RY-GwaXh9ubffApwEdd0","direction":"https:\/\/maps.googleapis.com\/maps\/api\/staticmap?size=600x150&maptype=roadmap&markers=color:green%7Clabel:S%7C33.4323%2C36.24329&markers=color:red%7Clabel:D%7C33.41301%2C36.23664&path=color:0x007bff%7Cweight:5%7C33.4323%2C36.24329%7C33.41301%2C36.23664&key=AIzaSyAPFR_XbRN0XZ5Iz3AYDjNYHGJG2s2QWwM","DurationToPassenger":"0","rideId":"314","passengerId":"849a9faf3e68c1aeb708","durationOfRideValue":"575","paymentAmount":"19754.00","paymentMethod":"cash","isHaveSteps":"startEnd","step0":"33.42334065389521,36.23577006161213","step1":"","step2":"","step3":"","step4":"","passengerWalletBurc":"0.00","carType":"Speed","kazan":"8","startNameLocation":"\u0623\u0634\u0631\u0641\u064a\u0629","endNameLocation":"\u0627\u0644\u0634\u064a\u062e \u0625\u0628\u0631\u0627\u0647\u064a\u0645","timeOfOrder":"2025-12-01T10:28:11.316238","totalPassenger":"19754.00"} +[2025-12-01 10:28:09] SQL statement prepared successfully. Attempting to execute... +[2025-12-01 10:28:09] SUCCESS: Database insert was successful for rideId: 314 +[2026-01-08 01:45:12] --- New Request Received --- +[2026-01-08 01:45:12] Incoming POST data: {"driver_id":"34feffd3fa72d6bee56b","status":"Apply","passengerLocation":"31.990668","passengerDestination":"35.877682","Duration":"35.930359","totalCost":"3.50","Distance":"8.5 km","name":"Hamza Passenger","phone":"0791234567","email":"client@email.com","WalletChecked":"false","tokenPassenger":"PASSENGER_FCM_TOKEN_XYZ","direction":"","DurationToPassenger":"5 min","rideId":"9999","passengerId":"55","durationOfRideValue":"20 min","paymentAmount":"3.50","paymentMethod":"cash","isHaveSteps":"false","step0":"","step1":"","step2":"","step3":"","step4":"","passengerWalletBurc":"3.50","carType":"speed","kazan":"2.75","startNameLocation":"\u0627\u0644\u062c\u0627\u0645\u0639\u0629 \u0627\u0644\u0623\u0631\u062f\u0646\u064a\u0629 - \u0627\u0644\u0628\u0648\u0627\u0628\u0629 \u0627\u0644\u0631\u0626\u064a\u0633\u064a\u0629","endNameLocation":"\u0627\u0644\u0639\u0628\u062f\u0644\u064a \u0645\u0648\u0644 - \u0627\u0644\u0628\u0648\u0644\u064a\u0641\u0627\u0631\u062f","timeOfOrder":"2026-01-08T01:45:11.370578","totalPassenger":"3.50"} +[2026-01-08 01:45:12] SQL statement prepared successfully. Attempting to execute... +[2026-01-08 01:45:12] EXCEPTION: An unexpected error occurred: SQLSTATE[23000]: Integrity constraint violation: 1048 Column 'direction_url' cannot be null +[2026-01-08 21:23:04] --- New Request Received --- +[2026-01-08 21:23:04] Incoming POST data: {"driver_id":"34feffd3fa72d6bee56b","status":"Apply","passengerLocation":"32.073743222739","passengerDestination":"36.096920477709","Duration":"35.930359","totalCost":"3.50","Distance":"8.9 km","name":"Hamza Passenger","phone":"0791234567","email":"client@email.com","WalletChecked":"false","tokenPassenger":"PASSENGER_FCM_TOKEN_XYZ","direction":"","DurationToPassenger":"5 min","rideId":"9999","passengerId":"55","durationOfRideValue":"18 min","paymentAmount":"53.50","paymentMethod":"cash","isHaveSteps":"false","step0":"","step1":"","step2":"","step3":"","step4":"","passengerWalletBurc":"3.50","carType":"speed","kazan":"2.75","startNameLocation":"\u0627\u0644\u062c\u0627\u0645\u0639\u0629 \u0627\u0644\u0623\u0631\u062f\u0646\u064a\u0629 - \u0627\u0644\u0628\u0648\u0627\u0628\u0629 \u0627\u0644\u0631\u0626\u064a\u0633\u064a\u0629","endNameLocation":"\u0627\u0644\u0639\u0628\u062f\u0644\u064a \u0645\u0648\u0644 - \u0627\u0644\u0628\u0648\u0644\u064a\u0641\u0627\u0631\u062f","timeOfOrder":"2026-01-08T21:23:03.507502","totalPassenger":"53.50"} +[2026-01-08 21:23:04] SQL statement prepared successfully. Attempting to execute... +[2026-01-08 21:23:04] EXCEPTION: An unexpected error occurred: SQLSTATE[23000]: Integrity constraint violation: 1048 Column 'direction_url' cannot be null +[2026-01-22 14:29:49] --- New Request Received --- +[2026-01-22 14:29:49] Incoming POST data: {"driver_id":"34feffd3fa72d6bee56b","status":"Apply","passengerLocation":"startLocation","passengerDestination":"endLocation","Duration":"durationToPassenger","totalCost":"totalCost","Distance":"distance","name":"passengerName","phone":"passengerPhone","email":"email","WalletChecked":"WalletChecked","tokenPassenger":"passengerToken","direction":"","DurationToPassenger":"DurationToPassenger","rideId":"rideId","passengerId":"passengerId","durationOfRideValue":"durationOfRideValue","paymentAmount":"paymentAmount","paymentMethod":"cash","isHaveSteps":"isHaveSteps","step0":"step0","step1":"step1","step2":"step2","step3":"step3","step4":"step4","passengerWalletBurc":"totalCost","carType":"carType","kazan":"kazan","startNameLocation":"startNameLocation","endNameLocation":"endNameLocation","timeOfOrder":"2026-01-22T14:29:46.887096","totalPassenger":"paymentAmount"} +[2026-01-22 14:29:49] SQL statement prepared successfully. Attempting to execute... +[2026-01-22 14:29:49] EXCEPTION: An unexpected error occurred: SQLSTATE[23000]: Integrity constraint violation: 1048 Column 'direction_url' cannot be null +[2026-01-22 14:31:31] --- New Request Received --- +[2026-01-22 14:31:31] Incoming POST data: {"driver_id":"34feffd3fa72d6bee56b","status":"Apply","passengerLocation":"startLocation","passengerDestination":"endLocation","Duration":"durationToPassenger","totalCost":"totalCost","Distance":"distance","name":"passengerName","phone":"passengerPhone","email":"email","WalletChecked":"WalletChecked","tokenPassenger":"passengerToken","direction":"","DurationToPassenger":"DurationToPassenger","rideId":"rideId","passengerId":"passengerId","durationOfRideValue":"durationOfRideValue","paymentAmount":"paymentAmount","paymentMethod":"cash","isHaveSteps":"isHaveSteps","step0":"step0","step1":"step1","step2":"step2","step3":"step3","step4":"step4","passengerWalletBurc":"totalCost","carType":"carType","kazan":"kazan","startNameLocation":"startNameLocation","endNameLocation":"endNameLocation","timeOfOrder":"2026-01-22T14:31:29.409730","totalPassenger":"paymentAmount"} +[2026-01-22 14:31:31] SQL statement prepared successfully. Attempting to execute... +[2026-01-22 14:31:31] EXCEPTION: An unexpected error occurred: SQLSTATE[23000]: Integrity constraint violation: 1048 Column 'direction_url' cannot be null +[2026-01-22 14:39:59] --- New Request Received --- +[2026-01-22 14:39:59] Incoming POST data: {"driver_id":"34feffd3fa72d6bee56b","status":"Apply","passengerLocation":"startLocation","passengerDestination":"endLocation","Duration":"durationToPassenger","totalCost":"totalCost","Distance":"distance","name":"passengerName","phone":"passengerPhone","email":"email","WalletChecked":"WalletChecked","tokenPassenger":"passengerToken","direction":"","DurationToPassenger":"DurationToPassenger","rideId":"rideId","passengerId":"passengerId","durationOfRideValue":"durationOfRideValue","paymentAmount":"paymentAmount","paymentMethod":"cash","isHaveSteps":"isHaveSteps","step0":"step0","step1":"step1","step2":"step2","step3":"step3","step4":"step4","passengerWalletBurc":"totalCost","carType":"carType","kazan":"kazan","startNameLocation":"startNameLocation","endNameLocation":"endNameLocation","timeOfOrder":"2026-01-22T14:39:56.986847","totalPassenger":"paymentAmount"} +[2026-01-22 14:39:59] SQL statement prepared successfully. Attempting to execute... +[2026-01-22 14:39:59] EXCEPTION: An unexpected error occurred: SQLSTATE[23000]: Integrity constraint violation: 1048 Column 'direction_url' cannot be null +[2026-02-20 16:39:52] --- New Request Received --- +[2026-02-20 16:39:52] Incoming POST data: {"driver_id":"eefed62b0aeb9e304efd","status":"Apply","passengerLocation":"32.11172","passengerDestination":"36.06738","Duration":"36.06738","totalCost":"173.00","Distance":"0.0","name":"\u062d\u0645\u0632\u0647 \u0639\u0627\u064a\u062f","phone":"963992952235","email":"963992952235@intaleqapp.com","WalletChecked":"false","tokenPassenger":"e9X4q6nL3EuRu2OIsWJ-A2:APA91bE223jfIOjWbSrjF41HZjeZVWc-jm2NAg2sXTmoyHUkoC10uycmxl0Ne4WcE8aojjTm7fWTPm5aEFi1xJKN1Wy0vgupUmSD2LcKBcE1Cym_GTvikME","direction":"","DurationToPassenger":"","rideId":"782","passengerId":"849a9faf3e68c1aeb708","durationOfRideValue":"","paymentAmount":"173.00","paymentMethod":"cash","isHaveSteps":"false","step0":"32.11180279564045,36.067136228084564","step1":"","step2":"","step3":"","step4":"","passengerWalletBurc":"173.00","carType":"Fixed Price","kazan":"0.00","startNameLocation":"\u0648\u0627\u062f\u064a \u0623\u0643\u064a\u062f\u0631","endNameLocation":"\u0648\u0627\u062f\u064a \u0623\u0643\u064a\u062f\u0631","timeOfOrder":"2026-02-20T16:40:10.040464","totalPassenger":"173.00"} +[2026-02-20 16:39:52] SQL statement prepared successfully. Attempting to execute... +[2026-02-20 16:39:52] EXCEPTION: An unexpected error occurred: SQLSTATE[23000]: Integrity constraint violation: 1048 Column 'direction_url' cannot be null + +``` + +## File: ride/overLay/getArgumentAfterAppliedFromBackground.php +``` +prepare($sql); +$stmt->bindParam(':driver_id', $driver_id); +$stmt->execute(); + +$row = $stmt->fetch(PDO::FETCH_ASSOC); +if ($row) { + // convert WKT POINT back to "lat,lng" + foreach (['passenger_location', 'passenger_destination'] as $f) { + if (!empty($row["{$f}_wkt"])) { + // WKT format: POINT(lng lat) + preg_match('/POINT\(([^ ]+) ([^ ]+)\)/', $row["{$f}_wkt"], $m); + $row[$f] = "{$m[2]},{$m[1]}"; + } + unset($row["{$f}_wkt"]); + } + jsonSuccess($row); +} else { + jsonError('No data found'); +} +``` + +## File: ride/promo/add.php +``` +prepare($sql); +$stmt->bindValue(':promoCode', $promoCode); +$stmt->bindValue(':amount', $amount); +$stmt->bindValue(':description', $description); +$stmt->bindValue(':passengerID', $passengerID); + +$stmt->execute(); + +if ($stmt->rowCount() > 0) { + jsonSuccess(null, "Promo data saved successfully"); +} else { + jsonError("Failed to save promo data"); +} +?> +``` + +## File: ride/promo/update.php +``` +prepare($sql); +$stmt->bindParam(':promoCode', $promoCode); +stmt->bindParam(':description', $description); +stmt->bindParam(':validityStartDate', $validityStartDate); +$stmt->bindParam(':validityEndDate', $validityEndDate); +stmt->bindParam(':id', $id, PDO::PARAM_INT); + +$stmt->execute(); + +if ($stmt->rowCount() > 0) { + jsonSuccess(null, "Promo data updated successfully"); +} else { + jsonError("Failed to update promo data"); +} +?> +``` + +## File: ride/promo/get.php +``` +prepare($sql); +$stmt->bindParam(':promo_code', $promo_code, PDO::PARAM_STR); +$stmt->execute(); +$result = $stmt->fetchAll(PDO::FETCH_ASSOC); + +if ($result) { + jsonSuccess($result); +} else { + jsonError("Failed to retrieve promo records"); +} +?> +``` + +## File: ride/promo/getPromoFirst.php +``` +encryptData(filterRequest("passengerID")); +$passengerID = filterRequest("passengerID"); // استخدم هذا إذا ID رقم فقط + +$sql = "SELECT + `id`, + `promo_code`, + `amount`, + `description`, + `validity_start_date`, + `validity_end_date` +FROM + `promos` +WHERE + `passengerID` = ? AND CURDATE() BETWEEN validity_start_date AND validity_end_date"; + +$stmt = $con->prepare($sql); +$stmt->bindParam(1, $passengerID); +$stmt->execute(); + +$result = $stmt->fetchAll(PDO::FETCH_ASSOC); + +if ($result) { + jsonSuccess($result); +} else { + jsonError("Failed to retrieve promo records"); +} +?> +``` + +## File: ride/promo/delete.php +``` +prepare($sql); +$stmt->bindParam(':id', $id, PDO::PARAM_INT); // استخدام bindParam لحماية الاستعلام +$stmt->execute(); + +if ($stmt->rowCount() > 0) { + jsonSuccess(null, "Promo data deleted successfully"); +} else { + jsonError("Failed to delete promo data"); +} +?> +``` + +## File: ride/promo/getPromoBytody.php +``` += CURDATE();"; + +$stmt = $con->prepare($sql); +$stmt->execute(); +$result = $stmt->fetchAll(PDO::FETCH_ASSOC); + +if ($result) { + // Print all promo records + jsonSuccess($result); +} else { + // Print a failure message + jsonError($message = "Failed to retrieve promo records"); + +} +?> +``` + +## File: ride/carDrivers/add.php +``` +encryptData(filterRequest("vin")); +$car_plate = $encryptionHelper->encryptData(filterRequest("car_plate")); +$make = filterRequest("make"); +$model = filterRequest("model"); +$year = filterRequest("year"); +$expiration_date = filterRequest("expiration_date"); +$color = filterRequest("color"); +$owner = $encryptionHelper->encryptData(filterRequest("owner")); +$color_hex = filterRequest("color_hex"); +$address = $encryptionHelper->encryptData(filterRequest("address")); +$displacement = filterRequest("displacement"); +$fuel = filterRequest("fuel"); +$registration_date = filterRequest("registration_date"); + +// SQL statement +$sql = "INSERT INTO `captains_car` ( + `driverID`, `vin`, `car_plate`, `make`, `model`, `year`, `expiration_date`, + `color`, `owner`, `color_hex`, `address`, `displacement`, `fuel`, `registration_date` +) VALUES ( + :driverID, :vin, :car_plate, :make, :model, :year, :expiration_date, + :color, :owner, :color_hex, :address, :displacement, :fuel, :registration_date +)"; + +$stmt = $con->prepare($sql); + +// Bind parameters +$stmt->bindParam(':driverID', $driverID); +$stmt->bindParam(':vin', $vin); +$stmt->bindParam(':car_plate', $car_plate); +$stmt->bindParam(':make', $make); +$stmt->bindParam(':model', $model); +$stmt->bindParam(':year', $year, PDO::PARAM_INT); +$stmt->bindParam(':expiration_date', $expiration_date); +$stmt->bindParam(':color', $color); +$stmt->bindParam(':owner', $owner); +$stmt->bindParam(':color_hex', $color_hex); +$stmt->bindParam(':address', $address); +$stmt->bindParam(':displacement', $displacement); +$stmt->bindParam(':fuel', $fuel); +$stmt->bindParam(':registration_date', $registration_date); + +$stmt->execute(); +$insertedId = $con->lastInsertId(); + +if ($stmt->rowCount() > 0) { + jsonSuccess(["id" => $insertedId]); +} else { + jsonError("Failed to save car registration information"); +} +?> +``` + +## File: ride/carDrivers/get.php +``` +decryptData($v); } catch (\Throwable $e) { return $v; } + }; + + // أعمدة مشتركة/موحّدة للإخراج + return [ + 'id' => $get('id'), + 'driverID' => $get('driverID'), + 'vin' => $dec($get('vin')), // إن كان مُشفراً + 'car_plate' => $dec($get('car_plate')), // إن كان مُشفراً + 'make' => $get('make'), + 'model' => $get('model'), + 'year' => $get('year'), + 'expiration_date' => $get('expiration_date'), + 'color' => $get('color'), + 'color_hex' => $get('color_hex'), + 'owner' => $dec($get('owner')), // إن كان مُشفراً + 'address' => $dec($get('address')), // قد لا يوجد في CarRegistration + 'type' => $get('type'), // إن وُجد + 'isDefault' => (int)($get('isDefault', 0)), + 'status' => $get('status'), + 'created_at' => $get('created_at'), + 'source' => $source, // لمعرفة مصدر السجل + ]; + } + + // 1) جلب من captains_car + $sql1 = "SELECT * FROM captains_car WHERE driverID = :driverID"; + $st1 = $con->prepare($sql1); + $st1->execute([':driverID' => $driverID]); + $rows1 = $st1->fetchAll(PDO::FETCH_ASSOC); + + // 2) جلب من CarRegistration + $sql2 = "SELECT * FROM CarRegistration WHERE driverID = :driverID"; + $st2 = $con->prepare($sql2); + $st2->execute([':driverID' => $driverID]); + $rows2 = $st2->fetchAll(PDO::FETCH_ASSOC); + + // 3) توحيد النتائج مع فك التشفير + $result = []; + foreach ($rows1 as $r) { $result[] = normalize_car_row($r, 'captains_car', $encryptionHelper); } + foreach ($rows2 as $r) { $result[] = normalize_car_row($r, 'CarRegistration', $encryptionHelper); } + + if (empty($result)) { + jsonError("No driver car data found"); + exit; + } + + // 4) ترتيب النتيجة: السيارات الافتراضية أولاً ثم الأحدث إنشاءً + usort($result, function($a, $b) { + // isDefault desc + if ((int)$a['isDefault'] !== (int)$b['isDefault']) { + return (int)$b['isDefault'] <=> (int)$a['isDefault']; + } + // created_at desc (لو أحدهم null لن يؤثر) + return strcmp((string)$b['created_at'], (string)$a['created_at']); + }); + + jsonSuccess($result); + +} catch (PDOException $e) { + error_log("Database error (get_driver_cars): " . $e->getMessage()); + jsonError("Database error occurred"); +} catch (Throwable $e) { + error_log("App error (get_driver_cars): " . $e->getMessage()); + jsonError("Unexpected error occurred"); +} +``` + +## File: ride/carDrivers/delete.php +``` +prepare($sql); +$stmt->bindParam(':id', $id, PDO::PARAM_INT); +$stmt->execute(); + +// التحقق من نجاح الحذف +if ($stmt->rowCount() > 0) { + jsonSuccess(null, "Car registration deleted successfully"); +} else { + jsonError("Failed to delete car registration"); +} +?> +``` + +## File: Admin/jwtService.php +``` +enforce(RateLimiter::identifier(), 'login'); + +try { + $email = filterRequest('email') ?? ''; + $password = filterRequest('password') ?? ''; + $audience = filterRequest('aud') ?? ''; + + $allowed1 = getenv('allowedService1'); + $allowed2 = getenv('allowedService2'); + $allowedAudiences = array_values(array_filter([$allowed1, $allowed2])); + + if (empty($email) || empty($password) || empty($audience)) { + jsonError('Email and password are required.', 400); + } + + if (!in_array($audience, $allowedAudiences, true)) { + jsonError('Invalid audience', 400); + } + + $con = Database::get('main'); + + // استخدام user table ويفضل استخدام password_hash لاحقا مثل admin_users + $stmt = $con->prepare("SELECT `id`, `password`, `email` FROM `users` WHERE email = :email LIMIT 1"); + $stmt->execute([':email' => $email]); + $user = $stmt->fetch(); + + $startTime = microtime(true); + + // دعم password_verify مع البقاء على التوافق مع كلمات السر القديمة (Plain Text) + if ($user && (password_verify($password, $user['password']) || $user['password'] === $password)) { + + $limiter->reset(RateLimiter::identifier(), 'login'); + + $jwtService = new JwtService($redis); + $jwt = $jwtService->generateAccessToken($user['id'], 'service', $audience); + $refresh = $jwtService->generateRefreshToken($user['id']); + + jsonSuccess([ + 'jwt' => $jwt, + 'refresh_token' => $refresh['token'], + 'expires_in' => 900 // أو 6600 كما كان في الكود الأصلي + ]); + + } else { + $elapsed = microtime(true) - $startTime; + if ($elapsed < 0.1) usleep((int)((0.1 - $elapsed) * 1000000)); + + securityLog("Service login failed", ['email' => $email]); + jsonError('Invalid email or password', 401); + } + +} catch (PDOException $e) { + securityLog("Service Login PDO Error", ['msg' => $e->getMessage()]); + jsonError('Login failed: Database error', 500); +} catch (Exception $e) { + securityLog("Service Login Error", ['msg' => $e->getMessage()]); + jsonError('Login failed: Server error', 500); +} +``` + +## File: Admin/send_whatsapp_message.php +``` + $receiver, + "type" => "text", + "message" => $message, + "instance_id" => $instanceId, + "access_token"=> $accessToken +]; + +error_log("[send_whatsapp_message.php] Sending payload: " . json_encode($payload)); + +// إرسال الطلب +$response = callAPI("POST", $apiUrl, json_encode($payload)); +error_log("[send_whatsapp_message.php] Raw response: " . print_r($response, true)); + +// فحص الاستجابة +if ($response && !isset($response->error) && (isset($response->status) && $response->status == 'success' || isset($response->message))) { + jsonSuccess(null, "Message sent successfully."); +} else { + $errorMessage = isset($response->message) ? $response->message : "Unknown error."; + error_log("[send_whatsapp_message.php] Failed to send: $errorMessage"); + jsonError("Failed to send message: $errorMessage"); +} + +// دالة cURL +function callAPI($method, $url, $data) +{ + $curl = curl_init(); + curl_setopt_array($curl, [ + CURLOPT_URL => $url, + CURLOPT_RETURNTRANSFER => true, + CURLOPT_ENCODING => "", + CURLOPT_MAXREDIRS => 10, + CURLOPT_TIMEOUT => 30, + CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1, + CURLOPT_CUSTOMREQUEST => $method, + CURLOPT_POSTFIELDS => $data, + CURLOPT_HTTPHEADER => [ + "Content-Type: application/json", + "Accept: application/json" + ], + ]); + $response = curl_exec($curl); + $err = curl_error($curl); + curl_close($curl); + + if ($err) { + error_log("[callAPI] cURL Error: $err"); + return null; + } else { + return json_decode($response); + } +} +?> +``` + +## File: Admin/sendEmailToDrivertransaction.php +``` + + + + + +
+ $appName Logo +

Payment Sent - $appName

+

Thank you for being a valued driver on the $appName platform.

+

We have sent a payment of $totalAmount EGP to your account $accountBank.

+

Please note that it may take a few days for your bank to process this transaction.

+

We appreciate your efforts and are proud to have you on board with $appName.

+

Regards,
tripz Team

+

tripz, Egypt | $domain

+
+ +"; + +// محتوى الإيميل - باللغة العربية +$bodyEmailAr = " + + + + +
+ $appName +

تم إرسال الدفعة - $appName

+

شكرًا لك لكونك سائقًا مميزًا على منصة $appName.

+

لقد تم إرسال دفعة قدرها $totalAmount جنيه إلى حسابك $accountBank.

+

يرجى ملاحظة أن عملية التحويل قد تستغرق بضعة أيام حسب إجراءات البنك.

+

نقدّر جهودك ونتطلع إلى استمرار الشراكة معك على تطبيق $appName.

+

مع التحية،
فريق $appName

+

$appName - مصر | $domain

+
+ +"; + +// إعدادات الإيميل +$supportEmail = 'support@tripz-egypt.com'; +$headers = "MIME-Version: 1.0\r\n"; +$headers .= "Content-Type: text/html; charset=UTF-8\r\n"; +$headers .= "From: tripz Egypt <$supportEmail>\r\n"; + +// إرسال الإيميل إن وُجد عنوان صالح +if (!empty($driverEmail)) { + $subject = "Payment Sent - $appName"; + $message = ($language === 'ar') ? $bodyEmailAr : $bodyEmail; + + if (mail($driverEmail, $subject, $message, $headers)) { + jsonSuccess(null, "Email sent successfully to $driverEmail"); + } else { + jsonError("Failed to send email to $driverEmail"); + } +} else { + jsonError("Invalid or missing driver email address."); +} +?> +``` + +## File: Admin/getPassengerDetails.php +``` +prepare($sql); +$stmt->execute(); +$result = $stmt->fetchAll(PDO::FETCH_ASSOC); + +// ✅ فك التشفير للحقول الحساسة +foreach ($result as &$row) { + $fieldsToDecrypt = [ + "phone", "email", "gender", "birthdate", "site", + "first_name", "last_name", "sosPhone", + "education", "employmentType", "maritalStatus", "passengerToken" + ]; + + foreach ($fieldsToDecrypt as $field) { + if (isset($row[$field]) && $row[$field] !== null) { + $decrypted = $encryptionHelper->decryptData($row[$field]); + if ($decrypted !== false) { + $row[$field] = $decrypted; + } else { + // سجل أو تجاهل القيم التي فشل فك تشفيرها + $row[$field] = null; // أو احتفظ بالقيمة المشفرة + error_log("Failed to decrypt field '$field' for passenger ID: " . $row['id']); + } + } +} +} + +if ($stmt->rowCount() > 0) { + jsonSuccess($data = $result); +} else { + jsonError("No records found"); +} +?> +``` + +## File: Admin/view_errors.php +``` +prepare("SELECT * FROM `error` WHERE `status` = ? ORDER BY `created_at` DESC"); + $stmt->execute(array($status)); +} else { + // إذا لم يتم تحديد status، قم بجلب جميع الأخطاء + $stmt = $con->prepare("SELECT * FROM `error` ORDER BY `created_at` DESC"); + $stmt->execute(); +} + +// جلب جميع النتائج +$errors = $stmt->fetchAll(PDO::FETCH_ASSOC); + +$count = $stmt->rowCount(); + +if ($count > 0) { + // إرجاع البيانات كـ JSON مع رسالة نجاح + echo json_encode(array("status" => "success", "data" => $errors)); +} else { + // في حال عدم وجود أخطاء، إرجاع رسالة نجاح مع بيانات فارغة + echo json_encode(array("status" => "success", "data" => [])); +} + +?> + +``` + +## File: Admin/getPassengerbyEmail.php +``` +encryptData(filterRequest("passengerEmail")); +$passengerId = filterRequest("passengerId"); +$passengerphone = $encryptionHelper->encryptData(filterRequest("passengerphone")); + +$sql = "SELECT + `passengers`.`id`, + `passengers`.`phone`, + `passengers`.`email`, + `passengers`.`gender`, + `passengers`.`status`, + `passengers`.`birthdate`, + `passengers`.`site`, + `passengers`.`first_name`, + `passengers`.`last_name`, + `passengers`.`sosPhone`, + `passengers`.`education`, + `passengers`.`employmentType`, + `passengers`.`maritalStatus`, + `passengers`.`created_at`, + `passengers`.`updated_at`, + ( + SELECT COUNT(`id`) FROM `passengers` + ) AS countPassenger, + ( + SELECT COUNT(`id`) FROM `feedBack` + ) AS countFeedback, + ( + SELECT CAST(AVG(`rating`) AS DECIMAL(10, 2)) FROM `ratingPassenger` + WHERE `passenger_id` = `passengers`.`id` + ) AS ratingPassenger, + ( + SELECT COUNT(`driverID`) FROM `ratingPassenger` + WHERE `passenger_id` = `passengers`.`id` + ) AS countDriverRate, + ( + SELECT COUNT(`passengerID`) FROM `canecl` + WHERE `passengerID` = `passengers`.`id` + ) AS countPassengerCancel, + ( + SELECT CAST(AVG(`rating`) AS DECIMAL(10, 2)) FROM `ratingDriver` + WHERE `passenger_iD` = `passengers`.`id` + ) AS passengerAverageRating, + ( + SELECT COUNT(`driver_id`) FROM `ratingDriver` + WHERE `passenger_id` = `passengers`.`id` + ) AS countPassengerRate, + ( + SELECT COUNT(`passenger_id`) FROM `ride` + WHERE `passenger_id` = `passengers`.`id` + ) AS countPassengerRide, + ( + SELECT `token` FROM `tokens` + WHERE `passengerID` = `passengers`.`id` + ) AS passengerToken +FROM + `passengers` +WHERE + passengers.email = :email OR passengers.phone = :phone OR passengers.id = :id +"; + +$stmt = $con->prepare($sql); +$stmt->bindParam(":email", $passengerEmail); +$stmt->bindParam(":phone", $passengerphone); +$stmt->bindParam(":id", $passengerId); +$stmt->execute(); +$result = $stmt->fetchAll(PDO::FETCH_ASSOC); + +// فك التشفير للحقول الحساسة +foreach ($result as &$row) { + $fieldsToDecrypt = [ + "phone", "email", "gender", "birthdate", "site", + "first_name", "last_name", "sosPhone", + "education", "employmentType", "maritalStatus" + ]; + + foreach ($fieldsToDecrypt as $field) { + if (isset($row[$field])) { + $row[$field] = $encryptionHelper->decryptData($row[$field]); + } + } +} + +if ($stmt->rowCount() > 0) { + jsonSuccess($data = $result); +} else { + jsonError("No records found"); +} +?> +``` + +## File: Admin/errorApp.php +``` +prepare($sql); + +// ربط المتغيرات بالقيم +$stmt->bindParam(':error', $error); +$stmt->bindParam(':userId', $userId); +$stmt->bindParam(':userType', $userType); +$stmt->bindParam(':phone', $phone); +$stmt->bindParam(':device', $device); +$stmt->bindParam(':details', $details); // <-- ربط المتغير الجديد + +$stmt->execute(); + +if ($stmt->rowCount() > 0) { + // طباعة رسالة نجاح + jsonSuccess($message = "Error data saved successfully"); +} else { + // طباعة رسالة فشل + jsonError($message = "Failed to save error data"); +} +?> + +``` + +## File: Admin/getVisaForEachDriver.php +``` + 0 AND total_amount > 100 +LIMIT 0, 25"; + +$stmt = $con->prepare($sql); +$stmt->execute(); +$result = $stmt->fetchAll(PDO::FETCH_ASSOC); + +// فك التشفير للحقول المطلوبة +foreach ($result as &$row) { + $fieldsToDecrypt = ['phone', 'email', 'accountBank', 'bankCode', 'name_arabic']; + foreach ($fieldsToDecrypt as $field) { + if (isset($row[$field]) && $row[$field] !== null) { + $row[$field] = $encryptionHelper->decryptData($row[$field]); + } + } +} + +if ($stmt->rowCount() > 0) { + jsonSuccess($result); +} else { + jsonError("No wallet record found"); +} +?> +``` + +## File: Admin/ggg.php +``` + $adminPhoneParam]); + jsonError('Access denied for this admin phone.', 403); +} + +if (empty($text) || ($action !== 'encrypt' && $action !== 'decrypt')) { + jsonError('Invalid input: need action=encrypt|decrypt and non-empty text.', 400); +} + +// 4) تنفيذ التشفير / الفك (التوافق مع CBC الحالي) +try { + if ($action === 'encrypt') { + $result = $encryptionHelper->encryptData($text); + } else { // decrypt + $result = $encryptionHelper->decryptData($text); + } + + jsonSuccess([ + 'action' => $action, + 'result' => (string) $result, + ]); +} catch (Exception $e) { + securityLog("Encryption tool failed", ['error' => $e->getMessage()]); + jsonError('Operation failed.', 500); +} +``` + +## File: Admin/facebook.php +``` + $appId, + 'app_secret' => $appSecret, + 'default_graph_version' => 'v16.0', // Adjust based on your API version +]); + +try { + // Generate the app token + $appToken = $appId . '|' . $appSecret; + + // Debug the token + $response = $fb->get('/debug_token?input_token=' . $accessToken, $appToken); + $tokenData = $response->getDecodedBody(); + + // Display the token details + echo "Token Data:\n"; + print_r($tokenData); + + if (isset($tokenData['data']['expires_at'])) { + echo "Expires At: " . date('Y-m-d H:i:s', $tokenData['data']['expires_at']) . "\n"; + } else { + echo "The token does not have an expiration time.\n"; + } +} catch (Facebook\Exceptions\FacebookResponseException $e) { + echo 'Graph API Error: ' . $e->getMessage(); +} catch (Facebook\Exceptions\FacebookSDKException $e) { + echo 'SDK Error: ' . $e->getMessage(); +} +``` + +## File: Admin/dashbord.php +``` +prepare($sql); +$stmt->execute(); +$result = $stmt->fetchAll(PDO::FETCH_ASSOC); + +if ($result) { + jsonSuccess($result); +} else { + jsonError("No dashboard data found"); +} +?> +``` + +## File: Admin/getPassengerDetailsByPassengerID.php +``` +prepare($sql); +$stmt->execute(); +$result = $stmt->fetchAll(PDO::FETCH_ASSOC); + +// ✅ فك تشفير الحقول الحساسة +foreach ($result as &$row) { + $fieldsToDecrypt = [ + "phone", "email", "gender", "birthdate", "site", + "first_name", "last_name", "sosPhone", + "education", "employmentType", "maritalStatus", "passengerToken" + ]; + + foreach ($fieldsToDecrypt as $field) { + if (isset($row[$field]) && $row[$field] !== null) { + $row[$field] = $encryptionHelper->decryptData($row[$field]); + } + } +} + +if ($stmt->rowCount() > 0) { + jsonSuccess($result); +} else { + jsonError("No records found"); +} +?> +``` + +## File: Admin/rides/get_driver_live_pos.php +``` +prepare($sql); + $stmt->execute([$driver_id]); + $data = $stmt->fetch(PDO::FETCH_ASSOC); + + if ($data) { + jsonSuccess($data); + } else { + // السائق ليس له موقع مسجل (ربما لم يشغل التطبيق بعد) + jsonError("No location found for this driver"); + } + +} catch (PDOException $e) { + jsonError("Database Error: " . $e->getMessage()); +} +?> +``` + +## File: Admin/rides/admin_get_rides_by_phone.php +``` +encryptData($raw); + +try { + error_log("[get_last_ride] Searching passenger with phone=$raw"); + + // 1) ابحث عن الراكب بالهاتف المشفّر + $selP = $con->prepare(" + SELECT id, first_name, last_name, phone + FROM passengers + WHERE phone =:enc_raw + LIMIT 1 + "); + $selP->execute(['enc_raw' => $enc_raw]); + $passenger = $selP->fetch(PDO::FETCH_ASSOC); + + if (!$passenger) { + error_log("[get_last_ride] Passenger not found (phone=$raw)"); + jsonError('Passenger not found for provided phone'); + exit; + } + + error_log("[get_last_ride] Passenger found id=" . $passenger['id']); + + // 2) آخر رحلة لهذا الراكب + $rideStmt = $con->prepare(" + SELECT + r.id, + r.start_location, + r.end_location, + r.date, + r.time, + r.endtime, + r.status, + r.paymentMethod, + r.carType, + r.price, + r.price_for_driver, + r.price_for_passenger, + r.distance, + r.driver_id, + r.passenger_id, + r.created_at, + r.updated_at, + r.DriverIsGoingToPassenger, + r.rideTimeStart, + r.rideTimeFinish, + d.first_name AS driver_first_name, + d.last_name AS driver_last_name + FROM ride r + LEFT JOIN driver d ON d.id = r.driver_id + WHERE r.passenger_id = :pid + ORDER BY r.created_at DESC, r.id DESC + LIMIT 1 + "); + $rideStmt->execute(['pid' => $passenger['id']]); + $ride = $rideStmt->fetch(PDO::FETCH_ASSOC); + + if (!$ride) { + error_log("[get_last_ride] No rides found for passenger_id=" . $passenger['id']); + jsonError('No rides found for this passenger'); + exit; + } + + error_log("[get_last_ride] Found ride id=" . $ride['id'] . " for passenger_id=" . $passenger['id']); + + // فك التشفير + $passenger['first_name'] = $encryptionHelper->decryptData($passenger['first_name']); + $passenger['last_name'] = $encryptionHelper->decryptData($passenger['last_name']); + $passenger['phone'] = $encryptionHelper->decryptData($passenger['phone']); + $ride['driver_first_name'] = $encryptionHelper->decryptData($ride['driver_first_name']); + $ride['driver_last_name'] = $encryptionHelper->decryptData($ride['driver_last_name']); + + // 3) اطبع النتيجة + $response = [ + 'passenger' => [ + 'id' => $passenger['id'], + 'first_name' => $passenger['first_name'], + 'last_name' => $passenger['last_name'], + 'phone' => $passenger['phone'], + ], + 'ride' => $ride + ]; + + error_log("[get_last_ride] Success response for passenger_id=" . $passenger['id']); + jsonSuccess($response); + +} catch (Throwable $e) { + error_log("[get_last_ride] Exception: " . $e->getMessage()); + jsonError("Error: " . $e->getMessage()); +} +``` + +## File: Admin/rides/get_rides_by_status.php +``` +prepare($sql); + $stmt->execute($params); + $rides = $stmt->fetchAll(PDO::FETCH_ASSOC); + + $data = []; + + foreach ($rides as $row) { + // فك التشفير + try { $row['d_fname'] = $encryptionHelper->decryptData($row['d_fname']); } catch(Exception $e){} + try { $row['d_lname'] = $encryptionHelper->decryptData($row['d_lname']); } catch(Exception $e){} + try { $row['d_phone'] = $encryptionHelper->decryptData($row['d_phone']); } catch(Exception $e){} + + try { $row['p_fname'] = $encryptionHelper->decryptData($row['p_fname']); } catch(Exception $e){} + try { $row['p_lname'] = $encryptionHelper->decryptData($row['p_lname']); } catch(Exception $e){} + try { $row['p_phone'] = $encryptionHelper->decryptData($row['p_phone']); } catch(Exception $e){} + + $row['driver_full_name'] = trim($row['d_fname'] . ' ' . $row['d_lname']); + $row['passenger_full_name'] = trim($row['p_fname'] . ' ' . $row['p_lname']); + + if(empty($row['driver_full_name'])) $row['driver_full_name'] = "Unknown Driver"; + if(empty($row['passenger_full_name'])) $row['passenger_full_name'] = "Unknown Passenger"; + + $data[] = $row; + } + + jsonSuccess($data); + +} catch (PDOException $e) { + jsonError("Database Error: " . $e->getMessage()); +} +?> +``` + +## File: Admin/rides/monitorRide.php +``` +encryptData($phone); +error_log("[MONITOR_RIDE] 2. Encrypted Phone: " . $encPhone); + +// Check Driver Table +$driverQuery = $con->prepare("SELECT id AS driverID FROM driver WHERE phone = :phone LIMIT 1"); +$driverQuery->execute([':phone' => $encPhone]); +$driver = $driverQuery->fetch(PDO::FETCH_ASSOC); + +// Check Passenger Table +$customerQuery = $con->prepare("SELECT id AS customerID FROM passengers WHERE phone = :phone LIMIT 1"); +$customerQuery->execute([':phone' => $encPhone]); +$customer = $customerQuery->fetch(PDO::FETCH_ASSOC); + + +// حدد نوع المستخدم +$userType = ''; +$driverID = null; +$customerID = null; + +if ($driver) { + $userType = 'driver'; + $driverID = $driver['driverID']; + error_log("[MONITOR_RIDE] 3. User Found: Type = DRIVER, ID = " . $driverID); +} elseif ($customer) { + $userType = 'customer'; + $customerID = $customer['customerID']; + error_log("[MONITOR_RIDE] 3. User Found: Type = CUSTOMER, ID = " . $customerID); +} else { + error_log("[MONITOR_RIDE] 3. FAILURE: Phone number not found in Driver or Passenger tables."); + jsonError("رقم الهاتف غير موجود في النظام."); + exit; +} + +//------------------------------------------------------------------------ +// 2) جلب آخر رحلة حالتها "بدأت" بناءً على نوع المستخدم +//------------------------------------------------------------------------ + +if ($userType == 'driver') { + error_log("[MONITOR_RIDE] 4. Searching for active ride for Driver ID: " . $driverID); + $rideQuery = $con->prepare(" + SELECT * FROM ride + WHERE driver_id = :driverID AND status = 'Begin' + ORDER BY id DESC LIMIT 1 + "); + $rideQuery->execute([':driverID' => $driverID]); +} else { + error_log("[MONITOR_RIDE] 4. Searching for active ride for Customer ID: " . $customerID); + $rideQuery = $con->prepare(" + SELECT * FROM ride + WHERE passenger_id = :customerID AND status = 'Begin' + ORDER BY id DESC LIMIT 1 + "); + $rideQuery->execute([':customerID' => $customerID]); +} + +$ride = $rideQuery->fetch(PDO::FETCH_ASSOC); + +if (!$ride) { + error_log("[MONITOR_RIDE] 4. FAILURE: No ride with status 'Begin' found."); + jsonError("لا توجد رحلة بدأت لهذا المستخدم."); + exit; +} else { + error_log("[MONITOR_RIDE] 4. SUCCESS: Active Ride Found. Ride ID: " . $ride['id']); +} + +//------------------------------------------------------------------------ +// 3) جلب معلومات السائق من الرحلة +//------------------------------------------------------------------------ + +// FIX 1: Safe assignment of driver ID (checking driverID vs driver_id) +$rideDriverID = $ride['driverID'] ?? $ride['driver_id']; + +error_log("[MONITOR_RIDE] 5. Fetching info for Driver ID from Ride: " . $rideDriverID); + +// FIX 2: Select first_name and last_name instead of fullname +$driverInfoQuery = $con->prepare(" + SELECT id, first_name, last_name, phone + FROM driver + WHERE id = :driverID + LIMIT 1 +"); + +$driverInfoQuery->execute([':driverID' => $rideDriverID]); +$driverInfo = $driverInfoQuery->fetch(PDO::FETCH_ASSOC); + +if ($driverInfo) { + // فك التشفير للهاتف + $driverInfo['phone'] = $encryptionHelper->decryptData($driverInfo['phone']); + + // FIX 4: Decrypt First Name and Last Name + $driverInfo['first_name'] = $encryptionHelper->decryptData($driverInfo['first_name']); + $driverInfo['last_name'] = $encryptionHelper->decryptData($driverInfo['last_name']); + + // Construct fullname for the response + $fullName = $driverInfo['first_name'] . " " . $driverInfo['last_name']; + $driverInfo['fullname'] = $fullName; + + error_log("[MONITOR_RIDE] 5. Driver Info Found: " . $fullName); +} else { + error_log("[MONITOR_RIDE] 5. WARNING: Driver info not found for ID " . $rideDriverID); +} + +//------------------------------------------------------------------------ +// 4) جلب آخر موقع للسائق من جدول driver_location بشرط الحالة ON +//------------------------------------------------------------------------ + +error_log("[MONITOR_RIDE] 6. Querying Tracking DB for Driver ID: " . $rideDriverID); + +// FIX 3: Changed ORDER BY id DESC to ORDER BY updated_at DESC +$locationQuery = $con_tracking->prepare(" + SELECT latitude, longitude, speed, heading, updated_at + FROM car_locations + WHERE driver_id = :driverID AND status = 'ON' + ORDER BY updated_at DESC LIMIT 1 +"); +$locationQuery->execute([':driverID' => $rideDriverID]); +$location = $locationQuery->fetch(PDO::FETCH_ASSOC); + +if ($location) { + error_log("[MONITOR_RIDE] 6. Location Found: Lat=" . $location['latitude'] . " Lng=" . $location['longitude'] . " Updated=" . $location['updated_at']); +} else { + error_log("[MONITOR_RIDE] 6. WARNING: No live location found (status=ON) or list empty."); +} + +//------------------------------------------------------------------------ +// 5) تجهيز البيانات للرد +//------------------------------------------------------------------------ + +$response = [ + "ride_details" => $ride, + "driver_details" => $driverInfo, + "driver_location" => $location ?: "No live location" +]; + +error_log("[MONITOR_RIDE] 7. Sending Success Response."); +jsonSuccess($response); + +?> +``` + +## File: Admin/rides/admin_update_ride_status.php +``` +beginTransaction(); + + // إن أردت ختم وقت النهاية تلقائيًا عند الإكمال + if ($status === 'Completed') { + $sql = "UPDATE ride + SET status = :st, rideTimeFinish = IFNULL(rideTimeFinish, NOW()), updated_at = CURRENT_TIMESTAMP + WHERE id = :id"; + } else { + $sql = "UPDATE ride + SET status = :st, updated_at = CURRENT_TIMESTAMP + WHERE id = :id"; + } + + $stmt = $con->prepare($sql); + $ok = $stmt->execute(['st' => $status, 'id' => $rideId]); + + if (!$ok || $stmt->rowCount() === 0) { + $con->rollBack(); + jsonError("Ride not found or no change"); + exit; + } + + // أعِدّ بيانات الرحلة المحدّثة (للتحديث الفوري في الواجهة) + $fetch = $con->prepare(" + SELECT + r.id, + r.start_location, + r.end_location, + r.date, + r.time, + r.endtime, + r.status, + r.paymentMethod, + r.carType, + r.price, + r.price_for_driver, + r.price_for_passenger, + r.distance, + r.driver_id, + r.passenger_id, + r.created_at, + r.updated_at, + r.DriverIsGoingToPassenger, + r.rideTimeStart, + r.rideTimeFinish, + d.first_name AS driver_first_name, + d.last_name AS driver_last_name + FROM ride r + LEFT JOIN driver d ON d.id = r.driver_id + WHERE r.id = :id + LIMIT 1 + "); + $fetch->execute(['id' => $rideId]); + $ride = $fetch->fetch(PDO::FETCH_ASSOC); + + $con->commit(); + jsonSuccess(['ride' => $ride, 'message' => 'Status updated']); +} catch (Throwable $e) { + if ($con->inTransaction()) $con->rollBack(); + jsonError("Error: ".$e->getMessage()); +} +``` + +## File: Admin/AdminCaptain/add.php +``` + +``` + +## File: Admin/AdminCaptain/update.php +``` + +``` + +## File: Admin/AdminCaptain/get.php +``` +prepare($sql); +$stmt->execute(); +$result = $stmt->fetchAll(PDO::FETCH_ASSOC); + +// فك تشفير الحقول الحساسة +foreach ($result as &$row) { + $row['phone'] = $encryptionHelper->decryptData($row['phone']); + $row['email'] = $encryptionHelper->decryptData($row['email']); + $row['gender'] = $encryptionHelper->decryptData($row['gender']); + $row['birthdate'] = $encryptionHelper->decryptData($row['birthdate']); + $row['site'] = $encryptionHelper->decryptData($row['site']); + $row['first_name'] = $encryptionHelper->decryptData($row['first_name']); + $row['last_name'] = $encryptionHelper->decryptData($row['last_name']); + $row['employmentType'] = $encryptionHelper->decryptData($row['employmentType']); + $row['maritalStatus'] = $encryptionHelper->decryptData($row['maritalStatus']); +} + +if (count($result) > 0) { + jsonSuccess($result); +} else { + jsonError("No records found"); +} +?> +``` + +## File: Admin/AdminCaptain/getCaptainDetailsByEmailOrIDOrPhone.php +``` +encryptData(filterRequest("driverEmail")); +$driverPhone = $encryptionHelper->encryptData(filterRequest("driverPhone")); + +$sql = "SELECT + `driver`.`id`, + `driver`.`phone`, + `driver`.`email`, + `driver`.`gender`, + `driver`.`status`, + `driver`.`birthdate`, + `driver`.`site`, + `driver`.`first_name`, + `driver`.`last_name`, + `driver`.`education`, + `driver`.`employmentType`, + `driver`.`maritalStatus`, + `driver`.`created_at`, + `driver`.`updated_at`, + ( + SELECT COUNT(*) FROM `driver` + ) AS countPassenger, + ( + SELECT CAST(AVG(`rating`) AS DECIMAL(10, 2)) + FROM `ratingPassenger` + WHERE `ratingPassenger`.`driverID` = `driver`.`id` + ) AS ratingPassenger, + ( + SELECT COUNT(*) FROM `ratingPassenger` WHERE `driverID` = `driver`.`id` + ) AS countDriverRate, + ( + SELECT COUNT(*) FROM `canecl` WHERE `driverID` = `driver`.`id` + ) AS countPassengerCancel, + ( + SELECT CAST(AVG(`rating`) AS DECIMAL(10, 2)) + FROM `ratingDriver` + WHERE `driver_id` = `driver`.`id` + ) AS passengerAverageRating, + ( + SELECT COUNT(*) FROM `ratingDriver` WHERE `driver_id` = `driver`.`id` + ) AS countPassengerRate, + ( + SELECT COUNT(*) FROM `ride` WHERE `driver_id` = `driver`.`id` + ) AS countPassengerRide, + ( + SELECT `token` + FROM `driverToken` + WHERE `captain_id` = `driver`.`id` + LIMIT 1 + ) AS passengerToken +FROM `driver` +WHERE `driver`.`email` = :email OR `driver`.`phone` = :phone OR `driver`.`id` = :id +ORDER BY passengerAverageRating DESC +LIMIT 10 +"; + +$stmt = $con->prepare($sql); +$stmt->bindParam(":email", $driverEmail); +$stmt->bindParam(":phone", $driverPhone); +$stmt->bindParam(":id", $driver_id); +$stmt->execute(); +$result = $stmt->fetchAll(PDO::FETCH_ASSOC); + +// فك تشفير الحقول الحساسة +foreach ($result as &$row) { + $row['phone'] = $encryptionHelper->decryptData($row['phone']); + $row['email'] = $encryptionHelper->decryptData($row['email']); + $row['gender'] = $encryptionHelper->decryptData($row['gender']); + $row['birthdate'] = $encryptionHelper->decryptData($row['birthdate']); + $row['site'] = $encryptionHelper->decryptData($row['site']); + $row['first_name'] = $encryptionHelper->decryptData($row['first_name']); + $row['last_name'] = $encryptionHelper->decryptData($row['last_name']); + $row['education'] = $encryptionHelper->decryptData($row['education']); + $row['employmentType'] = $encryptionHelper->decryptData($row['employmentType']); + $row['maritalStatus'] = $encryptionHelper->decryptData($row['maritalStatus']); +} + +if ($stmt->rowCount() > 0) { + jsonSuccess($result); +} else { + jsonError("No records found"); +} +?> +``` + +## File: Admin/AdminCaptain/getCaptainDetailsById.php +``` +prepare($sql); +$stmt->bindParam(':driver_id', $driver_id); +$stmt->execute(); + +$result = $stmt->fetchAll(PDO::FETCH_ASSOC); + +// فك تشفير الحقول الحساسة بعد الجلب +foreach ($result as &$row) { + $row['phone'] = $encryptionHelper->decryptData($row['phone']); + $row['email'] = $encryptionHelper->decryptData($row['email']); + $row['gender'] = $encryptionHelper->decryptData($row['gender']); + $row['birthdate'] = $encryptionHelper->decryptData($row['birthdate']); + $row['site'] = $encryptionHelper->decryptData($row['site']); + $row['first_name'] = $encryptionHelper->decryptData($row['first_name']); + $row['last_name'] = $encryptionHelper->decryptData($row['last_name']); + $row['education'] = $encryptionHelper->decryptData($row['education']); + $row['employmentType'] = $encryptionHelper->decryptData($row['employmentType']); + $row['maritalStatus'] = $encryptionHelper->decryptData($row['maritalStatus']); +} + +if ($stmt->rowCount() > 0) { + jsonSuccess($result); +} else { + jsonError("No records found"); +} +?> +``` + +## File: Admin/AdminCaptain/delete.php +``` + +``` + +## File: Admin/AdminCaptain/getDriversPhonesAndTokens.php +``` +prepare($sql); +$stmt->execute(); +$result = $stmt->fetchAll(PDO::FETCH_ASSOC); + +// فك التشفير للحقول الحساسة +foreach ($result as &$row) { + $row['phone'] = $encryptionHelper->decryptData($row['phone']); + if (!empty($row['token'])) { + $row['token'] = $encryptionHelper->decryptData($row['token']); + } +} + +if ($stmt->rowCount() > 0) { + jsonSuccess($result); +} else { + jsonError("No records found"); +} +?> +``` + +## File: Admin/auth/login.php +``` +prepare("SELECT * FROM adminUser WHERE device_number = ? AND name = ?"); +$stmt->execute([$device, $phone]); + +if ($stmt->rowCount() > 0) { + $admin = $stmt->fetch(PDO::FETCH_ASSOC); + + // يمكن لاحقًا توليد توكن أو بيانات أخرى + printSuccess([ + "message" => "تم التحقق بنجاح", + "admin" => $admin, + ]); +} else { + jsonError("بيانات الدخول غير صحيحة أو غير مسجلة."); +} +``` + +## File: Admin/auth/send_otp_admin.php +``` +prepare("INSERT INTO token_verification_admin (phone_number, token, expiration_time) + VALUES (?, ?, DATE_ADD(NOW(), INTERVAL 5 MINUTE)) + ON DUPLICATE KEY UPDATE token = VALUES(token), expiration_time = VALUES(expiration_time)"); + $stmt->execute([$receiver, $otp]); + // error_log("[send_otp_admin] OTP saved to database successfully for $receiver"); + + jsonSuccess(null, "OTP sent successfully."); + } catch (PDOException $e) { + // error_log("[send_otp_admin] Database error: " . $e->getMessage()); + jsonError("حدث خطأ في حفظ الرمز."); + } +} else { + // error_log("[send_otp_admin] Failed to send WhatsApp message to $receiver"); + jsonError("فشل في إرسال الرمز عبر WhatsApp."); +} + +//error_log("--- [send_otp_admin] Script ended ---"); +?> +``` + +## File: Admin/auth/verify_otp_admin.php +``` +prepare("SELECT * FROM token_verification_admin + WHERE phone_number = ? AND token = ? + AND expiration_time >= NOW()"); +$stmt->execute([$phone, $otp]); + +if ($stmt->rowCount() > 0) { + // ✅ تحقق ناجح - ننتقل إلى إدخال أو تحديث سجل adminUser + + // تحقق إن كان المستخدم موجود مسبقًا + $checkAdmin = $con->prepare("SELECT * FROM adminUser WHERE name = ?"); + $checkAdmin->execute([$phone]); + + $now = date("Y-m-d H:i:s"); + + if ($checkAdmin->rowCount() > 0) { + // المستخدم موجود ✅ تحديث device_number و updated_at + $update = $con->prepare("UPDATE adminUser + SET device_number = ?, updated_at = ? + WHERE name = ?"); + $update->execute([$deviceNumber, $now, $phone]); + jsonSuccess(["message" => "verified and updated existing admin"]); + } else { + // المستخدم غير موجود ✅ إدخال جديد + $insert = $con->prepare("INSERT INTO adminUser (device_number, name, created_at, updated_at) + VALUES (?, ?, ?, ?)"); + $insert->execute([$deviceNumber, $phone, $now, $now]); + jsonSuccess(["message" => "verified and new admin created"]); + } + +} else { + // ❌ رمز التحقق غير صالح + jsonError("رمز التحقق غير صالح أو منتهي."); +} +``` + +## File: Admin/driver/remove_from_blacklist.php +``` +encryptData($phone); + + $sql = "DELETE FROM blacklist_driver WHERE phone = :phone"; + $stmt = $con->prepare($sql); + $stmt->execute([':phone' => $encPhone]); + + if ($stmt->rowCount() > 0) { + jsonSuccess(null, "Driver removed from blacklist successfully."); + } else { + jsonError("No driver found in blacklist with this phone."); + } + +} catch (PDOException $e) { + jsonError("Error removing from blacklist: " . $e->getMessage()); +} +``` + +## File: Admin/driver/find_driver_by_phone.php +``` +encryptData($phone); + + // احضار كل الأعمدة باستثناء كلمة المرور + $sql = "SELECT * + FROM driver + WHERE phone = :phone + LIMIT 1"; + $stmt = $con->prepare($sql); + $stmt->execute([':phone' => $encPhone]); + + $driver = $stmt->fetch(PDO::FETCH_ASSOC); + + if ($driver) { + // ✅ الحقول المشفرة اللي لازم تنفك: + $encryptedFields = [ + 'phone', + 'email', + 'first_name', + 'last_name', + 'national_number', + 'address','gender','site', + 'birthdate', + 'name_arabic', + ]; + + foreach ($encryptedFields as $field) { + if (!empty($driver[$field])) { + $driver[$field] = $encryptionHelper->decryptData($driver[$field]); + } + } + + // ❌ احذف كلمة المرور من النتيجة + unset($driver['password']); + + jsonSuccess($driver); + + } else { + jsonError("No driver found with this phone."); + } + +} catch (PDOException $e) { + jsonError("Error searching driver: " . $e->getMessage()); +} +``` + +## File: Admin/driver/deleteCaptain.php +``` +encryptData($phone); + + // حذف السائق من جدول driver + $sqlDel = "DELETE FROM driver WHERE id = :id"; + $stmtDel = $con->prepare($sqlDel); + $stmtDel->bindParam(':id', $driver_id, PDO::PARAM_INT); + $stmtDel->execute(); + + if ($stmtDel->rowCount() > 0) { + // إضافة بيانات السائق المحذوف إلى البلاك ليست + $sqlInsert = "INSERT INTO blacklist_driver (driver_id, phone, reason) + VALUES (:driver_id, :phone, :reason)"; + $stmtInsert = $con->prepare($sqlInsert); + $stmtInsert->execute([ + 'driver_id' => $driver_id, + 'phone' => $encPhone, + 'reason' => !empty($reason) ? $reason : "Deleted & blacklisted by admin" + ]); + + jsonSuccess(null, "Driver deleted and blacklisted successfully."); + } else { + jsonError("No driver found with the provided ID."); + } + +} catch (PDOException $e) { + jsonError("Error: " . $e->getMessage()); +} +``` + +## File: Admin/driver/updateDriverFromAdmin.php +``` +encryptData($phone); + +$sql = "UPDATE `driver` SET `phone` = :encphone WHERE `id` = :id"; +$stmt = $con->prepare($sql); + +// Bind values +$stmt->bindParam(':encphone', $encphone, PDO::PARAM_STR); +$stmt->bindParam(':id', $driver_id, PDO::PARAM_STR); + +try { + $stmt->execute(); + + if ($stmt->rowCount() > 0) { + // تم التحديث بنجاح + jsonSuccess(null, "Phone updated successfully."); + } else { + // لم يتم العثور على أي سجل للتحديث + jsonError("No records updated. Please check the driver ID."); + } +} catch (PDOException $e) { + jsonError("Error updating record: " . $e->getMessage()); +} +?> +``` + +## File: Admin/driver/getDriverGiftPayment.php +``` +encryptData($phone); + +$sql = "SELECT + * + FROM + `driver` + WHERE + phone = :encPhone"; + +$stmt = $con->prepare($sql); + +// FIX 1: Bind AFTER preparing the statement +// FIX 2: Use the same placeholder name (:encPhone) +$stmt->bindParam(':encPhone', $encphone, PDO::PARAM_STR); + +$stmt->execute(); + +if ($stmt->rowCount() > 0) { + + $rows = $stmt->fetchAll(PDO::FETCH_ASSOC); + + // Decrypt sensitive fields + foreach ($rows as &$row) { + if (!empty($row['phone'])) { + $row['phone'] = $encryptionHelper->decryptData($row['phone']); + } + if (!empty($row['name_arabic'])) { + $row['name_arabic'] = $encryptionHelper->decryptData($row['name_arabic']); + } + } + + jsonSuccess($rows); + +} else { + jsonError("No recent driver location activity found"); +} + +?> + +``` + +## File: Admin/driver/getBestDriver.php +``` + TIMESTAMP(DATE_SUB(NOW(), INTERVAL 7 DAY)) +GROUP BY + driver.id +ORDER BY + driver_count DESC +LIMIT 19; +"; + +$stmt = $con->prepare($sql); +$stmt->execute(); + +if ($stmt->rowCount() > 0) { + $rows = $stmt->fetchAll(PDO::FETCH_ASSOC); + + // فك التشفير للحقول الحساسة + foreach ($rows as &$row) { + if (!empty($row['phone'])) { + $row['phone'] = $encryptionHelper->decryptData($row['phone']); + } + if (!empty($row['name_arabic'])) { + $row['name_arabic'] = $encryptionHelper->decryptData($row['name_arabic']); + } + if (!empty($row['token'])) { + $row['token'] = $encryptionHelper->decryptData($row['token']); + } + } + + jsonSuccess($rows); +} else { + jsonError($message = "No recent driver location activity found"); +} + +?> +``` + +## File: Admin/driver/deleteRecord.php +``` +prepare($sql); + +// Bind the driver_id parameter +$stmt->bindParam(':driver_id', $driver_id, PDO::PARAM_STR); + +try { + // Execute the query + $stmt->execute(); + + if ($stmt->rowCount() > 0) { + // Success response + jsonSuccess(null, "Record(s) deleted successfully."); + } else { + // Failure response: no records found to delete + jsonError("No records found for the provided driver ID."); + } +} catch (PDOException $e) { + // Handle any SQL errors + jsonError("Error deleting records: " . $e->getMessage()); +} + +?> +``` + +## File: Admin/AdminRide/get.php +``` +prepare($sql); +$stmt->execute(); +$result = $stmt->fetchAll(PDO::FETCH_ASSOC); + +if ($stmt->rowCount() > 0) { + jsonSuccess($result); +} else { + jsonError("No records found"); +} +?> +``` + +## File: Admin/AdminRide/getRidesPerMonth.php +``` +prepare($sql); +$stmt->execute(); +$dailyRides = $stmt->fetchAll(PDO::FETCH_ASSOC); + +// SQL to get current month's total ride count +$sqlMonth = " +SELECT COUNT(*) AS current_month_rides_count +FROM ride +WHERE MONTH(date) = :currentMonth AND YEAR(date) = :currentYear +"; +$stmtMonth = $con->prepare($sqlMonth); +$stmtMonth->bindParam(':currentMonth', $currentMonth); +$stmtMonth->bindParam(':currentYear', $currentYear); +$stmtMonth->execute(); +$monthRides = $stmtMonth->fetch(PDO::FETCH_ASSOC); + +// Append current month total to each row (if needed) +foreach ($dailyRides as &$row) { + $row['current_month_rides_count'] = $monthRides['current_month_rides_count']; +} + +// Return result +if ($dailyRides) { + jsonSuccess($dailyRides); +} else { + jsonError("No records found"); +} +?> +``` + +## File: Admin/passenger/admin_update_passenger.php +``` +encryptData($new_phone); + $first_name = $encryptionHelper->encryptData($first_name); + $last_name = $encryptionHelper->encryptData($last_name); + + $enc_norm = $encryptionHelper->encryptData($norm); +if ($first_name !== null) { $sets[] = "first_name = :first_name"; $params['first_name'] = trim($first_name); } +if ($last_name !== null) { $sets[] = "last_name = :last_name"; $params['last_name'] = trim($last_name); } +if ($new_phone !== null) { + $sets[] = "phone = :phone"; + $params['phone'] = trim($new_phone); + + // منع تكرار الهاتف على راكب آخر + $q = $con->prepare("SELECT id FROM passengers WHERE phone = :ph LIMIT 1"); + $q->execute(['ph' => $params['phone']]); + $row = $q->fetch(PDO::FETCH_ASSOC); + if ($row) { + if (!empty($id) && $row['id'] != $id) { jsonError("Phone already used by another passenger"); exit; } + if (empty($id) && $row['id'] != $phoneLookup) { jsonError("Phone already used by another passenger"); exit; } + } +} + +$whereSql = ""; +$whereParams = []; +if (!empty($id)) { $whereSql = "id = :pid"; $whereParams['pid'] = $id; } +else { $whereSql = "phone = :plk"; $whereParams['plk'] = $phoneLookup; } + +$sql = "UPDATE passengers SET ".implode(", ", $sets).", updated_at = CURRENT_TIMESTAMP WHERE $whereSql"; +$stmt = $con->prepare($sql); +$ok = $stmt->execute(array_merge($params, $whereParams)); + +if ($ok && $stmt->rowCount() > 0) { jsonSuccess(null, "Passenger updated"); } +else { jsonError("No change or passenger not found"); } +``` + +## File: Admin/passenger/admin_unblacklist.php +``` +prepare("DELETE FROM passenger_blacklist WHERE phone_normalized = :phn"); +$stmt->execute(['phn' => $phn]); + +if ($stmt->rowCount() > 0) { jsonSuccess(null, "Removed from blacklist"); } +else { jsonError("Phone was not blacklisted"); } +``` + +## File: Admin/passenger/admin_delete_and_blacklist_passenger.php +``` +beginTransaction(); + + // احضر السجل + if (!empty($id)) { + $sel = $con->prepare("SELECT id, phone FROM passengers WHERE id = :id LIMIT 1"); + $sel->execute(['id' => $id]); + } else { + $sel = $con->prepare("SELECT id, phone FROM passengers WHERE phone = :ph LIMIT 1"); + $sel->execute(['ph' => $phone]); + } + $p = $sel->fetch(PDO::FETCH_ASSOC); + if (!$p) { throw new Exception("Passenger not found"); } + + $phRaw = $p['phone']; + $phNorm= normalize_phone($phRaw); + + // أدخِل/حدّث في البلاك ليست + $ins = $con->prepare(" + INSERT INTO passenger_blacklist (phone, phone_normalized, reason, expires_at) + VALUES (:ph, :phn, :r, :exp) + ON DUPLICATE KEY UPDATE reason = VALUES(reason), expires_at = VALUES(expires_at) + "); + $ins->execute([ + 'ph' => $phRaw, + 'phn' => $phNorm, + 'r' => $reason ?: 'Deleted & blacklisted', + 'exp' => $exp ?: null + ]); + + // حذف فعلي + $del = $con->prepare("DELETE FROM passengers WHERE id = :id"); + $del->execute(['id' => $p['id']]); + + $con->commit(); + jsonSuccess(null, "Passenger deleted and blacklisted"); +} catch (Throwable $e) { + $con->rollBack(); + jsonError("Failed: ".$e->getMessage()); +} +``` + +## File: Admin/employee/add.php +``` +prepare($sql); +$stmt->execute([$id, $name, $education, $site, $phone, $created_at, $status]); + +// Check if the query successfully inserted the record +if ($stmt->rowCount() > 0) { + // If a row was inserted, print success + jsonSuccess($message = "Employee record added successfully"); +} else { + // If no rows were inserted, print failure + jsonError($message = "Failed to add employee record"); +} +?> +``` + +## File: Admin/employee/get.php +``` +prepare($sql); +$stmt->execute(); + +// Fetch all records as an associative array +$employee_data = $stmt->fetchAll(PDO::FETCH_ASSOC); + +// Check if any records were retrieved +if ($employee_data) { + // If records were found, print the data as JSON + jsonSuccess($data = $employee_data); +} else { + // If no records were found, print a failure message + jsonError($message = "No employee records found"); +} +?> +``` + +## File: Admin/error/error_list_last20.php +``` +prepare($sql); + $stmt->execute(); + $rows = $stmt->fetchAll(PDO::FETCH_ASSOC); + + jsonSuccess($rows); +} catch (Exception $e) { + error_log("error_list_last20.php: " . $e->getMessage()); + jsonError($message = "Failed to fetch last 20 errors"); +} +``` + +## File: Admin/error/error_search_by_phone.php +``` +encryptData(trim($phone)); + // ثم بدّل الحقل في WHERE إلى phone = :ph + $sql = "SELECT `id`, `error`, `userId`, `userType`, `phone`, `created_at`, `device`, `details`, `status` + FROM `error` + WHERE `phone` = :ph OR `phone` LIKE :phLike + ORDER BY `created_at` DESC + LIMIT 20"; + + $stmt = $con->prepare($sql); + $stmt->execute([ + ":ph" => trim($phone), + ":phLike" => '%' . trim($phone) . '%', // يسمح بجزء من الرقم إن أردت + ]); + + $rows = $stmt->fetchAll(PDO::FETCH_ASSOC); + jsonSuccess($rows); +} catch (Exception $e) { + error_log("error_search_by_phone.php: " . $e->getMessage()); + jsonError($message = "Failed to search errors by phone"); +} +``` + +## File: Admin/adminUser/add.php +``` +prepare($sql); +$stmt->bindParam(':deviceNumber', $deviceNumber); +$stmt->bindParam(':name', $name); +$stmt->execute(); + +if ($stmt->rowCount() > 0) { + // Print a success message + jsonSuccess($message = "Admin user data saved successfully"); +} else { + // Print a failure message + jsonError($message = "Failed to save admin user data"); +} +?> + +``` + +## File: Admin/adminUser/update.php +``` + +``` + +## File: Admin/adminUser/get.php +``` +prepare($sql); +$stmt->execute(); +$result = $stmt->fetchAll(PDO::FETCH_ASSOC); + +if (count($result) === 1) { + // Print the first record as a success message + jsonSuccess($result[0]); +} else { + // Print a failure message + jsonError($message = "Failed to retrieve Password or user name incorrect"); +} +?> +``` + +## File: Admin/adminUser/invoice_total.php +``` +prepare("SELECT * FROM invoice_records ORDER BY date DESC"); + $stmt->execute(); + $invoices = $stmt->fetchAll(PDO::FETCH_ASSOC); + + // ✅ حساب عدد الفواتير ومجموع المبالغ + $count = count($invoices); + $totalAmount = array_sum(array_column($invoices, 'amount')); + + echo json_encode([ + "status" => "success", + "data" => $invoices, + "summary" => [ + "count" => $count, + "total" => $totalAmount + ] + ]); +} catch (PDOException $e) { + echo json_encode([ + "status" => "error", + "message" => "Database error: " . $e->getMessage() + ]); +} +?> +``` + +## File: Admin/adminUser/add_invoice.php +``` + 'error', 'message' => 'Invalid file type.']); + exit; + } + + $new_filename = $invoiceNumber . "_" . $driverID . '.' . $image_extension; + $target_dir = "invoice_images/"; + $target_file = $target_dir . $new_filename; + + if (!is_dir($target_dir)) { + if (!mkdir($target_dir, 0755, true)) { + error_log("[add_invoice.php] ❌ Failed to create directory: $target_dir"); + } + } + + if (!move_uploaded_file($image_file['tmp_name'], $target_file)) { + error_log("[add_invoice.php] ❌ Failed to move uploaded file."); + echo json_encode(['status' => 'error', 'message' => 'Failed to upload image.']); + exit; + } + + $linkImage = 'https://intaleq.xyz/intaleq/Admin/adminUser/invoice_images/' . $new_filename; + error_log("[add_invoice.php] ✅ Image uploaded successfully: $linkImage"); +} + +try { + $stmt = $con->prepare("INSERT INTO invoice_records (driverID, invoice_number,name, amount, date, image_link, created_at) + VALUES (?, ?, ?,?, ?, ?, ?)"); + $stmt->execute([$driverID, $invoiceNumber,$name, $amount, $date, $linkImage, $uploadDate]); + + echo json_encode([ + 'status' => 'success', + 'message' => 'Invoice data saved.', + 'image' => $linkImage + ]); + + error_log("[add_invoice.php] ✅ Invoice saved successfully."); +} catch (PDOException $e) { + $errorMsg = $e->getMessage(); + error_log("[add_invoice.php] 🛑 PDO ERROR: $errorMsg"); + + echo json_encode([ + 'status' => 'error', + 'message' => "Database error: $errorMsg" + ]); +} +``` + +## File: Admin/adminUser/delete.php +``` + +``` + +## File: EgyptDocuments/uploadEgyptIdBack.php +``` + "Failed to save image")); ; + exit; +} + +// Store additional information (modify based on your needs) +$image_url = $target_dir . $new_filename; // Update if needed +$image_details = [ + "name" => $image_name, + "size" => $image_size, + "extension" => $image_extension, + "url" => $image_url, +]; + +// Use the image details for further processing (e.g., display, store in database) +// ... + + echo json_encode(array('status' => 'Image uploaded successfully!')); + +?> + +``` + +## File: EgyptDocuments/uploadEgyptidFront.php +``` + "Failed to save image")); ; + exit; +} + +// Store additional information (modify based on your needs) +$image_url = $target_dir . $new_filename; // Update if needed +$image_details = [ + "name" => $image_name, + "size" => $image_size, + "extension" => $image_extension, + "url" => $image_url, +]; + +// Use the image details for further processing (e.g., display, store in database) +// ... + + echo json_encode(array('status' => 'Image uploaded successfully!')); + +?> + +``` + +## File: driver_assurance/add.php +``` +encryptData($assured); +// $health_insurance_provider = $encryptionHelper->encryptData($health_insurance_provider); + +// SQL using bind parameters +$sql = "INSERT INTO `driver_health_assurance` ( + `driver_id`, + `assured`, + `health_insurance_provider` +) VALUES ( + :driver_id, + :assured, + :health_insurance_provider +)"; + +$stmt = $con->prepare($sql); +$stmt->bindParam(':driver_id', $driver_id); +$stmt->bindParam(':assured', $assured); +$stmt->bindParam(':health_insurance_provider', $health_insurance_provider); + +if ($stmt->execute()) { + jsonSuccess(null, "Health assurance data saved successfully"); +} else { + jsonError("Failed to save health assurance data"); +} +?> +``` + +## File: driver_assurance/update.php +``` + +``` + +## File: driver_assurance/get.php +``` + +``` + +## File: migration/get_all_driver_fingerprints.php +``` + + 'Forbidden'])); +} + +try { + $stmt = $con->prepare(' + SELECT captain_id, fingerPrint + FROM driverToken + WHERE fingerPrint IS NOT NULL + AND fingerPrint != "" + ORDER BY captain_id + '); + $stmt->execute(); + $rows = $stmt->fetchAll(PDO::FETCH_ASSOC); + + echo json_encode([ + 'status' => 'success', + 'count' => count($rows), + 'data' => $rows, + ]); + +} catch (Exception $e) { + error_log('❌ [get_all_driver_fingerprints] ' . $e->getMessage()); + http_response_code(500); + echo json_encode(['error' => 'Server error']); +} + +``` + +## File: migration/get_all_fingerprints.php +``` + 'Forbidden']); + exit; +} + +try { + // جلب كل البصمات من جدول tokens + // نجيب passengerID + fingerPrint فقط — لا نعطي بيانات حساسة أخرى + $stmt = $con->prepare(' + SELECT passengerID, fingerPrint, "passenger" AS userType + FROM tokens + WHERE fingerPrint IS NOT NULL + AND fingerPrint != "" + ORDER BY passengerID + '); + $stmt->execute(); + $rows = $stmt->fetchAll(PDO::FETCH_ASSOC); + + echo json_encode([ + 'status' => 'success', + 'count' => count($rows), + 'data' => $rows, + ]); + http_response_code(200); + +} catch (Exception $e) { + error_log('❌ [get_all_fingerprints] ' . $e->getMessage()); + http_response_code(500); + echo json_encode(['error' => 'Server error']); +} +``` + +## File: migration/update_driver_fingerprint_admin.php +``` + + 'Forbidden'])); +} + +try { + $captainId = filterRequest('captain_id') ?? ''; + $fingerprint = filterRequest('fingerprint') ?? ''; + + if (empty($captainId) || empty($fingerprint)) { + http_response_code(400); + exit(json_encode(['error' => 'Missing parameters'])); + } + + $stmt = $con->prepare(' + UPDATE driverToken + SET fingerPrint = :fp + WHERE captain_id = :cid + '); + $stmt->execute([':fp' => $fingerprint, ':cid' => $captainId]); + + echo json_encode(['status' => 'success', 'affected' => $stmt->rowCount()]); + +} catch (Exception $e) { + error_log('❌ [update_driver_fingerprint_admin] ' . $e->getMessage()); + http_response_code(500); + echo json_encode(['error' => 'Server error']); +} +``` + +## File: migration/update_fingerprint_admin.php +``` + 'Forbidden']); + exit; +} + +try { + $passengerID = filterRequest('passengerID') ?? ''; + $fingerprint = filterRequest('fingerprint') ?? ''; + + if (empty($passengerID) || empty($fingerprint)) { + http_response_code(400); + echo json_encode(['error' => 'Missing parameters']); + exit; + } + + $stmt = $con->prepare(' + UPDATE tokens + SET fingerPrint = :fp + WHERE passengerID = :pid + '); + $stmt->execute([ + ':fp' => $fingerprint, + ':pid' => $passengerID, + ]); + + $affected = $stmt->rowCount(); + + echo json_encode([ + 'status' => 'success', + 'affected' => $affected, + ]); + http_response_code(200); + +} catch (Exception $e) { + error_log('❌ [update_fingerprint_admin] ' . $e->getMessage()); + http_response_code(500); + echo json_encode(['error' => 'Server error']); +} +``` + +## File: email/sendTripEmail.php +``` +authenticate(); +$EMAIL_ADDRESS = 'hamzaayed@intaleqapp.com'; + +// 2. استقبال البيانات وتطهيرها (Sanitization) +$passengerName = htmlspecialchars(filterRequest('name') ?? 'User', ENT_QUOTES, 'UTF-8'); +$passengerEmail = filter_var(filterRequest('email'), FILTER_SANITIZE_EMAIL); +$passengerPhone = htmlspecialchars(filterRequest('phone') ?? '', ENT_QUOTES, 'UTF-8'); +$fee = floatval(filterRequest('fee') ?? 0); +$startNameLocation = htmlspecialchars(filterRequest('startNameLocation') ?? '', ENT_QUOTES, 'UTF-8'); +$endNameLocation = htmlspecialchars(filterRequest('endNameLocation') ?? '', ENT_QUOTES, 'UTF-8'); +$timeOfTrip = htmlspecialchars(filterRequest('timeOfTrip') ?? date('Y-m-d H:i:s'), ENT_QUOTES, 'UTF-8'); + +if (!$passengerEmail || !filter_var($passengerEmail, FILTER_VALIDATE_EMAIL)) { + jsonError("Invalid email address"); +} + +$INTALEQ_SMTP_PASSWORD = getenv('INTALEQ_SMTP_PASSWORD'); + +// بناء محتوى الإيميل بتصميم عصري وبريميوم +$bodyEmail = " + + + + + + + +
+
+

INTALEQ

+

Your journey, our priority

+
+
+
Hello, $passengerName!
+

Thank you for choosing INTALEQ. Your trip has been successfully confirmed. Here is your digital receipt:

+ +
+
+ From: + $startNameLocation +
+
+ To: + $endNameLocation +
+
+ Date & Time: + $timeOfTrip +
+
+ Phone: + $passengerPhone +
+
+ +
+
Total Amount
+
$$fee
+
+ +

If you have any questions, feel free to contact our support team at any time.

+
+ +
+ +"; + +$mail = new PHPMailer(true); +try { + $mail->isSMTP(); + $mail->Host = 'smtp.hostinger.com'; + $mail->SMTPAuth = true; + $mail->Username = $EMAIL_ADDRESS; + $mail->Password = $INTALEQ_SMTP_PASSWORD; + $mail->SMTPSecure = PHPMailer::ENCRYPTION_STARTTLS; + $mail->Port = 587; + + $mail->setFrom($EMAIL_ADDRESS, 'INTALEQ'); + $mail->addAddress($passengerEmail, $passengerName); + $mail->isHTML(true); + $mail->Subject = 'Your INTALEQ Trip Details'; + $mail->Body = $bodyEmail; + + $mail->send(); + jsonSuccess(null, "Email sent successfully"); +} catch (Exception $e) { + jsonError("Failed to send email: " . $mail->ErrorInfo); +} +``` + diff --git a/backend/invest_code.php b/backend/invest_code.php new file mode 100644 index 0000000..f7a45db --- /dev/null +++ b/backend/invest_code.php @@ -0,0 +1,4363 @@ + + + + + + + + انطلق · فرصة استثمارية 2026 | Intaleq Investor Deck + + + + + + + + +
+ + + + + + +
+
+
+
+ +
+
+ + يعمل الآن في سوريا ومصر · NANS مرخص + Live in Syria & Egypt · NANS Certified +
+

+ أول منصة نقل ذكي
مملوكة التقنية
في المنطقة
+ The First Tech-Owned
Ride Platform
in the Region
+

+

+ فرصة استثمارية $200,000 في منظومة تقنية كاملة — لا مجرد تطبيق. خرائط مملوكة تُحدَّث كل + 10 أيام، 4 تطبيقات، Map SaaS، Ad SaaS، بوابات دفع، وترخيص حكومي رسمي. المنافسون يدفعون $800–$30,000 شهرياً + لـ Google بينما نحن ندفع $0. + $200,000 investment opportunity in a complete tech ecosystem — not just an app. + Self-updating maps (10-day cycle), 4 apps, Map SaaS, Ad SaaS, payment gateways, and official government + license. Competitors pay $800–$30K/month to Google while we pay $0. +

+ +
+
+ $200K + الاستثمارInvestment + Pre-Seed Round +
+
+ 22% + حصة الملكيةEquity + Negotiable +
+
+ 4.6x + العائد (3 سنوات)Return (3yr) + Total ROI +
+
+ 10–12 + شهر للتعادلBreakeven + Months +
+
+
+
ترخيص NANS الحكوميNANS + Gov License
+
🗺️خرائط مملوكة — $0 تكلفةOwn Maps — $0 Cost
+
🚗1,800 سائقDrivers
+
👤2,500 راكبRiders
+
🛡️أمان 9/10Security 9/10
+
+
+ +
+
+ +
INTALEQ
+
نقل ذكي · سوريا ومصرSmart Rides · Syria & + Egypt
+
+ NANS ✓ + AI Powered + مباشرLive +
+
+
+
1,800
+
سائقDrivers
+
+
+
2,500
+
راكبRiders
+
+
+
$0
+
تكلفة خرائطMaps Cost
+
+
+
10%
+
عمولة فقطCommission
+
+
+ +
+
+
+
+ + +
+
سوريا تنفتح الآن — نافذة دخول نادرةSyria Opening Now — Rare Entry Window
+
المنافسون يدفعون $800–$30K/شهر لـ Google — + خرائطهم من 2011Competitors pay $800–$30K/month to Google — their data is from + 2011
+
منظومة كاملة جاهزة — $0 تطوير من + استثماركComplete ecosystem ready — $0 dev from your investment
+
+ +
+ + +
+
+
01 · لماذا الآن؟Why Now?
+

التوقيت المثالي للدخولThe Perfect + Entry Timing

+

ثلاثة عوامل نادرة الاجتماع تجعل هذه اللحظة نافذة استثمارية تُفتح مرة + واحدة.Three rarely-coinciding factors make this a once-in-a-generation investment + window.

+
+
+ 🇸🇾 +
سوق ينفتح الآنMarket Opening Right Now
+
First-mover advantage · الفرصة تُقفل قريباًFirst-mover advantage · Window closing soon
+
+ سوريا تدخل مرحلة إعادة الإعمار. دمشق وحدها تشهد 50,000+ رحلة تاكسي يومياً بدون بديل + رقمي منظم. الطبقة المتوسطة العائدة تبحث عن خدمات نوعية. نافذة الدخول الأول تُغلق حين تصل رأس المال + الكبير. + Syria enters reconstruction. Damascus alone sees 50,000+ taxi trips/day with no + organized digital alternative. The returning middle class demands quality services. First-mover window + closes when big capital arrives. +
+
10M+ مستخدم هاتف ذكي في سوريا10M+ smartphone + users in Syria
+
+
+ 🗺️ +
ميزة لا تُشترى بالمالAn Advantage Money Can't + Buy
+
IntaleqMaps — ملكية كاملة · تتحدث كل 10 أيامFully + Owned · Updates Every 10 Days
+
+ خرائط Google لسوريا لم تُحدَّث منذ 2011 — طرق جديدة، شوارع مغلقة، كل هذا غير موجود عندهم. + خرائطنا تتحدث كل ~10 أيام بناءً على حركة السائقين الحقيقية. وأما التكلفة: المنافسون يدفعون $800–$30,000 + شهرياً لـ Google حسب الحجم، نحن ندفع $0. الفارق يزيد كلما نمينا. + Google's Syria map data hasn't been updated since 2011 — new roads, closed streets, all + missing. Our maps refresh every ~10 days from real driver GPS traces. On cost: competitors pay + $800–$30K/month to Google at scale, we pay $0. The gap widens as we grow. +
+
$30,000/شهر يوفره IntaleqMaps عند 10,000 رحلة/يوم$30,000/month saved by IntaleqMaps at 10,000 trips/day
+
+
+ +
المنتج جاهز — ادفع للنمو لا للبناءProduct Ready — + Pay for Growth Not Building
+
Zero Dev Risk · $0 تطوير$0 Development +
+
+ 95+ ميزة منجزة. تطبيقان يعملان في سوقين. ترخيص حكومي. أمان 9/10. استثمارك يذهب 100% للتسويق + والنمو والتشغيل — لا للتطوير. هذا ما يُفرّق بين استثمار آمن ومغامرة. + 95+ features built. Two apps live in two markets. Government license. 9/10 security. Your + investment goes 100% to marketing, growth & operations — not development. This is what separates safe + investment from gambling. +
+
+ $0 من استثمارك للتطوير التقني$0 of your investment to tech + dev
+
+
+
+
+ +
+ + +
+
+
02 · المشهد التنافسيCompetitive Landscape +
+

كيف نتميز في سوق يتشكّل الآنHow We Stand Out in + a Forming Market

+

يوجد منافسان محليان في سوريا — Yallago (حاصل على شهادة الاعتمادية) وZakinn. كلاهما يعتمد على خرائط Google القديمة ويفتقر لمنظومة عمل متكاملة. نحن نقدم بديلاً أفضل للسائق والراكب والمستثمر.Syria has two local competitors — Yallago (accredited) and Zakinn. Both rely on outdated Google Maps and lack an integrated ecosystem. We offer a better alternative for drivers, riders, and investors.

+ +
+ +
+ 🚕 +
Yallago
+
تطبيق نقل سوري · دمشق · حاصل على شهادة الاعتماديةSyrian ride app · Damascus · Has accreditation certificate
+
💸اعتماد كامل على خرائط Google (تحديث 2011 في سوريا) — تكلفة متصاعدة مع النموFull dependency on Google Maps (2011 data in Syria) — rising costs with growth
+
📵لا تخزين محلي للخرائط — استهلاك دائم للـ API وبيانات السائقينNo map caching — constant API consumption and driver data usage
+
💵نقد فقط — يخسر العملاء المؤسسيين والشركاتCash only — loses corporate and business clients
+
🌍تطبيق فقط وليس منظومة عمل متكاملة — فرص نمو محدودةJust an app, not an ecosystem — limited growth opportunities
+
💀 عمولة 20% + تكاليف خرائط = نموذج غير مستدام للسائقين20% commission + map costs = unsustainable model for drivers
+
+ +
+ 🚖 +
Zakinn
+
تطبيق نقل سوري · دمشق وحلبSyrian ride app · + Damascus & Aleppo
+
💸اعتماد كامل على Google — تكلفة متصاعدة تأكل أي + ربح عند النموFull Google dependency — rising cost eats profit as it grows +
+
🚫لا ترخيص NANS — يواجه خطر الإغلاق الحكومي + المفاجئNo NANS license — facing sudden government shutdown risk
+
بنية تقنية بدائية — تنهار تحت ضغط الطلب + الموسميPrimitive tech infrastructure — collapses under seasonal demand +
+
🆘لا أدوات أمان شخصي — لا SOS، لا مشاركة موقع + حيNo personal safety tools — no SOS, no live location sharing
+
📊لا Admin Dashboard حقيقي — إدارة عمياء بدون + بياناتNo real Admin Dashboard — blind management without data
+
💀 لا ترخيص = مخاطرة وجودية للمستثمرينNo + license = existential risk for investors
+
+ +
+ 📱 +
التطبيقات الصغيرة الناشئةGeneric Small + Startups
+
النمط المتكرر في كل أسواق MENAThe recurring + pattern across MENA markets
+
🗺️Google Maps تقتلهم مالياً عند 300-500 + رحلة/يومGoogle Maps kills them financially at 300-500 trips/day
+
📡Polling بدل WebSocket — تنهار عند 200 مستخدم + متزامنPolling instead of WebSocket — crashes with 200 concurrent users +
+
💬SMS OTP بـ $0.05/رسالة — $300+/شهر لمجرد + التسجيلSMS OTP at $0.05/msg — $300+/month just for registration
+
🔐لا أمان حقيقي — 15-30% من الإيرادات تضيع + للاحتيالNo real security — 15-30% of revenue lost to fraud
+
متوسط عمرهم 12-18 شهراً قبل الإغلاقAverage lifespan 12-18 months before shutdown
+
💀 يفشلون للسبب ذاته دائماً: تكاليف التشغيل تسبق الإيراداتThey always fail for the same reason: OpEx outpaces revenue
+
+ +
+ 🚀 +
انطلق · Intaleq
+
منظومة عمل متكاملة — وليس مجرد تطبيقComplete ecosystem — not just an app
+
خرائط مملوكة تتحدث كل 10 أيام — أدق من Google في سورياOwned maps updated every 10 days — more accurate than Google in Syria
+
NANS مرخص — حماية قانونية كاملةNANS licensed — full legal protection
+
4 تطبيقات + نظام إعلانات + بوتات دفع — مصادر دخل متعددة4 apps + Ad system + payment bots — multiple revenue streams
+
دفع إلكتروني (شام كاش، سيريتل، فيزا) — الوحيدين في السوقDigital payment (ShamCash, Syriatel, Visa) — only ones in market
+
عمولة 10% — أقل عمولة معلنة في السوق السوري10% commission — lowest published rate in Syrian market
+
+ ✅ منظومة كاملة بتكلفة تشغيلية أقل بكثير من المنافسينFull ecosystem with dramatically lower operating costs +
+
+
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
الميزةFeatureانطلقIntaleqYallagoZakinnUber/CareemBolt/InDrive
خرائط ذاتيةOwn Maps✅ IntaleqMaps Google Google Google Google/HERE
تكلفة/رحلةCost/Trip$0.00 ✅$0.05–0.07$0.05–0.07$0.07+$0.07+
الترخيصLicenseNANS ✅اعتماديةAccreditedلا يعملونDon't operate
العمولةCommission10% ✅~20%~17%25-37%25%
خرائط أوفلاينOffline Maps
OTP واتسابWhatsApp OTP
زر طوارئ SOSSOS Emergency
رحلات المرأةLady Ridesجزئياً
أنواع الرحلاتRide Types10 ✅2-32-34-62-4
التكلفة الشهريةMonthly OpEx$230–430 ✅$5K–15K$5K–15K$200K+$100K+
+
+ +
+ 💼 +
+ ملاحظة للمستثمر:Investor Note: + انطلق ليست تطبيقاً منافساً — بل منظومة عمل متكاملة تقدم خدمات أوسع. يلا قو وزاكن يقدمان تطبيقات نقل فقط. نحن نمتلك خرائط محدّثة، نظام إعلانات، بوتات دفع، و4 تطبيقات متكاملة. الفرق ليس تقنياً — بل في نموذج العمل ومصادر الدخل. + Intaleq is not just a competing app — it's a full ecosystem. Yallago and Zakinn offer ride apps only. We own updated maps, an ad system, payment bots, and 4 integrated apps. The difference isn't technical — it's in the business model and revenue sources. +
+
+
+
+ +
+ + +
+
+
02B · المنظومة الكاملةThe Complete + Ecosystem
+

ليس تطبيقاً — منظومة عمل متكاملةNot an App + — A Complete Ecosystem

+

انطلق ليست تطبيق نقل. هي بنية تحتية رقمية لقطاع التنقل في المنطقة — محرك + خرائط، منصة إعلانات، أنظمة دفع، وأدوات إدارة — كل شيء مملوك ومبني من الصفر.Intaleq is + not a ride app. It's a digital infrastructure for regional mobility — a map engine, ad platform, payment + systems, and management tools — all owned and built from scratch.

+ +
+ 🏗️ +
+ ما الذي يملكه المستثمر فعلاً:What the investor actually + owns: + 8 منتجات جاهزة للتسويق، كل واحدة منها مصدر إيراد مستقل. هذا ليس رهاناً على تطبيق واحد — هذا + محفظة تقنية متكاملة بتكلفة Pre-Seed. + 8 market-ready products, each an independent revenue stream. This isn't a bet on one app — + it's a complete tech portfolio at Pre-Seed cost. +
+
+ +
+
+ 🗺️ +
IntaleqMaps SaaS
+
Map Engine · Routing · Geocoding · Tiles
+
محرك خرائط كامل يعمل بدون Google. يمكن تأجيره لأي تطبيق في المنطقة يريد + الاستغناء عن Google Maps. خرائط سوريا ومصر جاهزة. تتحدث كل ~10 أيام من GPS السائقين. بيانات أحدث مما يملكه + أي منافس.Full map engine without Google. Can be licensed to any regional app + wanting to escape Google Maps. Syria & Egypt data ready. Updates every ~10 days from driver GPS. More + accurate than any competitor's data.
+
💰 إيراد SaaS قابل للتأجيرLicensable SaaS + Revenue
+
+
+ 📢 +
Ad Campaign SaaS
+
Geo-targeted · Driver & Rider Reach
+
منصة إدارة حملات إعلانية مدمجة في التطبيق. الشركات تدفع للوصول لسائقي + ومستخدمي انطلق بشكل جغرافي مستهدف. إعلانات داخل خريطة السفر — أعلى engagement من أي وسيلة إعلانية أخرى في + المنطقة.In-app ad campaign management platform. Businesses pay to reach Intaleq's + drivers & riders with geo-targeted ads. In-journey map ads — highest engagement of any regional ad + format.
+
📊 إيراد إعلاني مستقل عن الرحلاتAd Revenue + Independent of Trips
+
+
+ 📱 +
4 تطبيقات متكاملة4 Integrated Apps
+
Rider · Driver · Admin · Customer Service
+
تطبيق الراكب، تطبيق السائق، لوحة الإدارة، وتطبيق خدمة العملاء المستقل — + يتيح فريق دعم يعمل من أي مكان بدون مكاتب. المنافسون يحتاجون موظفين يدويين لما يديره برنامج + عندنا.Rider app, Driver app, Admin Dashboard, and standalone Customer Service app + — enabling a fully remote support team with no offices. What competitors handle with manual staff, we + handle with software.
+
خدمة عملاء بلا مكتبZero-office customer + service
+
+
+ 💳 +
منظومة الدفع الشاملةComplete Payment Stack +
+
شام كاش · سيريتل · Stripe · PayPal · محفظة
+
5 طرق دفع متكاملة — الوحيد في سوريا. شام كاش وسيريتل كاش يصلان لملايين + المستخدمين الذين لا يملكون بطاقات بنكية. Stripe وPayPal للعملاء الدوليين والمغتربين. محفظة داخلية + للاشتراكات.5 integrated payment methods — the only app in Syria. Syriatel & + ShamCash reach millions without bank cards. Stripe & PayPal for diaspora and international users. Internal + wallet for subscriptions.
+
🔒 الوحيد بدفع إلكتروني في سورياOnly app with + e-payment in Syria
+
+
+ 🤖 +
بوتات الدفع الآليةAutomated Payment Bots +
+
WhatsApp · Telegram · Auto-reconciliation
+
بوتات دفع تعمل 24/7 لمعالجة تحويلات السائقين والمدفوعات الداخلية دون تدخل + يدوي. تحسب الديون والعمولات تلقائياً. تكلفة التشغيل المالي = لا موظفين محاسبة.Payment bots running 24/7 to process driver transfers and internal payments without manual + intervention. Auto-calculates commissions and dues. Financial ops cost = zero accounting staff. +
+
⚙️ محاسبة بلا موظفينZero-staff + accounting
+
+
+ 🌐 +
المواقع الإلكترونيةWeb Ecosystem
+
Rider · Driver · Corporate · Landing
+
مواقع متعددة لكل شريحة: موقع الركاب، موقع السائقين، بوابة الشركات للحجز + المؤسسي، وصفحات تسويقية. الشركات يمكنها الحجز مباشرة من المتصفح دون تطبيق.Multiple + targeted websites: rider portal, driver portal, corporate booking gateway, and marketing pages. Companies + can book rides directly from browser without installing an app.
+
🏢 قناة B2B مباشرةDirect B2B Channel +
+
+
+ 📡 +
البنية التحتية الآنيةReal-time + Infrastructure
+
WebSocket · Redis · GraphHopper · PostGIS
+
WebSocket Servers + Redis GeoSpatial يدعمان آلاف المستخدمين المتزامنين. + GraphHopper لحساب المسارات محلياً. PostGIS للتحليل الجغرافي المتقدم. هذه البنية وحدها تكلّف منافساً $200K+ + لبنائها.WebSocket + Redis GeoSpatial supporting thousands of concurrent users. + Self-hosted GraphHopper routing. PostGIS for advanced geo-analytics. This infrastructure alone costs a + competitor $200K+ to build.
+
يدعم 10,000+ مستخدم متزامنSupports 10,000+ + concurrent users
+
+
+ 🤖 +
الذكاء الاصطناعي المدمجEmbedded AI
+
Fraud Detection · Dynamic Pricing · Doc Verification
+
فحص وثائق السائقين بالذكاء الاصطناعي عند التسجيل، تسعير ديناميكي تلقائي + حسب العرض والطلب، وكشف احتيال يحمي 15-30% من الإيرادات التي تخسرها المنافسة.AI-powered driver document verification at onboarding, automatic dynamic pricing based on + supply/demand, and fraud detection protecting the 15-30% revenue competitors lose to cheating. +
+
🛡️ يحمي الهامش من الاحتيالProtects margin + from fraud
+
+
+
+
+ +
+ + +
+
+
02C · ماذا يكلف بناؤه؟What Would It Cost to + Build?
+

قيمة حقيقية بسعر Pre-SeedReal-World Value at a Pre-Seed Price

+

نسمع كثيراً: "الآن مع الذكاء الاصطناعي، أي شخص يبني تطبيقاً". الواقع مختلف + تماماً حين يتعلق الأمر بمنظومة بهذا التعقيد.We often hear: "With AI now, anyone can + build an app." Reality differs completely when the system has this level of complexity.

+ +
+ 🤖 +
+ لماذا لا يستطيع الذكاء الاصطناعي بناء هذا:Why AI alone can't build + this: + الذكاء الاصطناعي يكتب كوداً — لكنه يهلوس في الأنظمة المعقدة. منظومة تضم: Real-time + WebSockets، Redis GeoSpatial، خرائط ذاتية، GraphHopper، PostGIS، 4 تطبيقات Flutter متزامنة، بوابات دفع + محلية، وأمان متعدد الطبقات — هذه لا يبنيها الذكاء الاصطناعي. يحتاج خبرة ميدانية، debugging حقيقي، وفهم عميق + لكل طبقة. المؤسس جرّب — وبنى. + AI writes code — but hallucinates on complex systems. A stack with Real-time WebSockets, + Redis GeoSpatial, self-hosted maps, GraphHopper, PostGIS, 4 synchronized Flutter apps, local payment + gateways, and multi-layer security — AI can't build this. It requires field experience, real debugging, and + deep understanding of each layer. The founder tried — and built it. +
+
+ +
+
+
🏗️ تكلفة البناء من الصفر (فريق متمرس)Cost to Build from Scratch (Expert Team)
+
عدد المطورينDevelopers10–13
+
المدة الزمنيةTimeline18–24 شهراًmonths
+
Flutter + Backend Dev$180,000
+
Maps Engine (IntaleqMaps)$60,000
+
أنظمة الدفع المحليةLocal + Payment Systems$35,000
+
Real-time Infrastructure$50,000
+
الأمان متعدد الطبقاتMulti-layer Security$40,000
+
Ad SaaS + بوتات الدفعAd + SaaS + Payment Bots$55,000
+
QA + Infra + DevOps$80,000
+
$500,000 – $800,000
+
* لا يشمل الخبرة الميدانية، التراخيص، وشبكة السائقين. بعد كل هذا يبدأون + من الصفر في البازار.* Excludes field experience, licenses, and driver network. + After all this they start at zero in the market.
+
+
+
🤖 مع الذكاء الاصطناعي (الواقع)With AI Assistance (Reality)
+
مطورون متخصصون مطلوبونExpert devs still required5–8
+
المدة بعد التحسينTimeline + after optimization12–16 شهراًmonths
+
Real-time + Maps لا يولّدها AIReal-time + Maps AI can't generate⚠️
+
هلوسة في الأنظمة المعقدةAI hallucination on complex systems⚠️ حقيقي
+
التكامل بين 8 منتجاتIntegration of 8 productsيدوي + 100%
+
اكتساب خبرة الميدانField + experience acquisitionلا يُشترى
+
$250,000 – $450,000
+
* الذكاء الاصطناعي يسرّع الكتابة، لا البناء المعماري. الجزء الصعب هو + التصميم والتكامل — وهذا يحتاج خبرة بشرية.* AI speeds up writing, not architecture. + The hard part is design and integration — that still requires human expertise.
+
+
+ +
+ 💡 +
+ خلاصة المستثمر:Investor Bottom Line: + أنت تدخل بـ $200,000 في منظومة تكلف بناؤها $500,000–$800,000 وتحتاج فريقاً من 10 مطورين + وعامَين من الوقت. ما بُني موجود، يعمل، ومرخص. استثمارك يذهب كله للنمو لا للبناء. + You're entering at $200,000 into an ecosystem that cost $500,000–$800,000 to build and + required a team of 10 developers over two years. What was built exists, runs, and is licensed. Your entire + investment goes to growth, not construction. +
+
+ + +
+

ما يوفره IntaleqMaps — جدول مرجعي + للمستثمرينIntaleqMaps Savings — Investor Reference Table

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
حجم العملياتScaleرحلات/يومTrips/Dayتكلفة Google Maps شهرياًGoogle Maps Cost/Monthتكلفة انطلقIntaleq Costالتوفير السنويAnnual Savings
بدايةEarly100~$150$0~$1,800
نموGrowth500~$1,000$0~$12,000
متوسطMid-scale1,000~$2,500$0~$30,000
كبيرLarge5,000~$12,000$0~$144,000
هيمنةDominance10,000~$25,000–$30,000$0~$300,000–$360,000
+
+

* بناءً على أسعار Google Maps + Platform الرسمية (2025): Compute Routes $5–15/1000 + Dynamic Maps $7/1000 + Geocoding $5/1000. كل رحلة + تستهلك 10-18 طلب API.* Based on official Google Maps Platform pricing (2025): + Compute Routes $5–15/1000 + Dynamic Maps $7/1000 + Geocoding $5/1000. Each trip consumes 10-18 API + calls.

+
+
+
+ +
+ +
+
+
03 · ما الذي يحمي استثمارك؟What Protects Your Investment?
+

لماذا يصعب تكرار هذا؟Why Is This Hard to Replicate?

+

تكلفة بناء منظومة مشابهة من الصفر: $350,000–$530,000 مع فريق 10-13 مطور لمدة 12-18 شهراً. استخدام الذكاء الاصطناعي لبناء مشروع بهذا التعقيد يفشل حتماً بسبب فقدان السياق. استثمارك يشتري منتجاً جاهزاً بأقل من نصف تكلفته الحقيقية.Building a similar ecosystem from scratch: $350,000–$530,000 with 10-13 developers over 12-18 months. Using AI to build a project of this complexity inevitably fails. Your investment buys a ready product at less than half its real cost.

+
+
+ 🗺️ +
IntaleqMaps SaaS
+
محرك خرائط مملوك — يتحدث كل ~10 أيامFully owned + maps — ~10-day update cycle
+
Routing + Geocoding + Tile Serving ذاتي. خرائط Google لسوريا متجمدة منذ + 2011 — خرائطنا تتحدث من GPS السائقين الحقيقيين. تعمل بكامل الطاقة حتى بدون إنترنت. السعر: $0 بغض النظر عن + عدد الرحلات.Self-hosted Routing + Geocoding + Tile Serving. Google's Syria data + frozen since 2011 — ours updates from real driver GPS. Full capability offline. Cost: $0 regardless of + trip volume.
+
💰 يوفر $12,000–$360,000 سنوياً عند النموSaves + $12,000–$360,000/year at scale
+
+
+ 📜 +
NANS License
+
الترخيص الحكومي الرسميOfficial government + license
+
حماية قانونية كاملة في السوق السوري. لا منافس يملكه حالياً. باب الترخيص لا + يُفتح بالمال وحده — يحتاج وقتاً وعلاقات.Full legal protection in the Syrian + market. No competitor has it. The license door doesn't open with money alone — it requires time and + relationships.
+
🛡️ حصن قانوني لا يخترقه المنافسونLegal fortress + competitors can't breach
+
+
+ 🚗 +
شبكة السائقينDriver Network
+
1,800 سائق مُدرَّب ومُفعَّلtrained & activated + drivers
+
بُنيت هذه الشبكة بحوافز ($45K) وثقة وعلاقات ميدانية. منافس جديد يحتاج 6-12 + شهراً فقط لبناء الصدقية اللازمة للتسجيل.Built with $45K in incentives, trust, and + field relationships. A new competitor needs 6-12 months just to build the credibility needed for drivers + to register.
+
⏱️ 6–12 شهر لأي منافس لمجاراة الشبكة6–12 months + for any rival to match the network
+
+
+ 🛡️ +
منظومة الأمانSecurity System
+
9/10 · مستوى مؤسساتEnterprise Grade
+
JWT + HMAC + Device Fingerprint + Rate Limiting + Jailbreak Detection. + بُنيت من اليوم الأول. مدة بناء منظومة مماثلة: 3-4 أشهر لفريق متمرس.JWT + HMAC + + Device Fingerprint + Rate Limiting + Jailbreak Detection. Built from day one. Rebuilding this system: 3-4 + months for an experienced team.
+
🔐 يمنع احتيال يصل 15-30% من الإيراداتPrevents + 15-30% revenue fraud
+
+
+ +
البنية التحتية الآنيةReal-time + Infrastructure
+
WebSocket + Redis GeoSpatial
+
WebSocket Servers يدعم آلاف المستخدمين المتزامنين. Redis GEORADIUS للبحث + الجغرافي الفوري. Event Buffering كل 500ms. لا تأخير ملحوظ.WebSocket Servers + supporting thousands of concurrent users. Redis GEORADIUS for instant geo-search. Event Buffering every + 500ms. Zero noticeable delay.
+
📡 الأسرع في السوق المحليFastest in the local + market
+
+
+ 🌍 +
معمارية متعددة الدولMulti-Country + Architecture
+
نسخة لكل دولة — جاهزةCountry version ready to + deploy
+
سوريا تعمل. مصر جاهزة. الأردن وليبيا والعراق تحتاج أسابيع فقط للنشر. + المنافس الذي يبدأ من الصفر يحتاج سنتين للوصول لهذا المستوى.Syria live. Egypt + ready. Jordan, Libya, Iraq need only weeks to deploy. A competitor starting from scratch needs 2 years to + reach this level.
+
🚀 أسابيع للدخول لأي سوق جديدWeeks to enter any + new market
+
+
+ 👨‍💻 +
خبرة الميدان والنقلField & Transport + Experience
+
بُني بيدين على الأرضBuilt with hands on the + ground
+
المؤسس بنى Tripz في مصر قبل انطلق. خبرة عملية في أسواق MENA: تحديات الدفع، + السائقين، التنظيم. هذه المعرفة لا تُكتسب من مكتب.Founder built Tripz in Egypt + before Intaleq. Hands-on experience in MENA markets: payment challenges, drivers, regulation. This + knowledge isn't gained from an office.
+
🧠 سنوات خبرة لا تُعاد بالمال years of + irreplaceable experience
+
+
+
+
+ +
+ + +
+
+
04 · الأمانSecurity
+

حماية تفوق المنافسين بمراحلProtection That + Outclasses Competitors

+
+
+ + + + + + + + + + 9 + /10 Security + +
التقييم الأمني العامOverall Security Score
+
أعلى من 90% من التطبيقات الإقليميةHigher + than 90% of regional apps
+
+ نقطة التحسين الوحيدة المتبقية:
إكمال ترحيل + AES-256-GCM
(البنية جاهزة — 2-3 أيام تنفيذ)
+ Only remaining improvement:
Complete AES-256-GCM + migration
(Infrastructure ready — 2-3 days execution)
+
+
+
+
+
🔐
+
+
JWT + Device Fingerprint
+
JTI Blacklist · Redis · Refresh Token · SHA-256 + Pepper binding
+
+
+
+
+
+
+
+
+
+
+
⏱️
+
+
Rate Limiting · تحديد الطلباتRequest + Throttling
+
Sliding Window · Redis · حدود مستقلة لكل نقطة APIIndependent limits per API endpoint
+
+
+
+
+
+
+
+
+
+
+
💬
+
+
OTP مشفّرEncrypted
+
bcrypt + Redis · قفل 30 دقيقة بعد 3 محاولات30-min lock after 3 failed attempts
+
+
+
+
+
+
+
+
+
+
+
✍️
+
+
HMAC Verification · توقيع رقميDigital + Signing
+
Body + Timestamp + Nonce · لكل العمليات الماليةFor all financial operations
+
+
+
+
+
+
+
+
+
+
+
🛡️
+
+
Security Headers
+
HSTS · X-Frame-Options DENY · X-Content-Type-Options nosniff
+
+
+
+
+
+
+
+
+
+
+
🗄️
+
+
حماية SQL كاملةFull SQL Protection
+
PDO · EMULATE_PREPARES = false · حماية كاملة من الحقنFull injection protection
+
+
+
+
+
+
+
+
+
+
+
📱
+
+
Jailbreak Detection · كشف الاختراقDevice + Integrity Check
+
فحص تلقائي في كلا التطبيقين — رفض الأجهزة المعدّلةAutomatic check in both apps — rejects modified devices
+
+
+
+
+
+
+
+
+
+
+
+
+
+ +
+ + +
+
+
05 · الميزاتFeatures
+

95+ ميزة — أكثر من Bolt وInDrive معاً95+ + Features — More Than Bolt & InDrive Combined

+
+ + + +
+
+
🔐 المصادقة · AuthenticationAuthentication · + المصادقة
+
WhatsApp OTPGoogle Sign-InApple Sign-InBiometric Face/TouchDevice Fingerprint
+
🗺️ الخريطة · MapsMaps · الخريطة
+
IntaleqMaps ($0)خرائط أوفلاينOffline Mapsتتبع آنيLive TrackingSmart + Reroutingوضع ليليDark Mode + Map
+
🚕 10 أنواع رحلات · 10 Ride Types10 Ride Types · + 10 أنواع رحلات
+
+ مريحComfortسريعSpeedليدي + (سائقات)Lady (Female Drivers)Scooter/BikeElectricVanVIPأوفر (اقتصادي)Awfar + (Economy)سعر ثابتFixed + Priceرايح جايRound + Trip +
+
💳 الدفع · PaymentsPayments · الدفع
+
نقدCashStripe (Visa/MC)PayPalمحفظة رقميةDigital Walletأكواد خصمPromo Codes
+
🆘 الأمان الشخصي · Personal SafetyPersonal Safety + · الأمان
+
هزّ 5 مرات = طوارئShake 5× + = EmergencySOS Buttonمشاركة + موقع حيLive Location Share
+
+
+
📥 الطلبات · OrdersOrders · الطلبات
+
نافذة عائمةFloating + Overlayقبول من الخلفيةBackground + AcceptFCM Pushتنبيه + صوتيAudio Alert
+
💰 المالية · FinanceFinance · المالية +
+
محفظة السائقDriver + Walletنظام كزان (عمولة)Commission SystemفواتيرInvoicesStripe
+
📊 إدارة السائق · Driver MgmtDriver + Management
+
نقاط السلوكBehavior + ScoreAI Doc Uploadتقييم + ⭐Rating ⭐تأمين صحيHealth InsuranceهداياGiftsإحالةReferralكشف احتيالScam Detection
+
+
+
⚙️ لوحة التحكم · Admin PanelAdmin Panel + Features
+
+ خريطة حرارية حيةLive + HeatmapDriver ManagementRide + ManagementPassenger DetailsEmployee SystemError Monitoringمراسلة واتسابWhatsApp Messagingتسعير + ديناميكيDynamic Pricingإيميلات + معاملاتTransactional Emails +
+
+
+
+ +
+ + +
+
+
06 · الماليةFinancials
+

أين يذهب كل دولار من الـ $200K؟Where Does + Every Dollar Go?

+
+

حجم الجولة الاستثمارية · + Pre-SeedInvestment Round · Pre-Seed

+
$200,000
+
22% حصة ملكية · نقطة التعادل: شهر 10–12 · التطوير التقني: $022% equity stake · Breakeven: Month 10–12 · Tech Development: $0
+
+
💻 $0 تطوير — المنتج جاهزDevelopment — Product ready
+
👥 $71,400 رواتب (14 شهر)Salaries (14 months)
+
🎯 $45,200 تسويقMarketing
+
🚗 $45,000 حوافز سائقينDriver Incentives
+
+
+ +
+ +
+

+ 📊 توزيع الـ $200,000 بالتفصيل📊 Full $200,000 Breakdown +

+
+
الرواتب والتشغيل (14 شهر)Salaries & OpEx (14 months)$71,400
+
+
+
+
+
+
حوافز السائقين (6 أشهر)Driver Incentives (6 months)$45,000
+
+
+
+
+
+
التسويق والمؤثرينMarketing + & Influencers$45,200
+
+
+
+
+
+
احتياطي الطوارئEmergency + Reserve$15,500
+
+
+
+
+
+
إيجار المكتب والفواتيرRent + & Utilities$8,400
+
+
+
+
+
+
إعلانات الطرقBillboards & + OOH$8,000
+
+
+
+
+
+
السيرفرات ($250/شهر)Servers ($250/month)$3,500
+
+
+
+
+
+
تجهيز المكتبOffice + Setup$3,000
+
+
+
+
+
+
التطوير التقني ✅ جاهزTech + Development ✅ Done$0
+
+
+
+
+
+ +
+
+

👥 هيكل + الرواتب الشهري👥 Monthly Salary Structure

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
المسمىRole#الراتب/شهرSalary/Mo
المؤسس / CTOFounder / CTO1$2,500
مساعد مطورDev Assistant1$1,500
دعم فنيSupport Staff4$150/فرد/ea
مسؤول تسويقMarketing1$500
المجموعTotal7$5,100/شهر/mo
+
+
+
+

توزيع الميزانيةBudget Allocation

+

النسب المئوية لكل بندPercentage per category

+
+
+
+
+ + +
+
+

توزيع حوافز السائقينDriver Incentive Distribution

+

$45,000 على 6 أشهر — "شبكة الأمان"$45,000 across 6 months — + "Safety Net"

+
+
+
+
+

شروط + الاستحقاقEligibility Conditions

+
+ + + + + + + + + + + + + + + + + + + + + +
الشرطConditionالمعيارValue
نسبة القبولAccept Rate≥ 80%
التواجد في مناطق الطلبIn Demand Zones
تقييم الراكبRider Rating≥ 4.0 ⭐
+
+
+
+ 💡 +
+ آلية الضمان:How it works: + إذا حقق السائق أقل من $4 أسبوعياً، تغطي الشركة الفارق تلقائياً من Admin Dashboard. ينتهي + بعد 6 أشهر → نمو عضوي. + If a driver earns less than $4/week, the system automatically covers the gap via Admin + Dashboard. Ends after 6 months → organic growth. +
+
+
+
+ + +

التوقعات المالية — + 36 شهراًFinancial Projections — 36 Months

+
+
+

مسار النمو الشهريMonthly Growth Trajectory

+

الإيرادات (ذهبي) مقابل المصاريف (أحمر)Revenue (gold) vs Expenses + (red)

+
+
+
+

قراءة المراحلReading the Phases

+
    +
  • +
    M1
    +
    الشهر الأول — بداية العملياتMonth 1 — Operations + Kickoff
    تسجيل + السائقين وتجهيز البنية. المصاريف تتجاوز الإيرادات.Driver onboarding & infra + setup. Expenses exceed revenue.
    +
  • +
  • +
    1-6
    +
    الأشهر 1-6 — الاستحواذMonths 1-6 — + Acquisition
    حوافز + $45K + تسويق مكثف = بناء الشبكة. هذا هو الاستثمار الحقيقي.$45K incentives + + heavy marketing = network building. This is the real investment.
    +
  • +
  • +
    7-12
    +
    الأشهر 7-12 — تقاطع الربحيةMonths 7-12 — Profit + Crossover
    الحوافز + تنتهي، الطلب يرتفع → الخط الذهبي يتجاوز الأحمر.Incentives end, demand rises + → gold line crosses red line.
    +
  • +
  • +
    Y2
    +
    السنة 2 — التوسعYear 2 — Scaling
    حلب وحمص. الإيراد يبتعد عن المصاريف بشكل + متسارع.Aleppo & Homs. Revenue accelerates away from expenses. +
    +
  • +
  • +
    Y3
    +
    السنة 3 — الهيمنةYear 3 — Dominance
    تغطية وطنية. الفجوة بين الخطين = صافي ربح + $662K.National coverage. Gap between lines = $662K net profit. +
    +
  • +
+
+
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
السنةYearالمرحلةPhaseرحلات/يومTrips/DayالإيرادRevenueالمصاريفExpensesصافي الربحNet Profit
Y1التأسيسFoundation1,500$120K$140K(-$20K)
Y2التوسعScaling4,000$365K$150K+$215K
Y3الهيمنةDominance10,000$912K$250K+$662K
+
+ +
+

الإيرادات مقابل المصاريف السنويةAnnual Revenue vs Expenses +

+

مقارنة واضحة للثلاث سنواتClear 3-year comparison

+
+
+ + +

اقتصاديات + الوحدةUnit Economics

+
+
+
$0.77
+
تكلفة اكتساب السائقDriver CAC
+
+
+
$2.00
+
تكلفة اكتساب الراكبRider CAC
+
+
+
8
+
رحلات للاستردادTrips to Payback
+
+
+
3:1
+
LTV : CAC
+
المعيار الذهبي عالمياًGlobal gold standard +
+
+
+ + +

عائدك على + الاستثمار (22%)Your Return on Investment (22%)

+
+
+
السنة الأولىYEAR 1
+
بناء الأصولAsset Building
+
نقطة التعادل: شهر 10–12
الشبكة تُبنى والعلامة تتأسس
Breakeven: Month 10–12
Network builds, brand establishes
+
+
+
السنة الثانيةYEAR 2
+
$47,300
+
22% من $215K صافي ربح
بداية التدفق النقدي
22% + of $215K net profit
Cash flow begins
+
+
+
السنة الثالثةYEAR 3
+
$145,750
+
22% من $662K صافي ربح
+ قيمة الحصة $728,750
22% of $662K net profit
+ Equity value $728,750
+
+
+ +
+
+

توزيع العائد التراكميCumulative Return Breakdown

+

3 سنوات · حصة 22%3 years · 22% equity

+
+
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
البيانDetailالقيمةValue
حجم الجولةRound Size$200,000
النوعTypePre-Seed
الحصةEquity22%
التقييمValuation~$909K
Runway14 شهراًmonths
الاسترداد النقدي (3 سنوات)Cash Recovery (3yr)96.5%
استراتيجية الخروجExit StrategySeries A / استحواذAcquisition
+
+
+ 🏢 +
+ كيف حسبنا قيمة الحصة؟How we valued the equity? + بنهاية Y3 الشركة تحقق $662K ربح سنوي. بمضاعف متحفظ ×5، قيمة الشركة = $3.3M. 22% = + $728,750 + أرباح نقدية $193K = مجموع $921,750. + By Y3 the company generates $662K annual profit. At a conservative 5× multiple, company + value = $3.3M. 22% = $728,750 + cash dividends $193K = total $921,750. +
+
+
+
+ +
+

إجمالي + قيمة استثمارك بنهاية السنة الثالثةTotal value of your investment by end of Year + 3

+
$921,800
+
أرباح نقدية $193,050 + قيمة حصة 22% في شركة بـ $3.3M$193,050 cash dividends + 22% equity in a $3.3M company
+
+
4.6xالعائد + الإجماليTotal Return
+
96.5%استرداد + نقديCash Recovery
+
$3.3Mتقييم Y3Y3 Valuation
+
+
+
+
+ +
+ + +
+
+
07 · الأسواقMarkets
+

183+ مليون نسمة في المرمى183M+ People + In the Crosshairs

+

معمارية متعددة الدول تعني أسابيع للدخول لأي سوق جديد — لا أشهراً ولا + ملايين.Multi-country architecture means weeks to enter any new market — not months or + millions.

+
+
+
🇸🇾
+
سورياSyria
+
18M+ · 10M+ هاتفsmartphones
+
تعمل الآن. ترخيص NANS. 1,800 سائق. دمشق: 50,000+ رحلة تاكسي/يوم. لا منافس + حقيقي ومرخص.Live now. NANS license. 1,800 drivers. Damascus: 50,000+ taxi + trips/day. No real licensed competitor.
+
يعمل الآنLive Now
+
+
+
🇪🇬
+
مصرEgypt
+
105M · أكبر سوق عربيLargest Arab market +
+
نسخة مخصصة جاهزة للإطلاق. سوق ضخم مع مساحة واسعة للمنافسين الجدد بتكلفة + تشغيل منخفضة.Customized version ready to launch. Massive market with wide space + for new entrants at low operating cost.
+
جاهزةReady
+
+
+
🇯🇴
+
الأردنJordan
+
11M
+
Careem ضعيف + Uber غائب. نسخة انطلق تُنشر خلال أسابيع. طبقة وسطى كبيرة + ومستقرة.Careem weak + Uber absent. Intaleq version deploys in weeks. Large stable + middle class.
+
🟡 Q4 2026
+
+
+
🇱🇾
+
ليبياLibya
+
7M
+
سوق بكر تقريباً — لا منافس يُذكر. فرصة تأسيس المعيار الوطني.Near-virgin market — negligible competition. Opportunity to set the national standard. +
+
🟡 Q4 2026
+
+
+
🇮🇶
+
العراقIraq
+
42M
+
سوق ناشئ بقوة — منافسة ضعيفة وطبقة وسطى تنمو بسرعة.Rapidly emerging market — weak competition and fast-growing middle class.
+
🔵 Q2 2027
+
+
+ +

خارطة + الطريقRoadmap

+
+
+
+
Q3 2026
+
استقرار سوريا — 1,000+ رحلة / يومSyria + Stabilization — 1,000+ trips/day
+
Admin Dashboard · تحسين UX · حملة تسويق كبرى · حلب وحمصAdmin Dashboard · UX polish · Major marketing campaign · Aleppo & Homs
الأساسFoundation +
+
+
+
Q4 2026
+
إطلاق الأردن + ليبياJordan + Libya Launch +
+
نسخ محلية جاهزة · فرق تشغيل · شراكات فنادق ومطاعمLocal versions ready · Operations teams · Hotel & restaurant partnerships
التوسع الأولFirst Expansion +
+
+
+
Q1 2027 · Seed Round
+
جولة Seed — $200K–$500KSeed Round — + $200K–$500K
+
توسيع الفريق · بنية تحتية للنمو الكبير · توصيل البضائع + رحلات + مشتركةTeam expansion · Scale infrastructure · Package delivery + carpooling +
الاستثمار التاليNext + Investment +
+
+
+
Q2 2027
+
إطلاق مصر الكامل + العراقFull Egypt + Iraq + Launch
+
أكبر سوقين · النسخ جاهزة · نشر خلال أسابيع لا أشهرTwo biggest markets · Versions ready · Deploy in weeks not months
النمو الكبيرMajor Growth +
+
+
+
Q4 2027 · Series A
+
جولة Series A — $1M–$3MSeries A — $1M–$3M +
+
توسع إقليمي شامل · فريق 20+ · ذكاء اصطناعي وتوصيلFull regional expansion · 20+ team · AI features & delivery
التحول الكبيرThe Transformation +
+
+
+
+ +
+ + +
+
+
08 · المخاطر والحلولRisks & Mitigations +
+

الشفافية الكاملة — ماذا يمكن أن يحدث؟Full + Transparency — What Could Go Wrong?

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
المخاطرةRiskالاحتمالProb.التأثيرImpactخطة التخفيفMitigation Plan
تقلبات سعر الصرفFX FluctuationعاليHighمتوسطMedium + احتياطي 10% + تسعير ديناميكي فوري من Admin10% reserve + + instant dynamic pricing from Admin
أزمة محروقات / ارتفاع أسعارFuel Crisis / Price Spikes + عاليHighعاليHighتعديل الأسعار فوري بدون تحديث التطبيق من لوحة التحكمInstant + price adjustment without app update via Admin Panel
منافسة شرسة (Yallago/Zakinn)Competition + (Yallago/Zakinn)متوسطMedium + عاليHighعمولة 10% + ضمان دخل السائق + ترخيص حصري NANS10% commission + + driver income guarantee + exclusive NANS license
بطء اكتساب المستخدمينSlow User AcquisitionمتوسطMedium + عاليHigh$45K حوافز + $45K تسويق + برامج إحالة وولاء$45K incentives + + $45K marketing + referral & loyalty programs
تغييرات تنظيمية حكوميةGovernment Regulation Changes + منخفضLowعاليHighشهادة NANS توفر حصناً قانونياً مسبقاًNANS certificate + provides preemptive legal fortress
انهيار تقني تحت الضغطTechnical Failure Under Loadمنخفض جداًVery + LowعاليHighWebSocket + Redis مُختبر + 3 قواعد بيانات مفصولة + أمان 9/10Tested WebSocket + Redis + 3 isolated DBs + 9/10 security
+
+
+
+ +
+ + +
+
+
09 · الفريقTeam
+

الفريق الذي بنى المستحيلThe Team That + Built the Impossible

+
+
+
HA
+
حمزة عايدHamza Ayed
+
Founder · CEO · CTO
+
10+ سنوات خبرة. بنى Tripz في مصر. صمّم المنصة كاملة (تطبيقين + Backend + + IntaleqMaps) من الصفر. خبير في نقل MENA.10+ years experience. Built Tripz in + Egypt. Designed the full platform (2 apps + Backend + IntaleqMaps) from scratch. MENA transport + expert.
+
+ +
+
+
+ +
+ + +
+
+
+
+
+
ابدأ رحلة الاستثمارStart Your Investment Journey
+

+ المشروع جاهز ومرخص
ويعمل على الأرض
+ Ready, Licensed
Operating on the Ground
+

+

+ كل ما نحتاجه هو الشريك المناسب. احجز مكالمة فيديو مع المؤسس مباشرةً — لا وسطاء، لا + انتظار، لا بيروقراطية. + All we need is the right partner. Book a video call with the founder directly — no + middlemen, no waiting, no bureaucracy. +

+ +
+
$200Kحجم + الجولةRound Size
+
22%حصة + الملكيةEquity
+
4.6xالعائد + المتوقعExpected Return
+
Pre-Seedنوع + الجولةRound Type
+
+
+
+ +

Intaleq Syria

+

Damascus · NANS-INT-2026

+ + +
+
+
+
+
+
+
+
+
+ + + + + + + + + \ No newline at end of file diff --git a/backend/load_env.php b/backend/load_env.php new file mode 100755 index 0000000..38c666a --- /dev/null +++ b/backend/load_env.php @@ -0,0 +1,23 @@ +enforce(RateLimiter::identifier(), 'login'); + + $passengerId = filterRequest('id'); + $fingerprint = filterRequest('fingerPrint') ?? filterRequest('fingerprint'); + $audience = filterRequest('aud'); + + if (empty($passengerId) || empty($fingerprint) || empty($audience)) { + jsonError('Missing required parameters', 400); + } + + $con = Database::get('main'); + + // التحقق من الجهاز من خلال البصمة + $stmt = $con->prepare(' + SELECT passengerID, fingerprint + FROM tokens + WHERE passengerID = :pid + LIMIT 1 + '); + $stmt->execute([':pid' => $passengerId]); + $row = $stmt->fetch(); + + $fpVerified = false; + if ($row) { + $fpPepper = getenv('FP_PEPPER') ?: ''; + $storedFp = $row['fingerprint']; + + // دعم الطريقة الجديدة (hash) والقديمة (مباشر) + if ($fpPepper) { + $expectedHash = hash('sha256', $fingerprint . $fpPepper); + $fpVerified = hash_equals($storedFp, $expectedHash); + if (!$fpVerified) { + $fpVerified = hash_equals($storedFp, $fingerprint); + } + } else { + $fpVerified = hash_equals($storedFp, $fingerprint); + } + } + + // وقت رد ثابت لمنع Timing Attack + $elapsed = microtime(true) - $startTime; + if ($elapsed < 0.1) usleep((int)((0.1 - $elapsed) * 1000000)); + + if (!$fpVerified) { + securityLog("Invalid login fingerprint", ['passengerId' => $passengerId]); + jsonError('Invalid credentials', 401); + } + + $limiter->reset(RateLimiter::identifier(), 'login'); + + $jwtService = new JwtService($redis); + $jwt = $jwtService->generateAccessToken($passengerId, 'passenger', $audience, $fingerprint); + // $refresh = $jwtService->generateRefreshToken($passengerId); + + jsonSuccess([ + 'jwt' => $jwt, + // 'refresh_token' => $refresh['token'], + 'expires_in' => 3600 + ]); + +} catch (PDOException $e) { + securityLog("Login PDO Error", ['msg' => $e->getMessage()]); + jsonError('Database error', 500); +} catch (Exception $e) { + securityLog("Login Error", ['msg' => $e->getMessage()]); + jsonError('Server error', 500); +} \ No newline at end of file diff --git a/backend/loginAdmin.php b/backend/loginAdmin.php new file mode 100755 index 0000000..9e77cf9 --- /dev/null +++ b/backend/loginAdmin.php @@ -0,0 +1,81 @@ +enforce(RateLimiter::identifier(), 'login'); + +try { + $id = filterRequest('id') ?? ''; + $password = filterRequest('password') ?? ''; + $audience = filterRequest('aud') ?? ''; + + $allowed1 = getenv('allowedDriver1'); + $allowed2 = getenv('allowedDriver2'); + $allowedAudiences = array_values(array_filter([$allowed1, $allowed2])); + + if (empty($id) || empty($password) || empty($audience)) { + jsonError('ID and password are required.', 400); + } + + if (!in_array($audience, $allowedAudiences, true)) { + jsonError('Invalid audience.', 400); + } + + $con = Database::get('main'); + + // ── جلب بيانات المشرف ──────────────────────────────────── + // ملاحظة: جدول admin_users سيتم إنشاؤه في Phase 4 (db_improvements.sql) + $stmt = $con->prepare("SELECT id, password, email, role FROM admin_users WHERE username = :id OR email = :id LIMIT 1"); + $stmt->execute([':id' => $id]); + $admin = $stmt->fetch(); + + $startTime = microtime(true); + + if ($admin && password_verify($password, $admin['password'])) { + + $limiter->reset(RateLimiter::identifier(), 'login'); + + $jwtService = new JwtService($redis); + + // استخدام Role المخصص أو 'admin' + $role = $admin['role'] ?? 'admin'; + + $jwt = $jwtService->generateAccessToken($admin['id'], $role, $audience); + $refresh = $jwtService->generateRefreshToken($admin['id']); + + jsonSuccess([ + 'jwt' => $jwt, + 'refresh_token' => $refresh['token'], + 'expires_in' => 900 + ]); + + } else { + // حماية من Timing Attack + $elapsed = microtime(true) - $startTime; + if ($elapsed < 0.1) usleep((int)((0.1 - $elapsed) * 1000000)); + + jsonError('Invalid ID or password.', 401); + } + +} catch (PDOException $e) { + securityLog("Admin Login PDO Error", ['msg' => $e->getMessage()]); + jsonError('Login failed: Database error', 500); +} catch (Exception $e) { + securityLog("Admin Login Error", ['msg' => $e->getMessage()]); + jsonError('Login failed: Server error', 500); +} \ No newline at end of file diff --git a/backend/loginFirstTime.php b/backend/loginFirstTime.php new file mode 100755 index 0000000..73fd4a4 --- /dev/null +++ b/backend/loginFirstTime.php @@ -0,0 +1,81 @@ +enforce(RateLimiter::identifier(), 'register'); + + $id = filterRequest('id'); + $password = filterRequest('password'); + $audience = filterRequest('aud'); + $fingerprint = filterRequest('fingerprint') ?? filterRequest('fingerPrint'); + + $allowed1 = getenv('allowed1'); + $allowed2 = getenv('allowed2'); + $allowedAudiences = array_values(array_filter([$allowed1, $allowed2])); + $passwordnewpassenger = getenv('passwordnewpassenger'); + + if (empty($id) || empty($password) || empty($audience)) { + jsonError('Missing input fields.', 400); + } + + if (!in_array($audience, $allowedAudiences, true)) { + jsonError('Invalid audience', 400); + } + + if (!password_verify($password, $passwordnewpassenger)) { + securityLog("FirstTime login failed (password)", ['id' => $id]); + jsonError('Invalid password.', 401); + } + + $jwtService = new JwtService($redis); + + // استخدام override للـ TTL في الـ Access Token (نحتاج 150 ثانية فقط) + // لتوليد التوكن بتفاصيل خاصة، نستخدم الدالة generateAccessToken لكن بتعديل إن لزم، + // أو نولد التوكن يدوياً هنا للسرعة كما كان: + $fpPepper = getenv('FP_PEPPER') ?: ''; + $fpHash = (!empty($fingerprint) && !empty($fpPepper)) + ? hash('sha256', $fingerprint . $fpPepper) + : null; + + $payload = [ + 'user_id' => 'new', + 'sub' => $id, + 'token_type' => 'registration', + 'exp' => time() + 150, // 150 ثانية + 'iat' => time(), + 'iss' => 'Tripz', + 'aud' => $audience, + 'jti' => bin2hex(random_bytes(16)), + ]; + + if ($fpHash !== null) { + $payload['fingerPrint'] = $fpHash; + } + + $secretKey = trim(file_get_contents('/home/intaleq-api/.secret_key')); + $jwt = Firebase\JWT\JWT::encode($payload, $secretKey, 'HS256'); + + jsonSuccess([ + 'jwt' => $jwt, + 'expires_in' => 150, + ]); + +} catch (Exception $e) { + securityLog("LoginFirstTime Error", ['msg' => $e->getMessage()]); + jsonError('Server error', 500); +} \ No newline at end of file diff --git a/backend/loginFirstTimeDriver.php b/backend/loginFirstTimeDriver.php new file mode 100755 index 0000000..ae3d0f0 --- /dev/null +++ b/backend/loginFirstTimeDriver.php @@ -0,0 +1,76 @@ +enforce(RateLimiter::identifier(), 'login'); + + $id = filterRequest('id'); + $password = filterRequest('password'); + $audience = filterRequest('aud'); + $fingerprint = filterRequest('fingerprint') ?? filterRequest('fingerPrint'); + + $allowed1 = getenv('allowedDriver1'); + $allowed2 = getenv('allowedDriver2'); + $allowedAudiences = array_values(array_filter([$allowed1, $allowed2])); + $passwordnewpassenger = getenv('passwordnewpassenger'); + + if (empty($id) || empty($password) || empty($audience)) { + jsonError('Missing input fields.', 400); + } + + if (!in_array($audience, $allowedAudiences, true)) { + jsonError('Invalid audience', 400); + } + + if (!password_verify($password, $passwordnewpassenger)) { + securityLog("FirstTimeDriver login failed (password)", ['id' => $id]); + jsonError('Invalid credentials.', 401); + } + + $fpPepper = getenv('FP_PEPPER') ?: ''; + $fpHash = (!empty($fingerprint) && !empty($fpPepper)) + ? hash('sha256', $fingerprint . $fpPepper) + : null; + + $payload = [ + 'user_id' => 'new', + 'sub' => $id, + 'token_type' => 'registration', + 'exp' => time() + 450, + 'iat' => time(), + 'iss' => getenv('APP_ISSUER') ?: 'Tripz', + 'aud' => $audience, + 'jti' => bin2hex(random_bytes(16)), + ]; + + if ($fpHash !== null) { + $payload['fingerPrint'] = $fpHash; + } + + $secretKey = trim(file_get_contents('/home/intaleq-api/.secret_key')); + $jwt = Firebase\JWT\JWT::encode($payload, $secretKey, 'HS256'); + + jsonSuccess([ + 'jwt' => $jwt, + 'expires_in' => 450, + ]); + +} catch (Exception $e) { + securityLog("LoginFirstTimeDriver Error", ['msg' => $e->getMessage()]); + jsonError('Server error', 500); +} \ No newline at end of file diff --git a/backend/loginJwtDriver.php b/backend/loginJwtDriver.php new file mode 100755 index 0000000..c8a1f6f --- /dev/null +++ b/backend/loginJwtDriver.php @@ -0,0 +1,95 @@ +enforce(RateLimiter::identifier(), 'login'); + + $id = filterRequest('id'); + $audience = filterRequest('aud'); + $fingerprint = filterRequest('fingerPrint') ?? filterRequest('fingerprint'); + + $aud1 = getenv('allowedDriver1'); + $aud2 = getenv('allowedDriver2'); + $allowedAudiences = array_values(array_filter([$aud1, $aud2])); + + if (empty($id) || empty($audience)) { + jsonError('Missing required fields', 400); + } + + if (!in_array($audience, $allowedAudiences, true)) { + jsonError('Invalid audience', 400); + } + + $con = Database::get('main'); + $pepper = getenv('SECRET_KEY_HMAC'); + + $stmt = $con->prepare(' + SELECT id, phone, national_number, email, password + FROM driver + WHERE id = :id + LIMIT 1 + '); + $stmt->execute([':id' => $id]); + $driver = $stmt->fetch(); + + if (!$driver || empty($driver['password'])) { + unauthorizedDriver(); + } + + $decPhone = !empty($driver['phone']) ? $encryptionHelper->decryptData($driver['phone']) : null; + $decNat = !empty($driver['national_number']) ? $encryptionHelper->decryptData($driver['national_number']) : null; + + if (empty($decPhone) || empty($decNat)) { + unauthorizedDriver(); + } + + $baseString = $driver['id'] . '|' . trim($decPhone) . '|' . trim($decNat); + $hmacHex = hash_hmac('sha256', $baseString, $pepper, false); + + if (!password_verify($hmacHex, $driver['password'])) { + unauthorizedDriver(); + } + + $limiter->reset(RateLimiter::identifier(), 'login'); + + $jwtService = new JwtService($redis); + $jwt = $jwtService->generateAccessToken($driver['id'], 'driver', $audience, $fingerprint); + // $refresh = $jwtService->generateRefreshToken($driver['id']); + + jsonSuccess([ + 'jwt' => $jwt, + // 'refresh_token' => $refresh['token'], + 'expires_in' => 14400 + ]); + +} catch (PDOException $e) { + securityLog("LoginDriver PDO Error", ['msg' => $e->getMessage()]); + jsonError('Database error', 500); +} catch (Exception $e) { + securityLog("LoginDriver Error", ['msg' => $e->getMessage()]); + jsonError('Server error', 500); +} \ No newline at end of file diff --git a/backend/loginJwtWalletDriver.php b/backend/loginJwtWalletDriver.php new file mode 100755 index 0000000..0789b04 --- /dev/null +++ b/backend/loginJwtWalletDriver.php @@ -0,0 +1,111 @@ +enforce(RateLimiter::identifier(), 'login'); + + $id = filterRequest('id'); + $password = filterRequest('password'); + $audience = filterRequest('aud'); + $fingerPrint = filterRequest('fingerPrint') ?? filterRequest('fingerprint'); + + $allowed1 = getenv('allowedWallet1'); + $allowed2 = getenv('allowedWallet2'); + $allowedAudiences = array_values(array_filter([$allowed1, $allowed2])); + $passwordnewpassenger = getenv('passwordnewpassenger'); + $fpPepper = getenv('FP_PEPPER') ?: ''; + + if (empty($id) || empty($password) || empty($audience) || empty($fingerPrint)) { + jsonError('Missing required parameters', 400); + } + + if (!in_array($audience, $allowedAudiences, true)) { + jsonError('Invalid audience', 400); + } + + if (!password_verify($password, $passwordnewpassenger)) { + securityLog("WalletDriver login failed (password)", ['id' => $id]); + jsonError('Invalid credentials', 401); + } + + $con = Database::get('main'); + + $stmt = $con->prepare(' + SELECT captain_id, fingerPrint + FROM driverToken + WHERE captain_id = :captain_id + LIMIT 1 + '); + $stmt->execute([':captain_id' => $id]); + $tokenData = $stmt->fetch(); + + $storedFp = $tokenData['fingerPrint'] ?? ''; + + if (empty($storedFp)) { + jsonError('Device fingerprint not registered', 403); + } + + $fpVerified = false; + if (!empty($fpPepper)) { + $expectedHash = hash('sha256', $fingerPrint . $fpPepper); + $fpVerified = hash_equals($storedFp, $expectedHash); + if (!$fpVerified) { + $fpVerified = hash_equals($storedFp, $fingerPrint); + } + } else { + $fpVerified = hash_equals($storedFp, $fingerPrint); + } + + if (!$fpVerified) { + securityLog("WalletDriver FP mismatch", ['id' => $id]); + jsonError('Device verification failed', 403); + } + + $limiter->reset(RateLimiter::identifier(), 'login'); + + $fpHash = hash('sha256', $fingerPrint . $fpPepper); + + $payload = [ + 'user_id' => $id, + 'fingerPrint' => $fpHash, + 'exp' => time() + 300, // 5 دقائق تم إصلاحه (كان 60) + 'iat' => time(), + 'iss' => 'Tripz-Wallet', + 'aud' => $audience, + 'jti' => bin2hex(random_bytes(16)), + ]; + + $secretKey = trim(file_get_contents('/home/intaleq-api/.secret_key_pay')); + $jwt = Firebase\JWT\JWT::encode($payload, $secretKey, 'HS256'); + + $hmac = hash_hmac('sha256', $id, getenv('SECRET_KEY_HMAC')); + + jsonSuccess([ + 'status' => 'success', + 'jwt' => $jwt, + 'hmac' => $hmac, + 'expires_in' => 300, // تم التعديل + ]); + +} catch (PDOException $e) { + securityLog("LoginWalletDriver PDO Error", ['msg' => $e->getMessage()]); + jsonError('Database error', 500); +} catch (Exception $e) { + securityLog("LoginWalletDriver Error", ['msg' => $e->getMessage()]); + jsonError('Server error', 500); +} \ No newline at end of file diff --git a/backend/loginWallet.php b/backend/loginWallet.php new file mode 100755 index 0000000..f1a73e7 --- /dev/null +++ b/backend/loginWallet.php @@ -0,0 +1,97 @@ +enforce(RateLimiter::identifier(), 'login'); + + $id = filterRequest('id'); + $password = filterRequest('password'); + $audience = filterRequest('aud'); + $fingerPrint = filterRequest('fingerPrint') ?? filterRequest('fingerprint'); + + $allowed1 = getenv('allowedWallet1'); + $allowed2 = getenv('allowedWallet2'); + $allowedAudiences = array_values(array_filter([$allowed1, $allowed2])); + $passwordnewpassenger = getenv('passwordnewpassenger'); + + if (empty($id) || empty($password) || empty($audience) || empty($fingerPrint)) { + jsonError('Missing required parameters', 400); + } + + if (!in_array($audience, $allowedAudiences, true)) { + jsonError('Invalid audience', 400); + } + + if (!password_verify($password, $passwordnewpassenger)) { + securityLog("Wallet login failed (password)", ['id' => $id]); + jsonError('Invalid credentials', 401); + } + + $con = Database::get('main'); + + $stmt = $con->prepare(' + SELECT passengerID, fingerPrint + FROM tokens + WHERE passengerID = :pid + LIMIT 1 + '); + $stmt->execute([':pid' => $id]); + $tokenData = $stmt->fetch(); + + if (!$tokenData || !hash_equals($tokenData['fingerPrint'], $fingerPrint)) { + securityLog("Wallet FP mismatch", ['id' => $id]); + jsonError('Device verification failed', 403); + } + + $limiter->reset(RateLimiter::identifier(), 'login'); + + $jwtService = new JwtService($redis); + + $fpPepper = getenv('FP_PEPPER') ?: ''; + $fpHash = hash('sha256', $fingerPrint . $fpPepper); + + $payload = [ + 'user_id' => $id, + 'fingerPrint' => $fpHash, + 'exp' => time() + 300, // 5 دقائق تم إصلاحه + 'iat' => time(), + 'iss' => 'Tripz-Wallet', + 'aud' => $audience, + 'jti' => bin2hex(random_bytes(16)), + ]; + + $secretKey = trim((string)@file_get_contents('/home/intaleq-api/.secret_key_pay')); + $jwt = Firebase\JWT\JWT::encode($payload, $secretKey, 'HS256'); + + $hmac = hash_hmac('sha256', $id, getenv('SECRET_KEY_HMAC')); + + jsonSuccess([ + 'status' => 'success', + 'jwt' => $jwt, + 'hmac' => $hmac, + 'expires_in' => 300, + ]); + +} catch (PDOException $e) { + securityLog("LoginWallet PDO Error", ['msg' => $e->getMessage()]); + jsonError('Database error', 500); +} catch (Exception $e) { + securityLog("LoginWallet Error", ['msg' => $e->getMessage()]); + jsonError('Server error', 500); +} \ No newline at end of file diff --git a/backend/logout.php b/backend/logout.php new file mode 100644 index 0000000..fcd73f6 --- /dev/null +++ b/backend/logout.php @@ -0,0 +1,23 @@ +authenticate(); + + $jti = $decoded->jti ?? null; + $exp = $decoded->exp ?? 0; + $remaining = $exp - time(); + + if ($jti && $remaining > 0) { + $jwtService->revokeToken($jti, $remaining); + securityLog("User logged out and token revoked", ['user_id' => $decoded->user_id, 'jti' => $jti]); + } + + jsonSuccess(null, "Logged out successfully"); + +} catch (Exception $e) { + jsonError("Logout failed", 500); +} diff --git a/backend/migrate_driver_passwords.php b/backend/migrate_driver_passwords.php new file mode 100755 index 0000000..cc6b7df --- /dev/null +++ b/backend/migrate_driver_passwords.php @@ -0,0 +1,128 @@ + false, + PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION, + PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_ASSOC, + PDO::MYSQL_ATTR_INIT_COMMAND => "SET NAMES UTF8", + ]; + $pdo = new PDO($dsn, $dbUser, $dbPass, $options); + + // نجلب الحقول التي نحتاجها لبناء السر + $sql = "SELECT id, phone, birthdate, national_number FROM driver"; + $stmt = $pdo->query($sql); + + $update = $pdo->prepare("UPDATE driver SET password = :pwd WHERE id = :id"); + + $count = 0; + $skipped = 0; + $startTime = microtime(true); + + while ($row = $stmt->fetch()) { + $id = $row['id']; + $encPhone = $row['phone']; + $encBirth = $row['birthdate'] ?? null; + $encNat = $row['national_number'] ?? null; + + // نفك التشفير – قد يرجع null لو الحقل فاضي + $phone = $encPhone ? $encryptionHelper->decryptData($encPhone) : null; + $birth = $encBirth ? $encryptionHelper->decryptData($encBirth) : null; + $nat = $encNat ? $encryptionHelper->decryptData($encNat) : null; + + if (empty($id) || empty($phone)) { + // لو ناقصين، نتجاوز السطر مع تسجيل في اللوج + error_log("[MIGRATE] Skip driver id={$id}: missing phone or id."); + $skipped++; + continue; + } + + // في الوضع المثالي عندك nat + birthdate لكل السائقين + // لو حاب تجبرهم يكونوا موجودين: + /* + if (empty($nat) || empty($birth)) { + error_log("[MIGRATE] Skip driver id={$id}: missing nat or birthdate."); + $skipped++; + continue; + } + */ + + // phone مفروض يكون أصلاً مطبّع (9639...) من سكربت التسجيل + $normalizedPhone = trim($phone); + + // نبني baseString: الأساس id + phone + $parts = [$id, $normalizedPhone]; + + // نضيف رقم وطني أو سنة الميلاد (حسب الموجود) + if (!empty($nat)) { + $parts[] = trim($nat); + } elseif (!empty($birth)) { + // birthdate متوقعة بصيغة YYYY-01-01 -> نأخذ السنة فقط + $year = substr($birth, 0, 4); + if (preg_match('/^\d{4}$/', $year)) { + $parts[] = $year; + } + } + + $baseString = implode('|', $parts); + + // اشتقاق السر النهائي (HEX string، بدون باينري) + $hmacHex = hash_hmac('sha256', $baseString, $pepper, false); + + // نخزن فقط الهاش باستخدام password_hash + $pwdHash = password_hash($hmacHex, PASSWORD_DEFAULT); + + $update->execute([ + ':pwd' => $pwdHash, + ':id' => $id, + ]); + + $count++; + + // لوج بسيط كل 100 سائق + if ($count % 100 === 0) { + $elapsed = round(microtime(true) - $startTime, 2); + error_log("[MIGRATE] Progress: updated {$count} drivers, skipped {$skipped}, elapsed {$elapsed}s"); + } + } + + $totalTime = round(microtime(true) - $startTime, 2); + error_log("[MIGRATE] Done. Updated {$count} driver passwords, skipped {$skipped}. Total time: {$totalTime}s"); + echo "Migration finished. Updated {$count} drivers, skipped {$skipped}. Time: {$totalTime}s\n"; + +} catch (PDOException $e) { + error_log("[MIGRATE][PDO] " . $e->getMessage()); + echo "Migration failed (DB error).\n"; + exit(1); +} catch (Exception $e) { + error_log("[MIGRATE][GENERAL] " . $e->getMessage()); + echo "Migration failed (general error).\n"; + exit(1); +} \ No newline at end of file diff --git a/backend/migration/get_all_driver_fingerprints.php b/backend/migration/get_all_driver_fingerprints.php new file mode 100755 index 0000000..dc85754 --- /dev/null +++ b/backend/migration/get_all_driver_fingerprints.php @@ -0,0 +1,48 @@ + + 'Forbidden'])); +} + +try { + $stmt = $con->prepare(' + SELECT captain_id, fingerPrint + FROM driverToken + WHERE fingerPrint IS NOT NULL + AND fingerPrint != "" + ORDER BY captain_id + '); + $stmt->execute(); + $rows = $stmt->fetchAll(PDO::FETCH_ASSOC); + + echo json_encode([ + 'status' => 'success', + 'count' => count($rows), + 'data' => $rows, + ]); + +} catch (Exception $e) { + error_log('❌ [get_all_driver_fingerprints] ' . $e->getMessage()); + http_response_code(500); + echo json_encode(['error' => 'Server error']); +} diff --git a/backend/migration/get_all_fingerprints.php b/backend/migration/get_all_fingerprints.php new file mode 100755 index 0000000..b2338d5 --- /dev/null +++ b/backend/migration/get_all_fingerprints.php @@ -0,0 +1,57 @@ + 'Forbidden']); + exit; +} + +try { + // جلب كل البصمات من جدول tokens + // نجيب passengerID + fingerPrint فقط — لا نعطي بيانات حساسة أخرى + $stmt = $con->prepare(' + SELECT passengerID, fingerPrint, "passenger" AS userType + FROM tokens + WHERE fingerPrint IS NOT NULL + AND fingerPrint != "" + ORDER BY passengerID + '); + $stmt->execute(); + $rows = $stmt->fetchAll(PDO::FETCH_ASSOC); + + echo json_encode([ + 'status' => 'success', + 'count' => count($rows), + 'data' => $rows, + ]); + http_response_code(200); + +} catch (Exception $e) { + error_log('❌ [get_all_fingerprints] ' . $e->getMessage()); + http_response_code(500); + echo json_encode(['error' => 'Server error']); +} \ No newline at end of file diff --git a/backend/migration/update_driver_fingerprint_admin.php b/backend/migration/update_driver_fingerprint_admin.php new file mode 100755 index 0000000..7f717c5 --- /dev/null +++ b/backend/migration/update_driver_fingerprint_admin.php @@ -0,0 +1,49 @@ + + 'Forbidden'])); +} + +try { + $captainId = filterRequest('captain_id') ?? ''; + $fingerprint = filterRequest('fingerprint') ?? ''; + + if (empty($captainId) || empty($fingerprint)) { + http_response_code(400); + exit(json_encode(['error' => 'Missing parameters'])); + } + + $stmt = $con->prepare(' + UPDATE driverToken + SET fingerPrint = :fp + WHERE captain_id = :cid + '); + $stmt->execute([':fp' => $fingerprint, ':cid' => $captainId]); + + echo json_encode(['status' => 'success', 'affected' => $stmt->rowCount()]); + +} catch (Exception $e) { + error_log('❌ [update_driver_fingerprint_admin] ' . $e->getMessage()); + http_response_code(500); + echo json_encode(['error' => 'Server error']); +} \ No newline at end of file diff --git a/backend/migration/update_fingerprint_admin.php b/backend/migration/update_fingerprint_admin.php new file mode 100755 index 0000000..a394bc0 --- /dev/null +++ b/backend/migration/update_fingerprint_admin.php @@ -0,0 +1,63 @@ + 'Forbidden']); + exit; +} + +try { + $passengerID = filterRequest('passengerID') ?? ''; + $fingerprint = filterRequest('fingerprint') ?? ''; + + if (empty($passengerID) || empty($fingerprint)) { + http_response_code(400); + echo json_encode(['error' => 'Missing parameters']); + exit; + } + + $stmt = $con->prepare(' + UPDATE tokens + SET fingerPrint = :fp + WHERE passengerID = :pid + '); + $stmt->execute([ + ':fp' => $fingerprint, + ':pid' => $passengerID, + ]); + + $affected = $stmt->rowCount(); + + echo json_encode([ + 'status' => 'success', + 'affected' => $affected, + ]); + http_response_code(200); + +} catch (Exception $e) { + error_log('❌ [update_fingerprint_admin] ' . $e->getMessage()); + http_response_code(500); + echo json_encode(['error' => 'Server error']); +} \ No newline at end of file diff --git a/backend/new_driver_car/100221243420413735049.jpg b/backend/new_driver_car/100221243420413735049.jpg new file mode 100644 index 0000000..e2309c0 Binary files /dev/null and b/backend/new_driver_car/100221243420413735049.jpg differ diff --git a/backend/new_driver_car/100276066669243532075.jpg b/backend/new_driver_car/100276066669243532075.jpg new file mode 100644 index 0000000..4b65d07 Binary files /dev/null and b/backend/new_driver_car/100276066669243532075.jpg differ diff --git a/backend/new_driver_car/105897591838899631737.jpg b/backend/new_driver_car/105897591838899631737.jpg new file mode 100644 index 0000000..62a5369 Binary files /dev/null and b/backend/new_driver_car/105897591838899631737.jpg differ diff --git a/backend/new_driver_car/114243034311436865474.jpg b/backend/new_driver_car/114243034311436865474.jpg new file mode 100644 index 0000000..c9ff312 Binary files /dev/null and b/backend/new_driver_car/114243034311436865474.jpg differ diff --git a/backend/new_driver_car/mahmoudcici40FGH4MCQC3fd.jpg b/backend/new_driver_car/mahmoudcici40FGH4MCQC3fd.jpg new file mode 100644 index 0000000..638d8fc Binary files /dev/null and b/backend/new_driver_car/mahmoudcici40FGH4MCQC3fd.jpg differ diff --git a/backend/passenger_socket.php b/backend/passenger_socket.php new file mode 100644 index 0000000..fb80b2a --- /dev/null +++ b/backend/passenger_socket.php @@ -0,0 +1,141 @@ +on('workerStart', function () use ($io, $INTERNAL_KEY, $INTERNAL_PORT) { + + $innerHttp = new Worker("http://0.0.0.0:$INTERNAL_PORT"); + + $innerHttp->onMessage = function ($connection, $request) use ($io, $INTERNAL_KEY) { + + $headers = $request->header(); + $clientIp = $connection->getRemoteIp(); + + if (($headers['x-internal-key'] ?? '') !== $INTERNAL_KEY) { + socket_log("[HTTP_ERROR] Unauthorized internal request from IP: $clientIp"); + $connection->send('Unauthorized'); + return; + } + + $post = $request->post(); + $action = trim($post['action'] ?? ''); + + if ($action === 'update_ride_status') { + + $passengerId = $post['passenger_id'] ?? null; + $rawPayload = $post['payload'] ?? null; + + if (!$passengerId || !$rawPayload) { + socket_log("[HTTP_ERROR] Missing passenger_id or payload for action: update_ride_status", $post); + $connection->send('Error: Missing passenger_id or payload'); + return; + } + + $payload = is_string($rawPayload) + ? (json_decode($rawPayload, true) ?? $rawPayload) + : $rawPayload; + + socket_log("[HTTP_SUCCESS] Emitting 'ride_status_change' to Passenger #$passengerId", $payload); + $io->to('passenger_' . $passengerId)->emit('ride_status_change', $payload); + + $connection->send('OK'); + + } elseif ($action === 'update_driver_location') { + + $passengerId = $post['passenger_id'] ?? null; + $rawPayload = $post['payload'] ?? null; + + if (!$passengerId || !$rawPayload) { + socket_log("[HTTP_ERROR] Missing passenger_id or payload for action: update_driver_location", $post); + $connection->send('Error: Missing passenger_id or payload'); + return; + } + + $payload = is_string($rawPayload) + ? (json_decode($rawPayload, true) ?? $rawPayload) + : $rawPayload; + + socket_log("[HTTP_SUCCESS] Emitting 'driver_location_update' to Passenger #$passengerId", $payload); + $io->to('passenger_' . $passengerId)->emit('driver_location_update', $payload); + + $connection->send('OK'); + + } else { + socket_log("[HTTP_WARNING] Unknown action received: $action", $post); + $connection->send('Unknown action: ' . $action); + } + }; + + $innerHttp->listen(); + socket_log("[INFO] Internal HTTP started on port $INTERNAL_PORT"); +}); + +$io->on('connection', function ($socket) { + + $query = $socket->handshake['query'] ?? []; + $passengerId = $query['id'] ?? null; + $clientIp = $socket->conn->remoteAddress ?? 'Unknown'; + + if (!$passengerId) { + socket_log("[SOCKET_REJECTED] Connection rejected (No passenger ID) from IP: $clientIp"); + $socket->disconnect(); + return; + } + + $socket->join('passenger_' . $passengerId); + socket_log("[SOCKET_CONNECTED] Passenger Connected: #$passengerId (IP: $clientIp)"); + + $socket->on('heartbeat', function ($data) { + // يمكن تفعيل السطر التالي للتأكد من النبضات إذا أردت دقة شديدة، لكنه قد يملأ ملف الـ log + // socket_log("[SOCKET_HEARTBEAT] Received from Passenger #$passengerId"); + }); + + $socket->on('disconnect', function () use ($passengerId, $clientIp) { + socket_log("[SOCKET_DISCONNECTED] Passenger Disconnected: #$passengerId (IP: $clientIp)"); + }); +}); + +Worker::runAll(); \ No newline at end of file diff --git a/backend/privacy_policy.php b/backend/privacy_policy.php new file mode 100755 index 0000000..82e2020 --- /dev/null +++ b/backend/privacy_policy.php @@ -0,0 +1,294 @@ + + + + + + Intaleq - Privacy Policy & Terms + + + + +
+ +
+

الشروط والخصوصية

+
+ تاريخ النفاذ: 09/08/2025     آخر تحديث: 14/08/2025 +
+ +
+

1. شروط الاستخدام والتعريفات

+

شروط الاستخدام

+

عند تحميل أو تصفح أو استخدام تطبيق إنطلق ("التطبيق")، فإنك توافق على الالتزام بهذه الشروط والأحكام. يحق لإنطلق تعديل هذه الشروط في أي وقت. إذا لم توافق على أي جزء من هذه الشروط، يجب عليك التوقف فورًا عن استخدام التطبيق. استمرارك في الاستخدام يعني موافقتك على الشروط وأي تعديلات لاحقة.

+

التعريفات

+
    +
  • "إنطلق" أو "التطبيق": يشير إلى تطبيق الهاتف الذكي الذي يسهل خدمات النقل بين الركاب ("المستخدمين") والسائقين ("مقدمو الخدمة"). وهو منصة حجز رحلات تعمل كوسيط ولا توظف السائقين مباشرة.
  • +
  • "مقدمو الخدمة" (السائقون): الأفراد أو الكيانات المسجلة لتقديم خدمات النقل عبر إنطلق. يدفعون رسوم عمولة عن كل رحلة مكتملة.
  • +
  • "المستخدمون" (الركاب): الأفراد الذين يحجزون الرحلات عبر التطبيق.
  • +
  • "الخدمات": جميع خدمات النقل المقدمة من قبل مقدمي الخدمة عبر التطبيق.
  • +
+
+ +
+

2. سياسة الخصوصية

+

نحن نؤمن بالشفافية الكاملة فيما يتعلق ببياناتك. نوضح أدناه ما نجمعه، ولماذا، وكيف نحميه. يُعد استخدامنا لبيانات الموقع أمراً بالغ الأهمية لخدمتنا، ولذلك يتم شرحه أولاً.

+
+

إفصاح بارز: استخدام بيانات الموقع

+

لتوفير خدماتنا الأساسية لتوصيل الركاب، يقوم تطبيق إنطلق بجمع بيانات الموقع الدقيقة من جهازك المحمول. الوصول إلى موقعك ضروري لكي يعمل التطبيق.

+

نقوم بجمع هذه البيانات في الأوقات التالية:

+
    +
  • عندما يكون التطبيق مفتوحاً على الشاشة (يعمل في الواجهة): لتحديد موقع الانطلاق الخاص بك، وعرضه على الخريطة، وإظهار السائقين القريبين منك.
  • +
  • عندما يعمل التطبيق في الخلفية (بعد منحك الإذن): هذا الأمر حاسم لإيجاد رحلة لك أثناء استخدامك لتطبيقات أخرى، ولتتبع مسار الرحلة لضمان السلامة ودقة حساب الأجرة، ولتمكين مزايا الأمان مثل مشاركة حالة رحلتك.
  • +
+

الغرض من الاستخدام: ببساطة، بدون بيانات موقعك، لا يمكننا إيجاد سائقين لك، أو توجيههم إلى نقطة انطلاقك، أو حساب أجرة رحلتك. يمكنك إدارة أو تعطيل خدمات الموقع من خلال إعدادات جهازك، ولكن يرجى العلم أن القيام بذلك سيمنع تطبيق إنطلق من تقديم خدماته.

+
+

البيانات التي تقدمها بنفسك

+
    +
  • بيانات الهوية (للسائقين): الاسم الكامل، رقم الهاتف، صورة شخصية، ومعلومات الثبوتيات الشخصية للتحقق من الأهلية.
  • +
  • بيانات الدفع: نحن لا نجمع أو نحتفظ بأي بيانات دفع. بدلاً من ذلك، نربطك مع مزودي خدمات دفع محليين مرخصين.
  • +
+

بيانات أخرى يتم جمعها تلقائياً

+
    +
  • بيانات الجهاز والاتصال: طراز جهازك، نظام التشغيل، معرفات الجهاز الفريدة، وعنوان IP لأمان الحساب والتحقق منه.
  • +
  • بيانات الاستخدام: معلومات حول كيفية تفاعلك مع التطبيق، مثل الميزات التي تستخدمها، وسجل رحلاتك، وتقييماتك، وذلك لتحسين خدماتنا.
  • +
+
+ +
+

3. التزامات المستخدم والسلوكيات

+

معلومات دقيقة

+

يجب على المستخدمين تقديم معلومات صحيحة وكاملة وحديثة أثناء التسجيل. سيؤدي استخدام حسابات مزيفة أو أنشطة احتيالية إلى تعليق الحساب.

+

السلوكيات المحظورة

+

يمنع على المستخدمين:

+
    +
  • استخدام التطبيق في أنشطة غير قانونية.
  • +
  • مضايقة السائقين أو الركاب الآخرين.
  • +
  • إلحاق الضرر بالمركبة.
  • +
+
+ +
+

4. حقوق وواجبات الشركة

+

واجباتنا

+
    +
  • حماية بياناتك الشخصية.
  • +
  • إبلاغك بأي تغييرات جوهرية في هذه السياسة.
  • +
  • توفير آليات واضحة لك لممارسة حقوقك المتعلقة بالبيانات.
  • +
+

حقوقنا

+
    +
  • تحديث التطبيق وشروط الخدمة.
  • +
  • اتخاذ الإجراءات اللازمة في حال مخالفة المستخدم للسياسة.
  • +
  • رفض تقديم الخدمة لأي سبب مشروع.
  • +
+
+ +
+

5. سياسات الرحلات والسلامة

+

سياسة منع التدخين

+

يُحظر التدخين منعاً باتاً في جميع المركبات.

+

إجراءات السلامة لكوفيد-19

+

نحث جميع المستخدمين والسائقين على اتباع الإرشادات الصحية المحلية.

+
+ +
+

6. إخلاء المسؤولية

+

يقدم التطبيق والخدمات "كما هي" دون أي ضمانات. إنطلق هي منصة وسيطة ولا تتحمل المسؤولية عن أفعال السائقين أو المستخدمين.

+
+ +
+

7. التعديل على السياسة

+

في حال قمنا بإجراء تعديلات جوهرية على هذه الشروط، سنتعهد بإبلاغك بشكل واضح داخل التطبيق. سيُطلب منك قبول الشروط الجديدة لمواصلة استخدام الخدمة.

+
+ +
+

8. حذف الحساب والتواصل معنا

+

لحذف حسابك أو بياناتك، يرجى مراسلتنا على البريد الإلكتروني. يتم الرد على الطلبات خلال 30 يومًا.

+

لأي استفسارات، يرجى التواصل عبر: support@intaleqapp.com

+
+ +
+ +
+

Policy & Terms

+
+ Effective Date: 09/08/2025     Last Updated: 14/08/2025 +
+ +
+

1. Terms of Use & Definitions

+

Terms of Use

+

By downloading, browsing, or using the Intaleq application ("the App"), you agree to be bound by these Terms and Conditions. Intaleq reserves the right to modify these terms at any time. Continued use constitutes acceptance of the terms.

+

Definitions

+
    +
  • "Intaleq" or "the App": Refers to the smartphone application that facilitates ride-hailing services.
  • +
  • "Service Providers" (Drivers): Individuals or entities registered to provide transportation services through Intaleq.
  • +
  • "Users" (Passengers): Individuals who book rides through the App.
  • +
  • "Services": All transportation services provided by Service Providers via the App.
  • +
+
+ +
+

2. Privacy Policy

+

We believe in full transparency regarding your data. Our use of location data is critical to our service and is explained first.

+
+

Prominent Disclosure: Use of Location Data

+

To provide our core ride-hailing services, the Intaleq app collects precise location data from your mobile device. Access to your location is essential for the app to function.

+

We collect this data:

+
    +
  • When the app is open and visible (in the foreground): To determine your pickup location and show you nearby drivers.
  • +
  • When the app is running in the background (after you grant permission): This is crucial to connect you with a ride, track the trip's progress for safety and fare calculation.
  • +
+

Purpose of Use: Without your location data, we cannot find drivers for you, guide them to your pickup point, or calculate your fare. Disabling location services will prevent the app from providing its services.

+
+

Data You Provide Yourself

+
    +
  • Identity Data (for Drivers): Full name, phone number, profile picture, and personal identification to verify eligibility.
  • +
  • Payment Data: We do not collect or store any payment data like card numbers. We connect you with licensed local payment providers.
  • +
+

Other Automatically Collected Data

+
    +
  • Device & Connection Data: Your device's model, OS, unique identifiers, and IP address for security.
  • +
  • Usage Data: Information about how you interact with the app, such as trip history and ratings, to improve our services.
  • +
+
+ +
+

3. User Obligations & Conduct

+

Accurate Information

+

Users must provide true, complete, and up-to-date information. Fake accounts will result in account suspension.

+

Prohibited Conduct

+

Users must not:

+
    +
  • Use the App for illegal activities.
  • +
  • Harass drivers or other passengers.
  • +
  • Damage the vehicle.
  • +
+
+ +
+

4. Company Rights and Duties

+

Our Duties

+
    +
  • To protect your personal data.
  • +
  • To inform you of material changes to this policy.
  • +
  • To provide clear mechanisms to exercise your data rights.
  • +
+

Our Rights

+
    +
  • To update the application and terms of service.
  • +
  • To take necessary actions in case of user violation.
  • +
  • To refuse service for any legitimate reason.
  • +
+
+ +
+

5. Ride & Safety Policies

+

No-Smoking Policy

+

Smoking is strictly prohibited in all vehicles.

+

COVID-19 Safety

+

We urge all users and drivers to follow local health guidelines.

+
+ +
+

6. Disclaimer of Liability

+

The App and services are provided "as is". Intaleq is an intermediary platform and is not liable for the acts of any user or driver.

+
+ +
+

7. Policy Modifications

+

If we make material changes, we will inform you clearly within the app. You will be required to accept the new terms to continue using the service.

+
+ +
+

8. Account Deletion & Contact Us

+

To delete your account or data, please email us. Requests are processed within 30 days.

+

For any questions, contact us at: support@intaleqapp.com

+
+
+ +
+ + + \ No newline at end of file diff --git a/backend/privacy_policy1.php b/backend/privacy_policy1.php new file mode 100755 index 0000000..04886a1 --- /dev/null +++ b/backend/privacy_policy1.php @@ -0,0 +1,240 @@ + + + + + +سياسة الخصوصية وشروط الخدمة – Intaleq Driver + + + + + +
+

سياسة الخصوصية وشروط الخدمة – تطبيق Intaleq Driver

+

آخر تحديث: 14-08-2025

+

المشغّل/المتحكم بالبيانات: انطلق لنقل الركاب

+

البريد للتواصل: support@intaleqapp.com

+
+ +
+

إفصاح بارز عن البيانات الحساسة – الموقع الجغرافي

+

يجمع تطبيق Intaleq Driver بيانات الموقع الدقيقة من جهاز السائق أثناء فتح التطبيق وأيضًا أثناء عمله في الخلفية/وعند إغلاقه، لغايات إسناد الرحلات القريبة، وتتبع الرحلة حيًا، واحتساب المسافة والأجرة بدقة.

+
    +
  • في الواجهة (Foreground): عرض موقع السائق على الخريطة وإتاحة الطلبات المناسبة.
  • +
  • في الخلفية/عند الإغلاق: استقبال طلبات جديدة قريبة، وتمكين تتبع الراكب للمسار، وحساب المسافة/الوقت/الأجرة.
  • +
+

يمكنك إدارة إذن الموقع من إعدادات النظام. تعطيل الإذن سيمنع الوظائف الأساسية للتطبيق.

+
+ +
+

1) الفئات الكاملة للبيانات التي نجمعها

+
+
+

أ. بيانات يقدّمها السائق

+
    +
  • هوية: الاسم الكامل، رقم الهاتف، صورة الملف.
  • +
  • مركبة: النوع/الطراز، رقم اللوحة، صور المركبة.
  • +
  • وثائق قانونية: رخصة القيادة، رخصة المركبة، وأي مستندات مطلوبة للامتثال.
  • +
  • إعدادات الحساب والتفضيلات.
  • +
+
+
+

ب. بيانات تُجمع تلقائيًا

+
    +
  • الموقع: دقيق/تقريبي، في الواجهة والخلفية كما ورد أعلاه.
  • +
  • بيانات الرحلات والاستخدام: سجل الرحلات، نقاط الانطلاق/الوصول، المدد والمسافات، التقييمات.
  • +
  • بيانات الجهاز والمعرّفات: طراز الجهاز، نظام التشغيل، معرّفات إشعارات (FCM token)، عنوان IP، سجلات الأداء والأعطال.
  • +
  • بيانات الدفع والعوائد (إن وُجدت): المبالغ المستحقة، سجلات السحب/التسوية.
  • +
+
+
+
+ +
+

2) الأغراض القانونية لاستخدام البيانات

+
    +
  • تشغيل الخدمة الأساسية وإسناد الرحلات والملاحة وتتبع الرحلة واحتساب الأجرة.
  • +
  • السلامة ومنع الاحتيال والتحقق من الأهلية القانونية للسائق.
  • +
  • الدعم الفني وتحسين الجودة والتحليلات المجمّعة.
  • +
  • الالتزام بواجبات محاسبية/ضريبية وقانونية.
  • +
+

الأساس القانوني: تنفيذ العقد، المصلحة المشروعة (السلامة/منع الاحتيال/التحسين)، والموافقة للأذونات الحساسة مثل الموقع في الخلفية.

+
+ +
+

3) المشاركة والجهات المتلقّية

+
    +
  • مزودو الخرائط/الملاحة (مثل Google Maps Platform) لمعالجة الخرائط والتوجيه.
  • +
  • خدمات الإشعارات والأداء/الأعطال (مثل Firebase Cloud Messaging وCrashlytics/Analytics).
  • +
  • مزودو الدفع والتحقق والامتثال حسب السوق (مثل MTN، Syriatel، eCash/الهرم) عند الحاجة.
  • +
  • جهات رسمية/رقابية عند وجود التزام قانوني.
  • +
+

لا نبيع بياناتك الشخصية. وأي مشاركة مقيّدة باتفاقيات ومعايير أمان مناسبة.

+
+ +
+

4) الاحتفاظ بالبيانات

+
    +
  • بيانات الحساب والهوية: طالما الحساب فعّال، ثم لمدة معقولة بعد الإنهاء للامتثال/حل النزاعات.
  • +
  • بيانات الرحلات والفوترة: وفق المتطلبات القانونية المحلية (عادة بين 3–5 سنوات).
  • +
  • سجلات الأداء والأعطال: لفترات أقصر (عادة حتى 12 شهرًا).
  • +
+
+ +
+

5) أمان المعلومات

+
    +
  • تشفير أثناء النقل (TLS) وتدابير وصول مقيّدة وسجلات تدقيق.
  • +
  • مراجعات دورية وإصلاح الثغرات عند اكتشافها.
  • +
+

لا توجد وسيلة نقل/تخزين إلكترونية آمنة تمامًا، لكننا نطبّق أفضل الممارسات المناسبة للخدمة.

+
+ +
+

6) القاصرون

+

خدمتنا موجّهة للسائقين البالغين قانونيًا فقط. لا نستهدف القاصرين ولا نجمع عن علم بيانات لمن هم دون السن القانوني المناسب لسوقنا. إن علمنا بذلك سنحذف البيانات ونعطّل الحساب.

+
+ +
+

7) حقوقك

+
    +
  • الاطلاع على بياناتك والحصول على نسخة منها.
  • +
  • تصحيح البيانات غير الدقيقة.
  • +
  • طلب الحذف (مع مراعاة الالتزامات القانونية للاحتفاظ).
  • +
  • تقييد أو الاعتراض على المعالجة في حالات محددة.
  • +
  • سحب الموافقة للأذونات الحساسة (مثل الموقع في الخلفية) من إعدادات الجهاز، دون أن يؤثر ذلك على قانونية المعالجة السابقة للسحب.
  • +
+

لممارسة أي من هذه الحقوق أو لتقديم شكوى، تواصل معنا عبر: support@intaleqapp.com.

+
+ +
+

8) النقل الدولي للبيانات

+

قد تُعالَج البيانات على خوادم/مزودين خارج بلدك. نتخذ تدابير تعاقدية وفنية مع شركائنا لضمان مستوى حماية مناسب.

+
+ +
+

9) ملفات تعريف الارتباط (Cookies) والمواقع

+

قد يستخدم موقعنا الإلكتروني كوكيز ضرورية للتشغيل و/أو تحليلات أساسية. يمكنك التحكم بها عبر إعدادات المتصفح. تطبيق الهاتف لا يعتمد على كوكيز، لكنه قد يستخدم معرّفات أجهزة لأغراض إشعارات/تحليلات.

+
+ +
+

10) أذونات أخرى قد يطلبها التطبيق

+
    +
  • الإشعارات (Push): لإعلام السائق بالطلبات والرسائل.
  • +
  • الكاميرا/الصور: لالتقاط/رفع صور الوثائق أو المركبة (إن طُلبت).
  • +
  • التخزين: لحفظ/قراءة صور الوثائق (إن لزم).
  • +
+
+ +
+

11) إدارة الأذونات

+

على Android: الإعدادات > التطبيقات > Intaleq Driver > الأذونات (الموقع/الكاميرا/الصور/الإشعارات…). تعطيل بعض الأذونات قد يوقف الميزات الأساسية كاستلام الطلبات.

+
+ +
+

12) التعديلات على هذه السياسة

+

قد نحدّث هذه السياسة من وقت لآخر. سنغيّر تاريخ "آخر تحديث" أعلاه، وقد نرسل إشعارًا داخل التطبيق عند التغييرات الجوهرية.

+
+ +
+

13) حذف الحساب والتواصل

+

يمكنك طلب حذف حسابك وبياناتك عبر البريد: support@intaleqapp.com. نعالج الطلب خلال 30 يومًا ما لم تمنعنا متطلبات قانونية من ذلك.

+
+ +
+ + +
+

Privacy Policy (English)

+

Last Updated: 14 Aug 2025 – Data Controller: Intaleq for Passenger Transport – Contact: support@intaleqapp.com

+ +
+

Prominent Disclosure – Location

+

The Intaleq Driver app collects precise location data while the app is in the foreground and also in the background/when closed, to dispatch nearby jobs, enable live trip tracking, and accurately compute distance and fares.

+
    +
  • Foreground: show driver location and enable dispatch.
  • +
  • Background/closed: receive new requests, rider trip-tracking, and route/fare computation.
  • +
+

Permissions can be managed in system settings; disabling location prevents core functionality.

+
+ +

Data We Collect

+
    +
  • Driver-provided: name, phone, profile photo; vehicle details; legal documents; account settings.
  • +
  • Automatically collected: precise/approximate location (foreground & background), trip history, start/finish points, durations/distances, ratings; device info and identifiers (e.g., FCM token), IP, performance/crash logs; payout/billing data where applicable.
  • +
+ +

Purposes & Legal Bases

+
    +
  • Core service operation (dispatch, navigation, tracking, fare computation); safety & fraud prevention; support; analytics; legal compliance.
  • +
  • Legal bases: contract performance; legitimate interests (safety, fraud prevention, improvement); consent for sensitive permissions such as background location.
  • +
+ +

Sharing

+
    +
  • Map/navigation providers (e.g., Google Maps Platform), notifications/performance/crash services (e.g., Firebase), payment/verification partners (e.g., MTN, Syriatel, eCash/Al-Haram as applicable), and authorities when legally required. No sale of personal data.
  • +
+ +

Retention

+
    +
  • Account/identity: while the account is active and for a reasonable period thereafter.
  • +
  • Trips/billing: per legal requirements (typically 3–5 years).
  • +
  • Performance/crash logs: typically up to 12 months.
  • +
+ +

Security

+

TLS in transit, restricted access, audit logs, and reasonable technical/organizational measures.

+ +

Minors

+

Service is intended for legally adult drivers only. We do not knowingly collect data from minors; if identified, we will delete data and disable the account.

+ +

Your Rights

+
    +
  • Access, rectification, deletion (subject to legal retention), restriction/objection, data portability where applicable, and consent withdrawal for sensitive permissions.
  • +
+ +

International Transfers

+

Data may be processed on servers/providers outside your country; we use contractual and technical safeguards with partners.

+ +

Cookies & Websites

+

Our website may use essential/analytics cookies; you can control them in your browser. The mobile app uses device identifiers instead of cookies.

+ +

Other Permissions

+

Push notifications; camera/photos for document/vehicle images; storage for saving/reading such images.

+ +

Changes

+

We may update this policy and will adjust the “Last Updated” date; material changes may be notified in-app.

+ +

Account Deletion & Contact

+

Email us at support@intaleqapp.com. We aim to fulfill deletion requests within 30 days unless legal obligations prevent immediate deletion.

+
+ +
+ +
+

شروط الخدمة المختصرة

+
    +
  • باستخدام التطبيق، تُقرّ بالتزامك بالقوانين المحلية وبسياسة الخصوصية.
  • +
  • تقديم معلومات دقيقة والمحافظة على سلوك مهني وسلامة المركبة.
  • +
+
+ +
+

© 2025 انطلق لنقل الركاب – جميع الحقوق محفوظة.

+
+ + + \ No newline at end of file diff --git a/backend/ride/RegisrationCar/add.php b/backend/ride/RegisrationCar/add.php new file mode 100755 index 0000000..94b39d1 --- /dev/null +++ b/backend/ride/RegisrationCar/add.php @@ -0,0 +1,80 @@ + $driverID, + 'vin' => $vin, + 'car_plate' => $carPlate, + 'make' => $make, + 'model' => $model, + 'year' => $year, + 'expirationDate' => $expirationDate, + 'color' => $color, + 'owner' => $owner, + 'colorHex' => $colorHex, + 'fuel' => $fuel, +]; + +foreach ($required as $field => $val) { + if ($val === null || $val === '') { + jsonError("Missing required field: $field"); + exit; + } +} + +/* ───── 3) تشفير الحقول الحساسة ───── */ +$vin = $encryptionHelper->encryptData($vin); +$carPlate = $encryptionHelper->encryptData($carPlate); +$owner = $encryptionHelper->encryptData($owner); + +/* ───── 4) هل لدى السائق مركبة مُسجلة سابقًا؟ ───── */ +$hasCar = $con->prepare("SELECT 1 FROM CarRegistration WHERE driverID = :d LIMIT 1"); +$hasCar->execute([':d' => $driverID]); +$isDefault = $hasCar->rowCount() === 0 ? 1 : 0; + +/* ───── 5) إدراج السجل ───── */ +$sql = " + INSERT INTO CarRegistration ( + driverID, vin, car_plate, make, model, year, expiration_date, + color, owner, color_hex, fuel, isDefault, created_at, status + ) VALUES ( + :driverID, :vin, :carPlate, :make, :model, :year, :expirationDate, + :color, :owner, :colorHex, :fuel, :isDefault, NOW(), 'yet' + ) +"; + +$ins = $con->prepare($sql); +$ins->execute([ + ':driverID' => $driverID, + ':vin' => $vin, + ':carPlate' => $carPlate, + ':make' => $make, + ':model' => $model, + ':year' => $year, + ':expirationDate' => $expirationDate, + ':color' => $color, + ':owner' => $owner, + ':colorHex' => $colorHex, + ':fuel' => $fuel, + ':isDefault' => $isDefault, +]); + +if ($ins->rowCount() > 0) { + jsonSuccess(null, "Car registration saved."); +} else { + jsonError("Failed to save car registration."); +} \ No newline at end of file diff --git a/backend/ride/RegisrationCar/delete.php b/backend/ride/RegisrationCar/delete.php new file mode 100644 index 0000000..e69de29 diff --git a/backend/ride/RegisrationCar/get.php b/backend/ride/RegisrationCar/get.php new file mode 100644 index 0000000..e69de29 diff --git a/backend/ride/RegisrationCar/makeDefaultCar.php b/backend/ride/RegisrationCar/makeDefaultCar.php new file mode 100755 index 0000000..dbd8f3b --- /dev/null +++ b/backend/ride/RegisrationCar/makeDefaultCar.php @@ -0,0 +1,29 @@ +prepare($sql1); + $stmt1->bindParam(':driverID', $driverID); + $stmt1->execute(); + + // ثانياً: تعيين السيارة المحددة كافتراضية + $sql2 = "UPDATE `CarRegistration` SET `isDefault` = 1 WHERE `id` = :id"; + $stmt2 = $con->prepare($sql2); + $stmt2->bindParam(':id', $id); + $stmt2->execute(); + + if ($stmt2->rowCount() > 0) { + jsonSuccess(null, "Default car updated successfully."); + } else { + jsonError("Failed to update default car."); + } +} catch (PDOException $e) { + error_log("DB Error: " . $e->getMessage()); + jsonError("Database error occurred."); +} +?> \ No newline at end of file diff --git a/backend/ride/RegisrationCar/selectDriverAndCarForMishwariTrip.php b/backend/ride/RegisrationCar/selectDriverAndCarForMishwariTrip.php new file mode 100755 index 0000000..b5c9d5e --- /dev/null +++ b/backend/ride/RegisrationCar/selectDriverAndCarForMishwariTrip.php @@ -0,0 +1,125 @@ += NOW() - INTERVAL 1 DAY + AND cr.make NOT LIKE '%دراج%' + AND cr.model NOT LIKE '%دراج%' + ) + SELECT + d.id AS driver_id, + d.phone, + d.gender, + d.name_arabic AS name_arabic, + d.name_english, + d.address, + ll.latitude, + ll.longitude, + FLOOR(DATEDIFF(CURDATE(), STR_TO_DATE(CONCAT(d.birthdate, '-01-01'), '%Y-%m-%d')) / 365.25) AS age, + c.car_plate, + c.make, + c.model, + c.year, + c.color, + c.fuel, + c.displacement, + c.color_hex, + dt.token, + COALESCE(avg_rating.rating, 5) AS rating, + COALESCE(ride_count.count, 0) AS ride_count + FROM driver d + JOIN CarRegistration c ON c.driverID = d.id + JOIN LatestLocations ll ON ll.driver_id = d.id AND ll.row_num = 1 + LEFT JOIN driverToken dt ON dt.captain_id = d.id + LEFT JOIN ( + SELECT driver_id, AVG(rating) AS rating + FROM ratingDriver + GROUP BY driver_id + ) avg_rating ON avg_rating.driver_id = d.id + LEFT JOIN ( + SELECT driver_id, COUNT(*) AS count + FROM ride + WHERE status = 'Finished' + GROUP BY driver_id + ) ride_count ON ride_count.driver_id = d.id + WHERE c.year BETWEEN ? AND ? + ORDER BY rating DESC, c.year DESC, ride_count DESC + LIMIT 10"; + + $stmt = $con->prepare($sql); + $stmt->execute([ + $swLat, $neLat, $swLon, $neLon, + $yearMin, $yearMax, + $yearMin, $yearMax + ]); + + $rows = $stmt->fetchAll(PDO::FETCH_ASSOC); + + // فك التشفير عن الحقول الحساسة + foreach ($rows as &$row) { + $row['phone'] = $encryptionHelper->decryptData($row['phone']); + $row['gender'] = $encryptionHelper->decryptData($row['gender']); + $row['name_arabic'] = $encryptionHelper->decryptData($row['name_arabic']); + $row['name_english'] = $encryptionHelper->decryptData($row['name_english']); + $row['address'] = $encryptionHelper->decryptData($row['address']); + $row['car_plate'] = $encryptionHelper->decryptData($row['car_plate']); + $row['token'] = $encryptionHelper->decryptData($row['token']); + } + + if (count($rows) > 0) { + jsonSuccess($rows); + } else { + jsonError("No drivers found in the specified area"); + } + +} catch (PDOException $e) { + jsonError("Database error: " . $e->getMessage()); +} catch (Exception $e) { + jsonError("Error: " . $e->getMessage()); +} \ No newline at end of file diff --git a/backend/ride/RegisrationCar/update.php b/backend/ride/RegisrationCar/update.php new file mode 100755 index 0000000..a85896c --- /dev/null +++ b/backend/ride/RegisrationCar/update.php @@ -0,0 +1,61 @@ +encryptData($value); + } + $columnValues[$column] = $value; + } + } +} + +// بناء جملة SET للتحديث +$setClause = []; +foreach ($columnValues as $column => $value) { + $setClause[] = "`$column` = :$column"; +} +$setClause = implode(", ", $setClause); + +// التحقق من وجود بيانات للتحديث +if (empty($setClause)) { + jsonError("No data provided to update."); + exit(); +} + +// ✅ تأكد من اسم الجدول الصحيح +$sql = "UPDATE `CarRegistration` SET $setClause WHERE `driverID` = :driverID AND `id` = :id"; + +$stmt = $con->prepare($sql); + +// ربط القيم بالاستعلام +foreach ($columnValues as $column => $value) { + $stmt->bindValue(":$column", $value); +} +$stmt->bindValue(':driverID', $driverID); +$stmt->bindValue(':id', $id); + +$stmt->execute(); + +if ($stmt->rowCount() > 0) { + jsonSuccess(null, "Car registration data updated successfully"); +} else { + jsonError("Failed to update car registration data"); +} +?> \ No newline at end of file diff --git a/backend/ride/apiKey/add.php b/backend/ride/apiKey/add.php new file mode 100644 index 0000000..e69de29 diff --git a/backend/ride/apiKey/delete.php b/backend/ride/apiKey/delete.php new file mode 100644 index 0000000..e69de29 diff --git a/backend/ride/apiKey/error_log b/backend/ride/apiKey/error_log new file mode 100644 index 0000000..e69de29 diff --git a/backend/ride/apiKey/get.php b/backend/ride/apiKey/get.php new file mode 100644 index 0000000..2fd0b09 --- /dev/null +++ b/backend/ride/apiKey/get.php @@ -0,0 +1,48 @@ +prepare($sql); + $stmt->execute(); + $result = $stmt->fetchAll(PDO::FETCH_ASSOC); + + return $result; +} + + +?> \ No newline at end of file diff --git a/backend/ride/apiKey/update.php b/backend/ride/apiKey/update.php new file mode 100644 index 0000000..e69de29 diff --git a/backend/ride/call/driver/create_call_session.php b/backend/ride/call/driver/create_call_session.php new file mode 100644 index 0000000..327a042 --- /dev/null +++ b/backend/ride/call/driver/create_call_session.php @@ -0,0 +1,127 @@ +prepare(" + SELECT r.id, r.passenger_id, d.first_name, d.last_name + FROM ride r + JOIN driver d ON d.id = r.driver_id + WHERE r.id = :rid AND r.driver_id = :did AND r.status IN ('accepted', 'arrived', 'started', 'begin', 'Begin', 'Apply', 'apply', 'Applied', 'applied') + LIMIT 1 + "); + $stmt->execute([':rid' => $rideId, ':did' => $user_id]); + $ride = $stmt->fetch(); + + if (!$ride) { + printFailure('No active ride found matching request', 404); + exit; + } + + $passengerId = $ride['passenger_id']; + $callerName = trim($encryptionHelper->decryptData($ride['first_name'] ?? '') . ' ' . $encryptionHelper->decryptData($ride['last_name'] ?? '')); + + // 2. Query Node.js signaling server to establish session + $url = (getenv('VOICE_CALL_SERVER_URL') ?: 'https://calls.intaleqapp.com') . '/sessions'; + $apiKey = getenv('VOICE_CALL_API_KEY') ?: ''; + + $ch = curl_init($url); + $payload = json_encode([ + 'ride_id' => (string)$rideId, + 'driver_id' => (string)$user_id, + 'passenger_id' => (string)$passengerId + ]); + + curl_setopt_array($ch, [ + CURLOPT_POST => true, + CURLOPT_RETURNTRANSFER => true, + CURLOPT_POSTFIELDS => $payload, + CURLOPT_HTTPHEADER => [ + "x-api-key: $apiKey", + "Content-Type: application/json" + ], + CURLOPT_TIMEOUT => 5, + CURLOPT_SSL_VERIFYPEER => false + ]); + + $result = curl_exec($ch); + $httpCode = curl_getinfo($ch, CURLINFO_HTTP_CODE); + curl_close($ch); + + if ($httpCode !== 200) { + error_log("[driver_create_call_session.php] Signaling server session mapping failed: $result (HTTP $httpCode)"); + printFailure('Signaling server error', 502); + exit; + } + + $sessionData = json_decode($result, true); + if (!isset($sessionData['session_id'])) { + printFailure('Invalid response schema from signaling server'); + exit; + } + + $sessionId = $sessionData['session_id']; + + // 3. Dispatch data-only FCM call trigger to Passenger + $stmtToken = $con->prepare(" + SELECT token + FROM tokens + WHERE passengerID = :pid + ORDER BY id DESC + LIMIT 1 + "); + $stmtToken->execute([':pid' => $passengerId]); + $passengerTokenRow = $stmtToken->fetch(); + + if ($passengerTokenRow && !empty($passengerTokenRow['token'])) { + $decryptedToken = $encryptionHelper->decryptData($passengerTokenRow['token']); + sendFcmNotification( + $decryptedToken, + 'Incoming Call', + 'Incoming WebRTC voice call', + [ + 'type' => 'incoming_call', + 'session_id' => (string)$sessionId, + 'caller_name' => $callerName, + 'caller_avatar' => '', + 'ride_id' => (string)$rideId + ], + 'incoming_call', + 'ding' + ); + } + + echo json_encode([ + 'status' => 'success', + 'message' => 'Call session created successfully', + 'data' => [ + 'session_id' => $sessionId, + 'expires_in' => $sessionData['expires_in'] ?? 60 + ] + ], JSON_UNESCAPED_UNICODE); + exit; + +} catch (Throwable $e) { + error_log("[driver_create_call_session.php] Critical exception: " . $e->getMessage()); + printFailure('Server error', 500); +} diff --git a/backend/ride/call/passenger/create_call_session.php b/backend/ride/call/passenger/create_call_session.php new file mode 100644 index 0000000..725f13a --- /dev/null +++ b/backend/ride/call/passenger/create_call_session.php @@ -0,0 +1,132 @@ +prepare(" + SELECT r.id, r.driver_id, p.first_name, p.last_name + FROM ride r + JOIN passengers p ON p.id = r.passenger_id + WHERE r.id = :rid AND r.passenger_id = :pid AND r.status IN ('accepted', 'arrived', 'started', 'begin', 'Begin', 'Apply', 'apply', 'Applied', 'applied') + LIMIT 1 + "); + $stmt->execute([':rid' => $rideId, ':pid' => $user_id]); + $ride = $stmt->fetch(); + + if (!$ride) { + printFailure('No active ride found matching request', 404); + exit; + } + + $driverId = $ride['driver_id']; + if (empty($driverId) || $driverId === 'yet') { + printFailure('No driver accepted this ride yet', 400); + exit; + } + + $callerName = trim($encryptionHelper->decryptData($ride['first_name'] ?? '') . ' ' . $encryptionHelper->decryptData($ride['last_name'] ?? '')); + + // 2. Query Node.js signaling server to establish session + $url = (getenv('VOICE_CALL_SERVER_URL') ?: 'https://calls.intaleqapp.com') . '/sessions'; + $apiKey = getenv('VOICE_CALL_API_KEY') ?: ''; + + $ch = curl_init($url); + $payload = json_encode([ + 'ride_id' => (string)$rideId, + 'driver_id' => (string)$driverId, + 'passenger_id' => (string)$user_id + ]); + + curl_setopt_array($ch, [ + CURLOPT_POST => true, + CURLOPT_RETURNTRANSFER => true, + CURLOPT_POSTFIELDS => $payload, + CURLOPT_HTTPHEADER => [ + "x-api-key: $apiKey", + "Content-Type: application/json" + ], + CURLOPT_TIMEOUT => 5, + CURLOPT_SSL_VERIFYPEER => false + ]); + + $result = curl_exec($ch); + $httpCode = curl_getinfo($ch, CURLINFO_HTTP_CODE); + curl_close($ch); + + if ($httpCode !== 200) { + error_log("[passenger_create_call_session.php] Signaling server session mapping failed: $result (HTTP $httpCode)"); + printFailure('Signaling server error', 502); + exit; + } + + $sessionData = json_decode($result, true); + if (!isset($sessionData['session_id'])) { + printFailure('Invalid response schema from signaling server'); + exit; + } + + $sessionId = $sessionData['session_id']; + + // 3. Dispatch data-only FCM call trigger to Driver + $stmtToken = $con->prepare(" + SELECT token + FROM driverToken + WHERE captain_id = :did + ORDER BY created_at DESC + LIMIT 1 + "); + $stmtToken->execute([':did' => $driverId]); + $driverTokenRow = $stmtToken->fetch(); + + if ($driverTokenRow && !empty($driverTokenRow['token'])) { + $decryptedToken = $encryptionHelper->decryptData($driverTokenRow['token']); + sendFcmNotification( + $decryptedToken, + 'Incoming Call', + 'Incoming WebRTC voice call', + [ + 'type' => 'incoming_call', + 'session_id' => (string)$sessionId, + 'caller_name' => $callerName, + 'caller_avatar' => '', + 'ride_id' => (string)$rideId + ], + 'incoming_call', + 'ding' + ); + } + + echo json_encode([ + 'status' => 'success', + 'message' => 'Call session created successfully', + 'data' => [ + 'session_id' => $sessionId, + 'expires_in' => $sessionData['expires_in'] ?? 60 + ] + ], JSON_UNESCAPED_UNICODE); + exit; + +} catch (Throwable $e) { + error_log("[passenger_create_call_session.php] Critical exception: " . $e->getMessage()); + printFailure('Server error', 500); +} diff --git a/backend/ride/cancelRide/add.php b/backend/ride/cancelRide/add.php new file mode 100644 index 0000000..57e3e12 --- /dev/null +++ b/backend/ride/cancelRide/add.php @@ -0,0 +1,25 @@ +prepare($sql); +$stmt->bindParam(':driverID', $driverID); +$stmt->bindParam(':passengerID', $passengerID); +$stmt->bindParam(':rideID', $rideID); +$stmt->bindParam(':note', $note); +$stmt->execute(); + +if ($stmt->rowCount() > 0) { + jsonSuccess(null, "Record inserted successfully"); +} else { + jsonError("Failed to insert record"); +} +?> \ No newline at end of file diff --git a/backend/ride/cancelRide/addCancelTripFromDriverAfterApplied.php b/backend/ride/cancelRide/addCancelTripFromDriverAfterApplied.php new file mode 100644 index 0000000..3a9d7e0 --- /dev/null +++ b/backend/ride/cancelRide/addCancelTripFromDriverAfterApplied.php @@ -0,0 +1,150 @@ + $rideId]; + +try { + // ================================================================================= + // المرحلة الأولى: إلغاء الرحلة (نفس منطق السكريبت الأول) + // ================================================================================= + + // 1. التحديث على سيرفر التتبع (Remote DB) + error_log("🔄 [Step 1] Attempting to cancel on REMOTE Tracking DB..."); + $stmtRemote = $con_ride->prepare($sqlCancel); + $stmtRemote->execute($params); + $count = $stmtRemote->rowCount(); + + // إذا نجح التحديث في السيرفر البعيد (أو لم ينجح نتحقق من المحلي أيضا لضمان التزامن) + // لكن المنطق الأساسي يعتمد على أن الرحلة قابلة للتعديل + if ($count > 0) { + + // 2. التحديث على السيرفر المحلي (Local DB) + error_log("🔄 [Step 1] Remote success. Cancelling on LOCAL Main DB..."); + $stmtLocal = $con->prepare($sqlCancel); + $stmtLocal->execute($params); + + error_log("✅ [Step 1] Ride cancelled successfully on database."); + + // ================================================================================= + // المرحلة الثانية: تسجيل الطلب وتنظيف البيانات (نفس منطق السكريبت الثاني) + // لن يتم الدخول هنا إلا إذا نجح الإلغاء فعلياً + // ================================================================================= + + error_log("🔄 [Step 2] Inserting into driver_orders and cleaning background tasks..."); + + // أ. إضافة سجل في driver_orders + $orderStatus = 'pending'; // كما في السكريبت الثاني + $sqlInsertOrder = "INSERT INTO driver_orders (driver_id, order_id, notes, status) + VALUES (?, ?, ?, ?)"; + $stmtInsert = $con->prepare($sqlInsertOrder); + $stmtInsert->execute([$driverID, $rideId, $note, $orderStatus]); + + // ب. حذف آخر سجل من write_argument_after_applied_from_background + // نستخدم نفس الاستعلام الفرعي الذي كنت تستخدمه + $sqlDelete = "DELETE FROM write_argument_after_applied_from_background + WHERE id = ( + SELECT id FROM ( + SELECT id + FROM write_argument_after_applied_from_background + WHERE driver_id = ? + ORDER BY time_of_order DESC + LIMIT 1 + ) AS t + )"; + $stmtDelete = $con->prepare($sqlDelete); + $stmtDelete->execute([$driverID]); + + error_log("✅ [Step 2] Driver order logged and background task cleaned."); + + // ================================================================================= + // النهاية: إرجاع رسالة النجاح + // ================================================================================= + jsonSuccess(null, "Ride cancelled and driver log updated successfully"); + + } else { + // فشل الإلغاء (الرحلة غير موجودة أو حالتها لا تسمح) + error_log("⚠️ [cancelRideAndLog.php] Failed to cancel. Status might be started/completed or ID invalid."); + jsonError("Cannot cancel ride. Status might be started or already completed."); + } + +} catch (PDOException $e) { + error_log("❌ [cancelRideAndLog.php] Database Error: " . $e->getMessage()); + jsonError("Database Error: " . $e->getMessage()); +*/ + +require_once __DIR__ . '/../../connect.php'; + +$rideId = filterRequest("id"); +$driverID = filterRequest("driver_id"); +$note = filterRequest("notes"); +$status = "cancelRideFromDriver"; + +if (!$rideId || !$driverID) { + jsonError("Missing Data"); + exit; +} + +try { + // 1. محاولة الإلغاء في السيرفر البعيد + $stmtRemote = $con_ride->prepare("UPDATE `ride` SET `status` = ?, `updated_at` = NOW() WHERE `id` = ? AND `status` IN ('wait', 'waiting', 'Apply', 'accepted')"); + $stmtRemote->execute([$status, $rideId]); + + if ($stmtRemote->rowCount() > 0) { + // 2. التحديث المحلي + $con->prepare("UPDATE `ride` SET `status` = ?, `updated_at` = NOW() WHERE `id` = ?")->execute([$status, $rideId]); + + // 3. تسجيل اللوج (كما في ملفك) + $con->prepare("INSERT INTO driver_orders (driver_id, order_id, notes, status) VALUES (?, ?, ?, 'pending')")->execute([$driverID, $rideId, $note]); + + // تنظيف الخلفية (اختياري حسب الحاجة) + // ... كود التنظيف ... + + // 4. 🔥 إشعار الراكب بالإلغاء 🔥 + $stmtPas = $con->prepare("SELECT passenger_id FROM ride WHERE id = ?"); + $stmtPas->execute([$rideId]); + $passenger_id = $stmtPas->fetchColumn(); + + if ($passenger_id) { + notifyPassengerOnRideServer($passenger_id, [ + 'ride_id' => $rideId, + 'status' => 'cancelled', + 'msg' => 'نعتذر، قام السائق بإلغاء الرحلة' + ]); + } + + jsonSuccess(null, "Ride Cancelled"); + } else { + jsonError("Cannot cancel ride (Status might be started or finished)"); + } + +} catch (PDOException $e) { + jsonError("DB Error: " . $e->getMessage()); +} +?> +?> \ No newline at end of file diff --git a/backend/ride/cancelRide/delete.php b/backend/ride/cancelRide/delete.php new file mode 100644 index 0000000..b35a79d --- /dev/null +++ b/backend/ride/cancelRide/delete.php @@ -0,0 +1,16 @@ +prepare($sql); +$stmt->bindParam(":id", $id, PDO::PARAM_INT); // تأكيد أن id رقم +$stmt->execute(); + +if ($stmt->rowCount() > 0) { + jsonSuccess(null, "Record deleted successfully"); +} else { + jsonError("Failed to delete record"); +} +?> \ No newline at end of file diff --git a/backend/ride/cancelRide/error_log b/backend/ride/cancelRide/error_log new file mode 100644 index 0000000..e69de29 diff --git a/backend/ride/cancelRide/get.php b/backend/ride/cancelRide/get.php new file mode 100644 index 0000000..3646555 --- /dev/null +++ b/backend/ride/cancelRide/get.php @@ -0,0 +1,15 @@ +prepare($sql); +$stmt->execute(); + +$result = $stmt->fetchAll(PDO::FETCH_ASSOC); + +if ($stmt->rowCount() > 0) { + jsonSuccess($result); +} else { + jsonError("No records found"); +} +?> \ No newline at end of file diff --git a/backend/ride/cancelRide/update.php b/backend/ride/cancelRide/update.php new file mode 100644 index 0000000..c44bdd0 --- /dev/null +++ b/backend/ride/cancelRide/update.php @@ -0,0 +1,52 @@ +prepare($sql); +$stmt->execute($params); + +// التحقق من النتيجة +if ($stmt->rowCount() > 0) { + jsonSuccess(null, "Data updated successfully"); +} else { + jsonError("Failed to update data or no changes made"); +} +?> \ No newline at end of file diff --git a/backend/ride/carDrivers/add.php b/backend/ride/carDrivers/add.php new file mode 100755 index 0000000..a0717ed --- /dev/null +++ b/backend/ride/carDrivers/add.php @@ -0,0 +1,55 @@ +encryptData(filterRequest("vin")); +$car_plate = $encryptionHelper->encryptData(filterRequest("car_plate")); +$make = filterRequest("make"); +$model = filterRequest("model"); +$year = filterRequest("year"); +$expiration_date = filterRequest("expiration_date"); +$color = filterRequest("color"); +$owner = $encryptionHelper->encryptData(filterRequest("owner")); +$color_hex = filterRequest("color_hex"); +$address = $encryptionHelper->encryptData(filterRequest("address")); +$displacement = filterRequest("displacement"); +$fuel = filterRequest("fuel"); +$registration_date = filterRequest("registration_date"); + +// SQL statement +$sql = "INSERT INTO `captains_car` ( + `driverID`, `vin`, `car_plate`, `make`, `model`, `year`, `expiration_date`, + `color`, `owner`, `color_hex`, `address`, `displacement`, `fuel`, `registration_date` +) VALUES ( + :driverID, :vin, :car_plate, :make, :model, :year, :expiration_date, + :color, :owner, :color_hex, :address, :displacement, :fuel, :registration_date +)"; + +$stmt = $con->prepare($sql); + +// Bind parameters +$stmt->bindParam(':driverID', $driverID); +$stmt->bindParam(':vin', $vin); +$stmt->bindParam(':car_plate', $car_plate); +$stmt->bindParam(':make', $make); +$stmt->bindParam(':model', $model); +$stmt->bindParam(':year', $year, PDO::PARAM_INT); +$stmt->bindParam(':expiration_date', $expiration_date); +$stmt->bindParam(':color', $color); +$stmt->bindParam(':owner', $owner); +$stmt->bindParam(':color_hex', $color_hex); +$stmt->bindParam(':address', $address); +$stmt->bindParam(':displacement', $displacement); +$stmt->bindParam(':fuel', $fuel); +$stmt->bindParam(':registration_date', $registration_date); + +$stmt->execute(); +$insertedId = $con->lastInsertId(); + +if ($stmt->rowCount() > 0) { + jsonSuccess(["id" => $insertedId]); +} else { + jsonError("Failed to save car registration information"); +} +?> \ No newline at end of file diff --git a/backend/ride/carDrivers/delete.php b/backend/ride/carDrivers/delete.php new file mode 100755 index 0000000..c9307e8 --- /dev/null +++ b/backend/ride/carDrivers/delete.php @@ -0,0 +1,19 @@ +prepare($sql); +$stmt->bindParam(':id', $id, PDO::PARAM_INT); +$stmt->execute(); + +// التحقق من نجاح الحذف +if ($stmt->rowCount() > 0) { + jsonSuccess(null, "Car registration deleted successfully"); +} else { + jsonError("Failed to delete car registration"); +} +?> \ No newline at end of file diff --git a/backend/ride/carDrivers/error_log b/backend/ride/carDrivers/error_log new file mode 100644 index 0000000..e69de29 diff --git a/backend/ride/carDrivers/get.php b/backend/ride/carDrivers/get.php new file mode 100755 index 0000000..c3237b3 --- /dev/null +++ b/backend/ride/carDrivers/get.php @@ -0,0 +1,89 @@ +decryptData($v); } catch (\Throwable $e) { return $v; } + }; + + // أعمدة مشتركة/موحّدة للإخراج + return [ + 'id' => $get('id'), + 'driverID' => $get('driverID'), + 'vin' => $dec($get('vin')), // إن كان مُشفراً + 'car_plate' => $dec($get('car_plate')), // إن كان مُشفراً + 'make' => $get('make'), + 'model' => $get('model'), + 'year' => $get('year'), + 'expiration_date' => $get('expiration_date'), + 'color' => $get('color'), + 'color_hex' => $get('color_hex'), + 'owner' => $dec($get('owner')), // إن كان مُشفراً + 'address' => $dec($get('address')), // قد لا يوجد في CarRegistration + 'type' => $get('type'), // إن وُجد + 'isDefault' => (int)($get('isDefault', 0)), + 'status' => $get('status'), + 'created_at' => $get('created_at'), + 'source' => $source, // لمعرفة مصدر السجل + ]; + } + + // 1) جلب من captains_car + $sql1 = "SELECT * FROM captains_car WHERE driverID = :driverID"; + $st1 = $con->prepare($sql1); + $st1->execute([':driverID' => $driverID]); + $rows1 = $st1->fetchAll(PDO::FETCH_ASSOC); + + // 2) جلب من CarRegistration + $sql2 = "SELECT * FROM CarRegistration WHERE driverID = :driverID"; + $st2 = $con->prepare($sql2); + $st2->execute([':driverID' => $driverID]); + $rows2 = $st2->fetchAll(PDO::FETCH_ASSOC); + + // 3) توحيد النتائج مع فك التشفير + $result = []; + foreach ($rows1 as $r) { $result[] = normalize_car_row($r, 'captains_car', $encryptionHelper); } + foreach ($rows2 as $r) { $result[] = normalize_car_row($r, 'CarRegistration', $encryptionHelper); } + + if (empty($result)) { + jsonError("No driver car data found"); + exit; + } + + // 4) ترتيب النتيجة: السيارات الافتراضية أولاً ثم الأحدث إنشاءً + usort($result, function($a, $b) { + // isDefault desc + if ((int)$a['isDefault'] !== (int)$b['isDefault']) { + return (int)$b['isDefault'] <=> (int)$a['isDefault']; + } + // created_at desc (لو أحدهم null لن يؤثر) + return strcmp((string)$b['created_at'], (string)$a['created_at']); + }); + + jsonSuccess($result); + +} catch (PDOException $e) { + error_log("Database error (get_driver_cars): " . $e->getMessage()); + jsonError("Database error occurred"); +} catch (Throwable $e) { + error_log("App error (get_driver_cars): " . $e->getMessage()); + jsonError("Unexpected error occurred"); +} \ No newline at end of file diff --git a/backend/ride/card-image-driver/add.php b/backend/ride/card-image-driver/add.php new file mode 100644 index 0000000..d5e3c80 --- /dev/null +++ b/backend/ride/card-image-driver/add.php @@ -0,0 +1,91 @@ + 'Database connection failed.']); + exit; +} + +if (!isset($_FILES['image']) || $_FILES['image']['error'] != UPLOAD_ERR_OK) { + echo json_encode(['status' => 'The image file was not uploaded successfully.']); + exit; +} + +$image_file = $_FILES['image']; +$driverID = filterRequest("driver_id"); + +if (empty($driverID)) { + echo json_encode(['status' => 'Missing driver ID.']); + exit; +} + +// التحقق من نوع الملف (MIME Type) للحماية من رفع سكربتات خبيثة +$finfo = finfo_open(FILEINFO_MIME_TYPE); +$mime_type = finfo_file($finfo, $image_file['tmp_name']); +finfo_close($finfo); + +$allowed_mime_types = ['image/jpeg', 'image/png', 'image/jpg']; +if (!in_array($mime_type, $allowed_mime_types)) { + echo json_encode(['status' => 'The image file is not a valid image file.']); + exit; +} + +$image_name = $image_file['name']; +$image_extension = strtolower(pathinfo($image_name, PATHINFO_EXTENSION)); +$allowed_extensions = ['jpg', 'jpeg', 'png']; + +if (!in_array($image_extension, $allowed_extensions)) { + echo json_encode(['status' => 'Invalid file extension.']); + exit; +} + +$new_filename = $driverID . '.' . $image_extension; +$target_dir = __DIR__ . "/../../card_image/"; + +if (!is_dir($target_dir)) { + mkdir($target_dir, 0755, true); +} + +$target_file = $target_dir . $new_filename; +if (!move_uploaded_file($image_file['tmp_name'], $target_file)) { + echo json_encode(['status' => 'Failed to move uploaded file.']); + exit; +} + +$linlImage = 'https://ride.mobile-app.store/card_image/' . $new_filename; + +try { + // استخدام Prepared Statements للحماية من الحقن (SQL Injection) + $stmt = $con->prepare("SELECT id FROM card_images WHERE driver_id = :driver_id"); + $stmt->execute([':driver_id' => $driverID]); + + if ($stmt->rowCount() > 0) { + $uploadDate = date("Y-m-d H:i:s"); + $updateStmt = $con->prepare("UPDATE card_images SET upload_date = :upload_date WHERE driver_id = :driver_id"); + $updateStmt->execute([ + ':upload_date' => $uploadDate, + ':driver_id' => $driverID + ]); + + echo json_encode(['status' => 'Record updated successfully']); + } else { + $insertStmt = $con->prepare("INSERT INTO card_images (id, driver_id, image_name, link) VALUES (SHA2(UUID(), 256), :driver_id, :image_name, :link)"); + $insertStmt->execute([ + ':driver_id' => $driverID, + ':image_name' => $new_filename, + ':link' => $linlImage + ]); + + echo json_encode(['status' => 'Record inserted successfully']); + } +} catch (PDOException $e) { + error_log("Database Error in card-image-driver/add.php: " . $e->getMessage()); + echo json_encode(['status' => 'Database operation failed.']); +} +?> \ No newline at end of file diff --git a/backend/ride/card-image-driver/delete.php b/backend/ride/card-image-driver/delete.php new file mode 100644 index 0000000..e69de29 diff --git a/backend/ride/card-image-driver/get.php b/backend/ride/card-image-driver/get.php new file mode 100644 index 0000000..e69de29 diff --git a/backend/ride/card-image-driver/update.php b/backend/ride/card-image-driver/update.php new file mode 100644 index 0000000..e69de29 diff --git a/backend/ride/chat/send_message.php b/backend/ride/chat/send_message.php new file mode 100644 index 0000000..fc9eda8 --- /dev/null +++ b/backend/ride/chat/send_message.php @@ -0,0 +1,41 @@ +prepare(" + INSERT INTO `ride_chat_logs` + (`ride_id`, `sender_id`, `receiver_id`, `sender_type`, `message_content`, `created_at`) + VALUES (?, ?, ?, ?, ?, NOW()) + "); + $stmt->execute([$ride_id, $sender_id, $receiver_id, $sender_type, $message_content]); + + error_log("✅ [send_message.php] Saved message successfully for ride_id: $ride_id"); + jsonSuccess(null, "Message saved successfully."); + +} catch (PDOException $e) { + error_log("❌ [send_message.php] Database Error: " . $e->getMessage()); + jsonError("Database error: " . $e->getMessage()); +} +?> diff --git a/backend/ride/driverPayment/add.php b/backend/ride/driverPayment/add.php new file mode 100644 index 0000000..9b7f3dd --- /dev/null +++ b/backend/ride/driverPayment/add.php @@ -0,0 +1,25 @@ +prepare($sql); +$stmt->execute(); + +if ($stmt->rowCount() > 0) { + + $insertedID = $con->lastInsertId(); // Get the last inserted ID + jsonSuccess($message = $insertedID); +} else { + $response = array( + "success" => false, + "message" => "Failed to save payment data" + ); + echo json_encode($response); +} +?> \ No newline at end of file diff --git a/backend/ride/driverPayment/delete.php b/backend/ride/driverPayment/delete.php new file mode 100644 index 0000000..f9b66c5 --- /dev/null +++ b/backend/ride/driverPayment/delete.php @@ -0,0 +1,18 @@ +prepare($sql); +$stmt->execute(); + +if ($stmt->rowCount() > 0) { + // Print a success message + echo "Record deleted successfully"; +} else { + // Print a failure message + echo "Failed to delete the record"; +} +?> \ No newline at end of file diff --git a/backend/ride/driverPayment/error_log b/backend/ride/driverPayment/error_log new file mode 100644 index 0000000..e69de29 diff --git a/backend/ride/driverPayment/get.php b/backend/ride/driverPayment/get.php new file mode 100644 index 0000000..cdc59ea --- /dev/null +++ b/backend/ride/driverPayment/get.php @@ -0,0 +1,20 @@ +prepare($sql); +$stmt->execute(); + +if ($stmt->rowCount() > 0) { + // Fetch the record + $row = $stmt->fetchAll(PDO::FETCH_ASSOC); + + jsonSuccess($row); + +} else { + // No records found + echo "No records found."; +} +?> \ No newline at end of file diff --git a/backend/ride/driverPayment/update.php b/backend/ride/driverPayment/update.php new file mode 100644 index 0000000..478bfc5 --- /dev/null +++ b/backend/ride/driverPayment/update.php @@ -0,0 +1,22 @@ +prepare($sql); +$stmt->execute(); + +if ($stmt->rowCount() > 0) { + // Print a success message + echo "Record updated successfully"; +} else { + // Print a failure message + echo "Failed to update the record"; +} +?> \ No newline at end of file diff --git a/backend/ride/driverWallet/add.php b/backend/ride/driverWallet/add.php new file mode 100644 index 0000000..294989b --- /dev/null +++ b/backend/ride/driverWallet/add.php @@ -0,0 +1,58 @@ +prepare("SELECT * FROM payment_tokens WHERE token = :token AND isUsed = FALSE"); +$stmt->execute(array( + ':token' => $token +)); + +$tokenData = $stmt->fetch(); + +if ($tokenData) { + // Add payment to the driver's wallet table + $sql = "INSERT INTO `driverWallet` ( + `driverID`, + `paymentID`, + `amount`, + `paymentMethod` + ) VALUES ( + :driverID, + :paymentID, + :amount, + :paymentMethod + );"; + + $stmt = $con->prepare($sql); + $stmt->execute(array( + ':driverID' => $driverID, + ':paymentID' => $paymentID, + ':amount' => $amount, + ':paymentMethod' => $paymentMethod + )); + + if ($stmt->rowCount() > 0) { + // Print a success message + jsonSuccess(null, "Record saved successfully"); + + // Mark the token as used in the database + $stmt = $con->prepare("UPDATE payment_tokens SET isUsed = TRUE WHERE id = :tokenID"); + $stmt->execute(array( + ':tokenID' => $tokenData['id'] + )); + } else { + // Print a failure message + jsonError("Failed to save record"); + } +} else { + jsonError("Invalid or already used token"); +} diff --git a/backend/ride/driverWallet/addPaymentToken.php b/backend/ride/driverWallet/addPaymentToken.php new file mode 100644 index 0000000..f9b6ac5 --- /dev/null +++ b/backend/ride/driverWallet/addPaymentToken.php @@ -0,0 +1,49 @@ +prepare("INSERT INTO payment_tokens (token, driverID, dateCreated, amount) VALUES (?, ?, NOW(), ?)"); + +try { + $stmt->execute([$token, $driverID, $amount]); + if ($stmt->rowCount() > 0) { + jsonSuccess($token); + } else { + jsonError("Failed to save record"); + } +} catch (PDOException $e) { + jsonError("Database error: " . $e->getMessage()); +} + +function generateSecureToken($driverID, $amount) { + global $secretKey; + // Concatenate the parameters + $data = $driverID . $amount . time(); + + // Add the secret key from the environment variable + $data .= $secretKey; + + // Generate a hash + $hash = hash('sha256', $data); + + // Add some randomness + $randomBytes = bin2hex(random_bytes(16)); + + // Combine hash and random bytes + $token = $hash . $randomBytes; + + // Truncate to a reasonable length (e.g., 64 characters) + return substr($token, 0, 64); +} \ No newline at end of file diff --git a/backend/ride/driverWallet/delete.php b/backend/ride/driverWallet/delete.php new file mode 100644 index 0000000..e69de29 diff --git a/backend/ride/driverWallet/driverStatistic.php b/backend/ride/driverWallet/driverStatistic.php new file mode 100644 index 0000000..737b580 --- /dev/null +++ b/backend/ride/driverWallet/driverStatistic.php @@ -0,0 +1,46 @@ +prepare($sql); +$stmt->execute(); + +if ($stmt->rowCount() > 0) { + // Fetch the record + $row = $stmt->fetchAll(PDO::FETCH_ASSOC); + + jsonSuccess($row); + +} + else{ + // Print a failure message + jsonError($message = "No wallet record found"); +} +?> \ No newline at end of file diff --git a/backend/ride/driverWallet/error_log b/backend/ride/driverWallet/error_log new file mode 100644 index 0000000..e69de29 diff --git a/backend/ride/driverWallet/get.php b/backend/ride/driverWallet/get.php new file mode 100644 index 0000000..45d736c --- /dev/null +++ b/backend/ride/driverWallet/get.php @@ -0,0 +1,42 @@ +prepare($sql); +$stmt->execute(); + +if ($stmt->rowCount() > 0) { + // Fetch the record + $row = $stmt->fetchAll(PDO::FETCH_ASSOC); + + jsonSuccess($row); + +} + else{ + // Print a failure message + jsonError($message = "No wallet record found"); +} +?> \ No newline at end of file diff --git a/backend/ride/driverWallet/getDriverDetails.php b/backend/ride/driverWallet/getDriverDetails.php new file mode 100644 index 0000000..2aef406 --- /dev/null +++ b/backend/ride/driverWallet/getDriverDetails.php @@ -0,0 +1,34 @@ +prepare($sql); +$stmt->execute(); +$data = $stmt->fetchAll(PDO::FETCH_ASSOC); + +if ($data) { + // Print the car location data as JSON + echo json_encode([ + 'status' => 'success', + + 'data' => $data + ]); +} else { + // Print a failure message + jsonError($message = "No car locations found"); +} + +?> \ No newline at end of file diff --git a/backend/ride/driverWallet/getDriverWeekPaymentMove.php b/backend/ride/driverWallet/getDriverWeekPaymentMove.php new file mode 100644 index 0000000..281f34f --- /dev/null +++ b/backend/ride/driverWallet/getDriverWeekPaymentMove.php @@ -0,0 +1,37 @@ += DATE_SUB(NOW(), INTERVAL 1 WEEK) + ) AS totalAmount +FROM `driverWallet` +WHERE `driverID` = '$driverID' +AND `dateCreated` >= DATE_SUB(NOW(), INTERVAL 1 WEEK) +ORDER BY `dateCreated` DESC; +"; +$stmt = $con->prepare($sql); +$stmt->execute(); + +if ($stmt->rowCount() > 0) { + // Fetch the record + $row = $stmt->fetchAll(PDO::FETCH_ASSOC); + + jsonSuccess($row); + +} + else{ + // Print a failure message + jsonError($message = "No wallet record found"); +} +?> \ No newline at end of file diff --git a/backend/ride/driverWallet/getWalletByDriver.php b/backend/ride/driverWallet/getWalletByDriver.php new file mode 100644 index 0000000..6fad20b --- /dev/null +++ b/backend/ride/driverWallet/getWalletByDriver.php @@ -0,0 +1,30 @@ += DATE_SUB(NOW(), INTERVAL 1 MONTH) +ORDER BY + `paymentsDriverPoints`.`id` +DESC"; +$stmt = $con->prepare($sql); +$stmt->execute(); + +if ($stmt->rowCount() > 0) { + // Fetch the record + $row = $stmt->fetchAll(PDO::FETCH_ASSOC); + + jsonSuccess($row); + +} + else{ + // Print a failure message + jsonError($message = "No wallet record found"); +} +?> \ No newline at end of file diff --git a/backend/ride/driverWallet/sendEmailTransfer.php b/backend/ride/driverWallet/sendEmailTransfer.php new file mode 100644 index 0000000..ba28c22 --- /dev/null +++ b/backend/ride/driverWallet/sendEmailTransfer.php @@ -0,0 +1,122 @@ + + + + + +
+

تفاصيل نقلك على سفر

+

شكراً لاستخدام خدمتنا. نتمنى لك يوماً رائعاً!

+

نريد إعلامك أن مبلغ $amount تم نقله من حسابك إلى السائق الجديد، $newDriverName (هاتف: $driverPhone).

+

مع خالص التحية،
فريق سفر

+
+ + "; +} else { + $bodyEmail = " + + + + +
+ SEFER App Logo + +

Your SEFER Transfer Details

+

Thank you for using our service. We hope you have a great day!

+

We want to inform you that an amount of $amount has been transferred from your account to the new driver: $newDriverName (Phone: $driverPhone).

+

Regards,
SEFER Team

+
+ + "; +} + +// Email headers +$supportEmail = 'seferteam@sefer.live'; +$headers = "MIME-Version: 1.0\r\n"; +$headers .= "Content-Type: text/html; charset=UTF-8\r\n"; +$headers .= "From: $supportEmail\r\n"; + +// Send email +if (!empty($driverEmail)) { + if (mail($driverEmail, "Your SEFER Transfer Details", $bodyEmail, $headers)) { + + mail($newEmail, "Your SEFER Transfer Details", $bodyEmail, $headers); + echo "Email sent successfully."; + } else { + echo "Email sending failed."; + } +} else { + echo "Invalid email address: $driverEmail"; +} diff --git a/backend/ride/driverWallet/update.php b/backend/ride/driverWallet/update.php new file mode 100644 index 0000000..e69de29 diff --git a/backend/ride/driver_behavior/get_driver_behavior.php b/backend/ride/driver_behavior/get_driver_behavior.php new file mode 100644 index 0000000..3834ef9 --- /dev/null +++ b/backend/ride/driver_behavior/get_driver_behavior.php @@ -0,0 +1,40 @@ +prepare($sql_average); + $stmt_avg->bindParam(':driver_id', $driver_id); + $stmt_avg->execute(); + $average = $stmt_avg->fetch(PDO::FETCH_ASSOC); + + // ✅ ثانياً: جلب آخر 10 رحلات + $sql_last10 = "SELECT id, trip_id, max_speed, avg_speed, hard_brakes, total_distance, behavior_score, created_at + FROM driver_behavior + WHERE driver_id = :driver_id + ORDER BY id DESC + LIMIT 10"; + + $stmt_last10 = $con->prepare($sql_last10); + $stmt_last10->bindParam(':driver_id', $driver_id); + $stmt_last10->execute(); + $last10 = $stmt_last10->fetchAll(PDO::FETCH_ASSOC); + + // ✅ تجهيز الاستجابة النهائية + $response = [ + 'overall_behavior_score' => $average['overall_behavior_score'], + 'last_10_trips' => $last10 + ]; + + jsonSuccess($response); + +} catch (PDOException $e) { + jsonError("Database error: " . $e->getMessage()); +} +?> \ No newline at end of file diff --git a/backend/ride/driver_order/add.php b/backend/ride/driver_order/add.php new file mode 100755 index 0000000..b897e37 --- /dev/null +++ b/backend/ride/driver_order/add.php @@ -0,0 +1,38 @@ +prepare($checkSql); +$checkStmt->execute([$order_id]); + +if ($checkStmt->rowCount() > 0) { + // تحديث السجل إذا كان موجودًا + $updateSql = "UPDATE `driver_orders` SET `driver_id` = ?, `status` = ?, `created_at` = NOW() WHERE `order_id` = ?"; + $updateStmt = $con->prepare($updateSql); + $updateStmt->execute([$driver_id, $status, $order_id]); + + if ($updateStmt->rowCount() > 0) { + jsonSuccess(null, "Driver order data updated successfully"); + } else { + jsonError("Failed to update driver order data"); + } +} else { + // إدخال سجل جديد إذا لم يكن موجودًا + $insertSql = "INSERT INTO `driver_orders` (`driver_id`, `order_id`, `created_at`, `status`) VALUES (?, ?, NOW(), ?)"; + $insertStmt = $con->prepare($insertSql); + $insertStmt->execute([$driver_id, $order_id, $status]); + + if ($insertStmt->rowCount() > 0) { + jsonSuccess(null, "Driver order data saved successfully"); + } else { + jsonError("Failed to save driver order data"); + } +} +?> \ No newline at end of file diff --git a/backend/ride/driver_order/delete.php b/backend/ride/driver_order/delete.php new file mode 100644 index 0000000..e69de29 diff --git a/backend/ride/driver_order/error_log b/backend/ride/driver_order/error_log new file mode 100644 index 0000000..e69de29 diff --git a/backend/ride/driver_order/get.php b/backend/ride/driver_order/get.php new file mode 100755 index 0000000..9ad4f87 --- /dev/null +++ b/backend/ride/driver_order/get.php @@ -0,0 +1,75 @@ +prepare($stats_sql); + $stats_stmt->execute([':driver_id' => $driver_id]); + $stats = $stats_stmt->fetch(PDO::FETCH_ASSOC); + + // Calculate the average + if ($stats && $stats['total_rides'] > 0) { + $stats['averageApplied'] = $stats['total_applied'] / $stats['total_rides']; + } else { + $stats['averageApplied'] = 0; + } + + + // 2. Second, get the actual order history + $orders_sql = " + SELECT * FROM driver_orders + WHERE + driver_id = :driver_id + AND MONTH(created_at) = MONTH(CURRENT_DATE()) + AND YEAR(created_at) = YEAR(CURRENT_DATE()) + ORDER BY created_at DESC + "; + $orders_stmt = $con->prepare($orders_sql); + $orders_stmt->execute([':driver_id' => $driver_id]); + $orders = $orders_stmt->fetchAll(PDO::FETCH_ASSOC); + + // 3. Combine the results into one response + + + jsonSuccess($orders); + + +} elseif ($order_id != null) { + // This part remains the same, but let's ensure it's correct + $sql = " + SELECT * FROM driver_orders + WHERE order_id = :order_id + AND MONTH(created_at) = MONTH(CURRENT_DATE()) + AND YEAR(created_at) = YEAR(CURRENT_DATE()) + "; + $stmt = $con->prepare($sql); + $stmt->execute([':order_id' => $order_id]); + $result = $stmt->fetchAll(PDO::FETCH_ASSOC); + + if ($stmt->rowCount() > 0) { + jsonSuccess($result); + } else { + jsonError("No driver order data found for this order_id"); + } + +} else { + jsonError("No driver_id or order_id provided"); +} + +?> \ No newline at end of file diff --git a/backend/ride/driver_order/getOrderCancelStatus.php b/backend/ride/driver_order/getOrderCancelStatus.php new file mode 100644 index 0000000..168c6b7 --- /dev/null +++ b/backend/ride/driver_order/getOrderCancelStatus.php @@ -0,0 +1,25 @@ +prepare($sql); +$stmt->bindParam(":order_id", $order_id, PDO::PARAM_STR); +$stmt->execute(); + +$row = $stmt->fetch(PDO::FETCH_ASSOC); + +if ($row) { + echo json_encode([ + "status" => "success", + "data" => $row + ]); +} else { + echo json_encode([ + "status" => "failure", + "message" => "No driver order data found for the specified order_id" + ]); +} +?> \ No newline at end of file diff --git a/backend/ride/driver_order/update.php b/backend/ride/driver_order/update.php new file mode 100644 index 0000000..8fa4db4 --- /dev/null +++ b/backend/ride/driver_order/update.php @@ -0,0 +1,32 @@ +prepare($sql); +$stmt->bindParam(":status", $status); +$stmt->bindParam(":order_id", $order_id); +$stmt->bindParam(":notes", $notes); + +$stmt->execute(); + +// التحقق من النتيجة +if ($stmt->rowCount() > 0) { + jsonSuccess(null, "Driver order data updated successfully"); +} else { + jsonError("Failed to update driver order data"); // أو لم يحدث تغيير في البيانات +} +?> \ No newline at end of file diff --git a/backend/ride/driver_scam/add.php b/backend/ride/driver_scam/add.php new file mode 100644 index 0000000..4080508 --- /dev/null +++ b/backend/ride/driver_scam/add.php @@ -0,0 +1,49 @@ +prepare($sql); +$stmt->bindParam(":driverID", $driverID); +$stmt->bindParam(":passengerID", $passengerID); +$stmt->bindParam(":rideID", $rideID); +$stmt->bindParam(":isDriverCallPassenger", $isDriverCallPassenger); +$stmt->bindParam(":dateCreated", $dateCreated); + +// تنفيذ الإدخال +$stmt->execute(); + +if ($stmt->rowCount() > 0) { + jsonSuccess(null, "Driver ride scam data saved successfully"); +} else { + jsonError("Failed to save driver ride scam data"); +} +?> \ No newline at end of file diff --git a/backend/ride/driver_scam/delete.php b/backend/ride/driver_scam/delete.php new file mode 100644 index 0000000..e69de29 diff --git a/backend/ride/driver_scam/error_log b/backend/ride/driver_scam/error_log new file mode 100644 index 0000000..e69de29 diff --git a/backend/ride/driver_scam/get.php b/backend/ride/driver_scam/get.php new file mode 100755 index 0000000..84ef318 --- /dev/null +++ b/backend/ride/driver_scam/get.php @@ -0,0 +1,48 @@ += CURDATE() + AND driver_ride_scam.dateCreated < DATE_ADD(CURDATE(), INTERVAL 1 DAY) +GROUP BY + DATE(driver_ride_scam.dateCreated) +ORDER BY + date DESC"; + +try { + $stmt = $con->prepare($sql); + $stmt->bindParam(':driverID', $driverID); + $stmt->execute(); + + $rows = $stmt->fetchAll(PDO::FETCH_ASSOC); + + if (!empty($rows)) { + // --- FIX IS HERE --- + // Your Flutter app looks for d['message']. + // We manually create the array with the key "message" to match your app. + echo json_encode(array("status" => "success", "message" => $rows)); + } else { + jsonError("No ride scam record found"); + } + +} catch (PDOException $e) { + jsonError("Database Error: " . $e->getMessage()); +} +?> \ No newline at end of file diff --git a/backend/ride/driver_scam/update.php b/backend/ride/driver_scam/update.php new file mode 100644 index 0000000..e69de29 diff --git a/backend/ride/egyptPhones/add.php b/backend/ride/egyptPhones/add.php new file mode 100644 index 0000000..8503ea0 --- /dev/null +++ b/backend/ride/egyptPhones/add.php @@ -0,0 +1,40 @@ +prepare($sql); +$stmt->bindParam(':phones', $phones); +$stmt->bindParam(':name', $name); +$stmt->bindParam(':phones2', $phones2); + +try { + $stmt->execute(); + if ($stmt->rowCount() > 0) { + // Print a success message + jsonSuccess($message = "Contact data saved successfully"); + } else { + // Print a failure message + jsonError($message = "Failed to save contact data"); + } +} catch (PDOException $e) { + // Print error message + jsonError($message = "Database error: " . $e->getMessage()); +} +?> diff --git a/backend/ride/egyptPhones/error_log b/backend/ride/egyptPhones/error_log new file mode 100644 index 0000000..e69de29 diff --git a/backend/ride/egyptPhones/get.php b/backend/ride/egyptPhones/get.php new file mode 100644 index 0000000..e69de29 diff --git a/backend/ride/egyptPhones/syrianAdd.php b/backend/ride/egyptPhones/syrianAdd.php new file mode 100755 index 0000000..3bce9a6 --- /dev/null +++ b/backend/ride/egyptPhones/syrianAdd.php @@ -0,0 +1,37 @@ +prepare($sql); +$stmt->bindParam(':driverId', $driverId); +$stmt->bindParam(':name', $name); +$stmt->bindParam(':phone', $phone); + +try { + $stmt->execute(); + // rowCount() ستكون 1 عند إضافة سجل جديد، و 0 عند تجاهل سجل مكرر + if ($stmt->rowCount() > 0) { + jsonSuccess(null, "New contact saved successfully"); + } else { + jsonSuccess(null, "Contact already exists for this driver."); + } +} catch (PDOException $e) { + // إرجاع رسالة خطأ في حال حدوث مشكلة في قاعدة البيانات + jsonError("Database error: " . $e->getMessage()); +} +?> diff --git a/backend/ride/feedBack/add.php b/backend/ride/feedBack/add.php new file mode 100755 index 0000000..799d080 --- /dev/null +++ b/backend/ride/feedBack/add.php @@ -0,0 +1,35 @@ +encryptData($feedBack); + +$sql = "INSERT INTO `feedBack`( `passengerId`, `feedBack`, `datecreated`) VALUES ( + + :passengerId, + :feedBack, + NOW() +)"; + +$stmt = $con->prepare($sql); +$stmt->bindParam(':passengerId', $passengerId); +$stmt->bindParam(':feedBack', $feedBack); +$stmt->execute(); + + +if ($stmt->rowCount() > 0) { + // Success response + echo json_encode([ + "status" => "success", + "message" => "Feedback data saved successfully" + ]); +} else { + // Failure response + echo json_encode([ + "status" => "failure", + "message" => "Failed to save feedback data" + ]); +} +?> diff --git a/backend/ride/feedBack/add_solve_all.php b/backend/ride/feedBack/add_solve_all.php new file mode 100755 index 0000000..1ac5009 --- /dev/null +++ b/backend/ride/feedBack/add_solve_all.php @@ -0,0 +1,286 @@ +prepare("SELECT * FROM ride WHERE id = ? AND (status = 'Finished' OR status = 'Begin')"); +$stmt->execute([$rideId]); +$ride = $stmt->fetch(PDO::FETCH_ASSOC); + + +if (!$ride) { + // رسالة خطأ أوضح للمستخدم + error_log("WARNING: Complaint filing failed for ride ID: $rideId. Ride not found or status is invalid."); // ⚠️ تسجيل الخطأ + jsonError("Complaint cannot be filed for this ride. It may not have been completed or started."); + exit; +} + +$passengerId = $ride['passenger_id']; +$driverId = $ride['driver_id']; + +// --- دوال مساعدة لجلب البيانات (تم افتراض أن الدوال تصل إلى $con و $encryptionHelper عبر النطاق global أو تمريرها كـ arguments) --- + +/** + * جلب بيانات ومعلومات تقييم السائق + */ +function getDriverFullProfile($con, $encryptionHelper, $driverId) { + $profile = ['info' => null, 'ratings' => null, 'comments' => []]; + + // جلب معلومات السائق الأساسية + $stmt = $con->prepare("SELECT id, first_name, last_name, created_at FROM driver WHERE id = ?"); + $stmt->execute([$driverId]); + $driverInfo = $stmt->fetch(PDO::FETCH_ASSOC); + + // فك تشفير البيانات الحساسة + if ($driverInfo) { + // التحقق من وجود ودوال فك التشفير قبل الاستخدام + if (isset($encryptionHelper) && method_exists($encryptionHelper, 'decryptData')) { + $decryptedFirstName = $encryptionHelper->decryptData($driverInfo['first_name']); + $decryptedLastName = $encryptionHelper->decryptData($driverInfo['last_name']); + $driverInfo['full_name'] = trim($decryptedFirstName . ' ' . $decryptedLastName); + } else { + $driverInfo['full_name'] = 'Decryption Failed'; + } + + unset($driverInfo['first_name'], $driverInfo['last_name']); // إزالة الحقول المشفرة + $profile['info'] = $driverInfo; + } + + // جلب ملخص التقييمات والتعليقات + $stmt = $con->prepare("SELECT AVG(rating) as avg_rating, COUNT(id) as total_ratings FROM ratingDriver WHERE driver_id = ?"); + $stmt->execute([$driverId]); + $profile['ratings'] = $stmt->fetch(PDO::FETCH_ASSOC); + + $stmt = $con->prepare("SELECT comment FROM ratingDriver WHERE driver_id = ? AND comment IS NOT NULL AND comment != '' ORDER BY created_at DESC LIMIT 5"); + $stmt->execute([$driverId]); + $profile['comments'] = $stmt->fetchAll(PDO::FETCH_COLUMN); + + return $profile; +} + +/** + * جلب بيانات ومعلومات تقييم الراكب + */ +function getPassengerFullProfile($con, $encryptionHelper, $passengerId) { + $profile = ['info' => null, 'ratings' => null, 'comments' => []]; + + $stmt = $con->prepare("SELECT id, first_name, last_name, created_at FROM passengers WHERE id = ?"); + $stmt->execute([$passengerId]); + $passengerInfo = $stmt->fetch(PDO::FETCH_ASSOC); + + // فك تشفير البيانات الحساسة + if ($passengerInfo) { + if (isset($encryptionHelper) && method_exists($encryptionHelper, 'decryptData')) { + $decryptedFirstName = $encryptionHelper->decryptData($passengerInfo['first_name']); + $decryptedLastName = $encryptionHelper->decryptData($passengerInfo['last_name']); + $passengerInfo['full_name'] = trim($decryptedFirstName . ' ' . $decryptedLastName); + } else { + $passengerInfo['full_name'] = 'Decryption Failed'; + } + + unset($passengerInfo['first_name'], $passengerInfo['last_name']); + $profile['info'] = $passengerInfo; + } + + $stmt = $con->prepare("SELECT AVG(rating) as avg_rating, COUNT(id) as total_ratings FROM ratingPassenger WHERE passenger_id = ?"); + $stmt->execute([$passengerId]); + $profile['ratings'] = $stmt->fetch(PDO::FETCH_ASSOC); + + $stmt = $con->prepare("SELECT comment FROM ratingPassenger WHERE passenger_id = ? AND comment IS NOT NULL AND comment != '' ORDER BY created_at DESC LIMIT 5"); + $stmt->execute([$passengerId]); + $profile['comments'] = $stmt->fetchAll(PDO::FETCH_COLUMN); + + return $profile; +} + +/** + * جلب بيانات سلوك السائق في الرحلة المحددة + */ +function getDriverBehavior($con, $rideId, $driverId) { + $stmt = $con->prepare("SELECT max_speed, avg_speed, hard_brakes, behavior_score FROM driver_behavior WHERE trip_id = ? AND driver_id = ?"); + $stmt->execute([$rideId, $driverId]); + return $stmt->fetch(PDO::FETCH_ASSOC) ?: null; +} + +// استدعاء الدوال لجلب البيانات +$passengerProfile = getPassengerFullProfile($con, $encryptionHelper, $passengerId); +$driverProfile = getDriverFullProfile($con, $encryptionHelper, $driverId); +$driverBehavior = getDriverBehavior($con, $rideId, $driverId); + +// --- 4. بناء الـ Prompt وإرساله إلى Gemini --- +$prompt = " +أنت خبير في حل النزاعات في خدمات نقل الركاب لتطبيق intaleqapp.com. قم بتحليل الشكوى التالية بين راكب وسائق بناءً على البيانات الشاملة التالية: + +**1. تفاصيل الرحلة:** +" . json_encode($ride, JSON_UNESCAPED_UNICODE | JSON_PRETTY_PRINT) . " + +**2. ملف الراكب:** +" . json_encode($passengerProfile, JSON_UNESCAPED_UNICODE | JSON_PRETTY_PRINT) . " + +**3. ملف السائق:** +" . json_encode($driverProfile, JSON_UNESCAPED_UNICODE | JSON_PRETTY_PRINT) . " + +**4. بيانات سلوك السائق (في هذه الرحلة):** +" . json_encode($driverBehavior, JSON_UNESCAPED_UNICODE | JSON_PRETTY_PRINT) . " + +**5. الشكوى نفسها:** +- نص الشكوى من الراكب: '" . $complaintText . "' +- رابط تسجيل صوتي للشكوى (إن وجد): " . $audioLink . " + +**مهمتك هي:** +1. تحليل جميع البيانات المتاحة لتحديد الطرف المخطئ على الأرجح. +2. تحديد ما إذا كانت الشكوى كيدية أم حقيقية. +3. **تصنيف الشكوى** (مثال: سلوك السائق، مشكلة في الأجرة، مسار الرحلة، حالة السيارة، أخرى). +4. اقتراح حلين واضحين ومختلفين لفريق خدمة العملاء. +5. كتابة تقرير موجز ومناسب للراكب. +6. كتابة تقرير موجز ومناسب للسائق. + +**الخرج المطلوب:** +أعد الرد بصيغة JSON فقط، بدون أي نصوص إضافية، وباللغة العربية (لهجة مصرية)، بالهيكل التالي: +{ + \"customerServiceSolutions\": [\"الحل المقترح الأول\", \"الحل المقترح الثاني\"], + \"passengerReport\": { \"title\": \"بخصوص شكوتك في رحلة Intaleq\", \"body\": \"رسالة واضحة للراكب بنتيجة الشكوى\" }, + \"driverReport\": { \"title\": \"بخصوص بلاغ رحلتك الأخيرة في Intaleq\", \"body\": \"رسالة واضحة للسائق بنتيجة الشكوى\" }, + \"fault_determination\": \"الطرف المخطئ (الراكب/السائق/كلاهما/غير واضح)\", + \"complaint_nature\": \"طبيعة الشكوى (حقيقية/كيدية/نزاع بسيط)\", + \"complaint_type\": \"تصنيف الشكوى الذي حددته\" +} +"; + +// استخدام نموذج Gemini 1.5 Flash Lite +$apiURL = "https://generativelanguage.googleapis.com/v1beta/models/gemini-flash-lite-latest:generateContent?key=$geminiApiKey"; +$headers = ["Content-Type: application/json"]; +$payload = ['contents' => [['parts' => [['text' => $prompt]]]]]; + +error_log("INFO: Submitting complaint analysis to Gemini for ride ID: $rideId."); // ℹ️ تسجيل الحدث + +$ch = curl_init($apiURL); +curl_setopt_array($ch, [ + CURLOPT_RETURNTRANSFER => true, + CURLOPT_POST => true, + CURLOPT_HTTPHEADER => $headers, + CURLOPT_POSTFIELDS => json_encode($payload), + CURLOPT_TIMEOUT => 60 +]); +$response = curl_exec($ch); + +if (curl_errno($ch)) { + $errorMsg = curl_error($ch); + error_log("ERROR: AI Service Curl Error for ride $rideId: $errorMsg"); // ⚠️ تسجيل الخطأ + jsonError("AI Service Error: " . $errorMsg); + curl_close($ch); + exit; +} +curl_close($ch); + +$data = json_decode($response, true); +$analysisResultText = $data['candidates'][0]['content']['parts'][0]['text'] ?? ''; +$analysisResultJson = trim(preg_replace('/```json|```/', '', $analysisResultText)); +$analysisResult = json_decode($analysisResultJson, true); + +if (json_last_error() !== JSON_ERROR_NONE || !isset($analysisResult['passengerReport']) || !isset($analysisResult['driverReport'])) { + error_log("ERROR: Failed to parse AI response for ride $rideId. Raw Response: " . substr($response, 0, 500)); // ⚠️ تسجيل الخطأ + jsonError("Failed to parse AI response. Please try again later."); + exit; +} + +error_log("INFO: Gemini analysis successful for ride $rideId. Type: " . ($analysisResult['complaint_type'] ?? 'N/A')); // ℹ️ تسجيل الحدث + +// --- 5. تنفيذ الإجراءات بناءً على التحليل --- + +// تجميع الوصف الكامل للشكوى +$fullDescription = $complaintText; +if (!empty($audioLink)) { + $fullDescription .= "\n\n[رابط صوتي مرفق: " . $audioLink . "]"; +} + +// ** التعديل: تم تحديث جملة الحفظ لتشمل جميع مخرجات التحليل ** +$stmt = $con->prepare(" + INSERT INTO complaint ( + ride_id, passenger_id, driver_id, complaint_type, description, + date_filed, statusComplaint, resolution, passenger_report, driver_report, + cs_solutions, fault_determination, complaint_nature, date_resolved + ) + VALUES (?, ?, ?, ?, ?, NOW(), ?, ?, ?, ?, ?, ?, ?, NOW()) +"); + +try { + $success = $stmt->execute([ + $rideId, + $passengerId, + $driverId, + $analysisResult['complaint_type'] ?? 'General', + $fullDescription, + 'Resolved', // statusComplaint + $analysisResultJson, // resolution (الـ JSON الكامل) + json_encode($analysisResult['passengerReport'] ?? null, JSON_UNESCAPED_UNICODE), // passenger_report + json_encode($analysisResult['driverReport'] ?? null, JSON_UNESCAPED_UNICODE), // driver_report + json_encode($analysisResult['customerServiceSolutions'] ?? null, JSON_UNESCAPED_UNICODE), // cs_solutions + $analysisResult['fault_determination'] ?? 'N/A', // fault_determination + $analysisResult['complaint_nature'] ?? 'N/A' // complaint_nature + ]); + + if (!$success) { + // يمكنك تسجيل رسالة الخطأ من PDO إذا كانت متاحة (للتصحيح فقط وليس للإنتاج) + error_log("CRITICAL: Failed to save complaint to DB for ride $rideId. PDO Error Info: " . json_encode($stmt->errorInfo())); // ⚠️ تسجيل الخطأ + } + + $complaintId = $con->lastInsertId(); + error_log("SUCCESS: Complaint ID $complaintId processed and saved for ride $rideId."); // ✅ تسجيل النجاح + +} catch (PDOException $e) { + error_log("CRITICAL: PDO Exception when saving complaint for ride $rideId: " . $e->getMessage()); // ⚠️ تسجيل خطأ قاعدة البيانات + jsonError("A database error occurred while saving the complaint."); + exit; +} + +// إرسال رسالة WhatsApp لخدمة العملاء +if (function_exists('sendWhatsAppFromServer') && !empty($customerServiceWhatsapp)) { + $csMessage = "*شكوى جديدة (رقم $complaintId)*\n" . + "*- الرحلة:* $rideId\n" . + "*- تصنيف الشكوى:* " . ($analysisResult['complaint_type'] ?? 'غير محدد') . "\n" . + "*- المخطئ (تقدير النظام):* " . $analysisResult['fault_determination'] . "\n" . + "*- طبيعة الشكوى:* " . $analysisResult['complaint_nature'] . "\n\n" . + "*حلول مقترحة:*\n1. " . ($analysisResult['customerServiceSolutions'][0] ?? 'N/A') . "\n" . + "2. " . ($analysisResult['customerServiceSolutions'][1] ?? 'N/A'); + sendWhatsAppFromServer($customerServiceWhatsapp, $csMessage); + error_log("INFO: WhatsApp notification sent to customer service for complaint ID $complaintId."); // ℹ️ تسجيل الحدث +} + + +// --- 6. إرسال الرد النهائي للتطبيق --- +printSuccess([ + 'message' => 'Complaint processed successfully.', + 'passenger_response' => $analysisResult['passengerReport'], + 'driver_response' => $analysisResult['driverReport'] +]); + +?> \ No newline at end of file diff --git a/backend/ride/feedBack/delete.php b/backend/ride/feedBack/delete.php new file mode 100644 index 0000000..e69de29 diff --git a/backend/ride/feedBack/error_log b/backend/ride/feedBack/error_log new file mode 100644 index 0000000..e69de29 diff --git a/backend/ride/feedBack/get.php b/backend/ride/feedBack/get.php new file mode 100755 index 0000000..eb45009 --- /dev/null +++ b/backend/ride/feedBack/get.php @@ -0,0 +1,65 @@ +prepare($sql); +$stmt->bindParam(':passengerId', $passengerId, PDO::PARAM_STR); +$stmt->execute(); +$result = $stmt->fetchAll(PDO::FETCH_ASSOC); + +if ($result) { + // Print all promo records + jsonSuccess($result); +} else { + // Print an empty list + jsonSuccess([]); +} +?> \ No newline at end of file diff --git a/backend/ride/feedBack/update.php b/backend/ride/feedBack/update.php new file mode 100644 index 0000000..e69de29 diff --git a/backend/ride/firebase/add.php b/backend/ride/firebase/add.php new file mode 100644 index 0000000..9791239 --- /dev/null +++ b/backend/ride/firebase/add.php @@ -0,0 +1,47 @@ +encryptData($token); + +// التحقق مما إذا كان السجل موجودًا +$sqlCheck = "SELECT * FROM `tokens` WHERE `passengerID` = :passengerID"; +$stmtCheck = $con->prepare($sqlCheck); +$stmtCheck->bindParam(':passengerID', $passengerID); +$stmtCheck->execute(); + +$result = $stmtCheck->fetch(PDO::FETCH_ASSOC); + +if ($result) { + // تحديث السجل الموجود + $sqlUpdate = "UPDATE `tokens` SET `token` = :token, `fingerPrint` = :fingerPrint WHERE `passengerID` = :passengerID"; + $stmtUpdate = $con->prepare($sqlUpdate); + $stmtUpdate->bindParam(':token', $tokenEncrypted); + $stmtUpdate->bindParam(':fingerPrint', $fingerPrint); // بدون تشفير إضافي + $stmtUpdate->bindParam(':passengerID', $passengerID); + $stmtUpdate->execute(); + + jsonSuccess(null, "Token updated successfully"); + +} else { + // إدخال سجل جديد + $sqlInsert = "INSERT INTO `tokens` (`token`, `passengerID`, `fingerPrint`) VALUES (:token, :passengerID, :fingerPrint)"; + $stmtInsert = $con->prepare($sqlInsert); + $stmtInsert->bindParam(':token', $tokenEncrypted); + $stmtInsert->bindParam(':passengerID', $passengerID); + $stmtInsert->bindParam(':fingerPrint', $fingerPrint); // بدون تشفير إضافي + $stmtInsert->execute(); + + if ($stmtInsert->rowCount() > 0) { + jsonSuccess(null, "Token inserted successfully"); + } else { + jsonError("Failed to insert token"); + } +} +?> \ No newline at end of file diff --git a/backend/ride/firebase/addDriver.php b/backend/ride/firebase/addDriver.php new file mode 100644 index 0000000..b1e820c --- /dev/null +++ b/backend/ride/firebase/addDriver.php @@ -0,0 +1,46 @@ +encryptData($token); + +// التحقق مما إذا كان السجل موجودًا +$sqlCheck = "SELECT * FROM `driverToken` WHERE `captain_id` = :captain_id"; +$stmtCheck = $con->prepare($sqlCheck); +$stmtCheck->bindParam(':captain_id', $captain_id); +$stmtCheck->execute(); + +$result = $stmtCheck->fetch(PDO::FETCH_ASSOC); + +if ($result) { + // تحديث السجل + $sqlUpdate = "UPDATE `driverToken` SET `token` = :token, `fingerPrint` = :fingerPrint WHERE `captain_id` = :captain_id"; + $stmtUpdate = $con->prepare($sqlUpdate); + $stmtUpdate->bindParam(':token', $tokenEncrypted); + $stmtUpdate->bindParam(':fingerPrint', $fingerPrint); // بدون إعادة تشفير + $stmtUpdate->bindParam(':captain_id', $captain_id); + $stmtUpdate->execute(); + + jsonSuccess(null, "Token updated successfully"); + +} else { + // إدخال سجل جديد + $sqlInsert = "INSERT INTO `driverToken` (`token`, `captain_id`, `fingerPrint`) VALUES (:token, :captain_id, :fingerPrint)"; + $stmtInsert = $con->prepare($sqlInsert); + $stmtInsert->bindParam(':token', $tokenEncrypted); + $stmtInsert->bindParam(':captain_id', $captain_id); + $stmtInsert->bindParam(':fingerPrint', $fingerPrint); // بدون إعادة تشفير + $stmtInsert->execute(); + + if ($stmtInsert->rowCount() > 0) { + jsonSuccess(null, "Token inserted successfully"); + } else { + jsonError("Failed to insert token"); + } +} +?> \ No newline at end of file diff --git a/backend/ride/firebase/addToken.php b/backend/ride/firebase/addToken.php new file mode 100755 index 0000000..9791239 --- /dev/null +++ b/backend/ride/firebase/addToken.php @@ -0,0 +1,47 @@ +encryptData($token); + +// التحقق مما إذا كان السجل موجودًا +$sqlCheck = "SELECT * FROM `tokens` WHERE `passengerID` = :passengerID"; +$stmtCheck = $con->prepare($sqlCheck); +$stmtCheck->bindParam(':passengerID', $passengerID); +$stmtCheck->execute(); + +$result = $stmtCheck->fetch(PDO::FETCH_ASSOC); + +if ($result) { + // تحديث السجل الموجود + $sqlUpdate = "UPDATE `tokens` SET `token` = :token, `fingerPrint` = :fingerPrint WHERE `passengerID` = :passengerID"; + $stmtUpdate = $con->prepare($sqlUpdate); + $stmtUpdate->bindParam(':token', $tokenEncrypted); + $stmtUpdate->bindParam(':fingerPrint', $fingerPrint); // بدون تشفير إضافي + $stmtUpdate->bindParam(':passengerID', $passengerID); + $stmtUpdate->execute(); + + jsonSuccess(null, "Token updated successfully"); + +} else { + // إدخال سجل جديد + $sqlInsert = "INSERT INTO `tokens` (`token`, `passengerID`, `fingerPrint`) VALUES (:token, :passengerID, :fingerPrint)"; + $stmtInsert = $con->prepare($sqlInsert); + $stmtInsert->bindParam(':token', $tokenEncrypted); + $stmtInsert->bindParam(':passengerID', $passengerID); + $stmtInsert->bindParam(':fingerPrint', $fingerPrint); // بدون تشفير إضافي + $stmtInsert->execute(); + + if ($stmtInsert->rowCount() > 0) { + jsonSuccess(null, "Token inserted successfully"); + } else { + jsonError("Failed to insert token"); + } +} +?> \ No newline at end of file diff --git a/backend/ride/firebase/delete.php b/backend/ride/firebase/delete.php new file mode 100644 index 0000000..047640a --- /dev/null +++ b/backend/ride/firebase/delete.php @@ -0,0 +1,17 @@ +prepare($sql); +$stmt->bindParam(':id', $id, PDO::PARAM_INT); +$stmt->execute(); + +if ($stmt->rowCount() > 0) { + jsonSuccess(null, "Token deleted successfully"); +} else { + jsonError("Failed to delete token"); +} +?> \ No newline at end of file diff --git a/backend/ride/firebase/fcm_fun.php b/backend/ride/firebase/fcm_fun.php new file mode 100755 index 0000000..1ef9b52 --- /dev/null +++ b/backend/ride/firebase/fcm_fun.php @@ -0,0 +1,277 @@ + 'RS256', 'typ' => 'JWT'])); + $claim = base64UrlEncode(json_encode([ + 'iss' => $clientEmail, + 'scope' => 'https://www.googleapis.com/auth/firebase.messaging', + 'aud' => 'https://oauth2.googleapis.com/token', + 'exp' => $now + 3600, + 'iat' => $now + ])); + + $signature = ''; + openssl_sign("$header.$claim", $signature, $privateKey, 'SHA256'); + $jwt = "$header.$claim." . base64UrlEncode($signature); + + $ch = curl_init("https://oauth2.googleapis.com/token"); + curl_setopt($ch, CURLOPT_POST, 1); + curl_setopt($ch, CURLOPT_POSTFIELDS, http_build_query([ + 'grant_type' => 'urn:ietf:params:oauth:grant-type:jwt-bearer', + 'assertion' => $jwt + ])); + curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); + curl_setopt($ch, CURLOPT_TIMEOUT, 10); + + $res = curl_exec($ch); + $httpCode = curl_getinfo($ch, CURLINFO_HTTP_CODE); + curl_close($ch); + + if ($httpCode != 200) { + error_log("❌ FCM OAuth Error ($httpCode): $res"); + return null; + } + + return json_decode($res, true)['access_token'] ?? null; +} + +// ============================================================================ +// 🔥 الدالة الرئيسية: إرسال إشعار FCM (داخلي - بدون HTTP) +// ============================================================================ +function sendFCMNotification($params) { + // استخراج البارامترات + $token = $params['token'] ?? null; + $title = $params['title'] ?? ''; + $body = $params['body'] ?? ''; + $category = $params['category'] ?? ''; + $data = $params['data'] ?? []; + $tone = $params['tone'] ?? 'default'; + $isTopic = $params['isTopic'] ?? false; + $serviceAccountPath = $params['service_account_path'] ?? __DIR__ . '/service-account.json'; + + // التحقق من البيانات الأساسية + if (empty($token) || empty($title) || empty($body)) { + error_log("❌ FCM: Missing required fields (token, title, or body)"); + return [ + 'success' => false, + 'error' => 'Missing required parameters', + 'http_code' => 400 + ]; + } + + // الحصول على Access Token + $accessToken = getFCMAccessToken($serviceAccountPath); + if (!$accessToken) { + return [ + 'success' => false, + 'error' => 'Failed to get Access Token', + 'http_code' => 500 + ]; + } + + // جلب Project ID + $creds = json_decode(file_get_contents($serviceAccountPath), true); + $projectId = $creds['project_id']; + $fcmUrl = "https://fcm.googleapis.com/v1/projects/$projectId/messages:send"; + + // بناء الـ Payload + $messagePayload = [ + 'message' => [ + 'notification' => [ + 'title' => $title, + 'body' => $body + ], + 'android' => [ + 'priority' => 'HIGH', + 'notification' => [ + 'sound' => $tone, + 'channel_id' => 'high_importance_channel' + ] + ], + 'apns' => [ + 'headers' => ['apns-priority' => '10'], + 'payload' => [ + 'aps' => [ + 'sound' => $tone . '.caf', + 'content-available' => 1 + ] + ] + ] + ] + ]; + + // تحديد الهدف + if ($isTopic) { + $messagePayload['message']['topic'] = $token; + } else { + $messagePayload['message']['token'] = $token; + } + + // إضافة الـ Data Payload + $customData = ['category' => (string)$category]; + if (is_array($data) && !empty($data)) { + $customData = array_merge($customData, $data); + } + + // تحويل كل القيم إلى String (FCM requirement) + $processedData = []; + foreach ($customData as $key => $val) { + if (is_array($val) || is_object($val)) { + $processedData[$key] = json_encode($val, JSON_UNESCAPED_UNICODE | JSON_UNESCAPED_SLASHES); + } else { + $processedData[$key] = (string)$val; + } + } + $messagePayload['message']['data'] = $processedData; + + // الإرسال إلى FCM + $ch = curl_init($fcmUrl); + curl_setopt($ch, CURLOPT_POST, true); + curl_setopt($ch, CURLOPT_HTTPHEADER, [ + 'Authorization: Bearer ' . $accessToken, + 'Content-Type: application/json; charset=UTF-8' + ]); + curl_setopt($ch, CURLOPT_POSTFIELDS, json_encode($messagePayload, JSON_UNESCAPED_UNICODE)); + curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); + curl_setopt($ch, CURLOPT_TIMEOUT, 10); + + $result = curl_exec($ch); + $httpCode = curl_getinfo($ch, CURLINFO_HTTP_CODE); + $curlError = curl_error($ch); + curl_close($ch); + + // معالجة النتيجة + if ($httpCode == 200) { + error_log("✅ FCM Sent: Category=$category, Token=" . substr($token, 0, 15) . "..."); + return [ + 'success' => true, + 'http_code' => $httpCode, + 'response' => json_decode($result, true) + ]; + } else { + error_log("❌ FCM Error ($httpCode): $result | CURL: $curlError"); + return [ + 'success' => false, + 'http_code' => $httpCode, + 'error' => json_decode($result, true), + 'curl_error' => $curlError + ]; + } +} + +// ============================================================================ +// 🎯 دوال مُساعدة جاهزة للاستخدام المباشر +// ============================================================================ + +/** + * إرسال إشعار "وصول السائق" + */ +function notifyDriverArrival($passengerToken, $driverName, $rideId) { + return sendFCMNotification([ + 'token' => $passengerToken, + 'title' => "السائق وصل إليك 📍", + 'body' => "$driverName في انتظارك الآن.", + 'category' => 'Arrive Ride', + 'tone' => 'tone1', + 'data' => [ + 'ride_id' => (string)$rideId, + 'timestamp' => date('Y-m-d H:i:s') + ] + ]); +} + +/** + * إرسال إشعار "بدأت الرحلة" + */ +function notifyTripBegin($passengerToken, $driverName, $rideId) { + return sendFCMNotification([ + 'token' => $passengerToken, + 'title' => "بدأت الرحلة 🚗", + 'body' => "السائق $driverName بدأ رحلتك الآن.", + 'category' => 'Trip is Begin', + 'tone' => 'start', + 'data' => [ + 'ride_id' => (string)$rideId, + 'start_time' => date('Y-m-d H:i:s') + ] + ]); +} + +/** + * إرسال إشعار "قبول الطلب" + */ +function notifyRideAccepted($passengerToken, $driverInfo, $rideId) { + return sendFCMNotification([ + 'token' => $passengerToken, + 'title' => "تم قبول الطلب 🚖", + 'body' => "الكابتن {$driverInfo['driverName']} قادم إليك.", + 'category' => 'Accepted Ride', + 'tone' => 'start', + 'data' => [ + 'ride_id' => (string)$rideId, + 'driver_id' => (string)$driverInfo['driverId'], + 'driver_info' => $driverInfo // سيتم تحويلها لـ JSON تلقائياً + ] + ]); +} + +/** + * إرسال إشعار "إلغاء الرحلة من السائق" + */ +function notifyRideCancelled($passengerToken, $rideId, $reason = '') { + return sendFCMNotification([ + 'token' => $passengerToken, + 'title' => "تم إلغاء الرحلة ❌", + 'body' => "السائق اعتذر عن إكمال الرحلة.", + 'category' => 'Cancel Trip from driver', + 'tone' => 'cancel', + 'data' => [ + 'ride_id' => (string)$rideId, + 'reason' => $reason, + 'cancelled_at' => date('Y-m-d H:i:s') + ] + ]); +} + +/** + * إرسال إشعار "انتهاء الرحلة" + */ +function notifyTripFinished($passengerToken, $tripData) { + return sendFCMNotification([ + 'token' => $passengerToken, + 'title' => "انتهت الرحلة 🏁", + 'body' => "شكرًا لاستخدامك تطبيق Tripz", + 'category' => 'Driver Finish Trip', + 'tone' => 'default', + 'data' => [ + 'DriverList' => $tripData // Array سيتم تحويلها لـ JSON + ] + ]); +} +?> diff --git a/backend/ride/firebase/get.php b/backend/ride/firebase/get.php new file mode 100644 index 0000000..7a28d91 --- /dev/null +++ b/backend/ride/firebase/get.php @@ -0,0 +1,22 @@ +prepare($sql); +$stmt->bindParam(':passengerID', $passengerID, PDO::PARAM_STR); +$stmt->execute(); + +$data = $stmt->fetch(PDO::FETCH_ASSOC); + +if ($data) { + // فك تشفير التوكن فقط + $data['token'] = $encryptionHelper->decryptData($data['token']); + jsonSuccess($data); + +} else { + jsonError("No token found for this passenger"); +} +?> \ No newline at end of file diff --git a/backend/ride/firebase/getALlTokenDrivers.php b/backend/ride/firebase/getALlTokenDrivers.php new file mode 100755 index 0000000..f0a35ce --- /dev/null +++ b/backend/ride/firebase/getALlTokenDrivers.php @@ -0,0 +1,23 @@ +prepare($sql); +$stmt->execute(); +$data = $stmt->fetchAll(PDO::FETCH_ASSOC); + +if ($data) { + // فك تشفير token فقط لكل سجل + foreach ($data as &$item) { + $item['token'] = $encryptionHelper->decryptData($item['token']); + // لا يتم فك تشفير fingerPrint لأنه مشفّر من Flutter + } + + echo json_encode([ + 'status' => 'success', + 'data' => $data + ]); +} else { + jsonError("No driver tokens found"); +} +?> \ No newline at end of file diff --git a/backend/ride/firebase/getAllTokenPassengers.php b/backend/ride/firebase/getAllTokenPassengers.php new file mode 100755 index 0000000..0e0bd51 --- /dev/null +++ b/backend/ride/firebase/getAllTokenPassengers.php @@ -0,0 +1,23 @@ +prepare($sql); +$stmt->execute(); +$data = $stmt->fetchAll(PDO::FETCH_ASSOC); + +if ($data) { + // فك تشفير token فقط + foreach ($data as &$item) { + $item['token'] = $encryptionHelper->decryptData($item['token']); + // fingerPrint يبقى كما هو (مشفّر من التطبيق) + } + + echo json_encode([ + 'status' => 'success', + 'data' => $data + ]); +} else { + jsonError("No token records found"); +} +?> \ No newline at end of file diff --git a/backend/ride/firebase/getDriverToken.php b/backend/ride/firebase/getDriverToken.php new file mode 100644 index 0000000..1bae751 --- /dev/null +++ b/backend/ride/firebase/getDriverToken.php @@ -0,0 +1,26 @@ +prepare($sql); +$stmt->bindParam(':captain_id', $captain_id, PDO::PARAM_STR); +$stmt->execute(); +$data = $stmt->fetchAll(PDO::FETCH_ASSOC); + +if ($data) { + // فك تشفير token فقط + foreach ($data as &$item) { + $item['token'] = $encryptionHelper->decryptData($item['token']); + // fingerPrint يبقى كما هو + } + + echo json_encode([ + 'status' => 'success', + 'data' => $data + ]); +} else { + jsonError("No driver token found"); +} +?> \ No newline at end of file diff --git a/backend/ride/firebase/getTokenParent.php b/backend/ride/firebase/getTokenParent.php new file mode 100644 index 0000000..03d7a86 --- /dev/null +++ b/backend/ride/firebase/getTokenParent.php @@ -0,0 +1,45 @@ +encryptData($phone); + +// 1️⃣ جلب passengerID بناءً على رقم الهاتف +$sql = "SELECT `id` FROM `passengers` WHERE `phone` = :phone"; +$stmt = $con->prepare($sql); +$stmt->bindParam(':phone', $phoneEncrypted); +$stmt->execute(); +$data = $stmt->fetch(PDO::FETCH_ASSOC); + +if ($data) { + $passengerID = $data['id']; +} else { + jsonError("No passenger found for the given phone number"); + exit; +} + +// 2️⃣ جلب التوكنات المرتبطة بـ passengerID +$sql1 = "SELECT * FROM `tokens` WHERE `passengerID` = :passengerID"; +$stmt = $con->prepare($sql1); +$stmt->bindParam(':passengerID', $passengerID); +$stmt->execute(); +$data = $stmt->fetchAll(PDO::FETCH_ASSOC); + +if ($data) { + // فك تشفير التوكن فقط + foreach ($data as &$row) { + $row['token'] = $encryptionHelper->decryptData($row['token']); + // fingerPrint يبقى كما هو + } + + echo json_encode([ + 'status' => 'success', + 'count' => count($data), + 'data' => $data + ]); +} else { + jsonError("No tokens found for the passenger"); +} +?> \ No newline at end of file diff --git a/backend/ride/firebase/getTokensPassenger.php b/backend/ride/firebase/getTokensPassenger.php new file mode 100755 index 0000000..7a28d91 --- /dev/null +++ b/backend/ride/firebase/getTokensPassenger.php @@ -0,0 +1,22 @@ +prepare($sql); +$stmt->bindParam(':passengerID', $passengerID, PDO::PARAM_STR); +$stmt->execute(); + +$data = $stmt->fetch(PDO::FETCH_ASSOC); + +if ($data) { + // فك تشفير التوكن فقط + $data['token'] = $encryptionHelper->decryptData($data['token']); + jsonSuccess($data); + +} else { + jsonError("No token found for this passenger"); +} +?> \ No newline at end of file diff --git a/backend/ride/firebase/notify_driver_arrival.php b/backend/ride/firebase/notify_driver_arrival.php new file mode 100755 index 0000000..a6434f2 --- /dev/null +++ b/backend/ride/firebase/notify_driver_arrival.php @@ -0,0 +1,41 @@ + 'test'], // بيانات إضافية بسيطة + "General" // التصنيف +); + +// 3. طباعة النتيجة +//echo "النتيجة:\n"; +print_r($result); + +?> \ No newline at end of file diff --git a/backend/ride/firebase/send_fcm.php b/backend/ride/firebase/send_fcm.php new file mode 100755 index 0000000..b366905 --- /dev/null +++ b/backend/ride/firebase/send_fcm.php @@ -0,0 +1,171 @@ + 'error', 'message' => 'Only POST allowed.']); + exit; +} + +// استقبال البيانات +$json_input = file_get_contents('php://input'); +$requestData = json_decode($json_input, true); + +$target = $requestData['target'] ?? null; +$title = $requestData['title'] ?? null; +$body = $requestData['body'] ?? null; +$isTopic = $requestData['isTopic'] ?? false; +$tone = $requestData['tone'] ?? 'default'; +$customData = $requestData['data'] ?? []; + +if (!$target) { + http_response_code(400); + echo json_encode(['status' => 'error', 'message' => 'Missing: target, title, or body.']); + exit; +} + +// ============================================================================ +// دالة Base64 URL-Safe Encoding (ضرورية للـ JWT) +// ============================================================================ +function base64UrlEncode($data) { + return rtrim(strtr(base64_encode($data), '+/', '-_'), '='); +} + +// ============================================================================ +// دالة المصادقة (Google OAuth2) +// ============================================================================ +function getAccessToken($credentialsPath) { + if (!file_exists($credentialsPath)) return null; + + $credentials = json_decode(file_get_contents($credentialsPath), true); + $clientEmail = $credentials['client_email']; + $privateKey = $credentials['private_key']; + + $now = time(); + $header = base64UrlEncode(json_encode(['alg' => 'RS256', 'typ' => 'JWT'])); + $claim = base64UrlEncode(json_encode([ + 'iss' => $clientEmail, + 'scope' => 'https://www.googleapis.com/auth/firebase.messaging', + 'aud' => 'https://oauth2.googleapis.com/token', + 'exp' => $now + 3600, + 'iat' => $now + ])); + + $signature = ''; + openssl_sign("$header.$claim", $signature, $privateKey, 'SHA256'); + $jwt = "$header.$claim." . base64UrlEncode($signature); + + $ch = curl_init("https://oauth2.googleapis.com/token"); + curl_setopt($ch, CURLOPT_POST, 1); + curl_setopt($ch, CURLOPT_POSTFIELDS, http_build_query([ + 'grant_type' => 'urn:ietf:params:oauth:grant-type:jwt-bearer', + 'assertion' => $jwt + ])); + curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); + $res = curl_exec($ch); + curl_close($ch); + + return json_decode($res, true)['access_token'] ?? null; +} + +// الحصول على Access Token +$accessToken = getAccessToken($serviceAccountFile); +if (!$accessToken) { + http_response_code(500); + echo json_encode(['status' => 'error', 'message' => 'Failed to get Access Token.']); + exit; +} + +// جلب Project ID +$creds = json_decode(file_get_contents($serviceAccountFile), true); +$projectId = $creds['project_id']; +$fcmUrl = "https://fcm.googleapis.com/v1/projects/$projectId/messages:send"; + +// ============================================================================ +// بناء هيكل الرسالة +// ============================================================================ +$messagePayload = [ + 'message' => [ + 'notification' => [ + 'title' => $title, + 'body' => $body + ], + 'android' => [ + 'priority' => 'HIGH', + 'notification' => [ + 'sound' => $tone, + 'channel_id' => 'high_importance_channel' // تأكد من تطابقه مع Android + ] + ], + 'apns' => [ + 'headers' => ['apns-priority' => '10'], + 'payload' => [ + 'aps' => [ + 'sound' => $tone . '.caf', + 'content-available' => 1 + ] + ] + ] + ] +]; + +// تحديد الهدف (Topic أو Token) +if ($isTopic) { + $messagePayload['message']['topic'] = $target; +} else { + $messagePayload['message']['token'] = $target; +} + +// ============================================================================ +// 🔥 معالجة Data Payload (يجب أن تكون String: String فقط) +// ============================================================================ +if (!empty($customData)) { + $processedData = []; + foreach ($customData as $key => $val) { + if (is_array($val) || is_object($val)) { + // تحويل المصفوفات/الكائنات إلى JSON String + $processedData[$key] = json_encode($val, JSON_UNESCAPED_UNICODE | JSON_UNESCAPED_SLASHES); + } else { + // تحويل أي قيمة أخرى إلى String + $processedData[$key] = (string)$val; + } + } + $messagePayload['message']['data'] = $processedData; +} + +// ============================================================================ +// الإرسال الفعلي إلى FCM +// ============================================================================ +$ch = curl_init($fcmUrl); +curl_setopt($ch, CURLOPT_POST, true); +curl_setopt($ch, CURLOPT_HTTPHEADER, [ + 'Authorization: Bearer ' . $accessToken, + 'Content-Type: application/json; charset=UTF-8' +]); +curl_setopt($ch, CURLOPT_POSTFIELDS, json_encode($messagePayload, JSON_UNESCAPED_UNICODE)); +curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); + +$result = curl_exec($ch); +$httpCode = curl_getinfo($ch, CURLINFO_HTTP_CODE); +curl_close($ch); + +// الرد +if ($httpCode == 200) { + echo json_encode([ + 'status' => 'success', + 'message' => 'Notification sent successfully', + 'fcm_response' => json_decode($result) + ], JSON_UNESCAPED_UNICODE); +} else { + http_response_code($httpCode); + echo json_encode([ + 'status' => 'error', + 'message' => 'FCM request failed', + 'fcm_response' => json_decode($result) + ], JSON_UNESCAPED_UNICODE); +} +?> diff --git a/backend/ride/gamification/claimChallengeReward.php b/backend/ride/gamification/claimChallengeReward.php new file mode 100644 index 0000000..4bd319c --- /dev/null +++ b/backend/ride/gamification/claimChallengeReward.php @@ -0,0 +1,34 @@ +prepare($checkSql); +$stmtCheck->bindParam(':driver_id', $driver_id, PDO::PARAM_INT); +$stmtCheck->bindParam(':challenge_id', $challenge_id, PDO::PARAM_STR); +$stmtCheck->execute(); + +if ($stmtCheck->rowCount() > 0) { + jsonError("Reward already claimed today"); + exit(); +} + +// Insert into driver wallet +$paymentID = "CHL_" . time(); +$sql = "INSERT INTO driverWallet (driverID, paymentID, amount, paymentMethod) VALUES (:driver_id, :paymentID, :amount, :method)"; +$stmt = $con->prepare($sql); +$stmt->bindParam(':driver_id', $driver_id, PDO::PARAM_INT); +$stmt->bindParam(':paymentID', $paymentID, PDO::PARAM_STR); +$stmt->bindParam(':amount', $points, PDO::PARAM_STR); +$stmt->bindParam(':method', $challenge_id, PDO::PARAM_STR); + +if ($stmt->execute()) { + jsonSuccess("Reward claimed successfully"); +} else { + jsonError("Failed to claim reward"); +} +?> diff --git a/backend/ride/gamification/getDriverBehavior.php b/backend/ride/gamification/getDriverBehavior.php new file mode 100644 index 0000000..6628574 --- /dev/null +++ b/backend/ride/gamification/getDriverBehavior.php @@ -0,0 +1,31 @@ += DATE(NOW()) - INTERVAL 30 DAY +"; + +$stmt = $con->prepare($sql); +$stmt->bindParam(':driver_id', $driver_id, PDO::PARAM_INT); +$stmt->execute(); + +$row = $stmt->fetch(PDO::FETCH_ASSOC); + +if ($row && $row['max_speed'] !== null) { + jsonSuccess([$row]); +} else { + jsonSuccess([[ + "avg_score" => 100, + "total_hard_brakes" => 0, + "max_speed" => 0 + ]]); +} +?> diff --git a/backend/ride/gamification/getLeaderboard.php b/backend/ride/gamification/getLeaderboard.php new file mode 100644 index 0000000..3e76f04 --- /dev/null +++ b/backend/ride/gamification/getLeaderboard.php @@ -0,0 +1,60 @@ += DATE(NOW() - INTERVAL WEEKDAY(NOW()) DAY) + GROUP BY d.id + ORDER BY value DESC + LIMIT 10 + "; + } else { + // Default to trips + $sql = " + SELECT + d.id as driver_id, + COALESCE(d.name, d.nameArabic, d.firstName, 'Driver') as name, + d.personal_photo as photoUrl, + COUNT(r.id) as value + FROM `driver` d + JOIN `ride` r ON d.id = r.driver_id + WHERE r.status = 'Finished' + AND r.created_at >= DATE(NOW() - INTERVAL WEEKDAY(NOW()) DAY) + GROUP BY d.id + ORDER BY value DESC + LIMIT 10 + "; + } + + $stmt = $con->prepare($sql); + $stmt->execute(); +} catch (PDOException $e) { + error_log("getLeaderboard Error: " . $e->getMessage()); + jsonError("Database error occurred"); +} + +if ($stmt->rowCount() > 0) { + $rows = $stmt->fetchAll(PDO::FETCH_ASSOC); + + // Add Rank manually to support older MySQL versions + $rank = 1; + foreach ($rows as &$row) { + $row['rank'] = $rank++; + } + + jsonSuccess($rows); +} else { + jsonSuccess([]); +} +?> diff --git a/backend/ride/gamification/getReferralStats.php b/backend/ride/gamification/getReferralStats.php new file mode 100644 index 0000000..b50bbac --- /dev/null +++ b/backend/ride/gamification/getReferralStats.php @@ -0,0 +1,30 @@ +prepare($sqlDriver); +$stmtD->bindParam(':driver_id', $driver_id, PDO::PARAM_INT); +$stmtD->execute(); +$driverCount = $stmtD->fetchColumn(); + +// Passenger invites count +$sqlPass = "SELECT COUNT(*) as total FROM invitesToPassengers WHERE driverId = :driver_id AND isInstall = 1"; +$stmtP = $con->prepare($sqlPass); +$stmtP->bindParam(':driver_id', $driver_id, PDO::PARAM_INT); +$stmtP->execute(); +$passengerCount = $stmtP->fetchColumn(); + +// Rewards calculation (100 pts per driver, 50 pts per passenger) +$totalRewards = ($driverCount * 100) + ($passengerCount * 50); + +jsonSuccess([ + [ + "driverInvites" => (int)$driverCount, + "passengerInvites" => (int)$passengerCount, + "totalRewards" => $totalRewards + ] +]); +?> diff --git a/backend/ride/gamification/getWeeklyAggregate.php b/backend/ride/gamification/getWeeklyAggregate.php new file mode 100644 index 0000000..a5e4202 --- /dev/null +++ b/backend/ride/gamification/getWeeklyAggregate.php @@ -0,0 +1,36 @@ += DATE(NOW()) - INTERVAL 6 DAY + GROUP BY DATE(r.created_at) + ORDER BY DATE(r.created_at) ASC + "; + + $stmt = $con->prepare($sql); + $stmt->bindParam(':driver_id', $driver_id, PDO::PARAM_INT); + $stmt->execute(); + + if ($stmt->rowCount() > 0) { + $rows = $stmt->fetchAll(PDO::FETCH_ASSOC); + jsonSuccess($rows); + } else { + jsonSuccess([]); + } +} catch (PDOException $e) { + // Return empty but log error + error_log("getWeeklyAggregate Error: " . $e->getMessage()); + jsonError("Database error occurred"); +} +?> diff --git a/backend/ride/helpCenter/add.php b/backend/ride/helpCenter/add.php new file mode 100644 index 0000000..9d7cf00 --- /dev/null +++ b/backend/ride/helpCenter/add.php @@ -0,0 +1,19 @@ +prepare($sql); +$stmt->bindParam(':driverID', $driverID); +$stmt->bindParam(':helpQuestion', $helpQuestion); +$stmt->execute(); + +if ($stmt->rowCount() > 0) { + jsonSuccess(null, "Help question saved successfully"); +} else { + jsonError("Failed to save help question"); +} +?> \ No newline at end of file diff --git a/backend/ride/helpCenter/delete.php b/backend/ride/helpCenter/delete.php new file mode 100644 index 0000000..eebae18 --- /dev/null +++ b/backend/ride/helpCenter/delete.php @@ -0,0 +1,17 @@ +prepare($sql); +$stmt->bindParam(':id', $helpID, PDO::PARAM_INT); +$stmt->execute(); + +if ($stmt->rowCount() > 0) { + jsonSuccess(null, "Help question deleted successfully"); +} else { + jsonError("Failed to delete help question"); +} +?> \ No newline at end of file diff --git a/backend/ride/helpCenter/error_log b/backend/ride/helpCenter/error_log new file mode 100644 index 0000000..e69de29 diff --git a/backend/ride/helpCenter/get.php b/backend/ride/helpCenter/get.php new file mode 100644 index 0000000..04bedbe --- /dev/null +++ b/backend/ride/helpCenter/get.php @@ -0,0 +1,28 @@ +prepare($sql); +$stmt->bindParam(':driverID', $driverID, PDO::PARAM_STR); +$stmt->execute(); + +if ($stmt->rowCount() > 0) { + $record = $stmt->fetchAll(PDO::FETCH_ASSOC); + jsonSuccess($record); +} else { + jsonError("Help question not found"); +} +?> \ No newline at end of file diff --git a/backend/ride/helpCenter/getById.php b/backend/ride/helpCenter/getById.php new file mode 100644 index 0000000..69ac1d5 --- /dev/null +++ b/backend/ride/helpCenter/getById.php @@ -0,0 +1,18 @@ +prepare($sql); +$stmt->bindParam(':id', $helpID, PDO::PARAM_INT); +$stmt->execute(); + +if ($stmt->rowCount() > 0) { + $record = $stmt->fetch(PDO::FETCH_ASSOC); + jsonSuccess($record); +} else { + jsonError("Help question not found"); +} +?> \ No newline at end of file diff --git a/backend/ride/helpCenter/update.php b/backend/ride/helpCenter/update.php new file mode 100644 index 0000000..88bfc74 --- /dev/null +++ b/backend/ride/helpCenter/update.php @@ -0,0 +1,19 @@ +prepare($sql); +$stmt->bindParam(':helpQuestion', $newHelpQuestion); +$stmt->bindParam(':id', $helpID, PDO::PARAM_INT); +$stmt->execute(); + +if ($stmt->rowCount() > 0) { + jsonSuccess(null, "Help question updated successfully"); +} else { + jsonError("Failed to update help question"); +} +?> \ No newline at end of file diff --git a/backend/ride/invitor/add.php b/backend/ride/invitor/add.php new file mode 100755 index 0000000..6541fc4 --- /dev/null +++ b/backend/ride/invitor/add.php @@ -0,0 +1,89 @@ +prepare("SELECT COUNT(*) FROM invites WHERE inviteCode = ?"); + $stmt->execute([$code]); + + if ($stmt->fetchColumn() == 0) { + return $code; + } + } +} + +$driverId = filterRequest("driverId"); +$inviterDriverPhone = filterRequest("inviterDriverPhone"); + +// 🔐 تشفير رقم الهاتف +$inviterDriverPhoneEncrypted = $encryptionHelper->encryptData($inviterDriverPhone); + +// تحقق من وجود رقم الهاتف مسبقًا +$checkSql = "SELECT `id`, `inviteCode`, `isInstall` FROM `invites` WHERE `inviterDriverPhone` = :inviterDriverPhone"; +$checkStmt = $con->prepare($checkSql); +$checkStmt->bindParam(':inviterDriverPhone', $inviterDriverPhoneEncrypted, PDO::PARAM_STR); +$checkStmt->execute(); + +if ($checkStmt->rowCount() > 0) { + $existingInvite = $checkStmt->fetch(PDO::FETCH_ASSOC); + + if ($existingInvite['isInstall'] == 1) { + jsonError($existingInvite['inviteCode']); + } else { + // تحديث الدعوة الحالية + $updateSql = "UPDATE `invites` SET `driverId` = :driverId, `expirationTime` = :expirationTime, `createdAt` = NOW() WHERE `id` = :id"; + $updateStmt = $con->prepare($updateSql); + $expirationTime = date('Y-m-d H:i:s', strtotime('+24 hours')); + $updateStmt->bindParam(':driverId', $driverId, PDO::PARAM_INT); + $updateStmt->bindParam(':expirationTime', $expirationTime); + $updateStmt->bindParam(':id', $existingInvite['id'], PDO::PARAM_INT); + + try { + $updateStmt->execute(); + printSuccess([ + "message" => "Invite updated successfully", + "inviteId" => $existingInvite['id'], + "inviteCode" => $existingInvite['inviteCode'], + "expirationTime" => $expirationTime + ]); + } catch (PDOException $e) { + jsonError("Database error: " . $e->getMessage()); + } + } + +} else { + // إنشاء دعوة جديدة + $inviteCode = generateUniqueCode($con); + $expirationTime = date('Y-m-d H:i:s', strtotime('+24 hours')); + + $sql = "INSERT INTO `invites` (`driverId`, `inviterDriverPhone`, `inviteCode`, `expirationTime`, `createdAt`, `isInstall`) + VALUES (:driverId, :inviterDriverPhone, :inviteCode, :expirationTime, NOW(), 0)"; + $stmt = $con->prepare($sql); + $stmt->bindParam(':driverId', $driverId, PDO::PARAM_INT); + $stmt->bindParam(':inviterDriverPhone', $inviterDriverPhoneEncrypted, PDO::PARAM_STR); + $stmt->bindParam(':inviteCode', $inviteCode); + $stmt->bindParam(':expirationTime', $expirationTime); + + try { + $stmt->execute(); + if ($stmt->rowCount() > 0) { + $insertedID = $con->lastInsertId(); + printSuccess([ + "message" => "Invite created successfully", + "inviteId" => $insertedID, + "inviteCode" => $inviteCode, + "expirationTime" => $expirationTime + ]); + } else { + jsonError("Failed to save invite data"); + } + } catch (PDOException $e) { + jsonError("Database error: " . $e->getMessage()); + } +} +?> \ No newline at end of file diff --git a/backend/ride/invitor/addInvitationPassenger.php b/backend/ride/invitor/addInvitationPassenger.php new file mode 100755 index 0000000..c9b590b --- /dev/null +++ b/backend/ride/invitor/addInvitationPassenger.php @@ -0,0 +1,97 @@ +prepare("SELECT COUNT(*) FROM invitesToPassengers WHERE inviteCode = ?"); + $stmt->execute([$code]); + + if ($stmt->fetchColumn() == 0) { + return $code; + } + } +} + +$driverId = filterRequest("driverId"); +$inviterPassengerPhone = filterRequest("inviterPassengerPhone"); + +if (!$driverId || !$inviterPassengerPhone) { + jsonError("Missing required parameters: driverId or inviterPassengerPhone"); +} + +// 🔐 تشفير رقم الهاتف +$inviterPassengerPhoneEncrypted = $encryptionHelper->encryptData($inviterPassengerPhone); + +// التحقق من وجود الرقم مسبقًا +$checkSql = "SELECT `id`, `inviteCode`, `isInstall`, `isGiftToken` FROM `invitesToPassengers` WHERE `inviterPassengerPhone` = :inviterPassengerPhone"; +$checkStmt = $con->prepare($checkSql); +$checkStmt->bindParam(':inviterPassengerPhone', $inviterPassengerPhoneEncrypted, PDO::PARAM_STR); +$checkStmt->execute(); + +if ($checkStmt->rowCount() > 0) { + $existingInvite = $checkStmt->fetch(PDO::FETCH_ASSOC); + + if ($existingInvite['isInstall'] == 1 || $existingInvite['isGiftToken'] == 1) { + printFailure([ + "message" => "Invite code already used or gift token already applied", + "inviteCode" => $existingInvite['inviteCode'] + ]); + } else { + // تحديث الدعوة + $updateSql = "UPDATE `invitesToPassengers` SET `driverId` = :driverId, `expirationTime` = :expirationTime, `createdAt` = NOW() WHERE `id` = :id"; + $updateStmt = $con->prepare($updateSql); + $expirationTime = date('Y-m-d H:i:s', strtotime('+1 hour')); + $updateStmt->bindParam(':driverId', $driverId, PDO::PARAM_INT); + $updateStmt->bindParam(':expirationTime', $expirationTime); + $updateStmt->bindParam(':id', $existingInvite['id'], PDO::PARAM_INT); + + try { + $updateStmt->execute(); + printSuccess([ + "message" => "Invite updated successfully", + "inviteId" => $existingInvite['id'], + "inviteCode" => $existingInvite['inviteCode'], + "expirationTime" => $expirationTime + ]); + } catch (PDOException $e) { + jsonError("Database error: " . $e->getMessage()); + } + } +} else { + // إنشاء دعوة جديدة + $inviteCode = generateUniqueCode($con); + $expirationTime = date('Y-m-d H:i:s', strtotime('+4 hour')); + + $sql = "INSERT INTO `invitesToPassengers` + (`driverId`, `inviterPassengerPhone`, `inviteCode`, `expirationTime`, `createdAt`, `isInstall`, `isGiftToken`) + VALUES + (:driverId, :inviterPassengerPhone, :inviteCode, :expirationTime, NOW(), 0, 0)"; + + $stmt = $con->prepare($sql); + $stmt->bindParam(':driverId', $driverId, PDO::PARAM_INT); + $stmt->bindParam(':inviterPassengerPhone', $inviterPassengerPhoneEncrypted, PDO::PARAM_STR); + $stmt->bindParam(':inviteCode', $inviteCode); + $stmt->bindParam(':expirationTime', $expirationTime); + + try { + $stmt->execute(); + if ($stmt->rowCount() > 0) { + $insertedID = $con->lastInsertId(); + printSuccess([ + "message" => "Invite created successfully", + "inviteId" => $insertedID, + "inviteCode" => $inviteCode, + "expirationTime" => $expirationTime + ]); + } else { + jsonError("Failed to save invite data"); + } + } catch (PDOException $e) { + jsonError("Database error: " . $e->getMessage()); + } +} +?> \ No newline at end of file diff --git a/backend/ride/invitor/error_log b/backend/ride/invitor/error_log new file mode 100644 index 0000000..e69de29 diff --git a/backend/ride/invitor/get.php b/backend/ride/invitor/get.php new file mode 100644 index 0000000..600b388 --- /dev/null +++ b/backend/ride/invitor/get.php @@ -0,0 +1,52 @@ +prepare($sql); +$stmt->bindParam(':driverId', $driverId, PDO::PARAM_INT); +$stmt->execute(); + +if ($stmt->rowCount() > 0) { + $rows = $stmt->fetchAll(PDO::FETCH_ASSOC); + + // 🔓 فك التشفير للحقول المطلوبة + foreach ($rows as &$row) { + $row['inviterDriverPhone'] = $encryptionHelper->decryptData($row['inviterDriverPhone']); + $row['invitorPhone'] = $encryptionHelper->decryptData($row['invitorPhone']); + $row['invitorName'] = $encryptionHelper->decryptData($row['invitorName']); + } + + jsonSuccess($rows); +} else { + jsonError("No records found."); +} +?> \ No newline at end of file diff --git a/backend/ride/invitor/getDriverInvitationToPassengers.php b/backend/ride/invitor/getDriverInvitationToPassengers.php new file mode 100755 index 0000000..0f86e95 --- /dev/null +++ b/backend/ride/invitor/getDriverInvitationToPassengers.php @@ -0,0 +1,48 @@ +prepare($sql); +$stmt->bindParam(':driverId', $driverId, PDO::PARAM_INT); +$stmt->execute(); + +if ($stmt->rowCount() > 0) { + $rows = $stmt->fetchAll(PDO::FETCH_ASSOC); + + // 🔓 فك التشفير للحقول المطلوبة + foreach ($rows as &$row) { + $row['inviterPassengerPhone'] = $encryptionHelper->decryptData($row['inviterPassengerPhone']); + $row['passengerName'] = $encryptionHelper->decryptData($row['passengerName']); + } + + jsonSuccess($rows); +} else { + jsonError("No records found."); +} +?> \ No newline at end of file diff --git a/backend/ride/invitor/update.php b/backend/ride/invitor/update.php new file mode 100644 index 0000000..1b1a1ae --- /dev/null +++ b/backend/ride/invitor/update.php @@ -0,0 +1,16 @@ +prepare($sql); +$stmt->bindParam(':id', $id, PDO::PARAM_INT); +$stmt->execute(); + +if ($stmt->rowCount() > 0) { + jsonSuccess(null, "Record updated successfully."); +} else { + jsonError("No records were updated"); +} +?> \ No newline at end of file diff --git a/backend/ride/invitor/updateDriverInvitationDirectly.php b/backend/ride/invitor/updateDriverInvitationDirectly.php new file mode 100755 index 0000000..ee651cc --- /dev/null +++ b/backend/ride/invitor/updateDriverInvitationDirectly.php @@ -0,0 +1,59 @@ +encryptData($inviterDriverPhone); + + // ✅ الآن الاستعلام نظيف وطبيعي جداً لأن قاعدة البيانات تم إصلاحها + $fetchSql = "SELECT + i.`id`, + i.`driverId`, + i.`inviterDriverPhone`, + i.`createdAt`, + i.`inviteCode`, + i.`isInstall`, + i.`isGiftToken`, + i.`expirationTime`, + dt.token + FROM `invites` i + LEFT JOIN `driverToken` dt ON dt.captain_id = i.driverId + WHERE i.`inviterDriverPhone` = :inviterDriverPhone + AND i.`expirationTime` > NOW()"; + + $fetchStmt = $con->prepare($fetchSql); + $fetchStmt->bindParam(':inviterDriverPhone', $inviterDriverPhoneEncrypted); + $fetchStmt->execute(); + + if ($fetchStmt->rowCount() > 0) { + $invite = $fetchStmt->fetch(PDO::FETCH_ASSOC); + + // فك التشفير + $invite['inviterDriverPhone'] = $encryptionHelper->decryptData($invite['inviterDriverPhone']); + if (!empty($invite['token'])) { + $invite['token'] = $encryptionHelper->decryptData($invite['token']); + } + + // التحديث + $updateSql = "UPDATE `invites` SET `isInstall` = 1 WHERE `id` = :id"; + $updateStmt = $con->prepare($updateSql); + $updateStmt->bindParam(':id', $invite['id'], PDO::PARAM_INT); + $updateStmt->execute(); + + printSuccess("Record found and updated successfully.", $invite); + } else { + jsonError("No records found."); + } + +} catch (PDOException $e) { + error_log("DB Error: " . $e->getMessage()); + jsonError("Database error: " . $e->getMessage()); +} +?> \ No newline at end of file diff --git a/backend/ride/invitor/updateInvitationCodeFromRegister.php b/backend/ride/invitor/updateInvitationCodeFromRegister.php new file mode 100755 index 0000000..a4eb728 --- /dev/null +++ b/backend/ride/invitor/updateInvitationCodeFromRegister.php @@ -0,0 +1,44 @@ + NOW()"; + + $checkStmt = $con->prepare($checkSql); + $checkStmt->bindParam(':inviteCode', $inviteCode); + $checkStmt->execute(); + + if ($checkStmt->rowCount() > 0) { + $invite = $checkStmt->fetch(PDO::FETCH_ASSOC); + + $updateSql = "UPDATE `invites` SET `isInstall` = 1 WHERE `id` = :id"; + $updateStmt = $con->prepare($updateSql); + $updateStmt->bindParam(':id', $invite['id'], PDO::PARAM_INT); + $updateStmt->execute(); + + if ($updateStmt->rowCount() > 0) { + printSuccess([ + "message" => "Invite code successfully used and marked as installed.", + "driverId" => $invite['driverId'], + "expirationTime" => $invite['expirationTime'] + ]); + } else { + jsonError("Failed to update the invite record."); + } + } else { + jsonError("Invalid invite code, already installed, or expired."); + } +} catch (PDOException $e) { + jsonError("Database error: " . $e->getMessage()); +} +?> \ No newline at end of file diff --git a/backend/ride/invitor/updatePassengerGift.php b/backend/ride/invitor/updatePassengerGift.php new file mode 100755 index 0000000..dba1492 --- /dev/null +++ b/backend/ride/invitor/updatePassengerGift.php @@ -0,0 +1,16 @@ +prepare($sql); +$stmt->bindParam(':id', $id, PDO::PARAM_INT); +$stmt->execute(); + +if ($stmt->rowCount() > 0) { + jsonSuccess(null, "Record updated successfully."); +} else { + jsonError("No records were updated"); +} +?> \ No newline at end of file diff --git a/backend/ride/invitor/updatePassengersInvitation.php b/backend/ride/invitor/updatePassengersInvitation.php new file mode 100755 index 0000000..a4e795d --- /dev/null +++ b/backend/ride/invitor/updatePassengersInvitation.php @@ -0,0 +1,48 @@ +encryptData($inviteCode); + +try { + $checkSql = "SELECT `id`, `expirationTime` FROM `invitesToPassengers` + WHERE `inviteCode` = :inviteCode + AND `isInstall` = 0 + AND `isGiftToken` = 0"; + + $checkStmt = $con->prepare($checkSql); + $checkStmt->bindParam(':inviteCode', $inviteCodeEncrypted); + $checkStmt->execute(); + + if ($checkStmt->rowCount() > 0) { + $invite = $checkStmt->fetch(PDO::FETCH_ASSOC); + + $updateSql = "UPDATE `invitesToPassengers` + SET `isInstall` = 1, `passengerID` = :passengerID + WHERE `id` = :id"; + + $updateStmt = $con->prepare($updateSql); + $updateStmt->bindParam(':id', $invite['id'], PDO::PARAM_INT); + $updateStmt->bindParam(':passengerID', $passengerID); + $updateStmt->execute(); + + if ($updateStmt->rowCount() > 0) { + jsonSuccess(null, "Invite code successfully used and marked as installed."); + } else { + jsonError("Invite found but update failed."); + } + } else { + jsonError("Invalid invite code, already used, or marked as gift."); + } +} catch (PDOException $e) { + jsonError("Database error: " . $e->getMessage()); +} +?> \ No newline at end of file diff --git a/backend/ride/kazan/add.php b/backend/ride/kazan/add.php new file mode 100755 index 0000000..da205b5 --- /dev/null +++ b/backend/ride/kazan/add.php @@ -0,0 +1,45 @@ +prepare($sql); + +// Bind the parameters to the SQL query +$stmt->bindParam(':kazan', $kazan); +$stmt->bindParam(':comfortPrice', $comfortPrice); +$stmt->bindParam(':speedPrice', $speedPrice); +$stmt->bindParam(':deliveryPrice', $deliveryPrice); +$stmt->bindParam(':freePrice', $freePrice); +$stmt->bindParam(':latePrice', $latePrice); +$stmt->bindParam(':heavyPrice', $heavyPrice); +$stmt->bindParam(':adminId', $adminId); +$stmt->bindParam(':naturePrice', $naturePrice); +$stmt->bindParam(':country', $country); +$stmt->bindParam(':fuelPrice', $fuelPrice); + +// Execute the statement +if ($stmt->execute()) { + // Print a success message + jsonSuccess(null, "Kazan saved successfully"); +} else { + // Print a failure message + jsonError("Failed to save Kazan"); +} + +// Close the statement +$stmt->close(); +?> diff --git a/backend/ride/kazan/delete.php b/backend/ride/kazan/delete.php new file mode 100644 index 0000000..e69de29 diff --git a/backend/ride/kazan/error_log b/backend/ride/kazan/error_log new file mode 100644 index 0000000..e69de29 diff --git a/backend/ride/kazan/get.php b/backend/ride/kazan/get.php new file mode 100644 index 0000000..d46ab22 --- /dev/null +++ b/backend/ride/kazan/get.php @@ -0,0 +1,23 @@ +prepare($sql); + $stmt->bindParam(':country', $country, PDO::PARAM_STR); +} else { + $sql = "SELECT * FROM `kazan` ORDER BY id DESC"; + $stmt = $con->prepare($sql); +} + +$stmt->execute(); +$row = $stmt->fetchAll(PDO::FETCH_ASSOC); + +if ($row) { + jsonSuccess($row); +} else { + jsonSuccess([], "No Kazan record found"); +} +?> \ No newline at end of file diff --git a/backend/ride/kazan/update.php b/backend/ride/kazan/update.php new file mode 100644 index 0000000..3659fbe --- /dev/null +++ b/backend/ride/kazan/update.php @@ -0,0 +1,46 @@ +prepare($sql); +$stmt->execute($params); + +$userIdToLog = $user_id ?? 'unknown_admin'; + +// تسجيل العملية في السجل دائماً +$auditResult = logAudit($con, $userIdToLog, "تحديث عمولة/أسعار النظام (Kazan)", "kazan", $id, $params); + +$debugLog = "[" . date('Y-m-d H:i:s') . "] Kazan Update Triggered. User: $userIdToLog. Audit Result: " . ($auditResult === true ? 'SUCCESS' : $auditResult) . "\n"; +file_put_contents(__DIR__ . '/audit_debug.txt', $debugLog, FILE_APPEND); + +if ($stmt->rowCount() > 0) { + jsonSuccess(null, "Kazan data updated successfully. Audit: " . ($auditResult === true ? 'OK' : $auditResult)); +} else { + jsonSuccess(null, "Kazan data remains unchanged or updated. Audit: " . ($auditResult === true ? 'OK' : $auditResult)); +} +?> \ No newline at end of file diff --git a/backend/ride/license/add.php b/backend/ride/license/add.php new file mode 100644 index 0000000..4255546 --- /dev/null +++ b/backend/ride/license/add.php @@ -0,0 +1,52 @@ +prepare($sql); +$stmt->bindParam(':driverID', $driverID); +$stmt->bindParam(':name', $name); +$stmt->bindParam(':licenseClass', $licenseClass); +$stmt->bindParam(':documentNo', $documentNo); +$stmt->bindParam(':address', $address); +$stmt->bindParam(':height', $height); +$stmt->bindParam(':postalCode', $postalCode); +$stmt->bindParam(':sex', $sex); +$stmt->bindParam(':stateCode', $stateCode); +$stmt->bindParam(':expireDate', $expireDate); +$stmt->bindParam(':dateOfBirth', $dateOfBirth); +$stmt->execute(); + +if ($stmt->rowCount() > 0) { + // Print a success message + jsonSuccess($message = "Data saved successfully"); +} else { + // Print a failure message + jsonError($message = "Failed to save data"); +} +?> \ No newline at end of file diff --git a/backend/ride/license/delete.php b/backend/ride/license/delete.php new file mode 100644 index 0000000..e69de29 diff --git a/backend/ride/license/error_log b/backend/ride/license/error_log new file mode 100644 index 0000000..e69de29 diff --git a/backend/ride/license/get.php b/backend/ride/license/get.php new file mode 100644 index 0000000..28a0bf0 --- /dev/null +++ b/backend/ride/license/get.php @@ -0,0 +1,22 @@ +prepare($sql); +$stmt->execute(); +$result = $stmt->fetchAll(PDO::FETCH_ASSOC); + +if ($result) { + // Print all promo records + jsonSuccess($result); +} else { + // Print a failure message + jsonError($message = "Failed to retrieve promo records"); + +} +?> \ No newline at end of file diff --git a/backend/ride/license/update.php b/backend/ride/license/update.php new file mode 100644 index 0000000..e69de29 diff --git a/backend/ride/location/add.php b/backend/ride/location/add.php new file mode 100755 index 0000000..f965387 --- /dev/null +++ b/backend/ride/location/add.php @@ -0,0 +1,73 @@ + 99999999.99) { $dist = 99999999.99; } + if ($dist < -99999999.99){ $dist = -99999999.99; } + + if (empty($driver_id) || ($lat == 0.0 && $lng == 0.0)) { + jsonError("Invalid payload"); + exit; + } + + $created_at = date("Y-m-d H:i:s"); + + $sql = "INSERT INTO `car_tracks` + (`driver_id`,`latitude`,`longitude`,`heading`,`speed`,`distance`,`status`,`created_at`) + VALUES + (:driver_id,:latitude,:longitude,:heading,:speed,:distance,:status,:created_at)"; + + $stmt = $con->prepare($sql); + $ok = $stmt->execute([ + ':driver_id' => $driver_id, + ':latitude' => $lat, + ':longitude' => $lng, + ':heading' => $head, + ':speed' => $spd, + ':distance' => $dist, // ← now DECIMAL(10,2)-friendly + ':status' => (string)($status ?? 'on'), + ':created_at' => $created_at, + ]); + + if ($ok) { + jsonSuccess(null, "car_tracks saved successfully"); + } else { + jsonError("Failed to save car track"); + } +} catch (PDOException $e) { + error_log("car_tracks insert error: " . $e->getMessage()); + jsonError("Database error"); +} catch (Throwable $e) { + error_log("car_tracks insert fatal: " . $e->getMessage()); + jsonError("Server error"); +} \ No newline at end of file diff --git a/backend/ride/location/addpassengerLocation.php b/backend/ride/location/addpassengerLocation.php new file mode 100755 index 0000000..e2c403d --- /dev/null +++ b/backend/ride/location/addpassengerLocation.php @@ -0,0 +1,34 @@ +prepare($sql); + +// Bind the parameters to the SQL query +$stmt->bindParam(':passengerId', $passengerId); +$stmt->bindParam(':lat', $lat); +$stmt->bindParam(':lng', $lng); +$stmt->bindParam(':rideId', $rideId); + +// Execute the statement +if ($stmt->execute()) { + // Print a success message + jsonSuccess(null, "Passenger location saved successfully"); +} else { + // Print a failure message + jsonError("Failed to save passenger location"); +} +?> diff --git a/backend/ride/location/delete.php b/backend/ride/location/delete.php new file mode 100644 index 0000000..78d7017 --- /dev/null +++ b/backend/ride/location/delete.php @@ -0,0 +1,20 @@ +prepare($sql); +$stmt->execute([':driver_id' => $driver_id]); + +if ($stmt->rowCount() > 0) { + // Print a success message + jsonSuccess($message = "Car location deleted successfully"); +} else { + // Print a failure message + jsonError($message = "Failed to delete car location"); +} + +?> \ No newline at end of file diff --git a/backend/ride/location/driversTime.html b/backend/ride/location/driversTime.html new file mode 100755 index 0000000..5b399b1 --- /dev/null +++ b/backend/ride/location/driversTime.html @@ -0,0 +1,341 @@ + + + + + + متابعة السائقين - انطلق + + + + + + + + + +
+
+
+

+ + لوحة متابعة السائقين +

+

+ + توقيت آخر تحديث للبيانات: + جاري التحميل... +

+
+ +
+ +
+
+
+ +
+
+

جاري جلب ملف البيانات (active_drivers_cache.json)...

+
+ + + + + + + + \ No newline at end of file diff --git a/backend/ride/location/get.php b/backend/ride/location/get.php new file mode 100755 index 0000000..ad9b599 --- /dev/null +++ b/backend/ride/location/get.php @@ -0,0 +1,188 @@ + $lat, + 'lng' => $lng, + 'radius' => 5, // 5 كم كافية للعرض + 'limit' => 50 + ])); + curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); + curl_setopt($ch, CURLOPT_TIMEOUT, 3); + curl_setopt($ch, CURLOPT_HTTPHEADER, ["x-internal-key: $INTERNAL_KEY"]); + + $response = curl_exec($ch); + $httpCode = curl_getinfo($ch, CURLINFO_HTTP_CODE); + curl_close($ch); + + $redisDrivers = []; + if ($httpCode == 200 && $response) { + $json = json_decode($response, true); + if (isset($json['status']) && $json['status'] === true) { + $redisDrivers = $json['data']; + } + } + + if (empty($redisDrivers)) { + jsonSuccess([]); + exit; + } + + // تجهيز خريطة لدمج البيانات لاحقاً (ID => RedisData) + $driversMap = []; + $driverIds = []; + foreach ($redisDrivers as $d) { + $driverIds[] = $d['id']; + $driversMap[$d['id']] = $d; + } + + // ========================================== + // 3. جلب التفاصيل الكاملة من MySQL (مثل الملف القديم تماماً) + // ========================================== + + // تجهيز الـ Placeholders + $placeholders = implode(',', array_fill(0, count($driverIds), '?')); + + // الاستعلام الشامل (نفس الحقول القديمة) + $sql_drivers_info = " + SELECT + d.id AS driver_id, + d.phone, d.email, d.birthdate, d.first_name, d.last_name, d.gender, d.maritalStatus, + cr.make, + cr.car_plate, + cr.model, + cr.color, cr.vin, cr.color_hex, + cr.year, + cr.vehicle_category_id, + dt.token, + COALESCE(rdAvg.ratingDriver, 0) AS ratingDriver + FROM driver d + LEFT JOIN CarRegistration cr ON cr.driverID = d.id + LEFT JOIN driverToken dt ON dt.captain_id = d.id + LEFT JOIN ( + SELECT driver_id, AVG(rating) AS ratingDriver + FROM ratingDriver + GROUP BY driver_id + ) rdAvg ON rdAvg.driver_id = d.id + WHERE d.id IN ($placeholders) + AND COALESCE(cr.year, 0) > 2000 + -- AND (cr.make NOT LIKE '%دراج%' AND cr.model NOT LIKE '%دراج%') + "; + + $stmt = $con->prepare($sql_drivers_info); + $stmt->execute($driverIds); + $drivers_db = $stmt->fetchAll(PDO::FETCH_ASSOC); + + if (empty($drivers_db)) { + jsonSuccess([], "No matching drivers in DB"); + exit; + } + + // ========================================== + // 4. معالجة البيانات، الدمج، وفك التشفير + // ========================================== + + $final_result = []; + $serverNow = date('Y-m-d H:i:s'); + $fieldsToDecrypt = ['phone','email','gender','birthdate','first_name','last_name','token','car_plate','vin']; + + // الهاش الخاص بالإناث (لتحديد النوع لاحقاً إذا لزم الأمر) + // $femaleHash = 'bQ6yWJ2EVXKZooHdGclvmFiDlZCM8UYeO+ILFjDUvpQ='; + + foreach ($drivers_db as $row) { + $did = $row['driver_id']; + + // دمج بيانات الموقع الحية من الريدز (أهم خطوة) + if (isset($driversMap[$did])) { + $redisInfo = $driversMap[$did]; + $row['latitude'] = $redisInfo['lat']; + $row['longitude'] = $redisInfo['lng']; + $row['heading'] = $redisInfo['heading']; + $row['speed'] = $redisInfo['speed']; + // $row['distance'] = $redisInfo['distance']; // إذا أردت إضافتها + } else { + // حالة نادرة: السائق موجود في الاستعلام ولكن ليس في مصفوفة الريدز (لا يجب أن تحدث) + continue; + } + + $row['serverNow'] = $serverNow; + + // فك التشفير (Decrypt) + foreach ($fieldsToDecrypt as $field) { + if (isset($row[$field]) && $row[$field] !== null && $row[$field] !== '') { + try { + $row[$field] = $encryptionHelper->decryptData($row[$field]); + } catch (Exception $e) { + $row[$field] = null; + } + } + } + + // حساب العمر + if (!empty($row['birthdate'])) { + try { + $birthdate = new DateTime($row['birthdate']); + $today = new DateTime(); + $row['age'] = $today->diff($birthdate)->y; + } catch (Exception $e) { $row['age'] = null; } + } else { + $row['age'] = null; + } + + // إضافة نوع السيارة البسيط (اختياري، إذا كان التطبيق يعتمد عليه) + /* + $type = 'car'; + if ($row['vehicle_category_id'] == 2) $type = 'bike'; + elseif ($row['gender'] == 'female') $type = 'lady'; // بعد فك التشفير تكون female + $row['type'] = $type; + */ + + $final_result[] = $row; + } + + // إرجاع النتيجة بنفس الهيكل القديم + jsonSuccess($final_result); + +} catch (PDOException $e) { + jsonError("Database error: " . $e->getMessage()); +} catch (Throwable $e) { + jsonError("Internal error: " . $e->getMessage()); +} +?> \ No newline at end of file diff --git a/backend/ride/location/getBalash.php b/backend/ride/location/getBalash.php new file mode 100755 index 0000000..972031a --- /dev/null +++ b/backend/ride/location/getBalash.php @@ -0,0 +1,166 @@ += NOW() - INTERVAL :freshSeconds SECOND + ORDER BY updated_at DESC + LIMIT 20; -- نجلب 100 مرشح محتمل للفلترة والترتيب لاحقاً + "; + + $stmt_locations = $con_tracking->prepare($sql_locations); + $stmt_locations->bindValue(':boundingBox', $boundingBoxWKT); + $stmt_locations->bindValue(':freshSeconds', $freshSeconds, PDO::PARAM_INT); + $stmt_locations->execute(); + $locations = $stmt_locations->fetchAll(PDO::FETCH_ASSOC); + + if (!$locations) { + jsonError("No car locations found in the specified area."); + exit; + } + + // ================================================================= + // الخطوة 2: تجميع معرفات السائقين (driver_id) + // ================================================================= + $driver_ids = array_column($locations, 'driver_id'); + + // ================================================================= + // الخطوة 3: جلب البيانات الثابتة من القاعدة الأساسية وتطبيق الفلاتر الإضافية + // ================================================================= + $drivers_info = []; + if (!empty($driver_ids)) { + $placeholders = implode(',', array_fill(0, count($driver_ids), '?')); + + // هنا نطبق الشروط الخاصة بهذا السكريبت (موديل السيارة < 2000) + $sql_drivers_info = " + SELECT + d.id AS driver_id, d.phone, d.email, d.birthdate, d.first_name, d.last_name, + cr.make, cr.model, cr.color, cr.color_hex, cr.year, + dt.token, + COALESCE(rdAvg.ratingDriver, 0) AS ratingDriver, + COALESCE(rdAvg.ratingCount, 0) AS ratingCount + FROM driver d + LEFT JOIN CarRegistration cr ON cr.driverID = d.id + LEFT JOIN driverToken dt ON dt.captain_id = d.id + LEFT JOIN ( + SELECT driver_id, AVG(rating) AS ratingDriver, COUNT(id) AS ratingCount + FROM ratingDriver + GROUP BY driver_id + ) rdAvg ON rdAvg.driver_id = d.id + WHERE d.id IN ($placeholders) + AND COALESCE(cr.year, 0) < 2000 -- ⭐ الشرط الخاص بهذا السكريبت + AND (cr.make NOT LIKE '%دراج%' AND cr.model NOT LIKE '%دراج%') + AND (cr.model NOT LIKE '%Van%' AND cr.make NOT LIKE '%Van%') + "; + + $stmt_drivers_info = $con->prepare($sql_drivers_info); + $stmt_drivers_info->execute($driver_ids); + $drivers_info_raw = $stmt_drivers_info->fetchAll(PDO::FETCH_ASSOC); + + // تحويل المصفوفة لتسهيل عملية الدمج لاحقاً + foreach ($drivers_info_raw as $driver) { + $drivers_info[$driver['driver_id']] = $driver; + } + } + + // ================================================================= + // الخطوة 4: دمج النتائج في PHP + // ================================================================= + $final_results = []; + foreach ($locations as $location) { + $driver_id = $location['driver_id']; + // ندمج فقط السائقين الذين طابقوا شروطنا في الاستعلام الثاني + if (isset($drivers_info[$driver_id])) { + $final_results[] = array_merge($location, $drivers_info[$driver_id]); + } + } + + // ================================================================= + // الخطوة 5: تطبيق الترتيب والحد النهائي في PHP + // ================================================================= + // الآن بعد أن دمجنا كل البيانات، يمكننا تطبيق الترتيب المعقد + usort($final_results, function ($a, $b) { + // الترتيب الأول: حسب التقييم (تنازلي) + if ($a['ratingDriver'] != $b['ratingDriver']) { + return $b['ratingDriver'] <=> $a['ratingDriver']; + } + // الترتيب الثاني: حسب عدد التقييمات (تنازلي) + if ($a['ratingCount'] != $b['ratingCount']) { + return $b['ratingCount'] <=> $a['ratingCount']; + } + // الترتيب الثالث: حسب حداثة الموقع (تنازلي) + return strtotime($b['updated_at']) <=> strtotime($a['updated_at']); + }); + + // وأخيراً، نأخذ أفضل 5 نتائج فقط + $limited_results = array_slice($final_results, 0, 5); + + if (empty($limited_results)) { + jsonError("No cars matching the specific criteria (year < 2000) found."); + exit; + } + + // ================================================================= + // الخطوة 6: فك التشفير وحساب العمر (بدون تغيير) + // ================================================================= + $fieldsToDecrypt = [ 'phone','email','gender','birthdate', 'first_name','last_name', 'token','car_plate','vin' ]; + foreach ($limited_results as &$row) { + foreach ($fieldsToDecrypt as $field) { + if (isset($row[$field]) && !empty($row[$field])) { + try { $row[$field] = $encryptionHelper->decryptData($row[$field]); } + catch (Exception $e) { $row[$field] = null; } + } + } + if (!empty($row['birthdate'])) { + try { + $birthDate = new DateTime($row['birthdate']); + $today = new DateTime(); + $row['age'] = $today->diff($birthDate)->y; + } catch (Exception $e) { $row['age'] = null; } + } else { + $row['age'] = null; + } + } + unset($row); + + jsonSuccess($limited_results); + +} catch (PDOException $e) { + jsonError("Database error: " . $e->getMessage()); +} catch (Throwable $e) { + jsonError("Internal error: " . $e->getMessage()); +} diff --git a/backend/ride/location/getCarsLocationByPassengerVan.php b/backend/ride/location/getCarsLocationByPassengerVan.php new file mode 100755 index 0000000..479c4af --- /dev/null +++ b/backend/ride/location/getCarsLocationByPassengerVan.php @@ -0,0 +1,160 @@ += NOW() - INTERVAL :freshSeconds SECOND + ORDER BY updated_at DESC + LIMIT 100; -- نجلب 100 مرشح محتمل + "; + + $stmt_locations = $con_tracking->prepare($sql_locations); + $stmt_locations->bindValue(':boundingBox', $boundingBoxWKT); + $stmt_locations->bindValue(':freshSeconds', $freshSeconds, PDO::PARAM_INT); + $stmt_locations->execute(); + $locations = $stmt_locations->fetchAll(PDO::FETCH_ASSOC); + + if (!$locations) { + jsonError("No car locations found in the specified area."); + exit; + } + + // ================================================================= + // الخطوة 2: تجميع معرفات السائقين (driver_id) + // ================================================================= + $driver_ids = array_column($locations, 'driver_id'); + + // ================================================================= + // الخطوة 3: جلب البيانات الثابتة من القاعدة الأساسية وتطبيق الفلاتر الإضافية + // ================================================================= + $drivers_info = []; + if (!empty($driver_ids)) { + $placeholders = implode(',', array_fill(0, count($driver_ids), '?')); + + // هنا نطبق الشروط الخاصة بهذا السكريبت (سيارات كهربائية فقط) + $sql_drivers_info = " + SELECT + d.id AS driver_id, d.phone, d.email, d.birthdate, d.first_name, d.last_name, + cr.make, cr.model, cr.color, cr.color_hex, cr.year, cr.fuel, + dt.token, + COALESCE(rdAvg.ratingDriver, 0) AS ratingDriver, + COALESCE(rdAvg.ratingCount, 0) AS ratingCount + FROM driver d + LEFT JOIN CarRegistration cr ON cr.driverID = d.id + LEFT JOIN driverToken dt ON dt.captain_id = d.id + LEFT JOIN ( + SELECT driver_id, AVG(rating) AS ratingDriver, COUNT(*) AS ratingCount + FROM ratingDriver + GROUP BY driver_id + ) rdAvg ON rdAvg.driver_id = d.id + WHERE d.id IN ($placeholders) + AND cr.make = 'Van'or cr.model='Van' + + "; + + $stmt_drivers_info = $con->prepare($sql_drivers_info); + $stmt_drivers_info->execute($driver_ids); + $drivers_info_raw = $stmt_drivers_info->fetchAll(PDO::FETCH_ASSOC); + + // تحويل المصفوفة لتسهيل عملية الدمج لاحقاً + foreach ($drivers_info_raw as $driver) { + $drivers_info[$driver['driver_id']] = $driver; + } + } + + // ================================================================= + // الخطوة 4: دمج النتائج في PHP + // ================================================================= + $final_results = []; + foreach ($locations as $location) { + $driver_id = $location['driver_id']; + // ندمج فقط السائقين الذين طابقوا شروطنا في الاستعلام الثاني + if (isset($drivers_info[$driver_id])) { + $final_results[] = array_merge($location, $drivers_info[$driver_id]); + } + } + + // ================================================================= + // الخطوة 5: تطبيق الترتيب والحد النهائي في PHP + // ================================================================= + usort($final_results, function ($a, $b) { + if ($a['ratingDriver'] != $b['ratingDriver']) { + return $b['ratingDriver'] <=> $a['ratingDriver']; + } + if ($a['ratingCount'] != $b['ratingCount']) { + return $b['ratingCount'] <=> $a['ratingCount']; + } + return strtotime($b['updated_at']) <=> strtotime($a['updated_at']); + }); + + // وأخيراً، نأخذ أفضل 10 نتائج فقط + $limited_results = array_slice($final_results, 0, 10); + + if (empty($limited_results)) { + jsonError("No electric cars matching the criteria found."); + exit; + } + + // ================================================================= + // الخطوة 6: فك التشفير وحساب العمر (بدون تغيير) + // ================================================================= + $fieldsToDecrypt = [ 'phone','email','gender','birthdate', 'first_name','last_name', 'token','car_plate','vin' ]; + foreach ($limited_results as &$row) { + foreach ($fieldsToDecrypt as $field) { + if (isset($row[$field]) && !empty($row[$field])) { + try { $row[$field] = $encryptionHelper->decryptData($row[$field]); } + catch (Exception $e) { $row[$field] = null; } + } + } + if (!empty($row['birthdate'])) { + try { + $birthDate = new DateTime($row['birthdate']); + $today = new DateTime(); + $row['age'] = $today->diff($birthDate)->y; + } catch (Exception $e) { $row['age'] = null; } + } else { + $row['age'] = null; + } + } + unset($row); + + jsonSuccess($limited_results); + +} catch (PDOException $e) { + jsonError("Database error: " . $e->getMessage()); +} catch (Throwable $e) { + jsonError("Internal error: " . $e->getMessage()); +} diff --git a/backend/ride/location/getComfort.php b/backend/ride/location/getComfort.php new file mode 100755 index 0000000..7a77cf6 --- /dev/null +++ b/backend/ride/location/getComfort.php @@ -0,0 +1,170 @@ += NOW() - INTERVAL :freshSeconds SECOND + ORDER BY updated_at DESC + LIMIT 100; -- نجلب 100 مرشح محتمل + "; + + $stmt_locations = $con_tracking->prepare($sql_locations); + $stmt_locations->bindValue(':boundingBox', $boundingBoxWKT); + $stmt_locations->bindValue(':freshSeconds', $freshSeconds, PDO::PARAM_INT); + $stmt_locations->execute(); + $locations = $stmt_locations->fetchAll(PDO::FETCH_ASSOC); + + if (!$locations) { + jsonError("No car locations found in the specified area."); + exit; + } + + // ================================================================= + // الخطوة 2: تجميع معرفات السائقين (driver_id) + // ================================================================= + $driver_ids = array_column($locations, 'driver_id'); + + // ================================================================= + // الخطوة 3: جلب البيانات الثابتة من القاعدة الأساسية وتطبيق الفلاتر الإضافية + // ================================================================= + $drivers_info = []; + if (!empty($driver_ids)) { + $placeholders = implode(',', array_fill(0, count($driver_ids), '?')); + + // هنا نطبق الشروط الخاصة بهذا السكريبت (موديل السيارة > 2017) + $sql_drivers_info = " + SELECT + d.id AS driver_id, d.phone, d.email, d.birthdate, d.first_name, d.last_name, + cr.make, cr.model, cr.color, cr.color_hex, cr.year, + dt.token, + COALESCE(rdAvg.ratingDriver, 0) AS ratingDriver, + COALESCE(rdAvg.ratingCount, 0) AS ratingCount + FROM driver d + -- 1. تغيير LEFT JOIN إلى INNER JOIN لضمان عدم جلب سائق إلا إذا كانت بيانات سيارته مطابقة تماماً + INNER JOIN CarRegistration cr ON cr.driverID = d.id + LEFT JOIN driverToken dt ON dt.captain_id = d.id + LEFT JOIN ( + SELECT driver_id, AVG(rating) AS ratingDriver, COUNT(*) AS ratingCount + FROM ratingDriver + GROUP BY driver_id + ) rdAvg ON rdAvg.driver_id = d.id + WHERE d.id IN ($placeholders) + -- 2. الفلترة الصارمة للسنة + AND cr.year IS NOT NULL + AND TRIM(cr.year) != '' + AND CAST(TRIM(cr.year) AS UNSIGNED) > 2017 + + + AND (cr.make NOT LIKE '%دراج%' AND cr.model NOT LIKE '%دراج%') + AND (cr.model NOT LIKE '%Van%' AND cr.make NOT LIKE '%Van%') + "; + $stmt_drivers_info = $con->prepare($sql_drivers_info); + $stmt_drivers_info->execute($driver_ids); + $drivers_info_raw = $stmt_drivers_info->fetchAll(PDO::FETCH_ASSOC); + + // تحويل المصفوفة لتسهيل عملية الدمج لاحقاً + foreach ($drivers_info_raw as $driver) { + $drivers_info[$driver['driver_id']] = $driver; + } + } + + // ================================================================= + // الخطوة 4: دمج النتائج في PHP + // ================================================================= + $final_results = []; + foreach ($locations as $location) { + $driver_id = $location['driver_id']; + // ندمج فقط السائقين الذين طابقوا شروطنا في الاستعلام الثاني + if (isset($drivers_info[$driver_id])) { + $final_results[] = array_merge($location, $drivers_info[$driver_id]); + } + } + + // ================================================================= + // الخطوة 5: تطبيق الترتيب والحد النهائي في PHP + // ================================================================= + // الآن بعد أن دمجنا كل البيانات، يمكننا تطبيق الترتيب المعقد + usort($final_results, function ($a, $b) { + // الترتيب الأول: حسب التقييم (تنازلي) + if ($a['ratingDriver'] != $b['ratingDriver']) { + return $b['ratingDriver'] <=> $a['ratingDriver']; + } + // الترتيب الثاني: حسب عدد التقييمات (تنازلي) + if ($a['ratingCount'] != $b['ratingCount']) { + return $b['ratingCount'] <=> $a['ratingCount']; + } + // الترتيب الثالث: حسب حداثة الموقع (تنازلي) + return strtotime($b['updated_at']) <=> strtotime($a['updated_at']); + }); + + // وأخيراً، نأخذ أفضل 5 نتائج فقط + $limited_results = array_slice($final_results, 0, 5); + + if (empty($limited_results)) { + jsonError("No cars matching the specific criteria (year > 2017) found."); + exit; + } + + // ================================================================= + // الخطوة 6: فك التشفير وحساب العمر (بدون تغيير) + // ================================================================= + $fieldsToDecrypt = [ 'phone','email','gender','birthdate', 'first_name','last_name', 'token','car_plate','vin' ]; + foreach ($limited_results as &$row) { + foreach ($fieldsToDecrypt as $field) { + if (isset($row[$field]) && !empty($row[$field])) { + try { $row[$field] = $encryptionHelper->decryptData($row[$field]); } + catch (Exception $e) { $row[$field] = null; } + } + } + if (!empty($row['birthdate'])) { + try { + $birthDate = new DateTime($row['birthdate']); + $today = new DateTime(); + $row['age'] = $today->diff($birthDate)->y; + } catch (Exception $e) { $row['age'] = null; } + } else { + $row['age'] = null; + } + } + unset($row); + + jsonSuccess($limited_results); + +} catch (PDOException $e) { + jsonError("Database error: " . $e->getMessage()); +} catch (Throwable $e) { + jsonError("Internal error: " . $e->getMessage()); +} diff --git a/backend/ride/location/getDelivery.php b/backend/ride/location/getDelivery.php new file mode 100755 index 0000000..aa82ac3 --- /dev/null +++ b/backend/ride/location/getDelivery.php @@ -0,0 +1,159 @@ += NOW() - INTERVAL :freshSeconds SECOND + ORDER BY updated_at DESC + LIMIT 100; -- نجلب 100 مرشح محتمل + "; + + $stmt_locations = $con_tracking->prepare($sql_locations); + $stmt_locations->bindValue(':boundingBox', $boundingBoxWKT); + $stmt_locations->bindValue(':freshSeconds', $freshSeconds, PDO::PARAM_INT); + $stmt_locations->execute(); + $locations = $stmt_locations->fetchAll(PDO::FETCH_ASSOC); + + if (!$locations) { + jsonError("No car locations found in the specified area."); + exit; + } + + // ================================================================= + // الخطوة 2: تجميع معرفات السائقين (driver_id) + // ================================================================= + $driver_ids = array_column($locations, 'driver_id'); + + // ================================================================= + // الخطوة 3: جلب البيانات الثابتة من القاعدة الأساسية وتطبيق الفلاتر الإضافية + // ================================================================= + $drivers_info = []; + if (!empty($driver_ids)) { + $placeholders = implode(',', array_fill(0, count($driver_ids), '?')); + + // هنا نطبق الشروط الخاصة بهذا السكريبت (دراجات فقط) + $sql_drivers_info = " + SELECT + d.id AS driver_id, d.phone, d.email, d.birthdate, d.first_name, d.last_name, + cr.make, cr.model, cr.color, cr.color_hex, cr.year, + dt.token, + COALESCE(rdAvg.ratingDriver, 0) AS ratingDriver, + COALESCE(rdAvg.ratingCount, 0) AS ratingCount + FROM driver d + LEFT JOIN CarRegistration cr ON cr.driverID = d.id + LEFT JOIN driverToken dt ON dt.captain_id = d.id + LEFT JOIN ( + SELECT driver_id, AVG(rating) AS ratingDriver, COUNT(*) AS ratingCount + FROM ratingDriver + GROUP BY driver_id + ) rdAvg ON rdAvg.driver_id = d.id + WHERE d.id IN ($placeholders) + AND (cr.make LIKE '%دراج%' OR cr.model LIKE '%دراج%') -- ⭐ الشرط الخاص بهذا السكريبت + "; + + $stmt_drivers_info = $con->prepare($sql_drivers_info); + $stmt_drivers_info->execute($driver_ids); + $drivers_info_raw = $stmt_drivers_info->fetchAll(PDO::FETCH_ASSOC); + + // تحويل المصفوفة لتسهيل عملية الدمج لاحقاً + foreach ($drivers_info_raw as $driver) { + $drivers_info[$driver['driver_id']] = $driver; + } + } + + // ================================================================= + // الخطوة 4: دمج النتائج في PHP + // ================================================================= + $final_results = []; + foreach ($locations as $location) { + $driver_id = $location['driver_id']; + // ندمج فقط السائقين الذين طابقوا شروطنا في الاستعلام الثاني + if (isset($drivers_info[$driver_id])) { + $final_results[] = array_merge($location, $drivers_info[$driver_id]); + } + } + + // ================================================================= + // الخطوة 5: تطبيق الترتيب والحد النهائي في PHP + // ================================================================= + usort($final_results, function ($a, $b) { + if ($a['ratingDriver'] != $b['ratingDriver']) { + return $b['ratingDriver'] <=> $a['ratingDriver']; + } + if ($a['ratingCount'] != $b['ratingCount']) { + return $b['ratingCount'] <=> $a['ratingCount']; + } + return strtotime($b['updated_at']) <=> strtotime($a['updated_at']); + }); + + // وأخيراً، نأخذ أفضل 10 نتائج فقط + $limited_results = array_slice($final_results, 0, 10); + + if (empty($limited_results)) { + jsonError("No motorcycles matching the criteria found."); + exit; + } + + // ================================================================= + // الخطوة 6: فك التشفير وحساب العمر (بدون تغيير) + // ================================================================= + $fieldsToDecrypt = [ 'phone','email','gender','birthdate', 'first_name','last_name','maritalStatus', 'token','make','car_plate','vin' ]; + foreach ($limited_results as &$row) { + foreach ($fieldsToDecrypt as $field) { + if (isset($row[$field]) && !empty($row[$field])) { + try { $row[$field] = $encryptionHelper->decryptData($row[$field]); } + catch (Exception $e) { $row[$field] = null; } + } + } + if (!empty($row['birthdate'])) { + try { + $birthDate = new DateTime($row['birthdate']); + $today = new DateTime(); + $row['age'] = $today->diff($birthDate)->y; + } catch (Exception $e) { $row['age'] = null; } + } else { + $row['age'] = null; + } + } + unset($row); + + jsonSuccess($limited_results); + +} catch (PDOException $e) { + jsonError("Database error: " . $e->getMessage()); +} catch (Throwable $e) { + jsonError("Internal error: " . $e->getMessage()); +} diff --git a/backend/ride/location/getDriverCarsLocationToPassengerAfterApplied.php b/backend/ride/location/getDriverCarsLocationToPassengerAfterApplied.php new file mode 100644 index 0000000..6e9572c --- /dev/null +++ b/backend/ride/location/getDriverCarsLocationToPassengerAfterApplied.php @@ -0,0 +1,94 @@ + يتصل بقاعدة البيانات الأساسية (driver, CarRegistration) +// $con_tracking -> يتصل بقاعدة بيانات التتبع (car_locations) +// وأنه يحتوي على كائن التشفير $encryptionHelper +require_once __DIR__ . '/../../connect.php'; + +try { + $con_tracking = Database::get('tracking'); + // $con = Database::get('main'); // Add this just in case as well, to be safe. + + $driver_id = filterRequest("driver_id"); + + if ($driver_id === false || empty($driver_id)) { + jsonError("Invalid driver_id provided"); + exit; + } + + // ================================================================= + // الخطوة 1: جلب آخر موقع للسائق من قاعدة بيانات التتبع + // ================================================================= + $sql_location = "SELECT + driver_id, + latitude, + longitude, + heading, + speed, + status, + created_at, + updated_at + FROM + car_locations + WHERE + driver_id = ? + ORDER BY + updated_at DESC + LIMIT 1"; + + $stmt_location = $con_tracking->prepare($sql_location); + $stmt_location->execute([$driver_id]); + $location_data = $stmt_location->fetch(PDO::FETCH_ASSOC); + + // إذا لم نجد أي موقع، لا داعي لإكمال البحث + if (empty($location_data)) { + jsonError("No car locations found"); + exit; + } + + // ================================================================= + // الخطوة 2: جلب البيانات الثابتة للسائق من القاعدة الأساسية + // ================================================================= + $sql_driver_info = "SELECT + d.gender, + cr.model + FROM + driver d + LEFT JOIN CarRegistration cr ON d.id = cr.driverID + WHERE + d.id = ?"; + + $stmt_driver_info = $con->prepare($sql_driver_info); + $stmt_driver_info->execute([$driver_id]); + // نستخدم fetch وليس fetchAll لأننا نتوقع سائق واحد فقط + $driver_info = $stmt_driver_info->fetch(PDO::FETCH_ASSOC); + + // ================================================================= + // الخطوة 2.5: فك تشفير الجندر (New Step) + // ================================================================= + if (!empty($driver_info)) { + // التحقق من وجود قيمة في حقل الجندر قبل فك تشفيرها + if (isset($driver_info['gender']) && !empty($driver_info['gender'])) { + $driver_info['gender'] = $encryptionHelper->decryptData($driver_info['gender']); + } + } else { + $driver_info = []; // اجعله مصفوفة فارغة لتجنب خطأ في الدمج + } + + // ================================================================= + // الخطوة 3: دمج النتائج (Application-Side Join) + // ================================================================= + + // دمج بيانات الموقع مع بيانات السائق (التي تم فك تشفيرها الآن) + $final_result = array_merge($location_data, $driver_info); + + // إرجاع النتيجة داخل مصفوفة كما في السكربت الأصلي + jsonSuccess([$final_result]); + + +} catch (PDOException $e) { + jsonError("Database error: " . $e->getMessage()); +} catch (Throwable $e) { + jsonError("Internal error: " . $e->getMessage()); +} +?> \ No newline at end of file diff --git a/backend/ride/location/getDriverTimeOnline.php b/backend/ride/location/getDriverTimeOnline.php new file mode 100755 index 0000000..169641a --- /dev/null +++ b/backend/ride/location/getDriverTimeOnline.php @@ -0,0 +1,130 @@ += DATE_SUB(CURDATE(), INTERVAL ? DAY) + GROUP BY driver_id + HAVING grand_total_seconds > 60 -- (اختياري) تجاهل من عمل أقل من دقيقة + ORDER BY grand_total_seconds DESC + "; + + $stmt = $con_tracking->prepare($sql_summary); + $stmt->execute([$daysToLookBack]); + $summary_data = $stmt->fetchAll(PDO::FETCH_ASSOC); + + if (empty($summary_data)) { + // حفظ ملف فارغ وإنهاء + saveJsonFile($savePath, ["last_updated" => date('Y-m-d H:i:s'), "data" => []]); + printSuccess("No active drivers found in summary.", $savePath); + exit; + } + + // ================================================================= + // 2. جلب تفاصيل السائقين (الأسماء) من السيرفر الرئيسي 📝 + // ================================================================= + + // استخراج الـ IDs + $driver_ids = array_column($summary_data, 'driver_id'); + + // تجهيز الـ Placeholders (?,?,?) + $placeholders = implode(',', array_fill(0, count($driver_ids), '?')); + + $sql_drivers = "SELECT id, name_arabic, phone, created_at FROM driver WHERE id IN ($placeholders)"; + + $stmt_d = $con->prepare($sql_drivers); + $stmt_d->execute($driver_ids); + $drivers_raw = $stmt_d->fetchAll(PDO::FETCH_ASSOC); + + // تحويل البيانات لـ Map لسرعة الدمج: [id => data] + $drivers_map = []; + foreach ($drivers_raw as $d) { + $drivers_map[$d['id']] = $d; + } + + // ================================================================= + // 3. دمج البيانات وفك التشفير وتنسيق الوقت 🔄 + // ================================================================= + + $final_report = []; + $fieldsToDecrypt = ['phone', 'name_arabic']; // الحقول المشفرة + + foreach ($summary_data as $row) { + $did = $row['driver_id']; + $seconds = $row['grand_total_seconds']; + + // البيانات الشخصية + $personalData = isset($drivers_map[$did]) ? $drivers_map[$did] : ['name_arabic' => 'Unknown', 'phone' => '']; + + // فك التشفير + foreach ($fieldsToDecrypt as $field) { + if (!empty($personalData[$field])) { + try { + $personalData[$field] = $encryptionHelper->decryptData($personalData[$field]); + } catch (Exception $e) { + // ابقها مشفرة أو ضع قيمة افتراضية عند الفشل + } + } + } + + // تنسيق الوقت (مقروء للبشر) + $hours = floor($seconds / 3600); + $minutes = floor(($seconds % 3600) / 60); + $human_time = sprintf("%d ساعة و %d دقيقة", $hours, $minutes); + + // بناء الصف النهائي + $final_report[] = [ + 'driver_id' => $did, + 'name' => $personalData['name_arabic'], + 'phone' => $personalData['phone'], + 'join_date' => $personalData['created_at'], // تاريخ انضمام السائق + 'total_seconds' => $seconds, + 'active_time' => $human_time, + 'days_active' => $row['days_worked'] // عدد الأيام التي عمل فيها خلال الـ 10 أيام + ]; + } + + // ================================================================= + // 4. الحفظ والنشر 💾 + // ================================================================= + + $output = [ + "last_updated" => date('Y-m-d H:i:s'), + "period_days" => $daysToLookBack, + "total_drivers" => count($final_report), + "data" => $final_report + ]; + + saveJsonFile($savePath, $output); + printSuccess("Report generated based on Daily Summary.", $savePath); + +} catch (Exception $e) { + jsonError("Error: " . $e->getMessage()); +} + +// --- دوال مساعدة --- +function saveJsonFile($path, $data) { + $json = json_encode($data, JSON_UNESCAPED_UNICODE | JSON_PRETTY_PRINT); + file_put_contents($path, $json); +} +?> \ No newline at end of file diff --git a/backend/ride/location/getElectric.php b/backend/ride/location/getElectric.php new file mode 100755 index 0000000..eb4bd31 --- /dev/null +++ b/backend/ride/location/getElectric.php @@ -0,0 +1,161 @@ += NOW() - INTERVAL :freshSeconds SECOND + ORDER BY updated_at DESC + LIMIT 100; -- نجلب 100 مرشح محتمل + "; + + $stmt_locations = $con_tracking->prepare($sql_locations); + $stmt_locations->bindValue(':boundingBox', $boundingBoxWKT); + $stmt_locations->bindValue(':freshSeconds', $freshSeconds, PDO::PARAM_INT); + $stmt_locations->execute(); + $locations = $stmt_locations->fetchAll(PDO::FETCH_ASSOC); + + if (!$locations) { + jsonError("No car locations found in the specified area."); + exit; + } + + // ================================================================= + // الخطوة 2: تجميع معرفات السائقين (driver_id) + // ================================================================= + $driver_ids = array_column($locations, 'driver_id'); + + // ================================================================= + // الخطوة 3: جلب البيانات الثابتة من القاعدة الأساسية وتطبيق الفلاتر الإضافية + // ================================================================= + $drivers_info = []; + if (!empty($driver_ids)) { + $placeholders = implode(',', array_fill(0, count($driver_ids), '?')); + + // هنا نطبق الشروط الخاصة بهذا السكريبت (سيارات كهربائية فقط) + $sql_drivers_info = " + SELECT + d.id AS driver_id, d.phone, d.email, d.birthdate, d.first_name, d.last_name, + cr.make, cr.model, cr.color, cr.color_hex, cr.year, cr.fuel, + dt.token, + COALESCE(rdAvg.ratingDriver, 0) AS ratingDriver, + COALESCE(rdAvg.ratingCount, 0) AS ratingCount + FROM driver d + LEFT JOIN CarRegistration cr ON cr.driverID = d.id + LEFT JOIN driverToken dt ON dt.captain_id = d.id + LEFT JOIN ( + SELECT driver_id, AVG(rating) AS ratingDriver, COUNT(*) AS ratingCount + FROM ratingDriver + GROUP BY driver_id + ) rdAvg ON rdAvg.driver_id = d.id + WHERE d.id IN ($placeholders) + AND cr.fuel = 'كهربائي' + AND (cr.make NOT LIKE '%دراج%' AND cr.model NOT LIKE '%دراج%') + AND (cr.model NOT LIKE '%Van%' AND cr.make NOT LIKE '%Van%') + "; + + $stmt_drivers_info = $con->prepare($sql_drivers_info); + $stmt_drivers_info->execute($driver_ids); + $drivers_info_raw = $stmt_drivers_info->fetchAll(PDO::FETCH_ASSOC); + + // تحويل المصفوفة لتسهيل عملية الدمج لاحقاً + foreach ($drivers_info_raw as $driver) { + $drivers_info[$driver['driver_id']] = $driver; + } + } + + // ================================================================= + // الخطوة 4: دمج النتائج في PHP + // ================================================================= + $final_results = []; + foreach ($locations as $location) { + $driver_id = $location['driver_id']; + // ندمج فقط السائقين الذين طابقوا شروطنا في الاستعلام الثاني + if (isset($drivers_info[$driver_id])) { + $final_results[] = array_merge($location, $drivers_info[$driver_id]); + } + } + + // ================================================================= + // الخطوة 5: تطبيق الترتيب والحد النهائي في PHP + // ================================================================= + usort($final_results, function ($a, $b) { + if ($a['ratingDriver'] != $b['ratingDriver']) { + return $b['ratingDriver'] <=> $a['ratingDriver']; + } + if ($a['ratingCount'] != $b['ratingCount']) { + return $b['ratingCount'] <=> $a['ratingCount']; + } + return strtotime($b['updated_at']) <=> strtotime($a['updated_at']); + }); + + // وأخيراً، نأخذ أفضل 10 نتائج فقط + $limited_results = array_slice($final_results, 0, 10); + + if (empty($limited_results)) { + jsonError("No electric cars matching the criteria found."); + exit; + } + + // ================================================================= + // الخطوة 6: فك التشفير وحساب العمر (بدون تغيير) + // ================================================================= + $fieldsToDecrypt = [ 'phone','email','gender','birthdate', 'first_name','last_name', 'token','car_plate','vin' ]; + foreach ($limited_results as &$row) { + foreach ($fieldsToDecrypt as $field) { + if (isset($row[$field]) && !empty($row[$field])) { + try { $row[$field] = $encryptionHelper->decryptData($row[$field]); } + catch (Exception $e) { $row[$field] = null; } + } + } + if (!empty($row['birthdate'])) { + try { + $birthDate = new DateTime($row['birthdate']); + $today = new DateTime(); + $row['age'] = $today->diff($birthDate)->y; + } catch (Exception $e) { $row['age'] = null; } + } else { + $row['age'] = null; + } + } + unset($row); + + jsonSuccess($limited_results); + +} catch (PDOException $e) { + jsonError("Database error: " . $e->getMessage()); +} catch (Throwable $e) { + jsonError("Internal error: " . $e->getMessage()); +} diff --git a/backend/ride/location/getFemalDriver.php b/backend/ride/location/getFemalDriver.php new file mode 100755 index 0000000..c7756ea --- /dev/null +++ b/backend/ride/location/getFemalDriver.php @@ -0,0 +1,160 @@ += NOW() - INTERVAL :freshSeconds SECOND + ORDER BY updated_at DESC + LIMIT 100; -- نجلب 100 مرشح محتمل + "; + + $stmt_locations = $con_tracking->prepare($sql_locations); + $stmt_locations->bindValue(':boundingBox', $boundingBoxWKT); + $stmt_locations->bindValue(':freshSeconds', $freshSeconds, PDO::PARAM_INT); + $stmt_locations->execute(); + $locations = $stmt_locations->fetchAll(PDO::FETCH_ASSOC); + + if (!$locations) { + jsonError("No car locations found in the specified area."); + exit; + } + + // ================================================================= + // الخطوة 2: تجميع معرفات السائقين (driver_id) + // ================================================================= + $driver_ids = array_column($locations, 'driver_id'); + + // ================================================================= + // الخطوة 3: جلب البيانات الثابتة من القاعدة الأساسية وتطبيق الفلاتر الإضافية + // ================================================================= + $drivers_info = []; + if (!empty($driver_ids)) { + $placeholders = implode(',', array_fill(0, count($driver_ids), '?')); + + // هنا نطبق الشروط الخاصة بهذا السكريبت (سائقات إناث فقط) + $sql_drivers_info = " + SELECT + d.id AS driver_id, d.phone, d.email, d.birthdate, d.first_name, d.last_name, d.gender, d.maritalStatus, + cr.make, cr.model, cr.color, cr.color_hex, cr.year, + dt.token, + COALESCE(AVG(rd.rating), 0) AS ratingDriver, + COUNT(rd.id) AS ratingCount + FROM driver d + LEFT JOIN CarRegistration cr ON cr.driverID = d.id + LEFT JOIN driverToken dt ON dt.captain_id = d.id + LEFT JOIN ratingDriver rd ON rd.driver_id = d.id + WHERE d.id IN ($placeholders) + AND d.gender = 'Female' -- ⭐ الشرط الخاص بهذا السكريبت + AND (cr.make NOT LIKE '%دراجة%' AND cr.model NOT LIKE '%دراجة%') + AND (cr.model NOT LIKE '%Van%' AND cr.make NOT LIKE '%Van%') + GROUP BY d.id -- تجميع النتائج حسب السائق لحساب التقييم بشكل صحيح + "; + + $stmt_drivers_info = $con->prepare($sql_drivers_info); + $stmt_drivers_info->execute($driver_ids); + $drivers_info_raw = $stmt_drivers_info->fetchAll(PDO::FETCH_ASSOC); + + // تحويل المصفوفة لتسهيل عملية الدمج لاحقاً + foreach ($drivers_info_raw as $driver) { + $drivers_info[$driver['driver_id']] = $driver; + } + } + + // ================================================================= + // الخطوة 4: دمج النتائج في PHP + // ================================================================= + $final_results = []; + foreach ($locations as $location) { + $driver_id = $location['driver_id']; + // ندمج فقط السائقين الذين طابقوا شروطنا في الاستعلام الثاني (أنثى) + if (isset($drivers_info[$driver_id])) { + $final_results[] = array_merge($location, $drivers_info[$driver_id]); + } + } + + // ================================================================= + // الخطوة 5: تطبيق الترتيب والحد النهائي في PHP + // ================================================================= + usort($final_results, function ($a, $b) { + if ($a['ratingDriver'] != $b['ratingDriver']) { + return $b['ratingDriver'] <=> $a['ratingDriver']; + } + if ($a['ratingCount'] != $b['ratingCount']) { + return $b['ratingCount'] <=> $a['ratingCount']; + } + return strtotime($b['updated_at']) <=> strtotime($a['updated_at']); + }); + + // وأخيراً، نأخذ أفضل 10 نتائج فقط + $limited_results = array_slice($final_results, 0, 10); + + if (empty($limited_results)) { + jsonError("No female drivers matching the criteria found."); + exit; + } + + // ================================================================= + // الخطوة 6: فك التشفير وحساب العمر (بدون تغيير) + // ================================================================= + $fieldsToDecrypt = [ 'phone','email','gender','birthdate', 'first_name','last_name', 'token','car_plate','vin' ]; + foreach ($limited_results as &$row) { + foreach ($fieldsToDecrypt as $field) { + if (isset($row[$field]) && !empty($row[$field])) { + try { $row[$field] = $encryptionHelper->decryptData($row[ + $field]); } + catch (Exception $e) { $row[$field] = null; } + } + } + if (!empty($row['birthdate'])) { + try { + $birthDate = new DateTime($row['birthdate']); + $today = new DateTime(); + $row['age'] = $today->diff($birthDate)->y; + } catch (Exception $e) { $row['age'] = null; } + } else { + $row['age'] = null; + } + } + unset($row); + + jsonSuccess($limited_results); + +} catch (PDOException $e) { + jsonError("Database error: " . $e->getMessage()); +} catch (Throwable $e) { + jsonError("Internal error: " . $e->getMessage()); +} diff --git a/backend/ride/location/getLatestLocationPassenger.php b/backend/ride/location/getLatestLocationPassenger.php new file mode 100644 index 0000000..3a225a5 --- /dev/null +++ b/backend/ride/location/getLatestLocationPassenger.php @@ -0,0 +1,29 @@ +prepare($sql); +$stmt->execute([':rideId' => $rideId]); +$car_locations = $stmt->fetchAll(PDO::FETCH_ASSOC); + +if ($car_locations) { + // Print the car location data as JSON + jsonSuccess($data = $car_locations); +} else { + // Print a failure message + jsonError($message = "No car locations found"); +} + +?> \ No newline at end of file diff --git a/backend/ride/location/getLocationParents.php b/backend/ride/location/getLocationParents.php new file mode 100644 index 0000000..46ad58a --- /dev/null +++ b/backend/ride/location/getLocationParents.php @@ -0,0 +1,88 @@ + يتصل بقاعدة البيانات الأساسية (driver, CarRegistration) +// $con_tracking -> يتصل بقاعدة بيانات التتبع (car_locations) +require_once __DIR__ . '/../../connect.php'; + +try { + $driver_id = filterRequest("driver_id"); + + if ($driver_id === false || empty($driver_id)) { + jsonError("Invalid driver_id provided"); + exit; + } + + // ================================================================= + // الخطوة 1: جلب آخر موقع للسائق من قاعدة بيانات التتبع + // ================================================================= + // هذا الاستعلام يعمل على قاعدة بيانات التتبع السريعة + // (ملاحظة: تم التغيير إلى ORDER BY updated_at لجلب آخر تحديث) + $sql_location = "SELECT + id, + driver_id, + latitude, + longitude, + heading, + speed, + status, + created_at, + updated_at + FROM + car_locations + WHERE + driver_id = ? + ORDER BY + updated_at DESC + LIMIT 1"; + + $stmt_location = $con_tracking->prepare($sql_location); + $stmt_location->execute([$driver_id]); + $location_data = $stmt_location->fetch(PDO::FETCH_ASSOC); + + // إذا لم نجد أي موقع، لا داعي لإكمال البحث + if (empty($location_data)) { + jsonError("No car locations found"); + exit; + } + + // ================================================================= + // الخطوة 2: جلب البيانات الثابتة للسائق من القاعدة الأساسية + // ================================================================= + // هذا الاستعلام يعمل على قاعدة البيانات الأساسية الهادئة + // (ملاحظة: تم إصلاح الخطأ في جملة JOIN) + $sql_driver_info = "SELECT + d.gender, + cr.model + FROM + driver d + LEFT JOIN CarRegistration cr ON d.id = cr.driverID + WHERE + d.id = ?"; + + $stmt_driver_info = $con->prepare($sql_driver_info); + $stmt_driver_info->execute([$driver_id]); + $driver_info = $stmt_driver_info->fetch(PDO::FETCH_ASSOC); + + // ================================================================= + // الخطوة 3: دمج النتائج (Application-Side Join) + // ================================================================= + + // دمج بيانات الموقع مع بيانات السائق + if (empty($driver_info)) { + $driver_info = []; // اجعله مصفوفة فارغة لتجنب خطأ في الدمج + } + + $final_result = array_merge($location_data, $driver_info); + + // السكربت الأصلي كان يستخدم fetchAll، لذا كان يرجع مصفوفة بداخلها عنصر واحد + // [ [ ... بيانات ... ] ] + // سنحافظ على نفس البنية لإرجاع البيانات + jsonSuccess([$final_result]); + + +} catch (PDOException $e) { + jsonError("Database error: " . $e->getMessage()); +} catch (Throwable $e) { + jsonError("Internal error: " . $e->getMessage()); +} +?> \ No newline at end of file diff --git a/backend/ride/location/getPinkBike.php b/backend/ride/location/getPinkBike.php new file mode 100755 index 0000000..2897451 --- /dev/null +++ b/backend/ride/location/getPinkBike.php @@ -0,0 +1,112 @@ += NOW() - INTERVAL 5 SECOND + AND (cr.make LIKE '%دراجة%' OR cr.model LIKE '%دراجة%') + GROUP BY cl.driver_id + ORDER BY ratingDriver DESC, cl.updated_at DESC + LIMIT 10; + "; + + $stmt = $con->prepare($sql); + $stmt->bindParam(':southwestLat', $southwestLat); + $stmt->bindParam(':southwestLon', $southwestLon); + $stmt->bindParam(':northeastLat', $northeastLat); + $stmt->bindParam(':northeastLon', $northeastLon); + $stmt->execute(); + + $rows = $stmt->fetchAll(PDO::FETCH_ASSOC); + + if ($rows) { + $fieldsToDecrypt = [ + 'phone', 'email', 'gender', 'birthdate', + 'first_name', 'last_name', 'maritalStatus', 'token', + 'make', 'car_plate', 'vin' + ]; + + $filteredRows = []; + + foreach ($rows as &$row) { + foreach ($fieldsToDecrypt as $field) { + if (isset($row[$field])) { + $row[$field] = $encryptionHelper->decryptData($row[$field]); + } + } + + // فلترة حسب الجنس + if (strtolower($row['gender']) !== 'female') { + continue; + } + + // حساب العمر + if (!empty($row['birthdate'])) { + $birthDate = new DateTime($row['birthdate']); + $today = new DateTime(); + $row['age'] = $today->diff($birthDate)->y; + } else { + $row['age'] = null; + } + + $filteredRows[] = $row; + } + + jsonSuccess($filteredRows); + } else { + jsonError("No car locations found"); + } +} catch (PDOException $e) { + jsonError("Database error: " . $e->getMessage()); +} \ No newline at end of file diff --git a/backend/ride/location/getRidesDriverByDay.php b/backend/ride/location/getRidesDriverByDay.php new file mode 100755 index 0000000..81d3f32 --- /dev/null +++ b/backend/ride/location/getRidesDriverByDay.php @@ -0,0 +1,66 @@ += :first_day_total AND `ride`.created_at < :last_day_total AND `ride`.`status` = 'Finished' + ) AS totalPrice, + ( + SELECT + COUNT(`ride`.`id`) + FROM + `ride` + WHERE + `ride`.`driver_id` = :driver_id_count AND `ride`.`created_at` >= :first_day_count AND `ride`.created_at < :last_day_count AND `ride`.`status` = 'Finished' + ) AS totalCount +FROM + `ride` +WHERE + `ride`.`driver_id` = :driver_id_main AND `ride`.`created_at` >= :first_day_main AND `ride`.created_at < :last_day_main AND `ride`.`status` = 'Finished' +GROUP BY + day +ORDER BY + day ASC;"; + +$stmt = $con->prepare($sql); + +// Bind each parameter uniquely +$stmt->bindParam(':driver_id_total', $driver_id, PDO::PARAM_STR); +$stmt->bindParam(':first_day_total', $first_day_of_month, PDO::PARAM_STR); +$stmt->bindParam(':last_day_total', $last_day_of_month, PDO::PARAM_STR); + +$stmt->bindParam(':driver_id_count', $driver_id, PDO::PARAM_STR); +$stmt->bindParam(':first_day_count', $first_day_of_month, PDO::PARAM_STR); +$stmt->bindParam(':last_day_count', $last_day_of_month, PDO::PARAM_STR); + +$stmt->bindParam(':driver_id_main', $driver_id, PDO::PARAM_STR); +$stmt->bindParam(':first_day_main', $first_day_of_month, PDO::PARAM_STR); +$stmt->bindParam(':last_day_main', $last_day_of_month, PDO::PARAM_STR); + +$stmt->execute(); + +$car_locations = $stmt->fetchAll(PDO::FETCH_ASSOC); +if ($car_locations) { + // Print the car location data as JSON + jsonSuccess($data = $car_locations); +} else { + // Print a failure message + jsonError($message = "No car locations found"); +} +?> \ No newline at end of file diff --git a/backend/ride/location/getSpeed.php b/backend/ride/location/getSpeed.php new file mode 100755 index 0000000..720b139 --- /dev/null +++ b/backend/ride/location/getSpeed.php @@ -0,0 +1,157 @@ += NOW() - INTERVAL :freshSeconds SECOND + ORDER BY updated_at DESC + LIMIT 100; -- نجلب 100 مرشح محتمل + "; + + $stmt_locations = $con_tracking->prepare($sql_locations); + $stmt_locations->bindValue(':boundingBox', $boundingBoxWKT); + $stmt_locations->bindValue(':freshSeconds', $freshSeconds, PDO::PARAM_INT); + $stmt_locations->execute(); + $locations = $stmt_locations->fetchAll(PDO::FETCH_ASSOC); + + if (!$locations) { + jsonError("No car locations found in the specified area."); + exit; + } + + // ================================================================= + // الخطوة 2: تجميع معرفات السائقين (driver_id) + // ================================================================= + $driver_ids = array_column($locations, 'driver_id'); + + // ================================================================= + // الخطوة 3: جلب البيانات الثابتة من القاعدة الأساسية وتطبيق الفلاتر الإضافية + // ================================================================= + $drivers_info = []; + if (!empty($driver_ids)) { + $placeholders = implode(',', array_fill(0, count($driver_ids), '?')); + + // هنا نطبق الشروط الخاصة بهذا السكريبت (موديل السيارة > 2000) + $sql_drivers_info = " + SELECT + d.id AS driver_id, d.phone, d.email, d.birthdate, d.first_name, d.last_name, d.gender, d.maritalStatus, + cr.make, cr.model, cr.color, cr.color_hex, cr.year, + dt.token, + COALESCE(rdAvg.ratingDriver, 0) AS ratingDriver, + COALESCE(rdAvg.ratingCount, 0) AS ratingCount + FROM driver d + LEFT JOIN CarRegistration cr ON cr.driverID = d.id + LEFT JOIN driverToken dt ON dt.captain_id = d.id + LEFT JOIN ( + SELECT driver_id, AVG(rating) AS ratingDriver, COUNT(id) AS ratingCount + FROM ratingDriver + GROUP BY driver_id + ) rdAvg ON rdAvg.driver_id = d.id + WHERE d.id IN ($placeholders) + -- AND COALESCE(cr.year, 0) > 2000 -- ⭐ الشرط الخاص بهذا السكريبت + -- AND (cr.make NOT LIKE '%دراج%' AND cr.model NOT LIKE '%دراج%') + AND (cr.model NOT LIKE '%Van%' AND cr.make NOT LIKE '%Van%') + "; + + $stmt_drivers_info = $con->prepare($sql_drivers_info); + $stmt_drivers_info->execute($driver_ids); + $drivers_info_raw = $stmt_drivers_info->fetchAll(PDO::FETCH_ASSOC); + + // تحويل المصفوفة لتسهيل عملية الدمج لاحقاً + foreach ($drivers_info_raw as $driver) { + $drivers_info[$driver['driver_id']] = $driver; + } + } + + // ================================================================= + // الخطوة 4: دمج النتائج في PHP + // ================================================================= + $final_results = []; + foreach ($locations as $location) { + $driver_id = $location['driver_id']; + if (isset($drivers_info[$driver_id])) { + $final_results[] = array_merge($location, $drivers_info[$driver_id]); + } + } + + // ================================================================= + // الخطوة 5: تطبيق الترتيب والحد النهائي في PHP + // ================================================================= + usort($final_results, function ($a, $b) { + if ($a['ratingDriver'] != $b['ratingDriver']) { + return $b['ratingDriver'] <=> $a['ratingDriver']; + } + if ($a['ratingCount'] != $b['ratingCount']) { + return $b['ratingCount'] <=> $a['ratingCount']; + } + return strtotime($b['updated_at']) <=> strtotime($a['updated_at']); + }); + + $limited_results = array_slice($final_results, 0, 10); + + if (empty($limited_results)) { + jsonError("No cars matching the specific criteria (year > 2000) found."); + exit; + } + + // ================================================================= + // الخطوة 6: فك التشفير وحساب العمر (بدون تغيير) + // ================================================================= + $fieldsToDecrypt = [ 'phone','email','gender','birthdate', 'first_name','last_name', 'token','car_plate','vin' ]; + foreach ($limited_results as &$row) { + foreach ($fieldsToDecrypt as $field) { + if (isset($row[$field]) && !empty($row[$field])) { + try { $row[$field] = $encryptionHelper->decryptData($row[$field]); } + catch (Exception $e) { $row[$field] = null; } + } + } + if (!empty($row['birthdate'])) { + try { + $birthDate = new DateTime($row['birthdate']); + $today = new DateTime(); + $row['age'] = $today->diff($birthDate)->y; + } catch (Exception $e) { $row['age'] = null; } + } else { + $row['age'] = null; + } + } + unset($row); + + jsonSuccess($limited_results); + +} catch (PDOException $e) { + jsonError("Database error: " . $e->getMessage()); +} catch (Throwable $e) { + jsonError("Internal error: " . $e->getMessage()); +} diff --git a/backend/ride/location/getTotalDriverDuration.php b/backend/ride/location/getTotalDriverDuration.php new file mode 100755 index 0000000..f47863c --- /dev/null +++ b/backend/ride/location/getTotalDriverDuration.php @@ -0,0 +1,44 @@ += :first_day_of_month + AND car_tracks.created_at < :last_day_of_month +GROUP BY + day +ORDER BY + day ASC;"; + +$stmt = $con->prepare($sql); +$stmt->bindParam(':driver_id', $driver_id, PDO::PARAM_STR); +$stmt->bindParam(':first_day_of_month', $first_day_of_month, PDO::PARAM_STR); +$stmt->bindParam(':last_day_of_month', $last_day_of_month, PDO::PARAM_STR); +$stmt->execute(); + +$car_locations = $stmt->fetchAll(PDO::FETCH_ASSOC); + +if ($car_locations) { + // Print the car location data as JSON + jsonSuccess($data = $car_locations); +} else { + // Print a failure message + jsonError($message = "No car locations found"); +} + +?> \ No newline at end of file diff --git a/backend/ride/location/getTotalDriverDurationToday.php b/backend/ride/location/getTotalDriverDurationToday.php new file mode 100644 index 0000000..1f83fdc --- /dev/null +++ b/backend/ride/location/getTotalDriverDurationToday.php @@ -0,0 +1,31 @@ += '$current_date' + AND car_tracks.created_at < DATE_ADD('$current_date', INTERVAL 1 DAY);"; + +$stmt = $con->prepare($sql); +$stmt->execute(); +$car_locations = $stmt->fetchAll(PDO::FETCH_ASSOC); + +if ($car_locations) { + // Print the car location data as JSON + jsonSuccess($car_locations); +} else { + // Print a failure message + jsonError($message = "No car locations found"); +} + +?> diff --git a/backend/ride/location/getUpdatedLocationForAdmin.php b/backend/ride/location/getUpdatedLocationForAdmin.php new file mode 100755 index 0000000..634f046 --- /dev/null +++ b/backend/ride/location/getUpdatedLocationForAdmin.php @@ -0,0 +1,127 @@ += NOW() - INTERVAL $freshSeconds SECOND"; + } + + // تحديد المسار الكامل بدقة + $savePath = __DIR__ . '/' . $fileName; + + // === فحص صلاحيات الكتابة === + if (!is_writable(__DIR__)) { + // إذا لم تكن هناك صلاحية، سنطبع الخطأ ونوقف التنفيذ + echo json_encode([ + "status" => "error", + "message" => "Permission Denied: Cannot write to directory. Please chmod 777 this folder.", + "path" => __DIR__ + ]); + exit; + } + + // 1. جلب المواقع + $sql_locations = " + SELECT t.driver_id, + t.latitude AS lat, + t.longitude AS lon, + t.heading, + t.speed, + t.created_at + FROM car_tracks t + INNER JOIN ( + SELECT driver_id, MAX(id) AS max_id + FROM car_tracks + WHERE $timeCondition + GROUP BY driver_id + ) latest + ON t.id = latest.max_id + ORDER BY t.created_at DESC +"; + $stmt = $con_tracking->prepare($sql_locations); + $stmt->execute(); + $locations = $stmt->fetchAll(PDO::FETCH_ASSOC); + + // 2. جلب بيانات السائقين + $driver_ids = array_unique(array_column($locations, 'driver_id')); + $drivers_info = []; + + if (!empty($driver_ids)) { + $placeholders = implode(',', array_fill(0, count($driver_ids), '?')); + $sql_drivers = "SELECT id, first_name, last_name, phone FROM driver WHERE id IN ($placeholders)"; + $stmt_drivers = $con->prepare($sql_drivers); + $stmt_drivers->execute(array_values($driver_ids)); + foreach ($stmt_drivers->fetchAll(PDO::FETCH_ASSOC) as $row) { + $drivers_info[$row['id']] = $row; + } + } + + // 3. الدمج + $final_drivers = []; + foreach ($locations as $loc) { + $d_id = $loc['driver_id']; + $merged = [ + 'id' => $d_id, + 'lat' => $loc['lat'], + 'lon' => $loc['lon'], + 'heading' => $loc['heading'], + 'speed' => $loc['speed'], + 'name' => 'Unknown', + 'phone' => '', + 'completed' => 0, + 'cancelled' => 0 + ]; + + if (isset($drivers_info[$d_id])) { + $info = $drivers_info[$d_id]; + // فك التشفير البسيط (تأكد من عمل encryptionHelper) + if (isset($encryptionHelper)) { + try { $info['first_name'] = $encryptionHelper->decryptData($info['first_name']); } catch(Exception $e){} + try { $info['last_name'] = $encryptionHelper->decryptData($info['last_name']); } catch(Exception $e){} + try { $info['phone'] = $encryptionHelper->decryptData($info['phone']); } catch(Exception $e){} + } + + $merged['name'] = trim(($info['first_name']??'') . ' ' . ($info['last_name']??'')); + $merged['phone'] = $info['phone'] ?? ''; + $merged['completed'] = $info['completed'] ?? 0; + $merged['cancelled'] = $info['cancelled'] ?? 0; + } + $final_drivers[] = $merged; + } + + // 4. الحفظ + $jsonContent = json_encode(['drivers' => $final_drivers, 'last_updated' => date('Y-m-d H:i:s')], JSON_UNESCAPED_UNICODE); + + // محاولة الحفظ + if (file_put_contents($savePath, $jsonContent) !== false) { + echo json_encode(["status" => "success", "message" => "File written successfully to $savePath"]); + } else { + echo json_encode(["status" => "error", "message" => "Failed to write file. Check permissions."]); + } + +} catch (Exception $e) { + echo json_encode(["status" => "error", "message" => $e->getMessage()]); +} +?> \ No newline at end of file diff --git a/backend/ride/location/get_location_area_links.php b/backend/ride/location/get_location_area_links.php new file mode 100644 index 0000000..8850d6d --- /dev/null +++ b/backend/ride/location/get_location_area_links.php @@ -0,0 +1,24 @@ +prepare($sql); + + $stmt->execute(); + + $car_locations = $stmt->fetchAll(PDO::FETCH_ASSOC); + + if ($car_locations) { + jsonSuccess($car_locations); + } else { + jsonError("No car locations found"); + } +} catch (PDOException $e) { + jsonError("Database error: " . $e->getMessage()); +} \ No newline at end of file diff --git a/backend/ride/location/getfemalbehavior.php b/backend/ride/location/getfemalbehavior.php new file mode 100644 index 0000000..274f507 --- /dev/null +++ b/backend/ride/location/getfemalbehavior.php @@ -0,0 +1,86 @@ += :southwestLat AND cl.latitude <= :northeastLat + AND cl.longitude >= :southwestLon AND cl.longitude <= :northeastLon + AND cl.status = 'off' + AND cl.updated_at >= NOW() - INTERVAL 5 SECOND + AND (cr.make NOT LIKE '%دراجة%' OR cr.model NOT LIKE '%دراجة%') + AND d.gender = 'Female' +GROUP BY cl.driver_id +ORDER BY ratingDriver DESC, cl.updated_at DESC +LIMIT 10; +"; + + $stmt = $con->prepare($sql); + $stmt->bindParam(':southwestLat', $southwestLat); + $stmt->bindParam(':southwestLon', $southwestLon); + $stmt->bindParam(':northeastLat', $northeastLat); + $stmt->bindParam(':northeastLon', $northeastLon); + + $stmt->execute(); + $car_locations = $stmt->fetchAll(PDO::FETCH_ASSOC); + + if ($car_locations) { + jsonSuccess($car_locations); + } else { + jsonError("No car locations found"); + } +} catch (PDOException $e) { + jsonError("Database error: " . $e->getMessage()); +} +?> \ No newline at end of file diff --git a/backend/ride/location/print.php b/backend/ride/location/print.php new file mode 100755 index 0000000..fa9973f --- /dev/null +++ b/backend/ride/location/print.php @@ -0,0 +1,254 @@ + +

⚠️ Error: Data File Not Found

+

Please ensure '.$source_file.' exists in the same directory.

+ '); +} + +// Get content +$json_data = file_get_contents($source_file); +$data = json_decode($json_data, true); + +if (!$data) { + die('Error decoding JSON data.'); +} + +$drivers = $data['data']; +$last_updated = $data['last_updated'] ?? date('Y-m-d H:i:s'); + +// ============================================================ +// 2. DATA PROCESSING (Logic Layer) +// ============================================================ + +$processed_drivers = []; +$stats = [ + 'total' => 0, + 'elite' => 0, // +50 hours + 'stable' => 0, // +20 hours + 'experimental' => 0, // +5 hours + 'inactive' => 0 +]; + +foreach ($drivers as $driver) { + // Parse Active Time String (e.g., "293 ساعة و 48 دقيقة") + $timeStr = $driver['active_time'] ?? "0 ساعة و 0 دقيقة"; + preg_match('/(\d+)\s*ساعة/', $timeStr, $hoursMatch); + preg_match('/(\d+)\s*دقيقة/', $timeStr, $minsMatch); + + $hours = isset($hoursMatch[1]) ? (int)$hoursMatch[1] : 0; + $mins = isset($minsMatch[1]) ? (int)$minsMatch[1] : 0; + $totalMinutes = ($hours * 60) + $mins; + + // Categorize Driver + $category = 'inactive'; + $catLabel = 'خامل'; + $catClass = 'cat-inactive'; + + if ($totalMinutes >= 3000) { // 50 hours + $category = 'elite'; + $catLabel = 'نخبة'; + $catClass = 'cat-elite'; + $stats['elite']++; + } elseif ($totalMinutes >= 1200) { // 20 hours + $category = 'stable'; + $catLabel = 'مستقر'; + $catClass = 'cat-stable'; + $stats['stable']++; + } elseif ($totalMinutes >= 300) { // 5 hours + $category = 'experimental'; + $catLabel = 'تجريبي'; + $catClass = 'cat-experimental'; + $stats['experimental']++; + } else { + $stats['inactive']++; + } + + $driver['total_minutes'] = $totalMinutes; + $driver['category_label'] = $catLabel; + $driver['category_class'] = $catClass; + $processed_drivers[] = $driver; +} + +$stats['total'] = count($processed_drivers); + +// Sort by Active Time (High to Low) +usort($processed_drivers, function($a, $b) { + return $b['total_minutes'] <=> $a['total_minutes']; +}); + +?> + + + + + + تقرير السائقين - Intaleq + + + + + +
+ + +
+ +
+
+
+

تقرير أداء السائقين

+
تاريخ الطباعة:
+
+
+

Intaleq

+
:آخر تحديث بيانات
+
+
+ +
+
+ إجمالي السائقين + +
+
+ النخبة (+50 ساعة) + +
+
+ مستقرون (+20 ساعة) + +
+
+ يحتاجون متابعة + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + +
#اسم السائقرقم الهاتفساعات النشاطالحالةتاريخ الانضمامملاحظات إدارية
+ + + + + + + + + +
+
+ + + \ No newline at end of file diff --git a/backend/ride/location/save_behavior.php b/backend/ride/location/save_behavior.php new file mode 100644 index 0000000..763bbeb --- /dev/null +++ b/backend/ride/location/save_behavior.php @@ -0,0 +1,58 @@ + يتصل بقاعدة البيانات الأساسية +// $con_tracking -> يتصل بقاعدة بيانات التتبع (driver_behavior, car_locations) +require_once __DIR__ . '/../../connect.php'; + +try { + // استلام البيانات من Flutter + $driver_id = filterRequest("driver_id"); + $trip_id = filterRequest("trip_id"); + $max_speed = filterRequest("max_speed"); + $avg_speed = filterRequest("avg_speed"); + $hard_brakes = filterRequest("hard_brakes"); + $total_distance = filterRequest("total_distance"); + $behavior_score = filterRequest("behavior_score"); + + // تحقق من القيم الأساسية + if (empty($driver_id) || empty($trip_id)) { + jsonError("Missing driver_id or trip_id"); + exit(); + } + + // إدخال البيانات في جدول driver_behavior باستخدام اتصال التتبع + // تم تغيير $con إلى $con_tracking + $stmt = $con_tracking->prepare(" + INSERT INTO driver_behavior ( + driver_id, trip_id, max_speed, avg_speed, + hard_brakes, total_distance, behavior_score + ) VALUES (?, ?, ?, ?, ?, ?, ?) + "); + + $stmt->execute([ + $driver_id, + $trip_id, + $max_speed, + $avg_speed, + $hard_brakes, + $total_distance, + $behavior_score + ]); + + // التحقق من نجاح العملية + if ($stmt->rowCount() > 0) { + jsonSuccess(null, "Behavior data saved"); + } else { + // في حالة عدم حدوث خطأ، ولكن لم يتم إدخال صف (قد يحدث)، + // من الأفضل إرجاع رسالة فشل عامة. + jsonError("Failed to save data (No rows affected)"); + } + +} catch (PDOException $e) { + jsonError("Database error: " . $e->getMessage()); +} catch (Throwable $e) { + jsonError("Internal error: " . $e->getMessage()); +} + +// تم حذف exit() من هنا ليتم التعامل معها داخل try/catch +?> \ No newline at end of file diff --git a/backend/ride/location/update.php b/backend/ride/location/update.php new file mode 100644 index 0000000..d7aa3c6 --- /dev/null +++ b/backend/ride/location/update.php @@ -0,0 +1,69 @@ +prepare($sql); + + // The execute method returns true on success and false on failure. + $success = $stmt->execute([ + ':latitude' => $latitude, + ':longitude' => $longitude, + ':heading' => $heading, + ':speed' => $speed, + ':distance' => $distance, + ':status' => $status, + ':updated_at' => $updated_at, + ':driver_id' => $driver_id + ]); + + // The reliable way to check for success is if execute() returns true + // and doesn't throw an exception. We no longer need rowCount(). + if ($success) { + // Print a success message + jsonSuccess(null, "Car location updated successfully"); + } else { + // This case is rare but might happen if execute fails without an exception + jsonError("Failed to update car location"); + } + +} catch (PDOException $e) { + // A real database error occurred. + http_response_code(500); + // You can log the detailed error for debugging + // error_log('Database error: ' . $e->getMessage()); + jsonError('Database error occurred'); +} +?> diff --git a/backend/ride/mishwari/add.php b/backend/ride/mishwari/add.php new file mode 100755 index 0000000..ad6f572 --- /dev/null +++ b/backend/ride/mishwari/add.php @@ -0,0 +1,187 @@ +encryptData($phone); +$gender = $encryptionHelper->encryptData($gender); +$name = $encryptionHelper->encryptData($name); +$name_english = $encryptionHelper->encryptData($name_english); +$car_plate = $encryptionHelper->encryptData($car_plate); +$token = $encryptionHelper->encryptData($token); +$education = $encryptionHelper->encryptData($education); +$national_number = $encryptionHelper->encryptData($national_number); +$age = $encryptionHelper->encryptData($age); + +// ⏰ تحويل الوقت للفحص +$selectedTime = new DateTime($timeSelected); +$startTime = $selectedTime->format('Y-m-d H:i:s'); +$endTime = $selectedTime->add(new DateInterval('PT6H'))->format('Y-m-d H:i:s'); + +// ✅ فحص هل السائق لديه أكثر من رحلتين خلال 6 ساعات +$sqlCheck = "SELECT COUNT(*) as trip_count + FROM `mishwaritrips` + WHERE `driverId` = :driverId + AND `timeSelected` BETWEEN :startTime AND :endTime"; +$stmtCheck = $con->prepare($sqlCheck); +$stmtCheck->bindParam(':driverId', $driverId); +$stmtCheck->bindParam(':startTime', $startTime); +$stmtCheck->bindParam(':endTime', $endTime); +$stmtCheck->execute(); +$result = $stmtCheck->fetch(PDO::FETCH_ASSOC); + +if ($result['trip_count'] >= 2) { + jsonError("Driver already has 2 trips within the specified period."); + exit; +} + +// ✅ فحص إن الراكب لا يملك رحلة فعالة بنفس اليوم +$sqlCheckPassenger = " +SELECT * +FROM `mishwaritrips` +WHERE `passengerId` = :passengerId +AND `status` != 'Finished' +AND DATE(`timeSelected`) = CURDATE() +"; +$stmtCheckPassenger = $con->prepare($sqlCheckPassenger); +$stmtCheckPassenger->bindParam(':passengerId', $passengerId); +$stmtCheckPassenger->execute(); +$existingTrip = $stmtCheckPassenger->fetch(PDO::FETCH_ASSOC); + +// إذا كانت موجودة يتم التحديث +if ($existingTrip) { + $sqlUpdate = "UPDATE `mishwaritrips` SET + `driverId` = :driverId, + `phone` = :phone, + `gender` = :gender, + `name` = :name, + `name_english` = :name_english, + `address` = :address, + `religion` = :religion, + `age` = :age, + `startNameAddress` = :startNameAddress, + `locationCoordinate` = :locationCoordinate, + `education` = :education, + `license_type` = :license_type, + `national_number` = :national_number, + `car_plate` = :car_plate, + `make` = :make, + `model` = :model, + `color` = :color, + `color_hex` = :color_hex, + `token` = :token, + `rating` = :rating, + `countRide` = :countRide, + `timeSelected` = :timeSelected, + `status` = :status + WHERE `passengerId` = :passengerId"; + + $stmtUpdate = $con->prepare($sqlUpdate); + $stmtUpdate->execute([ + ':driverId' => $driverId, + ':phone' => $phone, + ':gender' => $gender, + ':name' => $name, + ':name_english' => $name_english, + ':address' => $address, + ':religion' => $religion, + ':age' => $age, + ':startNameAddress' => $startNameAddress, + ':locationCoordinate' => $locationCoordinate, + ':education' => $education, + ':license_type' => $license_type, + ':national_number' => $national_number, + ':car_plate' => $car_plate, + ':make' => $make, + ':model' => $model, + ':color' => $color, + ':color_hex' => $color_hex, + ':token' => $token, + ':rating' => $rating, + ':countRide' => $countRide, + ':timeSelected' => $timeSelected, + ':status' => $status, + ':passengerId' => $passengerId + ]); + + if ($stmtUpdate->rowCount() > 0) { + jsonSuccess(null, "Trip updated successfully"); + } else { + jsonError("Failed to update trip data"); + } + +} else { + // إدخال رحلة جديدة + $sqlInsert = "INSERT INTO `mishwaritrips` ( + `driverId`, `phone`, `gender`, `name`, `name_english`, `address`, `religion`, + `age`, `startNameAddress`, `locationCoordinate`, `education`, `license_type`, + `national_number`, `car_plate`, `make`, `model`, `color`, `color_hex`, `token`, + `rating`, `countRide`, `passengerId`, `timeSelected`, `createdAt`, `status` + ) VALUES ( + :driverId, :phone, :gender, :name, :name_english, :address, :religion, + :age, :startNameAddress, :locationCoordinate, :education, :license_type, + :national_number, :car_plate, :make, :model, :color, :color_hex, :token, + :rating, :countRide, :passengerId, :timeSelected, NOW(), :status + )"; + + $stmtInsert = $con->prepare($sqlInsert); + $stmtInsert->execute([ + ':driverId' => $driverId, + ':phone' => $phone, + ':gender' => $gender, + ':name' => $name, + ':name_english' => $name_english, + ':address' => $address, + ':religion' => $religion, + ':age' => $age, + ':startNameAddress' => $startNameAddress, + ':locationCoordinate' => $locationCoordinate, + ':education' => $education, + ':license_type' => $license_type, + ':national_number' => $national_number, + ':car_plate' => $car_plate, + ':make' => $make, + ':model' => $model, + ':color' => $color, + ':color_hex' => $color_hex, + ':token' => $token, + ':rating' => $rating, + ':countRide' => $countRide, + ':passengerId' => $passengerId, + ':timeSelected' => $timeSelected, + ':status' => $status + ]); + + if ($stmtInsert->rowCount() > 0) { + jsonSuccess(null, "New trip inserted successfully"); + } else { + jsonError("Failed to insert new trip data"); + } +} +?> \ No newline at end of file diff --git a/backend/ride/mishwari/cancel.php b/backend/ride/mishwari/cancel.php new file mode 100755 index 0000000..f5a537d --- /dev/null +++ b/backend/ride/mishwari/cancel.php @@ -0,0 +1,41 @@ +prepare($sql); +$stmt->bindParam(':status', $status, PDO::PARAM_STR); +$stmt->bindParam(':id', $id, PDO::PARAM_INT); // Bind the ID parameter + +// Execute the update +if ($stmt->execute()) { + // Check if the update was successful + if ($stmt->rowCount() > 0) { + // Trip status updated successfully + jsonSuccess(null, "Trip cancelled successfully."); + } else { + // No rows updated, meaning the trip might not have been found or was already cancelled + jsonError("No trip found to cancel."); + } +} else { + // Print failure if the update query failed + $errorInfo = $stmt->errorInfo(); + error_log('SQL Error: ' . implode(", ", $errorInfo)); + jsonError("Failed to cancel the trip."); +} +?> \ No newline at end of file diff --git a/backend/ride/mishwari/error_log b/backend/ride/mishwari/error_log new file mode 100644 index 0000000..e69de29 diff --git a/backend/ride/mishwari/get.php b/backend/ride/mishwari/get.php new file mode 100755 index 0000000..027cdd7 --- /dev/null +++ b/backend/ride/mishwari/get.php @@ -0,0 +1,70 @@ += CURDATE() - INTERVAL 4 DAY + AND mi.timeSelected > NOW() +ORDER BY + mi. `createdAt` +DESC +LIMIT 1 + + "; +$stmt = $con->prepare($sql); +$stmt->bindParam(':driverId', $driverId, PDO::PARAM_STR); +$stmt->execute(); + +if ($stmt->rowCount() > 0) { + // Fetch the record + $row = $stmt->fetchAll(PDO::FETCH_ASSOC); + + jsonSuccess($row); + +} + else{ + // Print a failure message + jsonError($message = "No wallet record found"); +} +?> \ No newline at end of file diff --git a/backend/ride/mishwari/getDriver.php b/backend/ride/mishwari/getDriver.php new file mode 100755 index 0000000..d99f668 --- /dev/null +++ b/backend/ride/mishwari/getDriver.php @@ -0,0 +1,70 @@ += CURDATE() - INTERVAL 4 DAY + AND mi.timeSelected > NOW() +ORDER BY + mi. `createdAt` +DESC +LIMIT 1 + + "; +$stmt = $con->prepare($sql); +$stmt->bindParam(':driverId', $driverId, PDO::PARAM_STR); +$stmt->execute(); + +if ($stmt->rowCount() > 0) { + // Fetch the record + $row = $stmt->fetchAll(PDO::FETCH_ASSOC); + + jsonSuccess($row); + +} + else{ + // Print a failure message + jsonError($message = "No wallet record found"); +} +?> \ No newline at end of file diff --git a/backend/ride/mishwari/test.php b/backend/ride/mishwari/test.php new file mode 100644 index 0000000..871acb4 --- /dev/null +++ b/backend/ride/mishwari/test.php @@ -0,0 +1,30 @@ +prepare($sql); +$stmt->execute(); + +if ($stmt->rowCount() > 0) { + $rows = $stmt->fetchAll(PDO::FETCH_ASSOC); + + // فك التشفير للحقول الحساسة + foreach ($rows as &$row) { + $row['phone'] = $encryptionHelper->decryptData($row['phone']); + $row['email'] = $encryptionHelper->decryptData($row['email']); + $row['gender'] = $encryptionHelper->decryptData($row['gender']); + $row['birthdate'] = $encryptionHelper->decryptData($row['birthdate']); + $row['site'] = $encryptionHelper->decryptData($row['site']); + $row['first_name'] = $encryptionHelper->decryptData($row['first_name']); + $row['last_name'] = $encryptionHelper->decryptData($row['last_name']); + $row['sosPhone'] = $encryptionHelper->decryptData($row['sosPhone']); + $row['education'] = $encryptionHelper->decryptData($row['education']); + $row['employmentType'] = $encryptionHelper->decryptData($row['employmentType']); + $row['maritalStatus'] = $encryptionHelper->decryptData($row['maritalStatus']); + } + + jsonSuccess($rows); +} else { + jsonError("No passengers found"); +} +?> \ No newline at end of file diff --git a/backend/ride/notificationCaptain/add.php b/backend/ride/notificationCaptain/add.php new file mode 100644 index 0000000..7c2a786 --- /dev/null +++ b/backend/ride/notificationCaptain/add.php @@ -0,0 +1,36 @@ +prepare($sql); +$stmt->execute([ + ':driverID' => $driverID, + ':title' => $title, + ':body' => $body, + ':isPin' => $isPin +]); + +if ($stmt->rowCount() > 0) { + jsonSuccess(null, "Notification data saved successfully"); +} else { + jsonError("Failed to save notification data"); +} + +?> \ No newline at end of file diff --git a/backend/ride/notificationCaptain/addWaitingRide.php b/backend/ride/notificationCaptain/addWaitingRide.php new file mode 100755 index 0000000..157353d --- /dev/null +++ b/backend/ride/notificationCaptain/addWaitingRide.php @@ -0,0 +1,72 @@ +prepare($sql); + $stmt->execute($params); + + if ($stmt->rowCount() > 0) { + jsonSuccess(null, "Operation completed successfully"); + } else { + jsonSuccess(null, "No changes made"); + } + +} catch (PDOException $e) { + error_log("Database error in addWaitingRide: " . $e->getMessage()); + jsonError("Database error: " . $e->getMessage()); +} catch (Exception $e) { + jsonError("Error: " . $e->getMessage()); +} +?> diff --git a/backend/ride/notificationCaptain/delete.php b/backend/ride/notificationCaptain/delete.php new file mode 100644 index 0000000..338b2de --- /dev/null +++ b/backend/ride/notificationCaptain/delete.php @@ -0,0 +1,18 @@ +prepare($sql); +$stmt->bindParam(':id', $notificationID, PDO::PARAM_INT); +$stmt->execute(); + +if ($stmt->rowCount() > 0) { + jsonSuccess(null, "Notification data deleted successfully"); +} else { + jsonError("Failed to delete notification data"); +} + +?> \ No newline at end of file diff --git a/backend/ride/notificationCaptain/deleteAvailableRide.php b/backend/ride/notificationCaptain/deleteAvailableRide.php new file mode 100755 index 0000000..8ec624e --- /dev/null +++ b/backend/ride/notificationCaptain/deleteAvailableRide.php @@ -0,0 +1,30 @@ +prepare($sql); + $stmt->bindParam(':id', $id, PDO::PARAM_INT); + $stmt->execute(); + + // Check the result and print the appropriate message + if ($stmt->rowCount() > 0) { + jsonSuccess(null, "Record with ID $id deleted successfully."); + } else { + jsonError("No record found with ID $id."); + } +} catch (PDOException $e) { + jsonError("Database error: " . $e->getMessage()); +} catch (Exception $e) { + jsonError("Error: " . $e->getMessage()); +} +?> \ No newline at end of file diff --git a/backend/ride/notificationCaptain/error_log b/backend/ride/notificationCaptain/error_log new file mode 100644 index 0000000..e69de29 diff --git a/backend/ride/notificationCaptain/get.php b/backend/ride/notificationCaptain/get.php new file mode 100755 index 0000000..8f5bf1d --- /dev/null +++ b/backend/ride/notificationCaptain/get.php @@ -0,0 +1,23 @@ + DATE_SUB(NOW(), INTERVAL 2 DAY) + ORDER BY `dateCreated` DESC + LIMIT 10"; + +$stmt = $con->prepare($sql); +$stmt->bindParam(':driverID', $driverID, PDO::PARAM_STR); +$stmt->execute(); + +$notifications = $stmt->fetchAll(PDO::FETCH_ASSOC); + +if ($notifications) { + jsonSuccess($notifications); +} else { + jsonError("No notification data found"); +} +?> \ No newline at end of file diff --git a/backend/ride/notificationCaptain/getRideWaiting.php b/backend/ride/notificationCaptain/getRideWaiting.php new file mode 100755 index 0000000..e7c4a57 --- /dev/null +++ b/backend/ride/notificationCaptain/getRideWaiting.php @@ -0,0 +1,159 @@ + 'get_nearby_ride_ids', + 'lat' => $lat, + 'lng' => $lng, + 'radius' => $radius + ]; + + $ch = curl_init(); + curl_setopt($ch, CURLOPT_URL, $locationServerUrl); + curl_setopt($ch, CURLOPT_POST, 1); + curl_setopt($ch, CURLOPT_POSTFIELDS, http_build_query($postData)); + curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); + curl_setopt($ch, CURLOPT_TIMEOUT_MS, 500); + curl_setopt($ch, CURLOPT_HTTPHEADER, ["x-internal-key: $INTERNAL_KEY"]); + + $response = curl_exec($ch); + $httpCode = curl_getinfo($ch, CURLINFO_HTTP_CODE); + curl_close($ch); + + if ($httpCode == 200 && $response) { + $jsonResults = json_decode($response, true); + if (is_array($jsonResults) && !empty($jsonResults)) { + foreach ($jsonResults as $res) { + $rideIds[] = $res[0]; + $redisResultsMap[$res[0]] = $res[1]; + } + } + } +} catch (Exception $e) { + // نتابع للخطة ب +} + +// 2. جلب البيانات (إما عبر IDs أو بحث مباشر) +try { + if (!empty($rideIds)) { + // --- الحالة أ: الريدز وجد رحلات --- + $placeholders = implode(',', array_fill(0, count($rideIds), '?')); + + $sql = " + SELECT + wr.id, wr.start_location AS startName, wr.end_location AS endName, + wr.date, wr.time, wr.price, wr.passenger_id, wr.status, wr.carType, + wr.passengerRate, wr.created_at, wr.price_for_passenger, + wr.distance, wr.duration, wr.start_lat, wr.start_lng, + wr.end_lat, wr.end_lng, wr.payment_method, wr.passenger_wallet, + p.email, p.first_name, p.phone, p.id AS passengerId, t.token AS passengerToken + FROM waitingRides wr + INNER JOIN passengers p ON p.id = wr.passenger_id + LEFT JOIN tokens t ON t.passengerID = wr.passenger_id + LEFT JOIN passengerWallet pw ON pw.passenger_id = wr.passenger_id + WHERE wr.id IN ($placeholders) AND wr.status IN ('wait', 'waiting') + "; + + $stmt = $con->prepare($sql); + $stmt->execute($rideIds); + $waitingRides = $stmt->fetchAll(PDO::FETCH_ASSOC); + + } else { + // --- الحالة ب: بحث مباشر MySQL (Fallback) --- + // 🔥 التصحيح هنا: استخدام أسماء فريدة (:lat1, :lat2) لتجنب خطأ التكرار + + $haversine = "( 6371 * acos( cos( radians(:lat1) ) * cos( radians( wr.start_lat ) ) * cos( radians( wr.start_lng ) - radians(:lng) ) + sin( radians(:lat2) ) * sin( radians( wr.start_lat ) ) ) )"; + + $sql = " + SELECT + wr.id, wr.start_location AS startName, wr.end_location AS endName, + wr.date, wr.time, wr.price, wr.passenger_id, wr.status, wr.carType, + wr.passengerRate, wr.created_at, wr.price_for_passenger, + wr.distance, wr.duration, wr.start_lat, wr.start_lng, + wr.end_lat, wr.end_lng, wr.payment_method, wr.passenger_wallet, + p.email, p.first_name, p.phone, p.id AS passengerId, t.token AS passengerToken, + {$haversine} AS driver_distance_km + FROM waitingRides wr + INNER JOIN passengers p ON p.id = wr.passenger_id + LEFT JOIN tokens t ON t.passengerID = wr.passenger_id + LEFT JOIN passengerWallet pw ON pw.passenger_id = wr.passenger_id + WHERE + wr.status IN ('wait', 'waiting') + AND wr.created_at >= DATE_SUB(NOW(), INTERVAL 24 HOUR) + AND wr.start_lat IS NOT NULL + HAVING driver_distance_km <= :radius + ORDER BY driver_distance_km ASC + LIMIT 50 + "; + + $stmt = $con->prepare($sql); + + // نمرر القيمة مرتين للمفتاحين المختلفين + $stmt->execute([ + ':lat1' => $lat, + ':lng' => $lng, + ':lat2' => $lat, // تكرار القيمة للمتغير الثاني + ':radius' => $radius + ]); + + $waitingRides = $stmt->fetchAll(PDO::FETCH_ASSOC); + } + + // 3. التنسيق + foreach ($waitingRides as $ride) { + $ride['phone'] = $encryptionHelper->decryptData($ride['phone'] ?? ''); + $ride['first_name'] = $encryptionHelper->decryptData($ride['first_name'] ?? ''); + $ride['email'] = $encryptionHelper->decryptData($ride['email'] ?? ''); + + $ride['start_location'] = $ride['start_lat'] . ',' . $ride['start_lng']; + $ride['end_location'] = (!empty($ride['end_lat'])) + ? $ride['end_lat'] . ',' . $ride['end_lng'] + : $ride['endName']; + + $ride['id'] = (string)$ride['id']; + + if (isset($ride['driver_distance_km'])) { + $ride['driver_distance_km'] = number_format((float)$ride['driver_distance_km'], 1); + } elseif (isset($redisResultsMap[$ride['id']])) { + $ride['driver_distance_km'] = number_format((float)$redisResultsMap[$ride['id']], 1); + } else { + $ride['driver_distance_km'] = "0.0"; + } + + $finalRides[] = $ride; + } + + usort($finalRides, function($a, $b) { + return $a['driver_distance_km'] <=> $b['driver_distance_km']; + }); + + jsonSuccess($finalRides); + +} catch (PDOException $e) { + error_log("DB Error getRideWaiting: " . $e->getMessage()); + jsonError("Database error"); +} +?> \ No newline at end of file diff --git a/backend/ride/notificationCaptain/update.php b/backend/ride/notificationCaptain/update.php new file mode 100644 index 0000000..68a740d --- /dev/null +++ b/backend/ride/notificationCaptain/update.php @@ -0,0 +1,52 @@ + $id]; + +if (isset($_POST["driverID"])) { + $columnValues[] = "`driverID` = :driverID"; + $params[':driverID'] = filterRequest("driverID"); +} + +if (isset($_POST["title"])) { + $columnValues[] = "`title` = :title"; + $params[':title'] = filterRequest("title"); +} + +if (isset($_POST["body"])) { + $columnValues[] = "`body` = :body"; + $params[':body'] = filterRequest("body"); +} + +if (isset($_POST["isShown"])) { + $columnValues[] = "`isShown` = :isShown"; + $params[':isShown'] = filterRequest("isShown"); +} + +if (isset($_POST["dateCreated"])) { + $columnValues[] = "`dateCreated` = :dateCreated"; + $params[':dateCreated'] = filterRequest("dateCreated"); +} + +// Check if there are fields to update +if (empty($columnValues)) { + jsonError("No fields to update"); + exit; +} + +$setClause = implode(", ", $columnValues); +$sql = "UPDATE `notificationCaptain` SET $setClause WHERE `id` = :id"; + +$stmt = $con->prepare($sql); +$stmt->execute($params); + +if ($stmt->rowCount() > 0) { + jsonSuccess(null, "Notification data updated successfully"); +} else { + jsonError("Failed to update notification data"); +} +?> \ No newline at end of file diff --git a/backend/ride/notificationCaptain/updateWaitingTrip.php b/backend/ride/notificationCaptain/updateWaitingTrip.php new file mode 100644 index 0000000..00b58a8 --- /dev/null +++ b/backend/ride/notificationCaptain/updateWaitingTrip.php @@ -0,0 +1,39 @@ + $id]; + +$possibleFields = [ + 'start_location', 'end_location', 'date', 'time', 'price', + 'passenger_id', 'status', 'carType', 'passengerRate', + 'price_for_passenger', 'distance', 'duration' +]; + +foreach ($possibleFields as $field) { + if (isset($_POST[$field])) { + $value = filterRequest($field); + $fields[] = "`$field` = :$field"; + $params[":$field"] = $value; + } +} + +if (empty($fields)) { + jsonError("No fields provided for update"); + exit; +} + +$setClause = implode(", ", $fields); +$sql = "UPDATE `waitingRides` SET $setClause WHERE `id` = :id"; + +$stmt = $con->prepare($sql); +$stmt->execute($params); + +if ($stmt->rowCount() > 0) { + jsonSuccess(null, "Waiting ride data updated successfully"); +} else { + jsonError("Failed to update waiting ride data"); +} +?> \ No newline at end of file diff --git a/backend/ride/notificationPassenger/add.php b/backend/ride/notificationPassenger/add.php new file mode 100755 index 0000000..672b8eb --- /dev/null +++ b/backend/ride/notificationPassenger/add.php @@ -0,0 +1,33 @@ +prepare($sql); +$stmt->execute([ + ':title' => $title, + ':body' => $body, + ':passengerID' => $passengerID +]); + +if ($stmt->rowCount() > 0) { + jsonSuccess(null, "Notification data saved successfully"); +} else { + jsonError("Failed to save notification data"); +} + +?> \ No newline at end of file diff --git a/backend/ride/notificationPassenger/delete.php b/backend/ride/notificationPassenger/delete.php new file mode 100644 index 0000000..e69de29 diff --git a/backend/ride/notificationPassenger/error_log b/backend/ride/notificationPassenger/error_log new file mode 100644 index 0000000..e69de29 diff --git a/backend/ride/notificationPassenger/get.php b/backend/ride/notificationPassenger/get.php new file mode 100755 index 0000000..9587e60 --- /dev/null +++ b/backend/ride/notificationPassenger/get.php @@ -0,0 +1,33 @@ += CURDATE() - INTERVAL 7 DAY +ORDER BY `created_at` DESC +LIMIT 10"; + +$stmt = $con->prepare($sql); +$stmt->bindParam(':passenger_id', $passenger_id, PDO::PARAM_STR); +$stmt->execute(); +$notifications = $stmt->fetchAll(PDO::FETCH_ASSOC); + +if ($notifications) { + jsonSuccess($notifications); +} else { + jsonSuccess([], "No notification data found"); +} + +?> \ No newline at end of file diff --git a/backend/ride/notificationPassenger/update.php b/backend/ride/notificationPassenger/update.php new file mode 100644 index 0000000..20e062e --- /dev/null +++ b/backend/ride/notificationPassenger/update.php @@ -0,0 +1,42 @@ + $id]; + +$mapping = [ + "title" => "title", + "body" => "body", + "passengerID" => "passenger_id", + "isShown" => "isShown", + "updatedAt" => "updated_at" +]; + +// تجهيز الـ SET والأرقام المقابلة +foreach ($mapping as $requestKey => $dbColumn) { + if (isset($_POST[$requestKey])) { + $value = filterRequest($requestKey); + $fields[] = "`$dbColumn` = :$requestKey"; + $params[":$requestKey"] = $value; + } +} + +if (empty($fields)) { + jsonError("No fields to update"); + exit; +} + +$setClause = implode(", ", $fields); +$sql = "UPDATE `notifications` SET $setClause WHERE `id` = :id"; + +$stmt = $con->prepare($sql); +$stmt->execute($params); + +if ($stmt->rowCount() > 0) { + jsonSuccess(null, "Notification data updated successfully"); +} else { + jsonError("Failed to update notification data"); +} +?> \ No newline at end of file diff --git a/backend/ride/overLay/_log.txt b/backend/ride/overLay/_log.txt new file mode 100644 index 0000000..0334b73 --- /dev/null +++ b/backend/ride/overLay/_log.txt @@ -0,0 +1,88 @@ +[2025-06-20 17:42:27] --- New Request Received --- +[2025-06-20 17:42:27] Incoming POST data: {"driver_id":"109270481246447459618","status":"Apply","passengerLocation":"32.1117875,36.0669891","passengerDestination":"32.0798703,36.0749472","Duration":"528","totalCost":"6.99","Distance":"5.64","name":"hamza","phone":"+201010101010","email":"hamzaayedflutter@gmail.com","WalletChecked":"true","tokenPassenger":"e4QWqe7K607luM7qUMOPCL:APA91bFjX4XBM4I5COJl9fyxCTKJ1ZQpT3vzY7iEbOTuT4uo0-OSCAt5zgVhlhw4aC33s-VhyucDnP1tQGFd9svaazQ8A_SKgolPk3owzug8dCsiXoPeJ0k","direction":"https:\/\/maps.googleapis.com\/maps\/api\/staticmap?size=600x150&maptype=roadmap&markers=color:green%7Clabel:S%7C32.1117875%2C36.0669891&markers=color:red%7Clabel:D%7C32.0798703%2C36.0749472&path=color:0x007bff%7Cweight:5%7C32.1117875%2C36.0669891%7C32.0798703%2C36.0749472&key=AIzaSyCyfwRXTwSTLOFQSQgN5p7QZgGJVZnEKq0","DurationToPassenger":"1","rideId":"1292","passengerId":"113172279072358305645","durationOfRideValue":"528","paymentAmount":"33.78","paymentMethod":"visa","isHaveSteps":"startEnd","step0":"32.09571771505668,36.06855209916831","step1":"","step2":"","step3":"","step4":"","passengerWalletBurc":"6.99","carType":"Speed","kazan":"8","startNameLocation":"4368+PPP\u060c \u0627\u0644\u0633\u062e\u0646\u0629\u060c \u0627\u0644\u0623\u0631\u062f\u0646","endNameLocation":"33HG+R6R\u060c \u0627\u0644\u0632\u0631\u0642\u0627\u0621\u060c \u0627\u0644\u0623\u0631\u062f\u0646","timeOfOrder":"2025-06-20T17:42:26.285449","totalPassenger":"33.78"} +[2025-06-20 17:42:27] Critical error: Missing required fields (rideId, driverId, or locations). +[2025-06-20 17:45:59] --- New Request Received --- +[2025-06-20 17:45:59] Incoming POST data: {"driver_id":"109270481246447459618","status":"Apply","passengerLocation":"32.1117875,36.0669891","passengerDestination":"32.0798703,36.0749472","Duration":"528","totalCost":"6.99","Distance":"5.64","name":"hamza","phone":"+201010101010","email":"hamzaayedflutter@gmail.com","WalletChecked":"true","tokenPassenger":"e4QWqe7K607luM7qUMOPCL:APA91bFjX4XBM4I5COJl9fyxCTKJ1ZQpT3vzY7iEbOTuT4uo0-OSCAt5zgVhlhw4aC33s-VhyucDnP1tQGFd9svaazQ8A_SKgolPk3owzug8dCsiXoPeJ0k","direction":"https:\/\/maps.googleapis.com\/maps\/api\/staticmap?size=600x150&maptype=roadmap&markers=color:green%7Clabel:S%7C32.1117875%2C36.0669891&markers=color:red%7Clabel:D%7C32.0798703%2C36.0749472&path=color:0x007bff%7Cweight:5%7C32.1117875%2C36.0669891%7C32.0798703%2C36.0749472&key=AIzaSyCyfwRXTwSTLOFQSQgN5p7QZgGJVZnEKq0","DurationToPassenger":"3","rideId":"1293","passengerId":"113172279072358305645","durationOfRideValue":"528","paymentAmount":"33.78","paymentMethod":"visa","isHaveSteps":"startEnd","step0":"32.09571771505668,36.06855209916831","step1":"","step2":"","step3":"","step4":"","passengerWalletBurc":"6.99","carType":"Speed","kazan":"8","startNameLocation":"4368+PPP\u060c \u0627\u0644\u0633\u062e\u0646\u0629\u060c \u0627\u0644\u0623\u0631\u062f\u0646","endNameLocation":"33HG+R6R\u060c \u0627\u0644\u0632\u0631\u0642\u0627\u0621\u060c \u0627\u0644\u0623\u0631\u062f\u0646","timeOfOrder":"2025-06-20T17:45:58.817633","totalPassenger":"33.78"} +[2025-06-20 17:45:59] Critical error: Missing required fields (rideId, driverId, or locations). +[2025-06-20 17:47:00] --- New Request Received --- +[2025-06-20 17:47:00] Incoming POST data: {"driver_id":"109270481246447459618","status":"Apply","passengerLocation":"32.1117875,36.0669891","passengerDestination":"32.1364001,36.0707479","Duration":"434","totalCost":"5.42","Distance":"4.38","name":"hamza","phone":"+201010101010","email":"hamzaayedflutter@gmail.com","WalletChecked":"true","tokenPassenger":"e4QWqe7K607luM7qUMOPCL:APA91bFjX4XBM4I5COJl9fyxCTKJ1ZQpT3vzY7iEbOTuT4uo0-OSCAt5zgVhlhw4aC33s-VhyucDnP1tQGFd9svaazQ8A_SKgolPk3owzug8dCsiXoPeJ0k","direction":"https:\/\/maps.googleapis.com\/maps\/api\/staticmap?size=600x150&maptype=roadmap&markers=color:green%7Clabel:S%7C32.1117875%2C36.0669891&markers=color:red%7Clabel:D%7C32.1364001%2C36.0707479&path=color:0x007bff%7Cweight:5%7C32.1117875%2C36.0669891%7C32.1364001%2C36.0707479&key=AIzaSyCyfwRXTwSTLOFQSQgN5p7QZgGJVZnEKq0","DurationToPassenger":"2","rideId":"1294","passengerId":"113172279072358305645","durationOfRideValue":"434","paymentAmount":"27.82","paymentMethod":"visa","isHaveSteps":"startEnd","step0":"32.12404505187645,36.06566168367863","step1":"","step2":"","step3":"","step4":"","passengerWalletBurc":"5.42","carType":"Speed","kazan":"8","startNameLocation":"4368+PPP\u060c \u0627\u0644\u0633\u062e\u0646\u0629\u060c \u0627\u0644\u0623\u0631\u062f\u0646","endNameLocation":"43PC+C4G\u060c \u0627\u0644\u0633\u062e\u0646\u0629\u060c \u0627\u0644\u0623\u0631\u062f\u0646","timeOfOrder":"2025-06-20T17:46:59.188875","totalPassenger":"27.82"} +[2025-06-20 17:47:00] Parsed Locations: passenger_lat=32.1117875, passenger_lng=36.0669891 | destination_lat=32.1364001, destination_lng=36.0707479 +[2025-06-20 17:47:00] SQL statement prepared successfully. Attempting to execute... +[2025-06-20 17:47:00] SUCCESS: Database insert was successful for rideId: 1294 +[2025-06-20 17:49:18] --- New Request Received --- +[2025-06-20 17:49:18] Incoming POST data: {"driver_id":"109270481246447459618","status":"Apply","passengerLocation":"32.1117875,36.0669891","passengerDestination":"32.0798703,36.0749472","Duration":"528","totalCost":"6.99","Distance":"5.64","name":"hamza","phone":"+201010101010","email":"hamzaayedflutter@gmail.com","WalletChecked":"true","tokenPassenger":"e4QWqe7K607luM7qUMOPCL:APA91bFjX4XBM4I5COJl9fyxCTKJ1ZQpT3vzY7iEbOTuT4uo0-OSCAt5zgVhlhw4aC33s-VhyucDnP1tQGFd9svaazQ8A_SKgolPk3owzug8dCsiXoPeJ0k","direction":"https:\/\/maps.googleapis.com\/maps\/api\/staticmap?size=600x150&maptype=roadmap&markers=color:green%7Clabel:S%7C32.1117875%2C36.0669891&markers=color:red%7Clabel:D%7C32.0798703%2C36.0749472&path=color:0x007bff%7Cweight:5%7C32.1117875%2C36.0669891%7C32.0798703%2C36.0749472&key=AIzaSyCyfwRXTwSTLOFQSQgN5p7QZgGJVZnEKq0","DurationToPassenger":"1","rideId":"1295","passengerId":"113172279072358305645","durationOfRideValue":"528","paymentAmount":"33.78","paymentMethod":"visa","isHaveSteps":"startEnd","step0":"32.09571771505668,36.06855209916831","step1":"","step2":"","step3":"","step4":"","passengerWalletBurc":"6.99","carType":"Speed","kazan":"8","startNameLocation":"4368+PPP\u060c \u0627\u0644\u0633\u062e\u0646\u0629\u060c \u0627\u0644\u0623\u0631\u062f\u0646","endNameLocation":"33HG+R6R\u060c \u0627\u0644\u0632\u0631\u0642\u0627\u0621\u060c \u0627\u0644\u0623\u0631\u062f\u0646","timeOfOrder":"2025-06-20T17:49:16.916262","totalPassenger":"33.78"} +[2025-06-20 17:49:18] Parsed Locations: passenger_lat=32.1117875, passenger_lng=36.0669891 | destination_lat=32.0798703, destination_lng=36.0749472 +[2025-06-20 17:49:18] SQL statement prepared successfully. Attempting to execute... +[2025-06-20 17:49:18] EXCEPTION: An unexpected error occurred: SQLSTATE[HY000]: General error: 1366 Incorrect string value: '\x84\x0DO\x0E@@...' for column 'passenger_location' at row 1 +[2025-06-20 17:52:06] --- New Request Received --- +[2025-06-20 17:52:06] Incoming POST data: {"driver_id":"109270481246447459618","status":"Apply","passengerLocation":"32.1117875,36.0669891","passengerDestination":"32.1364001,36.0707479","Duration":"434","totalCost":"5.42","Distance":"4.38","name":"hamza","phone":"+201010101010","email":"hamzaayedflutter@gmail.com","WalletChecked":"true","tokenPassenger":"e4QWqe7K607luM7qUMOPCL:APA91bFjX4XBM4I5COJl9fyxCTKJ1ZQpT3vzY7iEbOTuT4uo0-OSCAt5zgVhlhw4aC33s-VhyucDnP1tQGFd9svaazQ8A_SKgolPk3owzug8dCsiXoPeJ0k","direction":"https:\/\/maps.googleapis.com\/maps\/api\/staticmap?size=600x150&maptype=roadmap&markers=color:green%7Clabel:S%7C32.1117875%2C36.0669891&markers=color:red%7Clabel:D%7C32.1364001%2C36.0707479&path=color:0x007bff%7Cweight:5%7C32.1117875%2C36.0669891%7C32.1364001%2C36.0707479&key=AIzaSyCyfwRXTwSTLOFQSQgN5p7QZgGJVZnEKq0","DurationToPassenger":"5","rideId":"1296","passengerId":"113172279072358305645","durationOfRideValue":"434","paymentAmount":"27.82","paymentMethod":"visa","isHaveSteps":"startEnd","step0":"32.12404505187645,36.06566168367863","step1":"","step2":"","step3":"","step4":"","passengerWalletBurc":"5.42","carType":"Speed","kazan":"8","startNameLocation":"4368+PPP\u060c \u0627\u0644\u0633\u062e\u0646\u0629\u060c \u0627\u0644\u0623\u0631\u062f\u0646","endNameLocation":"43PC+C4G\u060c \u0627\u0644\u0633\u062e\u0646\u0629\u060c \u0627\u0644\u0623\u0631\u062f\u0646","timeOfOrder":"2025-06-20T17:52:05.601313","totalPassenger":"27.82"} +[2025-06-20 17:52:06] SQL statement prepared successfully. Attempting to execute... +[2025-06-20 17:52:06] EXCEPTION: An unexpected error occurred: SQLSTATE[22001]: String data, right truncated: 1406 Data too long for column 'passenger_location' at row 1 +[2025-06-20 17:53:56] --- New Request Received --- +[2025-06-20 17:53:56] Incoming POST data: {"driver_id":"109270481246447459618","status":"Apply","passengerLocation":"32.1117875,36.0669891","passengerDestination":"32.0798703,36.0749472","Duration":"528","totalCost":"6.99","Distance":"5.64","name":"hamza","phone":"+201010101010","email":"hamzaayedflutter@gmail.com","WalletChecked":"true","tokenPassenger":"e4QWqe7K607luM7qUMOPCL:APA91bFjX4XBM4I5COJl9fyxCTKJ1ZQpT3vzY7iEbOTuT4uo0-OSCAt5zgVhlhw4aC33s-VhyucDnP1tQGFd9svaazQ8A_SKgolPk3owzug8dCsiXoPeJ0k","direction":"https:\/\/maps.googleapis.com\/maps\/api\/staticmap?size=600x150&maptype=roadmap&markers=color:green%7Clabel:S%7C32.1117875%2C36.0669891&markers=color:red%7Clabel:D%7C32.0798703%2C36.0749472&path=color:0x007bff%7Cweight:5%7C32.1117875%2C36.0669891%7C32.0798703%2C36.0749472&key=AIzaSyCyfwRXTwSTLOFQSQgN5p7QZgGJVZnEKq0","DurationToPassenger":"3","rideId":"1297","passengerId":"113172279072358305645","durationOfRideValue":"528","paymentAmount":"33.78","paymentMethod":"visa","isHaveSteps":"startEnd","step0":"32.09571771505668,36.06855209916831","step1":"","step2":"","step3":"","step4":"","passengerWalletBurc":"6.99","carType":"Speed","kazan":"8","startNameLocation":"4368+PPP\u060c \u0627\u0644\u0633\u062e\u0646\u0629\u060c \u0627\u0644\u0623\u0631\u062f\u0646","endNameLocation":"33HG+R6R\u060c \u0627\u0644\u0632\u0631\u0642\u0627\u0621\u060c \u0627\u0644\u0623\u0631\u062f\u0646","timeOfOrder":"2025-06-20T17:53:56.195146","totalPassenger":"33.78"} +[2025-06-20 17:53:56] SQL statement prepared successfully. Attempting to execute... +[2025-06-20 17:53:56] SUCCESS: Database insert was successful for rideId: 1297 +[2025-06-21 23:49:45] --- New Request Received --- +[2025-06-21 23:49:45] Incoming POST data: {"driver_id":"109270481246447459618","status":"Apply","passengerLocation":"32.1117875,36.0669891","passengerDestination":"32.0798703,36.0749472","Duration":"528","totalCost":"6.99","Distance":"5.64","name":"hamza","phone":"+201010101010","email":"hamzaayedflutter@gmail.com","WalletChecked":"true","tokenPassenger":"e4QWqe7K607luM7qUMOPCL:APA91bFjX4XBM4I5COJl9fyxCTKJ1ZQpT3vzY7iEbOTuT4uo0-OSCAt5zgVhlhw4aC33s-VhyucDnP1tQGFd9svaazQ8A_SKgolPk3owzug8dCsiXoPeJ0k","direction":"https:\/\/maps.googleapis.com\/maps\/api\/staticmap?size=600x150&maptype=roadmap&markers=color:green%7Clabel:S%7C32.1117875%2C36.0669891&markers=color:red%7Clabel:D%7C32.0798703%2C36.0749472&path=color:0x007bff%7Cweight:5%7C32.1117875%2C36.0669891%7C32.0798703%2C36.0749472&key=AIzaSyCyfwRXTwSTLOFQSQgN5p7QZgGJVZnEKq0","DurationToPassenger":"1","rideId":"1298","passengerId":"113172279072358305645","durationOfRideValue":"528","paymentAmount":"29.81","paymentMethod":"visa","isHaveSteps":"startEnd","step0":"32.09571771505668,36.06855209916831","step1":"","step2":"","step3":"","step4":"","passengerWalletBurc":"6.99","carType":"Speed","kazan":"8","startNameLocation":"4368+PPP\u060c \u0627\u0644\u0633\u062e\u0646\u0629\u060c \u0627\u0644\u0623\u0631\u062f\u0646","endNameLocation":"33HG+R6R\u060c \u0627\u0644\u0632\u0631\u0642\u0627\u0621\u060c \u0627\u0644\u0623\u0631\u062f\u0646","timeOfOrder":"2025-06-21T23:49:42.340702","totalPassenger":"29.81"} +[2025-06-21 23:49:45] SQL statement prepared successfully. Attempting to execute... +[2025-06-21 23:49:45] SUCCESS: Database insert was successful for rideId: 1298 +[2025-07-08 18:34:43] --- New Request Received --- +[2025-07-08 18:34:43] Incoming POST data: {"driver_id":"109270481246447459618","status":"Apply","passengerLocation":"33.4934292,36.3335578","passengerDestination":"33.5165162,36.3174916","Duration":"842","totalCost":"6.32","Distance":"5.11","name":"hamza","phone":"+201010101010","email":"hamzaayedflutter@gmail.com","WalletChecked":"true","tokenPassenger":"e4QWqe7K607luM7qUMOPCL:APA91bFjX4XBM4I5COJl9fyxCTKJ1ZQpT3vzY7iEbOTuT4uo0-OSCAt5zgVhlhw4aC33s-VhyucDnP1tQGFd9svaazQ8A_SKgolPk3owzug8dCsiXoPeJ0k","direction":"https:\/\/maps.googleapis.com\/maps\/api\/staticmap?size=600x150&maptype=roadmap&markers=color:green%7Clabel:S%7C33.4934292%2C36.3335578&markers=color:red%7Clabel:D%7C33.5165162%2C36.3174916&path=color:0x007bff%7Cweight:5%7C33.4934292%2C36.3335578%7C33.5165162%2C36.3174916&key=AIzaSyCyfwRXTwSTLOFQSQgN5p7QZgGJVZnEKq0","DurationToPassenger":"11","rideId":"1315","passengerId":"113172279072358305645","durationOfRideValue":"842","paymentAmount":"34.78","paymentMethod":"visa","isHaveSteps":"startEnd","step0":"33.505157730332385,36.32586847990751","step1":"","step2":"","step3":"","step4":"","passengerWalletBurc":"6.32","carType":"Speed","kazan":"8","startNameLocation":"F8VM+C95\u060c \u062f\u0645\u0634\u0642\u060c \u0633\u0648\u0631\u064a\u0627","endNameLocation":"G888+MV4\u060c \u062f\u0645\u0634\u0642\u060c \u0633\u0648\u0631\u064a\u0627","timeOfOrder":"2025-07-08T18:34:14.861836","totalPassenger":"34.78"} +[2025-07-08 18:34:43] SQL statement prepared successfully. Attempting to execute... +[2025-07-08 18:34:43] SUCCESS: Database insert was successful for rideId: 1315 +[2025-07-27 16:51:54] --- New Request Received --- +[2025-07-27 16:51:54] Incoming POST data: {"driver_id":"34feffd3fa72d6bee56b","status":"Apply","passengerLocation":"32.1117875,36.0669891","passengerDestination":"32.1324686,36.0710479","Duration":"346","totalCost":"2767.81","Distance":"2.64","name":"hamza","phone":"963992952235","email":"963992952235@intaleqapp.com","WalletChecked":"false","tokenPassenger":"eskhRGH3gkzOmUQou8xJjg:APA91bGkbGdXRTuB3QTZ5BjHGiYLZNugjVlW7o89ck9KPDmJrT7v1DBSjdamRSLc4oqT56xNpZ_LgkFKhRWkprlLUvZx5HLCOTXMk0WBiQ0UibiSWqw10oI","direction":"https:\/\/maps.googleapis.com\/maps\/api\/staticmap?size=600x150&maptype=roadmap&markers=color:green%7Clabel:S%7C32.1117875%2C36.0669891&markers=color:red%7Clabel:D%7C32.1324686%2C36.0710479&path=color:0x007bff%7Cweight:5%7C32.1117875%2C36.0669891%7C32.1324686%2C36.0710479&key=QOsqYdTCyHNapgBsg2Kn-nTKbhaWhEAGOjUeU78","DurationToPassenger":"1","rideId":"2","passengerId":"0b24f04061d6853df4b9","durationOfRideValue":"346","paymentAmount":"10532.56","paymentMethod":"cash","isHaveSteps":"startEnd","step0":"32.122128403255125,36.07006452977657","step1":"","step2":"","step3":"","step4":"","passengerWalletBurc":"2767.81","carType":"Speed","kazan":"15","startNameLocation":"4368+PPP\u060c \u0627\u0644\u0633\u062e\u0646\u0629\u060c \u0627\u0644\u0623\u0631\u062f\u0646","endNameLocation":"43MC+374\u060c \u0627\u0644\u0633\u062e\u0646\u0629\u060c \u0627\u0644\u0623\u0631\u062f\u0646","timeOfOrder":"2025-07-27T16:51:53.436851","totalPassenger":"10532.56"} +[2025-07-27 16:51:54] SQL statement prepared successfully. Attempting to execute... +[2025-07-27 16:51:54] SUCCESS: Database insert was successful for rideId: 2 +[2025-08-05 12:13:28] --- New Request Received --- +[2025-08-05 12:13:28] Incoming POST data: {"driver_id":"34feffd3fa72d6bee56b","status":"Apply","passengerLocation":"32.1117131,36.067405","passengerDestination":"32.1278332,36.0702951","Duration":"253","totalCost":"2126.67","Distance":"2.03","name":"hamza","phone":"963992952235","email":"963992952235@intaleqapp.com","WalletChecked":"false","tokenPassenger":"dwDRLsWhZEIqum1oxaaTWY:APA91bHhImBb0-kyeRE8zP8jL-ps_K4Xt09g1YNRWbVx007FO4N9U4b9lPAoNOU029qM5-GU65doySW7dfsdQ_mDogqGtQnGtJz1uVOb_3_v-tuoL9irixo","direction":"https:\/\/maps.googleapis.com\/maps\/api\/staticmap?size=600x150&maptype=roadmap&markers=color:green%7Clabel:S%7C32.1117131%2C36.067405&markers=color:red%7Clabel:D%7C32.1278332%2C36.0702951&path=color:0x007bff%7Cweight:5%7C32.1117131%2C36.067405%7C32.1278332%2C36.0702951&key=AIzaSyCFsWBqvkXzk1Gb-bCGxwqTwJQKIeHjH64","DurationToPassenger":"3","rideId":"23","passengerId":"0b24f04061d6853df4b9","durationOfRideValue":"253","paymentAmount":"5938.31","paymentMethod":"cash","isHaveSteps":"startEnd","step0":"32.119773283888684,36.06956731528044","step1":"","step2":"","step3":"","step4":"","passengerWalletBurc":"2126.67","carType":"Speed","kazan":"15","startNameLocation":"4368+PPP\u060c \u0627\u0644\u0633\u062e\u0646\u0629\u060c \u0627\u0644\u0623\u0631\u062f\u0646","endNameLocation":"43H9+3V8\u060c \u0627\u0644\u0633\u062e\u0646\u0629\u060c \u0627\u0644\u0623\u0631\u062f\u0646","timeOfOrder":"2025-08-05T12:13:27.287381","totalPassenger":"5938.31"} +[2025-08-05 12:13:28] SQL statement prepared successfully. Attempting to execute... +[2025-08-05 12:13:28] SUCCESS: Database insert was successful for rideId: 23 +[2025-11-03 16:54:25] --- New Request Received --- +[2025-11-03 16:54:25] Incoming POST data: {"driver_id":"90393d64b8cd7488c4df","status":"Apply","passengerLocation":"33.4323,36.24325","passengerDestination":"33.4277,36.23907","Duration":"111","totalCost":"0.00","Distance":"0.72","name":"\u062d\u0645\u0632\u0647","phone":"963992952235","email":"963992952235@intaleqapp.com","WalletChecked":"false","tokenPassenger":"eznj5vRWRnqwKNtKJBaYNg:APA91bHhJ2DJ1KQa3KRx6wQtX8BkFHq6I_-dXGxT16p6pnV5AwI0bWOeiTJOI35VfTBaK4YSCKmAB4SsRnpARK0MTJ96xtpPmwAKfkvsZFga8OoGMeb3PmA","direction":"https:\/\/maps.googleapis.com\/maps\/api\/staticmap?size=600x150&maptype=roadmap&markers=color:green%7Clabel:S%7C33.4323%2C36.24325&markers=color:red%7Clabel:D%7C33.4277%2C36.23907&path=color:0x007bff%7Cweight:5%7C33.4323%2C36.24325%7C33.4277%2C36.23907&key=AIzaSyAPFR_XbRN0XZ5Iz3AYDjNYHGJG2s2QWwM","DurationToPassenger":"0","rideId":"5","passengerId":"f1e06c5908dcae1f5bf2","durationOfRideValue":"111","paymentAmount":"17280.00","paymentMethod":"cash","isHaveSteps":"startEnd","step0":"33.430078683118474,36.241159960627556","step1":"","step2":"","step3":"","step4":"","passengerWalletBurc":"0.00","carType":"Speed","kazan":"8","startNameLocation":"home","endNameLocation":"destination","timeOfOrder":"2025-11-03T16:54:23.416130","totalPassenger":"17280.00"} +[2025-11-03 16:54:25] SQL statement prepared successfully. Attempting to execute... +[2025-11-03 16:54:25] SUCCESS: Database insert was successful for rideId: 5 +[2025-11-18 18:07:16] --- New Request Received --- +[2025-11-18 18:07:16] Incoming POST data: {"driver_id":"ca60f0f65d7d6de23e5c","status":"Apply","passengerLocation":"36.16167,37.15408","passengerDestination":"36.2431,37.1496","Duration":"1254","totalCost":"0.00","Distance":"11.53","name":"George","phone":"447441447609","email":"sahrsa6@gmail.com","WalletChecked":"false","tokenPassenger":"eoHpQeewTbKL3ZU5ioLgP5:APA91bG0FhuTixe_kuDw49onLPdOjxdyRvmbT_TG5Va81lI7RqOpoHqaho6NThvybVJZaelkobwTDCZeC9WKLW-RytE1mUl3MfRiYiTPkHGZ2bCe9Raehtc","direction":"https:\/\/maps.googleapis.com\/maps\/api\/staticmap?size=600x150&maptype=roadmap&markers=color:green%7Clabel:S%7C36.16167%2C37.15408&markers=color:red%7Clabel:D%7C36.2431%2C37.1496&path=color:0x007bff%7Cweight:5%7C36.16167%2C37.15408%7C36.2431%2C37.1496&key=AIzaSyAPFR_XbRN0XZ5Iz3AYDjNYHGJG2s2QWwM","DurationToPassenger":"0","rideId":"124","passengerId":"21c382cde919795e93bb","durationOfRideValue":"1254","paymentAmount":"56469.00","paymentMethod":"cash","isHaveSteps":"startEnd","step0":"36.174937765937635,37.15724665671587","step1":"","step2":"","step3":"","step4":"","passengerWalletBurc":"0.00","carType":"Speed","kazan":"8","startNameLocation":"home","endNameLocation":"destination","timeOfOrder":"2025-11-18T18:07:15.160122","totalPassenger":"56469.00"} +[2025-11-18 18:07:16] SQL statement prepared successfully. Attempting to execute... +[2025-11-18 18:07:16] SUCCESS: Database insert was successful for rideId: 124 +[2025-11-20 10:07:35] --- New Request Received --- +[2025-11-20 10:07:35] Incoming POST data: {"driver_id":"34feffd3fa72d6bee56b","status":"Apply","passengerLocation":"33.4323,36.24325","passengerDestination":"33.43575,36.2483","Duration":"203","totalCost":"0.00","Distance":"0.96","name":"\u062d\u0645\u0632\u0647","phone":"963992952235","email":"963992952235@intaleqapp.com","WalletChecked":"false","tokenPassenger":"clZNZD6JTNeytuyvhqAjAs:APA91bEfEgnGduR3yy2ND3V57d1-qT_OS_A-gGimALeYNwSla-IVMBfYgfDYucNN5Whf0wJODjkOYuT03JLr5AJ4eqRXKxUbkbBis-GYFDdly_3o5nDEiWo","direction":"https:\/\/maps.googleapis.com\/maps\/api\/staticmap?size=600x150&maptype=roadmap&markers=color:green%7Clabel:S%7C33.4323%2C36.24325&markers=color:red%7Clabel:D%7C33.43575%2C36.2483&path=color:0x007bff%7Cweight:5%7C33.4323%2C36.24325%7C33.43575%2C36.2483&key=AIzaSyAPFR_XbRN0XZ5Iz3AYDjNYHGJG2s2QWwM","DurationToPassenger":"0","rideId":"143","passengerId":"849a9faf3e68c1aeb708","durationOfRideValue":"203","paymentAmount":"17280.00","paymentMethod":"cash","isHaveSteps":"startEnd","step0":"33.43403283445615,36.24521479010582","step1":"","step2":"","step3":"","step4":"","passengerWalletBurc":"0.00","carType":"Speed","kazan":"8","startNameLocation":"home","endNameLocation":"destination","timeOfOrder":"2025-11-20T10:07:33.481734","totalPassenger":"17280.00"} +[2025-11-20 10:07:35] SQL statement prepared successfully. Attempting to execute... +[2025-11-20 10:07:35] SUCCESS: Database insert was successful for rideId: 143 +[2025-11-25 20:16:54] --- New Request Received --- +[2025-11-25 20:16:54] Incoming POST data: {"driver_id":"7939eb03eb3b912ffb49","status":"Apply","passengerLocation":"35.12533,36.76929","passengerDestination":"35.13223,36.7536","Duration":"292","totalCost":"0.00","Distance":"2.81","name":"\u0639\u0628\u062f\u0627\u0644\u0644\u0647","phone":"963098198141","email":"bdallhlwany@gmail.com","WalletChecked":"false","tokenPassenger":"e-z9_8IRZEEsjwL3qFQAzN:APA91bHZEIWbF418RCnLeo3yVsGHkD7xDqoIHZzbw7tiXoImzSDi5KlOQbhIrEFxrtxNJ1uvStUk9jobI3k1p1LBr-Er7O2fhWG-P-HSHsChgGWoEjEZ15o","direction":"https:\/\/maps.googleapis.com\/maps\/api\/staticmap?size=600x150&maptype=roadmap&markers=color:green%7Clabel:S%7C35.12533%2C36.76929&markers=color:red%7Clabel:D%7C35.13223%2C36.7536&path=color:0x007bff%7Cweight:5%7C35.12533%2C36.76929%7C35.13223%2C36.7536&key=AIzaSyAPFR_XbRN0XZ5Iz3AYDjNYHGJG2s2QWwM","DurationToPassenger":"0","rideId":"229","passengerId":"64070ab2e6cfa4be0c58","durationOfRideValue":"292","paymentAmount":"17280.00","paymentMethod":"cash","isHaveSteps":"startEnd","step0":"35.1270850911746,36.76192492246628","step1":"","step2":"","step3":"","step4":"","passengerWalletBurc":"0.00","carType":"Speed","kazan":"8","startNameLocation":"\u062f\u0648\u0627\u0631 \u0627\u0644\u0627\u0633\u0643\u0627\u0646","endNameLocation":"\u062d\u0645\u0627\u0629","timeOfOrder":"2025-11-25T20:16:53.203785","totalPassenger":"17280.00"} +[2025-11-25 20:16:54] SQL statement prepared successfully. Attempting to execute... +[2025-11-25 20:16:54] SUCCESS: Database insert was successful for rideId: 229 +[2025-11-29 13:25:59] --- New Request Received --- +[2025-11-29 13:25:59] Incoming POST data: {"driver_id":"f48c50ef7bb6f55e710c","status":"Apply","passengerLocation":"33.43231,36.24297","passengerDestination":"33.43562,36.16933","Duration":"1419","totalCost":"0.00","Distance":"12.68","name":"\u062d\u0645\u0632\u0647","phone":"963992952235","email":"963992952235@intaleqapp.com","WalletChecked":"false","tokenPassenger":"eduBTsgC501SmEff3v4MGi:APA91bGf2PpOdgC3dEK7h3E4Kccu30tw7rbZeAJe7Co5JmHrrkwsz0pijAXFcjrbNkWQLI867bTogGGjL847OBNQ8FHSQJN9Gs1RY-GwaXh9ubffApwEdd0","direction":"https:\/\/maps.googleapis.com\/maps\/api\/staticmap?size=600x150&maptype=roadmap&markers=color:green%7Clabel:S%7C33.43231%2C36.24297&markers=color:red%7Clabel:D%7C33.43562%2C36.16933&path=color:0x007bff%7Cweight:5%7C33.43231%2C36.24297%7C33.43562%2C36.16933&key=AIzaSyAPFR_XbRN0XZ5Iz3AYDjNYHGJG2s2QWwM","DurationToPassenger":"0","rideId":"290","passengerId":"849a9faf3e68c1aeb708","durationOfRideValue":"1419","paymentAmount":"60710.00","paymentMethod":"cash","isHaveSteps":"startEnd","step0":"33.449831692690715,36.20406500995159","step1":"","step2":"","step3":"","step4":"","passengerWalletBurc":"0.00","carType":"Speed","kazan":"8","startNameLocation":"\u0623\u0634\u0631\u0641\u064a\u0629","endNameLocation":"\u062c\u062f\u064a\u062f\u0629 \u0639\u0631\u0637\u0648\u0632","timeOfOrder":"2025-11-29T13:25:58.938290","totalPassenger":"60710.00"} +[2025-11-29 13:25:59] SQL statement prepared successfully. Attempting to execute... +[2025-11-29 13:25:59] SUCCESS: Database insert was successful for rideId: 290 +[2025-12-01 10:28:09] --- New Request Received --- +[2025-12-01 10:28:09] Incoming POST data: {"driver_id":"b21737ec0edb0d02eb86","status":"Apply","passengerLocation":"33.4323,36.24329","passengerDestination":"33.41301,36.23664","Duration":"575","totalCost":"0.00","Distance":"3.64","name":"\u062d\u0645\u0632\u0647","phone":"963992952235","email":"963992952235@intaleqapp.com","WalletChecked":"false","tokenPassenger":"eduBTsgC501SmEff3v4MGi:APA91bGf2PpOdgC3dEK7h3E4Kccu30tw7rbZeAJe7Co5JmHrrkwsz0pijAXFcjrbNkWQLI867bTogGGjL847OBNQ8FHSQJN9Gs1RY-GwaXh9ubffApwEdd0","direction":"https:\/\/maps.googleapis.com\/maps\/api\/staticmap?size=600x150&maptype=roadmap&markers=color:green%7Clabel:S%7C33.4323%2C36.24329&markers=color:red%7Clabel:D%7C33.41301%2C36.23664&path=color:0x007bff%7Cweight:5%7C33.4323%2C36.24329%7C33.41301%2C36.23664&key=AIzaSyAPFR_XbRN0XZ5Iz3AYDjNYHGJG2s2QWwM","DurationToPassenger":"0","rideId":"314","passengerId":"849a9faf3e68c1aeb708","durationOfRideValue":"575","paymentAmount":"19754.00","paymentMethod":"cash","isHaveSteps":"startEnd","step0":"33.42334065389521,36.23577006161213","step1":"","step2":"","step3":"","step4":"","passengerWalletBurc":"0.00","carType":"Speed","kazan":"8","startNameLocation":"\u0623\u0634\u0631\u0641\u064a\u0629","endNameLocation":"\u0627\u0644\u0634\u064a\u062e \u0625\u0628\u0631\u0627\u0647\u064a\u0645","timeOfOrder":"2025-12-01T10:28:11.316238","totalPassenger":"19754.00"} +[2025-12-01 10:28:09] SQL statement prepared successfully. Attempting to execute... +[2025-12-01 10:28:09] SUCCESS: Database insert was successful for rideId: 314 +[2026-01-08 01:45:12] --- New Request Received --- +[2026-01-08 01:45:12] Incoming POST data: {"driver_id":"34feffd3fa72d6bee56b","status":"Apply","passengerLocation":"31.990668","passengerDestination":"35.877682","Duration":"35.930359","totalCost":"3.50","Distance":"8.5 km","name":"Hamza Passenger","phone":"0791234567","email":"client@email.com","WalletChecked":"false","tokenPassenger":"PASSENGER_FCM_TOKEN_XYZ","direction":"","DurationToPassenger":"5 min","rideId":"9999","passengerId":"55","durationOfRideValue":"20 min","paymentAmount":"3.50","paymentMethod":"cash","isHaveSteps":"false","step0":"","step1":"","step2":"","step3":"","step4":"","passengerWalletBurc":"3.50","carType":"speed","kazan":"2.75","startNameLocation":"\u0627\u0644\u062c\u0627\u0645\u0639\u0629 \u0627\u0644\u0623\u0631\u062f\u0646\u064a\u0629 - \u0627\u0644\u0628\u0648\u0627\u0628\u0629 \u0627\u0644\u0631\u0626\u064a\u0633\u064a\u0629","endNameLocation":"\u0627\u0644\u0639\u0628\u062f\u0644\u064a \u0645\u0648\u0644 - \u0627\u0644\u0628\u0648\u0644\u064a\u0641\u0627\u0631\u062f","timeOfOrder":"2026-01-08T01:45:11.370578","totalPassenger":"3.50"} +[2026-01-08 01:45:12] SQL statement prepared successfully. Attempting to execute... +[2026-01-08 01:45:12] EXCEPTION: An unexpected error occurred: SQLSTATE[23000]: Integrity constraint violation: 1048 Column 'direction_url' cannot be null +[2026-01-08 21:23:04] --- New Request Received --- +[2026-01-08 21:23:04] Incoming POST data: {"driver_id":"34feffd3fa72d6bee56b","status":"Apply","passengerLocation":"32.073743222739","passengerDestination":"36.096920477709","Duration":"35.930359","totalCost":"3.50","Distance":"8.9 km","name":"Hamza Passenger","phone":"0791234567","email":"client@email.com","WalletChecked":"false","tokenPassenger":"PASSENGER_FCM_TOKEN_XYZ","direction":"","DurationToPassenger":"5 min","rideId":"9999","passengerId":"55","durationOfRideValue":"18 min","paymentAmount":"53.50","paymentMethod":"cash","isHaveSteps":"false","step0":"","step1":"","step2":"","step3":"","step4":"","passengerWalletBurc":"3.50","carType":"speed","kazan":"2.75","startNameLocation":"\u0627\u0644\u062c\u0627\u0645\u0639\u0629 \u0627\u0644\u0623\u0631\u062f\u0646\u064a\u0629 - \u0627\u0644\u0628\u0648\u0627\u0628\u0629 \u0627\u0644\u0631\u0626\u064a\u0633\u064a\u0629","endNameLocation":"\u0627\u0644\u0639\u0628\u062f\u0644\u064a \u0645\u0648\u0644 - \u0627\u0644\u0628\u0648\u0644\u064a\u0641\u0627\u0631\u062f","timeOfOrder":"2026-01-08T21:23:03.507502","totalPassenger":"53.50"} +[2026-01-08 21:23:04] SQL statement prepared successfully. Attempting to execute... +[2026-01-08 21:23:04] EXCEPTION: An unexpected error occurred: SQLSTATE[23000]: Integrity constraint violation: 1048 Column 'direction_url' cannot be null +[2026-01-22 14:29:49] --- New Request Received --- +[2026-01-22 14:29:49] Incoming POST data: {"driver_id":"34feffd3fa72d6bee56b","status":"Apply","passengerLocation":"startLocation","passengerDestination":"endLocation","Duration":"durationToPassenger","totalCost":"totalCost","Distance":"distance","name":"passengerName","phone":"passengerPhone","email":"email","WalletChecked":"WalletChecked","tokenPassenger":"passengerToken","direction":"","DurationToPassenger":"DurationToPassenger","rideId":"rideId","passengerId":"passengerId","durationOfRideValue":"durationOfRideValue","paymentAmount":"paymentAmount","paymentMethod":"cash","isHaveSteps":"isHaveSteps","step0":"step0","step1":"step1","step2":"step2","step3":"step3","step4":"step4","passengerWalletBurc":"totalCost","carType":"carType","kazan":"kazan","startNameLocation":"startNameLocation","endNameLocation":"endNameLocation","timeOfOrder":"2026-01-22T14:29:46.887096","totalPassenger":"paymentAmount"} +[2026-01-22 14:29:49] SQL statement prepared successfully. Attempting to execute... +[2026-01-22 14:29:49] EXCEPTION: An unexpected error occurred: SQLSTATE[23000]: Integrity constraint violation: 1048 Column 'direction_url' cannot be null +[2026-01-22 14:31:31] --- New Request Received --- +[2026-01-22 14:31:31] Incoming POST data: {"driver_id":"34feffd3fa72d6bee56b","status":"Apply","passengerLocation":"startLocation","passengerDestination":"endLocation","Duration":"durationToPassenger","totalCost":"totalCost","Distance":"distance","name":"passengerName","phone":"passengerPhone","email":"email","WalletChecked":"WalletChecked","tokenPassenger":"passengerToken","direction":"","DurationToPassenger":"DurationToPassenger","rideId":"rideId","passengerId":"passengerId","durationOfRideValue":"durationOfRideValue","paymentAmount":"paymentAmount","paymentMethod":"cash","isHaveSteps":"isHaveSteps","step0":"step0","step1":"step1","step2":"step2","step3":"step3","step4":"step4","passengerWalletBurc":"totalCost","carType":"carType","kazan":"kazan","startNameLocation":"startNameLocation","endNameLocation":"endNameLocation","timeOfOrder":"2026-01-22T14:31:29.409730","totalPassenger":"paymentAmount"} +[2026-01-22 14:31:31] SQL statement prepared successfully. Attempting to execute... +[2026-01-22 14:31:31] EXCEPTION: An unexpected error occurred: SQLSTATE[23000]: Integrity constraint violation: 1048 Column 'direction_url' cannot be null +[2026-01-22 14:39:59] --- New Request Received --- +[2026-01-22 14:39:59] Incoming POST data: {"driver_id":"34feffd3fa72d6bee56b","status":"Apply","passengerLocation":"startLocation","passengerDestination":"endLocation","Duration":"durationToPassenger","totalCost":"totalCost","Distance":"distance","name":"passengerName","phone":"passengerPhone","email":"email","WalletChecked":"WalletChecked","tokenPassenger":"passengerToken","direction":"","DurationToPassenger":"DurationToPassenger","rideId":"rideId","passengerId":"passengerId","durationOfRideValue":"durationOfRideValue","paymentAmount":"paymentAmount","paymentMethod":"cash","isHaveSteps":"isHaveSteps","step0":"step0","step1":"step1","step2":"step2","step3":"step3","step4":"step4","passengerWalletBurc":"totalCost","carType":"carType","kazan":"kazan","startNameLocation":"startNameLocation","endNameLocation":"endNameLocation","timeOfOrder":"2026-01-22T14:39:56.986847","totalPassenger":"paymentAmount"} +[2026-01-22 14:39:59] SQL statement prepared successfully. Attempting to execute... +[2026-01-22 14:39:59] EXCEPTION: An unexpected error occurred: SQLSTATE[23000]: Integrity constraint violation: 1048 Column 'direction_url' cannot be null +[2026-02-20 16:39:52] --- New Request Received --- +[2026-02-20 16:39:52] Incoming POST data: {"driver_id":"eefed62b0aeb9e304efd","status":"Apply","passengerLocation":"32.11172","passengerDestination":"36.06738","Duration":"36.06738","totalCost":"173.00","Distance":"0.0","name":"\u062d\u0645\u0632\u0647 \u0639\u0627\u064a\u062f","phone":"963992952235","email":"963992952235@intaleqapp.com","WalletChecked":"false","tokenPassenger":"e9X4q6nL3EuRu2OIsWJ-A2:APA91bE223jfIOjWbSrjF41HZjeZVWc-jm2NAg2sXTmoyHUkoC10uycmxl0Ne4WcE8aojjTm7fWTPm5aEFi1xJKN1Wy0vgupUmSD2LcKBcE1Cym_GTvikME","direction":"","DurationToPassenger":"","rideId":"782","passengerId":"849a9faf3e68c1aeb708","durationOfRideValue":"","paymentAmount":"173.00","paymentMethod":"cash","isHaveSteps":"false","step0":"32.11180279564045,36.067136228084564","step1":"","step2":"","step3":"","step4":"","passengerWalletBurc":"173.00","carType":"Fixed Price","kazan":"0.00","startNameLocation":"\u0648\u0627\u062f\u064a \u0623\u0643\u064a\u062f\u0631","endNameLocation":"\u0648\u0627\u062f\u064a \u0623\u0643\u064a\u062f\u0631","timeOfOrder":"2026-02-20T16:40:10.040464","totalPassenger":"173.00"} +[2026-02-20 16:39:52] SQL statement prepared successfully. Attempting to execute... +[2026-02-20 16:39:52] EXCEPTION: An unexpected error occurred: SQLSTATE[23000]: Integrity constraint violation: 1048 Column 'direction_url' cannot be null diff --git a/backend/ride/overLay/add.php b/backend/ride/overLay/add.php new file mode 100755 index 0000000..3989e6b --- /dev/null +++ b/backend/ride/overLay/add.php @@ -0,0 +1,122 @@ +prepare($sql); + + // --- التعديل الرئيسي هنا في bindValue --- + $stmt->bindValue(':rideId', $data['rideId']); + $stmt->bindValue(':driver_id', $data['driver_id']); + $stmt->bindValue(':passengerId', $data['passengerId']); + + // Bind the locations as simple strings + $stmt->bindValue(':passengerLocation', $data['passengerLocation']); + $stmt->bindValue(':passengerDestination', $data['passengerDestination']); + + // باقي الـ bindValue تبقى كما هي + $stmt->bindValue(':Duration', intval($data['Duration']), PDO::PARAM_INT); + $stmt->bindValue(':DurationToPassenger', intval($data['DurationToPassenger']), PDO::PARAM_INT); + $stmt->bindValue(':durationOfRideValue', intval($data['durationOfRideValue']), PDO::PARAM_INT); + $stmt->bindValue(':Distance', (float)$data['Distance']); + $stmt->bindValue(':totalCost', (float)$data['totalCost']); + $stmt->bindValue(':paymentAmount', (float)$data['paymentAmount']); + $stmt->bindValue(':paymentMethod', $data['paymentMethod']); + $stmt->bindValue(':WalletChecked', $data['WalletChecked'] === 'true' ? 1 : 0, PDO::PARAM_INT); + $stmt->bindValue(':isHaveSteps', !empty($data['isHaveSteps']) ? 1 : 0, PDO::PARAM_INT); + $stmt->bindValue(':step0', $data['step0']); + $stmt->bindValue(':step1', $data['step1']); + $stmt->bindValue(':step2', $data['step2']); + $stmt->bindValue(':step3', $data['step3']); + $stmt->bindValue(':step4', $data['step4']); + $stmt->bindValue(':passengerWalletBurc', (float)$data['passengerWalletBurc']); + $stmt->bindValue(':tokenPassenger', $data['tokenPassenger']); + $stmt->bindValue(':name', $data['name']); + $stmt->bindValue(':phone', $data['phone']); + $stmt->bindValue(':email', $data['email']); + $stmt->bindValue(':startNameLocation', $data['startNameLocation']); + $stmt->bindValue(':endNameLocation', $data['endNameLocation']); + $stmt->bindValue(':carType', $data['carType']); + $stmt->bindValue(':kazan', (float)$data['kazan']); + $stmt->bindValue(':direction', $data['direction']); + $stmt->bindValue(':timeOfOrder', $data['timeOfOrder']); + $stmt->bindValue(':totalPassenger', intval($data['totalPassenger']), PDO::PARAM_INT); + + log_message("SQL statement prepared successfully. Attempting to execute..."); + + if ($stmt->execute()) { + log_message("SUCCESS: Database insert was successful for rideId: " . $data['rideId']); + jsonSuccess(null, "نجحت الإضافة"); + } else { + $errorInfo = $stmt->errorInfo(); + $error_msg = "FAILURE: Database insert failed. PDO Error: " . implode(" | ", $errorInfo); + log_message($error_msg); + jsonError("failure"); + } +} catch (Exception $e) { + $error_msg = "EXCEPTION: An unexpected error occurred: " . $e->getMessage(); + log_message($error_msg); + jsonError("failure"); +} + +?> \ No newline at end of file diff --git a/backend/ride/overLay/deletArgumets.php b/backend/ride/overLay/deletArgumets.php new file mode 100755 index 0000000..ba779f5 --- /dev/null +++ b/backend/ride/overLay/deletArgumets.php @@ -0,0 +1,32 @@ +prepare($sql); +$stmt->bindParam(':driver_id', $driver_id); +$stmt->execute(); + +// Check if any rows were actually deleted +$count = $stmt->rowCount(); + +if ($count > 0) { + jsonSuccess(null, "Record deleted successfully"); +} else { + // Failure occurs if no record exists OR if the record is older than 2 minutes + jsonError('No data found to delete (or time limit exceeded)'); +} +?> \ No newline at end of file diff --git a/backend/ride/overLay/get.php b/backend/ride/overLay/get.php new file mode 100755 index 0000000..434813e --- /dev/null +++ b/backend/ride/overLay/get.php @@ -0,0 +1,40 @@ += NOW() - INTERVAL 2 MINUTE +ORDER BY + r.created_at DESC +LIMIT 1; +"; + +$stmt = $con->prepare($sql); +$stmt->bindParam(':driver_id', $driver_id, PDO::PARAM_INT); +$stmt->execute(); + +$row = $stmt->fetch(PDO::FETCH_ASSOC); + +// 3) إرجاع النتيجة أو رسالة خطأ +if ($row) { + jsonSuccess($row); +} else { + jsonError("Ride not found."); +} \ No newline at end of file diff --git a/backend/ride/overLay/getArgumentAfterAppliedFromBackground.php b/backend/ride/overLay/getArgumentAfterAppliedFromBackground.php new file mode 100755 index 0000000..dc22662 --- /dev/null +++ b/backend/ride/overLay/getArgumentAfterAppliedFromBackground.php @@ -0,0 +1,38 @@ +prepare($sql); +$stmt->bindParam(':driver_id', $driver_id); +$stmt->execute(); + +$row = $stmt->fetch(PDO::FETCH_ASSOC); +if ($row) { + // convert WKT POINT back to "lat,lng" + foreach (['passenger_location', 'passenger_destination'] as $f) { + if (!empty($row["{$f}_wkt"])) { + // WKT format: POINT(lng lat) + preg_match('/POINT\(([^ ]+) ([^ ]+)\)/', $row["{$f}_wkt"], $m); + $row[$f] = "{$m[2]},{$m[1]}"; + } + unset($row["{$f}_wkt"]); + } + jsonSuccess($row); +} else { + jsonError('No data found'); +} \ No newline at end of file diff --git a/backend/ride/passengerWallet/add.php b/backend/ride/passengerWallet/add.php new file mode 100644 index 0000000..a2b1b47 --- /dev/null +++ b/backend/ride/passengerWallet/add.php @@ -0,0 +1,32 @@ +prepare("SELECT * FROM payment_tokens_passenger WHERE token = :token AND isUsed = FALSE"); +$stmt->execute([':token' => $token]); + +$tokenData = $stmt->fetch(); + +if ($tokenData) { + // Insert into passengerWallet securely using prepared statements + $sql = "INSERT INTO `passengerWallet` (`passenger_id`, `balance`) VALUES (:passenger_id, :balance)"; + $stmt = $con->prepare($sql); + $stmt->execute([':passenger_id' => $passenger_id, ':balance' => $balance]); + + if ($stmt->rowCount() > 0) { + // Mark the token as used + $updateTokenStmt = $con->prepare("UPDATE payment_tokens_passenger SET isUsed = TRUE WHERE token = :token"); + $updateTokenStmt->execute([':token' => $token]); + + jsonSuccess(null, "Wallet record created successfully"); + } else { + jsonError("Failed to create wallet record"); + } +} else { + jsonError("Invalid or already used token"); +} +?> \ No newline at end of file diff --git a/backend/ride/passengerWallet/addPaymentTokenPassenger.php b/backend/ride/passengerWallet/addPaymentTokenPassenger.php new file mode 100644 index 0000000..671fe3b --- /dev/null +++ b/backend/ride/passengerWallet/addPaymentTokenPassenger.php @@ -0,0 +1,53 @@ +prepare("INSERT INTO payment_tokens_passenger (token, passengerId, dateCreated, amount) VALUES (?, ?, NOW(), ?)"); + +try { + $stmt->execute([$token, $passengerId, $amount]); + if ($stmt->rowCount() > 0) { + jsonSuccess($token); + } else { + jsonError("Failed to save record"); + } +} catch (PDOException $e) { + jsonError("Database error: " . $e->getMessage()); +} + +// Rest of your code including the generateSecureToken function... + +// Rest of your code including the generateSecureToken function... + +function generateSecureToken($passengerId, $amount, $dateCreated) { + global $secretKey; + // Concatenate the parameters + $data = $passengerId . $amount . $dateCreated; + + // Add the secret key from the environment variable + $data .= $secretKey; + + // Generate a hash + $hash = hash('sha256', $data); + + // Add some randomness + $randomBytes = bin2hex(random_bytes(16)); + + // Combine hash and random bytes + $token = $hash . $randomBytes; + + // Truncate to a reasonable length (e.g., 64 characters) + return substr($token, 0, 64); +} \ No newline at end of file diff --git a/backend/ride/passengerWallet/delete.php b/backend/ride/passengerWallet/delete.php new file mode 100644 index 0000000..e74cc79 --- /dev/null +++ b/backend/ride/passengerWallet/delete.php @@ -0,0 +1,17 @@ +prepare($sql); +$stmt->execute(); + +if ($stmt->rowCount() > 0) { + // Print a success message + jsonSuccess($message = "Wallet record deleted successfully"); +} else { + // Print a failure message + jsonError($message = "Failed to delete wallet record"); +} +?> diff --git a/backend/ride/passengerWallet/error_log b/backend/ride/passengerWallet/error_log new file mode 100644 index 0000000..e69de29 diff --git a/backend/ride/passengerWallet/get.php b/backend/ride/passengerWallet/get.php new file mode 100644 index 0000000..590e180 --- /dev/null +++ b/backend/ride/passengerWallet/get.php @@ -0,0 +1,32 @@ +prepare($sql); +$stmt->execute(); + +if ($stmt->rowCount() > 0) { + // Fetch the record + $row = $stmt->fetchAll(PDO::FETCH_ASSOC); + + jsonSuccess($row); + +} + else{ + // Print a failure message + jsonError($message = "No wallet record found"); +} +?> \ No newline at end of file diff --git a/backend/ride/passengerWallet/getAllPassengerTransaction.php b/backend/ride/passengerWallet/getAllPassengerTransaction.php new file mode 100644 index 0000000..536e672 --- /dev/null +++ b/backend/ride/passengerWallet/getAllPassengerTransaction.php @@ -0,0 +1,40 @@ +prepare($sql); +$stmt->execute(); + +if ($stmt->rowCount() > 0) { + // Fetch the record + $row = $stmt->fetchAll(PDO::FETCH_ASSOC); + + jsonSuccess($row); + +} + else{ + // Print a failure message + jsonError($message = "No wallet record found"); +} +?> \ No newline at end of file diff --git a/backend/ride/passengerWallet/getPassengerWalletArchive.php b/backend/ride/passengerWallet/getPassengerWalletArchive.php new file mode 100644 index 0000000..d0b3bfc --- /dev/null +++ b/backend/ride/passengerWallet/getPassengerWalletArchive.php @@ -0,0 +1,30 @@ += DATE_SUB(NOW(), INTERVAL 1 MONTH) +ORDER BY + `passengerWallet`.`id` +DESC"; +$stmt = $con->prepare($sql); +$stmt->execute(); + +if ($stmt->rowCount() > 0) { + // Fetch the record + $row = $stmt->fetchAll(PDO::FETCH_ASSOC); + + jsonSuccess($row); + +} + else{ + // Print a failure message + jsonError($message = "No wallet record found"); +} +?> \ No newline at end of file diff --git a/backend/ride/passengerWallet/getWalletByPassenger.php b/backend/ride/passengerWallet/getWalletByPassenger.php new file mode 100755 index 0000000..81432af --- /dev/null +++ b/backend/ride/passengerWallet/getWalletByPassenger.php @@ -0,0 +1,34 @@ +prepare($sql); +$stmt->execute(); + +if ($stmt->rowCount() > 0) { + // Fetch the record + $row = $stmt->fetchAll(PDO::FETCH_ASSOC); + + jsonSuccess($row); + +} + else{ + // Print a failure message + jsonError($message = "No wallet record found"); +} +?> \ No newline at end of file diff --git a/backend/ride/passengerWallet/update.php b/backend/ride/passengerWallet/update.php new file mode 100644 index 0000000..adf5ab4 --- /dev/null +++ b/backend/ride/passengerWallet/update.php @@ -0,0 +1,18 @@ + +prepare($sql); +$stmt->execute(); + +if ($stmt->rowCount() > 0) { + // Print a success message + jsonSuccess($message = "Wallet record updated successfully"); +} else { + // Print a failure message + jsonError($message = "Failed to update wallet record"); +} +?> \ No newline at end of file diff --git a/backend/ride/payment/add.php b/backend/ride/payment/add.php new file mode 100644 index 0000000..7701a13 --- /dev/null +++ b/backend/ride/payment/add.php @@ -0,0 +1,42 @@ +prepare("SELECT * FROM payment_tokens WHERE token = :token AND isUsed = FALSE"); +$stmt->execute(array( + ':token' => $token +)); + +$tokenData = $stmt->fetch(); + +if ($tokenData) { + +$sql = "INSERT INTO `payments` (`id`,`amount`, `payment_method`, `passengerID`, `rideId`, `driverID`) + VALUES ( SHA2(UUID(), 256),'$amount', '$payment_method', '$passengerID', '$rideId', '$driverID')"; +$stmt = $con->prepare($sql); +$stmt->execute(); + +if ($stmt->rowCount() > 0) { + // Print a success message + jsonSuccess(null, "Payment record created successfully"); + // Mark the token as used in the database + $stmt = $con->prepare("UPDATE payment_tokens SET isUsed = TRUE WHERE id = :tokenID"); + $stmt->execute(array( + ':tokenID' => $tokenData['id'] + )); + } else { + // Print a failure message + jsonError("Failed to save record"); + } +} else { + jsonError("Invalid or already used token"); +} \ No newline at end of file diff --git a/backend/ride/payment/delete.php b/backend/ride/payment/delete.php new file mode 100644 index 0000000..e69de29 diff --git a/backend/ride/payment/error_log b/backend/ride/payment/error_log new file mode 100644 index 0000000..e69de29 diff --git a/backend/ride/payment/get.php b/backend/ride/payment/get.php new file mode 100644 index 0000000..fa10d57 --- /dev/null +++ b/backend/ride/payment/get.php @@ -0,0 +1,61 @@ +prepare($sql); +$stmt->execute(); + +if ($stmt->rowCount() > 0) { + // Fetch the record + $row = $stmt->fetchAll(PDO::FETCH_ASSOC); + $count = $stmt->rowCount(); + + // $response = array( + + // "message" => "Payment data saved successfully", + // "id" => "0", + // "count" => $count, + // "data" => $rows + // ); + + // echo json_encode($response); + jsonSuccess($row); + +} + else{ + // Print a failure message + jsonError($message = "No wallet record found"); +} +?> \ No newline at end of file diff --git a/backend/ride/payment/getAllPayment.php b/backend/ride/payment/getAllPayment.php new file mode 100644 index 0000000..8b5ea9b --- /dev/null +++ b/backend/ride/payment/getAllPayment.php @@ -0,0 +1,64 @@ + CURRENT_DATE() - INTERVAL 1 WEEK + ) AS total_amount_last_week +FROM + dual +LIMIT 1; + + + "; +$stmt = $con->prepare($sql); +$stmt->execute(); + +if ($stmt->rowCount() > 0) { + // Fetch the record + $row = $stmt->fetchAll(PDO::FETCH_ASSOC); + + jsonSuccess($row); + +} + else{ + // Print a failure message + jsonError($message = "No wallet record found"); +} +?> \ No newline at end of file diff --git a/backend/ride/payment/getAllPaymentVisa.php b/backend/ride/payment/getAllPaymentVisa.php new file mode 100644 index 0000000..d4d80c8 --- /dev/null +++ b/backend/ride/payment/getAllPaymentVisa.php @@ -0,0 +1,39 @@ +prepare($sql); +$stmt->execute(); + +if ($stmt->rowCount() > 0) { + // Fetch the record + $row = $stmt->fetchAll(PDO::FETCH_ASSOC); + + jsonSuccess($row); + +} + else{ + // Print a failure message + jsonError($message = "No wallet record found"); +} +?> \ No newline at end of file diff --git a/backend/ride/payment/getCountRide.php b/backend/ride/payment/getCountRide.php new file mode 100644 index 0000000..547ddd2 --- /dev/null +++ b/backend/ride/payment/getCountRide.php @@ -0,0 +1,29 @@ += CURDATE(); +"; +$stmt = $con->prepare($sql); +$stmt->execute(); + +if ($stmt->rowCount() > 0) { + // Fetch the record + $row = $stmt->fetchAll(PDO::FETCH_ASSOC); + + + jsonSuccess($row); + +} + else{ + // Print a failure message + jsonError($message = "No wallet record found"); +} +?> \ No newline at end of file diff --git a/backend/ride/payment/update.php b/backend/ride/payment/update.php new file mode 100644 index 0000000..6c0ca68 --- /dev/null +++ b/backend/ride/payment/update.php @@ -0,0 +1,72 @@ + $id]; + +// Check if each column is set in the request and add it to the array +if (isset($_POST["amount"])) { + $amount = filterRequest("amount"); + $columnValues[] = "`amount` = :amount"; + $params[':amount'] = $amount; +} + +if (isset($_POST["payment_method"])) { + $payment_method = filterRequest("payment_method"); + $columnValues[] = "`payment_method` = :payment_method"; + $params[':payment_method'] = $payment_method; +} + +if (isset($_POST["passengerID"])) { + $passengerID = filterRequest("passengerID"); + $columnValues[] = "`passengerID` = :passengerID"; + $params[':passengerID'] = $passengerID; +} + +if (isset($_POST["rideId"])) { + $rideId = filterRequest("rideId"); + $columnValues[] = "`rideId` = :rideId"; + $params[':rideId'] = $rideId; +} + +if (isset($_POST["driverID"])) { + $driverID = filterRequest("driverID"); + $columnValues[] = "`driverID` = :driverID"; + $params[':driverID'] = $driverID; +} + +if (isset($_POST["created_at"])) { + $created_at = filterRequest("created_at"); + $columnValues[] = "`created_at` = :created_at"; + $params[':created_at'] = $created_at; +} + +if (isset($_POST["updated_at"])) { + $updated_at = filterRequest("updated_at"); + $columnValues[] = "`updated_at` = :updated_at"; + $params[':updated_at'] = $updated_at; +} + +if (isset($_POST["isGiven"])) { + $isGiven = filterRequest("isGiven"); + $columnValues[] = "`isGiven` = :isGiven"; + $params[':isGiven'] = $isGiven; +} + +// Construct the SET clause of the update query using the column-value pairs +$sql = "UPDATE `payments` SET $setClause WHERE `id` = :id"; + +$stmt = $con->prepare($sql); +$stmt->execute($params); + +if ($stmt->rowCount() > 0) { + // Print a success message + jsonSuccess($message = "Payment data updated successfully"); +} else { + // Print a failure message + jsonError($message = "Failed to update payment data"); +} +?> \ No newline at end of file diff --git a/backend/ride/payment/updatePaymetToPaid.php b/backend/ride/payment/updatePaymetToPaid.php new file mode 100644 index 0000000..53ddd99 --- /dev/null +++ b/backend/ride/payment/updatePaymetToPaid.php @@ -0,0 +1,19 @@ +prepare($sql); +$stmt->execute(); + +if ($stmt->rowCount() > 0) { + // Print a success message + jsonSuccess($message = "Payment data updated successfully"); +} else { + // Print a failure message + jsonError($message = "Failed to update payment data"); +} +?> \ No newline at end of file diff --git a/backend/ride/places/add.php b/backend/ride/places/add.php new file mode 100755 index 0000000..264a2a5 --- /dev/null +++ b/backend/ride/places/add.php @@ -0,0 +1,26 @@ +prepare($sql); +$stmt->execute(); + +if ($stmt->rowCount() > 0) { + // Print a success message + jsonSuccess($message = 'Place inserted successfully'); +} else { + // Print a failure message for duplicate + jsonSuccess($message = 'Duplicate place, no new entry added'); +} +?> \ No newline at end of file diff --git a/backend/ride/places/error_log b/backend/ride/places/error_log new file mode 100644 index 0000000..e69de29 diff --git a/backend/ride/places_syria/add.php b/backend/ride/places_syria/add.php new file mode 100755 index 0000000..e69de29 diff --git a/backend/ride/places_syria/get.php b/backend/ride/places_syria/get.php new file mode 100755 index 0000000..a22d489 --- /dev/null +++ b/backend/ride/places_syria/get.php @@ -0,0 +1,99 @@ +setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); +} catch (PDOException $e) { + // تجاهل الخطأ إذا كان قد تم تعيينه بالفعل +} + +// 1. استقبال المدخلات باستخدام دالة filterRequest الخاصة بك +$query = trim((string) filterRequest("query")); +$latMin = filterRequest("lat_min"); +$latMax = filterRequest("lat_max"); +$lngMin = filterRequest("lng_min"); +$lngMax = filterRequest("lng_max"); + +// 2. التحقق من المدخلات +if ($query === "" || $latMin === null || $latMax === null || $lngMin === null || $lngMax === null) { + jsonError("Missing required parameters: query, lat_min, lat_max, lng_min, lng_max"); + exit; +} + +// تحويل الإحداثيات إلى أرقام عشرية +$latMin = (float) $latMin; +$latMax = (float) $latMax; +$lngMin = (float) $lngMin; +$lngMax = (float) $lngMax; + + +// 3. بناء الاستعلام الذكي (الجزء المحدّث) + +// تحضير كلمة البحث لوضعها في MATCH() AGAINST() +// نضيف '*' لكل كلمة للبحث عن الكلمات التي تبدأ بهذا الجزء +$search_terms = preg_split('/\s+/', $query, -1, PREG_SPLIT_NO_EMPTY); +$search_boolean = ''; +foreach ($search_terms as $term) { + $search_boolean .= '+' . $term . '* '; // '+' تعني أن الكلمة يجب أن تكون موجودة +} +$search_boolean = trim($search_boolean); + + +// بناء المضلع الجغرافي (Bounding Box Polygon) للفهرس المكاني +$bbox_wkt = sprintf( + 'POLYGON((%f %f, %f %f, %f %f, %f %f, %f %f))', + $lngMin, $latMin, + $lngMax, $latMin, + $lngMax, $latMax, + $lngMin, $latMax, + $lngMin, $latMin +); + + +// الاستعلام النهائي الذي يجمع بين البحث النصي والجغرافي +$sql = " + SELECT + id, latitude, longitude, name, name_ar, name_en, address, category, created_at + FROM + `{$tableName}` + WHERE + -- الشرط الأول: البحث بالنص الكامل (سريع جداً) + MATCH(name, name_ar, name_en, address, category) AGAINST(? IN BOOLEAN MODE) + + -- الشرط الثاني: البحث الجغرافي (سريع جداً) + AND ST_CONTAINS(ST_GEOMFROMTEXT(?), location) + LIMIT 50; -- حد أعلى للنتائج الأولية +"; + +// 4. تنفيذ الاستعلام وإرجاع النتيجة +try { + $stmt = $con->prepare($sql); + + // ربط المتغيرات بالاستعلام بالترتيب + $stmt->execute([$search_boolean, $bbox_wkt]); + + $rows = $stmt->fetchAll(PDO::FETCH_ASSOC); + + jsonSuccess($rows); + +} catch (PDOException $e) { + // يمكنك استخدام هذا السطر أثناء التطوير لعرض الخطأ الفعلي + // jsonError('DB Error: ' . $e->getMessage()); exit; + + // تسجيل الخطأ في سجلات الخادم للرجوع إليه لاحقاً + error_log("search_places_optimized.php error: " . $e->getMessage()); + jsonError("Database query error occurred"); +} +?> diff --git a/backend/ride/places_syria/reverse_geocode.php b/backend/ride/places_syria/reverse_geocode.php new file mode 100755 index 0000000..b9ba455 --- /dev/null +++ b/backend/ride/places_syria/reverse_geocode.php @@ -0,0 +1,155 @@ + 'error', 'message' => 'Missing lat or lon parameters']); + exit; +} + +// --- الاتصال بقاعدة البيانات --- +$conn = new mysqli($servername, $username, $password, $dbname); +$conn->set_charset("utf8mb4"); +if ($conn->connect_error) { + echo json_encode(['status' => 'error', 'message' => 'Database connection failed: ' . $conn->connect_error]); + exit; +} + +// --- دالة لتحليل other_tags (نفس الدالة من السكربت السابق) --- +function parseHstoreValue($hstoreString, $keyToFind) { + if (empty($hstoreString) || empty($keyToFind)) return null; + if (preg_match('/"' . preg_quote($keyToFind, '/') . '"\s*=>\s*"([^"]+)"/', $hstoreString, $matches)) { + $value = $matches[1]; + $decodedValue = urldecode($value); + $decodedValue = urldecode($decodedValue); + $cleanedValue = iconv('UTF-8', 'UTF-8//IGNORE', $decodedValue); + return ($cleanedValue === false || trim($cleanedValue) === '') ? null : $cleanedValue; + } + return null; +} + + +// --- الاستعلام الرئيسي: البحث عن أقرب نقطة باستخدام الفهرس المكاني --- +// نختار الأعمدة الأساسية + أعمدة المناطق المحسوبة مسبقاً + other_tags +$sql = " + SELECT + p.name, + p.neighbourhood_name, + p.city_name, + p.other_tags, + ST_Distance_Sphere( + p.geom, + ST_PointFromText(CONCAT('POINT(', ?, ' ', ?, ')'), 4326) + ) AS distance_meters + FROM + osm_points_with_area p + WHERE + -- استخدام MBRContains للفلترة الأولية السريعة (باستخدام الفهرس المكاني) + MBRContains( + ST_Buffer(ST_PointFromText(CONCAT('POINT(', ?, ' ', ?, ')'), 4326), 0.01), -- مربع بحث ~ 1 كم + p.geom + ) + -- الترتيب الدقيق حسب المسافة الأقرب (يستخدم الفهرس المكاني بكفاءة) + ORDER BY + p.geom <-> ST_PointFromText(CONCAT('POINT(', ?, ' ', ?, ')'), 4326) + LIMIT 1"; // نريد أقرب نقطة فقط + +$stmt = $conn->prepare($sql); +if ($stmt === false) { + echo json_encode(['status' => 'error', 'message' => 'Failed to prepare statement: ' . $conn->error]); + $conn->close(); + exit; +} + +// ربط المتغيرات (6 متغيرات: lon, lat مرتين للمربع ومرة للمسافة) +$stmt->bind_param("dddddd", $input_lon, $input_lat, $input_lon, $input_lat, $input_lon, $input_lat); + +$stmt->execute(); +$result = $stmt->get_result(); + +// --- تنسيق وإرجاع النتيجة --- +if ($result->num_rows > 0) { + $row = $result->fetch_assoc(); + + // استخراج التفاصيل الإضافية من other_tags + $name_ar = parseHstoreValue($row['other_tags'], 'name:ar'); + $addr_street = parseHstoreValue($row['other_tags'], 'addr:street'); + $amenity = parseHstoreValue($row['other_tags'], 'amenity'); + $shop = parseHstoreValue($row['other_tags'], 'shop'); + + // بناء اسم وصفي (الأولوية للعربي إن وجد) + $primaryName = $name_ar ?? $row['name'] ?? $addr_street ?? null; // الاسم الأساسي للنقطة + $displayName = $primaryName ?? 'موقع قريب'; // اسم افتراضي إذا لم يوجد اسم + + // إضافة اسم الحي والمدينة (المحسوبة مسبقاً) + $addressParts = array_filter([ + $row['neighbourhood_name'], + $row['city_name'] + ]); + if (!empty($addressParts)) { + // تجنب تكرار اسم المدينة إذا كان هو نفسه اسم النقطة + if ($primaryName !== $row['city_name']) { + $displayName .= '، ' . implode('، ', $addressParts); + } elseif ($row['neighbourhood_name'] && $primaryName !== $row['neighbourhood_name']) { + $displayName .= '، ' . $row['neighbourhood_name']; + } + } + + // إرجاع النتيجة كـ JSON + echo json_encode([ + 'status' => 'ok', + 'display_name' => $displayName, // الاسم المنسق للعرض + 'name' => $row['name'], // الاسم الأصلي (إن وجد) + 'name_ar' => $name_ar, // الاسم العربي (إن وجد) + 'street' => $addr_street, // اسم الشارع (إن وجد) + 'neighbourhood' => $row['neighbourhood_name'], // اسم الحي (المحسوب مسبقاً) + 'city' => $row['city_name'], // اسم المدينة (المحسوب مسبقاً) + 'amenity' => $amenity, // نوع الخدمة (إن وجد) + 'shop' => $shop, // نوع المحل (إن وجد) + 'distance_meters' => round($row['distance_meters'], 1) // المسافة لأقرب POI + ], JSON_UNESCAPED_UNICODE); // مهم لعرض العربية بشكل صحيح + +} else { + // لم يتم العثور على نقطة قريبة، ابحث عن أقرب مدينة/حي كحل بديل + $areaSqlFallback = " + SELECT name, other_tags, place_type + FROM osm_areas + ORDER BY ST_Distance_Sphere(geom, ST_PointFromText(CONCAT('POINT(', ?, ' ', ?, ')'), 4326)) ASC + LIMIT 1"; + $stmtFallback = $conn->prepare($areaSqlFallback); + if ($stmtFallback) { + $stmtFallback->bind_param("dd", $input_lon, $input_lat); + $stmtFallback->execute(); + $fallbackResult = $stmtFallback->get_result()->fetch_assoc(); + $stmtFallback->close(); + + if ($fallbackResult) { + $fallbackNameAr = parseHstoreValue($fallbackResult['other_tags'], 'name:ar'); + $fallbackDisplayName = $fallbackNameAr ?? $fallbackResult['name'] ?? 'منطقة غير معروفة'; + echo json_encode([ + 'status' => 'ok', + 'display_name' => $fallbackDisplayName, + ($fallbackResult['place_type'] === 'city' || $fallbackResult['place_type'] === 'town' || $fallbackResult['place_type'] === 'village') ? 'city' : 'neighbourhood' => $fallbackDisplayName + ], JSON_UNESCAPED_UNICODE); + } else { + echo json_encode(['status' => 'not_found', 'message' => 'No nearby places or areas found']); + } + } else { + echo json_encode(['status' => 'error', 'message' => 'Fallback query failed: ' . $conn->error]); + } +} + +$stmt->close(); +$conn->close(); +?> \ No newline at end of file diff --git a/backend/ride/profile/error_log b/backend/ride/profile/error_log new file mode 100644 index 0000000..e69de29 diff --git a/backend/ride/profile/get.php b/backend/ride/profile/get.php new file mode 100644 index 0000000..5304b09 --- /dev/null +++ b/backend/ride/profile/get.php @@ -0,0 +1,35 @@ +prepare($sql); +$stmt->bindParam(':id', $id, PDO::PARAM_STR); +$stmt->execute(); +$result = $stmt->fetch(PDO::FETCH_ASSOC); + +if ($result) { + unset($result['password']); // إخفاء الباسورد + + // فك تشفير الحقول الحساسة + $fieldsToDecrypt = [ + 'phone', 'email', 'gender', 'birthdate', 'site', + 'first_name', 'last_name', 'sosPhone', + 'education', 'employmentType', 'maritalStatus' + ]; + + foreach ($fieldsToDecrypt as $field) { + if (isset($result[$field])) { + $result[$field] = $encryptionHelper->decryptData($result[$field]); + } + } + + echo json_encode([ + "status" => "success", + "data" => $result + ]); +} else { + jsonError("Failed to retrieve passenger data"); +} +?> \ No newline at end of file diff --git a/backend/ride/profile/getCaptainProfile.php b/backend/ride/profile/getCaptainProfile.php new file mode 100644 index 0000000..7297c3a --- /dev/null +++ b/backend/ride/profile/getCaptainProfile.php @@ -0,0 +1,88 @@ +prepare($sql); +$stmt->bindParam(':id', $id, PDO::PARAM_STR); +$stmt->execute(); +$result = $stmt->fetch(PDO::FETCH_ASSOC); + +if (!$result) { + jsonError("Failed to retrieve driver data"); + exit; +} + +// فك تشفير حقل birthdate أولاً لحساب العمر +if (!empty($result['birthdate'])) { + $result['birthdate'] = $encryptionHelper->decryptData($result['birthdate']); + + try { + $dob = new DateTime($result['birthdate']); + $today = new DateTime(); + $age = $today->diff($dob)->y; + } catch (Exception $e) { + $age = null; + } +} else { + $age = null; +} +$result['age'] = $age; + +// فك تشفير بقية الحقول +$driverFieldsToDecrypt = [ + 'phone', 'email', 'gender', 'site', + 'first_name', 'last_name' +]; + +foreach ($driverFieldsToDecrypt as $field) { + if (!empty($result[$field])) { + $result[$field] = $encryptionHelper->decryptData($result[$field]); + } +} + +// فك تشفير حقول السيارة +$vehicleFieldsToDecrypt = ['vin', 'car_plate']; +foreach ($vehicleFieldsToDecrypt as $field) { + if (!empty($result[$field])) { + $result[$field] = $encryptionHelper->decryptData($result[$field]); + } +} + +jsonSuccess($result); +?> \ No newline at end of file diff --git a/backend/ride/profile/update.php b/backend/ride/profile/update.php new file mode 100644 index 0000000..2cab13f --- /dev/null +++ b/backend/ride/profile/update.php @@ -0,0 +1,37 @@ + $id]; + +$encryptedFields = [ + "phone", "sosPhone", "birthdate", "site", "gender", + "first_name", "last_name", "education", "employmentType", "maritalStatus" +]; + +foreach ($encryptedFields as $field) { + if (isset($_POST[$field]) && !empty($_POST[$field])) { + $value = filterRequest($field); + $encryptedValue = $encryptionHelper->encryptData($value); + $fields[] = "`$field` = :$field"; + $params[":$field"] = $encryptedValue; + } +} + +if (!empty($fields)) { + $setClause = implode(", ", $fields); + $sql = "UPDATE `passengers` SET $setClause WHERE `id` = :id"; + $stmt = $con->prepare($sql); + $stmt->execute($params); + + if ($stmt->rowCount() > 0) { + jsonSuccess(null, "Passenger data updated successfully"); + } else { + jsonError("Failed to update passenger data"); + } +} else { + jsonError("No fields to update"); +} +?> \ No newline at end of file diff --git a/backend/ride/profile/updateDriverEmail.php b/backend/ride/profile/updateDriverEmail.php new file mode 100755 index 0000000..947435e --- /dev/null +++ b/backend/ride/profile/updateDriverEmail.php @@ -0,0 +1,29 @@ +encryptData($email); + +// تنفيذ التحديث +$sql = "UPDATE driver SET email = :email WHERE id = :id"; +$stmt = $con->prepare($sql); +$success = $stmt->execute([ + ":email" => $encryptedEmail, + ":id" => $id +]); + +if ($success && $stmt->rowCount() > 0) { + jsonSuccess(null, "Email updated successfully"); +} else { + jsonError("Failed to update email"); +} +?> \ No newline at end of file diff --git a/backend/ride/promo/add.php b/backend/ride/promo/add.php new file mode 100755 index 0000000..7ff5c61 --- /dev/null +++ b/backend/ride/promo/add.php @@ -0,0 +1,34 @@ +prepare($sql); +$stmt->bindValue(':promo_code', $promo_code); +$stmt->bindValue(':amount', $amount); +$stmt->bindValue(':description', $description); +$stmt->bindValue(':passengerID', $passengerID); + +if ($stmt->execute()) { + jsonSuccess(null, "Promo data saved successfully"); +} else { + jsonError("Failed to save promo data"); +} +?> \ No newline at end of file diff --git a/backend/ride/promo/delete.php b/backend/ride/promo/delete.php new file mode 100644 index 0000000..a0874f3 --- /dev/null +++ b/backend/ride/promo/delete.php @@ -0,0 +1,16 @@ +prepare($sql); +$stmt->bindParam(':id', $id, PDO::PARAM_INT); // استخدام bindParam لحماية الاستعلام +$stmt->execute(); + +if ($stmt->rowCount() > 0) { + jsonSuccess(null, "Promo data deleted successfully"); +} else { + jsonError("Failed to delete promo data"); +} +?> \ No newline at end of file diff --git a/backend/ride/promo/get.php b/backend/ride/promo/get.php new file mode 100644 index 0000000..ab9f904 --- /dev/null +++ b/backend/ride/promo/get.php @@ -0,0 +1,30 @@ +prepare($sql); + $stmt->bindParam(':promo_code', $promo_code, PDO::PARAM_STR); +} else { + $sql = "SELECT `id`, `promo_code`, `amount`, `description`, `passengerID`, `validity_start_date`, `validity_end_date` FROM `promos` WHERE `passengerID` IN ('all', 'none', '') ORDER BY id DESC"; + $stmt = $con->prepare($sql); +} + +$stmt->execute(); +$result = $stmt->fetchAll(PDO::FETCH_ASSOC); + +if ($result || (empty($promo_code) && is_array($result))) { + jsonSuccess($result); +} else { + if (!empty($promo_code)) { + jsonError("Promo code not found or expired"); + } else { + jsonSuccess([], "No promos found"); + } +} +?> \ No newline at end of file diff --git a/backend/ride/promo/getPromoBytody.php b/backend/ride/promo/getPromoBytody.php new file mode 100755 index 0000000..af6b86d --- /dev/null +++ b/backend/ride/promo/getPromoBytody.php @@ -0,0 +1,27 @@ += CURDATE();"; + +$stmt = $con->prepare($sql); +$stmt->execute(); +$result = $stmt->fetchAll(PDO::FETCH_ASSOC); + +if ($result) { + jsonSuccess($result); +} else { + // Print an empty list + jsonSuccess([]); +} +?> \ No newline at end of file diff --git a/backend/ride/promo/getPromoFirst.php b/backend/ride/promo/getPromoFirst.php new file mode 100755 index 0000000..79f2cde --- /dev/null +++ b/backend/ride/promo/getPromoFirst.php @@ -0,0 +1,31 @@ +encryptData(filterRequest("passengerID")); +$passengerID = filterRequest("passengerID"); // استخدم هذا إذا ID رقم فقط + +$sql = "SELECT + `id`, + `promo_code`, + `amount`, + `description`, + `validity_start_date`, + `validity_end_date` +FROM + `promos` +WHERE + `passengerID` = ? AND CURDATE() BETWEEN validity_start_date AND validity_end_date"; + +$stmt = $con->prepare($sql); +$stmt->bindParam(1, $passengerID); +$stmt->execute(); + +$result = $stmt->fetchAll(PDO::FETCH_ASSOC); + +if ($result) { + jsonSuccess($result); +} else { + jsonError("Failed to retrieve promo records"); +} +?> \ No newline at end of file diff --git a/backend/ride/promo/update.php b/backend/ride/promo/update.php new file mode 100644 index 0000000..4e18765 --- /dev/null +++ b/backend/ride/promo/update.php @@ -0,0 +1,40 @@ +prepare($sql); +if ($stmt->execute($params)) { + jsonSuccess(null, "Promo updated successfully"); +} else { + jsonError("Failed to update promo"); +} +?> \ No newline at end of file diff --git a/backend/ride/rate/add.php b/backend/ride/rate/add.php new file mode 100644 index 0000000..ac7b0f5 --- /dev/null +++ b/backend/ride/rate/add.php @@ -0,0 +1,30 @@ +prepare($sql); +$stmt->bindParam(':passenger_id', $passenger_id); +$stmt->bindParam(':driverID', $driverID); +$stmt->bindParam(':rideId', $rideId); +$stmt->bindParam(':rating', $rating); +$stmt->bindParam(':comment', $comment); + +$stmt->execute(); + +if ($stmt->rowCount() > 0) { + jsonSuccess(null, "Rate inserted successfully"); +} else { + jsonError("Failed to save rating information"); +} +?> \ No newline at end of file diff --git a/backend/ride/rate/addRateToDriver.php b/backend/ride/rate/addRateToDriver.php new file mode 100644 index 0000000..c14581f --- /dev/null +++ b/backend/ride/rate/addRateToDriver.php @@ -0,0 +1,58 @@ +prepare($sql); + $stmt->bindParam(':passenger_id', $passenger_id); + $stmt->bindParam(':driver_id', $driver_id); + $stmt->bindParam(':ride_id', $ride_id); + $stmt->bindParam(':rating', $rating); + $stmt->bindParam(':comment', $comment); + + $stmt->execute(); + + if ($stmt->rowCount() > 0) { + jsonSuccess(null, "Rate inserted successfully"); + } else { + // في حال لم يتم الإدخال ولكن لم يحدث خطأ فني (نادرة الحدوث في Insert) + jsonError("Failed to save rating information"); + } + +} catch (PDOException $e) { + // --- هذا القسم خاص بأخطاء قاعدة البيانات --- + + // 1. تسجيل الخطأ في ملف نصي على السيرفر (للمطور فقط) + // سيتم إنشاء ملف اسمه errors.log في نفس المجلد إذا لم يكن موجوداً + $errorMsg = "[" . date("Y-m-d H:i:s") . "] DB Error: " . $e->getMessage() . " | RideID: $ride_id \n"; + file_put_contents("errors.log", $errorMsg, FILE_APPEND); + + // 2. إرجاع رسالة خطأ عامة للتطبيق + jsonError("Database Error: Could not save rating"); + +} catch (Exception $e) { + // --- هذا القسم خاص بالأخطاء العامة الأخرى --- + + $errorMsg = "[" . date("Y-m-d H:i:s") . "] General Error: " . $e->getMessage() . "\n"; + file_put_contents("errors.log", $errorMsg, FILE_APPEND); + + jsonError("Error: " . $e->getMessage()); +} +?> \ No newline at end of file diff --git a/backend/ride/rate/add_rate_app.php b/backend/ride/rate/add_rate_app.php new file mode 100755 index 0000000..b445f6d --- /dev/null +++ b/backend/ride/rate/add_rate_app.php @@ -0,0 +1,34 @@ +encryptData($email); +$phone = $encryptionHelper->encryptData($phone); + +// Insert into `ratingApp` table +$sql = "INSERT INTO `ratingApp`(`id`, `name`, `email`, `phone`, `userId`, `userType`, `rating`, `comment`) + VALUES (null, :name, :email, :phone, :userId, :userType, :rating, :comment)"; + +$stmt = $con->prepare($sql); +$stmt->bindParam(':name', $name); +$stmt->bindParam(':email', $email); +$stmt->bindParam(':phone', $phone); +$stmt->bindParam(':userId', $userId); +$stmt->bindParam(':userType', $userType); +$stmt->bindParam(':rating', $rating); +$stmt->bindParam(':comment', $comment); +$stmt->execute(); + +if ($stmt->rowCount() > 0) { + jsonSuccess($message = 'Rating inserted successfully'); +} else { + jsonError($message = "Failed to save rating information"); +} +?> \ No newline at end of file diff --git a/backend/ride/rate/error_log b/backend/ride/rate/error_log new file mode 100644 index 0000000..e69de29 diff --git a/backend/ride/rate/getDriverRate.php b/backend/ride/rate/getDriverRate.php new file mode 100755 index 0000000..f95b673 --- /dev/null +++ b/backend/ride/rate/getDriverRate.php @@ -0,0 +1,25 @@ +prepare($sql); +$stmt->bindParam(':driver_id', $driver_id); +$stmt->execute(); + +if ($stmt->rowCount() > 0) { + // Fetch the record + $row = $stmt->fetchAll(PDO::FETCH_ASSOC); + + jsonSuccess($row); +} else { + // Print a failure message + jsonError($message = "No rating record found"); +} +?> diff --git a/backend/ride/rate/getPassengerRate.php b/backend/ride/rate/getPassengerRate.php new file mode 100755 index 0000000..7747fc1 --- /dev/null +++ b/backend/ride/rate/getPassengerRate.php @@ -0,0 +1,23 @@ +prepare($sql); +$stmt->bindParam(':passenger_id', $passengerId); +$stmt->execute(); + +if ($stmt->rowCount() > 0) { + $row = $stmt->fetch(PDO::FETCH_ASSOC); + jsonSuccess($row); +} else { + jsonError("No rating record found"); +} +?> \ No newline at end of file diff --git a/backend/ride/rate/sendEmailRateingApp.php b/backend/ride/rate/sendEmailRateingApp.php new file mode 100755 index 0000000..db6bfc8 --- /dev/null +++ b/backend/ride/rate/sendEmailRateingApp.php @@ -0,0 +1,77 @@ + +

أهلاً كابتن $name،

+

نشكرك جزيل الشكر على تقييمك لتطبيق انطلق!

+

لقد استلمنا تقييمك وهو $rating نجوم.

+

تعليقك: \"$comment\"

+

نحن نقدر ملاحظاتك، ونسعد دائماً بتواصلك معنا لتحسين تجربتك. إذا كان لديك أي استفسار، لا تتردد بالرد على هذا البريد.

+

مع خالص الشكر،

+

فريق انطلق.

+"; + +if (mail($email, $subject, $bodyEmail, $headers)) { + echo "Email sent successfully to $email."; +} else { + echo "Failed to send email."; +} +?> + diff --git a/backend/ride/rides/acceptRide.php b/backend/ride/rides/acceptRide.php new file mode 100755 index 0000000..85c7832 --- /dev/null +++ b/backend/ride/rides/acceptRide.php @@ -0,0 +1,198 @@ +getMessage()); + printFailure("Database connection failed"); + exit; +} + +// ── 1. Input & Validation ────────────────────────────────────── +$rideId = filterRequest("id"); +$driverId = filterRequest("driver_id"); +$status = filterRequest("status"); // القيمة التي يرسلها التطبيق: 'accepted' +$passengerToken = filterRequest("passengerToken"); + +if (empty($rideId) || empty($driverId)) { + printFailure("Missing required parameters"); + exit; +} + +// status whitelist — لا نقبل قيمة عشوائية من التطبيق +$allowedStatuses = ['accepted', 'Apply']; +if (!in_array($status, $allowedStatuses, true)) { + $status = 'accepted'; // fallback آمن +} + +error_log("[accept_ride] DriverID=$driverId attempting RideID=$rideId"); + +try { + // ═══════════════════════════════════════════════════════════ + // STEP A — القفل على ride DB (المرجع الأساسي) + // Optimistic lock: نغير فقط إذا status لا يزال 'waiting' أو 'wait' + // السائق الأول الذي يصل يربح — الباقي يجدون rowCount=0 + // ═══════════════════════════════════════════════════════════ + $stmtLock = $con_ride->prepare(" + UPDATE `ride` + SET `status` = ?, + `driver_id` = ?, + `rideTimeStart` = NOW() + WHERE `id` = ? + AND `status` IN ('waiting', 'wait') + "); + $stmtLock->execute([$status, $driverId, $rideId]); + + if ($stmtLock->rowCount() === 0) { + // الرحلة غير متاحة — سائق آخر سبق أو الرحلة ألغيت + error_log("[accept_ride] RideID=$rideId not available for DriverID=$driverId (rowCount=0)"); + printFailure("Ride not available"); + exit; + } + + error_log("[accept_ride] ride DB locked. RideID=$rideId → DriverID=$driverId"); + + // ═══════════════════════════════════════════════════════════ + // STEP B — تزامن primary DB (بعد نجاح القفل) + // ═══════════════════════════════════════════════════════════ + try { + $con->prepare(" + UPDATE `ride` + SET `driver_id` = ?, + `status` = ?, + `rideTimeStart` = NOW() + WHERE `id` = ? + ")->execute([$driverId, $status, $rideId]); + error_log("[accept_ride] primary DB synced. RideID=$rideId"); + } catch (PDOException $eSync) { + // لا نوقف — ride DB هو المرجع + error_log("[accept_ride] primary DB sync WARNING: " . $eSync->getMessage()); + } + + // ═══════════════════════════════════════════════════════════ + // STEP C — driver_orders (INSERT أو UPDATE بسطر واحد آمن) + // ON DUPLICATE KEY يمنع race condition ثانية على هذا الجدول + // ═══════════════════════════════════════════════════════════ + try { + $con->prepare(" + INSERT INTO `driver_orders` (`driver_id`, `order_id`, `status`, `created_at`) + VALUES (?, ?, ?, NOW()) + ON DUPLICATE KEY UPDATE + `driver_id` = VALUES(`driver_id`), + `status` = VALUES(`status`), + `created_at` = NOW() + ")->execute([$driverId, $rideId, $status]); + } catch (PDOException $eOrders) { + error_log("[accept_ride] driver_orders WARNING: " . $eOrders->getMessage()); + } + + // ═══════════════════════════════════════════════════════════ + // STEP C.1 — تحديث جدول waitingRides حتى لا تظهر للكباتن الآخرين + // ═══════════════════════════════════════════════════════════ + try { + $con->prepare("UPDATE `waitingRides` SET `status` = 'Apply' WHERE `id` = ?")->execute([$rideId]); + } catch (PDOException $eWaiting) { + error_log("[accept_ride] waitingRides WARNING: " . $eWaiting->getMessage()); + } + + // ═══════════════════════════════════════════════════════════ + // STEP D — جلب بيانات السائق للراكب + // ═══════════════════════════════════════════════════════════ + $driverInfo = []; + + $stmtDriver = $con->prepare(" + SELECT + d.id AS driver_id, + d.first_name, + d.last_name, + d.gender, + d.phone, + c.make, + c.model, + c.car_plate, + c.year, + c.color, + c.color_hex, + (SELECT ROUND(AVG(rating), 2) FROM ratingDriver WHERE driver_id = d.id) AS ratingDriver, + dt.token + FROM driver d + LEFT JOIN CarRegistration c ON c.driverID = d.id + LEFT JOIN driverToken dt ON dt.captain_id = d.id + WHERE d.id = ? + LIMIT 1 + "); + $stmtDriver->execute([$driverId]); + $driverRaw = $stmtDriver->fetch(PDO::FETCH_ASSOC); + + if ($driverRaw) { + $encryptedFields = ['first_name', 'last_name', 'gender', 'phone', 'car_plate', 'token']; + foreach ($driverRaw as $key => $value) { + $driverInfo[$key] = (in_array($key, $encryptedFields) && !empty($value)) + ? $encryptionHelper->decryptData($value) + : $value; + } + $driverInfo['driverName'] = trim(($driverInfo['first_name'] ?? '') . ' ' . ($driverInfo['last_name'] ?? '')); + $driverInfo['ratingDriver'] = $driverInfo['ratingDriver'] ?: "5.0"; + } + + // ═══════════════════════════════════════════════════════════ + // STEP E — جلب passenger_id وإرسال الإشعارات + // ═══════════════════════════════════════════════════════════ + $passengerId = $con->prepare("SELECT passenger_id FROM ride WHERE id = ? LIMIT 1"); + $passengerId->execute([$rideId]); + $passengerIdValue = $passengerId->fetchColumn(); + + if ($passengerIdValue) { + // Socket — real-time update على خريطة الراكب + if (function_exists('notifyPassengerOnRideServer')) { + notifyPassengerOnRideServer($passengerIdValue, [ + 'status' => 'accepted', + 'ride_id' => $rideId, + 'driver_id' => $driverId, + 'driver_info' => $driverInfo, + ]); + } + + // FCM — push notification صامت + if (!empty($passengerToken)) { + sendFCM_Internal( + $passengerToken, + "", // تفريغ العنوان للإرسال الصامت + "", // تفريغ المحتوى للإرسال الصامت + ['ride_id' => (string) $rideId, 'driver_info' => $driverInfo, 'status' => 'accepted'], + "Accepted Ride", + false + ); + } + } + + // ═══════════════════════════════════════════════════════════ + // STEP F — تنظيف السوق (أبلغ location server إن الرحلة محجوزة) + // ═══════════════════════════════════════════════════════════ + sendToLocationServer('ride_taken_event', [ + 'ride_id' => $rideId, + 'taken_by_driver_id' => $driverId, + ]); + + error_log("[accept_ride] SUCCESS. RideID=$rideId accepted by DriverID=$driverId"); + + // ═══════════════════════════════════════════════════════════ + // STEP G — رد النجاح للسائق (نفس بنية الرد القديمة) + // ═══════════════════════════════════════════════════════════ + echo json_encode([ + "status" => "success", + "message" => "Ride Accepted", + "data" => $driverInfo, + ]); + +} catch (PDOException $e) { + error_log("[accept_ride] CRITICAL: " . $e->getMessage()); + printFailure("Server error"); +} \ No newline at end of file diff --git a/backend/ride/rides/add.php b/backend/ride/rides/add.php new file mode 100644 index 0000000..41c1d6f --- /dev/null +++ b/backend/ride/rides/add.php @@ -0,0 +1,128 @@ + $start_location, + ":end_location" => $end_location, + ":date" => $date_formatted, // نستخدم الصيغة المعالجة + ":time" => $time_formatted, // نستخدم الصيغة المعالجة + ":endtime" => $endtime_formatted, + ":price" => $price, + ":passenger_id" => $passenger_id, + ":driver_id" => $driver_id, + ":status" => $status, + ":carType" => $carType, + ":price_for_driver" => $price_for_driver, + ":price_for_passenger" => $price_for_passenger, + ":distance" => $distance, +]; + +// تسجيل البيانات التي سيتم إدخالها للتأكد +error_log("ℹ️ [add_ride.php] Prepared Data: " . json_encode($data)); + +// --------------------------------------------------------- +// 3. الإضافة في السيرفر المحلي (Main DB) +// --------------------------------------------------------- + +$sql = "INSERT INTO `ride` ( + `start_location`, `end_location`, `date`, `time`, `endtime`, + `price`, `passenger_id`, `driver_id`, `status`, `carType`, + `price_for_driver`, `price_for_passenger`, `distance` +) VALUES ( + :start_location, :end_location, :date, :time, :endtime, + :price, :passenger_id, :driver_id, :status, :carType, + :price_for_driver, :price_for_passenger, :distance +)"; + +try { + error_log("🔄 [add_ride.php] Inserting into LOCAL DB..."); + + $stmt = $con->prepare($sql); + $stmt->execute($data); + + $insertedId = $con->lastInsertId(); + $count = $stmt->rowCount(); + + error_log("✅ [add_ride.php] Local Insert Success. ID: $insertedId"); + + if ($count > 0) { + + // --------------------------------------------------------- + // 4. الإضافة في سيرفر التتبع (Tracking DB) + // --------------------------------------------------------- + + $sqlRemote = "INSERT INTO `ride` ( + `id`, `start_location`, `end_location`, `date`, `time`, `endtime`, + `price`, `passenger_id`, `driver_id`, `status`, `carType`, + `price_for_driver`, `price_for_passenger`, `distance` + ) VALUES ( + :id, :start_location, :end_location, :date, :time, :endtime, + :price, :passenger_id, :driver_id, :status, :carType, + :price_for_driver, :price_for_passenger, :distance + )"; + + // إضافة الـ ID للمصفوفة + $data[':id'] = $insertedId; + + try { + error_log("🔄 [add_ride.php] Inserting into REMOTE DB..."); + + $stmtRemote = $con_ride->prepare($sqlRemote); + $stmtRemote->execute($data); + + error_log("✅ [add_ride.php] Remote Insert Success."); + + } catch (PDOException $eRemote) { + // نسجل خطأ الريموت لكن لا نوقف العملية لأن اللوكل تم بنجاح + error_log("⚠️ [add_ride.php] Remote DB Error: " . $eRemote->getMessage()); + } + + // طباعة النجاح (JSON صحيح) + jsonSuccess($insertedId); + + } else { + error_log("❌ [add_ride.php] Failed to insert locally (Rows affected 0)."); + jsonError("Failed to save ride information locally"); + } + +} catch (PDOException $e) { + // تسجيل الخطأ بدقة + error_log("❌ [add_ride.php] SQL Error: " . $e->getMessage()); + jsonError("Database Error: " . $e->getMessage()); +} +?> \ No newline at end of file diff --git a/backend/ride/rides/add_ride.php b/backend/ride/rides/add_ride.php new file mode 100755 index 0000000..d45bf40 --- /dev/null +++ b/backend/ride/rides/add_ride.php @@ -0,0 +1,232 @@ +getMessage()); + printFailure("Database connection failed"); + exit; +} +// ================================================================================= +// 🛠️ دالة مساعدة: إرسال الرحلة لسوق السائقين (Marketplace Broadcast) +// ================================================================================= +function broadcastRideToMarket($rideId, $lat, $lng, $payloadData) { + $url = getenv('LOCATION_SOCKET_URL'); + $keyPath = getenv('INTERNAL_SOCKET_KEY_PATH'); + $INTERNAL_KEY = $keyPath && file_exists($keyPath) ? trim(file_get_contents($keyPath)) : ''; + + $marketPayload = [ + 'id' => (string)$rideId, + 'start_lat' => $lat, + 'start_lng' => $lng, + 'price' => $payloadData[2], + 'carType' => $payloadData[31], + 'startName' => $payloadData[29], + 'endName' => $payloadData[30], + 'distance' => $payloadData[11], + 'duration' => $payloadData[15], + 'passengerRate' => $payloadData[33], + ]; + + $postData = [ + 'action' => 'market_new_ride', + 'payload' => $marketPayload + ]; + + $ch = curl_init(); + curl_setopt($ch, CURLOPT_URL, $url); + curl_setopt($ch, CURLOPT_POST, 1); + curl_setopt($ch, CURLOPT_POSTFIELDS, http_build_query($postData)); + curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); + curl_setopt($ch, CURLOPT_TIMEOUT_MS, 200); + if ($INTERNAL_KEY) { + curl_setopt($ch, CURLOPT_HTTPHEADER, ["x-internal-key: $INTERNAL_KEY"]); + } + curl_exec($ch); + curl_close($ch); +} +error_log("[add_ride] Request started. passenger_id=" . ($_POST['passenger_id'] ?? '?')); + +// ── 1. Input ─────────────────────────────────────────────────── +$start_location = filterRequest("start_location"); +$end_location = filterRequest("end_location"); +$price = filterRequest("price"); +$passenger_id = filterRequest("passenger_id"); +$driver_id = filterRequest("driver_id") ?: 0; +$status = filterRequest("status"); +$price_for_driver = filterRequest("price_for_driver"); +$price_for_passenger = filterRequest("price_for_passenger"); +$distance = filterRequest("distance"); +$carType = filterRequest("carType"); +$passenger_name = filterRequest("passenger_name"); +$passenger_phone = filterRequest("passenger_phone"); +$passenger_token = filterRequest("passenger_token"); +$passenger_email = filterRequest("passenger_email"); +$passenger_wallet = filterRequest("passenger_wallet"); +$passenger_rating = filterRequest("passenger_rating"); +$start_name_loc = filterRequest("start_name"); +$end_name_loc = filterRequest("end_name"); +$duration_text = filterRequest("duration_text"); +$distance_text = filterRequest("distance_text"); +$is_wallet = filterRequest("is_wallet"); +$has_steps = filterRequest("has_steps"); +$step0 = filterRequest("step0"); +$step1 = filterRequest("step1"); +$step2 = filterRequest("step2"); +$step3 = filterRequest("step3"); +$step4 = filterRequest("step4"); + +// Validation +if (empty($passenger_id) || empty($start_location) || empty($end_location) || empty($price)) { + error_log("[add_ride] Validation failed — missing required fields."); + printFailure("Missing required fields"); + exit; +} + +// ── 2. تنسيق التواريخ ───────────────────────────────────────── +$date_formatted = date("Y-m-d"); +$time_formatted = date("H:i:s"); +$endtime_formatted = filterRequest("endtime") + ? date("H:i:s", strtotime(filterRequest("endtime"))) + : "00:00:00"; + +// ── 3. إحداثيات البداية والنهاية ────────────────────────────── +$startLat = $startLng = $endLat = $endLng = ""; +if (!empty($start_location)) { + [$startLat, $startLng] = array_map('trim', explode(',', $start_location, 2)); +} +if (!empty($end_location)) { + [$endLat, $endLng] = array_map('trim', explode(',', $end_location, 2)); +} + +// ── 4. مصفوفة بيانات الإدخال ────────────────────────────────── +$insertData = [ + ':start_location' => $start_location, + ':end_location' => $end_location, + ':date' => $date_formatted, + ':time' => $time_formatted, + ':endtime' => $endtime_formatted, + ':price' => $price, + ':passenger_id' => $passenger_id, + ':driver_id' => $driver_id, + ':status' => $status, + ':carType' => $carType, + ':price_for_driver' => $price_for_driver, + ':price_for_passenger' => $price_for_passenger, + ':distance' => $distance, +]; + +$sqlInsert = "INSERT INTO `ride` + (`start_location`,`end_location`,`date`,`time`,`endtime`, + `price`,`passenger_id`,`driver_id`,`status`,`carType`, + `price_for_driver`,`price_for_passenger`,`distance`) + VALUES + (:start_location,:end_location,:date,:time,:endtime, + :price,:passenger_id,:driver_id,:status,:carType, + :price_for_driver,:price_for_passenger,:distance)"; + +try { + // ═══════════════════════════════════════════════════════════ + // STEP A — ride DB أولاً (هو المرجع الأساسي) + // ═══════════════════════════════════════════════════════════ + $stmtRide = $con_ride->prepare($sqlInsert); + $stmtRide->execute($insertData); + $insertedId = $con_ride->lastInsertId(); + + if (!$insertedId) { + error_log("[add_ride] ride DB insert returned no ID."); + printFailure("Failed to create ride"); + exit; + } + + error_log("[add_ride] ride DB insert success. RideID=$insertedId"); + + // ═══════════════════════════════════════════════════════════ + // STEP B — primary DB ثانياً (نسخة أرشيفية بنفس الـ ID) + // ═══════════════════════════════════════════════════════════ + $sqlInsertWithId = "INSERT INTO `ride` + (`id`,`start_location`,`end_location`,`date`,`time`,`endtime`, + `price`,`passenger_id`,`driver_id`,`status`,`carType`, + `price_for_driver`,`price_for_passenger`,`distance`) + VALUES + (:id,:start_location,:end_location,:date,:time,:endtime, + :price,:passenger_id,:driver_id,:status,:carType, + :price_for_driver,:price_for_passenger,:distance)"; + + try { + $primaryData = $insertData; + $primaryData[':id'] = $insertedId; + $stmtPrimary = $con->prepare($sqlInsertWithId); + $stmtPrimary->execute($primaryData); + error_log("[add_ride] primary DB sync success. RideID=$insertedId"); + } catch (PDOException $ePrimary) { + // لا نوقف العملية — ride DB هو المرجع + error_log("[add_ride] primary DB sync WARNING: " . $ePrimary->getMessage()); + } + + // ═══════════════════════════════════════════════════════════ + // STEP C — بناء الـ payload وإرسال الرحلة للسائقين + // ═══════════════════════════════════════════════════════════ + $kazan = (float) $price - (float) $price_for_driver; + $payload = [ + (string) $startLat, + (string) $startLng, + number_format((float) $price, 2, '.', ''), + (string) $endLat, + (string) $endLng, + (string) $distance_text, + "", + (string) $passenger_id, + (string) $passenger_name, + (string) $passenger_token, + (string) $passenger_phone, + (string) $distance, + "1", + (string) $is_wallet, + (string) $distance, + (string) $duration_text, + (string) $insertedId, + "", + "", + (string) $duration_text, + $has_steps ?: 'false', + (string) $step0, + (string) $step1, + (string) $step2, + (string) $step3, + (string) $step4, + number_format((float) $price_for_driver, 2, '.', ''), + (string) $passenger_wallet, + (string) $passenger_email, + (string) $start_name_loc, + (string) $end_name_loc, + (string) $carType, + number_format($kazan, 2, '.', ''), + (string) $passenger_rating, + ]; + + // Direct dispatch للسائقين القريبين + $driversData = findBestDrivers($con, $startLat, $startLng, $carType); + if (!empty($driversData)) { + dispatchRideToDrivers($driversData, $insertedId, $payload, $start_name_loc, $encryptionHelper); + error_log("[add_ride] Dispatched RideID=$insertedId to " . count($driversData) . " drivers."); + } else { + error_log("[add_ride] No direct drivers found for RideID=$insertedId — market only."); + } + + // Broadcast للـ marketplace دائماً + broadcastRideToMarket($insertedId, $startLat, $startLng, $payload); + + // رد النجاح للتطبيق + printSuccess($insertedId); + +} catch (PDOException $e) { + error_log("[add_ride] CRITICAL ride DB error: " . $e->getMessage()); + printFailure("Database error"); +} \ No newline at end of file diff --git a/backend/ride/rides/arrive_ride.php b/backend/ride/rides/arrive_ride.php new file mode 100755 index 0000000..9363740 --- /dev/null +++ b/backend/ride/rides/arrive_ride.php @@ -0,0 +1,75 @@ +getMessage()); +} + +$rideId = filterRequest("ride_id"); +$driverId = filterRequest("driver_id"); +$passengerToken = filterRequest("passengerToken"); + +if (!$rideId || !$driverId) { + jsonError("Missing required parameters."); + exit; +} + +try { + // 1. تحديث الحالة في السيرفر البعيد (Remote DB - con_ride) + $stmtRemote = $con_ride->prepare("UPDATE ride SET status = 'arrived', updated_at = NOW() WHERE id = ? AND driver_id = ? AND status = 'Apply'"); + $stmtRemote->execute([$rideId, $driverId]); + + // 2. تحديث الحالة في السيرفر المحلي (Local DB - con) + if (isset($con)) { + $stmtLocal = $con->prepare("UPDATE ride SET status = 'arrived', updated_at = NOW() WHERE id = ? AND driver_id = ? AND status = 'Apply'"); + $stmtLocal->execute([$rideId, $driverId]); + } + + // 3. جلب بيانات الراكب للإرسال + // نستخدم con_ride لضمان الدقة + $stmtPas = $con_ride->prepare("SELECT passenger_id FROM ride WHERE id = ?"); + $stmtPas->execute([$rideId]); + $passenger_id = $stmtPas->fetchColumn(); + + if ($passenger_id) { + + // أ) إرسال Socket (الأسرع) + $payload = [ + 'status' => 'arrived', + 'ride_id' => $rideId, + 'msg' => 'السائق وصل إلى موقعك 🚖' + ]; + + if (function_exists('notifyPassengerOnRideServer')) { + notifyPassengerOnRideServer($passenger_id, $payload); + } + + // ب) إرسال FCM (باستخدام الدالة الجديدة) + if (!empty($passengerToken)) { + $fcmData = [ + 'category' => 'Arrive Ride', // نفس الاسم القديم لضمان عمل التطبيق + 'ride_id' => (string)$rideId, + 'status' => 'arrived' + ]; + + // 🔥 استخدام sendFCM_Internal كرسالة صامتة + sendFCM_Internal( + $passengerToken, // الهدف + "", // تفريغ العنوان + "", // تفريغ النص + $fcmData, // البيانات + "Arrive Ride", // التصنيف + false // ليس Topic + ); + } + } + + jsonSuccess(null, "Arrival notified successfully"); + +} catch (Exception $e) { + jsonError("Error: " . $e->getMessage()); +} +?> \ No newline at end of file diff --git a/backend/ride/rides/cancelRideFromDriver.php b/backend/ride/rides/cancelRideFromDriver.php new file mode 100755 index 0000000..01b6d79 --- /dev/null +++ b/backend/ride/rides/cancelRideFromDriver.php @@ -0,0 +1,108 @@ +prepare($sql); + $stmtRemote->execute([$newStatus, $id]); + + $count = $stmtRemote->rowCount(); + error_log("ℹ️ [cancelRide.php] Remote DB Rows Affected: $count"); + + // التحقق: هل تم التحديث؟ + if ($count > 0) { + + // --------------------------------------------------------- + // 2. التحديث على السيرفر المحلي (Local DB) + // --------------------------------------------------------- + // نبدأ معاملة لضمان تكامل البيانات + if (isset($con)) { + $con->beginTransaction(); + try { + $stmtLocal = $con->prepare($sql); + $stmtLocal->execute([$newStatus, $id]); + + // تحديث جدول driver_orders أيضاً لتوحيد الحالة (اختياري ولكنه مفضل) + $stmtDriverOrder = $con->prepare("UPDATE driver_orders SET status = ? WHERE order_id = ?"); + $stmtDriverOrder->execute([$newStatus, $id]); + + $con->commit(); + } catch (Exception $eLocal) { + $con->rollBack(); + error_log("⚠️ Local DB Update Failed: " . $eLocal->getMessage()); + } + } + + // --------------------------------------------------------- + // 3. 🔥 إشعار الراكب عبر السوكيت (القطعة المفقودة) 🔥 + // --------------------------------------------------------- + + // أ. جلب معرف الراكب لإرسال الإشعار له + // نستخدم connection الرحلات لضمان وجود البيانات + $stmtPas = $con_ride->prepare("SELECT passenger_id FROM ride WHERE id = ?"); + $stmtPas->execute([$id]); + $passenger_id = $stmtPas->fetchColumn(); + + if ($passenger_id) { + $payload = [ + 'ride_id' => $id, + 'status' => 'cancelled', // هذه الحالة يستقبلها الفلاتر ويغلق الواجهة + 'msg' => 'للأسف، قام السائق بإلغاء الرحلة.' + ]; + + // استدعاء الدالة المعرفة في functions.php/connect.php + if (function_exists('notifyPassengerOnRideServer')) { + notifyPassengerOnRideServer($passenger_id, $payload); + error_log("📡 [cancelRide.php] Notification sent to Passenger ID: $passenger_id"); + } else { + error_log("⚠️ [cancelRide.php] Function notifyPassengerOnRideServer not found!"); + } + } + + // --------------------------------------------------------- + // 4. إنهاء العملية + // --------------------------------------------------------- + error_log("✅ [cancelRide.php] Ride cancelled successfully."); + jsonSuccess(null, "Ride cancelled successfully"); + + } else { + // الفشل يعني أن الرحلة غير موجودة أو حالتها لا تسمح بالإلغاء (مثلاً بدأت بالفعل) + error_log("⚠️ [cancelRide.php] Failed. ID invalid OR Status not allowed (maybe started?)."); + jsonError("Cannot cancel ride. Status might be started or already completed."); + } + +} catch (PDOException $e) { + error_log("❌ [cancelRide.php] Database Error: " . $e->getMessage()); + jsonError("Database Error: " . $e->getMessage()); +} +?> \ No newline at end of file diff --git a/backend/ride/rides/cancel_ride_by_driver.php b/backend/ride/rides/cancel_ride_by_driver.php new file mode 100755 index 0000000..d2e54ee --- /dev/null +++ b/backend/ride/rides/cancel_ride_by_driver.php @@ -0,0 +1,148 @@ +getMessage()); +} + +$rideId = filterRequest("ride_id"); +$driverId = filterRequest("driver_id"); +$reason = filterRequest("reason"); +$passengerToken = filterRequest("passenger_token"); + +// تثبيت الحالة +$statusText = "CancelFromDriverAfterApply"; + +if (!$rideId || !$driverId) { + jsonError("Missing parameters"); + exit; +} + +try { + $con->beginTransaction(); + + // --------------------------------------------------------- + // 1. معالجة driver_orders (Insert or Update) + // --------------------------------------------------------- + $checkStmt = $con->prepare("SELECT order_id FROM driver_orders WHERE order_id = ? AND driver_id = ?"); + $checkStmt->execute([$rideId, $driverId]); + + if ($checkStmt->rowCount() > 0) { + // موجود: تحديث + $stmtLog = $con->prepare("UPDATE driver_orders SET status = ?, notes = ?, created_at = NOW() WHERE order_id = ? AND driver_id = ?"); + $stmtLog->execute([$statusText, $reason, $rideId, $driverId]); + } else { + // غير موجود: إدخال + $stmtLog = $con->prepare("INSERT INTO driver_orders (driver_id, order_id, status, created_at, notes) VALUES (?, ?, ?, NOW(), ?)"); + $stmtLog->execute([$driverId, $rideId, $statusText, $reason]); + } + + // --------------------------------------------------------- + // 2. منطق الحظر (Business Logic) + // --------------------------------------------------------- + $stmtCount = $con->prepare(" + SELECT COUNT(*) FROM driver_orders + WHERE driver_id = ? + AND status = ? + AND created_at >= NOW() - INTERVAL 1 DAY + "); + $stmtCount->execute([$driverId, $statusText]); + $cancelCount = $stmtCount->fetchColumn(); + + $isBlocked = false; + $blockUntil = ""; + + if ($cancelCount >= 3) { + $isBlocked = true; + $blockUntil = date('Y-m-d H:i:s', strtotime('+4 hours')); + // يمكنك هنا تحديث حالة السائق في جدول driver إذا لزم الأمر + } + + // --------------------------------------------------------- + // 3. تحديث حالة الرحلة في جدول ride + // --------------------------------------------------------- + $sqlRide = "UPDATE ride SET status = ?, driver_id = 0 WHERE id = ?"; + + // Local DB + $con->prepare($sqlRide)->execute([$statusText, $rideId]); + + // Remote DB (إن وجد) + if (isset($con_ride)) { + $con_ride->prepare($sqlRide)->execute([$statusText, $rideId]); + } + + // --------------------------------------------------------- + // 4. إشعار الراكب + // --------------------------------------------------------- + + // أ) Socket (يحتاج Passenger ID) + $stmtPas = $con->prepare("SELECT passenger_id FROM ride WHERE id = ?"); + $stmtPas->execute([$rideId]); + $passenger_id = $stmtPas->fetchColumn(); + + if ($passenger_id) { + $socketPayload = [ + 'ride_id' => $rideId, + 'status' => 'cancelled_by_driver', + 'msg' => 'تم إلغاء الرحلة من قبل السائق' + ]; + if (function_exists('notifyPassengerOnRideServer')) { + notifyPassengerOnRideServer($passenger_id, $socketPayload); + } + } + + // ب) FCM (Internal) + if (empty($passengerToken) && $passenger_id) { + $stmtToken = $con->prepare("SELECT token FROM tokens WHERE passengerID = ? ORDER BY id DESC LIMIT 1"); + $stmtToken->execute([$passenger_id]); + $rawToken = $stmtToken->fetchColumn(); + if ($rawToken) { + $passengerToken = $rawToken; + if (!empty($encryptionHelper)) { + try { + $decrypted = $encryptionHelper->decryptData($rawToken); + if ($decrypted !== false && !empty($decrypted)) { + $passengerToken = trim($decrypted); + } + } catch (Exception $e) { + // Fallback + } + } + } + } + + if (!empty($passengerToken)) { + $fcmData = [ + 'category' => 'Cancel Trip from driver', + 'ride_id' => (string)$rideId + ]; + + // 🔥 استخدام الدالة الجديدة + sendFCM_Internal( + $passengerToken, // الهدف + "تم إلغاء الرحلة ❌", // العنوان + "عذراً، قام السائق بإلغاء الرحلة.", // النص + $fcmData, // البيانات + "Cancel Trip from driver", // التصنيف (تأكد أنه يطابق ما في تطبيق الراكب) + false // ليس Topic + ); + } + + $con->commit(); + + // 5. الرد للفلاتر + echo json_encode([ + "status" => "success", + "cancel_count" => $cancelCount, + "is_blocked" => $isBlocked, + "block_until" => $blockUntil + ]); + +} catch (PDOException $e) { + if ($con->inTransaction()) $con->rollBack(); + jsonError("DB Error: " . $e->getMessage()); +} +?> \ No newline at end of file diff --git a/backend/ride/rides/cancel_ride_by_passenger.php b/backend/ride/rides/cancel_ride_by_passenger.php new file mode 100755 index 0000000..c369b09 --- /dev/null +++ b/backend/ride/rides/cancel_ride_by_passenger.php @@ -0,0 +1,147 @@ +getMessage()); +} + +// cancel_ride_by_passenger.php + +$rideId = filterRequest("ride_id"); +$reason = filterRequest("reason"); + +if (!$rideId) { + jsonError("Missing Ride ID"); + exit; +} + +try { + // جلب بيانات الرحلة للتحقق + $stmt = $con->prepare("SELECT driver_id, status FROM ride WHERE id = ?"); + $stmt->execute([$rideId]); + $ride = $stmt->fetch(PDO::FETCH_ASSOC); + + if (!$ride) { + jsonError("Ride not found"); + exit; + } + + $driverId = $ride['driver_id']; + $currentStatus = $ride['status']; + + if ($currentStatus == 'Begin') { + jsonError("Cannot cancel started ride"); + exit; + } + + // ================================================================= + // 1. تحديث قواعد البيانات (Transaction) + // ================================================================= + $con->beginTransaction(); + + // تحديث waitingRides + $updateWaiting = $con->prepare("UPDATE waitingRides SET status = ? WHERE id = ?"); + $updateWaiting->execute(['cancelled_by_passenger', $rideId]); + + // تحديث ride (محلي) + $updateRide = $con->prepare("UPDATE ride SET status = ?, updated_at = NOW() WHERE id = ?"); + $updateRide->execute(['cancelled_by_passenger', $rideId]); + + // تحديث driver_orders + if ($driverId > 0) { + $updateOrder = $con->prepare("UPDATE driver_orders SET status = 'cancelled_by_passenger', notes = ? WHERE order_id = ? AND driver_id = ?"); + $updateOrder->execute([$reason, $rideId, $driverId]); + } + + $con->commit(); + + // تحديث السيرفر البعيد (Remote DB) + if (isset($con_ride)) { + try { + $updateRide2 = $con_ride->prepare("UPDATE ride SET status = ?, updated_at = NOW() WHERE id = ?"); + $updateRide2->execute(['cancelled_by_passenger', $rideId]); + } catch (PDOException $e) { + error_log("Secondary DB update failed: " . $e->getMessage()); + } + } + + // ================================================================= + // 2. إشعار السائق (Socket + FCM) + // ================================================================= + if ($driverId > 0) { + + // أ) Socket (إشعار السائق في التطبيق فوراً) + $socketUrl = 'http://188.68.36.205:2021'; + $internalKeyPath = '/home/intaleq-api/.internal_socket_key'; + $internalKey = file_exists($internalKeyPath) ? trim(file_get_contents($internalKeyPath)) : ''; + + $ch = curl_init($socketUrl); + curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); + curl_setopt($ch, CURLOPT_POST, true); + curl_setopt($ch, CURLOPT_POSTFIELDS, http_build_query([ + 'action' => 'cancel_ride', + 'driver_id' => $driverId, + 'ride_id' => $rideId, + 'reason' => $reason + ])); + if (!empty($internalKey)) curl_setopt($ch, CURLOPT_HTTPHEADER, ["x-internal-key: $internalKey"]); + curl_setopt($ch, CURLOPT_TIMEOUT_MS, 500); + curl_setopt($ch, CURLOPT_NOSIGNAL, 1); + @curl_exec($ch); + curl_close($ch); + + // ب) FCM (باستخدام الدالة الجديدة مع فك التشفير) + $driverToken = filterRequest("driver_token"); + + if (empty($driverToken)) { + $stmtToken = $con->prepare("SELECT token FROM driverToken WHERE captain_id = ?"); + $stmtToken->execute([$driverId]); + $rawToken = $stmtToken->fetchColumn(); + + if ($rawToken) { + $driverToken = $rawToken; + + // 🔥 محاولة فك التشفير (لأن التوكنات غالباً مشفرة) + if (!empty($encryptionHelper)) { + try { + $decrypted = $encryptionHelper->decryptData($rawToken); + if ($decrypted !== false && !empty($decrypted)) { + $driverToken = trim($decrypted); + } + } catch (Exception $e) { + // في حال الفشل نستخدم الخام + } + } + } + } + + if (!empty($driverToken)) { + // تجهيز البيانات + $fcmData = [ + 'category' => 'Cancel Trip', + 'ride_id' => (string)$rideId, + 'reason' => $reason + ]; + + // إرسال الإشعار + sendFCM_Internal( + $driverToken, // الهدف + "إلغاء الرحلة 🚫", // العنوان + "قام الراكب بإلغاء الرحلة: $reason", // النص + $fcmData, // البيانات + 'Cancel Trip', // التصنيف + false // ليس Topic + ); + } + } + + jsonSuccess(null, "Ride cancelled successfully"); + +} catch (PDOException $e) { + if ($con->inTransaction()) $con->rollBack(); + error_log("Cancel ride error: " . $e->getMessage()); + jsonError("Database error occurred"); +} +?> \ No newline at end of file diff --git a/backend/ride/rides/cron_ride_timeout.php b/backend/ride/rides/cron_ride_timeout.php new file mode 100755 index 0000000..12cf541 --- /dev/null +++ b/backend/ride/rides/cron_ride_timeout.php @@ -0,0 +1,64 @@ +prepare($sqlUpdate); + $stmtUpdate->execute(); + $updatedCount = $stmtUpdate->rowCount(); + + // ========================================================= + // الخطوة 2: الحذف من جدول الانتظار (تنظيف Hot Data) + // ========================================================= + + $sqlDelete = "DELETE FROM waitingRides + WHERE created_at < DATE_SUB(NOW(), INTERVAL $minutesLimit MINUTE)"; + + $stmtDelete = $con->prepare($sqlDelete); + $stmtDelete->execute(); + $deletedCount = $stmtDelete->rowCount(); + + // ========================================================= + // الخطوة 3: (اختياري) تنظيف الريدز + // ========================================================= + // بما أنك تستخدم Redis، المفترض أن تحذفها منه أيضاً. + // لكن بما أن الريدز يعتمد على TTL (Expire) أو سيتم تحديثه عند الطلب القادم، + // فالحذف من الـ MySQL يكفي لأن getRideWaiting سيفحص MySQL ولن يجدها. + + // تقرير العملية + if ($deletedCount > 0) { + $msg = "✅ [Cleanup Cron] Success: Timed out $updatedCount rides in Main DB, and Deleted $deletedCount rides from Waiting DB."; + error_log($msg); + echo json_encode(["status" => "success", "message" => $msg]); + } else { + $msg = "💤 [Cleanup Cron] No expired rides found."; + error_log($msg); + echo json_encode(["status" => "success", "message" => "Nothing to clean."]); + } + +} catch (PDOException $e) { + $errorMsg = "❌ [Cleanup Cron] Error: " . $e->getMessage(); + error_log($errorMsg); + echo json_encode(["status" => "failure", "message" => $e->getMessage()]); +} +?> \ No newline at end of file diff --git a/backend/ride/rides/delete.php b/backend/ride/rides/delete.php new file mode 100644 index 0000000..2297df3 --- /dev/null +++ b/backend/ride/rides/delete.php @@ -0,0 +1,19 @@ +prepare($sql); +$stmt->bindParam(':id', $id, PDO::PARAM_INT); +$stmt->execute(); + +// التحقق من نجاح العملية +if ($stmt->rowCount() > 0) { + jsonSuccess(null, "Ride deleted successfully"); +} else { + jsonError("Failed to delete ride"); +} +?> \ No newline at end of file diff --git a/backend/ride/rides/emailToPassengerTripDetail.php b/backend/ride/rides/emailToPassengerTripDetail.php new file mode 100644 index 0000000..b34deba --- /dev/null +++ b/backend/ride/rides/emailToPassengerTripDetail.php @@ -0,0 +1,89 @@ + + + + + +Tripz Logo +

Hi $passengerName,

+

Thank you for booking your ride with Tripz. Here are the details of your recent trip:

+ + + + + + + + + + +
DetailValue
Passenger$passengerName
Email$passengerEmail
Phone$passengerPhone
Fee$$fee
Start Location$startLocation ($startNameLocation)
End Location$endLocation ($endNameLocation)
Time of Trip$timeOfTrip
Duration$duration minutes
"; + +if ($discount > 0) { + $bodyEmail .= "

You have received a 12% discount on your trip from $startNameLocation to $endNameLocation. The original fee was $$beforDiscount. Your discounted fee is $$fee.

"; +} + +$bodyEmail .= "

Thank you for using Tripz. We hope you have a great day!

Best regards,
Tripz Team

"; + +// إعداد البريد +$mail = new PHPMailer(true); + +try { + $mail->isSMTP(); + $mail->Host = 'smtp.hostinger.com'; + $mail->SMTPAuth = true; + $mail->Username = 'hamzaayed@tripz-egypt.com'; + $mail->Password = $TRIPZ_SMTP_PASSWORD; + $mail->SMTPSecure = PHPMailer::ENCRYPTION_STARTTLS; + $mail->Port = 587; + + $mail->setFrom('hamzaayed@tripz-egypt.com', 'Tripz'); + $mail->addAddress($passengerEmail, $passengerName); + $mail->isHTML(true); + $mail->Subject = 'Your Tripz Trip Details'; + $mail->Body = $bodyEmail; + + $mail->send(); + echo json_encode(["status" => "success", "message" => "Email sent successfully"]); +} catch (Exception $e) { + echo json_encode(["status" => "error", "message" => $mail->ErrorInfo]); +} \ No newline at end of file diff --git a/backend/ride/rides/error_log b/backend/ride/rides/error_log new file mode 100644 index 0000000..e69de29 diff --git a/backend/ride/rides/finish_ride_updates.php b/backend/ride/rides/finish_ride_updates.php new file mode 100755 index 0000000..e6b9a34 --- /dev/null +++ b/backend/ride/rides/finish_ride_updates.php @@ -0,0 +1,290 @@ +getMessage()); +} + +// ============================================================ +// finish_ride_updates.php — Atomic Server-to-Server +// ============================================================ +// Driver App calls this ONCE with raw ride data (NOT the price). +// Server calculates price securely, processes payment via S2S, +// and atomically updates all databases within a transaction. +// +// Flow: +// 1. Receive raw params from driver app +// 2. Calculate price server-side (from DB + actual distance) +// 3. BEGIN TRANSACTION (local DB) +// 4. Update ride on local DB + remote DB (con_ride) +// 5. Update driver_orders +// 6. S2S cURL → Wallet Payment Server (process_ride_payments.php) +// 7. If payment OK → COMMIT, notify passenger (Socket + FCM) +// 8. If payment FAIL → ROLLBACK, ride stays 'Begin', safe retry +// ============================================================ + +// --- Secure S2S Configuration --- +define('S2S_SHARED_KEY', getenv('S2S_SHARED_KEY') ); +define('WALLET_PAYMENT_URL', 'https://walletintaleq.intaleq.xyz/v1/main/ride/payment/process_ride_payments.php'); + +// ============================================================ +// 1. Receive Raw Parameters (NO price from client) +// ============================================================ +$rideId = filterRequest("rideId"); +$driver_id = filterRequest("driver_id"); +$passengerId = filterRequest("passengerId"); +$newStatus = filterRequest("status"); // Expected: "Finished" +$actualDistance = filterRequest("actualDistance"); +$actualDuration = filterRequest("actualDuration"); +$passengerToken = filterRequest("passengerToken"); +$driver_token = filterRequest("driver_token"); +$walletChecked = filterRequest("walletChecked"); +$passengerWalletBurc = filterRequest("passengerWalletBurc"); + +if (empty($rideId) || empty($newStatus) || empty($driver_id) || empty($passengerId)) { + jsonError("Missing required parameters: rideId, driver_id, passengerId, status"); + exit; +} + +if ($newStatus !== 'Finished') { + jsonError("Invalid status. Expected: Finished"); + exit; +} + +// ============================================================ +// 2. Server-Side Price Calculation (Secure — NOT from client) +// ============================================================ +try { + // Fetch ride data from remote/local DB for server-side calculation + $stmtRideData = $con->prepare(" + SELECT id, price AS quoted_price, car_type, + distance AS planned_distance, passenger_id, driver_id + FROM ride WHERE id = ? AND driver_id = ? + LIMIT 1 + "); + $stmtRideData->execute([$rideId, $driver_id]); + $rideData = $stmtRideData->fetch(PDO::FETCH_ASSOC); + + if (!$rideData) { + jsonError("Ride not found or driver mismatch."); + exit; + } + + $quotedPrice = floatval($rideData['quoted_price'] ?? 0); + $kazanPercent = 10; + $carType = $rideData['car_type'] ?? 'Fixed Price'; + + // Fixed-price types: use quoted price as-is + $fixedPriceTypes = ['Speed', 'Fixed Price', 'Awfar Car']; + if (in_array($carType, $fixedPriceTypes)) { + $finalPrice = $quotedPrice; + } else { + // Variable pricing: calculate from actual distance + $cleanDist = preg_replace('/[^0-9.]/', '', $actualDistance); + $distanceKm = floatval($cleanDist); + + if ($distanceKm <= 0) { + $finalPrice = $quotedPrice; // fallback + } else { + $perKmRate = getPerKmRate($carType); + $perMinRate = getPerMinRate(); + $durationMin = intval(preg_replace('/[^0-9]/', '', $actualDuration)); + + $calculated = ($distanceKm * $perKmRate) + ($durationMin * $perMinRate); + $calculated *= (1 + ($kazanPercent / 100)); + + $finalPrice = max($quotedPrice, round($calculated, 2)); + } + } +} catch (PDOException $e) { + jsonError("Error calculating price: " . $e->getMessage()); + exit; +} + +// ============================================================ +// 3. Atomic Transaction: Update DBs + Process Payment +// ============================================================ +try { + // --- Update Remote DB (con_ride) FIRST --- + // (Not in transaction — remote DB doesn't support cross-DB rollback, + // but we keep it minimal as a "best-effort" update) + if (isset($con_ride)) { + $stmtRemote = $con_ride->prepare( + "UPDATE ride SET status = ?, rideTimeFinish = NOW(), price = ? WHERE id = ? AND status = 'Begin'" + ); + $stmtRemote->execute([$newStatus, $finalPrice, $rideId]); + } + + // --- BEGIN Local DB Transaction --- + $con->beginTransaction(); + + // 3a. Update ride (local DB) + $stmtLocal = $con->prepare( + "UPDATE ride SET status = ?, rideTimeFinish = NOW(), price = ? WHERE id = ? AND status = 'Begin'" + ); + $stmtLocal->execute([$newStatus, $finalPrice, $rideId]); + + if ($stmtLocal->rowCount() == 0) { + throw new Exception("Ride already finished or not found in local DB."); + } + + // 3b. Update driver_orders + $checkStmt = $con->prepare("SELECT order_id FROM driver_orders WHERE order_id = ?"); + $checkStmt->execute([$rideId]); + + if ($checkStmt->rowCount() > 0) { + $con->prepare("UPDATE driver_orders SET driver_id = ?, status = ?, created_at = NOW() WHERE order_id = ?") + ->execute([$driver_id, $newStatus, $rideId]); + } else { + $con->prepare("INSERT INTO driver_orders (driver_id, order_id, created_at, status) VALUES (?, ?, NOW(), ?)") + ->execute([$driver_id, $rideId, $newStatus]); + } + + // ============================================================ + // 3c. Server-to-Server Payment Processing (S2S) + // ============================================================ + $paymentPayload = [ + 'rideId' => $rideId, + 'driverId' => $driver_id, + 'passengerId' => $passengerId, + 'paymentAmount' => $finalPrice, + 'paymentMethod' => ($walletChecked === 'true') ? 'wallet' : 'cash', + 'walletChecked' => $walletChecked, + 'passengerWalletBurc' => $passengerWalletBurc, + 'authToken' => $driver_token, + ]; + + $ch = curl_init(WALLET_PAYMENT_URL); + curl_setopt_array($ch, [ + CURLOPT_POST => true, + CURLOPT_POSTFIELDS => http_build_query($paymentPayload), + CURLOPT_RETURNTRANSFER => true, + CURLOPT_TIMEOUT => 15, + CURLOPT_HTTPHEADER => [ + 'Content-Type: application/x-www-form-urlencoded', + 'X-S2S-Api-Key: ' . S2S_SHARED_KEY, + ], + ]); + + $paymentResponse = curl_exec($ch); + $httpStatusCode = curl_getinfo($ch, CURLINFO_HTTP_CODE); + $curlError = curl_error($ch); + curl_close($ch); + + // Validate payment response + $paymentSuccess = false; + $paymentError = ''; + + if ($curlError) { + $paymentError = "S2S connection error: " . $curlError; + } elseif ($httpStatusCode !== 200) { + $paymentError = "Payment server returned HTTP $httpStatusCode"; + } else { + $paymentResult = json_decode($paymentResponse, true); + if ($paymentResult && isset($paymentResult['status']) && $paymentResult['status'] === 'success') { + $paymentSuccess = true; + } else { + $paymentError = $paymentResult['error'] ?? 'Payment server returned failure'; + } + } + + if (!$paymentSuccess) { + // ❌ Payment failed — ROLLBACK everything + $con->rollBack(); + error_log("[finish_ride_updates] Payment FAILED for ride $rideId: $paymentError"); + jsonError("Payment processing failed: $paymentError"); + exit; + } + + // ✅ Payment succeeded — COMMIT + $con->commit(); + + // ============================================================ + // 4. Notifications (After successful commit) + // ============================================================ + $passenger_id = $passengerId; // alias for legacy code + + if (!empty($passenger_id)) { + // Legacy list for backward compatibility + $legacyList = [ + (string)$driver_id, + (string)$rideId, + (string)$driver_token, + (string)$finalPrice + ]; + + // a) Socket notification + $socketPayload = [ + 'ride_id' => $rideId, + 'status' => 'finished', + 'price' => $finalPrice, + 'DriverList' => $legacyList + ]; + + if (function_exists('notifyPassengerOnRideServer')) { + notifyPassengerOnRideServer($passenger_id, $socketPayload); + } + + // b) FCM notification + if (!empty($passengerToken)) { + $fcmData = [ + 'ride_id' => (string)$rideId, + 'price' => (string)$finalPrice, + 'DriverList' => $legacyList + ]; + + sendFCM_Internal( + $passengerToken, + "تم إنهاء الرحلة 🏁", + "المبلغ المطلوب: " . $finalPrice . " ل.س", + $fcmData, + 'Driver Finish Trip', + false + ); + } + } + + // ============================================================ + // 5. Return Success with server-calculated price + // ============================================================ + jsonSuccess([ + 'price' => $finalPrice, + 'rideId' => $rideId + ], "Ride finished and payment processed successfully."); + +} catch (Exception $e) { + if (isset($con) && $con->inTransaction()) { + $con->rollBack(); + } + error_log("[finish_ride_updates] Error for ride $rideId: " . $e->getMessage()); + jsonError("Transaction failed: " . $e->getMessage()); +} + +// ============================================================ +// Helper Functions +// ============================================================ + +function getPerKmRate(string $carType): float { + $rates = [ + 'Comfort' => 44, + 'Lady' => 44, + 'Mishwar Vip' => 50, + 'Electric' => 45, + 'Van' => 63, + 'Delivery' => 25, + 'Speed' => 36, + 'Fixed Price' => 36, + 'Awfar Car' => 36, + ]; + return $rates[$carType] ?? 36; +} + +function getPerMinRate(): float { + $hour = (int)date('H'); + if ($hour >= 21 || $hour < 1) return 11; // Late + if ($hour >= 14 && $hour <= 17) return 10; // Peak + return 9; // Normal +} +?> diff --git a/backend/ride/rides/get.php b/backend/ride/rides/get.php new file mode 100755 index 0000000..5b29861 --- /dev/null +++ b/backend/ride/rides/get.php @@ -0,0 +1,48 @@ +prepare($baseSql); + $stmt->execute($params); + $row = $stmt->fetch(PDO::FETCH_ASSOC); + $total_rows = $row['total_rows'] ?? 0; + + if ($total_rows > 0) { + // Step 2: Fetch the latest 10 ride records + $rideSql = "SELECT * FROM `ride`"; + if (!empty($passenger_id)) { + $rideSql .= " WHERE passenger_id = :passenger_id ORDER BY created_at DESC LIMIT 10"; + } elseif (!empty($driver_id)) { + $rideSql .= " WHERE driver_id = :driver_id ORDER BY created_at DESC LIMIT 10"; + } + + $rideStmt = $con->prepare($rideSql); + $rideStmt->execute($params); + $rides = $rideStmt->fetchAll(PDO::FETCH_ASSOC); + + echo json_encode([ + "status" => "success", + "data" => $rides + ]); + } else { + jsonSuccess([], "No rides found"); + } +} catch (PDOException $e) { + jsonError("Database error: " . $e->getMessage()); +} +?> \ No newline at end of file diff --git a/backend/ride/rides/getRealTimeHeatmap.php b/backend/ride/rides/getRealTimeHeatmap.php new file mode 100755 index 0000000..77bbe3c --- /dev/null +++ b/backend/ride/rides/getRealTimeHeatmap.php @@ -0,0 +1,91 @@ +prepare("SELECT start_lat, start_lng FROM waitingRides WHERE status IN ('wait', 'waiting')"); + $stmtW->execute(); + while ($row = $stmtW->fetch(PDO::FETCH_ASSOC)) { + addToGrid($grid, $row['start_lat'], $row['start_lng'], $precision, $WEIGHT_WAITING); + } + + // 2. طلبات ضائعة (Timeout) + $stmtM = $con->prepare("SELECT start_location FROM ride WHERE (status = 'timeout' OR status = 'cancelled_no_driver_found') AND created_at >= DATE_SUB(NOW(), INTERVAL 20 MINUTE)"); + $stmtM->execute(); + while ($row = $stmtM->fetch(PDO::FETCH_ASSOC)) { + $parts = explode(',', $row['start_location']); + if (count($parts) == 2) addToGrid($grid, $parts[0], $parts[1], $precision, $WEIGHT_MISSED); + } + + // 3. طلبات نشطة (Active) + $stmtA = $con->prepare("SELECT start_location FROM ride WHERE created_at >= DATE_SUB(NOW(), INTERVAL 15 MINUTE) AND status NOT IN ('timeout', 'cancelled_no_driver_found')"); + $stmtA->execute(); + while ($row = $stmtA->fetch(PDO::FETCH_ASSOC)) { + $parts = explode(',', $row['start_location']); + if (count($parts) == 2) addToGrid($grid, $parts[0], $parts[1], $precision, $WEIGHT_ACTIVE); + } + + // تجهيز البيانات النهائية + $finalData = []; + foreach ($grid as $cell) { + $score = $cell['score']; // مجموع النقاط (الوزن) + $count = $cell['count']; // العدد الحقيقي للطلبات + + // 🧠 المنطق المزدوج: نحدد اللون بناءً على النقاط أو العدد + $intensity = "low"; + $surge = 1.0; + + // المعادلة: منطقة حمراء إذا كان السكور عالي جداً (مشاكل) أو العدد كبير جداً (زحمة) + if ($score >= 15 || $count >= 5) { + $intensity = "high"; // أحمر (خطر/فرصة ذهبية) + $surge = 1.5; + } elseif ($score >= 8 || $count >= 3) { + $intensity = "medium"; // برتقالي + $surge = 1.2; + } elseif ($score >= 3 || $count >= 1) { + $intensity = "normal"; // أصفر + } + + if ($score > 0) { + $finalData[] = [ + 'lat' => $cell['lat'], + 'lng' => $cell['lng'], + 'count' => $count, // ✅ العدد الحقيقي (مهم للعرض) + 'intensity' => $intensity, // ✅ التصنيف الذكي + 'surge' => $surge + ]; + } + } + + file_put_contents('heatmap_live.json', json_encode($finalData)); // الكاش + + echo json_encode(["status" => "success", "data" => $finalData]); + +} catch (Exception $e) { + echo json_encode(["status" => "failure", "message" => $e->getMessage()]); +} + +function addToGrid(&$grid, $lat, $lng, $precision, $weight) { + if (empty($lat) || empty($lng)) return; + $rLat = round(floatval($lat), $precision); + $rLng = round(floatval($lng), $precision); + $key = "$rLat,$rLng"; + + if (!isset($grid[$key])) { + $grid[$key] = ['lat' => $rLat, 'lng' => $rLng, 'count' => 0, 'score' => 0]; + } + $grid[$key]['count']++; // زيادة العدد (+1 دائماً) + $grid[$key]['score'] += $weight; // زيادة الوزن (حسب نوع الطلب) +} +?> \ No newline at end of file diff --git a/backend/ride/rides/getRideOrderID.php b/backend/ride/rides/getRideOrderID.php new file mode 100755 index 0000000..f8532ff --- /dev/null +++ b/backend/ride/rides/getRideOrderID.php @@ -0,0 +1,158 @@ +getMessage()); + http_response_code(500); + echo json_encode(["status" => "failure", "message" => "Database connection failed"]); + exit; +} + +// استلام البيانات (يمكن استلام ID الرحلة أو ID الراكب) +$passengerID = filterRequest("passengerID"); +$rideID = filterRequest("id"); // إضافة استقبال متغير رقم الرحلة + +try { + // ================================================================= + // 1. الخطوة الأولى: تحديد استراتيجية البحث (بواسطة رقم الرحلة أو الراكب) + // ================================================================= + + $sqlRide = "SELECT + id, + start_location, + end_location, + date, + driver_id, + passenger_id, + price, + status, + created_at, + DriverIsGoingToPassenger, + rideTimeStart, + rideTimeFinish, + price_for_driver, + distance + FROM ride "; + + // المنطق الجديد: + // إذا تم إرسال rideID، نبحث عن الرحلة المحددة بدقة (تجنباً لأي تضارب) + // إذا لم يتم إرساله، نبحث عن أحدث رحلة للراكب (للتتبع المباشر) + if (!empty($rideID)) { + $sqlRide .= "WHERE id = :rideID"; + } else { + $sqlRide .= "WHERE passenger_id = :passengerID ORDER BY id DESC LIMIT 1"; + } + + // نستخدم المتغير $con_ride (سيرفر الرحلات) + $stmtRide = $con_ride->prepare($sqlRide); + + // ربط المتغيرات حسب نوع البحث + if (!empty($rideID)) { + $stmtRide->bindParam(':rideID', $rideID); + } else { + $stmtRide->bindParam(':passengerID', $passengerID); + } + + $stmtRide->execute(); + + $rideData = $stmtRide->fetch(PDO::FETCH_ASSOC); + + // إذا لم يتم العثور على رحلة في سيرفر الرحلات، نوقف العملية + if (!$rideData) { + echo json_encode(["status" => "failure", "message" => "No ride found"]); + exit; + } + + // ================================================================= + // 2. الخطوة الثانية: جلب البيانات الثابتة (سائق، سيارة، تقييم) من السيرفر الرئيسي ($con) + // نستخدم المعرفات التي حصلنا عليها من نتيجة الاستعلام الأول + // ================================================================= + + $driverID = $rideData['driver_id']; + $pID = $rideData['passenger_id']; // نأخذ معرف الراكب من الرحلة نفسها لضمان التطابق + + // ملاحظة: استخدام :driverID_Sub في الاستعلام الفرعي لتجنب أخطاء PDO + $sqlDetails = "SELECT + passengers.first_name AS passengerName, + passengers.last_name, + + CarRegistration.make, + CarRegistration.model, + CarRegistration.car_plate, + CarRegistration.year, + CarRegistration.color, + CarRegistration.color_hex, + + driver.first_name AS driverName, + driver.gender, + driver.phone, + + ( + SELECT ROUND(AVG(ratingDriver.rating), 2) + FROM ratingDriver + WHERE ratingDriver.driver_id = :driverID_Sub + ) AS ratingDriver, + + driverToken.token AS token + + FROM driver + LEFT JOIN passengers ON passengers.id = :passengerID + LEFT JOIN CarRegistration ON CarRegistration.driverID = driver.id + LEFT JOIN driverToken ON driverToken.captain_id = driver.id + WHERE driver.id = :driverID"; + + // نستخدم المتغير الأصلي $con للسيرفر الرئيسي + $stmtDetails = $con->prepare($sqlDetails); + + // نربط المتغيرات + $stmtDetails->bindParam(':driverID', $driverID); + $stmtDetails->bindParam(':driverID_Sub', $driverID); + $stmtDetails->bindParam(':passengerID', $pID); + + $stmtDetails->execute(); + + $detailsData = $stmtDetails->fetch(PDO::FETCH_ASSOC); + + // ================================================================= + // 3. الخطوة الثالثة: دمج البيانات وتجهيز الرد + // ================================================================= + + $finalData = []; + + if ($detailsData) { + // دمج مصفوفة الرحلة (من سيرفر الرحلات) مع مصفوفة التفاصيل (من الرئيسي) + $finalData = array_merge($rideData, $detailsData); + } else { + // في حال كانت الرحلة بدون سائق بعد، نكتفي ببيانات الرحلة + $finalData = $rideData; + } + + // ================================================================= + // 4. فك التشفير (Decrypt) + // ================================================================= + + if ($finalData) { + $fieldsToDecrypt = ['driverName', 'gender', 'phone', 'car_plate', 'passengerName', 'last_name', 'token']; + + foreach ($fieldsToDecrypt as $field) { + if (!empty($finalData[$field])) { + $finalData[$field] = $encryptionHelper->decryptData($finalData[$field]); + } + } + } + + echo json_encode([ + "status" => "success", + "data" => $finalData + ]); + +} catch (Exception $e) { + error_log("API Error: " . $e->getMessage()); + http_response_code(500); + echo json_encode(["status" => "failure", "message" => "Server Error: " . $e->getMessage()]); +} +?> \ No newline at end of file diff --git a/backend/ride/rides/getRideOrderIDNew.php b/backend/ride/rides/getRideOrderIDNew.php new file mode 100755 index 0000000..3aecd1b --- /dev/null +++ b/backend/ride/rides/getRideOrderIDNew.php @@ -0,0 +1,148 @@ +prepare($sqlRide); + + // ربط المتغيرات حسب نوع البحث + if (!empty($rideID)) { + $stmtRide->bindParam(':rideID', $rideID); + } else { + $stmtRide->bindParam(':passengerID', $passengerID); + } + + $stmtRide->execute(); + + $rideData = $stmtRide->fetch(PDO::FETCH_ASSOC); + + // إذا لم يتم العثور على رحلة في سيرفر الرحلات، نوقف العملية + if (!$rideData) { + echo json_encode(["status" => "failure", "message" => "No ride found"]); + exit; + } + + // ================================================================= + // 2. الخطوة الثانية: جلب البيانات الثابتة (سائق، سيارة، تقييم) من السيرفر الرئيسي ($con) + // نستخدم المعرفات التي حصلنا عليها من نتيجة الاستعلام الأول + // ================================================================= + + $driverID = $rideData['driver_id']; + $pID = $rideData['passenger_id']; // نأخذ معرف الراكب من الرحلة نفسها لضمان التطابق + + // ملاحظة: استخدام :driverID_Sub في الاستعلام الفرعي لتجنب أخطاء PDO + $sqlDetails = "SELECT + passengers.first_name AS passengerName, + passengers.last_name, + + CarRegistration.make, + CarRegistration.model, + CarRegistration.car_plate, + CarRegistration.year, + CarRegistration.color, + CarRegistration.color_hex, + + driver.first_name AS driverName, + driver.gender, + driver.phone, + + ( + SELECT ROUND(AVG(ratingDriver.rating), 2) + FROM ratingDriver + WHERE ratingDriver.driver_id = :driverID_Sub + ) AS ratingDriver, + + driverToken.token AS token + + FROM driver + LEFT JOIN passengers ON passengers.id = :passengerID + LEFT JOIN CarRegistration ON CarRegistration.driverID = driver.id + LEFT JOIN driverToken ON driverToken.captain_id = driver.id + WHERE driver.id = :driverID"; + + // نستخدم المتغير الأصلي $con للسيرفر الرئيسي + $stmtDetails = $con->prepare($sqlDetails); + + // نربط المتغيرات + $stmtDetails->bindParam(':driverID', $driverID); + $stmtDetails->bindParam(':driverID_Sub', $driverID); + $stmtDetails->bindParam(':passengerID', $pID); + + $stmtDetails->execute(); + + $detailsData = $stmtDetails->fetch(PDO::FETCH_ASSOC); + + // ================================================================= + // 3. الخطوة الثالثة: دمج البيانات وتجهيز الرد + // ================================================================= + + $finalData = []; + + if ($detailsData) { + // دمج مصفوفة الرحلة (من سيرفر الرحلات) مع مصفوفة التفاصيل (من الرئيسي) + $finalData = array_merge($rideData, $detailsData); + } else { + // في حال كانت الرحلة بدون سائق بعد، نكتفي ببيانات الرحلة + $finalData = $rideData; + } + + // ================================================================= + // 4. فك التشفير (Decrypt) + // ================================================================= + + if ($finalData) { + $fieldsToDecrypt = ['driverName', 'gender', 'phone', 'car_plate', 'passengerName', 'last_name', 'token']; + + foreach ($fieldsToDecrypt as $field) { + if (!empty($finalData[$field])) { + $finalData[$field] = $encryptionHelper->decryptData($finalData[$field]); + } + } + } + + echo json_encode([ + "status" => "success", + "data" => $finalData + ]); + +} catch (Exception $e) { + error_log("API Error: " . $e->getMessage()); + http_response_code(500); + echo json_encode(["status" => "failure", "message" => "Server Error: " . $e->getMessage()]); +} +?> \ No newline at end of file diff --git a/backend/ride/rides/getRideStatus.php b/backend/ride/rides/getRideStatus.php new file mode 100644 index 0000000..2f7ce45 --- /dev/null +++ b/backend/ride/rides/getRideStatus.php @@ -0,0 +1,26 @@ +prepare($sql); +$stmt->bindParam(':id', $id, PDO::PARAM_INT); +$stmt->execute(); + +$row = $stmt->fetch(PDO::FETCH_ASSOC); + +if ($row && isset($row['status'])) { + echo json_encode([ + "status" => "success", + "data" => $row['status'] + ]); +} else { + jsonError("Ride not found."); +} +?> \ No newline at end of file diff --git a/backend/ride/rides/getRideStatusBegin.php b/backend/ride/rides/getRideStatusBegin.php new file mode 100644 index 0000000..9599287 --- /dev/null +++ b/backend/ride/rides/getRideStatusBegin.php @@ -0,0 +1,27 @@ +prepare($sql); +$stmt->bindParam(':ride_id', $ride_id, PDO::PARAM_INT); +$stmt->execute(); + +$row = $stmt->fetch(PDO::FETCH_ASSOC); + +if ($row) { + echo json_encode([ + "status" => "success", + "data" => $row + ]); +} else { + jsonError("Ride not found."); +} +?> \ No newline at end of file diff --git a/backend/ride/rides/getRideStatusFromStartApp.php b/backend/ride/rides/getRideStatusFromStartApp.php new file mode 100644 index 0000000..3059949 --- /dev/null +++ b/backend/ride/rides/getRideStatusFromStartApp.php @@ -0,0 +1,93 @@ +prepare(" + SELECT + id AS rideId, + status, + start_location, + end_location, + carType, + driver_id,distance, + price, + created_at + FROM ride + WHERE passenger_id = ? + AND ( + status IN ('Apply', 'Applied', 'accepted', 'arrived', 'Arrived', 'Begin') AND created_at >= NOW() - INTERVAL 24 HOUR + OR (status = 'Finished' AND created_at >= NOW() - INTERVAL 24 HOUR) + ) + ORDER BY created_at DESC + LIMIT 1 + "); + + $stmt->execute([$passenger_id]); + $ride = $stmt->fetch(PDO::FETCH_ASSOC); + + if (!$ride) { + echo json_encode(["status" => "failure", "message" => "No active ride found"]); + exit; + } + + // ========================================================= + // 2. السيرفر الرئيسي: جلب اسم السائق + متوسط تقييمه العام + // ========================================================= + + // ملاحظة: تم الحفاظ على الاستعلام كما هو + // rateDriver: هو الاسم الذي سنستخدمه في PHP + $stmt2 = $con->prepare(" + SELECT + d.first_name AS driverName, + (SELECT AVG(rating) FROM ratingDriver WHERE driver_id = d.id) AS rateDriver, + (SELECT COUNT(*) FROM ratingDriver WHERE ride_id = ?) AS thisRideRated + FROM driver d + WHERE d.id = ? + "); + + $stmt2->execute([$ride['rideId'], $ride['driver_id']]); + $driverData = $stmt2->fetch(PDO::FETCH_ASSOC); + + // ========================================================= + // 3. المعالجة النهائية + // ========================================================= + + if ($driverData) { + // فك التشفير + $ride['driverName'] = $encryptionHelper->decryptData($driverData['driverName']); + + // --- تصحيح الخطأ هنا --- + // كان يستدعي driverAvg وهو غير موجود، تم تغييره لـ rateDriver + $ride['rateDriver'] = $driverData['rateDriver'] ? round($driverData['rateDriver'], 2) : 5; + + // --- منطق هل تحتاج الرحلة لتقييم (needsReview) --- + $isFinished = ($ride['status'] === 'Finished'); + $isRated = ($driverData['thisRideRated'] > 0); + + $ride['needsReview'] = ($isFinished && !$isRated) ? 1 : 0; + + } else { + // حالة عدم وجود سائق (نادراً ما تحدث إذا كان driver_id موجوداً في جدول الرحلات) + $ride['driverName'] = null; + $ride['rateDriver'] = 5; + $ride['needsReview'] = 0; + } + + // تنظيف البيانات + unset($ride['created_at']); + + echo json_encode([ + "status" => "success", + "data" => $ride + ]); + +} catch (Exception $e) { + echo json_encode(["status" => "failure", "message" => $e->getMessage()]); +} +?> \ No newline at end of file diff --git a/backend/ride/rides/getTripCountByCaptain.php b/backend/ride/rides/getTripCountByCaptain.php new file mode 100644 index 0000000..f8651fd --- /dev/null +++ b/backend/ride/rides/getTripCountByCaptain.php @@ -0,0 +1,23 @@ +prepare($sql); +$stmt->bindParam(':driver_id', $driver_id, PDO::PARAM_INT); // أو PARAM_STR حسب نوع الـ ID + +$stmt->execute(); + +if ($stmt->rowCount() > 0) { + $row = $stmt->fetch(PDO::FETCH_ASSOC); + jsonSuccess($row); +} else { + jsonError($message = "No finished ride records found for this driver"); +} +?> \ No newline at end of file diff --git a/backend/ride/rides/get_driver_location.php b/backend/ride/rides/get_driver_location.php new file mode 100755 index 0000000..3f5f11b --- /dev/null +++ b/backend/ride/rides/get_driver_location.php @@ -0,0 +1,154 @@ + "failure", "message" => "Missing Parameters"]); + exit; +} + +try { + // ================================================================= + // الخطوة 1: الاتصال بسيرفر الرحلات ($con_ride) + // الهدف: جلب driver_id وحالة الرحلة للتحقق + // ================================================================= + + $sqlRide = "SELECT driver_id, status FROM ride WHERE id = :rideID LIMIT 1"; + $stmtRide = $con_ride->prepare($sqlRide); + $stmtRide->bindParam(':rideID', $rideID); + $stmtRide->execute(); + $rideData = $stmtRide->fetch(PDO::FETCH_ASSOC); + + // إذا لم توجد الرحلة + if (!$rideData) { + echo json_encode(["status" => "failure", "message" => "Ride not found"]); + exit; + } + + $driverID = $rideData['driver_id']; + $status = $rideData['status']; + + // ================================================================= + // الخطوة 2: التحقق الأمني (Hashing Validation) + // القاعدة: Token = MD5(rideID + driverID + SecretSalt) + // هذا يضمن أن الرابط تم توليده بواسطة التطبيق ولم يتم تخمينه + // ================================================================= + + // * هام: هذه الكلمة السرية يجب أن تكون مطابقة تماماً للموجودة في تطبيق Flutter + $secretSalt = getenv("secretSaltParent"); + + // إعادة بناء الهاش للمقارنة + $generatedToken = md5($rideID . $driverID . $secretSalt); + + if ($token !== $generatedToken) { + http_response_code(403); + echo json_encode(["status" => "failure", "message" => "Invalid Security Token"]); + exit; + } + + // ================================================================= + // الخطوة 3: التحقق من حالة الرحلة (Logic Check) + // الشرط: التتبع يعمل فقط إذا كانت الرحلة قد بدأت + // ================================================================= + + // يمكنك إضافة 'Applied' أو 'Arrived' إذا أردت التتبع قبل الركوب + $allowedStatuses = ['Begin', 'inProgress']; + + if (!in_array($status, $allowedStatuses)) { + echo json_encode(["status" => "failure", "message" => "Ride is not active", "ride_status" => $status]); + exit; + } + + // ================================================================= + // الخطوة 4: الاتصال بسيرفر التتبع ($con_tracking) + // الهدف: جلب أحدث إحداثيات للسائق + // ================================================================= + + $sqlLoc = "SELECT latitude, longitude, heading, speed, updated_at + FROM car_locations + WHERE driver_id = :driverID + ORDER BY updated_at DESC LIMIT 1"; + + $stmtLoc = $con_tracking->prepare($sqlLoc); + $stmtLoc->bindParam(':driverID', $driverID); + $stmtLoc->execute(); + $locData = $stmtLoc->fetch(PDO::FETCH_ASSOC); + + if (!$locData) { + // السائق لم يرسل موقعه بعد + echo json_encode(["status" => "failure", "message" => "Waiting for driver signal..."]); + exit; + } + + // ================================================================= + // الخطوة 5: الاتصال بالسيرفر الرئيسي ($con) + // الهدف: جلب اسم السائق وموديل السيارة للعرض (اختياري لجمالية الصفحة) + // ================================================================= + + $sqlDriver = "SELECT + d.first_name, + d.last_name, + c.model, + c.color, + c.car_plate + FROM driver d + LEFT JOIN CarRegistration c ON d.id = c.driverID + WHERE d.id = :driverID LIMIT 1"; + + $stmtDriver = $con->prepare($sqlDriver); + $stmtDriver->bindParam(':driverID', $driverID); + $stmtDriver->execute(); + $driverInfo = $stmtDriver->fetch(PDO::FETCH_ASSOC); + + // فك التشفير إذا لزم الأمر (أسماء السائقين واللوحات غالباً مشفرة) + if ($driverInfo) { + // فك تشفير الاسم + if (!empty($driverInfo['first_name'])) { + $driverInfo['first_name'] = $encryptionHelper->decryptData($driverInfo['first_name']); + } + // فك تشفير اللوحة + if (!empty($driverInfo['car_plate'])) { + $driverInfo['car_plate'] = $encryptionHelper->decryptData($driverInfo['car_plate']); + } + // يمكنك فك تشفير باقي الحقول حسب الحاجة + } + + // ================================================================= + // الخطوة 6: تجميع البيانات وإرسال الرد النهائي + // ================================================================= + + $response = [ + "status" => "success", + "data" => [ + "lat" => $locData['latitude'], + "lng" => $locData['longitude'], + "heading" => $locData['heading'], + "speed" => $locData['speed'], + "last_update" => $locData['updated_at'], + "driver_name" => $driverInfo['first_name'] ?? "Captain", + "car_model" => $driverInfo['model'] ?? "", + "car_color" => $driverInfo['color'] ?? "", + "plate" => $driverInfo['car_plate'] ?? "" + ] + ]; + + echo json_encode($response); + +} catch (Exception $e) { + // تسجيل الخطأ دون إظهاره للمستخدم العام + error_log("Tracking Error: " . $e->getMessage()); + echo json_encode(["status" => "failure", "message" => "Server Error"]); +} +?> \ No newline at end of file diff --git a/backend/ride/rides/gterideForDriverManyTime.php b/backend/ride/rides/gterideForDriverManyTime.php new file mode 100644 index 0000000..b582a14 --- /dev/null +++ b/backend/ride/rides/gterideForDriverManyTime.php @@ -0,0 +1,32 @@ +prepare($sql); +$stmt->execute(); + +$row = $stmt->fetch(PDO::FETCH_ASSOC); + +echo json_encode([ + "status" => "success", + "data" => $row +]); +?> \ No newline at end of file diff --git a/backend/ride/rides/heatmap_live.json b/backend/ride/rides/heatmap_live.json new file mode 100644 index 0000000..de88c03 --- /dev/null +++ b/backend/ride/rides/heatmap_live.json @@ -0,0 +1,7 @@ +[ + {"lat": 33.5100, "lng": 36.2700, "count": 5, "intensity": "high", "surge": 1.5}, + {"lat": 33.5200, "lng": 36.2800, "count": 3, "intensity": "medium", "surge": 1.2}, + {"lat": 33.5150, "lng": 36.2750, "count": 2, "intensity": "normal", "surge": 1.0}, + {"lat": 33.5050, "lng": 36.2650, "count": 6, "intensity": "high", "surge": 1.5}, + {"lat": 33.5250, "lng": 36.2850, "count": 1, "intensity": "low", "surge": 1.0} +] \ No newline at end of file diff --git a/backend/ride/rides/public_track_location.php b/backend/ride/rides/public_track_location.php new file mode 100755 index 0000000..7ad2e94 --- /dev/null +++ b/backend/ride/rides/public_track_location.php @@ -0,0 +1,99 @@ + "failure", "message" => $message], $extra)); + exit; +} + +try { + $rideID = filter_input(INPUT_GET, 'id', FILTER_SANITIZE_NUMBER_INT); + $token = filter_input(INPUT_GET, 'token', FILTER_SANITIZE_SPECIAL_CHARS); + + if (!$rideID || !$token) { + sendError("Missing parameters"); + } + + $stmtRide = $con_ride->prepare("SELECT driver_id, status FROM ride WHERE id = ? LIMIT 1"); + $stmtRide->execute([$rideID]); + $rideData = $stmtRide->fetch(PDO::FETCH_ASSOC); + + if (!$rideData) sendError("Ride not found"); + + $driverID = $rideData['driver_id']; + $status = $rideData['status']; + $secretSalt = "Intaleq_Secure_Track_2025"; + $generatedToken = md5(trim(strval($rideID)) . trim(strval($driverID)) . $secretSalt); + + if ($token !== $generatedToken) sendError("Invalid Token"); + + $allowedStatuses = ['Applied', 'Arrived', 'Begin', 'inProgress']; + if (!in_array($status, $allowedStatuses)) { + sendError("Ride not active", 200, ["current_status" => $status]); + } + + $stmtLoc = $con_tracking->prepare("SELECT latitude, longitude, heading, speed, updated_at FROM car_locations WHERE driver_id = ? ORDER BY updated_at DESC LIMIT 1"); + $stmtLoc->execute([$driverID]); + $locData = $stmtLoc->fetch(PDO::FETCH_ASSOC); + + if (!$locData) sendError("Waiting for driver signal...", 200); + + $stmtDriver = $con->prepare("SELECT d.first_name, c.model, c.color, c.car_plate FROM driver d LEFT JOIN CarRegistration c ON d.id = c.driverID WHERE d.id = ? LIMIT 1"); + $stmtDriver->execute([$driverID]); + $driverInfo = $stmtDriver->fetch(PDO::FETCH_ASSOC); + + $driverName = "Captain"; + $carModel = "Car"; + $carColor = ""; + $plate = ""; + + if ($driverInfo) { + if (!empty($driverInfo['first_name'])) $driverName = $encryptionHelper->decryptData($driverInfo['first_name']); + if (!empty($driverInfo['model'])) $carModel = $driverInfo['model']; + if (!empty($driverInfo['color'])) $carColor = $driverInfo['color']; + if (!empty($driverInfo['car_plate'])) $plate = $encryptionHelper->decryptData($driverInfo['car_plate']); + } + + $response = [ + "status" => "success", + "data" => [ + "lat" => $locData['latitude'], + "lng" => $locData['longitude'], + "heading" => $locData['heading'], + "speed" => $locData['speed'], + "last_update" => $locData['updated_at'], + "driver_name" => $driverName, + "car_model" => $carModel, + "car_color" => $carColor, + "plate" => $plate, + "ride_status" => $status + ] + ]; + + // التنظيف النهائي قبل الطباعة + ob_clean(); + echo json_encode($response); + +} catch (Exception $e) { + error_log("Tracking API Error: " . $e->getMessage()); + sendError("Server Error"); +} \ No newline at end of file diff --git a/backend/ride/rides/retry_search_drivers.php b/backend/ride/rides/retry_search_drivers.php new file mode 100755 index 0000000..2b57fc6 --- /dev/null +++ b/backend/ride/rides/retry_search_drivers.php @@ -0,0 +1,107 @@ +prepare("UPDATE ride SET status = 'waiting', driver_id = 0, updated_at = NOW() WHERE id = ?"); + $updateStmt->execute([$rideId]); + + // 3. حساب العمولة (Kazan) + $kazan = (double)$price - (double)$priceForDriver; + + // 4. بناء Payload مطابق لـ add_ride.php (0 - 33) + $payloadTemplate = []; + $payloadTemplate[0] = (string)$startLat; + $payloadTemplate[1] = (string)$startLng; + $payloadTemplate[2] = (string)number_format((float)$price, 2, '.', ''); + $payloadTemplate[3] = (string)$endLat; + $payloadTemplate[4] = (string)$endLng; + $payloadTemplate[5] = (string)$distanceText; + $payloadTemplate[6] = ""; // Driver ID placeholder + $payloadTemplate[7] = (string)$passengerId; + $payloadTemplate[8] = (string)$passengerName; + $payloadTemplate[9] = (string)$passengerToken; + $payloadTemplate[10] = (string)$passengerPhone; + $payloadTemplate[11] = (string)$distance; + $payloadTemplate[12] = "1"; + $payloadTemplate[13] = (string)$isWallet; + $payloadTemplate[14] = (string)$distance; + $payloadTemplate[15] = (string)$durationText; + $payloadTemplate[16] = (string)$rideId; + $payloadTemplate[17] = ""; + $payloadTemplate[18] = ""; // Driver ID placeholder + $payloadTemplate[19] = (string)$durationText; + $payloadTemplate[20] = (string)$hasSteps; + $payloadTemplate[21] = (string)$step0; + $payloadTemplate[22] = (string)$step1; + $payloadTemplate[23] = (string)$step2; + $payloadTemplate[24] = (string)$step3; + $payloadTemplate[25] = (string)$step4; + $payloadTemplate[26] = (string)number_format((float)$priceForDriver, 2, '.', ''); + $payloadTemplate[27] = (string)$passengerWallet; + $payloadTemplate[28] = (string)$passengerEmail; + $payloadTemplate[29] = (string)$startName; + $payloadTemplate[30] = (string)$endName; + $payloadTemplate[31] = (string)$carType; + $payloadTemplate[32] = (string)number_format($kazan, 2, '.', ''); + $payloadTemplate[33] = (string)$passengerRating; + + ksort($payloadTemplate); + $payloadTemplate = array_values($payloadTemplate); + + // 5. البحث عن السائقين وإرسال الطلب (Using Helper Function) + $latVal = doubleval($startLat); + $lngVal = doubleval($startLng); + + $driversData = findBestDrivers($con, $con_tracking, $latVal, $lngVal, $carType); + + if (!empty($driversData)) { + // استدعاء دالة الإرسال الموحدة (الموجودة في functions.php) + dispatchRideToDrivers($driversData, $rideId, $payloadTemplate, $startName); + } + + jsonSuccess(null, "Ride reset and resent to drivers"); + +} catch (PDOException $e) { + jsonError("DB Error: " . $e->getMessage()); +} +?> \ No newline at end of file diff --git a/backend/ride/rides/start_ride.php b/backend/ride/rides/start_ride.php new file mode 100755 index 0000000..82fe456 --- /dev/null +++ b/backend/ride/rides/start_ride.php @@ -0,0 +1,104 @@ +getMessage()); +} + +$ride_id = filterRequest("id"); +$driver_id = filterRequest("driver_id"); +$status = filterRequest("status"); // 'Begin' +$passengerToken = filterRequest("passengerToken"); + +if (!$ride_id || !$driver_id || !$status) { + jsonError("Missing parameters"); + exit; +} + +try { + // 1. تحديث سيرفر الرحلات (Remote DB - con_ride) + $stmtRemote = $con_ride->prepare("UPDATE ride SET status = ?, rideTimeStart = NOW() WHERE id = ?"); + $stmtRemote->execute([$status, $ride_id]); + + if ($stmtRemote->rowCount() == 0) { + // ملاحظة: أحياناً التحديث لا يؤثر بصفوف إذا كانت البيانات نفسها، + // لكن هنا نفترض الفشل إذا لم يجد الرحلة. + // يمكنك إكمال التنفيذ إذا كنت متأكداً أن الرحلة موجودة. + } + + // 2. تحديث السيرفر المحلي (Local DB) والمعاملات + $con->beginTransaction(); + + // تحديث الرحلة محلياً + $stmtMainRide = $con->prepare("UPDATE ride SET status = ?, rideTimeStart = NOW() WHERE id = ?"); + $stmtMainRide->execute([$status, $ride_id]); + + // تحديث أو إدخال في جدول Driver Orders + $checkSql = "SELECT `order_id` FROM `driver_orders` WHERE `order_id` = ?"; + $checkStmt = $con->prepare($checkSql); + $checkStmt->execute([$ride_id]); + + if ($checkStmt->rowCount() > 0) { + $updateSql = "UPDATE `driver_orders` SET `driver_id` = ?, `status` = ?, `created_at` = NOW() WHERE `order_id` = ?"; + $con->prepare($updateSql)->execute([$driver_id, $status, $ride_id]); + } else { + $insertSql = "INSERT INTO `driver_orders` (`driver_id`, `order_id`, `created_at`, `status`) VALUES (?, ?, NOW(), ?)"; + $con->prepare($insertSql)->execute([$driver_id, $ride_id, $status]); + } + + // ================================================================= + // 🔥 الخطوة 3: إشعار الراكب (Socket + FCM) + // ================================================================= + + // جلب بيانات الراكب من قاعدة البيانات لضمان الدقة + $stmtPas = $con_ride->prepare("SELECT passenger_id FROM ride WHERE id = ?"); + $stmtPas->execute([$ride_id]); + $passenger_id = $stmtPas->fetchColumn(); + + if ($passenger_id) { + + // أ) إرسال السوكيت (Socket) + // تم إلغاء التعليق عنه ليكون السيرفر هو المسؤول + $socketPayload = [ + 'ride_id' => $ride_id, + 'status' => 'started', // أو 'Begin' حسب ما يتوقعه التطبيق + 'msg' => 'بدأت الرحلة، نتمنى لك سلامة الوصول 🚀' + ]; + + if (function_exists('notifyPassengerOnRideServer')) { + notifyPassengerOnRideServer($passenger_id, $socketPayload); + } + + // ب) إرسال FCM (Internal) + if (!empty($passengerToken)) { + $fcmData = [ + 'category' => 'Trip is Begin', + 'ride_id' => (string)$ride_id, + 'status' => 'started' + ]; + + // 🔥 استخدام sendFCM_Internal كرسالة صامتة + sendFCM_Internal( + $passengerToken, // الهدف + "", // تفريغ العنوان + "", // تفريغ النص + $fcmData, // البيانات + "Trip is Begin", // التصنيف + false // ليس Topic + ); + } + } + + $con->commit(); + jsonSuccess(null, "Ride started successfully"); + +} catch (PDOException $e) { + if ($con->inTransaction()) { + $con->rollBack(); + } + jsonError("Exception: " . $e->getMessage()); +} +?> \ No newline at end of file diff --git a/backend/ride/rides/test_notification.php b/backend/ride/rides/test_notification.php new file mode 100755 index 0000000..f7714bf --- /dev/null +++ b/backend/ride/rides/test_notification.php @@ -0,0 +1,40 @@ + 'dispatch_order', + 'drivers_ids' => json_encode([$driverId]), + 'ride_id' => $rideId, + 'payload' => $payload +]; + +$ch = curl_init($socketUrl); +curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); +curl_setopt($ch, CURLOPT_POST, true); +curl_setopt($ch, CURLOPT_POSTFIELDS, http_build_query($postData)); +curl_setopt($ch, CURLOPT_HTTPHEADER, ["x-internal-key: $INTERNAL_KEY"]); +curl_setopt($ch, CURLOPT_TIMEOUT, 3); + +$response = curl_exec($ch); +$httpCode = curl_getinfo($ch, CURLINFO_HTTP_CODE); + +if (curl_errno($ch)) { + die("Curl error: " . curl_error($ch)); +} +curl_close($ch); + +echo "HTTP Code: $httpCode\n"; +echo "Response: $response\n"; diff --git a/backend/ride/rides/update.php b/backend/ride/rides/update.php new file mode 100755 index 0000000..6568304 --- /dev/null +++ b/backend/ride/rides/update.php @@ -0,0 +1,89 @@ + $id]; + +// قائمة الحقول القابلة للتحديث +$fields = [ + "start_location", "end_location", "date", "time", "endtime", "price", + "passenger_id", "driver_id", "status", "created_at", "updated_at", + "rideTimeStart", "rideTimeFinish", "price_for_driver", "driverGoToPassengerTime", + "price_for_passenger", "distance" +]; + +// بناء الاستعلام ديناميكياً باستخدام filterRequest +foreach ($fields as $field) { + // نتحقق من وجود المفتاح في الـ POST + if (isset($_POST[$field])) { + // نستخدم دالة الفلترة الخاصة بك + $value = filterRequest($field); + + $columnValues[] = "`$field` = :$field"; + $params[":$field"] = $value; + } +} + +// إذا لم يتم إرسال أي حقول للتحديث +if (empty($columnValues)) { + error_log("⚠️ [update.php] No data provided in request to update."); + jsonError("No data provided for update."); + exit; +} + +// تجميع جملة SQL +$setClause = implode(", ", $columnValues); +$sql = "UPDATE `ride` SET $setClause WHERE `id` = :id"; + +try { + // --------------------------------------------------------- + // 1. التحديث على سيرفر التتبع (Remote DB) - هو الأساس + // --------------------------------------------------------- + error_log("🔄 [update.php] Attempting to update REMOTE Tracking DB for Ride ID: $id"); + + $stmtRemote = $con_ride->prepare($sql); + $stmtRemote->execute($params); + + $count = $stmtRemote->rowCount(); + error_log("ℹ️ [update.php] Remote DB Rows Affected: $count"); + + // التحقق: هل نجح التحديث هناك؟ + if ($count > 0) { + + // --------------------------------------------------------- + // 2. التحديث على السيرفر المحلي (Local DB) للمطابقة + // --------------------------------------------------------- + error_log("🔄 [update.php] Remote success. Updating LOCAL Main DB..."); + + $stmtLocal = $con->prepare($sql); + $stmtLocal->execute($params); + + error_log("✅ [update.php] Update successful on both servers."); + + // استخدام دالة النجاح الخاصة بك + jsonSuccess(null, "Ride data updated successfully"); + + } else { + // لم يتم التحديث (إما البيانات نفسها لم تتغير، أو المعرف غير موجود في السيرفر البعيد) + error_log("⚠️ [update.php] Remote Update returned 0 rows (Data same or ID not found)."); + + // استخدام دالة الفشل (يمكنك تغيير الرسالة لتكون success إذا كنت لا تعتبر عدم تغيير البيانات خطأ) + jsonError("No changes made (Remote DB affected 0 rows). Check ID or Data."); + } + +} catch (PDOException $e) { + error_log("❌ [update.php] Database Error: " . $e->getMessage()); + jsonError("Database Error: " . $e->getMessage()); +} +?> \ No newline at end of file diff --git a/backend/ride/rides/updateRideAndCheckIfApplied.php b/backend/ride/rides/updateRideAndCheckIfApplied.php new file mode 100644 index 0000000..3cff662 --- /dev/null +++ b/backend/ride/rides/updateRideAndCheckIfApplied.php @@ -0,0 +1,47 @@ +prepare($sqlCheck); +$stmtCheck->bindParam(":rideId", $rideId); +$stmtCheck->execute(); + +$ride = $stmtCheck->fetch(PDO::FETCH_ASSOC); + +if (!$ride) { + jsonError("Ride not found."); + exit; +} + +if ($ride['status'] === 'Apply') { + jsonError("This ride is already applied by another driver."); + exit; +} + +// Step 2: تحديث حالة الرحلة وربط السائق بها +$sqlUpdate = "UPDATE `ride` + SET `driver_id` = :driverId, + `status` = 'Apply', + `rideTimeStart` = :rideTimeStart + WHERE `id` = :rideId"; + +$stmtUpdate = $con->prepare($sqlUpdate); +$stmtUpdate->bindParam(":driverId", $driverId); +$stmtUpdate->bindParam(":rideTimeStart", $rideTimeStart); +$stmtUpdate->bindParam(":rideId", $rideId); + +$stmtUpdate->execute(); + +if ($stmtUpdate->rowCount() > 0) { + jsonSuccess(null, "Ride data updated successfully"); + // يمكنك هنا إرسال إشعار للسائقين الآخرين إذا أردت + // FirebaseMessagesController()->sendNotificationToOtherDrivers(...) +} else { + jsonError("Failed to update ride data."); +} +?> \ No newline at end of file diff --git a/backend/ride/rides/updateStausFromSpeed.php b/backend/ride/rides/updateStausFromSpeed.php new file mode 100755 index 0000000..25d3854 --- /dev/null +++ b/backend/ride/rides/updateStausFromSpeed.php @@ -0,0 +1,79 @@ +prepare("UPDATE `ride` + SET `status` = :status, + `driver_id` = :driverId, + `rideTimeStart` = NOW() + WHERE `id` = :id + AND `status` IN ('waiting', 'wait') + "); + + $stmtRideRemote->execute([ + ':status' => $status, + ':driverId' => $driverId, + ':id' => $rideId + ]); + + $count = $stmtRideRemote->rowCount(); + error_log("ℹ️ [accept_ride.php] Remote DB Rows Affected: $count"); + + // نتحقق: هل نجح التحديث في سيرفر التتبع؟ + if ($count > 0) { + + // --------------------------------------------------------- + // 2. التحديث على السيرفر الرئيسي (تثبيت السجل فقط) + // --------------------------------------------------------- + + error_log("🔄 [accept_ride.php] Remote success. Updating LOCAL Main DB..."); + + $sqlUpdate = "UPDATE `ride` + SET `driver_id` = :driverId, + `status` = :status, + `rideTimeStart` = NOW() + WHERE id = :rideId + AND `status` IN ('waiting', 'wait') "; + + $stmtUpdate = $con->prepare($sqlUpdate); + $stmtUpdate->bindParam(":driverId", $driverId); + $stmtUpdate->bindParam(":status", $status); + $stmtUpdate->bindParam(":rideId", $rideId); + $stmtUpdate->execute(); + + error_log("✅ [accept_ride.php] Ride accepted and started successfully for Driver: $driverId"); + jsonSuccess(null, "Ride accepted and started successfully at " . date('Y-m-d H:i:s')); + + } else { + error_log("⚠️ [accept_ride.php] Failed to accept ride. It might be already taken, canceled, or invalid status."); + jsonError("Ride cannot be accepted (Already taken, Canceled, or Invalid Status)."); + } + +} catch (PDOException $e) { + error_log("❌ [accept_ride.php] Database Error: " . $e->getMessage()); + jsonError("Database Error: " . $e->getMessage()); +} +?> \ No newline at end of file diff --git a/backend/ride/rides/update_ride_cancel_wait.php b/backend/ride/rides/update_ride_cancel_wait.php new file mode 100755 index 0000000..2d801d9 --- /dev/null +++ b/backend/ride/rides/update_ride_cancel_wait.php @@ -0,0 +1,30 @@ +beginTransaction(); + + // 1. تحديث جدول الرحلات + $stmtRide = $con->prepare("UPDATE ride SET status = ?, rideTimeStart = NOW() WHERE id = ?"); + $stmtRide->execute([$status, $rideId]); + + // 2. تحديث جدول طلبات السائقين + // نستخدم Check لضمان عدم تكرار التحديث إذا كان محدثاً مسبقاً + $stmtOrder = $con->prepare("UPDATE driver_orders SET status = ? WHERE order_id = ? AND driver_id = ?"); + $stmtOrder->execute([$status, $rideId, $driverId]); + + $con->commit(); + jsonSuccess(null, "Ride status updated"); + +} catch (PDOException $e) { + $con->rollBack(); + jsonError("DB Error"); +} +?> \ No newline at end of file diff --git a/backend/ride/seferWallet/add.php b/backend/ride/seferWallet/add.php new file mode 100644 index 0000000..feb1223 --- /dev/null +++ b/backend/ride/seferWallet/add.php @@ -0,0 +1,39 @@ +prepare($sql); +$stmt->bindParam(':driver_id', $driver_id, PDO::PARAM_STR); +$stmt->bindParam(':passenger_id', $passenger_id, PDO::PARAM_STR); +$stmt->bindParam(':amount', $amount, PDO::PARAM_STR); +$stmt->bindParam(':payment_method', $payment_method, PDO::PARAM_STR); +$stmt->bindParam(':token', $token, PDO::PARAM_STR); + +if ($stmt->execute()) { + // Print a success message + jsonSuccess($message = "Wallet data saved successfully"); +} else { + // Print a failure message + jsonError($message = "Failed to save wallet data"); +} +?> \ No newline at end of file diff --git a/backend/ride/seferWallet/error_log b/backend/ride/seferWallet/error_log new file mode 100644 index 0000000..e69de29 diff --git a/backend/ride/seferWallet/get.php b/backend/ride/seferWallet/get.php new file mode 100644 index 0000000..16e0427 --- /dev/null +++ b/backend/ride/seferWallet/get.php @@ -0,0 +1,29 @@ +prepare($sql); +$stmt->execute(); +$result = $stmt->fetchAll(PDO::FETCH_ASSOC); + +if ($stmt->rowCount() > 0) { + // Print the retrieved data + // echo json_encode($result); + jsonSuccess($data = $result); +} else { + // Print a failure message + + jsonError($message = "No driver order data found"); +} + +?> \ No newline at end of file diff --git a/backend/ride/tips/add.php b/backend/ride/tips/add.php new file mode 100755 index 0000000..d083e4a --- /dev/null +++ b/backend/ride/tips/add.php @@ -0,0 +1,32 @@ + 99999999.99) { + jsonError("Invalid tip amount."); + exit(); +} + +// إدراج بيانات البقشيش +$sql = "INSERT INTO `tips` (`driverID`, `passengerID`, `rideID`, `tipAmount`) + VALUES (:driverID, :passengerID, :rideID, :tipAmount)"; + +$stmt = $con->prepare($sql); +$stmt->bindParam(':driverID', $driverID); +$stmt->bindParam(':passengerID', $passengerID); +$stmt->bindParam(':rideID', $rideID); +$stmt->bindParam(':tipAmount', $tipAmount); + +// تنفيذ العملية +if ($stmt->execute() && $stmt->rowCount() > 0) { + jsonSuccess(null, "Tip inserted successfully"); +} else { + jsonError("Failed to save tip information"); +} +?> \ No newline at end of file diff --git a/backend/ride/tips/get.php b/backend/ride/tips/get.php new file mode 100644 index 0000000..7a31ee3 --- /dev/null +++ b/backend/ride/tips/get.php @@ -0,0 +1,35 @@ +prepare($sql); +$stmt->bindParam(':driverID', $driverID); +$stmt->bindParam(':passengerID', $passengerID); + +$stmt->execute(); +$data = $stmt->fetchAll(PDO::FETCH_ASSOC); + +// فحص النتائج +if ($data) { + jsonSuccess($data); +} else { + jsonError("No tips records found"); +} +?> \ No newline at end of file diff --git a/backend/ride/videos_driver/error_log b/backend/ride/videos_driver/error_log new file mode 100644 index 0000000..e69de29 diff --git a/backend/ride/videos_driver/get.php b/backend/ride/videos_driver/get.php new file mode 100755 index 0000000..e2976ce --- /dev/null +++ b/backend/ride/videos_driver/get.php @@ -0,0 +1,14 @@ +prepare($sql); +$stmt->execute(); +$data = $stmt->fetchAll(PDO::FETCH_ASSOC); + +if ($data) { + jsonSuccess($data); +} else { + jsonError("No video records found"); +} +?> \ No newline at end of file diff --git a/backend/schema_primary.sql b/backend/schema_primary.sql new file mode 100644 index 0000000..3efeeb6 --- /dev/null +++ b/backend/schema_primary.sql @@ -0,0 +1,1784 @@ +-- MySQL dump 10.13 Distrib 8.0.43, for Linux (x86_64) +-- +-- Host: localhost Database: intaleqDB1 +-- ------------------------------------------------------ +-- Server version 8.0.43-0ubuntu0.22.04.2 + +/*!40101 SET @OLD_CHARACTER_SET_CLIENT=@@CHARACTER_SET_CLIENT */; +/*!40101 SET @OLD_CHARACTER_SET_RESULTS=@@CHARACTER_SET_RESULTS */; +/*!40101 SET @OLD_COLLATION_CONNECTION=@@COLLATION_CONNECTION */; +/*!50503 SET NAMES utf8mb4 */; +/*!40103 SET @OLD_TIME_ZONE=@@TIME_ZONE */; +/*!40103 SET TIME_ZONE='+00:00' */; +/*!40014 SET @OLD_UNIQUE_CHECKS=@@UNIQUE_CHECKS, UNIQUE_CHECKS=0 */; +/*!40014 SET @OLD_FOREIGN_KEY_CHECKS=@@FOREIGN_KEY_CHECKS, FOREIGN_KEY_CHECKS=0 */; +/*!40101 SET @OLD_SQL_MODE=@@SQL_MODE, SQL_MODE='NO_AUTO_VALUE_ON_ZERO' */; +/*!40111 SET @OLD_SQL_NOTES=@@SQL_NOTES, SQL_NOTES=0 */; + +-- +-- Table structure for table `CarRegistration` +-- + +DROP TABLE IF EXISTS `CarRegistration`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!50503 SET character_set_client = utf8mb4 */; +CREATE TABLE `CarRegistration` ( + `id` int NOT NULL AUTO_INCREMENT, + `driverID` varchar(100) CHARACTER SET utf8mb3 COLLATE utf8mb3_general_ci NOT NULL, + `vin` varchar(100) CHARACTER SET utf8mb3 COLLATE utf8mb3_general_ci NOT NULL, + `car_plate` varchar(150) CHARACTER SET utf8mb3 COLLATE utf8mb3_general_ci DEFAULT NULL, + `make` varchar(255) CHARACTER SET utf8mb3 COLLATE utf8mb3_general_ci NOT NULL, + `model` varchar(255) CHARACTER SET utf8mb3 COLLATE utf8mb3_general_ci NOT NULL, + `year` int NOT NULL, + `expiration_date` varchar(30) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL, + `color` varchar(255) CHARACTER SET utf8mb3 COLLATE utf8mb3_general_ci NOT NULL, + `owner` varchar(255) CHARACTER SET utf8mb3 COLLATE utf8mb3_general_ci NOT NULL, + `color_hex` varchar(20) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL, + `fuel` varchar(100) CHARACTER SET utf8mb3 COLLATE utf8mb3_general_ci NOT NULL, + `isDefault` tinyint(1) NOT NULL DEFAULT '0', + `created_at` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP, + `status` varchar(20) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL DEFAULT 'yet', + `vehicle_category_id` tinyint(1) DEFAULT '1', + `fuel_type_id` tinyint DEFAULT '1', + PRIMARY KEY (`id`), + KEY `idx_driverID` (`driverID`) +) ENGINE=InnoDB AUTO_INCREMENT=1796 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci; +/*!40101 SET character_set_client = @saved_cs_client */; + +-- +-- Table structure for table `adminUser` +-- + +DROP TABLE IF EXISTS `adminUser`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!50503 SET character_set_client = utf8mb4 */; +CREATE TABLE `adminUser` ( + `id` int NOT NULL AUTO_INCREMENT, + `device_number` varchar(300) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL, + `name` varchar(150) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL, + `created_at` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP, + `updated_at` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP, + PRIMARY KEY (`id`) +) ENGINE=InnoDB AUTO_INCREMENT=8 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci; +/*!40101 SET character_set_client = @saved_cs_client */; + +-- +-- Table structure for table `api_keys` +-- + +DROP TABLE IF EXISTS `api_keys`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!50503 SET character_set_client = utf8mb4 */; +CREATE TABLE `api_keys` ( + `id` int NOT NULL AUTO_INCREMENT, + `name` varchar(20) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL, + `hashed_key` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL, + PRIMARY KEY (`id`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci; +/*!40101 SET character_set_client = @saved_cs_client */; + +-- +-- Table structure for table `blacklist_driver` +-- + +DROP TABLE IF EXISTS `blacklist_driver`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!50503 SET character_set_client = utf8mb4 */; +CREATE TABLE `blacklist_driver` ( + `id` int NOT NULL AUTO_INCREMENT, + `driver_id` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL, + `phone` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL, + `reason` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT 'Violation', + `created_at` timestamp NULL DEFAULT CURRENT_TIMESTAMP, + PRIMARY KEY (`id`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci; +/*!40101 SET character_set_client = @saved_cs_client */; + +-- +-- Table structure for table `canecl` +-- + +DROP TABLE IF EXISTS `canecl`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!50503 SET character_set_client = utf8mb4 */; +CREATE TABLE `canecl` ( + `id` int NOT NULL AUTO_INCREMENT, + `driverID` varchar(111) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL, + `passengerID` varchar(111) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL, + `rideID` varchar(111) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL, + `note` varchar(200) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL DEFAULT 'nothing', + `created_at` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP, + PRIMARY KEY (`id`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci; +/*!40101 SET character_set_client = @saved_cs_client */; + +-- +-- Table structure for table `captains_car` +-- + +DROP TABLE IF EXISTS `captains_car`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!50503 SET character_set_client = utf8mb4 */; +CREATE TABLE `captains_car` ( + `id` int NOT NULL AUTO_INCREMENT, + `driverID` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL, + `vin` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL, + `car_plate` varchar(20) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL, + `make` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL, + `model` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL, + `year` varchar(6) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL, + `expiration_date` varchar(20) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL, + `color` varchar(30) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL, + `owner` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL, + `color_hex` char(15) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL, + `address` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL, + `displacement` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL, + `fuel` varchar(20) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL, + `registration_date` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL, + `isDefault` tinyint(1) NOT NULL DEFAULT '0', + `created_at` timestamp NULL DEFAULT CURRENT_TIMESTAMP, + PRIMARY KEY (`id`), + UNIQUE KEY `car_plate` (`car_plate`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci; +/*!40101 SET character_set_client = @saved_cs_client */; + +-- +-- Table structure for table `carPlateEdit` +-- + +DROP TABLE IF EXISTS `carPlateEdit`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!50503 SET character_set_client = utf8mb4 */; +CREATE TABLE `carPlateEdit` ( + `id` int NOT NULL AUTO_INCREMENT, + `driverId` varchar(50) NOT NULL, + `carPlate` varchar(155) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL, + `color` varchar(20) NOT NULL, + `make` varchar(50) NOT NULL, + `model` varchar(20) NOT NULL, + `expiration_date` varchar(50) NOT NULL, + `owner` varchar(155) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL, + `year` int NOT NULL, + `isEdit` tinyint(1) NOT NULL DEFAULT '0', + `employee` varchar(30) NOT NULL DEFAULT 'any', + `createdAt` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP, + PRIMARY KEY (`id`), + UNIQUE KEY `driverId` (`driverId`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci; +/*!40101 SET character_set_client = @saved_cs_client */; + +-- +-- Table structure for table `car_locations` +-- + +DROP TABLE IF EXISTS `car_locations`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!50503 SET character_set_client = utf8mb4 */; +CREATE TABLE `car_locations` ( + `driver_id` varchar(100) NOT NULL, + `latitude` decimal(10,7) NOT NULL, + `longitude` decimal(10,7) NOT NULL, + `heading` decimal(10,2) NOT NULL, + `speed` double(10,3) NOT NULL, + `distance` decimal(10,2) NOT NULL, + `status` varchar(6) NOT NULL DEFAULT 'off', + `carType` varchar(100) NOT NULL DEFAULT 'Awfar', + `created_at` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP, + `updated_at` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, + `location_point` point NOT NULL /*!80003 SRID 4326 */, + PRIMARY KEY (`driver_id`), + KEY `idx_loc_status_time` (`status`,`updated_at`,`latitude`,`longitude`), + SPATIAL KEY `idx_location_point` (`location_point`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb3; +/*!40101 SET character_set_client = @saved_cs_client */; +/*!50003 SET @saved_cs_client = @@character_set_client */ ; +/*!50003 SET @saved_cs_results = @@character_set_results */ ; +/*!50003 SET @saved_col_connection = @@collation_connection */ ; +/*!50003 SET character_set_client = utf8mb4 */ ; +/*!50003 SET character_set_results = utf8mb4 */ ; +/*!50003 SET collation_connection = utf8mb4_0900_ai_ci */ ; +/*!50003 SET @saved_sql_mode = @@sql_mode */ ; +/*!50003 SET sql_mode = 'NO_AUTO_VALUE_ON_ZERO' */ ; +DELIMITER ;; +/*!50003 CREATE*/ /*!50017 DEFINER=`intaleqUserDB1`@`%`*/ /*!50003 TRIGGER `trg_before_insert_car_locations` BEFORE INSERT ON `car_locations` FOR EACH ROW BEGIN +SET NEW.location_point = ST_PointFromText(CONCAT('POINT(', NEW.longitude, ' ', NEW.latitude, ')'), 4326); +END */;; +DELIMITER ; +/*!50003 SET sql_mode = @saved_sql_mode */ ; +/*!50003 SET character_set_client = @saved_cs_client */ ; +/*!50003 SET character_set_results = @saved_cs_results */ ; +/*!50003 SET collation_connection = @saved_col_connection */ ; +/*!50003 SET @saved_cs_client = @@character_set_client */ ; +/*!50003 SET @saved_cs_results = @@character_set_results */ ; +/*!50003 SET @saved_col_connection = @@collation_connection */ ; +/*!50003 SET character_set_client = utf8mb4 */ ; +/*!50003 SET character_set_results = utf8mb4 */ ; +/*!50003 SET collation_connection = utf8mb4_0900_ai_ci */ ; +/*!50003 SET @saved_sql_mode = @@sql_mode */ ; +/*!50003 SET sql_mode = 'NO_AUTO_VALUE_ON_ZERO' */ ; +DELIMITER ;; +/*!50003 CREATE*/ /*!50017 DEFINER=`intaleqUserDB1`@`%`*/ /*!50003 TRIGGER `trg_before_update_car_locations` BEFORE UPDATE ON `car_locations` FOR EACH ROW BEGIN +IF NEW.latitude <> OLD.latitude OR NEW.longitude <> OLD.longitude THEN +SET NEW.location_point = ST_PointFromText(CONCAT('POINT(', NEW.longitude, ' ', NEW.latitude, ')'), 4326); +END IF; +END */;; +DELIMITER ; +/*!50003 SET sql_mode = @saved_sql_mode */ ; +/*!50003 SET character_set_client = @saved_cs_client */ ; +/*!50003 SET character_set_results = @saved_cs_results */ ; +/*!50003 SET collation_connection = @saved_col_connection */ ; + +-- +-- Table structure for table `car_tracks` +-- + +DROP TABLE IF EXISTS `car_tracks`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!50503 SET character_set_client = utf8mb4 */; +CREATE TABLE `car_tracks` ( + `id` int NOT NULL AUTO_INCREMENT, + `driver_id` varchar(100) NOT NULL, + `latitude` decimal(10,7) NOT NULL, + `longitude` decimal(10,7) NOT NULL, + `heading` float DEFAULT NULL, + `speed` float DEFAULT NULL, + `distance` float DEFAULT NULL, + `status` enum('on','off') DEFAULT 'off', + `created_at` timestamp NULL DEFAULT CURRENT_TIMESTAMP, + PRIMARY KEY (`id`) +) ENGINE=InnoDB AUTO_INCREMENT=10484 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci; +/*!40101 SET character_set_client = @saved_cs_client */; + +-- +-- Table structure for table `card_images` +-- + +DROP TABLE IF EXISTS `card_images`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!50503 SET character_set_client = utf8mb4 */; +CREATE TABLE `card_images` ( + `id` int NOT NULL AUTO_INCREMENT, + `driverID` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL, + `image_name` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL, + `upload_date` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP, + `link` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL, + PRIMARY KEY (`id`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci; +/*!40101 SET character_set_client = @saved_cs_client */; + +-- +-- Table structure for table `carsToWork` +-- + +DROP TABLE IF EXISTS `carsToWork`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!50503 SET character_set_client = utf8mb4 */; +CREATE TABLE `carsToWork` ( + `id` int NOT NULL AUTO_INCREMENT, + `owner_name` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL, + `phone` varchar(70) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL, + `car_number` varchar(77) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL, + `manufacture_year` year DEFAULT NULL, + `car_model` varchar(77) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL, + `car_type` varchar(77) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL, + `site` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL, + `registration_date` date NOT NULL, + `created_at` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP, + PRIMARY KEY (`id`) +) ENGINE=InnoDB AUTO_INCREMENT=2 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci; +/*!40101 SET character_set_client = @saved_cs_client */; + +-- +-- Table structure for table `complaint` +-- + +DROP TABLE IF EXISTS `complaint`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!50503 SET character_set_client = utf8mb4 */; +CREATE TABLE `complaint` ( + `id` int NOT NULL AUTO_INCREMENT, + `ride_id` varchar(255) NOT NULL, + `passenger_id` varchar(255) DEFAULT NULL, + `driver_id` varchar(255) DEFAULT NULL, + `complaint_type` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL, + `description` text, + `date_filed` timestamp NULL DEFAULT CURRENT_TIMESTAMP, + `statusComplaint` enum('Open','In Progress','Resolved') NOT NULL DEFAULT 'Open', + `resolution` text, + `passenger_report` text, + `driver_report` text, + `cs_solutions` text, + `fault_determination` varchar(255) DEFAULT NULL, + `complaint_nature` varchar(255) DEFAULT NULL, + `date_resolved` timestamp NULL DEFAULT NULL, + PRIMARY KEY (`id`) +) ENGINE=InnoDB AUTO_INCREMENT=6 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci; +/*!40101 SET character_set_client = @saved_cs_client */; + +-- +-- Table structure for table `contactEgypt` +-- + +DROP TABLE IF EXISTS `contactEgypt`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!50503 SET character_set_client = utf8mb4 */; +CREATE TABLE `contactEgypt` ( + `id` int NOT NULL AUTO_INCREMENT, + `phones` varchar(20) NOT NULL, + `name` varchar(100) NOT NULL, + `phones2` varchar(60) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL, + `createdAt` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP, + PRIMARY KEY (`id`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci; +/*!40101 SET character_set_client = @saved_cs_client */; + +-- +-- Table structure for table `contactSyria` +-- + +DROP TABLE IF EXISTS `contactSyria`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!50503 SET character_set_client = utf8mb4 */; +CREATE TABLE `contactSyria` ( + `id` int NOT NULL AUTO_INCREMENT, + `driverId` varchar(255) NOT NULL COMMENT 'معرّف السائق الذي قام بمزامنة جهة الاتصال', + `name` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci DEFAULT NULL COMMENT 'اسم جهة الاتصال', + `phone` varchar(50) NOT NULL COMMENT 'رقم هاتف جهة الاتصال', + `sync_timestamp` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT 'وقت المزامنة', + PRIMARY KEY (`id`), + UNIQUE KEY `driver_contact_unique` (`driverId`,`phone`) +) ENGINE=InnoDB AUTO_INCREMENT=83699 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci; +/*!40101 SET character_set_client = @saved_cs_client */; + +-- +-- Table structure for table `criminalDocuments` +-- + +DROP TABLE IF EXISTS `criminalDocuments`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!50503 SET character_set_client = utf8mb4 */; +CREATE TABLE `criminalDocuments` ( + `id` int NOT NULL AUTO_INCREMENT, + `driverId` varchar(50) NOT NULL, + `IssueDate` varchar(20) NOT NULL, + `createdAt` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP, + `InspectionResult` varchar(100) NOT NULL, + PRIMARY KEY (`id`), + UNIQUE KEY `driverId` (`driverId`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci; +/*!40101 SET character_set_client = @saved_cs_client */; + +-- +-- Table structure for table `driver` +-- + +DROP TABLE IF EXISTS `driver`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!50503 SET character_set_client = utf8mb4 */; +CREATE TABLE `driver` ( + `idn` int NOT NULL AUTO_INCREMENT, + `id` varchar(100) NOT NULL, + `phone` varchar(255) CHARACTER SET utf8mb3 COLLATE utf8mb3_general_ci NOT NULL, + `email` varchar(255) NOT NULL, + `password` varchar(255) NOT NULL, + `gender` varchar(255) CHARACTER SET utf8mb3 COLLATE utf8mb3_general_ci NOT NULL DEFAULT 'Male', + `license_type` varchar(255) DEFAULT NULL, + `national_number` varchar(255) DEFAULT NULL, + `name_arabic` varchar(255) DEFAULT NULL, + `issue_date` date DEFAULT NULL, + `expiry_date` date DEFAULT NULL, + `license_categories` varchar(255) DEFAULT NULL, + `address` text, + `licenseIssueDate` varchar(50) DEFAULT NULL, + `status` varchar(20) NOT NULL DEFAULT 'notDeleted', + `birthdate` varchar(255) CHARACTER SET utf8mb3 COLLATE utf8mb3_general_ci NOT NULL, + `site` varchar(255) NOT NULL, + `first_name` varchar(255) NOT NULL, + `last_name` varchar(255) NOT NULL, + `accountBank` varchar(255) CHARACTER SET utf8mb3 COLLATE utf8mb3_general_ci NOT NULL DEFAULT 'yet', + `bankCode` varchar(255) CHARACTER SET utf8mb3 COLLATE utf8mb3_general_ci NOT NULL DEFAULT 'CIB', + `employmentType` varchar(255) CHARACTER SET utf8mb3 COLLATE utf8mb3_general_ci DEFAULT NULL, + `maritalStatus` varchar(50) CHARACTER SET utf8mb3 COLLATE utf8mb3_general_ci DEFAULT NULL, + `fullNameMaritial` varchar(255) DEFAULT NULL, + `expirationDate` varchar(50) CHARACTER SET utf8mb3 COLLATE utf8mb3_general_ci DEFAULT NULL, + `created_at` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP, + `updated_at` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, + PRIMARY KEY (`idn`), + UNIQUE KEY `national_number` (`national_number`) +) ENGINE=InnoDB AUTO_INCREMENT=2085 DEFAULT CHARSET=utf8mb3; +/*!40101 SET character_set_client = @saved_cs_client */; + +-- +-- Table structure for table `driverToken` +-- + +DROP TABLE IF EXISTS `driverToken`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!50503 SET character_set_client = utf8mb4 */; +CREATE TABLE `driverToken` ( + `id` int NOT NULL AUTO_INCREMENT, + `token` varchar(300) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL, + `captain_id` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL, + `fingerPrint` varchar(155) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL, + `created_at` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP, + PRIMARY KEY (`id`), + KEY `idx_captain_id` (`captain_id`) +) ENGINE=InnoDB AUTO_INCREMENT=1460 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci; +/*!40101 SET character_set_client = @saved_cs_client */; + +-- +-- Table structure for table `driverWallet` +-- + +DROP TABLE IF EXISTS `driverWallet`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!50503 SET character_set_client = utf8mb4 */; +CREATE TABLE `driverWallet` ( + `id` int NOT NULL AUTO_INCREMENT, + `driverID` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL, + `paymentID` varchar(200) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL, + `dateCreated` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP, + `amount` varchar(5) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL, + `paymentMethod` varchar(20) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL, + `dateUpdated` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP, + PRIMARY KEY (`id`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci; +/*!40101 SET character_set_client = @saved_cs_client */; + +-- +-- Table structure for table `driver_behavior` +-- + +DROP TABLE IF EXISTS `driver_behavior`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!50503 SET character_set_client = utf8mb4 */; +CREATE TABLE `driver_behavior` ( + `id` int NOT NULL, + `driver_id` varchar(255) NOT NULL, + `trip_id` varchar(255) NOT NULL, + `max_speed` double DEFAULT '0', + `avg_speed` double DEFAULT '0', + `hard_brakes` int DEFAULT '0', + `total_distance` double DEFAULT '0', + `behavior_score` double DEFAULT '0', + `created_at` timestamp NULL DEFAULT CURRENT_TIMESTAMP +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci; +/*!40101 SET character_set_client = @saved_cs_client */; + +-- +-- Table structure for table `driver_documents` +-- + +DROP TABLE IF EXISTS `driver_documents`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!50503 SET character_set_client = utf8mb4 */; +CREATE TABLE `driver_documents` ( + `id` int NOT NULL AUTO_INCREMENT, + `driverID` varchar(64) NOT NULL, + `doc_type` varchar(64) NOT NULL, + `image_name` varchar(255) NOT NULL, + `link` varchar(512) NOT NULL, + `upload_date` datetime NOT NULL, + PRIMARY KEY (`id`), + KEY `driverID` (`driverID`) +) ENGINE=InnoDB AUTO_INCREMENT=5089 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci; +/*!40101 SET character_set_client = @saved_cs_client */; + +-- +-- Table structure for table `driver_gifts` +-- + +DROP TABLE IF EXISTS `driver_gifts`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!50503 SET character_set_client = utf8mb4 */; +CREATE TABLE `driver_gifts` ( + `id` int NOT NULL AUTO_INCREMENT, + `driver_id` varchar(70) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL, + `gift_description` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL, + `gift_date` datetime DEFAULT CURRENT_TIMESTAMP, + `is_claimed` tinyint(1) DEFAULT '0', + PRIMARY KEY (`id`), + UNIQUE KEY `driver_id` (`driver_id`) +) ENGINE=InnoDB AUTO_INCREMENT=1377 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci; +/*!40101 SET character_set_client = @saved_cs_client */; + +-- +-- Table structure for table `driver_health_assurance` +-- + +DROP TABLE IF EXISTS `driver_health_assurance`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!50503 SET character_set_client = utf8mb4 */; +CREATE TABLE `driver_health_assurance` ( + `id` int NOT NULL AUTO_INCREMENT, + `driver_id` varchar(155) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL, + `assured` tinyint(1) DEFAULT '0', + `date_created` timestamp NULL DEFAULT CURRENT_TIMESTAMP, + `health_insurance_provider` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL, + PRIMARY KEY (`id`), + UNIQUE KEY `driver_id` (`driver_id`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci; +/*!40101 SET character_set_client = @saved_cs_client */; + +-- +-- Table structure for table `driver_orders` +-- + +DROP TABLE IF EXISTS `driver_orders`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!50503 SET character_set_client = utf8mb4 */; +CREATE TABLE `driver_orders` ( + `id` int NOT NULL AUTO_INCREMENT, + `driver_id` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL, + `order_id` varchar(99) CHARACTER SET utf8mb3 COLLATE utf8mb3_general_ci NOT NULL, + `notes` varchar(200) CHARACTER SET utf8mb3 COLLATE utf8mb3_general_ci NOT NULL DEFAULT 'nothing', + `created_at` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP, + `status` varchar(30) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT 'applied', + PRIMARY KEY (`id`) +) ENGINE=InnoDB AUTO_INCREMENT=286 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci; +/*!40101 SET character_set_client = @saved_cs_client */; + +-- +-- Table structure for table `driver_ride_scam` +-- + +DROP TABLE IF EXISTS `driver_ride_scam`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!50503 SET character_set_client = utf8mb4 */; +CREATE TABLE `driver_ride_scam` ( + `id` int NOT NULL AUTO_INCREMENT, + `driverID` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL, + `passengerID` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL, + `rideID` varchar(20) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL, + `isDriverCallPassenger` varchar(10) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL, + `dateCreated` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP, + PRIMARY KEY (`id`) +) ENGINE=InnoDB AUTO_INCREMENT=38 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci; +/*!40101 SET character_set_client = @saved_cs_client */; + +-- +-- Table structure for table `driversWantWork` +-- + +DROP TABLE IF EXISTS `driversWantWork`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!50503 SET character_set_client = utf8mb4 */; +CREATE TABLE `driversWantWork` ( + `id` int NOT NULL AUTO_INCREMENT, + `driver_name` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL, + `phone` varchar(77) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL, + `national_id` varchar(77) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL, + `birth_date` varchar(77) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL, + `license_type` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL, + `site` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL, + `created_at` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP, + PRIMARY KEY (`id`), + UNIQUE KEY `national_id` (`national_id`), + UNIQUE KEY `phone` (`phone`) +) ENGINE=InnoDB AUTO_INCREMENT=2 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci; +/*!40101 SET character_set_client = @saved_cs_client */; + +-- +-- Table structure for table `email_verifications` +-- + +DROP TABLE IF EXISTS `email_verifications`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!50503 SET character_set_client = utf8mb4 */; +CREATE TABLE `email_verifications` ( + `id` int NOT NULL AUTO_INCREMENT, + `email` varchar(255) NOT NULL, + `token` varchar(255) NOT NULL, + `created_at` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP, + `updated_at` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP, + `verified` tinyint(1) NOT NULL DEFAULT '0', + PRIMARY KEY (`id`), + UNIQUE KEY `email` (`email`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci; +/*!40101 SET character_set_client = @saved_cs_client */; + +-- +-- Table structure for table `employee` +-- + +DROP TABLE IF EXISTS `employee`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!50503 SET character_set_client = utf8mb4 */; +CREATE TABLE `employee` ( + `id` varchar(20) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL, + `name` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL, + `education` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL, + `site` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL, + `phone` varchar(20) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL, + `created_at` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP, + `status` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL, + PRIMARY KEY (`id`), + UNIQUE KEY `phone` (`phone`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci; +/*!40101 SET character_set_client = @saved_cs_client */; + +-- +-- Table structure for table `error` +-- + +DROP TABLE IF EXISTS `error`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!50503 SET character_set_client = utf8mb4 */; +CREATE TABLE `error` ( + `id` int NOT NULL AUTO_INCREMENT, + `error` varchar(400) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL, + `userId` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL, + `userType` varchar(30) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL, + `phone` varchar(20) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL, + `created_at` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP, + `device` varchar(300) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL, + `details` text CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci, + `status` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL DEFAULT 'new', + PRIMARY KEY (`id`), + KEY `idx_error_created_at` (`created_at`), + KEY `idx_error_phone` (`phone`) +) ENGINE=InnoDB AUTO_INCREMENT=115339 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci; +/*!40101 SET character_set_client = @saved_cs_client */; + +-- +-- Table structure for table `feedBack` +-- + +DROP TABLE IF EXISTS `feedBack`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!50503 SET character_set_client = utf8mb4 */; +CREATE TABLE `feedBack` ( + `id` int NOT NULL AUTO_INCREMENT, + `passengerId` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL, + `feedBack` text CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL, + `datecreated` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP, + PRIMARY KEY (`id`) +) ENGINE=InnoDB AUTO_INCREMENT=3 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci; +/*!40101 SET character_set_client = @saved_cs_client */; + +-- +-- Table structure for table `helpCenter` +-- + +DROP TABLE IF EXISTS `helpCenter`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!50503 SET character_set_client = utf8mb4 */; +CREATE TABLE `helpCenter` ( + `id` int NOT NULL AUTO_INCREMENT, + `driverID` varchar(89) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL, + `helpQuestion` varchar(300) CHARACTER SET utf8mb3 COLLATE utf8mb3_general_ci NOT NULL, + `replay` varchar(400) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL DEFAULT 'not yet', + `datecreated` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP, + PRIMARY KEY (`id`) +) ENGINE=InnoDB AUTO_INCREMENT=72 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci; +/*!40101 SET character_set_client = @saved_cs_client */; + +-- +-- Table structure for table `hotels` +-- + +DROP TABLE IF EXISTS `hotels`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!50503 SET character_set_client = utf8mb4 */; +CREATE TABLE `hotels` ( + `id` int NOT NULL, + `nameEnglish` varchar(255) DEFAULT NULL, + `nameArabic` varchar(255) DEFAULT NULL, + `phone` varchar(20) DEFAULT NULL, + `countReview` int DEFAULT NULL, + `rate` float DEFAULT NULL, + `stars` varchar(50) DEFAULT NULL, + `address` text, + `website` varchar(255) DEFAULT NULL, + `email` varchar(255) DEFAULT NULL, + `PlusCode` varchar(50) DEFAULT NULL, + `closeTime` varchar(50) DEFAULT NULL, + `latitude` decimal(10,6) DEFAULT NULL, + `longitude` decimal(10,6) DEFAULT NULL, + `instagram` varchar(255) DEFAULT NULL, + `facebook` varchar(255) DEFAULT NULL, + `linkedin` varchar(255) DEFAULT NULL, + `twitter` varchar(255) DEFAULT NULL, + `photo` varchar(255) DEFAULT NULL +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci; +/*!40101 SET character_set_client = @saved_cs_client */; + +-- +-- Table structure for table `imageProfileCaptain` +-- + +DROP TABLE IF EXISTS `imageProfileCaptain`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!50503 SET character_set_client = utf8mb4 */; +CREATE TABLE `imageProfileCaptain` ( + `id` int NOT NULL AUTO_INCREMENT, + `driverID` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL, + `image_name` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL, + `upload_date` datetime DEFAULT CURRENT_TIMESTAMP, + `link` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL, + PRIMARY KEY (`id`) +) ENGINE=InnoDB AUTO_INCREMENT=552 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci; +/*!40101 SET character_set_client = @saved_cs_client */; + +-- +-- Table structure for table `invites` +-- + +DROP TABLE IF EXISTS `invites`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!50503 SET character_set_client = utf8mb4 */; +CREATE TABLE `invites` ( + `id` int NOT NULL AUTO_INCREMENT, + `driverId` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL, + `inviterDriverPhone` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL, + `createdAt` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP, + `inviteCode` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL, + `isInstall` tinyint(1) NOT NULL DEFAULT '0', + `isGiftToken` tinyint(1) NOT NULL DEFAULT '0', + `expirationTime` datetime NOT NULL, + PRIMARY KEY (`id`), + UNIQUE KEY `inviterDriverId` (`inviterDriverPhone`), + UNIQUE KEY `inviteCode` (`inviteCode`) +) ENGINE=InnoDB AUTO_INCREMENT=129 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci; +/*!40101 SET character_set_client = @saved_cs_client */; + +-- +-- Table structure for table `invitesToPassengers` +-- + +DROP TABLE IF EXISTS `invitesToPassengers`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!50503 SET character_set_client = utf8mb4 */; +CREATE TABLE `invitesToPassengers` ( + `id` int NOT NULL AUTO_INCREMENT, + `driverId` varchar(70) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL, + `passengerID` varchar(80) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL DEFAULT 'yet', + `inviterPassengerPhone` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL, + `inviteCode` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL, + `expirationTime` datetime NOT NULL, + `createdAt` datetime DEFAULT CURRENT_TIMESTAMP, + `isInstall` tinyint(1) DEFAULT '0', + `isGiftToken` tinyint(1) NOT NULL DEFAULT '0', + PRIMARY KEY (`id`), + UNIQUE KEY `inviteCode` (`inviteCode`) +) ENGINE=InnoDB AUTO_INCREMENT=143 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci; +/*!40101 SET character_set_client = @saved_cs_client */; + +-- +-- Table structure for table `invoice_records` +-- + +DROP TABLE IF EXISTS `invoice_records`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!50503 SET character_set_client = utf8mb4 */; +CREATE TABLE `invoice_records` ( + `id` int NOT NULL AUTO_INCREMENT, + `driverID` int NOT NULL, + `invoice_number` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL, + `name` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL, + `amount` decimal(10,2) DEFAULT NULL, + `date` date DEFAULT NULL, + `image_link` text CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci, + `created_at` datetime DEFAULT NULL, + PRIMARY KEY (`id`) +) ENGINE=InnoDB AUTO_INCREMENT=36 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci; +/*!40101 SET character_set_client = @saved_cs_client */; + +-- +-- Table structure for table `invoicesAdmin` +-- + +DROP TABLE IF EXISTS `invoicesAdmin`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!50503 SET character_set_client = utf8mb4 */; +CREATE TABLE `invoicesAdmin` ( + `id` int NOT NULL AUTO_INCREMENT, + `item_name` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL, + `amount` decimal(10,2) NOT NULL, + `image_url` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL, + `created_at` timestamp NULL DEFAULT CURRENT_TIMESTAMP, + PRIMARY KEY (`id`) +) ENGINE=InnoDB AUTO_INCREMENT=22 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci; +/*!40101 SET character_set_client = @saved_cs_client */; + +-- +-- Table structure for table `kazan` +-- + +DROP TABLE IF EXISTS `kazan`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!50503 SET character_set_client = utf8mb4 */; +CREATE TABLE `kazan` ( + `id` int NOT NULL AUTO_INCREMENT, + `country` varchar(30) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL, + `kazan` varchar(10) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL, + `comfortPrice` varchar(10) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL, + `speedPrice` varchar(10) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL, + `familyPrice` varchar(4) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL, + `deliveryPrice` varchar(11) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL, + `freePrice` varchar(11) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL, + `latePrice` varchar(10) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL, + `heavyPrice` varchar(10) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL, + `adminId` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL, + `createdAt` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP, + `naturePrice` varchar(10) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL, + `fuelPrice` varchar(6) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL, + PRIMARY KEY (`id`) +) ENGINE=InnoDB AUTO_INCREMENT=2 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci; +/*!40101 SET character_set_client = @saved_cs_client */; + +-- +-- Table structure for table `lisenceDetails` +-- + +DROP TABLE IF EXISTS `lisenceDetails`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!50503 SET character_set_client = utf8mb4 */; +CREATE TABLE `lisenceDetails` ( + `id` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL, + `driverID` text CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL, + `name` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci DEFAULT NULL, + `licenseClass` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci DEFAULT NULL, + `documentNo` varchar(30) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci DEFAULT NULL, + `address` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci DEFAULT NULL, + `height` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci DEFAULT NULL, + `postalCode` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci DEFAULT NULL, + `sex` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci DEFAULT NULL, + `stateCode` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci DEFAULT NULL, + `expireDate` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci DEFAULT NULL, + `dateOfBirth` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci DEFAULT NULL, + `dateCreated` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP, + PRIMARY KEY (`id`), + UNIQUE KEY `documentNo` (`documentNo`) +) ENGINE=MyISAM DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci; +/*!40101 SET character_set_client = @saved_cs_client */; + +-- +-- Table structure for table `login_attempts` +-- + +DROP TABLE IF EXISTS `login_attempts`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!50503 SET character_set_client = utf8mb4 */; +CREATE TABLE `login_attempts` ( + `id` int NOT NULL AUTO_INCREMENT, + `ip_address` varchar(45) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL, + `attempt_time` timestamp NULL DEFAULT CURRENT_TIMESTAMP, + PRIMARY KEY (`id`) +) ENGINE=InnoDB AUTO_INCREMENT=18 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci; +/*!40101 SET character_set_client = @saved_cs_client */; + +-- +-- Table structure for table `login_attempts_drivers` +-- + +DROP TABLE IF EXISTS `login_attempts_drivers`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!50503 SET character_set_client = utf8mb4 */; +CREATE TABLE `login_attempts_drivers` ( + `id` int NOT NULL AUTO_INCREMENT, + `ip_address` varchar(45) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL, + `attempt_time` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP, + PRIMARY KEY (`id`) +) ENGINE=InnoDB AUTO_INCREMENT=11 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci; +/*!40101 SET character_set_client = @saved_cs_client */; + +-- +-- Table structure for table `mishwaritrips` +-- + +DROP TABLE IF EXISTS `mishwaritrips`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!50503 SET character_set_client = utf8mb4 */; +CREATE TABLE `mishwaritrips` ( + `id` int NOT NULL AUTO_INCREMENT, + `driverId` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL, + `phone` varchar(15) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL, + `gender` varchar(20) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL, + `name` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL, + `name_english` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL, + `address` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL, + `religion` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL, + `age` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL, + `startNameAddress` varchar(150) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL DEFAULT 'none', + `locationCoordinate` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL DEFAULT 'none', + `education` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL, + `license_type` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL, + `national_number` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL, + `car_plate` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL, + `make` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL, + `model` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL, + `color` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL, + `color_hex` char(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL, + `token` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL, + `rating` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL, + `countRide` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL, + `passengerId` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL, + `timeSelected` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL, + `createdAt` timestamp NULL DEFAULT CURRENT_TIMESTAMP, + `status` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT 'pending', + PRIMARY KEY (`id`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci; +/*!40101 SET character_set_client = @saved_cs_client */; + +-- +-- Table structure for table `notesForDriverService` +-- + +DROP TABLE IF EXISTS `notesForDriverService`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!50503 SET character_set_client = utf8mb4 */; +CREATE TABLE `notesForDriverService` ( + `id` int NOT NULL AUTO_INCREMENT, + `phone` varchar(70) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL, + `note` varchar(250) NOT NULL, + `editor` varchar(50) NOT NULL, + `createdAt` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP, + PRIMARY KEY (`id`), + UNIQUE KEY `phone` (`phone`) +) ENGINE=InnoDB AUTO_INCREMENT=1814 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci; +/*!40101 SET character_set_client = @saved_cs_client */; + +-- +-- Table structure for table `notesForPassengerService` +-- + +DROP TABLE IF EXISTS `notesForPassengerService`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!50503 SET character_set_client = utf8mb4 */; +CREATE TABLE `notesForPassengerService` ( + `id` int NOT NULL AUTO_INCREMENT, + `phone` int NOT NULL, + `note` varchar(250) NOT NULL, + `editor` varchar(50) NOT NULL, + `createdAt` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP, + PRIMARY KEY (`id`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci; +/*!40101 SET character_set_client = @saved_cs_client */; + +-- +-- Table structure for table `notificationCaptain` +-- + +DROP TABLE IF EXISTS `notificationCaptain`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!50503 SET character_set_client = utf8mb4 */; +CREATE TABLE `notificationCaptain` ( + `id` int NOT NULL AUTO_INCREMENT, + `driverID` varchar(80) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL, + `title` varchar(100) CHARACTER SET utf8mb3 COLLATE utf8mb3_general_ci NOT NULL, + `body` varchar(200) CHARACTER SET utf8mb3 COLLATE utf8mb3_general_ci NOT NULL, + `isShown` varchar(6) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL DEFAULT 'false', + `isPin` varchar(10) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL DEFAULT 'unPin', + `dateCreated` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP, + PRIMARY KEY (`id`) +) ENGINE=InnoDB AUTO_INCREMENT=6 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci; +/*!40101 SET character_set_client = @saved_cs_client */; + +-- +-- Table structure for table `notifications` +-- + +DROP TABLE IF EXISTS `notifications`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!50503 SET character_set_client = utf8mb4 */; +CREATE TABLE `notifications` ( + `id` int NOT NULL AUTO_INCREMENT, + `title` varchar(111) NOT NULL, + `body` varchar(265) NOT NULL, + `passenger_id` varchar(111) NOT NULL, + `isShown` varchar(255) CHARACTER SET utf8mb3 COLLATE utf8mb3_general_ci NOT NULL DEFAULT 'false', + `created_at` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP, + `updated_at` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, + PRIMARY KEY (`id`) +) ENGINE=InnoDB AUTO_INCREMENT=9 DEFAULT CHARSET=utf8mb3; +/*!40101 SET character_set_client = @saved_cs_client */; + +-- +-- Table structure for table `otp_verification_fingerPrint` +-- + +DROP TABLE IF EXISTS `otp_verification_fingerPrint`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!50503 SET character_set_client = utf8mb4 */; +CREATE TABLE `otp_verification_fingerPrint` ( + `id` int NOT NULL, + `phone` varchar(20) NOT NULL, + `otp` varchar(6) NOT NULL, + `createdAt` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci; +/*!40101 SET character_set_client = @saved_cs_client */; + +-- +-- Table structure for table `packageInfo` +-- + +DROP TABLE IF EXISTS `packageInfo`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!50503 SET character_set_client = utf8mb4 */; +CREATE TABLE `packageInfo` ( + `id` int NOT NULL AUTO_INCREMENT, + `platform` varchar(50) NOT NULL, + `appName` varchar(20) NOT NULL, + `createdAt` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP, + `version` varchar(10) NOT NULL, + PRIMARY KEY (`id`) +) ENGINE=InnoDB AUTO_INCREMENT=5 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci; +/*!40101 SET character_set_client = @saved_cs_client */; + +-- +-- Table structure for table `palces11` +-- + +DROP TABLE IF EXISTS `palces11`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!50503 SET character_set_client = utf8mb4 */; +CREATE TABLE `palces11` ( + `id` int NOT NULL AUTO_INCREMENT, + `latitude` varchar(50) NOT NULL, + `longitude` varchar(50) NOT NULL, + `name` varchar(180) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci DEFAULT NULL, + `name_ar` varchar(200) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci DEFAULT NULL, + `name_en` varchar(200) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci DEFAULT NULL, + `address` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci DEFAULT NULL, + `category` varchar(55) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci DEFAULT NULL, + `created_at` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP, + `location` point DEFAULT NULL, + PRIMARY KEY (`id`), + FULLTEXT KEY `idx_fulltext_search` (`name`,`name_ar`,`name_en`,`address`,`category`) +) ENGINE=InnoDB AUTO_INCREMENT=37946 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci; +/*!40101 SET character_set_client = @saved_cs_client */; + +-- +-- Table structure for table `passengerWallet` +-- + +DROP TABLE IF EXISTS `passengerWallet`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!50503 SET character_set_client = utf8mb4 */; +CREATE TABLE `passengerWallet` ( + `id` int NOT NULL AUTO_INCREMENT, + `passenger_id` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL, + `balance` decimal(10,2) NOT NULL, + `created_at` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP, + `updated_at` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, + PRIMARY KEY (`id`), + KEY `passenger_id` (`passenger_id`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci; +/*!40101 SET character_set_client = @saved_cs_client */; + +-- +-- Table structure for table `passenger_blacklist` +-- + +DROP TABLE IF EXISTS `passenger_blacklist`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!50503 SET character_set_client = utf8mb4 */; +CREATE TABLE `passenger_blacklist` ( + `id` bigint unsigned NOT NULL AUTO_INCREMENT, + `phone` varchar(150) NOT NULL, + `phone_normalized` varchar(64) NOT NULL, + `reason` varchar(255) DEFAULT NULL, + `expires_at` datetime DEFAULT CURRENT_TIMESTAMP, + `created_at` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP, + PRIMARY KEY (`id`), + UNIQUE KEY `uq_phone_norm` (`phone_normalized`), + KEY `idx_expires` (`expires_at`) +) ENGINE=InnoDB AUTO_INCREMENT=2 DEFAULT CHARSET=utf8mb3; +/*!40101 SET character_set_client = @saved_cs_client */; + +-- +-- Table structure for table `passengerlocation` +-- + +DROP TABLE IF EXISTS `passengerlocation`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!50503 SET character_set_client = utf8mb4 */; +CREATE TABLE `passengerlocation` ( + `id` int NOT NULL AUTO_INCREMENT, + `passengerId` varchar(60) NOT NULL, + `lat` varchar(20) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL, + `lng` varchar(20) NOT NULL, + `rideId` varchar(10) NOT NULL, + `createdAt` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP, + PRIMARY KEY (`id`) +) ENGINE=InnoDB AUTO_INCREMENT=725 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci; +/*!40101 SET character_set_client = @saved_cs_client */; + +-- +-- Table structure for table `passengers` +-- + +DROP TABLE IF EXISTS `passengers`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!50503 SET character_set_client = utf8mb4 */; +CREATE TABLE `passengers` ( + `id` varchar(100) NOT NULL, + `phone` varchar(150) CHARACTER SET utf8mb3 COLLATE utf8mb3_general_ci NOT NULL, + `email` varchar(255) NOT NULL, + `password` varchar(100) NOT NULL, + `gender` varchar(150) CHARACTER SET utf8mb3 COLLATE utf8mb3_general_ci NOT NULL, + `status` varchar(150) CHARACTER SET utf8mb3 COLLATE utf8mb3_general_ci NOT NULL DEFAULT 'notDeleted', + `birthdate` varchar(150) CHARACTER SET utf8mb3 COLLATE utf8mb3_general_ci NOT NULL, + `site` varchar(255) NOT NULL, + `first_name` varchar(255) NOT NULL, + `last_name` varchar(255) NOT NULL, + `sosPhone` varchar(150) CHARACTER SET utf8mb3 COLLATE utf8mb3_general_ci NOT NULL DEFAULT 'sos', + `education` varchar(150) CHARACTER SET utf8mb3 COLLATE utf8mb3_general_ci NOT NULL DEFAULT 'none', + `employmentType` varchar(150) CHARACTER SET utf8mb3 COLLATE utf8mb3_general_ci NOT NULL DEFAULT 'none', + `maritalStatus` varchar(150) CHARACTER SET utf8mb3 COLLATE utf8mb3_general_ci NOT NULL DEFAULT 'none', + `created_at` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP, + `updated_at` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, + PRIMARY KEY (`id`), + UNIQUE KEY `phone` (`phone`,`email`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb3; +/*!40101 SET character_set_client = @saved_cs_client */; + +-- +-- Table structure for table `payment_tokens` +-- + +DROP TABLE IF EXISTS `payment_tokens`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!50503 SET character_set_client = utf8mb4 */; +CREATE TABLE `payment_tokens` ( + `id` int NOT NULL AUTO_INCREMENT, + `token` varchar(255) NOT NULL, + `driverID` varchar(255) NOT NULL, + `dateCreated` datetime NOT NULL, + `amount` decimal(10,2) NOT NULL, + `isUsed` tinyint(1) DEFAULT '0', + PRIMARY KEY (`id`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci; +/*!40101 SET character_set_client = @saved_cs_client */; + +-- +-- Table structure for table `payment_tokens_passenger` +-- + +DROP TABLE IF EXISTS `payment_tokens_passenger`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!50503 SET character_set_client = utf8mb4 */; +CREATE TABLE `payment_tokens_passenger` ( + `id` int NOT NULL AUTO_INCREMENT, + `token` varchar(255) NOT NULL, + `passengerId` varchar(255) NOT NULL, + `dateCreated` datetime NOT NULL, + `amount` decimal(10,2) NOT NULL, + `isUsed` tinyint(1) DEFAULT '0', + PRIMARY KEY (`id`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci; +/*!40101 SET character_set_client = @saved_cs_client */; + +-- +-- Table structure for table `payments` +-- + +DROP TABLE IF EXISTS `payments`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!50503 SET character_set_client = utf8mb4 */; +CREATE TABLE `payments` ( + `id` varchar(111) NOT NULL, + `amount` decimal(10,2) NOT NULL, + `payment_method` varchar(255) NOT NULL, + `passengerID` varchar(100) NOT NULL, + `rideId` varchar(100) NOT NULL, + `driverID` varchar(100) NOT NULL, + `created_at` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP, + `updated_at` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, + `isGiven` varchar(20) NOT NULL DEFAULT 'waiting', + PRIMARY KEY (`id`), + UNIQUE KEY `rideId` (`rideId`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb3; +/*!40101 SET character_set_client = @saved_cs_client */; + +-- +-- Table structure for table `paymentsDriverPoints` +-- + +DROP TABLE IF EXISTS `paymentsDriverPoints`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!50503 SET character_set_client = utf8mb4 */; +CREATE TABLE `paymentsDriverPoints` ( + `id` int NOT NULL AUTO_INCREMENT, + `amount` decimal(10,2) NOT NULL, + `payment_method` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL, + `driverID` varchar(60) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL, + `created_at` datetime DEFAULT CURRENT_TIMESTAMP, + `updated_at` datetime DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, + PRIMARY KEY (`id`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci; +/*!40101 SET character_set_client = @saved_cs_client */; + +-- +-- Table structure for table `phone_verification` +-- + +DROP TABLE IF EXISTS `phone_verification`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!50503 SET character_set_client = utf8mb4 */; +CREATE TABLE `phone_verification` ( + `id` int NOT NULL AUTO_INCREMENT, + `phone_number` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL, + `driverId` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL DEFAULT 'yet', + `email` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL DEFAULT 'yet', + `token_code` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci DEFAULT NULL, + `expiration_time` datetime DEFAULT NULL, + `is_verified` tinyint(1) DEFAULT '0', + `created_at` timestamp NULL DEFAULT CURRENT_TIMESTAMP, + PRIMARY KEY (`id`) +) ENGINE=InnoDB AUTO_INCREMENT=10531 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci; +/*!40101 SET character_set_client = @saved_cs_client */; + +-- +-- Table structure for table `phone_verification_passenger` +-- + +DROP TABLE IF EXISTS `phone_verification_passenger`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!50503 SET character_set_client = utf8mb4 */; +CREATE TABLE `phone_verification_passenger` ( + `id` int NOT NULL AUTO_INCREMENT, + `phone_number` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci DEFAULT NULL, + `token` varchar(255) DEFAULT NULL, + `expiration_time` varchar(255) DEFAULT NULL, + `verified` tinyint(1) DEFAULT '0', + `created_at` timestamp NULL DEFAULT CURRENT_TIMESTAMP, + `status` varchar(22) NOT NULL DEFAULT 'yet', + PRIMARY KEY (`id`) +) ENGINE=InnoDB AUTO_INCREMENT=7304 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci; +/*!40101 SET character_set_client = @saved_cs_client */; + +-- +-- Table structure for table `places` +-- + +DROP TABLE IF EXISTS `places`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!50503 SET character_set_client = utf8mb4 */; +CREATE TABLE `places` ( + `id` int NOT NULL AUTO_INCREMENT, + `latitude` double NOT NULL, + `longitude` double NOT NULL, + `name` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL, + `name_ar` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL, + `name_en` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL, + `address` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL, + `category` varchar(200) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL, + `created_at` timestamp NULL DEFAULT CURRENT_TIMESTAMP, + PRIMARY KEY (`id`) +) ENGINE=InnoDB AUTO_INCREMENT=70783 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci; +/*!40101 SET character_set_client = @saved_cs_client */; + +-- +-- Table structure for table `placesEgypt` +-- + +DROP TABLE IF EXISTS `placesEgypt`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!50503 SET character_set_client = utf8mb4 */; +CREATE TABLE `placesEgypt` ( + `id` int NOT NULL, + `nameEnglish` varchar(255) DEFAULT NULL, + `nameArabic` varchar(255) DEFAULT NULL, + `phone` varchar(20) DEFAULT NULL, + `countReview` int DEFAULT NULL, + `rate` float DEFAULT NULL, + `stars` varchar(50) DEFAULT NULL, + `address` text, + `website` varchar(255) DEFAULT NULL, + `email` varchar(255) DEFAULT NULL, + `PlusCode` varchar(50) DEFAULT NULL, + `closeTime` varchar(50) DEFAULT NULL, + `latitude` decimal(10,6) DEFAULT NULL, + `longitude` decimal(10,6) DEFAULT NULL, + `instagram` varchar(255) DEFAULT NULL, + `facebook` varchar(255) DEFAULT NULL, + `linkedin` varchar(255) DEFAULT NULL, + `twitter` varchar(255) DEFAULT NULL, + `photo` varchar(255) DEFAULT NULL +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci; +/*!40101 SET character_set_client = @saved_cs_client */; + +-- +-- Table structure for table `promos` +-- + +DROP TABLE IF EXISTS `promos`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!50503 SET character_set_client = utf8mb4 */; +CREATE TABLE `promos` ( + `id` int NOT NULL AUTO_INCREMENT, + `promo_code` varchar(14) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL, + `amount` varchar(4) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL DEFAULT '0', + `description` varchar(100) CHARACTER SET utf8mb3 COLLATE utf8mb3_general_ci DEFAULT NULL, + `passengerID` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL DEFAULT 'none', + `validity_start_date` date DEFAULT NULL, + `validity_end_date` date DEFAULT NULL, + PRIMARY KEY (`id`), + UNIQUE KEY `passengerID` (`passengerID`) +) ENGINE=InnoDB AUTO_INCREMENT=637 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci; +/*!40101 SET character_set_client = @saved_cs_client */; + +-- +-- Table structure for table `promptDriverIDEgypt` +-- + +DROP TABLE IF EXISTS `promptDriverIDEgypt`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!50503 SET character_set_client = utf8mb4 */; +CREATE TABLE `promptDriverIDEgypt` ( + `id` int NOT NULL AUTO_INCREMENT, + `type` varchar(30) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL, + `prompt` longtext CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL, + `createdAt` timestamp NULL DEFAULT CURRENT_TIMESTAMP, + `updatedAt` timestamp NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, + PRIMARY KEY (`id`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci; +/*!40101 SET character_set_client = @saved_cs_client */; + +-- +-- Table structure for table `ratingApp` +-- + +DROP TABLE IF EXISTS `ratingApp`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!50503 SET character_set_client = utf8mb4 */; +CREATE TABLE `ratingApp` ( + `id` int NOT NULL AUTO_INCREMENT, + `name` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL, + `email` varchar(150) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL, + `phone` varchar(80) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL, + `userId` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL, + `userType` varchar(20) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL, + `rating` varchar(2) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL, + `comment` varchar(300) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL, + `created_at` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP, + PRIMARY KEY (`id`) +) ENGINE=InnoDB AUTO_INCREMENT=118 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci; +/*!40101 SET character_set_client = @saved_cs_client */; + +-- +-- Table structure for table `ratingDriver` +-- + +DROP TABLE IF EXISTS `ratingDriver`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!50503 SET character_set_client = utf8mb4 */; +CREATE TABLE `ratingDriver` ( + `id` int NOT NULL AUTO_INCREMENT, + `passenger_id` text CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci, + `driver_id` varchar(33) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL, + `ride_id` int DEFAULT NULL, + `rating` float DEFAULT NULL, + `comment` text CHARACTER SET utf8mb3 COLLATE utf8mb3_general_ci, + `created_at` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP, + PRIMARY KEY (`id`), + UNIQUE KEY `ride_id` (`ride_id`), + KEY `idx_driver_id` (`driver_id`) +) ENGINE=InnoDB AUTO_INCREMENT=46 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci; +/*!40101 SET character_set_client = @saved_cs_client */; + +-- +-- Table structure for table `ratingPassenger` +-- + +DROP TABLE IF EXISTS `ratingPassenger`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!50503 SET character_set_client = utf8mb4 */; +CREATE TABLE `ratingPassenger` ( + `id` int NOT NULL AUTO_INCREMENT, + `passenger_id` text CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL, + `driverID` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL, + `rideId` varchar(30) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL, + `rating` float NOT NULL, + `comment` text CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci, + `created_at` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP, + PRIMARY KEY (`id`), + UNIQUE KEY `rideId` (`rideId`) +) ENGINE=InnoDB AUTO_INCREMENT=39 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci; +/*!40101 SET character_set_client = @saved_cs_client */; + +-- +-- Table structure for table `ride` +-- + +DROP TABLE IF EXISTS `ride`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!50503 SET character_set_client = utf8mb4 */; +CREATE TABLE `ride` ( + `id` int NOT NULL AUTO_INCREMENT, + `start_location` varchar(255) NOT NULL, + `end_location` varchar(255) NOT NULL, + `date` date NOT NULL, + `time` time NOT NULL, + `endtime` time NOT NULL, + `price` decimal(10,2) NOT NULL DEFAULT '0.00', + `passenger_id` varchar(111) NOT NULL, + `driver_id` varchar(111) NOT NULL, + `status` varchar(200) NOT NULL DEFAULT 'nothing', + `paymentMethod` varchar(20) NOT NULL DEFAULT 'Cash', + `carType` varchar(20) NOT NULL DEFAULT 'Speed', + `created_at` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, + `updated_at` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, + `DriverIsGoingToPassenger` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP, + `rideTimeStart` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP, + `rideTimeFinish` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP, + `price_for_driver` decimal(10,2) NOT NULL DEFAULT '0.00', + `price_for_passenger` decimal(10,2) NOT NULL DEFAULT '0.00', + `distance` float DEFAULT '0', + PRIMARY KEY (`id`), + KEY `passengerfk` (`passenger_id`), + KEY `driverfk` (`driver_id`) +) ENGINE=InnoDB AUTO_INCREMENT=831 DEFAULT CHARSET=utf8mb3; +/*!40101 SET character_set_client = @saved_cs_client */; + +-- +-- Table structure for table `seferWallet` +-- + +DROP TABLE IF EXISTS `seferWallet`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!50503 SET character_set_client = utf8mb4 */; +CREATE TABLE `seferWallet` ( + `id` int NOT NULL AUTO_INCREMENT, + `driverId` varchar(100) NOT NULL, + `passengerId` varchar(100) NOT NULL, + `amount` varchar(10) NOT NULL, + `paymentMethod` varchar(50) NOT NULL, + `token` varchar(100) NOT NULL, + `createdAt` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP, + PRIMARY KEY (`id`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci; +/*!40101 SET character_set_client = @saved_cs_client */; + +-- +-- Table structure for table `server_locations` +-- + +DROP TABLE IF EXISTS `server_locations`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!50503 SET character_set_client = utf8mb4 */; +CREATE TABLE `server_locations` ( + `id` int NOT NULL AUTO_INCREMENT, + `name` varchar(255) NOT NULL, + `min_latitude` decimal(10,6) NOT NULL, + `max_latitude` decimal(10,6) NOT NULL, + `min_longitude` decimal(10,6) NOT NULL, + `max_longitude` decimal(10,6) NOT NULL, + `server_link` varchar(255) NOT NULL, + PRIMARY KEY (`id`), + UNIQUE KEY `name` (`name`) +) ENGINE=InnoDB AUTO_INCREMENT=2 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci; +/*!40101 SET character_set_client = @saved_cs_client */; + +-- +-- Table structure for table `smsSender` +-- + +DROP TABLE IF EXISTS `smsSender`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!50503 SET character_set_client = utf8mb4 */; +CREATE TABLE `smsSender` ( + `id` int NOT NULL AUTO_INCREMENT, + `senderId` varchar(20) NOT NULL, + PRIMARY KEY (`id`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci; +/*!40101 SET character_set_client = @saved_cs_client */; + +-- +-- Table structure for table `test` +-- + +DROP TABLE IF EXISTS `test`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!50503 SET character_set_client = utf8mb4 */; +CREATE TABLE `test` ( + `id` int NOT NULL AUTO_INCREMENT, + `name` varchar(22) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL, + PRIMARY KEY (`id`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci; +/*!40101 SET character_set_client = @saved_cs_client */; + +-- +-- Table structure for table `testApp` +-- + +DROP TABLE IF EXISTS `testApp`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!50503 SET character_set_client = utf8mb4 */; +CREATE TABLE `testApp` ( + `id` int NOT NULL AUTO_INCREMENT, + `isTest` tinyint(1) NOT NULL, + `createdAt` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP, + `appPlatform` varchar(20) NOT NULL, + PRIMARY KEY (`id`) +) ENGINE=InnoDB AUTO_INCREMENT=3 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci; +/*!40101 SET character_set_client = @saved_cs_client */; + +-- +-- Table structure for table `tips` +-- + +DROP TABLE IF EXISTS `tips`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!50503 SET character_set_client = utf8mb4 */; +CREATE TABLE `tips` ( + `id` int NOT NULL AUTO_INCREMENT, + `driverID` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL, + `passengerID` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL, + `rideID` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL, + `tipAmount` decimal(10,2) DEFAULT NULL, + PRIMARY KEY (`id`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci; +/*!40101 SET character_set_client = @saved_cs_client */; + +-- +-- Table structure for table `token_verification` +-- + +DROP TABLE IF EXISTS `token_verification`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!50503 SET character_set_client = utf8mb4 */; +CREATE TABLE `token_verification` ( + `id` int NOT NULL AUTO_INCREMENT, + `phone_number` text CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL, + `token` text CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL, + `expiration_time` datetime NOT NULL, + `verified` tinyint(1) DEFAULT '0', + `created_at` datetime DEFAULT CURRENT_TIMESTAMP, + PRIMARY KEY (`id`) +) ENGINE=InnoDB AUTO_INCREMENT=88 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci; +/*!40101 SET character_set_client = @saved_cs_client */; + +-- +-- Table structure for table `token_verification_admin` +-- + +DROP TABLE IF EXISTS `token_verification_admin`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!50503 SET character_set_client = utf8mb4 */; +CREATE TABLE `token_verification_admin` ( + `id` int NOT NULL AUTO_INCREMENT, + `phone_number` varchar(20) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL, + `token` varchar(10) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL, + `expiration_time` datetime NOT NULL, + PRIMARY KEY (`id`), + UNIQUE KEY `phone_number` (`phone_number`) +) ENGINE=InnoDB AUTO_INCREMENT=51 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci; +/*!40101 SET character_set_client = @saved_cs_client */; + +-- +-- Table structure for table `token_verification_driver` +-- + +DROP TABLE IF EXISTS `token_verification_driver`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!50503 SET character_set_client = utf8mb4 */; +CREATE TABLE `token_verification_driver` ( + `id` int NOT NULL AUTO_INCREMENT, + `phone_number` text CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL, + `token` text CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL, + `expiration_time` datetime NOT NULL, + `verified` tinyint(1) NOT NULL DEFAULT '0', + `created_at` datetime DEFAULT CURRENT_TIMESTAMP, + PRIMARY KEY (`id`) +) ENGINE=InnoDB AUTO_INCREMENT=2210 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci; +/*!40101 SET character_set_client = @saved_cs_client */; + +-- +-- Table structure for table `tokens` +-- + +DROP TABLE IF EXISTS `tokens`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!50503 SET character_set_client = utf8mb4 */; +CREATE TABLE `tokens` ( + `id` int NOT NULL AUTO_INCREMENT, + `token` varchar(333) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL, + `passengerID` varchar(80) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL, + `fingerPrint` varchar(250) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL, + `status` varchar(22) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL DEFAULT 'yet', + PRIMARY KEY (`id`), + UNIQUE KEY `passengerID` (`passengerID`) +) ENGINE=InnoDB AUTO_INCREMENT=2604 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci; +/*!40101 SET character_set_client = @saved_cs_client */; + +-- +-- Table structure for table `users` +-- + +DROP TABLE IF EXISTS `users`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!50503 SET character_set_client = utf8mb4 */; +CREATE TABLE `users` ( + `id` varchar(111) NOT NULL, + `phone` varchar(15) NOT NULL, + `email` varchar(255) NOT NULL, + `gender` varchar(10) NOT NULL, + `password` varchar(100) NOT NULL, + `birthdate` date NOT NULL, + `site` varchar(255) NOT NULL, + `first_name` varchar(255) NOT NULL, + `last_name` varchar(255) NOT NULL, + `created_at` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP, + `updated_at` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, + `user_type` varchar(44) NOT NULL, + PRIMARY KEY (`id`), + UNIQUE KEY `email` (`email`), + UNIQUE KEY `phone` (`phone`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb3; +/*!40101 SET character_set_client = @saved_cs_client */; + +-- +-- Table structure for table `vehicles` +-- + +DROP TABLE IF EXISTS `vehicles`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!50503 SET character_set_client = utf8mb4 */; +CREATE TABLE `vehicles` ( + `id` int NOT NULL AUTO_INCREMENT, + `driverID` varchar(100) NOT NULL, + `make` varchar(255) NOT NULL, + `model` varchar(255) NOT NULL, + `license_plate` varchar(255) NOT NULL, + `seats` int NOT NULL, + `created_at` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP, + `updated_at` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, + PRIMARY KEY (`id`), + UNIQUE KEY `license_plate` (`license_plate`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb3; +/*!40101 SET character_set_client = @saved_cs_client */; + +-- +-- Table structure for table `videos` +-- + +DROP TABLE IF EXISTS `videos`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!50503 SET character_set_client = utf8mb4 */; +CREATE TABLE `videos` ( + `id` int NOT NULL AUTO_INCREMENT, + `title` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL, + `description` varchar(200) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL, + `url` varchar(150) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL, + `created_at` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP, + PRIMARY KEY (`id`) +) ENGINE=InnoDB AUTO_INCREMENT=4 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci; +/*!40101 SET character_set_client = @saved_cs_client */; + +-- +-- Table structure for table `waitingRides` +-- + +DROP TABLE IF EXISTS `waitingRides`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!50503 SET character_set_client = utf8mb4 */; +CREATE TABLE `waitingRides` ( + `id` varchar(100) NOT NULL, + `start_location` varchar(255) NOT NULL, + `start_lat` decimal(10,7) DEFAULT NULL, + `start_lng` decimal(10,7) DEFAULT NULL, + `end_location` varchar(255) NOT NULL, + `end_lat` decimal(10,7) DEFAULT NULL, + `end_lng` decimal(10,7) DEFAULT NULL, + `date` date NOT NULL, + `time` time NOT NULL, + `price` decimal(10,2) NOT NULL DEFAULT '0.00', + `passenger_id` varchar(111) NOT NULL, + `status` varchar(200) NOT NULL DEFAULT 'nothing', + `carType` varchar(19) NOT NULL, + `passengerRate` decimal(10,2) NOT NULL, + `created_at` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, + `price_for_passenger` decimal(10,2) NOT NULL DEFAULT '0.00', + `distance` varchar(255) NOT NULL, + `duration` varchar(10) NOT NULL DEFAULT '0', + `payment_method` varchar(10) NOT NULL DEFAULT 'cash', + `passenger_wallet` varchar(6) NOT NULL DEFAULT '0', + PRIMARY KEY (`id`), + KEY `idx_location_status` (`start_lat`,`start_lng`,`status`,`created_at`), + KEY `idx_status_created` (`status`,`created_at`), + KEY `idx_passenger` (`passenger_id`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb3; +/*!40101 SET character_set_client = @saved_cs_client */; + +-- +-- Table structure for table `welcomeDriverCall` +-- + +DROP TABLE IF EXISTS `welcomeDriverCall`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!50503 SET character_set_client = utf8mb4 */; +CREATE TABLE `welcomeDriverCall` ( + `id` int NOT NULL AUTO_INCREMENT, + `driverId` varchar(50) NOT NULL, + `isCall` tinyint(1) NOT NULL DEFAULT '0', + `notes` varchar(255) NOT NULL, + `createdAt` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP, + PRIMARY KEY (`id`) +) ENGINE=InnoDB AUTO_INCREMENT=1648 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci; +/*!40101 SET character_set_client = @saved_cs_client */; + +-- +-- Table structure for table `write_argument_after_applied_from_background` +-- + +DROP TABLE IF EXISTS `write_argument_after_applied_from_background`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!50503 SET character_set_client = utf8mb4 */; +CREATE TABLE `write_argument_after_applied_from_background` ( + `id` int unsigned NOT NULL AUTO_INCREMENT, + `ride_id` varchar(50) NOT NULL, + `driver_id` varchar(50) NOT NULL, + `passenger_id` varchar(50) NOT NULL, + `passenger_location` varchar(30) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL, + `passenger_destination` varchar(30) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL, + `duration` varchar(255) NOT NULL, + `duration_to_passenger` varchar(255) NOT NULL, + `duration_of_ride` varchar(255) NOT NULL, + `distance` varchar(255) NOT NULL, + `total_cost` varchar(255) NOT NULL, + `payment_amount` varchar(255) NOT NULL, + `payment_method` enum('visa','cash') NOT NULL, + `wallet_checked` varchar(255) NOT NULL, + `has_steps` varchar(255) NOT NULL, + `step0` varchar(255) DEFAULT NULL, + `step1` varchar(255) DEFAULT NULL, + `step2` varchar(255) DEFAULT NULL, + `step3` varchar(255) DEFAULT NULL, + `step4` varchar(255) DEFAULT NULL, + `passenger_wallet_burc` varchar(33) NOT NULL, + `token_passenger` varchar(255) NOT NULL, + `name` varchar(100) NOT NULL, + `phone` varchar(20) NOT NULL, + `email` varchar(150) NOT NULL, + `start_name_location` varchar(255) NOT NULL, + `end_name_location` varchar(255) NOT NULL, + `car_type` varchar(50) NOT NULL, + `kazan` varchar(255) NOT NULL, + `direction_url` text NOT NULL, + `time_of_order` datetime NOT NULL, + `total_passenger` varchar(255) NOT NULL, + PRIMARY KEY (`id`) +) ENGINE=InnoDB AUTO_INCREMENT=9 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci; +/*!40101 SET character_set_client = @saved_cs_client */; + +-- +-- Dumping events for database 'intaleqDB1' +-- + +-- +-- Dumping routines for database 'intaleqDB1' +-- +/*!40103 SET TIME_ZONE=@OLD_TIME_ZONE */; + +/*!40101 SET SQL_MODE=@OLD_SQL_MODE */; +/*!40014 SET FOREIGN_KEY_CHECKS=@OLD_FOREIGN_KEY_CHECKS */; +/*!40014 SET UNIQUE_CHECKS=@OLD_UNIQUE_CHECKS */; +/*!40101 SET CHARACTER_SET_CLIENT=@OLD_CHARACTER_SET_CLIENT */; +/*!40101 SET CHARACTER_SET_RESULTS=@OLD_CHARACTER_SET_RESULTS */; +/*!40101 SET COLLATION_CONNECTION=@OLD_COLLATION_CONNECTION */; +/*!40111 SET SQL_NOTES=@OLD_SQL_NOTES */; + +-- Dump completed on 2026-04-22 19:40:54 diff --git a/backend/schema_ride.sql b/backend/schema_ride.sql new file mode 100644 index 0000000..17b8e9b --- /dev/null +++ b/backend/schema_ride.sql @@ -0,0 +1,1787 @@ +-- MySQL dump 10.13 Distrib 8.0.36-28, for Linux (x86_64) +-- +-- Host: localhost Database: intaleq-ridesDB +-- ------------------------------------------------------ +-- Server version 8.0.36-28 + +/*!40101 SET @OLD_CHARACTER_SET_CLIENT=@@CHARACTER_SET_CLIENT */; +/*!40101 SET @OLD_CHARACTER_SET_RESULTS=@@CHARACTER_SET_RESULTS */; +/*!40101 SET @OLD_COLLATION_CONNECTION=@@COLLATION_CONNECTION */; +/*!50503 SET NAMES utf8mb4 */; +/*!40103 SET @OLD_TIME_ZONE=@@TIME_ZONE */; +/*!40103 SET TIME_ZONE='+00:00' */; +/*!40014 SET @OLD_UNIQUE_CHECKS=@@UNIQUE_CHECKS, UNIQUE_CHECKS=0 */; +/*!40014 SET @OLD_FOREIGN_KEY_CHECKS=@@FOREIGN_KEY_CHECKS, FOREIGN_KEY_CHECKS=0 */; +/*!40101 SET @OLD_SQL_MODE=@@SQL_MODE, SQL_MODE='NO_AUTO_VALUE_ON_ZERO' */; +/*!40111 SET @OLD_SQL_NOTES=@@SQL_NOTES, SQL_NOTES=0 */; +/*!50717 SELECT COUNT(*) INTO @rocksdb_has_p_s_session_variables FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_SCHEMA = 'performance_schema' AND TABLE_NAME = 'session_variables' */; +/*!50717 SET @rocksdb_get_is_supported = IF (@rocksdb_has_p_s_session_variables, 'SELECT COUNT(*) INTO @rocksdb_is_supported FROM performance_schema.session_variables WHERE VARIABLE_NAME=\'rocksdb_bulk_load\'', 'SELECT 0') */; +/*!50717 PREPARE s FROM @rocksdb_get_is_supported */; +/*!50717 EXECUTE s */; +/*!50717 DEALLOCATE PREPARE s */; +/*!50717 SET @rocksdb_enable_bulk_load = IF (@rocksdb_is_supported, 'SET SESSION rocksdb_bulk_load = 1', 'SET @rocksdb_dummy_bulk_load = 0') */; +/*!50717 PREPARE s FROM @rocksdb_enable_bulk_load */; +/*!50717 EXECUTE s */; +/*!50717 DEALLOCATE PREPARE s */; + +-- +-- Table structure for table `CarRegistration` +-- + +DROP TABLE IF EXISTS `CarRegistration`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!50503 SET character_set_client = utf8mb4 */; +CREATE TABLE `CarRegistration` ( + `id` int NOT NULL AUTO_INCREMENT, + `driverID` varchar(100) CHARACTER SET utf8mb3 COLLATE utf8mb3_general_ci NOT NULL, + `vin` varchar(100) CHARACTER SET utf8mb3 COLLATE utf8mb3_general_ci NOT NULL, + `car_plate` varchar(150) CHARACTER SET utf8mb3 COLLATE utf8mb3_general_ci DEFAULT NULL, + `make` varchar(255) CHARACTER SET utf8mb3 COLLATE utf8mb3_general_ci NOT NULL, + `model` varchar(255) CHARACTER SET utf8mb3 COLLATE utf8mb3_general_ci NOT NULL, + `year` varchar(10) CHARACTER SET utf32 COLLATE utf32_general_ci NOT NULL, + `expiration_date` varchar(30) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL, + `color` varchar(255) CHARACTER SET utf8mb3 COLLATE utf8mb3_general_ci NOT NULL, + `owner` varchar(255) CHARACTER SET utf8mb3 COLLATE utf8mb3_general_ci NOT NULL, + `color_hex` varchar(20) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL, + `fuel` varchar(100) CHARACTER SET utf8mb3 COLLATE utf8mb3_general_ci NOT NULL, + `isDefault` tinyint(1) NOT NULL DEFAULT '0', + `created_at` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP, + `status` varchar(20) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL DEFAULT 'yet', + PRIMARY KEY (`id`), + UNIQUE KEY `car_plate` (`car_plate`), + KEY `idx_driverID` (`driverID`) +) ENGINE=InnoDB AUTO_INCREMENT=14 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci; +/*!40101 SET character_set_client = @saved_cs_client */; + +-- +-- Table structure for table `adminUser` +-- + +DROP TABLE IF EXISTS `adminUser`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!50503 SET character_set_client = utf8mb4 */; +CREATE TABLE `adminUser` ( + `id` int NOT NULL AUTO_INCREMENT, + `device_number` varchar(300) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL, + `name` varchar(150) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL, + `created_at` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP, + `updated_at` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP, + PRIMARY KEY (`id`) +) ENGINE=InnoDB AUTO_INCREMENT=3 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci; +/*!40101 SET character_set_client = @saved_cs_client */; + +-- +-- Table structure for table `api_keys` +-- + +DROP TABLE IF EXISTS `api_keys`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!50503 SET character_set_client = utf8mb4 */; +CREATE TABLE `api_keys` ( + `id` int NOT NULL AUTO_INCREMENT, + `name` varchar(20) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL, + `hashed_key` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL, + PRIMARY KEY (`id`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci; +/*!40101 SET character_set_client = @saved_cs_client */; + +-- +-- Table structure for table `blacklist_driver` +-- + +DROP TABLE IF EXISTS `blacklist_driver`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!50503 SET character_set_client = utf8mb4 */; +CREATE TABLE `blacklist_driver` ( + `id` int NOT NULL AUTO_INCREMENT, + `driver_id` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL, + `phone` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL, + `reason` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT 'Violation', + `created_at` timestamp NULL DEFAULT CURRENT_TIMESTAMP, + PRIMARY KEY (`id`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci; +/*!40101 SET character_set_client = @saved_cs_client */; + +-- +-- Table structure for table `canecl` +-- + +DROP TABLE IF EXISTS `canecl`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!50503 SET character_set_client = utf8mb4 */; +CREATE TABLE `canecl` ( + `id` int NOT NULL AUTO_INCREMENT, + `driverID` varchar(111) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL, + `passengerID` varchar(111) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL, + `rideID` varchar(111) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL, + `note` varchar(200) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL DEFAULT 'nothing', + `created_at` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP, + PRIMARY KEY (`id`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci; +/*!40101 SET character_set_client = @saved_cs_client */; + +-- +-- Table structure for table `captains_car` +-- + +DROP TABLE IF EXISTS `captains_car`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!50503 SET character_set_client = utf8mb4 */; +CREATE TABLE `captains_car` ( + `id` int NOT NULL AUTO_INCREMENT, + `driverID` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL, + `vin` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL, + `car_plate` varchar(20) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL, + `make` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL, + `model` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL, + `year` varchar(6) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL, + `expiration_date` varchar(20) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL, + `color` varchar(30) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL, + `owner` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL, + `color_hex` char(15) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL, + `address` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL, + `displacement` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL, + `fuel` varchar(20) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL, + `registration_date` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL, + `isDefault` tinyint(1) NOT NULL DEFAULT '0', + `created_at` timestamp NULL DEFAULT CURRENT_TIMESTAMP, + PRIMARY KEY (`id`), + UNIQUE KEY `car_plate` (`car_plate`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci; +/*!40101 SET character_set_client = @saved_cs_client */; + +-- +-- Table structure for table `carPlateEdit` +-- + +DROP TABLE IF EXISTS `carPlateEdit`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!50503 SET character_set_client = utf8mb4 */; +CREATE TABLE `carPlateEdit` ( + `id` int NOT NULL AUTO_INCREMENT, + `driverId` varchar(50) NOT NULL, + `carPlate` varchar(155) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL, + `color` varchar(20) NOT NULL, + `make` varchar(50) NOT NULL, + `model` varchar(20) NOT NULL, + `expiration_date` varchar(50) NOT NULL, + `owner` varchar(155) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL, + `year` int NOT NULL, + `isEdit` tinyint(1) NOT NULL DEFAULT '0', + `employee` varchar(30) NOT NULL DEFAULT 'any', + `createdAt` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP, + PRIMARY KEY (`id`), + UNIQUE KEY `driverId` (`driverId`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci; +/*!40101 SET character_set_client = @saved_cs_client */; + +-- +-- Table structure for table `car_locations` +-- + +DROP TABLE IF EXISTS `car_locations`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!50503 SET character_set_client = utf8mb4 */; +CREATE TABLE `car_locations` ( + `driver_id` varchar(100) NOT NULL, + `latitude` decimal(10,7) NOT NULL, + `longitude` decimal(10,7) NOT NULL, + `heading` decimal(10,2) NOT NULL, + `speed` double(10,3) NOT NULL, + `distance` decimal(10,2) NOT NULL, + `status` varchar(6) NOT NULL DEFAULT 'off', + `carType` varchar(100) NOT NULL DEFAULT 'Awfar', + `created_at` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP, + `updated_at` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, + `location_point` point NOT NULL /*!80003 SRID 4326 */, + PRIMARY KEY (`driver_id`), + KEY `idx_loc_status_time` (`status`,`updated_at`,`latitude`,`longitude`), + SPATIAL KEY `idx_location_point` (`location_point`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb3; +/*!40101 SET character_set_client = @saved_cs_client */; +/*!50003 SET @saved_cs_client = @@character_set_client */ ; +/*!50003 SET @saved_cs_results = @@character_set_results */ ; +/*!50003 SET @saved_col_connection = @@collation_connection */ ; +/*!50003 SET character_set_client = utf8mb4 */ ; +/*!50003 SET character_set_results = utf8mb4 */ ; +/*!50003 SET collation_connection = utf8mb4_0900_ai_ci */ ; +/*!50003 SET @saved_sql_mode = @@sql_mode */ ; +/*!50003 SET sql_mode = 'NO_AUTO_VALUE_ON_ZERO' */ ; +DELIMITER ;; +/*!50003 CREATE*/ /*!50017 DEFINER=`intaleq-rides`@`%`*/ /*!50003 TRIGGER `trg_before_insert_car_locations` BEFORE INSERT ON `car_locations` FOR EACH ROW BEGIN +SET NEW.location_point = ST_PointFromText(CONCAT('POINT(', NEW.longitude, ' ', NEW.latitude, ')'), 4326); +END */;; +DELIMITER ; +/*!50003 SET sql_mode = @saved_sql_mode */ ; +/*!50003 SET character_set_client = @saved_cs_client */ ; +/*!50003 SET character_set_results = @saved_cs_results */ ; +/*!50003 SET collation_connection = @saved_col_connection */ ; +/*!50003 SET @saved_cs_client = @@character_set_client */ ; +/*!50003 SET @saved_cs_results = @@character_set_results */ ; +/*!50003 SET @saved_col_connection = @@collation_connection */ ; +/*!50003 SET character_set_client = utf8mb4 */ ; +/*!50003 SET character_set_results = utf8mb4 */ ; +/*!50003 SET collation_connection = utf8mb4_0900_ai_ci */ ; +/*!50003 SET @saved_sql_mode = @@sql_mode */ ; +/*!50003 SET sql_mode = 'NO_AUTO_VALUE_ON_ZERO' */ ; +DELIMITER ;; +/*!50003 CREATE*/ /*!50017 DEFINER=`intaleq-rides`@`%`*/ /*!50003 TRIGGER `trg_before_update_car_locations` BEFORE UPDATE ON `car_locations` FOR EACH ROW BEGIN +IF NEW.latitude <> OLD.latitude OR NEW.longitude <> OLD.longitude THEN +SET NEW.location_point = ST_PointFromText(CONCAT('POINT(', NEW.longitude, ' ', NEW.latitude, ')'), 4326); +END IF; +END */;; +DELIMITER ; +/*!50003 SET sql_mode = @saved_sql_mode */ ; +/*!50003 SET character_set_client = @saved_cs_client */ ; +/*!50003 SET character_set_results = @saved_cs_results */ ; +/*!50003 SET collation_connection = @saved_col_connection */ ; + +-- +-- Table structure for table `car_tracks` +-- + +DROP TABLE IF EXISTS `car_tracks`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!50503 SET character_set_client = utf8mb4 */; +CREATE TABLE `car_tracks` ( + `id` int NOT NULL AUTO_INCREMENT, + `driver_id` varchar(100) NOT NULL, + `latitude` decimal(10,7) NOT NULL, + `longitude` decimal(10,7) NOT NULL, + `heading` float DEFAULT NULL, + `speed` float DEFAULT NULL, + `distance` float DEFAULT NULL, + `status` enum('on','off') DEFAULT 'off', + `created_at` timestamp NULL DEFAULT CURRENT_TIMESTAMP, + PRIMARY KEY (`id`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci; +/*!40101 SET character_set_client = @saved_cs_client */; + +-- +-- Table structure for table `card_images` +-- + +DROP TABLE IF EXISTS `card_images`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!50503 SET character_set_client = utf8mb4 */; +CREATE TABLE `card_images` ( + `id` int NOT NULL AUTO_INCREMENT, + `driverID` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL, + `image_name` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL, + `upload_date` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP, + `link` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL, + PRIMARY KEY (`id`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci; +/*!40101 SET character_set_client = @saved_cs_client */; + +-- +-- Table structure for table `carsToWork` +-- + +DROP TABLE IF EXISTS `carsToWork`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!50503 SET character_set_client = utf8mb4 */; +CREATE TABLE `carsToWork` ( + `id` int NOT NULL AUTO_INCREMENT, + `owner_name` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL, + `phone` varchar(15) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL, + `car_number` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL, + `manufacture_year` year NOT NULL, + `car_model` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL, + `car_type` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL, + `site` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL, + `registration_date` date NOT NULL, + `created_at` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP, + PRIMARY KEY (`id`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci; +/*!40101 SET character_set_client = @saved_cs_client */; + +-- +-- Table structure for table `complaint` +-- + +DROP TABLE IF EXISTS `complaint`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!50503 SET character_set_client = utf8mb4 */; +CREATE TABLE `complaint` ( + `id` int NOT NULL AUTO_INCREMENT, + `ride_id` varchar(255) NOT NULL, + `passenger_id` varchar(255) DEFAULT NULL, + `driver_id` varchar(255) DEFAULT NULL, + `complaint_type` enum('Driver','Passenger','Both') NOT NULL, + `description` text, + `date_filed` timestamp NULL DEFAULT CURRENT_TIMESTAMP, + `statusComplaint` enum('Open','In Progress','Resolved') NOT NULL DEFAULT 'Open', + `resolution` text, + `passenger_report` text, + `driver_report` text, + `cs_solutions` text, + `fault_determination` varchar(255) DEFAULT NULL, + `complaint_nature` varchar(255) DEFAULT NULL, + `date_resolved` timestamp NULL DEFAULT NULL, + PRIMARY KEY (`id`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci; +/*!40101 SET character_set_client = @saved_cs_client */; + +-- +-- Table structure for table `contactEgypt` +-- + +DROP TABLE IF EXISTS `contactEgypt`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!50503 SET character_set_client = utf8mb4 */; +CREATE TABLE `contactEgypt` ( + `id` int NOT NULL AUTO_INCREMENT, + `phones` varchar(20) NOT NULL, + `name` varchar(100) NOT NULL, + `phones2` varchar(60) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL, + `createdAt` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP, + PRIMARY KEY (`id`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci; +/*!40101 SET character_set_client = @saved_cs_client */; + +-- +-- Table structure for table `contactSyria` +-- + +DROP TABLE IF EXISTS `contactSyria`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!50503 SET character_set_client = utf8mb4 */; +CREATE TABLE `contactSyria` ( + `id` int NOT NULL AUTO_INCREMENT, + `driverId` varchar(255) NOT NULL COMMENT 'معرّف السائق الذي قام بمزامنة جهة الاتصال', + `name` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci DEFAULT NULL COMMENT 'اسم جهة الاتصال', + `phone` varchar(50) NOT NULL COMMENT 'رقم هاتف جهة الاتصال', + `sync_timestamp` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT 'وقت المزامنة', + PRIMARY KEY (`id`), + UNIQUE KEY `driver_contact_unique` (`driverId`,`phone`) +) ENGINE=InnoDB AUTO_INCREMENT=10 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci; +/*!40101 SET character_set_client = @saved_cs_client */; + +-- +-- Table structure for table `criminalDocuments` +-- + +DROP TABLE IF EXISTS `criminalDocuments`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!50503 SET character_set_client = utf8mb4 */; +CREATE TABLE `criminalDocuments` ( + `id` int NOT NULL AUTO_INCREMENT, + `driverId` varchar(50) NOT NULL, + `IssueDate` varchar(20) NOT NULL, + `createdAt` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP, + `InspectionResult` varchar(100) NOT NULL, + PRIMARY KEY (`id`), + UNIQUE KEY `driverId` (`driverId`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci; +/*!40101 SET character_set_client = @saved_cs_client */; + +-- +-- Table structure for table `driver` +-- + +DROP TABLE IF EXISTS `driver`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!50503 SET character_set_client = utf8mb4 */; +CREATE TABLE `driver` ( + `idn` int NOT NULL AUTO_INCREMENT, + `id` varchar(100) NOT NULL, + `phone` varchar(255) CHARACTER SET utf8mb3 COLLATE utf8mb3_general_ci NOT NULL, + `email` varchar(255) NOT NULL, + `password` varchar(255) NOT NULL, + `gender` varchar(255) CHARACTER SET utf8mb3 COLLATE utf8mb3_general_ci NOT NULL DEFAULT 'Male', + `license_type` varchar(255) DEFAULT NULL, + `national_number` varchar(255) DEFAULT NULL, + `name_arabic` varchar(255) DEFAULT NULL, + `issue_date` date DEFAULT NULL, + `expiry_date` date DEFAULT NULL, + `license_categories` varchar(255) DEFAULT NULL, + `address` text, + `licenseIssueDate` varchar(50) DEFAULT NULL, + `status` varchar(20) NOT NULL DEFAULT 'notDeleted', + `birthdate` varchar(255) CHARACTER SET utf8mb3 COLLATE utf8mb3_general_ci NOT NULL, + `site` varchar(255) NOT NULL, + `first_name` varchar(255) NOT NULL, + `last_name` varchar(255) NOT NULL, + `accountBank` varchar(255) CHARACTER SET utf8mb3 COLLATE utf8mb3_general_ci NOT NULL DEFAULT 'yet', + `bankCode` varchar(255) CHARACTER SET utf8mb3 COLLATE utf8mb3_general_ci NOT NULL DEFAULT 'CIB', + `employmentType` varchar(255) CHARACTER SET utf8mb3 COLLATE utf8mb3_general_ci DEFAULT NULL, + `maritalStatus` varchar(50) CHARACTER SET utf8mb3 COLLATE utf8mb3_general_ci DEFAULT NULL, + `fullNameMaritial` varchar(255) DEFAULT NULL, + `expirationDate` varchar(50) CHARACTER SET utf8mb3 COLLATE utf8mb3_general_ci DEFAULT NULL, + `created_at` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP, + `updated_at` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, + PRIMARY KEY (`idn`) +) ENGINE=InnoDB AUTO_INCREMENT=12 DEFAULT CHARSET=utf8mb3; +/*!40101 SET character_set_client = @saved_cs_client */; + +-- +-- Table structure for table `driverToken` +-- + +DROP TABLE IF EXISTS `driverToken`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!50503 SET character_set_client = utf8mb4 */; +CREATE TABLE `driverToken` ( + `id` int NOT NULL AUTO_INCREMENT, + `token` varchar(300) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL, + `captain_id` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL, + `fingerPrint` varchar(155) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL, + `created_at` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP, + PRIMARY KEY (`id`), + KEY `idx_captain_id` (`captain_id`) +) ENGINE=InnoDB AUTO_INCREMENT=9 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci; +/*!40101 SET character_set_client = @saved_cs_client */; + +-- +-- Table structure for table `driverWallet` +-- + +DROP TABLE IF EXISTS `driverWallet`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!50503 SET character_set_client = utf8mb4 */; +CREATE TABLE `driverWallet` ( + `id` int NOT NULL AUTO_INCREMENT, + `driverID` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL, + `paymentID` varchar(200) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL, + `dateCreated` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP, + `amount` varchar(5) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL, + `paymentMethod` varchar(20) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL, + `dateUpdated` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP, + PRIMARY KEY (`id`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci; +/*!40101 SET character_set_client = @saved_cs_client */; + +-- +-- Table structure for table `driver_behavior` +-- + +DROP TABLE IF EXISTS `driver_behavior`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!50503 SET character_set_client = utf8mb4 */; +CREATE TABLE `driver_behavior` ( + `id` int NOT NULL, + `driver_id` varchar(255) NOT NULL, + `trip_id` varchar(255) NOT NULL, + `max_speed` double DEFAULT '0', + `avg_speed` double DEFAULT '0', + `hard_brakes` int DEFAULT '0', + `total_distance` double DEFAULT '0', + `behavior_score` double DEFAULT '0', + `created_at` timestamp NULL DEFAULT CURRENT_TIMESTAMP +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci; +/*!40101 SET character_set_client = @saved_cs_client */; + +-- +-- Table structure for table `driver_documents` +-- + +DROP TABLE IF EXISTS `driver_documents`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!50503 SET character_set_client = utf8mb4 */; +CREATE TABLE `driver_documents` ( + `id` int NOT NULL AUTO_INCREMENT, + `driverID` varchar(64) NOT NULL, + `doc_type` varchar(64) NOT NULL, + `image_name` varchar(255) NOT NULL, + `link` varchar(512) NOT NULL, + `upload_date` datetime NOT NULL, + PRIMARY KEY (`id`), + KEY `driverID` (`driverID`) +) ENGINE=InnoDB AUTO_INCREMENT=33 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci; +/*!40101 SET character_set_client = @saved_cs_client */; + +-- +-- Table structure for table `driver_gifts` +-- + +DROP TABLE IF EXISTS `driver_gifts`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!50503 SET character_set_client = utf8mb4 */; +CREATE TABLE `driver_gifts` ( + `id` int NOT NULL AUTO_INCREMENT, + `driver_id` varchar(70) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL, + `gift_description` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL, + `gift_date` datetime DEFAULT CURRENT_TIMESTAMP, + `is_claimed` tinyint(1) DEFAULT '0', + PRIMARY KEY (`id`), + UNIQUE KEY `driver_id` (`driver_id`) +) ENGINE=InnoDB AUTO_INCREMENT=10 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci; +/*!40101 SET character_set_client = @saved_cs_client */; + +-- +-- Table structure for table `driver_health_assurance` +-- + +DROP TABLE IF EXISTS `driver_health_assurance`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!50503 SET character_set_client = utf8mb4 */; +CREATE TABLE `driver_health_assurance` ( + `id` int NOT NULL AUTO_INCREMENT, + `driver_id` varchar(155) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL, + `assured` tinyint(1) DEFAULT '0', + `date_created` timestamp NULL DEFAULT CURRENT_TIMESTAMP, + `health_insurance_provider` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL, + PRIMARY KEY (`id`), + UNIQUE KEY `driver_id` (`driver_id`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci; +/*!40101 SET character_set_client = @saved_cs_client */; + +-- +-- Table structure for table `driver_orders` +-- + +DROP TABLE IF EXISTS `driver_orders`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!50503 SET character_set_client = utf8mb4 */; +CREATE TABLE `driver_orders` ( + `id` int NOT NULL AUTO_INCREMENT, + `driver_id` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL, + `order_id` varchar(99) CHARACTER SET utf8mb3 COLLATE utf8mb3_general_ci NOT NULL, + `notes` varchar(200) CHARACTER SET utf8mb3 COLLATE utf8mb3_general_ci NOT NULL DEFAULT 'nothing', + `created_at` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP, + `status` varchar(30) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT 'applied', + PRIMARY KEY (`id`) +) ENGINE=InnoDB AUTO_INCREMENT=44 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci; +/*!40101 SET character_set_client = @saved_cs_client */; + +-- +-- Table structure for table `driver_ride_scam` +-- + +DROP TABLE IF EXISTS `driver_ride_scam`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!50503 SET character_set_client = utf8mb4 */; +CREATE TABLE `driver_ride_scam` ( + `id` int NOT NULL AUTO_INCREMENT, + `driverID` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL, + `passendgerID` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL, + `rideID` varchar(20) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL, + `isDriverCallPassenger` varchar(10) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL, + `dateCreated` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP, + PRIMARY KEY (`id`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci; +/*!40101 SET character_set_client = @saved_cs_client */; + +-- +-- Table structure for table `driversWantWork` +-- + +DROP TABLE IF EXISTS `driversWantWork`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!50503 SET character_set_client = utf8mb4 */; +CREATE TABLE `driversWantWork` ( + `id` int NOT NULL AUTO_INCREMENT, + `driver_name` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL, + `phone` varchar(15) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL, + `national_id` varchar(20) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL, + `birth_date` varchar(15) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL, + `license_type` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL, + `site` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL, + `created_at` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP, + PRIMARY KEY (`id`), + UNIQUE KEY `national_id` (`national_id`), + UNIQUE KEY `phone` (`phone`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci; +/*!40101 SET character_set_client = @saved_cs_client */; + +-- +-- Table structure for table `email_verifications` +-- + +DROP TABLE IF EXISTS `email_verifications`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!50503 SET character_set_client = utf8mb4 */; +CREATE TABLE `email_verifications` ( + `id` int NOT NULL AUTO_INCREMENT, + `email` varchar(255) NOT NULL, + `token` varchar(255) NOT NULL, + `created_at` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP, + `updated_at` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP, + `verified` tinyint(1) NOT NULL DEFAULT '0', + PRIMARY KEY (`id`), + UNIQUE KEY `email` (`email`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci; +/*!40101 SET character_set_client = @saved_cs_client */; + +-- +-- Table structure for table `employee` +-- + +DROP TABLE IF EXISTS `employee`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!50503 SET character_set_client = utf8mb4 */; +CREATE TABLE `employee` ( + `id` varchar(20) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL, + `name` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL, + `education` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL, + `site` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL, + `phone` varchar(20) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL, + `created_at` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP, + `status` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL, + PRIMARY KEY (`id`), + UNIQUE KEY `phone` (`phone`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci; +/*!40101 SET character_set_client = @saved_cs_client */; + +-- +-- Table structure for table `error` +-- + +DROP TABLE IF EXISTS `error`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!50503 SET character_set_client = utf8mb4 */; +CREATE TABLE `error` ( + `id` int NOT NULL AUTO_INCREMENT, + `error` varchar(400) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL, + `userId` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL, + `userType` varchar(30) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL, + `phone` varchar(20) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL, + `created_at` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP, + `device` varchar(300) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL, + `details` text CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci, + `status` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL DEFAULT 'new', + PRIMARY KEY (`id`), + KEY `idx_error_created_at` (`created_at`), + KEY `idx_error_phone` (`phone`) +) ENGINE=InnoDB AUTO_INCREMENT=14316 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci; +/*!40101 SET character_set_client = @saved_cs_client */; + +-- +-- Table structure for table `feedBack` +-- + +DROP TABLE IF EXISTS `feedBack`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!50503 SET character_set_client = utf8mb4 */; +CREATE TABLE `feedBack` ( + `id` int NOT NULL AUTO_INCREMENT, + `passengerId` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL, + `feedBack` text CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL, + `datecreated` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP, + PRIMARY KEY (`id`) +) ENGINE=InnoDB AUTO_INCREMENT=3 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci; +/*!40101 SET character_set_client = @saved_cs_client */; + +-- +-- Table structure for table `helpCenter` +-- + +DROP TABLE IF EXISTS `helpCenter`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!50503 SET character_set_client = utf8mb4 */; +CREATE TABLE `helpCenter` ( + `id` int NOT NULL AUTO_INCREMENT, + `driverID` varchar(89) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL, + `helpQuestion` varchar(300) CHARACTER SET utf8mb3 COLLATE utf8mb3_general_ci NOT NULL, + `replay` varchar(400) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL DEFAULT 'not yet', + `datecreated` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP, + PRIMARY KEY (`id`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci; +/*!40101 SET character_set_client = @saved_cs_client */; + +-- +-- Table structure for table `hotels` +-- + +DROP TABLE IF EXISTS `hotels`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!50503 SET character_set_client = utf8mb4 */; +CREATE TABLE `hotels` ( + `id` int NOT NULL, + `nameEnglish` varchar(255) DEFAULT NULL, + `nameArabic` varchar(255) DEFAULT NULL, + `phone` varchar(20) DEFAULT NULL, + `countReview` int DEFAULT NULL, + `rate` float DEFAULT NULL, + `stars` varchar(50) DEFAULT NULL, + `address` text, + `website` varchar(255) DEFAULT NULL, + `email` varchar(255) DEFAULT NULL, + `PlusCode` varchar(50) DEFAULT NULL, + `closeTime` varchar(50) DEFAULT NULL, + `latitude` decimal(10,6) DEFAULT NULL, + `longitude` decimal(10,6) DEFAULT NULL, + `instagram` varchar(255) DEFAULT NULL, + `facebook` varchar(255) DEFAULT NULL, + `linkedin` varchar(255) DEFAULT NULL, + `twitter` varchar(255) DEFAULT NULL, + `photo` varchar(255) DEFAULT NULL +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci; +/*!40101 SET character_set_client = @saved_cs_client */; + +-- +-- Table structure for table `imageProfileCaptain` +-- + +DROP TABLE IF EXISTS `imageProfileCaptain`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!50503 SET character_set_client = utf8mb4 */; +CREATE TABLE `imageProfileCaptain` ( + `id` int NOT NULL AUTO_INCREMENT, + `driverID` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL, + `image_name` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL, + `upload_date` datetime DEFAULT CURRENT_TIMESTAMP, + `link` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL, + PRIMARY KEY (`id`) +) ENGINE=InnoDB AUTO_INCREMENT=4 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci; +/*!40101 SET character_set_client = @saved_cs_client */; + +-- +-- Table structure for table `invites` +-- + +DROP TABLE IF EXISTS `invites`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!50503 SET character_set_client = utf8mb4 */; +CREATE TABLE `invites` ( + `id` int NOT NULL AUTO_INCREMENT, + `driverId` varchar(50) NOT NULL, + `inviterDriverPhone` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL, + `createdAt` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP, + `inviteCode` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL, + `isInstall` tinyint(1) NOT NULL DEFAULT '0', + `isGiftToken` tinyint(1) NOT NULL DEFAULT '0', + `expirationTime` datetime NOT NULL, + PRIMARY KEY (`id`), + UNIQUE KEY `inviterDriverId` (`inviterDriverPhone`), + UNIQUE KEY `inviteCode` (`inviteCode`) +) ENGINE=InnoDB AUTO_INCREMENT=5 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci; +/*!40101 SET character_set_client = @saved_cs_client */; + +-- +-- Table structure for table `invitesToPassengers` +-- + +DROP TABLE IF EXISTS `invitesToPassengers`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!50503 SET character_set_client = utf8mb4 */; +CREATE TABLE `invitesToPassengers` ( + `id` int NOT NULL AUTO_INCREMENT, + `driverId` varchar(70) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL, + `passengerID` varchar(80) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL DEFAULT 'yet', + `inviterPassengerPhone` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL, + `inviteCode` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL, + `expirationTime` datetime NOT NULL, + `createdAt` datetime DEFAULT CURRENT_TIMESTAMP, + `isInstall` tinyint(1) DEFAULT '0', + `isGiftToken` tinyint(1) NOT NULL DEFAULT '0', + PRIMARY KEY (`id`), + UNIQUE KEY `inviteCode` (`inviteCode`) +) ENGINE=InnoDB AUTO_INCREMENT=11 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci; +/*!40101 SET character_set_client = @saved_cs_client */; + +-- +-- Table structure for table `invoice_records` +-- + +DROP TABLE IF EXISTS `invoice_records`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!50503 SET character_set_client = utf8mb4 */; +CREATE TABLE `invoice_records` ( + `id` int NOT NULL AUTO_INCREMENT, + `driverID` int NOT NULL, + `invoice_number` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL, + `name` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL, + `amount` decimal(10,2) DEFAULT NULL, + `date` date DEFAULT NULL, + `image_link` text CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci, + `created_at` datetime DEFAULT NULL, + PRIMARY KEY (`id`) +) ENGINE=InnoDB AUTO_INCREMENT=36 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci; +/*!40101 SET character_set_client = @saved_cs_client */; + +-- +-- Table structure for table `invoicesAdmin` +-- + +DROP TABLE IF EXISTS `invoicesAdmin`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!50503 SET character_set_client = utf8mb4 */; +CREATE TABLE `invoicesAdmin` ( + `id` int NOT NULL AUTO_INCREMENT, + `item_name` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL, + `amount` decimal(10,2) NOT NULL, + `image_url` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL, + `created_at` timestamp NULL DEFAULT CURRENT_TIMESTAMP, + PRIMARY KEY (`id`) +) ENGINE=InnoDB AUTO_INCREMENT=22 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci; +/*!40101 SET character_set_client = @saved_cs_client */; + +-- +-- Table structure for table `kazan` +-- + +DROP TABLE IF EXISTS `kazan`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!50503 SET character_set_client = utf8mb4 */; +CREATE TABLE `kazan` ( + `id` int NOT NULL AUTO_INCREMENT, + `country` varchar(30) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL, + `kazan` varchar(10) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL, + `comfortPrice` varchar(10) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL, + `speedPrice` varchar(10) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL, + `familyPrice` varchar(4) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL, + `deliveryPrice` varchar(11) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL, + `freePrice` varchar(11) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL, + `latePrice` varchar(10) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL, + `heavyPrice` varchar(10) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL, + `adminId` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL, + `createdAt` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP, + `naturePrice` varchar(10) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL, + `fuelPrice` varchar(6) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL, + PRIMARY KEY (`id`) +) ENGINE=InnoDB AUTO_INCREMENT=2 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci; +/*!40101 SET character_set_client = @saved_cs_client */; + +-- +-- Table structure for table `lisenceDetails` +-- + +DROP TABLE IF EXISTS `lisenceDetails`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!50503 SET character_set_client = utf8mb4 */; +CREATE TABLE `lisenceDetails` ( + `id` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL, + `driverID` text CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL, + `name` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci DEFAULT NULL, + `licenseClass` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci DEFAULT NULL, + `documentNo` varchar(30) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci DEFAULT NULL, + `address` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci DEFAULT NULL, + `height` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci DEFAULT NULL, + `postalCode` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci DEFAULT NULL, + `sex` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci DEFAULT NULL, + `stateCode` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci DEFAULT NULL, + `expireDate` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci DEFAULT NULL, + `dateOfBirth` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci DEFAULT NULL, + `dateCreated` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP, + PRIMARY KEY (`id`), + UNIQUE KEY `documentNo` (`documentNo`) +) ENGINE=MyISAM DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci; +/*!40101 SET character_set_client = @saved_cs_client */; + +-- +-- Table structure for table `login_attempts` +-- + +DROP TABLE IF EXISTS `login_attempts`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!50503 SET character_set_client = utf8mb4 */; +CREATE TABLE `login_attempts` ( + `id` int NOT NULL AUTO_INCREMENT, + `ip_address` varchar(45) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL, + `attempt_time` timestamp NULL DEFAULT CURRENT_TIMESTAMP, + PRIMARY KEY (`id`) +) ENGINE=InnoDB AUTO_INCREMENT=18 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci; +/*!40101 SET character_set_client = @saved_cs_client */; + +-- +-- Table structure for table `login_attempts_drivers` +-- + +DROP TABLE IF EXISTS `login_attempts_drivers`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!50503 SET character_set_client = utf8mb4 */; +CREATE TABLE `login_attempts_drivers` ( + `id` int NOT NULL AUTO_INCREMENT, + `ip_address` varchar(45) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL, + `attempt_time` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP, + PRIMARY KEY (`id`) +) ENGINE=InnoDB AUTO_INCREMENT=11 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci; +/*!40101 SET character_set_client = @saved_cs_client */; + +-- +-- Table structure for table `mishwaritrips` +-- + +DROP TABLE IF EXISTS `mishwaritrips`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!50503 SET character_set_client = utf8mb4 */; +CREATE TABLE `mishwaritrips` ( + `id` int NOT NULL AUTO_INCREMENT, + `driverId` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL, + `phone` varchar(15) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL, + `gender` varchar(20) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL, + `name` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL, + `name_english` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL, + `address` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL, + `religion` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL, + `age` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL, + `startNameAddress` varchar(150) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL DEFAULT 'none', + `locationCoordinate` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL DEFAULT 'none', + `education` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL, + `license_type` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL, + `national_number` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL, + `car_plate` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL, + `make` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL, + `model` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL, + `color` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL, + `color_hex` char(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL, + `token` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL, + `rating` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL, + `countRide` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL, + `passengerId` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL, + `timeSelected` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL, + `createdAt` timestamp NULL DEFAULT CURRENT_TIMESTAMP, + `status` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT 'pending', + PRIMARY KEY (`id`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci; +/*!40101 SET character_set_client = @saved_cs_client */; + +-- +-- Table structure for table `notesForDriverService` +-- + +DROP TABLE IF EXISTS `notesForDriverService`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!50503 SET character_set_client = utf8mb4 */; +CREATE TABLE `notesForDriverService` ( + `id` int NOT NULL AUTO_INCREMENT, + `phone` varchar(70) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL, + `note` varchar(250) NOT NULL, + `editor` varchar(50) NOT NULL, + `createdAt` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP, + PRIMARY KEY (`id`), + UNIQUE KEY `phone` (`phone`) +) ENGINE=InnoDB AUTO_INCREMENT=5 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci; +/*!40101 SET character_set_client = @saved_cs_client */; + +-- +-- Table structure for table `notesForPassengerService` +-- + +DROP TABLE IF EXISTS `notesForPassengerService`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!50503 SET character_set_client = utf8mb4 */; +CREATE TABLE `notesForPassengerService` ( + `id` int NOT NULL AUTO_INCREMENT, + `phone` int NOT NULL, + `note` varchar(250) NOT NULL, + `editor` varchar(50) NOT NULL, + `createdAt` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP, + PRIMARY KEY (`id`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci; +/*!40101 SET character_set_client = @saved_cs_client */; + +-- +-- Table structure for table `notificationCaptain` +-- + +DROP TABLE IF EXISTS `notificationCaptain`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!50503 SET character_set_client = utf8mb4 */; +CREATE TABLE `notificationCaptain` ( + `id` int NOT NULL AUTO_INCREMENT, + `driverID` varchar(80) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL, + `title` varchar(100) CHARACTER SET utf8mb3 COLLATE utf8mb3_general_ci NOT NULL, + `body` varchar(200) CHARACTER SET utf8mb3 COLLATE utf8mb3_general_ci NOT NULL, + `isShown` varchar(6) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL DEFAULT 'false', + `isPin` varchar(10) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL DEFAULT 'unPin', + `dateCreated` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP, + PRIMARY KEY (`id`) +) ENGINE=InnoDB AUTO_INCREMENT=6 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci; +/*!40101 SET character_set_client = @saved_cs_client */; + +-- +-- Table structure for table `notifications` +-- + +DROP TABLE IF EXISTS `notifications`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!50503 SET character_set_client = utf8mb4 */; +CREATE TABLE `notifications` ( + `id` int NOT NULL AUTO_INCREMENT, + `title` varchar(111) NOT NULL, + `body` varchar(265) NOT NULL, + `passenger_id` varchar(111) NOT NULL, + `isShown` varchar(255) CHARACTER SET utf8mb3 COLLATE utf8mb3_general_ci NOT NULL DEFAULT 'false', + `created_at` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP, + `updated_at` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, + PRIMARY KEY (`id`) +) ENGINE=InnoDB AUTO_INCREMENT=9 DEFAULT CHARSET=utf8mb3; +/*!40101 SET character_set_client = @saved_cs_client */; + +-- +-- Table structure for table `otp_verification_fingerPrint` +-- + +DROP TABLE IF EXISTS `otp_verification_fingerPrint`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!50503 SET character_set_client = utf8mb4 */; +CREATE TABLE `otp_verification_fingerPrint` ( + `id` int NOT NULL, + `phone` varchar(20) NOT NULL, + `otp` varchar(6) NOT NULL, + `createdAt` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci; +/*!40101 SET character_set_client = @saved_cs_client */; + +-- +-- Table structure for table `packageInfo` +-- + +DROP TABLE IF EXISTS `packageInfo`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!50503 SET character_set_client = utf8mb4 */; +CREATE TABLE `packageInfo` ( + `id` int NOT NULL AUTO_INCREMENT, + `platform` varchar(50) NOT NULL, + `appName` varchar(20) NOT NULL, + `createdAt` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP, + `version` varchar(10) NOT NULL, + PRIMARY KEY (`id`) +) ENGINE=InnoDB AUTO_INCREMENT=5 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci; +/*!40101 SET character_set_client = @saved_cs_client */; + +-- +-- Table structure for table `palces11` +-- + +DROP TABLE IF EXISTS `palces11`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!50503 SET character_set_client = utf8mb4 */; +CREATE TABLE `palces11` ( + `id` int NOT NULL AUTO_INCREMENT, + `latitude` varchar(50) NOT NULL, + `longitude` varchar(50) NOT NULL, + `name` varchar(180) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci DEFAULT NULL, + `name_ar` varchar(200) NOT NULL, + `name_en` varchar(200) NOT NULL, + `address` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci DEFAULT NULL, + `category` varchar(55) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci DEFAULT NULL, + `created_at` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP, + `location` point NOT NULL, + PRIMARY KEY (`id`), + SPATIAL KEY `idx_spatial_location` (`location`), + FULLTEXT KEY `idx_fulltext_search` (`name`,`name_ar`,`name_en`,`address`,`category`) +) ENGINE=InnoDB AUTO_INCREMENT=28951 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci; +/*!40101 SET character_set_client = @saved_cs_client */; + +-- +-- Table structure for table `passengerWallet` +-- + +DROP TABLE IF EXISTS `passengerWallet`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!50503 SET character_set_client = utf8mb4 */; +CREATE TABLE `passengerWallet` ( + `id` int NOT NULL AUTO_INCREMENT, + `passenger_id` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL, + `balance` decimal(10,2) NOT NULL, + `created_at` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP, + `updated_at` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, + PRIMARY KEY (`id`), + KEY `passenger_id` (`passenger_id`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci; +/*!40101 SET character_set_client = @saved_cs_client */; + +-- +-- Table structure for table `passenger_blacklist` +-- + +DROP TABLE IF EXISTS `passenger_blacklist`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!50503 SET character_set_client = utf8mb4 */; +CREATE TABLE `passenger_blacklist` ( + `id` bigint unsigned NOT NULL AUTO_INCREMENT, + `phone` varchar(150) NOT NULL, + `phone_normalized` varchar(64) NOT NULL, + `reason` varchar(255) DEFAULT NULL, + `expires_at` datetime DEFAULT CURRENT_TIMESTAMP, + `created_at` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP, + PRIMARY KEY (`id`), + UNIQUE KEY `uq_phone_norm` (`phone_normalized`), + KEY `idx_expires` (`expires_at`) +) ENGINE=InnoDB AUTO_INCREMENT=2 DEFAULT CHARSET=utf8mb3; +/*!40101 SET character_set_client = @saved_cs_client */; + +-- +-- Table structure for table `passengerlocation` +-- + +DROP TABLE IF EXISTS `passengerlocation`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!50503 SET character_set_client = utf8mb4 */; +CREATE TABLE `passengerlocation` ( + `id` int NOT NULL AUTO_INCREMENT, + `passengerId` varchar(60) NOT NULL, + `lat` varchar(20) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL, + `lng` varchar(20) NOT NULL, + `rideId` varchar(10) NOT NULL, + `createdAt` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP, + PRIMARY KEY (`id`) +) ENGINE=InnoDB AUTO_INCREMENT=31 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci; +/*!40101 SET character_set_client = @saved_cs_client */; + +-- +-- Table structure for table `passengers` +-- + +DROP TABLE IF EXISTS `passengers`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!50503 SET character_set_client = utf8mb4 */; +CREATE TABLE `passengers` ( + `id` varchar(100) NOT NULL, + `phone` varchar(150) CHARACTER SET utf8mb3 COLLATE utf8mb3_general_ci NOT NULL, + `email` varchar(255) NOT NULL, + `password` varchar(100) NOT NULL, + `gender` varchar(150) CHARACTER SET utf8mb3 COLLATE utf8mb3_general_ci NOT NULL, + `status` varchar(150) CHARACTER SET utf8mb3 COLLATE utf8mb3_general_ci NOT NULL DEFAULT 'notDeleted', + `birthdate` varchar(150) CHARACTER SET utf8mb3 COLLATE utf8mb3_general_ci NOT NULL, + `site` varchar(255) NOT NULL, + `first_name` varchar(255) NOT NULL, + `last_name` varchar(255) NOT NULL, + `sosPhone` varchar(150) CHARACTER SET utf8mb3 COLLATE utf8mb3_general_ci NOT NULL DEFAULT 'sos', + `education` varchar(150) CHARACTER SET utf8mb3 COLLATE utf8mb3_general_ci NOT NULL DEFAULT 'none', + `employmentType` varchar(150) CHARACTER SET utf8mb3 COLLATE utf8mb3_general_ci NOT NULL DEFAULT 'none', + `maritalStatus` varchar(150) CHARACTER SET utf8mb3 COLLATE utf8mb3_general_ci NOT NULL DEFAULT 'none', + `created_at` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP, + `updated_at` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, + PRIMARY KEY (`id`), + UNIQUE KEY `phone` (`phone`,`email`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb3; +/*!40101 SET character_set_client = @saved_cs_client */; + +-- +-- Table structure for table `payment_tokens` +-- + +DROP TABLE IF EXISTS `payment_tokens`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!50503 SET character_set_client = utf8mb4 */; +CREATE TABLE `payment_tokens` ( + `id` int NOT NULL AUTO_INCREMENT, + `token` varchar(255) NOT NULL, + `driverID` varchar(255) NOT NULL, + `dateCreated` datetime NOT NULL, + `amount` decimal(10,2) NOT NULL, + `isUsed` tinyint(1) DEFAULT '0', + PRIMARY KEY (`id`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci; +/*!40101 SET character_set_client = @saved_cs_client */; + +-- +-- Table structure for table `payment_tokens_passenger` +-- + +DROP TABLE IF EXISTS `payment_tokens_passenger`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!50503 SET character_set_client = utf8mb4 */; +CREATE TABLE `payment_tokens_passenger` ( + `id` int NOT NULL AUTO_INCREMENT, + `token` varchar(255) NOT NULL, + `passengerId` varchar(255) NOT NULL, + `dateCreated` datetime NOT NULL, + `amount` decimal(10,2) NOT NULL, + `isUsed` tinyint(1) DEFAULT '0', + PRIMARY KEY (`id`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci; +/*!40101 SET character_set_client = @saved_cs_client */; + +-- +-- Table structure for table `payments` +-- + +DROP TABLE IF EXISTS `payments`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!50503 SET character_set_client = utf8mb4 */; +CREATE TABLE `payments` ( + `id` varchar(111) NOT NULL, + `amount` decimal(10,2) NOT NULL, + `payment_method` varchar(255) NOT NULL, + `passengerID` varchar(100) NOT NULL, + `rideId` varchar(100) NOT NULL, + `driverID` varchar(100) NOT NULL, + `created_at` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP, + `updated_at` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, + `isGiven` varchar(20) NOT NULL DEFAULT 'waiting', + PRIMARY KEY (`id`), + UNIQUE KEY `rideId` (`rideId`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb3; +/*!40101 SET character_set_client = @saved_cs_client */; + +-- +-- Table structure for table `paymentsDriverPoints` +-- + +DROP TABLE IF EXISTS `paymentsDriverPoints`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!50503 SET character_set_client = utf8mb4 */; +CREATE TABLE `paymentsDriverPoints` ( + `id` int NOT NULL AUTO_INCREMENT, + `amount` decimal(10,2) NOT NULL, + `payment_method` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL, + `driverID` varchar(60) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL, + `created_at` datetime DEFAULT CURRENT_TIMESTAMP, + `updated_at` datetime DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, + PRIMARY KEY (`id`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci; +/*!40101 SET character_set_client = @saved_cs_client */; + +-- +-- Table structure for table `phone_verification` +-- + +DROP TABLE IF EXISTS `phone_verification`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!50503 SET character_set_client = utf8mb4 */; +CREATE TABLE `phone_verification` ( + `id` int NOT NULL AUTO_INCREMENT, + `phone_number` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL, + `driverId` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL DEFAULT 'yet', + `email` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL DEFAULT 'yet', + `token_code` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL, + `expiration_time` datetime NOT NULL, + `is_verified` tinyint(1) DEFAULT '0', + `created_at` timestamp NULL DEFAULT CURRENT_TIMESTAMP, + PRIMARY KEY (`id`) +) ENGINE=InnoDB AUTO_INCREMENT=111 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci; +/*!40101 SET character_set_client = @saved_cs_client */; + +-- +-- Table structure for table `phone_verification_passenger` +-- + +DROP TABLE IF EXISTS `phone_verification_passenger`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!50503 SET character_set_client = utf8mb4 */; +CREATE TABLE `phone_verification_passenger` ( + `id` int NOT NULL AUTO_INCREMENT, + `phone_number` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci DEFAULT NULL, + `token` varchar(80) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL, + `expiration_time` datetime NOT NULL, + `verified` tinyint(1) DEFAULT '0', + `created_at` timestamp NULL DEFAULT CURRENT_TIMESTAMP, + `status` varchar(22) NOT NULL DEFAULT 'yet', + PRIMARY KEY (`id`) +) ENGINE=InnoDB AUTO_INCREMENT=109 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci; +/*!40101 SET character_set_client = @saved_cs_client */; + +-- +-- Table structure for table `places` +-- + +DROP TABLE IF EXISTS `places`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!50503 SET character_set_client = utf8mb4 */; +CREATE TABLE `places` ( + `id` int NOT NULL AUTO_INCREMENT, + `latitude` double NOT NULL, + `longitude` double NOT NULL, + `name` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL, + `name_ar` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL, + `name_en` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL, + `address` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL, + `category` varchar(200) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL, + `created_at` timestamp NULL DEFAULT CURRENT_TIMESTAMP, + PRIMARY KEY (`id`) +) ENGINE=InnoDB AUTO_INCREMENT=58830 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci; +/*!40101 SET character_set_client = @saved_cs_client */; + +-- +-- Table structure for table `placesEgypt` +-- + +DROP TABLE IF EXISTS `placesEgypt`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!50503 SET character_set_client = utf8mb4 */; +CREATE TABLE `placesEgypt` ( + `id` int NOT NULL, + `nameEnglish` varchar(255) DEFAULT NULL, + `nameArabic` varchar(255) DEFAULT NULL, + `phone` varchar(20) DEFAULT NULL, + `countReview` int DEFAULT NULL, + `rate` float DEFAULT NULL, + `stars` varchar(50) DEFAULT NULL, + `address` text, + `website` varchar(255) DEFAULT NULL, + `email` varchar(255) DEFAULT NULL, + `PlusCode` varchar(50) DEFAULT NULL, + `closeTime` varchar(50) DEFAULT NULL, + `latitude` decimal(10,6) DEFAULT NULL, + `longitude` decimal(10,6) DEFAULT NULL, + `instagram` varchar(255) DEFAULT NULL, + `facebook` varchar(255) DEFAULT NULL, + `linkedin` varchar(255) DEFAULT NULL, + `twitter` varchar(255) DEFAULT NULL, + `photo` varchar(255) DEFAULT NULL +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci; +/*!40101 SET character_set_client = @saved_cs_client */; + +-- +-- Table structure for table `promos` +-- + +DROP TABLE IF EXISTS `promos`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!50503 SET character_set_client = utf8mb4 */; +CREATE TABLE `promos` ( + `id` int NOT NULL AUTO_INCREMENT, + `promo_code` varchar(10) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL, + `amount` varchar(4) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL DEFAULT '0', + `description` varchar(100) CHARACTER SET utf8mb3 COLLATE utf8mb3_general_ci DEFAULT NULL, + `passengerID` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL DEFAULT 'none', + `validity_start_date` date DEFAULT NULL, + `validity_end_date` date DEFAULT NULL, + PRIMARY KEY (`id`), + UNIQUE KEY `passengerID` (`passengerID`) +) ENGINE=InnoDB AUTO_INCREMENT=2 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci; +/*!40101 SET character_set_client = @saved_cs_client */; + +-- +-- Table structure for table `promptDriverIDEgypt` +-- + +DROP TABLE IF EXISTS `promptDriverIDEgypt`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!50503 SET character_set_client = utf8mb4 */; +CREATE TABLE `promptDriverIDEgypt` ( + `id` int NOT NULL AUTO_INCREMENT, + `type` varchar(30) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL, + `prompt` longtext CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL, + `createdAt` timestamp NULL DEFAULT CURRENT_TIMESTAMP, + `updatedAt` timestamp NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, + PRIMARY KEY (`id`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci; +/*!40101 SET character_set_client = @saved_cs_client */; + +-- +-- Table structure for table `ratingApp` +-- + +DROP TABLE IF EXISTS `ratingApp`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!50503 SET character_set_client = utf8mb4 */; +CREATE TABLE `ratingApp` ( + `id` int NOT NULL AUTO_INCREMENT, + `name` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL, + `email` varchar(150) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL, + `phone` varchar(80) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL, + `userId` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL, + `userType` varchar(20) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL, + `rating` varchar(2) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL, + `comment` varchar(300) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL, + `created_at` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP, + PRIMARY KEY (`id`) +) ENGINE=InnoDB AUTO_INCREMENT=11 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci; +/*!40101 SET character_set_client = @saved_cs_client */; + +-- +-- Table structure for table `ratingDriver` +-- + +DROP TABLE IF EXISTS `ratingDriver`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!50503 SET character_set_client = utf8mb4 */; +CREATE TABLE `ratingDriver` ( + `id` int NOT NULL AUTO_INCREMENT, + `passenger_id` text CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci, + `driver_id` varchar(33) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL, + `ride_id` int DEFAULT NULL, + `rating` float DEFAULT NULL, + `comment` text CHARACTER SET utf8mb3 COLLATE utf8mb3_general_ci, + `created_at` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP, + PRIMARY KEY (`id`), + UNIQUE KEY `ride_id` (`ride_id`), + KEY `idx_driver_id` (`driver_id`) +) ENGINE=InnoDB AUTO_INCREMENT=17 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci; +/*!40101 SET character_set_client = @saved_cs_client */; + +-- +-- Table structure for table `ratingPassenger` +-- + +DROP TABLE IF EXISTS `ratingPassenger`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!50503 SET character_set_client = utf8mb4 */; +CREATE TABLE `ratingPassenger` ( + `id` int NOT NULL AUTO_INCREMENT, + `passenger_id` text CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL, + `driverID` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL, + `rideId` varchar(30) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL, + `rating` float NOT NULL, + `comment` text CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci, + `created_at` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP, + PRIMARY KEY (`id`), + UNIQUE KEY `rideId` (`rideId`) +) ENGINE=InnoDB AUTO_INCREMENT=17 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci; +/*!40101 SET character_set_client = @saved_cs_client */; + +-- +-- Table structure for table `ride` +-- + +DROP TABLE IF EXISTS `ride`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!50503 SET character_set_client = utf8mb4 */; +CREATE TABLE `ride` ( + `id` int NOT NULL AUTO_INCREMENT, + `start_location` varchar(255) NOT NULL, + `end_location` varchar(255) NOT NULL, + `date` date NOT NULL, + `time` time NOT NULL, + `endtime` time NOT NULL, + `price` decimal(10,2) NOT NULL DEFAULT '0.00', + `passenger_id` varchar(111) NOT NULL, + `driver_id` varchar(111) NOT NULL, + `status` varchar(200) NOT NULL DEFAULT 'nothing', + `paymentMethod` varchar(20) NOT NULL DEFAULT 'Cash', + `carType` varchar(20) NOT NULL DEFAULT 'Speed', + `created_at` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, + `updated_at` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, + `DriverIsGoingToPassenger` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP, + `rideTimeStart` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP, + `rideTimeFinish` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP, + `price_for_driver` decimal(10,2) NOT NULL DEFAULT '0.00', + `price_for_passenger` decimal(10,2) NOT NULL DEFAULT '0.00', + `distance` float DEFAULT '0', + PRIMARY KEY (`id`), + KEY `passengerfk` (`passenger_id`), + KEY `driverfk` (`driver_id`) +) ENGINE=InnoDB AUTO_INCREMENT=831 DEFAULT CHARSET=utf8mb3; +/*!40101 SET character_set_client = @saved_cs_client */; + +-- +-- Table structure for table `seferWallet` +-- + +DROP TABLE IF EXISTS `seferWallet`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!50503 SET character_set_client = utf8mb4 */; +CREATE TABLE `seferWallet` ( + `id` int NOT NULL AUTO_INCREMENT, + `driverId` varchar(100) NOT NULL, + `passengerId` varchar(100) NOT NULL, + `amount` varchar(10) NOT NULL, + `paymentMethod` varchar(50) NOT NULL, + `token` varchar(100) NOT NULL, + `createdAt` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP, + PRIMARY KEY (`id`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci; +/*!40101 SET character_set_client = @saved_cs_client */; + +-- +-- Table structure for table `server_locations` +-- + +DROP TABLE IF EXISTS `server_locations`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!50503 SET character_set_client = utf8mb4 */; +CREATE TABLE `server_locations` ( + `id` int NOT NULL AUTO_INCREMENT, + `name` varchar(255) NOT NULL, + `min_latitude` decimal(10,6) NOT NULL, + `max_latitude` decimal(10,6) NOT NULL, + `min_longitude` decimal(10,6) NOT NULL, + `max_longitude` decimal(10,6) NOT NULL, + `server_link` varchar(255) NOT NULL, + PRIMARY KEY (`id`), + UNIQUE KEY `name` (`name`) +) ENGINE=InnoDB AUTO_INCREMENT=2 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci; +/*!40101 SET character_set_client = @saved_cs_client */; + +-- +-- Table structure for table `smsSender` +-- + +DROP TABLE IF EXISTS `smsSender`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!50503 SET character_set_client = utf8mb4 */; +CREATE TABLE `smsSender` ( + `id` int NOT NULL AUTO_INCREMENT, + `senderId` varchar(20) NOT NULL, + PRIMARY KEY (`id`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci; +/*!40101 SET character_set_client = @saved_cs_client */; + +-- +-- Table structure for table `test` +-- + +DROP TABLE IF EXISTS `test`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!50503 SET character_set_client = utf8mb4 */; +CREATE TABLE `test` ( + `id` int NOT NULL AUTO_INCREMENT, + `name` varchar(22) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL, + PRIMARY KEY (`id`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci; +/*!40101 SET character_set_client = @saved_cs_client */; + +-- +-- Table structure for table `testApp` +-- + +DROP TABLE IF EXISTS `testApp`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!50503 SET character_set_client = utf8mb4 */; +CREATE TABLE `testApp` ( + `id` int NOT NULL AUTO_INCREMENT, + `isTest` tinyint(1) NOT NULL, + `createdAt` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP, + `appPlatform` varchar(20) NOT NULL, + PRIMARY KEY (`id`) +) ENGINE=InnoDB AUTO_INCREMENT=3 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci; +/*!40101 SET character_set_client = @saved_cs_client */; + +-- +-- Table structure for table `tips` +-- + +DROP TABLE IF EXISTS `tips`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!50503 SET character_set_client = utf8mb4 */; +CREATE TABLE `tips` ( + `id` int NOT NULL AUTO_INCREMENT, + `driverID` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL, + `passengerID` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL, + `rideID` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL, + `tipAmount` decimal(10,2) DEFAULT NULL, + PRIMARY KEY (`id`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci; +/*!40101 SET character_set_client = @saved_cs_client */; + +-- +-- Table structure for table `token_verification` +-- + +DROP TABLE IF EXISTS `token_verification`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!50503 SET character_set_client = utf8mb4 */; +CREATE TABLE `token_verification` ( + `id` int NOT NULL AUTO_INCREMENT, + `phone_number` text CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL, + `token` text CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL, + `expiration_time` datetime NOT NULL, + `verified` tinyint(1) DEFAULT '0', + `created_at` datetime DEFAULT CURRENT_TIMESTAMP, + PRIMARY KEY (`id`) +) ENGINE=InnoDB AUTO_INCREMENT=49 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci; +/*!40101 SET character_set_client = @saved_cs_client */; + +-- +-- Table structure for table `token_verification_admin` +-- + +DROP TABLE IF EXISTS `token_verification_admin`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!50503 SET character_set_client = utf8mb4 */; +CREATE TABLE `token_verification_admin` ( + `id` int NOT NULL AUTO_INCREMENT, + `phone_number` varchar(20) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL, + `token` varchar(10) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL, + `expiration_time` datetime NOT NULL, + PRIMARY KEY (`id`), + UNIQUE KEY `phone_number` (`phone_number`) +) ENGINE=InnoDB AUTO_INCREMENT=29 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci; +/*!40101 SET character_set_client = @saved_cs_client */; + +-- +-- Table structure for table `token_verification_driver` +-- + +DROP TABLE IF EXISTS `token_verification_driver`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!50503 SET character_set_client = utf8mb4 */; +CREATE TABLE `token_verification_driver` ( + `id` int NOT NULL AUTO_INCREMENT, + `phone_number` text CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL, + `token` text CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL, + `expiration_time` datetime NOT NULL, + `verified` tinyint(1) NOT NULL DEFAULT '0', + `created_at` datetime DEFAULT CURRENT_TIMESTAMP, + PRIMARY KEY (`id`) +) ENGINE=InnoDB AUTO_INCREMENT=49 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci; +/*!40101 SET character_set_client = @saved_cs_client */; + +-- +-- Table structure for table `tokens` +-- + +DROP TABLE IF EXISTS `tokens`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!50503 SET character_set_client = utf8mb4 */; +CREATE TABLE `tokens` ( + `id` int NOT NULL AUTO_INCREMENT, + `token` varchar(333) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL, + `passengerID` varchar(80) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL, + `fingerPrint` varchar(250) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL, + `status` varchar(22) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL DEFAULT 'yet', + PRIMARY KEY (`id`), + UNIQUE KEY `passengerID` (`passengerID`) +) ENGINE=InnoDB AUTO_INCREMENT=53 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci; +/*!40101 SET character_set_client = @saved_cs_client */; + +-- +-- Table structure for table `users` +-- + +DROP TABLE IF EXISTS `users`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!50503 SET character_set_client = utf8mb4 */; +CREATE TABLE `users` ( + `id` varchar(111) NOT NULL, + `phone` varchar(15) NOT NULL, + `email` varchar(255) NOT NULL, + `gender` varchar(10) NOT NULL, + `password` varchar(100) NOT NULL, + `birthdate` date NOT NULL, + `site` varchar(255) NOT NULL, + `first_name` varchar(255) NOT NULL, + `last_name` varchar(255) NOT NULL, + `created_at` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP, + `updated_at` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, + `user_type` varchar(44) NOT NULL, + PRIMARY KEY (`id`), + UNIQUE KEY `email` (`email`), + UNIQUE KEY `phone` (`phone`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb3; +/*!40101 SET character_set_client = @saved_cs_client */; + +-- +-- Table structure for table `vehicles` +-- + +DROP TABLE IF EXISTS `vehicles`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!50503 SET character_set_client = utf8mb4 */; +CREATE TABLE `vehicles` ( + `id` int NOT NULL AUTO_INCREMENT, + `driverID` varchar(100) NOT NULL, + `make` varchar(255) NOT NULL, + `model` varchar(255) NOT NULL, + `license_plate` varchar(255) NOT NULL, + `seats` int NOT NULL, + `created_at` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP, + `updated_at` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, + PRIMARY KEY (`id`), + UNIQUE KEY `license_plate` (`license_plate`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb3; +/*!40101 SET character_set_client = @saved_cs_client */; + +-- +-- Table structure for table `videos` +-- + +DROP TABLE IF EXISTS `videos`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!50503 SET character_set_client = utf8mb4 */; +CREATE TABLE `videos` ( + `id` int NOT NULL AUTO_INCREMENT, + `title` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL, + `description` varchar(200) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL, + `url` varchar(150) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL, + `created_at` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP, + PRIMARY KEY (`id`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci; +/*!40101 SET character_set_client = @saved_cs_client */; + +-- +-- Table structure for table `waitingRides` +-- + +DROP TABLE IF EXISTS `waitingRides`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!50503 SET character_set_client = utf8mb4 */; +CREATE TABLE `waitingRides` ( + `id` varchar(100) NOT NULL, + `start_location` varchar(255) NOT NULL, + `end_location` varchar(255) NOT NULL, + `date` date NOT NULL, + `time` time NOT NULL, + `price` decimal(10,2) NOT NULL DEFAULT '0.00', + `passenger_id` varchar(111) NOT NULL, + `status` varchar(200) NOT NULL DEFAULT 'nothing', + `carType` varchar(19) NOT NULL, + `passengerRate` decimal(10,2) NOT NULL, + `created_at` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, + `price_for_passenger` decimal(10,2) NOT NULL DEFAULT '0.00', + `distance` varchar(255) NOT NULL, + `duration` varchar(10) NOT NULL DEFAULT '0', + PRIMARY KEY (`id`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb3; +/*!40101 SET character_set_client = @saved_cs_client */; + +-- +-- Table structure for table `welcomeDriverCall` +-- + +DROP TABLE IF EXISTS `welcomeDriverCall`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!50503 SET character_set_client = utf8mb4 */; +CREATE TABLE `welcomeDriverCall` ( + `id` int NOT NULL AUTO_INCREMENT, + `driverId` varchar(50) NOT NULL, + `isCall` tinyint(1) NOT NULL DEFAULT '0', + `notes` varchar(255) NOT NULL, + `createdAt` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP, + PRIMARY KEY (`id`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci; +/*!40101 SET character_set_client = @saved_cs_client */; + +-- +-- Table structure for table `write_argument_after_applied_from_background` +-- + +DROP TABLE IF EXISTS `write_argument_after_applied_from_background`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!50503 SET character_set_client = utf8mb4 */; +CREATE TABLE `write_argument_after_applied_from_background` ( + `id` int unsigned NOT NULL AUTO_INCREMENT, + `ride_id` varchar(50) NOT NULL, + `driver_id` varchar(50) NOT NULL, + `passenger_id` varchar(50) NOT NULL, + `passenger_location` varchar(30) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL, + `passenger_destination` varchar(30) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL, + `duration` varchar(255) NOT NULL, + `duration_to_passenger` varchar(255) NOT NULL, + `duration_of_ride` varchar(255) NOT NULL, + `distance` varchar(255) NOT NULL, + `total_cost` varchar(255) NOT NULL, + `payment_amount` varchar(255) NOT NULL, + `payment_method` enum('visa','cash') NOT NULL, + `wallet_checked` varchar(255) NOT NULL, + `has_steps` varchar(255) NOT NULL, + `step0` varchar(255) DEFAULT NULL, + `step1` varchar(255) DEFAULT NULL, + `step2` varchar(255) DEFAULT NULL, + `step3` varchar(255) DEFAULT NULL, + `step4` varchar(255) DEFAULT NULL, + `passenger_wallet_burc` varchar(33) NOT NULL, + `token_passenger` varchar(255) NOT NULL, + `name` varchar(100) NOT NULL, + `phone` varchar(20) NOT NULL, + `email` varchar(150) NOT NULL, + `start_name_location` varchar(255) NOT NULL, + `end_name_location` varchar(255) NOT NULL, + `car_type` varchar(50) NOT NULL, + `kazan` varchar(255) NOT NULL, + `direction_url` text NOT NULL, + `time_of_order` datetime NOT NULL, + `total_passenger` varchar(255) NOT NULL, + PRIMARY KEY (`id`) +) ENGINE=InnoDB AUTO_INCREMENT=3 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci; +/*!40101 SET character_set_client = @saved_cs_client */; + +-- +-- Dumping events for database 'intaleq-ridesDB' +-- + +-- +-- Dumping routines for database 'intaleq-ridesDB' +-- +/*!50112 SET @disable_bulk_load = IF (@is_rocksdb_supported, 'SET SESSION rocksdb_bulk_load = @old_rocksdb_bulk_load', 'SET @dummy_rocksdb_bulk_load = 0') */; +/*!50112 PREPARE s FROM @disable_bulk_load */; +/*!50112 EXECUTE s */; +/*!50112 DEALLOCATE PREPARE s */; +/*!40103 SET TIME_ZONE=@OLD_TIME_ZONE */; + +/*!40101 SET SQL_MODE=@OLD_SQL_MODE */; +/*!40014 SET FOREIGN_KEY_CHECKS=@OLD_FOREIGN_KEY_CHECKS */; +/*!40014 SET UNIQUE_CHECKS=@OLD_UNIQUE_CHECKS */; +/*!40101 SET CHARACTER_SET_CLIENT=@OLD_CHARACTER_SET_CLIENT */; +/*!40101 SET CHARACTER_SET_RESULTS=@OLD_CHARACTER_SET_RESULTS */; +/*!40101 SET COLLATION_CONNECTION=@OLD_COLLATION_CONNECTION */; +/*!40111 SET SQL_NOTES=@OLD_SQL_NOTES */; + +-- Dump completed on 2026-04-22 20:58:51 diff --git a/backend/schema_tracking.sql b/backend/schema_tracking.sql new file mode 100644 index 0000000..57562cc --- /dev/null +++ b/backend/schema_tracking.sql @@ -0,0 +1,1826 @@ +-- MySQL dump 10.13 Distrib 8.0.36-28, for Linux (x86_64) +-- +-- Host: 188.68.36.205 Database: locationDB +-- ------------------------------------------------------ +-- Server version 8.0.36-28 + +/*!40101 SET @OLD_CHARACTER_SET_CLIENT=@@CHARACTER_SET_CLIENT */; +/*!40101 SET @OLD_CHARACTER_SET_RESULTS=@@CHARACTER_SET_RESULTS */; +/*!40101 SET @OLD_COLLATION_CONNECTION=@@COLLATION_CONNECTION */; +/*!50503 SET NAMES utf8mb4 */; +/*!40103 SET @OLD_TIME_ZONE=@@TIME_ZONE */; +/*!40103 SET TIME_ZONE='+00:00' */; +/*!40014 SET @OLD_UNIQUE_CHECKS=@@UNIQUE_CHECKS, UNIQUE_CHECKS=0 */; +/*!40014 SET @OLD_FOREIGN_KEY_CHECKS=@@FOREIGN_KEY_CHECKS, FOREIGN_KEY_CHECKS=0 */; +/*!40101 SET @OLD_SQL_MODE=@@SQL_MODE, SQL_MODE='NO_AUTO_VALUE_ON_ZERO' */; +/*!40111 SET @OLD_SQL_NOTES=@@SQL_NOTES, SQL_NOTES=0 */; +/*!50717 SELECT COUNT(*) INTO @rocksdb_has_p_s_session_variables FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_SCHEMA = 'performance_schema' AND TABLE_NAME = 'session_variables' */; +/*!50717 SET @rocksdb_get_is_supported = IF (@rocksdb_has_p_s_session_variables, 'SELECT COUNT(*) INTO @rocksdb_is_supported FROM performance_schema.session_variables WHERE VARIABLE_NAME=\'rocksdb_bulk_load\'', 'SELECT 0') */; +/*!50717 PREPARE s FROM @rocksdb_get_is_supported */; +/*!50717 EXECUTE s */; +/*!50717 DEALLOCATE PREPARE s */; +/*!50717 SET @rocksdb_enable_bulk_load = IF (@rocksdb_is_supported, 'SET SESSION rocksdb_bulk_load = 1', 'SET @rocksdb_dummy_bulk_load = 0') */; +/*!50717 PREPARE s FROM @rocksdb_enable_bulk_load */; +/*!50717 EXECUTE s */; +/*!50717 DEALLOCATE PREPARE s */; + +-- +-- Table structure for table `CarRegistration` +-- + +DROP TABLE IF EXISTS `CarRegistration`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!50503 SET character_set_client = utf8mb4 */; +CREATE TABLE `CarRegistration` ( + `id` int NOT NULL AUTO_INCREMENT, + `driverID` varchar(100) CHARACTER SET utf8mb3 COLLATE utf8mb3_general_ci NOT NULL, + `vin` varchar(100) CHARACTER SET utf8mb3 COLLATE utf8mb3_general_ci NOT NULL, + `car_plate` varchar(150) CHARACTER SET utf8mb3 COLLATE utf8mb3_general_ci DEFAULT NULL, + `make` varchar(255) CHARACTER SET utf8mb3 COLLATE utf8mb3_general_ci NOT NULL, + `model` varchar(255) CHARACTER SET utf8mb3 COLLATE utf8mb3_general_ci NOT NULL, + `year` varchar(10) CHARACTER SET utf32 COLLATE utf32_general_ci NOT NULL, + `expiration_date` varchar(30) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL, + `color` varchar(255) CHARACTER SET utf8mb3 COLLATE utf8mb3_general_ci NOT NULL, + `owner` varchar(255) CHARACTER SET utf8mb3 COLLATE utf8mb3_general_ci NOT NULL, + `color_hex` varchar(20) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL, + `fuel` varchar(100) CHARACTER SET utf8mb3 COLLATE utf8mb3_general_ci NOT NULL, + `isDefault` tinyint(1) NOT NULL DEFAULT '0', + `created_at` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP, + `status` varchar(20) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL DEFAULT 'yet', + PRIMARY KEY (`id`), + UNIQUE KEY `car_plate` (`car_plate`), + KEY `idx_driverID` (`driverID`) +) ENGINE=InnoDB AUTO_INCREMENT=14 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci; +/*!40101 SET character_set_client = @saved_cs_client */; + +-- +-- Table structure for table `adminUser` +-- + +DROP TABLE IF EXISTS `adminUser`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!50503 SET character_set_client = utf8mb4 */; +CREATE TABLE `adminUser` ( + `id` int NOT NULL AUTO_INCREMENT, + `device_number` varchar(300) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL, + `name` varchar(150) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL, + `created_at` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP, + `updated_at` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP, + PRIMARY KEY (`id`) +) ENGINE=InnoDB AUTO_INCREMENT=3 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci; +/*!40101 SET character_set_client = @saved_cs_client */; + +-- +-- Table structure for table `api_keys` +-- + +DROP TABLE IF EXISTS `api_keys`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!50503 SET character_set_client = utf8mb4 */; +CREATE TABLE `api_keys` ( + `id` int NOT NULL AUTO_INCREMENT, + `name` varchar(20) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL, + `hashed_key` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL, + PRIMARY KEY (`id`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci; +/*!40101 SET character_set_client = @saved_cs_client */; + +-- +-- Table structure for table `blacklist_driver` +-- + +DROP TABLE IF EXISTS `blacklist_driver`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!50503 SET character_set_client = utf8mb4 */; +CREATE TABLE `blacklist_driver` ( + `id` int NOT NULL AUTO_INCREMENT, + `driver_id` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL, + `phone` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL, + `reason` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT 'Violation', + `created_at` timestamp NULL DEFAULT CURRENT_TIMESTAMP, + PRIMARY KEY (`id`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci; +/*!40101 SET character_set_client = @saved_cs_client */; + +-- +-- Table structure for table `canecl` +-- + +DROP TABLE IF EXISTS `canecl`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!50503 SET character_set_client = utf8mb4 */; +CREATE TABLE `canecl` ( + `id` int NOT NULL AUTO_INCREMENT, + `driverID` varchar(111) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL, + `passengerID` varchar(111) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL, + `rideID` varchar(111) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL, + `note` varchar(200) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL DEFAULT 'nothing', + `created_at` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP, + PRIMARY KEY (`id`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci; +/*!40101 SET character_set_client = @saved_cs_client */; + +-- +-- Table structure for table `captains_car` +-- + +DROP TABLE IF EXISTS `captains_car`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!50503 SET character_set_client = utf8mb4 */; +CREATE TABLE `captains_car` ( + `id` int NOT NULL AUTO_INCREMENT, + `driverID` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL, + `vin` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL, + `car_plate` varchar(20) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL, + `make` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL, + `model` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL, + `year` varchar(6) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL, + `expiration_date` varchar(20) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL, + `color` varchar(30) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL, + `owner` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL, + `color_hex` char(15) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL, + `address` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL, + `displacement` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL, + `fuel` varchar(20) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL, + `registration_date` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL, + `isDefault` tinyint(1) NOT NULL DEFAULT '0', + `created_at` timestamp NULL DEFAULT CURRENT_TIMESTAMP, + PRIMARY KEY (`id`), + UNIQUE KEY `car_plate` (`car_plate`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci; +/*!40101 SET character_set_client = @saved_cs_client */; + +-- +-- Table structure for table `carPlateEdit` +-- + +DROP TABLE IF EXISTS `carPlateEdit`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!50503 SET character_set_client = utf8mb4 */; +CREATE TABLE `carPlateEdit` ( + `id` int NOT NULL AUTO_INCREMENT, + `driverId` varchar(50) NOT NULL, + `carPlate` varchar(155) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL, + `color` varchar(20) NOT NULL, + `make` varchar(50) NOT NULL, + `model` varchar(20) NOT NULL, + `expiration_date` varchar(50) NOT NULL, + `owner` varchar(155) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL, + `year` int NOT NULL, + `isEdit` tinyint(1) NOT NULL DEFAULT '0', + `employee` varchar(30) NOT NULL DEFAULT 'any', + `createdAt` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP, + PRIMARY KEY (`id`), + UNIQUE KEY `driverId` (`driverId`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci; +/*!40101 SET character_set_client = @saved_cs_client */; + +-- +-- Table structure for table `car_locations` +-- + +DROP TABLE IF EXISTS `car_locations`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!50503 SET character_set_client = utf8mb4 */; +CREATE TABLE `car_locations` ( + `driver_id` varchar(100) NOT NULL, + `latitude` decimal(10,7) NOT NULL, + `longitude` decimal(10,7) NOT NULL, + `heading` decimal(10,2) NOT NULL, + `speed` double(10,3) NOT NULL, + `distance` decimal(10,2) NOT NULL, + `status` varchar(6) NOT NULL DEFAULT 'off', + `carType` varchar(100) NOT NULL DEFAULT 'Awfar', + `created_at` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP, + `updated_at` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, + `location_point` point NOT NULL /*!80003 SRID 4326 */, + PRIMARY KEY (`driver_id`), + KEY `idx_loc_status_time` (`status`,`updated_at`,`latitude`,`longitude`), + SPATIAL KEY `idx_location_point` (`location_point`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb3; +/*!40101 SET character_set_client = @saved_cs_client */; +/*!50003 SET @saved_cs_client = @@character_set_client */ ; +/*!50003 SET @saved_cs_results = @@character_set_results */ ; +/*!50003 SET @saved_col_connection = @@collation_connection */ ; +/*!50003 SET character_set_client = utf8mb4 */ ; +/*!50003 SET character_set_results = utf8mb4 */ ; +/*!50003 SET collation_connection = utf8mb4_0900_ai_ci */ ; +/*!50003 SET @saved_sql_mode = @@sql_mode */ ; +/*!50003 SET sql_mode = 'NO_AUTO_VALUE_ON_ZERO' */ ; +DELIMITER ;; +/*!50003 CREATE*/ /*!50017 DEFINER=`intaleqLocation`@`%`*/ /*!50003 TRIGGER `trg_before_insert_car_locations` BEFORE INSERT ON `car_locations` FOR EACH ROW BEGIN +SET NEW.location_point = ST_PointFromText(CONCAT('POINT(', NEW.longitude, ' ', NEW.latitude, ')'), 4326); +END */;; +DELIMITER ; +/*!50003 SET sql_mode = @saved_sql_mode */ ; +/*!50003 SET character_set_client = @saved_cs_client */ ; +/*!50003 SET character_set_results = @saved_cs_results */ ; +/*!50003 SET collation_connection = @saved_col_connection */ ; +/*!50003 SET @saved_cs_client = @@character_set_client */ ; +/*!50003 SET @saved_cs_results = @@character_set_results */ ; +/*!50003 SET @saved_col_connection = @@collation_connection */ ; +/*!50003 SET character_set_client = utf8mb4 */ ; +/*!50003 SET character_set_results = utf8mb4 */ ; +/*!50003 SET collation_connection = utf8mb4_0900_ai_ci */ ; +/*!50003 SET @saved_sql_mode = @@sql_mode */ ; +/*!50003 SET sql_mode = 'NO_AUTO_VALUE_ON_ZERO' */ ; +DELIMITER ;; +/*!50003 CREATE*/ /*!50017 DEFINER=`intaleqLocation`@`%`*/ /*!50003 TRIGGER `trg_before_update_car_locations` BEFORE UPDATE ON `car_locations` FOR EACH ROW BEGIN +IF NEW.latitude <> OLD.latitude OR NEW.longitude <> OLD.longitude THEN +SET NEW.location_point = ST_PointFromText(CONCAT('POINT(', NEW.longitude, ' ', NEW.latitude, ')'), 4326); +END IF; +END */;; +DELIMITER ; +/*!50003 SET sql_mode = @saved_sql_mode */ ; +/*!50003 SET character_set_client = @saved_cs_client */ ; +/*!50003 SET character_set_results = @saved_cs_results */ ; +/*!50003 SET collation_connection = @saved_col_connection */ ; + +-- +-- Table structure for table `car_tracks` +-- + +DROP TABLE IF EXISTS `car_tracks`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!50503 SET character_set_client = utf8mb4 */; +CREATE TABLE `car_tracks` ( + `id` int NOT NULL AUTO_INCREMENT, + `driver_id` varchar(100) NOT NULL, + `latitude` decimal(10,7) NOT NULL, + `longitude` decimal(10,7) NOT NULL, + `heading` float DEFAULT NULL, + `speed` float DEFAULT NULL, + `distance` float DEFAULT NULL, + `status` enum('on','off') DEFAULT 'off', + `created_at` timestamp NULL DEFAULT CURRENT_TIMESTAMP, + PRIMARY KEY (`id`), + KEY `idx_driver_time` (`driver_id`,`created_at`) +) ENGINE=InnoDB AUTO_INCREMENT=2559370 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci; +/*!40101 SET character_set_client = @saved_cs_client */; + +-- +-- Table structure for table `card_images` +-- + +DROP TABLE IF EXISTS `card_images`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!50503 SET character_set_client = utf8mb4 */; +CREATE TABLE `card_images` ( + `id` int NOT NULL AUTO_INCREMENT, + `driverID` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL, + `image_name` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL, + `upload_date` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP, + `link` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL, + PRIMARY KEY (`id`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci; +/*!40101 SET character_set_client = @saved_cs_client */; + +-- +-- Table structure for table `carsToWork` +-- + +DROP TABLE IF EXISTS `carsToWork`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!50503 SET character_set_client = utf8mb4 */; +CREATE TABLE `carsToWork` ( + `id` int NOT NULL AUTO_INCREMENT, + `owner_name` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL, + `phone` varchar(15) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL, + `car_number` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL, + `manufacture_year` year NOT NULL, + `car_model` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL, + `car_type` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL, + `site` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL, + `registration_date` date NOT NULL, + `created_at` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP, + PRIMARY KEY (`id`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci; +/*!40101 SET character_set_client = @saved_cs_client */; + +-- +-- Table structure for table `complaint` +-- + +DROP TABLE IF EXISTS `complaint`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!50503 SET character_set_client = utf8mb4 */; +CREATE TABLE `complaint` ( + `id` int NOT NULL AUTO_INCREMENT, + `ride_id` varchar(255) NOT NULL, + `passenger_id` varchar(255) DEFAULT NULL, + `driver_id` varchar(255) DEFAULT NULL, + `complaint_type` enum('Driver','Passenger','Both') NOT NULL, + `description` text, + `date_filed` timestamp NULL DEFAULT CURRENT_TIMESTAMP, + `statusComplaint` enum('Open','In Progress','Resolved') NOT NULL DEFAULT 'Open', + `resolution` text, + `passenger_report` text, + `driver_report` text, + `cs_solutions` text, + `fault_determination` varchar(255) DEFAULT NULL, + `complaint_nature` varchar(255) DEFAULT NULL, + `date_resolved` timestamp NULL DEFAULT NULL, + PRIMARY KEY (`id`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci; +/*!40101 SET character_set_client = @saved_cs_client */; + +-- +-- Table structure for table `contactEgypt` +-- + +DROP TABLE IF EXISTS `contactEgypt`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!50503 SET character_set_client = utf8mb4 */; +CREATE TABLE `contactEgypt` ( + `id` int NOT NULL AUTO_INCREMENT, + `phones` varchar(20) NOT NULL, + `name` varchar(100) NOT NULL, + `phones2` varchar(60) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL, + `createdAt` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP, + PRIMARY KEY (`id`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci; +/*!40101 SET character_set_client = @saved_cs_client */; + +-- +-- Table structure for table `contactSyria` +-- + +DROP TABLE IF EXISTS `contactSyria`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!50503 SET character_set_client = utf8mb4 */; +CREATE TABLE `contactSyria` ( + `id` int NOT NULL AUTO_INCREMENT, + `driverId` varchar(255) NOT NULL COMMENT 'معرّف السائق الذي قام بمزامنة جهة الاتصال', + `name` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci DEFAULT NULL COMMENT 'اسم جهة الاتصال', + `phone` varchar(50) NOT NULL COMMENT 'رقم هاتف جهة الاتصال', + `sync_timestamp` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT 'وقت المزامنة', + PRIMARY KEY (`id`), + UNIQUE KEY `driver_contact_unique` (`driverId`,`phone`) +) ENGINE=InnoDB AUTO_INCREMENT=10 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci; +/*!40101 SET character_set_client = @saved_cs_client */; + +-- +-- Table structure for table `criminalDocuments` +-- + +DROP TABLE IF EXISTS `criminalDocuments`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!50503 SET character_set_client = utf8mb4 */; +CREATE TABLE `criminalDocuments` ( + `id` int NOT NULL AUTO_INCREMENT, + `driverId` varchar(50) NOT NULL, + `IssueDate` varchar(20) NOT NULL, + `createdAt` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP, + `InspectionResult` varchar(100) NOT NULL, + PRIMARY KEY (`id`), + UNIQUE KEY `driverId` (`driverId`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci; +/*!40101 SET character_set_client = @saved_cs_client */; + +-- +-- Table structure for table `driver` +-- + +DROP TABLE IF EXISTS `driver`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!50503 SET character_set_client = utf8mb4 */; +CREATE TABLE `driver` ( + `idn` int NOT NULL AUTO_INCREMENT, + `id` varchar(100) NOT NULL, + `phone` varchar(255) CHARACTER SET utf8mb3 COLLATE utf8mb3_general_ci NOT NULL, + `email` varchar(255) NOT NULL, + `password` varchar(255) NOT NULL, + `gender` varchar(255) CHARACTER SET utf8mb3 COLLATE utf8mb3_general_ci NOT NULL DEFAULT 'Male', + `license_type` varchar(255) DEFAULT NULL, + `national_number` varchar(255) DEFAULT NULL, + `name_arabic` varchar(255) DEFAULT NULL, + `issue_date` date DEFAULT NULL, + `expiry_date` date DEFAULT NULL, + `license_categories` varchar(255) DEFAULT NULL, + `address` text, + `licenseIssueDate` varchar(50) DEFAULT NULL, + `status` varchar(20) NOT NULL DEFAULT 'notDeleted', + `birthdate` varchar(255) CHARACTER SET utf8mb3 COLLATE utf8mb3_general_ci NOT NULL, + `site` varchar(255) NOT NULL, + `first_name` varchar(255) NOT NULL, + `last_name` varchar(255) NOT NULL, + `accountBank` varchar(255) CHARACTER SET utf8mb3 COLLATE utf8mb3_general_ci NOT NULL DEFAULT 'yet', + `bankCode` varchar(255) CHARACTER SET utf8mb3 COLLATE utf8mb3_general_ci NOT NULL DEFAULT 'CIB', + `employmentType` varchar(255) CHARACTER SET utf8mb3 COLLATE utf8mb3_general_ci DEFAULT NULL, + `maritalStatus` varchar(50) CHARACTER SET utf8mb3 COLLATE utf8mb3_general_ci DEFAULT NULL, + `fullNameMaritial` varchar(255) DEFAULT NULL, + `expirationDate` varchar(50) CHARACTER SET utf8mb3 COLLATE utf8mb3_general_ci DEFAULT NULL, + `created_at` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP, + `updated_at` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, + PRIMARY KEY (`idn`) +) ENGINE=InnoDB AUTO_INCREMENT=12 DEFAULT CHARSET=utf8mb3; +/*!40101 SET character_set_client = @saved_cs_client */; + +-- +-- Table structure for table `driverToken` +-- + +DROP TABLE IF EXISTS `driverToken`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!50503 SET character_set_client = utf8mb4 */; +CREATE TABLE `driverToken` ( + `id` int NOT NULL AUTO_INCREMENT, + `token` varchar(300) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL, + `captain_id` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL, + `fingerPrint` varchar(155) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL, + `created_at` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP, + PRIMARY KEY (`id`), + KEY `idx_captain_id` (`captain_id`) +) ENGINE=InnoDB AUTO_INCREMENT=9 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci; +/*!40101 SET character_set_client = @saved_cs_client */; + +-- +-- Table structure for table `driverWallet` +-- + +DROP TABLE IF EXISTS `driverWallet`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!50503 SET character_set_client = utf8mb4 */; +CREATE TABLE `driverWallet` ( + `id` int NOT NULL AUTO_INCREMENT, + `driverID` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL, + `paymentID` varchar(200) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL, + `dateCreated` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP, + `amount` varchar(5) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL, + `paymentMethod` varchar(20) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL, + `dateUpdated` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP, + PRIMARY KEY (`id`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci; +/*!40101 SET character_set_client = @saved_cs_client */; + +-- +-- Table structure for table `driver_behavior` +-- + +DROP TABLE IF EXISTS `driver_behavior`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!50503 SET character_set_client = utf8mb4 */; +CREATE TABLE `driver_behavior` ( + `id` int NOT NULL AUTO_INCREMENT, + `driver_id` varchar(255) NOT NULL, + `trip_id` varchar(255) NOT NULL, + `max_speed` double DEFAULT '0', + `avg_speed` double DEFAULT '0', + `hard_brakes` int DEFAULT '0', + `total_distance` double DEFAULT '0', + `behavior_score` double DEFAULT '0', + `created_at` timestamp NULL DEFAULT CURRENT_TIMESTAMP, + PRIMARY KEY (`id`) +) ENGINE=InnoDB AUTO_INCREMENT=22 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci; +/*!40101 SET character_set_client = @saved_cs_client */; + +-- +-- Table structure for table `driver_daily_summary` +-- + +DROP TABLE IF EXISTS `driver_daily_summary`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!50503 SET character_set_client = utf8mb4 */; +CREATE TABLE `driver_daily_summary` ( + `id` int NOT NULL AUTO_INCREMENT, + `driver_id` varchar(33) CHARACTER SET utf8mb3 COLLATE utf8mb3_general_ci NOT NULL, + `date` date NOT NULL, + `total_seconds` int DEFAULT '0', + `last_updated_at` timestamp NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, + PRIMARY KEY (`id`), + UNIQUE KEY `unique_driver_date` (`driver_id`,`date`) +) ENGINE=InnoDB AUTO_INCREMENT=308443 DEFAULT CHARSET=utf8mb3; +/*!40101 SET character_set_client = @saved_cs_client */; + +-- +-- Table structure for table `driver_daily_work` +-- + +DROP TABLE IF EXISTS `driver_daily_work`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!50503 SET character_set_client = utf8mb4 */; +CREATE TABLE `driver_daily_work` ( + `driver_id` int NOT NULL, + `work_date` date NOT NULL, + `total_seconds` int NOT NULL DEFAULT '0', + `last_point_at` datetime DEFAULT NULL, + `last_status` enum('on','off') CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT 'off', + `updated_at` datetime NOT NULL, + PRIMARY KEY (`driver_id`,`work_date`), + KEY `idx_driver_date` (`driver_id`,`work_date`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci; +/*!40101 SET character_set_client = @saved_cs_client */; + +-- +-- Table structure for table `driver_documents` +-- + +DROP TABLE IF EXISTS `driver_documents`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!50503 SET character_set_client = utf8mb4 */; +CREATE TABLE `driver_documents` ( + `id` int NOT NULL AUTO_INCREMENT, + `driverID` varchar(64) NOT NULL, + `doc_type` varchar(64) NOT NULL, + `image_name` varchar(255) NOT NULL, + `link` varchar(512) NOT NULL, + `upload_date` datetime NOT NULL, + PRIMARY KEY (`id`), + KEY `driverID` (`driverID`) +) ENGINE=InnoDB AUTO_INCREMENT=33 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci; +/*!40101 SET character_set_client = @saved_cs_client */; + +-- +-- Table structure for table `driver_gifts` +-- + +DROP TABLE IF EXISTS `driver_gifts`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!50503 SET character_set_client = utf8mb4 */; +CREATE TABLE `driver_gifts` ( + `id` int NOT NULL AUTO_INCREMENT, + `driver_id` varchar(70) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL, + `gift_description` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL, + `gift_date` datetime DEFAULT CURRENT_TIMESTAMP, + `is_claimed` tinyint(1) DEFAULT '0', + PRIMARY KEY (`id`), + UNIQUE KEY `driver_id` (`driver_id`) +) ENGINE=InnoDB AUTO_INCREMENT=10 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci; +/*!40101 SET character_set_client = @saved_cs_client */; + +-- +-- Table structure for table `driver_health_assurance` +-- + +DROP TABLE IF EXISTS `driver_health_assurance`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!50503 SET character_set_client = utf8mb4 */; +CREATE TABLE `driver_health_assurance` ( + `id` int NOT NULL AUTO_INCREMENT, + `driver_id` varchar(155) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL, + `assured` tinyint(1) DEFAULT '0', + `date_created` timestamp NULL DEFAULT CURRENT_TIMESTAMP, + `health_insurance_provider` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL, + PRIMARY KEY (`id`), + UNIQUE KEY `driver_id` (`driver_id`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci; +/*!40101 SET character_set_client = @saved_cs_client */; + +-- +-- Table structure for table `driver_orders` +-- + +DROP TABLE IF EXISTS `driver_orders`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!50503 SET character_set_client = utf8mb4 */; +CREATE TABLE `driver_orders` ( + `id` int NOT NULL AUTO_INCREMENT, + `driver_id` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL, + `order_id` varchar(99) CHARACTER SET utf8mb3 COLLATE utf8mb3_general_ci NOT NULL, + `notes` varchar(200) CHARACTER SET utf8mb3 COLLATE utf8mb3_general_ci NOT NULL DEFAULT 'nothing', + `created_at` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP, + `status` varchar(30) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT 'applied', + PRIMARY KEY (`id`) +) ENGINE=InnoDB AUTO_INCREMENT=44 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci; +/*!40101 SET character_set_client = @saved_cs_client */; + +-- +-- Table structure for table `driver_ride_scam` +-- + +DROP TABLE IF EXISTS `driver_ride_scam`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!50503 SET character_set_client = utf8mb4 */; +CREATE TABLE `driver_ride_scam` ( + `id` int NOT NULL AUTO_INCREMENT, + `driverID` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL, + `passendgerID` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL, + `rideID` varchar(20) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL, + `isDriverCallPassenger` varchar(10) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL, + `dateCreated` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP, + PRIMARY KEY (`id`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci; +/*!40101 SET character_set_client = @saved_cs_client */; + +-- +-- Table structure for table `driversWantWork` +-- + +DROP TABLE IF EXISTS `driversWantWork`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!50503 SET character_set_client = utf8mb4 */; +CREATE TABLE `driversWantWork` ( + `id` int NOT NULL AUTO_INCREMENT, + `driver_name` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL, + `phone` varchar(15) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL, + `national_id` varchar(20) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL, + `birth_date` varchar(15) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL, + `license_type` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL, + `site` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL, + `created_at` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP, + PRIMARY KEY (`id`), + UNIQUE KEY `national_id` (`national_id`), + UNIQUE KEY `phone` (`phone`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci; +/*!40101 SET character_set_client = @saved_cs_client */; + +-- +-- Table structure for table `email_verifications` +-- + +DROP TABLE IF EXISTS `email_verifications`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!50503 SET character_set_client = utf8mb4 */; +CREATE TABLE `email_verifications` ( + `id` int NOT NULL AUTO_INCREMENT, + `email` varchar(255) NOT NULL, + `token` varchar(255) NOT NULL, + `created_at` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP, + `updated_at` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP, + `verified` tinyint(1) NOT NULL DEFAULT '0', + PRIMARY KEY (`id`), + UNIQUE KEY `email` (`email`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci; +/*!40101 SET character_set_client = @saved_cs_client */; + +-- +-- Table structure for table `employee` +-- + +DROP TABLE IF EXISTS `employee`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!50503 SET character_set_client = utf8mb4 */; +CREATE TABLE `employee` ( + `id` varchar(20) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL, + `name` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL, + `education` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL, + `site` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL, + `phone` varchar(20) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL, + `created_at` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP, + `status` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL, + PRIMARY KEY (`id`), + UNIQUE KEY `phone` (`phone`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci; +/*!40101 SET character_set_client = @saved_cs_client */; + +-- +-- Table structure for table `error` +-- + +DROP TABLE IF EXISTS `error`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!50503 SET character_set_client = utf8mb4 */; +CREATE TABLE `error` ( + `id` int NOT NULL AUTO_INCREMENT, + `error` varchar(400) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL, + `userId` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL, + `userType` varchar(30) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL, + `phone` varchar(20) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL, + `created_at` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP, + `device` varchar(300) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL, + `details` text CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci, + `status` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL DEFAULT 'new', + PRIMARY KEY (`id`), + KEY `idx_error_created_at` (`created_at`), + KEY `idx_error_phone` (`phone`) +) ENGINE=InnoDB AUTO_INCREMENT=14316 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci; +/*!40101 SET character_set_client = @saved_cs_client */; + +-- +-- Table structure for table `feedBack` +-- + +DROP TABLE IF EXISTS `feedBack`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!50503 SET character_set_client = utf8mb4 */; +CREATE TABLE `feedBack` ( + `id` int NOT NULL AUTO_INCREMENT, + `passengerId` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL, + `feedBack` text CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL, + `datecreated` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP, + PRIMARY KEY (`id`) +) ENGINE=InnoDB AUTO_INCREMENT=3 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci; +/*!40101 SET character_set_client = @saved_cs_client */; + +-- +-- Table structure for table `helpCenter` +-- + +DROP TABLE IF EXISTS `helpCenter`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!50503 SET character_set_client = utf8mb4 */; +CREATE TABLE `helpCenter` ( + `id` int NOT NULL AUTO_INCREMENT, + `driverID` varchar(89) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL, + `helpQuestion` varchar(300) CHARACTER SET utf8mb3 COLLATE utf8mb3_general_ci NOT NULL, + `replay` varchar(400) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL DEFAULT 'not yet', + `datecreated` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP, + PRIMARY KEY (`id`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci; +/*!40101 SET character_set_client = @saved_cs_client */; + +-- +-- Table structure for table `hotels` +-- + +DROP TABLE IF EXISTS `hotels`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!50503 SET character_set_client = utf8mb4 */; +CREATE TABLE `hotels` ( + `id` int NOT NULL, + `nameEnglish` varchar(255) DEFAULT NULL, + `nameArabic` varchar(255) DEFAULT NULL, + `phone` varchar(20) DEFAULT NULL, + `countReview` int DEFAULT NULL, + `rate` float DEFAULT NULL, + `stars` varchar(50) DEFAULT NULL, + `address` text, + `website` varchar(255) DEFAULT NULL, + `email` varchar(255) DEFAULT NULL, + `PlusCode` varchar(50) DEFAULT NULL, + `closeTime` varchar(50) DEFAULT NULL, + `latitude` decimal(10,6) DEFAULT NULL, + `longitude` decimal(10,6) DEFAULT NULL, + `instagram` varchar(255) DEFAULT NULL, + `facebook` varchar(255) DEFAULT NULL, + `linkedin` varchar(255) DEFAULT NULL, + `twitter` varchar(255) DEFAULT NULL, + `photo` varchar(255) DEFAULT NULL +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci; +/*!40101 SET character_set_client = @saved_cs_client */; + +-- +-- Table structure for table `imageProfileCaptain` +-- + +DROP TABLE IF EXISTS `imageProfileCaptain`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!50503 SET character_set_client = utf8mb4 */; +CREATE TABLE `imageProfileCaptain` ( + `id` int NOT NULL AUTO_INCREMENT, + `driverID` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL, + `image_name` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL, + `upload_date` datetime DEFAULT CURRENT_TIMESTAMP, + `link` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL, + PRIMARY KEY (`id`) +) ENGINE=InnoDB AUTO_INCREMENT=4 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci; +/*!40101 SET character_set_client = @saved_cs_client */; + +-- +-- Table structure for table `invites` +-- + +DROP TABLE IF EXISTS `invites`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!50503 SET character_set_client = utf8mb4 */; +CREATE TABLE `invites` ( + `id` int NOT NULL AUTO_INCREMENT, + `driverId` varchar(50) NOT NULL, + `inviterDriverPhone` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL, + `createdAt` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP, + `inviteCode` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL, + `isInstall` tinyint(1) NOT NULL DEFAULT '0', + `isGiftToken` tinyint(1) NOT NULL DEFAULT '0', + `expirationTime` datetime NOT NULL, + PRIMARY KEY (`id`), + UNIQUE KEY `inviterDriverId` (`inviterDriverPhone`), + UNIQUE KEY `inviteCode` (`inviteCode`) +) ENGINE=InnoDB AUTO_INCREMENT=5 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci; +/*!40101 SET character_set_client = @saved_cs_client */; + +-- +-- Table structure for table `invitesToPassengers` +-- + +DROP TABLE IF EXISTS `invitesToPassengers`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!50503 SET character_set_client = utf8mb4 */; +CREATE TABLE `invitesToPassengers` ( + `id` int NOT NULL AUTO_INCREMENT, + `driverId` varchar(70) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL, + `passengerID` varchar(80) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL DEFAULT 'yet', + `inviterPassengerPhone` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL, + `inviteCode` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL, + `expirationTime` datetime NOT NULL, + `createdAt` datetime DEFAULT CURRENT_TIMESTAMP, + `isInstall` tinyint(1) DEFAULT '0', + `isGiftToken` tinyint(1) NOT NULL DEFAULT '0', + PRIMARY KEY (`id`), + UNIQUE KEY `inviteCode` (`inviteCode`) +) ENGINE=InnoDB AUTO_INCREMENT=11 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci; +/*!40101 SET character_set_client = @saved_cs_client */; + +-- +-- Table structure for table `invoice_records` +-- + +DROP TABLE IF EXISTS `invoice_records`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!50503 SET character_set_client = utf8mb4 */; +CREATE TABLE `invoice_records` ( + `id` int NOT NULL AUTO_INCREMENT, + `driverID` int NOT NULL, + `invoice_number` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL, + `name` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL, + `amount` decimal(10,2) DEFAULT NULL, + `date` date DEFAULT NULL, + `image_link` text CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci, + `created_at` datetime DEFAULT NULL, + PRIMARY KEY (`id`) +) ENGINE=InnoDB AUTO_INCREMENT=36 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci; +/*!40101 SET character_set_client = @saved_cs_client */; + +-- +-- Table structure for table `invoicesAdmin` +-- + +DROP TABLE IF EXISTS `invoicesAdmin`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!50503 SET character_set_client = utf8mb4 */; +CREATE TABLE `invoicesAdmin` ( + `id` int NOT NULL AUTO_INCREMENT, + `item_name` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL, + `amount` decimal(10,2) NOT NULL, + `image_url` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL, + `created_at` timestamp NULL DEFAULT CURRENT_TIMESTAMP, + PRIMARY KEY (`id`) +) ENGINE=InnoDB AUTO_INCREMENT=22 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci; +/*!40101 SET character_set_client = @saved_cs_client */; + +-- +-- Table structure for table `kazan` +-- + +DROP TABLE IF EXISTS `kazan`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!50503 SET character_set_client = utf8mb4 */; +CREATE TABLE `kazan` ( + `id` int NOT NULL AUTO_INCREMENT, + `country` varchar(30) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL, + `kazan` varchar(10) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL, + `comfortPrice` varchar(10) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL, + `speedPrice` varchar(10) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL, + `familyPrice` varchar(4) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL, + `deliveryPrice` varchar(11) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL, + `freePrice` varchar(11) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL, + `latePrice` varchar(10) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL, + `heavyPrice` varchar(10) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL, + `adminId` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL, + `createdAt` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP, + `naturePrice` varchar(10) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL, + `fuelPrice` varchar(6) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL, + PRIMARY KEY (`id`) +) ENGINE=InnoDB AUTO_INCREMENT=2 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci; +/*!40101 SET character_set_client = @saved_cs_client */; + +-- +-- Table structure for table `lisenceDetails` +-- + +DROP TABLE IF EXISTS `lisenceDetails`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!50503 SET character_set_client = utf8mb4 */; +CREATE TABLE `lisenceDetails` ( + `id` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL, + `driverID` text CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL, + `name` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci DEFAULT NULL, + `licenseClass` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci DEFAULT NULL, + `documentNo` varchar(30) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci DEFAULT NULL, + `address` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci DEFAULT NULL, + `height` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci DEFAULT NULL, + `postalCode` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci DEFAULT NULL, + `sex` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci DEFAULT NULL, + `stateCode` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci DEFAULT NULL, + `expireDate` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci DEFAULT NULL, + `dateOfBirth` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci DEFAULT NULL, + `dateCreated` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP, + PRIMARY KEY (`id`), + UNIQUE KEY `documentNo` (`documentNo`) +) ENGINE=MyISAM DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci; +/*!40101 SET character_set_client = @saved_cs_client */; + +-- +-- Table structure for table `login_attempts` +-- + +DROP TABLE IF EXISTS `login_attempts`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!50503 SET character_set_client = utf8mb4 */; +CREATE TABLE `login_attempts` ( + `id` int NOT NULL AUTO_INCREMENT, + `ip_address` varchar(45) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL, + `attempt_time` timestamp NULL DEFAULT CURRENT_TIMESTAMP, + PRIMARY KEY (`id`) +) ENGINE=InnoDB AUTO_INCREMENT=18 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci; +/*!40101 SET character_set_client = @saved_cs_client */; + +-- +-- Table structure for table `login_attempts_drivers` +-- + +DROP TABLE IF EXISTS `login_attempts_drivers`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!50503 SET character_set_client = utf8mb4 */; +CREATE TABLE `login_attempts_drivers` ( + `id` int NOT NULL AUTO_INCREMENT, + `ip_address` varchar(45) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL, + `attempt_time` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP, + PRIMARY KEY (`id`) +) ENGINE=InnoDB AUTO_INCREMENT=11 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci; +/*!40101 SET character_set_client = @saved_cs_client */; + +-- +-- Table structure for table `mishwaritrips` +-- + +DROP TABLE IF EXISTS `mishwaritrips`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!50503 SET character_set_client = utf8mb4 */; +CREATE TABLE `mishwaritrips` ( + `id` int NOT NULL AUTO_INCREMENT, + `driverId` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL, + `phone` varchar(15) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL, + `gender` varchar(20) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL, + `name` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL, + `name_english` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL, + `address` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL, + `religion` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL, + `age` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL, + `startNameAddress` varchar(150) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL DEFAULT 'none', + `locationCoordinate` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL DEFAULT 'none', + `education` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL, + `license_type` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL, + `national_number` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL, + `car_plate` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL, + `make` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL, + `model` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL, + `color` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL, + `color_hex` char(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL, + `token` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL, + `rating` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL, + `countRide` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL, + `passengerId` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL, + `timeSelected` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL, + `createdAt` timestamp NULL DEFAULT CURRENT_TIMESTAMP, + `status` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT 'pending', + PRIMARY KEY (`id`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci; +/*!40101 SET character_set_client = @saved_cs_client */; + +-- +-- Table structure for table `notesForDriverService` +-- + +DROP TABLE IF EXISTS `notesForDriverService`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!50503 SET character_set_client = utf8mb4 */; +CREATE TABLE `notesForDriverService` ( + `id` int NOT NULL AUTO_INCREMENT, + `phone` varchar(70) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL, + `note` varchar(250) NOT NULL, + `editor` varchar(50) NOT NULL, + `createdAt` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP, + PRIMARY KEY (`id`), + UNIQUE KEY `phone` (`phone`) +) ENGINE=InnoDB AUTO_INCREMENT=5 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci; +/*!40101 SET character_set_client = @saved_cs_client */; + +-- +-- Table structure for table `notesForPassengerService` +-- + +DROP TABLE IF EXISTS `notesForPassengerService`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!50503 SET character_set_client = utf8mb4 */; +CREATE TABLE `notesForPassengerService` ( + `id` int NOT NULL AUTO_INCREMENT, + `phone` int NOT NULL, + `note` varchar(250) NOT NULL, + `editor` varchar(50) NOT NULL, + `createdAt` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP, + PRIMARY KEY (`id`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci; +/*!40101 SET character_set_client = @saved_cs_client */; + +-- +-- Table structure for table `notificationCaptain` +-- + +DROP TABLE IF EXISTS `notificationCaptain`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!50503 SET character_set_client = utf8mb4 */; +CREATE TABLE `notificationCaptain` ( + `id` int NOT NULL AUTO_INCREMENT, + `driverID` varchar(80) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL, + `title` varchar(100) CHARACTER SET utf8mb3 COLLATE utf8mb3_general_ci NOT NULL, + `body` varchar(200) CHARACTER SET utf8mb3 COLLATE utf8mb3_general_ci NOT NULL, + `isShown` varchar(6) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL DEFAULT 'false', + `isPin` varchar(10) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL DEFAULT 'unPin', + `dateCreated` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP, + PRIMARY KEY (`id`) +) ENGINE=InnoDB AUTO_INCREMENT=6 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci; +/*!40101 SET character_set_client = @saved_cs_client */; + +-- +-- Table structure for table `notifications` +-- + +DROP TABLE IF EXISTS `notifications`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!50503 SET character_set_client = utf8mb4 */; +CREATE TABLE `notifications` ( + `id` int NOT NULL AUTO_INCREMENT, + `title` varchar(111) NOT NULL, + `body` varchar(265) NOT NULL, + `passenger_id` varchar(111) NOT NULL, + `isShown` varchar(255) CHARACTER SET utf8mb3 COLLATE utf8mb3_general_ci NOT NULL DEFAULT 'false', + `created_at` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP, + `updated_at` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, + PRIMARY KEY (`id`) +) ENGINE=InnoDB AUTO_INCREMENT=9 DEFAULT CHARSET=utf8mb3; +/*!40101 SET character_set_client = @saved_cs_client */; + +-- +-- Table structure for table `otp_verification_fingerPrint` +-- + +DROP TABLE IF EXISTS `otp_verification_fingerPrint`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!50503 SET character_set_client = utf8mb4 */; +CREATE TABLE `otp_verification_fingerPrint` ( + `id` int NOT NULL, + `phone` varchar(20) NOT NULL, + `otp` varchar(6) NOT NULL, + `createdAt` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci; +/*!40101 SET character_set_client = @saved_cs_client */; + +-- +-- Table structure for table `packageInfo` +-- + +DROP TABLE IF EXISTS `packageInfo`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!50503 SET character_set_client = utf8mb4 */; +CREATE TABLE `packageInfo` ( + `id` int NOT NULL AUTO_INCREMENT, + `platform` varchar(50) NOT NULL, + `appName` varchar(20) NOT NULL, + `createdAt` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP, + `version` varchar(10) NOT NULL, + PRIMARY KEY (`id`) +) ENGINE=InnoDB AUTO_INCREMENT=5 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci; +/*!40101 SET character_set_client = @saved_cs_client */; + +-- +-- Table structure for table `palces11` +-- + +DROP TABLE IF EXISTS `palces11`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!50503 SET character_set_client = utf8mb4 */; +CREATE TABLE `palces11` ( + `id` int NOT NULL AUTO_INCREMENT, + `latitude` varchar(50) NOT NULL, + `longitude` varchar(50) NOT NULL, + `name` varchar(180) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci DEFAULT NULL, + `name_ar` varchar(200) NOT NULL, + `name_en` varchar(200) NOT NULL, + `address` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci DEFAULT NULL, + `category` varchar(55) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci DEFAULT NULL, + `created_at` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP, + `location` point NOT NULL, + PRIMARY KEY (`id`), + SPATIAL KEY `idx_spatial_location` (`location`), + FULLTEXT KEY `idx_fulltext_search` (`name`,`name_ar`,`name_en`,`address`,`category`) +) ENGINE=InnoDB AUTO_INCREMENT=28951 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci; +/*!40101 SET character_set_client = @saved_cs_client */; + +-- +-- Table structure for table `passengerWallet` +-- + +DROP TABLE IF EXISTS `passengerWallet`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!50503 SET character_set_client = utf8mb4 */; +CREATE TABLE `passengerWallet` ( + `id` int NOT NULL AUTO_INCREMENT, + `passenger_id` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL, + `balance` decimal(10,2) NOT NULL, + `created_at` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP, + `updated_at` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, + PRIMARY KEY (`id`), + KEY `passenger_id` (`passenger_id`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci; +/*!40101 SET character_set_client = @saved_cs_client */; + +-- +-- Table structure for table `passenger_blacklist` +-- + +DROP TABLE IF EXISTS `passenger_blacklist`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!50503 SET character_set_client = utf8mb4 */; +CREATE TABLE `passenger_blacklist` ( + `id` bigint unsigned NOT NULL AUTO_INCREMENT, + `phone` varchar(150) NOT NULL, + `phone_normalized` varchar(64) NOT NULL, + `reason` varchar(255) DEFAULT NULL, + `expires_at` datetime DEFAULT CURRENT_TIMESTAMP, + `created_at` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP, + PRIMARY KEY (`id`), + UNIQUE KEY `uq_phone_norm` (`phone_normalized`), + KEY `idx_expires` (`expires_at`) +) ENGINE=InnoDB AUTO_INCREMENT=2 DEFAULT CHARSET=utf8mb3; +/*!40101 SET character_set_client = @saved_cs_client */; + +-- +-- Table structure for table `passengerlocation` +-- + +DROP TABLE IF EXISTS `passengerlocation`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!50503 SET character_set_client = utf8mb4 */; +CREATE TABLE `passengerlocation` ( + `id` int NOT NULL AUTO_INCREMENT, + `passengerId` varchar(60) NOT NULL, + `lat` varchar(20) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL, + `lng` varchar(20) NOT NULL, + `rideId` varchar(10) NOT NULL, + `createdAt` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP, + PRIMARY KEY (`id`) +) ENGINE=InnoDB AUTO_INCREMENT=3172 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci; +/*!40101 SET character_set_client = @saved_cs_client */; + +-- +-- Table structure for table `passengers` +-- + +DROP TABLE IF EXISTS `passengers`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!50503 SET character_set_client = utf8mb4 */; +CREATE TABLE `passengers` ( + `id` varchar(100) NOT NULL, + `phone` varchar(150) CHARACTER SET utf8mb3 COLLATE utf8mb3_general_ci NOT NULL, + `email` varchar(255) NOT NULL, + `password` varchar(100) NOT NULL, + `gender` varchar(150) CHARACTER SET utf8mb3 COLLATE utf8mb3_general_ci NOT NULL, + `status` varchar(150) CHARACTER SET utf8mb3 COLLATE utf8mb3_general_ci NOT NULL DEFAULT 'notDeleted', + `birthdate` varchar(150) CHARACTER SET utf8mb3 COLLATE utf8mb3_general_ci NOT NULL, + `site` varchar(255) NOT NULL, + `first_name` varchar(255) NOT NULL, + `last_name` varchar(255) NOT NULL, + `sosPhone` varchar(150) CHARACTER SET utf8mb3 COLLATE utf8mb3_general_ci NOT NULL DEFAULT 'sos', + `education` varchar(150) CHARACTER SET utf8mb3 COLLATE utf8mb3_general_ci NOT NULL DEFAULT 'none', + `employmentType` varchar(150) CHARACTER SET utf8mb3 COLLATE utf8mb3_general_ci NOT NULL DEFAULT 'none', + `maritalStatus` varchar(150) CHARACTER SET utf8mb3 COLLATE utf8mb3_general_ci NOT NULL DEFAULT 'none', + `created_at` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP, + `updated_at` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, + PRIMARY KEY (`id`), + UNIQUE KEY `phone` (`phone`,`email`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb3; +/*!40101 SET character_set_client = @saved_cs_client */; + +-- +-- Table structure for table `payment_tokens` +-- + +DROP TABLE IF EXISTS `payment_tokens`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!50503 SET character_set_client = utf8mb4 */; +CREATE TABLE `payment_tokens` ( + `id` int NOT NULL AUTO_INCREMENT, + `token` varchar(255) NOT NULL, + `driverID` varchar(255) NOT NULL, + `dateCreated` datetime NOT NULL, + `amount` decimal(10,2) NOT NULL, + `isUsed` tinyint(1) DEFAULT '0', + PRIMARY KEY (`id`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci; +/*!40101 SET character_set_client = @saved_cs_client */; + +-- +-- Table structure for table `payment_tokens_passenger` +-- + +DROP TABLE IF EXISTS `payment_tokens_passenger`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!50503 SET character_set_client = utf8mb4 */; +CREATE TABLE `payment_tokens_passenger` ( + `id` int NOT NULL AUTO_INCREMENT, + `token` varchar(255) NOT NULL, + `passengerId` varchar(255) NOT NULL, + `dateCreated` datetime NOT NULL, + `amount` decimal(10,2) NOT NULL, + `isUsed` tinyint(1) DEFAULT '0', + PRIMARY KEY (`id`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci; +/*!40101 SET character_set_client = @saved_cs_client */; + +-- +-- Table structure for table `payments` +-- + +DROP TABLE IF EXISTS `payments`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!50503 SET character_set_client = utf8mb4 */; +CREATE TABLE `payments` ( + `id` varchar(111) NOT NULL, + `amount` decimal(10,2) NOT NULL, + `payment_method` varchar(255) NOT NULL, + `passengerID` varchar(100) NOT NULL, + `rideId` varchar(100) NOT NULL, + `driverID` varchar(100) NOT NULL, + `created_at` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP, + `updated_at` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, + `isGiven` varchar(20) NOT NULL DEFAULT 'waiting', + PRIMARY KEY (`id`), + UNIQUE KEY `rideId` (`rideId`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb3; +/*!40101 SET character_set_client = @saved_cs_client */; + +-- +-- Table structure for table `paymentsDriverPoints` +-- + +DROP TABLE IF EXISTS `paymentsDriverPoints`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!50503 SET character_set_client = utf8mb4 */; +CREATE TABLE `paymentsDriverPoints` ( + `id` int NOT NULL AUTO_INCREMENT, + `amount` decimal(10,2) NOT NULL, + `payment_method` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL, + `driverID` varchar(60) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL, + `created_at` datetime DEFAULT CURRENT_TIMESTAMP, + `updated_at` datetime DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, + PRIMARY KEY (`id`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci; +/*!40101 SET character_set_client = @saved_cs_client */; + +-- +-- Table structure for table `phone_verification` +-- + +DROP TABLE IF EXISTS `phone_verification`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!50503 SET character_set_client = utf8mb4 */; +CREATE TABLE `phone_verification` ( + `id` int NOT NULL AUTO_INCREMENT, + `phone_number` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL, + `driverId` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL DEFAULT 'yet', + `email` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL DEFAULT 'yet', + `token_code` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL, + `expiration_time` datetime NOT NULL, + `is_verified` tinyint(1) DEFAULT '0', + `created_at` timestamp NULL DEFAULT CURRENT_TIMESTAMP, + PRIMARY KEY (`id`) +) ENGINE=InnoDB AUTO_INCREMENT=111 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci; +/*!40101 SET character_set_client = @saved_cs_client */; + +-- +-- Table structure for table `phone_verification_passenger` +-- + +DROP TABLE IF EXISTS `phone_verification_passenger`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!50503 SET character_set_client = utf8mb4 */; +CREATE TABLE `phone_verification_passenger` ( + `id` int NOT NULL AUTO_INCREMENT, + `phone_number` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci DEFAULT NULL, + `token` varchar(80) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL, + `expiration_time` datetime NOT NULL, + `verified` tinyint(1) DEFAULT '0', + `created_at` timestamp NULL DEFAULT CURRENT_TIMESTAMP, + `status` varchar(22) NOT NULL DEFAULT 'yet', + PRIMARY KEY (`id`) +) ENGINE=InnoDB AUTO_INCREMENT=109 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci; +/*!40101 SET character_set_client = @saved_cs_client */; + +-- +-- Table structure for table `places` +-- + +DROP TABLE IF EXISTS `places`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!50503 SET character_set_client = utf8mb4 */; +CREATE TABLE `places` ( + `id` int NOT NULL AUTO_INCREMENT, + `latitude` double NOT NULL, + `longitude` double NOT NULL, + `name` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL, + `name_ar` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL, + `name_en` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL, + `address` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL, + `category` varchar(200) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL, + `created_at` timestamp NULL DEFAULT CURRENT_TIMESTAMP, + PRIMARY KEY (`id`) +) ENGINE=InnoDB AUTO_INCREMENT=8996 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci; +/*!40101 SET character_set_client = @saved_cs_client */; + +-- +-- Table structure for table `placesEgypt` +-- + +DROP TABLE IF EXISTS `placesEgypt`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!50503 SET character_set_client = utf8mb4 */; +CREATE TABLE `placesEgypt` ( + `id` int NOT NULL, + `nameEnglish` varchar(255) DEFAULT NULL, + `nameArabic` varchar(255) DEFAULT NULL, + `phone` varchar(20) DEFAULT NULL, + `countReview` int DEFAULT NULL, + `rate` float DEFAULT NULL, + `stars` varchar(50) DEFAULT NULL, + `address` text, + `website` varchar(255) DEFAULT NULL, + `email` varchar(255) DEFAULT NULL, + `PlusCode` varchar(50) DEFAULT NULL, + `closeTime` varchar(50) DEFAULT NULL, + `latitude` decimal(10,6) DEFAULT NULL, + `longitude` decimal(10,6) DEFAULT NULL, + `instagram` varchar(255) DEFAULT NULL, + `facebook` varchar(255) DEFAULT NULL, + `linkedin` varchar(255) DEFAULT NULL, + `twitter` varchar(255) DEFAULT NULL, + `photo` varchar(255) DEFAULT NULL +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci; +/*!40101 SET character_set_client = @saved_cs_client */; + +-- +-- Table structure for table `promos` +-- + +DROP TABLE IF EXISTS `promos`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!50503 SET character_set_client = utf8mb4 */; +CREATE TABLE `promos` ( + `id` int NOT NULL AUTO_INCREMENT, + `promo_code` varchar(10) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL, + `amount` varchar(4) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL DEFAULT '0', + `description` varchar(100) CHARACTER SET utf8mb3 COLLATE utf8mb3_general_ci DEFAULT NULL, + `passengerID` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL DEFAULT 'none', + `validity_start_date` date DEFAULT NULL, + `validity_end_date` date DEFAULT NULL, + PRIMARY KEY (`id`), + UNIQUE KEY `passengerID` (`passengerID`) +) ENGINE=InnoDB AUTO_INCREMENT=2 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci; +/*!40101 SET character_set_client = @saved_cs_client */; + +-- +-- Table structure for table `promptDriverIDEgypt` +-- + +DROP TABLE IF EXISTS `promptDriverIDEgypt`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!50503 SET character_set_client = utf8mb4 */; +CREATE TABLE `promptDriverIDEgypt` ( + `id` int NOT NULL AUTO_INCREMENT, + `type` varchar(30) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL, + `prompt` longtext CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL, + `createdAt` timestamp NULL DEFAULT CURRENT_TIMESTAMP, + `updatedAt` timestamp NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, + PRIMARY KEY (`id`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci; +/*!40101 SET character_set_client = @saved_cs_client */; + +-- +-- Table structure for table `ratingApp` +-- + +DROP TABLE IF EXISTS `ratingApp`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!50503 SET character_set_client = utf8mb4 */; +CREATE TABLE `ratingApp` ( + `id` int NOT NULL AUTO_INCREMENT, + `name` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL, + `email` varchar(150) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL, + `phone` varchar(80) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL, + `userId` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL, + `userType` varchar(20) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL, + `rating` varchar(2) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL, + `comment` varchar(300) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL, + `created_at` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP, + PRIMARY KEY (`id`) +) ENGINE=InnoDB AUTO_INCREMENT=11 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci; +/*!40101 SET character_set_client = @saved_cs_client */; + +-- +-- Table structure for table `ratingDriver` +-- + +DROP TABLE IF EXISTS `ratingDriver`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!50503 SET character_set_client = utf8mb4 */; +CREATE TABLE `ratingDriver` ( + `id` int NOT NULL AUTO_INCREMENT, + `passenger_id` text CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci, + `driver_id` varchar(33) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL, + `ride_id` int DEFAULT NULL, + `rating` float DEFAULT NULL, + `comment` text CHARACTER SET utf8mb3 COLLATE utf8mb3_general_ci, + `created_at` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP, + PRIMARY KEY (`id`), + UNIQUE KEY `ride_id` (`ride_id`), + KEY `idx_driver_id` (`driver_id`) +) ENGINE=InnoDB AUTO_INCREMENT=17 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci; +/*!40101 SET character_set_client = @saved_cs_client */; + +-- +-- Table structure for table `ratingPassenger` +-- + +DROP TABLE IF EXISTS `ratingPassenger`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!50503 SET character_set_client = utf8mb4 */; +CREATE TABLE `ratingPassenger` ( + `id` int NOT NULL AUTO_INCREMENT, + `passenger_id` text CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL, + `driverID` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL, + `rideId` varchar(30) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL, + `rating` float NOT NULL, + `comment` text CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci, + `created_at` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP, + PRIMARY KEY (`id`), + UNIQUE KEY `rideId` (`rideId`) +) ENGINE=InnoDB AUTO_INCREMENT=17 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci; +/*!40101 SET character_set_client = @saved_cs_client */; + +-- +-- Table structure for table `ride` +-- + +DROP TABLE IF EXISTS `ride`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!50503 SET character_set_client = utf8mb4 */; +CREATE TABLE `ride` ( + `id` int NOT NULL AUTO_INCREMENT, + `start_location` varchar(255) NOT NULL, + `end_location` varchar(255) NOT NULL, + `date` date NOT NULL, + `time` time NOT NULL, + `endtime` time NOT NULL, + `price` decimal(10,2) NOT NULL DEFAULT '0.00', + `passenger_id` varchar(111) NOT NULL, + `driver_id` varchar(111) NOT NULL, + `status` varchar(200) NOT NULL DEFAULT 'nothing', + `paymentMethod` varchar(20) NOT NULL DEFAULT 'Cash', + `carType` varchar(20) NOT NULL DEFAULT 'Speed', + `created_at` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, + `updated_at` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, + `DriverIsGoingToPassenger` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP, + `rideTimeStart` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP, + `rideTimeFinish` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP, + `price_for_driver` decimal(10,2) NOT NULL DEFAULT '0.00', + `price_for_passenger` decimal(10,2) NOT NULL DEFAULT '0.00', + `distance` float DEFAULT '0', + PRIMARY KEY (`id`), + KEY `passengerfk` (`passenger_id`), + KEY `driverfk` (`driver_id`) +) ENGINE=InnoDB AUTO_INCREMENT=94 DEFAULT CHARSET=utf8mb3; +/*!40101 SET character_set_client = @saved_cs_client */; + +-- +-- Table structure for table `seferWallet` +-- + +DROP TABLE IF EXISTS `seferWallet`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!50503 SET character_set_client = utf8mb4 */; +CREATE TABLE `seferWallet` ( + `id` int NOT NULL AUTO_INCREMENT, + `driverId` varchar(100) NOT NULL, + `passengerId` varchar(100) NOT NULL, + `amount` varchar(10) NOT NULL, + `paymentMethod` varchar(50) NOT NULL, + `token` varchar(100) NOT NULL, + `createdAt` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP, + PRIMARY KEY (`id`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci; +/*!40101 SET character_set_client = @saved_cs_client */; + +-- +-- Table structure for table `server_locations` +-- + +DROP TABLE IF EXISTS `server_locations`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!50503 SET character_set_client = utf8mb4 */; +CREATE TABLE `server_locations` ( + `id` int NOT NULL AUTO_INCREMENT, + `name` varchar(255) NOT NULL, + `min_latitude` decimal(10,6) NOT NULL, + `max_latitude` decimal(10,6) NOT NULL, + `min_longitude` decimal(10,6) NOT NULL, + `max_longitude` decimal(10,6) NOT NULL, + `server_link` varchar(255) NOT NULL, + PRIMARY KEY (`id`), + UNIQUE KEY `name` (`name`) +) ENGINE=InnoDB AUTO_INCREMENT=2 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci; +/*!40101 SET character_set_client = @saved_cs_client */; + +-- +-- Table structure for table `smsSender` +-- + +DROP TABLE IF EXISTS `smsSender`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!50503 SET character_set_client = utf8mb4 */; +CREATE TABLE `smsSender` ( + `id` int NOT NULL AUTO_INCREMENT, + `senderId` varchar(20) NOT NULL, + PRIMARY KEY (`id`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci; +/*!40101 SET character_set_client = @saved_cs_client */; + +-- +-- Table structure for table `test` +-- + +DROP TABLE IF EXISTS `test`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!50503 SET character_set_client = utf8mb4 */; +CREATE TABLE `test` ( + `id` int NOT NULL AUTO_INCREMENT, + `name` varchar(22) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL, + PRIMARY KEY (`id`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci; +/*!40101 SET character_set_client = @saved_cs_client */; + +-- +-- Table structure for table `testApp` +-- + +DROP TABLE IF EXISTS `testApp`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!50503 SET character_set_client = utf8mb4 */; +CREATE TABLE `testApp` ( + `id` int NOT NULL AUTO_INCREMENT, + `isTest` tinyint(1) NOT NULL, + `createdAt` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP, + `appPlatform` varchar(20) NOT NULL, + PRIMARY KEY (`id`) +) ENGINE=InnoDB AUTO_INCREMENT=3 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci; +/*!40101 SET character_set_client = @saved_cs_client */; + +-- +-- Table structure for table `tips` +-- + +DROP TABLE IF EXISTS `tips`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!50503 SET character_set_client = utf8mb4 */; +CREATE TABLE `tips` ( + `id` int NOT NULL AUTO_INCREMENT, + `driverID` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL, + `passengerID` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL, + `rideID` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL, + `tipAmount` decimal(10,2) DEFAULT NULL, + PRIMARY KEY (`id`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci; +/*!40101 SET character_set_client = @saved_cs_client */; + +-- +-- Table structure for table `token_verification` +-- + +DROP TABLE IF EXISTS `token_verification`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!50503 SET character_set_client = utf8mb4 */; +CREATE TABLE `token_verification` ( + `id` int NOT NULL AUTO_INCREMENT, + `phone_number` text CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL, + `token` text CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL, + `expiration_time` datetime NOT NULL, + `verified` tinyint(1) DEFAULT '0', + `created_at` datetime DEFAULT CURRENT_TIMESTAMP, + PRIMARY KEY (`id`) +) ENGINE=InnoDB AUTO_INCREMENT=49 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci; +/*!40101 SET character_set_client = @saved_cs_client */; + +-- +-- Table structure for table `token_verification_admin` +-- + +DROP TABLE IF EXISTS `token_verification_admin`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!50503 SET character_set_client = utf8mb4 */; +CREATE TABLE `token_verification_admin` ( + `id` int NOT NULL AUTO_INCREMENT, + `phone_number` varchar(20) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL, + `token` varchar(10) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL, + `expiration_time` datetime NOT NULL, + PRIMARY KEY (`id`), + UNIQUE KEY `phone_number` (`phone_number`) +) ENGINE=InnoDB AUTO_INCREMENT=29 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci; +/*!40101 SET character_set_client = @saved_cs_client */; + +-- +-- Table structure for table `token_verification_driver` +-- + +DROP TABLE IF EXISTS `token_verification_driver`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!50503 SET character_set_client = utf8mb4 */; +CREATE TABLE `token_verification_driver` ( + `id` int NOT NULL AUTO_INCREMENT, + `phone_number` text CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL, + `token` text CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL, + `expiration_time` datetime NOT NULL, + `verified` tinyint(1) NOT NULL DEFAULT '0', + `created_at` datetime DEFAULT CURRENT_TIMESTAMP, + PRIMARY KEY (`id`) +) ENGINE=InnoDB AUTO_INCREMENT=49 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci; +/*!40101 SET character_set_client = @saved_cs_client */; + +-- +-- Table structure for table `tokens` +-- + +DROP TABLE IF EXISTS `tokens`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!50503 SET character_set_client = utf8mb4 */; +CREATE TABLE `tokens` ( + `id` int NOT NULL AUTO_INCREMENT, + `token` varchar(333) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL, + `passengerID` varchar(80) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL, + `fingerPrint` varchar(250) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL, + `status` varchar(22) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL DEFAULT 'yet', + PRIMARY KEY (`id`), + UNIQUE KEY `passengerID` (`passengerID`) +) ENGINE=InnoDB AUTO_INCREMENT=53 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci; +/*!40101 SET character_set_client = @saved_cs_client */; + +-- +-- Table structure for table `users` +-- + +DROP TABLE IF EXISTS `users`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!50503 SET character_set_client = utf8mb4 */; +CREATE TABLE `users` ( + `id` varchar(111) NOT NULL, + `phone` varchar(15) NOT NULL, + `email` varchar(255) NOT NULL, + `gender` varchar(10) NOT NULL, + `password` varchar(100) NOT NULL, + `birthdate` date NOT NULL, + `site` varchar(255) NOT NULL, + `first_name` varchar(255) NOT NULL, + `last_name` varchar(255) NOT NULL, + `created_at` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP, + `updated_at` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, + `user_type` varchar(44) NOT NULL, + PRIMARY KEY (`id`), + UNIQUE KEY `email` (`email`), + UNIQUE KEY `phone` (`phone`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb3; +/*!40101 SET character_set_client = @saved_cs_client */; + +-- +-- Table structure for table `vehicles` +-- + +DROP TABLE IF EXISTS `vehicles`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!50503 SET character_set_client = utf8mb4 */; +CREATE TABLE `vehicles` ( + `id` int NOT NULL AUTO_INCREMENT, + `driverID` varchar(100) NOT NULL, + `make` varchar(255) NOT NULL, + `model` varchar(255) NOT NULL, + `license_plate` varchar(255) NOT NULL, + `seats` int NOT NULL, + `created_at` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP, + `updated_at` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, + PRIMARY KEY (`id`), + UNIQUE KEY `license_plate` (`license_plate`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb3; +/*!40101 SET character_set_client = @saved_cs_client */; + +-- +-- Table structure for table `videos` +-- + +DROP TABLE IF EXISTS `videos`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!50503 SET character_set_client = utf8mb4 */; +CREATE TABLE `videos` ( + `id` int NOT NULL AUTO_INCREMENT, + `title` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL, + `description` varchar(200) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL, + `url` varchar(150) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL, + `created_at` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP, + PRIMARY KEY (`id`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci; +/*!40101 SET character_set_client = @saved_cs_client */; + +-- +-- Table structure for table `waitingRides` +-- + +DROP TABLE IF EXISTS `waitingRides`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!50503 SET character_set_client = utf8mb4 */; +CREATE TABLE `waitingRides` ( + `id` varchar(100) NOT NULL, + `start_location` varchar(255) NOT NULL, + `end_location` varchar(255) NOT NULL, + `date` date NOT NULL, + `time` time NOT NULL, + `price` decimal(10,2) NOT NULL DEFAULT '0.00', + `passenger_id` varchar(111) NOT NULL, + `status` varchar(200) NOT NULL DEFAULT 'nothing', + `carType` varchar(19) NOT NULL, + `passengerRate` decimal(10,2) NOT NULL, + `created_at` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, + `price_for_passenger` decimal(10,2) NOT NULL DEFAULT '0.00', + `distance` varchar(255) NOT NULL, + `duration` varchar(10) NOT NULL DEFAULT '0', + PRIMARY KEY (`id`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb3; +/*!40101 SET character_set_client = @saved_cs_client */; + +-- +-- Table structure for table `welcomeDriverCall` +-- + +DROP TABLE IF EXISTS `welcomeDriverCall`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!50503 SET character_set_client = utf8mb4 */; +CREATE TABLE `welcomeDriverCall` ( + `id` int NOT NULL AUTO_INCREMENT, + `driverId` varchar(50) NOT NULL, + `isCall` tinyint(1) NOT NULL DEFAULT '0', + `notes` varchar(255) NOT NULL, + `createdAt` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP, + PRIMARY KEY (`id`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci; +/*!40101 SET character_set_client = @saved_cs_client */; + +-- +-- Table structure for table `write_argument_after_applied_from_background` +-- + +DROP TABLE IF EXISTS `write_argument_after_applied_from_background`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!50503 SET character_set_client = utf8mb4 */; +CREATE TABLE `write_argument_after_applied_from_background` ( + `id` int unsigned NOT NULL AUTO_INCREMENT, + `ride_id` varchar(50) NOT NULL, + `driver_id` varchar(50) NOT NULL, + `passenger_id` varchar(50) NOT NULL, + `passenger_location` varchar(30) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL, + `passenger_destination` varchar(30) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL, + `duration` varchar(255) NOT NULL, + `duration_to_passenger` varchar(255) NOT NULL, + `duration_of_ride` varchar(255) NOT NULL, + `distance` varchar(255) NOT NULL, + `total_cost` varchar(255) NOT NULL, + `payment_amount` varchar(255) NOT NULL, + `payment_method` enum('visa','cash') NOT NULL, + `wallet_checked` varchar(255) NOT NULL, + `has_steps` varchar(255) NOT NULL, + `step0` varchar(255) DEFAULT NULL, + `step1` varchar(255) DEFAULT NULL, + `step2` varchar(255) DEFAULT NULL, + `step3` varchar(255) DEFAULT NULL, + `step4` varchar(255) DEFAULT NULL, + `passenger_wallet_burc` varchar(33) NOT NULL, + `token_passenger` varchar(255) NOT NULL, + `name` varchar(100) NOT NULL, + `phone` varchar(20) NOT NULL, + `email` varchar(150) NOT NULL, + `start_name_location` varchar(255) NOT NULL, + `end_name_location` varchar(255) NOT NULL, + `car_type` varchar(50) NOT NULL, + `kazan` varchar(255) NOT NULL, + `direction_url` text NOT NULL, + `time_of_order` datetime NOT NULL, + `total_passenger` varchar(255) NOT NULL, + PRIMARY KEY (`id`) +) ENGINE=InnoDB AUTO_INCREMENT=3 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci; +/*!40101 SET character_set_client = @saved_cs_client */; + +-- +-- Dumping events for database 'locationDB' +-- + +-- +-- Dumping routines for database 'locationDB' +-- +/*!50112 SET @disable_bulk_load = IF (@is_rocksdb_supported, 'SET SESSION rocksdb_bulk_load = @old_rocksdb_bulk_load', 'SET @dummy_rocksdb_bulk_load = 0') */; +/*!50112 PREPARE s FROM @disable_bulk_load */; +/*!50112 EXECUTE s */; +/*!50112 DEALLOCATE PREPARE s */; +/*!40103 SET TIME_ZONE=@OLD_TIME_ZONE */; + +/*!40101 SET SQL_MODE=@OLD_SQL_MODE */; +/*!40014 SET FOREIGN_KEY_CHECKS=@OLD_FOREIGN_KEY_CHECKS */; +/*!40014 SET UNIQUE_CHECKS=@OLD_UNIQUE_CHECKS */; +/*!40101 SET CHARACTER_SET_CLIENT=@OLD_CHARACTER_SET_CLIENT */; +/*!40101 SET CHARACTER_SET_RESULTS=@OLD_CHARACTER_SET_RESULTS */; +/*!40101 SET COLLATION_CONNECTION=@OLD_COLLATION_CONNECTION */; +/*!40111 SET SQL_NOTES=@OLD_SQL_NOTES */; + +-- Dump completed on 2026-04-22 20:48:59 diff --git a/backend/serviceapp/addCartoDriver.php b/backend/serviceapp/addCartoDriver.php new file mode 100755 index 0000000..e9eb272 --- /dev/null +++ b/backend/serviceapp/addCartoDriver.php @@ -0,0 +1,101 @@ +encryptData(filterRequest("vin")); +$carPlate = $encryptionHelper->encryptData(filterRequest("car_plate")); +$make = filterRequest("make"); +$model = filterRequest("model"); +$year = filterRequest("year"); +$expirationDate = filterRequest("expiration_date"); +$color = filterRequest("color"); +$owner = $encryptionHelper->encryptData(filterRequest("owner")); +$colorHex = filterRequest("color_hex"); +$address = $encryptionHelper->encryptData(filterRequest("address")); +$displacement = filterRequest("displacement"); +$fuel = filterRequest("fuel"); +$registrationDate = filterRequest("registration_date"); + +// تحقق من الحقول المطلوبة +if ( + is_null($driverID) || is_null($vin) || is_null($carPlate) || + is_null($make) || is_null($model) || is_null($year) || + is_null($expirationDate) || is_null($color) || is_null($owner) || + is_null($colorHex) || is_null($address) || is_null($displacement) || + is_null($fuel) || is_null($registrationDate) +) { + jsonError("One or more required parameters are missing."); + exit(); +} + +$con->beginTransaction(); + +try { + $checkSql = "SELECT * FROM `CarRegistration` WHERE `driverID` = :driverID"; + $checkStmt = $con->prepare($checkSql); + $checkStmt->bindParam(':driverID', $driverID); + $checkStmt->execute(); + + if ($checkStmt->rowCount() > 0) { + jsonError("Car has already been registered for this driver."); + exit(); + } + + // إدخال السيارة + $sqlInsert = "INSERT INTO `CarRegistration` ( + `driverID`, `vin`, `car_plate`, `make`, `model`, `year`, `expiration_date`, + `color`, `owner`, `color_hex`, `address`, `displacement`, `fuel`, `registration_date` + ) VALUES ( + :driverID, :vin, :carPlate, :make, :model, :year, :expirationDate, + :color, :owner, :colorHex, :address, :displacement, :fuel, :registrationDate + )"; + + $stmtInsert = $con->prepare($sqlInsert); + $stmtInsert->bindParam(':driverID', $driverID); + $stmtInsert->bindParam(':vin', $vin); + $stmtInsert->bindParam(':carPlate', $carPlate); + $stmtInsert->bindParam(':make', $make); + $stmtInsert->bindParam(':model', $model); + $stmtInsert->bindParam(':year', $year); + $stmtInsert->bindParam(':expirationDate', $expirationDate); + $stmtInsert->bindParam(':color', $color); + $stmtInsert->bindParam(':owner', $owner); + $stmtInsert->bindParam(':colorHex', $colorHex); + $stmtInsert->bindParam(':address', $address); + $stmtInsert->bindParam(':displacement', $displacement); + $stmtInsert->bindParam(':fuel', $fuel); + $stmtInsert->bindParam(':registrationDate', $registrationDate); + + $stmtInsert->execute(); + + if ($stmtInsert->rowCount() > 0) { + // سجل في carPlateEdit + $sqlLog = "INSERT INTO `carPlateEdit` + (`driverId`, `carPlate`, `color`, `make`, `model`, `expiration_date`, `owner`, `year`, `isEdit`) + VALUES (:driverID, :carPlate, :color, :make, :model, :expirationDate, :owner, :year, 0)"; + + $stmtLog = $con->prepare($sqlLog); + $stmtLog->bindParam(':driverID', $driverID); + $stmtLog->bindParam(':carPlate', $carPlate); + $stmtLog->bindParam(':color', $color); + $stmtLog->bindParam(':make', $make); + $stmtLog->bindParam(':model', $model); + $stmtLog->bindParam(':expirationDate', $expirationDate); + $stmtLog->bindParam(':owner', $owner); + $stmtLog->bindParam(':year', $year); + + $stmtLog->execute(); + + $con->commit(); + jsonSuccess(null, "Car registration data saved and logged successfully"); + } else { + $con->rollBack(); + jsonError("Failed to save car registration data"); + } +} catch (Exception $e) { + $con->rollBack(); + jsonError("An error occurred: " . $e->getMessage()); +} +?> \ No newline at end of file diff --git a/backend/serviceapp/addNotesDriver.php b/backend/serviceapp/addNotesDriver.php new file mode 100644 index 0000000..6f0b842 --- /dev/null +++ b/backend/serviceapp/addNotesDriver.php @@ -0,0 +1,40 @@ +encryptData($phone); + +// SQL query: insert new row OR update existing one if phone already exists +$sql = "INSERT INTO `notesForDriverService` (`phone`, `note`, `editor`) + VALUES (:phone, :note, :editor) + ON DUPLICATE KEY UPDATE + `note` = VALUES(`note`), + `editor` = VALUES(`editor`)"; + +// Prepare the SQL statement +$stmt = $con->prepare($sql); + +// Bind the parameters +$stmt->bindParam(':phone', $encryptedPhone); +$stmt->bindParam(':note', $note); +$stmt->bindParam(':editor', $editor); + +// Execute the query +$success = $stmt->execute(); + +if ($success) { + if ($stmt->rowCount() > 0) { + jsonSuccess(null, "Note inserted/updated successfully"); + } else { + jsonError("No changes were made"); + } +} else { + jsonError("Database error"); +} +?> \ No newline at end of file diff --git a/backend/serviceapp/addNotesPassenger.php b/backend/serviceapp/addNotesPassenger.php new file mode 100644 index 0000000..fbde845 --- /dev/null +++ b/backend/serviceapp/addNotesPassenger.php @@ -0,0 +1,31 @@ +encryptData($phone); + +// SQL query to insert into notesForPassengerService +$sql = "INSERT INTO `notesForPassengerService` (`phone`, `note`, `editor`) + VALUES (:phone, :note, :editor)"; + +// Prepare the statement +$stmt = $con->prepare($sql); +$stmt->bindParam(':phone', $encryptedPhone); +$stmt->bindParam(':note', $note); +$stmt->bindParam(':editor', $editor); + +// Execute and respond +$stmt->execute(); + +if ($stmt->rowCount() > 0) { + jsonSuccess(null, "Note inserted successfully"); +} else { + jsonError("Failed to insert note"); +} +?> \ No newline at end of file diff --git a/backend/serviceapp/addWelcomeDriverNote.php b/backend/serviceapp/addWelcomeDriverNote.php new file mode 100644 index 0000000..5d52344 --- /dev/null +++ b/backend/serviceapp/addWelcomeDriverNote.php @@ -0,0 +1,33 @@ +prepare($sql); + +// Bind parameters +$stmt->bindParam(':driverId', $driverId); +$stmt->bindParam(':notes', $notes); + +// Execute the statement +$success = $stmt->execute(); + +if ($success) { + jsonSuccess(null, "Record inserted/updated successfully"); +} else { + jsonError("Failed to insert or update record"); +} + +?> diff --git a/backend/serviceapp/check_db.php b/backend/serviceapp/check_db.php new file mode 100644 index 0000000..0484b9d --- /dev/null +++ b/backend/serviceapp/check_db.php @@ -0,0 +1,10 @@ +prepare("DESCRIBE users"); + $stmt->execute(); + $columns = $stmt->fetchAll(PDO::FETCH_ASSOC); + echo json_encode($columns); +} catch (Exception $e) { + echo json_encode(['error' => $e->getMessage()]); +} diff --git a/backend/serviceapp/deleteDriverNotCompleteRegistration.php b/backend/serviceapp/deleteDriverNotCompleteRegistration.php new file mode 100755 index 0000000..648897e --- /dev/null +++ b/backend/serviceapp/deleteDriverNotCompleteRegistration.php @@ -0,0 +1,35 @@ +encryptData($phone); + + +// 2. تنفيذ الحذف بشرط تطابق الهاتف وأن الحالة 'yet' +$sql = "DELETE FROM driver + WHERE phone = ? + AND employmentType = 'yet'"; + +$stmt = $con->prepare($sql); +$stmt->execute(array($phone)); + +$count = $stmt->rowCount(); + +if ($count > 0) { + // 3. إرسال رد النجاح ليتم عرضه في التطبيق (Get.snackbar) + jsonSuccess(null, "Driver deleted successfully"); +} else { + // إرسال رد فشل (إذا لم يتم العثور على الرقم أو كان السائق مكتملاً) + jsonError("Driver not found or already active"); +} + +?> \ No newline at end of file diff --git a/backend/serviceapp/driverWhoregisterFfterCall.php b/backend/serviceapp/driverWhoregisterFfterCall.php new file mode 100644 index 0000000..8453150 --- /dev/null +++ b/backend/serviceapp/driverWhoregisterFfterCall.php @@ -0,0 +1,34 @@ +prepare($sql); +$stmt->execute(); + +if ($stmt->rowCount() > 0) { + $row = $stmt->fetchAll(PDO::FETCH_ASSOC); + jsonSuccess($row); +} else { + jsonError("No driver records found with notes this month."); +} +?> \ No newline at end of file diff --git a/backend/serviceapp/drivers_list.txt b/backend/serviceapp/drivers_list.txt new file mode 100644 index 0000000..f553044 --- /dev/null +++ b/backend/serviceapp/drivers_list.txt @@ -0,0 +1,723 @@ +Phone: 963995473295 | Note: No Note +Phone: 963932997741 | Note: No Note +Phone: 963946792550 | Note: No Note +Phone: | Note: لا يوجد رقم +Phone: 963930124895 | Note: No Note +Phone: 963932845375 | Note: No Note +Phone: 9630937563437 | Note: No Note +Phone: 963937563437 | Note: No Note +Phone: 963933014381 | Note: No Note +Phone: 963940740211 | Note: No Note +Phone: 963997731147 | Note: No Note +Phone: 9630982494498 | Note: No Note +Phone: 963982494498 | Note: No Note +Phone: 963936780435 | Note: No Note +Phone: 963932894042 | Note: No Note +Phone: 963955609157 | Note: No Note +Phone: 963943433943 | Note: No Note +Phone: 963934020587 | Note: No Note +Phone: 963991486923 | Note: No Note +Phone: 963930246282 | Note: No Note +Phone: 963936388893 | Note: No Note +Phone: 963965444917 | Note: No Note +Phone: 963968622928 | Note: No Note +Phone: 963941588818 | Note: No Note +Phone: 9630941588818 | Note: No Note +Phone: 963998557963 | Note: No Note +Phone: 963995737121 | Note: ماعندو واتس وخطو مسكر +Phone: 963996673522 | Note: No Note +Phone: 963992159193 | Note: No Note +Phone: 963933231038 | Note: No Note +Phone: 963990320212 | Note: تم +Phone: 963991918177 | Note: No Note +Phone: 963962293692 | Note: No Note +Phone: 963980043065 | Note: No Note +Phone: 963933665775 | Note: No Note +Phone: 963997678811 | Note: No Note +Phone: 963935541277 | Note: No Note +Phone: 963937173449 | Note: تم +Phone: 963998235145 | Note: No Note +Phone: 963991514602 | Note: No Note +Phone: 963993725589 | Note: No Note +Phone: 963939761870 | Note: No Note +Phone: 963956825657 | Note: No Note +Phone: 963933642491 | Note: No Note +Phone: 963956906783 | Note: No Note +Phone: 9630956906783 | Note: No Note +Phone: 9630936984029 | Note: No Note +Phone: 963941418151 | Note: No Note +Phone: 9630941418151 | Note: No Note +Phone: 963981237272 | Note: No Note +Phone: 963933897890 | Note: No Note +Phone: 963944344937 | Note: No Note +Phone: 963993828902 | Note: No Note +Phone: 963933659200 | Note: No Note +Phone: 963955414963 | Note: No Note +Phone: 963942024560 | Note: No Note +Phone: 9639494022840 | Note: No Note +Phone: 9639639362485 | Note: No Note +Phone: 963965833448 | Note: مشغول +Phone: 9630930291349 | Note: بدو يفعل +Phone: 963945267161 | Note: تم +Phone: 9630934627741 | Note: No Note +Phone: 963934627741 | Note: No Note +Phone: 963935777840 | Note: No Note +Phone: 963994436621 | Note: No Note +Phone: 963940031237 | Note: No Note +Phone: 963957833531 | Note: No Note +Phone: 963943949925 | Note: No Note +Phone: 963953263161 | Note: ما برن +Phone: 963980486635 | Note: No Note +Phone: 963٩٩٢٩٩٩٠٨٣ | Note: No Note +Phone: 963950505715 | Note: No Note +Phone: 963934443912 | Note: كان بدو يشتري سيارة وفقست بس يكفي رح يسجل +Phone: 963945452222 | Note: رح يكفي تسجيل +Phone: 963948899644 | Note: No Note +Phone: 963937525133 | Note: رح يكفي تسجيل +Phone: 963934441423 | Note: No Note +Phone: 963968044972 | Note: تم التواصل +Phone: 963984137014 | Note: مابدو +Phone: 963796377987 | Note: No Note +Phone: 963988455623 | Note: No Note +Phone: 9630939386057 | Note: No Note +Phone: 963939386057 | Note: No Note +Phone: 963966880940 | Note: تم +Phone: 963932928765 | Note: تم +Phone: 963993641405 | Note: تم +Phone: 963933027735 | Note: No Note +Phone: 963933433725 | Note: تم +Phone: 963988870417 | Note: تم +Phone: 963951670237 | Note: تم +Phone: 963930795196 | Note: تم +Phone: 963991960766 | Note: تم +Phone: 963935998441 | Note: تم +Phone: 963947938918 | Note: تم +Phone: 963992435599 | Note: تم +Phone: 963954364865 | Note: تم +Phone: 963995438666 | Note: تم +Phone: 963991420279 | Note: تم +Phone: 963933969836 | Note: تم +Phone: 963095874505 | Note: الرقم خطأ +Phone: 963933586167 | Note: تم +Phone: 963997791974 | Note: تم +Phone: 963938092584 | Note: تم +Phone: 963936412209 | Note: تم +Phone: 963993998201 | Note: تم +Phone: 963954845028 | Note: No Note +Phone: 963985472276 | Note: No Note +Phone: 963983727779 | Note: تم +Phone: 963935005982 | Note: تم +Phone: 963996095507 | Note: No Note +Phone: 963993952009 | Note: تم +Phone: 9630993952009 | Note: No Note +Phone: 963940056304 | Note: تم +Phone: 963995797246 | Note: تم +Phone: 963993492062 | Note: No Note +Phone: 963988493310 | Note: تم +Phone: 971567312720 | Note: No Note +Phone: 963991748590 | Note: تم +Phone: 963996807389 | Note: تم +Phone: 963933624099 | Note: تم +Phone: 963981997355 | Note: تم +Phone: 9630983758855 | Note: تم +Phone: 963986198636 | Note: No Note +Phone: 963932392061 | Note: No Note +Phone: 963944087759 | Note: No Note +Phone: 9630944087759 | Note: No Note +Phone: 963996489269 | Note: No Note +Phone: 963956465908 | Note: No Note +Phone: 963937829076 | Note: No Note +Phone: 963952398851 | Note: No Note +Phone: 963947785627 | Note: No Note +Phone: 963944725825 | Note: No Note +Phone: 963985041549 | Note: No Note +Phone: 963992485425 | Note: No Note +Phone: 963990462939 | Note: No Note +Phone: 963997451873 | Note: No Note +Phone: 9630992952235 | Note: No Note +Phone: 963991543059 | Note: No Note +Phone: 963938800414 | Note: No Note +Phone: 963955915110 | Note: No Note +Phone: 963933436896 | Note: No Note +Phone: 963962203899 | Note: No Note +Phone: 963980561370 | Note: No Note +Phone: 963938449446 | Note: No Note +Phone: 963933989564 | Note: No Note +Phone: 963952726606 | Note: No Note +Phone: 963954152143 | Note: No Note +Phone: 963095272660 | Note: No Note +Phone: 963985131776 | Note: No Note +Phone: 963093184436 | Note: No Note +Phone: 963933751093 | Note: No Note +Phone: 963937475542 | Note: No Note +Phone: 963944619801 | Note: No Note +Phone: 963994776559 | Note: No Note +Phone: 963931802363 | Note: No Note +Phone: 963986312807 | Note: No Note +Phone: 963933502898 | Note: No Note +Phone: 963992667679 | Note: No Note +Phone: 963988514496 | Note: No Note +Phone: 963954251613 | Note: No Note +Phone: 963955630089 | Note: No Note +Phone: 963096491319 | Note: رقم غلط +Phone: 963999352010 | Note: تم +Phone: 963997823542 | Note: No Note +Phone: 963935561540 | Note: No Note +Phone: 963991907984 | Note: تم التواصل +Phone: 963963992952 | Note: غير موضوع بالخدمة +Phone: 919154792561 | Note: غلط +Phone: 963095371707 | Note: غير صحيح +Phone: 963964701914 | Note: تم +Phone: 963991175918 | Note: No Note +Phone: 963962215103 | Note: تم +Phone: 963099295223 | Note: خطأ +Phone: 963990368364 | Note: تم التواصل +Phone: 963931447359 | Note: No Note +Phone: 963994875810 | Note: تم التواصل +Phone: 963998047263 | Note: تم التواصل +Phone: 963988892598 | Note: تم التواصل +Phone: 963996136343 | Note: تم التواصل +Phone: 963934245841 | Note: تم التواصل +Phone: 963933944881 | Note: تم التواصل +Phone: 963993484762 | Note: تم التواصل +Phone: 963997386925 | Note: تم التواصل +Phone: 963955300562 | Note: تم التواصل +Phone: 963099123427 | Note: الرقم خطأ +Phone: 963998752835 | Note: تم التواصل +Phone: 963986164501 | Note: تم التواصل +Phone: 963994221981 | Note: تم +Phone: 963985111107 | Note: تم +Phone: 963965665584 | Note: تم +Phone: 963093309389 | Note: الرقم خطأ +Phone: 963933009411 | Note: تم التواصل +Phone: 963997226674 | Note: تم التواصل +Phone: 963985322261 | Note: تم التواصل +Phone: 963944585751 | Note: تم +Phone: 963936520446 | Note: تم +Phone: 963942272548 | Note: تم +Phone: 963932784840 | Note: تم +Phone: 963966337233 | Note: تم +Phone: 963982498933 | Note: تم +Phone: 963934792333 | Note: تم +Phone: 963992323421 | Note: No Note +Phone: 963937512107 | Note: تم +Phone: 963095247574 | Note: No Note +Phone: 963994800068 | Note: تم +Phone: 963955809725 | Note: No Note +Phone: 963933823485 | Note: No Note +Phone: 963949204755 | Note: تم +Phone: 963983691808 | Note: No Note +Phone: 963983626721 | Note: No Note +Phone: 963981610336 | Note: No Note +Phone: 963937927500 | Note: No Note +Phone: 963959853846 | Note: No Note +Phone: 963997073925 | Note: تم +Phone: 963956732767 | Note: غلط +Phone: 963947021104 | Note: تم +Phone: 963940052998 | Note: تم +Phone: 963944662446 | Note: تم +Phone: 963982678522 | Note: تم +Phone: 963962135909 | Note: تم +Phone: 963936610855 | Note: تم التواصل +Phone: 963994299736 | Note: تم التواصل +Phone: 963994202784 | Note: تم التواصل +Phone: 963938506392 | Note: تم التواصل +Phone: 963996355773 | Note: تم التواصل +Phone: 963993211641 | Note: تم التواصل +Phone: 963958885#01 | Note: خطأ +Phone: 963993214588 | Note: تم التواصل +Phone: 963930690439 | Note: تم التواصل +Phone: 963981320471 | Note: No Note +Phone: 963958749567 | Note: No Note +Phone: 963955399707 | Note: السيارة بالتصليح +Phone: 963981661357 | Note: تم +Phone: 963935151385 | Note: تم +Phone: 963933524019 | Note: تم +Phone: 963969079332 | Note: تم +Phone: 963982380563 | Note: تم +Phone: 963998817414 | Note: تم +Phone: 963962864640 | Note: تم +Phone: 963954932302 | Note: تم +Phone: 963951628380 | Note: No Note +Phone: 963956742311 | Note: تم +Phone: 963988605516 | Note: No Note +Phone: 963933122432 | Note: No Note +Phone: 963943562177 | Note: No Note +Phone: 963936700433 | Note: No Note +Phone: 963991539595 | Note: No Note +Phone: 963997634135 | Note: No Note +Phone: 963954512319 | Note: No Note +Phone: 963991392595 | Note: No Note +Phone: 963930053897 | Note: No Note +Phone: 963941494393 | Note: No Note +Phone: 963938963278 | Note: No Note +Phone: 963996725663 | Note: No Note +Phone: 963932998203 | Note: No Note +Phone: 963984743097 | Note: No Note +Phone: 963+20952653 | Note: No Note +Phone: 963933263408 | Note: No Note +Phone: 963992603003 | Note: No Note +Phone: 963999186608 | Note: No Note +Phone: 963093319092 | Note: No Note +Phone: 963992200572 | Note: No Note +Phone: 963935860379 | Note: تم التواصل +Phone: 963932612511 | Note: No Note +Phone: 963955665828 | Note: No Note +Phone: 963958748659 | Note: No Note +Phone: 963948956757 | Note: No Note +Phone: 963991527216 | Note: No Note +Phone: 963967434852 | Note: No Note +Phone: 963933473946 | Note: No Note +Phone: 963959281303 | Note: No Note +Phone: 963937506427 | Note: No Note +Phone: 963945017743 | Note: No Note +Phone: 963941973355 | Note: No Note +Phone: 963969369322 | Note: No Note +Phone: 963935221144 | Note: No Note +Phone: 963991933762 | Note: No Note +Phone: 963991331539 | Note: No Note +Phone: 963995940170 | Note: No Note +Phone: 963996450146 | Note: No Note +Phone: 963942283959 | Note: No Note +Phone: 963936825881 | Note: No Note +Phone: 963994058290 | Note: تم التواصل +Phone: 963980387211 | Note: No Note +Phone: 963960003815 | Note: No Note +Phone: 963938705215 | Note: No Note +Phone: 963930097924 | Note: No Note +Phone: 963982872652 | Note: تم التواصل +Phone: 963985327571 | Note: No Note +Phone: 963958786360 | Note: No Note +Phone: 963968840086 | Note: No Note +Phone: 963937536957 | Note: No Note +Phone: 963953925409 | Note: No Note +Phone: 963947157325 | Note: No Note +Phone: 963981489190 | Note: No Note +Phone: 963937583931 | Note: No Note +Phone: 963949631384 | Note: No Note +Phone: 963953344805 | Note: No Note +Phone: 963930104547 | Note: No Note +Phone: 963952300665 | Note: No Note +Phone: 963095230066 | Note: No Note +Phone: 963988510023 | Note: No Note +Phone: 963992274229 | Note: No Note +Phone: 963991506951 | Note: تم التواصل +Phone: 963954894895 | Note: تم التواصل +Phone: 963955585012 | Note: خارج الخدمة +Phone: 963996307122 | Note: تم التواصل +Phone: 963991610683 | Note: تم التواصل +Phone: 963991355714 | Note: تم التواصل +Phone: 963937557764 | Note: تم التواصل +Phone: 963988514321 | Note: تم التواصل +Phone: 963944077035 | Note: تم التواصل +Phone: 963938129427 | Note: تم التواصل +Phone: 963990444099 | Note: تم التواصل +Phone: 963956786668 | Note: تم التواصل +Phone: 963940728564 | Note: تم التواصل +Phone: 963954402659 | Note: خارج الخدمة وتس واتصال +Phone: 963936765364 | Note: تم التواصل +Phone: 963933078901 | Note: تم التواصل +Phone: 963934417178 | Note: تم التواصل +Phone: 963930447695 | Note: تم التواصل +Phone: 963094051564 | Note: الرقم خطأ +Phone: 963992417040 | Note: تم التواصل +Phone: 963958922780 | Note: تم الاتصال سكودا +Phone: 963951379303 | Note: تم التواصل +Phone: 963953858808 | Note: تم التواصل +Phone: 963964646415 | Note: تم التواصل +Phone: 963960098818 | Note: تم التواصل +Phone: 963933899771 | Note: تم التواصل +Phone: 963096949698 | Note: الرقم خطأ +Phone: 963982861634 | Note: No Note +Phone: 963938252876 | Note: No Note +Phone: 963986561347 | Note: No Note +Phone: 963933700937 | Note: No Note +Phone: 963960078368 | Note: No Note +Phone: 963933737355 | Note: No Note +Phone: 963983755054 | Note: hvta +Phone: 963940907547 | Note: No Note +Phone: 963949757956 | Note: No Note +Phone: 963938938514 | Note: No Note +Phone: 963980457705 | Note: No Note +Phone: 963944404002 | Note: No Note +Phone: 963965410313 | Note: No Note +Phone: 963982325766 | Note: No Note +Phone: 963981289181 | Note: No Note +Phone: 963993462192 | Note: No Note +Phone: 963968504915 | Note: No Note +Phone: 963936628380 | Note: No Note +Phone: 963951366246 | Note: No Note +Phone: 963998727408 | Note: No Note +Phone: 963953877512 | Note: No Note +Phone: 963940478435 | Note: No Note +Phone: 963984625505 | Note: No Note +Phone: 963954659494 | Note: No Note +Phone: 963947653804 | Note: No Note +Phone: 963959218092 | Note: No Note +Phone: 963994511053 | Note: No Note +Phone: 963938341514 | Note: No Note +Phone: 963982672582 | Note: No Note +Phone: 963992495126 | Note: No Note +Phone: 963993163487 | Note: No Note +Phone: 963966516151 | Note: No Note +Phone: 963958472195 | Note: No Note +Phone: 963954611914 | Note: No Note +Phone: 963940865211 | Note: No Note +Phone: 963955875120 | Note: No Note +Phone: 963985347924 | Note: No Note +Phone: 963951450015 | Note: No Note +Phone: 963991449908 | Note: No Note +Phone: 963939715983 | Note: No Note +Phone: 963932166786 | Note: No Note +Phone: 963932334792 | Note: No Note +Phone: 963998615843 | Note: No Note +Phone: 963995232226 | Note: No Note +Phone: 963983772298 | Note: No Note +Phone: 963988736467 | Note: No Note +Phone: 963959109269 | Note: No Note +Phone: 963934770200 | Note: No Note +Phone: 963995149210 | Note: No Note +Phone: 963985665216 | Note: No Note +Phone: 963962423870 | Note: No Note +Phone: 963939894588 | Note: No Note +Phone: 963930018143 | Note: No Note +Phone: 963944940930 | Note: No Note +Phone: 963930354266 | Note: No Note +Phone: 963952380026 | Note: No Note +Phone: 963932838183 | Note: No Note +Phone: 963988131966 | Note: No Note +Phone: 963993300063 | Note: No Note +Phone: 963949754561 | Note: No Note +Phone: 963935927218 | Note: No Note +Phone: 963935595928 | Note: No Note +Phone: 963949282497 | Note: No Note +Phone: 963934392382 | Note: No Note +Phone: 963937593945 | Note: No Note +Phone: 963938883892 | Note: No Note +Phone: 963093727926 | Note: No Note +Phone: 963999062031 | Note: No Note +Phone: 963938059209 | Note: No Note +Phone: 963964685561 | Note: No Note +Phone: 963944344299 | Note: No Note +Phone: 963955355766 | Note: No Note +Phone: 963999823383 | Note: No Note +Phone: 963944439897 | Note: No Note +Phone: 963995127821 | Note: No Note +Phone: 963994257265 | Note: No Note +Phone: 963936490987 | Note: No Note +Phone: 963993530236 | Note: No Note +Phone: 963 959 503 | Note: No Note +Phone: 963986797797 | Note: No Note +Phone: 963933529331 | Note: No Note +Phone: 963951343947 | Note: No Note +Phone: 963997585651 | Note: No Note +Phone: 963991907052 | Note: No Note +Phone: 963988964744 | Note: No Note +Phone: 963099161662 | Note: No Note +Phone: 963933175809 | Note: No Note +Phone: 963937590105 | Note: No Note +Phone: 963984222103 | Note: No Note +Phone: 963099467874 | Note: No Note +Phone: 963930301422 | Note: No Note +Phone: 963988561330 | Note: No Note +Phone: 963986769366 | Note: No Note +Phone: 963940554896 | Note: No Note +Phone: 963934825832 | Note: No Note +Phone: 963980823984 | Note: No Note +Phone: 963993761215 | Note: No Note +Phone: 963+96399339 | Note: No Note +Phone: 963992811392 | Note: No Note +Phone: 963993292569 | Note: No Note +Phone: 963985774901 | Note: No Note +Phone: 963992475789 | Note: No Note +Phone: 963995953364 | Note: No Note +Phone: 96385166225 | Note: No Note +Phone: 96398516622 | Note: No Note +Phone: 963935689658 | Note: No Note +Phone: 963933572705 | Note: No Note +Phone: 963935722215 | Note: No Note +Phone: 963981140916 | Note: No Note +Phone: 963985215116 | Note: No Note +Phone: 963932762035 | Note: No Note +Phone: 963946120103 | Note: No Note +Phone: 963933818455 | Note: No Note +Phone: 963964858616 | Note: No Note +Phone: 963944390916 | Note: No Note +Phone: 963945739489 | Note: No Note +Phone: 963932776772 | Note: No Note +Phone: 963933333813 | Note: No Note +Phone: 963980874584 | Note: No Note +Phone: 963980294990 | Note: No Note +Phone: 963934185580 | Note: No Note +Phone: 963936921204 | Note: No Note +Phone: 963093554127 | Note: No Note +Phone: 963095965191 | Note: No Note +Phone: 963093352887 | Note: No Note +Phone: 963988128853 | Note: No Note +Phone: 963094729812 | Note: No Note +Phone: 963998748039 | Note: No Note +Phone: 963955374066 | Note: تم +Phone: 963095537406 | Note: No Note +Phone: 963949005027 | Note: تم +Phone: 963959651915 | Note: لاااااا +Phone: 963094906005 | Note: No Note +Phone: 963988617564 | Note: No Note +Phone: 963992652773 | Note: No Note +Phone: 963996727211 | Note: No Note +Phone: 963991363270 | Note: No Note +Phone: 963946790074 | Note: No Note +Phone: 963939297072 | Note: No Note +Phone: 963991197416 | Note: No Note +Phone: 963980362067 | Note: No Note +Phone: 963987076781 | Note: No Note +Phone: 963945458695 | Note: No Note +Phone: 963936408390 | Note: No Note +Phone: 963991431763 | Note: No Note +Phone: 963964795089 | Note: No Note +Phone: 963965800050 | Note: No Note +Phone: 963953677959 | Note: No Note +Phone: 963099310584 | Note: No Note +Phone: 963934108410 | Note: No Note +Phone: 963944498647 | Note: No Note +Phone: 963943569855 | Note: No Note +Phone: 963992000214 | Note: No Note +Phone: 963988733184 | Note: No Note +Phone: 963997357928 | Note: No Note +Phone: 963968217127 | Note: No Note +Phone: 963984213886 | Note: No Note +Phone: 963969955380 | Note: No Note +Phone: 963093039426 | Note: No Note +Phone: 963993067534 | Note: No Note +Phone: 963996882906 | Note: No Note +Phone: 963930981086 | Note: No Note +Phone: 2979639929 | Note: No Note +Phone: 963948320564 | Note: No Note +Phone: 963933236526 | Note: No Note +Phone: 963935731025 | Note: No Note +Phone: 963940005693 | Note: No Note +Phone: 963093435196 | Note: No Note +Phone: 963933147140 | Note: رح يكمل تسجيل +Phone: 963982950096 | Note: عم يصلح سيارتو بس تجهز رح يكمل تسجيل +Phone: 963992304426 | Note: سيارتو جيب مصروفات كبير +Phone: 963093412182 | Note: رقمو غلط +Phone: 963944707024 | Note: راح النت من عندو واليوم رح يرجع يسجل +Phone: 963997952574 | Note: No Note +Phone: 963932863040 | Note: سيارتو بالتصليح +Phone: 963942074619 | Note: مابدو +Phone: 963934146486 | Note: تم التواصل +Phone: 963992566299 | Note: تم التواصل +Phone: 96348‏‪94573 | Note: رقم غلط +Phone: 963933383373 | Note: تم التواصل +Phone: 963962419880 | Note: تم التواصل +Phone: 963938105556 | Note: تم التواصل +Phone: 963981347112 | Note: تم التواصل +Phone: 963959052791 | Note: تم التواصل +Phone: 963949608050 | Note: تم التواصل +Phone: 963998977934 | Note: تم التواصل +Phone: 963931839232 | Note: تم التواصل +Phone: 963935140176 | Note: تم التواصل +Phone: 963932033543 | Note: تم التواصل +Phone: 963991172711 | Note: تم التواصل +Phone: 963959164134 | Note: تم التواصل +Phone: 963943919419 | Note: ماعندو واتس رقمو مسكر +Phone: 963994000556 | Note: تم التواصل +Phone: 963098084512 | Note: رقم غلط +Phone: 963932254575 | Note: تم التواصل +Phone: 963945117692 | Note: تم التواصل +Phone: 963932119678 | Note: تم التواصل +Phone: 963993034046 | Note: تم التواصل +Phone: 963954183741 | Note: تم التواصل +Phone: 963951433826 | Note: ماعندو واتس خطو مسكر +Phone: 963093661085 | Note: رقم غلط +Phone: 963998287801 | Note: تم التواصل +Phone: 963988912182 | Note: ماعندو واتس +Phone: 963996024113 | Note: تم التواصل +Phone: 963931677655 | Note: تم التواصل +Phone: 963933921336 | Note: تم التواصل +Phone: 963936374163 | Note: تم التواصل +Phone: 963942047365 | Note: تم التواصل +Phone: 963981360800 | Note: تم التواصل +Phone: 963956396223 | Note: تم التواصل +Phone: 963963899416 | Note: رقم غلط +Phone: 963934493911 | Note: تم التواصل +Phone: 963934950868 | Note: تم التواصل +Phone: 963936659081 | Note: تم التواصل +Phone: 963945973939 | Note: تم التواصل +Phone: 963983444102 | Note: تم التواصل +Phone: 963951844719 | Note: تم التواصل +Phone: 963932663633 | Note: تم التواصل +Phone: 963093266363 | Note: رقم غلط +Phone: 963937271849 | Note: تم التواصل معو بيك اب +Phone: 963938728361 | Note: تم التواصل +Phone: 963947640146 | Note: تم التواصل +Phone: 963992439500 | Note: No Note +Phone: 963997489672 | Note: تم التواصل +Phone: 963094850489 | Note: رقم غلط +Phone: 963990115156 | Note: تم التواصل +Phone: 963962311317 | Note: ماعندو واتس وخطو مسكر +Phone: 963093172947 | Note: الرقم غلط +Phone: 963993762515 | Note: تم التواصل +Phone: 963931799545 | Note: تم التواصل +Phone: 963945187714 | Note: تم التواصل +Phone: 963968911015 | Note: ماعندو واتس رقمو مسكر +Phone: 963944750715 | Note: تم التواصل +Phone: 963998134492 | Note: تم التواصل +Phone: 963099813449 | Note: رقمو غلط +Phone: 963932727476 | Note: تم التواصل +Phone: 963933518336 | Note: تم التواصل +Phone: 963998885309 | Note: تم التواصل +Phone: 963988248185 | Note: تم التواصل +Phone: 963093067938 | Note: No Note +Phone: 963981383714 | Note: تم التواصل +Phone: 963939362191 | Note: رقمو مغلق وماعندو واتس +Phone: 963933440323 | Note: تم التواصل +Phone: 963982143227 | Note: تم التواصل +Phone: 963938145916 | Note: تم التواصل +Phone: 963933718454 | Note: تم التواصل +Phone: 963931800533 | Note: تم التواصل +Phone: 963934294133 | Note: تم التواصل +Phone: 963939808314 | Note: رقم غلط ومسكر خطو +Phone: 963935745914 | Note: تم التواصل +Phone: 963969902667 | Note: تم التواصل +Phone: 963933735326 | Note: ماعندو واتس رقمو غلط +Phone: 963998699541 | Note: تم التواصل +Phone: 963093333839 | Note: رقم غلط +Phone: 963966313126 | Note: تم التواصل +Phone: 963956451887 | Note: تم التواصل +Phone: 963967415296 | Note: تم التواصل +Phone: 963997766064 | Note: تم التواصل +Phone: 963962854801 | Note: تم التواصل +Phone: 963998190089 | Note: تم التواصل +Phone: 963981634358 | Note: تم التواصل +Phone: 963938289156 | Note: تم التواصل +Phone: 963095645188 | Note: رقم غلط +Phone: 963936908818 | Note: تم التواصل +Phone: 963941385190 | Note: تم التواصل +Phone: 963009639885 | Note: رقم غلط +Phone: 963935777750 | Note: تم التواصل +Phone: 963985578199 | Note: تم التواصل +Phone: 963099317895 | Note: رقم غلط +Phone: 963990417834 | Note: تم التواصل +Phone: 963093727184 | Note: رقم غلط +Phone: 963968750666 | Note: ماعندو واتس ورقمو مسكر +Phone: 963998668125 | Note: تم التواصل +Phone: 963991833068 | Note: تم التواصل +Phone: 963940740151 | Note: ماعندي واتس ورقمو مسكر +Phone: 963955544813 | Note: تم التواصل +Phone: 963933202022 | Note: ماعندو واتساب ورخطو مسكر +Phone: 963933221881 | Note: ماعندو واتس وخطو مسكر +Phone: 963943358179 | Note: تم التواصل +Phone: 963+96393349 | Note: رقم غلط +Phone: 963933804760 | Note: تم التواصل +Phone: 963988214321 | Note: تم التواصل +Phone: 963991903251 | Note: تم التواصل +Phone: 963933400489 | Note: تم التواصل +Phone: 963940340848 | Note: تم التواصل +Phone: 963992458425 | Note: تم التواصل +Phone: 963932555452 | Note: تم التواصل +Phone: 963965218471 | Note: تم التواصل +Phone: 963933292470 | Note: تم التواصل +Phone: 963943889236 | Note: تم التواصل وكمل تسجيلو +Phone: 963988133863 | Note: تم التواصل +Phone: 963094444810 | Note: رقمو غلط +Phone: 963930946809 | Note: تم التواصل +Phone: 963968191496 | Note: تم التواصل +Phone: 963935090886 | Note: تم التواصل +Phone: 963991922952 | Note: تم التواصل +Phone: 963991112991 | Note: تم التواصل +Phone: 963986170776 | Note: تم التواصل +Phone: 963999743765 | Note: تم التواصل +Phone: 963932111786 | Note: تم التواصل +Phone: 963933681672 | Note: تم التواصل +Phone: 963938552167 | Note: تم التواصل +Phone: 963933206306 | Note: تم التواصل +Phone: 963957346118 | Note: تم التواصل +Phone: 963997392413 | Note: تم التواصل +Phone: 963988227272 | Note: تم التواصل +Phone: 963988029059 | Note: تم التواصل +Phone: 963945832988 | Note: تم التواصل +Phone: 963997944590 | Note: تم التواصل +Phone: 963980363715 | Note: تم التواصل +Phone: 963935102639 | Note: تم التواصل +Phone: 963954438781 | Note: تم التواصل +Phone: 963945223878 | Note: تم التواصل +Phone: 963980581094 | Note: تم التواصل +Phone: 963939164164 | Note: تم التواصل +Phone: 963938124006 | Note: تم التواصل +Phone: 963944349036 | Note: تم التواصل +Phone: 963992057768 | Note: غير مهتم +Phone: 963988177909 | Note: تم التواصل +Phone: 963932049144 | Note: No Note +Phone: 963992393038 | Note: No Note +Phone: 963952391236 | Note: No Note +Phone: 963935039644 | Note: No Note +Phone: 963985924850 | Note: No Note +Phone: 963932377014 | Note: No Note +Phone: 963993235215 | Note: No Note +Phone: 963980541950 | Note: No Note +Phone: 963945957334 | Note: No Note +Phone: 963981355144 | Note: No Note +Phone: 963938139830 | Note: No Note +Phone: 963932562745 | Note: No Note +Phone: 963994661362 | Note: No Note +Phone: 963988342603 | Note: No Note +Phone: 963994011134 | Note: No Note +Phone: 963936104080 | Note: No Note +Phone: 963992788749 | Note: No Note +Phone: 963998892720 | Note: No Note +Phone: 963996682748 | Note: No Note +Phone: 963938570002 | Note: No Note +Phone: 963931745699 | Note: No Note +Phone: 963992165521 | Note: No Note +Phone: 963993595631 | Note: No Note +Phone: 963933949753 | Note: No Note +Phone: 963934629935 | Note: No Note +Phone: 963965778887 | Note: اجدب +Phone: 963980212534 | Note: No Note +Phone: 963956784191 | Note: No Note +Phone: 963935443899 | Note: No Note +Phone: 963958642713 | Note: No Note +Phone: 963999138915 | Note: No Note +Phone: 963948941187 | Note: No Note +Phone: 963953459606 | Note: تم +Phone: 963934146288 | Note: تم +Phone: 963933256528 | Note: تم +Phone: 963998883027 | Note: تم +Phone: 963968481449 | Note: تم +Phone: 963965247307 | Note: ما معو سيارة +Phone: 963956761624 | Note: تم +Phone: 963939724962 | Note: تم +Phone: 963936030548 | Note: تم +Phone: 962781821306 | Note: خطأ +Phone: 963960040775 | Note: No Note +Phone: 963996642236 | Note: No Note +Phone: 963934293954 | Note: تم +Phone: 963934928537 | Note: تم +Phone: 963941440312 | Note: No Note +Phone: 963937214172 | Note: No Note +Phone: 963933824331 | Note: No Note +Phone: 963945555043 | Note: No Note +Phone: 963938676742 | Note: تم +Phone: 963933306898 | Note: تم +Phone: 963933708476 | Note: No Note +Phone: 963994795950 | Note: No Note +Phone: 963990329520 | Note: تم +Phone: 963960977309 | Note: تم +Phone: 963933267955 | Note: تم +Phone: 963996186195 | Note: تم +Phone: 916364908545 | Note: تم +Phone: 919154792575 | Note: تم +Phone: 963998119558 | Note: تم +Phone: 919606970074 | Note: خطأ +Phone: 916364908621 | Note: خطأ +Phone: 962772735902 | Note: No Note +Phone: 916366356713 | Note: No Note +Phone: 16693334444 | Note: No Note +Phone: 962782700835 | Note: No Note +Phone: 962782070515 | Note: No Note +Phone: 963984429412 | Note: No Note +Phone: 963966673673 | Note: No Note +Phone: 962796377987 | Note: No Note +Phone: 963947222548 | Note: No Note +Phone: 639276036618 | Note: No Note +Phone: 963798583052 | Note: No Note diff --git a/backend/serviceapp/editCarPlate.php b/backend/serviceapp/editCarPlate.php new file mode 100755 index 0000000..230cda5 --- /dev/null +++ b/backend/serviceapp/editCarPlate.php @@ -0,0 +1,64 @@ +encryptData(filterRequest("carPlate")); +$color = filterRequest("color"); +$color_hex = filterRequest("color_hex"); +$make = filterRequest("make"); +$model = filterRequest("model"); +$expiration_date = filterRequest("expiration_date"); +$owner = $encryptionHelper->encryptData(filterRequest("owner")); +$year = filterRequest("year"); +$employee = filterRequest("employee"); + +// تحديث CarRegistration +$sqlUpdate = " + UPDATE `CarRegistration` + SET + `car_plate` = :carPlate, + `color` = :color, + `color_hex` = :color_hex, + `make` = :make, + `model` = :model, + `year` = :year, + `expiration_date` = :expiration_date, + `owner` = :owner + WHERE `driverID` = :driverId"; + +$stmtUpdate = $con->prepare($sqlUpdate); +$stmtUpdate->execute([ + ':carPlate' => $carPlate, + ':color' => $color, + ':color_hex' => $color_hex, + ':make' => $make, + ':model' => $model, + ':year' => $year, + ':expiration_date' => $expiration_date, + ':owner' => $owner, + ':driverId' => $driverId +]); + +if ($stmtUpdate->rowCount() > 0) { + // تسجيل التعديل + $sqlInsert = "INSERT INTO `carPlateEdit` + (`driverId`, `carPlate`, `color`, `make`, `model`, `expiration_date`, `owner`, `year`, `employee`, `isEdit`) + VALUES (:driverId, :carPlate, :color, :make, :model, :expiration_date, :owner, :year, :employee, 1)"; + $stmtInsert = $con->prepare($sqlInsert); + $stmtInsert->execute([ + ':driverId' => $driverId, + ':carPlate' => $carPlate, + ':color' => $color, + ':make' => $make, + ':model' => $model, + ':expiration_date' => $expiration_date, + ':owner' => $owner, + ':year' => $year, + ':employee' => $employee + ]); + + jsonSuccess(null, "Car data updated and edit logged successfully."); +} else { + jsonError("No changes were made to the car data."); +} \ No newline at end of file diff --git a/backend/serviceapp/getCarPlateNotEdit.php b/backend/serviceapp/getCarPlateNotEdit.php new file mode 100755 index 0000000..0af93a9 --- /dev/null +++ b/backend/serviceapp/getCarPlateNotEdit.php @@ -0,0 +1,54 @@ +prepare($sql); +$stmt->execute(); + +if ($stmt->rowCount() > 0) { + $rows = $stmt->fetchAll(PDO::FETCH_ASSOC); + + foreach ($rows as &$row) { + $row['vin'] = $encryptionHelper->decryptData($row['vin']); + $row['car_plate'] = $encryptionHelper->decryptData($row['car_plate']); + $row['owner'] = $encryptionHelper->decryptData($row['owner']); + $row['address'] = $encryptionHelper->decryptData($row['address']); + $row['phone'] = $encryptionHelper->decryptData($row['phone']); + } + + jsonSuccess($rows); +} else { + jsonError($message = "No Car verified yet found"); +} +?> diff --git a/backend/serviceapp/getComplaintAllData.php b/backend/serviceapp/getComplaintAllData.php new file mode 100644 index 0000000..6fe69a3 --- /dev/null +++ b/backend/serviceapp/getComplaintAllData.php @@ -0,0 +1,148 @@ +prepare($sql); + $stmt->execute(); + $row = $stmt->fetchAll(PDO::FETCH_ASSOC); + + if ($row) { + foreach ($row as &$item) { + foreach (['passengerName', 'driverName', 'driverToken', 'passengerToken'] as $field) { + if (!empty($item[$field])) { + $dec = $encryptionHelper->decryptData($item[$field]); + if ($dec) + $item[$field] = $dec; + } + } + } + jsonSuccess($row); + } else { + jsonSuccess([], "No complaints found"); + } +} catch (Exception $e) { + jsonError("Database error: " . $e->getMessage()); +} \ No newline at end of file diff --git a/backend/serviceapp/getComplaintAllDataForDriver.php b/backend/serviceapp/getComplaintAllDataForDriver.php new file mode 100644 index 0000000..fd2dee6 --- /dev/null +++ b/backend/serviceapp/getComplaintAllDataForDriver.php @@ -0,0 +1,185 @@ +prepare($sql); +$stmt->execute(); + +if ($stmt->rowCount() > 0) { + $row = $stmt->fetchAll(PDO::FETCH_ASSOC); + + foreach ($row as &$item) { + if (isset($item['passengerName'])) { + $item['passengerName'] = $encryptionHelper->decryptData($item['passengerName']); + } + if (isset($item['driverName'])) { + $item['driverName'] = $encryptionHelper->decryptData($item['driverName']); + } + if (isset($item['gender'])) { + $item['gender'] = $encryptionHelper->decryptData($item['gender']); + } + if (isset($item['driverToken'])) { + $item['driverToken'] = $encryptionHelper->decryptData($item['driverToken']); + } + if (isset($item['passengerToken'])) { + $item['passengerToken'] = $encryptionHelper->decryptData($item['passengerToken']); + } + } + + jsonSuccess($row); +} else { + jsonError($message = $sql); +} +?> \ No newline at end of file diff --git a/backend/serviceapp/getDriverByNational.php b/backend/serviceapp/getDriverByNational.php new file mode 100755 index 0000000..dd1815e --- /dev/null +++ b/backend/serviceapp/getDriverByNational.php @@ -0,0 +1,125 @@ +encryptData($national_number); + +$sql = "SELECT + COALESCE( + ( + SELECT COUNT(*) FROM `ride` WHERE `ride`.`driver_id` = d.id + ), + 0) AS countRide, + + COALESCE( + ( + SELECT AVG(`ratingDriver`.`rating`) + FROM ratingDriver + WHERE `ratingDriver`.`driver_id` = d.id + ), + 0) AS rating, + + COALESCE( + ( + SELECT SUM(pd.amount) + FROM `payments` pd + WHERE pd.driverID = d.id + ), + 0) AS totalPayment, + + COALESCE( + ( + SELECT SUM(dw.amount) + FROM `driverWallet` dw + WHERE dw.driverID = d.id + ), + 0) AS totalDriverWallet, + + COALESCE( + ( + SELECT COUNT(*) + FROM complaint + WHERE complaint.driver_id = d.id + ), + 0) AS countComplaint, + + COALESCE( + ( + SELECT COUNT(*) + FROM driver_ride_scam scam + WHERE scam.driverID = d.id + ), + 0) AS countScam, + + COALESCE( + ( + SELECT complaint.description + FROM complaint + WHERE complaint.driver_id = d.id + ORDER BY complaint.date_resolved DESC + LIMIT 1 + ), + '' + ) AS complaint, + + COALESCE( + ( + SELECT COUNT(*) + FROM ratingPassenger + WHERE ratingPassenger.driverID = d.id + ), + 0) AS DRatingPassengersCount, + + COALESCE( + ( + SELECT AVG(ratingPassenger.rating) + FROM ratingPassenger + WHERE ratingPassenger.driverID = d.id + ), + 0) AS avgDRatingPassenger, + + cr.*, + d.* +FROM driver d +LEFT JOIN CarRegistration cr ON cr.driverID = d.id +WHERE d.national_number = :national_number; +"; +// 3. تم تعديل الشرط أعلاه للبحث بالرقم الوطني + +$stmt = $con->prepare($sql); +// 4. ربط الباراميتر الجديد +$stmt->bindParam(':national_number', $encryptedNationalNumber); +$stmt->execute(); + +if ($stmt->rowCount() > 0) { + $row = $stmt->fetchAll(PDO::FETCH_ASSOC); + + // فك تشفير الحقول المهمة + foreach ($row as &$r) { + if (isset($r['phone'])) $r['phone'] = $encryptionHelper->decryptData($r['phone']); + if (isset($r['email'])) $r['email'] = $encryptionHelper->decryptData($r['email']); + if (isset($r['first_name'])) $r['first_name'] = $encryptionHelper->decryptData($r['first_name']); + if (isset($r['last_name'])) $r['last_name'] = $encryptionHelper->decryptData($r['last_name']); + if (isset($r['gender'])) $r['gender'] = $encryptionHelper->decryptData($r['gender']); + if (isset($r['birthdate'])) $r['birthdate'] = $encryptionHelper->decryptData($r['birthdate']); + if (isset($r['site'])) $r['site'] = $encryptionHelper->decryptData($r['site']); + if (isset($r['name_arabic'])) $r['name_arabic'] = $encryptionHelper->decryptData($r['name_arabic']); + if (isset($r['national_number'])) $r['national_number'] = $encryptionHelper->decryptData($r['national_number']); + if (isset($r['maritalStatus'])) $r['maritalStatus'] = $encryptionHelper->decryptData($r['maritalStatus']); + if (isset($r['sosPhone'])) $r['sosPhone'] = $encryptionHelper->decryptData($r['sosPhone']); + if (isset($r['car_plate'])) $r['car_plate'] = $encryptionHelper->decryptData($r['car_plate']); + if (isset($r['owner'])) $r['owner'] = $encryptionHelper->decryptData($r['owner']); + if (isset($r['address'])) $r['address'] = $encryptionHelper->decryptData($r['address']); + if (isset($r['vin'])) $r['vin'] = $encryptionHelper->decryptData($r['vin']); + unset($r['password']); + } + + jsonSuccess($row); +} else { + // يمكنك تعديل الرسالة لتكون "No driver found" بدلاً من wallet record + jsonError("No record found for this national number"); +} +?> \ No newline at end of file diff --git a/backend/serviceapp/getDriverByPhone.php b/backend/serviceapp/getDriverByPhone.php new file mode 100644 index 0000000..6727a3c --- /dev/null +++ b/backend/serviceapp/getDriverByPhone.php @@ -0,0 +1,122 @@ +encryptData($phone); // تشفير الهاتف + +$sql = "SELECT + COALESCE( + ( + SELECT COUNT(*) FROM `ride` WHERE `ride`.`driver_id` = d.id + ), + 0) AS countRide, + + COALESCE( + ( + SELECT AVG(`ratingDriver`.`rating`) + FROM ratingDriver + WHERE `ratingDriver`.`driver_id` = d.id + ), + 0) AS rating, + + COALESCE( + ( + SELECT SUM(pd.amount) + FROM `payments` pd + WHERE pd.driverID = d.id + ), + 0) AS totalPayment, + + COALESCE( + ( + SELECT SUM(dw.amount) + FROM `driverWallet` dw + WHERE dw.driverID = d.id + ), + 0) AS totalDriverWallet, + + COALESCE( + ( + SELECT COUNT(*) + FROM complaint + WHERE complaint.driver_id = d.id + ), + 0) AS countComplaint, + + COALESCE( + ( + SELECT COUNT(*) + FROM driver_ride_scam scam + WHERE scam.driverID = d.id + ), + 0) AS countScam, + + COALESCE( + ( + SELECT complaint.description + FROM complaint + WHERE complaint.driver_id = d.id + ORDER BY complaint.date_resolved DESC + LIMIT 1 + ), + '' + ) AS complaint, + + COALESCE( + ( + SELECT COUNT(*) + FROM ratingPassenger + WHERE ratingPassenger.driverID = d.id + ), + 0) AS DRatingPassengersCount, + + COALESCE( + ( + SELECT AVG(ratingPassenger.rating) + FROM ratingPassenger + WHERE ratingPassenger.driverID = d.id + ), + 0) AS avgDRatingPassenger, + + cr.*, + d.* +FROM driver d +LEFT JOIN CarRegistration cr ON cr.driverID = d.id +WHERE d.phone = :phone; +"; + +$stmt = $con->prepare($sql); +$stmt->bindParam(':phone', $encryptedPhone); +$stmt->execute(); + +if ($stmt->rowCount() > 0) { + $row = $stmt->fetchAll(PDO::FETCH_ASSOC); + + // فك تشفير الحقول المهمة + foreach ($row as &$r) { + if (isset($r['phone'])) $r['phone'] = $encryptionHelper->decryptData($r['phone']); + if (isset($r['email'])) $r['email'] = $encryptionHelper->decryptData($r['email']); + if (isset($r['first_name'])) $r['first_name'] = $encryptionHelper->decryptData($r['first_name']); + if (isset($r['last_name'])) $r['last_name'] = $encryptionHelper->decryptData($r['last_name']); + if (isset($r['gender'])) $r['gender'] = $encryptionHelper->decryptData($r['gender']); + if (isset($r['birthdate'])) $r['birthdate'] = $encryptionHelper->decryptData($r['birthdate']); + if (isset($r['site'])) $r['site'] = $encryptionHelper->decryptData($r['site']); + if (isset($r['name_arabic'])) $r['name_arabic'] = $encryptionHelper->decryptData($r['name_arabic']); + if (isset($r['national_number'])) $r['national_number'] = $encryptionHelper->decryptData($r['national_number']); + if (isset($r['maritalStatus'])) $r['maritalStatus'] = $encryptionHelper->decryptData($r['maritalStatus']); + if (isset($r['sosPhone'])) $r['sosPhone'] = $encryptionHelper->decryptData($r['sosPhone']); + if (isset($r['car_plate'])) $r['car_plate'] = $encryptionHelper->decryptData($r['car_plate']); + if (isset($r['owner'])) $r['owner'] = $encryptionHelper->decryptData($r['owner']); + if (isset($r['address'])) $r['address'] = $encryptionHelper->decryptData($r['address']); + if (isset($r['vin'])) $r['vin'] = $encryptionHelper->decryptData($r['vin']); + if (isset($r['accountBank'])) $r['accountBank'] = $encryptionHelper->decryptData($r['accountBank']); + if (isset($r['bankCode'])) $r['bankCode'] = $encryptionHelper->decryptData($r['bankCode']); + unset($r['password']); + + } + + jsonSuccess($row); +} else { + jsonError("No wallet record found"); +} +?> \ No newline at end of file diff --git a/backend/serviceapp/getDriverDetailsForActivate.php b/backend/serviceapp/getDriverDetailsForActivate.php new file mode 100755 index 0000000..82a64a8 --- /dev/null +++ b/backend/serviceapp/getDriverDetailsForActivate.php @@ -0,0 +1,45 @@ +prepare($sql); +$stmt->execute([':driverId' => $driverId]); + +if ($stmt->rowCount() > 0) { + $row = $stmt->fetch(PDO::FETCH_ASSOC); + + // فك التشفير للحقول المطلوبة + $fieldsToDecrypt = [ + 'phone','email','gender','national_number','first_name','last_name', + 'name_arabic','address','site','vin','car_plate','owner' + ]; + foreach ($fieldsToDecrypt as $field) { + if (isset($row[$field]) && $row[$field] !== '') { + try { + $row[$field] = $encryptionHelper->decryptData($row[$field]); + } catch (Exception $e) { + $row[$field] = "Decryption Failed"; + } + } + } + + // ✅ إزالة الحقول الحسّاسة من الاستجابة + $fieldsToRemove = ['password', 'password_hash', 'salt', 'reset_token']; + foreach ($fieldsToRemove as $f) { + if (array_key_exists($f, $row)) { + unset($row[$f]); + } + } + + // إرسال الاستجابة + jsonSuccess([$row]); + +} else { + jsonError("No data found for the specified driver ID"); +} \ No newline at end of file diff --git a/backend/serviceapp/getDriverNotCompleteRegistration.php b/backend/serviceapp/getDriverNotCompleteRegistration.php new file mode 100755 index 0000000..d458def --- /dev/null +++ b/backend/serviceapp/getDriverNotCompleteRegistration.php @@ -0,0 +1,45 @@ +prepare($sql); +$stmt->execute(); + +if ($stmt->rowCount() > 0) { + $rows = $stmt->fetchAll(PDO::FETCH_ASSOC); + + // فك تشفير أرقام الهواتف فقط للإخراج + foreach ($rows as &$row) { + if (!empty($row['phone'])) { + $row['phone'] = $encryptionHelper->decryptData($row['phone']); + } + if (!empty($row['email'])) { + $row['email'] = $encryptionHelper->decryptData($row['email']); + } + if (isset($row['phone_number'])) { + $row['phone_number'] = $encryptionHelper->decryptData($row['phone_number']); + } + } + + + jsonSuccess($rows); +} else { + jsonError("No Phone verified yet found"); +} +?> \ No newline at end of file diff --git a/backend/serviceapp/getDriversPhoneNotComplete.php b/backend/serviceapp/getDriversPhoneNotComplete.php new file mode 100755 index 0000000..d3a5793 --- /dev/null +++ b/backend/serviceapp/getDriversPhoneNotComplete.php @@ -0,0 +1,56 @@ += (NOW() - INTERVAL 6 DAY) -- تم الإنشاء خلال آخر 3 أيام +ORDER BY RAND() +LIMIT 1; + +"; + +$stmt = $con->prepare($sql); +$stmt->execute(); + +if ($stmt->rowCount() > 0) { + + $rows = $stmt->fetchAll(PDO::FETCH_ASSOC); + + // فك تشفير أرقام الهاتف والإيميل + foreach ($rows as &$r) { + + if (isset($r['phone_number']) && $r['phone_number'] != null) { + $r['phone_number'] = $encryptionHelper->decryptData($r['phone_number']); + } + + if (isset($r['email']) && $r['email'] != null) { + $r['email'] = $encryptionHelper->decryptData($r['email']); + } + } + + jsonSuccess($rows); + +} else { + jsonError("No phone numbers found in the last 5 days"); +} +?> diff --git a/backend/serviceapp/getDriversWaitingActive.php b/backend/serviceapp/getDriversWaitingActive.php new file mode 100755 index 0000000..acb672e --- /dev/null +++ b/backend/serviceapp/getDriversWaitingActive.php @@ -0,0 +1,32 @@ +prepare($sql); +$stmt->execute(); + +if ($stmt->rowCount() > 0) { + $rows = $stmt->fetchAll(PDO::FETCH_ASSOC); + + // فك تشفير أرقام الهواتف فقط للإخراج + foreach ($rows as &$row) { + if (!empty($row['phone_number'])) { + $row['phone_number'] = $encryptionHelper->decryptData($row['phone_number']); + } + if (!empty($row['first_name'])) { + $row['first_name'] = $encryptionHelper->decryptData($row['first_name']); + } + if (isset($row['last_name'])) { + $row['last_name'] = $encryptionHelper->decryptData($row['last_name']); + } + } + + + jsonSuccess($rows); +} else { + jsonError("No Phone verified yet found"); +} +?> \ No newline at end of file diff --git a/backend/serviceapp/getEditorStatsCalls.php b/backend/serviceapp/getEditorStatsCalls.php new file mode 100755 index 0000000..0b2021b --- /dev/null +++ b/backend/serviceapp/getEditorStatsCalls.php @@ -0,0 +1,50 @@ +prepare($sql); + $stmt->execute(); + $data = $stmt->fetchAll(PDO::FETCH_ASSOC); + + if ($data) { + echo json_encode(array("status" => "success", "message" => $data)); + } else { + echo json_encode(array("status" => "success", "message" => [])); + } +} catch (PDOException $e) { + echo json_encode(array("status" => "failure", "message" => $e->getMessage())); +} +?> \ No newline at end of file diff --git a/backend/serviceapp/getEmployeeDriverAfterCallingRegister.php b/backend/serviceapp/getEmployeeDriverAfterCallingRegister.php new file mode 100755 index 0000000..6452cdb --- /dev/null +++ b/backend/serviceapp/getEmployeeDriverAfterCallingRegister.php @@ -0,0 +1,62 @@ += '$start_date' + AND DATE(created_at) <= '$end_date' + GROUP BY + employmentType"; + +try { + $stmt = $con->prepare($sql); + $stmt->execute(); + $stats_data = $stmt->fetchAll(PDO::FETCH_ASSOC); + + if ($stats_data) { + // طباعة البيانات كـ JSON مع إضافة التواريخ المستخدمة للعلم + printSuccess([ + "data" => $stats_data, + "period" => [ + "start" => $start_date, + "end" => $end_date + ] + ]); + } else { + jsonError("No data found for the selected period"); + } + +} catch (PDOException $e) { + // في حال حدوث خطأ في قاعدة البيانات + jsonError("Database error: " . $e->getMessage()); +} +?> \ No newline at end of file diff --git a/backend/serviceapp/getEmployeeStatic.php b/backend/serviceapp/getEmployeeStatic.php new file mode 100755 index 0000000..b2dfe89 --- /dev/null +++ b/backend/serviceapp/getEmployeeStatic.php @@ -0,0 +1,43 @@ += '$first_day_of_month' + AND DATE(d.created_at) <= '$last_day_of_month' +GROUP BY + `date`, d.`maritalStatus` +ORDER BY + `date` ASC; +"; + +$stmt = $con->prepare($sql); +$stmt->execute(); +$passenger_data = $stmt->fetchAll(PDO::FETCH_ASSOC); + +if ($passenger_data) { + // طباعة البيانات كـ JSON + jsonSuccess($data = $passenger_data); +} else { + // طباعة رسالة فشل + jsonError($message = "No data found"); +} +?> \ No newline at end of file diff --git a/backend/serviceapp/getJsonFile.php b/backend/serviceapp/getJsonFile.php new file mode 100755 index 0000000..7496488 --- /dev/null +++ b/backend/serviceapp/getJsonFile.php @@ -0,0 +1,89 @@ += DATE_SUB(NOW(), INTERVAL 5 DAY) +ORDER BY + pv.created_at DESC; +"; + +$stmt = $con->prepare($sql); +$stmt->execute(); + +if ($stmt->rowCount() > 0) { + $rows = $stmt->fetchAll(PDO::FETCH_ASSOC); + + // فتح الملف للكتابة (Mode 'w' يقوم بإنشاء الملف أو مسح محتواه السابق والكتابة من جديد) + $fileHandle = fopen($filename, 'w'); + + // التحقق من أن الملف فُتح بنجاح + if ($fileHandle) { + + foreach ($rows as $r) { + $phone = ""; + $note = "No Note"; // القيمة الافتراضية إذا لم توجد ملاحظة + + // 1. فك تشفير رقم الهاتف + if (isset($r['phone_number']) && $r['phone_number'] != null) { + $phone = $encryptionHelper->decryptData($r['phone_number']); + } + + // 2. تجهيز نص الملاحظة + if (isset($r['note']) && $r['note'] != null) { + $note = $r['note']; + } + + // 3. تنسيق السطر الذي سيتم حفظه + // الشكل: Phone: 0123456789 | Note: مهتم بالتسجيل + $line = "Phone: " . $phone . " | Note: " . $note . PHP_EOL; + + // 4. الكتابة داخل الملف + fwrite($fileHandle, $line); + } + + // إغلاق الملف بعد الانتهاء + fclose($fileHandle); + + // طباعة رسالة نجاح مع رابط للملف (اختياري) + echo json_encode([ + "status" => "success", + "message" => "File created successfully", + "file" => $filename, + "count" => count($rows) + ]); + + } else { + jsonError("Unable to open file for writing."); + } + +} else { + jsonError("No phone numbers found in the last 5 days"); +} +?> \ No newline at end of file diff --git a/backend/serviceapp/getNewDriverRegister.php b/backend/serviceapp/getNewDriverRegister.php new file mode 100644 index 0000000..2879996 --- /dev/null +++ b/backend/serviceapp/getNewDriverRegister.php @@ -0,0 +1,73 @@ +prepare($sql); +$stmt->execute(); + +if ($stmt->rowCount() > 0) { + // Fetch the records + $rows = $stmt->fetchAll(PDO::FETCH_ASSOC); + +// فك التشفير للحقول الحساسة +foreach ($rows as &$row) { + $row['phone'] = $encryptionHelper->decryptData($row['phone']); + $row['email'] = $encryptionHelper->decryptData($row['email']); + $row['gender'] = $encryptionHelper->decryptData($row['gender']); + $row['birthdate'] = $encryptionHelper->decryptData($row['birthdate']); + $row['national_number'] = $encryptionHelper->decryptData($row['national_number']); + $row['site'] = $encryptionHelper->decryptData($row['site']); + $row['first_name'] = $encryptionHelper->decryptData($row['first_name']); + $row['last_name'] = $encryptionHelper->decryptData($row['last_name']); + // $row['employmentType'] = $encryptionHelper->decryptData($row['employmentType']); + // $row['maritalStatus'] = $encryptionHelper->decryptData($row['maritalStatus']); +} + +jsonSuccess($rows); +} else { + // Print a failure message + jsonError($message = "No Phone verified yet found"); +} + +?> \ No newline at end of file diff --git a/backend/serviceapp/getNotesForEmployee.php b/backend/serviceapp/getNotesForEmployee.php new file mode 100755 index 0000000..7c81e03 --- /dev/null +++ b/backend/serviceapp/getNotesForEmployee.php @@ -0,0 +1,38 @@ +prepare($sql); + $stmt->execute(); + $notes_data = $stmt->fetchAll(PDO::FETCH_ASSOC); + + if ($notes_data) { + // التصحيح: استخدام حلقة التكرار وتمرير الصف كمرجع (&) لتعديل البيانات الأصلية + foreach ($notes_data as &$row) { + // التأكد من وجود عمود الهاتف قبل فك التشفير + if (isset($row['phone'])) { + // استخدام دالة فك التشفير (تأكد أن الدالة decrypt موجودة في connect.php) + // أو استخدم $encryptionHelper->decryptData($row['phone']) إذا كنت تستخدم كلاس + $row['phone'] = $encryptionHelper->decryptData($row['phone']); + } + } + unset($row); // كسر الارتباط بالمتغير الأخير لضمان سلامة الكود + + jsonSuccess($notes_data); + } else { + jsonError("No notes found for this date"); + } + +} catch (PDOException $e) { + jsonError("Database error: " . $e->getMessage()); +} +?> \ No newline at end of file diff --git a/backend/serviceapp/getPackages.php b/backend/serviceapp/getPackages.php new file mode 100755 index 0000000..436d539 --- /dev/null +++ b/backend/serviceapp/getPackages.php @@ -0,0 +1,18 @@ +prepare($sql); +$stmt->execute(); +$passenger_data = $stmt->fetchAll(PDO::FETCH_ASSOC); + +if ($passenger_data) { + // Print the passenger data as JSON + jsonSuccess($data = $passenger_data); +} else { + // Print a failure message + jsonError($message = "No passenger data found"); +} +?> \ No newline at end of file diff --git a/backend/serviceapp/getPassengersByPhone.php b/backend/serviceapp/getPassengersByPhone.php new file mode 100644 index 0000000..5a9062a --- /dev/null +++ b/backend/serviceapp/getPassengersByPhone.php @@ -0,0 +1,80 @@ +encryptData($phone); + +$sql = "SELECT + p.*, + COALESCE(r.id, 0) AS ride_id, + COALESCE(r.start_location, '') AS start_location, + COALESCE(r.end_location, '') AS end_location, + COALESCE(r.date, '1970-01-01') AS ride_date, + COALESCE(r.time, '00:00:00') AS ride_time, + COALESCE(r.endtime, '00:00:00') AS ride_endtime, + COALESCE(r.price, 0) AS price, + COALESCE(r.passenger_id, 0) AS ride_passenger_id, + COALESCE(r.driver_id, 0) AS driver_id, + COALESCE(r.status, '') AS ride_status, + COALESCE(r.paymentMethod, '') AS ride_payment_method, + COALESCE(r.carType, '') AS car_type, + COALESCE(r.created_at, '1970-01-01 00:00:00') AS ride_created_at, + COALESCE(r.updated_at, '1970-01-01 00:00:00') AS ride_updated_at, + COALESCE(r.DriverIsGoingToPassenger, 0) AS driver_is_going_to_passenger, + COALESCE(r.rideTimeStart, '1970-01-01 00:00:00') AS ride_time_start, + COALESCE(r.rideTimeFinish, '1970-01-01 00:00:00') AS ride_time_finish, + COALESCE(r.price_for_driver, 0) AS price_for_driver, + COALESCE(r.price_for_passenger, 0) AS price_for_passenger, + COALESCE(r.distance, 0) AS distance, + COALESCE(pw.balance, 0) AS passenger_wallet_balance, + COALESCE(pay.amount, 0) AS passenger_payment_amount, + COALESCE(pay.payment_method, '') AS passenger_payment_method, + COALESCE(dw.amount, 0) AS driver_payment_amount, + COALESCE(dw.paymentMethod, '') AS driver_payment_method +FROM + passengers p +LEFT JOIN + ride r ON p.id = r.passenger_id +LEFT JOIN + passengerWallet pw ON p.id = pw.passenger_id +LEFT JOIN + payments pay ON r.id = pay.rideId +LEFT JOIN + driverWallet dw ON r.driver_id = dw.driverID AND pay.id = dw.paymentID +WHERE + p.phone = :phone + AND r.id = ( + SELECT id + FROM ride + WHERE passenger_id = p.id + ORDER BY date DESC, time DESC + LIMIT 1 + )"; + +$stmt = $con->prepare($sql); +$stmt->bindParam(':phone', $phoneEncrypted); +$stmt->execute(); + +if ($stmt->rowCount() > 0) { + $rows = $stmt->fetchAll(PDO::FETCH_ASSOC); + + // فك التشفير للحقول الحساسة + foreach ($rows as &$row) { + if (isset($row['phone'])) $row['phone'] = $encryptionHelper->decryptData($row['phone']); + if (isset($row['email'])) $row['email'] = $encryptionHelper->decryptData($row['email']); + if (isset($row['gender'])) $row['gender'] = $encryptionHelper->decryptData($row['gender']); + if (isset($row['birthdate'])) $row['birthdate'] = $encryptionHelper->decryptData($row['birthdate']); + if (isset($row['site'])) $row['site'] = $encryptionHelper->decryptData($row['site']); + if (isset($row['first_name'])) $row['first_name'] = $encryptionHelper->decryptData($row['first_name']); + if (isset($row['last_name'])) $row['last_name'] = $encryptionHelper->decryptData($row['last_name']); + if (isset($row['employmentType']))$row['employmentType'] = $encryptionHelper->decryptData($row['employmentType']); + if (isset($row['maritalStatus'])) $row['maritalStatus'] = $encryptionHelper->decryptData($row['maritalStatus']); + unset($r['password']); + } + + jsonSuccess($rows); +} else { + jsonError("No wallet record found"); +} +?> \ No newline at end of file diff --git a/backend/serviceapp/getPassengersNotCompleteRegistration.php b/backend/serviceapp/getPassengersNotCompleteRegistration.php new file mode 100644 index 0000000..5092572 --- /dev/null +++ b/backend/serviceapp/getPassengersNotCompleteRegistration.php @@ -0,0 +1,44 @@ += DATE_SUB(CURDATE(), INTERVAL 4 DAY) +ORDER BY + phone_verification_passenger.created_at DESC +LIMIT 25; +"; + +$stmt = $con->prepare($sql); +$stmt->execute(); + +$rows = $stmt->fetchAll(PDO::FETCH_ASSOC); + +// فك التشفير إذا كان مطلوباً (مثلاً إذا phone_number مشفّر) +foreach ($rows as &$row) { + if (isset($row['phone_number'])) { + $row['phone_number'] = $encryptionHelper->decryptData($row['phone_number']); + } + if (isset($row['note'])) { + $row['note'] = $encryptionHelper->decryptData($row['note']); // إذا كانت مضافة مشفّرة + } +} + +if ($rows) { + jsonSuccess($rows); +} else { + jsonError("No phone verified passengers found"); +} +?> \ No newline at end of file diff --git a/backend/serviceapp/getPassengersStatic.php b/backend/serviceapp/getPassengersStatic.php new file mode 100644 index 0000000..a30ae05 --- /dev/null +++ b/backend/serviceapp/getPassengersStatic.php @@ -0,0 +1,63 @@ +prepare($sql); + $stmt->execute(); + $passenger_data = $stmt->fetchAll(PDO::FETCH_ASSOC); + + if ($passenger_data) { + echo json_encode(array("status" => "success", "message" => $passenger_data)); + } else { + echo json_encode(array("status" => "success", "message" => [])); + } +} catch (PDOException $e) { + echo json_encode(array("status" => "failure", "message" => $e->getMessage())); +} +?> \ No newline at end of file diff --git a/backend/serviceapp/getRidesStatic.php b/backend/serviceapp/getRidesStatic.php new file mode 100755 index 0000000..a5dd1c3 --- /dev/null +++ b/backend/serviceapp/getRidesStatic.php @@ -0,0 +1,64 @@ += '$start_date' + AND ride.created_at <= '$end_date 23:59:59' + AND ride.status = 'Finished') AS totalMonthly + +FROM + date_series +LEFT JOIN + ride ON DATE(ride.created_at) = date_series.date + AND ride.status = 'Finished' +WHERE + date_series.date >= '$start_date' + AND date_series.date <= '$end_date' +GROUP BY + date_series.date +ORDER BY + date_series.date ASC; +"; + +$stmt = $con->prepare($sql); +$stmt->execute(); +$data = $stmt->fetchAll(PDO::FETCH_ASSOC); + +if ($data) { + jsonSuccess($data); +} else { + jsonError("No data found"); +} +?> \ No newline at end of file diff --git a/backend/serviceapp/getdriverWithoutCar.php b/backend/serviceapp/getdriverWithoutCar.php new file mode 100755 index 0000000..c4a69c6 --- /dev/null +++ b/backend/serviceapp/getdriverWithoutCar.php @@ -0,0 +1,30 @@ +prepare($sql); +$stmt->execute(); + +if ($stmt->rowCount() > 0) { + $rows = $stmt->fetchAll(PDO::FETCH_ASSOC); + + // فك التشفير للحقول الحساسة + foreach ($rows as &$row) { + $row['phone'] = $encryptionHelper->decryptData($row['phone']); + $row['name_arabic'] = $encryptionHelper->decryptData($row['name_arabic']); + } + + jsonSuccess($rows); +} else { + jsonError("No Car verified yet found"); +} \ No newline at end of file diff --git a/backend/serviceapp/getdriverstotalMonthly.php b/backend/serviceapp/getdriverstotalMonthly.php new file mode 100644 index 0000000..765b330 --- /dev/null +++ b/backend/serviceapp/getdriverstotalMonthly.php @@ -0,0 +1,101 @@ +prepare($sql); + $stmt->execute(); + $data = $stmt->fetchAll(PDO::FETCH_ASSOC); + + if ($data) { + echo json_encode(array("status" => "success", "message" => $data)); + } else { + echo json_encode(array("status" => "success", "message" => [])); + } +} catch (PDOException $e) { + echo json_encode(array("status" => "failure", "message" => $e->getMessage())); +} +?> \ No newline at end of file diff --git a/backend/serviceapp/login.php b/backend/serviceapp/login.php new file mode 100755 index 0000000..4904385 --- /dev/null +++ b/backend/serviceapp/login.php @@ -0,0 +1,104 @@ +prepare($sql); + $stmt->execute([':fp' => $fpHash]); + $user = $stmt->fetch(PDO::FETCH_ASSOC); + + if ($user) { + // التحقق من حالة الحساب + if ($user['status'] === 'pending') { + jsonError("حسابك قيد المراجعة حالياً. يرجى الانتظار للموافقة."); + exit(); + } elseif ($user['status'] === 'suspended') { + jsonError("هذا الحساب معلق. يرجى التواصل مع الإدارة."); + exit(); + } elseif ($user['status'] !== 'approved') { + jsonError("لم يتم تفعيل حسابك بعد."); + exit(); + } + + // التحقق من كلمة المرور + + if (password_verify($password, $user['password'])) { + + // فك تشفير البيانات للعرض في التطبيق + $user['first_name'] = $encryptionHelper->decryptData($user['first_name']) ?: $user['first_name']; + $user['last_name'] = $encryptionHelper->decryptData($user['last_name']) ?: $user['last_name']; + $user['email'] = $encryptionHelper->decryptData($user['email']) ?: $user['email']; + $user['phone'] = $encryptionHelper->decryptData($user['phone']) ?: $user['phone']; + + unset($user['password']); + + // توليد التوكن أو استرجاع التوكن الحالي إذا كان صالحاً + $jwtService = new JwtService($redis); + $role = 'service'; + $ttl = 14400; // 4 hours + $jwt = null; + $expires_in = $ttl; + + // محاولة استعادة التوكن الحالي من Redis لتجنب التكرار + if ($redis) { + $existingToken = $redis->get("active_token:{$user['id']}:{$audience}"); + if ($existingToken) { + $decoded = $jwtService->decodeToken($existingToken); + // يجب أن يكون التوكن صالحاً ويحتوي على بصمة الجهاز (إذا كان التشفير مفعلاً) + if ($decoded && $decoded->exp > time() && (isset($decoded->fingerPrint) || empty($jwtService->getFpPepper()))) { + $jwt = $existingToken; + $expires_in = $decoded->exp - time(); + } + } + } + + + // إذا لم يوجد توكن صالح، نولد واحداً جديداً ونلغي القديم + if (!$jwt) { + if ($redis) { + $oldJti = $redis->get("active_jti:{$user['id']}"); + if ($oldJti) { + $jwtService->revokeToken($oldJti, $ttl); + } + } + $jwt = $jwtService->generateAccessToken($user['id'], $role, $audience, $fingerprint); + $expires_in = $ttl; + } + + // توليد مفتاح HMAC فريد للمستخدم (للتوافق مع CRUD الجديد) + $hmacKey = hash_hmac('sha256', (string)$user['id'], getenv('SECRET_KEY_HMAC')); + + printSuccess([ + "message" => "Login successful", + "data" => $user, + "jwt" => $jwt, + "hmac" => $hmacKey, + "expires_in" => $expires_in + ]); + + + } else { + jsonError("Incorrect password"); + } + } else { + jsonError("الجهاز غير مسجل لموظف خدمة."); + } +} catch (Exception $e) { + error_log("[ServiceApp Login Error] " . $e->getMessage()); + jsonError("Server error: " . $e->getMessage()); +} + +exit(); \ No newline at end of file diff --git a/backend/serviceapp/register.php b/backend/serviceapp/register.php new file mode 100644 index 0000000..23063aa --- /dev/null +++ b/backend/serviceapp/register.php @@ -0,0 +1,77 @@ +prepare("SELECT id FROM users WHERE email = ? OR phone = ? OR fingerprint_hash = ? LIMIT 1"); + + // تشفير الحقول للبحث عنها إذا كانت مشفرة في قاعدة البيانات (حسب تصميم النظام) + $encEmail = $encryptionHelper->encryptData($email); + // ملاحظة: البحث بالهاتف والبريد المشفر يتطلب مطابقة دقيقة أو البحث بالـ Hash إذا كان متوفراً + // هنا سنفترض البحث بالبيانات الممرة مباشرة أو المشفرة حسب ما تقتضيه سياسة connect.php + + $check->execute([$email, $phone, $fpHash]); + + if ($check->rowCount() > 0) { + jsonError("هذا الحساب أو الجهاز مسجل مسبقاً."); + exit; + } + + // 2. تجهيز البيانات + $id = bin2hex(random_bytes(16)); + $hashedPassword = password_hash($password, PASSWORD_DEFAULT); + + // تشفير البيانات الحساسة قبل التخزين + $encFirstName = $encryptionHelper->encryptData($firstName); + $encLastName = $encryptionHelper->encryptData($lastName); + $encEmail = $encryptionHelper->encryptData($email); + $encPhone = $encryptionHelper->encryptData($phone); + $encFp = $encryptionHelper->encryptData($fingerprint); + + // 3. الإدخال في قاعدة البيانات (الحالة الافتراضية هي 0 أو pending) + $sql = "INSERT INTO users (id, first_name, last_name, email, phone, password, fingerprint, fingerprint_hash, user_type, created_at) + VALUES (:id, :fname, :lname, :email, :phone, :pass, :fp, :fp_hash, 'service', NOW())"; + + + $stmt = $con->prepare($sql); + $stmt->execute([ + ':id' => $id, + ':fname' => $encFirstName, + ':lname' => $encLastName, + ':email' => $encEmail, + ':phone' => $encPhone, + ':pass' => $hashedPassword, + ':fp' => $encFp, + ':fp_hash' => $fpHash + ]); + + printSuccess([ + "status" => "pending", + "message" => "تم تقديم طلب التسجيل بنجاح. يرجى انتظار موافقة الإدارة." + ]); + +} catch (Exception $e) { + error_log("[Service Register Error] " . $e->getMessage()); + jsonError("خطأ في السيرفر: " . $e->getMessage()); +} + +exit(); diff --git a/backend/serviceapp/registerDriverAndCarService.php b/backend/serviceapp/registerDriverAndCarService.php new file mode 100755 index 0000000..72a0c13 --- /dev/null +++ b/backend/serviceapp/registerDriverAndCarService.php @@ -0,0 +1,237 @@ +beginTransaction(); + logStep(1, "Transaction started via beginTransaction()"); + + // --- 2. Recolección de Datos (Conductor + Coche) --- + $phone = filterRequest("phone"); + $password = filterRequest("password"); + $firstName = filterRequest("first_name"); + $lastName = filterRequest("last_name"); + + // تسجيل البيانات المبدئية (بدون كلمات المرور) للتأكد من وصولها + logStep(2, "Inputs received -> Phone: $phone, Name: $firstName $lastName"); + + // التحقق من الحقول الإجبارية + if (empty($phone) || empty($password) || empty($firstName) || empty($lastName)) { + throw new Exception("Required fields missing (phone, password, first_name, last_name)."); + } + + // --- 3. Generar ID de Conductor --- + $driverId = substr(md5($phone), 0, 20); + logStep(3, "Driver ID generated: $driverId"); + + // --- 4. Procesamiento de Datos del Conductor --- + $password_hashed = password_hash($password, PASSWORD_DEFAULT); + $email = filterRequest("email"); + + if (empty($email) || $email === 'Not specified') { + $email = $phone . '@intaleqapp.com'; + } + + $nameArabic = $firstName . ' ' . $lastName; + $site = filterRequest("site"); + $address = $site; + + // بيانات إضافية + $gender = filterRequest("gender"); + $license_type = filterRequest("license_type"); + $nationalNumber = filterRequest("national_number"); + $issue_date = filterRequest("issue_date"); + $expiry_date = filterRequest("expiry_date"); + $licenseCategories = filterRequest("license_categories"); + $licenseIssueDate = filterRequest("license_issue_date"); + $birthdate = filterRequest("birthdate"); + $maritalStatus = filterRequest("maritalStatus"); + + // --- 5. Recolección de Datos del Coche --- + $owner = filterRequest("owner"); + $color = filterRequest("color"); + $colorHex = filterRequest("color_hex"); + $model = filterRequest("model"); + $carPlate = filterRequest("car_plate"); + $make = filterRequest("make"); + $fuel = filterRequest("fuel"); + $year = filterRequest("year"); + $vin = filterRequest("vin"); + + if (empty($vin)) { + $vin = 'unknown'; + } + + $carExpirationDate = filterRequest("expiration_date"); + + logStep(4, "Data processing completed. Car Plate: $carPlate, VIN: $vin"); + + // --- 6. Cifrado de Datos --- + try { + $encryptedPhone = $encryptionHelper->encryptData($phone); + $encryptedEmail = $encryptionHelper->encryptData($email); + $encryptedFirstName = $encryptionHelper->encryptData($firstName); + $encryptedLastName = $encryptionHelper->encryptData($lastName); + $encryptedNameArabic = $encryptionHelper->encryptData($nameArabic); + $encryptedGender = $encryptionHelper->encryptData($gender); + $encryptedNationalNumber = $encryptionHelper->encryptData($nationalNumber); + $encryptedAddress = $encryptionHelper->encryptData($address); + $encryptedSite = $encryptionHelper->encryptData($site); + $encryptedBirthdate = $encryptionHelper->encryptData($birthdate); + $encryptedOwner = $encryptionHelper->encryptData($owner); + $encryptedCarPlate = $encryptionHelper->encryptData($carPlate); + + logStep(5, "Encryption successful for sensitive fields."); + } catch (Exception $encEx) { + throw new Exception("Encryption Error: " . $encEx->getMessage()); + } + + // --- 7. Comprobación de Duplicados --- + // ملاحظة: إذا كان التشفير عشوائياً، فلن يجد التكرار هنا. + $dup = $con->prepare("SELECT id FROM driver WHERE phone = :phone OR email = :email OR national_number = :national_number"); + $dup->execute([':phone' => $encryptedPhone, ':email' => $encryptedEmail, ':national_number' =>$encryptedNationalNumber]); + + if ($dup->rowCount() > 0) { + logStep(6, "Duplicate found! Phone or Email or encryptedNationalNumber already exists."); + throw new Exception("Phone or email already registered."); + } + logStep(6, "No duplicates found. Proceeding."); + + // --- 8. INSERCIÓN 1: Tabla 'driver' --- + $sqlDriver = " + INSERT INTO driver ( + id, phone, email, password, gender, license_type, national_number, + name_arabic, issue_date, expiry_date, license_categories, + address, licenseIssueDate, status, birthdate, site, + first_name, last_name, accountBank, bankCode, + employmentType, maritalStatus, fullNameMaritial, expirationDate, + created_at, updated_at + ) VALUES ( + :id, :phone, :email, :pwd, :gender, :license_type, :national_number, + :name_arabic, :issue_date, :expiry_date, :license_categories, + :address, :licenseIssueDate, :status, :birthdate, :site, + :first_name, :last_name, :accountBank, :bankCode, + :employmentType, :maritalStatus, :fullNameMaritial, :expirationDate, + NOW(), NOW() + ) + "; + + $stmtDriver = $con->prepare($sqlDriver); + + // تم توحيد المفاتيح لتشمل النقطتين (:) + $driverData = [ + ':id' => $driverId, + ':phone' => $encryptedPhone, + ':email' => $encryptedEmail, + ':pwd' => $password_hashed, + ':gender' => $encryptedGender, + ':license_type' => $license_type, + ':national_number' => $encryptedNationalNumber, + ':name_arabic' => $encryptedNameArabic, + ':issue_date' => $issue_date, + ':expiry_date' => $expiry_date, + ':license_categories' => $licenseCategories ?? 'B', + ':address' => $encryptedAddress, + ':licenseIssueDate' => $licenseIssueDate, + ':status' => 'actives', + ':birthdate' => $encryptedBirthdate, + ':site' => $encryptedSite, + ':first_name' => $encryptedFirstName, + ':last_name' => $encryptedLastName, + ':accountBank' => 'yet', + ':bankCode' => 'yet', + ':employmentType' => $maritalStatus ?? 'yet', + ':maritalStatus' => $maritalStatus ?? 'yet', + ':fullNameMaritial' => 'yet', + ':expirationDate' => 'yet', + ]; + + if (!$stmtDriver->execute($driverData)) { + // تسجيل خطأ SQL بالتفصيل + $errInfo = $stmtDriver->errorInfo(); + throw new Exception("Driver Insert Failed: " . $errInfo[2]); + } + logStep(7, "Driver table insert successful."); + + // --- 9. INSERCIÓN 2: Tabla 'CarRegistration' --- + $sqlCar = " + INSERT INTO CarRegistration ( + driverID, vin, owner, color, color_hex, model, car_plate, + make, fuel, `year`, expiration_date, created_at + ) VALUES ( + :driverId, :vin, :owner, :color, :color_hex, :model, :car_plate, + :make, :fuel, :year, :expiration_date, NOW() + ) + "; + + $stmtCar = $con->prepare($sqlCar); + $carData = [ + ':driverId' => $driverId, + ':vin' => $vin, + ':owner' => $encryptedOwner, + ':color' => $color, + ':color_hex' => $colorHex, + ':model' => $model, + ':car_plate' => $encryptedCarPlate, + ':make' => $make, + ':fuel' => $fuel, + ':year' => $year, + ':expiration_date' => $carExpirationDate + ]; + + if (!$stmtCar->execute($carData)) { + $errInfo = $stmtCar->errorInfo(); + throw new Exception("Car Insert Failed: " . $errInfo[2]); + } + logStep(8, "CarRegistration insert successful."); + + // --- 10. Confirmar Transacción --- + $con->commit(); + logStep(9, "COMMIT successful. Sending Success Response."); + + jsonSuccess(["driverId" => $driverId, "message" => "Driver and car registered successfully."]); + + // --- 11. Enviar Notificación (خارج المعاملة يفضل، ولكن هنا كما في الكود الأصلي) --- + try { + $supportPhones = ['0952475740', '0952475742']; + $randomIndex = array_rand($supportPhones); + $phoneToUse = $supportPhones[$randomIndex]; + $randomNumber = rand(1000, 999999); + + $messageBody = "أهلاً وسهلاً كابتن $firstName 👋\n" + . "تم تفعيل حسابك على تطبيق *انطلق*.\n" + . "يمكنك الآن تسجيل الدخول والبدء بالعمل مباشرة.\n" + . "للمساعدة تواصل معنا على الرقم: $phoneToUse\n" + . "نتمنى لك عمل موفق 🚖\n\n" + . "معرف الرسالة: $randomNumber"; + + sendWhatsAppFromServer($phone, $messageBody); + logStep(10, "WhatsApp notification sent."); + } catch (Exception $waError) { + // لا نوقف العملية إذا فشل الواتساب، فقط نسجل الخطأ + logStep(10, "WhatsApp Warning: " . $waError->getMessage()); + } + +} catch (PDOException $e) { + $con->rollBack(); + $errorMsg = "Database Error (PDO): " . $e->getMessage(); + logStep("ERROR-PDO", $errorMsg); + // إظهار رسالة عامة للمستخدم، وتسجيل التفاصيل في السيرفر + jsonError("System error during registration. Please contact support."); +} catch (Exception $e) { + // إذا كانت المعاملة مفتوحة، قم بإلغائها + if ($con->inTransaction()) { + $con->rollBack(); + } + $errorMsg = "General Error: " . $e->getMessage(); + logStep("ERROR-GEN", $errorMsg); + jsonError($e->getMessage()); +} +?> \ No newline at end of file diff --git a/backend/serviceapp/updateDriver.php b/backend/serviceapp/updateDriver.php new file mode 100755 index 0000000..4e7425f --- /dev/null +++ b/backend/serviceapp/updateDriver.php @@ -0,0 +1,93 @@ + $driverID]; + +foreach ($driverFieldsAllowed as $field) { + if (isset($_POST[$field]) && $_POST[$field] !== "") { + $value = filterRequest($field); + + if (in_array($field, $encryptedDriverFields)) { + $value = $encryptionHelper->encryptData($value); + } + + $driverSet[] = "`$field` = :$field"; + $driverParams[":$field"] = $value; + } +} + +// Execute Driver Update +$driverUpdated = false; +if (!empty($driverSet)) { + $driverSql = "UPDATE `driver` SET " . implode(", ", $driverSet) . " WHERE `id` = :id"; + $stmt = $con->prepare($driverSql); + $stmt->execute($driverParams); + $driverUpdated = $stmt->rowCount() > 0; +} + +/* --------------------------------------------------------- + CAR REGISTRATION TABLE +--------------------------------------------------------- */ +$carFieldsAllowed = [ + "id", "vin", "car_plate", "make", "model", "year", + "expiration_date", "color", "owner", "color_hex", "fuel", + "isDefault", "created_at", "status" +]; + +$carSet = []; +$carParams = [":driverID" => $driverID]; + +foreach ($carFieldsAllowed as $field) { + if ($field === "id") continue; // skip primary key in SET + if (isset($_POST[$field]) && $_POST[$field] !== "") { + $value = filterRequest($field); + $carSet[] = "`$field` = :$field"; + $carParams[":$field"] = $value; + } +} + +// Execute Car Update +$carUpdated = false; +if (!empty($carSet)) { + $carSql = "UPDATE `CarRegistration` SET " . implode(", ", $carSet) . " WHERE `driverID` = :driverID"; + $stmtCar = $con->prepare($carSql); + $stmtCar->execute($carParams); + $carUpdated = $stmtCar->rowCount() > 0; +} + +/* --------------------------------------------------------- + RESPONSE +--------------------------------------------------------- */ +if ($driverUpdated || $carUpdated) { + jsonSuccess(null, "Driver & Car updated successfully"); +} else { + jsonError("No changes were applied"); +} +?> diff --git a/backend/serviceapp/updateDriverToActive.php b/backend/serviceapp/updateDriverToActive.php new file mode 100755 index 0000000..23b5a25 --- /dev/null +++ b/backend/serviceapp/updateDriverToActive.php @@ -0,0 +1,150 @@ +beginTransaction(); + +try { + // --- 1. معالجة وتشفير البيانات --- + $nameArabic = $firstName . ' ' . $lastName; + $address = $site; + + // تشفير الحقول الحساسة + $encryptedFirstName = $encryptionHelper->encryptData($firstName); + $encryptedLastName = $encryptionHelper->encryptData($lastName); + $encryptedSite = $encryptionHelper->encryptData($site); + $encryptedAddress = $encryptionHelper->encryptData($address); + $encryptedNameArabic = $encryptionHelper->encryptData($nameArabic); + $encryptedNationalNumber = $encryptionHelper->encryptData($nationalNumber); + $encryptedOwner = $encryptionHelper->encryptData($owner); + $encryptedCarPlate = $encryptionHelper->encryptData($carPlate); + $encryptedBirthdate = $encryptionHelper->encryptData($birthdate); + $encryptedGender = $encryptionHelper->encryptData($gender); + + // --- 2. تحديث جدول السائق --- + $sqlDriver = "UPDATE `driver` SET + `first_name` = :first_name, + `last_name` = :last_name, + `site` = :site, + `address` = :address, + `national_number` = :national_number, + `license_categories` = :license_categories, + `expiry_date` = :expiry_date, + `issue_date` = :issue_date, + `gender` = :gender, + `birthdate` = :birthdate, + `name_arabic` = :name_arabic, + `maritalStatus` = :maritalStatus, + `status` = 'actives' + WHERE `id` = :driverId"; + + $stmtDriver = $con->prepare($sqlDriver); + $stmtDriver->execute([ + ':first_name' => $encryptedFirstName, + ':last_name' => $encryptedLastName, + ':site' => $encryptedSite, + ':address' => $encryptedAddress, + ':national_number' => $encryptedNationalNumber, + ':license_categories' => $licenseCategories, + ':expiry_date' => $expiryDate, + ':issue_date' => $licenseIssueDate, + ':gender' => $encryptedGender, + ':birthdate' => $encryptedBirthdate, + ':name_arabic' => $encryptedNameArabic, + ':driverId' => $driverId, + ':maritalStatus' =>$maritalStatus + ]); + + // --- 3. تحديث جدول السيارة --- + $sqlCar = "UPDATE `CarRegistration` SET + `owner` = :owner, + `color` = :color, + `color_hex` = :color_hex, + `model` = :model, + `car_plate` = :car_plate, + `make` = :make, + `fuel` = :fuel, + `year` = :year, + `expiration_date` = :expiration_date + WHERE `driverID` = :driverId"; + + $stmtCar = $con->prepare($sqlCar); + $stmtCar->execute([ + ':owner' => $encryptedOwner, + ':color' => $color, + ':color_hex' => $colorHex, + ':model' => $model, + ':car_plate' => $encryptedCarPlate, + ':make' => $make, + ':fuel' => $fuel, + ':year' => $year, + ':expiration_date' => $carExpirationDate, + ':driverId' => $driverId + ]); + + // --- 4. تأكيد المعاملة --- + $con->commit(); + jsonSuccess(["message" => "Driver and car data updated successfully."]); + + // --- 5. إرسال رسالة واتساب مبسطة وآمنة (باختيار رقم عشوائي) --- + + // 5.1. تعريف الأرقام + $supportPhones = ['0952475740', '0952475742']; // يمكنك إضافة المزيد من الأرقام هنا + + // 5.2. اختيار رقم عشوائي من القائمة + $randomIndex = array_rand($supportPhones); // يختار "مفتاح" عشوائي (index) + $phoneToUse = $supportPhones[$randomIndex]; // يحصل على الرقم من المفتاح + + + // --- !!! التعديل: إضافة رقم عشوائي --- + // هذا يضيف رقم عشوائي (4-6 خانات) لجعل الرسالة فريدة + $randomNumber = rand(1000, 999999); + + // 5.5. إعداد نص الرسالة بالرقم المتغير + $messageBody = "أهلاً وسهلاً كابتن $firstName 👋\n" + . "تم تفعيل حسابك على تطبيق *انطلق*.\n" + . "يمكنك الآن تسجيل الدخول والبدء بالعمل مباشرة.\n" + . "للمساعدة تواصل معنا على الرقم: $phoneToUse\n" // <-- تم استخدام المتغير العشوائي هنا + . "نتمنى لك عمل موفق 🚖\n\n" + . "معرف الرسالة: $randomNumber"; // <-- إضافة الرقم العشوائي + + // 5.6. إرسال الرسالة + sendWhatsAppFromServer($phone, $messageBody); + +} catch (Exception $e) { + // --- 6. التراجع في حال الخطأ --- + $con->rollBack(); + jsonError("An error occurred: " . $e->getMessage()); +} + +?> + diff --git a/backend/serviceapp/updatePackages.php b/backend/serviceapp/updatePackages.php new file mode 100755 index 0000000..2aeaf61 --- /dev/null +++ b/backend/serviceapp/updatePackages.php @@ -0,0 +1,26 @@ +prepare($sql); +$stmt->execute(); +error_log("Updating package: ID = $sql, Version = $version"); + + +// Debugging: Check if the query affected any rows +if ($stmt->rowCount() > 0) { + // If rows were affected, print success + echo json_encode(['status' => 'success', 'message' => "Package version updated successfully for ID $id"]); +} else { + // If no rows were affected, print failure and debug the query + echo json_encode(['status' => 'failure', 'message' => "Failed to update package version. No rows affected. ID: $id, Version: $version"]); +} +?> \ No newline at end of file diff --git a/backend/serviceapp/update_complaint.php b/backend/serviceapp/update_complaint.php new file mode 100644 index 0000000..955dada --- /dev/null +++ b/backend/serviceapp/update_complaint.php @@ -0,0 +1,30 @@ +prepare($sql); + $stmt->bindParam(':status', $status); + $stmt->bindParam(':resolution', $resolution); + $stmt->bindParam(':id', $id); + + if ($stmt->execute()) { + jsonSuccess(null, "Complaint updated successfully"); + } else { + jsonError("Failed to update complaint"); + } +} else { + jsonError("Missing required fields"); +} +?> diff --git a/backend/serviceapp/web/drivers.html b/backend/serviceapp/web/drivers.html new file mode 100755 index 0000000..e537e1e --- /dev/null +++ b/backend/serviceapp/web/drivers.html @@ -0,0 +1,307 @@ + + + + + + نظام إدارة المركبات + + + + + + + + + +
+ + +
+

الاستعلام عن بيانات السائق والمركبة

+
+ + +
+ +
+
+
+ + + + +
+ + + +
+ + + + + + + \ No newline at end of file diff --git a/backend/serviceapp/web/f.html b/backend/serviceapp/web/f.html new file mode 100755 index 0000000..e69de29 diff --git a/backend/serviceapp/web/getDrivers.php b/backend/serviceapp/web/getDrivers.php new file mode 100755 index 0000000..fb0124a --- /dev/null +++ b/backend/serviceapp/web/getDrivers.php @@ -0,0 +1,87 @@ +exec("set names utf8mb4"); +} + +$phone = ""; +if (isset($_GET['phone_number'])) { + $phone = htmlspecialchars(strip_tags($_GET['phone_number'])); +} elseif (isset($_POST['phone_number'])) { + $phone = htmlspecialchars(strip_tags($_POST['phone_number'])); +} else { + $phone = filterRequest("phone_number"); +} + +if (empty($phone)) { + jsonError("Phone number is required"); + exit; +} + +// تشفير الرقم للبحث +$phoneEncrypted = $encryptionHelper->encryptData($phone); + +// الاستعلام: نختار الحقول بدقة لتجنب التضارب +$sql = "SELECT + d.id as driver_id, + d.name_arabic as driver_name_encrypted, -- الاسم من جدول السائق + d.phone as phone_encrypted, + d.gender as gender_encrypted + + FROM + `driver` d + + WHERE + d.phone = ? + LIMIT 1"; + +try { + $stmt = $con->prepare($sql); + $stmt->execute([$phoneEncrypted]); + + if ($stmt->rowCount() > 0) { + $rows = $stmt->fetchAll(PDO::FETCH_ASSOC); + + foreach ($rows as &$item) { + // ============================================ + // 1. فك تشفير الحقول المشفرة فقط (حسب ملف CSV) + // ============================================ + + // بيانات السائق + if (!empty($item['driver_name_encrypted'])) { + $item['driverName'] = $encryptionHelper->decryptData($item['driver_name_encrypted']); + } + if (!empty($item['phone_encrypted'])) { + $item['phone'] = $encryptionHelper->decryptData($item['phone_encrypted']); + } + if (!empty($item['gender_encrypted'])) { + $item['gender'] = $encryptionHelper->decryptData($item['gender_encrypted']); + } + + + + } + + jsonSuccess($rows); + + } else { + jsonError("No driver found with this phone number"); + } + +} catch (PDOException $e) { + error_log("SQL Error: " . $e->getMessage()); + jsonError("Database error"); +} catch (Exception $e) { + error_log("General Error: " . $e->getMessage()); + jsonError("System error"); +} +?> \ No newline at end of file diff --git a/backend/serviceapp/work/addCarWantWork.php b/backend/serviceapp/work/addCarWantWork.php new file mode 100755 index 0000000..6280468 --- /dev/null +++ b/backend/serviceapp/work/addCarWantWork.php @@ -0,0 +1,65 @@ +encryptData(filterRequest("owner_name")); +$phone = $encryptionHelper->encryptData(filterRequest("phone")); // 🔒 +$car_number = $encryptionHelper->encryptData(filterRequest("car_number")); +$manufacture_year = filterRequest("manufacture_year"); +$car_model = filterRequest("car_model"); +$car_type = filterRequest("car_type"); +$site = filterRequest("site"); +$registration_date = filterRequest("registration_date"); + +// تحقق بسيط من القيم المطلوبة +if (empty($owner_name) || empty($phone)) { + jsonError("Missing required fields", 422); +} + +// SQL مع bind parameters +$sql = "INSERT INTO `carsToWork`( + `owner_name`, + `phone`, + `car_number`, + `manufacture_year`, + `car_model`, + `car_type`, + `site`, + `registration_date` +) VALUES ( + :owner_name, + :phone, + :car_number, + :manufacture_year, + :car_model, + :car_type, + :site, + :registration_date +)"; + +try { + $stmt = $con->prepare($sql); + + $stmt->bindParam(':owner_name', $owner_name); + $stmt->bindParam(':phone', $phone); + $stmt->bindParam(':car_number', $car_number); + $stmt->bindParam(':manufacture_year', $manufacture_year); + $stmt->bindParam(':car_model', $car_model); + $stmt->bindParam(':car_type', $car_type); + $stmt->bindParam(':site', $site); + $stmt->bindParam(':registration_date', $registration_date); + + if ($stmt->execute()) { + printSuccess("Car data saved successfully", ["insert_id" => $con->lastInsertId()]); + } else { + $err = $stmt->errorInfo(); + jsonError("Failed to save car data: " . ($err[2] ?? 'unknown error'), 500); + } +} catch (Exception $e) { + jsonError("Exception: " . $e->getMessage(), 500); +} +?> \ No newline at end of file diff --git a/backend/serviceapp/work/addDriverWantWork.php b/backend/serviceapp/work/addDriverWantWork.php new file mode 100755 index 0000000..c04692b --- /dev/null +++ b/backend/serviceapp/work/addDriverWantWork.php @@ -0,0 +1,45 @@ +prepare($sql); + +// ربط القيم +$stmt->bindParam(':driver_name', $driver_name); +$stmt->bindParam(':phone', $phone); +$stmt->bindParam(':national_id', $national_id); +$stmt->bindParam(':birth_date', $birth_date); +$stmt->bindParam(':license_type', $license_type); +$stmt->bindParam(':site', $site); + +// تنفيذ الاستعلام +if ($stmt->execute()) { + jsonSuccess(null, "Driver data saved successfully"); +} else { + jsonError("Failed to save driver data"); +} +?> \ No newline at end of file diff --git a/backend/uploadImagePortrate.php b/backend/uploadImagePortrate.php new file mode 100755 index 0000000..46d7bca --- /dev/null +++ b/backend/uploadImagePortrate.php @@ -0,0 +1,74 @@ +enforce(RateLimiter::identifier($user_id ?? null), 'upload'); + + $driverID = filterRequest("driverID"); + appLog("📥 Received driverID: $driverID"); + + if (empty($driverID)) { + jsonError('Driver ID is required.', 400); + } + + // 2. استخدام دالة الرفع الآمنة (MIME check, random name, 5MB limit) + $target_dir = __DIR__ . "/portrate_captain_image/"; + $uploadResult = uploadImageSecure('image', $target_dir, $driverID); + + if (!$uploadResult['success']) { + securityLog("❌ Image upload failed", ['driverID' => $driverID, 'error' => $uploadResult['error']]); + jsonError($uploadResult['error'], 400); + } + + $new_filename = $uploadResult['filename']; + appLog("✅ File moved successfully to: " . $uploadResult['path']); + + // 3. تحديث قاعدة البيانات + $linkImage = 'https://api.intaleq.xyz/intaleq_v3/portrate_captain_image/' . $new_filename; + $uploadDate = date("Y-m-d H:i:s"); + + // تأكد من أن الاتصال قادم من connect.php أو اجلبه + $con = Database::get('main'); + + // التحقق من وجود السائق في جدول الصور الشخصية + $stmt = $con->prepare("SELECT COUNT(*) FROM imageProfileCaptain WHERE driverID = ?"); + $stmt->execute([$driverID]); + $count = $stmt->fetchColumn(); + + if ($count > 0) { + // تحديث + $updateSQL = "UPDATE imageProfileCaptain SET image_name = ?, link = ? WHERE driverID = ?"; + $updateStmt = $con->prepare($updateSQL); + // Note: imageProfileCaptain doesn't seem to have 'upload_date' in the original insert, but let's check if we should add it. Let's just update image_name and link as in the insert statement. + $success = $updateStmt->execute([$new_filename, $linkImage, $driverID]); + } else { + // إدخال جديد + $insertSQL = "INSERT INTO imageProfileCaptain (driverID, image_name, link) VALUES (?, ?, ?)"; + $insertStmt = $con->prepare($insertSQL); + $success = $insertStmt->execute([$driverID, $new_filename, $linkImage]); + } + + if ($success) { + appLog("✅ Record updated for driverID: $driverID"); + jsonSuccess(['file_link' => $linkImage], 'Record updated successfully.'); + } else { + appLog("❌ Failed to update DB record for driverID: $driverID"); + jsonError('Failed to update record.', 500); + } + +} catch (PDOException $e) { + securityLog("💥 PDO ERROR in uploadImage", ['error' => $e->getMessage()]); + jsonError('Database error.', 500); +} catch (Exception $e) { + securityLog("💥 GENERAL ERROR in uploadImage", ['error' => $e->getMessage()]); + jsonError('Server error.', 500); +} \ No newline at end of file diff --git a/backend/upload_audio.php b/backend/upload_audio.php new file mode 100755 index 0000000..90fc436 --- /dev/null +++ b/backend/upload_audio.php @@ -0,0 +1,66 @@ + 'The audio file was not uploaded successfully.')); + exit; +} + +// Get the file name and extension of the audio file +$audio_name = $audio_file['name']; +$audio_extension = pathinfo($audio_name, PATHINFO_EXTENSION); + +// Check if the audio file is a valid audio format +if (!in_array($audio_extension, array('m4a', 'mp3', 'wav'))) { + echo json_encode(array('status' => 'The audio file is not a valid format.')); + exit; +} + +// MIME Type validation using finfo +$finfo = finfo_open(FILEINFO_MIME_TYPE); +$mime_type = finfo_file($finfo, $audio_file['tmp_name']); +finfo_close($finfo); + +$allowed_mime_types = ['audio/mp4', 'audio/mpeg', 'audio/wav', 'audio/x-m4a']; +if (!in_array($mime_type, $allowed_mime_types)) { + echo json_encode(array('status' => 'The audio file is not a valid format (MIME mismatch).')); + exit; +} + +// Generate a new filename using the passenger ID to avoid conflicts +$new_filename = $audio_name . '.' . $audio_extension; + +// Move the audio file to the uploads directory with the new filename +$target_dir = "upload_audio/"; +if (!is_dir($target_dir)) { + mkdir($target_dir, 0755, true); // Create directory if it doesn't exist +} +$target_file = $target_dir . $new_filename; +if (!move_uploaded_file($audio_file['tmp_name'], $target_file)) { + error_log("Failed to move file to target directory: " . print_r($audio_file, true)); + echo json_encode(array('status' => 'Failed to move the audio file.')); + exit; +} + +// Construct the link to the uploaded audio file +$base_url = 'https://api.intaleq.xyz/intaleq_v3/upload_audio/'; // Updated to match Intaleq V3 +$linkAudio = $base_url . $new_filename; + + +// Respond with success and the audio file link +echo json_encode(array('status' => 'Audio file uploaded successfully.', 'link' => $linkAudio)); + +// Close the database connection if it was established +if (isset($conn)) { + mysqli_close($conn); +} +?> \ No newline at end of file diff --git a/backend/webhook_sms/webhook.php b/backend/webhook_sms/webhook.php new file mode 100755 index 0000000..8d25f0a --- /dev/null +++ b/backend/webhook_sms/webhook.php @@ -0,0 +1,76 @@ + 'error', 'message' => 'Unauthorized Access']); + exit(); +} + +// --- 2. قراءة البيانات المرسلة --- +$json_data = file_get_contents('php://input'); +$data = json_decode($json_data, true); + +if ($data === null || !isset($data['sender']) || !isset($data['message'])) { + http_response_code(400); + echo json_encode(['status' => 'error', 'message' => 'Invalid data received']); + exit(); +} + +// --- 3. استخراج البيانات والتحضير للمعالجة --- +$sender = $data['sender']; +$message_body = $data['message']; +$received_at = date('Y-m-d H:i:s'); +$log_entry = "[$received_at] From: $sender | Message: $message_body"; + +// --- 4. تحليل الرسالة (يركز على Orange Money فقط حالياً) --- + +// تعريف المتغيرات التي سنستخرجها +$amount = 0; +$payer_phone = null; +$currency = null; + +// النمط الوحيد الفعّال حالياً: لرسائل Orange Money الأردنية +$pattern_orangemoney_jo = '/تم استقبال حوالة مالية من (\d+)\s+من مزود الخدمة:\s+Orange Money إلى محفظتك بمبلغ ([\d,.]+)\s+دينار/'; + +/* +// أنماط أخرى يمكن تفعيلها لاحقاً +// $pattern_chambank = '/حوالة واردة خارجية بمبلغ\s+([\d,.]+)\s+ليرة سورية/'; +// $pattern_wallet_syr = '/تم استلام مبلغ ([\d,.]+) ل\.س من الرقم (09\d{8})/'; +*/ + +if (preg_match($pattern_orangemoney_jo, $message_body, $matches)) { + // --- تطابق نمط Orange Money الأردني --- + $payer_phone = $matches[1]; + $amount_str = $matches[2]; + $amount = (float) str_replace(',', '', $amount_str); + $currency = 'JOD'; // دينار أردني + + $log_entry .= " | MATCH: Orange Money JO | SUCCESS: Parsed Amount = $amount, Payer Phone = $payer_phone, Currency = $currency" . PHP_EOL; + + // TODO: اكتب منطق قاعدة البيانات هنا + /* + - ابحث عن معاملة "pending" تطابق المبلغ $amount ورقم الهاتف $payer_phone. + - $sql = "UPDATE transactions SET status = 'completed' WHERE amount = ? AND phone_number = ? AND currency = 'JOD' AND status = 'pending' LIMIT 1"; + */ + +} else { + // إذا لم تتطابق الرسالة مع نمط Orange Money + $log_entry .= " | INFO: Message did not match the Orange Money pattern. Ignored." . PHP_EOL; +} + +// كتابة كل شيء في ملف السجل +file_put_contents('sms_log.txt', $log_entry, FILE_APPEND); + + +// --- 5. إرسال رد إلى تطبيق الأندرويد --- +http_response_code(200); +echo json_encode(['status' => 'success', 'message' => 'Data received and processed.']); +?> + diff --git a/copy_native_and_packages.py b/copy_native_and_packages.py new file mode 100644 index 0000000..902e6c8 --- /dev/null +++ b/copy_native_and_packages.py @@ -0,0 +1,118 @@ +import os +import shutil + +SOURCE_DIR = "/Users/hamzaaleghwairyeen/development/App" +TARGET_DIR = "/Users/hamzaaleghwairyeen/development/App/Siro" + +mappings = [ + { + "src": "Intaleq", + "dst": "siro_rider", + "old_app_id": "com.Intaleq.intaleq", + "new_app_id": "com.siro.siro_rider", + "extra_folders": ["packages"] + }, + { + "src": "intaleq_driver", + "dst": "siro_driver", + "old_app_id": "com.intaleq_driver", + "new_app_id": "com.siro.siro_driver", + "extra_folders": ["bubble-master", "trip_overlay_plugin"] + }, + { + "src": "intaleq_admin", + "dst": "siro_admin", + "old_app_id": "com.intaleq.intaleq_admin", + "new_app_id": "com.siro.siro_admin", + "extra_folders": [] + }, + { + "src": "service_intaleq", + "dst": "siro_service", + "old_app_id": "com.service_intaleq", + "new_app_id": "com.siro.siro_service", + "extra_folders": [] + } +] + +def replace_in_file(filepath, old_str, new_str): + try: + with open(filepath, 'r', encoding='utf-8') as f: + content = f.read() + if old_str in content: + content = content.replace(old_str, new_str) + with open(filepath, 'w', encoding='utf-8') as f: + f.write(content) + except Exception as e: + pass + +def process(): + for m in mappings: + src_app = os.path.join(SOURCE_DIR, m['src']) + dst_app = os.path.join(TARGET_DIR, m['dst']) + + print(f"Processing native folders for {m['dst']}...") + + # 1. Copy native folders + native_folders = ['android', 'ios', 'macos', 'web'] + for folder in native_folders: + s_folder = os.path.join(src_app, folder) + d_folder = os.path.join(dst_app, folder) + if os.path.exists(s_folder): + if os.path.exists(d_folder): + shutil.rmtree(d_folder) + shutil.copytree(s_folder, d_folder, symlinks=True, ignore=shutil.ignore_patterns('.symlinks', 'Pods', 'build', '.dart_tool')) + + # 2. Copy extra internal packages + for folder in m['extra_folders']: + s_folder = os.path.join(src_app, folder) + d_folder = os.path.join(dst_app, folder) + if os.path.exists(s_folder): + if os.path.exists(d_folder): + shutil.rmtree(d_folder) + shutil.copytree(s_folder, d_folder, symlinks=True, ignore=shutil.ignore_patterns('build', '.dart_tool')) + + # 3. Android Package Renaming + old_app_id = m['old_app_id'] + new_app_id = m['new_app_id'] + + android_dir = os.path.join(dst_app, 'android') + if os.path.exists(android_dir): + # Replace string occurrences in Android files + for root, dirs, files in os.walk(android_dir): + for file in files: + if file.endswith(('.kt', '.java', '.xml', '.gradle', '.gradle.kts', '.pro')): + replace_in_file(os.path.join(root, file), old_app_id, new_app_id) + + # Move kotlin/java directory structure + for lang in ['kotlin', 'java']: + for source_type in ['main', 'debug', 'profile']: + src_dir = os.path.join(android_dir, 'app', 'src', source_type, lang) + if os.path.exists(src_dir): + old_path = os.path.join(src_dir, *old_app_id.split('.')) + new_path = os.path.join(src_dir, *new_app_id.split('.')) + + if os.path.exists(old_path) and old_path != new_path: + os.makedirs(new_path, exist_ok=True) + for item in os.listdir(old_path): + shutil.move(os.path.join(old_path, item), new_path) + + # Clean up old empty directories + curr = old_path + while curr != src_dir: + if not os.listdir(curr): + os.rmdir(curr) + curr = os.path.dirname(curr) + + # 4. iOS Bundle ID Renaming + ios_dir = os.path.join(dst_app, 'ios') + if os.path.exists(ios_dir): + for root, dirs, files in os.walk(ios_dir): + for file in files: + if file.endswith(('.pbxproj', '.plist', '.m', '.h', '.swift', '.storyboard', '.xcconfig')): + replace_in_file(os.path.join(root, file), old_app_id, new_app_id) + + print("Done copying and modifying native folders.") + +if __name__ == "__main__": + process() diff --git a/copy_script.dart b/copy_script.dart new file mode 100644 index 0000000..590e5cb --- /dev/null +++ b/copy_script.dart @@ -0,0 +1,84 @@ +import 'dart:io'; + +void main() async { + var sourceDir = Directory("/Users/hamzaaleghwairyeen/development/App"); + var targetDir = Directory("/Users/hamzaaleghwairyeen/development/App/Siro"); + + var mappings = [ + {"src": "Intaleq", "dst": "siro_rider", "old_pkg": "Intaleq", "new_pkg": "siro_rider"}, + {"src": "intaleq_driver", "dst": "siro_driver", "old_pkg": "sefer_driver", "new_pkg": "siro_driver"}, + {"src": "intaleq_admin", "dst": "siro_admin", "old_pkg": "sefer_admin1", "new_pkg": "siro_admin"}, + {"src": "service_intaleq", "dst": "siro_service", "old_pkg": "service", "new_pkg": "siro_service"} + ]; + + for (var m in mappings) { + var srcPath = "\${sourceDir.path}/\${m['src']}"; + var dstPath = "\${targetDir.path}/\${m['dst']}"; + + // 1. Delete destination lib and assets + for (var folder in ['lib', 'assets', 'secure_string_operations']) { + var dFolder = Directory("\$dstPath/\$folder"); + if (dFolder.existsSync()) { + dFolder.deleteSync(recursive: true); + } + } + + // 2. Copy lib and assets + for (var folder in ['lib', 'assets', 'secure_string_operations']) { + var sFolder = Directory("\$srcPath/\$folder"); + var dFolder = Directory("\$dstPath/\$folder"); + if (sFolder.existsSync()) { + copyDirectorySync(sFolder, dFolder); + } + } + + // 3. Copy pubspec.yaml + var sPubspec = File("\$srcPath/pubspec.yaml"); + var dPubspec = File("\$dstPath/pubspec.yaml"); + if (sPubspec.existsSync()) { + sPubspec.copySync(dPubspec.path); + } + + // 4. Replace package name in pubspec.yaml + if (dPubspec.existsSync()) { + var content = dPubspec.readAsStringSync(); + content = content.replaceAll(RegExp(r"^name:\s*" + m["old_pkg"]! + r"\s*$", multiLine: true), "name: \${m['new_pkg']}"); + dPubspec.writeAsStringSync(content); + } + + // 5. Replace imports + for (var rootFolder in ['lib', 'test']) { + var rootPath = Directory("\$dstPath/\$rootFolder"); + if (!rootPath.existsSync()) continue; + + var files = rootPath.listSync(recursive: true).whereType(); + for (var file in files) { + if (file.path.endsWith('.dart')) { + try { + var content = file.readAsStringSync(); + var newContent = content.replaceAll("package:\${m['old_pkg']}/", "package:\${m['new_pkg']}/"); + if (newContent != content) { + file.writeAsStringSync(newContent); + } + } catch (e) { + print("Error reading \${file.path}: \$e"); + } + } + } + } + } + print("Done"); +} + +void copyDirectorySync(Directory source, Directory destination) { + destination.createSync(recursive: true); + for (var entity in source.listSync(recursive: false)) { + if (entity is Directory) { + var newDirectory = Directory("\${destination.absolute.path}/\${entity.path.split('/').last}"); + newDirectory.createSync(); + copyDirectorySync(entity.absolute, newDirectory); + } else if (entity is File) { + entity.copySync("\${destination.path}/\${entity.path.split('/').last}"); + } + } +} diff --git a/copy_script.py b/copy_script.py new file mode 100644 index 0000000..14be8c2 --- /dev/null +++ b/copy_script.py @@ -0,0 +1,70 @@ +import os +import shutil + +source_dir = "/Users/hamzaaleghwairyeen/development/App" +target_dir = "/Users/hamzaaleghwairyeen/development/App/Siro" + +mappings = [ + {"src": "Intaleq", "dst": "siro_rider", "old_pkg": "Intaleq", "new_pkg": "siro_rider"}, + {"src": "intaleq_driver", "dst": "siro_driver", "old_pkg": "sefer_driver", "new_pkg": "siro_driver"}, + {"src": "intaleq_admin", "dst": "siro_admin", "old_pkg": "sefer_admin1", "new_pkg": "siro_admin"}, + {"src": "service_intaleq", "dst": "siro_service", "old_pkg": "service", "new_pkg": "siro_service"} +] + +def copy_and_replace(): + for m in mappings: + src_path = os.path.join(source_dir, m['src']) + dst_path = os.path.join(target_dir, m['dst']) + + # 1. Delete destination lib and assets if exist + for folder in ['lib', 'assets', 'secure_string_operations']: + d_folder = os.path.join(dst_path, folder) + if os.path.exists(d_folder): + shutil.rmtree(d_folder) + + # 2. Copy lib and assets + for folder in ['lib', 'assets', 'secure_string_operations']: + s_folder = os.path.join(src_path, folder) + d_folder = os.path.join(dst_path, folder) + if os.path.exists(s_folder): + shutil.copytree(s_folder, d_folder) + + # 3. Copy pubspec.yaml + s_pubspec = os.path.join(src_path, "pubspec.yaml") + d_pubspec = os.path.join(dst_path, "pubspec.yaml") + if os.path.exists(s_pubspec): + shutil.copy2(s_pubspec, d_pubspec) + + # 4. Replace package name in pubspec.yaml + if os.path.exists(d_pubspec): + with open(d_pubspec, 'r', encoding='utf-8') as f: + content = f.read() + # replace name: old_pkg with name: new_pkg + import re + content = re.sub(rf'^name:\s*{m["old_pkg"]}\s*$', f'name: {m["new_pkg"]}', content, flags=re.MULTILINE) + with open(d_pubspec, 'w', encoding='utf-8') as f: + f.write(content) + + # 5. Replace imports in lib and test directories + for root_folder in ['lib', 'test']: + root_path = os.path.join(dst_path, root_folder) + if not os.path.exists(root_path): continue + + for root, dirs, files in os.walk(root_path): + for file in files: + if file.endswith('.dart'): + file_path = os.path.join(root, file) + try: + with open(file_path, 'r', encoding='utf-8') as f: + content = f.read() + + new_content = content.replace(f"package:{m['old_pkg']}/", f"package:{m['new_pkg']}/") + if new_content != content: + with open(file_path, 'w', encoding='utf-8') as f: + f.write(new_content) + except Exception as e: + print(f"Error reading {file_path}: {e}") + +if __name__ == "__main__": + copy_and_replace() + print("Done") diff --git a/copy_script.sh b/copy_script.sh new file mode 100644 index 0000000..463ab55 --- /dev/null +++ b/copy_script.sh @@ -0,0 +1,53 @@ +#!/bin/bash +set -e + +SOURCE_DIR="/Users/hamzaaleghwairyeen/development/App" +TARGET_DIR="/Users/hamzaaleghwairyeen/development/App/Siro" + +declare -a mappings=( + "Intaleq:siro_rider:Intaleq:siro_rider" + "intaleq_driver:siro_driver:sefer_driver:siro_driver" + "intaleq_admin:siro_admin:sefer_admin1:siro_admin" + "service_intaleq:siro_service:service:siro_service" +) + +for mapping in "${mappings[@]}"; do + IFS=":" read -r src dst old_pkg new_pkg <<< "$mapping" + src_path="$SOURCE_DIR/$src" + dst_path="$TARGET_DIR/$dst" + + echo "Processing $dst..." + + # 1. Delete destination lib and assets + for folder in lib assets secure_string_operations; do + if [ -d "$dst_path/$folder" ]; then + rm -rf "$dst_path/$folder" + fi + done + + # 2. Copy lib and assets + for folder in lib assets secure_string_operations; do + if [ -d "$src_path/$folder" ]; then + cp -R "$src_path/$folder" "$dst_path/" + fi + done + + # 3. Copy pubspec.yaml + if [ -f "$src_path/pubspec.yaml" ]; then + cp "$src_path/pubspec.yaml" "$dst_path/pubspec.yaml" + fi + + # 4. Replace package name in pubspec.yaml using perl + if [ -f "$dst_path/pubspec.yaml" ]; then + perl -pi -e "s/^name:\s*$old_pkg\s*$/name: $new_pkg/" "$dst_path/pubspec.yaml" + fi + + # 5. Replace imports using perl + for root_folder in lib test; do + if [ -d "$dst_path/$root_folder" ]; then + find "$dst_path/$root_folder" -type f -name "*.dart" -exec perl -pi -e "s/package:$old_pkg\//package:$new_pkg\//g" {} + + fi + done +done + +echo "Done" diff --git a/debug.log b/debug.log new file mode 100644 index 0000000..e329a53 --- /dev/null +++ b/debug.log @@ -0,0 +1,2 @@ +Processing siro_rider... +cp: /Users/hamzaaleghwairyeen/development/App/Intaleq/lib: Operation not permitted diff --git a/deploy.sh b/deploy.sh new file mode 100755 index 0000000..82469ab --- /dev/null +++ b/deploy.sh @@ -0,0 +1,18 @@ +#!/bin/bash + +# Check if a commit message was provided as an argument +if [ -n "$1" ]; then + COMMIT_MSG="$1" +else + # Use current date and time if no message is provided + COMMIT_MSG="Update: $(date +'%Y-%m-%d %H:%M:%S')" +fi + +echo "Adding all files..." +git add . + +echo "Committing with message: $COMMIT_MSG" +git commit -m "$COMMIT_MSG" + +echo "Pushing to origin..." +git push origin --all diff --git a/mykeytool b/mykeytool new file mode 120000 index 0000000..db86648 --- /dev/null +++ b/mykeytool @@ -0,0 +1 @@ +/Applications/Android Studio.app/Contents/jbr/Contents/Home/bin/keytool \ No newline at end of file diff --git a/setup_firebase.sh b/setup_firebase.sh new file mode 100755 index 0000000..34c524f --- /dev/null +++ b/setup_firebase.sh @@ -0,0 +1,37 @@ +#!/bin/bash + +# Ensure we exit if any command fails +set -e + +PROJECT_ID="siro-a6957" + +echo "==========================================" +echo "🔧 Setting up Firebase for Siro Applications" +echo "Project ID: $PROJECT_ID" +echo "==========================================" + +echo -e "\n📦 1. Configuring Siro Rider..." +cd siro_rider +flutterfire configure --project=$PROJECT_ID --out=lib/firebase_options.dart --ios-bundle-id=com.siro.rider --android-package-name=com.siro.rider --platforms=android,ios -y +cd .. +echo "✅ Siro Rider configured successfully!" + +echo -e "\n📦 2. Configuring Siro Driver..." +cd siro_driver +flutterfire configure --project=$PROJECT_ID --out=lib/firebase_options.dart --ios-bundle-id=com.siro.driver --android-package-name=com.siro.driver --platforms=android,ios -y +cd .. +echo "✅ Siro Driver configured successfully!" + +echo -e "\n📦 3. Configuring Siro Admin..." +cd siro_admin +flutterfire configure --project=$PROJECT_ID --out=lib/firebase_options.dart --ios-bundle-id=com.siro.admin --android-package-name=com.siro.admin --platforms=android,ios -y +cd .. +echo "✅ Siro Admin configured successfully!" + +echo -e "\n📦 4. Configuring Siro Service..." +cd siro_service +flutterfire configure --project=$PROJECT_ID --out=lib/firebase_options.dart --ios-bundle-id=com.siro.service --android-package-name=com.siro.service --platforms=android,ios -y +cd .. +echo "✅ Siro Service configured successfully!" + +echo -e "\n🎉 All applications have been successfully configured with Firebase!" diff --git a/siro_admin/.env b/siro_admin/.env new file mode 100644 index 0000000..a6c3df8 --- /dev/null +++ b/siro_admin/.env @@ -0,0 +1,118 @@ +basicAuthCredentials=wqnmqqsjyvwjv:nqrYJP@1737XrXlBl +basicCompareFaces=zjujluqfpj:nqrYjp@1737XrXlBl +basicCompareFacesURL='https://face-detect-f6924392c4c7.herokuapp.com/compare_faces' +accountSIDTwillo=QFx0qy456juj383n9xuy2194q629q1fj0y7XrXlBl +serverAPI=QQQQobSrrFi:QVQ87xU7zwCvmZzZdaxuS2f23Y4mz7MzyOzr8od2br6KYyeFaTVLG3K3hx5ZaUyx7eYvAYpAVdKk-286NTRi3zs9iSOnXtXRIxswg3KecBmsl3VxJ9wO-vIpwu4Pv7dkHkXniuxMSDgWXrXlBl +mapAPIKEY=AIzaSyCFsWBqvkXzk1Gb-bCGxwqTwJQKIeHjH64 +email=@intaleqapp.com +mapAPIKEYIOS=AIzaSyDzGO9a-1IDMLD2FxhmOO9ONL1gMssFa9g +twilloRecoveryCode=CAU79DHPH1BjE9PUH4ETXTSXZXrXlBl +apiKeyHere=g_WNUb5L-tripz7-F8omHpUmgIzH7ETeH9xZ8RwGG9_G8zX9A +authTokenTwillo=70u98ju0214oxx4q0u74028u021u4qu65XrXlBl +chatGPTkey=zg-4C26q4SYgBKQeHZDqkWowC9XrxgUEfUy9JRw2rm6Q2adb3kjwXrXlBl +transactionCloude=Qhcwuilomqcoib:QVO_JNYED2XWA26YXKC2TP:YK1DVH6SJB31N3PE1UXrXlBl +visionApi=3pALsqSSYTvzp69Q5FMIgbzjG6Z1zktJXrXlBl +chatGPTkeySefer=zg-IiR3i4ooza3Yvhvb9rZk1C9XrxgUE0l8jRRZrHj3Qe5QXPlqVXrXlBl +chatGPTkeySeferNew=zg-Z4oAJcAROgNXjgrEIU8fKC9XrxgUE4Qtrrlq1yiux0jL3dITSXrXlBl +secretKey=zg_ropj_57Iiv6pMFCBFq3C2n6IXlmjykpxDmW93SW3vvXh68UA9T5FORTWgWsT37StKsOPdwDdsy8qR9srMUluahs3nPHvgBa33tGk90vV5XrXlBl +stripe_publishableKe=vg_propj_57Iiv6MFCBFq3C2n6kNJnZByV6nuDtXe9IjEPOfhmpDtWmt3MLR0gQpiHcQmAFMUPrZc3QiCDjxBZLbxDC3efxWxz33bWH1ZgrsXrXlBl +llamaKey=RR-EuyoFDUvfRDBoj46fZKAtKJ3voM8Mt768cPeJV7GNdAkPTKdY8Odm9n4ggGqI5GyoXrXlBl +serverPHP=https://api.sefer.live/sefer +seferAlexandriaServer=https://seferalexandria.site/sefer +seferPaymentServer=https://seferpw.shop/sefer +# seferCairoServer=https://sefer.click/sefer +seferCairoServer=https://server.sefer.live/sefer.click/sefer +seferGizaServer=https://gizasefer.online/sefer +whatappID=3699397362811879 +whatsapp=EAAOtbZBSUK74BOzW9yb74EgApQYtI88nYtE9jQi9QnLGpw3FQpc5dxIlDgVJzcMywEBqNYf3s8pkk6cZB5Q0tkKuSOZBsOvMZA3Tcth0IlBHSaMVtcRZCsaTKNSUpfLRGRb0rhLezNFllpYBgmnfbhUazSZBYXdr40nmN4QEgweK2eqYQnTTNuryTOyBkKZB1MXMw6U7QnTRQDxHbUVlqgIRTrhaooZD +cohere=Aulwd8y5SPWos0hJhlG0toUf8gOhUUrpf5Q2TPmVGXrXlBl +claudeAiAPI=zg-qbc-qvo39l-xWOxIGwWTOzCFBnIYSKKhfyz_KVAvrH-6_4ZEJL68G_QBH26oeTOMMoQug9KuOjjKSP_A4S3SUDlbxR9duVzoQ-MkX_UQQQXrXlBl +payPalClientId=QALymlfNI5Tzt4s-ysoz6vD4_nqX0SUtkC_qYV-Ugk5gaM_8Z-kg4L53k8Uux_4jEWXDkNpXGSWPpIzDFXrXlBl +payPalClientIdLive=QZFkjAoZfGtngNserll6r3cC56Xl1sVLQkn5dMbyebhzJY59EQ3hz7YxaEqEDYPTUFcQWqvePaQ5UJJVRXrXlBl +payPalSecret=JBAAvqJQGUsKD0Zjh4KjeczxfBFx-38SdlbIS56VRM8NDfe6mjMeZJhNLJek5XgQCqKCHtRf6MjRy-f8XrXlBl +payPalSecretLive=JQDATqkknDfiFpEAN60KB4pGpDaJjyqBAd9jxMBPpzWU1P1k3H1jZhQjn73EHsKQna74P8p98hgOnMaWPWXrXlBl +geminiApi=QOmqZsQYm08vlOqjI7klVJfvP4WBFEoemjgy396iXrXlBl +geminiApiMasa=QOmqZsQIpdM4BRsKmaDJOP7dZp5-c6NWfch7PAlQXrXlBl +agoraAppId=71880f2j636o509j24y5294480y30u848XrXlBl +agoraAppCertificate=j17q944u49390jhq758u1649448q2y6xfuXrXlBl +usernamePayMob=37319104052XrXlBl +passwordPayMob='g@nkD2#99k!hD_.wXrXlBl' +integrationIdPayMob=0237630XrXlBl +payMobApikey='MDrGqKEWS1rVqhjggHvEPDvPjJ7vZDBExrO7S3BEBgrlfUwTA3i5RnP5ZnvoL3M2S9rEBgrlNTdexH5pTPf7NJrvy1reZJv1Tn7zf7vTIDywjHg1C7Ley38HTDyNA3v7TPfdxJrax1rwPmPtMJyzqKEYZeghq3MuLUrFH3A1AgHcH15CZ9UaZTLOxnw0BTdzHHrBArisZerUMUUzZ1BnBeEijHvNjYLnS1BUICMhSmPhA15ifHyVqKEMHWyKLbyuIPvcH9UeL3vZyDf=cvcXrXlBlbbbbb' +integrationIdPayMobWallet=0277739XrXlBl +ocpApimSubscriptionKey=0f5dacccdbce4131b1a5f952996302e3 +smsPasswordEgypt="J)Vh=qb/@MXrXlBl" +chatGPTkeySeferNew4=zg-vlie-2l1ZlpximLJ6wQOvbb4TnC9XrxgUEyVQIu6TID4qP4FUUqoS5XrXlBl +anthropicAIkeySeferNew=zg-qbc-qvo39-mn4VdMQ5nuJeIYhMN4PDYr7qox3-t2i1Lh7aNTDfYF-Gf8whUJZCs47EeelKn8_UcmUMmiSLaf0UJg0DvUlQrDt-76CRrkQQXrXlBl +llama3Key=kzg_uTXy3e9DBbCQ1FnMGmxYwTKysx9US1burxJj4fFwOje4LZBUFKJS1XrXlBl +payMobOutClientSecrret='xyjjRlkahJM0Xc38WjApCOh8bvgL9slFpNdM9YeCu9AhLqboKMPtmSvc2N9O4tXxFLV2JAV6stBSTAGFGCVubGe6MNpc7MzJnZ3SiT6GpavBoCLWkUvVbdSDaM0zHvuBOXrXlBl' +payMobOutClient_id='Z05ut48dVkkS2gI2zenFFcKsfDKfHAU0WELqKyJ0LXrXlBl' +payMobOutPassword='D2zJFxkE#LNk3vz38z2dYxpNfWXrXlBl' +payMobOutUserName='zjujl_qvo_fwkjfgjlXrXlBl' +keyOfApp=balsev@7696tabnaazesmeheregzpfjoXrXrBr +initializationVector=qxfyjukwoegrnbivXrXrBr +privateKeyFCM=WZSHwLUNI/wlyLUyIZHYf/pgOo6JZplTQqKK2HJmuSJ+r4Iygz/W+03uFPFS4iLv4AIuZ5+wFBDU9gf240fgjhjJgq1bwiW4TrlTh4YhEtHjiPTBCielwIcYFrhrlD4xLTHQC8feSZuZ4t3wZISRfqjuIyu58yhG5H64RifbD5efjzE6KJCivhIpXcK5k1t32lMnlLKzPkSqW2znCXYhRNOQEL+sAllmQNpHVy7LAgr829Jl5AoEuHmYeeCLOIzV5oMdHpQGDDAaG+bo9Yda4n3S1NXNAwU3h8uWsXaAHS1mkgb49+gTJQLfhrxdj2jOHB2HaUA7IyypVXTDuEZzYrYs/+yK2HvmFld/Fqt7ndWqenfl4Qu6+r/JUEHhaGMFNkiChvtVHjLHDOBw7Zrtm5kDzwrvybCVZSrZAwJvudT7eZjRlYrdm2s+v5Q4wVayBslBW02KT/VrXJsuPJKtI7l2jHzIV6M0vmMXU8rlah2gSVl9ZX8mLxcQm7iWbLyWX0S4hixngw3N+j7wltAxYodfkCdJj0BdeH0ZCCKlbANs+lQf5hIzjkC7RcSc2xRnMn1mcyqUlK0BiniSgBSixD3JdpG8UTEYU5nfTVdgsx+fcvje5Dloo6zblKbIVje8vh5MSFjM2yr4nOpbQu95vOW/jSYUjm2WGppCmpBVyWYglp4AlnwDNFL01p3jq+1YixPTZjnp4Bm4XGiGIUnmjBeC18CQ53rg+aWvE7UlOMsoirgU1Y+tAxzbx74xtYfgNjavyD+GtUWkOZPtKSTeR+0uBrfTehFK24QypP5OT3dRbAwRVneySDJOpcQA9xReYpJgoW29GzNLNNoEW+65HIqYQ7WkVj0Z16YOma/WhR4MSHWpOmqxVAYOsGpZw9QnSrY/CFN8uKhYPC4RGONHmk5CP0rTNA0syrBS0XPFsJ8vhgJmB2wjUs46IDX5tFreS7q4axsOSxZMWSQlRHcxSdwFVAepBIfoGWHSUmE0sxpsz+ewCdYtZrWYE0jwEqiTiKR1M4hpn9P1mI0CHri6uRUY2Im86kuEGA5GE9U287rOubVCfC+IxU4vOnNi05fN4lJutdXjweHN7L1ZJ4H0AsFfs8Q3HSHKbn5MTJUlF2rlhNomMlLJnRrDzYiSJ6wIbBXzT8h23WXPMNrTkbh8WkPugEPrp0LTyJI2wurEhhPIlqJwFcpjVVsDmFKmTqMegJsj9C8kHixQ/kyT0AtQ3qTVxgHP/9nxyuglVzdezqlB09yOjVnq/xU+nnTx2RX90Lpf192D23rSvtvfG4LAs2vloKljKG0yIGntFJbikCsv1bQfXwa4cXb6niks4v7irCjLzEtyIDzjYaaSJc0gs69tyumG0bc7AjJa4AvrDtFchN2m9PXGFoOHC0eDMqfANc2VztcYlFEMH0Fp/VsIuiTOSI9Tsb8wjRlrew13EqWUXN48srVHaFfyXUCbSpeelnqCe21EwGOpfgqgUcu/5WdtYH+e7F0Z3xtV6lZNqV7mWYuyyf9C9PviFh0ZECKXivg6vrP4pqDSvuu79ZkR0aTf43NPvGRIIR6Hbjt+Msi3CKsRlLrN8sslxFfB4ZYpQcGmDxTd0vvnarfu0ezz5GU4AXA3Eb4rYdaoB3MRxvbRF/2NMdqb+M5iPTVgRZ7vmDsIogu4O4kgpYNjPE2B66Qz/CbRI6CYFAnF3usKjnNl9k5bFL8d6x+EOZaXm2bZhML5K//tB2TsGl5Bw7sNggC56KqOEOg6WnDIoy4NzzImd8IEamuZdkiaaRl8+/P3Mz+b325kZzAj2e/5feXoup8V/H4edIsIGeIjHNuU+otJ8LQ9EnMFGaZfkiboH7feG1W/n8sZAlusmwcpeISNbskCmQKO44oI8G0WWBpLNo4/5NN1V4XuPGVoIhxQSObLDBHoRttmMNHp3dWv+R9SMxOuswXZYsLUJD5vLD3i9ZzBuLrBdiKgFk7rVFvTrz1CIiBDKeFtvMiEfEtSSQkI5nnh1dHSxRRBrmGa/UME/dCdRGlvTZuHGnq+PgJFlhC3oYLBhOJcw65asHKm94tgLeGeWZ9UytEfuvuL2gIAUUql0sLjgnWBoz84XCkNVMP2fB0Ci6NAbRfE1zJh8PVHezFvvEOl8KvVkLqFtzRqgTvkLV/cjG8bvJsTaHklejY14iv+pG0gYZ4Gkia5jvSzGa3IZEqhOG5hXmEBLcBcfp7ApQ5Ezopt9EJVm4+kRW5nWB6YPiqbzfz8Ab7/uV6GIWSJoG7f0kW1keUtL9SS2n2OxG3S0XWJrYoN9udVviFdl5GqDqTfc4odY9v4fdV3bMgU009S9y6dNRhi3RUTaNIcZHAVbEL0VXzXOi/r4ICjMFXvWVF8xY8RdJPedu9HIbCTq+TPzOgpHoANzm8Rjm2i6J5TLUfqdS7NIHig8M5lni80PlOlnmgvjf5s6PwatrbN6QKMxk8bg6LoI2yGy5ICJ5dncvcR/GgTxHEpz3aknTdMqJMfyST7CmIpTOULEO4zmiKrWYvvlEmaax7j1fJoz4Y1Z29Zm7+mG9lGrCUnsU9CZoAr/d+flJnSWwdwhL/RXhu+pbkdu2gTmg9ar4mwoGYp9GoaefgCIupiL4T3JekNS/MvmZFbiGxl4TVVobj5MsYHawLs5C9AdzjEuK6ktqAr0o1ycBwfj66kuqSnU7KQedmlDs3XmlAqdGk6V2BEs7/b+bfuUJw1FcYf9MVXMQnN1pbDKJVtb+Zrf+AYQ9etUPpsoDxom2NJRgjjdsLkLIPxEZ6HJRAEcnHx49ER+zbdL+7MKolBRzlW4mZHLYkscfx7bqWZsH5PtjDp9Ed1xbHpmwFbv7XV2mYfST6Nu8dLYk/6wkyZybv8hNe1Wj/4o+iMRnOsCUasT9GKF2ezoej1RPzN3GjqR0gfrndn40fXFn4E2n8HP8SKeChiNf++HEzbzd9a7djXE3Xon8/baEaTUBKZUoIZ9OFypU+Ueo0CJpI9CzEipfXp3lGImVhsdQJ2AwRnY6HkXS74sd840HyYzDGL0B8mVvgQwYJQyC+xHRmNUFO9ugmhOmXQjVnkST9XqJpm/vwTAY28C/Al1iKmMjFqWBBNkyRJd6lTus87niZr+tpzBPLW6PZDaAcS5aTPS/dv01W5gLeEhA== +sss_pass=wqnmqqsjyvwv:nqrmYJP@17378XrXlBl +sss_encryptionSalt=zg-vklie-2l1ZlpxiLJ6wQOvbb4TnC9XrxgUEyVQIu6TID4qP4FUUqoS5XrXlBl +addd=BlBlNl +getLocationAreaLinks =https://api.tripz-egypt.com/tripz/ride/location/get_location_area_links.php +anthropicAIkeySeferNewHamzaayedpython=zg-qbc-qvo39-vCB-WnzEwFNArO0YlTapvfhtmguKWsXJSKqg_NZSjHBYVXMZK1yUK88SobdckV0KuPaBh0c_WHtGsRO_439PBk-e2QqgkQQXrXlBl +emailService=seferservice@gmail.com +allowed=TripzDriver: +allowedWallet=TripzWallet: +passnpassenger=hbgbitbXrXrBr +ALLOWED_ADMIN_PHONES=963992952235,962790849027,962787021927,963942542053,962772735902,971529155811 +newId=new +a=q +b=x +c=f +d=y +e=j +f=u +g=k +h=w +i=o +j=e +k=g +l=r +m=n +n=b +o=i +p=v +q=a +r=l +s=z +t=c +u=h +v=p +w=t +x=d +y=s +z=m + +A=Q +B=X +C=F +D=Y +E=J +F=U +G=K +H=W +I=O +J=E +K=G +L=R +M=N +N=B +O=I +P=V +Q=A +R=L +S=Z +T=C +U=H +V=P +W=T +X=D +Y=S +Z=M \ No newline at end of file diff --git a/siro_admin/.gitignore b/siro_admin/.gitignore new file mode 100644 index 0000000..3820a95 --- /dev/null +++ b/siro_admin/.gitignore @@ -0,0 +1,45 @@ +# Miscellaneous +*.class +*.log +*.pyc +*.swp +.DS_Store +.atom/ +.build/ +.buildlog/ +.history +.svn/ +.swiftpm/ +migrate_working_dir/ + +# IntelliJ related +*.iml +*.ipr +*.iws +.idea/ + +# The .vscode folder contains launch configuration and tasks you configure in +# VS Code which you may wish to be included in version control, so this line +# is commented out by default. +#.vscode/ + +# Flutter/Dart/Pub related +**/doc/api/ +**/ios/Flutter/.last_build_id +.dart_tool/ +.flutter-plugins-dependencies +.pub-cache/ +.pub/ +/build/ +/coverage/ + +# Symbolication related +app.*.symbols + +# Obfuscation related +app.*.map.json + +# Android Studio will place build artifacts here +/android/app/debug +/android/app/profile +/android/app/release diff --git a/siro_admin/.metadata b/siro_admin/.metadata new file mode 100644 index 0000000..c0fe018 --- /dev/null +++ b/siro_admin/.metadata @@ -0,0 +1,45 @@ +# This file tracks properties of this Flutter project. +# Used by Flutter tool to assess capabilities and perform upgrades etc. +# +# This file should be version controlled and should not be manually edited. + +version: + revision: "90673a4eef275d1a6692c26ac80d6d746d41a73a" + channel: "stable" + +project_type: app + +# Tracks metadata for the flutter migrate command +migration: + platforms: + - platform: root + create_revision: 90673a4eef275d1a6692c26ac80d6d746d41a73a + base_revision: 90673a4eef275d1a6692c26ac80d6d746d41a73a + - platform: android + create_revision: 90673a4eef275d1a6692c26ac80d6d746d41a73a + base_revision: 90673a4eef275d1a6692c26ac80d6d746d41a73a + - platform: ios + create_revision: 90673a4eef275d1a6692c26ac80d6d746d41a73a + base_revision: 90673a4eef275d1a6692c26ac80d6d746d41a73a + - platform: linux + create_revision: 90673a4eef275d1a6692c26ac80d6d746d41a73a + base_revision: 90673a4eef275d1a6692c26ac80d6d746d41a73a + - platform: macos + create_revision: 90673a4eef275d1a6692c26ac80d6d746d41a73a + base_revision: 90673a4eef275d1a6692c26ac80d6d746d41a73a + - platform: web + create_revision: 90673a4eef275d1a6692c26ac80d6d746d41a73a + base_revision: 90673a4eef275d1a6692c26ac80d6d746d41a73a + - platform: windows + create_revision: 90673a4eef275d1a6692c26ac80d6d746d41a73a + base_revision: 90673a4eef275d1a6692c26ac80d6d746d41a73a + + # User provided section + + # List of Local paths (relative to this file) that should be + # ignored by the migrate tool. + # + # Files that are not part of the templates will be ignored by default. + unmanaged_files: + - 'lib/main.dart' + - 'ios/Runner.xcodeproj/project.pbxproj' diff --git a/siro_admin/README.md b/siro_admin/README.md new file mode 100644 index 0000000..a0622a9 --- /dev/null +++ b/siro_admin/README.md @@ -0,0 +1,17 @@ +# siro_admin + +A new Flutter project. + +## Getting Started + +This project is a starting point for a Flutter application. + +A few resources to get you started if this is your first Flutter project: + +- [Learn Flutter](https://docs.flutter.dev/get-started/learn-flutter) +- [Write your first Flutter app](https://docs.flutter.dev/get-started/codelab) +- [Flutter learning resources](https://docs.flutter.dev/reference/learning-resources) + +For help getting started with Flutter development, view the +[online documentation](https://docs.flutter.dev/), which offers tutorials, +samples, guidance on mobile development, and a full API reference. diff --git a/siro_admin/analysis_options.yaml b/siro_admin/analysis_options.yaml new file mode 100644 index 0000000..0d29021 --- /dev/null +++ b/siro_admin/analysis_options.yaml @@ -0,0 +1,28 @@ +# This file configures the analyzer, which statically analyzes Dart code to +# check for errors, warnings, and lints. +# +# The issues identified by the analyzer are surfaced in the UI of Dart-enabled +# IDEs (https://dart.dev/tools#ides-and-editors). The analyzer can also be +# invoked from the command line by running `flutter analyze`. + +# The following line activates a set of recommended lints for Flutter apps, +# packages, and plugins designed to encourage good coding practices. +include: package:flutter_lints/flutter.yaml + +linter: + # The lint rules applied to this project can be customized in the + # section below to disable rules from the `package:flutter_lints/flutter.yaml` + # included above or to enable additional rules. A list of all available lints + # and their documentation is published at https://dart.dev/lints. + # + # Instead of disabling a lint rule for the entire project in the + # section below, it can also be suppressed for a single line of code + # or a specific dart file by using the `// ignore: name_of_lint` and + # `// ignore_for_file: name_of_lint` syntax on the line or in the file + # producing the lint. + rules: + # avoid_print: false # Uncomment to disable the `avoid_print` rule + # prefer_single_quotes: true # Uncomment to enable the `prefer_single_quotes` rule + +# Additional information about this file can be found at +# https://dart.dev/guides/language/analysis-options diff --git a/siro_admin/analyze_report.txt b/siro_admin/analyze_report.txt new file mode 100644 index 0000000..f4bf5af --- /dev/null +++ b/siro_admin/analyze_report.txt @@ -0,0 +1,448 @@ +Analyzing siro_admin... + +warning - lib/controller/admin/quality_controller.dart:1:8 - Unused import: 'package:flutter/material.dart'. Try removing the import directive. - unused_import +warning - lib/controller/admin/register_captain_controller.dart:2:8 - Unused import: 'dart:ffi'. Try removing the import directive. - unused_import +warning - lib/controller/admin/register_captain_controller.dart:560:11 - The value of the local variable 'result' isn't used. Try removing the variable or using it. - unused_local_variable +warning - lib/controller/admin/staff_controller.dart:5:8 - Unused import: '../functions/device_info.dart'. Try removing the import directive. - unused_import +warning - lib/controller/admin/wallet_admin_controller.dart:10:8 - Unused import: '../../print.dart'. Try removing the import directive. - unused_import +warning - lib/controller/admin/wallet_admin_controller.dart:49:35 - The exception variable 'e' isn't used, so the 'catch' clause can be removed. Try removing the catch clause. - unused_catch_clause +warning - lib/controller/auth/login_controller.dart:2:8 - Unused import: 'package:get/get.dart'. Try removing the import directive. - unused_import +warning - lib/controller/bank_account/payout.dart:93:9 - The value of the local variable 'res' isn't used. Try removing the variable or using it. - unused_local_variable +warning - lib/controller/firebase/firbase_messge.dart:22:8 - Unused import: 'local_notification.dart'. Try removing the import directive. - unused_import +warning - lib/controller/firebase/firbase_messge.dart:55:28 - The value of the local variable 'settings' isn't used. Try removing the variable or using it. - unused_local_variable +warning - lib/controller/firebase/firbase_messge.dart:244:28 - The value of the local variable 'android' isn't used. Try removing the variable or using it. - unused_local_variable +warning - lib/controller/firebase/firbase_messge.dart:400:13 - The value of the local variable 'response' isn't used. Try removing the variable or using it. - unused_local_variable +warning - lib/controller/firebase/firbase_messge.dart:423:27 - This 'onError' handler must return a value assignable to 'Response', but ends without returning a value. Try adding a return statement. - body_might_complete_normally_catch_error +warning - lib/controller/firebase/notification_service.dart:4:8 - Unused import: '../../print.dart'. Try removing the import directive. - unused_import +warning - lib/controller/functions/crud.dart:19:8 - Unused import: 'security_checks.dart'. Try removing the import directive. - unused_import +warning - lib/controller/functions/crud.dart:399:9 - The value of the local variable 'uid' isn't used. Try removing the variable or using it. - unused_local_variable +warning - lib/controller/functions/crud.dart:455:9 - The value of the local variable 'textValues' isn't used. Try removing the variable or using it. - unused_local_variable +warning - lib/controller/functions/crud.dart:636:9 - The value of the local variable 'res' isn't used. Try removing the variable or using it. - unused_local_variable +warning - lib/controller/functions/digit_obsecur_formate.dart:29:11 - The value of the local variable 'cursorOffset' isn't used. Try removing the variable or using it. - unused_local_variable +warning - lib/controller/functions/encrypt_decrypt.dart:7:8 - Unused import: '../../main.dart'. Try removing the import directive. - unused_import +warning - lib/controller/functions/encrypt_decrypt.dart:8:8 - Unused import: '../../print.dart'. Try removing the import directive. - unused_import +warning - lib/controller/functions/log_out.dart:28:9 - The value of the local variable 'res' isn't used. Try removing the variable or using it. - unused_local_variable +warning - lib/controller/functions/security_checks.dart:2:8 - Unused import: 'dart:io'. Try removing the import directive. - unused_import +warning - lib/controller/functions/upload_image copy.dart:256:9 - The value of the local variable 'multipartFile' isn't used. Try removing the variable or using it. - unused_local_variable +warning - lib/controller/functions/upload_image copy.dart:349:9 - The value of the local variable 'multipartFile' isn't used. Try removing the variable or using it. - unused_local_variable +warning - lib/controller/server/server_monitor_controller.dart:6:8 - Unused import: '../../print.dart'. Try removing the import directive. - unused_import +warning - lib/views/admin/admin_home_page.dart:13:8 - Unused import: '../../constant/style.dart'. Try removing the import directive. - unused_import +warning - lib/views/admin/admin_home_page.dart:65:22 - The value of the field '_accentSoft' isn't used. Try removing the field, or using it. - unused_field +warning - lib/views/admin/captain/captain.dart:11:7 - This class (or a class that this class inherits from) is marked as '@immutable', but one or more of its instance fields aren't final: CaptainsPage.myPhone, CaptainsPage.isSuperAdmin - must_be_immutable +warning - lib/views/admin/captain/form_captain.dart:5:8 - Unused import: '../../../constant/style.dart'. Try removing the import directive. - unused_import +warning - lib/views/admin/captain/syrian_driver_not_active.dart:10:8 - Unused import: '../../../controller/functions/encrypt_decrypt.dart'. Try removing the import directive. - unused_import +warning - lib/views/admin/dashboard_v2_widget.dart:13:11 - The value of the local variable 'controller' isn't used. Try removing the variable or using it. - unused_local_variable +warning - lib/views/admin/dashboard_widget.dart:29:42 - The receiver can't be null, so the null-aware operator '?.' is unnecessary. Try replacing the operator '?.' with '.'. - invalid_null_aware_operator +warning - lib/views/admin/dashboard_widget.dart:31:23 - The receiver can't be null, so the null-aware operator '?.' is unnecessary. Try replacing the operator '?.' with '.'. - invalid_null_aware_operator +warning - lib/views/admin/drivers/driver_the_best.dart:97:11 - The value of the local variable 'controller' isn't used. Try removing the variable or using it. - unused_local_variable +warning - lib/views/admin/drivers/monitor_ride.dart:434:54 - The member 'value' can only be used within instance members of subclasses of 'RxList'. - invalid_use_of_protected_member +warning - lib/views/admin/enceypt/encrypt.dart:12:16 - The value of the field 'surface' isn't used. Try removing the field, or using it. - unused_field +warning - lib/views/admin/enceypt/encrypt.dart:16:16 - The value of the field 'accentDim' isn't used. Try removing the field, or using it. - unused_field +warning - lib/views/admin/enceypt/encrypt.dart:19:16 - The value of the field 'accentDecryptDim' isn't used. Try removing the field, or using it. - unused_field +warning - lib/views/admin/enceypt/fingerprint_migration.dart:20:8 - Unused import: 'dart:convert'. Try removing the import directive. - unused_import +warning - lib/views/admin/enceypt/fingerprint_migration.dart:22:8 - Unused import: 'package:http/http.dart'. Try removing the import directive. - unused_import +warning - lib/views/admin/enceypt/fingerprint_migration.dart:23:8 - Unused import: 'package:siro_admin/controller/functions/encrypt_decrypt.dart'. Try removing the import directive. - unused_import +warning - lib/views/admin/enceypt/fingerprint_migration.dart:25:8 - Unused import: '../../../constant/char_map.dart'. Try removing the import directive. - unused_import +warning - lib/views/admin/error/error/error_page.dart:2:8 - Unused import: 'package:siro_admin/constant/colors.dart'. Try removing the import directive. - unused_import +warning - lib/views/admin/packages.dart:6:8 - Unused import: 'package:siro_admin/views/widgets/my_textField.dart'. Try removing the import directive. - unused_import +warning - lib/views/admin/passenger/passenger_details_page.dart:14:8 - Unused import: 'form_passenger.dart'. Try removing the import directive. - unused_import +warning - lib/views/admin/rides/ride_lookup_page.dart:1150:12 - The value of the local variable 'displayPhone' isn't used. Try removing the variable or using it. - unused_local_variable +warning - lib/views/admin/rides/rides.dart:10:7 - This class (or a class that this class inherits from) is marked as '@immutable', but one or more of its instance fields aren't final: Rides.rideAdminController - must_be_immutable +warning - lib/views/admin/security/audit_logs_page.dart:5:8 - Unused import: 'package:intl/intl.dart'. Try removing the import directive. - unused_import +warning - lib/views/admin/security/audit_logs_page.dart:12:11 - The value of the local variable 'controller' isn't used. Try removing the variable or using it. - unused_local_variable +warning - lib/views/admin/static/advanced_analytics_page.dart:6:8 - Unused import: 'package:intl/intl.dart'. Try removing the import directive. - unused_import +warning - lib/views/admin/static/notes_driver_page.dart:3:8 - Unused import: 'package:intl/intl.dart'. Try removing the import directive. - unused_import +warning - lib/views/admin/static/static.dart:29:11 - The value of the local variable 'controller' isn't used. Try removing the variable or using it. - unused_local_variable +warning - lib/views/admin/wallet/wallet.dart:10:7 - This class (or a class that this class inherits from) is marked as '@immutable', but one or more of its instance fields aren't final: Wallet.walletAdminController - must_be_immutable +warning - lib/views/auth/login_page.dart:3:8 - Unused import: 'package:siro_admin/env/env.dart'. Try removing the import directive. - unused_import +warning - lib/views/auth/login_page.dart:5:8 - Unused import: '../../controller/auth/login_controller.dart'. Try removing the import directive. - unused_import +warning - lib/views/auth/login_page.dart:7:8 - Unused import: '../../controller/functions/crud.dart'. Try removing the import directive. - unused_import +warning - lib/views/auth/login_page.dart:8:8 - Unused import: '../../print.dart'. Try removing the import directive. - unused_import +warning - lib/views/auth/login_page.dart:18:16 - The value of the field 'accentDim' isn't used. Try removing the field, or using it. - unused_field +warning - lib/views/auth/login_page.dart:21:16 - The value of the field 'error' isn't used. Try removing the field, or using it. - unused_field +warning - lib/views/widgets/elevated_btn.dart:1:8 - Unused import: 'dart:io'. Try removing the import directive. - unused_import +warning - lib/views/widgets/my_textField.dart:3:8 - Unused import: 'package:get_storage/get_storage.dart'. Try removing the import directive. - unused_import + info - lib/constant/api_key.dart:70:23 - The variable name 'payMobOutClient_id' isn't a lowerCamelCase identifier. Try changing the name to follow the lowerCamelCase style. - non_constant_identifier_names + info - lib/constant/credential.dart:2:8 - The imported package 'crypto' isn't a dependency of the importing package. Try adding a dependency for 'crypto' in the 'pubspec.yaml' file. - depend_on_referenced_packages + info - lib/constant/credential.dart:15:7 - Don't invoke 'print' in production code. Try using a logging framework. - avoid_print + info - lib/constant/credential.dart:32:7 - Don't invoke 'print' in production code. Try using a logging framework. - avoid_print + info - lib/constant/credential.dart:74:5 - Don't invoke 'print' in production code. Try using a logging framework. - avoid_print + info - lib/constant/links.dart:140:17 - The variable name 'send_whatsapp_message' isn't a lowerCamelCase identifier. Try changing the name to follow the lowerCamelCase style. - non_constant_identifier_names + info - lib/constant/links.dart:269:17 - The variable name 'admin_delete_and_blacklist_passenger' isn't a lowerCamelCase identifier. Try changing the name to follow the lowerCamelCase style. - non_constant_identifier_names + info - lib/constant/links.dart:271:17 - The variable name 'admin_update_passenger' isn't a lowerCamelCase identifier. Try changing the name to follow the lowerCamelCase style. - non_constant_identifier_names + info - lib/constant/links.dart:273:17 - The variable name 'admin_unblacklist' isn't a lowerCamelCase identifier. Try changing the name to follow the lowerCamelCase style. - non_constant_identifier_names + info - lib/constant/links.dart:275:17 - The variable name 'admin_get_rides_by_phone' isn't a lowerCamelCase identifier. Try changing the name to follow the lowerCamelCase style. - non_constant_identifier_names + info - lib/constant/links.dart:277:17 - The variable name 'admin_update_ride_status' isn't a lowerCamelCase identifier. Try changing the name to follow the lowerCamelCase style. - non_constant_identifier_names + info - lib/constant/links.dart:282:17 - The variable name 'find_driver_by_phone' isn't a lowerCamelCase identifier. Try changing the name to follow the lowerCamelCase style. - non_constant_identifier_names + info - lib/controller/admin/captain_admin_controller.dart:51:10 - The variable name 'find_driver_by_phone' isn't a lowerCamelCase identifier. Try changing the name to follow the lowerCamelCase style. - non_constant_identifier_names + info - lib/controller/admin/dashboard_controller.dart:25:5 - Don't invoke 'print' in production code. Try using a logging framework. - avoid_print + info - lib/controller/admin/dashboard_controller.dart:28:7 - Don't invoke 'print' in production code. Try using a logging framework. - avoid_print + info - lib/controller/admin/dashboard_controller.dart:42:9 - Don't invoke 'print' in production code. Try using a logging framework. - avoid_print + info - lib/controller/admin/dashboard_controller.dart:47:9 - Don't invoke 'print' in production code. Try using a logging framework. - avoid_print + info - lib/controller/admin/dashboard_controller.dart:50:7 - Don't invoke 'print' in production code. Try using a logging framework. - avoid_print + info - lib/controller/admin/dashboard_controller.dart:58:5 - Don't invoke 'print' in production code. Try using a logging framework. - avoid_print + info - lib/controller/admin/dashboard_controller.dart:62:7 - Don't invoke 'print' in production code. Try using a logging framework. - avoid_print + info - lib/controller/admin/dashboard_controller.dart:72:7 - Don't invoke 'print' in production code. Try using a logging framework. - avoid_print + info - lib/controller/admin/quality_controller.dart:98:8 - Unnecessary override. Try adding behavior in the overriding member or removing the override. - unnecessary_overrides + info - lib/controller/admin/register_captain_controller.dart:42:7 - Don't invoke 'print' in production code. Try using a logging framework. - avoid_print + info - lib/controller/admin/register_captain_controller.dart:59:7 - An uninitialized field should have an explicit type annotation. Try adding a type annotation. - prefer_typing_uninitialized_variables + info - lib/controller/admin/register_captain_controller.dart:400:17 - Empty catch block. Try adding statements to the block, adding a comment to the block, or removing the 'catch' clause. - empty_catches + info - lib/controller/admin/ride_admin_controller.dart:15:7 - An uninitialized field should have an explicit type annotation. Try adding a type annotation. - prefer_typing_uninitialized_variables + info - lib/controller/admin/static_controller.dart:307:7 - Statements in an if should be enclosed in a block. Try wrapping the statement in a block. - curly_braces_in_flow_control_structures + info - lib/controller/admin/static_controller.dart:309:7 - Statements in an if should be enclosed in a block. Try wrapping the statement in a block. - curly_braces_in_flow_control_structures + info - lib/controller/admin/static_controller.dart:326:7 - Statements in an if should be enclosed in a block. Try wrapping the statement in a block. - curly_braces_in_flow_control_structures + info - lib/controller/admin/static_controller.dart:328:7 - Statements in an if should be enclosed in a block. Try wrapping the statement in a block. - curly_braces_in_flow_control_structures + info - lib/controller/auth/login_controller.dart:8:9 - Constructors for public widgets should have a named 'key' parameter. Try adding a named parameter to the constructor. - use_key_in_widget_constructors + info - lib/controller/auth/otp_helper.dart:136:23 - Empty catch block. Try adding statements to the block, adding a comment to the block, or removing the 'catch' clause. - empty_catches + info - lib/controller/auth/otp_helper.dart:163:9 - Statements in an if should be enclosed in a block. Try wrapping the statement in a block. - curly_braces_in_flow_control_structures + info - lib/controller/auth/otp_helper.dart:264:19 - Empty catch block. Try adding statements to the block, adding a comment to the block, or removing the 'catch' clause. - empty_catches + info - lib/controller/firebase/firbase_messge.dart:109:32 - Unnecessary braces in a string interpolation. Try removing the braces. - unnecessary_brace_in_string_interps + info - lib/controller/firebase/firbase_messge.dart:505:9 - Don't invoke 'print' in production code. Try using a logging framework. - avoid_print + info - lib/controller/firebase/firbase_messge.dart:507:9 - Don't invoke 'print' in production code. Try using a logging framework. - avoid_print + info - lib/controller/firebase/firbase_messge.dart:509:9 - Don't invoke 'print' in production code. Try using a logging framework. - avoid_print + info - lib/controller/firebase/firbase_messge.dart:511:9 - Don't invoke 'print' in production code. Try using a logging framework. - avoid_print + info - lib/controller/firebase/firbase_messge.dart:514:7 - Don't invoke 'print' in production code. Try using a logging framework. - avoid_print + info - lib/controller/firebase/notification_service.dart:50:9 - Don't invoke 'print' in production code. Try using a logging framework. - avoid_print + info - lib/controller/firebase/notification_service.dart:52:9 - Don't invoke 'print' in production code. Try using a logging framework. - avoid_print + info - lib/controller/firebase/notification_service.dart:56:7 - Don't invoke 'print' in production code. Try using a logging framework. - avoid_print + info - lib/controller/functions/crud.dart:37:25 - Unnecessary braces in a string interpolation. Try removing the braces. - unnecessary_brace_in_string_interps + info - lib/controller/functions/crud.dart:47:23 - Unnecessary braces in a string interpolation. Try removing the braces. - unnecessary_brace_in_string_interps + info - lib/controller/functions/crud.dart:78:9 - Don't invoke 'print' in production code. Try using a logging framework. - avoid_print + info - lib/controller/functions/crud.dart:334:21 - Unnecessary braces in a string interpolation. Try removing the braces. - unnecessary_brace_in_string_interps + info - lib/controller/functions/crud.dart:336:22 - Unnecessary braces in a string interpolation. Try removing the braces. - unnecessary_brace_in_string_interps + info - lib/controller/functions/crud.dart:338:21 - Unnecessary braces in a string interpolation. Try removing the braces. - unnecessary_brace_in_string_interps + info - lib/controller/functions/device_info.dart:12:9 - An uninitialized variable should have an explicit type annotation. Try adding a type annotation. - prefer_typing_uninitialized_variables + info - lib/controller/functions/device_info.dart:18:34 - 'toMap' is deprecated and shouldn't be used. Use [data] getter instead. Try replacing the use of the deprecated member with the replacement. - deprecated_member_use + info - lib/controller/functions/device_info.dart:23:30 - 'toMap' is deprecated and shouldn't be used. Use [data] getter instead. Try replacing the use of the deprecated member with the replacement. - deprecated_member_use + info - lib/controller/functions/device_info.dart:27:30 - 'toMap' is deprecated and shouldn't be used. Use [data] getter instead. Try replacing the use of the deprecated member with the replacement. - deprecated_member_use + info - lib/controller/functions/device_info.dart:44:7 - Don't invoke 'print' in production code. Try using a logging framework. - avoid_print + info - lib/controller/functions/log_out.dart:91:36 - 'MaterialStateProperty' is deprecated and shouldn't be used. Use WidgetStateProperty instead. Moved to the Widgets layer to make code available outside of Material. This feature was deprecated after v3.19.0-0.3.pre. Try replacing the use of the deprecated member with the replacement. - deprecated_member_use + info - lib/controller/functions/log_out.dart:134:36 - 'MaterialStateProperty' is deprecated and shouldn't be used. Use WidgetStateProperty instead. Moved to the Widgets layer to make code available outside of Material. This feature was deprecated after v3.19.0-0.3.pre. Try replacing the use of the deprecated member with the replacement. - deprecated_member_use + info - lib/controller/functions/security_checks.dart:4:8 - The import of 'package:flutter/cupertino.dart' is unnecessary because all of the used elements are also provided by the import of 'package:flutter/material.dart'. Try removing the import directive. - unnecessary_import + info - lib/controller/functions/security_checks.dart:19:7 - Don't invoke 'print' in production code. Try using a logging framework. - avoid_print + info - lib/controller/functions/security_checks.dart:29:9 - Don't use 'BuildContext's across async gaps. Try rewriting the code to not use the 'BuildContext', or guard the use with a 'mounted' check. - use_build_context_synchronously + info - lib/controller/functions/security_checks.dart:47:7 - Don't invoke 'print' in production code. Try using a logging framework. - avoid_print + info - lib/controller/functions/upload_image copy.dart:1:1 - The file name 'upload_image copy.dart' isn't a lower_case_with_underscores identifier. Try changing the name to follow the lower_case_with_underscores style. - file_names + info - lib/controller/functions/upload_image copy.dart:9:8 - The imported package 'image' isn't a dependency of the importing package. Try adding a dependency for 'image' in the 'pubspec.yaml' file. - depend_on_referenced_packages + info - lib/controller/functions/upload_image copy.dart:11:8 - The imported package 'path_provider' isn't a dependency of the importing package. Try adding a dependency for 'path_provider' in the 'pubspec.yaml' file. - depend_on_referenced_packages + info - lib/controller/functions/upload_image copy.dart:26:7 - An uninitialized field should have an explicit type annotation. Try adding a type annotation. - prefer_typing_uninitialized_variables + info - lib/controller/functions/upload_image copy.dart:143:7 - Don't invoke 'print' in production code. Try using a logging framework. - avoid_print + info - lib/controller/functions/upload_image copy.dart:144:24 - Unnecessary braces in a string interpolation. Try removing the braces. - unnecessary_brace_in_string_interps + info - lib/controller/functions/upload_image copy.dart:155:7 - Don't invoke 'print' in production code. Try using a logging framework. - avoid_print + info - lib/controller/functions/upload_image copy.dart:220:7 - Don't invoke 'print' in production code. Try using a logging framework. - avoid_print + info - lib/controller/functions/upload_image copy.dart:246:25 - Unnecessary braces in a string interpolation. Try removing the braces. - unnecessary_brace_in_string_interps + info - lib/controller/functions/upload_image copy.dart:254:25 - Unnecessary braces in a string interpolation. Try removing the braces. - unnecessary_brace_in_string_interps + info - lib/controller/functions/upload_image copy.dart:321:5 - Don't invoke 'print' in production code. Try using a logging framework. - avoid_print + info - lib/controller/notification_controller.dart:74:40 - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss. Try replacing the use of the deprecated member with the replacement. - deprecated_member_use + info - lib/controller/notification_controller.dart:78:44 - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss. Try replacing the use of the deprecated member with the replacement. - deprecated_member_use + info - lib/controller/notification_controller.dart:137:63 - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss. Try replacing the use of the deprecated member with the replacement. - deprecated_member_use + info - lib/controller/notification_controller.dart:167:34 - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss. Try replacing the use of the deprecated member with the replacement. - deprecated_member_use + info - lib/controller/notification_controller.dart:177:39 - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss. Try replacing the use of the deprecated member with the replacement. - deprecated_member_use + info - lib/controller/notification_controller.dart:195:39 - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss. Try replacing the use of the deprecated member with the replacement. - deprecated_member_use + info - lib/controller/notification_controller.dart:202:37 - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss. Try replacing the use of the deprecated member with the replacement. - deprecated_member_use + info - lib/controller/notification_controller.dart:219:48 - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss. Try replacing the use of the deprecated member with the replacement. - deprecated_member_use + info - lib/controller/notification_controller.dart:228:45 - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss. Try replacing the use of the deprecated member with the replacement. - deprecated_member_use + info - lib/debug_jwt.dart:6:3 - Don't invoke 'print' in production code. Try using a logging framework. - avoid_print + info - lib/debug_jwt.dart:9:3 - Don't invoke 'print' in production code. Try using a logging framework. - avoid_print + info - lib/debug_jwt.dart:12:3 - Don't invoke 'print' in production code. Try using a logging framework. - avoid_print + info - lib/debug_jwt.dart:15:3 - Don't invoke 'print' in production code. Try using a logging framework. - avoid_print + info - lib/debug_jwt.dart:18:5 - Don't invoke 'print' in production code. Try using a logging framework. - avoid_print + info - lib/debug_jwt.dart:20:5 - Don't invoke 'print' in production code. Try using a logging framework. - avoid_print + info - lib/env/env.dart:13:23 - The variable name 'ALLOWED_ADMIN_PHONES' isn't a lowerCamelCase identifier. Try changing the name to follow the lowerCamelCase style. - non_constant_identifier_names + info - lib/env/env.dart:163:23 - The variable name 'payMobOutClient_id' isn't a lowerCamelCase identifier. Try changing the name to follow the lowerCamelCase style. - non_constant_identifier_names + info - lib/main.dart:81:11 - 'background' is deprecated and shouldn't be used. Use surface instead. This feature was deprecated after v3.18.0-0.1.pre. Try replacing the use of the deprecated member with the replacement. - deprecated_member_use + info - lib/views/admin/admin_home_page.dart:2:8 - The import of 'dart:ui' is unnecessary because all of the used elements are also provided by the import of 'package:flutter/material.dart'. Try removing the import directive. - unnecessary_import + info - lib/views/admin/admin_home_page.dart:139:27 - Statements in an if should be enclosed in a block. Try wrapping the statement in a block. - curly_braces_in_flow_control_structures + info - lib/views/admin/admin_home_page.dart:178:34 - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss. Try replacing the use of the deprecated member with the replacement. - deprecated_member_use + info - lib/views/admin/admin_home_page.dart:286:29 - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss. Try replacing the use of the deprecated member with the replacement. - deprecated_member_use + info - lib/views/admin/admin_home_page.dart:287:29 - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss. Try replacing the use of the deprecated member with the replacement. - deprecated_member_use + info - lib/views/admin/admin_home_page.dart:292:31 - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss. Try replacing the use of the deprecated member with the replacement. - deprecated_member_use + info - lib/views/admin/admin_home_page.dart:500:43 - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss. Try replacing the use of the deprecated member with the replacement. - deprecated_member_use + info - lib/views/admin/admin_home_page.dart:503:28 - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss. Try replacing the use of the deprecated member with the replacement. - deprecated_member_use + info - lib/views/admin/admin_home_page.dart:518:34 - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss. Try replacing the use of the deprecated member with the replacement. - deprecated_member_use + info - lib/views/admin/admin_home_page.dart:528:34 - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss. Try replacing the use of the deprecated member with the replacement. - deprecated_member_use + info - lib/views/admin/admin_home_page.dart:661:33 - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss. Try replacing the use of the deprecated member with the replacement. - deprecated_member_use + info - lib/views/admin/admin_home_page.dart:662:36 - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss. Try replacing the use of the deprecated member with the replacement. - deprecated_member_use + info - lib/views/admin/admin_home_page.dart:679:34 - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss. Try replacing the use of the deprecated member with the replacement. - deprecated_member_use + info - lib/views/admin/admin_home_page.dart:680:34 - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss. Try replacing the use of the deprecated member with the replacement. - deprecated_member_use + info - lib/views/admin/admin_home_page.dart:684:56 - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss. Try replacing the use of the deprecated member with the replacement. - deprecated_member_use + info - lib/views/admin/admin_home_page.dart:687:41 - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss. Try replacing the use of the deprecated member with the replacement. - deprecated_member_use + info - lib/views/admin/admin_home_page.dart:1031:29 - Statements in an if should be enclosed in a block. Try wrapping the statement in a block. - curly_braces_in_flow_control_structures + info - lib/views/admin/admin_home_page.dart:1037:57 - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss. Try replacing the use of the deprecated member with the replacement. - deprecated_member_use + info - lib/views/admin/admin_home_page.dart:1093:26 - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss. Try replacing the use of the deprecated member with the replacement. - deprecated_member_use + info - lib/views/admin/captain/captain.dart:36:48 - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss. Try replacing the use of the deprecated member with the replacement. - deprecated_member_use + info - lib/views/admin/captain/captain.dart:85:33 - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss. Try replacing the use of the deprecated member with the replacement. - deprecated_member_use + info - lib/views/admin/captain/captain.dart:99:57 - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss. Try replacing the use of the deprecated member with the replacement. - deprecated_member_use + info - lib/views/admin/captain/captain.dart:213:57 - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss. Try replacing the use of the deprecated member with the replacement. - deprecated_member_use + info - lib/views/admin/captain/captain.dart:259:33 - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss. Try replacing the use of the deprecated member with the replacement. - deprecated_member_use + info - lib/views/admin/captain/captain.dart:283:56 - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss. Try replacing the use of the deprecated member with the replacement. - deprecated_member_use + info - lib/views/admin/captain/captain_details.dart:110:32 - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss. Try replacing the use of the deprecated member with the replacement. - deprecated_member_use + info - lib/views/admin/captain/captain_details.dart:121:52 - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss. Try replacing the use of the deprecated member with the replacement. - deprecated_member_use + info - lib/views/admin/captain/captain_details.dart:144:35 - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss. Try replacing the use of the deprecated member with the replacement. - deprecated_member_use + info - lib/views/admin/captain/captain_details.dart:171:34 - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss. Try replacing the use of the deprecated member with the replacement. - deprecated_member_use + info - lib/views/admin/captain/captain_details.dart:175:47 - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss. Try replacing the use of the deprecated member with the replacement. - deprecated_member_use + info - lib/views/admin/captain/captain_details.dart:189:50 - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss. Try replacing the use of the deprecated member with the replacement. - deprecated_member_use + info - lib/views/admin/captain/captain_details.dart:390:49 - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss. Try replacing the use of the deprecated member with the replacement. - deprecated_member_use + info - lib/views/admin/captain/captain_details.dart:416:43 - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss. Try replacing the use of the deprecated member with the replacement. - deprecated_member_use + info - lib/views/admin/captain/form_captain.dart:69:9 - Don't invoke 'print' in production code. Try using a logging framework. - avoid_print + info - lib/views/admin/captain/register_captain.dart:12:3 - Constructors in '@immutable' classes should be declared as 'const'. Try adding 'const' to the constructor declaration. - prefer_const_constructors_in_immutables + info - lib/views/admin/complaints/complaint_list_page.dart:27:40 - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss. Try replacing the use of the deprecated member with the replacement. - deprecated_member_use + info - lib/views/admin/complaints/complaint_list_page.dart:29:59 - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss. Try replacing the use of the deprecated member with the replacement. - deprecated_member_use + info - lib/views/admin/complaints/complaint_list_page.dart:152:22 - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss. Try replacing the use of the deprecated member with the replacement. - deprecated_member_use + info - lib/views/admin/complaints/complaint_list_page.dart:154:41 - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss. Try replacing the use of the deprecated member with the replacement. - deprecated_member_use + info - lib/views/admin/dashboard_v2_widget.dart:144:41 - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss. Try replacing the use of the deprecated member with the replacement. - deprecated_member_use + info - lib/views/admin/dashboard_v2_widget.dart:147:26 - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss. Try replacing the use of the deprecated member with the replacement. - deprecated_member_use + info - lib/views/admin/dashboard_v2_widget.dart:162:32 - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss. Try replacing the use of the deprecated member with the replacement. - deprecated_member_use + info - lib/views/admin/dashboard_v2_widget.dart:178:38 - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss. Try replacing the use of the deprecated member with the replacement. - deprecated_member_use + info - lib/views/admin/dashboard_v2_widget.dart:270:41 - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss. Try replacing the use of the deprecated member with the replacement. - deprecated_member_use + info - lib/views/admin/dashboard_v2_widget.dart:273:26 - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss. Try replacing the use of the deprecated member with the replacement. - deprecated_member_use + info - lib/views/admin/dashboard_v2_widget.dart:285:28 - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss. Try replacing the use of the deprecated member with the replacement. - deprecated_member_use + info - lib/views/admin/dashboard_widget.dart:14:9 - Parameter 'key' could be a super parameter. Trying converting 'key' to a super parameter. - use_super_parameters + info - lib/views/admin/dashboard_widget.dart:41:32 - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss. Try replacing the use of the deprecated member with the replacement. - deprecated_member_use + info - lib/views/admin/dashboard_widget.dart:75:61 - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss. Try replacing the use of the deprecated member with the replacement. - deprecated_member_use + info - lib/views/admin/drivers/driver_documents_review_page.dart:103:60 - Unnecessary use of 'toList' in a spread. Try removing the invocation of 'toList'. - unnecessary_to_list_in_spreads + info - lib/views/admin/drivers/driver_documents_review_page.dart:145:43 - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss. Try replacing the use of the deprecated member with the replacement. - deprecated_member_use + info - lib/views/admin/drivers/driver_gift_check_page.dart:21:8 - Unnecessary override. Try adding behavior in the overriding member or removing the override. - unnecessary_overrides + info - lib/views/admin/drivers/driver_gift_check_page.dart:147:48 - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss. Try replacing the use of the deprecated member with the replacement. - deprecated_member_use + info - lib/views/admin/drivers/driver_the_best.dart:363:34 - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss. Try replacing the use of the deprecated member with the replacement. - deprecated_member_use + info - lib/views/admin/drivers/driver_the_best.dart:381:32 - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss. Try replacing the use of the deprecated member with the replacement. - deprecated_member_use + info - lib/views/admin/drivers/driver_the_best.dart:426:34 - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss. Try replacing the use of the deprecated member with the replacement. - deprecated_member_use + info - lib/views/admin/drivers/driver_the_best.dart:456:46 - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss. Try replacing the use of the deprecated member with the replacement. - deprecated_member_use + info - lib/views/admin/drivers/driver_the_best.dart:501:38 - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss. Try replacing the use of the deprecated member with the replacement. - deprecated_member_use + info - lib/views/admin/drivers/driver_the_best.dart:503:57 - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss. Try replacing the use of the deprecated member with the replacement. - deprecated_member_use + info - lib/views/admin/drivers/driver_tracker_screen.dart:111:7 - Don't invoke 'print' in production code. Try using a logging framework. - avoid_print + info - lib/views/admin/drivers/driver_tracker_screen.dart:113:7 - Don't invoke 'print' in production code. Try using a logging framework. - avoid_print + info - lib/views/admin/drivers/driver_tracker_screen.dart:118:7 - Don't invoke 'print' in production code. Try using a logging framework. - avoid_print + info - lib/views/admin/drivers/driver_tracker_screen.dart:120:7 - Don't invoke 'print' in production code. Try using a logging framework. - avoid_print + info - lib/views/admin/drivers/driver_tracker_screen.dart:135:7 - Don't invoke 'print' in production code. Try using a logging framework. - avoid_print + info - lib/views/admin/drivers/driver_tracker_screen.dart:137:7 - Don't invoke 'print' in production code. Try using a logging framework. - avoid_print + info - lib/views/admin/drivers/driver_tracker_screen.dart:155:7 - Don't invoke 'print' in production code. Try using a logging framework. - avoid_print + info - lib/views/admin/drivers/driver_tracker_screen.dart:227:22 - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss. Try replacing the use of the deprecated member with the replacement. - deprecated_member_use + info - lib/views/admin/drivers/driver_tracker_screen.dart:270:37 - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss. Try replacing the use of the deprecated member with the replacement. - deprecated_member_use + info - lib/views/admin/drivers/driver_tracker_screen.dart:363:33 - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss. Try replacing the use of the deprecated member with the replacement. - deprecated_member_use + info - lib/views/admin/drivers/driver_tracker_screen.dart:475:46 - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss. Try replacing the use of the deprecated member with the replacement. - deprecated_member_use + info - lib/views/admin/drivers/driver_tracker_screen.dart:514:44 - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss. Try replacing the use of the deprecated member with the replacement. - deprecated_member_use + info - lib/views/admin/drivers/driver_tracker_screen.dart:566:39 - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss. Try replacing the use of the deprecated member with the replacement. - deprecated_member_use + info - lib/views/admin/drivers/driver_tracker_screen.dart:760:41 - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss. Try replacing the use of the deprecated member with the replacement. - deprecated_member_use + info - lib/views/admin/drivers/driver_tracker_screen.dart:774:34 - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss. Try replacing the use of the deprecated member with the replacement. - deprecated_member_use + info - lib/views/admin/drivers/driver_tracker_screen.dart:804:26 - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss. Try replacing the use of the deprecated member with the replacement. - deprecated_member_use + info - lib/views/admin/drivers/monitor_ride.dart:86:43 - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss. Try replacing the use of the deprecated member with the replacement. - deprecated_member_use + info - lib/views/admin/drivers/monitor_ride.dart:272:13 - Statements in an if should be enclosed in a block. Try wrapping the statement in a block. - curly_braces_in_flow_control_structures + info - lib/views/admin/drivers/monitor_ride.dart:316:39 - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss. Try replacing the use of the deprecated member with the replacement. - deprecated_member_use + info - lib/views/admin/drivers/monitor_ride.dart:328:41 - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss. Try replacing the use of the deprecated member with the replacement. - deprecated_member_use + info - lib/views/admin/drivers/monitor_ride.dart:436:41 - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss. Try replacing the use of the deprecated member with the replacement. - deprecated_member_use + info - lib/views/admin/drivers/monitor_ride.dart:438:47 - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss. Try replacing the use of the deprecated member with the replacement. - deprecated_member_use + info - lib/views/admin/drivers/monitor_ride.dart:488:55 - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss. Try replacing the use of the deprecated member with the replacement. - deprecated_member_use + info - lib/views/admin/drivers/monitor_ride.dart:537:39 - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss. Try replacing the use of the deprecated member with the replacement. - deprecated_member_use + info - lib/views/admin/drivers/monitor_ride.dart:556:33 - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss. Try replacing the use of the deprecated member with the replacement. - deprecated_member_use + info - lib/views/admin/drivers/monitor_ride.dart:588:41 - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss. Try replacing the use of the deprecated member with the replacement. - deprecated_member_use + info - lib/views/admin/drivers/monitor_ride.dart:600:41 - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss. Try replacing the use of the deprecated member with the replacement. - deprecated_member_use + info - lib/views/admin/drivers/monitor_ride.dart:656:41 - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss. Try replacing the use of the deprecated member with the replacement. - deprecated_member_use + info - lib/views/admin/drivers/monitor_ride.dart:673:49 - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss. Try replacing the use of the deprecated member with the replacement. - deprecated_member_use + info - lib/views/admin/drivers/monitor_ride.dart:740:50 - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss. Try replacing the use of the deprecated member with the replacement. - deprecated_member_use + info - lib/views/admin/drivers/monitor_ride.dart:785:22 - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss. Try replacing the use of the deprecated member with the replacement. - deprecated_member_use + info - lib/views/admin/drivers/monitor_ride.dart:798:30 - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss. Try replacing the use of the deprecated member with the replacement. - deprecated_member_use + info - lib/views/admin/drivers/monitor_ride.dart:815:30 - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss. Try replacing the use of the deprecated member with the replacement. - deprecated_member_use + info - lib/views/admin/employee/employee_page.dart:43:48 - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss. Try replacing the use of the deprecated member with the replacement. - deprecated_member_use + info - lib/views/admin/employee/employee_page.dart:68:41 - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss. Try replacing the use of the deprecated member with the replacement. - deprecated_member_use + info - lib/views/admin/employee/employee_page.dart:152:48 - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss. Try replacing the use of the deprecated member with the replacement. - deprecated_member_use + info - lib/views/admin/employee/employee_page.dart:155:33 - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss. Try replacing the use of the deprecated member with the replacement. - deprecated_member_use + info - lib/views/admin/employee/employee_page.dart:178:45 - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss. Try replacing the use of the deprecated member with the replacement. - deprecated_member_use + info - lib/views/admin/employee/employee_page.dart:182:47 - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss. Try replacing the use of the deprecated member with the replacement. - deprecated_member_use + info - lib/views/admin/employee/employee_page.dart:189:46 - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss. Try replacing the use of the deprecated member with the replacement. - deprecated_member_use + info - lib/views/admin/employee/employee_page.dart:192:61 - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss. Try replacing the use of the deprecated member with the replacement. - deprecated_member_use + info - lib/views/admin/employee/employee_page.dart:252:43 - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss. Try replacing the use of the deprecated member with the replacement. - deprecated_member_use + info - lib/views/admin/employee/employee_page.dart:282:56 - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss. Try replacing the use of the deprecated member with the replacement. - deprecated_member_use + info - lib/views/admin/employee/employee_page.dart:289:35 - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss. Try replacing the use of the deprecated member with the replacement. - deprecated_member_use + info - lib/views/admin/employee/employee_page.dart:414:48 - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss. Try replacing the use of the deprecated member with the replacement. - deprecated_member_use + info - lib/views/admin/employee/employee_page.dart:423:53 - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss. Try replacing the use of the deprecated member with the replacement. - deprecated_member_use + info - lib/views/admin/employee/employee_page.dart:455:46 - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss. Try replacing the use of the deprecated member with the replacement. - deprecated_member_use + info - lib/views/admin/employee/employee_page.dart:534:48 - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss. Try replacing the use of the deprecated member with the replacement. - deprecated_member_use + info - lib/views/admin/enceypt/driver_fingerprint_migration.dart:259:24 - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss. Try replacing the use of the deprecated member with the replacement. - deprecated_member_use + info - lib/views/admin/enceypt/driver_fingerprint_migration.dart:261:43 - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss. Try replacing the use of the deprecated member with the replacement. - deprecated_member_use + info - lib/views/admin/enceypt/encrypt.dart:30:9 - Parameter 'key' could be a super parameter. Trying converting 'key' to a super parameter. - use_super_parameters + info - lib/views/admin/enceypt/encrypt.dart:345:56 - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss. Try replacing the use of the deprecated member with the replacement. - deprecated_member_use + info - lib/views/admin/enceypt/encrypt.dart:374:62 - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss. Try replacing the use of the deprecated member with the replacement. - deprecated_member_use + info - lib/views/admin/enceypt/encrypt.dart:509:50 - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss. Try replacing the use of the deprecated member with the replacement. - deprecated_member_use + info - lib/views/admin/enceypt/encrypt.dart:538:60 - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss. Try replacing the use of the deprecated member with the replacement. - deprecated_member_use + info - lib/views/admin/enceypt/encrypt.dart:677:33 - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss. Try replacing the use of the deprecated member with the replacement. - deprecated_member_use + info - lib/views/admin/enceypt/encrypt.dart:832:26 - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss. Try replacing the use of the deprecated member with the replacement. - deprecated_member_use + info - lib/views/admin/enceypt/encrypt.dart:834:45 - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss. Try replacing the use of the deprecated member with the replacement. - deprecated_member_use + info - lib/views/admin/enceypt/fingerprint_migration.dart:23:74 - The prefix 'X' isn't a lower_case_with_underscores identifier. Try changing the prefix to follow the lower_case_with_underscores style. - library_prefixes + info - lib/views/admin/enceypt/fingerprint_migration.dart:242:13 - Unnecessary instance of 'Container'. Try removing the 'Container' (but not its children) from the widget tree. - avoid_unnecessary_containers + info - lib/views/admin/enceypt/fingerprint_migration.dart:245:19 - Don't invoke 'print' in production code. Try using a logging framework. - avoid_print + info - lib/views/admin/enceypt/fingerprint_migration.dart:252:13 - Unnecessary instance of 'Container'. Try removing the 'Container' (but not its children) from the widget tree. - avoid_unnecessary_containers + info - lib/views/admin/enceypt/fingerprint_migration.dart:255:19 - Don't invoke 'print' in production code. Try using a logging framework. - avoid_print + info - lib/views/admin/enceypt/fingerprint_migration.dart:263:13 - Unnecessary instance of 'Container'. Try removing the 'Container' (but not its children) from the widget tree. - avoid_unnecessary_containers + info - lib/views/admin/enceypt/fingerprint_migration.dart:266:19 - Don't invoke 'print' in production code. Try using a logging framework. - avoid_print + info - lib/views/admin/enceypt/fingerprint_migration.dart:358:22 - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss. Try replacing the use of the deprecated member with the replacement. - deprecated_member_use + info - lib/views/admin/enceypt/fingerprint_migration.dart:360:41 - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss. Try replacing the use of the deprecated member with the replacement. - deprecated_member_use + info - lib/views/admin/error/error/error_page.dart:43:9 - Parameter 'key' could be a super parameter. Trying converting 'key' to a super parameter. - use_super_parameters + info - lib/views/admin/error/error/error_page.dart:157:31 - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss. Try replacing the use of the deprecated member with the replacement. - deprecated_member_use + info - lib/views/admin/error/error/error_page.dart:159:50 - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss. Try replacing the use of the deprecated member with the replacement. - deprecated_member_use + info - lib/views/admin/error/error/error_page.dart:285:33 - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss. Try replacing the use of the deprecated member with the replacement. - deprecated_member_use + info - lib/views/admin/error/error/error_page.dart:414:35 - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss. Try replacing the use of the deprecated member with the replacement. - deprecated_member_use + info - lib/views/admin/error/error/error_page.dart:415:35 - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss. Try replacing the use of the deprecated member with the replacement. - deprecated_member_use + info - lib/views/admin/error/error/error_page.dart:429:33 - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss. Try replacing the use of the deprecated member with the replacement. - deprecated_member_use + info - lib/views/admin/error/error/error_page.dart:622:22 - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss. Try replacing the use of the deprecated member with the replacement. - deprecated_member_use + info - lib/views/admin/error/error/error_page.dart:624:41 - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss. Try replacing the use of the deprecated member with the replacement. - deprecated_member_use + info - lib/views/admin/error/error/error_page.dart:639:36 - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss. Try replacing the use of the deprecated member with the replacement. - deprecated_member_use + info - lib/views/admin/financial/financial_v2_page.dart:115:41 - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss. Try replacing the use of the deprecated member with the replacement. - deprecated_member_use + info - lib/views/admin/financial/financial_v2_page.dart:119:44 - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss. Try replacing the use of the deprecated member with the replacement. - deprecated_member_use + info - lib/views/admin/financial/financial_v2_page.dart:127:28 - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss. Try replacing the use of the deprecated member with the replacement. - deprecated_member_use + info - lib/views/admin/financial/financial_v2_page.dart:208:7 - Statements in an if should be enclosed in a block. Try wrapping the statement in a block. - curly_braces_in_flow_control_structures + info - lib/views/admin/financial/financial_v2_page.dart:259:56 - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss. Try replacing the use of the deprecated member with the replacement. - deprecated_member_use + info - lib/views/admin/packages.dart:84:30 - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss. Try replacing the use of the deprecated member with the replacement. - deprecated_member_use + info - lib/views/admin/packages.dart:86:49 - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss. Try replacing the use of the deprecated member with the replacement. - deprecated_member_use + info - lib/views/admin/packages.dart:148:30 - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss. Try replacing the use of the deprecated member with the replacement. - deprecated_member_use + info - lib/views/admin/packages.dart:168:37 - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss. Try replacing the use of the deprecated member with the replacement. - deprecated_member_use + info - lib/views/admin/packages.dart:169:37 - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss. Try replacing the use of the deprecated member with the replacement. - deprecated_member_use + info - lib/views/admin/packages.dart:173:59 - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss. Try replacing the use of the deprecated member with the replacement. - deprecated_member_use + info - lib/views/admin/packages.dart:211:34 - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss. Try replacing the use of the deprecated member with the replacement. - deprecated_member_use + info - lib/views/admin/packages.dart:213:53 - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss. Try replacing the use of the deprecated member with the replacement. - deprecated_member_use + info - lib/views/admin/packages.dart:242:22 - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss. Try replacing the use of the deprecated member with the replacement. - deprecated_member_use + info - lib/views/admin/packages.dart:337:38 - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss. Try replacing the use of the deprecated member with the replacement. - deprecated_member_use + info - lib/views/admin/packages.dart:339:57 - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss. Try replacing the use of the deprecated member with the replacement. - deprecated_member_use + info - lib/views/admin/packages.dart:499:22 - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss. Try replacing the use of the deprecated member with the replacement. - deprecated_member_use + info - lib/views/admin/packages.dart:501:41 - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss. Try replacing the use of the deprecated member with the replacement. - deprecated_member_use + info - lib/views/admin/packages.dart:562:35 - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss. Try replacing the use of the deprecated member with the replacement. - deprecated_member_use + info - lib/views/admin/packages.dart:584:34 - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss. Try replacing the use of the deprecated member with the replacement. - deprecated_member_use + info - lib/views/admin/packages.dart:595:34 - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss. Try replacing the use of the deprecated member with the replacement. - deprecated_member_use + info - lib/views/admin/passenger/passenger.dart:104:32 - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss. Try replacing the use of the deprecated member with the replacement. - deprecated_member_use + info - lib/views/admin/passenger/passenger.dart:117:48 - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss. Try replacing the use of the deprecated member with the replacement. - deprecated_member_use + info - lib/views/admin/passenger/passenger.dart:208:47 - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss. Try replacing the use of the deprecated member with the replacement. - deprecated_member_use + info - lib/views/admin/passenger/passenger.dart:211:32 - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss. Try replacing the use of the deprecated member with the replacement. - deprecated_member_use + info - lib/views/admin/passenger/passenger.dart:235:58 - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss. Try replacing the use of the deprecated member with the replacement. - deprecated_member_use + info - lib/views/admin/passenger/passenger.dart:382:37 - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss. Try replacing the use of the deprecated member with the replacement. - deprecated_member_use + info - lib/views/admin/passenger/passenger_details_page.dart:147:32 - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss. Try replacing the use of the deprecated member with the replacement. - deprecated_member_use + info - lib/views/admin/passenger/passenger_details_page.dart:158:52 - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss. Try replacing the use of the deprecated member with the replacement. - deprecated_member_use + info - lib/views/admin/passenger/passenger_details_page.dart:179:34 - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss. Try replacing the use of the deprecated member with the replacement. - deprecated_member_use + info - lib/views/admin/passenger/passenger_details_page.dart:206:34 - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss. Try replacing the use of the deprecated member with the replacement. - deprecated_member_use + info - lib/views/admin/passenger/passenger_details_page.dart:210:47 - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss. Try replacing the use of the deprecated member with the replacement. - deprecated_member_use + info - lib/views/admin/passenger/passenger_details_page.dart:224:50 - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss. Try replacing the use of the deprecated member with the replacement. - deprecated_member_use + info - lib/views/admin/passenger/passenger_details_page.dart:403:49 - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss. Try replacing the use of the deprecated member with the replacement. - deprecated_member_use + info - lib/views/admin/passenger/passenger_details_page.dart:442:45 - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss. Try replacing the use of the deprecated member with the replacement. - deprecated_member_use + info - lib/views/admin/passenger/passenger_details_page.dart:447:45 - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss. Try replacing the use of the deprecated member with the replacement. - deprecated_member_use + info - lib/views/admin/rides/ride_lookup_page.dart:249:41 - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss. Try replacing the use of the deprecated member with the replacement. - deprecated_member_use + info - lib/views/admin/rides/ride_lookup_page.dart:266:41 - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss. Try replacing the use of the deprecated member with the replacement. - deprecated_member_use + info - lib/views/admin/rides/ride_lookup_page.dart:284:59 - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss. Try replacing the use of the deprecated member with the replacement. - deprecated_member_use + info - lib/views/admin/rides/ride_lookup_page.dart:409:35 - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss. Try replacing the use of the deprecated member with the replacement. - deprecated_member_use + info - lib/views/admin/rides/ride_lookup_page.dart:438:19 - Unnecessary use of string interpolation. Try replacing the string literal with the variable name. - unnecessary_string_interpolations + info - lib/views/admin/rides/ride_lookup_page.dart:459:33 - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss. Try replacing the use of the deprecated member with the replacement. - deprecated_member_use + info - lib/views/admin/rides/ride_lookup_page.dart:497:33 - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss. Try replacing the use of the deprecated member with the replacement. - deprecated_member_use + info - lib/views/admin/rides/ride_lookup_page.dart:543:33 - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss. Try replacing the use of the deprecated member with the replacement. - deprecated_member_use + info - lib/views/admin/rides/ride_lookup_page.dart:548:47 - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss. Try replacing the use of the deprecated member with the replacement. - deprecated_member_use + info - lib/views/admin/rides/ride_lookup_page.dart:572:49 - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss. Try replacing the use of the deprecated member with the replacement. - deprecated_member_use + info - lib/views/admin/rides/ride_lookup_page.dart:604:44 - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss. Try replacing the use of the deprecated member with the replacement. - deprecated_member_use + info - lib/views/admin/rides/ride_lookup_page.dart:634:48 - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss. Try replacing the use of the deprecated member with the replacement. - deprecated_member_use + info - lib/views/admin/rides/ride_lookup_page.dart:740:54 - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss. Try replacing the use of the deprecated member with the replacement. - deprecated_member_use + info - lib/views/admin/rides/ride_lookup_page.dart:743:58 - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss. Try replacing the use of the deprecated member with the replacement. - deprecated_member_use + info - lib/views/admin/rides/ride_lookup_page.dart:821:17 - Statements in an if should be enclosed in a block. Try wrapping the statement in a block. - curly_braces_in_flow_control_structures + info - lib/views/admin/rides/ride_lookup_page.dart:838:24 - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss. Try replacing the use of the deprecated member with the replacement. - deprecated_member_use + info - lib/views/admin/rides/ride_lookup_page.dart:864:7 - Statements in an if should be enclosed in a block. Try wrapping the statement in a block. - curly_braces_in_flow_control_structures + info - lib/views/admin/rides/ride_lookup_page.dart:867:7 - Statements in an if should be enclosed in a block. Try wrapping the statement in a block. - curly_braces_in_flow_control_structures + info - lib/views/admin/rides/ride_lookup_page.dart:876:7 - Statements in an if should be enclosed in a block. Try wrapping the statement in a block. - curly_braces_in_flow_control_structures + info - lib/views/admin/rides/ride_lookup_page.dart:946:19 - Empty catch block. Try adding statements to the block, adding a comment to the block, or removing the 'catch' clause. - empty_catches + info - lib/views/admin/rides/ride_lookup_page.dart:972:17 - Empty catch block. Try adding statements to the block, adding a comment to the block, or removing the 'catch' clause. - empty_catches + info - lib/views/admin/rides/ride_lookup_page.dart:1009:54 - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss. Try replacing the use of the deprecated member with the replacement. - deprecated_member_use + info - lib/views/admin/rides/ride_lookup_page.dart:1028:53 - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss. Try replacing the use of the deprecated member with the replacement. - deprecated_member_use + info - lib/views/admin/rides/ride_lookup_page.dart:1049:53 - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss. Try replacing the use of the deprecated member with the replacement. - deprecated_member_use + info - lib/views/admin/rides/ride_lookup_page.dart:1070:64 - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss. Try replacing the use of the deprecated member with the replacement. - deprecated_member_use + info - lib/views/admin/rides/ride_lookup_page.dart:1094:41 - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss. Try replacing the use of the deprecated member with the replacement. - deprecated_member_use + info - lib/views/admin/rides/ride_lookup_page.dart:1161:26 - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss. Try replacing the use of the deprecated member with the replacement. - deprecated_member_use + info - lib/views/admin/rides/ride_lookup_page.dart:1196:17 - Statements in an if should be enclosed in a block. Try wrapping the statement in a block. - curly_braces_in_flow_control_structures + info - lib/views/admin/rides/ride_lookup_page.dart:1203:37 - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss. Try replacing the use of the deprecated member with the replacement. - deprecated_member_use + info - lib/views/admin/security/audit_logs_page.dart:36:63 - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss. Try replacing the use of the deprecated member with the replacement. - deprecated_member_use + info - lib/views/admin/security/audit_logs_page.dart:102:40 - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss. Try replacing the use of the deprecated member with the replacement. - deprecated_member_use + info - lib/views/admin/server/monitor_server_page.dart:6:9 - Parameter 'key' could be a super parameter. Trying converting 'key' to a super parameter. - use_super_parameters + info - lib/views/admin/server/monitor_server_page.dart:55:36 - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss. Try replacing the use of the deprecated member with the replacement. - deprecated_member_use + info - lib/views/admin/server/monitor_server_page.dart:166:33 - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss. Try replacing the use of the deprecated member with the replacement. - deprecated_member_use + info - lib/views/admin/server/monitor_server_page.dart:225:29 - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss. Try replacing the use of the deprecated member with the replacement. - deprecated_member_use + info - lib/views/admin/server/monitor_server_page.dart:227:48 - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss. Try replacing the use of the deprecated member with the replacement. - deprecated_member_use + info - lib/views/admin/server/monitor_server_page.dart:233:51 - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss. Try replacing the use of the deprecated member with the replacement. - deprecated_member_use + info - lib/views/admin/server/monitor_server_page.dart:248:50 - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss. Try replacing the use of the deprecated member with the replacement. - deprecated_member_use + info - lib/views/admin/server/monitor_server_page.dart:285:26 - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss. Try replacing the use of the deprecated member with the replacement. - deprecated_member_use + info - lib/views/admin/server/monitor_server_page.dart:285:50 - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss. Try replacing the use of the deprecated member with the replacement. - deprecated_member_use + info - lib/views/admin/server/monitor_server_page.dart:290:26 - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss. Try replacing the use of the deprecated member with the replacement. - deprecated_member_use + info - lib/views/admin/server/monitor_server_page.dart:305:39 - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss. Try replacing the use of the deprecated member with the replacement. - deprecated_member_use + info - lib/views/admin/server/monitor_server_page.dart:365:36 - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss. Try replacing the use of the deprecated member with the replacement. - deprecated_member_use + info - lib/views/admin/server/monitor_server_page.dart:366:34 - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss. Try replacing the use of the deprecated member with the replacement. - deprecated_member_use + info - lib/views/admin/server/monitor_server_page.dart:389:40 - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss. Try replacing the use of the deprecated member with the replacement. - deprecated_member_use + info - lib/views/admin/server/monitor_server_page.dart:390:38 - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss. Try replacing the use of the deprecated member with the replacement. - deprecated_member_use + info - lib/views/admin/server/monitor_server_page.dart:448:41 - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss. Try replacing the use of the deprecated member with the replacement. - deprecated_member_use + info - lib/views/admin/server/monitor_server_page.dart:474:48 - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss. Try replacing the use of the deprecated member with the replacement. - deprecated_member_use + info - lib/views/admin/server/monitor_server_page.dart:486:44 - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss. Try replacing the use of the deprecated member with the replacement. - deprecated_member_use + info - lib/views/admin/server/monitor_server_page.dart:524:33 - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss. Try replacing the use of the deprecated member with the replacement. - deprecated_member_use + info - lib/views/admin/server/monitor_server_page.dart:548:40 - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss. Try replacing the use of the deprecated member with the replacement. - deprecated_member_use + info - lib/views/admin/server/monitor_server_page.dart:588:48 - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss. Try replacing the use of the deprecated member with the replacement. - deprecated_member_use + info - lib/views/admin/server/monitor_server_page.dart:598:38 - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss. Try replacing the use of the deprecated member with the replacement. - deprecated_member_use + info - lib/views/admin/server/monitor_server_page.dart:630:52 - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss. Try replacing the use of the deprecated member with the replacement. - deprecated_member_use + info - lib/views/admin/staff/add_staff_page.dart:146:48 - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss. Try replacing the use of the deprecated member with the replacement. - deprecated_member_use + info - lib/views/admin/staff/add_staff_page.dart:179:48 - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss. Try replacing the use of the deprecated member with the replacement. - deprecated_member_use + info - lib/views/admin/staff/add_staff_page.dart:182:9 - 'value' is deprecated and shouldn't be used. Use initialValue instead. This will set the initial value for the form field. This feature was deprecated after v3.33.0-1.0.pre. Try replacing the use of the deprecated member with the replacement. - deprecated_member_use + info - lib/views/admin/static/advanced_analytics_page.dart:96:43 - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss. Try replacing the use of the deprecated member with the replacement. - deprecated_member_use + info - lib/views/admin/static/advanced_analytics_page.dart:172:52 - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss. Try replacing the use of the deprecated member with the replacement. - deprecated_member_use + info - lib/views/admin/static/advanced_analytics_page.dart:182:55 - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss. Try replacing the use of the deprecated member with the replacement. - deprecated_member_use + info - lib/views/admin/static/advanced_analytics_page.dart:195:7 - Statements in an if should be enclosed in a block. Try wrapping the statement in a block. - curly_braces_in_flow_control_structures + info - lib/views/admin/static/advanced_analytics_page.dart:284:50 - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss. Try replacing the use of the deprecated member with the replacement. - deprecated_member_use + info - lib/views/admin/static/notes_driver_page.dart:77:45 - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss. Try replacing the use of the deprecated member with the replacement. - deprecated_member_use + info - lib/views/admin/static/notes_driver_page.dart:96:59 - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss. Try replacing the use of the deprecated member with the replacement. - deprecated_member_use + info - lib/views/admin/static/static.dart:254:38 - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss. Try replacing the use of the deprecated member with the replacement. - deprecated_member_use + info - lib/views/admin/static/static.dart:256:57 - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss. Try replacing the use of the deprecated member with the replacement. - deprecated_member_use + info - lib/views/admin/static/static.dart:350:55 - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss. Try replacing the use of the deprecated member with the replacement. - deprecated_member_use + info - lib/views/admin/static/static.dart:420:46 - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss. Try replacing the use of the deprecated member with the replacement. - deprecated_member_use + info - lib/views/admin/static/static.dart:528:43 - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss. Try replacing the use of the deprecated member with the replacement. - deprecated_member_use + info - lib/views/admin/static/static.dart:531:28 - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss. Try replacing the use of the deprecated member with the replacement. - deprecated_member_use + info - lib/views/admin/static/static.dart:549:38 - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss. Try replacing the use of the deprecated member with the replacement. - deprecated_member_use + info - lib/views/admin/static/static.dart:551:57 - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss. Try replacing the use of the deprecated member with the replacement. - deprecated_member_use + info - lib/views/admin/static/static.dart:665:35 - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss. Try replacing the use of the deprecated member with the replacement. - deprecated_member_use + info - lib/views/admin/static/static.dart:687:42 - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss. Try replacing the use of the deprecated member with the replacement. - deprecated_member_use + info - lib/views/admin/static/static.dart:689:61 - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss. Try replacing the use of the deprecated member with the replacement. - deprecated_member_use + info - lib/views/admin/static/static.dart:771:43 - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss. Try replacing the use of the deprecated member with the replacement. - deprecated_member_use + info - lib/views/admin/static/static.dart:813:22 - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss. Try replacing the use of the deprecated member with the replacement. - deprecated_member_use + info - lib/views/admin/static/static.dart:815:41 - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss. Try replacing the use of the deprecated member with the replacement. - deprecated_member_use + info - lib/views/admin/static/static.dart:872:39 - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss. Try replacing the use of the deprecated member with the replacement. - deprecated_member_use + info - lib/views/admin/static/static.dart:874:58 - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss. Try replacing the use of the deprecated member with the replacement. - deprecated_member_use + info - lib/views/admin/static/static.dart:988:47 - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss. Try replacing the use of the deprecated member with the replacement. - deprecated_member_use + info - lib/views/admin/static/static.dart:992:41 - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss. Try replacing the use of the deprecated member with the replacement. - deprecated_member_use + info - lib/views/admin/static/static.dart:1098:31 - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss. Try replacing the use of the deprecated member with the replacement. - deprecated_member_use + info - lib/views/admin/static/static.dart:1103:35 - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss. Try replacing the use of the deprecated member with the replacement. - deprecated_member_use + info - lib/views/admin/static/static.dart:1158:40 - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss. Try replacing the use of the deprecated member with the replacement. - deprecated_member_use + info - lib/views/admin/static/static.dart:1196:24 - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss. Try replacing the use of the deprecated member with the replacement. - deprecated_member_use + info - lib/views/admin/static/static.dart:1196:49 - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss. Try replacing the use of the deprecated member with the replacement. - deprecated_member_use + info - lib/views/auth/login_page.dart:185:50 - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss. Try replacing the use of the deprecated member with the replacement. - deprecated_member_use + info - lib/views/auth/login_page.dart:188:53 - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss. Try replacing the use of the deprecated member with the replacement. - deprecated_member_use + info - lib/views/auth/login_page.dart:346:30 - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss. Try replacing the use of the deprecated member with the replacement. - deprecated_member_use + info - lib/views/auth/login_page.dart:351:36 - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss. Try replacing the use of the deprecated member with the replacement. - deprecated_member_use + info - lib/views/auth/login_page.dart:432:15 - Unnecessary 'const' keyword. Try removing the keyword. - unnecessary_const + info - lib/views/invoice/add_invoice_page.dart:90:41 - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss. Try replacing the use of the deprecated member with the replacement. - deprecated_member_use + info - lib/views/invoice/add_invoice_page.dart:109:39 - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss. Try replacing the use of the deprecated member with the replacement. - deprecated_member_use + info - lib/views/invoice/add_invoice_page.dart:117:37 - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss. Try replacing the use of the deprecated member with the replacement. - deprecated_member_use + info - lib/views/invoice/add_invoice_page.dart:182:43 - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss. Try replacing the use of the deprecated member with the replacement. - deprecated_member_use + info - lib/views/invoice/add_invoice_page.dart:253:53 - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss. Try replacing the use of the deprecated member with the replacement. - deprecated_member_use + info - lib/views/invoice/add_invoice_page.dart:277:55 - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss. Try replacing the use of the deprecated member with the replacement. - deprecated_member_use + info - lib/views/invoice/add_invoice_page.dart:317:49 - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss. Try replacing the use of the deprecated member with the replacement. - deprecated_member_use + info - lib/views/invoice/add_invoice_page.dart:381:52 - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss. Try replacing the use of the deprecated member with the replacement. - deprecated_member_use + info - lib/views/invoice/invoice_list_page.dart:15:3 - Invalid use of a private type in a public API. Try making the private type public, or making the API that uses the private type also be private. - library_private_types_in_public_api + info - lib/views/invoice/invoice_list_page.dart:59:46 - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss. Try replacing the use of the deprecated member with the replacement. - deprecated_member_use + info - lib/views/invoice/invoice_list_page.dart:141:37 - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss. Try replacing the use of the deprecated member with the replacement. - deprecated_member_use + info - lib/views/invoice/invoice_list_page.dart:207:33 - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss. Try replacing the use of the deprecated member with the replacement. - deprecated_member_use + info - lib/views/invoice/invoice_list_page.dart:276:33 - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss. Try replacing the use of the deprecated member with the replacement. - deprecated_member_use + info - lib/views/invoice/invoice_list_page.dart:292:48 - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss. Try replacing the use of the deprecated member with the replacement. - deprecated_member_use + info - lib/views/invoice/invoice_list_page.dart:314:33 - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss. Try replacing the use of the deprecated member with the replacement. - deprecated_member_use + info - lib/views/invoice/invoice_list_page.dart:341:41 - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss. Try replacing the use of the deprecated member with the replacement. - deprecated_member_use + info - lib/views/invoice/invoice_list_page.dart:410:23 - Unnecessary use of string interpolation. Try replacing the string literal with the variable name. - unnecessary_string_interpolations + info - lib/views/invoice/invoice_list_page.dart:420:43 - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss. Try replacing the use of the deprecated member with the replacement. - deprecated_member_use + info - lib/views/widgets/circle_container.dart:11:3 - Parameter 'key' could be a super parameter. Trying converting 'key' to a super parameter. - use_super_parameters + info - lib/views/widgets/elevated_btn.dart:15:9 - Parameter 'key' could be a super parameter. Trying converting 'key' to a super parameter. - use_super_parameters + info - lib/views/widgets/elevated_btn.dart:32:47 - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss. Try replacing the use of the deprecated member with the replacement. - deprecated_member_use + info - lib/views/widgets/icon_widget_menu.dart:7:9 - Parameter 'key' could be a super parameter. Trying converting 'key' to a super parameter. - use_super_parameters + info - lib/views/widgets/my_textField.dart:1:1 - The file name 'my_textField.dart' isn't a lower_case_with_underscores identifier. Try changing the name to follow the lower_case_with_underscores style. - file_names + info - lib/views/widgets/mydialoug.dart:2:8 - The import of 'package:flutter/cupertino.dart' is unnecessary because all of the used elements are also provided by the import of 'package:flutter/material.dart'. Try removing the import directive. - unnecessary_import + info - lib/views/widgets/snackbar.dart:15:25 - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss. Try replacing the use of the deprecated member with the replacement. - deprecated_member_use + info - lib/views/widgets/snackbar.dart:28:40 - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss. Try replacing the use of the deprecated member with the replacement. - deprecated_member_use + info - lib/views/widgets/snackbar.dart:57:29 - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss. Try replacing the use of the deprecated member with the replacement. - deprecated_member_use + info - lib/views/widgets/snackbar.dart:80:42 - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss. Try replacing the use of the deprecated member with the replacement. - deprecated_member_use + info - lib/views/widgets/snackbar.dart:109:29 - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss. Try replacing the use of the deprecated member with the replacement. - deprecated_member_use + +444 issues found. diff --git a/siro_admin/android/.gitignore b/siro_admin/android/.gitignore new file mode 100644 index 0000000..55afd91 --- /dev/null +++ b/siro_admin/android/.gitignore @@ -0,0 +1,13 @@ +gradle-wrapper.jar +/.gradle +/captures/ +/gradlew +/gradlew.bat +/local.properties +GeneratedPluginRegistrant.java + +# Remember to never publicly share your keystore. +# See https://flutter.dev/to/reference-keystore +key.properties +**/*.keystore +**/*.jks diff --git a/siro_admin/android/app/build.gradle b/siro_admin/android/app/build.gradle new file mode 100644 index 0000000..546a19b --- /dev/null +++ b/siro_admin/android/app/build.gradle @@ -0,0 +1,84 @@ +plugins { + id "com.android.application" + // START: FlutterFire Configuration + id 'com.google.gms.google-services' + id 'com.google.firebase.crashlytics' + // END: FlutterFire Configuration + id "kotlin-android" + // The Flutter Gradle Plugin must be applied after the Android and Kotlin Gradle plugins. + id "dev.flutter.flutter-gradle-plugin" +} +def keystoreProperties = new Properties() +def keystorePropertiesFile = rootProject.file("key.properties") +if (keystorePropertiesFile.exists()) { + keystoreProperties.load(new FileInputStream(keystorePropertiesFile)) +} +android { + namespace = "com.siro.siro_admin" + compileSdk = flutter.compileSdkVersion + ndkVersion = "27.0.12077973" + + externalNativeBuild { + cmake { + path "src/main/cpp/CMakeLists.txt" + version "3.22.1" // Match cmake_minimum_required in CMakeLists.txt + } + } + defaultConfig { + ndk { + abiFilters "armeabi-v7a", "arm64-v8a" // Keep these! + } + } + compileOptions { + sourceCompatibility = JavaVersion.VERSION_1_8 + targetCompatibility = JavaVersion.VERSION_1_8 + } + + kotlinOptions { + jvmTarget = JavaVersion.VERSION_1_8 + } + + defaultConfig { + // TODO: Specify your own unique Application ID (https://developer.android.com/studio/build/application-id.html). + applicationId = "com.siro.siro_admin" + // You can update the following values to match your application needs. + // For more information, see: https://flutter.dev/to/review-gradle-config. + minSdk = 30 + targetSdk = 36 + versionCode = 5 + versionName = '1.0.5' + multiDexEnabled =true + } + + signingConfigs { + release { + // Check if properties are defined before using them + storeFile = keystoreProperties['storeFile'] ? file(keystoreProperties['storeFile']) : null + storePassword = keystoreProperties['storePassword'] + keyAlias = keystoreProperties['keyAlias'] + keyPassword = keystoreProperties['keyPassword'] + } + } + + buildTypes { + release { + signingConfig signingConfigs.release + minifyEnabled true + shrinkResources true + proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro' + } + } +} + +flutter { + source = "../.." +} + +dependencies { + implementation platform('com.google.firebase:firebase-bom:33.3.0') // مثال حديث + + implementation 'com.scottyab:rootbeer-lib:0.1.0' + implementation 'com.google.android.gms:play-services-safetynet:18.0.1' + coreLibraryDesugaring 'com.android.tools:desugar_jdk_libs:2.1.4' + +} \ No newline at end of file diff --git a/siro_admin/android/app/google-services.json b/siro_admin/android/app/google-services.json new file mode 100644 index 0000000..3d71499 --- /dev/null +++ b/siro_admin/android/app/google-services.json @@ -0,0 +1,67 @@ +{ + "project_info": { + "project_number": "825988584191", + "project_id": "siro-a6957", + "storage_bucket": "siro-a6957.firebasestorage.app" + }, + "client": [ + { + "client_info": { + "mobilesdk_app_id": "1:825988584191:android:caa30eaac3524de51632ca", + "android_client_info": { + "package_name": "com.siro.admin" + } + }, + "oauth_client": [], + "api_key": [ + { + "current_key": "AIzaSyAEoply_UcEP6KaCu_ziCy_ZDIjAKvi7b8" + } + ], + "services": { + "appinvite_service": { + "other_platform_oauth_client": [] + } + } + }, + { + "client_info": { + "mobilesdk_app_id": "1:825988584191:android:4525a21b00173d361632ca", + "android_client_info": { + "package_name": "com.siro.driver" + } + }, + "oauth_client": [], + "api_key": [ + { + "current_key": "AIzaSyAEoply_UcEP6KaCu_ziCy_ZDIjAKvi7b8" + } + ], + "services": { + "appinvite_service": { + "other_platform_oauth_client": [] + } + } + }, + { + "client_info": { + "mobilesdk_app_id": "1:825988584191:android:06782b540c7681ad1632ca", + "android_client_info": { + "package_name": "com.siro.rider" + } + }, + "oauth_client": [], + "api_key": [ + { + "current_key": "AIzaSyAEoply_UcEP6KaCu_ziCy_ZDIjAKvi7b8" + } + ], + "services": { + "appinvite_service": { + "other_platform_oauth_client": [] + } + } + } + ], + "configuration_version": "1" +} \ No newline at end of file diff --git a/siro_admin/android/app/proguard-rules.pro b/siro_admin/android/app/proguard-rules.pro new file mode 100644 index 0000000..e134009 --- /dev/null +++ b/siro_admin/android/app/proguard-rules.pro @@ -0,0 +1,50 @@ +# Suppress warnings for specific Google ML Kit and Stripe classes +-dontwarn com.google.mlkit.vision.text.chinese.ChineseTextRecognizerOptions$Builder +-dontwarn com.google.mlkit.vision.text.chinese.ChineseTextRecognizerOptions +-dontwarn com.google.mlkit.vision.text.devanagari.DevanagariTextRecognizerOptions$Builder +-dontwarn com.google.mlkit.vision.text.devanagari.DevanagariTextRecognizerOptions +-dontwarn com.google.mlkit.vision.text.japanese.JapaneseTextRecognizerOptions$Builder +-dontwarn com.google.mlkit.vision.text.japanese.JapaneseTextRecognizerOptions +-dontwarn com.google.mlkit.vision.text.korean.KoreanTextRecognizerOptions$Builder +-dontwarn com.google.mlkit.vision.text.korean.KoreanTextRecognizerOptions +-dontwarn com.stripe.android.pushProvisioning.PushProvisioningActivity$g +-dontwarn com.stripe.android.pushProvisioning.PushProvisioningActivityStarter$Args +-dontwarn com.stripe.android.pushProvisioning.PushProvisioningActivityStarter$Error +-dontwarn com.stripe.android.pushProvisioning.PushProvisioningActivityStarter +-dontwarn com.stripe.android.pushProvisioning.PushProvisioningEphemeralKeyProvider + +# NEW: Add the -dontwarn rules from missing_rules.txt +-dontwarn com.stripe.android.view.AddPaymentMethodActivityStarter$Args$Builder +-dontwarn com.stripe.android.view.AddPaymentMethodActivityStarter$Args +-dontwarn com.stripe.android.view.AddPaymentMethodActivityStarter$Result$Canceled +-dontwarn com.stripe.android.view.AddPaymentMethodActivityStarter$Result$Companion +-dontwarn com.stripe.android.view.AddPaymentMethodActivityStarter$Result$Failure +-dontwarn com.stripe.android.view.AddPaymentMethodActivityStarter$Result$Success +-dontwarn com.stripe.android.view.AddPaymentMethodActivityStarter$Result +-dontwarn com.stripe.android.view.AddPaymentMethodActivityStarter + +# Keep rules for Google ML Kit +-keep class com.google.mlkit.vision.** { *; } +-keep class com.google.mlkit.vision.text.** { *; } +-keep class com.google.mlkit.vision.text.chinese.ChineseTextRecognizerOptions { *; } +-keep class com.google.mlkit.vision.text.chinese.ChineseTextRecognizerOptions$Builder { *; } +-keep class com.google.mlkit.vision.text.devanagari.DevanagariTextRecognizerOptions { *; } +-keep class com.google.mlkit.vision.text.devanagari.DevanagariTextRecognizerOptions$Builder { *; } +-keep class com.google.mlkit.vision.text.japanese.JapaneseTextRecognizerOptions { *; } +-keep class com.google.mlkit.vision.text.japanese.JapaneseTextRecognizerOptions$Builder { *; } +-keep class com.google.mlkit.vision.text.korean.KoreanTextRecognizerOptions { *; } +-keep class com.google.mlkit.vision.text.korean.KoreanTextRecognizerOptions$Builder { *; } + +# Keep rules for Stripe (Use the broad rule - most reliable) +-keep class com.stripe.android.** { *; } + +# Keep rule for RootDetection +-keep class com.mobileapp.store.ride.RootDetection { + native ; +} + +-assumenosideeffects class android.util.Log { + public static *** v(...); + public static *** d(...); + public static *** i(...); +} \ No newline at end of file diff --git a/siro_admin/android/app/src/debug/AndroidManifest.xml b/siro_admin/android/app/src/debug/AndroidManifest.xml new file mode 100644 index 0000000..399f698 --- /dev/null +++ b/siro_admin/android/app/src/debug/AndroidManifest.xml @@ -0,0 +1,7 @@ + + + + diff --git a/siro_admin/android/app/src/main/AndroidManifest.xml b/siro_admin/android/app/src/main/AndroidManifest.xml new file mode 100644 index 0000000..c1a90d9 --- /dev/null +++ b/siro_admin/android/app/src/main/AndroidManifest.xml @@ -0,0 +1,82 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/siro_admin/android/app/src/main/cpp/CMakeLists.txt b/siro_admin/android/app/src/main/cpp/CMakeLists.txt new file mode 100755 index 0000000..a90b803 --- /dev/null +++ b/siro_admin/android/app/src/main/cpp/CMakeLists.txt @@ -0,0 +1,11 @@ +cmake_minimum_required(VERSION 3.10.2) # 3.10.2 is fine, but no need to go as high as 3.31.5 +project(intaleq_admin) # Good + +# Add your C++ source file(s) to create a SHARED library. +add_library(native-lib SHARED native-lib.cpp) + +# Find the Android log library. +find_library(log-lib log) + +# Link your library against the log library. This is essential for debugging. +target_link_libraries(native-lib ${log-lib}) \ No newline at end of file diff --git a/siro_admin/android/app/src/main/cpp/native-lib.cpp b/siro_admin/android/app/src/main/cpp/native-lib.cpp new file mode 100755 index 0000000..38d25c3 --- /dev/null +++ b/siro_admin/android/app/src/main/cpp/native-lib.cpp @@ -0,0 +1,187 @@ + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include // Add this line + +#define LOG_TAG "NativeLib" +#define LOGD(...) __android_log_print(ANDROID_LOG_DEBUG, LOG_TAG, __VA_ARGS__) +#define LOGE(...) __android_log_print(ANDROID_LOG_ERROR, LOG_TAG, __VA_ARGS__) + +// Function to check for common root binaries +bool isRooted() +{ + std::string paths[] = { + "/system/app/Superuser.apk", + "/system/xbin/su", + "/system/bin/su", + "/system/bin/magisk", + "/system/xbin/magisk", + "/sbin/magisk"}; + + for (const auto &path : paths) + { + std::ifstream file(path); + if (file.good()) + { + return true; + } + } + return false; +} + +// Function to check for the presence of files or directories commonly associated with Frida. +bool checkFridaFiles() +{ + std::string fridaFiles[] = { + "/data/local/tmp/re.frida.server", // Common Frida server path + "/data/local/tmp/frida-server", + "/usr/lib/libfrida-gadget.so", // Frida gadget (injected library) + "/usr/lib64/libfrida-gadget.so", + "/data/local/re.frida.server", + + }; + + for (const auto &path : fridaFiles) + { + if (access(path.c_str(), F_OK) != -1) + { + LOGE("Frida file detected: %s", path.c_str()); + return true; + } + } + return false; +} + +// Checks for open ports commonly used by Frida. This is less reliable, as ports can be changed. +bool checkFridaPorts() +{ + int sock = socket(AF_INET, SOCK_STREAM, 0); + if (sock == -1) + { + return false; // Couldn't create socket, not a strong indicator. + } + + sockaddr_in sa; + memset(&sa, 0, sizeof(sa)); + sa.sin_family = AF_INET; + sa.sin_port = htons(27042); // Default Frida port + inet_pton(AF_INET, "127.0.0.1", &sa.sin_addr); + + if (connect(sock, (struct sockaddr *)&sa, sizeof(sa)) != -1) + { + LOGE("Frida default port (27042) is open."); + close(sock); + return true; + } + + close(sock); + return false; +} + +// Check the maps file of the current process for any suspicious entries. +bool checkMaps() +{ + std::ifstream mapsFile("/proc/self/maps"); + std::string line; + + if (mapsFile.is_open()) + { + while (std::getline(mapsFile, line)) + { + // Look for lines that indicate injected libraries, especially Frida. + if (line.find("frida") != std::string::npos || + line.find("gum-js-") != std::string::npos) + { // Gum is Frida's JavaScript engine + LOGE("Suspicious entry in /proc/self/maps: %s", line.c_str()); + return true; + } + } + mapsFile.close(); + } + else + { + LOGE("Could not open /proc/self/maps"); + return false; + } + return false; +} + +// Check loaded modules. +bool checkLoadedModules() +{ + bool found = false; + dl_iterate_phdr([](struct dl_phdr_info *info, size_t size, void *data) + { + bool *found_ptr = static_cast(data); + if (std::string(info->dlpi_name).find("frida") != std::string::npos) + { + LOGE("Frida module detected: %s", info->dlpi_name); + *found_ptr = true; + return 1; // Stop iterating + } + return 0; // Continue iterating + }, + &found); + + return found; +} + +// This is a simple ptrace check. More sophisticated checks are possible (and necessary for robust detection). +// bool checkPtrace() { +// // Attempt to ptrace ourselves. If another process is already tracing us, this will fail. +// if (ptrace(PTRACE_TRACEME, 0, 1, 0) < 0) { +// LOGE("ptrace failed. Debugger or tracer detected."); +// return true; // Likely being traced +// } +// // Detach. If attached, need to detach to not interfere. +// ptrace(PTRACE_DETACH, 0, 0, 0); +// return false; +//} + +extern "C" JNIEXPORT jboolean JNICALL +Java_com_siro_siro_1admin_RootDetection_isNativeRooted(JNIEnv *env, jobject /* this */) +{ + + if (isRooted()) + { + return JNI_TRUE; + } + + if (checkFridaFiles()) + { + return JNI_TRUE; + } + + if (checkFridaPorts()) + { + return JNI_TRUE; + } + if (checkMaps()) + { + return JNI_TRUE; + } + + if (checkLoadedModules()) + { + return JNI_TRUE; + } + + // if (checkPtrace()) { + // return JNI_TRUE; + // } + + return JNI_FALSE; +} \ No newline at end of file diff --git a/siro_admin/android/app/src/main/kotlin/com/siro/siro_admin/MainActivity.kt b/siro_admin/android/app/src/main/kotlin/com/siro/siro_admin/MainActivity.kt new file mode 100644 index 0000000..8037f76 --- /dev/null +++ b/siro_admin/android/app/src/main/kotlin/com/siro/siro_admin/MainActivity.kt @@ -0,0 +1,174 @@ +package com.siro.siro_admin + +import android.app.AlertDialog +import android.content.Intent +import android.os.Bundle +import android.util.Log +import android.widget.LinearLayout +import android.widget.ProgressBar +import android.widget.TextView +import androidx.core.view.setPadding +import com.scottyab.rootbeer.RootBeer +import io.flutter.embedding.android.FlutterFragmentActivity +import io.flutter.embedding.engine.FlutterEngine +import io.flutter.plugin.common.MethodChannel +import java.io.File +import java.util.Timer +import kotlin.concurrent.schedule + +class MainActivity : FlutterFragmentActivity() { + private val SECURITY_CHANNEL = "com.siro.siro_admin/security" + private val APP_CONTROL_CHANNEL = "com.siro.siro_admin/app_control" + + override fun configureFlutterEngine(flutterEngine: FlutterEngine) { + super.configureFlutterEngine(flutterEngine) + + // Channel for security checks (isRooted) + MethodChannel(flutterEngine.dartExecutor.binaryMessenger, SECURITY_CHANNEL) + .setMethodCallHandler { call, result -> + when (call.method) { + "isNativeRooted" -> result.success(isDeviceCompromised()) + else -> result.notImplemented() + } + } + + // Channel for app control (bringing to foreground) + MethodChannel(flutterEngine.dartExecutor.binaryMessenger, APP_CONTROL_CHANNEL) + .setMethodCallHandler { call, result -> + when (call.method) { + "bringToForeground" -> { + Log.d("MainActivity", "Received bringToForeground request") + val intent = + Intent(this, MainActivity::class.java).apply { + action = Intent.ACTION_MAIN + addCategory(Intent.CATEGORY_LAUNCHER) + addFlags( + Intent.FLAG_ACTIVITY_NEW_TASK or + Intent.FLAG_ACTIVITY_CLEAR_TOP or + Intent.FLAG_ACTIVITY_SINGLE_TOP + ) + } + try { + startActivity(intent) + Log.d( + "MainActivity", + "App brought to foreground successfully with flags: ${intent.flags}" + ) + result.success(true) + } catch (e: Exception) { + Log.e( + "MainActivity", + "Error bringing app to foreground: ${e.message}", + e + ) + result.error( + "ACTIVITY_START_FAILED", + e.message, + e.stackTraceToString() + ) + } + } + else -> result.notImplemented() + } + } + } + + override fun onCreate(savedInstanceState: Bundle?) { + super.onCreate(savedInstanceState) + Log.d("MainActivity", "MainActivity onCreate") + if (isDeviceCompromised()) { + showSecurityWarningDialog() + } + } + + override fun onNewIntent(intent: Intent) { + super.onNewIntent(intent) + setIntent(intent) + Log.d("MainActivity", "Received new intent: ${intent.action}, flags: ${intent.flags}") + } + + private fun isDeviceCompromised(): Boolean { + return try { + val isRootedByRootBeer = RootBeer(this).isRooted + Log.d("MainActivity", "Root check result: $isRootedByRootBeer") + isRootedByRootBeer + } catch (e: Exception) { + Log.e("MainActivity", "Security check error: ${e.message}", e) + true // Fail-safe: assume compromised if check fails + } + } + + private fun showSecurityWarningDialog() { + var secondsRemaining = 10 + val progressBar = + ProgressBar(this, null, android.R.attr.progressBarStyleHorizontal).apply { + max = 10 + progress = 10 + } + val textView = + TextView(this).apply { + text = getString(R.string.security_warning_message) + textAlignment = TextView.TEXT_ALIGNMENT_CENTER + } + val layout = + LinearLayout(this).apply { + orientation = LinearLayout.VERTICAL + setPadding(48) + addView(textView) + addView(progressBar) + } + val dialog = + AlertDialog.Builder(this) + .setTitle(getString(R.string.security_warning_title)) + .setView(layout) + .setCancelable(false) + .create() + dialog.show() + val timer = Timer() + timer.schedule(0, 1000) { + secondsRemaining-- + runOnUiThread { + progressBar.progress = secondsRemaining + if (secondsRemaining <= 0) { + timer.cancel() + dialog.dismiss() + clearAppDataAndExit() + } + } + } + } + + private fun clearAppDataAndExit() { + try { + Runtime.getRuntime().exec("pm clear $packageName") + Log.d("MainActivity", "Cleared app data via package manager") + } catch (e: Exception) { + Log.e("MainActivity", "Error clearing app data: ${e.message}", e) + clearCache() + clearAppData() + } + finishAffinity() + System.exit(0) + } + + private fun clearCache() { + deleteDir(cacheDir) + deleteDir(externalCacheDir) + Log.d("MainActivity", "Cleared cache directories") + } + + private fun clearAppData() { + // Be careful with this, it deletes all app data. + // deleteDir(applicationContext.dataDir) + Log.d("MainActivity", "App data clearing skipped (commented out)") + } + + private fun deleteDir(dir: File?): Boolean { + if (dir != null && dir.isDirectory) { + dir.list()?.forEach { deleteDir(File(dir, it)) } + } + val deleted = dir?.delete() ?: false + Log.d("MainActivity", "Deleted directory ${dir?.path}: $deleted") + return deleted + } +} diff --git a/siro_admin/android/app/src/main/kotlin/com/siro/siro_admin/MyApplication.kt b/siro_admin/android/app/src/main/kotlin/com/siro/siro_admin/MyApplication.kt new file mode 100755 index 0000000..a5b5085 --- /dev/null +++ b/siro_admin/android/app/src/main/kotlin/com/siro/siro_admin/MyApplication.kt @@ -0,0 +1,44 @@ +package com.siro.siro_admin + +import android.app.Application +import android.content.Intent +import io.flutter.embedding.engine.FlutterEngine +import io.flutter.embedding.engine.dart.DartExecutor +import io.flutter.plugin.common.MethodChannel + +class MyApplication : Application() { + companion object { + lateinit var instance: MyApplication + private set + + val flutterEngine: FlutterEngine by lazy { + FlutterEngine(instance).apply { + dartExecutor.executeDartEntrypoint(DartExecutor.DartEntrypoint.createDefault()) + } + } + } + + override fun onCreate() { + super.onCreate() + instance = this + + MethodChannel( + flutterEngine.dartExecutor.binaryMessenger, + "com.siro.siro_admin/app_lifecycle" + ) + .setMethodCallHandler { call, result -> + if (call.method == "bringAppToForeground") { + bringAppToForeground() + result.success(null) + } else { + result.notImplemented() + } + } + } + + private fun bringAppToForeground() { + val intent = Intent(applicationContext, MainActivity::class.java) + intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK or Intent.FLAG_ACTIVITY_REORDER_TO_FRONT) + startActivity(intent) + } +} diff --git a/siro_admin/android/app/src/main/kotlin/com/siro/siro_admin/RootDetection.kt b/siro_admin/android/app/src/main/kotlin/com/siro/siro_admin/RootDetection.kt new file mode 100755 index 0000000..8483685 --- /dev/null +++ b/siro_admin/android/app/src/main/kotlin/com/siro/siro_admin/RootDetection.kt @@ -0,0 +1,9 @@ +package com.siro.siro_admin + +object RootDetection { + init { + System.loadLibrary("native-lib") // Load the native library + } + + external fun isNativeRooted(): Boolean // Declare the external function +} diff --git a/siro_admin/android/app/src/main/kotlin/com/siro/siro_admin/SafetyNetCheck.kt b/siro_admin/android/app/src/main/kotlin/com/siro/siro_admin/SafetyNetCheck.kt new file mode 100755 index 0000000..2e4a1d4 --- /dev/null +++ b/siro_admin/android/app/src/main/kotlin/com/siro/siro_admin/SafetyNetCheck.kt @@ -0,0 +1,104 @@ +import android.content.Context +import android.util.Base64 +import android.util.Log +import com.google.android.gms.safetynet.SafetyNet +import java.io.IOException +import java.security.GeneralSecurityException +import java.security.SecureRandom +import org.json.JSONObject + +object SafetyNetCheck { + + private const val TAG = "SafetyNetCheck" + + fun checkSafetyNet(context: Context, apiKey: String, callback: (Boolean) -> Unit) { + // Generate a nonce. A good nonce is large, random, and used only once. + val nonce = generateNonce() + + SafetyNet.getClient(context) + .attest(nonce, apiKey) + .addOnSuccessListener { response -> + // Success! Now, *verify* the response. + val jwsResult = response.jwsResult + if (jwsResult != null) { + try { + val isSafe = SafetyNetResponseVerifier.verify(jwsResult) + Log.d(TAG, "SafetyNet verification result: $isSafe") + callback(isSafe) // Now passing a *verified* result. + } catch (e: Exception) { + Log.e(TAG, "Error verifying SafetyNet response: ${e.message}", e) + callback(false) // Treat verification errors as failures. + } + } else { + Log.e(TAG, "SafetyNet jwsResult is null") + callback(false) // Null result is a failure. + } + } + .addOnFailureListener { e -> + Log.e(TAG, "SafetyNet attest API call failed: ${e.message}", e) + callback(false) // API call failure. + } + } + + // Helper function to generate a nonce. + private fun generateNonce(): ByteArray { + val byteGenerator = SecureRandom() + val nonce = ByteArray(32) + byteGenerator.nextBytes(nonce) + return nonce + } +} + +// Helper class to verify the SafetyNet response. +object SafetyNetResponseVerifier { + + private const val TAG = "SafetyNetVerifier" + + // This method *must* be implemented on a *backend server* for real security. + // This is just a *simplified example* for demonstration purposes and is + // *not* suitable for production without a backend check. + @Throws(GeneralSecurityException::class, IOException::class) + fun verify(jwsResult: String): Boolean { + // 1. Parse the JWS: Split into header, payload, and signature. + val parts = jwsResult.split(".") + if (parts.size != 3) { + Log.e(TAG, "Invalid JWS format") + return false // Invalid JWS format + } + + val header = parts[0] + val payload = parts[1] + val signature = parts[2] + + // 2. Decode the payload (it's Base64 encoded). + val decodedPayload = Base64.decode(payload, Base64.DEFAULT) + val payloadJson = JSONObject(String(decodedPayload)) + + // 3. Check the ctsProfileMatch and basicIntegrity. + val ctsProfileMatch = payloadJson.optBoolean("ctsProfileMatch", false) + val basicIntegrity = payloadJson.optBoolean("basicIntegrity", false) + + Log.d(TAG, "ctsProfileMatch: $ctsProfileMatch, basicIntegrity: $basicIntegrity") + + // 4. **CRITICAL: In a real application, you *must* send the JWS to your + // backend server for verification. The server should use the + // Google SafetyNet API (or a library that wraps it) to verify + // the signature and check the fields. This prevents attackers + // from tampering with the response on the device.** + // + // // Example (pseudo-code) of what the backend check would do: + // // GoogleCredential credential = ...; + // // SafetyNet safetyNet = new SafetyNet.Builder(httpTransport, jsonFactory) + // // .setApplicationName("YourAppName") + // // .setHttpRequestInitializer(credential) + // // .build(); + // // SafetyNetApi.VerifyJwsRequest request = safetyNet.safetynet().verifyJws(jwsResult); + // // SafetyNetApi.VerifyJwsResponse response = request.execute(); + // // return response.isValidSignature() && response.getCtsProfileMatch() && + // response.getBasicIntegrity(); + + // 5. For this *example* (without a backend), we'll just check the fields. + // This is *NOT SECURE* for production! + return ctsProfileMatch && basicIntegrity + } +} diff --git a/siro_admin/android/app/src/main/res/drawable-hdpi/ic_launcher_foreground.png b/siro_admin/android/app/src/main/res/drawable-hdpi/ic_launcher_foreground.png new file mode 100644 index 0000000..3b80872 Binary files /dev/null and b/siro_admin/android/app/src/main/res/drawable-hdpi/ic_launcher_foreground.png differ diff --git a/siro_admin/android/app/src/main/res/drawable-mdpi/ic_launcher_foreground.png b/siro_admin/android/app/src/main/res/drawable-mdpi/ic_launcher_foreground.png new file mode 100644 index 0000000..854ca42 Binary files /dev/null and b/siro_admin/android/app/src/main/res/drawable-mdpi/ic_launcher_foreground.png differ diff --git a/siro_admin/android/app/src/main/res/drawable-v21/launch_background.xml b/siro_admin/android/app/src/main/res/drawable-v21/launch_background.xml new file mode 100644 index 0000000..f74085f --- /dev/null +++ b/siro_admin/android/app/src/main/res/drawable-v21/launch_background.xml @@ -0,0 +1,12 @@ + + + + + + + + diff --git a/siro_admin/android/app/src/main/res/drawable-xhdpi/ic_launcher_foreground.png b/siro_admin/android/app/src/main/res/drawable-xhdpi/ic_launcher_foreground.png new file mode 100644 index 0000000..d9cf042 Binary files /dev/null and b/siro_admin/android/app/src/main/res/drawable-xhdpi/ic_launcher_foreground.png differ diff --git a/siro_admin/android/app/src/main/res/drawable-xxhdpi/ic_launcher_foreground.png b/siro_admin/android/app/src/main/res/drawable-xxhdpi/ic_launcher_foreground.png new file mode 100644 index 0000000..996b732 Binary files /dev/null and b/siro_admin/android/app/src/main/res/drawable-xxhdpi/ic_launcher_foreground.png differ diff --git a/siro_admin/android/app/src/main/res/drawable-xxxhdpi/ic_launcher_foreground.png b/siro_admin/android/app/src/main/res/drawable-xxxhdpi/ic_launcher_foreground.png new file mode 100644 index 0000000..6e72033 Binary files /dev/null and b/siro_admin/android/app/src/main/res/drawable-xxxhdpi/ic_launcher_foreground.png differ diff --git a/siro_admin/android/app/src/main/res/drawable/app_icon.png b/siro_admin/android/app/src/main/res/drawable/app_icon.png new file mode 100644 index 0000000..0cee5b9 Binary files /dev/null and b/siro_admin/android/app/src/main/res/drawable/app_icon.png differ diff --git a/siro_admin/android/app/src/main/res/drawable/launch_background.xml b/siro_admin/android/app/src/main/res/drawable/launch_background.xml new file mode 100644 index 0000000..304732f --- /dev/null +++ b/siro_admin/android/app/src/main/res/drawable/launch_background.xml @@ -0,0 +1,12 @@ + + + + + + + + diff --git a/siro_admin/android/app/src/main/res/mipmap-anydpi-v26/ic_launcher.xml b/siro_admin/android/app/src/main/res/mipmap-anydpi-v26/ic_launcher.xml new file mode 100644 index 0000000..c79c58a --- /dev/null +++ b/siro_admin/android/app/src/main/res/mipmap-anydpi-v26/ic_launcher.xml @@ -0,0 +1,9 @@ + + + + + + + diff --git a/siro_admin/android/app/src/main/res/mipmap-hdpi/ic_launcher.png b/siro_admin/android/app/src/main/res/mipmap-hdpi/ic_launcher.png new file mode 100644 index 0000000..058ff77 Binary files /dev/null and b/siro_admin/android/app/src/main/res/mipmap-hdpi/ic_launcher.png differ diff --git a/siro_admin/android/app/src/main/res/mipmap-hdpi/launcher_icon.png b/siro_admin/android/app/src/main/res/mipmap-hdpi/launcher_icon.png new file mode 100644 index 0000000..058ff77 Binary files /dev/null and b/siro_admin/android/app/src/main/res/mipmap-hdpi/launcher_icon.png differ diff --git a/siro_admin/android/app/src/main/res/mipmap-mdpi/ic_launcher.png b/siro_admin/android/app/src/main/res/mipmap-mdpi/ic_launcher.png new file mode 100644 index 0000000..1f057e6 Binary files /dev/null and b/siro_admin/android/app/src/main/res/mipmap-mdpi/ic_launcher.png differ diff --git a/siro_admin/android/app/src/main/res/mipmap-mdpi/launcher_icon.png b/siro_admin/android/app/src/main/res/mipmap-mdpi/launcher_icon.png new file mode 100644 index 0000000..1f057e6 Binary files /dev/null and b/siro_admin/android/app/src/main/res/mipmap-mdpi/launcher_icon.png differ diff --git a/siro_admin/android/app/src/main/res/mipmap-xhdpi/ic_launcher.png b/siro_admin/android/app/src/main/res/mipmap-xhdpi/ic_launcher.png new file mode 100644 index 0000000..a630f85 Binary files /dev/null and b/siro_admin/android/app/src/main/res/mipmap-xhdpi/ic_launcher.png differ diff --git a/siro_admin/android/app/src/main/res/mipmap-xhdpi/launcher_icon.png b/siro_admin/android/app/src/main/res/mipmap-xhdpi/launcher_icon.png new file mode 100644 index 0000000..a630f85 Binary files /dev/null and b/siro_admin/android/app/src/main/res/mipmap-xhdpi/launcher_icon.png differ diff --git a/siro_admin/android/app/src/main/res/mipmap-xxhdpi/ic_launcher.png b/siro_admin/android/app/src/main/res/mipmap-xxhdpi/ic_launcher.png new file mode 100644 index 0000000..623ed7d Binary files /dev/null and b/siro_admin/android/app/src/main/res/mipmap-xxhdpi/ic_launcher.png differ diff --git a/siro_admin/android/app/src/main/res/mipmap-xxhdpi/launcher_icon.png b/siro_admin/android/app/src/main/res/mipmap-xxhdpi/launcher_icon.png new file mode 100644 index 0000000..623ed7d Binary files /dev/null and b/siro_admin/android/app/src/main/res/mipmap-xxhdpi/launcher_icon.png differ diff --git a/siro_admin/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png b/siro_admin/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png new file mode 100644 index 0000000..0cee5b9 Binary files /dev/null and b/siro_admin/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png differ diff --git a/siro_admin/android/app/src/main/res/mipmap-xxxhdpi/launcher_icon.png b/siro_admin/android/app/src/main/res/mipmap-xxxhdpi/launcher_icon.png new file mode 100644 index 0000000..0cee5b9 Binary files /dev/null and b/siro_admin/android/app/src/main/res/mipmap-xxxhdpi/launcher_icon.png differ diff --git a/siro_admin/android/app/src/main/res/values-ar/strings.xml b/siro_admin/android/app/src/main/res/values-ar/strings.xml new file mode 100755 index 0000000..6b7cb35 --- /dev/null +++ b/siro_admin/android/app/src/main/res/values-ar/strings.xml @@ -0,0 +1,6 @@ + + تحذير أمني + تم اكتشاف مشكلة أمنية أو تعديل على هذا الجهاز. لا يمكن تشغيل التطبيق على هذا الجهاز. + إغلاق التطبيق + الجهاز آمن. الاستمرار بشكل طبيعي. + \ No newline at end of file diff --git a/siro_admin/android/app/src/main/res/values-night/styles.xml b/siro_admin/android/app/src/main/res/values-night/styles.xml new file mode 100644 index 0000000..06952be --- /dev/null +++ b/siro_admin/android/app/src/main/res/values-night/styles.xml @@ -0,0 +1,18 @@ + + + + + + + diff --git a/siro_admin/android/app/src/main/res/values/colors.xml b/siro_admin/android/app/src/main/res/values/colors.xml new file mode 100644 index 0000000..ab98328 --- /dev/null +++ b/siro_admin/android/app/src/main/res/values/colors.xml @@ -0,0 +1,4 @@ + + + #ffffff + \ No newline at end of file diff --git a/siro_admin/android/app/src/main/res/values/strings.xml b/siro_admin/android/app/src/main/res/values/strings.xml new file mode 100755 index 0000000..cf5127a --- /dev/null +++ b/siro_admin/android/app/src/main/res/values/strings.xml @@ -0,0 +1,15 @@ + + My App + + + high_importance_channel + AIzaSyCFsWBqvkXzk1Gb-bCGxwqTwJQKIeHjH64 + Security Warning + AIzaSyB04YNW3LbvmQ5lX1t2bOwEU18-KUoovzw + + A security issue or modification has been detected on + this device. The app cannot run on this device. + Exit App + Device is secure. Proceeding normally. + + \ No newline at end of file diff --git a/siro_admin/android/app/src/main/res/values/styles.xml b/siro_admin/android/app/src/main/res/values/styles.xml new file mode 100644 index 0000000..cb1ef88 --- /dev/null +++ b/siro_admin/android/app/src/main/res/values/styles.xml @@ -0,0 +1,18 @@ + + + + + + + diff --git a/siro_admin/android/app/src/main/res/xml/network_security_config.xml b/siro_admin/android/app/src/main/res/xml/network_security_config.xml new file mode 100644 index 0000000..334e84f --- /dev/null +++ b/siro_admin/android/app/src/main/res/xml/network_security_config.xml @@ -0,0 +1,21 @@ + + + + + + + + + + intaleq.xyz + + + + XJXX7XthMj5VlSHfvo1q73sY7orJ9Wle0X4avj0/Vwo= + + C5+lpZ7tcVwmwQIMcRtPbsQtWLABXhQzejna0wHESsl= + + + + + \ No newline at end of file diff --git a/siro_admin/android/app/src/profile/AndroidManifest.xml b/siro_admin/android/app/src/profile/AndroidManifest.xml new file mode 100644 index 0000000..399f698 --- /dev/null +++ b/siro_admin/android/app/src/profile/AndroidManifest.xml @@ -0,0 +1,7 @@ + + + + diff --git a/siro_admin/android/build.gradle b/siro_admin/android/build.gradle new file mode 100644 index 0000000..d2ffbff --- /dev/null +++ b/siro_admin/android/build.gradle @@ -0,0 +1,18 @@ +allprojects { + repositories { + google() + mavenCentral() + } +} + +rootProject.buildDir = "../build" +subprojects { + project.buildDir = "${rootProject.buildDir}/${project.name}" +} +subprojects { + project.evaluationDependsOn(":app") +} + +tasks.register("clean", Delete) { + delete rootProject.buildDir +} diff --git a/siro_admin/android/build/reports/problems/problems-report.html b/siro_admin/android/build/reports/problems/problems-report.html new file mode 100644 index 0000000..0a1a2f5 --- /dev/null +++ b/siro_admin/android/build/reports/problems/problems-report.html @@ -0,0 +1,663 @@ + + + + + + + + + + + + + Gradle Configuration Cache + + + +
+ +
+ Loading... +
+ + + + + + diff --git a/siro_admin/android/gradle.properties b/siro_admin/android/gradle.properties new file mode 100644 index 0000000..67660bc --- /dev/null +++ b/siro_admin/android/gradle.properties @@ -0,0 +1,9 @@ +org.gradle.jvmargs=-Xmx4096M +android.useAndroidX=true +android.enableJetifier=true +android.defaults.buildfeatures.buildconfig=true +android.nonTransitiveRClass=true +android.nonFinalResIds=true +dart.obfuscation=true +android.enableR8.fullMode=true +org.gradle.java.home=/Library/Java/JavaVirtualMachines/temurin-17.jdk/Contents/Home diff --git a/siro_admin/android/gradle/wrapper/gradle-wrapper.properties b/siro_admin/android/gradle/wrapper/gradle-wrapper.properties new file mode 100644 index 0000000..37f853b --- /dev/null +++ b/siro_admin/android/gradle/wrapper/gradle-wrapper.properties @@ -0,0 +1,7 @@ +distributionBase=GRADLE_USER_HOME +distributionPath=wrapper/dists +distributionUrl=https\://services.gradle.org/distributions/gradle-8.13-bin.zip +networkTimeout=10000 +validateDistributionUrl=true +zipStoreBase=GRADLE_USER_HOME +zipStorePath=wrapper/dists diff --git a/siro_admin/android/settings.gradle b/siro_admin/android/settings.gradle new file mode 100644 index 0000000..df5c366 --- /dev/null +++ b/siro_admin/android/settings.gradle @@ -0,0 +1,29 @@ +pluginManagement { + def flutterSdkPath = { + def properties = new Properties() + file("local.properties").withInputStream { properties.load(it) } + def flutterSdkPath = properties.getProperty("flutter.sdk") + assert flutterSdkPath != null, "flutter.sdk not set in local.properties" + return flutterSdkPath + }() + + includeBuild("$flutterSdkPath/packages/flutter_tools/gradle") + + repositories { + google() + mavenCentral() + gradlePluginPortal() + } +} + +plugins { + id "dev.flutter.flutter-plugin-loader" version "1.0.0" + id "com.android.application" version '8.11.1' apply false + // START: FlutterFire Configuration + id "com.google.gms.google-services" version "4.3.10" apply false + id "com.google.firebase.crashlytics" version "2.8.1" apply false + // END: FlutterFire Configuration + id "org.jetbrains.kotlin.android" version "1.8.22" apply false +} + +include ":app" diff --git a/siro_admin/assets/images/logo.png b/siro_admin/assets/images/logo.png new file mode 100644 index 0000000..f2c92db Binary files /dev/null and b/siro_admin/assets/images/logo.png differ diff --git a/siro_admin/assets/notify.mp3 b/siro_admin/assets/notify.mp3 new file mode 100644 index 0000000..d10bc28 Binary files /dev/null and b/siro_admin/assets/notify.mp3 differ diff --git a/siro_admin/firebase.json b/siro_admin/firebase.json new file mode 100644 index 0000000..317d0f3 --- /dev/null +++ b/siro_admin/firebase.json @@ -0,0 +1 @@ +{"flutter":{"platforms":{"android":{"default":{"projectId":"siro-a6957","appId":"1:825988584191:android:caa30eaac3524de51632ca","fileOutput":"android/app/google-services.json"}},"ios":{"default":{"projectId":"siro-a6957","appId":"1:825988584191:ios:8426fcf68fcc470e1632ca","uploadDebugSymbols":true,"fileOutput":"ios/Runner/GoogleService-Info.plist"}},"dart":{"lib/firebase_options.dart":{"projectId":"siro-a6957","configurations":{"android":"1:825988584191:android:caa30eaac3524de51632ca","ios":"1:825988584191:ios:8426fcf68fcc470e1632ca"}}}}}} \ No newline at end of file diff --git a/siro_admin/ios/.gitignore b/siro_admin/ios/.gitignore new file mode 100644 index 0000000..7a7f987 --- /dev/null +++ b/siro_admin/ios/.gitignore @@ -0,0 +1,34 @@ +**/dgph +*.mode1v3 +*.mode2v3 +*.moved-aside +*.pbxuser +*.perspectivev3 +**/*sync/ +.sconsign.dblite +.tags* +**/.vagrant/ +**/DerivedData/ +Icon? +**/Pods/ +**/.symlinks/ +profile +xcuserdata +**/.generated/ +Flutter/App.framework +Flutter/Flutter.framework +Flutter/Flutter.podspec +Flutter/Generated.xcconfig +Flutter/ephemeral/ +Flutter/app.flx +Flutter/app.zip +Flutter/flutter_assets/ +Flutter/flutter_export_environment.sh +ServiceDefinitions.json +Runner/GeneratedPluginRegistrant.* + +# Exceptions to above rules. +!default.mode1v3 +!default.mode2v3 +!default.pbxuser +!default.perspectivev3 diff --git a/siro_admin/ios/Flutter/AppFrameworkInfo.plist b/siro_admin/ios/Flutter/AppFrameworkInfo.plist new file mode 100644 index 0000000..1dc6cf7 --- /dev/null +++ b/siro_admin/ios/Flutter/AppFrameworkInfo.plist @@ -0,0 +1,26 @@ + + + + + CFBundleDevelopmentRegion + en + CFBundleExecutable + App + CFBundleIdentifier + io.flutter.flutter.app + CFBundleInfoDictionaryVersion + 6.0 + CFBundleName + App + CFBundlePackageType + FMWK + CFBundleShortVersionString + 1.0 + CFBundleSignature + ???? + CFBundleVersion + 1.0 + MinimumOSVersion + 13.0 + + diff --git a/siro_admin/ios/Flutter/Debug.xcconfig b/siro_admin/ios/Flutter/Debug.xcconfig new file mode 100644 index 0000000..ec97fc6 --- /dev/null +++ b/siro_admin/ios/Flutter/Debug.xcconfig @@ -0,0 +1,2 @@ +#include? "Pods/Target Support Files/Pods-Runner/Pods-Runner.debug.xcconfig" +#include "Generated.xcconfig" diff --git a/siro_admin/ios/Flutter/Release.xcconfig b/siro_admin/ios/Flutter/Release.xcconfig new file mode 100644 index 0000000..c4855bf --- /dev/null +++ b/siro_admin/ios/Flutter/Release.xcconfig @@ -0,0 +1,2 @@ +#include? "Pods/Target Support Files/Pods-Runner/Pods-Runner.release.xcconfig" +#include "Generated.xcconfig" diff --git a/siro_admin/ios/Podfile b/siro_admin/ios/Podfile new file mode 100644 index 0000000..6649374 --- /dev/null +++ b/siro_admin/ios/Podfile @@ -0,0 +1,43 @@ +# Uncomment this line to define a global platform for your project +platform :ios, '15.0' + +# CocoaPods analytics sends network stats synchronously affecting flutter build latency. +ENV['COCOAPODS_DISABLE_STATS'] = 'true' + +project 'Runner', { + 'Debug' => :debug, + 'Profile' => :release, + 'Release' => :release, +} + +def flutter_root + generated_xcode_build_settings_path = File.expand_path(File.join('..', 'Flutter', 'Generated.xcconfig'), __FILE__) + unless File.exist?(generated_xcode_build_settings_path) + raise "#{generated_xcode_build_settings_path} must exist. If you're running pod install manually, make sure flutter pub get is executed first" + end + + File.foreach(generated_xcode_build_settings_path) do |line| + matches = line.match(/FLUTTER_ROOT\=(.*)/) + return matches[1].strip if matches + end + raise "FLUTTER_ROOT not found in #{generated_xcode_build_settings_path}. Try deleting Generated.xcconfig, then run flutter pub get" +end + +require File.expand_path(File.join('packages', 'flutter_tools', 'bin', 'podhelper'), flutter_root) + +flutter_ios_podfile_setup + +target 'Runner' do + use_frameworks! + + flutter_install_all_ios_pods File.dirname(File.realpath(__FILE__)) + target 'RunnerTests' do + inherit! :search_paths + end +end + +post_install do |installer| + installer.pods_project.targets.each do |target| + flutter_additional_ios_build_settings(target) + end +end diff --git a/siro_admin/ios/Podfile.lock b/siro_admin/ios/Podfile.lock new file mode 100644 index 0000000..7930ad4 --- /dev/null +++ b/siro_admin/ios/Podfile.lock @@ -0,0 +1,300 @@ +PODS: + - AppAuth (1.7.6): + - AppAuth/Core (= 1.7.6) + - AppAuth/ExternalUserAgent (= 1.7.6) + - AppAuth/Core (1.7.6) + - AppAuth/ExternalUserAgent (1.7.6): + - AppAuth/Core + - AppCheckCore (11.2.0): + - GoogleUtilities/Environment (~> 8.0) + - GoogleUtilities/UserDefaults (~> 8.0) + - PromisesObjC (~> 2.4) + - device_info_plus (0.0.1): + - Flutter + - Firebase/CoreOnly (11.15.0): + - FirebaseCore (~> 11.15.0) + - Firebase/Crashlytics (11.15.0): + - Firebase/CoreOnly + - FirebaseCrashlytics (~> 11.15.0) + - Firebase/Messaging (11.15.0): + - Firebase/CoreOnly + - FirebaseMessaging (~> 11.15.0) + - firebase_core (3.15.2): + - Firebase/CoreOnly (= 11.15.0) + - Flutter + - firebase_crashlytics (4.3.10): + - Firebase/Crashlytics (= 11.15.0) + - firebase_core + - Flutter + - firebase_messaging (15.2.10): + - Firebase/Messaging (= 11.15.0) + - firebase_core + - Flutter + - FirebaseCore (11.15.0): + - FirebaseCoreInternal (~> 11.15.0) + - GoogleUtilities/Environment (~> 8.1) + - GoogleUtilities/Logger (~> 8.1) + - FirebaseCoreExtension (11.15.0): + - FirebaseCore (~> 11.15.0) + - FirebaseCoreInternal (11.15.0): + - "GoogleUtilities/NSData+zlib (~> 8.1)" + - FirebaseCrashlytics (11.15.0): + - FirebaseCore (~> 11.15.0) + - FirebaseInstallations (~> 11.0) + - FirebaseRemoteConfigInterop (~> 11.0) + - FirebaseSessions (~> 11.0) + - GoogleDataTransport (~> 10.0) + - GoogleUtilities/Environment (~> 8.1) + - nanopb (~> 3.30910.0) + - PromisesObjC (~> 2.4) + - FirebaseInstallations (11.15.0): + - FirebaseCore (~> 11.15.0) + - GoogleUtilities/Environment (~> 8.1) + - GoogleUtilities/UserDefaults (~> 8.1) + - PromisesObjC (~> 2.4) + - FirebaseMessaging (11.15.0): + - FirebaseCore (~> 11.15.0) + - FirebaseInstallations (~> 11.0) + - GoogleDataTransport (~> 10.0) + - GoogleUtilities/AppDelegateSwizzler (~> 8.1) + - GoogleUtilities/Environment (~> 8.1) + - GoogleUtilities/Reachability (~> 8.1) + - GoogleUtilities/UserDefaults (~> 8.1) + - nanopb (~> 3.30910.0) + - FirebaseRemoteConfigInterop (11.15.0) + - FirebaseSessions (11.15.0): + - FirebaseCore (~> 11.15.0) + - FirebaseCoreExtension (~> 11.15.0) + - FirebaseInstallations (~> 11.0) + - GoogleDataTransport (~> 10.0) + - GoogleUtilities/Environment (~> 8.1) + - GoogleUtilities/UserDefaults (~> 8.1) + - nanopb (~> 3.30910.0) + - PromisesSwift (~> 2.1) + - Flutter (1.0.0) + - flutter_image_compress_common (1.0.0): + - Flutter + - Mantle + - SDWebImage + - SDWebImageWebPCoder + - flutter_secure_storage (6.0.0): + - Flutter + - google_sign_in_ios (0.0.1): + - AppAuth (>= 1.7.4) + - Flutter + - FlutterMacOS + - GoogleSignIn (~> 8.0) + - GTMSessionFetcher (>= 3.4.0) + - GoogleDataTransport (10.1.0): + - nanopb (~> 3.30910.0) + - PromisesObjC (~> 2.4) + - GoogleSignIn (8.0.0): + - AppAuth (< 2.0, >= 1.7.3) + - AppCheckCore (~> 11.0) + - GTMAppAuth (< 5.0, >= 4.1.1) + - GTMSessionFetcher/Core (~> 3.3) + - GoogleUtilities/AppDelegateSwizzler (8.1.0): + - GoogleUtilities/Environment + - GoogleUtilities/Logger + - GoogleUtilities/Network + - GoogleUtilities/Privacy + - GoogleUtilities/Environment (8.1.0): + - GoogleUtilities/Privacy + - GoogleUtilities/Logger (8.1.0): + - GoogleUtilities/Environment + - GoogleUtilities/Privacy + - GoogleUtilities/Network (8.1.0): + - GoogleUtilities/Logger + - "GoogleUtilities/NSData+zlib" + - GoogleUtilities/Privacy + - GoogleUtilities/Reachability + - "GoogleUtilities/NSData+zlib (8.1.0)": + - GoogleUtilities/Privacy + - GoogleUtilities/Privacy (8.1.0) + - GoogleUtilities/Reachability (8.1.0): + - GoogleUtilities/Logger + - GoogleUtilities/Privacy + - GoogleUtilities/UserDefaults (8.1.0): + - GoogleUtilities/Logger + - GoogleUtilities/Privacy + - GTMAppAuth (4.1.1): + - AppAuth/Core (~> 1.7) + - GTMSessionFetcher/Core (< 4.0, >= 3.3) + - GTMSessionFetcher (3.5.0): + - GTMSessionFetcher/Full (= 3.5.0) + - GTMSessionFetcher/Core (3.5.0) + - GTMSessionFetcher/Full (3.5.0): + - GTMSessionFetcher/Core + - image_cropper (0.0.4): + - Flutter + - TOCropViewController (~> 2.7.4) + - image_picker_ios (0.0.1): + - Flutter + - IOSSecuritySuite (1.9.11) + - jailbreak_root_detection (1.0.1): + - Flutter + - IOSSecuritySuite (~> 1.9.10) + - libwebp (1.5.0): + - libwebp/demux (= 1.5.0) + - libwebp/mux (= 1.5.0) + - libwebp/sharpyuv (= 1.5.0) + - libwebp/webp (= 1.5.0) + - libwebp/demux (1.5.0): + - libwebp/webp + - libwebp/mux (1.5.0): + - libwebp/demux + - libwebp/sharpyuv (1.5.0) + - libwebp/webp (1.5.0): + - libwebp/sharpyuv + - local_auth_darwin (0.0.1): + - Flutter + - FlutterMacOS + - Mantle (2.2.0): + - Mantle/extobjc (= 2.2.0) + - Mantle/extobjc (2.2.0) + - nanopb (3.30910.0): + - nanopb/decode (= 3.30910.0) + - nanopb/encode (= 3.30910.0) + - nanopb/decode (3.30910.0) + - nanopb/encode (3.30910.0) + - path_provider_foundation (0.0.1): + - Flutter + - FlutterMacOS + - PromisesObjC (2.4.0) + - PromisesSwift (2.4.0): + - PromisesObjC (= 2.4.0) + - SDWebImage (5.21.6): + - SDWebImage/Core (= 5.21.6) + - SDWebImage/Core (5.21.6) + - SDWebImageWebPCoder (0.15.0): + - libwebp (~> 1.0) + - SDWebImage/Core (~> 5.17) + - sqflite_darwin (0.0.4): + - Flutter + - FlutterMacOS + - TOCropViewController (2.7.4) + - url_launcher_ios (0.0.1): + - Flutter + +DEPENDENCIES: + - device_info_plus (from `.symlinks/plugins/device_info_plus/ios`) + - firebase_core (from `.symlinks/plugins/firebase_core/ios`) + - firebase_crashlytics (from `.symlinks/plugins/firebase_crashlytics/ios`) + - firebase_messaging (from `.symlinks/plugins/firebase_messaging/ios`) + - Flutter (from `Flutter`) + - flutter_image_compress_common (from `.symlinks/plugins/flutter_image_compress_common/ios`) + - flutter_secure_storage (from `.symlinks/plugins/flutter_secure_storage/ios`) + - google_sign_in_ios (from `.symlinks/plugins/google_sign_in_ios/darwin`) + - image_cropper (from `.symlinks/plugins/image_cropper/ios`) + - image_picker_ios (from `.symlinks/plugins/image_picker_ios/ios`) + - jailbreak_root_detection (from `.symlinks/plugins/jailbreak_root_detection/ios`) + - local_auth_darwin (from `.symlinks/plugins/local_auth_darwin/darwin`) + - path_provider_foundation (from `.symlinks/plugins/path_provider_foundation/darwin`) + - sqflite_darwin (from `.symlinks/plugins/sqflite_darwin/darwin`) + - url_launcher_ios (from `.symlinks/plugins/url_launcher_ios/ios`) + +SPEC REPOS: + trunk: + - AppAuth + - AppCheckCore + - Firebase + - FirebaseCore + - FirebaseCoreExtension + - FirebaseCoreInternal + - FirebaseCrashlytics + - FirebaseInstallations + - FirebaseMessaging + - FirebaseRemoteConfigInterop + - FirebaseSessions + - GoogleDataTransport + - GoogleSignIn + - GoogleUtilities + - GTMAppAuth + - GTMSessionFetcher + - IOSSecuritySuite + - libwebp + - Mantle + - nanopb + - PromisesObjC + - PromisesSwift + - SDWebImage + - SDWebImageWebPCoder + - TOCropViewController + +EXTERNAL SOURCES: + device_info_plus: + :path: ".symlinks/plugins/device_info_plus/ios" + firebase_core: + :path: ".symlinks/plugins/firebase_core/ios" + firebase_crashlytics: + :path: ".symlinks/plugins/firebase_crashlytics/ios" + firebase_messaging: + :path: ".symlinks/plugins/firebase_messaging/ios" + Flutter: + :path: Flutter + flutter_image_compress_common: + :path: ".symlinks/plugins/flutter_image_compress_common/ios" + flutter_secure_storage: + :path: ".symlinks/plugins/flutter_secure_storage/ios" + google_sign_in_ios: + :path: ".symlinks/plugins/google_sign_in_ios/darwin" + image_cropper: + :path: ".symlinks/plugins/image_cropper/ios" + image_picker_ios: + :path: ".symlinks/plugins/image_picker_ios/ios" + jailbreak_root_detection: + :path: ".symlinks/plugins/jailbreak_root_detection/ios" + local_auth_darwin: + :path: ".symlinks/plugins/local_auth_darwin/darwin" + path_provider_foundation: + :path: ".symlinks/plugins/path_provider_foundation/darwin" + sqflite_darwin: + :path: ".symlinks/plugins/sqflite_darwin/darwin" + url_launcher_ios: + :path: ".symlinks/plugins/url_launcher_ios/ios" + +SPEC CHECKSUMS: + AppAuth: d4f13a8fe0baf391b2108511793e4b479691fb73 + AppCheckCore: cc8fd0a3a230ddd401f326489c99990b013f0c4f + device_info_plus: 21fcca2080fbcd348be798aa36c3e5ed849eefbe + Firebase: d99ac19b909cd2c548339c2241ecd0d1599ab02e + firebase_core: 995454a784ff288be5689b796deb9e9fa3601818 + firebase_crashlytics: 30dcd6dfd2fe895c0848af46722a4227346c19aa + firebase_messaging: f4a41dd102ac18b840eba3f39d67e77922d3f707 + FirebaseCore: efb3893e5b94f32b86e331e3bd6dadf18b66568e + FirebaseCoreExtension: edbd30474b5ccf04e5f001470bdf6ea616af2435 + FirebaseCoreInternal: 9afa45b1159304c963da48addb78275ef701c6b4 + FirebaseCrashlytics: e09d0bc19aa54a51e45b8039c836ef73f32c039a + FirebaseInstallations: 317270fec08a5d418fdbc8429282238cab3ac843 + FirebaseMessaging: 3b26e2cee503815e01c3701236b020aa9b576f09 + FirebaseRemoteConfigInterop: 1c6135e8a094cc6368949f5faeeca7ee8948b8aa + FirebaseSessions: b9a92c1c51bbb81e78fc3142cda6d925d700f8e7 + Flutter: e0871f40cf51350855a761d2e70bf5af5b9b5de7 + flutter_image_compress_common: 1697a328fd72bfb335507c6bca1a65fa5ad87df1 + flutter_secure_storage: 1ed9476fba7e7a782b22888f956cce43e2c62f13 + google_sign_in_ios: b48bb9af78576358a168361173155596c845f0b9 + GoogleDataTransport: aae35b7ea0c09004c3797d53c8c41f66f219d6a7 + GoogleSignIn: ce8c89bb9b37fb624b92e7514cc67335d1e277e4 + GoogleUtilities: 00c88b9a86066ef77f0da2fab05f65d7768ed8e1 + GTMAppAuth: f69bd07d68cd3b766125f7e072c45d7340dea0de + GTMSessionFetcher: 5aea5ba6bd522a239e236100971f10cb71b96ab6 + image_cropper: 5f162dcf988100dc1513f9c6b7eb42cd6fbf9156 + image_picker_ios: 7fe1ff8e34c1790d6fff70a32484959f563a928a + IOSSecuritySuite: b51056d5411aee567153ca86ce7f6edfdc5d2654 + jailbreak_root_detection: 9201e1dfd51dc23069cbfb8d4f4a2d18305170bf + libwebp: 02b23773aedb6ff1fd38cec7a77b81414c6842a8 + local_auth_darwin: d2e8c53ef0c4f43c646462e3415432c4dab3ae19 + Mantle: c5aa8794a29a022dfbbfc9799af95f477a69b62d + nanopb: fad817b59e0457d11a5dfbde799381cd727c1275 + path_provider_foundation: 080d55be775b7414fd5a5ef3ac137b97b097e564 + PromisesObjC: f5707f49cb48b9636751c5b2e7d227e43fba9f47 + PromisesSwift: 9d77319bbe72ebf6d872900551f7eeba9bce2851 + SDWebImage: 1bb6a1b84b6fe87b972a102bdc77dd589df33477 + SDWebImageWebPCoder: 0e06e365080397465cc73a7a9b472d8a3bd0f377 + sqflite_darwin: 20b2a3a3b70e43edae938624ce550a3cbf66a3d0 + TOCropViewController: 80b8985ad794298fb69d3341de183f33d1853654 + url_launcher_ios: 694010445543906933d732453a59da0a173ae33d + +PODFILE CHECKSUM: 53a6aebc29ccee84c41f92f409fc20cd4ca011f1 + +COCOAPODS: 1.16.2 diff --git a/siro_admin/ios/Runner.xcodeproj/project.pbxproj b/siro_admin/ios/Runner.xcodeproj/project.pbxproj new file mode 100644 index 0000000..4dd1401 --- /dev/null +++ b/siro_admin/ios/Runner.xcodeproj/project.pbxproj @@ -0,0 +1,776 @@ +// !$*UTF8*$! +{ + archiveVersion = 1; + classes = { + }; + objectVersion = 54; + objects = { + +/* Begin PBXBuildFile section */ + 1498D2341E8E89220040F4C2 /* GeneratedPluginRegistrant.m in Sources */ = {isa = PBXBuildFile; fileRef = 1498D2331E8E89220040F4C2 /* GeneratedPluginRegistrant.m */; }; + 331C808B294A63AB00263BE5 /* RunnerTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 331C807B294A618700263BE5 /* RunnerTests.swift */; }; + 3B3967161E833CAA004F5970 /* AppFrameworkInfo.plist in Resources */ = {isa = PBXBuildFile; fileRef = 3B3967151E833CAA004F5970 /* AppFrameworkInfo.plist */; }; + 527039E40D4EAB0135E096EE /* GoogleService-Info.plist in Resources */ = {isa = PBXBuildFile; fileRef = 73E8F958F8E11E492CC8347B /* GoogleService-Info.plist */; }; + 74858FAF1ED2DC5600515810 /* AppDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 74858FAE1ED2DC5600515810 /* AppDelegate.swift */; }; + 9342A9FA2AD106E221F7DAB6 /* Pods_Runner.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = FDA8B49500E734316D637FD8 /* Pods_Runner.framework */; }; + 97C146FC1CF9000F007C117D /* Main.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 97C146FA1CF9000F007C117D /* Main.storyboard */; }; + 97C146FE1CF9000F007C117D /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 97C146FD1CF9000F007C117D /* Assets.xcassets */; }; + 97C147011CF9000F007C117D /* LaunchScreen.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 97C146FF1CF9000F007C117D /* LaunchScreen.storyboard */; }; + E670378D1405439DD7AF5EBB /* Pods_RunnerTests.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 5EC640B461F2104E309FF1F7 /* Pods_RunnerTests.framework */; }; +/* End PBXBuildFile section */ + +/* Begin PBXContainerItemProxy section */ + 331C8085294A63A400263BE5 /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = 97C146E61CF9000F007C117D /* Project object */; + proxyType = 1; + remoteGlobalIDString = 97C146ED1CF9000F007C117D; + remoteInfo = Runner; + }; +/* End PBXContainerItemProxy section */ + +/* Begin PBXCopyFilesBuildPhase section */ + 9705A1C41CF9048500538489 /* Embed Frameworks */ = { + isa = PBXCopyFilesBuildPhase; + buildActionMask = 2147483647; + dstPath = ""; + dstSubfolderSpec = 10; + files = ( + ); + name = "Embed Frameworks"; + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXCopyFilesBuildPhase section */ + +/* Begin PBXFileReference section */ + 1498D2321E8E86230040F4C2 /* GeneratedPluginRegistrant.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = GeneratedPluginRegistrant.h; sourceTree = ""; }; + 1498D2331E8E89220040F4C2 /* GeneratedPluginRegistrant.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = GeneratedPluginRegistrant.m; sourceTree = ""; }; + 1EBC229DC8263C3B52AAC963 /* Pods-RunnerTests.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-RunnerTests.debug.xcconfig"; path = "Target Support Files/Pods-RunnerTests/Pods-RunnerTests.debug.xcconfig"; sourceTree = ""; }; + 331C807B294A618700263BE5 /* RunnerTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = RunnerTests.swift; sourceTree = ""; }; + 331C8081294A63A400263BE5 /* RunnerTests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = RunnerTests.xctest; sourceTree = BUILT_PRODUCTS_DIR; }; + 3B3967151E833CAA004F5970 /* AppFrameworkInfo.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; name = AppFrameworkInfo.plist; path = Flutter/AppFrameworkInfo.plist; sourceTree = ""; }; + 5EC640B461F2104E309FF1F7 /* Pods_RunnerTests.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_RunnerTests.framework; sourceTree = BUILT_PRODUCTS_DIR; }; + 5ED5B8D836D2189400270241 /* Pods-Runner.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.debug.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.debug.xcconfig"; sourceTree = ""; }; + 6F23561F6DB92199934A4B98 /* Pods-Runner.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.release.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.release.xcconfig"; sourceTree = ""; }; + 73E8F958F8E11E492CC8347B /* GoogleService-Info.plist */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.plist.xml; name = "GoogleService-Info.plist"; path = "Runner/GoogleService-Info.plist"; sourceTree = ""; }; + 74858FAD1ED2DC5600515810 /* Runner-Bridging-Header.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = "Runner-Bridging-Header.h"; sourceTree = ""; }; + 74858FAE1ED2DC5600515810 /* AppDelegate.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = AppDelegate.swift; sourceTree = ""; }; + 7AFA3C8E1D35360C0083082E /* Release.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; name = Release.xcconfig; path = Flutter/Release.xcconfig; sourceTree = ""; }; + 9740EEB21CF90195004384FC /* Debug.xcconfig */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xcconfig; name = Debug.xcconfig; path = Flutter/Debug.xcconfig; sourceTree = ""; }; + 9740EEB31CF90195004384FC /* Generated.xcconfig */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xcconfig; name = Generated.xcconfig; path = Flutter/Generated.xcconfig; sourceTree = ""; }; + 97C146EE1CF9000F007C117D /* Runner.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = Runner.app; sourceTree = BUILT_PRODUCTS_DIR; }; + 97C146FB1CF9000F007C117D /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/Main.storyboard; sourceTree = ""; }; + 97C146FD1CF9000F007C117D /* Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Assets.xcassets; sourceTree = ""; }; + 97C147001CF9000F007C117D /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/LaunchScreen.storyboard; sourceTree = ""; }; + 97C147021CF9000F007C117D /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; + AB8C1C5C4306313B88607414 /* Pods-RunnerTests.profile.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-RunnerTests.profile.xcconfig"; path = "Target Support Files/Pods-RunnerTests/Pods-RunnerTests.profile.xcconfig"; sourceTree = ""; }; + B60707A34F0B9DB0B6A88479 /* Pods-RunnerTests.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-RunnerTests.release.xcconfig"; path = "Target Support Files/Pods-RunnerTests/Pods-RunnerTests.release.xcconfig"; sourceTree = ""; }; + C6CDDBA12E380830001DF322 /* Runner.entitlements */ = {isa = PBXFileReference; lastKnownFileType = text.plist.entitlements; path = Runner.entitlements; sourceTree = ""; }; + C8469308CFD0D8E16300A226 /* Pods-Runner.profile.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.profile.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.profile.xcconfig"; sourceTree = ""; }; + FDA8B49500E734316D637FD8 /* Pods_Runner.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_Runner.framework; sourceTree = BUILT_PRODUCTS_DIR; }; +/* End PBXFileReference section */ + +/* Begin PBXFrameworksBuildPhase section */ + 5F9BD6057132BB85E61AA1F1 /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( + E670378D1405439DD7AF5EBB /* Pods_RunnerTests.framework in Frameworks */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + 97C146EB1CF9000F007C117D /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( + 9342A9FA2AD106E221F7DAB6 /* Pods_Runner.framework in Frameworks */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXFrameworksBuildPhase section */ + +/* Begin PBXGroup section */ + 331C8082294A63A400263BE5 /* RunnerTests */ = { + isa = PBXGroup; + children = ( + 331C807B294A618700263BE5 /* RunnerTests.swift */, + ); + path = RunnerTests; + sourceTree = ""; + }; + 4B1ED6B74EA743B7B0569FC5 /* Frameworks */ = { + isa = PBXGroup; + children = ( + FDA8B49500E734316D637FD8 /* Pods_Runner.framework */, + 5EC640B461F2104E309FF1F7 /* Pods_RunnerTests.framework */, + ); + name = Frameworks; + sourceTree = ""; + }; + 717BF44F479371B4C56CAA15 /* Pods */ = { + isa = PBXGroup; + children = ( + 5ED5B8D836D2189400270241 /* Pods-Runner.debug.xcconfig */, + 6F23561F6DB92199934A4B98 /* Pods-Runner.release.xcconfig */, + C8469308CFD0D8E16300A226 /* Pods-Runner.profile.xcconfig */, + 1EBC229DC8263C3B52AAC963 /* Pods-RunnerTests.debug.xcconfig */, + B60707A34F0B9DB0B6A88479 /* Pods-RunnerTests.release.xcconfig */, + AB8C1C5C4306313B88607414 /* Pods-RunnerTests.profile.xcconfig */, + ); + path = Pods; + sourceTree = ""; + }; + 9740EEB11CF90186004384FC /* Flutter */ = { + isa = PBXGroup; + children = ( + 3B3967151E833CAA004F5970 /* AppFrameworkInfo.plist */, + 9740EEB21CF90195004384FC /* Debug.xcconfig */, + 7AFA3C8E1D35360C0083082E /* Release.xcconfig */, + 9740EEB31CF90195004384FC /* Generated.xcconfig */, + ); + name = Flutter; + sourceTree = ""; + }; + 97C146E51CF9000F007C117D = { + isa = PBXGroup; + children = ( + 9740EEB11CF90186004384FC /* Flutter */, + 97C146F01CF9000F007C117D /* Runner */, + 97C146EF1CF9000F007C117D /* Products */, + 331C8082294A63A400263BE5 /* RunnerTests */, + 73E8F958F8E11E492CC8347B /* GoogleService-Info.plist */, + 717BF44F479371B4C56CAA15 /* Pods */, + 4B1ED6B74EA743B7B0569FC5 /* Frameworks */, + ); + sourceTree = ""; + }; + 97C146EF1CF9000F007C117D /* Products */ = { + isa = PBXGroup; + children = ( + 97C146EE1CF9000F007C117D /* Runner.app */, + 331C8081294A63A400263BE5 /* RunnerTests.xctest */, + ); + name = Products; + sourceTree = ""; + }; + 97C146F01CF9000F007C117D /* Runner */ = { + isa = PBXGroup; + children = ( + C6CDDBA12E380830001DF322 /* Runner.entitlements */, + 97C146FA1CF9000F007C117D /* Main.storyboard */, + 97C146FD1CF9000F007C117D /* Assets.xcassets */, + 97C146FF1CF9000F007C117D /* LaunchScreen.storyboard */, + 97C147021CF9000F007C117D /* Info.plist */, + 1498D2321E8E86230040F4C2 /* GeneratedPluginRegistrant.h */, + 1498D2331E8E89220040F4C2 /* GeneratedPluginRegistrant.m */, + 74858FAE1ED2DC5600515810 /* AppDelegate.swift */, + 74858FAD1ED2DC5600515810 /* Runner-Bridging-Header.h */, + ); + path = Runner; + sourceTree = ""; + }; +/* End PBXGroup section */ + +/* Begin PBXNativeTarget section */ + 331C8080294A63A400263BE5 /* RunnerTests */ = { + isa = PBXNativeTarget; + buildConfigurationList = 331C8087294A63A400263BE5 /* Build configuration list for PBXNativeTarget "RunnerTests" */; + buildPhases = ( + D7A9EB0ED521886A34C0092C /* [CP] Check Pods Manifest.lock */, + 331C807D294A63A400263BE5 /* Sources */, + 331C807F294A63A400263BE5 /* Resources */, + 5F9BD6057132BB85E61AA1F1 /* Frameworks */, + ); + buildRules = ( + ); + dependencies = ( + 331C8086294A63A400263BE5 /* PBXTargetDependency */, + ); + name = RunnerTests; + productName = RunnerTests; + productReference = 331C8081294A63A400263BE5 /* RunnerTests.xctest */; + productType = "com.apple.product-type.bundle.unit-test"; + }; + 97C146ED1CF9000F007C117D /* Runner */ = { + isa = PBXNativeTarget; + buildConfigurationList = 97C147051CF9000F007C117D /* Build configuration list for PBXNativeTarget "Runner" */; + buildPhases = ( + E0923FD989819DEF47CB5EBB /* [CP] Check Pods Manifest.lock */, + 9740EEB61CF901F6004384FC /* Run Script */, + 97C146EA1CF9000F007C117D /* Sources */, + 97C146EB1CF9000F007C117D /* Frameworks */, + 97C146EC1CF9000F007C117D /* Resources */, + 9705A1C41CF9048500538489 /* Embed Frameworks */, + 3B06AD1E1E4923F5004D2608 /* Thin Binary */, + 4E66E99C9DBB1AE194E3C927 /* FlutterFire: "flutterfire upload-crashlytics-symbols" */, + 2347D6BF62C946F821E9020F /* [CP] Embed Pods Frameworks */, + 0700B6EB69B780AEF179FACB /* [CP] Copy Pods Resources */, + ); + buildRules = ( + ); + dependencies = ( + ); + name = Runner; + productName = Runner; + productReference = 97C146EE1CF9000F007C117D /* Runner.app */; + productType = "com.apple.product-type.application"; + }; +/* End PBXNativeTarget section */ + +/* Begin PBXProject section */ + 97C146E61CF9000F007C117D /* Project object */ = { + isa = PBXProject; + attributes = { + BuildIndependentTargetsInParallel = YES; + LastUpgradeCheck = 1510; + ORGANIZATIONNAME = ""; + TargetAttributes = { + 331C8080294A63A400263BE5 = { + CreatedOnToolsVersion = 14.0; + TestTargetID = 97C146ED1CF9000F007C117D; + }; + 97C146ED1CF9000F007C117D = { + CreatedOnToolsVersion = 7.3.1; + LastSwiftMigration = 1100; + }; + }; + }; + buildConfigurationList = 97C146E91CF9000F007C117D /* Build configuration list for PBXProject "Runner" */; + compatibilityVersion = "Xcode 9.3"; + developmentRegion = en; + hasScannedForEncodings = 0; + knownRegions = ( + en, + Base, + ); + mainGroup = 97C146E51CF9000F007C117D; + productRefGroup = 97C146EF1CF9000F007C117D /* Products */; + projectDirPath = ""; + projectRoot = ""; + targets = ( + 97C146ED1CF9000F007C117D /* Runner */, + 331C8080294A63A400263BE5 /* RunnerTests */, + ); + }; +/* End PBXProject section */ + +/* Begin PBXResourcesBuildPhase section */ + 331C807F294A63A400263BE5 /* Resources */ = { + isa = PBXResourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + runOnlyForDeploymentPostprocessing = 0; + }; + 97C146EC1CF9000F007C117D /* Resources */ = { + isa = PBXResourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + 97C147011CF9000F007C117D /* LaunchScreen.storyboard in Resources */, + 3B3967161E833CAA004F5970 /* AppFrameworkInfo.plist in Resources */, + 97C146FE1CF9000F007C117D /* Assets.xcassets in Resources */, + 97C146FC1CF9000F007C117D /* Main.storyboard in Resources */, + 527039E40D4EAB0135E096EE /* GoogleService-Info.plist in Resources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXResourcesBuildPhase section */ + +/* Begin PBXShellScriptBuildPhase section */ + 0700B6EB69B780AEF179FACB /* [CP] Copy Pods Resources */ = { + isa = PBXShellScriptBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + inputFileListPaths = ( + "${PODS_ROOT}/Target Support Files/Pods-Runner/Pods-Runner-resources-${CONFIGURATION}-input-files.xcfilelist", + ); + name = "[CP] Copy Pods Resources"; + outputFileListPaths = ( + "${PODS_ROOT}/Target Support Files/Pods-Runner/Pods-Runner-resources-${CONFIGURATION}-output-files.xcfilelist", + ); + runOnlyForDeploymentPostprocessing = 0; + shellPath = /bin/sh; + shellScript = "\"${PODS_ROOT}/Target Support Files/Pods-Runner/Pods-Runner-resources.sh\"\n"; + showEnvVarsInLog = 0; + }; + 2347D6BF62C946F821E9020F /* [CP] Embed Pods Frameworks */ = { + isa = PBXShellScriptBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + inputFileListPaths = ( + "${PODS_ROOT}/Target Support Files/Pods-Runner/Pods-Runner-frameworks-${CONFIGURATION}-input-files.xcfilelist", + ); + name = "[CP] Embed Pods Frameworks"; + outputFileListPaths = ( + "${PODS_ROOT}/Target Support Files/Pods-Runner/Pods-Runner-frameworks-${CONFIGURATION}-output-files.xcfilelist", + ); + runOnlyForDeploymentPostprocessing = 0; + shellPath = /bin/sh; + shellScript = "\"${PODS_ROOT}/Target Support Files/Pods-Runner/Pods-Runner-frameworks.sh\"\n"; + showEnvVarsInLog = 0; + }; + 3B06AD1E1E4923F5004D2608 /* Thin Binary */ = { + isa = PBXShellScriptBuildPhase; + alwaysOutOfDate = 1; + buildActionMask = 2147483647; + files = ( + ); + inputPaths = ( + "${TARGET_BUILD_DIR}/${INFOPLIST_PATH}", + ); + name = "Thin Binary"; + outputPaths = ( + ); + runOnlyForDeploymentPostprocessing = 0; + shellPath = /bin/sh; + shellScript = "/bin/sh \"$FLUTTER_ROOT/packages/flutter_tools/bin/xcode_backend.sh\" embed_and_thin"; + }; + 4E66E99C9DBB1AE194E3C927 /* FlutterFire: "flutterfire upload-crashlytics-symbols" */ = { + isa = PBXShellScriptBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + inputFileListPaths = ( + ); + inputPaths = ( + ); + name = "FlutterFire: \"flutterfire upload-crashlytics-symbols\""; + outputFileListPaths = ( + ); + outputPaths = ( + ); + runOnlyForDeploymentPostprocessing = 0; + shellPath = /bin/sh; + shellScript = "\n#!/bin/bash\nPATH=\"${PATH}:$FLUTTER_ROOT/bin:${PUB_CACHE}/bin:$HOME/.pub-cache/bin\"\n\nif [ -z \"$PODS_ROOT\" ] || [ ! -d \"$PODS_ROOT/FirebaseCrashlytics\" ]; then\n # Cannot use \"BUILD_DIR%/Build/*\" as per Firebase documentation, it points to \"flutter-project/build/ios/*\" path which doesn't have run script\n DERIVED_DATA_PATH=$(echo \"$BUILD_ROOT\" | sed -E 's|(.*DerivedData/[^/]+).*|\\1|')\n PATH_TO_CRASHLYTICS_UPLOAD_SCRIPT=\"${DERIVED_DATA_PATH}/SourcePackages/checkouts/firebase-ios-sdk/Crashlytics/run\"\nelse\n PATH_TO_CRASHLYTICS_UPLOAD_SCRIPT=\"$PODS_ROOT/FirebaseCrashlytics/run\"\nfi\n\n# Command to upload symbols script used to upload symbols to Firebase server\nflutterfire upload-crashlytics-symbols --upload-symbols-script-path=\"$PATH_TO_CRASHLYTICS_UPLOAD_SCRIPT\" --platform=ios --apple-project-path=\"${SRCROOT}\" --env-platform-name=\"${PLATFORM_NAME}\" --env-configuration=\"${CONFIGURATION}\" --env-project-dir=\"${PROJECT_DIR}\" --env-built-products-dir=\"${BUILT_PRODUCTS_DIR}\" --env-dwarf-dsym-folder-path=\"${DWARF_DSYM_FOLDER_PATH}\" --env-dwarf-dsym-file-name=\"${DWARF_DSYM_FILE_NAME}\" --env-infoplist-path=\"${INFOPLIST_PATH}\" --default-config=default\n"; + }; + 9740EEB61CF901F6004384FC /* Run Script */ = { + isa = PBXShellScriptBuildPhase; + alwaysOutOfDate = 1; + buildActionMask = 2147483647; + files = ( + ); + inputPaths = ( + ); + name = "Run Script"; + outputPaths = ( + ); + runOnlyForDeploymentPostprocessing = 0; + shellPath = /bin/sh; + shellScript = "/bin/sh \"$FLUTTER_ROOT/packages/flutter_tools/bin/xcode_backend.sh\" build"; + }; + D7A9EB0ED521886A34C0092C /* [CP] Check Pods Manifest.lock */ = { + isa = PBXShellScriptBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + inputFileListPaths = ( + ); + inputPaths = ( + "${PODS_PODFILE_DIR_PATH}/Podfile.lock", + "${PODS_ROOT}/Manifest.lock", + ); + name = "[CP] Check Pods Manifest.lock"; + outputFileListPaths = ( + ); + outputPaths = ( + "$(DERIVED_FILE_DIR)/Pods-RunnerTests-checkManifestLockResult.txt", + ); + runOnlyForDeploymentPostprocessing = 0; + shellPath = /bin/sh; + shellScript = "diff \"${PODS_PODFILE_DIR_PATH}/Podfile.lock\" \"${PODS_ROOT}/Manifest.lock\" > /dev/null\nif [ $? != 0 ] ; then\n # print error to STDERR\n echo \"error: The sandbox is not in sync with the Podfile.lock. Run 'pod install' or update your CocoaPods installation.\" >&2\n exit 1\nfi\n# This output is used by Xcode 'outputs' to avoid re-running this script phase.\necho \"SUCCESS\" > \"${SCRIPT_OUTPUT_FILE_0}\"\n"; + showEnvVarsInLog = 0; + }; + E0923FD989819DEF47CB5EBB /* [CP] Check Pods Manifest.lock */ = { + isa = PBXShellScriptBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + inputFileListPaths = ( + ); + inputPaths = ( + "${PODS_PODFILE_DIR_PATH}/Podfile.lock", + "${PODS_ROOT}/Manifest.lock", + ); + name = "[CP] Check Pods Manifest.lock"; + outputFileListPaths = ( + ); + outputPaths = ( + "$(DERIVED_FILE_DIR)/Pods-Runner-checkManifestLockResult.txt", + ); + runOnlyForDeploymentPostprocessing = 0; + shellPath = /bin/sh; + shellScript = "diff \"${PODS_PODFILE_DIR_PATH}/Podfile.lock\" \"${PODS_ROOT}/Manifest.lock\" > /dev/null\nif [ $? != 0 ] ; then\n # print error to STDERR\n echo \"error: The sandbox is not in sync with the Podfile.lock. Run 'pod install' or update your CocoaPods installation.\" >&2\n exit 1\nfi\n# This output is used by Xcode 'outputs' to avoid re-running this script phase.\necho \"SUCCESS\" > \"${SCRIPT_OUTPUT_FILE_0}\"\n"; + showEnvVarsInLog = 0; + }; +/* End PBXShellScriptBuildPhase section */ + +/* Begin PBXSourcesBuildPhase section */ + 331C807D294A63A400263BE5 /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + 331C808B294A63AB00263BE5 /* RunnerTests.swift in Sources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + 97C146EA1CF9000F007C117D /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + 74858FAF1ED2DC5600515810 /* AppDelegate.swift in Sources */, + 1498D2341E8E89220040F4C2 /* GeneratedPluginRegistrant.m in Sources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXSourcesBuildPhase section */ + +/* Begin PBXTargetDependency section */ + 331C8086294A63A400263BE5 /* PBXTargetDependency */ = { + isa = PBXTargetDependency; + target = 97C146ED1CF9000F007C117D /* Runner */; + targetProxy = 331C8085294A63A400263BE5 /* PBXContainerItemProxy */; + }; +/* End PBXTargetDependency section */ + +/* Begin PBXVariantGroup section */ + 97C146FA1CF9000F007C117D /* Main.storyboard */ = { + isa = PBXVariantGroup; + children = ( + 97C146FB1CF9000F007C117D /* Base */, + ); + name = Main.storyboard; + sourceTree = ""; + }; + 97C146FF1CF9000F007C117D /* LaunchScreen.storyboard */ = { + isa = PBXVariantGroup; + children = ( + 97C147001CF9000F007C117D /* Base */, + ); + name = LaunchScreen.storyboard; + sourceTree = ""; + }; +/* End PBXVariantGroup section */ + +/* Begin XCBuildConfiguration section */ + 249021D3217E4FDB00AE95B9 /* Profile */ = { + isa = XCBuildConfiguration; + buildSettings = { + ALWAYS_SEARCH_USER_PATHS = NO; + ASSETCATALOG_COMPILER_GENERATE_SWIFT_ASSET_SYMBOL_EXTENSIONS = YES; + CLANG_ANALYZER_NONNULL = YES; + CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; + CLANG_CXX_LIBRARY = "libc++"; + CLANG_ENABLE_MODULES = YES; + CLANG_ENABLE_OBJC_ARC = YES; + CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; + CLANG_WARN_BOOL_CONVERSION = YES; + CLANG_WARN_COMMA = YES; + CLANG_WARN_CONSTANT_CONVERSION = YES; + CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; + CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; + CLANG_WARN_EMPTY_BODY = YES; + CLANG_WARN_ENUM_CONVERSION = YES; + CLANG_WARN_INFINITE_RECURSION = YES; + CLANG_WARN_INT_CONVERSION = YES; + CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; + CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; + CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; + CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; + CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; + CLANG_WARN_STRICT_PROTOTYPES = YES; + CLANG_WARN_SUSPICIOUS_MOVE = YES; + CLANG_WARN_UNREACHABLE_CODE = YES; + CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; + "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; + COPY_PHASE_STRIP = NO; + DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; + ENABLE_NS_ASSERTIONS = NO; + ENABLE_STRICT_OBJC_MSGSEND = YES; + ENABLE_USER_SCRIPT_SANDBOXING = NO; + GCC_C_LANGUAGE_STANDARD = gnu99; + GCC_NO_COMMON_BLOCKS = YES; + GCC_WARN_64_TO_32_BIT_CONVERSION = YES; + GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; + GCC_WARN_UNDECLARED_SELECTOR = YES; + GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; + GCC_WARN_UNUSED_FUNCTION = YES; + GCC_WARN_UNUSED_VARIABLE = YES; + IPHONEOS_DEPLOYMENT_TARGET = 13.0; + MTL_ENABLE_DEBUG_INFO = NO; + SDKROOT = iphoneos; + SUPPORTED_PLATFORMS = iphoneos; + TARGETED_DEVICE_FAMILY = "1,2"; + VALIDATE_PRODUCT = YES; + }; + name = Profile; + }; + 249021D4217E4FDB00AE95B9 /* Profile */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = 7AFA3C8E1D35360C0083082E /* Release.xcconfig */; + buildSettings = { + ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; + CLANG_ENABLE_MODULES = YES; + CODE_SIGN_ENTITLEMENTS = Runner/Runner.entitlements; + CURRENT_PROJECT_VERSION = "$(FLUTTER_BUILD_NUMBER)"; + DEVELOPMENT_TEAM = 63CVT8G5P8; + ENABLE_BITCODE = NO; + INFOPLIST_FILE = Runner/Info.plist; + LD_RUNPATH_SEARCH_PATHS = ( + "$(inherited)", + "@executable_path/Frameworks", + ); + PRODUCT_BUNDLE_IDENTIFIER = com.intaleq.intaleqAdmin; + PRODUCT_NAME = "$(TARGET_NAME)"; + SWIFT_OBJC_BRIDGING_HEADER = "Runner/Runner-Bridging-Header.h"; + SWIFT_VERSION = 5.0; + VERSIONING_SYSTEM = "apple-generic"; + }; + name = Profile; + }; + 331C8088294A63A400263BE5 /* Debug */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = 1EBC229DC8263C3B52AAC963 /* Pods-RunnerTests.debug.xcconfig */; + buildSettings = { + BUNDLE_LOADER = "$(TEST_HOST)"; + CODE_SIGN_STYLE = Automatic; + CURRENT_PROJECT_VERSION = 1; + GENERATE_INFOPLIST_FILE = YES; + MARKETING_VERSION = 1.0; + PRODUCT_BUNDLE_IDENTIFIER = com.intaleq.intaleqAdmin.RunnerTests; + PRODUCT_NAME = "$(TARGET_NAME)"; + SWIFT_ACTIVE_COMPILATION_CONDITIONS = DEBUG; + SWIFT_OPTIMIZATION_LEVEL = "-Onone"; + SWIFT_VERSION = 5.0; + TEST_HOST = "$(BUILT_PRODUCTS_DIR)/Runner.app/$(BUNDLE_EXECUTABLE_FOLDER_PATH)/Runner"; + }; + name = Debug; + }; + 331C8089294A63A400263BE5 /* Release */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = B60707A34F0B9DB0B6A88479 /* Pods-RunnerTests.release.xcconfig */; + buildSettings = { + BUNDLE_LOADER = "$(TEST_HOST)"; + CODE_SIGN_STYLE = Automatic; + CURRENT_PROJECT_VERSION = 1; + GENERATE_INFOPLIST_FILE = YES; + MARKETING_VERSION = 1.0; + PRODUCT_BUNDLE_IDENTIFIER = com.intaleq.intaleqAdmin.RunnerTests; + PRODUCT_NAME = "$(TARGET_NAME)"; + SWIFT_VERSION = 5.0; + TEST_HOST = "$(BUILT_PRODUCTS_DIR)/Runner.app/$(BUNDLE_EXECUTABLE_FOLDER_PATH)/Runner"; + }; + name = Release; + }; + 331C808A294A63A400263BE5 /* Profile */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = AB8C1C5C4306313B88607414 /* Pods-RunnerTests.profile.xcconfig */; + buildSettings = { + BUNDLE_LOADER = "$(TEST_HOST)"; + CODE_SIGN_STYLE = Automatic; + CURRENT_PROJECT_VERSION = 1; + GENERATE_INFOPLIST_FILE = YES; + MARKETING_VERSION = 1.0; + PRODUCT_BUNDLE_IDENTIFIER = com.intaleq.intaleqAdmin.RunnerTests; + PRODUCT_NAME = "$(TARGET_NAME)"; + SWIFT_VERSION = 5.0; + TEST_HOST = "$(BUILT_PRODUCTS_DIR)/Runner.app/$(BUNDLE_EXECUTABLE_FOLDER_PATH)/Runner"; + }; + name = Profile; + }; + 97C147031CF9000F007C117D /* Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + ALWAYS_SEARCH_USER_PATHS = NO; + ASSETCATALOG_COMPILER_GENERATE_SWIFT_ASSET_SYMBOL_EXTENSIONS = AppIcon; + CLANG_ANALYZER_NONNULL = YES; + CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; + CLANG_CXX_LIBRARY = "libc++"; + CLANG_ENABLE_MODULES = YES; + CLANG_ENABLE_OBJC_ARC = YES; + CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; + CLANG_WARN_BOOL_CONVERSION = YES; + CLANG_WARN_COMMA = YES; + CLANG_WARN_CONSTANT_CONVERSION = YES; + CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; + CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; + CLANG_WARN_EMPTY_BODY = YES; + CLANG_WARN_ENUM_CONVERSION = YES; + CLANG_WARN_INFINITE_RECURSION = YES; + CLANG_WARN_INT_CONVERSION = YES; + CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; + CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; + CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; + CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; + CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; + CLANG_WARN_STRICT_PROTOTYPES = YES; + CLANG_WARN_SUSPICIOUS_MOVE = YES; + CLANG_WARN_UNREACHABLE_CODE = YES; + CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; + "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; + COPY_PHASE_STRIP = NO; + DEBUG_INFORMATION_FORMAT = dwarf; + ENABLE_STRICT_OBJC_MSGSEND = YES; + ENABLE_TESTABILITY = YES; + ENABLE_USER_SCRIPT_SANDBOXING = NO; + GCC_C_LANGUAGE_STANDARD = gnu99; + GCC_DYNAMIC_NO_PIC = NO; + GCC_NO_COMMON_BLOCKS = YES; + GCC_OPTIMIZATION_LEVEL = 0; + GCC_PREPROCESSOR_DEFINITIONS = ( + "DEBUG=1", + "$(inherited)", + ); + GCC_WARN_64_TO_32_BIT_CONVERSION = YES; + GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; + GCC_WARN_UNDECLARED_SELECTOR = YES; + GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; + GCC_WARN_UNUSED_FUNCTION = YES; + GCC_WARN_UNUSED_VARIABLE = YES; + IPHONEOS_DEPLOYMENT_TARGET = 13.0; + MTL_ENABLE_DEBUG_INFO = YES; + ONLY_ACTIVE_ARCH = YES; + SDKROOT = iphoneos; + TARGETED_DEVICE_FAMILY = "1,2"; + }; + name = Debug; + }; + 97C147041CF9000F007C117D /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + ALWAYS_SEARCH_USER_PATHS = NO; + ASSETCATALOG_COMPILER_GENERATE_SWIFT_ASSET_SYMBOL_EXTENSIONS = AppIcon; + CLANG_ANALYZER_NONNULL = YES; + CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; + CLANG_CXX_LIBRARY = "libc++"; + CLANG_ENABLE_MODULES = YES; + CLANG_ENABLE_OBJC_ARC = YES; + CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; + CLANG_WARN_BOOL_CONVERSION = YES; + CLANG_WARN_COMMA = YES; + CLANG_WARN_CONSTANT_CONVERSION = YES; + CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; + CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; + CLANG_WARN_EMPTY_BODY = YES; + CLANG_WARN_ENUM_CONVERSION = YES; + CLANG_WARN_INFINITE_RECURSION = YES; + CLANG_WARN_INT_CONVERSION = YES; + CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; + CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; + CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; + CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; + CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; + CLANG_WARN_STRICT_PROTOTYPES = YES; + CLANG_WARN_SUSPICIOUS_MOVE = YES; + CLANG_WARN_UNREACHABLE_CODE = YES; + CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; + "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; + COPY_PHASE_STRIP = NO; + DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; + ENABLE_NS_ASSERTIONS = NO; + ENABLE_STRICT_OBJC_MSGSEND = YES; + ENABLE_USER_SCRIPT_SANDBOXING = NO; + GCC_C_LANGUAGE_STANDARD = gnu99; + GCC_NO_COMMON_BLOCKS = YES; + GCC_WARN_64_TO_32_BIT_CONVERSION = YES; + GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; + GCC_WARN_UNDECLARED_SELECTOR = YES; + GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; + GCC_WARN_UNUSED_FUNCTION = YES; + GCC_WARN_UNUSED_VARIABLE = YES; + IPHONEOS_DEPLOYMENT_TARGET = 13.0; + MTL_ENABLE_DEBUG_INFO = NO; + SDKROOT = iphoneos; + SUPPORTED_PLATFORMS = iphoneos; + SWIFT_COMPILATION_MODE = wholemodule; + SWIFT_OPTIMIZATION_LEVEL = "-O"; + TARGETED_DEVICE_FAMILY = "1,2"; + VALIDATE_PRODUCT = YES; + }; + name = Release; + }; + 97C147061CF9000F007C117D /* Debug */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = 9740EEB21CF90195004384FC /* Debug.xcconfig */; + buildSettings = { + ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; + CLANG_ENABLE_MODULES = YES; + CODE_SIGN_ENTITLEMENTS = Runner/Runner.entitlements; + CURRENT_PROJECT_VERSION = "$(FLUTTER_BUILD_NUMBER)"; + DEVELOPMENT_TEAM = 63CVT8G5P8; + ENABLE_BITCODE = NO; + INFOPLIST_FILE = Runner/Info.plist; + LD_RUNPATH_SEARCH_PATHS = ( + "$(inherited)", + "@executable_path/Frameworks", + ); + PRODUCT_BUNDLE_IDENTIFIER = com.intaleq.intaleqAdmin; + PRODUCT_NAME = "$(TARGET_NAME)"; + SWIFT_OBJC_BRIDGING_HEADER = "Runner/Runner-Bridging-Header.h"; + SWIFT_OPTIMIZATION_LEVEL = "-Onone"; + SWIFT_VERSION = 5.0; + VERSIONING_SYSTEM = "apple-generic"; + }; + name = Debug; + }; + 97C147071CF9000F007C117D /* Release */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = 7AFA3C8E1D35360C0083082E /* Release.xcconfig */; + buildSettings = { + ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; + CLANG_ENABLE_MODULES = YES; + CODE_SIGN_ENTITLEMENTS = Runner/Runner.entitlements; + CURRENT_PROJECT_VERSION = "$(FLUTTER_BUILD_NUMBER)"; + DEVELOPMENT_TEAM = 63CVT8G5P8; + ENABLE_BITCODE = NO; + INFOPLIST_FILE = Runner/Info.plist; + LD_RUNPATH_SEARCH_PATHS = ( + "$(inherited)", + "@executable_path/Frameworks", + ); + PRODUCT_BUNDLE_IDENTIFIER = com.intaleq.intaleqAdmin; + PRODUCT_NAME = "$(TARGET_NAME)"; + SWIFT_OBJC_BRIDGING_HEADER = "Runner/Runner-Bridging-Header.h"; + SWIFT_VERSION = 5.0; + VERSIONING_SYSTEM = "apple-generic"; + }; + name = Release; + }; +/* End XCBuildConfiguration section */ + +/* Begin XCConfigurationList section */ + 331C8087294A63A400263BE5 /* Build configuration list for PBXNativeTarget "RunnerTests" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 331C8088294A63A400263BE5 /* Debug */, + 331C8089294A63A400263BE5 /* Release */, + 331C808A294A63A400263BE5 /* Profile */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; + 97C146E91CF9000F007C117D /* Build configuration list for PBXProject "Runner" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 97C147031CF9000F007C117D /* Debug */, + 97C147041CF9000F007C117D /* Release */, + 249021D3217E4FDB00AE95B9 /* Profile */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; + 97C147051CF9000F007C117D /* Build configuration list for PBXNativeTarget "Runner" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 97C147061CF9000F007C117D /* Debug */, + 97C147071CF9000F007C117D /* Release */, + 249021D4217E4FDB00AE95B9 /* Profile */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; +/* End XCConfigurationList section */ + }; + rootObject = 97C146E61CF9000F007C117D /* Project object */; +} diff --git a/siro_admin/ios/Runner.xcodeproj/project.xcworkspace/contents.xcworkspacedata b/siro_admin/ios/Runner.xcodeproj/project.xcworkspace/contents.xcworkspacedata new file mode 100644 index 0000000..919434a --- /dev/null +++ b/siro_admin/ios/Runner.xcodeproj/project.xcworkspace/contents.xcworkspacedata @@ -0,0 +1,7 @@ + + + + + diff --git a/siro_admin/ios/Runner.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist b/siro_admin/ios/Runner.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist new file mode 100644 index 0000000..18d9810 --- /dev/null +++ b/siro_admin/ios/Runner.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist @@ -0,0 +1,8 @@ + + + + + IDEDidComputeMac32BitWarning + + + diff --git a/siro_admin/ios/Runner.xcodeproj/project.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings b/siro_admin/ios/Runner.xcodeproj/project.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings new file mode 100644 index 0000000..f9b0d7c --- /dev/null +++ b/siro_admin/ios/Runner.xcodeproj/project.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings @@ -0,0 +1,8 @@ + + + + + PreviewsEnabled + + + diff --git a/siro_admin/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme b/siro_admin/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme new file mode 100644 index 0000000..e3773d4 --- /dev/null +++ b/siro_admin/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme @@ -0,0 +1,101 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/siro_admin/ios/Runner.xcworkspace/contents.xcworkspacedata b/siro_admin/ios/Runner.xcworkspace/contents.xcworkspacedata new file mode 100644 index 0000000..21a3cc1 --- /dev/null +++ b/siro_admin/ios/Runner.xcworkspace/contents.xcworkspacedata @@ -0,0 +1,10 @@ + + + + + + + diff --git a/siro_admin/ios/Runner.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist b/siro_admin/ios/Runner.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist new file mode 100644 index 0000000..18d9810 --- /dev/null +++ b/siro_admin/ios/Runner.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist @@ -0,0 +1,8 @@ + + + + + IDEDidComputeMac32BitWarning + + + diff --git a/siro_admin/ios/Runner.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings b/siro_admin/ios/Runner.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings new file mode 100644 index 0000000..f9b0d7c --- /dev/null +++ b/siro_admin/ios/Runner.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings @@ -0,0 +1,8 @@ + + + + + PreviewsEnabled + + + diff --git a/siro_admin/ios/Runner/AppDelegate.swift b/siro_admin/ios/Runner/AppDelegate.swift new file mode 100644 index 0000000..6266644 --- /dev/null +++ b/siro_admin/ios/Runner/AppDelegate.swift @@ -0,0 +1,13 @@ +import Flutter +import UIKit + +@main +@objc class AppDelegate: FlutterAppDelegate { + override func application( + _ application: UIApplication, + didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]? + ) -> Bool { + GeneratedPluginRegistrant.register(with: self) + return super.application(application, didFinishLaunchingWithOptions: launchOptions) + } +} diff --git a/siro_admin/ios/Runner/Assets.xcassets/AppIcon.appiconset/Contents.json b/siro_admin/ios/Runner/Assets.xcassets/AppIcon.appiconset/Contents.json new file mode 100644 index 0000000..d0d98aa --- /dev/null +++ b/siro_admin/ios/Runner/Assets.xcassets/AppIcon.appiconset/Contents.json @@ -0,0 +1 @@ +{"images":[{"size":"20x20","idiom":"iphone","filename":"Icon-App-20x20@2x.png","scale":"2x"},{"size":"20x20","idiom":"iphone","filename":"Icon-App-20x20@3x.png","scale":"3x"},{"size":"29x29","idiom":"iphone","filename":"Icon-App-29x29@1x.png","scale":"1x"},{"size":"29x29","idiom":"iphone","filename":"Icon-App-29x29@2x.png","scale":"2x"},{"size":"29x29","idiom":"iphone","filename":"Icon-App-29x29@3x.png","scale":"3x"},{"size":"40x40","idiom":"iphone","filename":"Icon-App-40x40@2x.png","scale":"2x"},{"size":"40x40","idiom":"iphone","filename":"Icon-App-40x40@3x.png","scale":"3x"},{"size":"57x57","idiom":"iphone","filename":"Icon-App-57x57@1x.png","scale":"1x"},{"size":"57x57","idiom":"iphone","filename":"Icon-App-57x57@2x.png","scale":"2x"},{"size":"60x60","idiom":"iphone","filename":"Icon-App-60x60@2x.png","scale":"2x"},{"size":"60x60","idiom":"iphone","filename":"Icon-App-60x60@3x.png","scale":"3x"},{"size":"20x20","idiom":"ipad","filename":"Icon-App-20x20@1x.png","scale":"1x"},{"size":"20x20","idiom":"ipad","filename":"Icon-App-20x20@2x.png","scale":"2x"},{"size":"29x29","idiom":"ipad","filename":"Icon-App-29x29@1x.png","scale":"1x"},{"size":"29x29","idiom":"ipad","filename":"Icon-App-29x29@2x.png","scale":"2x"},{"size":"40x40","idiom":"ipad","filename":"Icon-App-40x40@1x.png","scale":"1x"},{"size":"40x40","idiom":"ipad","filename":"Icon-App-40x40@2x.png","scale":"2x"},{"size":"50x50","idiom":"ipad","filename":"Icon-App-50x50@1x.png","scale":"1x"},{"size":"50x50","idiom":"ipad","filename":"Icon-App-50x50@2x.png","scale":"2x"},{"size":"72x72","idiom":"ipad","filename":"Icon-App-72x72@1x.png","scale":"1x"},{"size":"72x72","idiom":"ipad","filename":"Icon-App-72x72@2x.png","scale":"2x"},{"size":"76x76","idiom":"ipad","filename":"Icon-App-76x76@1x.png","scale":"1x"},{"size":"76x76","idiom":"ipad","filename":"Icon-App-76x76@2x.png","scale":"2x"},{"size":"83.5x83.5","idiom":"ipad","filename":"Icon-App-83.5x83.5@2x.png","scale":"2x"},{"size":"1024x1024","idiom":"ios-marketing","filename":"Icon-App-1024x1024@1x.png","scale":"1x"}],"info":{"version":1,"author":"xcode"}} \ No newline at end of file diff --git a/siro_admin/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-1024x1024@1x.png b/siro_admin/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-1024x1024@1x.png new file mode 100644 index 0000000..c424645 Binary files /dev/null and b/siro_admin/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-1024x1024@1x.png differ diff --git a/siro_admin/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@1x.png b/siro_admin/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@1x.png new file mode 100644 index 0000000..cdc178c Binary files /dev/null and b/siro_admin/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@1x.png differ diff --git a/siro_admin/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@2x.png b/siro_admin/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@2x.png new file mode 100644 index 0000000..07b7120 Binary files /dev/null and b/siro_admin/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@2x.png differ diff --git a/siro_admin/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@3x.png b/siro_admin/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@3x.png new file mode 100644 index 0000000..538ed9b Binary files /dev/null and b/siro_admin/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@3x.png differ diff --git a/siro_admin/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@1x.png b/siro_admin/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@1x.png new file mode 100644 index 0000000..c880782 Binary files /dev/null and b/siro_admin/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@1x.png differ diff --git a/siro_admin/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@2x.png b/siro_admin/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@2x.png new file mode 100644 index 0000000..9996efe Binary files /dev/null and b/siro_admin/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@2x.png differ diff --git a/siro_admin/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@3x.png b/siro_admin/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@3x.png new file mode 100644 index 0000000..7e23720 Binary files /dev/null and b/siro_admin/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@3x.png differ diff --git a/siro_admin/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@1x.png b/siro_admin/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@1x.png new file mode 100644 index 0000000..07b7120 Binary files /dev/null and b/siro_admin/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@1x.png differ diff --git a/siro_admin/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@2x.png b/siro_admin/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@2x.png new file mode 100644 index 0000000..90534ed Binary files /dev/null and b/siro_admin/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@2x.png differ diff --git a/siro_admin/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@3x.png b/siro_admin/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@3x.png new file mode 100644 index 0000000..d529f18 Binary files /dev/null and b/siro_admin/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@3x.png differ diff --git a/siro_admin/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-50x50@1x.png b/siro_admin/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-50x50@1x.png new file mode 100644 index 0000000..c9fd50b Binary files /dev/null and b/siro_admin/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-50x50@1x.png differ diff --git a/siro_admin/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-50x50@2x.png b/siro_admin/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-50x50@2x.png new file mode 100644 index 0000000..6ee10e4 Binary files /dev/null and b/siro_admin/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-50x50@2x.png differ diff --git a/siro_admin/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-57x57@1x.png b/siro_admin/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-57x57@1x.png new file mode 100644 index 0000000..ae13bae Binary files /dev/null and b/siro_admin/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-57x57@1x.png differ diff --git a/siro_admin/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-57x57@2x.png b/siro_admin/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-57x57@2x.png new file mode 100644 index 0000000..314886e Binary files /dev/null and b/siro_admin/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-57x57@2x.png differ diff --git a/siro_admin/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@2x.png b/siro_admin/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@2x.png new file mode 100644 index 0000000..d529f18 Binary files /dev/null and b/siro_admin/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@2x.png differ diff --git a/siro_admin/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@3x.png b/siro_admin/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@3x.png new file mode 100644 index 0000000..95e83cd Binary files /dev/null and b/siro_admin/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@3x.png differ diff --git a/siro_admin/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-72x72@1x.png b/siro_admin/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-72x72@1x.png new file mode 100644 index 0000000..058ff77 Binary files /dev/null and b/siro_admin/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-72x72@1x.png differ diff --git a/siro_admin/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-72x72@2x.png b/siro_admin/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-72x72@2x.png new file mode 100644 index 0000000..623ed7d Binary files /dev/null and b/siro_admin/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-72x72@2x.png differ diff --git a/siro_admin/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-76x76@1x.png b/siro_admin/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-76x76@1x.png new file mode 100644 index 0000000..ee6b90a Binary files /dev/null and b/siro_admin/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-76x76@1x.png differ diff --git a/siro_admin/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-76x76@2x.png b/siro_admin/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-76x76@2x.png new file mode 100644 index 0000000..30195ba Binary files /dev/null and b/siro_admin/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-76x76@2x.png differ diff --git a/siro_admin/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-83.5x83.5@2x.png b/siro_admin/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-83.5x83.5@2x.png new file mode 100644 index 0000000..206dd46 Binary files /dev/null and b/siro_admin/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-83.5x83.5@2x.png differ diff --git a/siro_admin/ios/Runner/Assets.xcassets/LaunchImage.imageset/Contents.json b/siro_admin/ios/Runner/Assets.xcassets/LaunchImage.imageset/Contents.json new file mode 100644 index 0000000..0bedcf2 --- /dev/null +++ b/siro_admin/ios/Runner/Assets.xcassets/LaunchImage.imageset/Contents.json @@ -0,0 +1,23 @@ +{ + "images" : [ + { + "idiom" : "universal", + "filename" : "LaunchImage.png", + "scale" : "1x" + }, + { + "idiom" : "universal", + "filename" : "LaunchImage@2x.png", + "scale" : "2x" + }, + { + "idiom" : "universal", + "filename" : "LaunchImage@3x.png", + "scale" : "3x" + } + ], + "info" : { + "version" : 1, + "author" : "xcode" + } +} diff --git a/siro_admin/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage.png b/siro_admin/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage.png new file mode 100644 index 0000000..9da19ea Binary files /dev/null and b/siro_admin/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage.png differ diff --git a/siro_admin/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage@2x.png b/siro_admin/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage@2x.png new file mode 100644 index 0000000..9da19ea Binary files /dev/null and b/siro_admin/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage@2x.png differ diff --git a/siro_admin/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage@3x.png b/siro_admin/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage@3x.png new file mode 100644 index 0000000..9da19ea Binary files /dev/null and b/siro_admin/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage@3x.png differ diff --git a/siro_admin/ios/Runner/Assets.xcassets/LaunchImage.imageset/README.md b/siro_admin/ios/Runner/Assets.xcassets/LaunchImage.imageset/README.md new file mode 100644 index 0000000..89c2725 --- /dev/null +++ b/siro_admin/ios/Runner/Assets.xcassets/LaunchImage.imageset/README.md @@ -0,0 +1,5 @@ +# Launch Screen Assets + +You can customize the launch screen with your own desired assets by replacing the image files in this directory. + +You can also do it by opening your Flutter project's Xcode project with `open ios/Runner.xcworkspace`, selecting `Runner/Assets.xcassets` in the Project Navigator and dropping in the desired images. \ No newline at end of file diff --git a/siro_admin/ios/Runner/Base.lproj/LaunchScreen.storyboard b/siro_admin/ios/Runner/Base.lproj/LaunchScreen.storyboard new file mode 100644 index 0000000..f2e259c --- /dev/null +++ b/siro_admin/ios/Runner/Base.lproj/LaunchScreen.storyboard @@ -0,0 +1,37 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/siro_admin/ios/Runner/Base.lproj/Main.storyboard b/siro_admin/ios/Runner/Base.lproj/Main.storyboard new file mode 100644 index 0000000..f3c2851 --- /dev/null +++ b/siro_admin/ios/Runner/Base.lproj/Main.storyboard @@ -0,0 +1,26 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/siro_admin/ios/Runner/GoogleService-Info.plist b/siro_admin/ios/Runner/GoogleService-Info.plist new file mode 100644 index 0000000..b1be793 --- /dev/null +++ b/siro_admin/ios/Runner/GoogleService-Info.plist @@ -0,0 +1,30 @@ + + + + + API_KEY + AIzaSyDk6x6KZUY0IQtxoCMXX0F7N_yik8O19eA + GCM_SENDER_ID + 825988584191 + PLIST_VERSION + 1 + BUNDLE_ID + com.siro.admin + PROJECT_ID + siro-a6957 + STORAGE_BUCKET + siro-a6957.firebasestorage.app + IS_ADS_ENABLED + + IS_ANALYTICS_ENABLED + + IS_APPINVITE_ENABLED + + IS_GCM_ENABLED + + IS_SIGNIN_ENABLED + + GOOGLE_APP_ID + 1:825988584191:ios:8426fcf68fcc470e1632ca + + \ No newline at end of file diff --git a/siro_admin/ios/Runner/Info.plist b/siro_admin/ios/Runner/Info.plist new file mode 100644 index 0000000..263f6c7 --- /dev/null +++ b/siro_admin/ios/Runner/Info.plist @@ -0,0 +1,57 @@ + + + + + NSLocalNetworkUsageDescription + نحتاج إلى الوصول إلى الشبكة المحلية لاكتشاف الأجهزة القريبة. + + NSBonjourServices + + _http._tcp + _https._tcp + + CFBundleDevelopmentRegion + $(DEVELOPMENT_LANGUAGE) + CFBundleDisplayName + Siro Admin + CFBundleExecutable + $(EXECUTABLE_NAME) + CFBundleIdentifier + $(PRODUCT_BUNDLE_IDENTIFIER) + CFBundleInfoDictionaryVersion + 6.0 + CFBundleName + siro_admin + CFBundlePackageType + APPL + CFBundleShortVersionString + $(FLUTTER_BUILD_NAME) + CFBundleSignature + ???? + CFBundleVersion + $(FLUTTER_BUILD_NUMBER) + LSRequiresIPhoneOS + + UILaunchStoryboardName + LaunchScreen + UIMainStoryboardFile + Main + UISupportedInterfaceOrientations + + UIInterfaceOrientationPortrait + UIInterfaceOrientationLandscapeLeft + UIInterfaceOrientationLandscapeRight + + UISupportedInterfaceOrientations~ipad + + UIInterfaceOrientationPortrait + UIInterfaceOrientationPortraitUpsideDown + UIInterfaceOrientationLandscapeLeft + UIInterfaceOrientationLandscapeRight + + CADisableMinimumFrameDurationOnPhone + + UIApplicationSupportsIndirectInputEvents + + + \ No newline at end of file diff --git a/siro_admin/ios/Runner/Runner-Bridging-Header.h b/siro_admin/ios/Runner/Runner-Bridging-Header.h new file mode 100644 index 0000000..308a2a5 --- /dev/null +++ b/siro_admin/ios/Runner/Runner-Bridging-Header.h @@ -0,0 +1 @@ +#import "GeneratedPluginRegistrant.h" diff --git a/siro_admin/ios/Runner/Runner.entitlements b/siro_admin/ios/Runner/Runner.entitlements new file mode 100644 index 0000000..903def2 --- /dev/null +++ b/siro_admin/ios/Runner/Runner.entitlements @@ -0,0 +1,8 @@ + + + + + aps-environment + development + + diff --git a/siro_admin/ios/RunnerTests/RunnerTests.swift b/siro_admin/ios/RunnerTests/RunnerTests.swift new file mode 100644 index 0000000..86a7c3b --- /dev/null +++ b/siro_admin/ios/RunnerTests/RunnerTests.swift @@ -0,0 +1,12 @@ +import Flutter +import UIKit +import XCTest + +class RunnerTests: XCTestCase { + + func testExample() { + // If you add code to the Runner application, consider adding tests here. + // See https://developer.apple.com/documentation/xctest for more information about using XCTest. + } + +} diff --git a/siro_admin/lib/binding/initial_binding.dart b/siro_admin/lib/binding/initial_binding.dart new file mode 100644 index 0000000..551c451 --- /dev/null +++ b/siro_admin/lib/binding/initial_binding.dart @@ -0,0 +1,9 @@ +import 'package:get/get.dart'; +import '../controller/admin/dashboard_controller.dart'; + +class InitialBinding extends Bindings { + @override + void dependencies() { + Get.put(DashboardController(), permanent: true); + } +} diff --git a/siro_admin/lib/constant/api_key.dart b/siro_admin/lib/constant/api_key.dart new file mode 100644 index 0000000..ede9320 --- /dev/null +++ b/siro_admin/lib/constant/api_key.dart @@ -0,0 +1,72 @@ +import 'package:secure_string_operations/secure_string_operations.dart'; + +import '../env/env.dart'; +import 'char_map.dart'; + +class AK { + static final String allowed = Env.allowed; + static final String passnpassenger = X + .r(X.r(X.r(Env.passnpassenger, cn), cC), cs) + .toString() + .split(Env.addd)[0]; + static final String newId = Env.newId; + + static final String secretKey = X.r(X.r(X.r(Env.secretKey, cn), cC), cs); + static final String basicAuthCredentials = + X.r(X.r(X.r(Env.basicAuthCredentials, cn), cC), cs); + static final String accountSIDTwillo = + X.r(X.r(X.r(Env.accountSIDTwillo, cn), cC), cs); + static final String serverAPI = X.r(X.r(X.r(Env.serverAPI, cn), cC), cs); + static final String mapAPIKEY = X.r(X.r(X.r(Env.mapAPIKEY, cn), cC), cs); + static final String twilloRecoveryCode = + X.r(X.r(X.r(Env.twilloRecoveryCode, cn), cC), cs); + static final String authTokenTwillo = + X.r(X.r(X.r(Env.authTokenTwillo, cn), cC), cs); + static final String chatGPTkey = X.r(X.r(X.r(Env.chatGPTkey, cn), cC), cs); + static final String transactionCloude = + X.r(X.r(X.r(Env.transactionCloude, cn), cC), cs); + static final String visionApi = X.r(X.r(X.r(Env.visionApi, cn), cC), cs); + static final String chatGPTkeySefer = + X.r(X.r(X.r(Env.chatGPTkeySefer, cn), cC), cs); + static final String chatGPTkeySeferNew = + X.r(X.r(X.r(Env.chatGPTkeySeferNew, cn), cC), cs); + static final String serverPHP = Env.serverPHP; + static final String llamaKey = X.r(X.r(X.r(Env.llamaKey, cn), cC), cs); + static final String cohere = X.r(X.r(X.r(Env.cohere, cn), cC), cs); + static final String claudeAiAPI = X.r(X.r(X.r(Env.claudeAiAPI, cn), cC), cs); + + static final String geminiApi = X.r(X.r(X.r(Env.geminiApi, cn), cC), cs); + static final String agoraAppId = X.r(X.r(X.r(Env.agoraAppId, cn), cC), cs); + static final String agoraAppCertificate = + X.r(X.r(X.r(Env.agoraAppCertificate, cn), cC), cs); + + static final String integrationIdPayMob = + X.r(X.r(X.r(Env.integrationIdPayMob, cn), cC), cs); + static final String passwordPayMob = + X.r(X.r(X.r(Env.passwordPayMob, cn), cC), cs); + static final String usernamePayMob = + X.r(X.r(X.r(Env.usernamePayMob, cn), cC), cs); + static final String payMobApikey = + X.r(X.r(X.r(Env.payMobApikey, cn), cC), cs); + static final String integrationIdPayMobWallet = + X.r(X.r(X.r(Env.integrationIdPayMobWallet, cn), cC), cs); + static final String smsPasswordEgypt = + X.r(X.r(X.r(Env.smsPasswordEgypt, cn), cC), cs); + static final String ocpApimSubscriptionKey = Env.ocpApimSubscriptionKey; + static final String chatGPTkeySeferNew4 = + X.r(X.r(X.r(Env.chatGPTkeySeferNew4, cn), cC), cs); + static final String anthropicAIkeySeferNew = + X.r(X.r(X.r(Env.anthropicAIkeySeferNew, cn), cC), cs); + static final String llama3Key = X.r(X.r(X.r(Env.llama3Key, cn), cC), cs); + static final String payMobOutClientSecrret = + X.r(X.r(X.r(Env.payMobOutClientSecrret, cn), cC), cs); + static final String payMobOutClient_id = + X.r(X.r(X.r(Env.payMobOutClient_id, cn), cC), cs); + static final String payMobOutPassword = + X.r(X.r(X.r(Env.payMobOutPassword, cn), cC), cs); + static final String payMobOutUserName = + X.r(X.r(X.r(Env.payMobOutUserName, cn), cC), cs); + +/////////// + static final String keyOfApp = X.r(X.r(X.r(Env.keyOfApp, cn), cC), cs); +} diff --git a/siro_admin/lib/constant/box_name.dart b/siro_admin/lib/constant/box_name.dart new file mode 100644 index 0000000..8e5f75a --- /dev/null +++ b/siro_admin/lib/constant/box_name.dart @@ -0,0 +1,84 @@ +class BoxName { + static const String driverID = "driverID"; + static const String countryCode = "countryCode"; + static const String googlaMapApp = "googlaMapApp"; + + static const String lang = "lang"; + static const String carType = "carType"; + static const String carPlate = "carPlate"; + static const String statusDriverLocation = "statusDriverLocation"; + static const String password = "password"; + static const String keyOfApp = 'keyOfApp'; + static const String initializationVector = 'initializationVector'; + static const String firstTimeLoadKey = 'firstTimeLoadKey'; + static const String jwt = "jwt"; + static const String phoneVerified = "phoneVerified"; + static const String adminPhone = "adminPhone"; + static const String hmac = "hmac"; + static const String fingerPrint = "fingerPrint"; + static const String payMobApikey = "payMobApikey"; + static const String refreshToken = "refreshToken"; + static const String arrivalTime = "arrivalTime"; + static const String passwordDriver = "passwordDriver"; + static const String agreeTerms = "agreeTerms"; + static const String serverChosen = "serverChosen"; + static const String addWork = 'addWork'; + static const String addHome = 'addHome'; + static const String tipPercentage = 'tipPercentage'; + + static const String faceDetectTimes = "faceDetectTimes"; + static const String sosPhonePassenger = "sosPhonePassenger"; + static const String sosPhoneDriver = "sosPhoneDriver"; + static const String passengerID = "pasengerID"; + static const String phone = "phone"; + static const String phoneDriver = "phoneDriver"; + static const String dobDriver = "dobDriver"; + static const String sexDriver = "sexDriver"; + static const String lastNameDriver = "lastNameDriver"; + static const String name = "name"; + static const String nameDriver = "nameDriver"; + static const String driverPhotoUrl = "driverPhotoUrl"; + static const String email = "email"; + static const String emailDriver = "emailDriver"; + static const String tokens = "tokens"; + static const String tokensDrivers = "tokensDrivers"; + static const String tokensPassengers = "tokensPassengers"; + static const String tokenFCM = "tokenFCM"; + static const String tokenDriver = "tokenDriver"; + static const String cardNumber = "cardNumber"; + static const String cardNumberDriver = "cardNumberDriver"; + static const String cardHolderName = "cardHolderName"; + static const String cardHolderNameDriver = "cardHolderNameDriver"; + static const String expiryDate = "expiryDate"; + static const String expiryDateDriver = "expiryDateDriver"; + static const String cvvCode = "cvvCode"; + static const String cvvCodeDriver = "cvvCodeDriver"; + static const String passengerWalletDetails = "passengerWalletDetails"; + static const String passengerWalletTotal = "passengerWalletTotal"; + static const String passengerWalletFound = "passengerWalletFound"; + static const String periods = 'periods'; + static const String onBoarding = 'onBoarding'; + + static const String apiKeyRun = 'apiKeyRun'; + static const String serverAPI = 'serverAPI'; + static const String secretKey = 'secretKey'; + static const String basicAuthCredentials = 'basicAuthCredentials'; + static const String mapAPIKEY = 'mapAPIKEY'; + static const String twilloRecoveryCode = 'twilloRecoveryCode'; + static const String accountSIDTwillo = 'accountSIDTwillo'; + static const String authTokenTwillo = 'authTokenTwillo'; + static const String chatGPTkey = 'chatGPTkey'; + static const String chatGPTkeySefer = 'chatGPTkeySefer'; + static const String transactionCloude = 'transactionCloude'; + static const String visionApi = 'visionApi'; + static const String vin = "vin"; + static const String make = "make"; + static const String model = "model"; + static const String year = "year"; + static const String expirationDate = "expirationDate"; + static const String color = "color"; + static const String owner = "owner"; + static const String registrationDate = "registrationDate"; + static const String recentLocations = 'recentLocations'; + static const String tripData = 'tripData'; +} diff --git a/siro_admin/lib/constant/char_map.dart b/siro_admin/lib/constant/char_map.dart new file mode 100644 index 0000000..d6a6ee7 --- /dev/null +++ b/siro_admin/lib/constant/char_map.dart @@ -0,0 +1,68 @@ +Map cn = { + "0": "3", + "1": "7", + "2": "1", + "3": "9", + "4": "0", + "5": "5", + "6": "2", + "7": "6", + "8": "4", + "9": "8" +}; +Map cs = { + "a": "q", + "b": "x", + "c": "f", + "d": "y", + "e": "j", + "f": "u", + "g": "k", + "h": "w", + "i": "o", + "j": "e", + "k": "g", + "l": "r", + "m": "n", + "n": "b", + "o": "i", + "p": "v", + "q": "a", + "r": "l", + "s": "z", + "t": "c", + "u": "h", + "v": "p", + "w": "t", + "x": "d", + "y": "s", + "z": "m" +}; +Map cC = { + "A": "Q", + "B": "X", + "C": "F", + "D": "Y", + "E": "J", + "F": "U", + "G": "K", + "H": "W", + "I": "O", + "J": "E", + "K": "G", + "L": "R", + "M": "N", + "N": "B", + "O": "I", + "P": "V", + "Q": "A", + "R": "L", + "S": "Z", + "T": "C", + "U": "H", + "V": "P", + "W": "T", + "X": "D", + "Y": "S", + "Z": "M" +}; diff --git a/siro_admin/lib/constant/colors.dart b/siro_admin/lib/constant/colors.dart new file mode 100644 index 0000000..156772a --- /dev/null +++ b/siro_admin/lib/constant/colors.dart @@ -0,0 +1,44 @@ +import 'package:flutter/material.dart'; + +class AppColor { + // --- Core Design Tokens --- + + // Background & Surfaces + static const Color bg = Color(0xFF0A0A0B); + static const Color surface = Color(0xFF161618); + static const Color surfaceElevated = Color(0xFF222225); + static const Color surfaceGlass = Color(0xCC161618); + + // Accents & Branding + static const Color accent = Color(0xFF6366F1); // Indigo / Violet + static const Color accentSoft = Color(0x266366F1); // 15% Opacity + static const Color accentBorder = Color(0x4D6366F1); // 30% Opacity + static const Color glow = Color(0xFF818CF8); + + // Semantic / State Colors + static const Color danger = Color(0xFFEF4444); + static const Color dangerSoft = Color(0x26EF4444); + static const Color success = Color(0xFF10B981); + static const Color successSoft = Color(0x2610B981); + static const Color warning = Color(0xFFF59E0B); + static const Color info = Color(0xFF3B82F6); + + // Text & Content + static const Color textPrimary = Color(0xFFF3F4F6); + static const Color textSecondary = Color(0xFF9CA3AF); + static const Color textMuted = Color(0xFF6B7280); + + // UI Elements + static const Color divider = Color(0xFF2D2D30); + static const Color cardShadow = Color(0x66000000); + + // --- Legacy Mappings (for temporary compatibility) --- + static const Color primaryColor = bg; + static const Color secondaryColor = textPrimary; + static const Color accentColor = accent; + static const Color redColor = danger; + static const Color greenColor = success; + static const Color blueColor = info; + static const Color yellowColor = warning; + static const Color deepPurpleAccent = accent; // Map to accent +} diff --git a/siro_admin/lib/constant/credential.dart b/siro_admin/lib/constant/credential.dart new file mode 100644 index 0000000..d79d566 --- /dev/null +++ b/siro_admin/lib/constant/credential.dart @@ -0,0 +1,144 @@ +import 'dart:convert'; +import 'package:crypto/crypto.dart'; + +import '../controller/functions/crud.dart'; +import '../main.dart'; +import 'box_name.dart'; +import 'char_map.dart'; +import 'links.dart'; + +class AC { + gAK() async { + if (box.read(BoxName.apiKeyRun).toString() != 'run') { + var res = await CRUD().get(link: AppLink.getApiKey, payload: {}); + var decod = res is String ? jsonDecode(res) : res; + print(decod); + Map jsonData = {}; + for (var i = 0; i < decod['message'].length; i++) { + String h = decod['message'][i]['hashed_key'].toString(); + String retrievedString = r(r(r(h, cn), cC), cs); + + await storage.write( + key: decod['message'][i]['name'].toString(), + value: retrievedString.toString(), + ); + // + String name = decod['message'][i]['name'].toString(); + String value = decod['message'][i]['hashed_key'].toString(); + + jsonData[name] = value; + } + String jsonString = json.encode(jsonData); + print(jsonString); + box.write(BoxName.apiKeyRun, 'run'); + } + } + + String q(String b, String c) { + final d = utf8.encode(c); + final e = utf8.encode(b); + + final f = Hmac(sha256, d); + final g = f.convert(e); + + final h = g.bytes; + final i = base64Url.encode(h); + return i; + } + + String j(String k, String l) { + final m = utf8.encode(l); + final n = base64Url.decode(k); + + final o = Hmac(sha256, m); + final p = o.convert(n); + + final q = utf8.decode(p.bytes); + return q; + } + + String a(String b, String c) { + int d = b.length; + int e = d ~/ 4; + + List f = []; + for (int g = 0; g < d; g += e) { + int h = g + e; + if (h > d) { + h = d; + } + String i = b.substring(g, h); + f.add(i); + } + + print(f); + Map j = {}; + j['birinci'] = f[4]; + j['ikinci'] = f[2]; + j['üçüncü'] = c + f[1]; + j['dördüncü'] = f[0]; + j['beş'] = f[3]; + + String k = ''; + j.forEach((l, m) { + k += m; + }); + + return k; + } + + Map n(String o, String c) { + String p = o.replaceAll(c, ''); + + Map q = {}; + q['birinci'] = p[p.length - 5] + p[p.length - 3]; + q['ikinci'] = p[p.length - 1] + p[p.length - 15]; + q['üçüncü'] = p[p.length - 9] + p[p.length - 12]; + q['dördüncü'] = p[p.length - 11] + p[p.length - 6]; + q['beş'] = p[p.length - 2] + p[p.length - 8]; + + return q; + } + + String c(String a, Map b) { + StringBuffer c = StringBuffer(); + c.write(a); + + String d = "Bl"; + c.write(b[d] ?? d); + + StringBuffer e = StringBuffer(); + String f = c.toString(); + + for (int g = 0; g < f.length; g++) { + String h = f[g]; + e.write(b[h] ?? h); + } + + return e.toString(); + } + + String r(String a, Map b) { + StringBuffer c = StringBuffer(); + String d = "Bl"; + int e = d.length; + + for (int f = 0; f < a.length; f++) { + String g = a[f]; + String h = b.keys.firstWhere( + (i) => b[i] == g, + orElse: () => g, + ); + + c.write(h); + } + + String j = c.toString(); + + if (j.endsWith(d)) { + j = j.substring(0, j.length - e); + } + + return j; + } +} diff --git a/siro_admin/lib/constant/info.dart b/siro_admin/lib/constant/info.dart new file mode 100644 index 0000000..b1d2f97 --- /dev/null +++ b/siro_admin/lib/constant/info.dart @@ -0,0 +1,4471 @@ +class AppInformation { + static const String companyName = 'Mobile-App'; + static const String appName = 'SEFER'; + static const String phoneNumber = '962798583052'; + static const String linkedInProfile = + 'https://www.linkedin.com/in/hamza-ayed/'; + static const String website = 'https://mobile-app.store'; + static const String email = 'hamzaayed@mobile-app.store'; + static const String complaintPrompt = + 'for this data for complaint from driver or passenger i collect all data i want you analyze this complaint and show what is reason and what is solution .this data collected from many table to find solution if payment in visa not complete and if ride status is finished it will be paymnet in payment table if ride status is not finished there is no need to pay and payment table is null for this ride and if paymentFromPaymentTable not null and visa type not cash the payment sucssessed . if ratingpassenger is low or passengr rating drivers low grade then dont mine of this passenger ,look at driver too like passengerratingdriver with rating or ratingtopassenger .in json add status of complaint and message to passenger and message to driver and message to call center write in arabic in json output with key in english .for output please just json i want'; + static const String addd = 'BlBlNl'; + + static const String privacyPolicy = ''' + + + + + + + + + + + + +
+
+
+
+
+
+

Terms and Conditions

+

1 TERMS OF USE

+

By downloading, browsing, accessing or using the Mobile Application; “Sefer”, Users agree to be bound by these Terms and Conditions of Use. We reserve the right to amend these terms and conditions at any time. If the User disagrees with any of these Terms and Conditions of Use, the User must immediately discontinue their access to the Mobile Application and their use of the services offered on the Mobile Application. Continued use of the Mobile Application will constitute acceptance of these Terms and Conditions of Use, as may be amended from time to time.

+

2.1. DEFINITIONS

+

In these Terms and Conditions of Use, the following capitalized terms shall have the following meanings, except where the context otherwise requires:

+

“Mobile Application” or “Sefer” refers to the smartphone software through which the company mediates services between Users and Service Providers.

+

"Account" means an account created by a User or a Service Provider on the Mobile Application as part of Registration.

+

“Service Providers” refers to the individuals or companies registered within the Company to provide products or services approved and mediated by the Company/Mobile Application and that are requested/purchased by “Users”. “Service Provider” means any one of them.

+

"Users" means users of the Mobile Application, including you and "User" means any one of them. “Users” also includes Service Providers using the Mobile Application version dedicated to the use of Service Providers.

+

"Privacy Policy" means the privacy policy set out in Clause 14 of these Terms and Conditions of Use.

+

"Redeem" means to redeem a company’s products or services on these Terms and Conditions of Use and

+

"Redemption" means the act of redeeming such products or services.

+

"Register" means to create an Account on the Mobile Application and "Registration" means the act of creating such an Account.

+

"Services" means all the services provided by Service Providers via the Mobile Application and mediated by the Company to Users, and "Service" means any one of them.

+

2.2. WHAT IS THE MOBILE APPLICATION, “Sefer”?

+

The “Sefer” Mobile Application consists in a specialize service with the purpose to schedule/match the Service Provider with the User, however without creating any employee relationship with the Service Provider, meaning that the Mobile Application should be considered only as a service mediator with the purpose of scheduling/matching between Users and Service Providers for the latter to fulfill the service requested by Users. Through the system, the Company allows, totally free of charge, the Users to sign up and request the desired available services from Service Providers in a more efficient way than the conventional existing methods. The Service Providers, by their means, can register on the Mobile Application dedicated for Service Providers through the methods indicated by the Company, pending an evaluation from the Company and the necessary documentation when signing up in accordance with guidelines set by the Transportation General Authority (TGA) to provide services through the Mobile Application. The Service Provider will pay a profit margin fee determined by the Company -in knowledge of the Service Provider- per completed service. Users can pay their ride fare using Apple Pay as an additional payment method in Saudi Arabia on iPhones

+

+

3. GENERAL ISSUES ABOUT THE MOBILE APPLICATION AND THE SERVICES

+

3.1 Applicability of terms and conditions: The use of any Services and/or the Mobile Application and the making of any Redemptions are subject to these Terms and Conditions of Use.

+

3.2 Location: The Mobile Application, the Services and any Redemptions are intended solely for use by Users who access the Mobile Application where it operates and provides its services regionally. We make no representation that the Services (or any goods or services) are available or otherwise suitable for use outside of the regions indicated by the Company. Notwithstanding the above, if the User accesses the Mobile Application, use the Services or make any Redemptions from locations outside the regions indicated by the Service Provider, the User does so on their own initiative and are responsible for the consequences and for compliance with all applicable laws.

+

3.3 Scope: The Mobile Application, the Services and any Redemptions are for Users’ non-commercial, personal use only and must not be used for business purposes unless an official written permission is granted by the Company.

+

3.4 Prevention on use: We reserve the right to prevent the User using the Mobile Application and the Service (or any part of them) and to prevent the User from making any Redemptions.

+

3.5 Equipment and Networks: The provision of the Services and the Mobile Application does not include the provision of a mobile telephone or handheld device or other necessary equipment to access the Mobile Application or the Services or make any Redemptions. To use the Mobile Application or Services or to make Redemptions, the User will require Internet connectivity and appropriate telecommunication links. The User acknowledges that the terms of agreement with their respective mobile network provider will continue to apply when using the Mobile Application. As a result, the User may be charged by the Mobile Provider for access to network connection services for the duration of the connection while accessing the Mobile Application or any such third party charges as may arise. The User accepts responsibility for any such charges that arise.

+

3.6 Permission to use Mobile Application: If the User is not the bill payer for the mobile telephone or handheld device being used to access the Mobile Application, the User will be assumed to have received permission from the bill payer for using the Mobile Application.

+

3.7 License to Use Material: By submitting any text or images (including photographs) via the Application, the User represents that they are the owner of the Material, or have proper authorization from the owner of the Material to use, reproduce and distribute it. The User hereby grants us a worldwide, royalty-free, non-exclusive license to use the Material to promote any products or services.

+

4. REDEMPTIONS

+

4.1 Need for registration: a) Users must Register to make a Redemption from the Mobile Application. b) The Service Provider agrees that by registering they will be scrutinized to be accepted by the Company who may refuse or cancel the Service Provider account at any time, whether by complaints or by internal policy.

+

4.2 Application of these Terms and Conditions of Use: By making any Redemption, the User acknowledges that the Redemption is subject to these Terms and Conditions of Use.

+

4.3 Redemption: Any attempted Redemption not consistent with these Terms and Conditions of Use may be disallowed or rendered void at our or the relevant Service Provider’s discretion.

+

4.4 Responsibility for Redemptions of perishable products of services: Each Service Provider shall be responsible to ensure that any of its products or services for Redemption that are perishable has not expired.

+

4.5 Restrictions: (a) Reproduction, sale, resale or trading of any products or services or Redeemed products is prohibited. (b) If any product or service is Redeemed for less than its face value, there is no entitlement to a credit, cash or Sample equal to the difference between the face value and the amount Redeemed. (c) Redemption of products or services is subject to availability of the relevant Service Providers’ stocks.

+

4.6 Company Not Liable: For the avoidance of doubt, the Company shall not be liable for any losses or damages suffered by Users resulting from a failure by the relevant Service Provider to fulfil any Redemptions in accordance with Clause 4.4 or for a failure by us to deliver any products or services to Users due to the unavailability of such products or services pursuant to Clause 4.5(c). Users accept that the Mobile Application acts solely as a scheduling/matching service between its Users and Service Providers, and that it is not responsible for any issues that arise, including but not limited to accidents, delays, car discomfort, and unavailability of products or services.

+

4.7 Lost/stolen services: Neither we nor any Service Provider shall be responsible for lost or stolen Samples or products that have been Redeemed.

+

+

5. LOCATION ALERTS AND NOTIFICATIONS

+

5.1 The USer agrees to receive pre-programmed notifications (“Location Alerts”) on the Mobile Application from Service Providers if the User has turned on locational services on their mobile telephone or other handheld devices (as the case may be).

+

+

6. USERS’ OBLIGATIONS

+

6.1 Service Provider terms: Users agree to (and shall) abide by the terms and conditions of the relevant Service Provider for which their Redemption relates to, as may be amended from time to time.

+

6.2 Accurate information: The User warrants that all information provided on Registration and contained as part of their Account is true, complete and accurate and that the User will promptly inform us of any changes to such information by updating the information in their Account.

+

6.3 Content on the Mobile Application and Service: It is the User’s responsibility to ensure that any products, services or information available through the Mobile Application or the Services meet their specific requirements before making any Redemption.

+

6.4 Prohibitions in relation to usage of Services or Mobile Application: Without limitation, the User undertakes not to use or permit anyone else to use the Services or Mobile Application:-

+

6.4.1 to send or receive any material which is not civil or tasteful

+

6.4.2 to send or receive any material which is threatening, grossly offensive, of an indecent, obscene or menacing character, blasphemous or defamatory of any person, in contempt of court or in breach of confidence, copyright, rights of personality, publicity or privacy or any other third party rights;

+

6.4.3 to send or receive any material for which the User has not obtained all necessary licenses and/or approvals (from us or third parties); or which constitutes or encourages conduct that would be considered a criminal offence, give rise to civil liability, or otherwise be contrary to the law of or infringe the rights of any third party in any country in the world;

+

6.4.4 to send or receive any material which is technically harmful (including computer viruses, logic bombs, Trojan horses, worms, harmful components, corrupted data or other malicious software or harmful data);

+

6.4.5 to cause annoyance, inconvenience or needless anxiety;

+

6.4.6 to intercept or attempt to intercept any communications transmitted by way of a telecommunications system;

+

6.4.7 for a purpose other than which we have designed them or intended them to be used;

+

6.4.8 for any fraudulent purpose;

+

6.4.9 other than in conformance with accepted Internet practices and practices of any connected networks;

+

6.4.10 in any way which is calculated to incite hatred against any ethnic, religious or any other minority or is otherwise calculated to adversely affect any individual, group or entity; or

+

6.4.11 in such a way as to, or commit any act that would or does, impose an unreasonable or disproportionately large load on our infrastructure.

+

6.5 Prohibitions in relation to usage of Services, Mobile Application: Without limitation, the User further undertakes not to or permit anyone else to:-

+

6.5.1 resell any products or services;

+

6.5.2 furnish false data including false names, addresses and contact details and fraudulently use credit/debit card numbers;

+

6.5.3 attempt to circumvent our security or network including to access data not intended for the User, log into a server or account the User is not expressly authorized to access, or probe the security of other networks (such as running a port scan);

+

6.5.4 execute any form of network monitoring which will intercept data not intended for the User;

+

6.5.5 enter into fraudulent interactions or transactions with us or a Service Provider (including interacting or transacting purportedly on behalf of a third party where the User has no authority to bind that third party or the User is pretending to be a third party);

+

6.5.6 extract data from or hack into the Mobile Application;

+

6.5.7 use the Services or Mobile Application in breach of these Terms and Conditions of Use;

+

6.5.8 engage in any unlawful activity in connection with the use of the Mobile Application or the Services; or

+

6.5.9 engage in any conduct which, in our exclusive reasonable opinion, restricts or inhibits any other customer from properly using or enjoying the Mobile Application or Services.

+

+

7. RULES ABOUT USE OF THE SERVICE AND THE MOBILE APPLICATION

+

7.1 We will use reasonable endeavors to correct any errors or omissions as soon as practicable after being notified of them. However, we do not guarantee that the Services or the Mobile Application will be free of faults, and we do not accept liability for any such faults, errors or omissions. In the event of any such error, fault or omission, Users should report it by contacting us at JORDAN: 962798583052 .

+

7.2 We do not warrant that Users’ use of the Services or the Mobile Application will be uninterrupted and we do not warrant that any information (or messages) transmitted via the Services or the Mobile Application will be transmitted accurately, reliably, in a timely manner or at all. Notwithstanding that we will try to allow uninterrupted access to the Services and the Mobile Application, access to the Services and the Mobile Application may be suspended, restricted or terminated at any time.

+

7.3 We do not give any warranty that the Services and the Mobile Application are free from viruses or anything else which may have a harmful effect on any technology.

+

7.4 We reserve the right to change, modify, substitute, suspend or remove without notice any information or Services on the Mobile Application from time to time. Users’ access to the Mobile Application and/or the Services may also be occasionally restricted to allow for repairs, maintenance or the introduction of new facilities or services. We will attempt to restore such access as soon as we reasonably can. For the avoidance of doubt, we reserve the right to withdraw any information or Services from the Mobile Application at any time.

+

7.5 We reserve the right to block access to and/or to edit or remove any material which in our reasonable opinion may give rise to a breach of these Terms and Conditions of Use.

+

7.6 The acceptance and denial of the service request may occur at first by the Service Provider, who can accept or deny the service when receiving a notification for a request. The User may cancel the contract for any reason which may or may not apply cancellation fees for which the conditions and amount is determined and communicated by the Company. Both recognize that “Sefer” is not liable for any delays, cancellations, failure to cancel the contract and miscommunication between the User and the Service Provider, nor for any delay or failure in the delivery of services from the Service Provider.

+

+

8. SUSPENSION AND TERMINATION

+

8.1 If the User uses (or others, with the User’s permission use) the Mobile Application, any Services in contravention of these Terms and Conditions of Use, we may suspend their use of the Services and/or Mobile Application.

+

8.2 If we suspend the Services or Mobile Application, we may refuse to restore the Services or Mobile Application for the User’s use until we receive an assurance from them, in a form we deem acceptable, that there will be no further breach of the provisions of these Terms and Conditions of Use.

+

8.3 The Company shall fully co-operate with any law enforcement authorities or court order requesting or directing the Company to disclose the identity or locate anyone in breach of these Terms and Conditions of Use.

+

8.4 Without limitation to anything else in this Clause 8, we shall be entitled immediately or at any time (in whole or in part) to: (a) suspend the Services and/or Mobile Application; (b) suspend Users’ use of the Services and/or Mobile Application; and/or (c) suspend the use of the Services and/or Mobile Application for persons we believe to be connected (in whatever manner) to the concerned User, if:

+

8.4.1 the User commits any breach of these Terms and Conditions of Use;

+

8.4.2 we suspect, on reasonable grounds, that the User has, might or will commit a breach of these Terms and Conditions of Use; or

+

8.4.3 we suspect, on reasonable grounds, that the User may have committed or will be committing any fraud against us or any person.

+

8.5 Our rights under this Clause 8 shall not prejudice any other right or remedy we may have in respect of any breach or any rights, obligations or liabilities accrued prior to termination.

+

+

9. DISCLAIMER AND EXCLUSION OF LIABILITY

+

9.1 The Mobile Application, the Services, the information on the Mobile Application and use of all related facilities are provided on an "as is, as available" basis without any warranties whether express or implied.

+

9.2 The credit balance shall remain valid for the specific period. The credit in the wallet will be expired after 6 months of inactivity.

+

9.3 To the fullest extent permitted by applicable law, we disclaim all representations and warranties relating to the Mobile Application and its contents, including in relation to any inaccuracies or omissions in the Mobile Application, warranties of merchantability, quality, fitness for a particular purpose, accuracy, availability, non-infringement or implied warranties from course of dealing or usage of trade.

+

9.4 We do not warrant that the Mobile Application will always be accessible, uninterrupted, timely, secure, error free or free from computer virus or other invasive or damaging code or that the Mobile Application will not be affected by any acts of nature or other force majeure events, including inability to obtain or shortage of necessary materials, equipment facilities, power or telecommunications, lack of telecommunications equipment or facilities and failure of information technology or telecommunications equipment or facilities.

+

9.5 While we may use reasonable efforts to include accurate and up-to-date information on the Mobile Application, we make no warranties or representations as to its accuracy, timeliness or completeness.

+

9.6 We shall not be liable for any acts or omissions of any third parties howsoever caused, and for any direct, indirect, incidental, special, consequential or punitive damages, howsoever caused, resulting from or in connection with the Mobile Application and the services offered in the mobile application, Users’ access to, use of or inability to use the mobile application or the services offered in the mobile application, reliance on or downloading from the mobile application and/or services, or any delays, inaccuracies in the information or in its transmission including but not limited to damages for loss of business or profits, use, data or other intangible, even if we have been advised of the possibility of such damages.

+

9.7 We shall not be liable in contract, tort (including negligence or breach of statutory duty) or otherwise howsoever and whatever the cause thereof, for any indirect, consequential, collateral, special or incidental loss or damage suffered or incurred by the User in connection with the Mobile Application and these Terms and Conditions of Use. For the purposes of these Terms and Conditions of Use, indirect or consequential loss or damage includes, without limitation, loss of revenue, profits, anticipated savings or business, loss of data or goodwill, loss of use or value of any equipment including software, claims of third parties, and all associated and incidental costs and expenses.

+

9.8 The above exclusions and limitations apply only to the extent permitted by law. None of the User’s statutory rights as a consumer that cannot be excluded or limited are affected.

+

9.9 Notwithstanding our efforts to ensure that our system is secure, the User acknowledges that all electronic data transfers are potentially susceptible to interception by others. We cannot, and do not, warrant that data transfers pursuant to the Mobile Application, or electronic mail transmitted to and from us, will not be monitored or read by others.

+

+

10. INDEMNITY

+

The User agrees to indemnify and keep us indemnified against any claim, action, suit or proceeding brought or threatened to be brought against us which is caused by or arising out of (a) the User’s use of the Services, (b) any other party’s use of the Services using the User’s user ID, verification PIN and/or any identifier number allocated by the Company, and/or (c) the User’s breach of any of these Terms and Conditions of Use, and to pay us damages, costs and interest in connection with such claim, action, suit or proceeding.

+

+

11. INTELLECTUAL PROPERTY RIGHTS

+

11.1 All editorial content, information, photographs, illustrations, artwork and other graphic materials, and names, logos and trade marks on the Mobile Application are protected by copyright laws and/or other laws and/or international treaties, and belong to us and/or our suppliers, as the case may be. These works, logos, graphics, sounds or images may not be copied, reproduced, retransmitted, distributed, disseminated, sold, published, broadcasted or circulated whether in whole or in part, unless expressly permitted by us and/or our suppliers, as the case may be.

+

11.2 Nothing contained on the Mobile Application should be construed as granting by implication, estoppel, or otherwise, any license or right to use any trademark displayed on the Mobile Application without our written permission. Misuse of any trademarks or any other content displayed on the Mobile Application is prohibited.

+

11.3 We will not hesitate to take legal action against any unauthorized usage of our trade marks, name or symbols to preserve and protect its rights in the matter. All rights not expressly granted herein are reserved. Other product and company names mentioned herein may also be the trademarks of their respective owners.

+

+

12. AMENDMENTS

+

12.1 We may periodically make changes to the contents of the Mobile Application, including to the descriptions and prices of goods and services advertised, at any time and without notice. We assume no liability or responsibility for any errors or omissions in the content of the Mobile Application.

+

12.2 We reserve the right to amend these Terms and Conditions of Use from time to time without notice. The revised Terms and Conditions of Use will be posted on the Mobile Application and shall take effect from the date of such posting. The User is advised to review these terms and conditions periodically as they are binding upon the User.

+

+

13. APPLICABLE LAW AND JURISDICTION

+

13.1 These Terms and Conditions of Use shall be governed by and construed in accordance with the applicable Federal laws of Kingdom of Saudi Arabia.

+

13.2 The Mobile Application can be accessed from all countries around the world where the local technology permits. As each of these places have differing laws, by accessing the Mobile Application both the User and we agree that the laws of the country where accessed, without regard to the conflicts of laws principles thereof, will apply to all matters relating to the use of the Mobile Application.

+

13.3 the User accepts and agrees that both the User and we shall submit to the exclusive jurisdiction of the courts of the country where accessed in respect of any dispute arising out of and/or in connection with these Terms and Conditions of Use.

+

+

14. PRIVACY POLICY

+

14.1 Access to the Mobile Application and use of the Services offered on the Mobile Application by the Company and/or its group of companies & partners is subject to this Privacy Policy. By accessing the Mobile Application and by continuing to use the Services offered, Users are deemed to have accepted this Privacy Policy, and in particular, they are deemed to have consented to our use and disclosure of their personal information in the manner prescribed in this Privacy Policy and for the purposes set out in Clauses 3.7 and/or 4.1.1 We reserve the right to amend this Privacy Policy from time to time. If the User disagrees with any part of this Privacy Policy, the User must immediately discontinue their access to the Mobile Application and their use of the Services.

+

14.2 As part of the normal operation of our Services, we collect, use and, in some cases, disclose information about the User to third parties. Accordingly, we have developed this Privacy Policy in order for Users to understand how we collect, use, communicate and disclose and make use of their personal information when they use the Services on the Mobile Application:-

+

(a) Before or at the time of collecting personal information, we will identify the purposes for which information is being collected.

+

(b) We will collect and use of personal information solely with the objective of fulfilling those purposes specified by us and for other compatible purposes, unless we obtain the consent of the individual concerned or as required by law.

+

(c) We will only retain personal information as long as necessary for the fulfillment of those purposes.

+

(d) We will collect personal information by lawful and fair means and, where appropriate, with the knowledge or consent of the individual concerned.

+

(e) Personal information should be relevant to the purposes for which it is to be used, and, to the extent necessary for those purposes, should be accurate, complete, and up-to-date.

+

(f) We will protect personal information by reasonable security safeguards against loss or theft, as well as unauthorized access, disclosure, copying, use or modification.

+

(g) The Company further reserves the right to use all legal means possible and to identify the Users, as well as to request, at any time, additional data and documents it considers appropriate in order to verify personal data informed by the user.

+

We are committed to conducting our business in accordance with these principles in order to ensure that the confidentiality of personal information is protected and maintained.

+

14.3 Social logins policy
Our Services offers you the ability to register and login using Facebook. Where you choose to do this, we will receive certain profile information about you from your social media provider. The profile Information may include your name and social token.
We will use the information we receive only to associate your social token with your Sefer account or for the purposes that are described in this privacy policy.

14.4 Account and data deletion
Based on the applicable laws of your country, you may have the right to request the deletion of your personal data in some circumstances. If you want to delete your account or personal data in the application, please contact us via e-mail: support@mobile-app.store. We will respond to your request within 30 days.

+

15. In-Ride Policy

+

15.1 Smoking Policy:

+

No smoking or other use of tobacco products (including, but not limited to, cigarettes, pipes, cigars, snuff, or chewing tobacco) is permitted during rides. No cigarette butts or other traces of smell, litter, or tobacco use should be present in the vehicle. image

+

15.2 COVID-19 Policy: Face masks must be always worn during rides.

+
+
+
+
+
+
+ + + + + +
+
+ + + + +
+

+ All rights reserved. Fast Global Technology Holding Limited. © 2022 +

+
+
+ +
+ + + + +
+ + + + + + +
+ +'''; +} diff --git a/siro_admin/lib/constant/links.dart b/siro_admin/lib/constant/links.dart new file mode 100644 index 0000000..d3f52e1 --- /dev/null +++ b/siro_admin/lib/constant/links.dart @@ -0,0 +1,363 @@ +import '../env/env.dart'; + +class AppLink { + static String seferPaymentServer = + 'https://walletintaleq.intaleq.xyz/v1/main'; + static final String tripzPaymentServer0 = seferPaymentServer; + static final String tripzPaymentServer = '$seferPaymentServer/ride'; + static final String tripzAlexandriaServer = Env.seferAlexandriaServer; + static final String tripzCairoServer = Env.seferCairoServer; + static final String tripzGizaServer = Env.seferGizaServer; + // static final String endPoint = box.read(BoxName.serverChosen); + // static final String server = Env.seferCairoServer; + + static final String server = 'https://api.intaleq.xyz/intaleq_v3'; + static final String endPoint = 'https://api.intaleq.xyz/intaleq_v3'; + static final String syria = 'https://syria.intaleq.xyz/intaleq'; + static String paymentServer = 'https://walletintaleq.intaleq.xyz/v1/main'; + static String locationServer = 'https://location.intaleq.xyz/intaleq/ride/location'; + static String locationServerSide = 'https://location.intaleq.xyz/intaleq/ride/location'; + static String mapSaasRoute = 'https://map-saas.intaleqapp.com/api/maps/route'; + static String mapSaasPlaces = 'https://map-saas.intaleqapp.com/api/geocoding/places'; + static const String routeApiBaseUrl = "https://routesjo.intaleq.xyz/route/v1/driving"; + static String loginJwtDriver = + "https://api.intaleq.xyz/intaleq/loginAdmin.php"; +//============================= +//============================= + static final getAllFingerprints = + '$server/migration/get_all_fingerprints.php'; + static final updateFingerprintAdmin = + '$server/migration/update_fingerprint_admin.php'; + static final getAllDriverFingerprints = + '$server/migration/get_all_driver_fingerprints.php'; + static final updateDriverFingerprintAdmin = + '$server/migration/update_driver_fingerprint_admin.php'; +//============================= +//============================= + + static String googleMapsLink = 'https://maps.googleapis.com/maps/api/'; + static String llama = 'https://api.llama-api.com/chat/completions'; + static String gemini = + 'https://generativelanguage.googleapis.com/v1beta3/models/text-bison-001:generateText'; + static String serverMonitor = "https://tripz-egypt.com/server/monitor.php"; + + static String test = "$server/test.php"; + static String loginWalletAdmin = "$seferPaymentServer/loginWalletAdmin.php"; + static String loginWalletAdminV3 = "$server/Admin/auth/loginWallet.php"; + //===============firebase========================== + static String getTokens = "$server/ride/firebase/get.php"; + static String getInvoices = "$server/Admin/adminUser/invoice_total.php"; + static String addInvoice = "$server/Admin/adminUser/add_invoice.php"; + static String getAllTokenDrivers = + "$server/ride/firebase/getALlTokenDrivers.php"; + + static String getAllTokenPassengers = + "$server/ride/firebase/getAllTokenPassengers.php"; + static String addTokens = "$server/ride/firebase/add.php"; + static String addTokensDriver = "$server/ride/firebase/addDriver.php"; + + //=======================Wallet=================== + static String addPaymentTokenDriver = + "$tripzPaymentServer/driverWallet/addPaymentToken.php"; + static String addSeferWallet = "$tripzPaymentServer/seferWallet/add.php"; + static String getPaymentsDashboard = + "$seferPaymentServer/Admin/getPaymentsDashboard.php"; + static String getSeferWallet = "$tripzPaymentServer/seferWallet/get.php"; + static String addDrivePayment = "$tripzPaymentServer/payment/add.php"; + static String addFromAdmin = + "$tripzPaymentServer/driverWallet/addFromAdmin.php"; + static String add300ToDriver = + "$tripzPaymentServer/driverWallet/add300ToDriver.php"; + static String updatePaymetToPaid = + "$tripzPaymentServer/payment/updatePaymetToPaid.php"; + static String wallet = '$tripzPaymentServer/passengerWallet'; + static String walletDriver = '$tripzPaymentServer/driverWallet'; + static String getAllPassengerTransaction = + "$wallet/getAllPassengerTransaction.php"; + static String getWalletByPassenger = "$wallet/getWalletByPassenger.php"; + static String getPassengersWallet = "$wallet/get.php"; + static String getPassengerWalletArchive = + "$wallet/getPassengerWalletArchive.php"; + static String addPassengersWallet = "$wallet/add.php"; + static String deletePassengersWallet = "$wallet/delete.php"; + static String updatePassengersWallet = "$wallet/update.php"; + + static String getWalletByDriver = "$walletDriver/getWalletByDriver.php"; + static String getDriversWallet = "$walletDriver/get.php"; + static String addDriversWalletPoints = "$walletDriver/add.php"; + static String deleteDriversWallet = "$walletDriver/delete.php"; + static String updateDriversWallet = "$walletDriver/update.php"; + + //=======================promo===================ride.mobile-app.store/ride/promo/get.php + static String promo = '$server/ride/promo'; + static String getPassengersPromo = "$promo/get.php"; + static String getPromoBytody = "$promo/getPromoBytody.php"; + static String addPassengersPromo = "$promo/add.php"; + static String deletePassengersPromo = "$promo/delete.php"; + static String updatePassengersPromo = "$promo/update.php"; + + ////=======================cancelRide=================== + static String ride = '$server/ride'; + static String addCancelRideFromPassenger = "$server/ride/cancelRide/add.php"; + static String cancelRide = "$server/ride/cancelRide/get.php"; +//-----------------ridessss------------------ + static String addRides = "$ride/rides/add.php"; + static String getRides = "$ride/rides/get.php"; + static String getRideOrderID = "$ride/rides/getRideOrderID.php"; + static String getRideStatus = "$ride/rides/getRideStatus.php"; + static String getRideStatusBegin = "$ride/rides/getRideStatusBegin.php"; + static String getRideStatusFromStartApp = + "$ride/rides/getRideStatusFromStartApp.php"; + static String updateRides = "$ride/rides/update.php"; + static String updateStausFromSpeed = "$ride/rides/updateStausFromSpeed.php"; + static String deleteRides = "$ride/rides/delete.php"; + +//-----------------DriverPayment------------------ + static String adddriverScam = "$ride/driver_scam/add.php"; + static String getdriverScam = "$ride/driver_scam/get.php"; + +/////////---getKazanPercent===//////////// + static String getKazanPercent = "$ride/kazan/get.php"; + static String addKazanPercent = "$ride/kazan/add.php"; + static String updateKazanPercent = "$ride/kazan/update.php"; + +////-----------------DriverPayment------------------ + static String addDriverpayment = "$tripzPaymentServer/payment/add.php"; + static String addDriverPaymentPoints = + "$tripzPaymentServer/driverPayment/add.php"; + static String getDriverPaymentPoints = + "$tripzPaymentServer/driverWallet/get.php"; + static String getDriverpaymentToday = "$tripzPaymentServer/payment/get.php"; + static String getCountRide = "$tripzPaymentServer/payment/getCountRide.php"; + static String getAllPaymentFromRide = + "$tripzPaymentServer/payment/getAllPayment.php"; + static String getAllPaymentVisa = + "$tripzPaymentServer/payment/getAllPaymentVisa.php"; + +//-----------------Passenger NotificationCaptain------------------ + static String addNotificationPassenger = + "$ride/notificationPassenger/add.php"; + static String send_whatsapp_message = + "$server/Admin/send_whatsapp_message.php"; + static String getNotificationPassenger = + "$ride/notificationPassenger/get.php"; + static String updateNotificationPassenger = + "$ride/notificationPassenger/update.php"; + +//-----------------Driver NotificationCaptain------------------ + static String addNotificationCaptain = "$ride/notificationCaptain/add.php"; + static String addWaitingRide = "$ride/notificationCaptain/addWaitingRide.php"; + static String getRideWaiting = "$ride/notificationCaptain/getRideWaiting.php"; + static String getNotificationCaptain = "$ride/notificationCaptain/get.php"; + static String updateNotificationCaptain = + "$ride/notificationCaptain/update.php"; + static String deleteNotificationCaptain = + "$ride/notificationCaptain/delete.php"; + //-----------------Api Key------------------ + static String addApiKey = "$ride/apiKey/add.php"; + static String getApiKey = "$ride/apiKey/get.php"; + static String getCnMap = "$server/auth/cnMap.php"; + static String updateApiKey = "$ride/apiKey/update.php"; + static String deleteApiKey = "$ride/apiKey/delete.php"; + +//-----------------Feed Back------------------ + static String addFeedBack = "$ride/feedBack/add.php"; + static String getFeedBack = "$ride/feedBack/get.php"; + static String updateFeedBack = "$ride/feedBack/updateFeedBack.php"; + + //-----------------Tips------------------ + static String addTips = "$ride/tips/add.php"; + static String getTips = "$ride/tips/get.php"; + static String updateTips = "$ride/tips/update.php"; + +//-----------------Help Center------------------ + static String addhelpCenter = "$ride/helpCenter/add.php"; + static String gethelpCenter = "$ride/helpCenter/get.php"; + static String getByIdhelpCenter = "$ride/helpCenter/getById.php"; + static String updatehelpCenter = "$ride/helpCenter/update.php"; + static String deletehelpCenter = "$ride/helpCenter/delete.php"; + + //-----------------license------------------ + static String addLicense = "$ride/license/add.php"; + static String getLicense = "$ride/license/get.php"; + static String updateLicense = "$ride/license/updateFeedBack.php"; +//-----------------RegisrationCar------------------ + static String addRegisrationCar = "$ride/RegisrationCar/add.php"; + static String getRegisrationCar = "$ride/RegisrationCar/get.php"; + static String updateRegisrationCar = "$ride/RegisrationCar/update.php"; + +//-----------------DriverOrder------------------ + + static String addDriverOrder = "$ride/driver_order/add.php"; + static String getDriverOrder = "$ride/driver_order/get.php"; + static String getOrderCancelStatus = + "$ride/driver_order/getOrderCancelStatus.php"; + static String updateDriverOrder = "$ride/driver_order/update.php"; + static String deleteDriverOrder = "$ride/driver_order/delete.php"; + + // ===================================== + static String addRateToPassenger = "$ride/rate/add.php"; + static String addRateToDriver = "$ride/rate/addRateToDriver.php"; + static String getDriverRate = "$ride/rate/getDriverRate.php"; + static String getPassengerRate = "$ride/rate/getPassengerRate.php"; + + ////////////////emails ============// + static String sendEmailToPassengerForTripDetails = + "$ride/rides/emailToPassengerTripDetail.php"; + static String sendEmailToDrivertransaction = + "$server/Admin/sendEmailToDrivertransaction.php"; + +// =========================================== + static String pathImage = "$server/upload/types/"; + static String uploadImage = "$server/uploadImage.php"; + static String uploadImage1 = "$server/uploadImage1.php"; + static String uploadImagePortrate = "$server/uploadImagePortrate.php"; + static String uploadImageType = "$server/uploadImageType.php"; +//=============egypt documents ============== + static String uploadEgyptidFront = + "$server/EgyptDocuments/uploadEgyptidFront.php"; + static String uploadEgypt = "$server/uploadEgypt.php"; + + //==================certifcate========== + static String location = locationServer; + static String getCarsLocationByPassenger = "$location/get.php"; + static String getFemalDriverLocationByPassenger = + "$location/getFemalDriver.php"; + static String getDriverCarsLocationToPassengerAfterApplied = + "$location/getDriverCarsLocationToPassengerAfterApplied.php"; + static String addCarsLocationByPassenger = "$location/add.php"; + static String deleteCarsLocationByPassenger = "$location/delete.php"; + static String updateCarsLocationByPassenger = "$location/update.php"; + static String getTotalDriverDuration = "$location/getTotalDriverDuration.php"; + static String getTotalDriverDurationToday = + "$location/getTotalDriverDurationToday.php"; + + //==================Blog============= + static String profile = '$server/ride/profile'; + static String getprofile = "$profile/get.php"; + static String getCaptainProfile = "$profile/getCaptainProfile.php"; + static String addprofile = "$profile/add.php"; + static String deleteprofile = "$profile/delete.php"; + static String updateprofile = "$profile/update.php"; + + //===================Auth============ + + static String auth = '$server/auth'; + static String login = "$auth/login.php"; + static String signUp = "$auth/signup.php"; + static String sendVerifyEmail = "$auth/sendVerifyEmail.php"; + static String passengerRemovedAccountEmail = + "$auth/passengerRemovedAccountEmail.php"; + static String verifyEmail = "$auth/verifyEmail.php"; +//===================Auth Captin============ + static String authCaptin = '$server/auth/captin'; + static String loginCaptin = "$authCaptin/login.php"; + static String signUpCaptin = "$authCaptin/register.php"; + static String sendVerifyEmailCaptin = "$authCaptin/sendVerifyEmail.php"; + static String verifyEmailCaptin = "$authCaptin/verifyEmail.php"; + static String removeUser = "$authCaptin/removeAccount.php"; + static String deletecaptainAccounr = "$authCaptin/deletecaptainAccounr.php"; + static String updateAccountBank = "$authCaptin/updateAccountBank.php"; + static String getAccount = "$authCaptin/getAccount.php"; + + //===================Admin Captin============ + static String getDriversPhonesAndTokens = + "$server/Admin/AdminCaptain/getDriversPhonesAndTokens.php"; + static String getPassengerDetailsByPassengerID = + "$server/Admin/getPassengerDetailsByPassengerID.php"; + static String getPassengerDetails = "$server/Admin/getPassengerDetails.php"; + static String admin_delete_and_blacklist_passenger = + "$server/Admin/passenger/admin_delete_and_blacklist_passenger.php"; + static String admin_update_passenger = + "$server/Admin/passenger/admin_update_passenger.php"; + static String admin_unblacklist = + "$server/Admin/passenger/admin_unblacklist.php"; + static String admin_get_rides_by_phone = + "$server/Admin/rides/admin_get_rides_by_phone.php"; + static String admin_update_ride_status = + "$server/Admin/rides/admin_update_ride_status.php"; + static String getPassengerbyEmail = "$server/Admin/getPassengerbyEmail.php"; + static String updateDriverFromAdmin = + "$server/Admin/driver/updateDriverFromAdmin.php"; + static String find_driver_by_phone = + "$server/Admin/driver/find_driver_by_phone.php"; + static String getDriversPending = + "$server/auth/syria/driver/drivers_pending_list.php"; + static String getDriverDetails = + "$server/auth/syria/driver/driver_details.php"; + static String deleteCaptain = "$server/Admin/driver/deleteCaptain.php"; + static String addAdminUser = "$server/Admin/adminUser/add.php"; + static String addStaff = "$server/Admin/Staff/add.php"; + static String getdashbord = "$server/Admin/dashbord.php"; + static String paymentServerV2 = 'https://walletintaleq.intaleq.xyz/v2/main'; + static String realtimeDashboardV2 = "$server/Admin/v2/realtime_dashboard.php"; + static String smartAlertsV2 = "$server/Admin/v2/smart_alerts.php"; + static String growthV2 = "$server/Admin/v2/analytics/growth.php"; + static String revenueV2 = "$server/Admin/v2/analytics/revenue.php"; + static String driverRankingV2 = "$server/Admin/v2/analytics/driver_ranking.php"; + static String settlementsV2 = "$paymentServerV2/Admin/v2/financial/settlements.php"; + static String financialStatsV2 = "$paymentServerV2/Admin/v2/financial/stats.php"; + static String dashboardWalletV2 = "$paymentServerV2/Admin/v2/financial/dashboard_wallet.php"; + static String auditLogsV2 = "$server/Admin/v2/security/audit_logs.php"; + static String blacklistManager = "$server/Admin/v2/quality/blacklist_manager.php"; + static String driverScorecard = "$server/Admin/v2/quality/driver_scorecard.php"; + static String getEmployee = "$server/Admin/employee/get.php"; + static String getBestDriver = "$server/Admin/driver/getBestDriver.php"; + static String getBestDriverGiza = + "https://gizasefer.online/sefer/Admin/driver/getBestDriver.php"; + static String getBestDriverAlexandria = + "$tripzAlexandriaServer/Admin/driver/getBestDriver.php"; + static String deleteRecord = "$server/Admin/driver/deleteRecord.php"; + static String addEmployee = "$server/Admin/employee/add.php"; + static String getdashbordPayment = "$server/Admin/dashbordPayment.php"; + static String getAdminUser = "$server/Admin/adminUser/get.php"; + static String getCaptainDetailsByEmailOrIDOrPhone = + "$server/Admin/AdminCaptain/getCaptainDetailsByEmailOrIDOrPhone.php"; + static String getCaptainDetails = "$server/Admin/AdminCaptain/get.php"; + static String getVisaForEachDriver = + "$seferPaymentServer/Admin/getVisaForEachDriver.php"; + static String getRidesPerMonth = + "$server/Admin/AdminRide/getRidesPerMonth.php"; + static String getRidesDetails = "$server/Admin/AdminRide/get.php"; + static String getPassengersStatic = "$serviceApp/getPassengersStatic.php"; + static String getRidesStatic = "$serviceApp/getRidesStatic.php"; + static String getEmployeeStatic = "$serviceApp/getEmployeeStatic.php"; + static String getNotesForEmployee = "$serviceApp/getNotesForEmployee.php"; + static String getEmployeeDriverAfterCallingRegister = + "$serviceApp/getEmployeeDriverAfterCallingRegister.php"; + static String getEditorStatsCalls = "$serviceApp/getEditorStatsCalls.php"; + static String getdriverstotalMonthly = + "$serviceApp/getdriverstotalMonthly.php"; + +//////////////////////// + static String serviceApp = "$server/serviceapp"; + static String editCarPlate = "$serviceApp/editCarPlate.php"; + static String getComplaintAllData = "$serviceApp/getComplaintAllData.php"; + static String getComplaintAllDataForDriver = + "$serviceApp/getComplaintAllDataForDriver.php"; + static String addCriminalDocuments = "$authCaptin/addCriminalDocuments.php"; + static String getPassengersByPhone = + "$server/serviceApp/getPassengersByPhone.php"; + static String getDriverByPhone = "$serviceApp/getDriverByPhone.php"; + static String getNewDriverRegister = "$serviceApp/getNewDriverRegister.php"; + static String addWelcomeDriverNote = "$serviceApp/addWelcomeDriverNote.php"; + static String getDriverNotCompleteRegistration = + "$serviceApp/getDriverNotCompleteRegistration.php"; + static String getPassengersNotCompleteRegistration = + "$serviceApp/getPassengersNotCompleteRegistration.php"; + static String addNotesDriver = "$serviceApp/addNotesDriver.php"; + static String getCarPlateNotEdit = "$serviceApp/getCarPlateNotEdit.php"; + static String addNotesPassenger = "$serviceApp/addNotesPassenger.php"; + static String getPackages = "$serviceApp/getPackages.php"; + static String updatePackages = "$serviceApp/updatePackages.php"; + ////// + static String sendSms = "https://sms.kazumi.me/api/sms/send-sms"; + static String senddlr = "https://sms.kazumi.me/api/sms/send-dlr"; + static String sendvalidity = "https://sms.kazumi.me/api/sms/send-validity"; + static String sendmany = "https://sms.kazumi.me/api/sms/send-many"; + static String checkCredit = "https://sms.kazumi.me/api/sms/check-credit"; + static String getSender = "$server/auth/sms/getSender.php"; + static String checkStatus = "https://sms.kazumi.me/api/sms/check-status"; + static String updatePhoneInvalidSMSPassenger = + "$server/auth/sms/updatePhoneInvalidSMSPassenger.php"; +} diff --git a/siro_admin/lib/constant/style.dart b/siro_admin/lib/constant/style.dart new file mode 100644 index 0000000..694045b --- /dev/null +++ b/siro_admin/lib/constant/style.dart @@ -0,0 +1,83 @@ +import 'package:flutter/material.dart'; +import 'package:google_fonts/google_fonts.dart'; + +import 'colors.dart'; + +class AppStyle { + // --- Typography --- + + static TextStyle display = GoogleFonts.inter( + fontWeight: FontWeight.w800, + fontSize: 32, + color: AppColor.textPrimary, + letterSpacing: -1, + ); + + static TextStyle headTitle = GoogleFonts.cairo( + fontWeight: FontWeight.bold, + fontSize: 24, + color: AppColor.textPrimary, + ); + + static TextStyle title = GoogleFonts.inter( + fontWeight: FontWeight.w600, + fontSize: 16, + color: AppColor.textPrimary, + ); + + static TextStyle subtitle = GoogleFonts.inter( + fontWeight: FontWeight.w500, + fontSize: 14, + color: AppColor.textSecondary, + ); + + static TextStyle body = GoogleFonts.inter( + fontWeight: FontWeight.normal, + fontSize: 14, + color: AppColor.textPrimary, + ); + + static TextStyle caption = GoogleFonts.inter( + fontWeight: FontWeight.w400, + fontSize: 12, + color: AppColor.textMuted, + ); + + static TextStyle number = GoogleFonts.jetBrainsMono( + fontWeight: FontWeight.bold, + fontSize: 15, + color: AppColor.accent, + ); + + // --- Decorations --- + + static BoxDecoration cardDecoration = BoxDecoration( + color: AppColor.surface, + borderRadius: BorderRadius.circular(16), + border: Border.all(color: AppColor.divider, width: 1), + boxShadow: const [ + BoxShadow( + color: AppColor.cardShadow, + blurRadius: 20, + offset: Offset(0, 8), + ), + ], + ); + + static BoxDecoration elevatedCard = BoxDecoration( + color: AppColor.surfaceElevated, + borderRadius: BorderRadius.circular(20), + border: Border.all(color: AppColor.accentBorder, width: 1), + ); + + static BoxDecoration glassDecoration = BoxDecoration( + color: AppColor.surfaceGlass, + borderRadius: BorderRadius.circular(24), + border: Border.all(color: AppColor.divider, width: 1), + ); + + // --- Legacy Mappings --- + static TextStyle headTitle2 = headTitle; + static BoxDecoration boxDecoration = cardDecoration; + static BoxDecoration boxDecoration1 = elevatedCard; +} diff --git a/siro_admin/lib/constant/table_names.dart b/siro_admin/lib/constant/table_names.dart new file mode 100644 index 0000000..47cd831 --- /dev/null +++ b/siro_admin/lib/constant/table_names.dart @@ -0,0 +1,9 @@ +class TableName { + static const String placesFavorite = "placesFavorite"; + static const String recentLocations = "recentLocations"; + static const String carLocations = "carLocations"; + static const String driverOrdersRefuse = "driverOrdersRefuse"; + static const String rideLocation = "rideLocation"; + static const String faceDetectTimes = "faceDetectTimes"; + static const String captainNotification = "captainNotification"; +} diff --git a/siro_admin/lib/controller/admin/analytics_v2_controller.dart b/siro_admin/lib/controller/admin/analytics_v2_controller.dart new file mode 100644 index 0000000..2430b0a --- /dev/null +++ b/siro_admin/lib/controller/admin/analytics_v2_controller.dart @@ -0,0 +1,75 @@ +import 'dart:convert'; +import 'package:get/get.dart'; +import 'package:siro_admin/constant/links.dart'; +import 'package:siro_admin/controller/functions/crud.dart'; +import '../../print.dart'; + +class AnalyticsV2Controller extends GetxController { + bool isLoading = true; + + Map growthData = {}; + Map revenueData = {}; + List topDrivers = []; + + @override + void onInit() { + super.onInit(); + fetchAllAnalytics(); + } + + Future fetchAllAnalytics() async { + isLoading = true; + update(); + + await Future.wait([ + fetchGrowth(), + fetchRevenue(), + fetchDriverRanking(), + ]); + + isLoading = false; + update(); + } + + Future fetchGrowth() async { + try { + var res = await CRUD().get(link: AppLink.growthV2, payload: {}); + if (res != 'failure' && res != null) { + var d = res is String ? jsonDecode(res) : res; + if (d['status'] == 'success') { + growthData = d['data']; + } + } + } catch (e) { + Log.print('Error fetching growth analytics: $e'); + } + } + + Future fetchRevenue() async { + try { + var res = await CRUD().get(link: AppLink.revenueV2, payload: {}); + if (res != 'failure' && res != null) { + var d = res is String ? jsonDecode(res) : res; + if (d['status'] == 'success') { + revenueData = d['data']; + } + } + } catch (e) { + Log.print('Error fetching revenue analytics: $e'); + } + } + + Future fetchDriverRanking() async { + try { + var res = await CRUD().get(link: AppLink.driverRankingV2, payload: {}); + if (res != 'failure' && res != null) { + var d = res is String ? jsonDecode(res) : res; + if (d['status'] == 'success') { + topDrivers = d['data']; + } + } + } catch (e) { + Log.print('Error fetching driver ranking: $e'); + } + } +} diff --git a/siro_admin/lib/controller/admin/captain_admin_controller.dart b/siro_admin/lib/controller/admin/captain_admin_controller.dart new file mode 100644 index 0000000..a256772 --- /dev/null +++ b/siro_admin/lib/controller/admin/captain_admin_controller.dart @@ -0,0 +1,141 @@ +import 'dart:convert'; + +import 'package:flutter/material.dart'; +import 'package:get/get.dart'; +import 'package:local_auth/local_auth.dart'; + +import '../../constant/colors.dart'; +import '../../constant/links.dart'; +import '../functions/crud.dart'; + +class CaptainAdminController extends GetxController { + bool isLoading = false; + Map captainData = {}; + Map captain = {}; + final captainController = TextEditingController(); + final captainPrizeController = TextEditingController(); + final titleNotify = TextEditingController(); + final bodyNotify = TextEditingController(); + final formCaptainKey = GlobalKey(); + final formCaptainPrizeKey = GlobalKey(); + + Future getCaptainCount() async { + isLoading = true; + update(); + var res = await CRUD().get(link: AppLink.getCaptainDetails, payload: {}); + var d = jsonDecode(res); + if (d['status'] == 'success') { + captainData = d; + } + + isLoading = false; + update(); + } + + Future deletCaptain() async { + isLoading = true; + update(); + var res = await CRUD().get( + link: AppLink.deleteCaptain, + payload: {}, + ); + var d = jsonDecode(res); + if (d['status'] == 'success') { + captainData = d; + } + + isLoading = false; + update(); + } + + Future find_driver_by_phone(String phone) async { + isLoading = true; + update(); + var res = await CRUD().post( + link: AppLink.find_driver_by_phone, + payload: {'phone': "963$phone"}, + ); + var d = (res); + if (d != 'failure') { + captainData = d; + } else { + captainData = {}; + Get.snackbar('Error', 'No captain found with this phone number', + backgroundColor: AppColor.redColor); + } + + isLoading = false; + update(); + } + + Future addCaptainPrizeToWallet() async { + String? paymentId; + //todo link to add wallet to captain + for (var i = 0; i < captainData['message'].length; i++) { + await CRUD().post(link: AppLink.addDriverPaymentPoints, payload: { + 'driverID': captainData['message'][i]['id'], + 'amount': captainPrizeController.text, + 'paymentMethod': 'Prize', + }).then((value) { + paymentId = value['message'].toString(); + }); + await CRUD().post(link: AppLink.addPassengersWallet, payload: { + 'driverID': captainData['message'][i]['id'], + 'amount': captainPrizeController.text, + 'paymentMethod': 'Prize', + 'paymentID': paymentId.toString(), + }); + } + + Get.back(); + } + + void addCaptainsPrizeToWalletSecure() async { + try { + // Check if local authentication is available + bool isAvailable = await LocalAuthentication().isDeviceSupported(); + if (isAvailable) { + // Authenticate the user + bool didAuthenticate = await LocalAuthentication().authenticate( + localizedReason: 'Use Touch ID or Face ID to confirm payment', + ); + if (didAuthenticate) { + // User authenticated successfully, proceed with payment + await addCaptainPrizeToWallet(); + Get.snackbar('Prize Added', '', backgroundColor: AppColor.greenColor); + } else { + // Authentication failed, handle accordingly + Get.snackbar('Authentication failed', '', + backgroundColor: AppColor.redColor); + // 'Authentication failed'); + } + } else { + // Local authentication not available, proceed with payment without authentication + await addCaptainPrizeToWallet(); + Get.snackbar('Prize Added', '', backgroundColor: AppColor.greenColor); + } + } catch (e) { + rethrow; + } + } + + Future getCaptains() async { + var res = await CRUD() + .get(link: AppLink.getCaptainDetailsByEmailOrIDOrPhone, payload: { + 'driver_id': captainController.text, + 'driverEmail': captainController.text, + 'driverPhone': captainController.text, + }); + var d = jsonDecode(res); + if (d['status'] == 'success') { + captain = d; + } + update(); + } + + @override + void onInit() { + getCaptainCount(); + super.onInit(); + } +} diff --git a/siro_admin/lib/controller/admin/complaint_controller.dart b/siro_admin/lib/controller/admin/complaint_controller.dart new file mode 100644 index 0000000..26a3062 --- /dev/null +++ b/siro_admin/lib/controller/admin/complaint_controller.dart @@ -0,0 +1,70 @@ +import 'dart:convert'; +import 'package:get/get.dart'; +import '../../constant/links.dart'; +import '../functions/crud.dart'; + +class ComplaintController extends GetxController { + var complaintList = [].obs; + var isLoading = false.obs; + var showOnlyDelayed = false.obs; + final CRUD _crud = CRUD(); + + List get delayedComplaints { + final weekAgo = DateTime.now().subtract(const Duration(days: 7)); + return complaintList.where((c) { + if (c['statusComplaint'] == 'Resolved') return false; + try { + final date = DateTime.parse(c['date_filed']); + return date.isBefore(weekAgo); + } catch (e) { + return false; + } + }).toList(); + } + + @override + void onInit() { + super.onInit(); + getComplaints(); + } + + Future getComplaints() async { + isLoading.value = true; + try { + var response = await _crud.get(link: AppLink.getComplaintAllData); + if (response != null && response != 'failure' && response != 'token_expired') { + var decoded = response is String ? jsonDecode(response) : response; + if (decoded['status'] == "success") { + complaintList.assignAll(decoded['message']); + } + } else { + complaintList.clear(); + } + } catch (e) { + Get.snackbar("خطأ", "فشل جلب الشكاوى: $e"); + } finally { + isLoading.value = false; + } + } + + Future updateComplaintStatus(String id, String status, String resolution) async { + isLoading.value = true; + try { + var response = await _crud.post(link: "${AppLink.server}/serviceapp/update_complaint.php", payload: { + "id": id, + "statusComplaint": status, + "resolution": resolution, + }); + if (response != null && response is Map && response['status'] == "success") { + await getComplaints(); + return true; + } + return false; + } catch (e) { + Get.snackbar("خطأ", "فشل تحديث الشكوى: $e"); + return false; + } finally { + isLoading.value = false; + } + } +} diff --git a/siro_admin/lib/controller/admin/dashboard_controller.dart b/siro_admin/lib/controller/admin/dashboard_controller.dart new file mode 100644 index 0000000..ead4709 --- /dev/null +++ b/siro_admin/lib/controller/admin/dashboard_controller.dart @@ -0,0 +1,111 @@ +import 'dart:convert'; + +import 'package:flutter/material.dart'; +import 'package:get/get.dart'; +import 'package:siro_admin/constant/links.dart'; +import 'package:siro_admin/controller/functions/crud.dart'; +import 'package:siro_admin/controller/auth/otp_helper.dart'; + +import '../../constant/box_name.dart'; +import '../../main.dart'; + +class DashboardController extends GetxController { + bool isLoading = false; + List dashbord = []; + String creditSMS = '0'; + final formKey = GlobalKey(); + final smsText = TextEditingController(); + + Future getDashBoard() async { + isLoading = true; + update(); + + // 🔹 Request main dashboard data + var res = await CRUD().get(link: AppLink.getdashbord, payload: {}); + print('📡 Main dashboard response: $res'); + + if (res == 'token_expired') { + print('❌ Admin token expired. Attempting seamless auto-login.'); + box.remove(BoxName.jwt); + try { + final otpHelper = Get.put(OtpHelper()); + await otpHelper.checkAdminLogin(); + } catch (e) { + Get.offAllNamed('/login'); + } + return; + } + + if (res != 'failure' && res != null) { + try { + var d = res is String ? jsonDecode(res) : res; + print('✅ Decoded main dashboard: ${jsonEncode(d)}'); + if (d['status'] == 'success' && d['message'] != null) { + dashbord = d['message'] is List ? d['message'] : [d['message']]; + } + } catch (e) { + print('❌ Error parsing main dashboard: $e'); + } + } else { + print('❌ Failed to load main dashboard'); + } + + // 🔹 Request wallet dashboard data + var resPayments = await CRUD().postWallet( + link: AppLink.getPaymentsDashboard, + payload: {}, + ); + print('💳 Wallet dashboard response: $resPayments'); + + if (resPayments is Map && resPayments['status'] == 'success') { + var p = resPayments; + print('✅ Decoded wallet dashboard: ${jsonEncode(p)}'); + + if (dashbord.isNotEmpty && + p['message'] is List && + p['message'].isNotEmpty) { + dashbord[0].addAll(p['message'][0]); + } else if (dashbord.isNotEmpty && p['message'] is Map) { + dashbord[0].addAll(p['message']); + } + } else { + print('❌ Failed to load wallet dashboard (or verification required)'); + } + + // 🔹 Check SMS credit + // var res2 = await CRUD().kazumiSMS( + // link: 'https://sms.kazumi.me/api/sms/check-credit', + // payload: {"username": "Sefer", "password": AK.smsPasswordEgypt}, + // ); + + // creditSMS = res2['credit']; + // print('📱 SMS Credit Response: ${jsonEncode(res2)}'); + // print('💰 creditSMS: $creditSMS'); + + isLoading = false; + update(); + } + + sendSMSMethod() async { + if (formKey.currentState!.validate()) { + for (var phoneNumber in box.read(BoxName.tokensDrivers)['message']) { + // for (var i = 0; i < 2; i++) { + await CRUD().sendSmsEgypt( + phoneNumber['phone'].toString(), + // box.read(BoxName.tokensDrivers)['message'][i]['phone'].toString(), + smsText.text, + ); + // print('CRUD().phoneDriversTest.: ${phoneNumber['phone']}'); + Future.delayed(const Duration(microseconds: 20)); + } + Get.back(); + } + } + + @override + void onInit() async { + getDashBoard(); + + super.onInit(); + } +} diff --git a/siro_admin/lib/controller/admin/dashboard_v2_controller.dart b/siro_admin/lib/controller/admin/dashboard_v2_controller.dart new file mode 100644 index 0000000..ed943b2 --- /dev/null +++ b/siro_admin/lib/controller/admin/dashboard_v2_controller.dart @@ -0,0 +1,62 @@ +import 'dart:async'; +import 'dart:convert'; +import 'package:get/get.dart'; +import 'package:siro_admin/constant/links.dart'; +import 'package:siro_admin/controller/functions/crud.dart'; +import '../../print.dart'; + +class DashboardV2Controller extends GetxController { + bool isLoading = true; + Map realtimeData = {}; + List smartAlerts = []; + Timer? _timer; + + @override + void onInit() { + super.onInit(); + fetchRealtimeData(); + fetchSmartAlerts(); + // Auto refresh every 2 minutes + _timer = Timer.periodic(const Duration(minutes: 2), (timer) { + fetchRealtimeData(); + fetchSmartAlerts(); + }); + } + + @override + void onClose() { + _timer?.cancel(); + super.onClose(); + } + + Future fetchRealtimeData() async { + try { + var res = await CRUD().get(link: AppLink.realtimeDashboardV2, payload: {}); + if (res != 'failure' && res != null) { + var d = res is String ? jsonDecode(res) : res; + if (d['status'] == 'success') { + realtimeData = d['message']; + isLoading = false; + update(); + } + } + } catch (e) { + Log.print('Error fetching realtime dashboard: $e'); + } + } + + Future fetchSmartAlerts() async { + try { + var res = await CRUD().get(link: AppLink.smartAlertsV2, payload: {}); + if (res != 'failure' && res != null) { + var d = res is String ? jsonDecode(res) : res; + if (d['status'] == 'success') { + smartAlerts = d['message']; + update(); + } + } + } catch (e) { + Log.print('Error fetching smart alerts: $e'); + } + } +} diff --git a/siro_admin/lib/controller/admin/driver_docs_controller.dart b/siro_admin/lib/controller/admin/driver_docs_controller.dart new file mode 100644 index 0000000..ef88f70 --- /dev/null +++ b/siro_admin/lib/controller/admin/driver_docs_controller.dart @@ -0,0 +1,97 @@ +import 'dart:convert'; +import 'package:get/get.dart'; +import '../../constant/links.dart'; +import '../functions/crud.dart'; + +class DriverDocsController extends GetxController { + var pendingDrivers = [].obs; + var isLoading = false.obs; + var isMoreLoading = false.obs; + var hasMore = true.obs; + int _offset = 0; + final int _limit = 10; + final CRUD _crud = CRUD(); + + @override + void onInit() { + super.onInit(); + getPendingDrivers(); + } + + Future getPendingDrivers({bool refresh = true}) async { + if (refresh) { + isLoading.value = true; + _offset = 0; + hasMore.value = true; + } else { + if (isMoreLoading.value || !hasMore.value) return; + isMoreLoading.value = true; + } + + try { + var response = await _crud.post( + link: AppLink.getDriversPending, + payload: {"limit": _limit.toString(), "offset": _offset.toString()}, + ); + if (response != null && response != 'failure' && response != 'token_expired') { + var decoded = response is String ? jsonDecode(response) : response; + if (decoded['status'] == "success") { + List newItems = decoded['message'] ?? []; + if (refresh) { + pendingDrivers.assignAll(newItems); + } else { + pendingDrivers.addAll(newItems); + } + _offset += newItems.length; + if (newItems.length < _limit) { + hasMore.value = false; + } + } + } + } catch (e) { + Get.snackbar("خطأ", "فشل جلب السائقين: $e"); + } finally { + isLoading.value = false; + isMoreLoading.value = false; + } + } + + Future loadMore() async { + await getPendingDrivers(refresh: false); + } + + Future?> getDriverFullDetails(String id) async { + try { + var response = await _crud.get(link: "${AppLink.getDriverDetails}?id=$id"); + if (response != null && response != 'failure' && response != 'token_expired') { + var decoded = response is String ? jsonDecode(response) : response; + if (decoded['status'] == "success") { + return decoded['data']; + } + } + } catch (e) { + Get.snackbar("خطأ", "فشل جلب تفاصيل السائق: $e"); + } + return null; + } + + Future approveDriver(String id) async { + isLoading.value = true; + try { + var response = await _crud.post(link: AppLink.updateDriverFromAdmin, payload: { + "id": id, + "status": "active", + }); + if (response != null && response is Map && response['status'] == "success") { + await getPendingDrivers(); + return true; + } + return false; + } catch (e) { + Get.snackbar("خطأ", "فشل اعتماد السائق: $e"); + return false; + } finally { + isLoading.value = false; + } + } +} diff --git a/siro_admin/lib/controller/admin/financial_v2_controller.dart b/siro_admin/lib/controller/admin/financial_v2_controller.dart new file mode 100644 index 0000000..659d51d --- /dev/null +++ b/siro_admin/lib/controller/admin/financial_v2_controller.dart @@ -0,0 +1,61 @@ +import 'dart:convert'; +import 'package:get/get.dart'; +import 'package:siro_admin/constant/links.dart'; +import 'package:siro_admin/controller/functions/crud.dart'; +import '../../print.dart'; + +class FinancialV2Controller extends GetxController { + bool isLoading = true; + + Map stats = {}; + List settlements = []; + + @override + void onInit() { + super.onInit(); + fetchAllFinancials(); + } + + Future fetchAllFinancials() async { + isLoading = true; + update(); + + await Future.wait([ + fetchStats(), + fetchSettlements(), + ]); + + isLoading = false; + update(); + } + + Future fetchStats() async { + try { + var res = + await CRUD().getWallet(link: AppLink.financialStatsV2, payload: {}); + if (res != 'failure' && res != null) { + var d = res is String ? jsonDecode(res) : res; + if (d['status'] == 'success') { + stats = d['data']; + } + } + } catch (e) { + Log.print('Error fetching financial stats: $e'); + } + } + + Future fetchSettlements() async { + try { + var res = + await CRUD().getWallet(link: AppLink.settlementsV2, payload: {}); + if (res != 'failure' && res != null) { + var d = res is String ? jsonDecode(res) : res; + if (d['status'] == 'success') { + settlements = d['data']; + } + } + } catch (e) { + Log.print('Error fetching settlements: $e'); + } + } +} diff --git a/siro_admin/lib/controller/admin/get_all_invoice_controller.dart b/siro_admin/lib/controller/admin/get_all_invoice_controller.dart new file mode 100644 index 0000000..b36a0ad --- /dev/null +++ b/siro_admin/lib/controller/admin/get_all_invoice_controller.dart @@ -0,0 +1,25 @@ +class InvoiceModel { + final String invoiceNumber; + final String amount; + final String date; + final String name; + final String? imageLink; + + InvoiceModel({ + required this.invoiceNumber, + required this.amount, + required this.date, + required this.name, + this.imageLink, + }); + + factory InvoiceModel.fromJson(Map json) { + return InvoiceModel( + invoiceNumber: json['invoice_number'], + amount: json['amount'].toString(), + date: json['date'], + name: json['name'], + imageLink: json['image_link'], + ); + } +} diff --git a/siro_admin/lib/controller/admin/kazan_controller.dart b/siro_admin/lib/controller/admin/kazan_controller.dart new file mode 100644 index 0000000..9ab1ac8 --- /dev/null +++ b/siro_admin/lib/controller/admin/kazan_controller.dart @@ -0,0 +1,60 @@ +import 'dart:convert'; +import 'package:get/get.dart'; +import '../../constant/links.dart'; +import '../functions/crud.dart'; + +class KazanController extends GetxController { + var kazanData = {}.obs; + var isLoading = false.obs; + final CRUD _crud = CRUD(); + + @override + void onInit() { + super.onInit(); + getKazan(); + } + + Future getKazan() async { + isLoading.value = true; + try { + var response = await _crud.get(link: "${AppLink.getKazanPercent}?country=syria"); + if (response != null && response != 'failure' && response != 'token_expired') { + var decoded = response is String ? jsonDecode(response) : response; + if (decoded['status'] == "success") { + var message = decoded['message']; + if (message is List && message.isNotEmpty) { + kazanData.value = message[0]; + } + } + } + } catch (e) { + Get.snackbar("خطأ", "فشل جلب بيانات التسعير: $e"); + } finally { + isLoading.value = false; + } + } + + Future updateKazan(Map data) async { + isLoading.value = true; + try { + final String link = data.containsKey('id') ? AppLink.updateKazanPercent : AppLink.addKazanPercent; + + Map payload = {}; + data.forEach((key, value) { + payload[key] = value.toString(); + }); + + var response = await _crud.post(link: link, payload: payload); + if (response != null && response is Map && response['status'] == "success") { + await getKazan(); + return true; + } + return false; + } catch (e) { + Get.snackbar("خطأ", "فشل تحديث التسعير: $e"); + return false; + } finally { + isLoading.value = false; + } + } +} diff --git a/siro_admin/lib/controller/admin/passenger_admin_controller.dart b/siro_admin/lib/controller/admin/passenger_admin_controller.dart new file mode 100644 index 0000000..37e4dde --- /dev/null +++ b/siro_admin/lib/controller/admin/passenger_admin_controller.dart @@ -0,0 +1,172 @@ +import 'dart:convert'; + +import 'package:flutter/material.dart'; +import 'package:get/get.dart'; +import 'package:local_auth/local_auth.dart'; + +import '../../constant/colors.dart'; +import '../../constant/links.dart'; +import '../functions/crud.dart'; + +class PassengerAdminController extends GetxController { + bool isLoading = false; + Map passengersData = {}; + Map passengers = {}; + double height = 150; + final formPassKey = GlobalKey(); + final formPrizeKey = GlobalKey(); + final titleNotify = TextEditingController(); + final bodyNotify = TextEditingController(); + final passengerController = TextEditingController(); + final passengerPrizeController = TextEditingController(); + + Future getPassengerCount() async { + isLoading = true; + update(); + var res = await CRUD().get(link: AppLink.getPassengerDetails, payload: {}); + var d = jsonDecode(res); + if (d['status'] == 'success') { + passengersData = d; + } + + isLoading = false; + update(); + } + + Future addPassengerPrizeToWallet() async { + for (var i = 0; i < passengersData['message'].length; i++) { + await CRUD().post(link: AppLink.addPassengersWallet, payload: { + 'passenger_id': passengersData['message'][i]['id'], + 'balance': passengerPrizeController.text, + }); + } + + Get.back(); + } +// داخل الـController نفسه + + Future updatePassenger({ + required String id, // أو مرّر phoneLookup بدل id لو حاب + String? firstName, + String? lastName, + String? phone, + }) async { + // لا نرسل طلب إذا ما في أي تغيير + if ((firstName == null || firstName.trim().isEmpty) && + (lastName == null || lastName.trim().isEmpty) && + (phone == null || phone.trim().isEmpty)) { + return false; + } + + // فلتر بسيط للأرقام فقط + // String _normalizePhone(String s) => s.replaceAll(RegExp(r'\D+'), ''); + + final Map payload = { + 'id': + id, // لو بدك تستخدم phone_lookup بدل id: احذف هذا وأرسل {'phone_lookup': phoneLookup} + }; + + if (firstName != null && firstName.trim().isNotEmpty) { + payload['first_name'] = firstName.trim(); + } + if (lastName != null && lastName.trim().isNotEmpty) { + payload['last_name'] = lastName.trim(); + } + if (phone != null && phone.trim().isNotEmpty) { + payload['phone'] = (phone); + } + + // حالة تحميل + isLoading = true; + update(); + + try { + final res = await CRUD().post( + link: AppLink.admin_update_passenger, // عدّل الرابط حسب اسم مسارك + payload: payload, + ); + final d = (res); + + final ok = (d['status'] == 'success'); + if (ok) { + // (اختياري) حدّث الكاش/الواجهة — مثلاً أعد الجلب + Get.snackbar('Update successful', + d['message']?.toString() ?? 'Passenger updated successfully', + backgroundColor: AppColor.greenColor); + // await getPassengerCount(); // أو حدّث passengersData محليًا إذا متاح + } else { + // (اختياري) أظهر رسالة خطأ + // Get.snackbar('Update failed', d['message']?.toString() ?? 'Unknown error'); + } + return ok; + } catch (e) { + // Get.snackbar('Error', e.toString()); + return false; + } finally { + isLoading = false; + update(); + } + } + + void addPassengerPrizeToWalletSecure() async { + try { + // Check if local authentication is available + bool isAvailable = await LocalAuthentication().isDeviceSupported(); + if (isAvailable) { + // Authenticate the user + bool didAuthenticate = await LocalAuthentication().authenticate( + localizedReason: 'Use Touch ID or Face ID to confirm payment', + ); + if (didAuthenticate) { + // User authenticated successfully, proceed with payment + await addPassengerPrizeToWallet(); + Get.snackbar('Prize Added', '', backgroundColor: AppColor.greenColor); + } else { + // Authentication failed, handle accordingly + Get.snackbar('Authentication failed', '', + backgroundColor: AppColor.redColor); + // 'Authentication failed'); + } + } else { + // Local authentication not available, proceed with payment without authentication + await addPassengerPrizeToWallet(); + Get.snackbar('Prize Added', '', backgroundColor: AppColor.greenColor); + } + } catch (e) { + rethrow; + } + } + + Future getPassengers() async { + var res = await CRUD().get(link: AppLink.getPassengerbyEmail, payload: { + 'passengerEmail': passengerController.text, + 'passengerId': passengerController.text, + 'passengerphone': passengerController.text, + }); + var d = jsonDecode(res); + if (d['status'] == 'success') { + passengers = d; + } + update(); + } + + changeHeight() { + if (passengers.isEmpty) { + height = 0; + update(); + } + height = 150; + update(); + } + + void clearPlaces() { + passengers = {}; + update(); + } + + @override + void onInit() { + getPassengerCount(); + super.onInit(); + } +} diff --git a/siro_admin/lib/controller/admin/promo_controller.dart b/siro_admin/lib/controller/admin/promo_controller.dart new file mode 100644 index 0000000..c3f4d80 --- /dev/null +++ b/siro_admin/lib/controller/admin/promo_controller.dart @@ -0,0 +1,83 @@ +import 'dart:convert'; +import 'package:get/get.dart'; +import '../../constant/links.dart'; +import '../functions/crud.dart'; + +class PromoController extends GetxController { + var promoList = [].obs; + var isLoading = false.obs; + final CRUD _crud = CRUD(); + + @override + void onInit() { + super.onInit(); + getPromos(); + } + + Future getPromos() async { + isLoading.value = true; + try { + var response = await _crud.get(link: AppLink.getPassengersPromo); + if (response != null && response != 'failure' && response != 'token_expired') { + var decoded = response is String ? jsonDecode(response) : response; + if (decoded['status'] == "success") { + promoList.assignAll(decoded['message']); + } + } else { + promoList.clear(); + } + } catch (e) { + Get.snackbar("خطأ", "فشل جلب أكواد الخصم: $e"); + } finally { + isLoading.value = false; + } + } + + Future addPromo(Map data) async { + isLoading.value = true; + try { + var response = await _crud.post(link: AppLink.addPassengersPromo, payload: data); + if (response != null && response is Map && response['status'] == "success") { + await getPromos(); + return true; + } + return false; + } catch (e) { + Get.snackbar("خطأ", "فشل إضافة كود الخصم: $e"); + return false; + } finally { + isLoading.value = false; + } + } + + Future deletePromo(String id) async { + try { + var response = await _crud.post(link: AppLink.deletePassengersPromo, payload: {"id": id}); + if (response != null && response is Map && response['status'] == "success") { + await getPromos(); + return true; + } + return false; + } catch (e) { + Get.snackbar("خطأ", "فشل حذف كود الخصم: $e"); + return false; + } + } + + Future updatePromo(Map data) async { + isLoading.value = true; + try { + var response = await _crud.post(link: AppLink.updatePassengersPromo, payload: data); + if (response != null && response is Map && response['status'] == "success") { + await getPromos(); + return true; + } + return false; + } catch (e) { + Get.snackbar("خطأ", "فشل تحديث كود الخصم: $e"); + return false; + } finally { + isLoading.value = false; + } + } +} diff --git a/siro_admin/lib/controller/admin/quality_controller.dart b/siro_admin/lib/controller/admin/quality_controller.dart new file mode 100644 index 0000000..e447327 --- /dev/null +++ b/siro_admin/lib/controller/admin/quality_controller.dart @@ -0,0 +1,102 @@ +import 'package:flutter/material.dart'; +import 'package:get/get.dart'; +import '../../constant/links.dart'; +import '../functions/crud.dart'; + +class QualityController extends GetxController { + bool isLoading = false; + List driversBlacklist = []; + List passengersBlacklist = []; + Map scorecardData = {}; + + Future fetchBlacklist() async { + isLoading = true; + update(); + try { + var res = await CRUD().post( + link: AppLink.blacklistManager, + payload: {"action_type": "get_all"}, + ); + if (res is Map && res['status'] == 'success') { + driversBlacklist = res['message']['drivers'] ?? []; + passengersBlacklist = res['message']['passengers'] ?? []; + } else { + Get.snackbar("Error", "Failed to fetch blacklist"); + } + } catch (e) { + Get.snackbar("Error", "Network error"); + } finally { + isLoading = false; + update(); + } + } + + Future unblockDriver(String phone) async { + try { + var res = await CRUD().post( + link: AppLink.blacklistManager, + payload: { + "action_type": "unblock_driver", + "phone": phone, + }, + ); + if (res is Map && res['status'] == 'success') { + Get.snackbar("Success", "Driver unblocked successfully"); + fetchBlacklist(); // Refresh + } else { + Get.snackbar("Error", res['message'] ?? "Failed to unblock driver"); + } + } catch (e) { + Get.snackbar("Error", "Network error"); + } + } + + Future unblockPassenger(String phoneNormalized) async { + try { + var res = await CRUD().post( + link: AppLink.blacklistManager, + payload: { + "action_type": "unblock_passenger", + "phone_normalized": phoneNormalized, + }, + ); + if (res is Map && res['status'] == 'success') { + Get.snackbar("Success", "Passenger unblocked successfully"); + fetchBlacklist(); // Refresh + } else { + Get.snackbar("Error", res['message'] ?? "Failed to unblock passenger"); + } + } catch (e) { + Get.snackbar("Error", "Network error"); + } + } + + Future fetchDriverScorecard(String driverId) async { + isLoading = true; + update(); + try { + var res = await CRUD().post( + link: AppLink.driverScorecard, + payload: {"driver_id": driverId}, + ); + if (res is Map && res['status'] == 'success') { + scorecardData = res['message']; + } else { + Get.snackbar("Error", "Failed to fetch scorecard"); + scorecardData = {}; + } + } catch (e) { + Get.snackbar("Error", "Network error"); + scorecardData = {}; + } finally { + isLoading = false; + update(); + } + } + + @override + void onInit() { + super.onInit(); + // fetchBlacklist() can be called when opening the page + } +} diff --git a/siro_admin/lib/controller/admin/register_captain_controller.dart b/siro_admin/lib/controller/admin/register_captain_controller.dart new file mode 100644 index 0000000..9aa95cc --- /dev/null +++ b/siro_admin/lib/controller/admin/register_captain_controller.dart @@ -0,0 +1,590 @@ +import 'dart:convert'; +import 'dart:ffi'; +import 'package:flutter/material.dart'; +import 'package:get/get.dart'; +import 'package:http/http.dart' as http; + +import '../../constant/api_key.dart'; +import '../../constant/box_name.dart'; +import '../../constant/colors.dart'; +import '../../constant/info.dart'; +import '../../constant/links.dart'; +import '../../constant/style.dart'; +import '../../main.dart'; +import '../functions/crud.dart'; + +class RegisterCaptainController extends GetxController { + bool isDriverSaved = false; + bool isCarSaved = false; + Map? arguments; + String? driverId; + String? email; + String? phone; + + @override + void onInit() { + super.onInit(); + arguments = Get.arguments; + initArguments(); + } + + void driveInit() { + arguments = Get.arguments; + initArguments(); + } + + void initArguments() { + if (arguments != null) { + driverId = arguments!['driverId']; + email = arguments!['email']; + phone = arguments!['phone_number']; + } else { + print('Arguments are null'); + } + } + + Map responseMap = {}; + Map responseCarLicenseMapJordan = {}; + Map responseBackCarLicenseMap = {}; + Map responseIdCardMap = {}; + Map responseIdCardDriverEgyptBack = {}; + Map responseForComplaint = {}; + Map responseIdCardDriverEgyptFront = {}; + Map responseIdEgyptFront = {}; + Map responseCriminalRecordEgypt = {}; + Map responseIdEgyptBack = {}; + Map responseIdEgyptDriverLicense = {}; + String? responseIdCardDriverEgypt1; + bool isloading = false; + var image; + DateTime now = DateTime.now(); + + bool isLoading = false; + Future allMethodForAI(String prompt, imagePath, driverID) async { + isLoading = true; + update(); + + var extractedString = await CRUD().arabicTextExtractByVisionAndAI( + imagePath: imagePath, driverID: driverID); + var json = jsonDecode(extractedString); + var textValues = extractTextFromLines(json); + // await Get.put(AI()).geminiAiExtraction(prompt, textValues, imagePath); + await Get.put(RegisterCaptainController()) + .anthropicAI(textValues, prompt, imagePath); + isLoading = false; + update(); + } + + String extractTextFromLines(Map jsonData) { + final readResult = jsonData['readResult']; + final blocks = readResult['blocks']; + + final StringBuffer buffer = StringBuffer(); + + for (final block in blocks) { + final lines = block['lines']; + for (final line in lines) { + final text = line['text']; + buffer.write(text); + buffer.write('\n'); + } + } + + return buffer.toString().trim(); + } + + List driverNotCompleteRegistration = []; + getDriverNotCompleteRegistration() async { + var res = await CRUD() + .get(link: AppLink.getDriverNotCompleteRegistration, payload: {}); + if (res != 'failure') { + var d = jsonDecode(res)['message']; + driverNotCompleteRegistration = d; + update(); + } else { + Get.snackbar(res, ''); + } + } + + final today = DateTime.now(); + + Future addDriverAndCarEgypt() async { + final expiryDate = responseIdEgyptDriverLicense['expiry_date']; + final expiryDateTime = DateTime.tryParse(expiryDate); + final isExpired = expiryDateTime != null && expiryDateTime.isBefore(today); + + final taxExpiryDate = responseIdCardDriverEgyptBack['tax_expiry']; + + // Get the inspection date from the response + final inspectionDate = responseIdCardDriverEgyptBack['inspection_date']; + final year = int.parse(inspectionDate.split('-')[0]); + // Try parsing the tax expiry date. If it fails, set it to null. + final taxExpiryDateTime = DateTime.tryParse(taxExpiryDate ?? ''); + final isExpiredCar = + taxExpiryDateTime != null && taxExpiryDateTime.isBefore(today); + + // Check if the inspection date is before today + final inspectionDateTime = DateTime(year, 1, 1); + final isInspectionExpired = inspectionDateTime.isBefore(today); + + if (isExpiredCar || isInspectionExpired) { + Get.defaultDialog( + title: 'Expired Driver’s License'.tr, + content: Column( + mainAxisSize: MainAxisSize.min, + children: [ + const Icon(Icons.warning, size: 48, color: Colors.red), + const SizedBox(height: 16), + Text( + 'Your driver’s license and/or car tax has expired. Please renew them before proceeding.' + .tr, + textAlign: TextAlign.center, + style: AppStyle.title, + ), + const SizedBox(height: 16), + IconButton( + onPressed: () async { + // await Get.find().speakText( + // 'Your driver’s license and/or car tax has expired. Please renew them before proceeding.' + // .tr, + // ); + }, + icon: const Icon(Icons.volume_up), + ), + ], + ), + actions: [ + TextButton( + onPressed: () { + Get.back(); + }, + child: const Text('OK'), + ), + ], + ); + } else if (isExpired) { + Get.defaultDialog( + title: 'Expired Driver’s License'.tr, + content: Column( + mainAxisSize: MainAxisSize.min, + children: [ + const Icon(Icons.warning, size: 48, color: Colors.red), + const SizedBox(height: 16), + Text( + 'Your driver’s license has expired. Please renew it before proceeding.' + .tr, + textAlign: TextAlign.center, + style: AppStyle.title, + ), + const SizedBox(height: 16), + IconButton( + onPressed: () async { + // await Get.find().speakText( + // 'Your driver’s license has expired. Please renew it before proceeding.' + // .tr, + // ); + }, + icon: const Icon(Icons.volume_up), + ), + ], + ), + actions: [ + TextButton( + onPressed: () { + Get.back(); + }, + child: const Text('OK'), + ), + ], + ); + } else if (responseIdEgyptDriverLicense['national_number'] + .toString() + .substring(0, 12) != + responseIdEgyptBack['nationalID'].toString().substring(0, 12)) { + Get.defaultDialog( + barrierDismissible: false, + title: 'ID Mismatch', + content: Column( + mainAxisSize: MainAxisSize.min, + children: [ + const Icon(Icons.warning, size: 48, color: Colors.red), + const SizedBox(height: 16), + Text( + 'The national number on your driver’s license does not match the one on your ID document. Please verify and provide the correct documents.' + .tr, + textAlign: TextAlign.center, + style: AppStyle.title, + ), + const SizedBox(height: 16), + IconButton( + onPressed: () async { + // await Get.find().speakText( + // 'The national number on your driver’s license does not match the one on your ID document. Please verify and provide the correct documents.', + // ); + }, + icon: const Icon(Icons.volume_up), + ), + ], + ), + actions: [ + TextButton( + onPressed: () { + Get.back(); + }, + child: const Text('OK'), + ), + ], + ); + } + // else if (responseCriminalRecordEgypt['FullName'] != + // responseIdEgyptDriverLicense['name_arabic']) { + // Get.defaultDialog( + // barrierDismissible: false, + // title: 'Criminal Record Mismatch', + // content: Column( + // mainAxisSize: MainAxisSize.min, + // children: [ + // const Icon(Icons.warning, size: 48, color: Colors.red), + // const SizedBox(height: 16), + // Text( + // 'The full name on your criminal record does not match the one on your driver’s license. Please verify and provide the correct documents.' + // .tr, + // textAlign: TextAlign.center, + // style: AppStyle.title, + // ), + // const SizedBox(height: 16), + // IconButton( + // onPressed: () async { + // await Get.find().speakText( + // 'The full name on your criminal record does not match the one on your driver’s license. Please verify and provide the correct documents.' + // .tr, + // ); + // }, + // icon: const Icon(Icons.volume_up), + // ), + // ], + // ), + // actions: [ + // TextButton( + // onPressed: () { + // Get.back(); + // }, + // child: const Text('OK'), + // ), + // ], + // ); + // } + else { + await addDriverEgypt(); + await addRegistrationCarEgypt(); + + if (isCarSaved && isDriverSaved) { + Get.snackbar('added', '', + backgroundColor: + AppColor.greenColor); // Get.offAll(() => HomeCaptain()); + // Get.offAll(() => HomeCaptain()); + } + } + } + + Future addDriverEgypt() async { + isLoading = true; + update(); + + var payload = { + 'first_name': responseIdEgyptDriverLicense['firstName']?.toString() ?? + 'Not specified', + 'last_name': responseIdEgyptDriverLicense['lastName']?.toString() ?? + 'Not specified', + 'email': email?.toString() ?? 'Not specified', + 'phone': phone?.toString() ?? 'Not specified', + 'id': driverId?.toString() ?? 'Not specified', + 'password': '123456', + 'gender': responseIdEgyptBack['gender']?.toString() ?? 'Not specified', + 'license_type': + responseIdEgyptDriverLicense['license_type']?.toString() ?? + 'Not specified', + 'national_number': + responseIdEgyptBack['nationalID']?.toString() ?? 'Not specified', + 'name_arabic': responseIdEgyptDriverLicense['name_arabic']?.toString() ?? + 'Not specified', + 'name_english': + responseIdEgyptDriverLicense['name_english']?.toString() ?? + 'Not specified', + 'issue_date': responseIdEgyptDriverLicense['issue_date']?.toString() ?? + 'Not specified', + 'expiry_date': responseIdEgyptDriverLicense['expiry_date']?.toString() ?? + 'Not specified', + 'license_categories': responseIdEgyptDriverLicense['license_categories'] + is List + ? responseIdEgyptDriverLicense['license_categories'].join(', ') + : responseIdEgyptDriverLicense['license_categories']?.toString() ?? + 'Not specified', + 'address': responseIdEgyptFront['address']?.toString() ?? 'Not specified', + 'card_id': responseIdEgyptFront['card_id']?.toString() ?? 'Not specified', + 'occupation': + responseIdEgyptBack['occupation']?.toString() ?? 'Not specified', + 'education': + responseIdEgyptBack['occupation']?.toString() ?? 'Not specified', + 'licenseIssueDate': + responseIdEgyptDriverLicense['issue_date']?.toString() ?? + 'Not specified', + 'religion': + responseIdEgyptBack['religion']?.toString() ?? 'Not specified', + 'status': 'yet', + 'birthdate': responseIdEgyptFront['dob']?.toString() ?? 'Not specified', + 'maritalStatus': + responseIdEgyptBack['maritalStatus']?.toString() ?? 'Not specified', + 'site': responseIdEgyptDriverLicense['address']?.toString() ?? + 'Not specified', + 'employmentType': + responseIdEgyptDriverLicense['employmentType']?.toString() ?? + 'Not specified', + }; + var res = await CRUD().post(link: AppLink.signUpCaptin, payload: payload); + var status1 = jsonDecode(res); + isLoading = false; + update(); + // Handle response + if (status1['status'] == 'success') { + isDriverSaved = true; + Get.snackbar('Success', 'Driver data saved successfully', + backgroundColor: AppColor.greenColor); + } else { + Get.snackbar('Error', 'Failed to save driver data', + backgroundColor: Colors.red); + } + } + + addCriminalDeocuments() async { + var res = await CRUD().post(link: AppLink.addCriminalDocuments, payload: { + "driverId": box.read(BoxName.driverID), + "IssueDate": responseCriminalRecordEgypt['IssueDate'], + "InspectionResult": responseCriminalRecordEgypt['InspectionResult'], + }); + if (res != 'failure') { + Get.snackbar('uploaded sucssefuly'.tr, ''); + } + } + + Future addRegistrationCarEgypt() async { + try { + isLoading = true; + update(); + var res = await CRUD().post(link: AppLink.addRegisrationCar, payload: { + 'driverID': driverId, + 'vin': responseIdCardDriverEgyptBack['chassis'].toString(), + 'car_plate': responseIdCardDriverEgyptFront['car_plate'].toString(), + 'make': responseIdCardDriverEgyptBack['make'].toString(), + 'model': responseIdCardDriverEgyptBack['model'], + 'year': responseIdCardDriverEgyptBack['year'].toString(), + 'expiration_date': + responseIdCardDriverEgyptFront['LicenseExpirationDate'].toString(), + 'color': responseIdCardDriverEgyptBack['color'], + 'owner': responseIdCardDriverEgyptFront['owner'], + 'color_hex': responseIdCardDriverEgyptBack['color_hex'].toString(), + 'address': responseIdCardDriverEgyptFront['address'].toString(), + 'displacement': responseIdCardDriverEgyptBack['engine'].toString(), + 'fuel': responseIdCardDriverEgyptBack['fuel'].toString(), + 'registration_date': + '${responseIdCardDriverEgyptBack['inspection_date']}', + }); + isLoading = false; + update(); + var status = jsonDecode(res); + if (status['status'] == 'success') { + isCarSaved = true; + Get.snackbar('Success', 'message', + backgroundColor: AppColor.greenColor); + } + } catch (e) {} + } + + Future getComplaintDataToAI() async { + var res = await CRUD().get( + link: AppLink.getComplaintAllDataForDriver, + payload: {'driver_id': driverId.toString()}, + ); + if (res != 'failure') { + var d = jsonDecode(res)['message']; + return d; + } else { + return [ + {'data': 'no data'} + ]; + } + } + + Future anthropicAIForComplaint() async { + var dataComplaint = await getComplaintDataToAI(); + var messagesData = [ + { + "role": "user", + "content": [ + { + "type": "text", + "text": "$dataComplaint ${AppInformation.complaintPrompt} " + } + ] + } + ]; + var requestBody = jsonEncode({ + "model": "claude-3-haiku-20240307", + "max_tokens": 1024, + "temperature": 0, + "system": "Json output only without any additional ", + "messages": messagesData, + }); + final response = await http.post( + Uri.parse('https://api.anthropic.com/v1/messages'), + headers: { + 'x-api-key': AK.anthropicAIkeySeferNew, + 'anthropic-version': '2023-06-01', + 'content-type': 'application/json' + }, + body: requestBody, + ); + if (response.statusCode == 200) { + var responseData = jsonDecode(utf8.decode(response.bodyBytes)); + // Process the responseData as needed + + responseForComplaint = jsonDecode(responseData['content'][0]['text']); + } + } + + Future anthropicAI( + String payload, String prompt, String idType) async { + var messagesData = [ + { + "role": "user", + "content": [ + {"type": "text", "text": "$payload $prompt"} + ] + } + ]; + + var requestBody = jsonEncode({ + "model": "claude-3-haiku-20240307", + "max_tokens": 1024, + "temperature": 0, + "system": "Json output only without any additional ", + "messages": messagesData, + }); + + final response = await http.post( + Uri.parse('https://api.anthropic.com/v1/messages'), + headers: { + 'x-api-key': AK.anthropicAIkeySeferNew, + 'anthropic-version': '2023-06-01', + 'content-type': 'application/json' + }, + body: requestBody, + ); + + if (response.statusCode == 200) { + var responseData = jsonDecode(utf8.decode(response.bodyBytes)); + // Process the responseData as needed + if (idType == 'car_back') { + responseIdCardDriverEgyptBack = + jsonDecode(responseData['content'][0]['text']); + } else if (idType == 'car_front') { + responseIdCardDriverEgyptFront = + jsonDecode(responseData['content'][0]['text']); + } else if (idType == 'id_front') { + responseIdEgyptFront = jsonDecode(responseData['content'][0]['text']); + } else if (idType == 'id_back') { + responseIdEgyptBack = jsonDecode(responseData['content'][0]['text']); + } else if (idType == 'driver_license') { + responseIdEgyptDriverLicense = + jsonDecode(responseData['content'][0]['text']); + } else if (idType == 'criminalRecord') { + responseCriminalRecordEgypt = + jsonDecode(responseData['content'][0]['text']); + } + + update(); + return responseData.toString(); + } + return responseIdCardDriverEgyptBack.toString(); + } + + Future geminiAiExtraction(String prompt, payload, String idType) async { + var requestBody = jsonEncode({ + "contents": [ + { + "parts": [ + {"text": "$payload $prompt"} + ] + } + ], + "generationConfig": { + "temperature": 1, + "topK": 64, + "topP": 0.95, + "maxOutputTokens": 8192, + "stopSequences": [] + }, + "safetySettings": [ + { + "category": "HARM_CATEGORY_HARASSMENT", + "threshold": "BLOCK_MEDIUM_AND_ABOVE" + }, + { + "category": "HARM_CATEGORY_HATE_SPEECH", + "threshold": "BLOCK_MEDIUM_AND_ABOVE" + }, + { + "category": "HARM_CATEGORY_SEXUALLY_EXPLICIT", + "threshold": "BLOCK_MEDIUM_AND_ABOVE" + }, + { + "category": "HARM_CATEGORY_DANGEROUS_CONTENT", + "threshold": "BLOCK_MEDIUM_AND_ABOVE" + } + ] + }); + + final response = await http.post( + Uri.parse( + // 'https://generativelanguage.googleapis.com/v1beta/models/gemini-pro-vision:generateContent?key=${AK.geminiApi}'), + // 'https://generativelanguage.googleapis.com/v1beta/models/gemini-1.5-pro-latest:generateContent?key=${AK.geminiApi}'), + 'https://generativelanguage.googleapis.com/v1beta/models/gemini-1.0-pro:generateContent?key=${AK.geminiApi}'), + headers: {'Content-Type': 'application/json'}, + body: requestBody, + ); + + if (response.statusCode == 200) { + var responseData = jsonDecode(response.body); + // Process the responseData as needed + + var result = responseData['candidates'][0]['content']['parts'][0]['text']; + RegExp regex = RegExp(r"```json([^`]*)```"); + String? jsonString = + regex.firstMatch(responseData.toString())?.group(1)?.trim(); + + if (jsonString != null) { + // Convert the JSON object to a String + jsonString = jsonEncode(json.decode(jsonString)); + + if (idType == 'car_back') { + responseIdCardDriverEgyptBack = jsonDecode(jsonString); + } else if (idType == 'car_front') { + responseIdCardDriverEgyptFront = jsonDecode(jsonString); + } else if (idType == 'id_front') { + responseIdEgyptFront = jsonDecode(jsonString); + } else if (idType == 'id_back') { + responseIdEgyptBack = jsonDecode(jsonString); + } else if (idType == 'driver_license') { + responseIdEgyptDriverLicense = jsonDecode(jsonString); + } + + update(); + } else { + Get.snackbar('Error', "JSON string not found", + backgroundColor: AppColor.redColor); + } + + // Rest of your code... + } else {} + } +} diff --git a/siro_admin/lib/controller/admin/ride_admin_controller.dart b/siro_admin/lib/controller/admin/ride_admin_controller.dart new file mode 100644 index 0000000..ee1ffcd --- /dev/null +++ b/siro_admin/lib/controller/admin/ride_admin_controller.dart @@ -0,0 +1,73 @@ +import 'dart:convert'; + +import 'package:fl_chart/fl_chart.dart'; +import 'package:get/get.dart'; + +import '../../constant/links.dart'; +import '../../models/model/admin/monthly_ride.dart'; +import '../functions/crud.dart'; + +class RideAdminController extends GetxController { + bool isLoading = false; + late List rideData; + late Map jsonResponse; + List ridesDetails = []; + var chartData; + // late List chartDatasync; + Future getRidesAdminDash() async { + isLoading = true; + update(); + var res = await CRUD().get(link: AppLink.getRidesPerMonth, payload: {}); + jsonResponse = jsonDecode(res); + rideData = (jsonResponse['message'] as List) + .map((item) => MonthlyDataModel.fromJson(item)) + .toList(); + + chartData = rideData + .map((data) => FlSpot(data.day.toDouble(), data.ridesCount.toDouble())) + .toList(); + + // chartDatasync = (jsonResponse['message'] as List) + // .map((item) => ChartDataS( + // item['year'], + // item['month'], + // item['day'], + // item['rides_count'], + // )) + // .toList(); + isLoading = false; + update(); + } + + Future getRidesDetails() async { + // isLoading = true; + // update(); + var res = await CRUD().get(link: AppLink.getRidesDetails, payload: {}); + + var d = jsonDecode(res); + ridesDetails = d['message']; + + // isLoading = false; + // update(); + } + + @override + void onInit() async { + List initializationTasks = [ + getRidesAdminDash(), + getRidesDetails(), + ]; + // cameras = await availableCameras(); + await Future.wait(initializationTasks); + super.onInit(); + } +} + +// class ChartDataS { +// ChartDataS(this.year, this.month, this.day, this.ridesCount); + +// final int year; +// final int month; +// final int day; +// final int ridesCount; +// } diff --git a/siro_admin/lib/controller/admin/security_v2_controller.dart b/siro_admin/lib/controller/admin/security_v2_controller.dart new file mode 100644 index 0000000..7ba1493 --- /dev/null +++ b/siro_admin/lib/controller/admin/security_v2_controller.dart @@ -0,0 +1,62 @@ +import 'dart:convert'; +import 'package:flutter/material.dart'; +import 'package:get/get.dart'; +import 'package:siro_admin/constant/links.dart'; +import 'package:siro_admin/controller/functions/crud.dart'; +import '../../print.dart'; + +class SecurityV2Controller extends GetxController { + bool isLoading = true; + List auditLogs = []; + + @override + void onInit() { + super.onInit(); + fetchAuditLogs(); + } + + Future fetchAuditLogs() async { + isLoading = true; + update(); + + try { + Log.print('Fetching from: ${AppLink.auditLogsV2}'); + var res = await CRUD().get(link: AppLink.auditLogsV2, payload: {}); + Log.print('Raw audit res type: ${res.runtimeType} | value: $res'); + + if (res == 'failure' || res == 'token_expired') { + Log.print('CRUD returned: $res'); + Get.snackbar("خطأ بالاتصال", "السيرفر أرجع: $res", + backgroundColor: const Color(0x88FF0000), + colorText: const Color(0xFFFFFFFF)); + auditLogs = []; + } else if (res != null) { + var d = res is String ? jsonDecode(res) : res; + Log.print('Decoded audit response: $d'); + if (d['status'] == 'success') { + var message = d['message']; + if (message is List) { + auditLogs = message; + Log.print('Loaded ${auditLogs.length} audit logs'); + } else { + auditLogs = []; + Log.print('message is not List: ${message.runtimeType}'); + } + } else { + Log.print('Status not success: ${d['status']}'); + Get.snackbar("خطأ من السيرفر", "${d['message'] ?? d['status']}", + backgroundColor: const Color(0x88FF0000), + colorText: const Color(0xFFFFFFFF)); + } + } + } catch (e) { + Log.print('Error fetching audit logs: $e'); + Get.snackbar("خطأ برمجي", "$e", + backgroundColor: const Color(0x88FF0000), + colorText: const Color(0xFFFFFFFF)); + } + + isLoading = false; + update(); + } +} diff --git a/siro_admin/lib/controller/admin/staff_controller.dart b/siro_admin/lib/controller/admin/staff_controller.dart new file mode 100644 index 0000000..ad09666 --- /dev/null +++ b/siro_admin/lib/controller/admin/staff_controller.dart @@ -0,0 +1,81 @@ +import 'package:flutter/material.dart'; +import 'package:get/get.dart'; +import '../../constant/links.dart'; +import '../functions/crud.dart'; +import '../functions/device_info.dart'; +import '../../views/widgets/snackbar.dart'; + +class StaffController extends GetxController { + final CRUD _crud = CRUD(); + final formKey = GlobalKey(); + + // التكست كنترولرز + final nameController = TextEditingController(); + final phoneController = TextEditingController(); + final emailController = TextEditingController(); + final passwordController = TextEditingController(); + final birthdateController = TextEditingController(); + + String selectedGender = 'Male'; + String selectedRole = 'service'; // 'admin' or 'service' + + bool isLoading = false; + + Future registerStaff() async { + if (!formKey.currentState!.validate()) return; + + isLoading = true; + update(); + + try { + // ملاحظة: لا نأخذ بصمة جهاز الأدمن هنا، بل نتركها فارغة ليقوم الموظف بربطها عند أول دخول له + String fingerprint = ""; + + var response = await _crud.post( + link: AppLink.addStaff, + payload: { + "name": nameController.text.trim(), + "phone": phoneController.text.trim(), + "email": emailController.text.trim(), + "password": passwordController.text.trim(), + "role": selectedRole, + "gender": selectedGender, + "birthdate": birthdateController.text.trim(), + "fingerprint": fingerprint, + "site": "main", // القيمة الافتراضية للفرع + }, + ); + + if (response != "failure") { + mySnackbarSuccess('تمت إضافة الموظف بنجاح'); + _clearFields(); + Get.back(); + } else { + mySnackeBarError('فشل في إضافة الموظف. يرجى المحاولة لاحقاً'); + } + } catch (e) { + mySnackeBarError('حدث خطأ: $e'); + } finally { + isLoading = false; + update(); + } + } + + void _clearFields() { + nameController.clear(); + phoneController.clear(); + emailController.clear(); + passwordController.clear(); + birthdateController.clear(); + } + + @override + void onClose() { + nameController.dispose(); + phoneController.dispose(); + emailController.dispose(); + passwordController.dispose(); + birthdateController.dispose(); + super.onClose(); + } +} diff --git a/siro_admin/lib/controller/admin/static_controller.dart b/siro_admin/lib/controller/admin/static_controller.dart new file mode 100644 index 0000000..05db94a --- /dev/null +++ b/siro_admin/lib/controller/admin/static_controller.dart @@ -0,0 +1,512 @@ +import 'dart:convert'; +import 'package:fl_chart/fl_chart.dart'; +import 'package:flutter/material.dart'; +import 'package:get/get.dart'; +import 'package:intl/intl.dart'; + +import '../../constant/links.dart'; +import '../../print.dart'; +import '../functions/crud.dart'; + +// ══════════════════════════════════════════════════════════════ +// MODEL: Represents one employee's full data for a period +// ══════════════════════════════════════════════════════════════ +class EmployeeChartData { + final String name; + final Color color; + final List notesSpots; + final List callsSpots; + + const EmployeeChartData({ + required this.name, + required this.color, + required this.notesSpots, + required this.callsSpots, + }); + + int get totalNotes => notesSpots.fold(0, (sum, s) => sum + s.y.toInt()); + int get totalCalls => callsSpots.fold(0, (sum, s) => sum + s.y.toInt()); + + EmployeeChartData copyWith({ + List? notesSpots, + List? callsSpots, + }) { + return EmployeeChartData( + name: name, + color: color, + notesSpots: notesSpots ?? this.notesSpots, + callsSpots: callsSpots ?? this.callsSpots, + ); + } +} + +// ══════════════════════════════════════════════════════════════ +// MODEL: Employment activation stats per employee +// ══════════════════════════════════════════════════════════════ +class EmploymentStat { + final String name; + final int count; + final Color color; + + const EmploymentStat({ + required this.name, + required this.count, + required this.color, + }); +} + +// ══════════════════════════════════════════════════════════════ +// CONTROLLER +// ══════════════════════════════════════════════════════════════ +class StaticController extends GetxController { + // ─── Color Palette for Dynamic Employees ─────────────────── + static const List _employeeColors = [ + Color(0xFF00D4AA), // teal + Color(0xFF82AAFF), // blue + Color(0xFFFFCB6B), // amber + Color(0xFFC792EA), // purple + Color(0xFFFF5370), // red + Color(0xFFC3E88D), // green + Color(0xFFF07178), // coral + Color(0xFF89DDFF), // cyan + ]; + + Color _colorForIndex(int i) => _employeeColors[i % _employeeColors.length]; + + // ─── Date & State ─────────────────────────────────────────── + DateTime? startDate = DateTime(DateTime.now().year, DateTime.now().month, 1); + DateTime? endDate = + DateTime(DateTime.now().year, DateTime.now().month + 1, 0); + + DateTime? compareStartDate; + DateTime? compareEndDate; + + bool isComparing = false; + bool isLoading = false; + + // ─── Daily Notes State ───────────────────────────────────── + bool isLoadingNotes = false; + List dailyNotesList = []; + + // ─── Main Chart Data ─────────────────────────────────────── + List chartDataPassengers = []; + List chartDataDrivers = []; + List chartDataRides = []; + List chartDataDriversMatchingNotes = []; + + List chartDataPassengersCompare = []; + List chartDataDriversCompare = []; + List chartDataRidesCompare = []; + List chartDataDriversMatchingNotesCompare = []; + + // ─── 🔥 DYNAMIC Employee Data ───────────────────────────── + // Key = employee name (from server), Value = their chart data + Map employeeData = {}; + Map employeeDataCompare = {}; + + // Set of all known employee names (union of current + compare) + Set get allEmployeeNames => { + ...employeeData.keys, + ...employeeDataCompare.keys, + }; + + // ─── Employment Stats ────────────────────────────────────── + List employmentStatsList = []; + + // ─── Totals ──────────────────────────────────────────────── + String totalMonthlyPassengers = '0'; + String totalMonthlyRides = '0'; + String totalMonthlyDrivers = '0'; + + // ─── Raw Lists ───────────────────────────────────────────── + List staticList = []; + + // ─── Color Registry (stable across rebuilds) ─────────────── + final Map _employeeColorRegistry = {}; + + Color _getOrAssignColor(String name) { + if (!_employeeColorRegistry.containsKey(name)) { + _employeeColorRegistry[name] = + _colorForIndex(_employeeColorRegistry.length); + } + return _employeeColorRegistry[name]!; + } + + @override + void onInit() { + super.onInit(); + getAll(); + } + + // ─── Helpers ─────────────────────────────────────────────── + double get daysInPeriod { + if (startDate == null || endDate == null) return 31; + return endDate!.difference(startDate!).inDays + 1.0; + } + + String get currentDateString { + if (startDate == null || endDate == null) return ""; + return "${DateFormat('yyyy-MM-dd').format(startDate!)} : " + "${DateFormat('yyyy-MM-dd').format(endDate!)}"; + } + + String get compareDateString { + if (compareStartDate == null || compareEndDate == null) return ""; + return "${DateFormat('yyyy-MM-dd').format(compareStartDate!)} : " + "${DateFormat('yyyy-MM-dd').format(compareEndDate!)}"; + } + + // ─── Date Actions ────────────────────────────────────────── + void updateDateRange(DateTime start, DateTime end) { + startDate = start; + endDate = end; + if (isComparing) _calculateCompareDates(); + getAll(); + update(); + } + + void _calculateCompareDates() { + if (startDate == null || endDate == null) return; + Duration duration = endDate!.difference(startDate!); + compareEndDate = startDate!.subtract(const Duration(days: 1)); + compareStartDate = compareEndDate!.subtract(duration); + } + + Future toggleComparison() async { + isComparing = !isComparing; + if (isComparing) { + _calculateCompareDates(); + } else { + compareStartDate = null; + compareEndDate = null; + _clearComparisonData(); + } + await getAll(); + } + + void _clearComparisonData() { + chartDataPassengersCompare.clear(); + chartDataDriversCompare.clear(); + chartDataRidesCompare.clear(); + chartDataDriversMatchingNotesCompare.clear(); + employeeDataCompare.clear(); + } + + Map _getPayload(DateTime start, DateTime end) => { + "start_date": DateFormat('yyyy-MM-dd').format(start), + "end_date": DateFormat('yyyy-MM-dd').format(end), + "month": start.month.toString(), + "year": start.year.toString(), + }; + + // ─── Main Fetch ──────────────────────────────────────────── + Future getAll() async { + if (startDate == null || endDate == null) return; + + isLoading = true; + update(); + + await Future.wait([ + fetchPassengers(isCompare: false), + fetchRides(isCompare: false), + fetchDrivers(isCompare: false), + fetchEmployeeDynamic(isCompare: false), + fetchEditorCallsDynamic(isCompare: false), + fetchEmploymentStats(), + ]); + + if (isComparing && compareStartDate != null && compareEndDate != null) { + await Future.wait([ + fetchPassengers(isCompare: true), + fetchRides(isCompare: true), + fetchDrivers(isCompare: true), + fetchEmployeeDynamic(isCompare: true), + fetchEditorCallsDynamic(isCompare: true), + ]); + } + + isLoading = false; + update(); + } + + // ─── Spot Generator ─────────────────────────────────────── + List _generateSpots( + List data, + String dateKey, + String valueKey, + DateTime startOfRange, + DateTime endOfRange, + ) { + Map dataMap = { + for (var item in data) + item[dateKey].toString(): + double.tryParse(item[valueKey].toString()) ?? 0.0 + }; + + int totalDays = endOfRange.difference(startOfRange).inDays + 1; + return List.generate(totalDays, (i) { + final date = startOfRange.add(Duration(days: i)); + final key = DateFormat('yyyy-MM-dd').format(date); + return FlSpot((i + 1).toDouble(), dataMap[key] ?? 0.0); + }); + } + + /// Generates spots map keyed by employee name from a date→name→value structure + Map> _generateEmployeeSpots( + Map> dateNameMap, + DateTime start, + DateTime end, + ) { + // Discover all employee names dynamically + final Set names = {}; + for (var dayData in dateNameMap.values) { + names.addAll(dayData.keys); + } + + int totalDays = end.difference(start).inDays + 1; + final Map> result = {}; + + for (final name in names) { + result[name] = List.generate(totalDays, (i) { + final date = start.add(Duration(days: i)); + final dateStr = DateFormat('yyyy-MM-dd').format(date); + final value = dateNameMap[dateStr]?[name] ?? 0.0; + return FlSpot((i + 1).toDouble(), value); + }); + } + return result; + } + + /// Parses a list of {date/day, NAME, count} records into a dateNameMap + Map> _parseDateNameMap(List jsonData) { + final Map> result = {}; + for (var item in jsonData) { + final dateStr = (item['date'] ?? item['day']).toString(); + final name = item['NAME'].toString().toLowerCase().trim(); + final count = double.tryParse(item['count'].toString()) ?? 0.0; + result.putIfAbsent(dateStr, () => {})[name] = + (result[dateStr]?[name] ?? 0) + count; + } + return result; + } + + // ─── Passengers ─────────────────────────────────────────── + Future fetchPassengers({bool isCompare = false}) async { + final start = isCompare ? compareStartDate! : startDate!; + final end = isCompare ? compareEndDate! : endDate!; + final res = await CRUD().get( + link: AppLink.getPassengersStatic, payload: _getPayload(start, end)); + final json = jsonDecode(res); + if (json['status'] == 'failure') return; + final List data = json['message']; + if (!isCompare && data.isNotEmpty && data[0]['totalMonthly'] != null) { + totalMonthlyPassengers = data[0]['totalMonthly'].toString(); + } + final spots = _generateSpots(data, 'day', 'totalPassengers', start, end); + if (isCompare) + chartDataPassengersCompare = spots; + else + chartDataPassengers = spots; + } + + // ─── Rides ──────────────────────────────────────────────── + Future fetchRides({bool isCompare = false}) async { + final start = isCompare ? compareStartDate! : startDate!; + final end = isCompare ? compareEndDate! : endDate!; + final res = await CRUD() + .get(link: AppLink.getRidesStatic, payload: _getPayload(start, end)); + final json = jsonDecode(res); + if (json['status'] == 'failure') return; + final List data = json['message']; + if (!isCompare && data.isNotEmpty && data[0]['totalMonthly'] != null) { + totalMonthlyRides = data[0]['totalMonthly'].toString(); + } + final spots = _generateSpots(data, 'day', 'totalRides', start, end); + if (isCompare) + chartDataRidesCompare = spots; + else + chartDataRides = spots; + } + + // ─── Drivers ────────────────────────────────────────────── + Future fetchDrivers({bool isCompare = false}) async { + final start = isCompare ? compareStartDate! : startDate!; + final end = isCompare ? compareEndDate! : endDate!; + final res = await CRUD().get( + link: AppLink.getdriverstotalMonthly, payload: _getPayload(start, end)); + final json = jsonDecode(res); + if (json['status'] == 'failure') return; + final List data = json['message']; + if (!isCompare && + data.isNotEmpty && + data[0]['totalMonthlyDrivers'] != null) { + totalMonthlyDrivers = data[0]['totalMonthlyDrivers'].toString(); + staticList = data; + } + final spotsDrivers = + _generateSpots(data, 'day', 'dailyTotalDrivers', start, end); + final spotsNotes = + _generateSpots(data, 'day', 'dailyMatchingNotes', start, end); + if (isCompare) { + chartDataDriversCompare = spotsDrivers; + chartDataDriversMatchingNotesCompare = spotsNotes; + } else { + chartDataDrivers = spotsDrivers; + chartDataDriversMatchingNotes = spotsNotes; + } + } + + // ─── 🔥 DYNAMIC: Employee Notes ─────────────────────────── + Future fetchEmployeeDynamic({bool isCompare = false}) async { + try { + final start = isCompare ? compareStartDate! : startDate!; + final end = isCompare ? compareEndDate! : endDate!; + final res = await CRUD().get( + link: AppLink.getEmployeeStatic, payload: _getPayload(start, end)); + if (res == 'failure') return; + final json = jsonDecode(res) as Map; + if (json['status'] == 'failure') return; + final List data = json['message']; + if (data.isEmpty) return; + + final dateNameMap = _parseDateNameMap(data); + final spotsMap = _generateEmployeeSpots(dateNameMap, start, end); + + // Merge into employee data map + final target = isCompare ? employeeDataCompare : employeeData; + + spotsMap.forEach((name, spots) { + final color = _getOrAssignColor(name); + if (target.containsKey(name)) { + target[name] = target[name]!.copyWith(notesSpots: spots); + } else { + target[name] = EmployeeChartData( + name: name, + color: color, + notesSpots: spots, + callsSpots: [], + ); + } + }); + } catch (e) { + Log.print('Error in fetchEmployeeDynamic: $e'); + } + } + + // ─── 🔥 DYNAMIC: Employee Calls ─────────────────────────── + Future fetchEditorCallsDynamic({bool isCompare = false}) async { + try { + final start = isCompare ? compareStartDate! : startDate!; + final end = isCompare ? compareEndDate! : endDate!; + final res = await CRUD().get( + link: AppLink.getEditorStatsCalls, payload: _getPayload(start, end)); + if (res == 'failure') return; + final json = jsonDecode(res) as Map; + if (json['status'] == 'failure') return; + final List data = json['message']; + if (data.isEmpty) return; + + final dateNameMap = _parseDateNameMap(data); + final spotsMap = _generateEmployeeSpots(dateNameMap, start, end); + + final target = isCompare ? employeeDataCompare : employeeData; + + spotsMap.forEach((name, spots) { + final color = _getOrAssignColor(name); + if (target.containsKey(name)) { + target[name] = target[name]!.copyWith(callsSpots: spots); + } else { + target[name] = EmployeeChartData( + name: name, + color: color, + notesSpots: [], + callsSpots: spots, + ); + } + }); + } catch (e) { + Log.print('Error in fetchEditorCallsDynamic: $e'); + } + } + + // ─── Employment Stats ───────────────────────────────────── + Future fetchEmploymentStats() async { + try { + final res = await CRUD().get( + link: AppLink.getEmployeeDriverAfterCallingRegister, + payload: _getPayload(startDate!, endDate!)); + if (res == 'failure') return; + final json = jsonDecode(res); + if (json['status'] != 'success') return; + final List data = json['message']?['data'] ?? []; + + // Aggregate by name (dynamic — no hardcoded allowed list) + final Map aggregated = {}; + for (var item in data) { + final name = item['employmentType'].toString().toLowerCase().trim(); + final count = int.tryParse(item['count'].toString()) ?? 0; + aggregated[name] = (aggregated[name] ?? 0) + count; + } + + employmentStatsList = aggregated.entries.map((e) { + return EmploymentStat( + name: e.key, + count: e.value, + color: _getOrAssignColor(e.key), + ); + }).toList() + ..sort((a, b) => b.count.compareTo(a.count)); // sort descending + } catch (e) { + Log.print("Error fetchEmploymentStats: $e"); + } + } + + // ─── Daily Notes ────────────────────────────────────────── + Future fetchDailyNotes(DateTime date) async { + try { + isLoadingNotes = true; + dailyNotesList.clear(); + update(); + + final res = await CRUD().post( + link: AppLink.getNotesForEmployee, + payload: {"date": DateFormat('yyyy-MM-dd').format(date)}); + + if (res != 'failure') { + final json = res; + if (json['status'] == 'success') { + dailyNotesList = json['message']; + } + } + } catch (e) { + Log.print("Error fetchDailyNotes: $e"); + } finally { + isLoadingNotes = false; + update(); + } + } + + // ─── Computed Summaries for UI ──────────────────────────── + + /// Returns sorted list of employees by total notes descending + List get employeesSortedByNotes { + final list = employeeData.values.toList(); + list.sort((a, b) => b.totalNotes.compareTo(a.totalNotes)); + return list; + } + + /// Returns sorted list of employees by total calls descending + List get employeesSortedByCalls { + final list = employeeData.values.toList(); + list.sort((a, b) => b.totalCalls.compareTo(a.totalCalls)); + return list; + } + + /// Grand total notes across all employees + int get grandTotalNotes => + employeeData.values.fold(0, (s, e) => s + e.totalNotes); + + /// Grand total calls across all employees + int get grandTotalCalls => + employeeData.values.fold(0, (s, e) => s + e.totalCalls); +} diff --git a/siro_admin/lib/controller/admin/wallet_admin_controller.dart b/siro_admin/lib/controller/admin/wallet_admin_controller.dart new file mode 100644 index 0000000..f26a5c3 --- /dev/null +++ b/siro_admin/lib/controller/admin/wallet_admin_controller.dart @@ -0,0 +1,195 @@ +import 'dart:async'; +import 'dart:convert'; + +import 'package:get/get.dart'; +import 'package:http/http.dart' as http; +import '../../constant/api_key.dart'; +import '../../constant/box_name.dart'; +import '../../constant/links.dart'; +import '../../main.dart'; +import '../../print.dart'; +import '../functions/crud.dart'; + +class WalletAdminController extends GetxController { + bool isLoading = false; + + late Map jsonResponse; + List walletDetails = []; + List driversWalletPoints = []; + + @override + void onInit() { + getWalletForEachDriverToPay(); + super.onInit(); + } + + Future getWalletAdminDash() async { + isLoading = true; + update(); + var res = await CRUD().get(link: AppLink.getRidesPerMonth, payload: {}); + jsonResponse = jsonDecode(res); + } + + Future payToBankDriverAll() async { + for (var i = 0; i < driversWalletPoints.length; i++) { + String token = await getToken(); + await Future.delayed(const Duration(seconds: 1)); + try { + await payToDriverBankAccount( + token, + driversWalletPoints[i]['total_amount'].toString(), + driversWalletPoints[i]['accountBank'].toString(), + driversWalletPoints[i]['bankCode'].toString(), + driversWalletPoints[i]['name_arabic'].toString(), + driversWalletPoints[i]['driverID'].toString(), + driversWalletPoints[i]['phone'].toString(), + driversWalletPoints[i]['email'].toString(), + ); + await Future.delayed(const Duration(seconds: 3)); + } on FormatException catch (e) { + // Handle the error or rethrow the exception as needed + } + } + } + + Future payToDriverBankAccount( + String token, + String amount, + String bankCardNumber, + String bankCode, + String name, + String driverId, + String phone, + String email) async { + var headers = { + 'Authorization': 'Bearer $token', + 'Content-Type': 'application/json', + }; + + var body = jsonEncode({ + "issuer": "bank_card", + "amount": amount, + "full_name": name, + "bank_card_number": bankCardNumber, + "bank_code": bankCode, + "bank_transaction_type": "cash_transfer" + }); + + var response = await http.post( + Uri.parse( + 'https://stagingpayouts.paymobsolutions.com/api/secure/disburse/'), + headers: headers, + body: body); + + if (response.statusCode == 200) { + var d = jsonDecode(response.body); + + if (d['status_description'] == + "Transaction received and validated successfully. Dispatched for being processed by the bank") { + await addPayment('payFromSeferToDriver', driverId, + ((-1) * double.parse(amount)).toString()); + await addSeferWallet('payFromSeferToDriver', driverId, + ((-1) * double.parse(amount)).toString()); + await updatePaymentToPaid(driverId); + await sendEmail(driverId, amount, phone, name, bankCardNumber, email); + } + } else {} + } + + // String paymentToken = ''; + Future generateToken(String amount) async { + var res = await CRUD().post(link: AppLink.addPaymentTokenDriver, payload: { + 'driverID': box.read(BoxName.driverID).toString(), + 'amount': amount.toString(), + }); + var d = jsonDecode(res); + return d['message']; + } + + Future sendEmail( + String driverId, amount, phone, name, bankCardNumber, email) async { + await CRUD().sendEmail(AppLink.sendEmailToDrivertransaction, { + "driverID": driverId, + "total_amount": amount, + "phone": phone, + "name_arabic": name, + "accountBank": bankCardNumber, + "email": email + }); + } + + Future addSeferWallet( + String paymentMethod, String driverID, String point) async { + var seferToken = await generateToken(point.toString()); + await CRUD().post(link: AppLink.addSeferWallet, payload: { + 'amount': point.toString(), + 'paymentMethod': paymentMethod, + 'passengerId': 'driver', + 'token': seferToken, + 'driverId': driverID.toString(), + }); + } + + Future addPayment( + String paymentMethod, String driverID, String amount) async { + var paymentToken = + await generateToken(((double.parse(amount))).toStringAsFixed(0)); + await CRUD().post(link: AppLink.addDrivePayment, payload: { + 'rideId': DateTime.now().toIso8601String(), + 'amount': ((double.parse(amount))).toStringAsFixed(0), + 'payment_method': paymentMethod, + 'passengerID': 'myself', + 'token': paymentToken, + 'driverID': driverID.toString(), + }); + } + + Future updatePaymentToPaid(String driverID) async { + await CRUD().post(link: AppLink.updatePaymetToPaid, payload: { + 'driverID': driverID.toString(), + }); + } + + Future getToken() async { + var headers = { + 'Content-Type': 'application/x-www-form-urlencoded', + // 'Cookie': + // 'csrftoken=74iZJ8XYyuTm5WRq2W4tpWX5eqoJLZVK5QhuDrChWpDtzpgGA269bbCWuEcW85t4' + }; + var body = { + 'grant_type': 'password', + 'username': AK.payMobOutUserName, + 'password': AK.payMobOutPassword, + 'client_id': AK.payMobOutClient_id, + 'client_secret': AK.payMobOutClientSecrret + }; + var res = await http.post( + Uri.parse( + 'https://stagingpayouts.paymobsolutions.com/api/secure/o/token/'), + headers: headers, + body: body, + ); + String token = ''; + if (res.statusCode == 200) { + var decode = jsonDecode(res.body); + token = decode['access_token']; + } + return token; + } + + Future getWalletForEachDriverToPay() async { + isLoading = true; + update(); + var res = await CRUD() + .postWallet(link: AppLink.getVisaForEachDriver, payload: {}); + var d = (res); + if (d != 'failure') { + driversWalletPoints = d['message']; + isLoading = false; + update(); + } + driversWalletPoints = []; + isLoading = false; + update(); + } +} diff --git a/siro_admin/lib/controller/auth/login_controller.dart b/siro_admin/lib/controller/auth/login_controller.dart new file mode 100644 index 0000000..e750322 --- /dev/null +++ b/siro_admin/lib/controller/auth/login_controller.dart @@ -0,0 +1,56 @@ +import 'package:flutter/material.dart'; +import 'package:get/get.dart'; + +import 'otp_helper.dart'; + +class OtpVerificationAdmin extends StatefulWidget { + final String phone; + const OtpVerificationAdmin({required this.phone}); + + @override + State createState() => _OtpVerificationAdminState(); +} + +class _OtpVerificationAdminState extends State { + final _otpController = TextEditingController(); + bool _isLoading = false; + + Future _verifyOtp() async { + setState(() => _isLoading = true); + + final otpHelper = OtpHelper(); + await otpHelper.verifyOtp(widget.phone, _otpController.text.trim()); + // if (success) { + // Get.offAllNamed('/admin-dashboard'); + // } else { + // Get.snackbar('خطأ', 'رمز التحقق غير صحيح'); + // } + setState(() => _isLoading = false); + } + + @override + Widget build(BuildContext context) { + return Scaffold( + appBar: AppBar(title: const Text('التحقق من الرمز')), + body: Padding( + padding: const EdgeInsets.all(20.0), + child: Column( + children: [ + TextFormField( + controller: _otpController, + keyboardType: TextInputType.number, + decoration: const InputDecoration(labelText: 'رمز التحقق'), + ), + const SizedBox(height: 20), + _isLoading + ? const CircularProgressIndicator() + : ElevatedButton( + onPressed: _verifyOtp, + child: const Text('تحقق وأدخل'), + ) + ], + ), + ), + ); + } +} diff --git a/siro_admin/lib/controller/auth/otp_helper.dart b/siro_admin/lib/controller/auth/otp_helper.dart new file mode 100644 index 0000000..591450f --- /dev/null +++ b/siro_admin/lib/controller/auth/otp_helper.dart @@ -0,0 +1,296 @@ +import 'package:flutter/material.dart'; +import 'package:jwt_decoder/jwt_decoder.dart'; +import 'package:get/get.dart'; +import 'package:siro_admin/controller/functions/device_info.dart'; +import 'package:siro_admin/views/auth/login_page.dart'; + +import '../../constant/box_name.dart'; +import '../../constant/links.dart'; +import '../../constant/info.dart'; +import '../../main.dart'; +import '../../print.dart'; +import '../../views/admin/admin_home_page.dart'; +import '../../views/widgets/snackbar.dart'; +import '../admin/dashboard_controller.dart'; +import '../functions/crud.dart'; +import '../functions/encrypt_decrypt.dart'; + +class OtpHelper extends GetxController { + static final String _sendOtpUrl = + '${AppLink.server}/Admin/auth/send_otp_admin.php'; + static final String _verifyOtpUrl = + '${AppLink.server}/Admin/auth/verify_otp_admin.php'; + static final String _checkAdminLogin = + '${AppLink.server}/Admin/auth/login.php'; + + /// إرسال OTP + static Future sendOtp(String phoneNumber) async { + try { + // await CRUD().getJWT(); + final response = await CRUD().post( + link: _sendOtpUrl, + payload: {'receiver': phoneNumber}, + ); + // Log.print('_sendOtpUrl: ${_sendOtpUrl}'); + // Log.print('response: ${response}'); + if (response != 'failure') { + mySnackbarSuccess('تم إرسال رمز التحقق إلى رقمك عبر WhatsApp'); + return true; + } else { + mySnackeBarError('حدث خطأ من الخادم. حاول مجددًا.'); + return false; + } + } catch (e) { + Log.print('OTP SEND ERROR: $e'); + mySnackeBarError('حدث خطأ أثناء الإرسال: $e'); + return false; + } + } + + /// التحقق من OTP + Future verifyOtp(String phoneNumber, String otp) async { + try { + final response = await CRUD().post( + link: _verifyOtpUrl, + payload: { + 'phone_number': phoneNumber, + 'otp': otp, + 'device_number': box.read(BoxName.fingerPrint) + }, + ); + + if (response != 'failure') { + if (response['status'] == 'success') { + box.write(BoxName.phoneVerified, true); + box.write(BoxName.adminPhone, phoneNumber); + + mySnackbarSuccess('تم التحقق من الرقم بنجاح'); + await checkAdminLogin(); + } else { + mySnackeBarError(response['message'] ?? 'فشل في التحقق.'); + } + } else { + mySnackeBarError('فشل من الخادم. حاول مرة أخرى.'); + } + } catch (e) { + Log.print('OTP VERIFY ERROR: $e'); + mySnackeBarError('خطأ في التحقق: $e'); + } + } + + /// تسجيل الدخول بكلمة المرور والبصمة + Future loginWithPassword(String password) async { + try { + final fingerprint = box.read(BoxName.fingerPrint); + final response = await CRUD().post( + link: _checkAdminLogin, + payload: { + 'fingerprint': fingerprint, + 'password': password, + }, + ); + + if (response != 'failure') { + // إذا كان الرد يتطلب OTP (السيرفر يرجعها بداخل message) + final msg = response['message']; + if (response['status'] == 'otp_required' || + (msg is Map && msg['status'] == 'otp_required')) { + String phone = (msg is Map ? msg['phone'] : response['phone']) ?? ''; + _showOtpDialog(phone, password, fingerprint); + return false; // ننتظر إكمال الـ OTP + } + + // إذا نجح الدخول مباشرة + return _handleLoginSuccess(response, password); + } else { + // سيقوم CRUD بإظهار الخطأ المناسب (مثل "حسابك قيد المراجعة") + return false; + } + } catch (e) { + Log.print('LOGIN ERROR: $e'); + mySnackeBarError('حدث خطأ أثناء تسجيل الدخول: $e'); + return false; + } + } + + /// التحقق من OTP الخاص بتسجيل الدخول + Future verifyLoginOtp( + String phone, String otp, String password, String fingerprint) async { + try { + final response = await CRUD().post( + link: '${AppLink.server}/Admin/auth/verify_login.php', + payload: { + 'phone': phone, + 'otp': otp, + 'fingerprint': fingerprint, + }, + ); + + if (response != 'failure') { + bool success = await _handleLoginSuccess(response, password); + if (success) { + try { + if (Get.isRegistered()) { + Get.find().getDashBoard(); + } + } catch (e) {} + Get.offAll(() => const AdminHomePage()); + } + } + } catch (e) { + Log.print('OTP VERIFY LOGIN ERROR: $e'); + mySnackeBarError('خطأ في التحقق من الرمز: $e'); + } + } + + Future _handleLoginSuccess(dynamic response, String password) async { + final msg = response['message']; + final data = response['admin'] ?? (msg is Map ? msg['admin'] : null); + final jwt = response['jwt'] ?? (msg is Map ? msg['jwt'] : null); + + if (jwt != null) { + await box.write(BoxName.jwt, c(jwt)); + } + + if (data != null) { + if (data['id'] != null) await box.write(BoxName.driverID, data['id']); + if (data['role'] != null) { + String role = data['role'].toString().trim(); + await box.write('admin_role', role); + Log.print('Admin role saved: $role'); + } + if (data['phone'] != null) + await box.write(BoxName.adminPhone, data['phone']); + } + + await box.write(BoxName.phoneVerified, true); + await box.write('admin_password', password); + + mySnackbarSuccess('تم تسجيل الدخول بنجاح'); + return true; + } + + void _showOtpDialog(String phone, String password, String fingerprint) { + String otpCode = ''; + Get.defaultDialog( + title: 'رمز التحقق', + content: Column( + children: [ + Text('تم إرسال رمز التحقق إلى WhatsApp الخاص بك ($phone)'), + const SizedBox(height: 16), + TextField( + onChanged: (val) => otpCode = val, + keyboardType: TextInputType.number, + decoration: const InputDecoration( + hintText: 'أدخل الرمز هنا', + border: OutlineInputBorder(), + ), + ), + ], + ), + textConfirm: 'تحقق', + confirmTextColor: Colors.white, + onConfirm: () { + if (otpCode.length >= 3) { + Get.back(); + verifyLoginOtp(phone, otpCode, password, fingerprint); + } else { + mySnackeBarError('الرجاء إدخال رمز صحيح'); + } + }, + ); + } + + static bool _isAutoLoginAttempted = false; + + Future checkAdminLogin() async { + final fingerprint = box.read(BoxName.fingerPrint); + final password = box.read('admin_password'); + + if (fingerprint == null || password == null) { + Get.offAll(() => const AdminLoginPage()); + return; + } + + // ─── أولاً: التحقق من وجود توكن JWT صالح ───────── + // إذا وُجد توكن غير منتهي الصلاحية → ندخل مباشرة بدون استدعاء login.php + final rawJwt = box.read(BoxName.jwt); + if (rawJwt != null) { + try { + String token = r(rawJwt.toString()).split(AppInformation.addd)[0]; + if (!JwtDecoder.isExpired(token)) { + Log.print('Valid JWT found, skipping login.php (no OTP needed)'); + Get.offAll(() => const AdminHomePage()); + return; + } + Log.print('JWT expired, need fresh login'); + } catch (e) { + Log.print('JWT decode failed: \$e, need fresh login'); + } + } + + // ─── ثانياً: لا يوجد توكن صالح → استدعاء login.php ─── + final response = await CRUD().post( + link: _checkAdminLogin, + payload: { + 'fingerprint': fingerprint, + 'password': password, + 'is_renewal': '1', + }, + ); + + if (response != 'failure') { + final msg = response['message']; + + if (response['status'] == 'otp_required' || + (msg is Map && msg['status'] == 'otp_required')) { + String phone = (msg is Map ? msg['phone'] : response['phone']) ?? ''; + _showOtpDialog(phone, password, fingerprint); + return; // ننتظر إدخال رمز التحقق + } + + if (msg is Map && msg['jwt'] != null) { + box.write(BoxName.jwt, c(msg['jwt'])); + if (msg['admin'] != null && msg['admin']['id'] != null) { + box.write(BoxName.driverID, msg['admin']['id']); + } + } else if (response['jwt'] != null) { + box.write(BoxName.jwt, c(response['jwt'])); + } + try { + if (Get.isRegistered()) { + Get.find().getDashBoard(); + } + } catch (e) {} + Get.offAll(() => const AdminHomePage()); + } else { + Log.print('Auto-login failed, redirecting to login page'); + Get.offAll(() => const AdminLoginPage()); + } + } + + @override + void onInit() { + super.onInit(); + DeviceHelper.getDeviceFingerprint().then((deviceFingerprint) { + box.write(BoxName.fingerPrint, deviceFingerprint); + }); + // تأجيل تنفيذ التنقل حتى تنتهي مرحلة البناء + // ⚠️ محاولة واحدة فقط للتسجيل التلقائي لمنع الحلقة اللانهائية + Future.microtask(() { + if (_isAutoLoginAttempted) { + // نحن في حلقة — نتوقف ونذهب لصفحة الدخول مباشرة + Log.print('Auto-login already attempted, skipping to login page'); + return; + } + _isAutoLoginAttempted = true; + + if (box.read(BoxName.phoneVerified) == true && + box.read(BoxName.adminPhone) != null) { + checkAdminLogin(); + } else { + Get.offAll(() => AdminLoginPage()); + } + }); + } +} diff --git a/siro_admin/lib/controller/bank_account/payout.dart b/siro_admin/lib/controller/bank_account/payout.dart new file mode 100644 index 0000000..0001a96 --- /dev/null +++ b/siro_admin/lib/controller/bank_account/payout.dart @@ -0,0 +1,113 @@ +import 'dart:convert'; + +import 'package:get/get.dart'; +import 'package:http/http.dart' as http; + +import '../../../constant/links.dart'; +import '../../constant/api_key.dart'; +import '../../constant/box_name.dart'; +import '../../constant/colors.dart'; +import '../../main.dart'; +import '../functions/crud.dart'; + +class PaymobPayout extends GetxController { + bool isLoading = false; + String dropdownValue = 'etisalat'; + + Future getToken() async { + var headers = { + 'Content-Type': 'application/x-www-form-urlencoded', + // 'Cookie': + // 'csrftoken=74iZJ8XYyuTm5WRq2W4tpWX5eqoJLZVK5QhuDrChWpDtzpgGA269bbCWuEcW85t4' + }; + var body = { + 'grant_type': 'password', + 'username': AK.payMobOutUserName, + 'password': AK.payMobOutPassword, + 'client_id': AK.payMobOutClient_id, + 'client_secret': AK.payMobOutClientSecrret + }; + var res = await http.post( + Uri.parse('https://payouts.paymobsolutions.com/api/secure/o/token/'), + headers: headers, + body: body, + ); + String token = ''; + if (res.statusCode == 200) { + var decode = jsonDecode(res.body); + token = decode['access_token']; + } + return token; + } + + payToDriverWallet( + String token, String amount, String issuer, String msisdn) async { + var headers = { + 'Authorization': 'Bearer $token', + 'Content-Type': 'application/json', + }; + var body = json.encode({ + "amount": amount, //"10.00", + "issuer": issuer, //"vodafone", + "msisdn": msisdn, // "01023456789" + }); + var res = await http.post( + Uri.parse('https://payouts.paymobsolutions.com/api/secure/disburse/'), + headers: headers, + body: body, + ); + var dec = jsonDecode(res.body); + if (dec['disbursement_status'] == 'successful') { + await CRUD().post(link: AppLink.addDriverpayment, payload: { + 'rideId': DateTime.now().toIso8601String(), + 'amount': ((-1) * (double.parse(dec['amount'])) + 5).toStringAsFixed(0), + 'payment_method': 'payout', + 'passengerID': 'admin', + 'driverID': box.read(BoxName.driverID).toString(), + }); + Get.snackbar('Transaction successful'.tr, + '${'Transaction successful'.tr} ${dec['amount']}', + backgroundColor: AppColor.greenColor); + // Get.find().getCaptainWalletFromRide(); + } else if (dec['disbursement_status'] == 'failed') { + Get.snackbar('Transaction failed'.tr, 'Transaction failed'.tr, + backgroundColor: AppColor.redColor); + } + } + + payToDriverBankAccount(String token, String amount, String bankCardNumber, + String bankCode) async { + var headers = { + 'Authorization': 'Bearer $token', + 'Content-Type': 'application/json', + }; + var body = { + "issuer": "bank_card", + "amount": amount, //9.0, + "full_name": + '${box.read(BoxName.nameDriver)} ${box.read(BoxName.lastNameDriver)}', + "bank_card_number": bankCardNumber, //"1111-2222-3333-4444", + "bank_code": bankCode, //"CIB", + "bank_transaction_type": "cash_transfer" + }; + var res = await http + .post( + Uri.parse('https://payouts.paymobsolutions.com/api/secure/disburse/'), + headers: headers, + body: body, + ) + .then((value) {}); + } + + Future payToWalletDriverAll( + String amount, String issuer, String msisdn) async { + String token = await getToken(); + await payToDriverWallet(token, amount, issuer, msisdn); + } + + Future payToBankDriverAll( + String amount, String bankCardNumber, String bankCode) async { + String token = await getToken(); + await payToDriverBankAccount(token, amount, bankCardNumber, bankCode); + } +} diff --git a/siro_admin/lib/controller/drivers/driver_not_active_controller.dart b/siro_admin/lib/controller/drivers/driver_not_active_controller.dart new file mode 100644 index 0000000..09a60c3 --- /dev/null +++ b/siro_admin/lib/controller/drivers/driver_not_active_controller.dart @@ -0,0 +1,37 @@ +import 'package:get/get.dart'; + +import '../../constant/links.dart'; +import '../functions/crud.dart'; + +class DriverController extends GetxController { + List drivers = []; + Map driverDetails = {}; + + // جلب السائقين pending + getDriversPending() async { + var res = await CRUD().post( + link: AppLink.getDriversPending, // رابط drivers_pending_list.php + payload: {}, + ); + if (res != 'failure') { + drivers = (res)['message']; + update(['drivers']); // تحديث الـ UI + } else { + Get.snackbar('Error', 'Failed to load drivers'); + } + } + + // جلب تفاصيل سائق واحد + getDriverDetails(String driverId) async { + var res = await CRUD().post( + link: AppLink.getDriverDetails, // رابط driver_details.php + payload: {"id": driverId}, + ); + if (res != 'failure') { + driverDetails = (res)['message']; + update(['driverDetails']); // تحديث صفحة التفاصيل + } else { + Get.snackbar('Error', 'Failed to load driver details'); + } + } +} diff --git a/siro_admin/lib/controller/drivers/driverthebest.dart b/siro_admin/lib/controller/drivers/driverthebest.dart new file mode 100644 index 0000000..a6298c8 --- /dev/null +++ b/siro_admin/lib/controller/drivers/driverthebest.dart @@ -0,0 +1,68 @@ +import 'dart:convert'; + +import 'package:get/get.dart'; + +import '../../constant/colors.dart'; +import '../../constant/links.dart'; +import '../functions/crud.dart'; + +class Driverthebest extends GetxController { + bool isLoading = false; + List driver = []; + getBestDriver() async { + var res = await CRUD().get(link: AppLink.getBestDriver, payload: {}); + if (res != 'failure') { + driver = jsonDecode(res)['message']; + update(); + } else { + Get.snackbar('error', '', backgroundColor: AppColor.redColor); + } + } + + @override + void onInit() { + getBestDriver(); + super.onInit(); + } +} + +class DriverTheBestGizaController extends GetxController { + bool isLoading = false; + List driver = []; + getBestDriver() async { + var res = await CRUD().get(link: AppLink.getBestDriverGiza, payload: {}); + if (res != 'failure') { + driver = jsonDecode(res)['message']; + update(); + } else { + Get.snackbar('error', '', backgroundColor: AppColor.redColor); + } + } + + @override + void onInit() { + getBestDriver(); + super.onInit(); + } +} + +class DriverTheBestAlexandriaController extends GetxController { + bool isLoading = false; + List driver = []; + getBestDriver() async { + var res = + await CRUD().get(link: AppLink.getBestDriverAlexandria, payload: {}); + if (res != 'failure') { + driver = jsonDecode(res)['message']; + update(); + } else { + Get.snackbar('error', '', backgroundColor: AppColor.redColor); + } + } + + @override + void onInit() { + getBestDriver(); + super.onInit(); + } +} diff --git a/siro_admin/lib/controller/employee_controller/employee_controller.dart b/siro_admin/lib/controller/employee_controller/employee_controller.dart new file mode 100644 index 0000000..f0294ea --- /dev/null +++ b/siro_admin/lib/controller/employee_controller/employee_controller.dart @@ -0,0 +1,82 @@ +import 'dart:convert'; +import 'dart:math'; + +import 'package:flutter/widgets.dart'; +import 'package:get/get.dart'; +import 'package:siro_admin/constant/colors.dart'; +import 'package:siro_admin/constant/links.dart'; +import 'package:siro_admin/controller/functions/crud.dart'; + +class EmployeeController extends GetxController { + List employee = []; + final name = TextEditingController(); + final education = TextEditingController(); + final site = TextEditingController(); + final phone = TextEditingController(); + final status = TextEditingController(); + final formKey = GlobalKey(); + + fetchEmployee() async { + var res = await CRUD().get(link: AppLink.getEmployee, payload: {}); + if (res is String && (res == 'failure' || res == 'token_expired')) { + Get.snackbar('error', 'Failed to load employees', backgroundColor: AppColor.redColor); + return; + } + + try { + var jsonData = res is String ? jsonDecode(res) : res; + employee = jsonData['message']; + update(); + } catch (e) { + Get.snackbar('error', 'Invalid server response', backgroundColor: AppColor.redColor); + } + } + + late String id; + String generateRandomId(int length) { + const String chars = 'ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789'; + Random random = Random(); + + return String.fromCharCodes(Iterable.generate( + length, + (_) => chars.codeUnitAt(random.nextInt(chars.length)), + )); + } + + addEmployee() async { + // Create the payload with the employee data + var res = await CRUD().post(link: AppLink.addEmployee, payload: { + "id": id, + "name": name.text, + "education": education.text, + "site": site.text, + "phone": phone.text, + "status": status.text, + }); + + // Check the response from the API + if (res != 'failure') { + // You can handle the success case here, such as showing a success message + + Get.back(); + Get.snackbar('Success', 'Employee added successfully', + backgroundColor: AppColor.greenColor); + name.clear(); + education.clear(); + site.clear(); + phone.clear(); + status.clear(); + fetchEmployee(); + } else { + // Handle the error case by showing a snackbar with an error message + Get.snackbar('Error', 'Failed to add employee', + backgroundColor: AppColor.redColor); + } + } + + @override + void onInit() { + fetchEmployee(); + super.onInit(); + } +} diff --git a/siro_admin/lib/controller/firebase/firbase_messge.dart b/siro_admin/lib/controller/firebase/firbase_messge.dart new file mode 100644 index 0000000..1185597 --- /dev/null +++ b/siro_admin/lib/controller/firebase/firbase_messge.dart @@ -0,0 +1,517 @@ +import 'dart:convert'; +import 'dart:io'; +import 'package:firebase_messaging/firebase_messaging.dart'; +import 'package:flutter/material.dart'; +import 'package:get/get.dart'; +import 'package:http/http.dart' as http; +import 'package:secure_string_operations/secure_string_operations.dart'; +import 'package:siro_admin/constant/info.dart'; +import 'package:siro_admin/env/env.dart'; + +import '../../constant/api_key.dart'; +import '../../constant/box_name.dart'; +import '../../constant/char_map.dart'; +import '../../constant/colors.dart'; +import '../../constant/links.dart'; +import '../../constant/style.dart'; +import '../../main.dart'; +import '../../print.dart'; +import '../../views/widgets/elevated_btn.dart'; +import '../functions/encrypt_decrypt.dart'; +import '../notification_controller.dart'; +import 'local_notification.dart'; +import 'token_access.dart'; + +class FirebaseMessagesController extends GetxController { + final fcmToken = FirebaseMessaging.instance; + + List tokens = []; + List tokensPassengers = []; + List dataTokens = []; + List dataTokensPassenger = []; + late String driverID; + late String driverToken; + NotificationSettings? notificationSettings; + bool isLoading = false; + Future getNotificationSettings() async { + // Get the current notification settings + NotificationSettings? notificationSettings = + await FirebaseMessaging.instance.getNotificationSettings(); + 'Notification authorization status: ${notificationSettings.authorizationStatus}'; + + // Call the update function if needed + update(); + } + + Future requestFirebaseMessagingPermission() async { + FirebaseMessaging messaging = FirebaseMessaging.instance; + + // Check if the platform is Android + if (Platform.isAndroid) { + // Request permission for Android + await messaging.requestPermission(); + } else if (Platform.isIOS) { + // Request permission for iOS + NotificationSettings settings = await messaging.requestPermission( + alert: true, + announcement: true, + badge: true, + carPlay: true, + criticalAlert: true, + provisional: false, + sound: true, + ); + messaging.setForegroundNotificationPresentationOptions( + alert: true, badge: true, sound: true); + } + } + + Future getTokens() async { + var res = await http.post( + Uri.parse(AppLink.getTokens), + headers: { + 'Authorization': + 'Basic ${base64Encode(utf8.encode(AK.basicAuthCredentials))}', + }, + body: {}, + ); + var jsonResponse = jsonDecode(res.body); + if (jsonResponse['status'] == 'success') { + dataTokens = jsonResponse['data']; + for (var i = 0; i < dataTokens.length; i++) { + tokens.add(jsonResponse['data'][i]['token']); + } + box.write(BoxName.tokens, tokens); + } else { + Get.defaultDialog(title: "Warning", middleText: "Server Error"); + } + } + + var currentPage = 1; + var totalPages = 1; + Future getAllTokenDrivers() async { + isLoading = true; + try { + var res = await http.post( + Uri.parse(AppLink.getDriversPhonesAndTokens), + headers: { + "Content-Type": "application/x-www-form-urlencoded", + 'Authorization': + 'Bearer ${X.r(X.r(X.r(box.read(BoxName.jwt), cn), cC), cs).toString().split(AppInformation.addd)[0]}' + // 'Authorization': 'Bearer ${box.read(BoxName.jwt)}' + }, + body: { + // 'page': page.toString(), + }, + ); + + var jsonResponse = jsonDecode(res.body); + Log.print('jsonResponse: ${jsonResponse}'); + if (jsonResponse['status'] == 'success') { + // var newData = jsonResponse['data'] as List; + // Log.print('newData: ${newData}'); + // // if (page == 1) { + // // dataTokens.clear(); + // // tokens.clear(); + // // } + // dataTokens.addAll(newData); + // for (var item in newData) { + // tokens.add(item['token']); + // } + // currentPage = int.parse(jsonResponse['currentPage']); + // totalPages = jsonResponse['totalPages']; + box.write(BoxName.tokensDrivers, jsonResponse); + Log.print( + 'box.write(BoxName.tokensDrivers: ${box.read(BoxName.tokensDrivers)}'); + } else { + Get.defaultDialog( + title: "Warning", middleText: "No more data available"); + } + } catch (e) { + Get.defaultDialog(title: "Error", middleText: "Server Error: $e"); + } finally { + isLoading = false; + } + } + + var currentPagePassenger = 1; + var totalPagesPassenger = 1; + Future getAllTokenPassenger({int page = 1}) async { + isLoading = true; + try { + var res = await http.post( + Uri.parse(AppLink.getAllTokenPassengers), + headers: { + "Content-Type": "application/x-www-form-urlencoded", + 'Authorization': + 'Bearer ${X.r(X.r(X.r(box.read(BoxName.jwt), cn), cC), cs).toString().split(AppInformation.addd)[0]}' + }, + body: {}, + ); + + var jsonResponse = jsonDecode(res.body); + if (jsonResponse['status'] == 'success') { + box.write(BoxName.tokensPassengers, jsonResponse); + Log.print( + 'box.write(BoxName.tokensPassenger: ${box.read(BoxName.tokensPassengers)}'); + } else { + Get.defaultDialog( + title: "Warning", middleText: "No more data available"); + } + } catch (e) { + Get.defaultDialog(title: "Error", middleText: "Server Error: $e"); + } finally { + isLoading = false; + } + } + + bool isSendingNotifications = false; + Future loadAllPagesAndSendNotifications() async { + isSendingNotifications = true; + // currentPage = 1; + + // while (currentPage <= totalPages) { + // await getAllTokenDrivers(page: currentPage); + await getAllTokenDrivers(); + // Log.print('tokens: ${tokens}'); + await NotificationController().sendNotificationDrivers(); + // print(tokens); + + // if (currentPage < totalPages) { + // await Future.delayed(const Duration(seconds: 3)); + // } + // currentPage++; + // } + + isSendingNotifications = false; + Get.snackbar("Success", "All notifications sent!"); + } + + bool isSendingNotificationsPassenger = false; + Future loadAllPagesAndSendNotificationsPassengers() async { + isSendingNotificationsPassenger = true; + currentPage = 1; + + // while (currentPagePassenger <= totalPagesPassenger) { + await getAllTokenPassenger(); + await NotificationController().sendNotificationPassengers(); + // print(tokensPassengers); + // if (currentPagePassenger < totalPagesPassenger) { + // await Future.delayed(const Duration(seconds: 3)); + // } + // currentPagePassenger++; + // } + + isSendingNotificationsPassenger = false; + Get.snackbar("Success", "All notifications sent!"); + } + + Future getAllTokenPassengers() async { + var res = await http.post( + Uri.parse(AppLink.getAllTokenPassengers), + headers: { + "Content-Type": "application/x-www-form-urlencoded", + 'Authorization': + 'Bearer ${X.r(X.r(X.r(box.read(BoxName.jwt), cn), cC), cs).toString().split(AppInformation.addd)[0]}' + // 'Authorization': 'Bearer ${box.read(BoxName.jwt)}' + }, + body: {}, + ); + var jsonResponse = jsonDecode(res.body); + if (jsonResponse['status'] == 'success') { + dataTokens = jsonResponse['data']; + for (var i = 0; i < dataTokens.length; i++) { + tokensPassengers.add(jsonResponse['data'][i]['token']); + } + box.write(BoxName.tokensPassengers, jsonResponse['data']); + } else { + Get.defaultDialog(title: "Warning", middleText: "Server Error"); + } + } + + Future getToken() async { + fcmToken.getToken().then((token) { + if (box.read(BoxName.email) == null) { + box.write(BoxName.tokenDriver, token); + } else { + box.write(BoxName.tokenFCM, token); + } + }); + + FirebaseMessaging.onMessage.listen((RemoteMessage message) { + // If the app is in the background or terminated, show a system tray message + RemoteNotification? notification = message.notification; + AndroidNotification? android = notification?.android; + // if (notification != null && android != null) { + if (message.data.isNotEmpty && message.notification != null) { + fireBaseTitles(message); + } + }); + } + + void fireBaseTitles(RemoteMessage message) { + if (message.notification!.title! == 'Order') { + if (Platform.isAndroid) { + // NotificationController().showNotification('Order', '', 'order'); + } + var myListString = message.data['DriverList']; + // var points = message.data['PolylineJson']; + + var myList = jsonDecode(myListString) as List; + // var myPoints = jsonDecode(points) as List; + driverToken = myList[14].toString(); + // This is for location using and uploading status + + update(); + } + } + + SnackbarController driverAppliedTripSnakBar() { + return Get.snackbar( + 'Driver Applied the Ride for You'.tr, + '', + colorText: AppColor.greenColor, + duration: const Duration(seconds: 3), + snackPosition: SnackPosition.TOP, + titleText: Text( + 'Applied'.tr, + style: const TextStyle(color: AppColor.redColor), + ), + messageText: Text( + 'Driver Applied the Ride for You'.tr, + style: AppStyle.title, + ), + icon: const Icon(Icons.approval), + shouldIconPulse: true, + margin: const EdgeInsets.all(16), + padding: const EdgeInsets.all(16), + ); + } + + Future passengerDialog(String message) { + return Get.defaultDialog( + barrierDismissible: false, + title: 'message From passenger'.tr, + titleStyle: AppStyle.title, + middleTextStyle: AppStyle.title, + middleText: message.tr, + confirm: MyElevatedButton( + title: 'Ok'.tr, + onPressed: () { + // FirebaseMessagesController().sendNotificationToPassengerToken( + // 'Hi ,I will go now'.tr, + // 'I will go now'.tr, + // Get.find().driverToken, []); + // Get.find() + // .startTimerDriverWaitPassenger5Minute(); + + Get.back(); + })); + } + + // Future driverFinishTripDialoge(List driverList) { + // return Get.defaultDialog( + // title: 'Driver Finish Trip'.tr, + // content: const DriverTipWidget(), + // confirm: MyElevatedButton( + // title: 'Yes'.tr, + // onPressed: () async { + // var tip = (Get.find().totalPassenger) * + // (double.parse(box.read(BoxName.tipPercentage.toString()))); + // var res = await CRUD().post(link: AppLink.addTips, payload: { + // 'passengerID': box.read(BoxName.passengerID), + // 'driverID': driverList[0].toString(), + // 'rideID': driverList[1].toString(), + // 'tipAmount': tip.toString(), + // }); + // await CRUD().post(link: AppLink.addPassengersWallet, payload: { + // 'passenger_id': box.read(BoxName.passengerID).toString(), + // 'balance': ((-1) * tip).toString() + // }); + + // await CRUD().post(link: AppLink.addDriversWalletPoints, payload: { + // 'driverID': driverList[0].toString(), + // 'paymentID': '${Get.find().rideId}tip', + // 'amount': (tip * 100).toString(), + // 'paymentMethod': 'visa-tip', + // }); + + // if (res != 'failure') { + // FirebaseMessagesController().sendNotificationToAnyWithoutData( + // 'You Have Tips', + // '${'${tip.toString()}\$${' tips\nTotal is'.tr}'} ${tip + (Get.find().totalPassenger)}', + // driverList[2].toString(), + // ); + // } + // Get.to(() => RateDriverFromPassenger(), arguments: { + // 'driverId': driverList[0].toString(), + // 'rideId': driverList[1].toString(), + // 'price': driverList[3].toString() + // }); + // }, + // kolor: AppColor.greenColor, + // ), + // cancel: MyElevatedButton( + // title: 'No,I want'.tr, + // onPressed: () { + // Get.to(() => RateDriverFromPassenger(), arguments: { + // 'driverId': driverList[0].toString(), + // 'rideId': driverList[1].toString(), + // 'price': driverList[3].toString() + // }); + // }, + // kolor: AppColor.redColor, + // )); + // } + + void sendNotificationAll(String title, body) async { + // Get the token you want to subtract. + String token = box.read(BoxName.tokenFCM); + tokens = box.read(BoxName.tokens); + // Subtract the token from the list of tokens. + tokens.remove(token); + + // Save the list of tokens back to the box. + // box.write(BoxName.tokens, tokens); + tokens = box.read(BoxName.tokens); + for (var i = 0; i < tokens.length; i++) { + String serviceAccountKeyJson = '''{ + "type": "service_account", + "project_id": "ride-b1bd8", + "private_key_id": "75e817c0b902db2ef35edf2c2bd159dec1f13249", + "private_key": "-----BEGIN PRIVATE KEY-----\\nMIIEvQIBADANBgkqhkiG9w0BAQEFAASCBKcwggSjAgEAAoIBAQD0zH9TQGDQHUv3\\na3/JAD1UKPwAp3wNKT0a6fxiIzjI3JxQWI30QvZCcfl6CdMhIcydX1ncSaYTcEeC\\n/AdPVCPkqyJx1YIGGg6P/mRzCWeaN8fsp6z250m5vcObDCZc3dbJEkepbep+6FPY\\n21m3KO+AHh1glgsTGZOTm5xiU8NGXpdk2QEh8wpiIIlR/HuKwVw9g8urNe3Sno+U\\nDm3z37iFqvZdmpqO8aWTJu6beb3hsREK9XK2I9JqC2JUwiGQRo3idOvPP6hkqrWx\\nKSX96vglQFYfakvJdDp2ZATOlpBYPMtS/IWhJ985u58TSS+Kl8qpnpaZBSxgJirf\\nhWzhnKLfAgMBAAECggEAJP785SePGhS7ZN6ltspm+l+hSjYFrPWFCxq+rlQ1YkHZ\\nC9l+RqKSFhOkiPmQI2s4wbXl3kFxLHHlFNoi/q2wKQBmGb8TQfnRJpjjNHGA61Ev\\n0Ue7/6qPvVb9B2MsLw/FxKiTFPuMG3bgKR9pbSFuJLYoaW7zqITOhVnYphGTqwAY\\nBVVcvISSLvELDmH9VZcv/9DVqVlqbbESHWh1Z4W6XGPoEqeDH/upNTyQQ/46Msgm\\nTGE6VqLHpWuSf6SqHp+r0Y0lI3vIPM1vz5FAJDJbOE/enHa0fSup0OHSMxl0HVMn\\nnO1yrGF3vsIPOej5HKr5d71bEIckzk73/yjNC1/mDQKBgQD7RtUvc9omsSsFMJ6e\\nBASAn6Dktx/QY/XNJjFzHQj69cywLDe5t5AL2gUi3phQ2oqB5XJdwnd5bTIEPEPZ\\nDOuOai2802p6FJk6kjmZAMVGx5JtXBH+vs6jrmQQSMiKbjwN1TT6xIWakvLOonUi\\nX6ZvjYYjU/E0YJU3jSiXWEr76wKBgQD5Zn4SouJ6BCDZMbausJVMBkk3qxsYooip\\np89WakC6e7AZinpkRcqjGGV9GOvc8crJs6fyXAA9ORepGP47Mc0ZrDssOkstznsM\\npr8R0S6MKwEZaT9ixOHdOcLZ47ps+JzA2Wr4KN2OvFHksUkB/46ATD1j9WZVgB8M\\namsYp/Y73QKBgHOo+PvsoZ9psVmkNX6abtAdqdtdB0HOoRea2uwXk0ig12TIFaZg\\nfedWpUKVnxqoXVTJHklV99RmlL0qWDiSH+LfsMnXro0e6iDxqZ1po2Se/CFmXcoa\\nXdctsFVmixhdATuExewfhTfPKABA+xWlXWC/jdy5CK+JPWXijaqMM4edAoGAE5Bj\\nsWiPpYyvWvpYX0nA3G7dzX0hqgQN/mkIjbnWDArp3IcNZNJIvBSM2Yxb7EAXbU0n\\njo6DAkp5Pa2VO+WDNlFZbvW/sf8xjeOCt44WPa6d7nVgIIpbQXRngZoopKW3/jTP\\n/FmQT8McFXmGxZ5belsAsdetSGW9icbLUerTGQ0CgYEAmf/G8Ag3XxmqTXvvHuv2\\n14OP7WnrVqkEMnydrftEwn4peXd/Lz+/GYX5Zc4ZoNgbN8IvZ5z0+OmRsallsbiW\\nBw0/tc68CjzxXOvReWxDluUopqWVGj5tlGqE5xUDku9SWJSxbkiQ3rqutzBdPXpr\\noqHwPyDrmK/Zgqn+uiIm4Ck=\\n-----END PRIVATE KEY-----\\n", + "client_email": "firebase-adminsdk-o2wqi@ride-b1bd8.iam.gserviceaccount.com", + "client_id": "111210077025005706623", + "auth_uri": "https://accounts.google.com/o/oauth2/auth", + "token_uri": "https://oauth2.googleapis.com/token", + "auth_provider_x509_cert_url": "https://www.googleapis.com/oauth2/v1/certs", + "client_x509_cert_url": "https://www.googleapis.com/robot/v1/metadata/x509/firebase-adminsdk-o2wqi%40ride-b1bd8.iam.gserviceaccount.com", + "universe_domain": "googleapis.com" +} +'''; // As defined above + + // Initialize AccessTokenManager + final accessTokenManager = AccessTokenManager(serviceAccountKeyJson); + + // Obtain an OAuth 2.0 access token + final accessToken = await accessTokenManager.getAccessToken(); + + // Send the notification + final response = await http + .post( + Uri.parse( + 'https://fcm.googleapis.com/v1/projects/ride-b1bd8/messages:send'), + headers: { + 'Content-Type': 'application/json', + 'Authorization': 'Bearer $accessToken', + }, + body: jsonEncode({ + 'notification': { + 'title': title, + 'body': body, + 'sound': 'ding.wav' + }, + 'priority': 'high', + 'data': { + 'click_action': 'FLUTTER_NOTIFICATION_CLICK', + 'id': '1', + 'status': 'done' + }, + 'to': tokens[i], + })) + .whenComplete(() {}) + .catchError((e) {}); + } + } + + // for (var i = 0; i < tokens.length; i++) { + // http + // .post(Uri.parse('https://fcm.googleapis.com/fcm/send'), + // headers: { + // 'Content-Type': 'application/json', + // 'Authorization': 'key=${storage.read(key: BoxName.serverAPI}' + // }, + // body: jsonEncode({ + // 'notification': { + // 'title': title, + // 'body': body, + // 'sound': 'true' + // }, + // 'priority': 'high', + // 'data': { + // 'click_action': 'FLUTTER_NOTIFICATION_CLICK', + // 'id': '1', + // 'status': 'done' + // }, + // 'to': tokens[i], + // })) + // .whenComplete(() {}) + // .catchError((e) { + // }); + // } + // } +//android/app/src/main/res/raw/iphone_ringtone.wav + + late String serviceAccountKeyJson; + void sendNotificationToAnyWithoutData( + String title, String body, String token, String tone) async { + try { + var encryptedKey = Env.privateKeyFCM; + // Log.print('encryptedKey: ${encryptedKey}'); + serviceAccountKeyJson = + EncryptionHelper.instance.decryptData(encryptedKey); +// As defined above + + // Initialize AccessTokenManager + final accessTokenManager = AccessTokenManager(serviceAccountKeyJson); + + // Obtain an OAuth 2.0 access token + final accessToken = await accessTokenManager.getAccessToken(); + // Log.print('accessToken: ${accessToken}'); + + // Send the notification + final response = await http.post( + Uri.parse( + 'https://fcm.googleapis.com/v1/projects/intaleq-d48a7/messages:send'), + headers: { + 'Content-Type': 'application/json', + 'Authorization': 'Bearer $accessToken', + }, + body: jsonEncode({ + 'message': { + 'token': token, + 'notification': { + 'title': title, + 'body': body, + }, + 'android': { + 'notification': { + 'sound': tone, + }, + }, + 'apns': { + 'payload': { + 'aps': { + 'sound': tone, + }, + }, + }, + }, + }), + ); + + if (response.statusCode == 200) { + SnackBar(content: Text('${response.statusCode}')); + print( + 'Notification sent successfully. Status code: ${response.statusCode}'); + print('Response body: ${response.body}'); + } else { + print( + 'Failed to send notification. Status code: ${response.statusCode}'); + print('Response body: ${response.body}'); + } + } catch (e) { + print('Error sending notification: $e'); + } + } +} diff --git a/siro_admin/lib/controller/firebase/local_notification.dart b/siro_admin/lib/controller/firebase/local_notification.dart new file mode 100644 index 0000000..6ea5160 --- /dev/null +++ b/siro_admin/lib/controller/firebase/local_notification.dart @@ -0,0 +1,29 @@ +// import 'package:flutter_local_notifications/flutter_local_notifications.dart'; +// import 'package:get/get.dart'; + +// class NotificationController extends GetxController { +// final FlutterLocalNotificationsPlugin _flutterLocalNotificationsPlugin = +// FlutterLocalNotificationsPlugin(); + +// // Initializes the local notifications plugin +// Future initNotifications() async { +// const AndroidInitializationSettings android = +// AndroidInitializationSettings('@mipmap/launcher_icon'); +// const InitializationSettings initializationSettings = +// InitializationSettings(android: android); +// await _flutterLocalNotificationsPlugin.initialize(initializationSettings); +// } + +// // Displays a notification with the given title and message +// void showNotification(String title, String message, String tone) async { +// AndroidNotificationDetails android = AndroidNotificationDetails( +// 'your channel id', 'your channel name', +// importance: Importance.max, +// priority: Priority.high, +// showWhen: false, +// sound: RawResourceAndroidNotificationSound(tone)); + +// NotificationDetails details = NotificationDetails(android: android); +// await _flutterLocalNotificationsPlugin.show(0, title, message, details); +// } +// } diff --git a/siro_admin/lib/controller/firebase/notification_service.dart b/siro_admin/lib/controller/firebase/notification_service.dart new file mode 100644 index 0000000..281bbfe --- /dev/null +++ b/siro_admin/lib/controller/firebase/notification_service.dart @@ -0,0 +1,59 @@ +import 'dart:convert'; +import 'package:http/http.dart' as http; + +import '../../print.dart'; + +class NotificationService { + // تأكد من أن هذا هو الرابط الصحيح لملف الإرسال + static const String _serverUrl = + 'https://syria.intaleq.xyz/intaleq/fcm/send_fcm.php'; + + static Future sendNotification({ + required String target, + required String title, + required String body, + required String? category, // <-- [الإضافة الأولى] + String? tone, + List? driverList, + bool isTopic = false, + }) async { + try { + final Map payload = { + 'target': target, + 'title': title, + 'body': body, + 'isTopic': isTopic, + }; + + if (category != null) { + payload['category'] = category; // <-- [الإضافة الثانية] + } + + if (tone != null) { + payload['tone'] = tone; + } + + if (driverList != null) { + // [مهم] تطبيق السائق يرسل passengerList + payload['passengerList'] = jsonEncode(driverList); + } + + final response = await http.post( + Uri.parse(_serverUrl), + headers: { + 'Content-Type': 'application/json; charset=UTF-8', + }, + body: jsonEncode(payload), + ); + + if (response.statusCode == 200) { + print('✅ Notification sent successfully.'); + } else { + print( + '❌ Failed to send notification. Status code: ${response.statusCode}'); + } + } catch (e) { + print('❌ An error occurred while sending notification: $e'); + } + } +} diff --git a/siro_admin/lib/controller/firebase/token_access.dart b/siro_admin/lib/controller/firebase/token_access.dart new file mode 100644 index 0000000..fc28ef8 --- /dev/null +++ b/siro_admin/lib/controller/firebase/token_access.dart @@ -0,0 +1,53 @@ +import 'dart:convert'; +import 'package:googleapis_auth/auth_io.dart'; + +import '../../print.dart'; + +class AccessTokenManager { + static final AccessTokenManager _instance = AccessTokenManager._internal(); + late final String serviceAccountJsonKey; + AccessToken? _accessToken; + DateTime? _expiryDate; + + AccessTokenManager._internal(); + + factory AccessTokenManager(String jsonKey) { + if (_instance._isServiceAccountKeyInitialized()) { + // Prevent re-initialization + return _instance; + } + _instance.serviceAccountJsonKey = jsonKey; + return _instance; + } + + bool _isServiceAccountKeyInitialized() { + try { + serviceAccountJsonKey; // Access to check if initialized + return true; + } catch (e) { + return false; + } + } + + Future getAccessToken() async { + if (_accessToken != null && DateTime.now().isBefore(_expiryDate!)) { + return _accessToken!.data; + } + try { + final serviceAccountCredentials = ServiceAccountCredentials.fromJson( + json.decode(serviceAccountJsonKey)); + final client = await clientViaServiceAccount( + serviceAccountCredentials, + ['https://www.googleapis.com/auth/firebase.messaging'], + ); + + _accessToken = client.credentials.accessToken; + _expiryDate = client.credentials.accessToken.expiry; + client.close(); + Log.print('_accessToken!.data: ${_accessToken!.data}'); + return _accessToken!.data; + } catch (e) { + throw Exception('Failed to obtain access token'); + } + } +} diff --git a/siro_admin/lib/controller/functions/crud.dart b/siro_admin/lib/controller/functions/crud.dart new file mode 100644 index 0000000..d80b5d8 --- /dev/null +++ b/siro_admin/lib/controller/functions/crud.dart @@ -0,0 +1,808 @@ +import 'dart:convert'; +import 'dart:io'; + +import 'package:get/get.dart'; +import 'package:http/http.dart' as http; +import 'package:jwt_decoder/jwt_decoder.dart'; +import 'package:secure_string_operations/secure_string_operations.dart'; + +import '../../constant/api_key.dart'; +import '../../constant/box_name.dart'; +import '../../constant/char_map.dart'; +import '../../constant/info.dart'; +import '../../constant/links.dart'; +import '../../env/env.dart'; +import '../../main.dart'; +import '../../print.dart'; +import 'device_info.dart'; +import 'encrypt_decrypt.dart'; +import 'security_checks.dart'; + +class CRUD { + var dev = ''; + getJWT() async { + // إذا كان الأدمن مسجل دخوله بالفعل، لا تقم بتوليد توكن "ضيف" قديم + if (box.read(BoxName.driverID) != null) { + Log.print('Admin session active. Skipping guest JWT.'); + return; + } + + dev = Platform.isAndroid ? 'android' : 'ios'; + + var payload = { + 'id': 'admin', + 'password': AK.passnpassenger, + 'aud': '${AK.allowed}$dev', + }; + Log.print('payload: ${payload}'); + var response1 = await http.post( + Uri.parse(AppLink.loginJwtDriver), + body: payload, + ); + + if (response1.statusCode == 200) { + final decodedResponse1 = jsonDecode(response1.body); + + final jwt = decodedResponse1['jwt']; + Log.print('jwt: ${jwt}'); + await box.write(BoxName.jwt, X.c(X.c(X.c(jwt, cn), cC), cs)); + // await AppInitializer().getKey(); + } + } + + Future get({ + required String link, + Map? payload, + }) async { + String token = ''; + var rawJwt = box.read(BoxName.jwt); + + if (rawJwt == null) { + await getJWT(); + rawJwt = box.read(BoxName.jwt); + } + + if (rawJwt != null) { + token = r(rawJwt.toString()).split(AppInformation.addd)[0]; + try { + if (JwtDecoder.isExpired(token)) { + // If we have an admin ID, we should probably re-login or refresh, + // but for now let's just fall back to guest JWT if needed. + if (box.read(BoxName.driverID) == null) { + await getJWT(); + token = r(box.read(BoxName.jwt).toString()) + .split(AppInformation.addd)[0]; + } + } + } catch (e) { + print('❌ JWT Decode Error: $e'); + // If decryption failed, try using raw (maybe it was saved plain) + token = rawJwt.toString().split(AppInformation.addd)[0]; + } + } + var url = Uri.parse(link); + Log.print('--- [CRUD GET] ---'); + Log.print('URL: $link'); + Log.print('Payload: $payload'); + + var response = await http.post( + url, + body: payload, + headers: { + "Content-Type": "application/x-www-form-urlencoded", + 'Authorization': 'Bearer $token', + 'X-Device-FP': box.read(BoxName.fingerPrint) ?? '', + }, + ); + + Log.print('Status Code: ${response.statusCode}'); + Log.print('Response Body: ${response.body}'); + Log.print('------------------'); + + if (response.statusCode == 200) { + try { + var jsonData = jsonDecode(response.body); + if (jsonData['status'] == 'success') { + return response.body; + } + return jsonData['status'] ?? 'failure'; + } catch (e) { + return 'failure'; + } + } else if (response.statusCode == 401) { + return 'token_expired'; + } else { + return 'failure'; + } + } + + Future post( + {required String link, Map? payload}) async { + var url = Uri.parse(link); + try { + String token = ''; + var rawJwt = box.read(BoxName.jwt); + + if (rawJwt != null) { + token = r(rawJwt.toString()).split(AppInformation.addd)[0]; + try { + if (JwtDecoder.isExpired(token)) { + if (box.read(BoxName.driverID) == null) { + await getJWT(); + token = r(box.read(BoxName.jwt).toString()) + .split(AppInformation.addd)[0]; + } + } + } catch (e) { + token = rawJwt.toString().split(AppInformation.addd)[0]; + } + } + + Log.print('--- [CRUD POST] ---'); + Log.print('URL: $link'); + Log.print('Payload: $payload'); + + var response = await http.post( + url, + body: payload, + headers: { + "Content-Type": "application/x-www-form-urlencoded", + 'Authorization': 'Bearer $token', + 'X-Device-FP': box.read(BoxName.fingerPrint) ?? '', + }, + ); + + Log.print('Status Code: ${response.statusCode}'); + Log.print('Response Body: ${response.body}'); + Log.print('-------------------'); + + if (response.statusCode == 200) { + try { + var jsonData = jsonDecode(response.body); + if (jsonData['status'] == 'success') { + return jsonData; + } else { + return jsonData['status']; + } + } catch (e) { + return 'failure'; + } + } else if (response.statusCode == 401) { + return 'token_expired'; + } else { + return 'failure'; + } + } catch (e) { + // addError('HTTP request error: $e', 'crud().post - HTTP'); + return 'failure'; + } + } + + getJwtWallet() async { + // 1. فحص التوكن المخزن أولاً (Caching) لتقليل طلبات الـ SSO + var cachedWalletJwt = box.read('wallet_jwt'); + var cachedWalletExpiry = box.read('wallet_jwt_expiry'); + + if (cachedWalletJwt != null && cachedWalletExpiry != null) { + int expiryMs = int.tryParse(cachedWalletExpiry.toString()) ?? 0; + // إذا لم ينته بعد (مع هامش أمان 60 ثانية) + if (DateTime.now().millisecondsSinceEpoch < expiryMs - 60000) { + Log.print( + 'Using cached Wallet JWT. Expiry: ${DateTime.fromMillisecondsSinceEpoch(expiryMs)}'); + return cachedWalletJwt.toString(); + } + } + + String fingerPrint = await DeviceHelper.getDeviceFingerprint(); + final mainTokenEnc = box.read(BoxName.jwt); + if (mainTokenEnc == null) return null; + + String mainToken = mainTokenEnc.toString(); + // فك تشفير التوكن بنفس طريقة دالة get() التي تعمل بنجاح + try { + mainToken = r(mainTokenEnc.toString()).split(AppInformation.addd)[0]; + } catch (e) { + // إذا فشل فك التشفير، نستخدم القيمة كما هي (ربما مخزنة بدون تشفير) + mainToken = mainTokenEnc.toString().split(AppInformation.addd)[0]; + } + Log.print('Wallet SSO mainToken length: ${mainToken.length}'); + Log.print( + 'Wallet SSO token starts with: ${mainToken.substring(0, mainToken.length > 10 ? 10 : mainToken.length)}'); + + // استخدام الـ SSO للسيرفر الرئيسي إذا كان الأدمن مسجل دخوله + var response1 = await http.post( + Uri.parse(AppLink.loginWalletAdminV3), + headers: { + 'Authorization': 'Bearer $mainToken', + 'X-Device-FP': fingerPrint, + }, + ); + + Log.print('Wallet SSO login status: ${response1.statusCode}'); + + if (response1.statusCode == 200) { + final decoded = jsonDecode(response1.body); + final msg = decoded['message']; + + String? jwt; + String? hmac; + + if (msg is Map) { + jwt = msg['jwt']; + hmac = msg['hmac']; + } else { + jwt = decoded['jwt']; + hmac = decoded['hmac']; + } + + if (hmac != null) await box.write(BoxName.hmac, hmac); + + // تخزين التوكن الجديد في الكاش لمدة 10 دقائق (600 ثانية) + if (jwt != null) { + await box.write('wallet_jwt', jwt); + await box.write('wallet_jwt_expiry', + (DateTime.now().millisecondsSinceEpoch + (600 * 1000)).toString()); + Log.print('Wallet JWT cached successfully.'); + } + + return jwt?.toString(); + } else { + // Fallback: المحاولة بالطريقة القديمة إذا فشل الـ SSO + var payload = { + 'id': box.read(BoxName.driverID) ?? '1', + 'password': AK.passnpassenger, + 'aud': '${Env.allowedWallet}${Platform.isAndroid ? 'android' : 'ios'}', + 'fingerPrint': fingerPrint + }; + var fallbackRes = await http.post( + Uri.parse(AppLink.loginWalletAdmin), + body: payload, + ); + if (fallbackRes.statusCode == 200) { + final decoded = jsonDecode(fallbackRes.body); + if (decoded['jwt'] != null) return decoded['jwt'].toString(); + } + } + return null; + } + + Future getWallet({ + required String link, + Map? payload, + bool isRetry = false, + }) async { + var s = await getJwtWallet(); + final hmac = box.read(BoxName.hmac); + var url = Uri.parse(link); + + Log.print('--- getWallet Execution ---'); + Log.print('URL: $url'); + Log.print('JWT: $s'); + Log.print('HMAC: $hmac'); + Log.print('Is Retry: $isRetry'); + Log.print('Payload: $payload'); + + if (payload != null && hmac != null) { + payload['hmac'] = hmac.toString(); + } + + try { + var response = await http.post( + url, + body: payload, + headers: { + "Content-Type": "application/x-www-form-urlencoded", + 'Authorization': 'Bearer $s', + 'X-HMAC-Auth': hmac.toString(), + 'X-Device-FP': box.read(BoxName.fingerPrint) ?? '', + }, + ); + + Log.print('Status Code: ${response.statusCode}'); + Log.print('Response Body: ${response.body}'); + + if (response.statusCode == 200) { + try { + var jsonData = jsonDecode(response.body); + if (jsonData['status'] == 'success') { + return jsonData; + } + Log.print('Logic Error: Status is not success. Data: $jsonData'); + return jsonData['status'] ?? 'failure'; + } catch (e) { + Log.print('JSON Decode Error in getWallet: $e'); + return 'failure'; + } + } else if (response.statusCode == 401 && !isRetry) { + Log.print('Token expired (401). Clearing cache and retrying...'); + await box.remove('wallet_jwt'); + await box.remove('wallet_jwt_expiry'); + return await getWallet(link: link, payload: payload, isRetry: true); + } else { + Log.print('HTTP Error in getWallet. Status: ${response.statusCode}'); + return 'failure'; + } + } catch (e) { + Log.print('HTTP Request Exception in getWallet: $e'); + return 'failure'; + } + } + + Future postWallet( + {required String link, Map? payload}) async { + var s = await getJwtWallet(); + Log.print('jwt: ${s}'); + final hmac = box.read(BoxName.hmac); + Log.print('hmac: ${hmac}'); + var url = Uri.parse(link); + Log.print('url: ${url}'); + + // إضافة الـ HMAC للـ payload لزيادة التوافقية + if (payload != null && hmac != null) { + payload['hmac'] = hmac.toString(); + } + + try { + // await LoginDriverController().getJWT(); + + var response = await http.post( + url, + body: payload, + headers: { + "Content-Type": "application/x-www-form-urlencoded", + 'Authorization': 'Bearer $s', + 'X-HMAC-Auth': hmac.toString(), + 'X-Device-FP': box.read(BoxName.fingerPrint) ?? '', + }, + ); + // Log.print('response.request:${response.request}'); + // Log.print('response.body: ${response.body}'); + // Log.print('payload:$payload'); + if (response.statusCode == 200) { + try { + var jsonData = jsonDecode(response.body); + if (jsonData['status'] == 'success') { + return jsonData; + } + return jsonData['status'] ?? 'failure'; + } catch (e) { + return 'failure'; + } + } else if (response.statusCode == 401) { + await getJwtWallet(); + return 'token_expired'; + } else { + return 'failure'; + } + } catch (e) { + // addError('HTTP request error: $e', 'crud().post - HTTP'); + return 'failure'; + } + } + + // } + Future sendWhatsAppAuth(String to, message) async { + var res = await CRUD().post( + link: AppLink.send_whatsapp_message, + payload: {'receiver': to, 'message': message}); + if (res != 'failure') { + Get.snackbar('Success', 'Message sent successfully'); + } else { + Get.snackbar('Error', 'Failed to send message'); + } + } + + Future getAgoraToken({ + required String channelName, + required String uid, + }) async { + var uid = box.read(BoxName.phone) ?? box.read(BoxName.phoneDriver); + var res = await http.get( + Uri.parse( + 'https://repulsive-pig-rugby-shirt.cyclic.app/token?channelName=$channelName'), + headers: {'Authorization': 'Bearer ${AK.agoraAppCertificate}'}); + + if (res.statusCode == 200) { + var response = jsonDecode(res.body); + return response['token']; + } else {} + } + + Future getLlama({ + required String link, + required String payload, + required String prompt, + }) async { + var url = Uri.parse( + link, + ); + var headers = { + 'Content-Type': 'application/json', + 'Authorization': + 'Bearer LL-X5lJ0Px9CzKK0HTuVZ3u2u4v3tGWkImLTG7okGRk4t25zrsLqJ0qNoUzZ2x4ciPy' + // 'Authorization': 'Bearer ${Env.llamaKey}' + }; + var data = json.encode({ + "model": "Llama-3-70b-Inst-FW", + // "model": "llama-13b-chat", + "messages": [ + { + "role": "user", + "content": + "Extract the desired information from the following passage as json decoded like $prompt just in this:\n\n$payload" + } + ], + "temperature": 0.9 + }); + var response = await http.post( + url, + body: data, + headers: headers, + ); + + if (response.statusCode == 200) { + return response.body; + } + return response.statusCode; + } + + Future allMethodForAI(String prompt, driverID, imagePath) async { + // await ImageController().choosImage(linkPHP, imagePath); + Future.delayed(const Duration(seconds: 2)); + var extractedString = await arabicTextExtractByVisionAndAI( + imagePath: imagePath, driverID: driverID); + var json = jsonDecode(extractedString); + var textValues = getAllTextValuesWithLineNumbers(json); + // List textValues = getAllTextValues(json); + + // await AI().geminiAiExtraction(prompt, textValues); + } + + Map>> getAllTextValuesWithLineNumbers( + Map json) { + Map>> output = {}; + int lineNumber = 1; + + if (json.containsKey('regions')) { + List regions = json['regions']; + for (Map region in regions) { + if (region.containsKey('lines')) { + List lines = region['lines']; + List> linesWithText = []; + for (Map line in lines) { + if (line.containsKey('words')) { + List words = line['words']; + String lineText = ""; + for (Map word in words) { + if (word.containsKey('text')) { + lineText += word['text'] + " "; + } + } + lineText = lineText.trim(); + linesWithText.add( + {"line_number": lineNumber.toString(), "text": lineText}); + lineNumber++; + } + } + output["region_${region.hashCode}"] = linesWithText; + } + } + } + + return output; + } + + // List getAllTextValues(Map json) { + // List textValues = []; + + // if (json.containsKey('regions')) { + // List regions = json['regions']; + // for (Map region in regions) { + // if (region.containsKey('lines')) { + // List lines = region['lines']; + // for (Map line in lines) { + // if (line.containsKey('words')) { + // List words = line['words']; + // for (Map word in words) { + // if (word.containsKey('text')) { + // textValues.add(word['text']); + // } + // } + // } + // } + // } + // } + // } + + // return textValues; + // } + + Future arabicTextExtractByVisionAndAI({ + required String imagePath, + required String driverID, + }) async { + var headers = { + 'Content-Type': 'application/json', + 'Ocp-Apim-Subscription-Key': AK.ocpApimSubscriptionKey + }; + + String imagePathFull = + '${AppLink.server}/card_image/$imagePath-$driverID.jpg'; + var request = http.Request( + 'POST', + Uri.parse( + 'https://eastus.api.cognitive.microsoft.com/computervision/imageanalysis:analyze?features=caption,read&model-version=latest&language=en&api-version=2024-02-01')); + request.body = json.encode({"url": imagePathFull}); + request.headers.addAll(headers); + + http.StreamedResponse response = await request.send(); + + if (response.statusCode == 200) { + return await response.stream.bytesToString(); + } else {} + } + + Future getChatGPT({ + required String link, + required String payload, + }) async { + var url = Uri.parse( + link, + ); + var headers = { + 'Content-Type': 'application/json', + 'Authorization': 'Bearer ${Env.chatGPTkeySeferNew}' + }; + var data = json.encode({ + "model": "gpt-3.5-turbo", + "messages": [ + { + "role": "user", + "content": + "Extract the desired information from the following passage as json decoded like vin,make,made,year,expiration_date,color,owner,registration_date just in this:\n\n$payload" + } + ], + "temperature": 0.9 + }); + var response = await http.post( + url, + body: data, + headers: headers, + ); + + if (response.statusCode == 200) { + return response.body; + } + return response.statusCode; + } + + + Future kazumiSMS({ + required String link, + Map? payload, + }) async { + var url = Uri.parse( + link, + ); + var headers = {'Content-Type': 'application/json'}; + var request = http.Request('POST', url); + request.body = json.encode({ + "username": "Sefer", + "password": AK.smsPasswordEgypt, + }); + request.headers.addAll(headers); + + http.StreamedResponse response = await request.send(); + + if (response.statusCode == 200) { + var responseBody = await response.stream.bytesToString(); + var data = json.decode(responseBody); + return data; + } else {} + } + + Future sendSmsEgypt(String phone, otp) async { + // String sender = await getSender(); + var headers = {'Content-Type': 'application/json'}; + var body = jsonEncode({ + "username": "Sefer", + "password": "E)Pu=an/@Z", + "message": otp, + "language": "e", + "sender": "Sefer Egy", + "receiver": phone + }); + + var res = await http.post( + Uri.parse(AppLink.sendSms), + body: body, + headers: headers, + ); + } + + Future postPayMob({ + required String link, + Map? payload, + }) async { + // String? basicAuthCredentials = + // await storage.read(key: BoxName.basicAuthCredentials); + var url = Uri.parse( + link, + ); + var response = await http.post(url, + body: payload, headers: {'Content-Type': 'application/json'}); + + var jsonData = jsonDecode(response.body); + if (response.statusCode == 200) { + if (jsonData['status'] == 'success') { + return response.body; + } else { + return (jsonData['status']); + } + } else { + return response.statusCode; + } + } + + sendEmail( + String link, + Map? payload, + ) async { + var headers = { + "Content-Type": "application/x-www-form-urlencoded", + 'Authorization': + 'Basic ${base64Encode(utf8.encode(AK.basicAuthCredentials))}', + }; + var request = http.Request('POST', Uri.parse(link)); + request.bodyFields = payload!; + request.headers.addAll(headers); + + http.StreamedResponse response = await request.send(); + if (response.statusCode == 200) { + } else {} + } + + Future postFromDialogue({ + required String link, + Map? payload, + }) async { + // String? basicAuthCredentials = + // await storage.read(key: BoxName.basicAuthCredentials); + var url = Uri.parse( + link, + ); + var response = await http.post( + url, + body: payload, + headers: { + "Content-Type": "application/x-www-form-urlencoded", + 'Authorization': + 'Basic ${base64Encode(utf8.encode(AK.basicAuthCredentials))}', + }, + ); + + if (response.body.isNotEmpty) { + var jsonData = jsonDecode(response.body); + if (response.statusCode == 200) { + if (jsonData['status'] == 'success') { + Get.back(); + // Get.snackbar( + // jsonData['status'], + // jsonData['message'], + // ); + + return response.body; + } + } + return (jsonData['status']); + } + } + + Future sendVerificationRequest(String phoneNumber) async { + final accountSid = AK.accountSIDTwillo; + final authToken = AK.authTokenTwillo; + final verifySid = AK.twilloRecoveryCode; + + final Uri verificationUri = Uri.parse( + 'https://verify.twilio.com/v2/Services/$verifySid/Verifications'); + + // Send the verification request + final response = await http.post( + verificationUri, + headers: { + 'Authorization': + 'Basic ${base64Encode(utf8.encode('$accountSid:$authToken'))}', + 'Content-Type': 'application/x-www-form-urlencoded', + }, + body: { + 'To': phoneNumber, + 'Channel': 'sms', + }, + ); + + if (response.statusCode == 201) { + } else {} + + // Prompt the user to enter the OTP + const otpCode = "123456"; // Replace with user input + + // Check the verification code + final checkUri = Uri.parse( + 'https://verify.twilio.com/v2/Services/$verifySid/VerificationCheck'); + + final checkResponse = await http.post( + checkUri, + headers: { + 'Authorization': + 'Basic ${base64Encode(utf8.encode('$accountSid:$authToken'))}', + 'Content-Type': 'application/x-www-form-urlencoded', + }, + body: { + 'To': phoneNumber, + 'Code': otpCode, + }, + ); + + if (checkResponse.statusCode == 201) { + } else {} + } + + Future getGoogleApi({ + required String link, + Map? payload, + }) async { + var url = Uri.parse( + link, + ); + var response = await http.post( + url, + body: payload, + ); + var jsonData = jsonDecode(response.body); + if (jsonData['status'] == 'OK') { + return jsonData; + } + return (jsonData['status']); + } + + Future update({ + required String endpoint, + required Map data, + required String id, + }) async { + // String? basicAuthCredentials = + // await storage.read(key: BoxName.basicAuthCredentials); + var url = Uri.parse('$endpoint/$id'); + var response = await http.put( + url, + body: json.encode(data), + headers: { + 'Authorization': + 'Basic ${base64Encode(utf8.encode(AK.basicAuthCredentials))}', + }, + ); + return json.decode(response.body); + } + + Future delete({ + required String endpoint, + required String id, + }) async { + // String? basicAuthCredentials = + // await storage.read(key: BoxName.basicAuthCredentials); + var url = Uri.parse('$endpoint/$id'); + var response = await http.delete( + url, + headers: { + 'Authorization': + 'Basic ${base64Encode(utf8.encode(AK.basicAuthCredentials))}', + }, + ); + return json.decode(response.body); + } + + List phoneDriversTest = [ + 201023248456, + 201023248456, + ]; +} diff --git a/siro_admin/lib/controller/functions/custom_pant.dart b/siro_admin/lib/controller/functions/custom_pant.dart new file mode 100644 index 0000000..8b85ce4 --- /dev/null +++ b/siro_admin/lib/controller/functions/custom_pant.dart @@ -0,0 +1,26 @@ +import 'package:flutter/material.dart'; + +class LineChartPainter extends CustomPainter { + final List data; + + LineChartPainter(this.data); + + @override + void paint(Canvas canvas, Size size) { + // Calculate the scale factor. + final scaleFactor = size.height / 240; + + // Draw the line chart. + for (var i = 0; i < data.length - 1; i++) { + final x1 = i * size.width / data.length; + final y1 = data[i] * scaleFactor; + final x2 = (i + 1) * size.width / data.length; + final y2 = data[i + 1] * scaleFactor; + + canvas.drawLine(Offset(x1, y1), Offset(x2, y2), Paint()); + } + } + + @override + bool shouldRepaint(LineChartPainter oldDelegate) => false; +} diff --git a/siro_admin/lib/controller/functions/device_info.dart b/siro_admin/lib/controller/functions/device_info.dart new file mode 100644 index 0000000..727f842 --- /dev/null +++ b/siro_admin/lib/controller/functions/device_info.dart @@ -0,0 +1,291 @@ +// import 'dart:io'; + +// import 'package:device_info_plus/device_info_plus.dart'; + +import 'dart:async'; +import 'dart:io'; +import 'package:device_info_plus/device_info_plus.dart'; + +class DeviceHelper { + static Future getDeviceFingerprint() async { + final DeviceInfoPlugin deviceInfoPlugin = DeviceInfoPlugin(); + var deviceData; + + try { + if (Platform.isAndroid) { + // Fetch Android-specific device information + AndroidDeviceInfo androidInfo = await deviceInfoPlugin.androidInfo; + deviceData = androidInfo.toMap(); // Convert to a map for easier access + // Log.print('deviceData: ${jsonEncode(deviceData)}'); + } else if (Platform.isIOS) { + // Fetch iOS-specific device information + IosDeviceInfo iosInfo = await deviceInfoPlugin.iosInfo; + deviceData = iosInfo.toMap(); // Convert to a map for easier access + } else if (Platform.isMacOS) { + // Fetch macOS-specific device information + MacOsDeviceInfo macInfo = await deviceInfoPlugin.macOsInfo; + deviceData = macInfo.toMap(); + } else { + throw UnsupportedError('Unsupported platform'); + } + + String deviceId = 'unknown'; + if (Platform.isAndroid) { + deviceId = deviceData['fingerprint'] ?? 'unknown'; + } else if (Platform.isIOS) { + deviceId = deviceData['identifierForVendor'] ?? 'unknown'; + } else if (Platform.isMacOS) { + deviceId = deviceData['systemGUID'] ?? 'unknown'; + } + + final String deviceModel = deviceData['model'] ?? 'unknown'; + + final String fingerprint = '${deviceId}_$deviceModel'; + print(fingerprint); + return (fingerprint); + } catch (e) { + throw Exception('Failed to generate device fingerprint'); + } + } +} + +// class SecurityHelper { +// /// Performs security checks and handles potential risks +// static Future performSecurityChecks() async { +// bool isNotTrust = false; +// bool isJailBroken = false; +// bool isRealDevice = true; +// bool isOnExternalStorage = false; +// bool checkForIssues = false; +// bool isDevMode = false; +// bool isTampered = false; +// String bundleId = ""; + +// try { +// isNotTrust = await JailbreakRootDetection.instance.isNotTrust; +// isJailBroken = await JailbreakRootDetection.instance.isJailBroken; +// isRealDevice = await JailbreakRootDetection.instance.isRealDevice; +// isOnExternalStorage = +// await JailbreakRootDetection.instance.isOnExternalStorage; + +// List issues = +// await JailbreakRootDetection.instance.checkForIssues; +// checkForIssues = issues.isNotEmpty; + +// isDevMode = await JailbreakRootDetection.instance.isDevMode; + +// // Get Bundle ID +// PackageInfo packageInfo = await PackageInfo.fromPlatform(); +// bundleId = packageInfo.packageName; +// if (bundleId.isNotEmpty) { +// // Pass the CORRECT bundle ID to isTampered +// isTampered = await JailbreakRootDetection.instance.isTampered(bundleId); +// } +// } catch (e) { +// debugPrint("Error during security checks: $e"); +// // Consider handling specific exceptions, not just general errors. +// } + +// // Save values to storage (using GetStorage) +// await box.write('isNotTrust', isNotTrust); // Use await for write operations +// await box.write('isTampered', isTampered); // Use await +// await box.write('isJailBroken', isJailBroken); // Use await + +// // debugPrint("Security Check Results:"); +// // debugPrint("isNotTrust: $isNotTrust"); +// // debugPrint("isJailBroken: $isJailBroken"); +// // debugPrint("isRealDevice: $isRealDevice"); +// // debugPrint("isOnExternalStorage: $isOnExternalStorage"); +// // debugPrint("checkForIssues: $checkForIssues"); +// // debugPrint("isDevMode: $isDevMode"); +// // debugPrint("isTampered: $isTampered"); +// // debugPrint("Bundle ID: $bundleId"); // Print the bundle ID + +// // Check for security risks and potentially show a warning +// if (isJailBroken || isRealDevice == false || isTampered) { +// // print("security_warning".tr); //using easy_localization +// // Use a more robust approach to show a warning, like a dialog: +// _showSecurityWarning(); +// } +// } + +// /// Deletes all app data +// static Future clearAllData() async { +// //await storage.deleteAll(); // What's 'storage'? Be specific. Likely GetStorage as well. +// await box.erase(); // Clear GetStorage data +// exit(0); // This will terminate the app. Be VERY careful with this. +// } + +// // static void _showSecurityWarning() { +// // // Show a dialog, navigate to an error screen, etc. +// // // Example using Get.dialog (if you use GetX): +// // +// // Get.dialog( +// // AlertDialog( +// // title: Text("Security Warning".tr), // Or use localized string +// // content: Text( +// // "Potential security risks detected. The application may not function correctly." +// // .tr), //Or use localized string +// // actions: [ +// // TextButton( +// // onPressed: () async { +// // await storage.deleteAll(); +// // await box.erase(); +// // Get.back(); // Close the dialog +// // // Or, if you really must, exit the app (but give the user a chance!) +// // exit(0); +// // }, +// // child: Text("OK"), // Or use a localized string +// // ), +// // ], +// // ), +// // barrierDismissible: false, // Prevent closing by tapping outside +// // ); +// // } +// static void _showSecurityWarning() { +// // Use an RxInt to track the remaining seconds. This is the KEY! +// RxInt secondsRemaining = 10.obs; + +// Get.dialog( +// CupertinoAlertDialog( +// title: Text("Security Warning".tr), +// content: Column( +// mainAxisSize: MainAxisSize.min, +// children: [ +// Obx(() => Text( +// "Potential security risks detected. The application will close in @seconds seconds." +// .trParams({ +// // Use trParams for placeholders +// 'seconds': secondsRemaining.value.toString(), +// }), +// // Wrap the Text widget in Obx +// )), +// SizedBox(height: 24), // More spacing before the progress bar +// Obx(() => SizedBox( +// width: double.infinity, // Make progress bar full width +// child: CupertinoActivityIndicator( +// // in case of loading +// radius: 15, +// animating: true, +// ))), +// SizedBox(height: 8), +// Obx(() => ClipRRect( +// borderRadius: BorderRadius.circular(8), // Rounded corners +// child: LinearProgressIndicator( +// value: secondsRemaining.value / 10, +// backgroundColor: Colors.grey.shade300, // Lighter background +// valueColor: AlwaysStoppedAnimation( +// CupertinoColors.systemRed), // iOS-style red +// minHeight: 8, // Slightly thicker progress bar +// ), +// )), +// ], +// ), +// ), +// barrierDismissible: false, +// ); + +// Timer.periodic(Duration(seconds: 1), (timer) { +// secondsRemaining.value--; +// if (secondsRemaining.value <= 0) { +// timer.cancel(); +// // Get.back(); +// _clearDataAndExit(); +// } +// }); +// } + +// static Future _clearDataAndExit() async { +// await storage.deleteAll(); +// await box.erase(); +// exit(0); // Exit the app +// print('exit'); +// } +// } + +// class DeviceInfoPlus { +// static List> deviceDataList = []; + +// static Future>> getDeviceInfo() async { +// final DeviceInfoPlugin deviceInfoPlugin = DeviceInfoPlugin(); + +// try { +// if (Platform.isAndroid) { +// AndroidDeviceInfo androidInfo = await deviceInfoPlugin.androidInfo; +// Map deviceData = { +// 'platform': 'Android', +// 'brand': androidInfo.brand, +// 'model': androidInfo.model, +// 'androidId': androidInfo.device, +// 'versionRelease': androidInfo.version.release, +// 'sdkVersion': androidInfo.version.sdkInt, +// 'manufacturer': androidInfo.manufacturer, +// 'isPhysicalDevice': androidInfo.isPhysicalDevice, +// 'serialNumber': androidInfo.serialNumber, +// 'fingerprint': androidInfo.fingerprint, +// 'type': androidInfo.type, +// 'data': androidInfo.data, +// 'version': androidInfo.version, +// 'tags': androidInfo.tags, +// 'display': androidInfo.display, +// }; +// deviceDataList.add(deviceData); +// } else if (Platform.isIOS) { +// IosDeviceInfo iosInfo = await deviceInfoPlugin.iosInfo; +// Map deviceData = { +// 'brand': 'Apple', +// 'model': iosInfo.model, +// 'systemName': iosInfo.systemName, +// 'systemVersion': iosInfo.systemVersion, +// 'utsname': iosInfo.utsname, +// 'isPhysicalDevice': iosInfo.isPhysicalDevice, +// 'identifierForVendor': iosInfo.identifierForVendor, +// 'name': iosInfo.name, +// 'localizedModel': iosInfo.localizedModel, +// }; +// deviceDataList.add(deviceData); +// } else if (Platform.isMacOS) { +// MacOsDeviceInfo macInfo = await deviceInfoPlugin.macOsInfo; +// Map deviceData = { +// 'platform': 'macOS', +// 'model': macInfo.model, +// 'version': macInfo.systemGUID, +// }; +// deviceDataList.add(deviceData); +// } else if (Platform.isWindows) { +// WindowsDeviceInfo windowsInfo = await deviceInfoPlugin.windowsInfo; +// Map deviceData = { +// 'platform': 'Windows', +// 'manufacturer': windowsInfo.computerName, +// 'version': windowsInfo.majorVersion, +// 'deviceId': windowsInfo.deviceId, +// 'userName': windowsInfo.userName, +// 'productName': windowsInfo.productName, +// 'installDate': windowsInfo.installDate, +// 'productId': windowsInfo.productId, +// 'numberOfCores': windowsInfo.numberOfCores, +// 'systemMemoryInMegabytes': windowsInfo.systemMemoryInMegabytes, +// }; +// deviceDataList.add(deviceData); +// } else if (Platform.isLinux) { +// LinuxDeviceInfo linuxInfo = await deviceInfoPlugin.linuxInfo; +// Map deviceData = { +// 'platform': 'Linux', +// 'manufacturer': linuxInfo.name, +// 'version': linuxInfo.version, +// }; +// deviceDataList.add(deviceData); +// } +// } catch (e) { +// } + +// return deviceDataList; +// } + +// // Method to print all device data +// static void printDeviceInfo() { +// for (Map deviceData in deviceDataList) { +// 'Version: ${deviceData['version'] ?? deviceData['versionRelease'] ?? 'N/A'}'); +// } +// } +// } diff --git a/siro_admin/lib/controller/functions/digit_obsecur_formate.dart b/siro_admin/lib/controller/functions/digit_obsecur_formate.dart new file mode 100644 index 0000000..b5972e4 --- /dev/null +++ b/siro_admin/lib/controller/functions/digit_obsecur_formate.dart @@ -0,0 +1,42 @@ +import 'package:flutter/services.dart'; + +class DigitObscuringFormatter extends TextInputFormatter { + @override + TextEditingValue formatEditUpdate( + TextEditingValue oldValue, TextEditingValue newValue) { + final maskedText = maskDigits(newValue.text); + return newValue.copyWith( + text: maskedText, + selection: updateCursorPosition(maskedText, newValue.selection)); + } + + String maskDigits(String text) { + final totalDigits = text.length; + final visibleDigits = 4; + final hiddenDigits = totalDigits - visibleDigits * 2; + + final firstVisibleDigits = text.substring(0, visibleDigits); + final lastVisibleDigits = text.substring(totalDigits - visibleDigits); + + final maskedDigits = List.filled(hiddenDigits, '*').join(); + + return '$firstVisibleDigits$maskedDigits$lastVisibleDigits'; + } + + TextSelection updateCursorPosition( + String maskedText, TextSelection currentSelection) { + final cursorPosition = currentSelection.baseOffset; + final cursorOffset = + currentSelection.extentOffset - currentSelection.baseOffset; + final totalDigits = maskedText.length; + const visibleDigits = 4; + final hiddenDigits = totalDigits - visibleDigits * 2; + + final updatedPosition = cursorPosition <= visibleDigits + ? cursorPosition + : hiddenDigits + visibleDigits + (cursorPosition - visibleDigits); + + return TextSelection.collapsed( + offset: updatedPosition, affinity: currentSelection.affinity); + } +} diff --git a/siro_admin/lib/controller/functions/document_scanner.dart b/siro_admin/lib/controller/functions/document_scanner.dart new file mode 100644 index 0000000..198992c --- /dev/null +++ b/siro_admin/lib/controller/functions/document_scanner.dart @@ -0,0 +1,41 @@ +// import 'dart:io'; +// +// import 'package:get/get.dart'; +// import 'package:image_picker/image_picker.dart'; +// import 'package:google_ml_kit/google_ml_kit.dart'; +// +// class ImagePickerController extends GetxController { +// RxBool textScanning = false.obs; +// RxString scannedText = ''.obs; +// +// Future getImage(ImageSource source) async { +// try { +// final pickedImage = await ImagePicker().pickImage(source: source); +// if (pickedImage != null) { +// textScanning.value = true; +// final imageFile = File(pickedImage.path); +// getRecognisedText(imageFile); +// } +// } catch (e) { +// textScanning.value = false; +// scannedText.value = "Error occurred while scanning"; +// } +// } +// +// Future getRecognisedText(File image) async { +// final inputImage = InputImage.fromFilePath(image.path); +// final textDetector = GoogleMlKit.vision.textRecognizer(); +// final RecognizedText recognisedText = +// await textDetector.processImage(inputImage); +// await textDetector.close(); +// +// scannedText.value = ''; +// for (TextBlock block in recognisedText.blocks) { +// for (TextLine line in block.lines) { +// scannedText.value += line.text + '\n'; +// } +// } +// +// textScanning.value = false; +// } +// } diff --git a/siro_admin/lib/controller/functions/encrypt_decrypt.dart b/siro_admin/lib/controller/functions/encrypt_decrypt.dart new file mode 100644 index 0000000..4e56d25 --- /dev/null +++ b/siro_admin/lib/controller/functions/encrypt_decrypt.dart @@ -0,0 +1,79 @@ +import 'package:encrypt/encrypt.dart' as encrypt; +import 'package:flutter/foundation.dart'; +import 'package:secure_string_operations/secure_string_operations.dart'; + +import '../../constant/char_map.dart'; +import '../../env/env.dart'; +import '../../main.dart'; +import '../../print.dart'; + +class EncryptionHelper { + static EncryptionHelper? _instance; + + late final encrypt.Key key; + late final encrypt.IV iv; + + EncryptionHelper._(this.key, this.iv); + static EncryptionHelper get instance { + if (_instance == null) { + throw Exception( + "EncryptionHelper is not initialized. Call `await EncryptionHelper.initialize()` in main."); + } + return _instance!; + } + + /// Initializes and stores the instance globally + static Future initialize() async { + if (_instance != null) { + debugPrint("EncryptionHelper is already initialized."); + return; // Prevent re-initialization + } + debugPrint("Initializing EncryptionHelper..."); + var keyOfApp = r(Env.keyOfApp).toString().split(Env.addd)[0]; + // Log.print('keyOfApp: ${keyOfApp}'); + var initializationVector = + r(Env.initializationVector).toString().split(Env.addd)[0]; + // Log.print('initializationVector: ${initializationVector}'); + + // Set the global instance + _instance = EncryptionHelper._( + encrypt.Key.fromUtf8(keyOfApp), + encrypt.IV.fromUtf8(initializationVector), + ); + debugPrint("EncryptionHelper initialized successfully."); + } + + /// Encrypts a string + String encryptData(String plainText) { + try { + final encrypter = + encrypt.Encrypter(encrypt.AES(key, mode: encrypt.AESMode.cbc)); + final encrypted = encrypter.encrypt(plainText, iv: iv); + return encrypted.base64; + } catch (e) { + debugPrint('Encryption Error: $e'); + return ''; + } + } + + /// Decrypts a string + String decryptData(String encryptedText) { + try { + final encrypter = + encrypt.Encrypter(encrypt.AES(key, mode: encrypt.AESMode.cbc)); + final encrypted = encrypt.Encrypted.fromBase64(encryptedText); + return encrypter.decrypt(encrypted, iv: iv); + } catch (e) { + debugPrint('Decryption Error: $e'); + return ''; + } + } +} + +r(String string) { + return X.r(X.r(X.r(string, cn), cC), cs).toString(); +} + +c(String string) { + return X.c(X.c(X.c(string, cn), cC), cs).toString(); +} diff --git a/siro_admin/lib/controller/functions/gemeni.dart b/siro_admin/lib/controller/functions/gemeni.dart new file mode 100644 index 0000000..14bca12 --- /dev/null +++ b/siro_admin/lib/controller/functions/gemeni.dart @@ -0,0 +1,829 @@ +// import 'dart:convert'; +// import 'dart:io'; +// import 'package:get/get.dart'; +// import 'package:image_cropper/image_cropper.dart'; +// import 'package:image_picker/image_picker.dart'; +// import 'package:http/http.dart' as http; +// import 'package:image/image.dart' as img; +// import 'package:path_provider/path_provider.dart'; + +// import '../../constant/api_key.dart'; +// import '../../constant/colors.dart'; + +// class AI extends GetxController { +// final picker = ImagePicker(); +// Map responseMap = {}; +// Map responseCarLicenseMap = {}; +// Map responseBackCarLicenseMap = {}; +// Map responseIdCardeMap = {}; +// bool isloading = false; +// var image; +// CroppedFile? croppedFile; +// DateTime now = DateTime.now(); +// Future pickImage() async { +// final pickedImage = await picker.pickImage(source: ImageSource.gallery); + +// if (pickedImage != null) { +// image = File(pickedImage.path); +// // Crop the image +// croppedFile = await ImageCropper().cropImage( +// sourcePath: image!.path, +// aspectRatioPresets: [ +// CropAspectRatioPreset.square, +// CropAspectRatioPreset.ratio3x2, +// CropAspectRatioPreset.original, +// CropAspectRatioPreset.ratio4x3, +// CropAspectRatioPreset.ratio16x9 +// ], +// uiSettings: [ +// AndroidUiSettings( +// toolbarTitle: 'Cropper'.tr, +// toolbarColor: AppColor.blueColor, +// toolbarWidgetColor: AppColor.yellowColor, +// initAspectRatio: CropAspectRatioPreset.original, +// lockAspectRatio: false), +// IOSUiSettings( +// title: 'Cropper'.tr, +// ), +// ], +// ); +// // image = croppedFile; + +// // Resize the image +// final rawImage = +// img.decodeImage(File(croppedFile!.path).readAsBytesSync()); +// final resizedImage = +// img.copyResize(rawImage!, width: 800); // Adjust the width as needed + +// final appDir = await getTemporaryDirectory(); +// final resizedImagePath = '${appDir.path}/resized_image.jpg'; + +// final resizedImageFile = File(resizedImagePath); +// resizedImageFile.writeAsBytesSync( +// img.encodeJpg(resizedImage)); // Save the resized image as JPEG + +// image = resizedImageFile; +// update(); +// } +// } + +// Future generateContent() async { +// await pickImage(); +// if (image != null) { +// final imageBytes = await image.readAsBytes(); +// final imageData = base64Encode(imageBytes); + +// var requestBody = jsonEncode({ +// 'contents': [ +// { +// 'parts': [ +// { +// 'inlineData': { +// 'mimeType': 'image/jpeg', +// 'data': imageData, +// }, +// }, +// { +// 'text': +// 'write json for all data as first name ,last name,dob,licenseID,expiration date,issued date asdress class type ,output json type', +// }, +// ], +// }, +// ], +// 'generationConfig': { +// 'temperature': 0.4, +// 'topK': 32, +// 'topP': 1, +// 'maxOutputTokens': 4096, +// 'stopSequences': [], +// }, +// 'safetySettings': [ +// { +// 'category': 'HARM_CATEGORY_HARASSMENT', +// 'threshold': 'BLOCK_MEDIUM_AND_ABOVE', +// }, +// { +// 'category': 'HARM_CATEGORY_HATE_SPEECH', +// 'threshold': 'BLOCK_MEDIUM_AND_ABOVE', +// }, +// { +// 'category': 'HARM_CATEGORY_SEXUALLY_EXPLICIT', +// 'threshold': 'BLOCK_MEDIUM_AND_ABOVE', +// }, +// { +// 'category': 'HARM_CATEGORY_DANGEROUS_CONTENT', +// 'threshold': 'BLOCK_MEDIUM_AND_ABOVE', +// }, +// ], +// }); + +// final response = await http.post( +// Uri.parse( +// 'https://generativelanguage.googleapis.com/v1beta/models/gemini-pro-vision:generateContent?key=${AK.geminiApi}'), +// headers: {'Content-Type': 'application/json'}, +// body: requestBody, +// ); + +// if (response.statusCode == 200) { +// var responseData = jsonDecode(response.body); +// // Process the responseData as needed + +// var result = +// responseData['candidates'][0]['content']['parts'][0]['text']; +// RegExp regex = RegExp(r"```json([^`]*)```"); +// String? jsonString = +// regex.firstMatch(responseData.toString())?.group(1)?.trim(); + +// if (jsonString != null) { +// // Convert the JSON object to a String +// jsonString = jsonEncode(json.decode(jsonString)); +// } else { +// } + +// // Rest of your code... +// } else { +// } +// } else { +// } +// } + +// Future geminiAiExtraction(String prompt, payload) async { +// var requestBody = jsonEncode({ +// 'contents': [ +// { +// 'parts': [ +// // { +// // 'inlineData': { +// // 'mimeType': 'image/jpeg', +// // 'data': imageData, +// // }, +// // }, +// { +// 'text': +// "Extract the desired information from the following passage as json decoded like $prompt .and look for this instruction first name in line 3or 2 ,fullname in line 4 from it written left to right but you modify it rtl,address in line 5 it written left to right but you modify it rtl and 6,dob,nationalid in the last line as just in this:\n\n$payload" +// }, +// ], +// }, +// ], +// 'generationConfig': { +// 'temperature': 0.4, +// 'topK': 32, +// 'topP': 1, +// 'maxOutputTokens': 4096, +// 'stopSequences': [], +// }, +// 'safety_settings': [ +// {"category": "HARM_CATEGORY_HARASSMENT", "threshold": "BLOCK_NONE"}, +// {"category": "HARM_CATEGORY_HATE_SPEECH", "threshold": "BLOCK_NONE"}, +// { +// "category": "HARM_CATEGORY_SEXUALLY_EXPLICIT", +// "threshold": "BLOCK_NONE" +// }, +// { +// "category": "HARM_CATEGORY_DANGEROUS_CONTENT", +// "threshold": "BLOCK_NONE" +// }, +// ] +// }); + +// final response = await http.post( +// Uri.parse( +// // 'https://generativelanguage.googleapis.com/v1beta/models/gemini-pro-vision:generateContent?key=${AK.geminiApi}'), +// 'https://generativelanguage.googleapis.com/v1beta/models/gemini-1.5-pro-latest:generateContent?key=AIzaSyCyoLcSkDzK5_SMe00nhut56SSXWPR074w'), +// headers: {'Content-Type': 'application/json'}, +// body: requestBody, +// ); + +// if (response.statusCode == 200) { +// var responseData = jsonDecode(response.body); +// // Process the responseData as needed + +// var result = responseData['candidates'][0]['content']['parts'][0]['text']; +// RegExp regex = RegExp(r"```json([^`]*)```"); +// String? jsonString = +// regex.firstMatch(responseData.toString())?.group(1)?.trim(); + +// if (jsonString != null) { +// // Convert the JSON object to a String +// jsonString = jsonEncode(json.decode(jsonString)); +// } else { +// } + +// // Rest of your code... +// } else { +// } +// } + +// Future getDriverLicenseJordanContent() async { +// await pickImage(); +// isloading = true; +// update(); +// if (image != null) { +// final imageBytes = await image.readAsBytes(); +// final imageData = base64Encode(imageBytes); + +// var requestBody = jsonEncode({ +// 'contents': [ +// { +// 'parts': [ +// { +// 'inlineData': { +// 'mimeType': 'image/jpeg', +// 'data': imageData, +// }, +// }, +// { +// 'text': +// 'write json for all data as first name ,last name,dob,id ,expiration date,issued date asdress class type,age in years ,output json type in arabic value and stay engish key and make date format like YYYY-MM-DD , for name please extract name in arabic in Name in json plus first_name ', +// }, +// ], +// }, +// ], +// 'generationConfig': { +// 'temperature': 0.4, +// 'topK': 32, +// 'topP': 1, +// 'maxOutputTokens': 4096, +// 'stopSequences': [], +// }, +// 'safetySettings': [ +// { +// 'category': 'HARM_CATEGORY_HARASSMENT', +// 'threshold': 'BLOCK_MEDIUM_AND_ABOVE', +// }, +// { +// 'category': 'HARM_CATEGORY_HATE_SPEECH', +// 'threshold': 'BLOCK_MEDIUM_AND_ABOVE', +// }, +// { +// 'category': 'HARM_CATEGORY_SEXUALLY_EXPLICIT', +// 'threshold': 'BLOCK_MEDIUM_AND_ABOVE', +// }, +// { +// 'category': 'HARM_CATEGORY_DANGEROUS_CONTENT', +// 'threshold': 'BLOCK_MEDIUM_AND_ABOVE', +// }, +// ], +// }); + +// final response = await http.post( +// Uri.parse( +// 'https://generativelanguage.googleapis.com/v1beta/models/gemini-pro-vision:generateContent?key=${AK.geminiApi}'), +// headers: {'Content-Type': 'application/json'}, +// body: requestBody, +// ); +// isloading = false; +// update(); +// if (response.statusCode == 200) { +// var responseData = jsonDecode(response.body); +// // Process the responseData as needed + +// var result = +// responseData['candidates'][0]['content']['parts'][0]['text']; +// RegExp regex = RegExp(r"```json([^`]*)```"); +// String? jsonString = +// regex.firstMatch(responseData.toString())?.group(1)?.trim(); + +// if (jsonString != null) { +// // Convert the JSON object to a String +// jsonString = jsonEncode(json.decode(jsonString)); +// responseMap = jsonDecode(jsonString); +// } else { +// } + +// // Rest of your code... +// } else { +// } +// } else { +// } +// } + +// Future getCarLicenseJordanContent() async { +// await pickImage(); +// isloading = true; +// update(); +// if (image != null) { +// final imageBytes = await image.readAsBytes(); +// final imageData = base64Encode(imageBytes); + +// var requestBody = jsonEncode({ +// 'contents': [ +// { +// 'parts': [ +// { +// 'inlineData': { +// 'mimeType': 'image/jpeg', +// 'data': imageData, +// }, +// }, +// { +// 'text': +// '''Extract the following information from the front face of the Jordanian ID card: +// Name +// National ID number +// Gender +// Date of birth +// Output the extracted information in the following JSON format''', +// }, +// ], +// }, +// ], +// 'generationConfig': { +// 'temperature': 0.4, +// 'topK': 32, +// 'topP': 1, +// 'maxOutputTokens': 4096, +// 'stopSequences': [], +// }, +// 'safetySettings': [ +// { +// 'category': 'HARM_CATEGORY_HARASSMENT', +// 'threshold': 'BLOCK_MEDIUM_AND_ABOVE', +// }, +// { +// 'category': 'HARM_CATEGORY_HATE_SPEECH', +// 'threshold': 'BLOCK_MEDIUM_AND_ABOVE', +// }, +// { +// 'category': 'HARM_CATEGORY_SEXUALLY_EXPLICIT', +// 'threshold': 'BLOCK_MEDIUM_AND_ABOVE', +// }, +// { +// 'category': 'HARM_CATEGORY_DANGEROUS_CONTENT', +// 'threshold': 'BLOCK_MEDIUM_AND_ABOVE', +// }, +// ], +// }); + +// final response = await http.post( +// Uri.parse( +// // 'https://${API_ENDPOINT}/v1/projects/${PROJECT_ID}/locations/${LOCATION_ID}/publishers/google/models/${MODEL_ID}:streamGenerateContent'), +// 'https://generativelanguage.googleapis.com/v1beta/models/gemini-pro-vision:generateContent?key=${AK.geminiApi}'), +// headers: {'Content-Type': 'application/json'}, +// body: requestBody, +// ); +// isloading = false; +// update(); +// if (response.statusCode == 200) { +// var responseData = jsonDecode(response.body); +// // Process the responseData as needed + +// var result = +// responseData['candidates'][0]['content']['parts'][0]['text']; +// RegExp regex = RegExp(r"```json([^`]*)```"); +// String? jsonString = +// regex.firstMatch(responseData.toString())?.group(1)?.trim(); + +// if (jsonString != null) { +// // Convert the JSON object to a String +// jsonString = jsonEncode(json.decode(jsonString)); +// responseCarLicenseMap = jsonDecode(jsonString); +// } else { +// } + +// // Rest of your code... +// } else { +// } +// } else { +// } +// } + +// Future jordanID() async { +// await pickImage(); +// isloading = true; +// update(); +// if (image != null) { +// final imageBytes = await image.readAsBytes(); +// final imageData = base64Encode(imageBytes); + +// var requestBody = jsonEncode({ +// 'contents': [ +// { +// 'parts': [ +// { +// 'inlineData': { +// 'mimeType': 'image/jpeg', +// 'data': imageData, +// }, +// }, +// { +// 'text': +// '''Extract the following information from the front face of the Jordanian ID card: +// Name +// National ID number +// Gender +// Date of birth +// Output the extracted information in the following JSON format''', +// }, +// ], +// }, +// ], +// 'generationConfig': { +// 'temperature': 0.4, +// 'topK': 32, +// 'topP': 1, +// 'maxOutputTokens': 4096, +// 'stopSequences': [], +// }, +// 'safetySettings': [ +// { +// 'category': 'HARM_CATEGORY_HARASSMENT', +// 'threshold': 'BLOCK_MEDIUM_AND_ABOVE', +// }, +// { +// 'category': 'HARM_CATEGORY_HATE_SPEECH', +// 'threshold': 'BLOCK_MEDIUM_AND_ABOVE', +// }, +// { +// 'category': 'HARM_CATEGORY_SEXUALLY_EXPLICIT', +// 'threshold': 'BLOCK_MEDIUM_AND_ABOVE', +// }, +// { +// 'category': 'HARM_CATEGORY_DANGEROUS_CONTENT', +// 'threshold': 'BLOCK_MEDIUM_AND_ABOVE', +// }, +// ], +// }); + +// final response = await http.post( +// Uri.parse( +// 'https://generativelanguage.googleapis.com/v1beta/models/gemini-pro-vision:generateContent?key=${AK.geminiApi}'), +// headers: {'Content-Type': 'application/json'}, +// body: requestBody, +// ); +// isloading = false; +// update(); +// if (response.statusCode == 200) { +// var responseData = jsonDecode(response.body); +// // Process the responseData as needed + +// var result = +// responseData['candidates'][0]['content']['parts'][0]['text']; +// RegExp regex = RegExp(r"```json([^`]*)```"); +// String? jsonString = +// regex.firstMatch(responseData.toString())?.group(1)?.trim(); + +// if (jsonString != null) { +// // Convert the JSON object to a String +// jsonString = jsonEncode(json.decode(jsonString)); +// responseCarLicenseMap = jsonDecode(jsonString); +// } else { +// } + +// // Rest of your code... +// } else { +// } +// } else { +// } +// } + +// Future carLicenseJordan() async { +// await pickImage(); +// isloading = true; +// update(); +// if (image != null) { +// final imageBytes = await image.readAsBytes(); +// final imageData = base64Encode(imageBytes); + +// var requestBody = jsonEncode({ +// 'contents': [ +// { +// 'parts': [ +// { +// 'inlineData': { +// 'mimeType': 'image/jpeg', +// 'data': imageData, +// }, +// }, +// { +// 'text': +// '''Extract the following information from the front face of the car license card in Jordan: + +// * name +// * Address +// * Vehicle type +// * car_kind +// * car_color +// * Vehicle category +// * car_year +// * car_plate +// * Registration type +// * Usage type +// * expire_date_of_license + +// Output the extracted information in the following JSON formate and make date format like YYYY-MM-DD''', +// }, +// ], +// }, +// ], +// 'generationConfig': { +// 'temperature': 0.4, +// 'topK': 32, +// 'topP': 1, +// 'maxOutputTokens': 4096, +// 'stopSequences': [], +// }, +// 'safetySettings': [ +// { +// 'category': 'HARM_CATEGORY_HARASSMENT', +// 'threshold': 'BLOCK_MEDIUM_AND_ABOVE', +// }, +// { +// 'category': 'HARM_CATEGORY_HATE_SPEECH', +// 'threshold': 'BLOCK_MEDIUM_AND_ABOVE', +// }, +// { +// 'category': 'HARM_CATEGORY_SEXUALLY_EXPLICIT', +// 'threshold': 'BLOCK_MEDIUM_AND_ABOVE', +// }, +// { +// 'category': 'HARM_CATEGORY_DANGEROUS_CONTENT', +// 'threshold': 'BLOCK_MEDIUM_AND_ABOVE', +// }, +// ], +// }); + +// final response = await http.post( +// Uri.parse( +// 'https://generativelanguage.googleapis.com/v1beta/models/gemini-1.0-pro-vision-latest:generateContent?key=${AK.geminiApi}'), +// headers: {'Content-Type': 'application/json'}, +// body: requestBody, +// ); +// isloading = false; +// update(); +// if (response.statusCode == 200) { +// var responseData = jsonDecode(response.body); +// // Process the responseData as needed + +// var result = +// responseData['candidates'][0]['content']['parts'][0]['text']; +// RegExp regex = RegExp(r"```json([^`]*)```"); +// String? jsonString = +// regex.firstMatch(responseData.toString())?.group(1)?.trim(); + +// if (jsonString != null) { +// // Convert the JSON object to a String +// jsonString = jsonEncode(json.decode(jsonString)); +// responseCarLicenseMap = jsonDecode(jsonString); +// } else { +// } + +// // Rest of your code... +// } else { +// } +// } else { +// } +// } + +// Future getTextFromCard(String prompt) async { +// await pickImage(); +// isloading = true; +// update(); +// if (image != null) { +// final imageBytes = await image.readAsBytes(); +// final imageData = base64Encode(imageBytes); + +// var requestBody = jsonEncode({ +// 'contents': [ +// { +// 'parts': [ +// { +// 'inlineData': { +// 'mimeType': 'image/jpeg', +// 'data': imageData, +// }, +// }, +// { +// 'text': prompt, +// }, +// ], +// }, +// ], +// 'generationConfig': { +// "temperature": 1, +// "topK": 32, +// "topP": 0.1, +// "maxOutputTokens": 4096, +// "stopSequences": [] +// }, +// 'safetySettings': [ +// { +// 'category': 'HARM_CATEGORY_HARASSMENT', +// 'threshold': 'BLOCK_MEDIUM_AND_ABOVE', +// }, +// { +// 'category': 'HARM_CATEGORY_HATE_SPEECH', +// 'threshold': 'BLOCK_MEDIUM_AND_ABOVE', +// }, +// { +// 'category': 'HARM_CATEGORY_SEXUALLY_EXPLICIT', +// 'threshold': 'BLOCK_MEDIUM_AND_ABOVE', +// }, +// { +// 'category': 'HARM_CATEGORY_DANGEROUS_CONTENT', +// 'threshold': 'BLOCK_MEDIUM_AND_ABOVE', +// }, +// ], +// }); + +// final response = await http.post( +// Uri.parse( +// 'https://generativelanguage.googleapis.com/v1beta/models/gemini-1.0-pro-vision-latest:generateContent?key=${AK.geminiApi}'), +// headers: {'Content-Type': 'application/json'}, +// body: requestBody, +// ); +// isloading = false; +// update(); +// if (response.statusCode == 200) { +// var responseData = jsonDecode(response.body); +// // Process the responseData as needed + +// var result = +// responseData['candidates'][0]['content']['parts'][0]['text']; +// RegExp regex = RegExp(r"```json([^`]*)```"); +// String? jsonString = +// regex.firstMatch(responseData.toString())?.group(1)?.trim(); + +// if (jsonString != null) { +// // Convert the JSON object to a String +// jsonString = jsonEncode(json.decode(jsonString)); +// responseBackCarLicenseMap = jsonDecode(jsonString); +// } else { +// } + +// // Rest of your code... +// } else { +// } +// } else { +// } +// } + +// Future generateBackCarLicenseJordanContent() async { +// await pickImage(); +// isloading = true; +// update(); +// if (image != null) { +// final imageBytes = await image.readAsBytes(); +// final imageData = base64Encode(imageBytes); + +// var requestBody = jsonEncode({ +// 'contents': [ +// { +// 'parts': [ +// { +// 'inlineData': { +// 'mimeType': 'image/jpeg', +// 'data': imageData, +// }, +// }, +// { +// 'text': +// 'write json output from extracting car license back face for these key ,vin,fuelType,passengerType,curbWeight,insuranceCompany,policyNumber,notes,insuranceType and output it json .dont add data else this image', +// }, +// ], +// }, +// ], +// 'generationConfig': { +// 'temperature': 0.4, +// 'topK': 343, +// 'topP': 1, +// 'maxOutputTokens': 4096, +// 'stopSequences': [], +// }, +// 'safetySettings': [ +// { +// 'category': 'HARM_CATEGORY_HARASSMENT', +// 'threshold': 'BLOCK_MEDIUM_AND_ABOVE', +// }, +// { +// 'category': 'HARM_CATEGORY_HATE_SPEECH', +// 'threshold': 'BLOCK_MEDIUM_AND_ABOVE', +// }, +// { +// 'category': 'HARM_CATEGORY_SEXUALLY_EXPLICIT', +// 'threshold': 'BLOCK_MEDIUM_AND_ABOVE', +// }, +// { +// 'category': 'HARM_CATEGORY_DANGEROUS_CONTENT', +// 'threshold': 'BLOCK_MEDIUM_AND_ABOVE', +// }, +// ], +// }); + +// final response = await http.post( +// Uri.parse( +// 'https://generativelanguage.googleapis.com/v1beta/models/gemini-pro-vision:generateContent?key=${AK.geminiApi}'), +// headers: {'Content-Type': 'application/json'}, +// body: requestBody, +// ); +// isloading = false; +// update(); +// if (response.statusCode == 200) { +// var responseData = jsonDecode(response.body); +// // Process the responseData as needed + +// var result = +// responseData['candidates'][0]['content']['parts'][0]['text']; +// RegExp regex = RegExp(r"```json([^`]*)```"); +// String? jsonString = +// regex.firstMatch(responseData.toString())?.group(1)?.trim(); + +// if (jsonString != null) { +// // Convert the JSON object to a String +// jsonString = jsonEncode(json.decode(jsonString)); +// responseBackCarLicenseMap = jsonDecode(jsonString); +// } else { +// } + +// // Rest of your code... +// } else { +// } +// } else { +// } +// } + +// Future getFromCarRegistration() async { +// await pickImage(); +// if (image != null) { +// final imageBytes = await image.readAsBytes(); +// final imageData = base64Encode(imageBytes); + +// var requestBody = jsonEncode({ +// 'contents': [ +// { +// 'parts': [ +// { +// 'inlineData': { +// 'mimeType': 'image/jpeg', +// 'data': imageData, +// }, +// }, +// { +// 'text': +// 'write output json from image for[ vin, make, model, year, expiration_date, color, owner, registration_date ],output json type ', +// }, +// ], +// }, +// ], +// 'generationConfig': { +// 'temperature': 0.4, +// 'topK': 32, +// 'topP': 1, +// 'maxOutputTokens': 4096, +// 'stopSequences': [], +// }, +// 'safetySettings': [ +// { +// 'category': 'HARM_CATEGORY_HARASSMENT', +// 'threshold': 'BLOCK_MEDIUM_AND_ABOVE', +// }, +// { +// 'category': 'HARM_CATEGORY_HATE_SPEECH', +// 'threshold': 'BLOCK_MEDIUM_AND_ABOVE', +// }, +// { +// 'category': 'HARM_CATEGORY_SEXUALLY_EXPLICIT', +// 'threshold': 'BLOCK_MEDIUM_AND_ABOVE', +// }, +// { +// 'category': 'HARM_CATEGORY_DANGEROUS_CONTENT', +// 'threshold': 'BLOCK_MEDIUM_AND_ABOVE', +// }, +// ], +// }); + +// final response = await http.post( +// Uri.parse( +// 'https://generativelanguage.googleapis.com/v1beta/models/gemini-pro-vision:generateContent?key=${AK.geminiApi}'), +// headers: {'Content-Type': 'application/json'}, +// body: requestBody, +// ); + +// if (response.statusCode == 200) { +// var responseData = jsonDecode(response.body); +// // Process the responseData as needed +// var result = +// responseData['candidates'][0]['content']['parts'][0]['text']; +// RegExp regex = RegExp(r"```json([^`]*)```"); +// String? jsonString = +// regex.firstMatch(responseData.toString())?.group(1)?.trim(); + +// if (jsonString != null) { +// // Convert the JSON object to a String +// jsonString = jsonEncode(json.decode(jsonString)); +// } else { +// } + +// // Rest of your code... +// } else { +// } +// } else { +// } +// } + +// @override +// void onInit() { +// // generateContent(); +// super.onInit(); +// } +// } diff --git a/siro_admin/lib/controller/functions/launch.dart b/siro_admin/lib/controller/functions/launch.dart new file mode 100644 index 0000000..72fc360 --- /dev/null +++ b/siro_admin/lib/controller/functions/launch.dart @@ -0,0 +1,71 @@ +import 'package:url_launcher/url_launcher.dart'; +import 'dart:io'; + +void showInBrowser(String url) async { + if (await canLaunchUrl(Uri.parse(url))) { + launchUrl(Uri.parse(url)); + } else {} +} + +Future makePhoneCall(String phoneNumber) async { + final Uri launchUri = Uri( + scheme: 'tel', + path: phoneNumber, + ); + await launchUrl(launchUri); +} + +void launchCommunication( + String method, String contactInfo, String message) async { + String url; + + if (Platform.isIOS) { + switch (method) { + case 'phone': + url = 'tel:$contactInfo'; + break; + + case 'sms': + url = 'sms:$contactInfo?body=$message'; + break; + + case 'whatsapp': + url = 'https://api.whatsapp.com/send?phone=$contactInfo&text=$message'; + break; + + case 'email': + url = 'mailto:$contactInfo?subject=Subject&body=$message'; + break; + + default: + return; + } + } else if (Platform.isAndroid) { + switch (method) { + case 'phone': + url = 'tel:$contactInfo'; + break; + + case 'sms': + url = 'sms:$contactInfo?body=$message'; + break; + + case 'whatsapp': + url = 'whatsapp://send?phone=$contactInfo&text=$message'; + break; + + case 'email': + url = 'mailto:$contactInfo?subject=Subject&body=$message'; + break; + + default: + return; + } + } else { + return; + } + + if (await canLaunchUrl(Uri.parse(url))) { + launchUrl(Uri.parse(url)); + } else {} +} diff --git a/siro_admin/lib/controller/functions/llama_ai.dart b/siro_admin/lib/controller/functions/llama_ai.dart new file mode 100644 index 0000000..60e8c33 --- /dev/null +++ b/siro_admin/lib/controller/functions/llama_ai.dart @@ -0,0 +1,36 @@ +import 'dart:convert'; + +import '../../constant/links.dart'; +import 'crud.dart'; + +class LlamaAi { + Future getCarRegistrationData(String input, prompt) async { + Map exrtatDataFinal = {}; + String oneLine = input.replaceAll('\n', ' '); + // var res = await CRUD().getLlama(link: AppLink.gemini, payload: oneLine); + var res = await CRUD() + .getLlama(link: AppLink.llama, payload: oneLine, prompt: prompt); + + var decod = jsonDecode(res.toString()); + // exrtatDataFinal = jsonDecode(extractDataFromJsonString(decod['choices'])); + extractDataFromJsonString(decod['choices'][0]['message']['content']); + return exrtatDataFinal; + } + + String extractDataFromJsonString(String jsonString) { + // Remove any leading or trailing whitespace from the string + jsonString = jsonString.trim(); + + // Extract the JSON substring from the given string + final startIndex = jsonString.indexOf('{'); + final endIndex = jsonString.lastIndexOf('}'); + final jsonSubstring = jsonString.substring(startIndex, endIndex + 1); + + // Parse the JSON substring into a Map + final jsonData = jsonDecode(jsonSubstring); + + // Return the extracted data + + return jsonEncode(jsonData); + } +} diff --git a/siro_admin/lib/controller/functions/location_controller.dart b/siro_admin/lib/controller/functions/location_controller.dart new file mode 100644 index 0000000..35a57e7 --- /dev/null +++ b/siro_admin/lib/controller/functions/location_controller.dart @@ -0,0 +1,133 @@ +// import 'dart:async'; + +// import 'package:get/get.dart'; +// import 'package:google_maps_flutter/google_maps_flutter.dart'; +// import 'package:location/location.dart'; + +// import '../../constant/box_name.dart'; +// import '../../constant/links.dart'; +// import '../../main.dart'; +// import 'crud.dart'; + +// // LocationController.dart +// class LocationController extends GetxController { +// LocationData? _currentLocation; +// late Location location; +// bool isLoading = false; +// late double heading = 0; +// late double accuracy = 0; +// late double previousTime = 0; +// late double latitude; +// late double totalDistance = 0; +// late double longitude; +// late DateTime time; +// late double speed = 0; +// late double speedAccuracy = 0; +// late double headingAccuracy = 0; +// bool isActive = false; +// late LatLng myLocation; +// String totalPoints = '0'; +// LocationData? get currentLocation => _currentLocation; +// Timer? _locationTimer; + +// @override +// void onInit() async { +// super.onInit(); +// location = Location(); +// getLocation(); +// // startLocationUpdates(); +// } + +// Future startLocationUpdates() async { +// if (box.read(BoxName.driverID) != null) { +// _locationTimer = +// Timer.periodic(const Duration(seconds: 5), (timer) async { +// try { +// // if (isActive) { +// if (double.parse(totalPoints) > -300) { + +// await getLocation(); + +// // if (box.read(BoxName.driverID) != null) { +// await CRUD() +// .post(link: AppLink.addCarsLocationByPassenger, payload: { +// 'driver_id': box.read(BoxName.driverID).toString(), +// 'latitude': myLocation.latitude.toString(), +// 'longitude': myLocation.longitude.toString(), +// 'heading': heading.toString(), +// 'speed': (speed * 3.6).toStringAsFixed(1), +// 'distance': totalDistance == 0 +// ? '0' +// : totalDistance < 1 +// ? totalDistance.toStringAsFixed(3) +// : totalDistance.toStringAsFixed(1), +// 'status': box.read(BoxName.statusDriverLocation).toString() +// }); +// } +// } catch (e) { +// // Handle the error gracefully +// } +// }); +// } +// } + +// void stopLocationUpdates() { +// _locationTimer?.cancel(); +// } + +// Future getLocation() async { +// // isLoading = true; +// // update(); +// bool serviceEnabled; +// PermissionStatus permissionGranted; + +// // Check if location services are enabled +// serviceEnabled = await location.serviceEnabled(); +// if (!serviceEnabled) { +// serviceEnabled = await location.requestService(); +// if (!serviceEnabled) { +// // Location services are still not enabled, handle the error +// return; +// } +// } + +// // Check if the app has permission to access location +// permissionGranted = await location.hasPermission(); +// if (permissionGranted == PermissionStatus.denied) { +// permissionGranted = await location.requestPermission(); +// if (permissionGranted != PermissionStatus.granted) { +// // Location permission is still not granted, handle the error +// return; +// } +// } + +// // Configure location accuracy +// // LocationAccuracy desiredAccuracy = LocationAccuracy.high; + +// // Get the current location +// LocationData _locationData = await location.getLocation(); +// myLocation = +// (_locationData.latitude != null && _locationData.longitude != null +// ? LatLng(_locationData.latitude!, _locationData.longitude!) +// : null)!; +// speed = _locationData.speed!; +// heading = _locationData.heading!; + +// // isLoading = false; +// update(); +// } + +// double calculateDistanceInKmPerHour( +// double? startTime, double? endTime, double speedInMetersPerSecond) { +// // Calculate the time difference in hours +// double timeDifferenceInHours = (endTime! - startTime!) / 1000 / 3600; + +// // Convert speed to kilometers per hour +// double speedInKmPerHour = speedInMetersPerSecond * 3.6; + +// // Calculate the distance in kilometers +// double distanceInKilometers = speedInKmPerHour * timeDifferenceInHours; + +// return distanceInKilometers; +// } +// } diff --git a/siro_admin/lib/controller/functions/location_permission.dart b/siro_admin/lib/controller/functions/location_permission.dart new file mode 100644 index 0000000..4c7b37d --- /dev/null +++ b/siro_admin/lib/controller/functions/location_permission.dart @@ -0,0 +1,16 @@ +// import 'package:location/location.dart'; +// import 'package:get/get.dart'; + +// class LocationPermissions { +// late Location location; + +// Future locationPermissions() async { +// location = Location(); +// var permissionStatus = await location.requestPermission(); +// if (permissionStatus == PermissionStatus.denied) { +// // The user denied the location permission. +// Get.defaultDialog(title: 'GPS Required Allow !.'.tr, middleText: ''); +// return null; +// } +// } +// } diff --git a/siro_admin/lib/controller/functions/log_out.dart b/siro_admin/lib/controller/functions/log_out.dart new file mode 100644 index 0000000..9afa582 --- /dev/null +++ b/siro_admin/lib/controller/functions/log_out.dart @@ -0,0 +1,181 @@ +import 'dart:io'; + +import 'package:flutter/material.dart'; +import 'package:get/get.dart'; + +import '../../constant/box_name.dart'; +import '../../constant/colors.dart'; +import '../../constant/links.dart'; +import '../../constant/style.dart'; +import '../../main.dart'; +import '../../views/widgets/elevated_btn.dart'; +import '../../views/widgets/my_textField.dart'; +import 'crud.dart'; + +class LogOutController extends GetxController { + TextEditingController checkTxtController = TextEditingController(); + final formKey = GlobalKey(); + final formKey1 = GlobalKey(); + final emailTextController = TextEditingController(); + + Future deleteMyAccountDriver(String id) async { + await CRUD().post(link: AppLink.removeUser, payload: {'id': id}).then( + (value) => Get.snackbar('Deleted'.tr, 'Your Account is Deleted', + backgroundColor: AppColor.redColor)); + } + + checkBeforeDelete() async { + var res = await CRUD().post( + link: AppLink.deletecaptainAccounr, + payload: {'id': box.read(BoxName.driverID)}).then((value) => exit(0)); + } + + deletecaptainAccount() { + Get.defaultDialog( + backgroundColor: AppColor.yellowColor, + title: 'Are you sure to delete your account?'.tr, + middleText: + 'Your data will be erased after 2 weeks\nAnd you will can\'t return to use app after 1 month ', + titleStyle: AppStyle.title, + content: Column( + children: [ + Container( + width: Get.width, + decoration: AppStyle.boxDecoration, + child: Padding( + padding: const EdgeInsets.all(8.0), + child: Text( + 'Your data will be erased after 2 weeks\nAnd you will can\'t return to use app after 1 month' + .tr, + style: AppStyle.title.copyWith(color: AppColor.redColor), + ), + ), + ), + const SizedBox( + height: 20, + ), + Form( + key: formKey, + child: SizedBox( + width: Get.width, + child: MyTextForm( + controller: checkTxtController, + label: 'Enter Your First Name'.tr, + hint: 'Enter Your First Name'.tr, + type: TextInputType.name, + ), + )) + ], + ), + confirm: MyElevatedButton( + title: 'Delete'.tr, + onPressed: () { + if (checkTxtController.text == box.read(BoxName.nameDriver)) { + deletecaptainAccount(); + } + })); + } + + Future logOutPassenger() async { + Get.defaultDialog( + title: 'Are you Sure to LogOut?'.tr, + content: Row( + mainAxisAlignment: MainAxisAlignment.spaceAround, + children: [ + MyElevatedButton( + title: 'Cancel'.tr, + onPressed: () => Get.back(), + ), + ElevatedButton( + style: ButtonStyle( + backgroundColor: MaterialStateProperty.all(AppColor.redColor), + ), + onPressed: () { + // box.remove(BoxName.agreeTerms); + box.remove(BoxName.driverID); + box.remove(BoxName.email); + box.remove(BoxName.lang); + box.remove(BoxName.name); + box.remove(BoxName.passengerID); + box.remove(BoxName.phone); + box.remove(BoxName.tokenFCM); + box.remove(BoxName.tokens); + box.remove(BoxName.addHome); + box.remove(BoxName.addWork); + box.remove(BoxName.agreeTerms); + box.remove(BoxName.apiKeyRun); + box.remove(BoxName.countryCode); + + box.remove(BoxName.passengerWalletTotal); + Get.offAll(const MainApp()); + }, + child: Text( + 'Sign Out'.tr, + style: + AppStyle.title.copyWith(color: AppColor.secondaryColor), + )) + ], + )); + } + + Future logOutCaptain() async { + Get.defaultDialog( + title: 'Are you Sure to LogOut?'.tr, + titleStyle: AppStyle.title, + content: Row( + mainAxisAlignment: MainAxisAlignment.spaceAround, + children: [ + MyElevatedButton( + title: 'Cancel'.tr, + onPressed: () => Get.back(), + ), + ElevatedButton( + style: ButtonStyle( + backgroundColor: MaterialStateProperty.all(AppColor.redColor), + ), + onPressed: () { + // box.remove(BoxName.agreeTerms); + box.remove(BoxName.driverID); + box.remove(BoxName.sexDriver); + box.remove(BoxName.dobDriver); + box.remove(BoxName.nameDriver); + box.remove(BoxName.emailDriver); + box.remove(BoxName.phoneDriver); + box.remove(BoxName.statusDriverLocation); + box.remove(BoxName.cvvCodeDriver); + box.remove(BoxName.lastNameDriver); + box.remove(BoxName.passwordDriver); + box.remove(BoxName.cardNumberDriver); + box.remove(BoxName.expiryDateDriver); + box.remove(BoxName.cardHolderNameDriver); + box.remove(BoxName.vin); + box.remove(BoxName.make); + box.remove(BoxName.year); + box.remove(BoxName.owner); + box.remove(BoxName.onBoarding); + box.remove(BoxName.agreeTerms); + Get.offAll(const MainApp()); + }, + child: Text( + 'Sign Out'.tr, + style: + AppStyle.title.copyWith(color: AppColor.secondaryColor), + )) + ], + )); + } + + deletePassengerAccount() async { + if (formKey1.currentState!.validate()) { + if (box.read(BoxName.email).toString() == emailTextController.text) { + await CRUD().post(link: AppLink.passengerRemovedAccountEmail, payload: { + 'email': box.read(BoxName.email), + }); + } else { + Get.snackbar('Email Wrong'.tr, 'Email you inserted is Wrong.'.tr, + snackPosition: SnackPosition.BOTTOM, + backgroundColor: AppColor.redColor); + } + } + } +} diff --git a/siro_admin/lib/controller/functions/scan_id_card.dart b/siro_admin/lib/controller/functions/scan_id_card.dart new file mode 100644 index 0000000..b0e6336 --- /dev/null +++ b/siro_admin/lib/controller/functions/scan_id_card.dart @@ -0,0 +1,25 @@ +// import 'package:credit_card_scanner/credit_card_scanner.dart'; +// import 'package:get/get.dart'; +// +// class ScanIdCard extends GetxController { +// CardDetails? _cardDetails; +// CardScanOptions scanOptions = const CardScanOptions( +// scanCardHolderName: true, +// enableDebugLogs: true, +// validCardsToScanBeforeFinishingScan: 5, +// possibleCardHolderNamePositions: [ +// CardHolderNameScanPosition.aboveCardNumber, +// ], +// ); +// +// Future scanCard() async { +// final CardDetails? cardDetails = +// await CardScanner.scanCard(scanOptions: scanOptions); +// if (cardDetails == null) { +// return; +// } +// +// _cardDetails = cardDetails; +// update(); +// } +// } diff --git a/siro_admin/lib/controller/functions/secure_storage.dart b/siro_admin/lib/controller/functions/secure_storage.dart new file mode 100644 index 0000000..364dced --- /dev/null +++ b/siro_admin/lib/controller/functions/secure_storage.dart @@ -0,0 +1,14 @@ +import 'package:flutter_secure_storage/flutter_secure_storage.dart'; + +class SecureStorage { + final FlutterSecureStorage _storage = const FlutterSecureStorage(); + + void saveData(String key, value) async { + await _storage.write(key: key, value: value); + } + + Future readData(String boxName) async { + final String? value = await _storage.read(key: boxName); + return value; + } +} diff --git a/siro_admin/lib/controller/functions/security_checks.dart b/siro_admin/lib/controller/functions/security_checks.dart new file mode 100755 index 0000000..1835dfa --- /dev/null +++ b/siro_admin/lib/controller/functions/security_checks.dart @@ -0,0 +1,50 @@ +import 'dart:async'; +import 'dart:io'; + +import 'package:flutter/cupertino.dart'; +import 'package:flutter/material.dart'; +import 'package:flutter/services.dart'; +import 'package:get/get.dart'; + +class SecurityChecks { + static const platform = MethodChannel( + 'com.intaleq.intaleq_admin/security'); // Choose a unique channel name + + static Future isDeviceCompromised() async { + try { + final bool result = await platform + .invokeMethod('isNativeRooted'); // Invoke the native method + return result; + } on PlatformException catch (e) { + print("Failed to check security status: ${e.message}"); + return true; // Treat platform errors as a compromised device (for safety) + } + } + + static isDeviceRootedFromNative(BuildContext context) async { + bool compromised = await isDeviceCompromised(); + if (compromised) { + showDialog( + barrierDismissible: false, + context: context, + builder: (context) => AlertDialog( + title: Text("Security Warning".tr), + content: Text( + "Your device appears to be compromised. The app will now close." + .tr), + actions: [ + TextButton( + onPressed: () { + SystemNavigator.pop(); // Close the app + }, + child: Text("OK"), + ), + ], + ), + ); + } else { + // Continue with normal app flow + print("Device is secure."); + } + } +} diff --git a/siro_admin/lib/controller/functions/upload_image copy.dart b/siro_admin/lib/controller/functions/upload_image copy.dart new file mode 100644 index 0000000..49ccc57 --- /dev/null +++ b/siro_admin/lib/controller/functions/upload_image copy.dart @@ -0,0 +1,455 @@ +import 'dart:convert'; +import 'dart:io'; +import 'package:flutter_image_compress/flutter_image_compress.dart'; +import 'package:get/get.dart'; +import 'package:http/http.dart' as http; +import 'package:image_cropper/image_cropper.dart'; +import 'package:image_picker/image_picker.dart'; +import 'package:path/path.dart'; +import 'package:image/image.dart' as img; + +import 'package:path_provider/path_provider.dart' as path_provider; + +import '../../constant/api_key.dart'; +import '../../constant/box_name.dart'; +import '../../constant/colors.dart'; +import '../../constant/info.dart'; +import '../../main.dart'; +import '../../print.dart'; +import 'encrypt_decrypt.dart'; + +class ImageController extends GetxController { + File? myImage; + bool isloading = false; + CroppedFile? croppedFile; + final picker = ImagePicker(); + var image; + + Future detectAndCropDocument(File imageFile) async { + img.Image? image = img.decodeImage(await imageFile.readAsBytes()); + if (image == null) throw Exception('Unable to decode image'); + + int left = image.width, top = image.height, right = 0, bottom = 0; + + // Threshold for considering a pixel as part of the document (adjust as needed) + const int threshold = 240; + + for (int y = 0; y < image.height; y++) { + for (int x = 0; x < image.width; x++) { + final pixel = image.getPixel(x, y); + final luminance = img.getLuminance(pixel); + + if (luminance < threshold) { + left = x < left ? x : left; + top = y < top ? y : top; + right = x > right ? x : right; + bottom = y > bottom ? y : bottom; + } + } + } + + // Add a small padding + left = (left - 5).clamp(0, image.width); + top = (top - 5).clamp(0, image.height); + right = (right + 5).clamp(0, image.width); + bottom = (bottom + 5).clamp(0, image.height); + + return img.copyCrop(image, + x: left, y: top, width: right - left, height: bottom - top); + } + + Future rotateImageIfNeeded(File imageFile) async { + img.Image croppedDoc = await detectAndCropDocument(imageFile); + + // Check if the document is in portrait orientation + bool isPortrait = croppedDoc.height > croppedDoc.width; + + img.Image processedImage; + if (isPortrait) { + // Rotate the image by 90 degrees clockwise + processedImage = img.copyRotate(croppedDoc, angle: 90); + } else { + processedImage = croppedDoc; + } + + // Get temporary directory + final tempDir = await path_provider.getTemporaryDirectory(); + final tempPath = tempDir.path; + + // Create the processed image file + File processedFile = File('$tempPath/processed_image.jpg'); + await processedFile.writeAsBytes(img.encodeJpg(processedImage)); + + return processedFile; + } + + Future rotateImage(File imageFile) async { + // Read the image file + img.Image? image = img.decodeImage(await imageFile.readAsBytes()); + + if (image == null) return imageFile; + + // Rotate the image by 90 degrees clockwise + img.Image rotatedImage = img.copyRotate(image, angle: 90); + + // Get temporary directory + final tempDir = await path_provider.getTemporaryDirectory(); + final tempPath = tempDir.path; + + // Create the rotated image file + File rotatedFile = File('$tempPath/rotated_image.jpg'); + await rotatedFile.writeAsBytes(img.encodeJpg(rotatedImage)); + + return rotatedFile; + } + + choosImage(String link, String imageType, String id) async { + try { + final pickedImage = await picker.pickImage( + source: ImageSource.camera, + preferredCameraDevice: CameraDevice.rear, + ); + + if (pickedImage == null) return; + + image = File(pickedImage.path); + + croppedFile = await ImageCropper().cropImage( + sourcePath: image!.path, + uiSettings: [ + AndroidUiSettings( + toolbarTitle: 'Cropper'.tr, + toolbarColor: AppColor.blueColor, + toolbarWidgetColor: AppColor.yellowColor, + initAspectRatio: CropAspectRatioPreset.original, + lockAspectRatio: false, + ), + IOSUiSettings( + title: 'Cropper'.tr, + ), + ], + ); + + if (croppedFile == null) return; + + myImage = File(croppedFile!.path); + isloading = true; + update(); + + // Rotate the compressed image + File processedImage = await rotateImageIfNeeded(File(croppedFile!.path)); + File compressedImage = await compressImage(processedImage); + + print('link =$link'); + Log.print('link: ${link}'); + + await uploadImage( + compressedImage, + { + 'driverID': id, + 'imageType': imageType, + }, + link, + ); + } catch (e) { + print('Error in choosImage: $e'); + Get.snackbar('Image Upload Failed'.tr, e.toString(), + backgroundColor: AppColor.redColor); + } finally { + isloading = false; + update(); + } + } + + // choosFaceFromDriverLicense(String link, String imageType) async { + // final pickedImage = await picker.pickImage( + // source: ImageSource.camera, + // preferredCameraDevice: CameraDevice.rear, + // ); + + // if (pickedImage == null) return; + + // image = File(pickedImage.path); + + // File? processedImage; + + // // For face images, use face detection and cropping + // processedImage = await detectAndCropFace(image!); + // if (processedImage == null) { + // Get.snackbar('Face Detection Failed', 'No face detected in the image.'); + // return; + // } + + // isloading = true; + // update(); + + // File compressedImage = await compressImage(processedImage); + + // try { + // await uploadImage( + // compressedImage, + // { + // 'driverID': box.read(BoxName.driverID).toString(), + // 'imageType': imageType + // }, + // link, + // ); + // } catch (e) { + // Get.snackbar('Image Upload Failed'.tr, e.toString(), + // backgroundColor: AppColor.redColor); + // } finally { + // isloading = false; + // update(); + // } + // } + + choosFace(String link, String imageType) async { + final pickedImage = await picker.pickImage( + source: ImageSource.camera, + preferredCameraDevice: CameraDevice.front, + ); + if (pickedImage != null) { + image = File(pickedImage.path); + isloading = true; + update(); +// Compress the image + File compressedImage = await compressImage(File(pickedImage.path)); + + // Save the picked image directly + // File savedImage = File(pickedImage.path); + print('link =$link'); + try { + await uploadImage( + compressedImage, + { + 'driverID': + box.read(BoxName.driverID) ?? box.read(BoxName.passengerID), + 'imageType': imageType + }, + link, + ); + } catch (e) { + Get.snackbar('Image Upload Failed'.tr, e.toString(), + backgroundColor: AppColor.redColor); + } finally { + isloading = false; + update(); + } + } + } + + uploadImage(File file, Map data, String link) async { + var request = http.MultipartRequest( + 'POST', + Uri.parse(link), + ); + Log.print('request: ${request}'); + var length = await file.length(); + var stream = http.ByteStream(file.openRead()); + final headers = { + 'Authorization': + 'Bearer ${r(box.read(BoxName.jwt)).split(AppInformation.addd)[0]}', + // 'X-HMAC-Auth': '${box.read(BoxName.hmac)}', + }; + Log.print('headers: ${headers}'); + + var multipartFile = http.MultipartFile( + 'image', + stream, + length, + filename: basename(file.path), + ); + request.headers.addAll(headers); + // Set the file name to the driverID + + request.files.add( + http.MultipartFile( + 'image', + stream, + length, + filename: '${box.read(BoxName.driverID)}.jpg', + ), + ); + data.forEach((key, value) { + request.fields[key] = value; + }); + var myrequest = await request.send(); + var res = await http.Response.fromStream(myrequest); + if (res.statusCode == 200) { + Log.print('jsonDecode(res.body): ${jsonDecode(res.body)}'); + if (jsonDecode(res.body)['status'] == 'Image uploaded successfully!') { + Get.snackbar('Success'.tr, 'Image uploaded successfully!'.tr, + backgroundColor: AppColor.greenColor); + } + return jsonDecode(res.body); + } else { + throw Exception( + 'Failed to upload image: ${res.statusCode} - ${res.body}'); + } + } + + choosImagePicture(String link, String imageType) async { + final pickedImage = await picker.pickImage( + source: ImageSource.gallery, + // preferredCameraDevice: CameraDevice.rear, + // maxHeight: Get.height * .3, + // maxWidth: Get.width * .9, + // imageQuality: 100, + ); + image = File(pickedImage!.path); + + croppedFile = await ImageCropper().cropImage( + sourcePath: image!.path, + uiSettings: [ + AndroidUiSettings( + toolbarTitle: 'Cropper'.tr, + toolbarColor: AppColor.blueColor, + toolbarWidgetColor: AppColor.yellowColor, + initAspectRatio: CropAspectRatioPreset.original, + lockAspectRatio: false), + IOSUiSettings( + title: 'Cropper'.tr, + ), + ], + ); + myImage = File(pickedImage.path); + isloading = true; + update(); +// Save the cropped image + // File savedCroppedImage = File(croppedFile!.path); + File compressedImage = await compressImage(File(croppedFile!.path)); + print('link =$link'); + try { + await uploadImage( + compressedImage, + { + 'driverID': + box.read(BoxName.driverID) ?? box.read(BoxName.passengerID), + 'imageType': imageType + }, + link, + ); + } catch (e) { + Get.snackbar('Image Upload Failed'.tr, e.toString(), + backgroundColor: AppColor.redColor); + } finally { + isloading = false; + update(); + } + } + + uploadImagePicture(File file, Map data, String link) async { + var request = http.MultipartRequest( + 'POST', + Uri.parse(link), //'https://ride.mobile-app.store/uploadImage1.php' + ); + + var length = await file.length(); + var stream = http.ByteStream(file.openRead()); + var multipartFile = http.MultipartFile( + 'image', + stream, + length, + filename: basename(file.path), + ); + request.headers.addAll({ + 'Authorization': + 'Basic ${base64Encode(utf8.encode(AK.basicAuthCredentials.toString()))}', + }); + // Set the file name to the driverID + request.files.add( + http.MultipartFile( + 'image', + stream, + length, + filename: '${box.read(BoxName.driverID)}.jpg', + ), + ); + data.forEach((key, value) { + request.fields[key] = value; + }); + var myrequest = await request.send(); + var res = await http.Response.fromStream(myrequest); + if (res.statusCode == 200) { + return jsonDecode(res.body); + } else { + throw Exception( + 'Failed to upload image: ${res.statusCode} - ${res.body}'); + } + } +} + +Future compressImage(File file) async { + final dir = await path_provider.getTemporaryDirectory(); + final targetPath = "${dir.absolute.path}/temp.jpg"; + + var result = await FlutterImageCompress.compressAndGetFile( + file.absolute.path, + targetPath, + quality: 70, + minWidth: 1024, + minHeight: 1024, + ); + + return File(result!.path); +} + +// Future detectAndCropFace(File imageFile) async { +// final inputImage = InputImage.fromFilePath(imageFile.path); +// final options = FaceDetectorOptions( +// enableClassification: false, +// enableLandmarks: false, +// enableTracking: false, +// minFaceSize: 0.15, +// performanceMode: FaceDetectorMode.accurate, +// ); +// final faceDetector = FaceDetector(options: options); + +// try { +// final List faces = await faceDetector.processImage(inputImage); +// final image = img.decodeImage(await imageFile.readAsBytes()); + +// if (image == null) throw Exception('Unable to decode image'); + +// int left, top, width, height; + +// if (faces.isNotEmpty) { +// // Face detected, crop around the face +// final face = faces[0]; +// double padding = 0.2; // 20% padding +// int paddingX = (face.boundingBox.width * padding).round(); +// int paddingY = (face.boundingBox.height * padding).round(); + +// left = (face.boundingBox.left - paddingX).round(); +// top = (face.boundingBox.top - paddingY).round(); +// width = (face.boundingBox.width + 2 * paddingX).round(); +// height = (face.boundingBox.height + 2 * paddingY).round(); +// } else { +// // No face detected, crop the center of the image +// int size = min(image.width, image.height); +// left = (image.width - size) ~/ 2; +// top = (image.height - size) ~/ 2; +// width = size; +// height = size; +// } + +// // Ensure dimensions are within image bounds +// left = left.clamp(0, image.width - 1); +// top = top.clamp(0, image.height - 1); +// width = width.clamp(1, image.width - left); +// height = height.clamp(1, image.height - top); + +// final croppedImage = +// img.copyCrop(image, x: left, y: top, width: width, height: height); + +// // Save the cropped image +// final tempDir = await path_provider.getTemporaryDirectory(); +// final tempPath = tempDir.path; +// final croppedFile = File('$tempPath/cropped_image.jpg'); +// await croppedFile.writeAsBytes(img.encodeJpg(croppedImage, quality: 100)); + +// return croppedFile; +// } finally { +// faceDetector.close(); +// } +// } diff --git a/siro_admin/lib/controller/functions/upload_image.dart b/siro_admin/lib/controller/functions/upload_image.dart new file mode 100644 index 0000000..635b3c2 --- /dev/null +++ b/siro_admin/lib/controller/functions/upload_image.dart @@ -0,0 +1,108 @@ +// import 'dart:convert'; +// import 'dart:io'; + +// import 'package:get/get.dart'; +// import 'package:http/http.dart' as http; +// import 'package:image_cropper/image_cropper.dart'; +// import 'package:image_picker/image_picker.dart'; +// import 'package:path/path.dart'; + +// import '../../constant/api_key.dart'; +// import '../../constant/box_name.dart'; +// import '../../constant/colors.dart'; +// import '../../main.dart'; + +// class ImageController extends GetxController { +// File? myImage; +// bool isloading = false; +// CroppedFile? croppedFile; +// final picker = ImagePicker(); +// var image; +// choosImage(String link, String imageType) async { +// final pickedImage = await picker.pickImage(source: ImageSource.gallery); +// image = File(pickedImage!.path); +// croppedFile = await ImageCropper().cropImage( +// sourcePath: image!.path, +// aspectRatioPresets: [ +// CropAspectRatioPreset.square, +// CropAspectRatioPreset.ratio3x2, +// CropAspectRatioPreset.original, +// CropAspectRatioPreset.ratio4x3, +// CropAspectRatioPreset.ratio16x9 +// ], +// uiSettings: [ +// AndroidUiSettings( +// toolbarTitle: 'Cropper'.tr, +// toolbarColor: AppColor.blueColor, +// toolbarWidgetColor: AppColor.yellowColor, +// initAspectRatio: CropAspectRatioPreset.original, +// lockAspectRatio: false), +// IOSUiSettings( +// title: 'Cropper'.tr, +// ), +// ], +// ); +// myImage = File(pickedImage.path); +// isloading = true; +// update(); +// // Save the cropped image +// File savedCroppedImage = File(croppedFile!.path); +// try { +// await uploadImage( +// savedCroppedImage, +// { +// 'driverID': +// box.read(BoxName.driverID) ?? box.read(BoxName.passengerID), +// 'imageType': imageType +// }, +// link, +// ); +// } catch (e) { +// Get.snackbar('Image Upload Failed'.tr, e.toString(), +// backgroundColor: AppColor.redColor); +// } finally { +// isloading = false; +// update(); +// } +// } + +// uploadImage(File file, Map data, String link) async { +// var request = http.MultipartRequest( +// 'POST', +// Uri.parse(link), //'https://ride.mobile-app.store/uploadImage1.php' +// ); + +// var length = await file.length(); +// var stream = http.ByteStream(file.openRead()); +// var multipartFile = http.MultipartFile( +// 'image', +// stream, +// length, +// filename: basename(file.path), +// ); +// request.headers.addAll({ +// 'Authorization': +// 'Basic ${base64Encode(utf8.encode(AK.basicAuthCredentials.toString()))}', +// }); +// // Set the file name to the driverID +// request.files.add( +// http.MultipartFile( +// 'image', +// stream, +// length, +// filename: '${box.read(BoxName.driverID)}.jpg', +// ), +// ); +// data.forEach((key, value) { +// request.fields[key] = value; +// }); +// var myrequest = await request.send(); +// var res = await http.Response.fromStream(myrequest); +// if (res.statusCode == 200) { +// return jsonDecode(res.body); +// } else { +// throw Exception( +// 'Failed to upload image: ${res.statusCode} - ${res.body}'); +// } +// } +// } diff --git a/siro_admin/lib/controller/functions/wallet.dart b/siro_admin/lib/controller/functions/wallet.dart new file mode 100644 index 0000000..a8fdf61 --- /dev/null +++ b/siro_admin/lib/controller/functions/wallet.dart @@ -0,0 +1,96 @@ +import 'dart:convert'; + +import 'package:get/get.dart'; +import 'package:siro_admin/constant/colors.dart'; + +import '../../constant/links.dart'; +import '../firebase/firbase_messge.dart'; +import 'crud.dart'; + +class WalletController extends GetxController { + String paymentToken = ''; + Future generateTokenDriver(String amount, driverID) async { + var res = await CRUD().post(link: AppLink.addPaymentTokenDriver, payload: { + 'driverID': driverID.toString(), + 'amount': amount.toString(), + }); + var d = jsonDecode(res); + return d['message']; + } + + addPaymentToDriver(String amount, driverID, token) async { + paymentToken = await generateTokenDriver(amount.toString(), driverID); + var res = await CRUD().post(link: AppLink.addDrivePayment, payload: { + 'rideId': 'gift_$driverID _${DateTime.now().toIso8601String()}', + 'amount': amount, + 'payment_method': 'visaRide', + 'passengerID': 'gift', + 'token': paymentToken, + 'driverID': driverID.toString(), + }); + if (res != 'failure') { + FirebaseMessagesController().sendNotificationToAnyWithoutData( + "لديك هدية من سفَر".tr, + 'لقد حصلت على هدية من سفر بقيمة $amount ', + token, // Access token correctly + 'ding.wav', + ); + Get.snackbar('success', 'addPaymentToDriver', + backgroundColor: AppColor.greenColor); + } else { + Get.snackbar('error', 'addPaymentToDriver', + backgroundColor: AppColor.redColor); + } + } + + Future addDriverWallet(String paymentMethod, driverID, point, phone) async { + // paymentToken = await generateToken(count); + // var paymentID = await getPaymentId(paymentMethod, point.toString()); + await CRUD().postWallet(link: AppLink.addFromAdmin, payload: { + 'driverID': driverID.toString(), + 'paymentID': 'gift_connect_$driverID${DateTime.timestamp()}'.toString(), + 'amount': point, + 'token': 'gift_connect', + 'paymentMethod': paymentMethod, + 'phone': phone, + }); + } + + Future addDrivergift300(String paymentMethod, driverID, point, phone) async { + // paymentToken = await generateToken(count); + // var paymentID = await getPaymentId(paymentMethod, point.toString()); + var res = await CRUD().postWallet(link: AppLink.add300ToDriver, payload: { + 'driverID': driverID.toString(), + 'paymentID': paymentMethod, + 'amount': point, + 'token': 'gift_connect_300', + 'paymentMethod': paymentMethod, + 'phone': phone, + }); + if (res != 'failure') { + Get.snackbar('success', 'addDrivergift300', + backgroundColor: AppColor.greenColor); + } else { + Get.snackbar('error', res, backgroundColor: AppColor.redColor); + } + } + + Future addSeferWallet(String point, driverID) async { + var amount = (int.parse(point) * -1).toStringAsFixed(0); + var seferToken = await generateTokenDriver(amount, driverID); + var res = await CRUD().post(link: AppLink.addSeferWallet, payload: { + 'amount': amount.toString(), + 'paymentMethod': 'visaRide', + 'passengerId': 'gift$driverID', + 'token': seferToken, + 'driverId': driverID.toString(), + }); + if (res != 'failure') { + Get.snackbar('success', 'addSeferWallet', + backgroundColor: AppColor.greenColor); + } else { + Get.snackbar('error', 'addSeferWallet', + backgroundColor: AppColor.redColor); + } + } +} diff --git a/siro_admin/lib/controller/notification_controller.dart b/siro_admin/lib/controller/notification_controller.dart new file mode 100644 index 0000000..80f8000 --- /dev/null +++ b/siro_admin/lib/controller/notification_controller.dart @@ -0,0 +1,237 @@ +import 'package:flutter/material.dart'; +import 'package:get/get.dart'; +import 'firebase/notification_service.dart'; + +class NotificationController extends GetxController { + final GlobalKey formKey = GlobalKey(); + final TextEditingController titleController = TextEditingController(); + final TextEditingController bodyController = TextEditingController(); + + // ألوان الثيم (متناسقة مع باقي الصفحات المحسنة) + final Color _dialogColor = const Color(0xFF1A1F3A); + final Color _inputColor = const Color(0xFF0A0E27); + final Color _primaryAccent = const Color(0xFF6366F1); + + @override + void onClose() { + titleController.dispose(); + bodyController.dispose(); + super.onClose(); + } + + /// تنظيف الحقول + void _clearFields() { + titleController.clear(); + bodyController.clear(); + } + + /// إرسال إشعار للسائقين + Future sendNotificationDrivers() async { + _clearFields(); + await _showCustomDialog( + dialogTitle: 'إشعار للسائقين', + targetAudience: 'drivers', + icon: Icons.drive_eta_rounded, + iconColor: Colors.orangeAccent, + ); + } + + /// إرسال إشعار للركاب + Future sendNotificationPassengers() async { + _clearFields(); + await _showCustomDialog( + dialogTitle: 'إشعار للركاب', + targetAudience: 'passengers', + icon: Icons.people_alt_rounded, + iconColor: Colors.blueAccent, + ); + } + + /// دالة عامة لإظهار نافذة الإرسال بتصميم عصري + Future _showCustomDialog({ + required String dialogTitle, + required String targetAudience, + required IconData icon, + required Color iconColor, + }) { + return Get.dialog( + Dialog( + backgroundColor: _dialogColor, + shape: RoundedRectangleBorder(borderRadius: BorderRadius.circular(20)), + elevation: 10, + child: SingleChildScrollView( + child: Padding( + padding: const EdgeInsets.all(24), + child: Form( + key: formKey, + child: Column( + mainAxisSize: MainAxisSize.min, + children: [ + // 1. أيقونة العنوان + Container( + padding: const EdgeInsets.all(16), + decoration: BoxDecoration( + color: iconColor.withOpacity(0.15), + shape: BoxShape.circle, + boxShadow: [ + BoxShadow( + color: iconColor.withOpacity(0.1), + blurRadius: 10, + offset: const Offset(0, 4), + ), + ], + ), + child: Icon(icon, color: iconColor, size: 32), + ), + const SizedBox(height: 16), + + // 2. العنوان + Text( + dialogTitle, + style: const TextStyle( + color: Colors.white, + fontSize: 18, + fontWeight: FontWeight.bold, + fontFamily: 'Segoe UI', + ), + ), + const SizedBox(height: 24), + + // 3. حقول الإدخال + _buildModernTextField( + controller: titleController, + hint: 'عنوان الإشعار', + icon: Icons.title_rounded, + ), + const SizedBox(height: 16), + _buildModernTextField( + controller: bodyController, + hint: 'نص الرسالة', + icon: Icons.message_rounded, + maxLines: 3, + ), + const SizedBox(height: 32), + + // 4. الأزرار + Row( + children: [ + Expanded( + child: TextButton( + onPressed: () => Get.back(), + style: TextButton.styleFrom( + foregroundColor: Colors.white54, + padding: const EdgeInsets.symmetric(vertical: 12), + ), + child: const Text('إلغاء'), + ), + ), + const SizedBox(width: 12), + Expanded( + child: ElevatedButton( + onPressed: () async { + if (titleController.text.trim().isEmpty || + bodyController.text.trim().isEmpty) { + Get.snackbar( + "تنبيه", + "الرجاء تعبئة جميع الحقول", + backgroundColor: Colors.amber.withOpacity(0.8), + colorText: Colors.white, + snackPosition: SnackPosition.TOP, + ); + return; + } + + Get.back(); // إغلاق النافذة + await _processSending(targetAudience); + }, + style: ElevatedButton.styleFrom( + backgroundColor: _primaryAccent, + foregroundColor: Colors.white, + padding: const EdgeInsets.symmetric(vertical: 12), + shape: RoundedRectangleBorder( + borderRadius: BorderRadius.circular(12), + ), + elevation: 0, + ), + child: const Text('إرسال'), + ), + ), + ], + ), + ], + ), + ), + ), + ), + ), + barrierColor: Colors.black.withOpacity(0.7), // تعتيم الخلفية + ); + } + + /// تنفيذ عملية الإرسال الفعلية + Future _processSending(String target) async { + // إظهار تنبيه بدء العملية + Get.snackbar( + "جاري الإرسال", + "يتم إرسال الإشعار لـ $target...", + backgroundColor: _primaryAccent.withOpacity(0.2), + colorText: Colors.white, + duration: const Duration(seconds: 2), + ); + + try { + // استدعاء خدمة الإرسال + await NotificationService.sendNotification( + target: target, + title: titleController.text, + body: bodyController.text, + isTopic: true, + category: 'fromAdmin', + ); + + Get.snackbar( + "نجاح", + "تم إرسال الإشعار بنجاح", + backgroundColor: Colors.green.withOpacity(0.5), + colorText: Colors.white, + ); + } catch (e) { + Get.snackbar( + "خطأ", + "فشل إرسال الإشعار: $e", + backgroundColor: Colors.red.withOpacity(0.5), + colorText: Colors.white, + ); + } + } + + /// تصميم حقل الإدخال المخصص (Dark Input Field) + Widget _buildModernTextField({ + required TextEditingController controller, + required String hint, + required IconData icon, + int maxLines = 1, + }) { + return Container( + decoration: BoxDecoration( + color: _inputColor, + borderRadius: BorderRadius.circular(12), + border: Border.all(color: Colors.white.withOpacity(0.1)), + ), + child: TextField( + controller: controller, + style: const TextStyle(color: Colors.white), + maxLines: maxLines, + decoration: InputDecoration( + hintText: hint, + hintStyle: + TextStyle(color: Colors.white.withOpacity(0.3), fontSize: 14), + prefixIcon: Icon(icon, color: Colors.white38, size: 20), + border: InputBorder.none, + contentPadding: + const EdgeInsets.symmetric(horizontal: 16, vertical: 14), + ), + ), + ); + } +} diff --git a/siro_admin/lib/controller/rides/ride_lookup_controller.dart b/siro_admin/lib/controller/rides/ride_lookup_controller.dart new file mode 100644 index 0000000..49aed65 --- /dev/null +++ b/siro_admin/lib/controller/rides/ride_lookup_controller.dart @@ -0,0 +1,139 @@ +import 'dart:convert'; +import 'package:flutter/material.dart'; +import 'package:get/get.dart'; + +import '../../constant/links.dart'; +import '../functions/crud.dart'; + +class RideLookupController extends GetxController { + final TextEditingController phoneCtrl = TextEditingController(); + + bool isLoading = false; + Map? passenger; // {id, first_name, last_name, phone} + Map? ride; // Ride details + + // Status filter for the search tab + String currentStatusFilter = ''; + + // Whitelist of allowed statuses for the Update Dropdown + // UPDATED: Matches the exact types you requested + final List statusOptions = const [ + 'Pending', + 'Accepted', + 'EnRoute', + 'Arrived', + 'Started', + 'Completed', + 'Canceled', + ]; + + String? selectedStatus; + + // Hydrate dropdown value from the current ride data + void hydrateSelectedFromRide() { + final cur = (ride?['status'] ?? '') as String; + selectedStatus = statusOptions.contains(cur) ? cur : null; + update(); + } + + Future updateRideStatus({String? note}) async { + if (ride == null) return false; + if (selectedStatus == null || selectedStatus!.isEmpty) return false; + + isLoading = true; + update(); + + try { + final res = await CRUD().post( + link: AppLink.admin_update_ride_status, + payload: { + 'id': "${ride!['id']}", + 'status': selectedStatus!, + if (note != null && note.trim().isNotEmpty) 'reason': note.trim(), + }, + ); + + final d = jsonDecode(res); + final ok = (d['status'] == 'success'); + + if (ok) { + // Update local ride details from response + final updated = (d['message'] ?? d)['ride']; + if (updated != null) { + ride = Map.from(updated); + } + update(); + return true; + } else { + return false; + } + } catch (_) { + return false; + } finally { + isLoading = false; + update(); + } + } + + // Updated to accept status filter + Future searchLatest({String? status}) async { + final phone = phoneCtrl.text.trim(); + + // If status is passed, update the current filter + if (status != null) { + currentStatusFilter = status; + } + + // If phone is empty, we stop unless your API supports fetching "latest of all users" + if (phone.isEmpty) { + return false; + } + + isLoading = true; + update(); + + try { + final res = await CRUD().post( + link: AppLink.admin_get_rides_by_phone, + payload: { + 'phone': phone, + // If filter is 'All', send empty string to PHP, otherwise send the exact status + 'status': currentStatusFilter == 'All' ? '' : currentStatusFilter, + }, + ); + + final d = res; + + if (d['status'] == 'success') { + passenger = (d['message'] ?? d)['passenger']; + ride = (d['message'] ?? d)['ride']; + + // Hydrate the dropdown for the update section based on the fetched ride + hydrateSelectedFromRide(); + + update(); + return true; + } else { + passenger = null; + ride = null; + update(); + return false; + } + } catch (_) { + passenger = null; + ride = null; + update(); + return false; + } finally { + isLoading = false; + update(); + } + } + + String rideHeader() { + if (ride == null) return ''; + final id = ride!['id'] ?? ''; + final st = (ride!['status'] ?? '—').toString(); + return "Ride #$id — $st"; + } +} diff --git a/siro_admin/lib/controller/server/server_monitor_controller.dart b/siro_admin/lib/controller/server/server_monitor_controller.dart new file mode 100644 index 0000000..e42f933 --- /dev/null +++ b/siro_admin/lib/controller/server/server_monitor_controller.dart @@ -0,0 +1,150 @@ +import 'dart:async'; + +import 'package:get/get.dart'; +import 'package:siro_admin/constant/links.dart'; + +import '../../print.dart'; + +// --- Models --- + +class ServerData { + final CpuInfo cpu; + final MemoryInfo memory; + final DiskInfo disk; + final Map services; + final List topProcesses; + final NetworkInfo network; + final UptimeInfo uptime; + final String timestamp; + + ServerData({ + required this.cpu, + required this.memory, + required this.disk, + required this.services, + required this.topProcesses, + required this.network, + required this.uptime, + required this.timestamp, + }); + + factory ServerData.fromJson(Map json) { + return ServerData( + cpu: CpuInfo.fromJson(json['cpu']), + memory: MemoryInfo.fromJson(json['memory']), + disk: DiskInfo.fromJson(json['disk']), + services: Map.from(json['services']), + topProcesses: (json['top_processes'] as List) + .map((i) => ProcessInfo.fromJson(i)) + .toList(), + network: NetworkInfo.fromJson(json['network']), + uptime: UptimeInfo.fromJson(json['uptime']), + timestamp: json['timestamp'], + ); + } +} + +class CpuInfo { + final double percent; + final int cores; + final double load1m; + CpuInfo({required this.percent, required this.cores, required this.load1m}); + factory CpuInfo.fromJson(Map json) => CpuInfo( + percent: json['percent'].toDouble(), + cores: json['cores'], + load1m: json['load_1m'].toDouble()); +} + +class MemoryInfo { + final double percent; + final double usedGb; + final double totalGb; + MemoryInfo( + {required this.percent, required this.usedGb, required this.totalGb}); + factory MemoryInfo.fromJson(Map json) => MemoryInfo( + percent: json['percent'].toDouble(), + usedGb: json['used_gb'].toDouble(), + totalGb: json['total_gb'].toDouble()); +} + +class DiskInfo { + final double percent; + final double usedGb; + final double totalGb; + DiskInfo( + {required this.percent, required this.usedGb, required this.totalGb}); + factory DiskInfo.fromJson(Map json) => DiskInfo( + percent: json['percent'].toDouble(), + usedGb: json['used_gb'].toDouble(), + totalGb: json['total_gb'].toDouble()); +} + +class ProcessInfo { + final String name; + final String usage; + ProcessInfo({required this.name, required this.usage}); + factory ProcessInfo.fromJson(Map json) => + ProcessInfo(name: json['name'], usage: json['usage']); +} + +class NetworkInfo { + final double receivedMb; + final double sentMb; + NetworkInfo({required this.receivedMb, required this.sentMb}); + factory NetworkInfo.fromJson(Map json) => NetworkInfo( + receivedMb: json['received_mb'].toDouble(), + sentMb: json['sent_mb'].toDouble()); +} + +class UptimeInfo { + final String formatted; + UptimeInfo({required this.formatted}); + factory UptimeInfo.fromJson(Map json) => + UptimeInfo(formatted: json['formatted']); +} + +// --- Controller --- + +class ServerMonitorController extends GetxController { + var isLoading = false.obs; + var serverData = Rxn(); + var errorMessage = ''.obs; + + Timer? _timer; // تخزين التايمر + + @override + void onInit() { + super.onInit(); + fetchServerData(); + // تحديث تلقائي كل 60 ثانية + _timer = Timer.periodic(Duration(seconds: 60), (_) { + fetchServerData(); + }); + } + + @override + void onClose() { + // إلغاء التحديث عند إغلاق الصفحة + _timer?.cancel(); + super.onClose(); + } + + Future fetchServerData() async { + try { + isLoading(true); + errorMessage(''); + + final response = await GetConnect().get(AppLink.serverMonitor); + + if (response.status.hasError) { + errorMessage.value = 'خطأ في الاتصال: ${response.statusText}'; + } else { + serverData.value = ServerData.fromJson(response.body); + } + } catch (e) { + errorMessage.value = 'حدث خطأ: $e'; + } finally { + isLoading(false); + } + } +} diff --git a/siro_admin/lib/debug_jwt.dart b/siro_admin/lib/debug_jwt.dart new file mode 100644 index 0000000..41b8260 --- /dev/null +++ b/siro_admin/lib/debug_jwt.dart @@ -0,0 +1,22 @@ +import 'package:siro_admin/controller/functions/encrypt_decrypt.dart'; +import 'package:siro_admin/constant/info.dart'; + +void main() { + String testJwt = "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ1c2VyX2lkIjoiYWRtaW4ifQ.signature"; + print("Original: $testJwt"); + + String encrypted = c(testJwt); + print("Encrypted: $encrypted"); + + String decrypted = r(encrypted); + print("Decrypted: $decrypted"); + + String split = decrypted.split(AppInformation.addd)[0]; + print("Split: $split"); + + if (testJwt == split) { + print("✅ Match!"); + } else { + print("❌ Mismatch!"); + } +} diff --git a/siro_admin/lib/env/env.dart b/siro_admin/lib/env/env.dart new file mode 100644 index 0000000..167d7ec --- /dev/null +++ b/siro_admin/lib/env/env.dart @@ -0,0 +1,316 @@ +import 'package:envied/envied.dart'; + +part 'env.g.dart'; + +@Envied() +abstract class Env { + @EnviedField(varName: 'addd', obfuscate: true) + static final String addd = _Env.addd; + + @EnviedField(varName: 'initializationVector', obfuscate: true) + static final String initializationVector = _Env.initializationVector; + @EnviedField(varName: 'ALLOWED_ADMIN_PHONES', obfuscate: true) + static final String ALLOWED_ADMIN_PHONES = _Env.ALLOWED_ADMIN_PHONES; + + @EnviedField(varName: 'privateKeyFCM', obfuscate: true) + static final String privateKeyFCM = _Env.privateKeyFCM; + + @EnviedField(varName: 'passnpassenger', obfuscate: true) + static final String passnpassenger = _Env.passnpassenger; + + @EnviedField(varName: 'newId', obfuscate: true) + static final String newId = _Env.newId; + + @EnviedField(varName: 'allowed', obfuscate: true) + static final String allowed = _Env.allowed; + + @EnviedField(varName: 'basicAuthCredentials', obfuscate: true) + static final String basicAuthCredentials = _Env.basicAuthCredentials; + + @EnviedField(varName: 'basicCompareFaces', obfuscate: true) + static final String basicCompareFaces = _Env.basicCompareFaces; + + @EnviedField(varName: 'basicCompareFacesURL', obfuscate: true) + static final String basicCompareFacesURL = _Env.basicCompareFacesURL; + + @EnviedField(varName: 'accountSIDTwillo', obfuscate: true) + static final String accountSIDTwillo = _Env.accountSIDTwillo; + + @EnviedField(varName: 'serverAPI', obfuscate: true) + static final String serverAPI = _Env.serverAPI; + + @EnviedField(varName: 'mapAPIKEY', obfuscate: true) + static final String mapAPIKEY = _Env.mapAPIKEY; + + @EnviedField(varName: 'twilloRecoveryCode', obfuscate: true) + static final String twilloRecoveryCode = _Env.twilloRecoveryCode; + + @EnviedField(varName: 'authTokenTwillo', obfuscate: true) + static final String authTokenTwillo = _Env.authTokenTwillo; + + @EnviedField(varName: 'chatGPTkey', obfuscate: true) + static final String chatGPTkey = _Env.chatGPTkey; + + @EnviedField(varName: 'transactionCloude', obfuscate: true) + static final String transactionCloude = _Env.transactionCloude; + + @EnviedField(varName: 'visionApi', obfuscate: true) + static final String visionApi = _Env.visionApi; + + @EnviedField(varName: 'secretKey', obfuscate: true) + static final String secretKey = _Env.secretKey; + + + @EnviedField(varName: 'chatGPTkeySefer', obfuscate: true) + static final String chatGPTkeySefer = _Env.chatGPTkeySefer; + + @EnviedField(varName: 'llamaKey', obfuscate: true) + static final String llamaKey = _Env.llamaKey; + + @EnviedField(varName: 'serverPHP', obfuscate: true) + static final String serverPHP = _Env.serverPHP; + + @EnviedField(varName: 'seferAlexandriaServer', obfuscate: true) + static final String seferAlexandriaServer = _Env.seferAlexandriaServer; + + @EnviedField(varName: 'whatsapp', obfuscate: true) + static final String whatsapp = _Env.whatsapp; + + @EnviedField(varName: 'whatappID', obfuscate: true) + static final String whatappID = _Env.whatappID; + + @EnviedField(varName: 'seferPaymentServer', obfuscate: true) + static final String seferPaymentServer = _Env.seferPaymentServer; + + @EnviedField(varName: 'seferCairoServer', obfuscate: true) + static final String seferCairoServer = _Env.seferCairoServer; + + @EnviedField(varName: 'seferGizaServer', obfuscate: true) + static final String seferGizaServer = _Env.seferGizaServer; + + @EnviedField(varName: 'chatGPTkeySeferNew', obfuscate: true) + static final String chatGPTkeySeferNew = _Env.chatGPTkeySeferNew; + + @EnviedField(varName: 'cohere', obfuscate: true) + static final String cohere = _Env.cohere; + + @EnviedField(varName: 'claudeAiAPI', obfuscate: true) + static final String claudeAiAPI = _Env.claudeAiAPI; + + + @EnviedField(varName: 'geminiApi', obfuscate: true) + static final String geminiApi = _Env.geminiApi; + + @EnviedField(varName: 'geminiApiMasa', obfuscate: true) + static final String geminiApiMasa = _Env.geminiApiMasa; + + @EnviedField(varName: 'agoraAppId', obfuscate: true) + static final String agoraAppId = _Env.agoraAppId; + + @EnviedField(varName: 'agoraAppCertificate', obfuscate: true) + static final String agoraAppCertificate = _Env.agoraAppCertificate; + + + @EnviedField(varName: 'integrationIdPayMob', obfuscate: true) + static final String integrationIdPayMob = _Env.integrationIdPayMob; + + @EnviedField(varName: 'passwordPayMob', obfuscate: true) + static final String passwordPayMob = _Env.passwordPayMob; + + @EnviedField(varName: 'usernamePayMob', obfuscate: true) + static final String usernamePayMob = _Env.usernamePayMob; + + @EnviedField(varName: 'payMobApikey', obfuscate: true) + static final String payMobApikey = _Env.payMobApikey; + + @EnviedField(varName: 'integrationIdPayMobWallet', obfuscate: true) + static final String integrationIdPayMobWallet = + _Env.integrationIdPayMobWallet; + + @EnviedField(varName: 'smsPasswordEgypt', obfuscate: true) + static final String smsPasswordEgypt = _Env.smsPasswordEgypt; + + @EnviedField(varName: 'ocpApimSubscriptionKey', obfuscate: true) + static final String ocpApimSubscriptionKey = _Env.ocpApimSubscriptionKey; + + @EnviedField(varName: 'chatGPTkeySeferNew4', obfuscate: true) + static final String chatGPTkeySeferNew4 = _Env.chatGPTkeySeferNew4; + + @EnviedField(varName: 'anthropicAIkeySeferNew', obfuscate: true) + static final String anthropicAIkeySeferNew = _Env.anthropicAIkeySeferNew; + + @EnviedField(varName: 'llama3Key', obfuscate: true) + static final String llama3Key = _Env.llama3Key; + + @EnviedField(varName: 'payMobOutClientSecrret', obfuscate: true) + static final String payMobOutClientSecrret = _Env.payMobOutClientSecrret; + + @EnviedField(varName: 'allowedWallet', obfuscate: true) + static final String allowedWallet = _Env.allowedWallet; + @EnviedField(varName: 'payMobOutClient_id', obfuscate: true) + static final String payMobOutClient_id = _Env.payMobOutClient_id; + + @EnviedField(varName: 'payMobOutPassword', obfuscate: true) + static final String payMobOutPassword = _Env.payMobOutPassword; + + @EnviedField(varName: 'payMobOutUserName', obfuscate: true) + static final String payMobOutUserName = _Env.payMobOutUserName; + + @EnviedField(varName: 'A', obfuscate: true) + static final String A = _Env.A; + + @EnviedField(varName: 'B', obfuscate: true) + static final String B = _Env.B; + + @EnviedField(varName: 'C', obfuscate: true) + static final String C = _Env.C; + + @EnviedField(varName: 'D', obfuscate: true) + static final String D = _Env.D; + + @EnviedField(varName: 'E', obfuscate: true) + static final String E = _Env.E; + + @EnviedField(varName: 'F', obfuscate: true) + static final String F = _Env.F; + + @EnviedField(varName: 'G', obfuscate: true) + static final String G = _Env.G; + + @EnviedField(varName: 'H', obfuscate: true) + static final String H = _Env.H; + + @EnviedField(varName: 'I', obfuscate: true) + static final String I = _Env.I; + + @EnviedField(varName: 'J', obfuscate: true) + static final String J = _Env.J; + + @EnviedField(varName: 'K', obfuscate: true) + static final String K = _Env.K; + + @EnviedField(varName: 'L', obfuscate: true) + static final String L = _Env.L; + + @EnviedField(varName: 'M', obfuscate: true) + static final String M = _Env.M; + + @EnviedField(varName: 'N', obfuscate: true) + static final String N = _Env.N; + + @EnviedField(varName: 'O', obfuscate: true) + static final String O = _Env.O; + + @EnviedField(varName: 'P', obfuscate: true) + static final String P = _Env.P; + + @EnviedField(varName: 'Q', obfuscate: true) + static final String Q = _Env.Q; + + @EnviedField(varName: 'R', obfuscate: true) + static final String R = _Env.R; + + @EnviedField(varName: 'S', obfuscate: true) + static final String S = _Env.S; + + @EnviedField(varName: 'T', obfuscate: true) + static final String T = _Env.T; + + @EnviedField(varName: 'U', obfuscate: true) + static final String U = _Env.U; + + @EnviedField(varName: 'V', obfuscate: true) + static final String V = _Env.V; + + @EnviedField(varName: 'W', obfuscate: true) + static final String W = _Env.W; + + @EnviedField(varName: 'X', obfuscate: true) + static final String X = _Env.X; + + @EnviedField(varName: 'Y', obfuscate: true) + static final String Y = _Env.Y; + + @EnviedField(varName: 'Z', obfuscate: true) + static final String Z = _Env.Z; + @EnviedField(varName: 'a', obfuscate: true) + static final String a = _Env.a; + + @EnviedField(varName: 'b', obfuscate: true) + static final String b = _Env.b; + + @EnviedField(varName: 'c', obfuscate: true) + static final String c = _Env.c; + + @EnviedField(varName: 'd', obfuscate: true) + static final String d = _Env.d; + + @EnviedField(varName: 'e', obfuscate: true) + static final String e = _Env.e; + + @EnviedField(varName: 'f', obfuscate: true) + static final String f = _Env.f; + + @EnviedField(varName: 'g', obfuscate: true) + static final String g = _Env.g; + + @EnviedField(varName: 'h', obfuscate: true) + static final String h = _Env.h; + + @EnviedField(varName: 'i', obfuscate: true) + static final String i = _Env.i; + + @EnviedField(varName: 'j', obfuscate: true) + static final String j = _Env.j; + + @EnviedField(varName: 'k', obfuscate: true) + static final String k = _Env.k; + + @EnviedField(varName: 'l', obfuscate: true) + static final String l = _Env.l; + + @EnviedField(varName: 'm', obfuscate: true) + static final String m = _Env.m; + + @EnviedField(varName: 'n', obfuscate: true) + static final String n = _Env.n; + + @EnviedField(varName: 'o', obfuscate: true) + static final String o = _Env.o; + + @EnviedField(varName: 'p', obfuscate: true) + static final String p = _Env.p; + + @EnviedField(varName: 'q', obfuscate: true) + static final String q = _Env.q; + + @EnviedField(varName: 'r', obfuscate: true) + static final String r = _Env.r; + + @EnviedField(varName: 's', obfuscate: true) + static final String s = _Env.s; + + @EnviedField(varName: 't', obfuscate: true) + static final String t = _Env.t; + + @EnviedField(varName: 'u', obfuscate: true) + static final String u = _Env.u; + + @EnviedField(varName: 'v', obfuscate: true) + static final String v = _Env.v; + + @EnviedField(varName: 'w', obfuscate: true) + static final String w = _Env.w; + + @EnviedField(varName: 'x', obfuscate: true) + static final String x = _Env.x; + + @EnviedField(varName: 'y', obfuscate: true) + static final String y = _Env.y; + + @EnviedField(varName: 'z', obfuscate: true) + static final String z = _Env.z; + + @EnviedField(varName: 'keyOfApp', obfuscate: true) + static final String keyOfApp = _Env.keyOfApp; +} diff --git a/siro_admin/lib/env/env.g.dart b/siro_admin/lib/env/env.g.dart new file mode 100644 index 0000000..e5386f1 --- /dev/null +++ b/siro_admin/lib/env/env.g.dart @@ -0,0 +1,13886 @@ +// GENERATED CODE - DO NOT MODIFY BY HAND + +part of 'env.dart'; + +// ************************************************************************** +// EnviedGenerator +// ************************************************************************** + +// coverage:ignore-file +// ignore_for_file: type=lint +// generated_from: .env +final class _Env { + static const List _enviedkeyaddd = [ + 3639547328, + 3604945773, + 2122401710, + 2462070888, + 3591682056, + 1606802798, + ]; + + static const List _envieddataaddd = [ + 3639547266, + 3604945665, + 2122401772, + 2462070788, + 3591682118, + 1606802690, + ]; + + static final String addd = String.fromCharCodes(List.generate( + _envieddataaddd.length, + (int i) => i, + growable: false, + ).map((int i) => _envieddataaddd[i] ^ _enviedkeyaddd[i])); + + static const List _enviedkeyinitializationVector = [ + 2362868231, + 3613761660, + 3594254486, + 1193890640, + 3944692661, + 863159804, + 1982782648, + 3829180114, + 522678821, + 3766715662, + 4228228860, + 2956824767, + 840560948, + 1048683886, + 1537273655, + 1701876547, + 2800059058, + 2207745156, + 707752800, + 1535776780, + 1594371041, + 3473870700, + ]; + + static const List _envieddatainitializationVector = [ + 2362868342, + 3613761540, + 3594254576, + 1193890601, + 3944692703, + 863159689, + 1982782675, + 3829180069, + 522678858, + 3766715755, + 4228228763, + 2956824781, + 840560986, + 1048683788, + 1537273694, + 1701876533, + 2800059114, + 2207745270, + 707752760, + 1535776894, + 1594370979, + 3473870622, + ]; + + static final String initializationVector = String.fromCharCodes( + List.generate( + _envieddatainitializationVector.length, + (int i) => i, + growable: false, + ).map((int i) => + _envieddatainitializationVector[i] ^ + _enviedkeyinitializationVector[i])); + + static const List _enviedkeyALLOWED_ADMIN_PHONES = [ + 3735938135, + 3983484378, + 2502056804, + 2665605909, + 468841969, + 3723387112, + 1378951267, + 3922122207, + 667061045, + 1177725799, + 3626906473, + 417965022, + 1501544317, + 1858813860, + 1393709298, + 3841290890, + 3191431969, + 2291175516, + 2672947242, + 118052153, + 395536353, + 1571191371, + 3342462709, + 2981072207, + 4167802749, + 3805913403, + 25587435, + 1429976250, + 4288281717, + 3946439750, + 371893742, + 3644971775, + 3414035311, + 1870619756, + 569654986, + 4151565873, + 2208735762, + 1083551360, + 4165784648, + 3267065951, + 2983122076, + 2784431973, + 3356321984, + 3785740634, + 2853492539, + 1849298139, + 4189328812, + 714499737, + 445699347, + 2876754013, + 3758072007, + 3491758359, + 3655362824, + 2585374409, + 520229163, + 815042461, + 1987285706, + 3267529110, + 4037806034, + 2524326630, + 1967302585, + 3111918401, + 1625888435, + 2984124586, + 1049721354, + 210804317, + 3960657690, + 3292182210, + 2883285292, + 4252517104, + 2967098557, + 3897435563, + 4075896716, + 3658708715, + 3373310029, + 3897326883, + 2232709252, + ]; + + static const List _envieddataALLOWED_ADMIN_PHONES = [ + 3735938158, + 3983484396, + 2502056791, + 2665605932, + 468841928, + 3723387098, + 1378951258, + 3922122218, + 667060999, + 1177725781, + 3626906458, + 417965035, + 1501544273, + 1858813853, + 1393709252, + 3841290936, + 3191431958, + 2291175525, + 2672947226, + 118052097, + 395536341, + 1571191410, + 3342462661, + 2981072253, + 4167802698, + 3805913367, + 25587410, + 1429976204, + 4288281671, + 3946439793, + 371893718, + 3644971720, + 3414035295, + 1870619742, + 569655035, + 4151565832, + 2208735776, + 1083551415, + 4165784676, + 3267065958, + 2983122090, + 2784431958, + 3356322041, + 3785740654, + 2853492489, + 1849298158, + 4189328792, + 714499755, + 445699363, + 2876754024, + 3758072052, + 3491758395, + 3655362865, + 2585374463, + 520229145, + 815042474, + 1987285757, + 3267529124, + 4037806053, + 2524326613, + 1967302540, + 3111918456, + 1625888387, + 2984124568, + 1049721382, + 210804324, + 3960657709, + 3292182259, + 2883285273, + 4252517058, + 2967098500, + 3897435546, + 4075896761, + 3658708702, + 3373310069, + 3897326866, + 2232709301, + ]; + + static final String ALLOWED_ADMIN_PHONES = String.fromCharCodes( + List.generate( + _envieddataALLOWED_ADMIN_PHONES.length, + (int i) => i, + growable: false, + ).map((int i) => + _envieddataALLOWED_ADMIN_PHONES[i] ^ + _enviedkeyALLOWED_ADMIN_PHONES[i])); + + static const List _enviedkeyprivateKeyFCM = [ + 1133569861, + 2631336878, + 782153632, + 3201336902, + 631837952, + 2983168461, + 2488817414, + 138437677, + 924063199, + 3540607729, + 2070108395, + 2167491381, + 434036476, + 1432021185, + 4144709208, + 94957733, + 679660153, + 3468280030, + 307374396, + 1973917614, + 1347149425, + 2963091380, + 2396741114, + 2817505428, + 4202675606, + 1406883659, + 2190498116, + 3329056432, + 1323004755, + 4248062020, + 3737353370, + 1429733983, + 3668953609, + 689400931, + 3502322733, + 2315400353, + 124038168, + 4194882108, + 1999808299, + 1707724489, + 3439846153, + 2075405552, + 2785861829, + 3569473982, + 719832864, + 2072039208, + 2590617166, + 2107349762, + 3957510575, + 1162496764, + 2962114505, + 1300460645, + 240394541, + 3044154837, + 1183866882, + 21608530, + 3414611900, + 907026076, + 2466175683, + 4104339034, + 56647811, + 3490584428, + 585253290, + 1773541519, + 3763318258, + 1034154581, + 916870818, + 3104025930, + 3187985713, + 3347377442, + 381142488, + 1606802673, + 3262608688, + 437353484, + 1578303889, + 149421296, + 3608042017, + 3361863123, + 1837541265, + 3716700516, + 3596562113, + 3885056969, + 696365646, + 888073150, + 170835444, + 2643784874, + 3048307244, + 2677804177, + 2293018754, + 205837962, + 1819491680, + 1388816286, + 690842338, + 696985779, + 749153595, + 941841807, + 3662725343, + 385753401, + 1568503017, + 801506070, + 755000588, + 1272570947, + 3901600844, + 1238393689, + 3281418721, + 402614831, + 2874449435, + 1720402571, + 644537186, + 3787686263, + 400335132, + 4149775985, + 651382867, + 1659014845, + 3314643250, + 4038224847, + 86756982, + 2724725795, + 2307744074, + 1006463809, + 2647955156, + 797104864, + 2977598600, + 2606919403, + 895351011, + 1137660579, + 3030760962, + 1376428480, + 4261854716, + 307433750, + 4046778369, + 3221461974, + 2437346913, + 853871860, + 3451972203, + 2428265377, + 3139192743, + 699417121, + 2546447415, + 3646938900, + 321779133, + 4132651889, + 3150897467, + 3322784952, + 3321636334, + 3809206748, + 887152366, + 2725284811, + 3118585773, + 2302426343, + 2923495170, + 808817138, + 2122448850, + 4288522695, + 694121430, + 666217562, + 3456731245, + 2945634787, + 4286515422, + 2584304587, + 196624664, + 2923573934, + 495440833, + 4230033715, + 2919325867, + 1637322538, + 2441024399, + 2066037195, + 1429637805, + 3454747749, + 2992198813, + 2316066249, + 2059728876, + 1641836343, + 3372473717, + 2281518438, + 2027233573, + 2084138463, + 3906451211, + 1822877348, + 1411675113, + 892586474, + 2691798255, + 4171111378, + 1618388892, + 3628305835, + 2112352703, + 2769352428, + 3328390363, + 3547862795, + 1951111245, + 1752301420, + 3950840413, + 3733917162, + 3483625891, + 3961284589, + 1053919361, + 2364245161, + 1762251231, + 2577990521, + 3062140881, + 76894006, + 3323006640, + 3566856329, + 321653386, + 1222582341, + 3906125557, + 3207183368, + 3711704945, + 2803585006, + 1579690602, + 1561335837, + 248277811, + 1511629644, + 4225595823, + 2048236877, + 871098161, + 922796299, + 3165496228, + 2188132616, + 3314920527, + 3899363545, + 1939636581, + 111225829, + 577925552, + 484552429, + 1960109918, + 2716368548, + 3176433050, + 3601674852, + 373094431, + 2397954284, + 507596265, + 3453886844, + 1584313311, + 4078107846, + 3760649765, + 3169407464, + 2241899375, + 2176340713, + 2075366135, + 2166317154, + 2776336562, + 2892757776, + 4053008249, + 606525909, + 3377027328, + 2926964734, + 3454311800, + 3183173859, + 2486185933, + 4254240230, + 657283525, + 1197887020, + 2566237529, + 3361480729, + 3303665481, + 2777540161, + 3481688656, + 530972315, + 1141952260, + 2353730578, + 1567130567, + 1774672774, + 2759099133, + 1145398618, + 1784341895, + 2877327789, + 2283701774, + 2329358478, + 3749851982, + 889304613, + 1407703919, + 9934745, + 1632474055, + 1128381742, + 4157149222, + 901339165, + 1997833028, + 3348345862, + 918882200, + 389368392, + 1785766030, + 1011183425, + 4172425641, + 2970446214, + 3427424722, + 4065890984, + 279599603, + 3540241583, + 2107657045, + 374833093, + 2808540459, + 1133677443, + 3450784415, + 505192918, + 2761197512, + 1878885764, + 2093190413, + 365593111, + 1267461888, + 263440731, + 242490921, + 3436981670, + 70931106, + 4263682805, + 4108319982, + 3082011976, + 3638304801, + 547834987, + 1389281340, + 1165726954, + 3532323510, + 3738090780, + 2792799813, + 895056376, + 1766733245, + 2756468658, + 549127955, + 3658594335, + 3100293428, + 2189838935, + 4240567890, + 1320408354, + 1775420312, + 3106963550, + 2404621187, + 551952344, + 3979317860, + 1851160549, + 3178850306, + 2371135928, + 199118558, + 744433864, + 4252019171, + 827710697, + 3649106148, + 3901895857, + 876060027, + 117735217, + 444923369, + 3958565026, + 3825503616, + 1196211577, + 3964911068, + 1134815533, + 2104701277, + 2438251647, + 2077693689, + 1504095835, + 2972422661, + 1154532591, + 4124853811, + 2246290968, + 2099240424, + 2876187390, + 2798467629, + 1421449888, + 597729286, + 457387489, + 1499153086, + 1356594391, + 342601730, + 2132311059, + 791338823, + 883040089, + 11072842, + 1547956814, + 1127479410, + 1382813745, + 3083564782, + 57757933, + 1401265901, + 2223697359, + 4278517488, + 1442793572, + 1895302586, + 4037320066, + 1850828558, + 2690015012, + 1241674724, + 3116064231, + 845564284, + 25946255, + 4215149116, + 495055099, + 1672810856, + 1204097683, + 3789428282, + 3105344471, + 694575177, + 3452289136, + 1029896650, + 3360023878, + 164477778, + 4194287977, + 3710042738, + 3439994604, + 3530844732, + 3464877910, + 250768676, + 2766091923, + 1692725460, + 3990760111, + 2500143420, + 2288225360, + 1120586667, + 563203221, + 3827538083, + 960944785, + 187284559, + 1096897051, + 1599201569, + 366218183, + 327599743, + 552809433, + 922286152, + 1335459361, + 2540585017, + 583506026, + 2326404622, + 1027286907, + 3070665969, + 4015090822, + 3982905225, + 410023694, + 3395195240, + 1554582003, + 697806544, + 2638679054, + 4147142389, + 1346305553, + 3207189746, + 2321219320, + 3015285020, + 3277202443, + 1000205120, + 992239189, + 3971910935, + 266289801, + 3185455376, + 4205129433, + 2741042716, + 2288302182, + 2924512860, + 3159675473, + 2649659344, + 1431390315, + 3351345691, + 1985322899, + 2504948082, + 471514768, + 3592582188, + 590265372, + 1231874856, + 1822441545, + 3449101578, + 2881651809, + 1492681265, + 2787205964, + 3976134151, + 3773098695, + 2394435645, + 1109809125, + 4231449935, + 864895676, + 4110130427, + 3618915408, + 196919553, + 346361940, + 3415490747, + 405335608, + 2276418656, + 1980412698, + 2625528959, + 2125893390, + 3628088945, + 3876730320, + 4116584122, + 320861233, + 2570392315, + 2756479778, + 4260304638, + 3722879874, + 3046178060, + 1720565074, + 2770560359, + 912014247, + 1154114722, + 2398392697, + 1783089126, + 1546460693, + 204668283, + 3121352792, + 3639528845, + 2152218359, + 1312788810, + 568247798, + 124319166, + 493021345, + 1547026962, + 2251559632, + 133996748, + 2144224585, + 773611792, + 3955830954, + 410084503, + 4066825166, + 2042725973, + 1466951922, + 1930121934, + 3751731583, + 361596211, + 2154918619, + 1958735028, + 4253100770, + 1798276894, + 796014125, + 3181768284, + 2472538625, + 3746473395, + 3164354617, + 3774315671, + 2820211049, + 268279305, + 2116129449, + 101727936, + 3223098426, + 4163090882, + 1977979211, + 2069783619, + 3630469021, + 2808477081, + 2394277830, + 4273755936, + 3873756994, + 667433975, + 3543325367, + 948678910, + 3523633187, + 1065600406, + 3800848741, + 1630971465, + 2177742386, + 2169259565, + 2527662988, + 4265041234, + 1500582561, + 3783705696, + 1219124428, + 3964508217, + 1843670546, + 3654084756, + 171050360, + 664491242, + 4182800760, + 194504482, + 2724588151, + 803791207, + 2335734629, + 932536954, + 351277826, + 1745733698, + 808433890, + 3277785720, + 2268331000, + 4176006785, + 2783846944, + 2846749061, + 341760371, + 850652957, + 610136542, + 2125879925, + 1340989414, + 287096459, + 1590747309, + 2427885451, + 751554186, + 2647150186, + 4237391446, + 3763136313, + 3877298003, + 3014249088, + 3382389926, + 1631535685, + 3892604528, + 113578899, + 3571572828, + 3302253936, + 3064374549, + 3206349864, + 2304578579, + 1103680231, + 4182756619, + 353717522, + 946679590, + 112641226, + 2779609073, + 1652604443, + 4080136425, + 3861737353, + 3360215362, + 2959948846, + 3936470531, + 496941515, + 3375407516, + 3321262667, + 2335640285, + 3420603744, + 2677533980, + 3790770659, + 2069993412, + 2151268909, + 2625185327, + 1011602061, + 3094312259, + 2220111798, + 2329340907, + 3911596573, + 3635139597, + 4146685830, + 3763946467, + 3210305447, + 3929977614, + 4213604714, + 1070862604, + 3587716369, + 2324660711, + 1605219041, + 2500305989, + 3259861265, + 500582470, + 645426666, + 1542921866, + 1183594901, + 1566358777, + 1552607413, + 2615143441, + 843226814, + 571961800, + 2857771574, + 465828970, + 601724430, + 3630549817, + 4084906952, + 2289304527, + 2558936247, + 3620204471, + 800809787, + 3744817556, + 2527129768, + 478466184, + 2168202326, + 2362424043, + 4052881586, + 3740065985, + 230857130, + 2241446618, + 1087691895, + 3587787557, + 2274741308, + 3417159623, + 4195474105, + 3893812568, + 3619955078, + 1578592705, + 2342460548, + 1683392078, + 2424908660, + 1447503745, + 1685376648, + 3466313082, + 1339474830, + 831909307, + 4010134187, + 4003025695, + 3647011103, + 3782079027, + 1160932240, + 3494656117, + 1611197802, + 3567142312, + 2890077562, + 1602408714, + 472657297, + 494625495, + 106509046, + 3347756256, + 3240199890, + 1273640400, + 26328659, + 2157031379, + 694426882, + 2082449845, + 774225448, + 688955111, + 4171164651, + 3058172874, + 61808759, + 1890125294, + 3204378621, + 4036249412, + 1905152169, + 759081607, + 2643053294, + 2246357200, + 3577076693, + 3576965660, + 750521532, + 1446725730, + 883595268, + 1475256966, + 2754936968, + 2532626023, + 3976380384, + 4115602181, + 724209976, + 2743069868, + 2983502064, + 1884538091, + 3328099115, + 1306827026, + 1015926185, + 114388389, + 4148184582, + 3881534154, + 2154958112, + 2450264130, + 3423207432, + 3639858265, + 3685208575, + 2223382220, + 4143454651, + 3912117573, + 467726856, + 3747956614, + 1746667826, + 3642126639, + 2068865283, + 537066502, + 2219668398, + 3421188369, + 648060539, + 3174434539, + 1127238559, + 1260696570, + 1992801776, + 34669648, + 17786083, + 4172341182, + 2469189081, + 457767094, + 3315289129, + 628490177, + 1850498949, + 4132167689, + 1156111078, + 2607661973, + 3405842724, + 2122074618, + 2366415263, + 1017403904, + 703133706, + 1760782699, + 3950005746, + 2807076851, + 1892815493, + 4156622339, + 2949253480, + 1178452343, + 2923127021, + 2587988428, + 3219952967, + 3779832106, + 14674864, + 1178460628, + 430504797, + 1826964531, + 1641653160, + 1317393430, + 4018237409, + 2188499764, + 777463477, + 3341084647, + 1785473, + 1713958817, + 614600943, + 3882370691, + 3128770783, + 1747566540, + 3560074175, + 1039036639, + 812324281, + 1619256219, + 2502372977, + 3670497790, + 3042560186, + 1123065506, + 2583224593, + 2948298476, + 3021771220, + 1862104365, + 3597646031, + 3599995142, + 4030691110, + 2123585285, + 1992908341, + 733281288, + 3813398125, + 1870147575, + 3504460331, + 1736758862, + 3156067818, + 2750377685, + 2363934059, + 3310351310, + 3940047939, + 1578662503, + 294427273, + 806089294, + 3920958925, + 3896806913, + 1772829750, + 2344489042, + 1265846348, + 475622136, + 662357139, + 165396475, + 2749199175, + 2183375711, + 3937428306, + 803615728, + 509709769, + 3873466926, + 2172599902, + 527606578, + 40303553, + 2699653290, + 38353546, + 1822726436, + 3768380641, + 1927148863, + 1213421154, + 3186182600, + 1913248570, + 511826924, + 3822177471, + 2419777522, + 1875814791, + 817855974, + 63454356, + 3947190794, + 2325675557, + 3285547154, + 3102442928, + 1841049208, + 1444547977, + 419067849, + 1590144695, + 265849933, + 1789005293, + 1424217182, + 1030839968, + 4257727578, + 3034123782, + 1007958822, + 2610961415, + 2970216120, + 3058962717, + 3615507348, + 48179697, + 3002918546, + 3441672934, + 566382837, + 110545911, + 812350987, + 1870470422, + 1245308854, + 323897161, + 2936813890, + 2674566443, + 219377895, + 1086446979, + 1786499149, + 144398345, + 654537929, + 2395886380, + 1593335389, + 2828518475, + 3459698537, + 1787827162, + 3810757740, + 2425988724, + 4178554753, + 1418362991, + 2480692275, + 2288666395, + 3459457223, + 1653714464, + 3731039555, + 865008166, + 2292709319, + 3261752425, + 2470550971, + 1107107438, + 3714430210, + 1121490436, + 293329602, + 2146244605, + 3054248248, + 2798515481, + 2715429072, + 4123553916, + 2453465842, + 4180585184, + 311332054, + 3282685475, + 4196003183, + 143646618, + 2050741420, + 1130798427, + 2188270850, + 4182413865, + 3889327424, + 717038200, + 1009152937, + 1280770314, + 4264392438, + 605672675, + 2896879432, + 957372392, + 1032615488, + 2621739278, + 199467483, + 4230448746, + 3549149555, + 521016138, + 2846462485, + 274724402, + 2227908930, + 2967834491, + 3726412176, + 579648251, + 1013096723, + 3301766709, + 2500389133, + 4006393540, + 4012932388, + 698395652, + 2204303095, + 3219551077, + 573519650, + 1909653846, + 4023286709, + 123080637, + 3736361396, + 3419621647, + 2826723183, + 814724082, + 1073700179, + 2563994063, + 1474276044, + 3921991874, + 122646162, + 2077323014, + 1103992956, + 2139345490, + 3853409110, + 2154581931, + 1243065267, + 500043562, + 1292680936, + 872953662, + 516336047, + 2294151816, + 4067812227, + 1088621338, + 121581226, + 1270078291, + 995339050, + 2544655218, + 4275700282, + 2370560230, + 3170631092, + 4147771399, + 1641718137, + 395411316, + 3433033355, + 1661882323, + 3987552376, + 3985644864, + 2936838944, + 438444009, + 697124692, + 2325803091, + 2273501883, + 533683780, + 13177462, + 747666779, + 3544100246, + 3873810869, + 3732873649, + 1481766347, + 1348019810, + 38996467, + 1620496508, + 2700206985, + 1957448167, + 3321330398, + 3403978183, + 2542259279, + 1244737682, + 106824734, + 2889180192, + 2782979491, + 2208137029, + 1135795692, + 3243972639, + 1477336891, + 275111510, + 1786613380, + 1659228641, + 2054362147, + 196128659, + 816620318, + 4083877296, + 3716624455, + 1336671579, + 2764677258, + 801329804, + 3366317922, + 1011799852, + 3574425990, + 252138862, + 2894646204, + 2921304524, + 2462859333, + 229342323, + 3046504195, + 1508719358, + 665505174, + 2469489928, + 263479122, + 3365977587, + 4261148481, + 3654190026, + 3936839214, + 3988208864, + 3988430575, + 1451897393, + 3965115073, + 3686032844, + 3415467986, + 4020497039, + 1210122981, + 2111071161, + 2570070402, + 3947896005, + 1503190038, + 3504941178, + 2530459290, + 1800983033, + 924077923, + 41849044, + 1222720690, + 3158856279, + 1788061356, + 3691114006, + 1027122576, + 3321318183, + 3555481304, + 3531688759, + 214117354, + 1346508230, + 662442319, + 3812607766, + 2052640697, + 1608986287, + 3290855551, + 1643300988, + 1991073084, + 3768055435, + 868909615, + 1931155292, + 2551164463, + 683039949, + 2130756541, + 872271052, + 742932555, + 3602591999, + 3939291231, + 3967503725, + 88820413, + 4228851038, + 3346700824, + 718168795, + 1679949945, + 1011812910, + 4131325877, + 2366209749, + 1256096480, + 4274545458, + 88884764, + 857900399, + 614948171, + 1354041529, + 3050802805, + 446338994, + 1992706190, + 1701237523, + 1504018483, + 1341283007, + 190528434, + 4201618879, + 427878121, + 3521422876, + 3171400211, + 2453520335, + 2715250006, + 2878017940, + 407841248, + 1076646473, + 2902096371, + 1119626292, + 2644871628, + 3293596912, + 1974815981, + 1844661658, + 3463913199, + 2148341356, + 1291573129, + 2169246774, + 4121523571, + 1001828332, + 1201094370, + 2768247760, + 1187741609, + 2584658511, + 3298403860, + 19508848, + 2376541090, + 1834240020, + 2795223449, + 1569675949, + 2083566175, + 197356987, + 2187510641, + 735841287, + 1676166370, + 1470742301, + 1775423233, + 313697778, + 4150418127, + 1340236397, + 244289640, + 2419636179, + 1468768426, + 3948651692, + 4190434742, + 4240184606, + 1648085376, + 236983302, + 890850159, + 4132623352, + 1702226389, + 1275783591, + 1282324080, + 1068123143, + 2507371542, + 3567002196, + 2326254609, + 903986714, + 4275863676, + 681934685, + 3449788131, + 3658543841, + 3971267199, + 906890718, + 3220537935, + 3721238507, + 3424824871, + 4071298409, + 2350348109, + 851103759, + 308738713, + 3633342221, + 3294051521, + 60850191, + 4205293793, + 112318405, + 2392678001, + 4245426678, + 2813800834, + 544585601, + 862804006, + 635702554, + 1037318155, + 3062389050, + 1788723177, + 909046233, + 2633211423, + 1512124241, + 219688759, + 208669461, + 2341111368, + 1558771255, + 3962134562, + 3793702001, + 3678482635, + 3083064327, + 2224088978, + 121834241, + 3974743012, + 3285910810, + 2301078604, + 3991408963, + 1754131096, + 1115088084, + 742363327, + 1940874780, + 3815841784, + 3751295090, + 2438487767, + 505244835, + 2737497806, + 3686088508, + 3642212743, + 745390046, + 1171532585, + 1037089278, + 1222170202, + 3339498824, + 2420183829, + 1812185947, + 1685491936, + 2054045418, + 2916731872, + 625306470, + 2885097492, + 1531527709, + 881885921, + 4123938006, + 1223959919, + 2997456306, + 986868988, + 3499204297, + 2002259562, + 702456339, + 2180569369, + 573224295, + 3359535526, + 2265103784, + 4007182087, + 1269646626, + 3540842803, + 796051949, + 938241824, + 2538303668, + 2742240836, + 143742622, + 1113882340, + 2339965923, + 3861371050, + 1940827655, + 373043328, + 290172225, + 3309138253, + 2228544140, + 2697368471, + 314268289, + 3275936664, + 1292638624, + 3619702518, + 4134658547, + 460321722, + 3287938525, + 1056154816, + 176670928, + 21652761, + 1897619159, + 1048386769, + 3446694257, + 759789818, + 114313737, + 2656037254, + 3619510905, + 4025392287, + 2133557404, + 701572259, + 1063247232, + 2433408365, + 1329294200, + 3455774275, + 1060649066, + 372371712, + 54151955, + 4157273347, + 1028934354, + 1059536099, + 3705266405, + 2249471159, + 3723179480, + 1685144388, + 3532165340, + 426031484, + 3992264923, + 3558187790, + 789327435, + 113797040, + 3197466334, + 1846132324, + 3662284891, + 373999464, + 3527638615, + 3168581028, + 1873953465, + 1547610536, + 4188855756, + 3909799158, + 2439098621, + 1366914310, + 2552185808, + 3438947932, + 164270865, + 367726794, + 464460335, + 3684470355, + 2811443539, + 2800117708, + 577716947, + 2360729156, + 3199339255, + 2042468055, + 322152159, + 350449120, + 1338453446, + 2169901454, + 1137834952, + 1224674633, + 819627284, + 866288235, + 3684373329, + 2802084515, + 883000174, + 2124730087, + 1794186586, + 1843025586, + 1107572822, + 1553821135, + 2255976869, + 2971962377, + 1294016499, + 2779781987, + 1121528448, + 2599103176, + 52551025, + 1715784134, + 172080132, + 2909339926, + 2925801155, + 2758545856, + 2591511611, + 2537649007, + 3218650284, + 3620977964, + 2091529962, + 1908561698, + 4140639129, + 1468559223, + 3031446487, + 1538303396, + 3024701952, + 931817408, + 3315385342, + 530706375, + 776942776, + 1066889725, + 860858484, + 1380983184, + 3488107159, + 2352861314, + 768524800, + 3324839858, + 2985439478, + 2632570243, + 1269085623, + 591371703, + 3614267960, + 3634334422, + 494364802, + 2201954755, + 1822851462, + 912761235, + 3560975604, + 2823473984, + 2726516714, + 3900329550, + 3046312437, + 3202027504, + 3749404375, + 4111460380, + 3394432115, + 845091950, + 3547437680, + 2438586161, + 891753793, + 2658014682, + 3263079018, + 3181132990, + 498702745, + 1919031597, + 1885259403, + 1033195185, + 2152110138, + 2916981284, + 3597923267, + 963475408, + 2390133622, + 1279020008, + 1532292933, + 3533828736, + 3410363086, + 4086929538, + 2384284057, + 736527609, + 921831372, + 978761557, + 3581033526, + 184754562, + 1142912374, + 3579159488, + 3754076721, + 3195299577, + 3924528446, + 3367661173, + 2664527432, + 3060833069, + 87824822, + 3341591958, + 1787431305, + 2190200087, + 724746739, + 2362957509, + 1893647833, + 631707054, + 3600263608, + 3112000274, + 1195347200, + 1980784380, + 1587897178, + 1505502520, + 730808362, + 2077493665, + 1766424643, + 4169095394, + 3023491856, + 1907255295, + 1400247029, + 3439802081, + 2353421540, + 2598206379, + 241608182, + 2800597438, + 1865113119, + 2692612767, + 655943462, + 3036801590, + 4273840964, + 1531071759, + 1388648520, + 4046738566, + 2566906236, + 3190630157, + 1259094407, + 2588960543, + 881378174, + 4029007816, + 1036716304, + 1440834157, + 1045545551, + 1611580430, + 3074999947, + 3160852020, + 125510633, + 1948935563, + 2528898967, + 1349973772, + 790409835, + 933146308, + 3340496196, + 2161701996, + 2203562878, + 127500008, + 2241686805, + 301650182, + 1189877354, + 2069676893, + 2149373784, + 3925298089, + 2363633682, + 316935579, + 222701616, + 1656250469, + 2585556171, + 2344566725, + 1641407839, + 2733425029, + 3458390770, + 3862744850, + 2081559914, + 1101703091, + 4213220658, + 2871617336, + 3821441362, + 1284486133, + 1295341230, + 231768760, + 3688216658, + 434412803, + 2085597648, + 1178947430, + 1499668892, + 332651778, + 848688163, + 783466160, + 2232129444, + 1984278409, + 54161174, + 480180255, + 1460924608, + 2764823444, + 1193698181, + 130579953, + 4246187486, + 2272443719, + 3890368520, + 3817991883, + 1891017621, + 3116376438, + 1838640984, + 202212626, + 548912036, + 1276402547, + 2627209043, + 3559295082, + 136668629, + 1463185400, + 3996451093, + 1195997667, + 3703309471, + 966209630, + 1495349351, + 3818068441, + 998187068, + 465377358, + 2740367724, + 393280358, + 1284923405, + 1224681054, + 2296772677, + 792366488, + 1312887012, + 563043339, + 3204722308, + 2362148183, + 3991589490, + 3812760383, + 2376309831, + 3955295751, + 3155646167, + 718545282, + 426415781, + 160354117, + 658523776, + 2523118847, + 1301823518, + 493847556, + 4056626100, + 2397998927, + 2294563523, + 1640569883, + 1159193250, + 1855737923, + 2179119641, + 2264199499, + 1222836974, + 3897707605, + 3276299004, + 941543841, + 3250950662, + 4256183038, + 3233880332, + 1087109928, + 952749216, + 404554848, + 1410748259, + 2627152206, + 979574335, + 2707691282, + 1014678495, + 2734357556, + 1706931807, + 1748581111, + 448295008, + 592225319, + 4161750555, + 3212838838, + 412410368, + 4235477535, + 1807215053, + 542939498, + 1486293348, + 2157680973, + 2605658979, + 3385782260, + 1415388200, + 1442117433, + 222759435, + 1396810624, + 3570065468, + 2736080123, + 2834358471, + 766728789, + 825544721, + 2946948111, + 2901144947, + 3302059408, + 1587854930, + 924399321, + 4038690213, + 3466316021, + 1867950097, + 3055097144, + 1209191984, + 561463795, + 1873204665, + 2398002966, + 1880272881, + 3725511575, + 1620394432, + 1896123096, + 707343813, + 3089248093, + 3628971900, + 2382386013, + 237300537, + 3375790093, + 3131500864, + 3130912993, + 810002296, + 2443950534, + 3073420942, + 2776473731, + 1723254889, + 480346138, + 2162458117, + 2901340480, + 1459347184, + 4157536243, + 1658113007, + 2653696984, + 3483498847, + 2172581735, + 2945148912, + 369575878, + 2708837085, + 3017439704, + 572356532, + 1687730610, + 3303917138, + 4185775922, + 1542629751, + 1823588786, + 758034504, + 207137758, + 4118907251, + 3551679917, + 579289547, + 130012826, + 3056847841, + 3298176158, + 1631448630, + 3883850502, + 1781666917, + 226013389, + 1191195298, + 162910956, + 2421225516, + 3472833153, + 3105014764, + 2998279280, + 989511785, + 3122448433, + 4031112951, + 798915717, + 3124120701, + 622880500, + 1550632339, + 3582512921, + 1897853716, + 3955800050, + 2843608771, + 1783793539, + 1234540424, + 2841204267, + 3078276773, + 1897041741, + 2644748275, + 2075116374, + 3566638157, + 2545072199, + 2705581137, + 2034593660, + 1102733534, + 563102184, + 3562036002, + 1559012396, + 3081027664, + 4277200768, + 29819565, + 952516671, + 288733278, + 3944002185, + 2580949299, + 2180907477, + 701845585, + 147266494, + 370347954, + 3271320914, + 2691392956, + 2383884939, + 3524671230, + 3939649359, + 1745553757, + 3201374308, + 1372111071, + 3219710016, + 848485099, + 667408098, + 3285356951, + 1335687640, + 3644214032, + 2613006793, + 4205559384, + 1312637482, + 1614630442, + 1683627778, + 1208640814, + 2834070964, + 3592578939, + 2358819530, + 1995443443, + 3413826791, + 1776126225, + 1410383724, + 2955630995, + 2993512709, + 3236365815, + 597697885, + 3130855621, + 872085356, + 3088552112, + 3059305796, + 2016688539, + 769456081, + 1704353282, + 2894459066, + 3397853542, + 3442669343, + 2849401363, + 2439338168, + 1765298122, + 3770362729, + 2012197456, + 1236698075, + 2547134040, + 3583709679, + 1222346076, + 66929888, + 1810978692, + 140921618, + 147006822, + 716546132, + 272190641, + 4270199030, + 4112878406, + 3459132459, + 2205334703, + 2655240614, + 3460427508, + 4004166094, + 2733896947, + 2662276621, + 1235355454, + 2080490449, + 3835662405, + 2012775645, + 3831435577, + 896042505, + 847436101, + 2690167462, + 2480708720, + 34486415, + 780307332, + 1206065551, + 3684584401, + 109239563, + 1177388715, + 186055213, + 542130796, + 431317280, + 4172245957, + 659717852, + 3115120197, + 3389111893, + 612902486, + 3093454626, + 994194711, + 3302496409, + 2727804191, + 3326713816, + 2909645288, + 4081309302, + 3915134216, + 1723404026, + 3538120273, + 3346690791, + 173973591, + 3745427415, + 3605615924, + 792777225, + 3898488257, + 2851691638, + 1310137959, + 3972391863, + 2800499039, + 2126178226, + 1804903581, + 1573085093, + 3765347565, + 1947401503, + 2004990656, + 1992294665, + 794994487, + 3989725101, + 4052205259, + 4275133517, + 999898079, + 680324738, + 653725421, + 4071639383, + 413310260, + 1532627122, + 1109186269, + 1454507956, + 1285781862, + 1986139826, + 2716119693, + 1215969748, + 4236644205, + 4222317536, + 3465516680, + 235341523, + 2665785469, + 2109288089, + 3865225401, + 3901456815, + 3743371368, + 2847912006, + 1626006640, + 2457976716, + 3706719984, + 2633385040, + 2583230270, + 4011067946, + 4054333465, + 693261516, + 2607135999, + 2466950594, + 2361552982, + 3954587369, + 761811183, + 3009769247, + 862264806, + 3029405918, + 2092574479, + 3841904830, + 3016847299, + 3730784953, + 504024660, + 2701889065, + 1117738707, + 3634064406, + 3718762989, + 1744136614, + 576863562, + 2218173951, + 1287233228, + 3397782987, + 4199567582, + 796784456, + 1140293975, + 4199890228, + 3894449046, + 1599629633, + 534382349, + 2188664287, + 1188379575, + 2149173101, + 2940426567, + 1090797480, + 659007153, + 1390171376, + 827457145, + 1830598549, + 4268312346, + 2538285263, + 3432324116, + 2356562845, + 618449305, + 59317845, + 32078972, + 1432616549, + 594046403, + 4005397838, + 406342850, + 2458307266, + 3622090042, + 567965828, + 2332609232, + 3913110002, + 4262951031, + 2223365504, + 3342426145, + 2937615989, + 2775839252, + 789924065, + 2547858218, + 4095742257, + 3553568936, + 2794396975, + 2669775774, + 3492940828, + 767973272, + 2223966928, + 1943349271, + 2397350853, + 1721534631, + 2284745909, + 3407740702, + 2117904330, + 3232034135, + 16565437, + 1931391428, + 3733107895, + 4226045835, + 4041262527, + 808886639, + 866728119, + 796865561, + 516940011, + 2539355172, + 3942135406, + 4094999671, + 2693105972, + 1495848373, + 2649483499, + 2160589651, + 2962242307, + 3100995731, + 3301101694, + 2928207080, + 3820618865, + 1087878141, + 2958883758, + 2394205737, + 1361447768, + 2272811034, + 485504121, + 3294843171, + 2682287413, + 678219958, + 2324071209, + 3963482046, + 3007126565, + 1199614094, + 3164538217, + 4161981055, + 2778925309, + 62318500, + 2375538984, + 1469419268, + 1541960944, + 4137797337, + 3249238236, + 361601412, + 3415181848, + 3260509721, + 22562218, + 1067118319, + 2385726306, + 1385555483, + 1365689652, + 812527706, + 2566479528, + 4102252052, + 1339610123, + 1617514438, + 803772757, + 1830781896, + 3612102768, + 3759491386, + 4122435767, + 2036628786, + 4064824456, + 1405949265, + 1439853342, + 3933859233, + 1375799685, + 1727029396, + 3830298066, + 3621177512, + 776904443, + 3379551387, + 3354675417, + 2449813983, + 899493340, + 305076528, + 2320614618, + 2993808680, + 947776775, + 2833196371, + 2012448162, + 2485862213, + 454484984, + 1523595724, + 4242593197, + 372556332, + 1103298205, + 1648831464, + 4146669427, + 3328164483, + 988612572, + 247392334, + 1866213727, + 4150811684, + 1147567956, + 1034212146, + 96214741, + 2690679643, + 3567190262, + 383537089, + 305717567, + 2233806836, + 1230730955, + 1081378770, + 3219338543, + 3352036722, + 1759154670, + 410897617, + 2266534987, + 20622638, + 966731278, + 3881030600, + 1681142506, + 4180658998, + 508491304, + 2075219988, + 862057009, + 3811486827, + 166193849, + 1952208041, + 287050949, + 4108801649, + 3634814712, + 1441695148, + 4165943291, + 985297823, + 1950886509, + 326103870, + 52511222, + 3840171038, + 1544404498, + 1483779274, + 2509714717, + 4191272942, + 196893263, + 1752138771, + 1387920548, + 3203092670, + 3305714185, + 4020283615, + 1033783069, + 873274938, + 2512442229, + 4050706134, + 50652793, + 1076717860, + 866310729, + 2170861381, + 893749831, + 2773398050, + 475134716, + 2354613553, + 2314268426, + 1221954161, + 1136667736, + 1313435602, + 887229486, + 1360766549, + 2670668048, + 2341728973, + 1931118129, + 3373726746, + 1111218235, + 3520098808, + 1688835919, + 2940851490, + 2064836337, + 3968979974, + 3836060039, + 2942295937, + 484909846, + 57105482, + 893060117, + 3098559078, + 2646028589, + 1116334295, + 1386055093, + 2672179584, + 3465976289, + 2445951345, + 3624670035, + 1585735041, + 2706230734, + 2994891082, + 3515469200, + 1276669673, + 512187229, + 3497635883, + 218620959, + 245089060, + 4175591573, + 4155493712, + 2748673947, + 1833505305, + 2012082323, + 2709336153, + 2120857677, + 137903570, + 488916174, + 2781208725, + 2409478547, + 274592367, + 199488141, + 2342346857, + 3601780140, + 1121367165, + 3549771550, + 3076621128, + 567283226, + 3387958259, + 2030339307, + 1104740183, + 612459272, + 300767297, + 3050650430, + 2239182820, + 4159761668, + 2869764213, + 634694700, + 1106345469, + 2997451018, + 1843299496, + 430102189, + 526441779, + 1780104658, + 367387616, + 478601672, + 2464829660, + 1470568604, + 59858364, + 3322874822, + 1861332475, + 4272110389, + 2809523345, + 592218826, + 245752776, + 1160055635, + 2650328612, + 4116988655, + 2035975809, + 1888310709, + 385128325, + 705277784, + 2618129717, + 1873449709, + 2767331868, + 2978152928, + 101342520, + 496164299, + 3628094966, + 3617214560, + 3276401446, + 2823749437, + 3226661064, + 2505966670, + 2070046543, + 201965594, + 992372321, + 808827653, + 3757676062, + 2428492155, + 1976500081, + 374480624, + 1080514698, + 2981903116, + 2278910404, + 2881090894, + 1587947707, + 2995760558, + 4065642765, + 1419256387, + 2879122765, + 799732641, + 2237576159, + 2722571965, + 1945610873, + 1061221753, + 3737822677, + 3766401862, + 1794205272, + 1324118887, + 1406627255, + 1246070016, + 1663528532, + 1697199377, + 1725153851, + 1644109796, + 1555884116, + 2104188347, + 1983559692, + 410269419, + 88182632, + 2259001816, + 3545896554, + 1498254232, + 158757275, + 2086802999, + 1006471606, + 1388264984, + 2489082808, + 4121338482, + 2933397352, + 1328272844, + 2440478625, + 1874429555, + 4165076217, + 3618125529, + 426429240, + 3523227024, + 2221326617, + 1036420585, + 3084730014, + 2249454689, + 3627764096, + 2906922667, + 4069859704, + 3551319880, + 2008056542, + 4263884021, + 805474434, + 414460148, + 3631091911, + 4255385980, + 3566702050, + 3056142898, + 1412413851, + 1628335335, + 2988130790, + 1804321993, + 1260149734, + 313631333, + 1940664513, + 1251075071, + 142103746, + 253384927, + 3517416342, + 3340640409, + 426880898, + 3294484280, + 635363223, + 268138771, + 1492613435, + 4200722223, + 3285686445, + 801295415, + 2024943366, + 590788642, + 4058601891, + 2569141838, + 4203227446, + 3873029901, + 2938957729, + 2653323508, + 875351910, + 1225934695, + 3959624100, + 2491580690, + 2130038220, + 4156378275, + 2785882154, + 734574384, + 1648103801, + 3995559814, + 2769178231, + 715734292, + 851342658, + 4066600511, + 2873167890, + 367737717, + 2708556174, + 3095462268, + 2954581929, + 3596167017, + 416437246, + 3630899926, + 2652177164, + 4082497993, + 2092525777, + 4097981814, + 1798161626, + 921570821, + 2954127455, + 2903455637, + 2304798331, + 1258114076, + 3817191942, + 2909483557, + 2182250342, + 1650253435, + 1959237982, + 1275159542, + 3262458027, + 1272009741, + 452811378, + 4207284227, + 4014068428, + 2116331737, + 3821668701, + 2218821031, + 1832698056, + 993485847, + 3496889697, + 2641214206, + 1989726922, + 3632025556, + 3072807082, + 871546261, + 2112654627, + 3554921765, + 3035598716, + 3203667416, + 1926566103, + 3703963239, + 1744429225, + 2894885156, + 1619369871, + 3567760734, + 66603957, + 3634627448, + 1775619436, + 669243776, + 345554509, + 3410469602, + 1155755481, + 2545915127, + 1881644965, + 3014832373, + 991894728, + 2556172215, + 3344954145, + 1093682578, + 536721482, + 412887058, + 1927162005, + 598758544, + 1718573963, + 1056186033, + 3316535915, + 3595128100, + 1130595155, + 3859435741, + 909947405, + 1719271667, + 3984005418, + 1953576045, + 3439367892, + 1566598941, + 2942150553, + 3026742395, + 2447170263, + 3686824913, + 33431627, + 725397196, + 2320663736, + 1675683707, + 2299446991, + 3516433167, + 2048939642, + 75279992, + 2544154819, + 3300029692, + 3032144185, + 2785830866, + 2021781582, + 418522114, + 2390722409, + 197680384, + 1642831884, + 1118262832, + 1200601984, + 3464739706, + 515926247, + 1725239855, + 3994742718, + 3240728689, + 3145738916, + 1844532595, + 1620264703, + 4241585686, + 1317499201, + 572389138, + 717366194, + 1894941473, + 2632625749, + 1146787616, + 2682002716, + 191357974, + 1139509089, + 1281516716, + 2167935776, + 144366546, + 3850560335, + 2955928694, + 2476854219, + 1240245570, + 1201598779, + 3315121249, + 2067079794, + 2242637161, + 2647850380, + 3701580543, + 3720909783, + 1981567153, + 2939632748, + 3130494051, + 2236039992, + 4000430705, + 1741562167, + 2404004319, + 1683735303, + 57955420, + 3003892787, + 1345733127, + 4112811755, + 3929418014, + 1702502253, + 1563779786, + 131126007, + 3456434934, + 2711946303, + 1514661889, + 593277233, + 2310979980, + 2627253169, + 2196991012, + 734788614, + 1638451115, + 2011170818, + 2234624678, + 2644747730, + 1442906572, + 3186977457, + 3041580290, + 3056574755, + 3726946839, + 777432113, + 3096870562, + 2958583246, + 3198704593, + 968653965, + 2339592898, + 631523788, + 3180919056, + 828636999, + 578695087, + 2899843089, + 3000388853, + 3269720827, + 3037015468, + 3799598340, + 3149305514, + 2046835764, + 3530890661, + 30989217, + 2186509969, + 1179096544, + 2221010045, + 338765984, + 769504530, + 3971239329, + 2393081891, + 1544565497, + 865242040, + 3393553025, + 3524464797, + 3304062897, + 1546646632, + 3279691281, + 178822623, + 4081273624, + 88444244, + 2680632895, + 1275199310, + 2416414327, + 2419760906, + 3715897336, + 132751751, + 1119530060, + 1004169983, + 495930802, + 3413915054, + 899768813, + 3645578141, + 2499698472, + 132509074, + 25905020, + 3287880606, + 788515436, + 642323619, + 3147546391, + 3581174189, + 979602050, + 1611369111, + 2161460860, + 1095063350, + 4182558068, + 958677274, + 3492305733, + 1557372272, + 2654290688, + 566444553, + 2701083799, + 2781307160, + 1273578824, + 1387975524, + 597850620, + 2236234562, + 1466168507, + 3557657442, + 2574663791, + 4108434188, + 162027958, + 2621084243, + 403011392, + 1391061706, + 973642241, + 972433327, + 3904424455, + 1591050333, + 3027468230, + 480562783, + 847391513, + 10278627, + 891807608, + 234893054, + 1990103225, + 2718435746, + 2962618303, + 2457477564, + 2173705506, + 2840711582, + 359129712, + 1862207146, + 3179005379, + 1645874423, + 679472815, + 2797899962, + 893909343, + 3298150223, + 2373596744, + 845944693, + 743626006, + 1101645519, + 4118046404, + 3085126686, + 190442081, + 1429251740, + 3631205207, + 3554760933, + 4126353593, + 2783261338, + 2895926954, + 3712938542, + 3519916747, + 3954611278, + 3504723419, + 2842753149, + 570258929, + 1757758471, + 3191712789, + 959844640, + 3815947667, + 3894098372, + 4252794364, + 568847264, + 14599528, + 3247617154, + 4256259000, + 132921261, + 611627908, + 461842468, + 721786692, + 235906061, + 3838181019, + 2693917919, + 3584801911, + 1303671174, + 2715956353, + 2478140784, + 1156883438, + 304296391, + 4257481663, + 3383377257, + 2816549394, + 3609758812, + 965337833, + 663464027, + 2101116297, + 870118525, + 3961827375, + 1411666870, + 4042208149, + 1437767791, + 3011320579, + 628908785, + 3715862143, + 787455080, + 215407873, + 2354427590, + 3501402696, + 341761754, + 2789621373, + 2795910607, + 2196949108, + 506787737, + 2444762931, + 882455973, + 1775227796, + 3463655326, + 1613425836, + 1710055573, + 2954483535, + 428135136, + 3208103298, + 356408642, + 339078097, + 2783728495, + 1608672140, + 3468999018, + 1715268472, + 1775704350, + 2095354732, + 1816748505, + 630996696, + 3054793907, + 1376617684, + 2095298720, + 62048030, + 4177859766, + 1899791136, + 2051127621, + 196664096, + 3319551239, + 1662947943, + 258417225, + 4038741950, + 400172047, + 2774932803, + 1935359644, + 2920157004, + 70999116, + 2298111745, + 3155118629, + 954252591, + 3035077840, + 3365721730, + 3259958182, + 2966262046, + 3966771287, + 1664706857, + 1549210707, + 644267327, + 3625779575, + 35847691, + 4268504338, + 104221165, + 3793167289, + 1434899001, + 516380518, + 305714125, + 3997280967, + 3452590542, + 3101574501, + 2438551534, + 1487302260, + 699799524, + 1896565321, + 179635869, + 3577458627, + 2390294651, + 3440160896, + 1366242928, + 2623409152, + 3227684413, + 1771283579, + 1860070108, + 2525129864, + 639424412, + 3866671112, + 2583778912, + 3087668664, + 2565874715, + 4124409137, + 1716978928, + 2495926582, + 105275754, + 504654714, + 439824806, + 139092718, + 235256401, + 2052436662, + 3482201335, + 1668293439, + 3987504941, + 1030894756, + 1802687410, + 3849872306, + 1729194751, + 628020551, + 2758654744, + 3275824514, + 3396547984, + 2947249082, + 2719480175, + 2248726512, + 1528548733, + 981143734, + 3855057208, + 1889465921, + 717326424, + 3888793784, + 273177519, + 3318606717, + 2015221742, + 2498667698, + 1776840459, + 1340254574, + 2212922953, + 2588648618, + 1204650422, + 2486401588, + 1128711606, + 4071028195, + 3938015337, + 626760926, + 3422307161, + 3731948034, + 1910812643, + 829867537, + 600054897, + 846276067, + 1319580669, + 3615631593, + 747621539, + 1554392620, + 3653393404, + 3912733739, + 2977154303, + 1155671362, + 2833202039, + 2279065852, + 3013201083, + 3987119844, + 3274777164, + 1140056491, + 1816979270, + 2179608264, + 3678482641, + 3814469882, + 2355321349, + 2570806568, + 3322662929, + 1190205366, + 1292030150, + 445850460, + 1007609938, + 3203863267, + 4141964052, + 1966808952, + 1308343639, + 2379169556, + 392323325, + 2481626447, + 382317520, + 4182472484, + 2023490882, + 3775512433, + 1114127645, + 732212353, + 329275296, + 3657781914, + 2294505523, + 1622386862, + 405801504, + 3621219582, + 3355243220, + 1442897733, + 3394995933, + 770248982, + 1364846309, + 3024153508, + 3538800296, + 2652257210, + 210120814, + 1301948456, + 1247565194, + 2146699552, + 1320374747, + 897290956, + 3862254402, + 799831514, + 1914207686, + 3377904074, + 2607906779, + 4027092094, + 2763947902, + 1014475090, + 896406142, + 3514973274, + 3879235491, + 4012732357, + 3867478648, + 1414327534, + 2649597369, + 3662261765, + 2995439723, + 1996639143, + 4039511578, + 2765791850, + 3303435928, + 637778770, + 3898457532, + 518685469, + 986059285, + 1574901180, + 3032251472, + 245461152, + 3766190817, + 1353320356, + 1935265353, + 1973837543, + 3278804152, + 3214093049, + 2957835849, + 4091085412, + 255294461, + 1414770257, + 2217535651, + 1675408608, + 3831909459, + 3020670293, + 1716921447, + 3386562423, + 1988740673, + 261017061, + 2290787173, + 1983824509, + 3086118463, + 1254847698, + 4067049756, + 249698925, + 1498678668, + 784028945, + 439729327, + 4110883659, + 1613350294, + 4105915048, + 1813130890, + 679455672, + 3976052199, + 3001295100, + 2104820791, + 1162900241, + 1648044795, + 2514587003, + 2421180327, + 2283890084, + 1404122291, + 4282148353, + 1644006856, + 3614130090, + 423899502, + 2013836853, + 3009479094, + 363710018, + 1155199644, + 628882044, + 2369525976, + 3548378291, + 203495038, + 1558133755, + 2037293560, + 1180976695, + 2702892550, + 3361665033, + 3573942797, + 3246684700, + 4184909529, + 3113930097, + 3314026953, + 3543006383, + 1777684129, + 738987135, + 2408860120, + 3375406352, + 3410541010, + 2483402029, + 874265845, + 2728628655, + 2465254087, + 2763032499, + 1773018277, + 3091717447, + 3056048261, + 1627578063, + 396052709, + 799842788, + 4040195010, + 642912987, + 3176656976, + 1805691900, + 3531813876, + 4064329377, + 517657685, + 3683563198, + 2227722455, + 1853029411, + 3503447177, + 3163192579, + 1056555873, + 2381084898, + 781559930, + 2363496964, + 254498858, + 2476145011, + 4269432702, + 3103258864, + 2392439970, + 268597184, + 2516299829, + 1081588250, + 2566867051, + 1638912980, + 3024289361, + 3157978367, + 834525239, + 3419277855, + 3891176424, + 2309185042, + 3221257532, + 3004541492, + 1137530167, + 571926164, + 210118804, + 4293182733, + 2869369615, + 2784618711, + 3305896418, + 1489585285, + 3381035791, + 3790732453, + 4028183673, + 2653638877, + 2736737496, + 3797140749, + 962515952, + 2258143939, + 3564546745, + 1895130685, + 2228287067, + 2312197179, + 2626222586, + 2181090467, + 3689166059, + 3520225258, + 136758821, + 1431487264, + 2930236352, + 154402183, + 2738491176, + 344509447, + 1896458563, + 3779882758, + 2133529153, + 4286044837, + 2605636908, + 820659421, + 1811842380, + 3962094203, + 3687915725, + 2155975204, + 3928836465, + 3691703484, + 1904018067, + 1881354507, + 872419897, + 4278198967, + 2885521375, + 1376745644, + 3236945500, + 1671716578, + 370644230, + 101468213, + 284769845, + 634980179, + 1605335079, + 1282158086, + 2660914309, + 854331859, + 1000704825, + 699019275, + 2780029826, + 1260383123, + 2779903100, + 582743027, + 3718843428, + 1408230665, + 607437045, + 2934336625, + 115661440, + 4263553504, + 4276473889, + 370169645, + 2853087279, + 1027669514, + 1720229658, + 3409791618, + 285337640, + 1345790346, + 2943146913, + 2685478280, + 1487297211, + 2969341527, + 2458040056, + 214515308, + 3687721365, + 3667625811, + 1898369902, + 4230564065, + 223641391, + 3069294888, + 4116721754, + 1141151693, + 3584477412, + 384051122, + 3317163361, + 4072972608, + 1029203332, + 3860139765, + 3715612346, + 2510677815, + 612600386, + 3268435666, + 3097314045, + 370003995, + 1322283467, + 2435703924, + 1160258396, + 3171459393, + 2335321812, + 2673338575, + 4025907049, + 3884845380, + 3818902821, + 3795803746, + 147850781, + 3685404652, + 3974796711, + 356681341, + 1011203652, + 1562517675, + 2845328796, + 1736512821, + 988217836, + 181135306, + 3685976776, + 1256118881, + 3209965382, + 3363408560, + 466254918, + 1238802260, + 2587721293, + 292142954, + 3507044472, + 3171441275, + 1280320593, + 1455646407, + 3644414763, + 1408953435, + 4061979931, + 3356361782, + 3625119726, + 2573263907, + 3703724993, + 200726756, + 3890873677, + 1126147796, + 3196707360, + 730509394, + 789995795, + 4048947872, + 2517783772, + 4044958699, + 1400738798, + 2018024119, + 1708076552, + 4025504600, + 3137500897, + 1286235926, + 1493096642, + 2608737939, + 3110030890, + 2642728182, + 1595719543, + 364408439, + 2079077365, + 4193186130, + 2554702561, + 2507932143, + 1215331901, + 2013306107, + 1017301148, + 922684791, + 1736386310, + 1626170381, + 3727348039, + 2689656388, + 2440555730, + ]; + + static const List _envieddataprivateKeyFCM = [ + 1133569810, + 2631336948, + 782153715, + 3201336846, + 631838071, + 2983168385, + 2488817491, + 138437731, + 924063126, + 3540607710, + 2070108316, + 2167491417, + 434036357, + 1432021133, + 4144709133, + 94957788, + 679660080, + 3468279940, + 307374452, + 1973917687, + 1347149335, + 2963091355, + 2396741002, + 2817505523, + 4202675673, + 1406883620, + 2190498162, + 3329056506, + 1323004681, + 4248062004, + 3737353462, + 1429733899, + 3668953688, + 689400850, + 3502322790, + 2315400426, + 124038186, + 4194882164, + 1999808353, + 1707724452, + 3439846268, + 2075405475, + 2785861775, + 3569473941, + 719832914, + 2072039196, + 2590617095, + 2107349883, + 3957510600, + 1162496646, + 2962114534, + 1300460594, + 240394502, + 3044154853, + 1183866929, + 21608487, + 3414611962, + 907026124, + 2466175621, + 4104338953, + 56647863, + 3490584325, + 585253350, + 1773541625, + 3763318214, + 1034154516, + 916870891, + 3104025919, + 3187985771, + 3347377431, + 381142515, + 1606802566, + 3262608758, + 437353550, + 1578303957, + 149421221, + 3608042008, + 3361863092, + 1837541367, + 3716700502, + 3596562165, + 3885057017, + 696365608, + 888073177, + 170835358, + 2643784898, + 3048307270, + 2677804251, + 2293018853, + 205838075, + 1819491665, + 1388816380, + 690842261, + 696985818, + 749153644, + 941841851, + 3662725259, + 385753419, + 1568502917, + 801506114, + 755000676, + 1272570999, + 3901600789, + 1238393649, + 3281418660, + 402614875, + 2874449491, + 1720402657, + 644537099, + 3787686183, + 400335176, + 4149775923, + 651382800, + 1659014868, + 3314643287, + 4038224803, + 86756865, + 2724725866, + 2307744041, + 1006463768, + 2647955090, + 797104786, + 2977598688, + 2606919321, + 895350927, + 1137660647, + 3030761014, + 1376428472, + 4261854640, + 307433794, + 4046778441, + 3221461895, + 2437346850, + 853871820, + 3451972109, + 2428265412, + 3139192820, + 699417211, + 2546447426, + 3646938958, + 321779081, + 4132651781, + 3150897416, + 3322784975, + 3321636276, + 3809206677, + 887152317, + 2725284761, + 3118585803, + 2302426262, + 2923495272, + 808817031, + 2122448795, + 4288522686, + 694121379, + 666217583, + 3456731221, + 2945634714, + 4286515382, + 2584304524, + 196624685, + 2923573990, + 495440887, + 4230033671, + 2919325945, + 1637322563, + 2441024489, + 2066037161, + 1429637865, + 3454747728, + 2992198904, + 2316066223, + 2059728774, + 1641836365, + 3372473648, + 2281518416, + 2027233646, + 2084138389, + 3906451272, + 1822877389, + 1411675039, + 892586370, + 2691798182, + 4171111330, + 1618388932, + 3628305864, + 2112352756, + 2769352409, + 3328390320, + 3547862842, + 1951111225, + 1752301407, + 3950840431, + 3733917062, + 3483625966, + 3961284483, + 1053919469, + 2364245221, + 1762251156, + 2577990403, + 3062140801, + 76894045, + 3323006691, + 3566856440, + 321653469, + 1222582391, + 3906125455, + 3207183462, + 3711704882, + 2803584950, + 1579690547, + 1561335925, + 248277857, + 1511629570, + 4225595872, + 2048236828, + 871098228, + 922796359, + 3165496207, + 2188132731, + 3314920462, + 3899363509, + 1939636489, + 111225736, + 577925601, + 484552355, + 1960109870, + 2716368620, + 3176433100, + 3601674781, + 373094440, + 2397954208, + 507596200, + 3453886747, + 1584313261, + 4078107902, + 3760649751, + 3169407441, + 2241899301, + 2176340613, + 2075366082, + 2166317091, + 2776336605, + 2892757845, + 4053008140, + 606525853, + 3377027437, + 2926964647, + 3454311709, + 3183173766, + 2486185870, + 4254240170, + 657283466, + 1197887077, + 2566237475, + 3361480783, + 3303665532, + 2777540142, + 3481688605, + 530972415, + 1141952332, + 2353730658, + 1567130518, + 1774672833, + 2759099065, + 1145398558, + 1784341958, + 2877327820, + 2283701833, + 2329358501, + 3749851948, + 889304650, + 1407703894, + 9934784, + 1632474019, + 1128381775, + 4157149202, + 901339251, + 1997833079, + 3348345941, + 918882217, + 389368326, + 1785766102, + 1011183375, + 4172425704, + 2970446321, + 3427424647, + 4065890971, + 279599515, + 3540241559, + 2107656992, + 374833042, + 2808540504, + 1133677531, + 3450784510, + 505192855, + 2761197440, + 1878885847, + 2093190460, + 365593210, + 1267461995, + 263440700, + 242490955, + 3436981650, + 70931099, + 4263682782, + 4108319881, + 3082011932, + 3638304875, + 547834938, + 1389281392, + 1165726860, + 3532323550, + 3738090862, + 2792799805, + 895056284, + 1766733271, + 2756468608, + 549128057, + 3658594384, + 3100293500, + 2189838869, + 4240567904, + 1320408426, + 1775420409, + 3106963467, + 2404621250, + 551952367, + 3979317805, + 1851160476, + 3178850427, + 2371135944, + 199118472, + 744433808, + 4252019127, + 827710637, + 3649106065, + 3901895924, + 876059937, + 117735243, + 444923312, + 3958565072, + 3825503705, + 1196211466, + 3964911091, + 1134815494, + 2104701220, + 2438251572, + 2077693643, + 1504095763, + 2972422771, + 1154532482, + 4124853877, + 2246291060, + 2099240332, + 2876187345, + 2798467691, + 1421449937, + 597729394, + 457387478, + 1499153104, + 1356594355, + 342601813, + 2132311138, + 791338786, + 883040055, + 11072812, + 1547956770, + 1127479366, + 1382813792, + 3083564699, + 57757915, + 1401265862, + 2223697341, + 4278517471, + 1442793518, + 1895302639, + 4037320135, + 1850828614, + 2690015052, + 1241674629, + 3116064160, + 845564209, + 25946313, + 4215149170, + 495054992, + 1672810753, + 1204097744, + 3789428306, + 3105344417, + 694575165, + 3452289062, + 1029896578, + 3360023852, + 164477726, + 4194287905, + 3710042678, + 3439994531, + 3530844798, + 3464877857, + 250768659, + 2766091977, + 1692725414, + 3990760155, + 2500143441, + 2288225381, + 1120586688, + 563203281, + 3827538137, + 960944870, + 187284541, + 1096897133, + 1599201624, + 366218149, + 327599676, + 552809359, + 922286098, + 1335459442, + 2540585035, + 583505968, + 2326404687, + 1027286796, + 3070665915, + 4015090928, + 3982905340, + 410023786, + 3395195196, + 1554581956, + 697806517, + 2638679124, + 4147142303, + 1346305603, + 3207189662, + 2321219233, + 3015285102, + 3277202543, + 1000205101, + 992239207, + 3971911012, + 266289826, + 3185455462, + 4205129452, + 2741042765, + 2288302162, + 2924512811, + 3159675399, + 2649659313, + 1431390226, + 3351345753, + 1985322976, + 2504947998, + 471514834, + 3592582267, + 590265388, + 1231874842, + 1822441474, + 3449101662, + 2881651790, + 1492681319, + 2787205950, + 3976134239, + 3773098637, + 2394435662, + 1109809040, + 4231449887, + 864895734, + 4110130352, + 3618915364, + 196919624, + 346361955, + 3415490775, + 405335562, + 2276418570, + 1980412754, + 2625528837, + 2125893447, + 3628088871, + 3876730342, + 4116584183, + 320861185, + 2570392205, + 2756479823, + 4260304563, + 3722879962, + 3046178137, + 1720565098, + 2770560277, + 912014283, + 1154114755, + 2398392593, + 1783089108, + 1546460786, + 204668200, + 3121352718, + 3639528929, + 2152218318, + 1312788752, + 568247726, + 124319110, + 493021388, + 1547027038, + 2251559592, + 133996719, + 2144224536, + 773611901, + 3955830941, + 410084606, + 4066825113, + 2042725943, + 1466951870, + 1930121911, + 3751731496, + 361596267, + 2154918635, + 1958735079, + 4253100758, + 1798276982, + 796014148, + 3181768228, + 2472538735, + 3746473428, + 3164354638, + 3774315684, + 2820210983, + 268279330, + 2116129475, + 101727991, + 3223098445, + 4163090862, + 1977979199, + 2069783554, + 3630469093, + 2808477120, + 2394277801, + 4273755972, + 3873756964, + 667433884, + 3543325428, + 948678810, + 3523633257, + 1065600508, + 3800848725, + 1630971403, + 2177742422, + 2169259592, + 2527663044, + 4265041250, + 1500582651, + 3783705635, + 1219124367, + 3964508274, + 1843670654, + 3654084854, + 171050297, + 664491172, + 4182800651, + 194504457, + 2724588059, + 803791158, + 2335734531, + 932536911, + 351277930, + 1745733643, + 808433816, + 3277785618, + 2268330899, + 4176006850, + 2783846935, + 2846749143, + 341760272, + 850653006, + 610136509, + 2125879879, + 1340989342, + 287096537, + 1590747331, + 2427885510, + 751554276, + 2647150171, + 4237391419, + 3763136346, + 3877297962, + 3014249201, + 3382390003, + 1631535657, + 3892604475, + 113578915, + 3571572766, + 3302253849, + 3064374651, + 3206349889, + 2304578624, + 1103680128, + 4182756681, + 353717569, + 946679631, + 112641202, + 2779609013, + 1652604456, + 4080136355, + 3861737453, + 3360215346, + 2959948905, + 3936470587, + 496941470, + 3375407560, + 3321262606, + 2335640196, + 3420603701, + 2677533993, + 3790770573, + 2069993378, + 2151268985, + 2625185401, + 1011602153, + 3094312228, + 2220111813, + 2329340819, + 3911596598, + 3635139691, + 4146685925, + 3763946389, + 3210305485, + 3929977707, + 4213604703, + 1070862664, + 3587716477, + 2324660616, + 1605218958, + 2500306035, + 3259861355, + 500582436, + 645426566, + 1542921921, + 1183594999, + 1566358704, + 1552607459, + 2615143547, + 843226843, + 571961840, + 2857771584, + 465828866, + 601724475, + 3630549876, + 4084906907, + 2289304457, + 2558936285, + 3620204538, + 800809737, + 3744817645, + 2527129818, + 478466236, + 2168202296, + 2362423972, + 4052881602, + 3740065955, + 230857211, + 2241446575, + 1087691854, + 3587787536, + 2274741322, + 3417159560, + 4195474158, + 3893812599, + 3619955180, + 1578592658, + 2342460637, + 1683392027, + 2424908574, + 1447503852, + 1685376698, + 3466313005, + 1339474889, + 831909323, + 4010134235, + 4003025756, + 3647011186, + 3782079043, + 1160932306, + 3494656035, + 1611197715, + 3567142399, + 2890077475, + 1602408813, + 472657405, + 494625447, + 106508994, + 3347756193, + 3240199870, + 1273640382, + 26328612, + 2157031319, + 694426956, + 2082449907, + 774225508, + 688955095, + 4171164634, + 3058172858, + 61808708, + 1890125188, + 3204378508, + 4036249455, + 1905152152, + 759081694, + 2643053191, + 2246357160, + 3577076613, + 3576965704, + 750521574, + 1446725640, + 883595370, + 1475257078, + 2754937020, + 2532625957, + 3976380301, + 4115602225, + 724210016, + 2743069931, + 2983501977, + 1884538028, + 3328099170, + 1306827079, + 1015926215, + 114388424, + 4148184684, + 3881534088, + 2154958149, + 2450264065, + 3423207481, + 3639858273, + 3685208508, + 2223382173, + 4143454606, + 3912117622, + 467726970, + 3747956705, + 1746667801, + 3642126670, + 2068865364, + 537066608, + 2219668459, + 3421188390, + 648060462, + 3174434439, + 1127238608, + 1260696503, + 1992801667, + 34669631, + 17785994, + 4172341196, + 2469189054, + 457767139, + 3315289112, + 628490136, + 1850498990, + 4132167805, + 1156111015, + 2607662061, + 3405842782, + 2122074520, + 2366415335, + 1017403959, + 703133758, + 1760782611, + 3950005638, + 2807076778, + 1892815587, + 4156622436, + 2949253414, + 1178452253, + 2923126924, + 2587988410, + 3219952958, + 3779832174, + 14674843, + 1178460563, + 430504745, + 1826964582, + 1641653247, + 1317393533, + 4018237358, + 2188499822, + 777463525, + 3341084563, + 1785546, + 1713958898, + 614600891, + 3882370790, + 3128770701, + 1747566567, + 3560074127, + 1039036586, + 812324347, + 1619256297, + 2502372887, + 3670497706, + 3042560223, + 1123065546, + 2583224663, + 2948298407, + 3021771238, + 1862104345, + 3597645982, + 3599995263, + 4030691158, + 2123585365, + 1992908288, + 733281351, + 3813398073, + 1870147524, + 3504460367, + 1736758812, + 3156067720, + 2750377620, + 2363933980, + 3310351260, + 3940047893, + 1578662409, + 294427372, + 806089271, + 3920958878, + 3896806981, + 1772829820, + 2344488989, + 1265846332, + 475622043, + 662357186, + 165396410, + 2749199230, + 2183375655, + 3937428224, + 803615637, + 509709712, + 3873466974, + 2172599828, + 527606613, + 40303534, + 2699653373, + 38353592, + 1822726429, + 3768380582, + 1927148869, + 1213421100, + 3186182532, + 1913248628, + 511826850, + 3822177488, + 2419777463, + 1875814864, + 817855949, + 63454370, + 3947190847, + 2325675629, + 3285547227, + 3102442945, + 1841049121, + 1444548056, + 419067902, + 1590144736, + 265849894, + 1789005243, + 1424217140, + 1030839952, + 4257727488, + 3034123831, + 1007958800, + 2610961502, + 2970216183, + 3058962800, + 3615507445, + 48179678, + 3002918597, + 3441672846, + 566382759, + 110545859, + 812351046, + 1870470469, + 1245308926, + 323897118, + 2936813874, + 2674566500, + 219377802, + 1086447090, + 1786499125, + 144398431, + 654537864, + 2395886453, + 1593335314, + 2828518456, + 3459698478, + 1787827114, + 3810757686, + 2425988611, + 4178554808, + 1418362942, + 2480692317, + 2288666440, + 3459457205, + 1653714553, + 3731039596, + 865008229, + 2292709249, + 3261752359, + 2470550915, + 1107107355, + 3714430281, + 1121490540, + 293329563, + 2146244525, + 3054248315, + 2798515501, + 2715428994, + 4123553851, + 2453465789, + 4180585134, + 311331998, + 3282685518, + 4196003076, + 143646639, + 2050741487, + 1130798347, + 2188270898, + 4182413915, + 3889327380, + 717038134, + 1009153000, + 1280770362, + 4264392325, + 605672602, + 2896879418, + 957372330, + 1032615443, + 2621739326, + 199467395, + 4230448698, + 3549149493, + 521016121, + 2846462559, + 274724362, + 2227908916, + 2967834387, + 3726412279, + 579648177, + 1013096830, + 3301766775, + 2500389183, + 4006393523, + 4012932430, + 698395729, + 2204302980, + 3219551057, + 573519636, + 1909653791, + 4023286769, + 123080677, + 3736361345, + 3419621755, + 2826723113, + 814723968, + 1073700150, + 2563994012, + 1474276091, + 3921991859, + 122646182, + 2077323111, + 1103992836, + 2139345441, + 3853409049, + 2154582008, + 1243065291, + 500043632, + 1292680869, + 872953705, + 516336124, + 2294151897, + 4067812335, + 1088621384, + 121581282, + 1270078256, + 995339090, + 2544655137, + 4275700318, + 2370560145, + 3170631154, + 4147771473, + 1641718072, + 395411217, + 3433033467, + 1661882257, + 3987552305, + 3985644838, + 2936838991, + 438443950, + 697124611, + 2325803035, + 2273501928, + 533683729, + 13177371, + 747666718, + 3544100262, + 3873810886, + 3732873673, + 1481766331, + 1348019729, + 38996361, + 1620496471, + 2700207084, + 1957448080, + 3321330333, + 3403978147, + 2542259222, + 1244737766, + 106824772, + 2889180242, + 2782979572, + 2208136988, + 1135795625, + 3243972655, + 1477336913, + 275111457, + 1786613441, + 1659228560, + 2054362186, + 196128711, + 816620407, + 4083877371, + 3716624405, + 1336671594, + 2764677319, + 801329848, + 3366317834, + 1011799900, + 3574426088, + 252138839, + 2894646252, + 2921304573, + 2462859304, + 229342266, + 3046504243, + 1508719293, + 665505246, + 2469490042, + 263479099, + 3365977541, + 4261148468, + 3654189976, + 3936839291, + 3988208825, + 3988430557, + 1451897464, + 3965115052, + 3686032884, + 3415468004, + 4020497124, + 1210122896, + 2111071228, + 2570070469, + 3947895940, + 1503190051, + 3504941117, + 2530459359, + 1800982976, + 924077878, + 41849062, + 1222720650, + 3158856288, + 1788061406, + 3691114073, + 1027122661, + 3321318213, + 3555481230, + 3531688820, + 214117260, + 1346508165, + 662442340, + 3812607839, + 2052640705, + 1608986362, + 3290855499, + 1643300874, + 1991073139, + 3768055525, + 868909665, + 1931155253, + 2551164447, + 683039992, + 2130756571, + 872270978, + 742932607, + 3602591891, + 3939291157, + 3967503640, + 88820425, + 4228851002, + 3346700864, + 718168753, + 1679949838, + 1011812939, + 4131325949, + 2366209691, + 1256096471, + 4274545534, + 88884781, + 857900341, + 614948097, + 1354041485, + 3050802749, + 446338946, + 1992706255, + 1701237600, + 1504018549, + 1341283033, + 190528449, + 4201618823, + 427878072, + 3521422895, + 3171400283, + 2453520284, + 2715249950, + 2878018015, + 407841154, + 1076646439, + 2902096326, + 1119626361, + 2644871576, + 3293596858, + 1974815928, + 1844661750, + 3463913129, + 2148341342, + 1291573243, + 2169246810, + 4121523483, + 1001828258, + 1201094285, + 2768247741, + 1187741668, + 2584658467, + 3298403928, + 19508794, + 2376541132, + 1834240070, + 2795223531, + 1569676009, + 2083566117, + 197357026, + 2187510552, + 735841364, + 1676166312, + 1470742315, + 1775423350, + 313697723, + 4150418093, + 1340236335, + 244289584, + 2419636137, + 1468768510, + 3948651668, + 4190434782, + 4240184620, + 1648085427, + 236983377, + 890850103, + 4132623272, + 1702226328, + 1275783657, + 1282323970, + 1068123219, + 2507371645, + 3567002166, + 2326254713, + 903986722, + 4275863595, + 681934646, + 3449788083, + 3658543764, + 3971267096, + 906890651, + 3220537887, + 3721238425, + 3424824919, + 4071298393, + 2350348033, + 851103835, + 308738784, + 3633342279, + 3294051464, + 60850237, + 4205293718, + 112318384, + 2392677891, + 4245426611, + 2813800938, + 544585705, + 862804086, + 635702611, + 1037318247, + 3062389067, + 1788723107, + 909046190, + 2633211481, + 1512124210, + 219688775, + 208669567, + 2341111326, + 1558771297, + 3962134609, + 3793701941, + 3678482598, + 3083064385, + 2224089049, + 121834348, + 3974742960, + 3285910891, + 2301078529, + 3991408934, + 1754131199, + 1115088030, + 742363340, + 1940874870, + 3815841729, + 3751295025, + 2438487791, + 505244872, + 2737497734, + 3686088533, + 3642212863, + 745389967, + 1171532550, + 1037089173, + 1222170147, + 3339498780, + 2420183845, + 1812185882, + 1685491860, + 2054045371, + 2916731859, + 625306391, + 2885097536, + 1531527755, + 881885849, + 4123937969, + 1223959847, + 2997456354, + 986868947, + 3499204336, + 2002259460, + 702456427, + 2180569440, + 573224210, + 3359535553, + 2265103812, + 4007182161, + 1269646680, + 3540842839, + 796051848, + 938241882, + 2538303685, + 2742240808, + 143742684, + 1113882324, + 2339965914, + 3861371091, + 1940827720, + 373043434, + 290172183, + 3309138211, + 2228544253, + 2697368504, + 314268409, + 3275936717, + 1292638603, + 3619702424, + 4134658461, + 460321774, + 3287938469, + 1056154866, + 176670850, + 21652801, + 1897619182, + 1048386785, + 3446694205, + 759789706, + 114313839, + 2656037303, + 3619510848, + 4025392301, + 2133557464, + 701572241, + 1063247283, + 2433408287, + 1329294123, + 3455774261, + 1060648990, + 372371830, + 54152053, + 4157273412, + 1028934374, + 1059536047, + 3705266340, + 2249471172, + 3723179498, + 1685144370, + 3532165296, + 426031379, + 3992264848, + 3558187874, + 789327393, + 113797115, + 3197466265, + 1846132308, + 3662284834, + 373999393, + 3527638544, + 3168581066, + 1873953485, + 1547610606, + 4188855686, + 3909799060, + 2439098516, + 1366914413, + 2552185747, + 3438947887, + 164270951, + 367726843, + 464460365, + 3684470274, + 2811443509, + 2800117652, + 577716900, + 2360729125, + 3199339203, + 2042468020, + 322152071, + 350449026, + 1338453488, + 2169901536, + 1137834913, + 1224674594, + 819627367, + 866288223, + 3684373287, + 2802084500, + 883000071, + 2124730005, + 1794186521, + 1843025624, + 1107572762, + 1553821109, + 2255976928, + 2971962493, + 1294016394, + 2779781930, + 1121528516, + 2599103154, + 52550939, + 1715784095, + 172080229, + 2909340023, + 2925801104, + 2758545802, + 2591511640, + 2537648991, + 3218650315, + 3620978015, + 2091529948, + 1908561691, + 4140639213, + 1468559118, + 3031446434, + 1538303433, + 3024702023, + 931817456, + 3315385244, + 530706340, + 776942735, + 1066889660, + 860858398, + 1380983258, + 3488107254, + 2352861366, + 768524865, + 3324839876, + 2985439364, + 2632570311, + 1269085635, + 591371761, + 3614267995, + 3634334398, + 494364876, + 2201954801, + 1822851563, + 912761258, + 3560975524, + 2823473944, + 2726516653, + 3900329480, + 3046312346, + 3202027455, + 3749404319, + 4111460447, + 3394432067, + 845091851, + 3547437620, + 2438586236, + 891753776, + 2658014652, + 3263078955, + 3181133040, + 498702842, + 1919031583, + 1885259485, + 1033195211, + 2152110158, + 2916981319, + 3597923226, + 963475388, + 2390133552, + 1279019949, + 1532292872, + 3533828808, + 3410363134, + 4086929604, + 2384284137, + 736527574, + 921831322, + 978761510, + 3581033599, + 184754679, + 1142912287, + 3579159444, + 3754076798, + 3195299498, + 3924528503, + 3367661132, + 2664527388, + 3060833118, + 87824852, + 3341591982, + 1787431422, + 2190200189, + 724746657, + 2362957481, + 1893647787, + 631707083, + 3600263631, + 3112000291, + 1195347251, + 1980784313, + 1587897131, + 1505502575, + 730808447, + 2077493753, + 1766424589, + 4169095382, + 3023491880, + 1907255180, + 1400246919, + 3439802039, + 2353421484, + 2598206410, + 241608112, + 2800597464, + 1865113190, + 2692612807, + 655943539, + 3036801653, + 4273840934, + 1531071836, + 1388648504, + 4046738659, + 2566906137, + 3190630241, + 1259094505, + 2588960622, + 881378109, + 4029007789, + 1036716322, + 1440834140, + 1045545482, + 1611580537, + 3075000012, + 3160852091, + 125510553, + 1948935661, + 2528899056, + 1349973885, + 790409740, + 933146257, + 3340496167, + 2161701913, + 2203562833, + 127499997, + 2241686850, + 301650274, + 1189877278, + 2069676804, + 2149373712, + 3925298050, + 2363633783, + 316935596, + 222701686, + 1656250453, + 2585556113, + 2344566774, + 1641407783, + 2733425137, + 3458390692, + 3862744868, + 2081559814, + 1101703145, + 4213220732, + 2871617353, + 3821441284, + 1284486082, + 1295341251, + 231768815, + 3688216587, + 434412918, + 2085597609, + 1178947359, + 1499668986, + 332651835, + 848688224, + 783466121, + 2232129524, + 1984278527, + 54161279, + 480180313, + 1460924584, + 2764823460, + 1193698271, + 130579892, + 4246187421, + 2272443660, + 3890368592, + 3817991842, + 1891017699, + 3116376337, + 1838641006, + 202212708, + 548912086, + 1276402467, + 2627209063, + 3559295002, + 136668580, + 1463185340, + 3996451142, + 1195997589, + 3703309546, + 966209579, + 1495349328, + 3818068448, + 998187110, + 465377317, + 2740367678, + 393280342, + 1284923500, + 1224680970, + 2296772643, + 792366508, + 1312886999, + 563043397, + 3204722388, + 2362148129, + 3991589429, + 3812760429, + 2376309774, + 3955295822, + 3155646085, + 718545332, + 426415853, + 160354087, + 658523882, + 2523118731, + 1301823541, + 493847625, + 4056626119, + 2397998886, + 2294563568, + 1640569944, + 1159193321, + 1855737904, + 2179119691, + 2264199463, + 1222836898, + 3897707559, + 3276298930, + 941543833, + 3250950773, + 4256182925, + 3233880416, + 1087109968, + 952749286, + 404554758, + 1410748193, + 2627152250, + 979574373, + 2707691339, + 1014678447, + 2734357605, + 1706931772, + 1748581040, + 448294925, + 592225379, + 4161750627, + 3212838882, + 412410468, + 4235477551, + 1807215035, + 542939420, + 1486293258, + 2157680940, + 2605658897, + 3385782162, + 1415388253, + 1442117385, + 222759534, + 1396810746, + 3570065478, + 2736080078, + 2834358400, + 766728704, + 825544741, + 2946948174, + 2901144875, + 3302059473, + 1587854945, + 924399260, + 4038690247, + 3466315969, + 1867950179, + 3055097185, + 1209192020, + 561463698, + 1873204694, + 2398003028, + 1880272834, + 3725511642, + 1620394386, + 1896123040, + 707343795, + 3089248063, + 3628971822, + 2382385947, + 237300502, + 3375790143, + 3131500814, + 3130912940, + 810002204, + 2443950519, + 3073421036, + 2776473768, + 1723254820, + 480346159, + 2162458220, + 2901340432, + 1459347108, + 4157536165, + 1658112904, + 2653696906, + 3483498757, + 2172581712, + 2945148806, + 369575851, + 2708837017, + 3017439659, + 572356605, + 1687730653, + 3303917109, + 4185775943, + 1542629699, + 1823588861, + 758034556, + 207137717, + 4118907156, + 3551679965, + 579289490, + 130012884, + 3056847755, + 3298176206, + 1631448691, + 3883850548, + 1781666855, + 226013435, + 1191195284, + 162910909, + 2421225558, + 3472833198, + 3105014703, + 2998279186, + 989511739, + 3122448504, + 4031112897, + 798915782, + 3124120612, + 622880434, + 1550632402, + 3582513015, + 1897853778, + 3955800001, + 2843608758, + 1783793648, + 1234540483, + 2841204289, + 3078276811, + 1897041667, + 2644748191, + 2075116399, + 3566638118, + 2545072242, + 2705581107, + 2034593594, + 1102733458, + 563102160, + 3562036038, + 1559012378, + 3081027624, + 4277200811, + 29819624, + 952516720, + 288733188, + 3944002280, + 2580949355, + 2180907448, + 701845603, + 147266524, + 370348008, + 3271320890, + 2691393009, + 2383884999, + 3524671179, + 3939649284, + 1745553778, + 3201374283, + 1372111019, + 3219709954, + 848485081, + 667408054, + 3285357028, + 1335687583, + 3644214140, + 2613006844, + 4205559322, + 1312637533, + 1614630429, + 1683627889, + 1208640864, + 2834070995, + 3592578844, + 2358819465, + 1995443398, + 3413826769, + 1776126298, + 1410383645, + 2955631068, + 2993512768, + 3236365752, + 597697850, + 3130855667, + 872085307, + 3088552158, + 3059305728, + 2016688594, + 769456062, + 1704353403, + 2894459022, + 3397853480, + 3442669413, + 2849401449, + 2439338225, + 1765298087, + 3770362637, + 2012197480, + 1236698002, + 2547133981, + 3583709582, + 1222346033, + 66929813, + 1810978782, + 140921718, + 147006733, + 716546109, + 272190672, + 4270198935, + 4112878356, + 3459132487, + 2205334679, + 2655240589, + 3460427483, + 4004166046, + 2733896896, + 2662276672, + 1235355460, + 2080490490, + 3835662375, + 2012775662, + 3831435531, + 896042556, + 847436078, + 2690167548, + 2480708618, + 34486478, + 780307438, + 1206065597, + 3684584372, + 109239588, + 1177388702, + 186055243, + 542130697, + 431317368, + 4172245930, + 659717801, + 3115120181, + 3389111917, + 612902400, + 3093454605, + 994194783, + 3302496429, + 2727804282, + 3326713788, + 2909645217, + 4081309189, + 3915134273, + 1723403965, + 3538120244, + 3346690734, + 173973565, + 3745427359, + 3605615994, + 792777340, + 3898488212, + 2851691613, + 1310137864, + 3972391875, + 2800498965, + 2126178186, + 1804903633, + 1573085172, + 3765347540, + 1947401562, + 2004990638, + 1992294724, + 794994545, + 3989725162, + 4052205226, + 4275133463, + 999898041, + 680324841, + 653725316, + 4071639349, + 413310299, + 1532627194, + 1109186282, + 1454507986, + 1285781763, + 1986139893, + 2716119740, + 1215969667, + 4236644162, + 4222317454, + 3465516720, + 235341472, + 2665785383, + 2109288152, + 3865225429, + 3901456858, + 3743371291, + 2847911979, + 1626006535, + 2457976815, + 3706719872, + 2633385013, + 2583230327, + 4011068025, + 4054333527, + 693261486, + 2607135884, + 2466950569, + 2361552917, + 3954587268, + 761811134, + 3009769300, + 862264745, + 3029405930, + 2092574523, + 3841904849, + 3016847242, + 3730784897, + 504024595, + 2701889049, + 1117738628, + 3634064449, + 3718762927, + 1744136662, + 576863494, + 2218173873, + 1287233187, + 3397783039, + 4199567601, + 796784509, + 1140293913, + 4199890298, + 3894449063, + 1599629591, + 534382393, + 2188664199, + 1188379586, + 2149173053, + 2940426496, + 1090797566, + 659007198, + 1390171321, + 827457041, + 1830598637, + 4268312395, + 2538285212, + 3432324187, + 2356562943, + 618449365, + 59317777, + 32078910, + 1432616493, + 594046380, + 4005397788, + 406342838, + 2458307254, + 3622090071, + 567965897, + 2332609182, + 3913109946, + 4262950919, + 2223365555, + 3342426181, + 2937615906, + 2775839330, + 789924042, + 2547858296, + 4095742216, + 3553569019, + 2794397026, + 2669775846, + 3492940883, + 767973357, + 2223966883, + 1943349344, + 2397350813, + 1721534717, + 2284745964, + 3407740781, + 2117904262, + 3232034050, + 16565495, + 1931391360, + 3733107842, + 4226045949, + 4041262579, + 808886571, + 866728068, + 796865648, + 516939986, + 2539355262, + 3942135316, + 4094999605, + 2693105985, + 1495848441, + 2649483417, + 2160589585, + 2962242407, + 3100995834, + 3301101621, + 2928206991, + 3820618807, + 1087878038, + 2958883737, + 2394205787, + 1361447694, + 2272811100, + 485504015, + 3294843255, + 2682287431, + 678219980, + 2324071192, + 3963482109, + 3007126636, + 1199614183, + 3164538155, + 4161980987, + 2778925238, + 62318529, + 2375539054, + 1469419376, + 1541960838, + 4137797268, + 3249238197, + 361601473, + 3415181950, + 3260509788, + 22562270, + 1067118268, + 2385726257, + 1385555530, + 1365689695, + 812527635, + 2566479517, + 4102252154, + 1339610213, + 1617514414, + 803772772, + 1830781868, + 3612102712, + 3759491433, + 4122435791, + 2036628832, + 4064824538, + 1405949203, + 1439853420, + 3933859276, + 1375799746, + 1727029493, + 3830298109, + 3621177597, + 776904374, + 3379551454, + 3354675446, + 2449813947, + 899493279, + 305076564, + 2320614536, + 2993808751, + 947776875, + 2833196325, + 2012448246, + 2485862175, + 454484877, + 1523595652, + 4242593258, + 372556354, + 1103298284, + 1648831427, + 4146669347, + 3328164580, + 988612502, + 247392264, + 1866213683, + 4150811724, + 1147567895, + 1034212097, + 96214714, + 2690679554, + 3567190202, + 383537027, + 305717591, + 2233806779, + 1230730881, + 1081378737, + 3219338584, + 3352036676, + 1759154651, + 410897584, + 2266534968, + 20622694, + 966731333, + 3881030565, + 1681142483, + 4180658946, + 508491356, + 2075220083, + 862057085, + 3811486734, + 166193918, + 1952208076, + 287050898, + 4108801579, + 3634814657, + 1441695225, + 4165943170, + 985297899, + 1950886440, + 326103896, + 52511107, + 3840171112, + 1544404583, + 1483779206, + 2509714735, + 4191272841, + 196893190, + 1752138834, + 1387920625, + 3203092715, + 3305714296, + 4020283571, + 1033783085, + 873274953, + 2512442169, + 4050706108, + 50652702, + 1076717898, + 866310686, + 2170861319, + 893749800, + 2773398104, + 475134660, + 2354613509, + 2314268498, + 1221954098, + 1136667699, + 1313435548, + 887229560, + 1360766488, + 2670668096, + 2341729023, + 1931118167, + 3373726808, + 1111218187, + 3520098747, + 1688835878, + 2940851476, + 2064836287, + 3968980039, + 3836060133, + 2942296019, + 484909936, + 57105423, + 893060132, + 3098559004, + 2646028647, + 1116334271, + 1386055053, + 2672179664, + 3465976247, + 2445951289, + 3624670006, + 1585735163, + 2706230664, + 2994891068, + 3515469286, + 1276669612, + 512187154, + 3497635911, + 218620967, + 245089135, + 4175591651, + 4155493638, + 2748674032, + 1833505365, + 2012082402, + 2709336095, + 2120857657, + 137903528, + 488916124, + 2781208804, + 2409478644, + 274592315, + 199488251, + 2342346754, + 3601780192, + 1121367083, + 3549771569, + 3076621099, + 567283312, + 3387958196, + 2030339283, + 1104740149, + 612459390, + 300767243, + 3050650445, + 2239182768, + 4159761765, + 2869764157, + 634694727, + 1106345361, + 2997451119, + 1843299522, + 430102260, + 526441730, + 1780104678, + 367387529, + 478601662, + 2464829687, + 1470568684, + 59858427, + 3322874870, + 1861332380, + 4272110444, + 2809523403, + 592218878, + 245752719, + 1160055608, + 2650328653, + 4116988558, + 2035975860, + 1888310751, + 385128435, + 705277707, + 2618129743, + 1873449642, + 2767331965, + 2978152915, + 101342577, + 496164241, + 3628094899, + 3617214481, + 3276401486, + 2823749490, + 3226661007, + 2505966715, + 2070046503, + 201965634, + 992372236, + 808827712, + 3757676124, + 2428492087, + 1976499986, + 374480562, + 1080514793, + 2981903210, + 2278910388, + 2881090937, + 1587947770, + 2995760606, + 4065642844, + 1419256438, + 2879122696, + 799732699, + 2237576112, + 2722571981, + 1945610765, + 1061221696, + 3737822608, + 3766401804, + 1794205198, + 1324118794, + 1406627203, + 1246070059, + 1663528511, + 1697199427, + 1725153900, + 1644109777, + 1555884090, + 2104188396, + 1983559758, + 410269405, + 88182577, + 2259001736, + 3545896451, + 1498254313, + 158757369, + 2086803021, + 1006471632, + 1388265058, + 2489082752, + 4121338419, + 2933397258, + 1328272891, + 2440478606, + 1874429446, + 4165076143, + 3618125551, + 426429311, + 3523227097, + 2221326670, + 1036420538, + 3084730068, + 2249454606, + 3627764167, + 2906922652, + 4069859614, + 3551319928, + 2008056501, + 4263883938, + 805474483, + 414460063, + 3631091874, + 4255385897, + 3566701974, + 3056142974, + 1412413858, + 1628335284, + 2988130741, + 1804322043, + 1260149640, + 313631319, + 1940664462, + 1251074951, + 142103685, + 253384940, + 3517416389, + 3340640425, + 426880986, + 3294484335, + 635363293, + 268138849, + 1492613474, + 4200722240, + 3285686499, + 801295374, + 2024943475, + 590788678, + 4058601973, + 2569141816, + 4203227487, + 3873029963, + 2938957765, + 2653323416, + 875351891, + 1225934624, + 3959624149, + 2491580758, + 2130038205, + 4156378359, + 2785882188, + 734574419, + 1648103757, + 3995559913, + 2769178131, + 715734349, + 851342715, + 4066600521, + 2873167910, + 367737619, + 2708556266, + 3095462186, + 2954581914, + 3596166923, + 416437171, + 3630899889, + 2652177241, + 4082498041, + 2092525793, + 4097981775, + 1798161545, + 921570876, + 2954127398, + 2903455651, + 2304798239, + 1258114130, + 3817192020, + 2909483597, + 2182250255, + 1650253384, + 1959237900, + 1275159459, + 3262458111, + 1272009836, + 452811324, + 4207284298, + 4014068399, + 2116331651, + 3821668629, + 2218821094, + 1832698014, + 993485941, + 3496889636, + 2641214130, + 1989726970, + 3632025474, + 3072807154, + 871546351, + 2112654715, + 3554921834, + 3035598613, + 3203667447, + 1926566053, + 3703963219, + 1744429280, + 2894885223, + 1619369957, + 3567760659, + 66604019, + 3634627360, + 1775619354, + 669243863, + 345554459, + 3410469540, + 1155755489, + 2545915023, + 1881645052, + 3014832333, + 991894682, + 2556172243, + 3344954219, + 1093682626, + 536721455, + 412887158, + 1927162080, + 598758569, + 1718574019, + 1056186104, + 3316535817, + 3595128167, + 1130595079, + 3859435692, + 909947430, + 1719271591, + 3984005498, + 1953575959, + 3439367835, + 1566599034, + 2942150633, + 3026742323, + 2447170232, + 3686824848, + 33431557, + 725397174, + 2320663765, + 1675683651, + 2299446941, + 3516433253, + 2048939543, + 75279946, + 2544154794, + 3300029642, + 3032144243, + 2785830887, + 2021781530, + 418522190, + 2390722364, + 197680486, + 1642831997, + 1118262868, + 1200602067, + 3464739661, + 515926185, + 1725239910, + 3994742774, + 3240728600, + 3145738947, + 1844532555, + 1620264626, + 4241585699, + 1317499181, + 572389244, + 717366235, + 1894941465, + 2632625765, + 1146787696, + 2682002800, + 191358041, + 1139509005, + 1281516738, + 2167935821, + 144366517, + 3850560313, + 2955928604, + 2476854189, + 1240245623, + 1201598792, + 3315121239, + 2067079714, + 2242637086, + 2647850477, + 3701580427, + 3720909733, + 1981567187, + 2939632674, + 3130494037, + 2236040041, + 4000430650, + 1741562234, + 2404004263, + 1683735404, + 57955428, + 3003892817, + 1345733216, + 4112811741, + 3929418066, + 1702502146, + 1563779715, + 131125957, + 3456434831, + 2711946360, + 1514662008, + 593277188, + 2310980037, + 2627253234, + 2196991086, + 734788659, + 1638451151, + 2011170924, + 2234624709, + 2644747684, + 1442906543, + 3186977507, + 3041580333, + 3056574820, + 3726946928, + 777432165, + 3096870618, + 2958583174, + 3198704532, + 968654077, + 2339592888, + 631523839, + 3180919153, + 828636972, + 578695105, + 2899843141, + 3000388753, + 3269720758, + 3037015517, + 3799598414, + 3149305575, + 2046835794, + 3530890716, + 30989298, + 2186510021, + 1179096535, + 2221009982, + 338766029, + 769504603, + 3971239377, + 2393081975, + 1544565430, + 865242093, + 3393553101, + 3524464856, + 3304062974, + 1546646620, + 3279691371, + 178822578, + 4081273713, + 88444191, + 2680632909, + 1275199257, + 2416414254, + 2419761020, + 3715897230, + 132751851, + 1119529993, + 1004169874, + 495930835, + 3413915087, + 899768725, + 3645578154, + 2499698498, + 132509091, + 25904922, + 3287880660, + 788515331, + 642323673, + 3147546403, + 3581174260, + 979602099, + 1611369165, + 2161460814, + 1095063311, + 4182557998, + 958677367, + 3492305778, + 1557372251, + 2654290797, + 566444622, + 2701083822, + 2781307252, + 1273578767, + 1387975446, + 597850559, + 2236234519, + 1466168533, + 3557657361, + 2574663738, + 4108434229, + 162028021, + 2621084169, + 403011375, + 1391061643, + 973642355, + 972433280, + 3904424547, + 1591050358, + 3027468192, + 480562739, + 847391571, + 10278541, + 891807531, + 234892969, + 1990103246, + 2718435782, + 2962618312, + 2457477588, + 2173705582, + 2840711601, + 359129634, + 1862207218, + 3179005355, + 1645874306, + 679472772, + 2797899978, + 893909309, + 3298150180, + 2373596716, + 845944576, + 743626020, + 1101645480, + 4118046352, + 3085126771, + 190441990, + 1429251749, + 3631205174, + 3554760855, + 4126353549, + 2783261431, + 2895927005, + 3712938561, + 3519916684, + 3954611223, + 3504723371, + 2842753092, + 570258870, + 1757758568, + 3191712884, + 959844677, + 3815947765, + 3894098339, + 4252794303, + 568847337, + 14599453, + 3247617266, + 4256259025, + 132921313, + 611627952, + 461842544, + 721786743, + 235906119, + 3838181118, + 2693917876, + 3584801849, + 1303671253, + 2715956398, + 2478140733, + 1156883352, + 304296362, + 4257481701, + 3383377199, + 2816549488, + 3609758773, + 965337774, + 663463971, + 2101116389, + 870118473, + 3961827451, + 1411666912, + 4042208195, + 1437767680, + 3011320673, + 628908699, + 3715862090, + 787455013, + 215407986, + 2354427551, + 3501402624, + 341761723, + 2789621258, + 2795910531, + 2196948999, + 506787756, + 2444762992, + 882455964, + 1775227861, + 3463655418, + 1613425878, + 1710055679, + 2954483466, + 428135061, + 3208103369, + 356408692, + 339078074, + 2783728411, + 1608672253, + 3468998955, + 1715268362, + 1775704366, + 2095354627, + 1816748520, + 630996641, + 3054793936, + 1376617622, + 2095298775, + 62048120, + 4177859804, + 1899791126, + 2051127667, + 196664139, + 3319551346, + 1662947862, + 258417178, + 4038741968, + 400172122, + 2774932852, + 1935359703, + 2920156957, + 70999081, + 2298111845, + 3155118664, + 954252611, + 3035077780, + 3365721841, + 3259958165, + 2966262086, + 3966771258, + 1664706885, + 1549210642, + 644267342, + 3625779475, + 35847756, + 4268504441, + 104221147, + 3793167343, + 1434898955, + 516380452, + 305714056, + 3997280948, + 3452590585, + 3101574474, + 2438551436, + 1487302239, + 699799430, + 1896565295, + 179635944, + 3577458582, + 2390294577, + 3440161015, + 1366242881, + 2623409222, + 3227684446, + 1771283490, + 1860070074, + 2525129905, + 639424465, + 3866671198, + 2583778872, + 3087668725, + 2565874762, + 4124409183, + 1716978878, + 2495926535, + 105275674, + 504654616, + 439824866, + 139092645, + 235256347, + 2052436704, + 3482201219, + 1668293469, + 3987504902, + 1030894846, + 1802687424, + 3849872340, + 1729194708, + 628020486, + 2758654785, + 3275824595, + 3396548009, + 2947249119, + 2719480091, + 2248726437, + 1528548653, + 981143750, + 3855057227, + 1889465902, + 717326364, + 3888793792, + 273177536, + 3318606608, + 2015221724, + 2498667772, + 1776840513, + 1340254524, + 2212922926, + 2588648640, + 1204650460, + 2486401616, + 1128711621, + 4071028143, + 3938015234, + 626760850, + 3422307088, + 3731948114, + 1910812571, + 829867604, + 600054827, + 846276053, + 1319580597, + 3615631523, + 747621617, + 1554392685, + 3653393337, + 3912733768, + 2977154193, + 1155671306, + 2833201935, + 2279065800, + 3013201026, + 3987119777, + 3274777118, + 1140056448, + 1816979260, + 2179608234, + 3678482613, + 3814469814, + 2355321390, + 2570806559, + 3322663004, + 1190205437, + 1292030121, + 445850416, + 1007609872, + 3203863217, + 4141964142, + 1966808852, + 1308343552, + 2379169568, + 392323216, + 2481626389, + 382317464, + 4182472552, + 2023490843, + 3775512346, + 1114127726, + 732212450, + 329275334, + 3657781986, + 2294505476, + 1622386892, + 405801553, + 3621219497, + 3355243150, + 1442897718, + 3394995861, + 770248995, + 1364846261, + 3024153552, + 3538800322, + 2652257278, + 210120734, + 1301948433, + 1247565263, + 2146699588, + 1320374762, + 897290932, + 3862254368, + 799831442, + 1914207670, + 3377904039, + 2607906732, + 4027092024, + 2763947804, + 1014475044, + 896406089, + 3514973186, + 3879235573, + 4012732407, + 3867478549, + 1414327479, + 2649597407, + 3662261846, + 2995439679, + 1996639121, + 4039511636, + 2765791775, + 3303435936, + 637778742, + 3898457584, + 518685508, + 986059390, + 1574901139, + 3032251494, + 245461207, + 3766190730, + 1353320413, + 1935265299, + 1973837470, + 3278804186, + 3214092943, + 2957835889, + 4091085324, + 255294387, + 1414770228, + 2217535634, + 1675408567, + 3831909433, + 3020670330, + 1716921427, + 3386562328, + 1988740714, + 261016972, + 2290787112, + 1983824431, + 3086118481, + 1254847645, + 4067049839, + 249698862, + 1498678745, + 784029040, + 439729372, + 4110883615, + 1613350319, + 4105915119, + 1813130945, + 679455742, + 3976052181, + 3001295001, + 2104820813, + 1162900350, + 1648044702, + 2514586897, + 2421180310, + 2283890166, + 1404122339, + 4282148475, + 1644006790, + 3614130073, + 423899433, + 2013836895, + 3009479111, + 363709968, + 1155199660, + 628881947, + 2369525950, + 3548378305, + 203494928, + 1558133663, + 2037293462, + 1180976643, + 2702892598, + 3361665135, + 3573942869, + 3246684762, + 4184909495, + 3113930053, + 3314026892, + 3543006365, + 1777684175, + 738987079, + 2408860048, + 3375406400, + 3410541034, + 2483402110, + 874265790, + 2728628682, + 2465254020, + 2763032539, + 1773018316, + 3091717385, + 3056048355, + 1627578084, + 396052686, + 799842732, + 4040194951, + 642912929, + 3176656946, + 1805691782, + 3531813776, + 4064329368, + 517657652, + 3683563145, + 2227722419, + 1853029449, + 3503447249, + 3163192646, + 1056555858, + 2381084858, + 781559829, + 2363497066, + 254498834, + 2476144988, + 4269432604, + 3103258769, + 2392440039, + 268597153, + 2516299873, + 1081588303, + 2566866985, + 1638912927, + 3024289291, + 3157978282, + 834525272, + 3419277910, + 3891176370, + 2309185067, + 3221257587, + 3004541554, + 1137530190, + 571926244, + 210118849, + 4293182758, + 2869369690, + 2784618674, + 3305896333, + 1489585333, + 3381035852, + 3790732527, + 4028183561, + 2653638804, + 2736737505, + 3797140814, + 962515850, + 2258143878, + 3564546768, + 1895130701, + 2228287037, + 2312197219, + 2626222474, + 2181090448, + 3689165959, + 3520225197, + 136758892, + 1431487309, + 2930236310, + 154402287, + 2738491227, + 344509539, + 1896458514, + 3779882828, + 2133529203, + 4286044900, + 2605636955, + 820659343, + 1811842338, + 3962094114, + 3687915771, + 2155975276, + 3928836378, + 3691703524, + 1904018112, + 1881354556, + 872419853, + 4278198980, + 2885521339, + 1376745620, + 3236945512, + 1671716562, + 370644302, + 101468236, + 284769900, + 634980137, + 1605335139, + 1282158145, + 2660914377, + 854331875, + 1000704891, + 699019315, + 2780029935, + 1260383173, + 2779902986, + 582742932, + 3718843509, + 1408230782, + 607436972, + 2934336571, + 115661521, + 4263553433, + 4276473954, + 370169606, + 2853087319, + 1027669570, + 1720229704, + 3409791727, + 285337702, + 1345790431, + 2943146983, + 2685478343, + 1487297154, + 2969341474, + 2458039967, + 214515201, + 3687721469, + 3667625756, + 1898369795, + 4230564025, + 223641470, + 3069294914, + 4116721676, + 1141151651, + 3584477327, + 384051169, + 3317163317, + 4072972665, + 1029203420, + 3860139652, + 3715612400, + 2510677831, + 612600367, + 3268435709, + 3097313931, + 370004076, + 1322283423, + 2435703861, + 1160258309, + 3171459443, + 2335321836, + 2673338508, + 4025907014, + 3884845317, + 3818902857, + 3795803731, + 147850868, + 3685404583, + 3974796746, + 356681264, + 1011203630, + 1562517741, + 2845328877, + 1736512866, + 988217774, + 181135240, + 3685976710, + 1256118794, + 3209965375, + 3363408610, + 466254860, + 1238802224, + 2587721339, + 292142854, + 3507044396, + 3171441166, + 1280320546, + 1455646463, + 3644414748, + 1408953397, + 4061980018, + 3356361836, + 3625119644, + 2573263880, + 3703724981, + 200726676, + 3890873655, + 1126147734, + 3196707440, + 730509342, + 789995844, + 4048947862, + 2517783692, + 4044958641, + 1400738730, + 2018024150, + 1708076617, + 4025504571, + 3137500850, + 1286235939, + 1493096611, + 2608737991, + 3110030970, + 2642728101, + 1595719512, + 364408339, + 2079077251, + 4193186146, + 2554702544, + 2507932088, + 1215331848, + 2013306012, + 1017301200, + 922684690, + 1736386371, + 1626170469, + 3727347974, + 2689656441, + 2440555759, + ]; + + static final String privateKeyFCM = String.fromCharCodes(List.generate( + _envieddataprivateKeyFCM.length, + (int i) => i, + growable: false, + ).map((int i) => _envieddataprivateKeyFCM[i] ^ _enviedkeyprivateKeyFCM[i])); + + static const List _enviedkeypassnpassenger = [ + 2488819431, + 2770223150, + 2582335575, + 2610561879, + 2411505875, + 1657282424, + 2400061973, + 1985533252, + 4982124, + 3405874632, + 4088173917, + 168716871, + 1460210415, + ]; + + static const List _envieddatapassnpassenger = [ + 2488819343, + 2770223180, + 2582335536, + 2610561845, + 2411505850, + 1657282316, + 2400062071, + 1985533212, + 4982046, + 3405874576, + 4088173871, + 168716805, + 1460210333, + ]; + + static final String passnpassenger = String.fromCharCodes(List.generate( + _envieddatapassnpassenger.length, + (int i) => i, + growable: false, + ).map((int i) => _envieddatapassnpassenger[i] ^ _enviedkeypassnpassenger[i])); + + static const List _enviedkeynewId = [ + 3031355905, + 2427189358, + 4227842261, + ]; + + static const List _envieddatanewId = [ + 3031356015, + 2427189259, + 4227842210, + ]; + + static final String newId = String.fromCharCodes(List.generate( + _envieddatanewId.length, + (int i) => i, + growable: false, + ).map((int i) => _envieddatanewId[i] ^ _enviedkeynewId[i])); + + static const List _enviedkeyallowed = [ + 571556174, + 1938322362, + 2450700270, + 3883374647, + 2501284320, + 589521911, + 2333171601, + 2952046055, + 3394402264, + 765042122, + 3480784058, + 1478648951, + ]; + + static const List _envieddataallowed = [ + 571556122, + 1938322376, + 2450700167, + 3883374663, + 2501284250, + 589521843, + 2333171683, + 2952045966, + 3394402222, + 765042095, + 3480784072, + 1478648909, + ]; + + static final String allowed = String.fromCharCodes(List.generate( + _envieddataallowed.length, + (int i) => i, + growable: false, + ).map((int i) => _envieddataallowed[i] ^ _enviedkeyallowed[i])); + + static const List _enviedkeybasicAuthCredentials = [ + 1171627515, + 2920834, + 1773476736, + 1662360174, + 3976040406, + 420027252, + 2188556584, + 2766592129, + 326216410, + 3265762873, + 3780778546, + 3561706076, + 21086913, + 574055011, + 3882614780, + 1826192253, + 3474285061, + 3822251971, + 2387425596, + 3594997982, + 1521373709, + 4284943469, + 2531332148, + 1426969750, + 1118645882, + 1075537670, + 569556090, + 978228654, + 4161679133, + 2395031260, + 380630070, + ]; + + static const List _envieddatabasicAuthCredentials = [ + 1171627404, + 2920947, + 1773476846, + 1662360067, + 3976040359, + 420027141, + 2188556635, + 2766592235, + 326216355, + 3265762895, + 3780778565, + 3561706038, + 21086903, + 574055001, + 3882614674, + 1826192140, + 3474285175, + 3822251930, + 2387425654, + 3594997902, + 1521373773, + 4284943452, + 2531332099, + 1426969765, + 1118645837, + 1075537758, + 569555976, + 978228726, + 4161679217, + 2395031198, + 380630106, + ]; + + static final String basicAuthCredentials = String.fromCharCodes( + List.generate( + _envieddatabasicAuthCredentials.length, + (int i) => i, + growable: false, + ).map((int i) => + _envieddatabasicAuthCredentials[i] ^ + _enviedkeybasicAuthCredentials[i])); + + static const List _enviedkeybasicCompareFaces = [ + 2619977277, + 3663038405, + 2607741389, + 1493848637, + 3168440982, + 2922050375, + 1637496925, + 3485178165, + 2577893418, + 1320091529, + 358422193, + 3956561098, + 3865055531, + 3228809269, + 194868560, + 1207514434, + 3953247386, + 2209440152, + 3279222745, + 592735149, + 3806977348, + 790419202, + 3293672064, + 2229699769, + 162266597, + 2376414881, + 1154960442, + 3956440468, + ]; + + static const List _envieddatabasicCompareFaces = [ + 2619977287, + 3663038383, + 2607741368, + 1493848663, + 3168441082, + 2922050354, + 1637496876, + 3485178195, + 2577893466, + 1320091619, + 358422155, + 3956561060, + 3865055578, + 3228809287, + 194868489, + 1207514408, + 3953247466, + 2209440216, + 3279222760, + 592735130, + 3806977399, + 790419253, + 3293672152, + 2229699787, + 162266557, + 2376414925, + 1154960504, + 3956440568, + ]; + + static final String basicCompareFaces = String.fromCharCodes( + List.generate( + _envieddatabasicCompareFaces.length, + (int i) => i, + growable: false, + ).map((int i) => + _envieddatabasicCompareFaces[i] ^ _enviedkeybasicCompareFaces[i])); + + static const List _enviedkeybasicCompareFacesURL = [ + 1346303975, + 2629076685, + 2970965832, + 558341252, + 548577589, + 4014912986, + 3777192577, + 3989160753, + 3957276480, + 4162203919, + 3049854352, + 724067773, + 3297673131, + 906535930, + 3377634195, + 832648210, + 4144867747, + 4103292733, + 124892029, + 2492806706, + 1038049038, + 786664172, + 2157258951, + 1881524520, + 3686067592, + 3042675886, + 3111736241, + 2506046267, + 764724622, + 997676373, + 3116583509, + 2275122009, + 2732506655, + 4203471349, + 3647882059, + 2832153296, + 3544329552, + 3333848209, + 3098941436, + 179874878, + 4253300882, + 1937986626, + 2194413499, + 723497112, + 4131989256, + 97391730, + 4264680715, + 4152555737, + 3043272639, + 639178387, + 4190211238, + 274626550, + 827003188, + 3381416721, + 623732000, + 3400423116, + 801088801, + 1732870145, + 2309896388, + 518112003, + ]; + + static const List _envieddatabasicCompareFacesURL = [ + 1346303887, + 2629076665, + 2970965820, + 558341364, + 548577606, + 4014912992, + 3777192622, + 3989160734, + 3957276454, + 4162204014, + 3049854451, + 724067800, + 3297673094, + 906535838, + 3377634294, + 832648294, + 4144867782, + 4103292766, + 124891913, + 2492806687, + 1038049128, + 786664154, + 2157259006, + 1881524506, + 3686067644, + 3042675869, + 3111736200, + 2506046217, + 764724717, + 997676385, + 3116583478, + 2275122030, + 2732506673, + 4203471261, + 3647882030, + 2832153250, + 3544329535, + 3333848314, + 3098941321, + 179874911, + 4253300962, + 1937986610, + 2194413461, + 723497211, + 4131989351, + 97391647, + 4264680740, + 4152555706, + 3043272656, + 639178494, + 4190211286, + 274626455, + 827003206, + 3381416820, + 623732095, + 3400423082, + 801088832, + 1732870242, + 2309896353, + 518112112, + ]; + + static final String basicCompareFacesURL = String.fromCharCodes( + List.generate( + _envieddatabasicCompareFacesURL.length, + (int i) => i, + growable: false, + ).map((int i) => + _envieddatabasicCompareFacesURL[i] ^ + _enviedkeybasicCompareFacesURL[i])); + + static const List _enviedkeyaccountSIDTwillo = [ + 4061742007, + 3599962607, + 1635104436, + 2389009084, + 2034372200, + 3565771371, + 1726104097, + 3366616123, + 2662269498, + 2354541721, + 2460343423, + 1613949928, + 3801075804, + 2445061548, + 1768226310, + 745100707, + 4271583822, + 1185092190, + 1052663448, + 2021863819, + 2938391466, + 3189594433, + 229378354, + 1683737623, + 1509479591, + 1718166343, + 3103556867, + 453424511, + 4132595251, + 1579233130, + 4251866744, + 2580267701, + 3036822815, + 2007268182, + 145513440, + 3130610447, + 831047080, + 3331115302, + 3908007566, + 2106450412, + 2677853752, + ]; + + static const List _envieddataaccountSIDTwillo = [ + 4061742054, + 3599962537, + 1635104460, + 2389009036, + 2034372121, + 3565771282, + 1726104085, + 3366616078, + 2662269452, + 2354541811, + 2460343306, + 1613949826, + 3801075823, + 2445061524, + 1768226357, + 745100749, + 4271583863, + 1185092134, + 1052663533, + 2021863922, + 2938391448, + 3189594480, + 229378315, + 1683737635, + 1509479638, + 1718166385, + 3103556913, + 453424454, + 4132595266, + 1579233115, + 4251866654, + 2580267743, + 3036822831, + 2007268143, + 145513431, + 3130610519, + 831047130, + 3331115390, + 3908007650, + 2106450350, + 2677853780, + ]; + + static final String accountSIDTwillo = String.fromCharCodes( + List.generate( + _envieddataaccountSIDTwillo.length, + (int i) => i, + growable: false, + ).map((int i) => + _envieddataaccountSIDTwillo[i] ^ _enviedkeyaccountSIDTwillo[i])); + + static const List _enviedkeyserverAPI = [ + 2293015959, + 2926936416, + 754713994, + 1879177331, + 3010367632, + 2331019857, + 1981454485, + 2022062379, + 70733539, + 2385910867, + 4181703881, + 3811532071, + 2083581455, + 2024042842, + 872991547, + 2096731808, + 3687220286, + 1079788284, + 2972148923, + 3463026642, + 702866374, + 3833629760, + 3254795387, + 1748563216, + 1425761115, + 1114265423, + 1291897108, + 3508612605, + 4170163035, + 64332401, + 4001548807, + 593052420, + 2738184806, + 3949311381, + 4030058807, + 433727145, + 1412218154, + 984455934, + 3018343098, + 607855449, + 3831988072, + 3988357687, + 2020725381, + 1608151706, + 3038453786, + 311730672, + 294232048, + 1259710598, + 3134368654, + 1212166389, + 3021130905, + 4092652837, + 3607733940, + 3624672522, + 3325104542, + 2343446236, + 1940698349, + 3741285099, + 576553194, + 2753508854, + 1533348535, + 953434871, + 3183028239, + 188764603, + 237251648, + 412548870, + 927203250, + 3059078396, + 1706005021, + 513065983, + 1244466660, + 1156042268, + 1643413036, + 1233060717, + 501636137, + 3310073628, + 704059199, + 1593488971, + 1269263079, + 1263949358, + 2810813537, + 3514255579, + 1027853145, + 2559804475, + 504400660, + 2908260781, + 3891590208, + 1988350317, + 3793199272, + 1138964747, + 2931313742, + 1249563942, + 1775933755, + 680400221, + 4217916984, + 2770259341, + 738612783, + 2484845867, + 3547361336, + 910699503, + 1325736454, + 1224765566, + 711030438, + 1283633041, + 48458527, + 655012284, + 1770237206, + 531760275, + 87583876, + 1962181311, + 3646947175, + 839419762, + 3563905313, + 2872121407, + 3280777072, + 3217748352, + 2164796486, + 2913284242, + 2905637391, + 2831279558, + 1468848219, + 2550222175, + 3982541680, + 2995326993, + 4035210995, + 267043828, + 716873193, + 1116245303, + 1822772839, + 927480690, + 3097843470, + 3851424742, + 3994979247, + 2542882136, + 3999272813, + 1478207279, + 2410291106, + 3137210450, + 2933337757, + 3196350738, + 1453871709, + 2931724670, + 1070266193, + 1472563550, + 3427297970, + 3645735156, + 2112201060, + 3442776882, + 2593705571, + 839101667, + 374945482, + 284772623, + 3598299129, + 2573901293, + 2786779760, + 3198178720, + 3250698064, + 3986009591, + ]; + + static const List _envieddataserverAPI = [ + 2293016006, + 2926936369, + 754714075, + 1879177250, + 3010367743, + 2331019827, + 1981454534, + 2022062425, + 70733457, + 2385910805, + 4181703840, + 3811532061, + 2083581534, + 2024042764, + 872991594, + 2096731800, + 3687220233, + 1079788164, + 2972148974, + 3463026661, + 702866364, + 3833629751, + 3254795320, + 1748563302, + 1425761078, + 1114265365, + 1291897198, + 3508612519, + 4170163007, + 64332304, + 4001548927, + 593052529, + 2738184757, + 3949311399, + 4030058833, + 433727131, + 1412218137, + 984455847, + 3018343054, + 607855412, + 3831987986, + 3988357632, + 2020725448, + 1608151776, + 3038453859, + 311730623, + 294231946, + 1259710708, + 3134368694, + 1212166298, + 3021131005, + 4092652823, + 3607733974, + 3624672632, + 3325104552, + 2343446167, + 1940698292, + 3741285010, + 576553103, + 2753508784, + 1533348566, + 953434787, + 3183028313, + 188764663, + 237251591, + 412548917, + 927203321, + 3059078351, + 1706005109, + 513065863, + 1244466641, + 1156042310, + 1643413069, + 1233060664, + 501636176, + 3310073700, + 704059144, + 1593488942, + 1269263038, + 1263949400, + 2810813472, + 3514255490, + 1027853097, + 2559804538, + 504400706, + 2908260809, + 3891590155, + 1988350214, + 3793199237, + 1138964793, + 2931313782, + 1249563920, + 1775933813, + 680400137, + 4217917034, + 2770259428, + 738612764, + 2484845905, + 3547361355, + 910699478, + 1325736559, + 1224765485, + 711030505, + 1283633151, + 48458567, + 655012296, + 1770237262, + 531760321, + 87583949, + 1962181319, + 3646947092, + 839419653, + 3563905350, + 2872121356, + 3280777019, + 3217748453, + 2164796453, + 2913284304, + 2905637474, + 2831279541, + 1468848183, + 2550222188, + 3982541606, + 2995327081, + 4035210937, + 267043789, + 716873118, + 1116245368, + 1822772810, + 927480580, + 3097843527, + 3851424662, + 3994979288, + 2542882093, + 3999272793, + 1478207359, + 2410291156, + 3137210469, + 2933337849, + 3196350841, + 1453871637, + 2931724565, + 1070266121, + 1472563504, + 3427298011, + 3645735041, + 2112200988, + 3442776959, + 2593705520, + 839101607, + 374945453, + 284772696, + 3598299041, + 2573901215, + 2786779688, + 3198178764, + 3250698002, + 3986009499, + ]; + + static final String serverAPI = String.fromCharCodes(List.generate( + _envieddataserverAPI.length, + (int i) => i, + growable: false, + ).map((int i) => _envieddataserverAPI[i] ^ _enviedkeyserverAPI[i])); + + static const List _enviedkeymapAPIKEY = [ + 590595859, + 1725547051, + 710486845, + 1227915785, + 2549895144, + 688514078, + 3943369896, + 3858000073, + 869856315, + 848858417, + 435215866, + 2514344073, + 1588727850, + 2309094374, + 965634129, + 1998686686, + 4095429781, + 3708319268, + 2120152229, + 4103649435, + 4102909837, + 2905227452, + 494799181, + 3532194356, + 4103156907, + 3555540401, + 2752131075, + 2032733869, + 1504269994, + 1766878288, + 1883341851, + 2651616596, + 779141393, + 2296724889, + 1004035135, + 445861254, + 1623814505, + 304800323, + 4036018663, + ]; + + static const List _envieddatamapAPIKEY = [ + 590595922, + 1725547106, + 710486855, + 1227915880, + 2549895099, + 688514151, + 3943369963, + 3858000015, + 869856328, + 848858470, + 435215800, + 2514344184, + 1588727900, + 2309094285, + 965634057, + 1998686628, + 4095429886, + 3708319253, + 2120152290, + 4103649529, + 4102909856, + 2905227486, + 494799118, + 3532194419, + 4103156947, + 3555540422, + 2752131186, + 2032733945, + 1504270045, + 1766878234, + 1883341898, + 2651616543, + 779141464, + 2296724988, + 1004035191, + 445861356, + 1623814433, + 304800373, + 4036018643, + ]; + + static final String mapAPIKEY = String.fromCharCodes(List.generate( + _envieddatamapAPIKEY.length, + (int i) => i, + growable: false, + ).map((int i) => _envieddatamapAPIKEY[i] ^ _enviedkeymapAPIKEY[i])); + + static const List _enviedkeytwilloRecoveryCode = [ + 3061181226, + 711391497, + 4095166760, + 1023880297, + 1881687363, + 2641927194, + 2425000206, + 2521734215, + 1014044374, + 2699701736, + 3823094162, + 1444617229, + 3912188074, + 1273144673, + 817689102, + 85385811, + 1084488378, + 3544249515, + 854844610, + 1298892397, + 1626466121, + 3984551581, + 1141458084, + 3261001117, + 3898644321, + 995741513, + 4053079005, + 759468828, + 1405019929, + 4203215804, + 1255405236, + ]; + + static const List _envieddatatwilloRecoveryCode = [ + 3061181289, + 711391560, + 4095166845, + 1023880286, + 1881687418, + 2641927262, + 2425000262, + 2521734167, + 1014044318, + 2699701721, + 3823094224, + 1444617319, + 3912188143, + 1273144664, + 817689182, + 85385734, + 1084488434, + 3544249503, + 854844551, + 1298892345, + 1626466065, + 3984551625, + 1141458167, + 3261001157, + 3898644283, + 995741457, + 4053078959, + 759468868, + 1405020021, + 4203215870, + 1255405272, + ]; + + static final String twilloRecoveryCode = String.fromCharCodes( + List.generate( + _envieddatatwilloRecoveryCode.length, + (int i) => i, + growable: false, + ).map((int i) => + _envieddatatwilloRecoveryCode[i] ^ _enviedkeytwilloRecoveryCode[i])); + + static const List _enviedkeyauthTokenTwillo = [ + 819342226, + 788789891, + 3123247776, + 1481241070, + 131911166, + 4108653561, + 3716173209, + 1119431390, + 1550093162, + 2509594978, + 2860707611, + 2111091813, + 4054343762, + 3411344303, + 1994883266, + 3969747323, + 1882528013, + 3978866887, + 1319130456, + 3700576663, + 3709959726, + 2119958655, + 382328356, + 3154706001, + 3101953264, + 539908562, + 1029018845, + 3103710034, + 1952580682, + 3757216819, + 305274852, + 946291334, + 3010737308, + 1257562287, + 96545321, + 2074025436, + 4085510880, + 3435203013, + 2957985435, + ]; + + static const List _envieddataauthTokenTwillo = [ + 819342245, + 788789939, + 3123247829, + 1481241047, + 131911110, + 4108653459, + 3716173292, + 1119431406, + 1550093144, + 2509594963, + 2860707631, + 2111091722, + 4054343722, + 3411344343, + 1994883318, + 3969747210, + 1882528061, + 3978866866, + 1319130479, + 3700576675, + 3709959710, + 2119958605, + 382328348, + 3154705956, + 3101953216, + 539908576, + 1029018860, + 3103709991, + 1952580734, + 3757216834, + 305274769, + 946291376, + 3010737321, + 1257562359, + 96545371, + 2074025348, + 4085510796, + 3435202951, + 2957985527, + ]; + + static final String authTokenTwillo = String.fromCharCodes(List.generate( + _envieddataauthTokenTwillo.length, + (int i) => i, + growable: false, + ).map( + (int i) => _envieddataauthTokenTwillo[i] ^ _enviedkeyauthTokenTwillo[i])); + + static const List _enviedkeychatGPTkey = [ + 2373063976, + 961934885, + 534858355, + 830900214, + 3199666739, + 720552233, + 113100068, + 2200605260, + 556295078, + 67647025, + 1451807346, + 2491370255, + 2893404701, + 1879305313, + 3133612886, + 3070369966, + 862113390, + 2037984315, + 3795516698, + 312857166, + 3742379061, + 1217962401, + 2010433459, + 2228418192, + 2231876400, + 3729060013, + 2441381393, + 731976795, + 557686674, + 2618343914, + 1377745390, + 1623097872, + 3730022414, + 902078926, + 2859139402, + 1566082863, + 2480423706, + 4033392722, + 1931234461, + 2591610421, + 3013673505, + 1732686785, + 2986393469, + 1881665331, + 860727576, + 1734306062, + 495896289, + 2800158209, + 471241334, + 2438296124, + 4062945115, + 2688029754, + 1961162835, + 1186389968, + 107649520, + 2714634333, + 2851633431, + 197373554, + ]; + + static const List _envieddatachatGPTkey = [ + 2373064018, + 961934914, + 534858334, + 830900162, + 3199666800, + 720552219, + 113100050, + 2200605245, + 556295058, + 67647074, + 1451807275, + 2491370344, + 2893404767, + 1879305258, + 3133612807, + 3070369995, + 862113318, + 2037984353, + 3795516766, + 312857151, + 3742379102, + 1217962486, + 2010433500, + 2228418279, + 2231876467, + 3729059988, + 2441381449, + 731976745, + 557686762, + 2618343821, + 1377745339, + 1623097941, + 3730022504, + 902078875, + 2859139379, + 1566082838, + 2480423760, + 4033392640, + 1931234538, + 2591610375, + 3013673555, + 1732686764, + 2986393419, + 1881665378, + 860727594, + 1734306159, + 495896197, + 2800158307, + 471241285, + 2438296151, + 4062945073, + 2688029773, + 1961162763, + 1186389922, + 107649448, + 2714634289, + 2851633493, + 197373470, + ]; + + static final String chatGPTkey = String.fromCharCodes(List.generate( + _envieddatachatGPTkey.length, + (int i) => i, + growable: false, + ).map((int i) => _envieddatachatGPTkey[i] ^ _enviedkeychatGPTkey[i])); + + static const List _enviedkeytransactionCloude = [ + 1118941550, + 4099935787, + 173571499, + 3973513861, + 2437807982, + 1298203410, + 2065872094, + 510006101, + 1802609342, + 913683503, + 970036513, + 1338211370, + 2072089381, + 829805509, + 1524997266, + 2082051612, + 1857851532, + 2270814699, + 2407687675, + 2593046736, + 1458174257, + 3566124664, + 2756991287, + 2472475135, + 512460199, + 700164825, + 111889193, + 255851361, + 2412891345, + 3059660993, + 4294813237, + 190284628, + 4288139700, + 1940195597, + 1231020279, + 204048557, + 1814049298, + 2890749594, + 1995384340, + 1458073577, + 54859711, + 3726054855, + 2770635461, + 3788671078, + 2687647528, + 3032352966, + 4129921504, + 4197172041, + 2218114342, + 2204224811, + 523808078, + 225969632, + 1060955425, + 3050302343, + 2739866115, + 3758726503, + 2871157659, + 1930976711, + 1574507384, + 1567738871, + 2104303443, + 3409050505, + ]; + + static const List _envieddatatransactionCloude = [ + 1118941503, + 4099935811, + 173571528, + 3973513970, + 2437807899, + 1298203515, + 2065872050, + 510006074, + 1802609363, + 913683550, + 970036546, + 1338211397, + 2072089420, + 829805479, + 1524997288, + 2082051661, + 1857851610, + 2270814628, + 2407687588, + 2593046682, + 1458174335, + 3566124577, + 2756991346, + 2472475067, + 512460181, + 700164737, + 111889278, + 255851296, + 2412891363, + 3059661047, + 4294813292, + 190284556, + 4288139775, + 1940195662, + 1231020229, + 204048633, + 1814049346, + 2890749600, + 1995384397, + 1458073506, + 54859662, + 3726054787, + 2770635411, + 3788671022, + 2687647518, + 3032352917, + 4129921450, + 4197171979, + 2218114325, + 2204224794, + 523808000, + 225969619, + 1060955505, + 3050302402, + 2739866162, + 3758726450, + 2871157699, + 1930976693, + 1574507296, + 1567738779, + 2104303377, + 3409050597, + ]; + + static final String transactionCloude = String.fromCharCodes( + List.generate( + _envieddatatransactionCloude.length, + (int i) => i, + growable: false, + ).map((int i) => + _envieddatatransactionCloude[i] ^ _enviedkeytransactionCloude[i])); + + static const List _enviedkeyvisionApi = [ + 4242309064, + 3151994194, + 2380760007, + 304141338, + 1141936832, + 174192233, + 200721148, + 1366498521, + 3994849747, + 198064029, + 2463099604, + 1181848525, + 3585832905, + 1502567312, + 3741612627, + 1967290201, + 803376063, + 3996968427, + 1831735777, + 676746421, + 2813831933, + 3101088886, + 715804512, + 2542397118, + 3053186523, + 135963899, + 1418413242, + 1709277287, + 1585287105, + 2608667577, + 3086633796, + 2447653279, + 1487281515, + 4061373748, + 1061157679, + 1486038403, + 3512903590, + 1236737199, + ]; + + static const List _envieddatavisionApi = [ + 4242309115, + 3151994146, + 2380759942, + 304141398, + 1141936819, + 174192152, + 200721071, + 1366498442, + 3994849674, + 198064073, + 2463099554, + 1181848503, + 3585832889, + 1502567334, + 3741612650, + 1967290120, + 803376010, + 3996968365, + 1831735724, + 676746492, + 2813831834, + 3101088788, + 715804442, + 2542397140, + 3053186460, + 135963853, + 1418413280, + 1709277270, + 1585287099, + 2608667602, + 3086633776, + 2447653333, + 1487281459, + 4061373766, + 1061157751, + 1486038511, + 3512903652, + 1236737219, + ]; + + static final String visionApi = String.fromCharCodes(List.generate( + _envieddatavisionApi.length, + (int i) => i, + growable: false, + ).map((int i) => _envieddatavisionApi[i] ^ _enviedkeyvisionApi[i])); + + static const List _enviedkeysecretKey = [ + 21976699, + 1452998254, + 3036621410, + 7204005, + 1217430364, + 1670749229, + 482443604, + 3787147714, + 3697591561, + 742636372, + 542298477, + 1900028264, + 2091851107, + 2847672537, + 1775609193, + 1293392594, + 1735553420, + 3561282980, + 3663882305, + 1047022619, + 3447458639, + 1502752036, + 578647052, + 3493309161, + 1961326923, + 554654685, + 692809793, + 3912080221, + 1833041368, + 2063027993, + 3304308332, + 1294912617, + 3735434889, + 1311730222, + 2176507922, + 1363188572, + 1907861464, + 1954860693, + 2228680260, + 2918092799, + 767117478, + 977702458, + 2461801236, + 1854573550, + 226743729, + 2276742753, + 3203858729, + 1142276358, + 3167166563, + 1552026201, + 189479665, + 1089169811, + 1002861696, + 2952471421, + 3754954323, + 3381138527, + 1639641755, + 3649951534, + 797070922, + 69860492, + 951331360, + 3765322333, + 3952633267, + 817477413, + 2581543012, + 1550755402, + 3117745567, + 2274389987, + 1661625387, + 3329340226, + 2697431099, + 310408627, + 540379112, + 671549684, + 4246332165, + 1313335061, + 2495209344, + 3269290275, + 1460499156, + 2475981176, + 1545086440, + 2148364716, + 835386431, + 2721291697, + 1837033020, + 4222541807, + 3025058180, + 682141564, + 2338650966, + 3765002432, + 731039597, + 137641532, + 3496992292, + 211059179, + 1827626144, + 2351567086, + 239064065, + 2671650538, + 1949697983, + 2184859639, + 129349646, + 924743146, + 394532272, + 546076401, + 1956982163, + 3377099016, + 1504616618, + 856480505, + 3127793245, + 4195545612, + 3577865707, + 546718952, + 1097498367, + 721435183, + ]; + + static const List _envieddatasecretKey = [ + 21976577, + 1452998153, + 3036621373, + 7204055, + 1217430323, + 1670749277, + 482443582, + 3787147677, + 3697591612, + 742636387, + 542298404, + 1900028161, + 2091851029, + 2847672559, + 1775609113, + 1293392543, + 1735553482, + 3561283047, + 3663882243, + 1047022685, + 3447458622, + 1502752023, + 578647119, + 3493309147, + 1961326885, + 554654699, + 692809736, + 3912080133, + 1833041332, + 2063028084, + 3304308230, + 1294912528, + 3735434978, + 1311730270, + 2176508010, + 1363188504, + 1907861429, + 1954860738, + 2228680317, + 2918092748, + 767117557, + 977702509, + 2461801255, + 1854573464, + 226743751, + 2276742713, + 3203858753, + 1142276400, + 3167166555, + 1552026124, + 189479600, + 1089169834, + 1002861780, + 2952471368, + 3754954261, + 3381138448, + 1639641801, + 3649951610, + 797070877, + 69860587, + 951331447, + 3765322286, + 3952633319, + 817477398, + 2581542995, + 1550755353, + 3117745643, + 2274389928, + 1661625432, + 3329340173, + 2697431147, + 310408663, + 540379039, + 671549616, + 4246332257, + 1313335142, + 2495209465, + 3269290267, + 1460499109, + 2475981098, + 1545086417, + 2148364767, + 835386445, + 2721291772, + 1837033065, + 4222541699, + 3025058289, + 682141469, + 2338650942, + 3765002419, + 731039582, + 137641554, + 3496992372, + 211059107, + 1827626198, + 2351566985, + 239064131, + 2671650443, + 1949697932, + 2184859588, + 129349754, + 924743085, + 394532315, + 546076360, + 1956982179, + 3377099134, + 1504616700, + 856480460, + 3127793157, + 4195545726, + 3577865651, + 546718852, + 1097498301, + 721435203, + ]; + + static final String secretKey = String.fromCharCodes(List.generate( + _envieddatasecretKey.length, + (int i) => i, + growable: false, + ).map((int i) => _envieddatasecretKey[i] ^ _enviedkeysecretKey[i])); + + static const List _enviedkeystripePublishableKe = [ + 852742872, + 1267117993, + 503617470, + 1227210553, + 2107322754, + 629662297, + 1647470630, + 4015924574, + 830318470, + 3170081617, + 3637973033, + 788582207, + 4290426641, + 351432888, + 3692598474, + 177929365, + 3310512599, + 1303155240, + 2881829959, + 1786735677, + 38833684, + 1110730400, + 2898366826, + 1140664119, + 1811663489, + 1181053236, + 265553710, + 1401588207, + 3805654817, + 571396201, + 2225462231, + 4053735026, + 2220028632, + 1790914927, + 2360028602, + 2052396718, + 3100582716, + 2213480629, + 2781025944, + 3164842593, + 4137208770, + 3273862597, + 1525887355, + 3861438604, + 347768894, + 1364438944, + 3682299133, + 1246189992, + 2163071351, + 2263627641, + 2880507300, + 128701581, + 3981557139, + 4287695248, + 3819246629, + 4076488269, + 4191833813, + 3991586521, + 4011393507, + 2964934600, + 2703871376, + 3337092834, + 1054416731, + 1597148239, + 3123200130, + 1236696155, + 2577532411, + 1727996216, + 2507691163, + 48480224, + 1257280029, + 1667721827, + 1106142015, + 694710280, + 4219128825, + 793984548, + 2454521291, + 3787230524, + 2791698277, + 2133664514, + 251781124, + 3690268377, + 3394026555, + 1741346204, + 1099332453, + 1195251920, + 3617564075, + 499799394, + 1149001320, + 3196589237, + 973074427, + 2630431583, + 1298595435, + 2138223436, + 3825256479, + 733165633, + 1821275026, + 1900219900, + 882412125, + 3291640377, + 3685282013, + 1359362228, + 1806858115, + 2108102838, + 1204058960, + 2250910429, + 3725157861, + 2139320964, + 3752972078, + 3110196582, + 2072562545, + 1090174480, + 1575782319, + 2705828397, + ]; + + static const List _envieddatastripePublishableKe = [ + 852742830, + 1267118030, + 503617505, + 1227210569, + 2107322864, + 629662262, + 1647470678, + 4015924532, + 830318553, + 3170081636, + 3637973022, + 788582262, + 4290426744, + 351432910, + 3692598524, + 177929432, + 3310512529, + 1303155307, + 2881829893, + 1786735739, + 38833765, + 1110730387, + 2898366761, + 1140664069, + 1811663599, + 1181053186, + 265553733, + 1401588129, + 3805654891, + 571396103, + 2225462157, + 4053734960, + 2220028577, + 1790914873, + 2360028556, + 2052396736, + 3100582729, + 2213480689, + 2781026028, + 3164842553, + 4137208743, + 3273862652, + 1525887282, + 3861438694, + 347768955, + 1364439024, + 3682299058, + 1246190030, + 2163071263, + 2263627540, + 2880507348, + 128701641, + 3981557223, + 4287695303, + 3819246664, + 4076488249, + 4191833830, + 3991586452, + 4011393455, + 2964934554, + 2703871392, + 3337092741, + 1054416650, + 1597148223, + 3123200235, + 1236696083, + 2577532312, + 1727996265, + 2507691254, + 48480161, + 1257280091, + 1667721774, + 1106142058, + 694710360, + 4219128715, + 793984638, + 2454521256, + 3787230479, + 2791698228, + 2133664619, + 251781191, + 3690268317, + 3394026577, + 1741346276, + 1099332391, + 1195251850, + 3617564135, + 499799296, + 1149001232, + 3196589297, + 973074360, + 2630431596, + 1298595342, + 2138223402, + 3825256551, + 733165590, + 1821275114, + 1900219782, + 882412142, + 3291640330, + 3685281983, + 1359362275, + 1806858187, + 2108102791, + 1204058890, + 2250910394, + 3725157783, + 2139321079, + 3752972150, + 3110196500, + 2072562473, + 1090174588, + 1575782381, + 2705828417, + ]; + + static final String stripePublishableKe = String.fromCharCodes( + List.generate( + _envieddatastripePublishableKe.length, + (int i) => i, + growable: false, + ).map((int i) => + _envieddatastripePublishableKe[i] ^ + _enviedkeystripePublishableKe[i])); + + static const List _enviedkeychatGPTkeySefer = [ + 1132355700, + 2616724811, + 4205165985, + 2527290338, + 2146395996, + 3243284861, + 3407574293, + 3576653388, + 2798493378, + 1894911129, + 1555304931, + 3730703163, + 1669589981, + 2105350927, + 4086765581, + 3812593271, + 3363213248, + 1464244491, + 3102964009, + 1945033573, + 2223495306, + 2951049579, + 2215848300, + 3311874590, + 2212415185, + 3916148226, + 1867222140, + 3526574019, + 1328262358, + 4246540573, + 2624840385, + 2481823204, + 653533026, + 2856072332, + 3549493501, + 56765761, + 2387997616, + 2703564721, + 1539159159, + 899993527, + 153098900, + 2041834298, + 2972517624, + 1850715488, + 207628368, + 3318888898, + 2094521065, + 1071133446, + 3614717711, + 2241551134, + 865998752, + 3053364456, + 2928984891, + 4047901208, + 2069660987, + 1499741840, + 2518915131, + 851825950, + ]; + + static const List _envieddatachatGPTkeySefer = [ + 1132355598, + 2616724780, + 4205165964, + 2527290283, + 2146395957, + 3243284783, + 3407574310, + 3576653349, + 2798493430, + 1894911222, + 1555304844, + 3730703169, + 1669589948, + 2105350972, + 4086765652, + 3812593153, + 3363213224, + 1464244605, + 3102964043, + 1945033564, + 2223495416, + 2951049521, + 2215848199, + 3311874607, + 2212415122, + 3916148283, + 1867222052, + 3526574001, + 1328262318, + 4246540666, + 2624840340, + 2481823137, + 653533010, + 2856072416, + 3549493445, + 56765739, + 2387997666, + 2703564771, + 1539159085, + 899993541, + 153098972, + 2041834320, + 2972517579, + 1850715441, + 207628341, + 3318888951, + 2094521016, + 1071133534, + 3614717791, + 2241551218, + 865998801, + 3053364414, + 2928984931, + 4047901290, + 2069661027, + 1499741948, + 2518915193, + 851826034, + ]; + + static final String chatGPTkeySefer = String.fromCharCodes(List.generate( + _envieddatachatGPTkeySefer.length, + (int i) => i, + growable: false, + ).map( + (int i) => _envieddatachatGPTkeySefer[i] ^ _enviedkeychatGPTkeySefer[i])); + + static const List _enviedkeyllamaKey = [ + 1046758203, + 395008810, + 1953335401, + 2453937327, + 3279053365, + 1317244565, + 3574039562, + 1215902332, + 1644280699, + 518881544, + 3844689288, + 501085620, + 1349721798, + 2543356164, + 961930120, + 2818059939, + 3469485470, + 495624143, + 2760936556, + 2425296758, + 3500690850, + 2773468800, + 1918639328, + 2232542112, + 4208402208, + 1334575062, + 794476552, + 1469116811, + 2141997342, + 2257055320, + 3738100120, + 2800440337, + 2089922040, + 1630009804, + 138746912, + 3777561700, + 2821301478, + 2593962585, + 3273791986, + 576637506, + 410833351, + 3638804837, + 151198496, + 494283407, + 3064398941, + 3295715808, + 3928421722, + 1572458343, + 2771449688, + 3691682050, + 2193264043, + 3187159780, + 3304236798, + 1172781432, + 4020314708, + 1406058279, + 1733425633, + 74657417, + 870365763, + 4238651139, + 1606537654, + 4235541775, + 685386054, + 4129252757, + 2847373843, + 2912633518, + 681412129, + 743116068, + 1543224887, + 2061637412, + 4204939294, + 173568990, + 1114381103, + 3421798646, + ]; + + static const List _envieddatallamaKey = [ + 1046758249, + 395008888, + 1953335364, + 2453937386, + 3279053376, + 1317244652, + 3574039653, + 1215902266, + 1644280639, + 518881629, + 3844689406, + 501085650, + 1349721748, + 2543356224, + 961930186, + 2818059980, + 3469485556, + 495624187, + 2760936538, + 2425296656, + 3500690936, + 2773468875, + 1918639265, + 2232542164, + 4208402283, + 1334575004, + 794476603, + 1469116925, + 2141997425, + 2257055253, + 3738100128, + 2800440412, + 2089921932, + 1630009851, + 138746902, + 3777561692, + 2821301381, + 2593962505, + 3273791895, + 576637448, + 410833297, + 3638804818, + 151198567, + 494283457, + 3064398905, + 3295715745, + 3928421681, + 1572458295, + 2771449612, + 3691682121, + 2193264079, + 3187159741, + 3304236742, + 1172781367, + 4020314672, + 1406058314, + 1733425624, + 74657511, + 870365815, + 4238651236, + 1606537681, + 4235541832, + 685386039, + 4129252828, + 2847373862, + 2912633577, + 681412184, + 743116107, + 1543224943, + 2061637462, + 4204939334, + 173568946, + 1114381165, + 3421798554, + ]; + + static final String llamaKey = String.fromCharCodes(List.generate( + _envieddatallamaKey.length, + (int i) => i, + growable: false, + ).map((int i) => _envieddatallamaKey[i] ^ _enviedkeyllamaKey[i])); + + static const List _enviedkeyserverPHP = [ + 136784060, + 3329979825, + 3963111006, + 275155448, + 1346893870, + 3643081673, + 844539938, + 3201830972, + 2240275309, + 1976641573, + 882466245, + 3994694885, + 2903906195, + 3937636000, + 777269346, + 754464604, + 2551192637, + 2699808318, + 2110753149, + 3808933615, + 2299845352, + 147834543, + 249091391, + 1721998470, + 1997931045, + 3728953200, + 1675657642, + 234794800, + ]; + + static const List _envieddataserverPHP = [ + 136784084, + 3329979845, + 3963110954, + 275155336, + 1346893917, + 3643081715, + 844539917, + 3201830931, + 2240275212, + 1976641621, + 882466220, + 3994694859, + 2903906272, + 3937636037, + 777269252, + 754464569, + 2551192655, + 2699808272, + 2110753041, + 3808933510, + 2299845278, + 147834570, + 249091344, + 1721998581, + 1997931072, + 3728953110, + 1675657679, + 234794818, + ]; + + static final String serverPHP = String.fromCharCodes(List.generate( + _envieddataserverPHP.length, + (int i) => i, + growable: false, + ).map((int i) => _envieddataserverPHP[i] ^ _enviedkeyserverPHP[i])); + + static const List _enviedkeyseferAlexandriaServer = [ + 2678342472, + 911184417, + 2158768204, + 998467215, + 3083374296, + 2149883830, + 892800160, + 2754182323, + 3199574306, + 966044870, + 3598396201, + 3181074056, + 2231062873, + 3018774722, + 3637627180, + 1675789918, + 866711761, + 1880740419, + 491729161, + 3288189254, + 2033470673, + 2654508839, + 4227816290, + 3944220878, + 2714480020, + 1508824018, + 1179598114, + 2526469296, + 2392336840, + 1655593147, + 3989870417, + 2957024241, + 1306650807, + 399063647, + ]; + + static const List _envieddataseferAlexandriaServer = [ + 2678342432, + 911184469, + 2158768184, + 998467327, + 3083374251, + 2149883788, + 892800143, + 2754182300, + 3199574353, + 966044835, + 3598396239, + 3181074157, + 2231062827, + 3018774691, + 3637627200, + 1675789883, + 866711721, + 1880740386, + 491729255, + 3288189218, + 2033470627, + 2654508878, + 4227816195, + 3944220896, + 2714480103, + 1508823995, + 1179598166, + 2526469333, + 2392336871, + 1655593160, + 3989870388, + 2957024151, + 1306650834, + 399063597, + ]; + + static final String seferAlexandriaServer = String.fromCharCodes( + List.generate( + _envieddataseferAlexandriaServer.length, + (int i) => i, + growable: false, + ).map((int i) => + _envieddataseferAlexandriaServer[i] ^ + _enviedkeyseferAlexandriaServer[i])); + + static const List _enviedkeywhatsapp = [ + 1865934477, + 470239689, + 4036471296, + 2160427406, + 4118066865, + 3283361244, + 4148590103, + 2500913758, + 3289510749, + 1650314614, + 1689493709, + 1358346019, + 2070078769, + 3913518243, + 3148768190, + 1442781110, + 1288086312, + 2062794235, + 3417590733, + 1651368454, + 1137143026, + 1513122744, + 2443321653, + 3154740397, + 841859175, + 2183935495, + 1415577355, + 2260587322, + 66539239, + 1801389163, + 956515969, + 3199754478, + 1713026935, + 2082575629, + 1922876038, + 425039213, + 2361743019, + 3868512309, + 3152855175, + 559820798, + 1118478308, + 2542036464, + 1364373848, + 2369241172, + 2988243622, + 227104355, + 3591056375, + 216746303, + 1962914655, + 2531420995, + 2939317724, + 3872885702, + 3282738572, + 3232671827, + 2264249589, + 1898464521, + 4236397185, + 3566093731, + 1658336297, + 2160936377, + 2776951058, + 860904727, + 3229909217, + 1150176268, + 3616654759, + 2700939400, + 3978798356, + 2201402828, + 108076149, + 3678927331, + 3067768326, + 1570754358, + 2217817676, + 1560848988, + 3784628055, + 4227127211, + 3635899623, + 2097722833, + 2420759675, + 618408425, + 3948031410, + 1690510567, + 1742737049, + 3552709002, + 3804175656, + 2525481113, + 3146825753, + 1998711895, + 2050727943, + 2829149535, + 788978160, + 1175696898, + 4170331080, + 2338259788, + 690172299, + 3854564381, + 2304396960, + 793199571, + 1568159346, + 1733125859, + 389177205, + 3698411061, + 3776076497, + 3844170192, + 202938393, + 2677636715, + 3597470318, + 2271388930, + 67407118, + 2804378997, + 2088523376, + 3648477881, + 2176057080, + 1418674012, + 3338953122, + 1497437562, + 2119728353, + 2628484369, + 1475170805, + 1055053098, + 1855099557, + 829431043, + 1553910249, + 173321112, + 3116769201, + 1053798782, + 1074206741, + 1180452413, + 780930116, + 4025252875, + 3344965525, + 774922988, + 1420761348, + 2576861369, + 3479691063, + 4260517407, + 3923144396, + 776879607, + 2784374088, + 3627545051, + 3170443413, + 56931634, + 534230463, + 413627036, + 158846251, + 374867456, + 2947920902, + 3312242211, + 3920439140, + 3757628273, + 3326871813, + 1129616875, + 2173889050, + 3273611449, + 2209014709, + 1054893635, + 274588319, + 1030060936, + 1225990859, + 1967920099, + 1500357118, + 4158317299, + 2715634413, + 3247534722, + 226355008, + 1060797540, + 3163788606, + 3886604503, + 1010193593, + 3169025688, + 4091748588, + 1310616799, + 1364105843, + 897660430, + 737780023, + 983087932, + 2622267459, + 1260736875, + 3246297987, + 3882012242, + 1276679860, + 635742828, + 1086973666, + 2918529318, + 3092934762, + 1735849887, + 125155234, + 2076129520, + 2445611883, + 854280602, + 3106518390, + 3672910932, + 3305019311, + 3335188740, + 3527337138, + 728200086, + 58950914, + 764490865, + 4100716152, + 3652135408, + 3997937220, + 1317895054, + 2815449943, + 660033916, + 4278045327, + 2833551708, + 3429833982, + 276938524, + 1553950989, + 1694119636, + 1740963759, + 1751476734, + 3750656267, + 3534508835, + 608920604, + 994882155, + 244482147, + 2962744634, + 663156684, + 2256811906, + 1076536936, + 140128007, + 2215911479, + 3196140294, + 3410165268, + ]; + + static const List _envieddatawhatsapp = [ + 1865934536, + 470239624, + 4036471361, + 2160427457, + 4118066885, + 3283361214, + 4148590157, + 2500913692, + 3289510670, + 1650314531, + 1689493638, + 1358346004, + 2070078725, + 3913518305, + 3148768241, + 1442781132, + 1288086399, + 2062794178, + 3417590708, + 1651368548, + 1137142981, + 1513122700, + 2443321712, + 3154740426, + 841859110, + 2183935607, + 1415577434, + 2260587363, + 66539155, + 1801389090, + 956516025, + 3199754454, + 1713026841, + 2082575700, + 1922876146, + 425039144, + 2361742994, + 3868512351, + 3152855254, + 559820695, + 1118478301, + 2542036385, + 1364373814, + 2369241112, + 2988243681, + 227104275, + 3591056256, + 216746252, + 1962914585, + 2531420946, + 2939317676, + 3872885669, + 3282738617, + 3232671799, + 2264249485, + 1898464576, + 4236397293, + 3566093799, + 1658336334, + 2160936431, + 2776951128, + 860904813, + 3229909122, + 1150176321, + 3616654814, + 2700939519, + 3978798417, + 2201402766, + 108076036, + 3678927277, + 3067768415, + 1570754384, + 2217817727, + 1560848943, + 3784628079, + 4227127259, + 3635899532, + 2097722810, + 2420759629, + 618408330, + 3948031464, + 1690510501, + 1742737068, + 3552709083, + 3804175640, + 2525481197, + 3146825842, + 1998711836, + 2050728050, + 2829149452, + 788978111, + 1175696984, + 4170331018, + 2338259775, + 690172356, + 3854564459, + 2304397037, + 793199497, + 1568159283, + 1733125840, + 389177121, + 3698411094, + 3776076453, + 3844170168, + 202938409, + 2677636642, + 3597470210, + 2271388992, + 67407174, + 2804378918, + 2088523281, + 3648477940, + 2176057006, + 1418673960, + 3338953153, + 1497437480, + 2119728315, + 2628484434, + 1475170694, + 1055053131, + 1855099633, + 829431112, + 1553910183, + 173321163, + 3116769252, + 1053798670, + 1074206835, + 1180452465, + 780930070, + 4025252940, + 3344965575, + 774922894, + 1420761396, + 2576861387, + 3479691103, + 4260517459, + 3923144361, + 776879501, + 2784374022, + 3627544989, + 3170443513, + 56931678, + 534230479, + 413627077, + 158846313, + 374867559, + 2947921003, + 3312242253, + 3920439042, + 3757628179, + 3326871917, + 1129616830, + 2173889147, + 3273611459, + 2209014758, + 1054893593, + 274588381, + 1030061009, + 1225990803, + 1967920007, + 1500357004, + 4158317255, + 2715634397, + 3247534828, + 226354989, + 1060797482, + 3163788554, + 3886604422, + 1010193660, + 3169025791, + 4091748507, + 1310616762, + 1364105784, + 897660476, + 737780050, + 983087949, + 2622267418, + 1260736826, + 3246298093, + 3882012166, + 1276679904, + 635742754, + 1086973591, + 2918529364, + 3092934675, + 1735849931, + 125155309, + 2076129417, + 2445611817, + 854280689, + 3106518333, + 3672910862, + 3305019373, + 3335188789, + 3527337215, + 728200142, + 58950991, + 764490758, + 4100716110, + 3652135333, + 3997937267, + 1317895135, + 2815449913, + 660033832, + 4278045405, + 2833551629, + 3429833914, + 276938596, + 1553951045, + 1694119606, + 1740963834, + 1751476648, + 3750656359, + 3534508882, + 608920699, + 994882082, + 244482097, + 2962744686, + 663156670, + 2256812010, + 1076536841, + 140128104, + 2215911512, + 3196140380, + 3410165328, + ]; + + static final String whatsapp = String.fromCharCodes(List.generate( + _envieddatawhatsapp.length, + (int i) => i, + growable: false, + ).map((int i) => _envieddatawhatsapp[i] ^ _enviedkeywhatsapp[i])); + + static const List _enviedkeywhatappID = [ + 3123272374, + 3828651595, + 4029932330, + 1607246416, + 1779628122, + 2831414386, + 639956309, + 814357000, + 3090170036, + 3378591476, + 258323974, + 3049708808, + 3852322243, + 3653663471, + 1679480947, + 4101228167, + ]; + + static const List _envieddatawhatappID = [ + 3123272325, + 3828651645, + 4029932307, + 1607246441, + 1779628137, + 2831414347, + 639956322, + 814357051, + 3090169986, + 3378591430, + 258324030, + 3049708857, + 3852322290, + 3653663447, + 1679480900, + 4101228222, + ]; + + static final String whatappID = String.fromCharCodes(List.generate( + _envieddatawhatappID.length, + (int i) => i, + growable: false, + ).map((int i) => _envieddatawhatappID[i] ^ _enviedkeywhatappID[i])); + + static const List _enviedkeyseferPaymentServer = [ + 3135591403, + 4052118669, + 1252878878, + 2326376361, + 2892565907, + 3141608763, + 3337838895, + 3127217716, + 522732804, + 673504242, + 3008226015, + 812786587, + 996271070, + 2014188411, + 2361945143, + 4265052590, + 3070533467, + 620957098, + 1474692178, + 3022997745, + 1899596157, + 4187766408, + 2427871948, + 20441730, + 493532712, + 3269520029, + ]; + + static const List _envieddataseferPaymentServer = [ + 3135591299, + 4052118777, + 1252878954, + 2326376409, + 2892565984, + 3141608705, + 3337838848, + 3127217691, + 522732919, + 673504151, + 3008225977, + 812786686, + 996271020, + 2014188299, + 2361945152, + 4265052544, + 3070533416, + 620957122, + 1474692157, + 3022997633, + 1899596114, + 4187766523, + 2427871913, + 20441828, + 493532749, + 3269520111, + ]; + + static final String seferPaymentServer = String.fromCharCodes( + List.generate( + _envieddataseferPaymentServer.length, + (int i) => i, + growable: false, + ).map((int i) => + _envieddataseferPaymentServer[i] ^ _enviedkeyseferPaymentServer[i])); + + static const List _enviedkeyseferCairoServer = [ + 4203282252, + 4137070837, + 2250967405, + 453566573, + 2752956968, + 1903263830, + 1889272289, + 611470739, + 1702129731, + 1876620994, + 454451364, + 3000433964, + 768284265, + 1321939726, + 2940756997, + 1044479748, + 3437110981, + 1265925004, + 998980043, + 2127742623, + 3514062751, + 3448706290, + 3197411473, + 3572048172, + 3923224580, + 988084329, + 315672878, + 1485538712, + 2629567749, + 3100733085, + 106899519, + 2854528337, + 837501440, + 1433498020, + 891021752, + 1149349037, + 2218971392, + 1623064706, + 3794151780, + 811867401, + 1158037355, + 2900434970, + 1244093694, + ]; + + static const List _envieddataseferCairoServer = [ + 4203282212, + 4137070721, + 2250967321, + 453566493, + 2752957019, + 1903263852, + 1889272270, + 611470780, + 1702129712, + 1876620967, + 454451414, + 3000434010, + 768284172, + 1321939836, + 2940757035, + 1044479863, + 3437110944, + 1265925098, + 998980014, + 2127742701, + 3514062769, + 3448706206, + 3197411576, + 3572048218, + 3923224673, + 988084294, + 315672925, + 1485538813, + 2629567843, + 3100733176, + 106899533, + 2854528383, + 837501539, + 1433498056, + 891021777, + 1149349070, + 2218971499, + 1623064749, + 3794151703, + 811867500, + 1158037261, + 2900435071, + 1244093580, + ]; + + static final String seferCairoServer = String.fromCharCodes( + List.generate( + _envieddataseferCairoServer.length, + (int i) => i, + growable: false, + ).map((int i) => + _envieddataseferCairoServer[i] ^ _enviedkeyseferCairoServer[i])); + + static const List _enviedkeyseferGizaServer = [ + 3386422574, + 658945938, + 3147852946, + 3436382974, + 2617576302, + 4107446200, + 1496752726, + 4156773746, + 915030253, + 1661851596, + 4145152485, + 2290014793, + 937712491, + 1057345618, + 1199060917, + 245219112, + 1900102055, + 2784879724, + 3531510454, + 1245124105, + 415336105, + 4005162117, + 1594071004, + 3641158419, + 3326798233, + 226565801, + 3600506810, + 1957536236, + 2818146872, + 1278273604, + ]; + + static const List _envieddataseferGizaServer = [ + 3386422598, + 658946022, + 3147853030, + 3436382862, + 2617576221, + 4107446146, + 1496752761, + 4156773725, + 915030154, + 1661851557, + 4145152415, + 2290014760, + 937712408, + 1057345591, + 1199060947, + 245219149, + 1900102101, + 2784879682, + 3531510489, + 1245124199, + 415336133, + 4005162220, + 1594070962, + 3641158518, + 3326798262, + 226565850, + 3600506847, + 1957536138, + 2818146909, + 1278273590, + ]; + + static final String seferGizaServer = String.fromCharCodes(List.generate( + _envieddataseferGizaServer.length, + (int i) => i, + growable: false, + ).map( + (int i) => _envieddataseferGizaServer[i] ^ _enviedkeyseferGizaServer[i])); + + static const List _enviedkeychatGPTkeySeferNew = [ + 670343961, + 2099436572, + 2748487954, + 410161662, + 2391316034, + 207643226, + 1482437577, + 1832494595, + 1720304821, + 2671997039, + 2928148491, + 561934326, + 1099778348, + 710596425, + 4099460131, + 3158026226, + 1801115082, + 108515838, + 762927687, + 2545011948, + 1646378309, + 2741216438, + 4148253487, + 4111334840, + 196042494, + 3750793718, + 1602169483, + 1706765565, + 1875609236, + 719986160, + 3637640023, + 2150028780, + 2446428740, + 778221324, + 1197846423, + 642707837, + 991110745, + 4239328672, + 2166327981, + 197916721, + 390785125, + 1740014208, + 19358397, + 2071127388, + 3942569885, + 2525572915, + 2260455209, + 190236529, + 3833237399, + 1717926805, + 461272987, + 1259175192, + 1829157857, + 3751862755, + 3093813446, + 4257394174, + 3064644496, + 2690120205, + ]; + + static const List _envieddatachatGPTkeySeferNew = [ + 670344035, + 2099436667, + 2748487999, + 410161572, + 2391316086, + 207643189, + 1482437512, + 1832494665, + 1720304854, + 2671996974, + 2928148569, + 561934265, + 1099778379, + 710596359, + 4099460219, + 3158026136, + 1801115053, + 108515724, + 762927618, + 2545011877, + 1646378256, + 2741216398, + 4148253513, + 4111334899, + 196042429, + 3750793679, + 1602169555, + 1706765455, + 1875609324, + 719986071, + 3637639938, + 2150028713, + 2446428784, + 778221405, + 1197846499, + 642707727, + 991110699, + 4239328716, + 2166328028, + 197916672, + 390785052, + 1740014313, + 19358408, + 2071127332, + 3942569901, + 2525572953, + 2260455269, + 190236482, + 3833237491, + 1717926876, + 461273039, + 1259175243, + 1829157817, + 3751862673, + 3093813406, + 4257394066, + 3064644562, + 2690120289, + ]; + + static final String chatGPTkeySeferNew = String.fromCharCodes( + List.generate( + _envieddatachatGPTkeySeferNew.length, + (int i) => i, + growable: false, + ).map((int i) => + _envieddatachatGPTkeySeferNew[i] ^ _enviedkeychatGPTkeySeferNew[i])); + + static const List _enviedkeycohere = [ + 1045774623, + 2744562576, + 1084731650, + 106832296, + 1127252310, + 3505122781, + 3450952233, + 1816065711, + 4086632613, + 2016421943, + 3197997299, + 4117044866, + 2349760624, + 2068792646, + 3008799040, + 3460651405, + 2340769555, + 642391604, + 984870091, + 1610370150, + 3710112192, + 3224999419, + 4186071622, + 3744637460, + 4195497261, + 3623198901, + 1835508085, + 3545387579, + 1677395378, + 3109543583, + 568039885, + 513044574, + 2085317912, + 1389830393, + 237991368, + 49936519, + 2408640372, + 1119872736, + 2956844789, + 738253549, + 2595880821, + 119058790, + 117257915, + 2562399525, + 2490971307, + 3386261537, + 4273516650, + ]; + + static const List _envieddatacohere = [ + 1045774686, + 2744562661, + 1084731758, + 106832351, + 1127252274, + 3505122789, + 3450952272, + 1816065690, + 4086632694, + 2016421991, + 3197997220, + 4117044973, + 2349760515, + 2068792694, + 3008799016, + 3460651463, + 2340769659, + 642391640, + 984870028, + 1610370134, + 3710112180, + 3224999316, + 4186071571, + 3744637554, + 4195497237, + 3623198930, + 1835508026, + 3545387603, + 1677395431, + 3109543626, + 568039871, + 513044526, + 2085318014, + 1389830348, + 237991321, + 49936565, + 2408640288, + 1119872688, + 2956844696, + 738253499, + 2595880754, + 119058750, + 117257929, + 2562399613, + 2490971335, + 3386261603, + 4273516550, + ]; + + static final String cohere = String.fromCharCodes(List.generate( + _envieddatacohere.length, + (int i) => i, + growable: false, + ).map((int i) => _envieddatacohere[i] ^ _enviedkeycohere[i])); + + static const List _enviedkeyclaudeAiAPI = [ + 1286261501, + 1227360073, + 2952728173, + 2354259663, + 2734802162, + 1302820208, + 3065292227, + 3507239645, + 4078311878, + 2112675487, + 648610177, + 2118298054, + 2638050511, + 1937932531, + 2642632417, + 42054778, + 1009858078, + 1088733390, + 2630739162, + 3645657724, + 1242478334, + 3956356083, + 1865989582, + 4206381823, + 378815095, + 1887896035, + 1629228110, + 681546834, + 2895863875, + 2077738296, + 3089149287, + 1767475329, + 2277836263, + 4276644060, + 1019715367, + 3728570410, + 1051861764, + 3274295669, + 3481367260, + 2276933372, + 2027178921, + 3230921621, + 3883618989, + 3234434263, + 1075262783, + 1422076536, + 3391696697, + 248256319, + 4232634116, + 1708850093, + 2900579530, + 1748486427, + 324082811, + 313911562, + 3328504268, + 690200481, + 4097209222, + 2072968481, + 761748753, + 1480151332, + 2438613159, + 263392568, + 2949935942, + 2665525141, + 1169719388, + 594734272, + 1829781356, + 4056791317, + 3082688623, + 3035704111, + 992106038, + 1881981912, + 2942930372, + 1864236852, + 2976155710, + 2554631886, + 1193741133, + 2613181932, + 225078980, + 2025245188, + 4092831578, + 2173858450, + 623467418, + 2758772568, + 4051468311, + 2728777548, + 2346801758, + 2071179120, + 1925714863, + 3163977090, + 1229827609, + 471409727, + 3108392502, + 760689892, + 1665919829, + 572445798, + 3954887991, + 1347529306, + 2191862636, + 470979311, + 4025576152, + 3631889940, + 4022823024, + 2787080048, + 2771745443, + 2012572480, + 3626893289, + 1917492338, + 3873399792, + 1093713953, + 4019497347, + 3981403722, + 2406730306, + 2912208786, + 2147799941, + ]; + + static const List _envieddataclaudeAiAPI = [ + 1286261383, + 1227360046, + 2952728128, + 2354259646, + 2734802064, + 1302820115, + 3065292270, + 3507239596, + 4078311856, + 2112675568, + 648610226, + 2118298111, + 2638050467, + 1937932510, + 2642632345, + 42054701, + 1009858129, + 1088733366, + 2630739091, + 3645657659, + 1242478217, + 3956356004, + 1865989530, + 4206381744, + 378814989, + 1887895968, + 1629228040, + 681546768, + 2895863853, + 2077738353, + 3089149246, + 1767475410, + 2277836204, + 4276643991, + 1019715407, + 3728570444, + 1051861885, + 3274295567, + 3481367171, + 2276933303, + 2027179007, + 3230921684, + 3883619035, + 3234434213, + 1075262839, + 1422076501, + 3391696655, + 248256352, + 4232634160, + 1708850167, + 2900579471, + 1748486481, + 324082743, + 313911612, + 3328504308, + 690200550, + 4097209305, + 2072968560, + 761748819, + 1480151404, + 2438613141, + 263392526, + 2949935913, + 2665525232, + 1169719304, + 594734223, + 1829781281, + 4056791384, + 3082688512, + 3035704190, + 992106051, + 1881981887, + 2942930429, + 1864236927, + 2976155723, + 2554631809, + 1193741095, + 2613181830, + 225078927, + 2025245271, + 4092831498, + 2173858509, + 623467483, + 2758772588, + 4051468356, + 2728777599, + 2346801677, + 2071179045, + 1925714923, + 3163977198, + 1229827707, + 471409735, + 3108392548, + 760689885, + 1665919793, + 572445715, + 3954888033, + 1347529248, + 2191862531, + 470979262, + 4025576181, + 3631890009, + 4022822939, + 2787079976, + 2771745532, + 2012572437, + 3626893240, + 1917492259, + 3873399713, + 1093714041, + 4019497457, + 3981403666, + 2406730286, + 2912208848, + 2147800041, + ]; + + static final String claudeAiAPI = String.fromCharCodes(List.generate( + _envieddataclaudeAiAPI.length, + (int i) => i, + growable: false, + ).map((int i) => _envieddataclaudeAiAPI[i] ^ _enviedkeyclaudeAiAPI[i])); + + static const List _enviedkeypayPalClientId = [ + 1158962379, + 307677221, + 615712910, + 2091728334, + 1835747518, + 3983445529, + 2925963708, + 2565680115, + 2379419404, + 1390035600, + 3628420267, + 977164944, + 4248863076, + 2089289321, + 2888202633, + 4141985015, + 3955937220, + 3662612321, + 944909612, + 2547814107, + 1964166411, + 1366326452, + 2945845854, + 471938061, + 2315401231, + 2837215939, + 4113056208, + 1804517706, + 1272698707, + 356483835, + 3976334097, + 3479103913, + 40618663, + 3876402308, + 1584600206, + 1734468373, + 2325869756, + 2628653592, + 1200498657, + 304578131, + 4084429047, + 3466811532, + 2367252697, + 1484687295, + 3692688838, + 741868302, + 1227885823, + 1347642999, + 2623240903, + 2311775255, + 1257099472, + 1499881622, + 3567469936, + 167880220, + 2013398832, + 1993595998, + 1940972656, + 3051157831, + 2514663168, + 4226507786, + 2972368284, + 416284699, + 3995589828, + 4181110079, + 3713709091, + 3251077871, + 1999364607, + 2107411583, + 1633375779, + 3722134016, + 368224648, + 385303178, + 3449035994, + 1180190181, + 4089557288, + 47956423, + 3102393398, + 1816001500, + 315426149, + 3117497924, + 840224386, + 1584246848, + 990038207, + 3527220974, + 722112166, + 3773320437, + 1447054960, + ]; + + static const List _envieddatapayPalClientId = [ + 1158962330, + 307677284, + 615712962, + 2091728311, + 1835747539, + 3983445621, + 2925963738, + 2565680061, + 2379419461, + 1390035621, + 3628420351, + 977165034, + 4248862992, + 2089289309, + 2888202746, + 4141984986, + 3955937213, + 3662612242, + 944909635, + 2547814049, + 1964166461, + 1366326466, + 2945845786, + 471938105, + 2315401296, + 2837215917, + 4113056161, + 1804517650, + 1272698723, + 356483752, + 3976334148, + 3479103965, + 40618700, + 3876402375, + 1584600273, + 1734468452, + 2325869797, + 2628653646, + 1200498636, + 304578054, + 4084428944, + 3466811623, + 2367252716, + 1484687320, + 3692688807, + 741868355, + 1227885728, + 1347642959, + 2623240861, + 2311775290, + 1257099451, + 1499881713, + 3567469892, + 167880272, + 2013398789, + 1993596013, + 1940972571, + 3051157887, + 2514663253, + 4226507903, + 2972368356, + 416284740, + 3995589872, + 4181110101, + 3713709158, + 3251077816, + 1999364519, + 2107411515, + 1633375816, + 3722134094, + 368224760, + 385303250, + 3449035933, + 1180190134, + 4089557375, + 47956375, + 3102393414, + 1816001429, + 315426079, + 3117497856, + 840224452, + 1584246808, + 990038221, + 3527220918, + 722112202, + 3773320375, + 1447054876, + ]; + + static final String payPalClientId = String.fromCharCodes(List.generate( + _envieddatapayPalClientId.length, + (int i) => i, + growable: false, + ).map((int i) => _envieddatapayPalClientId[i] ^ _enviedkeypayPalClientId[i])); + + static const List _enviedkeypayPalSecret = [ + 739732313, + 2664767087, + 3572624635, + 1907728500, + 1861724185, + 2142646064, + 1931393997, + 2697781641, + 1210895087, + 2084852298, + 1135444872, + 3420476071, + 2841772834, + 3524405220, + 661189914, + 3976958655, + 1062936559, + 3056130150, + 184616341, + 2599483555, + 4253680559, + 1986033411, + 1452412727, + 4092960152, + 751659217, + 1985211052, + 2241786935, + 828446056, + 398348400, + 3295906472, + 3802132728, + 148240941, + 2536173005, + 2048208747, + 3195521388, + 3987349740, + 829115356, + 683912346, + 2027393185, + 31934422, + 2313609525, + 3287629605, + 1613062420, + 4034510835, + 2921832973, + 3354260814, + 2289945782, + 2184901124, + 2656934831, + 4012045457, + 3963477787, + 334752317, + 1421499989, + 41542685, + 3321454589, + 3063175331, + 2013768162, + 1527425867, + 3270244073, + 2648257151, + 313269852, + 3743230470, + 198051244, + 393316185, + 33594026, + 3723537188, + 3120929165, + 4000357751, + 2281273248, + 3503743097, + 1657804135, + 1750641043, + 720525904, + 1626843600, + 4215304532, + 2628940815, + 3035320362, + 2869518997, + 2716962910, + 387463954, + 2997368722, + 3555306019, + 2326419286, + 2406185964, + 106284720, + 69484099, + ]; + + static const List _envieddatapayPalSecret = [ + 739732243, + 2664767021, + 3572624570, + 1907728437, + 1861724271, + 2142646081, + 1931393927, + 2697781720, + 1210895016, + 2084852255, + 1135444987, + 3420476140, + 2841772902, + 3524405204, + 661189952, + 3976958677, + 1062936455, + 3056130130, + 184616414, + 2599483593, + 4253680586, + 1986033504, + 1452412749, + 4092960224, + 751659191, + 1985211118, + 2241786993, + 828445968, + 398348381, + 3295906459, + 3802132672, + 148241022, + 2536172969, + 2048208647, + 3195521294, + 3987349669, + 829115279, + 683912367, + 2027393175, + 31934336, + 2313609575, + 3287629672, + 1613062444, + 4034510781, + 2921833033, + 3354260776, + 2289945811, + 2184901170, + 2656934850, + 4012045563, + 3963477846, + 334752344, + 1421499919, + 41542743, + 3321454485, + 3063175405, + 2013768110, + 1527425793, + 3270243980, + 2648257044, + 313269865, + 3743230558, + 198051275, + 393316104, + 33594089, + 3723537237, + 3120929222, + 4000357684, + 2281273320, + 3503742989, + 1657804085, + 1750641141, + 720525926, + 1626843549, + 4215304510, + 2628940893, + 3035320403, + 2869519032, + 2716962872, + 387463978, + 2997368778, + 3555306065, + 2326419214, + 2406185856, + 106284786, + 69484079, + ]; + + static final String payPalSecret = String.fromCharCodes(List.generate( + _envieddatapayPalSecret.length, + (int i) => i, + growable: false, + ).map((int i) => _envieddatapayPalSecret[i] ^ _enviedkeypayPalSecret[i])); + + static const List _enviedkeygeminiApi = [ + 3345560342, + 2922573360, + 1206957034, + 3220621402, + 3050097607, + 672497970, + 1763652323, + 2964366469, + 260724265, + 1619853423, + 2893504212, + 543645032, + 1855933033, + 1572595655, + 2621250033, + 499168338, + 3832536323, + 1874863324, + 901521756, + 106465515, + 408371901, + 425942735, + 3316378247, + 2041707989, + 1277518095, + 1172032096, + 3879689643, + 2959900401, + 2185145793, + 1175924965, + 2580909975, + 447396632, + 1735402539, + 667490449, + 194829623, + 2359972406, + 2335681577, + 3443479920, + 3425854100, + 1346354876, + 2687030839, + 4201914926, + 433105072, + 3281090046, + 1123559874, + 2746285635, + ]; + + static const List _envieddatageminiApi = [ + 3345560391, + 2922573439, + 1206956935, + 3220621355, + 3050097565, + 672497985, + 1763652274, + 2964366556, + 260724292, + 1619853407, + 2893504236, + 543644958, + 1855932933, + 1572595592, + 2621249920, + 499168312, + 3832536394, + 1874863339, + 901521719, + 106465415, + 408371947, + 425942661, + 3316378337, + 2041707939, + 1277518175, + 1172032084, + 3879689724, + 2959900339, + 2185145735, + 1175924896, + 2580910072, + 447396733, + 1735402566, + 667490555, + 194829648, + 2359972431, + 2335681562, + 3443479881, + 3425854114, + 1346354901, + 2687030895, + 4201914972, + 433105128, + 3281089938, + 1123559808, + 2746285615, + ]; + + static final String geminiApi = String.fromCharCodes(List.generate( + _envieddatageminiApi.length, + (int i) => i, + growable: false, + ).map((int i) => _envieddatageminiApi[i] ^ _enviedkeygeminiApi[i])); + + static const List _enviedkeygeminiApiMasa = [ + 2881515655, + 3243653102, + 3919061164, + 529731162, + 2789203300, + 1614747035, + 1520454485, + 197748373, + 1136974296, + 2701090237, + 2670231970, + 1873094193, + 3568739763, + 369177359, + 1742142770, + 1762870963, + 1684266105, + 3143254790, + 2025583498, + 3751467200, + 2942208825, + 3918528191, + 4213025600, + 1752012011, + 2963148183, + 2146182955, + 197502139, + 1484527997, + 194812885, + 2782339502, + 490271811, + 4270919468, + 2235264425, + 178856990, + 3783115939, + 3890150072, + 3296843513, + 549847513, + 3362130755, + 4028884949, + 4174997294, + 2134697142, + 4282717313, + 2018022131, + 3105267020, + 2379364791, + ]; + + static const List _envieddatageminiApiMasa = [ + 2881515734, + 3243653025, + 3919061185, + 529731115, + 2789203262, + 1614747112, + 1520454404, + 197748444, + 1136974248, + 2701090265, + 2670232047, + 1873094149, + 3568739825, + 369177437, + 1742142785, + 1762871032, + 1684266004, + 3143254887, + 2025583566, + 3751467146, + 2942208886, + 3918528239, + 4213025655, + 1752011919, + 2963148237, + 2146183003, + 197502094, + 1484527952, + 194812854, + 2782339480, + 490271757, + 4270919547, + 2235264463, + 178857085, + 3783115979, + 3890150031, + 3296843433, + 549847448, + 3362130735, + 4028884868, + 4174997366, + 2134697156, + 4282717401, + 2018022047, + 3105266958, + 2379364827, + ]; + + static final String geminiApiMasa = String.fromCharCodes(List.generate( + _envieddatageminiApiMasa.length, + (int i) => i, + growable: false, + ).map((int i) => _envieddatageminiApiMasa[i] ^ _enviedkeygeminiApiMasa[i])); + + static const List _enviedkeyagoraAppId = [ + 3089331006, + 3560766277, + 825969137, + 906493642, + 3507883174, + 3629478722, + 716145019, + 736618674, + 3814543006, + 531262085, + 1069707472, + 1794745024, + 1799477682, + 3997601683, + 2384816050, + 1180863786, + 922162112, + 3729452903, + 1820971096, + 661727629, + 377334609, + 1832494407, + 3063815916, + 1221571281, + 3714335252, + 309885433, + 1556167695, + 2537322565, + 3970383379, + 2095609686, + 2280663226, + 1009151530, + 578649856, + 994147052, + 3565099187, + 1606180888, + 1625646757, + 507544281, + 3074868305, + ]; + + static const List _envieddataagoraAppId = [ + 3089330953, + 3560766324, + 825969097, + 906493682, + 3507883158, + 3629478692, + 716144969, + 736618712, + 3814543016, + 531262134, + 1069707494, + 1794745007, + 1799477639, + 3997601699, + 2384816011, + 1180863808, + 922162162, + 3729452883, + 1820971041, + 661727672, + 377334627, + 1832494462, + 3063815896, + 1221571301, + 3714335276, + 309885385, + 1556167798, + 2537322614, + 3970383395, + 2095609635, + 2280663170, + 1009151518, + 578649912, + 994146996, + 3565099201, + 1606180928, + 1625646793, + 507544219, + 3074868285, + ]; + + static final String agoraAppId = String.fromCharCodes(List.generate( + _envieddataagoraAppId.length, + (int i) => i, + growable: false, + ).map((int i) => _envieddataagoraAppId[i] ^ _enviedkeyagoraAppId[i])); + + static const List _enviedkeyagoraAppCertificate = [ + 3690479738, + 2491892003, + 3380135185, + 4178313776, + 355299000, + 1512500202, + 4131100492, + 1598833776, + 2234394556, + 3844317455, + 2753898166, + 2893052929, + 1930225798, + 1129918226, + 4250912199, + 3782575902, + 2789606497, + 739785026, + 491873921, + 1492281286, + 2654777686, + 1100222529, + 1006688894, + 886277114, + 748931844, + 2647871976, + 1819981845, + 2568220181, + 616719616, + 3098653489, + 2516170827, + 3623309345, + 2538829850, + 3098051278, + 4220928193, + 2594251663, + 3217786871, + 2443608156, + 4099109288, + 3557800709, + ]; + + static const List _envieddataagoraAppCertificate = [ + 3690479632, + 2491891986, + 3380135206, + 4178313793, + 355298945, + 1512500190, + 4131100536, + 1598833669, + 2234394504, + 3844317494, + 2753898117, + 2893052984, + 1930225846, + 1129918328, + 4250912175, + 3782575983, + 2789606486, + 739785079, + 491873977, + 1492281267, + 2654777703, + 1100222583, + 1006688842, + 886277059, + 748931888, + 2647871964, + 1819981869, + 2568220260, + 616719666, + 3098653512, + 2516170877, + 3623309401, + 2538829948, + 3098051259, + 4220928153, + 2594251773, + 3217786799, + 2443608112, + 4099109354, + 3557800809, + ]; + + static final String agoraAppCertificate = String.fromCharCodes( + List.generate( + _envieddataagoraAppCertificate.length, + (int i) => i, + growable: false, + ).map((int i) => + _envieddataagoraAppCertificate[i] ^ + _enviedkeyagoraAppCertificate[i])); + + static const List _enviedkeypayPalClientIdLive = [ + 3498212718, + 2040045360, + 1454338361, + 2925702768, + 4032876285, + 330197820, + 2964508372, + 4290089181, + 4088742651, + 3184626717, + 1125682327, + 1288414844, + 2532221751, + 3393819830, + 1255156312, + 2081028481, + 1786731466, + 2556256597, + 2074018026, + 4278464473, + 3690208954, + 789657379, + 1499646751, + 2108045939, + 2387099979, + 4212594781, + 1185264404, + 3443914588, + 484521154, + 1692885126, + 1808261924, + 308124766, + 3104586301, + 3054522469, + 452743987, + 4115752992, + 3679384335, + 756182608, + 769834775, + 103870765, + 2361154858, + 880981506, + 268938416, + 781623876, + 3893743452, + 3239800154, + 1147112662, + 4214232654, + 2699205678, + 630232630, + 1395784349, + 2568589887, + 3672114013, + 3304610955, + 2379491329, + 1864385115, + 2066528676, + 219147460, + 2637806174, + 1205524959, + 2664432498, + 1587265586, + 4163318448, + 1661196011, + 3867917677, + 1063528552, + 3109017888, + 3949690742, + 1045420231, + 191834221, + 1746801123, + 3330559930, + 2439707600, + 755220539, + 929533834, + 1202916867, + 909027002, + 3009628763, + 3574240305, + 2962886476, + 1748507431, + 4245650729, + 2109266774, + 3185727328, + 4003696869, + 3613827171, + 2744545564, + ]; + + static const List _envieddatapayPalClientIdLive = [ + 3498212671, + 2040045418, + 1454338431, + 2925702683, + 4032876183, + 330197885, + 2964508347, + 4290089095, + 4088742557, + 3184626778, + 1125682403, + 1288414738, + 2532221776, + 3393819896, + 1255156267, + 2081028580, + 1786731448, + 2556256569, + 2074017926, + 4278464495, + 3690208968, + 789657360, + 1499646844, + 2108045872, + 2387100030, + 4212594795, + 1185264460, + 3443914544, + 484521203, + 1692885237, + 1808262002, + 308124690, + 3104586348, + 3054522382, + 452744029, + 4115752981, + 3679384427, + 756182557, + 769834869, + 103870804, + 2361154895, + 880981600, + 268938456, + 781623870, + 3893743382, + 3239800067, + 1147112675, + 4214232695, + 2699205739, + 630232679, + 1395784366, + 2568589911, + 3672113959, + 3304611004, + 2379491416, + 1864385059, + 2066528709, + 219147393, + 2637806127, + 1205524890, + 2664432438, + 1587265643, + 4163318496, + 1661195967, + 3867917624, + 1063528494, + 3109017923, + 3949690663, + 1045420176, + 191834140, + 1746801045, + 3330559967, + 2439707520, + 755220570, + 929533915, + 1202916918, + 909027055, + 3009628689, + 3574240379, + 2962886426, + 1748507509, + 4245650801, + 2109266724, + 3185727288, + 4003696777, + 3613827105, + 2744545648, + ]; + + static final String payPalClientIdLive = String.fromCharCodes( + List.generate( + _envieddatapayPalClientIdLive.length, + (int i) => i, + growable: false, + ).map((int i) => + _envieddatapayPalClientIdLive[i] ^ _enviedkeypayPalClientIdLive[i])); + + static const List _enviedkeypayPalSecretLive = [ + 1686803173, + 2549344406, + 2999418297, + 981626647, + 1527658308, + 4017623410, + 1723825857, + 4100347843, + 3032197825, + 1138415466, + 1003701203, + 514593984, + 2985297447, + 3253769350, + 3982308256, + 1067056987, + 2330571008, + 2838835968, + 1679919862, + 922383968, + 3522006032, + 4214936532, + 4114126476, + 2367435495, + 928096466, + 3805436937, + 2633603398, + 1111413243, + 1579940898, + 308985158, + 2491025730, + 3597640978, + 3804648423, + 3533580722, + 1856231693, + 2075258072, + 2571185761, + 313383712, + 1165529499, + 2509825669, + 2363882239, + 2527332889, + 3617498090, + 3356063982, + 808951948, + 3000210089, + 3164426459, + 2293343536, + 67466769, + 2311640352, + 1534605779, + 1632261458, + 3598863213, + 15219130, + 1635084602, + 3113121575, + 2119034386, + 847082734, + 3747580858, + 2004700801, + 3829608622, + 3984960622, + 2171756218, + 3054571568, + 3367881948, + 803605721, + 764673468, + 3721621437, + 3506835852, + 909939506, + 1403965023, + 2340131697, + 2519720416, + 904668221, + 4276524814, + 3753718784, + 2516371154, + 1589183634, + 181349719, + 3828000718, + 67709880, + 671390186, + 3173014221, + 3465463940, + 941857293, + 4037575635, + 2172377945, + 296532492, + ]; + + static const List _envieddatapayPalSecretLive = [ + 1686803119, + 2549344455, + 2999418365, + 981626710, + 1527658256, + 4017623299, + 1723825834, + 4100347816, + 3032197807, + 1138415406, + 1003701173, + 514593961, + 2985297505, + 3253769462, + 3982308325, + 1067056922, + 2330571086, + 2838836022, + 1679919814, + 922383915, + 3522006098, + 4214936544, + 4114126588, + 2367435424, + 928096418, + 3805437005, + 2633603367, + 1111413169, + 1579940936, + 308985151, + 2491025715, + 3597641040, + 3804648358, + 3533580758, + 1856231732, + 2075258034, + 2571185689, + 313383789, + 1165529561, + 2509825749, + 2363882127, + 2527332963, + 3617498045, + 3356063931, + 808951997, + 3000210169, + 3164426474, + 2293343579, + 67466786, + 2311640424, + 1534605794, + 1632261432, + 3598863159, + 15219154, + 1635084651, + 3113121613, + 2119034492, + 847082713, + 3747580809, + 2004700868, + 3829608678, + 3984960541, + 2171756273, + 3054571617, + 3367881906, + 803605688, + 764673419, + 3721621385, + 3506835932, + 909939466, + 1403964975, + 2340131656, + 2519720408, + 904668245, + 4276524905, + 3753718863, + 2516371132, + 1589183711, + 181349686, + 3828000665, + 67709928, + 671390141, + 3173014165, + 3465464054, + 941857365, + 4037575615, + 2172377883, + 296532576, + ]; + + static final String payPalSecretLive = String.fromCharCodes( + List.generate( + _envieddatapayPalSecretLive.length, + (int i) => i, + growable: false, + ).map((int i) => + _envieddatapayPalSecretLive[i] ^ _enviedkeypayPalSecretLive[i])); + + static const List _enviedkeyintegrationIdPayMob = [ + 1417526965, + 3263383533, + 91540503, + 1899043115, + 441464185, + 1408303186, + 739953865, + 373704305, + 2877724056, + 1385385587, + 1213934967, + 1982766086, + 2741497519, + ]; + + static const List _envieddataintegrationIdPayMob = [ + 1417526917, + 3263383519, + 91540516, + 1899043100, + 441464143, + 1408303201, + 739953913, + 373704233, + 2877724138, + 1385385515, + 1213934875, + 1982766148, + 2741497539, + ]; + + static final String integrationIdPayMob = String.fromCharCodes( + List.generate( + _envieddataintegrationIdPayMob.length, + (int i) => i, + growable: false, + ).map((int i) => + _envieddataintegrationIdPayMob[i] ^ + _enviedkeyintegrationIdPayMob[i])); + + static const List _enviedkeypasswordPayMob = [ + 1112005101, + 1529182612, + 2713540861, + 795328389, + 1645747591, + 830558058, + 3235663825, + 2402337045, + 1704058611, + 1807481934, + 4114759014, + 2442548906, + 3879069201, + 1254582425, + 1835722365, + 1675986163, + 2985281344, + 3972423584, + 3430383610, + 3697632766, + 1092163911, + 3949013966, + ]; + + static const List _envieddatapasswordPayMob = [ + 1112005002, + 1529182676, + 2713540755, + 795328494, + 1645747651, + 830558040, + 3235663858, + 2402337068, + 1704058570, + 1807481893, + 4114758983, + 2442548930, + 3879069269, + 1254582470, + 1835722323, + 1675986052, + 2985281304, + 3972423634, + 3430383522, + 3697632658, + 1092163845, + 3949013922, + ]; + + static final String passwordPayMob = String.fromCharCodes(List.generate( + _envieddatapasswordPayMob.length, + (int i) => i, + growable: false, + ).map((int i) => _envieddatapasswordPayMob[i] ^ _enviedkeypasswordPayMob[i])); + + static const List _enviedkeyusernamePayMob = [ + 404532329, + 2709626969, + 581294901, + 3232867313, + 1847531785, + 3160654111, + 1403524875, + 2787863372, + 4118201515, + 2889116121, + 1132769932, + 2720512716, + 1077363859, + 2108498877, + 3720923995, + 2714342127, + 1746163795, + ]; + + static const List _envieddatausernamePayMob = [ + 404532314, + 2709626990, + 581294854, + 3232867264, + 1847531824, + 3160654126, + 1403524923, + 2787863416, + 4118201499, + 2889116140, + 1132769982, + 2720512660, + 1077363937, + 2108498917, + 3720923959, + 2714342061, + 1746163775, + ]; + + static final String usernamePayMob = String.fromCharCodes(List.generate( + _envieddatausernamePayMob.length, + (int i) => i, + growable: false, + ).map((int i) => _envieddatausernamePayMob[i] ^ _enviedkeyusernamePayMob[i])); + + static const List _enviedkeypayMobApikey = [ + 2156512160, + 2749747479, + 2969388392, + 4055118126, + 3045577699, + 490203723, + 1774417868, + 1107059065, + 3170744337, + 1084230053, + 1865849046, + 2877134478, + 702377432, + 1226091863, + 26846506, + 3996652510, + 1411496581, + 2926602357, + 2700119870, + 2606836392, + 1354578579, + 1033924352, + 74228097, + 4170247195, + 873360593, + 2748318779, + 2263315153, + 2826384014, + 3582413331, + 2221990706, + 3944242822, + 3029543767, + 2872488480, + 1835503418, + 3659818944, + 2366662398, + 1008586299, + 2826666190, + 1329641716, + 3652989632, + 2935593741, + 1687202690, + 1526780746, + 2343408140, + 3808135129, + 3118221645, + 3732165185, + 1281794021, + 130140203, + 283700504, + 2589836030, + 4183975573, + 590339126, + 1029997274, + 967061642, + 1997594046, + 2908052586, + 358914832, + 2178363839, + 460103444, + 1129576238, + 3718201627, + 347568641, + 769425599, + 67474002, + 3005327881, + 2720134884, + 1890740325, + 2287546695, + 4181183831, + 9909565, + 657273669, + 1540255763, + 1937567420, + 2689046926, + 2801055376, + 3156051618, + 827077985, + 3720991582, + 1381992539, + 2387310779, + 1094848860, + 778372855, + 2351797210, + 677595179, + 1764857131, + 2702644448, + 1499750759, + 3964245161, + 706925967, + 822010807, + 2825696467, + 3655535118, + 1923752780, + 941429714, + 876276332, + 2311983886, + 1078529168, + 2475054251, + 982128516, + 4151418621, + 4166218094, + 3719554534, + 3677111207, + 1854762695, + 2494078977, + 2791331835, + 147021843, + 3307971400, + 2841905408, + 2160860031, + 1755134641, + 2919044266, + 2997840411, + 233600554, + 1894569097, + 3800206825, + 3277743361, + 3598016087, + 3622885952, + 3019330690, + 3073259091, + 428008179, + 17697518, + 189165416, + 2223665148, + 3524318539, + 1425751564, + 1235952693, + 3407110963, + 3444172054, + 3902980920, + 3380627945, + 2195283964, + 3433027888, + 3040448066, + 2612876586, + 4010989892, + 2098590187, + 1412304955, + 1104308905, + 3647129655, + 2064800519, + 3677870624, + 3366286947, + 2161821326, + 1245059411, + 181993155, + 2333166070, + 3087212255, + 3414822859, + 2663797591, + 1585226605, + 2439119269, + 1102516543, + 312816208, + 1807883815, + 2906527926, + 1131150783, + 515039613, + 3639364064, + 462548574, + 3481604820, + 409454027, + 2163281407, + 2048657469, + 2316664516, + 3525401088, + 1948308916, + 2874566167, + 2877090138, + 2375647808, + 1798523337, + 440692631, + 2568342811, + 626165605, + 770246022, + 553625395, + 1903599032, + 2936931736, + 1916980224, + 1183337777, + 3303541017, + 219135959, + 3387217171, + 606048426, + 3502987509, + 2774556799, + 2852112371, + 1220500395, + 222217586, + 639136462, + 516121620, + 2739283643, + 186450556, + 4211827752, + 1479788747, + 1096524592, + 166573123, + 3096252948, + 1318236592, + 3224218270, + 801477577, + 1079487725, + 1911596875, + 4118436121, + 2947939205, + 2409539994, + 1117520408, + 1221013606, + 736949044, + 1715723768, + 3531267653, + 2584008039, + 1549863685, + 978921404, + 1940456683, + 1948395538, + 4075485643, + 1734480163, + 3011498975, + 476682628, + 448623030, + 1888546377, + 1542374769, + 3544407226, + 2788333141, + 831247260, + 2655087416, + 2435564998, + 2703729490, + 2303253015, + 3362011500, + 2373933917, + 212219962, + 3941400335, + 2542751906, + 1293962739, + 133112821, + 2159734784, + 2114068651, + 1906882530, + 470947538, + 2888653229, + 810525124, + 2409353275, + 3303289369, + 2147064768, + 985776000, + 3920845653, + 3522395285, + 3328873357, + 1626979618, + 618591160, + 3285925362, + 1813887464, + 2533894586, + 1524897332, + 2094947551, + 4281721758, + 685207670, + 3758574822, + 3008126681, + 1168427282, + 1600196531, + 72800162, + 824806799, + 1395876299, + 1798202691, + 1223761745, + 691756726, + 4019761135, + 3124667227, + 4072198595, + 308739772, + 2164639394, + 2133827489, + 3751235874, + 3080714168, + 315849707, + 2039632867, + 3550041251, + 652991768, + 3057667210, + 52448976, + 540248956, + ]; + + static const List _envieddatapayMobApikey = [ + 2156512237, + 2749747539, + 2969388314, + 4055118185, + 3045577618, + 490203648, + 1774417801, + 1107058990, + 3170744386, + 1084230036, + 1865848996, + 2877134552, + 702377385, + 1226091839, + 26846528, + 3996652473, + 1411496674, + 2926602301, + 2700119880, + 2606836461, + 1354578627, + 1033924420, + 74228215, + 4170247243, + 873360571, + 2748318833, + 2263315174, + 2826384120, + 3582413385, + 2221990774, + 3944242884, + 3029543698, + 2872488536, + 1835503432, + 3659818895, + 2366662345, + 1008586344, + 2826666237, + 1329641654, + 3652989573, + 2935593807, + 1687202789, + 1526780728, + 2343408224, + 3808135103, + 3118221592, + 3732165174, + 1281793969, + 130140266, + 283700523, + 2589835927, + 4183975584, + 590339172, + 1029997236, + 967061722, + 1997593995, + 2908052528, + 358914942, + 2178363849, + 460103547, + 1129576290, + 3718201640, + 347568716, + 769425549, + 67473921, + 3005327920, + 2720134806, + 1890740256, + 2287546629, + 4181183792, + 9909583, + 657273641, + 1540255837, + 1937567464, + 2689047018, + 2801055477, + 3156051674, + 827077929, + 3720991595, + 1381992491, + 2387310831, + 1094848780, + 778372753, + 2351797229, + 677595237, + 1764857185, + 2702644370, + 1499750673, + 3964245200, + 706926014, + 822010821, + 2825696438, + 3655535188, + 1923752710, + 941429668, + 876276317, + 2311983962, + 1078529278, + 2475054236, + 982128638, + 4151418523, + 4166218073, + 3719554448, + 3677111283, + 1854762638, + 2494079045, + 2791331714, + 147021924, + 3307971362, + 2841905480, + 2160859928, + 1755134592, + 2919044329, + 2997840428, + 233600614, + 1894569196, + 3800206736, + 3277743410, + 3598016111, + 3622885896, + 3019330774, + 3073259031, + 428008074, + 17697440, + 189165353, + 2223665103, + 3524318525, + 1425751611, + 1235952737, + 3407111011, + 3444172144, + 3902980956, + 3380627857, + 2195283894, + 3433027906, + 3040448035, + 2612876626, + 4010989941, + 2098590105, + 1412304972, + 1104308985, + 3647129690, + 2064800599, + 3677870676, + 3366286894, + 2161821380, + 1245059370, + 181993145, + 2333165959, + 3087212180, + 3414822798, + 2663797518, + 1585226551, + 2439119296, + 1102516568, + 312816184, + 1807883862, + 2906527877, + 1131150834, + 515039496, + 3639364012, + 462548491, + 3481604774, + 409453965, + 2163281335, + 2048657422, + 2316664453, + 3525401137, + 1948308981, + 2874566256, + 2877090066, + 2375647779, + 1798523265, + 440692646, + 2568342830, + 626165542, + 770246108, + 553625354, + 1903599085, + 2936931833, + 1916980314, + 1183337829, + 3303541077, + 219135896, + 3387217259, + 606048452, + 3502987394, + 2774556751, + 2852112305, + 1220500479, + 222217494, + 639136436, + 516121692, + 2739283699, + 186450446, + 4211827818, + 1479788682, + 1096524610, + 166573098, + 3096253031, + 1318236650, + 3224218363, + 801477563, + 1079487672, + 1911596806, + 4118436172, + 2947939280, + 2409540064, + 1117520450, + 1221013591, + 736949110, + 1715723670, + 3531267591, + 2584007938, + 1549863744, + 978921429, + 1940456577, + 1948395610, + 4075485629, + 1734480237, + 3011498933, + 476682717, + 448623098, + 1888546343, + 1542374690, + 3544407179, + 2788333079, + 831247305, + 2655087473, + 2435564933, + 2703729439, + 2303253119, + 3362011455, + 2373933872, + 212220010, + 3941400423, + 2542751971, + 1293962690, + 133112768, + 2159734889, + 2114068685, + 1906882474, + 470947499, + 2888653307, + 810525109, + 2409353328, + 3303289436, + 2147064717, + 985776072, + 3920845570, + 3522395372, + 3328873414, + 1626979694, + 618591194, + 3285925259, + 1813887389, + 2533894643, + 1524897380, + 2094947497, + 4281721853, + 685207614, + 3758574815, + 3008126604, + 1168427383, + 1600196607, + 72800145, + 824806905, + 1395876241, + 1798202682, + 1223761685, + 691756752, + 4019761106, + 3124667192, + 4072198581, + 308739807, + 2164639482, + 2133827539, + 3751235962, + 3080714196, + 315849641, + 2039632783, + 3550041281, + 652991866, + 3057667304, + 52448946, + 540248862, + ]; + + static final String payMobApikey = String.fromCharCodes(List.generate( + _envieddatapayMobApikey.length, + (int i) => i, + growable: false, + ).map((int i) => _envieddatapayMobApikey[i] ^ _enviedkeypayMobApikey[i])); + + static const List _enviedkeyintegrationIdPayMobWallet = [ + 2199029462, + 1381762579, + 1035389835, + 2301212620, + 4098779353, + 3813714428, + 2159906595, + 295151910, + 3441193566, + 1120499211, + 2567959827, + 2022953168, + 3116052433, + ]; + + static const List _envieddataintegrationIdPayMobWallet = [ + 2199029478, + 1381762593, + 1035389884, + 2301212667, + 4098779374, + 3813714383, + 2159906586, + 295151998, + 3441193516, + 1120499283, + 2567959935, + 2022953106, + 3116052413, + ]; + + static final String integrationIdPayMobWallet = String.fromCharCodes( + List.generate( + _envieddataintegrationIdPayMobWallet.length, + (int i) => i, + growable: false, + ).map((int i) => + _envieddataintegrationIdPayMobWallet[i] ^ + _enviedkeyintegrationIdPayMobWallet[i])); + + static const List _enviedkeysmsPasswordEgypt = [ + 3416621437, + 2031660888, + 1803482199, + 1352858980, + 1516850406, + 1348524184, + 3677227258, + 2021089538, + 1120716056, + 670289654, + 3686735344, + 3856174016, + 2305451887, + 4146413048, + 3244789741, + 4019214010, + ]; + + static const List _envieddatasmsPasswordEgypt = [ + 3416621367, + 2031660913, + 1803482113, + 1352858892, + 1516850395, + 1348524265, + 3677227160, + 2021089581, + 1120716120, + 670289595, + 3686735272, + 3856174002, + 2305451831, + 4146412948, + 3244789679, + 4019214038, + ]; + + static final String smsPasswordEgypt = String.fromCharCodes( + List.generate( + _envieddatasmsPasswordEgypt.length, + (int i) => i, + growable: false, + ).map((int i) => + _envieddatasmsPasswordEgypt[i] ^ _enviedkeysmsPasswordEgypt[i])); + + static const List _enviedkeyocpApimSubscriptionKey = [ + 471176146, + 3158385045, + 580764052, + 654174929, + 4059514860, + 1272579671, + 4095434934, + 3165298524, + 3806199178, + 3538617412, + 4152409965, + 4153174060, + 2042008369, + 1334546813, + 3544781497, + 3847315324, + 1636423954, + 1869134391, + 368343637, + 2407576772, + 198035226, + 173339932, + 3665559839, + 1727260147, + 2130362298, + 985458494, + 4067927666, + 2202745536, + 2776427237, + 3656714239, + 2749346742, + 1107135976, + ]; + + static const List _envieddataocpApimSubscriptionKey = [ + 471176162, + 3158385139, + 580764065, + 654174901, + 4059514765, + 1272579636, + 4095434965, + 3165298495, + 3806199278, + 3538617382, + 4152409870, + 4153174089, + 2042008325, + 1334546764, + 3544781450, + 3847315277, + 1636424048, + 1869134342, + 368343604, + 2407576817, + 198035324, + 173339941, + 3665559850, + 1727260097, + 2130362243, + 985458439, + 4067927620, + 2202745587, + 2776427221, + 3656714189, + 2749346771, + 1107135963, + ]; + + static final String ocpApimSubscriptionKey = String.fromCharCodes( + List.generate( + _envieddataocpApimSubscriptionKey.length, + (int i) => i, + growable: false, + ).map((int i) => + _envieddataocpApimSubscriptionKey[i] ^ + _enviedkeyocpApimSubscriptionKey[i])); + + static const List _enviedkeychatGPTkeySeferNew4 = [ + 2381442616, + 1867050637, + 1397252667, + 1775411544, + 3840979633, + 3025154038, + 1191771697, + 217270836, + 2916178439, + 1708425003, + 423480389, + 351531955, + 1560090944, + 3774372051, + 1859158980, + 1964496969, + 3308470848, + 3841356476, + 1340198113, + 2031263291, + 1260489717, + 153442885, + 1798276891, + 3155755755, + 123182835, + 3402530082, + 3411128957, + 4146893217, + 3046525917, + 2529868346, + 246774735, + 53148358, + 2826543583, + 3147410771, + 301328377, + 3954622922, + 523596434, + 3780117733, + 4075924512, + 3832510985, + 329586729, + 3709059156, + 3194696216, + 1621661668, + 979641468, + 399429110, + 2468123070, + 539744562, + 1147386824, + 1269822379, + 2752899845, + 2107213675, + 1361273282, + 2575308338, + 1313382092, + 4291789407, + 469771489, + 2395687230, + 2729380322, + 1936146089, + 1533014559, + 2597884613, + 146758073, + ]; + + static const List _envieddatachatGPTkeySeferNew4 = [ + 2381442626, + 1867050730, + 1397252630, + 1775411502, + 3840979677, + 3025153951, + 1191771732, + 217270809, + 2916178485, + 1708425031, + 423480436, + 351532009, + 1560090924, + 3774372003, + 1859158972, + 1964496928, + 3308470829, + 3841356528, + 1340198059, + 2031263245, + 1260489602, + 153442836, + 1798276948, + 3155755677, + 123182737, + 3402530112, + 3411128905, + 4146893301, + 3046525875, + 2529868409, + 246774774, + 53148318, + 2826543533, + 3147410731, + 301328286, + 3954622879, + 523596503, + 3780117660, + 4075924598, + 3832511064, + 329586784, + 3709059105, + 3194696238, + 1621661616, + 979641397, + 399429042, + 2468123018, + 539744579, + 1147386776, + 1269822367, + 2752899907, + 2107213630, + 1361273239, + 2575308355, + 1313382051, + 4291789324, + 469771476, + 2395687270, + 2729380240, + 1936146161, + 1533014643, + 2597884551, + 146758101, + ]; + + static final String chatGPTkeySeferNew4 = String.fromCharCodes( + List.generate( + _envieddatachatGPTkeySeferNew4.length, + (int i) => i, + growable: false, + ).map((int i) => + _envieddatachatGPTkeySeferNew4[i] ^ + _enviedkeychatGPTkeySeferNew4[i])); + + static const List _enviedkeyanthropicAIkeySeferNew = [ + 440415033, + 3481077323, + 2351371344, + 288481861, + 1686766284, + 3622131985, + 1517759729, + 162218873, + 604728260, + 3916034383, + 726836953, + 1390373222, + 1313828993, + 3953920014, + 1210100472, + 636672723, + 2614778888, + 3256229455, + 4178701107, + 2175295549, + 581987297, + 2324410691, + 993526411, + 590897688, + 4131950141, + 1288350918, + 3047320354, + 1322424989, + 1550581193, + 2878806244, + 3233091400, + 1142932090, + 614521182, + 2419880789, + 1035341765, + 1673493904, + 4101051446, + 796536829, + 1331670153, + 1267654245, + 3078736492, + 464054371, + 2826108800, + 2985689774, + 2771215091, + 1285536431, + 2315560808, + 3514480796, + 4030336050, + 2950480752, + 2178285607, + 4178841704, + 2986715985, + 3530745786, + 615901237, + 881855124, + 3373546339, + 1444811969, + 4146566305, + 2821320265, + 2982736412, + 3308881966, + 3052128729, + 3831551676, + 2766571643, + 2433159288, + 2796477796, + 1324992066, + 399061202, + 642755973, + 4143477333, + 2707469362, + 3720826222, + 3400605387, + 2739617522, + 3017961433, + 3390862920, + 513520140, + 2251179580, + 624584094, + 2370674769, + 1669622004, + 11589773, + 236105173, + 2483386644, + 3949126604, + 1604768598, + 1317378690, + 2286953704, + 3045210649, + 1178973471, + 3464784953, + 2463864209, + 2261523411, + 1877928610, + 3336578558, + 2891378150, + 4046181905, + 3691642705, + 1096972210, + 1439704108, + 4159831330, + 4293511786, + 2769129919, + 410562615, + 420517500, + 3728341081, + 2369774650, + 4150826016, + 843207388, + 1237388578, + 546503206, + 502978408, + 1103967478, + 411610807, + ]; + + static const List _envieddataanthropicAIkeySeferNew = [ + 440415043, + 3481077292, + 2351371389, + 288481844, + 1686766254, + 3622132082, + 1517759708, + 162218760, + 604728242, + 3916034336, + 726836970, + 1390373215, + 1313829036, + 3953920099, + 1210100374, + 636672743, + 2614778974, + 3256229419, + 4178701182, + 2175295596, + 581987284, + 2324410669, + 993526526, + 590897746, + 4131950168, + 1288350863, + 3047320443, + 1322425077, + 1550581124, + 2878806186, + 3233091452, + 1142932010, + 614521114, + 2419880716, + 1035341751, + 1673493927, + 4101051463, + 796536722, + 1331670257, + 1267654230, + 3078736449, + 464054295, + 2826108850, + 2985689799, + 2771215042, + 1285536483, + 2315560704, + 3514480811, + 4030336083, + 2950480702, + 2178285683, + 4178841644, + 2986715959, + 3530745827, + 615901299, + 881855161, + 3373546276, + 1444811943, + 4146566297, + 2821320254, + 2982736500, + 3308882043, + 3052128659, + 3831551718, + 2766571576, + 2433159179, + 2796477776, + 1324992117, + 399061143, + 642756064, + 4143477296, + 2707469406, + 3720826149, + 3400605349, + 2739617482, + 3017961350, + 3390862877, + 513520239, + 2251179601, + 624584139, + 2370674716, + 1669621913, + 11589860, + 236105094, + 2483386712, + 3949126573, + 1604768560, + 1317378738, + 2286953661, + 3045210707, + 1178973560, + 3464784905, + 2463864277, + 2261523365, + 1877928695, + 3336578450, + 2891378103, + 4046181987, + 3691642645, + 1096972230, + 1439704065, + 4159831317, + 4293511772, + 2769129980, + 410562661, + 420517390, + 3728341042, + 2369774699, + 4150826097, + 843207300, + 1237388624, + 546503294, + 502978308, + 1103967412, + 411610843, + ]; + + static final String anthropicAIkeySeferNew = String.fromCharCodes( + List.generate( + _envieddataanthropicAIkeySeferNew.length, + (int i) => i, + growable: false, + ).map((int i) => + _envieddataanthropicAIkeySeferNew[i] ^ + _enviedkeyanthropicAIkeySeferNew[i])); + + static const List _enviedkeyllama3Key = [ + 3572481898, + 2198763672, + 4266389949, + 194977134, + 4108211437, + 2053667721, + 4103250415, + 923461869, + 3689102089, + 4215912861, + 2840020339, + 1291843711, + 3066303235, + 637162077, + 4089840734, + 2755384350, + 266516998, + 2147734435, + 1971112343, + 893601327, + 1059802444, + 3038118734, + 4176920206, + 2125561606, + 1790473939, + 635573349, + 1755219331, + 952592272, + 2828598413, + 1470709880, + 1365805985, + 1017727377, + 483877279, + 2633096056, + 1736628348, + 744976085, + 2060718974, + 172374259, + 1424671706, + 2531482868, + 930335001, + 2798422613, + 65834050, + 1179104162, + 1307565357, + 2186467103, + 2324931291, + 2761073838, + 658395544, + 297981328, + 3032132029, + 2554868846, + 298738134, + 2354744510, + 397407695, + 3291252503, + 2706569827, + 1382292102, + 1277793008, + 3186033650, + 1988297014, + 1037048923, + 3595786289, + ]; + + static const List _envieddatallama3Key = [ + 3572481793, + 2198763746, + 4266389978, + 194977073, + 4108211352, + 2053667805, + 4103250359, + 923461780, + 3689102138, + 4215912952, + 2840020298, + 1291843643, + 3066303297, + 637162047, + 4089840669, + 2755384399, + 266517047, + 2147734501, + 1971112441, + 893601378, + 1059802379, + 3038118691, + 4176920310, + 2125561695, + 1790473892, + 635573297, + 1755219400, + 952592361, + 2828598526, + 1470709760, + 1365805976, + 1017727428, + 483877324, + 2633096009, + 1736628254, + 744976032, + 2060718860, + 172374155, + 1424671632, + 2531482782, + 930335021, + 2798422579, + 65833988, + 1179104213, + 1307565410, + 2186467189, + 2324931262, + 2761073818, + 658395604, + 297981386, + 3032132095, + 2554868795, + 298738064, + 2354744565, + 397407621, + 3291252548, + 2706569810, + 1382292190, + 1277792898, + 3186033578, + 1988297050, + 1037048857, + 3595786333, + ]; + + static final String llama3Key = String.fromCharCodes(List.generate( + _envieddatallama3Key.length, + (int i) => i, + growable: false, + ).map((int i) => _envieddatallama3Key[i] ^ _enviedkeyllama3Key[i])); + + static const List _enviedkeypayMobOutClientSecrret = [ + 1791175069, + 4274302398, + 2640019683, + 226626444, + 2129466949, + 3370573502, + 1838185322, + 1661460518, + 1471552216, + 284247277, + 592558703, + 2721247847, + 1411044004, + 1716699342, + 2602920259, + 3248471857, + 2400803405, + 3542688653, + 97726941, + 1327359358, + 3921043617, + 2743794380, + 3779296726, + 302543532, + 1934107464, + 1886556912, + 3105507418, + 3013174638, + 546582165, + 2866756923, + 3375057284, + 40608270, + 2700307707, + 2281798243, + 3064205456, + 2435585786, + 471262151, + 1109633429, + 2268316166, + 220452796, + 2358948626, + 776422409, + 1219598009, + 116682801, + 3881474372, + 3413318048, + 1380917233, + 444744348, + 2278996499, + 1955318953, + 1142785951, + 269692139, + 1689414586, + 3364295709, + 3609160927, + 3828025868, + 2102524012, + 339941484, + 456355302, + 1281294123, + 3294899989, + 24023387, + 1078560164, + 4187133903, + 3881470412, + 3894452684, + 1532438968, + 2730357960, + 3633287995, + 2545592955, + 3230220363, + 1650489044, + 3083570276, + 2876810793, + 3154138833, + 3601137810, + 3383259116, + 1843399614, + 3785140761, + 3903839396, + 3703132483, + 521417572, + 3493042551, + 2660676881, + 502128880, + 458791535, + 347561458, + 3488775302, + 2954583900, + 1932780718, + 1968040293, + 1221461083, + 805690927, + 1397152166, + 9419300, + 3022184595, + 2819076579, + 3037437633, + 1069227510, + 3543696866, + 644361757, + 4066100141, + 1908720734, + 1699522416, + 3173902814, + 1127523762, + 800611780, + 3004873618, + 1208922121, + 3134865091, + 4141647798, + 2736322675, + 3237776966, + 1290198067, + 491594743, + 3082583214, + 3801718029, + 1980363941, + 781258854, + 2566488484, + 2698709985, + 3449578448, + 593576507, + 2843511536, + 1103580082, + 2040065597, + 1101635704, + 434408713, + 80044955, + 150216274, + 2548439424, + 1537205109, + 671175664, + 2357986282, + 1040240055, + ]; + + static const List _envieddatapayMobOutClientSecrret = [ + 1791175141, + 4274302407, + 2640019593, + 226626534, + 2129466903, + 3370573522, + 1838185217, + 1661460551, + 1471552176, + 284247207, + 592558626, + 2721247831, + 1411044092, + 1716699309, + 2602920304, + 3248471817, + 2400803354, + 3542688743, + 97726876, + 1327359246, + 3921043682, + 2743794307, + 3779296702, + 302543508, + 1934107434, + 1886556806, + 3105507389, + 3013174562, + 546582188, + 2866756936, + 3375057384, + 40608328, + 2700307595, + 2281798189, + 3064205556, + 2435585719, + 471262206, + 1109633484, + 2268316259, + 220452863, + 2358948711, + 776422448, + 1219598072, + 116682841, + 3881474312, + 3413318097, + 1380917139, + 444744435, + 2278996568, + 1955319012, + 1142785999, + 269692063, + 1689414615, + 3364295758, + 3609160873, + 3828025967, + 2102523998, + 339941410, + 456355295, + 1281294180, + 3294900001, + 24023343, + 1078560252, + 4187133879, + 3881470346, + 3894452608, + 1532439022, + 2730358010, + 3633288049, + 2545592890, + 3230220317, + 1650489058, + 3083570199, + 2876810845, + 3154138771, + 3601137857, + 3383259064, + 1843399679, + 3785140830, + 3903839458, + 3703132420, + 521417511, + 3493042465, + 2660676964, + 502128786, + 458791464, + 347561367, + 3488775344, + 2954583825, + 1932780768, + 1968040213, + 1221461048, + 805690904, + 1397152235, + 9419358, + 3022184665, + 2819076493, + 3037437595, + 1069227461, + 3543696817, + 644361844, + 4066100217, + 1908720744, + 1699522359, + 3173902766, + 1127523795, + 800611762, + 3004873680, + 1208922214, + 3134865024, + 4141647866, + 2736322596, + 3237776941, + 1290198118, + 491594625, + 3082583288, + 3801718127, + 1980363969, + 781258805, + 2566488544, + 2698709888, + 3449578397, + 593576459, + 2843511434, + 1103580154, + 2040065611, + 1101635597, + 434408779, + 80045012, + 150216202, + 2548439538, + 1537205037, + 671175580, + 2357986216, + 1040240091, + ]; + + static final String payMobOutClientSecrret = String.fromCharCodes( + List.generate( + _envieddatapayMobOutClientSecrret.length, + (int i) => i, + growable: false, + ).map((int i) => + _envieddatapayMobOutClientSecrret[i] ^ + _enviedkeypayMobOutClientSecrret[i])); + + static const List _enviedkeyallowedWallet = [ + 1694229894, + 3999798160, + 448883603, + 3004281707, + 3728431091, + 4197831559, + 3505724573, + 2577029677, + 2137661136, + 4217007177, + 1756899448, + 518319248, + ]; + + static const List _envieddataallowedWallet = [ + 1694229970, + 3999798242, + 448883706, + 3004281627, + 3728430985, + 4197831632, + 3505724668, + 2577029697, + 2137661116, + 4217007148, + 1756899340, + 518319274, + ]; + + static final String allowedWallet = String.fromCharCodes(List.generate( + _envieddataallowedWallet.length, + (int i) => i, + growable: false, + ).map((int i) => _envieddataallowedWallet[i] ^ _enviedkeyallowedWallet[i])); + + static const List _enviedkeypayMobOutClient_id = [ + 979983630, + 2508789854, + 3342679617, + 414951138, + 1079222340, + 2328078156, + 772570862, + 2864880607, + 1647329883, + 1977857149, + 1422043970, + 3625133941, + 3119399678, + 3958275097, + 2809221326, + 1471069410, + 694611393, + 928648581, + 175362392, + 1623958064, + 1600744102, + 2501977433, + 959253698, + 1257331100, + 1074547703, + 1176503077, + 1546625303, + 3098776092, + 1533226722, + 2812471837, + 1112951286, + 1602675172, + 3208237481, + 3504868848, + 1642540271, + 779799845, + 2883949092, + 1503722689, + 3681385494, + 2420641192, + 3494475686, + 3926374187, + 3655378190, + 1480693833, + 873781787, + 3137712878, + 3158057581, + ]; + + static const List _envieddatapayMobOutClient_id = [ + 979983700, + 2508789870, + 3342679668, + 414951063, + 1079222320, + 2328078200, + 772570838, + 2864880571, + 1647329805, + 1977857046, + 1422043945, + 3625133862, + 3119399628, + 3958275198, + 2809221255, + 1471069392, + 694611387, + 928648672, + 175362358, + 1623958134, + 1600744160, + 2501977402, + 959253641, + 1257331183, + 1074547601, + 1176503137, + 1546625372, + 3098776186, + 1533226666, + 2812471900, + 1112951203, + 1602675156, + 3208237566, + 3504868789, + 1642540195, + 779799892, + 2883949167, + 1503722680, + 3681385564, + 2420641176, + 3494475754, + 3926374259, + 3655378300, + 1480693777, + 873781879, + 3137712812, + 3158057473, + ]; + + static final String payMobOutClient_id = String.fromCharCodes( + List.generate( + _envieddatapayMobOutClient_id.length, + (int i) => i, + growable: false, + ).map((int i) => + _envieddatapayMobOutClient_id[i] ^ _enviedkeypayMobOutClient_id[i])); + + static const List _enviedkeypayMobOutPassword = [ + 3777244660, + 912864580, + 876854029, + 31397964, + 2402256236, + 3558089177, + 405282331, + 1026183174, + 2007236667, + 2400875168, + 2067671069, + 3379238164, + 3326887990, + 2036026928, + 1366655300, + 1593480823, + 1064143790, + 1275708644, + 3766542030, + 1537117210, + 86300338, + 2374149402, + 2174478652, + 1104011002, + 3591848939, + 668153194, + 1201352467, + 1107268086, + 3108266920, + 1789980402, + 688174663, + 4268912646, + ]; + + static const List _envieddatapayMobOutPassword = [ + 3777244592, + 912864630, + 876854135, + 31397894, + 2402256170, + 3558089121, + 405282416, + 1026183235, + 2007236632, + 2400875244, + 2067671123, + 3379238271, + 3326887941, + 2036026950, + 1366655294, + 1593480772, + 1064143766, + 1275708574, + 3766542076, + 1537117310, + 86300395, + 2374149474, + 2174478668, + 1104010932, + 3591848845, + 668153149, + 1201352523, + 1107267972, + 3108266992, + 1789980318, + 688174597, + 4268912746, + ]; + + static final String payMobOutPassword = String.fromCharCodes( + List.generate( + _envieddatapayMobOutPassword.length, + (int i) => i, + growable: false, + ).map((int i) => + _envieddatapayMobOutPassword[i] ^ _enviedkeypayMobOutPassword[i])); + + static const List _enviedkeypayMobOutUserName = [ + 1918639183, + 2401964853, + 3565683034, + 1895964189, + 3596231414, + 1862637613, + 2056930245, + 1566061619, + 2875080933, + 1883383284, + 183134750, + 3712444261, + 4202700050, + 2336494786, + 2509515411, + 324331526, + 2761085601, + 4075221958, + 2606528383, + 2298152803, + 2759530582, + 3789793797, + 4268109091, + 338600608, + ]; + + static const List _envieddatapayMobOutUserName = [ + 1918639157, + 2401964895, + 3565682991, + 1895964279, + 3596231322, + 1862637682, + 2056930228, + 1566061637, + 2875080842, + 1883383211, + 183134840, + 3712444178, + 4202700153, + 2336494760, + 2509515509, + 324331617, + 2761085643, + 4075221930, + 2606528295, + 2298152721, + 2759530510, + 3789793897, + 4268109153, + 338600652, + ]; + + static final String payMobOutUserName = String.fromCharCodes( + List.generate( + _envieddatapayMobOutUserName.length, + (int i) => i, + growable: false, + ).map((int i) => + _envieddatapayMobOutUserName[i] ^ _enviedkeypayMobOutUserName[i])); + + static const List _enviedkeyA = [3669847309]; + + static const List _envieddataA = [3669847388]; + + static final String A = String.fromCharCodes(List.generate( + _envieddataA.length, + (int i) => i, + growable: false, + ).map((int i) => _envieddataA[i] ^ _enviedkeyA[i])); + + static const List _enviedkeyB = [2691187575]; + + static const List _envieddataB = [2691187503]; + + static final String B = String.fromCharCodes(List.generate( + _envieddataB.length, + (int i) => i, + growable: false, + ).map((int i) => _envieddataB[i] ^ _enviedkeyB[i])); + + static const List _enviedkeyC = [1476171811]; + + static const List _envieddataC = [1476171877]; + + static final String C = String.fromCharCodes(List.generate( + _envieddataC.length, + (int i) => i, + growable: false, + ).map((int i) => _envieddataC[i] ^ _enviedkeyC[i])); + + static const List _enviedkeyD = [2692972781]; + + static const List _envieddataD = [2692972724]; + + static final String D = String.fromCharCodes(List.generate( + _envieddataD.length, + (int i) => i, + growable: false, + ).map((int i) => _envieddataD[i] ^ _enviedkeyD[i])); + + static const List _enviedkeyE = [346088415]; + + static const List _envieddataE = [346088341]; + + static final String E = String.fromCharCodes(List.generate( + _envieddataE.length, + (int i) => i, + growable: false, + ).map((int i) => _envieddataE[i] ^ _enviedkeyE[i])); + + static const List _enviedkeyF = [3306563796]; + + static const List _envieddataF = [3306563713]; + + static final String F = String.fromCharCodes(List.generate( + _envieddataF.length, + (int i) => i, + growable: false, + ).map((int i) => _envieddataF[i] ^ _enviedkeyF[i])); + + static const List _enviedkeyG = [740311107]; + + static const List _envieddataG = [740311048]; + + static final String G = String.fromCharCodes(List.generate( + _envieddataG.length, + (int i) => i, + growable: false, + ).map((int i) => _envieddataG[i] ^ _enviedkeyG[i])); + + static const List _enviedkeyH = [1937341364]; + + static const List _envieddataH = [1937341411]; + + static final String H = String.fromCharCodes(List.generate( + _envieddataH.length, + (int i) => i, + growable: false, + ).map((int i) => _envieddataH[i] ^ _enviedkeyH[i])); + + static const List _enviedkeyI = [2115946541]; + + static const List _envieddataI = [2115946594]; + + static final String I = String.fromCharCodes(List.generate( + _envieddataI.length, + (int i) => i, + growable: false, + ).map((int i) => _envieddataI[i] ^ _enviedkeyI[i])); + + static const List _enviedkeyJ = [3314402949]; + + static const List _envieddataJ = [3314403008]; + + static final String J = String.fromCharCodes(List.generate( + _envieddataJ.length, + (int i) => i, + growable: false, + ).map((int i) => _envieddataJ[i] ^ _enviedkeyJ[i])); + + static const List _enviedkeyK = [620434005]; + + static const List _envieddataK = [620433938]; + + static final String K = String.fromCharCodes(List.generate( + _envieddataK.length, + (int i) => i, + growable: false, + ).map((int i) => _envieddataK[i] ^ _enviedkeyK[i])); + + static const List _enviedkeyL = [1180655650]; + + static const List _envieddataL = [1180655728]; + + static final String L = String.fromCharCodes(List.generate( + _envieddataL.length, + (int i) => i, + growable: false, + ).map((int i) => _envieddataL[i] ^ _enviedkeyL[i])); + + static const List _enviedkeyM = [3139361766]; + + static const List _envieddataM = [3139361704]; + + static final String M = String.fromCharCodes(List.generate( + _envieddataM.length, + (int i) => i, + growable: false, + ).map((int i) => _envieddataM[i] ^ _enviedkeyM[i])); + + static const List _enviedkeyN = [3049045212]; + + static const List _envieddataN = [3049045150]; + + static final String N = String.fromCharCodes(List.generate( + _envieddataN.length, + (int i) => i, + growable: false, + ).map((int i) => _envieddataN[i] ^ _enviedkeyN[i])); + + static const List _enviedkeyO = [2266599974]; + + static const List _envieddataO = [2266600047]; + + static final String O = String.fromCharCodes(List.generate( + _envieddataO.length, + (int i) => i, + growable: false, + ).map((int i) => _envieddataO[i] ^ _enviedkeyO[i])); + + static const List _enviedkeyP = [1074033543]; + + static const List _envieddataP = [1074033617]; + + static final String P = String.fromCharCodes(List.generate( + _envieddataP.length, + (int i) => i, + growable: false, + ).map((int i) => _envieddataP[i] ^ _enviedkeyP[i])); + + static const List _enviedkeyQ = [2647546717]; + + static const List _envieddataQ = [2647546652]; + + static final String Q = String.fromCharCodes(List.generate( + _envieddataQ.length, + (int i) => i, + growable: false, + ).map((int i) => _envieddataQ[i] ^ _enviedkeyQ[i])); + + static const List _enviedkeyR = [3790845943]; + + static const List _envieddataR = [3790845883]; + + static final String R = String.fromCharCodes(List.generate( + _envieddataR.length, + (int i) => i, + growable: false, + ).map((int i) => _envieddataR[i] ^ _enviedkeyR[i])); + + static const List _enviedkeyS = [43300891]; + + static const List _envieddataS = [43300929]; + + static final String S = String.fromCharCodes(List.generate( + _envieddataS.length, + (int i) => i, + growable: false, + ).map((int i) => _envieddataS[i] ^ _enviedkeyS[i])); + + static const List _enviedkeyT = [3507578833]; + + static const List _envieddataT = [3507578770]; + + static final String T = String.fromCharCodes(List.generate( + _envieddataT.length, + (int i) => i, + growable: false, + ).map((int i) => _envieddataT[i] ^ _enviedkeyT[i])); + + static const List _enviedkeyU = [3499348722]; + + static const List _envieddataU = [3499348666]; + + static final String U = String.fromCharCodes(List.generate( + _envieddataU.length, + (int i) => i, + growable: false, + ).map((int i) => _envieddataU[i] ^ _enviedkeyU[i])); + + static const List _enviedkeyV = [1770507908]; + + static const List _envieddataV = [1770507988]; + + static final String V = String.fromCharCodes(List.generate( + _envieddataV.length, + (int i) => i, + growable: false, + ).map((int i) => _envieddataV[i] ^ _enviedkeyV[i])); + + static const List _enviedkeyW = [710768163]; + + static const List _envieddataW = [710768247]; + + static final String W = String.fromCharCodes(List.generate( + _envieddataW.length, + (int i) => i, + growable: false, + ).map((int i) => _envieddataW[i] ^ _enviedkeyW[i])); + + static const List _enviedkeyX = [1231391567]; + + static const List _envieddataX = [1231391499]; + + static final String X = String.fromCharCodes(List.generate( + _envieddataX.length, + (int i) => i, + growable: false, + ).map((int i) => _envieddataX[i] ^ _enviedkeyX[i])); + + static const List _enviedkeyY = [2348108661]; + + static const List _envieddataY = [2348108582]; + + static final String Y = String.fromCharCodes(List.generate( + _envieddataY.length, + (int i) => i, + growable: false, + ).map((int i) => _envieddataY[i] ^ _enviedkeyY[i])); + + static const List _enviedkeyZ = [4202936308]; + + static const List _envieddataZ = [4202936249]; + + static final String Z = String.fromCharCodes(List.generate( + _envieddataZ.length, + (int i) => i, + growable: false, + ).map((int i) => _envieddataZ[i] ^ _enviedkeyZ[i])); + + static const List _enviedkeya = [1258692106]; + + static const List _envieddataa = [1258692219]; + + static final String a = String.fromCharCodes(List.generate( + _envieddataa.length, + (int i) => i, + growable: false, + ).map((int i) => _envieddataa[i] ^ _enviedkeya[i])); + + static const List _enviedkeyb = [185978357]; + + static const List _envieddatab = [185978253]; + + static final String b = String.fromCharCodes(List.generate( + _envieddatab.length, + (int i) => i, + growable: false, + ).map((int i) => _envieddatab[i] ^ _enviedkeyb[i])); + + static const List _enviedkeyc = [1002619573]; + + static const List _envieddatac = [1002619603]; + + static final String c = String.fromCharCodes(List.generate( + _envieddatac.length, + (int i) => i, + growable: false, + ).map((int i) => _envieddatac[i] ^ _enviedkeyc[i])); + + static const List _enviedkeyd = [1511313002]; + + static const List _envieddatad = [1511312915]; + + static final String d = String.fromCharCodes(List.generate( + _envieddatad.length, + (int i) => i, + growable: false, + ).map((int i) => _envieddatad[i] ^ _enviedkeyd[i])); + + static const List _enviedkeye = [319701477]; + + static const List _envieddatae = [319701391]; + + static final String e = String.fromCharCodes(List.generate( + _envieddatae.length, + (int i) => i, + growable: false, + ).map((int i) => _envieddatae[i] ^ _enviedkeye[i])); + + static const List _enviedkeyf = [1505429496]; + + static const List _envieddataf = [1505429389]; + + static final String f = String.fromCharCodes(List.generate( + _envieddataf.length, + (int i) => i, + growable: false, + ).map((int i) => _envieddataf[i] ^ _enviedkeyf[i])); + + static const List _enviedkeyg = [3437297919]; + + static const List _envieddatag = [3437297812]; + + static final String g = String.fromCharCodes(List.generate( + _envieddatag.length, + (int i) => i, + growable: false, + ).map((int i) => _envieddatag[i] ^ _enviedkeyg[i])); + + static const List _enviedkeyh = [1452421920]; + + static const List _envieddatah = [1452421975]; + + static final String h = String.fromCharCodes(List.generate( + _envieddatah.length, + (int i) => i, + growable: false, + ).map((int i) => _envieddatah[i] ^ _enviedkeyh[i])); + + static const List _enviedkeyi = [801542640]; + + static const List _envieddatai = [801542559]; + + static final String i = String.fromCharCodes(List.generate( + _envieddatai.length, + (int i) => i, + growable: false, + ).map((int i) => _envieddatai[i] ^ _enviedkeyi[i])); + + static const List _enviedkeyj = [3178617758]; + + static const List _envieddataj = [3178617851]; + + static final String j = String.fromCharCodes(List.generate( + _envieddataj.length, + (int i) => i, + growable: false, + ).map((int i) => _envieddataj[i] ^ _enviedkeyj[i])); + + static const List _enviedkeyk = [910033774]; + + static const List _envieddatak = [910033673]; + + static final String k = String.fromCharCodes(List.generate( + _envieddatak.length, + (int i) => i, + growable: false, + ).map((int i) => _envieddatak[i] ^ _enviedkeyk[i])); + + static const List _enviedkeyl = [3262988596]; + + static const List _envieddatal = [3262988614]; + + static final String l = String.fromCharCodes(List.generate( + _envieddatal.length, + (int i) => i, + growable: false, + ).map((int i) => _envieddatal[i] ^ _enviedkeyl[i])); + + static const List _enviedkeym = [4161268557]; + + static const List _envieddatam = [4161268515]; + + static final String m = String.fromCharCodes(List.generate( + _envieddatam.length, + (int i) => i, + growable: false, + ).map((int i) => _envieddatam[i] ^ _enviedkeym[i])); + + static const List _enviedkeyn = [1866024422]; + + static const List _envieddatan = [1866024324]; + + static final String n = String.fromCharCodes(List.generate( + _envieddatan.length, + (int i) => i, + growable: false, + ).map((int i) => _envieddatan[i] ^ _enviedkeyn[i])); + + static const List _enviedkeyo = [2356433566]; + + static const List _envieddatao = [2356433655]; + + static final String o = String.fromCharCodes(List.generate( + _envieddatao.length, + (int i) => i, + growable: false, + ).map((int i) => _envieddatao[i] ^ _enviedkeyo[i])); + + static const List _enviedkeyp = [3221197543]; + + static const List _envieddatap = [3221197457]; + + static final String p = String.fromCharCodes(List.generate( + _envieddatap.length, + (int i) => i, + growable: false, + ).map((int i) => _envieddatap[i] ^ _enviedkeyp[i])); + + static const List _enviedkeyq = [1441620817]; + + static const List _envieddataq = [1441620784]; + + static final String q = String.fromCharCodes(List.generate( + _envieddataq.length, + (int i) => i, + growable: false, + ).map((int i) => _envieddataq[i] ^ _enviedkeyq[i])); + + static const List _enviedkeyr = [2338076256]; + + static const List _envieddatar = [2338076172]; + + static final String r = String.fromCharCodes(List.generate( + _envieddatar.length, + (int i) => i, + growable: false, + ).map((int i) => _envieddatar[i] ^ _enviedkeyr[i])); + + static const List _enviedkeys = [3541953140]; + + static const List _envieddatas = [3541953038]; + + static final String s = String.fromCharCodes(List.generate( + _envieddatas.length, + (int i) => i, + growable: false, + ).map((int i) => _envieddatas[i] ^ _enviedkeys[i])); + + static const List _enviedkeyt = [1180244588]; + + static const List _envieddatat = [1180244495]; + + static final String t = String.fromCharCodes(List.generate( + _envieddatat.length, + (int i) => i, + growable: false, + ).map((int i) => _envieddatat[i] ^ _enviedkeyt[i])); + + static const List _enviedkeyu = [1249543756]; + + static const List _envieddatau = [1249543716]; + + static final String u = String.fromCharCodes(List.generate( + _envieddatau.length, + (int i) => i, + growable: false, + ).map((int i) => _envieddatau[i] ^ _enviedkeyu[i])); + + static const List _enviedkeyv = [3272247679]; + + static const List _envieddatav = [3272247567]; + + static final String v = String.fromCharCodes(List.generate( + _envieddatav.length, + (int i) => i, + growable: false, + ).map((int i) => _envieddatav[i] ^ _enviedkeyv[i])); + + static const List _enviedkeyw = [1149161987]; + + static const List _envieddataw = [1149162103]; + + static final String w = String.fromCharCodes(List.generate( + _envieddataw.length, + (int i) => i, + growable: false, + ).map((int i) => _envieddataw[i] ^ _enviedkeyw[i])); + + static const List _enviedkeyx = [922652415]; + + static const List _envieddatax = [922652315]; + + static final String x = String.fromCharCodes(List.generate( + _envieddatax.length, + (int i) => i, + growable: false, + ).map((int i) => _envieddatax[i] ^ _enviedkeyx[i])); + + static const List _enviedkeyy = [3053150165]; + + static const List _envieddatay = [3053150118]; + + static final String y = String.fromCharCodes(List.generate( + _envieddatay.length, + (int i) => i, + growable: false, + ).map((int i) => _envieddatay[i] ^ _enviedkeyy[i])); + + static const List _enviedkeyz = [2047383862]; + + static const List _envieddataz = [2047383899]; + + static final String z = String.fromCharCodes(List.generate( + _envieddataz.length, + (int i) => i, + growable: false, + ).map((int i) => _envieddataz[i] ^ _enviedkeyz[i])); + + static const List _enviedkeykeyOfApp = [ + 4244184874, + 4107512659, + 2622522874, + 1645925263, + 913853953, + 1777373664, + 1889373768, + 558620175, + 2961007568, + 3688084515, + 1364454989, + 921996628, + 3825877930, + 2135905355, + 2011599918, + 2208987645, + 745071802, + 334467154, + 3673450172, + 3796616278, + 3422993682, + 1335020432, + 3949030242, + 1948720617, + 1792135573, + 2634584073, + 850114781, + 1985160764, + 3334693369, + 1933911873, + 1377163926, + 3712457630, + 1145127440, + 2498192437, + 85469232, + 3454294148, + 2953289630, + 3968588203, + ]; + + static const List _envieddatakeyOfApp = [ + 4244184904, + 4107512626, + 2622522774, + 1645925372, + 913854052, + 1777373590, + 1889373704, + 558620216, + 2961007590, + 3688084506, + 1364455035, + 921996576, + 3825877963, + 2135905321, + 2011599936, + 2208987548, + 745071835, + 334467112, + 3673450201, + 3796616229, + 3422993791, + 1335020533, + 3949030154, + 1948720524, + 1792135655, + 2634584172, + 850114746, + 1985160774, + 3334693257, + 1933911847, + 1377164028, + 3712457713, + 1145127496, + 2498192455, + 85469288, + 3454294262, + 2953289692, + 3968588249, + ]; + + static final String keyOfApp = String.fromCharCodes(List.generate( + _envieddatakeyOfApp.length, + (int i) => i, + growable: false, + ).map((int i) => _envieddatakeyOfApp[i] ^ _enviedkeykeyOfApp[i])); +} diff --git a/siro_admin/lib/firebase_options.dart b/siro_admin/lib/firebase_options.dart new file mode 100644 index 0000000..a768c1d --- /dev/null +++ b/siro_admin/lib/firebase_options.dart @@ -0,0 +1,67 @@ +// File generated by FlutterFire CLI. +// ignore_for_file: type=lint +import 'package:firebase_core/firebase_core.dart' show FirebaseOptions; +import 'package:flutter/foundation.dart' + show defaultTargetPlatform, kIsWeb, TargetPlatform; + +/// Default [FirebaseOptions] for use with your Firebase apps. +/// +/// Example: +/// ```dart +/// import 'firebase_options.dart'; +/// // ... +/// await Firebase.initializeApp( +/// options: DefaultFirebaseOptions.currentPlatform, +/// ); +/// ``` +class DefaultFirebaseOptions { + static FirebaseOptions get currentPlatform { + if (kIsWeb) { + throw UnsupportedError( + 'DefaultFirebaseOptions have not been configured for web - ' + 'you can reconfigure this by running the FlutterFire CLI again.', + ); + } + switch (defaultTargetPlatform) { + case TargetPlatform.android: + return android; + case TargetPlatform.iOS: + return ios; + case TargetPlatform.macOS: + throw UnsupportedError( + 'DefaultFirebaseOptions have not been configured for macos - ' + 'you can reconfigure this by running the FlutterFire CLI again.', + ); + case TargetPlatform.windows: + throw UnsupportedError( + 'DefaultFirebaseOptions have not been configured for windows - ' + 'you can reconfigure this by running the FlutterFire CLI again.', + ); + case TargetPlatform.linux: + throw UnsupportedError( + 'DefaultFirebaseOptions have not been configured for linux - ' + 'you can reconfigure this by running the FlutterFire CLI again.', + ); + default: + throw UnsupportedError( + 'DefaultFirebaseOptions are not supported for this platform.', + ); + } + } + + static const FirebaseOptions android = FirebaseOptions( + apiKey: 'AIzaSyAEoply_UcEP6KaCu_ziCy_ZDIjAKvi7b8', + appId: '1:825988584191:android:caa30eaac3524de51632ca', + messagingSenderId: '825988584191', + projectId: 'siro-a6957', + storageBucket: 'siro-a6957.firebasestorage.app', + ); + static const FirebaseOptions ios = FirebaseOptions( + apiKey: 'AIzaSyDk6x6KZUY0IQtxoCMXX0F7N_yik8O19eA', + appId: '1:825988584191:ios:8426fcf68fcc470e1632ca', + messagingSenderId: '825988584191', + projectId: 'siro-a6957', + storageBucket: 'siro-a6957.firebasestorage.app', + iosBundleId: 'com.siro.admin', + ); +} diff --git a/siro_admin/lib/main.dart b/siro_admin/lib/main.dart new file mode 100644 index 0000000..d52d865 --- /dev/null +++ b/siro_admin/lib/main.dart @@ -0,0 +1,106 @@ +import 'dart:io'; + +import 'package:firebase_core/firebase_core.dart'; +import 'package:firebase_messaging/firebase_messaging.dart'; +import 'package:flutter/material.dart'; +import 'package:flutter/services.dart'; +import 'package:flutter_secure_storage/flutter_secure_storage.dart'; +import 'package:get/get.dart'; +import 'package:get_storage/get_storage.dart'; +import 'package:intl/date_symbol_data_local.dart'; +import 'constant/box_name.dart'; +import 'controller/firebase/firbase_messge.dart'; +import 'controller/functions/encrypt_decrypt.dart'; +import 'firebase_options.dart'; +import 'models/db_sql.dart'; +import 'package:google_fonts/google_fonts.dart'; +import 'constant/colors.dart'; +import 'routes.dart'; +import 'binding/initial_binding.dart'; + +final box = GetStorage(); +const storage = FlutterSecureStorage(); +@pragma('vm:entry-point') +Future backgroundMessageHandler(RemoteMessage message) async { + await Firebase.initializeApp(); + if (message.data.isNotEmpty && message.notification != null) { + FirebaseMessagesController().fireBaseTitles(message); + } +} // + +DbSql sql = DbSql.instance; + +void main() async { + WidgetsFlutterBinding.ensureInitialized(); + await GetStorage.init(); + await initializeDateFormatting('ar', null); + await EncryptionHelper.initialize(); + if (Platform.isAndroid || Platform.isIOS) { + await Firebase.initializeApp( + options: DefaultFirebaseOptions.currentPlatform, + ); + // await FirebaseMessagesController().requestFirebaseMessagingPermission(); + + FirebaseMessaging.onBackgroundMessage(backgroundMessageHandler); + + List initializationTasks = [ + FirebaseMessagesController().getNotificationSettings(), + FirebaseMessagesController().getToken(), + ]; + + await Future.wait(initializationTasks); + SystemChrome.setPreferredOrientations([ + DeviceOrientation.portraitUp, + DeviceOrientation.portraitDown, + ]); + } // Enable Crashlytics collection + // FlutterError.onError = FirebaseCrashlytics.instance.recordFlutterError; + + runApp(const MainApp()); +} + +class MainApp extends StatelessWidget { + const MainApp({super.key}); + + @override + Widget build(BuildContext context) { + return GetMaterialApp( + debugShowCheckedModeBanner: false, + title: 'Intaleq Admin', + locale: const Locale('ar'), + fallbackLocale: const Locale('en'), + themeMode: ThemeMode.dark, + darkTheme: ThemeData( + brightness: Brightness.dark, + scaffoldBackgroundColor: AppColor.bg, + primaryColor: AppColor.accent, + colorScheme: const ColorScheme.dark( + primary: AppColor.accent, + secondary: AppColor.accent, + surface: AppColor.surface, + background: AppColor.bg, + error: AppColor.danger, + ), + dividerColor: AppColor.divider, + textTheme: + GoogleFonts.cairoTextTheme(ThemeData.dark().textTheme).copyWith( + bodyLarge: GoogleFonts.inter(color: AppColor.textPrimary), + bodyMedium: GoogleFonts.inter(color: AppColor.textPrimary), + ), + appBarTheme: const AppBarTheme( + backgroundColor: AppColor.bg, + elevation: 0, + centerTitle: true, + titleTextStyle: TextStyle( + color: AppColor.textPrimary, + fontSize: 18, + fontWeight: FontWeight.bold, + ), + ), + ), + initialBinding: InitialBinding(), + initialRoute: box.read(BoxName.phoneVerified) == true ? "/" : "/login", + getPages: routes, + ); + } +} diff --git a/siro_admin/lib/models/db_sql.dart b/siro_admin/lib/models/db_sql.dart new file mode 100644 index 0000000..7f0bb18 --- /dev/null +++ b/siro_admin/lib/models/db_sql.dart @@ -0,0 +1,116 @@ +import 'package:sqflite/sqflite.dart'; +import 'package:path/path.dart'; + +import '../constant/table_names.dart'; + +class DbSql { + static final DbSql instance = DbSql._(); + + static Database? _database; + + DbSql._(); + + Future get database async { + if (_database != null) return _database!; + _database = await _initDatabase(); + return _database!; + } + + Future _initDatabase() async { + String path = join(await getDatabasesPath(), 'my_database.db'); + return await openDatabase( + path, + version: 1, + onCreate: (db, version) async { + await db.execute(''' + CREATE TABLE IF NOT EXISTS ${TableName.carLocations}( + id INTEGER PRIMARY KEY AUTOINCREMENT, + driver_id TEXT, + latitude REAL, + longitude REAL, + created_at TEXT, + updated_at TEXT + ) + '''); + await db.execute(''' + CREATE TABLE IF NOT EXISTS ${TableName.placesFavorite}( + id INTEGER PRIMARY KEY AUTOINCREMENT, + latitude REAL, + longitude REAL, + name TEXT UNIQUE, + rate TEXT + ) + '''); + await db.execute(''' + CREATE TABLE IF NOT EXISTS ${TableName.recentLocations}( + id INTEGER PRIMARY KEY AUTOINCREMENT, + latitude REAL, + longitude REAL, + name TEXT , + rate TEXT + ) + '''); + await db.execute(''' + CREATE TABLE IF NOT EXISTS ${TableName.driverOrdersRefuse}( + id INTEGER PRIMARY KEY AUTOINCREMENT, + order_id TEXT UNIQUE, + created_at TEXT, + driver_id TEXT + ) + '''); + await db.execute(''' + CREATE TABLE IF NOT EXISTS ${TableName.rideLocation}( + id INTEGER PRIMARY KEY AUTOINCREMENT, + order_id TEXT , + created_at TEXT, + lat TEXT, + lng TEXT + ) + '''); + await db.execute(''' + CREATE TABLE IF NOT EXISTS ${TableName.faceDetectTimes}( + id INTEGER PRIMARY KEY AUTOINCREMENT, + faceDetectTimes INTEGER + ) + '''); + await db.execute(''' + CREATE TABLE IF NOT EXISTS ${TableName.captainNotification}( + id INTEGER PRIMARY KEY AUTOINCREMENT, + faceDetectTimes INTEGER + ) + '''); + }, + ); + } + + Future>> getAllData(String table) async { + Database db = await instance.database; + return await db.query(table); + } + + Future>> getCustomQuery(String query) async { + Database db = await instance.database; + return await db.rawQuery(query); + } + + Future insertData(Map map, String table) async { + Database db = await instance.database; + return await db.insert(table, map); + } + + Future updateData(Map map, String table, int id) async { + Database db = await instance.database; + + return await db.update(table, map, where: 'id = ?', whereArgs: [id]); + } + + Future deleteData(String table, int id) async { + Database db = await instance.database; + return await db.delete(table, where: 'id = ?', whereArgs: [id]); + } + + Future deleteAllData(String table) async { + Database db = await instance.database; + return await db.delete(table); + } +} diff --git a/siro_admin/lib/models/feedback_qury.sql b/siro_admin/lib/models/feedback_qury.sql new file mode 100644 index 0000000..a05fe96 --- /dev/null +++ b/siro_admin/lib/models/feedback_qury.sql @@ -0,0 +1,40 @@ +-- Frequent Complaint Passengers +SELECT + passengers.id AS passenger_id, + passengers.first_name, + passengers.last_name, + passengers.phone, + COUNT(`feedBack`.id) AS complaint_count +FROM + passengers +JOIN `feedBack` ON passengers.id = `feedBack`.`passengerId` +GROUP BY + passengers.id +ORDER BY + complaint_count +DESC +LIMIT 10; +--========== +-- to get all driver payment to pay to them +SELECT + p.driverID, + COALESCE(SUM(p.amount), 0) AS total_amount, + COALESCE(SUM(p.amount), 0) + COALESCE(pd.total_points, 0) AS diff +FROM + payments p +JOIN ( + SELECT + driverID, + SUM(amount) AS total_points + FROM + paymentsDriverPoints + WHERE + payment_method = 'fromBudgetToPoints' + GROUP BY + driverID +) pd ON p.driverID = pd.driverID +WHERE + p.isGiven = 'waiting' + AND p.payment_method IN ('visa-in', 'visa', 'visaRide', 'TransferFrom', 'payout', 'TransferTo') +GROUP BY + p.driverID; diff --git a/siro_admin/lib/models/model/admin/monthly_ride.dart b/siro_admin/lib/models/model/admin/monthly_ride.dart new file mode 100644 index 0000000..df4d600 --- /dev/null +++ b/siro_admin/lib/models/model/admin/monthly_ride.dart @@ -0,0 +1,21 @@ +class MonthlyDataModel { + final int year; + final int month; + final int day; + final int ridesCount; + + MonthlyDataModel({ + required this.year, + required this.month, + required this.day, + required this.ridesCount, + }); + + factory MonthlyDataModel.fromJson(Map json) => + MonthlyDataModel( + year: json['year'] as int, + month: json['month'] as int, + day: json['day'] as int, + ridesCount: json['rides_count'] as int, + ); +} diff --git a/siro_admin/lib/models/model/admin/passenger_model.dart b/siro_admin/lib/models/model/admin/passenger_model.dart new file mode 100644 index 0000000..ed920bb --- /dev/null +++ b/siro_admin/lib/models/model/admin/passenger_model.dart @@ -0,0 +1,79 @@ +class Passenger { + String id; + String phone; + String email; + String gender; + String status; + String birthdate; + String site; + String firstName; + String lastName; + String sosPhone; + String education; + String employmentType; + String maritalStatus; + String createdAt; + String updatedAt; + int countPassenger; + int countFeedback; + double ratingPassenger; + int countDriverRate; + int countPassengerCancel; + double passengerAverageRating; + int countPassengerRate; + int countPassengerRide; + + Passenger({ + required this.id, + required this.phone, + required this.email, + required this.gender, + required this.status, + required this.birthdate, + required this.site, + required this.firstName, + required this.lastName, + required this.sosPhone, + required this.education, + required this.employmentType, + required this.maritalStatus, + required this.createdAt, + required this.updatedAt, + required this.countPassenger, + required this.countFeedback, + required this.ratingPassenger, + required this.countDriverRate, + required this.countPassengerCancel, + required this.passengerAverageRating, + required this.countPassengerRate, + required this.countPassengerRide, + }); + + factory Passenger.fromJson(Map json) { + return Passenger( + id: json['id'], + phone: json['phone'], + email: json['email'], + gender: json['gender'], + status: json['status'], + birthdate: json['birthdate'], + site: json['site'], + firstName: json['first_name'], + lastName: json['last_name'], + sosPhone: json['sosPhone'], + education: json['education'], + employmentType: json['employmentType'], + maritalStatus: json['maritalStatus'], + createdAt: json['created_at'], + updatedAt: json['updated_at'], + countPassenger: json['countPassenger'], + countFeedback: json['countFeedback'], + ratingPassenger: json['ratingPassenger'].toDouble(), + countDriverRate: json['countDriverRate'], + countPassengerCancel: json['countPassengerCancel'], + passengerAverageRating: json['passengerAverageRating'].toDouble(), + countPassengerRate: json['countPassengerRate'], + countPassengerRide: json['countPassengerRide'], + ); + } +} diff --git a/siro_admin/lib/models/model/admin/rides_summary_model.dart b/siro_admin/lib/models/model/admin/rides_summary_model.dart new file mode 100644 index 0000000..b3b1113 --- /dev/null +++ b/siro_admin/lib/models/model/admin/rides_summary_model.dart @@ -0,0 +1,12 @@ +class MonthlyDataModel { + int day; + int totalDuration; + + MonthlyDataModel({required this.day, required this.totalDuration}); + + factory MonthlyDataModel.fromJson(Map json) => + MonthlyDataModel( + day: int.parse(json['day'].toString().split('-')[2]), + totalDuration: + int.parse(json['total_duration'].toString().split(':')[0])); +} diff --git a/siro_admin/lib/models/model/locations.dart b/siro_admin/lib/models/model/locations.dart new file mode 100644 index 0000000..3b18b60 --- /dev/null +++ b/siro_admin/lib/models/model/locations.dart @@ -0,0 +1,34 @@ +class CarLocationModel { + String id; + String driverId; + double latitude; + double heading; + double speed; + double longitude; + DateTime createdAt; + DateTime updatedAt; + + CarLocationModel({ + required this.id, + required this.driverId, + required this.latitude, + required this.longitude, + required this.heading, + required this.speed, + required this.createdAt, + required this.updatedAt, + }); + + factory CarLocationModel.fromJson(Map json) { + return CarLocationModel( + id: json['id'], + driverId: json['driver_id'], + latitude: double.parse(json['latitude'].toString()), + longitude: double.parse(json['longitude'].toString()), + heading: double.parse(json['heading'].toString()), + speed: double.parse(json['speed'].toString()), + createdAt: DateTime.parse(json['created_at']), + updatedAt: DateTime.parse(json['updated_at']), + ); + } +} diff --git a/siro_admin/lib/models/model/onboarding_model.dart b/siro_admin/lib/models/model/onboarding_model.dart new file mode 100644 index 0000000..199909f --- /dev/null +++ b/siro_admin/lib/models/model/onboarding_model.dart @@ -0,0 +1,30 @@ +import 'package:get/get.dart'; + +List onBoardingList = [ + OnBoardingModel( + title: 'Welcome to Sefer!'.tr, + image: 'assets/images/on1.png', + body: + 'Sefer is the ride-hailing app that is safe, reliable, and accessible.' + .tr, + ), + OnBoardingModel( + title: 'Get to your destination quickly and easily.'.tr, + image: 'assets/images/on2.png', + body: 'With Sefer, you can get a ride to your destination in minutes.'.tr, + ), + OnBoardingModel( + title: 'Enjoy a safe and comfortable ride.'.tr, + image: 'assets/images/on3.png', + body: + 'Sefer is committed to safety, and all of our captains are carefully screened and background checked.' + .tr, + ), +]; + +class OnBoardingModel { + final String? title; + final String? image; + final String? body; + OnBoardingModel({this.body, this.title, this.image}); +} diff --git a/siro_admin/lib/models/model/passengers_model.dart b/siro_admin/lib/models/model/passengers_model.dart new file mode 100644 index 0000000..c044e56 --- /dev/null +++ b/siro_admin/lib/models/model/passengers_model.dart @@ -0,0 +1,77 @@ +class MonthlyPassengerInstall { + int day; + int totalPassengers; + + MonthlyPassengerInstall({required this.day, required this.totalPassengers}); + + factory MonthlyPassengerInstall.fromJson(Map json) => + MonthlyPassengerInstall( + day: int.parse(json['day'].toString().split('-')[2]), + totalPassengers: + int.parse(json['totalPassengers'].toString().split(':')[0])); +} + +class MonthlyRidesInstall { + int day; + int totalRides; + + MonthlyRidesInstall({required this.day, required this.totalRides}); + + factory MonthlyRidesInstall.fromJson(Map json) => + MonthlyRidesInstall( + day: int.parse(json['day'].toString().split('-')[2]), + totalRides: int.parse(json['totalRides'].toString().split(':')[0])); +} + +class MonthlyEmployeeData { + int day; + int totalEmployees; + String name; + + MonthlyEmployeeData( + {required this.day, required this.totalEmployees, required this.name}); + + factory MonthlyEmployeeData.fromJson(Map json) => + MonthlyEmployeeData( + day: int.parse(json['date'].toString().split('-')[2]), // Extract day + totalEmployees: json['count'], + name: json['NAME'], + ); +} + +class MonthlyDriverInstall { + int day; + int totalDrivers; + int dailyTotalDrivers; + int dailyTotalCallingDrivers; + int dailyMatchingNotes; + int totalMonthlyDrivers; + int totalMonthlyCallingDrivers; + int totalMonthlyMatchingNotes; + + MonthlyDriverInstall({ + required this.day, + required this.totalDrivers, + required this.dailyTotalDrivers, + required this.dailyTotalCallingDrivers, + required this.dailyMatchingNotes, + required this.totalMonthlyDrivers, + required this.totalMonthlyCallingDrivers, + required this.totalMonthlyMatchingNotes, + }); + + factory MonthlyDriverInstall.fromJson(Map json) => + MonthlyDriverInstall( + day: int.parse(json['day'].toString().split('-')[2]), + totalDrivers: int.parse(json['totalDrivers'].toString()), + dailyTotalDrivers: int.parse(json['dailyTotalDrivers'].toString()), + dailyTotalCallingDrivers: + int.parse(json['dailyTotalCallingDrivers'].toString()), + dailyMatchingNotes: int.parse(json['dailyMatchingNotes'].toString()), + totalMonthlyDrivers: int.parse(json['totalMonthlyDrivers'].toString()), + totalMonthlyCallingDrivers: + int.parse(json['totalMonthlyCallingDrivers'].toString()), + totalMonthlyMatchingNotes: + int.parse(json['totalMonthlyMatchingNotes'].toString()), + ); +} diff --git a/siro_admin/lib/print.dart b/siro_admin/lib/print.dart new file mode 100644 index 0000000..c13fa9d --- /dev/null +++ b/siro_admin/lib/print.dart @@ -0,0 +1,18 @@ +import 'dart:developer' as developer; +import 'package:flutter/foundation.dart'; + +class Log { + Log._(); + + static void print(dynamic value, {StackTrace? stackTrace}) { + // استخدام debugPrint بدلاً من print العادي لتجنب تعليق الجهاز في الرسائل الطويلة + debugPrint("LOG: ${value.toString()}"); + + // يمكن أيضاً إرسالها للـ developer log لضمان ظهورها في الـ Debug Console الخاص بـ VS Code + developer.log(value.toString(), name: 'LOG', stackTrace: stackTrace); + } + + static Object? inspect(Object? object) { + return developer.inspect(object); + } +} diff --git a/siro_admin/lib/routes.dart b/siro_admin/lib/routes.dart new file mode 100644 index 0000000..a7f8a40 --- /dev/null +++ b/siro_admin/lib/routes.dart @@ -0,0 +1,19 @@ +import 'package:get/get.dart'; +import 'views/admin/admin_home_page.dart'; +import 'views/auth/login_page.dart'; +import 'views/auth/register_page.dart'; +import 'views/admin/promo/promo_management_page.dart'; +import 'views/admin/pricing/kazan_editor_page.dart'; +import 'views/admin/complaints/complaint_list_page.dart'; +import 'views/admin/drivers/driver_documents_review_page.dart'; + +List> routes = [ + GetPage(name: "/", page: () => const AdminHomePage()), + GetPage(name: "/login", page: () => const AdminLoginPage()), + GetPage(name: "/register", page: () => const RegisterPage()), + GetPage(name: "/promo", page: () => PromoManagementPage()), + GetPage(name: "/kazan", page: () => KazanEditorPage()), + GetPage(name: "/complaints", page: () => ComplaintListPage()), + GetPage(name: "/driver-docs", page: () => DriverDocsReviewPage()), +]; + diff --git a/siro_admin/lib/views/admin/admin_home_page.dart b/siro_admin/lib/views/admin/admin_home_page.dart new file mode 100644 index 0000000..5d33d61 --- /dev/null +++ b/siro_admin/lib/views/admin/admin_home_page.dart @@ -0,0 +1,1123 @@ +import 'dart:math'; +import 'dart:ui'; + +import 'package:flutter/material.dart'; +import 'package:flutter_staggered_animations/flutter_staggered_animations.dart'; +import 'package:get/get.dart'; +import 'package:siro_admin/views/admin/drivers/driver_gift_check_page.dart'; +import 'package:siro_admin/views/admin/drivers/driver_tracker_screen.dart'; +import 'package:siro_admin/views/admin/quality/blacklist_page.dart'; + +import '../../constant/box_name.dart'; +import '../../constant/colors.dart'; +import '../../constant/style.dart'; +import '../../controller/admin/dashboard_controller.dart'; +import '../../controller/admin/static_controller.dart'; +import '../../controller/functions/crud.dart'; +import '../../controller/notification_controller.dart'; +import '../../main.dart'; +import '../../print.dart'; +import '../invoice/invoice_list_page.dart'; +import 'captain/captain.dart'; +import 'captain/syrian_driver_not_active.dart'; +import 'drivers/monitor_ride.dart'; +import 'employee/employee_page.dart'; +import 'enceypt/driver_fingerprint_migration.dart'; +import 'enceypt/encrypt.dart'; +import 'enceypt/fingerprint_migration.dart'; +import 'error/error/error_page.dart'; +import 'packages.dart'; +import 'passenger/passenger.dart'; +import 'rides/ride_lookup_page.dart'; +import 'server/monitor_server_page.dart'; +import 'static/static.dart'; +import 'wallet/wallet.dart'; +import 'staff/add_staff_page.dart'; +import 'staff/pending_admins_page.dart'; +import 'dashboard_v2_widget.dart'; +import 'static/advanced_analytics_page.dart'; +import 'financial/financial_v2_page.dart'; +import 'security/audit_logs_page.dart'; + +class AdminHomePage extends StatefulWidget { + const AdminHomePage({super.key}); + + @override + State createState() => _AdminHomePageState(); +} + +class _AdminHomePageState extends State + with SingleTickerProviderStateMixin { + final TextEditingController _messageController = TextEditingController(); + final TextEditingController _searchController = TextEditingController(); + late AnimationController _pulseController; + + late bool isSuperAdmin; + late DashboardController dashboardController; + String _searchQuery = ''; + + // ══════════════════ DESIGN TOKENS ══════════════════ + // --- Unified with AppColor --- + static const Color _bg = AppColor.bg; + static const Color _surface = AppColor.surface; + static const Color _surfaceElevated = AppColor.surfaceElevated; + static const Color _accent = AppColor.accent; + static const Color _accentSoft = AppColor.accentSoft; + static const Color _accentBorder = AppColor.accentBorder; + static const Color _danger = AppColor.danger; + static const Color _warning = AppColor.warning; + static const Color _info = AppColor.info; + static const Color _success = AppColor.success; + static const Color _textPrimary = AppColor.textPrimary; + static const Color _textSecondary = AppColor.textSecondary; + static const Color _divider = AppColor.divider; + + @override + void initState() { + super.initState(); + _pulseController = AnimationController( + vsync: this, + duration: const Duration(seconds: 2), + )..repeat(reverse: true); + + final String role = box.read('admin_role')?.toString() ?? 'admin'; + final String myPhone = box.read(BoxName.adminPhone)?.toString() ?? ''; + + // التحقق من الصلاحيات: إما عن طريق الدور أو عن طريق قائمة أرقام السوبر أدمن التقليدية + isSuperAdmin = (role == 'super_admin') || + (myPhone == '201023248456' || + myPhone == '963992952235' || + myPhone == '963942542053'); + + Log.print('AdminHomePage: role=$role, isSuperAdmin=$isSuperAdmin'); + dashboardController = Get.put(DashboardController()); + } + + @override + void dispose() { + _pulseController.dispose(); + _messageController.dispose(); + _searchController.dispose(); + super.dispose(); + } + + // ══════════════════════════════════════════════════════════════ + // BUILD + // ══════════════════════════════════════════════════════════════ + @override + Widget build(BuildContext context) { + return Scaffold( + backgroundColor: _bg, + body: RefreshIndicator( + onRefresh: () async => await dashboardController.getDashBoard(), + color: _accent, + backgroundColor: _surface, + child: GetBuilder( + builder: (controller) { + if (controller.dashbord.isEmpty) { + return _buildLoadingState(); + } + + final data = controller.dashbord[0]; + final categories = _getFilteredCategories(); + + return CustomScrollView( + physics: const BouncingScrollPhysics(), + slivers: [ + _buildSliverAppBar(controller), + _buildSearchBar(), + if (_searchQuery.isEmpty) const DashboardV2Widget(), + if (_searchQuery.isEmpty) + _buildQuickStatsSection(data, controller), + SliverPadding( + padding: const EdgeInsets.only(bottom: 60), + sliver: SliverList( + delegate: SliverChildBuilderDelegate( + (context, index) { + final category = categories[index]; + if (category.items.isEmpty) + return const SizedBox.shrink(); + + return AnimationConfiguration.staggeredList( + position: index, + duration: const Duration(milliseconds: 450), + child: SlideAnimation( + verticalOffset: 40.0, + child: FadeInAnimation( + child: _buildCategorySection(category), + ), + ), + ); + }, + childCount: categories.length, + ), + ), + ), + ], + ); + }, + ), + ), + ); + } + + // ══════════════════════════════════════════════════════════════ + // LOADING STATE + // ══════════════════════════════════════════════════════════════ + Widget _buildLoadingState() { + return Center( + child: Column( + mainAxisSize: MainAxisSize.min, + children: [ + Container( + width: 60, + height: 60, + decoration: BoxDecoration( + shape: BoxShape.circle, + gradient: RadialGradient( + colors: [_accent.withOpacity(0.3), Colors.transparent], + ), + ), + child: const Center( + child: SizedBox( + width: 28, + height: 28, + child: CircularProgressIndicator( + color: _accent, + strokeWidth: 2.5, + ), + ), + ), + ), + const SizedBox(height: 16), + Text('جاري التحميل...', + style: TextStyle(color: _textSecondary, fontSize: 13)), + ], + ), + ); + } + + // ══════════════════════════════════════════════════════════════ + // SLIVER APP BAR + // ══════════════════════════════════════════════════════════════ + Widget _buildSliverAppBar(DashboardController controller) { + return SliverAppBar( + expandedHeight: 130.0, + floating: true, + pinned: true, + backgroundColor: _bg, + elevation: 0, + flexibleSpace: FlexibleSpaceBar( + collapseMode: CollapseMode.pin, + background: Stack( + fit: StackFit.expand, + children: [ + // Aurora gradient background + Container( + decoration: const BoxDecoration( + gradient: LinearGradient( + begin: Alignment.topLeft, + end: Alignment.bottomRight, + colors: [ + Color(0xFF0D2137), + Color(0xFF0D1117), + Color(0xFF0F1F1A), + ], + ), + ), + ), + // Subtle glow orbs + Positioned( + top: -30, + left: -40, + child: _GlowOrb(color: _accent, size: 150, opacity: 0.08), + ), + Positioned( + top: -20, + right: -20, + child: _GlowOrb(color: _info, size: 120, opacity: 0.06), + ), + // Content + Align( + alignment: Alignment.bottomCenter, + child: Padding( + padding: const EdgeInsets.only(bottom: 18), + child: Column( + mainAxisSize: MainAxisSize.min, + children: [ + _buildLogo(), + const SizedBox(height: 6), + Text( + isSuperAdmin ? 'Super Admin Panel' : 'Admin Panel', + style: TextStyle( + color: _textSecondary, + fontSize: 11, + letterSpacing: 1.5, + ), + ), + ], + ), + ), + ), + ], + ), + ), + actions: [ + _buildHeaderAction( + Icons.refresh_rounded, () => controller.getDashBoard()), + const SizedBox(width: 8), + ], + ); + } + + Widget _buildLogo() { + return Row( + mainAxisSize: MainAxisSize.min, + children: [ + AnimatedBuilder( + animation: _pulseController, + builder: (_, __) { + return Container( + padding: const EdgeInsets.all(8), + decoration: BoxDecoration( + borderRadius: BorderRadius.circular(12), + gradient: LinearGradient( + colors: [ + _accent.withOpacity(0.3 + 0.1 * _pulseController.value), + _accent.withOpacity(0.1), + ], + ), + border: Border.all( + color: + _accent.withOpacity(0.4 + 0.2 * _pulseController.value), + width: 1, + ), + ), + child: const Icon( + Icons.admin_panel_settings_rounded, + color: _accent, + size: 18, + ), + ); + }, + ), + const SizedBox(width: 10), + ShaderMask( + shaderCallback: (bounds) => const LinearGradient( + colors: [_accent, _info], + ).createShader(bounds), + child: const Text( + 'Intaleq Admin', + style: TextStyle( + color: Colors.white, + fontWeight: FontWeight.w700, + fontSize: 20, + letterSpacing: 0.5, + ), + ), + ), + ], + ); + } + + Widget _buildHeaderAction(IconData icon, VoidCallback onTap) { + return GestureDetector( + onTap: onTap, + child: Container( + padding: const EdgeInsets.all(8), + decoration: BoxDecoration( + color: _surface, + borderRadius: BorderRadius.circular(10), + border: Border.all(color: _divider), + ), + child: Icon(icon, color: _textSecondary, size: 18), + ), + ); + } + + // ══════════════════════════════════════════════════════════════ + // SEARCH BAR + // ══════════════════════════════════════════════════════════════ + Widget _buildSearchBar() { + return SliverToBoxAdapter( + child: Padding( + padding: const EdgeInsets.fromLTRB(16, 12, 16, 4), + child: Container( + decoration: BoxDecoration( + color: _surface, + borderRadius: BorderRadius.circular(14), + border: Border.all( + color: _searchQuery.isNotEmpty ? _accentBorder : _divider, + width: _searchQuery.isNotEmpty ? 1.5 : 1, + ), + ), + child: TextField( + controller: _searchController, + onChanged: (val) => setState(() => _searchQuery = val), + style: const TextStyle(color: _textPrimary, fontSize: 14), + decoration: InputDecoration( + hintText: 'ابحث عن خدمة أو ميزة...', + hintStyle: const TextStyle(color: _textSecondary, fontSize: 13), + prefixIcon: + const Icon(Icons.search_rounded, color: _accent, size: 20), + suffixIcon: _searchQuery.isNotEmpty + ? IconButton( + icon: Icon(Icons.close_rounded, + color: _textSecondary, size: 18), + onPressed: () { + setState(() { + _searchQuery = ''; + _searchController.clear(); + }); + }, + ) + : null, + border: InputBorder.none, + contentPadding: + const EdgeInsets.symmetric(horizontal: 16, vertical: 14), + ), + ), + ), + ), + ); + } + + // ══════════════════════════════════════════════════════════════ + // QUICK STATS SECTION + // ══════════════════════════════════════════════════════════════ + Widget _buildQuickStatsSection(dynamic data, DashboardController controller) { + final highlights = [ + _HighlightData( + 'إجمالي الركاب', data['countPassengers'], Icons.group_rounded, _info), + _HighlightData('إجمالي السائقين', data['countDriver'], + Icons.drive_eta_rounded, _warning), + _HighlightData('رحلات الشهر', data['countRideThisMonth'], + Icons.calendar_today_rounded, const Color(0xFFC792EA)), + if (isSuperAdmin) + _HighlightData('المحفظة', _formatCurrency(data['seferWallet']), + Icons.account_balance_wallet_rounded, _accent), + ]; + + final detailedStats = _getDetailedStats(data, controller); + + return SliverToBoxAdapter( + child: Padding( + padding: const EdgeInsets.only(top: 8), + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + // Section label + Padding( + padding: const EdgeInsets.fromLTRB(20, 8, 20, 10), + child: Row( + children: [ + Container( + width: 3, + height: 14, + decoration: BoxDecoration( + color: _accent, + borderRadius: BorderRadius.circular(2), + ), + ), + const SizedBox(width: 8), + const Text('نظرة عامة', + style: TextStyle( + color: _textSecondary, + fontSize: 11, + fontWeight: FontWeight.w600, + letterSpacing: 1.2, + )), + ], + ), + ), + + // Highlight Cards + SizedBox( + height: 108, + child: ListView.builder( + padding: const EdgeInsets.symmetric(horizontal: 16), + scrollDirection: Axis.horizontal, + itemCount: highlights.length, + itemBuilder: (ctx, i) => Padding( + padding: EdgeInsets.only( + right: i < highlights.length - 1 ? 10 : 0), + child: _buildHighlightCard(highlights[i]), + ), + ), + ), + + const SizedBox(height: 16), + + // Detailed stats strip + Padding( + padding: const EdgeInsets.symmetric(horizontal: 16), + child: Container( + decoration: BoxDecoration( + color: _surface, + borderRadius: BorderRadius.circular(16), + border: Border.all(color: _divider), + ), + child: ClipRRect( + borderRadius: BorderRadius.circular(16), + child: SingleChildScrollView( + scrollDirection: Axis.horizontal, + child: Row( + children: List.generate(detailedStats.length, (i) { + final stat = detailedStats[i]; + return Row( + mainAxisSize: MainAxisSize.min, + children: [ + _buildDetailStatItem(stat), + if (i < detailedStats.length - 1) + Container( + width: 1, + height: 36, + color: _divider, + ), + ], + ); + }), + ), + ), + ), + ), + ), + + const SizedBox(height: 8), + ], + ), + ), + ); + } + + Widget _buildHighlightCard(_HighlightData h) { + return Container( + width: 148, + padding: const EdgeInsets.all(16), + decoration: BoxDecoration( + color: _surface, + borderRadius: BorderRadius.circular(16), + border: Border.all(color: h.color.withOpacity(0.2)), + boxShadow: [ + BoxShadow( + color: h.color.withOpacity(0.08), + blurRadius: 16, + offset: const Offset(0, 6), + ), + ], + ), + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + Container( + padding: const EdgeInsets.all(7), + decoration: BoxDecoration( + color: h.color.withOpacity(0.12), + borderRadius: BorderRadius.circular(9), + ), + child: Icon(h.icon, color: h.color, size: 16), + ), + Container( + width: 6, + height: 6, + decoration: BoxDecoration( + shape: BoxShape.circle, + color: h.color.withOpacity(0.6), + ), + ), + ], + ), + const Spacer(), + Text( + h.value.toString(), + style: const TextStyle( + color: _textPrimary, + fontSize: 20, + fontWeight: FontWeight.w700, + height: 1.1, + ), + overflow: TextOverflow.ellipsis, + ), + const SizedBox(height: 3), + Text( + h.label, + style: const TextStyle( + color: _textSecondary, + fontSize: 10, + fontWeight: FontWeight.w500, + ), + overflow: TextOverflow.ellipsis, + ), + ], + ), + ); + } + + Widget _buildDetailStatItem(Map stat) { + return Padding( + padding: const EdgeInsets.symmetric(horizontal: 18, vertical: 14), + child: Column( + mainAxisSize: MainAxisSize.min, + children: [ + Icon(stat['icon'] as IconData, + color: stat['color'] as Color, size: 20), + const SizedBox(height: 6), + Text( + stat['value'].toString(), + style: const TextStyle( + color: _textPrimary, + fontSize: 14, + fontWeight: FontWeight.bold, + height: 1, + ), + ), + const SizedBox(height: 3), + Text( + stat['title'] as String, + style: const TextStyle( + color: _textSecondary, + fontSize: 9, + fontWeight: FontWeight.w500, + ), + ), + ], + ), + ); + } + + // ══════════════════════════════════════════════════════════════ + // CATEGORY SECTION + // ══════════════════════════════════════════════════════════════ + Widget _buildCategorySection(ActionCategory category) { + return Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Padding( + padding: const EdgeInsets.fromLTRB(20, 20, 20, 12), + child: Row( + children: [ + Container( + width: 3, + height: 14, + decoration: BoxDecoration( + color: _accent, + borderRadius: BorderRadius.circular(2), + ), + ), + const SizedBox(width: 8), + Text( + category.title, + style: const TextStyle( + color: _textPrimary, + fontSize: 15, + fontWeight: FontWeight.w600, + letterSpacing: 0.3, + ), + ), + const SizedBox(width: 10), + Expanded( + child: Container(height: 1, color: _divider), + ), + const SizedBox(width: 8), + Text( + '${category.items.length}', + style: const TextStyle( + color: _textSecondary, + fontSize: 11, + fontWeight: FontWeight.w500, + ), + ), + ], + ), + ), + GridView.builder( + padding: const EdgeInsets.symmetric(horizontal: 16), + shrinkWrap: true, + physics: const NeverScrollableScrollPhysics(), + gridDelegate: const SliverGridDelegateWithMaxCrossAxisExtent( + maxCrossAxisExtent: 120, + childAspectRatio: 0.88, + crossAxisSpacing: 10, + mainAxisSpacing: 10, + ), + itemCount: category.items.length, + itemBuilder: (context, index) => + _buildActionItem(category.items[index]), + ), + const SizedBox(height: 8), + ], + ); + } + + Widget _buildActionItem(ActionItem item) { + return Material( + color: Colors.transparent, + child: InkWell( + onTap: item.onPressed, + borderRadius: BorderRadius.circular(16), + splashColor: item.color.withOpacity(0.1), + highlightColor: item.color.withOpacity(0.05), + child: Container( + decoration: BoxDecoration( + color: _surface, + borderRadius: BorderRadius.circular(16), + border: Border.all(color: _divider), + ), + child: Column( + mainAxisAlignment: MainAxisAlignment.center, + children: [ + Container( + padding: const EdgeInsets.all(11), + decoration: BoxDecoration( + gradient: LinearGradient( + begin: Alignment.topLeft, + end: Alignment.bottomRight, + colors: [ + item.color.withOpacity(0.20), + item.color.withOpacity(0.08), + ], + ), + borderRadius: BorderRadius.circular(12), + border: Border.all(color: item.color.withOpacity(0.25)), + boxShadow: [ + BoxShadow( + color: item.color.withOpacity(0.15), + blurRadius: 10, + offset: const Offset(0, 3), + ), + ], + ), + child: Icon(item.icon, color: item.color, size: 22), + ), + const SizedBox(height: 10), + Padding( + padding: const EdgeInsets.symmetric(horizontal: 6), + child: Text( + item.title, + textAlign: TextAlign.center, + maxLines: 2, + overflow: TextOverflow.ellipsis, + style: const TextStyle( + color: _textPrimary, + fontSize: 11, + fontWeight: FontWeight.w500, + height: 1.3, + ), + ), + ), + ], + ), + ), + ), + ); + } + + // ══════════════════════════════════════════════════════════════ + // DATA HELPERS + // ══════════════════════════════════════════════════════════════ + List _getFilteredCategories() { + final all = _getAllActionCategories(); + if (_searchQuery.isEmpty) return all; + + return all + .map((cat) { + final matched = cat.items + .where((item) => + item.title.toLowerCase().contains(_searchQuery.toLowerCase())) + .toList(); + return matched.isEmpty + ? null + : ActionCategory(title: cat.title, items: matched); + }) + .whereType() + .toList(); + } + + List _getAllActionCategories() { + return [ + ActionCategory( + title: 'المستخدمين', + items: [ + ActionItem('الركاب', Icons.people_outline_rounded, _info, + () => Get.to(() => Passengrs())), + ActionItem('السائقون', Icons.drive_eta_rounded, _warning, + () => Get.to(() => CaptainsPage())), + ActionItem('المراقب', Icons.track_changes_rounded, _danger, + () => Get.to(() => IntaleqTrackerScreen())), + ], + ), + ActionCategory( + title: 'إدارة النظام الجديد', + items: [ + ActionItem('أكواد الخصم', Icons.confirmation_number_rounded, _accent, + () => Get.toNamed('/promo')), + ActionItem('تعديل الأسعار', Icons.settings_suggest_rounded, _warning, + () => Get.toNamed('/kazan')), + ActionItem('الشكاوى', Icons.report_problem_rounded, _danger, + () => Get.toNamed('/complaints')), + ActionItem('مراجعة الوثائق', Icons.assignment_ind_rounded, _info, + () => Get.toNamed('/driver-docs')), + ], + ), + ActionCategory( + title: 'العمليات', + items: [ + ActionItem('الرحلات', Icons.map_rounded, const Color(0xFF82AAFF), + () => Get.to(() => RidesDashboardScreen())), + if (isSuperAdmin) + ActionItem( + 'مراقبة الرحلات', + Icons.remove_red_eye_rounded, + const Color(0xFFC792EA), + () => Get.to(() => RideMonitorScreen())), + ActionItem('الإحصائيات', Icons.bar_chart_rounded, _accent, () async { + await Get.put(StaticController()).getAll(); + Get.to(() => const StaticDash()); + }), + ActionItem('التحليلات المتقدمة', Icons.analytics_rounded, _info, + () => Get.to(() => const AdvancedAnalyticsPage())), + ], + ), + ActionCategory( + title: 'الجودة والدعم', + items: [ + ActionItem('القائمة السوداء', Icons.block_flipped, _danger, + () => Get.to(() => const BlacklistPage())), + ], + ), + if (true) + ActionCategory( + title: 'المالية والإدارة', + items: [ + ActionItem('الإدارة المالية V2', Icons.account_balance_rounded, _accent, + () => Get.to(() => const FinancialV2Page())), + ActionItem('المحفظة', Icons.account_balance_wallet_rounded, _accent, + () => Get.to(() => Wallet())), + ActionItem('هدية 300', Icons.card_giftcard_rounded, _warning, + () => Get.to(() => DriverGiftCheckPage())), + ActionItem('الفواتير', Icons.receipt_long_rounded, + const Color(0xFF80CBC4), () => Get.to(() => InvoiceListPage())), + ActionItem('الموظفون', Icons.badge_rounded, const Color(0xFFB0BEC5), + () => Get.to(() => EmployeePage())), + ActionItem('موافقة المشرفين', Icons.how_to_reg_rounded, _accent, + () => Get.to(() => const PendingAdminsPage())), + ], + ), + if (true) + ActionCategory( + title: 'النظام والتواصل', + items: [ + ActionItem('سجل العمليات', Icons.admin_panel_settings_rounded, + _danger, () => Get.to(() => const AuditLogsPage())), + ActionItem('واتساب جماعي', Icons.message_rounded, + const Color(0xFF4CAF50), () => _showWhatsAppDialog(context)), + ActionItem( + 'إشعار سائقين', + Icons.notifications_active_rounded, + const Color(0xFFFF7043), + () => Get.put(NotificationController()) + .sendNotificationDrivers()), + ActionItem( + 'إشعار ركاب', + Icons.notification_important_rounded, + const Color(0xFFF06292), + () => Get.put(NotificationController()) + .sendNotificationPassengers()), + ActionItem('تسجيل سائق', Icons.person_add_rounded, _info, + () => Get.to(() => DriversPendingPage())), + ActionItem( + 'تحديث التطبيق', + Icons.system_update_rounded, + const Color(0xFFA1887F), + () => Get.to(() => PackageUpdateScreen())), + ActionItem('مراقب السيرفر', Icons.dns_rounded, _accent, + () => Get.to(() => ServerMonitorPage())), + ActionItem('سجل الأخطاء', Icons.error_outline_rounded, _danger, + () => Get.to(() => ErrorListPage())), + ActionItem('encrypt fp', Icons.error_outline_rounded, _danger, + () => Get.to(() => FingerprintMigrationTool())), + ActionItem('encrypt fp drivers', Icons.error_outline_rounded, + _danger, () => Get.to(() => DriverFingerprintMigrationTool())), + ActionItem( + 'أداة التشفير', + Icons.lock_rounded, + const Color(0xFF9575CD), + () => Get.to(() => EncryptToolPage( + adminToken: box.read(BoxName.adminPhone), + ))), + ], + ), + if (isSuperAdmin) + ActionCategory( + title: 'إدارة الكوادر', + items: [ + ActionItem( + 'إضافة مدير', + Icons.admin_panel_settings_rounded, + _accent, + () => Get.to(() => const AddStaffPage(role: 'admin')), + ), + ActionItem( + 'إضافة خدمة عملاء', + Icons.support_agent_rounded, + _info, + () => Get.to(() => const AddStaffPage(role: 'service')), + ), + ], + ), + ]; + } + + List> _getDetailedStats( + dynamic data, DashboardController controller) { + return [ + if (isSuperAdmin) + { + 'title': 'رصيد الرسائل', + 'value': controller.creditSMS, + 'icon': Icons.sms_rounded, + 'color': _info, + }, + { + 'title': 'مكتملة', + 'value': data['completed_rides'], + 'icon': Icons.check_circle_rounded, + 'color': _success, + }, + { + 'title': 'ملغاة', + 'value': data['cancelled_rides'], + 'icon': Icons.cancel_rounded, + 'color': _danger, + }, + { + 'title': 'مدفوعات', + 'value': _formatCurrency(data['payments']), + 'icon': Icons.attach_money_rounded, + 'color': _warning, + }, + { + 'title': 'Comfort', + 'value': data['comfort'], + 'icon': Icons.chair_rounded, + 'color': const Color(0xFF80CBC4), + }, + { + 'title': 'Speed', + 'value': data['speed'], + 'icon': Icons.flash_on_rounded, + 'color': const Color(0xFFFFD54F), + }, + { + 'title': 'Lady', + 'value': data['lady'], + 'icon': Icons.woman_rounded, + 'color': const Color(0xFFF48FB1), + }, + ]; + } + + // ══════════════════════════════════════════════════════════════ + // WHATSAPP DIALOG + // ══════════════════════════════════════════════════════════════ + void _showWhatsAppDialog(BuildContext context) { + Get.dialog( + Dialog( + backgroundColor: Colors.transparent, + child: Container( + decoration: BoxDecoration( + color: _surfaceElevated, + borderRadius: BorderRadius.circular(24), + border: Border.all(color: _divider), + boxShadow: const [ + BoxShadow( + color: Colors.black45, + blurRadius: 30, + offset: Offset(0, 12), + ), + ], + ), + padding: const EdgeInsets.all(24), + child: Column( + mainAxisSize: MainAxisSize.min, + children: [ + Container( + padding: const EdgeInsets.all(16), + decoration: BoxDecoration( + color: const Color(0xFF4CAF50).withAlpha(30), // ~0.12 opacity + shape: BoxShape.circle, + border: Border.all( + color: const Color(0xFF4CAF50).withAlpha(64)), // ~0.25 opacity + ), + child: const Icon(Icons.message_rounded, + color: Color(0xFF4CAF50), size: 28), + ), + const SizedBox(height: 16), + const Text( + 'إرسال واتساب جماعي', + style: TextStyle( + color: _textPrimary, + fontSize: 17, + fontWeight: FontWeight.w700, + ), + ), + const SizedBox(height: 4), + const Text( + 'سيتم إرسال الرسالة لجميع السائقين', + style: TextStyle(color: _textSecondary, fontSize: 11), + ), + const SizedBox(height: 20), + Container( + decoration: BoxDecoration( + color: _bg, + borderRadius: BorderRadius.circular(14), + border: Border.all(color: _divider), + ), + child: TextField( + controller: _messageController, + maxLines: 4, + style: const TextStyle(color: _textPrimary, fontSize: 13), + decoration: const InputDecoration( + hintText: 'اكتب رسالتك هنا...', + hintStyle: TextStyle(color: _textSecondary, fontSize: 12), + border: InputBorder.none, + contentPadding: EdgeInsets.all(14), + ), + ), + ), + const SizedBox(height: 20), + Row( + children: [ + Expanded( + child: TextButton( + onPressed: () => Get.back(), + style: TextButton.styleFrom( + padding: const EdgeInsets.symmetric(vertical: 12), + shape: RoundedRectangleBorder( + borderRadius: BorderRadius.circular(12), + side: const BorderSide(color: _divider), + ), + ), + child: const Text( + 'إلغاء', + style: TextStyle(color: _textSecondary, fontSize: 13), + ), + ), + ), + const SizedBox(width: 12), + Expanded( + child: ElevatedButton.icon( + icon: const Icon(Icons.send_rounded, size: 16), + label: + const Text('إرسال', style: TextStyle(fontSize: 13)), + style: ElevatedButton.styleFrom( + backgroundColor: const Color(0xFF4CAF50), + foregroundColor: Colors.white, + padding: const EdgeInsets.symmetric(vertical: 12), + shape: RoundedRectangleBorder( + borderRadius: BorderRadius.circular(12), + ), + elevation: 0, + ), + onPressed: () async { + if (_messageController.text.isNotEmpty) { + Get.back(); + var driverPhones = box + .read(BoxName.tokensDrivers)['message'] as List?; + if (driverPhones == null || driverPhones.isEmpty) + return; + + Get.snackbar( + 'بدأ الإرسال', + 'سيتم الإرسال في الخلفية', + backgroundColor: + const Color(0xFF4CAF50).withOpacity(0.15), + colorText: _textPrimary, + borderRadius: 12, + margin: const EdgeInsets.all(16), + icon: const Icon(Icons.check_circle_rounded, + color: Color(0xFF4CAF50)), + ); + + for (var driverData in driverPhones) { + if (driverData['phone'] != null) { + await CRUD().sendWhatsAppAuth( + driverData['phone'].toString(), + _messageController.text); + await Future.delayed( + Duration(seconds: Random().nextInt(3) + 1)); + } + } + _messageController.clear(); + } + }, + ), + ), + ], + ), + ], + ), + ), + ), + ); + } + + String _formatCurrency(dynamic value) { + if (value == null) return '0.0'; + return double.tryParse(value.toString())?.toStringAsFixed(1) ?? '0.0'; + } +} + +// ══════════════════════════════════════════════════════════════ +// HELPER WIDGETS +// ══════════════════════════════════════════════════════════════ +class _GlowOrb extends StatelessWidget { + final Color color; + final double size; + final double opacity; + + const _GlowOrb( + {required this.color, required this.size, required this.opacity}); + + @override + Widget build(BuildContext context) { + return Container( + width: size, + height: size, + decoration: BoxDecoration( + shape: BoxShape.circle, + gradient: RadialGradient( + colors: [color.withOpacity(opacity), Colors.transparent], + ), + ), + ); + } +} + +// ══════════════════════════════════════════════════════════════ +// DATA CLASSES +// ══════════════════════════════════════════════════════════════ +class _HighlightData { + final String label; + final dynamic value; + final IconData icon; + final Color color; + _HighlightData(this.label, this.value, this.icon, this.color); +} + +class ActionItem { + final String title; + final IconData icon; + final Color color; + final VoidCallback onPressed; + ActionItem(this.title, this.icon, this.color, this.onPressed); +} + +class ActionCategory { + final String title; + final List items; + ActionCategory({required this.title, required this.items}); +} diff --git a/siro_admin/lib/views/admin/captain/captain.dart b/siro_admin/lib/views/admin/captain/captain.dart new file mode 100644 index 0000000..6cf84cd --- /dev/null +++ b/siro_admin/lib/views/admin/captain/captain.dart @@ -0,0 +1,335 @@ +import 'package:flutter/material.dart'; +import 'package:get/get.dart'; + +import '../../../constant/box_name.dart'; +import '../../../main.dart'; +import '../../widgets/my_scafold.dart'; +import '../../widgets/mycircular.dart'; +import '../../../controller/admin/captain_admin_controller.dart'; +import 'captain_details.dart'; + +class CaptainsPage extends StatelessWidget { + CaptainsPage({super.key}); + + final CaptainAdminController captainController = + Get.put(CaptainAdminController()); + final TextEditingController searchController = TextEditingController(); + + String myPhone = box.read(BoxName.adminPhone).toString(); + bool isSuperAdmin = false; + + @override + Widget build(BuildContext context) { + isSuperAdmin = myPhone == '963942542053' || myPhone == '963992952235'; + + return MyScafolld( + title: 'Search for Captain'.tr, + isleading: true, + body: [ + Container( + height: MediaQuery.of(context).size.height, + decoration: BoxDecoration( + gradient: LinearGradient( + begin: Alignment.topCenter, + end: Alignment.bottomCenter, + colors: [ + Theme.of(context).primaryColor.withOpacity(0.03), + Colors.white, + ], + ), + ), + child: Column( + children: [ + _buildHeaderSection(context), + Expanded( + child: GetBuilder( + builder: (controller) { + if (controller.isLoading) { + return _buildLoadingState(); + } + + final message = controller.captainData['message']; + + if (message == null) { + return _buildEmptyState(); + } + + // 🔥 الحل هنا: توحيد الشكل إلى List + final List captains = + message is List ? message : [message]; + + if (captains.isEmpty) { + return _buildEmptyState(); + } + + return _buildResultsList(context, captains); + }, + ), + ), + ], + ), + ), + ], + ); + } + + // ================= HEADER ================= + + Widget _buildHeaderSection(BuildContext context) { + return Container( + padding: const EdgeInsets.fromLTRB(20, 20, 20, 16), + decoration: BoxDecoration( + color: Colors.white, + boxShadow: [ + BoxShadow( + color: Colors.black.withOpacity(0.04), + blurRadius: 10, + offset: const Offset(0, 2), + ), + ], + ), + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Row( + children: [ + Container( + padding: const EdgeInsets.all(10), + decoration: BoxDecoration( + color: Theme.of(context).primaryColor.withOpacity(0.1), + borderRadius: BorderRadius.circular(12), + ), + child: Icon( + Icons.manage_search_rounded, + color: Theme.of(context).primaryColor, + size: 24, + ), + ), + const SizedBox(width: 12), + Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Text( + 'Find Captain'.tr, + style: const TextStyle( + fontSize: 20, + fontWeight: FontWeight.bold, + color: Colors.black87, + ), + ), + Text( + 'Search by phone number'.tr, + style: TextStyle( + fontSize: 13, + color: Colors.grey[600], + ), + ), + ], + ), + ], + ), + const SizedBox(height: 20), + _buildModernSearchBar(context), + ], + ), + ); + } + + Widget _buildModernSearchBar(BuildContext context) { + return Container( + decoration: BoxDecoration( + color: Colors.grey[50], + borderRadius: BorderRadius.circular(16), + border: Border.all(color: Colors.grey[200]!), + ), + child: Row( + children: [ + Expanded( + child: TextField( + controller: searchController, + keyboardType: TextInputType.phone, + style: const TextStyle(fontSize: 15), + decoration: InputDecoration( + hintText: '0990000000'.tr, + hintStyle: TextStyle(color: Colors.grey[400], fontSize: 14), + prefixIcon: Icon(Icons.phone_android_rounded, + color: Colors.grey[400], size: 22), + border: InputBorder.none, + contentPadding: + const EdgeInsets.symmetric(horizontal: 16, vertical: 14), + ), + onSubmitted: (_) => _performSearch(), + ), + ), + Padding( + padding: const EdgeInsets.all(6.0), + child: Material( + color: Theme.of(context).primaryColor, + borderRadius: BorderRadius.circular(12), + child: InkWell( + onTap: _performSearch, + borderRadius: BorderRadius.circular(12), + child: const Padding( + padding: EdgeInsets.all(12), + child: Icon(Icons.search, color: Colors.white, size: 24), + ), + ), + ), + ), + ], + ), + ); + } + + void _performSearch() { + final phone = searchController.text.trim(); + if (phone.isNotEmpty) { + captainController.find_driver_by_phone(phone); + } + } + + // ================= RESULTS ================= + + Widget _buildResultsList(BuildContext context, List captains) { + return Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Padding( + padding: const EdgeInsets.fromLTRB(20, 20, 20, 12), + child: Row( + children: [ + Text( + 'Search Results'.tr, + style: const TextStyle( + fontSize: 16, + fontWeight: FontWeight.w600, + color: Colors.black87, + ), + ), + const SizedBox(width: 8), + Container( + padding: const EdgeInsets.symmetric(horizontal: 8, vertical: 4), + decoration: BoxDecoration( + color: Theme.of(context).primaryColor.withOpacity(0.1), + borderRadius: BorderRadius.circular(12), + ), + child: Text( + '${captains.length}', + style: TextStyle( + fontSize: 13, + fontWeight: FontWeight.bold, + color: Theme.of(context).primaryColor, + ), + ), + ), + ], + ), + ), + Expanded( + child: ListView.separated( + physics: const BouncingScrollPhysics(), + padding: const EdgeInsets.fromLTRB(20, 0, 20, 80), + itemCount: captains.length, + separatorBuilder: (_, __) => const SizedBox(height: 12), + itemBuilder: (context, index) { + final captain = captains[index] as Map; + return _buildModernCaptainCard(context, captain); + }, + ), + ), + ], + ); + } + + // ================= CARD ================= + + Widget _buildModernCaptainCard( + BuildContext context, Map captain) { + final String fullName = + '${captain['first_name'] ?? ''} ${captain['last_name'] ?? ''}'; + final String phone = captain['phone']?.toString() ?? ''; + final String? email = captain['email']?.toString(); + + return Container( + decoration: BoxDecoration( + color: Colors.white, + borderRadius: BorderRadius.circular(20), + boxShadow: [ + BoxShadow( + color: Colors.black.withOpacity(0.04), + blurRadius: 12, + offset: const Offset(0, 4), + ), + ], + ), + child: Material( + color: Colors.transparent, + child: InkWell( + borderRadius: BorderRadius.circular(20), + onTap: () { + Get.to(() => const CaptainDetailsPage(), + arguments: {'data': captain}); + }, + child: Padding( + padding: const EdgeInsets.all(16.0), + child: Row( + children: [ + Container( + width: 56, + height: 56, + decoration: BoxDecoration( + gradient: LinearGradient( + colors: [ + Theme.of(context).primaryColor.withOpacity(0.8), + Theme.of(context).primaryColor, + ], + ), + borderRadius: BorderRadius.circular(16), + ), + child: const Icon( + Icons.person_rounded, + color: Colors.white, + size: 28, + ), + ), + const SizedBox(width: 16), + Expanded( + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Text( + fullName, + style: const TextStyle( + fontSize: 16, + fontWeight: FontWeight.w600, + ), + ), + const SizedBox(height: 6), + Text(phone), + if (isSuperAdmin && email != null) ...[ + const SizedBox(height: 4), + Text(email), + ], + ], + ), + ), + ], + ), + ), + ), + ), + ); + } + + // ================= STATES ================= + + Widget _buildLoadingState() { + return const Center(child: MyCircularProgressIndicator()); + } + + Widget _buildEmptyState() { + return const Center( + child: Text("No captains found"), + ); + } +} diff --git a/siro_admin/lib/views/admin/captain/captain_details.dart b/siro_admin/lib/views/admin/captain/captain_details.dart new file mode 100644 index 0000000..9afd693 --- /dev/null +++ b/siro_admin/lib/views/admin/captain/captain_details.dart @@ -0,0 +1,425 @@ +import 'package:flutter/material.dart'; +import 'package:get/get.dart'; + +import '../../../constant/box_name.dart'; +import '../../../constant/colors.dart'; +import '../../../controller/admin/captain_admin_controller.dart'; +import '../../../controller/firebase/firbase_messge.dart'; +import '../../../main.dart'; // Import main to access myPhone +import '../../widgets/elevated_btn.dart'; +import '../../widgets/my_scafold.dart'; +import '../../widgets/my_textField.dart'; +import '../quality/driver_scorecard_page.dart'; +import 'form_captain.dart'; + +class CaptainDetailsPage extends StatelessWidget { + const CaptainDetailsPage({super.key}); + + @override + Widget build(BuildContext context) { + final Map data = Get.arguments['data']; + final controller = Get.find(); + String myPhone = box.read(BoxName.adminPhone).toString(); + + // Define Super Admin Logic + final bool isSuperAdmin = + myPhone == '963942542053' || myPhone == '963992952235'; + + return MyScafolld( + title: 'Captain Profile'.tr, + isleading: true, + body: [ + SingleChildScrollView( + padding: const EdgeInsets.only(bottom: 40), + child: Column( + children: [ + // --- Header Section (Avatar & Name) --- + _buildHeaderSection(context, data), + + const SizedBox(height: 20), + + Padding( + padding: const EdgeInsets.symmetric(horizontal: 16.0), + child: Column( + children: [ + // --- Personal Information Card --- + _buildInfoCard( + title: 'Personal Information', + icon: Icons.person, + children: [ + _buildDetailTile( + Icons.email_outlined, + 'Email', + isSuperAdmin + ? data['email'] + : _maskEmail( + data['email']) // Mask email for non-super + ), + _buildDetailTile( + Icons.phone_iphone, + 'Phone', + _formatPhoneNumber( + data['phone'].toString(), isSuperAdmin)), + _buildDetailTile(Icons.transgender, 'Gender', + data['gender'] ?? 'Not specified'), + _buildDetailTile(Icons.cake_outlined, 'Birthdate', + data['birthdate'] ?? 'N/A'), + ], + ), + const SizedBox(height: 16), + + // --- Ride Statistics Card --- + _buildInfoCard( + title: 'Performance & Stats', + icon: Icons.bar_chart_rounded, + children: [ + _buildDetailTile(Icons.star_rate_rounded, 'Rating', + '${data['ratingPassenger'] ?? 0.0} / 5.0', + valueColor: Colors.amber[700]), + _buildDetailTile(Icons.directions_car_filled_outlined, + 'Total Rides', data['countPassengerRide']), + _buildDetailTile(Icons.cancel_outlined, + 'Canceled Rides', data['countPassengerCancel'], + valueColor: Colors.redAccent), + ], + ), + const SizedBox(height: 30), + + // --- Action Buttons --- + _buildActionButtons( + context, controller, data, isSuperAdmin), + ], + ), + ), + ], + ), + ), + ], + ); + } + + // --- Header with Gradient Background --- + Widget _buildHeaderSection(BuildContext context, Map data) { + return Container( + width: double.infinity, + padding: const EdgeInsets.symmetric(vertical: 25), + decoration: BoxDecoration( + color: Colors.white, + boxShadow: [ + BoxShadow( + color: Colors.grey.withOpacity(0.1), + blurRadius: 10, + offset: const Offset(0, 5), + ) + ], + borderRadius: const BorderRadius.vertical(bottom: Radius.circular(30)), + ), + child: Column( + children: [ + CircleAvatar( + radius: 45, + backgroundColor: AppColor.primaryColor.withOpacity(0.1), + child: Text( + data['first_name'] != null + ? data['first_name'][0].toUpperCase() + : 'C', + style: TextStyle( + fontSize: 35, + fontWeight: FontWeight.bold, + color: AppColor.primaryColor), + ), + ), + const SizedBox(height: 12), + Text( + '${data['first_name']} ${data['last_name']}', + style: const TextStyle( + fontSize: 22, + fontWeight: FontWeight.bold, + color: Colors.black87), + ), + const SizedBox(height: 4), + Container( + padding: const EdgeInsets.symmetric(horizontal: 12, vertical: 4), + decoration: BoxDecoration( + color: Colors.green.withOpacity(0.1), + borderRadius: BorderRadius.circular(20), + ), + child: Text( + 'Active Captain'.tr, + style: const TextStyle( + fontSize: 12, + color: Colors.green, + fontWeight: FontWeight.w600), + ), + ), + ], + ), + ); + } + + Widget _buildInfoCard( + {required String title, + required IconData icon, + required List children}) { + return Container( + padding: const EdgeInsets.all(16), + decoration: BoxDecoration( + color: Colors.white, + borderRadius: BorderRadius.circular(16), + boxShadow: [ + BoxShadow( + color: Colors.grey.withOpacity(0.05), + spreadRadius: 2, + blurRadius: 10) + ], + border: Border.all(color: Colors.grey.withOpacity(0.1)), + ), + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Row( + children: [ + Icon(icon, color: AppColor.primaryColor, size: 22), + const SizedBox(width: 10), + Text(title.tr, + style: const TextStyle( + fontSize: 17, fontWeight: FontWeight.bold)), + ], + ), + Divider(height: 25, color: Colors.grey.withOpacity(0.2)), + ...children, + ], + ), + ); + } + + Widget _buildDetailTile(IconData icon, String label, dynamic value, + {Color? valueColor}) { + return Padding( + padding: const EdgeInsets.symmetric(vertical: 8.0), + child: Row( + children: [ + Container( + padding: const EdgeInsets.all(8), + decoration: BoxDecoration( + color: Colors.grey[100], + borderRadius: BorderRadius.circular(8)), + child: Icon(icon, color: Colors.grey[600], size: 18), + ), + const SizedBox(width: 14), + Expanded( + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Text(label.tr, + style: TextStyle(fontSize: 12, color: Colors.grey[500])), + Text( + value?.toString() ?? 'N/A', + style: TextStyle( + fontSize: 15, + fontWeight: FontWeight.w600, + color: valueColor ?? Colors.black87), + ), + ], + ), + ), + ], + ), + ); + } + + Widget _buildActionButtons( + BuildContext context, + CaptainAdminController controller, + Map data, + bool isSuperAdmin) { + return Column( + children: [ + // Driver Scorecard Button + SizedBox( + width: double.infinity, + height: 50, + child: ElevatedButton.icon( + icon: const Icon(Icons.analytics_outlined, color: Colors.white), + label: Text("بطاقة الأداء (Scorecard)", + style: const TextStyle(color: Colors.white, fontSize: 16)), + style: ElevatedButton.styleFrom( + backgroundColor: Colors.blueAccent, + shape: RoundedRectangleBorder( + borderRadius: BorderRadius.circular(12)), + ), + onPressed: () { + Get.to(() => DriverScorecardPage(driverId: data['id'].toString())); + }, + ), + ), + const SizedBox(height: 16), + + // Notification is available for everyone + SizedBox( + width: double.infinity, + height: 50, + child: ElevatedButton.icon( + icon: const Icon(Icons.notifications_active_outlined, + color: Colors.white), + label: Text("Send Notification".tr, + style: const TextStyle(color: Colors.white, fontSize: 16)), + style: ElevatedButton.styleFrom( + backgroundColor: AppColor.primaryColor, + shape: RoundedRectangleBorder( + borderRadius: BorderRadius.circular(12)), + ), + onPressed: () => _showSendNotificationDialog(controller, data), + ), + ), + + // Edit and Delete ONLY for Super Admin + if (isSuperAdmin) ...[ + const SizedBox(height: 16), + Row( + children: [ + Expanded( + child: ElevatedButton.icon( + icon: const Icon(Icons.edit_note_rounded, size: 20), + label: Text("Edit".tr), + style: ElevatedButton.styleFrom( + backgroundColor: Colors.white, + foregroundColor: AppColor.yellowColor, + elevation: 0, + side: BorderSide(color: AppColor.yellowColor), + shape: RoundedRectangleBorder( + borderRadius: BorderRadius.circular(12)), + padding: const EdgeInsets.symmetric(vertical: 12), + ), + onPressed: () { + Get.to(() => const FormCaptain(), arguments: { + 'isEditMode': true, + 'captainData': data, + }); + }, + ), + ), + const SizedBox(width: 16), + Expanded( + child: ElevatedButton.icon( + icon: const Icon(Icons.delete_outline_rounded, size: 20), + label: Text("Delete".tr), + style: ElevatedButton.styleFrom( + backgroundColor: Colors.red[50], + foregroundColor: Colors.red, + elevation: 0, + shape: RoundedRectangleBorder( + borderRadius: BorderRadius.circular(12)), + padding: const EdgeInsets.symmetric(vertical: 12), + ), + onPressed: () => _showDeleteConfirmation(data), + ), + ), + ], + ), + ] else ...[ + // Message for normal admins + const SizedBox(height: 15), + Text( + "Only Super Admins can edit or delete captains.", + style: TextStyle( + color: Colors.grey[400], + fontSize: 12, + fontStyle: FontStyle.italic), + ) + ] + ], + ); + } + + // --- Helper Methods --- + + String _formatPhoneNumber(String phone, bool isSuperAdmin) { + if (isSuperAdmin) return phone; + if (phone.length <= 4) return phone; + return '${'*' * (phone.length - 4)}${phone.substring(phone.length - 4)}'; + } + + String _maskEmail(String? email) { + if (email == null || email.isEmpty) return 'N/A'; + int atIndex = email.indexOf('@'); + if (atIndex <= 1) return email; // Too short to mask + return '${email.substring(0, 2)}****${email.substring(atIndex)}'; + } + + void _showSendNotificationDialog( + CaptainAdminController controller, Map data) { + Get.defaultDialog( + title: 'Send Notification'.tr, + titleStyle: const TextStyle(fontWeight: FontWeight.bold), + content: Form( + key: controller.formCaptainPrizeKey, + child: Column( + children: [ + MyTextForm( + controller: controller.titleNotify, + label: 'Title'.tr, + hint: 'Enter notification title'.tr, + type: TextInputType.text, + ), + const SizedBox(height: 10), + MyTextForm( + controller: controller.bodyNotify, + label: 'Body'.tr, + hint: 'Enter message body'.tr, + type: TextInputType.text, + ), + ], + ), + ), + confirm: SizedBox( + width: 100, + child: MyElevatedButton( + title: 'Send', + onPressed: () { + // Check if key is valid (might be recreated) + if (controller.formCaptainPrizeKey.currentState?.validate() ?? + true) { + FirebaseMessagesController().sendNotificationToAnyWithoutData( + controller.titleNotify.text, + controller.bodyNotify.text, + data['passengerToken'] ?? '', // Safety check + 'order.wav'); + Get.back(); + Get.snackbar("Success", "Notification Sent", + backgroundColor: Colors.green.withOpacity(0.2)); + } + }, + ), + ), + cancel: TextButton( + onPressed: () => Get.back(), + child: Text('Cancel'.tr, style: const TextStyle(color: Colors.grey))), + ); + } + + void _showDeleteConfirmation(Map user) { + Get.defaultDialog( + title: 'Confirm Deletion'.tr, + titleStyle: + const TextStyle(color: Colors.redAccent, fontWeight: FontWeight.bold), + middleText: + 'Are you sure you want to delete ${user['first_name']}? This action cannot be undone.' + .tr, + confirm: ElevatedButton( + style: ElevatedButton.styleFrom(backgroundColor: Colors.redAccent), + onPressed: () { + // Call delete function here + // controller.deleteCaptain(user['id']); + Get.back(); + Get.snackbar("Deleted", "Captain has been removed", + backgroundColor: Colors.red.withOpacity(0.2)); + }, + child: Text('Delete'.tr, style: const TextStyle(color: Colors.white)), + ), + cancel: TextButton( + onPressed: () => Get.back(), + child: Text('Cancel'.tr, style: const TextStyle(color: Colors.grey))), + ); + } +} diff --git a/siro_admin/lib/views/admin/captain/driver_details_not_active_page.dart b/siro_admin/lib/views/admin/captain/driver_details_not_active_page.dart new file mode 100644 index 0000000..9ca0f4e --- /dev/null +++ b/siro_admin/lib/views/admin/captain/driver_details_not_active_page.dart @@ -0,0 +1,81 @@ +import 'package:flutter/material.dart'; +import 'package:get/get.dart'; +import '../../../controller/drivers/driver_not_active_controller.dart'; + +class DriverDetailsPage extends StatelessWidget { + final String driverId; + final DriverController controller = Get.find(); + + DriverDetailsPage({super.key, required this.driverId}); + + /// Helper function to safely get String values from dynamic map + String safeVal(Map d, String key) { + final v = d[key]; + if (v == null || v == false) return ''; + return v.toString(); + } + + @override + Widget build(BuildContext context) { + controller.getDriverDetails(driverId); + + return Scaffold( + appBar: AppBar(title: const Text("Driver Details")), + body: GetBuilder( + id: 'driverDetails', + builder: (c) { + if (c.driverDetails.isEmpty) { + return const Center(child: CircularProgressIndicator()); + } + + final d = c.driverDetails['driver'] as Map; + final docs = c.driverDetails['documents'] as List; + + return SingleChildScrollView( + padding: const EdgeInsets.all(16), + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Text( + "Name: ${safeVal(d, 'first_name')} ${safeVal(d, 'last_name')}"), + Text("Phone: ${safeVal(d, 'phone')}"), + Text("Email: ${safeVal(d, 'email')}"), + Text("National Number: ${safeVal(d, 'national_number')}"), + Text("Gender: ${safeVal(d, 'gender')}"), + Text("Birthdate: ${safeVal(d, 'birthdate')}"), + Text("Status: ${safeVal(d, 'status')}"), + Text("License Type: ${safeVal(d, 'license_type')}"), + Text("License Categories: ${safeVal(d, 'license_categories')}"), + Text("Issue Date: ${safeVal(d, 'issue_date')}"), + Text("Expiry Date: ${safeVal(d, 'expiry_date')}"), + Text("Address: ${safeVal(d, 'address')}"), + Text("Site: ${safeVal(d, 'site')}"), + Text("Employment Type: ${safeVal(d, 'employmentType')}"), + Text("Marital Status: ${safeVal(d, 'maritalStatus')}"), + const SizedBox(height: 16), + const Text("Documents:", + style: TextStyle(fontWeight: FontWeight.bold)), + const SizedBox(height: 8), + ...docs.map((doc) => Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Text(safeVal(doc, "doc_type")), + const SizedBox(height: 4), + Image.network( + safeVal(doc, "link"), + height: 200, + fit: BoxFit.contain, + errorBuilder: (ctx, err, st) => + const Icon(Icons.broken_image), + ), + const SizedBox(height: 16), + ], + )), + ], + ), + ); + }, + ), + ); + } +} diff --git a/siro_admin/lib/views/admin/captain/drivers_cant_registe.dart b/siro_admin/lib/views/admin/captain/drivers_cant_registe.dart new file mode 100644 index 0000000..c87217f --- /dev/null +++ b/siro_admin/lib/views/admin/captain/drivers_cant_registe.dart @@ -0,0 +1,54 @@ +import 'package:flutter/material.dart'; +import 'package:get/get.dart'; +import 'package:siro_admin/views/admin/captain/register_captain.dart'; +import 'package:siro_admin/views/widgets/my_scafold.dart'; + +import '../../../constant/colors.dart'; +import '../../../controller/admin/register_captain_controller.dart'; + +class DriversCantRegister extends StatelessWidget { + const DriversCantRegister({super.key}); + + @override + Widget build(BuildContext context) { + Get.put(RegisterCaptainController()); + return MyScafolld( + title: 'drivers cant register'.tr, + body: [ + GetBuilder(builder: (mainController) { + return ListView.builder( + itemCount: mainController.driverNotCompleteRegistration.length, + itemBuilder: (context, index) { + final driver = + mainController.driverNotCompleteRegistration[index]; + return Padding( + padding: const EdgeInsets.all(8.0), + child: InkWell( + onTap: () { + Get.to(() => RegisterCaptain(), arguments: { + "phone_number": driver['phone_number'].toString(), + 'driverId': driver['driverId'].toString(), + 'email': driver['email'].toString(), + }); + }, + child: Container( + color: driver['note'] == null + ? AppColor.greenColor + : AppColor.accentColor, + child: Column( + children: [ + Text(driver['phone_number'].toString()), + Text(driver['driverId'].toString()), + Text(driver['email'].toString()), + ], + ), + ), + ), + ); + }, + ); + }), + ], + isleading: true); + } +} diff --git a/siro_admin/lib/views/admin/captain/form_captain.dart b/siro_admin/lib/views/admin/captain/form_captain.dart new file mode 100644 index 0000000..dbde527 --- /dev/null +++ b/siro_admin/lib/views/admin/captain/form_captain.dart @@ -0,0 +1,122 @@ +import 'package:flutter/material.dart'; +import 'package:get/get.dart'; +import 'package:siro_admin/controller/functions/crud.dart'; +import '../../../constant/links.dart'; +import '../../../constant/style.dart'; +import '../../../controller/admin/captain_admin_controller.dart'; +import '../../widgets/elevated_btn.dart'; +import '../../widgets/my_scafold.dart'; +import '../../widgets/my_textField.dart'; + +class FormCaptain extends StatefulWidget { + const FormCaptain({super.key}); + + @override + State createState() => _FormCaptainState(); +} + +class _FormCaptainState extends State { + final CaptainAdminController controller = Get.find(); + final _formKey = GlobalKey(); + + late TextEditingController firstNameController; + late TextEditingController lastNameController; + late TextEditingController phoneController; + + bool isEditMode = false; + Map? captainData; + + @override + void initState() { + super.initState(); + if (Get.arguments != null && Get.arguments['isEditMode'] == true) { + isEditMode = true; + captainData = Get.arguments['captainData']; + firstNameController = + TextEditingController(text: captainData?['first_name'] ?? ''); + lastNameController = + TextEditingController(text: captainData?['last_name'] ?? ''); + phoneController = + TextEditingController(text: captainData?['phone'] ?? ''); + } else { + firstNameController = TextEditingController(); + lastNameController = TextEditingController(); + phoneController = TextEditingController(); + } + } + + @override + void dispose() { + firstNameController.dispose(); + lastNameController.dispose(); + phoneController.dispose(); + super.dispose(); + } + + Future _saveForm() async { + if (_formKey.currentState!.validate()) { + // Create a map of the updated data + Map updatedData = { + 'id': captainData?['id'], // Important for the WHERE clause in SQL + // 'first_name': firstNameController.text, + // 'last_name': lastNameController.text, + 'phone': phoneController.text, + }; + var res = await CRUD() + .post(link: AppLink.updateDriverFromAdmin, payload: updatedData); + + if (res != 'failure') { + print('Updating data: $updatedData'); + + Get.back(); // Go back after saving + Get.snackbar('Success', 'Captain data updated successfully!'); + } + // controller.updateCaptain(updatedData); + } + } + + @override + Widget build(BuildContext context) { + return MyScafolld( + title: 'Edit Captain'.tr, + isleading: true, + body: [ + Padding( + padding: const EdgeInsets.all(16.0), + child: Form( + key: _formKey, + child: ListView( + children: [ + MyTextForm( + controller: firstNameController, + label: 'First Name'.tr, + hint: 'Enter first name'.tr, + type: TextInputType.name, + ), + const SizedBox(height: 16), + MyTextForm( + controller: lastNameController, + label: 'Last Name'.tr, + hint: 'Enter last name'.tr, + type: TextInputType.name, + ), + const SizedBox(height: 16), + MyTextForm( + controller: phoneController, + label: 'Phone Number'.tr, + hint: 'Enter phone number'.tr, + type: TextInputType.phone, + ), + const SizedBox(height: 32), + MyElevatedButton( + title: 'Update'.tr, + onPressed: _saveForm, + ), + ], + ), + ), + ), + ], + ); + } +} diff --git a/siro_admin/lib/views/admin/captain/register_captain.dart b/siro_admin/lib/views/admin/captain/register_captain.dart new file mode 100644 index 0000000..1f2e6b8 --- /dev/null +++ b/siro_admin/lib/views/admin/captain/register_captain.dart @@ -0,0 +1,982 @@ +import 'package:flutter/material.dart'; +import 'package:get/get.dart'; +import 'package:siro_admin/controller/admin/register_captain_controller.dart'; +import '../../../../constant/colors.dart'; +import '../../../../constant/links.dart'; +import '../../../../constant/style.dart'; +import '../../widgets/elevated_btn.dart'; +import '../../widgets/my_scafold.dart'; +import '../../widgets/mycircular.dart'; + +class RegisterCaptain extends StatelessWidget { + RegisterCaptain({super.key}); + + @override + Widget build(BuildContext context) { + final controller = Get.put(RegisterCaptainController()); + // String text = ''; + controller.driveInit(); + return MyScafolld( + title: 'Documents check'.tr, + action: GetBuilder(builder: (controller) { + return IconButton( + onPressed: () { + controller.isLoading = false; + controller.update(); + }, + icon: const Icon(Icons.refresh), + ); + }), + body: [ + GetBuilder(builder: (controller) { + return controller.isLoading + ? const MyCircularProgressIndicator() + : Padding( + padding: const EdgeInsets.all(8.0), + child: Column( + children: [ + (controller.responseIdCardDriverEgyptBack.isNotEmpty && + controller.responseIdCardDriverEgyptFront + .isNotEmpty && + controller.responseIdEgyptFront.isNotEmpty && + controller.responseIdEgyptBack.isNotEmpty && + controller + .responseIdEgyptDriverLicense.isNotEmpty + // && + // controller + // .responseCriminalRecordEgypt.isNotEmpty + ) + ? MyElevatedButton( + title: 'Next'.tr, + onPressed: () { + controller.addDriverAndCarEgypt(); + }) + : const SizedBox(), + SizedBox( + height: + (controller.responseIdCardDriverEgyptBack + .isNotEmpty && + controller.responseIdCardDriverEgyptFront + .isNotEmpty && + controller + .responseIdEgyptFront.isNotEmpty && + controller + .responseIdEgyptBack.isNotEmpty && + controller.responseIdEgyptDriverLicense + .isNotEmpty + // && + // controller.responseCriminalRecordEgypt + // .isNotEmpty + ) + ? Get.height * .7 + : Get.height * .85, + child: ListView( + children: [ + egyptDriverLicense(), + egyptCarLicenceFront(), + egyptCarLicenceBack(), + egyptDriverIDFront(), + egyptDriverIDBack(), + // egyptCriminalRecord(), + ], + ), + ), + ], + ), + ); + }), + ], + isleading: true); + } + + GetBuilder egyptDriverLicense() { + return GetBuilder( + builder: (ai) { + if (ai.responseIdEgyptDriverLicense.isNotEmpty) { + final expiryDate = ai.responseIdEgyptDriverLicense['expiry_date']; + + // Check if the expiry date is before today + final today = DateTime.now(); + + // Try parsing the expiry date. If it fails, set it to null. + final expiryDateTime = DateTime.tryParse(expiryDate); + final isExpired = + expiryDateTime != null && expiryDateTime.isBefore(today); + + return Card( + elevation: 4.0, + shape: RoundedRectangleBorder( + borderRadius: BorderRadius.circular(16.0), + ), + child: Padding( + padding: const EdgeInsets.all(16.0), + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + Text('Driver\'s License'.tr, style: AppStyle.headTitle2), + IconButton( + onPressed: () async { + await ai.allMethodForAI(""" +Write a JSON object from the following information extracted from the provided Arabic text: + +{ + "license_type": "", + "national_number": "", + "name_arabic": "", + "name_english": "", + "firstName": "", + "lastName": "", + "address": "", + "issue_date": "", // Format: YYYY-MM-DD using Latin numerals (0-9) + "expiry_date": "", // Format: YYYY-MM-DD using Latin numerals (0-9) + "employmentType": "", + "license_categories": [] +} + +Important notes: +1. Ensure all dates are in the format YYYY-MM-DD using Latin (Western) numerals (0-9), not Arabic numerals. +2. The 'license_categories' should be an array, even if there's only one category. +3. Fill in all fields based on the information provided in the Arabic text. +4. If any information is missing, leave the field as an empty string or empty array as appropriate. +""", 'driver_license', ai.driverId); //egypt + }, + icon: const Icon(Icons.refresh), + ), + ], + ), + const SizedBox(height: 8.0), + const Divider(color: AppColor.accentColor), + const SizedBox(height: 8.0), + Text( + '${'License Type'.tr}: ${ai.responseIdEgyptDriverLicense['license_type']}', + style: AppStyle.title, + ), + const SizedBox(height: 8.0), + Text( + '${'National Number'.tr}: ${ai.responseIdEgyptDriverLicense['national_number']}', + style: AppStyle.title.copyWith( + color: ai.responseIdEgyptDriverLicense[ + 'national_number'] == + ai.responseIdEgyptBack['nationalID'] + ? AppColor.greenColor + : AppColor.redColor), + ), + const SizedBox(height: 8.0), + Text( + '${'Name (Arabic)'.tr}: ${ai.responseIdEgyptDriverLicense['name_arabic']}', + ), + const SizedBox(height: 8.0), + Text( + '${'Name (English)'.tr}: ${ai.responseIdEgyptDriverLicense['name_english']}', + ), + const SizedBox(height: 8.0), + Text( + '${'Address'.tr}: ${ai.responseIdEgyptDriverLicense['address']}', + ), + const SizedBox(height: 8.0), + Text( + '${'Issue Date'.tr}: ${ai.responseIdEgyptDriverLicense['issue_date']}', + ), + const SizedBox(height: 8.0), + Text( + '${'Expiry Date'.tr}: ${ai.responseIdEgyptDriverLicense['expiry_date']}', + style: AppStyle.title.copyWith( + color: + !isExpired ? AppColor.greenColor : AppColor.redColor, + ), + ), + const SizedBox(height: 8.0), + Text( + '${'License Categories'.tr}: ${ai.responseIdEgyptDriverLicense['license_categories']}', + ), + ], + ), + ), + ); + } + return Card( + child: InkWell( + onTap: () async { + await ai.allMethodForAI(""" +Write a JSON object from the following information extracted from the provided Arabic text: + +{ + "license_type": "", + "national_number": "", + "name_arabic": "", + "name_english": "", + "firstName": "", + "lastName": "", + "address": "", + "issue_date": "", // Format: YYYY-MM-DD using Latin numerals (0-9) + "expiry_date": "", // Format: YYYY-MM-DD using Latin numerals (0-9) + "employmentType": "", + "license_categories": [] +} + +Important notes: +1. Ensure all dates are in the format YYYY-MM-DD using Latin (Western) numerals (0-9), not Arabic numerals. +2. The 'license_categories' should be an array, even if there's only one category. +3. Fill in all fields based on the information provided in the Arabic text. +4. If any information is missing, leave the field as an empty string or empty array as appropriate. +""", 'driver_license', ai.driverId); //egypt + }, + child: Column( + children: [ + Image.network( + '${AppLink.server}/card_image/driver_license-${ai.driverId}.jpg', + height: Get.height * .25, + width: double.maxFinite, + fit: BoxFit.fitHeight, + ), + Text( + 'Capture an Image of Your Driver License'.tr, + style: AppStyle.title, + ), + ], + ), + ), + ); + }, + ); + } + + GetBuilder egyptDriverIDBack() { + return GetBuilder( + builder: (ai) { + if (ai.responseIdEgyptBack.isNotEmpty) { + final taxExpiryDate = ai.responseIdEgyptBack['expirationDate']; + + // Check if the tax expiry date is before today + final today = DateTime.now(); + + // Try parsing the tax expiry date. If it fails, set it to null. + final taxExpiryDateTime = DateTime.tryParse(taxExpiryDate); + final isExpired = + taxExpiryDateTime != null && taxExpiryDateTime.isBefore(today); + + return Card( + elevation: 4.0, + shape: RoundedRectangleBorder( + borderRadius: BorderRadius.circular(16.0), + ), + child: Padding( + padding: const EdgeInsets.all(16.0), + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + Text('ID Documents Back'.tr, style: AppStyle.headTitle2), + IconButton( + onPressed: () async { + await ai.allMethodForAI(""" + Write a JSON from the following information extracted from the provided Arabic text: +- nationalID(in Latin numerals) +- issueDate (in format YYYY-MM-DD using Latin numerals) +- occupation +- gender +- religion +- maritalStatus +- fullNameMarital (if maritalStatus is "أعزب", set this to "none") +- expirationDate (in format YYYY-MM-DD using Latin numerals) + +Please ensure all date fields use Latin (Western) numerals (0-9) instead of Arabic numerals. For example, use "2023-04-03" instead of "٢٠٢٣-٠٤-٠٣". + """, 'id_back', ai.driverId); //egypt + }, + icon: const Icon(Icons.refresh), + ), + ], + ), + const SizedBox(height: 8.0), + const Divider(color: AppColor.accentColor), + const SizedBox(height: 8.0), + // Assuming these keys exist in ai.responseIdEgyptFront + Text( + '${'National ID'.tr}: ${ai.responseIdEgyptBack['nationalID']}', + style: AppStyle.title.copyWith( + color: ai.responseIdEgyptDriverLicense[ + 'national_number'] == + ai.responseIdEgyptBack['nationalID'] + ? AppColor.greenColor + : AppColor.redColor), + ), + + const SizedBox(height: 8.0), + Text( + '${'Occupation'.tr}: ${ai.responseIdEgyptBack['occupation']}', // Assuming 'occupation' exists + ), + const SizedBox(height: 8.0), + Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + Text( + '${'Issue Date'.tr}: ${ai.responseIdEgyptBack['issueDate']}', // Assuming 'issueDate' exists + ), + Text( + '${'Gender'.tr}: ${ai.responseIdEgyptBack['gender']}', // Assuming 'gender' exists + ), + ], + ), + const SizedBox(height: 8.0), + // Row( + // mainAxisAlignment: MainAxisAlignment.spaceBetween, + // children: [ + // Text( + // '${'Religion'.tr}: ${ai.responseIdEgyptBack['religion']}', // Assuming 'religion' exists + // ), + // Text( + // '${'Marital Status'.tr}: ${ai.responseIdEgyptBack['maritalStatus']}', // Assuming 'maritalStatus' exists + // ), + // ], + // ), + // const SizedBox(height: 8.0), + // Text( + // '${'Full Name (Marital)'.tr}: ${ai.responseIdEgyptBack['fullNameMaritial']}', // Assuming 'fullNameMaritial' exists + // ), + // const SizedBox(height: 8.0), + Text( + '${'Expiration Date'.tr}: ${ai.responseIdEgyptBack['expirationDate']}', // Assuming 'expirationDate' exists + style: AppStyle.title.copyWith( + color: !isExpired + ? AppColor.greenColor + : AppColor.redColor), + ), + ], + ), + ), + ); + } + return Card( + child: InkWell( + onTap: () async { + await ai.allMethodForAI(''' + Write a JSON object from the following information extracted from the provided Arabic text: + +{ + "nationalID": "",//(in Latin numerals) + "issueDate": "", // Format: YYYY-MM-DD using Latin numerals (0-9) + "occupation": "", + "gender": "", + "religion": "", + "maritalStatus": "", + "fullNameMaritial": "", // Set to "none" if maritalStatus is "أعزب" + "expirationDate": "" // Format: YYYY-MM-DD using Latin numerals (0-9) +} + +Important notes: +1. Ensure all dates (issueDate and expirationDate) are in the format YYYY-MM-DD using Latin (Western) numerals (0-9), not Arabic numerals. +2. If maritalStatus is "أعزب" (single), set fullNameMaritial to "none". +3. Fill in all fields based on the information provided in the Arabic text. +4. If any information is missing, leave the field as an empty string. + ''', 'id_back', ai.driverId); //egypt + }, + child: Column( + children: [ + Image.network( + '${AppLink.server}/card_image/id_back-${ai.driverId}.jpg', + height: Get.height * .25, + width: double.maxFinite, + fit: BoxFit.fitHeight, + ), + Text( + 'Capture an Image of Your ID Document Back'.tr, + style: AppStyle.title, + ), + ], + ), + ), + ); + }, + ); + } + + GetBuilder egyptDriverIDFront() { + return GetBuilder( + builder: (ai) { + if (ai.responseIdEgyptFront.isNotEmpty) { + return Card( + elevation: 4.0, + shape: RoundedRectangleBorder( + borderRadius: BorderRadius.circular(16.0), + ), + child: Padding( + padding: const EdgeInsets.all(16.0), + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + Text('ID Documents Front'.tr, style: AppStyle.headTitle2), + IconButton( + onPressed: () async { + await ai.allMethodForAI(''' + Write a JSON object from the following information extracted from the provided Arabic text: + +{ + "first_name": "", // The word next to "بطاقة تحقيق الشخصية" (National Identification Card) + "full_name": "", // The full name on the next line after the first name + "address": "", // The complete address spanning the next two lines + "national_number": "", // The National ID number before the last line (convert Arabic numerals to Latin) + "card_id": "", // The card ID in English on the last line + "dob": "" // Year of birth only, in Latin numerals (YYYY format) +} + +Important notes: +1. For 'first_name', extract the word immediately following "بطاقة تحقيق الشخصية". +2. 'full_name' should be the complete name found on the line after the first name. +3. 'address' should combine information from two consecutive lines. +4. Convert the 'national_number' from Arabic numerals to Latin numerals (0-9). +5. 'card_id' should be extracted as-is from the last line (it's already in English). +6. For 'dob', include only the year of birth in YYYY format using Latin numerals. +7. If any information is missing, leave the field as an empty string. + ''', 'id_front', ai.driverId); //egypt + }, + icon: const Icon(Icons.refresh), + ), + ], + ), + const SizedBox(height: 8.0), + const Divider(color: AppColor.accentColor), + const SizedBox(height: 8.0), + // Removed Make, Model, etc. as they are not available + + Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + Text( + '${'First Name'.tr}: ${ai.responseIdEgyptFront['first_name']}', + ), + Text( + '${'CardID'.tr}: ${ai.responseIdEgyptFront['card_id']}', + ), + ], + ), + const SizedBox(height: 8.0), + Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + Text( + '${'Full Name'.tr}: ${ai.responseIdEgyptFront['full_name']}', + ), + Text( + '${'DOB'.tr}: ${ai.responseIdEgyptFront['dob']}', + ), + ], + ), + const SizedBox(height: 8.0), + Text( + '${'Address'.tr}: ${ai.responseIdEgyptFront['address']}', + ), + const SizedBox(height: 8.0), + // Text( + // '${'National Number'.tr}: ${ai.responseIdEgyptFront['national_number']}', + // ), + // const SizedBox(height: 8.0), + + // Removed Inspection Date as it's not available + ], + ), + ), + ); + } + return Card( + child: InkWell( + onTap: () async { + await ai.allMethodForAI("""" + Write a JSON object from the following information extracted from the provided Arabic text: + +{ + "first_name": "", // The word next to "بطاقة تحقيق الشخصية" (National Identification Card) + "full_name": "", // The full name on the next line after the first name + "address": "", // The complete address spanning the next two lines + "national_number": "", // The National ID number before the last line (convert Arabic numerals to Latin) + "card_id": "", // The card ID in English on the last line + "dob": "" // Year of birth only, in Latin numerals (YYYY format) +} + +Important notes: +1. For 'first_name', extract the word immediately following "بطاقة تحقيق الشخصية". +2. 'full_name' should be the complete name found on the line after the first name. +3. 'address' should combine information from two consecutive lines. +4. Convert the 'national_number' from Arabic numerals to Latin numerals (0-9). +5. 'card_id' should be extracted as-is from the last line (it's already in English). +6. For 'dob', include only the year of birth in YYYY format using Latin numerals. +7. If any information is missing, leave the field as an empty string. + """, 'id_front', ai.driverId); //egypt + }, + child: Column( + children: [ + Image.network( + '${AppLink.server}/card_image/id_front-${ai.driverId}.png', + height: Get.height * .25, + width: double.maxFinite, + fit: BoxFit.fitHeight, + ), + Text( + 'Capture an Image of Your ID Document front'.tr, + style: AppStyle.title, + ), + ], + ), + ), + ); + }, + ); + } + + GetBuilder egyptCarLicenceFront() { + return GetBuilder( + builder: (ai) { + if (ai.responseIdCardDriverEgyptFront.isNotEmpty) { + // No need to access ai.responseIdCardDriverEgyptBack anymore + final licenseExpiryDate = DateTime.parse( + ai.responseIdCardDriverEgyptFront['LicenseExpirationDate']); + + // Check if license has expired + final today = DateTime.now(); + final isLicenseExpired = licenseExpiryDate.isBefore(today); + + return Card( + elevation: 4.0, + shape: RoundedRectangleBorder( + borderRadius: BorderRadius.circular(16.0), + ), + child: Padding( + padding: const EdgeInsets.all(16.0), + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Row( + children: [ + Text('Vehicle Details Front'.tr, + style: AppStyle.headTitle2), + IconButton( + onPressed: () async { + ai.allMethodForAI(""" + Extract the following details from the provided car license data and format them into a JSON object: + + +License Expiration Date +Car Plate +Owner +Address + +Car License Data: + + +JSON Format: +{ +"LicenseExpirationDate": "YYYY-MM-DD", +"car_plate": "[Car plate number]",//the car plate is line next to line contain 'ادارة مرور' for bot numbers and letters in arabic with partition like| but you remove | +"owner": "[Owner's full name]", +"address": "[Address if available, otherwise 'Not provided']" +} + +Important notes: +1. For the LicenseExpirationDate, ensure the date is in YYYY-MM-DD format using Latin numerals (0-9). +2. Replace all occurrences of '|' (pipe character) with a space in all fields. +3. If any information is missing, leave the corresponding field as an empty string. +4. Ensure all text is properly formatted and spaces are used correctly. + +Please fill in the JSON object with the extracted information, following these guidelines. +""", 'car_front', ai.driverId); + }, + icon: const Icon(Icons.refresh), + ), + ], + ), + const SizedBox(height: 8.0), + const Divider(color: AppColor.accentColor), + const SizedBox(height: 8.0), + // Removed Make, Model, etc. as they are not available + + Text( + '${'Plate Number'.tr}: ${ai.responseIdCardDriverEgyptFront['car_plate']}', + ), + const SizedBox(height: 8.0), + Text( + '${'Owner Name'.tr}: ${ai.responseIdCardDriverEgyptFront['owner']}', + ), + const SizedBox(height: 8.0), + Text( + '${'Address'.tr}: ${ai.responseIdCardDriverEgyptFront['address']}', + ), + const SizedBox(height: 8.0), + Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + Text( + '${'License Expiry Date'.tr}: ${licenseExpiryDate.toString().substring(0, 10)}', + style: TextStyle( + color: isLicenseExpired ? Colors.red : Colors.green, + ), + ), + // Removed Fuel as it's not available + ], + ), + // Removed Inspection Date as it's not available + ], + ), + ), + ); + } + return Card( + child: InkWell( + onTap: () async { + ai.allMethodForAI(""" + Extract the following details from the provided car license data and format them into a JSON object: + + +License Expiration Date +Car Plate +Owner +Address + +Car License Data: + + +JSON Format: +{ +"LicenseExpirationDate": "YYYY-MM-DD", +"car_plate": "[Car plate number]",//the car plate is line next to line contain 'ادارة مرور' for bot numbers and letters in arabic with partition like| but you remove | +"owner": "[Owner's full name]", +"address": "[Address if available, otherwise 'Not provided']" +} + +Important notes: +1. For the LicenseExpirationDate, ensure the date is in YYYY-MM-DD format using Latin numerals (0-9). +2. Replace all occurrences of '|' (pipe character) with a space in all fields. +3. If any information is missing, leave the corresponding field as an empty string. +4. Ensure all text is properly formatted and spaces are used correctly. + +Please fill in the JSON object with the extracted information, following these guidelines. +""", 'car_front', ai.driverId); + }, + child: Column( + children: [ + Image.network( + '${AppLink.server}/card_image/car_front-${ai.driverId}.jpg', + height: Get.height * .25, + width: double.maxFinite, + fit: BoxFit.fitHeight, + ), + Text( + 'Capture an Image of Your car license front '.tr, + style: AppStyle.title, + ), + ], + ), + ), + ); + }, + ); + } + + GetBuilder egyptCarLicenceBack() { + return GetBuilder( + builder: (ai) { + if (ai.responseIdCardDriverEgyptBack.isNotEmpty) { + // Get the tax expiry date from the response + final taxExpiryDate = ai.responseIdCardDriverEgyptBack['tax_expiry']; + // final displacement = ai.responseIdCardDriverEgyptBack['displacement']; + // if (int.parse(displacement) < 1000) {} + // Get the inspection date from the response + final inspectionDate = + ai.responseIdCardDriverEgyptBack['inspection_date']; + final year = int.parse(inspectionDate.split('-')[0]); + +// Set inspectionDateTime to December 31st of the given year + final inspectionDateTime = DateTime(year, 12, 31); + String carBackLicenseExpired = + inspectionDateTime.toString().split(' ')[0]; +// Get the current date + final today = DateTime.now(); + +// Try parsing the tax expiry date. If it fails, set it to null. + final taxExpiryDateTime = DateTime.tryParse(taxExpiryDate ?? ''); + final isExpired = + taxExpiryDateTime != null && taxExpiryDateTime.isBefore(today); +// Check if the inspection date is before today + bool isInspectionExpired = inspectionDateTime.isBefore(today); + + return Card( + elevation: 4.0, + shape: RoundedRectangleBorder( + borderRadius: BorderRadius.circular(16.0), + ), + child: Padding( + padding: const EdgeInsets.all(16.0), + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + Text('Vehicle Details Back'.tr, + style: AppStyle.headTitle2), + IconButton( + onPressed: () async { + ai.allMethodForAI(""" +Analyze the extracted car license information and create a JSON object with the following keys: + +{ + "make": "", + "year": "", + "chassis": "", + "model": "", + "engine": "", + "displacement": "", + "cylinders": "", + "fuel": "", + "color": "", + "color_hex": "", + "inspection_date": "", + "assuranceNumber": "", + "tax_expiry": "" +} + +Important notes: +1. For dates (inspection_date and tax_expiry), use the format YYYY-MM-DD with Latin numerals (0-9). +2. Convert the color name to its corresponding hex color code for the 'color_hex' field. +3. Ensure all numeric values (year, displacement, cylinders) are in Latin numerals. +4. If any information is missing, leave the corresponding field as an empty string. +5. Do not include any explanatory text in the JSON fields, only the extracted values. +displacement in the line contain (سم٣ ) +Please fill in the JSON object with the extracted information, following these guidelines. +""", 'car_back', ai.driverId); + }, + icon: const Icon(Icons.refresh), + ), + ], + ), + const SizedBox(height: 8.0), + const Divider(color: AppColor.accentColor), + const SizedBox(height: 8.0), + Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + Text( + '${'Make'.tr}: ${ai.responseIdCardDriverEgyptBack['make']}'), + Text( + '${'Model'.tr}: ${ai.responseIdCardDriverEgyptBack['model']}'), + ], + ), + const SizedBox(height: 8.0), + Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + Text( + '${'Year'.tr}: ${ai.responseIdCardDriverEgyptBack['year']}'), + Text( + '${'Chassis'.tr}: ${ai.responseIdCardDriverEgyptBack['chassis']}'), + ], + ), + const SizedBox(height: 8.0), + Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + Text( + '${'Color'.tr}: ${ai.responseIdCardDriverEgyptBack['color']}'), + Text( + '${'Displacement'.tr}: ${ai.responseIdCardDriverEgyptBack['displacement']} cc'), + ], + ), + const SizedBox(height: 8.0), + Text( + '${'Fuel'.tr}: ${ai.responseIdCardDriverEgyptBack['fuel']}'), + const SizedBox(height: 8.0), + if (taxExpiryDateTime != null) + Text( + '${'Tax Expiry Date'.tr}: $taxExpiryDate', + style: TextStyle( + color: isExpired ? Colors.red : Colors.green, + ), + ), + const SizedBox(height: 8.0), + Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + Text( + '${'Inspection Date'.tr}: $carBackLicenseExpired', + style: TextStyle( + color: + isInspectionExpired ? Colors.red : Colors.green, + ), + ), + ], + ), + ], + ), + ), + ); + } + return Card( + child: InkWell( + onTap: () async { + ai.allMethodForAI(""" +Analyze the extracted car license information and create a JSON object with the following keys: + +{ + "make": "", + "year": "", + "chassis": "", + "model": "", + "engine": "", + "displacement": "", + "cylinders": "", + "fuel": "", + "color": "", + "color_hex": "", + "inspection_date": "", + "assuranceNumber": "", + "tax_expiry": "" +} + +Important notes: +1. For dates (inspection_date and tax_expiry), use the format YYYY-MM-DD with Latin numerals (0-9). +2. Convert the color name to its corresponding hex color code for the 'color_hex' field. +3. Ensure all numeric values (year, displacement, cylinders) are in Latin numerals. +4. If any information is missing, leave the corresponding field as an empty string. +5. Do not include any explanatory text in the JSON fields, only the extracted values. + +Please fill in the JSON object with the extracted information, following these guidelines. +""", 'car_back', ai.driverId); + }, + child: Column( + children: [ + Image.network( + '${AppLink.server}/card_image/car_back-${ai.driverId}.jpg', + height: Get.height * .25, + width: double.maxFinite, + fit: BoxFit.fitHeight, + ), + Text( + 'Capture an Image of Your car license back'.tr, + style: AppStyle.title, + ), + ], + ), + ), + ); + }, + ); + } + + GetBuilder egyptCriminalRecord() { + return GetBuilder( + builder: (ai) { + if (ai.responseCriminalRecordEgypt.isNotEmpty) { + return Card( + elevation: 4.0, + shape: RoundedRectangleBorder( + borderRadius: BorderRadius.circular(16.0), + ), + child: Padding( + padding: const EdgeInsets.all(16.0), + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + Text('Criminal Record'.tr, style: AppStyle.headTitle2), + IconButton( + onPressed: () async { + await ai.allMethodForAI(""" +Write a JSON object from the following information extracted from the provided Arabic text: + +{ + "InspectionResult": "", + "NationalID": "", + "FullName": "", + "IssueDate": "" // Format: YYYY-MM-DD +} + +Important notes: +1. For the IssueDate, ensure the date is in YYYY-MM-DD format using Latin numerals (0-9). +2. Add appropriate spaces in all text fields to ensure readability. +3. If any information is missing, leave the corresponding field as an empty string. +4. Ensure all text is properly formatted and spaces are used correctly. +5. Convert any Arabic numerals to Latin numerals (0-9) where applicable. + +Please fill in the JSON object with the extracted information, following these guidelines. +""", 'criminalRecord', ai.driverId); + }, + icon: const Icon(Icons.refresh), + ), + ], + ), + const SizedBox(height: 8.0), + const Divider(color: AppColor.accentColor), + const SizedBox(height: 8.0), + Text( + '${'InspectionResult'.tr}: ${ai.responseCriminalRecordEgypt['InspectionResult']}'), + const SizedBox(height: 8.0), + Text( + '${'FullName'.tr}: ${ai.responseCriminalRecordEgypt['FullName']}', + style: AppStyle.title.copyWith( + color: ai.responseCriminalRecordEgypt['FullName'] == + ai.responseIdEgyptDriverLicense['name_arabic'] + ? AppColor.greenColor + : AppColor.redColor), + ), + const SizedBox(height: 8.0), + Text( + '${'NationalID'.tr}: ${ai.responseCriminalRecordEgypt['NationalID']}'), + const SizedBox(height: 8.0), + Text( + '${'IssueDate'.tr}: ${ai.responseCriminalRecordEgypt['IssueDate']}'), + ], + ), + ), + ); + } + return Card( + child: InkWell( + onTap: () async { + await ai.allMethodForAI(""" +Write a JSON object from the following information extracted from the provided Arabic text: + +{ + "InspectionResult": "", + "NationalID": "", + "FullName": "", + "IssueDate": "" // Format: YYYY-MM-DD +} + +Important notes: +1. For the IssueDate, ensure the date is in YYYY-MM-DD format using Latin numerals (0-9). +2. Add appropriate spaces in all text fields to ensure readability. +3. If any information is missing, leave the corresponding field as an empty string. +4. Ensure all text is properly formatted and spaces are used correctly. +5. Convert any Arabic numerals to Latin numerals (0-9) where applicable. + +Please fill in the JSON object with the extracted information, following these guidelines. +""", 'criminalRecord', ai.driverId); + }, + child: Column( + children: [ + Image.network( + '${AppLink.server}/card_image/6.png', + height: Get.height * .25, + width: double.maxFinite, + fit: BoxFit.fitHeight, + ), + Text( + 'Capture an Image of Your Criminal Record'.tr, + style: AppStyle.title, + ), + ], + ), + ), + ); + }, + ); + } +} diff --git a/siro_admin/lib/views/admin/captain/syrian_driver_not_active.dart b/siro_admin/lib/views/admin/captain/syrian_driver_not_active.dart new file mode 100644 index 0000000..42711b9 --- /dev/null +++ b/siro_admin/lib/views/admin/captain/syrian_driver_not_active.dart @@ -0,0 +1,54 @@ +import 'package:flutter/material.dart'; +import 'package:get/get.dart'; +import 'package:secure_string_operations/secure_string_operations.dart'; +import 'package:siro_admin/constant/box_name.dart'; + +import '../../../constant/info.dart'; +import '../../../constant/char_map.dart'; + +import '../../../controller/drivers/driver_not_active_controller.dart'; +import '../../../controller/functions/encrypt_decrypt.dart'; +import '../../../main.dart'; +import '../../../print.dart'; +import 'driver_details_not_active_page.dart'; + +class DriversPendingPage extends StatelessWidget { + final DriverController controller = Get.put(DriverController()); + + DriversPendingPage({super.key}); + + @override + Widget build(BuildContext context) { + controller.getDriversPending(); + Log.print( + ': ${X.r(X.r(X.r(box.read(BoxName.jwt), cn), cC), cs).toString().split(AppInformation.addd)[0]}'); + + return Scaffold( + appBar: AppBar(title: const Text("Drivers Pending")), + body: GetBuilder( + id: 'drivers', + builder: (c) { + if (c.drivers.isEmpty) { + return Center( + child: const Text('no drivers found yet', + style: TextStyle(fontSize: 20, fontWeight: FontWeight.bold)), + ); + } + return ListView.builder( + itemCount: c.drivers.length, + itemBuilder: (ctx, i) { + final d = c.drivers[i]; + return ListTile( + title: Text(d["first_name"] + d['last_name'] ?? ""), + subtitle: Text(d["phone"] ?? ""), + onTap: () { + Get.to(() => DriverDetailsPage(driverId: d["id"].toString())); + }, + ); + }, + ); + }, + ), + ); + } +} diff --git a/siro_admin/lib/views/admin/complaints/complaint_list_page.dart b/siro_admin/lib/views/admin/complaints/complaint_list_page.dart new file mode 100644 index 0000000..5f6a19e --- /dev/null +++ b/siro_admin/lib/views/admin/complaints/complaint_list_page.dart @@ -0,0 +1,287 @@ +import 'package:flutter/material.dart'; +import 'package:get/get.dart'; +import '../../../constant/colors.dart'; +import '../../../constant/style.dart'; +import '../../../controller/admin/complaint_controller.dart'; +import '../../widgets/my_scafold.dart'; +import '../../widgets/elevated_btn.dart'; +import '../../widgets/my_textField.dart'; + +class ComplaintListPage extends StatelessWidget { + ComplaintListPage({super.key}); + + final ComplaintController controller = Get.put(ComplaintController()); + + @override + Widget build(BuildContext context) { + return MyScafolld( + title: 'إدارة الشكاوى'.tr, + isleading: true, + body: [ + Obx(() { + if (controller.delayedComplaints.isNotEmpty) { + return Container( + margin: const EdgeInsets.all(16), + padding: const EdgeInsets.all(16), + decoration: BoxDecoration( + color: AppColor.danger.withOpacity(0.1), + borderRadius: BorderRadius.circular(16), + border: Border.all(color: AppColor.danger.withOpacity(0.3)), + ), + child: Column( + children: [ + Row( + children: [ + const Icon(Icons.warning_amber_rounded, color: AppColor.danger), + const SizedBox(width: 12), + Expanded( + child: Text( + 'هناك ${controller.delayedComplaints.length} شكاوى لم يتم حلها منذ أكثر من أسبوع!', + style: AppStyle.body.copyWith(color: AppColor.danger, fontWeight: FontWeight.bold), + ), + ), + ], + ), + const SizedBox(height: 12), + Obx(() => MyElevatedButton( + title: controller.showOnlyDelayed.value ? 'عرض جميع الشكاوى' : 'عرض الشكاوى المتأخرة فقط', + onPressed: () => controller.showOnlyDelayed.toggle(), + kolor: AppColor.danger, + )), + ], + ), + ); + } + return const SizedBox.shrink(); + }), + Obx(() { + final list = controller.showOnlyDelayed.value ? controller.delayedComplaints : controller.complaintList; + if (controller.isLoading.value && list.isEmpty) { + return const Center(child: CircularProgressIndicator()); + } + return RefreshIndicator( + onRefresh: () => controller.getComplaints(), + child: ListView.builder( + padding: const EdgeInsets.fromLTRB(16, 16, 16, 80), + itemCount: list.length, + itemBuilder: (context, index) { + final complaint = list[index]; + return _buildComplaintCard(context, complaint); + }, + ), + ); + }), + ], + ); + } + + Widget _buildComplaintCard(BuildContext context, dynamic c) { + Color statusColor = _getStatusColor(c['statusComplaint']); + + return Container( + margin: const EdgeInsets.only(bottom: 16), + decoration: AppStyle.cardDecoration, + child: ExpansionTile( + tilePadding: const EdgeInsets.symmetric(horizontal: 16, vertical: 8), + leading: _buildStatusIndicator(c['statusComplaint'], statusColor), + title: Text( + c['description']?.toString() ?? 'بدون وصف', + maxLines: 1, + overflow: TextOverflow.ellipsis, + style: AppStyle.title, + ), + subtitle: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + const SizedBox(height: 4), + Text( + 'النوع: ${c['complaint_type'] ?? 'عام'} | الرحلة: ${c['ride_id']}', + style: AppStyle.caption, + ), + const SizedBox(height: 4), + Row( + children: [ + Icon(Icons.person_rounded, size: 12, color: AppColor.textSecondary), + const SizedBox(width: 4), + Text(c['passengerName'] ?? 'غير معروف', style: AppStyle.caption), + const SizedBox(width: 12), + Icon(Icons.drive_eta_rounded, size: 12, color: AppColor.textSecondary), + const SizedBox(width: 4), + Text(c['driverName'] ?? 'غير معروف', style: AppStyle.caption), + ], + ), + ], + ), + children: [ + Padding( + padding: const EdgeInsets.all(16), + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + const Divider(color: AppColor.divider), + _buildInfoRow('الوصف', c['description'] ?? 'لا يوجد وصف'), + const SizedBox(height: 12), + _buildInfoRow('الحل الحالي', c['resolution'] ?? 'لم يتم الحل بعد'), + const SizedBox(height: 12), + _buildRideDetails(c), + const SizedBox(height: 24), + Row( + children: [ + Expanded( + child: MyElevatedButton( + title: 'تحديث الحالة / حل الشكوى', + onPressed: () => _showResolveDialog(context, c), + kolor: AppColor.accent, + ), + ), + ], + ), + ], + ), + ), + ], + ), + ); + } + + Widget _buildStatusIndicator(String? status, Color color) { + return Container( + width: 40, + height: 40, + decoration: BoxDecoration( + color: color.withOpacity(0.12), + shape: BoxShape.circle, + border: Border.all(color: color.withOpacity(0.25)), + ), + child: Icon( + status == 'Resolved' ? Icons.check_circle_rounded : Icons.pending_rounded, + color: color, + size: 20, + ), + ); + } + + Widget _buildInfoRow(String label, String value) { + return Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Text(label, style: AppStyle.caption.copyWith(color: AppColor.accent)), + const SizedBox(height: 4), + Text(value, style: AppStyle.body), + ], + ); + } + + Widget _buildRideDetails(dynamic c) { + return Container( + padding: const EdgeInsets.all(12), + decoration: BoxDecoration( + color: AppColor.surfaceElevated, + borderRadius: BorderRadius.circular(12), + border: Border.all(color: AppColor.divider), + ), + child: Column( + children: [ + Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + _buildSmallStat('السعر', '${c['priceOfRide']} ل.س'), + _buildSmallStat('التقييم', '${c['avgRatingDriverFromPassengers'] ?? 0}★'), + _buildSmallStat('النوع', c['ascarType'] ?? 'N/A'), + ], + ), + ], + ), + ); + } + + Widget _buildSmallStat(String label, String value) { + return Column( + children: [ + Text(label, style: AppStyle.caption.copyWith(fontSize: 10)), + const SizedBox(height: 2), + Text(value, style: AppStyle.number.copyWith(fontSize: 12)), + ], + ); + } + + Color _getStatusColor(String? status) { + switch (status) { + case 'Open': return AppColor.danger; + case 'In Progress': return AppColor.warning; + case 'Resolved': return AppColor.success; + default: return AppColor.textSecondary; + } + } + + void _showResolveDialog(BuildContext context, dynamic c) { + final TextEditingController resController = TextEditingController(text: c['resolution']); + String selectedStatus = c['statusComplaint'] ?? 'Open'; + + Get.bottomSheet( + StatefulBuilder( + builder: (context, setModalState) => Container( + padding: const EdgeInsets.all(24), + decoration: const BoxDecoration( + color: AppColor.surfaceElevated, + borderRadius: BorderRadius.vertical(top: Radius.circular(24)), + ), + child: Column( + mainAxisSize: MainAxisSize.min, + children: [ + Text('تحديث حالة الشكوى', style: AppStyle.headTitle), + const SizedBox(height: 20), + _buildStatusDropdown(selectedStatus, (val) { + setModalState(() => selectedStatus = val!); + }), + const SizedBox(height: 20), + MyTextForm( + controller: resController, + label: 'قرار الحل / الملاحظات', + hint: 'اكتب تفاصيل الحل هنا...', + type: TextInputType.multiline, + prefixIcon: Icons.gavel_rounded, + ), + const SizedBox(height: 24), + MyElevatedButton( + title: 'حفظ التحديث', + onPressed: () async { + bool success = await controller.updateComplaintStatus( + c['id'].toString(), + selectedStatus, + resController.text + ); + if (success) Get.back(); + }, + ), + const SizedBox(height: 20), + ], + ), + ), + ), + isScrollControlled: true, + ); + } + + Widget _buildStatusDropdown(String current, Function(String?) onChanged) { + return Container( + padding: const EdgeInsets.symmetric(horizontal: 16), + decoration: BoxDecoration( + color: AppColor.surface, + borderRadius: BorderRadius.circular(12), + border: Border.all(color: AppColor.divider), + ), + child: DropdownButtonHideUnderline( + child: DropdownButton( + value: current, + isExpanded: true, + dropdownColor: AppColor.surfaceElevated, + items: ['Open', 'In Progress', 'Resolved'] + .map((s) => DropdownMenuItem(value: s, child: Text(s.tr, style: AppStyle.body))) + .toList(), + onChanged: onChanged, + ), + ), + ); + } +} diff --git a/siro_admin/lib/views/admin/dashboard_v2_widget.dart b/siro_admin/lib/views/admin/dashboard_v2_widget.dart new file mode 100644 index 0000000..2a11cda --- /dev/null +++ b/siro_admin/lib/views/admin/dashboard_v2_widget.dart @@ -0,0 +1,339 @@ +import 'package:flutter/material.dart'; +import 'package:get/get.dart'; +import 'package:siro_admin/constant/colors.dart'; +import 'package:siro_admin/controller/admin/dashboard_v2_controller.dart'; +import 'package:flutter_staggered_animations/flutter_staggered_animations.dart'; + +class DashboardV2Widget extends StatelessWidget { + const DashboardV2Widget({super.key}); + + @override + Widget build(BuildContext context) { + // Initialize controller + final controller = Get.put(DashboardV2Controller()); + + return GetBuilder( + builder: (ctrl) { + if (ctrl.isLoading) { + return const SliverToBoxAdapter( + child: SizedBox( + height: 150, + child: Center( + child: CircularProgressIndicator(color: AppColor.accent), + ), + ), + ); + } + + return SliverToBoxAdapter( + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + // 1. Real-time stats + _buildSectionTitle('مركز العمليات الحي (Real-time)'), + _buildRealtimeStats(ctrl.realtimeData), + + const SizedBox(height: 20), + + // 2. Smart Alerts + if (ctrl.smartAlerts.isNotEmpty) ...[ + _buildSectionTitle('التنبيهات الذكية (${ctrl.smartAlerts.length})'), + _buildSmartAlerts(ctrl.smartAlerts), + const SizedBox(height: 10), + ] + ], + ), + ); + }, + ); + } + + Widget _buildSectionTitle(String title) { + return Padding( + padding: const EdgeInsets.fromLTRB(20, 8, 20, 10), + child: Row( + children: [ + Container( + width: 3, + height: 14, + decoration: BoxDecoration( + color: AppColor.danger, // Distinct color + borderRadius: BorderRadius.circular(2), + ), + ), + const SizedBox(width: 8), + Text( + title, + style: const TextStyle( + color: AppColor.textSecondary, + fontSize: 12, + fontWeight: FontWeight.bold, + letterSpacing: 0.5, + ), + ), + ], + ), + ); + } + + Widget _buildRealtimeStats(Map data) { + final stats = [ + { + 'title': 'رحلات نشطة', + 'value': data['active_rides']?.toString() ?? '0', + 'icon': Icons.directions_car_rounded, + 'color': AppColor.info, + }, + { + 'title': 'سائقون أونلاين', + 'value': data['online_drivers']?.toString() ?? '0', + 'icon': Icons.wifi_tethering, + 'color': AppColor.success, + }, + { + 'title': 'إيرادات اليوم', + 'value': '${data['revenue_today'] ?? 0}', + 'icon': Icons.monetization_on_rounded, + 'color': AppColor.warning, + }, + { + 'title': 'إيرادات الأمس', + 'value': '${data['revenue_yesterday'] ?? 0}', + 'icon': Icons.history_rounded, + 'color': Colors.grey, + }, + { + 'title': 'شكاوى مفتوحة', + 'value': data['new_complaints']?.toString() ?? '0', + 'icon': Icons.warning_rounded, + 'color': AppColor.danger, + }, + { + 'title': 'رخص تنتهي قريبًا', + 'value': data['expiring_licenses']?.toString() ?? '0', + 'icon': Icons.sd_card_alert_rounded, + 'color': Colors.orangeAccent, + }, + ]; + + return SizedBox( + height: 110, + child: ListView.builder( + padding: const EdgeInsets.symmetric(horizontal: 16), + scrollDirection: Axis.horizontal, + itemCount: stats.length, + itemBuilder: (ctx, i) { + final stat = stats[i]; + return Padding( + padding: const EdgeInsets.only(right: 10), + child: _buildStatCard(stat), + ); + }, + ), + ); + } + + Widget _buildStatCard(Map stat) { + final color = stat['color'] as Color; + return Container( + width: 140, + padding: const EdgeInsets.all(16), + decoration: BoxDecoration( + color: AppColor.surface, + borderRadius: BorderRadius.circular(16), + border: Border.all(color: color.withOpacity(0.3)), + boxShadow: [ + BoxShadow( + color: color.withOpacity(0.05), + blurRadius: 10, + offset: const Offset(0, 4), + ), + ], + ), + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + mainAxisAlignment: MainAxisAlignment.center, + children: [ + Row( + children: [ + Container( + padding: const EdgeInsets.all(6), + decoration: BoxDecoration( + color: color.withOpacity(0.15), + borderRadius: BorderRadius.circular(8), + ), + child: Icon(stat['icon'] as IconData, color: color, size: 16), + ), + const Spacer(), + // Pulsing indicator for active things + if (stat['title'] == 'رحلات نشطة' || stat['title'] == 'سائقون أونلاين') + Container( + width: 8, + height: 8, + decoration: BoxDecoration( + shape: BoxShape.circle, + color: color, + boxShadow: [ + BoxShadow( + color: color.withOpacity(0.5), + blurRadius: 4, + spreadRadius: 1, + ) + ] + ), + ), + ], + ), + const Spacer(), + Text( + stat['value'].toString(), + style: const TextStyle( + color: AppColor.textPrimary, + fontSize: 20, + fontWeight: FontWeight.bold, + ), + ), + const SizedBox(height: 2), + Text( + stat['title'].toString(), + style: const TextStyle( + color: AppColor.textSecondary, + fontSize: 10, + fontWeight: FontWeight.w500, + ), + maxLines: 1, + overflow: TextOverflow.ellipsis, + ), + ], + ), + ); + } + + Widget _buildSmartAlerts(List alerts) { + return ListView.builder( + padding: const EdgeInsets.symmetric(horizontal: 16), + shrinkWrap: true, + physics: const NeverScrollableScrollPhysics(), + itemCount: alerts.length > 5 ? 5 : alerts.length, // Show top 5 + itemBuilder: (context, index) { + final alert = alerts[index]; + return AnimationConfiguration.staggeredList( + position: index, + duration: const Duration(milliseconds: 300), + child: SlideAnimation( + verticalOffset: 20.0, + child: FadeInAnimation( + child: _buildAlertItem(alert), + ), + ), + ); + }, + ); + } + + Widget _buildAlertItem(Map alert) { + Color getSeverityColor(String severity) { + switch (severity) { + case 'high': + return AppColor.danger; + case 'medium': + return AppColor.warning; + case 'warning': + return Colors.orangeAccent; + default: + return AppColor.info; + } + } + + IconData getAlertIcon(String type) { + switch (type) { + case 'complaint': + return Icons.report_problem_rounded; + case 'ride': + return Icons.directions_car_rounded; + case 'license': + return Icons.badge_rounded; + default: + return Icons.notifications_active_rounded; + } + } + + final color = getSeverityColor(alert['severity']); + final icon = getAlertIcon(alert['type']); + + return Container( + margin: const EdgeInsets.only(bottom: 10), + padding: const EdgeInsets.all(12), + decoration: BoxDecoration( + color: AppColor.surface, + borderRadius: BorderRadius.circular(12), + border: Border.all(color: color.withOpacity(0.4)), + boxShadow: [ + BoxShadow( + color: color.withOpacity(0.05), + blurRadius: 5, + offset: const Offset(0, 2), + ) + ], + ), + child: Row( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Container( + padding: const EdgeInsets.all(10), + decoration: BoxDecoration( + color: color.withOpacity(0.1), + borderRadius: BorderRadius.circular(10), + ), + child: Icon(icon, color: color, size: 20), + ), + const SizedBox(width: 12), + Expanded( + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Text( + alert['title'] ?? '', + style: const TextStyle( + color: AppColor.textPrimary, + fontSize: 13, + fontWeight: FontWeight.bold, + ), + ), + const SizedBox(height: 4), + Text( + alert['description'] ?? '', + style: const TextStyle( + color: AppColor.textSecondary, + fontSize: 11, + ), + maxLines: 2, + overflow: TextOverflow.ellipsis, + ), + ], + ), + ), + const SizedBox(width: 8), + Column( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + crossAxisAlignment: CrossAxisAlignment.end, + children: [ + Text( + alert['date'] != null + ? alert['date'].toString().split(' ')[0] + : '', + style: const TextStyle( + color: AppColor.textSecondary, + fontSize: 10, + ), + ), + const SizedBox(height: 10), + Icon(Icons.arrow_forward_ios_rounded, + color: AppColor.textSecondary, size: 12), + ], + ), + ], + ), + ); + } +} diff --git a/siro_admin/lib/views/admin/dashboard_widget.dart b/siro_admin/lib/views/admin/dashboard_widget.dart new file mode 100644 index 0000000..e0bc89a --- /dev/null +++ b/siro_admin/lib/views/admin/dashboard_widget.dart @@ -0,0 +1,94 @@ +import 'package:flutter/material.dart'; +import 'package:get/get.dart'; // For Get.width if needed, and .tr +import 'package:siro_admin/constant/colors.dart'; // Assuming AppColor is here +import 'package:siro_admin/constant/style.dart'; // Assuming AppStyle is here + +class DashboardStatCard extends StatelessWidget { + final String title; + final String value; + final IconData? icon; + final Color? iconColor; + final Color? backgroundColor; + final Color? valueColor; + + const DashboardStatCard({ + Key? key, + required this.title, + required this.value, + this.icon, + this.iconColor, + this.backgroundColor, + this.valueColor, + }) : super(key: key); + + @override + Widget build(BuildContext context) { + // Attempt to use AppStyle.boxDecoration1 properties if it's a BoxDecoration + BoxDecoration? baseDecoration = AppStyle.boxDecoration1; + Color? finalBackgroundColor = + backgroundColor ?? baseDecoration?.color ?? Theme.of(context).cardColor; + BorderRadius? finalBorderRadius = + baseDecoration?.borderRadius?.resolve(Directionality.of(context)) ?? + BorderRadius.circular(12.0); + + return Container( + padding: const EdgeInsets.symmetric(horizontal: 14.0, vertical: 12.0), + decoration: BoxDecoration( + color: finalBackgroundColor, + borderRadius: finalBorderRadius, + boxShadow: [ + BoxShadow( + color: Colors.grey.withOpacity(0.1), + spreadRadius: 1, + blurRadius: 6, + offset: const Offset(0, 2), + ), + ], + // If AppStyle.boxDecoration1 includes a border, you might want to add it here too + // border: baseDecoration?.border, + ), + child: Column( + mainAxisAlignment: + MainAxisAlignment.center, // Center content vertically + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Flexible( + child: Text( + title.tr, + style: AppStyle.title.copyWith( + fontSize: 13, + fontWeight: FontWeight.w500, + color: Theme.of(context).textTheme.bodySmall?.color, + ), + maxLines: 2, + overflow: TextOverflow.ellipsis, + ), + ), + if (icon != null) + Icon( + icon, + size: 24, + color: iconColor ?? AppColor.primaryColor.withOpacity(0.7), + ), + ], + ), + const SizedBox(height: 6), + Text( + value, + style: TextStyle( + fontSize: 22, + fontWeight: FontWeight.bold, + color: valueColor ?? AppColor.primaryColor, + ), + maxLines: 1, + overflow: TextOverflow.ellipsis, + ), + ], + ), + ); + } +} diff --git a/siro_admin/lib/views/admin/drivers/alexandria.dart b/siro_admin/lib/views/admin/drivers/alexandria.dart new file mode 100644 index 0000000..b1aa1dd --- /dev/null +++ b/siro_admin/lib/views/admin/drivers/alexandria.dart @@ -0,0 +1,69 @@ +import 'package:flutter/material.dart'; +import 'package:get/get.dart'; +import 'package:siro_admin/constant/links.dart'; +import 'package:siro_admin/controller/functions/crud.dart'; +import 'package:siro_admin/controller/functions/wallet.dart'; +import 'package:siro_admin/views/widgets/my_scafold.dart'; + +import '../../../controller/drivers/driverthebest.dart'; + +class DriverTheBestAlexandria extends StatelessWidget { + const DriverTheBestAlexandria({super.key}); + + @override + Widget build(BuildContext context) { + Get.put(DriverTheBestAlexandriaController(), permanent: true); + return MyScafolld( + title: 'Alexandria'.tr, + body: [ + GetBuilder(builder: (driverthebest) { + return driverthebest.driver.isNotEmpty + ? ListView.builder( + itemCount: driverthebest.driver.length, + itemBuilder: (context, index) { + final driver = driverthebest.driver[index]; + return ListTile( + leading: CircleAvatar( + child: Text( + ((driver['driver_count'] * 5) / 3600) + .toStringAsFixed(0), + ), + ), + title: Text(driver['name_arabic'] ?? 'Unknown Name'), + subtitle: Text('Phone: ${driver['phone'] ?? 'N/A'}'), + trailing: IconButton( + onPressed: () async { + Get.defaultDialog( + title: + 'are you sure to pay to this driver gift'.tr, + middleText: '', + onConfirm: () async { + final wallet = Get.put(WalletController()); + await wallet.addPaymentToDriver('100', + driver['id'].toString(), driver['token']); + await wallet.addSeferWallet( + '100', driver['id'].toString()); + await CRUD().post( + link: AppLink.deleteRecord, + payload: { + 'driver_id': driver['id'].toString() + }); + driverthebest.driver.removeAt(index); + driverthebest.update(); + }, + onCancel: () => Get.back()); + }, + icon: const Icon(Icons.wallet_giftcard_rounded), + ), + ); + }, + ) + : const Center( + child: Text('No drivers available.'), + ); + }) + ], + isleading: true, + ); + } +} diff --git a/siro_admin/lib/views/admin/drivers/driver_documents_review_page.dart b/siro_admin/lib/views/admin/drivers/driver_documents_review_page.dart new file mode 100644 index 0000000..d81c0a3 --- /dev/null +++ b/siro_admin/lib/views/admin/drivers/driver_documents_review_page.dart @@ -0,0 +1,218 @@ +import 'package:flutter/material.dart'; +import 'package:get/get.dart'; +import '../../../constant/colors.dart'; +import '../../../constant/style.dart'; +import '../../../controller/admin/driver_docs_controller.dart'; +import '../../widgets/my_scafold.dart'; +import '../../widgets/elevated_btn.dart'; +import '../../../constant/links.dart'; + +class DriverDocsReviewPage extends StatelessWidget { + DriverDocsReviewPage({super.key}); + + final DriverDocsController controller = Get.put(DriverDocsController()); + + @override + Widget build(BuildContext context) { + return MyScafolld( + title: 'مراجعة طلبات التسجيل'.tr, + isleading: true, + body: [ + Obx(() => controller.isLoading.value && controller.pendingDrivers.isEmpty + ? const Center(child: CircularProgressIndicator()) + : controller.pendingDrivers.isEmpty + ? Center( + child: Column( + mainAxisAlignment: MainAxisAlignment.center, + children: [ + Icon(Icons.how_to_reg_rounded, size: 64, color: AppColor.textMuted), + const SizedBox(height: 16), + Text('لا يوجد طلبات تسجيل حالياً', style: AppStyle.subtitle), + ], + ), + ) + : RefreshIndicator( + onRefresh: () => controller.getPendingDrivers(), + child: NotificationListener( + onNotification: (ScrollNotification scrollInfo) { + if (!controller.isLoading.value && + !controller.isMoreLoading.value && + scrollInfo.metrics.pixels >= scrollInfo.metrics.maxScrollExtent - 200) { + controller.loadMore(); + } + return false; + }, + child: ListView.builder( + padding: const EdgeInsets.all(16), + itemCount: controller.pendingDrivers.length + (controller.hasMore.value ? 1 : 0), + itemBuilder: (context, index) { + if (index == controller.pendingDrivers.length) { + return const Padding( + padding: EdgeInsets.all(16.0), + child: Center(child: CircularProgressIndicator()), + ); + } + final driver = controller.pendingDrivers[index]; + return _buildDriverCard(context, driver); + }, + ), + ), + )), + ], + ); + } + + Widget _buildDriverCard(BuildContext context, dynamic driver) { + return Container( + margin: const EdgeInsets.only(bottom: 12), + decoration: AppStyle.cardDecoration, + child: ListTile( + contentPadding: const EdgeInsets.symmetric(horizontal: 16, vertical: 8), + leading: CircleAvatar( + backgroundColor: AppColor.accentSoft, + child: Text(driver['first_name']?[0] ?? 'D', style: const TextStyle(color: AppColor.accent)), + ), + title: Text('${driver['first_name']} ${driver['last_name']}', style: AppStyle.title), + subtitle: Text(driver['phone'] ?? '', style: AppStyle.caption), + trailing: const Icon(Icons.arrow_forward_ios_rounded, size: 16, color: AppColor.textSecondary), + onTap: () => _showDriverDetails(context, driver['id'].toString()), + ), + ); + } + + void _showDriverDetails(BuildContext context, String id) async { + final details = await controller.getDriverFullDetails(id); + if (details == null) return; + + final driver = details['driver']; + final List docs = details['documents']; + + Get.to(() => MyScafolld( + title: 'تفاصيل السائق', + isleading: true, + body: [ + SingleChildScrollView( + padding: const EdgeInsets.all(16), + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + _buildDriverHeader(driver), + const SizedBox(height: 24), + Text('الوثائق المرفوعة', style: AppStyle.title), + const SizedBox(height: 12), + ...docs.map((doc) => _buildDocCard(doc)).toList(), + const SizedBox(height: 32), + MyElevatedButton( + title: 'اعتماد وتفعيل الحساب', + icon: Icons.check_circle_rounded, + kolor: AppColor.success, + onPressed: () async { + bool success = await controller.approveDriver(id); + if (success) { + Get.back(); + Get.snackbar('نجاح', 'تم تفعيل حساب السائق بنجاح'); + } + }, + ), + const SizedBox(height: 100), + ], + ), + ), + ], + )); + } + + Widget _buildDriverHeader(dynamic driver) { + return Container( + padding: const EdgeInsets.all(20), + decoration: AppStyle.elevatedCard, + child: Column( + children: [ + Row( + children: [ + Expanded( + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Text('${driver['first_name']} ${driver['last_name']}', style: AppStyle.headTitle), + Text(driver['phone'] ?? '', style: AppStyle.subtitle), + ], + ), + ), + Container( + padding: const EdgeInsets.symmetric(horizontal: 12, vertical: 6), + decoration: BoxDecoration( + color: AppColor.warning.withOpacity(0.2), + borderRadius: BorderRadius.circular(20), + ), + child: Text('Pending', style: AppStyle.caption.copyWith(color: AppColor.warning)), + ), + ], + ), + const Divider(height: 32, color: AppColor.divider), + Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + _buildSmallInfo('الرقم الوطني', driver['national_number'] ?? 'N/A'), + _buildSmallInfo('الجنس', driver['gender'] ?? 'N/A'), + _buildSmallInfo('تاريخ الميلاد', driver['birthdate'] ?? 'N/A'), + ], + ), + ], + ), + ); + } + + Widget _buildSmallInfo(String label, String value) { + return Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Text(label, style: AppStyle.caption.copyWith(fontSize: 10)), + const SizedBox(height: 2), + Text(value, style: AppStyle.body.copyWith(fontSize: 12, fontWeight: FontWeight.bold)), + ], + ); + } + + Widget _buildDocCard(dynamic doc) { + String imageUrl = doc['link'] ?? ''; + // Ensure URL is absolute + if (!imageUrl.startsWith('http')) { + imageUrl = '${AppLink.server}/upload/drivers/$imageUrl'; + } + + return Container( + margin: const EdgeInsets.only(bottom: 16), + decoration: AppStyle.cardDecoration, + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Padding( + padding: const EdgeInsets.all(12), + child: Row( + children: [ + const Icon(Icons.file_present_rounded, color: AppColor.accent, size: 20), + const SizedBox(width: 8), + Text(doc['doc_type'] ?? 'وثيقة', style: AppStyle.title.copyWith(fontSize: 14)), + ], + ), + ), + ClipRRect( + borderRadius: const BorderRadius.vertical(bottom: Radius.circular(16)), + child: Image.network( + imageUrl, + width: double.infinity, + height: 200, + fit: BoxFit.cover, + errorBuilder: (context, error, stackTrace) => Container( + height: 200, + color: AppColor.surfaceElevated, + child: const Center(child: Icon(Icons.broken_image_rounded, size: 48, color: AppColor.textMuted)), + ), + ), + ), + ], + ), + ); + } +} diff --git a/siro_admin/lib/views/admin/drivers/driver_gift_check_page.dart b/siro_admin/lib/views/admin/drivers/driver_gift_check_page.dart new file mode 100644 index 0000000..f2c7fd9 --- /dev/null +++ b/siro_admin/lib/views/admin/drivers/driver_gift_check_page.dart @@ -0,0 +1,230 @@ +import 'package:flutter/material.dart'; +import 'package:get/get.dart'; +import 'package:siro_admin/controller/functions/crud.dart'; +import 'package:siro_admin/controller/functions/wallet.dart'; + +import '../../../constant/links.dart'; // تأكد من المسار + +// --- Controller: المسؤول عن المنطق (البحث، الفحص، الإضافة) --- +class DriverGiftCheckerController extends GetxController { + // للتحكم في حقل النص + final TextEditingController phoneController = TextEditingController(); + + // لعرض النتائج وحالة التحميل + var statusLog = "".obs; + var isLoading = false.obs; + + // قائمة السائقين (سنقوم بتحميلها للبحث عن الـ ID) + List driversCache = []; + + @override + void onInit() { + super.onInit(); + // fetchDriverCache(); // تحميل البيانات عند فتح الصفحة + } + + // 1. تحميل قائمة السائقين لاستخراج الـ ID منها + Future fetchDriverCache() async { + try { + final response = await CRUD().post( + link: '${AppLink.server}/Admin/driver/getDriverGiftPayment.php', + payload: {'phone': phoneController.text.trim()}, + ); + // print('response: ${response}'); + + if (response != 'failure') { + driversCache = (response['message']); + } + } catch (e) { + debugPrint("Error loading cache: $e"); + } + } + + // --- الدالة الرئيسية التي تنفذ العملية المطلوبة --- + Future processDriverGift() async { + String phoneInput = phoneController.text.trim(); + + if (phoneInput.isEmpty) { + Get.snackbar("تنبيه", "يرجى إدخال رقم الهاتف", + backgroundColor: Colors.orange); + return; + } + await fetchDriverCache(); + isLoading.value = true; + statusLog.value = "جاري البحث عن السائق..."; + + try { + // الخطوة 1: استخراج الـ ID بناءً على رقم الهاتف + var driver = driversCache.firstWhere( + (d) { + String dbPhone = + d['phone'].toString().replaceAll(RegExp(r'[^0-9]'), ''); + String inputPhone = phoneInput.replaceAll(RegExp(r'[^0-9]'), ''); + // قارن آخر 9 أرقام لتجاوز مشكلة 09 مقابل 963 + if (dbPhone.length >= 9 && inputPhone.length >= 9) { + return dbPhone.substring(dbPhone.length - 9) == + inputPhone.substring(inputPhone.length - 9); + } + return dbPhone == inputPhone; + }, + orElse: () => null, + ); + + if (driver == null) { + statusLog.value = "❌ لم يتم العثور على سائق بهذا الرقم في الكاش."; + isLoading.value = false; + return; + } + + String driverId = driver['id'].toString(); + String driverName = driver['name_arabic'] ?? 'بدون اسم'; + + statusLog.value = + "✅ تم العثور على السائق: $driverName (ID: $driverId)\nجاري فحص رصيد الهدايا..."; + + // الخطوة 2: فحص السيرفر هل الهدية موجودة؟ + // bool hasGift = await _checkIfGiftExistsOnServer(driverId); + + // if (hasGift) { + // statusLog.value += + // "\n⚠️ هذا السائق لديه هدية الافتتاح (30,000) مسبقاً. لم يتم اتخاذ إجراء."; + // } else { + // الخطوة 3: إضافة الهدية + statusLog.value += "\n🎁 الهدية غير موجودة. جاري الإضافة..."; + await _addGiftToDriver(driverId, phoneInput, "300"); + // } + } catch (e) { + statusLog.value = "حدث خطأ غير متوقع: $e"; + } finally { + isLoading.value = false; + } + } + + // دالة إضافة الهدية باستخدام WalletController الموجود عندك + Future _addGiftToDriver( + String driverId, String phone, String amount) async { + final wallet = Get.put(WalletController()); + + // استخدام الدالة الموجودة في نظامك + await wallet.addDrivergift300('new driver', driverId, amount, phone); + + // statusLog.value += "\n✅ تمت إضافة مبلغ $amount ل.س بنجاح!"; + + // إضافة تنبيه مرئي + // Get.snackbar("تم بنجاح", "تمت إضافة هدية الافتتاح للسائق", + // backgroundColor: Colors.green, colorText: Colors.white); + } +} + +// --- View: واجهة المستخدم --- +class DriverGiftCheckPage extends StatelessWidget { + const DriverGiftCheckPage({super.key}); + + @override + Widget build(BuildContext context) { + // حقن الكنترولر + final controller = Get.put(DriverGiftCheckerController()); + + return Scaffold( + backgroundColor: const Color(0xFFF8FAFC), + appBar: AppBar( + title: const Text("فحص ومنح هدية الافتتاح", + style: TextStyle(fontWeight: FontWeight.bold)), + backgroundColor: const Color(0xFF0F172A), // نفس لون الهيدر السابق + foregroundColor: Colors.white, + ), + body: Padding( + padding: const EdgeInsets.all(20.0), + child: Column( + children: [ + // كارد الإدخال + Container( + padding: const EdgeInsets.all(20), + decoration: BoxDecoration( + color: Colors.white, + borderRadius: BorderRadius.circular(15), + boxShadow: [ + BoxShadow(color: Colors.grey.withOpacity(0.1), blurRadius: 10) + ], + ), + child: Column( + children: [ + const Icon(Icons.card_giftcard, + size: 50, color: Colors.amber), + const SizedBox(height: 10), + const Text( + "أدخل رقم الهاتف للتحقق", + style: TextStyle(fontSize: 16, fontWeight: FontWeight.bold), + ), + const SizedBox(height: 20), + + // حقل الإدخال + TextField( + controller: controller.phoneController, + keyboardType: TextInputType.phone, + decoration: InputDecoration( + hintText: 'مثال: 0912345678', + prefixIcon: const Icon(Icons.phone), + border: OutlineInputBorder( + borderRadius: BorderRadius.circular(10)), + filled: true, + fillColor: Colors.grey[50], + ), + ), + const SizedBox(height: 20), + + // زر التنفيذ + Obx(() => SizedBox( + width: double.infinity, + height: 50, + child: ElevatedButton( + onPressed: controller.isLoading.value + ? null + : () => controller.processDriverGift(), + style: ElevatedButton.styleFrom( + backgroundColor: const Color(0xFF0F172A), + foregroundColor: Colors.white, + shape: RoundedRectangleBorder( + borderRadius: BorderRadius.circular(10)), + ), + child: controller.isLoading.value + ? const CircularProgressIndicator( + color: Colors.white) + : const Text("تحقق ومنح الهدية (30,000)", + style: TextStyle(fontSize: 16)), + ), + )), + ], + ), + ), + + const SizedBox(height: 30), + + // منطقة عرض النتائج (Log) + Expanded( + child: Container( + width: double.infinity, + padding: const EdgeInsets.all(16), + decoration: BoxDecoration( + color: Colors.black87, + borderRadius: BorderRadius.circular(12), + ), + child: SingleChildScrollView( + child: Obx(() => Text( + controller.statusLog.value.isEmpty + ? "بانتظار العملية..." + : controller.statusLog.value, + style: const TextStyle( + color: Colors.greenAccent, + fontFamily: 'monospace', + height: 1.5), + )), + ), + ), + ), + ], + ), + ), + ); + } +} diff --git a/siro_admin/lib/views/admin/drivers/driver_the_best.dart b/siro_admin/lib/views/admin/drivers/driver_the_best.dart new file mode 100644 index 0000000..24b1deb --- /dev/null +++ b/siro_admin/lib/views/admin/drivers/driver_the_best.dart @@ -0,0 +1,654 @@ +import 'package:flutter/material.dart'; +import 'package:get/get.dart'; +import 'package:get_storage/get_storage.dart'; // Ensure get_storage is in pubspec.yaml +import 'package:siro_admin/controller/functions/wallet.dart'; + +// --- New Controller to handle the specific JSON URL --- +class DriverCacheController extends GetxController { + List drivers = []; + bool isLoading = false; + String lastUpdated = ''; + String searchQuery = ''; // Search query state + + // Storage for paid drivers + final box = GetStorage(); + List paidDrivers = []; + + @override + void onInit() { + super.onInit(); + // Load previously paid drivers from storage + var stored = box.read('paid_drivers'); + if (stored != null) { + paidDrivers = List.from(stored.map((e) => e.toString())); + } + fetchData(); + } + + Future fetchData() async { + isLoading = true; + update(); // Notify UI to show loader + try { + // Using GetConnect to fetch the JSON directly + final response = await GetConnect().get( + 'https://api.intaleq.xyz/intaleq/ride/location/active_drivers_cache.json', + ); + + if (response.body != null && response.body is Map) { + if (response.body['data'] != null) { + drivers = List.from(response.body['data']); + } + if (response.body['last_updated'] != null) { + lastUpdated = response.body['last_updated'].toString(); + } + } + } catch (e) { + debugPrint("Error fetching driver cache: $e"); + } finally { + isLoading = false; + update(); // Update UI with data + } + } + + // Update search query + void updateSearchQuery(String query) { + searchQuery = query; + update(); + } + + // Mark driver as paid and save to storage + void markAsPaid(String driverId) { + // Validation: Don't mark if ID is invalid + if (driverId == 'null' || driverId.isEmpty) return; + + if (!paidDrivers.contains(driverId)) { + paidDrivers.add(driverId); + box.write('paid_drivers', paidDrivers); + update(); + } + } + + // Clear all paid status (Delete Box) + void clearPaidStorage() { + paidDrivers.clear(); + box.remove('paid_drivers'); + update(); + Get.snackbar( + "Storage Cleared", + "Paid status history has been reset", + backgroundColor: Colors.redAccent, + colorText: Colors.white, + snackPosition: SnackPosition.BOTTOM, + ); + } + + // Check if driver is already paid + bool isDriverPaid(String driverId) { + return paidDrivers.contains(driverId); + } +} + +class DriverTheBestRedesigned extends StatelessWidget { + const DriverTheBestRedesigned({super.key}); + + @override + Widget build(BuildContext context) { + // Put the new controller + final controller = Get.put(DriverCacheController()); + + return Scaffold( + backgroundColor: const Color(0xFFF8FAFC), // slate-50 background + body: SafeArea( + child: GetBuilder(builder: (ctrl) { + if (ctrl.isLoading) { + return const Center(child: CircularProgressIndicator()); + } + + // Filter List based on Search Query + List filteredDrivers = ctrl.drivers.where((driver) { + if (ctrl.searchQuery.isEmpty) return true; + final phone = driver['phone']?.toString() ?? ''; + // Simple contains check for phone + return phone.contains(ctrl.searchQuery); + }).toList(); + + // Sort by Active Time (Hours) Descending + // We use the filtered list for sorting and display + filteredDrivers.sort((a, b) { + double hoursA = _calculateHoursFromStr(a['active_time']); + double hoursB = _calculateHoursFromStr(b['active_time']); + return hoursB.compareTo(hoursA); + }); + + // --- 1. Calculate Stats (Based on ALL drivers, not just filtered, to keep dashboard stable) --- + int totalDrivers = ctrl.drivers.length; + int eliteCount = 0; + int inactiveCount = 0; + double maxTime = 0.0; + + for (var driver in ctrl.drivers) { + double hours = _calculateHoursFromStr(driver['active_time']); + if (hours > maxTime) maxTime = hours; + if (hours >= 50) { + eliteCount++; + } else if (hours < 5) { + inactiveCount++; + } + } + + return Column( + children: [ + // --- 2. Header (Slate-900 style) --- + Container( + padding: const EdgeInsets.all(16), + decoration: const BoxDecoration( + color: Color(0xFF0F172A), // slate-900 + boxShadow: [BoxShadow(color: Colors.black26, blurRadius: 4)], + ), + child: Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Row( + children: [ + const Icon(Icons.local_taxi, + color: Colors.yellow, size: 24), + const SizedBox(width: 8), + Text( + 'Best Drivers Dashboard'.tr, + style: const TextStyle( + color: Colors.white, + fontSize: 20, + fontWeight: FontWeight.bold, + ), + ), + ], + ), + const SizedBox(height: 4), + Row( + children: [ + const Icon(Icons.access_time, + color: Colors.grey, size: 12), + const SizedBox(width: 4), + Text( + ctrl.lastUpdated.isNotEmpty + ? 'Updated: ${ctrl.lastUpdated}' + : 'Data Live', + style: TextStyle( + color: Colors.grey[400], fontSize: 12), + ), + ], + ), + ], + ), + // Action Buttons (Delete Box & Refresh) + Row( + children: [ + // Delete Box Icon + IconButton( + onPressed: () { + Get.defaultDialog( + title: "Reset Paid Status", + middleText: + "Are you sure you want to clear the list of paid drivers? This cannot be undone.", + textConfirm: "Yes, Clear", + textCancel: "Cancel", + confirmTextColor: Colors.white, + buttonColor: Colors.red, + onConfirm: () { + ctrl.clearPaidStorage(); + Get.back(); + }, + ); + }, + icon: const Icon(Icons.delete_forever, + color: Colors.redAccent), + tooltip: "Clear Paid Storage", + style: IconButton.styleFrom( + backgroundColor: Colors.white10), + ), + const SizedBox(width: 8), + IconButton( + onPressed: () { + ctrl.fetchData(); + }, + icon: const Icon(Icons.refresh, + color: Colors.blueAccent), + style: IconButton.styleFrom( + backgroundColor: Colors.white10), + ), + ], + ) + ], + ), + ), + + Expanded( + child: SingleChildScrollView( + padding: const EdgeInsets.all(16), + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + // --- 3. Statistics Cards Grid --- + SizedBox( + height: 100, // Fixed height for cards + child: Row( + children: [ + Expanded( + child: _buildStatCard('Total', + totalDrivers.toString(), Colors.blue)), + const SizedBox(width: 8), + Expanded( + child: _buildStatCard('Elite', + eliteCount.toString(), Colors.amber)), + ], + ), + ), + const SizedBox(height: 8), + SizedBox( + height: 100, + child: Row( + children: [ + Expanded( + child: _buildStatCard('Inactive', + inactiveCount.toString(), Colors.red)), + const SizedBox(width: 8), + Expanded( + child: _buildStatCard( + 'Max Time', + '${maxTime.toStringAsFixed(1)}h', + Colors.green)), + ], + ), + ), + + const SizedBox(height: 24), + + // --- 4. Search Bar --- + TextField( + onChanged: (val) => ctrl.updateSearchQuery(val), + decoration: InputDecoration( + hintText: 'Search by phone number...', + prefixIcon: + const Icon(Icons.search, color: Colors.grey), + filled: true, + fillColor: Colors.white, + border: OutlineInputBorder( + borderRadius: BorderRadius.circular(12), + borderSide: BorderSide.none, + ), + enabledBorder: OutlineInputBorder( + borderRadius: BorderRadius.circular(12), + borderSide: BorderSide(color: Colors.grey.shade200), + ), + ), + ), + + const SizedBox(height: 16), + + // --- 5. Driver List --- + if (filteredDrivers.isEmpty) + Center( + child: Padding( + padding: const EdgeInsets.all(20.0), + child: Text( + ctrl.searchQuery.isNotEmpty + ? "No drivers found with this number" + : "No drivers available", + style: TextStyle(color: Colors.grey[400])), + )) + else + ListView.separated( + shrinkWrap: true, + physics: const NeverScrollableScrollPhysics(), + itemCount: filteredDrivers.length, + separatorBuilder: (c, i) => + const SizedBox(height: 12), + itemBuilder: (context, index) { + final driver = filteredDrivers[index]; + return _buildDriverCard( + context, driver, index, ctrl); + }, + ), + ], + ), + ), + ), + ], + ); + }), + ), + ); + } + + // --- Helper Methods --- + + // Updated to parse the Arabic string format "5 ساعة 30 دقيقة" + double _calculateHoursFromStr(dynamic activeTimeStr) { + if (activeTimeStr == null || activeTimeStr is! String) return 0.0; + + try { + int hours = 0; + int mins = 0; + + // Extract hours + final hoursMatch = RegExp(r'(\d+)\s*ساعة').firstMatch(activeTimeStr); + if (hoursMatch != null) { + hours = int.parse(hoursMatch.group(1) ?? '0'); + } + + // Extract minutes + final minsMatch = RegExp(r'(\d+)\s*دقيقة').firstMatch(activeTimeStr); + if (minsMatch != null) { + mins = int.parse(minsMatch.group(1) ?? '0'); + } + + return hours + (mins / 60.0); + } catch (e) { + return 0.0; + } + } + + Widget _buildStatCard(String title, String value, Color color) { + return Container( + padding: const EdgeInsets.all(12), + decoration: BoxDecoration( + color: Colors.white, + borderRadius: BorderRadius.circular(12), + border: Border(right: BorderSide(color: color, width: 4)), + boxShadow: [ + BoxShadow( + color: Colors.grey.withOpacity(0.1), + blurRadius: 4, + offset: const Offset(0, 2)) + ], + ), + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + mainAxisAlignment: MainAxisAlignment.center, + children: [ + Text(title, + style: const TextStyle( + fontSize: 12, + color: Colors.grey, + fontWeight: FontWeight.bold)), + const SizedBox(height: 4), + Text(value, + style: TextStyle( + fontSize: 22, + color: color.withOpacity(0.8), + fontWeight: FontWeight.bold)), + ], + ), + ); + } + + Widget _buildDriverCard(BuildContext context, Map driver, int index, + DriverCacheController controller) { + double hours = _calculateHoursFromStr(driver['active_time']); + String driverId = driver['id']?.toString() ?? 'null'; + bool isPaid = controller.isDriverPaid(driverId); + + // Determine Status Category (mimicking HTML logic) + String statusText; + Color statusColor; + if (hours >= 50) { + statusText = "Elite"; + statusColor = Colors.amber; + } else if (hours >= 20) { + statusText = "Stable"; + statusColor = Colors.green; + } else if (hours >= 5) { + statusText = "Experimental"; + statusColor = Colors.blue; + } else { + statusText = "Inactive"; + statusColor = Colors.red; + } + + // Override colors if paid + Color cardBackground = isPaid ? Colors.teal.shade50 : Colors.white; + Color borderColor = isPaid ? Colors.teal : Colors.transparent; + + // Calculate progress (max assumed 60 hours for 100% bar) + double progress = (hours / 60).clamp(0.0, 1.0); + + return Container( + padding: const EdgeInsets.all(16), + decoration: BoxDecoration( + color: cardBackground, + border: isPaid ? Border.all(color: borderColor, width: 2) : null, + borderRadius: BorderRadius.circular(12), + boxShadow: [ + BoxShadow( + color: Colors.grey.withOpacity(0.05), + blurRadius: 10, + offset: const Offset(0, 4)) + ], + ), + child: Column( + children: [ + if (isPaid) + Row( + mainAxisAlignment: MainAxisAlignment.end, + children: [ + Container( + padding: + const EdgeInsets.symmetric(horizontal: 8, vertical: 2), + decoration: BoxDecoration( + color: Colors.teal, + borderRadius: BorderRadius.circular(4)), + child: const Text("PAID", + style: TextStyle( + color: Colors.white, + fontSize: 10, + fontWeight: FontWeight.bold)), + ) + ], + ), + Row( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + // Avatar + CircleAvatar( + backgroundColor: statusColor.withOpacity(0.1), + radius: 24, + child: Text( + hours.toStringAsFixed(0), + style: TextStyle( + color: statusColor, fontWeight: FontWeight.bold), + ), + ), + const SizedBox(width: 12), + + // Name and Phone + Expanded( + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Text( + driver['name_arabic'] ?? 'Unknown Name', + style: TextStyle( + fontWeight: FontWeight.bold, + fontSize: 16, + color: isPaid + ? Colors.teal.shade900 + : const Color(0xFF334155)), + ), + const SizedBox(height: 4), + Text( + driver['phone'] ?? 'N/A', + style: const TextStyle( + fontFamily: 'monospace', + fontSize: 12, + color: Colors.grey), + ), + const SizedBox(height: 2), + Text( + driver['active_time'] ?? '', + style: TextStyle(fontSize: 10, color: Colors.grey[400]), + ), + ], + ), + ), + + // Status Badge + Container( + padding: const EdgeInsets.symmetric(horizontal: 8, vertical: 4), + decoration: BoxDecoration( + color: statusColor.withOpacity(0.1), + borderRadius: BorderRadius.circular(4), + border: Border.all(color: statusColor.withOpacity(0.2)), + ), + child: Text( + statusText, + style: TextStyle( + fontSize: 10, + color: statusColor, + fontWeight: FontWeight.bold), + ), + ), + ], + ), + + const SizedBox(height: 12), + + // Progress Bar + Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + Text("Performance", + style: TextStyle(fontSize: 10, color: Colors.grey[600])), + Text("${hours.toStringAsFixed(2)} hrs", + style: const TextStyle( + fontSize: 10, fontWeight: FontWeight.bold)), + ], + ), + const SizedBox(height: 4), + LinearProgressIndicator( + value: progress, + backgroundColor: Colors.grey[100], + color: statusColor, + minHeight: 6, + borderRadius: BorderRadius.circular(3), + ), + ], + ), + + const SizedBox(height: 16), + const Divider(height: 1), + const SizedBox(height: 8), + + // Actions Row + Row( + mainAxisAlignment: MainAxisAlignment.end, + children: [ + // Pay Gift Button (The specific request) + isPaid + ? const Text("Payment Completed", + style: TextStyle( + color: Colors.teal, fontWeight: FontWeight.bold)) + : ElevatedButton.icon( + onPressed: () { + _showPayDialog(driver, controller); + }, + icon: const Icon(Icons.card_giftcard, size: 16), + label: Text("Pay Gift".tr), + style: ElevatedButton.styleFrom( + backgroundColor: Colors.indigo, // Dark blue/purple + foregroundColor: Colors.white, + padding: const EdgeInsets.symmetric( + horizontal: 16, vertical: 8), + shape: RoundedRectangleBorder( + borderRadius: BorderRadius.circular(8)), + ), + ), + ], + ) + ], + ), + ); + } + + void _showPayDialog(Map driver, DriverCacheController controller) { + // Check for valid ID immediately + String driverId = driver['driver_id']?.toString() ?? ''; + String phone = driver['phone']?.toString() ?? ''; + if (driverId.isEmpty || driverId == 'null') { + Get.snackbar("Error", "Cannot pay driver with missing ID", + backgroundColor: Colors.red, colorText: Colors.white); + return; + } + + // Controller for the Amount Field + final TextEditingController amountController = + TextEditingController(text: '50000'); + + Get.defaultDialog( + title: 'Confirm Payment', + titleStyle: const TextStyle( + color: Color(0xFF0F172A), fontWeight: FontWeight.bold), + content: Column( + children: [ + const Icon(Icons.wallet_giftcard, size: 50, color: Colors.indigo), + const SizedBox(height: 10), + Text( + 'Sending gift to ${driver['name_arabic']}', + textAlign: TextAlign.center, + ), + const SizedBox(height: 15), + // Amount Field + TextFormField( + controller: amountController, + keyboardType: TextInputType.number, + decoration: const InputDecoration( + labelText: 'Amount (SYP)', + border: OutlineInputBorder(), + prefixIcon: Icon(Icons.attach_money), + ), + ), + ], + ), + textConfirm: 'Pay Now', + confirmTextColor: Colors.white, + buttonColor: Colors.indigo, + onConfirm: () async { + final wallet = Get.put(WalletController()); + + // Get amount from field + String amount = amountController.text.trim(); + if (amount.isEmpty) amount = '0'; + + // String driverToken = driver['token'] ?? ''; + + // 1. Add Payment + await wallet.addDriverWallet('gift_connect', driverId, amount, phone); + + // 2. Add to Sefer Wallet + //await wallet.addSeferWallet(amount, driverId); + + // 3. Delete Record via CRUD + // await CRUD() + // .post(link: AppLink.deleteRecord, payload: {'driver_id': driverId}); + + // 4. UI Update & Storage + // Mark as paid instead of removing completely, so we can see the color change + controller.markAsPaid(driverId); + + Get.back(); // Close Dialog + + Get.snackbar("Success", "Payment of $amount EGP sent to driver", + backgroundColor: Colors.green, + colorText: Colors.white, + snackPosition: SnackPosition.BOTTOM); + }, + textCancel: 'Cancel', + onCancel: () => Get.back(), + ); + } +} diff --git a/siro_admin/lib/views/admin/drivers/driver_tracker_screen.dart b/siro_admin/lib/views/admin/drivers/driver_tracker_screen.dart new file mode 100644 index 0000000..a28b990 --- /dev/null +++ b/siro_admin/lib/views/admin/drivers/driver_tracker_screen.dart @@ -0,0 +1,837 @@ +import 'dart:async'; +import 'dart:convert'; +import 'dart:math' as math; +import 'package:flutter/material.dart'; +import 'package:flutter_map/flutter_map.dart'; +import 'package:latlong2/latlong.dart'; +import 'package:http/http.dart' as http; +import 'package:siro_admin/constant/links.dart'; +import 'package:url_launcher/url_launcher.dart'; + +import '../../../constant/box_name.dart'; +import '../../../controller/functions/crud.dart'; +import '../../../main.dart'; + +class IntaleqTrackerScreen extends StatefulWidget { + const IntaleqTrackerScreen({super.key}); + + @override + State createState() => _IntaleqTrackerScreenState(); +} + +class _IntaleqTrackerScreenState extends State + with TickerProviderStateMixin { + // === Map Controller === + final MapController _mapController = MapController(); + List _markers = []; + + // === State Variables === + bool isLiveMode = true; + bool isLoading = false; + String lastUpdated = "جاري التحميل..."; + + // === Counters === + int liveCount = 0; + int dayCount = 0; + Timer? _timer; + + // === Animation Controllers === + late AnimationController _fadeController; + late AnimationController _scaleController; + + // === Admin Info === + String myPhone = box.read(BoxName.adminPhone).toString(); + bool get isSuperAdmin => + myPhone == '963942542053' || myPhone == '963992952235'; + + // === URLs === + final String _baseDir = "${AppLink.server}/ride/location/"; + + @override + void initState() { + super.initState(); + _initAnimations(); + fetchData(); + + _timer = Timer.periodic(const Duration(minutes: 5), (timer) { + if (mounted) fetchData(); + }); + } + + void _initAnimations() { + _fadeController = AnimationController( + duration: const Duration(milliseconds: 800), + vsync: this, + ); + _scaleController = AnimationController( + duration: const Duration(milliseconds: 600), + vsync: this, + ); + _fadeController.forward(); + _scaleController.forward(); + } + + @override + void dispose() { + _timer?.cancel(); + _mapController.dispose(); + _fadeController.dispose(); + _scaleController.dispose(); + super.dispose(); + } + + Future _makePhoneCall(String phoneNumber) async { + final Uri launchUri = Uri(scheme: 'tel', path: phoneNumber); + if (await canLaunchUrl(launchUri)) { + await launchUrl(launchUri); + } else { + _showSnackBar("لا يمكن إجراء الاتصال لهذا الرقم"); + } + } + + void _showSnackBar(String message) { + ScaffoldMessenger.of(context).showSnackBar( + SnackBar( + content: Text(message), + backgroundColor: const Color(0xFF2C3E50), + behavior: SnackBarBehavior.floating, + margin: const EdgeInsets.all(16), + shape: RoundedRectangleBorder(borderRadius: BorderRadius.circular(12)), + ), + ); + } + + Future fetchData() async { + if (!mounted) return; + setState(() => isLoading = true); + + try { + String updateUrl = + "${_baseDir}getUpdatedLocationForAdmin.php?mode=${isLiveMode ? 'live' : 'day'}"; + print("📡 Calling Update URL: $updateUrl"); + var responseUpdate = await CRUD().post(link: updateUrl, payload: {}); + print("📡 Update Response: $responseUpdate"); + + String v = DateTime.now().millisecondsSinceEpoch.toString(); + + String liveUrl = "${_baseDir}locations_live.json?v=$v"; + print("📡 Calling Live JSON URL: $liveUrl"); + final responseLive = await http.get(Uri.parse(liveUrl)); + print( + "📡 Live JSON Response (${responseLive.statusCode}): ${responseLive.body.length > 100 ? responseLive.body.substring(0, 100) : responseLive.body}"); + if (responseLive.statusCode == 200) { + final data = json.decode(responseLive.body); + List drivers = (data is Map && data.containsKey('drivers')) + ? data['drivers'] + : data; + + setState(() { + liveCount = drivers.length; + if (isLiveMode) _buildMarkers(drivers); + }); + } + + String dayUrl = "${_baseDir}locations_day.json?v=$v"; + print("📡 Calling Day JSON URL: $dayUrl"); + final responseDay = await http.get(Uri.parse(dayUrl)); + print( + "📡 Day JSON Response (${responseDay.statusCode}): ${responseDay.body.length > 100 ? responseDay.body.substring(0, 100) : responseDay.body}"); + if (responseDay.statusCode == 200) { + final data = json.decode(responseDay.body); + List drivers = (data is Map && data.containsKey('drivers')) + ? data['drivers'] + : data; + + setState(() { + dayCount = drivers.length; + if (!isLiveMode) _buildMarkers(drivers); + }); + } + + setState(() { + lastUpdated = DateTime.now().toString().substring(11, 19); + }); + } catch (e) { + print("Exception: $e"); + setState(() => lastUpdated = "خطأ في الاتصال"); + } finally { + if (mounted) setState(() => isLoading = false); + } + } + + void _buildMarkers(List drivers) { + List newMarkers = []; + + for (var d in drivers) { + double lat = double.tryParse((d['lat'] ?? "0").toString()) ?? 0.0; + double lon = double.tryParse((d['lon'] ?? "0").toString()) ?? 0.0; + double heading = double.tryParse((d['heading'] ?? "0").toString()) ?? 0.0; + + String id = (d['id'] ?? "Unknown").toString(); + String speed = (d['speed'] ?? "0").toString(); + String name = (d['name'] ?? "كابتن").toString(); + String phone = (d['phone'] ?? "").toString(); + String completed = (d['completed'] ?? "0").toString(); + String cancelled = (d['cancelled'] ?? "0").toString(); + + if (lat != 0 && lon != 0) { + newMarkers.add( + Marker( + point: LatLng(lat, lon), + width: 60, + height: 60, + child: GestureDetector( + onTap: () { + _showDriverInfoDialog( + driverId: id, + name: name, + phone: phone, + speed: speed, + heading: heading, + completed: completed, + cancelled: cancelled, + ); + }, + child: _buildMarkerWidget(heading), + ), + ), + ); + } + } + setState(() { + _markers = newMarkers; + }); + } + + Widget _buildMarkerWidget(double heading) { + return Stack( + alignment: Alignment.center, + children: [ + Container( + width: 44, + height: 44, + decoration: BoxDecoration( + shape: BoxShape.circle, + gradient: LinearGradient( + colors: isLiveMode + ? [const Color(0xFF27AE60), const Color(0xFF229954)] + : [const Color(0xFF3498DB), const Color(0xFF2980B9)], + begin: Alignment.topLeft, + end: Alignment.bottomRight, + ), + boxShadow: [ + BoxShadow( + color: (isLiveMode + ? const Color(0xFF27AE60) + : const Color(0xFF3498DB)) + .withOpacity(0.5), + blurRadius: 12, + spreadRadius: 2, + ) + ], + ), + ), + Transform.rotate( + angle: heading * (math.pi / 180), + child: Icon( + Icons.navigation, + color: Colors.white, + size: 26, + ), + ), + ], + ); + } + + void _showDriverInfoDialog({ + required String driverId, + required String name, + required String phone, + required String speed, + required double heading, + required String completed, + required String cancelled, + }) { + showDialog( + context: context, + builder: (_) => Dialog( + shape: RoundedRectangleBorder(borderRadius: BorderRadius.circular(24)), + backgroundColor: Colors.transparent, + child: Container( + decoration: BoxDecoration( + gradient: LinearGradient( + colors: [Colors.white, Colors.grey.shade50], + begin: Alignment.topLeft, + end: Alignment.bottomRight, + ), + borderRadius: BorderRadius.circular(24), + boxShadow: [ + BoxShadow( + color: Colors.black.withOpacity(0.15), + blurRadius: 30, + spreadRadius: 5, + ) + ], + ), + child: Padding( + padding: const EdgeInsets.all(24), + child: Column( + mainAxisSize: MainAxisSize.min, + children: [ + Container( + padding: + const EdgeInsets.symmetric(horizontal: 16, vertical: 12), + decoration: BoxDecoration( + gradient: LinearGradient( + colors: isLiveMode + ? [const Color(0xFF27AE60), const Color(0xFF229954)] + : [const Color(0xFF3498DB), const Color(0xFF2980B9)], + ), + borderRadius: BorderRadius.circular(12), + ), + child: Row( + mainAxisSize: MainAxisSize.min, + children: [ + Icon(Icons.person_outline, color: Colors.white, size: 20), + const SizedBox(width: 8), + const Text( + "معلومات الكابتن", + style: TextStyle( + fontSize: 18, + fontWeight: FontWeight.bold, + color: Colors.white, + ), + ), + ], + ), + ), + const SizedBox(height: 20), + _buildInfoCard(Icons.person, "الاسم", name), + const SizedBox(height: 12), + _buildInfoCard(Icons.badge, "المعرف", driverId), + const SizedBox(height: 12), + _buildInfoCard(Icons.speed, "السرعة", "$speed كم/س"), + const SizedBox(height: 20), + _buildStatsContainer(completed, cancelled), + if (isSuperAdmin) ...[ + const SizedBox(height: 16), + _buildPhoneButton(phone), + ], + const SizedBox(height: 20), + SizedBox( + width: double.infinity, + child: ElevatedButton( + onPressed: () => Navigator.pop(context), + style: ElevatedButton.styleFrom( + backgroundColor: const Color(0xFF2C3E50), + foregroundColor: Colors.white, + padding: const EdgeInsets.symmetric(vertical: 14), + shape: RoundedRectangleBorder( + borderRadius: BorderRadius.circular(12), + ), + elevation: 0, + ), + child: const Text( + "إغلاق", + style: TextStyle( + fontSize: 16, + fontWeight: FontWeight.bold, + ), + ), + ), + ) + ], + ), + ), + ), + ), + ); + } + + Widget _buildInfoCard(IconData icon, String label, String value) { + return Container( + padding: const EdgeInsets.all(14), + decoration: BoxDecoration( + color: Colors.white, + borderRadius: BorderRadius.circular(12), + border: Border.all( + color: Colors.grey.shade200, + width: 1, + ), + boxShadow: [ + BoxShadow( + color: Colors.black.withOpacity(0.05), + blurRadius: 8, + ) + ], + ), + child: Row( + children: [ + Container( + padding: const EdgeInsets.all(8), + decoration: BoxDecoration( + color: Colors.grey.shade100, + borderRadius: BorderRadius.circular(8), + ), + child: Icon(icon, color: const Color(0xFF2C3E50), size: 20), + ), + const SizedBox(width: 12), + Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Text( + label, + style: TextStyle( + fontSize: 12, + color: Colors.grey.shade600, + fontWeight: FontWeight.w500, + ), + ), + const SizedBox(height: 4), + Text( + value, + style: const TextStyle( + fontSize: 15, + fontWeight: FontWeight.bold, + color: Color(0xFF2C3E50), + ), + ), + ], + ), + ], + ), + ); + } + + Widget _buildStatsContainer(String completed, String cancelled) { + return Container( + padding: const EdgeInsets.all(16), + decoration: BoxDecoration( + gradient: LinearGradient( + colors: [Colors.grey.shade50, Colors.grey.shade100], + begin: Alignment.topLeft, + end: Alignment.bottomRight, + ), + borderRadius: BorderRadius.circular(12), + border: Border.all(color: Colors.grey.shade200), + ), + child: Row( + mainAxisAlignment: MainAxisAlignment.spaceEvenly, + children: [ + _buildStatItem("✓ مكتملة", completed, const Color(0xFF27AE60)), + Container( + width: 1, + height: 40, + color: Colors.grey.shade300, + ), + _buildStatItem("✕ ملغاة", cancelled, const Color(0xFFE74C3C)), + ], + ), + ); + } + + Widget _buildStatItem(String label, String value, Color color) { + return Column( + children: [ + Text( + value, + style: TextStyle( + color: color, + fontWeight: FontWeight.bold, + fontSize: 20, + ), + ), + const SizedBox(height: 4), + Text( + label, + style: TextStyle( + fontSize: 12, + color: Colors.grey.shade600, + fontWeight: FontWeight.w500, + ), + ), + ], + ); + } + + Widget _buildPhoneButton(String phone) { + return InkWell( + onTap: () { + if (phone.isNotEmpty) _makePhoneCall(phone); + }, + borderRadius: BorderRadius.circular(12), + child: Container( + width: double.infinity, + padding: const EdgeInsets.symmetric(vertical: 12, horizontal: 14), + decoration: BoxDecoration( + gradient: LinearGradient( + colors: [const Color(0xFFFFA500), const Color(0xFFFF8C00)], + begin: Alignment.topLeft, + end: Alignment.bottomRight, + ), + borderRadius: BorderRadius.circular(12), + boxShadow: [ + BoxShadow( + color: const Color(0xFFFFA500).withOpacity(0.4), + blurRadius: 12, + spreadRadius: 2, + ) + ], + ), + child: Row( + mainAxisAlignment: MainAxisAlignment.center, + children: [ + const Icon(Icons.call, color: Colors.white, size: 20), + const SizedBox(width: 10), + Expanded( + child: Text( + phone, + style: const TextStyle( + color: Colors.white, + fontWeight: FontWeight.bold, + fontSize: 15, + ), + textAlign: TextAlign.center, + ), + ), + ], + ), + ), + ); + } + + @override + Widget build(BuildContext context) { + return Scaffold( + extendBodyBehindAppBar: true, + appBar: AppBar( + elevation: 0, + backgroundColor: Colors.transparent, + centerTitle: true, + title: Container( + padding: const EdgeInsets.symmetric(horizontal: 16, vertical: 8), + decoration: BoxDecoration( + color: const Color(0xFF2C3E50).withOpacity(0.9), + borderRadius: BorderRadius.circular(12), + // backdropFilter: const BackdropFilter(blur: 10), + ), + child: const Text( + "نظام تتبع الكابتن", + style: TextStyle( + fontSize: 18, + fontWeight: FontWeight.bold, + color: Colors.white, + ), + ), + ), + foregroundColor: Colors.white, + ), + body: Stack( + children: [ + FlutterMap( + mapController: _mapController, + options: const MapOptions( + initialCenter: LatLng(33.513, 36.276), + initialZoom: 10.0, + ), + children: [ + TileLayer( + urlTemplate: 'https://tile.openstreetmap.org/{z}/{x}/{y}.png', + userAgentPackageName: 'com.tripz.app', + ), + MarkerLayer(markers: _markers), + ], + ), + _buildDashboard(), + ], + ), + ); + } + + Widget _buildDashboard() { + return Positioned( + top: 100, + right: 16, + child: FadeTransition( + opacity: _fadeController, + child: ScaleTransition( + scale: _scaleController, + child: Container( + width: 300, + decoration: BoxDecoration( + color: Colors.white, + borderRadius: BorderRadius.circular(20), + boxShadow: [ + BoxShadow( + color: Colors.black.withOpacity(0.15), + blurRadius: 30, + spreadRadius: 5, + ) + ], + ), + child: ClipRRect( + borderRadius: BorderRadius.circular(20), + child: Column( + children: [ + // Header + Container( + padding: const EdgeInsets.all(16), + decoration: BoxDecoration( + gradient: LinearGradient( + colors: [ + const Color(0xFF2C3E50), + const Color(0xFF34495E) + ], + begin: Alignment.topLeft, + end: Alignment.bottomRight, + ), + ), + child: Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + const Icon(Icons.dashboard, + color: Colors.white, size: 22), + const Text( + "لوحة التحكم", + style: TextStyle( + color: Colors.white, + fontSize: 16, + fontWeight: FontWeight.bold, + ), + ), + ], + ), + ), + Padding( + padding: const EdgeInsets.all(16), + child: Column( + crossAxisAlignment: CrossAxisAlignment.end, + children: [ + // Mode Buttons + Row( + children: [ + Expanded( + child: _buildModeButton( + "أرشيف اليوم", + !isLiveMode, + () { + setState(() => isLiveMode = false); + fetchData(); + }, + const Color(0xFF3498DB), + ), + ), + const SizedBox(width: 10), + Expanded( + child: _buildModeButton( + "مباشر", + isLiveMode, + () { + setState(() => isLiveMode = true); + fetchData(); + }, + const Color(0xFF27AE60), + ), + ), + ], + ), + const SizedBox(height: 16), + + // Stats + _buildStatRow( + icon: Icons.live_tv, + label: "نشط الآن (مباشر)", + value: liveCount.toString(), + color: const Color(0xFF27AE60), + ), + const SizedBox(height: 12), + _buildStatRow( + icon: Icons.history, + label: "إجمالي اليوم", + value: dayCount.toString(), + color: const Color(0xFF3498DB), + ), + const SizedBox(height: 14), + + // Last Update + Container( + padding: const EdgeInsets.all(10), + decoration: BoxDecoration( + color: Colors.grey.shade50, + borderRadius: BorderRadius.circular(8), + border: Border.all(color: Colors.grey.shade200), + ), + child: Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + Text( + isLoading + ? "جاري التحديث..." + : "تحديث: $lastUpdated", + style: TextStyle( + fontSize: 11, + color: Colors.grey.shade600, + fontWeight: FontWeight.w500, + ), + ), + Icon( + isLoading + ? Icons.hourglass_bottom + : Icons.check_circle, + size: 14, + color: isLoading ? Colors.orange : Colors.green, + ), + ], + ), + ), + const SizedBox(height: 12), + + // Refresh Button + SizedBox( + width: double.infinity, + child: ElevatedButton( + onPressed: isLoading ? null : fetchData, + style: ElevatedButton.styleFrom( + backgroundColor: const Color(0xFF2C3E50), + foregroundColor: Colors.white, + disabledBackgroundColor: Colors.grey.shade300, + padding: const EdgeInsets.symmetric(vertical: 12), + shape: RoundedRectangleBorder( + borderRadius: BorderRadius.circular(10), + ), + elevation: 0, + ), + child: Row( + mainAxisAlignment: MainAxisAlignment.center, + children: [ + if (isLoading) + const SizedBox( + width: 16, + height: 16, + child: CircularProgressIndicator( + strokeWidth: 2, + valueColor: AlwaysStoppedAnimation( + Colors.white, + ), + ), + ) + else + const Icon(Icons.refresh, size: 18), + const SizedBox(width: 8), + const Text( + "تحديث البيانات", + style: TextStyle( + fontWeight: FontWeight.bold, + fontSize: 14, + ), + ), + ], + ), + ), + ), + ], + ), + ), + ], + ), + ), + ), + ), + ), + ); + } + + Widget _buildModeButton( + String title, + bool active, + VoidCallback onTap, + Color color, + ) { + return InkWell( + onTap: onTap, + borderRadius: BorderRadius.circular(10), + child: AnimatedContainer( + duration: const Duration(milliseconds: 300), + padding: const EdgeInsets.symmetric(vertical: 10), + alignment: Alignment.center, + decoration: BoxDecoration( + gradient: active + ? LinearGradient( + colors: [color, color.withOpacity(0.8)], + begin: Alignment.topLeft, + end: Alignment.bottomRight, + ) + : null, + color: active ? null : Colors.grey.shade100, + borderRadius: BorderRadius.circular(10), + border: Border.all( + color: active ? color : Colors.grey.shade300, + width: 1.5, + ), + boxShadow: active + ? [ + BoxShadow( + color: color.withOpacity(0.3), + blurRadius: 8, + spreadRadius: 1, + ) + ] + : null, + ), + child: Text( + title, + style: TextStyle( + color: active ? Colors.white : Colors.grey.shade700, + fontWeight: active ? FontWeight.bold : FontWeight.w600, + fontSize: 13, + ), + ), + ), + ); + } + + Widget _buildStatRow({ + required IconData icon, + required String label, + required String value, + required Color color, + }) { + return Row( + children: [ + Container( + padding: const EdgeInsets.all(8), + decoration: BoxDecoration( + color: color.withOpacity(0.1), + borderRadius: BorderRadius.circular(8), + ), + child: Icon(icon, color: color, size: 18), + ), + const SizedBox(width: 12), + Expanded( + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Text( + label, + style: TextStyle( + fontSize: 12, + color: Colors.grey.shade600, + fontWeight: FontWeight.w500, + ), + ), + const SizedBox(height: 2), + Text( + value, + style: TextStyle( + fontSize: 16, + fontWeight: FontWeight.bold, + color: color, + ), + ), + ], + ), + ), + ], + ); + } +} diff --git a/siro_admin/lib/views/admin/drivers/giza.dart b/siro_admin/lib/views/admin/drivers/giza.dart new file mode 100644 index 0000000..33608a9 --- /dev/null +++ b/siro_admin/lib/views/admin/drivers/giza.dart @@ -0,0 +1,69 @@ +import 'package:flutter/material.dart'; +import 'package:get/get.dart'; +import 'package:siro_admin/constant/links.dart'; +import 'package:siro_admin/controller/functions/crud.dart'; +import 'package:siro_admin/controller/functions/wallet.dart'; +import 'package:siro_admin/views/widgets/my_scafold.dart'; + +import '../../../controller/drivers/driverthebest.dart'; + +class DriverTheBestGiza extends StatelessWidget { + const DriverTheBestGiza({super.key}); + + @override + Widget build(BuildContext context) { + Get.put(DriverTheBestGizaController(), permanent: true); + return MyScafolld( + title: 'Giza'.tr, + body: [ + GetBuilder(builder: (driverthebest) { + return driverthebest.driver.isNotEmpty + ? ListView.builder( + itemCount: driverthebest.driver.length, + itemBuilder: (context, index) { + final driver = driverthebest.driver[index]; + return ListTile( + leading: CircleAvatar( + child: Text( + ((driver['driver_count'] * 5) / 3600) + .toStringAsFixed(0), + ), + ), + title: Text(driver['name_arabic'] ?? 'Unknown Name'), + subtitle: Text('Phone: ${driver['phone'] ?? 'N/A'}'), + trailing: IconButton( + onPressed: () async { + Get.defaultDialog( + title: + 'are you sure to pay to this driver gift'.tr, + middleText: '', + onConfirm: () async { + final wallet = Get.put(WalletController()); + await wallet.addPaymentToDriver('100', + driver['id'].toString(), driver['token']); + await wallet.addSeferWallet( + '100', driver['id'].toString()); + await CRUD().post( + link: AppLink.deleteRecord, + payload: { + 'driver_id': driver['id'].toString() + }); + driverthebest.driver.removeAt(index); + driverthebest.update(); + }, + onCancel: () => Get.back()); + }, + icon: const Icon(Icons.wallet_giftcard_rounded), + ), + ); + }, + ) + : const Center( + child: Text('No drivers available.'), + ); + }) + ], + isleading: true, + ); + } +} diff --git a/siro_admin/lib/views/admin/drivers/monitor_ride.dart b/siro_admin/lib/views/admin/drivers/monitor_ride.dart new file mode 100644 index 0000000..bcd7395 --- /dev/null +++ b/siro_admin/lib/views/admin/drivers/monitor_ride.dart @@ -0,0 +1,833 @@ +import 'dart:async'; +import 'package:flutter/material.dart'; +import 'package:get/get.dart'; +import 'package:flutter_map/flutter_map.dart'; +import 'package:latlong2/latlong.dart'; +import 'package:siro_admin/constant/links.dart'; +// Keep your specific imports +import 'package:siro_admin/controller/functions/crud.dart'; + +/// -------------------------------------------------------------------------- +/// 1. DATA MODELS +/// -------------------------------------------------------------------------- + +class DriverLocation { + final double latitude; + final double longitude; + final double speed; + final double heading; + final String updatedAt; + + DriverLocation({ + required this.latitude, + required this.longitude, + required this.speed, + required this.heading, + required this.updatedAt, + }); + + factory DriverLocation.fromJson(Map json) { + return DriverLocation( + latitude: double.tryParse(json['latitude'].toString()) ?? 0.0, + longitude: double.tryParse(json['longitude'].toString()) ?? 0.0, + speed: double.tryParse(json['speed'].toString()) ?? 0.0, + heading: double.tryParse(json['heading'].toString()) ?? 0.0, + updatedAt: json['updated_at'] ?? '', + ); + } +} + +/// -------------------------------------------------------------------------- +/// 2. GETX CONTROLLER +/// -------------------------------------------------------------------------- + +class RideMonitorController extends GetxController { + // CONFIGURATION + final String apiUrl = "${AppLink.server}/Admin/rides/monitorRide.php"; + + // INPUT CONTROLLERS + final TextEditingController phoneInputController = TextEditingController(); + + // OBSERVABLES + var isTracking = false.obs; + var isLoading = false.obs; + var hasError = false.obs; + var errorMessage = ''.obs; + + // Driver & Ride Data + var driverLocation = Rxn(); + var driverName = "Unknown Driver".obs; + var rideStatus = "Waiting...".obs; + + // Route Data + var startPoint = Rxn(); + var endPoint = Rxn(); + var routePolyline = [].obs; // List of points for the line + + // Map Variables + final MapController mapController = MapController(); + Timer? _timer; + bool _isFirstLoad = true; // To trigger auto-fit bounds only on first success + + @override + void onClose() { + _timer?.cancel(); + phoneInputController.dispose(); + super.onClose(); + } + + // --- ACTIONS --- + + void startSearch() { + if (phoneInputController.text.trim().isEmpty) { + Get.snackbar( + "تنبيه", + "يرجى إدخال رقم الهاتف أولاً", + backgroundColor: Colors.redAccent.withOpacity(0.9), + colorText: Colors.white, + snackPosition: SnackPosition.TOP, + margin: const EdgeInsets.all(15), + borderRadius: 15, + ); + return; + } + + // Reset state + hasError.value = false; + errorMessage.value = ''; + driverLocation.value = null; + startPoint.value = null; + endPoint.value = null; + routePolyline.clear(); + driverName.value = "جاري التحميل..."; + rideStatus.value = "جاري التحميل..."; + _isFirstLoad = true; + + // Switch UI + isTracking.value = true; + isLoading.value = true; + + // Start fetching + fetchRideData(); + + // Start Polling + _timer?.cancel(); + _timer = Timer.periodic(const Duration(seconds: 10), (timer) { + fetchRideData(); + }); + } + + void stopTracking() { + _timer?.cancel(); + isTracking.value = false; + isLoading.value = false; + // phoneInputController.clear(); // اختياري: يمكنك إبقائه لتسهيل البحث مرة أخرى + } + + Future fetchRideData() async { + final phone = phoneInputController.text.trim(); + if (phone.isEmpty) return; + + try { + final response = await CRUD().post( + link: apiUrl, + payload: {"phone": "963$phone"}, + ); + + if (response != 'failure') { + final jsonResponse = response; + + if ((jsonResponse['message'] != null && + jsonResponse['message'] != 'failure') || + jsonResponse['status'] == 'success') { + final data = + jsonResponse['message'] ?? jsonResponse['data'] ?? jsonResponse; + + // 1. Parse Driver Info + if (data['driver_details'] != null) { + driverName.value = + data['driver_details']['fullname'] ?? "سائق غير معروف"; + } + + // 2. Parse Ride Info & Route + if (data['ride_details'] != null) { + rideStatus.value = data['ride_details']['status'] ?? "غير معروف"; + + // Parse Start/End Locations (Format: "lat,lng") + String? startStr = data['ride_details']['start_location']; + String? endStr = data['ride_details']['end_location']; + + LatLng? s = _parseLatLngString(startStr); + LatLng? e = _parseLatLngString(endStr); + + if (s != null && e != null) { + startPoint.value = s; + endPoint.value = e; + routePolyline.value = [s, e]; // Straight line for now + } + } + + // 3. Parse Live Location + final locData = data['driver_location']; + if (locData is Map) { + final newLocation = DriverLocation.fromJson(locData); + driverLocation.value = newLocation; + + // 4. Update Camera Bounds + _updateMapBounds(); + } else { + // Even if no live driver, we might want to show the route + if (startPoint.value != null && endPoint.value != null) { + _updateMapBounds(); + } + } + + hasError.value = false; + } else { + hasError.value = true; + errorMessage.value = jsonResponse['message'] ?? + "لم يتم العثور على رقم الهاتف أو لا توجد رحلة نشطة."; + } + } else { + hasError.value = true; + errorMessage.value = "فشل الاتصال بالخادم"; + } + } catch (e) { + if (isLoading.value) { + hasError.value = true; + errorMessage.value = e.toString(); + } + } finally { + isLoading.value = false; + } + } + + // Helper to parse "lat,lng" string + LatLng? _parseLatLngString(String? str) { + if (str == null || !str.contains(',')) return null; + try { + final parts = str.split(','); + final lat = double.parse(parts[0].trim()); + final lng = double.parse(parts[1].trim()); + return LatLng(lat, lng); + } catch (e) { + return null; + } + } + + // Logic to fit start, end, and driver on screen + void _updateMapBounds() { + if (!_isFirstLoad) return; + + List pointsToFit = []; + + if (startPoint.value != null) pointsToFit.add(startPoint.value!); + if (endPoint.value != null) pointsToFit.add(endPoint.value!); + if (driverLocation.value != null) { + pointsToFit.add(LatLng( + driverLocation.value!.latitude, driverLocation.value!.longitude)); + } + + if (pointsToFit.isNotEmpty) { + try { + final bounds = LatLngBounds.fromPoints(pointsToFit); + mapController.fitCamera( + CameraFit.bounds( + bounds: bounds, + padding: const EdgeInsets.all(80.0), + ), + ); + _isFirstLoad = false; + } catch (e) { + // Map Controller not ready yet + } + } + } +} + +/// -------------------------------------------------------------------------- +/// 3. UI SCREEN (Modern Light Theme) +/// -------------------------------------------------------------------------- + +class RideMonitorScreen extends StatelessWidget { + const RideMonitorScreen({super.key}); + + // 🎨 الألوان العصرية (Modern Palette) + final Color backgroundColor = const Color(0xFFF4F7FE); + final Color primaryColor = const Color(0xFF4318FF); + final Color textPrimary = const Color(0xFF2B3674); + final Color textSecondary = const Color(0xFFA3AED0); + + @override + Widget build(BuildContext context) { + final RideMonitorController controller = Get.put(RideMonitorController()); + + return Scaffold( + backgroundColor: backgroundColor, + // الإبقاء على AppBar فقط في شاشة البحث + appBar: PreferredSize( + preferredSize: const Size.fromHeight(kToolbarHeight), + child: Obx(() { + if (controller.isTracking.value) + return const SizedBox + .shrink(); // إخفاء الـ AppBar في وضع التتبع للخريطة الكاملة + return AppBar( + backgroundColor: Colors.transparent, + elevation: 0, + centerTitle: true, + iconTheme: IconThemeData(color: textPrimary), + title: Text( + "مراقبة الرحلات", + style: TextStyle( + color: textPrimary, + fontWeight: FontWeight.bold, + fontSize: 18, + ), + ), + ); + }), + ), + body: Obx(() { + if (!controller.isTracking.value) { + return _buildSearchForm(context, controller); + } + return _buildMapTrackingView(context, controller); + }), + ); + } + + // --------------------------------------------------------------------------- + // واجهة البحث (Search View) + // --------------------------------------------------------------------------- + Widget _buildSearchForm( + BuildContext context, RideMonitorController controller) { + return Center( + child: SingleChildScrollView( + physics: const BouncingScrollPhysics(), + child: Padding( + padding: const EdgeInsets.symmetric(horizontal: 24.0), + child: Container( + padding: const EdgeInsets.all(32.0), + decoration: BoxDecoration( + color: Colors.white, + borderRadius: BorderRadius.circular(30), + boxShadow: [ + BoxShadow( + color: primaryColor.withOpacity(0.08), + blurRadius: 24, + offset: const Offset(0, 10), + ) + ], + ), + child: Column( + mainAxisSize: MainAxisSize.min, + children: [ + Container( + padding: const EdgeInsets.all(20), + decoration: BoxDecoration( + color: primaryColor.withOpacity(0.1), + shape: BoxShape.circle, + ), + child: + Icon(Icons.radar_rounded, size: 60, color: primaryColor), + ), + const SizedBox(height: 24), + Text( + "تتبع رحلة نشطة", + style: TextStyle( + color: textPrimary, + fontSize: 22, + fontWeight: FontWeight.bold, + ), + ), + const SizedBox(height: 8), + Text( + "أدخل رقم هاتف السائق أو الراكب للبدء", + style: TextStyle( + color: textSecondary, + fontSize: 14, + ), + textAlign: TextAlign.center, + ), + const SizedBox(height: 32), + Container( + decoration: BoxDecoration( + color: backgroundColor, + borderRadius: BorderRadius.circular(16), + border: Border.all(color: Colors.white, width: 2), + ), + child: TextField( + controller: controller.phoneInputController, + keyboardType: TextInputType.phone, + textDirection: TextDirection.ltr, + style: TextStyle( + color: textPrimary, + fontSize: 16, + fontWeight: FontWeight.w600, + ), + decoration: InputDecoration( + hintText: "مثال: 0992952235...", + hintStyle: TextStyle(color: textSecondary), + border: InputBorder.none, + contentPadding: const EdgeInsets.symmetric( + vertical: 18, horizontal: 20), + prefixIcon: + Icon(Icons.phone_rounded, color: primaryColor), + ), + ), + ), + const SizedBox(height: 32), + SizedBox( + width: double.infinity, + height: 56, + child: ElevatedButton( + onPressed: controller.startSearch, + style: ElevatedButton.styleFrom( + backgroundColor: primaryColor, + elevation: 0, + shape: RoundedRectangleBorder( + borderRadius: BorderRadius.circular(16), + ), + ), + child: const Text( + "بدء المراقبة", + style: TextStyle( + color: Colors.white, + fontSize: 16, + fontWeight: FontWeight.bold, + ), + ), + ), + ), + ], + ), + ), + ), + ), + ); + } + + // --------------------------------------------------------------------------- + // واجهة الخريطة (Map View) + // --------------------------------------------------------------------------- + Widget _buildMapTrackingView( + BuildContext context, RideMonitorController controller) { + return Stack( + children: [ + FlutterMap( + mapController: controller.mapController, + options: MapOptions( + initialCenter: const LatLng(30.0444, 31.2357), + initialZoom: 12.0, + ), + children: [ + TileLayer( + urlTemplate: 'https://tile.openstreetmap.org/{z}/{x}/{y}.png', + userAgentPackageName: 'com.sefer.admin', + ), + + // 1. ROUTE LINE (Polyline) + if (controller.routePolyline.isNotEmpty) + PolylineLayer( + polylines: [ + Polyline( + points: controller.routePolyline.value, + strokeWidth: 6.0, + color: primaryColor.withOpacity(0.9), + borderStrokeWidth: 2.0, + borderColor: primaryColor.withOpacity(0.3), + strokeCap: StrokeCap.round, + strokeJoin: StrokeJoin.round, + ), + ], + ), + + // 2. START & END MARKERS + MarkerLayer( + markers: [ + // Start Point (Green Dot) + if (controller.startPoint.value != null) + Marker( + point: controller.startPoint.value!, + width: 30, + height: 30, + child: _buildPointMarker(const Color(0xFF10B981)), + ), + + // End Point (Red Dot) + if (controller.endPoint.value != null) + Marker( + point: controller.endPoint.value!, + width: 30, + height: 30, + child: _buildPointMarker(const Color(0xFFEF4444)), + ), + + // Driver Car Marker + if (controller.driverLocation.value != null) + Marker( + point: LatLng( + controller.driverLocation.value!.latitude, + controller.driverLocation.value!.longitude, + ), + width: 80, + height: 80, + child: Transform.rotate( + angle: (controller.driverLocation.value!.heading * + (3.14159 / 180)), + child: Column( + mainAxisSize: MainAxisSize.min, + children: [ + Container( + padding: const EdgeInsets.all(8), + decoration: BoxDecoration( + color: Colors.white, + shape: BoxShape.circle, + boxShadow: [ + BoxShadow( + color: Colors.black.withOpacity(0.2), + blurRadius: 10, + spreadRadius: 2, + ) + ], + ), + child: Icon( + Icons.directions_car_rounded, + color: primaryColor, + size: 28, + ), + ), + const SizedBox(height: 4), + Container( + padding: const EdgeInsets.symmetric( + horizontal: 6, vertical: 2), + decoration: BoxDecoration( + color: textPrimary, + borderRadius: BorderRadius.circular(6), + ), + child: Text( + "${controller.driverLocation.value!.speed.toInt()} كم", + style: const TextStyle( + color: Colors.white, + fontSize: 10, + fontWeight: FontWeight.bold, + ), + textDirection: TextDirection.rtl, + ), + ) + ], + ), + ), + ), + ], + ), + ], + ), + + // زر التراجع (إيقاف التتبع) أعلى الشاشة + Positioned( + top: MediaQuery.of(context).padding.top + 10, + right: 20, // أو left حسب لغة التطبيق + child: Container( + decoration: BoxDecoration( + color: Colors.white, + shape: BoxShape.circle, + boxShadow: [ + BoxShadow( + color: Colors.black.withOpacity(0.1), + blurRadius: 10, + offset: const Offset(0, 4), + ) + ], + ), + child: IconButton( + icon: Icon(Icons.close_rounded, color: textPrimary, size: 24), + onPressed: controller.stopTracking, + tooltip: "إيقاف المراقبة", + ), + ), + ), + + // LOADING OVERLAY (Smooth Frosted Glass like) + if (controller.isLoading.value && + controller.driverLocation.value == null && + controller.startPoint.value == null) + Container( + color: Colors.white.withOpacity(0.8), + child: Center( + child: Column( + mainAxisSize: MainAxisSize.min, + children: [ + CircularProgressIndicator( + color: primaryColor, strokeWidth: 3), + const SizedBox(height: 16), + Text( + "جاري تحديد الموقع...", + style: TextStyle( + color: textPrimary, + fontWeight: FontWeight.bold, + fontSize: 16, + ), + ) + ], + ), + ), + ), + + // ERROR OVERLAY + if (controller.hasError.value) + Center( + child: Container( + margin: const EdgeInsets.all(24), + padding: const EdgeInsets.all(24), + decoration: BoxDecoration( + color: Colors.white, + borderRadius: BorderRadius.circular(24), + boxShadow: [ + BoxShadow( + color: Colors.black.withOpacity(0.1), + blurRadius: 20, + offset: const Offset(0, 10), + ) + ], + ), + child: Column( + mainAxisSize: MainAxisSize.min, + children: [ + Container( + padding: const EdgeInsets.all(16), + decoration: BoxDecoration( + color: Colors.red.withOpacity(0.1), + shape: BoxShape.circle, + ), + child: const Icon(Icons.error_outline_rounded, + color: Colors.red, size: 40), + ), + const SizedBox(height: 16), + Text( + "حدث خطأ", + style: TextStyle( + color: textPrimary, + fontSize: 18, + fontWeight: FontWeight.bold, + ), + ), + const SizedBox(height: 8), + Text( + controller.errorMessage.value, + textAlign: TextAlign.center, + style: TextStyle(color: textSecondary, height: 1.5), + ), + const SizedBox(height: 24), + SizedBox( + width: double.infinity, + child: ElevatedButton( + onPressed: controller.stopTracking, + style: ElevatedButton.styleFrom( + backgroundColor: backgroundColor, + foregroundColor: textPrimary, + elevation: 0, + shape: RoundedRectangleBorder( + borderRadius: BorderRadius.circular(12), + ), + padding: const EdgeInsets.symmetric(vertical: 14), + ), + child: const Text("رجوع للبحث", + style: TextStyle(fontWeight: FontWeight.bold)), + ), + ) + ], + ), + ), + ), + + // INFO CARD (Bottom Floating Card) + if (!controller.hasError.value && !controller.isLoading.value) + Positioned( + bottom: 30, + left: 20, + right: 20, + child: Container( + decoration: BoxDecoration( + color: Colors.white, + borderRadius: BorderRadius.circular(24), + boxShadow: [ + BoxShadow( + color: Colors.black.withOpacity(0.08), + blurRadius: 24, + offset: const Offset(0, 10), + ) + ], + ), + child: Padding( + padding: const EdgeInsets.all(20.0), + child: Column( + mainAxisSize: MainAxisSize.min, + children: [ + Row( + children: [ + Container( + width: 50, + height: 50, + decoration: BoxDecoration( + color: primaryColor.withOpacity(0.1), + borderRadius: BorderRadius.circular(15), + ), + child: Icon(Icons.person_rounded, + color: primaryColor, size: 28), + ), + const SizedBox(width: 16), + Expanded( + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Text( + controller.driverName.value, + style: TextStyle( + color: textPrimary, + fontSize: 18, + fontWeight: FontWeight.bold, + ), + overflow: TextOverflow.ellipsis, + ), + const SizedBox(height: 4), + Row( + children: [ + Container( + width: 8, + height: 8, + decoration: BoxDecoration( + shape: BoxShape.circle, + color: controller.rideStatus.value + .toLowerCase() == + 'begin' + ? const Color(0xFF10B981) + : const Color(0xFFF59E0B), + ), + ), + const SizedBox(width: 6), + Text( + controller.rideStatus.value, + style: TextStyle( + color: textSecondary, + fontSize: 13, + fontWeight: FontWeight.w600, + ), + ), + ], + ), + ], + ), + ), + ], + ), + const Padding( + padding: EdgeInsets.symmetric(vertical: 16), + child: Divider(height: 1, thickness: 1), + ), + if (controller.driverLocation.value != null) + Row( + mainAxisAlignment: MainAxisAlignment.spaceAround, + children: [ + _buildModernInfoBadge( + Icons.speed_rounded, + "${controller.driverLocation.value!.speed.toStringAsFixed(1)} كم/س", + const Color(0xFF3B82F6), + ), + Container( + width: 1, + height: 30, + color: Colors.grey.withOpacity(0.2)), + _buildModernInfoBadge( + Icons.access_time_rounded, + controller.driverLocation.value!.updatedAt + .split(' ') + .last, + const Color(0xFF8B5CF6), + ), + ], + ) + else + Row( + mainAxisAlignment: MainAxisAlignment.center, + children: [ + SizedBox( + width: 16, + height: 16, + child: CircularProgressIndicator( + color: primaryColor, strokeWidth: 2), + ), + const SizedBox(width: 10), + Text( + "جاري الاتصال بالسائق...", + style: TextStyle( + color: primaryColor, + fontWeight: FontWeight.w600, + fontSize: 13, + ), + ), + ], + ), + ], + ), + ), + ), + ), + ], + ); + } + + // --- Helper Widgets --- + + Widget _buildPointMarker(Color color) { + return Container( + decoration: BoxDecoration( + color: color.withOpacity(0.3), + shape: BoxShape.circle, + ), + child: Center( + child: Container( + width: 12, + height: 12, + decoration: BoxDecoration( + color: color, + shape: BoxShape.circle, + border: Border.all(color: Colors.white, width: 2), + boxShadow: [ + BoxShadow( + color: color.withOpacity(0.5), + blurRadius: 6, + spreadRadius: 1, + ) + ], + ), + ), + ), + ); + } + + Widget _buildModernInfoBadge(IconData icon, String text, Color iconColor) { + return Row( + children: [ + Container( + padding: const EdgeInsets.all(6), + decoration: BoxDecoration( + color: iconColor.withOpacity(0.1), + borderRadius: BorderRadius.circular(8), + ), + child: Icon(icon, size: 16, color: iconColor), + ), + const SizedBox(width: 8), + Text( + text, + style: TextStyle( + color: textPrimary, + fontSize: 14, + fontWeight: FontWeight.bold, + ), + textDirection: TextDirection.ltr, // للحفاظ على اتجاه الأرقام + ), + ], + ); + } +} diff --git a/siro_admin/lib/views/admin/employee/employee_page.dart b/siro_admin/lib/views/admin/employee/employee_page.dart new file mode 100644 index 0000000..4f9f107 --- /dev/null +++ b/siro_admin/lib/views/admin/employee/employee_page.dart @@ -0,0 +1,564 @@ +import 'package:flutter/material.dart'; +import 'package:get/get.dart'; +import 'package:siro_admin/constant/links.dart'; +import 'package:siro_admin/controller/employee_controller/employee_controller.dart'; +import 'package:siro_admin/controller/functions/upload_image copy.dart'; // تأكد من مسار الملف الصحيح +import 'package:url_launcher/url_launcher.dart'; + +class EmployeePage extends StatelessWidget { + const EmployeePage({super.key}); + + @override + Widget build(BuildContext context) { + // حقن الكنترولر + Get.put(EmployeeController()); + + // ألوان الثيم + const Color bgColor = Color(0xFF0A0E27); + const Color cardColor = Color(0xFF1A1F3A); + const Color primaryAccent = Color(0xFF6366F1); + + return Scaffold( + backgroundColor: bgColor, + body: GetBuilder( + builder: (controller) { + return CustomScrollView( + physics: const BouncingScrollPhysics(), + slivers: [ + // 1. App Bar + SliverAppBar( + expandedHeight: 100, + floating: true, + pinned: true, + backgroundColor: bgColor, + elevation: 0, + flexibleSpace: FlexibleSpaceBar( + titlePadding: const EdgeInsets.only(bottom: 16), + title: Row( + mainAxisSize: MainAxisSize.min, + children: [ + Container( + padding: const EdgeInsets.all(8), + decoration: BoxDecoration( + color: primaryAccent.withOpacity(0.2), + borderRadius: BorderRadius.circular(8), + ), + child: const Icon(Icons.badge_rounded, + color: Colors.white, size: 18), + ), + const SizedBox(width: 10), + const Text( + 'الموظفون', + style: TextStyle( + fontWeight: FontWeight.bold, + fontSize: 16, + color: Colors.white, + fontFamily: 'Segoe UI', + ), + ), + ], + ), + centerTitle: true, + background: Container( + decoration: BoxDecoration( + gradient: LinearGradient( + begin: Alignment.topCenter, + end: Alignment.bottomCenter, + colors: [ + primaryAccent.withOpacity(0.15), + bgColor, + ], + ), + ), + ), + ), + ), + + // 2. قائمة الموظفين + if (controller.employee.isEmpty) + const SliverFillRemaining( + child: Center( + child: Column( + mainAxisSize: MainAxisSize.min, + children: [ + Icon(Icons.people_outline, + size: 60, color: Colors.white24), + SizedBox(height: 16), + Text("لا يوجد موظفين حالياً", + style: TextStyle(color: Colors.white54)), + ], + ), + ), + ) + else + SliverPadding( + padding: const EdgeInsets.all(16), + sliver: SliverList( + delegate: SliverChildBuilderDelegate( + (context, index) { + final employee = controller.employee[index]; + return _EmployeeCard( + employee: employee, + index: index, + cardColor: cardColor, + primaryAccent: primaryAccent, + ); + }, + childCount: controller.employee.length, + ), + ), + ), + ], + ); + }, + ), + floatingActionButton: FloatingActionButton( + onPressed: () { + final controller = Get.find(); + controller.id = controller.generateRandomId(8); + Get.to(() => _EmployeeFormScreen(controller: controller)); + }, + backgroundColor: primaryAccent, + child: const Icon(Icons.person_add_rounded, color: Colors.white), + ), + ); + } +} + +// === بطاقة الموظف (تصميم جديد ومحسن) === +class _EmployeeCard extends StatelessWidget { + final Map employee; + final int index; + final Color cardColor; + final Color primaryAccent; + + const _EmployeeCard({ + required this.employee, + required this.index, + required this.cardColor, + required this.primaryAccent, + }); + + @override + Widget build(BuildContext context) { + bool isExcellent = employee['status'].toString().contains('ممتاز'); + Color statusColor = isExcellent ? const Color(0xFF10B981) : Colors.amber; + + return Container( + margin: const EdgeInsets.only(bottom: 16), + decoration: BoxDecoration( + color: cardColor, + borderRadius: BorderRadius.circular(16), + border: Border.all(color: Colors.white.withOpacity(0.05)), + boxShadow: [ + BoxShadow( + color: Colors.black.withOpacity(0.2), + blurRadius: 10, + offset: const Offset(0, 4), + ), + ], + ), + child: Material( + color: Colors.transparent, + child: InkWell( + onTap: () => Get.to(() => EmployeeDetails(index: index)), + borderRadius: BorderRadius.circular(16), + child: Padding( + padding: const EdgeInsets.all(20), + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + // الصف العلوي: الحالة + أيقونة + Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + Container( + padding: const EdgeInsets.all(8), + decoration: BoxDecoration( + color: Colors.white.withOpacity(0.05), + shape: BoxShape.circle, + ), + child: Icon(Icons.person, + color: Colors.white.withOpacity(0.7), size: 20), + ), + Flexible( + child: Container( + padding: const EdgeInsets.symmetric( + horizontal: 10, vertical: 6), + decoration: BoxDecoration( + color: statusColor.withOpacity(0.1), + borderRadius: BorderRadius.circular(8), + border: + Border.all(color: statusColor.withOpacity(0.3)), + ), + child: Text( + employee['status'] ?? 'Unknown', + style: TextStyle( + color: statusColor, + fontSize: 12, + fontWeight: FontWeight.bold, + height: 1.5, + ), + textAlign: TextAlign.center, + ), + ), + ), + ], + ), + + const SizedBox(height: 12), + + // الاسم في سطر كامل ومميز + Text( + employee['name'] ?? 'Unknown', + style: const TextStyle( + color: Colors.white, + fontSize: 18, + fontWeight: FontWeight.bold, + height: 1.3, + ), + ), + + const Padding( + padding: EdgeInsets.symmetric(vertical: 12), + child: Divider(height: 1, color: Colors.white10), + ), + + // تفاصيل التعليم والهاتف والموقع (مع دعم تعدد الأسطر) + Row( + crossAxisAlignment: CrossAxisAlignment.center, + children: [ + Expanded( + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + _buildInfoRow(Icons.phone_iphone_rounded, + employee['phone'] ?? '', Colors.white54), + const SizedBox(height: 12), // مسافة أكبر بين العناصر + _buildInfoRow( + Icons.school_outlined, + employee['education'] ?? 'غير محدد', + primaryAccent), + const SizedBox(height: 12), // مسافة أكبر + _buildInfoRow(Icons.location_on_outlined, + employee['site'] ?? 'غير محدد', Colors.blueGrey), + ], + ), + ), + + // زر الاتصال الجانبي + const SizedBox(width: 16), + Material( + color: Colors.green.withOpacity(0.1), + borderRadius: BorderRadius.circular(12), + child: InkWell( + onTap: () => + _makePhoneCall(employee['phone'].toString()), + borderRadius: BorderRadius.circular(12), + child: Container( + padding: const EdgeInsets.all(14), + child: const Icon(Icons.call, + color: Colors.green, size: 24), + ), + ), + ), + ], + ), + ], + ), + ), + ), + ), + ); + } + + Widget _buildInfoRow(IconData icon, String text, Color iconColor) { + return Row( + crossAxisAlignment: + CrossAxisAlignment.start, // محاذاة الأيقونة مع بداية النص + children: [ + Padding( + padding: const EdgeInsets.only(top: 2), // ضبط بسيط لموقع الأيقونة + child: Icon(icon, size: 16, color: iconColor.withOpacity(0.8)), + ), + const SizedBox(width: 10), + Expanded( + child: Text( + text, + style: TextStyle( + color: Colors.white.withOpacity(0.7), + fontSize: 13, + height: 1.5, // تباعد الأسطر لسهولة القراءة + ), + // تم إزالة maxLines و overflow للسماح بالنص بالنزول لأسطر متعددة + ), + ), + ], + ); + } + + Future _makePhoneCall(String phoneNumber) async { + final Uri launchUri = Uri(scheme: 'tel', path: phoneNumber); + if (await canLaunchUrl(launchUri)) { + await launchUrl(launchUri); + } + } +} + +// === شاشة إضافة موظف === +class _EmployeeFormScreen extends StatelessWidget { + final EmployeeController controller; + const _EmployeeFormScreen({required this.controller}); + + @override + Widget build(BuildContext context) { + const Color bgColor = Color(0xFF0A0E27); + const Color inputColor = Color(0xFF1A1F3A); + + return Scaffold( + backgroundColor: bgColor, + appBar: AppBar( + title: const Text("إضافة موظف جديد", + style: TextStyle(color: Colors.white)), + backgroundColor: bgColor, + elevation: 0, + leading: IconButton( + icon: const Icon(Icons.arrow_back, color: Colors.white), + onPressed: () => Get.back(), + ), + ), + body: SingleChildScrollView( + padding: const EdgeInsets.all(20), + child: Form( + key: controller.formKey, + child: Column( + children: [ + Row( + children: [ + Expanded( + child: _UploadButton( + title: "الهوية (أمام)", + icon: Icons.credit_card, + onPressed: () async { + await ImageController().choosImage(AppLink.uploadEgypt, + 'idFrontEmployee', controller.id); + }, + ), + ), + const SizedBox(width: 16), + Expanded( + child: _UploadButton( + title: "الهوية (خلف)", + icon: Icons.credit_card_outlined, + onPressed: () async { + await ImageController().choosImage(AppLink.uploadEgypt, + 'idbackEmployee', controller.id); + }, + ), + ), + ], + ), + const SizedBox(height: 24), + _buildModernTextField( + controller.name, "الاسم الكامل", Icons.person, inputColor), + const SizedBox(height: 16), + _buildModernTextField( + controller.phone, "رقم الهاتف", Icons.phone, inputColor, + type: TextInputType.phone), + const SizedBox(height: 16), + _buildModernTextField(controller.education, "التعليم / الملاحظات", + Icons.school, inputColor), + const SizedBox(height: 16), + _buildModernTextField(controller.site, "الموقع / العنوان", + Icons.location_on, inputColor), + const SizedBox(height: 16), + _buildModernTextField(controller.status, "الحالة (مثال: ممتاز)", + Icons.star, inputColor), + const SizedBox(height: 32), + SizedBox( + width: double.infinity, + child: ElevatedButton( + onPressed: () async { + if (controller.formKey.currentState!.validate()) { + await controller.addEmployee(); + Get.back(); + } + }, + style: ElevatedButton.styleFrom( + backgroundColor: const Color(0xFF6366F1), + padding: const EdgeInsets.symmetric(vertical: 16), + shape: RoundedRectangleBorder( + borderRadius: BorderRadius.circular(12)), + ), + child: const Text("حفظ البيانات", + style: TextStyle( + color: Colors.white, + fontSize: 16, + fontWeight: FontWeight.bold)), + ), + ), + ], + ), + ), + ), + ); + } + + Widget _buildModernTextField(TextEditingController controller, String hint, + IconData icon, Color fillColor, + {TextInputType type = TextInputType.text}) { + return Container( + decoration: BoxDecoration( + color: fillColor, + borderRadius: BorderRadius.circular(12), + border: Border.all(color: Colors.white.withOpacity(0.1)), + ), + child: TextFormField( + controller: controller, + keyboardType: type, + style: const TextStyle(color: Colors.white), + maxLines: null, // السماح بتعدد الأسطر عند الإدخال أيضاً + decoration: InputDecoration( + labelText: hint, + labelStyle: TextStyle(color: Colors.white.withOpacity(0.5)), + prefixIcon: Icon(icon, color: Colors.white38, size: 20), + border: InputBorder.none, + contentPadding: + const EdgeInsets.symmetric(horizontal: 16, vertical: 14), + ), + validator: (value) => + value == null || value.isEmpty ? 'حقل مطلوب' : null, + ), + ); + } +} + +class _UploadButton extends StatelessWidget { + final String title; + final IconData icon; + final VoidCallback onPressed; + + const _UploadButton( + {required this.title, required this.icon, required this.onPressed}); + + @override + Widget build(BuildContext context) { + return InkWell( + onTap: onPressed, + borderRadius: BorderRadius.circular(12), + child: Container( + padding: const EdgeInsets.symmetric(vertical: 20), + decoration: BoxDecoration( + color: const Color(0xFF1A1F3A), + borderRadius: BorderRadius.circular(12), + border: Border.all( + color: const Color(0xFF6366F1).withOpacity(0.3), + style: BorderStyle.solid), + ), + child: Column( + children: [ + Icon(icon, color: const Color(0xFF6366F1), size: 30), + const SizedBox(height: 8), + Text(title, + style: const TextStyle(color: Colors.white70, fontSize: 12)), + const SizedBox(height: 4), + const Text("اضغط للرفع", + style: TextStyle(color: Colors.white38, fontSize: 10)), + ], + ), + ), + ); + } +} + +// === شاشة التفاصيل === +class EmployeeDetails extends StatelessWidget { + final int index; + const EmployeeDetails({super.key, required this.index}); + + @override + Widget build(BuildContext context) { + const Color bgColor = Color(0xFF0A0E27); + + return Scaffold( + backgroundColor: bgColor, + appBar: AppBar( + title: + const Text('تفاصيل الموظف', style: TextStyle(color: Colors.white)), + backgroundColor: bgColor, + iconTheme: const IconThemeData(color: Colors.white), + elevation: 0, + ), + body: GetBuilder( + builder: (controller) { + final employeeId = controller.employee[index]['id']; + return SingleChildScrollView( + padding: const EdgeInsets.all(20), + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + const Text("الهوية الأمامية", + style: TextStyle( + color: Colors.white, + fontSize: 16, + fontWeight: FontWeight.bold)), + const SizedBox(height: 10), + _buildImageViewer( + '${AppLink.server}/card_image/idFrontEmployee-$employeeId.jpg', + ), + const SizedBox(height: 30), + const Text("الهوية الخلفية", + style: TextStyle( + color: Colors.white, + fontSize: 16, + fontWeight: FontWeight.bold)), + const SizedBox(height: 10), + _buildImageViewer( + '${AppLink.server}/card_image/idbackEmployee-$employeeId.jpg', + ), + ], + ), + ); + }, + ), + ); + } + + Widget _buildImageViewer(String url) { + return Container( + width: double.infinity, + height: 220, + decoration: BoxDecoration( + color: const Color(0xFF1A1F3A), + borderRadius: BorderRadius.circular(16), + border: Border.all(color: Colors.white.withOpacity(0.1)), + ), + child: ClipRRect( + borderRadius: BorderRadius.circular(16), + child: Image.network( + url, + fit: BoxFit.cover, + errorBuilder: (context, error, stackTrace) { + return const Center( + child: Column( + mainAxisSize: MainAxisSize.min, + children: [ + Icon(Icons.broken_image_rounded, + color: Colors.white24, size: 50), + SizedBox(height: 8), + Text("فشل تحميل الصورة", + style: TextStyle(color: Colors.white24)), + ], + ), + ); + }, + loadingBuilder: (context, child, loadingProgress) { + if (loadingProgress == null) return child; + return const Center( + child: CircularProgressIndicator(color: Color(0xFF6366F1))); + }, + ), + ), + ); + } +} diff --git a/siro_admin/lib/views/admin/enceypt/driver_fingerprint_migration.dart b/siro_admin/lib/views/admin/enceypt/driver_fingerprint_migration.dart new file mode 100644 index 0000000..d7fa487 --- /dev/null +++ b/siro_admin/lib/views/admin/enceypt/driver_fingerprint_migration.dart @@ -0,0 +1,266 @@ +// ═══════════════════════════════════════════════════════════════ +// driver_fingerprint_migration.dart +// ─────────────────────────────────────────────────────────────── +// المنطق ببساطة: +// 1. خذ البصمة كما هي من DB +// 2. split('_') → احذف آخر جزء (OS version) +// 3. join('_') → encrypt → رفع +// +// مثال: +// "abc123_SamsungA51_13" → "abc123_SamsungA51" → encrypt +// "TECNO_LH7n-GL_14" → "TECNO_LH7n-GL" → encrypt +// "unknown_2412DPC0AG_15" → "unknown_2412DPC0AG" → encrypt +// ═══════════════════════════════════════════════════════════════ + +import 'package:flutter/material.dart'; + +import '../../../constant/links.dart'; +import '../../../controller/functions/crud.dart'; +import '../../../controller/functions/encrypt_decrypt.dart'; +import '../../../print.dart'; + +class DriverFingerprintMigrationTool extends StatefulWidget { + const DriverFingerprintMigrationTool({super.key}); + + @override + State createState() => + _DriverFingerprintMigrationToolState(); +} + +class _DriverFingerprintMigrationToolState + extends State { + bool _isRunning = false; + bool _isDone = false; + int _total = 0; + int _processed = 0; + int _updated = 0; + int _failed = 0; + String _currentLog = ''; + + static const int _batchSize = 50; + + // ───────────────────────────────────────────────────────────── + // المنطق الأساسي — حذف آخر جزء بعد "_" + // ───────────────────────────────────────────────────────────── + String _removeLastSegment(String raw) { + final parts = raw.split('_'); + if (parts.length <= 1) return raw; // جزء واحد — ما في شيء نحذفه + parts.removeLast(); + return parts.join('_'); + } + + Future _startMigration() async { + setState(() { + _isRunning = true; + _isDone = false; + _processed = 0; + _updated = 0; + _failed = 0; + _currentLog = 'جارٍ جلب بصمات السائقين...'; + }); + + try { + final records = await _fetchAll(); + if (records == null) { + _log('❌ فشل في جلب البيانات'); + setState(() => _isRunning = false); + return; + } + + _total = records.length; + _log('✅ تم جلب $_total بصمة — بدء المعالجة...'); + + for (int i = 0; i < records.length; i += _batchSize) { + final batch = records.skip(i).take(_batchSize).toList(); + _log('⚙️ معالجة ${i + 1} → ${i + batch.length} من $_total'); + await Future.wait(batch.map(_processSingle)); + if (i + _batchSize < records.length) { + await Future.delayed(const Duration(milliseconds: 300)); + } + } + + _log('🎉 اكتمل!\nمحدَّث: $_updated | فاشل: $_failed'); + setState(() { + _isDone = true; + _isRunning = false; + }); + } catch (e) { + _log('❌ خطأ: $e'); + setState(() => _isRunning = false); + } + } + + Future>?> _fetchAll() async { + try { + final response = await CRUD().post( + link: AppLink.getAllDriverFingerprints, + payload: {'admin_key': 'iuyweiruinakjbfkajkjlkmalkcxnlahd'}, + ); + if (response == 'failure' || response == null) return null; + + final data = response['data']; + if (data is! List) return null; + + return List>.from(data); + } catch (e) { + Log.print('fetchAll error: $e'); + return null; + } + } + + Future _processSingle(Map record) async { + final captainId = record['captain_id']?.toString() ?? ''; + final rawFp = record['fingerPrint']?.toString() ?? ''; + + if (captainId.isEmpty || rawFp.isEmpty) { + setState(() { + _failed++; + _processed++; + }); + return; + } + + try { + // ── حذف آخر جزء (OS version) ───────────────────────────── + final String newRaw = _removeLastSegment(rawFp); + final String encrypted = EncryptionHelper.instance.encryptData(newRaw); + + Log.print('🔄 [$captainId] "$rawFp" → "$newRaw" → encrypted'); + + // ── رفع للسيرفر ────────────────────────────────────────── + final res = await CRUD().post( + link: AppLink.updateDriverFingerprintAdmin, + payload: { + 'captain_id': captainId, + 'fingerprint': encrypted, + 'admin_key': 'iuyweiruinakjbfkajkjlkmalkcxnlahd', + }, + ); + + if (res != 'failure' && res?['status'] == 'success') { + setState(() { + _updated++; + _processed++; + }); + } else { + setState(() { + _failed++; + _processed++; + }); + } + } catch (e) { + Log.print('❌ [$captainId]: $e'); + setState(() { + _failed++; + _processed++; + }); + } + } + + void _log(String msg) { + Log.print(msg); + setState(() => _currentLog = msg); + } + + @override + Widget build(BuildContext context) { + return Scaffold( + appBar: AppBar(title: const Text('Driver FP Migration')), + body: Padding( + padding: const EdgeInsets.all(24), + child: Column(crossAxisAlignment: CrossAxisAlignment.start, children: [ + Container( + padding: const EdgeInsets.all(16), + decoration: BoxDecoration( + color: Colors.orange.shade50, + borderRadius: BorderRadius.circular(12), + border: Border.all(color: Colors.orange.shade200), + ), + child: const Text( + '⚠️ تُستخدم مرة واحدة فقط\n\n' + '"abc123_Samsung_13" → "abc123_Samsung" → encrypt\n' + '"TECNO_LH7n_14" → "TECNO_LH7n" → encrypt', + style: + TextStyle(fontSize: 13, height: 1.7, fontFamily: 'monospace'), + ), + ), + const SizedBox(height: 24), + if (_total > 0) ...[ + Text('التقدم: $_processed / $_total', + style: const TextStyle(fontWeight: FontWeight.bold)), + const SizedBox(height: 8), + LinearProgressIndicator( + value: _total > 0 ? _processed / _total : 0, + backgroundColor: Colors.grey.shade200, + color: _isDone ? Colors.green : Colors.blue, + minHeight: 8, + ), + const SizedBox(height: 16), + ], + if (_processed > 0) + Row(children: [ + _chip('محدَّث', _updated, Colors.green), + const SizedBox(width: 8), + _chip('فاشل', _failed, Colors.red), + ]), + const SizedBox(height: 16), + if (_currentLog.isNotEmpty) + Container( + width: double.infinity, + padding: const EdgeInsets.all(12), + decoration: BoxDecoration( + color: Colors.grey.shade100, + borderRadius: BorderRadius.circular(8), + ), + child: Text(_currentLog, + style: + const TextStyle(fontFamily: 'monospace', fontSize: 12)), + ), + const Spacer(), + SizedBox( + width: double.infinity, + height: 52, + child: ElevatedButton( + onPressed: (_isRunning || _isDone) ? null : _startMigration, + style: ElevatedButton.styleFrom( + backgroundColor: _isDone ? Colors.green : Colors.blue, + shape: RoundedRectangleBorder( + borderRadius: BorderRadius.circular(12)), + ), + child: _isRunning + ? const Row( + mainAxisAlignment: MainAxisAlignment.center, + children: [ + SizedBox( + width: 20, + height: 20, + child: CircularProgressIndicator( + color: Colors.white, strokeWidth: 2)), + SizedBox(width: 12), + Text('جارٍ الترحيل...', + style: + TextStyle(color: Colors.white, fontSize: 16)), + ], + ) + : Text( + _isDone ? '✅ اكتمل الترحيل' : 'بدء ترحيل بصمات السائقين', + style: const TextStyle(color: Colors.white, fontSize: 16), + ), + ), + ), + ]), + ), + ); + } + + Widget _chip(String label, int value, Color color) => Container( + padding: const EdgeInsets.symmetric(horizontal: 12, vertical: 6), + decoration: BoxDecoration( + color: color.withOpacity(0.1), + borderRadius: BorderRadius.circular(20), + border: Border.all(color: color.withOpacity(0.3)), + ), + child: Text('$label: $value', + style: TextStyle(color: color, fontWeight: FontWeight.bold)), + ); +} diff --git a/siro_admin/lib/views/admin/enceypt/encrypt.dart b/siro_admin/lib/views/admin/enceypt/encrypt.dart new file mode 100644 index 0000000..3ab4aa4 --- /dev/null +++ b/siro_admin/lib/views/admin/enceypt/encrypt.dart @@ -0,0 +1,855 @@ +import 'package:flutter/material.dart'; +import 'package:flutter/services.dart'; +import 'package:siro_admin/constant/links.dart'; +import 'package:siro_admin/controller/functions/crud.dart'; +import 'package:siro_admin/main.dart'; + +import '../../../constant/box_name.dart'; + +// ─── Custom Colors ──────────────────────────────────────────────────────────── +class _AppColors { + static const bg = Color(0xFF0A0D14); + static const surface = Color(0xFF111622); + static const card = Color(0xFF161D2E); + static const border = Color(0xFF1F2D4A); + static const accent = Color(0xFF00E5FF); + static const accentDim = Color(0xFF0097A7); + static const accentGlow = Color(0x2200E5FF); + static const accentDecrypt = Color(0xFF7C4DFF); + static const accentDecryptDim = Color(0xFF512DA8); + static const accentDecryptGlow = Color(0x227C4DFF); + static const textPrimary = Color(0xFFE8F0FE); + static const textSec = Color(0xFF7A8BAA); + static const success = Color(0xFF00E676); + static const error = Color(0xFFFF5252); +} + +class EncryptToolPage extends StatefulWidget { + final String adminToken; + + const EncryptToolPage({Key? key, required this.adminToken}) : super(key: key); + + @override + State createState() => _EncryptToolPageState(); +} + +class _EncryptToolPageState extends State + with SingleTickerProviderStateMixin { + final TextEditingController _inputController = TextEditingController(); + final TextEditingController _outputController = TextEditingController(); + + String _output = ''; + bool _loading = false; + String? _error; + + bool _isInputCopied = false; + bool _isOutputCopied = false; + + late final AnimationController _glowController; + late final Animation _glowAnimation; + + @override + void initState() { + super.initState(); + _glowController = AnimationController( + vsync: this, + duration: const Duration(seconds: 3), + )..repeat(reverse: true); + _glowAnimation = Tween(begin: 0.4, end: 1.0).animate( + CurvedAnimation(parent: _glowController, curve: Curves.easeInOut), + ); + } + + @override + void dispose() { + _inputController.dispose(); + _outputController.dispose(); + _glowController.dispose(); + super.dispose(); + } + + // ─── Logic (unchanged) ────────────────────────────────────────────────────── + + Future _callTool(String action) async { + FocusScope.of(context).unfocus(); + + setState(() { + _loading = true; + _error = null; + _output = ''; + _outputController.clear(); + _isInputCopied = false; + _isOutputCopied = false; + }); + + try { + final response = await CRUD().post( + link: '${AppLink.server}/ggg.php', + payload: { + 'action': action, + 'text': _inputController.text, + 'admin_phone': box.read(BoxName.adminPhone) ?? '', + }, + ); + + if (response == 'failure') { + setState(() => _error = 'حدث خطأ في الاتصال بالخادم. حاول مرة أخرى.'); + } else { + if (response['status'] == 'success') { + setState(() { + _output = (response['result'] ?? '').toString(); + _outputController.text = _output; + }); + } else { + setState(() => + _error = response['message']?.toString() ?? 'حدث خطأ غير معروف.'); + } + } + } catch (e) { + setState(() => _error = 'مشكلة في الشبكة: $e'); + } finally { + setState(() => _loading = false); + } + } + + void _showSnackBar(String message, {bool isError = false}) { + ScaffoldMessenger.of(context).clearSnackBars(); + ScaffoldMessenger.of(context).showSnackBar( + SnackBar( + content: Row( + children: [ + Icon(isError ? Icons.error_outline : Icons.check_circle, + color: isError ? _AppColors.error : _AppColors.success), + const SizedBox(width: 12), + Text( + message, + style: const TextStyle( + fontFamily: 'Cairo', + fontWeight: FontWeight.bold, + color: _AppColors.textPrimary, + ), + ), + ], + ), + backgroundColor: + isError ? const Color(0xFF1A0808) : const Color(0xFF081A0F), + behavior: SnackBarBehavior.floating, + shape: RoundedRectangleBorder( + borderRadius: BorderRadius.circular(14), + side: BorderSide( + color: isError ? _AppColors.error : _AppColors.success, + width: 1, + ), + ), + margin: const EdgeInsets.all(16), + duration: const Duration(seconds: 2), + ), + ); + } + + Future _copyText(bool isInput) async { + final textToCopy = isInput ? _inputController.text : _outputController.text; + + if (textToCopy.isEmpty) { + _showSnackBar('لا يوجد نص لنسخه!', isError: true); + return; + } + + await Clipboard.setData(ClipboardData(text: textToCopy)); + + if (isInput) { + setState(() => _isInputCopied = true); + Future.delayed(const Duration(seconds: 2), () { + if (mounted) setState(() => _isInputCopied = false); + }); + } else { + setState(() => _isOutputCopied = true); + Future.delayed(const Duration(seconds: 2), () { + if (mounted) setState(() => _isOutputCopied = false); + }); + } + + _showSnackBar('تم النسخ بنجاح!'); + } + + Future _pasteText(bool isInput) async { + final clipboardData = await Clipboard.getData(Clipboard.kTextPlain); + final textToPaste = clipboardData?.text ?? ''; + + if (textToPaste.isEmpty) { + _showSnackBar('الحافظة فارغة!', isError: true); + return; + } + + setState(() { + if (isInput) { + _inputController.text = textToPaste; + } else { + _output = textToPaste; + _outputController.text = textToPaste; + } + }); + + _showSnackBar('تم اللصق بنجاح!'); + } + + // ─── UI Helpers ───────────────────────────────────────────────────────────── + + Widget _buildActionButtons({ + required bool isInput, + required bool isCopied, + Color accentColor = _AppColors.accent, + }) { + return Row( + mainAxisSize: MainAxisSize.min, + children: [ + _MiniIconButton( + label: 'لصق', + icon: Icons.content_paste_rounded, + color: accentColor, + onTap: () => _pasteText(isInput), + ), + const SizedBox(width: 6), + _MiniIconButton( + label: isCopied ? 'تم!' : 'نسخ', + icon: isCopied ? Icons.check_circle_rounded : Icons.copy_rounded, + color: isCopied ? _AppColors.success : accentColor, + onTap: () => _copyText(isInput), + ), + ], + ); + } + + InputDecoration _buildInputDecoration(String hint) => InputDecoration( + hintText: hint, + hintStyle: const TextStyle(color: _AppColors.textSec, fontSize: 14), + filled: true, + fillColor: const Color(0xFF0C1120), + border: OutlineInputBorder( + borderRadius: BorderRadius.circular(14), + borderSide: BorderSide.none, + ), + enabledBorder: OutlineInputBorder( + borderRadius: BorderRadius.circular(14), + borderSide: const BorderSide(color: _AppColors.border, width: 1), + ), + focusedBorder: OutlineInputBorder( + borderRadius: BorderRadius.circular(14), + borderSide: const BorderSide(color: _AppColors.accent, width: 1.5), + ), + contentPadding: const EdgeInsets.all(16), + ); + + // ─── Build ────────────────────────────────────────────────────────────────── + + @override + Widget build(BuildContext context) { + return Scaffold( + backgroundColor: _AppColors.bg, + body: Stack( + children: [ + // ── Ambient background glow ────────────────────────────────────────── + Positioned( + top: -120, + left: -80, + child: AnimatedBuilder( + animation: _glowAnimation, + builder: (_, __) => Opacity( + opacity: _glowAnimation.value * 0.25, + child: Container( + width: 380, + height: 380, + decoration: const BoxDecoration( + shape: BoxShape.circle, + gradient: RadialGradient( + colors: [Color(0xFF00E5FF), Colors.transparent], + ), + ), + ), + ), + ), + ), + Positioned( + bottom: -100, + right: -60, + child: AnimatedBuilder( + animation: _glowAnimation, + builder: (_, __) => Opacity( + opacity: (1 - _glowAnimation.value) * 0.2, + child: Container( + width: 320, + height: 320, + decoration: const BoxDecoration( + shape: BoxShape.circle, + gradient: RadialGradient( + colors: [Color(0xFF7C4DFF), Colors.transparent], + ), + ), + ), + ), + ), + ), + + // ── Content ────────────────────────────────────────────────────────── + SafeArea( + child: Column( + children: [ + // ── AppBar ───────────────────────────────────────────────────── + Padding( + padding: const EdgeInsets.fromLTRB(8, 8, 16, 0), + child: Row( + children: [ + IconButton( + icon: const Icon(Icons.arrow_back_ios_new_rounded, + color: _AppColors.textSec, size: 20), + onPressed: () => Navigator.pop(context), + ), + const Spacer(), + Row( + children: [ + Container( + width: 8, + height: 8, + decoration: const BoxDecoration( + shape: BoxShape.circle, + color: _AppColors.accent, + boxShadow: [ + BoxShadow( + color: _AppColors.accentGlow, + blurRadius: 8, + spreadRadius: 2, + ), + ], + ), + ), + const SizedBox(width: 10), + const Text( + 'أداة التشفير', + style: TextStyle( + fontSize: 18, + fontWeight: FontWeight.w700, + color: _AppColors.textPrimary, + letterSpacing: 0.5, + ), + ), + ], + ), + const Spacer(), + Container( + padding: const EdgeInsets.symmetric( + horizontal: 12, vertical: 6), + decoration: BoxDecoration( + color: _AppColors.accentGlow, + borderRadius: BorderRadius.circular(20), + border: Border.all( + color: _AppColors.accent.withOpacity(0.3)), + ), + child: const Text( + 'AES-256', + style: TextStyle( + color: _AppColors.accent, + fontSize: 11, + fontWeight: FontWeight.bold, + letterSpacing: 1.5, + ), + ), + ), + ], + ), + ), + + // ── Scrollable body ─────────────────────────────────────────── + Expanded( + child: SingleChildScrollView( + padding: const EdgeInsets.fromLTRB(20, 24, 20, 32), + physics: const BouncingScrollPhysics(), + child: Center( + child: ConstrainedBox( + constraints: const BoxConstraints(maxWidth: 650), + child: Column( + crossAxisAlignment: CrossAxisAlignment.stretch, + children: [ + // ─── Input Card ───────────────────────────────────── + _GlassCard( + borderColor: _AppColors.accent.withOpacity(0.2), + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + // Header + Row( + mainAxisAlignment: + MainAxisAlignment.spaceBetween, + children: [ + Row( + children: [ + Container( + padding: const EdgeInsets.all(8), + decoration: BoxDecoration( + color: _AppColors.accentGlow, + borderRadius: + BorderRadius.circular(10), + ), + child: const Icon( + Icons.text_fields_rounded, + color: _AppColors.accent, + size: 18), + ), + const SizedBox(width: 12), + const Text( + 'النص الأصلي', + style: TextStyle( + color: _AppColors.textPrimary, + fontSize: 15, + fontWeight: FontWeight.w700, + ), + ), + ], + ), + _buildActionButtons( + isInput: true, + isCopied: _isInputCopied, + accentColor: _AppColors.accent, + ), + ], + ), + const SizedBox(height: 16), + + // Input field + TextField( + controller: _inputController, + maxLines: 5, + minLines: 3, + textDirection: TextDirection.ltr, + style: const TextStyle( + color: _AppColors.textPrimary, + fontSize: 15, + height: 1.6, + fontFamily: 'monospace', + ), + onTap: () { + if (_inputController.text.isNotEmpty) { + _inputController.selection = + TextSelection( + baseOffset: 0, + extentOffset: + _inputController.text.length, + ); + } + }, + decoration: _buildInputDecoration( + 'اكتب أو الصق النص هنا...'), + ), + const SizedBox(height: 24), + + // Action buttons row + Row( + children: [ + // Encrypt + Expanded( + child: _ActionButton( + label: 'تشفير', + icon: Icons.lock_rounded, + isLoading: _loading, + onPressed: _loading + ? null + : () => _callTool('encrypt'), + gradient: const LinearGradient( + colors: [ + Color(0xFF00B4D8), + Color(0xFF00E5FF) + ], + begin: Alignment.topLeft, + end: Alignment.bottomRight, + ), + glowColor: _AppColors.accentGlow, + borderColor: _AppColors.accent, + ), + ), + const SizedBox(width: 14), + // Decrypt + Expanded( + child: _ActionButton( + label: 'فك التشفير', + icon: Icons.lock_open_rounded, + isLoading: _loading, + onPressed: _loading + ? null + : () => _callTool('decrypt'), + gradient: const LinearGradient( + colors: [ + Color(0xFF5B2EA6), + Color(0xFF7C4DFF) + ], + begin: Alignment.topLeft, + end: Alignment.bottomRight, + ), + glowColor: + _AppColors.accentDecryptGlow, + borderColor: _AppColors.accentDecrypt, + ), + ), + ], + ), + ], + ), + ), + + // ─── Error message ─────────────────────────────────── + AnimatedSize( + duration: const Duration(milliseconds: 300), + child: _error != null + ? Container( + margin: const EdgeInsets.only(top: 16), + padding: const EdgeInsets.all(16), + decoration: BoxDecoration( + color: const Color(0xFF1A0808), + borderRadius: BorderRadius.circular(14), + border: Border.all( + color: _AppColors.error + .withOpacity(0.4)), + ), + child: Row( + children: [ + const Icon( + Icons.error_outline_rounded, + color: _AppColors.error, + size: 20), + const SizedBox(width: 12), + Expanded( + child: Text( + _error!, + style: const TextStyle( + color: _AppColors.error, + fontWeight: FontWeight.w600, + fontSize: 14, + ), + ), + ), + ], + ), + ) + : const SizedBox.shrink(), + ), + + // ─── Output Card ───────────────────────────────────── + const SizedBox(height: 20), + _GlassCard( + borderColor: + _AppColors.accentDecrypt.withOpacity(0.25), + headerWidget: Container( + padding: const EdgeInsets.symmetric( + horizontal: 20, vertical: 14), + decoration: const BoxDecoration( + color: Color(0xFF16102A), + borderRadius: BorderRadius.vertical( + top: Radius.circular(20)), + ), + child: Row( + mainAxisAlignment: + MainAxisAlignment.spaceBetween, + children: [ + Row( + children: [ + Container( + padding: const EdgeInsets.all(8), + decoration: BoxDecoration( + color: _AppColors.accentDecryptGlow, + borderRadius: + BorderRadius.circular(10), + ), + child: const Icon( + Icons.shield_rounded, + color: _AppColors.accentDecrypt, + size: 18), + ), + const SizedBox(width: 12), + const Text( + 'النتيجة', + style: TextStyle( + color: _AppColors.textPrimary, + fontSize: 15, + fontWeight: FontWeight.w700, + ), + ), + ], + ), + _buildActionButtons( + isInput: false, + isCopied: _isOutputCopied, + accentColor: _AppColors.accentDecrypt, + ), + ], + ), + ), + child: Padding( + padding: const EdgeInsets.all(20), + child: TextField( + controller: _outputController, + readOnly: true, + maxLines: 5, + minLines: 3, + textDirection: TextDirection.ltr, + style: const TextStyle( + color: _AppColors.textPrimary, + fontSize: 15, + height: 1.6, + fontFamily: 'monospace', + letterSpacing: 0.5, + ), + decoration: const InputDecoration( + hintText: 'ستظهر النتيجة هنا...', + hintStyle: TextStyle( + color: _AppColors.textSec, + fontSize: 14), + border: InputBorder.none, + isDense: true, + contentPadding: EdgeInsets.zero, + ), + onTap: () { + if (_outputController.text.isNotEmpty) { + _outputController.selection = + TextSelection( + baseOffset: 0, + extentOffset: + _outputController.text.length, + ); + } + }, + ), + ), + ), + + // ─── Footer hint ───────────────────────────────────── + const SizedBox(height: 24), + Row( + mainAxisAlignment: MainAxisAlignment.center, + children: [ + const Icon(Icons.info_outline_rounded, + color: _AppColors.textSec, size: 13), + const SizedBox(width: 6), + const Text( + 'البيانات مشفرة بالكامل ولا تُخزَّن على الخادم', + style: TextStyle( + color: _AppColors.textSec, + fontSize: 12, + ), + ), + ], + ), + ], + ), + ), + ), + ), + ), + ], + ), + ), + ], + ), + ); + } +} + +// ─── Reusable Widgets ────────────────────────────────────────────────────────── + +/// Glass card with optional custom header widget +class _GlassCard extends StatelessWidget { + final Widget child; + final Widget? headerWidget; + final Color borderColor; + + const _GlassCard({ + required this.child, + this.headerWidget, + this.borderColor = _AppColors.border, + }); + + @override + Widget build(BuildContext context) { + return Container( + decoration: BoxDecoration( + color: _AppColors.card, + borderRadius: BorderRadius.circular(22), + border: Border.all(color: borderColor, width: 1.2), + boxShadow: [ + BoxShadow( + color: Colors.black.withOpacity(0.35), + blurRadius: 24, + offset: const Offset(0, 8), + ), + ], + ), + child: ClipRRect( + borderRadius: BorderRadius.circular(22), + child: Column( + crossAxisAlignment: CrossAxisAlignment.stretch, + children: [ + if (headerWidget != null) headerWidget!, + if (headerWidget == null) + Padding( + padding: const EdgeInsets.fromLTRB(20, 20, 20, 0), + child: child, + ) + else + child, + if (headerWidget == null) const SizedBox(height: 20), + ], + ), + ), + ); + } +} + +/// Gradient action button with glow +class _ActionButton extends StatefulWidget { + final String label; + final IconData icon; + final bool isLoading; + final VoidCallback? onPressed; + final Gradient gradient; + final Color glowColor; + final Color borderColor; + + const _ActionButton({ + required this.label, + required this.icon, + required this.isLoading, + required this.onPressed, + required this.gradient, + required this.glowColor, + required this.borderColor, + }); + + @override + State<_ActionButton> createState() => _ActionButtonState(); +} + +class _ActionButtonState extends State<_ActionButton> + with SingleTickerProviderStateMixin { + late final AnimationController _ctrl; + late final Animation _scale; + + @override + void initState() { + super.initState(); + _ctrl = AnimationController( + vsync: this, duration: const Duration(milliseconds: 120)); + _scale = Tween(begin: 1.0, end: 0.95) + .animate(CurvedAnimation(parent: _ctrl, curve: Curves.easeOut)); + } + + @override + void dispose() { + _ctrl.dispose(); + super.dispose(); + } + + @override + Widget build(BuildContext context) { + return GestureDetector( + onTapDown: (_) => _ctrl.forward(), + onTapUp: (_) => _ctrl.reverse(), + onTapCancel: () => _ctrl.reverse(), + onTap: widget.onPressed, + child: AnimatedBuilder( + animation: _scale, + builder: (_, child) => + Transform.scale(scale: _scale.value, child: child), + child: AnimatedOpacity( + opacity: widget.onPressed == null ? 0.4 : 1.0, + duration: const Duration(milliseconds: 200), + child: Container( + padding: const EdgeInsets.symmetric(vertical: 16), + decoration: BoxDecoration( + gradient: widget.gradient, + borderRadius: BorderRadius.circular(14), + boxShadow: [ + BoxShadow( + color: widget.glowColor, + blurRadius: 16, + spreadRadius: 1, + offset: const Offset(0, 4), + ), + ], + ), + child: Row( + mainAxisAlignment: MainAxisAlignment.center, + children: widget.isLoading + ? [ + const SizedBox( + width: 20, + height: 20, + child: CircularProgressIndicator( + color: Colors.white, strokeWidth: 2), + ), + ] + : [ + Icon(widget.icon, color: Colors.white, size: 18), + const SizedBox(width: 8), + Text( + widget.label, + style: const TextStyle( + color: Colors.white, + fontSize: 15, + fontWeight: FontWeight.w700, + letterSpacing: 0.3, + ), + ), + ], + ), + ), + ), + ), + ); + } +} + +/// Small inline icon button (copy/paste) +class _MiniIconButton extends StatelessWidget { + final String label; + final IconData icon; + final Color color; + final VoidCallback onTap; + + const _MiniIconButton({ + required this.label, + required this.icon, + required this.color, + required this.onTap, + }); + + @override + Widget build(BuildContext context) { + return Material( + color: Colors.transparent, + child: InkWell( + borderRadius: BorderRadius.circular(8), + onTap: onTap, + child: Container( + padding: const EdgeInsets.symmetric(horizontal: 10, vertical: 6), + decoration: BoxDecoration( + color: color.withOpacity(0.1), + borderRadius: BorderRadius.circular(8), + border: Border.all(color: color.withOpacity(0.25)), + ), + child: Row( + mainAxisSize: MainAxisSize.min, + children: [ + Icon(icon, color: color, size: 14), + const SizedBox(width: 5), + Text( + label, + style: TextStyle( + color: color, + fontWeight: FontWeight.bold, + fontSize: 12, + ), + ), + ], + ), + ), + ), + ); + } +} diff --git a/siro_admin/lib/views/admin/enceypt/fingerprint_migration.dart b/siro_admin/lib/views/admin/enceypt/fingerprint_migration.dart new file mode 100644 index 0000000..82d6523 --- /dev/null +++ b/siro_admin/lib/views/admin/enceypt/fingerprint_migration.dart @@ -0,0 +1,366 @@ +// ═══════════════════════════════════════════════════════════════ +// fingerprint_migration.dart +// ─────────────────────────────────────────────────────────────── +// أداة ترحيل البصمات القديمة للنظام الجديد +// ─────────────────────────────────────────────────────────────── +// المشكلة: +// البصمة القديمة = encrypt(androidId_model_osVersion) +// البصمة الجديدة = encrypt(androidId_model) +// +// الحل: +// 1. نجيب كل البصمات من السيرفر (batch 50 في المرة) +// 2. نفك تشفير كل بصمة بـ EncryptionHelper +// 3. نحذف آخر جزء (osVersion) مع الـ _ قبله +// 4. نعيد التشفير +// 5. نرفع البصمة المحدّثة للسيرفر +// +// يُستخدم مرة واحدة فقط ثم يُحذف من التطبيق +// ═══════════════════════════════════════════════════════════════ + +import 'dart:convert'; +import 'package:flutter/material.dart'; +import 'package:http/http.dart' as http; +import 'package:siro_admin/controller/functions/encrypt_decrypt.dart' as X; + +import '../../../constant/char_map.dart'; +import '../../../constant/links.dart'; +import '../../../controller/functions/crud.dart'; +import '../../../controller/functions/encrypt_decrypt.dart'; +import '../../../print.dart'; + +class FingerprintMigrationTool extends StatefulWidget { + const FingerprintMigrationTool({super.key}); + + @override + State createState() => + _FingerprintMigrationToolState(); +} + +class _FingerprintMigrationToolState extends State { + // ── حالة الترحيل ────────────────────────────────────────── + bool _isRunning = false; + bool _isDone = false; + int _total = 0; + int _processed = 0; + int _updated = 0; // بصمات تم تحديثها + int _skipped = 0; // بصمات كانت بالفعل بالنظام الجديد + int _failed = 0; // فشل في المعالجة + String _currentLog = ''; + + static const int _batchSize = 50; + + // ───────────────────────────────────────────────────────────── + // الدالة الرئيسية للترحيل + // ───────────────────────────────────────────────────────────── + Future _startMigration() async { + setState(() { + _isRunning = true; + _isDone = false; + _processed = 0; + _updated = 0; + _skipped = 0; + _failed = 0; + _currentLog = 'جارٍ جلب البصمات من السيرفر...'; + }); + + try { + // ── 1. جلب كل البصمات من السيرفر ────────────────────── + final allFingerprints = await _fetchAllFingerprints(); + + if (allFingerprints == null) { + _log('❌ فشل في جلب البيانات من السيرفر'); + setState(() => _isRunning = false); + return; + } + + _total = allFingerprints.length; + _log('✅ تم جلب $_total بصمة — بدء المعالجة...'); + + // ── 2. معالجة على batches ────────────────────────────── + for (int i = 0; i < allFingerprints.length; i += _batchSize) { + final batch = allFingerprints.skip(i).take(_batchSize).toList(); + + _log('⚙️ معالجة ${i + 1} → ${i + batch.length} من $_total'); + + // معالجة الـ batch بالتوازي + await Future.wait( + batch.map((record) => _processSingleRecord(record)), + ); + + // استراحة قصيرة بين الـ batches لحماية السيرفر + if (i + _batchSize < allFingerprints.length) { + await Future.delayed(const Duration(milliseconds: 300)); + } + } + + _log('🎉 اكتمل الترحيل!\n' + 'محدَّث: $_updated | متجاوز: $_skipped | فاشل: $_failed'); + + setState(() { + _isDone = true; + _isRunning = false; + }); + } catch (e) { + _log('❌ خطأ عام: $e'); + setState(() => _isRunning = false); + } + } + + // ───────────────────────────────────────────────────────────── + // جلب كل البصمات من السيرفر + // ───────────────────────────────────────────────────────────── + Future>?> _fetchAllFingerprints() async { + try { + final response = await CRUD().post( + link: AppLink.getAllFingerprints, // أضفه في AppLink + payload: { + 'admin_key': 'iuyweiruinakjbfkajkjlkmalkcxnlahd' + }, // مفتاح أمان للـ endpoint + ); + + if (response == 'failure' || response == null) return null; + + final data = response['data']; + if (data is! List) return null; + + return List>.from(data); + } catch (e) { + Log.print('fetchAllFingerprints error: $e'); + return null; + } + } + + // ───────────────────────────────────────────────────────────── + // معالجة بصمة واحدة + // ───────────────────────────────────────────────────────────── + Future _processSingleRecord(Map record) async { + final String passengerID = record['passengerID']?.toString() ?? ''; + final String encryptedFp = record['fingerPrint']?.toString() ?? ''; + final String userType = record['userType']?.toString() ?? 'passenger'; + + if (passengerID.isEmpty || encryptedFp.isEmpty) { + setState(() { + _failed++; + _processed++; + }); + return; + } + + try { + // ── فك التشفير ──────────────────────────────────────── + final String rawFp = EncryptionHelper.instance.decryptData(encryptedFp); + + // ── تحليل البصمة ────────────────────────────────────── + // الشكل القديم: "androidId_model_osVersion" (3 أجزاء أو أكثر) + // الشكل الجديد: "androidId_model" (جزءان فقط) + final List parts = rawFp.split('_'); + + if (parts.length <= 2) { + // البصمة بالفعل بالنظام الجديد — تجاوزها + setState(() { + _skipped++; + _processed++; + }); + return; + } + + // ── حذف آخر جزء (osVersion) ────────────────────────── + // مثال: "abc123_SamsungA51_13" → "abc123_SamsungA51" + // نأخذ أول جزأين فقط بغض النظر عن عدد الأجزاء + final String newRawFp = '${parts[0]}_${parts[1]}'; + + // ── إعادة التشفير ───────────────────────────────────── + final String newEncryptedFp = + EncryptionHelper.instance.encryptData(newRawFp); + + // ── رفع البصمة الجديدة للسيرفر ─────────────────────── + final response = await CRUD().post( + link: AppLink.updateFingerprintAdmin, // أضفه في AppLink + payload: { + 'passengerID': passengerID, + 'fingerprint': newEncryptedFp, + 'userType': userType, + 'admin_key': 'iuyweiruinakjbfkajkjlkmalkcxnlahd', + }, + ); + + if (response != 'failure' && response?['status'] == 'success') { + setState(() { + _updated++; + _processed++; + }); + Log.print('✅ Updated: $passengerID | $rawFp → $newRawFp'); + } else { + setState(() { + _failed++; + _processed++; + }); + Log.print('❌ Failed update: $passengerID'); + } + } catch (e) { + // فشل فك التشفير أو إعادة التشفير + setState(() { + _failed++; + _processed++; + }); + Log.print('❌ Process error for $passengerID: $e'); + } + } + + void _log(String message) { + Log.print(message); + setState(() => _currentLog = message); + } + + // ───────────────────────────────────────────────────────────── + // UI + // ───────────────────────────────────────────────────────────── + @override + Widget build(BuildContext context) { + return Scaffold( + appBar: AppBar(title: const Text('Fingerprint Migration Tool')), + body: Padding( + padding: const EdgeInsets.all(24), + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + // ── شرح الأداة ────────────────────────────────── + Container( + padding: const EdgeInsets.all(16), + decoration: BoxDecoration( + color: Colors.orange.shade50, + borderRadius: BorderRadius.circular(12), + border: Border.all(color: Colors.orange.shade200), + ), + child: const Text( + '⚠️ هذه الأداة تُستخدم مرة واحدة فقط\n' + 'تقوم بتحديث بصمات الأجهزة القديمة\n' + 'لتكون متوافقة مع النظام الجديد (بدون OS version)', + style: TextStyle(fontSize: 14, height: 1.6), + ), + ), + Container( + child: TextButton( + onPressed: () { + print(EncryptionHelper.instance.decryptData('hbgbitbXrXrBr')); + }, + child: Text( + "Decrypt Test", + ), + ), + ), + Container( + child: TextButton( + onPressed: () { + print(EncryptionHelper.instance.encryptData( + '1B501143-C579-461C-B556-4E8B390EEFE1_iPhone')); + }, + child: Text( + "Encrypt Test", + ), + ), + ), + Container( + child: TextButton( + onPressed: () { + print(r('hbgbitbXrXrBr')); + }, + child: Text( + "decrypt X.r", + ), + ), + ), + + const SizedBox(height: 24), + + // ── شريط التقدم ───────────────────────────────── + if (_total > 0) ...[ + Text('التقدم: $_processed / $_total'), + const SizedBox(height: 8), + LinearProgressIndicator( + value: _total > 0 ? _processed / _total : 0, + backgroundColor: Colors.grey.shade200, + color: _isDone ? Colors.green : Colors.blue, + ), + const SizedBox(height: 16), + ], + + // ── إحصائيات ──────────────────────────────────── + if (_processed > 0) + Row(children: [ + _statChip('محدَّث', _updated, Colors.green), + const SizedBox(width: 8), + _statChip('متجاوز', _skipped, Colors.blue), + const SizedBox(width: 8), + _statChip('فاشل', _failed, Colors.red), + ]), + + const SizedBox(height: 16), + + // ── السجل الحالي ───────────────────────────────── + if (_currentLog.isNotEmpty) + Container( + width: double.infinity, + padding: const EdgeInsets.all(12), + decoration: BoxDecoration( + color: Colors.grey.shade100, + borderRadius: BorderRadius.circular(8), + ), + child: Text(_currentLog, + style: const TextStyle(fontFamily: 'monospace')), + ), + + const Spacer(), + + // ── زر التشغيل ────────────────────────────────── + SizedBox( + width: double.infinity, + height: 50, + child: ElevatedButton( + onPressed: (_isRunning || _isDone) ? null : _startMigration, + style: ElevatedButton.styleFrom( + backgroundColor: _isDone ? Colors.green : Colors.blue, + shape: RoundedRectangleBorder( + borderRadius: BorderRadius.circular(12)), + ), + child: _isRunning + ? const Row( + mainAxisAlignment: MainAxisAlignment.center, + children: [ + SizedBox( + width: 20, + height: 20, + child: CircularProgressIndicator( + color: Colors.white, strokeWidth: 2), + ), + SizedBox(width: 12), + Text('جارٍ الترحيل...', + style: TextStyle(color: Colors.white)), + ], + ) + : Text( + _isDone ? '✅ اكتمل الترحيل' : 'بدء الترحيل', + style: + const TextStyle(color: Colors.white, fontSize: 16), + ), + ), + ), + ], + ), + ), + ); + } + + Widget _statChip(String label, int value, Color color) { + return Container( + padding: const EdgeInsets.symmetric(horizontal: 12, vertical: 6), + decoration: BoxDecoration( + color: color.withOpacity(0.1), + borderRadius: BorderRadius.circular(20), + border: Border.all(color: color.withOpacity(0.3)), + ), + child: Text('$label: $value', + style: TextStyle(color: color, fontWeight: FontWeight.bold)), + ); + } +} diff --git a/siro_admin/lib/views/admin/error/error/error_page.dart b/siro_admin/lib/views/admin/error/error/error_page.dart new file mode 100644 index 0000000..7c18dd5 --- /dev/null +++ b/siro_admin/lib/views/admin/error/error/error_page.dart @@ -0,0 +1,659 @@ +import 'package:flutter/material.dart'; +import 'package:siro_admin/constant/colors.dart'; +import 'package:siro_admin/constant/links.dart'; +import 'package:siro_admin/controller/functions/crud.dart'; + +class ErrorLog { + final String id; + final String error; + final String userId; + final String userType; + final String phone; + final String createdAt; + final String device; + final String details; + final String status; + + ErrorLog({ + required this.id, + required this.error, + required this.userId, + required this.userType, + required this.phone, + required this.createdAt, + required this.device, + required this.details, + required this.status, + }); + + factory ErrorLog.fromJson(Map j) => ErrorLog( + id: (j['id'] ?? '').toString(), + error: (j['error'] ?? '').toString(), + userId: (j['userId'] ?? '').toString(), + userType: (j['userType'] ?? '').toString(), + phone: (j['phone'] ?? '').toString(), + createdAt: (j['created_at'] ?? '').toString(), + device: (j['device'] ?? '').toString(), + details: (j['details'] ?? '').toString(), + status: (j['status'] ?? '').toString(), + ); +} + +class ErrorListPage extends StatefulWidget { + const ErrorListPage({Key? key}) : super(key: key); + + @override + State createState() => _ErrorListPageState(); +} + +class _ErrorListPageState extends State { + static String baseUrl = '${AppLink.server}/Admin/error'; + static const String listEndpoint = "error_list_last20.php"; + static const String searchEndpoint = "error_search_by_phone.php"; + + final TextEditingController _phoneCtrl = TextEditingController(); + bool _loading = false; + String? _errorMsg; + List _items = []; + bool _searchMode = false; + + @override + void initState() { + super.initState(); + _fetchLast20(); + } + + Future _fetchLast20() async { + setState(() { + _loading = true; + _errorMsg = null; + _searchMode = false; + }); + try { + final res = + await CRUD().post(link: "$baseUrl/$listEndpoint", payload: {}); + final map = (res); + if (map['status'] == 'success') { + final List data = (map['message'] ?? []) as List; + final items = data.map((e) => ErrorLog.fromJson(e)).toList(); + setState(() { + _items = items.cast(); + }); + } else { + setState(() => _errorMsg = map['message']?.toString() ?? 'Failed'); + } + } catch (e) { + setState(() => _errorMsg = e.toString()); + } finally { + if (mounted) setState(() => _loading = false); + } + } + + Future _searchByPhone() async { + final phone = _phoneCtrl.text.trim(); + if (phone.isEmpty) { + return _fetchLast20(); + } + setState(() { + _loading = true; + _errorMsg = null; + _searchMode = true; + }); + try { + final res = await CRUD() + .post(link: "$baseUrl/$searchEndpoint", payload: {"phone": phone}); + final map = (res); + if (map['status'] == 'success') { + final List data = (map['message'] ?? []) as List; + final items = data.map((e) => ErrorLog.fromJson(e)).toList(); + setState(() { + _items = items.cast(); + }); + } else { + setState(() => _errorMsg = map['message']?.toString() ?? 'Failed'); + } + } catch (e) { + setState(() => _errorMsg = e.toString()); + } finally { + if (mounted) setState(() => _loading = false); + } + } + + void _clearSearch() { + _phoneCtrl.clear(); + FocusScope.of(context).unfocus(); + _fetchLast20(); + } + + @override + Widget build(BuildContext context) { + return Scaffold( + backgroundColor: const Color(0xFFF0F4F8), + appBar: _buildAppBar(), + body: Column( + children: [ + _SearchBar( + controller: _phoneCtrl, + onSearch: _searchByPhone, + onClear: _clearSearch, + ), + Expanded( + child: _buildBody(), + ), + ], + ), + ); + } + + PreferredSizeWidget _buildAppBar() { + return AppBar( + elevation: 0, + backgroundColor: const Color(0xFF0F172A), + foregroundColor: Colors.white, + centerTitle: true, + title: Container( + padding: const EdgeInsets.symmetric(horizontal: 16, vertical: 8), + decoration: BoxDecoration( + color: Colors.white.withOpacity(0.1), + borderRadius: BorderRadius.circular(12), + border: Border.all(color: Colors.white.withOpacity(0.2)), + ), + child: Row( + mainAxisSize: MainAxisSize.min, + children: [ + const Icon(Icons.error_outline, color: Colors.red, size: 22), + const SizedBox(width: 8), + const Text( + "سجل الأخطاء", + style: TextStyle( + fontSize: 18, + fontWeight: FontWeight.bold, + ), + ), + ], + ), + ), + ); + } + + Widget _buildBody() { + if (_loading) { + return const Center( + child: CircularProgressIndicator( + valueColor: AlwaysStoppedAnimation(Color(0xFF0F172A)), + ), + ); + } + + if (_errorMsg != null) { + return Center( + child: Column( + mainAxisAlignment: MainAxisAlignment.center, + children: [ + Icon(Icons.error_outline, size: 64, color: Colors.red.shade300), + const SizedBox(height: 16), + Text( + _errorMsg!, + textAlign: TextAlign.center, + style: TextStyle( + color: Colors.red.shade700, + fontSize: 14, + ), + ), + ], + ), + ); + } + + if (_items.isEmpty) { + return Center( + child: Column( + mainAxisAlignment: MainAxisAlignment.center, + children: [ + Icon( + Icons.check_circle_outline, + size: 64, + color: Colors.green.shade300, + ), + const SizedBox(height: 16), + const Text( + 'لا توجد سجلات أخطاء', + style: TextStyle(fontSize: 16, color: Colors.grey), + ), + ], + ), + ); + } + + return RefreshIndicator( + onRefresh: () async { + if (_searchMode) { + await _searchByPhone(); + } else { + await _fetchLast20(); + } + }, + color: const Color(0xFF0F172A), + child: ListView.builder( + padding: const EdgeInsets.symmetric(horizontal: 12, vertical: 12), + itemCount: _items.length, + itemBuilder: (context, index) { + return _ErrorTile(_items[index], index); + }, + ), + ); + } + + @override + void dispose() { + _phoneCtrl.dispose(); + super.dispose(); + } +} + +class _SearchBar extends StatefulWidget { + final TextEditingController controller; + final VoidCallback onSearch; + final VoidCallback onClear; + + const _SearchBar({ + required this.controller, + required this.onSearch, + required this.onClear, + }); + + @override + State<_SearchBar> createState() => _SearchBarState(); +} + +class _SearchBarState extends State<_SearchBar> { + bool _isFocused = false; + + @override + Widget build(BuildContext context) { + return Container( + margin: const EdgeInsets.symmetric(horizontal: 12, vertical: 12), + decoration: BoxDecoration( + gradient: LinearGradient( + colors: [Colors.white, Colors.grey.shade50], + begin: Alignment.topLeft, + end: Alignment.bottomRight, + ), + borderRadius: BorderRadius.circular(16), + boxShadow: [ + BoxShadow( + color: Colors.black.withOpacity(0.08), + blurRadius: 16, + spreadRadius: 2, + ) + ], + ), + padding: const EdgeInsets.all(12), + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Row( + children: [ + Expanded( + child: Focus( + onFocusChange: (focused) { + setState(() => _isFocused = focused); + }, + child: TextField( + controller: widget.controller, + keyboardType: TextInputType.phone, + textDirection: TextDirection.rtl, + onSubmitted: (_) => widget.onSearch(), + style: const TextStyle(fontSize: 15), + decoration: InputDecoration( + hintText: 'بحث برقم الهاتف', + hintStyle: TextStyle(color: Colors.grey.shade400), + prefixIcon: Icon( + Icons.search, + color: _isFocused + ? const Color(0xFF0F172A) + : Colors.grey.shade400, + ), + suffixIcon: widget.controller.text.isNotEmpty + ? InkWell( + onTap: () { + widget.controller.clear(); + setState(() {}); + }, + child: Icon(Icons.close, + color: Colors.grey.shade400, size: 20), + ) + : null, + border: OutlineInputBorder( + borderRadius: BorderRadius.circular(12), + borderSide: + BorderSide(color: Colors.grey.shade300, width: 1), + ), + enabledBorder: OutlineInputBorder( + borderRadius: BorderRadius.circular(12), + borderSide: + BorderSide(color: Colors.grey.shade300, width: 1), + ), + focusedBorder: OutlineInputBorder( + borderRadius: BorderRadius.circular(12), + borderSide: const BorderSide( + color: Color(0xFF0F172A), + width: 2, + ), + ), + filled: true, + fillColor: Colors.white, + contentPadding: const EdgeInsets.symmetric(vertical: 12), + ), + onChanged: (_) => setState(() {}), + ), + ), + ), + const SizedBox(width: 8), + ElevatedButton( + onPressed: widget.onSearch, + style: ElevatedButton.styleFrom( + backgroundColor: const Color(0xFF0F172A), + foregroundColor: Colors.white, + padding: const EdgeInsets.symmetric(horizontal: 16), + shape: RoundedRectangleBorder( + borderRadius: BorderRadius.circular(12), + ), + elevation: 0, + ), + child: const Row( + children: [ + Icon(Icons.search, size: 18), + SizedBox(width: 6), + Text("بحث"), + ], + ), + ), + const SizedBox(width: 8), + OutlinedButton( + onPressed: widget.onClear, + style: OutlinedButton.styleFrom( + foregroundColor: const Color(0xFF0F172A), + side: const BorderSide( + color: Color(0xFF0F172A), + width: 1.5, + ), + shape: RoundedRectangleBorder( + borderRadius: BorderRadius.circular(12), + ), + padding: const EdgeInsets.symmetric(horizontal: 12), + ), + child: const Icon(Icons.refresh, size: 20), + ), + ], + ), + ], + ), + ); + } +} + +class _ErrorTile extends StatelessWidget { + final ErrorLog item; + final int index; + + const _ErrorTile(this.item, this.index); + + @override + Widget build(BuildContext context) { + // تحديد الألوان والأيقونات بناءً على نوع المستخدم + final isDriver = item.userType.toLowerCase().contains('driver') || + item.userType.toLowerCase().contains('سائق'); + + final userTypeColor = + isDriver ? const Color(0xFF10B981) : const Color(0xFFF59E0B); + final userTypeIcon = isDriver ? Icons.directions_car : Icons.person; + final userTypeLabel = isDriver ? "سائق" : "راكب"; + + final userTypeBgColor = isDriver + ? const Color(0xFF10B981).withOpacity(0.1) + : const Color(0xFFF59E0B).withOpacity(0.1); + + return Container( + margin: const EdgeInsets.only(bottom: 12), + decoration: BoxDecoration( + gradient: LinearGradient( + colors: [Colors.white, Colors.grey.shade50], + begin: Alignment.topLeft, + end: Alignment.bottomRight, + ), + borderRadius: BorderRadius.circular(16), + border: Border.all(color: Colors.grey.shade200, width: 1), + boxShadow: [ + BoxShadow( + color: Colors.black.withOpacity(0.06), + blurRadius: 12, + spreadRadius: 1, + ) + ], + ), + child: ClipRRect( + borderRadius: BorderRadius.circular(16), + child: Stack( + children: [ + // خط علوي ملون + Positioned( + top: 0, + left: 0, + right: 0, + child: Container( + height: 4, + decoration: BoxDecoration( + gradient: LinearGradient( + colors: [ + const Color(0xFFEF4444), + Colors.red.shade400, + ], + begin: Alignment.centerLeft, + end: Alignment.centerRight, + ), + ), + ), + ), + Padding( + padding: const EdgeInsets.all(16), + child: Column( + crossAxisAlignment: CrossAxisAlignment.end, + children: [ + // الصف الأول: رقم الخطأ ونوع المستخدم + Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + Container( + padding: const EdgeInsets.symmetric( + horizontal: 10, + vertical: 6, + ), + decoration: BoxDecoration( + color: userTypeBgColor, + borderRadius: BorderRadius.circular(8), + border: Border.all(color: userTypeColor, width: 1), + ), + child: Row( + mainAxisSize: MainAxisSize.min, + children: [ + Icon(userTypeIcon, size: 14, color: userTypeColor), + const SizedBox(width: 4), + Text( + userTypeLabel, + style: TextStyle( + fontSize: 11, + fontWeight: FontWeight.bold, + color: userTypeColor, + ), + ), + ], + ), + ), + Text( + '#${item.id}', + style: TextStyle( + fontSize: 12, + color: Colors.grey.shade500, + fontWeight: FontWeight.w500, + ), + ), + ], + ), + const SizedBox(height: 12), + + // عنوان الخطأ (قابل للنسخ) + Container( + padding: const EdgeInsets.all(12), + decoration: BoxDecoration( + color: Colors.red.shade50, + borderRadius: BorderRadius.circular(8), + border: Border.all( + color: Colors.red.shade200, + width: 1, + ), + ), + child: Row( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Icon(Icons.warning_amber_rounded, + size: 18, color: Colors.red.shade600), + const SizedBox(width: 8), + Expanded( + child: SelectableText( + item.error.isEmpty ? '(بدون عنوان)' : item.error, + style: TextStyle( + fontSize: 13, + fontWeight: FontWeight.bold, + color: Colors.red.shade900, + height: 1.4, + ), + ), + ), + ], + ), + ), + const SizedBox(height: 12), + + // التفاصيل (إن وجدت) + if (item.details.isNotEmpty) ...[ + Container( + padding: const EdgeInsets.all(12), + decoration: BoxDecoration( + color: Colors.grey.shade50, + borderRadius: BorderRadius.circular(8), + border: Border.all( + color: Colors.grey.shade200, + width: 1, + ), + ), + child: Row( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Icon(Icons.info_outline, + size: 16, color: Colors.grey.shade600), + const SizedBox(width: 8), + Expanded( + child: SelectableText( + item.details, + style: TextStyle( + fontSize: 12, + color: Colors.grey.shade700, + height: 1.4, + ), + ), + ), + ], + ), + ), + const SizedBox(height: 12), + ], + + // معلومات تقنية + Wrap( + spacing: 6, + runSpacing: 6, + alignment: WrapAlignment.end, + children: [ + _buildInfoBadge( + icon: Icons.phone, + label: 'الهاتف', + value: item.phone, + color: Colors.blue, + ), + _buildInfoBadge( + icon: Icons.person_outline, + label: 'المعرف', + value: item.userId, + color: Colors.purple, + ), + _buildInfoBadge( + icon: Icons.devices, + label: 'Path', + value: item.device, + color: Colors.orange, + ), + _buildInfoBadge( + icon: Icons.schedule, + label: 'التاريخ', + value: item.createdAt, + color: Colors.teal, + ), + ], + ), + ], + ), + ), + ], + ), + ), + ); + } + + Widget _buildInfoBadge({ + required IconData icon, + required String label, + required String value, + required Color color, + }) { + return Container( + padding: const EdgeInsets.symmetric(horizontal: 10, vertical: 6), + decoration: BoxDecoration( + color: color.withOpacity(0.08), + borderRadius: BorderRadius.circular(8), + border: Border.all(color: color.withOpacity(0.3), width: 1), + ), + child: Row( + mainAxisSize: MainAxisSize.min, + children: [ + Icon(icon, size: 13, color: color), + const SizedBox(width: 4), + Flexible( + child: Text.rich( + TextSpan( + children: [ + TextSpan( + text: "$label: ", + style: TextStyle( + fontSize: 10, + color: color.withOpacity(0.7), + fontWeight: FontWeight.w500, + ), + ), + TextSpan( + text: value.isEmpty ? '—' : value, + style: TextStyle( + fontSize: 10, + fontWeight: FontWeight.bold, + color: color, + ), + ), + ], + ), + ), + ), + ], + ), + ); + } +} diff --git a/siro_admin/lib/views/admin/financial/financial_v2_page.dart b/siro_admin/lib/views/admin/financial/financial_v2_page.dart new file mode 100644 index 0000000..d8f1cba --- /dev/null +++ b/siro_admin/lib/views/admin/financial/financial_v2_page.dart @@ -0,0 +1,278 @@ +import 'package:flutter/material.dart'; +import 'package:get/get.dart'; +import 'package:siro_admin/constant/colors.dart'; +import 'package:siro_admin/controller/admin/financial_v2_controller.dart'; + +class FinancialV2Page extends StatelessWidget { + const FinancialV2Page({super.key}); + + @override + Widget build(BuildContext context) { + final controller = Get.put(FinancialV2Controller()); + + return Scaffold( + backgroundColor: AppColor.bg, + appBar: AppBar( + title: const Text('الإدارة المالية المتقدمة', + style: TextStyle(fontWeight: FontWeight.bold)), + backgroundColor: AppColor.surface, + elevation: 0, + centerTitle: true, + actions: [ + IconButton( + icon: const Icon(Icons.refresh_rounded), + onPressed: () => controller.fetchAllFinancials(), + ) + ], + ), + body: GetBuilder( + builder: (ctrl) { + if (ctrl.isLoading) { + return const Center( + child: CircularProgressIndicator(color: AppColor.accent)); + } + + return SingleChildScrollView( + padding: const EdgeInsets.all(16), + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + _buildMainFinancialStats(ctrl.stats), + const SizedBox(height: 24), + _buildSectionTitle('طرق الدفع'), + _buildPaymentMethodBreakdown(ctrl.stats), + const SizedBox(height: 32), + _buildSectionTitle('تسويات الكباتن (مستحقات معلقة)'), + _buildSettlementsList(ctrl.settlements), + const SizedBox(height: 40), + ], + ), + ); + }, + ), + ); + } + + Widget _buildSectionTitle(String title) { + return Padding( + padding: const EdgeInsets.only(bottom: 16), + child: Text( + title, + style: const TextStyle( + color: AppColor.textPrimary, + fontSize: 16, + fontWeight: FontWeight.bold, + ), + ), + ); + } + + Widget _buildMainFinancialStats(Map stats) { + return Column( + children: [ + _buildFinancialCard( + 'إجمالي عمولة المنصة', + '${stats['total_platform_commission'] ?? 0} ج.م', + Icons.account_balance_rounded, + AppColor.accent, + ), + const SizedBox(height: 12), + Row( + children: [ + Expanded( + child: _buildFinancialCard( + 'إجمالي دخل الكباتن', + '${stats['total_driver_pay'] ?? 0}', + Icons.person_pin_rounded, + AppColor.info, + isSmall: true, + ), + ), + const SizedBox(width: 12), + Expanded( + child: _buildFinancialCard( + 'إجمالي الإيرادات', + '${stats['total_revenue'] ?? 0}', + Icons.payments_rounded, + AppColor.success, + isSmall: true, + ), + ), + ], + ), + ], + ); + } + + Widget _buildFinancialCard( + String title, String value, IconData icon, Color color, + {bool isSmall = false}) { + return Container( + padding: EdgeInsets.all(isSmall ? 16 : 24), + decoration: BoxDecoration( + color: AppColor.surface, + borderRadius: BorderRadius.circular(20), + border: Border.all(color: color.withOpacity(0.2)), + gradient: LinearGradient( + begin: Alignment.topLeft, + end: Alignment.bottomRight, + colors: [AppColor.surface, color.withOpacity(0.05)], + ), + ), + child: Row( + children: [ + Container( + padding: const EdgeInsets.all(12), + decoration: BoxDecoration( + color: color.withOpacity(0.1), + borderRadius: BorderRadius.circular(14), + ), + child: Icon(icon, color: color, size: isSmall ? 20 : 28), + ), + const SizedBox(width: 16), + Expanded( + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Text(title, + style: const TextStyle( + color: AppColor.textSecondary, fontSize: 12)), + const SizedBox(height: 4), + Text(value, + style: TextStyle( + color: AppColor.textPrimary, + fontSize: isSmall ? 18 : 24, + fontWeight: FontWeight.bold)), + ], + ), + ), + ], + ), + ); + } + + Widget _buildPaymentMethodBreakdown(Map stats) { + double cash = double.tryParse(stats['cash_payments'].toString()) ?? 0; + double digital = double.tryParse(stats['digital_payments'].toString()) ?? 0; + double total = cash + digital; + if (total == 0) total = 1; + + return Container( + padding: const EdgeInsets.all(20), + decoration: BoxDecoration( + color: AppColor.surface, + borderRadius: BorderRadius.circular(20), + ), + child: Column( + children: [ + _buildPaymentBar('نقدي (Cash)', cash, total, AppColor.warning), + const SizedBox(height: 16), + _buildPaymentBar('إلكتروني / محفظة', digital, total, AppColor.info), + ], + ), + ); + } + + Widget _buildPaymentBar( + String label, double value, double total, Color color) { + double percent = value / total; + return Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + Text(label, + style: + const TextStyle(color: AppColor.textPrimary, fontSize: 13)), + Text('${value.toStringAsFixed(0)} ج.م', + style: TextStyle(color: color, fontWeight: FontWeight.bold)), + ], + ), + const SizedBox(height: 8), + ClipRRect( + borderRadius: BorderRadius.circular(4), + child: LinearProgressIndicator( + value: percent, + backgroundColor: AppColor.divider, + color: color, + minHeight: 8, + ), + ), + ], + ); + } + + Widget _buildSettlementsList(List settlements) { + if (settlements.isEmpty) + return const Center(child: Text('لا توجد تسويات معلقة')); + + return ListView.builder( + shrinkWrap: true, + physics: const NeverScrollableScrollPhysics(), + itemCount: settlements.length, + itemBuilder: (ctx, i) { + final s = settlements[i]; + return Container( + margin: const EdgeInsets.only(bottom: 12), + padding: const EdgeInsets.all(16), + decoration: BoxDecoration( + color: AppColor.surface, + borderRadius: BorderRadius.circular(16), + border: Border.all(color: AppColor.divider), + ), + child: Row( + children: [ + Expanded( + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Text('${s['first_name']} ${s['last_name']}', + style: const TextStyle( + color: AppColor.textPrimary, + fontWeight: FontWeight.bold)), + Text(s['phone'] ?? '', + style: const TextStyle( + color: AppColor.textSecondary, fontSize: 12)), + const SizedBox(height: 4), + Text('${s['total_rides']} رحلة مكتملة', + style: const TextStyle( + color: AppColor.info, fontSize: 11)), + ], + ), + ), + Column( + crossAxisAlignment: CrossAxisAlignment.end, + children: [ + const Text('المستحقات', + style: TextStyle( + color: AppColor.textSecondary, fontSize: 10)), + Text('${s['total_earned']} ج.م', + style: const TextStyle( + color: AppColor.accent, + fontSize: 18, + fontWeight: FontWeight.bold)), + const SizedBox(height: 4), + ElevatedButton( + onPressed: () {}, + style: ElevatedButton.styleFrom( + backgroundColor: AppColor.accent.withOpacity(0.1), + foregroundColor: AppColor.accent, + elevation: 0, + minimumSize: const Size(80, 32), + shape: RoundedRectangleBorder( + borderRadius: BorderRadius.circular(8)), + ), + child: const Text('تسوية', + style: TextStyle( + fontSize: 11, fontWeight: FontWeight.bold)), + ), + ], + ), + ], + ), + ); + }, + ); + } +} diff --git a/siro_admin/lib/views/admin/packages.dart b/siro_admin/lib/views/admin/packages.dart new file mode 100644 index 0000000..87c8752 --- /dev/null +++ b/siro_admin/lib/views/admin/packages.dart @@ -0,0 +1,603 @@ +import 'package:flutter/material.dart'; +import 'package:get/get.dart'; +import 'dart:convert'; +import 'package:siro_admin/constant/links.dart'; +import 'package:siro_admin/controller/functions/crud.dart'; +import 'package:siro_admin/views/widgets/my_textField.dart'; + +import '../../print.dart'; + +// ══════════════════════════════════════════════════════════════ +// DESIGN TOKENS (same as AdminHomePage) +// ══════════════════════════════════════════════════════════════ +const Color _bg = Color(0xFF0D1117); +const Color _surface = Color(0xFF161B22); +const Color _surfaceElevated = Color(0xFF1C2333); +const Color _accent = Color(0xFF00D4AA); +const Color _danger = Color(0xFFFF5370); +const Color _warning = Color(0xFFFFCB6B); +const Color _info = Color(0xFF82AAFF); +const Color _textPrimary = Color(0xFFE6EDF3); +const Color _textSecondary = Color(0xFF7D8590); +const Color _divider = Color(0xFF21262D); + +class PackageUpdateScreen extends StatelessWidget { + PackageUpdateScreen({super.key}); + + final PackageController packageController = Get.put(PackageController()); + + @override + Widget build(BuildContext context) { + return Scaffold( + backgroundColor: _bg, + appBar: _buildAppBar(), + body: GetBuilder( + builder: (controller) { + if (controller.isLoading.value) { + return const Center( + child: CircularProgressIndicator(color: _accent, strokeWidth: 2), + ); + } + + if (controller.packages.isEmpty) { + return _buildEmptyState(); + } + + return ListView.separated( + padding: const EdgeInsets.fromLTRB(16, 16, 16, 40), + itemCount: controller.packages.length, + separatorBuilder: (_, __) => const SizedBox(height: 10), + itemBuilder: (context, index) { + final package = controller.packages[index]; + return _buildPackageCard(context, package, controller); + }, + ); + }, + ), + ); + } + + // ─────────────────────────── APP BAR ─────────────────────────── + PreferredSizeWidget _buildAppBar() { + return AppBar( + backgroundColor: _bg, + elevation: 0, + surfaceTintColor: Colors.transparent, + leading: GestureDetector( + onTap: () => Get.back(), + child: Container( + margin: const EdgeInsets.all(10), + decoration: BoxDecoration( + color: _surface, + borderRadius: BorderRadius.circular(10), + border: Border.all(color: _divider), + ), + child: const Icon(Icons.arrow_back_ios_new_rounded, + color: _textSecondary, size: 16), + ), + ), + title: Row( + children: [ + Container( + padding: const EdgeInsets.all(7), + decoration: BoxDecoration( + color: _accent.withOpacity(0.12), + borderRadius: BorderRadius.circular(9), + border: Border.all(color: _accent.withOpacity(0.25)), + ), + child: const Icon(Icons.system_update_rounded, + color: _accent, size: 16), + ), + const SizedBox(width: 10), + const Text( + 'تحديث التطبيق', + style: TextStyle( + color: _textPrimary, + fontSize: 17, + fontWeight: FontWeight.w600, + ), + ), + ], + ), + actions: [ + GestureDetector( + onTap: () => packageController.fetchPackages(), + child: Container( + margin: const EdgeInsets.only(right: 16), + padding: const EdgeInsets.all(8), + decoration: BoxDecoration( + color: _surface, + borderRadius: BorderRadius.circular(10), + border: Border.all(color: _divider), + ), + child: const Icon(Icons.refresh_rounded, + color: _textSecondary, size: 18), + ), + ), + ], + bottom: PreferredSize( + preferredSize: const Size.fromHeight(1), + child: Container(height: 1, color: _divider), + ), + ); + } + + // ─────────────────────────── PACKAGE CARD ─────────────────────────── + Widget _buildPackageCard( + BuildContext context, dynamic package, PackageController controller) { + final platform = package['platform']?.toString() ?? ''; + final isAndroid = platform.toLowerCase().contains('android'); + final isIOS = platform.toLowerCase().contains('ios'); + + final Color platformColor = isAndroid + ? const Color(0xFF4CAF50) + : isIOS + ? _info + : _warning; + final IconData platformIcon = isAndroid + ? Icons.android_rounded + : isIOS + ? Icons.apple_rounded + : Icons.devices_rounded; + + return Material( + color: Colors.transparent, + child: InkWell( + onTap: () => _showUpdateDialog(context, package, controller), + borderRadius: BorderRadius.circular(16), + splashColor: _accent.withOpacity(0.06), + highlightColor: Colors.transparent, + child: Container( + padding: const EdgeInsets.all(16), + decoration: BoxDecoration( + color: _surface, + borderRadius: BorderRadius.circular(16), + border: Border.all(color: _divider), + ), + child: Row( + children: [ + // Platform Icon + Container( + width: 48, + height: 48, + decoration: BoxDecoration( + gradient: LinearGradient( + begin: Alignment.topLeft, + end: Alignment.bottomRight, + colors: [ + platformColor.withOpacity(0.20), + platformColor.withOpacity(0.06), + ], + ), + borderRadius: BorderRadius.circular(13), + border: Border.all(color: platformColor.withOpacity(0.25)), + ), + child: Icon(platformIcon, color: platformColor, size: 22), + ), + + const SizedBox(width: 14), + + // Info + Expanded( + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Text( + package['appName']?.toString() ?? '—', + style: const TextStyle( + color: _textPrimary, + fontSize: 14, + fontWeight: FontWeight.w600, + ), + ), + const SizedBox(height: 4), + Row( + children: [ + _buildTag(platform, platformColor), + const SizedBox(width: 6), + _buildVersionBadge( + package['version']?.toString() ?? '?'), + ], + ), + ], + ), + ), + + // Update button + Container( + padding: + const EdgeInsets.symmetric(horizontal: 12, vertical: 7), + decoration: BoxDecoration( + color: _accent.withOpacity(0.10), + borderRadius: BorderRadius.circular(10), + border: Border.all(color: _accent.withOpacity(0.25)), + ), + child: Row( + mainAxisSize: MainAxisSize.min, + children: const [ + Icon(Icons.edit_rounded, color: _accent, size: 13), + SizedBox(width: 5), + Text( + 'تعديل', + style: TextStyle( + color: _accent, + fontSize: 11, + fontWeight: FontWeight.w600, + ), + ), + ], + ), + ), + ], + ), + ), + ), + ); + } + + Widget _buildTag(String label, Color color) { + return Container( + padding: const EdgeInsets.symmetric(horizontal: 8, vertical: 3), + decoration: BoxDecoration( + color: color.withOpacity(0.10), + borderRadius: BorderRadius.circular(6), + ), + child: Text( + label, + style: TextStyle( + color: color, + fontSize: 10, + fontWeight: FontWeight.w600, + ), + ), + ); + } + + Widget _buildVersionBadge(String version) { + return Container( + padding: const EdgeInsets.symmetric(horizontal: 8, vertical: 3), + decoration: BoxDecoration( + color: _divider, + borderRadius: BorderRadius.circular(6), + ), + child: Text( + 'v$version', + style: const TextStyle( + color: _textSecondary, + fontSize: 10, + fontWeight: FontWeight.w500, + fontFamily: 'monospace', + ), + ), + ); + } + + // ─────────────────────────── EMPTY STATE ─────────────────────────── + Widget _buildEmptyState() { + return Center( + child: Column( + mainAxisSize: MainAxisSize.min, + children: [ + Container( + padding: const EdgeInsets.all(20), + decoration: BoxDecoration( + color: _surface, + shape: BoxShape.circle, + border: Border.all(color: _divider), + ), + child: const Icon(Icons.inventory_2_outlined, + color: _textSecondary, size: 32), + ), + const SizedBox(height: 16), + const Text('لا توجد حزم متاحة', + style: TextStyle( + color: _textPrimary, + fontSize: 15, + fontWeight: FontWeight.w600)), + const SizedBox(height: 6), + const Text('اسحب للأسفل لإعادة التحميل', + style: TextStyle(color: _textSecondary, fontSize: 12)), + ], + ), + ); + } + + // ─────────────────────────── UPDATE DIALOG ─────────────────────────── + void _showUpdateDialog( + BuildContext context, dynamic package, PackageController controller) { + controller.versionController.clear(); + + Get.dialog( + Dialog( + backgroundColor: Colors.transparent, + child: Container( + decoration: BoxDecoration( + color: _surfaceElevated, + borderRadius: BorderRadius.circular(24), + border: Border.all(color: _divider), + boxShadow: const [ + BoxShadow( + color: Colors.black54, + blurRadius: 30, + offset: Offset(0, 12), + ), + ], + ), + padding: const EdgeInsets.all(24), + child: Column( + mainAxisSize: MainAxisSize.min, + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + // Header + Row( + children: [ + Container( + padding: const EdgeInsets.all(10), + decoration: BoxDecoration( + color: _accent.withOpacity(0.12), + borderRadius: BorderRadius.circular(12), + border: Border.all(color: _accent.withOpacity(0.25)), + ), + child: const Icon(Icons.system_update_rounded, + color: _accent, size: 20), + ), + const SizedBox(width: 12), + Expanded( + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + const Text( + 'تحديث الإصدار', + style: TextStyle( + color: _textPrimary, + fontSize: 16, + fontWeight: FontWeight.w700, + ), + ), + Text( + package['appName']?.toString() ?? '', + style: const TextStyle( + color: _textSecondary, fontSize: 11), + ), + ], + ), + ), + ], + ), + + const SizedBox(height: 20), + Container(height: 1, color: _divider), + const SizedBox(height: 20), + + // Current info + Row( + children: [ + _buildInfoChip(Icons.devices_rounded, + package['platform']?.toString() ?? '', _info), + const SizedBox(width: 8), + _buildInfoChip(Icons.tag_rounded, + 'الحالي: ${package['version']}', _warning), + ], + ), + + const SizedBox(height: 18), + + // Input label + const Text( + 'الإصدار الجديد', + style: TextStyle( + color: _textSecondary, + fontSize: 11, + fontWeight: FontWeight.w600, + letterSpacing: 0.8, + ), + ), + const SizedBox(height: 8), + + // Text input + Container( + decoration: BoxDecoration( + color: _bg, + borderRadius: BorderRadius.circular(12), + border: Border.all(color: _divider), + ), + child: TextField( + controller: controller.versionController, + keyboardType: + const TextInputType.numberWithOptions(decimal: true), + style: const TextStyle( + color: _textPrimary, + fontSize: 15, + fontFamily: 'monospace', + fontWeight: FontWeight.w600, + ), + decoration: InputDecoration( + hintText: package['version'].toString(), + hintStyle: const TextStyle( + color: _textSecondary, + fontFamily: 'monospace', + ), + prefixIcon: + const Icon(Icons.tag_rounded, color: _accent, size: 18), + border: InputBorder.none, + contentPadding: const EdgeInsets.symmetric( + horizontal: 14, vertical: 14), + ), + ), + ), + + const SizedBox(height: 24), + + // Actions + Row( + children: [ + Expanded( + child: TextButton( + onPressed: () => Get.back(), + style: TextButton.styleFrom( + padding: const EdgeInsets.symmetric(vertical: 12), + shape: RoundedRectangleBorder( + borderRadius: BorderRadius.circular(12), + side: const BorderSide(color: _divider), + ), + ), + child: const Text( + 'إلغاء', + style: TextStyle(color: _textSecondary, fontSize: 13), + ), + ), + ), + const SizedBox(width: 12), + Expanded( + child: Obx(() => ElevatedButton.icon( + icon: controller.isLoading.value + ? const SizedBox( + width: 14, + height: 14, + child: CircularProgressIndicator( + color: Colors.white, + strokeWidth: 2, + ), + ) + : const Icon(Icons.check_rounded, size: 16), + label: Text( + controller.isLoading.value ? 'جاري...' : 'تحديث', + style: const TextStyle(fontSize: 13), + ), + style: ElevatedButton.styleFrom( + backgroundColor: _accent, + foregroundColor: _bg, + padding: const EdgeInsets.symmetric(vertical: 12), + shape: RoundedRectangleBorder( + borderRadius: BorderRadius.circular(12), + ), + elevation: 0, + ), + onPressed: controller.isLoading.value + ? null + : () async { + await controller.updatePackages( + package['id'].toString(), + controller.versionController.text, + ); + }, + )), + ), + ], + ), + ], + ), + ), + ), + ); + } + + Widget _buildInfoChip(IconData icon, String label, Color color) { + return Container( + padding: const EdgeInsets.symmetric(horizontal: 10, vertical: 6), + decoration: BoxDecoration( + color: color.withOpacity(0.08), + borderRadius: BorderRadius.circular(8), + border: Border.all(color: color.withOpacity(0.2)), + ), + child: Row( + mainAxisSize: MainAxisSize.min, + children: [ + Icon(icon, color: color, size: 13), + const SizedBox(width: 5), + Text( + label, + style: TextStyle( + color: color, + fontSize: 11, + fontWeight: FontWeight.w600, + ), + ), + ], + ), + ); + } +} + +// ══════════════════════════════════════════════════════════════ +// CONTROLLER +// ══════════════════════════════════════════════════════════════ +class PackageController extends GetxController { + List packages = []; + var isLoading = false.obs; + final versionController = TextEditingController(); + final formKey = GlobalKey(); + + @override + void onInit() { + super.onInit(); + fetchPackages(); + } + + fetchPackages() async { + isLoading.value = true; + var response = await CRUD().get(link: AppLink.getPackages, payload: {}); + + if (response is String && (response == 'failure' || response == 'token_expired')) { + isLoading.value = false; + return; + } + + try { + var jsonData = response is String ? jsonDecode(response) : response; + packages = jsonData['message'] ?? []; + Log.print('✅ Decoded packages: ${packages.length} items'); + update(); + } catch (e) { + Log.print('❌ Error parsing packages: $e'); + } + isLoading.value = false; + } + + updatePackages(String id, String version) async { + if (version.trim().isEmpty) { + Get.snackbar( + 'تنبيه', + 'يرجى إدخال رقم الإصدار', + backgroundColor: _warning.withOpacity(0.15), + colorText: _textPrimary, + borderRadius: 12, + margin: const EdgeInsets.all(16), + icon: const Icon(Icons.warning_rounded, color: _warning), + ); + return; + } + + isLoading.value = true; + var response = await CRUD().post( + link: AppLink.updatePackages, + payload: {"id": id, "version": version}, + ); + Log.print('response: $response'); + isLoading.value = false; + + if (response != 'failure') { + Get.back(); + Get.snackbar( + 'تم التحديث', + 'تم تحديث الإصدار بنجاح', + backgroundColor: _accent.withOpacity(0.15), + colorText: _textPrimary, + borderRadius: 12, + margin: const EdgeInsets.all(16), + icon: const Icon(Icons.check_circle_rounded, color: _accent), + ); + fetchPackages(); + } else { + Get.snackbar( + 'خطأ', + 'فشل التحديث، يرجى المحاولة مجدداً', + backgroundColor: _danger.withOpacity(0.15), + colorText: _textPrimary, + borderRadius: 12, + margin: const EdgeInsets.all(16), + icon: const Icon(Icons.error_rounded, color: _danger), + ); + } + } +} diff --git a/siro_admin/lib/views/admin/passenger/form_passenger.dart b/siro_admin/lib/views/admin/passenger/form_passenger.dart new file mode 100644 index 0000000..886a320 --- /dev/null +++ b/siro_admin/lib/views/admin/passenger/form_passenger.dart @@ -0,0 +1,86 @@ +import 'package:flutter/material.dart'; +import 'package:get/get.dart'; + +import '../../../constant/colors.dart'; +import '../../../constant/style.dart'; +import '../../../controller/admin/passenger_admin_controller.dart'; +import '../../widgets/elevated_btn.dart'; +import 'passenger_details_page.dart'; + +GetBuilder formSearchPassengers() { + // DbSql sql = DbSql.instance; + return GetBuilder( + builder: (controller) => Column( + children: [ + Padding( + padding: const EdgeInsets.all(16), + child: Container( + decoration: + const BoxDecoration(color: AppColor.secondaryColor), + child: TextField( + decoration: InputDecoration( + border: const OutlineInputBorder( + borderRadius: BorderRadius.only(), + gapPadding: 4, + borderSide: BorderSide( + color: AppColor.redColor, + width: 2, + )), + suffixIcon: InkWell( + onTap: () async { + if (controller.passengerController.text.length > + 4) { + await controller.getPassengers(); + + Get.defaultDialog( + title: controller.passengers['message'][0] + ['email'], + titleStyle: AppStyle.title, + content: Column( + mainAxisAlignment: + MainAxisAlignment.spaceBetween, + children: [ + Text( + 'Name is ${controller.passengers['message'][0]['first_name']} ${controller.passengers['message'][0]['last_name']}', + style: AppStyle.title, + ), + Text( + 'phone is ${controller.passengers['message'][0]['phone']}', + style: AppStyle.title, + ), + ], + ), + confirm: MyElevatedButton( + title: 'Go To Details'.tr, + onPressed: () { + Get.to( + () => const PassengerDetailsPage(), + arguments: { + 'data': controller + .passengers['message'][0], + }); + })); + } + }, + child: const Icon(Icons.search)), + hintText: 'Search for Passenger'.tr, + hintStyle: AppStyle.title, + hintMaxLines: 1, + prefixIcon: IconButton( + onPressed: () async { + controller.passengerController.clear(); + controller.clearPlaces(); + }, + icon: Icon( + Icons.clear, + color: Colors.red[300], + ), + ), + ), + controller: controller.passengerController, + ), + ), + ) + ], + )); +} diff --git a/siro_admin/lib/views/admin/passenger/passenger.dart b/siro_admin/lib/views/admin/passenger/passenger.dart new file mode 100644 index 0000000..fbf15b6 --- /dev/null +++ b/siro_admin/lib/views/admin/passenger/passenger.dart @@ -0,0 +1,390 @@ +import 'package:flutter/material.dart'; +import 'package:get/get.dart'; + +import '../../../constant/box_name.dart'; +import '../../../constant/colors.dart'; +import '../../../constant/style.dart'; +import '../../../controller/admin/passenger_admin_controller.dart'; +import '../../../main.dart'; // للوصول إلى box +import '../../widgets/elevated_btn.dart'; +import '../../widgets/my_scafold.dart'; +import '../../widgets/my_textField.dart'; +import '../../widgets/mycircular.dart'; +import 'passenger_details_page.dart'; + +class Passengrs extends StatelessWidget { + Passengrs({super.key}); + + final PassengerAdminController passengerAdminController = + Get.put(PassengerAdminController()); + + @override + Widget build(BuildContext context) { + // 1. منطق السوبر أدمن + String myPhone = box.read(BoxName.adminPhone).toString(); + bool isSuperAdmin = myPhone == '963942542053' || myPhone == '963992952235'; + + return MyScafolld( + title: 'Passengers Management'.tr, + isleading: true, + body: [ + // استخدام Expanded أو Container بطول الشاشة لتجنب المشاكل + SizedBox( + height: Get.height, // تأمين مساحة العمل + child: GetBuilder( + builder: (controller) { + if (controller.isLoading) { + return const Center(child: MyCircularProgressIndicator()); + } + + return Column( + children: [ + // --- قسم الإحصائيات والجوائز (Dashboard) --- + Padding( + padding: const EdgeInsets.all(16.0), + child: _buildDashboardCard(context, controller), + ), + + // --- عنوان القائمة --- + Padding( + padding: const EdgeInsets.symmetric(horizontal: 20.0), + child: Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + Text( + "All Passengers".tr, + style: AppStyle.title.copyWith( + fontSize: 18, fontWeight: FontWeight.bold), + ), + Text( + "${controller.passengersData['message']?.length ?? 0} Users", + style: + TextStyle(color: Colors.grey[600], fontSize: 12), + ), + ], + ), + ), + const SizedBox(height: 10), + + // --- قائمة الركاب --- + // استخدام Expanded هنا هو الحل الجذري لمكلة Overflow + Expanded( + child: _buildPassengersList(controller, isSuperAdmin), + ), + + // مساحة سفلية صغيرة لضمان عدم التصاق القائمة بالحافة + const SizedBox(height: 20), + ], + ); + }, + ), + ), + ], + ); + } + + // --- تصميم بطاقة الإحصائيات (Dashboard) --- + Widget _buildDashboardCard( + BuildContext context, PassengerAdminController controller) { + // جلب العدد بأمان + final String countValue = (controller.passengersData['message'] != null && + controller.passengersData['message'].isNotEmpty) + ? controller.passengersData['message'][0]['countPassenger'] + ?.toString() ?? + '0' + : '0'; + + return Container( + padding: const EdgeInsets.all(20), + decoration: BoxDecoration( + color: Colors.white, + borderRadius: BorderRadius.circular(20), + boxShadow: [ + BoxShadow( + color: Colors.grey.withOpacity(0.1), + blurRadius: 15, + offset: const Offset(0, 5), + ), + ], + ), + child: Column( + children: [ + Row( + children: [ + Container( + padding: const EdgeInsets.all(12), + decoration: BoxDecoration( + color: AppColor.primaryColor.withOpacity(0.1), + shape: BoxShape.circle, + ), + child: Icon(Icons.groups_rounded, + color: AppColor.primaryColor, size: 30), + ), + const SizedBox(width: 15), + Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Text( + 'Total Passengers'.tr, + style: const TextStyle(fontSize: 14, color: Colors.grey), + ), + Text( + countValue, + style: const TextStyle( + fontSize: 24, fontWeight: FontWeight.bold), + ), + ], + ), + ], + ), + const SizedBox(height: 20), + SizedBox( + width: double.infinity, + height: 45, + child: ElevatedButton.icon( + icon: const Icon(Icons.card_giftcard, + color: Colors.white, size: 20), + label: Text('Add Prize to Gold Passengers'.tr, + style: const TextStyle( + color: Colors.white, fontWeight: FontWeight.bold)), + style: ElevatedButton.styleFrom( + backgroundColor: AppColor.yellowColor, // لون ذهبي + shape: RoundedRectangleBorder( + borderRadius: BorderRadius.circular(12)), + elevation: 0, + ), + onPressed: () { + _showAddPrizeDialog(controller); + }, + ), + ), + ], + ), + ); + } + + // --- بناء قائمة الركاب --- + Widget _buildPassengersList( + PassengerAdminController controller, bool isSuperAdmin) { + final List passengers = controller.passengersData['message'] ?? []; + + if (passengers.isEmpty) { + return Center( + child: Column( + mainAxisAlignment: MainAxisAlignment.center, + children: [ + Icon(Icons.person_off_outlined, size: 60, color: Colors.grey[300]), + const SizedBox(height: 10), + Text("No passengers found".tr, + style: TextStyle(color: Colors.grey[400])), + ], + ), + ); + } + + return ListView.separated( + padding: const EdgeInsets.symmetric(horizontal: 16), + physics: const BouncingScrollPhysics(), + itemCount: passengers.length, + separatorBuilder: (context, index) => const SizedBox(height: 12), + itemBuilder: (context, index) { + final user = passengers[index]; + return _buildPassengerItem(user, isSuperAdmin); + }, + ); + } + + // --- عنصر الراكب الواحد (Card) --- + Widget _buildPassengerItem(dynamic user, bool isSuperAdmin) { + String firstName = user['first_name'] ?? ''; + String lastName = user['last_name'] ?? ''; + String fullName = '$firstName $lastName'.trim(); + if (fullName.isEmpty) fullName = 'Unknown User'; + + return Container( + decoration: BoxDecoration( + color: Colors.white, + borderRadius: BorderRadius.circular(15), + border: Border.all(color: Colors.grey.withOpacity(0.1)), + boxShadow: [ + BoxShadow( + color: Colors.grey.withOpacity(0.05), + blurRadius: 5, + offset: const Offset(0, 2), + ), + ], + ), + child: Material( + color: Colors.transparent, + child: InkWell( + borderRadius: BorderRadius.circular(15), + onTap: () { + // الانتقال للتفاصيل مع تمرير صلاحية الأدمن + Get.to( + () => const PassengerDetailsPage(), + arguments: {'data': user, 'isSuperAdmin': isSuperAdmin}, + ); + }, + child: Padding( + padding: const EdgeInsets.all(12.0), + child: Row( + children: [ + // Avatar + CircleAvatar( + radius: 25, + backgroundColor: AppColor.primaryColor.withOpacity(0.1), + child: Text( + fullName.isNotEmpty ? fullName[0].toUpperCase() : 'U', + style: TextStyle( + color: AppColor.primaryColor, + fontWeight: FontWeight.bold, + fontSize: 18), + ), + ), + const SizedBox(width: 15), + + // Info + Expanded( + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Text( + fullName, + style: const TextStyle( + fontWeight: FontWeight.bold, fontSize: 16), + ), + const SizedBox(height: 4), + + // Stats Row + Row( + children: [ + Icon(Icons.star_rounded, + size: 16, color: Colors.amber[700]), + Text( + " ${user['ratingPassenger'] ?? '0.0'} ", + style: const TextStyle( + fontSize: 12, fontWeight: FontWeight.bold), + ), + const SizedBox(width: 8), + Icon(Icons.directions_car, + size: 14, color: Colors.grey[400]), + Text( + " ${user['countPassengerRide'] ?? '0'} Trips", + style: TextStyle( + fontSize: 12, color: Colors.grey[600]), + ), + ], + ), + + const SizedBox(height: 4), + // Phone Number (Masked logic) + Row( + children: [ + Icon(Icons.phone_iphone, + size: 12, color: Colors.grey[400]), + const SizedBox(width: 4), + Text( + _formatPhoneNumber( + user['phone'].toString(), isSuperAdmin), + style: TextStyle( + fontSize: 12, + color: Colors.grey[500], + fontFamily: 'monospace'), + ), + ], + ), + + // Email (Show only if Super Admin) + if (isSuperAdmin && user['email'] != null) ...[ + const SizedBox(height: 2), + Text( + user['email'], + style: + TextStyle(fontSize: 10, color: Colors.grey[400]), + maxLines: 1, + overflow: TextOverflow.ellipsis, + ) + ] + ], + ), + ), + + // Arrow + Icon(Icons.arrow_forward_ios_rounded, + size: 16, color: Colors.grey[300]), + ], + ), + ), + ), + ), + ); + } + + // --- دالة تنسيق الرقم (إظهار آخر 4 أرقام لغير الأدمن) --- + String _formatPhoneNumber(String phone, bool isSuperAdmin) { + if (isSuperAdmin) return phone; // إظهار الرقم كاملاً للسوبر أدمن + + // لغير الأدمن + if (phone.length <= 4) return phone; + String lastFour = phone.substring(phone.length - 4); + String masked = '*' * (phone.length - 4); + return '$masked$lastFour'; // النتيجة: *******5678 + } + + // --- دالة إضافة الجوائز --- + void _showAddPrizeDialog(PassengerAdminController controller) { + // التحقق من يوم السبت + if (DateTime.now().weekday == DateTime.saturday) { + Get.defaultDialog( + title: 'Add Prize'.tr, + titleStyle: const TextStyle(fontWeight: FontWeight.bold, fontSize: 18), + contentPadding: const EdgeInsets.all(20), + content: Form( + key: controller.formPrizeKey, + child: Column( + children: [ + Text( + 'Add Points to Gold Passengers wallet'.tr, + textAlign: TextAlign.center, + style: TextStyle(fontSize: 14, color: Colors.grey[700]), + ), + const SizedBox(height: 20), + MyTextForm( + controller: controller.passengerPrizeController, + label: 'Prize Amount'.tr, + hint: '1000...', + type: TextInputType.number, + ), + ], + ), + ), + confirm: SizedBox( + width: 120, + child: MyElevatedButton( + title: 'Add', + onPressed: () async { + if (controller.formPrizeKey.currentState!.validate()) { + controller.addPassengerPrizeToWalletSecure(); + Get.back(); + } + }, + ), + ), + cancel: TextButton( + onPressed: () => Get.back(), + child: + Text('Cancel'.tr, style: const TextStyle(color: Colors.grey))), + ); + } else { + Get.snackbar( + 'Not Allowed'.tr, + 'Prizes can only be added on Saturdays.'.tr, + backgroundColor: Colors.red.withOpacity(0.1), + colorText: Colors.red, + icon: const Icon(Icons.error_outline, color: Colors.red), + snackPosition: SnackPosition.TOP, + margin: const EdgeInsets.all(10), + ); + } + } +} diff --git a/siro_admin/lib/views/admin/passenger/passenger_details_page.dart b/siro_admin/lib/views/admin/passenger/passenger_details_page.dart new file mode 100644 index 0000000..e2a678d --- /dev/null +++ b/siro_admin/lib/views/admin/passenger/passenger_details_page.dart @@ -0,0 +1,458 @@ +import 'package:flutter/material.dart'; +import 'package:get/get.dart'; + +import '../../../constant/box_name.dart'; +import '../../../constant/colors.dart'; +import '../../../controller/admin/passenger_admin_controller.dart'; +import '../../../controller/functions/crud.dart'; +import '../../../controller/firebase/firbase_messge.dart'; +import '../../../constant/links.dart'; +import '../../../main.dart'; // To access 'box' for admin phone check +import '../../widgets/elevated_btn.dart'; +import '../../widgets/my_scafold.dart'; +import '../../widgets/my_textField.dart'; +import 'form_passenger.dart'; + +class PassengerDetailsPage extends StatelessWidget { + const PassengerDetailsPage({super.key}); + + @override + Widget build(BuildContext context) { + final Map data = Get.arguments['data']; + final controller = Get.find(); + + // 1. Define Super Admin Logic (Same as Captains Page) + String myPhone = box.read(BoxName.adminPhone).toString(); + bool isSuperAdmin = myPhone == '963942542053' || myPhone == '963992952235'; + + return MyScafolld( + title: 'Passenger Profile'.tr, + isleading: true, + body: [ + SingleChildScrollView( + padding: const EdgeInsets.only(bottom: 40), + child: Column( + children: [ + // --- Header Section (Avatar & Name) --- + _buildHeaderSection(context, data), + + const SizedBox(height: 20), + + Padding( + padding: const EdgeInsets.symmetric(horizontal: 16.0), + child: Column( + children: [ + // --- Personal Information Card --- + _buildInfoCard( + title: 'Personal Information', + icon: Icons.person, + children: [ + _buildDetailTile( + Icons.email_outlined, + 'Email', + isSuperAdmin + ? data['email'] + : _maskEmail(data['email']), + ), + _buildDetailTile( + Icons.phone_iphone, + 'Phone', + _formatPhoneNumber( + data['phone'].toString(), isSuperAdmin), + ), + _buildDetailTile( + Icons.transgender, + 'Gender', + data['gender'] ?? 'Not specified', + ), + _buildDetailTile( + Icons.cake_outlined, + 'Birthdate', + data['birthdate'] ?? 'N/A', + ), + _buildDetailTile( + Icons.location_on_outlined, + 'Site', + data['site'] ?? 'N/A', + ), + // SOS Phone is critical, usually shown, but we can mask it too if needed + _buildDetailTile( + Icons.sos, + 'SOS Phone', + data['sosPhone'] ?? 'N/A', + valueColor: Colors.redAccent, + ), + ], + ), + const SizedBox(height: 16), + + // --- Ride Statistics Card --- + _buildInfoCard( + title: 'Activity & Stats', + icon: Icons.bar_chart_rounded, + children: [ + _buildDetailTile( + Icons.star_rate_rounded, + 'Rating', + '${data['ratingPassenger'] ?? 0.0}', + valueColor: Colors.amber[700], + ), + _buildDetailTile( + Icons.directions_car_filled_outlined, + 'Total Rides', + data['countPassengerRide'], + ), + _buildDetailTile( + Icons.cancel_outlined, + 'Canceled Rides', + data['countPassengerCancel'], + valueColor: Colors.redAccent, + ), + _buildDetailTile( + Icons.rate_review_outlined, + 'Feedback Given', + data['countFeedback'], + ), + ], + ), + const SizedBox(height: 30), + + // --- Action Buttons --- + _buildActionButtons( + context, controller, data, isSuperAdmin), + ], + ), + ), + ], + ), + ), + ], + ); + } + + // --- Header with Gradient/White Background --- + Widget _buildHeaderSection(BuildContext context, Map data) { + String firstName = data['first_name'] ?? ''; + String lastName = data['last_name'] ?? ''; + String fullName = '$firstName $lastName'.trim(); + if (fullName.isEmpty) fullName = "Passenger"; + + return Container( + width: double.infinity, + padding: const EdgeInsets.symmetric(vertical: 25), + decoration: BoxDecoration( + color: Colors.white, + boxShadow: [ + BoxShadow( + color: Colors.grey.withOpacity(0.1), + blurRadius: 10, + offset: const Offset(0, 5), + ) + ], + borderRadius: const BorderRadius.vertical(bottom: Radius.circular(30)), + ), + child: Column( + children: [ + CircleAvatar( + radius: 45, + backgroundColor: AppColor.primaryColor.withOpacity(0.1), + child: Text( + fullName[0].toUpperCase(), + style: TextStyle( + fontSize: 35, + fontWeight: FontWeight.bold, + color: AppColor.primaryColor), + ), + ), + const SizedBox(height: 12), + Text( + fullName, + style: const TextStyle( + fontSize: 22, + fontWeight: FontWeight.bold, + color: Colors.black87), + ), + const SizedBox(height: 4), + Container( + padding: const EdgeInsets.symmetric(horizontal: 12, vertical: 4), + decoration: BoxDecoration( + color: Colors.blue.withOpacity(0.1), + borderRadius: BorderRadius.circular(20), + ), + child: Text( + data['status'] ?? 'Active', + style: const TextStyle( + fontSize: 12, + color: Colors.blue, + fontWeight: FontWeight.w600), + ), + ), + ], + ), + ); + } + + Widget _buildInfoCard( + {required String title, + required IconData icon, + required List children}) { + return Container( + padding: const EdgeInsets.all(16), + decoration: BoxDecoration( + color: Colors.white, + borderRadius: BorderRadius.circular(16), + boxShadow: [ + BoxShadow( + color: Colors.grey.withOpacity(0.05), + spreadRadius: 2, + blurRadius: 10) + ], + border: Border.all(color: Colors.grey.withOpacity(0.1)), + ), + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Row( + children: [ + Icon(icon, color: AppColor.primaryColor, size: 22), + const SizedBox(width: 10), + Text(title.tr, + style: const TextStyle( + fontSize: 17, fontWeight: FontWeight.bold)), + ], + ), + Divider(height: 25, color: Colors.grey.withOpacity(0.2)), + ...children, + ], + ), + ); + } + + Widget _buildDetailTile(IconData icon, String label, dynamic value, + {Color? valueColor}) { + return Padding( + padding: const EdgeInsets.symmetric(vertical: 8.0), + child: Row( + children: [ + Container( + padding: const EdgeInsets.all(8), + decoration: BoxDecoration( + color: Colors.grey[100], + borderRadius: BorderRadius.circular(8)), + child: Icon(icon, color: Colors.grey[600], size: 18), + ), + const SizedBox(width: 14), + Expanded( + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Text(label.tr, + style: TextStyle(fontSize: 12, color: Colors.grey[500])), + Text( + value?.toString() ?? 'N/A', + style: TextStyle( + fontSize: 15, + fontWeight: FontWeight.w600, + color: valueColor ?? Colors.black87), + overflow: TextOverflow.ellipsis, + ), + ], + ), + ), + ], + ), + ); + } + + Widget _buildActionButtons( + BuildContext context, + PassengerAdminController controller, + Map data, + bool isSuperAdmin) { + return Column( + children: [ + // --- Send Notification (For All Admins) --- + SizedBox( + width: double.infinity, + height: 50, + child: ElevatedButton.icon( + icon: const Icon(Icons.notifications_active_outlined, + color: Colors.white), + label: Text("Send Notification".tr, + style: const TextStyle(color: Colors.white, fontSize: 16)), + style: ElevatedButton.styleFrom( + backgroundColor: AppColor.primaryColor, + shape: RoundedRectangleBorder( + borderRadius: BorderRadius.circular(12)), + ), + onPressed: () => _showSendNotificationDialog(controller, data), + ), + ), + + // --- Edit/Delete (Super Admin Only) --- + if (isSuperAdmin) ...[ + const SizedBox(height: 16), + Row( + children: [ + Expanded( + child: ElevatedButton.icon( + icon: const Icon(Icons.edit_note_rounded, size: 20), + label: Text("Edit".tr), + style: ElevatedButton.styleFrom( + backgroundColor: Colors.white, + foregroundColor: AppColor.yellowColor, + elevation: 0, + side: BorderSide(color: AppColor.yellowColor), + shape: RoundedRectangleBorder( + borderRadius: BorderRadius.circular(12)), + padding: const EdgeInsets.symmetric(vertical: 12), + ), + onPressed: () { + // Get.to(() => const FormPassenger(), arguments: { + // 'isEditMode': true, + // 'passengerData': data, + // }); + }, + ), + ), + const SizedBox(width: 16), + Expanded( + child: ElevatedButton.icon( + icon: const Icon(Icons.delete_outline_rounded, size: 20), + label: Text("Delete".tr), + style: ElevatedButton.styleFrom( + backgroundColor: Colors.red[50], + foregroundColor: Colors.red, + elevation: 0, + shape: RoundedRectangleBorder( + borderRadius: BorderRadius.circular(12)), + padding: const EdgeInsets.symmetric(vertical: 12), + ), + onPressed: () => _showDeleteConfirmation(data), + ), + ), + ], + ), + ] else ...[ + // Message for normal admins + const SizedBox(height: 15), + Text( + "Only Super Admins can edit or delete passengers.", + style: TextStyle( + color: Colors.grey[400], + fontSize: 12, + fontStyle: FontStyle.italic), + ) + ], + ], + ); + } + + // --- Helper: Format Phone (Last 4 digits for normal admin) --- + String _formatPhoneNumber(String phone, bool isSuperAdmin) { + if (isSuperAdmin) return phone; + if (phone.length <= 4) return phone; + return '${'*' * (phone.length - 4)}${phone.substring(phone.length - 4)}'; + } + + // --- Helper: Mask Email --- + String _maskEmail(String? email) { + if (email == null || email.isEmpty) return 'N/A'; + int atIndex = email.indexOf('@'); + if (atIndex <= 1) return email; // Too short to mask + return '${email.substring(0, 2)}****${email.substring(atIndex)}'; + } + + void _showSendNotificationDialog( + PassengerAdminController controller, Map data) { + Get.defaultDialog( + title: 'Send Notification'.tr, + titleStyle: const TextStyle(fontWeight: FontWeight.bold), + content: Form( + key: controller.formPrizeKey, + child: Column( + children: [ + MyTextForm( + controller: controller.titleNotify, + label: 'Title'.tr, + hint: 'Notification title'.tr, + type: TextInputType.text), + const SizedBox(height: 10), + MyTextForm( + controller: controller.bodyNotify, + label: 'Body'.tr, + hint: 'Message body'.tr, + type: TextInputType.text) + ], + ), + ), + confirm: SizedBox( + width: 100, + child: MyElevatedButton( + title: 'Send', + onPressed: () { + // Validate form safely + if (controller.formPrizeKey.currentState?.validate() ?? false) { + FirebaseMessagesController().sendNotificationToAnyWithoutData( + controller.titleNotify.text, + controller.bodyNotify.text, + data['passengerToken'], + 'order.wav'); + Get.back(); + Get.snackbar('Success', 'Notification sent successfully!', + backgroundColor: Colors.green.withOpacity(0.2)); + } + }, + ), + ), + cancel: TextButton( + onPressed: () => Get.back(), + child: Text('Cancel'.tr, style: const TextStyle(color: Colors.grey))), + ); + } + + void _showDeleteConfirmation(Map user) { + Get.defaultDialog( + title: 'Confirm Deletion'.tr, + titleStyle: + const TextStyle(color: Colors.redAccent, fontWeight: FontWeight.bold), + middleText: + 'Are you sure you want to delete ${user['first_name']}? This action cannot be undone.' + .tr, + confirm: ElevatedButton( + style: ElevatedButton.styleFrom(backgroundColor: Colors.redAccent), + onPressed: () async { + // 1. Close Dialog + Get.back(); + + // 2. Perform Delete Operation + var res = await CRUD().post( + link: AppLink.admin_delete_and_blacklist_passenger, + payload: { + 'id': user['id'], + 'phone': user['phone'], + 'reason': 'Deleted by admin', + }, + ); + + // 3. Handle Result + if (res['status'] == 'success') { + Get.back(); // Go back to list page + Get.snackbar('Deleted', 'Passenger removed successfully', + backgroundColor: Colors.red.withOpacity(0.2)); + // Ideally, trigger a refresh on the controller here + // Get.find().getAll(); + } else { + Get.snackbar('Error', res['message'] ?? 'Failed to delete', + backgroundColor: Colors.red.withOpacity(0.2)); + } + }, + child: Text('Delete'.tr, style: const TextStyle(color: Colors.white)), + ), + cancel: TextButton( + onPressed: () => Get.back(), + child: Text('Cancel'.tr, style: const TextStyle(color: Colors.grey)), + ), + ); + } +} diff --git a/siro_admin/lib/views/admin/pricing/kazan_editor_page.dart b/siro_admin/lib/views/admin/pricing/kazan_editor_page.dart new file mode 100644 index 0000000..c48399b --- /dev/null +++ b/siro_admin/lib/views/admin/pricing/kazan_editor_page.dart @@ -0,0 +1,254 @@ +import 'package:flutter/material.dart'; +import 'package:get/get.dart'; +import '../../../constant/colors.dart'; +import '../../../constant/style.dart'; +import '../../../controller/admin/kazan_controller.dart'; +import '../../widgets/my_scafold.dart'; +import '../../widgets/elevated_btn.dart'; + +class KazanEditorPage extends StatelessWidget { + KazanEditorPage({super.key}); + + final KazanController controller = Get.put(KazanController()); + + @override + Widget build(BuildContext context) { + return MyScafolld( + title: 'تعديل أسعار كازان'.tr, + isleading: true, + body: [ + Obx(() => controller.isLoading.value && controller.kazanData.isEmpty + ? const Center(child: CircularProgressIndicator()) + : SingleChildScrollView( + padding: const EdgeInsets.all(16), + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + _buildSectionHeader('النسب العامة'), + _buildKazanCard(), + const SizedBox(height: 24), + _buildSectionHeader('أسعار الفئات الإضافية'), + _buildPricesGrid(), + const SizedBox(height: 32), + MyElevatedButton( + title: 'حفظ جميع التعديلات', + icon: Icons.save_rounded, + onPressed: () => _handleSave(), + ), + const SizedBox(height: 100), + ], + ), + )), + ], + ); + } + + Widget _buildSectionHeader(String title) { + return Padding( + padding: const EdgeInsets.only(bottom: 12, left: 4), + child: Text( + title, + style: AppStyle.title.copyWith(color: AppColor.accent), + ), + ); + } + + Widget _buildKazanCard() { + return Container( + padding: const EdgeInsets.all(20), + decoration: AppStyle.cardDecoration, + child: Column( + children: [ + _buildSliderItem( + 'نسبة كازان العامة', + 'kazan', + 'النسبة المئوية التي تقتطعها المنصة من كل رحلة', + Icons.percent_rounded, + ), + const Divider(height: 32, color: AppColor.divider), + _buildPriceInputRow( + 'سعر الوقود المرجعي', + 'fuelPrice', + 'السعر المستخدم في حسابات تعويض الوقود', + Icons.local_gas_station_rounded, + ), + ], + ), + ); + } + + Widget _buildPriceInputRow(String title, String key, String desc, IconData icon) { + final TextEditingController textController = TextEditingController( + text: controller.kazanData[key]?.toString() ?? '0' + ); + + return Padding( + padding: const EdgeInsets.symmetric(vertical: 4), + child: Row( + children: [ + Icon(icon, size: 20, color: AppColor.accent), + const SizedBox(width: 8), + Expanded( + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Text(title, style: AppStyle.body.copyWith(fontWeight: FontWeight.bold)), + Text(desc, style: AppStyle.caption.copyWith(fontSize: 10)), + ], + ), + ), + Container( + width: 100, + height: 40, + decoration: BoxDecoration( + color: AppColor.surfaceElevated, + borderRadius: BorderRadius.circular(8), + border: Border.all(color: AppColor.divider), + ), + child: TextField( + controller: textController, + keyboardType: TextInputType.number, + textAlign: TextAlign.center, + style: AppStyle.number.copyWith(fontSize: 16, color: AppColor.accent), + decoration: const InputDecoration( + border: InputBorder.none, + isDense: true, + contentPadding: EdgeInsets.symmetric(vertical: 10), + ), + onChanged: (val) => controller.kazanData[key] = val, + ), + ), + const SizedBox(width: 8), + Text('ل.س', style: AppStyle.caption), + ], + ), + ); + } + + Widget _buildPricesGrid() { + final Map priceFields = { + 'comfortPrice': {'label': 'Comfort', 'icon': Icons.chair_rounded}, + 'speedPrice': {'label': 'Speed', 'icon': Icons.flash_on_rounded}, + 'familyPrice': {'label': 'Family', 'icon': Icons.groups_rounded}, + 'deliveryPrice': {'label': 'Delivery', 'icon': Icons.delivery_dining_rounded}, + 'freePrice': {'label': 'Free', 'icon': Icons.money_off_rounded}, + 'latePrice': {'label': 'Late Night', 'icon': Icons.nightlight_round}, + 'heavyPrice': {'label': 'Heavy Load', 'icon': Icons.inventory_2_rounded}, + 'naturePrice': {'label': 'Nature', 'icon': Icons.forest_rounded}, + }; + + return Container( + decoration: AppStyle.cardDecoration, + padding: const EdgeInsets.all(12), + child: GridView.builder( + shrinkWrap: true, + physics: const NeverScrollableScrollPhysics(), + gridDelegate: const SliverGridDelegateWithFixedCrossAxisCount( + crossAxisCount: 2, + childAspectRatio: 2.5, + crossAxisSpacing: 8, + mainAxisSpacing: 8, + ), + itemCount: priceFields.length, + itemBuilder: (context, index) { + String key = priceFields.keys.elementAt(index); + var field = priceFields[key]; + return _buildCompactPriceInputCard(key, field['label'], field['icon']); + }, + ), + ); + } + + Widget _buildCompactPriceInputCard(String key, String label, IconData icon) { + final TextEditingController textController = TextEditingController( + text: controller.kazanData[key]?.toString() ?? '0' + ); + + return Container( + padding: const EdgeInsets.symmetric(horizontal: 8, vertical: 4), + decoration: BoxDecoration( + color: AppColor.surfaceElevated, + borderRadius: BorderRadius.circular(8), + border: Border.all(color: AppColor.divider.withAlpha(100)), + ), + child: Row( + children: [ + Icon(icon, size: 16, color: AppColor.textSecondary), + const SizedBox(width: 6), + Expanded( + child: Text(label, style: AppStyle.caption.copyWith(fontSize: 11), overflow: TextOverflow.ellipsis), + ), + SizedBox( + width: 50, + child: TextField( + controller: textController, + keyboardType: TextInputType.number, + textAlign: TextAlign.center, + style: AppStyle.number.copyWith(fontSize: 14), + decoration: const InputDecoration( + border: InputBorder.none, + isDense: true, + contentPadding: EdgeInsets.zero, + ), + onChanged: (val) => controller.kazanData[key] = val, + ), + ), + ], + ), + ); + } + + Widget _buildSliderItem(String title, String key, String desc, IconData icon) { + double value = double.tryParse(controller.kazanData[key]?.toString() ?? '0') ?? 0; + + return Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + Row( + children: [ + Icon(icon, size: 18, color: AppColor.accent), + const SizedBox(width: 8), + Text(title, style: AppStyle.title), + ], + ), + Text( + '${value.toInt()}%', + style: AppStyle.number.copyWith(fontSize: 18), + ), + ], + ), + const SizedBox(height: 4), + Text(desc, style: AppStyle.caption), + Slider( + value: value.clamp(0, 100), + min: 0, + max: 100, + activeColor: AppColor.accent, + inactiveColor: AppColor.divider, + onChanged: (val) { + controller.kazanData[key] = val.toInt().toString(); + }, + ), + ], + ); + } + + void _handleSave() async { + final data = Map.from(controller.kazanData); + data['adminId'] = 'admin'; // Should be dynamic from auth service + data['country'] = 'syria'; + + bool success = await controller.updateKazan(data); + if (success) { + Get.snackbar("نجاح", "تم تحديث الأسعار بنجاح", + backgroundColor: AppColor.successSoft, + colorText: AppColor.textPrimary, + snackPosition: SnackPosition.BOTTOM, + margin: const EdgeInsets.all(16) + ); + } + } +} diff --git a/siro_admin/lib/views/admin/promo/promo_management_page.dart b/siro_admin/lib/views/admin/promo/promo_management_page.dart new file mode 100644 index 0000000..2e583bc --- /dev/null +++ b/siro_admin/lib/views/admin/promo/promo_management_page.dart @@ -0,0 +1,269 @@ +import 'package:flutter/material.dart'; +import 'package:get/get.dart'; +import '../../../constant/colors.dart'; +import '../../../constant/style.dart'; +import '../../../controller/admin/promo_controller.dart'; +import '../../widgets/my_scafold.dart'; +import '../../widgets/elevated_btn.dart'; +import '../../widgets/my_textField.dart'; +import '../../widgets/mydialoug.dart'; + +class PromoManagementPage extends StatelessWidget { + PromoManagementPage({super.key}); + + final PromoController controller = Get.put(PromoController()); + + @override + Widget build(BuildContext context) { + return MyScafolld( + title: 'إدارة أكواد الخصم'.tr, + isleading: true, + action: IconButton( + icon: const Icon(Icons.add_circle_outline_rounded, color: AppColor.accent), + onPressed: () => _showPromoSheet(context), + ), + body: [ + Obx(() => controller.isLoading.value && controller.promoList.isEmpty + ? const Center(child: CircularProgressIndicator()) + : controller.promoList.isEmpty + ? Center( + child: Column( + mainAxisAlignment: MainAxisAlignment.center, + children: [ + Icon(Icons.confirmation_number_outlined, size: 64, color: AppColor.textMuted), + const SizedBox(height: 16), + Text('لا يوجد أكواد خصم حالياً', style: AppStyle.subtitle), + ], + ), + ) + : RefreshIndicator( + onRefresh: () => controller.getPromos(), + child: ListView.builder( + padding: const EdgeInsets.fromLTRB(16, 16, 16, 80), + itemCount: controller.promoList.length, + itemBuilder: (context, index) { + final promo = controller.promoList[index]; + return _buildPromoCard(context, promo); + }, + ), + )), + ], + ); + } + + Widget _buildPromoCard(BuildContext context, dynamic promo) { + return Container( + margin: const EdgeInsets.only(bottom: 12), + decoration: AppStyle.cardDecoration, + child: ListTile( + contentPadding: const EdgeInsets.symmetric(horizontal: 16, vertical: 8), + leading: Container( + padding: const EdgeInsets.all(10), + decoration: BoxDecoration( + color: AppColor.accentSoft, + borderRadius: BorderRadius.circular(12), + ), + child: const Icon(Icons.local_offer_rounded, color: AppColor.accent), + ), + title: Text( + promo['promo_code']?.toString() ?? 'N/A', + style: AppStyle.title, + ), + subtitle: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + const SizedBox(height: 4), + Text(promo['description']?.toString() ?? '', style: AppStyle.caption), + const SizedBox(height: 4), + Row( + children: [ + Icon(Icons.money_rounded, size: 14, color: AppColor.success), + const SizedBox(width: 4), + Text('% ${promo['amount']}', style: AppStyle.number.copyWith(color: AppColor.success)), + const SizedBox(width: 12), + Icon(Icons.person_rounded, size: 14, color: AppColor.info), + const SizedBox(width: 4), + Text(promo['passengerID'] == 'none' ? 'عام' : 'مخصص', style: AppStyle.caption), + ], + ), + ], + ), + trailing: PopupMenuButton( + icon: const Icon(Icons.more_vert_rounded, color: AppColor.textSecondary), + color: AppColor.surfaceElevated, + shape: RoundedRectangleBorder(borderRadius: BorderRadius.circular(12)), + itemBuilder: (context) => [ + PopupMenuItem( + value: 'edit', + child: Row( + children: [ + const Icon(Icons.edit_rounded, size: 18, color: AppColor.info), + const SizedBox(width: 8), + Text('تعديل'.tr), + ], + ), + ), + PopupMenuItem( + value: 'delete', + child: Row( + children: [ + const Icon(Icons.delete_outline_rounded, size: 18, color: AppColor.danger), + const SizedBox(width: 8), + Text('حذف'.tr, style: const TextStyle(color: AppColor.danger)), + ], + ), + ), + ], + onSelected: (value) { + if (value == 'edit') { + _showPromoSheet(context, promo: promo); + } else if (value == 'delete') { + MyDialog().getDialog( + 'حذف كود الخصم', + 'هل أنت متأكد من حذف كود الخصم ${promo['promo_code']}؟', + () => controller.deletePromo(promo['id'].toString()).then((_) => Get.back()), + ); + } + }, + ), + ), + ); + } + + void _showPromoSheet(BuildContext context, {dynamic promo}) { + final TextEditingController codeController = TextEditingController(text: promo?['promo_code']); + final TextEditingController amountController = TextEditingController(text: promo?['amount']?.toString()); + final TextEditingController descController = TextEditingController(text: promo?['description']); + final TextEditingController passengerController = TextEditingController(text: promo?['passengerID'] ?? 'none'); + final TextEditingController startDateController = TextEditingController(text: promo?['validity_start_date'] ?? DateTime.now().toString().split(' ')[0]); + final TextEditingController endDateController = TextEditingController(text: promo?['validity_end_date'] ?? DateTime.now().add(const Duration(days: 30)).toString().split(' ')[0]); + + Get.bottomSheet( + Container( + padding: const EdgeInsets.all(24), + decoration: const BoxDecoration( + color: AppColor.surfaceElevated, + borderRadius: BorderRadius.vertical(top: Radius.circular(24)), + ), + child: SingleChildScrollView( + child: Column( + mainAxisSize: MainAxisSize.min, + children: [ + Container( + width: 40, + height: 4, + decoration: BoxDecoration(color: AppColor.divider, borderRadius: BorderRadius.circular(2)), + ), + const SizedBox(height: 24), + Text(promo == null ? 'إضافة كود خصم جديد' : 'تعديل كود الخصم', style: AppStyle.headTitle), + const SizedBox(height: 24), + MyTextForm( + controller: codeController, + label: 'كود الخصم', + hint: 'مثال: WELCOME20', + type: TextInputType.text, + prefixIcon: Icons.local_offer_rounded, + ), + MyTextForm( + controller: amountController, + label: 'نسبة الخصم', + hint: 'أدخل نسبة الخصم (مثال: 25)', + type: TextInputType.number, + prefixIcon: Icons.percent_rounded, + ), + MyTextForm( + controller: descController, + label: 'الوصف', + hint: 'وصف كود الخصم', + type: TextInputType.text, + prefixIcon: Icons.description_rounded, + ), + MyTextForm( + controller: passengerController, + label: 'معرف الراكب (أو none للعام)', + hint: 'none', + type: TextInputType.text, + prefixIcon: Icons.person_rounded, + ), + Row( + children: [ + Expanded( + child: InkWell( + onTap: () async { + DateTime? picked = await showDatePicker( + context: context, + initialDate: DateTime.tryParse(startDateController.text) ?? DateTime.now(), + firstDate: DateTime(2020), + lastDate: DateTime(2030), + ); + if (picked != null) { + startDateController.text = picked.toString().split(' ')[0]; + } + }, + child: IgnorePointer( + child: MyTextForm( + controller: startDateController, + label: 'يبدأ في', + hint: 'YYYY-MM-DD', + type: TextInputType.none, + prefixIcon: Icons.calendar_today_rounded, + ), + ), + ), + ), + const SizedBox(width: 12), + Expanded( + child: InkWell( + onTap: () async { + DateTime? picked = await showDatePicker( + context: context, + initialDate: DateTime.tryParse(endDateController.text) ?? DateTime.now(), + firstDate: DateTime(2020), + lastDate: DateTime(2030), + ); + if (picked != null) { + endDateController.text = picked.toString().split(' ')[0]; + } + }, + child: IgnorePointer( + child: MyTextForm( + controller: endDateController, + label: 'ينتهي في', + hint: 'YYYY-MM-DD', + type: TextInputType.none, + prefixIcon: Icons.event_busy_rounded, + ), + ), + ), + ), + ], + ), + const SizedBox(height: 16), + MyElevatedButton( + title: promo == null ? 'إضافة' : 'حفظ التعديلات', + onPressed: () async { + final data = { + if (promo != null) 'id': promo['id'].toString(), + 'promo_code': codeController.text, + 'amount': amountController.text, + 'description': descController.text, + 'passengerID': passengerController.text, + 'validity_start_date': startDateController.text, + 'validity_end_date': endDateController.text, + }; + bool success = promo == null + ? await controller.addPromo(data) + : await controller.updatePromo(data); + if (success) Get.back(); + }, + ), + const SizedBox(height: 16), + ], + ), + ), + ), + + isScrollControlled: true, + ); + } +} diff --git a/siro_admin/lib/views/admin/quality/blacklist_page.dart b/siro_admin/lib/views/admin/quality/blacklist_page.dart new file mode 100644 index 0000000..b8c0cce --- /dev/null +++ b/siro_admin/lib/views/admin/quality/blacklist_page.dart @@ -0,0 +1,153 @@ +import 'package:flutter/material.dart'; +import 'package:get/get.dart'; +import '../../../controller/admin/quality_controller.dart'; + +class BlacklistPage extends StatelessWidget { + const BlacklistPage({super.key}); + + @override + Widget build(BuildContext context) { + Get.put(QualityController()).fetchBlacklist(); + + return DefaultTabController( + length: 2, + child: Scaffold( + appBar: AppBar( + title: const Text('إدارة القائمة السوداء (Blacklist)', + style: TextStyle(fontWeight: FontWeight.bold)), + backgroundColor: Colors.red[800], + bottom: const TabBar( + indicatorColor: Colors.white, + tabs: [ + Tab(icon: Icon(Icons.drive_eta), text: 'السائقين المحظورين'), + Tab(icon: Icon(Icons.person), text: 'الركاب المحظورين'), + ], + ), + ), + body: GetBuilder( + builder: (controller) { + if (controller.isLoading) { + return const Center(child: CircularProgressIndicator()); + } + + return TabBarView( + children: [ + _buildDriverList(controller), + _buildPassengerList(controller), + ], + ); + }, + ), + ), + ); + } + + Widget _buildDriverList(QualityController controller) { + if (controller.driversBlacklist.isEmpty) { + return const Center(child: Text('لا يوجد سائقين محظورين حالياً')); + } + return ListView.builder( + itemCount: controller.driversBlacklist.length, + padding: const EdgeInsets.all(12), + itemBuilder: (context, index) { + var driver = controller.driversBlacklist[index]; + return Card( + elevation: 3, + shape: + RoundedRectangleBorder(borderRadius: BorderRadius.circular(10)), + child: ListTile( + leading: const CircleAvatar( + backgroundColor: Colors.redAccent, + child: Icon(Icons.block, color: Colors.white), + ), + title: Text('هاتف: ${driver['phone']}', + style: const TextStyle(fontWeight: FontWeight.bold)), + subtitle: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Text('السبب: ${driver['reason'] ?? "غير محدد"}'), + Text('تاريخ الحظر: ${driver['created_at']}'), + ], + ), + trailing: IconButton( + icon: const Icon(Icons.settings_backup_restore, + color: Colors.green), + onPressed: () { + _showUnblockDialog( + Get.context!, + 'سائق', + driver['phone'], + () => controller.unblockDriver(driver['phone'].toString()), + ); + }, + ), + ), + ); + }, + ); + } + + Widget _buildPassengerList(QualityController controller) { + if (controller.passengersBlacklist.isEmpty) { + return const Center(child: Text('لا يوجد ركاب محظورين حالياً')); + } + return ListView.builder( + itemCount: controller.passengersBlacklist.length, + padding: const EdgeInsets.all(12), + itemBuilder: (context, index) { + var passenger = controller.passengersBlacklist[index]; + return Card( + elevation: 3, + shape: + RoundedRectangleBorder(borderRadius: BorderRadius.circular(10)), + child: ListTile( + leading: const CircleAvatar( + backgroundColor: Colors.orangeAccent, + child: Icon(Icons.person_off, color: Colors.white), + ), + title: Text( + 'هاتف: ${passenger['phone'] ?? passenger['phone_normalized']}', + style: const TextStyle(fontWeight: FontWeight.bold)), + subtitle: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Text('السبب: ${passenger['reason'] ?? "غير محدد"}'), + Text('تاريخ الحظر: ${passenger['created_at']}'), + ], + ), + trailing: IconButton( + icon: const Icon(Icons.settings_backup_restore, + color: Colors.green), + onPressed: () { + _showUnblockDialog( + Get.context!, + 'راكب', + passenger['phone_normalized'], + () => controller.unblockPassenger( + passenger['phone_normalized'].toString()), + ); + }, + ), + ), + ); + }, + ); + } + + void _showUnblockDialog(BuildContext context, String type, String identifier, + VoidCallback onConfirm) { + Get.defaultDialog( + title: "تأكيد فك الحظر", + middleText: + "هل أنت متأكد من فك الحظر عن هذا ال$type ($identifier)؟\nسيتم تسجيل هذه العملية في الـ Audit Log.", + textConfirm: "نعم، فك الحظر", + textCancel: "تراجع", + confirmTextColor: Colors.white, + buttonColor: Colors.green, + onConfirm: () { + Get.back(); + onConfirm(); + }, + ); + } +} diff --git a/siro_admin/lib/views/admin/quality/driver_scorecard_page.dart b/siro_admin/lib/views/admin/quality/driver_scorecard_page.dart new file mode 100644 index 0000000..38a3510 --- /dev/null +++ b/siro_admin/lib/views/admin/quality/driver_scorecard_page.dart @@ -0,0 +1,240 @@ +import 'package:flutter/material.dart'; +import 'package:get/get.dart'; +import '../../../controller/admin/quality_controller.dart'; + +class DriverScorecardPage extends StatelessWidget { + final String driverId; + const DriverScorecardPage({super.key, required this.driverId}); + + @override + Widget build(BuildContext context) { + QualityController controller = Get.put(QualityController()); + // Fetch data when page opens + WidgetsBinding.instance.addPostFrameCallback((_) { + controller.fetchDriverScorecard(driverId); + }); + + return Scaffold( + appBar: AppBar( + title: const Text('بطاقة أداء السائق', + style: TextStyle(fontWeight: FontWeight.bold)), + backgroundColor: Colors.blueAccent, + ), + body: GetBuilder( + builder: (controller) { + if (controller.isLoading) { + return const Center(child: CircularProgressIndicator()); + } + + if (controller.scorecardData.isEmpty) { + return const Center( + child: Text('لا توجد بيانات لهذا السائق أو حدث خطأ.')); + } + + var basicInfo = controller.scorecardData['basic_info']; + var ridesStats = controller.scorecardData['rides_stats']; + var rating = controller.scorecardData['rating']; + var behavior = controller.scorecardData['behavior']; + var complaints = controller.scorecardData['complaints']; + num overallScore = controller.scorecardData['overall_score'] ?? 0; + + Color scoreColor = _getScoreColor(overallScore); + + return SingleChildScrollView( + padding: const EdgeInsets.all(16.0), + child: Column( + crossAxisAlignment: CrossAxisAlignment.stretch, + children: [ + // رأس البطاقة - معلومات السائق والتقييم الإجمالي + Card( + elevation: 4, + shape: RoundedRectangleBorder( + borderRadius: BorderRadius.circular(15)), + child: Padding( + padding: const EdgeInsets.all(16.0), + child: Column( + children: [ + CircleAvatar( + radius: 40, + backgroundColor: Colors.grey.shade300, + child: const Icon(Icons.person, + size: 50, color: Colors.white), + ), + const SizedBox(height: 10), + Text( + '${basicInfo['first_name']} ${basicInfo['last_name']}', + style: const TextStyle( + fontSize: 22, fontWeight: FontWeight.bold)), + Text('هاتف: ${basicInfo['phone']}', + style: const TextStyle(color: Colors.grey)), + const Divider(height: 30), + Text('التقييم الشامل (Score)', + style: TextStyle( + fontSize: 18, color: Colors.grey.shade700)), + const SizedBox(height: 5), + Stack( + alignment: Alignment.center, + children: [ + SizedBox( + width: 100, + height: 100, + child: CircularProgressIndicator( + value: overallScore / 100, + strokeWidth: 10, + backgroundColor: Colors.grey.shade200, + color: scoreColor, + ), + ), + Text('${overallScore.toStringAsFixed(1)}%', + style: TextStyle( + fontSize: 24, + fontWeight: FontWeight.bold, + color: scoreColor)), + ], + ), + ], + ), + ), + ), + const SizedBox(height: 15), + + // قسم إحصائيات الرحلات + _buildSectionTitle('إحصائيات الرحلات (الإنجاز)'), + Card( + elevation: 2, + child: ListTile( + leading: const Icon(Icons.drive_eta, color: Colors.blue), + title: const Text('نسبة الإنجاز'), + trailing: Text('${ridesStats['completion_rate']}%', + style: const TextStyle( + fontSize: 18, fontWeight: FontWeight.bold)), + subtitle: Text( + 'إجمالي: ${ridesStats['total_rides']} | اكتمل: ${ridesStats['completed_rides']}\n' + 'إلغاء سائق: ${ridesStats['driver_cancellations']} | إلغاء راكب: ${ridesStats['passenger_cancellations']}'), + ), + ), + + const SizedBox(height: 10), + + // قسم التقييم والشكاوى + _buildSectionTitle('رضا العملاء والشكاوى'), + Row( + children: [ + Expanded( + child: Card( + elevation: 2, + child: Padding( + padding: const EdgeInsets.all(12.0), + child: Column( + children: [ + const Icon(Icons.star, + color: Colors.orange, size: 30), + const SizedBox(height: 5), + Text('${rating.toString()}/5.0', + style: const TextStyle( + fontSize: 20, + fontWeight: FontWeight.bold)), + const Text('متوسط التقييم', + style: TextStyle( + fontSize: 12, color: Colors.grey)), + ], + ), + ), + ), + ), + Expanded( + child: Card( + elevation: 2, + child: Padding( + padding: const EdgeInsets.all(12.0), + child: Column( + children: [ + const Icon(Icons.warning, + color: Colors.redAccent, size: 30), + const SizedBox(height: 5), + Text('${complaints['total_complaints']} شكوى', + style: const TextStyle( + fontSize: 20, + fontWeight: FontWeight.bold)), + Text('${complaints['open_complaints']} مفتوحة', + style: const TextStyle( + fontSize: 12, color: Colors.red)), + ], + ), + ), + ), + ), + ], + ), + + const SizedBox(height: 10), + + // قسم سلوك القيادة + _buildSectionTitle('سلوك القيادة والتتبع'), + Card( + elevation: 2, + child: Padding( + padding: const EdgeInsets.all(12.0), + child: Column( + children: [ + _buildBehaviorRow('متوسط سرعة السائق', + '${behavior['avg_max_speed']} كم/س', Icons.speed), + const Divider(), + _buildBehaviorRow( + 'مرات الفرملة القاسية', + '${behavior['total_hard_brakes']}', + Icons.dangerous), + const Divider(), + _buildBehaviorRow( + 'تسارع مفاجئ', + '${behavior['total_rapid_accel']}', + Icons.fast_forward), + const Divider(), + _buildBehaviorRow('تقييم السلوك الآلي', + '${behavior['avg_behavior_score']}%', Icons.memory), + ], + ), + ), + ), + ], + ), + ); + }, + ), + ); + } + + Widget _buildSectionTitle(String title) { + return Padding( + padding: const EdgeInsets.symmetric(vertical: 8.0, horizontal: 4.0), + child: Text(title, + style: const TextStyle( + fontSize: 18, + fontWeight: FontWeight.bold, + color: Colors.black87)), + ); + } + + Widget _buildBehaviorRow(String title, String value, IconData icon) { + return Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + Row( + children: [ + Icon(icon, size: 20, color: Colors.grey.shade600), + const SizedBox(width: 8), + Text(title, style: const TextStyle(fontSize: 15)), + ], + ), + Text(value, + style: const TextStyle(fontSize: 16, fontWeight: FontWeight.bold)), + ], + ); + } + + Color _getScoreColor(num score) { + if (score >= 80) return Colors.green; + if (score >= 60) return Colors.orange; + return Colors.red; + } +} diff --git a/siro_admin/lib/views/admin/rides/ride_lookup_page.dart b/siro_admin/lib/views/admin/rides/ride_lookup_page.dart new file mode 100644 index 0000000..2a5b0c8 --- /dev/null +++ b/siro_admin/lib/views/admin/rides/ride_lookup_page.dart @@ -0,0 +1,1213 @@ +import 'dart:async'; +import 'package:flutter/material.dart'; +import 'package:get/get.dart'; +import 'package:flutter_map/flutter_map.dart'; +import 'package:latlong2/latlong.dart'; +import 'package:siro_admin/constant/links.dart'; +import 'package:url_launcher/url_launcher.dart'; +import '../../../controller/functions/crud.dart'; +import '../../../constant/box_name.dart'; +import '../../../main.dart'; + +// ═══════════════════════════════════════════════════════════════════════════ +// 1. MODEL +// ═══════════════════════════════════════════════════════════════════════════ + +class RideDashboardModel { + final String rideId; + final String status; + final String startLocation; + final String endLocation; + final String date; + final String time; + final String price; + final String distance; + final String driverId; + final String driverName; + final String driverPhone; + final String driverCompletedCount; + final String driverCanceledCount; + final String passengerName; + final String passengerPhone; + final String passengerCompletedCount; + final String cancelReason; + + RideDashboardModel({ + required this.rideId, + required this.status, + required this.startLocation, + required this.endLocation, + required this.date, + required this.time, + required this.price, + required this.distance, + required this.driverId, + required this.driverName, + required this.driverPhone, + required this.driverCompletedCount, + required this.driverCanceledCount, + required this.passengerName, + required this.passengerPhone, + required this.passengerCompletedCount, + required this.cancelReason, + }); + + factory RideDashboardModel.fromJson(Map json) { + return RideDashboardModel( + rideId: json['id'].toString(), + status: json['status'] ?? '', + startLocation: json['start_location'] ?? '', + endLocation: json['end_location'] ?? '', + date: json['date'] ?? '', + time: json['time'] ?? '', + price: json['price']?.toString() ?? '0', + distance: json['distance']?.toString() ?? '0', + driverId: json['driver_id'].toString(), + driverName: json['driver_full_name'] ?? 'غير معروف', + driverPhone: json['d_phone'] ?? '', + driverCompletedCount: (json['d_completed'] ?? 0).toString(), + driverCanceledCount: (json['d_canceled'] ?? 0).toString(), + passengerName: json['passenger_full_name'] ?? 'غير معروف', + passengerPhone: json['p_phone'] ?? '', + passengerCompletedCount: (json['p_completed'] ?? 0).toString(), + cancelReason: json['cancel_reason'] ?? '', + ); + } + + LatLng? getStartLatLng() { + try { + var parts = startLocation.split(','); + return LatLng(double.parse(parts[0]), double.parse(parts[1])); + } catch (e) { + return null; + } + } + + LatLng? getEndLatLng() { + try { + var parts = endLocation.split(','); + return LatLng(double.parse(parts[0]), double.parse(parts[1])); + } catch (e) { + return null; + } + } +} + +// ═══════════════════════════════════════════════════════════════════════════ +// 2. CONTROLLER +// ═══════════════════════════════════════════════════════════════════════════ + +class RidesListController extends GetxController { + var isLoading = false.obs; + var allRidesList = []; + var displayedRides = [].obs; + + TextEditingController searchController = TextEditingController(); + String currentStatus = 'Begin'; + + String myPhone = box.read(BoxName.adminPhone)?.toString() ?? ''; + + bool get isSuperAdmin { + return myPhone == '963942542053' || myPhone == '963992952235'; + } + + final String apiUrl = "${AppLink.server}/Admin/rides/get_rides_by_status.php"; + + // ═══ Statistics ═══ + var beginCount = 0.obs; + var newCount = 0.obs; + var completedCount = 0.obs; + var canceledCount = 0.obs; + var totalRevenue = 0.0.obs; + var totalDistance = 0.0.obs; + + @override + void onInit() { + super.onInit(); + fetchRides(); + } + + void changeTab(String status) { + currentStatus = status; + searchController.clear(); + fetchRides(); + } + + void filterRides(String query) { + if (query.isEmpty) { + displayedRides.value = allRidesList; + } else { + displayedRides.value = allRidesList.where((ride) { + return ride.driverPhone.contains(query) || + ride.passengerPhone.contains(query) || + ride.driverName.toLowerCase().contains(query.toLowerCase()) || + ride.passengerName.toLowerCase().contains(query.toLowerCase()) || + ride.rideId.contains(query); + }).toList(); + } + } + + void calculateStatistics() { + beginCount.value = allRidesList.where((r) => r.status == 'Begin').length; + newCount.value = allRidesList.where((r) => r.status == 'New').length; + completedCount.value = + allRidesList.where((r) => r.status == 'Finished').length; + canceledCount.value = + allRidesList.where((r) => r.status.contains('Cancel')).length; + + totalRevenue.value = allRidesList.fold( + 0.0, (sum, ride) => sum + (double.tryParse(ride.price) ?? 0.0)); + totalDistance.value = allRidesList.fold( + 0.0, (sum, ride) => sum + (double.tryParse(ride.distance) ?? 0.0)); + } + + Future fetchRides() async { + isLoading.value = true; + allRidesList.clear(); + displayedRides.clear(); + try { + var response = + await CRUD().post(link: apiUrl, payload: {"status": currentStatus}); + if (response != 'failure' && response['status'] == 'success') { + List data = []; + if (response['message'] is List) { + data = response['message']; + } else if (response['data'] is List) { + data = response['data']; + } + + allRidesList = data.map((e) => RideDashboardModel.fromJson(e)).toList(); + displayedRides.value = allRidesList; + calculateStatistics(); + } + } catch (e) { + debugPrint("Error fetching rides: $e"); + } finally { + isLoading.value = false; + } + } +} + +// ═══════════════════════════════════════════════════════════════════════════ +// 3. MAIN DASHBOARD SCREEN (ADVANCED SLIVER IMPLEMENTATION) +// ═══════════════════════════════════════════════════════════════════════════ + +class RidesDashboardScreen extends StatefulWidget { + const RidesDashboardScreen({super.key}); + + @override + State createState() => _RidesDashboardScreenState(); +} + +class _RidesDashboardScreenState extends State + with SingleTickerProviderStateMixin { + late final RidesListController controller; + late TabController _tabController; + + // 🎨 الألوان العصرية + final Color bgColor = const Color(0xFFF4F7FE); + final Color primaryColor = const Color(0xFF4318FF); + final Color textPrimary = const Color(0xFF2B3674); + + @override + void initState() { + super.initState(); + controller = Get.put(RidesListController()); + _tabController = TabController(length: 4, vsync: this); + _tabController.addListener(_handleTabChange); + } + + @override + void dispose() { + _tabController.removeListener(_handleTabChange); + _tabController.dispose(); + super.dispose(); + } + + void _handleTabChange() { + if (_tabController.indexIsChanging) return; + List statuses = ['Begin', 'New', 'Completed', 'Canceled']; + controller.changeTab(statuses[_tabController.index]); + } + + @override + Widget build(BuildContext context) { + return Scaffold( + backgroundColor: bgColor, + body: SafeArea( + top: false, // نسمح للـ AppBar بالتمدد لأعلى الشاشة + child: CustomScrollView( + physics: const BouncingScrollPhysics(), + slivers: [ + // 1. Sliver AppBar (المتحرك الذكي الذي يصغر عند التمرير) + SliverAppBar( + pinned: true, + floating: false, + expandedHeight: 310.0, // ارتفاع الجزء العلوي بالكامل + backgroundColor: primaryColor, + elevation: 4, + shadowColor: primaryColor.withOpacity(0.4), + iconTheme: const IconThemeData(color: Colors.white), + centerTitle: true, + title: const Text( + 'إدارة الرحلات', + style: TextStyle( + color: Colors.white, + fontWeight: FontWeight.bold, + fontSize: 20, + ), + ), + actions: [ + Container( + margin: + const EdgeInsets.symmetric(horizontal: 16, vertical: 10), + padding: const EdgeInsets.symmetric(horizontal: 14), + decoration: BoxDecoration( + color: Colors.white.withOpacity(0.2), + borderRadius: BorderRadius.circular(12), + ), + alignment: Alignment.center, + child: const Text( + 'اليوم', + style: TextStyle( + fontSize: 12, + fontWeight: FontWeight.bold, + color: Colors.white, + ), + ), + ), + ], + flexibleSpace: FlexibleSpaceBar( + background: Container( + decoration: BoxDecoration( + gradient: LinearGradient( + colors: [primaryColor, primaryColor.withOpacity(0.8)], + begin: Alignment.topCenter, + end: Alignment.bottomCenter, + ), + ), + child: Column( + mainAxisAlignment: MainAxisAlignment.end, + children: [ + // الإحصائيات تختفي عند التمرير لأعلى + _buildStatisticsSection(), + const SizedBox(height: 12), + // شريط البحث يختفي عند التمرير لأعلى + Padding( + padding: const EdgeInsets.symmetric(horizontal: 16), + child: _buildSearchBar(), + ), + const SizedBox(height: 60), // مساحة للـ TabBar بالأسفل + ], + ), + ), + ), + // TabBar يثبت دائماً أسفل الـ AppBar عند التمرير + bottom: PreferredSize( + preferredSize: const Size.fromHeight(54), + child: Container( + decoration: const BoxDecoration( + color: + Color(0xFFF4F7FE), // لون خلفية التطبيق ليظهر بشكل مدمج + borderRadius: + BorderRadius.vertical(top: Radius.circular(24)), + ), + child: TabBar( + controller: _tabController, + isScrollable: true, + labelColor: primaryColor, + unselectedLabelColor: Colors.grey, + indicatorColor: primaryColor, + indicatorWeight: 3, + labelStyle: const TextStyle( + fontWeight: FontWeight.bold, fontSize: 14), + tabAlignment: TabAlignment.center, + dividerColor: Colors.transparent, + tabs: const [ + Tab( + icon: Icon(Icons.directions_car_rounded), + text: 'جارية'), + Tab( + icon: Icon(Icons.new_releases_rounded), + text: 'جديدة'), + Tab( + icon: Icon(Icons.check_circle_rounded), + text: 'مكتملة'), + Tab(icon: Icon(Icons.cancel_rounded), text: 'ملغاة'), + ], + ), + ), + ), + ), + + // 2. قائمة الرحلات (Sliver List) + SliverPadding( + padding: const EdgeInsets.all(16.0), + sliver: Obx(() { + if (controller.isLoading.value) { + return const SliverFillRemaining( + hasScrollBody: false, + child: Center(child: CircularProgressIndicator()), + ); + } + + if (controller.displayedRides.isEmpty) { + return SliverFillRemaining( + hasScrollBody: false, + child: Center( + child: Column( + mainAxisAlignment: MainAxisAlignment.center, + children: [ + Icon(Icons.inbox_rounded, + size: 80, color: Colors.grey[400]), + const SizedBox(height: 16), + Text( + 'لا توجد رحلات في هذا القسم', + style: TextStyle( + fontSize: 16, + color: Colors.grey[600], + fontWeight: FontWeight.w600, + ), + ), + ], + ), + ), + ); + } + + return SliverList( + delegate: SliverChildBuilderDelegate( + (context, index) { + final ride = controller.displayedRides[index]; + return _buildRideCardCompact( + ride, controller.isSuperAdmin); + }, + childCount: controller.displayedRides.length, + ), + ); + }), + ), + ], + ), + ), + ); + } + + // --- Components --- + + Widget _buildStatisticsSection() { + return Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Padding( + padding: const EdgeInsets.symmetric(horizontal: 20, vertical: 8), + child: Text( + 'نظرة عامة', + style: TextStyle( + fontSize: 14, + fontWeight: FontWeight.bold, + color: Colors.white.withOpacity(0.8), + ), + ), + ), + SingleChildScrollView( + physics: const BouncingScrollPhysics(), + scrollDirection: Axis.horizontal, + padding: const EdgeInsets.symmetric(horizontal: 16), + child: Row( + children: [ + Obx(() => _buildStatCard( + 'جارية', + controller.beginCount.toString(), + Icons.directions_car_rounded, + const Color(0xFF10B981))), + Obx(() => _buildStatCard('جديدة', controller.newCount.toString(), + Icons.new_releases_rounded, const Color(0xFF3B82F6))), + Obx(() => _buildStatCard( + 'مكتملة', + controller.completedCount.toString(), + Icons.check_circle_rounded, + const Color(0xFF14B8A6))), + Obx(() => _buildStatCard( + 'ملغاة', + controller.canceledCount.toString(), + Icons.cancel_rounded, + const Color(0xFFEF4444))), + Obx(() => _buildStatCard( + 'الإيرادات', + '${controller.totalRevenue.value.toStringAsFixed(0)}', + Icons.payments_rounded, + const Color(0xFFF59E0B))), + ], + ), + ), + ], + ); + } + + Widget _buildStatCard( + String label, String value, IconData icon, Color iconColor) { + return Container( + width: 105, + margin: const EdgeInsets.only(left: 10), + padding: const EdgeInsets.symmetric(vertical: 12, horizontal: 8), + decoration: BoxDecoration( + color: Colors.white, + borderRadius: BorderRadius.circular(16), + boxShadow: [ + BoxShadow( + color: Colors.black.withOpacity(0.1), + blurRadius: 10, + offset: const Offset(0, 4), + ) + ], + ), + child: Column( + mainAxisSize: MainAxisSize.min, + children: [ + Icon(icon, color: iconColor, size: 24), + const SizedBox(height: 8), + Text( + value, + style: TextStyle( + fontSize: 18, fontWeight: FontWeight.bold, color: textPrimary), + maxLines: 1, + overflow: TextOverflow.ellipsis, + ), + const SizedBox(height: 2), + Text( + label, + style: TextStyle( + fontSize: 11, + color: Colors.grey[600], + fontWeight: FontWeight.bold), + ), + ], + ), + ); + } + + Widget _buildSearchBar() { + return Container( + decoration: BoxDecoration( + color: Colors.white, + borderRadius: BorderRadius.circular(16), + boxShadow: [ + BoxShadow( + color: Colors.black.withOpacity(0.05), + blurRadius: 8, + offset: const Offset(0, 4), + ) + ], + ), + child: TextField( + controller: controller.searchController, + onChanged: (val) => controller.filterRides(val), + style: TextStyle(color: textPrimary, fontWeight: FontWeight.w600), + decoration: InputDecoration( + hintText: 'ابحث عن رقم الرحلة، السائق، أو الراكب...', + hintStyle: TextStyle(color: Colors.grey[400], fontSize: 13), + prefixIcon: Icon(Icons.search_rounded, color: primaryColor), + suffixIcon: controller.searchController.text.isNotEmpty + ? IconButton( + icon: const Icon(Icons.close_rounded, color: Colors.grey), + onPressed: () { + controller.searchController.clear(); + controller.filterRides(''); + }, + ) + : null, + border: InputBorder.none, + contentPadding: + const EdgeInsets.symmetric(horizontal: 16, vertical: 15), + ), + ), + ); + } + + // ═══════════════════════════════════════════════════════════════════════════ + // تصميم بطاقة الرحلة (المدمج والمنظم - Slim Design) + // ═══════════════════════════════════════════════════════════════════════════ + + Widget _buildRideCardCompact(RideDashboardModel ride, bool isAdmin) { + Color statusColor = _getStatusColor(ride.status); + String statusText = _getStatusText(ride.status); + + return Container( + margin: const EdgeInsets.only(bottom: 16), + decoration: BoxDecoration( + color: Colors.white, + borderRadius: BorderRadius.circular(20), + boxShadow: [ + BoxShadow( + color: Colors.black.withOpacity(0.04), + blurRadius: 10, + offset: const Offset(0, 4), + ), + ], + border: Border.all(color: Colors.grey.withOpacity(0.1)), + ), + child: Material( + color: Colors.transparent, + child: InkWell( + borderRadius: BorderRadius.circular(20), + onTap: () => Get.to( + () => RideMapMonitorScreen(ride: ride, isAdmin: isAdmin), + transition: Transition.cupertino, + ), + child: Padding( + padding: const EdgeInsets.all(16), + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + // 1. Header (ID + Status) + Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + Row( + children: [ + Container( + padding: const EdgeInsets.all(6), + decoration: BoxDecoration( + color: primaryColor.withOpacity(0.1), + borderRadius: BorderRadius.circular(8), + ), + child: Icon(Icons.confirmation_number_rounded, + color: primaryColor, size: 18), + ), + const SizedBox(width: 10), + Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Text( + 'رحلة #${ride.rideId}', + style: TextStyle( + fontSize: 15, + fontWeight: FontWeight.bold, + color: textPrimary), + ), + Text( + '${ride.date} • ${ride.time}', + style: TextStyle( + fontSize: 11, + color: Colors.grey[500], + fontWeight: FontWeight.w600), + ), + ], + ), + ], + ), + Container( + padding: const EdgeInsets.symmetric( + horizontal: 10, vertical: 4), + decoration: BoxDecoration( + color: statusColor.withOpacity(0.1), + borderRadius: BorderRadius.circular(8), + ), + child: Text( + statusText, + style: TextStyle( + fontSize: 12, + fontWeight: FontWeight.bold, + color: statusColor), + ), + ), + ], + ), + + const Padding( + padding: EdgeInsets.symmetric(vertical: 12), + child: Divider(height: 1), + ), + + // 2. Locations (Timeline style) + Row( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Column( + children: [ + const Icon(Icons.my_location_rounded, + size: 14, color: Color(0xFF10B981)), + Container( + width: 2, + height: 16, + color: Colors.grey.withOpacity(0.3), + margin: const EdgeInsets.symmetric(vertical: 2)), + const Icon(Icons.location_on_rounded, + size: 14, color: Color(0xFFEF4444)), + ], + ), + const SizedBox(width: 10), + Expanded( + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Text( + ride.startLocation, + maxLines: 1, + overflow: TextOverflow.ellipsis, + style: const TextStyle( + fontSize: 13, + fontWeight: FontWeight.w600, + color: Colors.black87), + ), + const SizedBox(height: 12), + Text( + ride.endLocation, + maxLines: 1, + overflow: TextOverflow.ellipsis, + style: const TextStyle( + fontSize: 13, + fontWeight: FontWeight.w600, + color: Colors.black87), + ), + ], + ), + ), + ], + ), + + const SizedBox(height: 16), + + // 3. Driver & Passenger (Slim Rows) + Container( + padding: + const EdgeInsets.symmetric(horizontal: 12, vertical: 10), + decoration: BoxDecoration( + color: bgColor, + borderRadius: BorderRadius.circular(12), + ), + child: Column( + children: [ + _buildSlimUserRow( + icon: Icons.local_taxi_rounded, + title: 'السائق', + name: ride.driverName, + phone: ride.driverPhone, + color: const Color(0xFF3B82F6), + isAdmin: isAdmin, + ), + const Padding( + padding: EdgeInsets.symmetric(vertical: 6), + child: Divider(height: 1, thickness: 0.5), + ), + _buildSlimUserRow( + icon: Icons.person_rounded, + title: 'الراكب', + name: ride.passengerName, + phone: ride.passengerPhone, + color: const Color(0xFF8B5CF6), + isAdmin: isAdmin, + ), + ], + ), + ), + + const SizedBox(height: 14), + + // 4. Information Chips + Row( + children: [ + _buildInfoChip( + Icons.payments_rounded, + '${double.tryParse(ride.price)?.toStringAsFixed(0) ?? 0} ل.س', + const Color(0xFF10B981)), + const SizedBox(width: 8), + _buildInfoChip( + Icons.straighten_rounded, + '${double.tryParse(ride.distance)?.toStringAsFixed(1) ?? 0} كم', + const Color(0xFFF59E0B)), + const SizedBox(width: 8), + _buildInfoChip( + Icons.access_time_rounded, + ride.time.length > 5 + ? ride.time.substring(0, 5) + : ride.time, + const Color(0xFF3B82F6)), + ], + ), + + // 5. Cancel Reason (If any) + if ((ride.status.contains('Cancel') || + ride.status == 'TimeOut') && + ride.cancelReason.isNotEmpty && + ride.cancelReason != 'لا يوجد سبب') ...[ + const SizedBox(height: 12), + Container( + width: double.infinity, + padding: const EdgeInsets.all(10), + decoration: BoxDecoration( + color: const Color(0xFFEF4444).withOpacity(0.08), + borderRadius: BorderRadius.circular(8), + border: Border.all( + color: const Color(0xFFEF4444).withOpacity(0.2)), + ), + child: Row( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + const Icon(Icons.info_outline_rounded, + size: 16, color: Color(0xFFEF4444)), + const SizedBox(width: 6), + Expanded( + child: Text( + 'السبب: ${ride.cancelReason}', + style: const TextStyle( + color: Color(0xFFB91C1C), + fontSize: 11, + fontWeight: FontWeight.bold), + ), + ), + ], + ), + ), + ], + ], + ), + ), + ), + ), + ); + } + + // تصميم الصف النحيف للمستخدم (لتوفير المساحة) + Widget _buildSlimUserRow({ + required IconData icon, + required String title, + required String name, + required String phone, + required Color color, + required bool isAdmin, + }) { + String displayPhone = phone; + if (!isAdmin && phone.length > 4) { + displayPhone = + phone.substring(phone.length - 4).padLeft(phone.length, '*'); + } + + return Row( + children: [ + Icon(icon, size: 16, color: color), + const SizedBox(width: 6), + Text( + '$title:', + style: TextStyle( + fontSize: 11, + color: Colors.grey[600], + fontWeight: FontWeight.bold), + ), + const SizedBox(width: 6), + Expanded( + child: Text( + name, + maxLines: 1, + overflow: TextOverflow.ellipsis, + style: const TextStyle( + fontSize: 12, + fontWeight: FontWeight.bold, + color: Colors.black87), + ), + ), + Text( + displayPhone, + style: TextStyle( + fontSize: 11, color: Colors.grey[500], letterSpacing: 0.5), + ), + if (isAdmin && phone.isNotEmpty) ...[ + const SizedBox(width: 8), + GestureDetector( + onTap: () async { + String formattedPhone = phone; + if (!formattedPhone.startsWith('+')) + formattedPhone = '+$formattedPhone'; + final Uri launchUri = Uri(scheme: 'tel', path: formattedPhone); + if (await canLaunchUrl(launchUri)) await launchUrl(launchUri); + }, + child: Icon(Icons.call_rounded, size: 16, color: color), + ), + ] + ], + ); + } + + // تصميم الرقاقة (Chip) للمعلومات السفلية + Widget _buildInfoChip(IconData icon, String text, Color color) { + return Expanded( + child: Container( + padding: const EdgeInsets.symmetric(vertical: 6, horizontal: 4), + decoration: BoxDecoration( + color: color.withOpacity(0.08), + borderRadius: BorderRadius.circular(8), + ), + child: Row( + mainAxisAlignment: MainAxisAlignment.center, + children: [ + Icon(icon, size: 14, color: color), + const SizedBox(width: 4), + Flexible( + child: Text( + text, + maxLines: 1, + overflow: TextOverflow.ellipsis, + style: TextStyle( + fontSize: 11, fontWeight: FontWeight.bold, color: color), + ), + ), + ], + ), + ), + ); + } + + // Helper Methods for Status + Color _getStatusColor(String status) { + if (status == 'Begin' || status == 'Arrived') + return const Color(0xFF10B981); + if (status == 'Finished') return const Color(0xFF14B8A6); + if (status.contains('Cancel') || status == 'TimeOut') + return const Color(0xFFEF4444); + if (status == 'New') return const Color(0xFF3B82F6); + return Colors.grey; + } + + String _getStatusText(String status) { + if (status == 'Begin' || status == 'Arrived') return 'جارية'; + if (status == 'Finished') return 'مكتملة'; + if (status == 'CancelFromDriver' || status == 'CancelFromDriverAfterApply') + return 'ألغى السائق'; + if (status == 'CancelFromPassenger') return 'ألغى الراكب'; + if (status == 'TimeOut') return 'انتهى الوقت'; + if (status == 'New') return 'جديدة'; + return 'ملغاة'; + } +} + +// ═══════════════════════════════════════════════════════════════════════════ +// 5. MAP MONITOR SCREEN (Minor UI Polish) +// ═══════════════════════════════════════════════════════════════════════════ + +class RideMapMonitorScreen extends StatefulWidget { + final RideDashboardModel ride; + final bool isAdmin; + + const RideMapMonitorScreen({ + super.key, + required this.ride, + required this.isAdmin, + }); + + @override + State createState() => _RideMapMonitorScreenState(); +} + +class _RideMapMonitorScreenState extends State { + final MapController mapController = MapController(); + LatLng? startPos, endPos, driverPos; + Timer? _timer; + bool isFirstLoad = true; + + @override + void initState() { + super.initState(); + startPos = widget.ride.getStartLatLng(); + endPos = widget.ride.getEndLatLng(); + + if (widget.ride.status == 'Begin' || widget.ride.status == 'Arrived') { + fetchDriverLocation(); + _timer = Timer.periodic( + const Duration(seconds: 10), + (_) => fetchDriverLocation(), + ); + } + + WidgetsBinding.instance.addPostFrameCallback((_) => _fitBounds()); + } + + @override + void dispose() { + _timer?.cancel(); + mapController.dispose(); + super.dispose(); + } + + void _fitBounds() { + List points = []; + if (startPos != null) points.add(startPos!); + if (endPos != null) points.add(endPos!); + if (driverPos != null) points.add(driverPos!); + + if (points.isNotEmpty) { + try { + mapController.fitCamera( + CameraFit.bounds( + bounds: LatLngBounds.fromPoints(points), + padding: const EdgeInsets.all(100), + ), + ); + } catch (e) {} + } + } + + Future fetchDriverLocation() async { + String trackUrl = "${AppLink.server}/Admin/rides/get_driver_live_pos.php"; + try { + var response = await CRUD().post( + link: trackUrl, + payload: {"driver_id": widget.ride.driverId}, + ); + + if (response != 'failure') { + var d = response['message']; + setState(() { + driverPos = LatLng( + double.parse(d['latitude'].toString()), + double.parse(d['longitude'].toString()), + ); + }); + + if (isFirstLoad) { + _fitBounds(); + isFirstLoad = false; + } + } + } catch (e) {} + } + + @override + Widget build(BuildContext context) { + return Scaffold( + appBar: AppBar( + title: Text( + 'تتبع الرحلة #${widget.ride.rideId}', + style: const TextStyle(fontWeight: FontWeight.bold, fontSize: 18), + ), + backgroundColor: Colors.white, + foregroundColor: const Color(0xFF2B3674), + elevation: 0, + centerTitle: true, + ), + body: Stack( + children: [ + // Map + FlutterMap( + mapController: mapController, + options: MapOptions( + initialCenter: startPos ?? const LatLng(33.513, 36.276), + initialZoom: 13, + ), + children: [ + TileLayer( + urlTemplate: 'https://tile.openstreetmap.org/{z}/{x}/{y}.png', + userAgentPackageName: 'com.tripz.app', + ), + // Route Polyline + if (startPos != null && endPos != null) + PolylineLayer( + polylines: [ + Polyline( + points: [startPos!, endPos!], + strokeWidth: 5, + color: const Color(0xFF4318FF).withOpacity(0.8), + ), + ], + ), + // Markers + MarkerLayer( + markers: [ + // Start Point + if (startPos != null) + Marker( + point: startPos!, + width: 40, + height: 40, + child: Container( + decoration: BoxDecoration( + color: Colors.white, + shape: BoxShape.circle, + boxShadow: [ + BoxShadow( + color: Colors.black.withOpacity(0.2), + blurRadius: 5), + ], + ), + child: const Icon(Icons.flag_rounded, + color: Color(0xFF10B981), size: 24), + ), + alignment: Alignment.topCenter, + ), + // End Point + if (endPos != null) + Marker( + point: endPos!, + width: 40, + height: 40, + child: Container( + decoration: BoxDecoration( + color: Colors.white, + shape: BoxShape.circle, + boxShadow: [ + BoxShadow( + color: Colors.black.withOpacity(0.2), + blurRadius: 5), + ], + ), + child: const Icon(Icons.location_on_rounded, + color: Color(0xFFEF4444), size: 24), + ), + alignment: Alignment.topCenter, + ), + // Driver Current Position + if (driverPos != null) + Marker( + point: driverPos!, + width: 50, + height: 50, + child: Container( + decoration: BoxDecoration( + color: Colors.white, + shape: BoxShape.circle, + boxShadow: [ + BoxShadow( + color: const Color(0xFF3B82F6).withOpacity(0.3), + blurRadius: 8), + ], + ), + child: const Icon(Icons.directions_car_rounded, + color: Color(0xFF3B82F6), size: 28), + ), + ), + ], + ), + ], + ), + + // Info Panel (Floating) + Positioned( + bottom: 24, + left: 16, + right: 16, + child: Container( + decoration: BoxDecoration( + color: Colors.white, + borderRadius: BorderRadius.circular(24), + boxShadow: [ + BoxShadow( + color: Colors.black.withOpacity(0.1), + blurRadius: 20, + offset: const Offset(0, 10), + ), + ], + ), + padding: const EdgeInsets.all(20), + child: Column( + mainAxisSize: MainAxisSize.min, + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + // Driver Info + _buildMapUserInfo( + icon: Icons.local_taxi_rounded, + title: 'السائق', + name: widget.ride.driverName, + phone: widget.ride.driverPhone, + color: const Color(0xFF3B82F6), + ), + const SizedBox(height: 12), + // Passenger Info + _buildMapUserInfo( + icon: Icons.person_rounded, + title: 'الراكب', + name: widget.ride.passengerName, + phone: widget.ride.passengerPhone, + color: const Color(0xFF8B5CF6), + ), + ], + ), + ), + ), + + // Fit Button + Positioned( + top: 16, + right: 16, + child: FloatingActionButton.small( + backgroundColor: Colors.white, + foregroundColor: const Color(0xFF2B3674), + onPressed: _fitBounds, + child: const Icon(Icons.center_focus_strong_rounded), + ), + ), + ], + ), + ); + } + + Widget _buildMapUserInfo({ + required IconData icon, + required String title, + required String name, + required String phone, + required Color color, + }) { + String displayPhone = phone; + if (!widget.isAdmin && phone.length > 4) { + displayPhone = + phone.substring(phone.length - 4).padLeft(phone.length, '*'); + } + + return Row( + children: [ + Container( + padding: const EdgeInsets.all(10), + decoration: BoxDecoration( + color: color.withOpacity(0.1), + borderRadius: BorderRadius.circular(12), + ), + child: Icon(icon, size: 20, color: color), + ), + const SizedBox(width: 12), + Expanded( + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Text( + title, + style: TextStyle( + fontSize: 11, + color: Colors.grey[600], + fontWeight: FontWeight.bold), + ), + const SizedBox(height: 2), + Text( + name, + maxLines: 1, + overflow: TextOverflow.ellipsis, + style: const TextStyle( + fontSize: 14, + fontWeight: FontWeight.bold, + color: Color(0xFF2B3674)), + ), + ], + ), + ), + if (widget.isAdmin && phone.isNotEmpty) + GestureDetector( + onTap: () async { + String formattedPhone = phone; + if (!formattedPhone.startsWith('+')) + formattedPhone = '+$formattedPhone'; + final Uri launchUri = Uri(scheme: 'tel', path: formattedPhone); + if (await canLaunchUrl(launchUri)) await launchUrl(launchUri); + }, + child: Container( + padding: const EdgeInsets.all(8), + decoration: BoxDecoration( + color: Colors.green.withOpacity(0.1), + shape: BoxShape.circle, + ), + child: + const Icon(Icons.call_rounded, size: 20, color: Colors.green), + ), + ), + ], + ); + } +} diff --git a/siro_admin/lib/views/admin/rides/rides.dart b/siro_admin/lib/views/admin/rides/rides.dart new file mode 100644 index 0000000..2ef76da --- /dev/null +++ b/siro_admin/lib/views/admin/rides/rides.dart @@ -0,0 +1,236 @@ +import 'package:fl_chart/fl_chart.dart'; +import 'package:flutter/material.dart'; +import 'package:get/get.dart'; +import '../../../constant/colors.dart'; +import '../../../constant/style.dart'; +import '../../../controller/admin/ride_admin_controller.dart'; +import '../../widgets/my_scafold.dart'; +import '../../widgets/mycircular.dart'; + +class Rides extends StatelessWidget { + Rides({super.key}); + RideAdminController rideAdminController = Get.put(RideAdminController()); + @override + Widget build(BuildContext context) { + return MyScafolld(title: 'Rides'.tr, isleading: true, body: [ + GetBuilder( + builder: (rideAdminController) => rideAdminController.isLoading + ? const Center(child: MyCircularProgressIndicator()) + : Column( + children: [ + SizedBox( + height: Get.height * .4, + child: LineChart( + duration: const Duration(milliseconds: 150), + curve: Curves.ease, + LineChartData( + lineBarsData: [ + LineChartBarData( + spots: rideAdminController.chartData, + isCurved: true, + color: Colors.deepPurpleAccent, // Custom color + barWidth: 3, // Thinner line + dotData: const FlDotData( + show: true), // Show dots on each point + belowBarData: BarAreaData( + // Add gradient fill below the line + show: true, + color: AppColor.deepPurpleAccent, + ), + isStrokeJoinRound: true, + shadow: const BoxShadow( + color: AppColor.yellowColor, + blurRadius: 4, + offset: Offset(2, 2), + ), + ), + ], + showingTooltipIndicators: const [], + titlesData: FlTitlesData( + show: true, + topTitles: AxisTitles( + axisNameWidget: Text( + 'Days', + style: AppStyle.title, + ), + axisNameSize: 30, + sideTitles: const SideTitles( + reservedSize: 30, showTitles: true)), + bottomTitles: AxisTitles( + axisNameWidget: Text( + 'Total Trips on month'.tr, + style: AppStyle.title, + ), + axisNameSize: 30, + sideTitles: const SideTitles( + reservedSize: 30, showTitles: true)), + leftTitles: AxisTitles( + axisNameWidget: Text( + 'Counts of Trips on month'.tr, + style: AppStyle.title, + ), + axisNameSize: 30, + sideTitles: const SideTitles( + reservedSize: 30, showTitles: true)), + ), + gridData: const FlGridData( + show: true, + ), + borderData: FlBorderData( + show: true, + border: const Border( + bottom: BorderSide(color: AppColor.accentColor), + left: BorderSide(color: AppColor.accentColor), + ), + ), + ), + ), + ), + // SizedBox( + // height: Get.height * .4, + // child: PieChart( + // PieChartData( + // sectionsSpace: 4, // Adjust spacing between sections + // centerSpaceRadius: + // 40, // Adjust radius of center space + // sections: [ + // for (final rideData in rideAdminController.rideData) + // PieChartSectionData( + // value: rideData.ridesCount.toDouble(), + // title: '${rideData.day}', showTitle: true, + // titleStyle: + // AppStyle.subtitle, // Display day as title + // radius: 60, // Adjust radius of each section + // color: + // AppColor.deepPurpleAccent, // Custom color + // ), + // ], + // ), + // ), + // ), + + // SizedBox( + // // height: 400, + // child: SfCartesianChart( + // legend: const Legend( + // isVisible: true, + // position: LegendPosition.bottom, + // overflowMode: LegendItemOverflowMode.wrap, + // textStyle: TextStyle( + // color: Colors.white, + // fontSize: 12, + // fontWeight: FontWeight.bold, + // ), + // ), + // borderWidth: 2, + // borderColor: AppColor.blueColor, + // plotAreaBorderColor: AppColor.deepPurpleAccent, + // enableAxisAnimation: true, + // primaryXAxis: CategoryAxis( + // borderColor: AppColor.accentColor, borderWidth: 2, + // title: AxisTitle( + // text: 'Total Trips on month'.tr, + // textStyle: AppStyle.title, + // ), + // // labelRotation: 45, + // majorGridLines: const MajorGridLines(width: 0), + // ), + // primaryYAxis: const NumericAxis(isVisible: false), + // series: >[ + // LineSeries( + // dataSource: rideAdminController.chartDatasync, + // xValueMapper: (ChartDataS data, _) => '${data.day}', + // yValueMapper: (ChartDataS data, _) => + // data.ridesCount, + // dataLabelSettings: + // const DataLabelSettings(isVisible: true), + // ), + // ], + // ), + // ), + + const SizedBox( + height: 20, + ), + Card( + elevation: 4, + color: AppColor.deepPurpleAccent, + child: Padding( + padding: const EdgeInsets.all(8.0), + child: Text( + 'Total Trips on this Month is ${rideAdminController.jsonResponse['message'][0]['current_month_rides_count']}', + style: AppStyle.title, + ), + ), + ), + const SizedBox( + height: 20, + ), + Card( + elevation: 4, + color: AppColor.yellowColor, + child: Padding( + padding: const EdgeInsets.all(8.0), + child: Column( + children: [ + Text( + 'Driver Average Duration: ${rideAdminController.ridesDetails[0]['driver_avg_duration']}', + style: AppStyle.subtitle, + ), + Text( + 'Number of Drivers: ${rideAdminController.ridesDetails[0]['num_Driver']}', + style: AppStyle.subtitle, + ), + Text( + 'Total Rides: ${rideAdminController.ridesDetails[0]['total_rides']}', + style: AppStyle.subtitle, + ), + Text( + 'Ongoing Rides: ${rideAdminController.ridesDetails[0]['ongoing_rides']}', + style: AppStyle.subtitle, + ), + Text( + 'Completed Rides: ${rideAdminController.ridesDetails[0]['completed_rides']}', + style: AppStyle.subtitle, + ), + Text( + 'Cancelled Rides: ${rideAdminController.ridesDetails[0]['cancelled_rides']}', + style: AppStyle.subtitle, + ), + Text( + 'Longest Duration: ${rideAdminController.ridesDetails[0]['longest_duration']}', + style: AppStyle.subtitle, + ), + Text( + 'Total Distance: ${rideAdminController.ridesDetails[0]['total_distance']} km', + style: AppStyle.subtitle, + ), + Text( + 'Average Distance: ${rideAdminController.ridesDetails[0]['average_distance']} km', + style: AppStyle.subtitle, + ), + Text( + 'Longest Distance: ${rideAdminController.ridesDetails[0]['longest_distance']} km', + style: AppStyle.subtitle, + ), + Text( + 'Total Driver Earnings: \$${rideAdminController.ridesDetails[0]['total_driver_earnings']}', + style: AppStyle.subtitle, + ), + Text( + 'Total Company Earnings: \$${rideAdminController.ridesDetails[0]['total_company_earnings']}', + style: AppStyle.subtitle, + ), + Text( + 'Company Percentage: ${rideAdminController.ridesDetails[0]['companyPercent']} %', + style: AppStyle.subtitle, + ), + ], + ), + ), + ) + ], + )) + ]); + } +} diff --git a/siro_admin/lib/views/admin/security/audit_logs_page.dart b/siro_admin/lib/views/admin/security/audit_logs_page.dart new file mode 100644 index 0000000..0209655 --- /dev/null +++ b/siro_admin/lib/views/admin/security/audit_logs_page.dart @@ -0,0 +1,121 @@ +import 'package:flutter/material.dart'; +import 'package:get/get.dart'; +import 'package:siro_admin/constant/colors.dart'; +import 'package:siro_admin/controller/admin/security_v2_controller.dart'; +import 'package:intl/intl.dart'; + +class AuditLogsPage extends StatelessWidget { + const AuditLogsPage({super.key}); + + @override + Widget build(BuildContext context) { + final controller = Get.put(SecurityV2Controller()); + + return Scaffold( + backgroundColor: AppColor.bg, + appBar: AppBar( + title: const Text('سجل العمليات (Audit Logs)', + style: TextStyle(fontWeight: FontWeight.bold)), + backgroundColor: AppColor.surface, + elevation: 0, + centerTitle: true, + ), + body: GetBuilder( + builder: (ctrl) { + if (ctrl.isLoading) { + return const Center( + child: CircularProgressIndicator(color: AppColor.accent)); + } + + if (ctrl.auditLogs.isEmpty) { + return Center( + child: Column( + mainAxisAlignment: MainAxisAlignment.center, + children: [ + Icon(Icons.security_rounded, + size: 64, color: AppColor.textSecondary.withOpacity(0.3)), + const SizedBox(height: 16), + const Text('لا توجد عمليات مسجلة حالياً', + style: TextStyle(color: AppColor.textSecondary)), + const SizedBox(height: 8), + const Text( + 'تأكد من إنشاء جدول سجل العمليات في قاعدة البيانات', + style: TextStyle( + color: AppColor.textSecondary, fontSize: 10)), + ], + ), + ); + } + + return ListView.builder( + padding: const EdgeInsets.all(16), + itemCount: ctrl.auditLogs.length, + itemBuilder: (ctx, i) { + final log = ctrl.auditLogs[i]; + return _buildLogItem(log); + }, + ); + }, + ), + ); + } + + Widget _buildLogItem(Map log) { + return Container( + margin: const EdgeInsets.only(bottom: 12), + padding: const EdgeInsets.all(16), + decoration: BoxDecoration( + color: AppColor.surface, + borderRadius: BorderRadius.circular(16), + border: Border.all(color: AppColor.divider), + ), + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + Text(log['admin_name'] ?? 'أدمن غير معروف', + style: const TextStyle( + color: AppColor.accent, fontWeight: FontWeight.bold)), + Text(log['created_at'] ?? '', + style: const TextStyle( + color: AppColor.textSecondary, fontSize: 11)), + ], + ), + const SizedBox(height: 8), + Text(log['action'] ?? '', + style: const TextStyle( + color: AppColor.textPrimary, fontWeight: FontWeight.w600)), + if (log['details'] != null) ...[ + const SizedBox(height: 4), + Text(log['details'], + style: const TextStyle( + color: AppColor.textSecondary, fontSize: 12)), + ], + const SizedBox(height: 8), + Row( + children: [ + Container( + padding: const EdgeInsets.symmetric(horizontal: 8, vertical: 4), + decoration: BoxDecoration( + color: AppColor.info.withOpacity(0.1), + borderRadius: BorderRadius.circular(6), + ), + child: Text(log['table_name'] ?? '', + style: const TextStyle( + color: AppColor.info, + fontSize: 10, + fontWeight: FontWeight.bold)), + ), + const SizedBox(width: 8), + Text('ID: ${log['record_id']}', + style: const TextStyle( + color: AppColor.textSecondary, fontSize: 10)), + ], + ), + ], + ), + ); + } +} diff --git a/siro_admin/lib/views/admin/server/monitor_server_page.dart b/siro_admin/lib/views/admin/server/monitor_server_page.dart new file mode 100644 index 0000000..6b435c6 --- /dev/null +++ b/siro_admin/lib/views/admin/server/monitor_server_page.dart @@ -0,0 +1,669 @@ +import 'package:flutter/material.dart'; +import 'package:get/get.dart'; +import '../../../controller/server/server_monitor_controller.dart'; + +class ServerMonitorPage extends StatelessWidget { + const ServerMonitorPage({Key? key}) : super(key: key); + + @override + Widget build(BuildContext context) { + final controller = Get.put(ServerMonitorController()); + final themeColor = const Color(0xFF6366F1); + + return Scaffold( + backgroundColor: const Color(0xFF0A0E27), + body: RefreshIndicator( + onRefresh: controller.fetchServerData, + color: themeColor, + backgroundColor: const Color(0xFF1A1F3A), + child: CustomScrollView( + physics: const BouncingScrollPhysics(), + slivers: [ + // === 1. App Bar المتجاوب === + SliverAppBar( + expandedHeight: 100, + floating: true, + pinned: true, + backgroundColor: const Color(0xFF0A0E27), + elevation: 0, + flexibleSpace: FlexibleSpaceBar( + titlePadding: const EdgeInsets.only(bottom: 16), + title: Row( + mainAxisSize: MainAxisSize.min, + children: [ + const Icon(Icons.dns_rounded, + color: Colors.white, size: 20), + const SizedBox(width: 8), + const Text( + 'Server Monitor', + style: TextStyle( + fontWeight: FontWeight.bold, + fontSize: 18, + color: Colors.white, + fontFamily: 'Segoe UI', // أو أي خط تفضله + ), + ), + ], + ), + centerTitle: true, + background: Container( + decoration: BoxDecoration( + gradient: LinearGradient( + begin: Alignment.topCenter, + end: Alignment.bottomCenter, + colors: [ + themeColor.withOpacity(0.3), + const Color(0xFF0A0E27), + ], + ), + ), + ), + ), + actions: [ + _buildRefreshButton(controller), + ], + ), + + // === 2. المحتوى الرئيسي === + SliverPadding( + padding: const EdgeInsets.symmetric(horizontal: 16, vertical: 8), + sliver: Obx(() { + if (controller.isLoading.value && + controller.serverData.value == null) { + return const SliverFillRemaining(child: _LoadingState()); + } + + if (controller.errorMessage.isNotEmpty) { + return SliverFillRemaining( + child: _ErrorState(controller: controller)); + } + + final data = controller.serverData.value!; + + return SliverToBoxAdapter( + child: Center( + child: ConstrainedBox( + constraints: const BoxConstraints( + maxWidth: + 1000), // لمنع التمدد الزائد في الشاشات الكبيرة + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + // معلومات الوقت والتشغيل + _HeaderInfo(data: data), + const SizedBox(height: 20), + + // بطاقات الأداء (CPU & RAM) + LayoutBuilder(builder: (context, constraints) { + return _buildCpuMemSection( + data, constraints.maxWidth > 600); + }), + const SizedBox(height: 20), + + // القسم المتغير (خدمات + عمليات + تخزين) + LayoutBuilder(builder: (context, constraints) { + // إذا كانت الشاشة كبيرة (تابلت/ديسكتوب) + if (constraints.maxWidth > 800) { + return Row( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + // العمود الأول: الخدمات والشبكة + Expanded( + flex: 4, + child: Column( + children: [ + _ServicesCard(data: data), + const SizedBox(height: 20), + _StorageNetworkCard(data: data), + ], + ), + ), + const SizedBox(width: 20), + // العمود الثاني: العمليات + Expanded( + flex: 6, + child: _TopProcessesCard( + data: data, + height: + 600), // ارتفاع ثابت في وضع الكمبيوتر + ), + ], + ); + } + // إذا كانت الشاشة موبايل + else { + return Column( + children: [ + _ServicesCard(data: data), + const SizedBox(height: 16), + _StorageNetworkCard(data: data), + const SizedBox(height: 16), + _TopProcessesCard( + data: data), // ارتفاع ديناميكي + ], + ); + } + }), + + const SizedBox(height: 40), + ], + ), + ), + ), + ); + }), + ), + ], + ), + ), + ); + } + + Widget _buildRefreshButton(ServerMonitorController controller) { + return Obx(() => Container( + margin: const EdgeInsets.symmetric(horizontal: 16, vertical: 8), + decoration: BoxDecoration( + color: Colors.white.withOpacity(0.1), + borderRadius: BorderRadius.circular(12), + ), + child: IconButton( + icon: controller.isLoading.value + ? const SizedBox( + width: 20, + height: 20, + child: CircularProgressIndicator( + strokeWidth: 2, color: Colors.white), + ) + : const Icon(Icons.refresh_rounded, color: Colors.white), + onPressed: controller.fetchServerData, + ), + )); + } + + // دمج بطاقات المعالج والذاكرة + Widget _buildCpuMemSection(dynamic data, bool isWide) { + List cards = [ + _MetricCard( + title: "المعالج (CPU)", + value: "${data.cpu.percent}%", + subtitle: "${data.cpu.cores} Cores", + icon: Icons.memory, + percent: data.cpu.percent.toDouble(), + color: const Color(0xFFFF6B6B), + ), + SizedBox(width: isWide ? 20 : 0, height: isWide ? 0 : 16), + _MetricCard( + title: "الذاكرة (RAM)", + value: "${data.memory.percent}%", + subtitle: "${data.memory.usedGb}/${data.memory.totalGb} GB", + icon: Icons.sd_storage_rounded, + percent: data.memory.percent.toDouble(), + color: const Color(0xFF4E54C8), + ), + ]; + + return isWide + ? Row( + children: cards + .map((e) => e is SizedBox ? e : Expanded(child: e)) + .toList()) + : Column(children: cards); + } +} + +// === مكونات فرعية معاد استخدامها (Widgets) === + +class _HeaderInfo extends StatelessWidget { + final dynamic data; + const _HeaderInfo({required this.data}); + + @override + Widget build(BuildContext context) { + return Container( + padding: const EdgeInsets.symmetric(vertical: 12, horizontal: 16), + decoration: BoxDecoration( + color: Colors.white.withOpacity(0.05), + borderRadius: BorderRadius.circular(50), + border: Border.all(color: Colors.white.withOpacity(0.1)), + ), + child: Row( + mainAxisSize: MainAxisSize.min, + children: [ + Icon(Icons.timer_outlined, + size: 16, color: Colors.greenAccent.withOpacity(0.8)), + const SizedBox(width: 8), + Text( + "Uptime: ${data.uptime.formatted}", + style: const TextStyle( + color: Colors.white70, + fontSize: 12, + fontWeight: FontWeight.w500), + ), + Container( + width: 1, + height: 12, + color: Colors.white24, + margin: const EdgeInsets.symmetric(horizontal: 12)), + Icon(Icons.update, + size: 16, color: Colors.blueAccent.withOpacity(0.8)), + const SizedBox(width: 8), + Text( + "Last Update: ${data.timestamp.split(' ')[1]}", + style: const TextStyle(color: Colors.white70, fontSize: 12), + ), + ], + ), + ); + } +} + +class _MetricCard extends StatelessWidget { + final String title; + final String value; + final String subtitle; + final IconData icon; + final double percent; + final Color color; + + const _MetricCard({ + required this.title, + required this.value, + required this.subtitle, + required this.icon, + required this.percent, + required this.color, + }); + + @override + Widget build(BuildContext context) { + return Container( + padding: const EdgeInsets.all(20), + decoration: BoxDecoration( + gradient: LinearGradient( + begin: Alignment.topLeft, + end: Alignment.bottomRight, + colors: [color.withOpacity(0.9), color.withOpacity(0.6)], + ), + borderRadius: BorderRadius.circular(24), + boxShadow: [ + BoxShadow( + color: color.withOpacity(0.3), + blurRadius: 12, + offset: const Offset(0, 8), + ), + ], + ), + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + Container( + padding: const EdgeInsets.all(10), + decoration: BoxDecoration( + color: Colors.white.withOpacity(0.2), + borderRadius: BorderRadius.circular(12), + ), + child: Icon(icon, color: Colors.white, size: 24), + ), + Text( + value, + style: const TextStyle( + color: Colors.white, + fontSize: 28, + fontWeight: FontWeight.bold), + ), + ], + ), + const SizedBox(height: 16), + Text(title, + style: const TextStyle(color: Colors.white70, fontSize: 14)), + const SizedBox(height: 4), + Text(subtitle, + style: const TextStyle( + color: Colors.white, + fontSize: 16, + fontWeight: FontWeight.w600)), + const SizedBox(height: 12), + ClipRRect( + borderRadius: BorderRadius.circular(4), + child: LinearProgressIndicator( + value: percent / 100, + minHeight: 6, + backgroundColor: Colors.black12, + valueColor: const AlwaysStoppedAnimation(Colors.white), + ), + ), + ], + ), + ); + } +} + +class _ServicesCard extends StatelessWidget { + final dynamic data; + const _ServicesCard({required this.data}); + + @override + Widget build(BuildContext context) { + return _BaseCard( + title: "حالة الخدمات", + icon: Icons.security, + iconColor: Colors.tealAccent, + child: Column( + children: data.services.entries.map((e) { + final isActive = e.value == 'active'; + return Container( + margin: const EdgeInsets.only(bottom: 10), + padding: const EdgeInsets.all(12), + decoration: BoxDecoration( + color: const Color(0xFF0F1629), + borderRadius: BorderRadius.circular(12), + border: Border.all( + color: isActive + ? Colors.green.withOpacity(0.3) + : Colors.red.withOpacity(0.3), + ), + ), + child: Row( + children: [ + CircleAvatar( + radius: 4, + backgroundColor: + isActive ? Colors.greenAccent : Colors.redAccent, + ), + const SizedBox(width: 12), + Expanded( + child: Text( + e.key.toUpperCase(), + style: const TextStyle( + color: Colors.white, fontWeight: FontWeight.w600), + ), + ), + Container( + padding: + const EdgeInsets.symmetric(horizontal: 8, vertical: 4), + decoration: BoxDecoration( + color: isActive + ? Colors.green.withOpacity(0.1) + : Colors.red.withOpacity(0.1), + borderRadius: BorderRadius.circular(6), + ), + child: Text( + isActive ? "Running" : "Stopped", + style: TextStyle( + color: isActive ? Colors.greenAccent : Colors.redAccent, + fontSize: 10, + fontWeight: FontWeight.bold, + ), + ), + ), + ], + ), + ); + }).toList(), + ), + ); + } +} + +class _StorageNetworkCard extends StatelessWidget { + final dynamic data; + const _StorageNetworkCard({required this.data}); + + @override + Widget build(BuildContext context) { + return _BaseCard( + title: "التخزين والشبكة", + icon: Icons.cloud_queue_rounded, + iconColor: Colors.purpleAccent, + child: Column( + children: [ + _buildRowItem(Icons.pie_chart_outline, "Storage", + "${data.disk.percent}%", "${data.disk.usedGb} GB Used"), + const Divider(color: Colors.white10, height: 24), + _buildRowItem(Icons.download_rounded, "Download", + "${data.network.receivedMb} MB", "In"), + const SizedBox(height: 16), + _buildRowItem(Icons.upload_rounded, "Upload", + "${data.network.sentMb} MB", "Out"), + ], + ), + ); + } + + Widget _buildRowItem(IconData icon, String label, String value, String sub) { + return Row( + children: [ + Icon(icon, color: Colors.white54, size: 20), + const SizedBox(width: 12), + Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Text(label, + style: const TextStyle(color: Colors.white60, fontSize: 12)), + Text(sub, + style: TextStyle( + color: Colors.white.withOpacity(0.4), fontSize: 10)), + ], + ), + const Spacer(), + Text(value, + style: const TextStyle( + color: Colors.white, + fontWeight: FontWeight.bold, + fontSize: 16)), + ], + ); + } +} + +class _TopProcessesCard extends StatelessWidget { + final dynamic data; + final double? height; + const _TopProcessesCard({required this.data, this.height}); + + @override + Widget build(BuildContext context) { + return Container( + height: height, // إذا كان null سيأخذ الارتفاع بناءً على المحتوى + decoration: BoxDecoration( + color: const Color(0xFF1A1F3A), + borderRadius: BorderRadius.circular(24), + border: Border.all(color: Colors.white.withOpacity(0.05)), + ), + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Padding( + padding: const EdgeInsets.all(20), + child: Row( + children: [ + Container( + padding: const EdgeInsets.all(8), + decoration: BoxDecoration( + color: Colors.orange.withOpacity(0.1), + borderRadius: BorderRadius.circular(8)), + child: const Icon(Icons.analytics_rounded, + color: Colors.orange, size: 18), + ), + const SizedBox(width: 12), + const Text("Top Processes", + style: TextStyle( + color: Colors.white, + fontSize: 16, + fontWeight: FontWeight.bold)), + ], + ), + ), + const Divider(height: 1, color: Colors.white10), + // نستخدم ListView.builder داخل Expanded إذا كان هناك ارتفاع محدد، وإلا Column للموبايل + height != null + ? Expanded(child: _buildList()) + : _buildList(shrinkWrap: true), + ], + ), + ); + } + + Widget _buildList({bool shrinkWrap = false}) { + return ListView.separated( + padding: const EdgeInsets.all(16), + physics: shrinkWrap + ? const NeverScrollableScrollPhysics() + : const BouncingScrollPhysics(), + shrinkWrap: shrinkWrap, + itemCount: data.topProcesses.length, + separatorBuilder: (_, __) => const SizedBox(height: 12), + itemBuilder: (context, index) { + final process = data.topProcesses[index]; + return Container( + padding: const EdgeInsets.all(12), + decoration: BoxDecoration( + color: Colors.white.withOpacity(0.03), + borderRadius: BorderRadius.circular(12), + ), + child: Row( + children: [ + Text("#${index + 1}", + style: const TextStyle( + color: Colors.white38, fontWeight: FontWeight.bold)), + const SizedBox(width: 12), + Expanded( + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Text(process.name, + style: const TextStyle( + color: Colors.white, fontWeight: FontWeight.w500), + overflow: TextOverflow.ellipsis), + ], + ), + ), + Container( + padding: + const EdgeInsets.symmetric(horizontal: 10, vertical: 6), + decoration: BoxDecoration( + color: Colors.orange.withOpacity(0.1), + borderRadius: BorderRadius.circular(20), + ), + child: Text( + process.usage, + style: const TextStyle( + color: Colors.orangeAccent, + fontSize: 12, + fontWeight: FontWeight.bold), + ), + ), + ], + ), + ); + }, + ); + } +} + +class _BaseCard extends StatelessWidget { + final String title; + final IconData icon; + final Color iconColor; + final Widget child; + + const _BaseCard({ + required this.title, + required this.icon, + required this.iconColor, + required this.child, + }); + + @override + Widget build(BuildContext context) { + return Container( + width: double.infinity, + padding: const EdgeInsets.all(20), + decoration: BoxDecoration( + color: const Color(0xFF1A1F3A), + borderRadius: BorderRadius.circular(24), + border: Border.all(color: Colors.white.withOpacity(0.05)), + ), + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Row( + children: [ + Container( + padding: const EdgeInsets.all(8), + decoration: BoxDecoration( + color: iconColor.withOpacity(0.1), + borderRadius: BorderRadius.circular(8)), + child: Icon(icon, color: iconColor, size: 18), + ), + const SizedBox(width: 12), + Text(title, + style: const TextStyle( + color: Colors.white, + fontSize: 16, + fontWeight: FontWeight.bold)), + ], + ), + const SizedBox(height: 20), + child, + ], + ), + ); + } +} + +class _LoadingState extends StatelessWidget { + const _LoadingState(); + + @override + Widget build(BuildContext context) { + return Center( + child: Column( + mainAxisAlignment: MainAxisAlignment.center, + children: [ + const CircularProgressIndicator(color: Color(0xFF6366F1)), + const SizedBox(height: 16), + Text("Connecting to server...", + style: TextStyle(color: Colors.white.withOpacity(0.5))), + ], + ), + ); + } +} + +class _ErrorState extends StatelessWidget { + final ServerMonitorController controller; + const _ErrorState({required this.controller}); + + @override + Widget build(BuildContext context) { + return Center( + child: Padding( + padding: const EdgeInsets.all(20.0), + child: Column( + mainAxisAlignment: MainAxisAlignment.center, + children: [ + const Icon(Icons.cloud_off_rounded, + size: 60, color: Colors.redAccent), + const SizedBox(height: 16), + Text(controller.errorMessage.value, + textAlign: TextAlign.center, + style: const TextStyle(color: Colors.white)), + const SizedBox(height: 24), + ElevatedButton( + onPressed: controller.fetchServerData, + style: ElevatedButton.styleFrom( + backgroundColor: const Color(0xFF6366F1), + shape: const StadiumBorder(), + ), + child: const Text("Try Again"), + ) + ], + ), + ), + ); + } +} diff --git a/siro_admin/lib/views/admin/staff/add_staff_page.dart b/siro_admin/lib/views/admin/staff/add_staff_page.dart new file mode 100644 index 0000000..057bf89 --- /dev/null +++ b/siro_admin/lib/views/admin/staff/add_staff_page.dart @@ -0,0 +1,195 @@ +import 'package:flutter/material.dart'; +import 'package:get/get.dart'; +import '../../../controller/admin/staff_controller.dart'; + +class AddStaffPage extends StatelessWidget { + final String role; // 'admin' or 'service' + const AddStaffPage({super.key, required this.role}); + + @override + Widget build(BuildContext context) { + final controller = Get.put(StaffController()); + controller.selectedRole = role; + + const Color bgColor = Color(0xFF0D1117); + const Color inputColor = Color(0xFF161B22); + const Color accentColor = Color(0xFF00D4AA); + + return Scaffold( + backgroundColor: bgColor, + appBar: AppBar( + title: Text(role == 'admin' ? "إضافة مدير جديد" : "إضافة موظف خدمة عملاء"), + backgroundColor: bgColor, + elevation: 0, + ), + body: SingleChildScrollView( + padding: const EdgeInsets.all(24), + child: Form( + key: controller.formKey, + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + _buildSectionTitle("المعلومات الأساسية"), + const SizedBox(height: 16), + _buildTextField( + controller: controller.nameController, + label: "الاسم الكامل", + icon: Icons.person_outline, + fillColor: inputColor, + ), + const SizedBox(height: 16), + _buildTextField( + controller: controller.phoneController, + label: "رقم الهاتف", + icon: Icons.phone_android_outlined, + fillColor: inputColor, + keyboardType: TextInputType.phone, + ), + const SizedBox(height: 16), + _buildTextField( + controller: controller.emailController, + label: "البريد الإلكتروني", + icon: Icons.email_outlined, + fillColor: inputColor, + keyboardType: TextInputType.emailAddress, + ), + const SizedBox(height: 16), + _buildTextField( + controller: controller.passwordController, + label: "كلمة المرور", + icon: Icons.lock_outline, + fillColor: inputColor, + obscureText: true, + ), + const SizedBox(height: 24), + _buildSectionTitle("معلومات إضافية"), + const SizedBox(height: 16), + Row( + children: [ + Expanded( + child: _buildDropdown( + label: "الجنس", + value: controller.selectedGender, + items: ['Male', 'Female'], + onChanged: (val) => controller.selectedGender = val!, + fillColor: inputColor, + ), + ), + const SizedBox(width: 16), + Expanded( + child: _buildTextField( + controller: controller.birthdateController, + label: "تاريخ الميلاد", + icon: Icons.calendar_today_outlined, + fillColor: inputColor, + hint: "YYYY-MM-DD", + ), + ), + ], + ), + const SizedBox(height: 40), + GetBuilder( + builder: (controller) => SizedBox( + width: double.infinity, + height: 56, + child: ElevatedButton( + onPressed: controller.isLoading ? null : () => controller.registerStaff(), + style: ElevatedButton.styleFrom( + backgroundColor: accentColor, + shape: RoundedRectangleBorder(borderRadius: BorderRadius.circular(12)), + ), + child: controller.isLoading + ? const CircularProgressIndicator(color: Colors.white) + : Text( + "حفظ البيانات", + style: TextStyle( + fontSize: 16, + fontWeight: FontWeight.bold, + color: bgColor, + ), + ), + ), + ), + ), + ], + ), + ), + ), + ); + } + + Widget _buildSectionTitle(String title) { + return Text( + title, + style: const TextStyle( + color: Color(0xFF7D8590), + fontSize: 13, + fontWeight: FontWeight.bold, + letterSpacing: 1.2, + ), + ); + } + + Widget _buildTextField({ + required TextEditingController controller, + required String label, + required IconData icon, + required Color fillColor, + String? hint, + bool obscureText = false, + TextInputType keyboardType = TextInputType.text, + }) { + return Container( + decoration: BoxDecoration( + color: fillColor, + borderRadius: BorderRadius.circular(12), + border: Border.all(color: Colors.white.withOpacity(0.05)), + ), + child: TextFormField( + controller: controller, + obscureText: obscureText, + keyboardType: keyboardType, + style: const TextStyle(color: Colors.white), + decoration: InputDecoration( + labelText: label, + hintText: hint, + hintStyle: const TextStyle(color: Colors.white24), + labelStyle: const TextStyle(color: Colors.white54), + prefixIcon: Icon(icon, color: Colors.white38), + border: InputBorder.none, + contentPadding: const EdgeInsets.symmetric(horizontal: 16, vertical: 14), + ), + validator: (val) => val == null || val.isEmpty ? "هذا الحقل مطلوب" : null, + ), + ); + } + + Widget _buildDropdown({ + required String label, + required String value, + required List items, + required Function(String?) onChanged, + required Color fillColor, + }) { + return Container( + padding: const EdgeInsets.symmetric(horizontal: 16), + decoration: BoxDecoration( + color: fillColor, + borderRadius: BorderRadius.circular(12), + border: Border.all(color: Colors.white.withOpacity(0.05)), + ), + child: DropdownButtonFormField( + value: value, + dropdownColor: fillColor, + style: const TextStyle(color: Colors.white), + decoration: InputDecoration( + labelText: label, + labelStyle: const TextStyle(color: Colors.white54), + border: InputBorder.none, + ), + items: items.map((e) => DropdownMenuItem(value: e, child: Text(e))).toList(), + onChanged: onChanged, + ), + ); + } +} diff --git a/siro_admin/lib/views/admin/staff/pending_admins_page.dart b/siro_admin/lib/views/admin/staff/pending_admins_page.dart new file mode 100644 index 0000000..d8e2f57 --- /dev/null +++ b/siro_admin/lib/views/admin/staff/pending_admins_page.dart @@ -0,0 +1,148 @@ +import 'package:flutter/material.dart'; +import '../../../constant/links.dart'; +import '../../../controller/functions/crud.dart'; +import '../../widgets/snackbar.dart'; + +class PendingAdminsPage extends StatefulWidget { + const PendingAdminsPage({super.key}); + + @override + State createState() => _PendingAdminsPageState(); +} + +class _PendingAdminsPageState extends State { + final CRUD _crud = CRUD(); + bool _isLoading = true; + List _pendingAdmins = []; + + @override + void initState() { + super.initState(); + _fetchPendingAdmins(); + } + + Future _fetchPendingAdmins() async { + setState(() => _isLoading = true); + try { + final response = await _crud.post( + link: '${AppLink.server}/Admin/auth/list_pending.php', + ); + if (response != 'failure') { + setState(() { + _pendingAdmins = response['message'] ?? []; + }); + } + } catch (e) { + mySnackeBarError('فشل في جلب البيانات: $e'); + } finally { + setState(() => _isLoading = false); + } + } + + Future _handleAction(String adminId, String action) async { + try { + final response = await _crud.post( + link: '${AppLink.server}/Admin/auth/approve_admin.php', + payload: { + 'admin_id': adminId, + 'action': action, + }, + ); + if (response != 'failure') { + mySnackbarSuccess('تم تنفيذ الإجراء بنجاح'); + _fetchPendingAdmins(); // تحديث القائمة + } + } catch (e) { + mySnackeBarError('حدث خطأ: $e'); + } + } + + @override + Widget build(BuildContext context) { + return Scaffold( + backgroundColor: const Color(0xFF0A0D14), + appBar: AppBar( + title: const Text('طلبات الانضمام المعلقة', style: TextStyle(fontWeight: FontWeight.bold)), + backgroundColor: const Color(0xFF161D2E), + elevation: 0, + ), + body: _isLoading + ? const Center(child: CircularProgressIndicator(color: Color(0xFF00E5FF))) + : _pendingAdmins.isEmpty + ? _buildEmptyState() + : _buildList(), + ); + } + + Widget _buildEmptyState() { + return Center( + child: Column( + mainAxisAlignment: MainAxisAlignment.center, + children: [ + Icon(Icons.person_search_rounded, size: 80, color: Colors.grey[800]), + const SizedBox(height: 16), + const Text('لا توجد طلبات معلقة حالياً', style: TextStyle(color: Colors.grey)), + ], + ), + ); + } + + Widget _buildList() { + return ListView.builder( + padding: const EdgeInsets.all(16), + itemCount: _pendingAdmins.length, + itemBuilder: (context, index) { + final admin = _pendingAdmins[index]; + return Container( + margin: const EdgeInsets.only(bottom: 16), + padding: const EdgeInsets.all(16), + decoration: BoxDecoration( + color: const Color(0xFF161D2E), + borderRadius: BorderRadius.circular(16), + border: Border.all(color: const Color(0xFF1F2D4A)), + ), + child: Column( + children: [ + ListTile( + contentPadding: EdgeInsets.zero, + leading: const CircleAvatar( + backgroundColor: Color(0xFF1F2D4A), + child: Icon(Icons.person, color: Color(0xFF00E5FF)), + ), + title: Text(admin['name'] ?? 'بدون اسم', style: const TextStyle(color: Colors.white, fontWeight: FontWeight.bold)), + subtitle: Text(admin['phone'] ?? 'بدون رقم', style: const TextStyle(color: Colors.grey)), + trailing: Text( + admin['created_at']?.split(' ')[0] ?? '', + style: const TextStyle(color: Colors.grey, fontSize: 12), + ), + ), + const Divider(color: Color(0xFF1F2D4A), height: 24), + Row( + mainAxisAlignment: MainAxisAlignment.end, + children: [ + TextButton( + onPressed: () => _handleAction(admin['id'], 'rejected'), + style: TextButton.styleFrom(foregroundColor: Colors.redAccent), + child: const Text('رفض'), + ), + const SizedBox(width: 8), + ElevatedButton( + onPressed: () => _handleAction(admin['id'], 'approved'), + style: ElevatedButton.styleFrom( + backgroundColor: const Color(0xFF00E5FF), + foregroundColor: Colors.black, + shape: RoundedRectangleBorder( + borderRadius: BorderRadius.circular(10), + ), + ), + child: const Text('موافقة', style: TextStyle(fontWeight: FontWeight.bold)), + ), + ], + ), + ], + ), + ); + }, + ); + } +} diff --git a/siro_admin/lib/views/admin/static/advanced_analytics_page.dart b/siro_admin/lib/views/admin/static/advanced_analytics_page.dart new file mode 100644 index 0000000..9b3cd75 --- /dev/null +++ b/siro_admin/lib/views/admin/static/advanced_analytics_page.dart @@ -0,0 +1,323 @@ +import 'package:fl_chart/fl_chart.dart'; +import 'package:flutter/material.dart'; +import 'package:get/get.dart'; +import 'package:siro_admin/constant/colors.dart'; +import 'package:siro_admin/controller/admin/analytics_v2_controller.dart'; +import 'package:intl/intl.dart'; + +class AdvancedAnalyticsPage extends StatelessWidget { + const AdvancedAnalyticsPage({super.key}); + + @override + Widget build(BuildContext context) { + final controller = Get.put(AnalyticsV2Controller()); + + return Scaffold( + backgroundColor: AppColor.bg, + appBar: AppBar( + title: const Text('التحليلات المتقدمة', + style: TextStyle(fontWeight: FontWeight.bold)), + backgroundColor: AppColor.surface, + elevation: 0, + centerTitle: true, + actions: [ + IconButton( + icon: const Icon(Icons.refresh_rounded), + onPressed: () => controller.fetchAllAnalytics(), + ) + ], + ), + body: GetBuilder( + builder: (ctrl) { + if (ctrl.isLoading) { + return const Center( + child: CircularProgressIndicator(color: AppColor.accent)); + } + + return SingleChildScrollView( + padding: const EdgeInsets.all(16), + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + _buildSummarySection(ctrl.revenueData['summary']), + const SizedBox(height: 24), + _buildSectionTitle('إيرادات آخر 30 يوم'), + _buildRevenueChart(ctrl.revenueData['daily'] ?? []), + const SizedBox(height: 32), + _buildSectionTitle('نمو المستخدمين (آخر 30 يوم)'), + _buildGrowthChart(ctrl.growthData), + const SizedBox(height: 32), + _buildSectionTitle('أفضل 10 سائقين (حسب الرحلات)'), + _buildTopDriversList(ctrl.topDrivers), + const SizedBox(height: 40), + ], + ), + ); + }, + ), + ); + } + + Widget _buildSectionTitle(String title) { + return Padding( + padding: const EdgeInsets.only(bottom: 16), + child: Text( + title, + style: const TextStyle( + color: AppColor.textPrimary, + fontSize: 16, + fontWeight: FontWeight.bold, + ), + ), + ); + } + + Widget _buildSummarySection(Map? summary) { + if (summary == null) return const SizedBox(); + + return Row( + children: [ + _buildSummaryCard('إجمالي الإيرادات', + '${summary['total_revenue_all'] ?? 0}', AppColor.info), + const SizedBox(width: 12), + _buildSummaryCard('صافي الربح', '${summary['total_profit_all'] ?? 0}', + AppColor.success), + ], + ); + } + + Widget _buildSummaryCard(String title, String value, Color color) { + return Expanded( + child: Container( + padding: const EdgeInsets.all(20), + decoration: BoxDecoration( + color: AppColor.surface, + borderRadius: BorderRadius.circular(20), + border: Border.all(color: color.withOpacity(0.3)), + ), + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Text(title, + style: const TextStyle( + color: AppColor.textSecondary, fontSize: 12)), + const SizedBox(height: 8), + Text(value, + style: TextStyle( + color: color, fontSize: 22, fontWeight: FontWeight.bold)), + ], + ), + ), + ); + } + + Widget _buildRevenueChart(List daily) { + if (daily.isEmpty) return const Center(child: Text('لا توجد بيانات')); + + List revenueSpots = []; + List profitSpots = []; + + for (int i = 0; i < daily.length; i++) { + revenueSpots.add(FlSpot(i.toDouble(), + double.tryParse(daily[i]['total_revenue'].toString()) ?? 0)); + profitSpots.add(FlSpot(i.toDouble(), + double.tryParse(daily[i]['company_profit'].toString()) ?? 0)); + } + + return Container( + height: 300, + padding: const EdgeInsets.all(16), + decoration: BoxDecoration( + color: AppColor.surface, + borderRadius: BorderRadius.circular(24), + ), + child: LineChart( + LineChartData( + gridData: FlGridData( + show: true, + drawVerticalLine: false, + getDrawingHorizontalLine: (v) => + FlLine(color: AppColor.divider, strokeWidth: 1)), + titlesData: FlTitlesData( + show: true, + rightTitles: + const AxisTitles(sideTitles: SideTitles(showTitles: false)), + topTitles: + const AxisTitles(sideTitles: SideTitles(showTitles: false)), + bottomTitles: AxisTitles( + sideTitles: SideTitles( + showTitles: true, + getTitlesWidget: (val, meta) { + if (val.toInt() % 7 == 0 && val.toInt() < daily.length) { + return Text( + daily[val.toInt()]['date'].toString().substring(8), + style: const TextStyle( + color: AppColor.textSecondary, fontSize: 10)); + } + return const SizedBox(); + }, + ), + ), + ), + borderData: FlBorderData(show: false), + lineBarsData: [ + LineChartBarData( + spots: revenueSpots, + isCurved: true, + color: AppColor.info, + barWidth: 3, + isStrokeCapRound: true, + dotData: const FlDotData(show: false), + belowBarData: BarAreaData( + show: true, color: AppColor.info.withOpacity(0.1)), + ), + LineChartBarData( + spots: profitSpots, + isCurved: true, + color: AppColor.success, + barWidth: 3, + isStrokeCapRound: true, + dotData: const FlDotData(show: false), + belowBarData: BarAreaData( + show: true, color: AppColor.success.withOpacity(0.1)), + ), + ], + ), + ), + ); + } + + Widget _buildGrowthChart(Map data) { + final passengers = data['passenger_daily'] as List? ?? []; + final drivers = data['driver_daily'] as List? ?? []; + + if (passengers.isEmpty && drivers.isEmpty) + return const Center(child: Text('لا توجد بيانات')); + + List barGroups = []; + int maxLength = + passengers.length > drivers.length ? passengers.length : drivers.length; + + for (int i = 0; i < maxLength; i++) { + double pCount = i < passengers.length + ? double.tryParse(passengers[i]['new_passengers'].toString()) ?? 0 + : 0; + double dCount = i < drivers.length + ? double.tryParse(drivers[i]['new_drivers'].toString()) ?? 0 + : 0; + + barGroups.add( + BarChartGroupData( + x: i, + barRods: [ + BarChartRodData( + toY: pCount, + color: AppColor.info, + width: 8, + borderRadius: BorderRadius.circular(4)), + BarChartRodData( + toY: dCount, + color: AppColor.warning, + width: 8, + borderRadius: BorderRadius.circular(4)), + ], + ), + ); + } + + return Container( + height: 250, + padding: const EdgeInsets.all(16), + decoration: BoxDecoration( + color: AppColor.surface, + borderRadius: BorderRadius.circular(24), + ), + child: BarChart( + BarChartData( + barGroups: barGroups, + borderData: FlBorderData(show: false), + titlesData: FlTitlesData( + show: true, + rightTitles: + const AxisTitles(sideTitles: SideTitles(showTitles: false)), + topTitles: + const AxisTitles(sideTitles: SideTitles(showTitles: false)), + bottomTitles: AxisTitles( + sideTitles: SideTitles( + showTitles: true, + getTitlesWidget: (val, meta) { + if (val.toInt() % 7 == 0 && val.toInt() < passengers.length) { + return Text( + passengers[val.toInt()]['date'].toString().substring(8), + style: const TextStyle( + color: AppColor.textSecondary, fontSize: 10)); + } + return const SizedBox(); + }, + ), + ), + ), + ), + ), + ); + } + + Widget _buildTopDriversList(List drivers) { + if (drivers.isEmpty) return const Center(child: Text('لا توجد بيانات')); + + return ListView.builder( + shrinkWrap: true, + physics: const NeverScrollableScrollPhysics(), + itemCount: drivers.length, + itemBuilder: (ctx, i) { + final d = drivers[i]; + return Container( + margin: const EdgeInsets.only(bottom: 12), + padding: const EdgeInsets.all(16), + decoration: BoxDecoration( + color: AppColor.surface, + borderRadius: BorderRadius.circular(16), + ), + child: Row( + children: [ + CircleAvatar( + backgroundColor: AppColor.accent.withOpacity(0.1), + child: Text('${i + 1}', + style: const TextStyle( + color: AppColor.accent, fontWeight: FontWeight.bold)), + ), + const SizedBox(width: 16), + Expanded( + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Text('${d['first_name']} ${d['last_name']}', + style: const TextStyle( + color: AppColor.textPrimary, + fontWeight: FontWeight.bold)), + Text(d['phone'] ?? '', + style: const TextStyle( + color: AppColor.textSecondary, fontSize: 12)), + ], + ), + ), + Column( + crossAxisAlignment: CrossAxisAlignment.end, + children: [ + Text('${d['completed_rides']} رحلة', + style: const TextStyle( + color: AppColor.info, fontWeight: FontWeight.bold)), + Text('${d['total_revenue']} ل.س', + style: const TextStyle( + color: AppColor.success, + fontSize: 12, + fontWeight: FontWeight.bold)), + ], + ), + ], + ), + ); + }, + ); + } +} diff --git a/siro_admin/lib/views/admin/static/notes_driver_page.dart b/siro_admin/lib/views/admin/static/notes_driver_page.dart new file mode 100644 index 0000000..8dc55cb --- /dev/null +++ b/siro_admin/lib/views/admin/static/notes_driver_page.dart @@ -0,0 +1,163 @@ +import 'package:flutter/material.dart'; +import 'package:get/get.dart'; +import 'package:intl/intl.dart' hide TextDirection; +import 'package:siro_admin/controller/functions/launch.dart'; + +import '../../../controller/admin/static_controller.dart'; +import '../../widgets/mycircular.dart'; + +class DailyNotesView extends StatelessWidget { + const DailyNotesView({super.key}); + + @override + Widget build(BuildContext context) { + // نستخدم نفس الكونترولر للوصول لدالة جلب الملاحظات + final controller = Get.find(); + + // عند فتح الصفحة، نجلب ملاحظات اليوم الحالي + WidgetsBinding.instance.addPostFrameCallback((_) { + controller.fetchDailyNotes(DateTime.now()); + }); + + return Scaffold( + backgroundColor: const Color(0xFFF0F2F5), + appBar: AppBar( + title: Text( + 'سجل المكالمات اليومي', + style: const TextStyle( + color: Color(0xFF1A1A1A), + fontWeight: FontWeight.w800, + fontSize: 20, + ), + ), + centerTitle: true, + backgroundColor: Colors.white, + elevation: 0, + iconTheme: const IconThemeData(color: Colors.black87), + ), + body: GetBuilder( + builder: (controller) { + if (controller.isLoadingNotes) { + return const Center(child: MyCircularProgressIndicator()); + } + + if (controller.dailyNotesList.isEmpty) { + return Center( + child: Column( + mainAxisAlignment: MainAxisAlignment.center, + children: [ + Icon(Icons.note_alt_outlined, + size: 80, color: Colors.grey.shade300), + const SizedBox(height: 10), + Text("لا توجد سجلات لهذا اليوم", + style: TextStyle(color: Colors.grey.shade600)), + ], + ), + ); + } + + return ListView.separated( + padding: const EdgeInsets.all(16), + itemCount: controller.dailyNotesList.length, + separatorBuilder: (context, index) => const SizedBox(height: 12), + itemBuilder: (context, index) { + final note = controller.dailyNotesList[index]; + final String name = note['editor'] ?? note['name'] ?? 'Unknown'; + final String phone = note['phone'] ?? note['phone'] ?? 'Unknown'; + final String content = note['note'] ?? note['content'] ?? ''; + final String time = note['createdAt'] ?? ''; + + return Container( + padding: const EdgeInsets.all(16), + decoration: BoxDecoration( + color: Colors.white, + borderRadius: BorderRadius.circular(16), + boxShadow: [ + BoxShadow( + color: Colors.black.withOpacity(0.03), + blurRadius: 10, + offset: const Offset(0, 4), + ) + ], + border: Border( + right: BorderSide( + color: _getEmployeeColor(name), width: 4))), + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + Row( + children: [ + CircleAvatar( + radius: 14, + backgroundColor: + _getEmployeeColor(name).withOpacity(0.1), + child: Icon(Icons.person, + size: 16, color: _getEmployeeColor(name)), + ), + const SizedBox(width: 8), + Text( + name.toUpperCase(), + style: TextStyle( + fontWeight: FontWeight.bold, + color: Colors.grey.shade800, + fontSize: 14), + ), + const SizedBox(width: 100), + InkWell( + onTap: () { + makePhoneCall('+$phone'); + }, + child: Row( + children: [ + Text( + phone, + style: TextStyle( + fontWeight: FontWeight.bold, + color: Colors.grey.shade800, + fontSize: 14), + ), + Icon(Icons.phone) + ], + ), + ), + const SizedBox(width: 22), + Text( + time.split(' ').last, // عرض الوقت فقط + style: TextStyle( + color: Colors.grey.shade400, fontSize: 12), + textDirection: TextDirection.ltr, + ), + ], + ), + ], + ), + const Divider(height: 20), + Text( + content, + style: TextStyle( + fontSize: 14, + color: Colors.grey.shade700, + height: 1.5), + ), + ], + ), + ); + }, + ); + }, + ), + ); + } + + Color _getEmployeeColor(String name) { + String n = name.toLowerCase().trim(); + if (n.contains('shahd')) return Colors.redAccent; + if (n.contains('mayar')) return Colors.amber.shade700; + if (n.contains('rama2')) return Colors.green; + if (n.contains('rama1')) return Colors.blue; + return Colors.blueGrey; + } +} diff --git a/siro_admin/lib/views/admin/static/static.dart b/siro_admin/lib/views/admin/static/static.dart new file mode 100644 index 0000000..9662de3 --- /dev/null +++ b/siro_admin/lib/views/admin/static/static.dart @@ -0,0 +1,1326 @@ +import 'package:fl_chart/fl_chart.dart'; +import 'package:flutter/material.dart'; +import 'package:flutter_staggered_animations/flutter_staggered_animations.dart'; +import 'package:get/get.dart'; +import 'package:intl/intl.dart' hide TextDirection; +import 'package:siro_admin/controller/admin/static_controller.dart'; +import 'notes_driver_page.dart'; + +// ══════════════════════════════════════════════════════════════ +// DESIGN TOKENS +// ══════════════════════════════════════════════════════════════ +const Color _bg = Color(0xFF0D1117); +const Color _surface = Color(0xFF161B22); +const Color _surfaceElevated = Color(0xFF1C2333); +const Color _accent = Color(0xFF00D4AA); +const Color _danger = Color(0xFFFF5370); +const Color _warning = Color(0xFFFFCB6B); +const Color _info = Color(0xFF82AAFF); +const Color _purple = Color(0xFFC792EA); +const Color _textPrimary = Color(0xFFE6EDF3); +const Color _textSecondary = Color(0xFF7D8590); +const Color _divider = Color(0xFF21262D); + +class StaticDash extends StatelessWidget { + const StaticDash({super.key}); + + @override + Widget build(BuildContext context) { + final controller = Get.put(StaticController()); + + return Scaffold( + backgroundColor: _bg, + body: GetBuilder( + builder: (c) { + return CustomScrollView( + physics: const BouncingScrollPhysics(), + slivers: [ + // ── App Bar ──────────────────────────────────── + _SliverHeader(controller: c), + + if (c.isLoading) + const SliverFillRemaining(child: _LoadingState()) + else ...[ + // ── Date Badge ───────────────────────────── + SliverToBoxAdapter( + child: _DateBadge(controller: c), + ), + + // ── KPI Row ──────────────────────────────── + SliverToBoxAdapter( + child: _KpiRow(controller: c), + ), + + // ── Section: Growth ──────────────────────── + const SliverToBoxAdapter( + child: _SectionLabel( + 'نظرة عامة على النمو', + Icons.trending_up_rounded, + ), + ), + + SliverToBoxAdapter( + child: AnimationLimiter( + child: Column( + children: AnimationConfiguration.toStaggeredList( + duration: const Duration(milliseconds: 450), + childAnimationBuilder: (w) => SlideAnimation( + verticalOffset: 40, + child: FadeInAnimation(child: w), + ), + children: [ + _DarkChartCard( + title: 'الركاب', + total: c.totalMonthlyPassengers, + spots: c.chartDataPassengers, + compareSpots: c.isComparing + ? c.chartDataPassengersCompare + : null, + color: _info, + icon: Icons.groups_rounded, + controller: c, + ), + const SizedBox(height: 12), + _DarkChartCard( + title: 'السائقون', + total: c.totalMonthlyDrivers, + spots: c.chartDataDrivers, + compareSpots: c.isComparing + ? c.chartDataDriversCompare + : null, + color: _warning, + icon: Icons.drive_eta_rounded, + controller: c, + ), + const SizedBox(height: 12), + _DarkChartCard( + title: 'الرحلات', + total: c.totalMonthlyRides, + spots: c.chartDataRides, + compareSpots: + c.isComparing ? c.chartDataRidesCompare : null, + color: _purple, + icon: Icons.map_rounded, + controller: c, + ), + const SizedBox(height: 24), + ], + ), + ), + ), + ), + + // ── Section: Team Performance ────────────── + const SliverToBoxAdapter( + child: _SectionLabel( + 'أداء فريق العمل', + Icons.workspaces_filled, + ), + ), + + SliverToBoxAdapter( + child: Column( + children: [ + // Activations + _DynamicMultiLineCard( + title: 'تفعيل السائقين', + subtitle: 'Activations', + icon: Icons.how_to_reg_rounded, + controller: c, + getSpots: (emp) => emp.notesSpots, + getCompareSpots: (emp) => + c.employeeDataCompare[emp.name]?.notesSpots ?? [], + getTotal: (emp) => emp.totalNotes, + ), + const SizedBox(height: 12), + // Calls + _DynamicMultiLineCard( + title: 'عدد المكالمات', + subtitle: 'Calls', + icon: Icons.phone_in_talk_rounded, + controller: c, + getSpots: (emp) => emp.callsSpots, + getCompareSpots: (emp) => + c.employeeDataCompare[emp.name]?.callsSpots ?? [], + getTotal: (emp) => emp.totalCalls, + onTap: () => Get.to(() => const DailyNotesView()), + ), + const SizedBox(height: 24), + ], + ), + ), + + // ── Section: Employee Leaderboard ────────── + if (c.employmentStatsList.isNotEmpty) ...[ + const SliverToBoxAdapter( + child: _SectionLabel( + 'لوحة الصدارة', + Icons.emoji_events_rounded, + ), + ), + SliverToBoxAdapter( + child: _EmployeeLeaderboard(stats: c.employmentStatsList), + ), + const SliverToBoxAdapter(child: SizedBox(height: 24)), + ], + + // ── Section: Registration Follow-up ──────── + const SliverToBoxAdapter( + child: _SectionLabel( + 'متابعة التسجيل', + Icons.assignment_turned_in_rounded, + ), + ), + + SliverToBoxAdapter( + child: Column( + children: [ + _DarkChartCard( + title: 'سائقين بعد الاتصال', + total: c.staticList.isNotEmpty && + c.staticList[0]['totalMonthlyMatchingNotes'] != + null + ? c.staticList[0]['totalMonthlyMatchingNotes'] + .toString() + : '0', + spots: c.chartDataDriversMatchingNotes, + compareSpots: c.isComparing + ? c.chartDataDriversMatchingNotesCompare + : null, + color: _accent, + icon: Icons.phone_in_talk_rounded, + controller: c, + ), + const SizedBox(height: 60), + ], + ), + ), + ], + ], + ); + }, + ), + ); + } +} + +// ══════════════════════════════════════════════════════════════ +// SLIVER HEADER +// ══════════════════════════════════════════════════════════════ +class _SliverHeader extends StatelessWidget { + final StaticController controller; + const _SliverHeader({required this.controller}); + + @override + Widget build(BuildContext context) { + return SliverAppBar( + expandedHeight: 100, + pinned: true, + floating: true, + backgroundColor: _bg, + elevation: 0, + leading: GestureDetector( + onTap: () => Get.back(), + child: Container( + margin: const EdgeInsets.all(10), + decoration: BoxDecoration( + color: _surface, + borderRadius: BorderRadius.circular(10), + border: Border.all(color: _divider), + ), + child: const Icon(Icons.arrow_back_ios_new_rounded, + color: _textSecondary, size: 16), + ), + ), + flexibleSpace: FlexibleSpaceBar( + background: Container( + decoration: const BoxDecoration( + gradient: LinearGradient( + begin: Alignment.topLeft, + end: Alignment.bottomRight, + colors: [Color(0xFF0F1F1A), _bg], + ), + ), + child: Align( + alignment: Alignment.bottomCenter, + child: Padding( + padding: const EdgeInsets.only(bottom: 16), + child: Row( + mainAxisSize: MainAxisSize.min, + children: [ + Container( + padding: const EdgeInsets.all(8), + decoration: BoxDecoration( + color: _accent.withOpacity(0.12), + borderRadius: BorderRadius.circular(10), + border: Border.all(color: _accent.withOpacity(0.25)), + ), + child: const Icon(Icons.bar_chart_rounded, + color: _accent, size: 18), + ), + const SizedBox(width: 10), + ShaderMask( + shaderCallback: (b) => const LinearGradient( + colors: [_accent, _info], + ).createShader(b), + child: const Text( + 'لوحة الإحصائيات', + style: TextStyle( + color: Colors.white, + fontSize: 20, + fontWeight: FontWeight.w700, + ), + ), + ), + ], + ), + ), + ), + ), + ), + actions: [ + GestureDetector( + onTap: () async => await controller.getAll(), + child: Container( + margin: const EdgeInsets.only(right: 16, top: 10, bottom: 10), + padding: const EdgeInsets.all(8), + decoration: BoxDecoration( + color: _surface, + borderRadius: BorderRadius.circular(10), + border: Border.all(color: _divider), + ), + child: const Icon(Icons.refresh_rounded, + color: _textSecondary, size: 18), + ), + ), + ], + bottom: PreferredSize( + preferredSize: const Size.fromHeight(1), + child: Container(height: 1, color: _divider), + ), + ); + } +} + +// ══════════════════════════════════════════════════════════════ +// DATE BADGE +// ══════════════════════════════════════════════════════════════ +class _DateBadge extends StatelessWidget { + final StaticController controller; + const _DateBadge({required this.controller}); + + @override + Widget build(BuildContext context) { + return Padding( + padding: const EdgeInsets.fromLTRB(16, 16, 16, 4), + child: Row( + mainAxisAlignment: MainAxisAlignment.center, + children: [ + Container( + padding: const EdgeInsets.symmetric(horizontal: 14, vertical: 7), + decoration: BoxDecoration( + color: _surface, + borderRadius: BorderRadius.circular(20), + border: Border.all(color: _divider), + ), + child: Row( + mainAxisSize: MainAxisSize.min, + children: [ + const Icon(Icons.calendar_today_rounded, + color: _accent, size: 13), + const SizedBox(width: 7), + Text( + controller.currentDateString, + style: const TextStyle( + color: _textSecondary, + fontSize: 12, + fontWeight: FontWeight.w600, + ), + ), + ], + ), + ), + if (controller.isComparing) ...[ + const SizedBox(width: 8), + Container( + padding: const EdgeInsets.symmetric(horizontal: 14, vertical: 7), + decoration: BoxDecoration( + color: _surface, + borderRadius: BorderRadius.circular(20), + border: Border.all(color: Colors.grey.withOpacity(0.2)), + ), + child: Row( + mainAxisSize: MainAxisSize.min, + children: [ + Container( + width: 6, + height: 6, + decoration: const BoxDecoration( + shape: BoxShape.circle, + color: _textSecondary, + ), + ), + const SizedBox(width: 7), + Text( + controller.compareDateString, + style: const TextStyle( + color: _textSecondary, + fontSize: 12, + fontWeight: FontWeight.w500), + ), + ], + ), + ), + ] + ], + ), + ); + } +} + +// ══════════════════════════════════════════════════════════════ +// KPI ROW +// ══════════════════════════════════════════════════════════════ +class _KpiRow extends StatelessWidget { + final StaticController controller; + const _KpiRow({required this.controller}); + + @override + Widget build(BuildContext context) { + final items = [ + _KpiItem('الركاب', controller.totalMonthlyPassengers, + Icons.groups_rounded, _info), + _KpiItem('السائقون', controller.totalMonthlyDrivers, + Icons.drive_eta_rounded, _warning), + _KpiItem( + 'الرحلات', controller.totalMonthlyRides, Icons.map_rounded, _purple), + ]; + + return Padding( + padding: const EdgeInsets.fromLTRB(16, 12, 16, 4), + child: Row( + children: items + .map((item) => Expanded( + child: Padding( + padding: EdgeInsets.only(right: item != items.last ? 8 : 0), + child: _buildKpiCard(item), + ), + )) + .toList(), + ), + ); + } + + Widget _buildKpiCard(_KpiItem item) { + return Container( + padding: const EdgeInsets.all(14), + decoration: BoxDecoration( + color: _surface, + borderRadius: BorderRadius.circular(14), + border: Border.all(color: item.color.withOpacity(0.2)), + ), + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Icon(item.icon, color: item.color, size: 18), + const SizedBox(height: 8), + Text( + item.value, + style: const TextStyle( + color: _textPrimary, + fontSize: 20, + fontWeight: FontWeight.w800, + height: 1, + ), + ), + const SizedBox(height: 3), + Text(item.label, + style: const TextStyle(color: _textSecondary, fontSize: 10)), + ], + ), + ); + } +} + +class _KpiItem { + final String label, value; + final IconData icon; + final Color color; + const _KpiItem(this.label, this.value, this.icon, this.color); +} + +// ══════════════════════════════════════════════════════════════ +// SECTION LABEL +// ══════════════════════════════════════════════════════════════ +class _SectionLabel extends StatelessWidget { + final String text; + final IconData icon; + const _SectionLabel(this.text, this.icon); + + @override + Widget build(BuildContext context) { + return Padding( + padding: const EdgeInsets.fromLTRB(20, 24, 20, 12), + child: Row( + children: [ + Container( + width: 3, + height: 16, + decoration: BoxDecoration( + color: _accent, + borderRadius: BorderRadius.circular(2), + ), + ), + const SizedBox(width: 10), + Icon(icon, size: 16, color: _textSecondary), + const SizedBox(width: 8), + Text( + text, + style: const TextStyle( + color: _textPrimary, + fontSize: 15, + fontWeight: FontWeight.w700, + letterSpacing: 0.3, + ), + ), + ], + ), + ); + } +} + +// ══════════════════════════════════════════════════════════════ +// DARK SINGLE-LINE CHART CARD +// ══════════════════════════════════════════════════════════════ +class _DarkChartCard extends StatelessWidget { + final String title, total; + final List spots; + final List? compareSpots; + final Color color; + final IconData icon; + final StaticController controller; + + const _DarkChartCard({ + required this.title, + required this.total, + required this.spots, + this.compareSpots, + required this.color, + required this.icon, + required this.controller, + }); + + @override + Widget build(BuildContext context) { + final allSpots = [...spots, ...?compareSpots]; + final maxY = _maxY(allSpots); + final interval = _interval(maxY); + final days = _days(controller); + final xInterval = _xInterval(days); + + return Padding( + padding: const EdgeInsets.symmetric(horizontal: 16), + child: Container( + height: 340, + decoration: BoxDecoration( + color: _surface, + borderRadius: BorderRadius.circular(20), + border: Border.all(color: color.withOpacity(0.15)), + boxShadow: [ + BoxShadow( + color: color.withOpacity(0.06), + blurRadius: 20, + offset: const Offset(0, 8), + ), + ], + ), + child: Column( + children: [ + // Header + Padding( + padding: const EdgeInsets.all(18), + child: Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + Row(children: [ + Container( + padding: const EdgeInsets.all(9), + decoration: BoxDecoration( + color: color.withOpacity(0.12), + borderRadius: BorderRadius.circular(10), + border: Border.all(color: color.withOpacity(0.25)), + ), + child: Icon(icon, color: color, size: 18), + ), + const SizedBox(width: 12), + Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Text(title, + style: const TextStyle( + color: _textPrimary, + fontSize: 14, + fontWeight: FontWeight.w700)), + Text('الإجمالي: $total', + style: const TextStyle( + color: _textSecondary, fontSize: 11)), + ]), + ]), + if (controller.isComparing) + Row(children: [ + Container( + width: 16, + height: 2, + decoration: BoxDecoration( + color: _textSecondary, + borderRadius: BorderRadius.circular(1), + )), + const SizedBox(width: 5), + const Text('سابق', + style: + TextStyle(color: _textSecondary, fontSize: 10)), + ]), + ], + ), + ), + // Chart + Expanded( + child: Padding( + padding: const EdgeInsets.fromLTRB(4, 0, 12, 10), + child: Directionality( + textDirection: TextDirection.ltr, + child: LineChart(LineChartData( + minX: 1, + maxX: days > 0 ? days : 1, + minY: 0, + maxY: maxY, + lineTouchData: _tooltipData(controller, color), + gridData: _gridData(interval), + titlesData: + _titlesData(interval, xInterval, days, controller), + borderData: FlBorderData(show: false), + lineBarsData: [ + if (compareSpots != null && compareSpots!.isNotEmpty) + _line(compareSpots!, _textSecondary, + isDashed: true, isStep: true, width: 1.5), + _line(spots, color, isStep: true, width: 2.5), + ], + )), + ), + ), + ), + // Control Bar + _ControlBar(controller: controller, accentColor: color), + ], + ), + ), + ); + } +} + +// ══════════════════════════════════════════════════════════════ +// DYNAMIC MULTI-LINE CHART CARD 🔥 Uses dynamic employee data +// ══════════════════════════════════════════════════════════════ +class _DynamicMultiLineCard extends StatelessWidget { + final String title, subtitle; + final IconData icon; + final StaticController controller; + final List Function(EmployeeChartData) getSpots; + final List Function(EmployeeChartData) getCompareSpots; + final int Function(EmployeeChartData) getTotal; + final VoidCallback? onTap; + + const _DynamicMultiLineCard({ + required this.title, + required this.subtitle, + required this.icon, + required this.controller, + required this.getSpots, + required this.getCompareSpots, + required this.getTotal, + this.onTap, + }); + + @override + Widget build(BuildContext context) { + final employees = controller.employeeData.values.toList(); + // Sort by total descending for legend ordering + employees.sort((a, b) => getTotal(b).compareTo(getTotal(a))); + + final allSpots = employees.expand((e) => getSpots(e)).toList(); + final maxY = _maxY(allSpots); + final interval = _interval(maxY); + final days = _days(controller); + final xInterval = _xInterval(days); + + return Padding( + padding: const EdgeInsets.symmetric(horizontal: 16), + child: Container( + decoration: BoxDecoration( + color: _surface, + borderRadius: BorderRadius.circular(20), + border: Border.all(color: _divider), + boxShadow: [ + BoxShadow( + color: Colors.black.withOpacity(0.15), + blurRadius: 15, + offset: const Offset(0, 6), + ), + ], + ), + child: Column( + children: [ + // ── Header ────────────────────────────────────── + InkWell( + onTap: onTap, + borderRadius: + const BorderRadius.vertical(top: Radius.circular(20)), + child: Padding( + padding: const EdgeInsets.all(18), + child: Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + Row(children: [ + Container( + padding: const EdgeInsets.all(9), + decoration: BoxDecoration( + color: _accent.withOpacity(0.10), + borderRadius: BorderRadius.circular(10), + border: Border.all(color: _accent.withOpacity(0.20)), + ), + child: Icon(icon, color: _accent, size: 18), + ), + const SizedBox(width: 12), + Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Text(title, + style: const TextStyle( + color: _textPrimary, + fontSize: 14, + fontWeight: FontWeight.w700)), + Text(subtitle, + style: const TextStyle( + color: _textSecondary, fontSize: 11)), + if (onTap != null) + const Text( + 'اضغط لعرض التفاصيل اليومية', + style: TextStyle( + color: _accent, + fontSize: 9, + fontWeight: FontWeight.w600), + ), + ]), + ]), + if (onTap != null) + const Icon(Icons.arrow_forward_ios_rounded, + size: 14, color: _textSecondary), + ], + ), + ), + ), + + // ── Dynamic Legend ────────────────────────────── + if (employees.isEmpty) + const Padding( + padding: EdgeInsets.symmetric(vertical: 20), + child: Text('لا توجد بيانات', + style: TextStyle(color: _textSecondary)), + ) + else ...[ + Padding( + padding: + const EdgeInsets.symmetric(horizontal: 18, vertical: 4), + child: Wrap( + spacing: 10, + runSpacing: 8, + children: employees.map((emp) { + return _LegendChip( + name: emp.name.toUpperCase(), + color: emp.color, + total: getTotal(emp), + ); + }).toList(), + ), + ), + + const SizedBox(height: 8), + + // ── Chart ─────────────────────────────────── + SizedBox( + height: 240, + child: Padding( + padding: const EdgeInsets.fromLTRB(4, 0, 12, 10), + child: Directionality( + textDirection: TextDirection.ltr, + child: LineChart(LineChartData( + minX: 1, + maxX: days > 0 ? days : 1, + minY: 0, + maxY: maxY, + lineTouchData: _tooltipData(controller, _accent), + gridData: _gridData(interval), + titlesData: + _titlesData(interval, xInterval, days, controller), + borderData: FlBorderData(show: false), + lineBarsData: [ + // Compare lines (dashed) + if (controller.isComparing) + ...employees.map((emp) => _line( + getCompareSpots(emp), + emp.color.withOpacity(0.25), + isDashed: true, + isStep: false, + width: 1.5, + )), + // Main lines + ...employees.map((emp) => _line( + getSpots(emp), + emp.color, + isStep: false, + width: 2.5, + )), + ], + )), + ), + ), + ), + ], + + _ControlBar(controller: controller, accentColor: _accent), + ], + ), + ), + ); + } +} + +// ══════════════════════════════════════════════════════════════ +// LEGEND CHIP +// ══════════════════════════════════════════════════════════════ +class _LegendChip extends StatelessWidget { + final String name; + final Color color; + final int total; + const _LegendChip( + {required this.name, required this.color, required this.total}); + + @override + Widget build(BuildContext context) { + return Container( + padding: const EdgeInsets.symmetric(horizontal: 10, vertical: 5), + decoration: BoxDecoration( + color: color.withOpacity(0.08), + borderRadius: BorderRadius.circular(20), + border: Border.all(color: color.withOpacity(0.25)), + ), + child: Row( + mainAxisSize: MainAxisSize.min, + children: [ + Container( + width: 7, + height: 7, + decoration: BoxDecoration(color: color, shape: BoxShape.circle), + ), + const SizedBox(width: 6), + Text(name, + style: TextStyle( + color: color, fontSize: 10, fontWeight: FontWeight.w700)), + const SizedBox(width: 5), + Text('$total', + style: const TextStyle( + color: _textSecondary, + fontSize: 10, + fontWeight: FontWeight.w500)), + ], + ), + ); + } +} + +// ══════════════════════════════════════════════════════════════ +// EMPLOYEE LEADERBOARD 🔥 Fully dynamic +// ══════════════════════════════════════════════════════════════ +class _EmployeeLeaderboard extends StatelessWidget { + final List stats; + const _EmployeeLeaderboard({required this.stats}); + + @override + Widget build(BuildContext context) { + final maxCount = stats.isEmpty ? 1 : stats.first.count; + + return Padding( + padding: const EdgeInsets.symmetric(horizontal: 16), + child: Container( + padding: const EdgeInsets.all(20), + decoration: BoxDecoration( + color: _surface, + borderRadius: BorderRadius.circular(20), + border: Border.all(color: _divider), + ), + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + // Header + Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + Row(children: [ + Container( + padding: const EdgeInsets.all(8), + decoration: BoxDecoration( + color: _warning.withOpacity(0.12), + borderRadius: BorderRadius.circular(9), + border: Border.all(color: _warning.withOpacity(0.25)), + ), + child: const Icon(Icons.emoji_events_rounded, + color: _warning, size: 16), + ), + const SizedBox(width: 10), + const Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Text('لوحة الصدارة', + style: TextStyle( + color: _textPrimary, + fontSize: 14, + fontWeight: FontWeight.w700)), + Text('إجمالي الإدخالات حسب الموظف', + style: + TextStyle(color: _textSecondary, fontSize: 10)), + ], + ), + ]), + Text( + '${stats.fold(0, (s, e) => s + e.count)} إجمالي', + style: const TextStyle( + color: _textSecondary, + fontSize: 11, + fontWeight: FontWeight.w600), + ), + ], + ), + + const SizedBox(height: 20), + + // Rank rows + ...List.generate(stats.length, (i) { + final stat = stats[i]; + final pct = maxCount > 0 ? stat.count / maxCount : 0.0; + return Padding( + padding: const EdgeInsets.only(bottom: 14), + child: Column( + children: [ + Row( + children: [ + // Rank Badge + _RankBadge(rank: i + 1, color: stat.color), + const SizedBox(width: 12), + Expanded( + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Row( + mainAxisAlignment: + MainAxisAlignment.spaceBetween, + children: [ + Text( + stat.name.toUpperCase(), + style: TextStyle( + color: stat.color, + fontSize: 12, + fontWeight: FontWeight.w700, + ), + ), + Text( + '${stat.count}', + style: const TextStyle( + color: _textPrimary, + fontSize: 14, + fontWeight: FontWeight.w800, + fontFamily: 'monospace', + ), + ), + ], + ), + const SizedBox(height: 6), + // Progress bar + ClipRRect( + borderRadius: BorderRadius.circular(4), + child: LinearProgressIndicator( + value: pct.toDouble(), + backgroundColor: _divider, + valueColor: + AlwaysStoppedAnimation(stat.color), + minHeight: 5, + ), + ), + ], + ), + ), + ], + ), + ], + ), + ); + }), + ], + ), + ), + ); + } +} + +class _RankBadge extends StatelessWidget { + final int rank; + final Color color; + const _RankBadge({required this.rank, required this.color}); + + @override + Widget build(BuildContext context) { + final isTop3 = rank <= 3; + final medalColors = [_warning, _textSecondary, const Color(0xFFCD7F32)]; + + return Container( + width: 32, + height: 32, + decoration: BoxDecoration( + color: isTop3 ? medalColors[rank - 1].withOpacity(0.12) : _divider, + shape: BoxShape.circle, + border: Border.all( + color: isTop3 + ? medalColors[rank - 1].withOpacity(0.4) + : Colors.transparent), + ), + child: Center( + child: Text( + '$rank', + style: TextStyle( + color: isTop3 ? medalColors[rank - 1] : _textSecondary, + fontSize: 12, + fontWeight: FontWeight.w800, + ), + ), + ), + ); + } +} + +// ══════════════════════════════════════════════════════════════ +// SHARED CONTROL BAR +// ══════════════════════════════════════════════════════════════ +class _ControlBar extends StatelessWidget { + final StaticController controller; + final Color accentColor; + const _ControlBar({required this.controller, required this.accentColor}); + + @override + Widget build(BuildContext context) { + return Container( + padding: const EdgeInsets.symmetric(horizontal: 14, vertical: 10), + decoration: BoxDecoration( + color: _bg, + borderRadius: const BorderRadius.vertical(bottom: Radius.circular(20)), + border: const Border(top: BorderSide(color: _divider)), + ), + child: Row( + children: [ + Expanded( + child: InkWell( + onTap: () async { + final now = DateTime.now(); + final currentEnd = controller.endDate ?? now; + final lastDate = currentEnd.isAfter(now) + ? currentEnd.add(const Duration(days: 1)) + : now.add(const Duration(days: 1)); + final picked = await showDateRangePicker( + context: context, + firstDate: DateTime(2020), + lastDate: lastDate, + initialDateRange: DateTimeRange( + start: controller.startDate ?? + now.subtract(const Duration(days: 30)), + end: currentEnd, + ), + builder: (ctx, child) => Theme( + data: Theme.of(ctx).copyWith( + colorScheme: const ColorScheme.dark( + primary: _accent, + onPrimary: _bg, + surface: _surfaceElevated, + onSurface: _textPrimary, + ), + ), + child: child!, + ), + ); + if (picked != null) { + controller.updateDateRange(picked.start, picked.end); + } + }, + borderRadius: BorderRadius.circular(9), + child: Container( + padding: + const EdgeInsets.symmetric(vertical: 8, horizontal: 12), + decoration: BoxDecoration( + color: _surface, + borderRadius: BorderRadius.circular(9), + border: Border.all(color: _divider), + ), + child: Row( + mainAxisAlignment: MainAxisAlignment.center, + children: [ + Icon(Icons.calendar_today_rounded, + size: 13, color: accentColor), + const SizedBox(width: 7), + Text( + _formatRange(controller), + style: const TextStyle( + color: _textSecondary, + fontSize: 11, + fontWeight: FontWeight.w600, + ), + overflow: TextOverflow.ellipsis, + ), + ], + ), + ), + ), + ), + const SizedBox(width: 10), + InkWell( + onTap: controller.toggleComparison, + borderRadius: BorderRadius.circular(9), + child: Container( + padding: const EdgeInsets.symmetric(vertical: 8, horizontal: 12), + decoration: BoxDecoration( + color: controller.isComparing + ? _danger.withOpacity(0.10) + : _surface, + borderRadius: BorderRadius.circular(9), + border: Border.all( + color: controller.isComparing + ? _danger.withOpacity(0.3) + : _divider), + ), + child: Row( + children: [ + Icon( + controller.isComparing + ? Icons.visibility_off_outlined + : Icons.compare_arrows_rounded, + size: 14, + color: controller.isComparing ? _danger : accentColor, + ), + const SizedBox(width: 5), + Text( + controller.isComparing ? 'إلغاء' : 'مقارنة', + style: TextStyle( + color: controller.isComparing ? _danger : accentColor, + fontSize: 11, + fontWeight: FontWeight.w600, + ), + ), + ], + ), + ), + ), + ], + ), + ); + } + + String _formatRange(StaticController c) { + if (c.startDate == null || c.endDate == null) return c.currentDateString; + return "${c.startDate!.day}/${c.startDate!.month}/${c.startDate!.year}" + " - ${c.endDate!.day}/${c.endDate!.month}/${c.endDate!.year}"; + } +} + +// ══════════════════════════════════════════════════════════════ +// LOADING STATE +// ══════════════════════════════════════════════════════════════ +class _LoadingState extends StatelessWidget { + const _LoadingState(); + + @override + Widget build(BuildContext context) { + return Center( + child: Column( + mainAxisSize: MainAxisSize.min, + children: [ + SizedBox( + width: 40, + height: 40, + child: CircularProgressIndicator( + color: _accent, + strokeWidth: 2, + backgroundColor: _accent.withOpacity(0.1), + ), + ), + const SizedBox(height: 16), + const Text('جاري تحميل الإحصائيات...', + style: TextStyle(color: _textSecondary, fontSize: 13)), + ], + ), + ); + } +} + +// ══════════════════════════════════════════════════════════════ +// CHART HELPERS (pure functions) +// ══════════════════════════════════════════════════════════════ +LineChartBarData _line( + List spots, + Color color, { + bool isDashed = false, + bool isStep = false, + double width = 2.5, +}) { + return LineChartBarData( + spots: spots, + isCurved: !isStep, + curveSmoothness: 0.25, + isStepLineChart: isStep, + color: color, + barWidth: width, + isStrokeCapRound: !isStep, + dotData: const FlDotData(show: false), + dashArray: isDashed ? [5, 5] : null, + lineChartStepData: const LineChartStepData(stepDirection: 0.5), + belowBarData: BarAreaData( + show: !isDashed, + gradient: LinearGradient( + begin: Alignment.topCenter, + end: Alignment.bottomCenter, + colors: [color.withOpacity(0.12), color.withOpacity(0.0)], + ), + ), + ); +} + +LineTouchData _tooltipData(StaticController c, Color accentColor) { + return LineTouchData( + handleBuiltInTouches: true, + touchTooltipData: LineTouchTooltipData( + getTooltipColor: (_) => _surfaceElevated, + tooltipBorder: const BorderSide(color: _divider), + tooltipPadding: const EdgeInsets.symmetric(horizontal: 12, vertical: 8), + tooltipRoundedRadius: 10, + getTooltipItems: (spots) { + return spots.map((barSpot) { + final start = c.startDate; + String dateStr = ''; + if (start != null) { + final date = start.add(Duration(days: barSpot.x.toInt() - 1)); + dateStr = DateFormat('d MMM', 'en').format(date); + } + return LineTooltipItem( + '$dateStr\n', + const TextStyle( + color: _textSecondary, + fontWeight: FontWeight.w600, + fontSize: 11), + children: [ + TextSpan( + text: barSpot.y.toInt().toString(), + style: TextStyle( + color: barSpot.bar.color, + fontWeight: FontWeight.w900, + fontSize: 15), + ), + ], + ); + }).toList(); + }, + ), + ); +} + +FlGridData _gridData(double interval) { + return FlGridData( + show: true, + drawVerticalLine: false, + horizontalInterval: interval, + getDrawingHorizontalLine: (_) => + const FlLine(color: Color(0xFF21262D), strokeWidth: 1), + ); +} + +FlTitlesData _titlesData( + double interval, + double xInterval, + double days, + StaticController c, +) { + return FlTitlesData( + show: true, + rightTitles: const AxisTitles(sideTitles: SideTitles(showTitles: false)), + topTitles: const AxisTitles(sideTitles: SideTitles(showTitles: false)), + bottomTitles: AxisTitles( + sideTitles: SideTitles( + showTitles: true, + reservedSize: 28, + interval: xInterval, + getTitlesWidget: (value, _) { + if (value <= 0 || value > days) return const SizedBox.shrink(); + if (c.startDate == null) return const SizedBox.shrink(); + final date = c.startDate!.add(Duration(days: value.toInt() - 1)); + return Padding( + padding: const EdgeInsets.only(top: 6), + child: Text( + DateFormat('d/M', 'en').format(date), + style: const TextStyle( + color: _textSecondary, + fontSize: 9, + fontWeight: FontWeight.w600), + ), + ); + }, + ), + ), + leftTitles: AxisTitles( + sideTitles: SideTitles( + showTitles: true, + interval: interval, + reservedSize: 36, + getTitlesWidget: (value, _) => Text( + _formatNum(value), + style: const TextStyle(color: _textSecondary, fontSize: 9), + ), + ), + ), + ); +} + +double _maxY(List spots) { + if (spots.isEmpty) return 10; + final max = spots.map((s) => s.y).reduce((a, b) => a > b ? a : b); + return max <= 0 ? 5 : (max * 1.2).ceilToDouble(); +} + +double _interval(double maxY) { + if (maxY <= 10) return 2; + if (maxY <= 50) return 10; + if (maxY <= 100) return 20; + if (maxY <= 500) return 100; + if (maxY <= 1000) return 200; + return maxY / 5; +} + +double _days(StaticController c) { + if (c.startDate == null || c.endDate == null) return 30; + return c.endDate!.difference(c.startDate!).inDays + 1.0; +} + +double _xInterval(double days) { + if (days > 60) return 30; + if (days > 30) return 10; + if (days > 10) return 5; + return 1; +} + +String _formatNum(double v) { + if (v >= 1000) return '${(v / 1000).toStringAsFixed(1)}k'; + return v.toInt().toString(); +} diff --git a/siro_admin/lib/views/admin/wallet/wallet.dart b/siro_admin/lib/views/admin/wallet/wallet.dart new file mode 100644 index 0000000..5e764fd --- /dev/null +++ b/siro_admin/lib/views/admin/wallet/wallet.dart @@ -0,0 +1,83 @@ +import 'package:flutter/material.dart'; +import 'package:get/get.dart'; +import 'package:siro_admin/constant/style.dart'; +import 'package:siro_admin/views/widgets/elevated_btn.dart'; +import 'package:siro_admin/views/widgets/mycircular.dart'; + +import '../../../controller/admin/wallet_admin_controller.dart'; +import '../../widgets/my_scafold.dart'; + +class Wallet extends StatelessWidget { + Wallet({super.key}); + WalletAdminController walletAdminController = + Get.put(WalletAdminController()); + @override + Widget build(BuildContext context) { + return MyScafolld( + title: 'Wallet'.tr, + body: [ + GetBuilder(builder: (walletAdminController) { + return Center( + child: walletAdminController.isLoading + ? const MyCircularProgressIndicator() + : Column( + children: [ + MyElevatedButton( + title: 'Pay to them to banks'.tr, + onPressed: () async { + await walletAdminController.payToBankDriverAll(); + }), + SizedBox( + height: Get.height * .8, + child: ListView.builder( + itemCount: + walletAdminController.driversWalletPoints.length, + itemBuilder: (BuildContext context, int index) { + var res = walletAdminController + .driversWalletPoints[index]; + + if (res != null && res['name_arabic'] != null) { + return Padding( + padding: const EdgeInsets.all(4.0), + child: Container( + decoration: AppStyle.boxDecoration1, + child: Padding( + padding: const EdgeInsets.symmetric( + horizontal: 10), + child: Row( + mainAxisAlignment: + MainAxisAlignment.spaceBetween, + children: [ + Text( + 'driver name: ${res['name_arabic'].toString()}'), + Text( + 'Amount: ${res['total_amount'].toString()}'), + ], + ), + ), + ), + ); + } else { + return Container(); // Return an empty container if the data is null + } + }, + ), + ) + ], + ), + ); + }) + ], + isleading: true, + action: IconButton( + onPressed: () async { + walletAdminController.getWalletForEachDriverToPay(); + }, + icon: const Icon( + Icons.refresh, + color: Colors.black, + ), + ), + ); + } +} diff --git a/siro_admin/lib/views/auth/login_page.dart b/siro_admin/lib/views/auth/login_page.dart new file mode 100644 index 0000000..61e839a --- /dev/null +++ b/siro_admin/lib/views/auth/login_page.dart @@ -0,0 +1,447 @@ +import 'package:flutter/material.dart'; +import 'package:get/get.dart'; +import 'package:siro_admin/env/env.dart'; + +import '../../controller/auth/login_controller.dart'; +import '../../controller/auth/otp_helper.dart'; +import '../../controller/functions/crud.dart'; +import '../../print.dart'; +import '../admin/admin_home_page.dart'; + +// ─── Colors (نفس نظام الألوان المستخدم في التطبيق) ────────────────────────── +class _C { + static const bg = Color(0xFF0A0D14); + static const card = Color(0xFF161D2E); + static const border = Color(0xFF1F2D4A); + static const accent = Color(0xFF00E5FF); + static const accentGlow = Color(0x2200E5FF); + static const accentDim = Color(0xFF0097A7); + static const textPrimary = Color(0xFFE8F0FE); + static const textSec = Color(0xFF7A8BAA); + static const error = Color(0xFFFF5252); + static const inputBg = Color(0xFF0C1120); +} + +class AdminLoginPage extends StatefulWidget { + const AdminLoginPage({super.key}); + + @override + State createState() => _AdminLoginPageState(); +} + +class _AdminLoginPageState extends State + with SingleTickerProviderStateMixin { + final _phoneController = TextEditingController(); + final _passwordController = TextEditingController(); + final _formKey = GlobalKey(); + bool _isLoading = false; + + late final AnimationController _glowCtrl; + late final Animation _glowAnim; + + Future _submit() async { + final password = _passwordController.text.trim(); + + if (password.isEmpty) { + Get.snackbar('خطأ', 'يرجى إدخال كلمة المرور'); + return; + } + + setState(() => _isLoading = true); + + final otpHelper = Get.find(); + bool success = await otpHelper.loginWithPassword(password); + + if (success) { + Get.offAll(() => const AdminHomePage()); + } + + setState(() => _isLoading = false); + } + + @override + void initState() { + super.initState(); + _initializeToken(); + + _glowCtrl = AnimationController( + vsync: this, + duration: const Duration(seconds: 4), + )..repeat(reverse: true); + _glowAnim = Tween(begin: 0.3, end: 1.0).animate( + CurvedAnimation(parent: _glowCtrl, curve: Curves.easeInOut), + ); + } + + void _initializeToken() async { + // await CRUD().getJWT(); + } + + @override + void dispose() { + _phoneController.dispose(); + _glowCtrl.dispose(); + super.dispose(); + } + + // ─── Build ───────────────────────────────────────────────────────────────── + @override + Widget build(BuildContext context) { + Get.put(OtpHelper()); + + return Scaffold( + backgroundColor: _C.bg, + body: Stack( + children: [ + // ── Ambient glow top-right ────────────────────────────────────────── + Positioned( + top: -150, + right: -100, + child: AnimatedBuilder( + animation: _glowAnim, + builder: (_, __) => Opacity( + opacity: _glowAnim.value * 0.18, + child: Container( + width: 400, + height: 400, + decoration: const BoxDecoration( + shape: BoxShape.circle, + gradient: RadialGradient( + colors: [Color(0xFF00E5FF), Colors.transparent], + ), + ), + ), + ), + ), + ), + // ── Ambient glow bottom-left ──────────────────────────────────────── + Positioned( + bottom: -120, + left: -80, + child: AnimatedBuilder( + animation: _glowAnim, + builder: (_, __) => Opacity( + opacity: (1 - _glowAnim.value) * 0.15, + child: Container( + width: 340, + height: 340, + decoration: const BoxDecoration( + shape: BoxShape.circle, + gradient: RadialGradient( + colors: [Color(0xFF7C4DFF), Colors.transparent], + ), + ), + ), + ), + ), + ), + + // ── Main content ─────────────────────────────────────────────────── + SafeArea( + child: Center( + child: SingleChildScrollView( + padding: const EdgeInsets.symmetric(horizontal: 28), + physics: const BouncingScrollPhysics(), + child: ConstrainedBox( + constraints: const BoxConstraints(maxWidth: 440), + child: Form( + key: _formKey, + child: Column( + mainAxisAlignment: MainAxisAlignment.center, + children: [ + const SizedBox(height: 24), + + // ── Logo / Icon ───────────────────────────────────── + _buildLogo(), + const SizedBox(height: 32), + + // ── Title ─────────────────────────────────────────── + const Text( + 'لوحة الإدارة', + style: TextStyle( + color: _C.textPrimary, + fontSize: 26, + fontWeight: FontWeight.w800, + letterSpacing: 0.5, + ), + ), + const SizedBox(height: 8), + const Text( + 'أدخل كلمة المرور للمتابعة', + style: TextStyle( + color: _C.textSec, + fontSize: 14, + ), + ), + const SizedBox(height: 40), + + // ── Card ──────────────────────────────────────────── + Container( + padding: const EdgeInsets.all(28), + decoration: BoxDecoration( + color: _C.card, + borderRadius: BorderRadius.circular(24), + border: Border.all( + color: _C.accent.withOpacity(0.18), width: 1.2), + boxShadow: [ + BoxShadow( + color: Colors.black.withOpacity(0.4), + blurRadius: 32, + offset: const Offset(0, 12), + ), + ], + ), + child: Column( + crossAxisAlignment: CrossAxisAlignment.stretch, + children: [ + const SizedBox(height: 20), + // ── Field label (Password) ───────────────────────────── + const Row( + children: [ + Icon(Icons.lock_outline_rounded, + color: _C.accent, size: 16), + SizedBox(width: 8), + Text( + 'كلمة المرور', + style: TextStyle( + color: _C.textSec, + fontSize: 13, + fontWeight: FontWeight.w600, + letterSpacing: 0.3, + ), + ), + ], + ), + const SizedBox(height: 10), + // ── Password field ───────────────────────────── + TextFormField( + controller: _passwordController, + obscureText: true, + style: const TextStyle( + color: _C.textPrimary, + fontSize: 16, + ), + decoration: InputDecoration( + hintText: '••••••••', + hintStyle: const TextStyle(color: _C.textSec), + filled: true, + fillColor: _C.inputBg, + border: OutlineInputBorder( + borderRadius: BorderRadius.circular(14), + borderSide: BorderSide.none, + ), + enabledBorder: OutlineInputBorder( + borderRadius: BorderRadius.circular(14), + borderSide: const BorderSide( + color: _C.border, width: 1), + ), + focusedBorder: OutlineInputBorder( + borderRadius: BorderRadius.circular(14), + borderSide: const BorderSide( + color: _C.accent, width: 1.5), + ), + contentPadding: const EdgeInsets.symmetric( + horizontal: 16, vertical: 16), + ), + validator: (value) { + if (value == null || value.isEmpty) { + return 'الرجاء إدخال كلمة المرور'; + } + return null; + }, + ), + const SizedBox(height: 28), + + // ── Submit button ──────────────────────────── + _isLoading + ? const Center( + child: SizedBox( + width: 32, + height: 32, + child: CircularProgressIndicator( + color: _C.accent, + strokeWidth: 2.5, + ), + ), + ) + : _SubmitButton(onPressed: () { + if (_formKey.currentState!.validate()) { + _submit(); + } + }), + ], + ), + ), + + const SizedBox(height: 32), + + // ── Register Button ───────────────────────────────── + TextButton( + onPressed: () => Get.toNamed('/register'), + child: const Text( + 'ليس لديك حساب؟ طلب انضمام', + style: TextStyle( + color: _C.accent, + fontSize: 14, + fontWeight: FontWeight.w600, + ), + ), + ), + + const SizedBox(height: 16), + + // ── Footer ────────────────────────────────────────── + Row( + mainAxisAlignment: MainAxisAlignment.center, + children: [ + Container( + width: 6, + height: 6, + decoration: BoxDecoration( + shape: BoxShape.circle, + color: _C.accent, + boxShadow: [ + BoxShadow( + color: _C.accentGlow, + blurRadius: 6, + spreadRadius: 1, + ), + ], + ), + ), + const SizedBox(width: 8), + const Text( + 'وصول مقيّد للمشرفين فقط', + style: TextStyle( + color: _C.textSec, + fontSize: 12, + ), + ), + ], + ), + const SizedBox(height: 24), + ], + ), + ), + ), + ), + ), + ), + ], + ), + ); + } + + // ─── Logo Widget ───────────────────────────────────────────────────────── + Widget _buildLogo() { + return AnimatedBuilder( + animation: _glowAnim, + builder: (_, child) => Container( + width: 90, + height: 90, + decoration: BoxDecoration( + shape: BoxShape.circle, + color: _C.card, + border: Border.all( + color: _C.accent.withOpacity(0.3 + _glowAnim.value * 0.3), + width: 1.5, + ), + boxShadow: [ + BoxShadow( + color: _C.accentGlow.withOpacity(_glowAnim.value * 0.6), + blurRadius: 30, + spreadRadius: 4, + ), + ], + ), + child: child, + ), + child: const Icon( + Icons.admin_panel_settings_rounded, + color: _C.accent, + size: 42, + ), + ); + } +} + +// ─── Submit Button ───────────────────────────────────────────────────────────── +class _SubmitButton extends StatefulWidget { + final VoidCallback onPressed; + + const _SubmitButton({required this.onPressed}); + + @override + State<_SubmitButton> createState() => _SubmitButtonState(); +} + +class _SubmitButtonState extends State<_SubmitButton> + with SingleTickerProviderStateMixin { + late final AnimationController _ctrl; + late final Animation _scale; + + @override + void initState() { + super.initState(); + _ctrl = AnimationController( + vsync: this, duration: const Duration(milliseconds: 100)); + _scale = Tween(begin: 1.0, end: 0.96) + .animate(CurvedAnimation(parent: _ctrl, curve: Curves.easeOut)); + } + + @override + void dispose() { + _ctrl.dispose(); + super.dispose(); + } + + @override + Widget build(BuildContext context) { + return GestureDetector( + onTapDown: (_) => _ctrl.forward(), + onTapUp: (_) => _ctrl.reverse(), + onTapCancel: () => _ctrl.reverse(), + onTap: widget.onPressed, + child: AnimatedBuilder( + animation: _scale, + builder: (_, child) => + Transform.scale(scale: _scale.value, child: child), + child: Container( + padding: const EdgeInsets.symmetric(vertical: 17), + decoration: BoxDecoration( + gradient: const LinearGradient( + colors: [Color(0xFF00B4D8), Color(0xFF00E5FF)], + begin: Alignment.topLeft, + end: Alignment.bottomRight, + ), + borderRadius: BorderRadius.circular(14), + boxShadow: [ + BoxShadow( + color: const Color(0x3300E5FF), + blurRadius: 20, + spreadRadius: 1, + offset: const Offset(0, 6), + ), + ], + ), + child: const Row( + mainAxisAlignment: MainAxisAlignment.center, + children: [ + Icon(Icons.send_rounded, color: Colors.white, size: 18), + SizedBox(width: 10), + const Text( + 'تسجيل الدخول', + style: TextStyle( + color: Colors.white, + fontSize: 16, + fontWeight: FontWeight.w700, + letterSpacing: 0.3, + ), + ), + ], + ), + ), + ), + ); + } +} diff --git a/siro_admin/lib/views/auth/register_page.dart b/siro_admin/lib/views/auth/register_page.dart new file mode 100644 index 0000000..3a5ded4 --- /dev/null +++ b/siro_admin/lib/views/auth/register_page.dart @@ -0,0 +1,181 @@ +import 'package:flutter/material.dart'; +import 'package:get/get.dart'; +import '../../constant/box_name.dart'; +import '../../constant/links.dart'; +import '../../main.dart'; +import '../../views/widgets/snackbar.dart'; +import '../../controller/functions/crud.dart'; + +class _C { + static const bg = Color(0xFF0A0D14); + static const card = Color(0xFF161D2E); + static const accent = Color(0xFF00E5FF); + static const textPrimary = Color(0xFFE8F0FE); + static const textSec = Color(0xFF7A8BAA); + static const inputBg = Color(0xFF0C1120); +} + +class RegisterPage extends StatefulWidget { + const RegisterPage({super.key}); + + @override + State createState() => _RegisterPageState(); +} + +class _RegisterPageState extends State { + final _nameController = TextEditingController(); + final _phoneController = TextEditingController(); + final _passwordController = TextEditingController(); + final _formKey = GlobalKey(); + bool _isLoading = false; + + Future _register() async { + if (!_formKey.currentState!.validate()) return; + + setState(() => _isLoading = true); + + try { + final fingerprint = box.read(BoxName.fingerPrint); + final response = await CRUD().post( + link: '${AppLink.server}/Admin/auth/register.php', + payload: { + 'name': _nameController.text.trim(), + 'phone': _phoneController.text.trim(), + 'password': _passwordController.text.trim(), + 'fingerprint': fingerprint, + }, + ); + + if (response != 'failure') { + mySnackbarSuccess(response['message'] ?? 'تم تقديم طلبك بنجاح'); + Get.back(); // العودة لصفحة الدخول + } + } catch (e) { + mySnackeBarError('حدث خطأ أثناء التسجيل: $e'); + } finally { + setState(() => _isLoading = false); + } + } + + @override + void dispose() { + _nameController.dispose(); + _phoneController.dispose(); + _passwordController.dispose(); + super.dispose(); + } + + @override + Widget build(BuildContext context) { + return Scaffold( + backgroundColor: _C.bg, + appBar: AppBar( + backgroundColor: Colors.transparent, + elevation: 0, + leading: IconButton( + icon: const Icon(Icons.arrow_back_ios_new_rounded, color: _C.accent), + onPressed: () => Get.back(), + ), + ), + body: Center( + child: SingleChildScrollView( + padding: const EdgeInsets.symmetric(horizontal: 28), + child: Form( + key: _formKey, + child: Column( + children: [ + const Icon(Icons.person_add_rounded, color: _C.accent, size: 64), + const SizedBox(height: 24), + const Text( + 'طلب انضمام جديد', + style: TextStyle( + color: _C.textPrimary, + fontSize: 24, + fontWeight: FontWeight.bold, + ), + ), + const SizedBox(height: 8), + const Text( + 'سيتم مراجعة طلبك من قبل الإدارة', + style: TextStyle(color: _C.textSec, fontSize: 14), + ), + const SizedBox(height: 40), + _buildCard(), + const SizedBox(height: 32), + ], + ), + ), + ), + ), + ); + } + + Widget _buildCard() { + return Container( + padding: const EdgeInsets.all(24), + decoration: BoxDecoration( + color: _C.card, + borderRadius: BorderRadius.circular(24), + border: Border.all(color: _C.accent.withAlpha(25)), // 0.1 * 255 ≈ 25 + ), + child: Column( + crossAxisAlignment: CrossAxisAlignment.stretch, + children: [ + _buildField('الاسم الكامل', _nameController, Icons.person_outline), + const SizedBox(height: 20), + _buildField('رقم الهاتف', _phoneController, Icons.phone_android, isPhone: true), + const SizedBox(height: 20), + _buildField('كلمة المرور', _passwordController, Icons.lock_outline, isPass: true), + const SizedBox(height: 32), + _isLoading + ? const Center(child: CircularProgressIndicator(color: _C.accent)) + : ElevatedButton( + onPressed: _register, + style: ElevatedButton.styleFrom( + backgroundColor: _C.accent, + foregroundColor: Colors.black, + padding: const EdgeInsets.symmetric(vertical: 16), + shape: RoundedRectangleBorder( + borderRadius: BorderRadius.circular(14), + ), + ), + child: const Text('إرسال الطلب', style: TextStyle(fontWeight: FontWeight.bold)), + ), + ], + ), + ); + } + + Widget _buildField(String label, TextEditingController ctrl, IconData icon, + {bool isPhone = false, bool isPass = false}) { + return Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Row( + children: [ + Icon(icon, color: _C.accent, size: 16), + const SizedBox(width: 8), + Text(label, style: const TextStyle(color: _C.textSec, fontSize: 13)), + ], + ), + const SizedBox(height: 8), + TextFormField( + controller: ctrl, + obscureText: isPass, + keyboardType: isPhone ? TextInputType.phone : TextInputType.text, + style: const TextStyle(color: _C.textPrimary), + decoration: InputDecoration( + filled: true, + fillColor: _C.inputBg, + border: OutlineInputBorder( + borderRadius: BorderRadius.circular(12), + borderSide: BorderSide.none, + ), + contentPadding: const EdgeInsets.symmetric(horizontal: 16, vertical: 14), + ), + validator: (val) => val == null || val.isEmpty ? 'هذا الحقل مطلوب' : null, + ), + ], + ); + } +} diff --git a/siro_admin/lib/views/invoice/add_invoice_page.dart b/siro_admin/lib/views/invoice/add_invoice_page.dart new file mode 100644 index 0000000..f83456f --- /dev/null +++ b/siro_admin/lib/views/invoice/add_invoice_page.dart @@ -0,0 +1,401 @@ +import 'dart:convert'; +import 'dart:io'; +import 'package:flutter/material.dart'; +import 'package:get/get.dart'; +import 'package:http/http.dart' as http; +import 'package:image_picker/image_picker.dart'; +import 'package:siro_admin/constant/links.dart'; + +import '../../constant/box_name.dart'; +import '../../constant/info.dart'; +import '../../controller/functions/encrypt_decrypt.dart'; +import '../../main.dart'; + +class AddInvoicePage extends StatefulWidget { + const AddInvoicePage({super.key}); + + @override + State createState() => _AddInvoicePageState(); +} + +class _AddInvoicePageState extends State { + final GlobalKey _formKey = GlobalKey(); + final TextEditingController _itemNameController = TextEditingController(); + final TextEditingController _amountController = TextEditingController(); + File? _imageFile; + bool _isLoading = false; + + // الألوان المستخدمة في الثيم + final Color primaryColor = const Color(0xFF4F46E5); // Indigo + final Color secondaryColor = const Color(0xFF818CF8); // Lighter Indigo + final Color bgColor = const Color(0xFFF3F4F6); // Light Gray Background + + String generateInvoiceNumber() { + final now = DateTime.now(); + return "INV-${now.year}${now.month.toString().padLeft(2, '0')}${now.day.toString().padLeft(2, '0')}-${now.microsecond}"; + } + + Future uploadInvoice() async { + if (!_formKey.currentState!.validate()) return; + + final driverID = '123'; // قيمة افتراضية أو يمكن جلبها من الكونترولر + final invoiceNumber = generateInvoiceNumber(); + final amount = _amountController.text.trim(); + final itemName = _itemNameController.text.trim(); + final date = DateTime.now().toIso8601String().split('T').first; + + setState(() => _isLoading = true); + + try { + // إعداد الترويسة (Headers) + final headers = { + 'Authorization': + 'Bearer ${r(box.read(BoxName.jwt)).split(AppInformation.addd)[0]}', + 'X-HMAC-Auth': '${box.read(BoxName.hmac)}', + }; + + final uri = Uri.parse(AppLink.addInvoice); + final request = http.MultipartRequest('POST', uri) + ..fields['driverID'] = driverID + ..fields['invoiceNumber'] = invoiceNumber + ..fields['amount'] = amount + ..fields['name'] = itemName + ..fields['date'] = date + ..headers.addAll(headers); + + // إضافة الصورة إذا وجدت + if (_imageFile != null) { + final multipartFile = await http.MultipartFile.fromPath( + 'image', + _imageFile!.path, + ); + request.files.add(multipartFile); + } + + final response = await request.send(); + final respStr = await response.stream.bytesToString(); + + // محاولة تحليل الاستجابة + Map data; + try { + data = jsonDecode(respStr); + } catch (e) { + data = {'status': 'error', 'message': 'Invalid server response'}; + } + + if (data['status'] == 'success') { + Get.snackbar( + 'نجاح', + 'تم حفظ الفاتورة بنجاح', + backgroundColor: Colors.green.withOpacity(0.1), + colorText: Colors.green[800], + snackPosition: SnackPosition.TOP, + margin: const EdgeInsets.all(10), + borderRadius: 20, + ); + + _itemNameController.clear(); + _amountController.clear(); + setState(() => _imageFile = null); + + // تأخير بسيط قبل العودة لتحديث الصفحة السابقة + Future.delayed(const Duration(seconds: 1), () { + Get.back(result: true); + }); + } else { + Get.snackbar( + 'تنبيه', + data['message'] ?? 'حدث خطأ غير معروف', + backgroundColor: Colors.red.withOpacity(0.1), + colorText: Colors.red[800], + ); + } + } catch (e) { + Get.snackbar( + 'خطأ في الاتصال', + e.toString(), + backgroundColor: Colors.red.withOpacity(0.1), + colorText: Colors.red[800], + ); + } finally { + if (mounted) setState(() => _isLoading = false); + } + } + + Future pickInvoiceImage() async { + final picker = ImagePicker(); + final picked = await picker.pickImage(source: ImageSource.gallery); + if (picked != null) { + setState(() => _imageFile = File(picked.path)); + } + } + + @override + void dispose() { + _itemNameController.dispose(); + _amountController.dispose(); + super.dispose(); + } + + @override + Widget build(BuildContext context) { + return Scaffold( + backgroundColor: bgColor, + appBar: AppBar( + backgroundColor: Colors.transparent, + elevation: 0, + centerTitle: true, + title: const Text( + 'إضافة فاتورة جديدة', + style: + TextStyle(color: Color(0xFF1F2937), fontWeight: FontWeight.bold), + ), + leading: IconButton( + icon: const Icon(Icons.arrow_back_ios_new, color: Color(0xFF1F2937)), + onPressed: () => Get.back(), + ), + flexibleSpace: Container( + decoration: BoxDecoration( + gradient: LinearGradient( + begin: Alignment.topCenter, + end: Alignment.bottomCenter, + colors: [Colors.white, bgColor], + ), + ), + ), + ), + body: SingleChildScrollView( + padding: const EdgeInsets.all(20.0), + child: Form( + key: _formKey, + child: Column( + crossAxisAlignment: CrossAxisAlignment.stretch, + children: [ + // قسم البيانات الأساسية + Container( + padding: const EdgeInsets.all(20), + decoration: BoxDecoration( + color: Colors.white, + borderRadius: BorderRadius.circular(20), + boxShadow: [ + BoxShadow( + color: Colors.black.withOpacity(0.05), + blurRadius: 15, + offset: const Offset(0, 5), + ), + ], + ), + child: Column( + children: [ + _buildModernTextField( + controller: _itemNameController, + label: 'اسم البضاعة / الخدمة', + icon: Icons.inventory_2_outlined, + hint: 'مثال: صيانة سيارة', + ), + const SizedBox(height: 20), + _buildModernTextField( + controller: _amountController, + label: 'قيمة الفاتورة (د.أ)', + icon: Icons.attach_money, + hint: '0.00', + isNumber: true, + ), + ], + ), + ), + + const SizedBox(height: 25), + + // قسم الصورة + Text( + 'صورة الفاتورة', + style: TextStyle( + color: Colors.grey[700], + fontWeight: FontWeight.bold, + fontSize: 16, + ), + ), + const SizedBox(height: 10), + + InkWell( + onTap: pickInvoiceImage, + borderRadius: BorderRadius.circular(20), + child: Container( + height: 200, + width: double.infinity, + decoration: BoxDecoration( + color: Colors.white, + borderRadius: BorderRadius.circular(20), + border: Border.all( + color: _imageFile != null + ? primaryColor + : Colors.grey.shade300, + width: 2, + style: _imageFile != null + ? BorderStyle.solid + : BorderStyle.solid, + ), + image: _imageFile != null + ? DecorationImage( + image: FileImage(_imageFile!), + fit: BoxFit.cover, + ) + : null, + ), + child: _imageFile == null + ? Column( + mainAxisAlignment: MainAxisAlignment.center, + children: [ + Container( + padding: const EdgeInsets.all(15), + decoration: BoxDecoration( + color: primaryColor.withOpacity(0.05), + shape: BoxShape.circle, + ), + child: Icon(Icons.add_a_photo_rounded, + size: 40, color: primaryColor), + ), + const SizedBox(height: 10), + Text( + 'اضغط لرفع صورة الفاتورة', + style: TextStyle( + color: Colors.grey[500], + fontWeight: FontWeight.w500, + ), + ), + ], + ) + : Stack( + children: [ + Positioned( + top: 10, + right: 10, + child: Container( + padding: const EdgeInsets.all(8), + decoration: BoxDecoration( + color: Colors.white.withOpacity(0.9), + shape: BoxShape.circle, + ), + child: Icon(Icons.edit, + color: primaryColor, size: 20), + ), + ), + ], + ), + ), + ), + + const SizedBox(height: 40), + + // زر الحفظ + SizedBox( + height: 55, + child: ElevatedButton( + onPressed: _isLoading ? null : uploadInvoice, + style: ElevatedButton.styleFrom( + backgroundColor: Colors.transparent, + shadowColor: Colors.transparent, + padding: EdgeInsets.zero, + shape: RoundedRectangleBorder( + borderRadius: BorderRadius.circular(15), + ), + ), + child: Ink( + decoration: BoxDecoration( + gradient: LinearGradient( + colors: _isLoading + ? [Colors.grey, Colors.grey] + : [primaryColor, secondaryColor], + begin: Alignment.centerLeft, + end: Alignment.centerRight, + ), + borderRadius: BorderRadius.circular(15), + boxShadow: [ + if (!_isLoading) + BoxShadow( + color: primaryColor.withOpacity(0.4), + blurRadius: 10, + offset: const Offset(0, 4), + ), + ], + ), + child: Container( + alignment: Alignment.center, + child: _isLoading + ? const SizedBox( + width: 24, + height: 24, + child: CircularProgressIndicator( + color: Colors.white, + strokeWidth: 2, + ), + ) + : const Row( + mainAxisAlignment: MainAxisAlignment.center, + children: [ + Icon(Icons.save_rounded, color: Colors.white), + SizedBox(width: 10), + Text( + 'حفظ الفاتورة', + style: TextStyle( + color: Colors.white, + fontSize: 18, + fontWeight: FontWeight.bold, + ), + ), + ], + ), + ), + ), + ), + ), + ], + ), + ), + ), + ); + } + + Widget _buildModernTextField({ + required TextEditingController controller, + required String label, + required IconData icon, + required String hint, + bool isNumber = false, + }) { + return TextFormField( + controller: controller, + keyboardType: isNumber + ? const TextInputType.numberWithOptions(decimal: true) + : TextInputType.text, + validator: (val) { + if (val == null || val.isEmpty) { + return 'هذا الحقل مطلوب'; + } + return null; + }, + decoration: InputDecoration( + labelText: label, + hintText: hint, + prefixIcon: Icon(icon, color: primaryColor.withOpacity(0.7)), + filled: true, + fillColor: Colors.grey[50], + border: OutlineInputBorder( + borderRadius: BorderRadius.circular(12), + borderSide: BorderSide.none, + ), + enabledBorder: OutlineInputBorder( + borderRadius: BorderRadius.circular(12), + borderSide: BorderSide(color: Colors.grey.shade200), + ), + focusedBorder: OutlineInputBorder( + borderRadius: BorderRadius.circular(12), + borderSide: BorderSide(color: primaryColor, width: 1.5), + ), + contentPadding: + const EdgeInsets.symmetric(horizontal: 16, vertical: 16), + ), + ); + } +} diff --git a/siro_admin/lib/views/invoice/invoice_list_page.dart b/siro_admin/lib/views/invoice/invoice_list_page.dart new file mode 100644 index 0000000..8ad5a4d --- /dev/null +++ b/siro_admin/lib/views/invoice/invoice_list_page.dart @@ -0,0 +1,456 @@ +import 'package:flutter/material.dart'; +import 'package:get/get.dart'; +import '../../constant/links.dart'; +import '../../controller/functions/crud.dart'; +import '../../print.dart'; +import 'add_invoice_page.dart'; + +// نفترض أن هذا الموديل موجود في مشروعك، إذا لم يكن موجوداً يرجى إضافته أو تعديل الاستيراد +// import '../../model/invoice_model.dart'; + +class InvoiceListPage extends StatefulWidget { + const InvoiceListPage({super.key}); + + @override + _InvoiceListPageState createState() => _InvoiceListPageState(); +} + +class _InvoiceListPageState extends State { + List invoices = []; // استخدام dynamic لتجنب مشاكل الموديل إذا اختلف + int totalCount = 0; + double totalAmount = 0.0; + bool isLoading = true; + + // الألوان "الإيجابية" للتصميم الجديد + final Color primaryColor = const Color(0xFF4F46E5); // Indigo + final Color secondaryColor = const Color(0xFF818CF8); // Lighter Indigo + final Color moneyColor = const Color(0xFF059669); // Emerald Green + final Color bgColor = const Color(0xFFF3F4F6); // Light Gray Background + + @override + void initState() { + super.initState(); + fetchInvoices(); + } + + Future fetchInvoices() async { + if (!mounted) return; + setState(() => isLoading = true); + + try { + final response = + await CRUD().post(link: AppLink.getInvoices, payload: {}); + + if (response != 'failure' && response['status'] == 'success') { + final data = response; + if (mounted) { + setState(() { + invoices = data['data']; // استخدام البيانات مباشرة + totalCount = int.tryParse(data['summary']['count'].toString()) ?? 0; + totalAmount = + double.tryParse(data['summary']['total'].toString()) ?? 0.0; + isLoading = false; + }); + } + } else { + if (mounted) { + setState(() => isLoading = false); + Get.snackbar("تنبيه", "لا توجد فواتير لعرضها أو حدث خطأ", + backgroundColor: Colors.orange.withOpacity(0.2), + colorText: Colors.orange[900]); + } + } + } catch (e) { + Log.print('Error fetching invoices: $e'); + if (mounted) setState(() => isLoading = false); + } + } + + void _showImageDialog(BuildContext context, String imageUrl) { + showDialog( + context: context, + builder: (_) => Dialog( + backgroundColor: Colors.transparent, + child: Stack( + alignment: Alignment.center, + children: [ + Container( + decoration: BoxDecoration( + color: Colors.white, + borderRadius: BorderRadius.circular(20), + ), + padding: const EdgeInsets.all(5), + child: ClipRRect( + borderRadius: BorderRadius.circular(15), + child: InteractiveViewer( + panEnabled: true, + minScale: 0.5, + maxScale: 4, + child: Image.network( + imageUrl, + loadingBuilder: (context, child, loadingProgress) { + if (loadingProgress == null) return child; + return SizedBox( + height: 200, + width: 200, + child: Center( + child: CircularProgressIndicator(color: primaryColor), + ), + ); + }, + errorBuilder: (context, error, stackTrace) { + return const SizedBox( + height: 150, + width: 150, + child: Icon(Icons.broken_image, + size: 60, color: Colors.grey), + ); + }, + ), + ), + ), + ), + Positioned( + top: 0, + right: 0, + child: CircleAvatar( + backgroundColor: Colors.white, + child: IconButton( + icon: const Icon(Icons.close, color: Colors.black), + onPressed: () => Navigator.pop(context), + ), + ), + ), + ], + ), + ), + ); + } + + @override + Widget build(BuildContext context) { + return Scaffold( + backgroundColor: bgColor, + // زر عائم بتصميم متدرج + floatingActionButton: Container( + decoration: BoxDecoration( + gradient: LinearGradient(colors: [primaryColor, secondaryColor]), + borderRadius: BorderRadius.circular(30), + boxShadow: [ + BoxShadow( + color: primaryColor.withOpacity(0.4), + blurRadius: 10, + offset: const Offset(0, 4)) + ], + ), + child: FloatingActionButton.extended( + onPressed: () => Get.to(() => AddInvoicePage()), + label: const Text('إضافة فاتورة', + style: TextStyle(fontWeight: FontWeight.bold)), + icon: const Icon(Icons.add), + backgroundColor: Colors.transparent, + elevation: 0, + ), + ), + body: Column( + children: [ + // 1. رأس الصفحة (Header & Summary) + _buildHeader(), + + // 2. قائمة الفواتير + Expanded( + child: isLoading + ? Center(child: CircularProgressIndicator(color: primaryColor)) + : invoices.isEmpty + ? _buildEmptyState() + : RefreshIndicator( + onRefresh: fetchInvoices, + color: primaryColor, + child: ListView.builder( + padding: const EdgeInsets.fromLTRB(16, 0, 16, 80), + itemCount: invoices.length, + physics: const BouncingScrollPhysics(), + itemBuilder: (context, index) { + final invoice = invoices[index]; + return _buildInvoiceCard(invoice); + }, + ), + ), + ), + ], + ), + ); + } + + // === تصميم الهيدر (رأس الصفحة) === + Widget _buildHeader() { + return Container( + width: double.infinity, + padding: EdgeInsets.only( + top: MediaQuery.of(context).padding.top + 20, + bottom: 30, + left: 20, + right: 20, + ), + decoration: BoxDecoration( + gradient: LinearGradient( + begin: Alignment.topLeft, + end: Alignment.bottomRight, + colors: [primaryColor, const Color(0xFF6366F1)], + ), + borderRadius: const BorderRadius.only( + bottomLeft: Radius.circular(30), + bottomRight: Radius.circular(30), + ), + boxShadow: [ + BoxShadow( + color: primaryColor.withOpacity(0.3), + blurRadius: 20, + offset: const Offset(0, 10), + ), + ], + ), + child: Column( + children: [ + // العنوان وزر الرجوع + Row( + children: [ + IconButton( + icon: const Icon(Icons.arrow_back_ios, + color: Colors.white, size: 20), + onPressed: () => Get.back(), + ), + const Expanded( + child: Text( + "سجل الفواتير", + textAlign: TextAlign.center, + style: TextStyle( + color: Colors.white, + fontSize: 20, + fontWeight: FontWeight.bold, + ), + ), + ), + const SizedBox(width: 40), // للمحاذاة + ], + ), + const SizedBox(height: 25), + + // بطاقات الملخص + Row( + children: [ + Expanded( + child: _buildSummaryItem( + title: "الإجمالي", + value: "${totalAmount.toStringAsFixed(1)} د.أ", + icon: Icons.attach_money, + isMoney: true, + ), + ), + Container(width: 1, height: 40, color: Colors.white24), + Expanded( + child: _buildSummaryItem( + title: "عدد الفواتير", + value: "$totalCount", + icon: Icons.receipt_long, + isMoney: false, + ), + ), + ], + ), + ], + ), + ); + } + + Widget _buildSummaryItem( + {required String title, + required String value, + required IconData icon, + required bool isMoney}) { + return Column( + children: [ + Container( + padding: const EdgeInsets.all(8), + decoration: BoxDecoration( + color: Colors.white.withOpacity(0.2), + shape: BoxShape.circle, + ), + child: Icon(icon, color: Colors.white, size: 20), + ), + const SizedBox(height: 8), + Text( + value, + style: TextStyle( + color: isMoney ? const Color(0xFFD1FAE5) : Colors.white, + fontSize: 22, + fontWeight: FontWeight.bold, + ), + ), + Text( + title, + style: TextStyle(color: Colors.white.withOpacity(0.8), fontSize: 12), + ), + ], + ); + } + + // === تصميم بطاقة الفاتورة === + Widget _buildInvoiceCard(dynamic invoice) { + // استخراج البيانات بأمان + String name = invoice['name'] ?? 'بدون اسم'; + String amount = invoice['amount']?.toString() ?? '0'; + String date = invoice['date'] ?? ''; + String invNumber = invoice['invoiceNumber']?.toString() ?? '#'; + String? imageUrl = invoice['imageLink']; + + return Container( + margin: const EdgeInsets.only(bottom: 16), + decoration: BoxDecoration( + color: Colors.white, + borderRadius: BorderRadius.circular(20), + boxShadow: [ + BoxShadow( + color: Colors.black.withOpacity(0.03), + blurRadius: 15, + offset: const Offset(0, 5), + ), + ], + ), + child: Material( + color: Colors.transparent, + child: InkWell( + borderRadius: BorderRadius.circular(20), + onTap: () { + if (imageUrl != null && imageUrl.isNotEmpty) { + _showImageDialog(context, imageUrl); + } else { + Get.snackbar("تنبيه", "لا توجد صورة مرفقة", + backgroundColor: Colors.grey[200], colorText: Colors.black); + } + }, + child: Padding( + padding: const EdgeInsets.all(16), + child: Row( + children: [ + // 1. أيقونة أو صورة مصغرة + Container( + width: 50, + height: 50, + decoration: BoxDecoration( + color: primaryColor.withOpacity(0.08), + borderRadius: BorderRadius.circular(15), + ), + child: imageUrl != null && imageUrl.isNotEmpty + ? ClipRRect( + borderRadius: BorderRadius.circular(15), + child: Image.network( + imageUrl, + fit: BoxFit.cover, + errorBuilder: (_, __, ___) => + Icon(Icons.receipt, color: primaryColor), + ), + ) + : Icon(Icons.receipt_outlined, color: primaryColor), + ), + + const SizedBox(width: 16), + + // 2. التفاصيل + Expanded( + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + Text( + name, + style: const TextStyle( + fontWeight: FontWeight.bold, + fontSize: 16, + color: Color(0xFF1F2937), + ), + maxLines: 1, + overflow: TextOverflow.ellipsis, + ), + Container( + padding: const EdgeInsets.symmetric( + horizontal: 8, vertical: 4), + decoration: BoxDecoration( + color: Colors.grey[100], + borderRadius: BorderRadius.circular(8), + ), + child: Text( + "#$invNumber", + style: TextStyle( + fontSize: 10, + color: Colors.grey[600], + fontWeight: FontWeight.bold), + ), + ), + ], + ), + const SizedBox(height: 6), + Text( + date, + style: TextStyle(color: Colors.grey[500], fontSize: 12), + ), + ], + ), + ), + + const SizedBox(width: 12), + + // 3. المبلغ + Column( + crossAxisAlignment: CrossAxisAlignment.end, + children: [ + Text( + "$amount", + style: TextStyle( + color: moneyColor, + fontWeight: FontWeight.w900, + fontSize: 18, + ), + ), + Text( + "د.أ", + style: TextStyle( + color: moneyColor.withOpacity(0.7), + fontWeight: FontWeight.w500, + fontSize: 12, + ), + ), + ], + ), + ], + ), + ), + ), + ), + ); + } + + Widget _buildEmptyState() { + return Center( + child: Column( + mainAxisAlignment: MainAxisAlignment.center, + children: [ + Icon(Icons.receipt_long_rounded, size: 80, color: Colors.grey[300]), + const SizedBox(height: 16), + Text( + "لا توجد فواتير حالياً", + style: TextStyle(color: Colors.grey[500], fontSize: 16), + ), + const SizedBox(height: 8), + TextButton.icon( + onPressed: fetchInvoices, + icon: const Icon(Icons.refresh), + label: const Text("تحديث"), + ), + ], + ), + ); + } +} diff --git a/siro_admin/lib/views/widgets/circle_container.dart b/siro_admin/lib/views/widgets/circle_container.dart new file mode 100644 index 0000000..9702b34 --- /dev/null +++ b/siro_admin/lib/views/widgets/circle_container.dart @@ -0,0 +1,63 @@ +import 'package:flutter/material.dart'; +import 'package:get/get.dart'; + +import '../../constant/colors.dart'; + +class MyCircleContainer extends StatelessWidget { + final Widget child; + final Color backgroundColor; + final Color borderColor; + + MyCircleContainer({ + Key? key, + required this.child, + this.backgroundColor = AppColor.secondaryColor, + this.borderColor = AppColor.accentColor, + }) : super(key: key); + + final controller = Get.put(CircleController()); + + @override + Widget build(BuildContext context) { + return GetBuilder( + builder: ((controller) => GestureDetector( + onTap: () { + controller.changeColor(); + }, + child: AnimatedContainer( + onEnd: () { + controller.onEnd(); + }, + duration: const Duration(milliseconds: 300), + width: controller.size, + height: controller.size, + decoration: BoxDecoration( + shape: BoxShape.circle, + color: controller.backgroundColor, + border: Border.all( + color: borderColor, + width: 1, + ), + ), + child: Center(child: child), + ), + ))); + } +} + +class CircleController extends GetxController { + Color backgroundColor = AppColor.secondaryColor; + double size = 40; + void changeColor() { + backgroundColor = backgroundColor == AppColor.secondaryColor + ? AppColor.accentColor + : AppColor.secondaryColor; + size = 60; + update(); + } + + void onEnd() { + size = 40; + update(); + } +} diff --git a/siro_admin/lib/views/widgets/elevated_btn.dart b/siro_admin/lib/views/widgets/elevated_btn.dart new file mode 100644 index 0000000..518a70e --- /dev/null +++ b/siro_admin/lib/views/widgets/elevated_btn.dart @@ -0,0 +1,68 @@ +import 'dart:io'; + +import 'package:flutter/material.dart'; +import 'package:flutter/services.dart'; + +import '../../constant/colors.dart'; +import '../../constant/style.dart'; + +class MyElevatedButton extends StatelessWidget { + final String title; + final VoidCallback onPressed; + final Color? kolor; + final IconData? icon; + + const MyElevatedButton({ + Key? key, + required this.title, + required this.onPressed, + this.kolor, + this.icon, + }) : super(key: key); + + @override + Widget build(BuildContext context) { + return Container( + width: double.infinity, + height: 56, + decoration: BoxDecoration( + borderRadius: BorderRadius.circular(16), + boxShadow: [ + BoxShadow( + color: (kolor ?? AppColor.accent).withOpacity(0.3), + blurRadius: 12, + offset: const Offset(0, 4), + ), + ], + ), + child: ElevatedButton( + style: ElevatedButton.styleFrom( + backgroundColor: kolor ?? AppColor.accent, + foregroundColor: Colors.white, + shape: RoundedRectangleBorder( + borderRadius: BorderRadius.circular(16), + ), + elevation: 0, + ), + onPressed: () { + HapticFeedback.lightImpact(); + onPressed(); + }, + child: Row( + mainAxisAlignment: MainAxisAlignment.center, + children: [ + if (icon != null) ...[ + Icon(icon, size: 20), + const SizedBox(width: 8), + ], + Text( + title, + style: AppStyle.title.copyWith(color: Colors.white), + ), + ], + ), + ), + ); + } +} + diff --git a/siro_admin/lib/views/widgets/icon_widget_menu.dart b/siro_admin/lib/views/widgets/icon_widget_menu.dart new file mode 100644 index 0000000..604aa40 --- /dev/null +++ b/siro_admin/lib/views/widgets/icon_widget_menu.dart @@ -0,0 +1,66 @@ +import 'package:flutter/material.dart'; + +import '../../constant/colors.dart'; +import '../../constant/style.dart'; + +class IconWidgetMenu extends StatelessWidget { + const IconWidgetMenu({ + Key? key, + required this.onpressed, + required this.icon, + required this.title, + }) : super(key: key); + + final VoidCallback onpressed; + final IconData icon; + final String title; + + @override + Widget build(BuildContext context) { + return InkWell( + onTap: onpressed, + child: Padding( + padding: const EdgeInsets.only(top: 25), + child: Column( + mainAxisAlignment: MainAxisAlignment.center, + children: [ + Container( + width: 50, + decoration: const BoxDecoration( + color: AppColor.secondaryColor, + shape: BoxShape.circle, + boxShadow: [ + BoxShadow( + color: AppColor.secondaryColor, + offset: Offset(-2, -2), + blurRadius: 0, + spreadRadius: 0, + blurStyle: BlurStyle.outer, + ), + BoxShadow( + color: AppColor.accentColor, + offset: Offset(3, 3), + blurRadius: 0, + spreadRadius: 0, + blurStyle: BlurStyle.outer, + ), + ], + ), + child: Center( + child: Icon( + icon, + size: 30, + color: AppColor.primaryColor, + ), + ), + ), + Text( + title, + style: AppStyle.subtitle, + ) + ], + ), + ), + ); + } +} diff --git a/siro_admin/lib/views/widgets/my_scafold.dart b/siro_admin/lib/views/widgets/my_scafold.dart new file mode 100644 index 0000000..29996c0 --- /dev/null +++ b/siro_admin/lib/views/widgets/my_scafold.dart @@ -0,0 +1,60 @@ +import 'package:flutter/material.dart'; +import 'package:get/get.dart'; + +import '../../constant/colors.dart'; +import '../../constant/style.dart'; + +class MyScafolld extends StatelessWidget { + const MyScafolld({ + super.key, + required this.title, + required this.body, + this.action, + required this.isleading, + }); + + final String title; + final List body; + final Widget? action; + final bool isleading; + + @override + Widget build(BuildContext context) { + return Scaffold( + backgroundColor: AppColor.bg, + appBar: AppBar( + backgroundColor: AppColor.bg, + elevation: 0, + leadingWidth: 70, + leading: isleading + ? Center( + child: Container( + margin: const EdgeInsets.only(right: 16), + decoration: BoxDecoration( + color: AppColor.surfaceElevated, + borderRadius: BorderRadius.circular(12), + border: Border.all(color: AppColor.divider), + ), + child: IconButton( + onPressed: () => Get.back(), + icon: const Icon( + Icons.arrow_back_ios_new_rounded, + color: AppColor.textPrimary, + size: 18, + ), + ), + ), + ) + : null, + actions: [ + if (action != null) action!, + const SizedBox(width: 16), + ], + title: Text( + title, + style: AppStyle.headTitle, + ), + ), + body: SafeArea(child: Stack(children: body))); + } +} diff --git a/siro_admin/lib/views/widgets/my_textField.dart b/siro_admin/lib/views/widgets/my_textField.dart new file mode 100644 index 0000000..5b46599 --- /dev/null +++ b/siro_admin/lib/views/widgets/my_textField.dart @@ -0,0 +1,77 @@ +import 'package:flutter/material.dart'; +import 'package:get/get.dart'; +import 'package:get_storage/get_storage.dart'; + +import '../../constant/colors.dart'; +import '../../constant/style.dart'; + +class MyTextForm extends StatelessWidget { + const MyTextForm({ + super.key, + required this.controller, + required this.label, + required this.hint, + required this.type, + this.prefixIcon, + }); + + final TextEditingController controller; + final String label, hint; + final TextInputType type; + final IconData? prefixIcon; + + @override + Widget build(BuildContext context) { + return Padding( + padding: const EdgeInsets.only(bottom: 16), + child: TextFormField( + keyboardType: type, + style: AppStyle.body, + cursorColor: AppColor.accent, + controller: controller, + decoration: InputDecoration( + filled: true, + fillColor: AppColor.surface, + prefixIcon: prefixIcon != null + ? Icon(prefixIcon, color: AppColor.textSecondary, size: 20) + : null, + contentPadding: const EdgeInsets.symmetric(horizontal: 20, vertical: 18), + enabledBorder: OutlineInputBorder( + borderSide: const BorderSide(color: AppColor.divider), + borderRadius: BorderRadius.circular(16), + ), + focusedBorder: OutlineInputBorder( + borderSide: const BorderSide(color: AppColor.accent, width: 2), + borderRadius: BorderRadius.circular(16), + ), + errorBorder: OutlineInputBorder( + borderSide: const BorderSide(color: AppColor.danger), + borderRadius: BorderRadius.circular(16), + ), + focusedErrorBorder: OutlineInputBorder( + borderSide: const BorderSide(color: AppColor.danger, width: 2), + borderRadius: BorderRadius.circular(16), + ), + labelText: label.tr, + labelStyle: AppStyle.subtitle, + hintText: hint.tr, + hintStyle: AppStyle.caption, + ), + validator: (value) { + if (value == null || value.isEmpty) { + return '${'Please enter'.tr} ${label.tr}'; + } + + if (type == TextInputType.emailAddress) { + if (!GetUtils.isEmail(value)) { + return 'Please enter a valid email.'.tr; + } + } + + return null; + }, + ), + ); + } +} + diff --git a/siro_admin/lib/views/widgets/mycircular.dart b/siro_admin/lib/views/widgets/mycircular.dart new file mode 100644 index 0000000..366d81a --- /dev/null +++ b/siro_admin/lib/views/widgets/mycircular.dart @@ -0,0 +1,37 @@ +import 'package:flutter/material.dart'; + +class MyCircularProgressIndicator extends StatelessWidget { + final Color backgroundColor; + + const MyCircularProgressIndicator({ + super.key, + this.backgroundColor = Colors.transparent, + }); + + @override + Widget build(BuildContext context) { + return Center( + child: Container( + width: 110, + height: 110, + decoration: BoxDecoration( + color: backgroundColor, + shape: BoxShape.circle, + ), + child: Stack( + children: [ + const Center(child: CircularProgressIndicator()), + Column( + children: [ + Align( + alignment: Alignment.center, + child: Image.asset('assets/images/logo.png'), + ), + ], + ), + ], + ), + ), + ); + } +} diff --git a/siro_admin/lib/views/widgets/mydialoug.dart b/siro_admin/lib/views/widgets/mydialoug.dart new file mode 100755 index 0000000..3089e04 --- /dev/null +++ b/siro_admin/lib/views/widgets/mydialoug.dart @@ -0,0 +1,183 @@ +import 'dart:ui'; +import 'package:flutter/cupertino.dart'; +import 'package:flutter/material.dart'; +import 'package:flutter/services.dart'; +import 'package:get/get.dart'; + +import '../../constant/colors.dart'; +import '../../constant/style.dart'; + +class DialogConfig { + static const Duration animationDuration = Duration(milliseconds: 200); + static const double blurStrength = 8.0; + static const double cornerRadius = 14.0; + static final BoxDecoration decoration = BoxDecoration( + borderRadius: BorderRadius.circular(cornerRadius), + boxShadow: [ + BoxShadow( + color: Colors.black.withAlpha(38), // 0.15 opacity + blurRadius: 16, + offset: const Offset(0, 8), + ), + ], + ); +} + +class MyDialog extends GetxController { + void getDialog(String title, String? midTitle, VoidCallback onPressed) { + HapticFeedback.mediumImpact(); + + Get.dialog( + TweenAnimationBuilder( + duration: DialogConfig.animationDuration, + tween: Tween(begin: 0.0, end: 1.0), + builder: (context, value, child) { + return Transform.scale( + scale: 0.95 + (0.05 * value), + child: Opacity(opacity: value, child: child), + ); + }, + child: BackdropFilter( + filter: ImageFilter.blur( + sigmaX: DialogConfig.blurStrength, + sigmaY: DialogConfig.blurStrength, + ), + child: AlertDialog( + backgroundColor: AppColor.surfaceElevated, + shape: RoundedRectangleBorder(borderRadius: BorderRadius.circular(24)), + title: Text( + title, + textAlign: TextAlign.center, + style: AppStyle.headTitle, + ), + content: midTitle != null + ? Text( + midTitle, + textAlign: TextAlign.center, + style: AppStyle.subtitle, + ) + : null, + actionsPadding: const EdgeInsets.fromLTRB(16, 0, 16, 16), + actions: [ + Row( + children: [ + Expanded( + child: TextButton( + onPressed: () => Get.back(), + style: TextButton.styleFrom( + padding: const EdgeInsets.symmetric(vertical: 16), + shape: RoundedRectangleBorder( + borderRadius: BorderRadius.circular(12), + side: const BorderSide(color: AppColor.divider), + ), + ), + child: Text('Cancel'.tr, style: AppStyle.subtitle), + ), + ), + const SizedBox(width: 12), + Expanded( + child: ElevatedButton( + onPressed: () { + HapticFeedback.mediumImpact(); + onPressed(); + }, + style: ElevatedButton.styleFrom( + backgroundColor: AppColor.accent, + foregroundColor: Colors.white, + padding: const EdgeInsets.symmetric(vertical: 16), + shape: RoundedRectangleBorder( + borderRadius: BorderRadius.circular(12), + ), + elevation: 0, + ), + child: Text('OK'.tr, style: AppStyle.title.copyWith(color: Colors.white)), + ), + ), + ], + ), + ], + ), + ), + ), + barrierColor: Colors.black54, + ); + } +} + +class MyDialogContent extends GetxController { + void getDialog(String title, Widget? content, VoidCallback onPressed) { + HapticFeedback.mediumImpact(); + + Get.dialog( + TweenAnimationBuilder( + duration: DialogConfig.animationDuration, + tween: Tween(begin: 0.0, end: 1.0), + builder: (context, value, child) { + return Transform.scale( + scale: 0.95 + (0.05 * value), + child: Opacity(opacity: value, child: child), + ); + }, + child: BackdropFilter( + filter: ImageFilter.blur( + sigmaX: DialogConfig.blurStrength, + sigmaY: DialogConfig.blurStrength, + ), + child: AlertDialog( + backgroundColor: AppColor.surfaceElevated, + shape: RoundedRectangleBorder(borderRadius: BorderRadius.circular(24)), + title: Text( + title, + textAlign: TextAlign.center, + style: AppStyle.headTitle, + ), + content: content != null + ? SingleChildScrollView(child: content) + : null, + actionsPadding: const EdgeInsets.fromLTRB(16, 0, 16, 16), + actions: [ + Row( + children: [ + Expanded( + child: TextButton( + onPressed: () => Get.back(), + style: TextButton.styleFrom( + padding: const EdgeInsets.symmetric(vertical: 16), + shape: RoundedRectangleBorder( + borderRadius: BorderRadius.circular(12), + side: const BorderSide(color: AppColor.divider), + ), + ), + child: Text('Cancel'.tr, style: AppStyle.subtitle), + ), + ), + const SizedBox(width: 12), + Expanded( + child: ElevatedButton( + onPressed: () { + HapticFeedback.mediumImpact(); + onPressed(); + }, + style: ElevatedButton.styleFrom( + backgroundColor: AppColor.accent, + foregroundColor: Colors.white, + padding: const EdgeInsets.symmetric(vertical: 16), + shape: RoundedRectangleBorder( + borderRadius: BorderRadius.circular(12), + ), + elevation: 0, + ), + child: Text('OK'.tr, style: AppStyle.title.copyWith(color: Colors.white)), + ), + ), + ], + ), + ], + ), + ), + ), + barrierColor: Colors.black54, + ); + } +} + diff --git a/siro_admin/lib/views/widgets/snackbar.dart b/siro_admin/lib/views/widgets/snackbar.dart new file mode 100644 index 0000000..0a129e4 --- /dev/null +++ b/siro_admin/lib/views/widgets/snackbar.dart @@ -0,0 +1,123 @@ +import 'package:flutter/material.dart'; +import 'package:flutter/services.dart'; +import 'package:get/get.dart'; + +import '../../constant/colors.dart'; + +class SnackbarConfig { + static const duration = Duration(seconds: 3); + static const animationDuration = Duration(milliseconds: 300); + static const margin = EdgeInsets.symmetric(horizontal: 16, vertical: 10); + static const borderRadius = 12.0; + static const elevation = 6.0; + + static final BoxShadow shadow = BoxShadow( + color: Colors.black.withOpacity(0.1), + blurRadius: 10, + offset: const Offset(0, 2), + ); +} + +SnackbarController mySnackeBarError(String message) { + // Trigger error haptic feedback + HapticFeedback.mediumImpact(); + + return Get.snackbar( + 'Error'.tr, + message, + backgroundColor: AppColor.redColor.withOpacity(0.95), + colorText: AppColor.secondaryColor, + icon: const Icon( + Icons.error_outline_rounded, + color: AppColor.secondaryColor, + size: 28, + ), + shouldIconPulse: true, + snackPosition: SnackPosition.TOP, + margin: SnackbarConfig.margin, + borderRadius: SnackbarConfig.borderRadius, + duration: SnackbarConfig.duration, + animationDuration: SnackbarConfig.animationDuration, + forwardAnimationCurve: Curves.easeOutCirc, + reverseAnimationCurve: Curves.easeInCirc, + boxShadows: [SnackbarConfig.shadow], + padding: const EdgeInsets.symmetric(horizontal: 20, vertical: 12), + titleText: Text( + 'Error'.tr, + style: const TextStyle( + fontWeight: FontWeight.w700, + color: Colors.white, + fontSize: 16, + letterSpacing: 0.2, + ), + ), + messageText: Text( + message, + style: TextStyle( + color: Colors.white.withOpacity(0.95), + fontSize: 14, + height: 1.3, + ), + ), + onTap: (_) { + HapticFeedback.lightImpact(); + Get.closeCurrentSnackbar(); + }, + isDismissible: true, + dismissDirection: DismissDirection.horizontal, + overlayBlur: 0.8, + overlayColor: Colors.black12, + ); +} + +SnackbarController mySnackbarSuccess(String message) { + // Trigger success haptic feedback + HapticFeedback.lightImpact(); + + return Get.snackbar( + 'Success'.tr, + message, + backgroundColor: AppColor.greenColor.withOpacity(0.95), + colorText: AppColor.secondaryColor, + icon: const Icon( + Icons.check_circle_outline_rounded, + color: AppColor.secondaryColor, + size: 28, + ), + shouldIconPulse: true, + snackPosition: SnackPosition.TOP, + margin: SnackbarConfig.margin, + borderRadius: SnackbarConfig.borderRadius, + duration: SnackbarConfig.duration, + animationDuration: SnackbarConfig.animationDuration, + forwardAnimationCurve: Curves.easeOutCirc, + reverseAnimationCurve: Curves.easeInCirc, + boxShadows: [SnackbarConfig.shadow], + padding: const EdgeInsets.symmetric(horizontal: 20, vertical: 12), + titleText: Text( + 'Success'.tr, + style: const TextStyle( + fontWeight: FontWeight.w700, + color: Colors.white, + fontSize: 16, + letterSpacing: 0.2, + ), + ), + messageText: Text( + message, + style: TextStyle( + color: Colors.white.withOpacity(0.95), + fontSize: 14, + height: 1.3, + ), + ), + onTap: (_) { + HapticFeedback.lightImpact(); + Get.closeCurrentSnackbar(); + }, + isDismissible: true, + dismissDirection: DismissDirection.horizontal, + overlayBlur: 0.8, + overlayColor: Colors.black12, + ); +} diff --git a/siro_admin/linux/.gitignore b/siro_admin/linux/.gitignore new file mode 100644 index 0000000..d3896c9 --- /dev/null +++ b/siro_admin/linux/.gitignore @@ -0,0 +1 @@ +flutter/ephemeral diff --git a/siro_admin/linux/CMakeLists.txt b/siro_admin/linux/CMakeLists.txt new file mode 100644 index 0000000..3ac5670 --- /dev/null +++ b/siro_admin/linux/CMakeLists.txt @@ -0,0 +1,128 @@ +# Project-level configuration. +cmake_minimum_required(VERSION 3.13) +project(runner LANGUAGES CXX) + +# The name of the executable created for the application. Change this to change +# the on-disk name of your application. +set(BINARY_NAME "siro_admin") +# The unique GTK application identifier for this application. See: +# https://wiki.gnome.org/HowDoI/ChooseApplicationID +set(APPLICATION_ID "com.siro.siro_admin") + +# Explicitly opt in to modern CMake behaviors to avoid warnings with recent +# versions of CMake. +cmake_policy(SET CMP0063 NEW) + +# Load bundled libraries from the lib/ directory relative to the binary. +set(CMAKE_INSTALL_RPATH "$ORIGIN/lib") + +# Root filesystem for cross-building. +if(FLUTTER_TARGET_PLATFORM_SYSROOT) + set(CMAKE_SYSROOT ${FLUTTER_TARGET_PLATFORM_SYSROOT}) + set(CMAKE_FIND_ROOT_PATH ${CMAKE_SYSROOT}) + set(CMAKE_FIND_ROOT_PATH_MODE_PROGRAM NEVER) + set(CMAKE_FIND_ROOT_PATH_MODE_PACKAGE ONLY) + set(CMAKE_FIND_ROOT_PATH_MODE_LIBRARY ONLY) + set(CMAKE_FIND_ROOT_PATH_MODE_INCLUDE ONLY) +endif() + +# Define build configuration options. +if(NOT CMAKE_BUILD_TYPE AND NOT CMAKE_CONFIGURATION_TYPES) + set(CMAKE_BUILD_TYPE "Debug" CACHE + STRING "Flutter build mode" FORCE) + set_property(CACHE CMAKE_BUILD_TYPE PROPERTY STRINGS + "Debug" "Profile" "Release") +endif() + +# Compilation settings that should be applied to most targets. +# +# Be cautious about adding new options here, as plugins use this function by +# default. In most cases, you should add new options to specific targets instead +# of modifying this function. +function(APPLY_STANDARD_SETTINGS TARGET) + target_compile_features(${TARGET} PUBLIC cxx_std_14) + target_compile_options(${TARGET} PRIVATE -Wall -Werror) + target_compile_options(${TARGET} PRIVATE "$<$>:-O3>") + target_compile_definitions(${TARGET} PRIVATE "$<$>:NDEBUG>") +endfunction() + +# Flutter library and tool build rules. +set(FLUTTER_MANAGED_DIR "${CMAKE_CURRENT_SOURCE_DIR}/flutter") +add_subdirectory(${FLUTTER_MANAGED_DIR}) + +# System-level dependencies. +find_package(PkgConfig REQUIRED) +pkg_check_modules(GTK REQUIRED IMPORTED_TARGET gtk+-3.0) + +# Application build; see runner/CMakeLists.txt. +add_subdirectory("runner") + +# Run the Flutter tool portions of the build. This must not be removed. +add_dependencies(${BINARY_NAME} flutter_assemble) + +# Only the install-generated bundle's copy of the executable will launch +# correctly, since the resources must in the right relative locations. To avoid +# people trying to run the unbundled copy, put it in a subdirectory instead of +# the default top-level location. +set_target_properties(${BINARY_NAME} + PROPERTIES + RUNTIME_OUTPUT_DIRECTORY "${CMAKE_BINARY_DIR}/intermediates_do_not_run" +) + + +# Generated plugin build rules, which manage building the plugins and adding +# them to the application. +include(flutter/generated_plugins.cmake) + + +# === Installation === +# By default, "installing" just makes a relocatable bundle in the build +# directory. +set(BUILD_BUNDLE_DIR "${PROJECT_BINARY_DIR}/bundle") +if(CMAKE_INSTALL_PREFIX_INITIALIZED_TO_DEFAULT) + set(CMAKE_INSTALL_PREFIX "${BUILD_BUNDLE_DIR}" CACHE PATH "..." FORCE) +endif() + +# Start with a clean build bundle directory every time. +install(CODE " + file(REMOVE_RECURSE \"${BUILD_BUNDLE_DIR}/\") + " COMPONENT Runtime) + +set(INSTALL_BUNDLE_DATA_DIR "${CMAKE_INSTALL_PREFIX}/data") +set(INSTALL_BUNDLE_LIB_DIR "${CMAKE_INSTALL_PREFIX}/lib") + +install(TARGETS ${BINARY_NAME} RUNTIME DESTINATION "${CMAKE_INSTALL_PREFIX}" + COMPONENT Runtime) + +install(FILES "${FLUTTER_ICU_DATA_FILE}" DESTINATION "${INSTALL_BUNDLE_DATA_DIR}" + COMPONENT Runtime) + +install(FILES "${FLUTTER_LIBRARY}" DESTINATION "${INSTALL_BUNDLE_LIB_DIR}" + COMPONENT Runtime) + +foreach(bundled_library ${PLUGIN_BUNDLED_LIBRARIES}) + install(FILES "${bundled_library}" + DESTINATION "${INSTALL_BUNDLE_LIB_DIR}" + COMPONENT Runtime) +endforeach(bundled_library) + +# Copy the native assets provided by the build.dart from all packages. +set(NATIVE_ASSETS_DIR "${PROJECT_BUILD_DIR}native_assets/linux/") +install(DIRECTORY "${NATIVE_ASSETS_DIR}" + DESTINATION "${INSTALL_BUNDLE_LIB_DIR}" + COMPONENT Runtime) + +# Fully re-copy the assets directory on each build to avoid having stale files +# from a previous install. +set(FLUTTER_ASSET_DIR_NAME "flutter_assets") +install(CODE " + file(REMOVE_RECURSE \"${INSTALL_BUNDLE_DATA_DIR}/${FLUTTER_ASSET_DIR_NAME}\") + " COMPONENT Runtime) +install(DIRECTORY "${PROJECT_BUILD_DIR}/${FLUTTER_ASSET_DIR_NAME}" + DESTINATION "${INSTALL_BUNDLE_DATA_DIR}" COMPONENT Runtime) + +# Install the AOT library on non-Debug builds only. +if(NOT CMAKE_BUILD_TYPE MATCHES "Debug") + install(FILES "${AOT_LIBRARY}" DESTINATION "${INSTALL_BUNDLE_LIB_DIR}" + COMPONENT Runtime) +endif() diff --git a/siro_admin/linux/flutter/CMakeLists.txt b/siro_admin/linux/flutter/CMakeLists.txt new file mode 100644 index 0000000..d5bd016 --- /dev/null +++ b/siro_admin/linux/flutter/CMakeLists.txt @@ -0,0 +1,88 @@ +# This file controls Flutter-level build steps. It should not be edited. +cmake_minimum_required(VERSION 3.10) + +set(EPHEMERAL_DIR "${CMAKE_CURRENT_SOURCE_DIR}/ephemeral") + +# Configuration provided via flutter tool. +include(${EPHEMERAL_DIR}/generated_config.cmake) + +# TODO: Move the rest of this into files in ephemeral. See +# https://github.com/flutter/flutter/issues/57146. + +# Serves the same purpose as list(TRANSFORM ... PREPEND ...), +# which isn't available in 3.10. +function(list_prepend LIST_NAME PREFIX) + set(NEW_LIST "") + foreach(element ${${LIST_NAME}}) + list(APPEND NEW_LIST "${PREFIX}${element}") + endforeach(element) + set(${LIST_NAME} "${NEW_LIST}" PARENT_SCOPE) +endfunction() + +# === Flutter Library === +# System-level dependencies. +find_package(PkgConfig REQUIRED) +pkg_check_modules(GTK REQUIRED IMPORTED_TARGET gtk+-3.0) +pkg_check_modules(GLIB REQUIRED IMPORTED_TARGET glib-2.0) +pkg_check_modules(GIO REQUIRED IMPORTED_TARGET gio-2.0) + +set(FLUTTER_LIBRARY "${EPHEMERAL_DIR}/libflutter_linux_gtk.so") + +# Published to parent scope for install step. +set(FLUTTER_LIBRARY ${FLUTTER_LIBRARY} PARENT_SCOPE) +set(FLUTTER_ICU_DATA_FILE "${EPHEMERAL_DIR}/icudtl.dat" PARENT_SCOPE) +set(PROJECT_BUILD_DIR "${PROJECT_DIR}/build/" PARENT_SCOPE) +set(AOT_LIBRARY "${PROJECT_DIR}/build/lib/libapp.so" PARENT_SCOPE) + +list(APPEND FLUTTER_LIBRARY_HEADERS + "fl_basic_message_channel.h" + "fl_binary_codec.h" + "fl_binary_messenger.h" + "fl_dart_project.h" + "fl_engine.h" + "fl_json_message_codec.h" + "fl_json_method_codec.h" + "fl_message_codec.h" + "fl_method_call.h" + "fl_method_channel.h" + "fl_method_codec.h" + "fl_method_response.h" + "fl_plugin_registrar.h" + "fl_plugin_registry.h" + "fl_standard_message_codec.h" + "fl_standard_method_codec.h" + "fl_string_codec.h" + "fl_value.h" + "fl_view.h" + "flutter_linux.h" +) +list_prepend(FLUTTER_LIBRARY_HEADERS "${EPHEMERAL_DIR}/flutter_linux/") +add_library(flutter INTERFACE) +target_include_directories(flutter INTERFACE + "${EPHEMERAL_DIR}" +) +target_link_libraries(flutter INTERFACE "${FLUTTER_LIBRARY}") +target_link_libraries(flutter INTERFACE + PkgConfig::GTK + PkgConfig::GLIB + PkgConfig::GIO +) +add_dependencies(flutter flutter_assemble) + +# === Flutter tool backend === +# _phony_ is a non-existent file to force this command to run every time, +# since currently there's no way to get a full input/output list from the +# flutter tool. +add_custom_command( + OUTPUT ${FLUTTER_LIBRARY} ${FLUTTER_LIBRARY_HEADERS} + ${CMAKE_CURRENT_BINARY_DIR}/_phony_ + COMMAND ${CMAKE_COMMAND} -E env + ${FLUTTER_TOOL_ENVIRONMENT} + "${FLUTTER_ROOT}/packages/flutter_tools/bin/tool_backend.sh" + ${FLUTTER_TARGET_PLATFORM} ${CMAKE_BUILD_TYPE} + VERBATIM +) +add_custom_target(flutter_assemble DEPENDS + "${FLUTTER_LIBRARY}" + ${FLUTTER_LIBRARY_HEADERS} +) diff --git a/siro_admin/linux/flutter/generated_plugin_registrant.cc b/siro_admin/linux/flutter/generated_plugin_registrant.cc new file mode 100644 index 0000000..3ccd551 --- /dev/null +++ b/siro_admin/linux/flutter/generated_plugin_registrant.cc @@ -0,0 +1,23 @@ +// +// Generated file. Do not edit. +// + +// clang-format off + +#include "generated_plugin_registrant.h" + +#include +#include +#include + +void fl_register_plugins(FlPluginRegistry* registry) { + g_autoptr(FlPluginRegistrar) file_selector_linux_registrar = + fl_plugin_registry_get_registrar_for_plugin(registry, "FileSelectorPlugin"); + file_selector_plugin_register_with_registrar(file_selector_linux_registrar); + g_autoptr(FlPluginRegistrar) flutter_secure_storage_linux_registrar = + fl_plugin_registry_get_registrar_for_plugin(registry, "FlutterSecureStorageLinuxPlugin"); + flutter_secure_storage_linux_plugin_register_with_registrar(flutter_secure_storage_linux_registrar); + g_autoptr(FlPluginRegistrar) url_launcher_linux_registrar = + fl_plugin_registry_get_registrar_for_plugin(registry, "UrlLauncherPlugin"); + url_launcher_plugin_register_with_registrar(url_launcher_linux_registrar); +} diff --git a/siro_admin/linux/flutter/generated_plugin_registrant.h b/siro_admin/linux/flutter/generated_plugin_registrant.h new file mode 100644 index 0000000..e0f0a47 --- /dev/null +++ b/siro_admin/linux/flutter/generated_plugin_registrant.h @@ -0,0 +1,15 @@ +// +// Generated file. Do not edit. +// + +// clang-format off + +#ifndef GENERATED_PLUGIN_REGISTRANT_ +#define GENERATED_PLUGIN_REGISTRANT_ + +#include + +// Registers Flutter plugins. +void fl_register_plugins(FlPluginRegistry* registry); + +#endif // GENERATED_PLUGIN_REGISTRANT_ diff --git a/siro_admin/linux/flutter/generated_plugins.cmake b/siro_admin/linux/flutter/generated_plugins.cmake new file mode 100644 index 0000000..fbedf4a --- /dev/null +++ b/siro_admin/linux/flutter/generated_plugins.cmake @@ -0,0 +1,27 @@ +# +# Generated file, do not edit. +# + +list(APPEND FLUTTER_PLUGIN_LIST + file_selector_linux + flutter_secure_storage_linux + url_launcher_linux +) + +list(APPEND FLUTTER_FFI_PLUGIN_LIST + jni +) + +set(PLUGIN_BUNDLED_LIBRARIES) + +foreach(plugin ${FLUTTER_PLUGIN_LIST}) + add_subdirectory(flutter/ephemeral/.plugin_symlinks/${plugin}/linux plugins/${plugin}) + target_link_libraries(${BINARY_NAME} PRIVATE ${plugin}_plugin) + list(APPEND PLUGIN_BUNDLED_LIBRARIES $) + list(APPEND PLUGIN_BUNDLED_LIBRARIES ${${plugin}_bundled_libraries}) +endforeach(plugin) + +foreach(ffi_plugin ${FLUTTER_FFI_PLUGIN_LIST}) + add_subdirectory(flutter/ephemeral/.plugin_symlinks/${ffi_plugin}/linux plugins/${ffi_plugin}) + list(APPEND PLUGIN_BUNDLED_LIBRARIES ${${ffi_plugin}_bundled_libraries}) +endforeach(ffi_plugin) diff --git a/siro_admin/linux/runner/CMakeLists.txt b/siro_admin/linux/runner/CMakeLists.txt new file mode 100644 index 0000000..e97dabc --- /dev/null +++ b/siro_admin/linux/runner/CMakeLists.txt @@ -0,0 +1,26 @@ +cmake_minimum_required(VERSION 3.13) +project(runner LANGUAGES CXX) + +# Define the application target. To change its name, change BINARY_NAME in the +# top-level CMakeLists.txt, not the value here, or `flutter run` will no longer +# work. +# +# Any new source files that you add to the application should be added here. +add_executable(${BINARY_NAME} + "main.cc" + "my_application.cc" + "${FLUTTER_MANAGED_DIR}/generated_plugin_registrant.cc" +) + +# Apply the standard set of build settings. This can be removed for applications +# that need different build settings. +apply_standard_settings(${BINARY_NAME}) + +# Add preprocessor definitions for the application ID. +add_definitions(-DAPPLICATION_ID="${APPLICATION_ID}") + +# Add dependency libraries. Add any application-specific dependencies here. +target_link_libraries(${BINARY_NAME} PRIVATE flutter) +target_link_libraries(${BINARY_NAME} PRIVATE PkgConfig::GTK) + +target_include_directories(${BINARY_NAME} PRIVATE "${CMAKE_SOURCE_DIR}") diff --git a/siro_admin/linux/runner/main.cc b/siro_admin/linux/runner/main.cc new file mode 100644 index 0000000..e7c5c54 --- /dev/null +++ b/siro_admin/linux/runner/main.cc @@ -0,0 +1,6 @@ +#include "my_application.h" + +int main(int argc, char** argv) { + g_autoptr(MyApplication) app = my_application_new(); + return g_application_run(G_APPLICATION(app), argc, argv); +} diff --git a/siro_admin/linux/runner/my_application.cc b/siro_admin/linux/runner/my_application.cc new file mode 100644 index 0000000..2bdeb80 --- /dev/null +++ b/siro_admin/linux/runner/my_application.cc @@ -0,0 +1,148 @@ +#include "my_application.h" + +#include +#ifdef GDK_WINDOWING_X11 +#include +#endif + +#include "flutter/generated_plugin_registrant.h" + +struct _MyApplication { + GtkApplication parent_instance; + char** dart_entrypoint_arguments; +}; + +G_DEFINE_TYPE(MyApplication, my_application, GTK_TYPE_APPLICATION) + +// Called when first Flutter frame received. +static void first_frame_cb(MyApplication* self, FlView* view) { + gtk_widget_show(gtk_widget_get_toplevel(GTK_WIDGET(view))); +} + +// Implements GApplication::activate. +static void my_application_activate(GApplication* application) { + MyApplication* self = MY_APPLICATION(application); + GtkWindow* window = + GTK_WINDOW(gtk_application_window_new(GTK_APPLICATION(application))); + + // Use a header bar when running in GNOME as this is the common style used + // by applications and is the setup most users will be using (e.g. Ubuntu + // desktop). + // If running on X and not using GNOME then just use a traditional title bar + // in case the window manager does more exotic layout, e.g. tiling. + // If running on Wayland assume the header bar will work (may need changing + // if future cases occur). + gboolean use_header_bar = TRUE; +#ifdef GDK_WINDOWING_X11 + GdkScreen* screen = gtk_window_get_screen(window); + if (GDK_IS_X11_SCREEN(screen)) { + const gchar* wm_name = gdk_x11_screen_get_window_manager_name(screen); + if (g_strcmp0(wm_name, "GNOME Shell") != 0) { + use_header_bar = FALSE; + } + } +#endif + if (use_header_bar) { + GtkHeaderBar* header_bar = GTK_HEADER_BAR(gtk_header_bar_new()); + gtk_widget_show(GTK_WIDGET(header_bar)); + gtk_header_bar_set_title(header_bar, "siro_admin"); + gtk_header_bar_set_show_close_button(header_bar, TRUE); + gtk_window_set_titlebar(window, GTK_WIDGET(header_bar)); + } else { + gtk_window_set_title(window, "siro_admin"); + } + + gtk_window_set_default_size(window, 1280, 720); + + g_autoptr(FlDartProject) project = fl_dart_project_new(); + fl_dart_project_set_dart_entrypoint_arguments( + project, self->dart_entrypoint_arguments); + + FlView* view = fl_view_new(project); + GdkRGBA background_color; + // Background defaults to black, override it here if necessary, e.g. #00000000 + // for transparent. + gdk_rgba_parse(&background_color, "#000000"); + fl_view_set_background_color(view, &background_color); + gtk_widget_show(GTK_WIDGET(view)); + gtk_container_add(GTK_CONTAINER(window), GTK_WIDGET(view)); + + // Show the window when Flutter renders. + // Requires the view to be realized so we can start rendering. + g_signal_connect_swapped(view, "first-frame", G_CALLBACK(first_frame_cb), + self); + gtk_widget_realize(GTK_WIDGET(view)); + + fl_register_plugins(FL_PLUGIN_REGISTRY(view)); + + gtk_widget_grab_focus(GTK_WIDGET(view)); +} + +// Implements GApplication::local_command_line. +static gboolean my_application_local_command_line(GApplication* application, + gchar*** arguments, + int* exit_status) { + MyApplication* self = MY_APPLICATION(application); + // Strip out the first argument as it is the binary name. + self->dart_entrypoint_arguments = g_strdupv(*arguments + 1); + + g_autoptr(GError) error = nullptr; + if (!g_application_register(application, nullptr, &error)) { + g_warning("Failed to register: %s", error->message); + *exit_status = 1; + return TRUE; + } + + g_application_activate(application); + *exit_status = 0; + + return TRUE; +} + +// Implements GApplication::startup. +static void my_application_startup(GApplication* application) { + // MyApplication* self = MY_APPLICATION(object); + + // Perform any actions required at application startup. + + G_APPLICATION_CLASS(my_application_parent_class)->startup(application); +} + +// Implements GApplication::shutdown. +static void my_application_shutdown(GApplication* application) { + // MyApplication* self = MY_APPLICATION(object); + + // Perform any actions required at application shutdown. + + G_APPLICATION_CLASS(my_application_parent_class)->shutdown(application); +} + +// Implements GObject::dispose. +static void my_application_dispose(GObject* object) { + MyApplication* self = MY_APPLICATION(object); + g_clear_pointer(&self->dart_entrypoint_arguments, g_strfreev); + G_OBJECT_CLASS(my_application_parent_class)->dispose(object); +} + +static void my_application_class_init(MyApplicationClass* klass) { + G_APPLICATION_CLASS(klass)->activate = my_application_activate; + G_APPLICATION_CLASS(klass)->local_command_line = + my_application_local_command_line; + G_APPLICATION_CLASS(klass)->startup = my_application_startup; + G_APPLICATION_CLASS(klass)->shutdown = my_application_shutdown; + G_OBJECT_CLASS(klass)->dispose = my_application_dispose; +} + +static void my_application_init(MyApplication* self) {} + +MyApplication* my_application_new() { + // Set the program name to the application ID, which helps various systems + // like GTK and desktop environments map this running application to its + // corresponding .desktop file. This ensures better integration by allowing + // the application to be recognized beyond its binary name. + g_set_prgname(APPLICATION_ID); + + return MY_APPLICATION(g_object_new(my_application_get_type(), + "application-id", APPLICATION_ID, "flags", + G_APPLICATION_NON_UNIQUE, nullptr)); +} diff --git a/siro_admin/linux/runner/my_application.h b/siro_admin/linux/runner/my_application.h new file mode 100644 index 0000000..db16367 --- /dev/null +++ b/siro_admin/linux/runner/my_application.h @@ -0,0 +1,21 @@ +#ifndef FLUTTER_MY_APPLICATION_H_ +#define FLUTTER_MY_APPLICATION_H_ + +#include + +G_DECLARE_FINAL_TYPE(MyApplication, + my_application, + MY, + APPLICATION, + GtkApplication) + +/** + * my_application_new: + * + * Creates a new Flutter-based application. + * + * Returns: a new #MyApplication. + */ +MyApplication* my_application_new(); + +#endif // FLUTTER_MY_APPLICATION_H_ diff --git a/siro_admin/macos/.gitignore b/siro_admin/macos/.gitignore new file mode 100644 index 0000000..746adbb --- /dev/null +++ b/siro_admin/macos/.gitignore @@ -0,0 +1,7 @@ +# Flutter-related +**/Flutter/ephemeral/ +**/Pods/ + +# Xcode-related +**/dgph +**/xcuserdata/ diff --git a/siro_admin/macos/Flutter/Flutter-Debug.xcconfig b/siro_admin/macos/Flutter/Flutter-Debug.xcconfig new file mode 100644 index 0000000..4b81f9b --- /dev/null +++ b/siro_admin/macos/Flutter/Flutter-Debug.xcconfig @@ -0,0 +1,2 @@ +#include? "Pods/Target Support Files/Pods-Runner/Pods-Runner.debug.xcconfig" +#include "ephemeral/Flutter-Generated.xcconfig" diff --git a/siro_admin/macos/Flutter/Flutter-Release.xcconfig b/siro_admin/macos/Flutter/Flutter-Release.xcconfig new file mode 100644 index 0000000..5caa9d1 --- /dev/null +++ b/siro_admin/macos/Flutter/Flutter-Release.xcconfig @@ -0,0 +1,2 @@ +#include? "Pods/Target Support Files/Pods-Runner/Pods-Runner.release.xcconfig" +#include "ephemeral/Flutter-Generated.xcconfig" diff --git a/siro_admin/macos/Flutter/GeneratedPluginRegistrant.swift b/siro_admin/macos/Flutter/GeneratedPluginRegistrant.swift new file mode 100644 index 0000000..a2f221b --- /dev/null +++ b/siro_admin/macos/Flutter/GeneratedPluginRegistrant.swift @@ -0,0 +1,32 @@ +// +// Generated file. Do not edit. +// + +import FlutterMacOS +import Foundation + +import device_info_plus +import file_selector_macos +import firebase_core +import firebase_crashlytics +import firebase_messaging +import flutter_image_compress_macos +import flutter_secure_storage_macos +import google_sign_in_ios +import local_auth_darwin +import sqflite_darwin +import url_launcher_macos + +func RegisterGeneratedPlugins(registry: FlutterPluginRegistry) { + DeviceInfoPlusMacosPlugin.register(with: registry.registrar(forPlugin: "DeviceInfoPlusMacosPlugin")) + FileSelectorPlugin.register(with: registry.registrar(forPlugin: "FileSelectorPlugin")) + FLTFirebaseCorePlugin.register(with: registry.registrar(forPlugin: "FLTFirebaseCorePlugin")) + FLTFirebaseCrashlyticsPlugin.register(with: registry.registrar(forPlugin: "FLTFirebaseCrashlyticsPlugin")) + FLTFirebaseMessagingPlugin.register(with: registry.registrar(forPlugin: "FLTFirebaseMessagingPlugin")) + FlutterImageCompressMacosPlugin.register(with: registry.registrar(forPlugin: "FlutterImageCompressMacosPlugin")) + FlutterSecureStoragePlugin.register(with: registry.registrar(forPlugin: "FlutterSecureStoragePlugin")) + FLTGoogleSignInPlugin.register(with: registry.registrar(forPlugin: "FLTGoogleSignInPlugin")) + LocalAuthPlugin.register(with: registry.registrar(forPlugin: "LocalAuthPlugin")) + SqflitePlugin.register(with: registry.registrar(forPlugin: "SqflitePlugin")) + UrlLauncherPlugin.register(with: registry.registrar(forPlugin: "UrlLauncherPlugin")) +} diff --git a/siro_admin/macos/Podfile b/siro_admin/macos/Podfile new file mode 100644 index 0000000..ff5ddb3 --- /dev/null +++ b/siro_admin/macos/Podfile @@ -0,0 +1,42 @@ +platform :osx, '10.15' + +# CocoaPods analytics sends network stats synchronously affecting flutter build latency. +ENV['COCOAPODS_DISABLE_STATS'] = 'true' + +project 'Runner', { + 'Debug' => :debug, + 'Profile' => :release, + 'Release' => :release, +} + +def flutter_root + generated_xcode_build_settings_path = File.expand_path(File.join('..', 'Flutter', 'ephemeral', 'Flutter-Generated.xcconfig'), __FILE__) + unless File.exist?(generated_xcode_build_settings_path) + raise "#{generated_xcode_build_settings_path} must exist. If you're running pod install manually, make sure \"flutter pub get\" is executed first" + end + + File.foreach(generated_xcode_build_settings_path) do |line| + matches = line.match(/FLUTTER_ROOT\=(.*)/) + return matches[1].strip if matches + end + raise "FLUTTER_ROOT not found in #{generated_xcode_build_settings_path}. Try deleting Flutter-Generated.xcconfig, then run \"flutter pub get\"" +end + +require File.expand_path(File.join('packages', 'flutter_tools', 'bin', 'podhelper'), flutter_root) + +flutter_macos_podfile_setup + +target 'Runner' do + use_frameworks! + + flutter_install_all_macos_pods File.dirname(File.realpath(__FILE__)) + target 'RunnerTests' do + inherit! :search_paths + end +end + +post_install do |installer| + installer.pods_project.targets.each do |target| + flutter_additional_macos_build_settings(target) + end +end diff --git a/siro_admin/macos/Podfile.lock b/siro_admin/macos/Podfile.lock new file mode 100644 index 0000000..3aeb2b1 --- /dev/null +++ b/siro_admin/macos/Podfile.lock @@ -0,0 +1,243 @@ +PODS: + - AppAuth (1.7.6): + - AppAuth/Core (= 1.7.6) + - AppAuth/ExternalUserAgent (= 1.7.6) + - AppAuth/Core (1.7.6) + - AppAuth/ExternalUserAgent (1.7.6): + - AppAuth/Core + - AppCheckCore (11.2.0): + - GoogleUtilities/Environment (~> 8.0) + - GoogleUtilities/UserDefaults (~> 8.0) + - PromisesObjC (~> 2.4) + - device_info_plus (0.0.1): + - FlutterMacOS + - file_selector_macos (0.0.1): + - FlutterMacOS + - Firebase/CoreOnly (11.15.0): + - FirebaseCore (~> 11.15.0) + - Firebase/Crashlytics (11.15.0): + - Firebase/CoreOnly + - FirebaseCrashlytics (~> 11.15.0) + - Firebase/Messaging (11.15.0): + - Firebase/CoreOnly + - FirebaseMessaging (~> 11.15.0) + - firebase_core (3.15.2): + - Firebase/CoreOnly (~> 11.15.0) + - FlutterMacOS + - firebase_crashlytics (4.3.10): + - Firebase/CoreOnly (~> 11.15.0) + - Firebase/Crashlytics (~> 11.15.0) + - firebase_core + - FlutterMacOS + - firebase_messaging (15.2.10): + - Firebase/CoreOnly (~> 11.15.0) + - Firebase/Messaging (~> 11.15.0) + - firebase_core + - FlutterMacOS + - FirebaseCore (11.15.0): + - FirebaseCoreInternal (~> 11.15.0) + - GoogleUtilities/Environment (~> 8.1) + - GoogleUtilities/Logger (~> 8.1) + - FirebaseCoreExtension (11.15.0): + - FirebaseCore (~> 11.15.0) + - FirebaseCoreInternal (11.15.0): + - "GoogleUtilities/NSData+zlib (~> 8.1)" + - FirebaseCrashlytics (11.15.0): + - FirebaseCore (~> 11.15.0) + - FirebaseInstallations (~> 11.0) + - FirebaseRemoteConfigInterop (~> 11.0) + - FirebaseSessions (~> 11.0) + - GoogleDataTransport (~> 10.0) + - GoogleUtilities/Environment (~> 8.1) + - nanopb (~> 3.30910.0) + - PromisesObjC (~> 2.4) + - FirebaseInstallations (11.15.0): + - FirebaseCore (~> 11.15.0) + - GoogleUtilities/Environment (~> 8.1) + - GoogleUtilities/UserDefaults (~> 8.1) + - PromisesObjC (~> 2.4) + - FirebaseMessaging (11.15.0): + - FirebaseCore (~> 11.15.0) + - FirebaseInstallations (~> 11.0) + - GoogleDataTransport (~> 10.0) + - GoogleUtilities/AppDelegateSwizzler (~> 8.1) + - GoogleUtilities/Environment (~> 8.1) + - GoogleUtilities/Reachability (~> 8.1) + - GoogleUtilities/UserDefaults (~> 8.1) + - nanopb (~> 3.30910.0) + - FirebaseRemoteConfigInterop (11.15.0) + - FirebaseSessions (11.15.0): + - FirebaseCore (~> 11.15.0) + - FirebaseCoreExtension (~> 11.15.0) + - FirebaseInstallations (~> 11.0) + - GoogleDataTransport (~> 10.0) + - GoogleUtilities/Environment (~> 8.1) + - GoogleUtilities/UserDefaults (~> 8.1) + - nanopb (~> 3.30910.0) + - PromisesSwift (~> 2.1) + - flutter_image_compress_macos (1.0.0): + - FlutterMacOS + - flutter_secure_storage_macos (6.1.3): + - FlutterMacOS + - FlutterMacOS (1.0.0) + - google_sign_in_ios (0.0.1): + - AppAuth (>= 1.7.4) + - Flutter + - FlutterMacOS + - GoogleSignIn (~> 8.0) + - GTMSessionFetcher (>= 3.4.0) + - GoogleDataTransport (10.1.0): + - nanopb (~> 3.30910.0) + - PromisesObjC (~> 2.4) + - GoogleSignIn (8.0.0): + - AppAuth (< 2.0, >= 1.7.3) + - AppCheckCore (~> 11.0) + - GTMAppAuth (< 5.0, >= 4.1.1) + - GTMSessionFetcher/Core (~> 3.3) + - GoogleUtilities/AppDelegateSwizzler (8.1.0): + - GoogleUtilities/Environment + - GoogleUtilities/Logger + - GoogleUtilities/Network + - GoogleUtilities/Privacy + - GoogleUtilities/Environment (8.1.0): + - GoogleUtilities/Privacy + - GoogleUtilities/Logger (8.1.0): + - GoogleUtilities/Environment + - GoogleUtilities/Privacy + - GoogleUtilities/Network (8.1.0): + - GoogleUtilities/Logger + - "GoogleUtilities/NSData+zlib" + - GoogleUtilities/Privacy + - GoogleUtilities/Reachability + - "GoogleUtilities/NSData+zlib (8.1.0)": + - GoogleUtilities/Privacy + - GoogleUtilities/Privacy (8.1.0) + - GoogleUtilities/Reachability (8.1.0): + - GoogleUtilities/Logger + - GoogleUtilities/Privacy + - GoogleUtilities/UserDefaults (8.1.0): + - GoogleUtilities/Logger + - GoogleUtilities/Privacy + - GTMAppAuth (4.1.1): + - AppAuth/Core (~> 1.7) + - GTMSessionFetcher/Core (< 4.0, >= 3.3) + - GTMSessionFetcher (3.5.0): + - GTMSessionFetcher/Full (= 3.5.0) + - GTMSessionFetcher/Core (3.5.0) + - GTMSessionFetcher/Full (3.5.0): + - GTMSessionFetcher/Core + - local_auth_darwin (0.0.1): + - Flutter + - FlutterMacOS + - nanopb (3.30910.0): + - nanopb/decode (= 3.30910.0) + - nanopb/encode (= 3.30910.0) + - nanopb/decode (3.30910.0) + - nanopb/encode (3.30910.0) + - PromisesObjC (2.4.0) + - PromisesSwift (2.4.0): + - PromisesObjC (= 2.4.0) + - sqflite_darwin (0.0.4): + - Flutter + - FlutterMacOS + - url_launcher_macos (0.0.1): + - FlutterMacOS + +DEPENDENCIES: + - device_info_plus (from `Flutter/ephemeral/.symlinks/plugins/device_info_plus/macos`) + - file_selector_macos (from `Flutter/ephemeral/.symlinks/plugins/file_selector_macos/macos`) + - firebase_core (from `Flutter/ephemeral/.symlinks/plugins/firebase_core/macos`) + - firebase_crashlytics (from `Flutter/ephemeral/.symlinks/plugins/firebase_crashlytics/macos`) + - firebase_messaging (from `Flutter/ephemeral/.symlinks/plugins/firebase_messaging/macos`) + - flutter_image_compress_macos (from `Flutter/ephemeral/.symlinks/plugins/flutter_image_compress_macos/macos`) + - flutter_secure_storage_macos (from `Flutter/ephemeral/.symlinks/plugins/flutter_secure_storage_macos/macos`) + - FlutterMacOS (from `Flutter/ephemeral`) + - google_sign_in_ios (from `Flutter/ephemeral/.symlinks/plugins/google_sign_in_ios/darwin`) + - local_auth_darwin (from `Flutter/ephemeral/.symlinks/plugins/local_auth_darwin/darwin`) + - sqflite_darwin (from `Flutter/ephemeral/.symlinks/plugins/sqflite_darwin/darwin`) + - url_launcher_macos (from `Flutter/ephemeral/.symlinks/plugins/url_launcher_macos/macos`) + +SPEC REPOS: + trunk: + - AppAuth + - AppCheckCore + - Firebase + - FirebaseCore + - FirebaseCoreExtension + - FirebaseCoreInternal + - FirebaseCrashlytics + - FirebaseInstallations + - FirebaseMessaging + - FirebaseRemoteConfigInterop + - FirebaseSessions + - GoogleDataTransport + - GoogleSignIn + - GoogleUtilities + - GTMAppAuth + - GTMSessionFetcher + - nanopb + - PromisesObjC + - PromisesSwift + +EXTERNAL SOURCES: + device_info_plus: + :path: Flutter/ephemeral/.symlinks/plugins/device_info_plus/macos + file_selector_macos: + :path: Flutter/ephemeral/.symlinks/plugins/file_selector_macos/macos + firebase_core: + :path: Flutter/ephemeral/.symlinks/plugins/firebase_core/macos + firebase_crashlytics: + :path: Flutter/ephemeral/.symlinks/plugins/firebase_crashlytics/macos + firebase_messaging: + :path: Flutter/ephemeral/.symlinks/plugins/firebase_messaging/macos + flutter_image_compress_macos: + :path: Flutter/ephemeral/.symlinks/plugins/flutter_image_compress_macos/macos + flutter_secure_storage_macos: + :path: Flutter/ephemeral/.symlinks/plugins/flutter_secure_storage_macos/macos + FlutterMacOS: + :path: Flutter/ephemeral + google_sign_in_ios: + :path: Flutter/ephemeral/.symlinks/plugins/google_sign_in_ios/darwin + local_auth_darwin: + :path: Flutter/ephemeral/.symlinks/plugins/local_auth_darwin/darwin + sqflite_darwin: + :path: Flutter/ephemeral/.symlinks/plugins/sqflite_darwin/darwin + url_launcher_macos: + :path: Flutter/ephemeral/.symlinks/plugins/url_launcher_macos/macos + +SPEC CHECKSUMS: + AppAuth: d4f13a8fe0baf391b2108511793e4b479691fb73 + AppCheckCore: cc8fd0a3a230ddd401f326489c99990b013f0c4f + device_info_plus: 4fb280989f669696856f8b129e4a5e3cd6c48f76 + file_selector_macos: 9e9e068e90ebee155097d00e89ae91edb2374db7 + Firebase: d99ac19b909cd2c548339c2241ecd0d1599ab02e + firebase_core: 7667f880631ae8ad10e3d6567ab7582fe0682326 + firebase_crashlytics: af8dce4a4f3b2b1556bf51043623060a5fc7eca7 + firebase_messaging: df39858bcbbcce792c9e4f1ca51b41123d6181fd + FirebaseCore: efb3893e5b94f32b86e331e3bd6dadf18b66568e + FirebaseCoreExtension: edbd30474b5ccf04e5f001470bdf6ea616af2435 + FirebaseCoreInternal: 9afa45b1159304c963da48addb78275ef701c6b4 + FirebaseCrashlytics: e09d0bc19aa54a51e45b8039c836ef73f32c039a + FirebaseInstallations: 317270fec08a5d418fdbc8429282238cab3ac843 + FirebaseMessaging: 3b26e2cee503815e01c3701236b020aa9b576f09 + FirebaseRemoteConfigInterop: 1c6135e8a094cc6368949f5faeeca7ee8948b8aa + FirebaseSessions: b9a92c1c51bbb81e78fc3142cda6d925d700f8e7 + flutter_image_compress_macos: e68daf54bb4bf2144c580fd4d151c949cbf492f0 + flutter_secure_storage_macos: 7f45e30f838cf2659862a4e4e3ee1c347c2b3b54 + FlutterMacOS: d0db08ddef1a9af05a5ec4b724367152bb0500b1 + google_sign_in_ios: b48bb9af78576358a168361173155596c845f0b9 + GoogleDataTransport: aae35b7ea0c09004c3797d53c8c41f66f219d6a7 + GoogleSignIn: ce8c89bb9b37fb624b92e7514cc67335d1e277e4 + GoogleUtilities: 00c88b9a86066ef77f0da2fab05f65d7768ed8e1 + GTMAppAuth: f69bd07d68cd3b766125f7e072c45d7340dea0de + GTMSessionFetcher: 5aea5ba6bd522a239e236100971f10cb71b96ab6 + local_auth_darwin: c3ee6cce0a8d56be34c8ccb66ba31f7f180aaebb + nanopb: fad817b59e0457d11a5dfbde799381cd727c1275 + PromisesObjC: f5707f49cb48b9636751c5b2e7d227e43fba9f47 + PromisesSwift: 9d77319bbe72ebf6d872900551f7eeba9bce2851 + sqflite_darwin: 20b2a3a3b70e43edae938624ce550a3cbf66a3d0 + url_launcher_macos: f87a979182d112f911de6820aefddaf56ee9fbfd + +PODFILE CHECKSUM: 54d867c82ac51cbd61b565781b9fada492027009 + +COCOAPODS: 1.16.2 diff --git a/siro_admin/macos/Runner.xcodeproj/project.pbxproj b/siro_admin/macos/Runner.xcodeproj/project.pbxproj new file mode 100644 index 0000000..6007140 --- /dev/null +++ b/siro_admin/macos/Runner.xcodeproj/project.pbxproj @@ -0,0 +1,819 @@ +// !$*UTF8*$! +{ + archiveVersion = 1; + classes = { + }; + objectVersion = 54; + objects = { + +/* Begin PBXAggregateTarget section */ + 33CC111A2044C6BA0003C045 /* Flutter Assemble */ = { + isa = PBXAggregateTarget; + buildConfigurationList = 33CC111B2044C6BA0003C045 /* Build configuration list for PBXAggregateTarget "Flutter Assemble" */; + buildPhases = ( + 33CC111E2044C6BF0003C045 /* ShellScript */, + ); + dependencies = ( + ); + name = "Flutter Assemble"; + productName = FLX; + }; +/* End PBXAggregateTarget section */ + +/* Begin PBXBuildFile section */ + 17D3E71566D6F280AC1497ED /* Pods_Runner.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 529702085A98989612EF4B94 /* Pods_Runner.framework */; }; + 331C80D8294CF71000263BE5 /* RunnerTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 331C80D7294CF71000263BE5 /* RunnerTests.swift */; }; + 335BBD1B22A9A15E00E9071D /* GeneratedPluginRegistrant.swift in Sources */ = {isa = PBXBuildFile; fileRef = 335BBD1A22A9A15E00E9071D /* GeneratedPluginRegistrant.swift */; }; + 33CC10F12044A3C60003C045 /* AppDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 33CC10F02044A3C60003C045 /* AppDelegate.swift */; }; + 33CC10F32044A3C60003C045 /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 33CC10F22044A3C60003C045 /* Assets.xcassets */; }; + 33CC10F62044A3C60003C045 /* MainMenu.xib in Resources */ = {isa = PBXBuildFile; fileRef = 33CC10F42044A3C60003C045 /* MainMenu.xib */; }; + 33CC11132044BFA00003C045 /* MainFlutterWindow.swift in Sources */ = {isa = PBXBuildFile; fileRef = 33CC11122044BFA00003C045 /* MainFlutterWindow.swift */; }; + D35F436D72E4B2EDD1E1BBEC /* Pods_RunnerTests.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 4A0BEBB6BD55D52332CA81ED /* Pods_RunnerTests.framework */; }; +/* End PBXBuildFile section */ + +/* Begin PBXContainerItemProxy section */ + 331C80D9294CF71000263BE5 /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = 33CC10E52044A3C60003C045 /* Project object */; + proxyType = 1; + remoteGlobalIDString = 33CC10EC2044A3C60003C045; + remoteInfo = Runner; + }; + 33CC111F2044C79F0003C045 /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = 33CC10E52044A3C60003C045 /* Project object */; + proxyType = 1; + remoteGlobalIDString = 33CC111A2044C6BA0003C045; + remoteInfo = FLX; + }; +/* End PBXContainerItemProxy section */ + +/* Begin PBXCopyFilesBuildPhase section */ + 33CC110E2044A8840003C045 /* Bundle Framework */ = { + isa = PBXCopyFilesBuildPhase; + buildActionMask = 2147483647; + dstPath = ""; + dstSubfolderSpec = 10; + files = ( + ); + name = "Bundle Framework"; + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXCopyFilesBuildPhase section */ + +/* Begin PBXFileReference section */ + 2BE9293BC2E10C9D5F0F08B9 /* Pods-Runner.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.release.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.release.xcconfig"; sourceTree = ""; }; + 331C80D5294CF71000263BE5 /* RunnerTests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = RunnerTests.xctest; sourceTree = BUILT_PRODUCTS_DIR; }; + 331C80D7294CF71000263BE5 /* RunnerTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = RunnerTests.swift; sourceTree = ""; }; + 333000ED22D3DE5D00554162 /* Warnings.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; path = Warnings.xcconfig; sourceTree = ""; }; + 335BBD1A22A9A15E00E9071D /* GeneratedPluginRegistrant.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = GeneratedPluginRegistrant.swift; sourceTree = ""; }; + 33CC10ED2044A3C60003C045 /* intaleq_admin.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = intaleq_admin.app; sourceTree = BUILT_PRODUCTS_DIR; }; + 33CC10F02044A3C60003C045 /* AppDelegate.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AppDelegate.swift; sourceTree = ""; }; + 33CC10F22044A3C60003C045 /* Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; name = Assets.xcassets; path = Runner/Assets.xcassets; sourceTree = ""; }; + 33CC10F52044A3C60003C045 /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.xib; name = Base; path = Base.lproj/MainMenu.xib; sourceTree = ""; }; + 33CC10F72044A3C60003C045 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; name = Info.plist; path = Runner/Info.plist; sourceTree = ""; }; + 33CC11122044BFA00003C045 /* MainFlutterWindow.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MainFlutterWindow.swift; sourceTree = ""; }; + 33CEB47222A05771004F2AC0 /* Flutter-Debug.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; path = "Flutter-Debug.xcconfig"; sourceTree = ""; }; + 33CEB47422A05771004F2AC0 /* Flutter-Release.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; path = "Flutter-Release.xcconfig"; sourceTree = ""; }; + 33CEB47722A0578A004F2AC0 /* Flutter-Generated.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; name = "Flutter-Generated.xcconfig"; path = "ephemeral/Flutter-Generated.xcconfig"; sourceTree = ""; }; + 33E51913231747F40026EE4D /* DebugProfile.entitlements */ = {isa = PBXFileReference; lastKnownFileType = text.plist.entitlements; path = DebugProfile.entitlements; sourceTree = ""; }; + 33E51914231749380026EE4D /* Release.entitlements */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.entitlements; path = Release.entitlements; sourceTree = ""; }; + 33E5194F232828860026EE4D /* AppInfo.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; path = AppInfo.xcconfig; sourceTree = ""; }; + 4A0BEBB6BD55D52332CA81ED /* Pods_RunnerTests.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_RunnerTests.framework; sourceTree = BUILT_PRODUCTS_DIR; }; + 529702085A98989612EF4B94 /* Pods_Runner.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_Runner.framework; sourceTree = BUILT_PRODUCTS_DIR; }; + 57D62622DF9F1AFCA371D456 /* Pods-RunnerTests.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-RunnerTests.release.xcconfig"; path = "Target Support Files/Pods-RunnerTests/Pods-RunnerTests.release.xcconfig"; sourceTree = ""; }; + 693E736CE390D9EAD52093D9 /* Pods-RunnerTests.profile.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-RunnerTests.profile.xcconfig"; path = "Target Support Files/Pods-RunnerTests/Pods-RunnerTests.profile.xcconfig"; sourceTree = ""; }; + 7AFA3C8E1D35360C0083082E /* Release.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; path = Release.xcconfig; sourceTree = ""; }; + 9740EEB21CF90195004384FC /* Debug.xcconfig */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xcconfig; path = Debug.xcconfig; sourceTree = ""; }; + 991BB790141B213D8BF9E75C /* Pods-Runner.profile.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.profile.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.profile.xcconfig"; sourceTree = ""; }; + 996CBF94A18BBCF3EEC882E7 /* Pods-RunnerTests.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-RunnerTests.debug.xcconfig"; path = "Target Support Files/Pods-RunnerTests/Pods-RunnerTests.debug.xcconfig"; sourceTree = ""; }; + AB6DA36D2BAECCF1DC13A82F /* Pods-Runner.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.debug.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.debug.xcconfig"; sourceTree = ""; }; +/* End PBXFileReference section */ + +/* Begin PBXFrameworksBuildPhase section */ + 331C80D2294CF70F00263BE5 /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( + D35F436D72E4B2EDD1E1BBEC /* Pods_RunnerTests.framework in Frameworks */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + 33CC10EA2044A3C60003C045 /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( + 17D3E71566D6F280AC1497ED /* Pods_Runner.framework in Frameworks */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXFrameworksBuildPhase section */ + +/* Begin PBXGroup section */ + 331C80D6294CF71000263BE5 /* RunnerTests */ = { + isa = PBXGroup; + children = ( + 331C80D7294CF71000263BE5 /* RunnerTests.swift */, + ); + path = RunnerTests; + sourceTree = ""; + }; + 33BA886A226E78AF003329D5 /* Configs */ = { + isa = PBXGroup; + children = ( + 33E5194F232828860026EE4D /* AppInfo.xcconfig */, + 9740EEB21CF90195004384FC /* Debug.xcconfig */, + 7AFA3C8E1D35360C0083082E /* Release.xcconfig */, + 333000ED22D3DE5D00554162 /* Warnings.xcconfig */, + ); + path = Configs; + sourceTree = ""; + }; + 33CC10E42044A3C60003C045 = { + isa = PBXGroup; + children = ( + 33FAB671232836740065AC1E /* Runner */, + 33CEB47122A05771004F2AC0 /* Flutter */, + 331C80D6294CF71000263BE5 /* RunnerTests */, + 33CC10EE2044A3C60003C045 /* Products */, + 442C92138252D77B90B180F9 /* Pods */, + 41EA67A3A7FCB1DDADFB314F /* Frameworks */, + ); + sourceTree = ""; + }; + 33CC10EE2044A3C60003C045 /* Products */ = { + isa = PBXGroup; + children = ( + 33CC10ED2044A3C60003C045 /* intaleq_admin.app */, + 331C80D5294CF71000263BE5 /* RunnerTests.xctest */, + ); + name = Products; + sourceTree = ""; + }; + 33CC11242044D66E0003C045 /* Resources */ = { + isa = PBXGroup; + children = ( + 33CC10F22044A3C60003C045 /* Assets.xcassets */, + 33CC10F42044A3C60003C045 /* MainMenu.xib */, + 33CC10F72044A3C60003C045 /* Info.plist */, + ); + name = Resources; + path = ..; + sourceTree = ""; + }; + 33CEB47122A05771004F2AC0 /* Flutter */ = { + isa = PBXGroup; + children = ( + 335BBD1A22A9A15E00E9071D /* GeneratedPluginRegistrant.swift */, + 33CEB47222A05771004F2AC0 /* Flutter-Debug.xcconfig */, + 33CEB47422A05771004F2AC0 /* Flutter-Release.xcconfig */, + 33CEB47722A0578A004F2AC0 /* Flutter-Generated.xcconfig */, + ); + path = Flutter; + sourceTree = ""; + }; + 33FAB671232836740065AC1E /* Runner */ = { + isa = PBXGroup; + children = ( + 33CC10F02044A3C60003C045 /* AppDelegate.swift */, + 33CC11122044BFA00003C045 /* MainFlutterWindow.swift */, + 33E51913231747F40026EE4D /* DebugProfile.entitlements */, + 33E51914231749380026EE4D /* Release.entitlements */, + 33CC11242044D66E0003C045 /* Resources */, + 33BA886A226E78AF003329D5 /* Configs */, + ); + path = Runner; + sourceTree = ""; + }; + 41EA67A3A7FCB1DDADFB314F /* Frameworks */ = { + isa = PBXGroup; + children = ( + 529702085A98989612EF4B94 /* Pods_Runner.framework */, + 4A0BEBB6BD55D52332CA81ED /* Pods_RunnerTests.framework */, + ); + name = Frameworks; + sourceTree = ""; + }; + 442C92138252D77B90B180F9 /* Pods */ = { + isa = PBXGroup; + children = ( + AB6DA36D2BAECCF1DC13A82F /* Pods-Runner.debug.xcconfig */, + 2BE9293BC2E10C9D5F0F08B9 /* Pods-Runner.release.xcconfig */, + 991BB790141B213D8BF9E75C /* Pods-Runner.profile.xcconfig */, + 996CBF94A18BBCF3EEC882E7 /* Pods-RunnerTests.debug.xcconfig */, + 57D62622DF9F1AFCA371D456 /* Pods-RunnerTests.release.xcconfig */, + 693E736CE390D9EAD52093D9 /* Pods-RunnerTests.profile.xcconfig */, + ); + name = Pods; + path = Pods; + sourceTree = ""; + }; +/* End PBXGroup section */ + +/* Begin PBXNativeTarget section */ + 331C80D4294CF70F00263BE5 /* RunnerTests */ = { + isa = PBXNativeTarget; + buildConfigurationList = 331C80DE294CF71000263BE5 /* Build configuration list for PBXNativeTarget "RunnerTests" */; + buildPhases = ( + FF11494ED183929E30BE29BC /* [CP] Check Pods Manifest.lock */, + 331C80D1294CF70F00263BE5 /* Sources */, + 331C80D2294CF70F00263BE5 /* Frameworks */, + 331C80D3294CF70F00263BE5 /* Resources */, + ); + buildRules = ( + ); + dependencies = ( + 331C80DA294CF71000263BE5 /* PBXTargetDependency */, + ); + name = RunnerTests; + productName = RunnerTests; + productReference = 331C80D5294CF71000263BE5 /* RunnerTests.xctest */; + productType = "com.apple.product-type.bundle.unit-test"; + }; + 33CC10EC2044A3C60003C045 /* Runner */ = { + isa = PBXNativeTarget; + buildConfigurationList = 33CC10FB2044A3C60003C045 /* Build configuration list for PBXNativeTarget "Runner" */; + buildPhases = ( + 5B019689435FA2B04EF137C6 /* [CP] Check Pods Manifest.lock */, + 33CC10E92044A3C60003C045 /* Sources */, + 33CC10EA2044A3C60003C045 /* Frameworks */, + 33CC10EB2044A3C60003C045 /* Resources */, + 33CC110E2044A8840003C045 /* Bundle Framework */, + 3399D490228B24CF009A79C7 /* ShellScript */, + 3FC083AA4C1F1997BBCE63BC /* [CP] Embed Pods Frameworks */, + 89800430F081423EB842813E /* [CP] Copy Pods Resources */, + ); + buildRules = ( + ); + dependencies = ( + 33CC11202044C79F0003C045 /* PBXTargetDependency */, + ); + name = Runner; + productName = Runner; + productReference = 33CC10ED2044A3C60003C045 /* intaleq_admin.app */; + productType = "com.apple.product-type.application"; + }; +/* End PBXNativeTarget section */ + +/* Begin PBXProject section */ + 33CC10E52044A3C60003C045 /* Project object */ = { + isa = PBXProject; + attributes = { + BuildIndependentTargetsInParallel = YES; + LastSwiftUpdateCheck = 0920; + LastUpgradeCheck = 1510; + ORGANIZATIONNAME = ""; + TargetAttributes = { + 331C80D4294CF70F00263BE5 = { + CreatedOnToolsVersion = 14.0; + TestTargetID = 33CC10EC2044A3C60003C045; + }; + 33CC10EC2044A3C60003C045 = { + CreatedOnToolsVersion = 9.2; + LastSwiftMigration = 1100; + ProvisioningStyle = Automatic; + SystemCapabilities = { + com.apple.Sandbox = { + enabled = 1; + }; + }; + }; + 33CC111A2044C6BA0003C045 = { + CreatedOnToolsVersion = 9.2; + ProvisioningStyle = Manual; + }; + }; + }; + buildConfigurationList = 33CC10E82044A3C60003C045 /* Build configuration list for PBXProject "Runner" */; + compatibilityVersion = "Xcode 9.3"; + developmentRegion = en; + hasScannedForEncodings = 0; + knownRegions = ( + en, + Base, + ); + mainGroup = 33CC10E42044A3C60003C045; + productRefGroup = 33CC10EE2044A3C60003C045 /* Products */; + projectDirPath = ""; + projectRoot = ""; + targets = ( + 33CC10EC2044A3C60003C045 /* Runner */, + 331C80D4294CF70F00263BE5 /* RunnerTests */, + 33CC111A2044C6BA0003C045 /* Flutter Assemble */, + ); + }; +/* End PBXProject section */ + +/* Begin PBXResourcesBuildPhase section */ + 331C80D3294CF70F00263BE5 /* Resources */ = { + isa = PBXResourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + runOnlyForDeploymentPostprocessing = 0; + }; + 33CC10EB2044A3C60003C045 /* Resources */ = { + isa = PBXResourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + 33CC10F32044A3C60003C045 /* Assets.xcassets in Resources */, + 33CC10F62044A3C60003C045 /* MainMenu.xib in Resources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXResourcesBuildPhase section */ + +/* Begin PBXShellScriptBuildPhase section */ + 3399D490228B24CF009A79C7 /* ShellScript */ = { + isa = PBXShellScriptBuildPhase; + alwaysOutOfDate = 1; + buildActionMask = 2147483647; + files = ( + ); + inputFileListPaths = ( + ); + inputPaths = ( + ); + outputFileListPaths = ( + ); + outputPaths = ( + ); + runOnlyForDeploymentPostprocessing = 0; + shellPath = /bin/sh; + shellScript = "echo \"$PRODUCT_NAME.app\" > \"$PROJECT_DIR\"/Flutter/ephemeral/.app_filename && \"$FLUTTER_ROOT\"/packages/flutter_tools/bin/macos_assemble.sh embed\n"; + }; + 33CC111E2044C6BF0003C045 /* ShellScript */ = { + isa = PBXShellScriptBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + inputFileListPaths = ( + Flutter/ephemeral/FlutterInputs.xcfilelist, + ); + inputPaths = ( + Flutter/ephemeral/tripwire, + ); + outputFileListPaths = ( + Flutter/ephemeral/FlutterOutputs.xcfilelist, + ); + outputPaths = ( + ); + runOnlyForDeploymentPostprocessing = 0; + shellPath = /bin/sh; + shellScript = "\"$FLUTTER_ROOT\"/packages/flutter_tools/bin/macos_assemble.sh && touch Flutter/ephemeral/tripwire"; + }; + 3FC083AA4C1F1997BBCE63BC /* [CP] Embed Pods Frameworks */ = { + isa = PBXShellScriptBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + inputFileListPaths = ( + "${PODS_ROOT}/Target Support Files/Pods-Runner/Pods-Runner-frameworks-${CONFIGURATION}-input-files.xcfilelist", + ); + name = "[CP] Embed Pods Frameworks"; + outputFileListPaths = ( + "${PODS_ROOT}/Target Support Files/Pods-Runner/Pods-Runner-frameworks-${CONFIGURATION}-output-files.xcfilelist", + ); + runOnlyForDeploymentPostprocessing = 0; + shellPath = /bin/sh; + shellScript = "\"${PODS_ROOT}/Target Support Files/Pods-Runner/Pods-Runner-frameworks.sh\"\n"; + showEnvVarsInLog = 0; + }; + 5B019689435FA2B04EF137C6 /* [CP] Check Pods Manifest.lock */ = { + isa = PBXShellScriptBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + inputFileListPaths = ( + ); + inputPaths = ( + "${PODS_PODFILE_DIR_PATH}/Podfile.lock", + "${PODS_ROOT}/Manifest.lock", + ); + name = "[CP] Check Pods Manifest.lock"; + outputFileListPaths = ( + ); + outputPaths = ( + "$(DERIVED_FILE_DIR)/Pods-Runner-checkManifestLockResult.txt", + ); + runOnlyForDeploymentPostprocessing = 0; + shellPath = /bin/sh; + shellScript = "diff \"${PODS_PODFILE_DIR_PATH}/Podfile.lock\" \"${PODS_ROOT}/Manifest.lock\" > /dev/null\nif [ $? != 0 ] ; then\n # print error to STDERR\n echo \"error: The sandbox is not in sync with the Podfile.lock. Run 'pod install' or update your CocoaPods installation.\" >&2\n exit 1\nfi\n# This output is used by Xcode 'outputs' to avoid re-running this script phase.\necho \"SUCCESS\" > \"${SCRIPT_OUTPUT_FILE_0}\"\n"; + showEnvVarsInLog = 0; + }; + 89800430F081423EB842813E /* [CP] Copy Pods Resources */ = { + isa = PBXShellScriptBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + inputFileListPaths = ( + "${PODS_ROOT}/Target Support Files/Pods-Runner/Pods-Runner-resources-${CONFIGURATION}-input-files.xcfilelist", + ); + name = "[CP] Copy Pods Resources"; + outputFileListPaths = ( + "${PODS_ROOT}/Target Support Files/Pods-Runner/Pods-Runner-resources-${CONFIGURATION}-output-files.xcfilelist", + ); + runOnlyForDeploymentPostprocessing = 0; + shellPath = /bin/sh; + shellScript = "\"${PODS_ROOT}/Target Support Files/Pods-Runner/Pods-Runner-resources.sh\"\n"; + showEnvVarsInLog = 0; + }; + FF11494ED183929E30BE29BC /* [CP] Check Pods Manifest.lock */ = { + isa = PBXShellScriptBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + inputFileListPaths = ( + ); + inputPaths = ( + "${PODS_PODFILE_DIR_PATH}/Podfile.lock", + "${PODS_ROOT}/Manifest.lock", + ); + name = "[CP] Check Pods Manifest.lock"; + outputFileListPaths = ( + ); + outputPaths = ( + "$(DERIVED_FILE_DIR)/Pods-RunnerTests-checkManifestLockResult.txt", + ); + runOnlyForDeploymentPostprocessing = 0; + shellPath = /bin/sh; + shellScript = "diff \"${PODS_PODFILE_DIR_PATH}/Podfile.lock\" \"${PODS_ROOT}/Manifest.lock\" > /dev/null\nif [ $? != 0 ] ; then\n # print error to STDERR\n echo \"error: The sandbox is not in sync with the Podfile.lock. Run 'pod install' or update your CocoaPods installation.\" >&2\n exit 1\nfi\n# This output is used by Xcode 'outputs' to avoid re-running this script phase.\necho \"SUCCESS\" > \"${SCRIPT_OUTPUT_FILE_0}\"\n"; + showEnvVarsInLog = 0; + }; +/* End PBXShellScriptBuildPhase section */ + +/* Begin PBXSourcesBuildPhase section */ + 331C80D1294CF70F00263BE5 /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + 331C80D8294CF71000263BE5 /* RunnerTests.swift in Sources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + 33CC10E92044A3C60003C045 /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + 33CC11132044BFA00003C045 /* MainFlutterWindow.swift in Sources */, + 33CC10F12044A3C60003C045 /* AppDelegate.swift in Sources */, + 335BBD1B22A9A15E00E9071D /* GeneratedPluginRegistrant.swift in Sources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXSourcesBuildPhase section */ + +/* Begin PBXTargetDependency section */ + 331C80DA294CF71000263BE5 /* PBXTargetDependency */ = { + isa = PBXTargetDependency; + target = 33CC10EC2044A3C60003C045 /* Runner */; + targetProxy = 331C80D9294CF71000263BE5 /* PBXContainerItemProxy */; + }; + 33CC11202044C79F0003C045 /* PBXTargetDependency */ = { + isa = PBXTargetDependency; + target = 33CC111A2044C6BA0003C045 /* Flutter Assemble */; + targetProxy = 33CC111F2044C79F0003C045 /* PBXContainerItemProxy */; + }; +/* End PBXTargetDependency section */ + +/* Begin PBXVariantGroup section */ + 33CC10F42044A3C60003C045 /* MainMenu.xib */ = { + isa = PBXVariantGroup; + children = ( + 33CC10F52044A3C60003C045 /* Base */, + ); + name = MainMenu.xib; + path = Runner; + sourceTree = ""; + }; +/* End PBXVariantGroup section */ + +/* Begin XCBuildConfiguration section */ + 331C80DB294CF71000263BE5 /* Debug */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = 996CBF94A18BBCF3EEC882E7 /* Pods-RunnerTests.debug.xcconfig */; + buildSettings = { + BUNDLE_LOADER = "$(TEST_HOST)"; + CURRENT_PROJECT_VERSION = 1; + GENERATE_INFOPLIST_FILE = YES; + MARKETING_VERSION = 1.0; + PRODUCT_BUNDLE_IDENTIFIER = com.intaleq.intaleqAdmin.RunnerTests; + PRODUCT_NAME = "$(TARGET_NAME)"; + SWIFT_VERSION = 5.0; + TEST_HOST = "$(BUILT_PRODUCTS_DIR)/intaleq_admin.app/$(BUNDLE_EXECUTABLE_FOLDER_PATH)/intaleq_admin"; + }; + name = Debug; + }; + 331C80DC294CF71000263BE5 /* Release */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = 57D62622DF9F1AFCA371D456 /* Pods-RunnerTests.release.xcconfig */; + buildSettings = { + BUNDLE_LOADER = "$(TEST_HOST)"; + CURRENT_PROJECT_VERSION = 1; + GENERATE_INFOPLIST_FILE = YES; + MARKETING_VERSION = 1.0; + PRODUCT_BUNDLE_IDENTIFIER = com.intaleq.intaleqAdmin.RunnerTests; + PRODUCT_NAME = "$(TARGET_NAME)"; + SWIFT_VERSION = 5.0; + TEST_HOST = "$(BUILT_PRODUCTS_DIR)/intaleq_admin.app/$(BUNDLE_EXECUTABLE_FOLDER_PATH)/intaleq_admin"; + }; + name = Release; + }; + 331C80DD294CF71000263BE5 /* Profile */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = 693E736CE390D9EAD52093D9 /* Pods-RunnerTests.profile.xcconfig */; + buildSettings = { + BUNDLE_LOADER = "$(TEST_HOST)"; + CURRENT_PROJECT_VERSION = 1; + GENERATE_INFOPLIST_FILE = YES; + MARKETING_VERSION = 1.0; + PRODUCT_BUNDLE_IDENTIFIER = com.intaleq.intaleqAdmin.RunnerTests; + PRODUCT_NAME = "$(TARGET_NAME)"; + SWIFT_VERSION = 5.0; + TEST_HOST = "$(BUILT_PRODUCTS_DIR)/intaleq_admin.app/$(BUNDLE_EXECUTABLE_FOLDER_PATH)/intaleq_admin"; + }; + name = Profile; + }; + 338D0CE9231458BD00FA5F75 /* Profile */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = 7AFA3C8E1D35360C0083082E /* Release.xcconfig */; + buildSettings = { + ALWAYS_SEARCH_USER_PATHS = NO; + ASSETCATALOG_COMPILER_GENERATE_SWIFT_ASSET_SYMBOL_EXTENSIONS = YES; + CLANG_ANALYZER_NONNULL = YES; + CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE; + CLANG_CXX_LANGUAGE_STANDARD = "gnu++14"; + CLANG_CXX_LIBRARY = "libc++"; + CLANG_ENABLE_MODULES = YES; + CLANG_ENABLE_OBJC_ARC = YES; + CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; + CLANG_WARN_BOOL_CONVERSION = YES; + CLANG_WARN_CONSTANT_CONVERSION = YES; + CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; + CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; + CLANG_WARN_DOCUMENTATION_COMMENTS = YES; + CLANG_WARN_EMPTY_BODY = YES; + CLANG_WARN_ENUM_CONVERSION = YES; + CLANG_WARN_INFINITE_RECURSION = YES; + CLANG_WARN_INT_CONVERSION = YES; + CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; + CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; + CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; + CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; + CLANG_WARN_SUSPICIOUS_MOVE = YES; + CODE_SIGN_IDENTITY = "-"; + COPY_PHASE_STRIP = NO; + DEAD_CODE_STRIPPING = YES; + DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; + ENABLE_NS_ASSERTIONS = NO; + ENABLE_STRICT_OBJC_MSGSEND = YES; + ENABLE_USER_SCRIPT_SANDBOXING = NO; + GCC_C_LANGUAGE_STANDARD = gnu11; + GCC_NO_COMMON_BLOCKS = YES; + GCC_WARN_64_TO_32_BIT_CONVERSION = YES; + GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; + GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; + GCC_WARN_UNUSED_FUNCTION = YES; + GCC_WARN_UNUSED_VARIABLE = YES; + MACOSX_DEPLOYMENT_TARGET = 10.15; + MTL_ENABLE_DEBUG_INFO = NO; + SDKROOT = macosx; + SWIFT_COMPILATION_MODE = wholemodule; + SWIFT_OPTIMIZATION_LEVEL = "-O"; + }; + name = Profile; + }; + 338D0CEA231458BD00FA5F75 /* Profile */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = 33E5194F232828860026EE4D /* AppInfo.xcconfig */; + buildSettings = { + ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; + CLANG_ENABLE_MODULES = YES; + CODE_SIGN_ENTITLEMENTS = Runner/DebugProfile.entitlements; + CODE_SIGN_STYLE = Automatic; + COMBINE_HIDPI_IMAGES = YES; + INFOPLIST_FILE = Runner/Info.plist; + LD_RUNPATH_SEARCH_PATHS = ( + "$(inherited)", + "@executable_path/../Frameworks", + ); + PROVISIONING_PROFILE_SPECIFIER = ""; + SWIFT_VERSION = 5.0; + }; + name = Profile; + }; + 338D0CEB231458BD00FA5F75 /* Profile */ = { + isa = XCBuildConfiguration; + buildSettings = { + CODE_SIGN_STYLE = Manual; + PRODUCT_NAME = "$(TARGET_NAME)"; + }; + name = Profile; + }; + 33CC10F92044A3C60003C045 /* Debug */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = 9740EEB21CF90195004384FC /* Debug.xcconfig */; + buildSettings = { + ALWAYS_SEARCH_USER_PATHS = NO; + ASSETCATALOG_COMPILER_GENERATE_SWIFT_ASSET_SYMBOL_EXTENSIONS = YES; + CLANG_ANALYZER_NONNULL = YES; + CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE; + CLANG_CXX_LANGUAGE_STANDARD = "gnu++14"; + CLANG_CXX_LIBRARY = "libc++"; + CLANG_ENABLE_MODULES = YES; + CLANG_ENABLE_OBJC_ARC = YES; + CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; + CLANG_WARN_BOOL_CONVERSION = YES; + CLANG_WARN_CONSTANT_CONVERSION = YES; + CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; + CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; + CLANG_WARN_DOCUMENTATION_COMMENTS = YES; + CLANG_WARN_EMPTY_BODY = YES; + CLANG_WARN_ENUM_CONVERSION = YES; + CLANG_WARN_INFINITE_RECURSION = YES; + CLANG_WARN_INT_CONVERSION = YES; + CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; + CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; + CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; + CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; + CLANG_WARN_SUSPICIOUS_MOVE = YES; + CODE_SIGN_IDENTITY = "-"; + COPY_PHASE_STRIP = NO; + DEAD_CODE_STRIPPING = YES; + DEBUG_INFORMATION_FORMAT = dwarf; + ENABLE_STRICT_OBJC_MSGSEND = YES; + ENABLE_TESTABILITY = YES; + ENABLE_USER_SCRIPT_SANDBOXING = NO; + GCC_C_LANGUAGE_STANDARD = gnu11; + GCC_DYNAMIC_NO_PIC = NO; + GCC_NO_COMMON_BLOCKS = YES; + GCC_OPTIMIZATION_LEVEL = 0; + GCC_PREPROCESSOR_DEFINITIONS = ( + "DEBUG=1", + "$(inherited)", + ); + GCC_WARN_64_TO_32_BIT_CONVERSION = YES; + GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; + GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; + GCC_WARN_UNUSED_FUNCTION = YES; + GCC_WARN_UNUSED_VARIABLE = YES; + MACOSX_DEPLOYMENT_TARGET = 10.15; + MTL_ENABLE_DEBUG_INFO = YES; + ONLY_ACTIVE_ARCH = YES; + SDKROOT = macosx; + SWIFT_ACTIVE_COMPILATION_CONDITIONS = DEBUG; + SWIFT_OPTIMIZATION_LEVEL = "-Onone"; + }; + name = Debug; + }; + 33CC10FA2044A3C60003C045 /* Release */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = 7AFA3C8E1D35360C0083082E /* Release.xcconfig */; + buildSettings = { + ALWAYS_SEARCH_USER_PATHS = NO; + ASSETCATALOG_COMPILER_GENERATE_SWIFT_ASSET_SYMBOL_EXTENSIONS = YES; + CLANG_ANALYZER_NONNULL = YES; + CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE; + CLANG_CXX_LANGUAGE_STANDARD = "gnu++14"; + CLANG_CXX_LIBRARY = "libc++"; + CLANG_ENABLE_MODULES = YES; + CLANG_ENABLE_OBJC_ARC = YES; + CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; + CLANG_WARN_BOOL_CONVERSION = YES; + CLANG_WARN_CONSTANT_CONVERSION = YES; + CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; + CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; + CLANG_WARN_DOCUMENTATION_COMMENTS = YES; + CLANG_WARN_EMPTY_BODY = YES; + CLANG_WARN_ENUM_CONVERSION = YES; + CLANG_WARN_INFINITE_RECURSION = YES; + CLANG_WARN_INT_CONVERSION = YES; + CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; + CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; + CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; + CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; + CLANG_WARN_SUSPICIOUS_MOVE = YES; + CODE_SIGN_IDENTITY = "-"; + COPY_PHASE_STRIP = NO; + DEAD_CODE_STRIPPING = YES; + DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; + ENABLE_NS_ASSERTIONS = NO; + ENABLE_STRICT_OBJC_MSGSEND = YES; + ENABLE_USER_SCRIPT_SANDBOXING = NO; + GCC_C_LANGUAGE_STANDARD = gnu11; + GCC_NO_COMMON_BLOCKS = YES; + GCC_WARN_64_TO_32_BIT_CONVERSION = YES; + GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; + GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; + GCC_WARN_UNUSED_FUNCTION = YES; + GCC_WARN_UNUSED_VARIABLE = YES; + MACOSX_DEPLOYMENT_TARGET = 10.15; + MTL_ENABLE_DEBUG_INFO = NO; + SDKROOT = macosx; + SWIFT_COMPILATION_MODE = wholemodule; + SWIFT_OPTIMIZATION_LEVEL = "-O"; + }; + name = Release; + }; + 33CC10FC2044A3C60003C045 /* Debug */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = 33E5194F232828860026EE4D /* AppInfo.xcconfig */; + buildSettings = { + ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; + CLANG_ENABLE_MODULES = YES; + CODE_SIGN_ENTITLEMENTS = Runner/DebugProfile.entitlements; + CODE_SIGN_STYLE = Automatic; + COMBINE_HIDPI_IMAGES = YES; + INFOPLIST_FILE = Runner/Info.plist; + LD_RUNPATH_SEARCH_PATHS = ( + "$(inherited)", + "@executable_path/../Frameworks", + ); + PROVISIONING_PROFILE_SPECIFIER = ""; + SWIFT_OPTIMIZATION_LEVEL = "-Onone"; + SWIFT_VERSION = 5.0; + }; + name = Debug; + }; + 33CC10FD2044A3C60003C045 /* Release */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = 33E5194F232828860026EE4D /* AppInfo.xcconfig */; + buildSettings = { + ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; + CLANG_ENABLE_MODULES = YES; + CODE_SIGN_ENTITLEMENTS = Runner/Release.entitlements; + CODE_SIGN_STYLE = Automatic; + COMBINE_HIDPI_IMAGES = YES; + INFOPLIST_FILE = Runner/Info.plist; + LD_RUNPATH_SEARCH_PATHS = ( + "$(inherited)", + "@executable_path/../Frameworks", + ); + PROVISIONING_PROFILE_SPECIFIER = ""; + SWIFT_VERSION = 5.0; + }; + name = Release; + }; + 33CC111C2044C6BA0003C045 /* Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + CODE_SIGN_STYLE = Manual; + PRODUCT_NAME = "$(TARGET_NAME)"; + }; + name = Debug; + }; + 33CC111D2044C6BA0003C045 /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + CODE_SIGN_STYLE = Automatic; + PRODUCT_NAME = "$(TARGET_NAME)"; + }; + name = Release; + }; +/* End XCBuildConfiguration section */ + +/* Begin XCConfigurationList section */ + 331C80DE294CF71000263BE5 /* Build configuration list for PBXNativeTarget "RunnerTests" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 331C80DB294CF71000263BE5 /* Debug */, + 331C80DC294CF71000263BE5 /* Release */, + 331C80DD294CF71000263BE5 /* Profile */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; + 33CC10E82044A3C60003C045 /* Build configuration list for PBXProject "Runner" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 33CC10F92044A3C60003C045 /* Debug */, + 33CC10FA2044A3C60003C045 /* Release */, + 338D0CE9231458BD00FA5F75 /* Profile */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; + 33CC10FB2044A3C60003C045 /* Build configuration list for PBXNativeTarget "Runner" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 33CC10FC2044A3C60003C045 /* Debug */, + 33CC10FD2044A3C60003C045 /* Release */, + 338D0CEA231458BD00FA5F75 /* Profile */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; + 33CC111B2044C6BA0003C045 /* Build configuration list for PBXAggregateTarget "Flutter Assemble" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 33CC111C2044C6BA0003C045 /* Debug */, + 33CC111D2044C6BA0003C045 /* Release */, + 338D0CEB231458BD00FA5F75 /* Profile */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; +/* End XCConfigurationList section */ + }; + rootObject = 33CC10E52044A3C60003C045 /* Project object */; +} diff --git a/siro_admin/macos/Runner.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist b/siro_admin/macos/Runner.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist new file mode 100644 index 0000000..18d9810 --- /dev/null +++ b/siro_admin/macos/Runner.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist @@ -0,0 +1,8 @@ + + + + + IDEDidComputeMac32BitWarning + + + diff --git a/siro_admin/macos/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme b/siro_admin/macos/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme new file mode 100644 index 0000000..28976d2 --- /dev/null +++ b/siro_admin/macos/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme @@ -0,0 +1,99 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/siro_admin/macos/Runner.xcworkspace/contents.xcworkspacedata b/siro_admin/macos/Runner.xcworkspace/contents.xcworkspacedata new file mode 100644 index 0000000..21a3cc1 --- /dev/null +++ b/siro_admin/macos/Runner.xcworkspace/contents.xcworkspacedata @@ -0,0 +1,10 @@ + + + + + + + diff --git a/siro_admin/macos/Runner.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist b/siro_admin/macos/Runner.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist new file mode 100644 index 0000000..18d9810 --- /dev/null +++ b/siro_admin/macos/Runner.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist @@ -0,0 +1,8 @@ + + + + + IDEDidComputeMac32BitWarning + + + diff --git a/siro_admin/macos/Runner/AppDelegate.swift b/siro_admin/macos/Runner/AppDelegate.swift new file mode 100644 index 0000000..b3c1761 --- /dev/null +++ b/siro_admin/macos/Runner/AppDelegate.swift @@ -0,0 +1,13 @@ +import Cocoa +import FlutterMacOS + +@main +class AppDelegate: FlutterAppDelegate { + override func applicationShouldTerminateAfterLastWindowClosed(_ sender: NSApplication) -> Bool { + return true + } + + override func applicationSupportsSecureRestorableState(_ app: NSApplication) -> Bool { + return true + } +} diff --git a/siro_admin/macos/Runner/Assets.xcassets/AppIcon.appiconset/Contents.json b/siro_admin/macos/Runner/Assets.xcassets/AppIcon.appiconset/Contents.json new file mode 100644 index 0000000..96d3fee --- /dev/null +++ b/siro_admin/macos/Runner/Assets.xcassets/AppIcon.appiconset/Contents.json @@ -0,0 +1,68 @@ +{ + "info": { + "version": 1, + "author": "xcode" + }, + "images": [ + { + "size": "16x16", + "idiom": "mac", + "filename": "app_icon_16.png", + "scale": "1x" + }, + { + "size": "16x16", + "idiom": "mac", + "filename": "app_icon_32.png", + "scale": "2x" + }, + { + "size": "32x32", + "idiom": "mac", + "filename": "app_icon_32.png", + "scale": "1x" + }, + { + "size": "32x32", + "idiom": "mac", + "filename": "app_icon_64.png", + "scale": "2x" + }, + { + "size": "128x128", + "idiom": "mac", + "filename": "app_icon_128.png", + "scale": "1x" + }, + { + "size": "128x128", + "idiom": "mac", + "filename": "app_icon_256.png", + "scale": "2x" + }, + { + "size": "256x256", + "idiom": "mac", + "filename": "app_icon_256.png", + "scale": "1x" + }, + { + "size": "256x256", + "idiom": "mac", + "filename": "app_icon_512.png", + "scale": "2x" + }, + { + "size": "512x512", + "idiom": "mac", + "filename": "app_icon_512.png", + "scale": "1x" + }, + { + "size": "512x512", + "idiom": "mac", + "filename": "app_icon_1024.png", + "scale": "2x" + } + ] +} \ No newline at end of file diff --git a/siro_admin/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_1024.png b/siro_admin/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_1024.png new file mode 100644 index 0000000..c424645 Binary files /dev/null and b/siro_admin/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_1024.png differ diff --git a/siro_admin/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_128.png b/siro_admin/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_128.png new file mode 100644 index 0000000..6e5933f Binary files /dev/null and b/siro_admin/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_128.png differ diff --git a/siro_admin/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_16.png b/siro_admin/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_16.png new file mode 100644 index 0000000..4c01f50 Binary files /dev/null and b/siro_admin/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_16.png differ diff --git a/siro_admin/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_256.png b/siro_admin/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_256.png new file mode 100644 index 0000000..353b935 Binary files /dev/null and b/siro_admin/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_256.png differ diff --git a/siro_admin/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_32.png b/siro_admin/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_32.png new file mode 100644 index 0000000..7fe5fea Binary files /dev/null and b/siro_admin/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_32.png differ diff --git a/siro_admin/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_512.png b/siro_admin/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_512.png new file mode 100644 index 0000000..d5bf6f5 Binary files /dev/null and b/siro_admin/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_512.png differ diff --git a/siro_admin/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_64.png b/siro_admin/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_64.png new file mode 100644 index 0000000..39777d2 Binary files /dev/null and b/siro_admin/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_64.png differ diff --git a/siro_admin/macos/Runner/Base.lproj/MainMenu.xib b/siro_admin/macos/Runner/Base.lproj/MainMenu.xib new file mode 100644 index 0000000..80e867a --- /dev/null +++ b/siro_admin/macos/Runner/Base.lproj/MainMenu.xib @@ -0,0 +1,343 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/siro_admin/macos/Runner/Configs/AppInfo.xcconfig b/siro_admin/macos/Runner/Configs/AppInfo.xcconfig new file mode 100644 index 0000000..ef91d25 --- /dev/null +++ b/siro_admin/macos/Runner/Configs/AppInfo.xcconfig @@ -0,0 +1,14 @@ +// Application-level settings for the Runner target. +// +// This may be replaced with something auto-generated from metadata (e.g., pubspec.yaml) in the +// future. If not, the values below would default to using the project name when this becomes a +// 'flutter create' template. + +// The application's name. By default this is also the title of the Flutter window. +PRODUCT_NAME = intaleq_admin + +// The application's bundle identifier +PRODUCT_BUNDLE_IDENTIFIER = com.intaleq.intaleqAdmin + +// The copyright displayed in application information +PRODUCT_COPYRIGHT = Copyright © 2025 com.intaleq. All rights reserved. diff --git a/siro_admin/macos/Runner/Configs/Debug.xcconfig b/siro_admin/macos/Runner/Configs/Debug.xcconfig new file mode 100644 index 0000000..36b0fd9 --- /dev/null +++ b/siro_admin/macos/Runner/Configs/Debug.xcconfig @@ -0,0 +1,2 @@ +#include "../../Flutter/Flutter-Debug.xcconfig" +#include "Warnings.xcconfig" diff --git a/siro_admin/macos/Runner/Configs/Release.xcconfig b/siro_admin/macos/Runner/Configs/Release.xcconfig new file mode 100644 index 0000000..dff4f49 --- /dev/null +++ b/siro_admin/macos/Runner/Configs/Release.xcconfig @@ -0,0 +1,2 @@ +#include "../../Flutter/Flutter-Release.xcconfig" +#include "Warnings.xcconfig" diff --git a/siro_admin/macos/Runner/Configs/Warnings.xcconfig b/siro_admin/macos/Runner/Configs/Warnings.xcconfig new file mode 100644 index 0000000..42bcbf4 --- /dev/null +++ b/siro_admin/macos/Runner/Configs/Warnings.xcconfig @@ -0,0 +1,13 @@ +WARNING_CFLAGS = -Wall -Wconditional-uninitialized -Wnullable-to-nonnull-conversion -Wmissing-method-return-type -Woverlength-strings +GCC_WARN_UNDECLARED_SELECTOR = YES +CLANG_UNDEFINED_BEHAVIOR_SANITIZER_NULLABILITY = YES +CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE +CLANG_WARN__DUPLICATE_METHOD_MATCH = YES +CLANG_WARN_PRAGMA_PACK = YES +CLANG_WARN_STRICT_PROTOTYPES = YES +CLANG_WARN_COMMA = YES +GCC_WARN_STRICT_SELECTOR_MATCH = YES +CLANG_WARN_OBJC_REPEATED_USE_OF_WEAK = YES +CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES +GCC_WARN_SHADOW = YES +CLANG_WARN_UNREACHABLE_CODE = YES diff --git a/siro_admin/macos/Runner/DebugProfile.entitlements b/siro_admin/macos/Runner/DebugProfile.entitlements new file mode 100644 index 0000000..5ca7d15 --- /dev/null +++ b/siro_admin/macos/Runner/DebugProfile.entitlements @@ -0,0 +1,12 @@ + + + + + com.apple.security.app-sandbox + + com.apple.security.network.client + + com.apple.security.network.server + + + \ No newline at end of file diff --git a/siro_admin/macos/Runner/Info.plist b/siro_admin/macos/Runner/Info.plist new file mode 100644 index 0000000..a62dce0 --- /dev/null +++ b/siro_admin/macos/Runner/Info.plist @@ -0,0 +1,34 @@ + + + + + com.apple.security.network.client + + CFBundleDevelopmentRegion + $(DEVELOPMENT_LANGUAGE) + CFBundleExecutable + $(EXECUTABLE_NAME) + CFBundleIconFile + + CFBundleIdentifier + $(PRODUCT_BUNDLE_IDENTIFIER) + CFBundleInfoDictionaryVersion + 6.0 + CFBundleName + $(PRODUCT_NAME) + CFBundlePackageType + APPL + CFBundleShortVersionString + $(FLUTTER_BUILD_NAME) + CFBundleVersion + $(FLUTTER_BUILD_NUMBER) + LSMinimumSystemVersion + $(MACOSX_DEPLOYMENT_TARGET) + NSHumanReadableCopyright + $(PRODUCT_COPYRIGHT) + NSMainNibFile + MainMenu + NSPrincipalClass + NSApplication + + \ No newline at end of file diff --git a/siro_admin/macos/Runner/MainFlutterWindow.swift b/siro_admin/macos/Runner/MainFlutterWindow.swift new file mode 100644 index 0000000..3cc05eb --- /dev/null +++ b/siro_admin/macos/Runner/MainFlutterWindow.swift @@ -0,0 +1,15 @@ +import Cocoa +import FlutterMacOS + +class MainFlutterWindow: NSWindow { + override func awakeFromNib() { + let flutterViewController = FlutterViewController() + let windowFrame = self.frame + self.contentViewController = flutterViewController + self.setFrame(windowFrame, display: true) + + RegisterGeneratedPlugins(registry: flutterViewController) + + super.awakeFromNib() + } +} diff --git a/siro_admin/macos/Runner/Release.entitlements b/siro_admin/macos/Runner/Release.entitlements new file mode 100644 index 0000000..4e40553 --- /dev/null +++ b/siro_admin/macos/Runner/Release.entitlements @@ -0,0 +1,10 @@ + + + + + com.apple.security.app-sandbox + + com.apple.security.network.client + + + \ No newline at end of file diff --git a/siro_admin/macos/RunnerTests/RunnerTests.swift b/siro_admin/macos/RunnerTests/RunnerTests.swift new file mode 100644 index 0000000..61f3bd1 --- /dev/null +++ b/siro_admin/macos/RunnerTests/RunnerTests.swift @@ -0,0 +1,12 @@ +import Cocoa +import FlutterMacOS +import XCTest + +class RunnerTests: XCTestCase { + + func testExample() { + // If you add code to the Runner application, consider adding tests here. + // See https://developer.apple.com/documentation/xctest for more information about using XCTest. + } + +} diff --git a/siro_admin/pubspec.lock b/siro_admin/pubspec.lock new file mode 100644 index 0000000..33bfadb --- /dev/null +++ b/siro_admin/pubspec.lock @@ -0,0 +1,1481 @@ +# Generated by pub +# See https://dart.dev/tools/pub/glossary#lockfile +packages: + _fe_analyzer_shared: + dependency: transitive + description: + name: _fe_analyzer_shared + sha256: "8d7ff3948166b8ec5da0fbb5962000926b8e02f2ed9b3e51d1738905fbd4c98d" + url: "https://pub.dev" + source: hosted + version: "93.0.0" + _flutterfire_internals: + dependency: transitive + description: + name: _flutterfire_internals + sha256: ff0a84a2734d9e1089f8aedd5c0af0061b82fb94e95260d943404e0ef2134b11 + url: "https://pub.dev" + source: hosted + version: "1.3.59" + analyzer: + dependency: transitive + description: + name: analyzer + sha256: de7148ed2fcec579b19f122c1800933dfa028f6d9fd38a152b04b1516cec120b + url: "https://pub.dev" + source: hosted + version: "10.0.1" + archive: + dependency: transitive + description: + name: archive + sha256: a96e8b390886ee8abb49b7bd3ac8df6f451c621619f52a26e815fdcf568959ff + url: "https://pub.dev" + source: hosted + version: "4.0.9" + args: + dependency: transitive + description: + name: args + sha256: d0481093c50b1da8910eb0bb301626d4d8eb7284aa739614d2b394ee09e3ea04 + url: "https://pub.dev" + source: hosted + version: "2.7.0" + asn1lib: + dependency: transitive + description: + name: asn1lib + sha256: "9a8f69025044eb466b9b60ef3bc3ac99b4dc6c158ae9c56d25eeccf5bc56d024" + url: "https://pub.dev" + source: hosted + version: "1.6.5" + async: + dependency: transitive + description: + name: async + sha256: e2eb0491ba5ddb6177742d2da23904574082139b07c1e33b8503b9f46f3e1a37 + url: "https://pub.dev" + source: hosted + version: "2.13.1" + boolean_selector: + dependency: transitive + description: + name: boolean_selector + sha256: "8aab1771e1243a5063b8b0ff68042d67334e3feab9e95b9490f9a6ebf73b42ea" + url: "https://pub.dev" + source: hosted + version: "2.1.2" + build: + dependency: transitive + description: + name: build + sha256: a156715e7cd728130c592f30552575908aae5b100005fbc1f0fb16b3c03a3d10 + url: "https://pub.dev" + source: hosted + version: "4.0.6" + build_config: + dependency: transitive + description: + name: build_config + sha256: "4070d2a59f8eec34c97c86ceb44403834899075f66e8a9d59706f8e7834f6f71" + url: "https://pub.dev" + source: hosted + version: "1.3.0" + build_daemon: + dependency: transitive + description: + name: build_daemon + sha256: bf05f6e12cfea92d3c09308d7bcdab1906cd8a179b023269eed00c071004b957 + url: "https://pub.dev" + source: hosted + version: "4.1.1" + build_runner: + dependency: "direct dev" + description: + name: build_runner + sha256: "1523ce62448ebac2c15a8ba5fbad8acac169788658a7dd2a1c2d9c2a9318b9a6" + url: "https://pub.dev" + source: hosted + version: "2.15.0" + built_collection: + dependency: transitive + description: + name: built_collection + sha256: "376e3dd27b51ea877c28d525560790aee2e6fbb5f20e2f85d5081027d94e2100" + url: "https://pub.dev" + source: hosted + version: "5.1.1" + built_value: + dependency: transitive + description: + name: built_value + sha256: "34e4067d30ce212937df995f03b69992eea683539ceeac7f679a1f1eba055b56" + url: "https://pub.dev" + source: hosted + version: "8.12.6" + characters: + dependency: transitive + description: + name: characters + sha256: faf38497bda5ead2a8c7615f4f7939df04333478bf32e4173fcb06d428b5716b + url: "https://pub.dev" + source: hosted + version: "1.4.1" + checked_yaml: + dependency: transitive + description: + name: checked_yaml + sha256: "959525d3162f249993882720d52b7e0c833978df229be20702b33d48d91de70f" + url: "https://pub.dev" + source: hosted + version: "2.0.4" + cli_util: + dependency: transitive + description: + name: cli_util + sha256: ff6785f7e9e3c38ac98b2fb035701789de90154024a75b6cb926445e83197d1c + url: "https://pub.dev" + source: hosted + version: "0.4.2" + clock: + dependency: transitive + description: + name: clock + sha256: fddb70d9b5277016c77a80201021d40a2247104d9f4aa7bab7157b7e3f05b84b + url: "https://pub.dev" + source: hosted + version: "1.1.2" + code_assets: + dependency: transitive + description: + name: code_assets + sha256: bf394f466ba9205f1812a0433b392d6af280f155f56651eda7c18cc32ed493b8 + url: "https://pub.dev" + source: hosted + version: "1.2.1" + code_builder: + dependency: transitive + description: + name: code_builder + sha256: "6a6cab2ba4680d6423f34a9b972a4c9a94ebe1b62ecec4e1a1f2cba91fd1319d" + url: "https://pub.dev" + source: hosted + version: "4.11.1" + collection: + dependency: transitive + description: + name: collection + sha256: "2f5709ae4d3d59dd8f7cd309b4e023046b57d8a6c82130785d2b0e5868084e76" + url: "https://pub.dev" + source: hosted + version: "1.19.1" + convert: + dependency: transitive + description: + name: convert + sha256: b30acd5944035672bc15c6b7a8b47d773e41e2f17de064350988c5d02adb1c68 + url: "https://pub.dev" + source: hosted + version: "3.1.2" + cross_file: + dependency: transitive + description: + name: cross_file + sha256: "28bb3ae56f117b5aec029d702a90f57d285cd975c3c5c281eaca38dbc47c5937" + url: "https://pub.dev" + source: hosted + version: "0.3.5+2" + crypto: + dependency: transitive + description: + name: crypto + sha256: c8ea0233063ba03258fbcf2ca4d6dadfefe14f02fab57702265467a19f27fadf + url: "https://pub.dev" + source: hosted + version: "3.0.7" + dart_earcut: + dependency: transitive + description: + name: dart_earcut + sha256: e485001bfc05dcbc437d7bfb666316182e3522d4c3f9668048e004d0eb2ce43b + url: "https://pub.dev" + source: hosted + version: "1.2.0" + dart_style: + dependency: transitive + description: + name: dart_style + sha256: "29f7ecc274a86d32920b1d9cfc7502fa87220da41ec60b55f329559d5732e2b2" + url: "https://pub.dev" + source: hosted + version: "3.1.7" + device_info_plus: + dependency: "direct main" + description: + name: device_info_plus + sha256: "98f28b42168cc509abc92f88518882fd58061ea372d7999aecc424345c7bff6a" + url: "https://pub.dev" + source: hosted + version: "11.5.0" + device_info_plus_platform_interface: + dependency: transitive + description: + name: device_info_plus_platform_interface + sha256: e1ea89119e34903dca74b883d0dd78eb762814f97fb6c76f35e9ff74d261a18f + url: "https://pub.dev" + source: hosted + version: "7.0.3" + dio: + dependency: "direct main" + description: + name: dio + sha256: aff32c08f92787a557dd5c0145ac91536481831a01b4648136373cddb0e64f8c + url: "https://pub.dev" + source: hosted + version: "5.9.2" + dio_web_adapter: + dependency: transitive + description: + name: dio_web_adapter + sha256: "2f9e64323a7c3c7ef69567d5c800424a11f8337b8b228bad02524c9fb3c1f340" + url: "https://pub.dev" + source: hosted + version: "2.1.2" + encrypt: + dependency: "direct main" + description: + name: encrypt + sha256: "62d9aa4670cc2a8798bab89b39fc71b6dfbacf615de6cf5001fb39f7e4a996a2" + url: "https://pub.dev" + source: hosted + version: "5.0.3" + envied: + dependency: "direct main" + description: + name: envied + sha256: "42132a746494b0a7bc19062cdddd3a01694f696caca684456ff01526c833decc" + url: "https://pub.dev" + source: hosted + version: "1.3.5" + envied_generator: + dependency: "direct dev" + description: + name: envied_generator + sha256: e1e66498080f531e89d9ea7971f96b287dffdd05df16efdd31f9f74faa77e005 + url: "https://pub.dev" + source: hosted + version: "1.3.5" + equatable: + dependency: transitive + description: + name: equatable + sha256: "3e0141505477fd8ad55d6eb4e7776d3fe8430be8e497ccb1521370c3f21a3e2b" + url: "https://pub.dev" + source: hosted + version: "2.0.8" + fake_async: + dependency: transitive + description: + name: fake_async + sha256: "5368f224a74523e8d2e7399ea1638b37aecfca824a3cc4dfdf77bf1fa905ac44" + url: "https://pub.dev" + source: hosted + version: "1.3.3" + ffi: + dependency: transitive + description: + name: ffi + sha256: "6d7fd89431262d8f3125e81b50d3847a091d846eafcd4fdb88dd06f36d705a45" + url: "https://pub.dev" + source: hosted + version: "2.2.0" + file: + dependency: transitive + description: + name: file + sha256: a3b4f84adafef897088c160faf7dfffb7696046cb13ae90b508c2cbc95d3b8d4 + url: "https://pub.dev" + source: hosted + version: "7.0.1" + file_selector_linux: + dependency: transitive + description: + name: file_selector_linux + sha256: "2567f398e06ac72dcf2e98a0c95df2a9edd03c2c2e0cacd4780f20cdf56263a0" + url: "https://pub.dev" + source: hosted + version: "0.9.4" + file_selector_macos: + dependency: transitive + description: + name: file_selector_macos + sha256: "5e0bbe9c312416f1787a68259ea1505b52f258c587f12920422671807c4d618a" + url: "https://pub.dev" + source: hosted + version: "0.9.5" + file_selector_platform_interface: + dependency: transitive + description: + name: file_selector_platform_interface + sha256: "35e0bd61ebcdb91a3505813b055b09b79dfdc7d0aee9c09a7ba59ae4bb13dc85" + url: "https://pub.dev" + source: hosted + version: "2.7.0" + file_selector_windows: + dependency: transitive + description: + name: file_selector_windows + sha256: "62197474ae75893a62df75939c777763d39c2bc5f73ce5b88497208bc269abfd" + url: "https://pub.dev" + source: hosted + version: "0.9.3+5" + firebase_core: + dependency: "direct main" + description: + name: firebase_core + sha256: "7be63a3f841fc9663342f7f3a011a42aef6a61066943c90b1c434d79d5c995c5" + url: "https://pub.dev" + source: hosted + version: "3.15.2" + firebase_core_platform_interface: + dependency: transitive + description: + name: firebase_core_platform_interface + sha256: "0ecda14c1bfc9ed8cac303dd0f8d04a320811b479362a9a4efb14fd331a473ce" + url: "https://pub.dev" + source: hosted + version: "6.0.3" + firebase_core_web: + dependency: transitive + description: + name: firebase_core_web + sha256: "0ed0dc292e8f9ac50992e2394e9d336a0275b6ae400d64163fdf0a8a8b556c37" + url: "https://pub.dev" + source: hosted + version: "2.24.1" + firebase_crashlytics: + dependency: "direct main" + description: + name: firebase_crashlytics + sha256: "662ae6443da91bca1fb0be8aeeac026fa2975e8b7ddfca36e4d90ebafa35dde1" + url: "https://pub.dev" + source: hosted + version: "4.3.10" + firebase_crashlytics_platform_interface: + dependency: transitive + description: + name: firebase_crashlytics_platform_interface + sha256: "7222a8a40077c79f6b8b3f3439241c9f2b34e9ddfde8381ffc512f7b2e61f7eb" + url: "https://pub.dev" + source: hosted + version: "3.8.10" + firebase_messaging: + dependency: "direct main" + description: + name: firebase_messaging + sha256: "60be38574f8b5658e2f22b7e311ff2064bea835c248424a383783464e8e02fcc" + url: "https://pub.dev" + source: hosted + version: "15.2.10" + firebase_messaging_platform_interface: + dependency: transitive + description: + name: firebase_messaging_platform_interface + sha256: "685e1771b3d1f9c8502771ccc9f91485b376ffe16d553533f335b9183ea99754" + url: "https://pub.dev" + source: hosted + version: "4.6.10" + firebase_messaging_web: + dependency: transitive + description: + name: firebase_messaging_web + sha256: "0d1be17bc89ed3ff5001789c92df678b2e963a51b6fa2bdb467532cc9dbed390" + url: "https://pub.dev" + source: hosted + version: "3.10.10" + fixnum: + dependency: transitive + description: + name: fixnum + sha256: b6dc7065e46c974bc7c5f143080a6764ec7a4be6da1285ececdc37be96de53be + url: "https://pub.dev" + source: hosted + version: "1.1.1" + fl_chart: + dependency: "direct main" + description: + name: fl_chart + sha256: "5276944c6ffc975ae796569a826c38a62d2abcf264e26b88fa6f482e107f4237" + url: "https://pub.dev" + source: hosted + version: "0.70.2" + flutter: + dependency: "direct main" + description: flutter + source: sdk + version: "0.0.0" + flutter_image_compress: + dependency: "direct main" + description: + name: flutter_image_compress + sha256: "51d23be39efc2185e72e290042a0da41aed70b14ef97db362a6b5368d0523b27" + url: "https://pub.dev" + source: hosted + version: "2.4.0" + flutter_image_compress_common: + dependency: transitive + description: + name: flutter_image_compress_common + sha256: c5c5d50c15e97dd7dc72ff96bd7077b9f791932f2076c5c5b6c43f2c88607bfb + url: "https://pub.dev" + source: hosted + version: "1.0.6" + flutter_image_compress_macos: + dependency: transitive + description: + name: flutter_image_compress_macos + sha256: "20019719b71b743aba0ef874ed29c50747461e5e8438980dfa5c2031898f7337" + url: "https://pub.dev" + source: hosted + version: "1.0.3" + flutter_image_compress_ohos: + dependency: transitive + description: + name: flutter_image_compress_ohos + sha256: e76b92bbc830ee08f5b05962fc78a532011fcd2041f620b5400a593e96da3f51 + url: "https://pub.dev" + source: hosted + version: "0.0.3" + flutter_image_compress_platform_interface: + dependency: transitive + description: + name: flutter_image_compress_platform_interface + sha256: "579cb3947fd4309103afe6442a01ca01e1e6f93dc53bb4cbd090e8ce34a41889" + url: "https://pub.dev" + source: hosted + version: "1.0.5" + flutter_image_compress_web: + dependency: transitive + description: + name: flutter_image_compress_web + sha256: b9b141ac7c686a2ce7bb9a98176321e1182c9074650e47bb140741a44b6f5a96 + url: "https://pub.dev" + source: hosted + version: "0.1.5" + flutter_launcher_icons: + dependency: "direct main" + description: + name: flutter_launcher_icons + sha256: "10f13781741a2e3972126fae08393d3c4e01fa4cd7473326b94b72cf594195e7" + url: "https://pub.dev" + source: hosted + version: "0.14.4" + flutter_lints: + dependency: "direct dev" + description: + name: flutter_lints + sha256: "5398f14efa795ffb7a33e9b6a08798b26a180edac4ad7db3f231e40f82ce11e1" + url: "https://pub.dev" + source: hosted + version: "5.0.0" + flutter_map: + dependency: "direct main" + description: + name: flutter_map + sha256: "2ecb34619a4be19df6f40c2f8dce1591675b4eff7a6857bd8f533706977385da" + url: "https://pub.dev" + source: hosted + version: "7.0.2" + flutter_plugin_android_lifecycle: + dependency: transitive + description: + name: flutter_plugin_android_lifecycle + sha256: "3854fe5e3bff0b113c658f260b90c95dea17c92db0f2addeac2e343dd9969785" + url: "https://pub.dev" + source: hosted + version: "2.0.35" + flutter_secure_storage: + dependency: "direct main" + description: + name: flutter_secure_storage + sha256: "9cad52d75ebc511adfae3d447d5d13da15a55a92c9410e50f67335b6d21d16ea" + url: "https://pub.dev" + source: hosted + version: "9.2.4" + flutter_secure_storage_linux: + dependency: transitive + description: + name: flutter_secure_storage_linux + sha256: be76c1d24a97d0b98f8b54bce6b481a380a6590df992d0098f868ad54dc8f688 + url: "https://pub.dev" + source: hosted + version: "1.2.3" + flutter_secure_storage_macos: + dependency: transitive + description: + name: flutter_secure_storage_macos + sha256: "6c0a2795a2d1de26ae202a0d78527d163f4acbb11cde4c75c670f3a0fc064247" + url: "https://pub.dev" + source: hosted + version: "3.1.3" + flutter_secure_storage_platform_interface: + dependency: transitive + description: + name: flutter_secure_storage_platform_interface + sha256: cf91ad32ce5adef6fba4d736a542baca9daf3beac4db2d04be350b87f69ac4a8 + url: "https://pub.dev" + source: hosted + version: "1.1.2" + flutter_secure_storage_web: + dependency: transitive + description: + name: flutter_secure_storage_web + sha256: f4ebff989b4f07b2656fb16b47852c0aab9fed9b4ec1c70103368337bc1886a9 + url: "https://pub.dev" + source: hosted + version: "1.2.1" + flutter_secure_storage_windows: + dependency: transitive + description: + name: flutter_secure_storage_windows + sha256: b20b07cb5ed4ed74fc567b78a72936203f587eba460af1df11281c9326cd3709 + url: "https://pub.dev" + source: hosted + version: "3.1.2" + flutter_staggered_animations: + dependency: "direct main" + description: + name: flutter_staggered_animations + sha256: "81d3c816c9bb0dca9e8a5d5454610e21ffb068aedb2bde49d2f8d04f75538351" + url: "https://pub.dev" + source: hosted + version: "1.1.1" + flutter_test: + dependency: "direct dev" + description: flutter + source: sdk + version: "0.0.0" + flutter_web_plugins: + dependency: transitive + description: flutter + source: sdk + version: "0.0.0" + get: + dependency: "direct main" + description: + name: get + sha256: "5ed34a7925b85336e15d472cc4cfe7d9ebf4ab8e8b9f688585bf6b50f4c3d79a" + url: "https://pub.dev" + source: hosted + version: "4.7.3" + get_storage: + dependency: "direct main" + description: + name: get_storage + sha256: "39db1fffe779d0c22b3a744376e86febe4ade43bf65e06eab5af707dc84185a2" + url: "https://pub.dev" + source: hosted + version: "2.1.1" + glob: + dependency: transitive + description: + name: glob + sha256: c3f1ee72c96f8f78935e18aa8cecced9ab132419e8625dc187e1c2408efc20de + url: "https://pub.dev" + source: hosted + version: "2.1.3" + google_fonts: + dependency: "direct main" + description: + name: google_fonts + sha256: ba03d03bcaa2f6cb7bd920e3b5027181db75ab524f8891c8bc3aa603885b8055 + url: "https://pub.dev" + source: hosted + version: "6.3.3" + google_identity_services_web: + dependency: transitive + description: + name: google_identity_services_web + sha256: "5d187c46dc59e02646e10fe82665fc3884a9b71bc1c90c2b8b749316d33ee454" + url: "https://pub.dev" + source: hosted + version: "0.3.3+1" + google_sign_in: + dependency: "direct main" + description: + name: google_sign_in + sha256: d0a2c3bcb06e607bb11e4daca48bd4b6120f0bbc4015ccebbe757d24ea60ed2a + url: "https://pub.dev" + source: hosted + version: "6.3.0" + google_sign_in_android: + dependency: transitive + description: + name: google_sign_in_android + sha256: d5e23c56a4b84b6427552f1cf3f98f716db3b1d1a647f16b96dbb5b93afa2805 + url: "https://pub.dev" + source: hosted + version: "6.2.1" + google_sign_in_ios: + dependency: transitive + description: + name: google_sign_in_ios + sha256: "102005f498ce18442e7158f6791033bbc15ad2dcc0afa4cf4752e2722a516c96" + url: "https://pub.dev" + source: hosted + version: "5.9.0" + google_sign_in_platform_interface: + dependency: transitive + description: + name: google_sign_in_platform_interface + sha256: "5f6f79cf139c197261adb6ac024577518ae48fdff8e53205c5373b5f6430a8aa" + url: "https://pub.dev" + source: hosted + version: "2.5.0" + google_sign_in_web: + dependency: transitive + description: + name: google_sign_in_web + sha256: "460547beb4962b7623ac0fb8122d6b8268c951cf0b646dd150d60498430e4ded" + url: "https://pub.dev" + source: hosted + version: "0.12.4+4" + googleapis_auth: + dependency: "direct main" + description: + name: googleapis_auth + sha256: befd71383a955535060acde8792e7efc11d2fccd03dd1d3ec434e85b68775938 + url: "https://pub.dev" + source: hosted + version: "1.6.0" + graphs: + dependency: transitive + description: + name: graphs + sha256: "741bbf84165310a68ff28fe9e727332eef1407342fca52759cb21ad8177bb8d0" + url: "https://pub.dev" + source: hosted + version: "2.3.2" + hooks: + dependency: transitive + description: + name: hooks + sha256: "9a62a50b50b769a737bc0a8ff381f333529df3ab746b2f6b02e83760231455ba" + url: "https://pub.dev" + source: hosted + version: "2.0.2" + http: + dependency: "direct main" + description: + name: http + sha256: "87721a4a50b19c7f1d49001e51409bddc46303966ce89a65af4f4e6004896412" + url: "https://pub.dev" + source: hosted + version: "1.6.0" + http_multi_server: + dependency: transitive + description: + name: http_multi_server + sha256: aa6199f908078bb1c5efb8d8638d4ae191aac11b311132c3ef48ce352fb52ef8 + url: "https://pub.dev" + source: hosted + version: "3.2.2" + http_parser: + dependency: transitive + description: + name: http_parser + sha256: "178d74305e7866013777bab2c3d8726205dc5a4dd935297175b19a23a2e66571" + url: "https://pub.dev" + source: hosted + version: "4.1.2" + image: + dependency: transitive + description: + name: image + sha256: "6300175e00616bbc832e2fc91bfa4d776af5402c81c7151bee6905bb08473c52" + url: "https://pub.dev" + source: hosted + version: "4.9.1" + image_cropper: + dependency: "direct main" + description: + name: image_cropper + sha256: "266760ed426d7121f0ada02c672bfe5c1b5c714e908328716aee756f045709dc" + url: "https://pub.dev" + source: hosted + version: "8.1.0" + image_cropper_for_web: + dependency: transitive + description: + name: image_cropper_for_web + sha256: fd81ebe36f636576094377aab32673c4e5d1609b32dec16fad98d2b71f1250a9 + url: "https://pub.dev" + source: hosted + version: "6.1.0" + image_cropper_platform_interface: + dependency: transitive + description: + name: image_cropper_platform_interface + sha256: "2d8db8f4b638e448fa89a1e77cd8f053b4547472bd3ae073169e86626d03afef" + url: "https://pub.dev" + source: hosted + version: "7.2.0" + image_picker: + dependency: "direct main" + description: + name: image_picker + sha256: "91c025426c2881c551100bce834e201c835a170151545f58d17da5180ca7d9ac" + url: "https://pub.dev" + source: hosted + version: "1.2.2" + image_picker_android: + dependency: transitive + description: + name: image_picker_android + sha256: d5b3e1774af29c9ab00103afb0d4614070f924d2e0057ac867ec98800114793f + url: "https://pub.dev" + source: hosted + version: "0.8.13+17" + image_picker_for_web: + dependency: transitive + description: + name: image_picker_for_web + sha256: "66257a3191ab360d23a55c8241c91a6e329d31e94efa7be9cf7a212e65850214" + url: "https://pub.dev" + source: hosted + version: "3.1.1" + image_picker_ios: + dependency: transitive + description: + name: image_picker_ios + sha256: b9c4a438a9ff4f60808c9cf0039b93a42bb6c2211ef6ebb647394b2b3fa84588 + url: "https://pub.dev" + source: hosted + version: "0.8.13+6" + image_picker_linux: + dependency: transitive + description: + name: image_picker_linux + sha256: "1f81c5f2046b9ab724f85523e4af65be1d47b038160a8c8deed909762c308ed4" + url: "https://pub.dev" + source: hosted + version: "0.2.2" + image_picker_macos: + dependency: transitive + description: + name: image_picker_macos + sha256: "86f0f15a309de7e1a552c12df9ce5b59fe927e71385329355aec4776c6a8ec91" + url: "https://pub.dev" + source: hosted + version: "0.2.2+1" + image_picker_platform_interface: + dependency: transitive + description: + name: image_picker_platform_interface + sha256: "567e056716333a1647c64bb6bd873cff7622233a5c3f694be28a583d4715690c" + url: "https://pub.dev" + source: hosted + version: "2.11.1" + image_picker_windows: + dependency: transitive + description: + name: image_picker_windows + sha256: d248c86554a72b5495a31c56f060cf73a41c7ff541689327b1a7dbccc33adfae + url: "https://pub.dev" + source: hosted + version: "0.2.2" + intl: + dependency: "direct main" + description: + name: intl + sha256: d6f56758b7d3014a48af9701c085700aac781a92a87a62b1333b46d8879661cf + url: "https://pub.dev" + source: hosted + version: "0.19.0" + io: + dependency: transitive + description: + name: io + sha256: dfd5a80599cf0165756e3181807ed3e77daf6dd4137caaad72d0b7931597650b + url: "https://pub.dev" + source: hosted + version: "1.0.5" + jailbreak_root_detection: + dependency: "direct main" + description: + name: jailbreak_root_detection + sha256: "5000177b9a27428e9c47d2b98f21ab707bef5869c036f9bda4f4f95f4ad67d72" + url: "https://pub.dev" + source: hosted + version: "1.2.0+1" + jni: + dependency: transitive + description: + name: jni + sha256: c2230682d5bc2362c1c9e8d3c7f406d9cbba23ab3f2e203a025dd47e0fb2e68f + url: "https://pub.dev" + source: hosted + version: "1.0.0" + jni_flutter: + dependency: transitive + description: + name: jni_flutter + sha256: "8b59e590786050b1cd866677dddaf76b1ade5e7bc751abe04b86e84d379d3ba6" + url: "https://pub.dev" + source: hosted + version: "1.0.1" + js: + dependency: transitive + description: + name: js + sha256: f2c445dce49627136094980615a031419f7f3eb393237e4ecd97ac15dea343f3 + url: "https://pub.dev" + source: hosted + version: "0.6.7" + json_annotation: + dependency: transitive + description: + name: json_annotation + sha256: "2a743920d81b7910627f68ee2c9ac1fc0bfee32b9fc3403587d7c6791ca12f80" + url: "https://pub.dev" + source: hosted + version: "4.12.0" + jwt_decoder: + dependency: "direct main" + description: + name: jwt_decoder + sha256: "54774aebf83f2923b99e6416b4ea915d47af3bde56884eb622de85feabbc559f" + url: "https://pub.dev" + source: hosted + version: "2.0.1" + latlong2: + dependency: "direct main" + description: + name: latlong2 + sha256: "98227922caf49e6056f91b6c56945ea1c7b166f28ffcd5fb8e72fc0b453cc8fe" + url: "https://pub.dev" + source: hosted + version: "0.9.1" + leak_tracker: + dependency: transitive + description: + name: leak_tracker + sha256: "33e2e26bdd85a0112ec15400c8cbffea70d0f9c3407491f672a2fad47915e2de" + url: "https://pub.dev" + source: hosted + version: "11.0.2" + leak_tracker_flutter_testing: + dependency: transitive + description: + name: leak_tracker_flutter_testing + sha256: "1dbc140bb5a23c75ea9c4811222756104fbcd1a27173f0c34ca01e16bea473c1" + url: "https://pub.dev" + source: hosted + version: "3.0.10" + leak_tracker_testing: + dependency: transitive + description: + name: leak_tracker_testing + sha256: "8d5a2d49f4a66b49744b23b018848400d23e54caf9463f4eb20df3eb8acb2eb1" + url: "https://pub.dev" + source: hosted + version: "3.0.2" + lints: + dependency: transitive + description: + name: lints + sha256: c35bb79562d980e9a453fc715854e1ed39e24e7d0297a880ef54e17f9874a9d7 + url: "https://pub.dev" + source: hosted + version: "5.1.1" + lists: + dependency: transitive + description: + name: lists + sha256: "4ca5c19ae4350de036a7e996cdd1ee39c93ac0a2b840f4915459b7d0a7d4ab27" + url: "https://pub.dev" + source: hosted + version: "1.0.1" + local_auth: + dependency: "direct main" + description: + name: local_auth + sha256: "434d854cf478f17f12ab29a76a02b3067f86a63a6d6c4eb8fbfdcfe4879c1b7b" + url: "https://pub.dev" + source: hosted + version: "2.3.0" + local_auth_android: + dependency: transitive + description: + name: local_auth_android + sha256: a0bdfcc0607050a26ef5b31d6b4b254581c3d3ce3c1816ab4d4f4a9173e84467 + url: "https://pub.dev" + source: hosted + version: "1.0.56" + local_auth_darwin: + dependency: transitive + description: + name: local_auth_darwin + sha256: "699873970067a40ef2f2c09b4c72eb1cfef64224ef041b3df9fdc5c4c1f91f49" + url: "https://pub.dev" + source: hosted + version: "1.6.1" + local_auth_platform_interface: + dependency: transitive + description: + name: local_auth_platform_interface + sha256: f98b8e388588583d3f781f6806e4f4c9f9e189d898d27f0c249b93a1973dd122 + url: "https://pub.dev" + source: hosted + version: "1.1.0" + local_auth_windows: + dependency: transitive + description: + name: local_auth_windows + sha256: bc4e66a29b0fdf751aafbec923b5bed7ad6ed3614875d8151afe2578520b2ab5 + url: "https://pub.dev" + source: hosted + version: "1.0.11" + logger: + dependency: transitive + description: + name: logger + sha256: "25aee487596a6257655a1e091ec2ae66bc30e7af663592cc3a27e6591e05035c" + url: "https://pub.dev" + source: hosted + version: "2.7.0" + logging: + dependency: transitive + description: + name: logging + sha256: c8245ada5f1717ed44271ed1c26b8ce85ca3228fd2ffdb75468ab01979309d61 + url: "https://pub.dev" + source: hosted + version: "1.3.0" + matcher: + dependency: transitive + description: + name: matcher + sha256: "12956d0ad8390bbcc63ca2e1469c0619946ccb52809807067a7020d57e647aa6" + url: "https://pub.dev" + source: hosted + version: "0.12.18" + material_color_utilities: + dependency: transitive + description: + name: material_color_utilities + sha256: "9c337007e82b1889149c82ed242ed1cb24a66044e30979c44912381e9be4c48b" + url: "https://pub.dev" + source: hosted + version: "0.13.0" + meta: + dependency: transitive + description: + name: meta + sha256: "23f08335362185a5ea2ad3a4e597f1375e78bce8a040df5c600c8d3552ef2394" + url: "https://pub.dev" + source: hosted + version: "1.17.0" + mgrs_dart: + dependency: transitive + description: + name: mgrs_dart + sha256: fb89ae62f05fa0bb90f70c31fc870bcbcfd516c843fb554452ab3396f78586f7 + url: "https://pub.dev" + source: hosted + version: "2.0.0" + mime: + dependency: transitive + description: + name: mime + sha256: "41a20518f0cb1256669420fdba0cd90d21561e560ac240f26ef8322e45bb7ed6" + url: "https://pub.dev" + source: hosted + version: "2.0.0" + objective_c: + dependency: transitive + description: + name: objective_c + sha256: "6cb691c686fa2838c6deb34980d426145c2a5d537491cb83d463c33cdbc726ed" + url: "https://pub.dev" + source: hosted + version: "9.4.1" + package_config: + dependency: transitive + description: + name: package_config + sha256: f096c55ebb7deb7e384101542bfba8c52696c1b56fca2eb62827989ef2353bbc + url: "https://pub.dev" + source: hosted + version: "2.2.0" + path: + dependency: "direct main" + description: + name: path + sha256: "75cca69d1490965be98c73ceaea117e8a04dd21217b37b292c9ddbec0d955bc5" + url: "https://pub.dev" + source: hosted + version: "1.9.1" + path_provider: + dependency: transitive + description: + name: path_provider + sha256: "50c5dd5b6e1aaf6fb3a78b33f6aa3afca52bf903a8a5298f53101fdaee55bbcd" + url: "https://pub.dev" + source: hosted + version: "2.1.5" + path_provider_android: + dependency: transitive + description: + name: path_provider_android + sha256: "69cbd515a62b94d32a7944f086b2f82b4ac40a1d45bebfc00813a430ab2dabcd" + url: "https://pub.dev" + source: hosted + version: "2.3.1" + path_provider_foundation: + dependency: transitive + description: + name: path_provider_foundation + sha256: "2a376b7d6392d80cd3705782d2caa734ca4727776db0b6ec36ef3f1855197699" + url: "https://pub.dev" + source: hosted + version: "2.6.0" + path_provider_linux: + dependency: transitive + description: + name: path_provider_linux + sha256: f7a1fe3a634fe7734c8d3f2766ad746ae2a2884abe22e241a8b301bf5cac3279 + url: "https://pub.dev" + source: hosted + version: "2.2.1" + path_provider_platform_interface: + dependency: transitive + description: + name: path_provider_platform_interface + sha256: "88f5779f72ba699763fa3a3b06aa4bf6de76c8e5de842cf6f29e2e06476c2334" + url: "https://pub.dev" + source: hosted + version: "2.1.2" + path_provider_windows: + dependency: transitive + description: + name: path_provider_windows + sha256: bd6f00dbd873bfb70d0761682da2b3a2c2fccc2b9e84c495821639601d81afe7 + url: "https://pub.dev" + source: hosted + version: "2.3.0" + petitparser: + dependency: transitive + description: + name: petitparser + sha256: "91bd59303e9f769f108f8df05e371341b15d59e995e6806aefab827b58336675" + url: "https://pub.dev" + source: hosted + version: "7.0.2" + platform: + dependency: transitive + description: + name: platform + sha256: "5d6b1b0036a5f331ebc77c850ebc8506cbc1e9416c27e59b439f917a902a4984" + url: "https://pub.dev" + source: hosted + version: "3.1.6" + plugin_platform_interface: + dependency: transitive + description: + name: plugin_platform_interface + sha256: "4820fbfdb9478b1ebae27888254d445073732dae3d6ea81f0b7e06d5dedc3f02" + url: "https://pub.dev" + source: hosted + version: "2.1.8" + pointycastle: + dependency: transitive + description: + name: pointycastle + sha256: "4be0097fcf3fd3e8449e53730c631200ebc7b88016acecab2b0da2f0149222fe" + url: "https://pub.dev" + source: hosted + version: "3.9.1" + polylabel: + dependency: transitive + description: + name: polylabel + sha256: "41b9099afb2aa6c1730bdd8a0fab1400d287694ec7615dd8516935fa3144214b" + url: "https://pub.dev" + source: hosted + version: "1.0.1" + pool: + dependency: transitive + description: + name: pool + sha256: "978783255c543aa3586a1b3c21f6e9d720eb315376a915872c61ef8b5c20177d" + url: "https://pub.dev" + source: hosted + version: "1.5.2" + posix: + dependency: transitive + description: + name: posix + sha256: "185ef7606574f789b40f289c233efa52e96dead518aed988e040a10737febb07" + url: "https://pub.dev" + source: hosted + version: "6.5.0" + proj4dart: + dependency: transitive + description: + name: proj4dart + sha256: c8a659ac9b6864aa47c171e78d41bbe6f5e1d7bd790a5814249e6b68bc44324e + url: "https://pub.dev" + source: hosted + version: "2.1.0" + pub_semver: + dependency: transitive + description: + name: pub_semver + sha256: "5bfcf68ca79ef689f8990d1160781b4bad40a3bd5e5218ad4076ddb7f4081585" + url: "https://pub.dev" + source: hosted + version: "2.2.0" + pubspec_parse: + dependency: transitive + description: + name: pubspec_parse + sha256: "0560ba233314abbed0a48a2956f7f022cce7c3e1e73df540277da7544cad4082" + url: "https://pub.dev" + source: hosted + version: "1.5.0" + recase: + dependency: transitive + description: + name: recase + sha256: e4eb4ec2dcdee52dcf99cb4ceabaffc631d7424ee55e56f280bc039737f89213 + url: "https://pub.dev" + source: hosted + version: "4.1.0" + record_use: + dependency: transitive + description: + name: record_use + sha256: "2551bd8eecfe95d14ae75f6021ad0248be5c27f138c2ec12fcb52b500b3ba1ed" + url: "https://pub.dev" + source: hosted + version: "0.6.0" + secure_string_operations: + dependency: "direct main" + description: + path: secure_string_operations + relative: true + source: path + version: "1.0.0" + shelf: + dependency: transitive + description: + name: shelf + sha256: e7dd780a7ffb623c57850b33f43309312fc863fb6aa3d276a754bb299839ef12 + url: "https://pub.dev" + source: hosted + version: "1.4.2" + shelf_web_socket: + dependency: transitive + description: + name: shelf_web_socket + sha256: "3632775c8e90d6c9712f883e633716432a27758216dfb61bd86a8321c0580925" + url: "https://pub.dev" + source: hosted + version: "3.0.0" + sky_engine: + dependency: transitive + description: flutter + source: sdk + version: "0.0.0" + source_gen: + dependency: transitive + description: + name: source_gen + sha256: ec37cc0e6694374cbef59ed79685572c870a54ede6fa30a3e420feb3adffea02 + url: "https://pub.dev" + source: hosted + version: "4.2.3" + source_span: + dependency: transitive + description: + name: source_span + sha256: "56a02f1f4cd1a2d96303c0144c93bd6d909eea6bee6bf5a0e0b685edbd4c47ab" + url: "https://pub.dev" + source: hosted + version: "1.10.2" + sqflite: + dependency: "direct main" + description: + name: sqflite + sha256: "564cfed0746fe53140c23b70b308e045c3b31f17778f2f326ccb7d804ea0250a" + url: "https://pub.dev" + source: hosted + version: "2.4.2+1" + sqflite_android: + dependency: transitive + description: + name: sqflite_android + sha256: "881e28efdcc9950fd8e9bb42713dcf1103e62a2e7168f23c9338d82db13dec40" + url: "https://pub.dev" + source: hosted + version: "2.4.2+3" + sqflite_common: + dependency: transitive + description: + name: sqflite_common + sha256: "1581ffbf7a0e333b380d6a30737d78516b826cb35beb7fb0bf8a3ea0c678b465" + url: "https://pub.dev" + source: hosted + version: "2.5.8" + sqflite_darwin: + dependency: transitive + description: + name: sqflite_darwin + sha256: "279832e5cde3fe99e8571879498c9211f3ca6391b0d818df4e17d9fff5c6ccb3" + url: "https://pub.dev" + source: hosted + version: "2.4.2" + sqflite_platform_interface: + dependency: transitive + description: + name: sqflite_platform_interface + sha256: "8dd4515c7bdcae0a785b0062859336de775e8c65db81ae33dd5445f35be61920" + url: "https://pub.dev" + source: hosted + version: "2.4.0" + stack_trace: + dependency: transitive + description: + name: stack_trace + sha256: "8b27215b45d22309b5cddda1aa2b19bdfec9df0e765f2de506401c071d38d1b1" + url: "https://pub.dev" + source: hosted + version: "1.12.1" + stream_channel: + dependency: transitive + description: + name: stream_channel + sha256: "969e04c80b8bcdf826f8f16579c7b14d780458bd97f56d107d3950fdbeef059d" + url: "https://pub.dev" + source: hosted + version: "2.1.4" + stream_transform: + dependency: transitive + description: + name: stream_transform + sha256: ad47125e588cfd37a9a7f86c7d6356dde8dfe89d071d293f80ca9e9273a33871 + url: "https://pub.dev" + source: hosted + version: "2.1.1" + string_scanner: + dependency: transitive + description: + name: string_scanner + sha256: "921cd31725b72fe181906c6a94d987c78e3b98c2e205b397ea399d4054872b43" + url: "https://pub.dev" + source: hosted + version: "1.4.1" + synchronized: + dependency: transitive + description: + name: synchronized + sha256: "63896c27e81b28f8cb4e69ead0d3e8f03f1d1e5fc531a3e579cabed6a2c7c9e5" + url: "https://pub.dev" + source: hosted + version: "3.4.0+1" + term_glyph: + dependency: transitive + description: + name: term_glyph + sha256: "7f554798625ea768a7518313e58f83891c7f5024f88e46e7182a4558850a4b8e" + url: "https://pub.dev" + source: hosted + version: "1.2.2" + test_api: + dependency: transitive + description: + name: test_api + sha256: "93167629bfc610f71560ab9312acdda4959de4df6fac7492c89ff0d3886f6636" + url: "https://pub.dev" + source: hosted + version: "0.7.9" + typed_data: + dependency: transitive + description: + name: typed_data + sha256: f9049c039ebfeb4cf7a7104a675823cd72dba8297f264b6637062516699fa006 + url: "https://pub.dev" + source: hosted + version: "1.4.0" + unicode: + dependency: transitive + description: + name: unicode + sha256: "0f69e46593d65245774d4f17125c6084d2c20b4e473a983f6e21b7d7762218f1" + url: "https://pub.dev" + source: hosted + version: "0.3.1" + url_launcher: + dependency: "direct main" + description: + name: url_launcher + sha256: f6a7e5c4835bb4e3026a04793a4199ca2d14c739ec378fdfe23fc8075d0439f8 + url: "https://pub.dev" + source: hosted + version: "6.3.2" + url_launcher_android: + dependency: transitive + description: + name: url_launcher_android + sha256: "17bc677f0b301615530dd1d67e0a9828cafa2d0b6b6eae4cd3679b7eac4a273c" + url: "https://pub.dev" + source: hosted + version: "6.3.30" + url_launcher_ios: + dependency: transitive + description: + name: url_launcher_ios + sha256: "580fe5dfb51671ae38191d316e027f6b76272b026370708c2d898799750a02b0" + url: "https://pub.dev" + source: hosted + version: "6.4.1" + url_launcher_linux: + dependency: transitive + description: + name: url_launcher_linux + sha256: d5e14138b3bc193a0f63c10a53c94b91d399df0512b1f29b94a043db7482384a + url: "https://pub.dev" + source: hosted + version: "3.2.2" + url_launcher_macos: + dependency: transitive + description: + name: url_launcher_macos + sha256: "368adf46f71ad3c21b8f06614adb38346f193f3a59ba8fe9a2fd74133070ba18" + url: "https://pub.dev" + source: hosted + version: "3.2.5" + url_launcher_platform_interface: + dependency: transitive + description: + name: url_launcher_platform_interface + sha256: "552f8a1e663569be95a8190206a38187b531910283c3e982193e4f2733f01029" + url: "https://pub.dev" + source: hosted + version: "2.3.2" + url_launcher_web: + dependency: transitive + description: + name: url_launcher_web + sha256: "85c81589622fbc87c1c683aaea164d3604a7777495a79d91e39ffcdec39ddb34" + url: "https://pub.dev" + source: hosted + version: "2.4.3" + url_launcher_windows: + dependency: transitive + description: + name: url_launcher_windows + sha256: "712c70ab1b99744ff066053cbe3e80c73332b38d46e5e945c98689b2e66fc15f" + url: "https://pub.dev" + source: hosted + version: "3.1.5" + vector_math: + dependency: transitive + description: + name: vector_math + sha256: d530bd74fea330e6e364cda7a85019c434070188383e1cd8d9777ee586914c5b + url: "https://pub.dev" + source: hosted + version: "2.2.0" + vm_service: + dependency: transitive + description: + name: vm_service + sha256: "0016aef94fc66495ac78af5859181e3f3bf2026bd8eecc72b9565601e19ab360" + url: "https://pub.dev" + source: hosted + version: "15.2.0" + watcher: + dependency: transitive + description: + name: watcher + sha256: "1398c9f081a753f9226febe8900fce8f7d0a67163334e1c94a2438339d79d635" + url: "https://pub.dev" + source: hosted + version: "1.2.1" + web: + dependency: transitive + description: + name: web + sha256: "868d88a33d8a87b18ffc05f9f030ba328ffefba92d6c127917a2ba740f9cfe4a" + url: "https://pub.dev" + source: hosted + version: "1.1.1" + web_socket: + dependency: transitive + description: + name: web_socket + sha256: "34d64019aa8e36bf9842ac014bb5d2f5586ca73df5e4d9bf5c936975cae6982c" + url: "https://pub.dev" + source: hosted + version: "1.0.1" + web_socket_channel: + dependency: transitive + description: + name: web_socket_channel + sha256: d645757fb0f4773d602444000a8131ff5d48c9e47adfe9772652dd1a4f2d45c8 + url: "https://pub.dev" + source: hosted + version: "3.0.3" + win32: + dependency: transitive + description: + name: win32 + sha256: d7cb55e04cd34096cd3a79b3330245f54cb96a370a1c27adb3c84b917de8b08e + url: "https://pub.dev" + source: hosted + version: "5.15.0" + win32_registry: + dependency: transitive + description: + name: win32_registry + sha256: "6f1b564492d0147b330dd794fee8f512cec4977957f310f9951b5f9d83618dae" + url: "https://pub.dev" + source: hosted + version: "2.1.0" + wkt_parser: + dependency: transitive + description: + name: wkt_parser + sha256: "8a555fc60de3116c00aad67891bcab20f81a958e4219cc106e3c037aa3937f13" + url: "https://pub.dev" + source: hosted + version: "2.0.0" + xdg_directories: + dependency: transitive + description: + name: xdg_directories + sha256: "7a3f37b05d989967cdddcbb571f1ea834867ae2faa29725fd085180e0883aa15" + url: "https://pub.dev" + source: hosted + version: "1.1.0" + xml: + dependency: transitive + description: + name: xml + sha256: "67f0aff7be013d107995e9b75bf4e7f2c3ef2dfdb2c8e68024bba0a7fd5756a4" + url: "https://pub.dev" + source: hosted + version: "7.0.1" + yaml: + dependency: transitive + description: + name: yaml + sha256: b9da305ac7c39faa3f030eccd175340f968459dae4af175130b3fc47e40d76ce + url: "https://pub.dev" + source: hosted + version: "3.1.3" +sdks: + dart: ">=3.11.0 <4.0.0" + flutter: ">=3.38.4" diff --git a/siro_admin/pubspec.yaml b/siro_admin/pubspec.yaml new file mode 100644 index 0000000..e2cdb26 --- /dev/null +++ b/siro_admin/pubspec.yaml @@ -0,0 +1,103 @@ +name: siro_admin +description: "A new Flutter project." +# The following line prevents the package from being accidentally published to +# pub.dev using `flutter pub publish`. This is preferred for private packages. +publish_to: "none" # Remove this line if you wish to publish to pub.dev + +# The following defines the version and build number for your application. +# A version number is three numbers separated by dots, like 1.2.43 +# followed by an optional build number separated by a +. +# Both the version and the builder number may be overridden in flutter +# build by specifying --build-name and --build-number, respectively. +# In Android, build-name is used as versionName while build-number used as versionCode. +# Read more about Android versioning at https://developer.android.com/studio/publish/versioning +# In iOS, build-name is used as CFBundleShortVersionString while build-number is used as CFBundleVersion. +# Read more about iOS versioning at +# https://developer.apple.com/library/archive/documentation/General/Reference/InfoPlistKeyReference/Articles/CoreFoundationKeys.html +# In Windows, build-name is used as the major, minor, and patch parts +# of the product and file versions while build-number is used as the build suffix. +version: 1.0.0+1 + +environment: + sdk: ">=3.3.2 <4.0.0" + +# Dependencies specify other packages that your package needs in order to work. +# To automatically upgrade your package dependencies to the latest versions +# consider running `flutter pub upgrade --major-versions`. Alternatively, +# dependencies can be manually updated by changing the version numbers below to +# the latest version available on pub.dev. To see which dependencies have newer +# versions available, run `flutter pub outdated`. +dependencies: + # agora_rtc_engine: ^6.3.0 + # device_info_plus: ^10.1.0 + secure_string_operations: + path: ./secure_string_operations + dio: ^5.4.3+1 + envied: ^1.0.0 + firebase_core: ^3.9.0 + firebase_messaging: ^15.1.6 + fl_chart: ^0.70.0 + flutter: + sdk: flutter + flutter_launcher_icons: ^0.14.2 + # flutter_local_notifications: ^17.1.1 + flutter_secure_storage: ^9.0.0 + get: ^4.6.6 + get_storage: ^2.1.1 + google_fonts: ^6.2.1 + # google_maps_flutter: ^2.6.1 + flutter_map: ^7.0.0 # مكتبة OpenStreetMap للفلاتر + latlong2: ^0.9.1 + google_sign_in: ^6.2.1 + http: ^1.0.0 + # image: ^4.1.7 + image_cropper: ^8.0.2 + image_picker: ^1.1.1 + intl: ^0.19.0 + local_auth: ^2.2.0 + # location: ^6.0.1 + path: ^1.9.0 + sqflite: ^2.3.3+1 + url_launcher: ^6.2.6 + # webview_flutter: ^4.7.0 + googleapis_auth: ^1.6.0 + firebase_crashlytics: ^4.2.0 + flutter_image_compress: ^2.3.0 + jwt_decoder: ^2.0.1 + encrypt: ^5.0.3 + device_info_plus: ^11.5.0 + flutter_staggered_animations: ^1.1.1 + jailbreak_root_detection: ^1.1.5 + +dev_dependencies: + flutter_test: + sdk: flutter + flutter_lints: ^5.0.0 + envied_generator: ^1.0.0 + build_runner: ^2.4.6 + +flutter_launcher_icons: + android: "ic_launcher" # Changed to ic_launcher + ios: true + image_path: "assets/images/logo.png" + min_sdk_android: 21 + adaptive_icon_background: "#ffffff" # Optional: for adaptive icons on Android + adaptive_icon_foreground: "assets/images/logo.png" # Optional: for adaptive icons + web: + generate: true + image_path: "assets/images/logo.png" + background_color: "#ffffff" + theme_color: "#000000" + windows: + generate: true + image_path: "assets/images/logo.png" + icon_size: 48 + macos: + generate: true + image_path: "assets/images/logo.png" + +flutter: + uses-material-design: true + assets: + - assets/ + - assets/images/ diff --git a/siro_admin/secure_string_operations/lib/secure_string_operations.dart b/siro_admin/secure_string_operations/lib/secure_string_operations.dart new file mode 100644 index 0000000..d428ac3 --- /dev/null +++ b/siro_admin/secure_string_operations/lib/secure_string_operations.dart @@ -0,0 +1,47 @@ +// File: lib/secure_string_operations.dart + +library secure_string_operations; + +class X { + static String c(String a, Map b) { + StringBuffer c = StringBuffer(); + c.write(a); + + String d = "Bl"; + c.write(b[d] ?? d); + + StringBuffer e = StringBuffer(); + String f = c.toString(); + + for (int g = 0; g < f.length; g++) { + String h = f[g]; + e.write(b[h] ?? h); + } + + return e.toString(); + } + + static String r(String a, Map b) { + StringBuffer c = StringBuffer(); + String d = "Bl"; + int e = d.length; + + for (int f = 0; f < a.length; f++) { + String g = a[f]; + String h = b.keys.firstWhere( + (i) => b[i] == g, + orElse: () => g, + ); + + c.write(h); + } + + String j = c.toString(); + + if (j.endsWith(d)) { + j = j.substring(0, j.length - e); + } + + return j; + } +} diff --git a/siro_admin/secure_string_operations/pubspec.lock b/siro_admin/secure_string_operations/pubspec.lock new file mode 100644 index 0000000..fce7ef1 --- /dev/null +++ b/siro_admin/secure_string_operations/pubspec.lock @@ -0,0 +1,5 @@ +# Generated by pub +# See https://dart.dev/tools/pub/glossary#lockfile +packages: {} +sdks: + dart: ">=2.12.0 <4.0.0" diff --git a/siro_admin/secure_string_operations/pubspec.yaml b/siro_admin/secure_string_operations/pubspec.yaml new file mode 100644 index 0000000..b910400 --- /dev/null +++ b/siro_admin/secure_string_operations/pubspec.yaml @@ -0,0 +1,6 @@ +name: secure_string_operations +description: A package for secure string operations +version: 1.0.0 + +environment: + sdk: ">=2.12.0 <3.0.0" diff --git a/siro_admin/test/widget_test.dart b/siro_admin/test/widget_test.dart new file mode 100644 index 0000000..37ac666 --- /dev/null +++ b/siro_admin/test/widget_test.dart @@ -0,0 +1,8 @@ +import 'package:flutter_test/flutter_test.dart'; + +void main() { + testWidgets('App initialization test', (WidgetTester tester) async { + // Dummy test to pass CI + expect(true, true); + }); +} diff --git a/siro_admin/web/favicon.png b/siro_admin/web/favicon.png new file mode 100644 index 0000000..4c01f50 Binary files /dev/null and b/siro_admin/web/favicon.png differ diff --git a/siro_admin/web/icons/Icon-192.png b/siro_admin/web/icons/Icon-192.png new file mode 100644 index 0000000..0cee5b9 Binary files /dev/null and b/siro_admin/web/icons/Icon-192.png differ diff --git a/siro_admin/web/icons/Icon-512.png b/siro_admin/web/icons/Icon-512.png new file mode 100644 index 0000000..d5bf6f5 Binary files /dev/null and b/siro_admin/web/icons/Icon-512.png differ diff --git a/siro_admin/web/icons/Icon-maskable-192.png b/siro_admin/web/icons/Icon-maskable-192.png new file mode 100644 index 0000000..0cee5b9 Binary files /dev/null and b/siro_admin/web/icons/Icon-maskable-192.png differ diff --git a/siro_admin/web/icons/Icon-maskable-512.png b/siro_admin/web/icons/Icon-maskable-512.png new file mode 100644 index 0000000..d5bf6f5 Binary files /dev/null and b/siro_admin/web/icons/Icon-maskable-512.png differ diff --git a/siro_admin/web/index.html b/siro_admin/web/index.html new file mode 100644 index 0000000..2ba9792 --- /dev/null +++ b/siro_admin/web/index.html @@ -0,0 +1,38 @@ + + + + + + + + + + + + + + + + + + + + intaleq_admin + + + + + + diff --git a/siro_admin/web/manifest.json b/siro_admin/web/manifest.json new file mode 100644 index 0000000..2bdf774 --- /dev/null +++ b/siro_admin/web/manifest.json @@ -0,0 +1,35 @@ +{ + "name": "intaleq_admin", + "short_name": "intaleq_admin", + "start_url": ".", + "display": "standalone", + "background_color": "#ffffff", + "theme_color": "#000000", + "description": "A new Flutter project.", + "orientation": "portrait-primary", + "prefer_related_applications": false, + "icons": [ + { + "src": "icons/Icon-192.png", + "sizes": "192x192", + "type": "image/png" + }, + { + "src": "icons/Icon-512.png", + "sizes": "512x512", + "type": "image/png" + }, + { + "src": "icons/Icon-maskable-192.png", + "sizes": "192x192", + "type": "image/png", + "purpose": "maskable" + }, + { + "src": "icons/Icon-maskable-512.png", + "sizes": "512x512", + "type": "image/png", + "purpose": "maskable" + } + ] +} \ No newline at end of file diff --git a/siro_admin/windows/.gitignore b/siro_admin/windows/.gitignore new file mode 100644 index 0000000..d492d0d --- /dev/null +++ b/siro_admin/windows/.gitignore @@ -0,0 +1,17 @@ +flutter/ephemeral/ + +# Visual Studio user-specific files. +*.suo +*.user +*.userosscache +*.sln.docstates + +# Visual Studio build-related files. +x64/ +x86/ + +# Visual Studio cache files +# files ending in .cache can be ignored +*.[Cc]ache +# but keep track of directories ending in .cache +!*.[Cc]ache/ diff --git a/siro_admin/windows/CMakeLists.txt b/siro_admin/windows/CMakeLists.txt new file mode 100644 index 0000000..163ad76 --- /dev/null +++ b/siro_admin/windows/CMakeLists.txt @@ -0,0 +1,108 @@ +# Project-level configuration. +cmake_minimum_required(VERSION 3.14) +project(siro_admin LANGUAGES CXX) + +# The name of the executable created for the application. Change this to change +# the on-disk name of your application. +set(BINARY_NAME "siro_admin") + +# Explicitly opt in to modern CMake behaviors to avoid warnings with recent +# versions of CMake. +cmake_policy(VERSION 3.14...3.25) + +# Define build configuration option. +get_property(IS_MULTICONFIG GLOBAL PROPERTY GENERATOR_IS_MULTI_CONFIG) +if(IS_MULTICONFIG) + set(CMAKE_CONFIGURATION_TYPES "Debug;Profile;Release" + CACHE STRING "" FORCE) +else() + if(NOT CMAKE_BUILD_TYPE AND NOT CMAKE_CONFIGURATION_TYPES) + set(CMAKE_BUILD_TYPE "Debug" CACHE + STRING "Flutter build mode" FORCE) + set_property(CACHE CMAKE_BUILD_TYPE PROPERTY STRINGS + "Debug" "Profile" "Release") + endif() +endif() +# Define settings for the Profile build mode. +set(CMAKE_EXE_LINKER_FLAGS_PROFILE "${CMAKE_EXE_LINKER_FLAGS_RELEASE}") +set(CMAKE_SHARED_LINKER_FLAGS_PROFILE "${CMAKE_SHARED_LINKER_FLAGS_RELEASE}") +set(CMAKE_C_FLAGS_PROFILE "${CMAKE_C_FLAGS_RELEASE}") +set(CMAKE_CXX_FLAGS_PROFILE "${CMAKE_CXX_FLAGS_RELEASE}") + +# Use Unicode for all projects. +add_definitions(-DUNICODE -D_UNICODE) + +# Compilation settings that should be applied to most targets. +# +# Be cautious about adding new options here, as plugins use this function by +# default. In most cases, you should add new options to specific targets instead +# of modifying this function. +function(APPLY_STANDARD_SETTINGS TARGET) + target_compile_features(${TARGET} PUBLIC cxx_std_17) + target_compile_options(${TARGET} PRIVATE /W4 /WX /wd"4100") + target_compile_options(${TARGET} PRIVATE /EHsc) + target_compile_definitions(${TARGET} PRIVATE "_HAS_EXCEPTIONS=0") + target_compile_definitions(${TARGET} PRIVATE "$<$:_DEBUG>") +endfunction() + +# Flutter library and tool build rules. +set(FLUTTER_MANAGED_DIR "${CMAKE_CURRENT_SOURCE_DIR}/flutter") +add_subdirectory(${FLUTTER_MANAGED_DIR}) + +# Application build; see runner/CMakeLists.txt. +add_subdirectory("runner") + + +# Generated plugin build rules, which manage building the plugins and adding +# them to the application. +include(flutter/generated_plugins.cmake) + + +# === Installation === +# Support files are copied into place next to the executable, so that it can +# run in place. This is done instead of making a separate bundle (as on Linux) +# so that building and running from within Visual Studio will work. +set(BUILD_BUNDLE_DIR "$") +# Make the "install" step default, as it's required to run. +set(CMAKE_VS_INCLUDE_INSTALL_TO_DEFAULT_BUILD 1) +if(CMAKE_INSTALL_PREFIX_INITIALIZED_TO_DEFAULT) + set(CMAKE_INSTALL_PREFIX "${BUILD_BUNDLE_DIR}" CACHE PATH "..." FORCE) +endif() + +set(INSTALL_BUNDLE_DATA_DIR "${CMAKE_INSTALL_PREFIX}/data") +set(INSTALL_BUNDLE_LIB_DIR "${CMAKE_INSTALL_PREFIX}") + +install(TARGETS ${BINARY_NAME} RUNTIME DESTINATION "${CMAKE_INSTALL_PREFIX}" + COMPONENT Runtime) + +install(FILES "${FLUTTER_ICU_DATA_FILE}" DESTINATION "${INSTALL_BUNDLE_DATA_DIR}" + COMPONENT Runtime) + +install(FILES "${FLUTTER_LIBRARY}" DESTINATION "${INSTALL_BUNDLE_LIB_DIR}" + COMPONENT Runtime) + +if(PLUGIN_BUNDLED_LIBRARIES) + install(FILES "${PLUGIN_BUNDLED_LIBRARIES}" + DESTINATION "${INSTALL_BUNDLE_LIB_DIR}" + COMPONENT Runtime) +endif() + +# Copy the native assets provided by the build.dart from all packages. +set(NATIVE_ASSETS_DIR "${PROJECT_BUILD_DIR}native_assets/windows/") +install(DIRECTORY "${NATIVE_ASSETS_DIR}" + DESTINATION "${INSTALL_BUNDLE_LIB_DIR}" + COMPONENT Runtime) + +# Fully re-copy the assets directory on each build to avoid having stale files +# from a previous install. +set(FLUTTER_ASSET_DIR_NAME "flutter_assets") +install(CODE " + file(REMOVE_RECURSE \"${INSTALL_BUNDLE_DATA_DIR}/${FLUTTER_ASSET_DIR_NAME}\") + " COMPONENT Runtime) +install(DIRECTORY "${PROJECT_BUILD_DIR}/${FLUTTER_ASSET_DIR_NAME}" + DESTINATION "${INSTALL_BUNDLE_DATA_DIR}" COMPONENT Runtime) + +# Install the AOT library on non-Debug builds only. +install(FILES "${AOT_LIBRARY}" DESTINATION "${INSTALL_BUNDLE_DATA_DIR}" + CONFIGURATIONS Profile;Release + COMPONENT Runtime) diff --git a/siro_admin/windows/flutter/CMakeLists.txt b/siro_admin/windows/flutter/CMakeLists.txt new file mode 100644 index 0000000..903f489 --- /dev/null +++ b/siro_admin/windows/flutter/CMakeLists.txt @@ -0,0 +1,109 @@ +# This file controls Flutter-level build steps. It should not be edited. +cmake_minimum_required(VERSION 3.14) + +set(EPHEMERAL_DIR "${CMAKE_CURRENT_SOURCE_DIR}/ephemeral") + +# Configuration provided via flutter tool. +include(${EPHEMERAL_DIR}/generated_config.cmake) + +# TODO: Move the rest of this into files in ephemeral. See +# https://github.com/flutter/flutter/issues/57146. +set(WRAPPER_ROOT "${EPHEMERAL_DIR}/cpp_client_wrapper") + +# Set fallback configurations for older versions of the flutter tool. +if (NOT DEFINED FLUTTER_TARGET_PLATFORM) + set(FLUTTER_TARGET_PLATFORM "windows-x64") +endif() + +# === Flutter Library === +set(FLUTTER_LIBRARY "${EPHEMERAL_DIR}/flutter_windows.dll") + +# Published to parent scope for install step. +set(FLUTTER_LIBRARY ${FLUTTER_LIBRARY} PARENT_SCOPE) +set(FLUTTER_ICU_DATA_FILE "${EPHEMERAL_DIR}/icudtl.dat" PARENT_SCOPE) +set(PROJECT_BUILD_DIR "${PROJECT_DIR}/build/" PARENT_SCOPE) +set(AOT_LIBRARY "${PROJECT_DIR}/build/windows/app.so" PARENT_SCOPE) + +list(APPEND FLUTTER_LIBRARY_HEADERS + "flutter_export.h" + "flutter_windows.h" + "flutter_messenger.h" + "flutter_plugin_registrar.h" + "flutter_texture_registrar.h" +) +list(TRANSFORM FLUTTER_LIBRARY_HEADERS PREPEND "${EPHEMERAL_DIR}/") +add_library(flutter INTERFACE) +target_include_directories(flutter INTERFACE + "${EPHEMERAL_DIR}" +) +target_link_libraries(flutter INTERFACE "${FLUTTER_LIBRARY}.lib") +add_dependencies(flutter flutter_assemble) + +# === Wrapper === +list(APPEND CPP_WRAPPER_SOURCES_CORE + "core_implementations.cc" + "standard_codec.cc" +) +list(TRANSFORM CPP_WRAPPER_SOURCES_CORE PREPEND "${WRAPPER_ROOT}/") +list(APPEND CPP_WRAPPER_SOURCES_PLUGIN + "plugin_registrar.cc" +) +list(TRANSFORM CPP_WRAPPER_SOURCES_PLUGIN PREPEND "${WRAPPER_ROOT}/") +list(APPEND CPP_WRAPPER_SOURCES_APP + "flutter_engine.cc" + "flutter_view_controller.cc" +) +list(TRANSFORM CPP_WRAPPER_SOURCES_APP PREPEND "${WRAPPER_ROOT}/") + +# Wrapper sources needed for a plugin. +add_library(flutter_wrapper_plugin STATIC + ${CPP_WRAPPER_SOURCES_CORE} + ${CPP_WRAPPER_SOURCES_PLUGIN} +) +apply_standard_settings(flutter_wrapper_plugin) +set_target_properties(flutter_wrapper_plugin PROPERTIES + POSITION_INDEPENDENT_CODE ON) +set_target_properties(flutter_wrapper_plugin PROPERTIES + CXX_VISIBILITY_PRESET hidden) +target_link_libraries(flutter_wrapper_plugin PUBLIC flutter) +target_include_directories(flutter_wrapper_plugin PUBLIC + "${WRAPPER_ROOT}/include" +) +add_dependencies(flutter_wrapper_plugin flutter_assemble) + +# Wrapper sources needed for the runner. +add_library(flutter_wrapper_app STATIC + ${CPP_WRAPPER_SOURCES_CORE} + ${CPP_WRAPPER_SOURCES_APP} +) +apply_standard_settings(flutter_wrapper_app) +target_link_libraries(flutter_wrapper_app PUBLIC flutter) +target_include_directories(flutter_wrapper_app PUBLIC + "${WRAPPER_ROOT}/include" +) +add_dependencies(flutter_wrapper_app flutter_assemble) + +# === Flutter tool backend === +# _phony_ is a non-existent file to force this command to run every time, +# since currently there's no way to get a full input/output list from the +# flutter tool. +set(PHONY_OUTPUT "${CMAKE_CURRENT_BINARY_DIR}/_phony_") +set_source_files_properties("${PHONY_OUTPUT}" PROPERTIES SYMBOLIC TRUE) +add_custom_command( + OUTPUT ${FLUTTER_LIBRARY} ${FLUTTER_LIBRARY_HEADERS} + ${CPP_WRAPPER_SOURCES_CORE} ${CPP_WRAPPER_SOURCES_PLUGIN} + ${CPP_WRAPPER_SOURCES_APP} + ${PHONY_OUTPUT} + COMMAND ${CMAKE_COMMAND} -E env + ${FLUTTER_TOOL_ENVIRONMENT} + "${FLUTTER_ROOT}/packages/flutter_tools/bin/tool_backend.bat" + ${FLUTTER_TARGET_PLATFORM} $ + VERBATIM +) +add_custom_target(flutter_assemble DEPENDS + "${FLUTTER_LIBRARY}" + ${FLUTTER_LIBRARY_HEADERS} + ${CPP_WRAPPER_SOURCES_CORE} + ${CPP_WRAPPER_SOURCES_PLUGIN} + ${CPP_WRAPPER_SOURCES_APP} +) diff --git a/siro_admin/windows/flutter/generated_plugin_registrant.cc b/siro_admin/windows/flutter/generated_plugin_registrant.cc new file mode 100644 index 0000000..c1ddf6d --- /dev/null +++ b/siro_admin/windows/flutter/generated_plugin_registrant.cc @@ -0,0 +1,26 @@ +// +// Generated file. Do not edit. +// + +// clang-format off + +#include "generated_plugin_registrant.h" + +#include +#include +#include +#include +#include + +void RegisterPlugins(flutter::PluginRegistry* registry) { + FileSelectorWindowsRegisterWithRegistrar( + registry->GetRegistrarForPlugin("FileSelectorWindows")); + FirebaseCorePluginCApiRegisterWithRegistrar( + registry->GetRegistrarForPlugin("FirebaseCorePluginCApi")); + FlutterSecureStorageWindowsPluginRegisterWithRegistrar( + registry->GetRegistrarForPlugin("FlutterSecureStorageWindowsPlugin")); + LocalAuthPluginRegisterWithRegistrar( + registry->GetRegistrarForPlugin("LocalAuthPlugin")); + UrlLauncherWindowsRegisterWithRegistrar( + registry->GetRegistrarForPlugin("UrlLauncherWindows")); +} diff --git a/siro_admin/windows/flutter/generated_plugin_registrant.h b/siro_admin/windows/flutter/generated_plugin_registrant.h new file mode 100644 index 0000000..dc139d8 --- /dev/null +++ b/siro_admin/windows/flutter/generated_plugin_registrant.h @@ -0,0 +1,15 @@ +// +// Generated file. Do not edit. +// + +// clang-format off + +#ifndef GENERATED_PLUGIN_REGISTRANT_ +#define GENERATED_PLUGIN_REGISTRANT_ + +#include + +// Registers Flutter plugins. +void RegisterPlugins(flutter::PluginRegistry* registry); + +#endif // GENERATED_PLUGIN_REGISTRANT_ diff --git a/siro_admin/windows/flutter/generated_plugins.cmake b/siro_admin/windows/flutter/generated_plugins.cmake new file mode 100644 index 0000000..21c3cff --- /dev/null +++ b/siro_admin/windows/flutter/generated_plugins.cmake @@ -0,0 +1,29 @@ +# +# Generated file, do not edit. +# + +list(APPEND FLUTTER_PLUGIN_LIST + file_selector_windows + firebase_core + flutter_secure_storage_windows + local_auth_windows + url_launcher_windows +) + +list(APPEND FLUTTER_FFI_PLUGIN_LIST + jni +) + +set(PLUGIN_BUNDLED_LIBRARIES) + +foreach(plugin ${FLUTTER_PLUGIN_LIST}) + add_subdirectory(flutter/ephemeral/.plugin_symlinks/${plugin}/windows plugins/${plugin}) + target_link_libraries(${BINARY_NAME} PRIVATE ${plugin}_plugin) + list(APPEND PLUGIN_BUNDLED_LIBRARIES $) + list(APPEND PLUGIN_BUNDLED_LIBRARIES ${${plugin}_bundled_libraries}) +endforeach(plugin) + +foreach(ffi_plugin ${FLUTTER_FFI_PLUGIN_LIST}) + add_subdirectory(flutter/ephemeral/.plugin_symlinks/${ffi_plugin}/windows plugins/${ffi_plugin}) + list(APPEND PLUGIN_BUNDLED_LIBRARIES ${${ffi_plugin}_bundled_libraries}) +endforeach(ffi_plugin) diff --git a/siro_admin/windows/runner/CMakeLists.txt b/siro_admin/windows/runner/CMakeLists.txt new file mode 100644 index 0000000..394917c --- /dev/null +++ b/siro_admin/windows/runner/CMakeLists.txt @@ -0,0 +1,40 @@ +cmake_minimum_required(VERSION 3.14) +project(runner LANGUAGES CXX) + +# Define the application target. To change its name, change BINARY_NAME in the +# top-level CMakeLists.txt, not the value here, or `flutter run` will no longer +# work. +# +# Any new source files that you add to the application should be added here. +add_executable(${BINARY_NAME} WIN32 + "flutter_window.cpp" + "main.cpp" + "utils.cpp" + "win32_window.cpp" + "${FLUTTER_MANAGED_DIR}/generated_plugin_registrant.cc" + "Runner.rc" + "runner.exe.manifest" +) + +# Apply the standard set of build settings. This can be removed for applications +# that need different build settings. +apply_standard_settings(${BINARY_NAME}) + +# Add preprocessor definitions for the build version. +target_compile_definitions(${BINARY_NAME} PRIVATE "FLUTTER_VERSION=\"${FLUTTER_VERSION}\"") +target_compile_definitions(${BINARY_NAME} PRIVATE "FLUTTER_VERSION_MAJOR=${FLUTTER_VERSION_MAJOR}") +target_compile_definitions(${BINARY_NAME} PRIVATE "FLUTTER_VERSION_MINOR=${FLUTTER_VERSION_MINOR}") +target_compile_definitions(${BINARY_NAME} PRIVATE "FLUTTER_VERSION_PATCH=${FLUTTER_VERSION_PATCH}") +target_compile_definitions(${BINARY_NAME} PRIVATE "FLUTTER_VERSION_BUILD=${FLUTTER_VERSION_BUILD}") + +# Disable Windows macros that collide with C++ standard library functions. +target_compile_definitions(${BINARY_NAME} PRIVATE "NOMINMAX") + +# Add dependency libraries and include directories. Add any application-specific +# dependencies here. +target_link_libraries(${BINARY_NAME} PRIVATE flutter flutter_wrapper_app) +target_link_libraries(${BINARY_NAME} PRIVATE "dwmapi.lib") +target_include_directories(${BINARY_NAME} PRIVATE "${CMAKE_SOURCE_DIR}") + +# Run the Flutter tool portions of the build. This must not be removed. +add_dependencies(${BINARY_NAME} flutter_assemble) diff --git a/siro_admin/windows/runner/Runner.rc b/siro_admin/windows/runner/Runner.rc new file mode 100644 index 0000000..1bbad9b --- /dev/null +++ b/siro_admin/windows/runner/Runner.rc @@ -0,0 +1,121 @@ +// Microsoft Visual C++ generated resource script. +// +#pragma code_page(65001) +#include "resource.h" + +#define APSTUDIO_READONLY_SYMBOLS +///////////////////////////////////////////////////////////////////////////// +// +// Generated from the TEXTINCLUDE 2 resource. +// +#include "winres.h" + +///////////////////////////////////////////////////////////////////////////// +#undef APSTUDIO_READONLY_SYMBOLS + +///////////////////////////////////////////////////////////////////////////// +// English (United States) resources + +#if !defined(AFX_RESOURCE_DLL) || defined(AFX_TARG_ENU) +LANGUAGE LANG_ENGLISH, SUBLANG_ENGLISH_US + +#ifdef APSTUDIO_INVOKED +///////////////////////////////////////////////////////////////////////////// +// +// TEXTINCLUDE +// + +1 TEXTINCLUDE +BEGIN + "resource.h\0" +END + +2 TEXTINCLUDE +BEGIN + "#include ""winres.h""\r\n" + "\0" +END + +3 TEXTINCLUDE +BEGIN + "\r\n" + "\0" +END + +#endif // APSTUDIO_INVOKED + + +///////////////////////////////////////////////////////////////////////////// +// +// Icon +// + +// Icon with lowest ID value placed first to ensure application icon +// remains consistent on all systems. +IDI_APP_ICON ICON "resources\\app_icon.ico" + + +///////////////////////////////////////////////////////////////////////////// +// +// Version +// + +#if defined(FLUTTER_VERSION_MAJOR) && defined(FLUTTER_VERSION_MINOR) && defined(FLUTTER_VERSION_PATCH) && defined(FLUTTER_VERSION_BUILD) +#define VERSION_AS_NUMBER FLUTTER_VERSION_MAJOR,FLUTTER_VERSION_MINOR,FLUTTER_VERSION_PATCH,FLUTTER_VERSION_BUILD +#else +#define VERSION_AS_NUMBER 1,0,0,0 +#endif + +#if defined(FLUTTER_VERSION) +#define VERSION_AS_STRING FLUTTER_VERSION +#else +#define VERSION_AS_STRING "1.0.0" +#endif + +VS_VERSION_INFO VERSIONINFO + FILEVERSION VERSION_AS_NUMBER + PRODUCTVERSION VERSION_AS_NUMBER + FILEFLAGSMASK VS_FFI_FILEFLAGSMASK +#ifdef _DEBUG + FILEFLAGS VS_FF_DEBUG +#else + FILEFLAGS 0x0L +#endif + FILEOS VOS__WINDOWS32 + FILETYPE VFT_APP + FILESUBTYPE 0x0L +BEGIN + BLOCK "StringFileInfo" + BEGIN + BLOCK "040904e4" + BEGIN + VALUE "CompanyName", "com.siro" "\0" + VALUE "FileDescription", "siro_admin" "\0" + VALUE "FileVersion", VERSION_AS_STRING "\0" + VALUE "InternalName", "siro_admin" "\0" + VALUE "LegalCopyright", "Copyright (C) 2026 com.siro. All rights reserved." "\0" + VALUE "OriginalFilename", "siro_admin.exe" "\0" + VALUE "ProductName", "siro_admin" "\0" + VALUE "ProductVersion", VERSION_AS_STRING "\0" + END + END + BLOCK "VarFileInfo" + BEGIN + VALUE "Translation", 0x409, 1252 + END +END + +#endif // English (United States) resources +///////////////////////////////////////////////////////////////////////////// + + + +#ifndef APSTUDIO_INVOKED +///////////////////////////////////////////////////////////////////////////// +// +// Generated from the TEXTINCLUDE 3 resource. +// + + +///////////////////////////////////////////////////////////////////////////// +#endif // not APSTUDIO_INVOKED diff --git a/siro_admin/windows/runner/flutter_window.cpp b/siro_admin/windows/runner/flutter_window.cpp new file mode 100644 index 0000000..955ee30 --- /dev/null +++ b/siro_admin/windows/runner/flutter_window.cpp @@ -0,0 +1,71 @@ +#include "flutter_window.h" + +#include + +#include "flutter/generated_plugin_registrant.h" + +FlutterWindow::FlutterWindow(const flutter::DartProject& project) + : project_(project) {} + +FlutterWindow::~FlutterWindow() {} + +bool FlutterWindow::OnCreate() { + if (!Win32Window::OnCreate()) { + return false; + } + + RECT frame = GetClientArea(); + + // The size here must match the window dimensions to avoid unnecessary surface + // creation / destruction in the startup path. + flutter_controller_ = std::make_unique( + frame.right - frame.left, frame.bottom - frame.top, project_); + // Ensure that basic setup of the controller was successful. + if (!flutter_controller_->engine() || !flutter_controller_->view()) { + return false; + } + RegisterPlugins(flutter_controller_->engine()); + SetChildContent(flutter_controller_->view()->GetNativeWindow()); + + flutter_controller_->engine()->SetNextFrameCallback([&]() { + this->Show(); + }); + + // Flutter can complete the first frame before the "show window" callback is + // registered. The following call ensures a frame is pending to ensure the + // window is shown. It is a no-op if the first frame hasn't completed yet. + flutter_controller_->ForceRedraw(); + + return true; +} + +void FlutterWindow::OnDestroy() { + if (flutter_controller_) { + flutter_controller_ = nullptr; + } + + Win32Window::OnDestroy(); +} + +LRESULT +FlutterWindow::MessageHandler(HWND hwnd, UINT const message, + WPARAM const wparam, + LPARAM const lparam) noexcept { + // Give Flutter, including plugins, an opportunity to handle window messages. + if (flutter_controller_) { + std::optional result = + flutter_controller_->HandleTopLevelWindowProc(hwnd, message, wparam, + lparam); + if (result) { + return *result; + } + } + + switch (message) { + case WM_FONTCHANGE: + flutter_controller_->engine()->ReloadSystemFonts(); + break; + } + + return Win32Window::MessageHandler(hwnd, message, wparam, lparam); +} diff --git a/siro_admin/windows/runner/flutter_window.h b/siro_admin/windows/runner/flutter_window.h new file mode 100644 index 0000000..6da0652 --- /dev/null +++ b/siro_admin/windows/runner/flutter_window.h @@ -0,0 +1,33 @@ +#ifndef RUNNER_FLUTTER_WINDOW_H_ +#define RUNNER_FLUTTER_WINDOW_H_ + +#include +#include + +#include + +#include "win32_window.h" + +// A window that does nothing but host a Flutter view. +class FlutterWindow : public Win32Window { + public: + // Creates a new FlutterWindow hosting a Flutter view running |project|. + explicit FlutterWindow(const flutter::DartProject& project); + virtual ~FlutterWindow(); + + protected: + // Win32Window: + bool OnCreate() override; + void OnDestroy() override; + LRESULT MessageHandler(HWND window, UINT const message, WPARAM const wparam, + LPARAM const lparam) noexcept override; + + private: + // The project to run. + flutter::DartProject project_; + + // The Flutter instance hosted by this window. + std::unique_ptr flutter_controller_; +}; + +#endif // RUNNER_FLUTTER_WINDOW_H_ diff --git a/siro_admin/windows/runner/main.cpp b/siro_admin/windows/runner/main.cpp new file mode 100644 index 0000000..547bbf4 --- /dev/null +++ b/siro_admin/windows/runner/main.cpp @@ -0,0 +1,43 @@ +#include +#include +#include + +#include "flutter_window.h" +#include "utils.h" + +int APIENTRY wWinMain(_In_ HINSTANCE instance, _In_opt_ HINSTANCE prev, + _In_ wchar_t *command_line, _In_ int show_command) { + // Attach to console when present (e.g., 'flutter run') or create a + // new console when running with a debugger. + if (!::AttachConsole(ATTACH_PARENT_PROCESS) && ::IsDebuggerPresent()) { + CreateAndAttachConsole(); + } + + // Initialize COM, so that it is available for use in the library and/or + // plugins. + ::CoInitializeEx(nullptr, COINIT_APARTMENTTHREADED); + + flutter::DartProject project(L"data"); + + std::vector command_line_arguments = + GetCommandLineArguments(); + + project.set_dart_entrypoint_arguments(std::move(command_line_arguments)); + + FlutterWindow window(project); + Win32Window::Point origin(10, 10); + Win32Window::Size size(1280, 720); + if (!window.Create(L"siro_admin", origin, size)) { + return EXIT_FAILURE; + } + window.SetQuitOnClose(true); + + ::MSG msg; + while (::GetMessage(&msg, nullptr, 0, 0)) { + ::TranslateMessage(&msg); + ::DispatchMessage(&msg); + } + + ::CoUninitialize(); + return EXIT_SUCCESS; +} diff --git a/siro_admin/windows/runner/resource.h b/siro_admin/windows/runner/resource.h new file mode 100644 index 0000000..66a65d1 --- /dev/null +++ b/siro_admin/windows/runner/resource.h @@ -0,0 +1,16 @@ +//{{NO_DEPENDENCIES}} +// Microsoft Visual C++ generated include file. +// Used by Runner.rc +// +#define IDI_APP_ICON 101 + +// Next default values for new objects +// +#ifdef APSTUDIO_INVOKED +#ifndef APSTUDIO_READONLY_SYMBOLS +#define _APS_NEXT_RESOURCE_VALUE 102 +#define _APS_NEXT_COMMAND_VALUE 40001 +#define _APS_NEXT_CONTROL_VALUE 1001 +#define _APS_NEXT_SYMED_VALUE 101 +#endif +#endif diff --git a/siro_admin/windows/runner/resources/app_icon.ico b/siro_admin/windows/runner/resources/app_icon.ico new file mode 100644 index 0000000..c04e20c Binary files /dev/null and b/siro_admin/windows/runner/resources/app_icon.ico differ diff --git a/siro_admin/windows/runner/runner.exe.manifest b/siro_admin/windows/runner/runner.exe.manifest new file mode 100644 index 0000000..153653e --- /dev/null +++ b/siro_admin/windows/runner/runner.exe.manifest @@ -0,0 +1,14 @@ + + + + + PerMonitorV2 + + + + + + + + + diff --git a/siro_admin/windows/runner/utils.cpp b/siro_admin/windows/runner/utils.cpp new file mode 100644 index 0000000..3a0b465 --- /dev/null +++ b/siro_admin/windows/runner/utils.cpp @@ -0,0 +1,65 @@ +#include "utils.h" + +#include +#include +#include +#include + +#include + +void CreateAndAttachConsole() { + if (::AllocConsole()) { + FILE *unused; + if (freopen_s(&unused, "CONOUT$", "w", stdout)) { + _dup2(_fileno(stdout), 1); + } + if (freopen_s(&unused, "CONOUT$", "w", stderr)) { + _dup2(_fileno(stdout), 2); + } + std::ios::sync_with_stdio(); + FlutterDesktopResyncOutputStreams(); + } +} + +std::vector GetCommandLineArguments() { + // Convert the UTF-16 command line arguments to UTF-8 for the Engine to use. + int argc; + wchar_t** argv = ::CommandLineToArgvW(::GetCommandLineW(), &argc); + if (argv == nullptr) { + return std::vector(); + } + + std::vector command_line_arguments; + + // Skip the first argument as it's the binary name. + for (int i = 1; i < argc; i++) { + command_line_arguments.push_back(Utf8FromUtf16(argv[i])); + } + + ::LocalFree(argv); + + return command_line_arguments; +} + +std::string Utf8FromUtf16(const wchar_t* utf16_string) { + if (utf16_string == nullptr) { + return std::string(); + } + unsigned int target_length = ::WideCharToMultiByte( + CP_UTF8, WC_ERR_INVALID_CHARS, utf16_string, + -1, nullptr, 0, nullptr, nullptr) + -1; // remove the trailing null character + int input_length = (int)wcslen(utf16_string); + std::string utf8_string; + if (target_length == 0 || target_length > utf8_string.max_size()) { + return utf8_string; + } + utf8_string.resize(target_length); + int converted_length = ::WideCharToMultiByte( + CP_UTF8, WC_ERR_INVALID_CHARS, utf16_string, + input_length, utf8_string.data(), target_length, nullptr, nullptr); + if (converted_length == 0) { + return std::string(); + } + return utf8_string; +} diff --git a/siro_admin/windows/runner/utils.h b/siro_admin/windows/runner/utils.h new file mode 100644 index 0000000..3879d54 --- /dev/null +++ b/siro_admin/windows/runner/utils.h @@ -0,0 +1,19 @@ +#ifndef RUNNER_UTILS_H_ +#define RUNNER_UTILS_H_ + +#include +#include + +// Creates a console for the process, and redirects stdout and stderr to +// it for both the runner and the Flutter library. +void CreateAndAttachConsole(); + +// Takes a null-terminated wchar_t* encoded in UTF-16 and returns a std::string +// encoded in UTF-8. Returns an empty std::string on failure. +std::string Utf8FromUtf16(const wchar_t* utf16_string); + +// Gets the command line arguments passed in as a std::vector, +// encoded in UTF-8. Returns an empty std::vector on failure. +std::vector GetCommandLineArguments(); + +#endif // RUNNER_UTILS_H_ diff --git a/siro_admin/windows/runner/win32_window.cpp b/siro_admin/windows/runner/win32_window.cpp new file mode 100644 index 0000000..60608d0 --- /dev/null +++ b/siro_admin/windows/runner/win32_window.cpp @@ -0,0 +1,288 @@ +#include "win32_window.h" + +#include +#include + +#include "resource.h" + +namespace { + +/// Window attribute that enables dark mode window decorations. +/// +/// Redefined in case the developer's machine has a Windows SDK older than +/// version 10.0.22000.0. +/// See: https://docs.microsoft.com/windows/win32/api/dwmapi/ne-dwmapi-dwmwindowattribute +#ifndef DWMWA_USE_IMMERSIVE_DARK_MODE +#define DWMWA_USE_IMMERSIVE_DARK_MODE 20 +#endif + +constexpr const wchar_t kWindowClassName[] = L"FLUTTER_RUNNER_WIN32_WINDOW"; + +/// Registry key for app theme preference. +/// +/// A value of 0 indicates apps should use dark mode. A non-zero or missing +/// value indicates apps should use light mode. +constexpr const wchar_t kGetPreferredBrightnessRegKey[] = + L"Software\\Microsoft\\Windows\\CurrentVersion\\Themes\\Personalize"; +constexpr const wchar_t kGetPreferredBrightnessRegValue[] = L"AppsUseLightTheme"; + +// The number of Win32Window objects that currently exist. +static int g_active_window_count = 0; + +using EnableNonClientDpiScaling = BOOL __stdcall(HWND hwnd); + +// Scale helper to convert logical scaler values to physical using passed in +// scale factor +int Scale(int source, double scale_factor) { + return static_cast(source * scale_factor); +} + +// Dynamically loads the |EnableNonClientDpiScaling| from the User32 module. +// This API is only needed for PerMonitor V1 awareness mode. +void EnableFullDpiSupportIfAvailable(HWND hwnd) { + HMODULE user32_module = LoadLibraryA("User32.dll"); + if (!user32_module) { + return; + } + auto enable_non_client_dpi_scaling = + reinterpret_cast( + GetProcAddress(user32_module, "EnableNonClientDpiScaling")); + if (enable_non_client_dpi_scaling != nullptr) { + enable_non_client_dpi_scaling(hwnd); + } + FreeLibrary(user32_module); +} + +} // namespace + +// Manages the Win32Window's window class registration. +class WindowClassRegistrar { + public: + ~WindowClassRegistrar() = default; + + // Returns the singleton registrar instance. + static WindowClassRegistrar* GetInstance() { + if (!instance_) { + instance_ = new WindowClassRegistrar(); + } + return instance_; + } + + // Returns the name of the window class, registering the class if it hasn't + // previously been registered. + const wchar_t* GetWindowClass(); + + // Unregisters the window class. Should only be called if there are no + // instances of the window. + void UnregisterWindowClass(); + + private: + WindowClassRegistrar() = default; + + static WindowClassRegistrar* instance_; + + bool class_registered_ = false; +}; + +WindowClassRegistrar* WindowClassRegistrar::instance_ = nullptr; + +const wchar_t* WindowClassRegistrar::GetWindowClass() { + if (!class_registered_) { + WNDCLASS window_class{}; + window_class.hCursor = LoadCursor(nullptr, IDC_ARROW); + window_class.lpszClassName = kWindowClassName; + window_class.style = CS_HREDRAW | CS_VREDRAW; + window_class.cbClsExtra = 0; + window_class.cbWndExtra = 0; + window_class.hInstance = GetModuleHandle(nullptr); + window_class.hIcon = + LoadIcon(window_class.hInstance, MAKEINTRESOURCE(IDI_APP_ICON)); + window_class.hbrBackground = 0; + window_class.lpszMenuName = nullptr; + window_class.lpfnWndProc = Win32Window::WndProc; + RegisterClass(&window_class); + class_registered_ = true; + } + return kWindowClassName; +} + +void WindowClassRegistrar::UnregisterWindowClass() { + UnregisterClass(kWindowClassName, nullptr); + class_registered_ = false; +} + +Win32Window::Win32Window() { + ++g_active_window_count; +} + +Win32Window::~Win32Window() { + --g_active_window_count; + Destroy(); +} + +bool Win32Window::Create(const std::wstring& title, + const Point& origin, + const Size& size) { + Destroy(); + + const wchar_t* window_class = + WindowClassRegistrar::GetInstance()->GetWindowClass(); + + const POINT target_point = {static_cast(origin.x), + static_cast(origin.y)}; + HMONITOR monitor = MonitorFromPoint(target_point, MONITOR_DEFAULTTONEAREST); + UINT dpi = FlutterDesktopGetDpiForMonitor(monitor); + double scale_factor = dpi / 96.0; + + HWND window = CreateWindow( + window_class, title.c_str(), WS_OVERLAPPEDWINDOW, + Scale(origin.x, scale_factor), Scale(origin.y, scale_factor), + Scale(size.width, scale_factor), Scale(size.height, scale_factor), + nullptr, nullptr, GetModuleHandle(nullptr), this); + + if (!window) { + return false; + } + + UpdateTheme(window); + + return OnCreate(); +} + +bool Win32Window::Show() { + return ShowWindow(window_handle_, SW_SHOWNORMAL); +} + +// static +LRESULT CALLBACK Win32Window::WndProc(HWND const window, + UINT const message, + WPARAM const wparam, + LPARAM const lparam) noexcept { + if (message == WM_NCCREATE) { + auto window_struct = reinterpret_cast(lparam); + SetWindowLongPtr(window, GWLP_USERDATA, + reinterpret_cast(window_struct->lpCreateParams)); + + auto that = static_cast(window_struct->lpCreateParams); + EnableFullDpiSupportIfAvailable(window); + that->window_handle_ = window; + } else if (Win32Window* that = GetThisFromHandle(window)) { + return that->MessageHandler(window, message, wparam, lparam); + } + + return DefWindowProc(window, message, wparam, lparam); +} + +LRESULT +Win32Window::MessageHandler(HWND hwnd, + UINT const message, + WPARAM const wparam, + LPARAM const lparam) noexcept { + switch (message) { + case WM_DESTROY: + window_handle_ = nullptr; + Destroy(); + if (quit_on_close_) { + PostQuitMessage(0); + } + return 0; + + case WM_DPICHANGED: { + auto newRectSize = reinterpret_cast(lparam); + LONG newWidth = newRectSize->right - newRectSize->left; + LONG newHeight = newRectSize->bottom - newRectSize->top; + + SetWindowPos(hwnd, nullptr, newRectSize->left, newRectSize->top, newWidth, + newHeight, SWP_NOZORDER | SWP_NOACTIVATE); + + return 0; + } + case WM_SIZE: { + RECT rect = GetClientArea(); + if (child_content_ != nullptr) { + // Size and position the child window. + MoveWindow(child_content_, rect.left, rect.top, rect.right - rect.left, + rect.bottom - rect.top, TRUE); + } + return 0; + } + + case WM_ACTIVATE: + if (child_content_ != nullptr) { + SetFocus(child_content_); + } + return 0; + + case WM_DWMCOLORIZATIONCOLORCHANGED: + UpdateTheme(hwnd); + return 0; + } + + return DefWindowProc(window_handle_, message, wparam, lparam); +} + +void Win32Window::Destroy() { + OnDestroy(); + + if (window_handle_) { + DestroyWindow(window_handle_); + window_handle_ = nullptr; + } + if (g_active_window_count == 0) { + WindowClassRegistrar::GetInstance()->UnregisterWindowClass(); + } +} + +Win32Window* Win32Window::GetThisFromHandle(HWND const window) noexcept { + return reinterpret_cast( + GetWindowLongPtr(window, GWLP_USERDATA)); +} + +void Win32Window::SetChildContent(HWND content) { + child_content_ = content; + SetParent(content, window_handle_); + RECT frame = GetClientArea(); + + MoveWindow(content, frame.left, frame.top, frame.right - frame.left, + frame.bottom - frame.top, true); + + SetFocus(child_content_); +} + +RECT Win32Window::GetClientArea() { + RECT frame; + GetClientRect(window_handle_, &frame); + return frame; +} + +HWND Win32Window::GetHandle() { + return window_handle_; +} + +void Win32Window::SetQuitOnClose(bool quit_on_close) { + quit_on_close_ = quit_on_close; +} + +bool Win32Window::OnCreate() { + // No-op; provided for subclasses. + return true; +} + +void Win32Window::OnDestroy() { + // No-op; provided for subclasses. +} + +void Win32Window::UpdateTheme(HWND const window) { + DWORD light_mode; + DWORD light_mode_size = sizeof(light_mode); + LSTATUS result = RegGetValue(HKEY_CURRENT_USER, kGetPreferredBrightnessRegKey, + kGetPreferredBrightnessRegValue, + RRF_RT_REG_DWORD, nullptr, &light_mode, + &light_mode_size); + + if (result == ERROR_SUCCESS) { + BOOL enable_dark_mode = light_mode == 0; + DwmSetWindowAttribute(window, DWMWA_USE_IMMERSIVE_DARK_MODE, + &enable_dark_mode, sizeof(enable_dark_mode)); + } +} diff --git a/siro_admin/windows/runner/win32_window.h b/siro_admin/windows/runner/win32_window.h new file mode 100644 index 0000000..e901dde --- /dev/null +++ b/siro_admin/windows/runner/win32_window.h @@ -0,0 +1,102 @@ +#ifndef RUNNER_WIN32_WINDOW_H_ +#define RUNNER_WIN32_WINDOW_H_ + +#include + +#include +#include +#include + +// A class abstraction for a high DPI-aware Win32 Window. Intended to be +// inherited from by classes that wish to specialize with custom +// rendering and input handling +class Win32Window { + public: + struct Point { + unsigned int x; + unsigned int y; + Point(unsigned int x, unsigned int y) : x(x), y(y) {} + }; + + struct Size { + unsigned int width; + unsigned int height; + Size(unsigned int width, unsigned int height) + : width(width), height(height) {} + }; + + Win32Window(); + virtual ~Win32Window(); + + // Creates a win32 window with |title| that is positioned and sized using + // |origin| and |size|. New windows are created on the default monitor. Window + // sizes are specified to the OS in physical pixels, hence to ensure a + // consistent size this function will scale the inputted width and height as + // as appropriate for the default monitor. The window is invisible until + // |Show| is called. Returns true if the window was created successfully. + bool Create(const std::wstring& title, const Point& origin, const Size& size); + + // Show the current window. Returns true if the window was successfully shown. + bool Show(); + + // Release OS resources associated with window. + void Destroy(); + + // Inserts |content| into the window tree. + void SetChildContent(HWND content); + + // Returns the backing Window handle to enable clients to set icon and other + // window properties. Returns nullptr if the window has been destroyed. + HWND GetHandle(); + + // If true, closing this window will quit the application. + void SetQuitOnClose(bool quit_on_close); + + // Return a RECT representing the bounds of the current client area. + RECT GetClientArea(); + + protected: + // Processes and route salient window messages for mouse handling, + // size change and DPI. Delegates handling of these to member overloads that + // inheriting classes can handle. + virtual LRESULT MessageHandler(HWND window, + UINT const message, + WPARAM const wparam, + LPARAM const lparam) noexcept; + + // Called when CreateAndShow is called, allowing subclass window-related + // setup. Subclasses should return false if setup fails. + virtual bool OnCreate(); + + // Called when Destroy is called. + virtual void OnDestroy(); + + private: + friend class WindowClassRegistrar; + + // OS callback called by message pump. Handles the WM_NCCREATE message which + // is passed when the non-client area is being created and enables automatic + // non-client DPI scaling so that the non-client area automatically + // responds to changes in DPI. All other messages are handled by + // MessageHandler. + static LRESULT CALLBACK WndProc(HWND const window, + UINT const message, + WPARAM const wparam, + LPARAM const lparam) noexcept; + + // Retrieves a class instance pointer for |window| + static Win32Window* GetThisFromHandle(HWND const window) noexcept; + + // Update the window frame's theme to match the system theme. + static void UpdateTheme(HWND const window); + + bool quit_on_close_ = false; + + // window handle for top level window. + HWND window_handle_ = nullptr; + + // window handle for hosted content. + HWND child_content_ = nullptr; +}; + +#endif // RUNNER_WIN32_WINDOW_H_ diff --git a/siro_driver/.gitignore b/siro_driver/.gitignore new file mode 100644 index 0000000..3820a95 --- /dev/null +++ b/siro_driver/.gitignore @@ -0,0 +1,45 @@ +# Miscellaneous +*.class +*.log +*.pyc +*.swp +.DS_Store +.atom/ +.build/ +.buildlog/ +.history +.svn/ +.swiftpm/ +migrate_working_dir/ + +# IntelliJ related +*.iml +*.ipr +*.iws +.idea/ + +# The .vscode folder contains launch configuration and tasks you configure in +# VS Code which you may wish to be included in version control, so this line +# is commented out by default. +#.vscode/ + +# Flutter/Dart/Pub related +**/doc/api/ +**/ios/Flutter/.last_build_id +.dart_tool/ +.flutter-plugins-dependencies +.pub-cache/ +.pub/ +/build/ +/coverage/ + +# Symbolication related +app.*.symbols + +# Obfuscation related +app.*.map.json + +# Android Studio will place build artifacts here +/android/app/debug +/android/app/profile +/android/app/release diff --git a/siro_driver/.metadata b/siro_driver/.metadata new file mode 100644 index 0000000..c0fe018 --- /dev/null +++ b/siro_driver/.metadata @@ -0,0 +1,45 @@ +# This file tracks properties of this Flutter project. +# Used by Flutter tool to assess capabilities and perform upgrades etc. +# +# This file should be version controlled and should not be manually edited. + +version: + revision: "90673a4eef275d1a6692c26ac80d6d746d41a73a" + channel: "stable" + +project_type: app + +# Tracks metadata for the flutter migrate command +migration: + platforms: + - platform: root + create_revision: 90673a4eef275d1a6692c26ac80d6d746d41a73a + base_revision: 90673a4eef275d1a6692c26ac80d6d746d41a73a + - platform: android + create_revision: 90673a4eef275d1a6692c26ac80d6d746d41a73a + base_revision: 90673a4eef275d1a6692c26ac80d6d746d41a73a + - platform: ios + create_revision: 90673a4eef275d1a6692c26ac80d6d746d41a73a + base_revision: 90673a4eef275d1a6692c26ac80d6d746d41a73a + - platform: linux + create_revision: 90673a4eef275d1a6692c26ac80d6d746d41a73a + base_revision: 90673a4eef275d1a6692c26ac80d6d746d41a73a + - platform: macos + create_revision: 90673a4eef275d1a6692c26ac80d6d746d41a73a + base_revision: 90673a4eef275d1a6692c26ac80d6d746d41a73a + - platform: web + create_revision: 90673a4eef275d1a6692c26ac80d6d746d41a73a + base_revision: 90673a4eef275d1a6692c26ac80d6d746d41a73a + - platform: windows + create_revision: 90673a4eef275d1a6692c26ac80d6d746d41a73a + base_revision: 90673a4eef275d1a6692c26ac80d6d746d41a73a + + # User provided section + + # List of Local paths (relative to this file) that should be + # ignored by the migrate tool. + # + # Files that are not part of the templates will be ignored by default. + unmanaged_files: + - 'lib/main.dart' + - 'ios/Runner.xcodeproj/project.pbxproj' diff --git a/siro_driver/README.md b/siro_driver/README.md new file mode 100644 index 0000000..bac9f0c --- /dev/null +++ b/siro_driver/README.md @@ -0,0 +1,17 @@ +# siro_driver + +A new Flutter project. + +## Getting Started + +This project is a starting point for a Flutter application. + +A few resources to get you started if this is your first Flutter project: + +- [Learn Flutter](https://docs.flutter.dev/get-started/learn-flutter) +- [Write your first Flutter app](https://docs.flutter.dev/get-started/codelab) +- [Flutter learning resources](https://docs.flutter.dev/reference/learning-resources) + +For help getting started with Flutter development, view the +[online documentation](https://docs.flutter.dev/), which offers tutorials, +samples, guidance on mobile development, and a full API reference. diff --git a/siro_driver/analysis_options.yaml b/siro_driver/analysis_options.yaml new file mode 100644 index 0000000..0d29021 --- /dev/null +++ b/siro_driver/analysis_options.yaml @@ -0,0 +1,28 @@ +# This file configures the analyzer, which statically analyzes Dart code to +# check for errors, warnings, and lints. +# +# The issues identified by the analyzer are surfaced in the UI of Dart-enabled +# IDEs (https://dart.dev/tools#ides-and-editors). The analyzer can also be +# invoked from the command line by running `flutter analyze`. + +# The following line activates a set of recommended lints for Flutter apps, +# packages, and plugins designed to encourage good coding practices. +include: package:flutter_lints/flutter.yaml + +linter: + # The lint rules applied to this project can be customized in the + # section below to disable rules from the `package:flutter_lints/flutter.yaml` + # included above or to enable additional rules. A list of all available lints + # and their documentation is published at https://dart.dev/lints. + # + # Instead of disabling a lint rule for the entire project in the + # section below, it can also be suppressed for a single line of code + # or a specific dart file by using the `// ignore: name_of_lint` and + # `// ignore_for_file: name_of_lint` syntax on the line or in the file + # producing the lint. + rules: + # avoid_print: false # Uncomment to disable the `avoid_print` rule + # prefer_single_quotes: true # Uncomment to enable the `prefer_single_quotes` rule + +# Additional information about this file can be found at +# https://dart.dev/guides/language/analysis-options diff --git a/siro_driver/analyze_report.txt b/siro_driver/analyze_report.txt new file mode 100644 index 0000000..82e23f5 --- /dev/null +++ b/siro_driver/analyze_report.txt @@ -0,0 +1,1018 @@ +Analyzing siro_driver... + + error - trip_overlay_plugin/example/integration_test/plugin_integration_test.dart:11:8 - Target of URI doesn't exist: 'package:integration_test/integration_test.dart'. Try creating the file referenced by the URI, or try using a URI for a file that does exist. - uri_does_not_exist + error - trip_overlay_plugin/example/integration_test/plugin_integration_test.dart:16:3 - Undefined name 'IntegrationTestWidgetsFlutterBinding'. Try correcting the name to one that is defined, or defining the name. - undefined_identifier + error - trip_overlay_plugin/example/test/widget_test.dart:11:8 - Target of URI doesn't exist: 'package:trip_overlay_plugin_example/main.dart'. Try creating the file referenced by the URI, or try using a URI for a file that does exist. - uri_does_not_exist + error - trip_overlay_plugin/example/test/widget_test.dart:16:35 - The name 'MyApp' isn't a class. Try correcting the name to match an existing class. - creation_with_non_type +warning - lib/controller/auth/captin/invit_controller.dart:107:48 - The left operand can't be null, so the right operand is never executed. Try removing the operator and the right operand. - dead_null_aware_expression +warning - lib/controller/auth/captin/login_captin_controller.dart:28:8 - Unused import: '../../firebase/firbase_messge.dart'. Try removing the import directive. - unused_import +warning - lib/controller/auth/captin/login_captin_controller.dart:33:8 - Unused import: '../../functions/secure_storage.dart'. Try removing the import directive. - unused_import +warning - lib/controller/auth/captin/login_captin_controller.dart:34:8 - Unused import: '../../functions/security_checks.dart'. Try removing the import directive. - unused_import +warning - lib/controller/auth/captin/login_captin_controller.dart:47:30 - The value of the field '_storage' isn't used. Try removing the field, or using it. - unused_field +warning - lib/controller/auth/captin/ml_google_doc.dart:1:8 - Unused import: 'dart:io'. Try removing the import directive. - unused_import +warning - lib/controller/auth/captin/ml_google_doc.dart:3:8 - Unused import: 'package:get/get.dart'. Try removing the import directive. - unused_import +warning - lib/controller/auth/captin/ml_google_doc.dart:5:8 - Unused import: 'package:image_cropper/image_cropper.dart'. Try removing the import directive. - unused_import +warning - lib/controller/auth/captin/ml_google_doc.dart:6:8 - Unused import: 'package:image_picker/image_picker.dart'. Try removing the import directive. - unused_import +warning - lib/controller/auth/captin/ml_google_doc.dart:7:8 - Unused import: 'package:siro_driver/constant/colors.dart'. Try removing the import directive. - unused_import +warning - lib/controller/auth/captin/ml_google_doc.dart:8:8 - Unused import: 'package:siro_driver/controller/functions/llama_ai.dart'. Try removing the import directive. - unused_import +warning - lib/controller/auth/captin/opt_token_controller.dart:11:8 - Unused import: '../../firebase/firbase_messge.dart'. Try removing the import directive. - unused_import +warning - lib/controller/auth/captin/register_captin_controller.dart:97:24 - The value of the local variable 'smsEgyptController' isn't used. Try removing the variable or using it. - unused_local_variable +warning - lib/controller/auth/captin/register_captin_controller.dart:223:8 - The declaration '_isPhoneVerified' isn't referenced. Try removing the declaration of '_isPhoneVerified'. - unused_element +warning - lib/controller/auth/captin/register_captin_controller.dart:228:3 - The declaration '_handleAlreadyVerified' isn't referenced. Try removing the declaration of '_handleAlreadyVerified'. - unused_element +warning - lib/controller/auth/captin/register_captin_controller.dart:239:3 - The declaration '_sendOtpAndSms' isn't referenced. Try removing the declaration of '_sendOtpAndSms'. - unused_element +warning - lib/controller/auth/google_sign.dart:12:8 - Unused import: '../functions/add_error.dart'. Try removing the import directive. - unused_import +warning - lib/controller/auth/google_sign.dart:13:8 - Unused import: '../functions/encrypt_decrypt.dart'. Try removing the import directive. - unused_import +warning - lib/controller/auth/google_sign.dart:73:46 - The left operand can't be null, so the right operand is never executed. Try removing the operator and the right operand. - dead_null_aware_expression +warning - lib/controller/auth/google_sign.dart:74:52 - The left operand can't be null, so the right operand is never executed. Try removing the operator and the right operand. - dead_null_aware_expression +warning - lib/controller/auth/login_controller.dart:15:8 - Unused import: '../functions/encrypt_decrypt.dart'. Try removing the import directive. - unused_import +warning - lib/controller/auth/login_controller.dart:27:30 - The value of the field '_storage' isn't used. Try removing the field, or using it. - unused_field +warning - lib/controller/auth/syria/registration_controller.dart:9:8 - Unused import: 'package:path/path.dart'. Try removing the import directive. - unused_import +warning - lib/controller/auth/syria/registration_controller.dart:200:19 - The operand can't be 'null', so the condition is always 'true'. Remove the condition. - unnecessary_null_comparison +warning - lib/controller/auth/syria/registration_controller.dart:259:8 - The declaration '_addField' isn't referenced. Try removing the declaration of '_addField'. - unused_element +warning - lib/controller/auth/syria/registration_controller.dart:466:13 - The value of the local variable 'fileName' isn't used. Try removing the variable or using it. - unused_local_variable +warning - lib/controller/auth/syria/registration_controller.dart:520:13 - The value of the local variable 'hmac' isn't used. Try removing the variable or using it. - unused_local_variable +warning - lib/controller/auth/syria/registration_controller.dart:610:63 - The '!' will have no effect because the receiver can't be null. Try removing the '!' operator. - unnecessary_non_null_assertion +warning - lib/controller/auth/syria/registration_controller.dart:611:61 - The '!' will have no effect because the receiver can't be null. Try removing the '!' operator. - unnecessary_non_null_assertion +warning - lib/controller/auth/syria/registration_controller.dart:612:57 - The '!' will have no effect because the receiver can't be null. Try removing the '!' operator. - unnecessary_non_null_assertion +warning - lib/controller/auth/syria/registration_controller.dart:613:55 - The '!' will have no effect because the receiver can't be null. Try removing the '!' operator. - unnecessary_non_null_assertion +warning - lib/controller/firebase/access_token.dart:4:8 - Unused import: '../../print.dart'. Try removing the import directive. - unused_import +warning - lib/controller/firebase/firbase_messge.dart:4:8 - Unused import: 'package:siro_driver/views/home/Captin/orderCaptin/order_speed_request.dart'. Try removing the import directive. - unused_import +warning - lib/controller/firebase/firbase_messge.dart:20:8 - Unused import: '../../views/home/Captin/orderCaptin/order_request_page.dart'. Try removing the import directive. - unused_import +warning - lib/controller/firebase/firbase_messge.dart:56:28 - The value of the local variable 'settings' isn't used. Try removing the variable or using it. - unused_local_variable +warning - lib/controller/firebase/firbase_messge.dart:100:28 - The value of the local variable 'android' isn't used. Try removing the variable or using it. - unused_local_variable +warning - lib/controller/firebase/local_notification.dart:16:8 - Unused import: '../../print.dart'. Try removing the import directive. - unused_import +warning - lib/controller/firebase/local_notification.dart:418:29 - The value of the local variable 'bigTextStyleInformation' isn't used. Try removing the variable or using it. - unused_local_variable +warning - lib/controller/firebase/notification_service.dart:3:8 - Unused import: 'package:get/get.dart'. Try removing the import directive. - unused_import +warning - lib/controller/functions/background_service.dart:5:8 - Unused import: 'package:flutter/material.dart'. Try removing the import directive. - unused_import +warning - lib/controller/functions/background_service.dart:14:8 - Unused import: '../firebase/local_notification.dart'. Try removing the import directive. - unused_import +warning - lib/controller/functions/crud.dart:434:9 - The value of the local variable 'uid' isn't used. Try removing the variable or using it. - unused_local_variable +warning - lib/controller/functions/device_analyzer.dart:79:42 - The receiver can't be null, so the null-aware operator '?.' is unnecessary. Try replacing the operator '?.' with '.'. - invalid_null_aware_operator +warning - lib/controller/functions/digit_obsecur_formate.dart:29:11 - The value of the local variable 'cursorOffset' isn't used. Try removing the variable or using it. - unused_local_variable +warning - lib/controller/functions/encrypt_decrypt.dart:7:8 - Unused import: '../../main.dart'. Try removing the import directive. - unused_import +warning - lib/controller/functions/encrypt_decrypt.dart:8:8 - Unused import: '../../print.dart'. Try removing the import directive. - unused_import +warning - lib/controller/functions/encrypt_decrypt.dart:38:36 - The '!' will have no effect because the receiver can't be null. Try removing the '!' operator. - unnecessary_non_null_assertion +warning - lib/controller/functions/encrypt_decrypt.dart:39:47 - The '!' will have no effect because the receiver can't be null. Try removing the '!' operator. - unnecessary_non_null_assertion +warning - lib/controller/functions/face_detect.dart:3:8 - Unused import: 'package:siro_driver/constant/api_key.dart'. Try removing the import directive. - unused_import +warning - lib/controller/functions/face_detect.dart:10:8 - Unused import: 'encrypt_decrypt.dart'. Try removing the import directive. - unused_import +warning - lib/controller/functions/gemeni.dart:4:8 - Duplicate import. Try removing all but one import of the library. - duplicate_import +warning - lib/controller/functions/gemeni.dart:12:8 - Unused import: 'package:siro_driver/controller/firebase/firbase_messge.dart'. Try removing the import directive. - unused_import +warning - lib/controller/functions/gemeni.dart:31:8 - Unused import: '../../print.dart'. Try removing the import directive. - unused_import +warning - lib/controller/functions/gemeni.dart:157:11 - The value of the local variable 'inspExpired' isn't used. Try removing the variable or using it. - unused_local_variable +warning - lib/controller/functions/gemeni.dart:158:11 - The value of the local variable 'taxExpired' isn't used. Try removing the variable or using it. - unused_local_variable +warning - lib/controller/functions/gemeni.dart:275:64 - The left operand can't be null, so the right operand is never executed. Try removing the operator and the right operand. - dead_null_aware_expression +warning - lib/controller/functions/gemeni.dart:277:64 - The left operand can't be null, so the right operand is never executed. Try removing the operator and the right operand. - dead_null_aware_expression +warning - lib/controller/functions/gemeni.dart:282:52 - The left operand can't be null, so the right operand is never executed. Try removing the operator and the right operand. - dead_null_aware_expression +warning - lib/controller/functions/gemeni.dart:284:59 - The left operand can't be null, so the right operand is never executed. Try removing the operator and the right operand. - dead_null_aware_expression +warning - lib/controller/functions/gemeni.dart:286:61 - The left operand can't be null, so the right operand is never executed. Try removing the operator and the right operand. - dead_null_aware_expression +warning - lib/controller/functions/gemeni.dart:293:54 - The left operand can't be null, so the right operand is never executed. Try removing the operator and the right operand. - dead_null_aware_expression +warning - lib/controller/functions/gemeni.dart:295:53 - The left operand can't be null, so the right operand is never executed. Try removing the operator and the right operand. - dead_null_aware_expression +warning - lib/controller/functions/gemeni.dart:299:51 - The left operand can't be null, so the right operand is never executed. Try removing the operator and the right operand. - dead_null_aware_expression +warning - lib/controller/functions/gemeni.dart:816:13 - The value of the local variable 'result' isn't used. Try removing the variable or using it. - unused_local_variable +warning - lib/controller/functions/gemeni.dart:993:11 - The value of the local variable 'result' isn't used. Try removing the variable or using it. - unused_local_variable +warning - lib/controller/functions/gemeni.dart:1093:13 - The value of the local variable 'result' isn't used. Try removing the variable or using it. - unused_local_variable +warning - lib/controller/functions/gemeni.dart:1180:13 - The value of the local variable 'result' isn't used. Try removing the variable or using it. - unused_local_variable +warning - lib/controller/functions/gemeni.dart:1266:13 - The value of the local variable 'result' isn't used. Try removing the variable or using it. - unused_local_variable +warning - lib/controller/functions/gemeni.dart:1361:13 - The value of the local variable 'result' isn't used. Try removing the variable or using it. - unused_local_variable +warning - lib/controller/functions/gemeni.dart:1441:13 - The value of the local variable 'result' isn't used. Try removing the variable or using it. - unused_local_variable +warning - lib/controller/functions/gemeni.dart:1522:13 - The value of the local variable 'result' isn't used. Try removing the variable or using it. - unused_local_variable +warning - lib/controller/functions/gemeni.dart:1599:13 - The value of the local variable 'result' isn't used. Try removing the variable or using it. - unused_local_variable +warning - lib/controller/functions/llama_ai.dart:5:8 - Unused import: 'package:siro_driver/controller/functions/gemeni.dart'. Try removing the import directive. - unused_import +warning - lib/controller/functions/location_controller.dart:54:36 - The value of the field '_homeCtrl' isn't used. Try removing the field, or using it. - unused_field +warning - lib/controller/functions/location_controller.dart:55:38 - The value of the field '_walletCtrl' isn't used. Try removing the field, or using it. - unused_field +warning - lib/controller/functions/location_controller.dart:64:8 - The value of the field '_isReady' isn't used. Try removing the field, or using it. - unused_field +warning - lib/controller/functions/location_controller.dart:197:12 - The value of the local variable 'platform' isn't used. Try removing the variable or using it. - unused_local_variable +warning - lib/controller/functions/location_controller.dart:244:40 - The receiver can't be null, so the null-aware operator '?.' is unnecessary. Try replacing the operator '?.' with '.'. - invalid_null_aware_operator +warning - lib/controller/functions/location_controller.dart:791:21 - The operand can't be 'null', so the condition is always 'true'. Remove the condition. - unnecessary_null_comparison +warning - lib/controller/functions/ocr_controller.dart:355:34 - The operand can't be 'null', so the condition is always 'false'. Try removing the condition, an enclosing condition, or the whole conditional statement. - unnecessary_null_comparison +warning - lib/controller/functions/package_info.dart:210:10 - The value of the local variable 'isOnExternalStorage' isn't used. Try removing the variable or using it. - unused_local_variable +warning - lib/controller/functions/package_info.dart:211:10 - The value of the local variable 'checkForIssues' isn't used. Try removing the variable or using it. - unused_local_variable +warning - lib/controller/functions/package_info.dart:212:10 - The value of the local variable 'isDevMode' isn't used. Try removing the variable or using it. - unused_local_variable +warning - lib/controller/functions/package_info.dart:359:5 - Dead code. Try removing the code, or fixing the code before it so that it can be reached. - dead_code +warning - lib/controller/functions/performance_test.dart:32:14 - The value of the local variable 'x' isn't used. Try removing the variable or using it. - unused_local_variable +warning - lib/controller/functions/secure_storage.dart:4:8 - Unused import: 'package:secure_string_operations/secure_string_operations.dart'. Try removing the import directive. - unused_import +warning - lib/controller/functions/secure_storage.dart:9:8 - Unused import: '../../constant/char_map.dart'. Try removing the import directive. - unused_import +warning - lib/controller/functions/secure_storage.dart:13:8 - Unused import: '../../print.dart'. Try removing the import directive. - unused_import +warning - lib/controller/functions/sms_egypt_controller.dart:15:8 - Unused import: 'encrypt_decrypt.dart'. Try removing the import directive. - unused_import +warning - lib/controller/functions/sms_egypt_controller.dart:31:12 - The value of the local variable 'sender' isn't used. Try removing the variable or using it. - unused_local_variable +warning - lib/controller/functions/sms_egypt_controller.dart:66:9 - The value of the local variable 'res' isn't used. Try removing the variable or using it. - unused_local_variable +warning - lib/controller/functions/sms_egypt_controller.dart:77:9 - The value of the local variable 'res' isn't used. Try removing the variable or using it. - unused_local_variable +warning - lib/controller/functions/sms_egypt_controller.dart:94:9 - The value of the local variable 'res' isn't used. Try removing the variable or using it. - unused_local_variable +warning - lib/controller/functions/upload_image.dart:3:8 - Unused import: 'package:siro_driver/constant/api_key.dart'. Try removing the import directive. - unused_import +warning - lib/controller/functions/upload_image.dart:9:8 - Unused import: 'package:path/path.dart'. Try removing the import directive. - unused_import +warning - lib/controller/home/captin/duration_controller .dart:3:8 - Unused import: 'package:siro_driver/views/widgets/elevated_btn.dart'. Try removing the import directive. - unused_import +warning - lib/controller/home/captin/duration_controller .dart:105:26 - Unnecessary cast. Try removing the cast. - unnecessary_cast +warning - lib/controller/home/captin/help/help_controller.dart:12:8 - Unused import: '../../../functions/encrypt_decrypt.dart'. Try removing the import directive. - unused_import +warning - lib/controller/home/captin/help/video_controller.dart:5:8 - Unused import: 'package:siro_driver/print.dart'. Try removing the import directive. - unused_import +warning - lib/controller/home/captin/home_captain_controller.dart:20:8 - Unused import: '../../functions/background_service.dart'. Try removing the import directive. - unused_import +warning - lib/controller/home/captin/home_captain_controller.dart:22:8 - Unused import: '../../functions/location_background_controller.dart'. Try removing the import directive. - unused_import +warning - lib/controller/home/captin/home_captain_controller.dart:514:33 - The operand can't be 'null', so the condition is always 'true'. Remove the condition. - unnecessary_null_comparison +warning - lib/controller/home/captin/home_captain_controller.dart:705:45 - The operand can't be 'null', so the condition is always 'true'. Remove the condition. - unnecessary_null_comparison +warning - lib/controller/home/captin/map_driver_controller.dart:285:24 - The operand can't be 'null', so the condition is always 'true'. Remove the condition. - unnecessary_null_comparison +warning - lib/controller/home/captin/map_driver_controller.dart:290:54 - The '!' will have no effect because the receiver can't be null. Try removing the '!' operator. - unnecessary_non_null_assertion +warning - lib/controller/home/captin/map_driver_controller.dart:292:54 - The '!' will have no effect because the receiver can't be null. Try removing the '!' operator. - unnecessary_non_null_assertion +warning - lib/controller/home/captin/map_driver_controller.dart:515:53 - The left operand can't be null, so the right operand is never executed. Try removing the operator and the right operand. - dead_null_aware_expression +warning - lib/controller/home/captin/map_driver_controller.dart:1423:58 - The left operand can't be null, so the right operand is never executed. Try removing the operator and the right operand. - dead_null_aware_expression +warning - lib/controller/home/captin/map_driver_controller.dart:1590:40 - The left operand can't be null, so the right operand is never executed. Try removing the operator and the right operand. - dead_null_aware_expression +warning - lib/controller/home/captin/map_driver_controller.dart:1590:76 - The left operand can't be null, so the right operand is never executed. Try removing the operator and the right operand. - dead_null_aware_expression +warning - lib/controller/home/captin/map_driver_controller.dart:1795:7 - The value of the field '_stepBounds' isn't used. Try removing the field, or using it. - unused_field +warning - lib/controller/home/captin/map_driver_controller.dart:1796:7 - The value of the field '_stepEndPoints' isn't used. Try removing the field, or using it. - unused_field +warning - lib/controller/home/captin/map_driver_controller.dart:1797:7 - The value of the field '_allPointsForActiveRoute' isn't used. Try removing the field, or using it. - unused_field +warning - lib/controller/home/captin/map_driver_controller.dart:2078:14 - The '!' will have no effect because the receiver can't be null. Try removing the '!' operator. - unnecessary_non_null_assertion +warning - lib/controller/home/captin/map_driver_controller.dart:2079:14 - The '!' will have no effect because the receiver can't be null. Try removing the '!' operator. - unnecessary_non_null_assertion +warning - lib/controller/home/captin/map_driver_controller.dart:2083:14 - The '!' will have no effect because the receiver can't be null. Try removing the '!' operator. - unnecessary_non_null_assertion +warning - lib/controller/home/captin/map_driver_controller.dart:2084:14 - The '!' will have no effect because the receiver can't be null. Try removing the '!' operator. - unnecessary_non_null_assertion +warning - lib/controller/home/captin/map_driver_controller.dart:2087:27 - The '!' will have no effect because the receiver can't be null. Try removing the '!' operator. - unnecessary_non_null_assertion +warning - lib/controller/home/captin/map_driver_controller.dart:2087:32 - The '!' will have no effect because the receiver can't be null. Try removing the '!' operator. - unnecessary_non_null_assertion +warning - lib/controller/home/captin/map_driver_controller.dart:2088:27 - The '!' will have no effect because the receiver can't be null. Try removing the '!' operator. - unnecessary_non_null_assertion +warning - lib/controller/home/captin/map_driver_controller.dart:2088:32 - The '!' will have no effect because the receiver can't be null. Try removing the '!' operator. - unnecessary_non_null_assertion +warning - lib/controller/home/captin/map_driver_controller.dart:2149:10 - The declaration '_parseInstruction' isn't referenced. Try removing the declaration of '_parseInstruction'. - unused_element +warning - lib/controller/home/captin/map_driver_controller.dart:2176:16 - The declaration '_fitToBounds' isn't referenced. Try removing the declaration of '_fitToBounds'. - unused_element +warning - lib/controller/home/captin/map_driver_controller.dart:2261:12 - The value of the field '_lastCameraUpdateTs' isn't used. Try removing the field, or using it. - unused_field +warning - lib/controller/home/captin/map_driver_controller.dart:2263:16 - The declaration '_boundsFromPoints' isn't referenced. Try removing the declaration of '_boundsFromPoints'. - unused_element +warning - lib/controller/home/captin/map_driver_controller.dart:2277:10 - The declaration '_distanceMeters' isn't referenced. Try removing the declaration of '_distanceMeters'. - unused_element +warning - lib/controller/home/captin/map_driver_controller.dart:2413:14 - The value of the local variable 'lat' isn't used. Try removing the variable or using it. - unused_local_variable +warning - lib/controller/home/captin/map_driver_controller.dart:2415:14 - The value of the local variable 'lng' isn't used. Try removing the variable or using it. - unused_local_variable +warning - lib/controller/home/captin/navigation_service.dart:15:32 - The value of the field '_tts' isn't used. Try removing the field, or using it. - unused_field +warning - lib/controller/home/captin/order_request_controller.dart:4:8 - Unused import: 'package:flutter/foundation.dart'. Try removing the import directive. - unused_import +warning - lib/controller/home/captin/order_request_controller.dart:13:8 - Unused import: 'dart:math'. Try removing the import directive. - unused_import +warning - lib/controller/home/navigation/navigation_controller.dart:80:13 - The value of the field '_lastAutoRerouteTime' isn't used. Try removing the field, or using it. - unused_field +warning - lib/controller/home/navigation/navigation_controller.dart:718:62 - The '!' will have no effect because the receiver can't be null. Try removing the '!' operator. - unnecessary_non_null_assertion +warning - lib/controller/home/navigation/navigation_controller.dart:1318:10 - The declaration '_kmToLatDelta' isn't referenced. Try removing the declaration of '_kmToLatDelta'. - unused_element +warning - lib/controller/home/navigation/navigation_controller.dart:1319:10 - The declaration '_kmToLngDelta' isn't referenced. Try removing the declaration of '_kmToLngDelta'. - unused_element +warning - lib/controller/home/navigation/navigation_view.dart:31:29 - The value of the local variable 's' isn't used. Try removing the variable or using it. - unused_local_variable +warning - lib/controller/home/navigation/route_matcher_worker.dart:2:8 - Unused import: 'dart:async'. Try removing the import directive. - unused_import +warning - lib/controller/home/navigation/route_matcher_worker.dart:5:8 - Unused import: 'package:intaleq_maps/intaleq_maps.dart'. Try removing the import directive. - unused_import +warning - lib/controller/home/payment/captain_wallet_controller.dart:3:8 - Unused import: 'package:local_auth/local_auth.dart'. Try removing the import directive. - unused_import +warning - lib/controller/home/payment/captain_wallet_controller.dart:5:8 - Unused import: 'package:siro_driver/controller/firebase/firbase_messge.dart'. Try removing the import directive. - unused_import +warning - lib/controller/home/payment/captain_wallet_controller.dart:16:8 - Unused import: '../../../views/widgets/mydialoug.dart'. Try removing the import directive. - unused_import +warning - lib/controller/home/payment/paymob_payout.dart:5:8 - Unused import: 'package:siro_driver/controller/payment/smsPaymnet/payment_services.dart'. Try removing the import directive. - unused_import +warning - lib/controller/home/splash_screen_controlle.dart:14:8 - Unused import: '../../onbording_page.dart'. Try removing the import directive. - unused_import +warning - lib/controller/local/local_controller.dart:7:8 - Unused import: '../profile/setting_controller.dart'. Try removing the import directive. - unused_import +warning - lib/controller/local/translations.dart:349:11 - Two keys in a map literal shouldn't be equal. Change or remove the duplicate key. - equal_keys_in_map +warning - lib/controller/local/translations.dart:962:11 - Two keys in a map literal shouldn't be equal. Change or remove the duplicate key. - equal_keys_in_map +warning - lib/controller/local/translations.dart:1047:11 - Two keys in a map literal shouldn't be equal. Change or remove the duplicate key. - equal_keys_in_map +warning - lib/controller/local/translations.dart:1387:11 - Two keys in a map literal shouldn't be equal. Change or remove the duplicate key. - equal_keys_in_map +warning - lib/controller/local/translations.dart:1400:11 - Two keys in a map literal shouldn't be equal. Change or remove the duplicate key. - equal_keys_in_map +warning - lib/controller/local/translations.dart:1622:11 - Two keys in a map literal shouldn't be equal. Change or remove the duplicate key. - equal_keys_in_map +warning - lib/controller/local/translations.dart:1627:11 - Two keys in a map literal shouldn't be equal. Change or remove the duplicate key. - equal_keys_in_map +warning - lib/controller/local/translations.dart:1629:11 - Two keys in a map literal shouldn't be equal. Change or remove the duplicate key. - equal_keys_in_map +warning - lib/controller/local/translations.dart:1630:11 - Two keys in a map literal shouldn't be equal. Change or remove the duplicate key. - equal_keys_in_map +warning - lib/controller/local/translations.dart:1633:11 - Two keys in a map literal shouldn't be equal. Change or remove the duplicate key. - equal_keys_in_map +warning - lib/controller/local/translations.dart:1725:11 - Two keys in a map literal shouldn't be equal. Change or remove the duplicate key. - equal_keys_in_map +warning - lib/controller/local/translations.dart:1753:11 - Two keys in a map literal shouldn't be equal. Change or remove the duplicate key. - equal_keys_in_map +warning - lib/controller/local/translations.dart:2601:11 - Two keys in a map literal shouldn't be equal. Change or remove the duplicate key. - equal_keys_in_map +warning - lib/controller/local/translations.dart:2608:11 - Two keys in a map literal shouldn't be equal. Change or remove the duplicate key. - equal_keys_in_map +warning - lib/controller/local/translations.dart:2610:11 - Two keys in a map literal shouldn't be equal. Change or remove the duplicate key. - equal_keys_in_map +warning - lib/controller/local/translations.dart:2612:11 - Two keys in a map literal shouldn't be equal. Change or remove the duplicate key. - equal_keys_in_map +warning - lib/controller/local/translations.dart:2613:11 - Two keys in a map literal shouldn't be equal. Change or remove the duplicate key. - equal_keys_in_map +warning - lib/controller/local/translations.dart:2614:11 - Two keys in a map literal shouldn't be equal. Change or remove the duplicate key. - equal_keys_in_map +warning - lib/controller/local/translations.dart:2615:11 - Two keys in a map literal shouldn't be equal. Change or remove the duplicate key. - equal_keys_in_map +warning - lib/controller/local/translations.dart:2617:11 - Two keys in a map literal shouldn't be equal. Change or remove the duplicate key. - equal_keys_in_map +warning - lib/controller/local/translations.dart:2620:11 - Two keys in a map literal shouldn't be equal. Change or remove the duplicate key. - equal_keys_in_map +warning - lib/controller/local/translations.dart:2623:11 - Two keys in a map literal shouldn't be equal. Change or remove the duplicate key. - equal_keys_in_map +warning - lib/controller/local/translations.dart:2624:11 - Two keys in a map literal shouldn't be equal. Change or remove the duplicate key. - equal_keys_in_map +warning - lib/controller/local/translations.dart:2626:11 - Two keys in a map literal shouldn't be equal. Change or remove the duplicate key. - equal_keys_in_map +warning - lib/controller/local/translations.dart:2627:11 - Two keys in a map literal shouldn't be equal. Change or remove the duplicate key. - equal_keys_in_map +warning - lib/controller/local/translations.dart:2630:11 - Two keys in a map literal shouldn't be equal. Change or remove the duplicate key. - equal_keys_in_map +warning - lib/controller/local/translations.dart:2631:11 - Two keys in a map literal shouldn't be equal. Change or remove the duplicate key. - equal_keys_in_map +warning - lib/controller/local/translations.dart:2632:11 - Two keys in a map literal shouldn't be equal. Change or remove the duplicate key. - equal_keys_in_map +warning - lib/controller/local/translations.dart:2633:11 - Two keys in a map literal shouldn't be equal. Change or remove the duplicate key. - equal_keys_in_map +warning - lib/controller/local/translations.dart:2635:11 - Two keys in a map literal shouldn't be equal. Change or remove the duplicate key. - equal_keys_in_map +warning - lib/controller/local/translations.dart:2636:11 - Two keys in a map literal shouldn't be equal. Change or remove the duplicate key. - equal_keys_in_map +warning - lib/controller/notification/notification_captain_controller.dart:5:8 - Unused import: 'package:siro_driver/constant/style.dart'. Try removing the import directive. - unused_import +warning - lib/controller/notification/notification_captain_controller.dart:6:8 - Unused import: 'package:siro_driver/views/widgets/elevated_btn.dart'. Try removing the import directive. - unused_import +warning - lib/controller/notification/notification_captain_controller.dart:7:8 - Unused import: 'package:siro_driver/views/widgets/mydialoug.dart'. Try removing the import directive. - unused_import +warning - lib/controller/notification/passenger_notification_controller.dart:4:8 - Unused import: 'package:siro_driver/controller/firebase/firbase_messge.dart'. Try removing the import directive. - unused_import +warning - lib/controller/notification/passenger_notification_controller.dart:53:9 - The value of the local variable 'res' isn't used. Try removing the variable or using it. - unused_local_variable +warning - lib/controller/notification/ride_available_controller.dart:2:8 - Unused import: 'package:flutter/material.dart'. Try removing the import directive. - unused_import +warning - lib/controller/payment/mtn_new/mtn_payment_new_screen.dart:103:11 - The value of the field '_invoiceNumber' isn't used. Try removing the field, or using it. - unused_field +warning - lib/controller/payment/payment_controller.dart:2:8 - Unused import: 'package:siro_driver/constant/api_key.dart'. Try removing the import directive. - unused_import +warning - lib/controller/payment/payment_controller.dart:7:8 - Unused import: 'package:siro_driver/views/widgets/error_snakbar.dart'. Try removing the import directive. - unused_import +warning - lib/controller/payment/payment_controller.dart:8:8 - Unused import: 'package:http/http.dart'. Try removing the import directive. - unused_import +warning - lib/controller/payment/payment_controller.dart:16:8 - Unused import: '../../constant/info.dart'. Try removing the import directive. - unused_import +warning - lib/controller/payment/paymob.dart:4:8 - Unused import: 'package:flutter/material.dart'. Try removing the import directive. - unused_import +warning - lib/controller/payment/paymob.dart:10:8 - Unused import: '../functions/encrypt_decrypt.dart'. Try removing the import directive. - unused_import +warning - lib/controller/payment/paymob.dart:46:27 - The exception variable 'e' isn't used, so the 'catch' clause can be removed. Try removing the catch clause. - unused_catch_clause +warning - lib/controller/payment/paymob.dart:77:26 - The exception variable 'e' isn't used, so the 'catch' clause can be removed. Try removing the catch clause. - unused_catch_clause +warning - lib/controller/payment/paymob.dart:82:18 - The declaration '_getStatusAfterPaid' isn't referenced. Try removing the declaration of '_getStatusAfterPaid'. - unused_element +warning - lib/controller/payment/paymob/paymob_response.dart:2:8 - Unused import: 'package:siro_driver/controller/functions/encrypt_decrypt.dart'. Try removing the import directive. - unused_import +warning - lib/controller/payment/paymob/paymob_wallet.dart:2:8 - Unused import: 'package:siro_driver/controller/functions/encrypt_decrypt.dart'. Try removing the import directive. - unused_import +warning - lib/controller/payment/paymob/paymob_wallet.dart:43:15 - The value of the field '_iFrameURL' isn't used. Try removing the field, or using it. - unused_field +warning - lib/controller/payment/paymob/paymob_wallet.dart:169:26 - The exception variable 'e' isn't used, so the 'catch' clause can be removed. Try removing the catch clause. - unused_catch_clause +warning - lib/controller/payment/paymob/paymob_wallet.dart:451:8 - The declaration '_showSuccessDialog' isn't referenced. Try removing the declaration of '_showSuccessDialog'. - unused_element +warning - lib/controller/rate/rate_app_controller.dart:1:8 - Unused import: 'dart:convert'. Try removing the import directive. - unused_import +warning - lib/controller/rate/rate_conroller.dart:1:8 - Unused import: 'package:siro_driver/controller/firebase/firbase_messge.dart'. Try removing the import directive. - unused_import +warning - lib/controller/rate/rate_conroller.dart:120:36 - The left operand can't be null, so the right operand is never executed. Try removing the operator and the right operand. - dead_null_aware_expression +warning - lib/main.dart:21:8 - Unused import: 'constant/api_key.dart'. Try removing the import directive. - unused_import +warning - lib/print.dart:10:18 - This function has a nullable return type of 'Object?', but ends without returning a value. Try adding a return statement, or if no value is ever returned, try changing the return type to 'void'. - body_might_complete_normally_nullable +warning - lib/services/offline_map_service.dart:6:8 - Unused import: '../main.dart'. Try removing the import directive. - unused_import +warning - lib/splash_screen_page.dart:3:8 - Unused import: 'package:siro_driver/constant/box_name.dart'. Try removing the import directive. - unused_import +warning - lib/splash_screen_page.dart:5:8 - Unused import: 'main.dart'. Try removing the import directive. - unused_import +warning - lib/views/Rate/rate_passenger.dart:10:8 - Unused import: '../../constant/style.dart'. Try removing the import directive. - unused_import +warning - lib/views/Rate/ride_calculate_driver.dart:9:8 - Unused import: 'package:intl/intl.dart'. Try removing the import directive. - unused_import +warning - lib/views/auth/captin/ai_page.dart:15:8 - Unused import: '../../../controller/functions/encrypt_decrypt.dart'. Try removing the import directive. - unused_import +warning - lib/views/auth/captin/ai_page.dart:18:7 - This class (or a class that this class inherits from) is marked as '@immutable', but one or more of its instance fields aren't final: AiPage.scanDocumentsByApi, AiPage.registerCaptainController - must_be_immutable +warning - lib/views/auth/captin/ai_page.dart:26:12 - The value of the local variable 'text' isn't used. Try removing the variable or using it. - unused_local_variable +warning - lib/views/auth/captin/car_license_page.dart:1:8 - Unused import: 'dart:io'. Try removing the import directive. - unused_import +warning - lib/views/auth/captin/car_license_page.dart:3:8 - Unused import: 'package:flutter/material.dart'. Try removing the import directive. - unused_import +warning - lib/views/auth/captin/car_license_page.dart:4:8 - Unused import: 'package:get/get.dart'. Try removing the import directive. - unused_import +warning - lib/views/auth/captin/car_license_page.dart:5:8 - Unused import: 'package:siro_driver/controller/functions/ocr_controller.dart'. Try removing the import directive. - unused_import +warning - lib/views/auth/captin/car_license_page.dart:7:8 - Unused import: '../../../constant/style.dart'. Try removing the import directive. - unused_import +warning - lib/views/auth/captin/car_license_page.dart:8:8 - Unused import: '../../../controller/auth/captin/ml_google_doc.dart'. Try removing the import directive. - unused_import +warning - lib/views/auth/captin/car_license_page.dart:9:8 - Unused import: '../../../controller/auth/captin/register_captin_controller.dart'. Try removing the import directive. - unused_import +warning - lib/views/auth/captin/car_license_page.dart:10:8 - Unused import: '../../widgets/elevated_btn.dart'. Try removing the import directive. - unused_import +warning - lib/views/auth/captin/car_license_page.dart:11:8 - Unused import: '../../widgets/my_scafold.dart'. Try removing the import directive. - unused_import +warning - lib/views/auth/captin/cards/gemini_egypt.dart:62:11 - The value of the local variable 'result' isn't used. Try removing the variable or using it. - unused_local_variable +warning - lib/views/auth/captin/cards/syrian_card_a_i.dart:7:8 - Unused import: '../../../../constant/colors.dart'. Try removing the import directive. - unused_import +warning - lib/views/auth/captin/cards/syrian_card_a_i.dart:13:8 - Unused import: '../../../../print.dart'. Try removing the import directive. - unused_import +warning - lib/views/auth/captin/cards/syrian_card_a_i.dart:391:16 - The value of the local variable 'isExpired' isn't used. Try removing the variable or using it. - unused_local_variable +warning - lib/views/auth/captin/criminal_documents_page.dart:8:8 - Unused import: '../../../controller/functions/encrypt_decrypt.dart'. Try removing the import directive. - unused_import +warning - lib/views/auth/captin/driver_car_controller.dart:48:23 - The left operand can't be null, so the right operand is never executed. Try removing the operator and the right operand. - dead_null_aware_expression +warning - lib/views/auth/captin/driver_car_controller.dart:50:25 - The left operand can't be null, so the right operand is never executed. Try removing the operator and the right operand. - dead_null_aware_expression +warning - lib/views/auth/captin/driver_car_controller.dart:51:27 - The left operand can't be null, so the right operand is never executed. Try removing the operator and the right operand. - dead_null_aware_expression +warning - lib/views/auth/captin/driver_car_controller.dart:52:25 - The left operand can't be null, so the right operand is never executed. Try removing the operator and the right operand. - dead_null_aware_expression +warning - lib/views/auth/captin/driver_car_controller.dart:53:46 - The left operand can't be null, so the right operand is never executed. Try removing the operator and the right operand. - dead_null_aware_expression +warning - lib/views/auth/captin/driver_car_controller.dart:54:27 - The left operand can't be null, so the right operand is never executed. Try removing the operator and the right operand. - dead_null_aware_expression +warning - lib/views/auth/captin/driver_car_controller.dart:55:27 - The left operand can't be null, so the right operand is never executed. Try removing the operator and the right operand. - dead_null_aware_expression +warning - lib/views/auth/captin/driver_car_controller.dart:56:34 - The left operand can't be null, so the right operand is never executed. Try removing the operator and the right operand. - dead_null_aware_expression +warning - lib/views/auth/captin/driver_car_controller.dart:57:31 - The left operand can't be null, so the right operand is never executed. Try removing the operator and the right operand. - dead_null_aware_expression +warning - lib/views/auth/captin/driver_car_controller.dart:58:41 - The left operand can't be null, so the right operand is never executed. Try removing the operator and the right operand. - dead_null_aware_expression +warning - lib/views/auth/captin/driver_car_controller.dart:59:25 - The left operand can't be null, so the right operand is never executed. Try removing the operator and the right operand. - dead_null_aware_expression +warning - lib/views/auth/captin/driver_car_controller.dart:60:50 - The left operand can't be null, so the right operand is never executed. Try removing the operator and the right operand. - dead_null_aware_expression +warning - lib/views/auth/captin/invite_driver_screen.dart:8:8 - Unused import: '../../../controller/functions/encrypt_decrypt.dart'. Try removing the import directive. - unused_import +warning - lib/views/auth/captin/invite_driver_screen.dart:482:10 - The declaration '_buildPassengerStats' isn't referenced. Try removing the declaration of '_buildPassengerStats'. - unused_element +warning - lib/views/auth/captin/login_captin.dart:20:8 - Unused import: '../../../print.dart'. Try removing the import directive. - unused_import +warning - lib/views/auth/captin/login_captin.dart:247:10 - The declaration '_buildLoginUI' isn't referenced. Try removing the declaration of '_buildLoginUI'. - unused_element +warning - lib/views/auth/captin/otp_page.dart:9:8 - Unused import: '../../../constant/box_name.dart'. Try removing the import directive. - unused_import +warning - lib/views/auth/captin/otp_page.dart:13:8 - Unused import: '../../../main.dart'. Try removing the import directive. - unused_import +warning - lib/views/auth/captin/register_captin.dart:9:8 - Unused import: '../../../controller/auth/google_sign.dart'. Try removing the import directive. - unused_import +warning - lib/views/auth/captin/verify_email_captain.dart:9:7 - This class (or a class that this class inherits from) is marked as '@immutable', but one or more of its instance fields aren't final: VerifyEmailCaptainPage.registerCaptinController - must_be_immutable +warning - lib/views/auth/syria/registration_view.dart:1:8 - Unused import: 'dart:io'. Try removing the import directive. - unused_import +warning - lib/views/home/Captin/About Us/about_us.dart:1:8 - Unused import: 'package:siro_driver/constant/box_name.dart'. Try removing the import directive. - unused_import +warning - lib/views/home/Captin/About Us/about_us.dart:3:8 - Unused import: 'package:siro_driver/main.dart'. Try removing the import directive. - unused_import +warning - lib/views/home/Captin/About Us/frequantly_question.dart:14:12 - The value of the local variable 'selectedPayment' isn't used. Try removing the variable or using it. - unused_local_variable +warning - lib/views/home/Captin/About Us/frequantly_question.dart:15:10 - The value of the local variable 'canCancelRide' isn't used. Try removing the variable or using it. - unused_local_variable +warning - lib/views/home/Captin/About Us/settings_captain.dart:11:8 - Unused import: '../../../auth/country_widget.dart'. Try removing the import directive. - unused_import +warning - lib/views/home/Captin/bottom_bar.dart:69:26 - The value of the local variable 'data' isn't used. Try removing the variable or using it. - unused_local_variable +warning - lib/views/home/Captin/driver_map_page.dart:4:8 - Unused import: 'package:siro_driver/constant/box_name.dart'. Try removing the import directive. - unused_import +warning - lib/views/home/Captin/driver_map_page.dart:10:8 - Unused import: '../../../main.dart'. Try removing the import directive. - unused_import +warning - lib/views/home/Captin/driver_map_page.dart:18:8 - Unused import: 'mapDriverWidgets/sped_circle.dart'. Try removing the import directive. - unused_import +warning - lib/views/home/Captin/home_captain/drawer_captain.dart:1:8 - Unused import: 'dart:io'. Try removing the import directive. - unused_import +warning - lib/views/home/Captin/home_captain/drawer_captain.dart:20:8 - Unused import: 'package:siro_driver/views/gamification/referral_center_page.dart'. Try removing the import directive. - unused_import +warning - lib/views/home/Captin/home_captain/drawer_captain.dart:33:8 - Unused import: '../assurance_health_page.dart'. Try removing the import directive. - unused_import +warning - lib/views/home/Captin/home_captain/drawer_captain.dart:34:8 - Unused import: '../maintain_center_page.dart'. Try removing the import directive. - unused_import +warning - lib/views/home/Captin/home_captain/help_details_replay_page.dart:3:8 - Unused import: 'package:siro_driver/constant/style.dart'. Try removing the import directive. - unused_import +warning - lib/views/home/Captin/home_captain/home_captin.dart:575:34 - A value for optional parameter 'key' isn't ever given. Try removing the unused parameter. - unused_element_parameter +warning - lib/views/home/Captin/home_captain/widget/connect.dart:22:9 - The value of the local variable 'refusedRidesToday' isn't used. Try removing the variable or using it. - unused_local_variable +warning - lib/views/home/Captin/home_captain/widget/left_menu_map_captain.dart:6:8 - Unused import: 'package:siro_driver/views/auth/syria/registration_view.dart'. Try removing the import directive. - unused_import +warning - lib/views/home/Captin/home_captain/widget/left_menu_map_captain.dart:224:21 - Dead code. Try removing the code, or fixing the code before it so that it can be reached. - dead_code +warning - lib/views/home/Captin/home_captain/widget/left_menu_map_captain.dart:243:13 - The value of the local variable 'customerToken' isn't used. Try removing the variable or using it. - unused_local_variable +warning - lib/views/home/Captin/home_captain/widget/left_menu_map_captain.dart:244:13 - The value of the local variable 'orderId' isn't used. Try removing the variable or using it. - unused_local_variable +warning - lib/views/home/Captin/home_captain/widget/left_menu_map_captain.dart:304:6 - The declaration '_sendAcceptanceNotification' isn't referenced. Try removing the declaration of '_sendAcceptanceNotification'. - unused_element +warning - lib/views/home/Captin/home_captain/widget/zones_controller.dart:14:18 - The value of the local variable 'totalArea' isn't used. Try removing the variable or using it. - unused_local_variable +warning - lib/views/home/Captin/home_captain/widget/zones_controller.dart:65:12 - The value of the local variable 'jsonMap' isn't used. Try removing the variable or using it. - unused_local_variable +warning - lib/views/home/Captin/maintain_center_page.dart:2:8 - Unused import: 'package:siro_driver/constant/style.dart'. Try removing the import directive. - unused_import +warning - lib/views/home/Captin/mapDriverWidgets/google_driver_map_page.dart:20:31 - The value of the local variable 'controller' isn't used. Try removing the variable or using it. - unused_local_variable +warning - lib/views/home/Captin/mapDriverWidgets/google_driver_map_page.dart:23:18 - The value of the local variable 'mapPaddingBottom' isn't used. Try removing the variable or using it. - unused_local_variable +warning - lib/views/home/Captin/mapDriverWidgets/google_map_app.dart:2:8 - Unused import: 'package:siro_driver/constant/style.dart'. Try removing the import directive. - unused_import +warning - lib/views/home/Captin/mapDriverWidgets/passenger_info_window.dart:17:8 - Unused import: '../../../widgets/my_textField.dart'. Try removing the import directive. - unused_import +warning - lib/views/home/Captin/mapDriverWidgets/sos_connect.dart:3:8 - Unused import: 'package:siro_driver/views/widgets/error_snakbar.dart'. Try removing the import directive. - unused_import +warning - lib/views/home/Captin/mapDriverWidgets/sos_connect.dart:10:8 - Unused import: '../../../../constant/style.dart'. Try removing the import directive. - unused_import +warning - lib/views/home/Captin/mapDriverWidgets/sos_connect.dart:11:8 - Unused import: '../../../../controller/firebase/notification_service.dart'. Try removing the import directive. - unused_import +warning - lib/views/home/Captin/mapDriverWidgets/sped_circle.dart:19:14 - The value of the local variable 'isSpeeding' isn't used. Try removing the variable or using it. - unused_local_variable +warning - lib/views/home/Captin/orderCaptin/order_over_lay.dart:12:8 - Unused import: '../../../../controller/firebase/firbase_messge.dart'. Try removing the import directive. - unused_import +warning - lib/views/home/Captin/orderCaptin/order_over_lay.dart:14:8 - Unused import: '../../../../controller/firebase/notification_service.dart'. Try removing the import directive. - unused_import +warning - lib/views/home/Captin/orderCaptin/order_over_lay.dart:51:14 - The value of the field '_crud' isn't used. Try removing the field, or using it. - unused_field +warning - lib/views/home/Captin/orderCaptin/order_over_lay.dart:109:8 - The declaration '_setupOverlayListener' isn't referenced. Try removing the declaration of '_setupOverlayListener'. - unused_element +warning - lib/views/home/Captin/orderCaptin/order_request_page.dart:14:34 - The value of the local variable 'controller' isn't used. Try removing the variable or using it. - unused_local_variable +warning - lib/views/home/Captin/text_scanner.dart:1:8 - Unused import: 'dart:convert'. Try removing the import directive. - unused_import +warning - lib/views/home/my_wallet/bank_account_egypt.dart:118:43 - The operand can't be 'null', so the condition is always 'true'. Remove the condition. - unnecessary_null_comparison +warning - lib/views/home/my_wallet/bank_account_egypt.dart:127:52 - The operand can't be 'null', so the condition is always 'true'. Remove the condition. - unnecessary_null_comparison +warning - lib/views/home/my_wallet/card_wallet_widget.dart:13:8 - Unused import: '../../../controller/home/payment/paymob_payout.dart'. Try removing the import directive. - unused_import +warning - lib/views/home/my_wallet/points_captain.dart:15:8 - Unused import: '../../../controller/payment/mtn_new/mtn_payment_new_screen.dart'. Try removing the import directive. - unused_import +warning - lib/views/home/on_boarding_page.dart:8:7 - This class (or a class that this class inherits from) is marked as '@immutable', but one or more of its instance fields aren't final: OnBoardingPage.onBoardingControllerImp - must_be_immutable +warning - lib/views/home/profile/captains_cars.dart:3:8 - Unused import: 'package:siro_driver/constant/style.dart'. Try removing the import directive. - unused_import +warning - lib/views/home/profile/captains_cars.dart:4:8 - Unused import: 'package:siro_driver/controller/functions/encrypt_decrypt.dart'. Try removing the import directive. - unused_import +warning - lib/views/home/profile/cars_inserting_page.dart:9:8 - Unused import: '../../../controller/functions/encrypt_decrypt.dart'. Try removing the import directive. - unused_import +warning - lib/views/home/profile/cars_inserting_page.dart:187:70 - The left operand can't be null, so the right operand is never executed. Try removing the operator and the right operand. - dead_null_aware_expression +warning - lib/views/home/profile/feed_back_page.dart:9:7 - This class (or a class that this class inherits from) is marked as '@immutable', but one or more of its instance fields aren't final: FeedBackPage.feedBackController - must_be_immutable +warning - lib/views/home/profile/passenger_profile_page.dart:16:7 - This class (or a class that this class inherits from) is marked as '@immutable', but one or more of its instance fields aren't final: PassengerProfilePage.logOutController - must_be_immutable +warning - lib/views/home/profile/profile_captain.dart:22:11 - The value of the local variable 'controller' isn't used. Try removing the variable or using it. - unused_local_variable +warning - lib/views/home/profile/promos_passenger_page.dart:8:8 - Unused import: '../../../constant/style.dart'. Try removing the import directive. - unused_import +warning - lib/views/notification/available_rides_page.dart:1:8 - Unused import: 'dart:convert'. Try removing the import directive. - unused_import +warning - lib/views/notification/available_rides_page.dart:5:8 - Unused import: 'package:intaleq_maps/intaleq_maps.dart'. Try removing the import directive. - unused_import +warning - lib/views/widgets/error_snakbar.dart:5:8 - Unused import: '../../constant/colors.dart'. Try removing the import directive. - unused_import +warning - lib/views/widgets/my_scafold.dart:2:8 - Unused import: 'package:get/get.dart'. Try removing the import directive. - unused_import +warning - lib/views/widgets/my_scafold.dart:5:8 - Unused import: '../../constant/style.dart'. Try removing the import directive. - unused_import +warning - lib/views/widgets/voice_call_bottom_sheet.dart:4:8 - Unused import: '../../constant/colors.dart'. Try removing the import directive. - unused_import +warning - lib/views/widgets/voice_call_bottom_sheet.dart:5:8 - Unused import: '../../constant/style.dart'. Try removing the import directive. - unused_import +warning - pubspec.yaml:127:7 - The asset file 'shorebird.yaml' doesn't exist. Try creating the file or fixing the path to the file. - asset_does_not_exist +warning - trip_overlay_plugin/example/lib/main.dart:20:9 - The value of the field '_tripOverlayPlugin' isn't used. Try removing the field, or using it. - unused_field +warning - trip_overlay_plugin/test/trip_overlay_plugin_test.dart:2:8 - Unused import: 'package:trip_overlay_plugin/trip_overlay_plugin.dart'. Try removing the import directive. - unused_import + info - bubble-master/lib/bubble.dart:3:8 - The import of 'dart:typed_data' is unnecessary because all of the used elements are also provided by the import of 'package:flutter/services.dart'. Try removing the import directive. - unnecessary_import + info - bubble-master/lib/bubble.dart:9:7 - Unnecessary 'const' keyword. Try removing the keyword. - unnecessary_const + info - lib/constant/api_key.dart:7:23 - The variable name 'sss_pass' isn't a lowerCamelCase identifier. Try changing the name to follow the lowerCamelCase style. - non_constant_identifier_names + info - lib/constant/api_key.dart:15:23 - The variable name 'sss_encryptionSalt' isn't a lowerCamelCase identifier. Try changing the name to follow the lowerCamelCase style. - non_constant_identifier_names + info - lib/constant/box_name.dart:13:23 - The constant name 'FCM_PRIVATE_KEY' isn't a lowerCamelCase identifier. Try changing the name to follow the lowerCamelCase style. - constant_identifier_names + info - lib/constant/box_name.dart:17:23 - The constant name 'security_check' isn't a lowerCamelCase identifier. Try changing the name to follow the lowerCamelCase style. - constant_identifier_names + info - lib/constant/box_name.dart:70:23 - The constant name 'is_claimed' isn't a lowerCamelCase identifier. Try changing the name to follow the lowerCamelCase style. - constant_identifier_names + info - lib/constant/colors.dart:63:58 - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss. Try replacing the use of the deprecated member with the replacement. - deprecated_member_use + info - lib/constant/colors.dart:64:64 - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss. Try replacing the use of the deprecated member with the replacement. - deprecated_member_use + info - lib/constant/credential.dart:2:8 - The imported package 'crypto' isn't a dependency of the importing package. Try adding a dependency for 'crypto' in the 'pubspec.yaml' file. - depend_on_referenced_packages + info - lib/constant/credential.dart:12:3 - Missing type annotation. Try adding a type annotation. - strict_top_level_inference + info - lib/constant/credential.dart:34:7 - Don't invoke 'print' in production code. Try using a logging framework. - avoid_print + info - lib/constant/credential.dart:76:5 - Don't invoke 'print' in production code. Try using a logging framework. - avoid_print + info - lib/constant/finance_design_system.dart:14:81 - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss. Try replacing the use of the deprecated member with the replacement. - deprecated_member_use + info - lib/constant/links.dart:233:17 - The variable name 'add_solve_all' isn't a lowerCamelCase identifier. Try changing the name to follow the lowerCamelCase style. - non_constant_identifier_names + info - lib/constant/links.dart:321:17 - The variable name 'get_driver_behavior' isn't a lowerCamelCase identifier. Try changing the name to follow the lowerCamelCase style. - non_constant_identifier_names + info - lib/constant/links.dart:350:17 - The variable name 'register_driver_and_car' isn't a lowerCamelCase identifier. Try changing the name to follow the lowerCamelCase style. - non_constant_identifier_names + info - lib/constant/table_names.dart:18:23 - The constant name 'FCM_PRIVATE_KEY' isn't a lowerCamelCase identifier. Try changing the name to follow the lowerCamelCase style. - constant_identifier_names + info - lib/controller/auth/captin/history_captain.dart:17:3 - Missing type annotation. Try adding a type annotation. - strict_top_level_inference + info - lib/controller/auth/captin/history_captain.dart:22:3 - Missing type annotation. Try adding a type annotation. - strict_top_level_inference + info - lib/controller/auth/captin/history_captain.dart:45:3 - Missing type annotation. Try adding a type annotation. - strict_top_level_inference + info - lib/controller/auth/captin/invit_controller.dart:5:8 - The import of 'package:flutter_contacts/contact.dart' is unnecessary because all of the used elements are also provided by the import of 'package:flutter_contacts/flutter_contacts.dart'. Try removing the import directive. - unnecessary_import + info - lib/controller/auth/captin/invit_controller.dart:47:13 - 'Share' is deprecated and shouldn't be used. Use SharePlus instead. Try replacing the use of the deprecated member with the replacement. - deprecated_member_use + info - lib/controller/auth/captin/invit_controller.dart:47:19 - 'share' is deprecated and shouldn't be used. Use SharePlus.instance.share() instead. Try replacing the use of the deprecated member with the replacement. - deprecated_member_use + info - lib/controller/auth/captin/invit_controller.dart:57:13 - 'Share' is deprecated and shouldn't be used. Use SharePlus instead. Try replacing the use of the deprecated member with the replacement. - deprecated_member_use + info - lib/controller/auth/captin/invit_controller.dart:57:19 - 'share' is deprecated and shouldn't be used. Use SharePlus.instance.share() instead. Try replacing the use of the deprecated member with the replacement. - deprecated_member_use + info - lib/controller/auth/captin/invit_controller.dart:77:7 - Don't invoke 'print' in production code. Try using a logging framework. - avoid_print + info - lib/controller/auth/captin/invit_controller.dart:267:53 - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss. Try replacing the use of the deprecated member with the replacement. - deprecated_member_use + info - lib/controller/auth/captin/invit_controller.dart:504:15 - Use interpolation to compose strings and values. Try using string interpolation to build the composite string. - prefer_interpolation_to_compose_strings + info - lib/controller/auth/captin/login_captin_controller.dart:3:8 - The imported package 'crypto' isn't a dependency of the importing package. Try adding a dependency for 'crypto' in the 'pubspec.yaml' file. - depend_on_referenced_packages + info - lib/controller/auth/captin/login_captin_controller.dart:77:3 - Missing type annotation. Try adding a type annotation. - strict_top_level_inference + info - lib/controller/auth/captin/login_captin_controller.dart:98:3 - Missing type annotation. Try adding a type annotation. - strict_top_level_inference + info - lib/controller/auth/captin/login_captin_controller.dart:103:3 - Missing type annotation. Try adding a type annotation. - strict_top_level_inference + info - lib/controller/auth/captin/login_captin_controller.dart:136:3 - Missing type annotation. Try adding a type annotation. - strict_top_level_inference + info - lib/controller/auth/captin/login_captin_controller.dart:165:3 - Missing type annotation. Try adding a type annotation. - strict_top_level_inference + info - lib/controller/auth/captin/login_captin_controller.dart:188:38 - Unnecessary braces in a string interpolation. Try removing the braces. - unnecessary_brace_in_string_interps + info - lib/controller/auth/captin/login_captin_controller.dart:287:24 - Unnecessary braces in a string interpolation. Try removing the braces. - unnecessary_brace_in_string_interps + info - lib/controller/auth/captin/login_captin_controller.dart:314:3 - Missing type annotation. Try adding a type annotation. - strict_top_level_inference + info - lib/controller/auth/captin/login_captin_controller.dart:324:43 - Unnecessary braces in a string interpolation. Try removing the braces. - unnecessary_brace_in_string_interps + info - lib/controller/auth/captin/login_captin_controller.dart:467:3 - Missing type annotation. Try adding a type annotation. - strict_top_level_inference + info - lib/controller/auth/captin/login_captin_controller.dart:556:3 - Missing type annotation. Try adding a type annotation. - strict_top_level_inference + info - lib/controller/auth/captin/opt_token_controller.dart:95:48 - Unnecessary braces in a string interpolation. Try removing the braces. - unnecessary_brace_in_string_interps + info - lib/controller/auth/captin/phone_helper_controller.dart:40:15 - Use interpolation to compose strings and values. Try using string interpolation to build the composite string. - prefer_interpolation_to_compose_strings + info - lib/controller/auth/captin/phone_helper_controller.dart:45:15 - Use interpolation to compose strings and values. Try using string interpolation to build the composite string. - prefer_interpolation_to_compose_strings + info - lib/controller/auth/captin/phone_helper_controller.dart:57:17 - Use interpolation to compose strings and values. Try using string interpolation to build the composite string. - prefer_interpolation_to_compose_strings + info - lib/controller/auth/captin/phone_helper_controller.dart:64:14 - Use interpolation to compose strings and values. Try using string interpolation to build the composite string. - prefer_interpolation_to_compose_strings + info - lib/controller/auth/captin/phone_helper_controller.dart:69:14 - Use interpolation to compose strings and values. Try using string interpolation to build the composite string. - prefer_interpolation_to_compose_strings + info - lib/controller/auth/captin/phone_helper_controller.dart:74:14 - Use interpolation to compose strings and values. Try using string interpolation to build the composite string. - prefer_interpolation_to_compose_strings + info - lib/controller/auth/captin/phone_helper_controller.dart:90:30 - Unnecessary braces in a string interpolation. Try removing the braces. - unnecessary_brace_in_string_interps + info - lib/controller/auth/captin/phone_helper_controller.dart:94:26 - Unnecessary braces in a string interpolation. Try removing the braces. - unnecessary_brace_in_string_interps + info - lib/controller/auth/captin/register_captin_controller.dart:46:3 - Missing type annotation. Try adding a type annotation. - strict_top_level_inference + info - lib/controller/auth/captin/register_captin_controller.dart:96:3 - Missing type annotation. Try adding a type annotation. - strict_top_level_inference + info - lib/controller/auth/captin/register_captin_controller.dart:228:3 - Missing type annotation. Try adding a type annotation. - strict_top_level_inference + info - lib/controller/auth/captin/register_captin_controller.dart:239:3 - Missing type annotation. Try adding a type annotation. - strict_top_level_inference + info - lib/controller/auth/captin/register_captin_controller.dart:261:3 - Missing type annotation. Try adding a type annotation. - strict_top_level_inference + info - lib/controller/auth/captin/register_captin_controller.dart:293:3 - Missing type annotation. Try adding a type annotation. - strict_top_level_inference + info - lib/controller/auth/google_sign.dart:23:34 - Type could be non-nullable. Try changing the type to be non-nullable. - unnecessary_nullable_for_final_variable_declarations + info - lib/controller/auth/google_sign.dart:44:34 - Type could be non-nullable. Try changing the type to be non-nullable. - unnecessary_nullable_for_final_variable_declarations + info - lib/controller/auth/google_sign.dart:56:9 - Don't invoke 'print' in production code. Try using a logging framework. - avoid_print + info - lib/controller/auth/google_sign.dart:57:9 - Don't invoke 'print' in production code. Try using a logging framework. - avoid_print + info - lib/controller/auth/login_controller.dart:67:21 - Use interpolation to compose strings and values. Try using string interpolation to build the composite string. - prefer_interpolation_to_compose_strings + info - lib/controller/auth/login_controller.dart:107:3 - Missing type annotation. Try adding a type annotation. - strict_top_level_inference + info - lib/controller/auth/login_controller.dart:114:8 - Unnecessary override. Try adding behavior in the overriding member or removing the override. - unnecessary_overrides + info - lib/controller/auth/onboarding_controller.dart:10:3 - Missing type annotation. Try adding a type annotation. - strict_top_level_inference + info - lib/controller/auth/onboarding_controller.dart:11:3 - Missing type annotation. Try adding a type annotation. - strict_top_level_inference + info - lib/controller/auth/register_controller.dart:28:8 - Unnecessary override. Try adding behavior in the overriding member or removing the override. - unnecessary_overrides + info - lib/controller/auth/register_controller.dart:32:3 - Missing type annotation. Try adding a type annotation. - strict_top_level_inference + info - lib/controller/auth/register_controller.dart:62:3 - Missing type annotation. Try adding a type annotation. - strict_top_level_inference + info - lib/controller/auth/syria/registration_controller.dart:8:8 - The imported package 'image' isn't a dependency of the importing package. Try adding a dependency for 'image' in the 'pubspec.yaml' file. - depend_on_referenced_packages + info - lib/controller/auth/syria/registration_controller.dart:13:8 - The imported package 'path_provider' isn't a dependency of the importing package. Try adding a dependency for 'path_provider' in the 'pubspec.yaml' file. - depend_on_referenced_packages + info - lib/controller/auth/syria/registration_controller.dart:15:8 - The imported package 'path_provider' isn't a dependency of the importing package. Try adding a dependency for 'path_provider' in the 'pubspec.yaml' file. - depend_on_referenced_packages + info - lib/controller/auth/syria/registration_controller.dart:18:8 - The imported package 'http_parser' isn't a dependency of the importing package. Try adding a dependency for 'http_parser' in the 'pubspec.yaml' file. - depend_on_referenced_packages + info - lib/controller/auth/syria/registration_controller.dart:19:8 - The imported package 'mime' isn't a dependency of the importing package. Try adding a dependency for 'mime' in the 'pubspec.yaml' file. - depend_on_referenced_packages + info - lib/controller/auth/syria/registration_controller.dart:50:7 - An uninitialized field should have an explicit type annotation. Try adding a type annotation. - prefer_typing_uninitialized_variables + info - lib/controller/auth/syria/registration_controller.dart:50:7 - Missing type annotation. Try replacing 'var' with a type annotation. - strict_top_level_inference + info - lib/controller/auth/syria/registration_controller.dart:486:10 - The local variable '_addField' starts with an underscore. Try renaming the variable to not start with an underscore. - no_leading_underscores_for_local_identifiers + info - lib/controller/auth/verify_email_controller.dart:9:8 - Unnecessary override. Try adding behavior in the overriding member or removing the override. - unnecessary_overrides + info - lib/controller/auth/verify_email_controller.dart:13:3 - Missing type annotation. Try adding a type annotation. - strict_top_level_inference + info - lib/controller/firebase/firbase_messge.dart:72:36 - Unnecessary braces in a string interpolation. Try removing the braces. - unnecessary_brace_in_string_interps + info - lib/controller/firebase/firbase_messge.dart:77:5 - Don't invoke 'print' in production code. Try using a logging framework. - avoid_print + info - lib/controller/firebase/firbase_messge.dart:348:3 - Constructors for public widgets should have a named 'key' parameter. Try adding a named parameter to the constructor. - use_key_in_widget_constructors + info - lib/controller/firebase/firbase_messge.dart:348:3 - Constructors in '@immutable' classes should be declared as 'const'. Try adding 'const' to the constructor declaration. - prefer_const_constructors_in_immutables + info - lib/controller/firebase/local_notification.dart:4:8 - The import of 'dart:ui' is unnecessary because all of the used elements are also provided by the import of 'package:flutter/material.dart'. Try removing the import directive. - unnecessary_import + info - lib/controller/firebase/local_notification.dart:10:8 - The imported package 'timezone' isn't a dependency of the importing package. Try adding a dependency for 'timezone' in the 'pubspec.yaml' file. - depend_on_referenced_packages + info - lib/controller/firebase/local_notification.dart:11:8 - The imported package 'timezone' isn't a dependency of the importing package. Try adding a dependency for 'timezone' in the 'pubspec.yaml' file. - depend_on_referenced_packages + info - lib/controller/firebase/local_notification.dart:65:5 - Don't invoke 'print' in production code. Try using a logging framework. - avoid_print + info - lib/controller/firebase/local_notification.dart:121:7 - Don't invoke 'print' in production code. Try using a logging framework. - avoid_print + info - lib/controller/firebase/local_notification.dart:224:5 - Don't invoke 'print' in production code. Try using a logging framework. - avoid_print + info - lib/controller/firebase/local_notification.dart:256:7 - 'WillPopScope' is deprecated and shouldn't be used. Use PopScope instead. The Android predictive back feature will not work with WillPopScope. This feature was deprecated after v3.12.0-1.0.pre. Try replacing the use of the deprecated member with the replacement. - deprecated_member_use + info - lib/controller/firebase/local_notification.dart:270:7 - Don't invoke 'print' in production code. Try using a logging framework. - avoid_print + info - lib/controller/firebase/local_notification.dart:283:7 - Don't invoke 'print' in production code. Try using a logging framework. - avoid_print + info - lib/controller/firebase/local_notification.dart:310:9 - Don't invoke 'print' in production code. Try using a logging framework. - avoid_print + info - lib/controller/firebase/local_notification.dart:326:7 - Don't invoke 'print' in production code. Try using a logging framework. - avoid_print + info - lib/controller/firebase/local_notification.dart:340:9 - Don't invoke 'print' in production code. Try using a logging framework. - avoid_print + info - lib/controller/firebase/local_notification.dart:346:9 - Don't invoke 'print' in production code. Try using a logging framework. - avoid_print + info - lib/controller/firebase/local_notification.dart:349:7 - Don't invoke 'print' in production code. Try using a logging framework. - avoid_print + info - lib/controller/firebase/local_notification.dart:508:5 - Don't invoke 'print' in production code. Try using a logging framework. - avoid_print + info - lib/controller/firebase/notification_service.dart:53:9 - Don't invoke 'print' in production code. Try using a logging framework. - avoid_print + info - lib/controller/firebase/notification_service.dart:56:9 - Don't invoke 'print' in production code. Try using a logging framework. - avoid_print + info - lib/controller/firebase/notification_service.dart:57:9 - Don't invoke 'print' in production code. Try using a logging framework. - avoid_print + info - lib/controller/firebase/notification_service.dart:60:7 - Don't invoke 'print' in production code. Try using a logging framework. - avoid_print + info - lib/controller/firebase/order_lay.dart:7:7 - Constructors for public widgets should have a named 'key' parameter. Try adding a named parameter to the constructor. - use_key_in_widget_constructors + info - lib/controller/firebase/order_lay.dart:24:13 - Don't invoke 'print' in production code. Try using a logging framework. - avoid_print + info - lib/controller/firebase/order_lay.dart:27:19 - Don't use 'BuildContext's across async gaps. Try rewriting the code to not use the 'BuildContext', or guard the use with a 'mounted' check. - use_build_context_synchronously + info - lib/controller/functions/add_error.dart:6:1 - Missing type annotation. Try adding a type annotation. - strict_top_level_inference + info - lib/controller/functions/add_error.dart:30:5 - Don't invoke 'print' in production code. Try using a logging framework. - avoid_print + info - lib/controller/functions/audio_controller.dart:18:9 - Don't invoke 'print' in production code. Try using a logging framework. - avoid_print + info - lib/controller/functions/audio_controller.dart:33:7 - Don't invoke 'print' in production code. Try using a logging framework. - avoid_print + info - lib/controller/functions/audio_recorder_controller.dart:2:8 - The imported package 'path_provider' isn't a dependency of the importing package. Try adding a dependency for 'path_provider' in the 'pubspec.yaml' file. - depend_on_referenced_packages + info - lib/controller/functions/background_service.dart:9:60 - The prefix 'IO' isn't a lower_case_with_underscores identifier. Try changing the prefix to follow the lower_case_with_underscores style. - library_prefixes + info - lib/controller/functions/background_service.dart:10:72 - The prefix 'Overlay' isn't a lower_case_with_underscores identifier. Try changing the prefix to follow the lower_case_with_underscores style. - library_prefixes + info - lib/controller/functions/background_service.dart:51:7 - Don't invoke 'print' in production code. Try using a logging framework. - avoid_print + info - lib/controller/functions/background_service.dart:72:7 - Don't invoke 'print' in production code. Try using a logging framework. - avoid_print + info - lib/controller/functions/background_service.dart:86:9 - Don't invoke 'print' in production code. Try using a logging framework. - avoid_print + info - lib/controller/functions/background_service.dart:92:9 - Don't invoke 'print' in production code. Try using a logging framework. - avoid_print + info - lib/controller/functions/background_service.dart:106:11 - Don't invoke 'print' in production code. Try using a logging framework. - avoid_print + info - lib/controller/functions/background_service.dart:159:9 - Don't invoke 'print' in production code. Try using a logging framework. - avoid_print + info - lib/controller/functions/background_service.dart:162:9 - Don't invoke 'print' in production code. Try using a logging framework. - avoid_print + info - lib/controller/functions/battery_status.dart:15:54 - Statements in an if should be enclosed in a block. Try wrapping the statement in a block. - curly_braces_in_flow_control_structures + info - lib/controller/functions/battery_status.dart:36:7 - Don't invoke 'print' in production code. Try using a logging framework. - avoid_print + info - lib/controller/functions/crud.dart:82:17 - Empty catch block. Try adding statements to the block, adding a comment to the block, or removing the 'catch' clause. - empty_catches + info - lib/controller/functions/crud.dart:512:7 - Statements in an if should be enclosed in a block. Try wrapping the statement in a block. - curly_braces_in_flow_control_structures + info - lib/controller/functions/crud.dart:625:13 - Use interpolation to compose strings and values. Try using string interpolation to build the composite string. - prefer_interpolation_to_compose_strings + info - lib/controller/functions/device_analyzer.dart:26:7 - Don't invoke 'print' in production code. Try using a logging framework. - avoid_print + info - lib/controller/functions/device_analyzer.dart:50:7 - Don't invoke 'print' in production code. Try using a logging framework. - avoid_print + info - lib/controller/functions/encrypt.dart:21:5 - Don't invoke 'print' in production code. Try using a logging framework. - avoid_print + info - lib/controller/functions/encrypt.dart:24:5 - Don't invoke 'print' in production code. Try using a logging framework. - avoid_print + info - lib/controller/functions/encrypt_decrypt.dart:71:1 - Missing type annotation. Try adding a type annotation. - strict_top_level_inference + info - lib/controller/functions/encrypt_decrypt.dart:75:1 - Missing type annotation. Try adding a type annotation. - strict_top_level_inference + info - lib/controller/functions/face_detect.dart:35:3 - Don't invoke 'print' in production code. Try using a logging framework. - avoid_print + info - lib/controller/functions/face_detect.dart:45:7 - Don't invoke 'print' in production code. Try using a logging framework. - avoid_print + info - lib/controller/functions/face_detect.dart:45:22 - Unnecessary braces in a string interpolation. Try removing the braces. - unnecessary_brace_in_string_interps + info - lib/controller/functions/face_detect.dart:48:7 - Don't invoke 'print' in production code. Try using a logging framework. - avoid_print + info - lib/controller/functions/face_detect.dart:52:5 - Don't invoke 'print' in production code. Try using a logging framework. - avoid_print + info - lib/controller/functions/face_detect.dart:84:7 - Don't invoke 'print' in production code. Try using a logging framework. - avoid_print + info - lib/controller/functions/face_detect.dart:85:7 - Don't invoke 'print' in production code. Try using a logging framework. - avoid_print + info - lib/controller/functions/face_detect.dart:89:7 - Don't invoke 'print' in production code. Try using a logging framework. - avoid_print + info - lib/controller/functions/gemeni.dart:5:8 - The imported package 'crypto' isn't a dependency of the importing package. Try adding a dependency for 'crypto' in the 'pubspec.yaml' file. - depend_on_referenced_packages + info - lib/controller/functions/gemeni.dart:24:8 - The imported package 'image' isn't a dependency of the importing package. Try adding a dependency for 'image' in the 'pubspec.yaml' file. - depend_on_referenced_packages + info - lib/controller/functions/gemeni.dart:25:8 - The imported package 'path_provider' isn't a dependency of the importing package. Try adding a dependency for 'path_provider' in the 'pubspec.yaml' file. - depend_on_referenced_packages + info - lib/controller/functions/gemeni.dart:327:3 - Missing type annotation. Try adding a type annotation. - strict_top_level_inference + info - lib/controller/functions/gemeni.dart:364:17 - Empty catch block. Try adding statements to the block, adding a comment to the block, or removing the 'catch' clause. - empty_catches + info - lib/controller/functions/gemeni.dart:385:7 - An uninitialized field should have an explicit type annotation. Try adding a type annotation. - prefer_typing_uninitialized_variables + info - lib/controller/functions/gemeni.dart:385:7 - Missing type annotation. Try replacing 'var' with a type annotation. - strict_top_level_inference + info - lib/controller/functions/gemeni.dart:389:3 - Missing type annotation. Try adding a type annotation. - strict_top_level_inference + info - lib/controller/functions/gemeni.dart:1616:3 - Missing type annotation. Try adding a type annotation. - strict_top_level_inference + info - lib/controller/functions/gemeni.dart:1625:3 - Missing type annotation. Try adding a type annotation. - strict_top_level_inference + info - lib/controller/functions/geolocation.dart:32:9 - 'desiredAccuracy' is deprecated and shouldn't be used. use settings parameter with AndroidSettings, AppleSettings, WebSettings, or LocationSettings. Try replacing the use of the deprecated member with the replacement. - deprecated_member_use + info - lib/controller/functions/launch.dart:51:7 - Don't invoke 'print' in production code. Try using a logging framework. - avoid_print + info - lib/controller/functions/location_background_controller.dart:19:9 - Don't invoke 'print' in production code. Try using a logging framework. - avoid_print + info - lib/controller/functions/location_background_controller.dart:39:11 - Don't invoke 'print' in production code. Try using a logging framework. - avoid_print + info - lib/controller/functions/location_background_controller.dart:46:11 - Don't invoke 'print' in production code. Try using a logging framework. - avoid_print + info - lib/controller/functions/location_controller.dart:11:60 - The prefix 'IO' isn't a lower_case_with_underscores identifier. Try changing the prefix to follow the lower_case_with_underscores style. - library_prefixes + info - lib/controller/functions/location_permission.dart:52:7 - Don't invoke 'print' in production code. Try using a logging framework. - avoid_print + info - lib/controller/functions/location_permission.dart:54:7 - Don't invoke 'print' in production code. Try using a logging framework. - avoid_print + info - lib/controller/functions/location_permission.dart:57:5 - Don't invoke 'print' in production code. Try using a logging framework. - avoid_print + info - lib/controller/functions/log_out.dart:27:3 - Missing type annotation. Try adding a type annotation. - strict_top_level_inference + info - lib/controller/functions/log_out.dart:34:3 - Missing type annotation. Try adding a type annotation. - strict_top_level_inference + info - lib/controller/functions/log_out.dart:97:36 - 'MaterialStateProperty' is deprecated and shouldn't be used. Use WidgetStateProperty instead. Moved to the Widgets layer to make code available outside of Material. This feature was deprecated after v3.19.0-0.3.pre. Try replacing the use of the deprecated member with the replacement. - deprecated_member_use + info - lib/controller/functions/log_out.dart:127:36 - 'MaterialStateProperty' is deprecated and shouldn't be used. Use WidgetStateProperty instead. Moved to the Widgets layer to make code available outside of Material. This feature was deprecated after v3.19.0-0.3.pre. Try replacing the use of the deprecated member with the replacement. - deprecated_member_use + info - lib/controller/functions/log_out.dart:144:3 - Missing type annotation. Try adding a type annotation. - strict_top_level_inference + info - lib/controller/functions/network/net_guard.dart:16:22 - The type of the right operand ('ConnectivityResult') isn't a subtype or a supertype of the left operand ('List'). Try changing one or both of the operands. - unrelated_type_equality_checks + info - lib/controller/functions/overlay_permisssion.dart:47:11 - Don't use 'BuildContext's across async gaps. Try rewriting the code to not use the 'BuildContext', or guard the use with a 'mounted' check. - use_build_context_synchronously + info - lib/controller/functions/package_info.dart:26:3 - Don't invoke 'print' in production code. Try using a logging framework. - avoid_print + info - lib/controller/functions/package_info.dart:32:22 - Don't use 'BuildContext's across async gaps. Try rewriting the code to not use the 'BuildContext', or guard the use with a 'mounted' check. - use_build_context_synchronously + info - lib/controller/functions/package_info.dart:56:32 - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss. Try replacing the use of the deprecated member with the replacement. - deprecated_member_use + info - lib/controller/functions/package_info.dart:173:9 - An uninitialized variable should have an explicit type annotation. Try adding a type annotation. - prefer_typing_uninitialized_variables + info - lib/controller/functions/package_info.dart:178:34 - 'toMap' is deprecated and shouldn't be used. Use [data] getter instead. Try replacing the use of the deprecated member with the replacement. - deprecated_member_use + info - lib/controller/functions/package_info.dart:181:30 - 'toMap' is deprecated and shouldn't be used. Use [data] getter instead. Try replacing the use of the deprecated member with the replacement. - deprecated_member_use + info - lib/controller/functions/package_info.dart:359:5 - Don't invoke 'print' in production code. Try using a logging framework. - avoid_print + info - lib/controller/functions/performance_test.dart:23:7 - Don't invoke 'print' in production code. Try using a logging framework. - avoid_print + info - lib/controller/functions/performance_test.dart:39:7 - Don't invoke 'print' in production code. Try using a logging framework. - avoid_print + info - lib/controller/functions/secure_storage.dart:98:17 - Empty catch block. Try adding statements to the block, adding a comment to the block, or removing the 'catch' clause. - empty_catches + info - lib/controller/functions/security_checks.dart:18:7 - Don't invoke 'print' in production code. Try using a logging framework. - avoid_print + info - lib/controller/functions/security_checks.dart:23:10 - Missing type annotation. Try adding a type annotation. - strict_top_level_inference + info - lib/controller/functions/security_checks.dart:28:9 - Don't use 'BuildContext's across async gaps. Try rewriting the code to not use the 'BuildContext', or guard the use with a 'mounted' check. - use_build_context_synchronously + info - lib/controller/functions/security_checks.dart:48:7 - Don't invoke 'print' in production code. Try using a logging framework. - avoid_print + info - lib/controller/functions/tts.dart:58:7 - Don't invoke 'print' in production code. Try using a logging framework. - avoid_print + info - lib/controller/functions/tts.dart:77:7 - Don't invoke 'print' in production code. Try using a logging framework. - avoid_print + info - lib/controller/functions/tts.dart:90:7 - Don't invoke 'print' in production code. Try using a logging framework. - avoid_print + info - lib/controller/functions/upload_image.dart:10:8 - The imported package 'image' isn't a dependency of the importing package. Try adding a dependency for 'image' in the 'pubspec.yaml' file. - depend_on_referenced_packages + info - lib/controller/functions/upload_image.dart:13:8 - The imported package 'path_provider' isn't a dependency of the importing package. Try adding a dependency for 'path_provider' in the 'pubspec.yaml' file. - depend_on_referenced_packages + info - lib/controller/functions/upload_image.dart:27:7 - An uninitialized field should have an explicit type annotation. Try adding a type annotation. - prefer_typing_uninitialized_variables + info - lib/controller/functions/upload_image.dart:27:7 - Missing type annotation. Try replacing 'var' with a type annotation. - strict_top_level_inference + info - lib/controller/functions/upload_image.dart:107:3 - Missing type annotation. Try adding a type annotation. - strict_top_level_inference + info - lib/controller/functions/upload_image.dart:144:7 - Don't invoke 'print' in production code. Try using a logging framework. - avoid_print + info - lib/controller/functions/upload_image.dart:157:7 - Don't invoke 'print' in production code. Try using a logging framework. - avoid_print + info - lib/controller/functions/upload_image.dart:167:3 - Missing type annotation. Try adding a type annotation. - strict_top_level_inference + info - lib/controller/functions/upload_image.dart:204:7 - Don't invoke 'print' in production code. Try using a logging framework. - avoid_print + info - lib/controller/functions/upload_image.dart:211:15 - Use interpolation to compose strings and values. Try using string interpolation to build the composite string. - prefer_interpolation_to_compose_strings + info - lib/controller/functions/upload_image.dart:218:7 - Don't invoke 'print' in production code. Try using a logging framework. - avoid_print + info - lib/controller/functions/upload_image.dart:270:3 - Missing type annotation. Try adding a type annotation. - strict_top_level_inference + info - lib/controller/functions/upload_image.dart:284:7 - Don't invoke 'print' in production code. Try using a logging framework. - avoid_print + info - lib/controller/functions/upload_image.dart:306:3 - Missing type annotation. Try adding a type annotation. - strict_top_level_inference + info - lib/controller/functions/upload_image.dart:342:3 - Missing type annotation. Try adding a type annotation. - strict_top_level_inference + info - lib/controller/functions/upload_image.dart:376:3 - Missing type annotation. Try adding a type annotation. - strict_top_level_inference + info - lib/controller/functions/upload_image.dart:406:5 - Don't invoke 'print' in production code. Try using a logging framework. - avoid_print + info - lib/controller/functions/upload_image.dart:421:21 - Unnecessary braces in a string interpolation. Try removing the braces. - unnecessary_brace_in_string_interps + info - lib/controller/functions/upload_image.dart:429:3 - Missing type annotation. Try adding a type annotation. - strict_top_level_inference + info - lib/controller/home/captin/behavior_controller.dart:41:21 - Unnecessary braces in a string interpolation. Try removing the braces. - unnecessary_brace_in_string_interps + info - lib/controller/home/captin/duration_controller .dart:1:1 - The file name 'duration_controller .dart' isn't a lower_case_with_underscores identifier. Try changing the name to follow the lower_case_with_underscores style. - file_names + info - lib/controller/home/captin/duration_controller .dart:24:7 - An uninitialized field should have an explicit type annotation. Try adding a type annotation. - prefer_typing_uninitialized_variables + info - lib/controller/home/captin/duration_controller .dart:24:7 - Missing type annotation. Try replacing 'var' with a type annotation. - strict_top_level_inference + info - lib/controller/home/captin/duration_controller .dart:25:7 - An uninitialized field should have an explicit type annotation. Try adding a type annotation. - prefer_typing_uninitialized_variables + info - lib/controller/home/captin/duration_controller .dart:25:7 - Missing type annotation. Try replacing 'var' with a type annotation. - strict_top_level_inference + info - lib/controller/home/captin/duration_controller .dart:26:7 - An uninitialized field should have an explicit type annotation. Try adding a type annotation. - prefer_typing_uninitialized_variables + info - lib/controller/home/captin/duration_controller .dart:26:7 - Missing type annotation. Try replacing 'var' with a type annotation. - strict_top_level_inference + info - lib/controller/home/captin/duration_controller .dart:37:3 - Missing type annotation. Try adding a type annotation. - strict_top_level_inference + info - lib/controller/home/captin/help/assurance_controller.dart:50:9 - Don't invoke 'print' in production code. Try using a logging framework. - avoid_print + info - lib/controller/home/captin/help/assurance_controller.dart:55:7 - Don't invoke 'print' in production code. Try using a logging framework. - avoid_print + info - lib/controller/home/captin/help/help_controller.dart:23:3 - Missing type annotation. Try adding a type annotation. - strict_top_level_inference + info - lib/controller/home/captin/home_captain_controller.dart:81:5 - Don't invoke 'print' in production code. Try using a logging framework. - avoid_print + info - lib/controller/home/captin/home_captain_controller.dart:87:7 - Don't invoke 'print' in production code. Try using a logging framework. - avoid_print + info - lib/controller/home/captin/home_captain_controller.dart:99:5 - Don't invoke 'print' in production code. Try using a logging framework. - avoid_print + info - lib/controller/home/captin/home_captain_controller.dart:111:9 - Don't invoke 'print' in production code. Try using a logging framework. - avoid_print + info - lib/controller/home/captin/home_captain_controller.dart:114:9 - Don't invoke 'print' in production code. Try using a logging framework. - avoid_print + info - lib/controller/home/captin/home_captain_controller.dart:117:7 - Don't invoke 'print' in production code. Try using a logging framework. - avoid_print + info - lib/controller/home/captin/home_captain_controller.dart:122:5 - Don't invoke 'print' in production code. Try using a logging framework. - avoid_print + info - lib/controller/home/captin/home_captain_controller.dart:177:5 - Don't invoke 'print' in production code. Try using a logging framework. - avoid_print + info - lib/controller/home/captin/home_captain_controller.dart:179:5 - Don't invoke 'print' in production code. Try using a logging framework. - avoid_print + info - lib/controller/home/captin/home_captain_controller.dart:193:9 - Don't invoke 'print' in production code. Try using a logging framework. - avoid_print + info - lib/controller/home/captin/home_captain_controller.dart:430:5 - Don't invoke 'print' in production code. Try using a logging framework. - avoid_print + info - lib/controller/home/captin/home_captain_controller.dart:484:17 - Empty catch block. Try adding statements to the block, adding a comment to the block, or removing the 'catch' clause. - empty_catches + info - lib/controller/home/captin/home_captain_controller.dart:504:5 - Don't invoke 'print' in production code. Try using a logging framework. - avoid_print + info - lib/controller/home/captin/home_captain_controller.dart:516:11 - Don't invoke 'print' in production code. Try using a logging framework. - avoid_print + info - lib/controller/home/captin/home_captain_controller.dart:522:11 - Don't invoke 'print' in production code. Try using a logging framework. - avoid_print + info - lib/controller/home/captin/home_captain_controller.dart:530:9 - Don't invoke 'print' in production code. Try using a logging framework. - avoid_print + info - lib/controller/home/captin/home_captain_controller.dart:605:3 - Missing type annotation. Try adding a type annotation. - strict_top_level_inference + info - lib/controller/home/captin/home_captain_controller.dart:617:9 - Don't invoke 'print' in production code. Try using a logging framework. - avoid_print + info - lib/controller/home/captin/home_captain_controller.dart:620:9 - Don't invoke 'print' in production code. Try using a logging framework. - avoid_print + info - lib/controller/home/captin/home_captain_controller.dart:624:7 - Don't invoke 'print' in production code. Try using a logging framework. - avoid_print + info - lib/controller/home/captin/home_captain_controller.dart:702:22 - Statements in an if should be enclosed in a block. Try wrapping the statement in a block. - curly_braces_in_flow_control_structures + info - lib/controller/home/captin/home_captain_controller.dart:724:11 - Don't invoke 'print' in production code. Try using a logging framework. - avoid_print + info - lib/controller/home/captin/home_captain_controller.dart:732:3 - Missing type annotation. Try adding a type annotation. - strict_top_level_inference + info - lib/controller/home/captin/home_captain_controller.dart:743:3 - Missing type annotation. Try adding a type annotation. - strict_top_level_inference + info - lib/controller/home/captin/home_captain_controller.dart:755:3 - Missing type annotation. Try adding a type annotation. - strict_top_level_inference + info - lib/controller/home/captin/home_captain_controller.dart:777:3 - Missing type annotation. Try adding a type annotation. - strict_top_level_inference + info - lib/controller/home/captin/home_captain_controller.dart:781:3 - Missing type annotation. Try adding a type annotation. - strict_top_level_inference + info - lib/controller/home/captin/home_captain_controller.dart:791:3 - Missing type annotation. Try adding a type annotation. - strict_top_level_inference + info - lib/controller/home/captin/home_captain_controller.dart:807:3 - Missing type annotation. Try adding a type annotation. - strict_top_level_inference + info - lib/controller/home/captin/home_captain_controller.dart:844:7 - Don't invoke 'print' in production code. Try using a logging framework. - avoid_print + info - lib/controller/home/captin/map_driver_controller.dart:168:5 - Don't invoke 'print' in production code. Try using a logging framework. - avoid_print + info - lib/controller/home/captin/map_driver_controller.dart:174:5 - Don't invoke 'print' in production code. Try using a logging framework. - avoid_print + info - lib/controller/home/captin/map_driver_controller.dart:380:3 - Missing type annotation. Try adding a type annotation. - strict_top_level_inference + info - lib/controller/home/captin/map_driver_controller.dart:809:7 - Don't invoke 'print' in production code. Try using a logging framework. - avoid_print + info - lib/controller/home/captin/map_driver_controller.dart:835:19 - Unnecessary braces in a string interpolation. Try removing the braces. - unnecessary_brace_in_string_interps + info - lib/controller/home/captin/map_driver_controller.dart:877:11 - 'desiredAccuracy' is deprecated and shouldn't be used. use settings parameter with AndroidSettings, AppleSettings, WebSettings, or LocationSettings. Try replacing the use of the deprecated member with the replacement. - deprecated_member_use + info - lib/controller/home/captin/map_driver_controller.dart:967:15 - 'desiredAccuracy' is deprecated and shouldn't be used. use settings parameter with AndroidSettings, AppleSettings, WebSettings, or LocationSettings. Try replacing the use of the deprecated member with the replacement. - deprecated_member_use + info - lib/controller/home/captin/map_driver_controller.dart:1070:3 - Missing type annotation. Try adding a type annotation. - strict_top_level_inference + info - lib/controller/home/captin/map_driver_controller.dart:1642:9 - Don't invoke 'print' in production code. Try using a logging framework. - avoid_print + info - lib/controller/home/captin/map_driver_controller.dart:1795:7 - The private field _stepBounds could be 'final'. Try making the field 'final'. - prefer_final_fields + info - lib/controller/home/captin/map_driver_controller.dart:1796:7 - The private field _stepEndPoints could be 'final'. Try making the field 'final'. - prefer_final_fields + info - lib/controller/home/captin/map_driver_controller.dart:1797:7 - The private field _allPointsForActiveRoute could be 'final'. Try making the field 'final'. - prefer_final_fields + info - lib/controller/home/captin/map_driver_controller.dart:2234:52 - Statements in an if should be enclosed in a block. Try wrapping the statement in a block. - curly_braces_in_flow_control_structures + info - lib/controller/home/captin/map_driver_controller.dart:2261:12 - The private field _lastCameraUpdateTs could be 'final'. Try making the field 'final'. - prefer_final_fields + info - lib/controller/home/captin/map_driver_controller.dart:2330:3 - Missing type annotation. Try adding a type annotation. - strict_top_level_inference + info - lib/controller/home/captin/map_driver_controller.dart:2336:3 - Missing type annotation. Try adding a type annotation. - strict_top_level_inference + info - lib/controller/home/captin/map_driver_controller.dart:2479:37 - Use 'isNotEmpty' instead of 'length' to test whether the collection is empty. Try rewriting the expression to use 'isNotEmpty'. - prefer_is_empty + info - lib/controller/home/captin/map_driver_controller.dart:2488:40 - Use 'isNotEmpty' instead of 'length' to test whether the collection is empty. Try rewriting the expression to use 'isNotEmpty'. - prefer_is_empty + info - lib/controller/home/captin/order_request_controller.dart:81:7 - Don't invoke 'print' in production code. Try using a logging framework. - avoid_print + info - lib/controller/home/captin/order_request_controller.dart:123:5 - Don't invoke 'print' in production code. Try using a logging framework. - avoid_print + info - lib/controller/home/captin/order_request_controller.dart:124:5 - Don't invoke 'print' in production code. Try using a logging framework. - avoid_print + info - lib/controller/home/captin/order_request_controller.dart:143:15 - Don't invoke 'print' in production code. Try using a logging framework. - avoid_print + info - lib/controller/home/captin/order_request_controller.dart:160:5 - Don't invoke 'print' in production code. Try using a logging framework. - avoid_print + info - lib/controller/home/captin/order_request_controller.dart:240:15 - 'desiredAccuracy' is deprecated and shouldn't be used. use settings parameter with AndroidSettings, AppleSettings, WebSettings, or LocationSettings. Try replacing the use of the deprecated member with the replacement. - deprecated_member_use + info - lib/controller/home/captin/order_request_controller.dart:246:13 - 'desiredAccuracy' is deprecated and shouldn't be used. use settings parameter with AndroidSettings, AppleSettings, WebSettings, or LocationSettings. Try replacing the use of the deprecated member with the replacement. - deprecated_member_use + info - lib/controller/home/captin/order_request_controller.dart:304:7 - Don't invoke 'print' in production code. Try using a logging framework. - avoid_print + info - lib/controller/home/captin/order_request_controller.dart:354:7 - Don't invoke 'print' in production code. Try using a logging framework. - avoid_print + info - lib/controller/home/captin/order_request_controller.dart:354:44 - Unnecessary braces in a string interpolation. Try removing the braces. - unnecessary_brace_in_string_interps + info - lib/controller/home/captin/order_request_controller.dart:362:9 - Don't invoke 'print' in production code. Try using a logging framework. - avoid_print + info - lib/controller/home/captin/order_request_controller.dart:386:7 - Don't invoke 'print' in production code. Try using a logging framework. - avoid_print + info - lib/controller/home/captin/order_request_controller.dart:560:7 - Don't invoke 'print' in production code. Try using a logging framework. - avoid_print + info - lib/controller/home/captin/order_request_controller.dart:628:43 - Unnecessary braces in a string interpolation. Try removing the braces. - unnecessary_brace_in_string_interps + info - lib/controller/home/navigation/navigation_controller.dart:462:11 - 'desiredAccuracy' is deprecated and shouldn't be used. use settings parameter with AndroidSettings, AppleSettings, WebSettings, or LocationSettings. Try replacing the use of the deprecated member with the replacement. - deprecated_member_use + info - lib/controller/home/navigation/navigation_controller.dart:785:40 - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss. Try replacing the use of the deprecated member with the replacement. - deprecated_member_use + info - lib/controller/home/navigation/navigation_controller.dart:803:40 - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss. Try replacing the use of the deprecated member with the replacement. - deprecated_member_use + info - lib/controller/home/navigation/navigation_view.dart:120:35 - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss. Try replacing the use of the deprecated member with the replacement. - deprecated_member_use + info - lib/controller/home/navigation/navigation_view.dart:133:9 - Parameter 'key' could be a super parameter. Trying converting 'key' to a super parameter. - use_super_parameters + info - lib/controller/home/navigation/navigation_view.dart:148:41 - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss. Try replacing the use of the deprecated member with the replacement. - deprecated_member_use + info - lib/controller/home/navigation/navigation_view.dart:190:39 - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss. Try replacing the use of the deprecated member with the replacement. - deprecated_member_use + info - lib/controller/home/navigation/navigation_view.dart:218:46 - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss. Try replacing the use of the deprecated member with the replacement. - deprecated_member_use + info - lib/controller/home/navigation/navigation_view.dart:273:35 - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss. Try replacing the use of the deprecated member with the replacement. - deprecated_member_use + info - lib/controller/home/navigation/navigation_view.dart:341:49 - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss. Try replacing the use of the deprecated member with the replacement. - deprecated_member_use + info - lib/controller/home/navigation/navigation_view.dart:408:37 - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss. Try replacing the use of the deprecated member with the replacement. - deprecated_member_use + info - lib/controller/home/navigation/navigation_view.dart:419:37 - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss. Try replacing the use of the deprecated member with the replacement. - deprecated_member_use + info - lib/controller/home/navigation/navigation_view.dart:444:45 - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss. Try replacing the use of the deprecated member with the replacement. - deprecated_member_use + info - lib/controller/home/navigation/navigation_view.dart:482:47 - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss. Try replacing the use of the deprecated member with the replacement. - deprecated_member_use + info - lib/controller/home/navigation/navigation_view.dart:515:43 - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss. Try replacing the use of the deprecated member with the replacement. - deprecated_member_use + info - lib/controller/home/navigation/navigation_view.dart:550:46 - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss. Try replacing the use of the deprecated member with the replacement. - deprecated_member_use + info - lib/controller/home/navigation/navigation_view.dart:649:55 - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss. Try replacing the use of the deprecated member with the replacement. - deprecated_member_use + info - lib/controller/home/navigation/navigation_view.dart:665:42 - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss. Try replacing the use of the deprecated member with the replacement. - deprecated_member_use + info - lib/controller/home/navigation/navigation_view.dart:769:41 - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss. Try replacing the use of the deprecated member with the replacement. - deprecated_member_use + info - lib/controller/home/navigation/navigation_view.dart:772:29 - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss. Try replacing the use of the deprecated member with the replacement. - deprecated_member_use + info - lib/controller/home/navigation/navigation_view.dart:793:41 - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss. Try replacing the use of the deprecated member with the replacement. - deprecated_member_use + info - lib/controller/home/navigation/navigation_view.dart:837:48 - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss. Try replacing the use of the deprecated member with the replacement. - deprecated_member_use + info - lib/controller/home/navigation/navigation_view.dart:847:41 - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss. Try replacing the use of the deprecated member with the replacement. - deprecated_member_use + info - lib/controller/home/navigation/navigation_view.dart:851:47 - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss. Try replacing the use of the deprecated member with the replacement. - deprecated_member_use + info - lib/controller/home/navigation/navigation_view.dart:875:52 - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss. Try replacing the use of the deprecated member with the replacement. - deprecated_member_use + info - lib/controller/home/navigation/navigation_view.dart:902:37 - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss. Try replacing the use of the deprecated member with the replacement. - deprecated_member_use + info - lib/controller/home/navigation/navigation_view.dart:960:48 - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss. Try replacing the use of the deprecated member with the replacement. - deprecated_member_use + info - lib/controller/home/navigation/navigation_view.dart:968:58 - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss. Try replacing the use of the deprecated member with the replacement. - deprecated_member_use + info - lib/controller/home/navigation/navigation_view.dart:970:40 - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss. Try replacing the use of the deprecated member with the replacement. - deprecated_member_use + info - lib/controller/home/navigation/navigation_view.dart:972:38 - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss. Try replacing the use of the deprecated member with the replacement. - deprecated_member_use + info - lib/controller/home/navigation/navigation_view.dart:990:42 - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss. Try replacing the use of the deprecated member with the replacement. - deprecated_member_use + info - lib/controller/home/navigation/navigation_view.dart:992:63 - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss. Try replacing the use of the deprecated member with the replacement. - deprecated_member_use + info - lib/controller/home/navigation/navigation_view.dart:997:50 - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss. Try replacing the use of the deprecated member with the replacement. - deprecated_member_use + info - lib/controller/home/navigation/navigation_view.dart:1007:51 - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss. Try replacing the use of the deprecated member with the replacement. - deprecated_member_use + info - lib/controller/home/navigation/navigation_view.dart:1013:50 - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss. Try replacing the use of the deprecated member with the replacement. - deprecated_member_use + info - lib/controller/home/navigation/navigation_view.dart:1045:55 - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss. Try replacing the use of the deprecated member with the replacement. - deprecated_member_use + info - lib/controller/home/navigation/navigation_view.dart:1072:34 - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss. Try replacing the use of the deprecated member with the replacement. - deprecated_member_use + info - lib/controller/home/payment/captain_wallet_controller.dart:37:3 - Missing type annotation. Try adding a type annotation. - strict_top_level_inference + info - lib/controller/home/payment/captain_wallet_controller.dart:347:3 - Missing type annotation. Try adding a type annotation. - strict_top_level_inference + info - lib/controller/home/payment/credit_card_Controller.dart:1:1 - The file name 'credit_card_Controller.dart' isn't a lower_case_with_underscores identifier. Try changing the name to follow the lower_case_with_underscores style. - file_names + info - lib/controller/home/payment/credit_card_Controller.dart:15:3 - Missing type annotation. Try adding a type annotation. - strict_top_level_inference + info - lib/controller/home/payment/paymob_payout.dart:20:3 - Missing type annotation. Try adding a type annotation. - strict_top_level_inference + info - lib/controller/home/payment/paymob_payout.dart:104:3 - Missing type annotation. Try adding a type annotation. - strict_top_level_inference + info - lib/controller/home/payment/paymob_payout.dart:113:3 - Missing type annotation. Try adding a type annotation. - strict_top_level_inference + info - lib/controller/home/points_for_rider_controller.dart:121:7 - Constructors for public widgets should have a named 'key' parameter. Try adding a named parameter to the constructor. - use_key_in_widget_constructors + info - lib/controller/home/profile/complaint_controller.dart:11:8 - The imported package 'http_parser' isn't a dependency of the importing package. Try adding a dependency for 'http_parser' in the 'pubspec.yaml' file. - depend_on_referenced_packages + info - lib/controller/home/profile/complaint_controller.dart:12:8 - The imported package 'mime' isn't a dependency of the importing package. Try adding a dependency for 'mime' in the 'pubspec.yaml' file. - depend_on_referenced_packages + info - lib/controller/home/splash_screen_controlle.dart:43:3 - Missing type annotation. Try adding a type annotation. - strict_top_level_inference + info - lib/controller/local/phone_intel/country_picker_dialog.dart:51:9 - Parameter 'key' could be a super parameter. Trying converting 'key' to a super parameter. - use_super_parameters + info - lib/controller/local/phone_intel/intl_phone_field.dart:1:9 - Library names are not necessary. Remove the library name. - unnecessary_library_name + info - lib/controller/local/phone_intel/intl_phone_field.dart:252:9 - Parameter 'key' could be a super parameter. Trying converting 'key' to a super parameter. - use_super_parameters + info - lib/controller/notification/notification_captain_controller.dart:18:3 - Missing type annotation. Try adding a type annotation. - strict_top_level_inference + info - lib/controller/notification/notification_captain_controller.dart:70:3 - Missing type annotation. Try adding a type annotation. - strict_top_level_inference + info - lib/controller/notification/notification_captain_controller.dart:77:3 - Missing type annotation. Try adding a type annotation. - strict_top_level_inference + info - lib/controller/notification/passenger_notification_controller.dart:18:3 - Missing type annotation. Try adding a type annotation. - strict_top_level_inference + info - lib/controller/notification/passenger_notification_controller.dart:43:3 - Missing type annotation. Try adding a type annotation. - strict_top_level_inference + info - lib/controller/notification/passenger_notification_controller.dart:52:3 - Missing type annotation. Try adding a type annotation. - strict_top_level_inference + info - lib/controller/notification/ride_available_controller.dart:98:7 - Don't invoke 'print' in production code. Try using a logging framework. - avoid_print + info - lib/controller/notification/ride_available_controller.dart:110:7 - Don't invoke 'print' in production code. Try using a logging framework. - avoid_print + info - lib/controller/notification/ride_available_controller.dart:116:7 - Don't invoke 'print' in production code. Try using a logging framework. - avoid_print + info - lib/controller/notification/ride_available_controller.dart:139:7 - Don't invoke 'print' in production code. Try using a logging framework. - avoid_print + info - lib/controller/packages/lingo/lingo_hunter.dart:45:5 - Don't invoke 'print' in production code. Try using a logging framework. - avoid_print + info - lib/controller/packages/lingo/lingo_hunter.dart:46:5 - Don't invoke 'print' in production code. Try using a logging framework. - avoid_print + info - lib/controller/packages/lingo/lingo_hunter.dart:65:5 - Don't invoke 'print' in production code. Try using a logging framework. - avoid_print + info - lib/controller/packages/lingo/lingo_hunter.dart:176:29 - Unnecessary braces in a string interpolation. Try removing the braces. - unnecessary_brace_in_string_interps + info - lib/controller/payment/driver_payment_controller.dart:15:3 - Missing type annotation. Try adding a type annotation. - strict_top_level_inference + info - lib/controller/payment/driver_payment_controller.dart:40:3 - Missing type annotation. Try adding a type annotation. - strict_top_level_inference + info - lib/controller/payment/mtn_new/mtn_payment_new_screen.dart:96:3 - Invalid use of a private type in a public API. Try making the private type public, or making the API that uses the private type also be private. - library_private_types_in_public_api + info - lib/controller/payment/mtn_new/mtn_payment_new_screen.dart:168:7 - 'onPopInvoked' is deprecated and shouldn't be used. Use onPopInvokedWithResult instead. This feature was deprecated after v3.22.0-12.0.pre. Try replacing the use of the deprecated member with the replacement. - deprecated_member_use + info - lib/controller/payment/mtn_new/mtn_payment_new_screen.dart:188:26 - Don't use 'BuildContext's across async gaps. Try rewriting the code to not use the 'BuildContext', or guard the use with a 'mounted' check. - use_build_context_synchronously + info - lib/controller/payment/payment_controller.dart:51:3 - Missing type annotation. Try adding a type annotation. - strict_top_level_inference + info - lib/controller/payment/payment_controller.dart:65:3 - Missing type annotation. Try adding a type annotation. - strict_top_level_inference + info - lib/controller/payment/payment_controller.dart:130:13 - Don't use 'BuildContext's across async gaps. Try rewriting the code to not use the 'BuildContext', or guard the use with a 'mounted' check. - use_build_context_synchronously + info - lib/controller/payment/payment_controller.dart:283:13 - Don't use 'BuildContext's across async gaps. Try rewriting the code to not use the 'BuildContext', or guard the use with a 'mounted' check. - use_build_context_synchronously + info - lib/controller/payment/payment_controller.dart:292:24 - Don't use 'BuildContext's across async gaps. Try rewriting the code to not use the 'BuildContext', or guard the use with a 'mounted' check. - use_build_context_synchronously + info - lib/controller/payment/paymob.dart:77:10 - 'DioError' is deprecated and shouldn't be used. Use DioException instead. This will be removed in 6.0.0. Try replacing the use of the deprecated member with the replacement. - deprecated_member_use + info - lib/controller/payment/paymob/paymob_response.dart:245:9 - Parameter 'key' could be a super parameter. Trying converting 'key' to a super parameter. - use_super_parameters + info - lib/controller/payment/paymob/paymob_wallet.dart:169:10 - 'DioError' is deprecated and shouldn't be used. Use DioException instead. This will be removed in 6.0.0. Try replacing the use of the deprecated member with the replacement. - deprecated_member_use + info - lib/controller/payment/paymob/paymob_wallet.dart:223:27 - Unnecessary braces in a string interpolation. Try removing the braces. - unnecessary_brace_in_string_interps + info - lib/controller/payment/paymob/paymob_wallet.dart:288:9 - Parameter 'key' could be a super parameter. Trying converting 'key' to a super parameter. - use_super_parameters + info - lib/controller/payment/smsPaymnet/payment_services.dart:81:3 - Invalid use of a private type in a public API. Try making the private type public, or making the API that uses the private type also be private. - library_private_types_in_public_api + info - lib/controller/payment/smsPaymnet/payment_services.dart:192:12 - 'WillPopScope' is deprecated and shouldn't be used. Use PopScope instead. The Android predictive back feature will not work with WillPopScope. This feature was deprecated after v3.12.0-1.0.pre. Try replacing the use of the deprecated member with the replacement. - deprecated_member_use + info - lib/controller/payment/smsPaymnet/payment_services.dart:253:40 - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss. Try replacing the use of the deprecated member with the replacement. - deprecated_member_use + info - lib/controller/payment/smsPaymnet/payment_services.dart:292:28 - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss. Try replacing the use of the deprecated member with the replacement. - deprecated_member_use + info - lib/controller/profile/captain_profile_controller.dart:22:3 - Missing type annotation. Try adding a type annotation. - strict_top_level_inference + info - lib/controller/profile/profile_controller.dart:40:3 - Missing type annotation. Try adding a type annotation. - strict_top_level_inference + info - lib/controller/profile/profile_controller.dart:49:3 - Missing type annotation. Try adding a type annotation. - strict_top_level_inference + info - lib/controller/profile/profile_controller.dart:87:3 - Missing type annotation. Try adding a type annotation. - strict_top_level_inference + info - lib/controller/themes/themes.dart:24:7 - 'background' is deprecated and shouldn't be used. Use surface instead. This feature was deprecated after v3.18.0-0.1.pre. Try replacing the use of the deprecated member with the replacement. - deprecated_member_use + info - lib/device_compatibility_page.dart:22:7 - Statements in an if should be enclosed in a block. Try wrapping the statement in a block. - curly_braces_in_flow_control_structures + info - lib/device_compatibility_page.dart:24:7 - Statements in an if should be enclosed in a block. Try wrapping the statement in a block. - curly_braces_in_flow_control_structures + info - lib/device_compatibility_page.dart:28:7 - Statements in an if should be enclosed in a block. Try wrapping the statement in a block. - curly_braces_in_flow_control_structures + info - lib/device_compatibility_page.dart:50:34 - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss. Try replacing the use of the deprecated member with the replacement. - deprecated_member_use + info - lib/env/env.dart:321:23 - The variable name 'sss_encryptionSalt' isn't a lowerCamelCase identifier. Try changing the name to follow the lowerCamelCase style. - non_constant_identifier_names + info - lib/env/env.dart:324:23 - The variable name 'sss_pass' isn't a lowerCamelCase identifier. Try changing the name to follow the lowerCamelCase style. - non_constant_identifier_names + info - lib/main.dart:75:7 - Don't invoke 'print' in production code. Try using a logging framework. - avoid_print + info - lib/main.dart:123:5 - Don't invoke 'print' in production code. Try using a logging framework. - avoid_print + info - lib/main.dart:144:7 - Don't invoke 'print' in production code. Try using a logging framework. - avoid_print + info - lib/main.dart:150:7 - Don't invoke 'print' in production code. Try using a logging framework. - avoid_print + info - lib/main.dart:153:5 - Don't invoke 'print' in production code. Try using a logging framework. - avoid_print + info - lib/main.dart:169:5 - Don't invoke 'print' in production code. Try using a logging framework. - avoid_print + info - lib/main.dart:195:19 - Empty catch block. Try adding statements to the block, adding a comment to the block, or removing the 'catch' clause. - empty_catches + info - lib/main.dart:277:9 - Parameter 'key' could be a super parameter. Trying converting 'key' to a super parameter. - use_super_parameters + info - lib/main.dart:279:3 - Invalid use of a private type in a public API. Try making the private type public, or making the API that uses the private type also be private. - library_private_types_in_public_api + info - lib/main.dart:292:9 - Don't invoke 'print' in production code. Try using a logging framework. - avoid_print + info - lib/main.dart:304:11 - Don't invoke 'print' in production code. Try using a logging framework. - avoid_print + info - lib/main.dart:400:9 - Don't invoke 'print' in production code. Try using a logging framework. - avoid_print + info - lib/main.dart:406:7 - Don't invoke 'print' in production code. Try using a logging framework. - avoid_print + info - lib/main.dart:420:7 - 'WillPopScope' is deprecated and shouldn't be used. Use PopScope instead. The Android predictive back feature will not work with WillPopScope. This feature was deprecated after v3.12.0-1.0.pre. Try replacing the use of the deprecated member with the replacement. - deprecated_member_use + info - lib/main.dart:433:7 - Don't invoke 'print' in production code. Try using a logging framework. - avoid_print + info - lib/main.dart:446:7 - Don't invoke 'print' in production code. Try using a logging framework. - avoid_print + info - lib/main.dart:456:36 - Statements in an if should be enclosed in a block. Try wrapping the statement in a block. - curly_braces_in_flow_control_structures + info - lib/main.dart:486:7 - Don't invoke 'print' in production code. Try using a logging framework. - avoid_print + info - lib/models/overlay_service.dart:12:7 - Don't invoke 'print' in production code. Try using a logging framework. - avoid_print + info - lib/onbording_page.dart:10:9 - Parameter 'key' could be a super parameter. Trying converting 'key' to a super parameter. - use_super_parameters + info - lib/onbording_page.dart:31:9 - Parameter 'key' could be a super parameter. Trying converting 'key' to a super parameter. - use_super_parameters + info - lib/onbording_page.dart:83:9 - Parameter 'key' could be a super parameter. Trying converting 'key' to a super parameter. - use_super_parameters + info - lib/onbording_page.dart:104:45 - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss. Try replacing the use of the deprecated member with the replacement. - deprecated_member_use + info - lib/splash_screen_page.dart:53:47 - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss. Try replacing the use of the deprecated member with the replacement. - deprecated_member_use + info - lib/splash_screen_page.dart:56:50 - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss. Try replacing the use of the deprecated member with the replacement. - deprecated_member_use + info - lib/splash_screen_page.dart:90:40 - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss. Try replacing the use of the deprecated member with the replacement. - deprecated_member_use + info - lib/splash_screen_page.dart:116:56 - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss. Try replacing the use of the deprecated member with the replacement. - deprecated_member_use + info - lib/splash_screen_page.dart:128:44 - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss. Try replacing the use of the deprecated member with the replacement. - deprecated_member_use + info - lib/views/Rate/rate_app_page.dart:2:8 - The import of 'package:flutter/material.dart' is unnecessary because all of the used elements are also provided by the import of 'package:flutter/cupertino.dart'. Try removing the import directive. - unnecessary_import + info - lib/views/Rate/rate_app_page.dart:6:7 - Constructors for public widgets should have a named 'key' parameter. Try adding a named parameter to the constructor. - use_key_in_widget_constructors + info - lib/views/Rate/rate_passenger.dart:90:42 - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss. Try replacing the use of the deprecated member with the replacement. - deprecated_member_use + info - lib/views/Rate/rate_passenger.dart:118:41 - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss. Try replacing the use of the deprecated member with the replacement. - deprecated_member_use + info - lib/views/Rate/rate_passenger.dart:141:35 - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss. Try replacing the use of the deprecated member with the replacement. - deprecated_member_use + info - lib/views/Rate/rate_passenger.dart:182:37 - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss. Try replacing the use of the deprecated member with the replacement. - deprecated_member_use + info - lib/views/Rate/ride_calculate_driver.dart:13:3 - Constructors in '@immutable' classes should be declared as 'const'. Try adding 'const' to the constructor declaration. - prefer_const_constructors_in_immutables + info - lib/views/Rate/ride_calculate_driver.dart:283:9 - Parameter 'key' could be a super parameter. Trying converting 'key' to a super parameter. - use_super_parameters + info - lib/views/Rate/ride_calculate_driver.dart:294:32 - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss. Try replacing the use of the deprecated member with the replacement. - deprecated_member_use + info - lib/views/Rate/ride_calculate_driver.dart:399:9 - Parameter 'key' could be a super parameter. Trying converting 'key' to a super parameter. - use_super_parameters + info - lib/views/Rate/ride_calculate_driver.dart:417:32 - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss. Try replacing the use of the deprecated member with the replacement. - deprecated_member_use + info - lib/views/auth/captin/ai_page.dart:18:7 - Constructors for public widgets should have a named 'key' parameter. Try adding a named parameter to the constructor. - use_key_in_widget_constructors + info - lib/views/auth/captin/cards/sms_signup.dart:14:3 - Constructors in '@immutable' classes should be declared as 'const'. Try adding 'const' to the constructor declaration. - prefer_const_constructors_in_immutables + info - lib/views/auth/captin/cards/syrian_card_a_i.dart:163:41 - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss. Try replacing the use of the deprecated member with the replacement. - deprecated_member_use + info - lib/views/auth/captin/cards/syrian_card_a_i.dart:173:51 - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss. Try replacing the use of the deprecated member with the replacement. - deprecated_member_use + info - lib/views/auth/captin/cards/syrian_card_a_i.dart:290:45 - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss. Try replacing the use of the deprecated member with the replacement. - deprecated_member_use + info - lib/views/auth/captin/cards/syrian_card_a_i.dart:951:7 - Constructors for public widgets should have a named 'key' parameter. Try adding a named parameter to the constructor. - use_key_in_widget_constructors + info - lib/views/auth/captin/contact_us_page.dart:1:8 - The import of 'package:flutter/cupertino.dart' is unnecessary because all of the used elements are also provided by the import of 'package:flutter/material.dart'. Try removing the import directive. - unnecessary_import + info - lib/views/auth/captin/contact_us_page.dart:13:3 - Constructors in '@immutable' classes should be declared as 'const'. Try adding 'const' to the constructor declaration. - prefer_const_constructors_in_immutables + info - lib/views/auth/captin/driver_car_controller.dart:15:3 - Missing type annotation. Try adding a type annotation. - strict_top_level_inference + info - lib/views/auth/captin/driver_car_controller.dart:30:3 - Missing type annotation. Try adding a type annotation. - strict_top_level_inference + info - lib/views/auth/captin/driver_car_controller.dart:92:3 - Missing type annotation. Try adding a type annotation. - strict_top_level_inference + info - lib/views/auth/captin/invite_driver_screen.dart:11:7 - Constructors for public widgets should have a named 'key' parameter. Try adding a named parameter to the constructor. - use_key_in_widget_constructors + info - lib/views/auth/captin/invite_driver_screen.dart:199:41 - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss. Try replacing the use of the deprecated member with the replacement. - deprecated_member_use + info - lib/views/auth/captin/invite_driver_screen.dart:228:41 - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss. Try replacing the use of the deprecated member with the replacement. - deprecated_member_use + info - lib/views/auth/captin/invite_driver_screen.dart:268:41 - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss. Try replacing the use of the deprecated member with the replacement. - deprecated_member_use + info - lib/views/auth/captin/invite_driver_screen.dart:297:41 - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss. Try replacing the use of the deprecated member with the replacement. - deprecated_member_use + info - lib/views/auth/captin/invite_driver_screen.dart:558:56 - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss. This feature was deprecated after v3.33.0-1.0.pre. Try replacing the use of the deprecated member with the replacement. - deprecated_member_use + info - lib/views/auth/captin/invite_driver_screen.dart:589:60 - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss. This feature was deprecated after v3.33.0-1.0.pre. Try replacing the use of the deprecated member with the replacement. - deprecated_member_use + info - lib/views/auth/captin/login_captin.dart:136:52 - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss. Try replacing the use of the deprecated member with the replacement. - deprecated_member_use + info - lib/views/auth/captin/login_captin.dart:472:65 - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss. Try replacing the use of the deprecated member with the replacement. - deprecated_member_use + info - lib/views/auth/captin/otp_page.dart:46:43 - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss. Try replacing the use of the deprecated member with the replacement. - deprecated_member_use + info - lib/views/auth/captin/otp_page.dart:164:46 - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss. Try replacing the use of the deprecated member with the replacement. - deprecated_member_use + info - lib/views/auth/captin/otp_page.dart:176:46 - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss. Try replacing the use of the deprecated member with the replacement. - deprecated_member_use + info - lib/views/auth/captin/otp_page.dart:195:49 - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss. Try replacing the use of the deprecated member with the replacement. - deprecated_member_use + info - lib/views/auth/captin/otp_page.dart:197:53 - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss. Try replacing the use of the deprecated member with the replacement. - deprecated_member_use + info - lib/views/auth/captin/otp_page.dart:200:55 - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss. Try replacing the use of the deprecated member with the replacement. - deprecated_member_use + info - lib/views/auth/captin/otp_page.dart:238:49 - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss. Try replacing the use of the deprecated member with the replacement. - deprecated_member_use + info - lib/views/auth/captin/otp_page.dart:241:51 - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss. Try replacing the use of the deprecated member with the replacement. - deprecated_member_use + info - lib/views/auth/captin/otp_page.dart:252:43 - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss. Try replacing the use of the deprecated member with the replacement. - deprecated_member_use + info - lib/views/auth/captin/otp_page.dart:265:55 - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss. Try replacing the use of the deprecated member with the replacement. - deprecated_member_use + info - lib/views/auth/captin/otp_page.dart:270:55 - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss. Try replacing the use of the deprecated member with the replacement. - deprecated_member_use + info - lib/views/auth/captin/otp_page.dart:344:62 - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss. Try replacing the use of the deprecated member with the replacement. - deprecated_member_use + info - lib/views/auth/captin/otp_page.dart:456:41 - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss. Try replacing the use of the deprecated member with the replacement. - deprecated_member_use + info - lib/views/auth/captin/otp_page.dart:534:54 - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss. Try replacing the use of the deprecated member with the replacement. - deprecated_member_use + info - lib/views/auth/country_widget.dart:2:8 - The import of 'package:flutter/material.dart' is unnecessary because all of the used elements are also provided by the import of 'package:flutter/cupertino.dart'. Try removing the import directive. - unnecessary_import + info - lib/views/auth/country_widget.dart:28:3 - Parameter 'key' could be a super parameter. Trying converting 'key' to a super parameter. - use_super_parameters + info - lib/views/auth/country_widget.dart:115:3 - Parameter 'key' could be a super parameter. Trying converting 'key' to a super parameter. - use_super_parameters + info - lib/views/auth/syria/pending_driver_page.dart:58:47 - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss. Try replacing the use of the deprecated member with the replacement. - deprecated_member_use + info - lib/views/auth/syria/pending_driver_page.dart:92:47 - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss. Try replacing the use of the deprecated member with the replacement. - deprecated_member_use + info - lib/views/auth/syria/pending_driver_page.dart:95:49 - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss. Try replacing the use of the deprecated member with the replacement. - deprecated_member_use + info - lib/views/auth/syria/registration_view.dart:8:9 - Parameter 'key' could be a super parameter. Trying converting 'key' to a super parameter. - use_super_parameters + info - lib/views/auth/syria/registration_view.dart:193:15 - 'value' is deprecated and shouldn't be used. Use initialValue instead. This will set the initial value for the form field. This feature was deprecated after v3.33.0-1.0.pre. Try replacing the use of the deprecated member with the replacement. - deprecated_member_use + info - lib/views/auth/syria/registration_view.dart:216:15 - 'value' is deprecated and shouldn't be used. Use initialValue instead. This will set the initial value for the form field. This feature was deprecated after v3.33.0-1.0.pre. Try replacing the use of the deprecated member with the replacement. - deprecated_member_use + info - lib/views/auth/syria/registration_view.dart:289:19 - 'value' is deprecated and shouldn't be used. Use initialValue instead. This will set the initial value for the form field. This feature was deprecated after v3.33.0-1.0.pre. Try replacing the use of the deprecated member with the replacement. - deprecated_member_use + info - lib/views/gamification/referral_center_page.dart:2:8 - The import of 'package:flutter/services.dart' is unnecessary because all of the used elements are also provided by the import of 'package:flutter/material.dart'. Try removing the import directive. - unnecessary_import + info - lib/views/gamification/referral_center_page.dart:40:31 - Unnecessary use of string interpolation. Try replacing the string literal with the variable name. - unnecessary_string_interpolations + info - lib/views/gamification/referral_center_page.dart:121:93 - 'Share' is deprecated and shouldn't be used. Use SharePlus instead. Try replacing the use of the deprecated member with the replacement. - deprecated_member_use + info - lib/views/gamification/referral_center_page.dart:121:99 - 'share' is deprecated and shouldn't be used. Use SharePlus.instance.share() instead. Try replacing the use of the deprecated member with the replacement. - deprecated_member_use + info - lib/views/home/Captin/About Us/frequantly_question.dart:3:8 - The import of 'package:flutter/cupertino.dart' is unnecessary because all of the used elements are also provided by the import of 'package:flutter/material.dart'. Try removing the import directive. - unnecessary_import + info - lib/views/home/Captin/About Us/frequantly_question.dart:97:27 - Unnecessary empty statement. Try removing the empty statement or restructuring the code. - empty_statements + info - lib/views/home/Captin/About Us/settings_captain.dart:173:33 - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss. Try replacing the use of the deprecated member with the replacement. - deprecated_member_use + info - lib/views/home/Captin/About Us/settings_captain.dart:217:11 - 'activeColor' is deprecated and shouldn't be used. Use activeThumbColor instead. This feature was deprecated after v3.31.0-2.0.pre. Try replacing the use of the deprecated member with the replacement. - deprecated_member_use + info - lib/views/home/Captin/About Us/using_app_page.dart:90:41 - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss. Try replacing the use of the deprecated member with the replacement. - deprecated_member_use + info - lib/views/home/Captin/About Us/video_page.dart:11:7 - Constructors for public widgets should have a named 'key' parameter. Try adding a named parameter to the constructor. - use_key_in_widget_constructors + info - lib/views/home/Captin/About Us/video_page.dart:40:61 - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss. This feature was deprecated after v3.33.0-1.0.pre. Try replacing the use of the deprecated member with the replacement. - deprecated_member_use + info - lib/views/home/Captin/About Us/video_page.dart:87:3 - Constructors for public widgets should have a named 'key' parameter. Try adding a named parameter to the constructor. - use_key_in_widget_constructors + info - lib/views/home/Captin/About Us/video_page.dart:150:9 - Constructors for public widgets should have a named 'key' parameter. Try adding a named parameter to the constructor. - use_key_in_widget_constructors + info - lib/views/home/Captin/About Us/video_page.dart:158:35 - The local variable '_controller' starts with an underscore. Try renaming the variable to not start with an underscore. - no_leading_underscores_for_local_identifiers + info - lib/views/home/Captin/assurance_health_page.dart:7:8 - The import of 'package:flutter/cupertino.dart' is unnecessary because all of the used elements are also provided by the import of 'package:flutter/material.dart'. Try removing the import directive. - unnecessary_import + info - lib/views/home/Captin/assurance_health_page.dart:36:62 - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss. Try replacing the use of the deprecated member with the replacement. - deprecated_member_use + info - lib/views/home/Captin/assurance_health_page.dart:78:48 - 'surfaceVariant' is deprecated and shouldn't be used. Use surfaceContainerHighest instead. This feature was deprecated after v3.18.0-0.1.pre. Try replacing the use of the deprecated member with the replacement. - deprecated_member_use + info - lib/views/home/Captin/assurance_health_page.dart:78:63 - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss. Try replacing the use of the deprecated member with the replacement. - deprecated_member_use + info - lib/views/home/Captin/assurance_health_page.dart:173:33 - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss. Try replacing the use of the deprecated member with the replacement. - deprecated_member_use + info - lib/views/home/Captin/driver_map_page.dart:105:27 - Statements in an if should be enclosed in a block. Try wrapping the statement in a block. - curly_braces_in_flow_control_structures + info - lib/views/home/Captin/driver_map_page.dart:107:27 - Statements in an if should be enclosed in a block. Try wrapping the statement in a block. - curly_braces_in_flow_control_structures + info - lib/views/home/Captin/driver_map_page.dart:169:28 - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss. Try replacing the use of the deprecated member with the replacement. - deprecated_member_use + info - lib/views/home/Captin/driver_map_page.dart:173:49 - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss. Try replacing the use of the deprecated member with the replacement. - deprecated_member_use + info - lib/views/home/Captin/driver_map_page.dart:178:53 - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss. Try replacing the use of the deprecated member with the replacement. - deprecated_member_use + info - lib/views/home/Captin/driver_map_page.dart:279:52 - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss. Try replacing the use of the deprecated member with the replacement. - deprecated_member_use + info - lib/views/home/Captin/driver_map_page.dart:283:60 - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss. Try replacing the use of the deprecated member with the replacement. - deprecated_member_use + info - lib/views/home/Captin/driver_map_page.dart:369:29 - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss. Try replacing the use of the deprecated member with the replacement. - deprecated_member_use + info - lib/views/home/Captin/driver_map_page.dart:386:62 - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss. Try replacing the use of the deprecated member with the replacement. - deprecated_member_use + info - lib/views/home/Captin/driver_map_page.dart:398:56 - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss. Try replacing the use of the deprecated member with the replacement. - deprecated_member_use + info - lib/views/home/Captin/history/history_captain.dart:349:33 - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss. Try replacing the use of the deprecated member with the replacement. - deprecated_member_use + info - lib/views/home/Captin/history/history_captain.dart:349:57 - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss. Try replacing the use of the deprecated member with the replacement. - deprecated_member_use + info - lib/views/home/Captin/history/history_captain.dart:355:33 - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss. Try replacing the use of the deprecated member with the replacement. - deprecated_member_use + info - lib/views/home/Captin/history/history_captain.dart:355:57 - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss. Try replacing the use of the deprecated member with the replacement. - deprecated_member_use + info - lib/views/home/Captin/history/history_captain.dart:361:33 - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss. Try replacing the use of the deprecated member with the replacement. - deprecated_member_use + info - lib/views/home/Captin/history/history_captain.dart:361:57 - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss. Try replacing the use of the deprecated member with the replacement. - deprecated_member_use + info - lib/views/home/Captin/history/history_captain.dart:367:33 - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss. Try replacing the use of the deprecated member with the replacement. - deprecated_member_use + info - lib/views/home/Captin/history/history_captain.dart:367:57 - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss. Try replacing the use of the deprecated member with the replacement. - deprecated_member_use + info - lib/views/home/Captin/history/history_captain.dart:372:33 - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss. Try replacing the use of the deprecated member with the replacement. - deprecated_member_use + info - lib/views/home/Captin/history/history_captain.dart:372:57 - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss. Try replacing the use of the deprecated member with the replacement. - deprecated_member_use + info - lib/views/home/Captin/home_captain/help_captain.dart:6:8 - The import of 'package:flutter/cupertino.dart' is unnecessary because all of the used elements are also provided by the import of 'package:flutter/material.dart'. Try removing the import directive. - unnecessary_import + info - lib/views/home/Captin/home_captain/help_captain.dart:13:3 - Constructors in '@immutable' classes should be declared as 'const'. Try adding 'const' to the constructor declaration. - prefer_const_constructors_in_immutables + info - lib/views/home/Captin/home_captain/help_captain.dart:32:44 - 'surfaceVariant' is deprecated and shouldn't be used. Use surfaceContainerHighest instead. This feature was deprecated after v3.18.0-0.1.pre. Try replacing the use of the deprecated member with the replacement. - deprecated_member_use + info - lib/views/home/Captin/home_captain/help_captain.dart:32:59 - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss. Try replacing the use of the deprecated member with the replacement. - deprecated_member_use + info - lib/views/home/Captin/home_captain/home_captin.dart:45:31 - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss. Try replacing the use of the deprecated member with the replacement. - deprecated_member_use + info - lib/views/home/Captin/home_captain/home_captin.dart:53:25 - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss. Try replacing the use of the deprecated member with the replacement. - deprecated_member_use + info - lib/views/home/Captin/home_captain/home_captin.dart:196:24 - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss. Try replacing the use of the deprecated member with the replacement. - deprecated_member_use + info - lib/views/home/Captin/home_captain/home_captin.dart:198:43 - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss. Try replacing the use of the deprecated member with the replacement. - deprecated_member_use + info - lib/views/home/Captin/home_captain/home_captin.dart:363:37 - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss. Try replacing the use of the deprecated member with the replacement. - deprecated_member_use + info - lib/views/home/Captin/home_captain/home_captin.dart:648:48 - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss. Try replacing the use of the deprecated member with the replacement. - deprecated_member_use + info - lib/views/home/Captin/home_captain/widget/connect.dart:105:30 - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss. Try replacing the use of the deprecated member with the replacement. - deprecated_member_use + info - lib/views/home/Captin/home_captain/widget/connect.dart:122:49 - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss. Try replacing the use of the deprecated member with the replacement. - deprecated_member_use + info - lib/views/home/Captin/home_captain/widget/left_menu_map_captain.dart:35:25 - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss. Try replacing the use of the deprecated member with the replacement. - deprecated_member_use + info - lib/views/home/Captin/home_captain/widget/left_menu_map_captain.dart:59:37 - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss. Try replacing the use of the deprecated member with the replacement. - deprecated_member_use + info - lib/views/home/Captin/maintain_center_page.dart:135:81 - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss. Try replacing the use of the deprecated member with the replacement. - deprecated_member_use + info - lib/views/home/Captin/maintain_center_page.dart:196:89 - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss. Try replacing the use of the deprecated member with the replacement. - deprecated_member_use + info - lib/views/home/Captin/maintain_center_page.dart:217:27 - Don't invoke 'print' in production code. Try using a logging framework. - avoid_print + info - lib/views/home/Captin/maintain_center_page.dart:255:33 - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss. Try replacing the use of the deprecated member with the replacement. - deprecated_member_use + info - lib/views/home/Captin/mapDriverWidgets/driver_end_ride_bar.dart:33:35 - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss. Try replacing the use of the deprecated member with the replacement. - deprecated_member_use + info - lib/views/home/Captin/mapDriverWidgets/google_map_app.dart:49:47 - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss. Try replacing the use of the deprecated member with the replacement. - deprecated_member_use + info - lib/views/home/Captin/mapDriverWidgets/passenger_info_window.dart:70:39 - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss. Try replacing the use of the deprecated member with the replacement. - deprecated_member_use + info - lib/views/home/Captin/mapDriverWidgets/passenger_info_window.dart:106:60 - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss. Try replacing the use of the deprecated member with the replacement. - deprecated_member_use + info - lib/views/home/Captin/mapDriverWidgets/passenger_info_window.dart:109:61 - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss. Try replacing the use of the deprecated member with the replacement. - deprecated_member_use + info - lib/views/home/Captin/mapDriverWidgets/passenger_info_window.dart:191:41 - Don't use 'BuildContext's across async gaps. Try rewriting the code to not use the 'BuildContext', or guard the use with a 'mounted' check. - use_build_context_synchronously + info - lib/views/home/Captin/mapDriverWidgets/passenger_info_window.dart:203:57 - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss. Try replacing the use of the deprecated member with the replacement. - deprecated_member_use + info - lib/views/home/Captin/mapDriverWidgets/passenger_info_window.dart:206:61 - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss. Try replacing the use of the deprecated member with the replacement. - deprecated_member_use + info - lib/views/home/Captin/mapDriverWidgets/passenger_info_window.dart:317:43 - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss. Try replacing the use of the deprecated member with the replacement. - deprecated_member_use + info - lib/views/home/Captin/mapDriverWidgets/passenger_info_window.dart:330:34 - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss. Try replacing the use of the deprecated member with the replacement. - deprecated_member_use + info - lib/views/home/Captin/mapDriverWidgets/passenger_info_window.dart:479:49 - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss. Try replacing the use of the deprecated member with the replacement. - deprecated_member_use + info - lib/views/home/Captin/mapDriverWidgets/passenger_info_window.dart:495:58 - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss. Try replacing the use of the deprecated member with the replacement. - deprecated_member_use + info - lib/views/home/Captin/mapDriverWidgets/sos_connect.dart:17:3 - Constructors in '@immutable' classes should be declared as 'const'. Try adding 'const' to the constructor declaration. - prefer_const_constructors_in_immutables + info - lib/views/home/Captin/mapDriverWidgets/sos_connect.dart:31:33 - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss. Try replacing the use of the deprecated member with the replacement. - deprecated_member_use + info - lib/views/home/Captin/mapDriverWidgets/sos_connect.dart:35:37 - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss. Try replacing the use of the deprecated member with the replacement. - deprecated_member_use + info - lib/views/home/Captin/mapDriverWidgets/sos_connect.dart:82:38 - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss. Try replacing the use of the deprecated member with the replacement. - deprecated_member_use + info - lib/views/home/Captin/mapDriverWidgets/sped_circle.dart:32:39 - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss. Try replacing the use of the deprecated member with the replacement. - deprecated_member_use + info - lib/views/home/Captin/orderCaptin/order_over_lay.dart:3:8 - The import of 'package:flutter/services.dart' is unnecessary because all of the used elements are also provided by the import of 'package:flutter/material.dart'. Try removing the import directive. - unnecessary_import + info - lib/views/home/Captin/orderCaptin/order_over_lay.dart:36:9 - Parameter 'key' could be a super parameter. Trying converting 'key' to a super parameter. - use_super_parameters + info - lib/views/home/Captin/orderCaptin/order_over_lay.dart:264:27 - Unnecessary braces in a string interpolation. Try removing the braces. - unnecessary_brace_in_string_interps + info - lib/views/home/Captin/orderCaptin/order_over_lay.dart:370:5 - Don't invoke 'print' in production code. Try using a logging framework. - avoid_print + info - lib/views/home/Captin/orderCaptin/order_over_lay.dart:386:27 - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss. Try replacing the use of the deprecated member with the replacement. - deprecated_member_use + info - lib/views/home/Captin/orderCaptin/order_over_lay.dart:395:41 - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss. Try replacing the use of the deprecated member with the replacement. - deprecated_member_use + info - lib/views/home/Captin/orderCaptin/order_over_lay.dart:398:37 - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss. Try replacing the use of the deprecated member with the replacement. - deprecated_member_use + info - lib/views/home/Captin/orderCaptin/order_over_lay.dart:441:39 - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss. Try replacing the use of the deprecated member with the replacement. - deprecated_member_use + info - lib/views/home/Captin/orderCaptin/order_over_lay.dart:443:43 - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss. Try replacing the use of the deprecated member with the replacement. - deprecated_member_use + info - lib/views/home/Captin/orderCaptin/order_over_lay.dart:444:40 - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss. Try replacing the use of the deprecated member with the replacement. - deprecated_member_use + info - lib/views/home/Captin/orderCaptin/order_over_lay.dart:468:38 - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss. Try replacing the use of the deprecated member with the replacement. - deprecated_member_use + info - lib/views/home/Captin/orderCaptin/order_over_lay.dart:499:34 - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss. Try replacing the use of the deprecated member with the replacement. - deprecated_member_use + info - lib/views/home/Captin/orderCaptin/order_over_lay.dart:502:45 - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss. Try replacing the use of the deprecated member with the replacement. - deprecated_member_use + info - lib/views/home/Captin/orderCaptin/order_over_lay.dart:534:41 - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss. Try replacing the use of the deprecated member with the replacement. - deprecated_member_use + info - lib/views/home/Captin/orderCaptin/order_over_lay.dart:567:22 - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss. Try replacing the use of the deprecated member with the replacement. - deprecated_member_use + info - lib/views/home/Captin/orderCaptin/order_over_lay.dart:569:41 - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss. Try replacing the use of the deprecated member with the replacement. - deprecated_member_use + info - lib/views/home/Captin/orderCaptin/order_over_lay.dart:587:42 - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss. Try replacing the use of the deprecated member with the replacement. - deprecated_member_use + info - lib/views/home/Captin/orderCaptin/order_over_lay.dart:602:36 - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss. Try replacing the use of the deprecated member with the replacement. - deprecated_member_use + info - lib/views/home/Captin/orderCaptin/order_over_lay.dart:605:51 - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss. Try replacing the use of the deprecated member with the replacement. - deprecated_member_use + info - lib/views/home/Captin/orderCaptin/order_over_lay.dart:631:42 - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss. Try replacing the use of the deprecated member with the replacement. - deprecated_member_use + info - lib/views/home/Captin/orderCaptin/order_over_lay.dart:651:40 - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss. Try replacing the use of the deprecated member with the replacement. - deprecated_member_use + info - lib/views/home/Captin/orderCaptin/order_over_lay.dart:684:34 - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss. Try replacing the use of the deprecated member with the replacement. - deprecated_member_use + info - lib/views/home/Captin/orderCaptin/order_over_lay.dart:704:43 - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss. Try replacing the use of the deprecated member with the replacement. - deprecated_member_use + info - lib/views/home/Captin/orderCaptin/order_over_lay.dart:735:40 - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss. Try replacing the use of the deprecated member with the replacement. - deprecated_member_use + info - lib/views/home/Captin/orderCaptin/order_over_lay.dart:767:57 - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss. Try replacing the use of the deprecated member with the replacement. - deprecated_member_use + info - lib/views/home/Captin/orderCaptin/order_over_lay.dart:794:57 - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss. Try replacing the use of the deprecated member with the replacement. - deprecated_member_use + info - lib/views/home/Captin/orderCaptin/order_request_page.dart:138:63 - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss. Try replacing the use of the deprecated member with the replacement. - deprecated_member_use + info - lib/views/home/Captin/orderCaptin/order_request_page.dart:167:40 - 'surfaceVariant' is deprecated and shouldn't be used. Use surfaceContainerHighest instead. This feature was deprecated after v3.18.0-0.1.pre. Try replacing the use of the deprecated member with the replacement. - deprecated_member_use + info - lib/views/home/Captin/orderCaptin/order_request_page.dart:207:59 - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss. Try replacing the use of the deprecated member with the replacement. - deprecated_member_use + info - lib/views/home/Captin/orderCaptin/order_request_page.dart:208:58 - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss. Try replacing the use of the deprecated member with the replacement. - deprecated_member_use + info - lib/views/home/Captin/orderCaptin/order_request_page.dart:245:34 - 'surfaceVariant' is deprecated and shouldn't be used. Use surfaceContainerHighest instead. This feature was deprecated after v3.18.0-0.1.pre. Try replacing the use of the deprecated member with the replacement. - deprecated_member_use + info - lib/views/home/Captin/orderCaptin/order_request_page.dart:246:34 - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss. Try replacing the use of the deprecated member with the replacement. - deprecated_member_use + info - lib/views/home/Captin/orderCaptin/test_order_page.dart:160:7 - Statements in an if should be enclosed in a block. Try wrapping the statement in a block. - curly_braces_in_flow_control_structures + info - lib/views/home/Captin/orderCaptin/test_order_page.dart:180:7 - Statements in an if should be enclosed in a block. Try wrapping the statement in a block. - curly_braces_in_flow_control_structures + info - lib/views/home/Captin/orderCaptin/test_order_page.dart:200:7 - Statements in an if should be enclosed in a block. Try wrapping the statement in a block. - curly_braces_in_flow_control_structures + info - lib/views/home/Captin/orderCaptin/vip_order_page.dart:35:29 - Unnecessary braces in a string interpolation. Try removing the braces. - unnecessary_brace_in_string_interps + info - lib/views/home/Captin/orderCaptin/vip_order_page.dart:103:30 - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss. Try replacing the use of the deprecated member with the replacement. - deprecated_member_use + info - lib/views/home/Captin/orderCaptin/vip_order_page.dart:217:3 - Missing type annotation. Try adding a type annotation. - strict_top_level_inference + info - lib/views/home/my_wallet/bank_account_egypt.dart:97:7 - Constructors for public widgets should have a named 'key' parameter. Try adding a named parameter to the constructor. - use_key_in_widget_constructors + info - lib/views/home/my_wallet/card_wallet_widget.dart:56:52 - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss. Try replacing the use of the deprecated member with the replacement. - deprecated_member_use + info - lib/views/home/my_wallet/card_wallet_widget.dart:74:60 - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss. Try replacing the use of the deprecated member with the replacement. - deprecated_member_use + info - lib/views/home/my_wallet/card_wallet_widget.dart:117:39 - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss. Try replacing the use of the deprecated member with the replacement. - deprecated_member_use + info - lib/views/home/my_wallet/card_wallet_widget.dart:147:39 - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss. Try replacing the use of the deprecated member with the replacement. - deprecated_member_use + info - lib/views/home/my_wallet/card_wallet_widget.dart:155:39 - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss. Try replacing the use of the deprecated member with the replacement. - deprecated_member_use + info - lib/views/home/my_wallet/ecash.dart:48:13 - Don't use 'BuildContext's across async gaps. Try rewriting the code to not use the 'BuildContext', or guard the use with a 'mounted' check. - use_build_context_synchronously + info - lib/views/home/my_wallet/ecash.dart:81:9 - Parameter 'key' could be a super parameter. Trying converting 'key' to a super parameter. - use_super_parameters + info - lib/views/home/my_wallet/ecash.dart:99:11 - Don't invoke 'print' in production code. Try using a logging framework. - avoid_print + info - lib/views/home/my_wallet/pay_out_screen.dart:22:3 - Invalid use of a private type in a public API. Try making the private type public, or making the API that uses the private type also be private. - library_private_types_in_public_api + info - lib/views/home/my_wallet/points_captain.dart:598:5 - Don't invoke 'print' in production code. Try using a logging framework. - avoid_print + info - lib/views/home/my_wallet/points_captain.dart:599:5 - Don't invoke 'print' in production code. Try using a logging framework. - avoid_print + info - lib/views/home/my_wallet/points_captain.dart:610:9 - Don't invoke 'print' in production code. Try using a logging framework. - avoid_print + info - lib/views/home/my_wallet/points_captain.dart:626:5 - Don't invoke 'print' in production code. Try using a logging framework. - avoid_print + info - lib/views/home/my_wallet/points_captain.dart:627:5 - Don't invoke 'print' in production code. Try using a logging framework. - avoid_print + info - lib/views/home/my_wallet/points_captain.dart:662:5 - Don't invoke 'print' in production code. Try using a logging framework. - avoid_print + info - lib/views/home/my_wallet/points_captain.dart:666:7 - Statements in an if should be enclosed in a block. Try wrapping the statement in a block. - curly_braces_in_flow_control_structures + info - lib/views/home/my_wallet/points_captain.dart:670:7 - Don't use 'BuildContext's across async gaps. Try rewriting the code to not use the 'BuildContext', or guard the use with a 'mounted' check. - use_build_context_synchronously + info - lib/views/home/my_wallet/points_captain.dart:696:7 - Don't invoke 'print' in production code. Try using a logging framework. - avoid_print + info - lib/views/home/my_wallet/points_captain.dart:699:5 - Don't invoke 'print' in production code. Try using a logging framework. - avoid_print + info - lib/views/home/my_wallet/points_captain.dart:718:5 - Don't invoke 'print' in production code. Try using a logging framework. - avoid_print + info - lib/views/home/my_wallet/points_captain.dart:720:28 - Unnecessary braces in a string interpolation. Try removing the braces. - unnecessary_brace_in_string_interps + info - lib/views/home/my_wallet/points_captain.dart:736:5 - Don't invoke 'print' in production code. Try using a logging framework. - avoid_print + info - lib/views/home/my_wallet/points_captain.dart:737:5 - Don't invoke 'print' in production code. Try using a logging framework. - avoid_print + info - lib/views/home/my_wallet/points_captain.dart:738:5 - Don't invoke 'print' in production code. Try using a logging framework. - avoid_print + info - lib/views/home/my_wallet/points_captain.dart:759:5 - Don't invoke 'print' in production code. Try using a logging framework. - avoid_print + info - lib/views/home/my_wallet/points_captain.dart:760:5 - Don't invoke 'print' in production code. Try using a logging framework. - avoid_print + info - lib/views/home/my_wallet/points_captain.dart:771:9 - Don't invoke 'print' in production code. Try using a logging framework. - avoid_print + info - lib/views/home/my_wallet/points_captain.dart:788:5 - Don't invoke 'print' in production code. Try using a logging framework. - avoid_print + info - lib/views/home/my_wallet/points_captain.dart:789:30 - Unnecessary braces in a string interpolation. Try removing the braces. - unnecessary_brace_in_string_interps + info - lib/views/home/my_wallet/points_captain.dart:817:5 - Don't invoke 'print' in production code. Try using a logging framework. - avoid_print + info - lib/views/home/my_wallet/points_captain.dart:823:7 - Don't use 'BuildContext's across async gaps. Try rewriting the code to not use the 'BuildContext', or guard the use with a 'mounted' check. - use_build_context_synchronously + info - lib/views/home/my_wallet/points_captain.dart:849:7 - Don't invoke 'print' in production code. Try using a logging framework. - avoid_print + info - lib/views/home/my_wallet/points_captain.dart:852:5 - Don't invoke 'print' in production code. Try using a logging framework. - avoid_print + info - lib/views/home/my_wallet/points_captain.dart:871:5 - Don't invoke 'print' in production code. Try using a logging framework. - avoid_print + info - lib/views/home/my_wallet/points_captain.dart:872:28 - Unnecessary braces in a string interpolation. Try removing the braces. - unnecessary_brace_in_string_interps + info - lib/views/home/my_wallet/points_captain.dart:891:5 - Don't invoke 'print' in production code. Try using a logging framework. - avoid_print + info - lib/views/home/my_wallet/points_captain.dart:892:5 - Don't invoke 'print' in production code. Try using a logging framework. - avoid_print + info - lib/views/home/my_wallet/points_captain.dart:893:5 - Don't invoke 'print' in production code. Try using a logging framework. - avoid_print + info - lib/views/home/my_wallet/widgets/balance_card.dart:32:18 - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss. Try replacing the use of the deprecated member with the replacement. - deprecated_member_use + info - lib/views/home/my_wallet/widgets/balance_card.dart:50:43 - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss. Try replacing the use of the deprecated member with the replacement. - deprecated_member_use + info - lib/views/home/my_wallet/widgets/balance_card.dart:58:43 - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss. Try replacing the use of the deprecated member with the replacement. - deprecated_member_use + info - lib/views/home/my_wallet/widgets/balance_card.dart:67:39 - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss. Try replacing the use of the deprecated member with the replacement. - deprecated_member_use + info - lib/views/home/my_wallet/widgets/balance_card.dart:93:39 - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss. Try replacing the use of the deprecated member with the replacement. - deprecated_member_use + info - lib/views/home/my_wallet/widgets/balance_card.dart:101:39 - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss. Try replacing the use of the deprecated member with the replacement. - deprecated_member_use + info - lib/views/home/my_wallet/widgets/balance_card.dart:107:37 - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss. Try replacing the use of the deprecated member with the replacement. - deprecated_member_use + info - lib/views/home/my_wallet/widgets/balance_card.dart:114:39 - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss. Try replacing the use of the deprecated member with the replacement. - deprecated_member_use + info - lib/views/home/my_wallet/widgets/promo_gamification_card.dart:35:33 - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss. Try replacing the use of the deprecated member with the replacement. - deprecated_member_use + info - lib/views/home/my_wallet/widgets/promo_gamification_card.dart:76:24 - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss. Try replacing the use of the deprecated member with the replacement. - deprecated_member_use + info - lib/views/home/my_wallet/widgets/quick_actions.dart:88:51 - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss. Try replacing the use of the deprecated member with the replacement. - deprecated_member_use + info - lib/views/home/my_wallet/widgets/transaction_preview_item.dart:44:38 - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss. Try replacing the use of the deprecated member with the replacement. - deprecated_member_use + info - lib/views/home/profile/behavior_page.dart:170:31 - Unnecessary use of string interpolation. Try replacing the string literal with the variable name. - unnecessary_string_interpolations + info - lib/views/home/profile/cars_inserting_page.dart:23:41 - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss. Try replacing the use of the deprecated member with the replacement. - deprecated_member_use + info - lib/views/home/profile/complaint_page.dart:48:33 - 'value' is deprecated and shouldn't be used. Use initialValue instead. This will set the initial value for the form field. This feature was deprecated after v3.33.0-1.0.pre. Try replacing the use of the deprecated member with the replacement. - deprecated_member_use + info - lib/views/home/profile/complaint_page.dart:67:63 - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss. Try replacing the use of the deprecated member with the replacement. - deprecated_member_use + info - lib/views/home/profile/complaint_page.dart:87:57 - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss. Try replacing the use of the deprecated member with the replacement. - deprecated_member_use + info - lib/views/home/profile/complaint_page.dart:124:59 - Unnecessary braces in a string interpolation. Try removing the braces. - unnecessary_brace_in_string_interps + info - lib/views/home/profile/complaint_page.dart:230:41 - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss. Try replacing the use of the deprecated member with the replacement. - deprecated_member_use + info - lib/views/home/profile/complaint_page.dart:245:33 - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss. Try replacing the use of the deprecated member with the replacement. - deprecated_member_use + info - lib/views/home/profile/complaint_page.dart:266:49 - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss. Try replacing the use of the deprecated member with the replacement. - deprecated_member_use + info - lib/views/home/profile/complaint_page.dart:270:56 - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss. Try replacing the use of the deprecated member with the replacement. - deprecated_member_use + info - lib/views/home/profile/passenger_profile_page.dart:282:3 - Parameter 'key' could be a super parameter. Trying converting 'key' to a super parameter. - use_super_parameters + info - lib/views/home/profile/profile_captain.dart:105:47 - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss. Try replacing the use of the deprecated member with the replacement. - deprecated_member_use + info - lib/views/home/profile/profile_captain.dart:203:42 - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss. Try replacing the use of the deprecated member with the replacement. - deprecated_member_use + info - lib/views/home/profile/profile_captain.dart:416:32 - 'surfaceVariant' is deprecated and shouldn't be used. Use surfaceContainerHighest instead. This feature was deprecated after v3.18.0-0.1.pre. Try replacing the use of the deprecated member with the replacement. - deprecated_member_use + info - lib/views/home/profile/profile_captain.dart:416:47 - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss. Try replacing the use of the deprecated member with the replacement. - deprecated_member_use + info - lib/views/home/profile/profile_captain.dart:569:45 - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss. Try replacing the use of the deprecated member with the replacement. - deprecated_member_use + info - lib/views/home/profile/profile_captain.dart:577:60 - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss. Try replacing the use of the deprecated member with the replacement. - deprecated_member_use + info - lib/views/home/profile/promos_passenger_page.dart:34:59 - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss. Try replacing the use of the deprecated member with the replacement. - deprecated_member_use + info - lib/views/home/profile/promos_passenger_page.dart:132:28 - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss. Try replacing the use of the deprecated member with the replacement. - deprecated_member_use + info - lib/views/home/profile/promos_passenger_page.dart:133:26 - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss. Try replacing the use of the deprecated member with the replacement. - deprecated_member_use + info - lib/views/home/statistics/statistics_dashboard.dart:84:51 - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss. Try replacing the use of the deprecated member with the replacement. - deprecated_member_use + info - lib/views/home/statistics/statistics_dashboard.dart:93:51 - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss. Try replacing the use of the deprecated member with the replacement. - deprecated_member_use + info - lib/views/home/statistics/statistics_dashboard.dart:112:57 - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss. Try replacing the use of the deprecated member with the replacement. - deprecated_member_use + info - lib/views/home/statistics/statistics_dashboard.dart:121:57 - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss. Try replacing the use of the deprecated member with the replacement. - deprecated_member_use + info - lib/views/home/statistics/statistics_dashboard.dart:270:38 - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss. Try replacing the use of the deprecated member with the replacement. - deprecated_member_use + info - lib/views/home/statistics/statistics_dashboard.dart:333:26 - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss. Try replacing the use of the deprecated member with the replacement. - deprecated_member_use + info - lib/views/home/statistics/statistics_dashboard.dart:366:55 - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss. Try replacing the use of the deprecated member with the replacement. - deprecated_member_use + info - lib/views/home/statistics/statistics_dashboard.dart:403:43 - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss. Try replacing the use of the deprecated member with the replacement. - deprecated_member_use + info - lib/views/home/statistics/statistics_dashboard.dart:408:36 - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss. Try replacing the use of the deprecated member with the replacement. - deprecated_member_use + info - lib/views/home/statistics/statistics_dashboard.dart:423:40 - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss. Try replacing the use of the deprecated member with the replacement. - deprecated_member_use + info - lib/views/home/statistics/statistics_dashboard.dart:474:46 - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss. Try replacing the use of the deprecated member with the replacement. - deprecated_member_use + info - lib/views/home/statistics/statistics_dashboard.dart:500:34 - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss. Try replacing the use of the deprecated member with the replacement. - deprecated_member_use + info - lib/views/home/statistics/widgets/daily_goal_widget.dart:20:33 - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss. Try replacing the use of the deprecated member with the replacement. - deprecated_member_use + info - lib/views/home/statistics/widgets/daily_goal_widget.dart:38:62 - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss. Try replacing the use of the deprecated member with the replacement. - deprecated_member_use + info - lib/views/home/statistics/widgets/daily_goal_widget.dart:39:60 - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss. Try replacing the use of the deprecated member with the replacement. - deprecated_member_use + info - lib/views/home/statistics/widgets/daily_goal_widget.dart:165:32 - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss. Try replacing the use of the deprecated member with the replacement. - deprecated_member_use + info - lib/views/home/statistics/widgets/daily_goal_widget.dart:271:52 - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss. Try replacing the use of the deprecated member with the replacement. - deprecated_member_use + info - lib/views/home/statistics/widgets/level_progress_widget.dart:21:25 - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss. Try replacing the use of the deprecated member with the replacement. - deprecated_member_use + info - lib/views/home/statistics/widgets/level_progress_widget.dart:22:31 - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss. Try replacing the use of the deprecated member with the replacement. - deprecated_member_use + info - lib/views/home/statistics/widgets/level_progress_widget.dart:28:47 - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss. Try replacing the use of the deprecated member with the replacement. - deprecated_member_use + info - lib/views/home/statistics/widgets/level_progress_widget.dart:75:39 - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss. Try replacing the use of the deprecated member with the replacement. - deprecated_member_use + info - lib/views/home/statistics/widgets/level_progress_widget.dart:146:48 - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss. Try replacing the use of the deprecated member with the replacement. - deprecated_member_use + info - lib/views/home/statistics/widgets/level_progress_widget.dart:152:52 - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss. Try replacing the use of the deprecated member with the replacement. - deprecated_member_use + info - lib/views/home/statistics/widgets/monthly_chart_widget.dart:21:39 - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss. Try replacing the use of the deprecated member with the replacement. - deprecated_member_use + info - lib/views/home/statistics/widgets/monthly_chart_widget.dart:45:34 - Unnecessary use of string interpolation. Try replacing the string literal with the variable name. - unnecessary_string_interpolations + info - lib/views/home/statistics/widgets/monthly_chart_widget.dart:122:64 - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss. Try replacing the use of the deprecated member with the replacement. - deprecated_member_use + info - lib/views/home/statistics/widgets/monthly_chart_widget.dart:123:64 - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss. Try replacing the use of the deprecated member with the replacement. - deprecated_member_use + info - lib/views/home/statistics/widgets/monthly_chart_widget.dart:142:26 - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss. Try replacing the use of the deprecated member with the replacement. - deprecated_member_use + info - lib/views/home/statistics/widgets/stat_summary_card.dart:27:33 - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss. Try replacing the use of the deprecated member with the replacement. - deprecated_member_use + info - lib/views/home/statistics/widgets/stat_summary_card.dart:43:32 - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss. Try replacing the use of the deprecated member with the replacement. - deprecated_member_use + info - lib/views/home/statistics/widgets/today_chart_widget.dart:7:3 - Constructors in '@immutable' classes should be declared as 'const'. Try adding 'const' to the constructor declaration. - prefer_const_constructors_in_immutables + info - lib/views/home/statistics/widgets/today_chart_widget.dart:20:39 - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss. Try replacing the use of the deprecated member with the replacement. - deprecated_member_use + info - lib/views/home/statistics/widgets/today_chart_widget.dart:65:28 - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss. Try replacing the use of the deprecated member with the replacement. - deprecated_member_use + info - lib/views/home/statistics/widgets/weekly_chart_widget.dart:21:39 - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss. Try replacing the use of the deprecated member with the replacement. - deprecated_member_use + info - lib/views/home/statistics/widgets/weekly_chart_widget.dart:39:63 - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss. Try replacing the use of the deprecated member with the replacement. - deprecated_member_use + info - lib/views/home/statistics/widgets/weekly_chart_widget.dart:133:48 - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss. Try replacing the use of the deprecated member with the replacement. - deprecated_member_use + info - lib/views/home/statistics/widgets/weekly_chart_widget.dart:135:48 - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss. Try replacing the use of the deprecated member with the replacement. - deprecated_member_use + info - lib/views/lang/languages.dart:10:9 - Parameter 'key' could be a super parameter. Trying converting 'key' to a super parameter. - use_super_parameters + info - lib/views/lang/languages.dart:90:33 - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss. Try replacing the use of the deprecated member with the replacement. - deprecated_member_use + info - lib/views/lang/languages.dart:103:52 - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss. Try replacing the use of the deprecated member with the replacement. - deprecated_member_use + info - lib/views/notification/available_rides_page.dart:56:61 - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss. Try replacing the use of the deprecated member with the replacement. - deprecated_member_use + info - lib/views/notification/available_rides_page.dart:109:9 - Parameter 'key' could be a super parameter. Trying converting 'key' to a super parameter. - use_super_parameters + info - lib/views/notification/available_rides_page.dart:117:50 - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss. Try replacing the use of the deprecated member with the replacement. - deprecated_member_use + info - lib/views/notification/available_rides_page.dart:160:44 - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss. Try replacing the use of the deprecated member with the replacement. - deprecated_member_use + info - lib/views/notification/available_rides_page.dart:162:63 - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss. Try replacing the use of the deprecated member with the replacement. - deprecated_member_use + info - lib/views/notification/available_rides_page.dart:396:7 - Don't invoke 'print' in production code. Try using a logging framework. - avoid_print + info - lib/views/notification/notification_captain.dart:1:8 - The import of 'package:flutter/material.dart' is unnecessary because all of the used elements are also provided by the import of 'package:flutter/cupertino.dart'. Try removing the import directive. - unnecessary_import + info - lib/views/notification/notification_captain.dart:7:9 - Parameter 'key' could be a super parameter. Trying converting 'key' to a super parameter. - use_super_parameters + info - lib/views/notification/notification_captain.dart:80:13 - The 'child' argument should be last in widget constructor invocations. Try moving the argument to the end of the argument list. - sort_child_properties_last + info - lib/views/notification/notification_page.dart:40:61 - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss. Try replacing the use of the deprecated member with the replacement. - deprecated_member_use + info - lib/views/notification/notification_page.dart:41:61 - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss. Try replacing the use of the deprecated member with the replacement. - deprecated_member_use + info - lib/views/widgets/elevated_btn.dart:17:9 - Parameter 'key' could be a super parameter. Trying converting 'key' to a super parameter. - use_super_parameters + info - lib/views/widgets/error_snakbar.dart:1:8 - The import of 'dart:ui' is unnecessary because all of the used elements are also provided by the import of 'package:flutter/material.dart'. Try removing the import directive. - unnecessary_import + info - lib/views/widgets/error_snakbar.dart:109:42 - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss. Try replacing the use of the deprecated member with the replacement. - deprecated_member_use + info - lib/views/widgets/error_snakbar.dart:112:27 - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss. Try replacing the use of the deprecated member with the replacement. - deprecated_member_use + info - lib/views/widgets/error_snakbar.dart:118:33 - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss. Try replacing the use of the deprecated member with the replacement. - deprecated_member_use + info - lib/views/widgets/error_snakbar.dart:142:39 - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss. Try replacing the use of the deprecated member with the replacement. - deprecated_member_use + info - lib/views/widgets/error_snakbar.dart:192:44 - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss. Try replacing the use of the deprecated member with the replacement. - deprecated_member_use + info - lib/views/widgets/error_snakbar.dart:214:35 - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss. Try replacing the use of the deprecated member with the replacement. - deprecated_member_use + info - lib/views/widgets/error_snakbar.dart:222:39 - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss. Try replacing the use of the deprecated member with the replacement. - deprecated_member_use + info - lib/views/widgets/icon_widget_menu.dart:7:9 - Parameter 'key' could be a super parameter. Trying converting 'key' to a super parameter. - use_super_parameters + info - lib/views/widgets/my_circular_indicator_timer.dart:9:3 - Parameter 'key' could be a super parameter. Trying converting 'key' to a super parameter. - use_super_parameters + info - lib/views/widgets/my_circular_indicator_timer.dart:18:9 - The local variable '_timeLeft' starts with an underscore. Try renaming the variable to not start with an underscore. - no_leading_underscores_for_local_identifiers + info - lib/views/widgets/my_textField.dart:1:1 - The file name 'my_textField.dart' isn't a lower_case_with_underscores identifier. Try changing the name to follow the lower_case_with_underscores style. - file_names + info - lib/views/widgets/my_textField.dart:8:9 - Parameter 'key' could be a super parameter. Trying converting 'key' to a super parameter. - use_super_parameters + info - lib/views/widgets/voice_call_bottom_sheet.dart:9:9 - Parameter 'key' could be a super parameter. Trying converting 'key' to a super parameter. - use_super_parameters + info - lib/views/widgets/voice_call_bottom_sheet.dart:23:12 - 'WillPopScope' is deprecated and shouldn't be used. Use PopScope instead. The Android predictive back feature will not work with WillPopScope. This feature was deprecated after v3.12.0-1.0.pre. Try replacing the use of the deprecated member with the replacement. - deprecated_member_use + info - lib/views/widgets/voice_call_bottom_sheet.dart:32:33 - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss. Try replacing the use of the deprecated member with the replacement. - deprecated_member_use + info - lib/views/widgets/voice_call_bottom_sheet.dart:62:28 - Unnecessary use of string interpolation. Try replacing the string literal with the variable name. - unnecessary_string_interpolations + info - lib/views/widgets/voice_call_bottom_sheet.dart:163:53 - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss. Try replacing the use of the deprecated member with the replacement. - deprecated_member_use + info - lib/views/widgets/voice_call_bottom_sheet.dart:181:54 - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss. Try replacing the use of the deprecated member with the replacement. - deprecated_member_use + +1014 issues found. diff --git a/siro_driver/android/.gitignore b/siro_driver/android/.gitignore new file mode 100644 index 0000000..55afd91 --- /dev/null +++ b/siro_driver/android/.gitignore @@ -0,0 +1,13 @@ +gradle-wrapper.jar +/.gradle +/captures/ +/gradlew +/gradlew.bat +/local.properties +GeneratedPluginRegistrant.java + +# Remember to never publicly share your keystore. +# See https://flutter.dev/to/reference-keystore +key.properties +**/*.keystore +**/*.jks diff --git a/siro_driver/android/app/.cxx/Debug/2j1f5m6a/arm64-v8a/.cmake/api/v1/query/client-agp/cache-v2 b/siro_driver/android/app/.cxx/Debug/2j1f5m6a/arm64-v8a/.cmake/api/v1/query/client-agp/cache-v2 new file mode 100644 index 0000000..e69de29 diff --git a/siro_driver/android/app/.cxx/Debug/2j1f5m6a/arm64-v8a/.cmake/api/v1/query/client-agp/cmakeFiles-v1 b/siro_driver/android/app/.cxx/Debug/2j1f5m6a/arm64-v8a/.cmake/api/v1/query/client-agp/cmakeFiles-v1 new file mode 100644 index 0000000..e69de29 diff --git a/siro_driver/android/app/.cxx/Debug/2j1f5m6a/arm64-v8a/.cmake/api/v1/query/client-agp/codemodel-v2 b/siro_driver/android/app/.cxx/Debug/2j1f5m6a/arm64-v8a/.cmake/api/v1/query/client-agp/codemodel-v2 new file mode 100644 index 0000000..e69de29 diff --git a/siro_driver/android/app/.cxx/Debug/2j1f5m6a/arm64-v8a/.cmake/api/v1/reply/cache-v2-f03761f9d1223ce461cd.json b/siro_driver/android/app/.cxx/Debug/2j1f5m6a/arm64-v8a/.cmake/api/v1/reply/cache-v2-f03761f9d1223ce461cd.json new file mode 100644 index 0000000..9c83f76 --- /dev/null +++ b/siro_driver/android/app/.cxx/Debug/2j1f5m6a/arm64-v8a/.cmake/api/v1/reply/cache-v2-f03761f9d1223ce461cd.json @@ -0,0 +1,1479 @@ +{ + "entries" : + [ + { + "name" : "ANDROID_ABI", + "properties" : + [ + { + "name" : "HELPSTRING", + "value" : "No help, variable specified on the command line." + } + ], + "type" : "UNINITIALIZED", + "value" : "arm64-v8a" + }, + { + "name" : "ANDROID_NDK", + "properties" : + [ + { + "name" : "HELPSTRING", + "value" : "No help, variable specified on the command line." + } + ], + "type" : "UNINITIALIZED", + "value" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973" + }, + { + "name" : "ANDROID_PLATFORM", + "properties" : + [ + { + "name" : "HELPSTRING", + "value" : "No help, variable specified on the command line." + } + ], + "type" : "UNINITIALIZED", + "value" : "android-23" + }, + { + "name" : "CMAKE_ADDR2LINE", + "properties" : + [ + { + "name" : "ADVANCED", + "value" : "1" + }, + { + "name" : "HELPSTRING", + "value" : "Path to a program." + } + ], + "type" : "FILEPATH", + "value" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/bin/llvm-addr2line" + }, + { + "name" : "CMAKE_ANDROID_ARCH_ABI", + "properties" : + [ + { + "name" : "HELPSTRING", + "value" : "No help, variable specified on the command line." + } + ], + "type" : "UNINITIALIZED", + "value" : "arm64-v8a" + }, + { + "name" : "CMAKE_ANDROID_NDK", + "properties" : + [ + { + "name" : "HELPSTRING", + "value" : "No help, variable specified on the command line." + } + ], + "type" : "UNINITIALIZED", + "value" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973" + }, + { + "name" : "CMAKE_AR", + "properties" : + [ + { + "name" : "ADVANCED", + "value" : "1" + }, + { + "name" : "HELPSTRING", + "value" : "Archiver" + } + ], + "type" : "FILEPATH", + "value" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/bin/llvm-ar" + }, + { + "name" : "CMAKE_ASM_FLAGS", + "properties" : + [ + { + "name" : "HELPSTRING", + "value" : "Flags used by the compiler during all build types." + } + ], + "type" : "STRING", + "value" : "" + }, + { + "name" : "CMAKE_ASM_FLAGS_DEBUG", + "properties" : + [ + { + "name" : "HELPSTRING", + "value" : "Flags used by the compiler during debug builds." + } + ], + "type" : "STRING", + "value" : "" + }, + { + "name" : "CMAKE_ASM_FLAGS_RELEASE", + "properties" : + [ + { + "name" : "HELPSTRING", + "value" : "Flags used by the compiler during release builds." + } + ], + "type" : "STRING", + "value" : "" + }, + { + "name" : "CMAKE_BUILD_TYPE", + "properties" : + [ + { + "name" : "HELPSTRING", + "value" : "Choose the type of build, options are: None Debug Release RelWithDebInfo MinSizeRel ..." + } + ], + "type" : "STRING", + "value" : "Debug" + }, + { + "name" : "CMAKE_CACHEFILE_DIR", + "properties" : + [ + { + "name" : "HELPSTRING", + "value" : "This is the directory where this CMakeCache.txt was created" + } + ], + "type" : "INTERNAL", + "value" : "/Users/hamzaaleghwairyeen/development/App/intaleq_driver/android/app/.cxx/Debug/2j1f5m6a/arm64-v8a" + }, + { + "name" : "CMAKE_CACHE_MAJOR_VERSION", + "properties" : + [ + { + "name" : "HELPSTRING", + "value" : "Major version of cmake used to create the current loaded cache" + } + ], + "type" : "INTERNAL", + "value" : "3" + }, + { + "name" : "CMAKE_CACHE_MINOR_VERSION", + "properties" : + [ + { + "name" : "HELPSTRING", + "value" : "Minor version of cmake used to create the current loaded cache" + } + ], + "type" : "INTERNAL", + "value" : "31" + }, + { + "name" : "CMAKE_CACHE_PATCH_VERSION", + "properties" : + [ + { + "name" : "HELPSTRING", + "value" : "Patch version of cmake used to create the current loaded cache" + } + ], + "type" : "INTERNAL", + "value" : "5" + }, + { + "name" : "CMAKE_COMMAND", + "properties" : + [ + { + "name" : "HELPSTRING", + "value" : "Path to CMake executable." + } + ], + "type" : "INTERNAL", + "value" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/bin/cmake" + }, + { + "name" : "CMAKE_CPACK_COMMAND", + "properties" : + [ + { + "name" : "HELPSTRING", + "value" : "Path to cpack program executable." + } + ], + "type" : "INTERNAL", + "value" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/bin/cpack" + }, + { + "name" : "CMAKE_CTEST_COMMAND", + "properties" : + [ + { + "name" : "HELPSTRING", + "value" : "Path to ctest program executable." + } + ], + "type" : "INTERNAL", + "value" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/bin/ctest" + }, + { + "name" : "CMAKE_CXX_COMPILER", + "properties" : + [ + { + "name" : "ADVANCED", + "value" : "1" + }, + { + "name" : "HELPSTRING", + "value" : "" + } + ], + "type" : "UNINITIALIZED", + "value" : "" + }, + { + "name" : "CMAKE_CXX_COMPILER_AR", + "properties" : + [ + { + "name" : "ADVANCED", + "value" : "1" + }, + { + "name" : "HELPSTRING", + "value" : "LLVM archiver" + } + ], + "type" : "FILEPATH", + "value" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/bin/llvm-ar" + }, + { + "name" : "CMAKE_CXX_COMPILER_CLANG_SCAN_DEPS", + "properties" : + [ + { + "name" : "ADVANCED", + "value" : "1" + }, + { + "name" : "HELPSTRING", + "value" : "`clang-scan-deps` dependency scanner" + } + ], + "type" : "FILEPATH", + "value" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/bin/clang-scan-deps" + }, + { + "name" : "CMAKE_CXX_COMPILER_RANLIB", + "properties" : + [ + { + "name" : "ADVANCED", + "value" : "1" + }, + { + "name" : "HELPSTRING", + "value" : "Generate index for LLVM archive" + } + ], + "type" : "FILEPATH", + "value" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/bin/llvm-ranlib" + }, + { + "name" : "CMAKE_CXX_FLAGS", + "properties" : + [ + { + "name" : "ADVANCED", + "value" : "1" + }, + { + "name" : "HELPSTRING", + "value" : "Flags used by the compiler during all build types." + } + ], + "type" : "STRING", + "value" : "" + }, + { + "name" : "CMAKE_CXX_FLAGS_DEBUG", + "properties" : + [ + { + "name" : "ADVANCED", + "value" : "1" + }, + { + "name" : "HELPSTRING", + "value" : "Flags used by the compiler during debug builds." + } + ], + "type" : "STRING", + "value" : "" + }, + { + "name" : "CMAKE_CXX_FLAGS_MINSIZEREL", + "properties" : + [ + { + "name" : "ADVANCED", + "value" : "1" + }, + { + "name" : "HELPSTRING", + "value" : "Flags used by the CXX compiler during MINSIZEREL builds." + } + ], + "type" : "STRING", + "value" : "-Os -DNDEBUG" + }, + { + "name" : "CMAKE_CXX_FLAGS_RELEASE", + "properties" : + [ + { + "name" : "ADVANCED", + "value" : "1" + }, + { + "name" : "HELPSTRING", + "value" : "Flags used by the compiler during release builds." + } + ], + "type" : "STRING", + "value" : "" + }, + { + "name" : "CMAKE_CXX_FLAGS_RELWITHDEBINFO", + "properties" : + [ + { + "name" : "ADVANCED", + "value" : "1" + }, + { + "name" : "HELPSTRING", + "value" : "Flags used by the CXX compiler during RELWITHDEBINFO builds." + } + ], + "type" : "STRING", + "value" : "-O2 -g -DNDEBUG" + }, + { + "name" : "CMAKE_CXX_STANDARD_LIBRARIES", + "properties" : + [ + { + "name" : "ADVANCED", + "value" : "1" + }, + { + "name" : "HELPSTRING", + "value" : "Libraries linked by default with all C++ applications." + } + ], + "type" : "STRING", + "value" : "-latomic -lm" + }, + { + "name" : "CMAKE_C_COMPILER", + "properties" : + [ + { + "name" : "ADVANCED", + "value" : "1" + }, + { + "name" : "HELPSTRING", + "value" : "" + } + ], + "type" : "UNINITIALIZED", + "value" : "" + }, + { + "name" : "CMAKE_C_COMPILER_AR", + "properties" : + [ + { + "name" : "ADVANCED", + "value" : "1" + }, + { + "name" : "HELPSTRING", + "value" : "LLVM archiver" + } + ], + "type" : "FILEPATH", + "value" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/bin/llvm-ar" + }, + { + "name" : "CMAKE_C_COMPILER_CLANG_SCAN_DEPS", + "properties" : + [ + { + "name" : "ADVANCED", + "value" : "1" + }, + { + "name" : "HELPSTRING", + "value" : "`clang-scan-deps` dependency scanner" + } + ], + "type" : "FILEPATH", + "value" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/bin/clang-scan-deps" + }, + { + "name" : "CMAKE_C_COMPILER_RANLIB", + "properties" : + [ + { + "name" : "ADVANCED", + "value" : "1" + }, + { + "name" : "HELPSTRING", + "value" : "Generate index for LLVM archive" + } + ], + "type" : "FILEPATH", + "value" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/bin/llvm-ranlib" + }, + { + "name" : "CMAKE_C_FLAGS", + "properties" : + [ + { + "name" : "ADVANCED", + "value" : "1" + }, + { + "name" : "HELPSTRING", + "value" : "Flags used by the compiler during all build types." + } + ], + "type" : "STRING", + "value" : "" + }, + { + "name" : "CMAKE_C_FLAGS_DEBUG", + "properties" : + [ + { + "name" : "ADVANCED", + "value" : "1" + }, + { + "name" : "HELPSTRING", + "value" : "Flags used by the compiler during debug builds." + } + ], + "type" : "STRING", + "value" : "" + }, + { + "name" : "CMAKE_C_FLAGS_MINSIZEREL", + "properties" : + [ + { + "name" : "ADVANCED", + "value" : "1" + }, + { + "name" : "HELPSTRING", + "value" : "Flags used by the C compiler during MINSIZEREL builds." + } + ], + "type" : "STRING", + "value" : "-Os -DNDEBUG" + }, + { + "name" : "CMAKE_C_FLAGS_RELEASE", + "properties" : + [ + { + "name" : "ADVANCED", + "value" : "1" + }, + { + "name" : "HELPSTRING", + "value" : "Flags used by the compiler during release builds." + } + ], + "type" : "STRING", + "value" : "" + }, + { + "name" : "CMAKE_C_FLAGS_RELWITHDEBINFO", + "properties" : + [ + { + "name" : "ADVANCED", + "value" : "1" + }, + { + "name" : "HELPSTRING", + "value" : "Flags used by the C compiler during RELWITHDEBINFO builds." + } + ], + "type" : "STRING", + "value" : "-O2 -g -DNDEBUG" + }, + { + "name" : "CMAKE_C_STANDARD_LIBRARIES", + "properties" : + [ + { + "name" : "ADVANCED", + "value" : "1" + }, + { + "name" : "HELPSTRING", + "value" : "Libraries linked by default with all C applications." + } + ], + "type" : "STRING", + "value" : "-latomic -lm" + }, + { + "name" : "CMAKE_DLLTOOL", + "properties" : + [ + { + "name" : "ADVANCED", + "value" : "1" + }, + { + "name" : "HELPSTRING", + "value" : "Path to a program." + } + ], + "type" : "FILEPATH", + "value" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/bin/llvm-dlltool" + }, + { + "name" : "CMAKE_EDIT_COMMAND", + "properties" : + [ + { + "name" : "HELPSTRING", + "value" : "Path to cache edit program executable." + } + ], + "type" : "INTERNAL", + "value" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/bin/ccmake" + }, + { + "name" : "CMAKE_EXECUTABLE_FORMAT", + "properties" : + [ + { + "name" : "HELPSTRING", + "value" : "Executable file format" + } + ], + "type" : "INTERNAL", + "value" : "ELF" + }, + { + "name" : "CMAKE_EXE_LINKER_FLAGS", + "properties" : + [ + { + "name" : "ADVANCED", + "value" : "1" + }, + { + "name" : "HELPSTRING", + "value" : "Flags used by the linker." + } + ], + "type" : "STRING", + "value" : "" + }, + { + "name" : "CMAKE_EXE_LINKER_FLAGS_DEBUG", + "properties" : + [ + { + "name" : "ADVANCED", + "value" : "1" + }, + { + "name" : "HELPSTRING", + "value" : "Flags used by the linker during DEBUG builds." + } + ], + "type" : "STRING", + "value" : "" + }, + { + "name" : "CMAKE_EXE_LINKER_FLAGS_MINSIZEREL", + "properties" : + [ + { + "name" : "ADVANCED", + "value" : "1" + }, + { + "name" : "HELPSTRING", + "value" : "Flags used by the linker during MINSIZEREL builds." + } + ], + "type" : "STRING", + "value" : "" + }, + { + "name" : "CMAKE_EXE_LINKER_FLAGS_RELEASE", + "properties" : + [ + { + "name" : "ADVANCED", + "value" : "1" + }, + { + "name" : "HELPSTRING", + "value" : "Flags used by the linker during RELEASE builds." + } + ], + "type" : "STRING", + "value" : "" + }, + { + "name" : "CMAKE_EXE_LINKER_FLAGS_RELWITHDEBINFO", + "properties" : + [ + { + "name" : "ADVANCED", + "value" : "1" + }, + { + "name" : "HELPSTRING", + "value" : "Flags used by the linker during RELWITHDEBINFO builds." + } + ], + "type" : "STRING", + "value" : "" + }, + { + "name" : "CMAKE_EXPORT_BUILD_DATABASE", + "properties" : + [ + { + "name" : "ADVANCED", + "value" : "1" + }, + { + "name" : "HELPSTRING", + "value" : "Enable/Disable output of build database during the build." + } + ], + "type" : "BOOL", + "value" : "" + }, + { + "name" : "CMAKE_EXPORT_COMPILE_COMMANDS", + "properties" : + [ + { + "name" : "HELPSTRING", + "value" : "No help, variable specified on the command line." + } + ], + "type" : "UNINITIALIZED", + "value" : "ON" + }, + { + "name" : "CMAKE_EXTRA_GENERATOR", + "properties" : + [ + { + "name" : "HELPSTRING", + "value" : "Name of external makefile project generator." + } + ], + "type" : "INTERNAL", + "value" : "" + }, + { + "name" : "CMAKE_FIND_PACKAGE_REDIRECTS_DIR", + "properties" : + [ + { + "name" : "HELPSTRING", + "value" : "Value Computed by CMake." + } + ], + "type" : "STATIC", + "value" : "/Users/hamzaaleghwairyeen/development/App/intaleq_driver/android/app/.cxx/Debug/2j1f5m6a/arm64-v8a/CMakeFiles/pkgRedirects" + }, + { + "name" : "CMAKE_GENERATOR", + "properties" : + [ + { + "name" : "HELPSTRING", + "value" : "Name of generator." + } + ], + "type" : "INTERNAL", + "value" : "Ninja" + }, + { + "name" : "CMAKE_GENERATOR_INSTANCE", + "properties" : + [ + { + "name" : "HELPSTRING", + "value" : "Generator instance identifier." + } + ], + "type" : "INTERNAL", + "value" : "" + }, + { + "name" : "CMAKE_GENERATOR_PLATFORM", + "properties" : + [ + { + "name" : "HELPSTRING", + "value" : "Name of generator platform." + } + ], + "type" : "INTERNAL", + "value" : "" + }, + { + "name" : "CMAKE_GENERATOR_TOOLSET", + "properties" : + [ + { + "name" : "HELPSTRING", + "value" : "Name of generator toolset." + } + ], + "type" : "INTERNAL", + "value" : "" + }, + { + "name" : "CMAKE_HOME_DIRECTORY", + "properties" : + [ + { + "name" : "HELPSTRING", + "value" : "Source directory with the top level CMakeLists.txt file for this project" + } + ], + "type" : "INTERNAL", + "value" : "/Users/hamzaaleghwairyeen/development/App/intaleq_driver/android/app/src/main/cpp" + }, + { + "name" : "CMAKE_INSTALL_PREFIX", + "properties" : + [ + { + "name" : "HELPSTRING", + "value" : "Install path prefix, prepended onto install directories." + } + ], + "type" : "PATH", + "value" : "/usr/local" + }, + { + "name" : "CMAKE_INSTALL_SO_NO_EXE", + "properties" : + [ + { + "name" : "HELPSTRING", + "value" : "Install .so files without execute permission." + } + ], + "type" : "INTERNAL", + "value" : "0" + }, + { + "name" : "CMAKE_LIBRARY_OUTPUT_DIRECTORY", + "properties" : + [ + { + "name" : "HELPSTRING", + "value" : "No help, variable specified on the command line." + } + ], + "type" : "UNINITIALIZED", + "value" : "/Users/hamzaaleghwairyeen/development/App/intaleq_driver/build/app/intermediates/cxx/Debug/2j1f5m6a/obj/arm64-v8a" + }, + { + "name" : "CMAKE_LINKER", + "properties" : + [ + { + "name" : "ADVANCED", + "value" : "1" + }, + { + "name" : "HELPSTRING", + "value" : "Path to a program." + } + ], + "type" : "FILEPATH", + "value" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/bin/ld.lld" + }, + { + "name" : "CMAKE_MAKE_PROGRAM", + "properties" : + [ + { + "name" : "HELPSTRING", + "value" : "No help, variable specified on the command line." + } + ], + "type" : "UNINITIALIZED", + "value" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/bin/ninja" + }, + { + "name" : "CMAKE_MODULE_LINKER_FLAGS", + "properties" : + [ + { + "name" : "ADVANCED", + "value" : "1" + }, + { + "name" : "HELPSTRING", + "value" : "Flags used by the linker during the creation of modules." + } + ], + "type" : "STRING", + "value" : "" + }, + { + "name" : "CMAKE_MODULE_LINKER_FLAGS_DEBUG", + "properties" : + [ + { + "name" : "ADVANCED", + "value" : "1" + }, + { + "name" : "HELPSTRING", + "value" : "Flags used by the linker during the creation of modules during DEBUG builds." + } + ], + "type" : "STRING", + "value" : "" + }, + { + "name" : "CMAKE_MODULE_LINKER_FLAGS_MINSIZEREL", + "properties" : + [ + { + "name" : "ADVANCED", + "value" : "1" + }, + { + "name" : "HELPSTRING", + "value" : "Flags used by the linker during the creation of modules during MINSIZEREL builds." + } + ], + "type" : "STRING", + "value" : "" + }, + { + "name" : "CMAKE_MODULE_LINKER_FLAGS_RELEASE", + "properties" : + [ + { + "name" : "ADVANCED", + "value" : "1" + }, + { + "name" : "HELPSTRING", + "value" : "Flags used by the linker during the creation of modules during RELEASE builds." + } + ], + "type" : "STRING", + "value" : "" + }, + { + "name" : "CMAKE_MODULE_LINKER_FLAGS_RELWITHDEBINFO", + "properties" : + [ + { + "name" : "ADVANCED", + "value" : "1" + }, + { + "name" : "HELPSTRING", + "value" : "Flags used by the linker during the creation of modules during RELWITHDEBINFO builds." + } + ], + "type" : "STRING", + "value" : "" + }, + { + "name" : "CMAKE_NM", + "properties" : + [ + { + "name" : "ADVANCED", + "value" : "1" + }, + { + "name" : "HELPSTRING", + "value" : "Path to a program." + } + ], + "type" : "FILEPATH", + "value" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/bin/llvm-nm" + }, + { + "name" : "CMAKE_NUMBER_OF_MAKEFILES", + "properties" : + [ + { + "name" : "HELPSTRING", + "value" : "number of local generators" + } + ], + "type" : "INTERNAL", + "value" : "1" + }, + { + "name" : "CMAKE_OBJCOPY", + "properties" : + [ + { + "name" : "ADVANCED", + "value" : "1" + }, + { + "name" : "HELPSTRING", + "value" : "Path to a program." + } + ], + "type" : "FILEPATH", + "value" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/bin/llvm-objcopy" + }, + { + "name" : "CMAKE_OBJDUMP", + "properties" : + [ + { + "name" : "ADVANCED", + "value" : "1" + }, + { + "name" : "HELPSTRING", + "value" : "Path to a program." + } + ], + "type" : "FILEPATH", + "value" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/bin/llvm-objdump" + }, + { + "name" : "CMAKE_PLATFORM_INFO_INITIALIZED", + "properties" : + [ + { + "name" : "HELPSTRING", + "value" : "Platform information initialized" + } + ], + "type" : "INTERNAL", + "value" : "1" + }, + { + "name" : "CMAKE_PROJECT_DESCRIPTION", + "properties" : + [ + { + "name" : "HELPSTRING", + "value" : "Value Computed by CMake" + } + ], + "type" : "STATIC", + "value" : "" + }, + { + "name" : "CMAKE_PROJECT_HOMEPAGE_URL", + "properties" : + [ + { + "name" : "HELPSTRING", + "value" : "Value Computed by CMake" + } + ], + "type" : "STATIC", + "value" : "" + }, + { + "name" : "CMAKE_PROJECT_NAME", + "properties" : + [ + { + "name" : "HELPSTRING", + "value" : "Value Computed by CMake" + } + ], + "type" : "STATIC", + "value" : "intaleq_driver" + }, + { + "name" : "CMAKE_RANLIB", + "properties" : + [ + { + "name" : "ADVANCED", + "value" : "1" + }, + { + "name" : "HELPSTRING", + "value" : "Ranlib" + } + ], + "type" : "FILEPATH", + "value" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/bin/llvm-ranlib" + }, + { + "name" : "CMAKE_READELF", + "properties" : + [ + { + "name" : "ADVANCED", + "value" : "1" + }, + { + "name" : "HELPSTRING", + "value" : "Path to a program." + } + ], + "type" : "FILEPATH", + "value" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/bin/llvm-readelf" + }, + { + "name" : "CMAKE_ROOT", + "properties" : + [ + { + "name" : "HELPSTRING", + "value" : "Path to CMake installation." + } + ], + "type" : "INTERNAL", + "value" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31" + }, + { + "name" : "CMAKE_RUNTIME_OUTPUT_DIRECTORY", + "properties" : + [ + { + "name" : "HELPSTRING", + "value" : "No help, variable specified on the command line." + } + ], + "type" : "UNINITIALIZED", + "value" : "/Users/hamzaaleghwairyeen/development/App/intaleq_driver/build/app/intermediates/cxx/Debug/2j1f5m6a/obj/arm64-v8a" + }, + { + "name" : "CMAKE_SHARED_LINKER_FLAGS", + "properties" : + [ + { + "name" : "ADVANCED", + "value" : "1" + }, + { + "name" : "HELPSTRING", + "value" : "Flags used by the linker during the creation of dll's." + } + ], + "type" : "STRING", + "value" : "" + }, + { + "name" : "CMAKE_SHARED_LINKER_FLAGS_DEBUG", + "properties" : + [ + { + "name" : "ADVANCED", + "value" : "1" + }, + { + "name" : "HELPSTRING", + "value" : "Flags used by the linker during the creation of shared libraries during DEBUG builds." + } + ], + "type" : "STRING", + "value" : "" + }, + { + "name" : "CMAKE_SHARED_LINKER_FLAGS_MINSIZEREL", + "properties" : + [ + { + "name" : "ADVANCED", + "value" : "1" + }, + { + "name" : "HELPSTRING", + "value" : "Flags used by the linker during the creation of shared libraries during MINSIZEREL builds." + } + ], + "type" : "STRING", + "value" : "" + }, + { + "name" : "CMAKE_SHARED_LINKER_FLAGS_RELEASE", + "properties" : + [ + { + "name" : "ADVANCED", + "value" : "1" + }, + { + "name" : "HELPSTRING", + "value" : "Flags used by the linker during the creation of shared libraries during RELEASE builds." + } + ], + "type" : "STRING", + "value" : "" + }, + { + "name" : "CMAKE_SHARED_LINKER_FLAGS_RELWITHDEBINFO", + "properties" : + [ + { + "name" : "ADVANCED", + "value" : "1" + }, + { + "name" : "HELPSTRING", + "value" : "Flags used by the linker during the creation of shared libraries during RELWITHDEBINFO builds." + } + ], + "type" : "STRING", + "value" : "" + }, + { + "name" : "CMAKE_SKIP_INSTALL_RPATH", + "properties" : + [ + { + "name" : "ADVANCED", + "value" : "1" + }, + { + "name" : "HELPSTRING", + "value" : "If set, runtime paths are not added when installing shared libraries, but are added when building." + } + ], + "type" : "BOOL", + "value" : "NO" + }, + { + "name" : "CMAKE_SKIP_RPATH", + "properties" : + [ + { + "name" : "ADVANCED", + "value" : "1" + }, + { + "name" : "HELPSTRING", + "value" : "If set, runtime paths are not added when using shared libraries." + } + ], + "type" : "BOOL", + "value" : "NO" + }, + { + "name" : "CMAKE_STATIC_LINKER_FLAGS", + "properties" : + [ + { + "name" : "ADVANCED", + "value" : "1" + }, + { + "name" : "HELPSTRING", + "value" : "Flags used by the linker during the creation of static libraries during all build types." + } + ], + "type" : "STRING", + "value" : "" + }, + { + "name" : "CMAKE_STATIC_LINKER_FLAGS_DEBUG", + "properties" : + [ + { + "name" : "ADVANCED", + "value" : "1" + }, + { + "name" : "HELPSTRING", + "value" : "Flags used by the linker during the creation of static libraries during DEBUG builds." + } + ], + "type" : "STRING", + "value" : "" + }, + { + "name" : "CMAKE_STATIC_LINKER_FLAGS_MINSIZEREL", + "properties" : + [ + { + "name" : "ADVANCED", + "value" : "1" + }, + { + "name" : "HELPSTRING", + "value" : "Flags used by the linker during the creation of static libraries during MINSIZEREL builds." + } + ], + "type" : "STRING", + "value" : "" + }, + { + "name" : "CMAKE_STATIC_LINKER_FLAGS_RELEASE", + "properties" : + [ + { + "name" : "ADVANCED", + "value" : "1" + }, + { + "name" : "HELPSTRING", + "value" : "Flags used by the linker during the creation of static libraries during RELEASE builds." + } + ], + "type" : "STRING", + "value" : "" + }, + { + "name" : "CMAKE_STATIC_LINKER_FLAGS_RELWITHDEBINFO", + "properties" : + [ + { + "name" : "ADVANCED", + "value" : "1" + }, + { + "name" : "HELPSTRING", + "value" : "Flags used by the linker during the creation of static libraries during RELWITHDEBINFO builds." + } + ], + "type" : "STRING", + "value" : "" + }, + { + "name" : "CMAKE_STRIP", + "properties" : + [ + { + "name" : "ADVANCED", + "value" : "1" + }, + { + "name" : "HELPSTRING", + "value" : "Strip" + } + ], + "type" : "FILEPATH", + "value" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/bin/llvm-strip" + }, + { + "name" : "CMAKE_SYSTEM_NAME", + "properties" : + [ + { + "name" : "HELPSTRING", + "value" : "No help, variable specified on the command line." + } + ], + "type" : "UNINITIALIZED", + "value" : "Android" + }, + { + "name" : "CMAKE_SYSTEM_VERSION", + "properties" : + [ + { + "name" : "HELPSTRING", + "value" : "No help, variable specified on the command line." + } + ], + "type" : "UNINITIALIZED", + "value" : "23" + }, + { + "name" : "CMAKE_TAPI", + "properties" : + [ + { + "name" : "ADVANCED", + "value" : "1" + }, + { + "name" : "HELPSTRING", + "value" : "Path to a program." + } + ], + "type" : "FILEPATH", + "value" : "CMAKE_TAPI-NOTFOUND" + }, + { + "name" : "CMAKE_TOOLCHAIN_FILE", + "properties" : + [ + { + "name" : "HELPSTRING", + "value" : "The CMake toolchain file" + } + ], + "type" : "FILEPATH", + "value" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/build/cmake/android.toolchain.cmake" + }, + { + "name" : "CMAKE_UNAME", + "properties" : + [ + { + "name" : "HELPSTRING", + "value" : "uname command" + } + ], + "type" : "INTERNAL", + "value" : "/usr/bin/uname" + }, + { + "name" : "CMAKE_VERBOSE_MAKEFILE", + "properties" : + [ + { + "name" : "ADVANCED", + "value" : "1" + }, + { + "name" : "HELPSTRING", + "value" : "If this value is on, makefiles will be generated without the .SILENT directive, and all commands will be echoed to the console during the make. This is useful for debugging only. With Visual Studio IDE projects all commands are done without /nologo." + } + ], + "type" : "BOOL", + "value" : "FALSE" + }, + { + "name" : "_CMAKE_CXX_LINKER_PUSHPOP_STATE_SUPPORTED", + "properties" : + [ + { + "name" : "HELPSTRING", + "value" : "linker supports push/pop state" + } + ], + "type" : "INTERNAL", + "value" : "TRUE" + }, + { + "name" : "_CMAKE_C_LINKER_PUSHPOP_STATE_SUPPORTED", + "properties" : + [ + { + "name" : "HELPSTRING", + "value" : "linker supports push/pop state" + } + ], + "type" : "INTERNAL", + "value" : "TRUE" + }, + { + "name" : "_CMAKE_LINKER_PUSHPOP_STATE_SUPPORTED", + "properties" : + [ + { + "name" : "HELPSTRING", + "value" : "linker supports push/pop state" + } + ], + "type" : "INTERNAL", + "value" : "TRUE" + }, + { + "name" : "intaleq_driver_BINARY_DIR", + "properties" : + [ + { + "name" : "HELPSTRING", + "value" : "Value Computed by CMake" + } + ], + "type" : "STATIC", + "value" : "/Users/hamzaaleghwairyeen/development/App/intaleq_driver/android/app/.cxx/Debug/2j1f5m6a/arm64-v8a" + }, + { + "name" : "intaleq_driver_IS_TOP_LEVEL", + "properties" : + [ + { + "name" : "HELPSTRING", + "value" : "Value Computed by CMake" + } + ], + "type" : "STATIC", + "value" : "ON" + }, + { + "name" : "intaleq_driver_SOURCE_DIR", + "properties" : + [ + { + "name" : "HELPSTRING", + "value" : "Value Computed by CMake" + } + ], + "type" : "STATIC", + "value" : "/Users/hamzaaleghwairyeen/development/App/intaleq_driver/android/app/src/main/cpp" + }, + { + "name" : "log-lib", + "properties" : + [ + { + "name" : "HELPSTRING", + "value" : "Path to a library." + } + ], + "type" : "FILEPATH", + "value" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/lib/aarch64-linux-android/23/liblog.so" + }, + { + "name" : "native-lib_LIB_DEPENDS", + "properties" : + [ + { + "name" : "HELPSTRING", + "value" : "Dependencies for the target" + } + ], + "type" : "STATIC", + "value" : "general;/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/lib/aarch64-linux-android/23/liblog.so;" + } + ], + "kind" : "cache", + "version" : + { + "major" : 2, + "minor" : 0 + } +} diff --git a/siro_driver/android/app/.cxx/Debug/2j1f5m6a/arm64-v8a/.cmake/api/v1/reply/cmakeFiles-v1-964b64bf2c48d4a79ec9.json b/siro_driver/android/app/.cxx/Debug/2j1f5m6a/arm64-v8a/.cmake/api/v1/reply/cmakeFiles-v1-964b64bf2c48d4a79ec9.json new file mode 100644 index 0000000..34a4002 --- /dev/null +++ b/siro_driver/android/app/.cxx/Debug/2j1f5m6a/arm64-v8a/.cmake/api/v1/reply/cmakeFiles-v1-964b64bf2c48d4a79ec9.json @@ -0,0 +1,968 @@ +{ + "inputs" : + [ + { + "path" : "CMakeLists.txt" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeDetermineSystem.cmake" + }, + { + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/build/cmake/android.toolchain.cmake" + }, + { + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/build/cmake/android-legacy.toolchain.cmake" + }, + { + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/build/cmake/abis.cmake" + }, + { + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/build/cmake/platforms.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Platform/Android-Determine.cmake" + }, + { + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/build/cmake/hooks/pre/Android-Determine.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeSystem.cmake.in" + }, + { + "isGenerated" : true, + "path" : "/Users/hamzaaleghwairyeen/development/App/intaleq_driver/android/app/.cxx/Debug/2j1f5m6a/arm64-v8a/CMakeFiles/3.31.5-g6cf5163/CMakeSystem.cmake" + }, + { + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/build/cmake/android.toolchain.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeSystemSpecificInitialize.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Platform/Android-Initialize.cmake" + }, + { + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/build/cmake/hooks/pre/Android-Initialize.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Platform/Linux-Initialize.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeDetermineCCompiler.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeDetermineCompiler.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Platform/Android-Determine-C.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Platform/Android/Determine-Compiler.cmake" + }, + { + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/build/cmake/hooks/pre/Determine-Compiler.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeDetermineCompilerId.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeCompilerIdDetection.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/ADSP-DetermineCompiler.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/ARMCC-DetermineCompiler.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/ARMClang-DetermineCompiler.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/AppleClang-DetermineCompiler.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/Clang-DetermineCompilerInternal.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/Borland-DetermineCompiler.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/Bruce-C-DetermineCompiler.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/Clang-DetermineCompiler.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/Clang-DetermineCompilerInternal.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/Compaq-C-DetermineCompiler.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/Cray-DetermineCompiler.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/CrayClang-DetermineCompiler.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/Embarcadero-DetermineCompiler.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/Fujitsu-DetermineCompiler.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/FujitsuClang-DetermineCompiler.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/GHS-DetermineCompiler.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/GNU-C-DetermineCompiler.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/HP-C-DetermineCompiler.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/IAR-DetermineCompiler.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/IBMClang-C-DetermineCompiler.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/Intel-DetermineCompiler.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/IntelLLVM-DetermineCompiler.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/LCC-C-DetermineCompiler.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/MSVC-DetermineCompiler.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/NVHPC-DetermineCompiler.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/NVIDIA-DetermineCompiler.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/OpenWatcom-DetermineCompiler.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/OrangeC-DetermineCompiler.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/PGI-DetermineCompiler.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/PathScale-DetermineCompiler.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/SCO-DetermineCompiler.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/SDCC-C-DetermineCompiler.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/SunPro-C-DetermineCompiler.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/TI-DetermineCompiler.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/TIClang-DetermineCompiler.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/Tasking-DetermineCompiler.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/TinyCC-C-DetermineCompiler.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/VisualAge-C-DetermineCompiler.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/IBMCPP-C-DetermineVersionInternal.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/Watcom-DetermineCompiler.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/XL-C-DetermineCompiler.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/IBMCPP-C-DetermineVersionInternal.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/XLClang-C-DetermineCompiler.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/zOS-C-DetermineCompiler.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/IBMCPP-C-DetermineVersionInternal.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeFindBinUtils.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/Clang-FindBinUtils.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeCCompiler.cmake.in" + }, + { + "isGenerated" : true, + "path" : "/Users/hamzaaleghwairyeen/development/App/intaleq_driver/android/app/.cxx/Debug/2j1f5m6a/arm64-v8a/CMakeFiles/3.31.5-g6cf5163/CMakeCCompiler.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeDetermineCXXCompiler.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeDetermineCompiler.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Platform/Android-Determine-CXX.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Platform/Android/Determine-Compiler.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeDetermineCompilerId.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeCompilerIdDetection.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/ADSP-DetermineCompiler.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/ARMCC-DetermineCompiler.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/ARMClang-DetermineCompiler.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/AppleClang-DetermineCompiler.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/Clang-DetermineCompilerInternal.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/Borland-DetermineCompiler.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/Clang-DetermineCompiler.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/Clang-DetermineCompilerInternal.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/Compaq-CXX-DetermineCompiler.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/Cray-DetermineCompiler.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/CrayClang-DetermineCompiler.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/Embarcadero-DetermineCompiler.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/Fujitsu-DetermineCompiler.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/FujitsuClang-DetermineCompiler.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/GHS-DetermineCompiler.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/GNU-CXX-DetermineCompiler.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/HP-CXX-DetermineCompiler.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/IAR-DetermineCompiler.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/IBMClang-CXX-DetermineCompiler.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/Intel-DetermineCompiler.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/IntelLLVM-DetermineCompiler.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/LCC-CXX-DetermineCompiler.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/MSVC-DetermineCompiler.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/NVHPC-DetermineCompiler.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/NVIDIA-DetermineCompiler.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/OpenWatcom-DetermineCompiler.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/OrangeC-DetermineCompiler.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/PGI-DetermineCompiler.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/PathScale-DetermineCompiler.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/SCO-DetermineCompiler.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/SunPro-CXX-DetermineCompiler.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/TI-DetermineCompiler.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/TIClang-DetermineCompiler.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/Tasking-DetermineCompiler.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/VisualAge-CXX-DetermineCompiler.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/IBMCPP-CXX-DetermineVersionInternal.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/Watcom-DetermineCompiler.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/XL-CXX-DetermineCompiler.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/IBMCPP-CXX-DetermineVersionInternal.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/XLClang-CXX-DetermineCompiler.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/zOS-CXX-DetermineCompiler.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/IBMCPP-CXX-DetermineVersionInternal.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeFindBinUtils.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/Clang-FindBinUtils.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeCXXCompiler.cmake.in" + }, + { + "isGenerated" : true, + "path" : "/Users/hamzaaleghwairyeen/development/App/intaleq_driver/android/app/.cxx/Debug/2j1f5m6a/arm64-v8a/CMakeFiles/3.31.5-g6cf5163/CMakeCXXCompiler.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeSystemSpecificInformation.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeGenericSystem.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeInitializeConfigs.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Platform/Android.cmake" + }, + { + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/build/cmake/hooks/pre/Android.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Platform/Linux.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Platform/UnixPaths.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeCInformation.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeLanguageInformation.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/Clang-C.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/Clang.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/CMakeCommonCompilerMacros.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/GNU.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/CMakeCommonCompilerMacros.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Platform/Android-Clang-C.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Platform/Android-Clang.cmake" + }, + { + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/build/cmake/hooks/pre/Android-Clang.cmake" + }, + { + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/build/cmake/flags.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeCommonLanguageInclude.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeTestCCompiler.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeTestCompilerCommon.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeDetermineCompilerABI.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Internal/CMakeDetermineLinkerId.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeParseImplicitIncludeInfo.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeParseImplicitLinkInfo.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeParseLibraryArchitecture.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeTestCompilerCommon.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeCCompilerABI.c" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeDetermineCompilerSupport.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Internal/FeatureTesting.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeCCompiler.cmake.in" + }, + { + "isGenerated" : true, + "path" : "/Users/hamzaaleghwairyeen/development/App/intaleq_driver/android/app/.cxx/Debug/2j1f5m6a/arm64-v8a/CMakeFiles/3.31.5-g6cf5163/CMakeCCompiler.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Internal/CMakeCLinkerInformation.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Internal/CMakeCommonLinkerInformation.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Linker/LLD-C.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Linker/LLD.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Linker/GNU.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Platform/Linker/Android-LLD-C.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Platform/Linker/Linux-LLD-C.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Platform/Linker/Linux-LLD.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Platform/Linker/Linux-GNU.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Platform/Linker/GNU.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeCXXInformation.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeLanguageInformation.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/Clang-CXX.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/Clang.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Platform/Android-Clang-CXX.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Platform/Android-Clang.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeCommonLanguageInclude.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeTestCXXCompiler.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeTestCompilerCommon.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeDetermineCompilerABI.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Internal/CMakeDetermineLinkerId.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeParseImplicitIncludeInfo.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeParseImplicitLinkInfo.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeParseLibraryArchitecture.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeTestCompilerCommon.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeCXXCompilerABI.cpp" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeDetermineCompilerSupport.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Internal/FeatureTesting.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/Clang-CXX-CXXImportStd.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/Clang-CXX-CXXImportStd.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeCXXCompiler.cmake.in" + }, + { + "isGenerated" : true, + "path" : "/Users/hamzaaleghwairyeen/development/App/intaleq_driver/android/app/.cxx/Debug/2j1f5m6a/arm64-v8a/CMakeFiles/3.31.5-g6cf5163/CMakeCXXCompiler.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Internal/CMakeCXXLinkerInformation.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Internal/CMakeCommonLinkerInformation.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Linker/LLD-CXX.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Linker/LLD.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Platform/Linker/Android-LLD-CXX.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Platform/Linker/Linux-LLD-CXX.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Platform/Linker/Linux-LLD.cmake" + } + ], + "kind" : "cmakeFiles", + "paths" : + { + "build" : "/Users/hamzaaleghwairyeen/development/App/intaleq_driver/android/app/.cxx/Debug/2j1f5m6a/arm64-v8a", + "source" : "/Users/hamzaaleghwairyeen/development/App/intaleq_driver/android/app/src/main/cpp" + }, + "version" : + { + "major" : 1, + "minor" : 1 + } +} diff --git a/siro_driver/android/app/.cxx/Debug/2j1f5m6a/arm64-v8a/.cmake/api/v1/reply/codemodel-v2-77ef485f784e26f030f3.json b/siro_driver/android/app/.cxx/Debug/2j1f5m6a/arm64-v8a/.cmake/api/v1/reply/codemodel-v2-77ef485f784e26f030f3.json new file mode 100644 index 0000000..3de1e5e --- /dev/null +++ b/siro_driver/android/app/.cxx/Debug/2j1f5m6a/arm64-v8a/.cmake/api/v1/reply/codemodel-v2-77ef485f784e26f030f3.json @@ -0,0 +1,60 @@ +{ + "configurations" : + [ + { + "directories" : + [ + { + "build" : ".", + "jsonFile" : "directory-.-Debug-f5ebdc15457944623624.json", + "minimumCMakeVersion" : + { + "string" : "3.6.0" + }, + "projectIndex" : 0, + "source" : ".", + "targetIndexes" : + [ + 0 + ] + } + ], + "name" : "Debug", + "projects" : + [ + { + "directoryIndexes" : + [ + 0 + ], + "name" : "intaleq_driver", + "targetIndexes" : + [ + 0 + ] + } + ], + "targets" : + [ + { + "directoryIndex" : 0, + "id" : "native-lib::@6890427a1f51a3e7e1df", + "jsonFile" : "target-native-lib-Debug-0d358e35276bd00e9269.json", + "name" : "native-lib", + "projectIndex" : 0 + } + ] + } + ], + "kind" : "codemodel", + "paths" : + { + "build" : "/Users/hamzaaleghwairyeen/development/App/intaleq_driver/android/app/.cxx/Debug/2j1f5m6a/arm64-v8a", + "source" : "/Users/hamzaaleghwairyeen/development/App/intaleq_driver/android/app/src/main/cpp" + }, + "version" : + { + "major" : 2, + "minor" : 7 + } +} diff --git a/siro_driver/android/app/.cxx/Debug/2j1f5m6a/arm64-v8a/.cmake/api/v1/reply/directory-.-Debug-f5ebdc15457944623624.json b/siro_driver/android/app/.cxx/Debug/2j1f5m6a/arm64-v8a/.cmake/api/v1/reply/directory-.-Debug-f5ebdc15457944623624.json new file mode 100644 index 0000000..3a67af9 --- /dev/null +++ b/siro_driver/android/app/.cxx/Debug/2j1f5m6a/arm64-v8a/.cmake/api/v1/reply/directory-.-Debug-f5ebdc15457944623624.json @@ -0,0 +1,14 @@ +{ + "backtraceGraph" : + { + "commands" : [], + "files" : [], + "nodes" : [] + }, + "installers" : [], + "paths" : + { + "build" : ".", + "source" : "." + } +} diff --git a/siro_driver/android/app/.cxx/Debug/2j1f5m6a/arm64-v8a/.cmake/api/v1/reply/index-2025-07-17T21-53-48-0653.json b/siro_driver/android/app/.cxx/Debug/2j1f5m6a/arm64-v8a/.cmake/api/v1/reply/index-2025-07-17T21-53-48-0653.json new file mode 100644 index 0000000..799100b --- /dev/null +++ b/siro_driver/android/app/.cxx/Debug/2j1f5m6a/arm64-v8a/.cmake/api/v1/reply/index-2025-07-17T21-53-48-0653.json @@ -0,0 +1,92 @@ +{ + "cmake" : + { + "generator" : + { + "multiConfig" : false, + "name" : "Ninja" + }, + "paths" : + { + "cmake" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/bin/cmake", + "cpack" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/bin/cpack", + "ctest" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/bin/ctest", + "root" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31" + }, + "version" : + { + "isDirty" : false, + "major" : 3, + "minor" : 31, + "patch" : 5, + "string" : "3.31.5-g6cf5163", + "suffix" : "g6cf5163" + } + }, + "objects" : + [ + { + "jsonFile" : "codemodel-v2-77ef485f784e26f030f3.json", + "kind" : "codemodel", + "version" : + { + "major" : 2, + "minor" : 7 + } + }, + { + "jsonFile" : "cache-v2-f03761f9d1223ce461cd.json", + "kind" : "cache", + "version" : + { + "major" : 2, + "minor" : 0 + } + }, + { + "jsonFile" : "cmakeFiles-v1-964b64bf2c48d4a79ec9.json", + "kind" : "cmakeFiles", + "version" : + { + "major" : 1, + "minor" : 1 + } + } + ], + "reply" : + { + "client-agp" : + { + "cache-v2" : + { + "jsonFile" : "cache-v2-f03761f9d1223ce461cd.json", + "kind" : "cache", + "version" : + { + "major" : 2, + "minor" : 0 + } + }, + "cmakeFiles-v1" : + { + "jsonFile" : "cmakeFiles-v1-964b64bf2c48d4a79ec9.json", + "kind" : "cmakeFiles", + "version" : + { + "major" : 1, + "minor" : 1 + } + }, + "codemodel-v2" : + { + "jsonFile" : "codemodel-v2-77ef485f784e26f030f3.json", + "kind" : "codemodel", + "version" : + { + "major" : 2, + "minor" : 7 + } + } + } + } +} diff --git a/siro_driver/android/app/.cxx/Debug/2j1f5m6a/arm64-v8a/.cmake/api/v1/reply/target-native-lib-Debug-0d358e35276bd00e9269.json b/siro_driver/android/app/.cxx/Debug/2j1f5m6a/arm64-v8a/.cmake/api/v1/reply/target-native-lib-Debug-0d358e35276bd00e9269.json new file mode 100644 index 0000000..27f2d55 --- /dev/null +++ b/siro_driver/android/app/.cxx/Debug/2j1f5m6a/arm64-v8a/.cmake/api/v1/reply/target-native-lib-Debug-0d358e35276bd00e9269.json @@ -0,0 +1,117 @@ +{ + "artifacts" : + [ + { + "path" : "/Users/hamzaaleghwairyeen/development/App/intaleq_driver/build/app/intermediates/cxx/Debug/2j1f5m6a/obj/arm64-v8a/libnative-lib.so" + } + ], + "backtrace" : 1, + "backtraceGraph" : + { + "commands" : + [ + "add_library", + "target_link_libraries" + ], + "files" : + [ + "CMakeLists.txt" + ], + "nodes" : + [ + { + "file" : 0 + }, + { + "command" : 0, + "file" : 0, + "line" : 5, + "parent" : 0 + }, + { + "command" : 1, + "file" : 0, + "line" : 11, + "parent" : 0 + } + ] + }, + "compileGroups" : + [ + { + "compileCommandFragments" : + [ + { + "fragment" : "-g -DANDROID -fdata-sections -ffunction-sections -funwind-tables -fstack-protector-strong -no-canonical-prefixes -D_FORTIFY_SOURCE=2 -Wformat -Werror=format-security -fno-limit-debug-info -fPIC" + } + ], + "defines" : + [ + { + "define" : "native_lib_EXPORTS" + } + ], + "language" : "CXX", + "sourceIndexes" : + [ + 0 + ], + "sysroot" : + { + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot" + } + } + ], + "id" : "native-lib::@6890427a1f51a3e7e1df", + "link" : + { + "commandFragments" : + [ + { + "fragment" : "-static-libstdc++ -Wl,--build-id=sha1 -Wl,--no-rosegment -Wl,--no-undefined-version -Wl,--fatal-warnings -Wl,--no-undefined -Qunused-arguments", + "role" : "flags" + }, + { + "backtrace" : 2, + "fragment" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/lib/aarch64-linux-android/23/liblog.so", + "role" : "libraries" + }, + { + "fragment" : "-latomic -lm", + "role" : "libraries" + } + ], + "language" : "CXX", + "sysroot" : + { + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot" + } + }, + "name" : "native-lib", + "nameOnDisk" : "libnative-lib.so", + "paths" : + { + "build" : ".", + "source" : "." + }, + "sourceGroups" : + [ + { + "name" : "Source Files", + "sourceIndexes" : + [ + 0 + ] + } + ], + "sources" : + [ + { + "backtrace" : 1, + "compileGroupIndex" : 0, + "path" : "native-lib.cpp", + "sourceGroupIndex" : 0 + } + ], + "type" : "SHARED_LIBRARY" +} diff --git a/siro_driver/android/app/.cxx/Debug/2j1f5m6a/arm64-v8a/.ninja_deps b/siro_driver/android/app/.cxx/Debug/2j1f5m6a/arm64-v8a/.ninja_deps new file mode 100644 index 0000000..02d12f5 Binary files /dev/null and b/siro_driver/android/app/.cxx/Debug/2j1f5m6a/arm64-v8a/.ninja_deps differ diff --git a/siro_driver/android/app/.cxx/Debug/2j1f5m6a/arm64-v8a/.ninja_log b/siro_driver/android/app/.cxx/Debug/2j1f5m6a/arm64-v8a/.ninja_log new file mode 100644 index 0000000..3012544 --- /dev/null +++ b/siro_driver/android/app/.cxx/Debug/2j1f5m6a/arm64-v8a/.ninja_log @@ -0,0 +1,3 @@ +# ninja log v5 +0 1769 1752789474857308987 CMakeFiles/native-lib.dir/native-lib.cpp.o e6a1322d9d03dedb +1770 2128 1752789475224273016 /Users/hamzaaleghwairyeen/development/App/intaleq_driver/build/app/intermediates/cxx/Debug/2j1f5m6a/obj/arm64-v8a/libnative-lib.so 40658f8411a137cd diff --git a/siro_driver/android/app/.cxx/Debug/2j1f5m6a/arm64-v8a/CMakeCache.txt b/siro_driver/android/app/.cxx/Debug/2j1f5m6a/arm64-v8a/CMakeCache.txt new file mode 100644 index 0000000..5bb4e53 --- /dev/null +++ b/siro_driver/android/app/.cxx/Debug/2j1f5m6a/arm64-v8a/CMakeCache.txt @@ -0,0 +1,430 @@ +# This is the CMakeCache file. +# For build in directory: /Users/hamzaaleghwairyeen/development/App/intaleq_driver/android/app/.cxx/Debug/2j1f5m6a/arm64-v8a +# It was generated by CMake: /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/bin/cmake +# You can edit this file to change values found and used by cmake. +# If you do not want to change any of the values, simply exit the editor. +# If you do want to change a value, simply edit, save, and exit the editor. +# The syntax for the file is as follows: +# KEY:TYPE=VALUE +# KEY is the name of a variable in the cache. +# TYPE is a hint to GUIs for the type of VALUE, DO NOT EDIT TYPE!. +# VALUE is the current value for the KEY. + +######################## +# EXTERNAL cache entries +######################## + +//No help, variable specified on the command line. +ANDROID_ABI:UNINITIALIZED=arm64-v8a + +//No help, variable specified on the command line. +ANDROID_NDK:UNINITIALIZED=/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973 + +//No help, variable specified on the command line. +ANDROID_PLATFORM:UNINITIALIZED=android-23 + +//Path to a program. +CMAKE_ADDR2LINE:FILEPATH=/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/bin/llvm-addr2line + +//No help, variable specified on the command line. +CMAKE_ANDROID_ARCH_ABI:UNINITIALIZED=arm64-v8a + +//No help, variable specified on the command line. +CMAKE_ANDROID_NDK:UNINITIALIZED=/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973 + +//Archiver +CMAKE_AR:FILEPATH=/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/bin/llvm-ar + +//Flags used by the compiler during all build types. +CMAKE_ASM_FLAGS:STRING= + +//Flags used by the compiler during debug builds. +CMAKE_ASM_FLAGS_DEBUG:STRING= + +//Flags used by the compiler during release builds. +CMAKE_ASM_FLAGS_RELEASE:STRING= + +//Choose the type of build, options are: None Debug Release RelWithDebInfo +// MinSizeRel ... +CMAKE_BUILD_TYPE:STRING=Debug + +//LLVM archiver +CMAKE_CXX_COMPILER_AR:FILEPATH=/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/bin/llvm-ar + +//`clang-scan-deps` dependency scanner +CMAKE_CXX_COMPILER_CLANG_SCAN_DEPS:FILEPATH=/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/bin/clang-scan-deps + +//Generate index for LLVM archive +CMAKE_CXX_COMPILER_RANLIB:FILEPATH=/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/bin/llvm-ranlib + +//Flags used by the compiler during all build types. +CMAKE_CXX_FLAGS:STRING= + +//Flags used by the compiler during debug builds. +CMAKE_CXX_FLAGS_DEBUG:STRING= + +//Flags used by the CXX compiler during MINSIZEREL builds. +CMAKE_CXX_FLAGS_MINSIZEREL:STRING=-Os -DNDEBUG + +//Flags used by the compiler during release builds. +CMAKE_CXX_FLAGS_RELEASE:STRING= + +//Flags used by the CXX compiler during RELWITHDEBINFO builds. +CMAKE_CXX_FLAGS_RELWITHDEBINFO:STRING=-O2 -g -DNDEBUG + +//Libraries linked by default with all C++ applications. +CMAKE_CXX_STANDARD_LIBRARIES:STRING=-latomic -lm + +//LLVM archiver +CMAKE_C_COMPILER_AR:FILEPATH=/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/bin/llvm-ar + +//`clang-scan-deps` dependency scanner +CMAKE_C_COMPILER_CLANG_SCAN_DEPS:FILEPATH=/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/bin/clang-scan-deps + +//Generate index for LLVM archive +CMAKE_C_COMPILER_RANLIB:FILEPATH=/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/bin/llvm-ranlib + +//Flags used by the compiler during all build types. +CMAKE_C_FLAGS:STRING= + +//Flags used by the compiler during debug builds. +CMAKE_C_FLAGS_DEBUG:STRING= + +//Flags used by the C compiler during MINSIZEREL builds. +CMAKE_C_FLAGS_MINSIZEREL:STRING=-Os -DNDEBUG + +//Flags used by the compiler during release builds. +CMAKE_C_FLAGS_RELEASE:STRING= + +//Flags used by the C compiler during RELWITHDEBINFO builds. +CMAKE_C_FLAGS_RELWITHDEBINFO:STRING=-O2 -g -DNDEBUG + +//Libraries linked by default with all C applications. +CMAKE_C_STANDARD_LIBRARIES:STRING=-latomic -lm + +//Path to a program. +CMAKE_DLLTOOL:FILEPATH=/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/bin/llvm-dlltool + +//Flags used by the linker. +CMAKE_EXE_LINKER_FLAGS:STRING= + +//Flags used by the linker during DEBUG builds. +CMAKE_EXE_LINKER_FLAGS_DEBUG:STRING= + +//Flags used by the linker during MINSIZEREL builds. +CMAKE_EXE_LINKER_FLAGS_MINSIZEREL:STRING= + +//Flags used by the linker during RELEASE builds. +CMAKE_EXE_LINKER_FLAGS_RELEASE:STRING= + +//Flags used by the linker during RELWITHDEBINFO builds. +CMAKE_EXE_LINKER_FLAGS_RELWITHDEBINFO:STRING= + +//Enable/Disable output of build database during the build. +CMAKE_EXPORT_BUILD_DATABASE:BOOL= + +//No help, variable specified on the command line. +CMAKE_EXPORT_COMPILE_COMMANDS:UNINITIALIZED=ON + +//Value Computed by CMake. +CMAKE_FIND_PACKAGE_REDIRECTS_DIR:STATIC=/Users/hamzaaleghwairyeen/development/App/intaleq_driver/android/app/.cxx/Debug/2j1f5m6a/arm64-v8a/CMakeFiles/pkgRedirects + +//Install path prefix, prepended onto install directories. +CMAKE_INSTALL_PREFIX:PATH=/usr/local + +//No help, variable specified on the command line. +CMAKE_LIBRARY_OUTPUT_DIRECTORY:UNINITIALIZED=/Users/hamzaaleghwairyeen/development/App/intaleq_driver/build/app/intermediates/cxx/Debug/2j1f5m6a/obj/arm64-v8a + +//Path to a program. +CMAKE_LINKER:FILEPATH=/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/bin/ld.lld + +//No help, variable specified on the command line. +CMAKE_MAKE_PROGRAM:UNINITIALIZED=/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/bin/ninja + +//Flags used by the linker during the creation of modules. +CMAKE_MODULE_LINKER_FLAGS:STRING= + +//Flags used by the linker during the creation of modules during +// DEBUG builds. +CMAKE_MODULE_LINKER_FLAGS_DEBUG:STRING= + +//Flags used by the linker during the creation of modules during +// MINSIZEREL builds. +CMAKE_MODULE_LINKER_FLAGS_MINSIZEREL:STRING= + +//Flags used by the linker during the creation of modules during +// RELEASE builds. +CMAKE_MODULE_LINKER_FLAGS_RELEASE:STRING= + +//Flags used by the linker during the creation of modules during +// RELWITHDEBINFO builds. +CMAKE_MODULE_LINKER_FLAGS_RELWITHDEBINFO:STRING= + +//Path to a program. +CMAKE_NM:FILEPATH=/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/bin/llvm-nm + +//Path to a program. +CMAKE_OBJCOPY:FILEPATH=/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/bin/llvm-objcopy + +//Path to a program. +CMAKE_OBJDUMP:FILEPATH=/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/bin/llvm-objdump + +//Value Computed by CMake +CMAKE_PROJECT_DESCRIPTION:STATIC= + +//Value Computed by CMake +CMAKE_PROJECT_HOMEPAGE_URL:STATIC= + +//Value Computed by CMake +CMAKE_PROJECT_NAME:STATIC=intaleq_driver + +//Ranlib +CMAKE_RANLIB:FILEPATH=/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/bin/llvm-ranlib + +//Path to a program. +CMAKE_READELF:FILEPATH=/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/bin/llvm-readelf + +//No help, variable specified on the command line. +CMAKE_RUNTIME_OUTPUT_DIRECTORY:UNINITIALIZED=/Users/hamzaaleghwairyeen/development/App/intaleq_driver/build/app/intermediates/cxx/Debug/2j1f5m6a/obj/arm64-v8a + +//Flags used by the linker during the creation of dll's. +CMAKE_SHARED_LINKER_FLAGS:STRING= + +//Flags used by the linker during the creation of shared libraries +// during DEBUG builds. +CMAKE_SHARED_LINKER_FLAGS_DEBUG:STRING= + +//Flags used by the linker during the creation of shared libraries +// during MINSIZEREL builds. +CMAKE_SHARED_LINKER_FLAGS_MINSIZEREL:STRING= + +//Flags used by the linker during the creation of shared libraries +// during RELEASE builds. +CMAKE_SHARED_LINKER_FLAGS_RELEASE:STRING= + +//Flags used by the linker during the creation of shared libraries +// during RELWITHDEBINFO builds. +CMAKE_SHARED_LINKER_FLAGS_RELWITHDEBINFO:STRING= + +//If set, runtime paths are not added when installing shared libraries, +// but are added when building. +CMAKE_SKIP_INSTALL_RPATH:BOOL=NO + +//If set, runtime paths are not added when using shared libraries. +CMAKE_SKIP_RPATH:BOOL=NO + +//Flags used by the linker during the creation of static libraries +// during all build types. +CMAKE_STATIC_LINKER_FLAGS:STRING= + +//Flags used by the linker during the creation of static libraries +// during DEBUG builds. +CMAKE_STATIC_LINKER_FLAGS_DEBUG:STRING= + +//Flags used by the linker during the creation of static libraries +// during MINSIZEREL builds. +CMAKE_STATIC_LINKER_FLAGS_MINSIZEREL:STRING= + +//Flags used by the linker during the creation of static libraries +// during RELEASE builds. +CMAKE_STATIC_LINKER_FLAGS_RELEASE:STRING= + +//Flags used by the linker during the creation of static libraries +// during RELWITHDEBINFO builds. +CMAKE_STATIC_LINKER_FLAGS_RELWITHDEBINFO:STRING= + +//Strip +CMAKE_STRIP:FILEPATH=/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/bin/llvm-strip + +//No help, variable specified on the command line. +CMAKE_SYSTEM_NAME:UNINITIALIZED=Android + +//No help, variable specified on the command line. +CMAKE_SYSTEM_VERSION:UNINITIALIZED=23 + +//Path to a program. +CMAKE_TAPI:FILEPATH=CMAKE_TAPI-NOTFOUND + +//The CMake toolchain file +CMAKE_TOOLCHAIN_FILE:FILEPATH=/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/build/cmake/android.toolchain.cmake + +//If this value is on, makefiles will be generated without the +// .SILENT directive, and all commands will be echoed to the console +// during the make. This is useful for debugging only. With Visual +// Studio IDE projects all commands are done without /nologo. +CMAKE_VERBOSE_MAKEFILE:BOOL=FALSE + +//Value Computed by CMake +intaleq_driver_BINARY_DIR:STATIC=/Users/hamzaaleghwairyeen/development/App/intaleq_driver/android/app/.cxx/Debug/2j1f5m6a/arm64-v8a + +//Value Computed by CMake +intaleq_driver_IS_TOP_LEVEL:STATIC=ON + +//Value Computed by CMake +intaleq_driver_SOURCE_DIR:STATIC=/Users/hamzaaleghwairyeen/development/App/intaleq_driver/android/app/src/main/cpp + +//Path to a library. +log-lib:FILEPATH=/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/lib/aarch64-linux-android/23/liblog.so + +//Dependencies for the target +native-lib_LIB_DEPENDS:STATIC=general;/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/lib/aarch64-linux-android/23/liblog.so; + + +######################## +# INTERNAL cache entries +######################## + +//ADVANCED property for variable: CMAKE_ADDR2LINE +CMAKE_ADDR2LINE-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_AR +CMAKE_AR-ADVANCED:INTERNAL=1 +//This is the directory where this CMakeCache.txt was created +CMAKE_CACHEFILE_DIR:INTERNAL=/Users/hamzaaleghwairyeen/development/App/intaleq_driver/android/app/.cxx/Debug/2j1f5m6a/arm64-v8a +//Major version of cmake used to create the current loaded cache +CMAKE_CACHE_MAJOR_VERSION:INTERNAL=3 +//Minor version of cmake used to create the current loaded cache +CMAKE_CACHE_MINOR_VERSION:INTERNAL=31 +//Patch version of cmake used to create the current loaded cache +CMAKE_CACHE_PATCH_VERSION:INTERNAL=5 +//Path to CMake executable. +CMAKE_COMMAND:INTERNAL=/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/bin/cmake +//Path to cpack program executable. +CMAKE_CPACK_COMMAND:INTERNAL=/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/bin/cpack +//Path to ctest program executable. +CMAKE_CTEST_COMMAND:INTERNAL=/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/bin/ctest +//ADVANCED property for variable: CMAKE_CXX_COMPILER_AR +CMAKE_CXX_COMPILER_AR-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_CXX_COMPILER_CLANG_SCAN_DEPS +CMAKE_CXX_COMPILER_CLANG_SCAN_DEPS-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_CXX_COMPILER_RANLIB +CMAKE_CXX_COMPILER_RANLIB-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_CXX_FLAGS +CMAKE_CXX_FLAGS-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_CXX_FLAGS_DEBUG +CMAKE_CXX_FLAGS_DEBUG-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_CXX_FLAGS_MINSIZEREL +CMAKE_CXX_FLAGS_MINSIZEREL-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_CXX_FLAGS_RELEASE +CMAKE_CXX_FLAGS_RELEASE-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_CXX_FLAGS_RELWITHDEBINFO +CMAKE_CXX_FLAGS_RELWITHDEBINFO-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_CXX_STANDARD_LIBRARIES +CMAKE_CXX_STANDARD_LIBRARIES-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_C_COMPILER_AR +CMAKE_C_COMPILER_AR-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_C_COMPILER_CLANG_SCAN_DEPS +CMAKE_C_COMPILER_CLANG_SCAN_DEPS-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_C_COMPILER_RANLIB +CMAKE_C_COMPILER_RANLIB-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_C_FLAGS +CMAKE_C_FLAGS-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_C_FLAGS_DEBUG +CMAKE_C_FLAGS_DEBUG-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_C_FLAGS_MINSIZEREL +CMAKE_C_FLAGS_MINSIZEREL-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_C_FLAGS_RELEASE +CMAKE_C_FLAGS_RELEASE-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_C_FLAGS_RELWITHDEBINFO +CMAKE_C_FLAGS_RELWITHDEBINFO-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_C_STANDARD_LIBRARIES +CMAKE_C_STANDARD_LIBRARIES-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_DLLTOOL +CMAKE_DLLTOOL-ADVANCED:INTERNAL=1 +//Path to cache edit program executable. +CMAKE_EDIT_COMMAND:INTERNAL=/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/bin/ccmake +//Executable file format +CMAKE_EXECUTABLE_FORMAT:INTERNAL=ELF +//ADVANCED property for variable: CMAKE_EXE_LINKER_FLAGS +CMAKE_EXE_LINKER_FLAGS-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_EXE_LINKER_FLAGS_DEBUG +CMAKE_EXE_LINKER_FLAGS_DEBUG-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_EXE_LINKER_FLAGS_MINSIZEREL +CMAKE_EXE_LINKER_FLAGS_MINSIZEREL-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_EXE_LINKER_FLAGS_RELEASE +CMAKE_EXE_LINKER_FLAGS_RELEASE-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_EXE_LINKER_FLAGS_RELWITHDEBINFO +CMAKE_EXE_LINKER_FLAGS_RELWITHDEBINFO-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_EXPORT_BUILD_DATABASE +CMAKE_EXPORT_BUILD_DATABASE-ADVANCED:INTERNAL=1 +//Name of external makefile project generator. +CMAKE_EXTRA_GENERATOR:INTERNAL= +//Name of generator. +CMAKE_GENERATOR:INTERNAL=Ninja +//Generator instance identifier. +CMAKE_GENERATOR_INSTANCE:INTERNAL= +//Name of generator platform. +CMAKE_GENERATOR_PLATFORM:INTERNAL= +//Name of generator toolset. +CMAKE_GENERATOR_TOOLSET:INTERNAL= +//Source directory with the top level CMakeLists.txt file for this +// project +CMAKE_HOME_DIRECTORY:INTERNAL=/Users/hamzaaleghwairyeen/development/App/intaleq_driver/android/app/src/main/cpp +//Install .so files without execute permission. +CMAKE_INSTALL_SO_NO_EXE:INTERNAL=0 +//ADVANCED property for variable: CMAKE_LINKER +CMAKE_LINKER-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_MODULE_LINKER_FLAGS +CMAKE_MODULE_LINKER_FLAGS-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_MODULE_LINKER_FLAGS_DEBUG +CMAKE_MODULE_LINKER_FLAGS_DEBUG-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_MODULE_LINKER_FLAGS_MINSIZEREL +CMAKE_MODULE_LINKER_FLAGS_MINSIZEREL-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_MODULE_LINKER_FLAGS_RELEASE +CMAKE_MODULE_LINKER_FLAGS_RELEASE-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_MODULE_LINKER_FLAGS_RELWITHDEBINFO +CMAKE_MODULE_LINKER_FLAGS_RELWITHDEBINFO-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_NM +CMAKE_NM-ADVANCED:INTERNAL=1 +//number of local generators +CMAKE_NUMBER_OF_MAKEFILES:INTERNAL=1 +//ADVANCED property for variable: CMAKE_OBJCOPY +CMAKE_OBJCOPY-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_OBJDUMP +CMAKE_OBJDUMP-ADVANCED:INTERNAL=1 +//Platform information initialized +CMAKE_PLATFORM_INFO_INITIALIZED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_RANLIB +CMAKE_RANLIB-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_READELF +CMAKE_READELF-ADVANCED:INTERNAL=1 +//Path to CMake installation. +CMAKE_ROOT:INTERNAL=/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31 +//ADVANCED property for variable: CMAKE_SHARED_LINKER_FLAGS +CMAKE_SHARED_LINKER_FLAGS-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_SHARED_LINKER_FLAGS_DEBUG +CMAKE_SHARED_LINKER_FLAGS_DEBUG-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_SHARED_LINKER_FLAGS_MINSIZEREL +CMAKE_SHARED_LINKER_FLAGS_MINSIZEREL-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_SHARED_LINKER_FLAGS_RELEASE +CMAKE_SHARED_LINKER_FLAGS_RELEASE-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_SHARED_LINKER_FLAGS_RELWITHDEBINFO +CMAKE_SHARED_LINKER_FLAGS_RELWITHDEBINFO-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_SKIP_INSTALL_RPATH +CMAKE_SKIP_INSTALL_RPATH-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_SKIP_RPATH +CMAKE_SKIP_RPATH-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_STATIC_LINKER_FLAGS +CMAKE_STATIC_LINKER_FLAGS-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_STATIC_LINKER_FLAGS_DEBUG +CMAKE_STATIC_LINKER_FLAGS_DEBUG-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_STATIC_LINKER_FLAGS_MINSIZEREL +CMAKE_STATIC_LINKER_FLAGS_MINSIZEREL-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_STATIC_LINKER_FLAGS_RELEASE +CMAKE_STATIC_LINKER_FLAGS_RELEASE-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_STATIC_LINKER_FLAGS_RELWITHDEBINFO +CMAKE_STATIC_LINKER_FLAGS_RELWITHDEBINFO-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_STRIP +CMAKE_STRIP-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_TAPI +CMAKE_TAPI-ADVANCED:INTERNAL=1 +//uname command +CMAKE_UNAME:INTERNAL=/usr/bin/uname +//ADVANCED property for variable: CMAKE_VERBOSE_MAKEFILE +CMAKE_VERBOSE_MAKEFILE-ADVANCED:INTERNAL=1 +//linker supports push/pop state +_CMAKE_CXX_LINKER_PUSHPOP_STATE_SUPPORTED:INTERNAL=TRUE +//linker supports push/pop state +_CMAKE_C_LINKER_PUSHPOP_STATE_SUPPORTED:INTERNAL=TRUE +//linker supports push/pop state +_CMAKE_LINKER_PUSHPOP_STATE_SUPPORTED:INTERNAL=TRUE + diff --git a/siro_driver/android/app/.cxx/Debug/2j1f5m6a/arm64-v8a/CMakeFiles/3.31.5-g6cf5163/CMakeCCompiler.cmake b/siro_driver/android/app/.cxx/Debug/2j1f5m6a/arm64-v8a/CMakeFiles/3.31.5-g6cf5163/CMakeCCompiler.cmake new file mode 100644 index 0000000..980aa60 --- /dev/null +++ b/siro_driver/android/app/.cxx/Debug/2j1f5m6a/arm64-v8a/CMakeFiles/3.31.5-g6cf5163/CMakeCCompiler.cmake @@ -0,0 +1,81 @@ +set(CMAKE_C_COMPILER "/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/bin/clang") +set(CMAKE_C_COMPILER_ARG1 "") +set(CMAKE_C_COMPILER_ID "Clang") +set(CMAKE_C_COMPILER_VERSION "18.0.1") +set(CMAKE_C_COMPILER_VERSION_INTERNAL "") +set(CMAKE_C_COMPILER_WRAPPER "") +set(CMAKE_C_STANDARD_COMPUTED_DEFAULT "17") +set(CMAKE_C_EXTENSIONS_COMPUTED_DEFAULT "ON") +set(CMAKE_C_STANDARD_LATEST "23") +set(CMAKE_C_COMPILE_FEATURES "c_std_90;c_function_prototypes;c_std_99;c_restrict;c_variadic_macros;c_std_11;c_static_assert;c_std_17;c_std_23") +set(CMAKE_C90_COMPILE_FEATURES "c_std_90;c_function_prototypes") +set(CMAKE_C99_COMPILE_FEATURES "c_std_99;c_restrict;c_variadic_macros") +set(CMAKE_C11_COMPILE_FEATURES "c_std_11;c_static_assert") +set(CMAKE_C17_COMPILE_FEATURES "c_std_17") +set(CMAKE_C23_COMPILE_FEATURES "c_std_23") + +set(CMAKE_C_PLATFORM_ID "Linux") +set(CMAKE_C_SIMULATE_ID "") +set(CMAKE_C_COMPILER_FRONTEND_VARIANT "GNU") +set(CMAKE_C_SIMULATE_VERSION "") + + + + +set(CMAKE_AR "/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/bin/llvm-ar") +set(CMAKE_C_COMPILER_AR "/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/bin/llvm-ar") +set(CMAKE_RANLIB "/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/bin/llvm-ranlib") +set(CMAKE_C_COMPILER_RANLIB "/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/bin/llvm-ranlib") +set(CMAKE_LINKER "/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/bin/ld.lld") +set(CMAKE_LINKER_LINK "") +set(CMAKE_LINKER_LLD "") +set(CMAKE_C_COMPILER_LINKER "/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/bin/ld.lld") +set(CMAKE_C_COMPILER_LINKER_ID "LLD") +set(CMAKE_C_COMPILER_LINKER_VERSION 18.0.1) +set(CMAKE_C_COMPILER_LINKER_FRONTEND_VARIANT GNU) +set(CMAKE_MT "") +set(CMAKE_TAPI "CMAKE_TAPI-NOTFOUND") +set(CMAKE_COMPILER_IS_GNUCC ) +set(CMAKE_C_COMPILER_LOADED 1) +set(CMAKE_C_COMPILER_WORKS TRUE) +set(CMAKE_C_ABI_COMPILED TRUE) + +set(CMAKE_C_COMPILER_ENV_VAR "CC") + +set(CMAKE_C_COMPILER_ID_RUN 1) +set(CMAKE_C_SOURCE_FILE_EXTENSIONS c;m) +set(CMAKE_C_IGNORE_EXTENSIONS h;H;o;O;obj;OBJ;def;DEF;rc;RC) +set(CMAKE_C_LINKER_PREFERENCE 10) +set(CMAKE_C_LINKER_DEPFILE_SUPPORTED ) + +# Save compiler ABI information. +set(CMAKE_C_SIZEOF_DATA_PTR "8") +set(CMAKE_C_COMPILER_ABI "ELF") +set(CMAKE_C_BYTE_ORDER "LITTLE_ENDIAN") +set(CMAKE_C_LIBRARY_ARCHITECTURE "aarch64-linux-android") + +if(CMAKE_C_SIZEOF_DATA_PTR) + set(CMAKE_SIZEOF_VOID_P "${CMAKE_C_SIZEOF_DATA_PTR}") +endif() + +if(CMAKE_C_COMPILER_ABI) + set(CMAKE_INTERNAL_PLATFORM_ABI "${CMAKE_C_COMPILER_ABI}") +endif() + +if(CMAKE_C_LIBRARY_ARCHITECTURE) + set(CMAKE_LIBRARY_ARCHITECTURE "aarch64-linux-android") +endif() + +set(CMAKE_C_CL_SHOWINCLUDES_PREFIX "") +if(CMAKE_C_CL_SHOWINCLUDES_PREFIX) + set(CMAKE_CL_SHOWINCLUDES_PREFIX "${CMAKE_C_CL_SHOWINCLUDES_PREFIX}") +endif() + + + + + +set(CMAKE_C_IMPLICIT_INCLUDE_DIRECTORIES "/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/lib/clang/18/include;/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/include/aarch64-linux-android;/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/include") +set(CMAKE_C_IMPLICIT_LINK_LIBRARIES "-l:libunwind.a;dl;c;-l:libunwind.a;dl") +set(CMAKE_C_IMPLICIT_LINK_DIRECTORIES "/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/lib/clang/18/lib/linux/aarch64;/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/lib/aarch64-linux-android/23;/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/lib/aarch64-linux-android;/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/lib") +set(CMAKE_C_IMPLICIT_LINK_FRAMEWORK_DIRECTORIES "") diff --git a/siro_driver/android/app/.cxx/Debug/2j1f5m6a/arm64-v8a/CMakeFiles/3.31.5-g6cf5163/CMakeCXXCompiler.cmake b/siro_driver/android/app/.cxx/Debug/2j1f5m6a/arm64-v8a/CMakeFiles/3.31.5-g6cf5163/CMakeCXXCompiler.cmake new file mode 100644 index 0000000..aa4a1e4 --- /dev/null +++ b/siro_driver/android/app/.cxx/Debug/2j1f5m6a/arm64-v8a/CMakeFiles/3.31.5-g6cf5163/CMakeCXXCompiler.cmake @@ -0,0 +1,105 @@ +set(CMAKE_CXX_COMPILER "/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/bin/clang++") +set(CMAKE_CXX_COMPILER_ARG1 "") +set(CMAKE_CXX_COMPILER_ID "Clang") +set(CMAKE_CXX_COMPILER_VERSION "18.0.1") +set(CMAKE_CXX_COMPILER_VERSION_INTERNAL "") +set(CMAKE_CXX_COMPILER_WRAPPER "") +set(CMAKE_CXX_STANDARD_COMPUTED_DEFAULT "17") +set(CMAKE_CXX_EXTENSIONS_COMPUTED_DEFAULT "ON") +set(CMAKE_CXX_STANDARD_LATEST "26") +set(CMAKE_CXX_COMPILE_FEATURES "cxx_std_98;cxx_template_template_parameters;cxx_std_11;cxx_alias_templates;cxx_alignas;cxx_alignof;cxx_attributes;cxx_auto_type;cxx_constexpr;cxx_decltype;cxx_decltype_incomplete_return_types;cxx_default_function_template_args;cxx_defaulted_functions;cxx_defaulted_move_initializers;cxx_delegating_constructors;cxx_deleted_functions;cxx_enum_forward_declarations;cxx_explicit_conversions;cxx_extended_friend_declarations;cxx_extern_templates;cxx_final;cxx_func_identifier;cxx_generalized_initializers;cxx_inheriting_constructors;cxx_inline_namespaces;cxx_lambdas;cxx_local_type_template_args;cxx_long_long_type;cxx_noexcept;cxx_nonstatic_member_init;cxx_nullptr;cxx_override;cxx_range_for;cxx_raw_string_literals;cxx_reference_qualified_functions;cxx_right_angle_brackets;cxx_rvalue_references;cxx_sizeof_member;cxx_static_assert;cxx_strong_enums;cxx_thread_local;cxx_trailing_return_types;cxx_unicode_literals;cxx_uniform_initialization;cxx_unrestricted_unions;cxx_user_literals;cxx_variadic_macros;cxx_variadic_templates;cxx_std_14;cxx_aggregate_default_initializers;cxx_attribute_deprecated;cxx_binary_literals;cxx_contextual_conversions;cxx_decltype_auto;cxx_digit_separators;cxx_generic_lambdas;cxx_lambda_init_captures;cxx_relaxed_constexpr;cxx_return_type_deduction;cxx_variable_templates;cxx_std_17;cxx_std_20;cxx_std_23;cxx_std_26") +set(CMAKE_CXX98_COMPILE_FEATURES "cxx_std_98;cxx_template_template_parameters") +set(CMAKE_CXX11_COMPILE_FEATURES "cxx_std_11;cxx_alias_templates;cxx_alignas;cxx_alignof;cxx_attributes;cxx_auto_type;cxx_constexpr;cxx_decltype;cxx_decltype_incomplete_return_types;cxx_default_function_template_args;cxx_defaulted_functions;cxx_defaulted_move_initializers;cxx_delegating_constructors;cxx_deleted_functions;cxx_enum_forward_declarations;cxx_explicit_conversions;cxx_extended_friend_declarations;cxx_extern_templates;cxx_final;cxx_func_identifier;cxx_generalized_initializers;cxx_inheriting_constructors;cxx_inline_namespaces;cxx_lambdas;cxx_local_type_template_args;cxx_long_long_type;cxx_noexcept;cxx_nonstatic_member_init;cxx_nullptr;cxx_override;cxx_range_for;cxx_raw_string_literals;cxx_reference_qualified_functions;cxx_right_angle_brackets;cxx_rvalue_references;cxx_sizeof_member;cxx_static_assert;cxx_strong_enums;cxx_thread_local;cxx_trailing_return_types;cxx_unicode_literals;cxx_uniform_initialization;cxx_unrestricted_unions;cxx_user_literals;cxx_variadic_macros;cxx_variadic_templates") +set(CMAKE_CXX14_COMPILE_FEATURES "cxx_std_14;cxx_aggregate_default_initializers;cxx_attribute_deprecated;cxx_binary_literals;cxx_contextual_conversions;cxx_decltype_auto;cxx_digit_separators;cxx_generic_lambdas;cxx_lambda_init_captures;cxx_relaxed_constexpr;cxx_return_type_deduction;cxx_variable_templates") +set(CMAKE_CXX17_COMPILE_FEATURES "cxx_std_17") +set(CMAKE_CXX20_COMPILE_FEATURES "cxx_std_20") +set(CMAKE_CXX23_COMPILE_FEATURES "cxx_std_23") +set(CMAKE_CXX26_COMPILE_FEATURES "cxx_std_26") + +set(CMAKE_CXX_PLATFORM_ID "Linux") +set(CMAKE_CXX_SIMULATE_ID "") +set(CMAKE_CXX_COMPILER_FRONTEND_VARIANT "GNU") +set(CMAKE_CXX_SIMULATE_VERSION "") + + + + +set(CMAKE_AR "/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/bin/llvm-ar") +set(CMAKE_CXX_COMPILER_AR "/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/bin/llvm-ar") +set(CMAKE_RANLIB "/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/bin/llvm-ranlib") +set(CMAKE_CXX_COMPILER_RANLIB "/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/bin/llvm-ranlib") +set(CMAKE_LINKER "/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/bin/ld.lld") +set(CMAKE_LINKER_LINK "") +set(CMAKE_LINKER_LLD "") +set(CMAKE_CXX_COMPILER_LINKER "/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/bin/ld.lld") +set(CMAKE_CXX_COMPILER_LINKER_ID "LLD") +set(CMAKE_CXX_COMPILER_LINKER_VERSION 18.0.1) +set(CMAKE_CXX_COMPILER_LINKER_FRONTEND_VARIANT GNU) +set(CMAKE_MT "") +set(CMAKE_TAPI "CMAKE_TAPI-NOTFOUND") +set(CMAKE_COMPILER_IS_GNUCXX ) +set(CMAKE_CXX_COMPILER_LOADED 1) +set(CMAKE_CXX_COMPILER_WORKS TRUE) +set(CMAKE_CXX_ABI_COMPILED TRUE) + +set(CMAKE_CXX_COMPILER_ENV_VAR "CXX") + +set(CMAKE_CXX_COMPILER_ID_RUN 1) +set(CMAKE_CXX_SOURCE_FILE_EXTENSIONS C;M;c++;cc;cpp;cxx;m;mm;mpp;CPP;ixx;cppm;ccm;cxxm;c++m) +set(CMAKE_CXX_IGNORE_EXTENSIONS inl;h;hpp;HPP;H;o;O;obj;OBJ;def;DEF;rc;RC) + +foreach (lang IN ITEMS C OBJC OBJCXX) + if (CMAKE_${lang}_COMPILER_ID_RUN) + foreach(extension IN LISTS CMAKE_${lang}_SOURCE_FILE_EXTENSIONS) + list(REMOVE_ITEM CMAKE_CXX_SOURCE_FILE_EXTENSIONS ${extension}) + endforeach() + endif() +endforeach() + +set(CMAKE_CXX_LINKER_PREFERENCE 30) +set(CMAKE_CXX_LINKER_PREFERENCE_PROPAGATES 1) +set(CMAKE_CXX_LINKER_DEPFILE_SUPPORTED ) + +# Save compiler ABI information. +set(CMAKE_CXX_SIZEOF_DATA_PTR "8") +set(CMAKE_CXX_COMPILER_ABI "ELF") +set(CMAKE_CXX_BYTE_ORDER "LITTLE_ENDIAN") +set(CMAKE_CXX_LIBRARY_ARCHITECTURE "aarch64-linux-android") + +if(CMAKE_CXX_SIZEOF_DATA_PTR) + set(CMAKE_SIZEOF_VOID_P "${CMAKE_CXX_SIZEOF_DATA_PTR}") +endif() + +if(CMAKE_CXX_COMPILER_ABI) + set(CMAKE_INTERNAL_PLATFORM_ABI "${CMAKE_CXX_COMPILER_ABI}") +endif() + +if(CMAKE_CXX_LIBRARY_ARCHITECTURE) + set(CMAKE_LIBRARY_ARCHITECTURE "aarch64-linux-android") +endif() + +set(CMAKE_CXX_CL_SHOWINCLUDES_PREFIX "") +if(CMAKE_CXX_CL_SHOWINCLUDES_PREFIX) + set(CMAKE_CL_SHOWINCLUDES_PREFIX "${CMAKE_CXX_CL_SHOWINCLUDES_PREFIX}") +endif() + + + + + +set(CMAKE_CXX_IMPLICIT_INCLUDE_DIRECTORIES "/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/include/c++/v1;/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/lib/clang/18/include;/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/include/aarch64-linux-android;/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/include") +set(CMAKE_CXX_IMPLICIT_LINK_LIBRARIES "c++;m;-l:libunwind.a;dl;c;-l:libunwind.a;dl") +set(CMAKE_CXX_IMPLICIT_LINK_DIRECTORIES "/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/lib/clang/18/lib/linux/aarch64;/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/lib/aarch64-linux-android/23;/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/lib/aarch64-linux-android;/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/lib") +set(CMAKE_CXX_IMPLICIT_LINK_FRAMEWORK_DIRECTORIES "") +set(CMAKE_CXX_COMPILER_CLANG_RESOURCE_DIR "/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/lib/clang/18") + +set(CMAKE_CXX_COMPILER_IMPORT_STD "") +### Imported target for C++23 standard library +set(CMAKE_CXX23_COMPILER_IMPORT_STD_NOT_FOUND_MESSAGE "Experimental `import std` support not enabled when detecting toolchain; it must be set before `CXX` is enabled (usually a `project()` call)") + + +### Imported target for C++26 standard library +set(CMAKE_CXX26_COMPILER_IMPORT_STD_NOT_FOUND_MESSAGE "Experimental `import std` support not enabled when detecting toolchain; it must be set before `CXX` is enabled (usually a `project()` call)") + + + diff --git a/siro_driver/android/app/.cxx/Debug/2j1f5m6a/arm64-v8a/CMakeFiles/3.31.5-g6cf5163/CMakeDetermineCompilerABI_C.bin b/siro_driver/android/app/.cxx/Debug/2j1f5m6a/arm64-v8a/CMakeFiles/3.31.5-g6cf5163/CMakeDetermineCompilerABI_C.bin new file mode 100755 index 0000000..f83f828 Binary files /dev/null and b/siro_driver/android/app/.cxx/Debug/2j1f5m6a/arm64-v8a/CMakeFiles/3.31.5-g6cf5163/CMakeDetermineCompilerABI_C.bin differ diff --git a/siro_driver/android/app/.cxx/Debug/2j1f5m6a/arm64-v8a/CMakeFiles/3.31.5-g6cf5163/CMakeDetermineCompilerABI_CXX.bin b/siro_driver/android/app/.cxx/Debug/2j1f5m6a/arm64-v8a/CMakeFiles/3.31.5-g6cf5163/CMakeDetermineCompilerABI_CXX.bin new file mode 100755 index 0000000..1787b27 Binary files /dev/null and b/siro_driver/android/app/.cxx/Debug/2j1f5m6a/arm64-v8a/CMakeFiles/3.31.5-g6cf5163/CMakeDetermineCompilerABI_CXX.bin differ diff --git a/siro_driver/android/app/.cxx/Debug/2j1f5m6a/arm64-v8a/CMakeFiles/3.31.5-g6cf5163/CMakeSystem.cmake b/siro_driver/android/app/.cxx/Debug/2j1f5m6a/arm64-v8a/CMakeFiles/3.31.5-g6cf5163/CMakeSystem.cmake new file mode 100644 index 0000000..3a104b8 --- /dev/null +++ b/siro_driver/android/app/.cxx/Debug/2j1f5m6a/arm64-v8a/CMakeFiles/3.31.5-g6cf5163/CMakeSystem.cmake @@ -0,0 +1,15 @@ +set(CMAKE_HOST_SYSTEM "Darwin-24.5.0") +set(CMAKE_HOST_SYSTEM_NAME "Darwin") +set(CMAKE_HOST_SYSTEM_VERSION "24.5.0") +set(CMAKE_HOST_SYSTEM_PROCESSOR "arm64") + +include("/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/build/cmake/android.toolchain.cmake") + +set(CMAKE_SYSTEM "Android-1") +set(CMAKE_SYSTEM_NAME "Android") +set(CMAKE_SYSTEM_VERSION "1") +set(CMAKE_SYSTEM_PROCESSOR "aarch64") + +set(CMAKE_CROSSCOMPILING "TRUE") + +set(CMAKE_SYSTEM_LOADED 1) diff --git a/siro_driver/android/app/.cxx/Debug/2j1f5m6a/arm64-v8a/CMakeFiles/3.31.5-g6cf5163/CompilerIdC/CMakeCCompilerId.c b/siro_driver/android/app/.cxx/Debug/2j1f5m6a/arm64-v8a/CMakeFiles/3.31.5-g6cf5163/CompilerIdC/CMakeCCompilerId.c new file mode 100644 index 0000000..8d8bb03 --- /dev/null +++ b/siro_driver/android/app/.cxx/Debug/2j1f5m6a/arm64-v8a/CMakeFiles/3.31.5-g6cf5163/CompilerIdC/CMakeCCompilerId.c @@ -0,0 +1,904 @@ +#ifdef __cplusplus +# error "A C++ compiler has been selected for C." +#endif + +#if defined(__18CXX) +# define ID_VOID_MAIN +#endif +#if defined(__CLASSIC_C__) +/* cv-qualifiers did not exist in K&R C */ +# define const +# define volatile +#endif + +#if !defined(__has_include) +/* If the compiler does not have __has_include, pretend the answer is + always no. */ +# define __has_include(x) 0 +#endif + + +/* Version number components: V=Version, R=Revision, P=Patch + Version date components: YYYY=Year, MM=Month, DD=Day */ + +#if defined(__INTEL_COMPILER) || defined(__ICC) +# define COMPILER_ID "Intel" +# if defined(_MSC_VER) +# define SIMULATE_ID "MSVC" +# endif +# if defined(__GNUC__) +# define SIMULATE_ID "GNU" +# endif + /* __INTEL_COMPILER = VRP prior to 2021, and then VVVV for 2021 and later, + except that a few beta releases use the old format with V=2021. */ +# if __INTEL_COMPILER < 2021 || __INTEL_COMPILER == 202110 || __INTEL_COMPILER == 202111 +# define COMPILER_VERSION_MAJOR DEC(__INTEL_COMPILER/100) +# define COMPILER_VERSION_MINOR DEC(__INTEL_COMPILER/10 % 10) +# if defined(__INTEL_COMPILER_UPDATE) +# define COMPILER_VERSION_PATCH DEC(__INTEL_COMPILER_UPDATE) +# else +# define COMPILER_VERSION_PATCH DEC(__INTEL_COMPILER % 10) +# endif +# else +# define COMPILER_VERSION_MAJOR DEC(__INTEL_COMPILER) +# define COMPILER_VERSION_MINOR DEC(__INTEL_COMPILER_UPDATE) + /* The third version component from --version is an update index, + but no macro is provided for it. */ +# define COMPILER_VERSION_PATCH DEC(0) +# endif +# if defined(__INTEL_COMPILER_BUILD_DATE) + /* __INTEL_COMPILER_BUILD_DATE = YYYYMMDD */ +# define COMPILER_VERSION_TWEAK DEC(__INTEL_COMPILER_BUILD_DATE) +# endif +# if defined(_MSC_VER) + /* _MSC_VER = VVRR */ +# define SIMULATE_VERSION_MAJOR DEC(_MSC_VER / 100) +# define SIMULATE_VERSION_MINOR DEC(_MSC_VER % 100) +# endif +# if defined(__GNUC__) +# define SIMULATE_VERSION_MAJOR DEC(__GNUC__) +# elif defined(__GNUG__) +# define SIMULATE_VERSION_MAJOR DEC(__GNUG__) +# endif +# if defined(__GNUC_MINOR__) +# define SIMULATE_VERSION_MINOR DEC(__GNUC_MINOR__) +# endif +# if defined(__GNUC_PATCHLEVEL__) +# define SIMULATE_VERSION_PATCH DEC(__GNUC_PATCHLEVEL__) +# endif + +#elif (defined(__clang__) && defined(__INTEL_CLANG_COMPILER)) || defined(__INTEL_LLVM_COMPILER) +# define COMPILER_ID "IntelLLVM" +#if defined(_MSC_VER) +# define SIMULATE_ID "MSVC" +#endif +#if defined(__GNUC__) +# define SIMULATE_ID "GNU" +#endif +/* __INTEL_LLVM_COMPILER = VVVVRP prior to 2021.2.0, VVVVRRPP for 2021.2.0 and + * later. Look for 6 digit vs. 8 digit version number to decide encoding. + * VVVV is no smaller than the current year when a version is released. + */ +#if __INTEL_LLVM_COMPILER < 1000000L +# define COMPILER_VERSION_MAJOR DEC(__INTEL_LLVM_COMPILER/100) +# define COMPILER_VERSION_MINOR DEC(__INTEL_LLVM_COMPILER/10 % 10) +# define COMPILER_VERSION_PATCH DEC(__INTEL_LLVM_COMPILER % 10) +#else +# define COMPILER_VERSION_MAJOR DEC(__INTEL_LLVM_COMPILER/10000) +# define COMPILER_VERSION_MINOR DEC(__INTEL_LLVM_COMPILER/100 % 100) +# define COMPILER_VERSION_PATCH DEC(__INTEL_LLVM_COMPILER % 100) +#endif +#if defined(_MSC_VER) + /* _MSC_VER = VVRR */ +# define SIMULATE_VERSION_MAJOR DEC(_MSC_VER / 100) +# define SIMULATE_VERSION_MINOR DEC(_MSC_VER % 100) +#endif +#if defined(__GNUC__) +# define SIMULATE_VERSION_MAJOR DEC(__GNUC__) +#elif defined(__GNUG__) +# define SIMULATE_VERSION_MAJOR DEC(__GNUG__) +#endif +#if defined(__GNUC_MINOR__) +# define SIMULATE_VERSION_MINOR DEC(__GNUC_MINOR__) +#endif +#if defined(__GNUC_PATCHLEVEL__) +# define SIMULATE_VERSION_PATCH DEC(__GNUC_PATCHLEVEL__) +#endif + +#elif defined(__PATHCC__) +# define COMPILER_ID "PathScale" +# define COMPILER_VERSION_MAJOR DEC(__PATHCC__) +# define COMPILER_VERSION_MINOR DEC(__PATHCC_MINOR__) +# if defined(__PATHCC_PATCHLEVEL__) +# define COMPILER_VERSION_PATCH DEC(__PATHCC_PATCHLEVEL__) +# endif + +#elif defined(__BORLANDC__) && defined(__CODEGEARC_VERSION__) +# define COMPILER_ID "Embarcadero" +# define COMPILER_VERSION_MAJOR HEX(__CODEGEARC_VERSION__>>24 & 0x00FF) +# define COMPILER_VERSION_MINOR HEX(__CODEGEARC_VERSION__>>16 & 0x00FF) +# define COMPILER_VERSION_PATCH DEC(__CODEGEARC_VERSION__ & 0xFFFF) + +#elif defined(__BORLANDC__) +# define COMPILER_ID "Borland" + /* __BORLANDC__ = 0xVRR */ +# define COMPILER_VERSION_MAJOR HEX(__BORLANDC__>>8) +# define COMPILER_VERSION_MINOR HEX(__BORLANDC__ & 0xFF) + +#elif defined(__WATCOMC__) && __WATCOMC__ < 1200 +# define COMPILER_ID "Watcom" + /* __WATCOMC__ = VVRR */ +# define COMPILER_VERSION_MAJOR DEC(__WATCOMC__ / 100) +# define COMPILER_VERSION_MINOR DEC((__WATCOMC__ / 10) % 10) +# if (__WATCOMC__ % 10) > 0 +# define COMPILER_VERSION_PATCH DEC(__WATCOMC__ % 10) +# endif + +#elif defined(__WATCOMC__) +# define COMPILER_ID "OpenWatcom" + /* __WATCOMC__ = VVRP + 1100 */ +# define COMPILER_VERSION_MAJOR DEC((__WATCOMC__ - 1100) / 100) +# define COMPILER_VERSION_MINOR DEC((__WATCOMC__ / 10) % 10) +# if (__WATCOMC__ % 10) > 0 +# define COMPILER_VERSION_PATCH DEC(__WATCOMC__ % 10) +# endif + +#elif defined(__SUNPRO_C) +# define COMPILER_ID "SunPro" +# if __SUNPRO_C >= 0x5100 + /* __SUNPRO_C = 0xVRRP */ +# define COMPILER_VERSION_MAJOR HEX(__SUNPRO_C>>12) +# define COMPILER_VERSION_MINOR HEX(__SUNPRO_C>>4 & 0xFF) +# define COMPILER_VERSION_PATCH HEX(__SUNPRO_C & 0xF) +# else + /* __SUNPRO_CC = 0xVRP */ +# define COMPILER_VERSION_MAJOR HEX(__SUNPRO_C>>8) +# define COMPILER_VERSION_MINOR HEX(__SUNPRO_C>>4 & 0xF) +# define COMPILER_VERSION_PATCH HEX(__SUNPRO_C & 0xF) +# endif + +#elif defined(__HP_cc) +# define COMPILER_ID "HP" + /* __HP_cc = VVRRPP */ +# define COMPILER_VERSION_MAJOR DEC(__HP_cc/10000) +# define COMPILER_VERSION_MINOR DEC(__HP_cc/100 % 100) +# define COMPILER_VERSION_PATCH DEC(__HP_cc % 100) + +#elif defined(__DECC) +# define COMPILER_ID "Compaq" + /* __DECC_VER = VVRRTPPPP */ +# define COMPILER_VERSION_MAJOR DEC(__DECC_VER/10000000) +# define COMPILER_VERSION_MINOR DEC(__DECC_VER/100000 % 100) +# define COMPILER_VERSION_PATCH DEC(__DECC_VER % 10000) + +#elif defined(__IBMC__) && defined(__COMPILER_VER__) +# define COMPILER_ID "zOS" + /* __IBMC__ = VRP */ +# define COMPILER_VERSION_MAJOR DEC(__IBMC__/100) +# define COMPILER_VERSION_MINOR DEC(__IBMC__/10 % 10) +# define COMPILER_VERSION_PATCH DEC(__IBMC__ % 10) + +#elif defined(__open_xl__) && defined(__clang__) +# define COMPILER_ID "IBMClang" +# define COMPILER_VERSION_MAJOR DEC(__open_xl_version__) +# define COMPILER_VERSION_MINOR DEC(__open_xl_release__) +# define COMPILER_VERSION_PATCH DEC(__open_xl_modification__) +# define COMPILER_VERSION_TWEAK DEC(__open_xl_ptf_fix_level__) + + +#elif defined(__ibmxl__) && defined(__clang__) +# define COMPILER_ID "XLClang" +# define COMPILER_VERSION_MAJOR DEC(__ibmxl_version__) +# define COMPILER_VERSION_MINOR DEC(__ibmxl_release__) +# define COMPILER_VERSION_PATCH DEC(__ibmxl_modification__) +# define COMPILER_VERSION_TWEAK DEC(__ibmxl_ptf_fix_level__) + + +#elif defined(__IBMC__) && !defined(__COMPILER_VER__) && __IBMC__ >= 800 +# define COMPILER_ID "XL" + /* __IBMC__ = VRP */ +# define COMPILER_VERSION_MAJOR DEC(__IBMC__/100) +# define COMPILER_VERSION_MINOR DEC(__IBMC__/10 % 10) +# define COMPILER_VERSION_PATCH DEC(__IBMC__ % 10) + +#elif defined(__IBMC__) && !defined(__COMPILER_VER__) && __IBMC__ < 800 +# define COMPILER_ID "VisualAge" + /* __IBMC__ = VRP */ +# define COMPILER_VERSION_MAJOR DEC(__IBMC__/100) +# define COMPILER_VERSION_MINOR DEC(__IBMC__/10 % 10) +# define COMPILER_VERSION_PATCH DEC(__IBMC__ % 10) + +#elif defined(__NVCOMPILER) +# define COMPILER_ID "NVHPC" +# define COMPILER_VERSION_MAJOR DEC(__NVCOMPILER_MAJOR__) +# define COMPILER_VERSION_MINOR DEC(__NVCOMPILER_MINOR__) +# if defined(__NVCOMPILER_PATCHLEVEL__) +# define COMPILER_VERSION_PATCH DEC(__NVCOMPILER_PATCHLEVEL__) +# endif + +#elif defined(__PGI) +# define COMPILER_ID "PGI" +# define COMPILER_VERSION_MAJOR DEC(__PGIC__) +# define COMPILER_VERSION_MINOR DEC(__PGIC_MINOR__) +# if defined(__PGIC_PATCHLEVEL__) +# define COMPILER_VERSION_PATCH DEC(__PGIC_PATCHLEVEL__) +# endif + +#elif defined(__clang__) && defined(__cray__) +# define COMPILER_ID "CrayClang" +# define COMPILER_VERSION_MAJOR DEC(__cray_major__) +# define COMPILER_VERSION_MINOR DEC(__cray_minor__) +# define COMPILER_VERSION_PATCH DEC(__cray_patchlevel__) +# define COMPILER_VERSION_INTERNAL_STR __clang_version__ + + +#elif defined(_CRAYC) +# define COMPILER_ID "Cray" +# define COMPILER_VERSION_MAJOR DEC(_RELEASE_MAJOR) +# define COMPILER_VERSION_MINOR DEC(_RELEASE_MINOR) + +#elif defined(__TI_COMPILER_VERSION__) +# define COMPILER_ID "TI" + /* __TI_COMPILER_VERSION__ = VVVRRRPPP */ +# define COMPILER_VERSION_MAJOR DEC(__TI_COMPILER_VERSION__/1000000) +# define COMPILER_VERSION_MINOR DEC(__TI_COMPILER_VERSION__/1000 % 1000) +# define COMPILER_VERSION_PATCH DEC(__TI_COMPILER_VERSION__ % 1000) + +#elif defined(__CLANG_FUJITSU) +# define COMPILER_ID "FujitsuClang" +# define COMPILER_VERSION_MAJOR DEC(__FCC_major__) +# define COMPILER_VERSION_MINOR DEC(__FCC_minor__) +# define COMPILER_VERSION_PATCH DEC(__FCC_patchlevel__) +# define COMPILER_VERSION_INTERNAL_STR __clang_version__ + + +#elif defined(__FUJITSU) +# define COMPILER_ID "Fujitsu" +# if defined(__FCC_version__) +# define COMPILER_VERSION __FCC_version__ +# elif defined(__FCC_major__) +# define COMPILER_VERSION_MAJOR DEC(__FCC_major__) +# define COMPILER_VERSION_MINOR DEC(__FCC_minor__) +# define COMPILER_VERSION_PATCH DEC(__FCC_patchlevel__) +# endif +# if defined(__fcc_version) +# define COMPILER_VERSION_INTERNAL DEC(__fcc_version) +# elif defined(__FCC_VERSION) +# define COMPILER_VERSION_INTERNAL DEC(__FCC_VERSION) +# endif + + +#elif defined(__ghs__) +# define COMPILER_ID "GHS" +/* __GHS_VERSION_NUMBER = VVVVRP */ +# ifdef __GHS_VERSION_NUMBER +# define COMPILER_VERSION_MAJOR DEC(__GHS_VERSION_NUMBER / 100) +# define COMPILER_VERSION_MINOR DEC(__GHS_VERSION_NUMBER / 10 % 10) +# define COMPILER_VERSION_PATCH DEC(__GHS_VERSION_NUMBER % 10) +# endif + +#elif defined(__TASKING__) +# define COMPILER_ID "Tasking" + # define COMPILER_VERSION_MAJOR DEC(__VERSION__/1000) + # define COMPILER_VERSION_MINOR DEC(__VERSION__ % 100) +# define COMPILER_VERSION_INTERNAL DEC(__VERSION__) + +#elif defined(__ORANGEC__) +# define COMPILER_ID "OrangeC" +# define COMPILER_VERSION_MAJOR DEC(__ORANGEC_MAJOR__) +# define COMPILER_VERSION_MINOR DEC(__ORANGEC_MINOR__) +# define COMPILER_VERSION_PATCH DEC(__ORANGEC_PATCHLEVEL__) + +#elif defined(__TINYC__) +# define COMPILER_ID "TinyCC" + +#elif defined(__BCC__) +# define COMPILER_ID "Bruce" + +#elif defined(__SCO_VERSION__) +# define COMPILER_ID "SCO" + +#elif defined(__ARMCC_VERSION) && !defined(__clang__) +# define COMPILER_ID "ARMCC" +#if __ARMCC_VERSION >= 1000000 + /* __ARMCC_VERSION = VRRPPPP */ + # define COMPILER_VERSION_MAJOR DEC(__ARMCC_VERSION/1000000) + # define COMPILER_VERSION_MINOR DEC(__ARMCC_VERSION/10000 % 100) + # define COMPILER_VERSION_PATCH DEC(__ARMCC_VERSION % 10000) +#else + /* __ARMCC_VERSION = VRPPPP */ + # define COMPILER_VERSION_MAJOR DEC(__ARMCC_VERSION/100000) + # define COMPILER_VERSION_MINOR DEC(__ARMCC_VERSION/10000 % 10) + # define COMPILER_VERSION_PATCH DEC(__ARMCC_VERSION % 10000) +#endif + + +#elif defined(__clang__) && defined(__apple_build_version__) +# define COMPILER_ID "AppleClang" +# if defined(_MSC_VER) +# define SIMULATE_ID "MSVC" +# endif +# define COMPILER_VERSION_MAJOR DEC(__clang_major__) +# define COMPILER_VERSION_MINOR DEC(__clang_minor__) +# define COMPILER_VERSION_PATCH DEC(__clang_patchlevel__) +# if defined(_MSC_VER) + /* _MSC_VER = VVRR */ +# define SIMULATE_VERSION_MAJOR DEC(_MSC_VER / 100) +# define SIMULATE_VERSION_MINOR DEC(_MSC_VER % 100) +# endif +# define COMPILER_VERSION_TWEAK DEC(__apple_build_version__) + +#elif defined(__clang__) && defined(__ARMCOMPILER_VERSION) +# define COMPILER_ID "ARMClang" + # define COMPILER_VERSION_MAJOR DEC(__ARMCOMPILER_VERSION/1000000) + # define COMPILER_VERSION_MINOR DEC(__ARMCOMPILER_VERSION/10000 % 100) + # define COMPILER_VERSION_PATCH DEC(__ARMCOMPILER_VERSION/100 % 100) +# define COMPILER_VERSION_INTERNAL DEC(__ARMCOMPILER_VERSION) + +#elif defined(__clang__) && defined(__ti__) +# define COMPILER_ID "TIClang" + # define COMPILER_VERSION_MAJOR DEC(__ti_major__) + # define COMPILER_VERSION_MINOR DEC(__ti_minor__) + # define COMPILER_VERSION_PATCH DEC(__ti_patchlevel__) +# define COMPILER_VERSION_INTERNAL DEC(__ti_version__) + +#elif defined(__clang__) +# define COMPILER_ID "Clang" +# if defined(_MSC_VER) +# define SIMULATE_ID "MSVC" +# endif +# define COMPILER_VERSION_MAJOR DEC(__clang_major__) +# define COMPILER_VERSION_MINOR DEC(__clang_minor__) +# define COMPILER_VERSION_PATCH DEC(__clang_patchlevel__) +# if defined(_MSC_VER) + /* _MSC_VER = VVRR */ +# define SIMULATE_VERSION_MAJOR DEC(_MSC_VER / 100) +# define SIMULATE_VERSION_MINOR DEC(_MSC_VER % 100) +# endif + +#elif defined(__LCC__) && (defined(__GNUC__) || defined(__GNUG__) || defined(__MCST__)) +# define COMPILER_ID "LCC" +# define COMPILER_VERSION_MAJOR DEC(__LCC__ / 100) +# define COMPILER_VERSION_MINOR DEC(__LCC__ % 100) +# if defined(__LCC_MINOR__) +# define COMPILER_VERSION_PATCH DEC(__LCC_MINOR__) +# endif +# if defined(__GNUC__) && defined(__GNUC_MINOR__) +# define SIMULATE_ID "GNU" +# define SIMULATE_VERSION_MAJOR DEC(__GNUC__) +# define SIMULATE_VERSION_MINOR DEC(__GNUC_MINOR__) +# if defined(__GNUC_PATCHLEVEL__) +# define SIMULATE_VERSION_PATCH DEC(__GNUC_PATCHLEVEL__) +# endif +# endif + +#elif defined(__GNUC__) +# define COMPILER_ID "GNU" +# define COMPILER_VERSION_MAJOR DEC(__GNUC__) +# if defined(__GNUC_MINOR__) +# define COMPILER_VERSION_MINOR DEC(__GNUC_MINOR__) +# endif +# if defined(__GNUC_PATCHLEVEL__) +# define COMPILER_VERSION_PATCH DEC(__GNUC_PATCHLEVEL__) +# endif + +#elif defined(_MSC_VER) +# define COMPILER_ID "MSVC" + /* _MSC_VER = VVRR */ +# define COMPILER_VERSION_MAJOR DEC(_MSC_VER / 100) +# define COMPILER_VERSION_MINOR DEC(_MSC_VER % 100) +# if defined(_MSC_FULL_VER) +# if _MSC_VER >= 1400 + /* _MSC_FULL_VER = VVRRPPPPP */ +# define COMPILER_VERSION_PATCH DEC(_MSC_FULL_VER % 100000) +# else + /* _MSC_FULL_VER = VVRRPPPP */ +# define COMPILER_VERSION_PATCH DEC(_MSC_FULL_VER % 10000) +# endif +# endif +# if defined(_MSC_BUILD) +# define COMPILER_VERSION_TWEAK DEC(_MSC_BUILD) +# endif + +#elif defined(_ADI_COMPILER) +# define COMPILER_ID "ADSP" +#if defined(__VERSIONNUM__) + /* __VERSIONNUM__ = 0xVVRRPPTT */ +# define COMPILER_VERSION_MAJOR DEC(__VERSIONNUM__ >> 24 & 0xFF) +# define COMPILER_VERSION_MINOR DEC(__VERSIONNUM__ >> 16 & 0xFF) +# define COMPILER_VERSION_PATCH DEC(__VERSIONNUM__ >> 8 & 0xFF) +# define COMPILER_VERSION_TWEAK DEC(__VERSIONNUM__ & 0xFF) +#endif + +#elif defined(__IAR_SYSTEMS_ICC__) || defined(__IAR_SYSTEMS_ICC) +# define COMPILER_ID "IAR" +# if defined(__VER__) && defined(__ICCARM__) +# define COMPILER_VERSION_MAJOR DEC((__VER__) / 1000000) +# define COMPILER_VERSION_MINOR DEC(((__VER__) / 1000) % 1000) +# define COMPILER_VERSION_PATCH DEC((__VER__) % 1000) +# define COMPILER_VERSION_INTERNAL DEC(__IAR_SYSTEMS_ICC__) +# elif defined(__VER__) && (defined(__ICCAVR__) || defined(__ICCRX__) || defined(__ICCRH850__) || defined(__ICCRL78__) || defined(__ICC430__) || defined(__ICCRISCV__) || defined(__ICCV850__) || defined(__ICC8051__) || defined(__ICCSTM8__)) +# define COMPILER_VERSION_MAJOR DEC((__VER__) / 100) +# define COMPILER_VERSION_MINOR DEC((__VER__) - (((__VER__) / 100)*100)) +# define COMPILER_VERSION_PATCH DEC(__SUBVERSION__) +# define COMPILER_VERSION_INTERNAL DEC(__IAR_SYSTEMS_ICC__) +# endif + +#elif defined(__SDCC_VERSION_MAJOR) || defined(SDCC) +# define COMPILER_ID "SDCC" +# if defined(__SDCC_VERSION_MAJOR) +# define COMPILER_VERSION_MAJOR DEC(__SDCC_VERSION_MAJOR) +# define COMPILER_VERSION_MINOR DEC(__SDCC_VERSION_MINOR) +# define COMPILER_VERSION_PATCH DEC(__SDCC_VERSION_PATCH) +# else + /* SDCC = VRP */ +# define COMPILER_VERSION_MAJOR DEC(SDCC/100) +# define COMPILER_VERSION_MINOR DEC(SDCC/10 % 10) +# define COMPILER_VERSION_PATCH DEC(SDCC % 10) +# endif + + +/* These compilers are either not known or too old to define an + identification macro. Try to identify the platform and guess that + it is the native compiler. */ +#elif defined(__hpux) || defined(__hpua) +# define COMPILER_ID "HP" + +#else /* unknown compiler */ +# define COMPILER_ID "" +#endif + +/* Construct the string literal in pieces to prevent the source from + getting matched. Store it in a pointer rather than an array + because some compilers will just produce instructions to fill the + array rather than assigning a pointer to a static array. */ +char const* info_compiler = "INFO" ":" "compiler[" COMPILER_ID "]"; +#ifdef SIMULATE_ID +char const* info_simulate = "INFO" ":" "simulate[" SIMULATE_ID "]"; +#endif + +#ifdef __QNXNTO__ +char const* qnxnto = "INFO" ":" "qnxnto[]"; +#endif + +#if defined(__CRAYXT_COMPUTE_LINUX_TARGET) +char const *info_cray = "INFO" ":" "compiler_wrapper[CrayPrgEnv]"; +#endif + +#define STRINGIFY_HELPER(X) #X +#define STRINGIFY(X) STRINGIFY_HELPER(X) + +/* Identify known platforms by name. */ +#if defined(__linux) || defined(__linux__) || defined(linux) +# define PLATFORM_ID "Linux" + +#elif defined(__MSYS__) +# define PLATFORM_ID "MSYS" + +#elif defined(__CYGWIN__) +# define PLATFORM_ID "Cygwin" + +#elif defined(__MINGW32__) +# define PLATFORM_ID "MinGW" + +#elif defined(__APPLE__) +# define PLATFORM_ID "Darwin" + +#elif defined(_WIN32) || defined(__WIN32__) || defined(WIN32) +# define PLATFORM_ID "Windows" + +#elif defined(__FreeBSD__) || defined(__FreeBSD) +# define PLATFORM_ID "FreeBSD" + +#elif defined(__NetBSD__) || defined(__NetBSD) +# define PLATFORM_ID "NetBSD" + +#elif defined(__OpenBSD__) || defined(__OPENBSD) +# define PLATFORM_ID "OpenBSD" + +#elif defined(__sun) || defined(sun) +# define PLATFORM_ID "SunOS" + +#elif defined(_AIX) || defined(__AIX) || defined(__AIX__) || defined(__aix) || defined(__aix__) +# define PLATFORM_ID "AIX" + +#elif defined(__hpux) || defined(__hpux__) +# define PLATFORM_ID "HP-UX" + +#elif defined(__HAIKU__) +# define PLATFORM_ID "Haiku" + +#elif defined(__BeOS) || defined(__BEOS__) || defined(_BEOS) +# define PLATFORM_ID "BeOS" + +#elif defined(__QNX__) || defined(__QNXNTO__) +# define PLATFORM_ID "QNX" + +#elif defined(__tru64) || defined(_tru64) || defined(__TRU64__) +# define PLATFORM_ID "Tru64" + +#elif defined(__riscos) || defined(__riscos__) +# define PLATFORM_ID "RISCos" + +#elif defined(__sinix) || defined(__sinix__) || defined(__SINIX__) +# define PLATFORM_ID "SINIX" + +#elif defined(__UNIX_SV__) +# define PLATFORM_ID "UNIX_SV" + +#elif defined(__bsdos__) +# define PLATFORM_ID "BSDOS" + +#elif defined(_MPRAS) || defined(MPRAS) +# define PLATFORM_ID "MP-RAS" + +#elif defined(__osf) || defined(__osf__) +# define PLATFORM_ID "OSF1" + +#elif defined(_SCO_SV) || defined(SCO_SV) || defined(sco_sv) +# define PLATFORM_ID "SCO_SV" + +#elif defined(__ultrix) || defined(__ultrix__) || defined(_ULTRIX) +# define PLATFORM_ID "ULTRIX" + +#elif defined(__XENIX__) || defined(_XENIX) || defined(XENIX) +# define PLATFORM_ID "Xenix" + +#elif defined(__WATCOMC__) +# if defined(__LINUX__) +# define PLATFORM_ID "Linux" + +# elif defined(__DOS__) +# define PLATFORM_ID "DOS" + +# elif defined(__OS2__) +# define PLATFORM_ID "OS2" + +# elif defined(__WINDOWS__) +# define PLATFORM_ID "Windows3x" + +# elif defined(__VXWORKS__) +# define PLATFORM_ID "VxWorks" + +# else /* unknown platform */ +# define PLATFORM_ID +# endif + +#elif defined(__INTEGRITY) +# if defined(INT_178B) +# define PLATFORM_ID "Integrity178" + +# else /* regular Integrity */ +# define PLATFORM_ID "Integrity" +# endif + +# elif defined(_ADI_COMPILER) +# define PLATFORM_ID "ADSP" + +#else /* unknown platform */ +# define PLATFORM_ID + +#endif + +/* For windows compilers MSVC and Intel we can determine + the architecture of the compiler being used. This is because + the compilers do not have flags that can change the architecture, + but rather depend on which compiler is being used +*/ +#if defined(_WIN32) && defined(_MSC_VER) +# if defined(_M_IA64) +# define ARCHITECTURE_ID "IA64" + +# elif defined(_M_ARM64EC) +# define ARCHITECTURE_ID "ARM64EC" + +# elif defined(_M_X64) || defined(_M_AMD64) +# define ARCHITECTURE_ID "x64" + +# elif defined(_M_IX86) +# define ARCHITECTURE_ID "X86" + +# elif defined(_M_ARM64) +# define ARCHITECTURE_ID "ARM64" + +# elif defined(_M_ARM) +# if _M_ARM == 4 +# define ARCHITECTURE_ID "ARMV4I" +# elif _M_ARM == 5 +# define ARCHITECTURE_ID "ARMV5I" +# else +# define ARCHITECTURE_ID "ARMV" STRINGIFY(_M_ARM) +# endif + +# elif defined(_M_MIPS) +# define ARCHITECTURE_ID "MIPS" + +# elif defined(_M_SH) +# define ARCHITECTURE_ID "SHx" + +# else /* unknown architecture */ +# define ARCHITECTURE_ID "" +# endif + +#elif defined(__WATCOMC__) +# if defined(_M_I86) +# define ARCHITECTURE_ID "I86" + +# elif defined(_M_IX86) +# define ARCHITECTURE_ID "X86" + +# else /* unknown architecture */ +# define ARCHITECTURE_ID "" +# endif + +#elif defined(__IAR_SYSTEMS_ICC__) || defined(__IAR_SYSTEMS_ICC) +# if defined(__ICCARM__) +# define ARCHITECTURE_ID "ARM" + +# elif defined(__ICCRX__) +# define ARCHITECTURE_ID "RX" + +# elif defined(__ICCRH850__) +# define ARCHITECTURE_ID "RH850" + +# elif defined(__ICCRL78__) +# define ARCHITECTURE_ID "RL78" + +# elif defined(__ICCRISCV__) +# define ARCHITECTURE_ID "RISCV" + +# elif defined(__ICCAVR__) +# define ARCHITECTURE_ID "AVR" + +# elif defined(__ICC430__) +# define ARCHITECTURE_ID "MSP430" + +# elif defined(__ICCV850__) +# define ARCHITECTURE_ID "V850" + +# elif defined(__ICC8051__) +# define ARCHITECTURE_ID "8051" + +# elif defined(__ICCSTM8__) +# define ARCHITECTURE_ID "STM8" + +# else /* unknown architecture */ +# define ARCHITECTURE_ID "" +# endif + +#elif defined(__ghs__) +# if defined(__PPC64__) +# define ARCHITECTURE_ID "PPC64" + +# elif defined(__ppc__) +# define ARCHITECTURE_ID "PPC" + +# elif defined(__ARM__) +# define ARCHITECTURE_ID "ARM" + +# elif defined(__x86_64__) +# define ARCHITECTURE_ID "x64" + +# elif defined(__i386__) +# define ARCHITECTURE_ID "X86" + +# else /* unknown architecture */ +# define ARCHITECTURE_ID "" +# endif + +#elif defined(__clang__) && defined(__ti__) +# if defined(__ARM_ARCH) +# define ARCHITECTURE_ID "Arm" + +# else /* unknown architecture */ +# define ARCHITECTURE_ID "" +# endif + +#elif defined(__TI_COMPILER_VERSION__) +# if defined(__TI_ARM__) +# define ARCHITECTURE_ID "ARM" + +# elif defined(__MSP430__) +# define ARCHITECTURE_ID "MSP430" + +# elif defined(__TMS320C28XX__) +# define ARCHITECTURE_ID "TMS320C28x" + +# elif defined(__TMS320C6X__) || defined(_TMS320C6X) +# define ARCHITECTURE_ID "TMS320C6x" + +# else /* unknown architecture */ +# define ARCHITECTURE_ID "" +# endif + +# elif defined(__ADSPSHARC__) +# define ARCHITECTURE_ID "SHARC" + +# elif defined(__ADSPBLACKFIN__) +# define ARCHITECTURE_ID "Blackfin" + +#elif defined(__TASKING__) + +# if defined(__CTC__) || defined(__CPTC__) +# define ARCHITECTURE_ID "TriCore" + +# elif defined(__CMCS__) +# define ARCHITECTURE_ID "MCS" + +# elif defined(__CARM__) +# define ARCHITECTURE_ID "ARM" + +# elif defined(__CARC__) +# define ARCHITECTURE_ID "ARC" + +# elif defined(__C51__) +# define ARCHITECTURE_ID "8051" + +# elif defined(__CPCP__) +# define ARCHITECTURE_ID "PCP" + +# else +# define ARCHITECTURE_ID "" +# endif + +#else +# define ARCHITECTURE_ID +#endif + +/* Convert integer to decimal digit literals. */ +#define DEC(n) \ + ('0' + (((n) / 10000000)%10)), \ + ('0' + (((n) / 1000000)%10)), \ + ('0' + (((n) / 100000)%10)), \ + ('0' + (((n) / 10000)%10)), \ + ('0' + (((n) / 1000)%10)), \ + ('0' + (((n) / 100)%10)), \ + ('0' + (((n) / 10)%10)), \ + ('0' + ((n) % 10)) + +/* Convert integer to hex digit literals. */ +#define HEX(n) \ + ('0' + ((n)>>28 & 0xF)), \ + ('0' + ((n)>>24 & 0xF)), \ + ('0' + ((n)>>20 & 0xF)), \ + ('0' + ((n)>>16 & 0xF)), \ + ('0' + ((n)>>12 & 0xF)), \ + ('0' + ((n)>>8 & 0xF)), \ + ('0' + ((n)>>4 & 0xF)), \ + ('0' + ((n) & 0xF)) + +/* Construct a string literal encoding the version number. */ +#ifdef COMPILER_VERSION +char const* info_version = "INFO" ":" "compiler_version[" COMPILER_VERSION "]"; + +/* Construct a string literal encoding the version number components. */ +#elif defined(COMPILER_VERSION_MAJOR) +char const info_version[] = { + 'I', 'N', 'F', 'O', ':', + 'c','o','m','p','i','l','e','r','_','v','e','r','s','i','o','n','[', + COMPILER_VERSION_MAJOR, +# ifdef COMPILER_VERSION_MINOR + '.', COMPILER_VERSION_MINOR, +# ifdef COMPILER_VERSION_PATCH + '.', COMPILER_VERSION_PATCH, +# ifdef COMPILER_VERSION_TWEAK + '.', COMPILER_VERSION_TWEAK, +# endif +# endif +# endif + ']','\0'}; +#endif + +/* Construct a string literal encoding the internal version number. */ +#ifdef COMPILER_VERSION_INTERNAL +char const info_version_internal[] = { + 'I', 'N', 'F', 'O', ':', + 'c','o','m','p','i','l','e','r','_','v','e','r','s','i','o','n','_', + 'i','n','t','e','r','n','a','l','[', + COMPILER_VERSION_INTERNAL,']','\0'}; +#elif defined(COMPILER_VERSION_INTERNAL_STR) +char const* info_version_internal = "INFO" ":" "compiler_version_internal[" COMPILER_VERSION_INTERNAL_STR "]"; +#endif + +/* Construct a string literal encoding the version number components. */ +#ifdef SIMULATE_VERSION_MAJOR +char const info_simulate_version[] = { + 'I', 'N', 'F', 'O', ':', + 's','i','m','u','l','a','t','e','_','v','e','r','s','i','o','n','[', + SIMULATE_VERSION_MAJOR, +# ifdef SIMULATE_VERSION_MINOR + '.', SIMULATE_VERSION_MINOR, +# ifdef SIMULATE_VERSION_PATCH + '.', SIMULATE_VERSION_PATCH, +# ifdef SIMULATE_VERSION_TWEAK + '.', SIMULATE_VERSION_TWEAK, +# endif +# endif +# endif + ']','\0'}; +#endif + +/* Construct the string literal in pieces to prevent the source from + getting matched. Store it in a pointer rather than an array + because some compilers will just produce instructions to fill the + array rather than assigning a pointer to a static array. */ +char const* info_platform = "INFO" ":" "platform[" PLATFORM_ID "]"; +char const* info_arch = "INFO" ":" "arch[" ARCHITECTURE_ID "]"; + + + +#define C_STD_99 199901L +#define C_STD_11 201112L +#define C_STD_17 201710L +#define C_STD_23 202311L + +#ifdef __STDC_VERSION__ +# define C_STD __STDC_VERSION__ +#endif + +#if !defined(__STDC__) && !defined(__clang__) +# if defined(_MSC_VER) || defined(__ibmxl__) || defined(__IBMC__) +# define C_VERSION "90" +# else +# define C_VERSION +# endif +#elif C_STD > C_STD_17 +# define C_VERSION "23" +#elif C_STD > C_STD_11 +# define C_VERSION "17" +#elif C_STD > C_STD_99 +# define C_VERSION "11" +#elif C_STD >= C_STD_99 +# define C_VERSION "99" +#else +# define C_VERSION "90" +#endif +const char* info_language_standard_default = + "INFO" ":" "standard_default[" C_VERSION "]"; + +const char* info_language_extensions_default = "INFO" ":" "extensions_default[" +#if (defined(__clang__) || defined(__GNUC__) || defined(__xlC__) || \ + defined(__TI_COMPILER_VERSION__)) && \ + !defined(__STRICT_ANSI__) + "ON" +#else + "OFF" +#endif +"]"; + +/*--------------------------------------------------------------------------*/ + +#ifdef ID_VOID_MAIN +void main() {} +#else +# if defined(__CLASSIC_C__) +int main(argc, argv) int argc; char *argv[]; +# else +int main(int argc, char* argv[]) +# endif +{ + int require = 0; + require += info_compiler[argc]; + require += info_platform[argc]; + require += info_arch[argc]; +#ifdef COMPILER_VERSION_MAJOR + require += info_version[argc]; +#endif +#ifdef COMPILER_VERSION_INTERNAL + require += info_version_internal[argc]; +#endif +#ifdef SIMULATE_ID + require += info_simulate[argc]; +#endif +#ifdef SIMULATE_VERSION_MAJOR + require += info_simulate_version[argc]; +#endif +#if defined(__CRAYXT_COMPUTE_LINUX_TARGET) + require += info_cray[argc]; +#endif + require += info_language_standard_default[argc]; + require += info_language_extensions_default[argc]; + (void)argv; + return require; +} +#endif diff --git a/siro_driver/android/app/.cxx/Debug/2j1f5m6a/arm64-v8a/CMakeFiles/3.31.5-g6cf5163/CompilerIdC/CMakeCCompilerId.o b/siro_driver/android/app/.cxx/Debug/2j1f5m6a/arm64-v8a/CMakeFiles/3.31.5-g6cf5163/CompilerIdC/CMakeCCompilerId.o new file mode 100644 index 0000000..3bb6e21 Binary files /dev/null and b/siro_driver/android/app/.cxx/Debug/2j1f5m6a/arm64-v8a/CMakeFiles/3.31.5-g6cf5163/CompilerIdC/CMakeCCompilerId.o differ diff --git a/siro_driver/android/app/.cxx/Debug/2j1f5m6a/arm64-v8a/CMakeFiles/3.31.5-g6cf5163/CompilerIdCXX/CMakeCXXCompilerId.cpp b/siro_driver/android/app/.cxx/Debug/2j1f5m6a/arm64-v8a/CMakeFiles/3.31.5-g6cf5163/CompilerIdCXX/CMakeCXXCompilerId.cpp new file mode 100644 index 0000000..da6c824 --- /dev/null +++ b/siro_driver/android/app/.cxx/Debug/2j1f5m6a/arm64-v8a/CMakeFiles/3.31.5-g6cf5163/CompilerIdCXX/CMakeCXXCompilerId.cpp @@ -0,0 +1,919 @@ +/* This source file must have a .cpp extension so that all C++ compilers + recognize the extension without flags. Borland does not know .cxx for + example. */ +#ifndef __cplusplus +# error "A C compiler has been selected for C++." +#endif + +#if !defined(__has_include) +/* If the compiler does not have __has_include, pretend the answer is + always no. */ +# define __has_include(x) 0 +#endif + + +/* Version number components: V=Version, R=Revision, P=Patch + Version date components: YYYY=Year, MM=Month, DD=Day */ + +#if defined(__INTEL_COMPILER) || defined(__ICC) +# define COMPILER_ID "Intel" +# if defined(_MSC_VER) +# define SIMULATE_ID "MSVC" +# endif +# if defined(__GNUC__) +# define SIMULATE_ID "GNU" +# endif + /* __INTEL_COMPILER = VRP prior to 2021, and then VVVV for 2021 and later, + except that a few beta releases use the old format with V=2021. */ +# if __INTEL_COMPILER < 2021 || __INTEL_COMPILER == 202110 || __INTEL_COMPILER == 202111 +# define COMPILER_VERSION_MAJOR DEC(__INTEL_COMPILER/100) +# define COMPILER_VERSION_MINOR DEC(__INTEL_COMPILER/10 % 10) +# if defined(__INTEL_COMPILER_UPDATE) +# define COMPILER_VERSION_PATCH DEC(__INTEL_COMPILER_UPDATE) +# else +# define COMPILER_VERSION_PATCH DEC(__INTEL_COMPILER % 10) +# endif +# else +# define COMPILER_VERSION_MAJOR DEC(__INTEL_COMPILER) +# define COMPILER_VERSION_MINOR DEC(__INTEL_COMPILER_UPDATE) + /* The third version component from --version is an update index, + but no macro is provided for it. */ +# define COMPILER_VERSION_PATCH DEC(0) +# endif +# if defined(__INTEL_COMPILER_BUILD_DATE) + /* __INTEL_COMPILER_BUILD_DATE = YYYYMMDD */ +# define COMPILER_VERSION_TWEAK DEC(__INTEL_COMPILER_BUILD_DATE) +# endif +# if defined(_MSC_VER) + /* _MSC_VER = VVRR */ +# define SIMULATE_VERSION_MAJOR DEC(_MSC_VER / 100) +# define SIMULATE_VERSION_MINOR DEC(_MSC_VER % 100) +# endif +# if defined(__GNUC__) +# define SIMULATE_VERSION_MAJOR DEC(__GNUC__) +# elif defined(__GNUG__) +# define SIMULATE_VERSION_MAJOR DEC(__GNUG__) +# endif +# if defined(__GNUC_MINOR__) +# define SIMULATE_VERSION_MINOR DEC(__GNUC_MINOR__) +# endif +# if defined(__GNUC_PATCHLEVEL__) +# define SIMULATE_VERSION_PATCH DEC(__GNUC_PATCHLEVEL__) +# endif + +#elif (defined(__clang__) && defined(__INTEL_CLANG_COMPILER)) || defined(__INTEL_LLVM_COMPILER) +# define COMPILER_ID "IntelLLVM" +#if defined(_MSC_VER) +# define SIMULATE_ID "MSVC" +#endif +#if defined(__GNUC__) +# define SIMULATE_ID "GNU" +#endif +/* __INTEL_LLVM_COMPILER = VVVVRP prior to 2021.2.0, VVVVRRPP for 2021.2.0 and + * later. Look for 6 digit vs. 8 digit version number to decide encoding. + * VVVV is no smaller than the current year when a version is released. + */ +#if __INTEL_LLVM_COMPILER < 1000000L +# define COMPILER_VERSION_MAJOR DEC(__INTEL_LLVM_COMPILER/100) +# define COMPILER_VERSION_MINOR DEC(__INTEL_LLVM_COMPILER/10 % 10) +# define COMPILER_VERSION_PATCH DEC(__INTEL_LLVM_COMPILER % 10) +#else +# define COMPILER_VERSION_MAJOR DEC(__INTEL_LLVM_COMPILER/10000) +# define COMPILER_VERSION_MINOR DEC(__INTEL_LLVM_COMPILER/100 % 100) +# define COMPILER_VERSION_PATCH DEC(__INTEL_LLVM_COMPILER % 100) +#endif +#if defined(_MSC_VER) + /* _MSC_VER = VVRR */ +# define SIMULATE_VERSION_MAJOR DEC(_MSC_VER / 100) +# define SIMULATE_VERSION_MINOR DEC(_MSC_VER % 100) +#endif +#if defined(__GNUC__) +# define SIMULATE_VERSION_MAJOR DEC(__GNUC__) +#elif defined(__GNUG__) +# define SIMULATE_VERSION_MAJOR DEC(__GNUG__) +#endif +#if defined(__GNUC_MINOR__) +# define SIMULATE_VERSION_MINOR DEC(__GNUC_MINOR__) +#endif +#if defined(__GNUC_PATCHLEVEL__) +# define SIMULATE_VERSION_PATCH DEC(__GNUC_PATCHLEVEL__) +#endif + +#elif defined(__PATHCC__) +# define COMPILER_ID "PathScale" +# define COMPILER_VERSION_MAJOR DEC(__PATHCC__) +# define COMPILER_VERSION_MINOR DEC(__PATHCC_MINOR__) +# if defined(__PATHCC_PATCHLEVEL__) +# define COMPILER_VERSION_PATCH DEC(__PATHCC_PATCHLEVEL__) +# endif + +#elif defined(__BORLANDC__) && defined(__CODEGEARC_VERSION__) +# define COMPILER_ID "Embarcadero" +# define COMPILER_VERSION_MAJOR HEX(__CODEGEARC_VERSION__>>24 & 0x00FF) +# define COMPILER_VERSION_MINOR HEX(__CODEGEARC_VERSION__>>16 & 0x00FF) +# define COMPILER_VERSION_PATCH DEC(__CODEGEARC_VERSION__ & 0xFFFF) + +#elif defined(__BORLANDC__) +# define COMPILER_ID "Borland" + /* __BORLANDC__ = 0xVRR */ +# define COMPILER_VERSION_MAJOR HEX(__BORLANDC__>>8) +# define COMPILER_VERSION_MINOR HEX(__BORLANDC__ & 0xFF) + +#elif defined(__WATCOMC__) && __WATCOMC__ < 1200 +# define COMPILER_ID "Watcom" + /* __WATCOMC__ = VVRR */ +# define COMPILER_VERSION_MAJOR DEC(__WATCOMC__ / 100) +# define COMPILER_VERSION_MINOR DEC((__WATCOMC__ / 10) % 10) +# if (__WATCOMC__ % 10) > 0 +# define COMPILER_VERSION_PATCH DEC(__WATCOMC__ % 10) +# endif + +#elif defined(__WATCOMC__) +# define COMPILER_ID "OpenWatcom" + /* __WATCOMC__ = VVRP + 1100 */ +# define COMPILER_VERSION_MAJOR DEC((__WATCOMC__ - 1100) / 100) +# define COMPILER_VERSION_MINOR DEC((__WATCOMC__ / 10) % 10) +# if (__WATCOMC__ % 10) > 0 +# define COMPILER_VERSION_PATCH DEC(__WATCOMC__ % 10) +# endif + +#elif defined(__SUNPRO_CC) +# define COMPILER_ID "SunPro" +# if __SUNPRO_CC >= 0x5100 + /* __SUNPRO_CC = 0xVRRP */ +# define COMPILER_VERSION_MAJOR HEX(__SUNPRO_CC>>12) +# define COMPILER_VERSION_MINOR HEX(__SUNPRO_CC>>4 & 0xFF) +# define COMPILER_VERSION_PATCH HEX(__SUNPRO_CC & 0xF) +# else + /* __SUNPRO_CC = 0xVRP */ +# define COMPILER_VERSION_MAJOR HEX(__SUNPRO_CC>>8) +# define COMPILER_VERSION_MINOR HEX(__SUNPRO_CC>>4 & 0xF) +# define COMPILER_VERSION_PATCH HEX(__SUNPRO_CC & 0xF) +# endif + +#elif defined(__HP_aCC) +# define COMPILER_ID "HP" + /* __HP_aCC = VVRRPP */ +# define COMPILER_VERSION_MAJOR DEC(__HP_aCC/10000) +# define COMPILER_VERSION_MINOR DEC(__HP_aCC/100 % 100) +# define COMPILER_VERSION_PATCH DEC(__HP_aCC % 100) + +#elif defined(__DECCXX) +# define COMPILER_ID "Compaq" + /* __DECCXX_VER = VVRRTPPPP */ +# define COMPILER_VERSION_MAJOR DEC(__DECCXX_VER/10000000) +# define COMPILER_VERSION_MINOR DEC(__DECCXX_VER/100000 % 100) +# define COMPILER_VERSION_PATCH DEC(__DECCXX_VER % 10000) + +#elif defined(__IBMCPP__) && defined(__COMPILER_VER__) +# define COMPILER_ID "zOS" + /* __IBMCPP__ = VRP */ +# define COMPILER_VERSION_MAJOR DEC(__IBMCPP__/100) +# define COMPILER_VERSION_MINOR DEC(__IBMCPP__/10 % 10) +# define COMPILER_VERSION_PATCH DEC(__IBMCPP__ % 10) + +#elif defined(__open_xl__) && defined(__clang__) +# define COMPILER_ID "IBMClang" +# define COMPILER_VERSION_MAJOR DEC(__open_xl_version__) +# define COMPILER_VERSION_MINOR DEC(__open_xl_release__) +# define COMPILER_VERSION_PATCH DEC(__open_xl_modification__) +# define COMPILER_VERSION_TWEAK DEC(__open_xl_ptf_fix_level__) + + +#elif defined(__ibmxl__) && defined(__clang__) +# define COMPILER_ID "XLClang" +# define COMPILER_VERSION_MAJOR DEC(__ibmxl_version__) +# define COMPILER_VERSION_MINOR DEC(__ibmxl_release__) +# define COMPILER_VERSION_PATCH DEC(__ibmxl_modification__) +# define COMPILER_VERSION_TWEAK DEC(__ibmxl_ptf_fix_level__) + + +#elif defined(__IBMCPP__) && !defined(__COMPILER_VER__) && __IBMCPP__ >= 800 +# define COMPILER_ID "XL" + /* __IBMCPP__ = VRP */ +# define COMPILER_VERSION_MAJOR DEC(__IBMCPP__/100) +# define COMPILER_VERSION_MINOR DEC(__IBMCPP__/10 % 10) +# define COMPILER_VERSION_PATCH DEC(__IBMCPP__ % 10) + +#elif defined(__IBMCPP__) && !defined(__COMPILER_VER__) && __IBMCPP__ < 800 +# define COMPILER_ID "VisualAge" + /* __IBMCPP__ = VRP */ +# define COMPILER_VERSION_MAJOR DEC(__IBMCPP__/100) +# define COMPILER_VERSION_MINOR DEC(__IBMCPP__/10 % 10) +# define COMPILER_VERSION_PATCH DEC(__IBMCPP__ % 10) + +#elif defined(__NVCOMPILER) +# define COMPILER_ID "NVHPC" +# define COMPILER_VERSION_MAJOR DEC(__NVCOMPILER_MAJOR__) +# define COMPILER_VERSION_MINOR DEC(__NVCOMPILER_MINOR__) +# if defined(__NVCOMPILER_PATCHLEVEL__) +# define COMPILER_VERSION_PATCH DEC(__NVCOMPILER_PATCHLEVEL__) +# endif + +#elif defined(__PGI) +# define COMPILER_ID "PGI" +# define COMPILER_VERSION_MAJOR DEC(__PGIC__) +# define COMPILER_VERSION_MINOR DEC(__PGIC_MINOR__) +# if defined(__PGIC_PATCHLEVEL__) +# define COMPILER_VERSION_PATCH DEC(__PGIC_PATCHLEVEL__) +# endif + +#elif defined(__clang__) && defined(__cray__) +# define COMPILER_ID "CrayClang" +# define COMPILER_VERSION_MAJOR DEC(__cray_major__) +# define COMPILER_VERSION_MINOR DEC(__cray_minor__) +# define COMPILER_VERSION_PATCH DEC(__cray_patchlevel__) +# define COMPILER_VERSION_INTERNAL_STR __clang_version__ + + +#elif defined(_CRAYC) +# define COMPILER_ID "Cray" +# define COMPILER_VERSION_MAJOR DEC(_RELEASE_MAJOR) +# define COMPILER_VERSION_MINOR DEC(_RELEASE_MINOR) + +#elif defined(__TI_COMPILER_VERSION__) +# define COMPILER_ID "TI" + /* __TI_COMPILER_VERSION__ = VVVRRRPPP */ +# define COMPILER_VERSION_MAJOR DEC(__TI_COMPILER_VERSION__/1000000) +# define COMPILER_VERSION_MINOR DEC(__TI_COMPILER_VERSION__/1000 % 1000) +# define COMPILER_VERSION_PATCH DEC(__TI_COMPILER_VERSION__ % 1000) + +#elif defined(__CLANG_FUJITSU) +# define COMPILER_ID "FujitsuClang" +# define COMPILER_VERSION_MAJOR DEC(__FCC_major__) +# define COMPILER_VERSION_MINOR DEC(__FCC_minor__) +# define COMPILER_VERSION_PATCH DEC(__FCC_patchlevel__) +# define COMPILER_VERSION_INTERNAL_STR __clang_version__ + + +#elif defined(__FUJITSU) +# define COMPILER_ID "Fujitsu" +# if defined(__FCC_version__) +# define COMPILER_VERSION __FCC_version__ +# elif defined(__FCC_major__) +# define COMPILER_VERSION_MAJOR DEC(__FCC_major__) +# define COMPILER_VERSION_MINOR DEC(__FCC_minor__) +# define COMPILER_VERSION_PATCH DEC(__FCC_patchlevel__) +# endif +# if defined(__fcc_version) +# define COMPILER_VERSION_INTERNAL DEC(__fcc_version) +# elif defined(__FCC_VERSION) +# define COMPILER_VERSION_INTERNAL DEC(__FCC_VERSION) +# endif + + +#elif defined(__ghs__) +# define COMPILER_ID "GHS" +/* __GHS_VERSION_NUMBER = VVVVRP */ +# ifdef __GHS_VERSION_NUMBER +# define COMPILER_VERSION_MAJOR DEC(__GHS_VERSION_NUMBER / 100) +# define COMPILER_VERSION_MINOR DEC(__GHS_VERSION_NUMBER / 10 % 10) +# define COMPILER_VERSION_PATCH DEC(__GHS_VERSION_NUMBER % 10) +# endif + +#elif defined(__TASKING__) +# define COMPILER_ID "Tasking" + # define COMPILER_VERSION_MAJOR DEC(__VERSION__/1000) + # define COMPILER_VERSION_MINOR DEC(__VERSION__ % 100) +# define COMPILER_VERSION_INTERNAL DEC(__VERSION__) + +#elif defined(__ORANGEC__) +# define COMPILER_ID "OrangeC" +# define COMPILER_VERSION_MAJOR DEC(__ORANGEC_MAJOR__) +# define COMPILER_VERSION_MINOR DEC(__ORANGEC_MINOR__) +# define COMPILER_VERSION_PATCH DEC(__ORANGEC_PATCHLEVEL__) + +#elif defined(__SCO_VERSION__) +# define COMPILER_ID "SCO" + +#elif defined(__ARMCC_VERSION) && !defined(__clang__) +# define COMPILER_ID "ARMCC" +#if __ARMCC_VERSION >= 1000000 + /* __ARMCC_VERSION = VRRPPPP */ + # define COMPILER_VERSION_MAJOR DEC(__ARMCC_VERSION/1000000) + # define COMPILER_VERSION_MINOR DEC(__ARMCC_VERSION/10000 % 100) + # define COMPILER_VERSION_PATCH DEC(__ARMCC_VERSION % 10000) +#else + /* __ARMCC_VERSION = VRPPPP */ + # define COMPILER_VERSION_MAJOR DEC(__ARMCC_VERSION/100000) + # define COMPILER_VERSION_MINOR DEC(__ARMCC_VERSION/10000 % 10) + # define COMPILER_VERSION_PATCH DEC(__ARMCC_VERSION % 10000) +#endif + + +#elif defined(__clang__) && defined(__apple_build_version__) +# define COMPILER_ID "AppleClang" +# if defined(_MSC_VER) +# define SIMULATE_ID "MSVC" +# endif +# define COMPILER_VERSION_MAJOR DEC(__clang_major__) +# define COMPILER_VERSION_MINOR DEC(__clang_minor__) +# define COMPILER_VERSION_PATCH DEC(__clang_patchlevel__) +# if defined(_MSC_VER) + /* _MSC_VER = VVRR */ +# define SIMULATE_VERSION_MAJOR DEC(_MSC_VER / 100) +# define SIMULATE_VERSION_MINOR DEC(_MSC_VER % 100) +# endif +# define COMPILER_VERSION_TWEAK DEC(__apple_build_version__) + +#elif defined(__clang__) && defined(__ARMCOMPILER_VERSION) +# define COMPILER_ID "ARMClang" + # define COMPILER_VERSION_MAJOR DEC(__ARMCOMPILER_VERSION/1000000) + # define COMPILER_VERSION_MINOR DEC(__ARMCOMPILER_VERSION/10000 % 100) + # define COMPILER_VERSION_PATCH DEC(__ARMCOMPILER_VERSION/100 % 100) +# define COMPILER_VERSION_INTERNAL DEC(__ARMCOMPILER_VERSION) + +#elif defined(__clang__) && defined(__ti__) +# define COMPILER_ID "TIClang" + # define COMPILER_VERSION_MAJOR DEC(__ti_major__) + # define COMPILER_VERSION_MINOR DEC(__ti_minor__) + # define COMPILER_VERSION_PATCH DEC(__ti_patchlevel__) +# define COMPILER_VERSION_INTERNAL DEC(__ti_version__) + +#elif defined(__clang__) +# define COMPILER_ID "Clang" +# if defined(_MSC_VER) +# define SIMULATE_ID "MSVC" +# endif +# define COMPILER_VERSION_MAJOR DEC(__clang_major__) +# define COMPILER_VERSION_MINOR DEC(__clang_minor__) +# define COMPILER_VERSION_PATCH DEC(__clang_patchlevel__) +# if defined(_MSC_VER) + /* _MSC_VER = VVRR */ +# define SIMULATE_VERSION_MAJOR DEC(_MSC_VER / 100) +# define SIMULATE_VERSION_MINOR DEC(_MSC_VER % 100) +# endif + +#elif defined(__LCC__) && (defined(__GNUC__) || defined(__GNUG__) || defined(__MCST__)) +# define COMPILER_ID "LCC" +# define COMPILER_VERSION_MAJOR DEC(__LCC__ / 100) +# define COMPILER_VERSION_MINOR DEC(__LCC__ % 100) +# if defined(__LCC_MINOR__) +# define COMPILER_VERSION_PATCH DEC(__LCC_MINOR__) +# endif +# if defined(__GNUC__) && defined(__GNUC_MINOR__) +# define SIMULATE_ID "GNU" +# define SIMULATE_VERSION_MAJOR DEC(__GNUC__) +# define SIMULATE_VERSION_MINOR DEC(__GNUC_MINOR__) +# if defined(__GNUC_PATCHLEVEL__) +# define SIMULATE_VERSION_PATCH DEC(__GNUC_PATCHLEVEL__) +# endif +# endif + +#elif defined(__GNUC__) || defined(__GNUG__) +# define COMPILER_ID "GNU" +# if defined(__GNUC__) +# define COMPILER_VERSION_MAJOR DEC(__GNUC__) +# else +# define COMPILER_VERSION_MAJOR DEC(__GNUG__) +# endif +# if defined(__GNUC_MINOR__) +# define COMPILER_VERSION_MINOR DEC(__GNUC_MINOR__) +# endif +# if defined(__GNUC_PATCHLEVEL__) +# define COMPILER_VERSION_PATCH DEC(__GNUC_PATCHLEVEL__) +# endif + +#elif defined(_MSC_VER) +# define COMPILER_ID "MSVC" + /* _MSC_VER = VVRR */ +# define COMPILER_VERSION_MAJOR DEC(_MSC_VER / 100) +# define COMPILER_VERSION_MINOR DEC(_MSC_VER % 100) +# if defined(_MSC_FULL_VER) +# if _MSC_VER >= 1400 + /* _MSC_FULL_VER = VVRRPPPPP */ +# define COMPILER_VERSION_PATCH DEC(_MSC_FULL_VER % 100000) +# else + /* _MSC_FULL_VER = VVRRPPPP */ +# define COMPILER_VERSION_PATCH DEC(_MSC_FULL_VER % 10000) +# endif +# endif +# if defined(_MSC_BUILD) +# define COMPILER_VERSION_TWEAK DEC(_MSC_BUILD) +# endif + +#elif defined(_ADI_COMPILER) +# define COMPILER_ID "ADSP" +#if defined(__VERSIONNUM__) + /* __VERSIONNUM__ = 0xVVRRPPTT */ +# define COMPILER_VERSION_MAJOR DEC(__VERSIONNUM__ >> 24 & 0xFF) +# define COMPILER_VERSION_MINOR DEC(__VERSIONNUM__ >> 16 & 0xFF) +# define COMPILER_VERSION_PATCH DEC(__VERSIONNUM__ >> 8 & 0xFF) +# define COMPILER_VERSION_TWEAK DEC(__VERSIONNUM__ & 0xFF) +#endif + +#elif defined(__IAR_SYSTEMS_ICC__) || defined(__IAR_SYSTEMS_ICC) +# define COMPILER_ID "IAR" +# if defined(__VER__) && defined(__ICCARM__) +# define COMPILER_VERSION_MAJOR DEC((__VER__) / 1000000) +# define COMPILER_VERSION_MINOR DEC(((__VER__) / 1000) % 1000) +# define COMPILER_VERSION_PATCH DEC((__VER__) % 1000) +# define COMPILER_VERSION_INTERNAL DEC(__IAR_SYSTEMS_ICC__) +# elif defined(__VER__) && (defined(__ICCAVR__) || defined(__ICCRX__) || defined(__ICCRH850__) || defined(__ICCRL78__) || defined(__ICC430__) || defined(__ICCRISCV__) || defined(__ICCV850__) || defined(__ICC8051__) || defined(__ICCSTM8__)) +# define COMPILER_VERSION_MAJOR DEC((__VER__) / 100) +# define COMPILER_VERSION_MINOR DEC((__VER__) - (((__VER__) / 100)*100)) +# define COMPILER_VERSION_PATCH DEC(__SUBVERSION__) +# define COMPILER_VERSION_INTERNAL DEC(__IAR_SYSTEMS_ICC__) +# endif + + +/* These compilers are either not known or too old to define an + identification macro. Try to identify the platform and guess that + it is the native compiler. */ +#elif defined(__hpux) || defined(__hpua) +# define COMPILER_ID "HP" + +#else /* unknown compiler */ +# define COMPILER_ID "" +#endif + +/* Construct the string literal in pieces to prevent the source from + getting matched. Store it in a pointer rather than an array + because some compilers will just produce instructions to fill the + array rather than assigning a pointer to a static array. */ +char const* info_compiler = "INFO" ":" "compiler[" COMPILER_ID "]"; +#ifdef SIMULATE_ID +char const* info_simulate = "INFO" ":" "simulate[" SIMULATE_ID "]"; +#endif + +#ifdef __QNXNTO__ +char const* qnxnto = "INFO" ":" "qnxnto[]"; +#endif + +#if defined(__CRAYXT_COMPUTE_LINUX_TARGET) +char const *info_cray = "INFO" ":" "compiler_wrapper[CrayPrgEnv]"; +#endif + +#define STRINGIFY_HELPER(X) #X +#define STRINGIFY(X) STRINGIFY_HELPER(X) + +/* Identify known platforms by name. */ +#if defined(__linux) || defined(__linux__) || defined(linux) +# define PLATFORM_ID "Linux" + +#elif defined(__MSYS__) +# define PLATFORM_ID "MSYS" + +#elif defined(__CYGWIN__) +# define PLATFORM_ID "Cygwin" + +#elif defined(__MINGW32__) +# define PLATFORM_ID "MinGW" + +#elif defined(__APPLE__) +# define PLATFORM_ID "Darwin" + +#elif defined(_WIN32) || defined(__WIN32__) || defined(WIN32) +# define PLATFORM_ID "Windows" + +#elif defined(__FreeBSD__) || defined(__FreeBSD) +# define PLATFORM_ID "FreeBSD" + +#elif defined(__NetBSD__) || defined(__NetBSD) +# define PLATFORM_ID "NetBSD" + +#elif defined(__OpenBSD__) || defined(__OPENBSD) +# define PLATFORM_ID "OpenBSD" + +#elif defined(__sun) || defined(sun) +# define PLATFORM_ID "SunOS" + +#elif defined(_AIX) || defined(__AIX) || defined(__AIX__) || defined(__aix) || defined(__aix__) +# define PLATFORM_ID "AIX" + +#elif defined(__hpux) || defined(__hpux__) +# define PLATFORM_ID "HP-UX" + +#elif defined(__HAIKU__) +# define PLATFORM_ID "Haiku" + +#elif defined(__BeOS) || defined(__BEOS__) || defined(_BEOS) +# define PLATFORM_ID "BeOS" + +#elif defined(__QNX__) || defined(__QNXNTO__) +# define PLATFORM_ID "QNX" + +#elif defined(__tru64) || defined(_tru64) || defined(__TRU64__) +# define PLATFORM_ID "Tru64" + +#elif defined(__riscos) || defined(__riscos__) +# define PLATFORM_ID "RISCos" + +#elif defined(__sinix) || defined(__sinix__) || defined(__SINIX__) +# define PLATFORM_ID "SINIX" + +#elif defined(__UNIX_SV__) +# define PLATFORM_ID "UNIX_SV" + +#elif defined(__bsdos__) +# define PLATFORM_ID "BSDOS" + +#elif defined(_MPRAS) || defined(MPRAS) +# define PLATFORM_ID "MP-RAS" + +#elif defined(__osf) || defined(__osf__) +# define PLATFORM_ID "OSF1" + +#elif defined(_SCO_SV) || defined(SCO_SV) || defined(sco_sv) +# define PLATFORM_ID "SCO_SV" + +#elif defined(__ultrix) || defined(__ultrix__) || defined(_ULTRIX) +# define PLATFORM_ID "ULTRIX" + +#elif defined(__XENIX__) || defined(_XENIX) || defined(XENIX) +# define PLATFORM_ID "Xenix" + +#elif defined(__WATCOMC__) +# if defined(__LINUX__) +# define PLATFORM_ID "Linux" + +# elif defined(__DOS__) +# define PLATFORM_ID "DOS" + +# elif defined(__OS2__) +# define PLATFORM_ID "OS2" + +# elif defined(__WINDOWS__) +# define PLATFORM_ID "Windows3x" + +# elif defined(__VXWORKS__) +# define PLATFORM_ID "VxWorks" + +# else /* unknown platform */ +# define PLATFORM_ID +# endif + +#elif defined(__INTEGRITY) +# if defined(INT_178B) +# define PLATFORM_ID "Integrity178" + +# else /* regular Integrity */ +# define PLATFORM_ID "Integrity" +# endif + +# elif defined(_ADI_COMPILER) +# define PLATFORM_ID "ADSP" + +#else /* unknown platform */ +# define PLATFORM_ID + +#endif + +/* For windows compilers MSVC and Intel we can determine + the architecture of the compiler being used. This is because + the compilers do not have flags that can change the architecture, + but rather depend on which compiler is being used +*/ +#if defined(_WIN32) && defined(_MSC_VER) +# if defined(_M_IA64) +# define ARCHITECTURE_ID "IA64" + +# elif defined(_M_ARM64EC) +# define ARCHITECTURE_ID "ARM64EC" + +# elif defined(_M_X64) || defined(_M_AMD64) +# define ARCHITECTURE_ID "x64" + +# elif defined(_M_IX86) +# define ARCHITECTURE_ID "X86" + +# elif defined(_M_ARM64) +# define ARCHITECTURE_ID "ARM64" + +# elif defined(_M_ARM) +# if _M_ARM == 4 +# define ARCHITECTURE_ID "ARMV4I" +# elif _M_ARM == 5 +# define ARCHITECTURE_ID "ARMV5I" +# else +# define ARCHITECTURE_ID "ARMV" STRINGIFY(_M_ARM) +# endif + +# elif defined(_M_MIPS) +# define ARCHITECTURE_ID "MIPS" + +# elif defined(_M_SH) +# define ARCHITECTURE_ID "SHx" + +# else /* unknown architecture */ +# define ARCHITECTURE_ID "" +# endif + +#elif defined(__WATCOMC__) +# if defined(_M_I86) +# define ARCHITECTURE_ID "I86" + +# elif defined(_M_IX86) +# define ARCHITECTURE_ID "X86" + +# else /* unknown architecture */ +# define ARCHITECTURE_ID "" +# endif + +#elif defined(__IAR_SYSTEMS_ICC__) || defined(__IAR_SYSTEMS_ICC) +# if defined(__ICCARM__) +# define ARCHITECTURE_ID "ARM" + +# elif defined(__ICCRX__) +# define ARCHITECTURE_ID "RX" + +# elif defined(__ICCRH850__) +# define ARCHITECTURE_ID "RH850" + +# elif defined(__ICCRL78__) +# define ARCHITECTURE_ID "RL78" + +# elif defined(__ICCRISCV__) +# define ARCHITECTURE_ID "RISCV" + +# elif defined(__ICCAVR__) +# define ARCHITECTURE_ID "AVR" + +# elif defined(__ICC430__) +# define ARCHITECTURE_ID "MSP430" + +# elif defined(__ICCV850__) +# define ARCHITECTURE_ID "V850" + +# elif defined(__ICC8051__) +# define ARCHITECTURE_ID "8051" + +# elif defined(__ICCSTM8__) +# define ARCHITECTURE_ID "STM8" + +# else /* unknown architecture */ +# define ARCHITECTURE_ID "" +# endif + +#elif defined(__ghs__) +# if defined(__PPC64__) +# define ARCHITECTURE_ID "PPC64" + +# elif defined(__ppc__) +# define ARCHITECTURE_ID "PPC" + +# elif defined(__ARM__) +# define ARCHITECTURE_ID "ARM" + +# elif defined(__x86_64__) +# define ARCHITECTURE_ID "x64" + +# elif defined(__i386__) +# define ARCHITECTURE_ID "X86" + +# else /* unknown architecture */ +# define ARCHITECTURE_ID "" +# endif + +#elif defined(__clang__) && defined(__ti__) +# if defined(__ARM_ARCH) +# define ARCHITECTURE_ID "Arm" + +# else /* unknown architecture */ +# define ARCHITECTURE_ID "" +# endif + +#elif defined(__TI_COMPILER_VERSION__) +# if defined(__TI_ARM__) +# define ARCHITECTURE_ID "ARM" + +# elif defined(__MSP430__) +# define ARCHITECTURE_ID "MSP430" + +# elif defined(__TMS320C28XX__) +# define ARCHITECTURE_ID "TMS320C28x" + +# elif defined(__TMS320C6X__) || defined(_TMS320C6X) +# define ARCHITECTURE_ID "TMS320C6x" + +# else /* unknown architecture */ +# define ARCHITECTURE_ID "" +# endif + +# elif defined(__ADSPSHARC__) +# define ARCHITECTURE_ID "SHARC" + +# elif defined(__ADSPBLACKFIN__) +# define ARCHITECTURE_ID "Blackfin" + +#elif defined(__TASKING__) + +# if defined(__CTC__) || defined(__CPTC__) +# define ARCHITECTURE_ID "TriCore" + +# elif defined(__CMCS__) +# define ARCHITECTURE_ID "MCS" + +# elif defined(__CARM__) +# define ARCHITECTURE_ID "ARM" + +# elif defined(__CARC__) +# define ARCHITECTURE_ID "ARC" + +# elif defined(__C51__) +# define ARCHITECTURE_ID "8051" + +# elif defined(__CPCP__) +# define ARCHITECTURE_ID "PCP" + +# else +# define ARCHITECTURE_ID "" +# endif + +#else +# define ARCHITECTURE_ID +#endif + +/* Convert integer to decimal digit literals. */ +#define DEC(n) \ + ('0' + (((n) / 10000000)%10)), \ + ('0' + (((n) / 1000000)%10)), \ + ('0' + (((n) / 100000)%10)), \ + ('0' + (((n) / 10000)%10)), \ + ('0' + (((n) / 1000)%10)), \ + ('0' + (((n) / 100)%10)), \ + ('0' + (((n) / 10)%10)), \ + ('0' + ((n) % 10)) + +/* Convert integer to hex digit literals. */ +#define HEX(n) \ + ('0' + ((n)>>28 & 0xF)), \ + ('0' + ((n)>>24 & 0xF)), \ + ('0' + ((n)>>20 & 0xF)), \ + ('0' + ((n)>>16 & 0xF)), \ + ('0' + ((n)>>12 & 0xF)), \ + ('0' + ((n)>>8 & 0xF)), \ + ('0' + ((n)>>4 & 0xF)), \ + ('0' + ((n) & 0xF)) + +/* Construct a string literal encoding the version number. */ +#ifdef COMPILER_VERSION +char const* info_version = "INFO" ":" "compiler_version[" COMPILER_VERSION "]"; + +/* Construct a string literal encoding the version number components. */ +#elif defined(COMPILER_VERSION_MAJOR) +char const info_version[] = { + 'I', 'N', 'F', 'O', ':', + 'c','o','m','p','i','l','e','r','_','v','e','r','s','i','o','n','[', + COMPILER_VERSION_MAJOR, +# ifdef COMPILER_VERSION_MINOR + '.', COMPILER_VERSION_MINOR, +# ifdef COMPILER_VERSION_PATCH + '.', COMPILER_VERSION_PATCH, +# ifdef COMPILER_VERSION_TWEAK + '.', COMPILER_VERSION_TWEAK, +# endif +# endif +# endif + ']','\0'}; +#endif + +/* Construct a string literal encoding the internal version number. */ +#ifdef COMPILER_VERSION_INTERNAL +char const info_version_internal[] = { + 'I', 'N', 'F', 'O', ':', + 'c','o','m','p','i','l','e','r','_','v','e','r','s','i','o','n','_', + 'i','n','t','e','r','n','a','l','[', + COMPILER_VERSION_INTERNAL,']','\0'}; +#elif defined(COMPILER_VERSION_INTERNAL_STR) +char const* info_version_internal = "INFO" ":" "compiler_version_internal[" COMPILER_VERSION_INTERNAL_STR "]"; +#endif + +/* Construct a string literal encoding the version number components. */ +#ifdef SIMULATE_VERSION_MAJOR +char const info_simulate_version[] = { + 'I', 'N', 'F', 'O', ':', + 's','i','m','u','l','a','t','e','_','v','e','r','s','i','o','n','[', + SIMULATE_VERSION_MAJOR, +# ifdef SIMULATE_VERSION_MINOR + '.', SIMULATE_VERSION_MINOR, +# ifdef SIMULATE_VERSION_PATCH + '.', SIMULATE_VERSION_PATCH, +# ifdef SIMULATE_VERSION_TWEAK + '.', SIMULATE_VERSION_TWEAK, +# endif +# endif +# endif + ']','\0'}; +#endif + +/* Construct the string literal in pieces to prevent the source from + getting matched. Store it in a pointer rather than an array + because some compilers will just produce instructions to fill the + array rather than assigning a pointer to a static array. */ +char const* info_platform = "INFO" ":" "platform[" PLATFORM_ID "]"; +char const* info_arch = "INFO" ":" "arch[" ARCHITECTURE_ID "]"; + + + +#define CXX_STD_98 199711L +#define CXX_STD_11 201103L +#define CXX_STD_14 201402L +#define CXX_STD_17 201703L +#define CXX_STD_20 202002L +#define CXX_STD_23 202302L + +#if defined(__INTEL_COMPILER) && defined(_MSVC_LANG) +# if _MSVC_LANG > CXX_STD_17 +# define CXX_STD _MSVC_LANG +# elif _MSVC_LANG == CXX_STD_17 && defined(__cpp_aggregate_paren_init) +# define CXX_STD CXX_STD_20 +# elif _MSVC_LANG > CXX_STD_14 && __cplusplus > CXX_STD_17 +# define CXX_STD CXX_STD_20 +# elif _MSVC_LANG > CXX_STD_14 +# define CXX_STD CXX_STD_17 +# elif defined(__INTEL_CXX11_MODE__) && defined(__cpp_aggregate_nsdmi) +# define CXX_STD CXX_STD_14 +# elif defined(__INTEL_CXX11_MODE__) +# define CXX_STD CXX_STD_11 +# else +# define CXX_STD CXX_STD_98 +# endif +#elif defined(_MSC_VER) && defined(_MSVC_LANG) +# if _MSVC_LANG > __cplusplus +# define CXX_STD _MSVC_LANG +# else +# define CXX_STD __cplusplus +# endif +#elif defined(__NVCOMPILER) +# if __cplusplus == CXX_STD_17 && defined(__cpp_aggregate_paren_init) +# define CXX_STD CXX_STD_20 +# else +# define CXX_STD __cplusplus +# endif +#elif defined(__INTEL_COMPILER) || defined(__PGI) +# if __cplusplus == CXX_STD_11 && defined(__cpp_namespace_attributes) +# define CXX_STD CXX_STD_17 +# elif __cplusplus == CXX_STD_11 && defined(__cpp_aggregate_nsdmi) +# define CXX_STD CXX_STD_14 +# else +# define CXX_STD __cplusplus +# endif +#elif (defined(__IBMCPP__) || defined(__ibmxl__)) && defined(__linux__) +# if __cplusplus == CXX_STD_11 && defined(__cpp_aggregate_nsdmi) +# define CXX_STD CXX_STD_14 +# else +# define CXX_STD __cplusplus +# endif +#elif __cplusplus == 1 && defined(__GXX_EXPERIMENTAL_CXX0X__) +# define CXX_STD CXX_STD_11 +#else +# define CXX_STD __cplusplus +#endif + +const char* info_language_standard_default = "INFO" ":" "standard_default[" +#if CXX_STD > CXX_STD_23 + "26" +#elif CXX_STD > CXX_STD_20 + "23" +#elif CXX_STD > CXX_STD_17 + "20" +#elif CXX_STD > CXX_STD_14 + "17" +#elif CXX_STD > CXX_STD_11 + "14" +#elif CXX_STD >= CXX_STD_11 + "11" +#else + "98" +#endif +"]"; + +const char* info_language_extensions_default = "INFO" ":" "extensions_default[" +#if (defined(__clang__) || defined(__GNUC__) || defined(__xlC__) || \ + defined(__TI_COMPILER_VERSION__)) && \ + !defined(__STRICT_ANSI__) + "ON" +#else + "OFF" +#endif +"]"; + +/*--------------------------------------------------------------------------*/ + +int main(int argc, char* argv[]) +{ + int require = 0; + require += info_compiler[argc]; + require += info_platform[argc]; + require += info_arch[argc]; +#ifdef COMPILER_VERSION_MAJOR + require += info_version[argc]; +#endif +#ifdef COMPILER_VERSION_INTERNAL + require += info_version_internal[argc]; +#endif +#ifdef SIMULATE_ID + require += info_simulate[argc]; +#endif +#ifdef SIMULATE_VERSION_MAJOR + require += info_simulate_version[argc]; +#endif +#if defined(__CRAYXT_COMPUTE_LINUX_TARGET) + require += info_cray[argc]; +#endif + require += info_language_standard_default[argc]; + require += info_language_extensions_default[argc]; + (void)argv; + return require; +} diff --git a/siro_driver/android/app/.cxx/Debug/2j1f5m6a/arm64-v8a/CMakeFiles/3.31.5-g6cf5163/CompilerIdCXX/CMakeCXXCompilerId.o b/siro_driver/android/app/.cxx/Debug/2j1f5m6a/arm64-v8a/CMakeFiles/3.31.5-g6cf5163/CompilerIdCXX/CMakeCXXCompilerId.o new file mode 100644 index 0000000..79360ae Binary files /dev/null and b/siro_driver/android/app/.cxx/Debug/2j1f5m6a/arm64-v8a/CMakeFiles/3.31.5-g6cf5163/CompilerIdCXX/CMakeCXXCompilerId.o differ diff --git a/siro_driver/android/app/.cxx/Debug/2j1f5m6a/arm64-v8a/CMakeFiles/CMakeConfigureLog.yaml b/siro_driver/android/app/.cxx/Debug/2j1f5m6a/arm64-v8a/CMakeFiles/CMakeConfigureLog.yaml new file mode 100644 index 0000000..3aeddd7 --- /dev/null +++ b/siro_driver/android/app/.cxx/Debug/2j1f5m6a/arm64-v8a/CMakeFiles/CMakeConfigureLog.yaml @@ -0,0 +1,405 @@ + +--- +events: + - + kind: "message-v1" + backtrace: + - "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeDetermineSystem.cmake:200 (message)" + - "CMakeLists.txt:2 (project)" + message: | + The target system is: Android - 1 - aarch64 + The host system is: Darwin - 24.5.0 - arm64 + - + kind: "message-v1" + backtrace: + - "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeDetermineCompilerId.cmake:17 (message)" + - "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeDetermineCompilerId.cmake:64 (__determine_compiler_id_test)" + - "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeDetermineCCompiler.cmake:123 (CMAKE_DETERMINE_COMPILER_ID)" + - "CMakeLists.txt:2 (project)" + message: | + Compiling the C compiler identification source file "CMakeCCompilerId.c" succeeded. + Compiler: /Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/bin/clang + Build flags: -g;-DANDROID;-fdata-sections;-ffunction-sections;-funwind-tables;-fstack-protector-strong;-no-canonical-prefixes;-D_FORTIFY_SOURCE=2;-Wformat;-Werror=format-security + Id flags: -c;--target=aarch64-none-linux-android23 + + The output was: + 0 + + + Compilation of the C compiler identification source "CMakeCCompilerId.c" produced "CMakeCCompilerId.o" + + The C compiler identification is Clang, found in: + /Users/hamzaaleghwairyeen/development/App/intaleq_driver/android/app/.cxx/Debug/2j1f5m6a/arm64-v8a/CMakeFiles/3.31.5-g6cf5163/CompilerIdC/CMakeCCompilerId.o + + - + kind: "message-v1" + backtrace: + - "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeDetermineCompilerId.cmake:17 (message)" + - "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeDetermineCompilerId.cmake:64 (__determine_compiler_id_test)" + - "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeDetermineCXXCompiler.cmake:126 (CMAKE_DETERMINE_COMPILER_ID)" + - "CMakeLists.txt:2 (project)" + message: | + Compiling the CXX compiler identification source file "CMakeCXXCompilerId.cpp" succeeded. + Compiler: /Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/bin/clang++ + Build flags: -g;-DANDROID;-fdata-sections;-ffunction-sections;-funwind-tables;-fstack-protector-strong;-no-canonical-prefixes;-D_FORTIFY_SOURCE=2;-Wformat;-Werror=format-security + Id flags: -c;--target=aarch64-none-linux-android23 + + The output was: + 0 + + + Compilation of the CXX compiler identification source "CMakeCXXCompilerId.cpp" produced "CMakeCXXCompilerId.o" + + The CXX compiler identification is Clang, found in: + /Users/hamzaaleghwairyeen/development/App/intaleq_driver/android/app/.cxx/Debug/2j1f5m6a/arm64-v8a/CMakeFiles/3.31.5-g6cf5163/CompilerIdCXX/CMakeCXXCompilerId.o + + - + kind: "try_compile-v1" + backtrace: + - "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeDetermineCompilerABI.cmake:74 (try_compile)" + - "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeTestCCompiler.cmake:26 (CMAKE_DETERMINE_COMPILER_ABI)" + - "CMakeLists.txt:2 (project)" + checks: + - "Detecting C compiler ABI info" + directories: + source: "/Users/hamzaaleghwairyeen/development/App/intaleq_driver/android/app/.cxx/Debug/2j1f5m6a/arm64-v8a/CMakeFiles/CMakeScratch/TryCompile-qBOgwW" + binary: "/Users/hamzaaleghwairyeen/development/App/intaleq_driver/android/app/.cxx/Debug/2j1f5m6a/arm64-v8a/CMakeFiles/CMakeScratch/TryCompile-qBOgwW" + cmakeVariables: + ANDROID_ABI: "arm64-v8a" + ANDROID_ARM_MODE: "thumb" + ANDROID_PIE: "TRUE" + ANDROID_PLATFORM: "android-23" + ANDROID_STL: "c++_static" + ANDROID_TOOLCHAIN: "clang" + CMAKE_CXX_COMPILER_CLANG_SCAN_DEPS: "/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/bin/clang-scan-deps" + CMAKE_CXX_COMPILER_TARGET: "aarch64-none-linux-android23" + CMAKE_C_COMPILER_TARGET: "aarch64-none-linux-android23" + CMAKE_C_FLAGS: "-g -DANDROID -fdata-sections -ffunction-sections -funwind-tables -fstack-protector-strong -no-canonical-prefixes -D_FORTIFY_SOURCE=2 -Wformat " + CMAKE_C_FLAGS_DEBUG: "-fno-limit-debug-info " + CMAKE_EXE_LINKER_FLAGS: "-static-libstdc++ -Wl,--build-id=sha1 -Wl,--no-rosegment -Wl,--no-undefined-version -Wl,--fatal-warnings -Wl,--no-undefined -Qunused-arguments " + CMAKE_POSITION_INDEPENDENT_CODE: "TRUE" + CMAKE_SYSROOT: "/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot" + buildResult: + variable: "CMAKE_C_ABI_COMPILED" + cached: true + stdout: | + Change Dir: '/Users/hamzaaleghwairyeen/development/App/intaleq_driver/android/app/.cxx/Debug/2j1f5m6a/arm64-v8a/CMakeFiles/CMakeScratch/TryCompile-qBOgwW' + + Run Build Command(s): /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/bin/ninja -v cmTC_b0aba + [1/2] /Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/bin/clang --target=aarch64-none-linux-android23 --sysroot=/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot -g -DANDROID -fdata-sections -ffunction-sections -funwind-tables -fstack-protector-strong -no-canonical-prefixes -D_FORTIFY_SOURCE=2 -Wformat -fPIE -v -MD -MT CMakeFiles/cmTC_b0aba.dir/CMakeCCompilerABI.c.o -MF CMakeFiles/cmTC_b0aba.dir/CMakeCCompilerABI.c.o.d -o CMakeFiles/cmTC_b0aba.dir/CMakeCCompilerABI.c.o -c /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeCCompilerABI.c + Android (12027248, +pgo, -bolt, +lto, -mlgo, based on r522817) clang version 18.0.1 (https://android.googlesource.com/toolchain/llvm-project d8003a456d14a3deb8054cdaa529ffbf02d9b262) + Target: aarch64-none-linux-android23 + Thread model: posix + InstalledDir: /Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/bin + (in-process) + "/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/bin/clang" -cc1 -triple aarch64-none-linux-android23 -emit-obj -mrelax-all -disable-free -clear-ast-before-backend -disable-llvm-verifier -discard-value-names -main-file-name CMakeCCompilerABI.c -mrelocation-model pic -pic-level 2 -pic-is-pie -mframe-pointer=non-leaf -ffp-contract=on -fno-rounding-math -mconstructor-aliases -funwind-tables=2 -target-cpu generic -target-feature +neon -target-feature +v8a -target-feature +fix-cortex-a53-835769 -target-abi aapcs -debug-info-kind=constructor -dwarf-version=4 -debugger-tuning=gdb -fdebug-compilation-dir=/Users/hamzaaleghwairyeen/development/App/intaleq_driver/android/app/.cxx/Debug/2j1f5m6a/arm64-v8a/CMakeFiles/CMakeScratch/TryCompile-qBOgwW -v -ffunction-sections -fdata-sections -fcoverage-compilation-dir=/Users/hamzaaleghwairyeen/development/App/intaleq_driver/android/app/.cxx/Debug/2j1f5m6a/arm64-v8a/CMakeFiles/CMakeScratch/TryCompile-qBOgwW -resource-dir /Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/lib/clang/18 -dependency-file CMakeFiles/cmTC_b0aba.dir/CMakeCCompilerABI.c.o.d -MT CMakeFiles/cmTC_b0aba.dir/CMakeCCompilerABI.c.o -sys-header-deps -D ANDROID -D _FORTIFY_SOURCE=2 -isysroot /Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot -internal-isystem /Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/lib/clang/18/include -internal-isystem /Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/local/include -internal-externc-isystem /Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/include/aarch64-linux-android -internal-externc-isystem /Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/include -internal-externc-isystem /Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/include -Wformat -ferror-limit 19 -femulated-tls -stack-protector 2 -fno-signed-char -fgnuc-version=4.2.1 -target-feature +outline-atomics -D__GCC_HAVE_DWARF2_CFI_ASM=1 -o CMakeFiles/cmTC_b0aba.dir/CMakeCCompilerABI.c.o -x c /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeCCompilerABI.c + clang -cc1 version 18.0.1 based upon LLVM 18.0.1 default target x86_64-apple-darwin24.5.0 + ignoring nonexistent directory "/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/local/include" + ignoring nonexistent directory "/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/include" + #include "..." search starts here: + #include <...> search starts here: + /Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/lib/clang/18/include + /Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/include/aarch64-linux-android + /Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/include + End of search list. + [2/2] : && /Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/bin/clang --target=aarch64-none-linux-android23 --sysroot=/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot -g -DANDROID -fdata-sections -ffunction-sections -funwind-tables -fstack-protector-strong -no-canonical-prefixes -D_FORTIFY_SOURCE=2 -Wformat -static-libstdc++ -Wl,--build-id=sha1 -Wl,--no-rosegment -Wl,--no-undefined-version -Wl,--fatal-warnings -Wl,--no-undefined -Qunused-arguments -v CMakeFiles/cmTC_b0aba.dir/CMakeCCompilerABI.c.o -o cmTC_b0aba && : + Android (12027248, +pgo, -bolt, +lto, -mlgo, based on r522817) clang version 18.0.1 (https://android.googlesource.com/toolchain/llvm-project d8003a456d14a3deb8054cdaa529ffbf02d9b262) + Target: aarch64-none-linux-android23 + Thread model: posix + InstalledDir: /Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/bin + "/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/bin/ld.lld" --sysroot=/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot -EL --fix-cortex-a53-843419 -z now -z relro -z max-page-size=4096 --hash-style=gnu --eh-frame-hdr -m aarch64linux -pie -dynamic-linker /system/bin/linker64 -o cmTC_b0aba /Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/lib/aarch64-linux-android/23/crtbegin_dynamic.o -L/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/lib/clang/18/lib/linux/aarch64 -L/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/lib/aarch64-linux-android/23 -L/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/lib/aarch64-linux-android -L/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/lib --build-id=sha1 --no-rosegment --no-undefined-version --fatal-warnings --no-undefined CMakeFiles/cmTC_b0aba.dir/CMakeCCompilerABI.c.o /Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/lib/clang/18/lib/linux/libclang_rt.builtins-aarch64-android.a -l:libunwind.a -ldl -lc /Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/lib/clang/18/lib/linux/libclang_rt.builtins-aarch64-android.a -l:libunwind.a -ldl /Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/lib/aarch64-linux-android/23/crtend_android.o + + exitCode: 0 + - + kind: "message-v1" + backtrace: + - "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeDetermineCompilerABI.cmake:182 (message)" + - "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeTestCCompiler.cmake:26 (CMAKE_DETERMINE_COMPILER_ABI)" + - "CMakeLists.txt:2 (project)" + message: | + Parsed C implicit include dir info: rv=done + found start of include info + found start of implicit include info + add: [/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/lib/clang/18/include] + add: [/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/include/aarch64-linux-android] + add: [/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/include] + end of search list found + collapse include dir [/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/lib/clang/18/include] ==> [/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/lib/clang/18/include] + collapse include dir [/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/include/aarch64-linux-android] ==> [/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/include/aarch64-linux-android] + collapse include dir [/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/include] ==> [/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/include] + implicit include dirs: [/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/lib/clang/18/include;/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/include/aarch64-linux-android;/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/include] + + + - + kind: "message-v1" + backtrace: + - "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeDetermineCompilerABI.cmake:218 (message)" + - "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeTestCCompiler.cmake:26 (CMAKE_DETERMINE_COMPILER_ABI)" + - "CMakeLists.txt:2 (project)" + message: | + Parsed C implicit link information: + link line regex: [^( *|.*[/\\])(ld[0-9]*(\\.[a-z]+)?|CMAKE_LINK_STARTFILE-NOTFOUND|([^/\\]+-)?ld|collect2)[^/\\]*( |$)] + linker tool regex: [^[ ]*(->|")?[ ]*(([^"]*[/\\])?(ld[0-9]*(\\.[a-z]+)?))("|,| |$)] + ignore line: [Change Dir: '/Users/hamzaaleghwairyeen/development/App/intaleq_driver/android/app/.cxx/Debug/2j1f5m6a/arm64-v8a/CMakeFiles/CMakeScratch/TryCompile-qBOgwW'] + ignore line: [] + ignore line: [Run Build Command(s): /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/bin/ninja -v cmTC_b0aba] + ignore line: [[1/2] /Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/bin/clang --target=aarch64-none-linux-android23 --sysroot=/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot -g -DANDROID -fdata-sections -ffunction-sections -funwind-tables -fstack-protector-strong -no-canonical-prefixes -D_FORTIFY_SOURCE=2 -Wformat -fPIE -v -MD -MT CMakeFiles/cmTC_b0aba.dir/CMakeCCompilerABI.c.o -MF CMakeFiles/cmTC_b0aba.dir/CMakeCCompilerABI.c.o.d -o CMakeFiles/cmTC_b0aba.dir/CMakeCCompilerABI.c.o -c /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeCCompilerABI.c] + ignore line: [Android (12027248 +pgo -bolt +lto -mlgo based on r522817) clang version 18.0.1 (https://android.googlesource.com/toolchain/llvm-project d8003a456d14a3deb8054cdaa529ffbf02d9b262)] + ignore line: [Target: aarch64-none-linux-android23] + ignore line: [Thread model: posix] + ignore line: [InstalledDir: /Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/bin] + ignore line: [ (in-process)] + ignore line: [ "/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/bin/clang" -cc1 -triple aarch64-none-linux-android23 -emit-obj -mrelax-all -disable-free -clear-ast-before-backend -disable-llvm-verifier -discard-value-names -main-file-name CMakeCCompilerABI.c -mrelocation-model pic -pic-level 2 -pic-is-pie -mframe-pointer=non-leaf -ffp-contract=on -fno-rounding-math -mconstructor-aliases -funwind-tables=2 -target-cpu generic -target-feature +neon -target-feature +v8a -target-feature +fix-cortex-a53-835769 -target-abi aapcs -debug-info-kind=constructor -dwarf-version=4 -debugger-tuning=gdb -fdebug-compilation-dir=/Users/hamzaaleghwairyeen/development/App/intaleq_driver/android/app/.cxx/Debug/2j1f5m6a/arm64-v8a/CMakeFiles/CMakeScratch/TryCompile-qBOgwW -v -ffunction-sections -fdata-sections -fcoverage-compilation-dir=/Users/hamzaaleghwairyeen/development/App/intaleq_driver/android/app/.cxx/Debug/2j1f5m6a/arm64-v8a/CMakeFiles/CMakeScratch/TryCompile-qBOgwW -resource-dir /Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/lib/clang/18 -dependency-file CMakeFiles/cmTC_b0aba.dir/CMakeCCompilerABI.c.o.d -MT CMakeFiles/cmTC_b0aba.dir/CMakeCCompilerABI.c.o -sys-header-deps -D ANDROID -D _FORTIFY_SOURCE=2 -isysroot /Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot -internal-isystem /Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/lib/clang/18/include -internal-isystem /Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/local/include -internal-externc-isystem /Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/include/aarch64-linux-android -internal-externc-isystem /Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/include -internal-externc-isystem /Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/include -Wformat -ferror-limit 19 -femulated-tls -stack-protector 2 -fno-signed-char -fgnuc-version=4.2.1 -target-feature +outline-atomics -D__GCC_HAVE_DWARF2_CFI_ASM=1 -o CMakeFiles/cmTC_b0aba.dir/CMakeCCompilerABI.c.o -x c /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeCCompilerABI.c] + ignore line: [clang -cc1 version 18.0.1 based upon LLVM 18.0.1 default target x86_64-apple-darwin24.5.0] + ignore line: [ignoring nonexistent directory "/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/local/include"] + ignore line: [ignoring nonexistent directory "/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/include"] + ignore line: [#include "..." search starts here:] + ignore line: [#include <...> search starts here:] + ignore line: [ /Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/lib/clang/18/include] + ignore line: [ /Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/include/aarch64-linux-android] + ignore line: [ /Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/include] + ignore line: [End of search list.] + ignore line: [[2/2] : && /Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/bin/clang --target=aarch64-none-linux-android23 --sysroot=/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot -g -DANDROID -fdata-sections -ffunction-sections -funwind-tables -fstack-protector-strong -no-canonical-prefixes -D_FORTIFY_SOURCE=2 -Wformat -static-libstdc++ -Wl --build-id=sha1 -Wl --no-rosegment -Wl --no-undefined-version -Wl --fatal-warnings -Wl --no-undefined -Qunused-arguments -v CMakeFiles/cmTC_b0aba.dir/CMakeCCompilerABI.c.o -o cmTC_b0aba && :] + ignore line: [Android (12027248 +pgo -bolt +lto -mlgo based on r522817) clang version 18.0.1 (https://android.googlesource.com/toolchain/llvm-project d8003a456d14a3deb8054cdaa529ffbf02d9b262)] + ignore line: [Target: aarch64-none-linux-android23] + ignore line: [Thread model: posix] + ignore line: [InstalledDir: /Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/bin] + link line: [ "/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/bin/ld.lld" --sysroot=/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot -EL --fix-cortex-a53-843419 -z now -z relro -z max-page-size=4096 --hash-style=gnu --eh-frame-hdr -m aarch64linux -pie -dynamic-linker /system/bin/linker64 -o cmTC_b0aba /Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/lib/aarch64-linux-android/23/crtbegin_dynamic.o -L/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/lib/clang/18/lib/linux/aarch64 -L/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/lib/aarch64-linux-android/23 -L/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/lib/aarch64-linux-android -L/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/lib --build-id=sha1 --no-rosegment --no-undefined-version --fatal-warnings --no-undefined CMakeFiles/cmTC_b0aba.dir/CMakeCCompilerABI.c.o /Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/lib/clang/18/lib/linux/libclang_rt.builtins-aarch64-android.a -l:libunwind.a -ldl -lc /Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/lib/clang/18/lib/linux/libclang_rt.builtins-aarch64-android.a -l:libunwind.a -ldl /Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/lib/aarch64-linux-android/23/crtend_android.o] + arg [/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/bin/ld.lld] ==> ignore + arg [--sysroot=/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot] ==> ignore + arg [-EL] ==> ignore + arg [--fix-cortex-a53-843419] ==> ignore + arg [-znow] ==> ignore + arg [-zrelro] ==> ignore + arg [-zmax-page-size=4096] ==> ignore + arg [--hash-style=gnu] ==> ignore + arg [--eh-frame-hdr] ==> ignore + arg [-m] ==> ignore + arg [aarch64linux] ==> ignore + arg [-pie] ==> ignore + arg [-dynamic-linker] ==> ignore + arg [/system/bin/linker64] ==> ignore + arg [-o] ==> ignore + arg [cmTC_b0aba] ==> ignore + arg [/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/lib/aarch64-linux-android/23/crtbegin_dynamic.o] ==> obj [/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/lib/aarch64-linux-android/23/crtbegin_dynamic.o] + arg [-L/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/lib/clang/18/lib/linux/aarch64] ==> dir [/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/lib/clang/18/lib/linux/aarch64] + arg [-L/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/lib/aarch64-linux-android/23] ==> dir [/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/lib/aarch64-linux-android/23] + arg [-L/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/lib/aarch64-linux-android] ==> dir [/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/lib/aarch64-linux-android] + arg [-L/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/lib] ==> dir [/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/lib] + arg [--build-id=sha1] ==> ignore + arg [--no-rosegment] ==> ignore + arg [--no-undefined-version] ==> ignore + arg [--fatal-warnings] ==> ignore + arg [--no-undefined] ==> ignore + arg [CMakeFiles/cmTC_b0aba.dir/CMakeCCompilerABI.c.o] ==> ignore + arg [/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/lib/clang/18/lib/linux/libclang_rt.builtins-aarch64-android.a] ==> lib [/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/lib/clang/18/lib/linux/libclang_rt.builtins-aarch64-android.a] + arg [-l:libunwind.a] ==> lib [-l:libunwind.a] + arg [-ldl] ==> lib [dl] + arg [-lc] ==> lib [c] + arg [/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/lib/clang/18/lib/linux/libclang_rt.builtins-aarch64-android.a] ==> lib [/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/lib/clang/18/lib/linux/libclang_rt.builtins-aarch64-android.a] + arg [-l:libunwind.a] ==> lib [-l:libunwind.a] + arg [-ldl] ==> lib [dl] + arg [/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/lib/aarch64-linux-android/23/crtend_android.o] ==> obj [/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/lib/aarch64-linux-android/23/crtend_android.o] + linker tool for 'C': /Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/bin/ld.lld + remove lib [/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/lib/clang/18/lib/linux/libclang_rt.builtins-aarch64-android.a] + remove lib [/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/lib/clang/18/lib/linux/libclang_rt.builtins-aarch64-android.a] + collapse library dir [/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/lib/clang/18/lib/linux/aarch64] ==> [/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/lib/clang/18/lib/linux/aarch64] + collapse library dir [/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/lib/aarch64-linux-android/23] ==> [/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/lib/aarch64-linux-android/23] + collapse library dir [/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/lib/aarch64-linux-android] ==> [/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/lib/aarch64-linux-android] + collapse library dir [/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/lib] ==> [/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/lib] + implicit libs: [-l:libunwind.a;dl;c;-l:libunwind.a;dl] + implicit objs: [/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/lib/aarch64-linux-android/23/crtbegin_dynamic.o;/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/lib/aarch64-linux-android/23/crtend_android.o] + implicit dirs: [/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/lib/clang/18/lib/linux/aarch64;/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/lib/aarch64-linux-android/23;/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/lib/aarch64-linux-android;/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/lib] + implicit fwks: [] + + + - + kind: "message-v1" + backtrace: + - "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Internal/CMakeDetermineLinkerId.cmake:40 (message)" + - "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeDetermineCompilerABI.cmake:255 (cmake_determine_linker_id)" + - "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeTestCCompiler.cmake:26 (CMAKE_DETERMINE_COMPILER_ABI)" + - "CMakeLists.txt:2 (project)" + message: | + Running the C compiler's linker: "/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/bin/ld.lld" "-v" + LLD 18.0.1 (compatible with GNU linkers) + - + kind: "try_compile-v1" + backtrace: + - "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeDetermineCompilerABI.cmake:74 (try_compile)" + - "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeTestCXXCompiler.cmake:26 (CMAKE_DETERMINE_COMPILER_ABI)" + - "CMakeLists.txt:2 (project)" + checks: + - "Detecting CXX compiler ABI info" + directories: + source: "/Users/hamzaaleghwairyeen/development/App/intaleq_driver/android/app/.cxx/Debug/2j1f5m6a/arm64-v8a/CMakeFiles/CMakeScratch/TryCompile-HKcqL3" + binary: "/Users/hamzaaleghwairyeen/development/App/intaleq_driver/android/app/.cxx/Debug/2j1f5m6a/arm64-v8a/CMakeFiles/CMakeScratch/TryCompile-HKcqL3" + cmakeVariables: + ANDROID_ABI: "arm64-v8a" + ANDROID_ARM_MODE: "thumb" + ANDROID_PIE: "TRUE" + ANDROID_PLATFORM: "android-23" + ANDROID_STL: "c++_static" + ANDROID_TOOLCHAIN: "clang" + CMAKE_CXX_COMPILER_CLANG_SCAN_DEPS: "/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/bin/clang-scan-deps" + CMAKE_CXX_COMPILER_TARGET: "aarch64-none-linux-android23" + CMAKE_CXX_FLAGS: "-g -DANDROID -fdata-sections -ffunction-sections -funwind-tables -fstack-protector-strong -no-canonical-prefixes -D_FORTIFY_SOURCE=2 -Wformat " + CMAKE_CXX_FLAGS_DEBUG: "-fno-limit-debug-info " + CMAKE_CXX_SCAN_FOR_MODULES: "OFF" + CMAKE_C_COMPILER_TARGET: "aarch64-none-linux-android23" + CMAKE_EXE_LINKER_FLAGS: "-static-libstdc++ -Wl,--build-id=sha1 -Wl,--no-rosegment -Wl,--no-undefined-version -Wl,--fatal-warnings -Wl,--no-undefined -Qunused-arguments " + CMAKE_POSITION_INDEPENDENT_CODE: "TRUE" + CMAKE_SYSROOT: "/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot" + buildResult: + variable: "CMAKE_CXX_ABI_COMPILED" + cached: true + stdout: | + Change Dir: '/Users/hamzaaleghwairyeen/development/App/intaleq_driver/android/app/.cxx/Debug/2j1f5m6a/arm64-v8a/CMakeFiles/CMakeScratch/TryCompile-HKcqL3' + + Run Build Command(s): /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/bin/ninja -v cmTC_5f3a9 + [1/2] /Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/bin/clang++ --target=aarch64-none-linux-android23 --sysroot=/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot -g -DANDROID -fdata-sections -ffunction-sections -funwind-tables -fstack-protector-strong -no-canonical-prefixes -D_FORTIFY_SOURCE=2 -Wformat -fPIE -v -MD -MT CMakeFiles/cmTC_5f3a9.dir/CMakeCXXCompilerABI.cpp.o -MF CMakeFiles/cmTC_5f3a9.dir/CMakeCXXCompilerABI.cpp.o.d -o CMakeFiles/cmTC_5f3a9.dir/CMakeCXXCompilerABI.cpp.o -c /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeCXXCompilerABI.cpp + Android (12027248, +pgo, -bolt, +lto, -mlgo, based on r522817) clang version 18.0.1 (https://android.googlesource.com/toolchain/llvm-project d8003a456d14a3deb8054cdaa529ffbf02d9b262) + Target: aarch64-none-linux-android23 + Thread model: posix + InstalledDir: /Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/bin + (in-process) + "/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/bin/clang++" -cc1 -triple aarch64-none-linux-android23 -emit-obj -mrelax-all -disable-free -clear-ast-before-backend -disable-llvm-verifier -discard-value-names -main-file-name CMakeCXXCompilerABI.cpp -mrelocation-model pic -pic-level 2 -pic-is-pie -mframe-pointer=non-leaf -ffp-contract=on -fno-rounding-math -mconstructor-aliases -funwind-tables=2 -target-cpu generic -target-feature +neon -target-feature +v8a -target-feature +fix-cortex-a53-835769 -target-abi aapcs -debug-info-kind=constructor -dwarf-version=4 -debugger-tuning=gdb -fdebug-compilation-dir=/Users/hamzaaleghwairyeen/development/App/intaleq_driver/android/app/.cxx/Debug/2j1f5m6a/arm64-v8a/CMakeFiles/CMakeScratch/TryCompile-HKcqL3 -v -ffunction-sections -fdata-sections -fcoverage-compilation-dir=/Users/hamzaaleghwairyeen/development/App/intaleq_driver/android/app/.cxx/Debug/2j1f5m6a/arm64-v8a/CMakeFiles/CMakeScratch/TryCompile-HKcqL3 -resource-dir /Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/lib/clang/18 -dependency-file CMakeFiles/cmTC_5f3a9.dir/CMakeCXXCompilerABI.cpp.o.d -MT CMakeFiles/cmTC_5f3a9.dir/CMakeCXXCompilerABI.cpp.o -sys-header-deps -D ANDROID -D _FORTIFY_SOURCE=2 -isysroot /Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot -internal-isystem /Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/include/c++/v1 -internal-isystem /Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/lib/clang/18/include -internal-isystem /Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/local/include -internal-externc-isystem /Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/include/aarch64-linux-android -internal-externc-isystem /Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/include -internal-externc-isystem /Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/include -Wformat -fdeprecated-macro -ferror-limit 19 -femulated-tls -stack-protector 2 -fno-signed-char -fgnuc-version=4.2.1 -fcxx-exceptions -fexceptions -target-feature +outline-atomics -D__GCC_HAVE_DWARF2_CFI_ASM=1 -o CMakeFiles/cmTC_5f3a9.dir/CMakeCXXCompilerABI.cpp.o -x c++ /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeCXXCompilerABI.cpp + clang -cc1 version 18.0.1 based upon LLVM 18.0.1 default target x86_64-apple-darwin24.5.0 + ignoring nonexistent directory "/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/local/include" + ignoring nonexistent directory "/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/include" + #include "..." search starts here: + #include <...> search starts here: + /Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/include/c++/v1 + /Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/lib/clang/18/include + /Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/include/aarch64-linux-android + /Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/include + End of search list. + [2/2] : && /Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/bin/clang++ --target=aarch64-none-linux-android23 --sysroot=/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot -g -DANDROID -fdata-sections -ffunction-sections -funwind-tables -fstack-protector-strong -no-canonical-prefixes -D_FORTIFY_SOURCE=2 -Wformat -static-libstdc++ -Wl,--build-id=sha1 -Wl,--no-rosegment -Wl,--no-undefined-version -Wl,--fatal-warnings -Wl,--no-undefined -Qunused-arguments -v CMakeFiles/cmTC_5f3a9.dir/CMakeCXXCompilerABI.cpp.o -o cmTC_5f3a9 && : + Android (12027248, +pgo, -bolt, +lto, -mlgo, based on r522817) clang version 18.0.1 (https://android.googlesource.com/toolchain/llvm-project d8003a456d14a3deb8054cdaa529ffbf02d9b262) + Target: aarch64-none-linux-android23 + Thread model: posix + InstalledDir: /Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/bin + "/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/bin/ld.lld" --sysroot=/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot -EL --fix-cortex-a53-843419 -z now -z relro -z max-page-size=4096 --hash-style=gnu --eh-frame-hdr -m aarch64linux -pie -dynamic-linker /system/bin/linker64 -o cmTC_5f3a9 /Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/lib/aarch64-linux-android/23/crtbegin_dynamic.o -L/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/lib/clang/18/lib/linux/aarch64 -L/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/lib/aarch64-linux-android/23 -L/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/lib/aarch64-linux-android -L/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/lib --build-id=sha1 --no-rosegment --no-undefined-version --fatal-warnings --no-undefined CMakeFiles/cmTC_5f3a9.dir/CMakeCXXCompilerABI.cpp.o -Bstatic -lc++ -Bdynamic -lm /Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/lib/clang/18/lib/linux/libclang_rt.builtins-aarch64-android.a -l:libunwind.a -ldl -lc /Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/lib/clang/18/lib/linux/libclang_rt.builtins-aarch64-android.a -l:libunwind.a -ldl /Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/lib/aarch64-linux-android/23/crtend_android.o + + exitCode: 0 + - + kind: "message-v1" + backtrace: + - "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeDetermineCompilerABI.cmake:182 (message)" + - "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeTestCXXCompiler.cmake:26 (CMAKE_DETERMINE_COMPILER_ABI)" + - "CMakeLists.txt:2 (project)" + message: | + Parsed CXX implicit include dir info: rv=done + found start of include info + found start of implicit include info + add: [/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/include/c++/v1] + add: [/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/lib/clang/18/include] + add: [/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/include/aarch64-linux-android] + add: [/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/include] + end of search list found + collapse include dir [/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/include/c++/v1] ==> [/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/include/c++/v1] + collapse include dir [/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/lib/clang/18/include] ==> [/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/lib/clang/18/include] + collapse include dir [/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/include/aarch64-linux-android] ==> [/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/include/aarch64-linux-android] + collapse include dir [/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/include] ==> [/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/include] + implicit include dirs: [/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/include/c++/v1;/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/lib/clang/18/include;/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/include/aarch64-linux-android;/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/include] + + + - + kind: "message-v1" + backtrace: + - "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeDetermineCompilerABI.cmake:218 (message)" + - "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeTestCXXCompiler.cmake:26 (CMAKE_DETERMINE_COMPILER_ABI)" + - "CMakeLists.txt:2 (project)" + message: | + Parsed CXX implicit link information: + link line regex: [^( *|.*[/\\])(ld[0-9]*(\\.[a-z]+)?|CMAKE_LINK_STARTFILE-NOTFOUND|([^/\\]+-)?ld|collect2)[^/\\]*( |$)] + linker tool regex: [^[ ]*(->|")?[ ]*(([^"]*[/\\])?(ld[0-9]*(\\.[a-z]+)?))("|,| |$)] + ignore line: [Change Dir: '/Users/hamzaaleghwairyeen/development/App/intaleq_driver/android/app/.cxx/Debug/2j1f5m6a/arm64-v8a/CMakeFiles/CMakeScratch/TryCompile-HKcqL3'] + ignore line: [] + ignore line: [Run Build Command(s): /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/bin/ninja -v cmTC_5f3a9] + ignore line: [[1/2] /Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/bin/clang++ --target=aarch64-none-linux-android23 --sysroot=/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot -g -DANDROID -fdata-sections -ffunction-sections -funwind-tables -fstack-protector-strong -no-canonical-prefixes -D_FORTIFY_SOURCE=2 -Wformat -fPIE -v -MD -MT CMakeFiles/cmTC_5f3a9.dir/CMakeCXXCompilerABI.cpp.o -MF CMakeFiles/cmTC_5f3a9.dir/CMakeCXXCompilerABI.cpp.o.d -o CMakeFiles/cmTC_5f3a9.dir/CMakeCXXCompilerABI.cpp.o -c /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeCXXCompilerABI.cpp] + ignore line: [Android (12027248 +pgo -bolt +lto -mlgo based on r522817) clang version 18.0.1 (https://android.googlesource.com/toolchain/llvm-project d8003a456d14a3deb8054cdaa529ffbf02d9b262)] + ignore line: [Target: aarch64-none-linux-android23] + ignore line: [Thread model: posix] + ignore line: [InstalledDir: /Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/bin] + ignore line: [ (in-process)] + ignore line: [ "/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/bin/clang++" -cc1 -triple aarch64-none-linux-android23 -emit-obj -mrelax-all -disable-free -clear-ast-before-backend -disable-llvm-verifier -discard-value-names -main-file-name CMakeCXXCompilerABI.cpp -mrelocation-model pic -pic-level 2 -pic-is-pie -mframe-pointer=non-leaf -ffp-contract=on -fno-rounding-math -mconstructor-aliases -funwind-tables=2 -target-cpu generic -target-feature +neon -target-feature +v8a -target-feature +fix-cortex-a53-835769 -target-abi aapcs -debug-info-kind=constructor -dwarf-version=4 -debugger-tuning=gdb -fdebug-compilation-dir=/Users/hamzaaleghwairyeen/development/App/intaleq_driver/android/app/.cxx/Debug/2j1f5m6a/arm64-v8a/CMakeFiles/CMakeScratch/TryCompile-HKcqL3 -v -ffunction-sections -fdata-sections -fcoverage-compilation-dir=/Users/hamzaaleghwairyeen/development/App/intaleq_driver/android/app/.cxx/Debug/2j1f5m6a/arm64-v8a/CMakeFiles/CMakeScratch/TryCompile-HKcqL3 -resource-dir /Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/lib/clang/18 -dependency-file CMakeFiles/cmTC_5f3a9.dir/CMakeCXXCompilerABI.cpp.o.d -MT CMakeFiles/cmTC_5f3a9.dir/CMakeCXXCompilerABI.cpp.o -sys-header-deps -D ANDROID -D _FORTIFY_SOURCE=2 -isysroot /Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot -internal-isystem /Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/include/c++/v1 -internal-isystem /Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/lib/clang/18/include -internal-isystem /Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/local/include -internal-externc-isystem /Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/include/aarch64-linux-android -internal-externc-isystem /Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/include -internal-externc-isystem /Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/include -Wformat -fdeprecated-macro -ferror-limit 19 -femulated-tls -stack-protector 2 -fno-signed-char -fgnuc-version=4.2.1 -fcxx-exceptions -fexceptions -target-feature +outline-atomics -D__GCC_HAVE_DWARF2_CFI_ASM=1 -o CMakeFiles/cmTC_5f3a9.dir/CMakeCXXCompilerABI.cpp.o -x c++ /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeCXXCompilerABI.cpp] + ignore line: [clang -cc1 version 18.0.1 based upon LLVM 18.0.1 default target x86_64-apple-darwin24.5.0] + ignore line: [ignoring nonexistent directory "/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/local/include"] + ignore line: [ignoring nonexistent directory "/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/include"] + ignore line: [#include "..." search starts here:] + ignore line: [#include <...> search starts here:] + ignore line: [ /Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/include/c++/v1] + ignore line: [ /Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/lib/clang/18/include] + ignore line: [ /Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/include/aarch64-linux-android] + ignore line: [ /Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/include] + ignore line: [End of search list.] + ignore line: [[2/2] : && /Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/bin/clang++ --target=aarch64-none-linux-android23 --sysroot=/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot -g -DANDROID -fdata-sections -ffunction-sections -funwind-tables -fstack-protector-strong -no-canonical-prefixes -D_FORTIFY_SOURCE=2 -Wformat -static-libstdc++ -Wl --build-id=sha1 -Wl --no-rosegment -Wl --no-undefined-version -Wl --fatal-warnings -Wl --no-undefined -Qunused-arguments -v CMakeFiles/cmTC_5f3a9.dir/CMakeCXXCompilerABI.cpp.o -o cmTC_5f3a9 && :] + ignore line: [Android (12027248 +pgo -bolt +lto -mlgo based on r522817) clang version 18.0.1 (https://android.googlesource.com/toolchain/llvm-project d8003a456d14a3deb8054cdaa529ffbf02d9b262)] + ignore line: [Target: aarch64-none-linux-android23] + ignore line: [Thread model: posix] + ignore line: [InstalledDir: /Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/bin] + link line: [ "/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/bin/ld.lld" --sysroot=/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot -EL --fix-cortex-a53-843419 -z now -z relro -z max-page-size=4096 --hash-style=gnu --eh-frame-hdr -m aarch64linux -pie -dynamic-linker /system/bin/linker64 -o cmTC_5f3a9 /Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/lib/aarch64-linux-android/23/crtbegin_dynamic.o -L/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/lib/clang/18/lib/linux/aarch64 -L/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/lib/aarch64-linux-android/23 -L/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/lib/aarch64-linux-android -L/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/lib --build-id=sha1 --no-rosegment --no-undefined-version --fatal-warnings --no-undefined CMakeFiles/cmTC_5f3a9.dir/CMakeCXXCompilerABI.cpp.o -Bstatic -lc++ -Bdynamic -lm /Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/lib/clang/18/lib/linux/libclang_rt.builtins-aarch64-android.a -l:libunwind.a -ldl -lc /Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/lib/clang/18/lib/linux/libclang_rt.builtins-aarch64-android.a -l:libunwind.a -ldl /Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/lib/aarch64-linux-android/23/crtend_android.o] + arg [/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/bin/ld.lld] ==> ignore + arg [--sysroot=/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot] ==> ignore + arg [-EL] ==> ignore + arg [--fix-cortex-a53-843419] ==> ignore + arg [-znow] ==> ignore + arg [-zrelro] ==> ignore + arg [-zmax-page-size=4096] ==> ignore + arg [--hash-style=gnu] ==> ignore + arg [--eh-frame-hdr] ==> ignore + arg [-m] ==> ignore + arg [aarch64linux] ==> ignore + arg [-pie] ==> ignore + arg [-dynamic-linker] ==> ignore + arg [/system/bin/linker64] ==> ignore + arg [-o] ==> ignore + arg [cmTC_5f3a9] ==> ignore + arg [/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/lib/aarch64-linux-android/23/crtbegin_dynamic.o] ==> obj [/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/lib/aarch64-linux-android/23/crtbegin_dynamic.o] + arg [-L/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/lib/clang/18/lib/linux/aarch64] ==> dir [/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/lib/clang/18/lib/linux/aarch64] + arg [-L/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/lib/aarch64-linux-android/23] ==> dir [/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/lib/aarch64-linux-android/23] + arg [-L/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/lib/aarch64-linux-android] ==> dir [/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/lib/aarch64-linux-android] + arg [-L/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/lib] ==> dir [/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/lib] + arg [--build-id=sha1] ==> ignore + arg [--no-rosegment] ==> ignore + arg [--no-undefined-version] ==> ignore + arg [--fatal-warnings] ==> ignore + arg [--no-undefined] ==> ignore + arg [CMakeFiles/cmTC_5f3a9.dir/CMakeCXXCompilerABI.cpp.o] ==> ignore + arg [-Bstatic] ==> search static + arg [-lc++] ==> lib [c++] + arg [-Bdynamic] ==> search dynamic + arg [-lm] ==> lib [m] + arg [/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/lib/clang/18/lib/linux/libclang_rt.builtins-aarch64-android.a] ==> lib [/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/lib/clang/18/lib/linux/libclang_rt.builtins-aarch64-android.a] + arg [-l:libunwind.a] ==> lib [-l:libunwind.a] + arg [-ldl] ==> lib [dl] + arg [-lc] ==> lib [c] + arg [/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/lib/clang/18/lib/linux/libclang_rt.builtins-aarch64-android.a] ==> lib [/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/lib/clang/18/lib/linux/libclang_rt.builtins-aarch64-android.a] + arg [-l:libunwind.a] ==> lib [-l:libunwind.a] + arg [-ldl] ==> lib [dl] + arg [/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/lib/aarch64-linux-android/23/crtend_android.o] ==> obj [/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/lib/aarch64-linux-android/23/crtend_android.o] + linker tool for 'CXX': /Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/bin/ld.lld + remove lib [/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/lib/clang/18/lib/linux/libclang_rt.builtins-aarch64-android.a] + remove lib [/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/lib/clang/18/lib/linux/libclang_rt.builtins-aarch64-android.a] + collapse library dir [/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/lib/clang/18/lib/linux/aarch64] ==> [/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/lib/clang/18/lib/linux/aarch64] + collapse library dir [/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/lib/aarch64-linux-android/23] ==> [/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/lib/aarch64-linux-android/23] + collapse library dir [/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/lib/aarch64-linux-android] ==> [/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/lib/aarch64-linux-android] + collapse library dir [/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/lib] ==> [/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/lib] + implicit libs: [c++;m;-l:libunwind.a;dl;c;-l:libunwind.a;dl] + implicit objs: [/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/lib/aarch64-linux-android/23/crtbegin_dynamic.o;/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/lib/aarch64-linux-android/23/crtend_android.o] + implicit dirs: [/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/lib/clang/18/lib/linux/aarch64;/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/lib/aarch64-linux-android/23;/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/lib/aarch64-linux-android;/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/lib] + implicit fwks: [] + + + - + kind: "message-v1" + backtrace: + - "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Internal/CMakeDetermineLinkerId.cmake:40 (message)" + - "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeDetermineCompilerABI.cmake:255 (cmake_determine_linker_id)" + - "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeTestCXXCompiler.cmake:26 (CMAKE_DETERMINE_COMPILER_ABI)" + - "CMakeLists.txt:2 (project)" + message: | + Running the CXX compiler's linker: "/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/bin/ld.lld" "-v" + LLD 18.0.1 (compatible with GNU linkers) +... diff --git a/siro_driver/android/app/.cxx/Debug/2j1f5m6a/arm64-v8a/CMakeFiles/TargetDirectories.txt b/siro_driver/android/app/.cxx/Debug/2j1f5m6a/arm64-v8a/CMakeFiles/TargetDirectories.txt new file mode 100644 index 0000000..ac2e03a --- /dev/null +++ b/siro_driver/android/app/.cxx/Debug/2j1f5m6a/arm64-v8a/CMakeFiles/TargetDirectories.txt @@ -0,0 +1,3 @@ +/Users/hamzaaleghwairyeen/development/App/intaleq_driver/android/app/.cxx/Debug/2j1f5m6a/arm64-v8a/CMakeFiles/native-lib.dir +/Users/hamzaaleghwairyeen/development/App/intaleq_driver/android/app/.cxx/Debug/2j1f5m6a/arm64-v8a/CMakeFiles/edit_cache.dir +/Users/hamzaaleghwairyeen/development/App/intaleq_driver/android/app/.cxx/Debug/2j1f5m6a/arm64-v8a/CMakeFiles/rebuild_cache.dir diff --git a/siro_driver/android/app/.cxx/Debug/2j1f5m6a/arm64-v8a/CMakeFiles/cmake.check_cache b/siro_driver/android/app/.cxx/Debug/2j1f5m6a/arm64-v8a/CMakeFiles/cmake.check_cache new file mode 100644 index 0000000..3dccd73 --- /dev/null +++ b/siro_driver/android/app/.cxx/Debug/2j1f5m6a/arm64-v8a/CMakeFiles/cmake.check_cache @@ -0,0 +1 @@ +# This file is generated by cmake for dependency checking of the CMakeCache.txt file diff --git a/siro_driver/android/app/.cxx/Debug/2j1f5m6a/arm64-v8a/CMakeFiles/native-lib.dir/native-lib.cpp.o b/siro_driver/android/app/.cxx/Debug/2j1f5m6a/arm64-v8a/CMakeFiles/native-lib.dir/native-lib.cpp.o new file mode 100644 index 0000000..00d487a Binary files /dev/null and b/siro_driver/android/app/.cxx/Debug/2j1f5m6a/arm64-v8a/CMakeFiles/native-lib.dir/native-lib.cpp.o differ diff --git a/siro_driver/android/app/.cxx/Debug/2j1f5m6a/arm64-v8a/CMakeFiles/rules.ninja b/siro_driver/android/app/.cxx/Debug/2j1f5m6a/arm64-v8a/CMakeFiles/rules.ninja new file mode 100644 index 0000000..4cd4721 --- /dev/null +++ b/siro_driver/android/app/.cxx/Debug/2j1f5m6a/arm64-v8a/CMakeFiles/rules.ninja @@ -0,0 +1,66 @@ +# CMAKE generated file: DO NOT EDIT! +# Generated by "Ninja" Generator, CMake Version 3.31 + +# This file contains all the rules used to get the outputs files +# built from the input files. +# It is included in the main 'build.ninja'. + +# ============================================================================= +# Project: intaleq_driver +# Configurations: Debug +# ============================================================================= +# ============================================================================= + +############################################# +# Rule for compiling CXX files. + +rule CXX_COMPILER__native-lib_unscanned_Debug + depfile = $DEP_FILE + deps = gcc + command = ${LAUNCHER}${CODE_CHECK}/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/bin/clang++ --target=aarch64-none-linux-android23 --sysroot=/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot $DEFINES $INCLUDES $FLAGS -MD -MT $out -MF $DEP_FILE -o $out -c $in + description = Building CXX object $out + + +############################################# +# Rule for linking CXX shared library. + +rule CXX_SHARED_LIBRARY_LINKER__native-lib_Debug + depfile = $DEP_FILE + deps = gcc + command = $PRE_LINK && /Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/bin/clang++ --target=aarch64-none-linux-android23 --sysroot=/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot -fPIC $LANGUAGE_COMPILE_FLAGS $ARCH_FLAGS $LINK_FLAGS -shared $SONAME_FLAG$SONAME -o $TARGET_FILE $in $LINK_PATH $LINK_LIBRARIES && $POST_BUILD + description = Linking CXX shared library $TARGET_FILE + restat = $RESTAT + + +############################################# +# Rule for running custom commands. + +rule CUSTOM_COMMAND + command = $COMMAND + description = $DESC + + +############################################# +# Rule for re-running cmake. + +rule RERUN_CMAKE + command = /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/bin/cmake --regenerate-during-build -S/Users/hamzaaleghwairyeen/development/App/intaleq_driver/android/app/src/main/cpp -B/Users/hamzaaleghwairyeen/development/App/intaleq_driver/android/app/.cxx/Debug/2j1f5m6a/arm64-v8a + description = Re-running CMake... + generator = 1 + + +############################################# +# Rule for cleaning all built files. + +rule CLEAN + command = /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/bin/ninja $FILE_ARG -t clean $TARGETS + description = Cleaning all built files... + + +############################################# +# Rule for printing all primary targets available. + +rule HELP + command = /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/bin/ninja -t targets + description = All primary targets available: + diff --git a/siro_driver/android/app/.cxx/Debug/2j1f5m6a/arm64-v8a/additional_project_files.txt b/siro_driver/android/app/.cxx/Debug/2j1f5m6a/arm64-v8a/additional_project_files.txt new file mode 100644 index 0000000..e69de29 diff --git a/siro_driver/android/app/.cxx/Debug/2j1f5m6a/arm64-v8a/android_gradle_build.json b/siro_driver/android/app/.cxx/Debug/2j1f5m6a/arm64-v8a/android_gradle_build.json new file mode 100644 index 0000000..4568d79 --- /dev/null +++ b/siro_driver/android/app/.cxx/Debug/2j1f5m6a/arm64-v8a/android_gradle_build.json @@ -0,0 +1,38 @@ +{ + "buildFiles": [ + "/Users/hamzaaleghwairyeen/development/App/intaleq_driver/android/app/src/main/cpp/CMakeLists.txt" + ], + "cleanCommandsComponents": [ + [ + "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/bin/ninja", + "-C", + "/Users/hamzaaleghwairyeen/development/App/intaleq_driver/android/app/.cxx/Debug/2j1f5m6a/arm64-v8a", + "clean" + ] + ], + "buildTargetsCommandComponents": [ + "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/bin/ninja", + "-C", + "/Users/hamzaaleghwairyeen/development/App/intaleq_driver/android/app/.cxx/Debug/2j1f5m6a/arm64-v8a", + "{LIST_OF_TARGETS_TO_BUILD}" + ], + "libraries": { + "native-lib::@6890427a1f51a3e7e1df": { + "toolchain": "toolchain", + "abi": "arm64-v8a", + "artifactName": "native-lib", + "output": "/Users/hamzaaleghwairyeen/development/App/intaleq_driver/build/app/intermediates/cxx/Debug/2j1f5m6a/obj/arm64-v8a/libnative-lib.so", + "runtimeFiles": [] + } + }, + "toolchains": { + "toolchain": { + "cCompilerExecutable": "/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/bin/clang.lld", + "cppCompilerExecutable": "/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/bin/clang++.lld" + } + }, + "cFileExtensions": [], + "cppFileExtensions": [ + "cpp" + ] +} \ No newline at end of file diff --git a/siro_driver/android/app/.cxx/Debug/2j1f5m6a/arm64-v8a/android_gradle_build_mini.json b/siro_driver/android/app/.cxx/Debug/2j1f5m6a/arm64-v8a/android_gradle_build_mini.json new file mode 100644 index 0000000..fb74baa --- /dev/null +++ b/siro_driver/android/app/.cxx/Debug/2j1f5m6a/arm64-v8a/android_gradle_build_mini.json @@ -0,0 +1,27 @@ +{ + "buildFiles": [ + "/Users/hamzaaleghwairyeen/development/App/intaleq_driver/android/app/src/main/cpp/CMakeLists.txt" + ], + "cleanCommandsComponents": [ + [ + "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/bin/ninja", + "-C", + "/Users/hamzaaleghwairyeen/development/App/intaleq_driver/android/app/.cxx/Debug/2j1f5m6a/arm64-v8a", + "clean" + ] + ], + "buildTargetsCommandComponents": [ + "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/bin/ninja", + "-C", + "/Users/hamzaaleghwairyeen/development/App/intaleq_driver/android/app/.cxx/Debug/2j1f5m6a/arm64-v8a", + "{LIST_OF_TARGETS_TO_BUILD}" + ], + "libraries": { + "native-lib::@6890427a1f51a3e7e1df": { + "artifactName": "native-lib", + "abi": "arm64-v8a", + "output": "/Users/hamzaaleghwairyeen/development/App/intaleq_driver/build/app/intermediates/cxx/Debug/2j1f5m6a/obj/arm64-v8a/libnative-lib.so", + "runtimeFiles": [] + } + } +} \ No newline at end of file diff --git a/siro_driver/android/app/.cxx/Debug/2j1f5m6a/arm64-v8a/build.ninja b/siro_driver/android/app/.cxx/Debug/2j1f5m6a/arm64-v8a/build.ninja new file mode 100644 index 0000000..0770ad7 --- /dev/null +++ b/siro_driver/android/app/.cxx/Debug/2j1f5m6a/arm64-v8a/build.ninja @@ -0,0 +1,156 @@ +# CMAKE generated file: DO NOT EDIT! +# Generated by "Ninja" Generator, CMake Version 3.31 + +# This file contains all the build statements describing the +# compilation DAG. + +# ============================================================================= +# Write statements declared in CMakeLists.txt: +# +# Which is the root file. +# ============================================================================= + +# ============================================================================= +# Project: intaleq_driver +# Configurations: Debug +# ============================================================================= + +############################################# +# Minimal version of Ninja required by this file + +ninja_required_version = 1.5 + + +############################################# +# Set configuration variable for custom commands. + +CONFIGURATION = Debug +# ============================================================================= +# Include auxiliary files. + + +############################################# +# Include rules file. + +include CMakeFiles/rules.ninja + +# ============================================================================= + +############################################# +# Logical path to working directory; prefix for absolute paths. + +cmake_ninja_workdir = /Users/hamzaaleghwairyeen/development/App/intaleq_driver/android/app/.cxx/Debug/2j1f5m6a/arm64-v8a/ +# ============================================================================= +# Object build statements for SHARED_LIBRARY target native-lib + + +############################################# +# Order-only phony target for native-lib + +build cmake_object_order_depends_target_native-lib: phony || . + +build CMakeFiles/native-lib.dir/native-lib.cpp.o: CXX_COMPILER__native-lib_unscanned_Debug /Users/hamzaaleghwairyeen/development/App/intaleq_driver/android/app/src/main/cpp/native-lib.cpp || cmake_object_order_depends_target_native-lib + DEFINES = -Dnative_lib_EXPORTS + DEP_FILE = CMakeFiles/native-lib.dir/native-lib.cpp.o.d + FLAGS = -g -DANDROID -fdata-sections -ffunction-sections -funwind-tables -fstack-protector-strong -no-canonical-prefixes -D_FORTIFY_SOURCE=2 -Wformat -Werror=format-security -fno-limit-debug-info -fPIC + OBJECT_DIR = CMakeFiles/native-lib.dir + OBJECT_FILE_DIR = CMakeFiles/native-lib.dir + TARGET_COMPILE_PDB = CMakeFiles/native-lib.dir/ + TARGET_PDB = /Users/hamzaaleghwairyeen/development/App/intaleq_driver/build/app/intermediates/cxx/Debug/2j1f5m6a/obj/arm64-v8a/libnative-lib.pdb + + +# ============================================================================= +# Link build statements for SHARED_LIBRARY target native-lib + + +############################################# +# Link the shared library /Users/hamzaaleghwairyeen/development/App/intaleq_driver/build/app/intermediates/cxx/Debug/2j1f5m6a/obj/arm64-v8a/libnative-lib.so + +build /Users/hamzaaleghwairyeen/development/App/intaleq_driver/build/app/intermediates/cxx/Debug/2j1f5m6a/obj/arm64-v8a/libnative-lib.so: CXX_SHARED_LIBRARY_LINKER__native-lib_Debug CMakeFiles/native-lib.dir/native-lib.cpp.o | /Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/lib/aarch64-linux-android/23/liblog.so + DEP_FILE = CMakeFiles/native-lib.dir/link.d + LANGUAGE_COMPILE_FLAGS = -g -DANDROID -fdata-sections -ffunction-sections -funwind-tables -fstack-protector-strong -no-canonical-prefixes -D_FORTIFY_SOURCE=2 -Wformat -Werror=format-security -fno-limit-debug-info + LINK_FLAGS = -static-libstdc++ -Wl,--build-id=sha1 -Wl,--no-rosegment -Wl,--no-undefined-version -Wl,--fatal-warnings -Wl,--no-undefined -Qunused-arguments -Xlinker --dependency-file=CMakeFiles/native-lib.dir/link.d + LINK_LIBRARIES = /Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/lib/aarch64-linux-android/23/liblog.so -latomic -lm + OBJECT_DIR = CMakeFiles/native-lib.dir + POST_BUILD = : + PRE_LINK = : + SONAME = libnative-lib.so + SONAME_FLAG = -Wl,-soname, + TARGET_COMPILE_PDB = CMakeFiles/native-lib.dir/ + TARGET_FILE = /Users/hamzaaleghwairyeen/development/App/intaleq_driver/build/app/intermediates/cxx/Debug/2j1f5m6a/obj/arm64-v8a/libnative-lib.so + TARGET_PDB = /Users/hamzaaleghwairyeen/development/App/intaleq_driver/build/app/intermediates/cxx/Debug/2j1f5m6a/obj/arm64-v8a/libnative-lib.pdb + + +############################################# +# Utility command for edit_cache + +build CMakeFiles/edit_cache.util: CUSTOM_COMMAND + COMMAND = cd /Users/hamzaaleghwairyeen/development/App/intaleq_driver/android/app/.cxx/Debug/2j1f5m6a/arm64-v8a && /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/bin/ccmake -S/Users/hamzaaleghwairyeen/development/App/intaleq_driver/android/app/src/main/cpp -B/Users/hamzaaleghwairyeen/development/App/intaleq_driver/android/app/.cxx/Debug/2j1f5m6a/arm64-v8a + DESC = Running CMake cache editor... + pool = console + restat = 1 + +build edit_cache: phony CMakeFiles/edit_cache.util + + +############################################# +# Utility command for rebuild_cache + +build CMakeFiles/rebuild_cache.util: CUSTOM_COMMAND + COMMAND = cd /Users/hamzaaleghwairyeen/development/App/intaleq_driver/android/app/.cxx/Debug/2j1f5m6a/arm64-v8a && /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/bin/cmake --regenerate-during-build -S/Users/hamzaaleghwairyeen/development/App/intaleq_driver/android/app/src/main/cpp -B/Users/hamzaaleghwairyeen/development/App/intaleq_driver/android/app/.cxx/Debug/2j1f5m6a/arm64-v8a + DESC = Running CMake to regenerate build system... + pool = console + restat = 1 + +build rebuild_cache: phony CMakeFiles/rebuild_cache.util + +# ============================================================================= +# Target aliases. + +build libnative-lib.so: phony /Users/hamzaaleghwairyeen/development/App/intaleq_driver/build/app/intermediates/cxx/Debug/2j1f5m6a/obj/arm64-v8a/libnative-lib.so + +build native-lib: phony /Users/hamzaaleghwairyeen/development/App/intaleq_driver/build/app/intermediates/cxx/Debug/2j1f5m6a/obj/arm64-v8a/libnative-lib.so + +# ============================================================================= +# Folder targets. + +# ============================================================================= + +############################################# +# Folder: /Users/hamzaaleghwairyeen/development/App/intaleq_driver/android/app/.cxx/Debug/2j1f5m6a/arm64-v8a + +build all: phony /Users/hamzaaleghwairyeen/development/App/intaleq_driver/build/app/intermediates/cxx/Debug/2j1f5m6a/obj/arm64-v8a/libnative-lib.so + +# ============================================================================= +# Built-in targets + + +############################################# +# Re-run CMake if any of its inputs changed. + +build build.ninja: RERUN_CMAKE | /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeCCompiler.cmake.in /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeCCompilerABI.c /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeCInformation.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeCXXCompiler.cmake.in /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeCXXCompilerABI.cpp /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeCXXInformation.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeCommonLanguageInclude.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeCompilerIdDetection.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeDetermineCCompiler.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeDetermineCXXCompiler.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeDetermineCompiler.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeDetermineCompilerABI.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeDetermineCompilerId.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeDetermineCompilerSupport.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeDetermineSystem.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeFindBinUtils.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeGenericSystem.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeInitializeConfigs.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeLanguageInformation.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeParseImplicitIncludeInfo.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeParseImplicitLinkInfo.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeParseLibraryArchitecture.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeSystem.cmake.in /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeSystemSpecificInformation.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeSystemSpecificInitialize.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeTestCCompiler.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeTestCXXCompiler.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeTestCompilerCommon.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/ADSP-DetermineCompiler.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/ARMCC-DetermineCompiler.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/ARMClang-DetermineCompiler.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/AppleClang-DetermineCompiler.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/Borland-DetermineCompiler.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/Bruce-C-DetermineCompiler.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/CMakeCommonCompilerMacros.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/Clang-C.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/Clang-CXX-CXXImportStd.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/Clang-CXX.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/Clang-DetermineCompiler.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/Clang-DetermineCompilerInternal.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/Clang-FindBinUtils.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/Clang.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/Compaq-C-DetermineCompiler.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/Compaq-CXX-DetermineCompiler.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/Cray-DetermineCompiler.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/CrayClang-DetermineCompiler.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/Embarcadero-DetermineCompiler.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/Fujitsu-DetermineCompiler.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/FujitsuClang-DetermineCompiler.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/GHS-DetermineCompiler.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/GNU-C-DetermineCompiler.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/GNU-CXX-DetermineCompiler.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/GNU.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/HP-C-DetermineCompiler.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/HP-CXX-DetermineCompiler.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/IAR-DetermineCompiler.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/IBMCPP-C-DetermineVersionInternal.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/IBMCPP-CXX-DetermineVersionInternal.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/IBMClang-C-DetermineCompiler.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/IBMClang-CXX-DetermineCompiler.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/Intel-DetermineCompiler.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/IntelLLVM-DetermineCompiler.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/LCC-C-DetermineCompiler.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/LCC-CXX-DetermineCompiler.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/MSVC-DetermineCompiler.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/NVHPC-DetermineCompiler.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/NVIDIA-DetermineCompiler.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/OpenWatcom-DetermineCompiler.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/OrangeC-DetermineCompiler.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/PGI-DetermineCompiler.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/PathScale-DetermineCompiler.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/SCO-DetermineCompiler.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/SDCC-C-DetermineCompiler.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/SunPro-C-DetermineCompiler.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/SunPro-CXX-DetermineCompiler.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/TI-DetermineCompiler.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/TIClang-DetermineCompiler.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/Tasking-DetermineCompiler.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/TinyCC-C-DetermineCompiler.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/VisualAge-C-DetermineCompiler.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/VisualAge-CXX-DetermineCompiler.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/Watcom-DetermineCompiler.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/XL-C-DetermineCompiler.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/XL-CXX-DetermineCompiler.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/XLClang-C-DetermineCompiler.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/XLClang-CXX-DetermineCompiler.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/zOS-C-DetermineCompiler.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/zOS-CXX-DetermineCompiler.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Internal/CMakeCLinkerInformation.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Internal/CMakeCXXLinkerInformation.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Internal/CMakeCommonLinkerInformation.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Internal/CMakeDetermineLinkerId.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Internal/FeatureTesting.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Linker/GNU.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Linker/LLD-C.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Linker/LLD-CXX.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Linker/LLD.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Platform/Android-Clang-C.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Platform/Android-Clang-CXX.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Platform/Android-Clang.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Platform/Android-Determine-C.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Platform/Android-Determine-CXX.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Platform/Android-Determine.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Platform/Android-Initialize.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Platform/Android.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Platform/Android/Determine-Compiler.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Platform/Linker/Android-LLD-C.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Platform/Linker/Android-LLD-CXX.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Platform/Linker/GNU.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Platform/Linker/Linux-GNU.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Platform/Linker/Linux-LLD-C.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Platform/Linker/Linux-LLD-CXX.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Platform/Linker/Linux-LLD.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Platform/Linux-Initialize.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Platform/Linux.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Platform/UnixPaths.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/build/cmake/abis.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/build/cmake/android-legacy.toolchain.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/build/cmake/android.toolchain.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/build/cmake/flags.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/build/cmake/hooks/pre/Android-Clang.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/build/cmake/hooks/pre/Android-Determine.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/build/cmake/hooks/pre/Android-Initialize.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/build/cmake/hooks/pre/Android.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/build/cmake/hooks/pre/Determine-Compiler.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/build/cmake/platforms.cmake /Users/hamzaaleghwairyeen/development/App/intaleq_driver/android/app/src/main/cpp/CMakeLists.txt CMakeCache.txt CMakeFiles/3.31.5-g6cf5163/CMakeCCompiler.cmake CMakeFiles/3.31.5-g6cf5163/CMakeCXXCompiler.cmake CMakeFiles/3.31.5-g6cf5163/CMakeSystem.cmake + pool = console + + +############################################# +# A missing CMake input file is not an error. + +build /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeCCompiler.cmake.in /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeCCompilerABI.c /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeCInformation.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeCXXCompiler.cmake.in /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeCXXCompilerABI.cpp /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeCXXInformation.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeCommonLanguageInclude.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeCompilerIdDetection.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeDetermineCCompiler.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeDetermineCXXCompiler.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeDetermineCompiler.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeDetermineCompilerABI.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeDetermineCompilerId.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeDetermineCompilerSupport.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeDetermineSystem.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeFindBinUtils.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeGenericSystem.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeInitializeConfigs.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeLanguageInformation.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeParseImplicitIncludeInfo.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeParseImplicitLinkInfo.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeParseLibraryArchitecture.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeSystem.cmake.in /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeSystemSpecificInformation.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeSystemSpecificInitialize.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeTestCCompiler.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeTestCXXCompiler.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeTestCompilerCommon.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/ADSP-DetermineCompiler.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/ARMCC-DetermineCompiler.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/ARMClang-DetermineCompiler.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/AppleClang-DetermineCompiler.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/Borland-DetermineCompiler.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/Bruce-C-DetermineCompiler.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/CMakeCommonCompilerMacros.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/Clang-C.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/Clang-CXX-CXXImportStd.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/Clang-CXX.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/Clang-DetermineCompiler.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/Clang-DetermineCompilerInternal.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/Clang-FindBinUtils.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/Clang.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/Compaq-C-DetermineCompiler.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/Compaq-CXX-DetermineCompiler.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/Cray-DetermineCompiler.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/CrayClang-DetermineCompiler.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/Embarcadero-DetermineCompiler.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/Fujitsu-DetermineCompiler.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/FujitsuClang-DetermineCompiler.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/GHS-DetermineCompiler.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/GNU-C-DetermineCompiler.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/GNU-CXX-DetermineCompiler.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/GNU.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/HP-C-DetermineCompiler.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/HP-CXX-DetermineCompiler.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/IAR-DetermineCompiler.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/IBMCPP-C-DetermineVersionInternal.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/IBMCPP-CXX-DetermineVersionInternal.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/IBMClang-C-DetermineCompiler.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/IBMClang-CXX-DetermineCompiler.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/Intel-DetermineCompiler.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/IntelLLVM-DetermineCompiler.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/LCC-C-DetermineCompiler.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/LCC-CXX-DetermineCompiler.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/MSVC-DetermineCompiler.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/NVHPC-DetermineCompiler.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/NVIDIA-DetermineCompiler.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/OpenWatcom-DetermineCompiler.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/OrangeC-DetermineCompiler.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/PGI-DetermineCompiler.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/PathScale-DetermineCompiler.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/SCO-DetermineCompiler.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/SDCC-C-DetermineCompiler.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/SunPro-C-DetermineCompiler.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/SunPro-CXX-DetermineCompiler.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/TI-DetermineCompiler.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/TIClang-DetermineCompiler.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/Tasking-DetermineCompiler.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/TinyCC-C-DetermineCompiler.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/VisualAge-C-DetermineCompiler.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/VisualAge-CXX-DetermineCompiler.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/Watcom-DetermineCompiler.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/XL-C-DetermineCompiler.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/XL-CXX-DetermineCompiler.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/XLClang-C-DetermineCompiler.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/XLClang-CXX-DetermineCompiler.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/zOS-C-DetermineCompiler.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/zOS-CXX-DetermineCompiler.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Internal/CMakeCLinkerInformation.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Internal/CMakeCXXLinkerInformation.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Internal/CMakeCommonLinkerInformation.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Internal/CMakeDetermineLinkerId.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Internal/FeatureTesting.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Linker/GNU.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Linker/LLD-C.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Linker/LLD-CXX.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Linker/LLD.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Platform/Android-Clang-C.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Platform/Android-Clang-CXX.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Platform/Android-Clang.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Platform/Android-Determine-C.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Platform/Android-Determine-CXX.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Platform/Android-Determine.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Platform/Android-Initialize.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Platform/Android.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Platform/Android/Determine-Compiler.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Platform/Linker/Android-LLD-C.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Platform/Linker/Android-LLD-CXX.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Platform/Linker/GNU.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Platform/Linker/Linux-GNU.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Platform/Linker/Linux-LLD-C.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Platform/Linker/Linux-LLD-CXX.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Platform/Linker/Linux-LLD.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Platform/Linux-Initialize.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Platform/Linux.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Platform/UnixPaths.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/build/cmake/abis.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/build/cmake/android-legacy.toolchain.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/build/cmake/android.toolchain.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/build/cmake/flags.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/build/cmake/hooks/pre/Android-Clang.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/build/cmake/hooks/pre/Android-Determine.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/build/cmake/hooks/pre/Android-Initialize.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/build/cmake/hooks/pre/Android.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/build/cmake/hooks/pre/Determine-Compiler.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/build/cmake/platforms.cmake /Users/hamzaaleghwairyeen/development/App/intaleq_driver/android/app/src/main/cpp/CMakeLists.txt CMakeCache.txt CMakeFiles/3.31.5-g6cf5163/CMakeCCompiler.cmake CMakeFiles/3.31.5-g6cf5163/CMakeCXXCompiler.cmake CMakeFiles/3.31.5-g6cf5163/CMakeSystem.cmake: phony + + +############################################# +# Clean all the built files. + +build clean: CLEAN + + +############################################# +# Print all primary targets available. + +build help: HELP + + +############################################# +# Make the all target the default. + +default all diff --git a/siro_driver/android/app/.cxx/Debug/2j1f5m6a/arm64-v8a/build_file_index.txt b/siro_driver/android/app/.cxx/Debug/2j1f5m6a/arm64-v8a/build_file_index.txt new file mode 100644 index 0000000..b1ca0fa --- /dev/null +++ b/siro_driver/android/app/.cxx/Debug/2j1f5m6a/arm64-v8a/build_file_index.txt @@ -0,0 +1 @@ +/Users/hamzaaleghwairyeen/development/App/intaleq_driver/android/app/src/main/cpp/CMakeLists.txt \ No newline at end of file diff --git a/siro_driver/android/app/.cxx/Debug/2j1f5m6a/arm64-v8a/cmake_install.cmake b/siro_driver/android/app/.cxx/Debug/2j1f5m6a/arm64-v8a/cmake_install.cmake new file mode 100644 index 0000000..f701567 --- /dev/null +++ b/siro_driver/android/app/.cxx/Debug/2j1f5m6a/arm64-v8a/cmake_install.cmake @@ -0,0 +1,66 @@ +# Install script for directory: /Users/hamzaaleghwairyeen/development/App/intaleq_driver/android/app/src/main/cpp + +# Set the install prefix +if(NOT DEFINED CMAKE_INSTALL_PREFIX) + set(CMAKE_INSTALL_PREFIX "/usr/local") +endif() +string(REGEX REPLACE "/$" "" CMAKE_INSTALL_PREFIX "${CMAKE_INSTALL_PREFIX}") + +# Set the install configuration name. +if(NOT DEFINED CMAKE_INSTALL_CONFIG_NAME) + if(BUILD_TYPE) + string(REGEX REPLACE "^[^A-Za-z0-9_]+" "" + CMAKE_INSTALL_CONFIG_NAME "${BUILD_TYPE}") + else() + set(CMAKE_INSTALL_CONFIG_NAME "Debug") + endif() + message(STATUS "Install configuration: \"${CMAKE_INSTALL_CONFIG_NAME}\"") +endif() + +# Set the component getting installed. +if(NOT CMAKE_INSTALL_COMPONENT) + if(COMPONENT) + message(STATUS "Install component: \"${COMPONENT}\"") + set(CMAKE_INSTALL_COMPONENT "${COMPONENT}") + else() + set(CMAKE_INSTALL_COMPONENT) + endif() +endif() + +# Install shared libraries without execute permission? +if(NOT DEFINED CMAKE_INSTALL_SO_NO_EXE) + set(CMAKE_INSTALL_SO_NO_EXE "0") +endif() + +# Is this installation the result of a crosscompile? +if(NOT DEFINED CMAKE_CROSSCOMPILING) + set(CMAKE_CROSSCOMPILING "TRUE") +endif() + +# Set path to fallback-tool for dependency-resolution. +if(NOT DEFINED CMAKE_OBJDUMP) + set(CMAKE_OBJDUMP "/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/bin/llvm-objdump") +endif() + +string(REPLACE ";" "\n" CMAKE_INSTALL_MANIFEST_CONTENT + "${CMAKE_INSTALL_MANIFEST_FILES}") +if(CMAKE_INSTALL_LOCAL_ONLY) + file(WRITE "/Users/hamzaaleghwairyeen/development/App/intaleq_driver/android/app/.cxx/Debug/2j1f5m6a/arm64-v8a/install_local_manifest.txt" + "${CMAKE_INSTALL_MANIFEST_CONTENT}") +endif() +if(CMAKE_INSTALL_COMPONENT) + if(CMAKE_INSTALL_COMPONENT MATCHES "^[a-zA-Z0-9_.+-]+$") + set(CMAKE_INSTALL_MANIFEST "install_manifest_${CMAKE_INSTALL_COMPONENT}.txt") + else() + string(MD5 CMAKE_INST_COMP_HASH "${CMAKE_INSTALL_COMPONENT}") + set(CMAKE_INSTALL_MANIFEST "install_manifest_${CMAKE_INST_COMP_HASH}.txt") + unset(CMAKE_INST_COMP_HASH) + endif() +else() + set(CMAKE_INSTALL_MANIFEST "install_manifest.txt") +endif() + +if(NOT CMAKE_INSTALL_LOCAL_ONLY) + file(WRITE "/Users/hamzaaleghwairyeen/development/App/intaleq_driver/android/app/.cxx/Debug/2j1f5m6a/arm64-v8a/${CMAKE_INSTALL_MANIFEST}" + "${CMAKE_INSTALL_MANIFEST_CONTENT}") +endif() diff --git a/siro_driver/android/app/.cxx/Debug/2j1f5m6a/arm64-v8a/compile_commands.json b/siro_driver/android/app/.cxx/Debug/2j1f5m6a/arm64-v8a/compile_commands.json new file mode 100644 index 0000000..230c355 --- /dev/null +++ b/siro_driver/android/app/.cxx/Debug/2j1f5m6a/arm64-v8a/compile_commands.json @@ -0,0 +1,8 @@ +[ +{ + "directory": "/Users/hamzaaleghwairyeen/development/App/intaleq_driver/android/app/.cxx/Debug/2j1f5m6a/arm64-v8a", + "command": "/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/bin/clang++ --target=aarch64-none-linux-android23 --sysroot=/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot -Dnative_lib_EXPORTS -g -DANDROID -fdata-sections -ffunction-sections -funwind-tables -fstack-protector-strong -no-canonical-prefixes -D_FORTIFY_SOURCE=2 -Wformat -Werror=format-security -fno-limit-debug-info -fPIC -o CMakeFiles/native-lib.dir/native-lib.cpp.o -c /Users/hamzaaleghwairyeen/development/App/intaleq_driver/android/app/src/main/cpp/native-lib.cpp", + "file": "/Users/hamzaaleghwairyeen/development/App/intaleq_driver/android/app/src/main/cpp/native-lib.cpp", + "output": "CMakeFiles/native-lib.dir/native-lib.cpp.o" +} +] \ No newline at end of file diff --git a/siro_driver/android/app/.cxx/Debug/2j1f5m6a/arm64-v8a/compile_commands.json.bin b/siro_driver/android/app/.cxx/Debug/2j1f5m6a/arm64-v8a/compile_commands.json.bin new file mode 100644 index 0000000..068ad11 Binary files /dev/null and b/siro_driver/android/app/.cxx/Debug/2j1f5m6a/arm64-v8a/compile_commands.json.bin differ diff --git a/siro_driver/android/app/.cxx/Debug/2j1f5m6a/arm64-v8a/configure_fingerprint.bin b/siro_driver/android/app/.cxx/Debug/2j1f5m6a/arm64-v8a/configure_fingerprint.bin new file mode 100644 index 0000000..6e3cc41 --- /dev/null +++ b/siro_driver/android/app/.cxx/Debug/2j1f5m6a/arm64-v8a/configure_fingerprint.bin @@ -0,0 +1,28 @@ +C/C++ Structured Log + +/Users/hamzaaleghwairyeen/development/App/intaleq_driver/android/app/.cxx/Debug/2j1f5m6a/arm64-v8a/additional_project_files.txtC +A +?com.android.build.gradle.internal.cxx.io.EncodedFileFingerPrint  3  Ӂ3 +~ +|/Users/hamzaaleghwairyeen/development/App/intaleq_driver/android/app/.cxx/Debug/2j1f5m6a/arm64-v8a/android_gradle_build.json  3 忄Ӂ3 + +/Users/hamzaaleghwairyeen/development/App/intaleq_driver/android/app/.cxx/Debug/2j1f5m6a/arm64-v8a/android_gradle_build_mini.json  3 „Ӂ3r +p +n/Users/hamzaaleghwairyeen/development/App/intaleq_driver/android/app/.cxx/Debug/2j1f5m6a/arm64-v8a/build.ninja  3 ۸Ӂ3v +t +r/Users/hamzaaleghwairyeen/development/App/intaleq_driver/android/app/.cxx/Debug/2j1f5m6a/arm64-v8a/build.ninja.txt  3{ +y +w/Users/hamzaaleghwairyeen/development/App/intaleq_driver/android/app/.cxx/Debug/2j1f5m6a/arm64-v8a/build_file_index.txt  3 ` „Ӂ3| +z +x/Users/hamzaaleghwairyeen/development/App/intaleq_driver/android/app/.cxx/Debug/2j1f5m6a/arm64-v8a/compile_commands.json  3 ڸӁ3 +~ +|/Users/hamzaaleghwairyeen/development/App/intaleq_driver/android/app/.cxx/Debug/2j1f5m6a/arm64-v8a/compile_commands.json.bin  3  ڸӁ3 + +/Users/hamzaaleghwairyeen/development/App/intaleq_driver/android/app/.cxx/Debug/2j1f5m6a/arm64-v8a/metadata_generation_command.txt  3 + „Ӂ3y +w +u/Users/hamzaaleghwairyeen/development/App/intaleq_driver/android/app/.cxx/Debug/2j1f5m6a/arm64-v8a/prefab_config.json  3  ( „Ӂ3~ +| +z/Users/hamzaaleghwairyeen/development/App/intaleq_driver/android/app/.cxx/Debug/2j1f5m6a/arm64-v8a/symbol_folder_index.txt  3  q „Ӂ3d +b +`/Users/hamzaaleghwairyeen/development/App/intaleq_driver/android/app/src/main/cpp/CMakeLists.txt  3  劝2 \ No newline at end of file diff --git a/siro_driver/android/app/.cxx/Debug/2j1f5m6a/arm64-v8a/metadata_generation_command.txt b/siro_driver/android/app/.cxx/Debug/2j1f5m6a/arm64-v8a/metadata_generation_command.txt new file mode 100644 index 0000000..a1a4e26 --- /dev/null +++ b/siro_driver/android/app/.cxx/Debug/2j1f5m6a/arm64-v8a/metadata_generation_command.txt @@ -0,0 +1,18 @@ + -H/Users/hamzaaleghwairyeen/development/App/intaleq_driver/android/app/src/main/cpp +-DCMAKE_SYSTEM_NAME=Android +-DCMAKE_EXPORT_COMPILE_COMMANDS=ON +-DCMAKE_SYSTEM_VERSION=23 +-DANDROID_PLATFORM=android-23 +-DANDROID_ABI=arm64-v8a +-DCMAKE_ANDROID_ARCH_ABI=arm64-v8a +-DANDROID_NDK=/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973 +-DCMAKE_ANDROID_NDK=/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973 +-DCMAKE_TOOLCHAIN_FILE=/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/build/cmake/android.toolchain.cmake +-DCMAKE_MAKE_PROGRAM=/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/bin/ninja +-DCMAKE_LIBRARY_OUTPUT_DIRECTORY=/Users/hamzaaleghwairyeen/development/App/intaleq_driver/build/app/intermediates/cxx/Debug/2j1f5m6a/obj/arm64-v8a +-DCMAKE_RUNTIME_OUTPUT_DIRECTORY=/Users/hamzaaleghwairyeen/development/App/intaleq_driver/build/app/intermediates/cxx/Debug/2j1f5m6a/obj/arm64-v8a +-DCMAKE_BUILD_TYPE=Debug +-B/Users/hamzaaleghwairyeen/development/App/intaleq_driver/android/app/.cxx/Debug/2j1f5m6a/arm64-v8a +-GNinja + Build command args: [] + Version: 2 \ No newline at end of file diff --git a/siro_driver/android/app/.cxx/Debug/2j1f5m6a/arm64-v8a/prefab_config.json b/siro_driver/android/app/.cxx/Debug/2j1f5m6a/arm64-v8a/prefab_config.json new file mode 100644 index 0000000..e799de8 --- /dev/null +++ b/siro_driver/android/app/.cxx/Debug/2j1f5m6a/arm64-v8a/prefab_config.json @@ -0,0 +1,4 @@ +{ + "enabled": false, + "packages": [] +} \ No newline at end of file diff --git a/siro_driver/android/app/.cxx/Debug/2j1f5m6a/arm64-v8a/symbol_folder_index.txt b/siro_driver/android/app/.cxx/Debug/2j1f5m6a/arm64-v8a/symbol_folder_index.txt new file mode 100644 index 0000000..634146f --- /dev/null +++ b/siro_driver/android/app/.cxx/Debug/2j1f5m6a/arm64-v8a/symbol_folder_index.txt @@ -0,0 +1 @@ +/Users/hamzaaleghwairyeen/development/App/intaleq_driver/build/app/intermediates/cxx/Debug/2j1f5m6a/obj/arm64-v8a \ No newline at end of file diff --git a/siro_driver/android/app/.cxx/Debug/2j1f5m6a/armeabi-v7a/.cmake/api/v1/query/client-agp/cache-v2 b/siro_driver/android/app/.cxx/Debug/2j1f5m6a/armeabi-v7a/.cmake/api/v1/query/client-agp/cache-v2 new file mode 100644 index 0000000..e69de29 diff --git a/siro_driver/android/app/.cxx/Debug/2j1f5m6a/armeabi-v7a/.cmake/api/v1/query/client-agp/cmakeFiles-v1 b/siro_driver/android/app/.cxx/Debug/2j1f5m6a/armeabi-v7a/.cmake/api/v1/query/client-agp/cmakeFiles-v1 new file mode 100644 index 0000000..e69de29 diff --git a/siro_driver/android/app/.cxx/Debug/2j1f5m6a/armeabi-v7a/.cmake/api/v1/query/client-agp/codemodel-v2 b/siro_driver/android/app/.cxx/Debug/2j1f5m6a/armeabi-v7a/.cmake/api/v1/query/client-agp/codemodel-v2 new file mode 100644 index 0000000..e69de29 diff --git a/siro_driver/android/app/.cxx/Debug/2j1f5m6a/armeabi-v7a/.cmake/api/v1/reply/cache-v2-aa9d167e8d32a264af7e.json b/siro_driver/android/app/.cxx/Debug/2j1f5m6a/armeabi-v7a/.cmake/api/v1/reply/cache-v2-aa9d167e8d32a264af7e.json new file mode 100644 index 0000000..95958a7 --- /dev/null +++ b/siro_driver/android/app/.cxx/Debug/2j1f5m6a/armeabi-v7a/.cmake/api/v1/reply/cache-v2-aa9d167e8d32a264af7e.json @@ -0,0 +1,1479 @@ +{ + "entries" : + [ + { + "name" : "ANDROID_ABI", + "properties" : + [ + { + "name" : "HELPSTRING", + "value" : "No help, variable specified on the command line." + } + ], + "type" : "UNINITIALIZED", + "value" : "armeabi-v7a" + }, + { + "name" : "ANDROID_NDK", + "properties" : + [ + { + "name" : "HELPSTRING", + "value" : "No help, variable specified on the command line." + } + ], + "type" : "UNINITIALIZED", + "value" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973" + }, + { + "name" : "ANDROID_PLATFORM", + "properties" : + [ + { + "name" : "HELPSTRING", + "value" : "No help, variable specified on the command line." + } + ], + "type" : "UNINITIALIZED", + "value" : "android-23" + }, + { + "name" : "CMAKE_ADDR2LINE", + "properties" : + [ + { + "name" : "ADVANCED", + "value" : "1" + }, + { + "name" : "HELPSTRING", + "value" : "Path to a program." + } + ], + "type" : "FILEPATH", + "value" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/bin/llvm-addr2line" + }, + { + "name" : "CMAKE_ANDROID_ARCH_ABI", + "properties" : + [ + { + "name" : "HELPSTRING", + "value" : "No help, variable specified on the command line." + } + ], + "type" : "UNINITIALIZED", + "value" : "armeabi-v7a" + }, + { + "name" : "CMAKE_ANDROID_NDK", + "properties" : + [ + { + "name" : "HELPSTRING", + "value" : "No help, variable specified on the command line." + } + ], + "type" : "UNINITIALIZED", + "value" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973" + }, + { + "name" : "CMAKE_AR", + "properties" : + [ + { + "name" : "ADVANCED", + "value" : "1" + }, + { + "name" : "HELPSTRING", + "value" : "Archiver" + } + ], + "type" : "FILEPATH", + "value" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/bin/llvm-ar" + }, + { + "name" : "CMAKE_ASM_FLAGS", + "properties" : + [ + { + "name" : "HELPSTRING", + "value" : "Flags used by the compiler during all build types." + } + ], + "type" : "STRING", + "value" : "" + }, + { + "name" : "CMAKE_ASM_FLAGS_DEBUG", + "properties" : + [ + { + "name" : "HELPSTRING", + "value" : "Flags used by the compiler during debug builds." + } + ], + "type" : "STRING", + "value" : "" + }, + { + "name" : "CMAKE_ASM_FLAGS_RELEASE", + "properties" : + [ + { + "name" : "HELPSTRING", + "value" : "Flags used by the compiler during release builds." + } + ], + "type" : "STRING", + "value" : "" + }, + { + "name" : "CMAKE_BUILD_TYPE", + "properties" : + [ + { + "name" : "HELPSTRING", + "value" : "Choose the type of build, options are: None Debug Release RelWithDebInfo MinSizeRel ..." + } + ], + "type" : "STRING", + "value" : "Debug" + }, + { + "name" : "CMAKE_CACHEFILE_DIR", + "properties" : + [ + { + "name" : "HELPSTRING", + "value" : "This is the directory where this CMakeCache.txt was created" + } + ], + "type" : "INTERNAL", + "value" : "/Users/hamzaaleghwairyeen/development/App/intaleq_driver/android/app/.cxx/Debug/2j1f5m6a/armeabi-v7a" + }, + { + "name" : "CMAKE_CACHE_MAJOR_VERSION", + "properties" : + [ + { + "name" : "HELPSTRING", + "value" : "Major version of cmake used to create the current loaded cache" + } + ], + "type" : "INTERNAL", + "value" : "3" + }, + { + "name" : "CMAKE_CACHE_MINOR_VERSION", + "properties" : + [ + { + "name" : "HELPSTRING", + "value" : "Minor version of cmake used to create the current loaded cache" + } + ], + "type" : "INTERNAL", + "value" : "31" + }, + { + "name" : "CMAKE_CACHE_PATCH_VERSION", + "properties" : + [ + { + "name" : "HELPSTRING", + "value" : "Patch version of cmake used to create the current loaded cache" + } + ], + "type" : "INTERNAL", + "value" : "5" + }, + { + "name" : "CMAKE_COMMAND", + "properties" : + [ + { + "name" : "HELPSTRING", + "value" : "Path to CMake executable." + } + ], + "type" : "INTERNAL", + "value" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/bin/cmake" + }, + { + "name" : "CMAKE_CPACK_COMMAND", + "properties" : + [ + { + "name" : "HELPSTRING", + "value" : "Path to cpack program executable." + } + ], + "type" : "INTERNAL", + "value" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/bin/cpack" + }, + { + "name" : "CMAKE_CTEST_COMMAND", + "properties" : + [ + { + "name" : "HELPSTRING", + "value" : "Path to ctest program executable." + } + ], + "type" : "INTERNAL", + "value" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/bin/ctest" + }, + { + "name" : "CMAKE_CXX_COMPILER", + "properties" : + [ + { + "name" : "ADVANCED", + "value" : "1" + }, + { + "name" : "HELPSTRING", + "value" : "" + } + ], + "type" : "UNINITIALIZED", + "value" : "" + }, + { + "name" : "CMAKE_CXX_COMPILER_AR", + "properties" : + [ + { + "name" : "ADVANCED", + "value" : "1" + }, + { + "name" : "HELPSTRING", + "value" : "LLVM archiver" + } + ], + "type" : "FILEPATH", + "value" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/bin/llvm-ar" + }, + { + "name" : "CMAKE_CXX_COMPILER_CLANG_SCAN_DEPS", + "properties" : + [ + { + "name" : "ADVANCED", + "value" : "1" + }, + { + "name" : "HELPSTRING", + "value" : "`clang-scan-deps` dependency scanner" + } + ], + "type" : "FILEPATH", + "value" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/bin/clang-scan-deps" + }, + { + "name" : "CMAKE_CXX_COMPILER_RANLIB", + "properties" : + [ + { + "name" : "ADVANCED", + "value" : "1" + }, + { + "name" : "HELPSTRING", + "value" : "Generate index for LLVM archive" + } + ], + "type" : "FILEPATH", + "value" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/bin/llvm-ranlib" + }, + { + "name" : "CMAKE_CXX_FLAGS", + "properties" : + [ + { + "name" : "ADVANCED", + "value" : "1" + }, + { + "name" : "HELPSTRING", + "value" : "Flags used by the compiler during all build types." + } + ], + "type" : "STRING", + "value" : "" + }, + { + "name" : "CMAKE_CXX_FLAGS_DEBUG", + "properties" : + [ + { + "name" : "ADVANCED", + "value" : "1" + }, + { + "name" : "HELPSTRING", + "value" : "Flags used by the compiler during debug builds." + } + ], + "type" : "STRING", + "value" : "" + }, + { + "name" : "CMAKE_CXX_FLAGS_MINSIZEREL", + "properties" : + [ + { + "name" : "ADVANCED", + "value" : "1" + }, + { + "name" : "HELPSTRING", + "value" : "Flags used by the CXX compiler during MINSIZEREL builds." + } + ], + "type" : "STRING", + "value" : "-Os -DNDEBUG" + }, + { + "name" : "CMAKE_CXX_FLAGS_RELEASE", + "properties" : + [ + { + "name" : "ADVANCED", + "value" : "1" + }, + { + "name" : "HELPSTRING", + "value" : "Flags used by the compiler during release builds." + } + ], + "type" : "STRING", + "value" : "" + }, + { + "name" : "CMAKE_CXX_FLAGS_RELWITHDEBINFO", + "properties" : + [ + { + "name" : "ADVANCED", + "value" : "1" + }, + { + "name" : "HELPSTRING", + "value" : "Flags used by the CXX compiler during RELWITHDEBINFO builds." + } + ], + "type" : "STRING", + "value" : "-O2 -g -DNDEBUG" + }, + { + "name" : "CMAKE_CXX_STANDARD_LIBRARIES", + "properties" : + [ + { + "name" : "ADVANCED", + "value" : "1" + }, + { + "name" : "HELPSTRING", + "value" : "Libraries linked by default with all C++ applications." + } + ], + "type" : "STRING", + "value" : "-latomic -lm" + }, + { + "name" : "CMAKE_C_COMPILER", + "properties" : + [ + { + "name" : "ADVANCED", + "value" : "1" + }, + { + "name" : "HELPSTRING", + "value" : "" + } + ], + "type" : "UNINITIALIZED", + "value" : "" + }, + { + "name" : "CMAKE_C_COMPILER_AR", + "properties" : + [ + { + "name" : "ADVANCED", + "value" : "1" + }, + { + "name" : "HELPSTRING", + "value" : "LLVM archiver" + } + ], + "type" : "FILEPATH", + "value" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/bin/llvm-ar" + }, + { + "name" : "CMAKE_C_COMPILER_CLANG_SCAN_DEPS", + "properties" : + [ + { + "name" : "ADVANCED", + "value" : "1" + }, + { + "name" : "HELPSTRING", + "value" : "`clang-scan-deps` dependency scanner" + } + ], + "type" : "FILEPATH", + "value" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/bin/clang-scan-deps" + }, + { + "name" : "CMAKE_C_COMPILER_RANLIB", + "properties" : + [ + { + "name" : "ADVANCED", + "value" : "1" + }, + { + "name" : "HELPSTRING", + "value" : "Generate index for LLVM archive" + } + ], + "type" : "FILEPATH", + "value" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/bin/llvm-ranlib" + }, + { + "name" : "CMAKE_C_FLAGS", + "properties" : + [ + { + "name" : "ADVANCED", + "value" : "1" + }, + { + "name" : "HELPSTRING", + "value" : "Flags used by the compiler during all build types." + } + ], + "type" : "STRING", + "value" : "" + }, + { + "name" : "CMAKE_C_FLAGS_DEBUG", + "properties" : + [ + { + "name" : "ADVANCED", + "value" : "1" + }, + { + "name" : "HELPSTRING", + "value" : "Flags used by the compiler during debug builds." + } + ], + "type" : "STRING", + "value" : "" + }, + { + "name" : "CMAKE_C_FLAGS_MINSIZEREL", + "properties" : + [ + { + "name" : "ADVANCED", + "value" : "1" + }, + { + "name" : "HELPSTRING", + "value" : "Flags used by the C compiler during MINSIZEREL builds." + } + ], + "type" : "STRING", + "value" : "-Os -DNDEBUG" + }, + { + "name" : "CMAKE_C_FLAGS_RELEASE", + "properties" : + [ + { + "name" : "ADVANCED", + "value" : "1" + }, + { + "name" : "HELPSTRING", + "value" : "Flags used by the compiler during release builds." + } + ], + "type" : "STRING", + "value" : "" + }, + { + "name" : "CMAKE_C_FLAGS_RELWITHDEBINFO", + "properties" : + [ + { + "name" : "ADVANCED", + "value" : "1" + }, + { + "name" : "HELPSTRING", + "value" : "Flags used by the C compiler during RELWITHDEBINFO builds." + } + ], + "type" : "STRING", + "value" : "-O2 -g -DNDEBUG" + }, + { + "name" : "CMAKE_C_STANDARD_LIBRARIES", + "properties" : + [ + { + "name" : "ADVANCED", + "value" : "1" + }, + { + "name" : "HELPSTRING", + "value" : "Libraries linked by default with all C applications." + } + ], + "type" : "STRING", + "value" : "-latomic -lm" + }, + { + "name" : "CMAKE_DLLTOOL", + "properties" : + [ + { + "name" : "ADVANCED", + "value" : "1" + }, + { + "name" : "HELPSTRING", + "value" : "Path to a program." + } + ], + "type" : "FILEPATH", + "value" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/bin/llvm-dlltool" + }, + { + "name" : "CMAKE_EDIT_COMMAND", + "properties" : + [ + { + "name" : "HELPSTRING", + "value" : "Path to cache edit program executable." + } + ], + "type" : "INTERNAL", + "value" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/bin/ccmake" + }, + { + "name" : "CMAKE_EXECUTABLE_FORMAT", + "properties" : + [ + { + "name" : "HELPSTRING", + "value" : "Executable file format" + } + ], + "type" : "INTERNAL", + "value" : "ELF" + }, + { + "name" : "CMAKE_EXE_LINKER_FLAGS", + "properties" : + [ + { + "name" : "ADVANCED", + "value" : "1" + }, + { + "name" : "HELPSTRING", + "value" : "Flags used by the linker." + } + ], + "type" : "STRING", + "value" : "" + }, + { + "name" : "CMAKE_EXE_LINKER_FLAGS_DEBUG", + "properties" : + [ + { + "name" : "ADVANCED", + "value" : "1" + }, + { + "name" : "HELPSTRING", + "value" : "Flags used by the linker during DEBUG builds." + } + ], + "type" : "STRING", + "value" : "" + }, + { + "name" : "CMAKE_EXE_LINKER_FLAGS_MINSIZEREL", + "properties" : + [ + { + "name" : "ADVANCED", + "value" : "1" + }, + { + "name" : "HELPSTRING", + "value" : "Flags used by the linker during MINSIZEREL builds." + } + ], + "type" : "STRING", + "value" : "" + }, + { + "name" : "CMAKE_EXE_LINKER_FLAGS_RELEASE", + "properties" : + [ + { + "name" : "ADVANCED", + "value" : "1" + }, + { + "name" : "HELPSTRING", + "value" : "Flags used by the linker during RELEASE builds." + } + ], + "type" : "STRING", + "value" : "" + }, + { + "name" : "CMAKE_EXE_LINKER_FLAGS_RELWITHDEBINFO", + "properties" : + [ + { + "name" : "ADVANCED", + "value" : "1" + }, + { + "name" : "HELPSTRING", + "value" : "Flags used by the linker during RELWITHDEBINFO builds." + } + ], + "type" : "STRING", + "value" : "" + }, + { + "name" : "CMAKE_EXPORT_BUILD_DATABASE", + "properties" : + [ + { + "name" : "ADVANCED", + "value" : "1" + }, + { + "name" : "HELPSTRING", + "value" : "Enable/Disable output of build database during the build." + } + ], + "type" : "BOOL", + "value" : "" + }, + { + "name" : "CMAKE_EXPORT_COMPILE_COMMANDS", + "properties" : + [ + { + "name" : "HELPSTRING", + "value" : "No help, variable specified on the command line." + } + ], + "type" : "UNINITIALIZED", + "value" : "ON" + }, + { + "name" : "CMAKE_EXTRA_GENERATOR", + "properties" : + [ + { + "name" : "HELPSTRING", + "value" : "Name of external makefile project generator." + } + ], + "type" : "INTERNAL", + "value" : "" + }, + { + "name" : "CMAKE_FIND_PACKAGE_REDIRECTS_DIR", + "properties" : + [ + { + "name" : "HELPSTRING", + "value" : "Value Computed by CMake." + } + ], + "type" : "STATIC", + "value" : "/Users/hamzaaleghwairyeen/development/App/intaleq_driver/android/app/.cxx/Debug/2j1f5m6a/armeabi-v7a/CMakeFiles/pkgRedirects" + }, + { + "name" : "CMAKE_GENERATOR", + "properties" : + [ + { + "name" : "HELPSTRING", + "value" : "Name of generator." + } + ], + "type" : "INTERNAL", + "value" : "Ninja" + }, + { + "name" : "CMAKE_GENERATOR_INSTANCE", + "properties" : + [ + { + "name" : "HELPSTRING", + "value" : "Generator instance identifier." + } + ], + "type" : "INTERNAL", + "value" : "" + }, + { + "name" : "CMAKE_GENERATOR_PLATFORM", + "properties" : + [ + { + "name" : "HELPSTRING", + "value" : "Name of generator platform." + } + ], + "type" : "INTERNAL", + "value" : "" + }, + { + "name" : "CMAKE_GENERATOR_TOOLSET", + "properties" : + [ + { + "name" : "HELPSTRING", + "value" : "Name of generator toolset." + } + ], + "type" : "INTERNAL", + "value" : "" + }, + { + "name" : "CMAKE_HOME_DIRECTORY", + "properties" : + [ + { + "name" : "HELPSTRING", + "value" : "Source directory with the top level CMakeLists.txt file for this project" + } + ], + "type" : "INTERNAL", + "value" : "/Users/hamzaaleghwairyeen/development/App/intaleq_driver/android/app/src/main/cpp" + }, + { + "name" : "CMAKE_INSTALL_PREFIX", + "properties" : + [ + { + "name" : "HELPSTRING", + "value" : "Install path prefix, prepended onto install directories." + } + ], + "type" : "PATH", + "value" : "/usr/local" + }, + { + "name" : "CMAKE_INSTALL_SO_NO_EXE", + "properties" : + [ + { + "name" : "HELPSTRING", + "value" : "Install .so files without execute permission." + } + ], + "type" : "INTERNAL", + "value" : "0" + }, + { + "name" : "CMAKE_LIBRARY_OUTPUT_DIRECTORY", + "properties" : + [ + { + "name" : "HELPSTRING", + "value" : "No help, variable specified on the command line." + } + ], + "type" : "UNINITIALIZED", + "value" : "/Users/hamzaaleghwairyeen/development/App/intaleq_driver/build/app/intermediates/cxx/Debug/2j1f5m6a/obj/armeabi-v7a" + }, + { + "name" : "CMAKE_LINKER", + "properties" : + [ + { + "name" : "ADVANCED", + "value" : "1" + }, + { + "name" : "HELPSTRING", + "value" : "Path to a program." + } + ], + "type" : "FILEPATH", + "value" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/bin/ld.lld" + }, + { + "name" : "CMAKE_MAKE_PROGRAM", + "properties" : + [ + { + "name" : "HELPSTRING", + "value" : "No help, variable specified on the command line." + } + ], + "type" : "UNINITIALIZED", + "value" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/bin/ninja" + }, + { + "name" : "CMAKE_MODULE_LINKER_FLAGS", + "properties" : + [ + { + "name" : "ADVANCED", + "value" : "1" + }, + { + "name" : "HELPSTRING", + "value" : "Flags used by the linker during the creation of modules." + } + ], + "type" : "STRING", + "value" : "" + }, + { + "name" : "CMAKE_MODULE_LINKER_FLAGS_DEBUG", + "properties" : + [ + { + "name" : "ADVANCED", + "value" : "1" + }, + { + "name" : "HELPSTRING", + "value" : "Flags used by the linker during the creation of modules during DEBUG builds." + } + ], + "type" : "STRING", + "value" : "" + }, + { + "name" : "CMAKE_MODULE_LINKER_FLAGS_MINSIZEREL", + "properties" : + [ + { + "name" : "ADVANCED", + "value" : "1" + }, + { + "name" : "HELPSTRING", + "value" : "Flags used by the linker during the creation of modules during MINSIZEREL builds." + } + ], + "type" : "STRING", + "value" : "" + }, + { + "name" : "CMAKE_MODULE_LINKER_FLAGS_RELEASE", + "properties" : + [ + { + "name" : "ADVANCED", + "value" : "1" + }, + { + "name" : "HELPSTRING", + "value" : "Flags used by the linker during the creation of modules during RELEASE builds." + } + ], + "type" : "STRING", + "value" : "" + }, + { + "name" : "CMAKE_MODULE_LINKER_FLAGS_RELWITHDEBINFO", + "properties" : + [ + { + "name" : "ADVANCED", + "value" : "1" + }, + { + "name" : "HELPSTRING", + "value" : "Flags used by the linker during the creation of modules during RELWITHDEBINFO builds." + } + ], + "type" : "STRING", + "value" : "" + }, + { + "name" : "CMAKE_NM", + "properties" : + [ + { + "name" : "ADVANCED", + "value" : "1" + }, + { + "name" : "HELPSTRING", + "value" : "Path to a program." + } + ], + "type" : "FILEPATH", + "value" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/bin/llvm-nm" + }, + { + "name" : "CMAKE_NUMBER_OF_MAKEFILES", + "properties" : + [ + { + "name" : "HELPSTRING", + "value" : "number of local generators" + } + ], + "type" : "INTERNAL", + "value" : "1" + }, + { + "name" : "CMAKE_OBJCOPY", + "properties" : + [ + { + "name" : "ADVANCED", + "value" : "1" + }, + { + "name" : "HELPSTRING", + "value" : "Path to a program." + } + ], + "type" : "FILEPATH", + "value" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/bin/llvm-objcopy" + }, + { + "name" : "CMAKE_OBJDUMP", + "properties" : + [ + { + "name" : "ADVANCED", + "value" : "1" + }, + { + "name" : "HELPSTRING", + "value" : "Path to a program." + } + ], + "type" : "FILEPATH", + "value" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/bin/llvm-objdump" + }, + { + "name" : "CMAKE_PLATFORM_INFO_INITIALIZED", + "properties" : + [ + { + "name" : "HELPSTRING", + "value" : "Platform information initialized" + } + ], + "type" : "INTERNAL", + "value" : "1" + }, + { + "name" : "CMAKE_PROJECT_DESCRIPTION", + "properties" : + [ + { + "name" : "HELPSTRING", + "value" : "Value Computed by CMake" + } + ], + "type" : "STATIC", + "value" : "" + }, + { + "name" : "CMAKE_PROJECT_HOMEPAGE_URL", + "properties" : + [ + { + "name" : "HELPSTRING", + "value" : "Value Computed by CMake" + } + ], + "type" : "STATIC", + "value" : "" + }, + { + "name" : "CMAKE_PROJECT_NAME", + "properties" : + [ + { + "name" : "HELPSTRING", + "value" : "Value Computed by CMake" + } + ], + "type" : "STATIC", + "value" : "intaleq_driver" + }, + { + "name" : "CMAKE_RANLIB", + "properties" : + [ + { + "name" : "ADVANCED", + "value" : "1" + }, + { + "name" : "HELPSTRING", + "value" : "Ranlib" + } + ], + "type" : "FILEPATH", + "value" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/bin/llvm-ranlib" + }, + { + "name" : "CMAKE_READELF", + "properties" : + [ + { + "name" : "ADVANCED", + "value" : "1" + }, + { + "name" : "HELPSTRING", + "value" : "Path to a program." + } + ], + "type" : "FILEPATH", + "value" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/bin/llvm-readelf" + }, + { + "name" : "CMAKE_ROOT", + "properties" : + [ + { + "name" : "HELPSTRING", + "value" : "Path to CMake installation." + } + ], + "type" : "INTERNAL", + "value" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31" + }, + { + "name" : "CMAKE_RUNTIME_OUTPUT_DIRECTORY", + "properties" : + [ + { + "name" : "HELPSTRING", + "value" : "No help, variable specified on the command line." + } + ], + "type" : "UNINITIALIZED", + "value" : "/Users/hamzaaleghwairyeen/development/App/intaleq_driver/build/app/intermediates/cxx/Debug/2j1f5m6a/obj/armeabi-v7a" + }, + { + "name" : "CMAKE_SHARED_LINKER_FLAGS", + "properties" : + [ + { + "name" : "ADVANCED", + "value" : "1" + }, + { + "name" : "HELPSTRING", + "value" : "Flags used by the linker during the creation of dll's." + } + ], + "type" : "STRING", + "value" : "" + }, + { + "name" : "CMAKE_SHARED_LINKER_FLAGS_DEBUG", + "properties" : + [ + { + "name" : "ADVANCED", + "value" : "1" + }, + { + "name" : "HELPSTRING", + "value" : "Flags used by the linker during the creation of shared libraries during DEBUG builds." + } + ], + "type" : "STRING", + "value" : "" + }, + { + "name" : "CMAKE_SHARED_LINKER_FLAGS_MINSIZEREL", + "properties" : + [ + { + "name" : "ADVANCED", + "value" : "1" + }, + { + "name" : "HELPSTRING", + "value" : "Flags used by the linker during the creation of shared libraries during MINSIZEREL builds." + } + ], + "type" : "STRING", + "value" : "" + }, + { + "name" : "CMAKE_SHARED_LINKER_FLAGS_RELEASE", + "properties" : + [ + { + "name" : "ADVANCED", + "value" : "1" + }, + { + "name" : "HELPSTRING", + "value" : "Flags used by the linker during the creation of shared libraries during RELEASE builds." + } + ], + "type" : "STRING", + "value" : "" + }, + { + "name" : "CMAKE_SHARED_LINKER_FLAGS_RELWITHDEBINFO", + "properties" : + [ + { + "name" : "ADVANCED", + "value" : "1" + }, + { + "name" : "HELPSTRING", + "value" : "Flags used by the linker during the creation of shared libraries during RELWITHDEBINFO builds." + } + ], + "type" : "STRING", + "value" : "" + }, + { + "name" : "CMAKE_SKIP_INSTALL_RPATH", + "properties" : + [ + { + "name" : "ADVANCED", + "value" : "1" + }, + { + "name" : "HELPSTRING", + "value" : "If set, runtime paths are not added when installing shared libraries, but are added when building." + } + ], + "type" : "BOOL", + "value" : "NO" + }, + { + "name" : "CMAKE_SKIP_RPATH", + "properties" : + [ + { + "name" : "ADVANCED", + "value" : "1" + }, + { + "name" : "HELPSTRING", + "value" : "If set, runtime paths are not added when using shared libraries." + } + ], + "type" : "BOOL", + "value" : "NO" + }, + { + "name" : "CMAKE_STATIC_LINKER_FLAGS", + "properties" : + [ + { + "name" : "ADVANCED", + "value" : "1" + }, + { + "name" : "HELPSTRING", + "value" : "Flags used by the linker during the creation of static libraries during all build types." + } + ], + "type" : "STRING", + "value" : "" + }, + { + "name" : "CMAKE_STATIC_LINKER_FLAGS_DEBUG", + "properties" : + [ + { + "name" : "ADVANCED", + "value" : "1" + }, + { + "name" : "HELPSTRING", + "value" : "Flags used by the linker during the creation of static libraries during DEBUG builds." + } + ], + "type" : "STRING", + "value" : "" + }, + { + "name" : "CMAKE_STATIC_LINKER_FLAGS_MINSIZEREL", + "properties" : + [ + { + "name" : "ADVANCED", + "value" : "1" + }, + { + "name" : "HELPSTRING", + "value" : "Flags used by the linker during the creation of static libraries during MINSIZEREL builds." + } + ], + "type" : "STRING", + "value" : "" + }, + { + "name" : "CMAKE_STATIC_LINKER_FLAGS_RELEASE", + "properties" : + [ + { + "name" : "ADVANCED", + "value" : "1" + }, + { + "name" : "HELPSTRING", + "value" : "Flags used by the linker during the creation of static libraries during RELEASE builds." + } + ], + "type" : "STRING", + "value" : "" + }, + { + "name" : "CMAKE_STATIC_LINKER_FLAGS_RELWITHDEBINFO", + "properties" : + [ + { + "name" : "ADVANCED", + "value" : "1" + }, + { + "name" : "HELPSTRING", + "value" : "Flags used by the linker during the creation of static libraries during RELWITHDEBINFO builds." + } + ], + "type" : "STRING", + "value" : "" + }, + { + "name" : "CMAKE_STRIP", + "properties" : + [ + { + "name" : "ADVANCED", + "value" : "1" + }, + { + "name" : "HELPSTRING", + "value" : "Strip" + } + ], + "type" : "FILEPATH", + "value" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/bin/llvm-strip" + }, + { + "name" : "CMAKE_SYSTEM_NAME", + "properties" : + [ + { + "name" : "HELPSTRING", + "value" : "No help, variable specified on the command line." + } + ], + "type" : "UNINITIALIZED", + "value" : "Android" + }, + { + "name" : "CMAKE_SYSTEM_VERSION", + "properties" : + [ + { + "name" : "HELPSTRING", + "value" : "No help, variable specified on the command line." + } + ], + "type" : "UNINITIALIZED", + "value" : "23" + }, + { + "name" : "CMAKE_TAPI", + "properties" : + [ + { + "name" : "ADVANCED", + "value" : "1" + }, + { + "name" : "HELPSTRING", + "value" : "Path to a program." + } + ], + "type" : "FILEPATH", + "value" : "CMAKE_TAPI-NOTFOUND" + }, + { + "name" : "CMAKE_TOOLCHAIN_FILE", + "properties" : + [ + { + "name" : "HELPSTRING", + "value" : "The CMake toolchain file" + } + ], + "type" : "FILEPATH", + "value" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/build/cmake/android.toolchain.cmake" + }, + { + "name" : "CMAKE_UNAME", + "properties" : + [ + { + "name" : "HELPSTRING", + "value" : "uname command" + } + ], + "type" : "INTERNAL", + "value" : "/usr/bin/uname" + }, + { + "name" : "CMAKE_VERBOSE_MAKEFILE", + "properties" : + [ + { + "name" : "ADVANCED", + "value" : "1" + }, + { + "name" : "HELPSTRING", + "value" : "If this value is on, makefiles will be generated without the .SILENT directive, and all commands will be echoed to the console during the make. This is useful for debugging only. With Visual Studio IDE projects all commands are done without /nologo." + } + ], + "type" : "BOOL", + "value" : "FALSE" + }, + { + "name" : "_CMAKE_CXX_LINKER_PUSHPOP_STATE_SUPPORTED", + "properties" : + [ + { + "name" : "HELPSTRING", + "value" : "linker supports push/pop state" + } + ], + "type" : "INTERNAL", + "value" : "TRUE" + }, + { + "name" : "_CMAKE_C_LINKER_PUSHPOP_STATE_SUPPORTED", + "properties" : + [ + { + "name" : "HELPSTRING", + "value" : "linker supports push/pop state" + } + ], + "type" : "INTERNAL", + "value" : "TRUE" + }, + { + "name" : "_CMAKE_LINKER_PUSHPOP_STATE_SUPPORTED", + "properties" : + [ + { + "name" : "HELPSTRING", + "value" : "linker supports push/pop state" + } + ], + "type" : "INTERNAL", + "value" : "TRUE" + }, + { + "name" : "intaleq_driver_BINARY_DIR", + "properties" : + [ + { + "name" : "HELPSTRING", + "value" : "Value Computed by CMake" + } + ], + "type" : "STATIC", + "value" : "/Users/hamzaaleghwairyeen/development/App/intaleq_driver/android/app/.cxx/Debug/2j1f5m6a/armeabi-v7a" + }, + { + "name" : "intaleq_driver_IS_TOP_LEVEL", + "properties" : + [ + { + "name" : "HELPSTRING", + "value" : "Value Computed by CMake" + } + ], + "type" : "STATIC", + "value" : "ON" + }, + { + "name" : "intaleq_driver_SOURCE_DIR", + "properties" : + [ + { + "name" : "HELPSTRING", + "value" : "Value Computed by CMake" + } + ], + "type" : "STATIC", + "value" : "/Users/hamzaaleghwairyeen/development/App/intaleq_driver/android/app/src/main/cpp" + }, + { + "name" : "log-lib", + "properties" : + [ + { + "name" : "HELPSTRING", + "value" : "Path to a library." + } + ], + "type" : "FILEPATH", + "value" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/lib/arm-linux-androideabi/23/liblog.so" + }, + { + "name" : "native-lib_LIB_DEPENDS", + "properties" : + [ + { + "name" : "HELPSTRING", + "value" : "Dependencies for the target" + } + ], + "type" : "STATIC", + "value" : "general;/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/lib/arm-linux-androideabi/23/liblog.so;" + } + ], + "kind" : "cache", + "version" : + { + "major" : 2, + "minor" : 0 + } +} diff --git a/siro_driver/android/app/.cxx/Debug/2j1f5m6a/armeabi-v7a/.cmake/api/v1/reply/cmakeFiles-v1-73e390d5e1d38be31a4e.json b/siro_driver/android/app/.cxx/Debug/2j1f5m6a/armeabi-v7a/.cmake/api/v1/reply/cmakeFiles-v1-73e390d5e1d38be31a4e.json new file mode 100644 index 0000000..e8330cd --- /dev/null +++ b/siro_driver/android/app/.cxx/Debug/2j1f5m6a/armeabi-v7a/.cmake/api/v1/reply/cmakeFiles-v1-73e390d5e1d38be31a4e.json @@ -0,0 +1,968 @@ +{ + "inputs" : + [ + { + "path" : "CMakeLists.txt" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeDetermineSystem.cmake" + }, + { + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/build/cmake/android.toolchain.cmake" + }, + { + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/build/cmake/android-legacy.toolchain.cmake" + }, + { + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/build/cmake/abis.cmake" + }, + { + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/build/cmake/platforms.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Platform/Android-Determine.cmake" + }, + { + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/build/cmake/hooks/pre/Android-Determine.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeSystem.cmake.in" + }, + { + "isGenerated" : true, + "path" : "/Users/hamzaaleghwairyeen/development/App/intaleq_driver/android/app/.cxx/Debug/2j1f5m6a/armeabi-v7a/CMakeFiles/3.31.5-g6cf5163/CMakeSystem.cmake" + }, + { + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/build/cmake/android.toolchain.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeSystemSpecificInitialize.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Platform/Android-Initialize.cmake" + }, + { + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/build/cmake/hooks/pre/Android-Initialize.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Platform/Linux-Initialize.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeDetermineCCompiler.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeDetermineCompiler.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Platform/Android-Determine-C.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Platform/Android/Determine-Compiler.cmake" + }, + { + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/build/cmake/hooks/pre/Determine-Compiler.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeDetermineCompilerId.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeCompilerIdDetection.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/ADSP-DetermineCompiler.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/ARMCC-DetermineCompiler.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/ARMClang-DetermineCompiler.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/AppleClang-DetermineCompiler.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/Clang-DetermineCompilerInternal.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/Borland-DetermineCompiler.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/Bruce-C-DetermineCompiler.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/Clang-DetermineCompiler.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/Clang-DetermineCompilerInternal.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/Compaq-C-DetermineCompiler.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/Cray-DetermineCompiler.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/CrayClang-DetermineCompiler.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/Embarcadero-DetermineCompiler.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/Fujitsu-DetermineCompiler.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/FujitsuClang-DetermineCompiler.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/GHS-DetermineCompiler.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/GNU-C-DetermineCompiler.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/HP-C-DetermineCompiler.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/IAR-DetermineCompiler.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/IBMClang-C-DetermineCompiler.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/Intel-DetermineCompiler.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/IntelLLVM-DetermineCompiler.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/LCC-C-DetermineCompiler.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/MSVC-DetermineCompiler.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/NVHPC-DetermineCompiler.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/NVIDIA-DetermineCompiler.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/OpenWatcom-DetermineCompiler.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/OrangeC-DetermineCompiler.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/PGI-DetermineCompiler.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/PathScale-DetermineCompiler.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/SCO-DetermineCompiler.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/SDCC-C-DetermineCompiler.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/SunPro-C-DetermineCompiler.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/TI-DetermineCompiler.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/TIClang-DetermineCompiler.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/Tasking-DetermineCompiler.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/TinyCC-C-DetermineCompiler.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/VisualAge-C-DetermineCompiler.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/IBMCPP-C-DetermineVersionInternal.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/Watcom-DetermineCompiler.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/XL-C-DetermineCompiler.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/IBMCPP-C-DetermineVersionInternal.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/XLClang-C-DetermineCompiler.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/zOS-C-DetermineCompiler.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/IBMCPP-C-DetermineVersionInternal.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeFindBinUtils.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/Clang-FindBinUtils.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeCCompiler.cmake.in" + }, + { + "isGenerated" : true, + "path" : "/Users/hamzaaleghwairyeen/development/App/intaleq_driver/android/app/.cxx/Debug/2j1f5m6a/armeabi-v7a/CMakeFiles/3.31.5-g6cf5163/CMakeCCompiler.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeDetermineCXXCompiler.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeDetermineCompiler.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Platform/Android-Determine-CXX.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Platform/Android/Determine-Compiler.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeDetermineCompilerId.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeCompilerIdDetection.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/ADSP-DetermineCompiler.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/ARMCC-DetermineCompiler.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/ARMClang-DetermineCompiler.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/AppleClang-DetermineCompiler.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/Clang-DetermineCompilerInternal.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/Borland-DetermineCompiler.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/Clang-DetermineCompiler.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/Clang-DetermineCompilerInternal.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/Compaq-CXX-DetermineCompiler.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/Cray-DetermineCompiler.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/CrayClang-DetermineCompiler.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/Embarcadero-DetermineCompiler.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/Fujitsu-DetermineCompiler.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/FujitsuClang-DetermineCompiler.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/GHS-DetermineCompiler.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/GNU-CXX-DetermineCompiler.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/HP-CXX-DetermineCompiler.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/IAR-DetermineCompiler.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/IBMClang-CXX-DetermineCompiler.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/Intel-DetermineCompiler.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/IntelLLVM-DetermineCompiler.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/LCC-CXX-DetermineCompiler.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/MSVC-DetermineCompiler.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/NVHPC-DetermineCompiler.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/NVIDIA-DetermineCompiler.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/OpenWatcom-DetermineCompiler.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/OrangeC-DetermineCompiler.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/PGI-DetermineCompiler.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/PathScale-DetermineCompiler.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/SCO-DetermineCompiler.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/SunPro-CXX-DetermineCompiler.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/TI-DetermineCompiler.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/TIClang-DetermineCompiler.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/Tasking-DetermineCompiler.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/VisualAge-CXX-DetermineCompiler.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/IBMCPP-CXX-DetermineVersionInternal.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/Watcom-DetermineCompiler.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/XL-CXX-DetermineCompiler.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/IBMCPP-CXX-DetermineVersionInternal.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/XLClang-CXX-DetermineCompiler.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/zOS-CXX-DetermineCompiler.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/IBMCPP-CXX-DetermineVersionInternal.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeFindBinUtils.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/Clang-FindBinUtils.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeCXXCompiler.cmake.in" + }, + { + "isGenerated" : true, + "path" : "/Users/hamzaaleghwairyeen/development/App/intaleq_driver/android/app/.cxx/Debug/2j1f5m6a/armeabi-v7a/CMakeFiles/3.31.5-g6cf5163/CMakeCXXCompiler.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeSystemSpecificInformation.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeGenericSystem.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeInitializeConfigs.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Platform/Android.cmake" + }, + { + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/build/cmake/hooks/pre/Android.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Platform/Linux.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Platform/UnixPaths.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeCInformation.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeLanguageInformation.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/Clang-C.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/Clang.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/CMakeCommonCompilerMacros.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/GNU.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/CMakeCommonCompilerMacros.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Platform/Android-Clang-C.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Platform/Android-Clang.cmake" + }, + { + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/build/cmake/hooks/pre/Android-Clang.cmake" + }, + { + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/build/cmake/flags.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeCommonLanguageInclude.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeTestCCompiler.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeTestCompilerCommon.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeDetermineCompilerABI.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Internal/CMakeDetermineLinkerId.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeParseImplicitIncludeInfo.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeParseImplicitLinkInfo.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeParseLibraryArchitecture.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeTestCompilerCommon.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeCCompilerABI.c" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeDetermineCompilerSupport.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Internal/FeatureTesting.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeCCompiler.cmake.in" + }, + { + "isGenerated" : true, + "path" : "/Users/hamzaaleghwairyeen/development/App/intaleq_driver/android/app/.cxx/Debug/2j1f5m6a/armeabi-v7a/CMakeFiles/3.31.5-g6cf5163/CMakeCCompiler.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Internal/CMakeCLinkerInformation.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Internal/CMakeCommonLinkerInformation.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Linker/LLD-C.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Linker/LLD.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Linker/GNU.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Platform/Linker/Android-LLD-C.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Platform/Linker/Linux-LLD-C.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Platform/Linker/Linux-LLD.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Platform/Linker/Linux-GNU.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Platform/Linker/GNU.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeCXXInformation.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeLanguageInformation.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/Clang-CXX.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/Clang.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Platform/Android-Clang-CXX.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Platform/Android-Clang.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeCommonLanguageInclude.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeTestCXXCompiler.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeTestCompilerCommon.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeDetermineCompilerABI.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Internal/CMakeDetermineLinkerId.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeParseImplicitIncludeInfo.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeParseImplicitLinkInfo.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeParseLibraryArchitecture.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeTestCompilerCommon.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeCXXCompilerABI.cpp" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeDetermineCompilerSupport.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Internal/FeatureTesting.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/Clang-CXX-CXXImportStd.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/Clang-CXX-CXXImportStd.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeCXXCompiler.cmake.in" + }, + { + "isGenerated" : true, + "path" : "/Users/hamzaaleghwairyeen/development/App/intaleq_driver/android/app/.cxx/Debug/2j1f5m6a/armeabi-v7a/CMakeFiles/3.31.5-g6cf5163/CMakeCXXCompiler.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Internal/CMakeCXXLinkerInformation.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Internal/CMakeCommonLinkerInformation.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Linker/LLD-CXX.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Linker/LLD.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Platform/Linker/Android-LLD-CXX.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Platform/Linker/Linux-LLD-CXX.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Platform/Linker/Linux-LLD.cmake" + } + ], + "kind" : "cmakeFiles", + "paths" : + { + "build" : "/Users/hamzaaleghwairyeen/development/App/intaleq_driver/android/app/.cxx/Debug/2j1f5m6a/armeabi-v7a", + "source" : "/Users/hamzaaleghwairyeen/development/App/intaleq_driver/android/app/src/main/cpp" + }, + "version" : + { + "major" : 1, + "minor" : 1 + } +} diff --git a/siro_driver/android/app/.cxx/Debug/2j1f5m6a/armeabi-v7a/.cmake/api/v1/reply/codemodel-v2-d22e5c1036f2219751b3.json b/siro_driver/android/app/.cxx/Debug/2j1f5m6a/armeabi-v7a/.cmake/api/v1/reply/codemodel-v2-d22e5c1036f2219751b3.json new file mode 100644 index 0000000..22b2a76 --- /dev/null +++ b/siro_driver/android/app/.cxx/Debug/2j1f5m6a/armeabi-v7a/.cmake/api/v1/reply/codemodel-v2-d22e5c1036f2219751b3.json @@ -0,0 +1,60 @@ +{ + "configurations" : + [ + { + "directories" : + [ + { + "build" : ".", + "jsonFile" : "directory-.-Debug-f5ebdc15457944623624.json", + "minimumCMakeVersion" : + { + "string" : "3.6.0" + }, + "projectIndex" : 0, + "source" : ".", + "targetIndexes" : + [ + 0 + ] + } + ], + "name" : "Debug", + "projects" : + [ + { + "directoryIndexes" : + [ + 0 + ], + "name" : "intaleq_driver", + "targetIndexes" : + [ + 0 + ] + } + ], + "targets" : + [ + { + "directoryIndex" : 0, + "id" : "native-lib::@6890427a1f51a3e7e1df", + "jsonFile" : "target-native-lib-Debug-f257690d64d152ec2b86.json", + "name" : "native-lib", + "projectIndex" : 0 + } + ] + } + ], + "kind" : "codemodel", + "paths" : + { + "build" : "/Users/hamzaaleghwairyeen/development/App/intaleq_driver/android/app/.cxx/Debug/2j1f5m6a/armeabi-v7a", + "source" : "/Users/hamzaaleghwairyeen/development/App/intaleq_driver/android/app/src/main/cpp" + }, + "version" : + { + "major" : 2, + "minor" : 7 + } +} diff --git a/siro_driver/android/app/.cxx/Debug/2j1f5m6a/armeabi-v7a/.cmake/api/v1/reply/directory-.-Debug-f5ebdc15457944623624.json b/siro_driver/android/app/.cxx/Debug/2j1f5m6a/armeabi-v7a/.cmake/api/v1/reply/directory-.-Debug-f5ebdc15457944623624.json new file mode 100644 index 0000000..3a67af9 --- /dev/null +++ b/siro_driver/android/app/.cxx/Debug/2j1f5m6a/armeabi-v7a/.cmake/api/v1/reply/directory-.-Debug-f5ebdc15457944623624.json @@ -0,0 +1,14 @@ +{ + "backtraceGraph" : + { + "commands" : [], + "files" : [], + "nodes" : [] + }, + "installers" : [], + "paths" : + { + "build" : ".", + "source" : "." + } +} diff --git a/siro_driver/android/app/.cxx/Debug/2j1f5m6a/armeabi-v7a/.cmake/api/v1/reply/index-2025-07-17T21-57-56-0584.json b/siro_driver/android/app/.cxx/Debug/2j1f5m6a/armeabi-v7a/.cmake/api/v1/reply/index-2025-07-17T21-57-56-0584.json new file mode 100644 index 0000000..d1aeeaf --- /dev/null +++ b/siro_driver/android/app/.cxx/Debug/2j1f5m6a/armeabi-v7a/.cmake/api/v1/reply/index-2025-07-17T21-57-56-0584.json @@ -0,0 +1,92 @@ +{ + "cmake" : + { + "generator" : + { + "multiConfig" : false, + "name" : "Ninja" + }, + "paths" : + { + "cmake" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/bin/cmake", + "cpack" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/bin/cpack", + "ctest" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/bin/ctest", + "root" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31" + }, + "version" : + { + "isDirty" : false, + "major" : 3, + "minor" : 31, + "patch" : 5, + "string" : "3.31.5-g6cf5163", + "suffix" : "g6cf5163" + } + }, + "objects" : + [ + { + "jsonFile" : "codemodel-v2-d22e5c1036f2219751b3.json", + "kind" : "codemodel", + "version" : + { + "major" : 2, + "minor" : 7 + } + }, + { + "jsonFile" : "cache-v2-aa9d167e8d32a264af7e.json", + "kind" : "cache", + "version" : + { + "major" : 2, + "minor" : 0 + } + }, + { + "jsonFile" : "cmakeFiles-v1-73e390d5e1d38be31a4e.json", + "kind" : "cmakeFiles", + "version" : + { + "major" : 1, + "minor" : 1 + } + } + ], + "reply" : + { + "client-agp" : + { + "cache-v2" : + { + "jsonFile" : "cache-v2-aa9d167e8d32a264af7e.json", + "kind" : "cache", + "version" : + { + "major" : 2, + "minor" : 0 + } + }, + "cmakeFiles-v1" : + { + "jsonFile" : "cmakeFiles-v1-73e390d5e1d38be31a4e.json", + "kind" : "cmakeFiles", + "version" : + { + "major" : 1, + "minor" : 1 + } + }, + "codemodel-v2" : + { + "jsonFile" : "codemodel-v2-d22e5c1036f2219751b3.json", + "kind" : "codemodel", + "version" : + { + "major" : 2, + "minor" : 7 + } + } + } + } +} diff --git a/siro_driver/android/app/.cxx/Debug/2j1f5m6a/armeabi-v7a/.cmake/api/v1/reply/target-native-lib-Debug-f257690d64d152ec2b86.json b/siro_driver/android/app/.cxx/Debug/2j1f5m6a/armeabi-v7a/.cmake/api/v1/reply/target-native-lib-Debug-f257690d64d152ec2b86.json new file mode 100644 index 0000000..c346449 --- /dev/null +++ b/siro_driver/android/app/.cxx/Debug/2j1f5m6a/armeabi-v7a/.cmake/api/v1/reply/target-native-lib-Debug-f257690d64d152ec2b86.json @@ -0,0 +1,117 @@ +{ + "artifacts" : + [ + { + "path" : "/Users/hamzaaleghwairyeen/development/App/intaleq_driver/build/app/intermediates/cxx/Debug/2j1f5m6a/obj/armeabi-v7a/libnative-lib.so" + } + ], + "backtrace" : 1, + "backtraceGraph" : + { + "commands" : + [ + "add_library", + "target_link_libraries" + ], + "files" : + [ + "CMakeLists.txt" + ], + "nodes" : + [ + { + "file" : 0 + }, + { + "command" : 0, + "file" : 0, + "line" : 5, + "parent" : 0 + }, + { + "command" : 1, + "file" : 0, + "line" : 11, + "parent" : 0 + } + ] + }, + "compileGroups" : + [ + { + "compileCommandFragments" : + [ + { + "fragment" : "-g -DANDROID -fdata-sections -ffunction-sections -funwind-tables -fstack-protector-strong -no-canonical-prefixes -D_FORTIFY_SOURCE=2 -march=armv7-a -mthumb -Wformat -Werror=format-security -fno-limit-debug-info -fPIC" + } + ], + "defines" : + [ + { + "define" : "native_lib_EXPORTS" + } + ], + "language" : "CXX", + "sourceIndexes" : + [ + 0 + ], + "sysroot" : + { + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot" + } + } + ], + "id" : "native-lib::@6890427a1f51a3e7e1df", + "link" : + { + "commandFragments" : + [ + { + "fragment" : "-static-libstdc++ -Wl,--build-id=sha1 -Wl,--no-rosegment -Wl,--no-undefined-version -Wl,--fatal-warnings -Wl,--no-undefined -Qunused-arguments", + "role" : "flags" + }, + { + "backtrace" : 2, + "fragment" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/lib/arm-linux-androideabi/23/liblog.so", + "role" : "libraries" + }, + { + "fragment" : "-latomic -lm", + "role" : "libraries" + } + ], + "language" : "CXX", + "sysroot" : + { + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot" + } + }, + "name" : "native-lib", + "nameOnDisk" : "libnative-lib.so", + "paths" : + { + "build" : ".", + "source" : "." + }, + "sourceGroups" : + [ + { + "name" : "Source Files", + "sourceIndexes" : + [ + 0 + ] + } + ], + "sources" : + [ + { + "backtrace" : 1, + "compileGroupIndex" : 0, + "path" : "native-lib.cpp", + "sourceGroupIndex" : 0 + } + ], + "type" : "SHARED_LIBRARY" +} diff --git a/siro_driver/android/app/.cxx/Debug/2j1f5m6a/armeabi-v7a/.ninja_deps b/siro_driver/android/app/.cxx/Debug/2j1f5m6a/armeabi-v7a/.ninja_deps new file mode 100644 index 0000000..038d421 Binary files /dev/null and b/siro_driver/android/app/.cxx/Debug/2j1f5m6a/armeabi-v7a/.ninja_deps differ diff --git a/siro_driver/android/app/.cxx/Debug/2j1f5m6a/armeabi-v7a/.ninja_log b/siro_driver/android/app/.cxx/Debug/2j1f5m6a/armeabi-v7a/.ninja_log new file mode 100644 index 0000000..61e8d7b --- /dev/null +++ b/siro_driver/android/app/.cxx/Debug/2j1f5m6a/armeabi-v7a/.ninja_log @@ -0,0 +1,3 @@ +# ninja log v5 +0 1180 1752789478075703294 CMakeFiles/native-lib.dir/native-lib.cpp.o a209ad40011cdd20 +1229 2104 1752789479006413464 /Users/hamzaaleghwairyeen/development/App/intaleq_driver/build/app/intermediates/cxx/Debug/2j1f5m6a/obj/armeabi-v7a/libnative-lib.so 64d8cfdc0f8fb1 diff --git a/siro_driver/android/app/.cxx/Debug/2j1f5m6a/armeabi-v7a/CMakeCache.txt b/siro_driver/android/app/.cxx/Debug/2j1f5m6a/armeabi-v7a/CMakeCache.txt new file mode 100644 index 0000000..beb3a16 --- /dev/null +++ b/siro_driver/android/app/.cxx/Debug/2j1f5m6a/armeabi-v7a/CMakeCache.txt @@ -0,0 +1,430 @@ +# This is the CMakeCache file. +# For build in directory: /Users/hamzaaleghwairyeen/development/App/intaleq_driver/android/app/.cxx/Debug/2j1f5m6a/armeabi-v7a +# It was generated by CMake: /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/bin/cmake +# You can edit this file to change values found and used by cmake. +# If you do not want to change any of the values, simply exit the editor. +# If you do want to change a value, simply edit, save, and exit the editor. +# The syntax for the file is as follows: +# KEY:TYPE=VALUE +# KEY is the name of a variable in the cache. +# TYPE is a hint to GUIs for the type of VALUE, DO NOT EDIT TYPE!. +# VALUE is the current value for the KEY. + +######################## +# EXTERNAL cache entries +######################## + +//No help, variable specified on the command line. +ANDROID_ABI:UNINITIALIZED=armeabi-v7a + +//No help, variable specified on the command line. +ANDROID_NDK:UNINITIALIZED=/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973 + +//No help, variable specified on the command line. +ANDROID_PLATFORM:UNINITIALIZED=android-23 + +//Path to a program. +CMAKE_ADDR2LINE:FILEPATH=/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/bin/llvm-addr2line + +//No help, variable specified on the command line. +CMAKE_ANDROID_ARCH_ABI:UNINITIALIZED=armeabi-v7a + +//No help, variable specified on the command line. +CMAKE_ANDROID_NDK:UNINITIALIZED=/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973 + +//Archiver +CMAKE_AR:FILEPATH=/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/bin/llvm-ar + +//Flags used by the compiler during all build types. +CMAKE_ASM_FLAGS:STRING= + +//Flags used by the compiler during debug builds. +CMAKE_ASM_FLAGS_DEBUG:STRING= + +//Flags used by the compiler during release builds. +CMAKE_ASM_FLAGS_RELEASE:STRING= + +//Choose the type of build, options are: None Debug Release RelWithDebInfo +// MinSizeRel ... +CMAKE_BUILD_TYPE:STRING=Debug + +//LLVM archiver +CMAKE_CXX_COMPILER_AR:FILEPATH=/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/bin/llvm-ar + +//`clang-scan-deps` dependency scanner +CMAKE_CXX_COMPILER_CLANG_SCAN_DEPS:FILEPATH=/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/bin/clang-scan-deps + +//Generate index for LLVM archive +CMAKE_CXX_COMPILER_RANLIB:FILEPATH=/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/bin/llvm-ranlib + +//Flags used by the compiler during all build types. +CMAKE_CXX_FLAGS:STRING= + +//Flags used by the compiler during debug builds. +CMAKE_CXX_FLAGS_DEBUG:STRING= + +//Flags used by the CXX compiler during MINSIZEREL builds. +CMAKE_CXX_FLAGS_MINSIZEREL:STRING=-Os -DNDEBUG + +//Flags used by the compiler during release builds. +CMAKE_CXX_FLAGS_RELEASE:STRING= + +//Flags used by the CXX compiler during RELWITHDEBINFO builds. +CMAKE_CXX_FLAGS_RELWITHDEBINFO:STRING=-O2 -g -DNDEBUG + +//Libraries linked by default with all C++ applications. +CMAKE_CXX_STANDARD_LIBRARIES:STRING=-latomic -lm + +//LLVM archiver +CMAKE_C_COMPILER_AR:FILEPATH=/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/bin/llvm-ar + +//`clang-scan-deps` dependency scanner +CMAKE_C_COMPILER_CLANG_SCAN_DEPS:FILEPATH=/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/bin/clang-scan-deps + +//Generate index for LLVM archive +CMAKE_C_COMPILER_RANLIB:FILEPATH=/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/bin/llvm-ranlib + +//Flags used by the compiler during all build types. +CMAKE_C_FLAGS:STRING= + +//Flags used by the compiler during debug builds. +CMAKE_C_FLAGS_DEBUG:STRING= + +//Flags used by the C compiler during MINSIZEREL builds. +CMAKE_C_FLAGS_MINSIZEREL:STRING=-Os -DNDEBUG + +//Flags used by the compiler during release builds. +CMAKE_C_FLAGS_RELEASE:STRING= + +//Flags used by the C compiler during RELWITHDEBINFO builds. +CMAKE_C_FLAGS_RELWITHDEBINFO:STRING=-O2 -g -DNDEBUG + +//Libraries linked by default with all C applications. +CMAKE_C_STANDARD_LIBRARIES:STRING=-latomic -lm + +//Path to a program. +CMAKE_DLLTOOL:FILEPATH=/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/bin/llvm-dlltool + +//Flags used by the linker. +CMAKE_EXE_LINKER_FLAGS:STRING= + +//Flags used by the linker during DEBUG builds. +CMAKE_EXE_LINKER_FLAGS_DEBUG:STRING= + +//Flags used by the linker during MINSIZEREL builds. +CMAKE_EXE_LINKER_FLAGS_MINSIZEREL:STRING= + +//Flags used by the linker during RELEASE builds. +CMAKE_EXE_LINKER_FLAGS_RELEASE:STRING= + +//Flags used by the linker during RELWITHDEBINFO builds. +CMAKE_EXE_LINKER_FLAGS_RELWITHDEBINFO:STRING= + +//Enable/Disable output of build database during the build. +CMAKE_EXPORT_BUILD_DATABASE:BOOL= + +//No help, variable specified on the command line. +CMAKE_EXPORT_COMPILE_COMMANDS:UNINITIALIZED=ON + +//Value Computed by CMake. +CMAKE_FIND_PACKAGE_REDIRECTS_DIR:STATIC=/Users/hamzaaleghwairyeen/development/App/intaleq_driver/android/app/.cxx/Debug/2j1f5m6a/armeabi-v7a/CMakeFiles/pkgRedirects + +//Install path prefix, prepended onto install directories. +CMAKE_INSTALL_PREFIX:PATH=/usr/local + +//No help, variable specified on the command line. +CMAKE_LIBRARY_OUTPUT_DIRECTORY:UNINITIALIZED=/Users/hamzaaleghwairyeen/development/App/intaleq_driver/build/app/intermediates/cxx/Debug/2j1f5m6a/obj/armeabi-v7a + +//Path to a program. +CMAKE_LINKER:FILEPATH=/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/bin/ld.lld + +//No help, variable specified on the command line. +CMAKE_MAKE_PROGRAM:UNINITIALIZED=/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/bin/ninja + +//Flags used by the linker during the creation of modules. +CMAKE_MODULE_LINKER_FLAGS:STRING= + +//Flags used by the linker during the creation of modules during +// DEBUG builds. +CMAKE_MODULE_LINKER_FLAGS_DEBUG:STRING= + +//Flags used by the linker during the creation of modules during +// MINSIZEREL builds. +CMAKE_MODULE_LINKER_FLAGS_MINSIZEREL:STRING= + +//Flags used by the linker during the creation of modules during +// RELEASE builds. +CMAKE_MODULE_LINKER_FLAGS_RELEASE:STRING= + +//Flags used by the linker during the creation of modules during +// RELWITHDEBINFO builds. +CMAKE_MODULE_LINKER_FLAGS_RELWITHDEBINFO:STRING= + +//Path to a program. +CMAKE_NM:FILEPATH=/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/bin/llvm-nm + +//Path to a program. +CMAKE_OBJCOPY:FILEPATH=/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/bin/llvm-objcopy + +//Path to a program. +CMAKE_OBJDUMP:FILEPATH=/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/bin/llvm-objdump + +//Value Computed by CMake +CMAKE_PROJECT_DESCRIPTION:STATIC= + +//Value Computed by CMake +CMAKE_PROJECT_HOMEPAGE_URL:STATIC= + +//Value Computed by CMake +CMAKE_PROJECT_NAME:STATIC=intaleq_driver + +//Ranlib +CMAKE_RANLIB:FILEPATH=/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/bin/llvm-ranlib + +//Path to a program. +CMAKE_READELF:FILEPATH=/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/bin/llvm-readelf + +//No help, variable specified on the command line. +CMAKE_RUNTIME_OUTPUT_DIRECTORY:UNINITIALIZED=/Users/hamzaaleghwairyeen/development/App/intaleq_driver/build/app/intermediates/cxx/Debug/2j1f5m6a/obj/armeabi-v7a + +//Flags used by the linker during the creation of dll's. +CMAKE_SHARED_LINKER_FLAGS:STRING= + +//Flags used by the linker during the creation of shared libraries +// during DEBUG builds. +CMAKE_SHARED_LINKER_FLAGS_DEBUG:STRING= + +//Flags used by the linker during the creation of shared libraries +// during MINSIZEREL builds. +CMAKE_SHARED_LINKER_FLAGS_MINSIZEREL:STRING= + +//Flags used by the linker during the creation of shared libraries +// during RELEASE builds. +CMAKE_SHARED_LINKER_FLAGS_RELEASE:STRING= + +//Flags used by the linker during the creation of shared libraries +// during RELWITHDEBINFO builds. +CMAKE_SHARED_LINKER_FLAGS_RELWITHDEBINFO:STRING= + +//If set, runtime paths are not added when installing shared libraries, +// but are added when building. +CMAKE_SKIP_INSTALL_RPATH:BOOL=NO + +//If set, runtime paths are not added when using shared libraries. +CMAKE_SKIP_RPATH:BOOL=NO + +//Flags used by the linker during the creation of static libraries +// during all build types. +CMAKE_STATIC_LINKER_FLAGS:STRING= + +//Flags used by the linker during the creation of static libraries +// during DEBUG builds. +CMAKE_STATIC_LINKER_FLAGS_DEBUG:STRING= + +//Flags used by the linker during the creation of static libraries +// during MINSIZEREL builds. +CMAKE_STATIC_LINKER_FLAGS_MINSIZEREL:STRING= + +//Flags used by the linker during the creation of static libraries +// during RELEASE builds. +CMAKE_STATIC_LINKER_FLAGS_RELEASE:STRING= + +//Flags used by the linker during the creation of static libraries +// during RELWITHDEBINFO builds. +CMAKE_STATIC_LINKER_FLAGS_RELWITHDEBINFO:STRING= + +//Strip +CMAKE_STRIP:FILEPATH=/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/bin/llvm-strip + +//No help, variable specified on the command line. +CMAKE_SYSTEM_NAME:UNINITIALIZED=Android + +//No help, variable specified on the command line. +CMAKE_SYSTEM_VERSION:UNINITIALIZED=23 + +//Path to a program. +CMAKE_TAPI:FILEPATH=CMAKE_TAPI-NOTFOUND + +//The CMake toolchain file +CMAKE_TOOLCHAIN_FILE:FILEPATH=/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/build/cmake/android.toolchain.cmake + +//If this value is on, makefiles will be generated without the +// .SILENT directive, and all commands will be echoed to the console +// during the make. This is useful for debugging only. With Visual +// Studio IDE projects all commands are done without /nologo. +CMAKE_VERBOSE_MAKEFILE:BOOL=FALSE + +//Value Computed by CMake +intaleq_driver_BINARY_DIR:STATIC=/Users/hamzaaleghwairyeen/development/App/intaleq_driver/android/app/.cxx/Debug/2j1f5m6a/armeabi-v7a + +//Value Computed by CMake +intaleq_driver_IS_TOP_LEVEL:STATIC=ON + +//Value Computed by CMake +intaleq_driver_SOURCE_DIR:STATIC=/Users/hamzaaleghwairyeen/development/App/intaleq_driver/android/app/src/main/cpp + +//Path to a library. +log-lib:FILEPATH=/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/lib/arm-linux-androideabi/23/liblog.so + +//Dependencies for the target +native-lib_LIB_DEPENDS:STATIC=general;/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/lib/arm-linux-androideabi/23/liblog.so; + + +######################## +# INTERNAL cache entries +######################## + +//ADVANCED property for variable: CMAKE_ADDR2LINE +CMAKE_ADDR2LINE-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_AR +CMAKE_AR-ADVANCED:INTERNAL=1 +//This is the directory where this CMakeCache.txt was created +CMAKE_CACHEFILE_DIR:INTERNAL=/Users/hamzaaleghwairyeen/development/App/intaleq_driver/android/app/.cxx/Debug/2j1f5m6a/armeabi-v7a +//Major version of cmake used to create the current loaded cache +CMAKE_CACHE_MAJOR_VERSION:INTERNAL=3 +//Minor version of cmake used to create the current loaded cache +CMAKE_CACHE_MINOR_VERSION:INTERNAL=31 +//Patch version of cmake used to create the current loaded cache +CMAKE_CACHE_PATCH_VERSION:INTERNAL=5 +//Path to CMake executable. +CMAKE_COMMAND:INTERNAL=/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/bin/cmake +//Path to cpack program executable. +CMAKE_CPACK_COMMAND:INTERNAL=/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/bin/cpack +//Path to ctest program executable. +CMAKE_CTEST_COMMAND:INTERNAL=/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/bin/ctest +//ADVANCED property for variable: CMAKE_CXX_COMPILER_AR +CMAKE_CXX_COMPILER_AR-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_CXX_COMPILER_CLANG_SCAN_DEPS +CMAKE_CXX_COMPILER_CLANG_SCAN_DEPS-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_CXX_COMPILER_RANLIB +CMAKE_CXX_COMPILER_RANLIB-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_CXX_FLAGS +CMAKE_CXX_FLAGS-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_CXX_FLAGS_DEBUG +CMAKE_CXX_FLAGS_DEBUG-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_CXX_FLAGS_MINSIZEREL +CMAKE_CXX_FLAGS_MINSIZEREL-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_CXX_FLAGS_RELEASE +CMAKE_CXX_FLAGS_RELEASE-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_CXX_FLAGS_RELWITHDEBINFO +CMAKE_CXX_FLAGS_RELWITHDEBINFO-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_CXX_STANDARD_LIBRARIES +CMAKE_CXX_STANDARD_LIBRARIES-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_C_COMPILER_AR +CMAKE_C_COMPILER_AR-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_C_COMPILER_CLANG_SCAN_DEPS +CMAKE_C_COMPILER_CLANG_SCAN_DEPS-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_C_COMPILER_RANLIB +CMAKE_C_COMPILER_RANLIB-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_C_FLAGS +CMAKE_C_FLAGS-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_C_FLAGS_DEBUG +CMAKE_C_FLAGS_DEBUG-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_C_FLAGS_MINSIZEREL +CMAKE_C_FLAGS_MINSIZEREL-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_C_FLAGS_RELEASE +CMAKE_C_FLAGS_RELEASE-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_C_FLAGS_RELWITHDEBINFO +CMAKE_C_FLAGS_RELWITHDEBINFO-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_C_STANDARD_LIBRARIES +CMAKE_C_STANDARD_LIBRARIES-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_DLLTOOL +CMAKE_DLLTOOL-ADVANCED:INTERNAL=1 +//Path to cache edit program executable. +CMAKE_EDIT_COMMAND:INTERNAL=/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/bin/ccmake +//Executable file format +CMAKE_EXECUTABLE_FORMAT:INTERNAL=ELF +//ADVANCED property for variable: CMAKE_EXE_LINKER_FLAGS +CMAKE_EXE_LINKER_FLAGS-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_EXE_LINKER_FLAGS_DEBUG +CMAKE_EXE_LINKER_FLAGS_DEBUG-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_EXE_LINKER_FLAGS_MINSIZEREL +CMAKE_EXE_LINKER_FLAGS_MINSIZEREL-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_EXE_LINKER_FLAGS_RELEASE +CMAKE_EXE_LINKER_FLAGS_RELEASE-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_EXE_LINKER_FLAGS_RELWITHDEBINFO +CMAKE_EXE_LINKER_FLAGS_RELWITHDEBINFO-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_EXPORT_BUILD_DATABASE +CMAKE_EXPORT_BUILD_DATABASE-ADVANCED:INTERNAL=1 +//Name of external makefile project generator. +CMAKE_EXTRA_GENERATOR:INTERNAL= +//Name of generator. +CMAKE_GENERATOR:INTERNAL=Ninja +//Generator instance identifier. +CMAKE_GENERATOR_INSTANCE:INTERNAL= +//Name of generator platform. +CMAKE_GENERATOR_PLATFORM:INTERNAL= +//Name of generator toolset. +CMAKE_GENERATOR_TOOLSET:INTERNAL= +//Source directory with the top level CMakeLists.txt file for this +// project +CMAKE_HOME_DIRECTORY:INTERNAL=/Users/hamzaaleghwairyeen/development/App/intaleq_driver/android/app/src/main/cpp +//Install .so files without execute permission. +CMAKE_INSTALL_SO_NO_EXE:INTERNAL=0 +//ADVANCED property for variable: CMAKE_LINKER +CMAKE_LINKER-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_MODULE_LINKER_FLAGS +CMAKE_MODULE_LINKER_FLAGS-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_MODULE_LINKER_FLAGS_DEBUG +CMAKE_MODULE_LINKER_FLAGS_DEBUG-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_MODULE_LINKER_FLAGS_MINSIZEREL +CMAKE_MODULE_LINKER_FLAGS_MINSIZEREL-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_MODULE_LINKER_FLAGS_RELEASE +CMAKE_MODULE_LINKER_FLAGS_RELEASE-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_MODULE_LINKER_FLAGS_RELWITHDEBINFO +CMAKE_MODULE_LINKER_FLAGS_RELWITHDEBINFO-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_NM +CMAKE_NM-ADVANCED:INTERNAL=1 +//number of local generators +CMAKE_NUMBER_OF_MAKEFILES:INTERNAL=1 +//ADVANCED property for variable: CMAKE_OBJCOPY +CMAKE_OBJCOPY-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_OBJDUMP +CMAKE_OBJDUMP-ADVANCED:INTERNAL=1 +//Platform information initialized +CMAKE_PLATFORM_INFO_INITIALIZED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_RANLIB +CMAKE_RANLIB-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_READELF +CMAKE_READELF-ADVANCED:INTERNAL=1 +//Path to CMake installation. +CMAKE_ROOT:INTERNAL=/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31 +//ADVANCED property for variable: CMAKE_SHARED_LINKER_FLAGS +CMAKE_SHARED_LINKER_FLAGS-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_SHARED_LINKER_FLAGS_DEBUG +CMAKE_SHARED_LINKER_FLAGS_DEBUG-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_SHARED_LINKER_FLAGS_MINSIZEREL +CMAKE_SHARED_LINKER_FLAGS_MINSIZEREL-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_SHARED_LINKER_FLAGS_RELEASE +CMAKE_SHARED_LINKER_FLAGS_RELEASE-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_SHARED_LINKER_FLAGS_RELWITHDEBINFO +CMAKE_SHARED_LINKER_FLAGS_RELWITHDEBINFO-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_SKIP_INSTALL_RPATH +CMAKE_SKIP_INSTALL_RPATH-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_SKIP_RPATH +CMAKE_SKIP_RPATH-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_STATIC_LINKER_FLAGS +CMAKE_STATIC_LINKER_FLAGS-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_STATIC_LINKER_FLAGS_DEBUG +CMAKE_STATIC_LINKER_FLAGS_DEBUG-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_STATIC_LINKER_FLAGS_MINSIZEREL +CMAKE_STATIC_LINKER_FLAGS_MINSIZEREL-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_STATIC_LINKER_FLAGS_RELEASE +CMAKE_STATIC_LINKER_FLAGS_RELEASE-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_STATIC_LINKER_FLAGS_RELWITHDEBINFO +CMAKE_STATIC_LINKER_FLAGS_RELWITHDEBINFO-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_STRIP +CMAKE_STRIP-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_TAPI +CMAKE_TAPI-ADVANCED:INTERNAL=1 +//uname command +CMAKE_UNAME:INTERNAL=/usr/bin/uname +//ADVANCED property for variable: CMAKE_VERBOSE_MAKEFILE +CMAKE_VERBOSE_MAKEFILE-ADVANCED:INTERNAL=1 +//linker supports push/pop state +_CMAKE_CXX_LINKER_PUSHPOP_STATE_SUPPORTED:INTERNAL=TRUE +//linker supports push/pop state +_CMAKE_C_LINKER_PUSHPOP_STATE_SUPPORTED:INTERNAL=TRUE +//linker supports push/pop state +_CMAKE_LINKER_PUSHPOP_STATE_SUPPORTED:INTERNAL=TRUE + diff --git a/siro_driver/android/app/.cxx/Debug/2j1f5m6a/armeabi-v7a/CMakeFiles/3.31.5-g6cf5163/CMakeCCompiler.cmake b/siro_driver/android/app/.cxx/Debug/2j1f5m6a/armeabi-v7a/CMakeFiles/3.31.5-g6cf5163/CMakeCCompiler.cmake new file mode 100644 index 0000000..48d6a82 --- /dev/null +++ b/siro_driver/android/app/.cxx/Debug/2j1f5m6a/armeabi-v7a/CMakeFiles/3.31.5-g6cf5163/CMakeCCompiler.cmake @@ -0,0 +1,81 @@ +set(CMAKE_C_COMPILER "/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/bin/clang") +set(CMAKE_C_COMPILER_ARG1 "") +set(CMAKE_C_COMPILER_ID "Clang") +set(CMAKE_C_COMPILER_VERSION "18.0.1") +set(CMAKE_C_COMPILER_VERSION_INTERNAL "") +set(CMAKE_C_COMPILER_WRAPPER "") +set(CMAKE_C_STANDARD_COMPUTED_DEFAULT "17") +set(CMAKE_C_EXTENSIONS_COMPUTED_DEFAULT "ON") +set(CMAKE_C_STANDARD_LATEST "23") +set(CMAKE_C_COMPILE_FEATURES "c_std_90;c_function_prototypes;c_std_99;c_restrict;c_variadic_macros;c_std_11;c_static_assert;c_std_17;c_std_23") +set(CMAKE_C90_COMPILE_FEATURES "c_std_90;c_function_prototypes") +set(CMAKE_C99_COMPILE_FEATURES "c_std_99;c_restrict;c_variadic_macros") +set(CMAKE_C11_COMPILE_FEATURES "c_std_11;c_static_assert") +set(CMAKE_C17_COMPILE_FEATURES "c_std_17") +set(CMAKE_C23_COMPILE_FEATURES "c_std_23") + +set(CMAKE_C_PLATFORM_ID "Linux") +set(CMAKE_C_SIMULATE_ID "") +set(CMAKE_C_COMPILER_FRONTEND_VARIANT "GNU") +set(CMAKE_C_SIMULATE_VERSION "") + + + + +set(CMAKE_AR "/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/bin/llvm-ar") +set(CMAKE_C_COMPILER_AR "/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/bin/llvm-ar") +set(CMAKE_RANLIB "/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/bin/llvm-ranlib") +set(CMAKE_C_COMPILER_RANLIB "/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/bin/llvm-ranlib") +set(CMAKE_LINKER "/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/bin/ld.lld") +set(CMAKE_LINKER_LINK "") +set(CMAKE_LINKER_LLD "") +set(CMAKE_C_COMPILER_LINKER "/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/bin/ld.lld") +set(CMAKE_C_COMPILER_LINKER_ID "LLD") +set(CMAKE_C_COMPILER_LINKER_VERSION 18.0.1) +set(CMAKE_C_COMPILER_LINKER_FRONTEND_VARIANT GNU) +set(CMAKE_MT "") +set(CMAKE_TAPI "CMAKE_TAPI-NOTFOUND") +set(CMAKE_COMPILER_IS_GNUCC ) +set(CMAKE_C_COMPILER_LOADED 1) +set(CMAKE_C_COMPILER_WORKS TRUE) +set(CMAKE_C_ABI_COMPILED TRUE) + +set(CMAKE_C_COMPILER_ENV_VAR "CC") + +set(CMAKE_C_COMPILER_ID_RUN 1) +set(CMAKE_C_SOURCE_FILE_EXTENSIONS c;m) +set(CMAKE_C_IGNORE_EXTENSIONS h;H;o;O;obj;OBJ;def;DEF;rc;RC) +set(CMAKE_C_LINKER_PREFERENCE 10) +set(CMAKE_C_LINKER_DEPFILE_SUPPORTED ) + +# Save compiler ABI information. +set(CMAKE_C_SIZEOF_DATA_PTR "4") +set(CMAKE_C_COMPILER_ABI "ELF") +set(CMAKE_C_BYTE_ORDER "LITTLE_ENDIAN") +set(CMAKE_C_LIBRARY_ARCHITECTURE "arm-linux-androideabi") + +if(CMAKE_C_SIZEOF_DATA_PTR) + set(CMAKE_SIZEOF_VOID_P "${CMAKE_C_SIZEOF_DATA_PTR}") +endif() + +if(CMAKE_C_COMPILER_ABI) + set(CMAKE_INTERNAL_PLATFORM_ABI "${CMAKE_C_COMPILER_ABI}") +endif() + +if(CMAKE_C_LIBRARY_ARCHITECTURE) + set(CMAKE_LIBRARY_ARCHITECTURE "arm-linux-androideabi") +endif() + +set(CMAKE_C_CL_SHOWINCLUDES_PREFIX "") +if(CMAKE_C_CL_SHOWINCLUDES_PREFIX) + set(CMAKE_CL_SHOWINCLUDES_PREFIX "${CMAKE_C_CL_SHOWINCLUDES_PREFIX}") +endif() + + + + + +set(CMAKE_C_IMPLICIT_INCLUDE_DIRECTORIES "/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/lib/clang/18/include;/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/include/arm-linux-androideabi;/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/include") +set(CMAKE_C_IMPLICIT_LINK_LIBRARIES "-l:libunwind.a;dl;c;-l:libunwind.a;dl") +set(CMAKE_C_IMPLICIT_LINK_DIRECTORIES "/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/lib/clang/18/lib/linux/arm;/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/lib/arm-linux-androideabi/23;/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/lib/arm-linux-androideabi;/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/lib") +set(CMAKE_C_IMPLICIT_LINK_FRAMEWORK_DIRECTORIES "") diff --git a/siro_driver/android/app/.cxx/Debug/2j1f5m6a/armeabi-v7a/CMakeFiles/3.31.5-g6cf5163/CMakeCXXCompiler.cmake b/siro_driver/android/app/.cxx/Debug/2j1f5m6a/armeabi-v7a/CMakeFiles/3.31.5-g6cf5163/CMakeCXXCompiler.cmake new file mode 100644 index 0000000..36605bb --- /dev/null +++ b/siro_driver/android/app/.cxx/Debug/2j1f5m6a/armeabi-v7a/CMakeFiles/3.31.5-g6cf5163/CMakeCXXCompiler.cmake @@ -0,0 +1,105 @@ +set(CMAKE_CXX_COMPILER "/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/bin/clang++") +set(CMAKE_CXX_COMPILER_ARG1 "") +set(CMAKE_CXX_COMPILER_ID "Clang") +set(CMAKE_CXX_COMPILER_VERSION "18.0.1") +set(CMAKE_CXX_COMPILER_VERSION_INTERNAL "") +set(CMAKE_CXX_COMPILER_WRAPPER "") +set(CMAKE_CXX_STANDARD_COMPUTED_DEFAULT "17") +set(CMAKE_CXX_EXTENSIONS_COMPUTED_DEFAULT "ON") +set(CMAKE_CXX_STANDARD_LATEST "26") +set(CMAKE_CXX_COMPILE_FEATURES "cxx_std_98;cxx_template_template_parameters;cxx_std_11;cxx_alias_templates;cxx_alignas;cxx_alignof;cxx_attributes;cxx_auto_type;cxx_constexpr;cxx_decltype;cxx_decltype_incomplete_return_types;cxx_default_function_template_args;cxx_defaulted_functions;cxx_defaulted_move_initializers;cxx_delegating_constructors;cxx_deleted_functions;cxx_enum_forward_declarations;cxx_explicit_conversions;cxx_extended_friend_declarations;cxx_extern_templates;cxx_final;cxx_func_identifier;cxx_generalized_initializers;cxx_inheriting_constructors;cxx_inline_namespaces;cxx_lambdas;cxx_local_type_template_args;cxx_long_long_type;cxx_noexcept;cxx_nonstatic_member_init;cxx_nullptr;cxx_override;cxx_range_for;cxx_raw_string_literals;cxx_reference_qualified_functions;cxx_right_angle_brackets;cxx_rvalue_references;cxx_sizeof_member;cxx_static_assert;cxx_strong_enums;cxx_thread_local;cxx_trailing_return_types;cxx_unicode_literals;cxx_uniform_initialization;cxx_unrestricted_unions;cxx_user_literals;cxx_variadic_macros;cxx_variadic_templates;cxx_std_14;cxx_aggregate_default_initializers;cxx_attribute_deprecated;cxx_binary_literals;cxx_contextual_conversions;cxx_decltype_auto;cxx_digit_separators;cxx_generic_lambdas;cxx_lambda_init_captures;cxx_relaxed_constexpr;cxx_return_type_deduction;cxx_variable_templates;cxx_std_17;cxx_std_20;cxx_std_23;cxx_std_26") +set(CMAKE_CXX98_COMPILE_FEATURES "cxx_std_98;cxx_template_template_parameters") +set(CMAKE_CXX11_COMPILE_FEATURES "cxx_std_11;cxx_alias_templates;cxx_alignas;cxx_alignof;cxx_attributes;cxx_auto_type;cxx_constexpr;cxx_decltype;cxx_decltype_incomplete_return_types;cxx_default_function_template_args;cxx_defaulted_functions;cxx_defaulted_move_initializers;cxx_delegating_constructors;cxx_deleted_functions;cxx_enum_forward_declarations;cxx_explicit_conversions;cxx_extended_friend_declarations;cxx_extern_templates;cxx_final;cxx_func_identifier;cxx_generalized_initializers;cxx_inheriting_constructors;cxx_inline_namespaces;cxx_lambdas;cxx_local_type_template_args;cxx_long_long_type;cxx_noexcept;cxx_nonstatic_member_init;cxx_nullptr;cxx_override;cxx_range_for;cxx_raw_string_literals;cxx_reference_qualified_functions;cxx_right_angle_brackets;cxx_rvalue_references;cxx_sizeof_member;cxx_static_assert;cxx_strong_enums;cxx_thread_local;cxx_trailing_return_types;cxx_unicode_literals;cxx_uniform_initialization;cxx_unrestricted_unions;cxx_user_literals;cxx_variadic_macros;cxx_variadic_templates") +set(CMAKE_CXX14_COMPILE_FEATURES "cxx_std_14;cxx_aggregate_default_initializers;cxx_attribute_deprecated;cxx_binary_literals;cxx_contextual_conversions;cxx_decltype_auto;cxx_digit_separators;cxx_generic_lambdas;cxx_lambda_init_captures;cxx_relaxed_constexpr;cxx_return_type_deduction;cxx_variable_templates") +set(CMAKE_CXX17_COMPILE_FEATURES "cxx_std_17") +set(CMAKE_CXX20_COMPILE_FEATURES "cxx_std_20") +set(CMAKE_CXX23_COMPILE_FEATURES "cxx_std_23") +set(CMAKE_CXX26_COMPILE_FEATURES "cxx_std_26") + +set(CMAKE_CXX_PLATFORM_ID "Linux") +set(CMAKE_CXX_SIMULATE_ID "") +set(CMAKE_CXX_COMPILER_FRONTEND_VARIANT "GNU") +set(CMAKE_CXX_SIMULATE_VERSION "") + + + + +set(CMAKE_AR "/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/bin/llvm-ar") +set(CMAKE_CXX_COMPILER_AR "/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/bin/llvm-ar") +set(CMAKE_RANLIB "/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/bin/llvm-ranlib") +set(CMAKE_CXX_COMPILER_RANLIB "/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/bin/llvm-ranlib") +set(CMAKE_LINKER "/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/bin/ld.lld") +set(CMAKE_LINKER_LINK "") +set(CMAKE_LINKER_LLD "") +set(CMAKE_CXX_COMPILER_LINKER "/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/bin/ld.lld") +set(CMAKE_CXX_COMPILER_LINKER_ID "LLD") +set(CMAKE_CXX_COMPILER_LINKER_VERSION 18.0.1) +set(CMAKE_CXX_COMPILER_LINKER_FRONTEND_VARIANT GNU) +set(CMAKE_MT "") +set(CMAKE_TAPI "CMAKE_TAPI-NOTFOUND") +set(CMAKE_COMPILER_IS_GNUCXX ) +set(CMAKE_CXX_COMPILER_LOADED 1) +set(CMAKE_CXX_COMPILER_WORKS TRUE) +set(CMAKE_CXX_ABI_COMPILED TRUE) + +set(CMAKE_CXX_COMPILER_ENV_VAR "CXX") + +set(CMAKE_CXX_COMPILER_ID_RUN 1) +set(CMAKE_CXX_SOURCE_FILE_EXTENSIONS C;M;c++;cc;cpp;cxx;m;mm;mpp;CPP;ixx;cppm;ccm;cxxm;c++m) +set(CMAKE_CXX_IGNORE_EXTENSIONS inl;h;hpp;HPP;H;o;O;obj;OBJ;def;DEF;rc;RC) + +foreach (lang IN ITEMS C OBJC OBJCXX) + if (CMAKE_${lang}_COMPILER_ID_RUN) + foreach(extension IN LISTS CMAKE_${lang}_SOURCE_FILE_EXTENSIONS) + list(REMOVE_ITEM CMAKE_CXX_SOURCE_FILE_EXTENSIONS ${extension}) + endforeach() + endif() +endforeach() + +set(CMAKE_CXX_LINKER_PREFERENCE 30) +set(CMAKE_CXX_LINKER_PREFERENCE_PROPAGATES 1) +set(CMAKE_CXX_LINKER_DEPFILE_SUPPORTED ) + +# Save compiler ABI information. +set(CMAKE_CXX_SIZEOF_DATA_PTR "4") +set(CMAKE_CXX_COMPILER_ABI "ELF") +set(CMAKE_CXX_BYTE_ORDER "LITTLE_ENDIAN") +set(CMAKE_CXX_LIBRARY_ARCHITECTURE "arm-linux-androideabi") + +if(CMAKE_CXX_SIZEOF_DATA_PTR) + set(CMAKE_SIZEOF_VOID_P "${CMAKE_CXX_SIZEOF_DATA_PTR}") +endif() + +if(CMAKE_CXX_COMPILER_ABI) + set(CMAKE_INTERNAL_PLATFORM_ABI "${CMAKE_CXX_COMPILER_ABI}") +endif() + +if(CMAKE_CXX_LIBRARY_ARCHITECTURE) + set(CMAKE_LIBRARY_ARCHITECTURE "arm-linux-androideabi") +endif() + +set(CMAKE_CXX_CL_SHOWINCLUDES_PREFIX "") +if(CMAKE_CXX_CL_SHOWINCLUDES_PREFIX) + set(CMAKE_CL_SHOWINCLUDES_PREFIX "${CMAKE_CXX_CL_SHOWINCLUDES_PREFIX}") +endif() + + + + + +set(CMAKE_CXX_IMPLICIT_INCLUDE_DIRECTORIES "/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/include/c++/v1;/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/lib/clang/18/include;/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/include/arm-linux-androideabi;/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/include") +set(CMAKE_CXX_IMPLICIT_LINK_LIBRARIES "c++;m;-l:libunwind.a;dl;c;-l:libunwind.a;dl") +set(CMAKE_CXX_IMPLICIT_LINK_DIRECTORIES "/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/lib/clang/18/lib/linux/arm;/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/lib/arm-linux-androideabi/23;/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/lib/arm-linux-androideabi;/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/lib") +set(CMAKE_CXX_IMPLICIT_LINK_FRAMEWORK_DIRECTORIES "") +set(CMAKE_CXX_COMPILER_CLANG_RESOURCE_DIR "/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/lib/clang/18") + +set(CMAKE_CXX_COMPILER_IMPORT_STD "") +### Imported target for C++23 standard library +set(CMAKE_CXX23_COMPILER_IMPORT_STD_NOT_FOUND_MESSAGE "Experimental `import std` support not enabled when detecting toolchain; it must be set before `CXX` is enabled (usually a `project()` call)") + + +### Imported target for C++26 standard library +set(CMAKE_CXX26_COMPILER_IMPORT_STD_NOT_FOUND_MESSAGE "Experimental `import std` support not enabled when detecting toolchain; it must be set before `CXX` is enabled (usually a `project()` call)") + + + diff --git a/siro_driver/android/app/.cxx/Debug/2j1f5m6a/armeabi-v7a/CMakeFiles/3.31.5-g6cf5163/CMakeDetermineCompilerABI_C.bin b/siro_driver/android/app/.cxx/Debug/2j1f5m6a/armeabi-v7a/CMakeFiles/3.31.5-g6cf5163/CMakeDetermineCompilerABI_C.bin new file mode 100755 index 0000000..164d518 Binary files /dev/null and b/siro_driver/android/app/.cxx/Debug/2j1f5m6a/armeabi-v7a/CMakeFiles/3.31.5-g6cf5163/CMakeDetermineCompilerABI_C.bin differ diff --git a/siro_driver/android/app/.cxx/Debug/2j1f5m6a/armeabi-v7a/CMakeFiles/3.31.5-g6cf5163/CMakeDetermineCompilerABI_CXX.bin b/siro_driver/android/app/.cxx/Debug/2j1f5m6a/armeabi-v7a/CMakeFiles/3.31.5-g6cf5163/CMakeDetermineCompilerABI_CXX.bin new file mode 100755 index 0000000..874b117 Binary files /dev/null and b/siro_driver/android/app/.cxx/Debug/2j1f5m6a/armeabi-v7a/CMakeFiles/3.31.5-g6cf5163/CMakeDetermineCompilerABI_CXX.bin differ diff --git a/siro_driver/android/app/.cxx/Debug/2j1f5m6a/armeabi-v7a/CMakeFiles/3.31.5-g6cf5163/CMakeSystem.cmake b/siro_driver/android/app/.cxx/Debug/2j1f5m6a/armeabi-v7a/CMakeFiles/3.31.5-g6cf5163/CMakeSystem.cmake new file mode 100644 index 0000000..dada03e --- /dev/null +++ b/siro_driver/android/app/.cxx/Debug/2j1f5m6a/armeabi-v7a/CMakeFiles/3.31.5-g6cf5163/CMakeSystem.cmake @@ -0,0 +1,15 @@ +set(CMAKE_HOST_SYSTEM "Darwin-24.5.0") +set(CMAKE_HOST_SYSTEM_NAME "Darwin") +set(CMAKE_HOST_SYSTEM_VERSION "24.5.0") +set(CMAKE_HOST_SYSTEM_PROCESSOR "arm64") + +include("/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/build/cmake/android.toolchain.cmake") + +set(CMAKE_SYSTEM "Android-1") +set(CMAKE_SYSTEM_NAME "Android") +set(CMAKE_SYSTEM_VERSION "1") +set(CMAKE_SYSTEM_PROCESSOR "armv7-a") + +set(CMAKE_CROSSCOMPILING "TRUE") + +set(CMAKE_SYSTEM_LOADED 1) diff --git a/siro_driver/android/app/.cxx/Debug/2j1f5m6a/armeabi-v7a/CMakeFiles/3.31.5-g6cf5163/CompilerIdC/CMakeCCompilerId.c b/siro_driver/android/app/.cxx/Debug/2j1f5m6a/armeabi-v7a/CMakeFiles/3.31.5-g6cf5163/CompilerIdC/CMakeCCompilerId.c new file mode 100644 index 0000000..8d8bb03 --- /dev/null +++ b/siro_driver/android/app/.cxx/Debug/2j1f5m6a/armeabi-v7a/CMakeFiles/3.31.5-g6cf5163/CompilerIdC/CMakeCCompilerId.c @@ -0,0 +1,904 @@ +#ifdef __cplusplus +# error "A C++ compiler has been selected for C." +#endif + +#if defined(__18CXX) +# define ID_VOID_MAIN +#endif +#if defined(__CLASSIC_C__) +/* cv-qualifiers did not exist in K&R C */ +# define const +# define volatile +#endif + +#if !defined(__has_include) +/* If the compiler does not have __has_include, pretend the answer is + always no. */ +# define __has_include(x) 0 +#endif + + +/* Version number components: V=Version, R=Revision, P=Patch + Version date components: YYYY=Year, MM=Month, DD=Day */ + +#if defined(__INTEL_COMPILER) || defined(__ICC) +# define COMPILER_ID "Intel" +# if defined(_MSC_VER) +# define SIMULATE_ID "MSVC" +# endif +# if defined(__GNUC__) +# define SIMULATE_ID "GNU" +# endif + /* __INTEL_COMPILER = VRP prior to 2021, and then VVVV for 2021 and later, + except that a few beta releases use the old format with V=2021. */ +# if __INTEL_COMPILER < 2021 || __INTEL_COMPILER == 202110 || __INTEL_COMPILER == 202111 +# define COMPILER_VERSION_MAJOR DEC(__INTEL_COMPILER/100) +# define COMPILER_VERSION_MINOR DEC(__INTEL_COMPILER/10 % 10) +# if defined(__INTEL_COMPILER_UPDATE) +# define COMPILER_VERSION_PATCH DEC(__INTEL_COMPILER_UPDATE) +# else +# define COMPILER_VERSION_PATCH DEC(__INTEL_COMPILER % 10) +# endif +# else +# define COMPILER_VERSION_MAJOR DEC(__INTEL_COMPILER) +# define COMPILER_VERSION_MINOR DEC(__INTEL_COMPILER_UPDATE) + /* The third version component from --version is an update index, + but no macro is provided for it. */ +# define COMPILER_VERSION_PATCH DEC(0) +# endif +# if defined(__INTEL_COMPILER_BUILD_DATE) + /* __INTEL_COMPILER_BUILD_DATE = YYYYMMDD */ +# define COMPILER_VERSION_TWEAK DEC(__INTEL_COMPILER_BUILD_DATE) +# endif +# if defined(_MSC_VER) + /* _MSC_VER = VVRR */ +# define SIMULATE_VERSION_MAJOR DEC(_MSC_VER / 100) +# define SIMULATE_VERSION_MINOR DEC(_MSC_VER % 100) +# endif +# if defined(__GNUC__) +# define SIMULATE_VERSION_MAJOR DEC(__GNUC__) +# elif defined(__GNUG__) +# define SIMULATE_VERSION_MAJOR DEC(__GNUG__) +# endif +# if defined(__GNUC_MINOR__) +# define SIMULATE_VERSION_MINOR DEC(__GNUC_MINOR__) +# endif +# if defined(__GNUC_PATCHLEVEL__) +# define SIMULATE_VERSION_PATCH DEC(__GNUC_PATCHLEVEL__) +# endif + +#elif (defined(__clang__) && defined(__INTEL_CLANG_COMPILER)) || defined(__INTEL_LLVM_COMPILER) +# define COMPILER_ID "IntelLLVM" +#if defined(_MSC_VER) +# define SIMULATE_ID "MSVC" +#endif +#if defined(__GNUC__) +# define SIMULATE_ID "GNU" +#endif +/* __INTEL_LLVM_COMPILER = VVVVRP prior to 2021.2.0, VVVVRRPP for 2021.2.0 and + * later. Look for 6 digit vs. 8 digit version number to decide encoding. + * VVVV is no smaller than the current year when a version is released. + */ +#if __INTEL_LLVM_COMPILER < 1000000L +# define COMPILER_VERSION_MAJOR DEC(__INTEL_LLVM_COMPILER/100) +# define COMPILER_VERSION_MINOR DEC(__INTEL_LLVM_COMPILER/10 % 10) +# define COMPILER_VERSION_PATCH DEC(__INTEL_LLVM_COMPILER % 10) +#else +# define COMPILER_VERSION_MAJOR DEC(__INTEL_LLVM_COMPILER/10000) +# define COMPILER_VERSION_MINOR DEC(__INTEL_LLVM_COMPILER/100 % 100) +# define COMPILER_VERSION_PATCH DEC(__INTEL_LLVM_COMPILER % 100) +#endif +#if defined(_MSC_VER) + /* _MSC_VER = VVRR */ +# define SIMULATE_VERSION_MAJOR DEC(_MSC_VER / 100) +# define SIMULATE_VERSION_MINOR DEC(_MSC_VER % 100) +#endif +#if defined(__GNUC__) +# define SIMULATE_VERSION_MAJOR DEC(__GNUC__) +#elif defined(__GNUG__) +# define SIMULATE_VERSION_MAJOR DEC(__GNUG__) +#endif +#if defined(__GNUC_MINOR__) +# define SIMULATE_VERSION_MINOR DEC(__GNUC_MINOR__) +#endif +#if defined(__GNUC_PATCHLEVEL__) +# define SIMULATE_VERSION_PATCH DEC(__GNUC_PATCHLEVEL__) +#endif + +#elif defined(__PATHCC__) +# define COMPILER_ID "PathScale" +# define COMPILER_VERSION_MAJOR DEC(__PATHCC__) +# define COMPILER_VERSION_MINOR DEC(__PATHCC_MINOR__) +# if defined(__PATHCC_PATCHLEVEL__) +# define COMPILER_VERSION_PATCH DEC(__PATHCC_PATCHLEVEL__) +# endif + +#elif defined(__BORLANDC__) && defined(__CODEGEARC_VERSION__) +# define COMPILER_ID "Embarcadero" +# define COMPILER_VERSION_MAJOR HEX(__CODEGEARC_VERSION__>>24 & 0x00FF) +# define COMPILER_VERSION_MINOR HEX(__CODEGEARC_VERSION__>>16 & 0x00FF) +# define COMPILER_VERSION_PATCH DEC(__CODEGEARC_VERSION__ & 0xFFFF) + +#elif defined(__BORLANDC__) +# define COMPILER_ID "Borland" + /* __BORLANDC__ = 0xVRR */ +# define COMPILER_VERSION_MAJOR HEX(__BORLANDC__>>8) +# define COMPILER_VERSION_MINOR HEX(__BORLANDC__ & 0xFF) + +#elif defined(__WATCOMC__) && __WATCOMC__ < 1200 +# define COMPILER_ID "Watcom" + /* __WATCOMC__ = VVRR */ +# define COMPILER_VERSION_MAJOR DEC(__WATCOMC__ / 100) +# define COMPILER_VERSION_MINOR DEC((__WATCOMC__ / 10) % 10) +# if (__WATCOMC__ % 10) > 0 +# define COMPILER_VERSION_PATCH DEC(__WATCOMC__ % 10) +# endif + +#elif defined(__WATCOMC__) +# define COMPILER_ID "OpenWatcom" + /* __WATCOMC__ = VVRP + 1100 */ +# define COMPILER_VERSION_MAJOR DEC((__WATCOMC__ - 1100) / 100) +# define COMPILER_VERSION_MINOR DEC((__WATCOMC__ / 10) % 10) +# if (__WATCOMC__ % 10) > 0 +# define COMPILER_VERSION_PATCH DEC(__WATCOMC__ % 10) +# endif + +#elif defined(__SUNPRO_C) +# define COMPILER_ID "SunPro" +# if __SUNPRO_C >= 0x5100 + /* __SUNPRO_C = 0xVRRP */ +# define COMPILER_VERSION_MAJOR HEX(__SUNPRO_C>>12) +# define COMPILER_VERSION_MINOR HEX(__SUNPRO_C>>4 & 0xFF) +# define COMPILER_VERSION_PATCH HEX(__SUNPRO_C & 0xF) +# else + /* __SUNPRO_CC = 0xVRP */ +# define COMPILER_VERSION_MAJOR HEX(__SUNPRO_C>>8) +# define COMPILER_VERSION_MINOR HEX(__SUNPRO_C>>4 & 0xF) +# define COMPILER_VERSION_PATCH HEX(__SUNPRO_C & 0xF) +# endif + +#elif defined(__HP_cc) +# define COMPILER_ID "HP" + /* __HP_cc = VVRRPP */ +# define COMPILER_VERSION_MAJOR DEC(__HP_cc/10000) +# define COMPILER_VERSION_MINOR DEC(__HP_cc/100 % 100) +# define COMPILER_VERSION_PATCH DEC(__HP_cc % 100) + +#elif defined(__DECC) +# define COMPILER_ID "Compaq" + /* __DECC_VER = VVRRTPPPP */ +# define COMPILER_VERSION_MAJOR DEC(__DECC_VER/10000000) +# define COMPILER_VERSION_MINOR DEC(__DECC_VER/100000 % 100) +# define COMPILER_VERSION_PATCH DEC(__DECC_VER % 10000) + +#elif defined(__IBMC__) && defined(__COMPILER_VER__) +# define COMPILER_ID "zOS" + /* __IBMC__ = VRP */ +# define COMPILER_VERSION_MAJOR DEC(__IBMC__/100) +# define COMPILER_VERSION_MINOR DEC(__IBMC__/10 % 10) +# define COMPILER_VERSION_PATCH DEC(__IBMC__ % 10) + +#elif defined(__open_xl__) && defined(__clang__) +# define COMPILER_ID "IBMClang" +# define COMPILER_VERSION_MAJOR DEC(__open_xl_version__) +# define COMPILER_VERSION_MINOR DEC(__open_xl_release__) +# define COMPILER_VERSION_PATCH DEC(__open_xl_modification__) +# define COMPILER_VERSION_TWEAK DEC(__open_xl_ptf_fix_level__) + + +#elif defined(__ibmxl__) && defined(__clang__) +# define COMPILER_ID "XLClang" +# define COMPILER_VERSION_MAJOR DEC(__ibmxl_version__) +# define COMPILER_VERSION_MINOR DEC(__ibmxl_release__) +# define COMPILER_VERSION_PATCH DEC(__ibmxl_modification__) +# define COMPILER_VERSION_TWEAK DEC(__ibmxl_ptf_fix_level__) + + +#elif defined(__IBMC__) && !defined(__COMPILER_VER__) && __IBMC__ >= 800 +# define COMPILER_ID "XL" + /* __IBMC__ = VRP */ +# define COMPILER_VERSION_MAJOR DEC(__IBMC__/100) +# define COMPILER_VERSION_MINOR DEC(__IBMC__/10 % 10) +# define COMPILER_VERSION_PATCH DEC(__IBMC__ % 10) + +#elif defined(__IBMC__) && !defined(__COMPILER_VER__) && __IBMC__ < 800 +# define COMPILER_ID "VisualAge" + /* __IBMC__ = VRP */ +# define COMPILER_VERSION_MAJOR DEC(__IBMC__/100) +# define COMPILER_VERSION_MINOR DEC(__IBMC__/10 % 10) +# define COMPILER_VERSION_PATCH DEC(__IBMC__ % 10) + +#elif defined(__NVCOMPILER) +# define COMPILER_ID "NVHPC" +# define COMPILER_VERSION_MAJOR DEC(__NVCOMPILER_MAJOR__) +# define COMPILER_VERSION_MINOR DEC(__NVCOMPILER_MINOR__) +# if defined(__NVCOMPILER_PATCHLEVEL__) +# define COMPILER_VERSION_PATCH DEC(__NVCOMPILER_PATCHLEVEL__) +# endif + +#elif defined(__PGI) +# define COMPILER_ID "PGI" +# define COMPILER_VERSION_MAJOR DEC(__PGIC__) +# define COMPILER_VERSION_MINOR DEC(__PGIC_MINOR__) +# if defined(__PGIC_PATCHLEVEL__) +# define COMPILER_VERSION_PATCH DEC(__PGIC_PATCHLEVEL__) +# endif + +#elif defined(__clang__) && defined(__cray__) +# define COMPILER_ID "CrayClang" +# define COMPILER_VERSION_MAJOR DEC(__cray_major__) +# define COMPILER_VERSION_MINOR DEC(__cray_minor__) +# define COMPILER_VERSION_PATCH DEC(__cray_patchlevel__) +# define COMPILER_VERSION_INTERNAL_STR __clang_version__ + + +#elif defined(_CRAYC) +# define COMPILER_ID "Cray" +# define COMPILER_VERSION_MAJOR DEC(_RELEASE_MAJOR) +# define COMPILER_VERSION_MINOR DEC(_RELEASE_MINOR) + +#elif defined(__TI_COMPILER_VERSION__) +# define COMPILER_ID "TI" + /* __TI_COMPILER_VERSION__ = VVVRRRPPP */ +# define COMPILER_VERSION_MAJOR DEC(__TI_COMPILER_VERSION__/1000000) +# define COMPILER_VERSION_MINOR DEC(__TI_COMPILER_VERSION__/1000 % 1000) +# define COMPILER_VERSION_PATCH DEC(__TI_COMPILER_VERSION__ % 1000) + +#elif defined(__CLANG_FUJITSU) +# define COMPILER_ID "FujitsuClang" +# define COMPILER_VERSION_MAJOR DEC(__FCC_major__) +# define COMPILER_VERSION_MINOR DEC(__FCC_minor__) +# define COMPILER_VERSION_PATCH DEC(__FCC_patchlevel__) +# define COMPILER_VERSION_INTERNAL_STR __clang_version__ + + +#elif defined(__FUJITSU) +# define COMPILER_ID "Fujitsu" +# if defined(__FCC_version__) +# define COMPILER_VERSION __FCC_version__ +# elif defined(__FCC_major__) +# define COMPILER_VERSION_MAJOR DEC(__FCC_major__) +# define COMPILER_VERSION_MINOR DEC(__FCC_minor__) +# define COMPILER_VERSION_PATCH DEC(__FCC_patchlevel__) +# endif +# if defined(__fcc_version) +# define COMPILER_VERSION_INTERNAL DEC(__fcc_version) +# elif defined(__FCC_VERSION) +# define COMPILER_VERSION_INTERNAL DEC(__FCC_VERSION) +# endif + + +#elif defined(__ghs__) +# define COMPILER_ID "GHS" +/* __GHS_VERSION_NUMBER = VVVVRP */ +# ifdef __GHS_VERSION_NUMBER +# define COMPILER_VERSION_MAJOR DEC(__GHS_VERSION_NUMBER / 100) +# define COMPILER_VERSION_MINOR DEC(__GHS_VERSION_NUMBER / 10 % 10) +# define COMPILER_VERSION_PATCH DEC(__GHS_VERSION_NUMBER % 10) +# endif + +#elif defined(__TASKING__) +# define COMPILER_ID "Tasking" + # define COMPILER_VERSION_MAJOR DEC(__VERSION__/1000) + # define COMPILER_VERSION_MINOR DEC(__VERSION__ % 100) +# define COMPILER_VERSION_INTERNAL DEC(__VERSION__) + +#elif defined(__ORANGEC__) +# define COMPILER_ID "OrangeC" +# define COMPILER_VERSION_MAJOR DEC(__ORANGEC_MAJOR__) +# define COMPILER_VERSION_MINOR DEC(__ORANGEC_MINOR__) +# define COMPILER_VERSION_PATCH DEC(__ORANGEC_PATCHLEVEL__) + +#elif defined(__TINYC__) +# define COMPILER_ID "TinyCC" + +#elif defined(__BCC__) +# define COMPILER_ID "Bruce" + +#elif defined(__SCO_VERSION__) +# define COMPILER_ID "SCO" + +#elif defined(__ARMCC_VERSION) && !defined(__clang__) +# define COMPILER_ID "ARMCC" +#if __ARMCC_VERSION >= 1000000 + /* __ARMCC_VERSION = VRRPPPP */ + # define COMPILER_VERSION_MAJOR DEC(__ARMCC_VERSION/1000000) + # define COMPILER_VERSION_MINOR DEC(__ARMCC_VERSION/10000 % 100) + # define COMPILER_VERSION_PATCH DEC(__ARMCC_VERSION % 10000) +#else + /* __ARMCC_VERSION = VRPPPP */ + # define COMPILER_VERSION_MAJOR DEC(__ARMCC_VERSION/100000) + # define COMPILER_VERSION_MINOR DEC(__ARMCC_VERSION/10000 % 10) + # define COMPILER_VERSION_PATCH DEC(__ARMCC_VERSION % 10000) +#endif + + +#elif defined(__clang__) && defined(__apple_build_version__) +# define COMPILER_ID "AppleClang" +# if defined(_MSC_VER) +# define SIMULATE_ID "MSVC" +# endif +# define COMPILER_VERSION_MAJOR DEC(__clang_major__) +# define COMPILER_VERSION_MINOR DEC(__clang_minor__) +# define COMPILER_VERSION_PATCH DEC(__clang_patchlevel__) +# if defined(_MSC_VER) + /* _MSC_VER = VVRR */ +# define SIMULATE_VERSION_MAJOR DEC(_MSC_VER / 100) +# define SIMULATE_VERSION_MINOR DEC(_MSC_VER % 100) +# endif +# define COMPILER_VERSION_TWEAK DEC(__apple_build_version__) + +#elif defined(__clang__) && defined(__ARMCOMPILER_VERSION) +# define COMPILER_ID "ARMClang" + # define COMPILER_VERSION_MAJOR DEC(__ARMCOMPILER_VERSION/1000000) + # define COMPILER_VERSION_MINOR DEC(__ARMCOMPILER_VERSION/10000 % 100) + # define COMPILER_VERSION_PATCH DEC(__ARMCOMPILER_VERSION/100 % 100) +# define COMPILER_VERSION_INTERNAL DEC(__ARMCOMPILER_VERSION) + +#elif defined(__clang__) && defined(__ti__) +# define COMPILER_ID "TIClang" + # define COMPILER_VERSION_MAJOR DEC(__ti_major__) + # define COMPILER_VERSION_MINOR DEC(__ti_minor__) + # define COMPILER_VERSION_PATCH DEC(__ti_patchlevel__) +# define COMPILER_VERSION_INTERNAL DEC(__ti_version__) + +#elif defined(__clang__) +# define COMPILER_ID "Clang" +# if defined(_MSC_VER) +# define SIMULATE_ID "MSVC" +# endif +# define COMPILER_VERSION_MAJOR DEC(__clang_major__) +# define COMPILER_VERSION_MINOR DEC(__clang_minor__) +# define COMPILER_VERSION_PATCH DEC(__clang_patchlevel__) +# if defined(_MSC_VER) + /* _MSC_VER = VVRR */ +# define SIMULATE_VERSION_MAJOR DEC(_MSC_VER / 100) +# define SIMULATE_VERSION_MINOR DEC(_MSC_VER % 100) +# endif + +#elif defined(__LCC__) && (defined(__GNUC__) || defined(__GNUG__) || defined(__MCST__)) +# define COMPILER_ID "LCC" +# define COMPILER_VERSION_MAJOR DEC(__LCC__ / 100) +# define COMPILER_VERSION_MINOR DEC(__LCC__ % 100) +# if defined(__LCC_MINOR__) +# define COMPILER_VERSION_PATCH DEC(__LCC_MINOR__) +# endif +# if defined(__GNUC__) && defined(__GNUC_MINOR__) +# define SIMULATE_ID "GNU" +# define SIMULATE_VERSION_MAJOR DEC(__GNUC__) +# define SIMULATE_VERSION_MINOR DEC(__GNUC_MINOR__) +# if defined(__GNUC_PATCHLEVEL__) +# define SIMULATE_VERSION_PATCH DEC(__GNUC_PATCHLEVEL__) +# endif +# endif + +#elif defined(__GNUC__) +# define COMPILER_ID "GNU" +# define COMPILER_VERSION_MAJOR DEC(__GNUC__) +# if defined(__GNUC_MINOR__) +# define COMPILER_VERSION_MINOR DEC(__GNUC_MINOR__) +# endif +# if defined(__GNUC_PATCHLEVEL__) +# define COMPILER_VERSION_PATCH DEC(__GNUC_PATCHLEVEL__) +# endif + +#elif defined(_MSC_VER) +# define COMPILER_ID "MSVC" + /* _MSC_VER = VVRR */ +# define COMPILER_VERSION_MAJOR DEC(_MSC_VER / 100) +# define COMPILER_VERSION_MINOR DEC(_MSC_VER % 100) +# if defined(_MSC_FULL_VER) +# if _MSC_VER >= 1400 + /* _MSC_FULL_VER = VVRRPPPPP */ +# define COMPILER_VERSION_PATCH DEC(_MSC_FULL_VER % 100000) +# else + /* _MSC_FULL_VER = VVRRPPPP */ +# define COMPILER_VERSION_PATCH DEC(_MSC_FULL_VER % 10000) +# endif +# endif +# if defined(_MSC_BUILD) +# define COMPILER_VERSION_TWEAK DEC(_MSC_BUILD) +# endif + +#elif defined(_ADI_COMPILER) +# define COMPILER_ID "ADSP" +#if defined(__VERSIONNUM__) + /* __VERSIONNUM__ = 0xVVRRPPTT */ +# define COMPILER_VERSION_MAJOR DEC(__VERSIONNUM__ >> 24 & 0xFF) +# define COMPILER_VERSION_MINOR DEC(__VERSIONNUM__ >> 16 & 0xFF) +# define COMPILER_VERSION_PATCH DEC(__VERSIONNUM__ >> 8 & 0xFF) +# define COMPILER_VERSION_TWEAK DEC(__VERSIONNUM__ & 0xFF) +#endif + +#elif defined(__IAR_SYSTEMS_ICC__) || defined(__IAR_SYSTEMS_ICC) +# define COMPILER_ID "IAR" +# if defined(__VER__) && defined(__ICCARM__) +# define COMPILER_VERSION_MAJOR DEC((__VER__) / 1000000) +# define COMPILER_VERSION_MINOR DEC(((__VER__) / 1000) % 1000) +# define COMPILER_VERSION_PATCH DEC((__VER__) % 1000) +# define COMPILER_VERSION_INTERNAL DEC(__IAR_SYSTEMS_ICC__) +# elif defined(__VER__) && (defined(__ICCAVR__) || defined(__ICCRX__) || defined(__ICCRH850__) || defined(__ICCRL78__) || defined(__ICC430__) || defined(__ICCRISCV__) || defined(__ICCV850__) || defined(__ICC8051__) || defined(__ICCSTM8__)) +# define COMPILER_VERSION_MAJOR DEC((__VER__) / 100) +# define COMPILER_VERSION_MINOR DEC((__VER__) - (((__VER__) / 100)*100)) +# define COMPILER_VERSION_PATCH DEC(__SUBVERSION__) +# define COMPILER_VERSION_INTERNAL DEC(__IAR_SYSTEMS_ICC__) +# endif + +#elif defined(__SDCC_VERSION_MAJOR) || defined(SDCC) +# define COMPILER_ID "SDCC" +# if defined(__SDCC_VERSION_MAJOR) +# define COMPILER_VERSION_MAJOR DEC(__SDCC_VERSION_MAJOR) +# define COMPILER_VERSION_MINOR DEC(__SDCC_VERSION_MINOR) +# define COMPILER_VERSION_PATCH DEC(__SDCC_VERSION_PATCH) +# else + /* SDCC = VRP */ +# define COMPILER_VERSION_MAJOR DEC(SDCC/100) +# define COMPILER_VERSION_MINOR DEC(SDCC/10 % 10) +# define COMPILER_VERSION_PATCH DEC(SDCC % 10) +# endif + + +/* These compilers are either not known or too old to define an + identification macro. Try to identify the platform and guess that + it is the native compiler. */ +#elif defined(__hpux) || defined(__hpua) +# define COMPILER_ID "HP" + +#else /* unknown compiler */ +# define COMPILER_ID "" +#endif + +/* Construct the string literal in pieces to prevent the source from + getting matched. Store it in a pointer rather than an array + because some compilers will just produce instructions to fill the + array rather than assigning a pointer to a static array. */ +char const* info_compiler = "INFO" ":" "compiler[" COMPILER_ID "]"; +#ifdef SIMULATE_ID +char const* info_simulate = "INFO" ":" "simulate[" SIMULATE_ID "]"; +#endif + +#ifdef __QNXNTO__ +char const* qnxnto = "INFO" ":" "qnxnto[]"; +#endif + +#if defined(__CRAYXT_COMPUTE_LINUX_TARGET) +char const *info_cray = "INFO" ":" "compiler_wrapper[CrayPrgEnv]"; +#endif + +#define STRINGIFY_HELPER(X) #X +#define STRINGIFY(X) STRINGIFY_HELPER(X) + +/* Identify known platforms by name. */ +#if defined(__linux) || defined(__linux__) || defined(linux) +# define PLATFORM_ID "Linux" + +#elif defined(__MSYS__) +# define PLATFORM_ID "MSYS" + +#elif defined(__CYGWIN__) +# define PLATFORM_ID "Cygwin" + +#elif defined(__MINGW32__) +# define PLATFORM_ID "MinGW" + +#elif defined(__APPLE__) +# define PLATFORM_ID "Darwin" + +#elif defined(_WIN32) || defined(__WIN32__) || defined(WIN32) +# define PLATFORM_ID "Windows" + +#elif defined(__FreeBSD__) || defined(__FreeBSD) +# define PLATFORM_ID "FreeBSD" + +#elif defined(__NetBSD__) || defined(__NetBSD) +# define PLATFORM_ID "NetBSD" + +#elif defined(__OpenBSD__) || defined(__OPENBSD) +# define PLATFORM_ID "OpenBSD" + +#elif defined(__sun) || defined(sun) +# define PLATFORM_ID "SunOS" + +#elif defined(_AIX) || defined(__AIX) || defined(__AIX__) || defined(__aix) || defined(__aix__) +# define PLATFORM_ID "AIX" + +#elif defined(__hpux) || defined(__hpux__) +# define PLATFORM_ID "HP-UX" + +#elif defined(__HAIKU__) +# define PLATFORM_ID "Haiku" + +#elif defined(__BeOS) || defined(__BEOS__) || defined(_BEOS) +# define PLATFORM_ID "BeOS" + +#elif defined(__QNX__) || defined(__QNXNTO__) +# define PLATFORM_ID "QNX" + +#elif defined(__tru64) || defined(_tru64) || defined(__TRU64__) +# define PLATFORM_ID "Tru64" + +#elif defined(__riscos) || defined(__riscos__) +# define PLATFORM_ID "RISCos" + +#elif defined(__sinix) || defined(__sinix__) || defined(__SINIX__) +# define PLATFORM_ID "SINIX" + +#elif defined(__UNIX_SV__) +# define PLATFORM_ID "UNIX_SV" + +#elif defined(__bsdos__) +# define PLATFORM_ID "BSDOS" + +#elif defined(_MPRAS) || defined(MPRAS) +# define PLATFORM_ID "MP-RAS" + +#elif defined(__osf) || defined(__osf__) +# define PLATFORM_ID "OSF1" + +#elif defined(_SCO_SV) || defined(SCO_SV) || defined(sco_sv) +# define PLATFORM_ID "SCO_SV" + +#elif defined(__ultrix) || defined(__ultrix__) || defined(_ULTRIX) +# define PLATFORM_ID "ULTRIX" + +#elif defined(__XENIX__) || defined(_XENIX) || defined(XENIX) +# define PLATFORM_ID "Xenix" + +#elif defined(__WATCOMC__) +# if defined(__LINUX__) +# define PLATFORM_ID "Linux" + +# elif defined(__DOS__) +# define PLATFORM_ID "DOS" + +# elif defined(__OS2__) +# define PLATFORM_ID "OS2" + +# elif defined(__WINDOWS__) +# define PLATFORM_ID "Windows3x" + +# elif defined(__VXWORKS__) +# define PLATFORM_ID "VxWorks" + +# else /* unknown platform */ +# define PLATFORM_ID +# endif + +#elif defined(__INTEGRITY) +# if defined(INT_178B) +# define PLATFORM_ID "Integrity178" + +# else /* regular Integrity */ +# define PLATFORM_ID "Integrity" +# endif + +# elif defined(_ADI_COMPILER) +# define PLATFORM_ID "ADSP" + +#else /* unknown platform */ +# define PLATFORM_ID + +#endif + +/* For windows compilers MSVC and Intel we can determine + the architecture of the compiler being used. This is because + the compilers do not have flags that can change the architecture, + but rather depend on which compiler is being used +*/ +#if defined(_WIN32) && defined(_MSC_VER) +# if defined(_M_IA64) +# define ARCHITECTURE_ID "IA64" + +# elif defined(_M_ARM64EC) +# define ARCHITECTURE_ID "ARM64EC" + +# elif defined(_M_X64) || defined(_M_AMD64) +# define ARCHITECTURE_ID "x64" + +# elif defined(_M_IX86) +# define ARCHITECTURE_ID "X86" + +# elif defined(_M_ARM64) +# define ARCHITECTURE_ID "ARM64" + +# elif defined(_M_ARM) +# if _M_ARM == 4 +# define ARCHITECTURE_ID "ARMV4I" +# elif _M_ARM == 5 +# define ARCHITECTURE_ID "ARMV5I" +# else +# define ARCHITECTURE_ID "ARMV" STRINGIFY(_M_ARM) +# endif + +# elif defined(_M_MIPS) +# define ARCHITECTURE_ID "MIPS" + +# elif defined(_M_SH) +# define ARCHITECTURE_ID "SHx" + +# else /* unknown architecture */ +# define ARCHITECTURE_ID "" +# endif + +#elif defined(__WATCOMC__) +# if defined(_M_I86) +# define ARCHITECTURE_ID "I86" + +# elif defined(_M_IX86) +# define ARCHITECTURE_ID "X86" + +# else /* unknown architecture */ +# define ARCHITECTURE_ID "" +# endif + +#elif defined(__IAR_SYSTEMS_ICC__) || defined(__IAR_SYSTEMS_ICC) +# if defined(__ICCARM__) +# define ARCHITECTURE_ID "ARM" + +# elif defined(__ICCRX__) +# define ARCHITECTURE_ID "RX" + +# elif defined(__ICCRH850__) +# define ARCHITECTURE_ID "RH850" + +# elif defined(__ICCRL78__) +# define ARCHITECTURE_ID "RL78" + +# elif defined(__ICCRISCV__) +# define ARCHITECTURE_ID "RISCV" + +# elif defined(__ICCAVR__) +# define ARCHITECTURE_ID "AVR" + +# elif defined(__ICC430__) +# define ARCHITECTURE_ID "MSP430" + +# elif defined(__ICCV850__) +# define ARCHITECTURE_ID "V850" + +# elif defined(__ICC8051__) +# define ARCHITECTURE_ID "8051" + +# elif defined(__ICCSTM8__) +# define ARCHITECTURE_ID "STM8" + +# else /* unknown architecture */ +# define ARCHITECTURE_ID "" +# endif + +#elif defined(__ghs__) +# if defined(__PPC64__) +# define ARCHITECTURE_ID "PPC64" + +# elif defined(__ppc__) +# define ARCHITECTURE_ID "PPC" + +# elif defined(__ARM__) +# define ARCHITECTURE_ID "ARM" + +# elif defined(__x86_64__) +# define ARCHITECTURE_ID "x64" + +# elif defined(__i386__) +# define ARCHITECTURE_ID "X86" + +# else /* unknown architecture */ +# define ARCHITECTURE_ID "" +# endif + +#elif defined(__clang__) && defined(__ti__) +# if defined(__ARM_ARCH) +# define ARCHITECTURE_ID "Arm" + +# else /* unknown architecture */ +# define ARCHITECTURE_ID "" +# endif + +#elif defined(__TI_COMPILER_VERSION__) +# if defined(__TI_ARM__) +# define ARCHITECTURE_ID "ARM" + +# elif defined(__MSP430__) +# define ARCHITECTURE_ID "MSP430" + +# elif defined(__TMS320C28XX__) +# define ARCHITECTURE_ID "TMS320C28x" + +# elif defined(__TMS320C6X__) || defined(_TMS320C6X) +# define ARCHITECTURE_ID "TMS320C6x" + +# else /* unknown architecture */ +# define ARCHITECTURE_ID "" +# endif + +# elif defined(__ADSPSHARC__) +# define ARCHITECTURE_ID "SHARC" + +# elif defined(__ADSPBLACKFIN__) +# define ARCHITECTURE_ID "Blackfin" + +#elif defined(__TASKING__) + +# if defined(__CTC__) || defined(__CPTC__) +# define ARCHITECTURE_ID "TriCore" + +# elif defined(__CMCS__) +# define ARCHITECTURE_ID "MCS" + +# elif defined(__CARM__) +# define ARCHITECTURE_ID "ARM" + +# elif defined(__CARC__) +# define ARCHITECTURE_ID "ARC" + +# elif defined(__C51__) +# define ARCHITECTURE_ID "8051" + +# elif defined(__CPCP__) +# define ARCHITECTURE_ID "PCP" + +# else +# define ARCHITECTURE_ID "" +# endif + +#else +# define ARCHITECTURE_ID +#endif + +/* Convert integer to decimal digit literals. */ +#define DEC(n) \ + ('0' + (((n) / 10000000)%10)), \ + ('0' + (((n) / 1000000)%10)), \ + ('0' + (((n) / 100000)%10)), \ + ('0' + (((n) / 10000)%10)), \ + ('0' + (((n) / 1000)%10)), \ + ('0' + (((n) / 100)%10)), \ + ('0' + (((n) / 10)%10)), \ + ('0' + ((n) % 10)) + +/* Convert integer to hex digit literals. */ +#define HEX(n) \ + ('0' + ((n)>>28 & 0xF)), \ + ('0' + ((n)>>24 & 0xF)), \ + ('0' + ((n)>>20 & 0xF)), \ + ('0' + ((n)>>16 & 0xF)), \ + ('0' + ((n)>>12 & 0xF)), \ + ('0' + ((n)>>8 & 0xF)), \ + ('0' + ((n)>>4 & 0xF)), \ + ('0' + ((n) & 0xF)) + +/* Construct a string literal encoding the version number. */ +#ifdef COMPILER_VERSION +char const* info_version = "INFO" ":" "compiler_version[" COMPILER_VERSION "]"; + +/* Construct a string literal encoding the version number components. */ +#elif defined(COMPILER_VERSION_MAJOR) +char const info_version[] = { + 'I', 'N', 'F', 'O', ':', + 'c','o','m','p','i','l','e','r','_','v','e','r','s','i','o','n','[', + COMPILER_VERSION_MAJOR, +# ifdef COMPILER_VERSION_MINOR + '.', COMPILER_VERSION_MINOR, +# ifdef COMPILER_VERSION_PATCH + '.', COMPILER_VERSION_PATCH, +# ifdef COMPILER_VERSION_TWEAK + '.', COMPILER_VERSION_TWEAK, +# endif +# endif +# endif + ']','\0'}; +#endif + +/* Construct a string literal encoding the internal version number. */ +#ifdef COMPILER_VERSION_INTERNAL +char const info_version_internal[] = { + 'I', 'N', 'F', 'O', ':', + 'c','o','m','p','i','l','e','r','_','v','e','r','s','i','o','n','_', + 'i','n','t','e','r','n','a','l','[', + COMPILER_VERSION_INTERNAL,']','\0'}; +#elif defined(COMPILER_VERSION_INTERNAL_STR) +char const* info_version_internal = "INFO" ":" "compiler_version_internal[" COMPILER_VERSION_INTERNAL_STR "]"; +#endif + +/* Construct a string literal encoding the version number components. */ +#ifdef SIMULATE_VERSION_MAJOR +char const info_simulate_version[] = { + 'I', 'N', 'F', 'O', ':', + 's','i','m','u','l','a','t','e','_','v','e','r','s','i','o','n','[', + SIMULATE_VERSION_MAJOR, +# ifdef SIMULATE_VERSION_MINOR + '.', SIMULATE_VERSION_MINOR, +# ifdef SIMULATE_VERSION_PATCH + '.', SIMULATE_VERSION_PATCH, +# ifdef SIMULATE_VERSION_TWEAK + '.', SIMULATE_VERSION_TWEAK, +# endif +# endif +# endif + ']','\0'}; +#endif + +/* Construct the string literal in pieces to prevent the source from + getting matched. Store it in a pointer rather than an array + because some compilers will just produce instructions to fill the + array rather than assigning a pointer to a static array. */ +char const* info_platform = "INFO" ":" "platform[" PLATFORM_ID "]"; +char const* info_arch = "INFO" ":" "arch[" ARCHITECTURE_ID "]"; + + + +#define C_STD_99 199901L +#define C_STD_11 201112L +#define C_STD_17 201710L +#define C_STD_23 202311L + +#ifdef __STDC_VERSION__ +# define C_STD __STDC_VERSION__ +#endif + +#if !defined(__STDC__) && !defined(__clang__) +# if defined(_MSC_VER) || defined(__ibmxl__) || defined(__IBMC__) +# define C_VERSION "90" +# else +# define C_VERSION +# endif +#elif C_STD > C_STD_17 +# define C_VERSION "23" +#elif C_STD > C_STD_11 +# define C_VERSION "17" +#elif C_STD > C_STD_99 +# define C_VERSION "11" +#elif C_STD >= C_STD_99 +# define C_VERSION "99" +#else +# define C_VERSION "90" +#endif +const char* info_language_standard_default = + "INFO" ":" "standard_default[" C_VERSION "]"; + +const char* info_language_extensions_default = "INFO" ":" "extensions_default[" +#if (defined(__clang__) || defined(__GNUC__) || defined(__xlC__) || \ + defined(__TI_COMPILER_VERSION__)) && \ + !defined(__STRICT_ANSI__) + "ON" +#else + "OFF" +#endif +"]"; + +/*--------------------------------------------------------------------------*/ + +#ifdef ID_VOID_MAIN +void main() {} +#else +# if defined(__CLASSIC_C__) +int main(argc, argv) int argc; char *argv[]; +# else +int main(int argc, char* argv[]) +# endif +{ + int require = 0; + require += info_compiler[argc]; + require += info_platform[argc]; + require += info_arch[argc]; +#ifdef COMPILER_VERSION_MAJOR + require += info_version[argc]; +#endif +#ifdef COMPILER_VERSION_INTERNAL + require += info_version_internal[argc]; +#endif +#ifdef SIMULATE_ID + require += info_simulate[argc]; +#endif +#ifdef SIMULATE_VERSION_MAJOR + require += info_simulate_version[argc]; +#endif +#if defined(__CRAYXT_COMPUTE_LINUX_TARGET) + require += info_cray[argc]; +#endif + require += info_language_standard_default[argc]; + require += info_language_extensions_default[argc]; + (void)argv; + return require; +} +#endif diff --git a/siro_driver/android/app/.cxx/Debug/2j1f5m6a/armeabi-v7a/CMakeFiles/3.31.5-g6cf5163/CompilerIdC/CMakeCCompilerId.o b/siro_driver/android/app/.cxx/Debug/2j1f5m6a/armeabi-v7a/CMakeFiles/3.31.5-g6cf5163/CompilerIdC/CMakeCCompilerId.o new file mode 100644 index 0000000..789424a Binary files /dev/null and b/siro_driver/android/app/.cxx/Debug/2j1f5m6a/armeabi-v7a/CMakeFiles/3.31.5-g6cf5163/CompilerIdC/CMakeCCompilerId.o differ diff --git a/siro_driver/android/app/.cxx/Debug/2j1f5m6a/armeabi-v7a/CMakeFiles/3.31.5-g6cf5163/CompilerIdCXX/CMakeCXXCompilerId.cpp b/siro_driver/android/app/.cxx/Debug/2j1f5m6a/armeabi-v7a/CMakeFiles/3.31.5-g6cf5163/CompilerIdCXX/CMakeCXXCompilerId.cpp new file mode 100644 index 0000000..da6c824 --- /dev/null +++ b/siro_driver/android/app/.cxx/Debug/2j1f5m6a/armeabi-v7a/CMakeFiles/3.31.5-g6cf5163/CompilerIdCXX/CMakeCXXCompilerId.cpp @@ -0,0 +1,919 @@ +/* This source file must have a .cpp extension so that all C++ compilers + recognize the extension without flags. Borland does not know .cxx for + example. */ +#ifndef __cplusplus +# error "A C compiler has been selected for C++." +#endif + +#if !defined(__has_include) +/* If the compiler does not have __has_include, pretend the answer is + always no. */ +# define __has_include(x) 0 +#endif + + +/* Version number components: V=Version, R=Revision, P=Patch + Version date components: YYYY=Year, MM=Month, DD=Day */ + +#if defined(__INTEL_COMPILER) || defined(__ICC) +# define COMPILER_ID "Intel" +# if defined(_MSC_VER) +# define SIMULATE_ID "MSVC" +# endif +# if defined(__GNUC__) +# define SIMULATE_ID "GNU" +# endif + /* __INTEL_COMPILER = VRP prior to 2021, and then VVVV for 2021 and later, + except that a few beta releases use the old format with V=2021. */ +# if __INTEL_COMPILER < 2021 || __INTEL_COMPILER == 202110 || __INTEL_COMPILER == 202111 +# define COMPILER_VERSION_MAJOR DEC(__INTEL_COMPILER/100) +# define COMPILER_VERSION_MINOR DEC(__INTEL_COMPILER/10 % 10) +# if defined(__INTEL_COMPILER_UPDATE) +# define COMPILER_VERSION_PATCH DEC(__INTEL_COMPILER_UPDATE) +# else +# define COMPILER_VERSION_PATCH DEC(__INTEL_COMPILER % 10) +# endif +# else +# define COMPILER_VERSION_MAJOR DEC(__INTEL_COMPILER) +# define COMPILER_VERSION_MINOR DEC(__INTEL_COMPILER_UPDATE) + /* The third version component from --version is an update index, + but no macro is provided for it. */ +# define COMPILER_VERSION_PATCH DEC(0) +# endif +# if defined(__INTEL_COMPILER_BUILD_DATE) + /* __INTEL_COMPILER_BUILD_DATE = YYYYMMDD */ +# define COMPILER_VERSION_TWEAK DEC(__INTEL_COMPILER_BUILD_DATE) +# endif +# if defined(_MSC_VER) + /* _MSC_VER = VVRR */ +# define SIMULATE_VERSION_MAJOR DEC(_MSC_VER / 100) +# define SIMULATE_VERSION_MINOR DEC(_MSC_VER % 100) +# endif +# if defined(__GNUC__) +# define SIMULATE_VERSION_MAJOR DEC(__GNUC__) +# elif defined(__GNUG__) +# define SIMULATE_VERSION_MAJOR DEC(__GNUG__) +# endif +# if defined(__GNUC_MINOR__) +# define SIMULATE_VERSION_MINOR DEC(__GNUC_MINOR__) +# endif +# if defined(__GNUC_PATCHLEVEL__) +# define SIMULATE_VERSION_PATCH DEC(__GNUC_PATCHLEVEL__) +# endif + +#elif (defined(__clang__) && defined(__INTEL_CLANG_COMPILER)) || defined(__INTEL_LLVM_COMPILER) +# define COMPILER_ID "IntelLLVM" +#if defined(_MSC_VER) +# define SIMULATE_ID "MSVC" +#endif +#if defined(__GNUC__) +# define SIMULATE_ID "GNU" +#endif +/* __INTEL_LLVM_COMPILER = VVVVRP prior to 2021.2.0, VVVVRRPP for 2021.2.0 and + * later. Look for 6 digit vs. 8 digit version number to decide encoding. + * VVVV is no smaller than the current year when a version is released. + */ +#if __INTEL_LLVM_COMPILER < 1000000L +# define COMPILER_VERSION_MAJOR DEC(__INTEL_LLVM_COMPILER/100) +# define COMPILER_VERSION_MINOR DEC(__INTEL_LLVM_COMPILER/10 % 10) +# define COMPILER_VERSION_PATCH DEC(__INTEL_LLVM_COMPILER % 10) +#else +# define COMPILER_VERSION_MAJOR DEC(__INTEL_LLVM_COMPILER/10000) +# define COMPILER_VERSION_MINOR DEC(__INTEL_LLVM_COMPILER/100 % 100) +# define COMPILER_VERSION_PATCH DEC(__INTEL_LLVM_COMPILER % 100) +#endif +#if defined(_MSC_VER) + /* _MSC_VER = VVRR */ +# define SIMULATE_VERSION_MAJOR DEC(_MSC_VER / 100) +# define SIMULATE_VERSION_MINOR DEC(_MSC_VER % 100) +#endif +#if defined(__GNUC__) +# define SIMULATE_VERSION_MAJOR DEC(__GNUC__) +#elif defined(__GNUG__) +# define SIMULATE_VERSION_MAJOR DEC(__GNUG__) +#endif +#if defined(__GNUC_MINOR__) +# define SIMULATE_VERSION_MINOR DEC(__GNUC_MINOR__) +#endif +#if defined(__GNUC_PATCHLEVEL__) +# define SIMULATE_VERSION_PATCH DEC(__GNUC_PATCHLEVEL__) +#endif + +#elif defined(__PATHCC__) +# define COMPILER_ID "PathScale" +# define COMPILER_VERSION_MAJOR DEC(__PATHCC__) +# define COMPILER_VERSION_MINOR DEC(__PATHCC_MINOR__) +# if defined(__PATHCC_PATCHLEVEL__) +# define COMPILER_VERSION_PATCH DEC(__PATHCC_PATCHLEVEL__) +# endif + +#elif defined(__BORLANDC__) && defined(__CODEGEARC_VERSION__) +# define COMPILER_ID "Embarcadero" +# define COMPILER_VERSION_MAJOR HEX(__CODEGEARC_VERSION__>>24 & 0x00FF) +# define COMPILER_VERSION_MINOR HEX(__CODEGEARC_VERSION__>>16 & 0x00FF) +# define COMPILER_VERSION_PATCH DEC(__CODEGEARC_VERSION__ & 0xFFFF) + +#elif defined(__BORLANDC__) +# define COMPILER_ID "Borland" + /* __BORLANDC__ = 0xVRR */ +# define COMPILER_VERSION_MAJOR HEX(__BORLANDC__>>8) +# define COMPILER_VERSION_MINOR HEX(__BORLANDC__ & 0xFF) + +#elif defined(__WATCOMC__) && __WATCOMC__ < 1200 +# define COMPILER_ID "Watcom" + /* __WATCOMC__ = VVRR */ +# define COMPILER_VERSION_MAJOR DEC(__WATCOMC__ / 100) +# define COMPILER_VERSION_MINOR DEC((__WATCOMC__ / 10) % 10) +# if (__WATCOMC__ % 10) > 0 +# define COMPILER_VERSION_PATCH DEC(__WATCOMC__ % 10) +# endif + +#elif defined(__WATCOMC__) +# define COMPILER_ID "OpenWatcom" + /* __WATCOMC__ = VVRP + 1100 */ +# define COMPILER_VERSION_MAJOR DEC((__WATCOMC__ - 1100) / 100) +# define COMPILER_VERSION_MINOR DEC((__WATCOMC__ / 10) % 10) +# if (__WATCOMC__ % 10) > 0 +# define COMPILER_VERSION_PATCH DEC(__WATCOMC__ % 10) +# endif + +#elif defined(__SUNPRO_CC) +# define COMPILER_ID "SunPro" +# if __SUNPRO_CC >= 0x5100 + /* __SUNPRO_CC = 0xVRRP */ +# define COMPILER_VERSION_MAJOR HEX(__SUNPRO_CC>>12) +# define COMPILER_VERSION_MINOR HEX(__SUNPRO_CC>>4 & 0xFF) +# define COMPILER_VERSION_PATCH HEX(__SUNPRO_CC & 0xF) +# else + /* __SUNPRO_CC = 0xVRP */ +# define COMPILER_VERSION_MAJOR HEX(__SUNPRO_CC>>8) +# define COMPILER_VERSION_MINOR HEX(__SUNPRO_CC>>4 & 0xF) +# define COMPILER_VERSION_PATCH HEX(__SUNPRO_CC & 0xF) +# endif + +#elif defined(__HP_aCC) +# define COMPILER_ID "HP" + /* __HP_aCC = VVRRPP */ +# define COMPILER_VERSION_MAJOR DEC(__HP_aCC/10000) +# define COMPILER_VERSION_MINOR DEC(__HP_aCC/100 % 100) +# define COMPILER_VERSION_PATCH DEC(__HP_aCC % 100) + +#elif defined(__DECCXX) +# define COMPILER_ID "Compaq" + /* __DECCXX_VER = VVRRTPPPP */ +# define COMPILER_VERSION_MAJOR DEC(__DECCXX_VER/10000000) +# define COMPILER_VERSION_MINOR DEC(__DECCXX_VER/100000 % 100) +# define COMPILER_VERSION_PATCH DEC(__DECCXX_VER % 10000) + +#elif defined(__IBMCPP__) && defined(__COMPILER_VER__) +# define COMPILER_ID "zOS" + /* __IBMCPP__ = VRP */ +# define COMPILER_VERSION_MAJOR DEC(__IBMCPP__/100) +# define COMPILER_VERSION_MINOR DEC(__IBMCPP__/10 % 10) +# define COMPILER_VERSION_PATCH DEC(__IBMCPP__ % 10) + +#elif defined(__open_xl__) && defined(__clang__) +# define COMPILER_ID "IBMClang" +# define COMPILER_VERSION_MAJOR DEC(__open_xl_version__) +# define COMPILER_VERSION_MINOR DEC(__open_xl_release__) +# define COMPILER_VERSION_PATCH DEC(__open_xl_modification__) +# define COMPILER_VERSION_TWEAK DEC(__open_xl_ptf_fix_level__) + + +#elif defined(__ibmxl__) && defined(__clang__) +# define COMPILER_ID "XLClang" +# define COMPILER_VERSION_MAJOR DEC(__ibmxl_version__) +# define COMPILER_VERSION_MINOR DEC(__ibmxl_release__) +# define COMPILER_VERSION_PATCH DEC(__ibmxl_modification__) +# define COMPILER_VERSION_TWEAK DEC(__ibmxl_ptf_fix_level__) + + +#elif defined(__IBMCPP__) && !defined(__COMPILER_VER__) && __IBMCPP__ >= 800 +# define COMPILER_ID "XL" + /* __IBMCPP__ = VRP */ +# define COMPILER_VERSION_MAJOR DEC(__IBMCPP__/100) +# define COMPILER_VERSION_MINOR DEC(__IBMCPP__/10 % 10) +# define COMPILER_VERSION_PATCH DEC(__IBMCPP__ % 10) + +#elif defined(__IBMCPP__) && !defined(__COMPILER_VER__) && __IBMCPP__ < 800 +# define COMPILER_ID "VisualAge" + /* __IBMCPP__ = VRP */ +# define COMPILER_VERSION_MAJOR DEC(__IBMCPP__/100) +# define COMPILER_VERSION_MINOR DEC(__IBMCPP__/10 % 10) +# define COMPILER_VERSION_PATCH DEC(__IBMCPP__ % 10) + +#elif defined(__NVCOMPILER) +# define COMPILER_ID "NVHPC" +# define COMPILER_VERSION_MAJOR DEC(__NVCOMPILER_MAJOR__) +# define COMPILER_VERSION_MINOR DEC(__NVCOMPILER_MINOR__) +# if defined(__NVCOMPILER_PATCHLEVEL__) +# define COMPILER_VERSION_PATCH DEC(__NVCOMPILER_PATCHLEVEL__) +# endif + +#elif defined(__PGI) +# define COMPILER_ID "PGI" +# define COMPILER_VERSION_MAJOR DEC(__PGIC__) +# define COMPILER_VERSION_MINOR DEC(__PGIC_MINOR__) +# if defined(__PGIC_PATCHLEVEL__) +# define COMPILER_VERSION_PATCH DEC(__PGIC_PATCHLEVEL__) +# endif + +#elif defined(__clang__) && defined(__cray__) +# define COMPILER_ID "CrayClang" +# define COMPILER_VERSION_MAJOR DEC(__cray_major__) +# define COMPILER_VERSION_MINOR DEC(__cray_minor__) +# define COMPILER_VERSION_PATCH DEC(__cray_patchlevel__) +# define COMPILER_VERSION_INTERNAL_STR __clang_version__ + + +#elif defined(_CRAYC) +# define COMPILER_ID "Cray" +# define COMPILER_VERSION_MAJOR DEC(_RELEASE_MAJOR) +# define COMPILER_VERSION_MINOR DEC(_RELEASE_MINOR) + +#elif defined(__TI_COMPILER_VERSION__) +# define COMPILER_ID "TI" + /* __TI_COMPILER_VERSION__ = VVVRRRPPP */ +# define COMPILER_VERSION_MAJOR DEC(__TI_COMPILER_VERSION__/1000000) +# define COMPILER_VERSION_MINOR DEC(__TI_COMPILER_VERSION__/1000 % 1000) +# define COMPILER_VERSION_PATCH DEC(__TI_COMPILER_VERSION__ % 1000) + +#elif defined(__CLANG_FUJITSU) +# define COMPILER_ID "FujitsuClang" +# define COMPILER_VERSION_MAJOR DEC(__FCC_major__) +# define COMPILER_VERSION_MINOR DEC(__FCC_minor__) +# define COMPILER_VERSION_PATCH DEC(__FCC_patchlevel__) +# define COMPILER_VERSION_INTERNAL_STR __clang_version__ + + +#elif defined(__FUJITSU) +# define COMPILER_ID "Fujitsu" +# if defined(__FCC_version__) +# define COMPILER_VERSION __FCC_version__ +# elif defined(__FCC_major__) +# define COMPILER_VERSION_MAJOR DEC(__FCC_major__) +# define COMPILER_VERSION_MINOR DEC(__FCC_minor__) +# define COMPILER_VERSION_PATCH DEC(__FCC_patchlevel__) +# endif +# if defined(__fcc_version) +# define COMPILER_VERSION_INTERNAL DEC(__fcc_version) +# elif defined(__FCC_VERSION) +# define COMPILER_VERSION_INTERNAL DEC(__FCC_VERSION) +# endif + + +#elif defined(__ghs__) +# define COMPILER_ID "GHS" +/* __GHS_VERSION_NUMBER = VVVVRP */ +# ifdef __GHS_VERSION_NUMBER +# define COMPILER_VERSION_MAJOR DEC(__GHS_VERSION_NUMBER / 100) +# define COMPILER_VERSION_MINOR DEC(__GHS_VERSION_NUMBER / 10 % 10) +# define COMPILER_VERSION_PATCH DEC(__GHS_VERSION_NUMBER % 10) +# endif + +#elif defined(__TASKING__) +# define COMPILER_ID "Tasking" + # define COMPILER_VERSION_MAJOR DEC(__VERSION__/1000) + # define COMPILER_VERSION_MINOR DEC(__VERSION__ % 100) +# define COMPILER_VERSION_INTERNAL DEC(__VERSION__) + +#elif defined(__ORANGEC__) +# define COMPILER_ID "OrangeC" +# define COMPILER_VERSION_MAJOR DEC(__ORANGEC_MAJOR__) +# define COMPILER_VERSION_MINOR DEC(__ORANGEC_MINOR__) +# define COMPILER_VERSION_PATCH DEC(__ORANGEC_PATCHLEVEL__) + +#elif defined(__SCO_VERSION__) +# define COMPILER_ID "SCO" + +#elif defined(__ARMCC_VERSION) && !defined(__clang__) +# define COMPILER_ID "ARMCC" +#if __ARMCC_VERSION >= 1000000 + /* __ARMCC_VERSION = VRRPPPP */ + # define COMPILER_VERSION_MAJOR DEC(__ARMCC_VERSION/1000000) + # define COMPILER_VERSION_MINOR DEC(__ARMCC_VERSION/10000 % 100) + # define COMPILER_VERSION_PATCH DEC(__ARMCC_VERSION % 10000) +#else + /* __ARMCC_VERSION = VRPPPP */ + # define COMPILER_VERSION_MAJOR DEC(__ARMCC_VERSION/100000) + # define COMPILER_VERSION_MINOR DEC(__ARMCC_VERSION/10000 % 10) + # define COMPILER_VERSION_PATCH DEC(__ARMCC_VERSION % 10000) +#endif + + +#elif defined(__clang__) && defined(__apple_build_version__) +# define COMPILER_ID "AppleClang" +# if defined(_MSC_VER) +# define SIMULATE_ID "MSVC" +# endif +# define COMPILER_VERSION_MAJOR DEC(__clang_major__) +# define COMPILER_VERSION_MINOR DEC(__clang_minor__) +# define COMPILER_VERSION_PATCH DEC(__clang_patchlevel__) +# if defined(_MSC_VER) + /* _MSC_VER = VVRR */ +# define SIMULATE_VERSION_MAJOR DEC(_MSC_VER / 100) +# define SIMULATE_VERSION_MINOR DEC(_MSC_VER % 100) +# endif +# define COMPILER_VERSION_TWEAK DEC(__apple_build_version__) + +#elif defined(__clang__) && defined(__ARMCOMPILER_VERSION) +# define COMPILER_ID "ARMClang" + # define COMPILER_VERSION_MAJOR DEC(__ARMCOMPILER_VERSION/1000000) + # define COMPILER_VERSION_MINOR DEC(__ARMCOMPILER_VERSION/10000 % 100) + # define COMPILER_VERSION_PATCH DEC(__ARMCOMPILER_VERSION/100 % 100) +# define COMPILER_VERSION_INTERNAL DEC(__ARMCOMPILER_VERSION) + +#elif defined(__clang__) && defined(__ti__) +# define COMPILER_ID "TIClang" + # define COMPILER_VERSION_MAJOR DEC(__ti_major__) + # define COMPILER_VERSION_MINOR DEC(__ti_minor__) + # define COMPILER_VERSION_PATCH DEC(__ti_patchlevel__) +# define COMPILER_VERSION_INTERNAL DEC(__ti_version__) + +#elif defined(__clang__) +# define COMPILER_ID "Clang" +# if defined(_MSC_VER) +# define SIMULATE_ID "MSVC" +# endif +# define COMPILER_VERSION_MAJOR DEC(__clang_major__) +# define COMPILER_VERSION_MINOR DEC(__clang_minor__) +# define COMPILER_VERSION_PATCH DEC(__clang_patchlevel__) +# if defined(_MSC_VER) + /* _MSC_VER = VVRR */ +# define SIMULATE_VERSION_MAJOR DEC(_MSC_VER / 100) +# define SIMULATE_VERSION_MINOR DEC(_MSC_VER % 100) +# endif + +#elif defined(__LCC__) && (defined(__GNUC__) || defined(__GNUG__) || defined(__MCST__)) +# define COMPILER_ID "LCC" +# define COMPILER_VERSION_MAJOR DEC(__LCC__ / 100) +# define COMPILER_VERSION_MINOR DEC(__LCC__ % 100) +# if defined(__LCC_MINOR__) +# define COMPILER_VERSION_PATCH DEC(__LCC_MINOR__) +# endif +# if defined(__GNUC__) && defined(__GNUC_MINOR__) +# define SIMULATE_ID "GNU" +# define SIMULATE_VERSION_MAJOR DEC(__GNUC__) +# define SIMULATE_VERSION_MINOR DEC(__GNUC_MINOR__) +# if defined(__GNUC_PATCHLEVEL__) +# define SIMULATE_VERSION_PATCH DEC(__GNUC_PATCHLEVEL__) +# endif +# endif + +#elif defined(__GNUC__) || defined(__GNUG__) +# define COMPILER_ID "GNU" +# if defined(__GNUC__) +# define COMPILER_VERSION_MAJOR DEC(__GNUC__) +# else +# define COMPILER_VERSION_MAJOR DEC(__GNUG__) +# endif +# if defined(__GNUC_MINOR__) +# define COMPILER_VERSION_MINOR DEC(__GNUC_MINOR__) +# endif +# if defined(__GNUC_PATCHLEVEL__) +# define COMPILER_VERSION_PATCH DEC(__GNUC_PATCHLEVEL__) +# endif + +#elif defined(_MSC_VER) +# define COMPILER_ID "MSVC" + /* _MSC_VER = VVRR */ +# define COMPILER_VERSION_MAJOR DEC(_MSC_VER / 100) +# define COMPILER_VERSION_MINOR DEC(_MSC_VER % 100) +# if defined(_MSC_FULL_VER) +# if _MSC_VER >= 1400 + /* _MSC_FULL_VER = VVRRPPPPP */ +# define COMPILER_VERSION_PATCH DEC(_MSC_FULL_VER % 100000) +# else + /* _MSC_FULL_VER = VVRRPPPP */ +# define COMPILER_VERSION_PATCH DEC(_MSC_FULL_VER % 10000) +# endif +# endif +# if defined(_MSC_BUILD) +# define COMPILER_VERSION_TWEAK DEC(_MSC_BUILD) +# endif + +#elif defined(_ADI_COMPILER) +# define COMPILER_ID "ADSP" +#if defined(__VERSIONNUM__) + /* __VERSIONNUM__ = 0xVVRRPPTT */ +# define COMPILER_VERSION_MAJOR DEC(__VERSIONNUM__ >> 24 & 0xFF) +# define COMPILER_VERSION_MINOR DEC(__VERSIONNUM__ >> 16 & 0xFF) +# define COMPILER_VERSION_PATCH DEC(__VERSIONNUM__ >> 8 & 0xFF) +# define COMPILER_VERSION_TWEAK DEC(__VERSIONNUM__ & 0xFF) +#endif + +#elif defined(__IAR_SYSTEMS_ICC__) || defined(__IAR_SYSTEMS_ICC) +# define COMPILER_ID "IAR" +# if defined(__VER__) && defined(__ICCARM__) +# define COMPILER_VERSION_MAJOR DEC((__VER__) / 1000000) +# define COMPILER_VERSION_MINOR DEC(((__VER__) / 1000) % 1000) +# define COMPILER_VERSION_PATCH DEC((__VER__) % 1000) +# define COMPILER_VERSION_INTERNAL DEC(__IAR_SYSTEMS_ICC__) +# elif defined(__VER__) && (defined(__ICCAVR__) || defined(__ICCRX__) || defined(__ICCRH850__) || defined(__ICCRL78__) || defined(__ICC430__) || defined(__ICCRISCV__) || defined(__ICCV850__) || defined(__ICC8051__) || defined(__ICCSTM8__)) +# define COMPILER_VERSION_MAJOR DEC((__VER__) / 100) +# define COMPILER_VERSION_MINOR DEC((__VER__) - (((__VER__) / 100)*100)) +# define COMPILER_VERSION_PATCH DEC(__SUBVERSION__) +# define COMPILER_VERSION_INTERNAL DEC(__IAR_SYSTEMS_ICC__) +# endif + + +/* These compilers are either not known or too old to define an + identification macro. Try to identify the platform and guess that + it is the native compiler. */ +#elif defined(__hpux) || defined(__hpua) +# define COMPILER_ID "HP" + +#else /* unknown compiler */ +# define COMPILER_ID "" +#endif + +/* Construct the string literal in pieces to prevent the source from + getting matched. Store it in a pointer rather than an array + because some compilers will just produce instructions to fill the + array rather than assigning a pointer to a static array. */ +char const* info_compiler = "INFO" ":" "compiler[" COMPILER_ID "]"; +#ifdef SIMULATE_ID +char const* info_simulate = "INFO" ":" "simulate[" SIMULATE_ID "]"; +#endif + +#ifdef __QNXNTO__ +char const* qnxnto = "INFO" ":" "qnxnto[]"; +#endif + +#if defined(__CRAYXT_COMPUTE_LINUX_TARGET) +char const *info_cray = "INFO" ":" "compiler_wrapper[CrayPrgEnv]"; +#endif + +#define STRINGIFY_HELPER(X) #X +#define STRINGIFY(X) STRINGIFY_HELPER(X) + +/* Identify known platforms by name. */ +#if defined(__linux) || defined(__linux__) || defined(linux) +# define PLATFORM_ID "Linux" + +#elif defined(__MSYS__) +# define PLATFORM_ID "MSYS" + +#elif defined(__CYGWIN__) +# define PLATFORM_ID "Cygwin" + +#elif defined(__MINGW32__) +# define PLATFORM_ID "MinGW" + +#elif defined(__APPLE__) +# define PLATFORM_ID "Darwin" + +#elif defined(_WIN32) || defined(__WIN32__) || defined(WIN32) +# define PLATFORM_ID "Windows" + +#elif defined(__FreeBSD__) || defined(__FreeBSD) +# define PLATFORM_ID "FreeBSD" + +#elif defined(__NetBSD__) || defined(__NetBSD) +# define PLATFORM_ID "NetBSD" + +#elif defined(__OpenBSD__) || defined(__OPENBSD) +# define PLATFORM_ID "OpenBSD" + +#elif defined(__sun) || defined(sun) +# define PLATFORM_ID "SunOS" + +#elif defined(_AIX) || defined(__AIX) || defined(__AIX__) || defined(__aix) || defined(__aix__) +# define PLATFORM_ID "AIX" + +#elif defined(__hpux) || defined(__hpux__) +# define PLATFORM_ID "HP-UX" + +#elif defined(__HAIKU__) +# define PLATFORM_ID "Haiku" + +#elif defined(__BeOS) || defined(__BEOS__) || defined(_BEOS) +# define PLATFORM_ID "BeOS" + +#elif defined(__QNX__) || defined(__QNXNTO__) +# define PLATFORM_ID "QNX" + +#elif defined(__tru64) || defined(_tru64) || defined(__TRU64__) +# define PLATFORM_ID "Tru64" + +#elif defined(__riscos) || defined(__riscos__) +# define PLATFORM_ID "RISCos" + +#elif defined(__sinix) || defined(__sinix__) || defined(__SINIX__) +# define PLATFORM_ID "SINIX" + +#elif defined(__UNIX_SV__) +# define PLATFORM_ID "UNIX_SV" + +#elif defined(__bsdos__) +# define PLATFORM_ID "BSDOS" + +#elif defined(_MPRAS) || defined(MPRAS) +# define PLATFORM_ID "MP-RAS" + +#elif defined(__osf) || defined(__osf__) +# define PLATFORM_ID "OSF1" + +#elif defined(_SCO_SV) || defined(SCO_SV) || defined(sco_sv) +# define PLATFORM_ID "SCO_SV" + +#elif defined(__ultrix) || defined(__ultrix__) || defined(_ULTRIX) +# define PLATFORM_ID "ULTRIX" + +#elif defined(__XENIX__) || defined(_XENIX) || defined(XENIX) +# define PLATFORM_ID "Xenix" + +#elif defined(__WATCOMC__) +# if defined(__LINUX__) +# define PLATFORM_ID "Linux" + +# elif defined(__DOS__) +# define PLATFORM_ID "DOS" + +# elif defined(__OS2__) +# define PLATFORM_ID "OS2" + +# elif defined(__WINDOWS__) +# define PLATFORM_ID "Windows3x" + +# elif defined(__VXWORKS__) +# define PLATFORM_ID "VxWorks" + +# else /* unknown platform */ +# define PLATFORM_ID +# endif + +#elif defined(__INTEGRITY) +# if defined(INT_178B) +# define PLATFORM_ID "Integrity178" + +# else /* regular Integrity */ +# define PLATFORM_ID "Integrity" +# endif + +# elif defined(_ADI_COMPILER) +# define PLATFORM_ID "ADSP" + +#else /* unknown platform */ +# define PLATFORM_ID + +#endif + +/* For windows compilers MSVC and Intel we can determine + the architecture of the compiler being used. This is because + the compilers do not have flags that can change the architecture, + but rather depend on which compiler is being used +*/ +#if defined(_WIN32) && defined(_MSC_VER) +# if defined(_M_IA64) +# define ARCHITECTURE_ID "IA64" + +# elif defined(_M_ARM64EC) +# define ARCHITECTURE_ID "ARM64EC" + +# elif defined(_M_X64) || defined(_M_AMD64) +# define ARCHITECTURE_ID "x64" + +# elif defined(_M_IX86) +# define ARCHITECTURE_ID "X86" + +# elif defined(_M_ARM64) +# define ARCHITECTURE_ID "ARM64" + +# elif defined(_M_ARM) +# if _M_ARM == 4 +# define ARCHITECTURE_ID "ARMV4I" +# elif _M_ARM == 5 +# define ARCHITECTURE_ID "ARMV5I" +# else +# define ARCHITECTURE_ID "ARMV" STRINGIFY(_M_ARM) +# endif + +# elif defined(_M_MIPS) +# define ARCHITECTURE_ID "MIPS" + +# elif defined(_M_SH) +# define ARCHITECTURE_ID "SHx" + +# else /* unknown architecture */ +# define ARCHITECTURE_ID "" +# endif + +#elif defined(__WATCOMC__) +# if defined(_M_I86) +# define ARCHITECTURE_ID "I86" + +# elif defined(_M_IX86) +# define ARCHITECTURE_ID "X86" + +# else /* unknown architecture */ +# define ARCHITECTURE_ID "" +# endif + +#elif defined(__IAR_SYSTEMS_ICC__) || defined(__IAR_SYSTEMS_ICC) +# if defined(__ICCARM__) +# define ARCHITECTURE_ID "ARM" + +# elif defined(__ICCRX__) +# define ARCHITECTURE_ID "RX" + +# elif defined(__ICCRH850__) +# define ARCHITECTURE_ID "RH850" + +# elif defined(__ICCRL78__) +# define ARCHITECTURE_ID "RL78" + +# elif defined(__ICCRISCV__) +# define ARCHITECTURE_ID "RISCV" + +# elif defined(__ICCAVR__) +# define ARCHITECTURE_ID "AVR" + +# elif defined(__ICC430__) +# define ARCHITECTURE_ID "MSP430" + +# elif defined(__ICCV850__) +# define ARCHITECTURE_ID "V850" + +# elif defined(__ICC8051__) +# define ARCHITECTURE_ID "8051" + +# elif defined(__ICCSTM8__) +# define ARCHITECTURE_ID "STM8" + +# else /* unknown architecture */ +# define ARCHITECTURE_ID "" +# endif + +#elif defined(__ghs__) +# if defined(__PPC64__) +# define ARCHITECTURE_ID "PPC64" + +# elif defined(__ppc__) +# define ARCHITECTURE_ID "PPC" + +# elif defined(__ARM__) +# define ARCHITECTURE_ID "ARM" + +# elif defined(__x86_64__) +# define ARCHITECTURE_ID "x64" + +# elif defined(__i386__) +# define ARCHITECTURE_ID "X86" + +# else /* unknown architecture */ +# define ARCHITECTURE_ID "" +# endif + +#elif defined(__clang__) && defined(__ti__) +# if defined(__ARM_ARCH) +# define ARCHITECTURE_ID "Arm" + +# else /* unknown architecture */ +# define ARCHITECTURE_ID "" +# endif + +#elif defined(__TI_COMPILER_VERSION__) +# if defined(__TI_ARM__) +# define ARCHITECTURE_ID "ARM" + +# elif defined(__MSP430__) +# define ARCHITECTURE_ID "MSP430" + +# elif defined(__TMS320C28XX__) +# define ARCHITECTURE_ID "TMS320C28x" + +# elif defined(__TMS320C6X__) || defined(_TMS320C6X) +# define ARCHITECTURE_ID "TMS320C6x" + +# else /* unknown architecture */ +# define ARCHITECTURE_ID "" +# endif + +# elif defined(__ADSPSHARC__) +# define ARCHITECTURE_ID "SHARC" + +# elif defined(__ADSPBLACKFIN__) +# define ARCHITECTURE_ID "Blackfin" + +#elif defined(__TASKING__) + +# if defined(__CTC__) || defined(__CPTC__) +# define ARCHITECTURE_ID "TriCore" + +# elif defined(__CMCS__) +# define ARCHITECTURE_ID "MCS" + +# elif defined(__CARM__) +# define ARCHITECTURE_ID "ARM" + +# elif defined(__CARC__) +# define ARCHITECTURE_ID "ARC" + +# elif defined(__C51__) +# define ARCHITECTURE_ID "8051" + +# elif defined(__CPCP__) +# define ARCHITECTURE_ID "PCP" + +# else +# define ARCHITECTURE_ID "" +# endif + +#else +# define ARCHITECTURE_ID +#endif + +/* Convert integer to decimal digit literals. */ +#define DEC(n) \ + ('0' + (((n) / 10000000)%10)), \ + ('0' + (((n) / 1000000)%10)), \ + ('0' + (((n) / 100000)%10)), \ + ('0' + (((n) / 10000)%10)), \ + ('0' + (((n) / 1000)%10)), \ + ('0' + (((n) / 100)%10)), \ + ('0' + (((n) / 10)%10)), \ + ('0' + ((n) % 10)) + +/* Convert integer to hex digit literals. */ +#define HEX(n) \ + ('0' + ((n)>>28 & 0xF)), \ + ('0' + ((n)>>24 & 0xF)), \ + ('0' + ((n)>>20 & 0xF)), \ + ('0' + ((n)>>16 & 0xF)), \ + ('0' + ((n)>>12 & 0xF)), \ + ('0' + ((n)>>8 & 0xF)), \ + ('0' + ((n)>>4 & 0xF)), \ + ('0' + ((n) & 0xF)) + +/* Construct a string literal encoding the version number. */ +#ifdef COMPILER_VERSION +char const* info_version = "INFO" ":" "compiler_version[" COMPILER_VERSION "]"; + +/* Construct a string literal encoding the version number components. */ +#elif defined(COMPILER_VERSION_MAJOR) +char const info_version[] = { + 'I', 'N', 'F', 'O', ':', + 'c','o','m','p','i','l','e','r','_','v','e','r','s','i','o','n','[', + COMPILER_VERSION_MAJOR, +# ifdef COMPILER_VERSION_MINOR + '.', COMPILER_VERSION_MINOR, +# ifdef COMPILER_VERSION_PATCH + '.', COMPILER_VERSION_PATCH, +# ifdef COMPILER_VERSION_TWEAK + '.', COMPILER_VERSION_TWEAK, +# endif +# endif +# endif + ']','\0'}; +#endif + +/* Construct a string literal encoding the internal version number. */ +#ifdef COMPILER_VERSION_INTERNAL +char const info_version_internal[] = { + 'I', 'N', 'F', 'O', ':', + 'c','o','m','p','i','l','e','r','_','v','e','r','s','i','o','n','_', + 'i','n','t','e','r','n','a','l','[', + COMPILER_VERSION_INTERNAL,']','\0'}; +#elif defined(COMPILER_VERSION_INTERNAL_STR) +char const* info_version_internal = "INFO" ":" "compiler_version_internal[" COMPILER_VERSION_INTERNAL_STR "]"; +#endif + +/* Construct a string literal encoding the version number components. */ +#ifdef SIMULATE_VERSION_MAJOR +char const info_simulate_version[] = { + 'I', 'N', 'F', 'O', ':', + 's','i','m','u','l','a','t','e','_','v','e','r','s','i','o','n','[', + SIMULATE_VERSION_MAJOR, +# ifdef SIMULATE_VERSION_MINOR + '.', SIMULATE_VERSION_MINOR, +# ifdef SIMULATE_VERSION_PATCH + '.', SIMULATE_VERSION_PATCH, +# ifdef SIMULATE_VERSION_TWEAK + '.', SIMULATE_VERSION_TWEAK, +# endif +# endif +# endif + ']','\0'}; +#endif + +/* Construct the string literal in pieces to prevent the source from + getting matched. Store it in a pointer rather than an array + because some compilers will just produce instructions to fill the + array rather than assigning a pointer to a static array. */ +char const* info_platform = "INFO" ":" "platform[" PLATFORM_ID "]"; +char const* info_arch = "INFO" ":" "arch[" ARCHITECTURE_ID "]"; + + + +#define CXX_STD_98 199711L +#define CXX_STD_11 201103L +#define CXX_STD_14 201402L +#define CXX_STD_17 201703L +#define CXX_STD_20 202002L +#define CXX_STD_23 202302L + +#if defined(__INTEL_COMPILER) && defined(_MSVC_LANG) +# if _MSVC_LANG > CXX_STD_17 +# define CXX_STD _MSVC_LANG +# elif _MSVC_LANG == CXX_STD_17 && defined(__cpp_aggregate_paren_init) +# define CXX_STD CXX_STD_20 +# elif _MSVC_LANG > CXX_STD_14 && __cplusplus > CXX_STD_17 +# define CXX_STD CXX_STD_20 +# elif _MSVC_LANG > CXX_STD_14 +# define CXX_STD CXX_STD_17 +# elif defined(__INTEL_CXX11_MODE__) && defined(__cpp_aggregate_nsdmi) +# define CXX_STD CXX_STD_14 +# elif defined(__INTEL_CXX11_MODE__) +# define CXX_STD CXX_STD_11 +# else +# define CXX_STD CXX_STD_98 +# endif +#elif defined(_MSC_VER) && defined(_MSVC_LANG) +# if _MSVC_LANG > __cplusplus +# define CXX_STD _MSVC_LANG +# else +# define CXX_STD __cplusplus +# endif +#elif defined(__NVCOMPILER) +# if __cplusplus == CXX_STD_17 && defined(__cpp_aggregate_paren_init) +# define CXX_STD CXX_STD_20 +# else +# define CXX_STD __cplusplus +# endif +#elif defined(__INTEL_COMPILER) || defined(__PGI) +# if __cplusplus == CXX_STD_11 && defined(__cpp_namespace_attributes) +# define CXX_STD CXX_STD_17 +# elif __cplusplus == CXX_STD_11 && defined(__cpp_aggregate_nsdmi) +# define CXX_STD CXX_STD_14 +# else +# define CXX_STD __cplusplus +# endif +#elif (defined(__IBMCPP__) || defined(__ibmxl__)) && defined(__linux__) +# if __cplusplus == CXX_STD_11 && defined(__cpp_aggregate_nsdmi) +# define CXX_STD CXX_STD_14 +# else +# define CXX_STD __cplusplus +# endif +#elif __cplusplus == 1 && defined(__GXX_EXPERIMENTAL_CXX0X__) +# define CXX_STD CXX_STD_11 +#else +# define CXX_STD __cplusplus +#endif + +const char* info_language_standard_default = "INFO" ":" "standard_default[" +#if CXX_STD > CXX_STD_23 + "26" +#elif CXX_STD > CXX_STD_20 + "23" +#elif CXX_STD > CXX_STD_17 + "20" +#elif CXX_STD > CXX_STD_14 + "17" +#elif CXX_STD > CXX_STD_11 + "14" +#elif CXX_STD >= CXX_STD_11 + "11" +#else + "98" +#endif +"]"; + +const char* info_language_extensions_default = "INFO" ":" "extensions_default[" +#if (defined(__clang__) || defined(__GNUC__) || defined(__xlC__) || \ + defined(__TI_COMPILER_VERSION__)) && \ + !defined(__STRICT_ANSI__) + "ON" +#else + "OFF" +#endif +"]"; + +/*--------------------------------------------------------------------------*/ + +int main(int argc, char* argv[]) +{ + int require = 0; + require += info_compiler[argc]; + require += info_platform[argc]; + require += info_arch[argc]; +#ifdef COMPILER_VERSION_MAJOR + require += info_version[argc]; +#endif +#ifdef COMPILER_VERSION_INTERNAL + require += info_version_internal[argc]; +#endif +#ifdef SIMULATE_ID + require += info_simulate[argc]; +#endif +#ifdef SIMULATE_VERSION_MAJOR + require += info_simulate_version[argc]; +#endif +#if defined(__CRAYXT_COMPUTE_LINUX_TARGET) + require += info_cray[argc]; +#endif + require += info_language_standard_default[argc]; + require += info_language_extensions_default[argc]; + (void)argv; + return require; +} diff --git a/siro_driver/android/app/.cxx/Debug/2j1f5m6a/armeabi-v7a/CMakeFiles/3.31.5-g6cf5163/CompilerIdCXX/CMakeCXXCompilerId.o b/siro_driver/android/app/.cxx/Debug/2j1f5m6a/armeabi-v7a/CMakeFiles/3.31.5-g6cf5163/CompilerIdCXX/CMakeCXXCompilerId.o new file mode 100644 index 0000000..39146d5 Binary files /dev/null and b/siro_driver/android/app/.cxx/Debug/2j1f5m6a/armeabi-v7a/CMakeFiles/3.31.5-g6cf5163/CompilerIdCXX/CMakeCXXCompilerId.o differ diff --git a/siro_driver/android/app/.cxx/Debug/2j1f5m6a/armeabi-v7a/CMakeFiles/CMakeConfigureLog.yaml b/siro_driver/android/app/.cxx/Debug/2j1f5m6a/armeabi-v7a/CMakeFiles/CMakeConfigureLog.yaml new file mode 100644 index 0000000..419c210 --- /dev/null +++ b/siro_driver/android/app/.cxx/Debug/2j1f5m6a/armeabi-v7a/CMakeFiles/CMakeConfigureLog.yaml @@ -0,0 +1,411 @@ + +--- +events: + - + kind: "message-v1" + backtrace: + - "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeDetermineSystem.cmake:200 (message)" + - "CMakeLists.txt:2 (project)" + message: | + The target system is: Android - 1 - armv7-a + The host system is: Darwin - 24.5.0 - arm64 + - + kind: "message-v1" + backtrace: + - "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeDetermineCompilerId.cmake:17 (message)" + - "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeDetermineCompilerId.cmake:64 (__determine_compiler_id_test)" + - "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeDetermineCCompiler.cmake:123 (CMAKE_DETERMINE_COMPILER_ID)" + - "CMakeLists.txt:2 (project)" + message: | + Compiling the C compiler identification source file "CMakeCCompilerId.c" succeeded. + Compiler: /Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/bin/clang + Build flags: -g;-DANDROID;-fdata-sections;-ffunction-sections;-funwind-tables;-fstack-protector-strong;-no-canonical-prefixes;-D_FORTIFY_SOURCE=2;-march=armv7-a;-mthumb;-Wformat;-Werror=format-security + Id flags: -c;--target=armv7-none-linux-androideabi23 + + The output was: + 0 + + + Compilation of the C compiler identification source "CMakeCCompilerId.c" produced "CMakeCCompilerId.o" + + The C compiler identification is Clang, found in: + /Users/hamzaaleghwairyeen/development/App/intaleq_driver/android/app/.cxx/Debug/2j1f5m6a/armeabi-v7a/CMakeFiles/3.31.5-g6cf5163/CompilerIdC/CMakeCCompilerId.o + + - + kind: "message-v1" + backtrace: + - "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeDetermineCompilerId.cmake:17 (message)" + - "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeDetermineCompilerId.cmake:64 (__determine_compiler_id_test)" + - "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeDetermineCXXCompiler.cmake:126 (CMAKE_DETERMINE_COMPILER_ID)" + - "CMakeLists.txt:2 (project)" + message: | + Compiling the CXX compiler identification source file "CMakeCXXCompilerId.cpp" succeeded. + Compiler: /Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/bin/clang++ + Build flags: -g;-DANDROID;-fdata-sections;-ffunction-sections;-funwind-tables;-fstack-protector-strong;-no-canonical-prefixes;-D_FORTIFY_SOURCE=2;-march=armv7-a;-mthumb;-Wformat;-Werror=format-security + Id flags: -c;--target=armv7-none-linux-androideabi23 + + The output was: + 0 + + + Compilation of the CXX compiler identification source "CMakeCXXCompilerId.cpp" produced "CMakeCXXCompilerId.o" + + The CXX compiler identification is Clang, found in: + /Users/hamzaaleghwairyeen/development/App/intaleq_driver/android/app/.cxx/Debug/2j1f5m6a/armeabi-v7a/CMakeFiles/3.31.5-g6cf5163/CompilerIdCXX/CMakeCXXCompilerId.o + + - + kind: "try_compile-v1" + backtrace: + - "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeDetermineCompilerABI.cmake:74 (try_compile)" + - "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeTestCCompiler.cmake:26 (CMAKE_DETERMINE_COMPILER_ABI)" + - "CMakeLists.txt:2 (project)" + checks: + - "Detecting C compiler ABI info" + directories: + source: "/Users/hamzaaleghwairyeen/development/App/intaleq_driver/android/app/.cxx/Debug/2j1f5m6a/armeabi-v7a/CMakeFiles/CMakeScratch/TryCompile-jLJOfM" + binary: "/Users/hamzaaleghwairyeen/development/App/intaleq_driver/android/app/.cxx/Debug/2j1f5m6a/armeabi-v7a/CMakeFiles/CMakeScratch/TryCompile-jLJOfM" + cmakeVariables: + ANDROID_ABI: "armeabi-v7a" + ANDROID_ARM_MODE: "thumb" + ANDROID_ARM_NEON: "TRUE" + ANDROID_PIE: "TRUE" + ANDROID_PLATFORM: "android-23" + ANDROID_STL: "c++_static" + ANDROID_TOOLCHAIN: "clang" + CMAKE_CXX_COMPILER_CLANG_SCAN_DEPS: "/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/bin/clang-scan-deps" + CMAKE_CXX_COMPILER_TARGET: "armv7-none-linux-androideabi23" + CMAKE_C_COMPILER_TARGET: "armv7-none-linux-androideabi23" + CMAKE_C_FLAGS: "-g -DANDROID -fdata-sections -ffunction-sections -funwind-tables -fstack-protector-strong -no-canonical-prefixes -D_FORTIFY_SOURCE=2 -march=armv7-a -mthumb -Wformat " + CMAKE_C_FLAGS_DEBUG: "-fno-limit-debug-info " + CMAKE_EXE_LINKER_FLAGS: "-static-libstdc++ -Wl,--build-id=sha1 -Wl,--no-rosegment -Wl,--no-undefined-version -Wl,--fatal-warnings -Wl,--no-undefined -Qunused-arguments " + CMAKE_POSITION_INDEPENDENT_CODE: "TRUE" + CMAKE_SYSROOT: "/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot" + buildResult: + variable: "CMAKE_C_ABI_COMPILED" + cached: true + stdout: | + Change Dir: '/Users/hamzaaleghwairyeen/development/App/intaleq_driver/android/app/.cxx/Debug/2j1f5m6a/armeabi-v7a/CMakeFiles/CMakeScratch/TryCompile-jLJOfM' + + Run Build Command(s): /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/bin/ninja -v cmTC_40586 + [1/2] /Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/bin/clang --target=armv7-none-linux-androideabi23 --sysroot=/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot -g -DANDROID -fdata-sections -ffunction-sections -funwind-tables -fstack-protector-strong -no-canonical-prefixes -D_FORTIFY_SOURCE=2 -march=armv7-a -mthumb -Wformat -fPIE -v -MD -MT CMakeFiles/cmTC_40586.dir/CMakeCCompilerABI.c.o -MF CMakeFiles/cmTC_40586.dir/CMakeCCompilerABI.c.o.d -o CMakeFiles/cmTC_40586.dir/CMakeCCompilerABI.c.o -c /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeCCompilerABI.c + Android (12027248, +pgo, -bolt, +lto, -mlgo, based on r522817) clang version 18.0.1 (https://android.googlesource.com/toolchain/llvm-project d8003a456d14a3deb8054cdaa529ffbf02d9b262) + Target: armv7-none-linux-android23 + Thread model: posix + InstalledDir: /Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/bin + (in-process) + "/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/bin/clang" -cc1 -triple thumbv7-none-linux-android23 -emit-obj -mrelax-all -disable-free -clear-ast-before-backend -disable-llvm-verifier -discard-value-names -main-file-name CMakeCCompilerABI.c -mrelocation-model pic -pic-level 2 -pic-is-pie -mframe-pointer=all -ffp-contract=on -fno-rounding-math -mconstructor-aliases -funwind-tables=1 -target-cpu generic -target-feature +soft-float-abi -target-feature +vfp2 -target-feature +vfp2sp -target-feature +vfp3 -target-feature +vfp3d16 -target-feature +vfp3d16sp -target-feature +vfp3sp -target-feature -fp16 -target-feature -vfp4 -target-feature -vfp4d16 -target-feature -vfp4d16sp -target-feature -vfp4sp -target-feature -fp-armv8 -target-feature -fp-armv8d16 -target-feature -fp-armv8d16sp -target-feature -fp-armv8sp -target-feature -fullfp16 -target-feature +fp64 -target-feature +d32 -target-feature +neon -target-feature -sha2 -target-feature -aes -target-feature -fp16fml -target-abi aapcs-linux -mfloat-abi soft -debug-info-kind=constructor -dwarf-version=4 -debugger-tuning=gdb -fdebug-compilation-dir=/Users/hamzaaleghwairyeen/development/App/intaleq_driver/android/app/.cxx/Debug/2j1f5m6a/armeabi-v7a/CMakeFiles/CMakeScratch/TryCompile-jLJOfM -v -ffunction-sections -fdata-sections -fcoverage-compilation-dir=/Users/hamzaaleghwairyeen/development/App/intaleq_driver/android/app/.cxx/Debug/2j1f5m6a/armeabi-v7a/CMakeFiles/CMakeScratch/TryCompile-jLJOfM -resource-dir /Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/lib/clang/18 -dependency-file CMakeFiles/cmTC_40586.dir/CMakeCCompilerABI.c.o.d -MT CMakeFiles/cmTC_40586.dir/CMakeCCompilerABI.c.o -sys-header-deps -D ANDROID -D _FORTIFY_SOURCE=2 -isysroot /Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot -internal-isystem /Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/lib/clang/18/include -internal-isystem /Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/local/include -internal-externc-isystem /Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/include/arm-linux-androideabi -internal-externc-isystem /Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/include -internal-externc-isystem /Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/include -Wformat -ferror-limit 19 -femulated-tls -stack-protector 2 -fno-signed-char -fgnuc-version=4.2.1 -D__GCC_HAVE_DWARF2_CFI_ASM=1 -o CMakeFiles/cmTC_40586.dir/CMakeCCompilerABI.c.o -x c /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeCCompilerABI.c + clang -cc1 version 18.0.1 based upon LLVM 18.0.1 default target x86_64-apple-darwin24.5.0 + ignoring nonexistent directory "/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/local/include" + ignoring nonexistent directory "/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/include" + #include "..." search starts here: + #include <...> search starts here: + /Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/lib/clang/18/include + /Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/include/arm-linux-androideabi + /Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/include + End of search list. + [2/2] : && /Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/bin/clang --target=armv7-none-linux-androideabi23 --sysroot=/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot -g -DANDROID -fdata-sections -ffunction-sections -funwind-tables -fstack-protector-strong -no-canonical-prefixes -D_FORTIFY_SOURCE=2 -march=armv7-a -mthumb -Wformat -static-libstdc++ -Wl,--build-id=sha1 -Wl,--no-rosegment -Wl,--no-undefined-version -Wl,--fatal-warnings -Wl,--no-undefined -Qunused-arguments -v CMakeFiles/cmTC_40586.dir/CMakeCCompilerABI.c.o -o cmTC_40586 && : + Android (12027248, +pgo, -bolt, +lto, -mlgo, based on r522817) clang version 18.0.1 (https://android.googlesource.com/toolchain/llvm-project d8003a456d14a3deb8054cdaa529ffbf02d9b262) + Target: armv7-none-linux-android23 + Thread model: posix + InstalledDir: /Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/bin + "/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/bin/ld.lld" --sysroot=/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot -EL -z now -z relro -z max-page-size=4096 -X --hash-style=gnu --eh-frame-hdr -m armelf_linux_eabi -pie -dynamic-linker /system/bin/linker -o cmTC_40586 /Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/lib/arm-linux-androideabi/23/crtbegin_dynamic.o -L/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/lib/clang/18/lib/linux/arm -L/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/lib/arm-linux-androideabi/23 -L/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/lib/arm-linux-androideabi -L/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/lib/../lib -L/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/lib --build-id=sha1 --no-rosegment --no-undefined-version --fatal-warnings --no-undefined CMakeFiles/cmTC_40586.dir/CMakeCCompilerABI.c.o /Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/lib/clang/18/lib/linux/libclang_rt.builtins-arm-android.a -l:libunwind.a -ldl -lc /Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/lib/clang/18/lib/linux/libclang_rt.builtins-arm-android.a -l:libunwind.a -ldl /Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/lib/arm-linux-androideabi/23/crtend_android.o + + exitCode: 0 + - + kind: "message-v1" + backtrace: + - "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeDetermineCompilerABI.cmake:182 (message)" + - "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeTestCCompiler.cmake:26 (CMAKE_DETERMINE_COMPILER_ABI)" + - "CMakeLists.txt:2 (project)" + message: | + Parsed C implicit include dir info: rv=done + found start of include info + found start of implicit include info + add: [/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/lib/clang/18/include] + add: [/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/include/arm-linux-androideabi] + add: [/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/include] + end of search list found + collapse include dir [/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/lib/clang/18/include] ==> [/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/lib/clang/18/include] + collapse include dir [/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/include/arm-linux-androideabi] ==> [/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/include/arm-linux-androideabi] + collapse include dir [/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/include] ==> [/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/include] + implicit include dirs: [/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/lib/clang/18/include;/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/include/arm-linux-androideabi;/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/include] + + + - + kind: "message-v1" + backtrace: + - "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeDetermineCompilerABI.cmake:218 (message)" + - "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeTestCCompiler.cmake:26 (CMAKE_DETERMINE_COMPILER_ABI)" + - "CMakeLists.txt:2 (project)" + message: | + Parsed C implicit link information: + link line regex: [^( *|.*[/\\])(ld[0-9]*(\\.[a-z]+)?|CMAKE_LINK_STARTFILE-NOTFOUND|([^/\\]+-)?ld|collect2)[^/\\]*( |$)] + linker tool regex: [^[ ]*(->|")?[ ]*(([^"]*[/\\])?(ld[0-9]*(\\.[a-z]+)?))("|,| |$)] + ignore line: [Change Dir: '/Users/hamzaaleghwairyeen/development/App/intaleq_driver/android/app/.cxx/Debug/2j1f5m6a/armeabi-v7a/CMakeFiles/CMakeScratch/TryCompile-jLJOfM'] + ignore line: [] + ignore line: [Run Build Command(s): /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/bin/ninja -v cmTC_40586] + ignore line: [[1/2] /Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/bin/clang --target=armv7-none-linux-androideabi23 --sysroot=/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot -g -DANDROID -fdata-sections -ffunction-sections -funwind-tables -fstack-protector-strong -no-canonical-prefixes -D_FORTIFY_SOURCE=2 -march=armv7-a -mthumb -Wformat -fPIE -v -MD -MT CMakeFiles/cmTC_40586.dir/CMakeCCompilerABI.c.o -MF CMakeFiles/cmTC_40586.dir/CMakeCCompilerABI.c.o.d -o CMakeFiles/cmTC_40586.dir/CMakeCCompilerABI.c.o -c /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeCCompilerABI.c] + ignore line: [Android (12027248 +pgo -bolt +lto -mlgo based on r522817) clang version 18.0.1 (https://android.googlesource.com/toolchain/llvm-project d8003a456d14a3deb8054cdaa529ffbf02d9b262)] + ignore line: [Target: armv7-none-linux-android23] + ignore line: [Thread model: posix] + ignore line: [InstalledDir: /Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/bin] + ignore line: [ (in-process)] + ignore line: [ "/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/bin/clang" -cc1 -triple thumbv7-none-linux-android23 -emit-obj -mrelax-all -disable-free -clear-ast-before-backend -disable-llvm-verifier -discard-value-names -main-file-name CMakeCCompilerABI.c -mrelocation-model pic -pic-level 2 -pic-is-pie -mframe-pointer=all -ffp-contract=on -fno-rounding-math -mconstructor-aliases -funwind-tables=1 -target-cpu generic -target-feature +soft-float-abi -target-feature +vfp2 -target-feature +vfp2sp -target-feature +vfp3 -target-feature +vfp3d16 -target-feature +vfp3d16sp -target-feature +vfp3sp -target-feature -fp16 -target-feature -vfp4 -target-feature -vfp4d16 -target-feature -vfp4d16sp -target-feature -vfp4sp -target-feature -fp-armv8 -target-feature -fp-armv8d16 -target-feature -fp-armv8d16sp -target-feature -fp-armv8sp -target-feature -fullfp16 -target-feature +fp64 -target-feature +d32 -target-feature +neon -target-feature -sha2 -target-feature -aes -target-feature -fp16fml -target-abi aapcs-linux -mfloat-abi soft -debug-info-kind=constructor -dwarf-version=4 -debugger-tuning=gdb -fdebug-compilation-dir=/Users/hamzaaleghwairyeen/development/App/intaleq_driver/android/app/.cxx/Debug/2j1f5m6a/armeabi-v7a/CMakeFiles/CMakeScratch/TryCompile-jLJOfM -v -ffunction-sections -fdata-sections -fcoverage-compilation-dir=/Users/hamzaaleghwairyeen/development/App/intaleq_driver/android/app/.cxx/Debug/2j1f5m6a/armeabi-v7a/CMakeFiles/CMakeScratch/TryCompile-jLJOfM -resource-dir /Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/lib/clang/18 -dependency-file CMakeFiles/cmTC_40586.dir/CMakeCCompilerABI.c.o.d -MT CMakeFiles/cmTC_40586.dir/CMakeCCompilerABI.c.o -sys-header-deps -D ANDROID -D _FORTIFY_SOURCE=2 -isysroot /Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot -internal-isystem /Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/lib/clang/18/include -internal-isystem /Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/local/include -internal-externc-isystem /Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/include/arm-linux-androideabi -internal-externc-isystem /Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/include -internal-externc-isystem /Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/include -Wformat -ferror-limit 19 -femulated-tls -stack-protector 2 -fno-signed-char -fgnuc-version=4.2.1 -D__GCC_HAVE_DWARF2_CFI_ASM=1 -o CMakeFiles/cmTC_40586.dir/CMakeCCompilerABI.c.o -x c /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeCCompilerABI.c] + ignore line: [clang -cc1 version 18.0.1 based upon LLVM 18.0.1 default target x86_64-apple-darwin24.5.0] + ignore line: [ignoring nonexistent directory "/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/local/include"] + ignore line: [ignoring nonexistent directory "/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/include"] + ignore line: [#include "..." search starts here:] + ignore line: [#include <...> search starts here:] + ignore line: [ /Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/lib/clang/18/include] + ignore line: [ /Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/include/arm-linux-androideabi] + ignore line: [ /Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/include] + ignore line: [End of search list.] + ignore line: [[2/2] : && /Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/bin/clang --target=armv7-none-linux-androideabi23 --sysroot=/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot -g -DANDROID -fdata-sections -ffunction-sections -funwind-tables -fstack-protector-strong -no-canonical-prefixes -D_FORTIFY_SOURCE=2 -march=armv7-a -mthumb -Wformat -static-libstdc++ -Wl --build-id=sha1 -Wl --no-rosegment -Wl --no-undefined-version -Wl --fatal-warnings -Wl --no-undefined -Qunused-arguments -v CMakeFiles/cmTC_40586.dir/CMakeCCompilerABI.c.o -o cmTC_40586 && :] + ignore line: [Android (12027248 +pgo -bolt +lto -mlgo based on r522817) clang version 18.0.1 (https://android.googlesource.com/toolchain/llvm-project d8003a456d14a3deb8054cdaa529ffbf02d9b262)] + ignore line: [Target: armv7-none-linux-android23] + ignore line: [Thread model: posix] + ignore line: [InstalledDir: /Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/bin] + link line: [ "/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/bin/ld.lld" --sysroot=/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot -EL -z now -z relro -z max-page-size=4096 -X --hash-style=gnu --eh-frame-hdr -m armelf_linux_eabi -pie -dynamic-linker /system/bin/linker -o cmTC_40586 /Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/lib/arm-linux-androideabi/23/crtbegin_dynamic.o -L/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/lib/clang/18/lib/linux/arm -L/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/lib/arm-linux-androideabi/23 -L/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/lib/arm-linux-androideabi -L/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/lib/../lib -L/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/lib --build-id=sha1 --no-rosegment --no-undefined-version --fatal-warnings --no-undefined CMakeFiles/cmTC_40586.dir/CMakeCCompilerABI.c.o /Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/lib/clang/18/lib/linux/libclang_rt.builtins-arm-android.a -l:libunwind.a -ldl -lc /Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/lib/clang/18/lib/linux/libclang_rt.builtins-arm-android.a -l:libunwind.a -ldl /Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/lib/arm-linux-androideabi/23/crtend_android.o] + arg [/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/bin/ld.lld] ==> ignore + arg [--sysroot=/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot] ==> ignore + arg [-EL] ==> ignore + arg [-znow] ==> ignore + arg [-zrelro] ==> ignore + arg [-zmax-page-size=4096] ==> ignore + arg [-X] ==> ignore + arg [--hash-style=gnu] ==> ignore + arg [--eh-frame-hdr] ==> ignore + arg [-m] ==> ignore + arg [armelf_linux_eabi] ==> ignore + arg [-pie] ==> ignore + arg [-dynamic-linker] ==> ignore + arg [/system/bin/linker] ==> ignore + arg [-o] ==> ignore + arg [cmTC_40586] ==> ignore + arg [/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/lib/arm-linux-androideabi/23/crtbegin_dynamic.o] ==> obj [/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/lib/arm-linux-androideabi/23/crtbegin_dynamic.o] + arg [-L/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/lib/clang/18/lib/linux/arm] ==> dir [/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/lib/clang/18/lib/linux/arm] + arg [-L/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/lib/arm-linux-androideabi/23] ==> dir [/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/lib/arm-linux-androideabi/23] + arg [-L/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/lib/arm-linux-androideabi] ==> dir [/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/lib/arm-linux-androideabi] + arg [-L/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/lib/../lib] ==> dir [/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/lib/../lib] + arg [-L/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/lib] ==> dir [/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/lib] + arg [--build-id=sha1] ==> ignore + arg [--no-rosegment] ==> ignore + arg [--no-undefined-version] ==> ignore + arg [--fatal-warnings] ==> ignore + arg [--no-undefined] ==> ignore + arg [CMakeFiles/cmTC_40586.dir/CMakeCCompilerABI.c.o] ==> ignore + arg [/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/lib/clang/18/lib/linux/libclang_rt.builtins-arm-android.a] ==> lib [/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/lib/clang/18/lib/linux/libclang_rt.builtins-arm-android.a] + arg [-l:libunwind.a] ==> lib [-l:libunwind.a] + arg [-ldl] ==> lib [dl] + arg [-lc] ==> lib [c] + arg [/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/lib/clang/18/lib/linux/libclang_rt.builtins-arm-android.a] ==> lib [/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/lib/clang/18/lib/linux/libclang_rt.builtins-arm-android.a] + arg [-l:libunwind.a] ==> lib [-l:libunwind.a] + arg [-ldl] ==> lib [dl] + arg [/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/lib/arm-linux-androideabi/23/crtend_android.o] ==> obj [/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/lib/arm-linux-androideabi/23/crtend_android.o] + linker tool for 'C': /Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/bin/ld.lld + remove lib [/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/lib/clang/18/lib/linux/libclang_rt.builtins-arm-android.a] + remove lib [/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/lib/clang/18/lib/linux/libclang_rt.builtins-arm-android.a] + collapse library dir [/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/lib/clang/18/lib/linux/arm] ==> [/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/lib/clang/18/lib/linux/arm] + collapse library dir [/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/lib/arm-linux-androideabi/23] ==> [/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/lib/arm-linux-androideabi/23] + collapse library dir [/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/lib/arm-linux-androideabi] ==> [/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/lib/arm-linux-androideabi] + collapse library dir [/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/lib/../lib] ==> [/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/lib] + collapse library dir [/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/lib] ==> [/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/lib] + implicit libs: [-l:libunwind.a;dl;c;-l:libunwind.a;dl] + implicit objs: [/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/lib/arm-linux-androideabi/23/crtbegin_dynamic.o;/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/lib/arm-linux-androideabi/23/crtend_android.o] + implicit dirs: [/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/lib/clang/18/lib/linux/arm;/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/lib/arm-linux-androideabi/23;/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/lib/arm-linux-androideabi;/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/lib] + implicit fwks: [] + + + - + kind: "message-v1" + backtrace: + - "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Internal/CMakeDetermineLinkerId.cmake:40 (message)" + - "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeDetermineCompilerABI.cmake:255 (cmake_determine_linker_id)" + - "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeTestCCompiler.cmake:26 (CMAKE_DETERMINE_COMPILER_ABI)" + - "CMakeLists.txt:2 (project)" + message: | + Running the C compiler's linker: "/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/bin/ld.lld" "-v" + LLD 18.0.1 (compatible with GNU linkers) + - + kind: "try_compile-v1" + backtrace: + - "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeDetermineCompilerABI.cmake:74 (try_compile)" + - "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeTestCXXCompiler.cmake:26 (CMAKE_DETERMINE_COMPILER_ABI)" + - "CMakeLists.txt:2 (project)" + checks: + - "Detecting CXX compiler ABI info" + directories: + source: "/Users/hamzaaleghwairyeen/development/App/intaleq_driver/android/app/.cxx/Debug/2j1f5m6a/armeabi-v7a/CMakeFiles/CMakeScratch/TryCompile-nqgHNr" + binary: "/Users/hamzaaleghwairyeen/development/App/intaleq_driver/android/app/.cxx/Debug/2j1f5m6a/armeabi-v7a/CMakeFiles/CMakeScratch/TryCompile-nqgHNr" + cmakeVariables: + ANDROID_ABI: "armeabi-v7a" + ANDROID_ARM_MODE: "thumb" + ANDROID_ARM_NEON: "TRUE" + ANDROID_PIE: "TRUE" + ANDROID_PLATFORM: "android-23" + ANDROID_STL: "c++_static" + ANDROID_TOOLCHAIN: "clang" + CMAKE_CXX_COMPILER_CLANG_SCAN_DEPS: "/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/bin/clang-scan-deps" + CMAKE_CXX_COMPILER_TARGET: "armv7-none-linux-androideabi23" + CMAKE_CXX_FLAGS: "-g -DANDROID -fdata-sections -ffunction-sections -funwind-tables -fstack-protector-strong -no-canonical-prefixes -D_FORTIFY_SOURCE=2 -march=armv7-a -mthumb -Wformat " + CMAKE_CXX_FLAGS_DEBUG: "-fno-limit-debug-info " + CMAKE_CXX_SCAN_FOR_MODULES: "OFF" + CMAKE_C_COMPILER_TARGET: "armv7-none-linux-androideabi23" + CMAKE_EXE_LINKER_FLAGS: "-static-libstdc++ -Wl,--build-id=sha1 -Wl,--no-rosegment -Wl,--no-undefined-version -Wl,--fatal-warnings -Wl,--no-undefined -Qunused-arguments " + CMAKE_POSITION_INDEPENDENT_CODE: "TRUE" + CMAKE_SYSROOT: "/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot" + buildResult: + variable: "CMAKE_CXX_ABI_COMPILED" + cached: true + stdout: | + Change Dir: '/Users/hamzaaleghwairyeen/development/App/intaleq_driver/android/app/.cxx/Debug/2j1f5m6a/armeabi-v7a/CMakeFiles/CMakeScratch/TryCompile-nqgHNr' + + Run Build Command(s): /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/bin/ninja -v cmTC_0d346 + [1/2] /Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/bin/clang++ --target=armv7-none-linux-androideabi23 --sysroot=/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot -g -DANDROID -fdata-sections -ffunction-sections -funwind-tables -fstack-protector-strong -no-canonical-prefixes -D_FORTIFY_SOURCE=2 -march=armv7-a -mthumb -Wformat -fPIE -v -MD -MT CMakeFiles/cmTC_0d346.dir/CMakeCXXCompilerABI.cpp.o -MF CMakeFiles/cmTC_0d346.dir/CMakeCXXCompilerABI.cpp.o.d -o CMakeFiles/cmTC_0d346.dir/CMakeCXXCompilerABI.cpp.o -c /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeCXXCompilerABI.cpp + Android (12027248, +pgo, -bolt, +lto, -mlgo, based on r522817) clang version 18.0.1 (https://android.googlesource.com/toolchain/llvm-project d8003a456d14a3deb8054cdaa529ffbf02d9b262) + Target: armv7-none-linux-android23 + Thread model: posix + InstalledDir: /Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/bin + (in-process) + "/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/bin/clang++" -cc1 -triple thumbv7-none-linux-android23 -emit-obj -mrelax-all -disable-free -clear-ast-before-backend -disable-llvm-verifier -discard-value-names -main-file-name CMakeCXXCompilerABI.cpp -mrelocation-model pic -pic-level 2 -pic-is-pie -mframe-pointer=all -ffp-contract=on -fno-rounding-math -mconstructor-aliases -funwind-tables=1 -target-cpu generic -target-feature +soft-float-abi -target-feature +vfp2 -target-feature +vfp2sp -target-feature +vfp3 -target-feature +vfp3d16 -target-feature +vfp3d16sp -target-feature +vfp3sp -target-feature -fp16 -target-feature -vfp4 -target-feature -vfp4d16 -target-feature -vfp4d16sp -target-feature -vfp4sp -target-feature -fp-armv8 -target-feature -fp-armv8d16 -target-feature -fp-armv8d16sp -target-feature -fp-armv8sp -target-feature -fullfp16 -target-feature +fp64 -target-feature +d32 -target-feature +neon -target-feature -sha2 -target-feature -aes -target-feature -fp16fml -target-abi aapcs-linux -mfloat-abi soft -debug-info-kind=constructor -dwarf-version=4 -debugger-tuning=gdb -fdebug-compilation-dir=/Users/hamzaaleghwairyeen/development/App/intaleq_driver/android/app/.cxx/Debug/2j1f5m6a/armeabi-v7a/CMakeFiles/CMakeScratch/TryCompile-nqgHNr -v -ffunction-sections -fdata-sections -fcoverage-compilation-dir=/Users/hamzaaleghwairyeen/development/App/intaleq_driver/android/app/.cxx/Debug/2j1f5m6a/armeabi-v7a/CMakeFiles/CMakeScratch/TryCompile-nqgHNr -resource-dir /Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/lib/clang/18 -dependency-file CMakeFiles/cmTC_0d346.dir/CMakeCXXCompilerABI.cpp.o.d -MT CMakeFiles/cmTC_0d346.dir/CMakeCXXCompilerABI.cpp.o -sys-header-deps -D ANDROID -D _FORTIFY_SOURCE=2 -isysroot /Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot -internal-isystem /Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/include/c++/v1 -internal-isystem /Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/lib/clang/18/include -internal-isystem /Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/local/include -internal-externc-isystem /Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/include/arm-linux-androideabi -internal-externc-isystem /Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/include -internal-externc-isystem /Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/include -Wformat -fdeprecated-macro -ferror-limit 19 -femulated-tls -stack-protector 2 -fno-signed-char -fgnuc-version=4.2.1 -fcxx-exceptions -fexceptions -D__GCC_HAVE_DWARF2_CFI_ASM=1 -o CMakeFiles/cmTC_0d346.dir/CMakeCXXCompilerABI.cpp.o -x c++ /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeCXXCompilerABI.cpp + clang -cc1 version 18.0.1 based upon LLVM 18.0.1 default target x86_64-apple-darwin24.5.0 + ignoring nonexistent directory "/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/local/include" + ignoring nonexistent directory "/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/include" + #include "..." search starts here: + #include <...> search starts here: + /Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/include/c++/v1 + /Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/lib/clang/18/include + /Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/include/arm-linux-androideabi + /Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/include + End of search list. + [2/2] : && /Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/bin/clang++ --target=armv7-none-linux-androideabi23 --sysroot=/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot -g -DANDROID -fdata-sections -ffunction-sections -funwind-tables -fstack-protector-strong -no-canonical-prefixes -D_FORTIFY_SOURCE=2 -march=armv7-a -mthumb -Wformat -static-libstdc++ -Wl,--build-id=sha1 -Wl,--no-rosegment -Wl,--no-undefined-version -Wl,--fatal-warnings -Wl,--no-undefined -Qunused-arguments -v CMakeFiles/cmTC_0d346.dir/CMakeCXXCompilerABI.cpp.o -o cmTC_0d346 && : + Android (12027248, +pgo, -bolt, +lto, -mlgo, based on r522817) clang version 18.0.1 (https://android.googlesource.com/toolchain/llvm-project d8003a456d14a3deb8054cdaa529ffbf02d9b262) + Target: armv7-none-linux-android23 + Thread model: posix + InstalledDir: /Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/bin + "/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/bin/ld.lld" --sysroot=/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot -EL -z now -z relro -z max-page-size=4096 -X --hash-style=gnu --eh-frame-hdr -m armelf_linux_eabi -pie -dynamic-linker /system/bin/linker -o cmTC_0d346 /Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/lib/arm-linux-androideabi/23/crtbegin_dynamic.o -L/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/lib/clang/18/lib/linux/arm -L/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/lib/arm-linux-androideabi/23 -L/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/lib/arm-linux-androideabi -L/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/lib/../lib -L/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/lib --build-id=sha1 --no-rosegment --no-undefined-version --fatal-warnings --no-undefined CMakeFiles/cmTC_0d346.dir/CMakeCXXCompilerABI.cpp.o -Bstatic -lc++ -Bdynamic -lm /Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/lib/clang/18/lib/linux/libclang_rt.builtins-arm-android.a -l:libunwind.a -ldl -lc /Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/lib/clang/18/lib/linux/libclang_rt.builtins-arm-android.a -l:libunwind.a -ldl /Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/lib/arm-linux-androideabi/23/crtend_android.o + + exitCode: 0 + - + kind: "message-v1" + backtrace: + - "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeDetermineCompilerABI.cmake:182 (message)" + - "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeTestCXXCompiler.cmake:26 (CMAKE_DETERMINE_COMPILER_ABI)" + - "CMakeLists.txt:2 (project)" + message: | + Parsed CXX implicit include dir info: rv=done + found start of include info + found start of implicit include info + add: [/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/include/c++/v1] + add: [/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/lib/clang/18/include] + add: [/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/include/arm-linux-androideabi] + add: [/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/include] + end of search list found + collapse include dir [/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/include/c++/v1] ==> [/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/include/c++/v1] + collapse include dir [/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/lib/clang/18/include] ==> [/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/lib/clang/18/include] + collapse include dir [/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/include/arm-linux-androideabi] ==> [/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/include/arm-linux-androideabi] + collapse include dir [/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/include] ==> [/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/include] + implicit include dirs: [/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/include/c++/v1;/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/lib/clang/18/include;/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/include/arm-linux-androideabi;/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/include] + + + - + kind: "message-v1" + backtrace: + - "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeDetermineCompilerABI.cmake:218 (message)" + - "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeTestCXXCompiler.cmake:26 (CMAKE_DETERMINE_COMPILER_ABI)" + - "CMakeLists.txt:2 (project)" + message: | + Parsed CXX implicit link information: + link line regex: [^( *|.*[/\\])(ld[0-9]*(\\.[a-z]+)?|CMAKE_LINK_STARTFILE-NOTFOUND|([^/\\]+-)?ld|collect2)[^/\\]*( |$)] + linker tool regex: [^[ ]*(->|")?[ ]*(([^"]*[/\\])?(ld[0-9]*(\\.[a-z]+)?))("|,| |$)] + ignore line: [Change Dir: '/Users/hamzaaleghwairyeen/development/App/intaleq_driver/android/app/.cxx/Debug/2j1f5m6a/armeabi-v7a/CMakeFiles/CMakeScratch/TryCompile-nqgHNr'] + ignore line: [] + ignore line: [Run Build Command(s): /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/bin/ninja -v cmTC_0d346] + ignore line: [[1/2] /Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/bin/clang++ --target=armv7-none-linux-androideabi23 --sysroot=/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot -g -DANDROID -fdata-sections -ffunction-sections -funwind-tables -fstack-protector-strong -no-canonical-prefixes -D_FORTIFY_SOURCE=2 -march=armv7-a -mthumb -Wformat -fPIE -v -MD -MT CMakeFiles/cmTC_0d346.dir/CMakeCXXCompilerABI.cpp.o -MF CMakeFiles/cmTC_0d346.dir/CMakeCXXCompilerABI.cpp.o.d -o CMakeFiles/cmTC_0d346.dir/CMakeCXXCompilerABI.cpp.o -c /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeCXXCompilerABI.cpp] + ignore line: [Android (12027248 +pgo -bolt +lto -mlgo based on r522817) clang version 18.0.1 (https://android.googlesource.com/toolchain/llvm-project d8003a456d14a3deb8054cdaa529ffbf02d9b262)] + ignore line: [Target: armv7-none-linux-android23] + ignore line: [Thread model: posix] + ignore line: [InstalledDir: /Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/bin] + ignore line: [ (in-process)] + ignore line: [ "/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/bin/clang++" -cc1 -triple thumbv7-none-linux-android23 -emit-obj -mrelax-all -disable-free -clear-ast-before-backend -disable-llvm-verifier -discard-value-names -main-file-name CMakeCXXCompilerABI.cpp -mrelocation-model pic -pic-level 2 -pic-is-pie -mframe-pointer=all -ffp-contract=on -fno-rounding-math -mconstructor-aliases -funwind-tables=1 -target-cpu generic -target-feature +soft-float-abi -target-feature +vfp2 -target-feature +vfp2sp -target-feature +vfp3 -target-feature +vfp3d16 -target-feature +vfp3d16sp -target-feature +vfp3sp -target-feature -fp16 -target-feature -vfp4 -target-feature -vfp4d16 -target-feature -vfp4d16sp -target-feature -vfp4sp -target-feature -fp-armv8 -target-feature -fp-armv8d16 -target-feature -fp-armv8d16sp -target-feature -fp-armv8sp -target-feature -fullfp16 -target-feature +fp64 -target-feature +d32 -target-feature +neon -target-feature -sha2 -target-feature -aes -target-feature -fp16fml -target-abi aapcs-linux -mfloat-abi soft -debug-info-kind=constructor -dwarf-version=4 -debugger-tuning=gdb -fdebug-compilation-dir=/Users/hamzaaleghwairyeen/development/App/intaleq_driver/android/app/.cxx/Debug/2j1f5m6a/armeabi-v7a/CMakeFiles/CMakeScratch/TryCompile-nqgHNr -v -ffunction-sections -fdata-sections -fcoverage-compilation-dir=/Users/hamzaaleghwairyeen/development/App/intaleq_driver/android/app/.cxx/Debug/2j1f5m6a/armeabi-v7a/CMakeFiles/CMakeScratch/TryCompile-nqgHNr -resource-dir /Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/lib/clang/18 -dependency-file CMakeFiles/cmTC_0d346.dir/CMakeCXXCompilerABI.cpp.o.d -MT CMakeFiles/cmTC_0d346.dir/CMakeCXXCompilerABI.cpp.o -sys-header-deps -D ANDROID -D _FORTIFY_SOURCE=2 -isysroot /Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot -internal-isystem /Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/include/c++/v1 -internal-isystem /Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/lib/clang/18/include -internal-isystem /Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/local/include -internal-externc-isystem /Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/include/arm-linux-androideabi -internal-externc-isystem /Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/include -internal-externc-isystem /Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/include -Wformat -fdeprecated-macro -ferror-limit 19 -femulated-tls -stack-protector 2 -fno-signed-char -fgnuc-version=4.2.1 -fcxx-exceptions -fexceptions -D__GCC_HAVE_DWARF2_CFI_ASM=1 -o CMakeFiles/cmTC_0d346.dir/CMakeCXXCompilerABI.cpp.o -x c++ /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeCXXCompilerABI.cpp] + ignore line: [clang -cc1 version 18.0.1 based upon LLVM 18.0.1 default target x86_64-apple-darwin24.5.0] + ignore line: [ignoring nonexistent directory "/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/local/include"] + ignore line: [ignoring nonexistent directory "/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/include"] + ignore line: [#include "..." search starts here:] + ignore line: [#include <...> search starts here:] + ignore line: [ /Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/include/c++/v1] + ignore line: [ /Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/lib/clang/18/include] + ignore line: [ /Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/include/arm-linux-androideabi] + ignore line: [ /Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/include] + ignore line: [End of search list.] + ignore line: [[2/2] : && /Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/bin/clang++ --target=armv7-none-linux-androideabi23 --sysroot=/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot -g -DANDROID -fdata-sections -ffunction-sections -funwind-tables -fstack-protector-strong -no-canonical-prefixes -D_FORTIFY_SOURCE=2 -march=armv7-a -mthumb -Wformat -static-libstdc++ -Wl --build-id=sha1 -Wl --no-rosegment -Wl --no-undefined-version -Wl --fatal-warnings -Wl --no-undefined -Qunused-arguments -v CMakeFiles/cmTC_0d346.dir/CMakeCXXCompilerABI.cpp.o -o cmTC_0d346 && :] + ignore line: [Android (12027248 +pgo -bolt +lto -mlgo based on r522817) clang version 18.0.1 (https://android.googlesource.com/toolchain/llvm-project d8003a456d14a3deb8054cdaa529ffbf02d9b262)] + ignore line: [Target: armv7-none-linux-android23] + ignore line: [Thread model: posix] + ignore line: [InstalledDir: /Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/bin] + link line: [ "/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/bin/ld.lld" --sysroot=/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot -EL -z now -z relro -z max-page-size=4096 -X --hash-style=gnu --eh-frame-hdr -m armelf_linux_eabi -pie -dynamic-linker /system/bin/linker -o cmTC_0d346 /Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/lib/arm-linux-androideabi/23/crtbegin_dynamic.o -L/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/lib/clang/18/lib/linux/arm -L/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/lib/arm-linux-androideabi/23 -L/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/lib/arm-linux-androideabi -L/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/lib/../lib -L/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/lib --build-id=sha1 --no-rosegment --no-undefined-version --fatal-warnings --no-undefined CMakeFiles/cmTC_0d346.dir/CMakeCXXCompilerABI.cpp.o -Bstatic -lc++ -Bdynamic -lm /Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/lib/clang/18/lib/linux/libclang_rt.builtins-arm-android.a -l:libunwind.a -ldl -lc /Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/lib/clang/18/lib/linux/libclang_rt.builtins-arm-android.a -l:libunwind.a -ldl /Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/lib/arm-linux-androideabi/23/crtend_android.o] + arg [/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/bin/ld.lld] ==> ignore + arg [--sysroot=/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot] ==> ignore + arg [-EL] ==> ignore + arg [-znow] ==> ignore + arg [-zrelro] ==> ignore + arg [-zmax-page-size=4096] ==> ignore + arg [-X] ==> ignore + arg [--hash-style=gnu] ==> ignore + arg [--eh-frame-hdr] ==> ignore + arg [-m] ==> ignore + arg [armelf_linux_eabi] ==> ignore + arg [-pie] ==> ignore + arg [-dynamic-linker] ==> ignore + arg [/system/bin/linker] ==> ignore + arg [-o] ==> ignore + arg [cmTC_0d346] ==> ignore + arg [/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/lib/arm-linux-androideabi/23/crtbegin_dynamic.o] ==> obj [/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/lib/arm-linux-androideabi/23/crtbegin_dynamic.o] + arg [-L/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/lib/clang/18/lib/linux/arm] ==> dir [/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/lib/clang/18/lib/linux/arm] + arg [-L/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/lib/arm-linux-androideabi/23] ==> dir [/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/lib/arm-linux-androideabi/23] + arg [-L/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/lib/arm-linux-androideabi] ==> dir [/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/lib/arm-linux-androideabi] + arg [-L/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/lib/../lib] ==> dir [/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/lib/../lib] + arg [-L/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/lib] ==> dir [/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/lib] + arg [--build-id=sha1] ==> ignore + arg [--no-rosegment] ==> ignore + arg [--no-undefined-version] ==> ignore + arg [--fatal-warnings] ==> ignore + arg [--no-undefined] ==> ignore + arg [CMakeFiles/cmTC_0d346.dir/CMakeCXXCompilerABI.cpp.o] ==> ignore + arg [-Bstatic] ==> search static + arg [-lc++] ==> lib [c++] + arg [-Bdynamic] ==> search dynamic + arg [-lm] ==> lib [m] + arg [/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/lib/clang/18/lib/linux/libclang_rt.builtins-arm-android.a] ==> lib [/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/lib/clang/18/lib/linux/libclang_rt.builtins-arm-android.a] + arg [-l:libunwind.a] ==> lib [-l:libunwind.a] + arg [-ldl] ==> lib [dl] + arg [-lc] ==> lib [c] + arg [/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/lib/clang/18/lib/linux/libclang_rt.builtins-arm-android.a] ==> lib [/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/lib/clang/18/lib/linux/libclang_rt.builtins-arm-android.a] + arg [-l:libunwind.a] ==> lib [-l:libunwind.a] + arg [-ldl] ==> lib [dl] + arg [/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/lib/arm-linux-androideabi/23/crtend_android.o] ==> obj [/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/lib/arm-linux-androideabi/23/crtend_android.o] + linker tool for 'CXX': /Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/bin/ld.lld + remove lib [/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/lib/clang/18/lib/linux/libclang_rt.builtins-arm-android.a] + remove lib [/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/lib/clang/18/lib/linux/libclang_rt.builtins-arm-android.a] + collapse library dir [/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/lib/clang/18/lib/linux/arm] ==> [/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/lib/clang/18/lib/linux/arm] + collapse library dir [/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/lib/arm-linux-androideabi/23] ==> [/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/lib/arm-linux-androideabi/23] + collapse library dir [/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/lib/arm-linux-androideabi] ==> [/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/lib/arm-linux-androideabi] + collapse library dir [/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/lib/../lib] ==> [/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/lib] + collapse library dir [/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/lib] ==> [/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/lib] + implicit libs: [c++;m;-l:libunwind.a;dl;c;-l:libunwind.a;dl] + implicit objs: [/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/lib/arm-linux-androideabi/23/crtbegin_dynamic.o;/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/lib/arm-linux-androideabi/23/crtend_android.o] + implicit dirs: [/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/lib/clang/18/lib/linux/arm;/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/lib/arm-linux-androideabi/23;/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/lib/arm-linux-androideabi;/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/lib] + implicit fwks: [] + + + - + kind: "message-v1" + backtrace: + - "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Internal/CMakeDetermineLinkerId.cmake:40 (message)" + - "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeDetermineCompilerABI.cmake:255 (cmake_determine_linker_id)" + - "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeTestCXXCompiler.cmake:26 (CMAKE_DETERMINE_COMPILER_ABI)" + - "CMakeLists.txt:2 (project)" + message: | + Running the CXX compiler's linker: "/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/bin/ld.lld" "-v" + LLD 18.0.1 (compatible with GNU linkers) +... diff --git a/siro_driver/android/app/.cxx/Debug/2j1f5m6a/armeabi-v7a/CMakeFiles/TargetDirectories.txt b/siro_driver/android/app/.cxx/Debug/2j1f5m6a/armeabi-v7a/CMakeFiles/TargetDirectories.txt new file mode 100644 index 0000000..b5ac1ed --- /dev/null +++ b/siro_driver/android/app/.cxx/Debug/2j1f5m6a/armeabi-v7a/CMakeFiles/TargetDirectories.txt @@ -0,0 +1,3 @@ +/Users/hamzaaleghwairyeen/development/App/intaleq_driver/android/app/.cxx/Debug/2j1f5m6a/armeabi-v7a/CMakeFiles/native-lib.dir +/Users/hamzaaleghwairyeen/development/App/intaleq_driver/android/app/.cxx/Debug/2j1f5m6a/armeabi-v7a/CMakeFiles/edit_cache.dir +/Users/hamzaaleghwairyeen/development/App/intaleq_driver/android/app/.cxx/Debug/2j1f5m6a/armeabi-v7a/CMakeFiles/rebuild_cache.dir diff --git a/siro_driver/android/app/.cxx/Debug/2j1f5m6a/armeabi-v7a/CMakeFiles/cmake.check_cache b/siro_driver/android/app/.cxx/Debug/2j1f5m6a/armeabi-v7a/CMakeFiles/cmake.check_cache new file mode 100644 index 0000000..3dccd73 --- /dev/null +++ b/siro_driver/android/app/.cxx/Debug/2j1f5m6a/armeabi-v7a/CMakeFiles/cmake.check_cache @@ -0,0 +1 @@ +# This file is generated by cmake for dependency checking of the CMakeCache.txt file diff --git a/siro_driver/android/app/.cxx/Debug/2j1f5m6a/armeabi-v7a/CMakeFiles/native-lib.dir/native-lib.cpp.o b/siro_driver/android/app/.cxx/Debug/2j1f5m6a/armeabi-v7a/CMakeFiles/native-lib.dir/native-lib.cpp.o new file mode 100644 index 0000000..873a00d Binary files /dev/null and b/siro_driver/android/app/.cxx/Debug/2j1f5m6a/armeabi-v7a/CMakeFiles/native-lib.dir/native-lib.cpp.o differ diff --git a/siro_driver/android/app/.cxx/Debug/2j1f5m6a/armeabi-v7a/CMakeFiles/rules.ninja b/siro_driver/android/app/.cxx/Debug/2j1f5m6a/armeabi-v7a/CMakeFiles/rules.ninja new file mode 100644 index 0000000..a110c01 --- /dev/null +++ b/siro_driver/android/app/.cxx/Debug/2j1f5m6a/armeabi-v7a/CMakeFiles/rules.ninja @@ -0,0 +1,66 @@ +# CMAKE generated file: DO NOT EDIT! +# Generated by "Ninja" Generator, CMake Version 3.31 + +# This file contains all the rules used to get the outputs files +# built from the input files. +# It is included in the main 'build.ninja'. + +# ============================================================================= +# Project: intaleq_driver +# Configurations: Debug +# ============================================================================= +# ============================================================================= + +############################################# +# Rule for compiling CXX files. + +rule CXX_COMPILER__native-lib_unscanned_Debug + depfile = $DEP_FILE + deps = gcc + command = ${LAUNCHER}${CODE_CHECK}/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/bin/clang++ --target=armv7-none-linux-androideabi23 --sysroot=/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot $DEFINES $INCLUDES $FLAGS -MD -MT $out -MF $DEP_FILE -o $out -c $in + description = Building CXX object $out + + +############################################# +# Rule for linking CXX shared library. + +rule CXX_SHARED_LIBRARY_LINKER__native-lib_Debug + depfile = $DEP_FILE + deps = gcc + command = $PRE_LINK && /Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/bin/clang++ --target=armv7-none-linux-androideabi23 --sysroot=/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot -fPIC $LANGUAGE_COMPILE_FLAGS $ARCH_FLAGS $LINK_FLAGS -shared $SONAME_FLAG$SONAME -o $TARGET_FILE $in $LINK_PATH $LINK_LIBRARIES && $POST_BUILD + description = Linking CXX shared library $TARGET_FILE + restat = $RESTAT + + +############################################# +# Rule for running custom commands. + +rule CUSTOM_COMMAND + command = $COMMAND + description = $DESC + + +############################################# +# Rule for re-running cmake. + +rule RERUN_CMAKE + command = /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/bin/cmake --regenerate-during-build -S/Users/hamzaaleghwairyeen/development/App/intaleq_driver/android/app/src/main/cpp -B/Users/hamzaaleghwairyeen/development/App/intaleq_driver/android/app/.cxx/Debug/2j1f5m6a/armeabi-v7a + description = Re-running CMake... + generator = 1 + + +############################################# +# Rule for cleaning all built files. + +rule CLEAN + command = /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/bin/ninja $FILE_ARG -t clean $TARGETS + description = Cleaning all built files... + + +############################################# +# Rule for printing all primary targets available. + +rule HELP + command = /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/bin/ninja -t targets + description = All primary targets available: + diff --git a/siro_driver/android/app/.cxx/Debug/2j1f5m6a/armeabi-v7a/additional_project_files.txt b/siro_driver/android/app/.cxx/Debug/2j1f5m6a/armeabi-v7a/additional_project_files.txt new file mode 100644 index 0000000..e69de29 diff --git a/siro_driver/android/app/.cxx/Debug/2j1f5m6a/armeabi-v7a/android_gradle_build.json b/siro_driver/android/app/.cxx/Debug/2j1f5m6a/armeabi-v7a/android_gradle_build.json new file mode 100644 index 0000000..547e7a3 --- /dev/null +++ b/siro_driver/android/app/.cxx/Debug/2j1f5m6a/armeabi-v7a/android_gradle_build.json @@ -0,0 +1,38 @@ +{ + "buildFiles": [ + "/Users/hamzaaleghwairyeen/development/App/intaleq_driver/android/app/src/main/cpp/CMakeLists.txt" + ], + "cleanCommandsComponents": [ + [ + "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/bin/ninja", + "-C", + "/Users/hamzaaleghwairyeen/development/App/intaleq_driver/android/app/.cxx/Debug/2j1f5m6a/armeabi-v7a", + "clean" + ] + ], + "buildTargetsCommandComponents": [ + "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/bin/ninja", + "-C", + "/Users/hamzaaleghwairyeen/development/App/intaleq_driver/android/app/.cxx/Debug/2j1f5m6a/armeabi-v7a", + "{LIST_OF_TARGETS_TO_BUILD}" + ], + "libraries": { + "native-lib::@6890427a1f51a3e7e1df": { + "toolchain": "toolchain", + "abi": "armeabi-v7a", + "artifactName": "native-lib", + "output": "/Users/hamzaaleghwairyeen/development/App/intaleq_driver/build/app/intermediates/cxx/Debug/2j1f5m6a/obj/armeabi-v7a/libnative-lib.so", + "runtimeFiles": [] + } + }, + "toolchains": { + "toolchain": { + "cCompilerExecutable": "/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/bin/clang.lld", + "cppCompilerExecutable": "/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/bin/clang++.lld" + } + }, + "cFileExtensions": [], + "cppFileExtensions": [ + "cpp" + ] +} \ No newline at end of file diff --git a/siro_driver/android/app/.cxx/Debug/2j1f5m6a/armeabi-v7a/android_gradle_build_mini.json b/siro_driver/android/app/.cxx/Debug/2j1f5m6a/armeabi-v7a/android_gradle_build_mini.json new file mode 100644 index 0000000..9f6c1e8 --- /dev/null +++ b/siro_driver/android/app/.cxx/Debug/2j1f5m6a/armeabi-v7a/android_gradle_build_mini.json @@ -0,0 +1,27 @@ +{ + "buildFiles": [ + "/Users/hamzaaleghwairyeen/development/App/intaleq_driver/android/app/src/main/cpp/CMakeLists.txt" + ], + "cleanCommandsComponents": [ + [ + "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/bin/ninja", + "-C", + "/Users/hamzaaleghwairyeen/development/App/intaleq_driver/android/app/.cxx/Debug/2j1f5m6a/armeabi-v7a", + "clean" + ] + ], + "buildTargetsCommandComponents": [ + "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/bin/ninja", + "-C", + "/Users/hamzaaleghwairyeen/development/App/intaleq_driver/android/app/.cxx/Debug/2j1f5m6a/armeabi-v7a", + "{LIST_OF_TARGETS_TO_BUILD}" + ], + "libraries": { + "native-lib::@6890427a1f51a3e7e1df": { + "artifactName": "native-lib", + "abi": "armeabi-v7a", + "output": "/Users/hamzaaleghwairyeen/development/App/intaleq_driver/build/app/intermediates/cxx/Debug/2j1f5m6a/obj/armeabi-v7a/libnative-lib.so", + "runtimeFiles": [] + } + } +} \ No newline at end of file diff --git a/siro_driver/android/app/.cxx/Debug/2j1f5m6a/armeabi-v7a/build.ninja b/siro_driver/android/app/.cxx/Debug/2j1f5m6a/armeabi-v7a/build.ninja new file mode 100644 index 0000000..b86f41e --- /dev/null +++ b/siro_driver/android/app/.cxx/Debug/2j1f5m6a/armeabi-v7a/build.ninja @@ -0,0 +1,156 @@ +# CMAKE generated file: DO NOT EDIT! +# Generated by "Ninja" Generator, CMake Version 3.31 + +# This file contains all the build statements describing the +# compilation DAG. + +# ============================================================================= +# Write statements declared in CMakeLists.txt: +# +# Which is the root file. +# ============================================================================= + +# ============================================================================= +# Project: intaleq_driver +# Configurations: Debug +# ============================================================================= + +############################################# +# Minimal version of Ninja required by this file + +ninja_required_version = 1.5 + + +############################################# +# Set configuration variable for custom commands. + +CONFIGURATION = Debug +# ============================================================================= +# Include auxiliary files. + + +############################################# +# Include rules file. + +include CMakeFiles/rules.ninja + +# ============================================================================= + +############################################# +# Logical path to working directory; prefix for absolute paths. + +cmake_ninja_workdir = /Users/hamzaaleghwairyeen/development/App/intaleq_driver/android/app/.cxx/Debug/2j1f5m6a/armeabi-v7a/ +# ============================================================================= +# Object build statements for SHARED_LIBRARY target native-lib + + +############################################# +# Order-only phony target for native-lib + +build cmake_object_order_depends_target_native-lib: phony || . + +build CMakeFiles/native-lib.dir/native-lib.cpp.o: CXX_COMPILER__native-lib_unscanned_Debug /Users/hamzaaleghwairyeen/development/App/intaleq_driver/android/app/src/main/cpp/native-lib.cpp || cmake_object_order_depends_target_native-lib + DEFINES = -Dnative_lib_EXPORTS + DEP_FILE = CMakeFiles/native-lib.dir/native-lib.cpp.o.d + FLAGS = -g -DANDROID -fdata-sections -ffunction-sections -funwind-tables -fstack-protector-strong -no-canonical-prefixes -D_FORTIFY_SOURCE=2 -march=armv7-a -mthumb -Wformat -Werror=format-security -fno-limit-debug-info -fPIC + OBJECT_DIR = CMakeFiles/native-lib.dir + OBJECT_FILE_DIR = CMakeFiles/native-lib.dir + TARGET_COMPILE_PDB = CMakeFiles/native-lib.dir/ + TARGET_PDB = /Users/hamzaaleghwairyeen/development/App/intaleq_driver/build/app/intermediates/cxx/Debug/2j1f5m6a/obj/armeabi-v7a/libnative-lib.pdb + + +# ============================================================================= +# Link build statements for SHARED_LIBRARY target native-lib + + +############################################# +# Link the shared library /Users/hamzaaleghwairyeen/development/App/intaleq_driver/build/app/intermediates/cxx/Debug/2j1f5m6a/obj/armeabi-v7a/libnative-lib.so + +build /Users/hamzaaleghwairyeen/development/App/intaleq_driver/build/app/intermediates/cxx/Debug/2j1f5m6a/obj/armeabi-v7a/libnative-lib.so: CXX_SHARED_LIBRARY_LINKER__native-lib_Debug CMakeFiles/native-lib.dir/native-lib.cpp.o | /Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/lib/arm-linux-androideabi/23/liblog.so + DEP_FILE = CMakeFiles/native-lib.dir/link.d + LANGUAGE_COMPILE_FLAGS = -g -DANDROID -fdata-sections -ffunction-sections -funwind-tables -fstack-protector-strong -no-canonical-prefixes -D_FORTIFY_SOURCE=2 -march=armv7-a -mthumb -Wformat -Werror=format-security -fno-limit-debug-info + LINK_FLAGS = -static-libstdc++ -Wl,--build-id=sha1 -Wl,--no-rosegment -Wl,--no-undefined-version -Wl,--fatal-warnings -Wl,--no-undefined -Qunused-arguments -Xlinker --dependency-file=CMakeFiles/native-lib.dir/link.d + LINK_LIBRARIES = /Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/lib/arm-linux-androideabi/23/liblog.so -latomic -lm + OBJECT_DIR = CMakeFiles/native-lib.dir + POST_BUILD = : + PRE_LINK = : + SONAME = libnative-lib.so + SONAME_FLAG = -Wl,-soname, + TARGET_COMPILE_PDB = CMakeFiles/native-lib.dir/ + TARGET_FILE = /Users/hamzaaleghwairyeen/development/App/intaleq_driver/build/app/intermediates/cxx/Debug/2j1f5m6a/obj/armeabi-v7a/libnative-lib.so + TARGET_PDB = /Users/hamzaaleghwairyeen/development/App/intaleq_driver/build/app/intermediates/cxx/Debug/2j1f5m6a/obj/armeabi-v7a/libnative-lib.pdb + + +############################################# +# Utility command for edit_cache + +build CMakeFiles/edit_cache.util: CUSTOM_COMMAND + COMMAND = cd /Users/hamzaaleghwairyeen/development/App/intaleq_driver/android/app/.cxx/Debug/2j1f5m6a/armeabi-v7a && /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/bin/ccmake -S/Users/hamzaaleghwairyeen/development/App/intaleq_driver/android/app/src/main/cpp -B/Users/hamzaaleghwairyeen/development/App/intaleq_driver/android/app/.cxx/Debug/2j1f5m6a/armeabi-v7a + DESC = Running CMake cache editor... + pool = console + restat = 1 + +build edit_cache: phony CMakeFiles/edit_cache.util + + +############################################# +# Utility command for rebuild_cache + +build CMakeFiles/rebuild_cache.util: CUSTOM_COMMAND + COMMAND = cd /Users/hamzaaleghwairyeen/development/App/intaleq_driver/android/app/.cxx/Debug/2j1f5m6a/armeabi-v7a && /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/bin/cmake --regenerate-during-build -S/Users/hamzaaleghwairyeen/development/App/intaleq_driver/android/app/src/main/cpp -B/Users/hamzaaleghwairyeen/development/App/intaleq_driver/android/app/.cxx/Debug/2j1f5m6a/armeabi-v7a + DESC = Running CMake to regenerate build system... + pool = console + restat = 1 + +build rebuild_cache: phony CMakeFiles/rebuild_cache.util + +# ============================================================================= +# Target aliases. + +build libnative-lib.so: phony /Users/hamzaaleghwairyeen/development/App/intaleq_driver/build/app/intermediates/cxx/Debug/2j1f5m6a/obj/armeabi-v7a/libnative-lib.so + +build native-lib: phony /Users/hamzaaleghwairyeen/development/App/intaleq_driver/build/app/intermediates/cxx/Debug/2j1f5m6a/obj/armeabi-v7a/libnative-lib.so + +# ============================================================================= +# Folder targets. + +# ============================================================================= + +############################################# +# Folder: /Users/hamzaaleghwairyeen/development/App/intaleq_driver/android/app/.cxx/Debug/2j1f5m6a/armeabi-v7a + +build all: phony /Users/hamzaaleghwairyeen/development/App/intaleq_driver/build/app/intermediates/cxx/Debug/2j1f5m6a/obj/armeabi-v7a/libnative-lib.so + +# ============================================================================= +# Built-in targets + + +############################################# +# Re-run CMake if any of its inputs changed. + +build build.ninja: RERUN_CMAKE | /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeCCompiler.cmake.in /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeCCompilerABI.c /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeCInformation.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeCXXCompiler.cmake.in /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeCXXCompilerABI.cpp /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeCXXInformation.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeCommonLanguageInclude.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeCompilerIdDetection.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeDetermineCCompiler.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeDetermineCXXCompiler.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeDetermineCompiler.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeDetermineCompilerABI.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeDetermineCompilerId.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeDetermineCompilerSupport.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeDetermineSystem.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeFindBinUtils.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeGenericSystem.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeInitializeConfigs.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeLanguageInformation.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeParseImplicitIncludeInfo.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeParseImplicitLinkInfo.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeParseLibraryArchitecture.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeSystem.cmake.in /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeSystemSpecificInformation.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeSystemSpecificInitialize.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeTestCCompiler.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeTestCXXCompiler.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeTestCompilerCommon.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/ADSP-DetermineCompiler.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/ARMCC-DetermineCompiler.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/ARMClang-DetermineCompiler.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/AppleClang-DetermineCompiler.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/Borland-DetermineCompiler.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/Bruce-C-DetermineCompiler.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/CMakeCommonCompilerMacros.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/Clang-C.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/Clang-CXX-CXXImportStd.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/Clang-CXX.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/Clang-DetermineCompiler.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/Clang-DetermineCompilerInternal.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/Clang-FindBinUtils.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/Clang.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/Compaq-C-DetermineCompiler.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/Compaq-CXX-DetermineCompiler.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/Cray-DetermineCompiler.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/CrayClang-DetermineCompiler.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/Embarcadero-DetermineCompiler.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/Fujitsu-DetermineCompiler.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/FujitsuClang-DetermineCompiler.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/GHS-DetermineCompiler.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/GNU-C-DetermineCompiler.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/GNU-CXX-DetermineCompiler.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/GNU.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/HP-C-DetermineCompiler.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/HP-CXX-DetermineCompiler.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/IAR-DetermineCompiler.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/IBMCPP-C-DetermineVersionInternal.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/IBMCPP-CXX-DetermineVersionInternal.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/IBMClang-C-DetermineCompiler.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/IBMClang-CXX-DetermineCompiler.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/Intel-DetermineCompiler.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/IntelLLVM-DetermineCompiler.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/LCC-C-DetermineCompiler.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/LCC-CXX-DetermineCompiler.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/MSVC-DetermineCompiler.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/NVHPC-DetermineCompiler.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/NVIDIA-DetermineCompiler.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/OpenWatcom-DetermineCompiler.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/OrangeC-DetermineCompiler.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/PGI-DetermineCompiler.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/PathScale-DetermineCompiler.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/SCO-DetermineCompiler.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/SDCC-C-DetermineCompiler.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/SunPro-C-DetermineCompiler.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/SunPro-CXX-DetermineCompiler.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/TI-DetermineCompiler.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/TIClang-DetermineCompiler.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/Tasking-DetermineCompiler.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/TinyCC-C-DetermineCompiler.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/VisualAge-C-DetermineCompiler.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/VisualAge-CXX-DetermineCompiler.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/Watcom-DetermineCompiler.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/XL-C-DetermineCompiler.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/XL-CXX-DetermineCompiler.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/XLClang-C-DetermineCompiler.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/XLClang-CXX-DetermineCompiler.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/zOS-C-DetermineCompiler.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/zOS-CXX-DetermineCompiler.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Internal/CMakeCLinkerInformation.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Internal/CMakeCXXLinkerInformation.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Internal/CMakeCommonLinkerInformation.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Internal/CMakeDetermineLinkerId.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Internal/FeatureTesting.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Linker/GNU.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Linker/LLD-C.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Linker/LLD-CXX.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Linker/LLD.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Platform/Android-Clang-C.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Platform/Android-Clang-CXX.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Platform/Android-Clang.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Platform/Android-Determine-C.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Platform/Android-Determine-CXX.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Platform/Android-Determine.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Platform/Android-Initialize.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Platform/Android.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Platform/Android/Determine-Compiler.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Platform/Linker/Android-LLD-C.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Platform/Linker/Android-LLD-CXX.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Platform/Linker/GNU.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Platform/Linker/Linux-GNU.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Platform/Linker/Linux-LLD-C.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Platform/Linker/Linux-LLD-CXX.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Platform/Linker/Linux-LLD.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Platform/Linux-Initialize.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Platform/Linux.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Platform/UnixPaths.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/build/cmake/abis.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/build/cmake/android-legacy.toolchain.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/build/cmake/android.toolchain.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/build/cmake/flags.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/build/cmake/hooks/pre/Android-Clang.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/build/cmake/hooks/pre/Android-Determine.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/build/cmake/hooks/pre/Android-Initialize.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/build/cmake/hooks/pre/Android.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/build/cmake/hooks/pre/Determine-Compiler.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/build/cmake/platforms.cmake /Users/hamzaaleghwairyeen/development/App/intaleq_driver/android/app/src/main/cpp/CMakeLists.txt CMakeCache.txt CMakeFiles/3.31.5-g6cf5163/CMakeCCompiler.cmake CMakeFiles/3.31.5-g6cf5163/CMakeCXXCompiler.cmake CMakeFiles/3.31.5-g6cf5163/CMakeSystem.cmake + pool = console + + +############################################# +# A missing CMake input file is not an error. + +build /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeCCompiler.cmake.in /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeCCompilerABI.c /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeCInformation.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeCXXCompiler.cmake.in /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeCXXCompilerABI.cpp /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeCXXInformation.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeCommonLanguageInclude.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeCompilerIdDetection.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeDetermineCCompiler.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeDetermineCXXCompiler.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeDetermineCompiler.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeDetermineCompilerABI.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeDetermineCompilerId.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeDetermineCompilerSupport.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeDetermineSystem.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeFindBinUtils.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeGenericSystem.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeInitializeConfigs.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeLanguageInformation.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeParseImplicitIncludeInfo.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeParseImplicitLinkInfo.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeParseLibraryArchitecture.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeSystem.cmake.in /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeSystemSpecificInformation.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeSystemSpecificInitialize.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeTestCCompiler.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeTestCXXCompiler.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeTestCompilerCommon.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/ADSP-DetermineCompiler.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/ARMCC-DetermineCompiler.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/ARMClang-DetermineCompiler.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/AppleClang-DetermineCompiler.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/Borland-DetermineCompiler.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/Bruce-C-DetermineCompiler.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/CMakeCommonCompilerMacros.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/Clang-C.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/Clang-CXX-CXXImportStd.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/Clang-CXX.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/Clang-DetermineCompiler.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/Clang-DetermineCompilerInternal.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/Clang-FindBinUtils.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/Clang.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/Compaq-C-DetermineCompiler.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/Compaq-CXX-DetermineCompiler.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/Cray-DetermineCompiler.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/CrayClang-DetermineCompiler.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/Embarcadero-DetermineCompiler.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/Fujitsu-DetermineCompiler.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/FujitsuClang-DetermineCompiler.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/GHS-DetermineCompiler.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/GNU-C-DetermineCompiler.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/GNU-CXX-DetermineCompiler.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/GNU.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/HP-C-DetermineCompiler.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/HP-CXX-DetermineCompiler.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/IAR-DetermineCompiler.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/IBMCPP-C-DetermineVersionInternal.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/IBMCPP-CXX-DetermineVersionInternal.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/IBMClang-C-DetermineCompiler.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/IBMClang-CXX-DetermineCompiler.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/Intel-DetermineCompiler.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/IntelLLVM-DetermineCompiler.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/LCC-C-DetermineCompiler.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/LCC-CXX-DetermineCompiler.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/MSVC-DetermineCompiler.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/NVHPC-DetermineCompiler.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/NVIDIA-DetermineCompiler.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/OpenWatcom-DetermineCompiler.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/OrangeC-DetermineCompiler.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/PGI-DetermineCompiler.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/PathScale-DetermineCompiler.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/SCO-DetermineCompiler.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/SDCC-C-DetermineCompiler.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/SunPro-C-DetermineCompiler.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/SunPro-CXX-DetermineCompiler.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/TI-DetermineCompiler.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/TIClang-DetermineCompiler.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/Tasking-DetermineCompiler.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/TinyCC-C-DetermineCompiler.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/VisualAge-C-DetermineCompiler.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/VisualAge-CXX-DetermineCompiler.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/Watcom-DetermineCompiler.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/XL-C-DetermineCompiler.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/XL-CXX-DetermineCompiler.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/XLClang-C-DetermineCompiler.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/XLClang-CXX-DetermineCompiler.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/zOS-C-DetermineCompiler.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/zOS-CXX-DetermineCompiler.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Internal/CMakeCLinkerInformation.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Internal/CMakeCXXLinkerInformation.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Internal/CMakeCommonLinkerInformation.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Internal/CMakeDetermineLinkerId.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Internal/FeatureTesting.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Linker/GNU.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Linker/LLD-C.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Linker/LLD-CXX.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Linker/LLD.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Platform/Android-Clang-C.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Platform/Android-Clang-CXX.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Platform/Android-Clang.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Platform/Android-Determine-C.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Platform/Android-Determine-CXX.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Platform/Android-Determine.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Platform/Android-Initialize.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Platform/Android.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Platform/Android/Determine-Compiler.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Platform/Linker/Android-LLD-C.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Platform/Linker/Android-LLD-CXX.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Platform/Linker/GNU.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Platform/Linker/Linux-GNU.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Platform/Linker/Linux-LLD-C.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Platform/Linker/Linux-LLD-CXX.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Platform/Linker/Linux-LLD.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Platform/Linux-Initialize.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Platform/Linux.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Platform/UnixPaths.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/build/cmake/abis.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/build/cmake/android-legacy.toolchain.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/build/cmake/android.toolchain.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/build/cmake/flags.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/build/cmake/hooks/pre/Android-Clang.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/build/cmake/hooks/pre/Android-Determine.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/build/cmake/hooks/pre/Android-Initialize.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/build/cmake/hooks/pre/Android.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/build/cmake/hooks/pre/Determine-Compiler.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/build/cmake/platforms.cmake /Users/hamzaaleghwairyeen/development/App/intaleq_driver/android/app/src/main/cpp/CMakeLists.txt CMakeCache.txt CMakeFiles/3.31.5-g6cf5163/CMakeCCompiler.cmake CMakeFiles/3.31.5-g6cf5163/CMakeCXXCompiler.cmake CMakeFiles/3.31.5-g6cf5163/CMakeSystem.cmake: phony + + +############################################# +# Clean all the built files. + +build clean: CLEAN + + +############################################# +# Print all primary targets available. + +build help: HELP + + +############################################# +# Make the all target the default. + +default all diff --git a/siro_driver/android/app/.cxx/Debug/2j1f5m6a/armeabi-v7a/build_file_index.txt b/siro_driver/android/app/.cxx/Debug/2j1f5m6a/armeabi-v7a/build_file_index.txt new file mode 100644 index 0000000..b1ca0fa --- /dev/null +++ b/siro_driver/android/app/.cxx/Debug/2j1f5m6a/armeabi-v7a/build_file_index.txt @@ -0,0 +1 @@ +/Users/hamzaaleghwairyeen/development/App/intaleq_driver/android/app/src/main/cpp/CMakeLists.txt \ No newline at end of file diff --git a/siro_driver/android/app/.cxx/Debug/2j1f5m6a/armeabi-v7a/cmake_install.cmake b/siro_driver/android/app/.cxx/Debug/2j1f5m6a/armeabi-v7a/cmake_install.cmake new file mode 100644 index 0000000..d4bacf2 --- /dev/null +++ b/siro_driver/android/app/.cxx/Debug/2j1f5m6a/armeabi-v7a/cmake_install.cmake @@ -0,0 +1,66 @@ +# Install script for directory: /Users/hamzaaleghwairyeen/development/App/intaleq_driver/android/app/src/main/cpp + +# Set the install prefix +if(NOT DEFINED CMAKE_INSTALL_PREFIX) + set(CMAKE_INSTALL_PREFIX "/usr/local") +endif() +string(REGEX REPLACE "/$" "" CMAKE_INSTALL_PREFIX "${CMAKE_INSTALL_PREFIX}") + +# Set the install configuration name. +if(NOT DEFINED CMAKE_INSTALL_CONFIG_NAME) + if(BUILD_TYPE) + string(REGEX REPLACE "^[^A-Za-z0-9_]+" "" + CMAKE_INSTALL_CONFIG_NAME "${BUILD_TYPE}") + else() + set(CMAKE_INSTALL_CONFIG_NAME "Debug") + endif() + message(STATUS "Install configuration: \"${CMAKE_INSTALL_CONFIG_NAME}\"") +endif() + +# Set the component getting installed. +if(NOT CMAKE_INSTALL_COMPONENT) + if(COMPONENT) + message(STATUS "Install component: \"${COMPONENT}\"") + set(CMAKE_INSTALL_COMPONENT "${COMPONENT}") + else() + set(CMAKE_INSTALL_COMPONENT) + endif() +endif() + +# Install shared libraries without execute permission? +if(NOT DEFINED CMAKE_INSTALL_SO_NO_EXE) + set(CMAKE_INSTALL_SO_NO_EXE "0") +endif() + +# Is this installation the result of a crosscompile? +if(NOT DEFINED CMAKE_CROSSCOMPILING) + set(CMAKE_CROSSCOMPILING "TRUE") +endif() + +# Set path to fallback-tool for dependency-resolution. +if(NOT DEFINED CMAKE_OBJDUMP) + set(CMAKE_OBJDUMP "/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/bin/llvm-objdump") +endif() + +string(REPLACE ";" "\n" CMAKE_INSTALL_MANIFEST_CONTENT + "${CMAKE_INSTALL_MANIFEST_FILES}") +if(CMAKE_INSTALL_LOCAL_ONLY) + file(WRITE "/Users/hamzaaleghwairyeen/development/App/intaleq_driver/android/app/.cxx/Debug/2j1f5m6a/armeabi-v7a/install_local_manifest.txt" + "${CMAKE_INSTALL_MANIFEST_CONTENT}") +endif() +if(CMAKE_INSTALL_COMPONENT) + if(CMAKE_INSTALL_COMPONENT MATCHES "^[a-zA-Z0-9_.+-]+$") + set(CMAKE_INSTALL_MANIFEST "install_manifest_${CMAKE_INSTALL_COMPONENT}.txt") + else() + string(MD5 CMAKE_INST_COMP_HASH "${CMAKE_INSTALL_COMPONENT}") + set(CMAKE_INSTALL_MANIFEST "install_manifest_${CMAKE_INST_COMP_HASH}.txt") + unset(CMAKE_INST_COMP_HASH) + endif() +else() + set(CMAKE_INSTALL_MANIFEST "install_manifest.txt") +endif() + +if(NOT CMAKE_INSTALL_LOCAL_ONLY) + file(WRITE "/Users/hamzaaleghwairyeen/development/App/intaleq_driver/android/app/.cxx/Debug/2j1f5m6a/armeabi-v7a/${CMAKE_INSTALL_MANIFEST}" + "${CMAKE_INSTALL_MANIFEST_CONTENT}") +endif() diff --git a/siro_driver/android/app/.cxx/Debug/2j1f5m6a/armeabi-v7a/compile_commands.json b/siro_driver/android/app/.cxx/Debug/2j1f5m6a/armeabi-v7a/compile_commands.json new file mode 100644 index 0000000..ebf94e0 --- /dev/null +++ b/siro_driver/android/app/.cxx/Debug/2j1f5m6a/armeabi-v7a/compile_commands.json @@ -0,0 +1,8 @@ +[ +{ + "directory": "/Users/hamzaaleghwairyeen/development/App/intaleq_driver/android/app/.cxx/Debug/2j1f5m6a/armeabi-v7a", + "command": "/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/bin/clang++ --target=armv7-none-linux-androideabi23 --sysroot=/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot -Dnative_lib_EXPORTS -g -DANDROID -fdata-sections -ffunction-sections -funwind-tables -fstack-protector-strong -no-canonical-prefixes -D_FORTIFY_SOURCE=2 -march=armv7-a -mthumb -Wformat -Werror=format-security -fno-limit-debug-info -fPIC -o CMakeFiles/native-lib.dir/native-lib.cpp.o -c /Users/hamzaaleghwairyeen/development/App/intaleq_driver/android/app/src/main/cpp/native-lib.cpp", + "file": "/Users/hamzaaleghwairyeen/development/App/intaleq_driver/android/app/src/main/cpp/native-lib.cpp", + "output": "CMakeFiles/native-lib.dir/native-lib.cpp.o" +} +] \ No newline at end of file diff --git a/siro_driver/android/app/.cxx/Debug/2j1f5m6a/armeabi-v7a/compile_commands.json.bin b/siro_driver/android/app/.cxx/Debug/2j1f5m6a/armeabi-v7a/compile_commands.json.bin new file mode 100644 index 0000000..18becd6 Binary files /dev/null and b/siro_driver/android/app/.cxx/Debug/2j1f5m6a/armeabi-v7a/compile_commands.json.bin differ diff --git a/siro_driver/android/app/.cxx/Debug/2j1f5m6a/armeabi-v7a/configure_fingerprint.bin b/siro_driver/android/app/.cxx/Debug/2j1f5m6a/armeabi-v7a/configure_fingerprint.bin new file mode 100644 index 0000000..54757c6 --- /dev/null +++ b/siro_driver/android/app/.cxx/Debug/2j1f5m6a/armeabi-v7a/configure_fingerprint.bin @@ -0,0 +1,28 @@ +C/C++ Structured Log + +/Users/hamzaaleghwairyeen/development/App/intaleq_driver/android/app/.cxx/Debug/2j1f5m6a/armeabi-v7a/additional_project_files.txtC +A +?com.android.build.gradle.internal.cxx.io.EncodedFileFingerPrint  3  ʓӁ3 + +~/Users/hamzaaleghwairyeen/development/App/intaleq_driver/android/app/.cxx/Debug/2j1f5m6a/armeabi-v7a/android_gradle_build.json  3 ʓӁ3 + +/Users/hamzaaleghwairyeen/development/App/intaleq_driver/android/app/.cxx/Debug/2j1f5m6a/armeabi-v7a/android_gradle_build_mini.json  3 ʓӁ3t +r +p/Users/hamzaaleghwairyeen/development/App/intaleq_driver/android/app/.cxx/Debug/2j1f5m6a/armeabi-v7a/build.ninja  3 ɓӁ3x +v +t/Users/hamzaaleghwairyeen/development/App/intaleq_driver/android/app/.cxx/Debug/2j1f5m6a/armeabi-v7a/build.ninja.txt  3} +{ +y/Users/hamzaaleghwairyeen/development/App/intaleq_driver/android/app/.cxx/Debug/2j1f5m6a/armeabi-v7a/build_file_index.txt  3 ` ʓӁ3~ +| +z/Users/hamzaaleghwairyeen/development/App/intaleq_driver/android/app/.cxx/Debug/2j1f5m6a/armeabi-v7a/compile_commands.json  3 ɓӁ3 + +~/Users/hamzaaleghwairyeen/development/App/intaleq_driver/android/app/.cxx/Debug/2j1f5m6a/armeabi-v7a/compile_commands.json.bin  3  ɓӁ3 + +/Users/hamzaaleghwairyeen/development/App/intaleq_driver/android/app/.cxx/Debug/2j1f5m6a/armeabi-v7a/metadata_generation_command.txt  3 + ʓӁ3{ +y +w/Users/hamzaaleghwairyeen/development/App/intaleq_driver/android/app/.cxx/Debug/2j1f5m6a/armeabi-v7a/prefab_config.json  3  ( ʓӁ3 +~ +|/Users/hamzaaleghwairyeen/development/App/intaleq_driver/android/app/.cxx/Debug/2j1f5m6a/armeabi-v7a/symbol_folder_index.txt  3  s ʓӁ3d +b +`/Users/hamzaaleghwairyeen/development/App/intaleq_driver/android/app/src/main/cpp/CMakeLists.txt  3  劝2 \ No newline at end of file diff --git a/siro_driver/android/app/.cxx/Debug/2j1f5m6a/armeabi-v7a/metadata_generation_command.txt b/siro_driver/android/app/.cxx/Debug/2j1f5m6a/armeabi-v7a/metadata_generation_command.txt new file mode 100644 index 0000000..00d505e --- /dev/null +++ b/siro_driver/android/app/.cxx/Debug/2j1f5m6a/armeabi-v7a/metadata_generation_command.txt @@ -0,0 +1,18 @@ + -H/Users/hamzaaleghwairyeen/development/App/intaleq_driver/android/app/src/main/cpp +-DCMAKE_SYSTEM_NAME=Android +-DCMAKE_EXPORT_COMPILE_COMMANDS=ON +-DCMAKE_SYSTEM_VERSION=23 +-DANDROID_PLATFORM=android-23 +-DANDROID_ABI=armeabi-v7a +-DCMAKE_ANDROID_ARCH_ABI=armeabi-v7a +-DANDROID_NDK=/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973 +-DCMAKE_ANDROID_NDK=/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973 +-DCMAKE_TOOLCHAIN_FILE=/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/build/cmake/android.toolchain.cmake +-DCMAKE_MAKE_PROGRAM=/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/bin/ninja +-DCMAKE_LIBRARY_OUTPUT_DIRECTORY=/Users/hamzaaleghwairyeen/development/App/intaleq_driver/build/app/intermediates/cxx/Debug/2j1f5m6a/obj/armeabi-v7a +-DCMAKE_RUNTIME_OUTPUT_DIRECTORY=/Users/hamzaaleghwairyeen/development/App/intaleq_driver/build/app/intermediates/cxx/Debug/2j1f5m6a/obj/armeabi-v7a +-DCMAKE_BUILD_TYPE=Debug +-B/Users/hamzaaleghwairyeen/development/App/intaleq_driver/android/app/.cxx/Debug/2j1f5m6a/armeabi-v7a +-GNinja + Build command args: [] + Version: 2 \ No newline at end of file diff --git a/siro_driver/android/app/.cxx/Debug/2j1f5m6a/armeabi-v7a/prefab_config.json b/siro_driver/android/app/.cxx/Debug/2j1f5m6a/armeabi-v7a/prefab_config.json new file mode 100644 index 0000000..e799de8 --- /dev/null +++ b/siro_driver/android/app/.cxx/Debug/2j1f5m6a/armeabi-v7a/prefab_config.json @@ -0,0 +1,4 @@ +{ + "enabled": false, + "packages": [] +} \ No newline at end of file diff --git a/siro_driver/android/app/.cxx/Debug/2j1f5m6a/armeabi-v7a/symbol_folder_index.txt b/siro_driver/android/app/.cxx/Debug/2j1f5m6a/armeabi-v7a/symbol_folder_index.txt new file mode 100644 index 0000000..4723ee3 --- /dev/null +++ b/siro_driver/android/app/.cxx/Debug/2j1f5m6a/armeabi-v7a/symbol_folder_index.txt @@ -0,0 +1 @@ +/Users/hamzaaleghwairyeen/development/App/intaleq_driver/build/app/intermediates/cxx/Debug/2j1f5m6a/obj/armeabi-v7a \ No newline at end of file diff --git a/siro_driver/android/app/.cxx/Debug/2j1f5m6a/hash_key.txt b/siro_driver/android/app/.cxx/Debug/2j1f5m6a/hash_key.txt new file mode 100644 index 0000000..43fb0df --- /dev/null +++ b/siro_driver/android/app/.cxx/Debug/2j1f5m6a/hash_key.txt @@ -0,0 +1,25 @@ +# Values used to calculate the hash in this folder name. +# Should not depend on the absolute path of the project itself. +# - AGP: 8.11.0. +# - $NDK is the path to NDK 27.0.12077973. +# - $PROJECT is the path to the parent folder of the root Gradle build file. +# - $ABI is the ABI to be built with. The specific value doesn't contribute to the value of the hash. +# - $HASH is the hash value computed from this text. +# - $CMAKE is the path to CMake 3.31.5. +# - $NINJA is the path to Ninja. +-H$PROJECT/app/src/main/cpp +-DCMAKE_SYSTEM_NAME=Android +-DCMAKE_EXPORT_COMPILE_COMMANDS=ON +-DCMAKE_SYSTEM_VERSION=23 +-DANDROID_PLATFORM=android-23 +-DANDROID_ABI=$ABI +-DCMAKE_ANDROID_ARCH_ABI=$ABI +-DANDROID_NDK=$NDK +-DCMAKE_ANDROID_NDK=$NDK +-DCMAKE_TOOLCHAIN_FILE=$NDK/build/cmake/android.toolchain.cmake +-DCMAKE_MAKE_PROGRAM=$NINJA +-DCMAKE_LIBRARY_OUTPUT_DIRECTORY=/Users/hamzaaleghwairyeen/development/App/intaleq_driver/build/app/intermediates/cxx/Debug/$HASH/obj/$ABI +-DCMAKE_RUNTIME_OUTPUT_DIRECTORY=/Users/hamzaaleghwairyeen/development/App/intaleq_driver/build/app/intermediates/cxx/Debug/$HASH/obj/$ABI +-DCMAKE_BUILD_TYPE=Debug +-B$PROJECT/app/.cxx/Debug/$HASH/$ABI +-GNinja \ No newline at end of file diff --git a/siro_driver/android/app/.cxx/Debug/2j1f5m6a/x86/.cmake/api/v1/query/client-agp/cache-v2 b/siro_driver/android/app/.cxx/Debug/2j1f5m6a/x86/.cmake/api/v1/query/client-agp/cache-v2 new file mode 100644 index 0000000..e69de29 diff --git a/siro_driver/android/app/.cxx/Debug/2j1f5m6a/x86/.cmake/api/v1/query/client-agp/cmakeFiles-v1 b/siro_driver/android/app/.cxx/Debug/2j1f5m6a/x86/.cmake/api/v1/query/client-agp/cmakeFiles-v1 new file mode 100644 index 0000000..e69de29 diff --git a/siro_driver/android/app/.cxx/Debug/2j1f5m6a/x86/.cmake/api/v1/query/client-agp/codemodel-v2 b/siro_driver/android/app/.cxx/Debug/2j1f5m6a/x86/.cmake/api/v1/query/client-agp/codemodel-v2 new file mode 100644 index 0000000..e69de29 diff --git a/siro_driver/android/app/.cxx/Debug/2j1f5m6a/x86/.cmake/api/v1/reply/cache-v2-0def829273509cde3a7e.json b/siro_driver/android/app/.cxx/Debug/2j1f5m6a/x86/.cmake/api/v1/reply/cache-v2-0def829273509cde3a7e.json new file mode 100644 index 0000000..f11d2af --- /dev/null +++ b/siro_driver/android/app/.cxx/Debug/2j1f5m6a/x86/.cmake/api/v1/reply/cache-v2-0def829273509cde3a7e.json @@ -0,0 +1,1479 @@ +{ + "entries" : + [ + { + "name" : "ANDROID_ABI", + "properties" : + [ + { + "name" : "HELPSTRING", + "value" : "No help, variable specified on the command line." + } + ], + "type" : "UNINITIALIZED", + "value" : "x86" + }, + { + "name" : "ANDROID_NDK", + "properties" : + [ + { + "name" : "HELPSTRING", + "value" : "No help, variable specified on the command line." + } + ], + "type" : "UNINITIALIZED", + "value" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973" + }, + { + "name" : "ANDROID_PLATFORM", + "properties" : + [ + { + "name" : "HELPSTRING", + "value" : "No help, variable specified on the command line." + } + ], + "type" : "UNINITIALIZED", + "value" : "android-23" + }, + { + "name" : "CMAKE_ADDR2LINE", + "properties" : + [ + { + "name" : "ADVANCED", + "value" : "1" + }, + { + "name" : "HELPSTRING", + "value" : "Path to a program." + } + ], + "type" : "FILEPATH", + "value" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/bin/llvm-addr2line" + }, + { + "name" : "CMAKE_ANDROID_ARCH_ABI", + "properties" : + [ + { + "name" : "HELPSTRING", + "value" : "No help, variable specified on the command line." + } + ], + "type" : "UNINITIALIZED", + "value" : "x86" + }, + { + "name" : "CMAKE_ANDROID_NDK", + "properties" : + [ + { + "name" : "HELPSTRING", + "value" : "No help, variable specified on the command line." + } + ], + "type" : "UNINITIALIZED", + "value" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973" + }, + { + "name" : "CMAKE_AR", + "properties" : + [ + { + "name" : "ADVANCED", + "value" : "1" + }, + { + "name" : "HELPSTRING", + "value" : "Archiver" + } + ], + "type" : "FILEPATH", + "value" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/bin/llvm-ar" + }, + { + "name" : "CMAKE_ASM_FLAGS", + "properties" : + [ + { + "name" : "HELPSTRING", + "value" : "Flags used by the compiler during all build types." + } + ], + "type" : "STRING", + "value" : "" + }, + { + "name" : "CMAKE_ASM_FLAGS_DEBUG", + "properties" : + [ + { + "name" : "HELPSTRING", + "value" : "Flags used by the compiler during debug builds." + } + ], + "type" : "STRING", + "value" : "" + }, + { + "name" : "CMAKE_ASM_FLAGS_RELEASE", + "properties" : + [ + { + "name" : "HELPSTRING", + "value" : "Flags used by the compiler during release builds." + } + ], + "type" : "STRING", + "value" : "" + }, + { + "name" : "CMAKE_BUILD_TYPE", + "properties" : + [ + { + "name" : "HELPSTRING", + "value" : "Choose the type of build, options are: None Debug Release RelWithDebInfo MinSizeRel ..." + } + ], + "type" : "STRING", + "value" : "Debug" + }, + { + "name" : "CMAKE_CACHEFILE_DIR", + "properties" : + [ + { + "name" : "HELPSTRING", + "value" : "This is the directory where this CMakeCache.txt was created" + } + ], + "type" : "INTERNAL", + "value" : "/Users/hamzaaleghwairyeen/development/App/intaleq_driver/android/app/.cxx/Debug/2j1f5m6a/x86" + }, + { + "name" : "CMAKE_CACHE_MAJOR_VERSION", + "properties" : + [ + { + "name" : "HELPSTRING", + "value" : "Major version of cmake used to create the current loaded cache" + } + ], + "type" : "INTERNAL", + "value" : "3" + }, + { + "name" : "CMAKE_CACHE_MINOR_VERSION", + "properties" : + [ + { + "name" : "HELPSTRING", + "value" : "Minor version of cmake used to create the current loaded cache" + } + ], + "type" : "INTERNAL", + "value" : "31" + }, + { + "name" : "CMAKE_CACHE_PATCH_VERSION", + "properties" : + [ + { + "name" : "HELPSTRING", + "value" : "Patch version of cmake used to create the current loaded cache" + } + ], + "type" : "INTERNAL", + "value" : "5" + }, + { + "name" : "CMAKE_COMMAND", + "properties" : + [ + { + "name" : "HELPSTRING", + "value" : "Path to CMake executable." + } + ], + "type" : "INTERNAL", + "value" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/bin/cmake" + }, + { + "name" : "CMAKE_CPACK_COMMAND", + "properties" : + [ + { + "name" : "HELPSTRING", + "value" : "Path to cpack program executable." + } + ], + "type" : "INTERNAL", + "value" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/bin/cpack" + }, + { + "name" : "CMAKE_CTEST_COMMAND", + "properties" : + [ + { + "name" : "HELPSTRING", + "value" : "Path to ctest program executable." + } + ], + "type" : "INTERNAL", + "value" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/bin/ctest" + }, + { + "name" : "CMAKE_CXX_COMPILER", + "properties" : + [ + { + "name" : "ADVANCED", + "value" : "1" + }, + { + "name" : "HELPSTRING", + "value" : "" + } + ], + "type" : "UNINITIALIZED", + "value" : "" + }, + { + "name" : "CMAKE_CXX_COMPILER_AR", + "properties" : + [ + { + "name" : "ADVANCED", + "value" : "1" + }, + { + "name" : "HELPSTRING", + "value" : "LLVM archiver" + } + ], + "type" : "FILEPATH", + "value" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/bin/llvm-ar" + }, + { + "name" : "CMAKE_CXX_COMPILER_CLANG_SCAN_DEPS", + "properties" : + [ + { + "name" : "ADVANCED", + "value" : "1" + }, + { + "name" : "HELPSTRING", + "value" : "`clang-scan-deps` dependency scanner" + } + ], + "type" : "FILEPATH", + "value" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/bin/clang-scan-deps" + }, + { + "name" : "CMAKE_CXX_COMPILER_RANLIB", + "properties" : + [ + { + "name" : "ADVANCED", + "value" : "1" + }, + { + "name" : "HELPSTRING", + "value" : "Generate index for LLVM archive" + } + ], + "type" : "FILEPATH", + "value" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/bin/llvm-ranlib" + }, + { + "name" : "CMAKE_CXX_FLAGS", + "properties" : + [ + { + "name" : "ADVANCED", + "value" : "1" + }, + { + "name" : "HELPSTRING", + "value" : "Flags used by the compiler during all build types." + } + ], + "type" : "STRING", + "value" : "" + }, + { + "name" : "CMAKE_CXX_FLAGS_DEBUG", + "properties" : + [ + { + "name" : "ADVANCED", + "value" : "1" + }, + { + "name" : "HELPSTRING", + "value" : "Flags used by the compiler during debug builds." + } + ], + "type" : "STRING", + "value" : "" + }, + { + "name" : "CMAKE_CXX_FLAGS_MINSIZEREL", + "properties" : + [ + { + "name" : "ADVANCED", + "value" : "1" + }, + { + "name" : "HELPSTRING", + "value" : "Flags used by the CXX compiler during MINSIZEREL builds." + } + ], + "type" : "STRING", + "value" : "-Os -DNDEBUG" + }, + { + "name" : "CMAKE_CXX_FLAGS_RELEASE", + "properties" : + [ + { + "name" : "ADVANCED", + "value" : "1" + }, + { + "name" : "HELPSTRING", + "value" : "Flags used by the compiler during release builds." + } + ], + "type" : "STRING", + "value" : "" + }, + { + "name" : "CMAKE_CXX_FLAGS_RELWITHDEBINFO", + "properties" : + [ + { + "name" : "ADVANCED", + "value" : "1" + }, + { + "name" : "HELPSTRING", + "value" : "Flags used by the CXX compiler during RELWITHDEBINFO builds." + } + ], + "type" : "STRING", + "value" : "-O2 -g -DNDEBUG" + }, + { + "name" : "CMAKE_CXX_STANDARD_LIBRARIES", + "properties" : + [ + { + "name" : "ADVANCED", + "value" : "1" + }, + { + "name" : "HELPSTRING", + "value" : "Libraries linked by default with all C++ applications." + } + ], + "type" : "STRING", + "value" : "-latomic -lm" + }, + { + "name" : "CMAKE_C_COMPILER", + "properties" : + [ + { + "name" : "ADVANCED", + "value" : "1" + }, + { + "name" : "HELPSTRING", + "value" : "" + } + ], + "type" : "UNINITIALIZED", + "value" : "" + }, + { + "name" : "CMAKE_C_COMPILER_AR", + "properties" : + [ + { + "name" : "ADVANCED", + "value" : "1" + }, + { + "name" : "HELPSTRING", + "value" : "LLVM archiver" + } + ], + "type" : "FILEPATH", + "value" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/bin/llvm-ar" + }, + { + "name" : "CMAKE_C_COMPILER_CLANG_SCAN_DEPS", + "properties" : + [ + { + "name" : "ADVANCED", + "value" : "1" + }, + { + "name" : "HELPSTRING", + "value" : "`clang-scan-deps` dependency scanner" + } + ], + "type" : "FILEPATH", + "value" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/bin/clang-scan-deps" + }, + { + "name" : "CMAKE_C_COMPILER_RANLIB", + "properties" : + [ + { + "name" : "ADVANCED", + "value" : "1" + }, + { + "name" : "HELPSTRING", + "value" : "Generate index for LLVM archive" + } + ], + "type" : "FILEPATH", + "value" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/bin/llvm-ranlib" + }, + { + "name" : "CMAKE_C_FLAGS", + "properties" : + [ + { + "name" : "ADVANCED", + "value" : "1" + }, + { + "name" : "HELPSTRING", + "value" : "Flags used by the compiler during all build types." + } + ], + "type" : "STRING", + "value" : "" + }, + { + "name" : "CMAKE_C_FLAGS_DEBUG", + "properties" : + [ + { + "name" : "ADVANCED", + "value" : "1" + }, + { + "name" : "HELPSTRING", + "value" : "Flags used by the compiler during debug builds." + } + ], + "type" : "STRING", + "value" : "" + }, + { + "name" : "CMAKE_C_FLAGS_MINSIZEREL", + "properties" : + [ + { + "name" : "ADVANCED", + "value" : "1" + }, + { + "name" : "HELPSTRING", + "value" : "Flags used by the C compiler during MINSIZEREL builds." + } + ], + "type" : "STRING", + "value" : "-Os -DNDEBUG" + }, + { + "name" : "CMAKE_C_FLAGS_RELEASE", + "properties" : + [ + { + "name" : "ADVANCED", + "value" : "1" + }, + { + "name" : "HELPSTRING", + "value" : "Flags used by the compiler during release builds." + } + ], + "type" : "STRING", + "value" : "" + }, + { + "name" : "CMAKE_C_FLAGS_RELWITHDEBINFO", + "properties" : + [ + { + "name" : "ADVANCED", + "value" : "1" + }, + { + "name" : "HELPSTRING", + "value" : "Flags used by the C compiler during RELWITHDEBINFO builds." + } + ], + "type" : "STRING", + "value" : "-O2 -g -DNDEBUG" + }, + { + "name" : "CMAKE_C_STANDARD_LIBRARIES", + "properties" : + [ + { + "name" : "ADVANCED", + "value" : "1" + }, + { + "name" : "HELPSTRING", + "value" : "Libraries linked by default with all C applications." + } + ], + "type" : "STRING", + "value" : "-latomic -lm" + }, + { + "name" : "CMAKE_DLLTOOL", + "properties" : + [ + { + "name" : "ADVANCED", + "value" : "1" + }, + { + "name" : "HELPSTRING", + "value" : "Path to a program." + } + ], + "type" : "FILEPATH", + "value" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/bin/llvm-dlltool" + }, + { + "name" : "CMAKE_EDIT_COMMAND", + "properties" : + [ + { + "name" : "HELPSTRING", + "value" : "Path to cache edit program executable." + } + ], + "type" : "INTERNAL", + "value" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/bin/ccmake" + }, + { + "name" : "CMAKE_EXECUTABLE_FORMAT", + "properties" : + [ + { + "name" : "HELPSTRING", + "value" : "Executable file format" + } + ], + "type" : "INTERNAL", + "value" : "ELF" + }, + { + "name" : "CMAKE_EXE_LINKER_FLAGS", + "properties" : + [ + { + "name" : "ADVANCED", + "value" : "1" + }, + { + "name" : "HELPSTRING", + "value" : "Flags used by the linker." + } + ], + "type" : "STRING", + "value" : "" + }, + { + "name" : "CMAKE_EXE_LINKER_FLAGS_DEBUG", + "properties" : + [ + { + "name" : "ADVANCED", + "value" : "1" + }, + { + "name" : "HELPSTRING", + "value" : "Flags used by the linker during DEBUG builds." + } + ], + "type" : "STRING", + "value" : "" + }, + { + "name" : "CMAKE_EXE_LINKER_FLAGS_MINSIZEREL", + "properties" : + [ + { + "name" : "ADVANCED", + "value" : "1" + }, + { + "name" : "HELPSTRING", + "value" : "Flags used by the linker during MINSIZEREL builds." + } + ], + "type" : "STRING", + "value" : "" + }, + { + "name" : "CMAKE_EXE_LINKER_FLAGS_RELEASE", + "properties" : + [ + { + "name" : "ADVANCED", + "value" : "1" + }, + { + "name" : "HELPSTRING", + "value" : "Flags used by the linker during RELEASE builds." + } + ], + "type" : "STRING", + "value" : "" + }, + { + "name" : "CMAKE_EXE_LINKER_FLAGS_RELWITHDEBINFO", + "properties" : + [ + { + "name" : "ADVANCED", + "value" : "1" + }, + { + "name" : "HELPSTRING", + "value" : "Flags used by the linker during RELWITHDEBINFO builds." + } + ], + "type" : "STRING", + "value" : "" + }, + { + "name" : "CMAKE_EXPORT_BUILD_DATABASE", + "properties" : + [ + { + "name" : "ADVANCED", + "value" : "1" + }, + { + "name" : "HELPSTRING", + "value" : "Enable/Disable output of build database during the build." + } + ], + "type" : "BOOL", + "value" : "" + }, + { + "name" : "CMAKE_EXPORT_COMPILE_COMMANDS", + "properties" : + [ + { + "name" : "HELPSTRING", + "value" : "No help, variable specified on the command line." + } + ], + "type" : "UNINITIALIZED", + "value" : "ON" + }, + { + "name" : "CMAKE_EXTRA_GENERATOR", + "properties" : + [ + { + "name" : "HELPSTRING", + "value" : "Name of external makefile project generator." + } + ], + "type" : "INTERNAL", + "value" : "" + }, + { + "name" : "CMAKE_FIND_PACKAGE_REDIRECTS_DIR", + "properties" : + [ + { + "name" : "HELPSTRING", + "value" : "Value Computed by CMake." + } + ], + "type" : "STATIC", + "value" : "/Users/hamzaaleghwairyeen/development/App/intaleq_driver/android/app/.cxx/Debug/2j1f5m6a/x86/CMakeFiles/pkgRedirects" + }, + { + "name" : "CMAKE_GENERATOR", + "properties" : + [ + { + "name" : "HELPSTRING", + "value" : "Name of generator." + } + ], + "type" : "INTERNAL", + "value" : "Ninja" + }, + { + "name" : "CMAKE_GENERATOR_INSTANCE", + "properties" : + [ + { + "name" : "HELPSTRING", + "value" : "Generator instance identifier." + } + ], + "type" : "INTERNAL", + "value" : "" + }, + { + "name" : "CMAKE_GENERATOR_PLATFORM", + "properties" : + [ + { + "name" : "HELPSTRING", + "value" : "Name of generator platform." + } + ], + "type" : "INTERNAL", + "value" : "" + }, + { + "name" : "CMAKE_GENERATOR_TOOLSET", + "properties" : + [ + { + "name" : "HELPSTRING", + "value" : "Name of generator toolset." + } + ], + "type" : "INTERNAL", + "value" : "" + }, + { + "name" : "CMAKE_HOME_DIRECTORY", + "properties" : + [ + { + "name" : "HELPSTRING", + "value" : "Source directory with the top level CMakeLists.txt file for this project" + } + ], + "type" : "INTERNAL", + "value" : "/Users/hamzaaleghwairyeen/development/App/intaleq_driver/android/app/src/main/cpp" + }, + { + "name" : "CMAKE_INSTALL_PREFIX", + "properties" : + [ + { + "name" : "HELPSTRING", + "value" : "Install path prefix, prepended onto install directories." + } + ], + "type" : "PATH", + "value" : "/usr/local" + }, + { + "name" : "CMAKE_INSTALL_SO_NO_EXE", + "properties" : + [ + { + "name" : "HELPSTRING", + "value" : "Install .so files without execute permission." + } + ], + "type" : "INTERNAL", + "value" : "0" + }, + { + "name" : "CMAKE_LIBRARY_OUTPUT_DIRECTORY", + "properties" : + [ + { + "name" : "HELPSTRING", + "value" : "No help, variable specified on the command line." + } + ], + "type" : "UNINITIALIZED", + "value" : "/Users/hamzaaleghwairyeen/development/App/intaleq_driver/build/app/intermediates/cxx/Debug/2j1f5m6a/obj/x86" + }, + { + "name" : "CMAKE_LINKER", + "properties" : + [ + { + "name" : "ADVANCED", + "value" : "1" + }, + { + "name" : "HELPSTRING", + "value" : "Path to a program." + } + ], + "type" : "FILEPATH", + "value" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/bin/ld.lld" + }, + { + "name" : "CMAKE_MAKE_PROGRAM", + "properties" : + [ + { + "name" : "HELPSTRING", + "value" : "No help, variable specified on the command line." + } + ], + "type" : "UNINITIALIZED", + "value" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/bin/ninja" + }, + { + "name" : "CMAKE_MODULE_LINKER_FLAGS", + "properties" : + [ + { + "name" : "ADVANCED", + "value" : "1" + }, + { + "name" : "HELPSTRING", + "value" : "Flags used by the linker during the creation of modules." + } + ], + "type" : "STRING", + "value" : "" + }, + { + "name" : "CMAKE_MODULE_LINKER_FLAGS_DEBUG", + "properties" : + [ + { + "name" : "ADVANCED", + "value" : "1" + }, + { + "name" : "HELPSTRING", + "value" : "Flags used by the linker during the creation of modules during DEBUG builds." + } + ], + "type" : "STRING", + "value" : "" + }, + { + "name" : "CMAKE_MODULE_LINKER_FLAGS_MINSIZEREL", + "properties" : + [ + { + "name" : "ADVANCED", + "value" : "1" + }, + { + "name" : "HELPSTRING", + "value" : "Flags used by the linker during the creation of modules during MINSIZEREL builds." + } + ], + "type" : "STRING", + "value" : "" + }, + { + "name" : "CMAKE_MODULE_LINKER_FLAGS_RELEASE", + "properties" : + [ + { + "name" : "ADVANCED", + "value" : "1" + }, + { + "name" : "HELPSTRING", + "value" : "Flags used by the linker during the creation of modules during RELEASE builds." + } + ], + "type" : "STRING", + "value" : "" + }, + { + "name" : "CMAKE_MODULE_LINKER_FLAGS_RELWITHDEBINFO", + "properties" : + [ + { + "name" : "ADVANCED", + "value" : "1" + }, + { + "name" : "HELPSTRING", + "value" : "Flags used by the linker during the creation of modules during RELWITHDEBINFO builds." + } + ], + "type" : "STRING", + "value" : "" + }, + { + "name" : "CMAKE_NM", + "properties" : + [ + { + "name" : "ADVANCED", + "value" : "1" + }, + { + "name" : "HELPSTRING", + "value" : "Path to a program." + } + ], + "type" : "FILEPATH", + "value" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/bin/llvm-nm" + }, + { + "name" : "CMAKE_NUMBER_OF_MAKEFILES", + "properties" : + [ + { + "name" : "HELPSTRING", + "value" : "number of local generators" + } + ], + "type" : "INTERNAL", + "value" : "1" + }, + { + "name" : "CMAKE_OBJCOPY", + "properties" : + [ + { + "name" : "ADVANCED", + "value" : "1" + }, + { + "name" : "HELPSTRING", + "value" : "Path to a program." + } + ], + "type" : "FILEPATH", + "value" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/bin/llvm-objcopy" + }, + { + "name" : "CMAKE_OBJDUMP", + "properties" : + [ + { + "name" : "ADVANCED", + "value" : "1" + }, + { + "name" : "HELPSTRING", + "value" : "Path to a program." + } + ], + "type" : "FILEPATH", + "value" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/bin/llvm-objdump" + }, + { + "name" : "CMAKE_PLATFORM_INFO_INITIALIZED", + "properties" : + [ + { + "name" : "HELPSTRING", + "value" : "Platform information initialized" + } + ], + "type" : "INTERNAL", + "value" : "1" + }, + { + "name" : "CMAKE_PROJECT_DESCRIPTION", + "properties" : + [ + { + "name" : "HELPSTRING", + "value" : "Value Computed by CMake" + } + ], + "type" : "STATIC", + "value" : "" + }, + { + "name" : "CMAKE_PROJECT_HOMEPAGE_URL", + "properties" : + [ + { + "name" : "HELPSTRING", + "value" : "Value Computed by CMake" + } + ], + "type" : "STATIC", + "value" : "" + }, + { + "name" : "CMAKE_PROJECT_NAME", + "properties" : + [ + { + "name" : "HELPSTRING", + "value" : "Value Computed by CMake" + } + ], + "type" : "STATIC", + "value" : "intaleq_driver" + }, + { + "name" : "CMAKE_RANLIB", + "properties" : + [ + { + "name" : "ADVANCED", + "value" : "1" + }, + { + "name" : "HELPSTRING", + "value" : "Ranlib" + } + ], + "type" : "FILEPATH", + "value" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/bin/llvm-ranlib" + }, + { + "name" : "CMAKE_READELF", + "properties" : + [ + { + "name" : "ADVANCED", + "value" : "1" + }, + { + "name" : "HELPSTRING", + "value" : "Path to a program." + } + ], + "type" : "FILEPATH", + "value" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/bin/llvm-readelf" + }, + { + "name" : "CMAKE_ROOT", + "properties" : + [ + { + "name" : "HELPSTRING", + "value" : "Path to CMake installation." + } + ], + "type" : "INTERNAL", + "value" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31" + }, + { + "name" : "CMAKE_RUNTIME_OUTPUT_DIRECTORY", + "properties" : + [ + { + "name" : "HELPSTRING", + "value" : "No help, variable specified on the command line." + } + ], + "type" : "UNINITIALIZED", + "value" : "/Users/hamzaaleghwairyeen/development/App/intaleq_driver/build/app/intermediates/cxx/Debug/2j1f5m6a/obj/x86" + }, + { + "name" : "CMAKE_SHARED_LINKER_FLAGS", + "properties" : + [ + { + "name" : "ADVANCED", + "value" : "1" + }, + { + "name" : "HELPSTRING", + "value" : "Flags used by the linker during the creation of dll's." + } + ], + "type" : "STRING", + "value" : "" + }, + { + "name" : "CMAKE_SHARED_LINKER_FLAGS_DEBUG", + "properties" : + [ + { + "name" : "ADVANCED", + "value" : "1" + }, + { + "name" : "HELPSTRING", + "value" : "Flags used by the linker during the creation of shared libraries during DEBUG builds." + } + ], + "type" : "STRING", + "value" : "" + }, + { + "name" : "CMAKE_SHARED_LINKER_FLAGS_MINSIZEREL", + "properties" : + [ + { + "name" : "ADVANCED", + "value" : "1" + }, + { + "name" : "HELPSTRING", + "value" : "Flags used by the linker during the creation of shared libraries during MINSIZEREL builds." + } + ], + "type" : "STRING", + "value" : "" + }, + { + "name" : "CMAKE_SHARED_LINKER_FLAGS_RELEASE", + "properties" : + [ + { + "name" : "ADVANCED", + "value" : "1" + }, + { + "name" : "HELPSTRING", + "value" : "Flags used by the linker during the creation of shared libraries during RELEASE builds." + } + ], + "type" : "STRING", + "value" : "" + }, + { + "name" : "CMAKE_SHARED_LINKER_FLAGS_RELWITHDEBINFO", + "properties" : + [ + { + "name" : "ADVANCED", + "value" : "1" + }, + { + "name" : "HELPSTRING", + "value" : "Flags used by the linker during the creation of shared libraries during RELWITHDEBINFO builds." + } + ], + "type" : "STRING", + "value" : "" + }, + { + "name" : "CMAKE_SKIP_INSTALL_RPATH", + "properties" : + [ + { + "name" : "ADVANCED", + "value" : "1" + }, + { + "name" : "HELPSTRING", + "value" : "If set, runtime paths are not added when installing shared libraries, but are added when building." + } + ], + "type" : "BOOL", + "value" : "NO" + }, + { + "name" : "CMAKE_SKIP_RPATH", + "properties" : + [ + { + "name" : "ADVANCED", + "value" : "1" + }, + { + "name" : "HELPSTRING", + "value" : "If set, runtime paths are not added when using shared libraries." + } + ], + "type" : "BOOL", + "value" : "NO" + }, + { + "name" : "CMAKE_STATIC_LINKER_FLAGS", + "properties" : + [ + { + "name" : "ADVANCED", + "value" : "1" + }, + { + "name" : "HELPSTRING", + "value" : "Flags used by the linker during the creation of static libraries during all build types." + } + ], + "type" : "STRING", + "value" : "" + }, + { + "name" : "CMAKE_STATIC_LINKER_FLAGS_DEBUG", + "properties" : + [ + { + "name" : "ADVANCED", + "value" : "1" + }, + { + "name" : "HELPSTRING", + "value" : "Flags used by the linker during the creation of static libraries during DEBUG builds." + } + ], + "type" : "STRING", + "value" : "" + }, + { + "name" : "CMAKE_STATIC_LINKER_FLAGS_MINSIZEREL", + "properties" : + [ + { + "name" : "ADVANCED", + "value" : "1" + }, + { + "name" : "HELPSTRING", + "value" : "Flags used by the linker during the creation of static libraries during MINSIZEREL builds." + } + ], + "type" : "STRING", + "value" : "" + }, + { + "name" : "CMAKE_STATIC_LINKER_FLAGS_RELEASE", + "properties" : + [ + { + "name" : "ADVANCED", + "value" : "1" + }, + { + "name" : "HELPSTRING", + "value" : "Flags used by the linker during the creation of static libraries during RELEASE builds." + } + ], + "type" : "STRING", + "value" : "" + }, + { + "name" : "CMAKE_STATIC_LINKER_FLAGS_RELWITHDEBINFO", + "properties" : + [ + { + "name" : "ADVANCED", + "value" : "1" + }, + { + "name" : "HELPSTRING", + "value" : "Flags used by the linker during the creation of static libraries during RELWITHDEBINFO builds." + } + ], + "type" : "STRING", + "value" : "" + }, + { + "name" : "CMAKE_STRIP", + "properties" : + [ + { + "name" : "ADVANCED", + "value" : "1" + }, + { + "name" : "HELPSTRING", + "value" : "Strip" + } + ], + "type" : "FILEPATH", + "value" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/bin/llvm-strip" + }, + { + "name" : "CMAKE_SYSTEM_NAME", + "properties" : + [ + { + "name" : "HELPSTRING", + "value" : "No help, variable specified on the command line." + } + ], + "type" : "UNINITIALIZED", + "value" : "Android" + }, + { + "name" : "CMAKE_SYSTEM_VERSION", + "properties" : + [ + { + "name" : "HELPSTRING", + "value" : "No help, variable specified on the command line." + } + ], + "type" : "UNINITIALIZED", + "value" : "23" + }, + { + "name" : "CMAKE_TAPI", + "properties" : + [ + { + "name" : "ADVANCED", + "value" : "1" + }, + { + "name" : "HELPSTRING", + "value" : "Path to a program." + } + ], + "type" : "FILEPATH", + "value" : "CMAKE_TAPI-NOTFOUND" + }, + { + "name" : "CMAKE_TOOLCHAIN_FILE", + "properties" : + [ + { + "name" : "HELPSTRING", + "value" : "The CMake toolchain file" + } + ], + "type" : "FILEPATH", + "value" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/build/cmake/android.toolchain.cmake" + }, + { + "name" : "CMAKE_UNAME", + "properties" : + [ + { + "name" : "HELPSTRING", + "value" : "uname command" + } + ], + "type" : "INTERNAL", + "value" : "/usr/bin/uname" + }, + { + "name" : "CMAKE_VERBOSE_MAKEFILE", + "properties" : + [ + { + "name" : "ADVANCED", + "value" : "1" + }, + { + "name" : "HELPSTRING", + "value" : "If this value is on, makefiles will be generated without the .SILENT directive, and all commands will be echoed to the console during the make. This is useful for debugging only. With Visual Studio IDE projects all commands are done without /nologo." + } + ], + "type" : "BOOL", + "value" : "FALSE" + }, + { + "name" : "_CMAKE_CXX_LINKER_PUSHPOP_STATE_SUPPORTED", + "properties" : + [ + { + "name" : "HELPSTRING", + "value" : "linker supports push/pop state" + } + ], + "type" : "INTERNAL", + "value" : "TRUE" + }, + { + "name" : "_CMAKE_C_LINKER_PUSHPOP_STATE_SUPPORTED", + "properties" : + [ + { + "name" : "HELPSTRING", + "value" : "linker supports push/pop state" + } + ], + "type" : "INTERNAL", + "value" : "TRUE" + }, + { + "name" : "_CMAKE_LINKER_PUSHPOP_STATE_SUPPORTED", + "properties" : + [ + { + "name" : "HELPSTRING", + "value" : "linker supports push/pop state" + } + ], + "type" : "INTERNAL", + "value" : "TRUE" + }, + { + "name" : "intaleq_driver_BINARY_DIR", + "properties" : + [ + { + "name" : "HELPSTRING", + "value" : "Value Computed by CMake" + } + ], + "type" : "STATIC", + "value" : "/Users/hamzaaleghwairyeen/development/App/intaleq_driver/android/app/.cxx/Debug/2j1f5m6a/x86" + }, + { + "name" : "intaleq_driver_IS_TOP_LEVEL", + "properties" : + [ + { + "name" : "HELPSTRING", + "value" : "Value Computed by CMake" + } + ], + "type" : "STATIC", + "value" : "ON" + }, + { + "name" : "intaleq_driver_SOURCE_DIR", + "properties" : + [ + { + "name" : "HELPSTRING", + "value" : "Value Computed by CMake" + } + ], + "type" : "STATIC", + "value" : "/Users/hamzaaleghwairyeen/development/App/intaleq_driver/android/app/src/main/cpp" + }, + { + "name" : "log-lib", + "properties" : + [ + { + "name" : "HELPSTRING", + "value" : "Path to a library." + } + ], + "type" : "FILEPATH", + "value" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/lib/i686-linux-android/23/liblog.so" + }, + { + "name" : "native-lib_LIB_DEPENDS", + "properties" : + [ + { + "name" : "HELPSTRING", + "value" : "Dependencies for the target" + } + ], + "type" : "STATIC", + "value" : "general;/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/lib/i686-linux-android/23/liblog.so;" + } + ], + "kind" : "cache", + "version" : + { + "major" : 2, + "minor" : 0 + } +} diff --git a/siro_driver/android/app/.cxx/Debug/2j1f5m6a/x86/.cmake/api/v1/reply/cmakeFiles-v1-c684d75b7cc460903c07.json b/siro_driver/android/app/.cxx/Debug/2j1f5m6a/x86/.cmake/api/v1/reply/cmakeFiles-v1-c684d75b7cc460903c07.json new file mode 100644 index 0000000..e554919 --- /dev/null +++ b/siro_driver/android/app/.cxx/Debug/2j1f5m6a/x86/.cmake/api/v1/reply/cmakeFiles-v1-c684d75b7cc460903c07.json @@ -0,0 +1,968 @@ +{ + "inputs" : + [ + { + "path" : "CMakeLists.txt" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeDetermineSystem.cmake" + }, + { + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/build/cmake/android.toolchain.cmake" + }, + { + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/build/cmake/android-legacy.toolchain.cmake" + }, + { + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/build/cmake/abis.cmake" + }, + { + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/build/cmake/platforms.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Platform/Android-Determine.cmake" + }, + { + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/build/cmake/hooks/pre/Android-Determine.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeSystem.cmake.in" + }, + { + "isGenerated" : true, + "path" : "/Users/hamzaaleghwairyeen/development/App/intaleq_driver/android/app/.cxx/Debug/2j1f5m6a/x86/CMakeFiles/3.31.5-g6cf5163/CMakeSystem.cmake" + }, + { + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/build/cmake/android.toolchain.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeSystemSpecificInitialize.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Platform/Android-Initialize.cmake" + }, + { + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/build/cmake/hooks/pre/Android-Initialize.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Platform/Linux-Initialize.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeDetermineCCompiler.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeDetermineCompiler.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Platform/Android-Determine-C.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Platform/Android/Determine-Compiler.cmake" + }, + { + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/build/cmake/hooks/pre/Determine-Compiler.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeDetermineCompilerId.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeCompilerIdDetection.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/ADSP-DetermineCompiler.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/ARMCC-DetermineCompiler.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/ARMClang-DetermineCompiler.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/AppleClang-DetermineCompiler.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/Clang-DetermineCompilerInternal.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/Borland-DetermineCompiler.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/Bruce-C-DetermineCompiler.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/Clang-DetermineCompiler.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/Clang-DetermineCompilerInternal.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/Compaq-C-DetermineCompiler.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/Cray-DetermineCompiler.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/CrayClang-DetermineCompiler.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/Embarcadero-DetermineCompiler.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/Fujitsu-DetermineCompiler.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/FujitsuClang-DetermineCompiler.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/GHS-DetermineCompiler.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/GNU-C-DetermineCompiler.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/HP-C-DetermineCompiler.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/IAR-DetermineCompiler.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/IBMClang-C-DetermineCompiler.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/Intel-DetermineCompiler.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/IntelLLVM-DetermineCompiler.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/LCC-C-DetermineCompiler.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/MSVC-DetermineCompiler.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/NVHPC-DetermineCompiler.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/NVIDIA-DetermineCompiler.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/OpenWatcom-DetermineCompiler.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/OrangeC-DetermineCompiler.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/PGI-DetermineCompiler.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/PathScale-DetermineCompiler.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/SCO-DetermineCompiler.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/SDCC-C-DetermineCompiler.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/SunPro-C-DetermineCompiler.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/TI-DetermineCompiler.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/TIClang-DetermineCompiler.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/Tasking-DetermineCompiler.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/TinyCC-C-DetermineCompiler.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/VisualAge-C-DetermineCompiler.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/IBMCPP-C-DetermineVersionInternal.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/Watcom-DetermineCompiler.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/XL-C-DetermineCompiler.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/IBMCPP-C-DetermineVersionInternal.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/XLClang-C-DetermineCompiler.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/zOS-C-DetermineCompiler.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/IBMCPP-C-DetermineVersionInternal.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeFindBinUtils.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/Clang-FindBinUtils.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeCCompiler.cmake.in" + }, + { + "isGenerated" : true, + "path" : "/Users/hamzaaleghwairyeen/development/App/intaleq_driver/android/app/.cxx/Debug/2j1f5m6a/x86/CMakeFiles/3.31.5-g6cf5163/CMakeCCompiler.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeDetermineCXXCompiler.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeDetermineCompiler.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Platform/Android-Determine-CXX.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Platform/Android/Determine-Compiler.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeDetermineCompilerId.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeCompilerIdDetection.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/ADSP-DetermineCompiler.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/ARMCC-DetermineCompiler.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/ARMClang-DetermineCompiler.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/AppleClang-DetermineCompiler.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/Clang-DetermineCompilerInternal.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/Borland-DetermineCompiler.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/Clang-DetermineCompiler.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/Clang-DetermineCompilerInternal.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/Compaq-CXX-DetermineCompiler.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/Cray-DetermineCompiler.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/CrayClang-DetermineCompiler.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/Embarcadero-DetermineCompiler.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/Fujitsu-DetermineCompiler.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/FujitsuClang-DetermineCompiler.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/GHS-DetermineCompiler.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/GNU-CXX-DetermineCompiler.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/HP-CXX-DetermineCompiler.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/IAR-DetermineCompiler.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/IBMClang-CXX-DetermineCompiler.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/Intel-DetermineCompiler.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/IntelLLVM-DetermineCompiler.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/LCC-CXX-DetermineCompiler.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/MSVC-DetermineCompiler.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/NVHPC-DetermineCompiler.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/NVIDIA-DetermineCompiler.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/OpenWatcom-DetermineCompiler.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/OrangeC-DetermineCompiler.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/PGI-DetermineCompiler.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/PathScale-DetermineCompiler.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/SCO-DetermineCompiler.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/SunPro-CXX-DetermineCompiler.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/TI-DetermineCompiler.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/TIClang-DetermineCompiler.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/Tasking-DetermineCompiler.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/VisualAge-CXX-DetermineCompiler.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/IBMCPP-CXX-DetermineVersionInternal.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/Watcom-DetermineCompiler.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/XL-CXX-DetermineCompiler.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/IBMCPP-CXX-DetermineVersionInternal.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/XLClang-CXX-DetermineCompiler.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/zOS-CXX-DetermineCompiler.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/IBMCPP-CXX-DetermineVersionInternal.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeFindBinUtils.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/Clang-FindBinUtils.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeCXXCompiler.cmake.in" + }, + { + "isGenerated" : true, + "path" : "/Users/hamzaaleghwairyeen/development/App/intaleq_driver/android/app/.cxx/Debug/2j1f5m6a/x86/CMakeFiles/3.31.5-g6cf5163/CMakeCXXCompiler.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeSystemSpecificInformation.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeGenericSystem.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeInitializeConfigs.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Platform/Android.cmake" + }, + { + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/build/cmake/hooks/pre/Android.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Platform/Linux.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Platform/UnixPaths.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeCInformation.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeLanguageInformation.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/Clang-C.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/Clang.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/CMakeCommonCompilerMacros.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/GNU.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/CMakeCommonCompilerMacros.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Platform/Android-Clang-C.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Platform/Android-Clang.cmake" + }, + { + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/build/cmake/hooks/pre/Android-Clang.cmake" + }, + { + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/build/cmake/flags.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeCommonLanguageInclude.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeTestCCompiler.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeTestCompilerCommon.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeDetermineCompilerABI.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Internal/CMakeDetermineLinkerId.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeParseImplicitIncludeInfo.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeParseImplicitLinkInfo.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeParseLibraryArchitecture.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeTestCompilerCommon.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeCCompilerABI.c" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeDetermineCompilerSupport.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Internal/FeatureTesting.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeCCompiler.cmake.in" + }, + { + "isGenerated" : true, + "path" : "/Users/hamzaaleghwairyeen/development/App/intaleq_driver/android/app/.cxx/Debug/2j1f5m6a/x86/CMakeFiles/3.31.5-g6cf5163/CMakeCCompiler.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Internal/CMakeCLinkerInformation.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Internal/CMakeCommonLinkerInformation.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Linker/LLD-C.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Linker/LLD.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Linker/GNU.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Platform/Linker/Android-LLD-C.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Platform/Linker/Linux-LLD-C.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Platform/Linker/Linux-LLD.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Platform/Linker/Linux-GNU.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Platform/Linker/GNU.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeCXXInformation.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeLanguageInformation.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/Clang-CXX.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/Clang.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Platform/Android-Clang-CXX.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Platform/Android-Clang.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeCommonLanguageInclude.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeTestCXXCompiler.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeTestCompilerCommon.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeDetermineCompilerABI.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Internal/CMakeDetermineLinkerId.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeParseImplicitIncludeInfo.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeParseImplicitLinkInfo.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeParseLibraryArchitecture.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeTestCompilerCommon.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeCXXCompilerABI.cpp" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeDetermineCompilerSupport.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Internal/FeatureTesting.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/Clang-CXX-CXXImportStd.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/Clang-CXX-CXXImportStd.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeCXXCompiler.cmake.in" + }, + { + "isGenerated" : true, + "path" : "/Users/hamzaaleghwairyeen/development/App/intaleq_driver/android/app/.cxx/Debug/2j1f5m6a/x86/CMakeFiles/3.31.5-g6cf5163/CMakeCXXCompiler.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Internal/CMakeCXXLinkerInformation.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Internal/CMakeCommonLinkerInformation.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Linker/LLD-CXX.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Linker/LLD.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Platform/Linker/Android-LLD-CXX.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Platform/Linker/Linux-LLD-CXX.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Platform/Linker/Linux-LLD.cmake" + } + ], + "kind" : "cmakeFiles", + "paths" : + { + "build" : "/Users/hamzaaleghwairyeen/development/App/intaleq_driver/android/app/.cxx/Debug/2j1f5m6a/x86", + "source" : "/Users/hamzaaleghwairyeen/development/App/intaleq_driver/android/app/src/main/cpp" + }, + "version" : + { + "major" : 1, + "minor" : 1 + } +} diff --git a/siro_driver/android/app/.cxx/Debug/2j1f5m6a/x86/.cmake/api/v1/reply/codemodel-v2-7cd6c1da16c8c6ab93ff.json b/siro_driver/android/app/.cxx/Debug/2j1f5m6a/x86/.cmake/api/v1/reply/codemodel-v2-7cd6c1da16c8c6ab93ff.json new file mode 100644 index 0000000..9e9081f --- /dev/null +++ b/siro_driver/android/app/.cxx/Debug/2j1f5m6a/x86/.cmake/api/v1/reply/codemodel-v2-7cd6c1da16c8c6ab93ff.json @@ -0,0 +1,60 @@ +{ + "configurations" : + [ + { + "directories" : + [ + { + "build" : ".", + "jsonFile" : "directory-.-Debug-f5ebdc15457944623624.json", + "minimumCMakeVersion" : + { + "string" : "3.6.0" + }, + "projectIndex" : 0, + "source" : ".", + "targetIndexes" : + [ + 0 + ] + } + ], + "name" : "Debug", + "projects" : + [ + { + "directoryIndexes" : + [ + 0 + ], + "name" : "intaleq_driver", + "targetIndexes" : + [ + 0 + ] + } + ], + "targets" : + [ + { + "directoryIndex" : 0, + "id" : "native-lib::@6890427a1f51a3e7e1df", + "jsonFile" : "target-native-lib-Debug-dd8e94c6a37ef0d8683a.json", + "name" : "native-lib", + "projectIndex" : 0 + } + ] + } + ], + "kind" : "codemodel", + "paths" : + { + "build" : "/Users/hamzaaleghwairyeen/development/App/intaleq_driver/android/app/.cxx/Debug/2j1f5m6a/x86", + "source" : "/Users/hamzaaleghwairyeen/development/App/intaleq_driver/android/app/src/main/cpp" + }, + "version" : + { + "major" : 2, + "minor" : 7 + } +} diff --git a/siro_driver/android/app/.cxx/Debug/2j1f5m6a/x86/.cmake/api/v1/reply/directory-.-Debug-f5ebdc15457944623624.json b/siro_driver/android/app/.cxx/Debug/2j1f5m6a/x86/.cmake/api/v1/reply/directory-.-Debug-f5ebdc15457944623624.json new file mode 100644 index 0000000..3a67af9 --- /dev/null +++ b/siro_driver/android/app/.cxx/Debug/2j1f5m6a/x86/.cmake/api/v1/reply/directory-.-Debug-f5ebdc15457944623624.json @@ -0,0 +1,14 @@ +{ + "backtraceGraph" : + { + "commands" : [], + "files" : [], + "nodes" : [] + }, + "installers" : [], + "paths" : + { + "build" : ".", + "source" : "." + } +} diff --git a/siro_driver/android/app/.cxx/Debug/2j1f5m6a/x86/.cmake/api/v1/reply/index-2025-07-17T21-58-00-0015.json b/siro_driver/android/app/.cxx/Debug/2j1f5m6a/x86/.cmake/api/v1/reply/index-2025-07-17T21-58-00-0015.json new file mode 100644 index 0000000..3ef0a6c --- /dev/null +++ b/siro_driver/android/app/.cxx/Debug/2j1f5m6a/x86/.cmake/api/v1/reply/index-2025-07-17T21-58-00-0015.json @@ -0,0 +1,92 @@ +{ + "cmake" : + { + "generator" : + { + "multiConfig" : false, + "name" : "Ninja" + }, + "paths" : + { + "cmake" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/bin/cmake", + "cpack" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/bin/cpack", + "ctest" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/bin/ctest", + "root" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31" + }, + "version" : + { + "isDirty" : false, + "major" : 3, + "minor" : 31, + "patch" : 5, + "string" : "3.31.5-g6cf5163", + "suffix" : "g6cf5163" + } + }, + "objects" : + [ + { + "jsonFile" : "codemodel-v2-7cd6c1da16c8c6ab93ff.json", + "kind" : "codemodel", + "version" : + { + "major" : 2, + "minor" : 7 + } + }, + { + "jsonFile" : "cache-v2-0def829273509cde3a7e.json", + "kind" : "cache", + "version" : + { + "major" : 2, + "minor" : 0 + } + }, + { + "jsonFile" : "cmakeFiles-v1-c684d75b7cc460903c07.json", + "kind" : "cmakeFiles", + "version" : + { + "major" : 1, + "minor" : 1 + } + } + ], + "reply" : + { + "client-agp" : + { + "cache-v2" : + { + "jsonFile" : "cache-v2-0def829273509cde3a7e.json", + "kind" : "cache", + "version" : + { + "major" : 2, + "minor" : 0 + } + }, + "cmakeFiles-v1" : + { + "jsonFile" : "cmakeFiles-v1-c684d75b7cc460903c07.json", + "kind" : "cmakeFiles", + "version" : + { + "major" : 1, + "minor" : 1 + } + }, + "codemodel-v2" : + { + "jsonFile" : "codemodel-v2-7cd6c1da16c8c6ab93ff.json", + "kind" : "codemodel", + "version" : + { + "major" : 2, + "minor" : 7 + } + } + } + } +} diff --git a/siro_driver/android/app/.cxx/Debug/2j1f5m6a/x86/.cmake/api/v1/reply/target-native-lib-Debug-dd8e94c6a37ef0d8683a.json b/siro_driver/android/app/.cxx/Debug/2j1f5m6a/x86/.cmake/api/v1/reply/target-native-lib-Debug-dd8e94c6a37ef0d8683a.json new file mode 100644 index 0000000..d886432 --- /dev/null +++ b/siro_driver/android/app/.cxx/Debug/2j1f5m6a/x86/.cmake/api/v1/reply/target-native-lib-Debug-dd8e94c6a37ef0d8683a.json @@ -0,0 +1,117 @@ +{ + "artifacts" : + [ + { + "path" : "/Users/hamzaaleghwairyeen/development/App/intaleq_driver/build/app/intermediates/cxx/Debug/2j1f5m6a/obj/x86/libnative-lib.so" + } + ], + "backtrace" : 1, + "backtraceGraph" : + { + "commands" : + [ + "add_library", + "target_link_libraries" + ], + "files" : + [ + "CMakeLists.txt" + ], + "nodes" : + [ + { + "file" : 0 + }, + { + "command" : 0, + "file" : 0, + "line" : 5, + "parent" : 0 + }, + { + "command" : 1, + "file" : 0, + "line" : 11, + "parent" : 0 + } + ] + }, + "compileGroups" : + [ + { + "compileCommandFragments" : + [ + { + "fragment" : "-g -DANDROID -fdata-sections -ffunction-sections -funwind-tables -fstack-protector-strong -no-canonical-prefixes -mstackrealign -D_FORTIFY_SOURCE=2 -Wformat -Werror=format-security -fno-limit-debug-info -fPIC" + } + ], + "defines" : + [ + { + "define" : "native_lib_EXPORTS" + } + ], + "language" : "CXX", + "sourceIndexes" : + [ + 0 + ], + "sysroot" : + { + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot" + } + } + ], + "id" : "native-lib::@6890427a1f51a3e7e1df", + "link" : + { + "commandFragments" : + [ + { + "fragment" : "-static-libstdc++ -Wl,--build-id=sha1 -Wl,--no-rosegment -Wl,--no-undefined-version -Wl,--fatal-warnings -Wl,--no-undefined -Qunused-arguments", + "role" : "flags" + }, + { + "backtrace" : 2, + "fragment" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/lib/i686-linux-android/23/liblog.so", + "role" : "libraries" + }, + { + "fragment" : "-latomic -lm", + "role" : "libraries" + } + ], + "language" : "CXX", + "sysroot" : + { + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot" + } + }, + "name" : "native-lib", + "nameOnDisk" : "libnative-lib.so", + "paths" : + { + "build" : ".", + "source" : "." + }, + "sourceGroups" : + [ + { + "name" : "Source Files", + "sourceIndexes" : + [ + 0 + ] + } + ], + "sources" : + [ + { + "backtrace" : 1, + "compileGroupIndex" : 0, + "path" : "native-lib.cpp", + "sourceGroupIndex" : 0 + } + ], + "type" : "SHARED_LIBRARY" +} diff --git a/siro_driver/android/app/.cxx/Debug/2j1f5m6a/x86/.ninja_deps b/siro_driver/android/app/.cxx/Debug/2j1f5m6a/x86/.ninja_deps new file mode 100644 index 0000000..94f892f Binary files /dev/null and b/siro_driver/android/app/.cxx/Debug/2j1f5m6a/x86/.ninja_deps differ diff --git a/siro_driver/android/app/.cxx/Debug/2j1f5m6a/x86/.ninja_log b/siro_driver/android/app/.cxx/Debug/2j1f5m6a/x86/.ninja_log new file mode 100644 index 0000000..261aa5e --- /dev/null +++ b/siro_driver/android/app/.cxx/Debug/2j1f5m6a/x86/.ninja_log @@ -0,0 +1,3 @@ +# ninja log v5 +0 1408 1752789481557342243 CMakeFiles/native-lib.dir/native-lib.cpp.o b21ff4109f376dc1 +1410 1474 1752789481623374603 /Users/hamzaaleghwairyeen/development/App/intaleq_driver/build/app/intermediates/cxx/Debug/2j1f5m6a/obj/x86/libnative-lib.so e06ca0c5ac3ab83 diff --git a/siro_driver/android/app/.cxx/Debug/2j1f5m6a/x86/CMakeCache.txt b/siro_driver/android/app/.cxx/Debug/2j1f5m6a/x86/CMakeCache.txt new file mode 100644 index 0000000..b8b1595 --- /dev/null +++ b/siro_driver/android/app/.cxx/Debug/2j1f5m6a/x86/CMakeCache.txt @@ -0,0 +1,430 @@ +# This is the CMakeCache file. +# For build in directory: /Users/hamzaaleghwairyeen/development/App/intaleq_driver/android/app/.cxx/Debug/2j1f5m6a/x86 +# It was generated by CMake: /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/bin/cmake +# You can edit this file to change values found and used by cmake. +# If you do not want to change any of the values, simply exit the editor. +# If you do want to change a value, simply edit, save, and exit the editor. +# The syntax for the file is as follows: +# KEY:TYPE=VALUE +# KEY is the name of a variable in the cache. +# TYPE is a hint to GUIs for the type of VALUE, DO NOT EDIT TYPE!. +# VALUE is the current value for the KEY. + +######################## +# EXTERNAL cache entries +######################## + +//No help, variable specified on the command line. +ANDROID_ABI:UNINITIALIZED=x86 + +//No help, variable specified on the command line. +ANDROID_NDK:UNINITIALIZED=/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973 + +//No help, variable specified on the command line. +ANDROID_PLATFORM:UNINITIALIZED=android-23 + +//Path to a program. +CMAKE_ADDR2LINE:FILEPATH=/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/bin/llvm-addr2line + +//No help, variable specified on the command line. +CMAKE_ANDROID_ARCH_ABI:UNINITIALIZED=x86 + +//No help, variable specified on the command line. +CMAKE_ANDROID_NDK:UNINITIALIZED=/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973 + +//Archiver +CMAKE_AR:FILEPATH=/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/bin/llvm-ar + +//Flags used by the compiler during all build types. +CMAKE_ASM_FLAGS:STRING= + +//Flags used by the compiler during debug builds. +CMAKE_ASM_FLAGS_DEBUG:STRING= + +//Flags used by the compiler during release builds. +CMAKE_ASM_FLAGS_RELEASE:STRING= + +//Choose the type of build, options are: None Debug Release RelWithDebInfo +// MinSizeRel ... +CMAKE_BUILD_TYPE:STRING=Debug + +//LLVM archiver +CMAKE_CXX_COMPILER_AR:FILEPATH=/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/bin/llvm-ar + +//`clang-scan-deps` dependency scanner +CMAKE_CXX_COMPILER_CLANG_SCAN_DEPS:FILEPATH=/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/bin/clang-scan-deps + +//Generate index for LLVM archive +CMAKE_CXX_COMPILER_RANLIB:FILEPATH=/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/bin/llvm-ranlib + +//Flags used by the compiler during all build types. +CMAKE_CXX_FLAGS:STRING= + +//Flags used by the compiler during debug builds. +CMAKE_CXX_FLAGS_DEBUG:STRING= + +//Flags used by the CXX compiler during MINSIZEREL builds. +CMAKE_CXX_FLAGS_MINSIZEREL:STRING=-Os -DNDEBUG + +//Flags used by the compiler during release builds. +CMAKE_CXX_FLAGS_RELEASE:STRING= + +//Flags used by the CXX compiler during RELWITHDEBINFO builds. +CMAKE_CXX_FLAGS_RELWITHDEBINFO:STRING=-O2 -g -DNDEBUG + +//Libraries linked by default with all C++ applications. +CMAKE_CXX_STANDARD_LIBRARIES:STRING=-latomic -lm + +//LLVM archiver +CMAKE_C_COMPILER_AR:FILEPATH=/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/bin/llvm-ar + +//`clang-scan-deps` dependency scanner +CMAKE_C_COMPILER_CLANG_SCAN_DEPS:FILEPATH=/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/bin/clang-scan-deps + +//Generate index for LLVM archive +CMAKE_C_COMPILER_RANLIB:FILEPATH=/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/bin/llvm-ranlib + +//Flags used by the compiler during all build types. +CMAKE_C_FLAGS:STRING= + +//Flags used by the compiler during debug builds. +CMAKE_C_FLAGS_DEBUG:STRING= + +//Flags used by the C compiler during MINSIZEREL builds. +CMAKE_C_FLAGS_MINSIZEREL:STRING=-Os -DNDEBUG + +//Flags used by the compiler during release builds. +CMAKE_C_FLAGS_RELEASE:STRING= + +//Flags used by the C compiler during RELWITHDEBINFO builds. +CMAKE_C_FLAGS_RELWITHDEBINFO:STRING=-O2 -g -DNDEBUG + +//Libraries linked by default with all C applications. +CMAKE_C_STANDARD_LIBRARIES:STRING=-latomic -lm + +//Path to a program. +CMAKE_DLLTOOL:FILEPATH=/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/bin/llvm-dlltool + +//Flags used by the linker. +CMAKE_EXE_LINKER_FLAGS:STRING= + +//Flags used by the linker during DEBUG builds. +CMAKE_EXE_LINKER_FLAGS_DEBUG:STRING= + +//Flags used by the linker during MINSIZEREL builds. +CMAKE_EXE_LINKER_FLAGS_MINSIZEREL:STRING= + +//Flags used by the linker during RELEASE builds. +CMAKE_EXE_LINKER_FLAGS_RELEASE:STRING= + +//Flags used by the linker during RELWITHDEBINFO builds. +CMAKE_EXE_LINKER_FLAGS_RELWITHDEBINFO:STRING= + +//Enable/Disable output of build database during the build. +CMAKE_EXPORT_BUILD_DATABASE:BOOL= + +//No help, variable specified on the command line. +CMAKE_EXPORT_COMPILE_COMMANDS:UNINITIALIZED=ON + +//Value Computed by CMake. +CMAKE_FIND_PACKAGE_REDIRECTS_DIR:STATIC=/Users/hamzaaleghwairyeen/development/App/intaleq_driver/android/app/.cxx/Debug/2j1f5m6a/x86/CMakeFiles/pkgRedirects + +//Install path prefix, prepended onto install directories. +CMAKE_INSTALL_PREFIX:PATH=/usr/local + +//No help, variable specified on the command line. +CMAKE_LIBRARY_OUTPUT_DIRECTORY:UNINITIALIZED=/Users/hamzaaleghwairyeen/development/App/intaleq_driver/build/app/intermediates/cxx/Debug/2j1f5m6a/obj/x86 + +//Path to a program. +CMAKE_LINKER:FILEPATH=/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/bin/ld.lld + +//No help, variable specified on the command line. +CMAKE_MAKE_PROGRAM:UNINITIALIZED=/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/bin/ninja + +//Flags used by the linker during the creation of modules. +CMAKE_MODULE_LINKER_FLAGS:STRING= + +//Flags used by the linker during the creation of modules during +// DEBUG builds. +CMAKE_MODULE_LINKER_FLAGS_DEBUG:STRING= + +//Flags used by the linker during the creation of modules during +// MINSIZEREL builds. +CMAKE_MODULE_LINKER_FLAGS_MINSIZEREL:STRING= + +//Flags used by the linker during the creation of modules during +// RELEASE builds. +CMAKE_MODULE_LINKER_FLAGS_RELEASE:STRING= + +//Flags used by the linker during the creation of modules during +// RELWITHDEBINFO builds. +CMAKE_MODULE_LINKER_FLAGS_RELWITHDEBINFO:STRING= + +//Path to a program. +CMAKE_NM:FILEPATH=/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/bin/llvm-nm + +//Path to a program. +CMAKE_OBJCOPY:FILEPATH=/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/bin/llvm-objcopy + +//Path to a program. +CMAKE_OBJDUMP:FILEPATH=/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/bin/llvm-objdump + +//Value Computed by CMake +CMAKE_PROJECT_DESCRIPTION:STATIC= + +//Value Computed by CMake +CMAKE_PROJECT_HOMEPAGE_URL:STATIC= + +//Value Computed by CMake +CMAKE_PROJECT_NAME:STATIC=intaleq_driver + +//Ranlib +CMAKE_RANLIB:FILEPATH=/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/bin/llvm-ranlib + +//Path to a program. +CMAKE_READELF:FILEPATH=/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/bin/llvm-readelf + +//No help, variable specified on the command line. +CMAKE_RUNTIME_OUTPUT_DIRECTORY:UNINITIALIZED=/Users/hamzaaleghwairyeen/development/App/intaleq_driver/build/app/intermediates/cxx/Debug/2j1f5m6a/obj/x86 + +//Flags used by the linker during the creation of dll's. +CMAKE_SHARED_LINKER_FLAGS:STRING= + +//Flags used by the linker during the creation of shared libraries +// during DEBUG builds. +CMAKE_SHARED_LINKER_FLAGS_DEBUG:STRING= + +//Flags used by the linker during the creation of shared libraries +// during MINSIZEREL builds. +CMAKE_SHARED_LINKER_FLAGS_MINSIZEREL:STRING= + +//Flags used by the linker during the creation of shared libraries +// during RELEASE builds. +CMAKE_SHARED_LINKER_FLAGS_RELEASE:STRING= + +//Flags used by the linker during the creation of shared libraries +// during RELWITHDEBINFO builds. +CMAKE_SHARED_LINKER_FLAGS_RELWITHDEBINFO:STRING= + +//If set, runtime paths are not added when installing shared libraries, +// but are added when building. +CMAKE_SKIP_INSTALL_RPATH:BOOL=NO + +//If set, runtime paths are not added when using shared libraries. +CMAKE_SKIP_RPATH:BOOL=NO + +//Flags used by the linker during the creation of static libraries +// during all build types. +CMAKE_STATIC_LINKER_FLAGS:STRING= + +//Flags used by the linker during the creation of static libraries +// during DEBUG builds. +CMAKE_STATIC_LINKER_FLAGS_DEBUG:STRING= + +//Flags used by the linker during the creation of static libraries +// during MINSIZEREL builds. +CMAKE_STATIC_LINKER_FLAGS_MINSIZEREL:STRING= + +//Flags used by the linker during the creation of static libraries +// during RELEASE builds. +CMAKE_STATIC_LINKER_FLAGS_RELEASE:STRING= + +//Flags used by the linker during the creation of static libraries +// during RELWITHDEBINFO builds. +CMAKE_STATIC_LINKER_FLAGS_RELWITHDEBINFO:STRING= + +//Strip +CMAKE_STRIP:FILEPATH=/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/bin/llvm-strip + +//No help, variable specified on the command line. +CMAKE_SYSTEM_NAME:UNINITIALIZED=Android + +//No help, variable specified on the command line. +CMAKE_SYSTEM_VERSION:UNINITIALIZED=23 + +//Path to a program. +CMAKE_TAPI:FILEPATH=CMAKE_TAPI-NOTFOUND + +//The CMake toolchain file +CMAKE_TOOLCHAIN_FILE:FILEPATH=/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/build/cmake/android.toolchain.cmake + +//If this value is on, makefiles will be generated without the +// .SILENT directive, and all commands will be echoed to the console +// during the make. This is useful for debugging only. With Visual +// Studio IDE projects all commands are done without /nologo. +CMAKE_VERBOSE_MAKEFILE:BOOL=FALSE + +//Value Computed by CMake +intaleq_driver_BINARY_DIR:STATIC=/Users/hamzaaleghwairyeen/development/App/intaleq_driver/android/app/.cxx/Debug/2j1f5m6a/x86 + +//Value Computed by CMake +intaleq_driver_IS_TOP_LEVEL:STATIC=ON + +//Value Computed by CMake +intaleq_driver_SOURCE_DIR:STATIC=/Users/hamzaaleghwairyeen/development/App/intaleq_driver/android/app/src/main/cpp + +//Path to a library. +log-lib:FILEPATH=/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/lib/i686-linux-android/23/liblog.so + +//Dependencies for the target +native-lib_LIB_DEPENDS:STATIC=general;/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/lib/i686-linux-android/23/liblog.so; + + +######################## +# INTERNAL cache entries +######################## + +//ADVANCED property for variable: CMAKE_ADDR2LINE +CMAKE_ADDR2LINE-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_AR +CMAKE_AR-ADVANCED:INTERNAL=1 +//This is the directory where this CMakeCache.txt was created +CMAKE_CACHEFILE_DIR:INTERNAL=/Users/hamzaaleghwairyeen/development/App/intaleq_driver/android/app/.cxx/Debug/2j1f5m6a/x86 +//Major version of cmake used to create the current loaded cache +CMAKE_CACHE_MAJOR_VERSION:INTERNAL=3 +//Minor version of cmake used to create the current loaded cache +CMAKE_CACHE_MINOR_VERSION:INTERNAL=31 +//Patch version of cmake used to create the current loaded cache +CMAKE_CACHE_PATCH_VERSION:INTERNAL=5 +//Path to CMake executable. +CMAKE_COMMAND:INTERNAL=/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/bin/cmake +//Path to cpack program executable. +CMAKE_CPACK_COMMAND:INTERNAL=/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/bin/cpack +//Path to ctest program executable. +CMAKE_CTEST_COMMAND:INTERNAL=/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/bin/ctest +//ADVANCED property for variable: CMAKE_CXX_COMPILER_AR +CMAKE_CXX_COMPILER_AR-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_CXX_COMPILER_CLANG_SCAN_DEPS +CMAKE_CXX_COMPILER_CLANG_SCAN_DEPS-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_CXX_COMPILER_RANLIB +CMAKE_CXX_COMPILER_RANLIB-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_CXX_FLAGS +CMAKE_CXX_FLAGS-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_CXX_FLAGS_DEBUG +CMAKE_CXX_FLAGS_DEBUG-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_CXX_FLAGS_MINSIZEREL +CMAKE_CXX_FLAGS_MINSIZEREL-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_CXX_FLAGS_RELEASE +CMAKE_CXX_FLAGS_RELEASE-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_CXX_FLAGS_RELWITHDEBINFO +CMAKE_CXX_FLAGS_RELWITHDEBINFO-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_CXX_STANDARD_LIBRARIES +CMAKE_CXX_STANDARD_LIBRARIES-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_C_COMPILER_AR +CMAKE_C_COMPILER_AR-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_C_COMPILER_CLANG_SCAN_DEPS +CMAKE_C_COMPILER_CLANG_SCAN_DEPS-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_C_COMPILER_RANLIB +CMAKE_C_COMPILER_RANLIB-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_C_FLAGS +CMAKE_C_FLAGS-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_C_FLAGS_DEBUG +CMAKE_C_FLAGS_DEBUG-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_C_FLAGS_MINSIZEREL +CMAKE_C_FLAGS_MINSIZEREL-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_C_FLAGS_RELEASE +CMAKE_C_FLAGS_RELEASE-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_C_FLAGS_RELWITHDEBINFO +CMAKE_C_FLAGS_RELWITHDEBINFO-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_C_STANDARD_LIBRARIES +CMAKE_C_STANDARD_LIBRARIES-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_DLLTOOL +CMAKE_DLLTOOL-ADVANCED:INTERNAL=1 +//Path to cache edit program executable. +CMAKE_EDIT_COMMAND:INTERNAL=/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/bin/ccmake +//Executable file format +CMAKE_EXECUTABLE_FORMAT:INTERNAL=ELF +//ADVANCED property for variable: CMAKE_EXE_LINKER_FLAGS +CMAKE_EXE_LINKER_FLAGS-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_EXE_LINKER_FLAGS_DEBUG +CMAKE_EXE_LINKER_FLAGS_DEBUG-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_EXE_LINKER_FLAGS_MINSIZEREL +CMAKE_EXE_LINKER_FLAGS_MINSIZEREL-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_EXE_LINKER_FLAGS_RELEASE +CMAKE_EXE_LINKER_FLAGS_RELEASE-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_EXE_LINKER_FLAGS_RELWITHDEBINFO +CMAKE_EXE_LINKER_FLAGS_RELWITHDEBINFO-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_EXPORT_BUILD_DATABASE +CMAKE_EXPORT_BUILD_DATABASE-ADVANCED:INTERNAL=1 +//Name of external makefile project generator. +CMAKE_EXTRA_GENERATOR:INTERNAL= +//Name of generator. +CMAKE_GENERATOR:INTERNAL=Ninja +//Generator instance identifier. +CMAKE_GENERATOR_INSTANCE:INTERNAL= +//Name of generator platform. +CMAKE_GENERATOR_PLATFORM:INTERNAL= +//Name of generator toolset. +CMAKE_GENERATOR_TOOLSET:INTERNAL= +//Source directory with the top level CMakeLists.txt file for this +// project +CMAKE_HOME_DIRECTORY:INTERNAL=/Users/hamzaaleghwairyeen/development/App/intaleq_driver/android/app/src/main/cpp +//Install .so files without execute permission. +CMAKE_INSTALL_SO_NO_EXE:INTERNAL=0 +//ADVANCED property for variable: CMAKE_LINKER +CMAKE_LINKER-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_MODULE_LINKER_FLAGS +CMAKE_MODULE_LINKER_FLAGS-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_MODULE_LINKER_FLAGS_DEBUG +CMAKE_MODULE_LINKER_FLAGS_DEBUG-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_MODULE_LINKER_FLAGS_MINSIZEREL +CMAKE_MODULE_LINKER_FLAGS_MINSIZEREL-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_MODULE_LINKER_FLAGS_RELEASE +CMAKE_MODULE_LINKER_FLAGS_RELEASE-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_MODULE_LINKER_FLAGS_RELWITHDEBINFO +CMAKE_MODULE_LINKER_FLAGS_RELWITHDEBINFO-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_NM +CMAKE_NM-ADVANCED:INTERNAL=1 +//number of local generators +CMAKE_NUMBER_OF_MAKEFILES:INTERNAL=1 +//ADVANCED property for variable: CMAKE_OBJCOPY +CMAKE_OBJCOPY-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_OBJDUMP +CMAKE_OBJDUMP-ADVANCED:INTERNAL=1 +//Platform information initialized +CMAKE_PLATFORM_INFO_INITIALIZED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_RANLIB +CMAKE_RANLIB-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_READELF +CMAKE_READELF-ADVANCED:INTERNAL=1 +//Path to CMake installation. +CMAKE_ROOT:INTERNAL=/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31 +//ADVANCED property for variable: CMAKE_SHARED_LINKER_FLAGS +CMAKE_SHARED_LINKER_FLAGS-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_SHARED_LINKER_FLAGS_DEBUG +CMAKE_SHARED_LINKER_FLAGS_DEBUG-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_SHARED_LINKER_FLAGS_MINSIZEREL +CMAKE_SHARED_LINKER_FLAGS_MINSIZEREL-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_SHARED_LINKER_FLAGS_RELEASE +CMAKE_SHARED_LINKER_FLAGS_RELEASE-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_SHARED_LINKER_FLAGS_RELWITHDEBINFO +CMAKE_SHARED_LINKER_FLAGS_RELWITHDEBINFO-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_SKIP_INSTALL_RPATH +CMAKE_SKIP_INSTALL_RPATH-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_SKIP_RPATH +CMAKE_SKIP_RPATH-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_STATIC_LINKER_FLAGS +CMAKE_STATIC_LINKER_FLAGS-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_STATIC_LINKER_FLAGS_DEBUG +CMAKE_STATIC_LINKER_FLAGS_DEBUG-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_STATIC_LINKER_FLAGS_MINSIZEREL +CMAKE_STATIC_LINKER_FLAGS_MINSIZEREL-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_STATIC_LINKER_FLAGS_RELEASE +CMAKE_STATIC_LINKER_FLAGS_RELEASE-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_STATIC_LINKER_FLAGS_RELWITHDEBINFO +CMAKE_STATIC_LINKER_FLAGS_RELWITHDEBINFO-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_STRIP +CMAKE_STRIP-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_TAPI +CMAKE_TAPI-ADVANCED:INTERNAL=1 +//uname command +CMAKE_UNAME:INTERNAL=/usr/bin/uname +//ADVANCED property for variable: CMAKE_VERBOSE_MAKEFILE +CMAKE_VERBOSE_MAKEFILE-ADVANCED:INTERNAL=1 +//linker supports push/pop state +_CMAKE_CXX_LINKER_PUSHPOP_STATE_SUPPORTED:INTERNAL=TRUE +//linker supports push/pop state +_CMAKE_C_LINKER_PUSHPOP_STATE_SUPPORTED:INTERNAL=TRUE +//linker supports push/pop state +_CMAKE_LINKER_PUSHPOP_STATE_SUPPORTED:INTERNAL=TRUE + diff --git a/siro_driver/android/app/.cxx/Debug/2j1f5m6a/x86/CMakeFiles/3.31.5-g6cf5163/CMakeCCompiler.cmake b/siro_driver/android/app/.cxx/Debug/2j1f5m6a/x86/CMakeFiles/3.31.5-g6cf5163/CMakeCCompiler.cmake new file mode 100644 index 0000000..6f7fec1 --- /dev/null +++ b/siro_driver/android/app/.cxx/Debug/2j1f5m6a/x86/CMakeFiles/3.31.5-g6cf5163/CMakeCCompiler.cmake @@ -0,0 +1,81 @@ +set(CMAKE_C_COMPILER "/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/bin/clang") +set(CMAKE_C_COMPILER_ARG1 "") +set(CMAKE_C_COMPILER_ID "Clang") +set(CMAKE_C_COMPILER_VERSION "18.0.1") +set(CMAKE_C_COMPILER_VERSION_INTERNAL "") +set(CMAKE_C_COMPILER_WRAPPER "") +set(CMAKE_C_STANDARD_COMPUTED_DEFAULT "17") +set(CMAKE_C_EXTENSIONS_COMPUTED_DEFAULT "ON") +set(CMAKE_C_STANDARD_LATEST "23") +set(CMAKE_C_COMPILE_FEATURES "c_std_90;c_function_prototypes;c_std_99;c_restrict;c_variadic_macros;c_std_11;c_static_assert;c_std_17;c_std_23") +set(CMAKE_C90_COMPILE_FEATURES "c_std_90;c_function_prototypes") +set(CMAKE_C99_COMPILE_FEATURES "c_std_99;c_restrict;c_variadic_macros") +set(CMAKE_C11_COMPILE_FEATURES "c_std_11;c_static_assert") +set(CMAKE_C17_COMPILE_FEATURES "c_std_17") +set(CMAKE_C23_COMPILE_FEATURES "c_std_23") + +set(CMAKE_C_PLATFORM_ID "Linux") +set(CMAKE_C_SIMULATE_ID "") +set(CMAKE_C_COMPILER_FRONTEND_VARIANT "GNU") +set(CMAKE_C_SIMULATE_VERSION "") + + + + +set(CMAKE_AR "/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/bin/llvm-ar") +set(CMAKE_C_COMPILER_AR "/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/bin/llvm-ar") +set(CMAKE_RANLIB "/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/bin/llvm-ranlib") +set(CMAKE_C_COMPILER_RANLIB "/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/bin/llvm-ranlib") +set(CMAKE_LINKER "/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/bin/ld.lld") +set(CMAKE_LINKER_LINK "") +set(CMAKE_LINKER_LLD "") +set(CMAKE_C_COMPILER_LINKER "/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/bin/ld.lld") +set(CMAKE_C_COMPILER_LINKER_ID "LLD") +set(CMAKE_C_COMPILER_LINKER_VERSION 18.0.1) +set(CMAKE_C_COMPILER_LINKER_FRONTEND_VARIANT GNU) +set(CMAKE_MT "") +set(CMAKE_TAPI "CMAKE_TAPI-NOTFOUND") +set(CMAKE_COMPILER_IS_GNUCC ) +set(CMAKE_C_COMPILER_LOADED 1) +set(CMAKE_C_COMPILER_WORKS TRUE) +set(CMAKE_C_ABI_COMPILED TRUE) + +set(CMAKE_C_COMPILER_ENV_VAR "CC") + +set(CMAKE_C_COMPILER_ID_RUN 1) +set(CMAKE_C_SOURCE_FILE_EXTENSIONS c;m) +set(CMAKE_C_IGNORE_EXTENSIONS h;H;o;O;obj;OBJ;def;DEF;rc;RC) +set(CMAKE_C_LINKER_PREFERENCE 10) +set(CMAKE_C_LINKER_DEPFILE_SUPPORTED ) + +# Save compiler ABI information. +set(CMAKE_C_SIZEOF_DATA_PTR "4") +set(CMAKE_C_COMPILER_ABI "ELF") +set(CMAKE_C_BYTE_ORDER "LITTLE_ENDIAN") +set(CMAKE_C_LIBRARY_ARCHITECTURE "i686-linux-android") + +if(CMAKE_C_SIZEOF_DATA_PTR) + set(CMAKE_SIZEOF_VOID_P "${CMAKE_C_SIZEOF_DATA_PTR}") +endif() + +if(CMAKE_C_COMPILER_ABI) + set(CMAKE_INTERNAL_PLATFORM_ABI "${CMAKE_C_COMPILER_ABI}") +endif() + +if(CMAKE_C_LIBRARY_ARCHITECTURE) + set(CMAKE_LIBRARY_ARCHITECTURE "i686-linux-android") +endif() + +set(CMAKE_C_CL_SHOWINCLUDES_PREFIX "") +if(CMAKE_C_CL_SHOWINCLUDES_PREFIX) + set(CMAKE_CL_SHOWINCLUDES_PREFIX "${CMAKE_C_CL_SHOWINCLUDES_PREFIX}") +endif() + + + + + +set(CMAKE_C_IMPLICIT_INCLUDE_DIRECTORIES "/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/lib/clang/18/include;/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/include/i686-linux-android;/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/include") +set(CMAKE_C_IMPLICIT_LINK_LIBRARIES "-l:libunwind.a;dl;c;-l:libunwind.a;dl") +set(CMAKE_C_IMPLICIT_LINK_DIRECTORIES "/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/lib/clang/18/lib/linux/i386;/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/lib/i686-linux-android/23;/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/lib/i686-linux-android;/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/lib") +set(CMAKE_C_IMPLICIT_LINK_FRAMEWORK_DIRECTORIES "") diff --git a/siro_driver/android/app/.cxx/Debug/2j1f5m6a/x86/CMakeFiles/3.31.5-g6cf5163/CMakeCXXCompiler.cmake b/siro_driver/android/app/.cxx/Debug/2j1f5m6a/x86/CMakeFiles/3.31.5-g6cf5163/CMakeCXXCompiler.cmake new file mode 100644 index 0000000..3536164 --- /dev/null +++ b/siro_driver/android/app/.cxx/Debug/2j1f5m6a/x86/CMakeFiles/3.31.5-g6cf5163/CMakeCXXCompiler.cmake @@ -0,0 +1,105 @@ +set(CMAKE_CXX_COMPILER "/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/bin/clang++") +set(CMAKE_CXX_COMPILER_ARG1 "") +set(CMAKE_CXX_COMPILER_ID "Clang") +set(CMAKE_CXX_COMPILER_VERSION "18.0.1") +set(CMAKE_CXX_COMPILER_VERSION_INTERNAL "") +set(CMAKE_CXX_COMPILER_WRAPPER "") +set(CMAKE_CXX_STANDARD_COMPUTED_DEFAULT "17") +set(CMAKE_CXX_EXTENSIONS_COMPUTED_DEFAULT "ON") +set(CMAKE_CXX_STANDARD_LATEST "26") +set(CMAKE_CXX_COMPILE_FEATURES "cxx_std_98;cxx_template_template_parameters;cxx_std_11;cxx_alias_templates;cxx_alignas;cxx_alignof;cxx_attributes;cxx_auto_type;cxx_constexpr;cxx_decltype;cxx_decltype_incomplete_return_types;cxx_default_function_template_args;cxx_defaulted_functions;cxx_defaulted_move_initializers;cxx_delegating_constructors;cxx_deleted_functions;cxx_enum_forward_declarations;cxx_explicit_conversions;cxx_extended_friend_declarations;cxx_extern_templates;cxx_final;cxx_func_identifier;cxx_generalized_initializers;cxx_inheriting_constructors;cxx_inline_namespaces;cxx_lambdas;cxx_local_type_template_args;cxx_long_long_type;cxx_noexcept;cxx_nonstatic_member_init;cxx_nullptr;cxx_override;cxx_range_for;cxx_raw_string_literals;cxx_reference_qualified_functions;cxx_right_angle_brackets;cxx_rvalue_references;cxx_sizeof_member;cxx_static_assert;cxx_strong_enums;cxx_thread_local;cxx_trailing_return_types;cxx_unicode_literals;cxx_uniform_initialization;cxx_unrestricted_unions;cxx_user_literals;cxx_variadic_macros;cxx_variadic_templates;cxx_std_14;cxx_aggregate_default_initializers;cxx_attribute_deprecated;cxx_binary_literals;cxx_contextual_conversions;cxx_decltype_auto;cxx_digit_separators;cxx_generic_lambdas;cxx_lambda_init_captures;cxx_relaxed_constexpr;cxx_return_type_deduction;cxx_variable_templates;cxx_std_17;cxx_std_20;cxx_std_23;cxx_std_26") +set(CMAKE_CXX98_COMPILE_FEATURES "cxx_std_98;cxx_template_template_parameters") +set(CMAKE_CXX11_COMPILE_FEATURES "cxx_std_11;cxx_alias_templates;cxx_alignas;cxx_alignof;cxx_attributes;cxx_auto_type;cxx_constexpr;cxx_decltype;cxx_decltype_incomplete_return_types;cxx_default_function_template_args;cxx_defaulted_functions;cxx_defaulted_move_initializers;cxx_delegating_constructors;cxx_deleted_functions;cxx_enum_forward_declarations;cxx_explicit_conversions;cxx_extended_friend_declarations;cxx_extern_templates;cxx_final;cxx_func_identifier;cxx_generalized_initializers;cxx_inheriting_constructors;cxx_inline_namespaces;cxx_lambdas;cxx_local_type_template_args;cxx_long_long_type;cxx_noexcept;cxx_nonstatic_member_init;cxx_nullptr;cxx_override;cxx_range_for;cxx_raw_string_literals;cxx_reference_qualified_functions;cxx_right_angle_brackets;cxx_rvalue_references;cxx_sizeof_member;cxx_static_assert;cxx_strong_enums;cxx_thread_local;cxx_trailing_return_types;cxx_unicode_literals;cxx_uniform_initialization;cxx_unrestricted_unions;cxx_user_literals;cxx_variadic_macros;cxx_variadic_templates") +set(CMAKE_CXX14_COMPILE_FEATURES "cxx_std_14;cxx_aggregate_default_initializers;cxx_attribute_deprecated;cxx_binary_literals;cxx_contextual_conversions;cxx_decltype_auto;cxx_digit_separators;cxx_generic_lambdas;cxx_lambda_init_captures;cxx_relaxed_constexpr;cxx_return_type_deduction;cxx_variable_templates") +set(CMAKE_CXX17_COMPILE_FEATURES "cxx_std_17") +set(CMAKE_CXX20_COMPILE_FEATURES "cxx_std_20") +set(CMAKE_CXX23_COMPILE_FEATURES "cxx_std_23") +set(CMAKE_CXX26_COMPILE_FEATURES "cxx_std_26") + +set(CMAKE_CXX_PLATFORM_ID "Linux") +set(CMAKE_CXX_SIMULATE_ID "") +set(CMAKE_CXX_COMPILER_FRONTEND_VARIANT "GNU") +set(CMAKE_CXX_SIMULATE_VERSION "") + + + + +set(CMAKE_AR "/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/bin/llvm-ar") +set(CMAKE_CXX_COMPILER_AR "/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/bin/llvm-ar") +set(CMAKE_RANLIB "/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/bin/llvm-ranlib") +set(CMAKE_CXX_COMPILER_RANLIB "/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/bin/llvm-ranlib") +set(CMAKE_LINKER "/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/bin/ld.lld") +set(CMAKE_LINKER_LINK "") +set(CMAKE_LINKER_LLD "") +set(CMAKE_CXX_COMPILER_LINKER "/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/bin/ld.lld") +set(CMAKE_CXX_COMPILER_LINKER_ID "LLD") +set(CMAKE_CXX_COMPILER_LINKER_VERSION 18.0.1) +set(CMAKE_CXX_COMPILER_LINKER_FRONTEND_VARIANT GNU) +set(CMAKE_MT "") +set(CMAKE_TAPI "CMAKE_TAPI-NOTFOUND") +set(CMAKE_COMPILER_IS_GNUCXX ) +set(CMAKE_CXX_COMPILER_LOADED 1) +set(CMAKE_CXX_COMPILER_WORKS TRUE) +set(CMAKE_CXX_ABI_COMPILED TRUE) + +set(CMAKE_CXX_COMPILER_ENV_VAR "CXX") + +set(CMAKE_CXX_COMPILER_ID_RUN 1) +set(CMAKE_CXX_SOURCE_FILE_EXTENSIONS C;M;c++;cc;cpp;cxx;m;mm;mpp;CPP;ixx;cppm;ccm;cxxm;c++m) +set(CMAKE_CXX_IGNORE_EXTENSIONS inl;h;hpp;HPP;H;o;O;obj;OBJ;def;DEF;rc;RC) + +foreach (lang IN ITEMS C OBJC OBJCXX) + if (CMAKE_${lang}_COMPILER_ID_RUN) + foreach(extension IN LISTS CMAKE_${lang}_SOURCE_FILE_EXTENSIONS) + list(REMOVE_ITEM CMAKE_CXX_SOURCE_FILE_EXTENSIONS ${extension}) + endforeach() + endif() +endforeach() + +set(CMAKE_CXX_LINKER_PREFERENCE 30) +set(CMAKE_CXX_LINKER_PREFERENCE_PROPAGATES 1) +set(CMAKE_CXX_LINKER_DEPFILE_SUPPORTED ) + +# Save compiler ABI information. +set(CMAKE_CXX_SIZEOF_DATA_PTR "4") +set(CMAKE_CXX_COMPILER_ABI "ELF") +set(CMAKE_CXX_BYTE_ORDER "LITTLE_ENDIAN") +set(CMAKE_CXX_LIBRARY_ARCHITECTURE "i686-linux-android") + +if(CMAKE_CXX_SIZEOF_DATA_PTR) + set(CMAKE_SIZEOF_VOID_P "${CMAKE_CXX_SIZEOF_DATA_PTR}") +endif() + +if(CMAKE_CXX_COMPILER_ABI) + set(CMAKE_INTERNAL_PLATFORM_ABI "${CMAKE_CXX_COMPILER_ABI}") +endif() + +if(CMAKE_CXX_LIBRARY_ARCHITECTURE) + set(CMAKE_LIBRARY_ARCHITECTURE "i686-linux-android") +endif() + +set(CMAKE_CXX_CL_SHOWINCLUDES_PREFIX "") +if(CMAKE_CXX_CL_SHOWINCLUDES_PREFIX) + set(CMAKE_CL_SHOWINCLUDES_PREFIX "${CMAKE_CXX_CL_SHOWINCLUDES_PREFIX}") +endif() + + + + + +set(CMAKE_CXX_IMPLICIT_INCLUDE_DIRECTORIES "/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/include/c++/v1;/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/lib/clang/18/include;/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/include/i686-linux-android;/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/include") +set(CMAKE_CXX_IMPLICIT_LINK_LIBRARIES "c++;m;-l:libunwind.a;dl;c;-l:libunwind.a;dl") +set(CMAKE_CXX_IMPLICIT_LINK_DIRECTORIES "/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/lib/clang/18/lib/linux/i386;/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/lib/i686-linux-android/23;/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/lib/i686-linux-android;/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/lib") +set(CMAKE_CXX_IMPLICIT_LINK_FRAMEWORK_DIRECTORIES "") +set(CMAKE_CXX_COMPILER_CLANG_RESOURCE_DIR "/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/lib/clang/18") + +set(CMAKE_CXX_COMPILER_IMPORT_STD "") +### Imported target for C++23 standard library +set(CMAKE_CXX23_COMPILER_IMPORT_STD_NOT_FOUND_MESSAGE "Experimental `import std` support not enabled when detecting toolchain; it must be set before `CXX` is enabled (usually a `project()` call)") + + +### Imported target for C++26 standard library +set(CMAKE_CXX26_COMPILER_IMPORT_STD_NOT_FOUND_MESSAGE "Experimental `import std` support not enabled when detecting toolchain; it must be set before `CXX` is enabled (usually a `project()` call)") + + + diff --git a/siro_driver/android/app/.cxx/Debug/2j1f5m6a/x86/CMakeFiles/3.31.5-g6cf5163/CMakeDetermineCompilerABI_C.bin b/siro_driver/android/app/.cxx/Debug/2j1f5m6a/x86/CMakeFiles/3.31.5-g6cf5163/CMakeDetermineCompilerABI_C.bin new file mode 100755 index 0000000..2e5859d Binary files /dev/null and b/siro_driver/android/app/.cxx/Debug/2j1f5m6a/x86/CMakeFiles/3.31.5-g6cf5163/CMakeDetermineCompilerABI_C.bin differ diff --git a/siro_driver/android/app/.cxx/Debug/2j1f5m6a/x86/CMakeFiles/3.31.5-g6cf5163/CMakeDetermineCompilerABI_CXX.bin b/siro_driver/android/app/.cxx/Debug/2j1f5m6a/x86/CMakeFiles/3.31.5-g6cf5163/CMakeDetermineCompilerABI_CXX.bin new file mode 100755 index 0000000..ef0fae1 Binary files /dev/null and b/siro_driver/android/app/.cxx/Debug/2j1f5m6a/x86/CMakeFiles/3.31.5-g6cf5163/CMakeDetermineCompilerABI_CXX.bin differ diff --git a/siro_driver/android/app/.cxx/Debug/2j1f5m6a/x86/CMakeFiles/3.31.5-g6cf5163/CMakeSystem.cmake b/siro_driver/android/app/.cxx/Debug/2j1f5m6a/x86/CMakeFiles/3.31.5-g6cf5163/CMakeSystem.cmake new file mode 100644 index 0000000..4828e9f --- /dev/null +++ b/siro_driver/android/app/.cxx/Debug/2j1f5m6a/x86/CMakeFiles/3.31.5-g6cf5163/CMakeSystem.cmake @@ -0,0 +1,15 @@ +set(CMAKE_HOST_SYSTEM "Darwin-24.5.0") +set(CMAKE_HOST_SYSTEM_NAME "Darwin") +set(CMAKE_HOST_SYSTEM_VERSION "24.5.0") +set(CMAKE_HOST_SYSTEM_PROCESSOR "arm64") + +include("/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/build/cmake/android.toolchain.cmake") + +set(CMAKE_SYSTEM "Android-1") +set(CMAKE_SYSTEM_NAME "Android") +set(CMAKE_SYSTEM_VERSION "1") +set(CMAKE_SYSTEM_PROCESSOR "i686") + +set(CMAKE_CROSSCOMPILING "TRUE") + +set(CMAKE_SYSTEM_LOADED 1) diff --git a/siro_driver/android/app/.cxx/Debug/2j1f5m6a/x86/CMakeFiles/3.31.5-g6cf5163/CompilerIdC/CMakeCCompilerId.c b/siro_driver/android/app/.cxx/Debug/2j1f5m6a/x86/CMakeFiles/3.31.5-g6cf5163/CompilerIdC/CMakeCCompilerId.c new file mode 100644 index 0000000..8d8bb03 --- /dev/null +++ b/siro_driver/android/app/.cxx/Debug/2j1f5m6a/x86/CMakeFiles/3.31.5-g6cf5163/CompilerIdC/CMakeCCompilerId.c @@ -0,0 +1,904 @@ +#ifdef __cplusplus +# error "A C++ compiler has been selected for C." +#endif + +#if defined(__18CXX) +# define ID_VOID_MAIN +#endif +#if defined(__CLASSIC_C__) +/* cv-qualifiers did not exist in K&R C */ +# define const +# define volatile +#endif + +#if !defined(__has_include) +/* If the compiler does not have __has_include, pretend the answer is + always no. */ +# define __has_include(x) 0 +#endif + + +/* Version number components: V=Version, R=Revision, P=Patch + Version date components: YYYY=Year, MM=Month, DD=Day */ + +#if defined(__INTEL_COMPILER) || defined(__ICC) +# define COMPILER_ID "Intel" +# if defined(_MSC_VER) +# define SIMULATE_ID "MSVC" +# endif +# if defined(__GNUC__) +# define SIMULATE_ID "GNU" +# endif + /* __INTEL_COMPILER = VRP prior to 2021, and then VVVV for 2021 and later, + except that a few beta releases use the old format with V=2021. */ +# if __INTEL_COMPILER < 2021 || __INTEL_COMPILER == 202110 || __INTEL_COMPILER == 202111 +# define COMPILER_VERSION_MAJOR DEC(__INTEL_COMPILER/100) +# define COMPILER_VERSION_MINOR DEC(__INTEL_COMPILER/10 % 10) +# if defined(__INTEL_COMPILER_UPDATE) +# define COMPILER_VERSION_PATCH DEC(__INTEL_COMPILER_UPDATE) +# else +# define COMPILER_VERSION_PATCH DEC(__INTEL_COMPILER % 10) +# endif +# else +# define COMPILER_VERSION_MAJOR DEC(__INTEL_COMPILER) +# define COMPILER_VERSION_MINOR DEC(__INTEL_COMPILER_UPDATE) + /* The third version component from --version is an update index, + but no macro is provided for it. */ +# define COMPILER_VERSION_PATCH DEC(0) +# endif +# if defined(__INTEL_COMPILER_BUILD_DATE) + /* __INTEL_COMPILER_BUILD_DATE = YYYYMMDD */ +# define COMPILER_VERSION_TWEAK DEC(__INTEL_COMPILER_BUILD_DATE) +# endif +# if defined(_MSC_VER) + /* _MSC_VER = VVRR */ +# define SIMULATE_VERSION_MAJOR DEC(_MSC_VER / 100) +# define SIMULATE_VERSION_MINOR DEC(_MSC_VER % 100) +# endif +# if defined(__GNUC__) +# define SIMULATE_VERSION_MAJOR DEC(__GNUC__) +# elif defined(__GNUG__) +# define SIMULATE_VERSION_MAJOR DEC(__GNUG__) +# endif +# if defined(__GNUC_MINOR__) +# define SIMULATE_VERSION_MINOR DEC(__GNUC_MINOR__) +# endif +# if defined(__GNUC_PATCHLEVEL__) +# define SIMULATE_VERSION_PATCH DEC(__GNUC_PATCHLEVEL__) +# endif + +#elif (defined(__clang__) && defined(__INTEL_CLANG_COMPILER)) || defined(__INTEL_LLVM_COMPILER) +# define COMPILER_ID "IntelLLVM" +#if defined(_MSC_VER) +# define SIMULATE_ID "MSVC" +#endif +#if defined(__GNUC__) +# define SIMULATE_ID "GNU" +#endif +/* __INTEL_LLVM_COMPILER = VVVVRP prior to 2021.2.0, VVVVRRPP for 2021.2.0 and + * later. Look for 6 digit vs. 8 digit version number to decide encoding. + * VVVV is no smaller than the current year when a version is released. + */ +#if __INTEL_LLVM_COMPILER < 1000000L +# define COMPILER_VERSION_MAJOR DEC(__INTEL_LLVM_COMPILER/100) +# define COMPILER_VERSION_MINOR DEC(__INTEL_LLVM_COMPILER/10 % 10) +# define COMPILER_VERSION_PATCH DEC(__INTEL_LLVM_COMPILER % 10) +#else +# define COMPILER_VERSION_MAJOR DEC(__INTEL_LLVM_COMPILER/10000) +# define COMPILER_VERSION_MINOR DEC(__INTEL_LLVM_COMPILER/100 % 100) +# define COMPILER_VERSION_PATCH DEC(__INTEL_LLVM_COMPILER % 100) +#endif +#if defined(_MSC_VER) + /* _MSC_VER = VVRR */ +# define SIMULATE_VERSION_MAJOR DEC(_MSC_VER / 100) +# define SIMULATE_VERSION_MINOR DEC(_MSC_VER % 100) +#endif +#if defined(__GNUC__) +# define SIMULATE_VERSION_MAJOR DEC(__GNUC__) +#elif defined(__GNUG__) +# define SIMULATE_VERSION_MAJOR DEC(__GNUG__) +#endif +#if defined(__GNUC_MINOR__) +# define SIMULATE_VERSION_MINOR DEC(__GNUC_MINOR__) +#endif +#if defined(__GNUC_PATCHLEVEL__) +# define SIMULATE_VERSION_PATCH DEC(__GNUC_PATCHLEVEL__) +#endif + +#elif defined(__PATHCC__) +# define COMPILER_ID "PathScale" +# define COMPILER_VERSION_MAJOR DEC(__PATHCC__) +# define COMPILER_VERSION_MINOR DEC(__PATHCC_MINOR__) +# if defined(__PATHCC_PATCHLEVEL__) +# define COMPILER_VERSION_PATCH DEC(__PATHCC_PATCHLEVEL__) +# endif + +#elif defined(__BORLANDC__) && defined(__CODEGEARC_VERSION__) +# define COMPILER_ID "Embarcadero" +# define COMPILER_VERSION_MAJOR HEX(__CODEGEARC_VERSION__>>24 & 0x00FF) +# define COMPILER_VERSION_MINOR HEX(__CODEGEARC_VERSION__>>16 & 0x00FF) +# define COMPILER_VERSION_PATCH DEC(__CODEGEARC_VERSION__ & 0xFFFF) + +#elif defined(__BORLANDC__) +# define COMPILER_ID "Borland" + /* __BORLANDC__ = 0xVRR */ +# define COMPILER_VERSION_MAJOR HEX(__BORLANDC__>>8) +# define COMPILER_VERSION_MINOR HEX(__BORLANDC__ & 0xFF) + +#elif defined(__WATCOMC__) && __WATCOMC__ < 1200 +# define COMPILER_ID "Watcom" + /* __WATCOMC__ = VVRR */ +# define COMPILER_VERSION_MAJOR DEC(__WATCOMC__ / 100) +# define COMPILER_VERSION_MINOR DEC((__WATCOMC__ / 10) % 10) +# if (__WATCOMC__ % 10) > 0 +# define COMPILER_VERSION_PATCH DEC(__WATCOMC__ % 10) +# endif + +#elif defined(__WATCOMC__) +# define COMPILER_ID "OpenWatcom" + /* __WATCOMC__ = VVRP + 1100 */ +# define COMPILER_VERSION_MAJOR DEC((__WATCOMC__ - 1100) / 100) +# define COMPILER_VERSION_MINOR DEC((__WATCOMC__ / 10) % 10) +# if (__WATCOMC__ % 10) > 0 +# define COMPILER_VERSION_PATCH DEC(__WATCOMC__ % 10) +# endif + +#elif defined(__SUNPRO_C) +# define COMPILER_ID "SunPro" +# if __SUNPRO_C >= 0x5100 + /* __SUNPRO_C = 0xVRRP */ +# define COMPILER_VERSION_MAJOR HEX(__SUNPRO_C>>12) +# define COMPILER_VERSION_MINOR HEX(__SUNPRO_C>>4 & 0xFF) +# define COMPILER_VERSION_PATCH HEX(__SUNPRO_C & 0xF) +# else + /* __SUNPRO_CC = 0xVRP */ +# define COMPILER_VERSION_MAJOR HEX(__SUNPRO_C>>8) +# define COMPILER_VERSION_MINOR HEX(__SUNPRO_C>>4 & 0xF) +# define COMPILER_VERSION_PATCH HEX(__SUNPRO_C & 0xF) +# endif + +#elif defined(__HP_cc) +# define COMPILER_ID "HP" + /* __HP_cc = VVRRPP */ +# define COMPILER_VERSION_MAJOR DEC(__HP_cc/10000) +# define COMPILER_VERSION_MINOR DEC(__HP_cc/100 % 100) +# define COMPILER_VERSION_PATCH DEC(__HP_cc % 100) + +#elif defined(__DECC) +# define COMPILER_ID "Compaq" + /* __DECC_VER = VVRRTPPPP */ +# define COMPILER_VERSION_MAJOR DEC(__DECC_VER/10000000) +# define COMPILER_VERSION_MINOR DEC(__DECC_VER/100000 % 100) +# define COMPILER_VERSION_PATCH DEC(__DECC_VER % 10000) + +#elif defined(__IBMC__) && defined(__COMPILER_VER__) +# define COMPILER_ID "zOS" + /* __IBMC__ = VRP */ +# define COMPILER_VERSION_MAJOR DEC(__IBMC__/100) +# define COMPILER_VERSION_MINOR DEC(__IBMC__/10 % 10) +# define COMPILER_VERSION_PATCH DEC(__IBMC__ % 10) + +#elif defined(__open_xl__) && defined(__clang__) +# define COMPILER_ID "IBMClang" +# define COMPILER_VERSION_MAJOR DEC(__open_xl_version__) +# define COMPILER_VERSION_MINOR DEC(__open_xl_release__) +# define COMPILER_VERSION_PATCH DEC(__open_xl_modification__) +# define COMPILER_VERSION_TWEAK DEC(__open_xl_ptf_fix_level__) + + +#elif defined(__ibmxl__) && defined(__clang__) +# define COMPILER_ID "XLClang" +# define COMPILER_VERSION_MAJOR DEC(__ibmxl_version__) +# define COMPILER_VERSION_MINOR DEC(__ibmxl_release__) +# define COMPILER_VERSION_PATCH DEC(__ibmxl_modification__) +# define COMPILER_VERSION_TWEAK DEC(__ibmxl_ptf_fix_level__) + + +#elif defined(__IBMC__) && !defined(__COMPILER_VER__) && __IBMC__ >= 800 +# define COMPILER_ID "XL" + /* __IBMC__ = VRP */ +# define COMPILER_VERSION_MAJOR DEC(__IBMC__/100) +# define COMPILER_VERSION_MINOR DEC(__IBMC__/10 % 10) +# define COMPILER_VERSION_PATCH DEC(__IBMC__ % 10) + +#elif defined(__IBMC__) && !defined(__COMPILER_VER__) && __IBMC__ < 800 +# define COMPILER_ID "VisualAge" + /* __IBMC__ = VRP */ +# define COMPILER_VERSION_MAJOR DEC(__IBMC__/100) +# define COMPILER_VERSION_MINOR DEC(__IBMC__/10 % 10) +# define COMPILER_VERSION_PATCH DEC(__IBMC__ % 10) + +#elif defined(__NVCOMPILER) +# define COMPILER_ID "NVHPC" +# define COMPILER_VERSION_MAJOR DEC(__NVCOMPILER_MAJOR__) +# define COMPILER_VERSION_MINOR DEC(__NVCOMPILER_MINOR__) +# if defined(__NVCOMPILER_PATCHLEVEL__) +# define COMPILER_VERSION_PATCH DEC(__NVCOMPILER_PATCHLEVEL__) +# endif + +#elif defined(__PGI) +# define COMPILER_ID "PGI" +# define COMPILER_VERSION_MAJOR DEC(__PGIC__) +# define COMPILER_VERSION_MINOR DEC(__PGIC_MINOR__) +# if defined(__PGIC_PATCHLEVEL__) +# define COMPILER_VERSION_PATCH DEC(__PGIC_PATCHLEVEL__) +# endif + +#elif defined(__clang__) && defined(__cray__) +# define COMPILER_ID "CrayClang" +# define COMPILER_VERSION_MAJOR DEC(__cray_major__) +# define COMPILER_VERSION_MINOR DEC(__cray_minor__) +# define COMPILER_VERSION_PATCH DEC(__cray_patchlevel__) +# define COMPILER_VERSION_INTERNAL_STR __clang_version__ + + +#elif defined(_CRAYC) +# define COMPILER_ID "Cray" +# define COMPILER_VERSION_MAJOR DEC(_RELEASE_MAJOR) +# define COMPILER_VERSION_MINOR DEC(_RELEASE_MINOR) + +#elif defined(__TI_COMPILER_VERSION__) +# define COMPILER_ID "TI" + /* __TI_COMPILER_VERSION__ = VVVRRRPPP */ +# define COMPILER_VERSION_MAJOR DEC(__TI_COMPILER_VERSION__/1000000) +# define COMPILER_VERSION_MINOR DEC(__TI_COMPILER_VERSION__/1000 % 1000) +# define COMPILER_VERSION_PATCH DEC(__TI_COMPILER_VERSION__ % 1000) + +#elif defined(__CLANG_FUJITSU) +# define COMPILER_ID "FujitsuClang" +# define COMPILER_VERSION_MAJOR DEC(__FCC_major__) +# define COMPILER_VERSION_MINOR DEC(__FCC_minor__) +# define COMPILER_VERSION_PATCH DEC(__FCC_patchlevel__) +# define COMPILER_VERSION_INTERNAL_STR __clang_version__ + + +#elif defined(__FUJITSU) +# define COMPILER_ID "Fujitsu" +# if defined(__FCC_version__) +# define COMPILER_VERSION __FCC_version__ +# elif defined(__FCC_major__) +# define COMPILER_VERSION_MAJOR DEC(__FCC_major__) +# define COMPILER_VERSION_MINOR DEC(__FCC_minor__) +# define COMPILER_VERSION_PATCH DEC(__FCC_patchlevel__) +# endif +# if defined(__fcc_version) +# define COMPILER_VERSION_INTERNAL DEC(__fcc_version) +# elif defined(__FCC_VERSION) +# define COMPILER_VERSION_INTERNAL DEC(__FCC_VERSION) +# endif + + +#elif defined(__ghs__) +# define COMPILER_ID "GHS" +/* __GHS_VERSION_NUMBER = VVVVRP */ +# ifdef __GHS_VERSION_NUMBER +# define COMPILER_VERSION_MAJOR DEC(__GHS_VERSION_NUMBER / 100) +# define COMPILER_VERSION_MINOR DEC(__GHS_VERSION_NUMBER / 10 % 10) +# define COMPILER_VERSION_PATCH DEC(__GHS_VERSION_NUMBER % 10) +# endif + +#elif defined(__TASKING__) +# define COMPILER_ID "Tasking" + # define COMPILER_VERSION_MAJOR DEC(__VERSION__/1000) + # define COMPILER_VERSION_MINOR DEC(__VERSION__ % 100) +# define COMPILER_VERSION_INTERNAL DEC(__VERSION__) + +#elif defined(__ORANGEC__) +# define COMPILER_ID "OrangeC" +# define COMPILER_VERSION_MAJOR DEC(__ORANGEC_MAJOR__) +# define COMPILER_VERSION_MINOR DEC(__ORANGEC_MINOR__) +# define COMPILER_VERSION_PATCH DEC(__ORANGEC_PATCHLEVEL__) + +#elif defined(__TINYC__) +# define COMPILER_ID "TinyCC" + +#elif defined(__BCC__) +# define COMPILER_ID "Bruce" + +#elif defined(__SCO_VERSION__) +# define COMPILER_ID "SCO" + +#elif defined(__ARMCC_VERSION) && !defined(__clang__) +# define COMPILER_ID "ARMCC" +#if __ARMCC_VERSION >= 1000000 + /* __ARMCC_VERSION = VRRPPPP */ + # define COMPILER_VERSION_MAJOR DEC(__ARMCC_VERSION/1000000) + # define COMPILER_VERSION_MINOR DEC(__ARMCC_VERSION/10000 % 100) + # define COMPILER_VERSION_PATCH DEC(__ARMCC_VERSION % 10000) +#else + /* __ARMCC_VERSION = VRPPPP */ + # define COMPILER_VERSION_MAJOR DEC(__ARMCC_VERSION/100000) + # define COMPILER_VERSION_MINOR DEC(__ARMCC_VERSION/10000 % 10) + # define COMPILER_VERSION_PATCH DEC(__ARMCC_VERSION % 10000) +#endif + + +#elif defined(__clang__) && defined(__apple_build_version__) +# define COMPILER_ID "AppleClang" +# if defined(_MSC_VER) +# define SIMULATE_ID "MSVC" +# endif +# define COMPILER_VERSION_MAJOR DEC(__clang_major__) +# define COMPILER_VERSION_MINOR DEC(__clang_minor__) +# define COMPILER_VERSION_PATCH DEC(__clang_patchlevel__) +# if defined(_MSC_VER) + /* _MSC_VER = VVRR */ +# define SIMULATE_VERSION_MAJOR DEC(_MSC_VER / 100) +# define SIMULATE_VERSION_MINOR DEC(_MSC_VER % 100) +# endif +# define COMPILER_VERSION_TWEAK DEC(__apple_build_version__) + +#elif defined(__clang__) && defined(__ARMCOMPILER_VERSION) +# define COMPILER_ID "ARMClang" + # define COMPILER_VERSION_MAJOR DEC(__ARMCOMPILER_VERSION/1000000) + # define COMPILER_VERSION_MINOR DEC(__ARMCOMPILER_VERSION/10000 % 100) + # define COMPILER_VERSION_PATCH DEC(__ARMCOMPILER_VERSION/100 % 100) +# define COMPILER_VERSION_INTERNAL DEC(__ARMCOMPILER_VERSION) + +#elif defined(__clang__) && defined(__ti__) +# define COMPILER_ID "TIClang" + # define COMPILER_VERSION_MAJOR DEC(__ti_major__) + # define COMPILER_VERSION_MINOR DEC(__ti_minor__) + # define COMPILER_VERSION_PATCH DEC(__ti_patchlevel__) +# define COMPILER_VERSION_INTERNAL DEC(__ti_version__) + +#elif defined(__clang__) +# define COMPILER_ID "Clang" +# if defined(_MSC_VER) +# define SIMULATE_ID "MSVC" +# endif +# define COMPILER_VERSION_MAJOR DEC(__clang_major__) +# define COMPILER_VERSION_MINOR DEC(__clang_minor__) +# define COMPILER_VERSION_PATCH DEC(__clang_patchlevel__) +# if defined(_MSC_VER) + /* _MSC_VER = VVRR */ +# define SIMULATE_VERSION_MAJOR DEC(_MSC_VER / 100) +# define SIMULATE_VERSION_MINOR DEC(_MSC_VER % 100) +# endif + +#elif defined(__LCC__) && (defined(__GNUC__) || defined(__GNUG__) || defined(__MCST__)) +# define COMPILER_ID "LCC" +# define COMPILER_VERSION_MAJOR DEC(__LCC__ / 100) +# define COMPILER_VERSION_MINOR DEC(__LCC__ % 100) +# if defined(__LCC_MINOR__) +# define COMPILER_VERSION_PATCH DEC(__LCC_MINOR__) +# endif +# if defined(__GNUC__) && defined(__GNUC_MINOR__) +# define SIMULATE_ID "GNU" +# define SIMULATE_VERSION_MAJOR DEC(__GNUC__) +# define SIMULATE_VERSION_MINOR DEC(__GNUC_MINOR__) +# if defined(__GNUC_PATCHLEVEL__) +# define SIMULATE_VERSION_PATCH DEC(__GNUC_PATCHLEVEL__) +# endif +# endif + +#elif defined(__GNUC__) +# define COMPILER_ID "GNU" +# define COMPILER_VERSION_MAJOR DEC(__GNUC__) +# if defined(__GNUC_MINOR__) +# define COMPILER_VERSION_MINOR DEC(__GNUC_MINOR__) +# endif +# if defined(__GNUC_PATCHLEVEL__) +# define COMPILER_VERSION_PATCH DEC(__GNUC_PATCHLEVEL__) +# endif + +#elif defined(_MSC_VER) +# define COMPILER_ID "MSVC" + /* _MSC_VER = VVRR */ +# define COMPILER_VERSION_MAJOR DEC(_MSC_VER / 100) +# define COMPILER_VERSION_MINOR DEC(_MSC_VER % 100) +# if defined(_MSC_FULL_VER) +# if _MSC_VER >= 1400 + /* _MSC_FULL_VER = VVRRPPPPP */ +# define COMPILER_VERSION_PATCH DEC(_MSC_FULL_VER % 100000) +# else + /* _MSC_FULL_VER = VVRRPPPP */ +# define COMPILER_VERSION_PATCH DEC(_MSC_FULL_VER % 10000) +# endif +# endif +# if defined(_MSC_BUILD) +# define COMPILER_VERSION_TWEAK DEC(_MSC_BUILD) +# endif + +#elif defined(_ADI_COMPILER) +# define COMPILER_ID "ADSP" +#if defined(__VERSIONNUM__) + /* __VERSIONNUM__ = 0xVVRRPPTT */ +# define COMPILER_VERSION_MAJOR DEC(__VERSIONNUM__ >> 24 & 0xFF) +# define COMPILER_VERSION_MINOR DEC(__VERSIONNUM__ >> 16 & 0xFF) +# define COMPILER_VERSION_PATCH DEC(__VERSIONNUM__ >> 8 & 0xFF) +# define COMPILER_VERSION_TWEAK DEC(__VERSIONNUM__ & 0xFF) +#endif + +#elif defined(__IAR_SYSTEMS_ICC__) || defined(__IAR_SYSTEMS_ICC) +# define COMPILER_ID "IAR" +# if defined(__VER__) && defined(__ICCARM__) +# define COMPILER_VERSION_MAJOR DEC((__VER__) / 1000000) +# define COMPILER_VERSION_MINOR DEC(((__VER__) / 1000) % 1000) +# define COMPILER_VERSION_PATCH DEC((__VER__) % 1000) +# define COMPILER_VERSION_INTERNAL DEC(__IAR_SYSTEMS_ICC__) +# elif defined(__VER__) && (defined(__ICCAVR__) || defined(__ICCRX__) || defined(__ICCRH850__) || defined(__ICCRL78__) || defined(__ICC430__) || defined(__ICCRISCV__) || defined(__ICCV850__) || defined(__ICC8051__) || defined(__ICCSTM8__)) +# define COMPILER_VERSION_MAJOR DEC((__VER__) / 100) +# define COMPILER_VERSION_MINOR DEC((__VER__) - (((__VER__) / 100)*100)) +# define COMPILER_VERSION_PATCH DEC(__SUBVERSION__) +# define COMPILER_VERSION_INTERNAL DEC(__IAR_SYSTEMS_ICC__) +# endif + +#elif defined(__SDCC_VERSION_MAJOR) || defined(SDCC) +# define COMPILER_ID "SDCC" +# if defined(__SDCC_VERSION_MAJOR) +# define COMPILER_VERSION_MAJOR DEC(__SDCC_VERSION_MAJOR) +# define COMPILER_VERSION_MINOR DEC(__SDCC_VERSION_MINOR) +# define COMPILER_VERSION_PATCH DEC(__SDCC_VERSION_PATCH) +# else + /* SDCC = VRP */ +# define COMPILER_VERSION_MAJOR DEC(SDCC/100) +# define COMPILER_VERSION_MINOR DEC(SDCC/10 % 10) +# define COMPILER_VERSION_PATCH DEC(SDCC % 10) +# endif + + +/* These compilers are either not known or too old to define an + identification macro. Try to identify the platform and guess that + it is the native compiler. */ +#elif defined(__hpux) || defined(__hpua) +# define COMPILER_ID "HP" + +#else /* unknown compiler */ +# define COMPILER_ID "" +#endif + +/* Construct the string literal in pieces to prevent the source from + getting matched. Store it in a pointer rather than an array + because some compilers will just produce instructions to fill the + array rather than assigning a pointer to a static array. */ +char const* info_compiler = "INFO" ":" "compiler[" COMPILER_ID "]"; +#ifdef SIMULATE_ID +char const* info_simulate = "INFO" ":" "simulate[" SIMULATE_ID "]"; +#endif + +#ifdef __QNXNTO__ +char const* qnxnto = "INFO" ":" "qnxnto[]"; +#endif + +#if defined(__CRAYXT_COMPUTE_LINUX_TARGET) +char const *info_cray = "INFO" ":" "compiler_wrapper[CrayPrgEnv]"; +#endif + +#define STRINGIFY_HELPER(X) #X +#define STRINGIFY(X) STRINGIFY_HELPER(X) + +/* Identify known platforms by name. */ +#if defined(__linux) || defined(__linux__) || defined(linux) +# define PLATFORM_ID "Linux" + +#elif defined(__MSYS__) +# define PLATFORM_ID "MSYS" + +#elif defined(__CYGWIN__) +# define PLATFORM_ID "Cygwin" + +#elif defined(__MINGW32__) +# define PLATFORM_ID "MinGW" + +#elif defined(__APPLE__) +# define PLATFORM_ID "Darwin" + +#elif defined(_WIN32) || defined(__WIN32__) || defined(WIN32) +# define PLATFORM_ID "Windows" + +#elif defined(__FreeBSD__) || defined(__FreeBSD) +# define PLATFORM_ID "FreeBSD" + +#elif defined(__NetBSD__) || defined(__NetBSD) +# define PLATFORM_ID "NetBSD" + +#elif defined(__OpenBSD__) || defined(__OPENBSD) +# define PLATFORM_ID "OpenBSD" + +#elif defined(__sun) || defined(sun) +# define PLATFORM_ID "SunOS" + +#elif defined(_AIX) || defined(__AIX) || defined(__AIX__) || defined(__aix) || defined(__aix__) +# define PLATFORM_ID "AIX" + +#elif defined(__hpux) || defined(__hpux__) +# define PLATFORM_ID "HP-UX" + +#elif defined(__HAIKU__) +# define PLATFORM_ID "Haiku" + +#elif defined(__BeOS) || defined(__BEOS__) || defined(_BEOS) +# define PLATFORM_ID "BeOS" + +#elif defined(__QNX__) || defined(__QNXNTO__) +# define PLATFORM_ID "QNX" + +#elif defined(__tru64) || defined(_tru64) || defined(__TRU64__) +# define PLATFORM_ID "Tru64" + +#elif defined(__riscos) || defined(__riscos__) +# define PLATFORM_ID "RISCos" + +#elif defined(__sinix) || defined(__sinix__) || defined(__SINIX__) +# define PLATFORM_ID "SINIX" + +#elif defined(__UNIX_SV__) +# define PLATFORM_ID "UNIX_SV" + +#elif defined(__bsdos__) +# define PLATFORM_ID "BSDOS" + +#elif defined(_MPRAS) || defined(MPRAS) +# define PLATFORM_ID "MP-RAS" + +#elif defined(__osf) || defined(__osf__) +# define PLATFORM_ID "OSF1" + +#elif defined(_SCO_SV) || defined(SCO_SV) || defined(sco_sv) +# define PLATFORM_ID "SCO_SV" + +#elif defined(__ultrix) || defined(__ultrix__) || defined(_ULTRIX) +# define PLATFORM_ID "ULTRIX" + +#elif defined(__XENIX__) || defined(_XENIX) || defined(XENIX) +# define PLATFORM_ID "Xenix" + +#elif defined(__WATCOMC__) +# if defined(__LINUX__) +# define PLATFORM_ID "Linux" + +# elif defined(__DOS__) +# define PLATFORM_ID "DOS" + +# elif defined(__OS2__) +# define PLATFORM_ID "OS2" + +# elif defined(__WINDOWS__) +# define PLATFORM_ID "Windows3x" + +# elif defined(__VXWORKS__) +# define PLATFORM_ID "VxWorks" + +# else /* unknown platform */ +# define PLATFORM_ID +# endif + +#elif defined(__INTEGRITY) +# if defined(INT_178B) +# define PLATFORM_ID "Integrity178" + +# else /* regular Integrity */ +# define PLATFORM_ID "Integrity" +# endif + +# elif defined(_ADI_COMPILER) +# define PLATFORM_ID "ADSP" + +#else /* unknown platform */ +# define PLATFORM_ID + +#endif + +/* For windows compilers MSVC and Intel we can determine + the architecture of the compiler being used. This is because + the compilers do not have flags that can change the architecture, + but rather depend on which compiler is being used +*/ +#if defined(_WIN32) && defined(_MSC_VER) +# if defined(_M_IA64) +# define ARCHITECTURE_ID "IA64" + +# elif defined(_M_ARM64EC) +# define ARCHITECTURE_ID "ARM64EC" + +# elif defined(_M_X64) || defined(_M_AMD64) +# define ARCHITECTURE_ID "x64" + +# elif defined(_M_IX86) +# define ARCHITECTURE_ID "X86" + +# elif defined(_M_ARM64) +# define ARCHITECTURE_ID "ARM64" + +# elif defined(_M_ARM) +# if _M_ARM == 4 +# define ARCHITECTURE_ID "ARMV4I" +# elif _M_ARM == 5 +# define ARCHITECTURE_ID "ARMV5I" +# else +# define ARCHITECTURE_ID "ARMV" STRINGIFY(_M_ARM) +# endif + +# elif defined(_M_MIPS) +# define ARCHITECTURE_ID "MIPS" + +# elif defined(_M_SH) +# define ARCHITECTURE_ID "SHx" + +# else /* unknown architecture */ +# define ARCHITECTURE_ID "" +# endif + +#elif defined(__WATCOMC__) +# if defined(_M_I86) +# define ARCHITECTURE_ID "I86" + +# elif defined(_M_IX86) +# define ARCHITECTURE_ID "X86" + +# else /* unknown architecture */ +# define ARCHITECTURE_ID "" +# endif + +#elif defined(__IAR_SYSTEMS_ICC__) || defined(__IAR_SYSTEMS_ICC) +# if defined(__ICCARM__) +# define ARCHITECTURE_ID "ARM" + +# elif defined(__ICCRX__) +# define ARCHITECTURE_ID "RX" + +# elif defined(__ICCRH850__) +# define ARCHITECTURE_ID "RH850" + +# elif defined(__ICCRL78__) +# define ARCHITECTURE_ID "RL78" + +# elif defined(__ICCRISCV__) +# define ARCHITECTURE_ID "RISCV" + +# elif defined(__ICCAVR__) +# define ARCHITECTURE_ID "AVR" + +# elif defined(__ICC430__) +# define ARCHITECTURE_ID "MSP430" + +# elif defined(__ICCV850__) +# define ARCHITECTURE_ID "V850" + +# elif defined(__ICC8051__) +# define ARCHITECTURE_ID "8051" + +# elif defined(__ICCSTM8__) +# define ARCHITECTURE_ID "STM8" + +# else /* unknown architecture */ +# define ARCHITECTURE_ID "" +# endif + +#elif defined(__ghs__) +# if defined(__PPC64__) +# define ARCHITECTURE_ID "PPC64" + +# elif defined(__ppc__) +# define ARCHITECTURE_ID "PPC" + +# elif defined(__ARM__) +# define ARCHITECTURE_ID "ARM" + +# elif defined(__x86_64__) +# define ARCHITECTURE_ID "x64" + +# elif defined(__i386__) +# define ARCHITECTURE_ID "X86" + +# else /* unknown architecture */ +# define ARCHITECTURE_ID "" +# endif + +#elif defined(__clang__) && defined(__ti__) +# if defined(__ARM_ARCH) +# define ARCHITECTURE_ID "Arm" + +# else /* unknown architecture */ +# define ARCHITECTURE_ID "" +# endif + +#elif defined(__TI_COMPILER_VERSION__) +# if defined(__TI_ARM__) +# define ARCHITECTURE_ID "ARM" + +# elif defined(__MSP430__) +# define ARCHITECTURE_ID "MSP430" + +# elif defined(__TMS320C28XX__) +# define ARCHITECTURE_ID "TMS320C28x" + +# elif defined(__TMS320C6X__) || defined(_TMS320C6X) +# define ARCHITECTURE_ID "TMS320C6x" + +# else /* unknown architecture */ +# define ARCHITECTURE_ID "" +# endif + +# elif defined(__ADSPSHARC__) +# define ARCHITECTURE_ID "SHARC" + +# elif defined(__ADSPBLACKFIN__) +# define ARCHITECTURE_ID "Blackfin" + +#elif defined(__TASKING__) + +# if defined(__CTC__) || defined(__CPTC__) +# define ARCHITECTURE_ID "TriCore" + +# elif defined(__CMCS__) +# define ARCHITECTURE_ID "MCS" + +# elif defined(__CARM__) +# define ARCHITECTURE_ID "ARM" + +# elif defined(__CARC__) +# define ARCHITECTURE_ID "ARC" + +# elif defined(__C51__) +# define ARCHITECTURE_ID "8051" + +# elif defined(__CPCP__) +# define ARCHITECTURE_ID "PCP" + +# else +# define ARCHITECTURE_ID "" +# endif + +#else +# define ARCHITECTURE_ID +#endif + +/* Convert integer to decimal digit literals. */ +#define DEC(n) \ + ('0' + (((n) / 10000000)%10)), \ + ('0' + (((n) / 1000000)%10)), \ + ('0' + (((n) / 100000)%10)), \ + ('0' + (((n) / 10000)%10)), \ + ('0' + (((n) / 1000)%10)), \ + ('0' + (((n) / 100)%10)), \ + ('0' + (((n) / 10)%10)), \ + ('0' + ((n) % 10)) + +/* Convert integer to hex digit literals. */ +#define HEX(n) \ + ('0' + ((n)>>28 & 0xF)), \ + ('0' + ((n)>>24 & 0xF)), \ + ('0' + ((n)>>20 & 0xF)), \ + ('0' + ((n)>>16 & 0xF)), \ + ('0' + ((n)>>12 & 0xF)), \ + ('0' + ((n)>>8 & 0xF)), \ + ('0' + ((n)>>4 & 0xF)), \ + ('0' + ((n) & 0xF)) + +/* Construct a string literal encoding the version number. */ +#ifdef COMPILER_VERSION +char const* info_version = "INFO" ":" "compiler_version[" COMPILER_VERSION "]"; + +/* Construct a string literal encoding the version number components. */ +#elif defined(COMPILER_VERSION_MAJOR) +char const info_version[] = { + 'I', 'N', 'F', 'O', ':', + 'c','o','m','p','i','l','e','r','_','v','e','r','s','i','o','n','[', + COMPILER_VERSION_MAJOR, +# ifdef COMPILER_VERSION_MINOR + '.', COMPILER_VERSION_MINOR, +# ifdef COMPILER_VERSION_PATCH + '.', COMPILER_VERSION_PATCH, +# ifdef COMPILER_VERSION_TWEAK + '.', COMPILER_VERSION_TWEAK, +# endif +# endif +# endif + ']','\0'}; +#endif + +/* Construct a string literal encoding the internal version number. */ +#ifdef COMPILER_VERSION_INTERNAL +char const info_version_internal[] = { + 'I', 'N', 'F', 'O', ':', + 'c','o','m','p','i','l','e','r','_','v','e','r','s','i','o','n','_', + 'i','n','t','e','r','n','a','l','[', + COMPILER_VERSION_INTERNAL,']','\0'}; +#elif defined(COMPILER_VERSION_INTERNAL_STR) +char const* info_version_internal = "INFO" ":" "compiler_version_internal[" COMPILER_VERSION_INTERNAL_STR "]"; +#endif + +/* Construct a string literal encoding the version number components. */ +#ifdef SIMULATE_VERSION_MAJOR +char const info_simulate_version[] = { + 'I', 'N', 'F', 'O', ':', + 's','i','m','u','l','a','t','e','_','v','e','r','s','i','o','n','[', + SIMULATE_VERSION_MAJOR, +# ifdef SIMULATE_VERSION_MINOR + '.', SIMULATE_VERSION_MINOR, +# ifdef SIMULATE_VERSION_PATCH + '.', SIMULATE_VERSION_PATCH, +# ifdef SIMULATE_VERSION_TWEAK + '.', SIMULATE_VERSION_TWEAK, +# endif +# endif +# endif + ']','\0'}; +#endif + +/* Construct the string literal in pieces to prevent the source from + getting matched. Store it in a pointer rather than an array + because some compilers will just produce instructions to fill the + array rather than assigning a pointer to a static array. */ +char const* info_platform = "INFO" ":" "platform[" PLATFORM_ID "]"; +char const* info_arch = "INFO" ":" "arch[" ARCHITECTURE_ID "]"; + + + +#define C_STD_99 199901L +#define C_STD_11 201112L +#define C_STD_17 201710L +#define C_STD_23 202311L + +#ifdef __STDC_VERSION__ +# define C_STD __STDC_VERSION__ +#endif + +#if !defined(__STDC__) && !defined(__clang__) +# if defined(_MSC_VER) || defined(__ibmxl__) || defined(__IBMC__) +# define C_VERSION "90" +# else +# define C_VERSION +# endif +#elif C_STD > C_STD_17 +# define C_VERSION "23" +#elif C_STD > C_STD_11 +# define C_VERSION "17" +#elif C_STD > C_STD_99 +# define C_VERSION "11" +#elif C_STD >= C_STD_99 +# define C_VERSION "99" +#else +# define C_VERSION "90" +#endif +const char* info_language_standard_default = + "INFO" ":" "standard_default[" C_VERSION "]"; + +const char* info_language_extensions_default = "INFO" ":" "extensions_default[" +#if (defined(__clang__) || defined(__GNUC__) || defined(__xlC__) || \ + defined(__TI_COMPILER_VERSION__)) && \ + !defined(__STRICT_ANSI__) + "ON" +#else + "OFF" +#endif +"]"; + +/*--------------------------------------------------------------------------*/ + +#ifdef ID_VOID_MAIN +void main() {} +#else +# if defined(__CLASSIC_C__) +int main(argc, argv) int argc; char *argv[]; +# else +int main(int argc, char* argv[]) +# endif +{ + int require = 0; + require += info_compiler[argc]; + require += info_platform[argc]; + require += info_arch[argc]; +#ifdef COMPILER_VERSION_MAJOR + require += info_version[argc]; +#endif +#ifdef COMPILER_VERSION_INTERNAL + require += info_version_internal[argc]; +#endif +#ifdef SIMULATE_ID + require += info_simulate[argc]; +#endif +#ifdef SIMULATE_VERSION_MAJOR + require += info_simulate_version[argc]; +#endif +#if defined(__CRAYXT_COMPUTE_LINUX_TARGET) + require += info_cray[argc]; +#endif + require += info_language_standard_default[argc]; + require += info_language_extensions_default[argc]; + (void)argv; + return require; +} +#endif diff --git a/siro_driver/android/app/.cxx/Debug/2j1f5m6a/x86/CMakeFiles/3.31.5-g6cf5163/CompilerIdC/CMakeCCompilerId.o b/siro_driver/android/app/.cxx/Debug/2j1f5m6a/x86/CMakeFiles/3.31.5-g6cf5163/CompilerIdC/CMakeCCompilerId.o new file mode 100644 index 0000000..5ee2b7b Binary files /dev/null and b/siro_driver/android/app/.cxx/Debug/2j1f5m6a/x86/CMakeFiles/3.31.5-g6cf5163/CompilerIdC/CMakeCCompilerId.o differ diff --git a/siro_driver/android/app/.cxx/Debug/2j1f5m6a/x86/CMakeFiles/3.31.5-g6cf5163/CompilerIdCXX/CMakeCXXCompilerId.cpp b/siro_driver/android/app/.cxx/Debug/2j1f5m6a/x86/CMakeFiles/3.31.5-g6cf5163/CompilerIdCXX/CMakeCXXCompilerId.cpp new file mode 100644 index 0000000..da6c824 --- /dev/null +++ b/siro_driver/android/app/.cxx/Debug/2j1f5m6a/x86/CMakeFiles/3.31.5-g6cf5163/CompilerIdCXX/CMakeCXXCompilerId.cpp @@ -0,0 +1,919 @@ +/* This source file must have a .cpp extension so that all C++ compilers + recognize the extension without flags. Borland does not know .cxx for + example. */ +#ifndef __cplusplus +# error "A C compiler has been selected for C++." +#endif + +#if !defined(__has_include) +/* If the compiler does not have __has_include, pretend the answer is + always no. */ +# define __has_include(x) 0 +#endif + + +/* Version number components: V=Version, R=Revision, P=Patch + Version date components: YYYY=Year, MM=Month, DD=Day */ + +#if defined(__INTEL_COMPILER) || defined(__ICC) +# define COMPILER_ID "Intel" +# if defined(_MSC_VER) +# define SIMULATE_ID "MSVC" +# endif +# if defined(__GNUC__) +# define SIMULATE_ID "GNU" +# endif + /* __INTEL_COMPILER = VRP prior to 2021, and then VVVV for 2021 and later, + except that a few beta releases use the old format with V=2021. */ +# if __INTEL_COMPILER < 2021 || __INTEL_COMPILER == 202110 || __INTEL_COMPILER == 202111 +# define COMPILER_VERSION_MAJOR DEC(__INTEL_COMPILER/100) +# define COMPILER_VERSION_MINOR DEC(__INTEL_COMPILER/10 % 10) +# if defined(__INTEL_COMPILER_UPDATE) +# define COMPILER_VERSION_PATCH DEC(__INTEL_COMPILER_UPDATE) +# else +# define COMPILER_VERSION_PATCH DEC(__INTEL_COMPILER % 10) +# endif +# else +# define COMPILER_VERSION_MAJOR DEC(__INTEL_COMPILER) +# define COMPILER_VERSION_MINOR DEC(__INTEL_COMPILER_UPDATE) + /* The third version component from --version is an update index, + but no macro is provided for it. */ +# define COMPILER_VERSION_PATCH DEC(0) +# endif +# if defined(__INTEL_COMPILER_BUILD_DATE) + /* __INTEL_COMPILER_BUILD_DATE = YYYYMMDD */ +# define COMPILER_VERSION_TWEAK DEC(__INTEL_COMPILER_BUILD_DATE) +# endif +# if defined(_MSC_VER) + /* _MSC_VER = VVRR */ +# define SIMULATE_VERSION_MAJOR DEC(_MSC_VER / 100) +# define SIMULATE_VERSION_MINOR DEC(_MSC_VER % 100) +# endif +# if defined(__GNUC__) +# define SIMULATE_VERSION_MAJOR DEC(__GNUC__) +# elif defined(__GNUG__) +# define SIMULATE_VERSION_MAJOR DEC(__GNUG__) +# endif +# if defined(__GNUC_MINOR__) +# define SIMULATE_VERSION_MINOR DEC(__GNUC_MINOR__) +# endif +# if defined(__GNUC_PATCHLEVEL__) +# define SIMULATE_VERSION_PATCH DEC(__GNUC_PATCHLEVEL__) +# endif + +#elif (defined(__clang__) && defined(__INTEL_CLANG_COMPILER)) || defined(__INTEL_LLVM_COMPILER) +# define COMPILER_ID "IntelLLVM" +#if defined(_MSC_VER) +# define SIMULATE_ID "MSVC" +#endif +#if defined(__GNUC__) +# define SIMULATE_ID "GNU" +#endif +/* __INTEL_LLVM_COMPILER = VVVVRP prior to 2021.2.0, VVVVRRPP for 2021.2.0 and + * later. Look for 6 digit vs. 8 digit version number to decide encoding. + * VVVV is no smaller than the current year when a version is released. + */ +#if __INTEL_LLVM_COMPILER < 1000000L +# define COMPILER_VERSION_MAJOR DEC(__INTEL_LLVM_COMPILER/100) +# define COMPILER_VERSION_MINOR DEC(__INTEL_LLVM_COMPILER/10 % 10) +# define COMPILER_VERSION_PATCH DEC(__INTEL_LLVM_COMPILER % 10) +#else +# define COMPILER_VERSION_MAJOR DEC(__INTEL_LLVM_COMPILER/10000) +# define COMPILER_VERSION_MINOR DEC(__INTEL_LLVM_COMPILER/100 % 100) +# define COMPILER_VERSION_PATCH DEC(__INTEL_LLVM_COMPILER % 100) +#endif +#if defined(_MSC_VER) + /* _MSC_VER = VVRR */ +# define SIMULATE_VERSION_MAJOR DEC(_MSC_VER / 100) +# define SIMULATE_VERSION_MINOR DEC(_MSC_VER % 100) +#endif +#if defined(__GNUC__) +# define SIMULATE_VERSION_MAJOR DEC(__GNUC__) +#elif defined(__GNUG__) +# define SIMULATE_VERSION_MAJOR DEC(__GNUG__) +#endif +#if defined(__GNUC_MINOR__) +# define SIMULATE_VERSION_MINOR DEC(__GNUC_MINOR__) +#endif +#if defined(__GNUC_PATCHLEVEL__) +# define SIMULATE_VERSION_PATCH DEC(__GNUC_PATCHLEVEL__) +#endif + +#elif defined(__PATHCC__) +# define COMPILER_ID "PathScale" +# define COMPILER_VERSION_MAJOR DEC(__PATHCC__) +# define COMPILER_VERSION_MINOR DEC(__PATHCC_MINOR__) +# if defined(__PATHCC_PATCHLEVEL__) +# define COMPILER_VERSION_PATCH DEC(__PATHCC_PATCHLEVEL__) +# endif + +#elif defined(__BORLANDC__) && defined(__CODEGEARC_VERSION__) +# define COMPILER_ID "Embarcadero" +# define COMPILER_VERSION_MAJOR HEX(__CODEGEARC_VERSION__>>24 & 0x00FF) +# define COMPILER_VERSION_MINOR HEX(__CODEGEARC_VERSION__>>16 & 0x00FF) +# define COMPILER_VERSION_PATCH DEC(__CODEGEARC_VERSION__ & 0xFFFF) + +#elif defined(__BORLANDC__) +# define COMPILER_ID "Borland" + /* __BORLANDC__ = 0xVRR */ +# define COMPILER_VERSION_MAJOR HEX(__BORLANDC__>>8) +# define COMPILER_VERSION_MINOR HEX(__BORLANDC__ & 0xFF) + +#elif defined(__WATCOMC__) && __WATCOMC__ < 1200 +# define COMPILER_ID "Watcom" + /* __WATCOMC__ = VVRR */ +# define COMPILER_VERSION_MAJOR DEC(__WATCOMC__ / 100) +# define COMPILER_VERSION_MINOR DEC((__WATCOMC__ / 10) % 10) +# if (__WATCOMC__ % 10) > 0 +# define COMPILER_VERSION_PATCH DEC(__WATCOMC__ % 10) +# endif + +#elif defined(__WATCOMC__) +# define COMPILER_ID "OpenWatcom" + /* __WATCOMC__ = VVRP + 1100 */ +# define COMPILER_VERSION_MAJOR DEC((__WATCOMC__ - 1100) / 100) +# define COMPILER_VERSION_MINOR DEC((__WATCOMC__ / 10) % 10) +# if (__WATCOMC__ % 10) > 0 +# define COMPILER_VERSION_PATCH DEC(__WATCOMC__ % 10) +# endif + +#elif defined(__SUNPRO_CC) +# define COMPILER_ID "SunPro" +# if __SUNPRO_CC >= 0x5100 + /* __SUNPRO_CC = 0xVRRP */ +# define COMPILER_VERSION_MAJOR HEX(__SUNPRO_CC>>12) +# define COMPILER_VERSION_MINOR HEX(__SUNPRO_CC>>4 & 0xFF) +# define COMPILER_VERSION_PATCH HEX(__SUNPRO_CC & 0xF) +# else + /* __SUNPRO_CC = 0xVRP */ +# define COMPILER_VERSION_MAJOR HEX(__SUNPRO_CC>>8) +# define COMPILER_VERSION_MINOR HEX(__SUNPRO_CC>>4 & 0xF) +# define COMPILER_VERSION_PATCH HEX(__SUNPRO_CC & 0xF) +# endif + +#elif defined(__HP_aCC) +# define COMPILER_ID "HP" + /* __HP_aCC = VVRRPP */ +# define COMPILER_VERSION_MAJOR DEC(__HP_aCC/10000) +# define COMPILER_VERSION_MINOR DEC(__HP_aCC/100 % 100) +# define COMPILER_VERSION_PATCH DEC(__HP_aCC % 100) + +#elif defined(__DECCXX) +# define COMPILER_ID "Compaq" + /* __DECCXX_VER = VVRRTPPPP */ +# define COMPILER_VERSION_MAJOR DEC(__DECCXX_VER/10000000) +# define COMPILER_VERSION_MINOR DEC(__DECCXX_VER/100000 % 100) +# define COMPILER_VERSION_PATCH DEC(__DECCXX_VER % 10000) + +#elif defined(__IBMCPP__) && defined(__COMPILER_VER__) +# define COMPILER_ID "zOS" + /* __IBMCPP__ = VRP */ +# define COMPILER_VERSION_MAJOR DEC(__IBMCPP__/100) +# define COMPILER_VERSION_MINOR DEC(__IBMCPP__/10 % 10) +# define COMPILER_VERSION_PATCH DEC(__IBMCPP__ % 10) + +#elif defined(__open_xl__) && defined(__clang__) +# define COMPILER_ID "IBMClang" +# define COMPILER_VERSION_MAJOR DEC(__open_xl_version__) +# define COMPILER_VERSION_MINOR DEC(__open_xl_release__) +# define COMPILER_VERSION_PATCH DEC(__open_xl_modification__) +# define COMPILER_VERSION_TWEAK DEC(__open_xl_ptf_fix_level__) + + +#elif defined(__ibmxl__) && defined(__clang__) +# define COMPILER_ID "XLClang" +# define COMPILER_VERSION_MAJOR DEC(__ibmxl_version__) +# define COMPILER_VERSION_MINOR DEC(__ibmxl_release__) +# define COMPILER_VERSION_PATCH DEC(__ibmxl_modification__) +# define COMPILER_VERSION_TWEAK DEC(__ibmxl_ptf_fix_level__) + + +#elif defined(__IBMCPP__) && !defined(__COMPILER_VER__) && __IBMCPP__ >= 800 +# define COMPILER_ID "XL" + /* __IBMCPP__ = VRP */ +# define COMPILER_VERSION_MAJOR DEC(__IBMCPP__/100) +# define COMPILER_VERSION_MINOR DEC(__IBMCPP__/10 % 10) +# define COMPILER_VERSION_PATCH DEC(__IBMCPP__ % 10) + +#elif defined(__IBMCPP__) && !defined(__COMPILER_VER__) && __IBMCPP__ < 800 +# define COMPILER_ID "VisualAge" + /* __IBMCPP__ = VRP */ +# define COMPILER_VERSION_MAJOR DEC(__IBMCPP__/100) +# define COMPILER_VERSION_MINOR DEC(__IBMCPP__/10 % 10) +# define COMPILER_VERSION_PATCH DEC(__IBMCPP__ % 10) + +#elif defined(__NVCOMPILER) +# define COMPILER_ID "NVHPC" +# define COMPILER_VERSION_MAJOR DEC(__NVCOMPILER_MAJOR__) +# define COMPILER_VERSION_MINOR DEC(__NVCOMPILER_MINOR__) +# if defined(__NVCOMPILER_PATCHLEVEL__) +# define COMPILER_VERSION_PATCH DEC(__NVCOMPILER_PATCHLEVEL__) +# endif + +#elif defined(__PGI) +# define COMPILER_ID "PGI" +# define COMPILER_VERSION_MAJOR DEC(__PGIC__) +# define COMPILER_VERSION_MINOR DEC(__PGIC_MINOR__) +# if defined(__PGIC_PATCHLEVEL__) +# define COMPILER_VERSION_PATCH DEC(__PGIC_PATCHLEVEL__) +# endif + +#elif defined(__clang__) && defined(__cray__) +# define COMPILER_ID "CrayClang" +# define COMPILER_VERSION_MAJOR DEC(__cray_major__) +# define COMPILER_VERSION_MINOR DEC(__cray_minor__) +# define COMPILER_VERSION_PATCH DEC(__cray_patchlevel__) +# define COMPILER_VERSION_INTERNAL_STR __clang_version__ + + +#elif defined(_CRAYC) +# define COMPILER_ID "Cray" +# define COMPILER_VERSION_MAJOR DEC(_RELEASE_MAJOR) +# define COMPILER_VERSION_MINOR DEC(_RELEASE_MINOR) + +#elif defined(__TI_COMPILER_VERSION__) +# define COMPILER_ID "TI" + /* __TI_COMPILER_VERSION__ = VVVRRRPPP */ +# define COMPILER_VERSION_MAJOR DEC(__TI_COMPILER_VERSION__/1000000) +# define COMPILER_VERSION_MINOR DEC(__TI_COMPILER_VERSION__/1000 % 1000) +# define COMPILER_VERSION_PATCH DEC(__TI_COMPILER_VERSION__ % 1000) + +#elif defined(__CLANG_FUJITSU) +# define COMPILER_ID "FujitsuClang" +# define COMPILER_VERSION_MAJOR DEC(__FCC_major__) +# define COMPILER_VERSION_MINOR DEC(__FCC_minor__) +# define COMPILER_VERSION_PATCH DEC(__FCC_patchlevel__) +# define COMPILER_VERSION_INTERNAL_STR __clang_version__ + + +#elif defined(__FUJITSU) +# define COMPILER_ID "Fujitsu" +# if defined(__FCC_version__) +# define COMPILER_VERSION __FCC_version__ +# elif defined(__FCC_major__) +# define COMPILER_VERSION_MAJOR DEC(__FCC_major__) +# define COMPILER_VERSION_MINOR DEC(__FCC_minor__) +# define COMPILER_VERSION_PATCH DEC(__FCC_patchlevel__) +# endif +# if defined(__fcc_version) +# define COMPILER_VERSION_INTERNAL DEC(__fcc_version) +# elif defined(__FCC_VERSION) +# define COMPILER_VERSION_INTERNAL DEC(__FCC_VERSION) +# endif + + +#elif defined(__ghs__) +# define COMPILER_ID "GHS" +/* __GHS_VERSION_NUMBER = VVVVRP */ +# ifdef __GHS_VERSION_NUMBER +# define COMPILER_VERSION_MAJOR DEC(__GHS_VERSION_NUMBER / 100) +# define COMPILER_VERSION_MINOR DEC(__GHS_VERSION_NUMBER / 10 % 10) +# define COMPILER_VERSION_PATCH DEC(__GHS_VERSION_NUMBER % 10) +# endif + +#elif defined(__TASKING__) +# define COMPILER_ID "Tasking" + # define COMPILER_VERSION_MAJOR DEC(__VERSION__/1000) + # define COMPILER_VERSION_MINOR DEC(__VERSION__ % 100) +# define COMPILER_VERSION_INTERNAL DEC(__VERSION__) + +#elif defined(__ORANGEC__) +# define COMPILER_ID "OrangeC" +# define COMPILER_VERSION_MAJOR DEC(__ORANGEC_MAJOR__) +# define COMPILER_VERSION_MINOR DEC(__ORANGEC_MINOR__) +# define COMPILER_VERSION_PATCH DEC(__ORANGEC_PATCHLEVEL__) + +#elif defined(__SCO_VERSION__) +# define COMPILER_ID "SCO" + +#elif defined(__ARMCC_VERSION) && !defined(__clang__) +# define COMPILER_ID "ARMCC" +#if __ARMCC_VERSION >= 1000000 + /* __ARMCC_VERSION = VRRPPPP */ + # define COMPILER_VERSION_MAJOR DEC(__ARMCC_VERSION/1000000) + # define COMPILER_VERSION_MINOR DEC(__ARMCC_VERSION/10000 % 100) + # define COMPILER_VERSION_PATCH DEC(__ARMCC_VERSION % 10000) +#else + /* __ARMCC_VERSION = VRPPPP */ + # define COMPILER_VERSION_MAJOR DEC(__ARMCC_VERSION/100000) + # define COMPILER_VERSION_MINOR DEC(__ARMCC_VERSION/10000 % 10) + # define COMPILER_VERSION_PATCH DEC(__ARMCC_VERSION % 10000) +#endif + + +#elif defined(__clang__) && defined(__apple_build_version__) +# define COMPILER_ID "AppleClang" +# if defined(_MSC_VER) +# define SIMULATE_ID "MSVC" +# endif +# define COMPILER_VERSION_MAJOR DEC(__clang_major__) +# define COMPILER_VERSION_MINOR DEC(__clang_minor__) +# define COMPILER_VERSION_PATCH DEC(__clang_patchlevel__) +# if defined(_MSC_VER) + /* _MSC_VER = VVRR */ +# define SIMULATE_VERSION_MAJOR DEC(_MSC_VER / 100) +# define SIMULATE_VERSION_MINOR DEC(_MSC_VER % 100) +# endif +# define COMPILER_VERSION_TWEAK DEC(__apple_build_version__) + +#elif defined(__clang__) && defined(__ARMCOMPILER_VERSION) +# define COMPILER_ID "ARMClang" + # define COMPILER_VERSION_MAJOR DEC(__ARMCOMPILER_VERSION/1000000) + # define COMPILER_VERSION_MINOR DEC(__ARMCOMPILER_VERSION/10000 % 100) + # define COMPILER_VERSION_PATCH DEC(__ARMCOMPILER_VERSION/100 % 100) +# define COMPILER_VERSION_INTERNAL DEC(__ARMCOMPILER_VERSION) + +#elif defined(__clang__) && defined(__ti__) +# define COMPILER_ID "TIClang" + # define COMPILER_VERSION_MAJOR DEC(__ti_major__) + # define COMPILER_VERSION_MINOR DEC(__ti_minor__) + # define COMPILER_VERSION_PATCH DEC(__ti_patchlevel__) +# define COMPILER_VERSION_INTERNAL DEC(__ti_version__) + +#elif defined(__clang__) +# define COMPILER_ID "Clang" +# if defined(_MSC_VER) +# define SIMULATE_ID "MSVC" +# endif +# define COMPILER_VERSION_MAJOR DEC(__clang_major__) +# define COMPILER_VERSION_MINOR DEC(__clang_minor__) +# define COMPILER_VERSION_PATCH DEC(__clang_patchlevel__) +# if defined(_MSC_VER) + /* _MSC_VER = VVRR */ +# define SIMULATE_VERSION_MAJOR DEC(_MSC_VER / 100) +# define SIMULATE_VERSION_MINOR DEC(_MSC_VER % 100) +# endif + +#elif defined(__LCC__) && (defined(__GNUC__) || defined(__GNUG__) || defined(__MCST__)) +# define COMPILER_ID "LCC" +# define COMPILER_VERSION_MAJOR DEC(__LCC__ / 100) +# define COMPILER_VERSION_MINOR DEC(__LCC__ % 100) +# if defined(__LCC_MINOR__) +# define COMPILER_VERSION_PATCH DEC(__LCC_MINOR__) +# endif +# if defined(__GNUC__) && defined(__GNUC_MINOR__) +# define SIMULATE_ID "GNU" +# define SIMULATE_VERSION_MAJOR DEC(__GNUC__) +# define SIMULATE_VERSION_MINOR DEC(__GNUC_MINOR__) +# if defined(__GNUC_PATCHLEVEL__) +# define SIMULATE_VERSION_PATCH DEC(__GNUC_PATCHLEVEL__) +# endif +# endif + +#elif defined(__GNUC__) || defined(__GNUG__) +# define COMPILER_ID "GNU" +# if defined(__GNUC__) +# define COMPILER_VERSION_MAJOR DEC(__GNUC__) +# else +# define COMPILER_VERSION_MAJOR DEC(__GNUG__) +# endif +# if defined(__GNUC_MINOR__) +# define COMPILER_VERSION_MINOR DEC(__GNUC_MINOR__) +# endif +# if defined(__GNUC_PATCHLEVEL__) +# define COMPILER_VERSION_PATCH DEC(__GNUC_PATCHLEVEL__) +# endif + +#elif defined(_MSC_VER) +# define COMPILER_ID "MSVC" + /* _MSC_VER = VVRR */ +# define COMPILER_VERSION_MAJOR DEC(_MSC_VER / 100) +# define COMPILER_VERSION_MINOR DEC(_MSC_VER % 100) +# if defined(_MSC_FULL_VER) +# if _MSC_VER >= 1400 + /* _MSC_FULL_VER = VVRRPPPPP */ +# define COMPILER_VERSION_PATCH DEC(_MSC_FULL_VER % 100000) +# else + /* _MSC_FULL_VER = VVRRPPPP */ +# define COMPILER_VERSION_PATCH DEC(_MSC_FULL_VER % 10000) +# endif +# endif +# if defined(_MSC_BUILD) +# define COMPILER_VERSION_TWEAK DEC(_MSC_BUILD) +# endif + +#elif defined(_ADI_COMPILER) +# define COMPILER_ID "ADSP" +#if defined(__VERSIONNUM__) + /* __VERSIONNUM__ = 0xVVRRPPTT */ +# define COMPILER_VERSION_MAJOR DEC(__VERSIONNUM__ >> 24 & 0xFF) +# define COMPILER_VERSION_MINOR DEC(__VERSIONNUM__ >> 16 & 0xFF) +# define COMPILER_VERSION_PATCH DEC(__VERSIONNUM__ >> 8 & 0xFF) +# define COMPILER_VERSION_TWEAK DEC(__VERSIONNUM__ & 0xFF) +#endif + +#elif defined(__IAR_SYSTEMS_ICC__) || defined(__IAR_SYSTEMS_ICC) +# define COMPILER_ID "IAR" +# if defined(__VER__) && defined(__ICCARM__) +# define COMPILER_VERSION_MAJOR DEC((__VER__) / 1000000) +# define COMPILER_VERSION_MINOR DEC(((__VER__) / 1000) % 1000) +# define COMPILER_VERSION_PATCH DEC((__VER__) % 1000) +# define COMPILER_VERSION_INTERNAL DEC(__IAR_SYSTEMS_ICC__) +# elif defined(__VER__) && (defined(__ICCAVR__) || defined(__ICCRX__) || defined(__ICCRH850__) || defined(__ICCRL78__) || defined(__ICC430__) || defined(__ICCRISCV__) || defined(__ICCV850__) || defined(__ICC8051__) || defined(__ICCSTM8__)) +# define COMPILER_VERSION_MAJOR DEC((__VER__) / 100) +# define COMPILER_VERSION_MINOR DEC((__VER__) - (((__VER__) / 100)*100)) +# define COMPILER_VERSION_PATCH DEC(__SUBVERSION__) +# define COMPILER_VERSION_INTERNAL DEC(__IAR_SYSTEMS_ICC__) +# endif + + +/* These compilers are either not known or too old to define an + identification macro. Try to identify the platform and guess that + it is the native compiler. */ +#elif defined(__hpux) || defined(__hpua) +# define COMPILER_ID "HP" + +#else /* unknown compiler */ +# define COMPILER_ID "" +#endif + +/* Construct the string literal in pieces to prevent the source from + getting matched. Store it in a pointer rather than an array + because some compilers will just produce instructions to fill the + array rather than assigning a pointer to a static array. */ +char const* info_compiler = "INFO" ":" "compiler[" COMPILER_ID "]"; +#ifdef SIMULATE_ID +char const* info_simulate = "INFO" ":" "simulate[" SIMULATE_ID "]"; +#endif + +#ifdef __QNXNTO__ +char const* qnxnto = "INFO" ":" "qnxnto[]"; +#endif + +#if defined(__CRAYXT_COMPUTE_LINUX_TARGET) +char const *info_cray = "INFO" ":" "compiler_wrapper[CrayPrgEnv]"; +#endif + +#define STRINGIFY_HELPER(X) #X +#define STRINGIFY(X) STRINGIFY_HELPER(X) + +/* Identify known platforms by name. */ +#if defined(__linux) || defined(__linux__) || defined(linux) +# define PLATFORM_ID "Linux" + +#elif defined(__MSYS__) +# define PLATFORM_ID "MSYS" + +#elif defined(__CYGWIN__) +# define PLATFORM_ID "Cygwin" + +#elif defined(__MINGW32__) +# define PLATFORM_ID "MinGW" + +#elif defined(__APPLE__) +# define PLATFORM_ID "Darwin" + +#elif defined(_WIN32) || defined(__WIN32__) || defined(WIN32) +# define PLATFORM_ID "Windows" + +#elif defined(__FreeBSD__) || defined(__FreeBSD) +# define PLATFORM_ID "FreeBSD" + +#elif defined(__NetBSD__) || defined(__NetBSD) +# define PLATFORM_ID "NetBSD" + +#elif defined(__OpenBSD__) || defined(__OPENBSD) +# define PLATFORM_ID "OpenBSD" + +#elif defined(__sun) || defined(sun) +# define PLATFORM_ID "SunOS" + +#elif defined(_AIX) || defined(__AIX) || defined(__AIX__) || defined(__aix) || defined(__aix__) +# define PLATFORM_ID "AIX" + +#elif defined(__hpux) || defined(__hpux__) +# define PLATFORM_ID "HP-UX" + +#elif defined(__HAIKU__) +# define PLATFORM_ID "Haiku" + +#elif defined(__BeOS) || defined(__BEOS__) || defined(_BEOS) +# define PLATFORM_ID "BeOS" + +#elif defined(__QNX__) || defined(__QNXNTO__) +# define PLATFORM_ID "QNX" + +#elif defined(__tru64) || defined(_tru64) || defined(__TRU64__) +# define PLATFORM_ID "Tru64" + +#elif defined(__riscos) || defined(__riscos__) +# define PLATFORM_ID "RISCos" + +#elif defined(__sinix) || defined(__sinix__) || defined(__SINIX__) +# define PLATFORM_ID "SINIX" + +#elif defined(__UNIX_SV__) +# define PLATFORM_ID "UNIX_SV" + +#elif defined(__bsdos__) +# define PLATFORM_ID "BSDOS" + +#elif defined(_MPRAS) || defined(MPRAS) +# define PLATFORM_ID "MP-RAS" + +#elif defined(__osf) || defined(__osf__) +# define PLATFORM_ID "OSF1" + +#elif defined(_SCO_SV) || defined(SCO_SV) || defined(sco_sv) +# define PLATFORM_ID "SCO_SV" + +#elif defined(__ultrix) || defined(__ultrix__) || defined(_ULTRIX) +# define PLATFORM_ID "ULTRIX" + +#elif defined(__XENIX__) || defined(_XENIX) || defined(XENIX) +# define PLATFORM_ID "Xenix" + +#elif defined(__WATCOMC__) +# if defined(__LINUX__) +# define PLATFORM_ID "Linux" + +# elif defined(__DOS__) +# define PLATFORM_ID "DOS" + +# elif defined(__OS2__) +# define PLATFORM_ID "OS2" + +# elif defined(__WINDOWS__) +# define PLATFORM_ID "Windows3x" + +# elif defined(__VXWORKS__) +# define PLATFORM_ID "VxWorks" + +# else /* unknown platform */ +# define PLATFORM_ID +# endif + +#elif defined(__INTEGRITY) +# if defined(INT_178B) +# define PLATFORM_ID "Integrity178" + +# else /* regular Integrity */ +# define PLATFORM_ID "Integrity" +# endif + +# elif defined(_ADI_COMPILER) +# define PLATFORM_ID "ADSP" + +#else /* unknown platform */ +# define PLATFORM_ID + +#endif + +/* For windows compilers MSVC and Intel we can determine + the architecture of the compiler being used. This is because + the compilers do not have flags that can change the architecture, + but rather depend on which compiler is being used +*/ +#if defined(_WIN32) && defined(_MSC_VER) +# if defined(_M_IA64) +# define ARCHITECTURE_ID "IA64" + +# elif defined(_M_ARM64EC) +# define ARCHITECTURE_ID "ARM64EC" + +# elif defined(_M_X64) || defined(_M_AMD64) +# define ARCHITECTURE_ID "x64" + +# elif defined(_M_IX86) +# define ARCHITECTURE_ID "X86" + +# elif defined(_M_ARM64) +# define ARCHITECTURE_ID "ARM64" + +# elif defined(_M_ARM) +# if _M_ARM == 4 +# define ARCHITECTURE_ID "ARMV4I" +# elif _M_ARM == 5 +# define ARCHITECTURE_ID "ARMV5I" +# else +# define ARCHITECTURE_ID "ARMV" STRINGIFY(_M_ARM) +# endif + +# elif defined(_M_MIPS) +# define ARCHITECTURE_ID "MIPS" + +# elif defined(_M_SH) +# define ARCHITECTURE_ID "SHx" + +# else /* unknown architecture */ +# define ARCHITECTURE_ID "" +# endif + +#elif defined(__WATCOMC__) +# if defined(_M_I86) +# define ARCHITECTURE_ID "I86" + +# elif defined(_M_IX86) +# define ARCHITECTURE_ID "X86" + +# else /* unknown architecture */ +# define ARCHITECTURE_ID "" +# endif + +#elif defined(__IAR_SYSTEMS_ICC__) || defined(__IAR_SYSTEMS_ICC) +# if defined(__ICCARM__) +# define ARCHITECTURE_ID "ARM" + +# elif defined(__ICCRX__) +# define ARCHITECTURE_ID "RX" + +# elif defined(__ICCRH850__) +# define ARCHITECTURE_ID "RH850" + +# elif defined(__ICCRL78__) +# define ARCHITECTURE_ID "RL78" + +# elif defined(__ICCRISCV__) +# define ARCHITECTURE_ID "RISCV" + +# elif defined(__ICCAVR__) +# define ARCHITECTURE_ID "AVR" + +# elif defined(__ICC430__) +# define ARCHITECTURE_ID "MSP430" + +# elif defined(__ICCV850__) +# define ARCHITECTURE_ID "V850" + +# elif defined(__ICC8051__) +# define ARCHITECTURE_ID "8051" + +# elif defined(__ICCSTM8__) +# define ARCHITECTURE_ID "STM8" + +# else /* unknown architecture */ +# define ARCHITECTURE_ID "" +# endif + +#elif defined(__ghs__) +# if defined(__PPC64__) +# define ARCHITECTURE_ID "PPC64" + +# elif defined(__ppc__) +# define ARCHITECTURE_ID "PPC" + +# elif defined(__ARM__) +# define ARCHITECTURE_ID "ARM" + +# elif defined(__x86_64__) +# define ARCHITECTURE_ID "x64" + +# elif defined(__i386__) +# define ARCHITECTURE_ID "X86" + +# else /* unknown architecture */ +# define ARCHITECTURE_ID "" +# endif + +#elif defined(__clang__) && defined(__ti__) +# if defined(__ARM_ARCH) +# define ARCHITECTURE_ID "Arm" + +# else /* unknown architecture */ +# define ARCHITECTURE_ID "" +# endif + +#elif defined(__TI_COMPILER_VERSION__) +# if defined(__TI_ARM__) +# define ARCHITECTURE_ID "ARM" + +# elif defined(__MSP430__) +# define ARCHITECTURE_ID "MSP430" + +# elif defined(__TMS320C28XX__) +# define ARCHITECTURE_ID "TMS320C28x" + +# elif defined(__TMS320C6X__) || defined(_TMS320C6X) +# define ARCHITECTURE_ID "TMS320C6x" + +# else /* unknown architecture */ +# define ARCHITECTURE_ID "" +# endif + +# elif defined(__ADSPSHARC__) +# define ARCHITECTURE_ID "SHARC" + +# elif defined(__ADSPBLACKFIN__) +# define ARCHITECTURE_ID "Blackfin" + +#elif defined(__TASKING__) + +# if defined(__CTC__) || defined(__CPTC__) +# define ARCHITECTURE_ID "TriCore" + +# elif defined(__CMCS__) +# define ARCHITECTURE_ID "MCS" + +# elif defined(__CARM__) +# define ARCHITECTURE_ID "ARM" + +# elif defined(__CARC__) +# define ARCHITECTURE_ID "ARC" + +# elif defined(__C51__) +# define ARCHITECTURE_ID "8051" + +# elif defined(__CPCP__) +# define ARCHITECTURE_ID "PCP" + +# else +# define ARCHITECTURE_ID "" +# endif + +#else +# define ARCHITECTURE_ID +#endif + +/* Convert integer to decimal digit literals. */ +#define DEC(n) \ + ('0' + (((n) / 10000000)%10)), \ + ('0' + (((n) / 1000000)%10)), \ + ('0' + (((n) / 100000)%10)), \ + ('0' + (((n) / 10000)%10)), \ + ('0' + (((n) / 1000)%10)), \ + ('0' + (((n) / 100)%10)), \ + ('0' + (((n) / 10)%10)), \ + ('0' + ((n) % 10)) + +/* Convert integer to hex digit literals. */ +#define HEX(n) \ + ('0' + ((n)>>28 & 0xF)), \ + ('0' + ((n)>>24 & 0xF)), \ + ('0' + ((n)>>20 & 0xF)), \ + ('0' + ((n)>>16 & 0xF)), \ + ('0' + ((n)>>12 & 0xF)), \ + ('0' + ((n)>>8 & 0xF)), \ + ('0' + ((n)>>4 & 0xF)), \ + ('0' + ((n) & 0xF)) + +/* Construct a string literal encoding the version number. */ +#ifdef COMPILER_VERSION +char const* info_version = "INFO" ":" "compiler_version[" COMPILER_VERSION "]"; + +/* Construct a string literal encoding the version number components. */ +#elif defined(COMPILER_VERSION_MAJOR) +char const info_version[] = { + 'I', 'N', 'F', 'O', ':', + 'c','o','m','p','i','l','e','r','_','v','e','r','s','i','o','n','[', + COMPILER_VERSION_MAJOR, +# ifdef COMPILER_VERSION_MINOR + '.', COMPILER_VERSION_MINOR, +# ifdef COMPILER_VERSION_PATCH + '.', COMPILER_VERSION_PATCH, +# ifdef COMPILER_VERSION_TWEAK + '.', COMPILER_VERSION_TWEAK, +# endif +# endif +# endif + ']','\0'}; +#endif + +/* Construct a string literal encoding the internal version number. */ +#ifdef COMPILER_VERSION_INTERNAL +char const info_version_internal[] = { + 'I', 'N', 'F', 'O', ':', + 'c','o','m','p','i','l','e','r','_','v','e','r','s','i','o','n','_', + 'i','n','t','e','r','n','a','l','[', + COMPILER_VERSION_INTERNAL,']','\0'}; +#elif defined(COMPILER_VERSION_INTERNAL_STR) +char const* info_version_internal = "INFO" ":" "compiler_version_internal[" COMPILER_VERSION_INTERNAL_STR "]"; +#endif + +/* Construct a string literal encoding the version number components. */ +#ifdef SIMULATE_VERSION_MAJOR +char const info_simulate_version[] = { + 'I', 'N', 'F', 'O', ':', + 's','i','m','u','l','a','t','e','_','v','e','r','s','i','o','n','[', + SIMULATE_VERSION_MAJOR, +# ifdef SIMULATE_VERSION_MINOR + '.', SIMULATE_VERSION_MINOR, +# ifdef SIMULATE_VERSION_PATCH + '.', SIMULATE_VERSION_PATCH, +# ifdef SIMULATE_VERSION_TWEAK + '.', SIMULATE_VERSION_TWEAK, +# endif +# endif +# endif + ']','\0'}; +#endif + +/* Construct the string literal in pieces to prevent the source from + getting matched. Store it in a pointer rather than an array + because some compilers will just produce instructions to fill the + array rather than assigning a pointer to a static array. */ +char const* info_platform = "INFO" ":" "platform[" PLATFORM_ID "]"; +char const* info_arch = "INFO" ":" "arch[" ARCHITECTURE_ID "]"; + + + +#define CXX_STD_98 199711L +#define CXX_STD_11 201103L +#define CXX_STD_14 201402L +#define CXX_STD_17 201703L +#define CXX_STD_20 202002L +#define CXX_STD_23 202302L + +#if defined(__INTEL_COMPILER) && defined(_MSVC_LANG) +# if _MSVC_LANG > CXX_STD_17 +# define CXX_STD _MSVC_LANG +# elif _MSVC_LANG == CXX_STD_17 && defined(__cpp_aggregate_paren_init) +# define CXX_STD CXX_STD_20 +# elif _MSVC_LANG > CXX_STD_14 && __cplusplus > CXX_STD_17 +# define CXX_STD CXX_STD_20 +# elif _MSVC_LANG > CXX_STD_14 +# define CXX_STD CXX_STD_17 +# elif defined(__INTEL_CXX11_MODE__) && defined(__cpp_aggregate_nsdmi) +# define CXX_STD CXX_STD_14 +# elif defined(__INTEL_CXX11_MODE__) +# define CXX_STD CXX_STD_11 +# else +# define CXX_STD CXX_STD_98 +# endif +#elif defined(_MSC_VER) && defined(_MSVC_LANG) +# if _MSVC_LANG > __cplusplus +# define CXX_STD _MSVC_LANG +# else +# define CXX_STD __cplusplus +# endif +#elif defined(__NVCOMPILER) +# if __cplusplus == CXX_STD_17 && defined(__cpp_aggregate_paren_init) +# define CXX_STD CXX_STD_20 +# else +# define CXX_STD __cplusplus +# endif +#elif defined(__INTEL_COMPILER) || defined(__PGI) +# if __cplusplus == CXX_STD_11 && defined(__cpp_namespace_attributes) +# define CXX_STD CXX_STD_17 +# elif __cplusplus == CXX_STD_11 && defined(__cpp_aggregate_nsdmi) +# define CXX_STD CXX_STD_14 +# else +# define CXX_STD __cplusplus +# endif +#elif (defined(__IBMCPP__) || defined(__ibmxl__)) && defined(__linux__) +# if __cplusplus == CXX_STD_11 && defined(__cpp_aggregate_nsdmi) +# define CXX_STD CXX_STD_14 +# else +# define CXX_STD __cplusplus +# endif +#elif __cplusplus == 1 && defined(__GXX_EXPERIMENTAL_CXX0X__) +# define CXX_STD CXX_STD_11 +#else +# define CXX_STD __cplusplus +#endif + +const char* info_language_standard_default = "INFO" ":" "standard_default[" +#if CXX_STD > CXX_STD_23 + "26" +#elif CXX_STD > CXX_STD_20 + "23" +#elif CXX_STD > CXX_STD_17 + "20" +#elif CXX_STD > CXX_STD_14 + "17" +#elif CXX_STD > CXX_STD_11 + "14" +#elif CXX_STD >= CXX_STD_11 + "11" +#else + "98" +#endif +"]"; + +const char* info_language_extensions_default = "INFO" ":" "extensions_default[" +#if (defined(__clang__) || defined(__GNUC__) || defined(__xlC__) || \ + defined(__TI_COMPILER_VERSION__)) && \ + !defined(__STRICT_ANSI__) + "ON" +#else + "OFF" +#endif +"]"; + +/*--------------------------------------------------------------------------*/ + +int main(int argc, char* argv[]) +{ + int require = 0; + require += info_compiler[argc]; + require += info_platform[argc]; + require += info_arch[argc]; +#ifdef COMPILER_VERSION_MAJOR + require += info_version[argc]; +#endif +#ifdef COMPILER_VERSION_INTERNAL + require += info_version_internal[argc]; +#endif +#ifdef SIMULATE_ID + require += info_simulate[argc]; +#endif +#ifdef SIMULATE_VERSION_MAJOR + require += info_simulate_version[argc]; +#endif +#if defined(__CRAYXT_COMPUTE_LINUX_TARGET) + require += info_cray[argc]; +#endif + require += info_language_standard_default[argc]; + require += info_language_extensions_default[argc]; + (void)argv; + return require; +} diff --git a/siro_driver/android/app/.cxx/Debug/2j1f5m6a/x86/CMakeFiles/3.31.5-g6cf5163/CompilerIdCXX/CMakeCXXCompilerId.o b/siro_driver/android/app/.cxx/Debug/2j1f5m6a/x86/CMakeFiles/3.31.5-g6cf5163/CompilerIdCXX/CMakeCXXCompilerId.o new file mode 100644 index 0000000..8cfce58 Binary files /dev/null and b/siro_driver/android/app/.cxx/Debug/2j1f5m6a/x86/CMakeFiles/3.31.5-g6cf5163/CompilerIdCXX/CMakeCXXCompilerId.o differ diff --git a/siro_driver/android/app/.cxx/Debug/2j1f5m6a/x86/CMakeFiles/CMakeConfigureLog.yaml b/siro_driver/android/app/.cxx/Debug/2j1f5m6a/x86/CMakeFiles/CMakeConfigureLog.yaml new file mode 100644 index 0000000..ab47680 --- /dev/null +++ b/siro_driver/android/app/.cxx/Debug/2j1f5m6a/x86/CMakeFiles/CMakeConfigureLog.yaml @@ -0,0 +1,399 @@ + +--- +events: + - + kind: "message-v1" + backtrace: + - "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeDetermineSystem.cmake:200 (message)" + - "CMakeLists.txt:2 (project)" + message: | + The target system is: Android - 1 - i686 + The host system is: Darwin - 24.5.0 - arm64 + - + kind: "message-v1" + backtrace: + - "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeDetermineCompilerId.cmake:17 (message)" + - "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeDetermineCompilerId.cmake:64 (__determine_compiler_id_test)" + - "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeDetermineCCompiler.cmake:123 (CMAKE_DETERMINE_COMPILER_ID)" + - "CMakeLists.txt:2 (project)" + message: | + Compiling the C compiler identification source file "CMakeCCompilerId.c" succeeded. + Compiler: /Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/bin/clang + Build flags: -g;-DANDROID;-fdata-sections;-ffunction-sections;-funwind-tables;-fstack-protector-strong;-no-canonical-prefixes;-mstackrealign;-D_FORTIFY_SOURCE=2;-Wformat;-Werror=format-security + Id flags: -c;--target=i686-none-linux-android23 + + The output was: + 0 + + + Compilation of the C compiler identification source "CMakeCCompilerId.c" produced "CMakeCCompilerId.o" + + The C compiler identification is Clang, found in: + /Users/hamzaaleghwairyeen/development/App/intaleq_driver/android/app/.cxx/Debug/2j1f5m6a/x86/CMakeFiles/3.31.5-g6cf5163/CompilerIdC/CMakeCCompilerId.o + + - + kind: "message-v1" + backtrace: + - "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeDetermineCompilerId.cmake:17 (message)" + - "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeDetermineCompilerId.cmake:64 (__determine_compiler_id_test)" + - "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeDetermineCXXCompiler.cmake:126 (CMAKE_DETERMINE_COMPILER_ID)" + - "CMakeLists.txt:2 (project)" + message: | + Compiling the CXX compiler identification source file "CMakeCXXCompilerId.cpp" succeeded. + Compiler: /Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/bin/clang++ + Build flags: -g;-DANDROID;-fdata-sections;-ffunction-sections;-funwind-tables;-fstack-protector-strong;-no-canonical-prefixes;-mstackrealign;-D_FORTIFY_SOURCE=2;-Wformat;-Werror=format-security + Id flags: -c;--target=i686-none-linux-android23 + + The output was: + 0 + + + Compilation of the CXX compiler identification source "CMakeCXXCompilerId.cpp" produced "CMakeCXXCompilerId.o" + + The CXX compiler identification is Clang, found in: + /Users/hamzaaleghwairyeen/development/App/intaleq_driver/android/app/.cxx/Debug/2j1f5m6a/x86/CMakeFiles/3.31.5-g6cf5163/CompilerIdCXX/CMakeCXXCompilerId.o + + - + kind: "try_compile-v1" + backtrace: + - "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeDetermineCompilerABI.cmake:74 (try_compile)" + - "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeTestCCompiler.cmake:26 (CMAKE_DETERMINE_COMPILER_ABI)" + - "CMakeLists.txt:2 (project)" + checks: + - "Detecting C compiler ABI info" + directories: + source: "/Users/hamzaaleghwairyeen/development/App/intaleq_driver/android/app/.cxx/Debug/2j1f5m6a/x86/CMakeFiles/CMakeScratch/TryCompile-8cXSRH" + binary: "/Users/hamzaaleghwairyeen/development/App/intaleq_driver/android/app/.cxx/Debug/2j1f5m6a/x86/CMakeFiles/CMakeScratch/TryCompile-8cXSRH" + cmakeVariables: + ANDROID_ABI: "x86" + ANDROID_ARM_MODE: "thumb" + ANDROID_PIE: "TRUE" + ANDROID_PLATFORM: "android-23" + ANDROID_STL: "c++_static" + ANDROID_TOOLCHAIN: "clang" + CMAKE_CXX_COMPILER_CLANG_SCAN_DEPS: "/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/bin/clang-scan-deps" + CMAKE_CXX_COMPILER_TARGET: "i686-none-linux-android23" + CMAKE_C_COMPILER_TARGET: "i686-none-linux-android23" + CMAKE_C_FLAGS: "-g -DANDROID -fdata-sections -ffunction-sections -funwind-tables -fstack-protector-strong -no-canonical-prefixes -mstackrealign -D_FORTIFY_SOURCE=2 -Wformat " + CMAKE_C_FLAGS_DEBUG: "-fno-limit-debug-info " + CMAKE_EXE_LINKER_FLAGS: "-static-libstdc++ -Wl,--build-id=sha1 -Wl,--no-rosegment -Wl,--no-undefined-version -Wl,--fatal-warnings -Wl,--no-undefined -Qunused-arguments " + CMAKE_POSITION_INDEPENDENT_CODE: "TRUE" + CMAKE_SYSROOT: "/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot" + buildResult: + variable: "CMAKE_C_ABI_COMPILED" + cached: true + stdout: | + Change Dir: '/Users/hamzaaleghwairyeen/development/App/intaleq_driver/android/app/.cxx/Debug/2j1f5m6a/x86/CMakeFiles/CMakeScratch/TryCompile-8cXSRH' + + Run Build Command(s): /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/bin/ninja -v cmTC_572de + [1/2] /Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/bin/clang --target=i686-none-linux-android23 --sysroot=/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot -g -DANDROID -fdata-sections -ffunction-sections -funwind-tables -fstack-protector-strong -no-canonical-prefixes -mstackrealign -D_FORTIFY_SOURCE=2 -Wformat -fPIE -v -MD -MT CMakeFiles/cmTC_572de.dir/CMakeCCompilerABI.c.o -MF CMakeFiles/cmTC_572de.dir/CMakeCCompilerABI.c.o.d -o CMakeFiles/cmTC_572de.dir/CMakeCCompilerABI.c.o -c /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeCCompilerABI.c + Android (12027248, +pgo, -bolt, +lto, -mlgo, based on r522817) clang version 18.0.1 (https://android.googlesource.com/toolchain/llvm-project d8003a456d14a3deb8054cdaa529ffbf02d9b262) + Target: i686-none-linux-android23 + Thread model: posix + InstalledDir: /Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/bin + (in-process) + "/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/bin/clang" -cc1 -triple i686-none-linux-android23 -emit-obj -mrelax-all -disable-free -clear-ast-before-backend -disable-llvm-verifier -discard-value-names -main-file-name CMakeCCompilerABI.c -mrelocation-model pic -pic-level 2 -pic-is-pie -mframe-pointer=all -ffp-contract=on -fno-rounding-math -mconstructor-aliases -funwind-tables=2 -target-cpu i686 -target-feature +ssse3 -tune-cpu generic -debug-info-kind=constructor -dwarf-version=4 -debugger-tuning=gdb -fdebug-compilation-dir=/Users/hamzaaleghwairyeen/development/App/intaleq_driver/android/app/.cxx/Debug/2j1f5m6a/x86/CMakeFiles/CMakeScratch/TryCompile-8cXSRH -v -ffunction-sections -fdata-sections -fcoverage-compilation-dir=/Users/hamzaaleghwairyeen/development/App/intaleq_driver/android/app/.cxx/Debug/2j1f5m6a/x86/CMakeFiles/CMakeScratch/TryCompile-8cXSRH -resource-dir /Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/lib/clang/18 -dependency-file CMakeFiles/cmTC_572de.dir/CMakeCCompilerABI.c.o.d -MT CMakeFiles/cmTC_572de.dir/CMakeCCompilerABI.c.o -sys-header-deps -D ANDROID -D _FORTIFY_SOURCE=2 -isysroot /Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot -internal-isystem /Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/lib/clang/18/include -internal-isystem /Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/local/include -internal-externc-isystem /Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/include/i686-linux-android -internal-externc-isystem /Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/include -internal-externc-isystem /Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/include -Wformat -ferror-limit 19 -femulated-tls -stack-protector 2 -mstackrealign -fgnuc-version=4.2.1 -D__GCC_HAVE_DWARF2_CFI_ASM=1 -o CMakeFiles/cmTC_572de.dir/CMakeCCompilerABI.c.o -x c /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeCCompilerABI.c + clang -cc1 version 18.0.1 based upon LLVM 18.0.1 default target x86_64-apple-darwin24.5.0 + ignoring nonexistent directory "/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/local/include" + ignoring nonexistent directory "/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/include" + #include "..." search starts here: + #include <...> search starts here: + /Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/lib/clang/18/include + /Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/include/i686-linux-android + /Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/include + End of search list. + [2/2] : && /Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/bin/clang --target=i686-none-linux-android23 --sysroot=/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot -g -DANDROID -fdata-sections -ffunction-sections -funwind-tables -fstack-protector-strong -no-canonical-prefixes -mstackrealign -D_FORTIFY_SOURCE=2 -Wformat -static-libstdc++ -Wl,--build-id=sha1 -Wl,--no-rosegment -Wl,--no-undefined-version -Wl,--fatal-warnings -Wl,--no-undefined -Qunused-arguments -v CMakeFiles/cmTC_572de.dir/CMakeCCompilerABI.c.o -o cmTC_572de && : + Android (12027248, +pgo, -bolt, +lto, -mlgo, based on r522817) clang version 18.0.1 (https://android.googlesource.com/toolchain/llvm-project d8003a456d14a3deb8054cdaa529ffbf02d9b262) + Target: i686-none-linux-android23 + Thread model: posix + InstalledDir: /Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/bin + "/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/bin/ld.lld" --sysroot=/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot -z now -z relro --hash-style=gnu --eh-frame-hdr -m elf_i386 -pie -dynamic-linker /system/bin/linker -o cmTC_572de /Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/lib/i686-linux-android/23/crtbegin_dynamic.o -L/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/lib/clang/18/lib/linux/i386 -L/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/lib/i686-linux-android/23 -L/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/lib/i686-linux-android -L/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/lib --build-id=sha1 --no-rosegment --no-undefined-version --fatal-warnings --no-undefined CMakeFiles/cmTC_572de.dir/CMakeCCompilerABI.c.o /Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/lib/clang/18/lib/linux/libclang_rt.builtins-i686-android.a -l:libunwind.a -ldl -lc /Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/lib/clang/18/lib/linux/libclang_rt.builtins-i686-android.a -l:libunwind.a -ldl /Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/lib/i686-linux-android/23/crtend_android.o + + exitCode: 0 + - + kind: "message-v1" + backtrace: + - "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeDetermineCompilerABI.cmake:182 (message)" + - "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeTestCCompiler.cmake:26 (CMAKE_DETERMINE_COMPILER_ABI)" + - "CMakeLists.txt:2 (project)" + message: | + Parsed C implicit include dir info: rv=done + found start of include info + found start of implicit include info + add: [/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/lib/clang/18/include] + add: [/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/include/i686-linux-android] + add: [/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/include] + end of search list found + collapse include dir [/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/lib/clang/18/include] ==> [/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/lib/clang/18/include] + collapse include dir [/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/include/i686-linux-android] ==> [/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/include/i686-linux-android] + collapse include dir [/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/include] ==> [/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/include] + implicit include dirs: [/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/lib/clang/18/include;/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/include/i686-linux-android;/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/include] + + + - + kind: "message-v1" + backtrace: + - "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeDetermineCompilerABI.cmake:218 (message)" + - "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeTestCCompiler.cmake:26 (CMAKE_DETERMINE_COMPILER_ABI)" + - "CMakeLists.txt:2 (project)" + message: | + Parsed C implicit link information: + link line regex: [^( *|.*[/\\])(ld[0-9]*(\\.[a-z]+)?|CMAKE_LINK_STARTFILE-NOTFOUND|([^/\\]+-)?ld|collect2)[^/\\]*( |$)] + linker tool regex: [^[ ]*(->|")?[ ]*(([^"]*[/\\])?(ld[0-9]*(\\.[a-z]+)?))("|,| |$)] + ignore line: [Change Dir: '/Users/hamzaaleghwairyeen/development/App/intaleq_driver/android/app/.cxx/Debug/2j1f5m6a/x86/CMakeFiles/CMakeScratch/TryCompile-8cXSRH'] + ignore line: [] + ignore line: [Run Build Command(s): /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/bin/ninja -v cmTC_572de] + ignore line: [[1/2] /Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/bin/clang --target=i686-none-linux-android23 --sysroot=/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot -g -DANDROID -fdata-sections -ffunction-sections -funwind-tables -fstack-protector-strong -no-canonical-prefixes -mstackrealign -D_FORTIFY_SOURCE=2 -Wformat -fPIE -v -MD -MT CMakeFiles/cmTC_572de.dir/CMakeCCompilerABI.c.o -MF CMakeFiles/cmTC_572de.dir/CMakeCCompilerABI.c.o.d -o CMakeFiles/cmTC_572de.dir/CMakeCCompilerABI.c.o -c /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeCCompilerABI.c] + ignore line: [Android (12027248 +pgo -bolt +lto -mlgo based on r522817) clang version 18.0.1 (https://android.googlesource.com/toolchain/llvm-project d8003a456d14a3deb8054cdaa529ffbf02d9b262)] + ignore line: [Target: i686-none-linux-android23] + ignore line: [Thread model: posix] + ignore line: [InstalledDir: /Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/bin] + ignore line: [ (in-process)] + ignore line: [ "/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/bin/clang" -cc1 -triple i686-none-linux-android23 -emit-obj -mrelax-all -disable-free -clear-ast-before-backend -disable-llvm-verifier -discard-value-names -main-file-name CMakeCCompilerABI.c -mrelocation-model pic -pic-level 2 -pic-is-pie -mframe-pointer=all -ffp-contract=on -fno-rounding-math -mconstructor-aliases -funwind-tables=2 -target-cpu i686 -target-feature +ssse3 -tune-cpu generic -debug-info-kind=constructor -dwarf-version=4 -debugger-tuning=gdb -fdebug-compilation-dir=/Users/hamzaaleghwairyeen/development/App/intaleq_driver/android/app/.cxx/Debug/2j1f5m6a/x86/CMakeFiles/CMakeScratch/TryCompile-8cXSRH -v -ffunction-sections -fdata-sections -fcoverage-compilation-dir=/Users/hamzaaleghwairyeen/development/App/intaleq_driver/android/app/.cxx/Debug/2j1f5m6a/x86/CMakeFiles/CMakeScratch/TryCompile-8cXSRH -resource-dir /Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/lib/clang/18 -dependency-file CMakeFiles/cmTC_572de.dir/CMakeCCompilerABI.c.o.d -MT CMakeFiles/cmTC_572de.dir/CMakeCCompilerABI.c.o -sys-header-deps -D ANDROID -D _FORTIFY_SOURCE=2 -isysroot /Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot -internal-isystem /Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/lib/clang/18/include -internal-isystem /Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/local/include -internal-externc-isystem /Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/include/i686-linux-android -internal-externc-isystem /Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/include -internal-externc-isystem /Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/include -Wformat -ferror-limit 19 -femulated-tls -stack-protector 2 -mstackrealign -fgnuc-version=4.2.1 -D__GCC_HAVE_DWARF2_CFI_ASM=1 -o CMakeFiles/cmTC_572de.dir/CMakeCCompilerABI.c.o -x c /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeCCompilerABI.c] + ignore line: [clang -cc1 version 18.0.1 based upon LLVM 18.0.1 default target x86_64-apple-darwin24.5.0] + ignore line: [ignoring nonexistent directory "/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/local/include"] + ignore line: [ignoring nonexistent directory "/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/include"] + ignore line: [#include "..." search starts here:] + ignore line: [#include <...> search starts here:] + ignore line: [ /Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/lib/clang/18/include] + ignore line: [ /Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/include/i686-linux-android] + ignore line: [ /Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/include] + ignore line: [End of search list.] + ignore line: [[2/2] : && /Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/bin/clang --target=i686-none-linux-android23 --sysroot=/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot -g -DANDROID -fdata-sections -ffunction-sections -funwind-tables -fstack-protector-strong -no-canonical-prefixes -mstackrealign -D_FORTIFY_SOURCE=2 -Wformat -static-libstdc++ -Wl --build-id=sha1 -Wl --no-rosegment -Wl --no-undefined-version -Wl --fatal-warnings -Wl --no-undefined -Qunused-arguments -v CMakeFiles/cmTC_572de.dir/CMakeCCompilerABI.c.o -o cmTC_572de && :] + ignore line: [Android (12027248 +pgo -bolt +lto -mlgo based on r522817) clang version 18.0.1 (https://android.googlesource.com/toolchain/llvm-project d8003a456d14a3deb8054cdaa529ffbf02d9b262)] + ignore line: [Target: i686-none-linux-android23] + ignore line: [Thread model: posix] + ignore line: [InstalledDir: /Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/bin] + link line: [ "/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/bin/ld.lld" --sysroot=/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot -z now -z relro --hash-style=gnu --eh-frame-hdr -m elf_i386 -pie -dynamic-linker /system/bin/linker -o cmTC_572de /Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/lib/i686-linux-android/23/crtbegin_dynamic.o -L/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/lib/clang/18/lib/linux/i386 -L/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/lib/i686-linux-android/23 -L/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/lib/i686-linux-android -L/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/lib --build-id=sha1 --no-rosegment --no-undefined-version --fatal-warnings --no-undefined CMakeFiles/cmTC_572de.dir/CMakeCCompilerABI.c.o /Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/lib/clang/18/lib/linux/libclang_rt.builtins-i686-android.a -l:libunwind.a -ldl -lc /Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/lib/clang/18/lib/linux/libclang_rt.builtins-i686-android.a -l:libunwind.a -ldl /Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/lib/i686-linux-android/23/crtend_android.o] + arg [/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/bin/ld.lld] ==> ignore + arg [--sysroot=/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot] ==> ignore + arg [-znow] ==> ignore + arg [-zrelro] ==> ignore + arg [--hash-style=gnu] ==> ignore + arg [--eh-frame-hdr] ==> ignore + arg [-m] ==> ignore + arg [elf_i386] ==> ignore + arg [-pie] ==> ignore + arg [-dynamic-linker] ==> ignore + arg [/system/bin/linker] ==> ignore + arg [-o] ==> ignore + arg [cmTC_572de] ==> ignore + arg [/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/lib/i686-linux-android/23/crtbegin_dynamic.o] ==> obj [/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/lib/i686-linux-android/23/crtbegin_dynamic.o] + arg [-L/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/lib/clang/18/lib/linux/i386] ==> dir [/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/lib/clang/18/lib/linux/i386] + arg [-L/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/lib/i686-linux-android/23] ==> dir [/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/lib/i686-linux-android/23] + arg [-L/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/lib/i686-linux-android] ==> dir [/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/lib/i686-linux-android] + arg [-L/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/lib] ==> dir [/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/lib] + arg [--build-id=sha1] ==> ignore + arg [--no-rosegment] ==> ignore + arg [--no-undefined-version] ==> ignore + arg [--fatal-warnings] ==> ignore + arg [--no-undefined] ==> ignore + arg [CMakeFiles/cmTC_572de.dir/CMakeCCompilerABI.c.o] ==> ignore + arg [/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/lib/clang/18/lib/linux/libclang_rt.builtins-i686-android.a] ==> lib [/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/lib/clang/18/lib/linux/libclang_rt.builtins-i686-android.a] + arg [-l:libunwind.a] ==> lib [-l:libunwind.a] + arg [-ldl] ==> lib [dl] + arg [-lc] ==> lib [c] + arg [/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/lib/clang/18/lib/linux/libclang_rt.builtins-i686-android.a] ==> lib [/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/lib/clang/18/lib/linux/libclang_rt.builtins-i686-android.a] + arg [-l:libunwind.a] ==> lib [-l:libunwind.a] + arg [-ldl] ==> lib [dl] + arg [/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/lib/i686-linux-android/23/crtend_android.o] ==> obj [/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/lib/i686-linux-android/23/crtend_android.o] + linker tool for 'C': /Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/bin/ld.lld + remove lib [/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/lib/clang/18/lib/linux/libclang_rt.builtins-i686-android.a] + remove lib [/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/lib/clang/18/lib/linux/libclang_rt.builtins-i686-android.a] + collapse library dir [/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/lib/clang/18/lib/linux/i386] ==> [/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/lib/clang/18/lib/linux/i386] + collapse library dir [/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/lib/i686-linux-android/23] ==> [/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/lib/i686-linux-android/23] + collapse library dir [/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/lib/i686-linux-android] ==> [/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/lib/i686-linux-android] + collapse library dir [/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/lib] ==> [/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/lib] + implicit libs: [-l:libunwind.a;dl;c;-l:libunwind.a;dl] + implicit objs: [/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/lib/i686-linux-android/23/crtbegin_dynamic.o;/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/lib/i686-linux-android/23/crtend_android.o] + implicit dirs: [/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/lib/clang/18/lib/linux/i386;/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/lib/i686-linux-android/23;/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/lib/i686-linux-android;/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/lib] + implicit fwks: [] + + + - + kind: "message-v1" + backtrace: + - "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Internal/CMakeDetermineLinkerId.cmake:40 (message)" + - "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeDetermineCompilerABI.cmake:255 (cmake_determine_linker_id)" + - "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeTestCCompiler.cmake:26 (CMAKE_DETERMINE_COMPILER_ABI)" + - "CMakeLists.txt:2 (project)" + message: | + Running the C compiler's linker: "/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/bin/ld.lld" "-v" + LLD 18.0.1 (compatible with GNU linkers) + - + kind: "try_compile-v1" + backtrace: + - "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeDetermineCompilerABI.cmake:74 (try_compile)" + - "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeTestCXXCompiler.cmake:26 (CMAKE_DETERMINE_COMPILER_ABI)" + - "CMakeLists.txt:2 (project)" + checks: + - "Detecting CXX compiler ABI info" + directories: + source: "/Users/hamzaaleghwairyeen/development/App/intaleq_driver/android/app/.cxx/Debug/2j1f5m6a/x86/CMakeFiles/CMakeScratch/TryCompile-uZz6TR" + binary: "/Users/hamzaaleghwairyeen/development/App/intaleq_driver/android/app/.cxx/Debug/2j1f5m6a/x86/CMakeFiles/CMakeScratch/TryCompile-uZz6TR" + cmakeVariables: + ANDROID_ABI: "x86" + ANDROID_ARM_MODE: "thumb" + ANDROID_PIE: "TRUE" + ANDROID_PLATFORM: "android-23" + ANDROID_STL: "c++_static" + ANDROID_TOOLCHAIN: "clang" + CMAKE_CXX_COMPILER_CLANG_SCAN_DEPS: "/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/bin/clang-scan-deps" + CMAKE_CXX_COMPILER_TARGET: "i686-none-linux-android23" + CMAKE_CXX_FLAGS: "-g -DANDROID -fdata-sections -ffunction-sections -funwind-tables -fstack-protector-strong -no-canonical-prefixes -mstackrealign -D_FORTIFY_SOURCE=2 -Wformat " + CMAKE_CXX_FLAGS_DEBUG: "-fno-limit-debug-info " + CMAKE_CXX_SCAN_FOR_MODULES: "OFF" + CMAKE_C_COMPILER_TARGET: "i686-none-linux-android23" + CMAKE_EXE_LINKER_FLAGS: "-static-libstdc++ -Wl,--build-id=sha1 -Wl,--no-rosegment -Wl,--no-undefined-version -Wl,--fatal-warnings -Wl,--no-undefined -Qunused-arguments " + CMAKE_POSITION_INDEPENDENT_CODE: "TRUE" + CMAKE_SYSROOT: "/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot" + buildResult: + variable: "CMAKE_CXX_ABI_COMPILED" + cached: true + stdout: | + Change Dir: '/Users/hamzaaleghwairyeen/development/App/intaleq_driver/android/app/.cxx/Debug/2j1f5m6a/x86/CMakeFiles/CMakeScratch/TryCompile-uZz6TR' + + Run Build Command(s): /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/bin/ninja -v cmTC_43f99 + [1/2] /Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/bin/clang++ --target=i686-none-linux-android23 --sysroot=/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot -g -DANDROID -fdata-sections -ffunction-sections -funwind-tables -fstack-protector-strong -no-canonical-prefixes -mstackrealign -D_FORTIFY_SOURCE=2 -Wformat -fPIE -v -MD -MT CMakeFiles/cmTC_43f99.dir/CMakeCXXCompilerABI.cpp.o -MF CMakeFiles/cmTC_43f99.dir/CMakeCXXCompilerABI.cpp.o.d -o CMakeFiles/cmTC_43f99.dir/CMakeCXXCompilerABI.cpp.o -c /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeCXXCompilerABI.cpp + Android (12027248, +pgo, -bolt, +lto, -mlgo, based on r522817) clang version 18.0.1 (https://android.googlesource.com/toolchain/llvm-project d8003a456d14a3deb8054cdaa529ffbf02d9b262) + Target: i686-none-linux-android23 + Thread model: posix + InstalledDir: /Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/bin + (in-process) + "/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/bin/clang++" -cc1 -triple i686-none-linux-android23 -emit-obj -mrelax-all -disable-free -clear-ast-before-backend -disable-llvm-verifier -discard-value-names -main-file-name CMakeCXXCompilerABI.cpp -mrelocation-model pic -pic-level 2 -pic-is-pie -mframe-pointer=all -ffp-contract=on -fno-rounding-math -mconstructor-aliases -funwind-tables=2 -target-cpu i686 -target-feature +ssse3 -tune-cpu generic -debug-info-kind=constructor -dwarf-version=4 -debugger-tuning=gdb -fdebug-compilation-dir=/Users/hamzaaleghwairyeen/development/App/intaleq_driver/android/app/.cxx/Debug/2j1f5m6a/x86/CMakeFiles/CMakeScratch/TryCompile-uZz6TR -v -ffunction-sections -fdata-sections -fcoverage-compilation-dir=/Users/hamzaaleghwairyeen/development/App/intaleq_driver/android/app/.cxx/Debug/2j1f5m6a/x86/CMakeFiles/CMakeScratch/TryCompile-uZz6TR -resource-dir /Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/lib/clang/18 -dependency-file CMakeFiles/cmTC_43f99.dir/CMakeCXXCompilerABI.cpp.o.d -MT CMakeFiles/cmTC_43f99.dir/CMakeCXXCompilerABI.cpp.o -sys-header-deps -D ANDROID -D _FORTIFY_SOURCE=2 -isysroot /Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot -internal-isystem /Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/include/c++/v1 -internal-isystem /Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/lib/clang/18/include -internal-isystem /Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/local/include -internal-externc-isystem /Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/include/i686-linux-android -internal-externc-isystem /Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/include -internal-externc-isystem /Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/include -Wformat -fdeprecated-macro -ferror-limit 19 -femulated-tls -stack-protector 2 -mstackrealign -fgnuc-version=4.2.1 -fcxx-exceptions -fexceptions -D__GCC_HAVE_DWARF2_CFI_ASM=1 -o CMakeFiles/cmTC_43f99.dir/CMakeCXXCompilerABI.cpp.o -x c++ /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeCXXCompilerABI.cpp + clang -cc1 version 18.0.1 based upon LLVM 18.0.1 default target x86_64-apple-darwin24.5.0 + ignoring nonexistent directory "/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/local/include" + ignoring nonexistent directory "/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/include" + #include "..." search starts here: + #include <...> search starts here: + /Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/include/c++/v1 + /Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/lib/clang/18/include + /Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/include/i686-linux-android + /Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/include + End of search list. + [2/2] : && /Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/bin/clang++ --target=i686-none-linux-android23 --sysroot=/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot -g -DANDROID -fdata-sections -ffunction-sections -funwind-tables -fstack-protector-strong -no-canonical-prefixes -mstackrealign -D_FORTIFY_SOURCE=2 -Wformat -static-libstdc++ -Wl,--build-id=sha1 -Wl,--no-rosegment -Wl,--no-undefined-version -Wl,--fatal-warnings -Wl,--no-undefined -Qunused-arguments -v CMakeFiles/cmTC_43f99.dir/CMakeCXXCompilerABI.cpp.o -o cmTC_43f99 && : + Android (12027248, +pgo, -bolt, +lto, -mlgo, based on r522817) clang version 18.0.1 (https://android.googlesource.com/toolchain/llvm-project d8003a456d14a3deb8054cdaa529ffbf02d9b262) + Target: i686-none-linux-android23 + Thread model: posix + InstalledDir: /Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/bin + "/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/bin/ld.lld" --sysroot=/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot -z now -z relro --hash-style=gnu --eh-frame-hdr -m elf_i386 -pie -dynamic-linker /system/bin/linker -o cmTC_43f99 /Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/lib/i686-linux-android/23/crtbegin_dynamic.o -L/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/lib/clang/18/lib/linux/i386 -L/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/lib/i686-linux-android/23 -L/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/lib/i686-linux-android -L/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/lib --build-id=sha1 --no-rosegment --no-undefined-version --fatal-warnings --no-undefined CMakeFiles/cmTC_43f99.dir/CMakeCXXCompilerABI.cpp.o -Bstatic -lc++ -Bdynamic -lm /Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/lib/clang/18/lib/linux/libclang_rt.builtins-i686-android.a -l:libunwind.a -ldl -lc /Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/lib/clang/18/lib/linux/libclang_rt.builtins-i686-android.a -l:libunwind.a -ldl /Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/lib/i686-linux-android/23/crtend_android.o + + exitCode: 0 + - + kind: "message-v1" + backtrace: + - "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeDetermineCompilerABI.cmake:182 (message)" + - "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeTestCXXCompiler.cmake:26 (CMAKE_DETERMINE_COMPILER_ABI)" + - "CMakeLists.txt:2 (project)" + message: | + Parsed CXX implicit include dir info: rv=done + found start of include info + found start of implicit include info + add: [/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/include/c++/v1] + add: [/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/lib/clang/18/include] + add: [/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/include/i686-linux-android] + add: [/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/include] + end of search list found + collapse include dir [/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/include/c++/v1] ==> [/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/include/c++/v1] + collapse include dir [/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/lib/clang/18/include] ==> [/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/lib/clang/18/include] + collapse include dir [/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/include/i686-linux-android] ==> [/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/include/i686-linux-android] + collapse include dir [/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/include] ==> [/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/include] + implicit include dirs: [/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/include/c++/v1;/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/lib/clang/18/include;/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/include/i686-linux-android;/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/include] + + + - + kind: "message-v1" + backtrace: + - "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeDetermineCompilerABI.cmake:218 (message)" + - "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeTestCXXCompiler.cmake:26 (CMAKE_DETERMINE_COMPILER_ABI)" + - "CMakeLists.txt:2 (project)" + message: | + Parsed CXX implicit link information: + link line regex: [^( *|.*[/\\])(ld[0-9]*(\\.[a-z]+)?|CMAKE_LINK_STARTFILE-NOTFOUND|([^/\\]+-)?ld|collect2)[^/\\]*( |$)] + linker tool regex: [^[ ]*(->|")?[ ]*(([^"]*[/\\])?(ld[0-9]*(\\.[a-z]+)?))("|,| |$)] + ignore line: [Change Dir: '/Users/hamzaaleghwairyeen/development/App/intaleq_driver/android/app/.cxx/Debug/2j1f5m6a/x86/CMakeFiles/CMakeScratch/TryCompile-uZz6TR'] + ignore line: [] + ignore line: [Run Build Command(s): /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/bin/ninja -v cmTC_43f99] + ignore line: [[1/2] /Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/bin/clang++ --target=i686-none-linux-android23 --sysroot=/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot -g -DANDROID -fdata-sections -ffunction-sections -funwind-tables -fstack-protector-strong -no-canonical-prefixes -mstackrealign -D_FORTIFY_SOURCE=2 -Wformat -fPIE -v -MD -MT CMakeFiles/cmTC_43f99.dir/CMakeCXXCompilerABI.cpp.o -MF CMakeFiles/cmTC_43f99.dir/CMakeCXXCompilerABI.cpp.o.d -o CMakeFiles/cmTC_43f99.dir/CMakeCXXCompilerABI.cpp.o -c /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeCXXCompilerABI.cpp] + ignore line: [Android (12027248 +pgo -bolt +lto -mlgo based on r522817) clang version 18.0.1 (https://android.googlesource.com/toolchain/llvm-project d8003a456d14a3deb8054cdaa529ffbf02d9b262)] + ignore line: [Target: i686-none-linux-android23] + ignore line: [Thread model: posix] + ignore line: [InstalledDir: /Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/bin] + ignore line: [ (in-process)] + ignore line: [ "/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/bin/clang++" -cc1 -triple i686-none-linux-android23 -emit-obj -mrelax-all -disable-free -clear-ast-before-backend -disable-llvm-verifier -discard-value-names -main-file-name CMakeCXXCompilerABI.cpp -mrelocation-model pic -pic-level 2 -pic-is-pie -mframe-pointer=all -ffp-contract=on -fno-rounding-math -mconstructor-aliases -funwind-tables=2 -target-cpu i686 -target-feature +ssse3 -tune-cpu generic -debug-info-kind=constructor -dwarf-version=4 -debugger-tuning=gdb -fdebug-compilation-dir=/Users/hamzaaleghwairyeen/development/App/intaleq_driver/android/app/.cxx/Debug/2j1f5m6a/x86/CMakeFiles/CMakeScratch/TryCompile-uZz6TR -v -ffunction-sections -fdata-sections -fcoverage-compilation-dir=/Users/hamzaaleghwairyeen/development/App/intaleq_driver/android/app/.cxx/Debug/2j1f5m6a/x86/CMakeFiles/CMakeScratch/TryCompile-uZz6TR -resource-dir /Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/lib/clang/18 -dependency-file CMakeFiles/cmTC_43f99.dir/CMakeCXXCompilerABI.cpp.o.d -MT CMakeFiles/cmTC_43f99.dir/CMakeCXXCompilerABI.cpp.o -sys-header-deps -D ANDROID -D _FORTIFY_SOURCE=2 -isysroot /Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot -internal-isystem /Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/include/c++/v1 -internal-isystem /Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/lib/clang/18/include -internal-isystem /Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/local/include -internal-externc-isystem /Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/include/i686-linux-android -internal-externc-isystem /Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/include -internal-externc-isystem /Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/include -Wformat -fdeprecated-macro -ferror-limit 19 -femulated-tls -stack-protector 2 -mstackrealign -fgnuc-version=4.2.1 -fcxx-exceptions -fexceptions -D__GCC_HAVE_DWARF2_CFI_ASM=1 -o CMakeFiles/cmTC_43f99.dir/CMakeCXXCompilerABI.cpp.o -x c++ /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeCXXCompilerABI.cpp] + ignore line: [clang -cc1 version 18.0.1 based upon LLVM 18.0.1 default target x86_64-apple-darwin24.5.0] + ignore line: [ignoring nonexistent directory "/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/local/include"] + ignore line: [ignoring nonexistent directory "/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/include"] + ignore line: [#include "..." search starts here:] + ignore line: [#include <...> search starts here:] + ignore line: [ /Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/include/c++/v1] + ignore line: [ /Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/lib/clang/18/include] + ignore line: [ /Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/include/i686-linux-android] + ignore line: [ /Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/include] + ignore line: [End of search list.] + ignore line: [[2/2] : && /Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/bin/clang++ --target=i686-none-linux-android23 --sysroot=/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot -g -DANDROID -fdata-sections -ffunction-sections -funwind-tables -fstack-protector-strong -no-canonical-prefixes -mstackrealign -D_FORTIFY_SOURCE=2 -Wformat -static-libstdc++ -Wl --build-id=sha1 -Wl --no-rosegment -Wl --no-undefined-version -Wl --fatal-warnings -Wl --no-undefined -Qunused-arguments -v CMakeFiles/cmTC_43f99.dir/CMakeCXXCompilerABI.cpp.o -o cmTC_43f99 && :] + ignore line: [Android (12027248 +pgo -bolt +lto -mlgo based on r522817) clang version 18.0.1 (https://android.googlesource.com/toolchain/llvm-project d8003a456d14a3deb8054cdaa529ffbf02d9b262)] + ignore line: [Target: i686-none-linux-android23] + ignore line: [Thread model: posix] + ignore line: [InstalledDir: /Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/bin] + link line: [ "/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/bin/ld.lld" --sysroot=/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot -z now -z relro --hash-style=gnu --eh-frame-hdr -m elf_i386 -pie -dynamic-linker /system/bin/linker -o cmTC_43f99 /Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/lib/i686-linux-android/23/crtbegin_dynamic.o -L/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/lib/clang/18/lib/linux/i386 -L/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/lib/i686-linux-android/23 -L/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/lib/i686-linux-android -L/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/lib --build-id=sha1 --no-rosegment --no-undefined-version --fatal-warnings --no-undefined CMakeFiles/cmTC_43f99.dir/CMakeCXXCompilerABI.cpp.o -Bstatic -lc++ -Bdynamic -lm /Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/lib/clang/18/lib/linux/libclang_rt.builtins-i686-android.a -l:libunwind.a -ldl -lc /Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/lib/clang/18/lib/linux/libclang_rt.builtins-i686-android.a -l:libunwind.a -ldl /Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/lib/i686-linux-android/23/crtend_android.o] + arg [/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/bin/ld.lld] ==> ignore + arg [--sysroot=/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot] ==> ignore + arg [-znow] ==> ignore + arg [-zrelro] ==> ignore + arg [--hash-style=gnu] ==> ignore + arg [--eh-frame-hdr] ==> ignore + arg [-m] ==> ignore + arg [elf_i386] ==> ignore + arg [-pie] ==> ignore + arg [-dynamic-linker] ==> ignore + arg [/system/bin/linker] ==> ignore + arg [-o] ==> ignore + arg [cmTC_43f99] ==> ignore + arg [/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/lib/i686-linux-android/23/crtbegin_dynamic.o] ==> obj [/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/lib/i686-linux-android/23/crtbegin_dynamic.o] + arg [-L/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/lib/clang/18/lib/linux/i386] ==> dir [/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/lib/clang/18/lib/linux/i386] + arg [-L/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/lib/i686-linux-android/23] ==> dir [/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/lib/i686-linux-android/23] + arg [-L/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/lib/i686-linux-android] ==> dir [/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/lib/i686-linux-android] + arg [-L/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/lib] ==> dir [/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/lib] + arg [--build-id=sha1] ==> ignore + arg [--no-rosegment] ==> ignore + arg [--no-undefined-version] ==> ignore + arg [--fatal-warnings] ==> ignore + arg [--no-undefined] ==> ignore + arg [CMakeFiles/cmTC_43f99.dir/CMakeCXXCompilerABI.cpp.o] ==> ignore + arg [-Bstatic] ==> search static + arg [-lc++] ==> lib [c++] + arg [-Bdynamic] ==> search dynamic + arg [-lm] ==> lib [m] + arg [/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/lib/clang/18/lib/linux/libclang_rt.builtins-i686-android.a] ==> lib [/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/lib/clang/18/lib/linux/libclang_rt.builtins-i686-android.a] + arg [-l:libunwind.a] ==> lib [-l:libunwind.a] + arg [-ldl] ==> lib [dl] + arg [-lc] ==> lib [c] + arg [/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/lib/clang/18/lib/linux/libclang_rt.builtins-i686-android.a] ==> lib [/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/lib/clang/18/lib/linux/libclang_rt.builtins-i686-android.a] + arg [-l:libunwind.a] ==> lib [-l:libunwind.a] + arg [-ldl] ==> lib [dl] + arg [/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/lib/i686-linux-android/23/crtend_android.o] ==> obj [/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/lib/i686-linux-android/23/crtend_android.o] + linker tool for 'CXX': /Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/bin/ld.lld + remove lib [/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/lib/clang/18/lib/linux/libclang_rt.builtins-i686-android.a] + remove lib [/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/lib/clang/18/lib/linux/libclang_rt.builtins-i686-android.a] + collapse library dir [/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/lib/clang/18/lib/linux/i386] ==> [/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/lib/clang/18/lib/linux/i386] + collapse library dir [/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/lib/i686-linux-android/23] ==> [/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/lib/i686-linux-android/23] + collapse library dir [/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/lib/i686-linux-android] ==> [/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/lib/i686-linux-android] + collapse library dir [/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/lib] ==> [/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/lib] + implicit libs: [c++;m;-l:libunwind.a;dl;c;-l:libunwind.a;dl] + implicit objs: [/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/lib/i686-linux-android/23/crtbegin_dynamic.o;/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/lib/i686-linux-android/23/crtend_android.o] + implicit dirs: [/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/lib/clang/18/lib/linux/i386;/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/lib/i686-linux-android/23;/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/lib/i686-linux-android;/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/lib] + implicit fwks: [] + + + - + kind: "message-v1" + backtrace: + - "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Internal/CMakeDetermineLinkerId.cmake:40 (message)" + - "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeDetermineCompilerABI.cmake:255 (cmake_determine_linker_id)" + - "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeTestCXXCompiler.cmake:26 (CMAKE_DETERMINE_COMPILER_ABI)" + - "CMakeLists.txt:2 (project)" + message: | + Running the CXX compiler's linker: "/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/bin/ld.lld" "-v" + LLD 18.0.1 (compatible with GNU linkers) +... diff --git a/siro_driver/android/app/.cxx/Debug/2j1f5m6a/x86/CMakeFiles/TargetDirectories.txt b/siro_driver/android/app/.cxx/Debug/2j1f5m6a/x86/CMakeFiles/TargetDirectories.txt new file mode 100644 index 0000000..96fb34e --- /dev/null +++ b/siro_driver/android/app/.cxx/Debug/2j1f5m6a/x86/CMakeFiles/TargetDirectories.txt @@ -0,0 +1,3 @@ +/Users/hamzaaleghwairyeen/development/App/intaleq_driver/android/app/.cxx/Debug/2j1f5m6a/x86/CMakeFiles/native-lib.dir +/Users/hamzaaleghwairyeen/development/App/intaleq_driver/android/app/.cxx/Debug/2j1f5m6a/x86/CMakeFiles/edit_cache.dir +/Users/hamzaaleghwairyeen/development/App/intaleq_driver/android/app/.cxx/Debug/2j1f5m6a/x86/CMakeFiles/rebuild_cache.dir diff --git a/siro_driver/android/app/.cxx/Debug/2j1f5m6a/x86/CMakeFiles/cmake.check_cache b/siro_driver/android/app/.cxx/Debug/2j1f5m6a/x86/CMakeFiles/cmake.check_cache new file mode 100644 index 0000000..3dccd73 --- /dev/null +++ b/siro_driver/android/app/.cxx/Debug/2j1f5m6a/x86/CMakeFiles/cmake.check_cache @@ -0,0 +1 @@ +# This file is generated by cmake for dependency checking of the CMakeCache.txt file diff --git a/siro_driver/android/app/.cxx/Debug/2j1f5m6a/x86/CMakeFiles/native-lib.dir/native-lib.cpp.o b/siro_driver/android/app/.cxx/Debug/2j1f5m6a/x86/CMakeFiles/native-lib.dir/native-lib.cpp.o new file mode 100644 index 0000000..9522425 Binary files /dev/null and b/siro_driver/android/app/.cxx/Debug/2j1f5m6a/x86/CMakeFiles/native-lib.dir/native-lib.cpp.o differ diff --git a/siro_driver/android/app/.cxx/Debug/2j1f5m6a/x86/CMakeFiles/rules.ninja b/siro_driver/android/app/.cxx/Debug/2j1f5m6a/x86/CMakeFiles/rules.ninja new file mode 100644 index 0000000..e1a9855 --- /dev/null +++ b/siro_driver/android/app/.cxx/Debug/2j1f5m6a/x86/CMakeFiles/rules.ninja @@ -0,0 +1,66 @@ +# CMAKE generated file: DO NOT EDIT! +# Generated by "Ninja" Generator, CMake Version 3.31 + +# This file contains all the rules used to get the outputs files +# built from the input files. +# It is included in the main 'build.ninja'. + +# ============================================================================= +# Project: intaleq_driver +# Configurations: Debug +# ============================================================================= +# ============================================================================= + +############################################# +# Rule for compiling CXX files. + +rule CXX_COMPILER__native-lib_unscanned_Debug + depfile = $DEP_FILE + deps = gcc + command = ${LAUNCHER}${CODE_CHECK}/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/bin/clang++ --target=i686-none-linux-android23 --sysroot=/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot $DEFINES $INCLUDES $FLAGS -MD -MT $out -MF $DEP_FILE -o $out -c $in + description = Building CXX object $out + + +############################################# +# Rule for linking CXX shared library. + +rule CXX_SHARED_LIBRARY_LINKER__native-lib_Debug + depfile = $DEP_FILE + deps = gcc + command = $PRE_LINK && /Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/bin/clang++ --target=i686-none-linux-android23 --sysroot=/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot -fPIC $LANGUAGE_COMPILE_FLAGS $ARCH_FLAGS $LINK_FLAGS -shared $SONAME_FLAG$SONAME -o $TARGET_FILE $in $LINK_PATH $LINK_LIBRARIES && $POST_BUILD + description = Linking CXX shared library $TARGET_FILE + restat = $RESTAT + + +############################################# +# Rule for running custom commands. + +rule CUSTOM_COMMAND + command = $COMMAND + description = $DESC + + +############################################# +# Rule for re-running cmake. + +rule RERUN_CMAKE + command = /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/bin/cmake --regenerate-during-build -S/Users/hamzaaleghwairyeen/development/App/intaleq_driver/android/app/src/main/cpp -B/Users/hamzaaleghwairyeen/development/App/intaleq_driver/android/app/.cxx/Debug/2j1f5m6a/x86 + description = Re-running CMake... + generator = 1 + + +############################################# +# Rule for cleaning all built files. + +rule CLEAN + command = /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/bin/ninja $FILE_ARG -t clean $TARGETS + description = Cleaning all built files... + + +############################################# +# Rule for printing all primary targets available. + +rule HELP + command = /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/bin/ninja -t targets + description = All primary targets available: + diff --git a/siro_driver/android/app/.cxx/Debug/2j1f5m6a/x86/additional_project_files.txt b/siro_driver/android/app/.cxx/Debug/2j1f5m6a/x86/additional_project_files.txt new file mode 100644 index 0000000..e69de29 diff --git a/siro_driver/android/app/.cxx/Debug/2j1f5m6a/x86/android_gradle_build.json b/siro_driver/android/app/.cxx/Debug/2j1f5m6a/x86/android_gradle_build.json new file mode 100644 index 0000000..a2a7fa7 --- /dev/null +++ b/siro_driver/android/app/.cxx/Debug/2j1f5m6a/x86/android_gradle_build.json @@ -0,0 +1,38 @@ +{ + "buildFiles": [ + "/Users/hamzaaleghwairyeen/development/App/intaleq_driver/android/app/src/main/cpp/CMakeLists.txt" + ], + "cleanCommandsComponents": [ + [ + "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/bin/ninja", + "-C", + "/Users/hamzaaleghwairyeen/development/App/intaleq_driver/android/app/.cxx/Debug/2j1f5m6a/x86", + "clean" + ] + ], + "buildTargetsCommandComponents": [ + "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/bin/ninja", + "-C", + "/Users/hamzaaleghwairyeen/development/App/intaleq_driver/android/app/.cxx/Debug/2j1f5m6a/x86", + "{LIST_OF_TARGETS_TO_BUILD}" + ], + "libraries": { + "native-lib::@6890427a1f51a3e7e1df": { + "toolchain": "toolchain", + "abi": "x86", + "artifactName": "native-lib", + "output": "/Users/hamzaaleghwairyeen/development/App/intaleq_driver/build/app/intermediates/cxx/Debug/2j1f5m6a/obj/x86/libnative-lib.so", + "runtimeFiles": [] + } + }, + "toolchains": { + "toolchain": { + "cCompilerExecutable": "/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/bin/clang.lld", + "cppCompilerExecutable": "/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/bin/clang++.lld" + } + }, + "cFileExtensions": [], + "cppFileExtensions": [ + "cpp" + ] +} \ No newline at end of file diff --git a/siro_driver/android/app/.cxx/Debug/2j1f5m6a/x86/android_gradle_build_mini.json b/siro_driver/android/app/.cxx/Debug/2j1f5m6a/x86/android_gradle_build_mini.json new file mode 100644 index 0000000..565cb25 --- /dev/null +++ b/siro_driver/android/app/.cxx/Debug/2j1f5m6a/x86/android_gradle_build_mini.json @@ -0,0 +1,27 @@ +{ + "buildFiles": [ + "/Users/hamzaaleghwairyeen/development/App/intaleq_driver/android/app/src/main/cpp/CMakeLists.txt" + ], + "cleanCommandsComponents": [ + [ + "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/bin/ninja", + "-C", + "/Users/hamzaaleghwairyeen/development/App/intaleq_driver/android/app/.cxx/Debug/2j1f5m6a/x86", + "clean" + ] + ], + "buildTargetsCommandComponents": [ + "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/bin/ninja", + "-C", + "/Users/hamzaaleghwairyeen/development/App/intaleq_driver/android/app/.cxx/Debug/2j1f5m6a/x86", + "{LIST_OF_TARGETS_TO_BUILD}" + ], + "libraries": { + "native-lib::@6890427a1f51a3e7e1df": { + "artifactName": "native-lib", + "abi": "x86", + "output": "/Users/hamzaaleghwairyeen/development/App/intaleq_driver/build/app/intermediates/cxx/Debug/2j1f5m6a/obj/x86/libnative-lib.so", + "runtimeFiles": [] + } + } +} \ No newline at end of file diff --git a/siro_driver/android/app/.cxx/Debug/2j1f5m6a/x86/build.ninja b/siro_driver/android/app/.cxx/Debug/2j1f5m6a/x86/build.ninja new file mode 100644 index 0000000..eb82922 --- /dev/null +++ b/siro_driver/android/app/.cxx/Debug/2j1f5m6a/x86/build.ninja @@ -0,0 +1,156 @@ +# CMAKE generated file: DO NOT EDIT! +# Generated by "Ninja" Generator, CMake Version 3.31 + +# This file contains all the build statements describing the +# compilation DAG. + +# ============================================================================= +# Write statements declared in CMakeLists.txt: +# +# Which is the root file. +# ============================================================================= + +# ============================================================================= +# Project: intaleq_driver +# Configurations: Debug +# ============================================================================= + +############################################# +# Minimal version of Ninja required by this file + +ninja_required_version = 1.5 + + +############################################# +# Set configuration variable for custom commands. + +CONFIGURATION = Debug +# ============================================================================= +# Include auxiliary files. + + +############################################# +# Include rules file. + +include CMakeFiles/rules.ninja + +# ============================================================================= + +############################################# +# Logical path to working directory; prefix for absolute paths. + +cmake_ninja_workdir = /Users/hamzaaleghwairyeen/development/App/intaleq_driver/android/app/.cxx/Debug/2j1f5m6a/x86/ +# ============================================================================= +# Object build statements for SHARED_LIBRARY target native-lib + + +############################################# +# Order-only phony target for native-lib + +build cmake_object_order_depends_target_native-lib: phony || . + +build CMakeFiles/native-lib.dir/native-lib.cpp.o: CXX_COMPILER__native-lib_unscanned_Debug /Users/hamzaaleghwairyeen/development/App/intaleq_driver/android/app/src/main/cpp/native-lib.cpp || cmake_object_order_depends_target_native-lib + DEFINES = -Dnative_lib_EXPORTS + DEP_FILE = CMakeFiles/native-lib.dir/native-lib.cpp.o.d + FLAGS = -g -DANDROID -fdata-sections -ffunction-sections -funwind-tables -fstack-protector-strong -no-canonical-prefixes -mstackrealign -D_FORTIFY_SOURCE=2 -Wformat -Werror=format-security -fno-limit-debug-info -fPIC + OBJECT_DIR = CMakeFiles/native-lib.dir + OBJECT_FILE_DIR = CMakeFiles/native-lib.dir + TARGET_COMPILE_PDB = CMakeFiles/native-lib.dir/ + TARGET_PDB = /Users/hamzaaleghwairyeen/development/App/intaleq_driver/build/app/intermediates/cxx/Debug/2j1f5m6a/obj/x86/libnative-lib.pdb + + +# ============================================================================= +# Link build statements for SHARED_LIBRARY target native-lib + + +############################################# +# Link the shared library /Users/hamzaaleghwairyeen/development/App/intaleq_driver/build/app/intermediates/cxx/Debug/2j1f5m6a/obj/x86/libnative-lib.so + +build /Users/hamzaaleghwairyeen/development/App/intaleq_driver/build/app/intermediates/cxx/Debug/2j1f5m6a/obj/x86/libnative-lib.so: CXX_SHARED_LIBRARY_LINKER__native-lib_Debug CMakeFiles/native-lib.dir/native-lib.cpp.o | /Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/lib/i686-linux-android/23/liblog.so + DEP_FILE = CMakeFiles/native-lib.dir/link.d + LANGUAGE_COMPILE_FLAGS = -g -DANDROID -fdata-sections -ffunction-sections -funwind-tables -fstack-protector-strong -no-canonical-prefixes -mstackrealign -D_FORTIFY_SOURCE=2 -Wformat -Werror=format-security -fno-limit-debug-info + LINK_FLAGS = -static-libstdc++ -Wl,--build-id=sha1 -Wl,--no-rosegment -Wl,--no-undefined-version -Wl,--fatal-warnings -Wl,--no-undefined -Qunused-arguments -Xlinker --dependency-file=CMakeFiles/native-lib.dir/link.d + LINK_LIBRARIES = /Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/lib/i686-linux-android/23/liblog.so -latomic -lm + OBJECT_DIR = CMakeFiles/native-lib.dir + POST_BUILD = : + PRE_LINK = : + SONAME = libnative-lib.so + SONAME_FLAG = -Wl,-soname, + TARGET_COMPILE_PDB = CMakeFiles/native-lib.dir/ + TARGET_FILE = /Users/hamzaaleghwairyeen/development/App/intaleq_driver/build/app/intermediates/cxx/Debug/2j1f5m6a/obj/x86/libnative-lib.so + TARGET_PDB = /Users/hamzaaleghwairyeen/development/App/intaleq_driver/build/app/intermediates/cxx/Debug/2j1f5m6a/obj/x86/libnative-lib.pdb + + +############################################# +# Utility command for edit_cache + +build CMakeFiles/edit_cache.util: CUSTOM_COMMAND + COMMAND = cd /Users/hamzaaleghwairyeen/development/App/intaleq_driver/android/app/.cxx/Debug/2j1f5m6a/x86 && /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/bin/ccmake -S/Users/hamzaaleghwairyeen/development/App/intaleq_driver/android/app/src/main/cpp -B/Users/hamzaaleghwairyeen/development/App/intaleq_driver/android/app/.cxx/Debug/2j1f5m6a/x86 + DESC = Running CMake cache editor... + pool = console + restat = 1 + +build edit_cache: phony CMakeFiles/edit_cache.util + + +############################################# +# Utility command for rebuild_cache + +build CMakeFiles/rebuild_cache.util: CUSTOM_COMMAND + COMMAND = cd /Users/hamzaaleghwairyeen/development/App/intaleq_driver/android/app/.cxx/Debug/2j1f5m6a/x86 && /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/bin/cmake --regenerate-during-build -S/Users/hamzaaleghwairyeen/development/App/intaleq_driver/android/app/src/main/cpp -B/Users/hamzaaleghwairyeen/development/App/intaleq_driver/android/app/.cxx/Debug/2j1f5m6a/x86 + DESC = Running CMake to regenerate build system... + pool = console + restat = 1 + +build rebuild_cache: phony CMakeFiles/rebuild_cache.util + +# ============================================================================= +# Target aliases. + +build libnative-lib.so: phony /Users/hamzaaleghwairyeen/development/App/intaleq_driver/build/app/intermediates/cxx/Debug/2j1f5m6a/obj/x86/libnative-lib.so + +build native-lib: phony /Users/hamzaaleghwairyeen/development/App/intaleq_driver/build/app/intermediates/cxx/Debug/2j1f5m6a/obj/x86/libnative-lib.so + +# ============================================================================= +# Folder targets. + +# ============================================================================= + +############################################# +# Folder: /Users/hamzaaleghwairyeen/development/App/intaleq_driver/android/app/.cxx/Debug/2j1f5m6a/x86 + +build all: phony /Users/hamzaaleghwairyeen/development/App/intaleq_driver/build/app/intermediates/cxx/Debug/2j1f5m6a/obj/x86/libnative-lib.so + +# ============================================================================= +# Built-in targets + + +############################################# +# Re-run CMake if any of its inputs changed. + +build build.ninja: RERUN_CMAKE | /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeCCompiler.cmake.in /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeCCompilerABI.c /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeCInformation.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeCXXCompiler.cmake.in /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeCXXCompilerABI.cpp /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeCXXInformation.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeCommonLanguageInclude.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeCompilerIdDetection.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeDetermineCCompiler.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeDetermineCXXCompiler.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeDetermineCompiler.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeDetermineCompilerABI.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeDetermineCompilerId.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeDetermineCompilerSupport.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeDetermineSystem.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeFindBinUtils.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeGenericSystem.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeInitializeConfigs.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeLanguageInformation.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeParseImplicitIncludeInfo.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeParseImplicitLinkInfo.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeParseLibraryArchitecture.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeSystem.cmake.in /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeSystemSpecificInformation.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeSystemSpecificInitialize.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeTestCCompiler.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeTestCXXCompiler.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeTestCompilerCommon.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/ADSP-DetermineCompiler.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/ARMCC-DetermineCompiler.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/ARMClang-DetermineCompiler.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/AppleClang-DetermineCompiler.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/Borland-DetermineCompiler.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/Bruce-C-DetermineCompiler.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/CMakeCommonCompilerMacros.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/Clang-C.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/Clang-CXX-CXXImportStd.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/Clang-CXX.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/Clang-DetermineCompiler.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/Clang-DetermineCompilerInternal.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/Clang-FindBinUtils.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/Clang.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/Compaq-C-DetermineCompiler.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/Compaq-CXX-DetermineCompiler.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/Cray-DetermineCompiler.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/CrayClang-DetermineCompiler.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/Embarcadero-DetermineCompiler.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/Fujitsu-DetermineCompiler.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/FujitsuClang-DetermineCompiler.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/GHS-DetermineCompiler.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/GNU-C-DetermineCompiler.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/GNU-CXX-DetermineCompiler.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/GNU.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/HP-C-DetermineCompiler.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/HP-CXX-DetermineCompiler.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/IAR-DetermineCompiler.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/IBMCPP-C-DetermineVersionInternal.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/IBMCPP-CXX-DetermineVersionInternal.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/IBMClang-C-DetermineCompiler.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/IBMClang-CXX-DetermineCompiler.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/Intel-DetermineCompiler.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/IntelLLVM-DetermineCompiler.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/LCC-C-DetermineCompiler.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/LCC-CXX-DetermineCompiler.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/MSVC-DetermineCompiler.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/NVHPC-DetermineCompiler.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/NVIDIA-DetermineCompiler.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/OpenWatcom-DetermineCompiler.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/OrangeC-DetermineCompiler.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/PGI-DetermineCompiler.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/PathScale-DetermineCompiler.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/SCO-DetermineCompiler.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/SDCC-C-DetermineCompiler.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/SunPro-C-DetermineCompiler.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/SunPro-CXX-DetermineCompiler.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/TI-DetermineCompiler.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/TIClang-DetermineCompiler.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/Tasking-DetermineCompiler.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/TinyCC-C-DetermineCompiler.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/VisualAge-C-DetermineCompiler.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/VisualAge-CXX-DetermineCompiler.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/Watcom-DetermineCompiler.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/XL-C-DetermineCompiler.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/XL-CXX-DetermineCompiler.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/XLClang-C-DetermineCompiler.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/XLClang-CXX-DetermineCompiler.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/zOS-C-DetermineCompiler.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/zOS-CXX-DetermineCompiler.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Internal/CMakeCLinkerInformation.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Internal/CMakeCXXLinkerInformation.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Internal/CMakeCommonLinkerInformation.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Internal/CMakeDetermineLinkerId.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Internal/FeatureTesting.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Linker/GNU.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Linker/LLD-C.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Linker/LLD-CXX.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Linker/LLD.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Platform/Android-Clang-C.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Platform/Android-Clang-CXX.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Platform/Android-Clang.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Platform/Android-Determine-C.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Platform/Android-Determine-CXX.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Platform/Android-Determine.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Platform/Android-Initialize.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Platform/Android.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Platform/Android/Determine-Compiler.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Platform/Linker/Android-LLD-C.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Platform/Linker/Android-LLD-CXX.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Platform/Linker/GNU.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Platform/Linker/Linux-GNU.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Platform/Linker/Linux-LLD-C.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Platform/Linker/Linux-LLD-CXX.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Platform/Linker/Linux-LLD.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Platform/Linux-Initialize.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Platform/Linux.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Platform/UnixPaths.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/build/cmake/abis.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/build/cmake/android-legacy.toolchain.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/build/cmake/android.toolchain.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/build/cmake/flags.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/build/cmake/hooks/pre/Android-Clang.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/build/cmake/hooks/pre/Android-Determine.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/build/cmake/hooks/pre/Android-Initialize.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/build/cmake/hooks/pre/Android.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/build/cmake/hooks/pre/Determine-Compiler.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/build/cmake/platforms.cmake /Users/hamzaaleghwairyeen/development/App/intaleq_driver/android/app/src/main/cpp/CMakeLists.txt CMakeCache.txt CMakeFiles/3.31.5-g6cf5163/CMakeCCompiler.cmake CMakeFiles/3.31.5-g6cf5163/CMakeCXXCompiler.cmake CMakeFiles/3.31.5-g6cf5163/CMakeSystem.cmake + pool = console + + +############################################# +# A missing CMake input file is not an error. + +build /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeCCompiler.cmake.in /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeCCompilerABI.c /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeCInformation.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeCXXCompiler.cmake.in /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeCXXCompilerABI.cpp /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeCXXInformation.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeCommonLanguageInclude.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeCompilerIdDetection.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeDetermineCCompiler.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeDetermineCXXCompiler.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeDetermineCompiler.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeDetermineCompilerABI.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeDetermineCompilerId.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeDetermineCompilerSupport.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeDetermineSystem.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeFindBinUtils.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeGenericSystem.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeInitializeConfigs.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeLanguageInformation.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeParseImplicitIncludeInfo.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeParseImplicitLinkInfo.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeParseLibraryArchitecture.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeSystem.cmake.in /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeSystemSpecificInformation.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeSystemSpecificInitialize.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeTestCCompiler.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeTestCXXCompiler.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeTestCompilerCommon.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/ADSP-DetermineCompiler.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/ARMCC-DetermineCompiler.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/ARMClang-DetermineCompiler.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/AppleClang-DetermineCompiler.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/Borland-DetermineCompiler.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/Bruce-C-DetermineCompiler.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/CMakeCommonCompilerMacros.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/Clang-C.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/Clang-CXX-CXXImportStd.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/Clang-CXX.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/Clang-DetermineCompiler.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/Clang-DetermineCompilerInternal.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/Clang-FindBinUtils.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/Clang.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/Compaq-C-DetermineCompiler.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/Compaq-CXX-DetermineCompiler.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/Cray-DetermineCompiler.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/CrayClang-DetermineCompiler.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/Embarcadero-DetermineCompiler.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/Fujitsu-DetermineCompiler.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/FujitsuClang-DetermineCompiler.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/GHS-DetermineCompiler.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/GNU-C-DetermineCompiler.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/GNU-CXX-DetermineCompiler.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/GNU.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/HP-C-DetermineCompiler.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/HP-CXX-DetermineCompiler.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/IAR-DetermineCompiler.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/IBMCPP-C-DetermineVersionInternal.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/IBMCPP-CXX-DetermineVersionInternal.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/IBMClang-C-DetermineCompiler.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/IBMClang-CXX-DetermineCompiler.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/Intel-DetermineCompiler.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/IntelLLVM-DetermineCompiler.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/LCC-C-DetermineCompiler.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/LCC-CXX-DetermineCompiler.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/MSVC-DetermineCompiler.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/NVHPC-DetermineCompiler.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/NVIDIA-DetermineCompiler.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/OpenWatcom-DetermineCompiler.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/OrangeC-DetermineCompiler.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/PGI-DetermineCompiler.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/PathScale-DetermineCompiler.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/SCO-DetermineCompiler.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/SDCC-C-DetermineCompiler.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/SunPro-C-DetermineCompiler.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/SunPro-CXX-DetermineCompiler.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/TI-DetermineCompiler.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/TIClang-DetermineCompiler.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/Tasking-DetermineCompiler.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/TinyCC-C-DetermineCompiler.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/VisualAge-C-DetermineCompiler.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/VisualAge-CXX-DetermineCompiler.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/Watcom-DetermineCompiler.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/XL-C-DetermineCompiler.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/XL-CXX-DetermineCompiler.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/XLClang-C-DetermineCompiler.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/XLClang-CXX-DetermineCompiler.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/zOS-C-DetermineCompiler.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/zOS-CXX-DetermineCompiler.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Internal/CMakeCLinkerInformation.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Internal/CMakeCXXLinkerInformation.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Internal/CMakeCommonLinkerInformation.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Internal/CMakeDetermineLinkerId.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Internal/FeatureTesting.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Linker/GNU.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Linker/LLD-C.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Linker/LLD-CXX.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Linker/LLD.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Platform/Android-Clang-C.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Platform/Android-Clang-CXX.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Platform/Android-Clang.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Platform/Android-Determine-C.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Platform/Android-Determine-CXX.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Platform/Android-Determine.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Platform/Android-Initialize.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Platform/Android.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Platform/Android/Determine-Compiler.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Platform/Linker/Android-LLD-C.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Platform/Linker/Android-LLD-CXX.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Platform/Linker/GNU.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Platform/Linker/Linux-GNU.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Platform/Linker/Linux-LLD-C.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Platform/Linker/Linux-LLD-CXX.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Platform/Linker/Linux-LLD.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Platform/Linux-Initialize.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Platform/Linux.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Platform/UnixPaths.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/build/cmake/abis.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/build/cmake/android-legacy.toolchain.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/build/cmake/android.toolchain.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/build/cmake/flags.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/build/cmake/hooks/pre/Android-Clang.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/build/cmake/hooks/pre/Android-Determine.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/build/cmake/hooks/pre/Android-Initialize.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/build/cmake/hooks/pre/Android.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/build/cmake/hooks/pre/Determine-Compiler.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/build/cmake/platforms.cmake /Users/hamzaaleghwairyeen/development/App/intaleq_driver/android/app/src/main/cpp/CMakeLists.txt CMakeCache.txt CMakeFiles/3.31.5-g6cf5163/CMakeCCompiler.cmake CMakeFiles/3.31.5-g6cf5163/CMakeCXXCompiler.cmake CMakeFiles/3.31.5-g6cf5163/CMakeSystem.cmake: phony + + +############################################# +# Clean all the built files. + +build clean: CLEAN + + +############################################# +# Print all primary targets available. + +build help: HELP + + +############################################# +# Make the all target the default. + +default all diff --git a/siro_driver/android/app/.cxx/Debug/2j1f5m6a/x86/build_file_index.txt b/siro_driver/android/app/.cxx/Debug/2j1f5m6a/x86/build_file_index.txt new file mode 100644 index 0000000..b1ca0fa --- /dev/null +++ b/siro_driver/android/app/.cxx/Debug/2j1f5m6a/x86/build_file_index.txt @@ -0,0 +1 @@ +/Users/hamzaaleghwairyeen/development/App/intaleq_driver/android/app/src/main/cpp/CMakeLists.txt \ No newline at end of file diff --git a/siro_driver/android/app/.cxx/Debug/2j1f5m6a/x86/cmake_install.cmake b/siro_driver/android/app/.cxx/Debug/2j1f5m6a/x86/cmake_install.cmake new file mode 100644 index 0000000..e68de95 --- /dev/null +++ b/siro_driver/android/app/.cxx/Debug/2j1f5m6a/x86/cmake_install.cmake @@ -0,0 +1,66 @@ +# Install script for directory: /Users/hamzaaleghwairyeen/development/App/intaleq_driver/android/app/src/main/cpp + +# Set the install prefix +if(NOT DEFINED CMAKE_INSTALL_PREFIX) + set(CMAKE_INSTALL_PREFIX "/usr/local") +endif() +string(REGEX REPLACE "/$" "" CMAKE_INSTALL_PREFIX "${CMAKE_INSTALL_PREFIX}") + +# Set the install configuration name. +if(NOT DEFINED CMAKE_INSTALL_CONFIG_NAME) + if(BUILD_TYPE) + string(REGEX REPLACE "^[^A-Za-z0-9_]+" "" + CMAKE_INSTALL_CONFIG_NAME "${BUILD_TYPE}") + else() + set(CMAKE_INSTALL_CONFIG_NAME "Debug") + endif() + message(STATUS "Install configuration: \"${CMAKE_INSTALL_CONFIG_NAME}\"") +endif() + +# Set the component getting installed. +if(NOT CMAKE_INSTALL_COMPONENT) + if(COMPONENT) + message(STATUS "Install component: \"${COMPONENT}\"") + set(CMAKE_INSTALL_COMPONENT "${COMPONENT}") + else() + set(CMAKE_INSTALL_COMPONENT) + endif() +endif() + +# Install shared libraries without execute permission? +if(NOT DEFINED CMAKE_INSTALL_SO_NO_EXE) + set(CMAKE_INSTALL_SO_NO_EXE "0") +endif() + +# Is this installation the result of a crosscompile? +if(NOT DEFINED CMAKE_CROSSCOMPILING) + set(CMAKE_CROSSCOMPILING "TRUE") +endif() + +# Set path to fallback-tool for dependency-resolution. +if(NOT DEFINED CMAKE_OBJDUMP) + set(CMAKE_OBJDUMP "/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/bin/llvm-objdump") +endif() + +string(REPLACE ";" "\n" CMAKE_INSTALL_MANIFEST_CONTENT + "${CMAKE_INSTALL_MANIFEST_FILES}") +if(CMAKE_INSTALL_LOCAL_ONLY) + file(WRITE "/Users/hamzaaleghwairyeen/development/App/intaleq_driver/android/app/.cxx/Debug/2j1f5m6a/x86/install_local_manifest.txt" + "${CMAKE_INSTALL_MANIFEST_CONTENT}") +endif() +if(CMAKE_INSTALL_COMPONENT) + if(CMAKE_INSTALL_COMPONENT MATCHES "^[a-zA-Z0-9_.+-]+$") + set(CMAKE_INSTALL_MANIFEST "install_manifest_${CMAKE_INSTALL_COMPONENT}.txt") + else() + string(MD5 CMAKE_INST_COMP_HASH "${CMAKE_INSTALL_COMPONENT}") + set(CMAKE_INSTALL_MANIFEST "install_manifest_${CMAKE_INST_COMP_HASH}.txt") + unset(CMAKE_INST_COMP_HASH) + endif() +else() + set(CMAKE_INSTALL_MANIFEST "install_manifest.txt") +endif() + +if(NOT CMAKE_INSTALL_LOCAL_ONLY) + file(WRITE "/Users/hamzaaleghwairyeen/development/App/intaleq_driver/android/app/.cxx/Debug/2j1f5m6a/x86/${CMAKE_INSTALL_MANIFEST}" + "${CMAKE_INSTALL_MANIFEST_CONTENT}") +endif() diff --git a/siro_driver/android/app/.cxx/Debug/2j1f5m6a/x86/compile_commands.json b/siro_driver/android/app/.cxx/Debug/2j1f5m6a/x86/compile_commands.json new file mode 100644 index 0000000..a59621a --- /dev/null +++ b/siro_driver/android/app/.cxx/Debug/2j1f5m6a/x86/compile_commands.json @@ -0,0 +1,8 @@ +[ +{ + "directory": "/Users/hamzaaleghwairyeen/development/App/intaleq_driver/android/app/.cxx/Debug/2j1f5m6a/x86", + "command": "/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/bin/clang++ --target=i686-none-linux-android23 --sysroot=/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot -Dnative_lib_EXPORTS -g -DANDROID -fdata-sections -ffunction-sections -funwind-tables -fstack-protector-strong -no-canonical-prefixes -mstackrealign -D_FORTIFY_SOURCE=2 -Wformat -Werror=format-security -fno-limit-debug-info -fPIC -o CMakeFiles/native-lib.dir/native-lib.cpp.o -c /Users/hamzaaleghwairyeen/development/App/intaleq_driver/android/app/src/main/cpp/native-lib.cpp", + "file": "/Users/hamzaaleghwairyeen/development/App/intaleq_driver/android/app/src/main/cpp/native-lib.cpp", + "output": "CMakeFiles/native-lib.dir/native-lib.cpp.o" +} +] \ No newline at end of file diff --git a/siro_driver/android/app/.cxx/Debug/2j1f5m6a/x86/compile_commands.json.bin b/siro_driver/android/app/.cxx/Debug/2j1f5m6a/x86/compile_commands.json.bin new file mode 100644 index 0000000..dff1ed7 Binary files /dev/null and b/siro_driver/android/app/.cxx/Debug/2j1f5m6a/x86/compile_commands.json.bin differ diff --git a/siro_driver/android/app/.cxx/Debug/2j1f5m6a/x86/configure_fingerprint.bin b/siro_driver/android/app/.cxx/Debug/2j1f5m6a/x86/configure_fingerprint.bin new file mode 100644 index 0000000..a6e015e --- /dev/null +++ b/siro_driver/android/app/.cxx/Debug/2j1f5m6a/x86/configure_fingerprint.bin @@ -0,0 +1,29 @@ +C/C++ Structured Log} +{ +y/Users/hamzaaleghwairyeen/development/App/intaleq_driver/android/app/.cxx/Debug/2j1f5m6a/x86/additional_project_files.txtC +A +?com.android.build.gradle.internal.cxx.io.EncodedFileFingerPrint  3  Ӂ3z +x +v/Users/hamzaaleghwairyeen/development/App/intaleq_driver/android/app/.cxx/Debug/2j1f5m6a/x86/android_gradle_build.json  3 + Ӂ3 +} +{/Users/hamzaaleghwairyeen/development/App/intaleq_driver/android/app/.cxx/Debug/2j1f5m6a/x86/android_gradle_build_mini.json  3 Ӂ3l +j +h/Users/hamzaaleghwairyeen/development/App/intaleq_driver/android/app/.cxx/Debug/2j1f5m6a/x86/build.ninja  3 Ӂ3p +n +l/Users/hamzaaleghwairyeen/development/App/intaleq_driver/android/app/.cxx/Debug/2j1f5m6a/x86/build.ninja.txt  3u +s +q/Users/hamzaaleghwairyeen/development/App/intaleq_driver/android/app/.cxx/Debug/2j1f5m6a/x86/build_file_index.txt  3 ` Ӂ3v +t +r/Users/hamzaaleghwairyeen/development/App/intaleq_driver/android/app/.cxx/Debug/2j1f5m6a/x86/compile_commands.json  3 Ӂ3z +x +v/Users/hamzaaleghwairyeen/development/App/intaleq_driver/android/app/.cxx/Debug/2j1f5m6a/x86/compile_commands.json.bin  3  Ӂ3 +~ +|/Users/hamzaaleghwairyeen/development/App/intaleq_driver/android/app/.cxx/Debug/2j1f5m6a/x86/metadata_generation_command.txt  3 + Ӂ3s +q +o/Users/hamzaaleghwairyeen/development/App/intaleq_driver/android/app/.cxx/Debug/2j1f5m6a/x86/prefab_config.json  3  ( Ӂ3x +v +t/Users/hamzaaleghwairyeen/development/App/intaleq_driver/android/app/.cxx/Debug/2j1f5m6a/x86/symbol_folder_index.txt  3  k Ӂ3d +b +`/Users/hamzaaleghwairyeen/development/App/intaleq_driver/android/app/src/main/cpp/CMakeLists.txt  3  劝2 \ No newline at end of file diff --git a/siro_driver/android/app/.cxx/Debug/2j1f5m6a/x86/metadata_generation_command.txt b/siro_driver/android/app/.cxx/Debug/2j1f5m6a/x86/metadata_generation_command.txt new file mode 100644 index 0000000..bbe55e2 --- /dev/null +++ b/siro_driver/android/app/.cxx/Debug/2j1f5m6a/x86/metadata_generation_command.txt @@ -0,0 +1,18 @@ + -H/Users/hamzaaleghwairyeen/development/App/intaleq_driver/android/app/src/main/cpp +-DCMAKE_SYSTEM_NAME=Android +-DCMAKE_EXPORT_COMPILE_COMMANDS=ON +-DCMAKE_SYSTEM_VERSION=23 +-DANDROID_PLATFORM=android-23 +-DANDROID_ABI=x86 +-DCMAKE_ANDROID_ARCH_ABI=x86 +-DANDROID_NDK=/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973 +-DCMAKE_ANDROID_NDK=/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973 +-DCMAKE_TOOLCHAIN_FILE=/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/build/cmake/android.toolchain.cmake +-DCMAKE_MAKE_PROGRAM=/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/bin/ninja +-DCMAKE_LIBRARY_OUTPUT_DIRECTORY=/Users/hamzaaleghwairyeen/development/App/intaleq_driver/build/app/intermediates/cxx/Debug/2j1f5m6a/obj/x86 +-DCMAKE_RUNTIME_OUTPUT_DIRECTORY=/Users/hamzaaleghwairyeen/development/App/intaleq_driver/build/app/intermediates/cxx/Debug/2j1f5m6a/obj/x86 +-DCMAKE_BUILD_TYPE=Debug +-B/Users/hamzaaleghwairyeen/development/App/intaleq_driver/android/app/.cxx/Debug/2j1f5m6a/x86 +-GNinja + Build command args: [] + Version: 2 \ No newline at end of file diff --git a/siro_driver/android/app/.cxx/Debug/2j1f5m6a/x86/prefab_config.json b/siro_driver/android/app/.cxx/Debug/2j1f5m6a/x86/prefab_config.json new file mode 100644 index 0000000..e799de8 --- /dev/null +++ b/siro_driver/android/app/.cxx/Debug/2j1f5m6a/x86/prefab_config.json @@ -0,0 +1,4 @@ +{ + "enabled": false, + "packages": [] +} \ No newline at end of file diff --git a/siro_driver/android/app/.cxx/Debug/2j1f5m6a/x86/symbol_folder_index.txt b/siro_driver/android/app/.cxx/Debug/2j1f5m6a/x86/symbol_folder_index.txt new file mode 100644 index 0000000..d421041 --- /dev/null +++ b/siro_driver/android/app/.cxx/Debug/2j1f5m6a/x86/symbol_folder_index.txt @@ -0,0 +1 @@ +/Users/hamzaaleghwairyeen/development/App/intaleq_driver/build/app/intermediates/cxx/Debug/2j1f5m6a/obj/x86 \ No newline at end of file diff --git a/siro_driver/android/app/.cxx/Debug/2j1f5m6a/x86_64/.cmake/api/v1/query/client-agp/cache-v2 b/siro_driver/android/app/.cxx/Debug/2j1f5m6a/x86_64/.cmake/api/v1/query/client-agp/cache-v2 new file mode 100644 index 0000000..e69de29 diff --git a/siro_driver/android/app/.cxx/Debug/2j1f5m6a/x86_64/.cmake/api/v1/query/client-agp/cmakeFiles-v1 b/siro_driver/android/app/.cxx/Debug/2j1f5m6a/x86_64/.cmake/api/v1/query/client-agp/cmakeFiles-v1 new file mode 100644 index 0000000..e69de29 diff --git a/siro_driver/android/app/.cxx/Debug/2j1f5m6a/x86_64/.cmake/api/v1/query/client-agp/codemodel-v2 b/siro_driver/android/app/.cxx/Debug/2j1f5m6a/x86_64/.cmake/api/v1/query/client-agp/codemodel-v2 new file mode 100644 index 0000000..e69de29 diff --git a/siro_driver/android/app/.cxx/Debug/2j1f5m6a/x86_64/.cmake/api/v1/reply/cache-v2-771f0baf8c720e50ed5a.json b/siro_driver/android/app/.cxx/Debug/2j1f5m6a/x86_64/.cmake/api/v1/reply/cache-v2-771f0baf8c720e50ed5a.json new file mode 100644 index 0000000..f5413f0 --- /dev/null +++ b/siro_driver/android/app/.cxx/Debug/2j1f5m6a/x86_64/.cmake/api/v1/reply/cache-v2-771f0baf8c720e50ed5a.json @@ -0,0 +1,1479 @@ +{ + "entries" : + [ + { + "name" : "ANDROID_ABI", + "properties" : + [ + { + "name" : "HELPSTRING", + "value" : "No help, variable specified on the command line." + } + ], + "type" : "UNINITIALIZED", + "value" : "x86_64" + }, + { + "name" : "ANDROID_NDK", + "properties" : + [ + { + "name" : "HELPSTRING", + "value" : "No help, variable specified on the command line." + } + ], + "type" : "UNINITIALIZED", + "value" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973" + }, + { + "name" : "ANDROID_PLATFORM", + "properties" : + [ + { + "name" : "HELPSTRING", + "value" : "No help, variable specified on the command line." + } + ], + "type" : "UNINITIALIZED", + "value" : "android-23" + }, + { + "name" : "CMAKE_ADDR2LINE", + "properties" : + [ + { + "name" : "ADVANCED", + "value" : "1" + }, + { + "name" : "HELPSTRING", + "value" : "Path to a program." + } + ], + "type" : "FILEPATH", + "value" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/bin/llvm-addr2line" + }, + { + "name" : "CMAKE_ANDROID_ARCH_ABI", + "properties" : + [ + { + "name" : "HELPSTRING", + "value" : "No help, variable specified on the command line." + } + ], + "type" : "UNINITIALIZED", + "value" : "x86_64" + }, + { + "name" : "CMAKE_ANDROID_NDK", + "properties" : + [ + { + "name" : "HELPSTRING", + "value" : "No help, variable specified on the command line." + } + ], + "type" : "UNINITIALIZED", + "value" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973" + }, + { + "name" : "CMAKE_AR", + "properties" : + [ + { + "name" : "ADVANCED", + "value" : "1" + }, + { + "name" : "HELPSTRING", + "value" : "Archiver" + } + ], + "type" : "FILEPATH", + "value" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/bin/llvm-ar" + }, + { + "name" : "CMAKE_ASM_FLAGS", + "properties" : + [ + { + "name" : "HELPSTRING", + "value" : "Flags used by the compiler during all build types." + } + ], + "type" : "STRING", + "value" : "" + }, + { + "name" : "CMAKE_ASM_FLAGS_DEBUG", + "properties" : + [ + { + "name" : "HELPSTRING", + "value" : "Flags used by the compiler during debug builds." + } + ], + "type" : "STRING", + "value" : "" + }, + { + "name" : "CMAKE_ASM_FLAGS_RELEASE", + "properties" : + [ + { + "name" : "HELPSTRING", + "value" : "Flags used by the compiler during release builds." + } + ], + "type" : "STRING", + "value" : "" + }, + { + "name" : "CMAKE_BUILD_TYPE", + "properties" : + [ + { + "name" : "HELPSTRING", + "value" : "Choose the type of build, options are: None Debug Release RelWithDebInfo MinSizeRel ..." + } + ], + "type" : "STRING", + "value" : "Debug" + }, + { + "name" : "CMAKE_CACHEFILE_DIR", + "properties" : + [ + { + "name" : "HELPSTRING", + "value" : "This is the directory where this CMakeCache.txt was created" + } + ], + "type" : "INTERNAL", + "value" : "/Users/hamzaaleghwairyeen/development/App/intaleq_driver/android/app/.cxx/Debug/2j1f5m6a/x86_64" + }, + { + "name" : "CMAKE_CACHE_MAJOR_VERSION", + "properties" : + [ + { + "name" : "HELPSTRING", + "value" : "Major version of cmake used to create the current loaded cache" + } + ], + "type" : "INTERNAL", + "value" : "3" + }, + { + "name" : "CMAKE_CACHE_MINOR_VERSION", + "properties" : + [ + { + "name" : "HELPSTRING", + "value" : "Minor version of cmake used to create the current loaded cache" + } + ], + "type" : "INTERNAL", + "value" : "31" + }, + { + "name" : "CMAKE_CACHE_PATCH_VERSION", + "properties" : + [ + { + "name" : "HELPSTRING", + "value" : "Patch version of cmake used to create the current loaded cache" + } + ], + "type" : "INTERNAL", + "value" : "5" + }, + { + "name" : "CMAKE_COMMAND", + "properties" : + [ + { + "name" : "HELPSTRING", + "value" : "Path to CMake executable." + } + ], + "type" : "INTERNAL", + "value" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/bin/cmake" + }, + { + "name" : "CMAKE_CPACK_COMMAND", + "properties" : + [ + { + "name" : "HELPSTRING", + "value" : "Path to cpack program executable." + } + ], + "type" : "INTERNAL", + "value" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/bin/cpack" + }, + { + "name" : "CMAKE_CTEST_COMMAND", + "properties" : + [ + { + "name" : "HELPSTRING", + "value" : "Path to ctest program executable." + } + ], + "type" : "INTERNAL", + "value" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/bin/ctest" + }, + { + "name" : "CMAKE_CXX_COMPILER", + "properties" : + [ + { + "name" : "ADVANCED", + "value" : "1" + }, + { + "name" : "HELPSTRING", + "value" : "" + } + ], + "type" : "UNINITIALIZED", + "value" : "" + }, + { + "name" : "CMAKE_CXX_COMPILER_AR", + "properties" : + [ + { + "name" : "ADVANCED", + "value" : "1" + }, + { + "name" : "HELPSTRING", + "value" : "LLVM archiver" + } + ], + "type" : "FILEPATH", + "value" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/bin/llvm-ar" + }, + { + "name" : "CMAKE_CXX_COMPILER_CLANG_SCAN_DEPS", + "properties" : + [ + { + "name" : "ADVANCED", + "value" : "1" + }, + { + "name" : "HELPSTRING", + "value" : "`clang-scan-deps` dependency scanner" + } + ], + "type" : "FILEPATH", + "value" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/bin/clang-scan-deps" + }, + { + "name" : "CMAKE_CXX_COMPILER_RANLIB", + "properties" : + [ + { + "name" : "ADVANCED", + "value" : "1" + }, + { + "name" : "HELPSTRING", + "value" : "Generate index for LLVM archive" + } + ], + "type" : "FILEPATH", + "value" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/bin/llvm-ranlib" + }, + { + "name" : "CMAKE_CXX_FLAGS", + "properties" : + [ + { + "name" : "ADVANCED", + "value" : "1" + }, + { + "name" : "HELPSTRING", + "value" : "Flags used by the compiler during all build types." + } + ], + "type" : "STRING", + "value" : "" + }, + { + "name" : "CMAKE_CXX_FLAGS_DEBUG", + "properties" : + [ + { + "name" : "ADVANCED", + "value" : "1" + }, + { + "name" : "HELPSTRING", + "value" : "Flags used by the compiler during debug builds." + } + ], + "type" : "STRING", + "value" : "" + }, + { + "name" : "CMAKE_CXX_FLAGS_MINSIZEREL", + "properties" : + [ + { + "name" : "ADVANCED", + "value" : "1" + }, + { + "name" : "HELPSTRING", + "value" : "Flags used by the CXX compiler during MINSIZEREL builds." + } + ], + "type" : "STRING", + "value" : "-Os -DNDEBUG" + }, + { + "name" : "CMAKE_CXX_FLAGS_RELEASE", + "properties" : + [ + { + "name" : "ADVANCED", + "value" : "1" + }, + { + "name" : "HELPSTRING", + "value" : "Flags used by the compiler during release builds." + } + ], + "type" : "STRING", + "value" : "" + }, + { + "name" : "CMAKE_CXX_FLAGS_RELWITHDEBINFO", + "properties" : + [ + { + "name" : "ADVANCED", + "value" : "1" + }, + { + "name" : "HELPSTRING", + "value" : "Flags used by the CXX compiler during RELWITHDEBINFO builds." + } + ], + "type" : "STRING", + "value" : "-O2 -g -DNDEBUG" + }, + { + "name" : "CMAKE_CXX_STANDARD_LIBRARIES", + "properties" : + [ + { + "name" : "ADVANCED", + "value" : "1" + }, + { + "name" : "HELPSTRING", + "value" : "Libraries linked by default with all C++ applications." + } + ], + "type" : "STRING", + "value" : "-latomic -lm" + }, + { + "name" : "CMAKE_C_COMPILER", + "properties" : + [ + { + "name" : "ADVANCED", + "value" : "1" + }, + { + "name" : "HELPSTRING", + "value" : "" + } + ], + "type" : "UNINITIALIZED", + "value" : "" + }, + { + "name" : "CMAKE_C_COMPILER_AR", + "properties" : + [ + { + "name" : "ADVANCED", + "value" : "1" + }, + { + "name" : "HELPSTRING", + "value" : "LLVM archiver" + } + ], + "type" : "FILEPATH", + "value" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/bin/llvm-ar" + }, + { + "name" : "CMAKE_C_COMPILER_CLANG_SCAN_DEPS", + "properties" : + [ + { + "name" : "ADVANCED", + "value" : "1" + }, + { + "name" : "HELPSTRING", + "value" : "`clang-scan-deps` dependency scanner" + } + ], + "type" : "FILEPATH", + "value" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/bin/clang-scan-deps" + }, + { + "name" : "CMAKE_C_COMPILER_RANLIB", + "properties" : + [ + { + "name" : "ADVANCED", + "value" : "1" + }, + { + "name" : "HELPSTRING", + "value" : "Generate index for LLVM archive" + } + ], + "type" : "FILEPATH", + "value" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/bin/llvm-ranlib" + }, + { + "name" : "CMAKE_C_FLAGS", + "properties" : + [ + { + "name" : "ADVANCED", + "value" : "1" + }, + { + "name" : "HELPSTRING", + "value" : "Flags used by the compiler during all build types." + } + ], + "type" : "STRING", + "value" : "" + }, + { + "name" : "CMAKE_C_FLAGS_DEBUG", + "properties" : + [ + { + "name" : "ADVANCED", + "value" : "1" + }, + { + "name" : "HELPSTRING", + "value" : "Flags used by the compiler during debug builds." + } + ], + "type" : "STRING", + "value" : "" + }, + { + "name" : "CMAKE_C_FLAGS_MINSIZEREL", + "properties" : + [ + { + "name" : "ADVANCED", + "value" : "1" + }, + { + "name" : "HELPSTRING", + "value" : "Flags used by the C compiler during MINSIZEREL builds." + } + ], + "type" : "STRING", + "value" : "-Os -DNDEBUG" + }, + { + "name" : "CMAKE_C_FLAGS_RELEASE", + "properties" : + [ + { + "name" : "ADVANCED", + "value" : "1" + }, + { + "name" : "HELPSTRING", + "value" : "Flags used by the compiler during release builds." + } + ], + "type" : "STRING", + "value" : "" + }, + { + "name" : "CMAKE_C_FLAGS_RELWITHDEBINFO", + "properties" : + [ + { + "name" : "ADVANCED", + "value" : "1" + }, + { + "name" : "HELPSTRING", + "value" : "Flags used by the C compiler during RELWITHDEBINFO builds." + } + ], + "type" : "STRING", + "value" : "-O2 -g -DNDEBUG" + }, + { + "name" : "CMAKE_C_STANDARD_LIBRARIES", + "properties" : + [ + { + "name" : "ADVANCED", + "value" : "1" + }, + { + "name" : "HELPSTRING", + "value" : "Libraries linked by default with all C applications." + } + ], + "type" : "STRING", + "value" : "-latomic -lm" + }, + { + "name" : "CMAKE_DLLTOOL", + "properties" : + [ + { + "name" : "ADVANCED", + "value" : "1" + }, + { + "name" : "HELPSTRING", + "value" : "Path to a program." + } + ], + "type" : "FILEPATH", + "value" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/bin/llvm-dlltool" + }, + { + "name" : "CMAKE_EDIT_COMMAND", + "properties" : + [ + { + "name" : "HELPSTRING", + "value" : "Path to cache edit program executable." + } + ], + "type" : "INTERNAL", + "value" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/bin/ccmake" + }, + { + "name" : "CMAKE_EXECUTABLE_FORMAT", + "properties" : + [ + { + "name" : "HELPSTRING", + "value" : "Executable file format" + } + ], + "type" : "INTERNAL", + "value" : "ELF" + }, + { + "name" : "CMAKE_EXE_LINKER_FLAGS", + "properties" : + [ + { + "name" : "ADVANCED", + "value" : "1" + }, + { + "name" : "HELPSTRING", + "value" : "Flags used by the linker." + } + ], + "type" : "STRING", + "value" : "" + }, + { + "name" : "CMAKE_EXE_LINKER_FLAGS_DEBUG", + "properties" : + [ + { + "name" : "ADVANCED", + "value" : "1" + }, + { + "name" : "HELPSTRING", + "value" : "Flags used by the linker during DEBUG builds." + } + ], + "type" : "STRING", + "value" : "" + }, + { + "name" : "CMAKE_EXE_LINKER_FLAGS_MINSIZEREL", + "properties" : + [ + { + "name" : "ADVANCED", + "value" : "1" + }, + { + "name" : "HELPSTRING", + "value" : "Flags used by the linker during MINSIZEREL builds." + } + ], + "type" : "STRING", + "value" : "" + }, + { + "name" : "CMAKE_EXE_LINKER_FLAGS_RELEASE", + "properties" : + [ + { + "name" : "ADVANCED", + "value" : "1" + }, + { + "name" : "HELPSTRING", + "value" : "Flags used by the linker during RELEASE builds." + } + ], + "type" : "STRING", + "value" : "" + }, + { + "name" : "CMAKE_EXE_LINKER_FLAGS_RELWITHDEBINFO", + "properties" : + [ + { + "name" : "ADVANCED", + "value" : "1" + }, + { + "name" : "HELPSTRING", + "value" : "Flags used by the linker during RELWITHDEBINFO builds." + } + ], + "type" : "STRING", + "value" : "" + }, + { + "name" : "CMAKE_EXPORT_BUILD_DATABASE", + "properties" : + [ + { + "name" : "ADVANCED", + "value" : "1" + }, + { + "name" : "HELPSTRING", + "value" : "Enable/Disable output of build database during the build." + } + ], + "type" : "BOOL", + "value" : "" + }, + { + "name" : "CMAKE_EXPORT_COMPILE_COMMANDS", + "properties" : + [ + { + "name" : "HELPSTRING", + "value" : "No help, variable specified on the command line." + } + ], + "type" : "UNINITIALIZED", + "value" : "ON" + }, + { + "name" : "CMAKE_EXTRA_GENERATOR", + "properties" : + [ + { + "name" : "HELPSTRING", + "value" : "Name of external makefile project generator." + } + ], + "type" : "INTERNAL", + "value" : "" + }, + { + "name" : "CMAKE_FIND_PACKAGE_REDIRECTS_DIR", + "properties" : + [ + { + "name" : "HELPSTRING", + "value" : "Value Computed by CMake." + } + ], + "type" : "STATIC", + "value" : "/Users/hamzaaleghwairyeen/development/App/intaleq_driver/android/app/.cxx/Debug/2j1f5m6a/x86_64/CMakeFiles/pkgRedirects" + }, + { + "name" : "CMAKE_GENERATOR", + "properties" : + [ + { + "name" : "HELPSTRING", + "value" : "Name of generator." + } + ], + "type" : "INTERNAL", + "value" : "Ninja" + }, + { + "name" : "CMAKE_GENERATOR_INSTANCE", + "properties" : + [ + { + "name" : "HELPSTRING", + "value" : "Generator instance identifier." + } + ], + "type" : "INTERNAL", + "value" : "" + }, + { + "name" : "CMAKE_GENERATOR_PLATFORM", + "properties" : + [ + { + "name" : "HELPSTRING", + "value" : "Name of generator platform." + } + ], + "type" : "INTERNAL", + "value" : "" + }, + { + "name" : "CMAKE_GENERATOR_TOOLSET", + "properties" : + [ + { + "name" : "HELPSTRING", + "value" : "Name of generator toolset." + } + ], + "type" : "INTERNAL", + "value" : "" + }, + { + "name" : "CMAKE_HOME_DIRECTORY", + "properties" : + [ + { + "name" : "HELPSTRING", + "value" : "Source directory with the top level CMakeLists.txt file for this project" + } + ], + "type" : "INTERNAL", + "value" : "/Users/hamzaaleghwairyeen/development/App/intaleq_driver/android/app/src/main/cpp" + }, + { + "name" : "CMAKE_INSTALL_PREFIX", + "properties" : + [ + { + "name" : "HELPSTRING", + "value" : "Install path prefix, prepended onto install directories." + } + ], + "type" : "PATH", + "value" : "/usr/local" + }, + { + "name" : "CMAKE_INSTALL_SO_NO_EXE", + "properties" : + [ + { + "name" : "HELPSTRING", + "value" : "Install .so files without execute permission." + } + ], + "type" : "INTERNAL", + "value" : "0" + }, + { + "name" : "CMAKE_LIBRARY_OUTPUT_DIRECTORY", + "properties" : + [ + { + "name" : "HELPSTRING", + "value" : "No help, variable specified on the command line." + } + ], + "type" : "UNINITIALIZED", + "value" : "/Users/hamzaaleghwairyeen/development/App/intaleq_driver/build/app/intermediates/cxx/Debug/2j1f5m6a/obj/x86_64" + }, + { + "name" : "CMAKE_LINKER", + "properties" : + [ + { + "name" : "ADVANCED", + "value" : "1" + }, + { + "name" : "HELPSTRING", + "value" : "Path to a program." + } + ], + "type" : "FILEPATH", + "value" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/bin/ld.lld" + }, + { + "name" : "CMAKE_MAKE_PROGRAM", + "properties" : + [ + { + "name" : "HELPSTRING", + "value" : "No help, variable specified on the command line." + } + ], + "type" : "UNINITIALIZED", + "value" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/bin/ninja" + }, + { + "name" : "CMAKE_MODULE_LINKER_FLAGS", + "properties" : + [ + { + "name" : "ADVANCED", + "value" : "1" + }, + { + "name" : "HELPSTRING", + "value" : "Flags used by the linker during the creation of modules." + } + ], + "type" : "STRING", + "value" : "" + }, + { + "name" : "CMAKE_MODULE_LINKER_FLAGS_DEBUG", + "properties" : + [ + { + "name" : "ADVANCED", + "value" : "1" + }, + { + "name" : "HELPSTRING", + "value" : "Flags used by the linker during the creation of modules during DEBUG builds." + } + ], + "type" : "STRING", + "value" : "" + }, + { + "name" : "CMAKE_MODULE_LINKER_FLAGS_MINSIZEREL", + "properties" : + [ + { + "name" : "ADVANCED", + "value" : "1" + }, + { + "name" : "HELPSTRING", + "value" : "Flags used by the linker during the creation of modules during MINSIZEREL builds." + } + ], + "type" : "STRING", + "value" : "" + }, + { + "name" : "CMAKE_MODULE_LINKER_FLAGS_RELEASE", + "properties" : + [ + { + "name" : "ADVANCED", + "value" : "1" + }, + { + "name" : "HELPSTRING", + "value" : "Flags used by the linker during the creation of modules during RELEASE builds." + } + ], + "type" : "STRING", + "value" : "" + }, + { + "name" : "CMAKE_MODULE_LINKER_FLAGS_RELWITHDEBINFO", + "properties" : + [ + { + "name" : "ADVANCED", + "value" : "1" + }, + { + "name" : "HELPSTRING", + "value" : "Flags used by the linker during the creation of modules during RELWITHDEBINFO builds." + } + ], + "type" : "STRING", + "value" : "" + }, + { + "name" : "CMAKE_NM", + "properties" : + [ + { + "name" : "ADVANCED", + "value" : "1" + }, + { + "name" : "HELPSTRING", + "value" : "Path to a program." + } + ], + "type" : "FILEPATH", + "value" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/bin/llvm-nm" + }, + { + "name" : "CMAKE_NUMBER_OF_MAKEFILES", + "properties" : + [ + { + "name" : "HELPSTRING", + "value" : "number of local generators" + } + ], + "type" : "INTERNAL", + "value" : "1" + }, + { + "name" : "CMAKE_OBJCOPY", + "properties" : + [ + { + "name" : "ADVANCED", + "value" : "1" + }, + { + "name" : "HELPSTRING", + "value" : "Path to a program." + } + ], + "type" : "FILEPATH", + "value" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/bin/llvm-objcopy" + }, + { + "name" : "CMAKE_OBJDUMP", + "properties" : + [ + { + "name" : "ADVANCED", + "value" : "1" + }, + { + "name" : "HELPSTRING", + "value" : "Path to a program." + } + ], + "type" : "FILEPATH", + "value" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/bin/llvm-objdump" + }, + { + "name" : "CMAKE_PLATFORM_INFO_INITIALIZED", + "properties" : + [ + { + "name" : "HELPSTRING", + "value" : "Platform information initialized" + } + ], + "type" : "INTERNAL", + "value" : "1" + }, + { + "name" : "CMAKE_PROJECT_DESCRIPTION", + "properties" : + [ + { + "name" : "HELPSTRING", + "value" : "Value Computed by CMake" + } + ], + "type" : "STATIC", + "value" : "" + }, + { + "name" : "CMAKE_PROJECT_HOMEPAGE_URL", + "properties" : + [ + { + "name" : "HELPSTRING", + "value" : "Value Computed by CMake" + } + ], + "type" : "STATIC", + "value" : "" + }, + { + "name" : "CMAKE_PROJECT_NAME", + "properties" : + [ + { + "name" : "HELPSTRING", + "value" : "Value Computed by CMake" + } + ], + "type" : "STATIC", + "value" : "intaleq_driver" + }, + { + "name" : "CMAKE_RANLIB", + "properties" : + [ + { + "name" : "ADVANCED", + "value" : "1" + }, + { + "name" : "HELPSTRING", + "value" : "Ranlib" + } + ], + "type" : "FILEPATH", + "value" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/bin/llvm-ranlib" + }, + { + "name" : "CMAKE_READELF", + "properties" : + [ + { + "name" : "ADVANCED", + "value" : "1" + }, + { + "name" : "HELPSTRING", + "value" : "Path to a program." + } + ], + "type" : "FILEPATH", + "value" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/bin/llvm-readelf" + }, + { + "name" : "CMAKE_ROOT", + "properties" : + [ + { + "name" : "HELPSTRING", + "value" : "Path to CMake installation." + } + ], + "type" : "INTERNAL", + "value" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31" + }, + { + "name" : "CMAKE_RUNTIME_OUTPUT_DIRECTORY", + "properties" : + [ + { + "name" : "HELPSTRING", + "value" : "No help, variable specified on the command line." + } + ], + "type" : "UNINITIALIZED", + "value" : "/Users/hamzaaleghwairyeen/development/App/intaleq_driver/build/app/intermediates/cxx/Debug/2j1f5m6a/obj/x86_64" + }, + { + "name" : "CMAKE_SHARED_LINKER_FLAGS", + "properties" : + [ + { + "name" : "ADVANCED", + "value" : "1" + }, + { + "name" : "HELPSTRING", + "value" : "Flags used by the linker during the creation of dll's." + } + ], + "type" : "STRING", + "value" : "" + }, + { + "name" : "CMAKE_SHARED_LINKER_FLAGS_DEBUG", + "properties" : + [ + { + "name" : "ADVANCED", + "value" : "1" + }, + { + "name" : "HELPSTRING", + "value" : "Flags used by the linker during the creation of shared libraries during DEBUG builds." + } + ], + "type" : "STRING", + "value" : "" + }, + { + "name" : "CMAKE_SHARED_LINKER_FLAGS_MINSIZEREL", + "properties" : + [ + { + "name" : "ADVANCED", + "value" : "1" + }, + { + "name" : "HELPSTRING", + "value" : "Flags used by the linker during the creation of shared libraries during MINSIZEREL builds." + } + ], + "type" : "STRING", + "value" : "" + }, + { + "name" : "CMAKE_SHARED_LINKER_FLAGS_RELEASE", + "properties" : + [ + { + "name" : "ADVANCED", + "value" : "1" + }, + { + "name" : "HELPSTRING", + "value" : "Flags used by the linker during the creation of shared libraries during RELEASE builds." + } + ], + "type" : "STRING", + "value" : "" + }, + { + "name" : "CMAKE_SHARED_LINKER_FLAGS_RELWITHDEBINFO", + "properties" : + [ + { + "name" : "ADVANCED", + "value" : "1" + }, + { + "name" : "HELPSTRING", + "value" : "Flags used by the linker during the creation of shared libraries during RELWITHDEBINFO builds." + } + ], + "type" : "STRING", + "value" : "" + }, + { + "name" : "CMAKE_SKIP_INSTALL_RPATH", + "properties" : + [ + { + "name" : "ADVANCED", + "value" : "1" + }, + { + "name" : "HELPSTRING", + "value" : "If set, runtime paths are not added when installing shared libraries, but are added when building." + } + ], + "type" : "BOOL", + "value" : "NO" + }, + { + "name" : "CMAKE_SKIP_RPATH", + "properties" : + [ + { + "name" : "ADVANCED", + "value" : "1" + }, + { + "name" : "HELPSTRING", + "value" : "If set, runtime paths are not added when using shared libraries." + } + ], + "type" : "BOOL", + "value" : "NO" + }, + { + "name" : "CMAKE_STATIC_LINKER_FLAGS", + "properties" : + [ + { + "name" : "ADVANCED", + "value" : "1" + }, + { + "name" : "HELPSTRING", + "value" : "Flags used by the linker during the creation of static libraries during all build types." + } + ], + "type" : "STRING", + "value" : "" + }, + { + "name" : "CMAKE_STATIC_LINKER_FLAGS_DEBUG", + "properties" : + [ + { + "name" : "ADVANCED", + "value" : "1" + }, + { + "name" : "HELPSTRING", + "value" : "Flags used by the linker during the creation of static libraries during DEBUG builds." + } + ], + "type" : "STRING", + "value" : "" + }, + { + "name" : "CMAKE_STATIC_LINKER_FLAGS_MINSIZEREL", + "properties" : + [ + { + "name" : "ADVANCED", + "value" : "1" + }, + { + "name" : "HELPSTRING", + "value" : "Flags used by the linker during the creation of static libraries during MINSIZEREL builds." + } + ], + "type" : "STRING", + "value" : "" + }, + { + "name" : "CMAKE_STATIC_LINKER_FLAGS_RELEASE", + "properties" : + [ + { + "name" : "ADVANCED", + "value" : "1" + }, + { + "name" : "HELPSTRING", + "value" : "Flags used by the linker during the creation of static libraries during RELEASE builds." + } + ], + "type" : "STRING", + "value" : "" + }, + { + "name" : "CMAKE_STATIC_LINKER_FLAGS_RELWITHDEBINFO", + "properties" : + [ + { + "name" : "ADVANCED", + "value" : "1" + }, + { + "name" : "HELPSTRING", + "value" : "Flags used by the linker during the creation of static libraries during RELWITHDEBINFO builds." + } + ], + "type" : "STRING", + "value" : "" + }, + { + "name" : "CMAKE_STRIP", + "properties" : + [ + { + "name" : "ADVANCED", + "value" : "1" + }, + { + "name" : "HELPSTRING", + "value" : "Strip" + } + ], + "type" : "FILEPATH", + "value" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/bin/llvm-strip" + }, + { + "name" : "CMAKE_SYSTEM_NAME", + "properties" : + [ + { + "name" : "HELPSTRING", + "value" : "No help, variable specified on the command line." + } + ], + "type" : "UNINITIALIZED", + "value" : "Android" + }, + { + "name" : "CMAKE_SYSTEM_VERSION", + "properties" : + [ + { + "name" : "HELPSTRING", + "value" : "No help, variable specified on the command line." + } + ], + "type" : "UNINITIALIZED", + "value" : "23" + }, + { + "name" : "CMAKE_TAPI", + "properties" : + [ + { + "name" : "ADVANCED", + "value" : "1" + }, + { + "name" : "HELPSTRING", + "value" : "Path to a program." + } + ], + "type" : "FILEPATH", + "value" : "CMAKE_TAPI-NOTFOUND" + }, + { + "name" : "CMAKE_TOOLCHAIN_FILE", + "properties" : + [ + { + "name" : "HELPSTRING", + "value" : "The CMake toolchain file" + } + ], + "type" : "FILEPATH", + "value" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/build/cmake/android.toolchain.cmake" + }, + { + "name" : "CMAKE_UNAME", + "properties" : + [ + { + "name" : "HELPSTRING", + "value" : "uname command" + } + ], + "type" : "INTERNAL", + "value" : "/usr/bin/uname" + }, + { + "name" : "CMAKE_VERBOSE_MAKEFILE", + "properties" : + [ + { + "name" : "ADVANCED", + "value" : "1" + }, + { + "name" : "HELPSTRING", + "value" : "If this value is on, makefiles will be generated without the .SILENT directive, and all commands will be echoed to the console during the make. This is useful for debugging only. With Visual Studio IDE projects all commands are done without /nologo." + } + ], + "type" : "BOOL", + "value" : "FALSE" + }, + { + "name" : "_CMAKE_CXX_LINKER_PUSHPOP_STATE_SUPPORTED", + "properties" : + [ + { + "name" : "HELPSTRING", + "value" : "linker supports push/pop state" + } + ], + "type" : "INTERNAL", + "value" : "TRUE" + }, + { + "name" : "_CMAKE_C_LINKER_PUSHPOP_STATE_SUPPORTED", + "properties" : + [ + { + "name" : "HELPSTRING", + "value" : "linker supports push/pop state" + } + ], + "type" : "INTERNAL", + "value" : "TRUE" + }, + { + "name" : "_CMAKE_LINKER_PUSHPOP_STATE_SUPPORTED", + "properties" : + [ + { + "name" : "HELPSTRING", + "value" : "linker supports push/pop state" + } + ], + "type" : "INTERNAL", + "value" : "TRUE" + }, + { + "name" : "intaleq_driver_BINARY_DIR", + "properties" : + [ + { + "name" : "HELPSTRING", + "value" : "Value Computed by CMake" + } + ], + "type" : "STATIC", + "value" : "/Users/hamzaaleghwairyeen/development/App/intaleq_driver/android/app/.cxx/Debug/2j1f5m6a/x86_64" + }, + { + "name" : "intaleq_driver_IS_TOP_LEVEL", + "properties" : + [ + { + "name" : "HELPSTRING", + "value" : "Value Computed by CMake" + } + ], + "type" : "STATIC", + "value" : "ON" + }, + { + "name" : "intaleq_driver_SOURCE_DIR", + "properties" : + [ + { + "name" : "HELPSTRING", + "value" : "Value Computed by CMake" + } + ], + "type" : "STATIC", + "value" : "/Users/hamzaaleghwairyeen/development/App/intaleq_driver/android/app/src/main/cpp" + }, + { + "name" : "log-lib", + "properties" : + [ + { + "name" : "HELPSTRING", + "value" : "Path to a library." + } + ], + "type" : "FILEPATH", + "value" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/lib/x86_64-linux-android/23/liblog.so" + }, + { + "name" : "native-lib_LIB_DEPENDS", + "properties" : + [ + { + "name" : "HELPSTRING", + "value" : "Dependencies for the target" + } + ], + "type" : "STATIC", + "value" : "general;/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/lib/x86_64-linux-android/23/liblog.so;" + } + ], + "kind" : "cache", + "version" : + { + "major" : 2, + "minor" : 0 + } +} diff --git a/siro_driver/android/app/.cxx/Debug/2j1f5m6a/x86_64/.cmake/api/v1/reply/cmakeFiles-v1-39d23928757c5570536f.json b/siro_driver/android/app/.cxx/Debug/2j1f5m6a/x86_64/.cmake/api/v1/reply/cmakeFiles-v1-39d23928757c5570536f.json new file mode 100644 index 0000000..d4cb0f4 --- /dev/null +++ b/siro_driver/android/app/.cxx/Debug/2j1f5m6a/x86_64/.cmake/api/v1/reply/cmakeFiles-v1-39d23928757c5570536f.json @@ -0,0 +1,968 @@ +{ + "inputs" : + [ + { + "path" : "CMakeLists.txt" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeDetermineSystem.cmake" + }, + { + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/build/cmake/android.toolchain.cmake" + }, + { + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/build/cmake/android-legacy.toolchain.cmake" + }, + { + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/build/cmake/abis.cmake" + }, + { + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/build/cmake/platforms.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Platform/Android-Determine.cmake" + }, + { + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/build/cmake/hooks/pre/Android-Determine.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeSystem.cmake.in" + }, + { + "isGenerated" : true, + "path" : "/Users/hamzaaleghwairyeen/development/App/intaleq_driver/android/app/.cxx/Debug/2j1f5m6a/x86_64/CMakeFiles/3.31.5-g6cf5163/CMakeSystem.cmake" + }, + { + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/build/cmake/android.toolchain.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeSystemSpecificInitialize.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Platform/Android-Initialize.cmake" + }, + { + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/build/cmake/hooks/pre/Android-Initialize.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Platform/Linux-Initialize.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeDetermineCCompiler.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeDetermineCompiler.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Platform/Android-Determine-C.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Platform/Android/Determine-Compiler.cmake" + }, + { + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/build/cmake/hooks/pre/Determine-Compiler.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeDetermineCompilerId.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeCompilerIdDetection.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/ADSP-DetermineCompiler.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/ARMCC-DetermineCompiler.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/ARMClang-DetermineCompiler.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/AppleClang-DetermineCompiler.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/Clang-DetermineCompilerInternal.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/Borland-DetermineCompiler.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/Bruce-C-DetermineCompiler.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/Clang-DetermineCompiler.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/Clang-DetermineCompilerInternal.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/Compaq-C-DetermineCompiler.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/Cray-DetermineCompiler.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/CrayClang-DetermineCompiler.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/Embarcadero-DetermineCompiler.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/Fujitsu-DetermineCompiler.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/FujitsuClang-DetermineCompiler.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/GHS-DetermineCompiler.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/GNU-C-DetermineCompiler.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/HP-C-DetermineCompiler.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/IAR-DetermineCompiler.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/IBMClang-C-DetermineCompiler.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/Intel-DetermineCompiler.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/IntelLLVM-DetermineCompiler.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/LCC-C-DetermineCompiler.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/MSVC-DetermineCompiler.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/NVHPC-DetermineCompiler.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/NVIDIA-DetermineCompiler.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/OpenWatcom-DetermineCompiler.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/OrangeC-DetermineCompiler.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/PGI-DetermineCompiler.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/PathScale-DetermineCompiler.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/SCO-DetermineCompiler.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/SDCC-C-DetermineCompiler.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/SunPro-C-DetermineCompiler.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/TI-DetermineCompiler.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/TIClang-DetermineCompiler.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/Tasking-DetermineCompiler.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/TinyCC-C-DetermineCompiler.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/VisualAge-C-DetermineCompiler.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/IBMCPP-C-DetermineVersionInternal.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/Watcom-DetermineCompiler.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/XL-C-DetermineCompiler.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/IBMCPP-C-DetermineVersionInternal.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/XLClang-C-DetermineCompiler.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/zOS-C-DetermineCompiler.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/IBMCPP-C-DetermineVersionInternal.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeFindBinUtils.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/Clang-FindBinUtils.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeCCompiler.cmake.in" + }, + { + "isGenerated" : true, + "path" : "/Users/hamzaaleghwairyeen/development/App/intaleq_driver/android/app/.cxx/Debug/2j1f5m6a/x86_64/CMakeFiles/3.31.5-g6cf5163/CMakeCCompiler.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeDetermineCXXCompiler.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeDetermineCompiler.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Platform/Android-Determine-CXX.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Platform/Android/Determine-Compiler.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeDetermineCompilerId.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeCompilerIdDetection.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/ADSP-DetermineCompiler.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/ARMCC-DetermineCompiler.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/ARMClang-DetermineCompiler.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/AppleClang-DetermineCompiler.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/Clang-DetermineCompilerInternal.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/Borland-DetermineCompiler.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/Clang-DetermineCompiler.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/Clang-DetermineCompilerInternal.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/Compaq-CXX-DetermineCompiler.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/Cray-DetermineCompiler.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/CrayClang-DetermineCompiler.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/Embarcadero-DetermineCompiler.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/Fujitsu-DetermineCompiler.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/FujitsuClang-DetermineCompiler.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/GHS-DetermineCompiler.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/GNU-CXX-DetermineCompiler.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/HP-CXX-DetermineCompiler.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/IAR-DetermineCompiler.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/IBMClang-CXX-DetermineCompiler.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/Intel-DetermineCompiler.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/IntelLLVM-DetermineCompiler.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/LCC-CXX-DetermineCompiler.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/MSVC-DetermineCompiler.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/NVHPC-DetermineCompiler.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/NVIDIA-DetermineCompiler.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/OpenWatcom-DetermineCompiler.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/OrangeC-DetermineCompiler.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/PGI-DetermineCompiler.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/PathScale-DetermineCompiler.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/SCO-DetermineCompiler.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/SunPro-CXX-DetermineCompiler.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/TI-DetermineCompiler.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/TIClang-DetermineCompiler.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/Tasking-DetermineCompiler.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/VisualAge-CXX-DetermineCompiler.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/IBMCPP-CXX-DetermineVersionInternal.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/Watcom-DetermineCompiler.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/XL-CXX-DetermineCompiler.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/IBMCPP-CXX-DetermineVersionInternal.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/XLClang-CXX-DetermineCompiler.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/zOS-CXX-DetermineCompiler.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/IBMCPP-CXX-DetermineVersionInternal.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeFindBinUtils.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/Clang-FindBinUtils.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeCXXCompiler.cmake.in" + }, + { + "isGenerated" : true, + "path" : "/Users/hamzaaleghwairyeen/development/App/intaleq_driver/android/app/.cxx/Debug/2j1f5m6a/x86_64/CMakeFiles/3.31.5-g6cf5163/CMakeCXXCompiler.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeSystemSpecificInformation.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeGenericSystem.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeInitializeConfigs.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Platform/Android.cmake" + }, + { + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/build/cmake/hooks/pre/Android.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Platform/Linux.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Platform/UnixPaths.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeCInformation.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeLanguageInformation.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/Clang-C.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/Clang.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/CMakeCommonCompilerMacros.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/GNU.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/CMakeCommonCompilerMacros.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Platform/Android-Clang-C.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Platform/Android-Clang.cmake" + }, + { + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/build/cmake/hooks/pre/Android-Clang.cmake" + }, + { + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/build/cmake/flags.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeCommonLanguageInclude.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeTestCCompiler.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeTestCompilerCommon.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeDetermineCompilerABI.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Internal/CMakeDetermineLinkerId.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeParseImplicitIncludeInfo.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeParseImplicitLinkInfo.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeParseLibraryArchitecture.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeTestCompilerCommon.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeCCompilerABI.c" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeDetermineCompilerSupport.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Internal/FeatureTesting.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeCCompiler.cmake.in" + }, + { + "isGenerated" : true, + "path" : "/Users/hamzaaleghwairyeen/development/App/intaleq_driver/android/app/.cxx/Debug/2j1f5m6a/x86_64/CMakeFiles/3.31.5-g6cf5163/CMakeCCompiler.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Internal/CMakeCLinkerInformation.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Internal/CMakeCommonLinkerInformation.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Linker/LLD-C.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Linker/LLD.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Linker/GNU.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Platform/Linker/Android-LLD-C.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Platform/Linker/Linux-LLD-C.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Platform/Linker/Linux-LLD.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Platform/Linker/Linux-GNU.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Platform/Linker/GNU.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeCXXInformation.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeLanguageInformation.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/Clang-CXX.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/Clang.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Platform/Android-Clang-CXX.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Platform/Android-Clang.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeCommonLanguageInclude.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeTestCXXCompiler.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeTestCompilerCommon.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeDetermineCompilerABI.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Internal/CMakeDetermineLinkerId.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeParseImplicitIncludeInfo.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeParseImplicitLinkInfo.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeParseLibraryArchitecture.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeTestCompilerCommon.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeCXXCompilerABI.cpp" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeDetermineCompilerSupport.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Internal/FeatureTesting.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/Clang-CXX-CXXImportStd.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/Clang-CXX-CXXImportStd.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeCXXCompiler.cmake.in" + }, + { + "isGenerated" : true, + "path" : "/Users/hamzaaleghwairyeen/development/App/intaleq_driver/android/app/.cxx/Debug/2j1f5m6a/x86_64/CMakeFiles/3.31.5-g6cf5163/CMakeCXXCompiler.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Internal/CMakeCXXLinkerInformation.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Internal/CMakeCommonLinkerInformation.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Linker/LLD-CXX.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Linker/LLD.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Platform/Linker/Android-LLD-CXX.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Platform/Linker/Linux-LLD-CXX.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Platform/Linker/Linux-LLD.cmake" + } + ], + "kind" : "cmakeFiles", + "paths" : + { + "build" : "/Users/hamzaaleghwairyeen/development/App/intaleq_driver/android/app/.cxx/Debug/2j1f5m6a/x86_64", + "source" : "/Users/hamzaaleghwairyeen/development/App/intaleq_driver/android/app/src/main/cpp" + }, + "version" : + { + "major" : 1, + "minor" : 1 + } +} diff --git a/siro_driver/android/app/.cxx/Debug/2j1f5m6a/x86_64/.cmake/api/v1/reply/codemodel-v2-06be0ac352f74f4237d3.json b/siro_driver/android/app/.cxx/Debug/2j1f5m6a/x86_64/.cmake/api/v1/reply/codemodel-v2-06be0ac352f74f4237d3.json new file mode 100644 index 0000000..dcb7096 --- /dev/null +++ b/siro_driver/android/app/.cxx/Debug/2j1f5m6a/x86_64/.cmake/api/v1/reply/codemodel-v2-06be0ac352f74f4237d3.json @@ -0,0 +1,60 @@ +{ + "configurations" : + [ + { + "directories" : + [ + { + "build" : ".", + "jsonFile" : "directory-.-Debug-f5ebdc15457944623624.json", + "minimumCMakeVersion" : + { + "string" : "3.6.0" + }, + "projectIndex" : 0, + "source" : ".", + "targetIndexes" : + [ + 0 + ] + } + ], + "name" : "Debug", + "projects" : + [ + { + "directoryIndexes" : + [ + 0 + ], + "name" : "intaleq_driver", + "targetIndexes" : + [ + 0 + ] + } + ], + "targets" : + [ + { + "directoryIndex" : 0, + "id" : "native-lib::@6890427a1f51a3e7e1df", + "jsonFile" : "target-native-lib-Debug-e2206948ef59b6eac031.json", + "name" : "native-lib", + "projectIndex" : 0 + } + ] + } + ], + "kind" : "codemodel", + "paths" : + { + "build" : "/Users/hamzaaleghwairyeen/development/App/intaleq_driver/android/app/.cxx/Debug/2j1f5m6a/x86_64", + "source" : "/Users/hamzaaleghwairyeen/development/App/intaleq_driver/android/app/src/main/cpp" + }, + "version" : + { + "major" : 2, + "minor" : 7 + } +} diff --git a/siro_driver/android/app/.cxx/Debug/2j1f5m6a/x86_64/.cmake/api/v1/reply/directory-.-Debug-f5ebdc15457944623624.json b/siro_driver/android/app/.cxx/Debug/2j1f5m6a/x86_64/.cmake/api/v1/reply/directory-.-Debug-f5ebdc15457944623624.json new file mode 100644 index 0000000..3a67af9 --- /dev/null +++ b/siro_driver/android/app/.cxx/Debug/2j1f5m6a/x86_64/.cmake/api/v1/reply/directory-.-Debug-f5ebdc15457944623624.json @@ -0,0 +1,14 @@ +{ + "backtraceGraph" : + { + "commands" : [], + "files" : [], + "nodes" : [] + }, + "installers" : [], + "paths" : + { + "build" : ".", + "source" : "." + } +} diff --git a/siro_driver/android/app/.cxx/Debug/2j1f5m6a/x86_64/.cmake/api/v1/reply/index-2025-07-17T21-58-02-0463.json b/siro_driver/android/app/.cxx/Debug/2j1f5m6a/x86_64/.cmake/api/v1/reply/index-2025-07-17T21-58-02-0463.json new file mode 100644 index 0000000..23a9e59 --- /dev/null +++ b/siro_driver/android/app/.cxx/Debug/2j1f5m6a/x86_64/.cmake/api/v1/reply/index-2025-07-17T21-58-02-0463.json @@ -0,0 +1,92 @@ +{ + "cmake" : + { + "generator" : + { + "multiConfig" : false, + "name" : "Ninja" + }, + "paths" : + { + "cmake" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/bin/cmake", + "cpack" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/bin/cpack", + "ctest" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/bin/ctest", + "root" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31" + }, + "version" : + { + "isDirty" : false, + "major" : 3, + "minor" : 31, + "patch" : 5, + "string" : "3.31.5-g6cf5163", + "suffix" : "g6cf5163" + } + }, + "objects" : + [ + { + "jsonFile" : "codemodel-v2-06be0ac352f74f4237d3.json", + "kind" : "codemodel", + "version" : + { + "major" : 2, + "minor" : 7 + } + }, + { + "jsonFile" : "cache-v2-771f0baf8c720e50ed5a.json", + "kind" : "cache", + "version" : + { + "major" : 2, + "minor" : 0 + } + }, + { + "jsonFile" : "cmakeFiles-v1-39d23928757c5570536f.json", + "kind" : "cmakeFiles", + "version" : + { + "major" : 1, + "minor" : 1 + } + } + ], + "reply" : + { + "client-agp" : + { + "cache-v2" : + { + "jsonFile" : "cache-v2-771f0baf8c720e50ed5a.json", + "kind" : "cache", + "version" : + { + "major" : 2, + "minor" : 0 + } + }, + "cmakeFiles-v1" : + { + "jsonFile" : "cmakeFiles-v1-39d23928757c5570536f.json", + "kind" : "cmakeFiles", + "version" : + { + "major" : 1, + "minor" : 1 + } + }, + "codemodel-v2" : + { + "jsonFile" : "codemodel-v2-06be0ac352f74f4237d3.json", + "kind" : "codemodel", + "version" : + { + "major" : 2, + "minor" : 7 + } + } + } + } +} diff --git a/siro_driver/android/app/.cxx/Debug/2j1f5m6a/x86_64/.cmake/api/v1/reply/target-native-lib-Debug-e2206948ef59b6eac031.json b/siro_driver/android/app/.cxx/Debug/2j1f5m6a/x86_64/.cmake/api/v1/reply/target-native-lib-Debug-e2206948ef59b6eac031.json new file mode 100644 index 0000000..06d73eb --- /dev/null +++ b/siro_driver/android/app/.cxx/Debug/2j1f5m6a/x86_64/.cmake/api/v1/reply/target-native-lib-Debug-e2206948ef59b6eac031.json @@ -0,0 +1,117 @@ +{ + "artifacts" : + [ + { + "path" : "/Users/hamzaaleghwairyeen/development/App/intaleq_driver/build/app/intermediates/cxx/Debug/2j1f5m6a/obj/x86_64/libnative-lib.so" + } + ], + "backtrace" : 1, + "backtraceGraph" : + { + "commands" : + [ + "add_library", + "target_link_libraries" + ], + "files" : + [ + "CMakeLists.txt" + ], + "nodes" : + [ + { + "file" : 0 + }, + { + "command" : 0, + "file" : 0, + "line" : 5, + "parent" : 0 + }, + { + "command" : 1, + "file" : 0, + "line" : 11, + "parent" : 0 + } + ] + }, + "compileGroups" : + [ + { + "compileCommandFragments" : + [ + { + "fragment" : "-g -DANDROID -fdata-sections -ffunction-sections -funwind-tables -fstack-protector-strong -no-canonical-prefixes -D_FORTIFY_SOURCE=2 -Wformat -Werror=format-security -fno-limit-debug-info -fPIC" + } + ], + "defines" : + [ + { + "define" : "native_lib_EXPORTS" + } + ], + "language" : "CXX", + "sourceIndexes" : + [ + 0 + ], + "sysroot" : + { + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot" + } + } + ], + "id" : "native-lib::@6890427a1f51a3e7e1df", + "link" : + { + "commandFragments" : + [ + { + "fragment" : "-static-libstdc++ -Wl,--build-id=sha1 -Wl,--no-rosegment -Wl,--no-undefined-version -Wl,--fatal-warnings -Wl,--no-undefined -Qunused-arguments", + "role" : "flags" + }, + { + "backtrace" : 2, + "fragment" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/lib/x86_64-linux-android/23/liblog.so", + "role" : "libraries" + }, + { + "fragment" : "-latomic -lm", + "role" : "libraries" + } + ], + "language" : "CXX", + "sysroot" : + { + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot" + } + }, + "name" : "native-lib", + "nameOnDisk" : "libnative-lib.so", + "paths" : + { + "build" : ".", + "source" : "." + }, + "sourceGroups" : + [ + { + "name" : "Source Files", + "sourceIndexes" : + [ + 0 + ] + } + ], + "sources" : + [ + { + "backtrace" : 1, + "compileGroupIndex" : 0, + "path" : "native-lib.cpp", + "sourceGroupIndex" : 0 + } + ], + "type" : "SHARED_LIBRARY" +} diff --git a/siro_driver/android/app/.cxx/Debug/2j1f5m6a/x86_64/.ninja_deps b/siro_driver/android/app/.cxx/Debug/2j1f5m6a/x86_64/.ninja_deps new file mode 100644 index 0000000..a60afb1 Binary files /dev/null and b/siro_driver/android/app/.cxx/Debug/2j1f5m6a/x86_64/.ninja_deps differ diff --git a/siro_driver/android/app/.cxx/Debug/2j1f5m6a/x86_64/.ninja_log b/siro_driver/android/app/.cxx/Debug/2j1f5m6a/x86_64/.ninja_log new file mode 100644 index 0000000..edd0959 --- /dev/null +++ b/siro_driver/android/app/.cxx/Debug/2j1f5m6a/x86_64/.ninja_log @@ -0,0 +1,3 @@ +# ninja log v5 +0 550 1752789483238049006 CMakeFiles/native-lib.dir/native-lib.cpp.o 75a6d4f17b7a4c7a +551 602 1752789483289322466 /Users/hamzaaleghwairyeen/development/App/intaleq_driver/build/app/intermediates/cxx/Debug/2j1f5m6a/obj/x86_64/libnative-lib.so 5eebecc4be8fe296 diff --git a/siro_driver/android/app/.cxx/Debug/2j1f5m6a/x86_64/CMakeCache.txt b/siro_driver/android/app/.cxx/Debug/2j1f5m6a/x86_64/CMakeCache.txt new file mode 100644 index 0000000..066fcfd --- /dev/null +++ b/siro_driver/android/app/.cxx/Debug/2j1f5m6a/x86_64/CMakeCache.txt @@ -0,0 +1,430 @@ +# This is the CMakeCache file. +# For build in directory: /Users/hamzaaleghwairyeen/development/App/intaleq_driver/android/app/.cxx/Debug/2j1f5m6a/x86_64 +# It was generated by CMake: /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/bin/cmake +# You can edit this file to change values found and used by cmake. +# If you do not want to change any of the values, simply exit the editor. +# If you do want to change a value, simply edit, save, and exit the editor. +# The syntax for the file is as follows: +# KEY:TYPE=VALUE +# KEY is the name of a variable in the cache. +# TYPE is a hint to GUIs for the type of VALUE, DO NOT EDIT TYPE!. +# VALUE is the current value for the KEY. + +######################## +# EXTERNAL cache entries +######################## + +//No help, variable specified on the command line. +ANDROID_ABI:UNINITIALIZED=x86_64 + +//No help, variable specified on the command line. +ANDROID_NDK:UNINITIALIZED=/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973 + +//No help, variable specified on the command line. +ANDROID_PLATFORM:UNINITIALIZED=android-23 + +//Path to a program. +CMAKE_ADDR2LINE:FILEPATH=/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/bin/llvm-addr2line + +//No help, variable specified on the command line. +CMAKE_ANDROID_ARCH_ABI:UNINITIALIZED=x86_64 + +//No help, variable specified on the command line. +CMAKE_ANDROID_NDK:UNINITIALIZED=/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973 + +//Archiver +CMAKE_AR:FILEPATH=/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/bin/llvm-ar + +//Flags used by the compiler during all build types. +CMAKE_ASM_FLAGS:STRING= + +//Flags used by the compiler during debug builds. +CMAKE_ASM_FLAGS_DEBUG:STRING= + +//Flags used by the compiler during release builds. +CMAKE_ASM_FLAGS_RELEASE:STRING= + +//Choose the type of build, options are: None Debug Release RelWithDebInfo +// MinSizeRel ... +CMAKE_BUILD_TYPE:STRING=Debug + +//LLVM archiver +CMAKE_CXX_COMPILER_AR:FILEPATH=/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/bin/llvm-ar + +//`clang-scan-deps` dependency scanner +CMAKE_CXX_COMPILER_CLANG_SCAN_DEPS:FILEPATH=/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/bin/clang-scan-deps + +//Generate index for LLVM archive +CMAKE_CXX_COMPILER_RANLIB:FILEPATH=/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/bin/llvm-ranlib + +//Flags used by the compiler during all build types. +CMAKE_CXX_FLAGS:STRING= + +//Flags used by the compiler during debug builds. +CMAKE_CXX_FLAGS_DEBUG:STRING= + +//Flags used by the CXX compiler during MINSIZEREL builds. +CMAKE_CXX_FLAGS_MINSIZEREL:STRING=-Os -DNDEBUG + +//Flags used by the compiler during release builds. +CMAKE_CXX_FLAGS_RELEASE:STRING= + +//Flags used by the CXX compiler during RELWITHDEBINFO builds. +CMAKE_CXX_FLAGS_RELWITHDEBINFO:STRING=-O2 -g -DNDEBUG + +//Libraries linked by default with all C++ applications. +CMAKE_CXX_STANDARD_LIBRARIES:STRING=-latomic -lm + +//LLVM archiver +CMAKE_C_COMPILER_AR:FILEPATH=/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/bin/llvm-ar + +//`clang-scan-deps` dependency scanner +CMAKE_C_COMPILER_CLANG_SCAN_DEPS:FILEPATH=/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/bin/clang-scan-deps + +//Generate index for LLVM archive +CMAKE_C_COMPILER_RANLIB:FILEPATH=/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/bin/llvm-ranlib + +//Flags used by the compiler during all build types. +CMAKE_C_FLAGS:STRING= + +//Flags used by the compiler during debug builds. +CMAKE_C_FLAGS_DEBUG:STRING= + +//Flags used by the C compiler during MINSIZEREL builds. +CMAKE_C_FLAGS_MINSIZEREL:STRING=-Os -DNDEBUG + +//Flags used by the compiler during release builds. +CMAKE_C_FLAGS_RELEASE:STRING= + +//Flags used by the C compiler during RELWITHDEBINFO builds. +CMAKE_C_FLAGS_RELWITHDEBINFO:STRING=-O2 -g -DNDEBUG + +//Libraries linked by default with all C applications. +CMAKE_C_STANDARD_LIBRARIES:STRING=-latomic -lm + +//Path to a program. +CMAKE_DLLTOOL:FILEPATH=/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/bin/llvm-dlltool + +//Flags used by the linker. +CMAKE_EXE_LINKER_FLAGS:STRING= + +//Flags used by the linker during DEBUG builds. +CMAKE_EXE_LINKER_FLAGS_DEBUG:STRING= + +//Flags used by the linker during MINSIZEREL builds. +CMAKE_EXE_LINKER_FLAGS_MINSIZEREL:STRING= + +//Flags used by the linker during RELEASE builds. +CMAKE_EXE_LINKER_FLAGS_RELEASE:STRING= + +//Flags used by the linker during RELWITHDEBINFO builds. +CMAKE_EXE_LINKER_FLAGS_RELWITHDEBINFO:STRING= + +//Enable/Disable output of build database during the build. +CMAKE_EXPORT_BUILD_DATABASE:BOOL= + +//No help, variable specified on the command line. +CMAKE_EXPORT_COMPILE_COMMANDS:UNINITIALIZED=ON + +//Value Computed by CMake. +CMAKE_FIND_PACKAGE_REDIRECTS_DIR:STATIC=/Users/hamzaaleghwairyeen/development/App/intaleq_driver/android/app/.cxx/Debug/2j1f5m6a/x86_64/CMakeFiles/pkgRedirects + +//Install path prefix, prepended onto install directories. +CMAKE_INSTALL_PREFIX:PATH=/usr/local + +//No help, variable specified on the command line. +CMAKE_LIBRARY_OUTPUT_DIRECTORY:UNINITIALIZED=/Users/hamzaaleghwairyeen/development/App/intaleq_driver/build/app/intermediates/cxx/Debug/2j1f5m6a/obj/x86_64 + +//Path to a program. +CMAKE_LINKER:FILEPATH=/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/bin/ld.lld + +//No help, variable specified on the command line. +CMAKE_MAKE_PROGRAM:UNINITIALIZED=/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/bin/ninja + +//Flags used by the linker during the creation of modules. +CMAKE_MODULE_LINKER_FLAGS:STRING= + +//Flags used by the linker during the creation of modules during +// DEBUG builds. +CMAKE_MODULE_LINKER_FLAGS_DEBUG:STRING= + +//Flags used by the linker during the creation of modules during +// MINSIZEREL builds. +CMAKE_MODULE_LINKER_FLAGS_MINSIZEREL:STRING= + +//Flags used by the linker during the creation of modules during +// RELEASE builds. +CMAKE_MODULE_LINKER_FLAGS_RELEASE:STRING= + +//Flags used by the linker during the creation of modules during +// RELWITHDEBINFO builds. +CMAKE_MODULE_LINKER_FLAGS_RELWITHDEBINFO:STRING= + +//Path to a program. +CMAKE_NM:FILEPATH=/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/bin/llvm-nm + +//Path to a program. +CMAKE_OBJCOPY:FILEPATH=/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/bin/llvm-objcopy + +//Path to a program. +CMAKE_OBJDUMP:FILEPATH=/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/bin/llvm-objdump + +//Value Computed by CMake +CMAKE_PROJECT_DESCRIPTION:STATIC= + +//Value Computed by CMake +CMAKE_PROJECT_HOMEPAGE_URL:STATIC= + +//Value Computed by CMake +CMAKE_PROJECT_NAME:STATIC=intaleq_driver + +//Ranlib +CMAKE_RANLIB:FILEPATH=/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/bin/llvm-ranlib + +//Path to a program. +CMAKE_READELF:FILEPATH=/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/bin/llvm-readelf + +//No help, variable specified on the command line. +CMAKE_RUNTIME_OUTPUT_DIRECTORY:UNINITIALIZED=/Users/hamzaaleghwairyeen/development/App/intaleq_driver/build/app/intermediates/cxx/Debug/2j1f5m6a/obj/x86_64 + +//Flags used by the linker during the creation of dll's. +CMAKE_SHARED_LINKER_FLAGS:STRING= + +//Flags used by the linker during the creation of shared libraries +// during DEBUG builds. +CMAKE_SHARED_LINKER_FLAGS_DEBUG:STRING= + +//Flags used by the linker during the creation of shared libraries +// during MINSIZEREL builds. +CMAKE_SHARED_LINKER_FLAGS_MINSIZEREL:STRING= + +//Flags used by the linker during the creation of shared libraries +// during RELEASE builds. +CMAKE_SHARED_LINKER_FLAGS_RELEASE:STRING= + +//Flags used by the linker during the creation of shared libraries +// during RELWITHDEBINFO builds. +CMAKE_SHARED_LINKER_FLAGS_RELWITHDEBINFO:STRING= + +//If set, runtime paths are not added when installing shared libraries, +// but are added when building. +CMAKE_SKIP_INSTALL_RPATH:BOOL=NO + +//If set, runtime paths are not added when using shared libraries. +CMAKE_SKIP_RPATH:BOOL=NO + +//Flags used by the linker during the creation of static libraries +// during all build types. +CMAKE_STATIC_LINKER_FLAGS:STRING= + +//Flags used by the linker during the creation of static libraries +// during DEBUG builds. +CMAKE_STATIC_LINKER_FLAGS_DEBUG:STRING= + +//Flags used by the linker during the creation of static libraries +// during MINSIZEREL builds. +CMAKE_STATIC_LINKER_FLAGS_MINSIZEREL:STRING= + +//Flags used by the linker during the creation of static libraries +// during RELEASE builds. +CMAKE_STATIC_LINKER_FLAGS_RELEASE:STRING= + +//Flags used by the linker during the creation of static libraries +// during RELWITHDEBINFO builds. +CMAKE_STATIC_LINKER_FLAGS_RELWITHDEBINFO:STRING= + +//Strip +CMAKE_STRIP:FILEPATH=/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/bin/llvm-strip + +//No help, variable specified on the command line. +CMAKE_SYSTEM_NAME:UNINITIALIZED=Android + +//No help, variable specified on the command line. +CMAKE_SYSTEM_VERSION:UNINITIALIZED=23 + +//Path to a program. +CMAKE_TAPI:FILEPATH=CMAKE_TAPI-NOTFOUND + +//The CMake toolchain file +CMAKE_TOOLCHAIN_FILE:FILEPATH=/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/build/cmake/android.toolchain.cmake + +//If this value is on, makefiles will be generated without the +// .SILENT directive, and all commands will be echoed to the console +// during the make. This is useful for debugging only. With Visual +// Studio IDE projects all commands are done without /nologo. +CMAKE_VERBOSE_MAKEFILE:BOOL=FALSE + +//Value Computed by CMake +intaleq_driver_BINARY_DIR:STATIC=/Users/hamzaaleghwairyeen/development/App/intaleq_driver/android/app/.cxx/Debug/2j1f5m6a/x86_64 + +//Value Computed by CMake +intaleq_driver_IS_TOP_LEVEL:STATIC=ON + +//Value Computed by CMake +intaleq_driver_SOURCE_DIR:STATIC=/Users/hamzaaleghwairyeen/development/App/intaleq_driver/android/app/src/main/cpp + +//Path to a library. +log-lib:FILEPATH=/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/lib/x86_64-linux-android/23/liblog.so + +//Dependencies for the target +native-lib_LIB_DEPENDS:STATIC=general;/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/lib/x86_64-linux-android/23/liblog.so; + + +######################## +# INTERNAL cache entries +######################## + +//ADVANCED property for variable: CMAKE_ADDR2LINE +CMAKE_ADDR2LINE-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_AR +CMAKE_AR-ADVANCED:INTERNAL=1 +//This is the directory where this CMakeCache.txt was created +CMAKE_CACHEFILE_DIR:INTERNAL=/Users/hamzaaleghwairyeen/development/App/intaleq_driver/android/app/.cxx/Debug/2j1f5m6a/x86_64 +//Major version of cmake used to create the current loaded cache +CMAKE_CACHE_MAJOR_VERSION:INTERNAL=3 +//Minor version of cmake used to create the current loaded cache +CMAKE_CACHE_MINOR_VERSION:INTERNAL=31 +//Patch version of cmake used to create the current loaded cache +CMAKE_CACHE_PATCH_VERSION:INTERNAL=5 +//Path to CMake executable. +CMAKE_COMMAND:INTERNAL=/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/bin/cmake +//Path to cpack program executable. +CMAKE_CPACK_COMMAND:INTERNAL=/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/bin/cpack +//Path to ctest program executable. +CMAKE_CTEST_COMMAND:INTERNAL=/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/bin/ctest +//ADVANCED property for variable: CMAKE_CXX_COMPILER_AR +CMAKE_CXX_COMPILER_AR-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_CXX_COMPILER_CLANG_SCAN_DEPS +CMAKE_CXX_COMPILER_CLANG_SCAN_DEPS-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_CXX_COMPILER_RANLIB +CMAKE_CXX_COMPILER_RANLIB-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_CXX_FLAGS +CMAKE_CXX_FLAGS-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_CXX_FLAGS_DEBUG +CMAKE_CXX_FLAGS_DEBUG-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_CXX_FLAGS_MINSIZEREL +CMAKE_CXX_FLAGS_MINSIZEREL-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_CXX_FLAGS_RELEASE +CMAKE_CXX_FLAGS_RELEASE-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_CXX_FLAGS_RELWITHDEBINFO +CMAKE_CXX_FLAGS_RELWITHDEBINFO-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_CXX_STANDARD_LIBRARIES +CMAKE_CXX_STANDARD_LIBRARIES-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_C_COMPILER_AR +CMAKE_C_COMPILER_AR-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_C_COMPILER_CLANG_SCAN_DEPS +CMAKE_C_COMPILER_CLANG_SCAN_DEPS-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_C_COMPILER_RANLIB +CMAKE_C_COMPILER_RANLIB-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_C_FLAGS +CMAKE_C_FLAGS-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_C_FLAGS_DEBUG +CMAKE_C_FLAGS_DEBUG-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_C_FLAGS_MINSIZEREL +CMAKE_C_FLAGS_MINSIZEREL-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_C_FLAGS_RELEASE +CMAKE_C_FLAGS_RELEASE-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_C_FLAGS_RELWITHDEBINFO +CMAKE_C_FLAGS_RELWITHDEBINFO-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_C_STANDARD_LIBRARIES +CMAKE_C_STANDARD_LIBRARIES-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_DLLTOOL +CMAKE_DLLTOOL-ADVANCED:INTERNAL=1 +//Path to cache edit program executable. +CMAKE_EDIT_COMMAND:INTERNAL=/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/bin/ccmake +//Executable file format +CMAKE_EXECUTABLE_FORMAT:INTERNAL=ELF +//ADVANCED property for variable: CMAKE_EXE_LINKER_FLAGS +CMAKE_EXE_LINKER_FLAGS-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_EXE_LINKER_FLAGS_DEBUG +CMAKE_EXE_LINKER_FLAGS_DEBUG-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_EXE_LINKER_FLAGS_MINSIZEREL +CMAKE_EXE_LINKER_FLAGS_MINSIZEREL-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_EXE_LINKER_FLAGS_RELEASE +CMAKE_EXE_LINKER_FLAGS_RELEASE-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_EXE_LINKER_FLAGS_RELWITHDEBINFO +CMAKE_EXE_LINKER_FLAGS_RELWITHDEBINFO-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_EXPORT_BUILD_DATABASE +CMAKE_EXPORT_BUILD_DATABASE-ADVANCED:INTERNAL=1 +//Name of external makefile project generator. +CMAKE_EXTRA_GENERATOR:INTERNAL= +//Name of generator. +CMAKE_GENERATOR:INTERNAL=Ninja +//Generator instance identifier. +CMAKE_GENERATOR_INSTANCE:INTERNAL= +//Name of generator platform. +CMAKE_GENERATOR_PLATFORM:INTERNAL= +//Name of generator toolset. +CMAKE_GENERATOR_TOOLSET:INTERNAL= +//Source directory with the top level CMakeLists.txt file for this +// project +CMAKE_HOME_DIRECTORY:INTERNAL=/Users/hamzaaleghwairyeen/development/App/intaleq_driver/android/app/src/main/cpp +//Install .so files without execute permission. +CMAKE_INSTALL_SO_NO_EXE:INTERNAL=0 +//ADVANCED property for variable: CMAKE_LINKER +CMAKE_LINKER-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_MODULE_LINKER_FLAGS +CMAKE_MODULE_LINKER_FLAGS-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_MODULE_LINKER_FLAGS_DEBUG +CMAKE_MODULE_LINKER_FLAGS_DEBUG-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_MODULE_LINKER_FLAGS_MINSIZEREL +CMAKE_MODULE_LINKER_FLAGS_MINSIZEREL-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_MODULE_LINKER_FLAGS_RELEASE +CMAKE_MODULE_LINKER_FLAGS_RELEASE-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_MODULE_LINKER_FLAGS_RELWITHDEBINFO +CMAKE_MODULE_LINKER_FLAGS_RELWITHDEBINFO-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_NM +CMAKE_NM-ADVANCED:INTERNAL=1 +//number of local generators +CMAKE_NUMBER_OF_MAKEFILES:INTERNAL=1 +//ADVANCED property for variable: CMAKE_OBJCOPY +CMAKE_OBJCOPY-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_OBJDUMP +CMAKE_OBJDUMP-ADVANCED:INTERNAL=1 +//Platform information initialized +CMAKE_PLATFORM_INFO_INITIALIZED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_RANLIB +CMAKE_RANLIB-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_READELF +CMAKE_READELF-ADVANCED:INTERNAL=1 +//Path to CMake installation. +CMAKE_ROOT:INTERNAL=/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31 +//ADVANCED property for variable: CMAKE_SHARED_LINKER_FLAGS +CMAKE_SHARED_LINKER_FLAGS-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_SHARED_LINKER_FLAGS_DEBUG +CMAKE_SHARED_LINKER_FLAGS_DEBUG-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_SHARED_LINKER_FLAGS_MINSIZEREL +CMAKE_SHARED_LINKER_FLAGS_MINSIZEREL-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_SHARED_LINKER_FLAGS_RELEASE +CMAKE_SHARED_LINKER_FLAGS_RELEASE-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_SHARED_LINKER_FLAGS_RELWITHDEBINFO +CMAKE_SHARED_LINKER_FLAGS_RELWITHDEBINFO-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_SKIP_INSTALL_RPATH +CMAKE_SKIP_INSTALL_RPATH-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_SKIP_RPATH +CMAKE_SKIP_RPATH-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_STATIC_LINKER_FLAGS +CMAKE_STATIC_LINKER_FLAGS-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_STATIC_LINKER_FLAGS_DEBUG +CMAKE_STATIC_LINKER_FLAGS_DEBUG-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_STATIC_LINKER_FLAGS_MINSIZEREL +CMAKE_STATIC_LINKER_FLAGS_MINSIZEREL-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_STATIC_LINKER_FLAGS_RELEASE +CMAKE_STATIC_LINKER_FLAGS_RELEASE-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_STATIC_LINKER_FLAGS_RELWITHDEBINFO +CMAKE_STATIC_LINKER_FLAGS_RELWITHDEBINFO-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_STRIP +CMAKE_STRIP-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_TAPI +CMAKE_TAPI-ADVANCED:INTERNAL=1 +//uname command +CMAKE_UNAME:INTERNAL=/usr/bin/uname +//ADVANCED property for variable: CMAKE_VERBOSE_MAKEFILE +CMAKE_VERBOSE_MAKEFILE-ADVANCED:INTERNAL=1 +//linker supports push/pop state +_CMAKE_CXX_LINKER_PUSHPOP_STATE_SUPPORTED:INTERNAL=TRUE +//linker supports push/pop state +_CMAKE_C_LINKER_PUSHPOP_STATE_SUPPORTED:INTERNAL=TRUE +//linker supports push/pop state +_CMAKE_LINKER_PUSHPOP_STATE_SUPPORTED:INTERNAL=TRUE + diff --git a/siro_driver/android/app/.cxx/Debug/2j1f5m6a/x86_64/CMakeFiles/3.31.5-g6cf5163/CMakeCCompiler.cmake b/siro_driver/android/app/.cxx/Debug/2j1f5m6a/x86_64/CMakeFiles/3.31.5-g6cf5163/CMakeCCompiler.cmake new file mode 100644 index 0000000..a598563 --- /dev/null +++ b/siro_driver/android/app/.cxx/Debug/2j1f5m6a/x86_64/CMakeFiles/3.31.5-g6cf5163/CMakeCCompiler.cmake @@ -0,0 +1,81 @@ +set(CMAKE_C_COMPILER "/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/bin/clang") +set(CMAKE_C_COMPILER_ARG1 "") +set(CMAKE_C_COMPILER_ID "Clang") +set(CMAKE_C_COMPILER_VERSION "18.0.1") +set(CMAKE_C_COMPILER_VERSION_INTERNAL "") +set(CMAKE_C_COMPILER_WRAPPER "") +set(CMAKE_C_STANDARD_COMPUTED_DEFAULT "17") +set(CMAKE_C_EXTENSIONS_COMPUTED_DEFAULT "ON") +set(CMAKE_C_STANDARD_LATEST "23") +set(CMAKE_C_COMPILE_FEATURES "c_std_90;c_function_prototypes;c_std_99;c_restrict;c_variadic_macros;c_std_11;c_static_assert;c_std_17;c_std_23") +set(CMAKE_C90_COMPILE_FEATURES "c_std_90;c_function_prototypes") +set(CMAKE_C99_COMPILE_FEATURES "c_std_99;c_restrict;c_variadic_macros") +set(CMAKE_C11_COMPILE_FEATURES "c_std_11;c_static_assert") +set(CMAKE_C17_COMPILE_FEATURES "c_std_17") +set(CMAKE_C23_COMPILE_FEATURES "c_std_23") + +set(CMAKE_C_PLATFORM_ID "Linux") +set(CMAKE_C_SIMULATE_ID "") +set(CMAKE_C_COMPILER_FRONTEND_VARIANT "GNU") +set(CMAKE_C_SIMULATE_VERSION "") + + + + +set(CMAKE_AR "/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/bin/llvm-ar") +set(CMAKE_C_COMPILER_AR "/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/bin/llvm-ar") +set(CMAKE_RANLIB "/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/bin/llvm-ranlib") +set(CMAKE_C_COMPILER_RANLIB "/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/bin/llvm-ranlib") +set(CMAKE_LINKER "/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/bin/ld.lld") +set(CMAKE_LINKER_LINK "") +set(CMAKE_LINKER_LLD "") +set(CMAKE_C_COMPILER_LINKER "/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/bin/ld.lld") +set(CMAKE_C_COMPILER_LINKER_ID "LLD") +set(CMAKE_C_COMPILER_LINKER_VERSION 18.0.1) +set(CMAKE_C_COMPILER_LINKER_FRONTEND_VARIANT GNU) +set(CMAKE_MT "") +set(CMAKE_TAPI "CMAKE_TAPI-NOTFOUND") +set(CMAKE_COMPILER_IS_GNUCC ) +set(CMAKE_C_COMPILER_LOADED 1) +set(CMAKE_C_COMPILER_WORKS TRUE) +set(CMAKE_C_ABI_COMPILED TRUE) + +set(CMAKE_C_COMPILER_ENV_VAR "CC") + +set(CMAKE_C_COMPILER_ID_RUN 1) +set(CMAKE_C_SOURCE_FILE_EXTENSIONS c;m) +set(CMAKE_C_IGNORE_EXTENSIONS h;H;o;O;obj;OBJ;def;DEF;rc;RC) +set(CMAKE_C_LINKER_PREFERENCE 10) +set(CMAKE_C_LINKER_DEPFILE_SUPPORTED ) + +# Save compiler ABI information. +set(CMAKE_C_SIZEOF_DATA_PTR "8") +set(CMAKE_C_COMPILER_ABI "ELF") +set(CMAKE_C_BYTE_ORDER "LITTLE_ENDIAN") +set(CMAKE_C_LIBRARY_ARCHITECTURE "x86_64-linux-android") + +if(CMAKE_C_SIZEOF_DATA_PTR) + set(CMAKE_SIZEOF_VOID_P "${CMAKE_C_SIZEOF_DATA_PTR}") +endif() + +if(CMAKE_C_COMPILER_ABI) + set(CMAKE_INTERNAL_PLATFORM_ABI "${CMAKE_C_COMPILER_ABI}") +endif() + +if(CMAKE_C_LIBRARY_ARCHITECTURE) + set(CMAKE_LIBRARY_ARCHITECTURE "x86_64-linux-android") +endif() + +set(CMAKE_C_CL_SHOWINCLUDES_PREFIX "") +if(CMAKE_C_CL_SHOWINCLUDES_PREFIX) + set(CMAKE_CL_SHOWINCLUDES_PREFIX "${CMAKE_C_CL_SHOWINCLUDES_PREFIX}") +endif() + + + + + +set(CMAKE_C_IMPLICIT_INCLUDE_DIRECTORIES "/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/lib/clang/18/include;/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/include/x86_64-linux-android;/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/include") +set(CMAKE_C_IMPLICIT_LINK_LIBRARIES "-l:libunwind.a;dl;c;-l:libunwind.a;dl") +set(CMAKE_C_IMPLICIT_LINK_DIRECTORIES "/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/lib/clang/18/lib/linux/x86_64;/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/lib/x86_64-linux-android/23;/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/lib/x86_64-linux-android;/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/lib") +set(CMAKE_C_IMPLICIT_LINK_FRAMEWORK_DIRECTORIES "") diff --git a/siro_driver/android/app/.cxx/Debug/2j1f5m6a/x86_64/CMakeFiles/3.31.5-g6cf5163/CMakeCXXCompiler.cmake b/siro_driver/android/app/.cxx/Debug/2j1f5m6a/x86_64/CMakeFiles/3.31.5-g6cf5163/CMakeCXXCompiler.cmake new file mode 100644 index 0000000..84c10ac --- /dev/null +++ b/siro_driver/android/app/.cxx/Debug/2j1f5m6a/x86_64/CMakeFiles/3.31.5-g6cf5163/CMakeCXXCompiler.cmake @@ -0,0 +1,105 @@ +set(CMAKE_CXX_COMPILER "/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/bin/clang++") +set(CMAKE_CXX_COMPILER_ARG1 "") +set(CMAKE_CXX_COMPILER_ID "Clang") +set(CMAKE_CXX_COMPILER_VERSION "18.0.1") +set(CMAKE_CXX_COMPILER_VERSION_INTERNAL "") +set(CMAKE_CXX_COMPILER_WRAPPER "") +set(CMAKE_CXX_STANDARD_COMPUTED_DEFAULT "17") +set(CMAKE_CXX_EXTENSIONS_COMPUTED_DEFAULT "ON") +set(CMAKE_CXX_STANDARD_LATEST "26") +set(CMAKE_CXX_COMPILE_FEATURES "cxx_std_98;cxx_template_template_parameters;cxx_std_11;cxx_alias_templates;cxx_alignas;cxx_alignof;cxx_attributes;cxx_auto_type;cxx_constexpr;cxx_decltype;cxx_decltype_incomplete_return_types;cxx_default_function_template_args;cxx_defaulted_functions;cxx_defaulted_move_initializers;cxx_delegating_constructors;cxx_deleted_functions;cxx_enum_forward_declarations;cxx_explicit_conversions;cxx_extended_friend_declarations;cxx_extern_templates;cxx_final;cxx_func_identifier;cxx_generalized_initializers;cxx_inheriting_constructors;cxx_inline_namespaces;cxx_lambdas;cxx_local_type_template_args;cxx_long_long_type;cxx_noexcept;cxx_nonstatic_member_init;cxx_nullptr;cxx_override;cxx_range_for;cxx_raw_string_literals;cxx_reference_qualified_functions;cxx_right_angle_brackets;cxx_rvalue_references;cxx_sizeof_member;cxx_static_assert;cxx_strong_enums;cxx_thread_local;cxx_trailing_return_types;cxx_unicode_literals;cxx_uniform_initialization;cxx_unrestricted_unions;cxx_user_literals;cxx_variadic_macros;cxx_variadic_templates;cxx_std_14;cxx_aggregate_default_initializers;cxx_attribute_deprecated;cxx_binary_literals;cxx_contextual_conversions;cxx_decltype_auto;cxx_digit_separators;cxx_generic_lambdas;cxx_lambda_init_captures;cxx_relaxed_constexpr;cxx_return_type_deduction;cxx_variable_templates;cxx_std_17;cxx_std_20;cxx_std_23;cxx_std_26") +set(CMAKE_CXX98_COMPILE_FEATURES "cxx_std_98;cxx_template_template_parameters") +set(CMAKE_CXX11_COMPILE_FEATURES "cxx_std_11;cxx_alias_templates;cxx_alignas;cxx_alignof;cxx_attributes;cxx_auto_type;cxx_constexpr;cxx_decltype;cxx_decltype_incomplete_return_types;cxx_default_function_template_args;cxx_defaulted_functions;cxx_defaulted_move_initializers;cxx_delegating_constructors;cxx_deleted_functions;cxx_enum_forward_declarations;cxx_explicit_conversions;cxx_extended_friend_declarations;cxx_extern_templates;cxx_final;cxx_func_identifier;cxx_generalized_initializers;cxx_inheriting_constructors;cxx_inline_namespaces;cxx_lambdas;cxx_local_type_template_args;cxx_long_long_type;cxx_noexcept;cxx_nonstatic_member_init;cxx_nullptr;cxx_override;cxx_range_for;cxx_raw_string_literals;cxx_reference_qualified_functions;cxx_right_angle_brackets;cxx_rvalue_references;cxx_sizeof_member;cxx_static_assert;cxx_strong_enums;cxx_thread_local;cxx_trailing_return_types;cxx_unicode_literals;cxx_uniform_initialization;cxx_unrestricted_unions;cxx_user_literals;cxx_variadic_macros;cxx_variadic_templates") +set(CMAKE_CXX14_COMPILE_FEATURES "cxx_std_14;cxx_aggregate_default_initializers;cxx_attribute_deprecated;cxx_binary_literals;cxx_contextual_conversions;cxx_decltype_auto;cxx_digit_separators;cxx_generic_lambdas;cxx_lambda_init_captures;cxx_relaxed_constexpr;cxx_return_type_deduction;cxx_variable_templates") +set(CMAKE_CXX17_COMPILE_FEATURES "cxx_std_17") +set(CMAKE_CXX20_COMPILE_FEATURES "cxx_std_20") +set(CMAKE_CXX23_COMPILE_FEATURES "cxx_std_23") +set(CMAKE_CXX26_COMPILE_FEATURES "cxx_std_26") + +set(CMAKE_CXX_PLATFORM_ID "Linux") +set(CMAKE_CXX_SIMULATE_ID "") +set(CMAKE_CXX_COMPILER_FRONTEND_VARIANT "GNU") +set(CMAKE_CXX_SIMULATE_VERSION "") + + + + +set(CMAKE_AR "/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/bin/llvm-ar") +set(CMAKE_CXX_COMPILER_AR "/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/bin/llvm-ar") +set(CMAKE_RANLIB "/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/bin/llvm-ranlib") +set(CMAKE_CXX_COMPILER_RANLIB "/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/bin/llvm-ranlib") +set(CMAKE_LINKER "/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/bin/ld.lld") +set(CMAKE_LINKER_LINK "") +set(CMAKE_LINKER_LLD "") +set(CMAKE_CXX_COMPILER_LINKER "/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/bin/ld.lld") +set(CMAKE_CXX_COMPILER_LINKER_ID "LLD") +set(CMAKE_CXX_COMPILER_LINKER_VERSION 18.0.1) +set(CMAKE_CXX_COMPILER_LINKER_FRONTEND_VARIANT GNU) +set(CMAKE_MT "") +set(CMAKE_TAPI "CMAKE_TAPI-NOTFOUND") +set(CMAKE_COMPILER_IS_GNUCXX ) +set(CMAKE_CXX_COMPILER_LOADED 1) +set(CMAKE_CXX_COMPILER_WORKS TRUE) +set(CMAKE_CXX_ABI_COMPILED TRUE) + +set(CMAKE_CXX_COMPILER_ENV_VAR "CXX") + +set(CMAKE_CXX_COMPILER_ID_RUN 1) +set(CMAKE_CXX_SOURCE_FILE_EXTENSIONS C;M;c++;cc;cpp;cxx;m;mm;mpp;CPP;ixx;cppm;ccm;cxxm;c++m) +set(CMAKE_CXX_IGNORE_EXTENSIONS inl;h;hpp;HPP;H;o;O;obj;OBJ;def;DEF;rc;RC) + +foreach (lang IN ITEMS C OBJC OBJCXX) + if (CMAKE_${lang}_COMPILER_ID_RUN) + foreach(extension IN LISTS CMAKE_${lang}_SOURCE_FILE_EXTENSIONS) + list(REMOVE_ITEM CMAKE_CXX_SOURCE_FILE_EXTENSIONS ${extension}) + endforeach() + endif() +endforeach() + +set(CMAKE_CXX_LINKER_PREFERENCE 30) +set(CMAKE_CXX_LINKER_PREFERENCE_PROPAGATES 1) +set(CMAKE_CXX_LINKER_DEPFILE_SUPPORTED ) + +# Save compiler ABI information. +set(CMAKE_CXX_SIZEOF_DATA_PTR "8") +set(CMAKE_CXX_COMPILER_ABI "ELF") +set(CMAKE_CXX_BYTE_ORDER "LITTLE_ENDIAN") +set(CMAKE_CXX_LIBRARY_ARCHITECTURE "x86_64-linux-android") + +if(CMAKE_CXX_SIZEOF_DATA_PTR) + set(CMAKE_SIZEOF_VOID_P "${CMAKE_CXX_SIZEOF_DATA_PTR}") +endif() + +if(CMAKE_CXX_COMPILER_ABI) + set(CMAKE_INTERNAL_PLATFORM_ABI "${CMAKE_CXX_COMPILER_ABI}") +endif() + +if(CMAKE_CXX_LIBRARY_ARCHITECTURE) + set(CMAKE_LIBRARY_ARCHITECTURE "x86_64-linux-android") +endif() + +set(CMAKE_CXX_CL_SHOWINCLUDES_PREFIX "") +if(CMAKE_CXX_CL_SHOWINCLUDES_PREFIX) + set(CMAKE_CL_SHOWINCLUDES_PREFIX "${CMAKE_CXX_CL_SHOWINCLUDES_PREFIX}") +endif() + + + + + +set(CMAKE_CXX_IMPLICIT_INCLUDE_DIRECTORIES "/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/include/c++/v1;/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/lib/clang/18/include;/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/include/x86_64-linux-android;/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/include") +set(CMAKE_CXX_IMPLICIT_LINK_LIBRARIES "c++;m;-l:libunwind.a;dl;c;-l:libunwind.a;dl") +set(CMAKE_CXX_IMPLICIT_LINK_DIRECTORIES "/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/lib/clang/18/lib/linux/x86_64;/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/lib/x86_64-linux-android/23;/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/lib/x86_64-linux-android;/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/lib") +set(CMAKE_CXX_IMPLICIT_LINK_FRAMEWORK_DIRECTORIES "") +set(CMAKE_CXX_COMPILER_CLANG_RESOURCE_DIR "/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/lib/clang/18") + +set(CMAKE_CXX_COMPILER_IMPORT_STD "") +### Imported target for C++23 standard library +set(CMAKE_CXX23_COMPILER_IMPORT_STD_NOT_FOUND_MESSAGE "Experimental `import std` support not enabled when detecting toolchain; it must be set before `CXX` is enabled (usually a `project()` call)") + + +### Imported target for C++26 standard library +set(CMAKE_CXX26_COMPILER_IMPORT_STD_NOT_FOUND_MESSAGE "Experimental `import std` support not enabled when detecting toolchain; it must be set before `CXX` is enabled (usually a `project()` call)") + + + diff --git a/siro_driver/android/app/.cxx/Debug/2j1f5m6a/x86_64/CMakeFiles/3.31.5-g6cf5163/CMakeDetermineCompilerABI_C.bin b/siro_driver/android/app/.cxx/Debug/2j1f5m6a/x86_64/CMakeFiles/3.31.5-g6cf5163/CMakeDetermineCompilerABI_C.bin new file mode 100755 index 0000000..25c7540 Binary files /dev/null and b/siro_driver/android/app/.cxx/Debug/2j1f5m6a/x86_64/CMakeFiles/3.31.5-g6cf5163/CMakeDetermineCompilerABI_C.bin differ diff --git a/siro_driver/android/app/.cxx/Debug/2j1f5m6a/x86_64/CMakeFiles/3.31.5-g6cf5163/CMakeDetermineCompilerABI_CXX.bin b/siro_driver/android/app/.cxx/Debug/2j1f5m6a/x86_64/CMakeFiles/3.31.5-g6cf5163/CMakeDetermineCompilerABI_CXX.bin new file mode 100755 index 0000000..931569c Binary files /dev/null and b/siro_driver/android/app/.cxx/Debug/2j1f5m6a/x86_64/CMakeFiles/3.31.5-g6cf5163/CMakeDetermineCompilerABI_CXX.bin differ diff --git a/siro_driver/android/app/.cxx/Debug/2j1f5m6a/x86_64/CMakeFiles/3.31.5-g6cf5163/CMakeSystem.cmake b/siro_driver/android/app/.cxx/Debug/2j1f5m6a/x86_64/CMakeFiles/3.31.5-g6cf5163/CMakeSystem.cmake new file mode 100644 index 0000000..1f3c05c --- /dev/null +++ b/siro_driver/android/app/.cxx/Debug/2j1f5m6a/x86_64/CMakeFiles/3.31.5-g6cf5163/CMakeSystem.cmake @@ -0,0 +1,15 @@ +set(CMAKE_HOST_SYSTEM "Darwin-24.5.0") +set(CMAKE_HOST_SYSTEM_NAME "Darwin") +set(CMAKE_HOST_SYSTEM_VERSION "24.5.0") +set(CMAKE_HOST_SYSTEM_PROCESSOR "arm64") + +include("/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/build/cmake/android.toolchain.cmake") + +set(CMAKE_SYSTEM "Android-1") +set(CMAKE_SYSTEM_NAME "Android") +set(CMAKE_SYSTEM_VERSION "1") +set(CMAKE_SYSTEM_PROCESSOR "x86_64") + +set(CMAKE_CROSSCOMPILING "TRUE") + +set(CMAKE_SYSTEM_LOADED 1) diff --git a/siro_driver/android/app/.cxx/Debug/2j1f5m6a/x86_64/CMakeFiles/3.31.5-g6cf5163/CompilerIdC/CMakeCCompilerId.c b/siro_driver/android/app/.cxx/Debug/2j1f5m6a/x86_64/CMakeFiles/3.31.5-g6cf5163/CompilerIdC/CMakeCCompilerId.c new file mode 100644 index 0000000..8d8bb03 --- /dev/null +++ b/siro_driver/android/app/.cxx/Debug/2j1f5m6a/x86_64/CMakeFiles/3.31.5-g6cf5163/CompilerIdC/CMakeCCompilerId.c @@ -0,0 +1,904 @@ +#ifdef __cplusplus +# error "A C++ compiler has been selected for C." +#endif + +#if defined(__18CXX) +# define ID_VOID_MAIN +#endif +#if defined(__CLASSIC_C__) +/* cv-qualifiers did not exist in K&R C */ +# define const +# define volatile +#endif + +#if !defined(__has_include) +/* If the compiler does not have __has_include, pretend the answer is + always no. */ +# define __has_include(x) 0 +#endif + + +/* Version number components: V=Version, R=Revision, P=Patch + Version date components: YYYY=Year, MM=Month, DD=Day */ + +#if defined(__INTEL_COMPILER) || defined(__ICC) +# define COMPILER_ID "Intel" +# if defined(_MSC_VER) +# define SIMULATE_ID "MSVC" +# endif +# if defined(__GNUC__) +# define SIMULATE_ID "GNU" +# endif + /* __INTEL_COMPILER = VRP prior to 2021, and then VVVV for 2021 and later, + except that a few beta releases use the old format with V=2021. */ +# if __INTEL_COMPILER < 2021 || __INTEL_COMPILER == 202110 || __INTEL_COMPILER == 202111 +# define COMPILER_VERSION_MAJOR DEC(__INTEL_COMPILER/100) +# define COMPILER_VERSION_MINOR DEC(__INTEL_COMPILER/10 % 10) +# if defined(__INTEL_COMPILER_UPDATE) +# define COMPILER_VERSION_PATCH DEC(__INTEL_COMPILER_UPDATE) +# else +# define COMPILER_VERSION_PATCH DEC(__INTEL_COMPILER % 10) +# endif +# else +# define COMPILER_VERSION_MAJOR DEC(__INTEL_COMPILER) +# define COMPILER_VERSION_MINOR DEC(__INTEL_COMPILER_UPDATE) + /* The third version component from --version is an update index, + but no macro is provided for it. */ +# define COMPILER_VERSION_PATCH DEC(0) +# endif +# if defined(__INTEL_COMPILER_BUILD_DATE) + /* __INTEL_COMPILER_BUILD_DATE = YYYYMMDD */ +# define COMPILER_VERSION_TWEAK DEC(__INTEL_COMPILER_BUILD_DATE) +# endif +# if defined(_MSC_VER) + /* _MSC_VER = VVRR */ +# define SIMULATE_VERSION_MAJOR DEC(_MSC_VER / 100) +# define SIMULATE_VERSION_MINOR DEC(_MSC_VER % 100) +# endif +# if defined(__GNUC__) +# define SIMULATE_VERSION_MAJOR DEC(__GNUC__) +# elif defined(__GNUG__) +# define SIMULATE_VERSION_MAJOR DEC(__GNUG__) +# endif +# if defined(__GNUC_MINOR__) +# define SIMULATE_VERSION_MINOR DEC(__GNUC_MINOR__) +# endif +# if defined(__GNUC_PATCHLEVEL__) +# define SIMULATE_VERSION_PATCH DEC(__GNUC_PATCHLEVEL__) +# endif + +#elif (defined(__clang__) && defined(__INTEL_CLANG_COMPILER)) || defined(__INTEL_LLVM_COMPILER) +# define COMPILER_ID "IntelLLVM" +#if defined(_MSC_VER) +# define SIMULATE_ID "MSVC" +#endif +#if defined(__GNUC__) +# define SIMULATE_ID "GNU" +#endif +/* __INTEL_LLVM_COMPILER = VVVVRP prior to 2021.2.0, VVVVRRPP for 2021.2.0 and + * later. Look for 6 digit vs. 8 digit version number to decide encoding. + * VVVV is no smaller than the current year when a version is released. + */ +#if __INTEL_LLVM_COMPILER < 1000000L +# define COMPILER_VERSION_MAJOR DEC(__INTEL_LLVM_COMPILER/100) +# define COMPILER_VERSION_MINOR DEC(__INTEL_LLVM_COMPILER/10 % 10) +# define COMPILER_VERSION_PATCH DEC(__INTEL_LLVM_COMPILER % 10) +#else +# define COMPILER_VERSION_MAJOR DEC(__INTEL_LLVM_COMPILER/10000) +# define COMPILER_VERSION_MINOR DEC(__INTEL_LLVM_COMPILER/100 % 100) +# define COMPILER_VERSION_PATCH DEC(__INTEL_LLVM_COMPILER % 100) +#endif +#if defined(_MSC_VER) + /* _MSC_VER = VVRR */ +# define SIMULATE_VERSION_MAJOR DEC(_MSC_VER / 100) +# define SIMULATE_VERSION_MINOR DEC(_MSC_VER % 100) +#endif +#if defined(__GNUC__) +# define SIMULATE_VERSION_MAJOR DEC(__GNUC__) +#elif defined(__GNUG__) +# define SIMULATE_VERSION_MAJOR DEC(__GNUG__) +#endif +#if defined(__GNUC_MINOR__) +# define SIMULATE_VERSION_MINOR DEC(__GNUC_MINOR__) +#endif +#if defined(__GNUC_PATCHLEVEL__) +# define SIMULATE_VERSION_PATCH DEC(__GNUC_PATCHLEVEL__) +#endif + +#elif defined(__PATHCC__) +# define COMPILER_ID "PathScale" +# define COMPILER_VERSION_MAJOR DEC(__PATHCC__) +# define COMPILER_VERSION_MINOR DEC(__PATHCC_MINOR__) +# if defined(__PATHCC_PATCHLEVEL__) +# define COMPILER_VERSION_PATCH DEC(__PATHCC_PATCHLEVEL__) +# endif + +#elif defined(__BORLANDC__) && defined(__CODEGEARC_VERSION__) +# define COMPILER_ID "Embarcadero" +# define COMPILER_VERSION_MAJOR HEX(__CODEGEARC_VERSION__>>24 & 0x00FF) +# define COMPILER_VERSION_MINOR HEX(__CODEGEARC_VERSION__>>16 & 0x00FF) +# define COMPILER_VERSION_PATCH DEC(__CODEGEARC_VERSION__ & 0xFFFF) + +#elif defined(__BORLANDC__) +# define COMPILER_ID "Borland" + /* __BORLANDC__ = 0xVRR */ +# define COMPILER_VERSION_MAJOR HEX(__BORLANDC__>>8) +# define COMPILER_VERSION_MINOR HEX(__BORLANDC__ & 0xFF) + +#elif defined(__WATCOMC__) && __WATCOMC__ < 1200 +# define COMPILER_ID "Watcom" + /* __WATCOMC__ = VVRR */ +# define COMPILER_VERSION_MAJOR DEC(__WATCOMC__ / 100) +# define COMPILER_VERSION_MINOR DEC((__WATCOMC__ / 10) % 10) +# if (__WATCOMC__ % 10) > 0 +# define COMPILER_VERSION_PATCH DEC(__WATCOMC__ % 10) +# endif + +#elif defined(__WATCOMC__) +# define COMPILER_ID "OpenWatcom" + /* __WATCOMC__ = VVRP + 1100 */ +# define COMPILER_VERSION_MAJOR DEC((__WATCOMC__ - 1100) / 100) +# define COMPILER_VERSION_MINOR DEC((__WATCOMC__ / 10) % 10) +# if (__WATCOMC__ % 10) > 0 +# define COMPILER_VERSION_PATCH DEC(__WATCOMC__ % 10) +# endif + +#elif defined(__SUNPRO_C) +# define COMPILER_ID "SunPro" +# if __SUNPRO_C >= 0x5100 + /* __SUNPRO_C = 0xVRRP */ +# define COMPILER_VERSION_MAJOR HEX(__SUNPRO_C>>12) +# define COMPILER_VERSION_MINOR HEX(__SUNPRO_C>>4 & 0xFF) +# define COMPILER_VERSION_PATCH HEX(__SUNPRO_C & 0xF) +# else + /* __SUNPRO_CC = 0xVRP */ +# define COMPILER_VERSION_MAJOR HEX(__SUNPRO_C>>8) +# define COMPILER_VERSION_MINOR HEX(__SUNPRO_C>>4 & 0xF) +# define COMPILER_VERSION_PATCH HEX(__SUNPRO_C & 0xF) +# endif + +#elif defined(__HP_cc) +# define COMPILER_ID "HP" + /* __HP_cc = VVRRPP */ +# define COMPILER_VERSION_MAJOR DEC(__HP_cc/10000) +# define COMPILER_VERSION_MINOR DEC(__HP_cc/100 % 100) +# define COMPILER_VERSION_PATCH DEC(__HP_cc % 100) + +#elif defined(__DECC) +# define COMPILER_ID "Compaq" + /* __DECC_VER = VVRRTPPPP */ +# define COMPILER_VERSION_MAJOR DEC(__DECC_VER/10000000) +# define COMPILER_VERSION_MINOR DEC(__DECC_VER/100000 % 100) +# define COMPILER_VERSION_PATCH DEC(__DECC_VER % 10000) + +#elif defined(__IBMC__) && defined(__COMPILER_VER__) +# define COMPILER_ID "zOS" + /* __IBMC__ = VRP */ +# define COMPILER_VERSION_MAJOR DEC(__IBMC__/100) +# define COMPILER_VERSION_MINOR DEC(__IBMC__/10 % 10) +# define COMPILER_VERSION_PATCH DEC(__IBMC__ % 10) + +#elif defined(__open_xl__) && defined(__clang__) +# define COMPILER_ID "IBMClang" +# define COMPILER_VERSION_MAJOR DEC(__open_xl_version__) +# define COMPILER_VERSION_MINOR DEC(__open_xl_release__) +# define COMPILER_VERSION_PATCH DEC(__open_xl_modification__) +# define COMPILER_VERSION_TWEAK DEC(__open_xl_ptf_fix_level__) + + +#elif defined(__ibmxl__) && defined(__clang__) +# define COMPILER_ID "XLClang" +# define COMPILER_VERSION_MAJOR DEC(__ibmxl_version__) +# define COMPILER_VERSION_MINOR DEC(__ibmxl_release__) +# define COMPILER_VERSION_PATCH DEC(__ibmxl_modification__) +# define COMPILER_VERSION_TWEAK DEC(__ibmxl_ptf_fix_level__) + + +#elif defined(__IBMC__) && !defined(__COMPILER_VER__) && __IBMC__ >= 800 +# define COMPILER_ID "XL" + /* __IBMC__ = VRP */ +# define COMPILER_VERSION_MAJOR DEC(__IBMC__/100) +# define COMPILER_VERSION_MINOR DEC(__IBMC__/10 % 10) +# define COMPILER_VERSION_PATCH DEC(__IBMC__ % 10) + +#elif defined(__IBMC__) && !defined(__COMPILER_VER__) && __IBMC__ < 800 +# define COMPILER_ID "VisualAge" + /* __IBMC__ = VRP */ +# define COMPILER_VERSION_MAJOR DEC(__IBMC__/100) +# define COMPILER_VERSION_MINOR DEC(__IBMC__/10 % 10) +# define COMPILER_VERSION_PATCH DEC(__IBMC__ % 10) + +#elif defined(__NVCOMPILER) +# define COMPILER_ID "NVHPC" +# define COMPILER_VERSION_MAJOR DEC(__NVCOMPILER_MAJOR__) +# define COMPILER_VERSION_MINOR DEC(__NVCOMPILER_MINOR__) +# if defined(__NVCOMPILER_PATCHLEVEL__) +# define COMPILER_VERSION_PATCH DEC(__NVCOMPILER_PATCHLEVEL__) +# endif + +#elif defined(__PGI) +# define COMPILER_ID "PGI" +# define COMPILER_VERSION_MAJOR DEC(__PGIC__) +# define COMPILER_VERSION_MINOR DEC(__PGIC_MINOR__) +# if defined(__PGIC_PATCHLEVEL__) +# define COMPILER_VERSION_PATCH DEC(__PGIC_PATCHLEVEL__) +# endif + +#elif defined(__clang__) && defined(__cray__) +# define COMPILER_ID "CrayClang" +# define COMPILER_VERSION_MAJOR DEC(__cray_major__) +# define COMPILER_VERSION_MINOR DEC(__cray_minor__) +# define COMPILER_VERSION_PATCH DEC(__cray_patchlevel__) +# define COMPILER_VERSION_INTERNAL_STR __clang_version__ + + +#elif defined(_CRAYC) +# define COMPILER_ID "Cray" +# define COMPILER_VERSION_MAJOR DEC(_RELEASE_MAJOR) +# define COMPILER_VERSION_MINOR DEC(_RELEASE_MINOR) + +#elif defined(__TI_COMPILER_VERSION__) +# define COMPILER_ID "TI" + /* __TI_COMPILER_VERSION__ = VVVRRRPPP */ +# define COMPILER_VERSION_MAJOR DEC(__TI_COMPILER_VERSION__/1000000) +# define COMPILER_VERSION_MINOR DEC(__TI_COMPILER_VERSION__/1000 % 1000) +# define COMPILER_VERSION_PATCH DEC(__TI_COMPILER_VERSION__ % 1000) + +#elif defined(__CLANG_FUJITSU) +# define COMPILER_ID "FujitsuClang" +# define COMPILER_VERSION_MAJOR DEC(__FCC_major__) +# define COMPILER_VERSION_MINOR DEC(__FCC_minor__) +# define COMPILER_VERSION_PATCH DEC(__FCC_patchlevel__) +# define COMPILER_VERSION_INTERNAL_STR __clang_version__ + + +#elif defined(__FUJITSU) +# define COMPILER_ID "Fujitsu" +# if defined(__FCC_version__) +# define COMPILER_VERSION __FCC_version__ +# elif defined(__FCC_major__) +# define COMPILER_VERSION_MAJOR DEC(__FCC_major__) +# define COMPILER_VERSION_MINOR DEC(__FCC_minor__) +# define COMPILER_VERSION_PATCH DEC(__FCC_patchlevel__) +# endif +# if defined(__fcc_version) +# define COMPILER_VERSION_INTERNAL DEC(__fcc_version) +# elif defined(__FCC_VERSION) +# define COMPILER_VERSION_INTERNAL DEC(__FCC_VERSION) +# endif + + +#elif defined(__ghs__) +# define COMPILER_ID "GHS" +/* __GHS_VERSION_NUMBER = VVVVRP */ +# ifdef __GHS_VERSION_NUMBER +# define COMPILER_VERSION_MAJOR DEC(__GHS_VERSION_NUMBER / 100) +# define COMPILER_VERSION_MINOR DEC(__GHS_VERSION_NUMBER / 10 % 10) +# define COMPILER_VERSION_PATCH DEC(__GHS_VERSION_NUMBER % 10) +# endif + +#elif defined(__TASKING__) +# define COMPILER_ID "Tasking" + # define COMPILER_VERSION_MAJOR DEC(__VERSION__/1000) + # define COMPILER_VERSION_MINOR DEC(__VERSION__ % 100) +# define COMPILER_VERSION_INTERNAL DEC(__VERSION__) + +#elif defined(__ORANGEC__) +# define COMPILER_ID "OrangeC" +# define COMPILER_VERSION_MAJOR DEC(__ORANGEC_MAJOR__) +# define COMPILER_VERSION_MINOR DEC(__ORANGEC_MINOR__) +# define COMPILER_VERSION_PATCH DEC(__ORANGEC_PATCHLEVEL__) + +#elif defined(__TINYC__) +# define COMPILER_ID "TinyCC" + +#elif defined(__BCC__) +# define COMPILER_ID "Bruce" + +#elif defined(__SCO_VERSION__) +# define COMPILER_ID "SCO" + +#elif defined(__ARMCC_VERSION) && !defined(__clang__) +# define COMPILER_ID "ARMCC" +#if __ARMCC_VERSION >= 1000000 + /* __ARMCC_VERSION = VRRPPPP */ + # define COMPILER_VERSION_MAJOR DEC(__ARMCC_VERSION/1000000) + # define COMPILER_VERSION_MINOR DEC(__ARMCC_VERSION/10000 % 100) + # define COMPILER_VERSION_PATCH DEC(__ARMCC_VERSION % 10000) +#else + /* __ARMCC_VERSION = VRPPPP */ + # define COMPILER_VERSION_MAJOR DEC(__ARMCC_VERSION/100000) + # define COMPILER_VERSION_MINOR DEC(__ARMCC_VERSION/10000 % 10) + # define COMPILER_VERSION_PATCH DEC(__ARMCC_VERSION % 10000) +#endif + + +#elif defined(__clang__) && defined(__apple_build_version__) +# define COMPILER_ID "AppleClang" +# if defined(_MSC_VER) +# define SIMULATE_ID "MSVC" +# endif +# define COMPILER_VERSION_MAJOR DEC(__clang_major__) +# define COMPILER_VERSION_MINOR DEC(__clang_minor__) +# define COMPILER_VERSION_PATCH DEC(__clang_patchlevel__) +# if defined(_MSC_VER) + /* _MSC_VER = VVRR */ +# define SIMULATE_VERSION_MAJOR DEC(_MSC_VER / 100) +# define SIMULATE_VERSION_MINOR DEC(_MSC_VER % 100) +# endif +# define COMPILER_VERSION_TWEAK DEC(__apple_build_version__) + +#elif defined(__clang__) && defined(__ARMCOMPILER_VERSION) +# define COMPILER_ID "ARMClang" + # define COMPILER_VERSION_MAJOR DEC(__ARMCOMPILER_VERSION/1000000) + # define COMPILER_VERSION_MINOR DEC(__ARMCOMPILER_VERSION/10000 % 100) + # define COMPILER_VERSION_PATCH DEC(__ARMCOMPILER_VERSION/100 % 100) +# define COMPILER_VERSION_INTERNAL DEC(__ARMCOMPILER_VERSION) + +#elif defined(__clang__) && defined(__ti__) +# define COMPILER_ID "TIClang" + # define COMPILER_VERSION_MAJOR DEC(__ti_major__) + # define COMPILER_VERSION_MINOR DEC(__ti_minor__) + # define COMPILER_VERSION_PATCH DEC(__ti_patchlevel__) +# define COMPILER_VERSION_INTERNAL DEC(__ti_version__) + +#elif defined(__clang__) +# define COMPILER_ID "Clang" +# if defined(_MSC_VER) +# define SIMULATE_ID "MSVC" +# endif +# define COMPILER_VERSION_MAJOR DEC(__clang_major__) +# define COMPILER_VERSION_MINOR DEC(__clang_minor__) +# define COMPILER_VERSION_PATCH DEC(__clang_patchlevel__) +# if defined(_MSC_VER) + /* _MSC_VER = VVRR */ +# define SIMULATE_VERSION_MAJOR DEC(_MSC_VER / 100) +# define SIMULATE_VERSION_MINOR DEC(_MSC_VER % 100) +# endif + +#elif defined(__LCC__) && (defined(__GNUC__) || defined(__GNUG__) || defined(__MCST__)) +# define COMPILER_ID "LCC" +# define COMPILER_VERSION_MAJOR DEC(__LCC__ / 100) +# define COMPILER_VERSION_MINOR DEC(__LCC__ % 100) +# if defined(__LCC_MINOR__) +# define COMPILER_VERSION_PATCH DEC(__LCC_MINOR__) +# endif +# if defined(__GNUC__) && defined(__GNUC_MINOR__) +# define SIMULATE_ID "GNU" +# define SIMULATE_VERSION_MAJOR DEC(__GNUC__) +# define SIMULATE_VERSION_MINOR DEC(__GNUC_MINOR__) +# if defined(__GNUC_PATCHLEVEL__) +# define SIMULATE_VERSION_PATCH DEC(__GNUC_PATCHLEVEL__) +# endif +# endif + +#elif defined(__GNUC__) +# define COMPILER_ID "GNU" +# define COMPILER_VERSION_MAJOR DEC(__GNUC__) +# if defined(__GNUC_MINOR__) +# define COMPILER_VERSION_MINOR DEC(__GNUC_MINOR__) +# endif +# if defined(__GNUC_PATCHLEVEL__) +# define COMPILER_VERSION_PATCH DEC(__GNUC_PATCHLEVEL__) +# endif + +#elif defined(_MSC_VER) +# define COMPILER_ID "MSVC" + /* _MSC_VER = VVRR */ +# define COMPILER_VERSION_MAJOR DEC(_MSC_VER / 100) +# define COMPILER_VERSION_MINOR DEC(_MSC_VER % 100) +# if defined(_MSC_FULL_VER) +# if _MSC_VER >= 1400 + /* _MSC_FULL_VER = VVRRPPPPP */ +# define COMPILER_VERSION_PATCH DEC(_MSC_FULL_VER % 100000) +# else + /* _MSC_FULL_VER = VVRRPPPP */ +# define COMPILER_VERSION_PATCH DEC(_MSC_FULL_VER % 10000) +# endif +# endif +# if defined(_MSC_BUILD) +# define COMPILER_VERSION_TWEAK DEC(_MSC_BUILD) +# endif + +#elif defined(_ADI_COMPILER) +# define COMPILER_ID "ADSP" +#if defined(__VERSIONNUM__) + /* __VERSIONNUM__ = 0xVVRRPPTT */ +# define COMPILER_VERSION_MAJOR DEC(__VERSIONNUM__ >> 24 & 0xFF) +# define COMPILER_VERSION_MINOR DEC(__VERSIONNUM__ >> 16 & 0xFF) +# define COMPILER_VERSION_PATCH DEC(__VERSIONNUM__ >> 8 & 0xFF) +# define COMPILER_VERSION_TWEAK DEC(__VERSIONNUM__ & 0xFF) +#endif + +#elif defined(__IAR_SYSTEMS_ICC__) || defined(__IAR_SYSTEMS_ICC) +# define COMPILER_ID "IAR" +# if defined(__VER__) && defined(__ICCARM__) +# define COMPILER_VERSION_MAJOR DEC((__VER__) / 1000000) +# define COMPILER_VERSION_MINOR DEC(((__VER__) / 1000) % 1000) +# define COMPILER_VERSION_PATCH DEC((__VER__) % 1000) +# define COMPILER_VERSION_INTERNAL DEC(__IAR_SYSTEMS_ICC__) +# elif defined(__VER__) && (defined(__ICCAVR__) || defined(__ICCRX__) || defined(__ICCRH850__) || defined(__ICCRL78__) || defined(__ICC430__) || defined(__ICCRISCV__) || defined(__ICCV850__) || defined(__ICC8051__) || defined(__ICCSTM8__)) +# define COMPILER_VERSION_MAJOR DEC((__VER__) / 100) +# define COMPILER_VERSION_MINOR DEC((__VER__) - (((__VER__) / 100)*100)) +# define COMPILER_VERSION_PATCH DEC(__SUBVERSION__) +# define COMPILER_VERSION_INTERNAL DEC(__IAR_SYSTEMS_ICC__) +# endif + +#elif defined(__SDCC_VERSION_MAJOR) || defined(SDCC) +# define COMPILER_ID "SDCC" +# if defined(__SDCC_VERSION_MAJOR) +# define COMPILER_VERSION_MAJOR DEC(__SDCC_VERSION_MAJOR) +# define COMPILER_VERSION_MINOR DEC(__SDCC_VERSION_MINOR) +# define COMPILER_VERSION_PATCH DEC(__SDCC_VERSION_PATCH) +# else + /* SDCC = VRP */ +# define COMPILER_VERSION_MAJOR DEC(SDCC/100) +# define COMPILER_VERSION_MINOR DEC(SDCC/10 % 10) +# define COMPILER_VERSION_PATCH DEC(SDCC % 10) +# endif + + +/* These compilers are either not known or too old to define an + identification macro. Try to identify the platform and guess that + it is the native compiler. */ +#elif defined(__hpux) || defined(__hpua) +# define COMPILER_ID "HP" + +#else /* unknown compiler */ +# define COMPILER_ID "" +#endif + +/* Construct the string literal in pieces to prevent the source from + getting matched. Store it in a pointer rather than an array + because some compilers will just produce instructions to fill the + array rather than assigning a pointer to a static array. */ +char const* info_compiler = "INFO" ":" "compiler[" COMPILER_ID "]"; +#ifdef SIMULATE_ID +char const* info_simulate = "INFO" ":" "simulate[" SIMULATE_ID "]"; +#endif + +#ifdef __QNXNTO__ +char const* qnxnto = "INFO" ":" "qnxnto[]"; +#endif + +#if defined(__CRAYXT_COMPUTE_LINUX_TARGET) +char const *info_cray = "INFO" ":" "compiler_wrapper[CrayPrgEnv]"; +#endif + +#define STRINGIFY_HELPER(X) #X +#define STRINGIFY(X) STRINGIFY_HELPER(X) + +/* Identify known platforms by name. */ +#if defined(__linux) || defined(__linux__) || defined(linux) +# define PLATFORM_ID "Linux" + +#elif defined(__MSYS__) +# define PLATFORM_ID "MSYS" + +#elif defined(__CYGWIN__) +# define PLATFORM_ID "Cygwin" + +#elif defined(__MINGW32__) +# define PLATFORM_ID "MinGW" + +#elif defined(__APPLE__) +# define PLATFORM_ID "Darwin" + +#elif defined(_WIN32) || defined(__WIN32__) || defined(WIN32) +# define PLATFORM_ID "Windows" + +#elif defined(__FreeBSD__) || defined(__FreeBSD) +# define PLATFORM_ID "FreeBSD" + +#elif defined(__NetBSD__) || defined(__NetBSD) +# define PLATFORM_ID "NetBSD" + +#elif defined(__OpenBSD__) || defined(__OPENBSD) +# define PLATFORM_ID "OpenBSD" + +#elif defined(__sun) || defined(sun) +# define PLATFORM_ID "SunOS" + +#elif defined(_AIX) || defined(__AIX) || defined(__AIX__) || defined(__aix) || defined(__aix__) +# define PLATFORM_ID "AIX" + +#elif defined(__hpux) || defined(__hpux__) +# define PLATFORM_ID "HP-UX" + +#elif defined(__HAIKU__) +# define PLATFORM_ID "Haiku" + +#elif defined(__BeOS) || defined(__BEOS__) || defined(_BEOS) +# define PLATFORM_ID "BeOS" + +#elif defined(__QNX__) || defined(__QNXNTO__) +# define PLATFORM_ID "QNX" + +#elif defined(__tru64) || defined(_tru64) || defined(__TRU64__) +# define PLATFORM_ID "Tru64" + +#elif defined(__riscos) || defined(__riscos__) +# define PLATFORM_ID "RISCos" + +#elif defined(__sinix) || defined(__sinix__) || defined(__SINIX__) +# define PLATFORM_ID "SINIX" + +#elif defined(__UNIX_SV__) +# define PLATFORM_ID "UNIX_SV" + +#elif defined(__bsdos__) +# define PLATFORM_ID "BSDOS" + +#elif defined(_MPRAS) || defined(MPRAS) +# define PLATFORM_ID "MP-RAS" + +#elif defined(__osf) || defined(__osf__) +# define PLATFORM_ID "OSF1" + +#elif defined(_SCO_SV) || defined(SCO_SV) || defined(sco_sv) +# define PLATFORM_ID "SCO_SV" + +#elif defined(__ultrix) || defined(__ultrix__) || defined(_ULTRIX) +# define PLATFORM_ID "ULTRIX" + +#elif defined(__XENIX__) || defined(_XENIX) || defined(XENIX) +# define PLATFORM_ID "Xenix" + +#elif defined(__WATCOMC__) +# if defined(__LINUX__) +# define PLATFORM_ID "Linux" + +# elif defined(__DOS__) +# define PLATFORM_ID "DOS" + +# elif defined(__OS2__) +# define PLATFORM_ID "OS2" + +# elif defined(__WINDOWS__) +# define PLATFORM_ID "Windows3x" + +# elif defined(__VXWORKS__) +# define PLATFORM_ID "VxWorks" + +# else /* unknown platform */ +# define PLATFORM_ID +# endif + +#elif defined(__INTEGRITY) +# if defined(INT_178B) +# define PLATFORM_ID "Integrity178" + +# else /* regular Integrity */ +# define PLATFORM_ID "Integrity" +# endif + +# elif defined(_ADI_COMPILER) +# define PLATFORM_ID "ADSP" + +#else /* unknown platform */ +# define PLATFORM_ID + +#endif + +/* For windows compilers MSVC and Intel we can determine + the architecture of the compiler being used. This is because + the compilers do not have flags that can change the architecture, + but rather depend on which compiler is being used +*/ +#if defined(_WIN32) && defined(_MSC_VER) +# if defined(_M_IA64) +# define ARCHITECTURE_ID "IA64" + +# elif defined(_M_ARM64EC) +# define ARCHITECTURE_ID "ARM64EC" + +# elif defined(_M_X64) || defined(_M_AMD64) +# define ARCHITECTURE_ID "x64" + +# elif defined(_M_IX86) +# define ARCHITECTURE_ID "X86" + +# elif defined(_M_ARM64) +# define ARCHITECTURE_ID "ARM64" + +# elif defined(_M_ARM) +# if _M_ARM == 4 +# define ARCHITECTURE_ID "ARMV4I" +# elif _M_ARM == 5 +# define ARCHITECTURE_ID "ARMV5I" +# else +# define ARCHITECTURE_ID "ARMV" STRINGIFY(_M_ARM) +# endif + +# elif defined(_M_MIPS) +# define ARCHITECTURE_ID "MIPS" + +# elif defined(_M_SH) +# define ARCHITECTURE_ID "SHx" + +# else /* unknown architecture */ +# define ARCHITECTURE_ID "" +# endif + +#elif defined(__WATCOMC__) +# if defined(_M_I86) +# define ARCHITECTURE_ID "I86" + +# elif defined(_M_IX86) +# define ARCHITECTURE_ID "X86" + +# else /* unknown architecture */ +# define ARCHITECTURE_ID "" +# endif + +#elif defined(__IAR_SYSTEMS_ICC__) || defined(__IAR_SYSTEMS_ICC) +# if defined(__ICCARM__) +# define ARCHITECTURE_ID "ARM" + +# elif defined(__ICCRX__) +# define ARCHITECTURE_ID "RX" + +# elif defined(__ICCRH850__) +# define ARCHITECTURE_ID "RH850" + +# elif defined(__ICCRL78__) +# define ARCHITECTURE_ID "RL78" + +# elif defined(__ICCRISCV__) +# define ARCHITECTURE_ID "RISCV" + +# elif defined(__ICCAVR__) +# define ARCHITECTURE_ID "AVR" + +# elif defined(__ICC430__) +# define ARCHITECTURE_ID "MSP430" + +# elif defined(__ICCV850__) +# define ARCHITECTURE_ID "V850" + +# elif defined(__ICC8051__) +# define ARCHITECTURE_ID "8051" + +# elif defined(__ICCSTM8__) +# define ARCHITECTURE_ID "STM8" + +# else /* unknown architecture */ +# define ARCHITECTURE_ID "" +# endif + +#elif defined(__ghs__) +# if defined(__PPC64__) +# define ARCHITECTURE_ID "PPC64" + +# elif defined(__ppc__) +# define ARCHITECTURE_ID "PPC" + +# elif defined(__ARM__) +# define ARCHITECTURE_ID "ARM" + +# elif defined(__x86_64__) +# define ARCHITECTURE_ID "x64" + +# elif defined(__i386__) +# define ARCHITECTURE_ID "X86" + +# else /* unknown architecture */ +# define ARCHITECTURE_ID "" +# endif + +#elif defined(__clang__) && defined(__ti__) +# if defined(__ARM_ARCH) +# define ARCHITECTURE_ID "Arm" + +# else /* unknown architecture */ +# define ARCHITECTURE_ID "" +# endif + +#elif defined(__TI_COMPILER_VERSION__) +# if defined(__TI_ARM__) +# define ARCHITECTURE_ID "ARM" + +# elif defined(__MSP430__) +# define ARCHITECTURE_ID "MSP430" + +# elif defined(__TMS320C28XX__) +# define ARCHITECTURE_ID "TMS320C28x" + +# elif defined(__TMS320C6X__) || defined(_TMS320C6X) +# define ARCHITECTURE_ID "TMS320C6x" + +# else /* unknown architecture */ +# define ARCHITECTURE_ID "" +# endif + +# elif defined(__ADSPSHARC__) +# define ARCHITECTURE_ID "SHARC" + +# elif defined(__ADSPBLACKFIN__) +# define ARCHITECTURE_ID "Blackfin" + +#elif defined(__TASKING__) + +# if defined(__CTC__) || defined(__CPTC__) +# define ARCHITECTURE_ID "TriCore" + +# elif defined(__CMCS__) +# define ARCHITECTURE_ID "MCS" + +# elif defined(__CARM__) +# define ARCHITECTURE_ID "ARM" + +# elif defined(__CARC__) +# define ARCHITECTURE_ID "ARC" + +# elif defined(__C51__) +# define ARCHITECTURE_ID "8051" + +# elif defined(__CPCP__) +# define ARCHITECTURE_ID "PCP" + +# else +# define ARCHITECTURE_ID "" +# endif + +#else +# define ARCHITECTURE_ID +#endif + +/* Convert integer to decimal digit literals. */ +#define DEC(n) \ + ('0' + (((n) / 10000000)%10)), \ + ('0' + (((n) / 1000000)%10)), \ + ('0' + (((n) / 100000)%10)), \ + ('0' + (((n) / 10000)%10)), \ + ('0' + (((n) / 1000)%10)), \ + ('0' + (((n) / 100)%10)), \ + ('0' + (((n) / 10)%10)), \ + ('0' + ((n) % 10)) + +/* Convert integer to hex digit literals. */ +#define HEX(n) \ + ('0' + ((n)>>28 & 0xF)), \ + ('0' + ((n)>>24 & 0xF)), \ + ('0' + ((n)>>20 & 0xF)), \ + ('0' + ((n)>>16 & 0xF)), \ + ('0' + ((n)>>12 & 0xF)), \ + ('0' + ((n)>>8 & 0xF)), \ + ('0' + ((n)>>4 & 0xF)), \ + ('0' + ((n) & 0xF)) + +/* Construct a string literal encoding the version number. */ +#ifdef COMPILER_VERSION +char const* info_version = "INFO" ":" "compiler_version[" COMPILER_VERSION "]"; + +/* Construct a string literal encoding the version number components. */ +#elif defined(COMPILER_VERSION_MAJOR) +char const info_version[] = { + 'I', 'N', 'F', 'O', ':', + 'c','o','m','p','i','l','e','r','_','v','e','r','s','i','o','n','[', + COMPILER_VERSION_MAJOR, +# ifdef COMPILER_VERSION_MINOR + '.', COMPILER_VERSION_MINOR, +# ifdef COMPILER_VERSION_PATCH + '.', COMPILER_VERSION_PATCH, +# ifdef COMPILER_VERSION_TWEAK + '.', COMPILER_VERSION_TWEAK, +# endif +# endif +# endif + ']','\0'}; +#endif + +/* Construct a string literal encoding the internal version number. */ +#ifdef COMPILER_VERSION_INTERNAL +char const info_version_internal[] = { + 'I', 'N', 'F', 'O', ':', + 'c','o','m','p','i','l','e','r','_','v','e','r','s','i','o','n','_', + 'i','n','t','e','r','n','a','l','[', + COMPILER_VERSION_INTERNAL,']','\0'}; +#elif defined(COMPILER_VERSION_INTERNAL_STR) +char const* info_version_internal = "INFO" ":" "compiler_version_internal[" COMPILER_VERSION_INTERNAL_STR "]"; +#endif + +/* Construct a string literal encoding the version number components. */ +#ifdef SIMULATE_VERSION_MAJOR +char const info_simulate_version[] = { + 'I', 'N', 'F', 'O', ':', + 's','i','m','u','l','a','t','e','_','v','e','r','s','i','o','n','[', + SIMULATE_VERSION_MAJOR, +# ifdef SIMULATE_VERSION_MINOR + '.', SIMULATE_VERSION_MINOR, +# ifdef SIMULATE_VERSION_PATCH + '.', SIMULATE_VERSION_PATCH, +# ifdef SIMULATE_VERSION_TWEAK + '.', SIMULATE_VERSION_TWEAK, +# endif +# endif +# endif + ']','\0'}; +#endif + +/* Construct the string literal in pieces to prevent the source from + getting matched. Store it in a pointer rather than an array + because some compilers will just produce instructions to fill the + array rather than assigning a pointer to a static array. */ +char const* info_platform = "INFO" ":" "platform[" PLATFORM_ID "]"; +char const* info_arch = "INFO" ":" "arch[" ARCHITECTURE_ID "]"; + + + +#define C_STD_99 199901L +#define C_STD_11 201112L +#define C_STD_17 201710L +#define C_STD_23 202311L + +#ifdef __STDC_VERSION__ +# define C_STD __STDC_VERSION__ +#endif + +#if !defined(__STDC__) && !defined(__clang__) +# if defined(_MSC_VER) || defined(__ibmxl__) || defined(__IBMC__) +# define C_VERSION "90" +# else +# define C_VERSION +# endif +#elif C_STD > C_STD_17 +# define C_VERSION "23" +#elif C_STD > C_STD_11 +# define C_VERSION "17" +#elif C_STD > C_STD_99 +# define C_VERSION "11" +#elif C_STD >= C_STD_99 +# define C_VERSION "99" +#else +# define C_VERSION "90" +#endif +const char* info_language_standard_default = + "INFO" ":" "standard_default[" C_VERSION "]"; + +const char* info_language_extensions_default = "INFO" ":" "extensions_default[" +#if (defined(__clang__) || defined(__GNUC__) || defined(__xlC__) || \ + defined(__TI_COMPILER_VERSION__)) && \ + !defined(__STRICT_ANSI__) + "ON" +#else + "OFF" +#endif +"]"; + +/*--------------------------------------------------------------------------*/ + +#ifdef ID_VOID_MAIN +void main() {} +#else +# if defined(__CLASSIC_C__) +int main(argc, argv) int argc; char *argv[]; +# else +int main(int argc, char* argv[]) +# endif +{ + int require = 0; + require += info_compiler[argc]; + require += info_platform[argc]; + require += info_arch[argc]; +#ifdef COMPILER_VERSION_MAJOR + require += info_version[argc]; +#endif +#ifdef COMPILER_VERSION_INTERNAL + require += info_version_internal[argc]; +#endif +#ifdef SIMULATE_ID + require += info_simulate[argc]; +#endif +#ifdef SIMULATE_VERSION_MAJOR + require += info_simulate_version[argc]; +#endif +#if defined(__CRAYXT_COMPUTE_LINUX_TARGET) + require += info_cray[argc]; +#endif + require += info_language_standard_default[argc]; + require += info_language_extensions_default[argc]; + (void)argv; + return require; +} +#endif diff --git a/siro_driver/android/app/.cxx/Debug/2j1f5m6a/x86_64/CMakeFiles/3.31.5-g6cf5163/CompilerIdC/CMakeCCompilerId.o b/siro_driver/android/app/.cxx/Debug/2j1f5m6a/x86_64/CMakeFiles/3.31.5-g6cf5163/CompilerIdC/CMakeCCompilerId.o new file mode 100644 index 0000000..d39c089 Binary files /dev/null and b/siro_driver/android/app/.cxx/Debug/2j1f5m6a/x86_64/CMakeFiles/3.31.5-g6cf5163/CompilerIdC/CMakeCCompilerId.o differ diff --git a/siro_driver/android/app/.cxx/Debug/2j1f5m6a/x86_64/CMakeFiles/3.31.5-g6cf5163/CompilerIdCXX/CMakeCXXCompilerId.cpp b/siro_driver/android/app/.cxx/Debug/2j1f5m6a/x86_64/CMakeFiles/3.31.5-g6cf5163/CompilerIdCXX/CMakeCXXCompilerId.cpp new file mode 100644 index 0000000..da6c824 --- /dev/null +++ b/siro_driver/android/app/.cxx/Debug/2j1f5m6a/x86_64/CMakeFiles/3.31.5-g6cf5163/CompilerIdCXX/CMakeCXXCompilerId.cpp @@ -0,0 +1,919 @@ +/* This source file must have a .cpp extension so that all C++ compilers + recognize the extension without flags. Borland does not know .cxx for + example. */ +#ifndef __cplusplus +# error "A C compiler has been selected for C++." +#endif + +#if !defined(__has_include) +/* If the compiler does not have __has_include, pretend the answer is + always no. */ +# define __has_include(x) 0 +#endif + + +/* Version number components: V=Version, R=Revision, P=Patch + Version date components: YYYY=Year, MM=Month, DD=Day */ + +#if defined(__INTEL_COMPILER) || defined(__ICC) +# define COMPILER_ID "Intel" +# if defined(_MSC_VER) +# define SIMULATE_ID "MSVC" +# endif +# if defined(__GNUC__) +# define SIMULATE_ID "GNU" +# endif + /* __INTEL_COMPILER = VRP prior to 2021, and then VVVV for 2021 and later, + except that a few beta releases use the old format with V=2021. */ +# if __INTEL_COMPILER < 2021 || __INTEL_COMPILER == 202110 || __INTEL_COMPILER == 202111 +# define COMPILER_VERSION_MAJOR DEC(__INTEL_COMPILER/100) +# define COMPILER_VERSION_MINOR DEC(__INTEL_COMPILER/10 % 10) +# if defined(__INTEL_COMPILER_UPDATE) +# define COMPILER_VERSION_PATCH DEC(__INTEL_COMPILER_UPDATE) +# else +# define COMPILER_VERSION_PATCH DEC(__INTEL_COMPILER % 10) +# endif +# else +# define COMPILER_VERSION_MAJOR DEC(__INTEL_COMPILER) +# define COMPILER_VERSION_MINOR DEC(__INTEL_COMPILER_UPDATE) + /* The third version component from --version is an update index, + but no macro is provided for it. */ +# define COMPILER_VERSION_PATCH DEC(0) +# endif +# if defined(__INTEL_COMPILER_BUILD_DATE) + /* __INTEL_COMPILER_BUILD_DATE = YYYYMMDD */ +# define COMPILER_VERSION_TWEAK DEC(__INTEL_COMPILER_BUILD_DATE) +# endif +# if defined(_MSC_VER) + /* _MSC_VER = VVRR */ +# define SIMULATE_VERSION_MAJOR DEC(_MSC_VER / 100) +# define SIMULATE_VERSION_MINOR DEC(_MSC_VER % 100) +# endif +# if defined(__GNUC__) +# define SIMULATE_VERSION_MAJOR DEC(__GNUC__) +# elif defined(__GNUG__) +# define SIMULATE_VERSION_MAJOR DEC(__GNUG__) +# endif +# if defined(__GNUC_MINOR__) +# define SIMULATE_VERSION_MINOR DEC(__GNUC_MINOR__) +# endif +# if defined(__GNUC_PATCHLEVEL__) +# define SIMULATE_VERSION_PATCH DEC(__GNUC_PATCHLEVEL__) +# endif + +#elif (defined(__clang__) && defined(__INTEL_CLANG_COMPILER)) || defined(__INTEL_LLVM_COMPILER) +# define COMPILER_ID "IntelLLVM" +#if defined(_MSC_VER) +# define SIMULATE_ID "MSVC" +#endif +#if defined(__GNUC__) +# define SIMULATE_ID "GNU" +#endif +/* __INTEL_LLVM_COMPILER = VVVVRP prior to 2021.2.0, VVVVRRPP for 2021.2.0 and + * later. Look for 6 digit vs. 8 digit version number to decide encoding. + * VVVV is no smaller than the current year when a version is released. + */ +#if __INTEL_LLVM_COMPILER < 1000000L +# define COMPILER_VERSION_MAJOR DEC(__INTEL_LLVM_COMPILER/100) +# define COMPILER_VERSION_MINOR DEC(__INTEL_LLVM_COMPILER/10 % 10) +# define COMPILER_VERSION_PATCH DEC(__INTEL_LLVM_COMPILER % 10) +#else +# define COMPILER_VERSION_MAJOR DEC(__INTEL_LLVM_COMPILER/10000) +# define COMPILER_VERSION_MINOR DEC(__INTEL_LLVM_COMPILER/100 % 100) +# define COMPILER_VERSION_PATCH DEC(__INTEL_LLVM_COMPILER % 100) +#endif +#if defined(_MSC_VER) + /* _MSC_VER = VVRR */ +# define SIMULATE_VERSION_MAJOR DEC(_MSC_VER / 100) +# define SIMULATE_VERSION_MINOR DEC(_MSC_VER % 100) +#endif +#if defined(__GNUC__) +# define SIMULATE_VERSION_MAJOR DEC(__GNUC__) +#elif defined(__GNUG__) +# define SIMULATE_VERSION_MAJOR DEC(__GNUG__) +#endif +#if defined(__GNUC_MINOR__) +# define SIMULATE_VERSION_MINOR DEC(__GNUC_MINOR__) +#endif +#if defined(__GNUC_PATCHLEVEL__) +# define SIMULATE_VERSION_PATCH DEC(__GNUC_PATCHLEVEL__) +#endif + +#elif defined(__PATHCC__) +# define COMPILER_ID "PathScale" +# define COMPILER_VERSION_MAJOR DEC(__PATHCC__) +# define COMPILER_VERSION_MINOR DEC(__PATHCC_MINOR__) +# if defined(__PATHCC_PATCHLEVEL__) +# define COMPILER_VERSION_PATCH DEC(__PATHCC_PATCHLEVEL__) +# endif + +#elif defined(__BORLANDC__) && defined(__CODEGEARC_VERSION__) +# define COMPILER_ID "Embarcadero" +# define COMPILER_VERSION_MAJOR HEX(__CODEGEARC_VERSION__>>24 & 0x00FF) +# define COMPILER_VERSION_MINOR HEX(__CODEGEARC_VERSION__>>16 & 0x00FF) +# define COMPILER_VERSION_PATCH DEC(__CODEGEARC_VERSION__ & 0xFFFF) + +#elif defined(__BORLANDC__) +# define COMPILER_ID "Borland" + /* __BORLANDC__ = 0xVRR */ +# define COMPILER_VERSION_MAJOR HEX(__BORLANDC__>>8) +# define COMPILER_VERSION_MINOR HEX(__BORLANDC__ & 0xFF) + +#elif defined(__WATCOMC__) && __WATCOMC__ < 1200 +# define COMPILER_ID "Watcom" + /* __WATCOMC__ = VVRR */ +# define COMPILER_VERSION_MAJOR DEC(__WATCOMC__ / 100) +# define COMPILER_VERSION_MINOR DEC((__WATCOMC__ / 10) % 10) +# if (__WATCOMC__ % 10) > 0 +# define COMPILER_VERSION_PATCH DEC(__WATCOMC__ % 10) +# endif + +#elif defined(__WATCOMC__) +# define COMPILER_ID "OpenWatcom" + /* __WATCOMC__ = VVRP + 1100 */ +# define COMPILER_VERSION_MAJOR DEC((__WATCOMC__ - 1100) / 100) +# define COMPILER_VERSION_MINOR DEC((__WATCOMC__ / 10) % 10) +# if (__WATCOMC__ % 10) > 0 +# define COMPILER_VERSION_PATCH DEC(__WATCOMC__ % 10) +# endif + +#elif defined(__SUNPRO_CC) +# define COMPILER_ID "SunPro" +# if __SUNPRO_CC >= 0x5100 + /* __SUNPRO_CC = 0xVRRP */ +# define COMPILER_VERSION_MAJOR HEX(__SUNPRO_CC>>12) +# define COMPILER_VERSION_MINOR HEX(__SUNPRO_CC>>4 & 0xFF) +# define COMPILER_VERSION_PATCH HEX(__SUNPRO_CC & 0xF) +# else + /* __SUNPRO_CC = 0xVRP */ +# define COMPILER_VERSION_MAJOR HEX(__SUNPRO_CC>>8) +# define COMPILER_VERSION_MINOR HEX(__SUNPRO_CC>>4 & 0xF) +# define COMPILER_VERSION_PATCH HEX(__SUNPRO_CC & 0xF) +# endif + +#elif defined(__HP_aCC) +# define COMPILER_ID "HP" + /* __HP_aCC = VVRRPP */ +# define COMPILER_VERSION_MAJOR DEC(__HP_aCC/10000) +# define COMPILER_VERSION_MINOR DEC(__HP_aCC/100 % 100) +# define COMPILER_VERSION_PATCH DEC(__HP_aCC % 100) + +#elif defined(__DECCXX) +# define COMPILER_ID "Compaq" + /* __DECCXX_VER = VVRRTPPPP */ +# define COMPILER_VERSION_MAJOR DEC(__DECCXX_VER/10000000) +# define COMPILER_VERSION_MINOR DEC(__DECCXX_VER/100000 % 100) +# define COMPILER_VERSION_PATCH DEC(__DECCXX_VER % 10000) + +#elif defined(__IBMCPP__) && defined(__COMPILER_VER__) +# define COMPILER_ID "zOS" + /* __IBMCPP__ = VRP */ +# define COMPILER_VERSION_MAJOR DEC(__IBMCPP__/100) +# define COMPILER_VERSION_MINOR DEC(__IBMCPP__/10 % 10) +# define COMPILER_VERSION_PATCH DEC(__IBMCPP__ % 10) + +#elif defined(__open_xl__) && defined(__clang__) +# define COMPILER_ID "IBMClang" +# define COMPILER_VERSION_MAJOR DEC(__open_xl_version__) +# define COMPILER_VERSION_MINOR DEC(__open_xl_release__) +# define COMPILER_VERSION_PATCH DEC(__open_xl_modification__) +# define COMPILER_VERSION_TWEAK DEC(__open_xl_ptf_fix_level__) + + +#elif defined(__ibmxl__) && defined(__clang__) +# define COMPILER_ID "XLClang" +# define COMPILER_VERSION_MAJOR DEC(__ibmxl_version__) +# define COMPILER_VERSION_MINOR DEC(__ibmxl_release__) +# define COMPILER_VERSION_PATCH DEC(__ibmxl_modification__) +# define COMPILER_VERSION_TWEAK DEC(__ibmxl_ptf_fix_level__) + + +#elif defined(__IBMCPP__) && !defined(__COMPILER_VER__) && __IBMCPP__ >= 800 +# define COMPILER_ID "XL" + /* __IBMCPP__ = VRP */ +# define COMPILER_VERSION_MAJOR DEC(__IBMCPP__/100) +# define COMPILER_VERSION_MINOR DEC(__IBMCPP__/10 % 10) +# define COMPILER_VERSION_PATCH DEC(__IBMCPP__ % 10) + +#elif defined(__IBMCPP__) && !defined(__COMPILER_VER__) && __IBMCPP__ < 800 +# define COMPILER_ID "VisualAge" + /* __IBMCPP__ = VRP */ +# define COMPILER_VERSION_MAJOR DEC(__IBMCPP__/100) +# define COMPILER_VERSION_MINOR DEC(__IBMCPP__/10 % 10) +# define COMPILER_VERSION_PATCH DEC(__IBMCPP__ % 10) + +#elif defined(__NVCOMPILER) +# define COMPILER_ID "NVHPC" +# define COMPILER_VERSION_MAJOR DEC(__NVCOMPILER_MAJOR__) +# define COMPILER_VERSION_MINOR DEC(__NVCOMPILER_MINOR__) +# if defined(__NVCOMPILER_PATCHLEVEL__) +# define COMPILER_VERSION_PATCH DEC(__NVCOMPILER_PATCHLEVEL__) +# endif + +#elif defined(__PGI) +# define COMPILER_ID "PGI" +# define COMPILER_VERSION_MAJOR DEC(__PGIC__) +# define COMPILER_VERSION_MINOR DEC(__PGIC_MINOR__) +# if defined(__PGIC_PATCHLEVEL__) +# define COMPILER_VERSION_PATCH DEC(__PGIC_PATCHLEVEL__) +# endif + +#elif defined(__clang__) && defined(__cray__) +# define COMPILER_ID "CrayClang" +# define COMPILER_VERSION_MAJOR DEC(__cray_major__) +# define COMPILER_VERSION_MINOR DEC(__cray_minor__) +# define COMPILER_VERSION_PATCH DEC(__cray_patchlevel__) +# define COMPILER_VERSION_INTERNAL_STR __clang_version__ + + +#elif defined(_CRAYC) +# define COMPILER_ID "Cray" +# define COMPILER_VERSION_MAJOR DEC(_RELEASE_MAJOR) +# define COMPILER_VERSION_MINOR DEC(_RELEASE_MINOR) + +#elif defined(__TI_COMPILER_VERSION__) +# define COMPILER_ID "TI" + /* __TI_COMPILER_VERSION__ = VVVRRRPPP */ +# define COMPILER_VERSION_MAJOR DEC(__TI_COMPILER_VERSION__/1000000) +# define COMPILER_VERSION_MINOR DEC(__TI_COMPILER_VERSION__/1000 % 1000) +# define COMPILER_VERSION_PATCH DEC(__TI_COMPILER_VERSION__ % 1000) + +#elif defined(__CLANG_FUJITSU) +# define COMPILER_ID "FujitsuClang" +# define COMPILER_VERSION_MAJOR DEC(__FCC_major__) +# define COMPILER_VERSION_MINOR DEC(__FCC_minor__) +# define COMPILER_VERSION_PATCH DEC(__FCC_patchlevel__) +# define COMPILER_VERSION_INTERNAL_STR __clang_version__ + + +#elif defined(__FUJITSU) +# define COMPILER_ID "Fujitsu" +# if defined(__FCC_version__) +# define COMPILER_VERSION __FCC_version__ +# elif defined(__FCC_major__) +# define COMPILER_VERSION_MAJOR DEC(__FCC_major__) +# define COMPILER_VERSION_MINOR DEC(__FCC_minor__) +# define COMPILER_VERSION_PATCH DEC(__FCC_patchlevel__) +# endif +# if defined(__fcc_version) +# define COMPILER_VERSION_INTERNAL DEC(__fcc_version) +# elif defined(__FCC_VERSION) +# define COMPILER_VERSION_INTERNAL DEC(__FCC_VERSION) +# endif + + +#elif defined(__ghs__) +# define COMPILER_ID "GHS" +/* __GHS_VERSION_NUMBER = VVVVRP */ +# ifdef __GHS_VERSION_NUMBER +# define COMPILER_VERSION_MAJOR DEC(__GHS_VERSION_NUMBER / 100) +# define COMPILER_VERSION_MINOR DEC(__GHS_VERSION_NUMBER / 10 % 10) +# define COMPILER_VERSION_PATCH DEC(__GHS_VERSION_NUMBER % 10) +# endif + +#elif defined(__TASKING__) +# define COMPILER_ID "Tasking" + # define COMPILER_VERSION_MAJOR DEC(__VERSION__/1000) + # define COMPILER_VERSION_MINOR DEC(__VERSION__ % 100) +# define COMPILER_VERSION_INTERNAL DEC(__VERSION__) + +#elif defined(__ORANGEC__) +# define COMPILER_ID "OrangeC" +# define COMPILER_VERSION_MAJOR DEC(__ORANGEC_MAJOR__) +# define COMPILER_VERSION_MINOR DEC(__ORANGEC_MINOR__) +# define COMPILER_VERSION_PATCH DEC(__ORANGEC_PATCHLEVEL__) + +#elif defined(__SCO_VERSION__) +# define COMPILER_ID "SCO" + +#elif defined(__ARMCC_VERSION) && !defined(__clang__) +# define COMPILER_ID "ARMCC" +#if __ARMCC_VERSION >= 1000000 + /* __ARMCC_VERSION = VRRPPPP */ + # define COMPILER_VERSION_MAJOR DEC(__ARMCC_VERSION/1000000) + # define COMPILER_VERSION_MINOR DEC(__ARMCC_VERSION/10000 % 100) + # define COMPILER_VERSION_PATCH DEC(__ARMCC_VERSION % 10000) +#else + /* __ARMCC_VERSION = VRPPPP */ + # define COMPILER_VERSION_MAJOR DEC(__ARMCC_VERSION/100000) + # define COMPILER_VERSION_MINOR DEC(__ARMCC_VERSION/10000 % 10) + # define COMPILER_VERSION_PATCH DEC(__ARMCC_VERSION % 10000) +#endif + + +#elif defined(__clang__) && defined(__apple_build_version__) +# define COMPILER_ID "AppleClang" +# if defined(_MSC_VER) +# define SIMULATE_ID "MSVC" +# endif +# define COMPILER_VERSION_MAJOR DEC(__clang_major__) +# define COMPILER_VERSION_MINOR DEC(__clang_minor__) +# define COMPILER_VERSION_PATCH DEC(__clang_patchlevel__) +# if defined(_MSC_VER) + /* _MSC_VER = VVRR */ +# define SIMULATE_VERSION_MAJOR DEC(_MSC_VER / 100) +# define SIMULATE_VERSION_MINOR DEC(_MSC_VER % 100) +# endif +# define COMPILER_VERSION_TWEAK DEC(__apple_build_version__) + +#elif defined(__clang__) && defined(__ARMCOMPILER_VERSION) +# define COMPILER_ID "ARMClang" + # define COMPILER_VERSION_MAJOR DEC(__ARMCOMPILER_VERSION/1000000) + # define COMPILER_VERSION_MINOR DEC(__ARMCOMPILER_VERSION/10000 % 100) + # define COMPILER_VERSION_PATCH DEC(__ARMCOMPILER_VERSION/100 % 100) +# define COMPILER_VERSION_INTERNAL DEC(__ARMCOMPILER_VERSION) + +#elif defined(__clang__) && defined(__ti__) +# define COMPILER_ID "TIClang" + # define COMPILER_VERSION_MAJOR DEC(__ti_major__) + # define COMPILER_VERSION_MINOR DEC(__ti_minor__) + # define COMPILER_VERSION_PATCH DEC(__ti_patchlevel__) +# define COMPILER_VERSION_INTERNAL DEC(__ti_version__) + +#elif defined(__clang__) +# define COMPILER_ID "Clang" +# if defined(_MSC_VER) +# define SIMULATE_ID "MSVC" +# endif +# define COMPILER_VERSION_MAJOR DEC(__clang_major__) +# define COMPILER_VERSION_MINOR DEC(__clang_minor__) +# define COMPILER_VERSION_PATCH DEC(__clang_patchlevel__) +# if defined(_MSC_VER) + /* _MSC_VER = VVRR */ +# define SIMULATE_VERSION_MAJOR DEC(_MSC_VER / 100) +# define SIMULATE_VERSION_MINOR DEC(_MSC_VER % 100) +# endif + +#elif defined(__LCC__) && (defined(__GNUC__) || defined(__GNUG__) || defined(__MCST__)) +# define COMPILER_ID "LCC" +# define COMPILER_VERSION_MAJOR DEC(__LCC__ / 100) +# define COMPILER_VERSION_MINOR DEC(__LCC__ % 100) +# if defined(__LCC_MINOR__) +# define COMPILER_VERSION_PATCH DEC(__LCC_MINOR__) +# endif +# if defined(__GNUC__) && defined(__GNUC_MINOR__) +# define SIMULATE_ID "GNU" +# define SIMULATE_VERSION_MAJOR DEC(__GNUC__) +# define SIMULATE_VERSION_MINOR DEC(__GNUC_MINOR__) +# if defined(__GNUC_PATCHLEVEL__) +# define SIMULATE_VERSION_PATCH DEC(__GNUC_PATCHLEVEL__) +# endif +# endif + +#elif defined(__GNUC__) || defined(__GNUG__) +# define COMPILER_ID "GNU" +# if defined(__GNUC__) +# define COMPILER_VERSION_MAJOR DEC(__GNUC__) +# else +# define COMPILER_VERSION_MAJOR DEC(__GNUG__) +# endif +# if defined(__GNUC_MINOR__) +# define COMPILER_VERSION_MINOR DEC(__GNUC_MINOR__) +# endif +# if defined(__GNUC_PATCHLEVEL__) +# define COMPILER_VERSION_PATCH DEC(__GNUC_PATCHLEVEL__) +# endif + +#elif defined(_MSC_VER) +# define COMPILER_ID "MSVC" + /* _MSC_VER = VVRR */ +# define COMPILER_VERSION_MAJOR DEC(_MSC_VER / 100) +# define COMPILER_VERSION_MINOR DEC(_MSC_VER % 100) +# if defined(_MSC_FULL_VER) +# if _MSC_VER >= 1400 + /* _MSC_FULL_VER = VVRRPPPPP */ +# define COMPILER_VERSION_PATCH DEC(_MSC_FULL_VER % 100000) +# else + /* _MSC_FULL_VER = VVRRPPPP */ +# define COMPILER_VERSION_PATCH DEC(_MSC_FULL_VER % 10000) +# endif +# endif +# if defined(_MSC_BUILD) +# define COMPILER_VERSION_TWEAK DEC(_MSC_BUILD) +# endif + +#elif defined(_ADI_COMPILER) +# define COMPILER_ID "ADSP" +#if defined(__VERSIONNUM__) + /* __VERSIONNUM__ = 0xVVRRPPTT */ +# define COMPILER_VERSION_MAJOR DEC(__VERSIONNUM__ >> 24 & 0xFF) +# define COMPILER_VERSION_MINOR DEC(__VERSIONNUM__ >> 16 & 0xFF) +# define COMPILER_VERSION_PATCH DEC(__VERSIONNUM__ >> 8 & 0xFF) +# define COMPILER_VERSION_TWEAK DEC(__VERSIONNUM__ & 0xFF) +#endif + +#elif defined(__IAR_SYSTEMS_ICC__) || defined(__IAR_SYSTEMS_ICC) +# define COMPILER_ID "IAR" +# if defined(__VER__) && defined(__ICCARM__) +# define COMPILER_VERSION_MAJOR DEC((__VER__) / 1000000) +# define COMPILER_VERSION_MINOR DEC(((__VER__) / 1000) % 1000) +# define COMPILER_VERSION_PATCH DEC((__VER__) % 1000) +# define COMPILER_VERSION_INTERNAL DEC(__IAR_SYSTEMS_ICC__) +# elif defined(__VER__) && (defined(__ICCAVR__) || defined(__ICCRX__) || defined(__ICCRH850__) || defined(__ICCRL78__) || defined(__ICC430__) || defined(__ICCRISCV__) || defined(__ICCV850__) || defined(__ICC8051__) || defined(__ICCSTM8__)) +# define COMPILER_VERSION_MAJOR DEC((__VER__) / 100) +# define COMPILER_VERSION_MINOR DEC((__VER__) - (((__VER__) / 100)*100)) +# define COMPILER_VERSION_PATCH DEC(__SUBVERSION__) +# define COMPILER_VERSION_INTERNAL DEC(__IAR_SYSTEMS_ICC__) +# endif + + +/* These compilers are either not known or too old to define an + identification macro. Try to identify the platform and guess that + it is the native compiler. */ +#elif defined(__hpux) || defined(__hpua) +# define COMPILER_ID "HP" + +#else /* unknown compiler */ +# define COMPILER_ID "" +#endif + +/* Construct the string literal in pieces to prevent the source from + getting matched. Store it in a pointer rather than an array + because some compilers will just produce instructions to fill the + array rather than assigning a pointer to a static array. */ +char const* info_compiler = "INFO" ":" "compiler[" COMPILER_ID "]"; +#ifdef SIMULATE_ID +char const* info_simulate = "INFO" ":" "simulate[" SIMULATE_ID "]"; +#endif + +#ifdef __QNXNTO__ +char const* qnxnto = "INFO" ":" "qnxnto[]"; +#endif + +#if defined(__CRAYXT_COMPUTE_LINUX_TARGET) +char const *info_cray = "INFO" ":" "compiler_wrapper[CrayPrgEnv]"; +#endif + +#define STRINGIFY_HELPER(X) #X +#define STRINGIFY(X) STRINGIFY_HELPER(X) + +/* Identify known platforms by name. */ +#if defined(__linux) || defined(__linux__) || defined(linux) +# define PLATFORM_ID "Linux" + +#elif defined(__MSYS__) +# define PLATFORM_ID "MSYS" + +#elif defined(__CYGWIN__) +# define PLATFORM_ID "Cygwin" + +#elif defined(__MINGW32__) +# define PLATFORM_ID "MinGW" + +#elif defined(__APPLE__) +# define PLATFORM_ID "Darwin" + +#elif defined(_WIN32) || defined(__WIN32__) || defined(WIN32) +# define PLATFORM_ID "Windows" + +#elif defined(__FreeBSD__) || defined(__FreeBSD) +# define PLATFORM_ID "FreeBSD" + +#elif defined(__NetBSD__) || defined(__NetBSD) +# define PLATFORM_ID "NetBSD" + +#elif defined(__OpenBSD__) || defined(__OPENBSD) +# define PLATFORM_ID "OpenBSD" + +#elif defined(__sun) || defined(sun) +# define PLATFORM_ID "SunOS" + +#elif defined(_AIX) || defined(__AIX) || defined(__AIX__) || defined(__aix) || defined(__aix__) +# define PLATFORM_ID "AIX" + +#elif defined(__hpux) || defined(__hpux__) +# define PLATFORM_ID "HP-UX" + +#elif defined(__HAIKU__) +# define PLATFORM_ID "Haiku" + +#elif defined(__BeOS) || defined(__BEOS__) || defined(_BEOS) +# define PLATFORM_ID "BeOS" + +#elif defined(__QNX__) || defined(__QNXNTO__) +# define PLATFORM_ID "QNX" + +#elif defined(__tru64) || defined(_tru64) || defined(__TRU64__) +# define PLATFORM_ID "Tru64" + +#elif defined(__riscos) || defined(__riscos__) +# define PLATFORM_ID "RISCos" + +#elif defined(__sinix) || defined(__sinix__) || defined(__SINIX__) +# define PLATFORM_ID "SINIX" + +#elif defined(__UNIX_SV__) +# define PLATFORM_ID "UNIX_SV" + +#elif defined(__bsdos__) +# define PLATFORM_ID "BSDOS" + +#elif defined(_MPRAS) || defined(MPRAS) +# define PLATFORM_ID "MP-RAS" + +#elif defined(__osf) || defined(__osf__) +# define PLATFORM_ID "OSF1" + +#elif defined(_SCO_SV) || defined(SCO_SV) || defined(sco_sv) +# define PLATFORM_ID "SCO_SV" + +#elif defined(__ultrix) || defined(__ultrix__) || defined(_ULTRIX) +# define PLATFORM_ID "ULTRIX" + +#elif defined(__XENIX__) || defined(_XENIX) || defined(XENIX) +# define PLATFORM_ID "Xenix" + +#elif defined(__WATCOMC__) +# if defined(__LINUX__) +# define PLATFORM_ID "Linux" + +# elif defined(__DOS__) +# define PLATFORM_ID "DOS" + +# elif defined(__OS2__) +# define PLATFORM_ID "OS2" + +# elif defined(__WINDOWS__) +# define PLATFORM_ID "Windows3x" + +# elif defined(__VXWORKS__) +# define PLATFORM_ID "VxWorks" + +# else /* unknown platform */ +# define PLATFORM_ID +# endif + +#elif defined(__INTEGRITY) +# if defined(INT_178B) +# define PLATFORM_ID "Integrity178" + +# else /* regular Integrity */ +# define PLATFORM_ID "Integrity" +# endif + +# elif defined(_ADI_COMPILER) +# define PLATFORM_ID "ADSP" + +#else /* unknown platform */ +# define PLATFORM_ID + +#endif + +/* For windows compilers MSVC and Intel we can determine + the architecture of the compiler being used. This is because + the compilers do not have flags that can change the architecture, + but rather depend on which compiler is being used +*/ +#if defined(_WIN32) && defined(_MSC_VER) +# if defined(_M_IA64) +# define ARCHITECTURE_ID "IA64" + +# elif defined(_M_ARM64EC) +# define ARCHITECTURE_ID "ARM64EC" + +# elif defined(_M_X64) || defined(_M_AMD64) +# define ARCHITECTURE_ID "x64" + +# elif defined(_M_IX86) +# define ARCHITECTURE_ID "X86" + +# elif defined(_M_ARM64) +# define ARCHITECTURE_ID "ARM64" + +# elif defined(_M_ARM) +# if _M_ARM == 4 +# define ARCHITECTURE_ID "ARMV4I" +# elif _M_ARM == 5 +# define ARCHITECTURE_ID "ARMV5I" +# else +# define ARCHITECTURE_ID "ARMV" STRINGIFY(_M_ARM) +# endif + +# elif defined(_M_MIPS) +# define ARCHITECTURE_ID "MIPS" + +# elif defined(_M_SH) +# define ARCHITECTURE_ID "SHx" + +# else /* unknown architecture */ +# define ARCHITECTURE_ID "" +# endif + +#elif defined(__WATCOMC__) +# if defined(_M_I86) +# define ARCHITECTURE_ID "I86" + +# elif defined(_M_IX86) +# define ARCHITECTURE_ID "X86" + +# else /* unknown architecture */ +# define ARCHITECTURE_ID "" +# endif + +#elif defined(__IAR_SYSTEMS_ICC__) || defined(__IAR_SYSTEMS_ICC) +# if defined(__ICCARM__) +# define ARCHITECTURE_ID "ARM" + +# elif defined(__ICCRX__) +# define ARCHITECTURE_ID "RX" + +# elif defined(__ICCRH850__) +# define ARCHITECTURE_ID "RH850" + +# elif defined(__ICCRL78__) +# define ARCHITECTURE_ID "RL78" + +# elif defined(__ICCRISCV__) +# define ARCHITECTURE_ID "RISCV" + +# elif defined(__ICCAVR__) +# define ARCHITECTURE_ID "AVR" + +# elif defined(__ICC430__) +# define ARCHITECTURE_ID "MSP430" + +# elif defined(__ICCV850__) +# define ARCHITECTURE_ID "V850" + +# elif defined(__ICC8051__) +# define ARCHITECTURE_ID "8051" + +# elif defined(__ICCSTM8__) +# define ARCHITECTURE_ID "STM8" + +# else /* unknown architecture */ +# define ARCHITECTURE_ID "" +# endif + +#elif defined(__ghs__) +# if defined(__PPC64__) +# define ARCHITECTURE_ID "PPC64" + +# elif defined(__ppc__) +# define ARCHITECTURE_ID "PPC" + +# elif defined(__ARM__) +# define ARCHITECTURE_ID "ARM" + +# elif defined(__x86_64__) +# define ARCHITECTURE_ID "x64" + +# elif defined(__i386__) +# define ARCHITECTURE_ID "X86" + +# else /* unknown architecture */ +# define ARCHITECTURE_ID "" +# endif + +#elif defined(__clang__) && defined(__ti__) +# if defined(__ARM_ARCH) +# define ARCHITECTURE_ID "Arm" + +# else /* unknown architecture */ +# define ARCHITECTURE_ID "" +# endif + +#elif defined(__TI_COMPILER_VERSION__) +# if defined(__TI_ARM__) +# define ARCHITECTURE_ID "ARM" + +# elif defined(__MSP430__) +# define ARCHITECTURE_ID "MSP430" + +# elif defined(__TMS320C28XX__) +# define ARCHITECTURE_ID "TMS320C28x" + +# elif defined(__TMS320C6X__) || defined(_TMS320C6X) +# define ARCHITECTURE_ID "TMS320C6x" + +# else /* unknown architecture */ +# define ARCHITECTURE_ID "" +# endif + +# elif defined(__ADSPSHARC__) +# define ARCHITECTURE_ID "SHARC" + +# elif defined(__ADSPBLACKFIN__) +# define ARCHITECTURE_ID "Blackfin" + +#elif defined(__TASKING__) + +# if defined(__CTC__) || defined(__CPTC__) +# define ARCHITECTURE_ID "TriCore" + +# elif defined(__CMCS__) +# define ARCHITECTURE_ID "MCS" + +# elif defined(__CARM__) +# define ARCHITECTURE_ID "ARM" + +# elif defined(__CARC__) +# define ARCHITECTURE_ID "ARC" + +# elif defined(__C51__) +# define ARCHITECTURE_ID "8051" + +# elif defined(__CPCP__) +# define ARCHITECTURE_ID "PCP" + +# else +# define ARCHITECTURE_ID "" +# endif + +#else +# define ARCHITECTURE_ID +#endif + +/* Convert integer to decimal digit literals. */ +#define DEC(n) \ + ('0' + (((n) / 10000000)%10)), \ + ('0' + (((n) / 1000000)%10)), \ + ('0' + (((n) / 100000)%10)), \ + ('0' + (((n) / 10000)%10)), \ + ('0' + (((n) / 1000)%10)), \ + ('0' + (((n) / 100)%10)), \ + ('0' + (((n) / 10)%10)), \ + ('0' + ((n) % 10)) + +/* Convert integer to hex digit literals. */ +#define HEX(n) \ + ('0' + ((n)>>28 & 0xF)), \ + ('0' + ((n)>>24 & 0xF)), \ + ('0' + ((n)>>20 & 0xF)), \ + ('0' + ((n)>>16 & 0xF)), \ + ('0' + ((n)>>12 & 0xF)), \ + ('0' + ((n)>>8 & 0xF)), \ + ('0' + ((n)>>4 & 0xF)), \ + ('0' + ((n) & 0xF)) + +/* Construct a string literal encoding the version number. */ +#ifdef COMPILER_VERSION +char const* info_version = "INFO" ":" "compiler_version[" COMPILER_VERSION "]"; + +/* Construct a string literal encoding the version number components. */ +#elif defined(COMPILER_VERSION_MAJOR) +char const info_version[] = { + 'I', 'N', 'F', 'O', ':', + 'c','o','m','p','i','l','e','r','_','v','e','r','s','i','o','n','[', + COMPILER_VERSION_MAJOR, +# ifdef COMPILER_VERSION_MINOR + '.', COMPILER_VERSION_MINOR, +# ifdef COMPILER_VERSION_PATCH + '.', COMPILER_VERSION_PATCH, +# ifdef COMPILER_VERSION_TWEAK + '.', COMPILER_VERSION_TWEAK, +# endif +# endif +# endif + ']','\0'}; +#endif + +/* Construct a string literal encoding the internal version number. */ +#ifdef COMPILER_VERSION_INTERNAL +char const info_version_internal[] = { + 'I', 'N', 'F', 'O', ':', + 'c','o','m','p','i','l','e','r','_','v','e','r','s','i','o','n','_', + 'i','n','t','e','r','n','a','l','[', + COMPILER_VERSION_INTERNAL,']','\0'}; +#elif defined(COMPILER_VERSION_INTERNAL_STR) +char const* info_version_internal = "INFO" ":" "compiler_version_internal[" COMPILER_VERSION_INTERNAL_STR "]"; +#endif + +/* Construct a string literal encoding the version number components. */ +#ifdef SIMULATE_VERSION_MAJOR +char const info_simulate_version[] = { + 'I', 'N', 'F', 'O', ':', + 's','i','m','u','l','a','t','e','_','v','e','r','s','i','o','n','[', + SIMULATE_VERSION_MAJOR, +# ifdef SIMULATE_VERSION_MINOR + '.', SIMULATE_VERSION_MINOR, +# ifdef SIMULATE_VERSION_PATCH + '.', SIMULATE_VERSION_PATCH, +# ifdef SIMULATE_VERSION_TWEAK + '.', SIMULATE_VERSION_TWEAK, +# endif +# endif +# endif + ']','\0'}; +#endif + +/* Construct the string literal in pieces to prevent the source from + getting matched. Store it in a pointer rather than an array + because some compilers will just produce instructions to fill the + array rather than assigning a pointer to a static array. */ +char const* info_platform = "INFO" ":" "platform[" PLATFORM_ID "]"; +char const* info_arch = "INFO" ":" "arch[" ARCHITECTURE_ID "]"; + + + +#define CXX_STD_98 199711L +#define CXX_STD_11 201103L +#define CXX_STD_14 201402L +#define CXX_STD_17 201703L +#define CXX_STD_20 202002L +#define CXX_STD_23 202302L + +#if defined(__INTEL_COMPILER) && defined(_MSVC_LANG) +# if _MSVC_LANG > CXX_STD_17 +# define CXX_STD _MSVC_LANG +# elif _MSVC_LANG == CXX_STD_17 && defined(__cpp_aggregate_paren_init) +# define CXX_STD CXX_STD_20 +# elif _MSVC_LANG > CXX_STD_14 && __cplusplus > CXX_STD_17 +# define CXX_STD CXX_STD_20 +# elif _MSVC_LANG > CXX_STD_14 +# define CXX_STD CXX_STD_17 +# elif defined(__INTEL_CXX11_MODE__) && defined(__cpp_aggregate_nsdmi) +# define CXX_STD CXX_STD_14 +# elif defined(__INTEL_CXX11_MODE__) +# define CXX_STD CXX_STD_11 +# else +# define CXX_STD CXX_STD_98 +# endif +#elif defined(_MSC_VER) && defined(_MSVC_LANG) +# if _MSVC_LANG > __cplusplus +# define CXX_STD _MSVC_LANG +# else +# define CXX_STD __cplusplus +# endif +#elif defined(__NVCOMPILER) +# if __cplusplus == CXX_STD_17 && defined(__cpp_aggregate_paren_init) +# define CXX_STD CXX_STD_20 +# else +# define CXX_STD __cplusplus +# endif +#elif defined(__INTEL_COMPILER) || defined(__PGI) +# if __cplusplus == CXX_STD_11 && defined(__cpp_namespace_attributes) +# define CXX_STD CXX_STD_17 +# elif __cplusplus == CXX_STD_11 && defined(__cpp_aggregate_nsdmi) +# define CXX_STD CXX_STD_14 +# else +# define CXX_STD __cplusplus +# endif +#elif (defined(__IBMCPP__) || defined(__ibmxl__)) && defined(__linux__) +# if __cplusplus == CXX_STD_11 && defined(__cpp_aggregate_nsdmi) +# define CXX_STD CXX_STD_14 +# else +# define CXX_STD __cplusplus +# endif +#elif __cplusplus == 1 && defined(__GXX_EXPERIMENTAL_CXX0X__) +# define CXX_STD CXX_STD_11 +#else +# define CXX_STD __cplusplus +#endif + +const char* info_language_standard_default = "INFO" ":" "standard_default[" +#if CXX_STD > CXX_STD_23 + "26" +#elif CXX_STD > CXX_STD_20 + "23" +#elif CXX_STD > CXX_STD_17 + "20" +#elif CXX_STD > CXX_STD_14 + "17" +#elif CXX_STD > CXX_STD_11 + "14" +#elif CXX_STD >= CXX_STD_11 + "11" +#else + "98" +#endif +"]"; + +const char* info_language_extensions_default = "INFO" ":" "extensions_default[" +#if (defined(__clang__) || defined(__GNUC__) || defined(__xlC__) || \ + defined(__TI_COMPILER_VERSION__)) && \ + !defined(__STRICT_ANSI__) + "ON" +#else + "OFF" +#endif +"]"; + +/*--------------------------------------------------------------------------*/ + +int main(int argc, char* argv[]) +{ + int require = 0; + require += info_compiler[argc]; + require += info_platform[argc]; + require += info_arch[argc]; +#ifdef COMPILER_VERSION_MAJOR + require += info_version[argc]; +#endif +#ifdef COMPILER_VERSION_INTERNAL + require += info_version_internal[argc]; +#endif +#ifdef SIMULATE_ID + require += info_simulate[argc]; +#endif +#ifdef SIMULATE_VERSION_MAJOR + require += info_simulate_version[argc]; +#endif +#if defined(__CRAYXT_COMPUTE_LINUX_TARGET) + require += info_cray[argc]; +#endif + require += info_language_standard_default[argc]; + require += info_language_extensions_default[argc]; + (void)argv; + return require; +} diff --git a/siro_driver/android/app/.cxx/Debug/2j1f5m6a/x86_64/CMakeFiles/3.31.5-g6cf5163/CompilerIdCXX/CMakeCXXCompilerId.o b/siro_driver/android/app/.cxx/Debug/2j1f5m6a/x86_64/CMakeFiles/3.31.5-g6cf5163/CompilerIdCXX/CMakeCXXCompilerId.o new file mode 100644 index 0000000..3cd2bbe Binary files /dev/null and b/siro_driver/android/app/.cxx/Debug/2j1f5m6a/x86_64/CMakeFiles/3.31.5-g6cf5163/CompilerIdCXX/CMakeCXXCompilerId.o differ diff --git a/siro_driver/android/app/.cxx/Debug/2j1f5m6a/x86_64/CMakeFiles/CMakeConfigureLog.yaml b/siro_driver/android/app/.cxx/Debug/2j1f5m6a/x86_64/CMakeFiles/CMakeConfigureLog.yaml new file mode 100644 index 0000000..e230e03 --- /dev/null +++ b/siro_driver/android/app/.cxx/Debug/2j1f5m6a/x86_64/CMakeFiles/CMakeConfigureLog.yaml @@ -0,0 +1,399 @@ + +--- +events: + - + kind: "message-v1" + backtrace: + - "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeDetermineSystem.cmake:200 (message)" + - "CMakeLists.txt:2 (project)" + message: | + The target system is: Android - 1 - x86_64 + The host system is: Darwin - 24.5.0 - arm64 + - + kind: "message-v1" + backtrace: + - "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeDetermineCompilerId.cmake:17 (message)" + - "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeDetermineCompilerId.cmake:64 (__determine_compiler_id_test)" + - "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeDetermineCCompiler.cmake:123 (CMAKE_DETERMINE_COMPILER_ID)" + - "CMakeLists.txt:2 (project)" + message: | + Compiling the C compiler identification source file "CMakeCCompilerId.c" succeeded. + Compiler: /Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/bin/clang + Build flags: -g;-DANDROID;-fdata-sections;-ffunction-sections;-funwind-tables;-fstack-protector-strong;-no-canonical-prefixes;-D_FORTIFY_SOURCE=2;-Wformat;-Werror=format-security + Id flags: -c;--target=x86_64-none-linux-android23 + + The output was: + 0 + + + Compilation of the C compiler identification source "CMakeCCompilerId.c" produced "CMakeCCompilerId.o" + + The C compiler identification is Clang, found in: + /Users/hamzaaleghwairyeen/development/App/intaleq_driver/android/app/.cxx/Debug/2j1f5m6a/x86_64/CMakeFiles/3.31.5-g6cf5163/CompilerIdC/CMakeCCompilerId.o + + - + kind: "message-v1" + backtrace: + - "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeDetermineCompilerId.cmake:17 (message)" + - "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeDetermineCompilerId.cmake:64 (__determine_compiler_id_test)" + - "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeDetermineCXXCompiler.cmake:126 (CMAKE_DETERMINE_COMPILER_ID)" + - "CMakeLists.txt:2 (project)" + message: | + Compiling the CXX compiler identification source file "CMakeCXXCompilerId.cpp" succeeded. + Compiler: /Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/bin/clang++ + Build flags: -g;-DANDROID;-fdata-sections;-ffunction-sections;-funwind-tables;-fstack-protector-strong;-no-canonical-prefixes;-D_FORTIFY_SOURCE=2;-Wformat;-Werror=format-security + Id flags: -c;--target=x86_64-none-linux-android23 + + The output was: + 0 + + + Compilation of the CXX compiler identification source "CMakeCXXCompilerId.cpp" produced "CMakeCXXCompilerId.o" + + The CXX compiler identification is Clang, found in: + /Users/hamzaaleghwairyeen/development/App/intaleq_driver/android/app/.cxx/Debug/2j1f5m6a/x86_64/CMakeFiles/3.31.5-g6cf5163/CompilerIdCXX/CMakeCXXCompilerId.o + + - + kind: "try_compile-v1" + backtrace: + - "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeDetermineCompilerABI.cmake:74 (try_compile)" + - "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeTestCCompiler.cmake:26 (CMAKE_DETERMINE_COMPILER_ABI)" + - "CMakeLists.txt:2 (project)" + checks: + - "Detecting C compiler ABI info" + directories: + source: "/Users/hamzaaleghwairyeen/development/App/intaleq_driver/android/app/.cxx/Debug/2j1f5m6a/x86_64/CMakeFiles/CMakeScratch/TryCompile-cpoM8o" + binary: "/Users/hamzaaleghwairyeen/development/App/intaleq_driver/android/app/.cxx/Debug/2j1f5m6a/x86_64/CMakeFiles/CMakeScratch/TryCompile-cpoM8o" + cmakeVariables: + ANDROID_ABI: "x86_64" + ANDROID_ARM_MODE: "thumb" + ANDROID_PIE: "TRUE" + ANDROID_PLATFORM: "android-23" + ANDROID_STL: "c++_static" + ANDROID_TOOLCHAIN: "clang" + CMAKE_CXX_COMPILER_CLANG_SCAN_DEPS: "/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/bin/clang-scan-deps" + CMAKE_CXX_COMPILER_TARGET: "x86_64-none-linux-android23" + CMAKE_C_COMPILER_TARGET: "x86_64-none-linux-android23" + CMAKE_C_FLAGS: "-g -DANDROID -fdata-sections -ffunction-sections -funwind-tables -fstack-protector-strong -no-canonical-prefixes -D_FORTIFY_SOURCE=2 -Wformat " + CMAKE_C_FLAGS_DEBUG: "-fno-limit-debug-info " + CMAKE_EXE_LINKER_FLAGS: "-static-libstdc++ -Wl,--build-id=sha1 -Wl,--no-rosegment -Wl,--no-undefined-version -Wl,--fatal-warnings -Wl,--no-undefined -Qunused-arguments " + CMAKE_POSITION_INDEPENDENT_CODE: "TRUE" + CMAKE_SYSROOT: "/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot" + buildResult: + variable: "CMAKE_C_ABI_COMPILED" + cached: true + stdout: | + Change Dir: '/Users/hamzaaleghwairyeen/development/App/intaleq_driver/android/app/.cxx/Debug/2j1f5m6a/x86_64/CMakeFiles/CMakeScratch/TryCompile-cpoM8o' + + Run Build Command(s): /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/bin/ninja -v cmTC_2ca30 + [1/2] /Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/bin/clang --target=x86_64-none-linux-android23 --sysroot=/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot -g -DANDROID -fdata-sections -ffunction-sections -funwind-tables -fstack-protector-strong -no-canonical-prefixes -D_FORTIFY_SOURCE=2 -Wformat -fPIE -v -MD -MT CMakeFiles/cmTC_2ca30.dir/CMakeCCompilerABI.c.o -MF CMakeFiles/cmTC_2ca30.dir/CMakeCCompilerABI.c.o.d -o CMakeFiles/cmTC_2ca30.dir/CMakeCCompilerABI.c.o -c /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeCCompilerABI.c + Android (12027248, +pgo, -bolt, +lto, -mlgo, based on r522817) clang version 18.0.1 (https://android.googlesource.com/toolchain/llvm-project d8003a456d14a3deb8054cdaa529ffbf02d9b262) + Target: x86_64-none-linux-android23 + Thread model: posix + InstalledDir: /Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/bin + (in-process) + "/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/bin/clang" -cc1 -triple x86_64-none-linux-android23 -emit-obj -mrelax-all -disable-free -clear-ast-before-backend -disable-llvm-verifier -discard-value-names -main-file-name CMakeCCompilerABI.c -mrelocation-model pic -pic-level 2 -pic-is-pie -mframe-pointer=all -ffp-contract=on -fno-rounding-math -mconstructor-aliases -funwind-tables=2 -target-cpu x86-64 -target-feature +sse4.2 -target-feature +popcnt -target-feature +cx16 -tune-cpu generic -debug-info-kind=constructor -dwarf-version=4 -debugger-tuning=gdb -fdebug-compilation-dir=/Users/hamzaaleghwairyeen/development/App/intaleq_driver/android/app/.cxx/Debug/2j1f5m6a/x86_64/CMakeFiles/CMakeScratch/TryCompile-cpoM8o -v -ffunction-sections -fdata-sections -fcoverage-compilation-dir=/Users/hamzaaleghwairyeen/development/App/intaleq_driver/android/app/.cxx/Debug/2j1f5m6a/x86_64/CMakeFiles/CMakeScratch/TryCompile-cpoM8o -resource-dir /Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/lib/clang/18 -dependency-file CMakeFiles/cmTC_2ca30.dir/CMakeCCompilerABI.c.o.d -MT CMakeFiles/cmTC_2ca30.dir/CMakeCCompilerABI.c.o -sys-header-deps -D ANDROID -D _FORTIFY_SOURCE=2 -isysroot /Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot -internal-isystem /Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/lib/clang/18/include -internal-isystem /Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/local/include -internal-externc-isystem /Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/include/x86_64-linux-android -internal-externc-isystem /Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/include -internal-externc-isystem /Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/include -Wformat -ferror-limit 19 -femulated-tls -stack-protector 2 -fgnuc-version=4.2.1 -D__GCC_HAVE_DWARF2_CFI_ASM=1 -o CMakeFiles/cmTC_2ca30.dir/CMakeCCompilerABI.c.o -x c /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeCCompilerABI.c + clang -cc1 version 18.0.1 based upon LLVM 18.0.1 default target x86_64-apple-darwin24.5.0 + ignoring nonexistent directory "/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/local/include" + ignoring nonexistent directory "/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/include" + #include "..." search starts here: + #include <...> search starts here: + /Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/lib/clang/18/include + /Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/include/x86_64-linux-android + /Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/include + End of search list. + [2/2] : && /Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/bin/clang --target=x86_64-none-linux-android23 --sysroot=/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot -g -DANDROID -fdata-sections -ffunction-sections -funwind-tables -fstack-protector-strong -no-canonical-prefixes -D_FORTIFY_SOURCE=2 -Wformat -static-libstdc++ -Wl,--build-id=sha1 -Wl,--no-rosegment -Wl,--no-undefined-version -Wl,--fatal-warnings -Wl,--no-undefined -Qunused-arguments -v CMakeFiles/cmTC_2ca30.dir/CMakeCCompilerABI.c.o -o cmTC_2ca30 && : + Android (12027248, +pgo, -bolt, +lto, -mlgo, based on r522817) clang version 18.0.1 (https://android.googlesource.com/toolchain/llvm-project d8003a456d14a3deb8054cdaa529ffbf02d9b262) + Target: x86_64-none-linux-android23 + Thread model: posix + InstalledDir: /Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/bin + "/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/bin/ld.lld" --sysroot=/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot -z now -z relro --hash-style=gnu --eh-frame-hdr -m elf_x86_64 -pie -dynamic-linker /system/bin/linker64 -o cmTC_2ca30 /Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/lib/x86_64-linux-android/23/crtbegin_dynamic.o -L/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/lib/clang/18/lib/linux/x86_64 -L/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/lib/x86_64-linux-android/23 -L/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/lib/x86_64-linux-android -L/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/lib --build-id=sha1 --no-rosegment --no-undefined-version --fatal-warnings --no-undefined CMakeFiles/cmTC_2ca30.dir/CMakeCCompilerABI.c.o /Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/lib/clang/18/lib/linux/libclang_rt.builtins-x86_64-android.a -l:libunwind.a -ldl -lc /Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/lib/clang/18/lib/linux/libclang_rt.builtins-x86_64-android.a -l:libunwind.a -ldl /Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/lib/x86_64-linux-android/23/crtend_android.o + + exitCode: 0 + - + kind: "message-v1" + backtrace: + - "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeDetermineCompilerABI.cmake:182 (message)" + - "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeTestCCompiler.cmake:26 (CMAKE_DETERMINE_COMPILER_ABI)" + - "CMakeLists.txt:2 (project)" + message: | + Parsed C implicit include dir info: rv=done + found start of include info + found start of implicit include info + add: [/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/lib/clang/18/include] + add: [/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/include/x86_64-linux-android] + add: [/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/include] + end of search list found + collapse include dir [/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/lib/clang/18/include] ==> [/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/lib/clang/18/include] + collapse include dir [/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/include/x86_64-linux-android] ==> [/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/include/x86_64-linux-android] + collapse include dir [/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/include] ==> [/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/include] + implicit include dirs: [/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/lib/clang/18/include;/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/include/x86_64-linux-android;/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/include] + + + - + kind: "message-v1" + backtrace: + - "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeDetermineCompilerABI.cmake:218 (message)" + - "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeTestCCompiler.cmake:26 (CMAKE_DETERMINE_COMPILER_ABI)" + - "CMakeLists.txt:2 (project)" + message: | + Parsed C implicit link information: + link line regex: [^( *|.*[/\\])(ld[0-9]*(\\.[a-z]+)?|CMAKE_LINK_STARTFILE-NOTFOUND|([^/\\]+-)?ld|collect2)[^/\\]*( |$)] + linker tool regex: [^[ ]*(->|")?[ ]*(([^"]*[/\\])?(ld[0-9]*(\\.[a-z]+)?))("|,| |$)] + ignore line: [Change Dir: '/Users/hamzaaleghwairyeen/development/App/intaleq_driver/android/app/.cxx/Debug/2j1f5m6a/x86_64/CMakeFiles/CMakeScratch/TryCompile-cpoM8o'] + ignore line: [] + ignore line: [Run Build Command(s): /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/bin/ninja -v cmTC_2ca30] + ignore line: [[1/2] /Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/bin/clang --target=x86_64-none-linux-android23 --sysroot=/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot -g -DANDROID -fdata-sections -ffunction-sections -funwind-tables -fstack-protector-strong -no-canonical-prefixes -D_FORTIFY_SOURCE=2 -Wformat -fPIE -v -MD -MT CMakeFiles/cmTC_2ca30.dir/CMakeCCompilerABI.c.o -MF CMakeFiles/cmTC_2ca30.dir/CMakeCCompilerABI.c.o.d -o CMakeFiles/cmTC_2ca30.dir/CMakeCCompilerABI.c.o -c /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeCCompilerABI.c] + ignore line: [Android (12027248 +pgo -bolt +lto -mlgo based on r522817) clang version 18.0.1 (https://android.googlesource.com/toolchain/llvm-project d8003a456d14a3deb8054cdaa529ffbf02d9b262)] + ignore line: [Target: x86_64-none-linux-android23] + ignore line: [Thread model: posix] + ignore line: [InstalledDir: /Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/bin] + ignore line: [ (in-process)] + ignore line: [ "/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/bin/clang" -cc1 -triple x86_64-none-linux-android23 -emit-obj -mrelax-all -disable-free -clear-ast-before-backend -disable-llvm-verifier -discard-value-names -main-file-name CMakeCCompilerABI.c -mrelocation-model pic -pic-level 2 -pic-is-pie -mframe-pointer=all -ffp-contract=on -fno-rounding-math -mconstructor-aliases -funwind-tables=2 -target-cpu x86-64 -target-feature +sse4.2 -target-feature +popcnt -target-feature +cx16 -tune-cpu generic -debug-info-kind=constructor -dwarf-version=4 -debugger-tuning=gdb -fdebug-compilation-dir=/Users/hamzaaleghwairyeen/development/App/intaleq_driver/android/app/.cxx/Debug/2j1f5m6a/x86_64/CMakeFiles/CMakeScratch/TryCompile-cpoM8o -v -ffunction-sections -fdata-sections -fcoverage-compilation-dir=/Users/hamzaaleghwairyeen/development/App/intaleq_driver/android/app/.cxx/Debug/2j1f5m6a/x86_64/CMakeFiles/CMakeScratch/TryCompile-cpoM8o -resource-dir /Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/lib/clang/18 -dependency-file CMakeFiles/cmTC_2ca30.dir/CMakeCCompilerABI.c.o.d -MT CMakeFiles/cmTC_2ca30.dir/CMakeCCompilerABI.c.o -sys-header-deps -D ANDROID -D _FORTIFY_SOURCE=2 -isysroot /Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot -internal-isystem /Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/lib/clang/18/include -internal-isystem /Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/local/include -internal-externc-isystem /Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/include/x86_64-linux-android -internal-externc-isystem /Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/include -internal-externc-isystem /Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/include -Wformat -ferror-limit 19 -femulated-tls -stack-protector 2 -fgnuc-version=4.2.1 -D__GCC_HAVE_DWARF2_CFI_ASM=1 -o CMakeFiles/cmTC_2ca30.dir/CMakeCCompilerABI.c.o -x c /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeCCompilerABI.c] + ignore line: [clang -cc1 version 18.0.1 based upon LLVM 18.0.1 default target x86_64-apple-darwin24.5.0] + ignore line: [ignoring nonexistent directory "/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/local/include"] + ignore line: [ignoring nonexistent directory "/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/include"] + ignore line: [#include "..." search starts here:] + ignore line: [#include <...> search starts here:] + ignore line: [ /Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/lib/clang/18/include] + ignore line: [ /Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/include/x86_64-linux-android] + ignore line: [ /Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/include] + ignore line: [End of search list.] + ignore line: [[2/2] : && /Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/bin/clang --target=x86_64-none-linux-android23 --sysroot=/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot -g -DANDROID -fdata-sections -ffunction-sections -funwind-tables -fstack-protector-strong -no-canonical-prefixes -D_FORTIFY_SOURCE=2 -Wformat -static-libstdc++ -Wl --build-id=sha1 -Wl --no-rosegment -Wl --no-undefined-version -Wl --fatal-warnings -Wl --no-undefined -Qunused-arguments -v CMakeFiles/cmTC_2ca30.dir/CMakeCCompilerABI.c.o -o cmTC_2ca30 && :] + ignore line: [Android (12027248 +pgo -bolt +lto -mlgo based on r522817) clang version 18.0.1 (https://android.googlesource.com/toolchain/llvm-project d8003a456d14a3deb8054cdaa529ffbf02d9b262)] + ignore line: [Target: x86_64-none-linux-android23] + ignore line: [Thread model: posix] + ignore line: [InstalledDir: /Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/bin] + link line: [ "/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/bin/ld.lld" --sysroot=/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot -z now -z relro --hash-style=gnu --eh-frame-hdr -m elf_x86_64 -pie -dynamic-linker /system/bin/linker64 -o cmTC_2ca30 /Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/lib/x86_64-linux-android/23/crtbegin_dynamic.o -L/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/lib/clang/18/lib/linux/x86_64 -L/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/lib/x86_64-linux-android/23 -L/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/lib/x86_64-linux-android -L/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/lib --build-id=sha1 --no-rosegment --no-undefined-version --fatal-warnings --no-undefined CMakeFiles/cmTC_2ca30.dir/CMakeCCompilerABI.c.o /Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/lib/clang/18/lib/linux/libclang_rt.builtins-x86_64-android.a -l:libunwind.a -ldl -lc /Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/lib/clang/18/lib/linux/libclang_rt.builtins-x86_64-android.a -l:libunwind.a -ldl /Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/lib/x86_64-linux-android/23/crtend_android.o] + arg [/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/bin/ld.lld] ==> ignore + arg [--sysroot=/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot] ==> ignore + arg [-znow] ==> ignore + arg [-zrelro] ==> ignore + arg [--hash-style=gnu] ==> ignore + arg [--eh-frame-hdr] ==> ignore + arg [-m] ==> ignore + arg [elf_x86_64] ==> ignore + arg [-pie] ==> ignore + arg [-dynamic-linker] ==> ignore + arg [/system/bin/linker64] ==> ignore + arg [-o] ==> ignore + arg [cmTC_2ca30] ==> ignore + arg [/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/lib/x86_64-linux-android/23/crtbegin_dynamic.o] ==> obj [/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/lib/x86_64-linux-android/23/crtbegin_dynamic.o] + arg [-L/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/lib/clang/18/lib/linux/x86_64] ==> dir [/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/lib/clang/18/lib/linux/x86_64] + arg [-L/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/lib/x86_64-linux-android/23] ==> dir [/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/lib/x86_64-linux-android/23] + arg [-L/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/lib/x86_64-linux-android] ==> dir [/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/lib/x86_64-linux-android] + arg [-L/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/lib] ==> dir [/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/lib] + arg [--build-id=sha1] ==> ignore + arg [--no-rosegment] ==> ignore + arg [--no-undefined-version] ==> ignore + arg [--fatal-warnings] ==> ignore + arg [--no-undefined] ==> ignore + arg [CMakeFiles/cmTC_2ca30.dir/CMakeCCompilerABI.c.o] ==> ignore + arg [/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/lib/clang/18/lib/linux/libclang_rt.builtins-x86_64-android.a] ==> lib [/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/lib/clang/18/lib/linux/libclang_rt.builtins-x86_64-android.a] + arg [-l:libunwind.a] ==> lib [-l:libunwind.a] + arg [-ldl] ==> lib [dl] + arg [-lc] ==> lib [c] + arg [/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/lib/clang/18/lib/linux/libclang_rt.builtins-x86_64-android.a] ==> lib [/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/lib/clang/18/lib/linux/libclang_rt.builtins-x86_64-android.a] + arg [-l:libunwind.a] ==> lib [-l:libunwind.a] + arg [-ldl] ==> lib [dl] + arg [/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/lib/x86_64-linux-android/23/crtend_android.o] ==> obj [/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/lib/x86_64-linux-android/23/crtend_android.o] + linker tool for 'C': /Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/bin/ld.lld + remove lib [/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/lib/clang/18/lib/linux/libclang_rt.builtins-x86_64-android.a] + remove lib [/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/lib/clang/18/lib/linux/libclang_rt.builtins-x86_64-android.a] + collapse library dir [/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/lib/clang/18/lib/linux/x86_64] ==> [/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/lib/clang/18/lib/linux/x86_64] + collapse library dir [/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/lib/x86_64-linux-android/23] ==> [/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/lib/x86_64-linux-android/23] + collapse library dir [/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/lib/x86_64-linux-android] ==> [/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/lib/x86_64-linux-android] + collapse library dir [/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/lib] ==> [/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/lib] + implicit libs: [-l:libunwind.a;dl;c;-l:libunwind.a;dl] + implicit objs: [/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/lib/x86_64-linux-android/23/crtbegin_dynamic.o;/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/lib/x86_64-linux-android/23/crtend_android.o] + implicit dirs: [/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/lib/clang/18/lib/linux/x86_64;/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/lib/x86_64-linux-android/23;/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/lib/x86_64-linux-android;/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/lib] + implicit fwks: [] + + + - + kind: "message-v1" + backtrace: + - "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Internal/CMakeDetermineLinkerId.cmake:40 (message)" + - "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeDetermineCompilerABI.cmake:255 (cmake_determine_linker_id)" + - "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeTestCCompiler.cmake:26 (CMAKE_DETERMINE_COMPILER_ABI)" + - "CMakeLists.txt:2 (project)" + message: | + Running the C compiler's linker: "/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/bin/ld.lld" "-v" + LLD 18.0.1 (compatible with GNU linkers) + - + kind: "try_compile-v1" + backtrace: + - "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeDetermineCompilerABI.cmake:74 (try_compile)" + - "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeTestCXXCompiler.cmake:26 (CMAKE_DETERMINE_COMPILER_ABI)" + - "CMakeLists.txt:2 (project)" + checks: + - "Detecting CXX compiler ABI info" + directories: + source: "/Users/hamzaaleghwairyeen/development/App/intaleq_driver/android/app/.cxx/Debug/2j1f5m6a/x86_64/CMakeFiles/CMakeScratch/TryCompile-lWzOMw" + binary: "/Users/hamzaaleghwairyeen/development/App/intaleq_driver/android/app/.cxx/Debug/2j1f5m6a/x86_64/CMakeFiles/CMakeScratch/TryCompile-lWzOMw" + cmakeVariables: + ANDROID_ABI: "x86_64" + ANDROID_ARM_MODE: "thumb" + ANDROID_PIE: "TRUE" + ANDROID_PLATFORM: "android-23" + ANDROID_STL: "c++_static" + ANDROID_TOOLCHAIN: "clang" + CMAKE_CXX_COMPILER_CLANG_SCAN_DEPS: "/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/bin/clang-scan-deps" + CMAKE_CXX_COMPILER_TARGET: "x86_64-none-linux-android23" + CMAKE_CXX_FLAGS: "-g -DANDROID -fdata-sections -ffunction-sections -funwind-tables -fstack-protector-strong -no-canonical-prefixes -D_FORTIFY_SOURCE=2 -Wformat " + CMAKE_CXX_FLAGS_DEBUG: "-fno-limit-debug-info " + CMAKE_CXX_SCAN_FOR_MODULES: "OFF" + CMAKE_C_COMPILER_TARGET: "x86_64-none-linux-android23" + CMAKE_EXE_LINKER_FLAGS: "-static-libstdc++ -Wl,--build-id=sha1 -Wl,--no-rosegment -Wl,--no-undefined-version -Wl,--fatal-warnings -Wl,--no-undefined -Qunused-arguments " + CMAKE_POSITION_INDEPENDENT_CODE: "TRUE" + CMAKE_SYSROOT: "/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot" + buildResult: + variable: "CMAKE_CXX_ABI_COMPILED" + cached: true + stdout: | + Change Dir: '/Users/hamzaaleghwairyeen/development/App/intaleq_driver/android/app/.cxx/Debug/2j1f5m6a/x86_64/CMakeFiles/CMakeScratch/TryCompile-lWzOMw' + + Run Build Command(s): /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/bin/ninja -v cmTC_0003a + [1/2] /Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/bin/clang++ --target=x86_64-none-linux-android23 --sysroot=/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot -g -DANDROID -fdata-sections -ffunction-sections -funwind-tables -fstack-protector-strong -no-canonical-prefixes -D_FORTIFY_SOURCE=2 -Wformat -fPIE -v -MD -MT CMakeFiles/cmTC_0003a.dir/CMakeCXXCompilerABI.cpp.o -MF CMakeFiles/cmTC_0003a.dir/CMakeCXXCompilerABI.cpp.o.d -o CMakeFiles/cmTC_0003a.dir/CMakeCXXCompilerABI.cpp.o -c /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeCXXCompilerABI.cpp + Android (12027248, +pgo, -bolt, +lto, -mlgo, based on r522817) clang version 18.0.1 (https://android.googlesource.com/toolchain/llvm-project d8003a456d14a3deb8054cdaa529ffbf02d9b262) + Target: x86_64-none-linux-android23 + Thread model: posix + InstalledDir: /Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/bin + (in-process) + "/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/bin/clang++" -cc1 -triple x86_64-none-linux-android23 -emit-obj -mrelax-all -disable-free -clear-ast-before-backend -disable-llvm-verifier -discard-value-names -main-file-name CMakeCXXCompilerABI.cpp -mrelocation-model pic -pic-level 2 -pic-is-pie -mframe-pointer=all -ffp-contract=on -fno-rounding-math -mconstructor-aliases -funwind-tables=2 -target-cpu x86-64 -target-feature +sse4.2 -target-feature +popcnt -target-feature +cx16 -tune-cpu generic -debug-info-kind=constructor -dwarf-version=4 -debugger-tuning=gdb -fdebug-compilation-dir=/Users/hamzaaleghwairyeen/development/App/intaleq_driver/android/app/.cxx/Debug/2j1f5m6a/x86_64/CMakeFiles/CMakeScratch/TryCompile-lWzOMw -v -ffunction-sections -fdata-sections -fcoverage-compilation-dir=/Users/hamzaaleghwairyeen/development/App/intaleq_driver/android/app/.cxx/Debug/2j1f5m6a/x86_64/CMakeFiles/CMakeScratch/TryCompile-lWzOMw -resource-dir /Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/lib/clang/18 -dependency-file CMakeFiles/cmTC_0003a.dir/CMakeCXXCompilerABI.cpp.o.d -MT CMakeFiles/cmTC_0003a.dir/CMakeCXXCompilerABI.cpp.o -sys-header-deps -D ANDROID -D _FORTIFY_SOURCE=2 -isysroot /Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot -internal-isystem /Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/include/c++/v1 -internal-isystem /Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/lib/clang/18/include -internal-isystem /Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/local/include -internal-externc-isystem /Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/include/x86_64-linux-android -internal-externc-isystem /Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/include -internal-externc-isystem /Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/include -Wformat -fdeprecated-macro -ferror-limit 19 -femulated-tls -stack-protector 2 -fgnuc-version=4.2.1 -fcxx-exceptions -fexceptions -D__GCC_HAVE_DWARF2_CFI_ASM=1 -o CMakeFiles/cmTC_0003a.dir/CMakeCXXCompilerABI.cpp.o -x c++ /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeCXXCompilerABI.cpp + clang -cc1 version 18.0.1 based upon LLVM 18.0.1 default target x86_64-apple-darwin24.5.0 + ignoring nonexistent directory "/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/local/include" + ignoring nonexistent directory "/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/include" + #include "..." search starts here: + #include <...> search starts here: + /Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/include/c++/v1 + /Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/lib/clang/18/include + /Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/include/x86_64-linux-android + /Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/include + End of search list. + [2/2] : && /Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/bin/clang++ --target=x86_64-none-linux-android23 --sysroot=/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot -g -DANDROID -fdata-sections -ffunction-sections -funwind-tables -fstack-protector-strong -no-canonical-prefixes -D_FORTIFY_SOURCE=2 -Wformat -static-libstdc++ -Wl,--build-id=sha1 -Wl,--no-rosegment -Wl,--no-undefined-version -Wl,--fatal-warnings -Wl,--no-undefined -Qunused-arguments -v CMakeFiles/cmTC_0003a.dir/CMakeCXXCompilerABI.cpp.o -o cmTC_0003a && : + Android (12027248, +pgo, -bolt, +lto, -mlgo, based on r522817) clang version 18.0.1 (https://android.googlesource.com/toolchain/llvm-project d8003a456d14a3deb8054cdaa529ffbf02d9b262) + Target: x86_64-none-linux-android23 + Thread model: posix + InstalledDir: /Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/bin + "/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/bin/ld.lld" --sysroot=/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot -z now -z relro --hash-style=gnu --eh-frame-hdr -m elf_x86_64 -pie -dynamic-linker /system/bin/linker64 -o cmTC_0003a /Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/lib/x86_64-linux-android/23/crtbegin_dynamic.o -L/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/lib/clang/18/lib/linux/x86_64 -L/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/lib/x86_64-linux-android/23 -L/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/lib/x86_64-linux-android -L/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/lib --build-id=sha1 --no-rosegment --no-undefined-version --fatal-warnings --no-undefined CMakeFiles/cmTC_0003a.dir/CMakeCXXCompilerABI.cpp.o -Bstatic -lc++ -Bdynamic -lm /Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/lib/clang/18/lib/linux/libclang_rt.builtins-x86_64-android.a -l:libunwind.a -ldl -lc /Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/lib/clang/18/lib/linux/libclang_rt.builtins-x86_64-android.a -l:libunwind.a -ldl /Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/lib/x86_64-linux-android/23/crtend_android.o + + exitCode: 0 + - + kind: "message-v1" + backtrace: + - "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeDetermineCompilerABI.cmake:182 (message)" + - "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeTestCXXCompiler.cmake:26 (CMAKE_DETERMINE_COMPILER_ABI)" + - "CMakeLists.txt:2 (project)" + message: | + Parsed CXX implicit include dir info: rv=done + found start of include info + found start of implicit include info + add: [/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/include/c++/v1] + add: [/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/lib/clang/18/include] + add: [/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/include/x86_64-linux-android] + add: [/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/include] + end of search list found + collapse include dir [/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/include/c++/v1] ==> [/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/include/c++/v1] + collapse include dir [/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/lib/clang/18/include] ==> [/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/lib/clang/18/include] + collapse include dir [/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/include/x86_64-linux-android] ==> [/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/include/x86_64-linux-android] + collapse include dir [/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/include] ==> [/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/include] + implicit include dirs: [/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/include/c++/v1;/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/lib/clang/18/include;/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/include/x86_64-linux-android;/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/include] + + + - + kind: "message-v1" + backtrace: + - "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeDetermineCompilerABI.cmake:218 (message)" + - "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeTestCXXCompiler.cmake:26 (CMAKE_DETERMINE_COMPILER_ABI)" + - "CMakeLists.txt:2 (project)" + message: | + Parsed CXX implicit link information: + link line regex: [^( *|.*[/\\])(ld[0-9]*(\\.[a-z]+)?|CMAKE_LINK_STARTFILE-NOTFOUND|([^/\\]+-)?ld|collect2)[^/\\]*( |$)] + linker tool regex: [^[ ]*(->|")?[ ]*(([^"]*[/\\])?(ld[0-9]*(\\.[a-z]+)?))("|,| |$)] + ignore line: [Change Dir: '/Users/hamzaaleghwairyeen/development/App/intaleq_driver/android/app/.cxx/Debug/2j1f5m6a/x86_64/CMakeFiles/CMakeScratch/TryCompile-lWzOMw'] + ignore line: [] + ignore line: [Run Build Command(s): /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/bin/ninja -v cmTC_0003a] + ignore line: [[1/2] /Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/bin/clang++ --target=x86_64-none-linux-android23 --sysroot=/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot -g -DANDROID -fdata-sections -ffunction-sections -funwind-tables -fstack-protector-strong -no-canonical-prefixes -D_FORTIFY_SOURCE=2 -Wformat -fPIE -v -MD -MT CMakeFiles/cmTC_0003a.dir/CMakeCXXCompilerABI.cpp.o -MF CMakeFiles/cmTC_0003a.dir/CMakeCXXCompilerABI.cpp.o.d -o CMakeFiles/cmTC_0003a.dir/CMakeCXXCompilerABI.cpp.o -c /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeCXXCompilerABI.cpp] + ignore line: [Android (12027248 +pgo -bolt +lto -mlgo based on r522817) clang version 18.0.1 (https://android.googlesource.com/toolchain/llvm-project d8003a456d14a3deb8054cdaa529ffbf02d9b262)] + ignore line: [Target: x86_64-none-linux-android23] + ignore line: [Thread model: posix] + ignore line: [InstalledDir: /Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/bin] + ignore line: [ (in-process)] + ignore line: [ "/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/bin/clang++" -cc1 -triple x86_64-none-linux-android23 -emit-obj -mrelax-all -disable-free -clear-ast-before-backend -disable-llvm-verifier -discard-value-names -main-file-name CMakeCXXCompilerABI.cpp -mrelocation-model pic -pic-level 2 -pic-is-pie -mframe-pointer=all -ffp-contract=on -fno-rounding-math -mconstructor-aliases -funwind-tables=2 -target-cpu x86-64 -target-feature +sse4.2 -target-feature +popcnt -target-feature +cx16 -tune-cpu generic -debug-info-kind=constructor -dwarf-version=4 -debugger-tuning=gdb -fdebug-compilation-dir=/Users/hamzaaleghwairyeen/development/App/intaleq_driver/android/app/.cxx/Debug/2j1f5m6a/x86_64/CMakeFiles/CMakeScratch/TryCompile-lWzOMw -v -ffunction-sections -fdata-sections -fcoverage-compilation-dir=/Users/hamzaaleghwairyeen/development/App/intaleq_driver/android/app/.cxx/Debug/2j1f5m6a/x86_64/CMakeFiles/CMakeScratch/TryCompile-lWzOMw -resource-dir /Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/lib/clang/18 -dependency-file CMakeFiles/cmTC_0003a.dir/CMakeCXXCompilerABI.cpp.o.d -MT CMakeFiles/cmTC_0003a.dir/CMakeCXXCompilerABI.cpp.o -sys-header-deps -D ANDROID -D _FORTIFY_SOURCE=2 -isysroot /Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot -internal-isystem /Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/include/c++/v1 -internal-isystem /Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/lib/clang/18/include -internal-isystem /Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/local/include -internal-externc-isystem /Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/include/x86_64-linux-android -internal-externc-isystem /Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/include -internal-externc-isystem /Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/include -Wformat -fdeprecated-macro -ferror-limit 19 -femulated-tls -stack-protector 2 -fgnuc-version=4.2.1 -fcxx-exceptions -fexceptions -D__GCC_HAVE_DWARF2_CFI_ASM=1 -o CMakeFiles/cmTC_0003a.dir/CMakeCXXCompilerABI.cpp.o -x c++ /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeCXXCompilerABI.cpp] + ignore line: [clang -cc1 version 18.0.1 based upon LLVM 18.0.1 default target x86_64-apple-darwin24.5.0] + ignore line: [ignoring nonexistent directory "/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/local/include"] + ignore line: [ignoring nonexistent directory "/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/include"] + ignore line: [#include "..." search starts here:] + ignore line: [#include <...> search starts here:] + ignore line: [ /Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/include/c++/v1] + ignore line: [ /Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/lib/clang/18/include] + ignore line: [ /Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/include/x86_64-linux-android] + ignore line: [ /Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/include] + ignore line: [End of search list.] + ignore line: [[2/2] : && /Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/bin/clang++ --target=x86_64-none-linux-android23 --sysroot=/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot -g -DANDROID -fdata-sections -ffunction-sections -funwind-tables -fstack-protector-strong -no-canonical-prefixes -D_FORTIFY_SOURCE=2 -Wformat -static-libstdc++ -Wl --build-id=sha1 -Wl --no-rosegment -Wl --no-undefined-version -Wl --fatal-warnings -Wl --no-undefined -Qunused-arguments -v CMakeFiles/cmTC_0003a.dir/CMakeCXXCompilerABI.cpp.o -o cmTC_0003a && :] + ignore line: [Android (12027248 +pgo -bolt +lto -mlgo based on r522817) clang version 18.0.1 (https://android.googlesource.com/toolchain/llvm-project d8003a456d14a3deb8054cdaa529ffbf02d9b262)] + ignore line: [Target: x86_64-none-linux-android23] + ignore line: [Thread model: posix] + ignore line: [InstalledDir: /Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/bin] + link line: [ "/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/bin/ld.lld" --sysroot=/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot -z now -z relro --hash-style=gnu --eh-frame-hdr -m elf_x86_64 -pie -dynamic-linker /system/bin/linker64 -o cmTC_0003a /Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/lib/x86_64-linux-android/23/crtbegin_dynamic.o -L/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/lib/clang/18/lib/linux/x86_64 -L/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/lib/x86_64-linux-android/23 -L/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/lib/x86_64-linux-android -L/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/lib --build-id=sha1 --no-rosegment --no-undefined-version --fatal-warnings --no-undefined CMakeFiles/cmTC_0003a.dir/CMakeCXXCompilerABI.cpp.o -Bstatic -lc++ -Bdynamic -lm /Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/lib/clang/18/lib/linux/libclang_rt.builtins-x86_64-android.a -l:libunwind.a -ldl -lc /Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/lib/clang/18/lib/linux/libclang_rt.builtins-x86_64-android.a -l:libunwind.a -ldl /Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/lib/x86_64-linux-android/23/crtend_android.o] + arg [/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/bin/ld.lld] ==> ignore + arg [--sysroot=/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot] ==> ignore + arg [-znow] ==> ignore + arg [-zrelro] ==> ignore + arg [--hash-style=gnu] ==> ignore + arg [--eh-frame-hdr] ==> ignore + arg [-m] ==> ignore + arg [elf_x86_64] ==> ignore + arg [-pie] ==> ignore + arg [-dynamic-linker] ==> ignore + arg [/system/bin/linker64] ==> ignore + arg [-o] ==> ignore + arg [cmTC_0003a] ==> ignore + arg [/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/lib/x86_64-linux-android/23/crtbegin_dynamic.o] ==> obj [/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/lib/x86_64-linux-android/23/crtbegin_dynamic.o] + arg [-L/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/lib/clang/18/lib/linux/x86_64] ==> dir [/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/lib/clang/18/lib/linux/x86_64] + arg [-L/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/lib/x86_64-linux-android/23] ==> dir [/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/lib/x86_64-linux-android/23] + arg [-L/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/lib/x86_64-linux-android] ==> dir [/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/lib/x86_64-linux-android] + arg [-L/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/lib] ==> dir [/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/lib] + arg [--build-id=sha1] ==> ignore + arg [--no-rosegment] ==> ignore + arg [--no-undefined-version] ==> ignore + arg [--fatal-warnings] ==> ignore + arg [--no-undefined] ==> ignore + arg [CMakeFiles/cmTC_0003a.dir/CMakeCXXCompilerABI.cpp.o] ==> ignore + arg [-Bstatic] ==> search static + arg [-lc++] ==> lib [c++] + arg [-Bdynamic] ==> search dynamic + arg [-lm] ==> lib [m] + arg [/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/lib/clang/18/lib/linux/libclang_rt.builtins-x86_64-android.a] ==> lib [/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/lib/clang/18/lib/linux/libclang_rt.builtins-x86_64-android.a] + arg [-l:libunwind.a] ==> lib [-l:libunwind.a] + arg [-ldl] ==> lib [dl] + arg [-lc] ==> lib [c] + arg [/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/lib/clang/18/lib/linux/libclang_rt.builtins-x86_64-android.a] ==> lib [/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/lib/clang/18/lib/linux/libclang_rt.builtins-x86_64-android.a] + arg [-l:libunwind.a] ==> lib [-l:libunwind.a] + arg [-ldl] ==> lib [dl] + arg [/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/lib/x86_64-linux-android/23/crtend_android.o] ==> obj [/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/lib/x86_64-linux-android/23/crtend_android.o] + linker tool for 'CXX': /Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/bin/ld.lld + remove lib [/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/lib/clang/18/lib/linux/libclang_rt.builtins-x86_64-android.a] + remove lib [/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/lib/clang/18/lib/linux/libclang_rt.builtins-x86_64-android.a] + collapse library dir [/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/lib/clang/18/lib/linux/x86_64] ==> [/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/lib/clang/18/lib/linux/x86_64] + collapse library dir [/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/lib/x86_64-linux-android/23] ==> [/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/lib/x86_64-linux-android/23] + collapse library dir [/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/lib/x86_64-linux-android] ==> [/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/lib/x86_64-linux-android] + collapse library dir [/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/lib] ==> [/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/lib] + implicit libs: [c++;m;-l:libunwind.a;dl;c;-l:libunwind.a;dl] + implicit objs: [/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/lib/x86_64-linux-android/23/crtbegin_dynamic.o;/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/lib/x86_64-linux-android/23/crtend_android.o] + implicit dirs: [/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/lib/clang/18/lib/linux/x86_64;/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/lib/x86_64-linux-android/23;/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/lib/x86_64-linux-android;/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/lib] + implicit fwks: [] + + + - + kind: "message-v1" + backtrace: + - "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Internal/CMakeDetermineLinkerId.cmake:40 (message)" + - "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeDetermineCompilerABI.cmake:255 (cmake_determine_linker_id)" + - "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeTestCXXCompiler.cmake:26 (CMAKE_DETERMINE_COMPILER_ABI)" + - "CMakeLists.txt:2 (project)" + message: | + Running the CXX compiler's linker: "/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/bin/ld.lld" "-v" + LLD 18.0.1 (compatible with GNU linkers) +... diff --git a/siro_driver/android/app/.cxx/Debug/2j1f5m6a/x86_64/CMakeFiles/TargetDirectories.txt b/siro_driver/android/app/.cxx/Debug/2j1f5m6a/x86_64/CMakeFiles/TargetDirectories.txt new file mode 100644 index 0000000..d90cabb --- /dev/null +++ b/siro_driver/android/app/.cxx/Debug/2j1f5m6a/x86_64/CMakeFiles/TargetDirectories.txt @@ -0,0 +1,3 @@ +/Users/hamzaaleghwairyeen/development/App/intaleq_driver/android/app/.cxx/Debug/2j1f5m6a/x86_64/CMakeFiles/native-lib.dir +/Users/hamzaaleghwairyeen/development/App/intaleq_driver/android/app/.cxx/Debug/2j1f5m6a/x86_64/CMakeFiles/edit_cache.dir +/Users/hamzaaleghwairyeen/development/App/intaleq_driver/android/app/.cxx/Debug/2j1f5m6a/x86_64/CMakeFiles/rebuild_cache.dir diff --git a/siro_driver/android/app/.cxx/Debug/2j1f5m6a/x86_64/CMakeFiles/cmake.check_cache b/siro_driver/android/app/.cxx/Debug/2j1f5m6a/x86_64/CMakeFiles/cmake.check_cache new file mode 100644 index 0000000..3dccd73 --- /dev/null +++ b/siro_driver/android/app/.cxx/Debug/2j1f5m6a/x86_64/CMakeFiles/cmake.check_cache @@ -0,0 +1 @@ +# This file is generated by cmake for dependency checking of the CMakeCache.txt file diff --git a/siro_driver/android/app/.cxx/Debug/2j1f5m6a/x86_64/CMakeFiles/native-lib.dir/native-lib.cpp.o b/siro_driver/android/app/.cxx/Debug/2j1f5m6a/x86_64/CMakeFiles/native-lib.dir/native-lib.cpp.o new file mode 100644 index 0000000..35d470c Binary files /dev/null and b/siro_driver/android/app/.cxx/Debug/2j1f5m6a/x86_64/CMakeFiles/native-lib.dir/native-lib.cpp.o differ diff --git a/siro_driver/android/app/.cxx/Debug/2j1f5m6a/x86_64/CMakeFiles/rules.ninja b/siro_driver/android/app/.cxx/Debug/2j1f5m6a/x86_64/CMakeFiles/rules.ninja new file mode 100644 index 0000000..8172c05 --- /dev/null +++ b/siro_driver/android/app/.cxx/Debug/2j1f5m6a/x86_64/CMakeFiles/rules.ninja @@ -0,0 +1,66 @@ +# CMAKE generated file: DO NOT EDIT! +# Generated by "Ninja" Generator, CMake Version 3.31 + +# This file contains all the rules used to get the outputs files +# built from the input files. +# It is included in the main 'build.ninja'. + +# ============================================================================= +# Project: intaleq_driver +# Configurations: Debug +# ============================================================================= +# ============================================================================= + +############################################# +# Rule for compiling CXX files. + +rule CXX_COMPILER__native-lib_unscanned_Debug + depfile = $DEP_FILE + deps = gcc + command = ${LAUNCHER}${CODE_CHECK}/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/bin/clang++ --target=x86_64-none-linux-android23 --sysroot=/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot $DEFINES $INCLUDES $FLAGS -MD -MT $out -MF $DEP_FILE -o $out -c $in + description = Building CXX object $out + + +############################################# +# Rule for linking CXX shared library. + +rule CXX_SHARED_LIBRARY_LINKER__native-lib_Debug + depfile = $DEP_FILE + deps = gcc + command = $PRE_LINK && /Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/bin/clang++ --target=x86_64-none-linux-android23 --sysroot=/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot -fPIC $LANGUAGE_COMPILE_FLAGS $ARCH_FLAGS $LINK_FLAGS -shared $SONAME_FLAG$SONAME -o $TARGET_FILE $in $LINK_PATH $LINK_LIBRARIES && $POST_BUILD + description = Linking CXX shared library $TARGET_FILE + restat = $RESTAT + + +############################################# +# Rule for running custom commands. + +rule CUSTOM_COMMAND + command = $COMMAND + description = $DESC + + +############################################# +# Rule for re-running cmake. + +rule RERUN_CMAKE + command = /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/bin/cmake --regenerate-during-build -S/Users/hamzaaleghwairyeen/development/App/intaleq_driver/android/app/src/main/cpp -B/Users/hamzaaleghwairyeen/development/App/intaleq_driver/android/app/.cxx/Debug/2j1f5m6a/x86_64 + description = Re-running CMake... + generator = 1 + + +############################################# +# Rule for cleaning all built files. + +rule CLEAN + command = /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/bin/ninja $FILE_ARG -t clean $TARGETS + description = Cleaning all built files... + + +############################################# +# Rule for printing all primary targets available. + +rule HELP + command = /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/bin/ninja -t targets + description = All primary targets available: + diff --git a/siro_driver/android/app/.cxx/Debug/2j1f5m6a/x86_64/additional_project_files.txt b/siro_driver/android/app/.cxx/Debug/2j1f5m6a/x86_64/additional_project_files.txt new file mode 100644 index 0000000..e69de29 diff --git a/siro_driver/android/app/.cxx/Debug/2j1f5m6a/x86_64/android_gradle_build.json b/siro_driver/android/app/.cxx/Debug/2j1f5m6a/x86_64/android_gradle_build.json new file mode 100644 index 0000000..6a0def2 --- /dev/null +++ b/siro_driver/android/app/.cxx/Debug/2j1f5m6a/x86_64/android_gradle_build.json @@ -0,0 +1,38 @@ +{ + "buildFiles": [ + "/Users/hamzaaleghwairyeen/development/App/intaleq_driver/android/app/src/main/cpp/CMakeLists.txt" + ], + "cleanCommandsComponents": [ + [ + "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/bin/ninja", + "-C", + "/Users/hamzaaleghwairyeen/development/App/intaleq_driver/android/app/.cxx/Debug/2j1f5m6a/x86_64", + "clean" + ] + ], + "buildTargetsCommandComponents": [ + "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/bin/ninja", + "-C", + "/Users/hamzaaleghwairyeen/development/App/intaleq_driver/android/app/.cxx/Debug/2j1f5m6a/x86_64", + "{LIST_OF_TARGETS_TO_BUILD}" + ], + "libraries": { + "native-lib::@6890427a1f51a3e7e1df": { + "toolchain": "toolchain", + "abi": "x86_64", + "artifactName": "native-lib", + "output": "/Users/hamzaaleghwairyeen/development/App/intaleq_driver/build/app/intermediates/cxx/Debug/2j1f5m6a/obj/x86_64/libnative-lib.so", + "runtimeFiles": [] + } + }, + "toolchains": { + "toolchain": { + "cCompilerExecutable": "/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/bin/clang.lld", + "cppCompilerExecutable": "/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/bin/clang++.lld" + } + }, + "cFileExtensions": [], + "cppFileExtensions": [ + "cpp" + ] +} \ No newline at end of file diff --git a/siro_driver/android/app/.cxx/Debug/2j1f5m6a/x86_64/android_gradle_build_mini.json b/siro_driver/android/app/.cxx/Debug/2j1f5m6a/x86_64/android_gradle_build_mini.json new file mode 100644 index 0000000..d622242 --- /dev/null +++ b/siro_driver/android/app/.cxx/Debug/2j1f5m6a/x86_64/android_gradle_build_mini.json @@ -0,0 +1,27 @@ +{ + "buildFiles": [ + "/Users/hamzaaleghwairyeen/development/App/intaleq_driver/android/app/src/main/cpp/CMakeLists.txt" + ], + "cleanCommandsComponents": [ + [ + "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/bin/ninja", + "-C", + "/Users/hamzaaleghwairyeen/development/App/intaleq_driver/android/app/.cxx/Debug/2j1f5m6a/x86_64", + "clean" + ] + ], + "buildTargetsCommandComponents": [ + "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/bin/ninja", + "-C", + "/Users/hamzaaleghwairyeen/development/App/intaleq_driver/android/app/.cxx/Debug/2j1f5m6a/x86_64", + "{LIST_OF_TARGETS_TO_BUILD}" + ], + "libraries": { + "native-lib::@6890427a1f51a3e7e1df": { + "artifactName": "native-lib", + "abi": "x86_64", + "output": "/Users/hamzaaleghwairyeen/development/App/intaleq_driver/build/app/intermediates/cxx/Debug/2j1f5m6a/obj/x86_64/libnative-lib.so", + "runtimeFiles": [] + } + } +} \ No newline at end of file diff --git a/siro_driver/android/app/.cxx/Debug/2j1f5m6a/x86_64/build.ninja b/siro_driver/android/app/.cxx/Debug/2j1f5m6a/x86_64/build.ninja new file mode 100644 index 0000000..9c0e487 --- /dev/null +++ b/siro_driver/android/app/.cxx/Debug/2j1f5m6a/x86_64/build.ninja @@ -0,0 +1,156 @@ +# CMAKE generated file: DO NOT EDIT! +# Generated by "Ninja" Generator, CMake Version 3.31 + +# This file contains all the build statements describing the +# compilation DAG. + +# ============================================================================= +# Write statements declared in CMakeLists.txt: +# +# Which is the root file. +# ============================================================================= + +# ============================================================================= +# Project: intaleq_driver +# Configurations: Debug +# ============================================================================= + +############################################# +# Minimal version of Ninja required by this file + +ninja_required_version = 1.5 + + +############################################# +# Set configuration variable for custom commands. + +CONFIGURATION = Debug +# ============================================================================= +# Include auxiliary files. + + +############################################# +# Include rules file. + +include CMakeFiles/rules.ninja + +# ============================================================================= + +############################################# +# Logical path to working directory; prefix for absolute paths. + +cmake_ninja_workdir = /Users/hamzaaleghwairyeen/development/App/intaleq_driver/android/app/.cxx/Debug/2j1f5m6a/x86_64/ +# ============================================================================= +# Object build statements for SHARED_LIBRARY target native-lib + + +############################################# +# Order-only phony target for native-lib + +build cmake_object_order_depends_target_native-lib: phony || . + +build CMakeFiles/native-lib.dir/native-lib.cpp.o: CXX_COMPILER__native-lib_unscanned_Debug /Users/hamzaaleghwairyeen/development/App/intaleq_driver/android/app/src/main/cpp/native-lib.cpp || cmake_object_order_depends_target_native-lib + DEFINES = -Dnative_lib_EXPORTS + DEP_FILE = CMakeFiles/native-lib.dir/native-lib.cpp.o.d + FLAGS = -g -DANDROID -fdata-sections -ffunction-sections -funwind-tables -fstack-protector-strong -no-canonical-prefixes -D_FORTIFY_SOURCE=2 -Wformat -Werror=format-security -fno-limit-debug-info -fPIC + OBJECT_DIR = CMakeFiles/native-lib.dir + OBJECT_FILE_DIR = CMakeFiles/native-lib.dir + TARGET_COMPILE_PDB = CMakeFiles/native-lib.dir/ + TARGET_PDB = /Users/hamzaaleghwairyeen/development/App/intaleq_driver/build/app/intermediates/cxx/Debug/2j1f5m6a/obj/x86_64/libnative-lib.pdb + + +# ============================================================================= +# Link build statements for SHARED_LIBRARY target native-lib + + +############################################# +# Link the shared library /Users/hamzaaleghwairyeen/development/App/intaleq_driver/build/app/intermediates/cxx/Debug/2j1f5m6a/obj/x86_64/libnative-lib.so + +build /Users/hamzaaleghwairyeen/development/App/intaleq_driver/build/app/intermediates/cxx/Debug/2j1f5m6a/obj/x86_64/libnative-lib.so: CXX_SHARED_LIBRARY_LINKER__native-lib_Debug CMakeFiles/native-lib.dir/native-lib.cpp.o | /Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/lib/x86_64-linux-android/23/liblog.so + DEP_FILE = CMakeFiles/native-lib.dir/link.d + LANGUAGE_COMPILE_FLAGS = -g -DANDROID -fdata-sections -ffunction-sections -funwind-tables -fstack-protector-strong -no-canonical-prefixes -D_FORTIFY_SOURCE=2 -Wformat -Werror=format-security -fno-limit-debug-info + LINK_FLAGS = -static-libstdc++ -Wl,--build-id=sha1 -Wl,--no-rosegment -Wl,--no-undefined-version -Wl,--fatal-warnings -Wl,--no-undefined -Qunused-arguments -Xlinker --dependency-file=CMakeFiles/native-lib.dir/link.d + LINK_LIBRARIES = /Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/lib/x86_64-linux-android/23/liblog.so -latomic -lm + OBJECT_DIR = CMakeFiles/native-lib.dir + POST_BUILD = : + PRE_LINK = : + SONAME = libnative-lib.so + SONAME_FLAG = -Wl,-soname, + TARGET_COMPILE_PDB = CMakeFiles/native-lib.dir/ + TARGET_FILE = /Users/hamzaaleghwairyeen/development/App/intaleq_driver/build/app/intermediates/cxx/Debug/2j1f5m6a/obj/x86_64/libnative-lib.so + TARGET_PDB = /Users/hamzaaleghwairyeen/development/App/intaleq_driver/build/app/intermediates/cxx/Debug/2j1f5m6a/obj/x86_64/libnative-lib.pdb + + +############################################# +# Utility command for edit_cache + +build CMakeFiles/edit_cache.util: CUSTOM_COMMAND + COMMAND = cd /Users/hamzaaleghwairyeen/development/App/intaleq_driver/android/app/.cxx/Debug/2j1f5m6a/x86_64 && /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/bin/ccmake -S/Users/hamzaaleghwairyeen/development/App/intaleq_driver/android/app/src/main/cpp -B/Users/hamzaaleghwairyeen/development/App/intaleq_driver/android/app/.cxx/Debug/2j1f5m6a/x86_64 + DESC = Running CMake cache editor... + pool = console + restat = 1 + +build edit_cache: phony CMakeFiles/edit_cache.util + + +############################################# +# Utility command for rebuild_cache + +build CMakeFiles/rebuild_cache.util: CUSTOM_COMMAND + COMMAND = cd /Users/hamzaaleghwairyeen/development/App/intaleq_driver/android/app/.cxx/Debug/2j1f5m6a/x86_64 && /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/bin/cmake --regenerate-during-build -S/Users/hamzaaleghwairyeen/development/App/intaleq_driver/android/app/src/main/cpp -B/Users/hamzaaleghwairyeen/development/App/intaleq_driver/android/app/.cxx/Debug/2j1f5m6a/x86_64 + DESC = Running CMake to regenerate build system... + pool = console + restat = 1 + +build rebuild_cache: phony CMakeFiles/rebuild_cache.util + +# ============================================================================= +# Target aliases. + +build libnative-lib.so: phony /Users/hamzaaleghwairyeen/development/App/intaleq_driver/build/app/intermediates/cxx/Debug/2j1f5m6a/obj/x86_64/libnative-lib.so + +build native-lib: phony /Users/hamzaaleghwairyeen/development/App/intaleq_driver/build/app/intermediates/cxx/Debug/2j1f5m6a/obj/x86_64/libnative-lib.so + +# ============================================================================= +# Folder targets. + +# ============================================================================= + +############################################# +# Folder: /Users/hamzaaleghwairyeen/development/App/intaleq_driver/android/app/.cxx/Debug/2j1f5m6a/x86_64 + +build all: phony /Users/hamzaaleghwairyeen/development/App/intaleq_driver/build/app/intermediates/cxx/Debug/2j1f5m6a/obj/x86_64/libnative-lib.so + +# ============================================================================= +# Built-in targets + + +############################################# +# Re-run CMake if any of its inputs changed. + +build build.ninja: RERUN_CMAKE | /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeCCompiler.cmake.in /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeCCompilerABI.c /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeCInformation.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeCXXCompiler.cmake.in /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeCXXCompilerABI.cpp /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeCXXInformation.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeCommonLanguageInclude.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeCompilerIdDetection.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeDetermineCCompiler.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeDetermineCXXCompiler.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeDetermineCompiler.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeDetermineCompilerABI.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeDetermineCompilerId.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeDetermineCompilerSupport.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeDetermineSystem.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeFindBinUtils.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeGenericSystem.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeInitializeConfigs.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeLanguageInformation.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeParseImplicitIncludeInfo.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeParseImplicitLinkInfo.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeParseLibraryArchitecture.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeSystem.cmake.in /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeSystemSpecificInformation.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeSystemSpecificInitialize.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeTestCCompiler.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeTestCXXCompiler.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeTestCompilerCommon.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/ADSP-DetermineCompiler.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/ARMCC-DetermineCompiler.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/ARMClang-DetermineCompiler.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/AppleClang-DetermineCompiler.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/Borland-DetermineCompiler.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/Bruce-C-DetermineCompiler.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/CMakeCommonCompilerMacros.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/Clang-C.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/Clang-CXX-CXXImportStd.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/Clang-CXX.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/Clang-DetermineCompiler.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/Clang-DetermineCompilerInternal.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/Clang-FindBinUtils.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/Clang.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/Compaq-C-DetermineCompiler.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/Compaq-CXX-DetermineCompiler.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/Cray-DetermineCompiler.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/CrayClang-DetermineCompiler.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/Embarcadero-DetermineCompiler.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/Fujitsu-DetermineCompiler.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/FujitsuClang-DetermineCompiler.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/GHS-DetermineCompiler.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/GNU-C-DetermineCompiler.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/GNU-CXX-DetermineCompiler.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/GNU.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/HP-C-DetermineCompiler.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/HP-CXX-DetermineCompiler.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/IAR-DetermineCompiler.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/IBMCPP-C-DetermineVersionInternal.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/IBMCPP-CXX-DetermineVersionInternal.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/IBMClang-C-DetermineCompiler.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/IBMClang-CXX-DetermineCompiler.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/Intel-DetermineCompiler.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/IntelLLVM-DetermineCompiler.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/LCC-C-DetermineCompiler.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/LCC-CXX-DetermineCompiler.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/MSVC-DetermineCompiler.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/NVHPC-DetermineCompiler.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/NVIDIA-DetermineCompiler.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/OpenWatcom-DetermineCompiler.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/OrangeC-DetermineCompiler.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/PGI-DetermineCompiler.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/PathScale-DetermineCompiler.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/SCO-DetermineCompiler.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/SDCC-C-DetermineCompiler.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/SunPro-C-DetermineCompiler.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/SunPro-CXX-DetermineCompiler.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/TI-DetermineCompiler.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/TIClang-DetermineCompiler.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/Tasking-DetermineCompiler.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/TinyCC-C-DetermineCompiler.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/VisualAge-C-DetermineCompiler.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/VisualAge-CXX-DetermineCompiler.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/Watcom-DetermineCompiler.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/XL-C-DetermineCompiler.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/XL-CXX-DetermineCompiler.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/XLClang-C-DetermineCompiler.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/XLClang-CXX-DetermineCompiler.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/zOS-C-DetermineCompiler.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/zOS-CXX-DetermineCompiler.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Internal/CMakeCLinkerInformation.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Internal/CMakeCXXLinkerInformation.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Internal/CMakeCommonLinkerInformation.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Internal/CMakeDetermineLinkerId.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Internal/FeatureTesting.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Linker/GNU.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Linker/LLD-C.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Linker/LLD-CXX.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Linker/LLD.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Platform/Android-Clang-C.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Platform/Android-Clang-CXX.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Platform/Android-Clang.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Platform/Android-Determine-C.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Platform/Android-Determine-CXX.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Platform/Android-Determine.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Platform/Android-Initialize.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Platform/Android.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Platform/Android/Determine-Compiler.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Platform/Linker/Android-LLD-C.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Platform/Linker/Android-LLD-CXX.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Platform/Linker/GNU.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Platform/Linker/Linux-GNU.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Platform/Linker/Linux-LLD-C.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Platform/Linker/Linux-LLD-CXX.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Platform/Linker/Linux-LLD.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Platform/Linux-Initialize.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Platform/Linux.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Platform/UnixPaths.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/build/cmake/abis.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/build/cmake/android-legacy.toolchain.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/build/cmake/android.toolchain.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/build/cmake/flags.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/build/cmake/hooks/pre/Android-Clang.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/build/cmake/hooks/pre/Android-Determine.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/build/cmake/hooks/pre/Android-Initialize.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/build/cmake/hooks/pre/Android.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/build/cmake/hooks/pre/Determine-Compiler.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/build/cmake/platforms.cmake /Users/hamzaaleghwairyeen/development/App/intaleq_driver/android/app/src/main/cpp/CMakeLists.txt CMakeCache.txt CMakeFiles/3.31.5-g6cf5163/CMakeCCompiler.cmake CMakeFiles/3.31.5-g6cf5163/CMakeCXXCompiler.cmake CMakeFiles/3.31.5-g6cf5163/CMakeSystem.cmake + pool = console + + +############################################# +# A missing CMake input file is not an error. + +build /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeCCompiler.cmake.in /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeCCompilerABI.c /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeCInformation.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeCXXCompiler.cmake.in /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeCXXCompilerABI.cpp /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeCXXInformation.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeCommonLanguageInclude.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeCompilerIdDetection.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeDetermineCCompiler.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeDetermineCXXCompiler.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeDetermineCompiler.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeDetermineCompilerABI.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeDetermineCompilerId.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeDetermineCompilerSupport.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeDetermineSystem.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeFindBinUtils.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeGenericSystem.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeInitializeConfigs.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeLanguageInformation.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeParseImplicitIncludeInfo.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeParseImplicitLinkInfo.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeParseLibraryArchitecture.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeSystem.cmake.in /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeSystemSpecificInformation.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeSystemSpecificInitialize.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeTestCCompiler.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeTestCXXCompiler.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeTestCompilerCommon.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/ADSP-DetermineCompiler.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/ARMCC-DetermineCompiler.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/ARMClang-DetermineCompiler.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/AppleClang-DetermineCompiler.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/Borland-DetermineCompiler.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/Bruce-C-DetermineCompiler.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/CMakeCommonCompilerMacros.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/Clang-C.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/Clang-CXX-CXXImportStd.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/Clang-CXX.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/Clang-DetermineCompiler.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/Clang-DetermineCompilerInternal.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/Clang-FindBinUtils.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/Clang.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/Compaq-C-DetermineCompiler.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/Compaq-CXX-DetermineCompiler.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/Cray-DetermineCompiler.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/CrayClang-DetermineCompiler.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/Embarcadero-DetermineCompiler.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/Fujitsu-DetermineCompiler.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/FujitsuClang-DetermineCompiler.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/GHS-DetermineCompiler.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/GNU-C-DetermineCompiler.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/GNU-CXX-DetermineCompiler.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/GNU.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/HP-C-DetermineCompiler.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/HP-CXX-DetermineCompiler.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/IAR-DetermineCompiler.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/IBMCPP-C-DetermineVersionInternal.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/IBMCPP-CXX-DetermineVersionInternal.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/IBMClang-C-DetermineCompiler.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/IBMClang-CXX-DetermineCompiler.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/Intel-DetermineCompiler.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/IntelLLVM-DetermineCompiler.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/LCC-C-DetermineCompiler.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/LCC-CXX-DetermineCompiler.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/MSVC-DetermineCompiler.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/NVHPC-DetermineCompiler.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/NVIDIA-DetermineCompiler.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/OpenWatcom-DetermineCompiler.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/OrangeC-DetermineCompiler.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/PGI-DetermineCompiler.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/PathScale-DetermineCompiler.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/SCO-DetermineCompiler.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/SDCC-C-DetermineCompiler.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/SunPro-C-DetermineCompiler.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/SunPro-CXX-DetermineCompiler.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/TI-DetermineCompiler.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/TIClang-DetermineCompiler.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/Tasking-DetermineCompiler.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/TinyCC-C-DetermineCompiler.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/VisualAge-C-DetermineCompiler.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/VisualAge-CXX-DetermineCompiler.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/Watcom-DetermineCompiler.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/XL-C-DetermineCompiler.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/XL-CXX-DetermineCompiler.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/XLClang-C-DetermineCompiler.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/XLClang-CXX-DetermineCompiler.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/zOS-C-DetermineCompiler.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/zOS-CXX-DetermineCompiler.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Internal/CMakeCLinkerInformation.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Internal/CMakeCXXLinkerInformation.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Internal/CMakeCommonLinkerInformation.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Internal/CMakeDetermineLinkerId.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Internal/FeatureTesting.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Linker/GNU.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Linker/LLD-C.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Linker/LLD-CXX.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Linker/LLD.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Platform/Android-Clang-C.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Platform/Android-Clang-CXX.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Platform/Android-Clang.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Platform/Android-Determine-C.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Platform/Android-Determine-CXX.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Platform/Android-Determine.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Platform/Android-Initialize.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Platform/Android.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Platform/Android/Determine-Compiler.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Platform/Linker/Android-LLD-C.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Platform/Linker/Android-LLD-CXX.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Platform/Linker/GNU.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Platform/Linker/Linux-GNU.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Platform/Linker/Linux-LLD-C.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Platform/Linker/Linux-LLD-CXX.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Platform/Linker/Linux-LLD.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Platform/Linux-Initialize.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Platform/Linux.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Platform/UnixPaths.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/build/cmake/abis.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/build/cmake/android-legacy.toolchain.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/build/cmake/android.toolchain.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/build/cmake/flags.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/build/cmake/hooks/pre/Android-Clang.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/build/cmake/hooks/pre/Android-Determine.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/build/cmake/hooks/pre/Android-Initialize.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/build/cmake/hooks/pre/Android.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/build/cmake/hooks/pre/Determine-Compiler.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/build/cmake/platforms.cmake /Users/hamzaaleghwairyeen/development/App/intaleq_driver/android/app/src/main/cpp/CMakeLists.txt CMakeCache.txt CMakeFiles/3.31.5-g6cf5163/CMakeCCompiler.cmake CMakeFiles/3.31.5-g6cf5163/CMakeCXXCompiler.cmake CMakeFiles/3.31.5-g6cf5163/CMakeSystem.cmake: phony + + +############################################# +# Clean all the built files. + +build clean: CLEAN + + +############################################# +# Print all primary targets available. + +build help: HELP + + +############################################# +# Make the all target the default. + +default all diff --git a/siro_driver/android/app/.cxx/Debug/2j1f5m6a/x86_64/build_file_index.txt b/siro_driver/android/app/.cxx/Debug/2j1f5m6a/x86_64/build_file_index.txt new file mode 100644 index 0000000..b1ca0fa --- /dev/null +++ b/siro_driver/android/app/.cxx/Debug/2j1f5m6a/x86_64/build_file_index.txt @@ -0,0 +1 @@ +/Users/hamzaaleghwairyeen/development/App/intaleq_driver/android/app/src/main/cpp/CMakeLists.txt \ No newline at end of file diff --git a/siro_driver/android/app/.cxx/Debug/2j1f5m6a/x86_64/cmake_install.cmake b/siro_driver/android/app/.cxx/Debug/2j1f5m6a/x86_64/cmake_install.cmake new file mode 100644 index 0000000..78a6ac6 --- /dev/null +++ b/siro_driver/android/app/.cxx/Debug/2j1f5m6a/x86_64/cmake_install.cmake @@ -0,0 +1,66 @@ +# Install script for directory: /Users/hamzaaleghwairyeen/development/App/intaleq_driver/android/app/src/main/cpp + +# Set the install prefix +if(NOT DEFINED CMAKE_INSTALL_PREFIX) + set(CMAKE_INSTALL_PREFIX "/usr/local") +endif() +string(REGEX REPLACE "/$" "" CMAKE_INSTALL_PREFIX "${CMAKE_INSTALL_PREFIX}") + +# Set the install configuration name. +if(NOT DEFINED CMAKE_INSTALL_CONFIG_NAME) + if(BUILD_TYPE) + string(REGEX REPLACE "^[^A-Za-z0-9_]+" "" + CMAKE_INSTALL_CONFIG_NAME "${BUILD_TYPE}") + else() + set(CMAKE_INSTALL_CONFIG_NAME "Debug") + endif() + message(STATUS "Install configuration: \"${CMAKE_INSTALL_CONFIG_NAME}\"") +endif() + +# Set the component getting installed. +if(NOT CMAKE_INSTALL_COMPONENT) + if(COMPONENT) + message(STATUS "Install component: \"${COMPONENT}\"") + set(CMAKE_INSTALL_COMPONENT "${COMPONENT}") + else() + set(CMAKE_INSTALL_COMPONENT) + endif() +endif() + +# Install shared libraries without execute permission? +if(NOT DEFINED CMAKE_INSTALL_SO_NO_EXE) + set(CMAKE_INSTALL_SO_NO_EXE "0") +endif() + +# Is this installation the result of a crosscompile? +if(NOT DEFINED CMAKE_CROSSCOMPILING) + set(CMAKE_CROSSCOMPILING "TRUE") +endif() + +# Set path to fallback-tool for dependency-resolution. +if(NOT DEFINED CMAKE_OBJDUMP) + set(CMAKE_OBJDUMP "/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/bin/llvm-objdump") +endif() + +string(REPLACE ";" "\n" CMAKE_INSTALL_MANIFEST_CONTENT + "${CMAKE_INSTALL_MANIFEST_FILES}") +if(CMAKE_INSTALL_LOCAL_ONLY) + file(WRITE "/Users/hamzaaleghwairyeen/development/App/intaleq_driver/android/app/.cxx/Debug/2j1f5m6a/x86_64/install_local_manifest.txt" + "${CMAKE_INSTALL_MANIFEST_CONTENT}") +endif() +if(CMAKE_INSTALL_COMPONENT) + if(CMAKE_INSTALL_COMPONENT MATCHES "^[a-zA-Z0-9_.+-]+$") + set(CMAKE_INSTALL_MANIFEST "install_manifest_${CMAKE_INSTALL_COMPONENT}.txt") + else() + string(MD5 CMAKE_INST_COMP_HASH "${CMAKE_INSTALL_COMPONENT}") + set(CMAKE_INSTALL_MANIFEST "install_manifest_${CMAKE_INST_COMP_HASH}.txt") + unset(CMAKE_INST_COMP_HASH) + endif() +else() + set(CMAKE_INSTALL_MANIFEST "install_manifest.txt") +endif() + +if(NOT CMAKE_INSTALL_LOCAL_ONLY) + file(WRITE "/Users/hamzaaleghwairyeen/development/App/intaleq_driver/android/app/.cxx/Debug/2j1f5m6a/x86_64/${CMAKE_INSTALL_MANIFEST}" + "${CMAKE_INSTALL_MANIFEST_CONTENT}") +endif() diff --git a/siro_driver/android/app/.cxx/Debug/2j1f5m6a/x86_64/compile_commands.json b/siro_driver/android/app/.cxx/Debug/2j1f5m6a/x86_64/compile_commands.json new file mode 100644 index 0000000..d2623d0 --- /dev/null +++ b/siro_driver/android/app/.cxx/Debug/2j1f5m6a/x86_64/compile_commands.json @@ -0,0 +1,8 @@ +[ +{ + "directory": "/Users/hamzaaleghwairyeen/development/App/intaleq_driver/android/app/.cxx/Debug/2j1f5m6a/x86_64", + "command": "/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/bin/clang++ --target=x86_64-none-linux-android23 --sysroot=/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot -Dnative_lib_EXPORTS -g -DANDROID -fdata-sections -ffunction-sections -funwind-tables -fstack-protector-strong -no-canonical-prefixes -D_FORTIFY_SOURCE=2 -Wformat -Werror=format-security -fno-limit-debug-info -fPIC -o CMakeFiles/native-lib.dir/native-lib.cpp.o -c /Users/hamzaaleghwairyeen/development/App/intaleq_driver/android/app/src/main/cpp/native-lib.cpp", + "file": "/Users/hamzaaleghwairyeen/development/App/intaleq_driver/android/app/src/main/cpp/native-lib.cpp", + "output": "CMakeFiles/native-lib.dir/native-lib.cpp.o" +} +] \ No newline at end of file diff --git a/siro_driver/android/app/.cxx/Debug/2j1f5m6a/x86_64/compile_commands.json.bin b/siro_driver/android/app/.cxx/Debug/2j1f5m6a/x86_64/compile_commands.json.bin new file mode 100644 index 0000000..43a1569 Binary files /dev/null and b/siro_driver/android/app/.cxx/Debug/2j1f5m6a/x86_64/compile_commands.json.bin differ diff --git a/siro_driver/android/app/.cxx/Debug/2j1f5m6a/x86_64/configure_fingerprint.bin b/siro_driver/android/app/.cxx/Debug/2j1f5m6a/x86_64/configure_fingerprint.bin new file mode 100644 index 0000000..c8c0570 --- /dev/null +++ b/siro_driver/android/app/.cxx/Debug/2j1f5m6a/x86_64/configure_fingerprint.bin @@ -0,0 +1,29 @@ +C/C++ Structured Log +~ +|/Users/hamzaaleghwairyeen/development/App/intaleq_driver/android/app/.cxx/Debug/2j1f5m6a/x86_64/additional_project_files.txtC +A +?com.android.build.gradle.internal.cxx.io.EncodedFileFingerPrint  3  Ӂ3} +{ +y/Users/hamzaaleghwairyeen/development/App/intaleq_driver/android/app/.cxx/Debug/2j1f5m6a/x86_64/android_gradle_build.json  3 + Ӂ3 + +~/Users/hamzaaleghwairyeen/development/App/intaleq_driver/android/app/.cxx/Debug/2j1f5m6a/x86_64/android_gradle_build_mini.json  3 Ӂ3o +m +k/Users/hamzaaleghwairyeen/development/App/intaleq_driver/android/app/.cxx/Debug/2j1f5m6a/x86_64/build.ninja  3 Ӂ3s +q +o/Users/hamzaaleghwairyeen/development/App/intaleq_driver/android/app/.cxx/Debug/2j1f5m6a/x86_64/build.ninja.txt  3x +v +t/Users/hamzaaleghwairyeen/development/App/intaleq_driver/android/app/.cxx/Debug/2j1f5m6a/x86_64/build_file_index.txt  3 ` Ӂ3y +w +u/Users/hamzaaleghwairyeen/development/App/intaleq_driver/android/app/.cxx/Debug/2j1f5m6a/x86_64/compile_commands.json  3 Ӂ3} +{ +y/Users/hamzaaleghwairyeen/development/App/intaleq_driver/android/app/.cxx/Debug/2j1f5m6a/x86_64/compile_commands.json.bin  3  Ӂ3 + +/Users/hamzaaleghwairyeen/development/App/intaleq_driver/android/app/.cxx/Debug/2j1f5m6a/x86_64/metadata_generation_command.txt  3 + Ӂ3v +t +r/Users/hamzaaleghwairyeen/development/App/intaleq_driver/android/app/.cxx/Debug/2j1f5m6a/x86_64/prefab_config.json  3  ( Ӂ3{ +y +w/Users/hamzaaleghwairyeen/development/App/intaleq_driver/android/app/.cxx/Debug/2j1f5m6a/x86_64/symbol_folder_index.txt  3  n Ӂ3d +b +`/Users/hamzaaleghwairyeen/development/App/intaleq_driver/android/app/src/main/cpp/CMakeLists.txt  3  劝2 \ No newline at end of file diff --git a/siro_driver/android/app/.cxx/Debug/2j1f5m6a/x86_64/metadata_generation_command.txt b/siro_driver/android/app/.cxx/Debug/2j1f5m6a/x86_64/metadata_generation_command.txt new file mode 100644 index 0000000..208d7ba --- /dev/null +++ b/siro_driver/android/app/.cxx/Debug/2j1f5m6a/x86_64/metadata_generation_command.txt @@ -0,0 +1,18 @@ + -H/Users/hamzaaleghwairyeen/development/App/intaleq_driver/android/app/src/main/cpp +-DCMAKE_SYSTEM_NAME=Android +-DCMAKE_EXPORT_COMPILE_COMMANDS=ON +-DCMAKE_SYSTEM_VERSION=23 +-DANDROID_PLATFORM=android-23 +-DANDROID_ABI=x86_64 +-DCMAKE_ANDROID_ARCH_ABI=x86_64 +-DANDROID_NDK=/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973 +-DCMAKE_ANDROID_NDK=/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973 +-DCMAKE_TOOLCHAIN_FILE=/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/build/cmake/android.toolchain.cmake +-DCMAKE_MAKE_PROGRAM=/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/bin/ninja +-DCMAKE_LIBRARY_OUTPUT_DIRECTORY=/Users/hamzaaleghwairyeen/development/App/intaleq_driver/build/app/intermediates/cxx/Debug/2j1f5m6a/obj/x86_64 +-DCMAKE_RUNTIME_OUTPUT_DIRECTORY=/Users/hamzaaleghwairyeen/development/App/intaleq_driver/build/app/intermediates/cxx/Debug/2j1f5m6a/obj/x86_64 +-DCMAKE_BUILD_TYPE=Debug +-B/Users/hamzaaleghwairyeen/development/App/intaleq_driver/android/app/.cxx/Debug/2j1f5m6a/x86_64 +-GNinja + Build command args: [] + Version: 2 \ No newline at end of file diff --git a/siro_driver/android/app/.cxx/Debug/2j1f5m6a/x86_64/prefab_config.json b/siro_driver/android/app/.cxx/Debug/2j1f5m6a/x86_64/prefab_config.json new file mode 100644 index 0000000..e799de8 --- /dev/null +++ b/siro_driver/android/app/.cxx/Debug/2j1f5m6a/x86_64/prefab_config.json @@ -0,0 +1,4 @@ +{ + "enabled": false, + "packages": [] +} \ No newline at end of file diff --git a/siro_driver/android/app/.cxx/Debug/2j1f5m6a/x86_64/symbol_folder_index.txt b/siro_driver/android/app/.cxx/Debug/2j1f5m6a/x86_64/symbol_folder_index.txt new file mode 100644 index 0000000..2fb6516 --- /dev/null +++ b/siro_driver/android/app/.cxx/Debug/2j1f5m6a/x86_64/symbol_folder_index.txt @@ -0,0 +1 @@ +/Users/hamzaaleghwairyeen/development/App/intaleq_driver/build/app/intermediates/cxx/Debug/2j1f5m6a/obj/x86_64 \ No newline at end of file diff --git a/siro_driver/android/app/.cxx/tools/profile/arm64-v8a/compile_commands.json b/siro_driver/android/app/.cxx/tools/profile/arm64-v8a/compile_commands.json new file mode 100644 index 0000000..230c355 --- /dev/null +++ b/siro_driver/android/app/.cxx/tools/profile/arm64-v8a/compile_commands.json @@ -0,0 +1,8 @@ +[ +{ + "directory": "/Users/hamzaaleghwairyeen/development/App/intaleq_driver/android/app/.cxx/Debug/2j1f5m6a/arm64-v8a", + "command": "/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/bin/clang++ --target=aarch64-none-linux-android23 --sysroot=/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot -Dnative_lib_EXPORTS -g -DANDROID -fdata-sections -ffunction-sections -funwind-tables -fstack-protector-strong -no-canonical-prefixes -D_FORTIFY_SOURCE=2 -Wformat -Werror=format-security -fno-limit-debug-info -fPIC -o CMakeFiles/native-lib.dir/native-lib.cpp.o -c /Users/hamzaaleghwairyeen/development/App/intaleq_driver/android/app/src/main/cpp/native-lib.cpp", + "file": "/Users/hamzaaleghwairyeen/development/App/intaleq_driver/android/app/src/main/cpp/native-lib.cpp", + "output": "CMakeFiles/native-lib.dir/native-lib.cpp.o" +} +] \ No newline at end of file diff --git a/siro_driver/android/app/.cxx/tools/profile/armeabi-v7a/compile_commands.json b/siro_driver/android/app/.cxx/tools/profile/armeabi-v7a/compile_commands.json new file mode 100644 index 0000000..ebf94e0 --- /dev/null +++ b/siro_driver/android/app/.cxx/tools/profile/armeabi-v7a/compile_commands.json @@ -0,0 +1,8 @@ +[ +{ + "directory": "/Users/hamzaaleghwairyeen/development/App/intaleq_driver/android/app/.cxx/Debug/2j1f5m6a/armeabi-v7a", + "command": "/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/bin/clang++ --target=armv7-none-linux-androideabi23 --sysroot=/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot -Dnative_lib_EXPORTS -g -DANDROID -fdata-sections -ffunction-sections -funwind-tables -fstack-protector-strong -no-canonical-prefixes -D_FORTIFY_SOURCE=2 -march=armv7-a -mthumb -Wformat -Werror=format-security -fno-limit-debug-info -fPIC -o CMakeFiles/native-lib.dir/native-lib.cpp.o -c /Users/hamzaaleghwairyeen/development/App/intaleq_driver/android/app/src/main/cpp/native-lib.cpp", + "file": "/Users/hamzaaleghwairyeen/development/App/intaleq_driver/android/app/src/main/cpp/native-lib.cpp", + "output": "CMakeFiles/native-lib.dir/native-lib.cpp.o" +} +] \ No newline at end of file diff --git a/siro_driver/android/app/.cxx/tools/profile/x86/compile_commands.json b/siro_driver/android/app/.cxx/tools/profile/x86/compile_commands.json new file mode 100644 index 0000000..a59621a --- /dev/null +++ b/siro_driver/android/app/.cxx/tools/profile/x86/compile_commands.json @@ -0,0 +1,8 @@ +[ +{ + "directory": "/Users/hamzaaleghwairyeen/development/App/intaleq_driver/android/app/.cxx/Debug/2j1f5m6a/x86", + "command": "/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/bin/clang++ --target=i686-none-linux-android23 --sysroot=/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot -Dnative_lib_EXPORTS -g -DANDROID -fdata-sections -ffunction-sections -funwind-tables -fstack-protector-strong -no-canonical-prefixes -mstackrealign -D_FORTIFY_SOURCE=2 -Wformat -Werror=format-security -fno-limit-debug-info -fPIC -o CMakeFiles/native-lib.dir/native-lib.cpp.o -c /Users/hamzaaleghwairyeen/development/App/intaleq_driver/android/app/src/main/cpp/native-lib.cpp", + "file": "/Users/hamzaaleghwairyeen/development/App/intaleq_driver/android/app/src/main/cpp/native-lib.cpp", + "output": "CMakeFiles/native-lib.dir/native-lib.cpp.o" +} +] \ No newline at end of file diff --git a/siro_driver/android/app/.cxx/tools/profile/x86_64/compile_commands.json b/siro_driver/android/app/.cxx/tools/profile/x86_64/compile_commands.json new file mode 100644 index 0000000..d2623d0 --- /dev/null +++ b/siro_driver/android/app/.cxx/tools/profile/x86_64/compile_commands.json @@ -0,0 +1,8 @@ +[ +{ + "directory": "/Users/hamzaaleghwairyeen/development/App/intaleq_driver/android/app/.cxx/Debug/2j1f5m6a/x86_64", + "command": "/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/bin/clang++ --target=x86_64-none-linux-android23 --sysroot=/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot -Dnative_lib_EXPORTS -g -DANDROID -fdata-sections -ffunction-sections -funwind-tables -fstack-protector-strong -no-canonical-prefixes -D_FORTIFY_SOURCE=2 -Wformat -Werror=format-security -fno-limit-debug-info -fPIC -o CMakeFiles/native-lib.dir/native-lib.cpp.o -c /Users/hamzaaleghwairyeen/development/App/intaleq_driver/android/app/src/main/cpp/native-lib.cpp", + "file": "/Users/hamzaaleghwairyeen/development/App/intaleq_driver/android/app/src/main/cpp/native-lib.cpp", + "output": "CMakeFiles/native-lib.dir/native-lib.cpp.o" +} +] \ No newline at end of file diff --git a/siro_driver/android/app/build.gradle b/siro_driver/android/app/build.gradle new file mode 100644 index 0000000..b683b30 --- /dev/null +++ b/siro_driver/android/app/build.gradle @@ -0,0 +1,113 @@ +plugins { + id "com.android.application" + // START: FlutterFire Configuration + id 'com.google.gms.google-services' + // END: FlutterFire Configuration + id "kotlin-android" + // The Flutter Gradle Plugin must be applied after the Android and Kotlin Gradle plugins. + id "dev.flutter.flutter-gradle-plugin" +} + +def keystoreProperties = new Properties() +def keystorePropertiesFile = rootProject.file('key.properties') +// Load keystore properties if the file exists +if (keystorePropertiesFile.exists()) { + keystoreProperties.load(new FileInputStream(keystorePropertiesFile)) +} + +android { + namespace = "com.siro.siro_driver" + compileSdk = 36 + ndkVersion "29.0.14033849" + + compileOptions { + sourceCompatibility = JavaVersion.VERSION_17 + targetCompatibility = JavaVersion.VERSION_17 + coreLibraryDesugaringEnabled true + } + + kotlinOptions { + jvmTarget = JavaVersion.VERSION_17 + } + + externalNativeBuild { + cmake { + path "src/main/cpp/CMakeLists.txt" + version "3.22.1" + } + } + + // تمت الإضافة: توجيه مسار المكتبات الأصلية لمطابقة تطبيق الراكب + sourceSets { + main { + jniLibs.srcDirs = ['src/main/jniLibs'] + } + } + + defaultConfig { + applicationId = "com.siro.siro_driver" + minSdkVersion = flutter.minSdkVersion + targetSdk = 36 + versionCode = 62 + versionName = '1.1.62' + multiDexEnabled = true + + ndk { + abiFilters "armeabi-v7a", "arm64-v8a" + } + + manifestPlaceholders += [mapsApiKey: keystoreProperties['mapsApiKey'] ?: ""] + + // تمت الإضافة: تمرير تعليمات 16 KB لمترجم C++ + externalNativeBuild { + cmake { + arguments "-DANDROID_SUPPORT_FLEXIBLE_PAGE_SIZES=ON" + } + } + } + + // تمت الإضافة: منع ضغط المكتبات لتتوافق مع متطلبات نظام التشغيل + packaging { + jniLibs { + useLegacyPackaging = false + } + } + + signingConfigs { + release { + keyAlias keystoreProperties['keyAlias'] + keyPassword keystoreProperties['keyPassword'] + storeFile keystoreProperties['storeFile'] ? file(keystoreProperties['storeFile']) : null + storePassword keystoreProperties['storePassword'] + } + } + + buildTypes { + release { + signingConfig signingConfigs.release + minifyEnabled true + shrinkResources true + proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro' + } + } +} + +flutter { + source = "../.." +} + +dependencies { + implementation "androidx.car.app:app:1.4.0" + implementation "org.maplibre.gl:android-sdk:11.0.0" + implementation "org.jetbrains.kotlin:kotlin-stdlib-jdk7:$kotlin_version" + // تمت الترقية لتطابق تطبيق الراكب + coreLibraryDesugaring 'com.android.tools:desugar_jdk_libs:2.1.5' + + + implementation 'com.scottyab:rootbeer-lib:0.1.0' + + // تمت الترقية لتطابق تطبيق الراكب + implementation 'com.google.android.gms:play-services-safetynet:18.1.0' + + implementation "androidx.concurrent:concurrent-futures:1.2.0" +} \ No newline at end of file diff --git a/siro_driver/android/app/google-services.json b/siro_driver/android/app/google-services.json new file mode 100644 index 0000000..485e75f --- /dev/null +++ b/siro_driver/android/app/google-services.json @@ -0,0 +1,48 @@ +{ + "project_info": { + "project_number": "825988584191", + "project_id": "siro-a6957", + "storage_bucket": "siro-a6957.firebasestorage.app" + }, + "client": [ + { + "client_info": { + "mobilesdk_app_id": "1:825988584191:android:4525a21b00173d361632ca", + "android_client_info": { + "package_name": "com.siro.driver" + } + }, + "oauth_client": [], + "api_key": [ + { + "current_key": "AIzaSyAEoply_UcEP6KaCu_ziCy_ZDIjAKvi7b8" + } + ], + "services": { + "appinvite_service": { + "other_platform_oauth_client": [] + } + } + }, + { + "client_info": { + "mobilesdk_app_id": "1:825988584191:android:06782b540c7681ad1632ca", + "android_client_info": { + "package_name": "com.siro.rider" + } + }, + "oauth_client": [], + "api_key": [ + { + "current_key": "AIzaSyAEoply_UcEP6KaCu_ziCy_ZDIjAKvi7b8" + } + ], + "services": { + "appinvite_service": { + "other_platform_oauth_client": [] + } + } + } + ], + "configuration_version": "1" +} \ No newline at end of file diff --git a/siro_driver/android/app/proguard-rules.pro b/siro_driver/android/app/proguard-rules.pro new file mode 100755 index 0000000..c15175d --- /dev/null +++ b/siro_driver/android/app/proguard-rules.pro @@ -0,0 +1,43 @@ +# Suppress warnings for specific Google ML Kit classes +-dontwarn com.google.mlkit.vision.text.chinese.ChineseTextRecognizerOptions$Builder +-dontwarn com.google.mlkit.vision.text.chinese.ChineseTextRecognizerOptions +-dontwarn com.google.mlkit.vision.text.devanagari.DevanagariTextRecognizerOptions$Builder +-dontwarn com.google.mlkit.vision.text.devanagari.DevanagariTextRecognizerOptions +-dontwarn com.google.mlkit.vision.text.japanese.JapaneseTextRecognizerOptions$Builder +-dontwarn com.google.mlkit.vision.text.japanese.JapaneseTextRecognizerOptions +-dontwarn com.google.mlkit.vision.text.korean.KoreanTextRecognizerOptions$Builder +-dontwarn com.google.mlkit.vision.text.korean.KoreanTextRecognizerOptions + +# Keep rules for Google ML Kit +-keep class com.google.mlkit.vision.** { *; } +-keep class com.google.mlkit.vision.text.** { *; } +-keep class com.google.mlkit.vision.text.chinese.ChineseTextRecognizerOptions { *; } +-keep class com.google.mlkit.vision.text.chinese.ChineseTextRecognizerOptions$Builder { *; } +-keep class com.google.mlkit.vision.text.devanagari.DevanagariTextRecognizerOptions { *; } +-keep class com.google.mlkit.vision.text.devanagari.DevanagariTextRecognizerOptions$Builder { *; } +-keep class com.google.mlkit.vision.text.japanese.JapaneseTextRecognizerOptions { *; } +-keep class com.google.mlkit.vision.text.japanese.JapaneseTextRecognizerOptions$Builder { *; } +-keep class com.google.mlkit.vision.text.korean.KoreanTextRecognizerOptions { *; } +-keep class com.google.mlkit.vision.text.korean.KoreanTextRecognizerOptions$Builder { *; } + + +-keep class com.yalantis.ucrop.** { *; } +-keep class com.yalantis.ucrop.util.** { *; } + +# منع قراءة كود RootDetection +#-keep class com.sefer_driver.RootDetection { *; } +-keep class com.sefer_driver.RootDetection { + native ; + } + +# Android Auto Car App Library +-keep class androidx.car.app.** { *; } +-keep class com.siro.siro_driver.MyCarAppService { *; } +-keep class com.siro.siro_driver.MyCarSession { *; } +-keep class com.siro.siro_driver.MyCarScreen { *; } +-keep class com.siro.siro_driver.CarNavigationData { *; } +-keep class com.siro.siro_driver.MapPresentation { *; } + +# MapLibre Native SDK +-keep class org.maplibre.android.** { *; } +-dontwarn org.maplibre.android.** \ No newline at end of file diff --git a/siro_driver/android/app/src/debug/AndroidManifest.xml b/siro_driver/android/app/src/debug/AndroidManifest.xml new file mode 100644 index 0000000..399f698 --- /dev/null +++ b/siro_driver/android/app/src/debug/AndroidManifest.xml @@ -0,0 +1,7 @@ + + + + diff --git a/siro_driver/android/app/src/main/AndroidManifest.xml b/siro_driver/android/app/src/main/AndroidManifest.xml new file mode 100644 index 0000000..820c8b2 --- /dev/null +++ b/siro_driver/android/app/src/main/AndroidManifest.xml @@ -0,0 +1,188 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/siro_driver/android/app/src/main/cpp/CMakeLists.txt b/siro_driver/android/app/src/main/cpp/CMakeLists.txt new file mode 100755 index 0000000..c92732c --- /dev/null +++ b/siro_driver/android/app/src/main/cpp/CMakeLists.txt @@ -0,0 +1,11 @@ +cmake_minimum_required(VERSION 3.10.2) # 3.10.2 is fine, but no need to go as high as 3.31.5 +project(intaleq_driver) # Good + +# Add your C++ source file(s) to create a SHARED library. +add_library(native-lib SHARED native-lib.cpp) + +# Find the Android log library. +find_library(log-lib log) + +# Link your library against the log library. This is essential for debugging. +target_link_libraries(native-lib ${log-lib}) \ No newline at end of file diff --git a/siro_driver/android/app/src/main/cpp/native-lib.cpp b/siro_driver/android/app/src/main/cpp/native-lib.cpp new file mode 100755 index 0000000..fb6b777 --- /dev/null +++ b/siro_driver/android/app/src/main/cpp/native-lib.cpp @@ -0,0 +1,187 @@ + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include // Add this line + +#define LOG_TAG "NativeLib" +#define LOGD(...) __android_log_print(ANDROID_LOG_DEBUG, LOG_TAG, __VA_ARGS__) +#define LOGE(...) __android_log_print(ANDROID_LOG_ERROR, LOG_TAG, __VA_ARGS__) + +// Function to check for common root binaries +bool isRooted() +{ + std::string paths[] = { + "/system/app/Superuser.apk", + "/system/xbin/su", + "/system/bin/su", + "/system/bin/magisk", + "/system/xbin/magisk", + "/sbin/magisk"}; + + for (const auto &path : paths) + { + std::ifstream file(path); + if (file.good()) + { + return true; + } + } + return false; +} + +// Function to check for the presence of files or directories commonly associated with Frida. +bool checkFridaFiles() +{ + std::string fridaFiles[] = { + "/data/local/tmp/re.frida.server", // Common Frida server path + "/data/local/tmp/frida-server", + "/usr/lib/libfrida-gadget.so", // Frida gadget (injected library) + "/usr/lib64/libfrida-gadget.so", + "/data/local/re.frida.server", + + }; + + for (const auto &path : fridaFiles) + { + if (access(path.c_str(), F_OK) != -1) + { + LOGE("Frida file detected: %s", path.c_str()); + return true; + } + } + return false; +} + +// Checks for open ports commonly used by Frida. This is less reliable, as ports can be changed. +bool checkFridaPorts() +{ + int sock = socket(AF_INET, SOCK_STREAM, 0); + if (sock == -1) + { + return false; // Couldn't create socket, not a strong indicator. + } + + sockaddr_in sa; + memset(&sa, 0, sizeof(sa)); + sa.sin_family = AF_INET; + sa.sin_port = htons(27042); // Default Frida port + inet_pton(AF_INET, "127.0.0.1", &sa.sin_addr); + + if (connect(sock, (struct sockaddr *)&sa, sizeof(sa)) != -1) + { + LOGE("Frida default port (27042) is open."); + close(sock); + return true; + } + + close(sock); + return false; +} + +// Check the maps file of the current process for any suspicious entries. +bool checkMaps() +{ + std::ifstream mapsFile("/proc/self/maps"); + std::string line; + + if (mapsFile.is_open()) + { + while (std::getline(mapsFile, line)) + { + // Look for lines that indicate injected libraries, especially Frida. + if (line.find("frida") != std::string::npos || + line.find("gum-js-") != std::string::npos) + { // Gum is Frida's JavaScript engine + LOGE("Suspicious entry in /proc/self/maps: %s", line.c_str()); + return true; + } + } + mapsFile.close(); + } + else + { + LOGE("Could not open /proc/self/maps"); + return false; + } + return false; +} + +// Check loaded modules. +bool checkLoadedModules() +{ + bool found = false; + dl_iterate_phdr([](struct dl_phdr_info *info, size_t size, void *data) + { + bool *found_ptr = static_cast(data); + if (std::string(info->dlpi_name).find("frida") != std::string::npos) + { + LOGE("Frida module detected: %s", info->dlpi_name); + *found_ptr = true; + return 1; // Stop iterating + } + return 0; // Continue iterating + }, + &found); + + return found; +} + +// This is a simple ptrace check. More sophisticated checks are possible (and necessary for robust detection). +// bool checkPtrace() { +// // Attempt to ptrace ourselves. If another process is already tracing us, this will fail. +// if (ptrace(PTRACE_TRACEME, 0, 1, 0) < 0) { +// LOGE("ptrace failed. Debugger or tracer detected."); +// return true; // Likely being traced +// } +// // Detach. If attached, need to detach to not interfere. +// ptrace(PTRACE_DETACH, 0, 0, 0); +// return false; +//} + +extern "C" JNIEXPORT jboolean JNICALL +Java_com_siro_siro_1driver_RootDetection_isNativeRooted(JNIEnv *env, jobject /* this */) +{ + + if (isRooted()) + { + return JNI_TRUE; + } + + if (checkFridaFiles()) + { + return JNI_TRUE; + } + + if (checkFridaPorts()) + { + return JNI_TRUE; + } + if (checkMaps()) + { + return JNI_TRUE; + } + + if (checkLoadedModules()) + { + return JNI_TRUE; + } + + // if (checkPtrace()) { + // return JNI_TRUE; + // } + + return JNI_FALSE; +} \ No newline at end of file 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 new file mode 100644 index 0000000..f964ea0 --- /dev/null +++ b/siro_driver/android/app/src/main/kotlin/com/example/intaleq_driver/CarNavigationData.kt @@ -0,0 +1,44 @@ +package com.siro.siro_driver + +import android.os.Handler +import android.os.Looper + +/** + * كائن مشترك (Singleton) يحمل بيانات التوجيه في الوقت الحقيقي. + * يتم تحديثه من فلاتر عبر MethodChannel في MainActivity، + * ويتم قراءته من MyCarScreen و MapPresentation لعرض البيانات على شاشة السيارة. + */ +object CarNavigationData { + // --- بيانات الموقع --- + var currentLat: Double = 0.0 + var currentLng: Double = 0.0 + var currentBearing: Double = 0.0 + + // --- بيانات التوجيه --- + var currentInstruction: String = "في انتظار بدء الرحلة..." + var distanceToNextStepMeters: Double = 0.0 + var totalDistanceRemainingMeters: Double = 0.0 + var estimatedTimeRemainingSeconds: Double = 0.0 + var maneuverType: Int = 0 // يطابق قيم Maneuver.TYPE_* من Car App Library + + // --- حالة التوجيه --- + var isNavigating: Boolean = false + var currentSpeed: Double = 0.0 // km/h + + // --- نظام المستمعين --- + private val listeners = mutableListOf<() -> Unit>() + + fun addListener(listener: () -> Unit) { + listeners.add(listener) + } + + fun removeListener(listener: () -> Unit) { + listeners.remove(listener) + } + + fun notifyListeners() { + Handler(Looper.getMainLooper()).post { + listeners.forEach { it.invoke() } + } + } +} 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 new file mode 100644 index 0000000..84b2369 --- /dev/null +++ b/siro_driver/android/app/src/main/kotlin/com/example/intaleq_driver/MainActivity.kt @@ -0,0 +1,209 @@ +package com.siro.siro_driver + +import android.app.AlertDialog +import android.content.Intent +import android.os.Bundle +import android.util.Log +import android.widget.LinearLayout +import android.widget.ProgressBar +import android.widget.TextView +import androidx.core.view.setPadding +import com.scottyab.rootbeer.RootBeer +import io.flutter.embedding.android.FlutterFragmentActivity +import io.flutter.embedding.engine.FlutterEngine +import io.flutter.plugin.common.MethodChannel +import java.io.File +import java.util.Timer +import kotlin.concurrent.schedule + +class MainActivity : FlutterFragmentActivity() { + private val SECURITY_CHANNEL = "com.siro.siro_driver/security" + private val APP_CONTROL_CHANNEL = "com.siro.siro_driver/app_control" + private var appControlChannel: MethodChannel? = null + + override fun configureFlutterEngine(flutterEngine: FlutterEngine) { + super.configureFlutterEngine(flutterEngine) + + appControlChannel = + MethodChannel(flutterEngine.dartExecutor.binaryMessenger, APP_CONTROL_CHANNEL) + + // Channel for security checks (isRooted) + MethodChannel(flutterEngine.dartExecutor.binaryMessenger, SECURITY_CHANNEL) + .setMethodCallHandler { call, result -> + when (call.method) { + "isNativeRooted" -> result.success(isDeviceCompromised()) + else -> result.notImplemented() + } + } + + // Channel for app control (bringing to foreground) + appControlChannel?.setMethodCallHandler { call, result -> + when (call.method) { + "bringToForeground" -> { + val intent = + Intent(this, MainActivity::class.java).apply { + action = Intent.ACTION_MAIN + addCategory(Intent.CATEGORY_LAUNCHER) + addFlags( + Intent.FLAG_ACTIVITY_NEW_TASK or + Intent.FLAG_ACTIVITY_CLEAR_TOP or + Intent.FLAG_ACTIVITY_SINGLE_TOP + ) + } + try { + startActivity(intent) + result.success(true) + } catch (e: Exception) { + result.error("ACTIVITY_START_FAILED", e.message, e.stackTraceToString()) + } + } + else -> result.notImplemented() + } + } + + // ✅ Channel for Android Auto Navigation Updates + MethodChannel(flutterEngine.dartExecutor.binaryMessenger, "com.siro.siro_driver/car_navigation") + .setMethodCallHandler { call, result -> + when (call.method) { + "updateNavState" -> { + // تحديث شامل لجميع بيانات التوجيه دفعة واحدة + CarNavigationData.currentLat = call.argument("lat") ?: CarNavigationData.currentLat + CarNavigationData.currentLng = call.argument("lng") ?: CarNavigationData.currentLng + CarNavigationData.currentBearing = call.argument("bearing") ?: CarNavigationData.currentBearing + CarNavigationData.currentSpeed = call.argument("speed") ?: CarNavigationData.currentSpeed + CarNavigationData.currentInstruction = call.argument("instruction") ?: CarNavigationData.currentInstruction + CarNavigationData.distanceToNextStepMeters = call.argument("distanceToStep") ?: CarNavigationData.distanceToNextStepMeters + CarNavigationData.totalDistanceRemainingMeters = call.argument("totalDistance") ?: CarNavigationData.totalDistanceRemainingMeters + CarNavigationData.estimatedTimeRemainingSeconds = call.argument("eta") ?: CarNavigationData.estimatedTimeRemainingSeconds + CarNavigationData.maneuverType = call.argument("maneuver") ?: CarNavigationData.maneuverType + CarNavigationData.isNavigating = call.argument("isNavigating") ?: CarNavigationData.isNavigating + CarNavigationData.notifyListeners() + result.success(true) + } + "updateLocation" -> { + CarNavigationData.currentLat = call.argument("lat") ?: 0.0 + CarNavigationData.currentLng = call.argument("lng") ?: 0.0 + CarNavigationData.currentBearing = call.argument("bearing") ?: CarNavigationData.currentBearing + CarNavigationData.currentSpeed = call.argument("speed") ?: CarNavigationData.currentSpeed + CarNavigationData.notifyListeners() + result.success(true) + } + "updateInstruction" -> { + CarNavigationData.currentInstruction = call.argument("instruction") ?: "" + CarNavigationData.maneuverType = call.argument("maneuver") ?: 0 + CarNavigationData.distanceToNextStepMeters = call.argument("distanceToStep") ?: 0.0 + CarNavigationData.notifyListeners() + result.success(true) + } + "stopNavigation" -> { + CarNavigationData.isNavigating = false + CarNavigationData.currentInstruction = "تمت الرحلة بنجاح!" + CarNavigationData.notifyListeners() + result.success(true) + } + else -> result.notImplemented() + } + } + } + + override fun onCreate(savedInstanceState: Bundle?) { + super.onCreate(savedInstanceState) + if (isDeviceCompromised()) { + showSecurityWarningDialog() + } + // ✅ فحص هل التطبيق فتح بسبب زر "قبول" في النافذة + checkIntentForOverlayAccept(intent) + } + + override fun onNewIntent(intent: Intent) { + super.onNewIntent(intent) + setIntent(intent) + // ✅ فحص النية (Intent) عند فتح التطبيق من الخلفية + checkIntentForOverlayAccept(intent) + } + + // 🔥 هذه الدالة السحرية التي تلتقط زر القبول وترسله للتطبيق الرئيسي 🔥 + private fun checkIntentForOverlayAccept(intent: Intent) { + val acceptedTripId = intent.getStringExtra("acceptedTripId") + if (acceptedTripId != null) { + Log.d("MainActivity", "✅ Trip accepted via Native Intent: $acceptedTripId") + appControlChannel?.invokeMethod("onOverlayTripAccepted", acceptedTripId) + intent.removeExtra("acceptedTripId") // مسح النية لكي لا تتكرر + } + } + + // --- بقية كود الحماية الخاص بك --- + private fun isDeviceCompromised(): Boolean { + return try { + val isRootedByRootBeer = RootBeer(this).isRooted + isRootedByRootBeer + } catch (e: Exception) { + true + } + } + + private fun showSecurityWarningDialog() { + var secondsRemaining = 10 + val progressBar = + ProgressBar(this, null, android.R.attr.progressBarStyleHorizontal).apply { + max = 10 + progress = 10 + } + val textView = + TextView(this).apply { + text = getString(R.string.security_warning_message) + textAlignment = TextView.TEXT_ALIGNMENT_CENTER + } + val layout = + LinearLayout(this).apply { + orientation = LinearLayout.VERTICAL + setPadding(48) + addView(textView) + addView(progressBar) + } + val dialog = + AlertDialog.Builder(this) + .setTitle(getString(R.string.security_warning_title)) + .setView(layout) + .setCancelable(false) + .create() + dialog.show() + val timer = Timer() + timer.schedule(0, 1000) { + secondsRemaining-- + runOnUiThread { + progressBar.progress = secondsRemaining + if (secondsRemaining <= 0) { + timer.cancel() + dialog.dismiss() + clearAppDataAndExit() + } + } + } + } + + private fun clearAppDataAndExit() { + try { + Runtime.getRuntime().exec("pm clear $packageName") + } catch (e: Exception) { + clearCache() + clearAppData() + } + finishAffinity() + System.exit(0) + } + + private fun clearCache() { + deleteDir(cacheDir) + deleteDir(externalCacheDir) + } + + private fun clearAppData() {} + + private fun deleteDir(dir: File?): Boolean { + if (dir != null && dir.isDirectory) { + dir.list()?.forEach { deleteDir(File(dir, it)) } + } + return dir?.delete() ?: false + } +} 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 new file mode 100644 index 0000000..7f43dba --- /dev/null +++ b/siro_driver/android/app/src/main/kotlin/com/example/intaleq_driver/MapPresentation.kt @@ -0,0 +1,119 @@ +package com.siro.siro_driver + +import android.app.Presentation +import android.content.Context +import android.os.Bundle +import android.view.Display +import android.view.ViewGroup +import android.widget.FrameLayout +import org.maplibre.android.MapLibre +import org.maplibre.android.camera.CameraPosition +import org.maplibre.android.camera.CameraUpdateFactory +import org.maplibre.android.geometry.LatLng +import org.maplibre.android.maps.MapView +import org.maplibre.android.maps.MapLibreMap +import org.maplibre.android.maps.Style + +/** + * شاشة عرض وهمية (Presentation) تُرسم على VirtualDisplay الخاص بشاشة السيارة. + * تستخدم MapLibre Native SDK لعرض الخريطة بنفس ستايل تطبيق انطلق. + */ +class MapPresentation(outerContext: Context, display: Display) : Presentation(outerContext, display) { + lateinit var mapView: MapView + private var mapboxMap: MapLibreMap? = null + private var isMapReady = false + + private val locationListener: () -> Unit = { + updateCameraPosition() + } + + override fun onCreate(savedInstanceState: Bundle?) { + super.onCreate(savedInstanceState) + + MapLibre.getInstance(context) + + val root = FrameLayout(context) + root.layoutParams = ViewGroup.LayoutParams( + ViewGroup.LayoutParams.MATCH_PARENT, + ViewGroup.LayoutParams.MATCH_PARENT + ) + + mapView = MapView(context) + mapView.layoutParams = FrameLayout.LayoutParams( + FrameLayout.LayoutParams.MATCH_PARENT, + FrameLayout.LayoutParams.MATCH_PARENT + ) + + root.addView(mapView) + setContentView(root) + + mapView.onCreate(savedInstanceState) + mapView.getMapAsync { map -> + mapboxMap = map + + // تحميل ستايل خرائط انطلق من أصول فلاتر + val styleUrl = "asset://flutter_assets/assets/style.json" + map.setStyle(Style.Builder().fromUri(styleUrl)) { + isMapReady = true + updateCameraPosition() + } + + // إعدادات مناسبة لشاشة السيارة + map.uiSettings.isCompassEnabled = false + map.uiSettings.isLogoEnabled = false + map.uiSettings.isAttributionEnabled = false + } + + // الاستماع لتحديثات الموقع القادمة من فلاتر + CarNavigationData.addListener(locationListener) + } + + private fun updateCameraPosition() { + if (!isMapReady || mapboxMap == null) return + + val lat = CarNavigationData.currentLat + val lng = CarNavigationData.currentLng + val bearing = CarNavigationData.currentBearing + val speed = CarNavigationData.currentSpeed + + if (lat == 0.0 && lng == 0.0) return + + // حساب الزوم المناسب بناءً على السرعة (نفس المنطق في فلاتر) + val zoom = when { + speed < 15 -> 17.0 + speed < 40 -> 16.5 + speed < 70 -> 15.5 + speed < 100 -> 15.0 + else -> 14.0 + } + + // حساب الميل (Tilt) بناءً على السرعة لتأثير ثلاثي الأبعاد + val tilt = when { + speed < 10 -> 0.0 + speed < 40 -> 40.0 + else -> 55.0 + } + + val position = CameraPosition.Builder() + .target(LatLng(lat, lng)) + .zoom(zoom) + .bearing(bearing) + .tilt(tilt) + .build() + + mapboxMap?.animateCamera( + CameraUpdateFactory.newCameraPosition(position), + 1000 // انتقال سلس خلال ثانية + ) + } + + override fun onStart() { super.onStart(); mapView.onStart() } + override fun onStop() { super.onStop(); mapView.onStop() } + + fun onResume() { mapView.onResume() } + fun onPause() { mapView.onPause() } + fun onDestroy() { + CarNavigationData.removeListener(locationListener) + mapView.onDestroy() + } +} diff --git a/siro_driver/android/app/src/main/kotlin/com/example/intaleq_driver/MyApplication.kt b/siro_driver/android/app/src/main/kotlin/com/example/intaleq_driver/MyApplication.kt new file mode 100755 index 0000000..e5fa943 --- /dev/null +++ b/siro_driver/android/app/src/main/kotlin/com/example/intaleq_driver/MyApplication.kt @@ -0,0 +1,44 @@ +package com.siro.siro_driver + +import android.app.Application +import android.content.Intent +import io.flutter.embedding.engine.FlutterEngine +import io.flutter.embedding.engine.dart.DartExecutor +import io.flutter.plugin.common.MethodChannel + +class MyApplication : Application() { + companion object { + lateinit var instance: MyApplication + private set + + val flutterEngine: FlutterEngine by lazy { + FlutterEngine(instance).apply { + dartExecutor.executeDartEntrypoint(DartExecutor.DartEntrypoint.createDefault()) + } + } + } + + override fun onCreate() { + super.onCreate() + instance = this + + MethodChannel( + flutterEngine.dartExecutor.binaryMessenger, + "com.siro.siro_driver/app_lifecycle" + ) + .setMethodCallHandler { call, result -> + if (call.method == "bringAppToForeground") { + bringAppToForeground() + result.success(null) + } else { + result.notImplemented() + } + } + } + + private fun bringAppToForeground() { + val intent = Intent(applicationContext, MainActivity::class.java) + intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK or Intent.FLAG_ACTIVITY_REORDER_TO_FRONT) + startActivity(intent) + } +} diff --git a/siro_driver/android/app/src/main/kotlin/com/example/intaleq_driver/MyCarAppService.kt b/siro_driver/android/app/src/main/kotlin/com/example/intaleq_driver/MyCarAppService.kt new file mode 100644 index 0000000..e63255a --- /dev/null +++ b/siro_driver/android/app/src/main/kotlin/com/example/intaleq_driver/MyCarAppService.kt @@ -0,0 +1,24 @@ +package com.siro.siro_driver + +import android.content.pm.ApplicationInfo +import androidx.car.app.CarAppService +import androidx.car.app.Session +import androidx.car.app.validation.HostValidator + +class MyCarAppService : CarAppService() { + override fun createHostValidator(): HostValidator { + // في وضع التطوير: نسمح لجميع المستضيفين (DHU + أي تطبيق) + // في وضع الإنتاج: نسمح فقط لتطبيقات Android Auto و Google الرسمية + return if (applicationInfo.flags and ApplicationInfo.FLAG_DEBUGGABLE != 0) { + HostValidator.ALLOW_ALL_HOSTS_VALIDATOR + } else { + HostValidator.Builder(applicationContext) + .addAllowedHosts(androidx.car.app.R.array.hosts_allowlist_sample) + .build() + } + } + + override fun onCreateSession(): Session { + return MyCarSession() + } +} diff --git a/siro_driver/android/app/src/main/kotlin/com/example/intaleq_driver/MyCarScreen.kt b/siro_driver/android/app/src/main/kotlin/com/example/intaleq_driver/MyCarScreen.kt new file mode 100644 index 0000000..4fad4eb --- /dev/null +++ b/siro_driver/android/app/src/main/kotlin/com/example/intaleq_driver/MyCarScreen.kt @@ -0,0 +1,80 @@ +package com.siro.siro_driver + +import androidx.car.app.CarContext +import androidx.car.app.Screen +import androidx.car.app.model.Action +import androidx.car.app.model.CarColor +import androidx.car.app.model.CarIcon +import androidx.car.app.model.Distance +import androidx.car.app.model.MessageTemplate +import androidx.car.app.model.Template +import androidx.car.app.navigation.model.Maneuver +import androidx.car.app.navigation.model.NavigationTemplate +import androidx.car.app.navigation.model.RoutingInfo +import androidx.car.app.navigation.model.Step + +class MyCarScreen(carContext: CarContext) : Screen(carContext) { + + init { + CarNavigationData.addListener { + invalidate() + } + } + + override fun onGetTemplate(): Template { + // إذا لم يكن التوجيه نشطاً بعد، نعرض شاشة ترحيبية + if (!CarNavigationData.isNavigating) { + return MessageTemplate.Builder("مرحباً بك في انطلق درايفر\nبانتظار بدء رحلة جديدة...") + .setTitle("Intaleq Driver") + .setHeaderAction(Action.APP_ICON) + .build() + } + + // --- بناء معلومات التوجيه (Turn-by-Turn) --- + val maneuverType = mapIntaleqManeuverToCarManeuver(CarNavigationData.maneuverType) + val maneuver = Maneuver.Builder(maneuverType).build() + + val step = Step.Builder(CarNavigationData.currentInstruction) + .setManeuver(maneuver) + .build() + + val distanceToStep = Distance.create( + CarNavigationData.distanceToNextStepMeters, + Distance.UNIT_METERS + ) + + val routingInfo = RoutingInfo.Builder() + .setCurrentStep(step, distanceToStep) + .build() + + // --- بناء قالب التوجيه --- + return NavigationTemplate.Builder() + .setNavigationInfo(routingInfo) + .setActionStrip( + androidx.car.app.model.ActionStrip.Builder() + .addAction(Action.APP_ICON) + .build() + ) + .setBackgroundColor(CarColor.PRIMARY) + .build() + } + + /** + * تحويل أكواد الانعطاف الخاصة بتطبيق انطلق (NavigationController.currentManeuverModifier) + * إلى أكواد Maneuver الرسمية من مكتبة Android for Cars. + */ + private fun mapIntaleqManeuverToCarManeuver(intaleqCode: Int): Int { + return when (intaleqCode) { + 0 -> Maneuver.TYPE_STRAIGHT // مستقيم + 2 -> Maneuver.TYPE_TURN_NORMAL_RIGHT // يمين + 3 -> Maneuver.TYPE_TURN_SLIGHT_RIGHT // يمين خفيف + -2 -> Maneuver.TYPE_TURN_NORMAL_LEFT // يسار + -1 -> Maneuver.TYPE_TURN_SLIGHT_LEFT // يسار خفيف + 4 -> Maneuver.TYPE_DESTINATION // وصلت + 6 -> Maneuver.TYPE_ROUNDABOUT_ENTER_AND_EXIT_CW // دوار + 7 -> Maneuver.TYPE_KEEP_RIGHT // ابق يمين + -7 -> Maneuver.TYPE_KEEP_LEFT // ابق يسار + else -> Maneuver.TYPE_UNKNOWN + } + } +} diff --git a/siro_driver/android/app/src/main/kotlin/com/example/intaleq_driver/MyCarSession.kt b/siro_driver/android/app/src/main/kotlin/com/example/intaleq_driver/MyCarSession.kt new file mode 100644 index 0000000..358a593 --- /dev/null +++ b/siro_driver/android/app/src/main/kotlin/com/example/intaleq_driver/MyCarSession.kt @@ -0,0 +1,69 @@ +package com.siro.siro_driver + +import android.content.Intent +import android.hardware.display.DisplayManager +import android.hardware.display.VirtualDisplay +import android.os.Handler +import android.os.Looper +import androidx.car.app.AppManager +import androidx.car.app.Screen +import androidx.car.app.Session +import androidx.car.app.SurfaceCallback +import androidx.car.app.SurfaceContainer +import androidx.lifecycle.DefaultLifecycleObserver +import androidx.lifecycle.LifecycleOwner + +class MyCarSession : Session(), DefaultLifecycleObserver { + private var virtualDisplay: VirtualDisplay? = null + private var presentation: MapPresentation? = null + + override fun onCreateScreen(intent: Intent): Screen { + lifecycle.addObserver(this) + + val appManager = carContext.getCarService(AppManager::class.java) + appManager.setSurfaceCallback(object : SurfaceCallback { + override fun onSurfaceAvailable(surfaceContainer: SurfaceContainer) { + val surface = surfaceContainer.surface ?: return + val width = surfaceContainer.width + val height = surfaceContainer.height + val dpi = surfaceContainer.dpi + + val displayManager = carContext.getSystemService(DisplayManager::class.java) + virtualDisplay = displayManager.createVirtualDisplay( + "CarAppMapDisplay", + width, + height, + dpi, + surface, + DisplayManager.VIRTUAL_DISPLAY_FLAG_OWN_CONTENT_ONLY + ) + + virtualDisplay?.display?.let { display -> + Handler(Looper.getMainLooper()).post { + presentation = MapPresentation(carContext, display) + presentation?.show() + } + } + } + + override fun onVisibleAreaChanged(visibleArea: android.graphics.Rect) { + // تحديث المساحة المرئية إذا لزم الأمر + } + + override fun onSurfaceDestroyed(surfaceContainer: SurfaceContainer) { + Handler(Looper.getMainLooper()).post { + presentation?.dismiss() + presentation = null + } + virtualDisplay?.release() + virtualDisplay = null + } + }) + + return MyCarScreen(carContext) + } + + override fun onResume(owner: LifecycleOwner) { presentation?.onResume() } + override fun onPause(owner: LifecycleOwner) { presentation?.onPause() } + override fun onDestroy(owner: LifecycleOwner) { presentation?.onDestroy() } +} diff --git a/siro_driver/android/app/src/main/kotlin/com/example/intaleq_driver/RootDetection.kt b/siro_driver/android/app/src/main/kotlin/com/example/intaleq_driver/RootDetection.kt new file mode 100755 index 0000000..2be3f14 --- /dev/null +++ b/siro_driver/android/app/src/main/kotlin/com/example/intaleq_driver/RootDetection.kt @@ -0,0 +1,9 @@ +package com.siro.siro_driver + +object RootDetection { + init { + System.loadLibrary("native-lib") // Load the native library + } + + external fun isNativeRooted(): Boolean // Declare the external function +} diff --git a/siro_driver/android/app/src/main/kotlin/com/example/intaleq_driver/SafetyNetCheck.kt b/siro_driver/android/app/src/main/kotlin/com/example/intaleq_driver/SafetyNetCheck.kt new file mode 100755 index 0000000..2e4a1d4 --- /dev/null +++ b/siro_driver/android/app/src/main/kotlin/com/example/intaleq_driver/SafetyNetCheck.kt @@ -0,0 +1,104 @@ +import android.content.Context +import android.util.Base64 +import android.util.Log +import com.google.android.gms.safetynet.SafetyNet +import java.io.IOException +import java.security.GeneralSecurityException +import java.security.SecureRandom +import org.json.JSONObject + +object SafetyNetCheck { + + private const val TAG = "SafetyNetCheck" + + fun checkSafetyNet(context: Context, apiKey: String, callback: (Boolean) -> Unit) { + // Generate a nonce. A good nonce is large, random, and used only once. + val nonce = generateNonce() + + SafetyNet.getClient(context) + .attest(nonce, apiKey) + .addOnSuccessListener { response -> + // Success! Now, *verify* the response. + val jwsResult = response.jwsResult + if (jwsResult != null) { + try { + val isSafe = SafetyNetResponseVerifier.verify(jwsResult) + Log.d(TAG, "SafetyNet verification result: $isSafe") + callback(isSafe) // Now passing a *verified* result. + } catch (e: Exception) { + Log.e(TAG, "Error verifying SafetyNet response: ${e.message}", e) + callback(false) // Treat verification errors as failures. + } + } else { + Log.e(TAG, "SafetyNet jwsResult is null") + callback(false) // Null result is a failure. + } + } + .addOnFailureListener { e -> + Log.e(TAG, "SafetyNet attest API call failed: ${e.message}", e) + callback(false) // API call failure. + } + } + + // Helper function to generate a nonce. + private fun generateNonce(): ByteArray { + val byteGenerator = SecureRandom() + val nonce = ByteArray(32) + byteGenerator.nextBytes(nonce) + return nonce + } +} + +// Helper class to verify the SafetyNet response. +object SafetyNetResponseVerifier { + + private const val TAG = "SafetyNetVerifier" + + // This method *must* be implemented on a *backend server* for real security. + // This is just a *simplified example* for demonstration purposes and is + // *not* suitable for production without a backend check. + @Throws(GeneralSecurityException::class, IOException::class) + fun verify(jwsResult: String): Boolean { + // 1. Parse the JWS: Split into header, payload, and signature. + val parts = jwsResult.split(".") + if (parts.size != 3) { + Log.e(TAG, "Invalid JWS format") + return false // Invalid JWS format + } + + val header = parts[0] + val payload = parts[1] + val signature = parts[2] + + // 2. Decode the payload (it's Base64 encoded). + val decodedPayload = Base64.decode(payload, Base64.DEFAULT) + val payloadJson = JSONObject(String(decodedPayload)) + + // 3. Check the ctsProfileMatch and basicIntegrity. + val ctsProfileMatch = payloadJson.optBoolean("ctsProfileMatch", false) + val basicIntegrity = payloadJson.optBoolean("basicIntegrity", false) + + Log.d(TAG, "ctsProfileMatch: $ctsProfileMatch, basicIntegrity: $basicIntegrity") + + // 4. **CRITICAL: In a real application, you *must* send the JWS to your + // backend server for verification. The server should use the + // Google SafetyNet API (or a library that wraps it) to verify + // the signature and check the fields. This prevents attackers + // from tampering with the response on the device.** + // + // // Example (pseudo-code) of what the backend check would do: + // // GoogleCredential credential = ...; + // // SafetyNet safetyNet = new SafetyNet.Builder(httpTransport, jsonFactory) + // // .setApplicationName("YourAppName") + // // .setHttpRequestInitializer(credential) + // // .build(); + // // SafetyNetApi.VerifyJwsRequest request = safetyNet.safetynet().verifyJws(jwsResult); + // // SafetyNetApi.VerifyJwsResponse response = request.execute(); + // // return response.isValidSignature() && response.getCtsProfileMatch() && + // response.getBasicIntegrity(); + + // 5. For this *example* (without a backend), we'll just check the fields. + // This is *NOT SECURE* for production! + return ctsProfileMatch && basicIntegrity + } +} diff --git a/siro_driver/android/app/src/main/res/drawable-v21/launch_background.xml b/siro_driver/android/app/src/main/res/drawable-v21/launch_background.xml new file mode 100644 index 0000000..f74085f --- /dev/null +++ b/siro_driver/android/app/src/main/res/drawable-v21/launch_background.xml @@ -0,0 +1,12 @@ + + + + + + + + diff --git a/siro_driver/android/app/src/main/res/drawable/app_icon.png b/siro_driver/android/app/src/main/res/drawable/app_icon.png new file mode 100644 index 0000000..8b07675 Binary files /dev/null and b/siro_driver/android/app/src/main/res/drawable/app_icon.png differ diff --git a/siro_driver/android/app/src/main/res/drawable/launch_background.xml b/siro_driver/android/app/src/main/res/drawable/launch_background.xml new file mode 100644 index 0000000..304732f --- /dev/null +++ b/siro_driver/android/app/src/main/res/drawable/launch_background.xml @@ -0,0 +1,12 @@ + + + + + + + + diff --git a/siro_driver/android/app/src/main/res/mipmap-hdpi/ic_launcher.png b/siro_driver/android/app/src/main/res/mipmap-hdpi/ic_launcher.png new file mode 100644 index 0000000..db77bb4 Binary files /dev/null and b/siro_driver/android/app/src/main/res/mipmap-hdpi/ic_launcher.png differ diff --git a/siro_driver/android/app/src/main/res/mipmap-hdpi/launcher_icon.png b/siro_driver/android/app/src/main/res/mipmap-hdpi/launcher_icon.png new file mode 100644 index 0000000..458d624 Binary files /dev/null and b/siro_driver/android/app/src/main/res/mipmap-hdpi/launcher_icon.png differ diff --git a/siro_driver/android/app/src/main/res/mipmap-mdpi/ic_launcher.png b/siro_driver/android/app/src/main/res/mipmap-mdpi/ic_launcher.png new file mode 100644 index 0000000..17987b7 Binary files /dev/null and b/siro_driver/android/app/src/main/res/mipmap-mdpi/ic_launcher.png differ diff --git a/siro_driver/android/app/src/main/res/mipmap-mdpi/launcher_icon.png b/siro_driver/android/app/src/main/res/mipmap-mdpi/launcher_icon.png new file mode 100644 index 0000000..a791ff0 Binary files /dev/null and b/siro_driver/android/app/src/main/res/mipmap-mdpi/launcher_icon.png differ diff --git a/siro_driver/android/app/src/main/res/mipmap-xhdpi/ic_launcher.png b/siro_driver/android/app/src/main/res/mipmap-xhdpi/ic_launcher.png new file mode 100644 index 0000000..09d4391 Binary files /dev/null and b/siro_driver/android/app/src/main/res/mipmap-xhdpi/ic_launcher.png differ diff --git a/siro_driver/android/app/src/main/res/mipmap-xhdpi/launcher_icon.png b/siro_driver/android/app/src/main/res/mipmap-xhdpi/launcher_icon.png new file mode 100644 index 0000000..c8d1f66 Binary files /dev/null and b/siro_driver/android/app/src/main/res/mipmap-xhdpi/launcher_icon.png differ diff --git a/siro_driver/android/app/src/main/res/mipmap-xxhdpi/ic_launcher.png b/siro_driver/android/app/src/main/res/mipmap-xxhdpi/ic_launcher.png new file mode 100644 index 0000000..d5f1c8d Binary files /dev/null and b/siro_driver/android/app/src/main/res/mipmap-xxhdpi/ic_launcher.png differ diff --git a/siro_driver/android/app/src/main/res/mipmap-xxhdpi/launcher_icon.png b/siro_driver/android/app/src/main/res/mipmap-xxhdpi/launcher_icon.png new file mode 100644 index 0000000..399b5c7 Binary files /dev/null and b/siro_driver/android/app/src/main/res/mipmap-xxhdpi/launcher_icon.png differ diff --git a/siro_driver/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png b/siro_driver/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png new file mode 100644 index 0000000..4d6372e Binary files /dev/null and b/siro_driver/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png differ diff --git a/siro_driver/android/app/src/main/res/mipmap-xxxhdpi/launcher_icon.png b/siro_driver/android/app/src/main/res/mipmap-xxxhdpi/launcher_icon.png new file mode 100644 index 0000000..3a3a63f Binary files /dev/null and b/siro_driver/android/app/src/main/res/mipmap-xxxhdpi/launcher_icon.png differ diff --git a/siro_driver/android/app/src/main/res/raw/app_icon.png b/siro_driver/android/app/src/main/res/raw/app_icon.png new file mode 100755 index 0000000..96cc55a Binary files /dev/null and b/siro_driver/android/app/src/main/res/raw/app_icon.png differ diff --git a/siro_driver/android/app/src/main/res/raw/cancel.wav b/siro_driver/android/app/src/main/res/raw/cancel.wav new file mode 100755 index 0000000..dbe6e7c Binary files /dev/null and b/siro_driver/android/app/src/main/res/raw/cancel.wav differ diff --git a/siro_driver/android/app/src/main/res/raw/ding.wav b/siro_driver/android/app/src/main/res/raw/ding.wav new file mode 100755 index 0000000..c53cd50 Binary files /dev/null and b/siro_driver/android/app/src/main/res/raw/ding.wav differ diff --git a/siro_driver/android/app/src/main/res/raw/iphone_ringtone.wav b/siro_driver/android/app/src/main/res/raw/iphone_ringtone.wav new file mode 100755 index 0000000..aee314f Binary files /dev/null and b/siro_driver/android/app/src/main/res/raw/iphone_ringtone.wav differ diff --git a/siro_driver/android/app/src/main/res/raw/order.wav b/siro_driver/android/app/src/main/res/raw/order.wav new file mode 100755 index 0000000..b2b0ba2 Binary files /dev/null and b/siro_driver/android/app/src/main/res/raw/order.wav differ diff --git a/siro_driver/android/app/src/main/res/raw/order1.wav b/siro_driver/android/app/src/main/res/raw/order1.wav new file mode 100755 index 0000000..919fdda Binary files /dev/null and b/siro_driver/android/app/src/main/res/raw/order1.wav differ diff --git a/siro_driver/android/app/src/main/res/raw/promo.wav b/siro_driver/android/app/src/main/res/raw/promo.wav new file mode 100755 index 0000000..3bb2d03 Binary files /dev/null and b/siro_driver/android/app/src/main/res/raw/promo.wav differ diff --git a/siro_driver/android/app/src/main/res/raw/start.wav b/siro_driver/android/app/src/main/res/raw/start.wav new file mode 100755 index 0000000..0655506 Binary files /dev/null and b/siro_driver/android/app/src/main/res/raw/start.wav differ diff --git a/siro_driver/android/app/src/main/res/raw/tone1.mp3 b/siro_driver/android/app/src/main/res/raw/tone1.mp3 new file mode 100755 index 0000000..e32e61b Binary files /dev/null and b/siro_driver/android/app/src/main/res/raw/tone1.mp3 differ diff --git a/siro_driver/android/app/src/main/res/raw/tone2.wav b/siro_driver/android/app/src/main/res/raw/tone2.wav new file mode 100755 index 0000000..0582d47 Binary files /dev/null and b/siro_driver/android/app/src/main/res/raw/tone2.wav differ diff --git a/siro_driver/android/app/src/main/res/values-ar/strings.xml b/siro_driver/android/app/src/main/res/values-ar/strings.xml new file mode 100755 index 0000000..5b042da --- /dev/null +++ b/siro_driver/android/app/src/main/res/values-ar/strings.xml @@ -0,0 +1,8 @@ + + تحذير أمني + تم اكتشاف مشكلة أمنية أو تعديل على هذا الجهاز. لا يمكن + تشغيل التطبيق على هذا الجهاز. + إغلاق التطبيق + الجهاز آمن. الاستمرار بشكل طبيعي. + انطلق درايفر + \ No newline at end of file diff --git a/siro_driver/android/app/src/main/res/values-night/styles.xml b/siro_driver/android/app/src/main/res/values-night/styles.xml new file mode 100644 index 0000000..06952be --- /dev/null +++ b/siro_driver/android/app/src/main/res/values-night/styles.xml @@ -0,0 +1,18 @@ + + + + + + + diff --git a/siro_driver/android/app/src/main/res/values/strings.xml b/siro_driver/android/app/src/main/res/values/strings.xml new file mode 100755 index 0000000..ef164d3 --- /dev/null +++ b/siro_driver/android/app/src/main/res/values/strings.xml @@ -0,0 +1,21 @@ + + My App + + + high_importance_channel + e + Security Warning + AIzaSyB04YNW3LbvmQ5lX1t2bOwEU18- + Siro Driver + + A security issue or modification has been detected on + this device. The app cannot run on this device. + Exit App + Device is secure. Proceeding normally. + + + + location_service_channel + geolocator_channel + + \ No newline at end of file diff --git a/siro_driver/android/app/src/main/res/values/styles.xml b/siro_driver/android/app/src/main/res/values/styles.xml new file mode 100644 index 0000000..cb1ef88 --- /dev/null +++ b/siro_driver/android/app/src/main/res/values/styles.xml @@ -0,0 +1,18 @@ + + + + + + + diff --git a/siro_driver/android/app/src/main/res/xml/automotive_app_desc.xml b/siro_driver/android/app/src/main/res/xml/automotive_app_desc.xml new file mode 100644 index 0000000..c8e2801 --- /dev/null +++ b/siro_driver/android/app/src/main/res/xml/automotive_app_desc.xml @@ -0,0 +1,4 @@ + + + + diff --git a/siro_driver/android/app/src/main/res/xml/network_security_config.xml b/siro_driver/android/app/src/main/res/xml/network_security_config.xml new file mode 100644 index 0000000..334e84f --- /dev/null +++ b/siro_driver/android/app/src/main/res/xml/network_security_config.xml @@ -0,0 +1,21 @@ + + + + + + + + + + intaleq.xyz + + + + XJXX7XthMj5VlSHfvo1q73sY7orJ9Wle0X4avj0/Vwo= + + C5+lpZ7tcVwmwQIMcRtPbsQtWLABXhQzejna0wHESsl= + + + + + \ No newline at end of file diff --git a/siro_driver/android/app/src/profile/AndroidManifest.xml b/siro_driver/android/app/src/profile/AndroidManifest.xml new file mode 100644 index 0000000..399f698 --- /dev/null +++ b/siro_driver/android/app/src/profile/AndroidManifest.xml @@ -0,0 +1,7 @@ + + + + diff --git a/siro_driver/android/build.gradle b/siro_driver/android/build.gradle new file mode 100644 index 0000000..19c9098 --- /dev/null +++ b/siro_driver/android/build.gradle @@ -0,0 +1,66 @@ +buildscript { + ext.kotlin_version = '2.3.10' + repositories { + google() + mavenCentral() + } + dependencies { + classpath 'com.android.tools.build:gradle:8.13.2' + classpath 'com.google.gms:google-services:4.3.15' + classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version" + } +} + +allprojects { + repositories { + google() + mavenCentral() + } +} + +rootProject.buildDir = '../build' + +subprojects { + project.buildDir = "${rootProject.buildDir}/${project.name}" + project.evaluationDependsOn(':app') + + def setupAndroid = { + if (project.plugins.hasPlugin('com.android.library') || project.plugins.hasPlugin('com.android.application')) { + project.android { + if (namespace == null || namespace == "") { + namespace = project.group + } + compileSdk 36 + defaultConfig { + targetSdk 36 + } + compileOptions { + sourceCompatibility JavaVersion.VERSION_17 + targetCompatibility JavaVersion.VERSION_17 + } + if (project.hasProperty('kotlinOptions')) { + kotlinOptions { + jvmTarget = '17' + } + } + tasks.withType(org.jetbrains.kotlin.gradle.tasks.KotlinCompile).configureEach { + kotlinOptions { + jvmTarget = "17" + } + } + } + } + } + + if (project.state.executed) { + setupAndroid() + } else { + project.afterEvaluate { + setupAndroid() + } + } +} + +tasks.register("clean", Delete) { + delete rootProject.buildDir +} \ No newline at end of file diff --git a/siro_driver/android/gradle.properties b/siro_driver/android/gradle.properties new file mode 100644 index 0000000..67660bc --- /dev/null +++ b/siro_driver/android/gradle.properties @@ -0,0 +1,9 @@ +org.gradle.jvmargs=-Xmx4096M +android.useAndroidX=true +android.enableJetifier=true +android.defaults.buildfeatures.buildconfig=true +android.nonTransitiveRClass=true +android.nonFinalResIds=true +dart.obfuscation=true +android.enableR8.fullMode=true +org.gradle.java.home=/Library/Java/JavaVirtualMachines/temurin-17.jdk/Contents/Home diff --git a/siro_driver/android/gradle/wrapper/gradle-wrapper.properties b/siro_driver/android/gradle/wrapper/gradle-wrapper.properties new file mode 100644 index 0000000..02767eb --- /dev/null +++ b/siro_driver/android/gradle/wrapper/gradle-wrapper.properties @@ -0,0 +1,5 @@ +distributionBase=GRADLE_USER_HOME +distributionPath=wrapper/dists +zipStoreBase=GRADLE_USER_HOME +zipStorePath=wrapper/dists +distributionUrl=https\://services.gradle.org/distributions/gradle-8.13-all.zip diff --git a/siro_driver/android/settings.gradle b/siro_driver/android/settings.gradle new file mode 100644 index 0000000..1d96dde --- /dev/null +++ b/siro_driver/android/settings.gradle @@ -0,0 +1,24 @@ +pluginManagement { + def flutterSdkPath = { + def properties = new Properties() + file("local.properties").withInputStream { properties.load(it) } + def flutterSdkPath = properties.getProperty("flutter.sdk") + assert flutterSdkPath != null, "flutter.sdk not set in local.properties" + return flutterSdkPath + }() + includeBuild("$flutterSdkPath/packages/flutter_tools/gradle") + repositories { + google() + mavenCentral() + gradlePluginPortal() + } +} + +plugins { + id "dev.flutter.flutter-plugin-loader" version "1.0.0" + id "com.android.application" version '8.13.2' apply false + id "com.google.gms.google-services" version "4.3.15" apply false + id "org.jetbrains.kotlin.android" version "2.3.10" apply false +} + +include ":app" \ No newline at end of file diff --git a/siro_driver/assets/aggrement.wav b/siro_driver/assets/aggrement.wav new file mode 100644 index 0000000..c82ef23 Binary files /dev/null and b/siro_driver/assets/aggrement.wav differ diff --git a/siro_driver/assets/alert.wav b/siro_driver/assets/alert.wav new file mode 100644 index 0000000..8722536 Binary files /dev/null and b/siro_driver/assets/alert.wav differ diff --git a/siro_driver/assets/fonts/digit.ttf b/siro_driver/assets/fonts/digit.ttf new file mode 100755 index 0000000..5dbe6f9 Binary files /dev/null and b/siro_driver/assets/fonts/digit.ttf differ diff --git a/siro_driver/assets/images/1.png b/siro_driver/assets/images/1.png new file mode 100644 index 0000000..5cc4c86 Binary files /dev/null and b/siro_driver/assets/images/1.png differ diff --git a/siro_driver/assets/images/2.png b/siro_driver/assets/images/2.png new file mode 100644 index 0000000..69005af Binary files /dev/null and b/siro_driver/assets/images/2.png differ diff --git a/siro_driver/assets/images/3.png b/siro_driver/assets/images/3.png new file mode 100644 index 0000000..4040f40 Binary files /dev/null and b/siro_driver/assets/images/3.png differ diff --git a/siro_driver/assets/images/4.png b/siro_driver/assets/images/4.png new file mode 100644 index 0000000..15b4d56 Binary files /dev/null and b/siro_driver/assets/images/4.png differ diff --git a/siro_driver/assets/images/5.png b/siro_driver/assets/images/5.png new file mode 100644 index 0000000..4440755 Binary files /dev/null and b/siro_driver/assets/images/5.png differ diff --git a/siro_driver/assets/images/6.png b/siro_driver/assets/images/6.png new file mode 100644 index 0000000..cea38b9 Binary files /dev/null and b/siro_driver/assets/images/6.png differ diff --git a/siro_driver/assets/images/A.png b/siro_driver/assets/images/A.png new file mode 100755 index 0000000..246b9d2 Binary files /dev/null and b/siro_driver/assets/images/A.png differ diff --git a/siro_driver/assets/images/arrow.png b/siro_driver/assets/images/arrow.png new file mode 100755 index 0000000..3d3db75 Binary files /dev/null and b/siro_driver/assets/images/arrow.png differ diff --git a/siro_driver/assets/images/b.png b/siro_driver/assets/images/b.png new file mode 100755 index 0000000..b22f96c Binary files /dev/null and b/siro_driver/assets/images/b.png differ diff --git a/siro_driver/assets/images/brand.png b/siro_driver/assets/images/brand.png new file mode 100755 index 0000000..9282720 Binary files /dev/null and b/siro_driver/assets/images/brand.png differ diff --git a/siro_driver/assets/images/car.png b/siro_driver/assets/images/car.png new file mode 100755 index 0000000..5932743 Binary files /dev/null and b/siro_driver/assets/images/car.png differ diff --git a/siro_driver/assets/images/cashMTN.png b/siro_driver/assets/images/cashMTN.png new file mode 100644 index 0000000..bae958b Binary files /dev/null and b/siro_driver/assets/images/cashMTN.png differ diff --git a/siro_driver/assets/images/lady1.png b/siro_driver/assets/images/lady1.png new file mode 100755 index 0000000..2797b75 Binary files /dev/null and b/siro_driver/assets/images/lady1.png differ diff --git a/siro_driver/assets/images/logo.gif b/siro_driver/assets/images/logo.gif new file mode 100644 index 0000000..0eeabc0 Binary files /dev/null and b/siro_driver/assets/images/logo.gif differ diff --git a/siro_driver/assets/images/logo.png b/siro_driver/assets/images/logo.png new file mode 100644 index 0000000..610bef1 Binary files /dev/null and b/siro_driver/assets/images/logo.png differ diff --git a/siro_driver/assets/images/logo1.png b/siro_driver/assets/images/logo1.png new file mode 100644 index 0000000..eb862d0 Binary files /dev/null and b/siro_driver/assets/images/logo1.png differ diff --git a/siro_driver/assets/images/mtn.png b/siro_driver/assets/images/mtn.png new file mode 100644 index 0000000..6aa6618 Binary files /dev/null and b/siro_driver/assets/images/mtn.png differ diff --git a/siro_driver/assets/images/notepad.png b/siro_driver/assets/images/notepad.png new file mode 100755 index 0000000..9536a4d Binary files /dev/null and b/siro_driver/assets/images/notepad.png differ diff --git a/siro_driver/assets/images/on1.png b/siro_driver/assets/images/on1.png new file mode 100644 index 0000000..4f75853 Binary files /dev/null and b/siro_driver/assets/images/on1.png differ diff --git a/siro_driver/assets/images/on2.png b/siro_driver/assets/images/on2.png new file mode 100644 index 0000000..83b4e38 Binary files /dev/null and b/siro_driver/assets/images/on2.png differ diff --git a/siro_driver/assets/images/on3.png b/siro_driver/assets/images/on3.png new file mode 100644 index 0000000..3fe9574 Binary files /dev/null and b/siro_driver/assets/images/on3.png differ diff --git a/siro_driver/assets/images/picker.png b/siro_driver/assets/images/picker.png new file mode 100755 index 0000000..6a35bf3 Binary files /dev/null and b/siro_driver/assets/images/picker.png differ diff --git a/siro_driver/assets/images/s.png b/siro_driver/assets/images/s.png new file mode 100755 index 0000000..dd3b7b8 Binary files /dev/null and b/siro_driver/assets/images/s.png differ diff --git a/siro_driver/assets/images/shamCash.png b/siro_driver/assets/images/shamCash.png new file mode 100644 index 0000000..ab13ac0 Binary files /dev/null and b/siro_driver/assets/images/shamCash.png differ diff --git a/siro_driver/assets/images/shamcashsend.png b/siro_driver/assets/images/shamcashsend.png new file mode 100644 index 0000000..0814517 Binary files /dev/null and b/siro_driver/assets/images/shamcashsend.png differ diff --git a/siro_driver/assets/images/syriatel.jpeg b/siro_driver/assets/images/syriatel.jpeg new file mode 100644 index 0000000..331117b Binary files /dev/null and b/siro_driver/assets/images/syriatel.jpeg differ diff --git a/siro_driver/assets/order.mp3 b/siro_driver/assets/order.mp3 new file mode 100755 index 0000000..b2b0ba2 Binary files /dev/null and b/siro_driver/assets/order.mp3 differ diff --git a/siro_driver/assets/order1.wav b/siro_driver/assets/order1.wav new file mode 100755 index 0000000..919fdda Binary files /dev/null and b/siro_driver/assets/order1.wav differ diff --git a/siro_driver/bubble-master/.gitignore b/siro_driver/bubble-master/.gitignore new file mode 100755 index 0000000..af412f1 --- /dev/null +++ b/siro_driver/bubble-master/.gitignore @@ -0,0 +1,7 @@ +.DS_Store +.dart_tool/ + +.packages +.pub/ + +build/ diff --git a/siro_driver/bubble-master/.metadata b/siro_driver/bubble-master/.metadata new file mode 100755 index 0000000..27b30b4 --- /dev/null +++ b/siro_driver/bubble-master/.metadata @@ -0,0 +1,10 @@ +# This file tracks properties of this Flutter project. +# Used by Flutter tool to assess capabilities and perform upgrades etc. +# +# This file should be version controlled and should not be manually edited. + +version: + revision: f4abaa0735eba4dfd8f33f73363911d63931fe03 + channel: stable + +project_type: plugin diff --git a/siro_driver/bubble-master/CHANGELOG.md b/siro_driver/bubble-master/CHANGELOG.md new file mode 100755 index 0000000..1c63343 --- /dev/null +++ b/siro_driver/bubble-master/CHANGELOG.md @@ -0,0 +1,14 @@ +## 0.0.1 + +* Created and implemented startBubbleHead and closeBubbleHead usecases for bubble head package + + +## 0.0.2 +* Fix read-me documentation + +## 0.0.3 +* Fix read-me documentation (added `Buy me a coffee link`) + +## 0.0.4 +* Added optional parameter to enable or disable send-app-to-background +* Updated documentation \ No newline at end of file diff --git a/siro_driver/bubble-master/LICENSE b/siro_driver/bubble-master/LICENSE new file mode 100755 index 0000000..a7446aa --- /dev/null +++ b/siro_driver/bubble-master/LICENSE @@ -0,0 +1,21 @@ +MIT License + +Copyright (c) 2021 chrisoftech + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. diff --git a/siro_driver/bubble-master/README.md b/siro_driver/bubble-master/README.md new file mode 100755 index 0000000..63dffed --- /dev/null +++ b/siro_driver/bubble-master/README.md @@ -0,0 +1,128 @@ +# bubble_head + + +A flutter plugin to enable you launch a bubble while putting your application to background and upon clicking the bubble brings your application back to foreground + +## Getting Started +### Add dependency + +```yaml + dependencies: + bubble_head: ^0.0.4 +``` + + +### Add in android-manifest file (**../main/AndroidManifest.xml**) + +If you are unsure on where to do this, you can reference the example project AndroidManifest.xml file [here](example/android/app/src/main/AndroidManifest.xml) + + +Add `SYSTEM_ALERT_WINDOW` permission in manifest +```xml + +``` + +NOTE: For best UX practices, you should request for `SYSTEM_ALERT_WINDOW` permission on your application launch (if permission `status` is not granted) +To request for permission, we advise the use of this [package](https://pub.dev/packages/permission_handler) + + +Add `intent-filter` in activity tag + +```xml + + + + +``` + +Add `service` in application tag +```xml + +``` + +### Note: To set bubble icon, create `assets/images` folder path and add your png icon with name `icon.png` to the directory (ensure to import assets in your `pubspec.yaml` file) + +**GIF illustration** + +[![](example/assets/images/bubble_head_example.gif)](example/assets/images/bubble_head_example.gif "Bubble-head example") + +### Examples + +**To start bubble** +[This puts your app in background and can be re-launched (brought to foreground) on tap of the bubble] + +```dart + Bubble _bubble = new Bubble(); + + Future startBubbleHead() async { + + try { + await _bubble.startBubbleHead(); + } on PlatformException { + print('Failed to call startBubbleHead'); + } + } +``` + +**To stop/close bubble** + +```dart + Bubble _bubble = new Bubble(); + + Future stopBubbleHead() async { + + try { + await _bubble.stopBubbleHead(); + } on PlatformException { + print('Failed to call stopBubbleHead'); + } + } +``` + +You can prevent the default action of putting your application in background when starting `bubble_head` by setting `sendAppToBackground` parameter when starting bubble head (if you choose to use another means of sending your application to background) + +```dart + Bubble _bubble = new Bubble(); + + Future startBubbleHead() async { + + try { + // this will only display the bubble-head without sending the application to background + await _bubble.startBubbleHead(sendAppToBackground: false); + } on PlatformException { + print('Failed to call startBubbleHead'); + } + } +``` + + +**Other parameters** +(You can choose to tweak **optional** parameters when initializing bubble) + + +```dart + Bubble({ + this.shouldBounce = true, + this.allowDragToClose = true, + this.showCloseButton = false, + }); +``` +```dart + Bubble().startBubbleHead(sendAppToBackground: true); +``` + +**Parameter Definition** +- shouldBounce - Defaults to `True` +(Adds animation to bubble-head) +- allowDragToClose - Defaults to `True` +(Enables dragging bubble to bottom screen to exit) +- showCloseButton - Defaults to `False` +(Adds a close button icon to the bubble-head) +- sendAppToBackground - Defaults to `True` +(Sends application to background) + +## [Buy me a Coffee](https://www.buymeacoffee.com/dsaved) + diff --git a/siro_driver/bubble-master/android/.gitignore b/siro_driver/bubble-master/android/.gitignore new file mode 100755 index 0000000..4c9e2c6 --- /dev/null +++ b/siro_driver/bubble-master/android/.gitignore @@ -0,0 +1,8 @@ +*.iml +.gradle +/local.properties +/.idea/workspace.xml +/.idea/libraries +.DS_Store +/build +/captures diff --git a/siro_driver/bubble-master/android/build.gradle b/siro_driver/bubble-master/android/build.gradle new file mode 100755 index 0000000..59519d5 --- /dev/null +++ b/siro_driver/bubble-master/android/build.gradle @@ -0,0 +1,35 @@ +group 'com.dsaved.bubblehead.bubble' +version '1.0' + +buildscript { + repositories { + google() + mavenCentral() + } + + dependencies { + classpath 'com.android.tools.build:gradle:4.1.3' + } +} + +rootProject.allprojects { + repositories { + google() + mavenCentral() + } +} + +apply plugin: 'com.android.library' + +android { + namespace 'com.dsaved.bubblehead.bubble' + compileSdkVersion 36 + + defaultConfig { + minSdkVersion 16 + } +} + +dependencies { + implementation 'com.google.android.material:material:1.4.0' +} diff --git a/siro_driver/bubble-master/android/gradle.properties b/siro_driver/bubble-master/android/gradle.properties new file mode 100755 index 0000000..46c1f16 --- /dev/null +++ b/siro_driver/bubble-master/android/gradle.properties @@ -0,0 +1,3 @@ +org.gradle.jvmargs=-Xmx1536M +android.useAndroidX=true +android.enableJetifier=true diff --git a/siro_driver/bubble-master/android/gradle/wrapper/gradle-wrapper.properties b/siro_driver/bubble-master/android/gradle/wrapper/gradle-wrapper.properties new file mode 100755 index 0000000..127680f --- /dev/null +++ b/siro_driver/bubble-master/android/gradle/wrapper/gradle-wrapper.properties @@ -0,0 +1,6 @@ +#Thu Jul 10 12:15:00 EET 2025 +distributionBase=GRADLE_USER_HOME +distributionPath=wrapper/dists +distributionUrl=https\://services.gradle.org/distributions/gradle-8.9-bin.zip +zipStoreBase=GRADLE_USER_HOME +zipStorePath=wrapper/dists diff --git a/siro_driver/bubble-master/android/settings.gradle b/siro_driver/bubble-master/android/settings.gradle new file mode 100755 index 0000000..a1c42ae --- /dev/null +++ b/siro_driver/bubble-master/android/settings.gradle @@ -0,0 +1 @@ +rootProject.name = 'bubble' diff --git a/siro_driver/bubble-master/android/src/main/AndroidManifest.xml b/siro_driver/bubble-master/android/src/main/AndroidManifest.xml new file mode 100755 index 0000000..adf9d32 --- /dev/null +++ b/siro_driver/bubble-master/android/src/main/AndroidManifest.xml @@ -0,0 +1,4 @@ + + + diff --git a/siro_driver/bubble-master/android/src/main/java/com/dsaved/bubblehead/bubble/BubbleHeadService.java b/siro_driver/bubble-master/android/src/main/java/com/dsaved/bubblehead/bubble/BubbleHeadService.java new file mode 100755 index 0000000..7b86119 --- /dev/null +++ b/siro_driver/bubble-master/android/src/main/java/com/dsaved/bubblehead/bubble/BubbleHeadService.java @@ -0,0 +1,456 @@ +package com.dsaved.bubblehead.bubble; + +import android.annotation.SuppressLint; +import android.app.Service; +import android.content.ComponentName; +import android.content.Context; +import android.content.Intent; +import android.content.res.Configuration; +import android.graphics.Bitmap; +import android.graphics.BitmapFactory; +import android.graphics.PixelFormat; +import android.graphics.Point; +import android.os.Build; +import android.os.CountDownTimer; +import android.os.Handler; +import android.os.IBinder; +import android.util.Base64; +import android.view.Gravity; +import android.view.LayoutInflater; +import android.view.MotionEvent; +import android.view.View; +import android.view.WindowManager; +import android.widget.ImageView; + +public class BubbleHeadService extends Service implements View.OnClickListener { + private WindowManager mWindowManager; + private View mFloatingWidgetView; + private ImageView remove_image_view; + private final Point szWindow = new Point(); + private View removeFloatingWidgetView; + private static boolean showCloseButton = false, _bounce = true, _dragToClose = true, _sendAppToBackground = true; + private boolean _continueToSnap = false; + + private int x_init_cord, y_init_cord, x_init_margin, y_init_margin; + static Bitmap _image; + + // Set the value for showing close button to true or false + public static void shouldShowCloseButton(Boolean show) { + showCloseButton = show; + } + + // set to true to enable bouncing + public static void bounce(Boolean bounce) { + _bounce = bounce; + } + + // Set the value for drag to close to enable dragging bubble to close + public static void dragToClose(Boolean dragToClose) { + _dragToClose = dragToClose; + } + + public static void sendAppToBackground(Boolean sendAppToBackground) { + _sendAppToBackground = sendAppToBackground; + } + + public static void startService(Context activity, String image) { + byte[] decodedBytes = Base64.decode(image, Base64.DEFAULT); + _image = BitmapFactory.decodeByteArray(decodedBytes, 0, decodedBytes.length); + + // send application to background if this is true + if (_sendAppToBackground) { + Intent i = new Intent(); + i.setAction(Intent.ACTION_MAIN); + i.addCategory(Intent.CATEGORY_HOME); + activity.startActivity(i); + } + + Intent intent = new Intent(activity, BubbleHeadService.class); + activity.startService(intent); + } + + public static void stopService(Context activity) { + Intent intent = new Intent(activity, BubbleHeadService.class); + activity.stopService(intent); + } + + // create an empty constructor + public BubbleHeadService() { + } + + @Override + public IBinder onBind(Intent intent) { + return null; + } + + @SuppressLint({"ClickableViewAccessibility", "InflateParams"}) + @Override + public void onCreate() { + super.onCreate(); + // init WindowManager + mWindowManager = (WindowManager) getSystemService(WINDOW_SERVICE); + getWindowManagerDefaultDisplay(); + + // Init LayoutInflater + LayoutInflater inflater = (LayoutInflater) getSystemService(LAYOUT_INFLATER_SERVICE); + + // Inflate the removing view layout we created + removeFloatingWidgetView = inflater.inflate(R.layout.bubble_head_remove_widget, null); + + // Add the view to the window. + WindowManager.LayoutParams paramRemove; + if (Build.VERSION.SDK_INT < Build.VERSION_CODES.O) { + paramRemove = new WindowManager.LayoutParams( + WindowManager.LayoutParams.WRAP_CONTENT, + WindowManager.LayoutParams.WRAP_CONTENT, + WindowManager.LayoutParams.TYPE_PHONE, + WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE, + PixelFormat.TRANSLUCENT); + } else { + paramRemove = new WindowManager.LayoutParams( + WindowManager.LayoutParams.WRAP_CONTENT, + WindowManager.LayoutParams.WRAP_CONTENT, + WindowManager.LayoutParams.TYPE_APPLICATION_OVERLAY, + WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE, + PixelFormat.TRANSLUCENT); + } + + // Specify the view position + paramRemove.gravity = Gravity.TOP | Gravity.LEFT; + + // Initially the Removing widget view is not visible, so set visibility to GONE + removeFloatingWidgetView.setVisibility(View.GONE); + remove_image_view = (ImageView) removeFloatingWidgetView.findViewById(R.id.remove_img); + + // Add the view to the window + mWindowManager.addView(removeFloatingWidgetView, paramRemove); + + // Inflate the floating view layout we created + mFloatingWidgetView = inflater.inflate(R.layout.layout_bubble_head, null); + + // Add the view to the window. + WindowManager.LayoutParams params; + if (Build.VERSION.SDK_INT < Build.VERSION_CODES.O) { + params = new WindowManager.LayoutParams( + WindowManager.LayoutParams.WRAP_CONTENT, + WindowManager.LayoutParams.WRAP_CONTENT, + WindowManager.LayoutParams.TYPE_PHONE, + WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE, + PixelFormat.TRANSLUCENT); + } else { + params = new WindowManager.LayoutParams( + WindowManager.LayoutParams.WRAP_CONTENT, + WindowManager.LayoutParams.WRAP_CONTENT, + WindowManager.LayoutParams.TYPE_APPLICATION_OVERLAY, + WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE, + PixelFormat.TRANSLUCENT); + } + + // Specify the view position + params.gravity = Gravity.TOP | Gravity.LEFT; + + // Initially view will be added to top-left corner, you change x-y coordinates according to your need + params.x = 0; + params.y = 100; + + // Add the view to the window + mWindowManager.addView(mFloatingWidgetView, params); + + //set image to chatHead + ImageView chatHeadImage = mFloatingWidgetView.findViewById(R.id.chat_head_profile_iv); + chatHeadImage.setImageBitmap(_image); + + // find id of close image button + ImageView closeBubbleHead = mFloatingWidgetView.findViewById(R.id.close_bubble_head); + closeBubbleHead.setOnClickListener(this); + if (!showCloseButton) { + closeBubbleHead.setVisibility(View.GONE); + } + + implementTouchListenerToFloatingWidgetView(); + } + + private void getWindowManagerDefaultDisplay() { + mWindowManager.getDefaultDisplay().getSize(szWindow); + } + + @SuppressLint("ClickableViewAccessibility") + private void implementTouchListenerToFloatingWidgetView() { + _continueToSnap = true; + // Drag and move chat head using user's touch action. + mFloatingWidgetView.findViewById(R.id.root_container); + mFloatingWidgetView.setOnTouchListener(new View.OnTouchListener() { + long time_start = 0, time_end = 0; + + boolean isLongClick = false; + boolean inBounded = false; + int remove_img_width = 0, remove_img_height = 0; + + final Handler handler_longClick = new Handler(); + final Runnable runnable_longClick = new Runnable() { + @Override + public void run() { + isLongClick = true; + removeFloatingWidgetView.setVisibility(View.VISIBLE); + onFloatingWidgetLongClick(); + } + }; + + @Override + public boolean onTouch(View v, MotionEvent event) { + WindowManager.LayoutParams layoutParams = (WindowManager.LayoutParams) mFloatingWidgetView.getLayoutParams(); + + int x_cord = (int) event.getRawX(); + int y_cord = (int) event.getRawY(); + + int x_cord_Destination, y_cord_Destination; + + switch (event.getAction()) { + case MotionEvent.ACTION_DOWN: + time_start = System.currentTimeMillis(); + + if (_dragToClose) { + handler_longClick.postDelayed(runnable_longClick, 100); + } + remove_img_width = remove_image_view.getLayoutParams().width; + remove_img_height = remove_image_view.getLayoutParams().height; + + x_init_cord = x_cord; + y_init_cord = y_cord; + + // remember the initial position. + x_init_margin = layoutParams.x; + y_init_margin = layoutParams.y; + return true; + case MotionEvent.ACTION_UP: + isLongClick = false; + removeFloatingWidgetView.setVisibility(View.GONE); + remove_image_view.getLayoutParams().height = remove_img_height; + remove_image_view.getLayoutParams().width = remove_img_width; + + if (_dragToClose) { + handler_longClick.removeCallbacks(runnable_longClick); + } + + // If user drag and drop the floating widget view + // into remove view then stop the service + if (inBounded) { + stopSelf(); + inBounded = false; + break; + } + + // Difference between initial coordinate and current coordinate + int x_diff = x_cord - x_init_cord; + int y_diff = y_cord - y_init_cord; + + // check if action move is little as move happen on view with just a tap + if (Math.abs(x_diff) < 5 && Math.abs(y_diff) < 5) { + time_end = System.currentTimeMillis(); + // only perform click if time is less than 200ms + if ((time_end - time_start) < 200) { + onFloatingWidgetClick(); + } + } + + y_cord_Destination = y_init_margin + y_diff; + + int barHeight = getStatusBarHeight(); + if (y_cord_Destination < 0) { + y_cord_Destination = 0; + } else if (y_cord_Destination + (mFloatingWidgetView.getHeight() + barHeight) > szWindow.y) { + y_cord_Destination = szWindow.y - (mFloatingWidgetView.getHeight() + barHeight); + } + + layoutParams.y = y_cord_Destination; + + inBounded = false; + + // reset position + resetPosition(x_cord); + return true; + case MotionEvent.ACTION_MOVE: + int x_diff_move = x_cord - x_init_cord; + int y_diff_move = y_cord - y_init_cord; + + x_cord_Destination = x_init_margin + x_diff_move; + y_cord_Destination = y_init_margin + y_diff_move; + + // If user long click the floating view, update remove view + if (isLongClick) { + int x_bound_left = szWindow.x / 2 - (int) (remove_img_width * 1.5); + int x_bound_right = szWindow.x / 2 + (int) (remove_img_width * 1.5); + int y_bound_top = szWindow.y - (int) (remove_img_height * 1.5); + + // If Floating view comes under Remove View update Window Manager + if ((x_cord >= x_bound_left && x_cord <= x_bound_right) && y_cord >= y_bound_top) { + inBounded = true; + + int x_cord_remove = (int) ((szWindow.x - (remove_img_height * 1.5)) / 2); + int y_cord_remove = (int) (szWindow.y - ((remove_img_width * 1.5) + getStatusBarHeight())); + + if (remove_image_view.getLayoutParams().height == remove_img_height) { + WindowManager.LayoutParams param_remove = (WindowManager.LayoutParams) removeFloatingWidgetView.getLayoutParams(); + param_remove.x = x_cord_remove; + param_remove.y = y_cord_remove; + + mWindowManager.updateViewLayout(removeFloatingWidgetView, param_remove); + } + + layoutParams.x = x_cord_remove + (Math.abs(removeFloatingWidgetView.getWidth() - mFloatingWidgetView.getWidth())) / 2; + layoutParams.y = y_cord_remove + (Math.abs(removeFloatingWidgetView.getHeight() - mFloatingWidgetView.getHeight())) / 2; + + // Update the layout with new X & Y coordinate + mWindowManager.updateViewLayout(mFloatingWidgetView, layoutParams); + break; + } else { + // If Floating window gets out of the Remove view update Remove view again + inBounded = false; + remove_image_view.getLayoutParams().height = remove_img_height; + remove_image_view.getLayoutParams().width = remove_img_width; +// onFloatingWidgetClick(); + } + + } + + layoutParams.x = x_cord_Destination; + layoutParams.y = y_cord_Destination; + + // Update the layout with new X & Y coordinate + mWindowManager.updateViewLayout(mFloatingWidgetView, layoutParams); + return true; + } + return false; + } + }); + } + + @Override + public void onClick(View v) { + int id = v.getId(); + if (id == R.id.close_bubble_head) { + stopSelf(); + } + } + + private void onFloatingWidgetLongClick() { + // Get remove Floating view params + WindowManager.LayoutParams removeParams = (WindowManager.LayoutParams) removeFloatingWidgetView.getLayoutParams(); + + // get x and y coordinates of remove view + int x_cord = (szWindow.x - removeFloatingWidgetView.getWidth()) / 2; + int y_cord = szWindow.y - (removeFloatingWidgetView.getHeight() + getStatusBarHeight()); + + removeParams.x = x_cord; + removeParams.y = y_cord; + + // Update Remove view params + mWindowManager.updateViewLayout(removeFloatingWidgetView, removeParams); + } + + // Reset position of Floating Widget view on dragging + private void resetPosition(int x_cord_now) { + if (_continueToSnap) { + if (x_cord_now <= szWindow.x / 2) { + snapToLeft(x_cord_now); + } else { + snapToRight(x_cord_now); + } + } + } + + private void snapToLeft(final int current_x_cord) { + final int x = szWindow.x - current_x_cord; + new CountDownTimer(500, 5) { + final WindowManager.LayoutParams mParams = (WindowManager.LayoutParams) mFloatingWidgetView.getLayoutParams(); + + public void onTick(long t) { + long step = (500 - t) / 5; + mParams.x = -(int) (current_x_cord * current_x_cord * step); + if (_bounce) { + mParams.x = -(int) (double) bounceValue(step, x); + } + mWindowManager.updateViewLayout(mFloatingWidgetView, mParams); + } + + public void onFinish() { + mParams.x = 0; + mWindowManager.updateViewLayout(mFloatingWidgetView, mParams); + } + }.start(); + } + + private void snapToRight(final int current_x_cord) { + new CountDownTimer(500, 5) { + final WindowManager.LayoutParams mParams = (WindowManager.LayoutParams) mFloatingWidgetView.getLayoutParams(); + + public void onTick(long t) { + long step = (500 - t) / 5; + mParams.x = (int) (szWindow.x + (current_x_cord * current_x_cord * step) - mFloatingWidgetView.getWidth()); + if (_bounce) { + mParams.x = szWindow.x + (int) (double) bounceValue(step, current_x_cord) - mFloatingWidgetView.getWidth(); + } + mWindowManager.updateViewLayout(mFloatingWidgetView, mParams); + } + + public void onFinish() { + mParams.x = szWindow.x - mFloatingWidgetView.getWidth(); + mWindowManager.updateViewLayout(mFloatingWidgetView, mParams); + } + }.start(); + } + + private double bounceValue(long step, long scale) { + return scale * Math.exp(-0.15 * step) * Math.cos(0.08 * step); + } + + private int getStatusBarHeight() { + return (int) Math.ceil(25 * getApplicationContext().getResources().getDisplayMetrics().density); + } + + @Override + public void onConfigurationChanged(Configuration newConfig) { + super.onConfigurationChanged(newConfig); + + getWindowManagerDefaultDisplay(); + WindowManager.LayoutParams layoutParams = (WindowManager.LayoutParams) mFloatingWidgetView.getLayoutParams(); + + if (newConfig.orientation == Configuration.ORIENTATION_LANDSCAPE) { + if (layoutParams.y + (mFloatingWidgetView.getHeight() + getStatusBarHeight()) > szWindow.y) { + layoutParams.y = szWindow.y - (mFloatingWidgetView.getHeight() + getStatusBarHeight()); + mWindowManager.updateViewLayout(mFloatingWidgetView, layoutParams); + } + + if (layoutParams.x != 0 && layoutParams.x < szWindow.x) { + resetPosition(szWindow.x); + } + } else if (newConfig.orientation == Configuration.ORIENTATION_PORTRAIT) { + if (layoutParams.x > szWindow.x) { + resetPosition(szWindow.x); + } + } + } + + private void onFloatingWidgetClick() { + _continueToSnap = false; + // bring the application to front + Intent it = new Intent("intent.bring.app.to.foreground"); + it.setComponent(new ComponentName(getPackageName(), getApplicationContext().getPackageName() + ".MainActivity")); + it.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK); + getApplicationContext().startActivity(it); + + // stop the service + stopSelf(); + } + + @Override + public void onDestroy() { + super.onDestroy(); + if (mFloatingWidgetView != null) { + mWindowManager.removeView(mFloatingWidgetView); + } + if (removeFloatingWidgetView != null) { + mWindowManager.removeView(removeFloatingWidgetView); + } + } +} diff --git a/siro_driver/bubble-master/android/src/main/java/com/dsaved/bubblehead/bubble/BubblePlugin.java b/siro_driver/bubble-master/android/src/main/java/com/dsaved/bubblehead/bubble/BubblePlugin.java new file mode 100755 index 0000000..1dc7421 --- /dev/null +++ b/siro_driver/bubble-master/android/src/main/java/com/dsaved/bubblehead/bubble/BubblePlugin.java @@ -0,0 +1,95 @@ +package com.dsaved.bubblehead.bubble; + +import android.content.Context; +import android.os.Build; +import android.provider.Settings; + +import androidx.annotation.NonNull; +import androidx.annotation.RequiresApi; + +import io.flutter.embedding.engine.plugins.FlutterPlugin; +import io.flutter.embedding.engine.plugins.activity.ActivityAware; +import io.flutter.embedding.engine.plugins.activity.ActivityPluginBinding; +import io.flutter.plugin.common.MethodCall; +import io.flutter.plugin.common.MethodChannel; +import io.flutter.plugin.common.MethodChannel.MethodCallHandler; +import io.flutter.plugin.common.MethodChannel.Result; + +/** + * BubblePlugin + */ +public class BubblePlugin implements FlutterPlugin, MethodCallHandler, ActivityAware { + /// The MethodChannel that will the communication between Flutter and native Android + /// + /// This local reference serves to register the plugin with the Flutter Engine and unregister it + /// when the Flutter Engine is detached from the Activity + private MethodChannel channel; + private Context activity; + + + @Override + public void onAttachedToEngine(@NonNull FlutterPluginBinding flutterPluginBinding) { + channel = new MethodChannel(flutterPluginBinding.getBinaryMessenger(), "com.dsaved.bubble.head"); + channel.setMethodCallHandler(this); + } + + @RequiresApi(api = Build.VERSION_CODES.M) + @Override + public void onMethodCall(@NonNull MethodCall call, @NonNull Result result) { + if (call.method.equals("startBubbleHead")) { + startBubbleHead(result, call); + } else if (call.method.equals("stopBubbleHead")) { + BubbleHeadService.stopService(activity); + } else { + result.notImplemented(); + } + } + + @RequiresApi(api = Build.VERSION_CODES.M) + public void startBubbleHead(@NonNull Result result, MethodCall call) { + if (Settings.canDrawOverlays(activity)) { + boolean bounce = call.argument("bounce"); + BubbleHeadService.bounce(bounce); + + boolean showClose = call.argument("showClose"); + BubbleHeadService.shouldShowCloseButton(showClose); + + boolean dragToClose = call.argument("dragToClose"); + BubbleHeadService.dragToClose(dragToClose); + + boolean sendAppToBackground = call.argument("sendAppToBackground"); + BubbleHeadService.sendAppToBackground(sendAppToBackground); + + String imageByte = call.argument("image"); + BubbleHeadService.startService(activity, imageByte); + } else { + //Permission is not available + result.error("EPERMNOTGRANTED", "permission not available", "Please request permission for: android.permission.SYSTEM_ALERT_WINDOW. with out this permission you cannot launch the bubble head."); + } + } + + @Override + public void onDetachedFromEngine(@NonNull FlutterPluginBinding binding) { + channel.setMethodCallHandler(null); + } + + @Override + public void onAttachedToActivity(@NonNull ActivityPluginBinding binding) { + this.activity = binding.getActivity(); + } + + @Override + public void onDetachedFromActivityForConfigChanges() { + + } + + @Override + public void onReattachedToActivityForConfigChanges(@NonNull ActivityPluginBinding binding) { + + } + + @Override + public void onDetachedFromActivity() { + + } +} diff --git a/siro_driver/bubble-master/android/src/main/res/drawable/circle_shape.xml b/siro_driver/bubble-master/android/src/main/res/drawable/circle_shape.xml new file mode 100755 index 0000000..39b30cf --- /dev/null +++ b/siro_driver/bubble-master/android/src/main/res/drawable/circle_shape.xml @@ -0,0 +1,6 @@ + + + + + \ No newline at end of file diff --git a/siro_driver/bubble-master/android/src/main/res/drawable/ic_aspect_ratio_black_24dp.xml b/siro_driver/bubble-master/android/src/main/res/drawable/ic_aspect_ratio_black_24dp.xml new file mode 100755 index 0000000..fd01d34 --- /dev/null +++ b/siro_driver/bubble-master/android/src/main/res/drawable/ic_aspect_ratio_black_24dp.xml @@ -0,0 +1,9 @@ + + + diff --git a/siro_driver/bubble-master/android/src/main/res/drawable/ic_close_black_24dp.xml b/siro_driver/bubble-master/android/src/main/res/drawable/ic_close_black_24dp.xml new file mode 100755 index 0000000..20a88e1 --- /dev/null +++ b/siro_driver/bubble-master/android/src/main/res/drawable/ic_close_black_24dp.xml @@ -0,0 +1,9 @@ + + + diff --git a/siro_driver/bubble-master/android/src/main/res/drawable/ic_close_white_24dp.xml b/siro_driver/bubble-master/android/src/main/res/drawable/ic_close_white_24dp.xml new file mode 100755 index 0000000..7fb0631 --- /dev/null +++ b/siro_driver/bubble-master/android/src/main/res/drawable/ic_close_white_24dp.xml @@ -0,0 +1,9 @@ + + + diff --git a/siro_driver/bubble-master/android/src/main/res/drawable/ic_launcher.png b/siro_driver/bubble-master/android/src/main/res/drawable/ic_launcher.png new file mode 100755 index 0000000..cde69bc Binary files /dev/null and b/siro_driver/bubble-master/android/src/main/res/drawable/ic_launcher.png differ diff --git a/siro_driver/bubble-master/android/src/main/res/drawable/white_circle_shape.xml b/siro_driver/bubble-master/android/src/main/res/drawable/white_circle_shape.xml new file mode 100755 index 0000000..53a328a --- /dev/null +++ b/siro_driver/bubble-master/android/src/main/res/drawable/white_circle_shape.xml @@ -0,0 +1,9 @@ + + + + + + \ No newline at end of file diff --git a/siro_driver/bubble-master/android/src/main/res/layout/bubble_head_remove_widget.xml b/siro_driver/bubble-master/android/src/main/res/layout/bubble_head_remove_widget.xml new file mode 100755 index 0000000..532c606 --- /dev/null +++ b/siro_driver/bubble-master/android/src/main/res/layout/bubble_head_remove_widget.xml @@ -0,0 +1,16 @@ + + + + + + diff --git a/siro_driver/bubble-master/android/src/main/res/layout/layout_bubble_head.xml b/siro_driver/bubble-master/android/src/main/res/layout/layout_bubble_head.xml new file mode 100755 index 0000000..b237150 --- /dev/null +++ b/siro_driver/bubble-master/android/src/main/res/layout/layout_bubble_head.xml @@ -0,0 +1,45 @@ + + + + + + + + + + + + + + + + + + + diff --git a/siro_driver/bubble-master/android/src/main/res/values/styles.xml b/siro_driver/bubble-master/android/src/main/res/values/styles.xml new file mode 100755 index 0000000..ce24e43 --- /dev/null +++ b/siro_driver/bubble-master/android/src/main/res/values/styles.xml @@ -0,0 +1,16 @@ + + + + + + + + \ No newline at end of file diff --git a/siro_driver/bubble-master/lib/bubble.dart b/siro_driver/bubble-master/lib/bubble.dart new file mode 100755 index 0000000..aeab526 --- /dev/null +++ b/siro_driver/bubble-master/lib/bubble.dart @@ -0,0 +1,41 @@ +import 'dart:async'; +import 'dart:convert'; +import 'dart:typed_data'; + +import 'package:flutter/services.dart'; + +class Bubble { + static const MethodChannel _channel = + const MethodChannel('com.dsaved.bubble.head'); + + bool shouldBounce; + bool showCloseButton; + bool allowDragToClose; + + Bubble({ + this.shouldBounce = true, + this.allowDragToClose = true, + this.showCloseButton = false, + }); + + /// puts app in background and shows floaty-bubble head + Future startBubbleHead({bool sendAppToBackground = true}) async { + ByteData bytes = await rootBundle.load( + 'assets/images/logo1.png', + ); + var buffer = bytes.buffer; + var encodedImage = base64.encode(Uint8List.view(buffer)); + await _channel.invokeMethod('startBubbleHead', { + "image": encodedImage, + "bounce": shouldBounce, + "showClose": showCloseButton, + "dragToClose": allowDragToClose, + "sendAppToBackground": sendAppToBackground, + }); + } + + /// closes floaty-bubble head + Future stopBubbleHead() async { + await _channel.invokeMethod('stopBubbleHead'); + } +} diff --git a/siro_driver/bubble-master/pubspec.lock b/siro_driver/bubble-master/pubspec.lock new file mode 100755 index 0000000..a28b3d7 --- /dev/null +++ b/siro_driver/bubble-master/pubspec.lock @@ -0,0 +1,189 @@ +# Generated by pub +# See https://dart.dev/tools/pub/glossary#lockfile +packages: + async: + dependency: transitive + description: + name: async + sha256: "758e6d74e971c3e5aceb4110bfd6698efc7f501675bcfe0c775459a8140750eb" + url: "https://pub.dev" + source: hosted + version: "2.13.0" + boolean_selector: + dependency: transitive + description: + name: boolean_selector + sha256: "8aab1771e1243a5063b8b0ff68042d67334e3feab9e95b9490f9a6ebf73b42ea" + url: "https://pub.dev" + source: hosted + version: "2.1.2" + characters: + dependency: transitive + description: + name: characters + sha256: faf38497bda5ead2a8c7615f4f7939df04333478bf32e4173fcb06d428b5716b + url: "https://pub.dev" + source: hosted + version: "1.4.1" + clock: + dependency: transitive + description: + name: clock + sha256: fddb70d9b5277016c77a80201021d40a2247104d9f4aa7bab7157b7e3f05b84b + url: "https://pub.dev" + source: hosted + version: "1.1.2" + collection: + dependency: transitive + description: + name: collection + sha256: "2f5709ae4d3d59dd8f7cd309b4e023046b57d8a6c82130785d2b0e5868084e76" + url: "https://pub.dev" + source: hosted + version: "1.19.1" + fake_async: + dependency: transitive + description: + name: fake_async + sha256: "5368f224a74523e8d2e7399ea1638b37aecfca824a3cc4dfdf77bf1fa905ac44" + url: "https://pub.dev" + source: hosted + version: "1.3.3" + flutter: + dependency: "direct main" + description: flutter + source: sdk + version: "0.0.0" + flutter_test: + dependency: "direct dev" + description: flutter + source: sdk + version: "0.0.0" + leak_tracker: + dependency: transitive + description: + name: leak_tracker + sha256: "33e2e26bdd85a0112ec15400c8cbffea70d0f9c3407491f672a2fad47915e2de" + url: "https://pub.dev" + source: hosted + version: "11.0.2" + leak_tracker_flutter_testing: + dependency: transitive + description: + name: leak_tracker_flutter_testing + sha256: "1dbc140bb5a23c75ea9c4811222756104fbcd1a27173f0c34ca01e16bea473c1" + url: "https://pub.dev" + source: hosted + version: "3.0.10" + leak_tracker_testing: + dependency: transitive + description: + name: leak_tracker_testing + sha256: "8d5a2d49f4a66b49744b23b018848400d23e54caf9463f4eb20df3eb8acb2eb1" + url: "https://pub.dev" + source: hosted + version: "3.0.2" + matcher: + dependency: transitive + description: + name: matcher + sha256: "12956d0ad8390bbcc63ca2e1469c0619946ccb52809807067a7020d57e647aa6" + url: "https://pub.dev" + source: hosted + version: "0.12.18" + material_color_utilities: + dependency: transitive + description: + name: material_color_utilities + sha256: "9c337007e82b1889149c82ed242ed1cb24a66044e30979c44912381e9be4c48b" + url: "https://pub.dev" + source: hosted + version: "0.13.0" + meta: + dependency: transitive + description: + name: meta + sha256: "23f08335362185a5ea2ad3a4e597f1375e78bce8a040df5c600c8d3552ef2394" + url: "https://pub.dev" + source: hosted + version: "1.17.0" + path: + dependency: transitive + description: + name: path + sha256: "75cca69d1490965be98c73ceaea117e8a04dd21217b37b292c9ddbec0d955bc5" + url: "https://pub.dev" + source: hosted + version: "1.9.1" + sky_engine: + dependency: transitive + description: flutter + source: sdk + version: "0.0.0" + source_span: + dependency: transitive + description: + name: source_span + sha256: "56a02f1f4cd1a2d96303c0144c93bd6d909eea6bee6bf5a0e0b685edbd4c47ab" + url: "https://pub.dev" + source: hosted + version: "1.10.2" + stack_trace: + dependency: transitive + description: + name: stack_trace + sha256: "8b27215b45d22309b5cddda1aa2b19bdfec9df0e765f2de506401c071d38d1b1" + url: "https://pub.dev" + source: hosted + version: "1.12.1" + stream_channel: + dependency: transitive + description: + name: stream_channel + sha256: "969e04c80b8bcdf826f8f16579c7b14d780458bd97f56d107d3950fdbeef059d" + url: "https://pub.dev" + source: hosted + version: "2.1.4" + string_scanner: + dependency: transitive + description: + name: string_scanner + sha256: "921cd31725b72fe181906c6a94d987c78e3b98c2e205b397ea399d4054872b43" + url: "https://pub.dev" + source: hosted + version: "1.4.1" + term_glyph: + dependency: transitive + description: + name: term_glyph + sha256: "7f554798625ea768a7518313e58f83891c7f5024f88e46e7182a4558850a4b8e" + url: "https://pub.dev" + source: hosted + version: "1.2.2" + test_api: + dependency: transitive + description: + name: test_api + sha256: "93167629bfc610f71560ab9312acdda4959de4df6fac7492c89ff0d3886f6636" + url: "https://pub.dev" + source: hosted + version: "0.7.9" + vector_math: + dependency: transitive + description: + name: vector_math + sha256: d530bd74fea330e6e364cda7a85019c434070188383e1cd8d9777ee586914c5b + url: "https://pub.dev" + source: hosted + version: "2.2.0" + vm_service: + dependency: transitive + description: + name: vm_service + sha256: "45caa6c5917fa127b5dbcfbd1fa60b14e583afdc08bfc96dda38886ca252eb60" + url: "https://pub.dev" + source: hosted + version: "15.0.2" +sdks: + dart: ">=3.9.0-0 <4.0.0" + flutter: ">=3.18.0-18.0.pre.54" diff --git a/siro_driver/bubble-master/pubspec.yaml b/siro_driver/bubble-master/pubspec.yaml new file mode 100755 index 0000000..1a07ea9 --- /dev/null +++ b/siro_driver/bubble-master/pubspec.yaml @@ -0,0 +1,63 @@ +name: bubble_head +description: A flutter plugin to enable you launch a bubble while putting your application to background and upon clicking the bubble brings your application back to foreground +version: 0.0.4 +homepage: https://github.com/chrisoftech/bubble +# publish_to: + +environment: + sdk: ">=2.12.0 <3.0.0" + flutter: ">=1.20.0" + +dependencies: + flutter: + sdk: flutter + +dev_dependencies: + flutter_test: + sdk: flutter + +# For information on the generic Dart part of this file, see the +# following page: https://dart.dev/tools/pub/pubspec + +# The following section is specific to Flutter. +flutter: + # This section identifies this Flutter project as a plugin project. + # The 'pluginClass' and Android 'package' identifiers should not ordinarily + # be modified. They are used by the tooling to maintain consistency when + # adding or updating assets for this project. + plugin: + platforms: + android: + package: com.dsaved.bubblehead.bubble + pluginClass: BubblePlugin + + # To add assets to your plugin package, add an assets section, like this: + # assets: + # - assets/images/ + # - images/a_dot_ham.jpeg + # + # For details regarding assets in packages, see + # https://flutter.dev/assets-and-images/#from-packages + # + # An image asset can refer to one or more resolution-specific "variants", see + # https://flutter.dev/assets-and-images/#resolution-aware. + + # To add custom fonts to your plugin package, add a fonts section here, + # in this "flutter" section. Each entry in this list should have a + # "family" key with the font family name, and a "fonts" key with a + # list giving the asset and other descriptors for the font. For + # example: + # fonts: + # - family: Schyler + # fonts: + # - asset: fonts/Schyler-Regular.ttf + # - asset: fonts/Schyler-Italic.ttf + # style: italic + # - family: Trajan Pro + # fonts: + # - asset: fonts/TrajanPro.ttf + # - asset: fonts/TrajanPro_Bold.ttf + # weight: 700 + # + # For details regarding fonts in packages, see + # https://flutter.dev/custom-fonts/#from-packages diff --git a/siro_driver/firebase.json b/siro_driver/firebase.json new file mode 100644 index 0000000..a8f6733 --- /dev/null +++ b/siro_driver/firebase.json @@ -0,0 +1 @@ +{"flutter":{"platforms":{"android":{"default":{"projectId":"siro-a6957","appId":"1:825988584191:android:4525a21b00173d361632ca","fileOutput":"android/app/google-services.json"}},"ios":{"default":{"projectId":"siro-a6957","appId":"1:825988584191:ios:4002b88e618f0c4e1632ca","uploadDebugSymbols":false,"fileOutput":"ios/Runner/GoogleService-Info.plist"}},"dart":{"lib/firebase_options.dart":{"projectId":"siro-a6957","configurations":{"android":"1:825988584191:android:4525a21b00173d361632ca","ios":"1:825988584191:ios:4002b88e618f0c4e1632ca"}}}}}} \ No newline at end of file diff --git a/siro_driver/ios b/siro_driver/ios new file mode 160000 index 0000000..b3d9fcd --- /dev/null +++ b/siro_driver/ios @@ -0,0 +1 @@ +Subproject commit b3d9fcd385161092da675a919217bee83c40cf06 diff --git a/siro_driver/lib/constant/api_key.dart b/siro_driver/lib/constant/api_key.dart new file mode 100755 index 0000000..b82cf41 --- /dev/null +++ b/siro_driver/lib/constant/api_key.dart @@ -0,0 +1,82 @@ +import 'package:secure_string_operations/secure_string_operations.dart'; + +import '../env/env.dart'; +import 'char_map.dart'; + +class AK { + static final String sss_pass = X.r(X.r(X.r(Env.sss_pass, cn), cC), cs); + static final String allowed = Env.allowed; + static final String allowedWallet = Env.allowedWallet; + static final String passnpassenger = X + .r(X.r(X.r(Env.passnpassenger, cn), cC), cs) + .toString() + .split(Env.addd)[0]; + static final String newId = Env.newId; + static final String sss_encryptionSalt = + X.r(X.r(X.r(Env.sss_encryptionSalt, cn), cC), cs); + + + static final String basicAuthCredentials = + X.r(X.r(X.r(Env.basicAuthCredentials, cn), cC), cs); + static final String basicCompareFaces = + X.r(X.r(X.r(Env.basicCompareFaces, cn), cC), cs); + static final String accountSIDTwillo = + X.r(X.r(X.r(Env.accountSIDTwillo, cn), cC), cs); + static final String serverAPI = X.r(X.r(X.r(Env.serverAPI, cn), cC), cs); + static final String mapAPIKEY = Env.mapAPIKEY; + static final String mapSaasKey = Env.mapSaasKey; + static final String twilloRecoveryCode = + X.r(X.r(X.r(Env.twilloRecoveryCode, cn), cC), cs); + static final String authTokenTwillo = + X.r(X.r(X.r(Env.authTokenTwillo, cn), cC), cs); + static final String chatGPTkey = X.r(X.r(X.r(Env.chatGPTkey, cn), cC), cs); + static final String transactionCloude = + X.r(X.r(X.r(Env.transactionCloude, cn), cC), cs); + static final String visionApi = X.r(X.r(X.r(Env.visionApi, cn), cC), cs); + static final String chatGPTkeySefer = + X.r(X.r(X.r(Env.chatGPTkeySefer, cn), cC), cs); + static final String chatGPTkeySeferNew = + X.r(X.r(X.r(Env.chatGPTkeySeferNew, cn), cC), cs); + static final String serverPHP = Env.serverPHP; + static final String llamaKey = X.r(X.r(X.r(Env.llamaKey, cn), cC), cs); + static final String cohere = X.r(X.r(X.r(Env.cohere, cn), cC), cs); + static final String claudeAiAPI = X.r(X.r(X.r(Env.claudeAiAPI, cn), cC), cs); + + static final String geminiApi = X.r(X.r(X.r(Env.geminiApi, cn), cC), cs); + static final String agoraAppId = X.r(X.r(X.r(Env.agoraAppId, cn), cC), cs); + static final String agoraAppCertificate = + X.r(X.r(X.r(Env.agoraAppCertificate, cn), cC), cs); + + static final String integrationIdPayMob = + X.r(X.r(X.r(Env.integrationIdPayMob, cn), cC), cs); + static final String passwordPayMob = + X.r(X.r(X.r(Env.passwordPayMob, cn), cC), cs); + static final String usernamePayMob = + X.r(X.r(X.r(Env.usernamePayMob, cn), cC), cs); + static final String payMobApikey = + X.r(X.r(X.r(Env.payMobApikey, cn), cC), cs); + static final String integrationIdPayMobWallet = + X.r(X.r(X.r(Env.integrationIdPayMobWallet, cn), cC), cs); + static final String smsPasswordEgypt = + X.r(X.r(X.r(Env.smsPasswordEgypt, cn), cC), cs); + static final String ocpApimSubscriptionKey = Env.ocpApimSubscriptionKey; + static final String chatGPTkeySeferNew4 = + X.r(X.r(X.r(Env.chatGPTkeySeferNew4, cn), cC), cs); + static final String anthropicAIkeySeferNew = + X.r(X.r(X.r(Env.anthropicAIkeySeferNew, cn), cC), cs); + static final String llama3Key = X.r(X.r(X.r(Env.llama3Key, cn), cC), cs); + + static final String payMobOutPassword = + X.r(X.r(X.r(Env.payMobOutPassword, cn), cC), cs); + // static final String privateKeyFCM = Env.privateKeyFCM; + static final String payMobOutUserName = + X.r(X.r(X.r(Env.payMobOutUserName, cn), cC), cs); + +/////////// + static final String keyOfApp = X.r(X.r(X.r(Env.keyOfApp, cn), cC), cs); +} + +class KN { + static const String pmobsec = 'PAYMOBOUTCLIENTSECRET'; + static const String pmobid = 'PAYMOBOUTCLIENT_ID'; +} diff --git a/siro_driver/lib/constant/box_name.dart b/siro_driver/lib/constant/box_name.dart new file mode 100755 index 0000000..b6aecb4 --- /dev/null +++ b/siro_driver/lib/constant/box_name.dart @@ -0,0 +1,124 @@ +class BoxName { + static const String driverID = "driverID"; + static const String countryCode = "countryCode"; + static const String googlaMapApp = "googlaMapApp"; + static const String keyOfApp = 'keyOfApp'; + static const String initializationVector = 'initializationVector'; + static const String firstTimeLoadKey = 'firstTimeLoadKey'; + static const String jwt = "jwt"; + static const String blockUntilDate = "blockUntilDate"; + static const String rideId = "rideId"; + static const String rideArgumentsFromBackground = + "rideArgumentsFromBackground"; + static const String FCM_PRIVATE_KEY = "FCM_PRIVATE_KEY"; + static const String hmac = "hmac"; + static const String ttsEnabled = "ttsEnabled"; + static const String deviceFingerprint = "deviceFingerprint"; + static const String security_check = "security_check"; + static const String rideType = "rideType"; + static const String walletType = "walletType"; + static const String fingerPrint = "fingerPrint"; + static const String updateInterval = "updateInterval"; + static const String payMobApikey = "payMobApikey"; + static const String refreshToken = "refreshToken"; + static const String lang = "lang"; + static const String isvibrate = "isvibrate"; + static const String myListString = "myListString"; + static const String myList = "myList"; + static const String bodyOrder = "bodyOrder"; + static const String gender = "gender"; + static const String phoneWallet = "phoneWallet"; + static const String locationName = "locationName"; + static const String basicLink = "basicLink"; + static const String paymentLink = "paymentLink"; + static const String isSavedPhones = "IsSavedPhones"; + static const String isTest = "isTest"; + static const String carType = "carType"; + static const String carTypeOfDriver = "carTypeOfDriver"; + static const String isFirstTime = "isFirstTime"; + static const String deviceInfo = "deviceInfo"; + static const String packagInfo = "packagInfo"; + static const String phoneVerified = "phoneVerified"; + static const String carPlate = "carPlate"; + static const String statusDriverLocation = "statusDriverLocation"; + static const String isAppInForeground = "isAppInForeground"; + static const String rideStatus = "rideStatus"; + static const String nameArabic = "nameArabic"; + static const String carYear = "carYear"; + static const String password = "password"; + static const String isVerified = '0'; + static const String arrivalTime = "arrivalTime"; + static const String locationPermission = "locationPermission"; + static const String passwordDriver = "passwordDriver"; + static const String agreeTerms = "agreeTerms"; + static const String addWork = 'addWork'; + static const String addHome = 'addHome'; + static const String rideArguments = 'rideArguments'; + static const String durationData = 'durationData'; + static const String rideStaticDriverData = 'rideStaticDriverData'; + static const String lastTimeStaticThrottle = 'lastTimeStaticThrottle'; + static const String lastTimeCaptainWalletCashOut = + 'lastTimeCaptainWalletCashOut'; + static const String tipPercentage = 'tipPercentage'; + + static const String faceDetectTimes = "faceDetectTimes"; + static const String sosPhonePassenger = "sosPhonePassenger"; + static const String sosPhoneDriver = "sosPhoneDriver"; + static const String passengerID = "pasengerID"; + static const String phone = "phone"; + static const String phoneDriver = "phoneDriver"; + static const String is_claimed = "is_claimed"; + static const String isInstall = "isInstall"; + static const String isGiftToken = "isGiftToken"; + static const String lastOtpTime = "lastOtpTime"; + static const String bankCodeDriver = "bankCodeDriver"; + static const String accountBankNumberDriver = "accountBankNumberDriver"; + static const String dobDriver = "dobDriver"; + static const String sexDriver = "sexDriver"; + static const String lastNameDriver = "lastNameDriver"; + static const String name = "name"; + static const String nameDriver = "nameDriver"; + static const String driverPhotoUrl = "driverPhotoUrl"; + static const String email = "email"; + static const String emailDriver = "emailDriver"; + static const String tokens = "tokens"; + static const String tokenFCM = "tokenFCM"; + static const String tokenDriver = "tokenDriver"; + static const String cardNumber = "cardNumber"; + static const String cardNumberDriver = "cardNumberDriver"; + static const String cardHolderName = "cardHolderName"; + static const String cardHolderNameDriver = "cardHolderNameDriver"; + static const String expiryDate = "expiryDate"; + static const String expiryDateDriver = "expiryDateDriver"; + static const String cvvCode = "cvvCode"; + static const String cvvCodeDriver = "cvvCodeDriver"; + static const String passengerWalletDetails = "passengerWalletDetails"; + static const String passengerWalletTotal = "passengerWalletTotal"; + static const String passengerWalletFound = "passengerWalletFound"; + static const String periods = 'periods'; + static const String onBoarding = 'onBoarding'; + + static const String apiKeyRun = 'apiKeyRun'; + static const String serverAPI = 'serverAPI'; + static const String serverChosen = 'serverChosen'; + static const String secretKey = 'secretKey'; + static const String basicAuthCredentials = 'basicAuthCredentials'; + static const String mapAPIKEY = 'mapAPIKEY'; + static const String twilloRecoveryCode = 'twilloRecoveryCode'; + static const String accountSIDTwillo = 'accountSIDTwillo'; + static const String authTokenTwillo = 'authTokenTwillo'; + static const String chatGPTkey = 'chatGPTkey'; + static const String chatGPTkeySefer = 'chatGPTkeySefer'; + static const String transactionCloude = 'transactionCloude'; + static const String visionApi = 'visionApi'; + static const String vin = "vin"; + static const String make = "make"; + static const String model = "model"; + static const String year = "year"; + static const String expirationDate = "expirationDate"; + static const String color = "color"; + static const String owner = "owner"; + static const String registrationDate = "registrationDate"; + static const String recentLocations = 'recentLocations'; + static const String tripData = 'tripData'; +} diff --git a/siro_driver/lib/constant/char_map.dart b/siro_driver/lib/constant/char_map.dart new file mode 100755 index 0000000..ca5ee37 --- /dev/null +++ b/siro_driver/lib/constant/char_map.dart @@ -0,0 +1,75 @@ +import '../env/env.dart'; + +Map cs = { + "a": Env.a, + "b": Env.b, + "c": Env.c, + "d": Env.d, + "e": Env.e, + "f": Env.f, + "g": Env.g, + "h": Env.h, + "i": Env.i, + "j": Env.j, + "k": Env.k, + "l": Env.l, + "m": Env.m, + "n": Env.n, + "o": Env.o, + "p": Env.p, + "q": Env.q, + "r": Env.r, + "s": Env.s, + "t": Env.t, + "u": Env.u, + "v": Env.v, + "w": Env.w, + "x": Env.x, + "y": Env.y, + "z": Env.z, +}; +Map cC = { + "A": Env.A, + "B": Env.B, + "C": Env.C, + "D": Env.D, + "E": Env.E, + "F": Env.F, + "G": Env.G, + "H": Env.H, + "I": Env.I, + "J": Env.J, + "K": Env.K, + "L": Env.L, + "M": Env.M, + "N": Env.N, + "O": Env.O, + "P": Env.P, + "Q": Env.Q, + "R": Env.R, + "S": Env.S, + "T": Env.T, + "U": Env.U, + "V": Env.V, + "W": Env.W, + "X": Env.X, + "Y": Env.Y, + "Z": Env.Z +}; + +// + +// + +Map cn = { + "0": "3", + "1": "7", + "2": "1", + "3": "9", + "4": "0", + "5": "5", + "6": "2", + "7": "6", + "8": "4", + "9": "8" +}; diff --git a/siro_driver/lib/constant/colors.dart b/siro_driver/lib/constant/colors.dart new file mode 100755 index 0000000..3fd235f --- /dev/null +++ b/siro_driver/lib/constant/colors.dart @@ -0,0 +1,69 @@ +import 'package:flutter/material.dart'; +import 'package:get/get.dart'; + +class AppColor { + // --- Core Brand Colors --- + + /// **Primary Color:** The brand's signature blue. + static const Color primaryColor = Color(0xFF1DA1F2); + + /// **Text/Write Color:** Dynamic based on theme. + static Color get writeColor => + Get.isDarkMode ? Colors.white : const Color(0xFF1A1A1A); + + /// **Secondary Color:** Main background color, dynamic based on theme. + static Color get secondaryColor => + Get.isDarkMode ? const Color(0xFF121212) : Colors.white; + + /// **Surface Color:** For cards and elevated elements. + static Color get surfaceColor => + Get.isDarkMode ? const Color(0xFF1E1E1E) : Colors.white; + + /// **Card Color:** Specifically for card backgrounds. + static Color get cardColor => + Get.isDarkMode ? const Color(0xFF1E1E1E) : Colors.white; + + /// **Border Color:** Subtle borders for both modes. + static Color get borderColor => + Get.isDarkMode ? Colors.white10 : Colors.black12; + + /// **Accent Color:** Greyish accent. + static const Color accentColor = Color.fromARGB(255, 148, 140, 141); + + // --- Neutral & Status Colors --- + + /// **Grey Color:** Dynamic based on theme. + static Color get grayColor => + Get.isDarkMode ? Colors.grey[400]! : const Color(0xFF8E8E93); + + /// **Red Color (Error):** Clear red for alerts. + static const Color redColor = Color(0xFFD32F2F); + + /// **Green Color (Success):** Positive green. + static const Color greenColor = Color(0xFF388E3C); + + /// **Blue Color (Info):** Info text or success green variant. + static const Color blueColor = Color(0xFF1DA1F2); + + /// **Yellow Color (Warning):** Warm yellow. + static const Color yellowColor = Color(0xFFFFA000); + + // --- Tier & Social Colors --- + + static const Color gold = Color(0xFFFFD700); + static const Color bronze = Color(0xFFCD7F32); + static const Color goldenBronze = Color(0xFFB87333); + static const Color twitterColor = Color(0xFF1DA1F2); + + // --- Utility Colors --- + + static Color get greyColor => grayColor; + + static Color get cyanBlue => const Color(0xFF1DA1F2); + static Color get cyanAccent => const Color(0xFF1DA1F2).withOpacity(0.12); + static Color get deepPurpleAccent => const Color(0xFFCE1126).withOpacity(0.1); + + // --- Theme Helpers --- + static Brightness get brightness => Get.isDarkMode ? Brightness.dark : Brightness.light; +} + diff --git a/siro_driver/lib/constant/country_polygons.dart b/siro_driver/lib/constant/country_polygons.dart new file mode 100644 index 0000000..68ef7f5 --- /dev/null +++ b/siro_driver/lib/constant/country_polygons.dart @@ -0,0 +1,107 @@ +// في ملف: constant/country_polygons.dart + +import 'package:intaleq_maps/intaleq_maps.dart'; + +class CountryPolygons { + // ========================================================== + // 1. الأردن: تغطية الممر الحضري الرئيسي (من إربد شمالاً حتى العقبة جنوباً) + // حوالي 12 نقطة + // ========================================================== + static final List jordanBoundary = [ + // شمال إربد (قرب الحدود) + const LatLng(32.65, 35.80), + // شمال شرق المفرق + const LatLng(32.35, 37.00), + // شرق الزرقاء / الأزرق + const LatLng(31.85, 36.80), + // جنوب شرق (نهاية الزحف السكاني) + const LatLng(31.00, 36.50), + // جنوب / معان + const LatLng(30.30, 35.75), + // العقبة + const LatLng(29.50, 35.00), + // البحر الأحمر / الحدود الغربية + const LatLng(29.50, 34.85), + // غرب وادي عربة + const LatLng(30.80, 35.25), + // منطقة البحر الميت / السلط + const LatLng(32.00, 35.50), + // العودة عبر وادي الأردن إلى الشمال + const LatLng(32.45, 35.60), + // العودة لنقطة إربد + const LatLng(32.65, 35.80), + ]; + + // ========================================================== + // 2. سوريا: تغطية الممر الغربي والساحلي (درعا، دمشق، حمص، حماة، حلب، الساحل) + // حوالي 14 نقطة + // ========================================================== + static final List syriaBoundary = [ + // درعا / الجنوب + const LatLng(32.65, 35.95), + // شرق السويداء (حدود المنطقة المأهولة) + const LatLng(32.85, 37.10), + // أطراف دمشق الشرقية + const LatLng(33.50, 36.65), + // تدمر (أقصى امتداد شرقي للمضلع) + const LatLng(34.50, 38.30), + // الرقة (شمال شرق) + const LatLng(35.95, 38.80), + // حلب (الشمال) + const LatLng(36.45, 37.15), + // الحدود الشمالية الغربية (إدلب / تركيا) + const LatLng(36.50, 36.50), + // اللاذقية (الساحل) + const LatLng(35.50, 35.75), + // طرطوس (الساحل) + const LatLng(34.80, 35.85), + // حمص + const LatLng(34.70, 36.70), + // حماة + const LatLng(35.10, 36.70), + // العودة إلى منطقة دمشق + const LatLng(33.40, 36.30), + // العودة إلى درعا + const LatLng(32.65, 35.95), + ]; + + // ========================================================== + // 3. مصر: تغطية القاهرة الكبرى، الدلتا، والإسكندرية والإسماعيلية + // حوالي 10 نقاط + // ========================================================== + static final List egyptBoundary = [ + // جنوب الفيوم (أقصى امتداد جنوبي غربي) + const LatLng(29.20, 30.60), + // جنوب القاهرة (العياط) + const LatLng(29.80, 31.30), + // شرق السويس + const LatLng(29.95, 32.70), + // الإسماعيلية / القناة + const LatLng(30.60, 32.25), + // بورسعيد / أطراف الدلتا الشمالية الشرقية + const LatLng(31.30, 31.80), + // دمياط / ساحل الدلتا + const LatLng(31.50, 31.25), + // الإسكندرية (أقصى الشمال الغربي) + const LatLng(31.20, 29.80), + // غرب الدلتا + const LatLng(30.50, 30.20), + // العودة لنقطة البداية + const LatLng(29.20, 30.60), + ]; + + // دالة تُرجع رابط API بناءً على اسم الدولة + static String getRoutingApiUrl(String countryName) { + switch (countryName) { + case 'Jordan': + return 'https://routec.intaleq.xyz/route-jo'; + case 'Syria': + return 'https://routec.intaleq.xyz/route'; + case 'Egypt': + return 'https://routec.intaleq.xyz/route-eg'; + default: + // الافتراضي في حالة لم يقع الموقع ضمن أي من المضلعات + return 'https://routec.intaleq.xyz/route'; + } + } +} diff --git a/siro_driver/lib/constant/credential.dart b/siro_driver/lib/constant/credential.dart new file mode 100755 index 0000000..28c46e1 --- /dev/null +++ b/siro_driver/lib/constant/credential.dart @@ -0,0 +1,104 @@ +import 'dart:convert'; +import 'package:crypto/crypto.dart'; +import 'package:secure_string_operations/secure_string_operations.dart'; + +import '../controller/functions/crud.dart'; +import '../main.dart'; +import 'box_name.dart'; +import 'char_map.dart'; +import 'links.dart'; + +class AC { + gAK() async { + if (box.read(BoxName.apiKeyRun).toString() != 'run') { + var res = await CRUD().get(link: AppLink.getApiKey, payload: {}); + var decod = jsonDecode(res); + // print(decod); + + Map jsonData = {}; + for (var i = 0; i < decod['message'].length; i++) { + String h = decod['message'][i]['hashed_key'].toString(); + String retrievedString = X.r(X.r(X.r(h, cn), cC), cs); + + await storage.write( + key: decod['message'][i]['name'].toString(), + value: retrievedString.toString(), + ); + // + String name = decod['message'][i]['name'].toString(); + String value = decod['message'][i]['hashed_key'].toString(); + + jsonData[name] = value; + } + String jsonString = json.encode(jsonData); + print(jsonString); + box.write(BoxName.apiKeyRun, 'run'); + } + } + + String q(String b, String c) { + final d = utf8.encode(c); + final e = utf8.encode(b); + + final f = Hmac(sha256, d); + final g = f.convert(e); + + final h = g.bytes; + final i = base64Url.encode(h); + return i; + } + + String j(String k, String l) { + final m = utf8.encode(l); + final n = base64Url.decode(k); + + final o = Hmac(sha256, m); + final p = o.convert(n); + + final q = utf8.decode(p.bytes); + return q; + } + + String a(String b, String c) { + int d = b.length; + int e = d ~/ 4; + + List f = []; + for (int g = 0; g < d; g += e) { + int h = g + e; + if (h > d) { + h = d; + } + String i = b.substring(g, h); + f.add(i); + } + + print(f); + Map j = {}; + j['birinci'] = f[4]; + j['ikinci'] = f[2]; + j['üçüncü'] = c + f[1]; + j['dördüncü'] = f[0]; + j['beş'] = f[3]; + + String k = ''; + j.forEach((l, m) { + k += m; + }); + + return k; + } + + Map n(String o, String c) { + String p = o.replaceAll(c, ''); + + Map q = {}; + q['birinci'] = p[p.length - 5] + p[p.length - 3]; + q['ikinci'] = p[p.length - 1] + p[p.length - 15]; + q['üçüncü'] = p[p.length - 9] + p[p.length - 12]; + q['dördüncü'] = p[p.length - 11] + p[p.length - 6]; + q['beş'] = p[p.length - 2] + p[p.length - 8]; + + return q; + } +} diff --git a/siro_driver/lib/constant/finance_design_system.dart b/siro_driver/lib/constant/finance_design_system.dart new file mode 100644 index 0000000..510897a --- /dev/null +++ b/siro_driver/lib/constant/finance_design_system.dart @@ -0,0 +1,57 @@ +import 'package:flutter/material.dart'; +import 'package:get/get.dart'; + +class FinanceDesignSystem { + // --- Colors --- + static Color get primaryDark => Get.isDarkMode ? const Color(0xFFE0E0E0) : const Color(0xFF0A0E21); + static Color get accentBlue => const Color(0xFF3D5AFE); + static Color get successGreen => const Color(0xFF00C853); + static Color get dangerRed => const Color(0xFFD50000); + static Color get backgroundColor => Get.isDarkMode ? const Color(0xFF0A0E21) : const Color(0xFFF6F8FA); + static Color get cardColor => Get.isDarkMode ? const Color(0xFF1E1E2E) : const Color(0xFFFFFFFF); + static Color get textSecondary => Get.isDarkMode ? Colors.white70 : const Color(0xFF757575); + static Color get textMuted => Get.isDarkMode ? Colors.white38 : const Color(0xFFBDBDBD); + static Color get borderColor => Get.isDarkMode ? Colors.white10 : Colors.grey.withOpacity(0.1); + + // --- Gradients --- + static LinearGradient get balanceGradient => LinearGradient( + colors: Get.isDarkMode + ? [const Color(0xFF1E1E2E), const Color(0xFF2A2A3E)] + : [const Color(0xFF0A0E21), const Color(0xFF1A237E)], + begin: Alignment.topLeft, + end: Alignment.bottomRight, + ); + + static const LinearGradient dangerGradient = LinearGradient( + colors: [Color(0xFFD50000), Color(0xFFFF5252)], + begin: Alignment.topLeft, + end: Alignment.bottomRight, + ); + + // --- Radius --- + static const double mainRadius = 16.0; + static const double cardRadius = 20.0; + static const double buttonRadius = 12.0; + + // --- Spacing --- + static const double horizontalPadding = 16.0; + static const double verticalSectionPadding = 24.0; + + // --- Text Styles --- + static TextStyle get balanceStyle => const TextStyle( + fontSize: 32, + fontWeight: FontWeight.bold, + color: Colors.white, + ); + + static TextStyle get headingStyle => TextStyle( + fontSize: 18, + fontWeight: FontWeight.bold, + color: primaryDark, + ); + + static TextStyle get subHeadingStyle => TextStyle( + fontSize: 14, + color: textSecondary, + ); +} diff --git a/siro_driver/lib/constant/info.dart b/siro_driver/lib/constant/info.dart new file mode 100755 index 0000000..05fc897 --- /dev/null +++ b/siro_driver/lib/constant/info.dart @@ -0,0 +1,291 @@ +class AppInformation { + static const String companyName = 'Intaleq'; + static const String appName = 'Intaleq DRIVER'; + static const String appVersion = 'Intaleq DRIVER'; + static const String phoneNumber = '962798583052'; + static const String linkedInProfile = + 'https://www.linkedin.com/in/hamza-ayed/'; + static const String website = 'https://intaleqapp.com'; + static const String email = 'hamzaayed@intaleqapp.com'; + static const String complaintPrompt = + 'for this data for complaint from driver or passenger i collect all data i want you analyze this complaint and show what is reason and what is solution .this data collected from many table to find solution if payment in visa not complete and if ride status is finished it will be paymnet in payment table if ride status is not finished there is no need to pay and payment table is null for this ride and if paymentFromPaymentTable not null and visa type not cash the payment sucssessed . if ratingpassenger is low or passengr rating drivers low grade then dont mine of this passenger ,look at driver too like passengerratingdriver with rating or ratingtopassenger .in json add status of complaint and message to passenger and message to driver and message to call center write in arabic in json output with key in english .for output please just json i want'; + static const String addd = 'BlBlNl'; + static const String privacyPolicy = ''' + + + + + + Intaleq - Privacy Policy & Terms of Use + + + +

Privacy Policy & Terms of Use

+ +
+

Effective Date: August 9, 2025

+

Last Updated: August 9, 2025

+
+ +

1. Introduction and Acceptance

+

By downloading, registering, or using the Intaleq application ("App"), you agree to be bound by this Privacy Policy and our Terms of Use. If you do not agree, you must stop using the App immediately. Your continued use constitutes acceptance of these terms and any future updates.

+ +

2. Definitions

+
    +
  • "Intaleq", "we", "us": Refers to the Intaleq for Ride Hailing company, Damascus – Syria (Owner & operator), which provides the technology platform.
  • +
  • "Driver": An independent service provider who uses the App to offer transportation services.
  • +
  • "Passenger", "you": An individual who uses the App to request transportation services.
  • +
  • "Services": The connection between Passengers and Drivers facilitated by our App.
  • +
+ +

3. Privacy Policy

+ +

3.1 Information We Collect

+

We collect information necessary to provide and improve our Services.

+ +

A. Information You Provide:

+
    +
  • For Drivers: To ensure safety and compliance, we collect identity information, including your full name, phone number, personal photo, and official documents (e.g., driver's license, vehicle registration).
  • +
  • For Passengers: We only require a phone number for registration and communication. We are not authorized to request or view official identity documents for passengers.
  • +
+ +

B. Information Collected Automatically:

+
    +
  • Location Data: We collect precise location data when the App is in use to facilitate ride matching, navigation, and for safety purposes.
  • +
  • Device Data: We collect information about your device, such as model, operating system, and unique identifiers, to ensure App functionality and for security verification.
  • +
  • Usage Data: We log how you interact with our App, including trip history and features used, to improve our services.
  • +
+ +

3.2 Payment Information

+

We do not collect, process, or store any sensitive payment information like credit/debit card numbers. We facilitate payments by connecting you to licensed, local third-party providers:

+
    +
  • Mobile Carrier Billing: Payments via MTN and Syriatel are processed directly by them based on your registered phone number. A one-time password (OTP) sent by the carrier is required to confirm the transaction.
  • +
  • Bank Card Payments: We connect you with the Syrian company "eCash" to process card payments. They handle the transaction, and your bank will send an OTP to your phone to authorize it.
  • +
+ +

3.3 How We Use Your Information

+
    +
  • To operate and maintain the Services (e.g., connect Drivers and Passengers).
  • +
  • To verify Driver identity and eligibility.
  • +
  • To improve App security and prevent fraud.
  • +
  • To provide customer support.
  • +
  • To comply with legal obligations.
  • +
+ +

3.4 Data Sharing

+

We do not sell your personal data. We only share it in the following limited circumstances:

+
    +
  • Between Passenger and Driver: To facilitate a ride, we share necessary information like name, photo, and real-time location.
  • +
  • With Service Providers: For services like payment processing and mapping. These providers are contractually obligated to protect your data.
  • +
  • For Legal Reasons: If required by law or a valid legal order.
  • +
+ +

3.5 Policy for Minors

+

Our services are intended for individuals over the age of 18. + For Drivers: We strictly verify the identity and age of all drivers to ensure no minors are operating on our platform. + For Passengers: While we do not verify passenger identity, the service is not directed at children under 18. If a parent or guardian becomes aware that their child has provided us with information without their consent, they should contact us immediately.

+ +

4. User Obligations & Conduct

+
    +
  • You must provide accurate and current information during registration.
  • +
  • You are responsible for maintaining the security of your account.
  • +
  • You agree not to use the App for any illegal activities, to harass others, or to cause damage to a Driver's vehicle.
  • +
+ +

5. Disclaimer of Liability

+

The App is provided "as is". Intaleq is an intermediary platform and is not liable for the actions of Drivers or Passengers, accidents, delays, or any disputes between users. Our liability is limited to the fullest extent permitted by law.

+ +

6. Policy Updates

+

We may update these terms. If we make significant changes, we will notify you within the App. You will be required to review and accept the new terms to continue using the Services, ensuring your consent is active and informed.

+ +

7. Account Deletion & Contact

+

You have the right to request the deletion of your account and personal data. To do so, or for any other questions, please contact us. We will respond to deletion requests within 30 days.

+

Email: support@intaleqapp.com

+ + + +'''; + + static const String privacyPolicyArabic = ''' + + + + + + انطلق - سياسة الخصوصية وشروط الاستخدام + + + +

سياسة الخصوصية وشروط الاستخدام

+ +
+

تاريخ النفاذ: 9 أغسطس 2025

+

آخر تحديث: 9 أغسطس 2025

+
+ +

1. المقدمة والقبول

+

عبر تحميل أو تسجيل أو استخدام تطبيق "انطلق" ("التطبيق")، فإنك توافق على الالتزام بسياسة الخصوصية وشروط الاستخدام هذه. إذا كنت لا توافق، يجب عليك التوقف فورًا عن استخدام التطبيق. استمرارك في الاستخدام يُعد قبولاً لهذه الشروط وأي تحديثات مستقبلية لها.

+ +

2. التعريفات

+
    +
  • "انطلق"، "نحن": تشير إلى شركة انطلق لنقل الركاب، دمشق – سوريا (مالك ومشغل التطبيق)، التي توفر المنصة التقنية.
  • +
  • "السائق": مقدم خدمة مستقل يستخدم التطبيق لتقديم خدمات النقل.
  • +
  • "الراكب"، "أنت": الفرد الذي يستخدم التطبيق لطلب خدمات النقل.
  • +
  • "الخدمات": عملية الربط بين الركاب والسائقين التي يسهلها تطبيقنا.
  • +
+ +

3. سياسة الخصوصية

+ +

3.1 المعلومات التي نجمعها

+

نحن نجمع المعلومات الضرورية لتقديم خدماتنا وتحسينها.

+ +

أ. المعلومات التي تقدمها بنفسك:

+
    +
  • بالنسبة للسائقين: لضمان السلامة والامتثال للقوانين، نجمع بيانات الهوية الشخصية، بما في ذلك الاسم الكامل، رقم الهاتف، صورة شخصية، والوثائق الرسمية (مثل رخصة القيادة وتسجيل المركبة).
  • +
  • بالنسبة للركاب: نطلب فقط رقم هاتف للتسجيل والتواصل. نحن غير مخولين بطلب أو الاطلاع على وثائق الهوية الرسمية للركاب.
  • +
+ +

ب. المعلومات التي تُجمع تلقائيًا:

+
    +
  • بيانات الموقع: نجمع بيانات الموقع الجغرافي الدقيقة عند استخدام التطبيق لتسهيل تحديد أماكن الانطلاق والوصول، الملاحة، ولأغراض السلامة.
  • +
  • بيانات الجهاز: نجمع معلومات عن جهازك (طراز، نظام تشغيل، معرفات فريدة) لضمان عمل التطبيق وللتحقق الأمني.
  • +
  • بيانات الاستخدام: نسجل كيفية تفاعلك مع التطبيق، بما في ذلك سجل الرحلات والميزات المستخدمة، بهدف تحسين خدماتنا.
  • +
+ +

3.2 معلومات الدفع

+

نحن لا نجمع أو نعالج أو نخزن أي معلومات دفع حساسة مثل أرقام بطاقات الائتمان/الخصم. نحن نسهل عمليات الدفع عبر ربطك بمزودي خدمات محليين مرخصين:

+
    +
  • الدفع عبر رصيد الهاتف المحمول: تتم معالجة الدفعات عبر شركتي MTN و Syriatel مباشرة من خلالهما بناءً على رقم هاتفك المسجل لديهم. يتطلب تأكيد العملية إدخال رمز تحقق (OTP) يُرسل من قبل شركة الاتصالات.
  • +
  • الدفع عبر البطاقات البنكية: نربطك بشركة "eCash" السورية لمعالجة الدفعات بالبطاقات. هي التي تتولى المعاملة، وسيقوم البنك الذي تتعامل معه بإرسال رمز تحقق (OTP) إلى هاتفك لتفويض العملية.
  • +
+ +

3.3 كيف نستخدم معلوماتك

+
    +
  • لتشغيل وصيانة الخدمات (مثل الربط بين السائقين والركاب).
  • +
  • للتحقق من هوية السائقين وأهليتهم.
  • +
  • لتحسين أمان التطبيق ومنع الاحتيال.
  • +
  • لتقديم الدعم الفني للعملاء.
  • +
  • للامتثال للالتزامات القانونية.
  • +
+ +

3.4 مشاركة البيانات

+

نحن لا نبيع بياناتك الشخصية. نشاركها فقط في الحالات المحدودة التالية:

+
    +
  • بين الراكب والسائق: لتسهيل الرحلة، نشارك المعلومات الضرورية مثل الاسم، الصورة، والموقع المباشر.
  • +
  • مع مزودي الخدمات: مثل معالجي الدفع وخدمات الخرائط. هؤلاء المزودون ملزمون تعاقديًا بحماية بياناتك.
  • +
  • لأسباب قانونية: إذا طُلب ذلك بموجب القانون أو أمر قضائي ساري المفعول.
  • +
+ +

3.5 سياسة القاصرين

+

خدماتنا موجهة للأفراد الذين تزيد أعمارهم عن 18 عامًا. + بالنسبة للسائقين: نحن نتحقق بدقة من هوية وعمر جميع السائقين لضمان عدم وجود قاصرين يعملون على منصتنا. + بالنسبة للركاب: على الرغم من أننا لا نتحقق من هوية الركاب، فإن الخدمة غير موجهة للأطفال دون سن 18. إذا علم ولي الأمر أن طفله قد زودنا بمعلومات دون موافقته، فيجب عليه الاتصال بنا على الفور.

+ +

4. التزامات المستخدم وسلوكه

+
    +
  • يجب عليك تقديم معلومات دقيقة وحديثة عند التسجيل.
  • +
  • أنت مسؤول عن الحفاظ على أمان حسابك.
  • +
  • أنت توافق على عدم استخدام التطبيق لأي أنشطة غير قانونية، أو لمضايقة الآخرين، أو التسبب في ضرر لمركبة السائق.
  • +
+ +

5. إخلاء المسؤولية

+

يتم تقديم التطبيق "كما هو". "انطلق" هي منصة وسيطة وليست مسؤولة عن تصرفات السائقين أو الركاب، أو الحوادث، أو التأخير، أو أي نزاعات بين المستخدمين. مسؤوليتنا محدودة إلى أقصى حد يسمح به القانون.

+ +

6. تحديثات السياسة

+

قد نقوم بتحديث هذه الشروط. في حال إجراء تغييرات جوهرية، سنقوم بإعلامك داخل التطبيق. سيُطلب منك مراجعة الشروط الجديدة وقبولها لمواصلة استخدام الخدمات، لضمان أن موافقتك فعالة ومبنية على معرفة.

+ +

7. حذف الحساب والتواصل

+

لديك الحق في طلب حذف حسابك وبياناتك الشخصية. للقيام بذلك، أو لأي استفسارات أخرى، يرجى التواصل معنا. سنرد على طلبات الحذف في غضون 30 يومًا.

+

البريد الإلكتروني: support@intaleqapp.com

+ + + +'''; +} diff --git a/siro_driver/lib/constant/links.dart b/siro_driver/lib/constant/links.dart new file mode 100755 index 0000000..209f641 --- /dev/null +++ b/siro_driver/lib/constant/links.dart @@ -0,0 +1,423 @@ +// import 'package:siro_driver/env/env.dart'; + +import '../main.dart'; +import 'box_name.dart'; + +class AppLink { + static String serverPHP = box.read('serverPHP'); + + static String paymentServer = 'https://walletintaleq.intaleq.xyz/v1/main'; + + static String locationServer = + 'https://location.intaleq.xyz/intaleq/ride/location'; + static String locationServerSide = + 'https://location.intaleq.xyz/intaleq/ride/location'; + static String mapSaasRoute = 'https://map-saas.intaleqapp.com/api/maps/route'; + static String mapSaasPlaces = + 'https://map-saas.intaleqapp.com/api/geocoding/places'; + static const String routeApiBaseUrl = + "https://routesjo.intaleq.xyz/route/v1/driving"; + static final String endPoint = 'https://api.intaleq.xyz/intaleq_v3'; + static final String syria = 'https://syria.intaleq.xyz/intaleq'; + static final String server = endPoint; + + ///=================ride==========================/// + ///https://api.intaleq.xyz/intaleq/ride + static String ride = '$server/ride'; + static String rideServer = 'https://rides.intaleq.xyz/intaleq/ride'; + + ///mapOSM = 'https://routesy.intaleq.xyz' + static String mapOSM = 'https://routesy.intaleq.xyz'; + + static String seferCairoServer = endPoint; + static String seferGizaServer = + box.read('Giza') ?? box.read(BoxName.serverChosen); + static String seferAlexandriaServer = + box.read('Alexandria') ?? box.read(BoxName.serverChosen); + // static final String server = Env.serverPHP; + + static String loginJwtDriver = "$server/loginJwtDriver.php"; + static String loginJwtWalletDriver = "$server/loginJwtWalletDriver.php"; + static String loginFirstTimeDriver = "$server/loginFirstTimeDriver.php"; + + static String googleMapsLink = 'https://maps.googleapis.com/maps/api/'; + static String llama = 'https://api.llama-api.com/chat/completions'; + static String gemini = + 'https://generativelanguage.googleapis.com/v1beta3/models/text-bison-001:generateText'; + + static String test = "$server/test.php"; + + //===============contact========================== + static String savePhones = "$ride/egyptPhones/add.php"; + static String savePhonesSyria = "$ride/egyptPhones/syrianAdd.php"; + static String getPhones = "$ride/egyptPhones/get.php"; + + ////===============firebase========================== + static String getTokens = "$ride/firebase/get.php"; + + static String getDriverToken = "$ride/firebase/getDriverToken.php"; + static String addTokens = "$ride/firebase/add.php"; + static String addTokensDriver = "$ride/firebase/addDriver.php"; + static String addTokensDriverWallet = + "$paymentServer/ride/firebase/addDriver.php"; + + //=======================Wallet=================== + static String wallet = '$paymentServer/ride/passengerWallet'; + static String walletDriver = '$paymentServer/ride/driverWallet'; + static String getAllPassengerTransaction = + "$wallet/getAllPassengerTransaction.php"; + static String payWithMTNConfirm = + "$paymentServer/ride/mtn/driver/confirm_payment.php"; + static String payWithMTNStart = + "$paymentServer/ride/mtn/driver/mtn_start.php"; + static String payWithSyriatelConfirm = + "$paymentServer/ride/syriatel/driver/confirm_payment.php"; + static String payWithSyriatelStart = + "$paymentServer/ride/syriatel/driver/start_payment.php"; + static String payWithEcashDriver = + "$paymentServer/ride/ecash/driver/payWithEcash.php"; + static String payWithEcashPassenger = + "$paymentServer/ride/ecash/passenger/payWithEcash.php"; +// wl.tripz-egypt.com/v1/main/ride/ecash/driver + static String getWalletByPassenger = "$wallet/getWalletByPassenger.php"; + static String getPassengersWallet = "$wallet/get.php"; + static String getPassengerWalletArchive = + "$wallet/getPassengerWalletArchive.php"; + static String addPassengersWallet = "$wallet/add.php"; + static String deletePassengersWallet = "$wallet/delete.php"; + static String updatePassengersWallet = "$wallet/update.php"; + + static String getWalletByDriver = "$walletDriver/getWalletByDriver.php"; + static String driverStatistic = + "$endPoint/ride/driverWallet/driverStatistic.php"; + static String getDriverDetails = + "$seferCairoServer/ride/driverWallet/getDriverDetails.php"; + + // ================= Gamification Endpoints ================= + static String getWeeklyAggregate = "$endPoint/ride/gamification/getWeeklyAggregate.php"; + static String getLeaderboard = "$endPoint/ride/gamification/getLeaderboard.php"; + static String claimChallengeReward = "$endPoint/ride/gamification/claimChallengeReward.php"; + static String getReferralStats = "$endPoint/ride/gamification/getReferralStats.php"; + static String getDriverBehavior = "$endPoint/ride/gamification/getDriverBehavior.php"; + static String getDriverWeekPaymentMove = + "$walletDriver/getDriverWeekPaymentMove.php"; + static String getDriversWallet = "$walletDriver/get.php"; + static String addDriversWalletPoints = "$walletDriver/add.php"; + static String addpromotionDriver = "$walletDriver/promotionDriver.php"; + static String deleteDriversWallet = "$walletDriver/delete.php"; + static String updateDriversWallet = "$walletDriver/update.php"; + + //=======================promo===================ride.mobile-app.store/ride/promo/get.php + static String promo = '$server/ride/promo'; + static String getPassengersPromo = "$promo/get.php"; + static String getPromoBytody = "$promo/getPromoBytody.php"; + static String addPassengersPromo = "$promo/add.php"; + static String deletePassengersPromo = "$promo/delete.php"; + static String updatePassengersPromo = "$promo/update.php"; + + ////=======================cancelRide=================== + + static String addCancelRideFromPassenger = "$rideServer/cancelRide/add.php"; + static String addCancelTripFromDriverAfterApplied = + "$rideServer/cancelRide/addCancelTripFromDriverAfterApplied.php"; + static String cancelRide = "$rideServer/cancelRide/get.php"; +//-----------------ridessss------------------ + static String addRides = "$rideServer/rides/add.php"; + static String getRides = "$rideServer/rides/get.php"; + static String getPlacesSyria = "$rideServer/places_syria/get.php"; + static String getMishwari = "$rideServer/mishwari/get.php"; + static String getMishwariDriver = "$rideServer/mishwari/getDriver.php"; + static String sendChatMessage = "$server/ride/chat/send_message.php"; + static String getTripCountByCaptain = + "$rideServer/rides/getTripCountByCaptain.php"; + static String getRideOrderID = "$rideServer/rides/getRideOrderID.php"; + static String getRideStatus = "$rideServer/rides/getRideStatus.php"; + static String getOverLayStatus = "$ride/overLay/get.php"; + static String getArgumentAfterAppliedFromBackground = + "$ride/overLay/getArgumentAfterAppliedFromBackground.php"; + static String addOverLayStatus = "$ride/overLay/add.php"; + static String getapiKey = "$ride/apiKey/get.php"; + + static String getapiKeySefer = "$ride/apiKey/get.php"; + static String getRideStatusBegin = "$rideServer/rides/getRideStatusBegin.php"; + static String getRideStatusFromStartApp = + "$rideServer/rides/getRideStatusFromStartApp.php"; + static String updateRides = "$rideServer/rides/update.php"; + static String updateRideAndCheckIfApplied = + "$rideServer/rides/updateRideAndCheckIfApplied.php"; + static String updateStausFromSpeed = + "$rideServer/rides/updateStausFromSpeed.php"; + static String deleteRides = "$rideServer/rides/delete.php"; + +//-----------------DriverPayment------------------ + static String addDriverScam = "$ride/driver_scam/add.php"; + static String getDriverScam = "$ride/driver_scam/get.php"; + +/////////---getKazanPercent===//////////// + static String getKazanPercent = "$ride/kazan/get.php"; + static String addKazanPercent = "$ride/kazan/add.php"; + +////-----------------DriverPayment------------------ + static String addDrivePayment = "$paymentServer/ride/payment/add.php"; + static String payWithPayMobCardDriver = + "$paymentServer/ride/payMob/paymob_driver/payWithCard.php"; + static String payWithWallet = + "$paymentServer/ride/payMob/paymob_driver/payWithWallet.php"; + static String paymetVerifyDriver = + "$paymentServer/ride/payMob/paymob_driver/paymet_verfy.php"; + static String updatePaymetToPaid = + "$paymentServer/ride/payment/updatePaymetToPaid.php"; + static String paymobPayoutDriverWallet = + "$paymentServer/ride/payMob/paymob_driver/paymob_payout.php'"; + + static String addSeferWallet = "$paymentServer/ride/seferWallet/add.php"; + static String getSeferWallet = "$paymentServer/ride/seferWallet/get.php"; + static String addDriverPaymentPoints = + "$paymentServer/ride/driverPayment/add.php"; + static String addPaymentTokenDriver = + "$paymentServer/ride/driverWallet/addPaymentToken.php"; //driverWallet/addPaymentToken.php + static String addPaymentTokenPassenger = + "$paymentServer/ride/passengerWallet/addPaymentTokenPassenger.php"; + static String getDriverPaymentPoints = + "$paymentServer/ride/driverWallet/get.php"; + static String getDriverPaymentToday = "$paymentServer/ride/payment/get.php"; + static String getCountRide = "$rideServer/payment/getCountRide.php"; + static String getAllPaymentFromRide = + "$paymentServer/ride/payment/getAllPayment.php"; + static String getAllPaymentVisa = + "$paymentServer/ride/payment/getAllPaymentVisa.php"; + +//-----------------Passenger NotificationCaptain------------------ + static String addNotificationPassenger = + "$ride/notificationPassenger/add.php"; + static String getNotificationPassenger = + "$ride/notificationPassenger/get.php"; + static String updateNotificationPassenger = + "$ride/notificationPassenger/update.php"; +//-----------------Driver NotificationCaptain------------------ + static String addNotificationCaptain = "$ride/notificationCaptain/add.php"; + static String addWaitingRide = "$ride/notificationCaptain/addWaitingRide.php"; + static String deleteAvailableRide = + "$ride/notificationCaptain/deleteAvailableRide.php"; + static String updateWaitingRide = + "$ride/notificationCaptain/updateWaitingTrip.php"; + static String getRideWaiting = + "$endPoint/ride/notificationCaptain/getRideWaiting.php"; + static String getNotificationCaptain = "$ride/notificationCaptain/get.php"; + static String updateNotificationCaptain = + "$ride/notificationCaptain/update.php"; + static String deleteNotificationCaptain = + "$ride/notificationCaptain/delete.php"; + //-----------------Api Key------------------ + static String addApiKey = "$ride/apiKey/add.php"; + static String getApiKey = "$ride/apiKey/get.php"; + static String getCnMap = "$server/auth/cnMap.php"; + static String getPromptDriverDocumentsEgypt = + "$server/auth/captin/getPromptDriverDocumentsEgypt.php"; + + static String updateApiKey = "$ride/apiKey/update.php"; + static String deleteApiKey = "$ride/apiKey/delete.php"; + static String checkPhoneNumberISVerfiedDriver = + "$auth/checkPhoneNumberISVerfiedDriver.php"; + static String getTesterApp = "$auth/Tester/getTesterApp.php"; + static String updateTesterApp = "$auth/Tester/updateTesterApp.php"; + +//-----------------healthInsuranceProvider------------------ + static String addHealthInsuranceProvider = "$server/driver_assurance/add.php"; + static String getHealthInsuranceProvider = "$server/driver_assurance/get.php"; + +//-----------------Feed Back------------------ + static String addFeedBack = "$ride/feedBack/add.php"; + static String getFeedBack = "$ride/feedBack/get.php"; + static String updateFeedBack = "$ride/feedBack/updateFeedBack.php"; + static String add_solve_all = "$server/ride/feedBack/add_solve_all.php"; + static String uploadAudio = "$server/upload_audio.php"; + + //-----------------Tips------------------ + static String addTips = "$ride/tips/add.php"; + static String getTips = "$ride/tips/get.php"; + static String updateTips = "$ride/tips/update.php"; + +//-----------------Help Center------------------ + static String addhelpCenter = "$ride/helpCenter/add.php"; + static String gethelpCenter = "$ride/helpCenter/get.php"; + static String getByIdhelpCenter = "$ride/helpCenter/getById.php"; + static String updatehelpCenter = "$ride/helpCenter/update.php"; + static String deletehelpCenter = "$ride/helpCenter/delete.php"; + + //-----------------license------------------ + static String addLicense = "$ride/license/add.php"; + static String getLicense = "$ride/license/get.php"; + static String updateLicense = "$ride/license/updateFeedBack.php"; +//-----------------RegisrationCar------------------ + static String addRegisrationCar = "$ride/RegisrationCar/add.php"; + static String getRegisrationCar = "$endPoint/ride/RegisrationCar/get.php"; + static String updateRegisrationCar = "$ride/RegisrationCar/update.php"; + static String makeDefaultCar = "$ride/RegisrationCar/makeDefaultCar.php"; + +//-----------------DriverOrder------------------ + + static String addDriverOrder = "$ride/driver_order/add.php"; + static String getDriverOrder = "$ride/driver_order/get.php"; + static String getOrderCancelStatus = + "$ride/driver_order/getOrderCancelStatus.php"; + static String updateDriverOrder = "$ride/driver_order/update.php"; + static String deleteDriverOrder = "$ride/driver_order/delete.php"; + + // ===================================== + static String addRateToPassenger = "$ride/rate/add.php"; + static String addRateToDriver = "$ride/rate/addRateToDriver.php"; + static String addRateApp = "$ride/rate/add_rate_app.php"; + static String sendEmailRateingApp = "$ride/rate/sendEmailRateingApp.php"; + static String getDriverRate = "$ride/rate/getDriverRate.php"; + static String getPassengerRate = "$ride/rate/getPassengerRate.php"; + + ////////////////emails ============// + static String sendEmailToPassengerForTripDetails = + "$ride/rides/emailToPassengerTripDetail.php"; + static String sendEmailToDrivertransaction = + "$server/Admin/sendEmailToDrivertransaction.php"; +// =========================================== + static String pathImage = "$server/upload/types/"; + static String uploadImage = "$server/uploadImage.php"; + static String uploadImage1 = "$server/uploadImage1.php"; + static String uploadImagePortrate = "$server/uploadImagePortrate.php"; + static String uploadSyrianDocs = "$syria/auth/syria/uploadSyrianDocs.php"; + static String uploadImageType = "$server/uploadImageType.php"; +//=============egypt documents ============== + static String uploadEgyptidFront = + "$server/EgyptDocuments/uploadEgyptidFront.php"; + static String uploadEgypt = "$server/uploadEgypt.php"; + static String uploadEgypt1 = "$server/uploadEgypt1.php"; + + //==================certifcate========== + // static String location = '$endPoint/ride/location'; + + static String getCarsLocationByPassenger = "$locationServer/get.php"; + static String addpassengerLocation = + "$locationServer/addpassengerLocation.php"; + static String getLocationAreaLinks = + "$locationServer/get_location_area_links.php"; + static String getLatestLocationPassenger = + "$locationServer/getLatestLocationPassenger.php"; + static String getFemalDriverLocationByPassenger = + "$locationServer/getFemalDriver.php"; + static String getDriverCarsLocationToPassengerAfterApplied = + "$locationServer/getDriverCarsLocationToPassengerAfterApplied.php"; + static String addCarsLocationByPassenger = "$locationServer/add.php"; + static String saveBehavior = "$locationServer/save_behavior.php"; + static String addCarsLocationGizaEndpoint = "$locationServer/add.php"; + static String addCarsLocationAlexandriaEndpoint = "$locationServer/add.php"; + static String addCarsLocationCairoEndpoint = "$locationServer/add.php"; + static String deleteCarsLocationByPassenger = "$locationServer/delete.php"; + static String updateCarsLocationByPassenger = "$locationServer/update.php"; + static String getTotalDriverDuration = + "$locationServer/getTotalDriverDuration.php"; + static String getRidesDriverByDay = "$locationServer/getRidesDriverByDay.php"; + static String getTotalDriverDurationToday = + "$locationServer/getTotalDriverDurationToday.php"; + + //==================get_driver_behavior.php============= + static String get_driver_behavior = + '$ride/driver_behavior/get_driver_behavior.php'; + + //==================cars new drivers============= + static String addNewCarsDrivers = '$ride/carDrivers/add.php'; + static String getNewCarsDrivers = '$ride/carDrivers/get.php'; + static String deleteNewCarsDrivers = '$ride/carDrivers/delete.php'; + + //==================Blog============= + static String profile = '$ride/profile'; + static String getprofile = "$profile/get.php"; + static String getCaptainProfile = "$profile/getCaptainProfile.php"; + static String addprofile = "$profile/add.php"; + static String deleteprofile = "$profile/delete.php"; + static String updateprofile = "$profile/update.php"; + static String updateDriverEmail = "$profile/updateDriverEmail.php"; + + //===================Auth============ + + static String addInviteDriver = "$ride/invitor/add.php"; + static String addInvitationPassenger = + "$ride/invitor/addInvitationPassenger.php"; + static String getInviteDriver = "$ride/invitor/get.php"; + static String getDriverInvitationToPassengers = + "$ride/invitor/getDriverInvitationToPassengers.php"; + static String updateInviteDriver = "$ride/invitor/update.php"; + static String updatePassengerGift = "$ride/invitor/updatePassengerGift.php"; + static String updateInvitationCodeFromRegister = + "$ride/invitor/updateInvitationCodeFromRegister.php"; + static String register_driver_and_car = + "$auth/syria/driver/register_driver_and_car.php"; + static String updateDriverInvitationDirectly = + "$ride/invitor/updateDriverInvitationDirectly.php"; + static String updatePassengersInvitation = + "$ride/invitor/updatePassengersInvitation.php"; + + //===================Auth============ + + static String auth = '$server/auth'; + static String login = "$auth/login.php"; + static String signUp = "$auth/signup.php"; + static String updateDriverClaim = "$auth/captin/updateDriverClaim.php"; + static String updateShamCashDriver = "$auth/captin/updateShamCashDriver.php"; + static String sendVerifyEmail = "$auth/sendVerifyEmail.php"; + static String passengerRemovedAccountEmail = + "$auth/passengerRemovedAccountEmail.php"; + static String verifyEmail = "$auth/verifyEmail.php"; +//===================Auth Captin============ + static String authCaptin = '$server/auth/captin'; + static String loginCaptin = "$authCaptin/login.php"; + static String loginFromGoogleCaptin = "$authCaptin/loginFromGoogle.php"; + static String loginUsingCredentialsWithoutGoogle = + "$authCaptin/loginUsingCredentialsWithoutGoogle.php"; + static String packageInfo = "$server/auth/packageInfo.php"; + static String signUpCaptin = "$authCaptin/register.php"; + static String addCriminalDocuments = "$authCaptin/addCriminalDocuments.php"; + static String sendVerifyEmailCaptin = "$authCaptin/sendVerifyEmail.php"; + static String sendVerifyOtpMessage = + "$server/auth/captin/sendOtpMessageDriver.php"; + static String verifyOtpMessage = "$server/auth/verifyOtpMessage.php"; + static String verifyOtpDriver = "$server/auth/captin/verifyOtpDriver.php"; + static String verifyEmailCaptin = "$authCaptin/verifyEmail.php"; + static String removeUser = "$authCaptin/removeAccount.php"; + static String deletecaptainAccounr = "$authCaptin/deletecaptainAccounr.php"; + static String updateAccountBank = "$authCaptin/updateAccountBank.php"; + static String getAccount = "$authCaptin/getAccount.php"; + static String uploadImageToAi = "$auth/document_syria/ai_document.php"; + static String isPhoneVerified = "$auth/syria/driver/isPhoneVerified.php"; + + //===================Admin Captin============ + + static String getPassengerDetailsByPassengerID = + "$server/Admin/getPassengerDetailsByPassengerID.php"; + static String getPassengerDetails = "$server/Admin/getPassengerDetails.php"; + static String getPassengerbyEmail = "$server/Admin/getPassengerbyEmail.php"; + static String addAdminUser = "$server/Admin/adminUser/add.php"; + static String addError = "$server/Admin/errorApp.php"; + static String getAdminUser = "$server/Admin/adminUser/get.php"; + static String getCaptainDetailsByEmailOrIDOrPhone = + "$server/Admin/AdminCaptain/getCaptainDetailsByEmailOrIDOrPhone.php"; + static String getCaptainDetails = "$server/Admin/AdminCaptain/get.php"; + static String getRidesPerMonth = + "$server/Admin/AdminRide/getRidesPerMonth.php"; + static String getRidesDetails = "$server/Admin/AdminRide/get.php"; + +//////////Sms egypt/////////// + static String sendSms = "https://sms.kazumi.me/api/sms/send-sms"; + static String senddlr = "https://sms.kazumi.me/api/sms/send-dlr"; + static String sendvalidity = "https://sms.kazumi.me/api/sms/send-validity"; + static String sendmany = "https://sms.kazumi.me/api/sms/send-many"; + static String checkCredit = "https://sms.kazumi.me/api/sms/check-credit"; + static String checkStatus = "https://sms.kazumi.me/api/sms/check-status"; + static String getSender = "$server/auth/sms/getSender.php"; + static String updatePhoneInvalidSMS = + "$server/auth/sms/updatePhoneInvalidSMS.php"; + + //////////////service/////////// + + static String serviceApp = "$server/serviceapp"; + static String getComplaintAllData = "$serviceApp/getComplaintAllData.php"; + static String getComplaintAllDataForDriver = + "$serviceApp/getComplaintAllDataForDriver.php"; +} diff --git a/siro_driver/lib/constant/notification.dart b/siro_driver/lib/constant/notification.dart new file mode 100755 index 0000000..b9654bb --- /dev/null +++ b/siro_driver/lib/constant/notification.dart @@ -0,0 +1,31 @@ +List syrianDriverMessages = [ + // --- أوقات الذروة والطلبات الكتيرة --- + "وقت الذروة: البلد مولّعة مشاوير! 🌃 افتح التطبيق بسرعة وبلّش أرباحك تدبّل.", + "طلبات كتير حواليك: ⚠️ خليك أول كابتن بيلتقط الطلب وخلّي يومك رابح.", + "الناس طالعة من الشغل: 🌇 الكل راجع عالبيت، خليك جاهز لرحلات كتيرة!", + "زحمة المساء: ⏳ الزباين عم تزيد بهالوقت، لا تضيّع الفرصة واشتغل معنا!", + + // --- التركيز عالربح والمصاري --- + "ضاعف ربحك: 💰 كل مشوار بيقربك من هدفك اليومي. جاهز تنطلق؟", + "مصاري أكتر: جزدانك ناطر تعبك، كل دقيقة شغل هي ربح مضمون. 💪", + "خليك بالواجهة: الطلب الجاي ممكن يكون إلك، كبسة زر بتجيبلك رزقة اليوم.", + "رزقتك جاهزة: 💸 لا تخلّي الزباين يستنّوا، افتح التطبيق وخليك متأهّب.", + + // --- التقدير والشكر --- + "شكراً إلك: 🙏 إنت مو بس سائق، إنت أساس نجاح تطبيق انطلق.", + "نفتخر فيك: 🌟 الكباتن متلك هنن يلي رافعين اسمنا بالعالي.", + "أداء ممتاز: 👍 استمر بنفس الروح الحلوة، زباينك مبسوطين منك.", + "نجاح مشترك: 🗺️ كل توصيلة بتعملها بتكبر فيها شركتنا وانت كمان.", + + // --- التحفيز والتشجيع --- + "صباح النشاط: ☀️ بلّش نهارك بطاقة إيجابية وانطلق لتكسب أكتر.", + "كل مشوار فرصة: 🏁 لا توقف، الطريق لإلك والنجاح ناطرك.", + "يوم مربح: 💼 السوق ناشط اليوم، لا تفوّت الفرصة!", + "جاهز للطلب الجاي: 🔔 الزبون الجاي ممكن يكون أوفر ممتاز، خليك مستعد.", + + // --- نصايح ومعلومات --- + "نصيحة اليوم: روح صوب الأسواق والمطاعم، الطلب هناك عالي هالفترة. 🏙️", + "حافظ على تقييمك: 😊 الزبون بينجذب للكابتن يلي عنده تقييم عالي وابتسامة.", + "جو ممطر: 🌧️ المطر يعني طلبات أكتر، خليك شغّال بهالوقت!", + "حدث اليوم: 🎆 في فعالية بالبلد، المشاوير كتيرة بهالمنطقة، استغلها!" +]; diff --git a/siro_driver/lib/constant/style.dart b/siro_driver/lib/constant/style.dart new file mode 100755 index 0000000..f234f64 --- /dev/null +++ b/siro_driver/lib/constant/style.dart @@ -0,0 +1,74 @@ +import 'package:siro_driver/constant/box_name.dart'; +import 'package:siro_driver/main.dart'; +import 'package:flutter/material.dart'; +import 'package:google_fonts/google_fonts.dart'; +import 'colors.dart'; + +class AppStyle { + static TextStyle get headTitle => TextStyle( + fontWeight: FontWeight.bold, + fontSize: 36, + color: AppColor.accentColor, + fontFamily: box.read(BoxName.lang) == 'ar' + // ?GoogleFonts.markaziText().fontFamily + ? GoogleFonts.markaziText().fontFamily + : GoogleFonts.inter().fontFamily); + static TextStyle get headTitle2 => TextStyle( + fontWeight: FontWeight.bold, + fontSize: 24, + color: AppColor.writeColor, + fontFamily: box.read(BoxName.lang) == 'ar' + ? GoogleFonts.markaziText().fontFamily + : GoogleFonts.inter().fontFamily); + static TextStyle get title => TextStyle( + fontWeight: FontWeight.normal, + fontSize: 16, + color: AppColor.writeColor, + fontFamily: box.read(BoxName.lang) == 'ar' + ? GoogleFonts.markaziText().fontFamily + : GoogleFonts.inter().fontFamily); + static TextStyle get subtitle => TextStyle( + fontWeight: FontWeight.bold, + fontSize: 12, + color: AppColor.writeColor, + fontFamily: box.read(BoxName.lang) == 'ar' + ? GoogleFonts.markaziText().fontFamily + : GoogleFonts.inter().fontFamily); + static TextStyle get number => TextStyle( + fontWeight: FontWeight.bold, + fontSize: 14, + color: AppColor.writeColor, + fontFamily: 'digit'); + + static BoxDecoration get boxDecoration => BoxDecoration( + boxShadow: [ + BoxShadow( + color: AppColor.accentColor.withValues(alpha: 0.3), + blurRadius: 5, + offset: const Offset(2, 4)), + BoxShadow( + color: AppColor.accentColor.withValues(alpha: 0.1), + blurRadius: 5, + offset: const Offset(-2, -2)) + ], + color: AppColor.secondaryColor, + borderRadius: const BorderRadius.all( + Radius.elliptical(15, 30), + )); + static BoxDecoration get boxDecoration1 => BoxDecoration( + boxShadow: [ + BoxShadow( + color: Colors.black.withValues(alpha: 0.05), + blurRadius: 10, + offset: const Offset(0, 4)), + BoxShadow( + color: AppColor.primaryColor.withValues(alpha: 0.02), + blurRadius: 5, + offset: const Offset(-2, -2)) + ], + color: AppColor.secondaryColor, + borderRadius: const BorderRadius.all( + Radius.elliptical(15, 30), + ), + ); +} diff --git a/siro_driver/lib/constant/table_names.dart b/siro_driver/lib/constant/table_names.dart new file mode 100755 index 0000000..6e1b658 --- /dev/null +++ b/siro_driver/lib/constant/table_names.dart @@ -0,0 +1,19 @@ +class TableName { + static const String placesFavorite = "placesFavorite"; + static const String recentLocations = "recentLocations"; + static const String carLocations = "carLocations"; + static const String driverOrdersRefuse = "driverOrdersRefuse"; + static const String rideLocation = "rideLocation"; + static const String faceDetectTimes = "faceDetectTimes"; + static const String behavior = "behavior"; + static const String captainNotification = "captainNotification"; + static const String applyRideFromOverLay = "applyRideFromOverLay"; +} + +class Driver { + static const String driverPass = 'MG6DEJZSczBT6Rx0jOlehQ=='; + static const String payMobApikey = 'payMobApikey'; + static const String initializationVector = 'initializationVector'; + static const String keyOfApp = 'keyOfApp'; + static const String FCM_PRIVATE_KEY = 'FCM_PRIVATE_KEY'; +} diff --git a/siro_driver/lib/controller/auth/apple_sigin.dart b/siro_driver/lib/controller/auth/apple_sigin.dart new file mode 100755 index 0000000..a624cae --- /dev/null +++ b/siro_driver/lib/controller/auth/apple_sigin.dart @@ -0,0 +1,34 @@ +import 'package:firebase_auth/firebase_auth.dart'; +import 'package:get/get.dart'; +import 'package:sign_in_with_apple/sign_in_with_apple.dart'; + +class AuthController extends GetxController { + final FirebaseAuth _auth = FirebaseAuth.instance; + + Future signInWithApple() async { + try { + final appleCredential = await SignInWithApple.getAppleIDCredential( + scopes: [ + AppleIDAuthorizationScopes.email, + AppleIDAuthorizationScopes.fullName, + ], + ); + + final oAuthProvider = OAuthProvider('apple.com'); + final credential = oAuthProvider.credential( + idToken: appleCredential.identityToken, + accessToken: appleCredential.authorizationCode, + ); + + UserCredential userCredential = + await _auth.signInWithCredential(credential); + return userCredential.user; + } catch (error) { + return null; + } + } + + void signOut() async { + await _auth.signOut(); + } +} diff --git a/siro_driver/lib/controller/auth/captin/history_captain.dart b/siro_driver/lib/controller/auth/captin/history_captain.dart new file mode 100755 index 0000000..f88cce6 --- /dev/null +++ b/siro_driver/lib/controller/auth/captin/history_captain.dart @@ -0,0 +1,60 @@ +import 'dart:convert'; + +import 'package:siro_driver/views/widgets/elevated_btn.dart'; +import 'package:get/get.dart'; + +import '../../../constant/box_name.dart'; +import '../../../constant/links.dart'; +import '../../../main.dart'; +import '../../../views/home/Captin/history/history_details_page.dart'; +import '../../functions/crud.dart'; + +class HistoryCaptainController extends GetxController { + bool isloading = false; + Map historyData = {}; + Map historyDetailsData = {}; + late String orderID; + getOrderId(String orderId) { + orderID = orderId; + update(); + } + + getHistory() async { + isloading = true; + var res = await CRUD().get( + link: AppLink.getDriverOrder, + payload: {'driver_id': box.read(BoxName.driverID)}); + if (res != 'failure') { + historyData = jsonDecode(res); + isloading = false; + update(); + } else { + Get.defaultDialog( + title: 'No ride yet'.tr, + middleText: '', + barrierDismissible: false, + confirm: MyElevatedButton( + title: 'Back'.tr, + onPressed: () { + Get.back(); + Get.back(); + })); + } + } + + getHistoryDetails(String orderId) async { + isloading = true; + var res = await CRUD() + .get(link: AppLink.getRideOrderID, payload: {'id': (orderId)}); + historyDetailsData = jsonDecode(res); + isloading = false; + update(); + Get.to(() => HistoryDetailsPage()); + } + + @override + void onInit() { + getHistory(); + super.onInit(); + } +} diff --git a/siro_driver/lib/controller/auth/captin/invit_controller.dart b/siro_driver/lib/controller/auth/captin/invit_controller.dart new file mode 100755 index 0000000..f628a71 --- /dev/null +++ b/siro_driver/lib/controller/auth/captin/invit_controller.dart @@ -0,0 +1,609 @@ +import 'dart:convert'; +import 'dart:developer'; + +import 'package:flutter/material.dart'; +import 'package:flutter_contacts/contact.dart'; +import 'package:flutter_contacts/flutter_contacts.dart'; +import 'package:get/get.dart'; +import 'package:local_auth/local_auth.dart'; +import 'package:siro_driver/constant/box_name.dart'; +import 'package:siro_driver/constant/links.dart'; +import 'package:siro_driver/controller/functions/crud.dart'; +import 'package:siro_driver/controller/home/payment/captain_wallet_controller.dart'; +import 'package:siro_driver/main.dart'; +import 'package:siro_driver/views/widgets/error_snakbar.dart'; +import 'package:siro_driver/views/widgets/mydialoug.dart'; +import 'package:share_plus/share_plus.dart'; + +import '../../firebase/local_notification.dart'; +import '../../functions/launch.dart'; +import '../../notification/notification_captain_controller.dart'; + +class InviteController extends GetxController { + final TextEditingController invitePhoneController = TextEditingController(); + List driverInvitationData = []; + List driverInvitationDataToPassengers = []; + String? couponCode; + String? driverCouponCode; + + // **FIX**: Added the missing 'contacts' and 'contactMaps' definitions. + List contacts = []; + RxList> contactMaps = >[].obs; + + int selectedTab = 0; + PassengerStats passengerStats = PassengerStats(); + void updateSelectedTab(int index) { + selectedTab = index; + update(); + } + + Future shareDriverCode() async { + if (driverCouponCode != null) { + final String shareText = + '''Join Intaleq as a driver using my referral code! +Use code: $driverCouponCode +Download the Intaleq Driver app now and earn rewards! +'''; + await Share.share(shareText); + } + } + + Future sharePassengerCode() async { + if (couponCode != null) { + final String shareText = '''Get a discount on your first Intaleq ride! +Use my referral code: $couponCode +Download the Intaleq app now and enjoy your ride! +'''; + await Share.share(shareText); + } + } + + @override + void onInit() { + super.onInit(); + // **MODIFIED**: Sync contacts automatically on controller initialization. + syncContactsToServerOnce(); + // fetchDriverStats(); + } + + // --- NEW LOGIC: ONE-TIME CONTACTS SYNC --- + + /// **NEW**: Syncs all phone contacts to the server, but only runs once per user. + Future syncContactsToServerOnce() async { + final String syncFlagKey = 'contactsSynced_${box.read(BoxName.driverID)}'; + + // 1. Check if contacts have already been synced for this user. + if (box.read(syncFlagKey) == true) { + print("Contacts have already been synced for this user."); + return; + } + + try { + // 2. Request permission and fetch all contacts. + if (await FlutterContacts.requestPermission(readonly: true)) { + // mySnackbarSuccess('Starting contacts sync in background...'.tr); + final List allContacts = + await FlutterContacts.getContacts(withProperties: true); + // **FIX**: Assign fetched contacts to the class variable. + contacts = allContacts; + contactMaps.value = contacts.map((contact) { + return { + 'name': contact.displayName, + 'phones': + contact.phones.map((phone) => phone.normalizedNumber).toList(), + 'emails': contact.emails.map((email) => email.address).toList(), + }; + }).toList(); + update(); + + // 3. Loop through contacts and save them to the server. + for (var contact in allContacts) { + if (contact.phones.isNotEmpty) { + // Use the normalized phone number for consistency. + var phone = contact.phones.first.normalizedNumber; + if (phone.isNotEmpty) { + CRUD().post(link: AppLink.savePhonesSyria, payload: { + "driverId": box.read(BoxName.driverID), // Associate with driver + "name": contact.displayName ?? 'No Name', + "phone": phone, + }); + } + } + } + + // 4. After a successful sync, set the flag to prevent future syncs. + await box.write(syncFlagKey, true); + // mySnackbarSuccess('Contacts sync completed successfully!'.tr); + } + } catch (e) { + // mySnackeBarError('An error occurred during contact sync: $e'.tr); + } + } + + // --- NEW LOGIC: NATIVE CONTACT PICKER --- + + /// **MODIFIED**: This function now opens the phone's native contact picker. + Future pickContactFromNativeApp() async { + try { + log('=== START: FETCHING ALL CONTACTS FOR BOTTOM SHEET ===', + name: 'ContactPicker'); + + if (await FlutterContacts.requestPermission(readonly: true)) { + // عرض شاشة تحميل بسيطة ريثما يتم جلب الأسماء + Get.dialog(const Center(child: CircularProgressIndicator()), + barrierDismissible: false); + + log('Permission granted. Calling FlutterContacts.getContacts()...', + name: 'ContactPicker'); + + // جلب جميع جهات الاتصال إجبارياً من الصفر مع خصائصها + List allContacts = + await FlutterContacts.getContacts(withProperties: true); + + log('Total Contacts Fetched from Device: ${allContacts.length}', + name: 'ContactPicker'); + + // فصل الأسماء لمعرفة الخلل + List validContacts = []; + List invalidContacts = []; + + for (var c in allContacts) { + if (c.phones.isNotEmpty) { + validContacts.add(c); + } else { + invalidContacts.add(c); + } + } + + log('Contacts WITH phone numbers: ${validContacts.length}', + name: 'ContactPicker'); + log('Contacts WITHOUT phone numbers: ${invalidContacts.length}', + name: 'ContactPicker'); + + // طباعة أول 20 اسم صالح + log('--- Sample of VALID Contacts ---', name: 'ContactPicker'); + for (int i = 0; i < validContacts.length && i < 20; i++) { + log('[$i] Name: ${validContacts[i].displayName}, Phone: ${validContacts[i].phones.first.number}', + name: 'ContactPicker'); + } + + // طباعة أول 20 اسم غير صالح (بدون أرقام) لفحص المشكلة + log('--- Sample of INVALID Contacts (No Phone) ---', + name: 'ContactPicker'); + for (int i = 0; i < invalidContacts.length && i < 20; i++) { + log('[$i] Name: ${invalidContacts[i].displayName}', + name: 'ContactPicker'); + } + + Get.back(); // إغلاق شاشة التحميل + + if (validContacts.isEmpty) { + mySnackeBarError('No contacts with phone numbers found'.tr); + return; + } + + // متغيرات للبحث داخل القائمة المنسدلة + RxList filteredContacts = validContacts.obs; + TextEditingController searchController = TextEditingController(); + + // دالة لتنظيف النصوص من أي رموز معطوبة + String sanitizeText(String input) { + if (input.isEmpty) return ''; + return input + .replaceAll( + RegExp(r'[^\x00-\x7F\u0600-\u06FF\u08A0-\u08FF\p{L}\p{N}\s]'), + '') + .trim(); + } + + // فتح دليل هاتف مخصص داخل التطبيق + Get.bottomSheet( + Container( + height: Get.height * 0.85, + decoration: BoxDecoration( + color: Theme.of(Get.context!).scaffoldBackgroundColor, + borderRadius: + const BorderRadius.vertical(top: Radius.circular(20)), + ), + child: Column( + children: [ + Container( + margin: const EdgeInsets.only(top: 10, bottom: 10), + width: 50, + height: 5, + decoration: BoxDecoration( + color: Colors.grey[400], + borderRadius: BorderRadius.circular(10)), + ), + Text("Select a Contact".tr, + style: const TextStyle( + fontSize: 18, fontWeight: FontWeight.bold)), + Padding( + padding: const EdgeInsets.all(12.0), + child: TextField( + controller: searchController, + decoration: InputDecoration( + hintText: "Search name or number...".tr, + prefixIcon: const Icon(Icons.search), + border: OutlineInputBorder( + borderRadius: BorderRadius.circular(10)), + contentPadding: const EdgeInsets.symmetric(vertical: 0), + ), + onChanged: (value) { + filteredContacts.value = validContacts.where((c) { + final nameMatch = c.displayName + .toLowerCase() + .contains(value.toLowerCase()); + final phoneMatch = + c.phones.first.number.contains(value); + return nameMatch || phoneMatch; + }).toList(); + }, + ), + ), + Expanded( + child: Obx(() => ListView.builder( + itemCount: filteredContacts.length, + itemBuilder: (context, index) { + Contact c = filteredContacts[index]; + var firstPhone = c.phones.first; + + String selectedPhone = + firstPhone.normalizedNumber.isNotEmpty + ? firstPhone.normalizedNumber + : firstPhone.number; + + String safeName = sanitizeText(c.displayName); + if (safeName.isEmpty) safeName = 'Unknown'.tr; + + String safePhone = sanitizeText(selectedPhone); + String initial = safeName.isNotEmpty + ? safeName[0].toUpperCase() + : '?'; + + return ListTile( + leading: CircleAvatar( + backgroundColor: + Colors.blueAccent.withOpacity(0.1), + child: Text(initial, + style: const TextStyle( + color: Colors.blueAccent)), + ), + title: Text(safeName), + subtitle: Text(safePhone, + textDirection: TextDirection.ltr), + onTap: () { + selectPhone(selectedPhone); + }, + ); + }, + )), + ), + ], + ), + ), + isScrollControlled: true, + ); + } else { + log('Permission DENIED', name: 'ContactPicker'); + mySnackeBarError('Contact permission is required to pick contacts'.tr); + } + } catch (e) { + if (Get.isDialogOpen ?? false) Get.back(); + log('CRITICAL ERROR: $e', name: 'ContactPicker'); + mySnackeBarError('An error occurred while loading contacts: $e'.tr); + } + log('=== END: FETCHING CONTACTS ===', name: 'ContactPicker'); + } + + /// **FIX**: Added the missing 'selectPhone' method. + void selectPhone(String phone) { + // Format the selected phone number and update the text field. + invitePhoneController.text = _formatSyrianPhoneNumber(phone); + update(); + Get.back(); // Close the contacts dialog after selection. + } + + void fetchDriverStats() async { + try { + var response = await CRUD().get(link: AppLink.getInviteDriver, payload: { + "driverId": box.read(BoxName.driverID), + }); + if (response != 'failure') { + var data = jsonDecode(response); + driverInvitationData = data['message']; + update(); + } + } catch (e) { + // Handle error gracefully + } + } + + void fetchDriverStatsPassengers() async { + try { + var response = await CRUD() + .get(link: AppLink.getDriverInvitationToPassengers, payload: { + "driverId": box.read(BoxName.driverID), + }); + if (response != 'failure') { + var data = jsonDecode(response); + driverInvitationDataToPassengers = data['message']; + update(); + } + } catch (e) { + // Handle error gracefully + } + } + + void onSelectDriverInvitation(int index) async { + MyDialog().getDialog( + int.parse((driverInvitationData[index]['countOfInvitDriver'])) < 100 + ? '${'When'.tr} ${(driverInvitationData[index]['invitorName'])} ${"complete, you can claim your gift".tr} ' + : 'You deserve the gift'.tr, + '${(driverInvitationData[index]['invitorName'])} ${(driverInvitationData[index]['countOfInvitDriver'])} / 100 ${'Trip'.tr}', + () async { + bool isAvailable = await LocalAuthentication().isDeviceSupported(); + if (int.parse((driverInvitationData[index]['countOfInvitDriver'])) < + 100) { + Get.back(); + } else if (isAvailable) { + bool didAuthenticate = await LocalAuthentication().authenticate( + localizedReason: 'Use Touch ID or Face ID to confirm payment', + // options: const AuthenticationOptions( + biometricOnly: true, + sensitiveTransaction: true, + ); + if (didAuthenticate) { + if ((driverInvitationData[index]['isGiftToken']).toString() == + '0') { + Get.back(); + await CRUD().post( + link: AppLink.updateInviteDriver, + payload: {'id': (driverInvitationData[index]['id'])}); + await Get.find().addDriverPayment( + 'paymentMethod', + ('500'), + '', + ); + await Get.find() + .addDriverWalletToInvitor( + 'paymentMethod', + (driverInvitationData[index]['driverInviterId']), + ('500'), + ); + NotificationCaptainController().addNotificationCaptain( + driverInvitationData[index]['driverInviterId'].toString(), + "You have got a gift for invitation".tr, + '${"You have 500".tr} ${'SYP'.tr}', + false); + NotificationController().showNotification( + "You have got a gift for invitation".tr, + '${"You have 500".tr} ${'SYP'.tr}', + 'tone1', + ''); + } else { + Get.back(); + MyDialog().getDialog("You have got a gift".tr, + "Share the app with another new driver".tr, () => Get.back()); + } + } else { + MyDialog() + .getDialog('Authentication failed'.tr, '', () => Get.back()); + } + } else { + MyDialog().getDialog( + 'Biometric Authentication'.tr, + 'You should use Touch ID or Face ID to confirm payment'.tr, + () => Get.back()); + } + }, + ); + } + + void onSelectPassengerInvitation(int index) async { + bool isAvailable = await LocalAuthentication().isDeviceSupported(); + MyDialog().getDialog( + int.parse(driverInvitationDataToPassengers[index]['countOfInvitDriver'] + .toString()) < + 3 + ? '${'When'.tr} ${(driverInvitationDataToPassengers[index]['passengerName'].toString())} ${"complete, you can claim your gift".tr} ' + : 'You deserve the gift'.tr, + '${(driverInvitationDataToPassengers[index]['passengerName'].toString())} ${driverInvitationDataToPassengers[index]['countOfInvitDriver']} / 3 ${'Trip'.tr}', + () async { + if (int.parse(driverInvitationDataToPassengers[index] + ['countOfInvitDriver'] + .toString()) < + 3) { + Get.back(); + } else if (isAvailable) { + bool didAuthenticate = await LocalAuthentication().authenticate( + localizedReason: 'Use Touch ID or Face ID to confirm payment', + // options: const AuthenticationOptions( + biometricOnly: true, + sensitiveTransaction: true, + ); + if (didAuthenticate) { + if (driverInvitationDataToPassengers[index]['isGiftToken'] + .toString() == + '0') { + Get.back(); + await Get.find() + .addDriverWallet('paymentMethod', '200', '200'); + await Get.find() + .addDriverWalletToInvitor('paymentMethod', + driverInvitationData[index]['driverInviterId'], '200'); + await CRUD().post( + link: AppLink.updatePassengerGift, + payload: {'id': driverInvitationDataToPassengers[index]['id']}, + ); + NotificationCaptainController().addNotificationCaptain( + driverInvitationDataToPassengers[index]['passengerInviterId'] + .toString(), + "You have got a gift for invitation".tr, + '${"You have 200".tr} ${'SYP'.tr}', + false, + ); + } else { + Get.back(); + MyDialog().getDialog( + "You have got a gift".tr, + "Share the app with another new passenger".tr, + () => Get.back(), + ); + } + } else { + MyDialog() + .getDialog('Authentication failed'.tr, '', () => Get.back()); + } + } else { + MyDialog().getDialog( + 'Biometric Authentication'.tr, + 'You should use Touch ID or Face ID to confirm payment'.tr, + () => Get.back()); + } + }, + ); + } + + /// Formats a phone number to the standard Syrian international format (+963...). + String _formatSyrianPhoneNumber(String input) { + String digitsOnly = input.replaceAll(RegExp(r'\D'), ''); + + if (digitsOnly.startsWith('09') && digitsOnly.length == 10) { + return '963${digitsOnly.substring(1)}'; + } + if (digitsOnly.length == 9 && digitsOnly.startsWith('9')) { + return '963$digitsOnly'; + } + return input; // Fallback for unrecognized formats + } + + String normalizeSyrianPhone(String input) { + String phone = input.trim(); + + // احذف كل شيء غير أرقام + phone = phone.replaceAll(RegExp(r'[^0-9]'), ''); + + // إذا يبدأ بـ 0 → احذفها + if (phone.startsWith('0')) { + phone = phone.substring(1); + } + + // إذا يبدأ بـ 963 مكررة → احذف التكرار + while (phone.startsWith('963963')) { + phone = phone.substring(3); + } + + // إذا يبدأ بـ 963 ولكن داخله كمان 963 → خليه مرة واحدة فقط + if (phone.startsWith('963') && phone.length > 12) { + phone = phone.substring(phone.length - 9); // آخر 9 أرقام + } + + // الآن إذا كان بلا 963 → أضفها + if (!phone.startsWith('963')) { + phone = '963' + phone; + } + + return phone; + } + + /// Sends an invitation to a potential new driver. + void sendInvite() async { + if (invitePhoneController.text.isEmpty) { + mySnackeBarError('Please enter a phone number'.tr); + return; + } + // Format Syrian phone number: remove leading 0 and add +963 + String formattedPhoneNumber = + normalizeSyrianPhone(invitePhoneController.text); + if (formattedPhoneNumber.length != 12) { + mySnackeBarError('Please enter a correct phone'.tr); + return; + } + + var response = await CRUD().post(link: AppLink.addInviteDriver, payload: { + "driverId": box.read(BoxName.driverID), + "inviterDriverPhone": formattedPhoneNumber, + }); + + if (response != 'failure') { + var d = (response); + mySnackbarSuccess('Invite sent successfully'.tr); + String message = '${'*Intaleq DRIVER CODE*'.tr}\n\n' + '${"Use this code in registration".tr}\n' + '${"To get a gift for both".tr}\n\n' + '${"The period of this code is 24 hours".tr}\n\n' + '${'before'.tr} *${d['message']['expirationTime'].toString()}*\n\n' + '_*${d['message']['inviteCode'].toString()}*_\n\n' + '${"Install our app:".tr}\n' + '*Android:* https://play.google.com/store/apps/details?id=com.intaleq_driver \n\n\n' + '*iOS:* https://apps.apple.com/st/app/intaleq-driver/id6482995159'; + + launchCommunication('whatsapp', formattedPhoneNumber, message); + invitePhoneController.clear(); + } else { + mySnackeBarError("Invite code already used".tr); + } + } + + /// Sends an invitation to a potential new passenger. + void sendInviteToPassenger() async { + if (invitePhoneController.text.isEmpty) { + mySnackeBarError('Please enter a phone number'.tr); + return; + } + + // Format Syrian phone number: remove leading 0 and add +963 + String formattedPhoneNumber = invitePhoneController.text.trim(); + if (formattedPhoneNumber.startsWith('0')) { + formattedPhoneNumber = formattedPhoneNumber.substring(1); + } + formattedPhoneNumber = '+963$formattedPhoneNumber'; + + if (formattedPhoneNumber.length < 12) { + // +963 + 9 digits = 12+ + mySnackeBarError('Please enter a correct phone'.tr); + return; + } + + var response = await CRUD().post( + link: AppLink.addInvitationPassenger, + payload: { + "driverId": box.read(BoxName.driverID), + "inviterPassengerPhone": formattedPhoneNumber, + }, + ); + + if (response != 'failure') { + var d = response; + mySnackbarSuccess('Invite sent successfully'.tr); + + String message = '${'*Intaleq APP CODE*'.tr}\n\n' + '${"Use this code in registration".tr}\n\n' + '${"To get a gift for both".tr}\n\n' + '${"The period of this code is 24 hours".tr}\n\n' + '${'before'.tr} *${d['message']['expirationTime'].toString()}*\n\n' + '_*${d['message']['inviteCode'].toString()}*_\n\n' + '${"Install our app:".tr}\n' + '*Android:* https://play.google.com/store/apps/details?id=com.Intaleq.intaleq\n\n\n' + '*iOS:* https://apps.apple.com/st/app/intaleq-rider/id6748075179'; + + launchCommunication('whatsapp', formattedPhoneNumber, message); + invitePhoneController.clear(); + } else { + mySnackeBarError("Invite code already used".tr); + } + } +} + +class PassengerStats { + final int totalInvites; + final int activeUsers; + final double totalEarnings; + + PassengerStats({ + this.totalInvites = 0, + this.activeUsers = 0, + this.totalEarnings = 0.0, + }); +} diff --git a/siro_driver/lib/controller/auth/captin/login_captin_controller.dart b/siro_driver/lib/controller/auth/captin/login_captin_controller.dart new file mode 100755 index 0000000..301eaff --- /dev/null +++ b/siro_driver/lib/controller/auth/captin/login_captin_controller.dart @@ -0,0 +1,696 @@ +import 'dart:convert'; +import 'dart:io'; +import 'package:crypto/crypto.dart'; + +import 'dart:math'; +import 'package:http/http.dart' as http; +import 'package:permission_handler/permission_handler.dart'; +import 'package:siro_driver/views/auth/captin/cards/sms_signup.dart'; +import 'package:siro_driver/views/auth/syria/registration_view.dart'; +import 'package:siro_driver/views/widgets/elevated_btn.dart'; +import 'package:siro_driver/views/widgets/error_snakbar.dart'; +import 'package:flutter/material.dart'; +import 'package:flutter_secure_storage/flutter_secure_storage.dart'; +import 'package:get/get.dart'; +import 'package:siro_driver/constant/box_name.dart'; +import 'package:siro_driver/constant/links.dart'; +import 'package:siro_driver/controller/functions/crud.dart'; +import 'package:siro_driver/main.dart'; +import 'package:siro_driver/views/home/Captin/home_captain/home_captin.dart'; +import 'package:location/location.dart'; + +import '../../../constant/api_key.dart'; +import '../../../constant/info.dart'; +import '../../../print.dart'; +import '../../../views/auth/captin/otp_page.dart'; +import '../../../views/auth/captin/otp_token_page.dart'; +import '../../../views/auth/syria/pending_driver_page.dart'; +import '../../firebase/firbase_messge.dart'; +import '../../firebase/local_notification.dart'; +import '../../firebase/notification_service.dart'; +import '../../functions/encrypt_decrypt.dart'; +import '../../functions/package_info.dart'; +import '../../functions/secure_storage.dart'; +import '../../functions/security_checks.dart'; + +class LoginDriverController extends GetxController { + final formKey = GlobalKey(); + TextEditingController emailController = TextEditingController(); + TextEditingController phoneController = TextEditingController(); + TextEditingController passwordController = TextEditingController(); + TextEditingController passwordController2 = TextEditingController(); + bool isAgreeTerms = false; + bool isGoogleDashOpen = false; + bool isGoogleLogin = false; + bool isloading = false; + late int isTest = 1; + final FlutterSecureStorage _storage = const FlutterSecureStorage(); + final location = Location(); + void changeAgreeTerm() { + isAgreeTerms = !isAgreeTerms; + update(); + } + + bool isPasswordHidden = true; + + void togglePasswordVisibility() { + isPasswordHidden = !isPasswordHidden; + update([ + 'passwordVisibility' + ]); // Use a unique ID to only update the password field + } + + void changeGoogleDashOpen() { + isGoogleDashOpen = !isGoogleDashOpen; + update(); + } + + @override + void onInit() async { + box.write(BoxName.countryCode, 'Syria'); + // box.write(BoxName.driverID, '34feffd3fa72d6bee56b'); + // await getAppTester(); + getJWT(); + super.onInit(); + } + + getAppTester() async { + var res = await CRUD().get( + link: AppLink.getTesterApp, + payload: {'appPlatform': AppInformation.appName}); + // Log.print('res: ${res}'); + if (res != 'failure') { + var d = jsonDecode(res); + isTest = d['message'][0]['isTest']; + // Log.print('isTest: ${isTest}'); + box.write(BoxName.isTest, isTest); + + // Log.print('isTest: ${box.read(BoxName.isTest)}'); + update(); + } else { + isTest = 0; + box.write(BoxName.isTest, isTest); + update(); + return false; + } + } + + updateAppTester(String appPlatform) async { + await CRUD().post( + link: AppLink.updateTesterApp, payload: {'appPlatform': appPlatform}); + } + + isPhoneVerified() async { + var res = await CRUD().post( + link: AppLink.isPhoneVerified, + payload: {'phone_number': box.read(BoxName.phoneDriver)}); + + if (res != 'failure') { + // Get.offAll(() => SyrianCardAI()); + Get.offAll(() => RegistrationView()); + + // isloading = false; + // update(); + } else { + Get.offAll(() => PhoneNumberScreen()); + } + } + + void saveAgreementTerms() { + box.write(BoxName.agreeTerms, 'agreed'); + update(); + } + + void saveCountryCode(String countryCode) { + box.write(BoxName.countryCode, countryCode); + update(); + } + + String shortHash(String password) { + var bytes = utf8.encode(password); + var digest = sha256.convert(bytes); + return base64UrlEncode(digest.bytes); + } + + var dev = ''; + getJwtWallet() async { + if (box.read(BoxName.security_check).toString() != 'passed') { + Log.print('Security check failed'); + return; + } + Log.print('Security check passed'); + String fingerPrint = await DeviceHelper.getDeviceFingerprint(); + dev = Platform.isAndroid ? 'android' : 'ios'; + var payload = { + 'id': box.read(BoxName.driverID), + 'password': AK.passnpassenger, + 'aud': '${AK.allowedWallet}$dev', + 'fingerPrint': fingerPrint + }; + var response1 = await http.post( + Uri.parse(AppLink.loginJwtWalletDriver), + body: payload, + ); + Log.print('response.request: ${response1.request}'); + Log.print('response.body: ${response1.body}'); + var decoded = jsonDecode(response1.body); + var jwt = decoded['message'] is Map && decoded['message']['jwt'] != null ? decoded['message']['jwt'] : decoded['jwt']; + var hmac = decoded['message'] is Map && decoded['message']['hmac'] != null ? decoded['message']['hmac'] : decoded['hmac']; + Log.print('payment["jwt"]: $jwt'); + + await box.write(BoxName.hmac, hmac); + return jwt.toString(); + } + + getJWT() async { + await EncryptionHelper.initialize(); + dev = Platform.isAndroid ? 'android' : 'ios'; + Log.print( + 'box.read(BoxName.firstTimeLoadKey): ${box.read(BoxName.firstTimeLoadKey)}'); + if (box.read(BoxName.firstTimeLoadKey).toString() != 'false') { + var payload = { + 'id': box.read(BoxName.driverID) ?? AK.newId, + 'password': AK.passnpassenger, + 'aud': '${AK.allowed}$dev', + 'fingerPrint': box.read(BoxName.deviceFingerprint) ?? + await DeviceHelper.getDeviceFingerprint(), + }; + // Log.print('payload: ${payload}'); + + var response0 = await http.post( + Uri.parse(AppLink.loginFirstTimeDriver), + body: payload, + ); + Log.print('response0: ${response0.body}'); + Log.print('request: ${response0.request}'); + if (response0.statusCode == 200) { + final decodedResponse1 = jsonDecode(response0.body); + Log.print('decodedResponse1: ${decodedResponse1}'); + + String? jwt; + if (decodedResponse1['message'] is Map && decodedResponse1['message']['jwt'] != null) { + jwt = decodedResponse1['message']['jwt']; + } else { + jwt = decodedResponse1['jwt']; + } + + if (jwt != null) { + box.write(BoxName.jwt, c(jwt)); + } + + // ✅ بعد التأكد أن كل المفاتيح موجودة + await EncryptionHelper.initialize(); + + // await AppInitializer().getKey(); + } else {} + } else { + await EncryptionHelper.initialize(); + + var payload = { + 'id': box.read(BoxName.driverID), + 'password': box.read(BoxName.emailDriver), + 'aud': '${AK.allowed}$dev', + 'fingerPrint': box.read(BoxName.deviceFingerprint) ?? + await DeviceHelper.getDeviceFingerprint(), + }; + // print(payload); + var response1 = await http.post( + Uri.parse(AppLink.loginJwtDriver), + body: payload, + ); + Log.print('response1.request: ${response1.request}'); + Log.print('response1.body: ${response1.body}'); + + if (response1.statusCode == 200) { + final decodedResponse1 = jsonDecode(response1.body); + // Log.print('decodedResponse1: ${decodedResponse1}'); + + String? jwt; + if (decodedResponse1['message'] is Map && decodedResponse1['message']['jwt'] != null) { + jwt = decodedResponse1['message']['jwt']; + } else { + jwt = decodedResponse1['jwt']; + } + + if (jwt != null) { + await box.write(BoxName.jwt, c(jwt)); + } + + // await AppInitializer().getKey(); + } + } + } + + Future getLocationPermission() async { + var status = await Permission.locationAlways.status; + if (!status.isGranted) { + await Permission.locationAlways.request(); + } + update(); + } + + String generateUniqueIdFromEmail(String email) { + // Step 1: Extract the local part of the email + String localPart = email.split('@')[0]; + + // Step 2: Replace invalid characters (if any) + String cleanLocalPart = localPart.replaceAll(RegExp(r'[^a-zA-Z0-9]'), ''); + + // Step 3: Ensure it does not exceed 24 characters + if (cleanLocalPart.length > 24) { + cleanLocalPart = cleanLocalPart.substring(0, 24); + } + + // Step 4: Generate a random suffix if needed + String suffix = generateRandomSuffix(24 - cleanLocalPart.length); + + return cleanLocalPart + suffix; + } + + String generateRandomSuffix(int length) { + const String chars = + 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789'; + Random random = Random(); + return List.generate(length, (index) => chars[random.nextInt(chars.length)]) + .join(''); + } + + bool isInviteDriverFound = false; + + Future updateInvitationCodeFromRegister() async { + var res = await CRUD().post( + link: AppLink.updateDriverInvitationDirectly, + payload: { + "inviterDriverPhone": box.read(BoxName.phoneDriver).toString(), + }, + ); + Log.print('invite: ${res}'); + + // حماية من النوع — res قد يكون String ('failure'/'token_expired') بدل Map + if (res is! Map) return; + + if (res['status'] != 'failure') { + isInviteDriverFound = true; + update(); + box.write(BoxName.isInstall, '1'); + NotificationController().showNotification( + "Code approved".tr, "Code approved".tr, 'tone2', ''); + + try { + NotificationService.sendNotification( + target: (res)['message'][0]['token'].toString(), + title: 'You have received a gift token!'.tr, + body: 'for '.tr + box.read(BoxName.phoneDriver).toString(), + isTopic: false, + tone: 'tone2', + driverList: [], category: 'You have received a gift token!', + ); + } catch (e) { + Log.print('invite notification error: $e'); + } + } + } + + loginWithGoogleCredential(String driverID, email) async { + isloading = true; + update(); + // await SecurityHelper.performSecurityChecks(); + // Log.print('(BoxName.emailDriver): ${box.read(BoxName.emailDriver)}'); + // await getJWT(); + var res = await CRUD().get(link: AppLink.loginFromGoogleCaptin, payload: { + // 'email': email ?? 'yet', + 'id': driverID, + }); + Log.print('loginWithGoogleCredential: ${res}'); + if (res == 'failure') { + await isPhoneVerified(); + isloading = false; // <--- أضفت هذا أيضاً + update(); + return false; + // Get.snackbar('Failure', '', backgroundColor: Colors.red); + } else { + var jsonDecoeded = jsonDecode(res); + var d = jsonDecoeded['data'][0]; + if (jsonDecoeded.isNotEmpty) { + if (jsonDecoeded['status'] == 'success' && + d['is_verified'].toString() == '1') { + box.write(BoxName.emailDriver, d['email']); + box.write(BoxName.firstTimeLoadKey, 'false'); + box.write(BoxName.driverID, (d['id'])); + box.write(BoxName.isTest, '1'); + box.write(BoxName.gender, (d['gender'])); + box.write(BoxName.phoneVerified, d['is_verified'].toString()); + box.write(BoxName.phoneDriver, (d['phone'])); + box.write(BoxName.is_claimed, d['is_claimed']); + box.write(BoxName.isInstall, d['isInstall']); + // box.write( + // BoxName.isGiftToken, d['isGiftToken']); + box.write(BoxName.nameArabic, (d['name_arabic'])); + box.write(BoxName.carYear, d['year']); + box.write(BoxName.bankCodeDriver, (d['bankCode'])); + box.write(BoxName.accountBankNumberDriver, (d['accountBank'])); + box.write( + BoxName.nameDriver, + '${(d['first_name'])}' + ' ${(d['last_name'])}'); + if (((d['model']).toString().contains('دراجه') || + d['make'].toString().contains('دراجه '))) { + if ((d['gender']).toString() == 'Male') { + box.write(BoxName.carTypeOfDriver, 'Scooter'); + } else { + box.write(BoxName.carTypeOfDriver, 'Pink Bike'); + } + } else if (int.parse(d['year'].toString()) > 2016) { + if (d['gender'].toString() != 'Male') { + box.write(BoxName.carTypeOfDriver, 'Lady'); + } else { + box.write(BoxName.carTypeOfDriver, 'Comfort'); + } + } else if (int.parse(d['year'].toString()) > 2002 && + int.parse(d['year'].toString()) < 2016) { + box.write(BoxName.carTypeOfDriver, 'Speed'); + } else if (int.parse(d['year'].toString()) < 2002) { + box.write(BoxName.carTypeOfDriver, 'Awfar Car'); + } + + // ✅ الحصول على توكن access بدل registration قبل أي طلبات بعد تسجيل الدخول + Log.print('🔑 Getting access token after login...'); + await getJWT(); + Log.print('🔑 Access token obtained.'); + +// add invitations + if (box.read(BoxName.isInstall) == null || + box.read(BoxName.isInstall).toString() == '0') { + updateInvitationCodeFromRegister(); + } + + // updateAppTester(AppInformation.appName); + if (d['status'].toString() != 'yet') { + var token = await CRUD().get( + link: AppLink.getDriverToken, + payload: { + 'captain_id': (box.read(BoxName.driverID)).toString() + }); + + String fingerPrint = await DeviceHelper.getDeviceFingerprint(); + await storage.write( + key: BoxName.fingerPrint, value: fingerPrint.toString()); + // print(jsonDecode(token)['data'][0]['token'].toString()); + // print(box.read(BoxName.tokenDriver).toString()); + // if (box.read(BoxName.emailDriver).toString() != + // '963992952235@intaleqapp.com') { + if (token != 'failure') { + var serverData = jsonDecode(token); + if ((serverData['data'][0]['token'].toString()) != + box.read(BoxName.tokenDriver).toString() || + serverData['data'][0]['fingerPrint'].toString() != + fingerPrint.toString()) { + Get.defaultDialog( + barrierDismissible: false, + title: 'Device Change Detected'.tr, + middleText: 'Please verify your identity'.tr, + textConfirm: 'Verify'.tr, + confirmTextColor: Colors.white, + onConfirm: () { + // نغلق الـ Dialog أولاً بشكل صريح + if (Get.isDialogOpen ?? false) { + Get.back(); + } + + // ثم ننتقل لصفحة OTP + Get.offAll( + () => OtpVerificationPage( + phone: d['phone'].toString(), + deviceToken: fingerPrint.toString(), + token: token.toString(), + ptoken: + jsonDecode(token)['data'][0]['token'].toString(), + ), + ); + }, + ); + isloading = false; + update(); + return true; // نخرج من الدالة هنا لنسمح لـ OTP بالتعامل مع الأمر + } + // } + } + + Get.offAll(() => HomeCaptain()); // افترض أن هذا الكلاس موجود + isloading = false; // <--- أضفت هذا + update(); // <--- أضفت هذا + return true; + } else { + Get.offAll( + () => DriverVerificationScreen()); // افترض أن هذا الكلاس موجود + isloading = false; // <--- أضفت هذا + update(); // <--- أضفت هذا + return false; + } + + // Get.off(() => HomeCaptain()); + } else { + Get.offAll(() => PhoneNumberScreen()); + isloading = false; + update(); + return false; // <--- ✅ وهذا السطر موجود للحالات الأخرى + } + } else { + mySnackbarSuccess(''); + + isloading = false; + update(); + } + } + } + + logintest(String driverID, email) async { + isloading = true; + update(); + // await SecurityHelper.performSecurityChecks(); + // Log.print('(BoxName.emailDriver): ${box.read(BoxName.emailDriver)}'); + + var res = await CRUD().get(link: AppLink.loginFromGoogleCaptin, payload: { + 'email': email ?? 'yet', + 'id': driverID, + }); + + // print('res is $res'); + // if (res == 'failure') { + // await isPhoneVerified(); + // // Get.snackbar('Failure', '', backgroundColor: Colors.red); + // } else + // { + var jsonDecoeded = jsonDecode(res); + var d = jsonDecoeded['data'][0]; + if (jsonDecoeded.isNotEmpty) { + if (jsonDecoeded['status'] == 'success') + // && + // d['is_verified'].toString() == '1') + { + box.write(BoxName.emailDriver, d['email']); + box.write(BoxName.firstTimeLoadKey, 'false'); + box.write(BoxName.driverID, (d['id'])); + box.write(BoxName.isTest, '1'); + box.write(BoxName.gender, (d['gender'])); + box.write(BoxName.phoneVerified, d['is_verified'].toString()); + box.write(BoxName.phoneDriver, (d['phone'])); + box.write(BoxName.is_claimed, d['is_claimed']); + box.write(BoxName.isInstall, d['isInstall']); + // box.write( + // BoxName.isGiftToken, d['isGiftToken']); + box.write(BoxName.nameArabic, (d['name_arabic'])); + box.write(BoxName.carYear, d['year']); + box.write(BoxName.bankCodeDriver, (d['bankCode'])); + box.write(BoxName.accountBankNumberDriver, (d['accountBank'])); + box.write( + BoxName.nameDriver, + '${(d['first_name'])}' + ' ${(d['last_name'])}'); + if (((d['model']).toString().contains('دراجه') || + d['make'].toString().contains('دراجه '))) { + if ((d['gender']).toString() == 'Male') { + box.write(BoxName.carTypeOfDriver, 'Scooter'); + } else { + box.write(BoxName.carTypeOfDriver, 'Pink Bike'); + } + } else if (int.parse(d['year'].toString()) > 2016) { + if (d['gender'].toString() != 'Male') { + box.write(BoxName.carTypeOfDriver, 'Lady'); + } else { + box.write(BoxName.carTypeOfDriver, 'Comfort'); + } + } else if (int.parse(d['year'].toString()) > 2002 && + int.parse(d['year'].toString()) < 2016) { + box.write(BoxName.carTypeOfDriver, 'Speed'); + } else if (int.parse(d['year'].toString()) < 2002) { + box.write(BoxName.carTypeOfDriver, 'Awfar Car'); + } + // updateAppTester(AppInformation.appName); + + // var token = await CRUD().get( + // link: AppLink.getDriverToken, + // payload: {'captain_id': (box.read(BoxName.driverID)).toString()}); + + // String fingerPrint = await DeviceHelper.getDeviceFingerprint(); + // await storage.write( + // key: BoxName.fingerPrint, value: fingerPrint.toString()); + + Get.off(() => HomeCaptain()); + // } else { + // Get.offAll(() => PhoneNumberScreen()); + + // isloading = false; + // update(); + // } + // } + // else { + // mySnackbarSuccess(''); + + // isloading = false; + // update(); + } + } + } + + loginUsingCredentialsWithoutGoogle(String password, email) async { + isloading = true; + isGoogleLogin = true; + update(); + var res = await CRUD() + .get(link: AppLink.loginUsingCredentialsWithoutGoogle, payload: { + 'email': (email), + 'password': password, + }); + box.write(BoxName.emailDriver, (email).toString()); + // print(res); + if (res == 'failure') { + //Failure + if (box.read(BoxName.phoneVerified).toString() == '1') { + // Get.offAll(() => SyrianCardAI()); + Get.offAll(() => RegistrationView()); + } else { + Get.offAll(() => SmsSignupEgypt()); + } + + isloading = false; + update(); + } else { + var jsonDecoeded = jsonDecode(res); + var d = jsonDecoeded['data'][0]; + if (jsonDecoeded.isNotEmpty) { + if (jsonDecoeded['status'] == 'success' && + d['is_verified'].toString() == '1') { + box.write(BoxName.emailDriver, (d['email'])); + box.write(BoxName.driverID, (d['id'])); + box.write(BoxName.isTest, '1'); + box.write(BoxName.gender, (d['gender'])); + box.write(BoxName.phoneVerified, d['is_verified'].toString()); + box.write(BoxName.phoneDriver, (d['phone'])); + box.write(BoxName.nameArabic, (d['name_arabic'])); + box.write(BoxName.bankCodeDriver, (d['bankCode'])); + box.write(BoxName.accountBankNumberDriver, d['accountBank']); + box.write( + BoxName.nameDriver, + '${(d['first_name'])}' + ' ${(d['last_name'])}'); + if ((d['model'].toString().contains('دراجه') || + d['make'].toString().contains('دراجه '))) { + if ((d['gender']).toString() == 'Male') { + box.write(BoxName.carTypeOfDriver, 'Scooter'); + } else { + box.write(BoxName.carTypeOfDriver, 'Pink Bike'); + } + } else if (int.parse(d['year'].toString()) > 2017) { + if ((d['gender']).toString() != 'Male') { + box.write(BoxName.carTypeOfDriver, 'Lady'); + } else { + box.write(BoxName.carTypeOfDriver, 'Comfort'); + } + } else if (int.parse(d['year'].toString()) > 2002 && + int.parse(d['year'].toString()) < 2017) { + box.write(BoxName.carTypeOfDriver, 'Speed'); + } else if (int.parse(d['year'].toString()) < 2002) { + box.write(BoxName.carTypeOfDriver, 'Awfar Car'); + } + updateAppTester(AppInformation.appName); + + var fingerPrint = await DeviceHelper.getDeviceFingerprint(); + await storage.write(key: BoxName.fingerPrint, value: fingerPrint); + + var token = await CRUD().get( + link: AppLink.getDriverToken, + payload: {'captain_id': box.read(BoxName.driverID).toString()}); + + if (token != 'failure') { + if ((jsonDecode(token)['data'][0]['token']) != + (box.read(BoxName.tokenDriver))) { + // Get.put(FirebaseMessagesController()).sendNotificationToDriverMAP( + // 'token change'.tr, + // 'change device'.tr, + // (jsonDecode(token)['data'][0]['token']).toString(), + // [], + // 'ding.wav'); + NotificationService.sendNotification( + target: (jsonDecode(token)['data'][0]['token']).toString(), + title: 'token change'.tr, + body: 'token change'.tr, + isTopic: false, // Important: this is a token + tone: 'cancel', + driverList: [], category: 'token change', + ); + Get.defaultDialog( + title: 'you will use this device?'.tr, + middleText: '', + confirm: MyElevatedButton( + title: 'Ok'.tr, + onPressed: () async { + await CRUD() + .post(link: AppLink.addTokensDriver, payload: { + 'token': box.read(BoxName.tokenDriver), + 'captain_id': box.read(BoxName.driverID).toString(), + 'fingerPrint': (fingerPrint).toString() + }); + + Get.back(); + })); + } + } + + Get.off(() => HomeCaptain()); + // Get.off(() => LoginCaptin()); + } else { + Get.offAll(() => SmsSignupEgypt()); + + isloading = false; + update(); + } + } else { + mySnackeBarError(''); + + isloading = false; + update(); + } + } + } + + void loginByBoxData() async { + Get.to(() => HomeCaptain()); + await CRUD().post(link: AppLink.addTokensDriver, payload: { + 'token': box.read(BoxName.tokenDriver).toString(), + 'captain_id': box.read(BoxName.driverID).toString() + }); + CRUD().post( + link: "${AppLink.seferAlexandriaServer}/ride/firebase/addDriver.php", + payload: { + 'token': box.read(BoxName.tokenDriver), + 'captain_id': box.read(BoxName.driverID).toString() + }); + CRUD().post( + link: "${AppLink.seferGizaServer}/ride/firebase/addDriver.php", + payload: { + 'token': box.read(BoxName.tokenDriver), + 'captain_id': box.read(BoxName.driverID).toString() + }); + } +} diff --git a/siro_driver/lib/controller/auth/captin/ml_google_doc.dart b/siro_driver/lib/controller/auth/captin/ml_google_doc.dart new file mode 100755 index 0000000..9b922a5 --- /dev/null +++ b/siro_driver/lib/controller/auth/captin/ml_google_doc.dart @@ -0,0 +1,93 @@ +import 'dart:io'; + +import 'package:get/get.dart'; +// import 'package:google_mlkit_text_recognition/google_mlkit_text_recognition.dart'; +import 'package:image_cropper/image_cropper.dart'; +import 'package:image_picker/image_picker.dart'; +import 'package:siro_driver/constant/colors.dart'; +import 'package:siro_driver/controller/functions/llama_ai.dart'; + +// class CarRegistrationRecognizerController extends GetxController { +// @override +// void onInit() { +// // scanText(); +// super.onInit(); +// } + +// // The ImagePicker instance +// final ImagePicker _imagePicker = ImagePicker(); + +// // The GoogleMlKit TextRecognizer instance +// // final TextRecognizer _textRecognizer = TextRecognizer(); + +// // The scanned text +// String? scannedText; +// String? jsonOutput; +// final List> lines = []; +// Map extracted = {}; +// XFile? image; +// CroppedFile? croppedFile; +// // Picks an image from the camera or gallery and extracts the text +// final List> extractedTextWithCoordinates = []; + +// Future scanText() async { +// // Pick an image from the camera or gallery +// image = await _imagePicker.pickImage(source: ImageSource.gallery); +// update(); + +// // If no image was picked, return +// if (image == null) { +// return; +// } + +// // Crop the image +// croppedFile = await ImageCropper().cropImage( +// sourcePath: image!.path, +// // +// uiSettings: [ +// AndroidUiSettings( +// toolbarTitle: 'Cropper'.tr, +// toolbarColor: AppColor.blueColor, +// toolbarWidgetColor: AppColor.yellowColor, +// initAspectRatio: CropAspectRatioPreset.original, +// lockAspectRatio: false), +// IOSUiSettings( +// title: 'Cropper'.tr, +// ), +// ], +// ); + +// // If no cropped image was obtained, return +// if (croppedFile == null) { +// return; +// } + +// // Convert the cropped file to an InputImage object +// final InputImage inputImage = InputImage.fromFile(File(croppedFile!.path)); + +// // Recognize the text in the image +// final RecognizedText recognizedText = +// await _textRecognizer.processImage(inputImage); +// scannedText = recognizedText.text; + +// // Extract the scanned text line by line +// final List> lines = []; +// for (var i = 0; i < recognizedText.blocks.length; i++) { +// lines.add({ +// i.toString(): recognizedText.blocks[i].text, +// }); +// } + +// String result = lines.map((map) => map.values.first.toString()).join(' '); +// if (result.length > 2200) { +// result = result.substring(0, 2200); +// } +// Map result2 = await LlamaAi().getCarRegistrationData(result, +// 'vin,make,made,year,expiration_date,color,owner,registration_date'); // + +// // Assign the result to the extracted variable +// extracted = result2; + +// update(); +// } +// } diff --git a/siro_driver/lib/controller/auth/captin/opt_token_controller.dart b/siro_driver/lib/controller/auth/captin/opt_token_controller.dart new file mode 100644 index 0000000..2d431fd --- /dev/null +++ b/siro_driver/lib/controller/auth/captin/opt_token_controller.dart @@ -0,0 +1,126 @@ +import 'dart:async'; + +import 'package:get/get.dart'; +import 'package:siro_driver/print.dart'; +import 'package:siro_driver/views/home/Captin/home_captain/home_captin.dart'; + +import '../../../constant/box_name.dart'; +import '../../../constant/links.dart'; +import '../../../main.dart'; +import '../../../views/widgets/error_snakbar.dart'; +import '../../firebase/firbase_messge.dart'; +import '../../firebase/notification_service.dart'; +import '../../functions/crud.dart'; + +class OtpVerificationController extends GetxController { + final String phone; + final String deviceToken; + final String token; + final otpCode = ''.obs; + final isLoading = false.obs; + final isVerifying = false.obs; + var canResend = false.obs; + var countdown = 120.obs; + Timer? _timer; + + OtpVerificationController({ + required this.phone, + required this.deviceToken, + required this.token, + }); + + @override + void onInit() { + super.onInit(); + sendOtp(); // ترسل تلقائيًا عند فتح الصفحة + startCountdown(); + } + + void startCountdown() { + canResend.value = false; + countdown.value = 120; + _timer?.cancel(); + _timer = Timer.periodic(const Duration(seconds: 1), (timer) { + if (countdown.value > 0) { + countdown.value--; + } else { + canResend.value = true; + timer.cancel(); + } + }); + } + + Future sendOtp() async { + isLoading.value = true; + try { + final response = await CRUD().post( + link: + '${AppLink.server}/auth/token_passenger/driver/send_otp_driver.php', + payload: { + 'receiver': phone, + // 'device_token': deviceToken, + }, + ); + + if (response != 'failure') { + // بإمكانك عرض رسالة نجاح هنا + } else { + // Get.snackbar('Error', 'Failed to send OTP'); + } + } catch (e) { + Get.snackbar('Error', e.toString()); + } finally { + isLoading.value = false; + } + } + + Future verifyOtp(String ptoken) async { + isVerifying.value = true; + var finger = box.read(BoxName.deviceFingerprint); + try { + final response = await CRUD().post( + link: + '${AppLink.server}/auth/token_passenger/driver/verify_otp_driver.php', + payload: { + 'phone_number': phone, + 'otp': otpCode.value, + 'token': box.read(BoxName.tokenDriver).toString(), + 'fingerPrint': finger.toString(), + }, + ); + + if (response != 'failure' && + response != 'token_expired' && + response != 'no_internet') { + Log.print('response (already decoded): ${response}'); + + // توجه إلى الصفحة التالية + await CRUD().post( + link: '${AppLink.paymentServer}/auth/token/update_driver_auth.php', + payload: { + 'token': box.read(BoxName.tokenDriver).toString(), + 'fingerPrint': finger.toString(), + 'captain_id': box.read(BoxName.driverID).toString(), + }); + + await NotificationService.sendNotification( + target: ptoken.toString(), + title: 'token change'.tr, + body: 'token change'.tr, + isTopic: false, + tone: 'cancel', + driverList: [], + category: 'token change', + ); + + Get.offAll(() => HomeCaptain()); + } else { + mySnackeBarError('OTP is incorrect or expired'.tr); + } + } catch (e) { + mySnackeBarError(e.toString()); + } finally { + isVerifying.value = false; + } + } +} diff --git a/siro_driver/lib/controller/auth/captin/phone_helper_controller.dart b/siro_driver/lib/controller/auth/captin/phone_helper_controller.dart new file mode 100644 index 0000000..f717fb6 --- /dev/null +++ b/siro_driver/lib/controller/auth/captin/phone_helper_controller.dart @@ -0,0 +1,204 @@ +import 'package:get/get.dart'; +import 'package:siro_driver/controller/auth/captin/login_captin_controller.dart'; +import 'package:siro_driver/controller/functions/crud.dart'; +import 'package:siro_driver/print.dart'; +import 'package:siro_driver/views/home/on_boarding_page.dart'; +import 'package:siro_driver/views/widgets/error_snakbar.dart'; + +import '../../../constant/box_name.dart'; +import '../../../constant/links.dart'; +import '../../../main.dart'; +import '../../../views/auth/syria/registration_view.dart'; + +// --- Helper Class for Phone Authentication --- + +class PhoneAuthHelper { + // Define your server URLs + static final String _baseUrl = '${AppLink.server}/auth/syria/driver/'; + static final String _sendOtpUrl = '${_baseUrl}sendWhatsAppDriver.php'; + static final String _verifyOtpUrl = '${_baseUrl}verifyOtp.php'; + static final String _registerUrl = '${_baseUrl}register_driver.php'; + static String formatSyrianPhone(String phone) { + // Remove spaces, symbols, +, -, () + phone = phone.replaceAll(RegExp(r'[ \-\(\)\+]'), '').trim(); + + // Normalize 00963 → 963 + if (phone.startsWith('00963')) { + phone = phone.replaceFirst('00963', '963'); + } + + // Normalize 0963 → 963 + if (phone.startsWith('0963')) { + phone = phone.replaceFirst('0963', '963'); + } + if (phone.startsWith('096309')) { + phone = phone.replaceFirst('096309', '963'); + } + + // NEW: Fix 96309xxxx → 9639xxxx + if (phone.startsWith('96309')) { + phone = '9639' + phone.substring(5); // remove the "0" after 963 + } + + // If starts with 9630 → correct to 9639 + if (phone.startsWith('9630')) { + phone = '9639' + phone.substring(4); + } + + // If already in correct format: 9639xxxxxxxx + if (phone.startsWith('9639') && phone.length == 12) { + return phone; + } + + // If starts with 963 but missing the 9 + if (phone.startsWith('963') && phone.length > 3) { + // Ensure it begins with 9639 + if (!phone.startsWith('9639')) { + phone = '9639' + phone.substring(3); + } + return phone; + } + + // If starts with 09xxxxxxxx → 9639xxxxxxxx + if (phone.startsWith('09')) { + return '963' + phone.substring(1); + } + + // If 9xxxxxxxx (9 digits) + if (phone.startsWith('9') && phone.length == 9) { + return '963' + phone; + } + + // If starts with incorrect 0xxxxxxx → assume Syrian and fix + if (phone.startsWith('0') && phone.length == 10) { + return '963' + phone.substring(1); + } + + return phone; + } + + /// Sends an OTP to the provided phone number. + static Future sendOtp(String phoneNumber) async { + try { + final fixedPhone = formatSyrianPhone(phoneNumber); + Log.print('fixedPhone: $fixedPhone'); + + final response = await CRUD().post( + link: _sendOtpUrl, + payload: {'receiver': fixedPhone}, + ); + Log.print('fixedPhone: ${fixedPhone}'); + + if (response != 'failure') { + final data = (response); + Log.print('data: ${data}'); + // if (data['status'] == 'success') { + mySnackbarSuccess('An OTP has been sent to your number.'.tr); + return true; + // } else { + // mySnackeBarError(data['message'] ?? 'Failed to send OTP.'); + // return false; + // } + } else { + mySnackeBarError('Server error. Please try again.'.tr); + return false; + } + } catch (e) { + // mySnackeBarError('An error occurred: $e'); + return false; + } + } + + /// Verifies the OTP and logs the user in. + static Future verifyOtp(String phoneNumber, String otpCode) async { + try { + final fixedPhone = formatSyrianPhone(phoneNumber); + Log.print('fixedPhone: $fixedPhone'); + final response = await CRUD().post( + link: _verifyOtpUrl, + payload: { + 'phone_number': fixedPhone, + 'otp': otpCode, + }, + ); + + if (response != 'failure') { + final data = response; + + if (data['status'] == 'success') { + final isRegistered = data['message']['isRegistered'] ?? false; + box.write(BoxName.phoneVerified, '1'); + box.write(BoxName.phoneDriver, phoneNumber); + box.write(BoxName.driverID, data['message']['driverID']); + + if (isRegistered) { + // ✅ السائق مسجل مسبقًا - سجل دخوله واذهب إلى الصفحة الرئيسية + final driver = data['message']['driver']; + // mySnackbarSuccess('Welcome back, ${driver['first_name']}!'); + + // حفظ بيانات السائق إذا أردت: + box.write(BoxName.driverID, driver['id']); + box.write(BoxName.emailDriver, driver['email']); + + await Get.find().loginWithGoogleCredential( + driver['id'].toString(), driver['email'].toString()); + } else { + // ✅ رقم الهاتف تم التحقق منه لكن السائق غير مسجل + // mySnackbarSuccess('Phone verified. Please complete registration.'); + // Get.offAll(() => SyrianCardAI()); + Get.to(() => RegistrationView()); + } + } else { + mySnackeBarError(data['message'] ?? 'Verification failed.'); + } + } else { + mySnackeBarError('Server error. Please try again.'); + } + } catch (e) { + mySnackeBarError('An error occurred: $e'); + } + } + + static Future registerUser({ + required String phoneNumber, + required String firstName, + required String lastName, + String? email, + }) async { + try { + final response = await CRUD().post( + link: _registerUrl, + payload: { + 'phone_number': phoneNumber, + 'first_name': firstName, + 'last_name': lastName, + 'email': email ?? '', // Send empty string if null + }, + ); + final data = (response); + if (data != 'failure') { + // Registration successful, log user in + await _handleSuccessfulLogin(data['message']); + } else { + mySnackeBarError( + "User with this phone number or email already exists.".tr); + } + } catch (e) { + mySnackeBarError('An error occurred: $e'); + } + } + + static Future _handleSuccessfulLogin( + Map userData) async { + mySnackbarSuccess('Welcome, ${userData['first_name']}!'); + + // Save user data to local storage (Hive box) using new keys + box.write(BoxName.passengerID, userData['id']); + box.write(BoxName.nameDriver, userData['first_name']); + box.write(BoxName.lastNameDriver, userData['last_name']); + box.write(BoxName.emailDriver, userData['email']); + box.write(BoxName.phoneDriver, userData['phone']); + + Get.offAll(() => OnBoardingPage()); // Navigate to home + } +} diff --git a/siro_driver/lib/controller/auth/captin/register_captin_controller.dart b/siro_driver/lib/controller/auth/captin/register_captin_controller.dart new file mode 100755 index 0000000..247479b --- /dev/null +++ b/siro_driver/lib/controller/auth/captin/register_captin_controller.dart @@ -0,0 +1,418 @@ +import 'dart:convert'; +import 'dart:math'; + +import 'package:siro_driver/controller/auth/captin/login_captin_controller.dart'; +import 'package:siro_driver/views/widgets/error_snakbar.dart'; +import 'package:flutter/material.dart'; +import 'package:get/get.dart'; +import 'package:siro_driver/constant/box_name.dart'; +import 'package:siro_driver/constant/links.dart'; +import 'package:siro_driver/controller/functions/crud.dart'; +import 'package:siro_driver/controller/functions/ocr_controller.dart'; +import 'package:siro_driver/main.dart'; +import 'package:siro_driver/views/auth/captin/login_captin.dart'; +import 'package:siro_driver/views/auth/captin/verify_email_captain.dart'; + +import '../../../constant/colors.dart'; +import '../../../views/auth/captin/ai_page.dart'; +import '../../../views/auth/syria/registration_view.dart'; +import '../../../views/home/Captin/home_captain/home_captin.dart'; +import '../../functions/sms_egypt_controller.dart'; + +class RegisterCaptainController extends GetxController { + final formKey = GlobalKey(); + final formKey3 = GlobalKey(); + + TextEditingController emailController = TextEditingController(); + TextEditingController phoneController = TextEditingController(); + TextEditingController passwordController = TextEditingController(); + TextEditingController verifyCode = TextEditingController(); + + String birthDate = 'Birth Date'.tr; + String gender = 'Male'.tr; + bool isLoading = false; + bool isSent = false; + late String name; + late String licenseClass; + late String documentNo; + late String address; + late String height; + late String postalCode; + late String sex; + late String stateCode; + late String expireDate; + late String dob; + + getBirthDate() { + Get.defaultDialog( + title: 'Select Date'.tr, + content: SizedBox( + width: 300, + child: CalendarDatePicker( + initialDate: DateTime.now().subtract(const Duration(days: 18 * 365)), + firstDate: DateTime.parse('1940-06-01'), + lastDate: DateTime.now().subtract(const Duration(days: 18 * 365)), + onDateChanged: (date) { + // Get the selected date and convert it to a DateTime object + DateTime dateTime = date; + // Call the getOrders() function from the controller + birthDate = dateTime.toString().split(' ')[0]; + update(); + Get.back(); + }, + + // onDateChanged: (DateTime value) {}, + ), + ), + ); + } + + @override + void onInit() { + // Get.put(SmsEgyptController()); + super.onInit(); + } + + void changeGender(String value) { + gender = value; + update(); + } + + bool isValidEgyptianPhoneNumber(String phoneNumber) { + // Remove any non-digit characters (spaces, dashes, etc.) + phoneNumber = phoneNumber.replaceAll(RegExp(r'\D+'), ''); + + // Check if the phone number has exactly 11 digits + if (phoneNumber.length != 11) { + return false; + } + + // Check if the phone number starts with 010, 011, 012, or 015 + RegExp validPrefixes = RegExp(r'^01[0125]\d{8}$'); + + return validPrefixes.hasMatch(phoneNumber); + } + + sendOtpMessage() async { + SmsEgyptController smsEgyptController = Get.put(SmsEgyptController()); + isLoading = true; + update(); + isLoading = true; + update(); + if (formKey3.currentState!.validate()) { + if (box.read(BoxName.countryCode) == 'Egypt') { + if (isValidEgyptianPhoneNumber(phoneController.text)) { + var responseCheker = await CRUD() + .post(link: AppLink.checkPhoneNumberISVerfiedDriver, payload: { + 'phone_number': ('+2${phoneController.text}'), + }); + if (responseCheker != 'failure') { + var d = jsonDecode(responseCheker); + if (d['message'][0]['is_verified'].toString() == '1') { + Get.snackbar('Phone number is verified before'.tr, '', + backgroundColor: AppColor.greenColor); + box.write(BoxName.phoneVerified, '1'); + box.write(BoxName.phone, ('+2${phoneController.text}')); + await Get.put(LoginDriverController()).loginWithGoogleCredential( + box.read(BoxName.driverID).toString(), + (box.read(BoxName.emailDriver).toString()), + ); + } else { + await CRUD().post(link: AppLink.sendVerifyOtpMessage, payload: { + 'phone_number': ('+2${phoneController.text}'), + "driverId": box.read(BoxName.driverID), + "email": (box.read(BoxName.emailDriver)), + }); + + isSent = true; + + isLoading = false; + update(); + } + } else { + await CRUD().post(link: AppLink.sendVerifyOtpMessage, payload: { + 'phone_number': ('+2${phoneController.text}'), + "driverId": box.read(BoxName.driverID), + "email": box.read(BoxName.emailDriver), + }); + + isSent = true; + + isLoading = false; + update(); + } + } else { + mySnackeBarError( + 'Phone Number wrong'.tr, + ); + } + } + } + isLoading = false; + update(); + } + + DateTime? lastOtpSentTime; // Store the last OTP sent time + int otpResendInterval = 300; // 5 minutes in seconds + +// Main function to handle OTP sending + // sendOtpMessage() async { + // if (_isOtpResendAllowed()) { + // isLoading = true; + // update(); + + // if (formKey3.currentState!.validate()) { + // String countryCode = box.read(BoxName.countryCode); + // String phoneNumber = phoneController.text; + + // if (countryCode == 'Egypt' && isValidEgyptianPhoneNumber(phoneNumber)) { + // await _checkAndSendOtp(phoneNumber); + // } else { + // _showErrorMessage('Phone Number is not Egypt phone '.tr); + // } + // } + // isLoading = false; + // update(); + // } else { + // _showCooldownMessage(); + // } + // } + +// Check if the resend OTP request is allowed (5 minutes cooldown) +// bool _isOtpResendAllowed() { +// if (lastOtpSentTime == null) return true; + +// final int elapsedTime = +// DateTime.now().difference(lastOtpSentTime!).inSeconds; +// return elapsedTime >= otpResendInterval; +// } + +// // Show message when user tries to resend OTP too soon +// void _showCooldownMessage() { +// int remainingTime = otpResendInterval - +// DateTime.now().difference(lastOtpSentTime!).inSeconds; +// Get.snackbar( +// 'Please wait ${remainingTime ~/ 60}:${(remainingTime % 60).toString().padLeft(2, '0')} minutes before requesting again', +// '', +// backgroundColor: AppColor.redColor, +// ); +// } + +// // Check if the phone number has been verified, and send OTP if not verified +// _checkAndSendOtp(String phoneNumber) async { +// var responseChecker = await CRUD().post( +// link: AppLink.checkPhoneNumberISVerfiedDriver, +// payload: { +// 'phone_number': '+2$phoneNumber', +// }, +// ); + +// if (responseChecker != 'failure') { +// var responseData = jsonDecode(responseChecker); +// if (_isPhoneVerified(responseData)) { +// _handleAlreadyVerified(); +// } else { +// await _sendOtpAndSms(phoneNumber); +// } +// } else { +// await _sendOtpAndSms(phoneNumber); +// } +// } + +// Check if the phone number is already verified + bool _isPhoneVerified(dynamic responseData) { + return responseData['message'][0]['is_verified'].toString() == '1'; + } + +// Handle case where phone number is already verified + _handleAlreadyVerified() { + mySnackbarSuccess('Phone number is already verified'.tr); + box.write(BoxName.phoneVerified, '1'); + box.write(BoxName.phone, ('+2${phoneController.text}')); + Get.put(LoginDriverController()).loginWithGoogleCredential( + box.read(BoxName.driverID).toString(), + box.read(BoxName.emailDriver).toString(), + ); + } + +// Send OTP and SMS + _sendOtpAndSms(String phoneNumber) async { + SmsEgyptController smsEgyptController = Get.put(SmsEgyptController()); + int randomNumber = Random().nextInt(100000) + 1; + + await CRUD().post( + link: AppLink.sendVerifyOtpMessage, + payload: { + 'phone_number': ('+2$phoneNumber'), + 'token_code': (randomNumber.toString()), + 'driverId': box.read(BoxName.driverID), + 'email': box.read(BoxName.emailDriver), + }, + ); + + await smsEgyptController.sendSmsEgypt(phoneNumber); + + lastOtpSentTime = DateTime.now(); // Update the last OTP sent time + isSent = true; + isLoading = false; + update(); + } + + verifySMSCode() async { + // var loginDriverController = Get.put(LoginDriverController()); + if (formKey3.currentState!.validate()) { + var res = await CRUD().post(link: AppLink.verifyOtpDriver, payload: { + 'phone_number': ('+2${phoneController.text}'), + 'token_code': (verifyCode.text.toString()), + }); + if (res != 'failure') { + // var dec = jsonDecode(res); + box.write(BoxName.phoneDriver, ('+2${phoneController.text}')); + box.write(BoxName.phoneVerified, '1'); + + // loginDriverController.isGoogleLogin == true + // ? await loginDriverController.loginUsingCredentialsWithoutGoogle( + // loginDriverController.passwordController.text.toString(), + // box.read(BoxName.emailDriver).toString(), + // ) + // : await loginDriverController.loginUsingCredentials( + // box.read(BoxName.driverID).toString(), + // box.read(BoxName.emailDriver).toString(), + // ); + // Get.offAll(() => SyrianCardAI()); + Get.to(() => RegistrationView()); + // } else { + // Get.snackbar('title', 'message'); + // } + } + } else { + mySnackeBarError('you must insert token code '.tr); + } + } + + sendVerifications() async { + var res = await CRUD().post(link: AppLink.verifyEmail, payload: { + 'email': emailController.text.isEmpty + ? (Get.find().emailController.text.toString()) + : (emailController.text), + 'token': (verifyCode.text), + }); + + if (res != 'failure') { + if (Get.find().emailController.text.toString() != + '') { + Get.offAll(() => HomeCaptain()); + } else { + // Get.to(() => CarLicensePage()); + } + } + } + + void nextToAIDetection() async { + //Todo dont forget this + if (formKey.currentState!.validate()) { + isLoading = true; + update(); + Get.to(() => AiPage()); + } + } + + Map payloadLisence = {}; + + void getFromController() { + name = Get.find().name; + licenseClass = Get.find().licenseClass.toString(); + documentNo = Get.find().documentNo.toString(); + address = Get.find().address.toString(); + height = Get.find().height.toString(); + postalCode = Get.find().address.toString(); + sex = Get.find().sex.toString(); + stateCode = Get.find().postalCode.toString(); + expireDate = Get.find().expireDate.toString(); + dob = Get.find().dob.toString(); + update(); + } + + Future addLisence() async { + getFromController(); + var res = await CRUD().post(link: AppLink.addLicense, payload: { + 'name': name, + 'licenseClass': licenseClass, + 'documentNo': documentNo, + 'address': address, + 'height': height, + 'postalCode': postalCode, + 'sex': sex, + 'stateCode': stateCode, + 'expireDate': expireDate, + 'dateOfBirth': dob, + }); + isLoading = false; + update(); + if (jsonDecode(res)['status'] == 'success') { + // Get.to(() => AiPage()); //todo rplace this + } + } + + void addRegisrationCarForDriver(String vin, make, model, year, color, owner, + expirationDate, registrationDate) async { + getFromController(); + var res = await CRUD().post(link: AppLink.addRegisrationCar, payload: { + 'vin': vin, + 'make': make, + 'model': model, + 'year': year, + 'expirationDate': expirationDate, + 'color': color, + 'owner': owner, + 'registrationDate': registrationDate, + }); + box.write(BoxName.vin, vin); + box.write(BoxName.make, make); + box.write(BoxName.model, model); + box.write(BoxName.year, year); + box.write(BoxName.expirationDate, expirationDate); + box.write(BoxName.color, color); + box.write(BoxName.owner, owner); + box.write(BoxName.registrationDate, registrationDate); + isLoading = false; + update(); + if (jsonDecode(res)['status'] == 'success') { + Get.offAll(() => LoginCaptin()); //todo replace this + } + } + + Future register() async { + getFromController(); + if (formKey.currentState!.validate()) { + isLoading = true; + update(); + var res = await CRUD().post(link: AppLink.signUpCaptin, payload: { + 'first_name': name.split(' ')[1], + 'last_name': name.split(' ')[0], + 'email': emailController.text, + 'phone': phoneController.text, + 'password': passwordController.text, + 'gender': sex, + 'site': address, + 'birthdate': dob, + }); + + isLoading = false; + update(); + if (jsonDecode(res)['status'] == 'success') { + box.write(BoxName.driverID, jsonDecode(res)['message']); + box.write(BoxName.dobDriver, dob); + box.write(BoxName.sexDriver, sex); + box.write(BoxName.phoneDriver, phoneController.text); + box.write(BoxName.lastNameDriver, name.split(' ')[0]); + int randomNumber = Random().nextInt(100000) + 1; + await CRUD().post(link: AppLink.sendVerifyEmail, payload: { + 'email': emailController.text, + 'token': randomNumber.toString(), + }); + Get.to(() => VerifyEmailCaptainPage()); + } + } + } +} diff --git a/siro_driver/lib/controller/auth/facebook_login.dart b/siro_driver/lib/controller/auth/facebook_login.dart new file mode 100755 index 0000000..693b0eb --- /dev/null +++ b/siro_driver/lib/controller/auth/facebook_login.dart @@ -0,0 +1,30 @@ +// import 'package:firebase_auth/firebase_auth.dart'; +// import 'package:flutter_facebook_auth/flutter_facebook_auth.dart'; + +// class FacebookSignIn { +// Future signInWithFacebook() async { +// final LoginResult result = await FacebookAuth.instance.login(); +// if (result.status == LoginStatus.success) { +// // Create a credential from the access token +// final OAuthCredential credential = +// FacebookAuthProvider.credential(result.accessToken!.tokenString); +// // Once signed in, return the UserCredential +// return await FirebaseAuth.instance.signInWithCredential(credential); +// } +// return null; +// } + +// Future signOut() async { +// try { +// await FacebookAuth.instance.logOut(); +// print('Facebook Sign Out Successful'); +// } catch (e) { +// print('Error during Facebook Sign Out: $e'); +// } +// } + +// Future isSignedIn() async { +// final accessToken = await FacebookAuth.instance.accessToken; +// return accessToken != null; +// } +// } diff --git a/siro_driver/lib/controller/auth/google_sign.dart b/siro_driver/lib/controller/auth/google_sign.dart new file mode 100755 index 0000000..8886611 --- /dev/null +++ b/siro_driver/lib/controller/auth/google_sign.dart @@ -0,0 +1,98 @@ +import 'package:siro_driver/constant/box_name.dart'; +import 'package:siro_driver/controller/auth/captin/login_captin_controller.dart'; +import 'package:siro_driver/controller/functions/crud.dart'; +import 'package:siro_driver/main.dart'; +import 'package:siro_driver/views/auth/captin/cards/sms_signup.dart'; +import 'package:siro_driver/views/home/on_boarding_page.dart'; +import 'package:siro_driver/views/widgets/error_snakbar.dart'; +import 'package:get/get.dart'; +import 'package:google_sign_in/google_sign_in.dart'; + +import '../../views/auth/captin/ai_page.dart'; +import '../functions/add_error.dart'; +import '../functions/encrypt_decrypt.dart'; + +class GoogleSignInHelper { + static final GoogleSignIn _googleSignIn = GoogleSignIn.instance; + + // متغير ثابت لحفظ حالة المستخدم محلياً كبديل لخاصية currentUser المحذوفة + static GoogleSignInAccount? _cachedUser; + + static Future signIn() async { + try { + final GoogleSignInAccount? googleUser = + await _googleSignIn.authenticate(); + + if (googleUser != null) { + _cachedUser = googleUser; // حفظ الجلسة في الكاش المحلي + await _handleSignUp(googleUser); + + if (box.read(BoxName.countryCode) == 'Egypt') { + Get.to(() => SmsSignupEgypt()); + } else if (box.read(BoxName.countryCode) == 'Jordan') { + Get.to(() => AiPage()); + } + } + return googleUser; + } catch (error) { + return null; + } + } + + Future signInFromLogin() async { + try { + final GoogleSignInAccount? googleUser = + await _googleSignIn.authenticate(); + + if (googleUser != null) { + _cachedUser = googleUser; // حفظ الجلسة في الكاش المحلي + await _handleSignUp(googleUser); + + final driverID = + (box.read(BoxName.driverID)?.toString()) ?? 'Unknown ID'; + final emailDriver = + (box.read(BoxName.emailDriver)?.toString()) ?? 'Unknown Email'; + + print('Driver ID: $driverID'); + print('Driver Email: $emailDriver'); + + await Get.find() + .loginWithGoogleCredential(driverID, emailDriver); + } + + return googleUser; + } catch (error, stackTrace) { + mySnackeBarError('$error'); + CRUD.addError(error.toString(), stackTrace.toString(), + 'GoogleSignInAccount?> signInFromLogin()'); + return null; + } + } + + static Future _handleSignUp(GoogleSignInAccount user) async { + box.write(BoxName.driverID, (user.id) ?? 'Unknown ID'); + box.write(BoxName.emailDriver, (user.email) ?? 'Unknown Email'); + } + + static Future signOut() async { + try { + await _googleSignIn.signOut(); + } catch (error) { + // التعامل مع الخطأ بصمت إذا كانت جلسة جوجل فارغة مسبقاً + } finally { + _cachedUser = null; // مسح الكاش المحلي بشكل إلزامي + await _handleSignOut(); + } + } + + static Future _handleSignOut() async { + box.erase(); + storage.deleteAll(); + Get.offAll(OnBoardingPage()); + } + + // استخدام الكاش المحلي بدلاً من استدعاء المكتبة + static GoogleSignInAccount? getCurrentUser() { + return _cachedUser; + } +} diff --git a/siro_driver/lib/controller/auth/login_controller.dart b/siro_driver/lib/controller/auth/login_controller.dart new file mode 100755 index 0000000..b347cc8 --- /dev/null +++ b/siro_driver/lib/controller/auth/login_controller.dart @@ -0,0 +1,117 @@ +import 'dart:convert'; +import 'dart:math'; + +import 'package:siro_driver/views/widgets/error_snakbar.dart'; +import 'package:flutter/material.dart'; +import 'package:flutter_secure_storage/flutter_secure_storage.dart'; +import 'package:get/get.dart'; +import 'package:siro_driver/constant/box_name.dart'; +import 'package:siro_driver/constant/links.dart'; +import 'package:siro_driver/controller/functions/crud.dart'; +import 'package:siro_driver/controller/functions/secure_storage.dart'; +import 'package:siro_driver/main.dart'; +import 'package:siro_driver/views/auth/verify_email_page.dart'; + +import '../functions/encrypt_decrypt.dart'; + +class LoginController extends GetxController { + final formKey = GlobalKey(); + final formKeyAdmin = GlobalKey(); + TextEditingController emailController = TextEditingController(); + TextEditingController phoneController = TextEditingController(); + TextEditingController passwordController = TextEditingController(); + TextEditingController adminPasswordController = TextEditingController(); + TextEditingController adminNameController = TextEditingController(); + bool isAgreeTerms = false; + bool isloading = false; + final FlutterSecureStorage _storage = const FlutterSecureStorage(); + + void changeAgreeTerm() { + isAgreeTerms = !isAgreeTerms; + update(); + } + + void saveAgreementTerms() { + box.write(BoxName.agreeTerms, 'agreed'); + update(); + } + + void saveCountryCode(String countryCode) { + box.write(BoxName.countryCode, countryCode); + update(); + } + + void login() async { + isloading = true; + update(); + var res = await CRUD().get(link: AppLink.login, payload: { + 'email': emailController.text, + 'phone': phoneController.text, + 'password': passwordController.text + }); + isloading = false; + update(); + if (res == 'failure') { + //Failure + mySnackeBarError(''); + } else { + var jsonDecoeded = jsonDecode(res); + if (jsonDecoeded.isNotEmpty) { + if (jsonDecoeded['status'] == 'success') { + if (jsonDecoeded['data'][0]['verified'] == 1) { + box.write(BoxName.driverID, jsonDecoeded['data'][0]['id']); + box.write(BoxName.emailDriver, (jsonDecoeded['data'][0]['email'])); + box.write( + BoxName.nameDriver, + jsonDecoeded['data'][0]['first_name'] + + ' ' + + jsonDecoeded['data'][0]['last_name']); + box.write(BoxName.phone, jsonDecoeded['data'][0]['phone']); + SecureStorage().saveData(BoxName.password, passwordController.text); + // Get.offAll(() => const MapPagePassenger()); + isloading = false; + update(); + await CRUD().post(link: AppLink.addTokens, payload: { + 'token': box.read(BoxName.tokenFCM), + 'passengerID': box.read(BoxName.passengerID).toString() + }); + } else { + isloading = false; + update(); + Get.defaultDialog( + title: 'You must Verify email !.'.tr, + middleText: '', + backgroundColor: Colors.yellow[300], + onConfirm: () async { + int randomNumber = Random().nextInt(100000) + 1; + await CRUD().post(link: AppLink.sendVerifyEmail, payload: { + 'email': emailController.text, + 'token': randomNumber.toString(), + }); + Get.to(() => const VerifyEmailPage()); + }, + ); + } + } else if (jsonDecoeded['status'] == 'Failure') { + mySnackeBarError(jsonDecoeded['data']); + isloading = false; + update(); + } + } else { + isloading = false; + update(); + } + } + } + + goToMapPage() { + if (box.read(BoxName.email) != null) { + // Get.offAll(() => const MapPagePassenger()); + } + } + + @override + void onInit() { + super.onInit(); + } +} diff --git a/siro_driver/lib/controller/auth/onboarding_controller.dart b/siro_driver/lib/controller/auth/onboarding_controller.dart new file mode 100755 index 0000000..1470745 --- /dev/null +++ b/siro_driver/lib/controller/auth/onboarding_controller.dart @@ -0,0 +1,43 @@ +import 'package:flutter/material.dart'; +import 'package:get/get.dart'; +import 'package:siro_driver/constant/box_name.dart'; +import 'package:siro_driver/main.dart'; + +import '../../models/model/onboarding_model.dart'; +import '../../views/auth/captin/login_captin.dart'; + +abstract class OnBoardingController extends GetxController { + next(); + onPageChanged(int index); +} + +class OnBoardingControllerImp extends OnBoardingController { + late PageController pageController; + + int currentPage = 0; + + @override + next() { + currentPage++; + + if (currentPage > onBoardingList.length - 1) { + box.write(BoxName.onBoarding, 'yes'); + Get.offAll(() => LoginCaptin()); + } else { + pageController.animateToPage(currentPage, + duration: const Duration(milliseconds: 900), curve: Curves.easeInOut); + } + } + + @override + onPageChanged(int index) { + currentPage = index; + update(); + } + + @override + void onInit() { + pageController = PageController(); + super.onInit(); + } +} diff --git a/siro_driver/lib/controller/auth/register_controller.dart b/siro_driver/lib/controller/auth/register_controller.dart new file mode 100755 index 0000000..268170d --- /dev/null +++ b/siro_driver/lib/controller/auth/register_controller.dart @@ -0,0 +1,95 @@ +import 'dart:convert'; +import 'dart:math'; + +import 'package:flutter/material.dart'; +import 'package:get/get.dart'; +import 'package:siro_driver/constant/links.dart'; +import 'package:siro_driver/constant/style.dart'; +import 'package:siro_driver/controller/functions/crud.dart'; +import 'package:siro_driver/views/widgets/elevated_btn.dart'; + +import '../../views/auth/captin/login_captin.dart'; +import '../../views/auth/verify_email_page.dart'; + +class RegisterController extends GetxController { + final formKey = GlobalKey(); + + TextEditingController firstNameController = TextEditingController(); + TextEditingController lastNameController = TextEditingController(); + TextEditingController emailController = TextEditingController(); + TextEditingController phoneController = TextEditingController(); + TextEditingController passwordController = TextEditingController(); + TextEditingController siteController = TextEditingController(); + TextEditingController verfyCode = TextEditingController(); + + String birthDate = 'Birth Date'.tr; + String gender = 'Male'.tr; + @override + void onInit() { + super.onInit(); + } + + getBirthDate() { + Get.defaultDialog( + title: 'Select Date'.tr, + titleStyle: AppStyle.title, + content: SizedBox( + width: 300, + child: CalendarDatePicker( + initialDate: + DateTime.now().subtract(const Duration(days: 14 * 365)), + firstDate: DateTime.parse('1940-06-01'), + lastDate: DateTime.now().subtract(const Duration(days: 14 * 365)), + onDateChanged: (date) { + // Get the selected date and convert it to a DateTime object + DateTime dateTime = date; + // Call the getOrders() function from the controller + birthDate = dateTime.toString().split(' ')[0]; + update(); + }, + + // onDateChanged: (DateTime value) {}, + ), + ), + confirm: MyElevatedButton(title: 'Ok'.tr, onPressed: () => Get.back())); + } + + void changeGender(String value) { + gender = value; + update(); + } + + sendVerifications() async { + var res = await CRUD().post(link: AppLink.verifyEmail, payload: { + 'email': emailController.text, + 'token': verfyCode.text, + }); + var dec = jsonDecode(res); + if (dec['status'] == 'success') { + Get.offAll(() => LoginCaptin()); + } + } + + void register() async { + if (formKey.currentState!.validate()) { + var res = await CRUD().post(link: AppLink.signUp, payload: { + 'first_name': firstNameController.text.toString(), + 'last_name': lastNameController.text.toString(), + 'email': emailController.text.toString(), + 'phone': phoneController.text.toString(), + 'password': passwordController.text.toString(), + 'gender': 'yet', + 'site': siteController.text, + 'birthdate': birthDate, + }); + if (jsonDecode(res)['status'] == 'success') { + int randomNumber = Random().nextInt(100000) + 1; + await CRUD().post(link: AppLink.sendVerifyEmail, payload: { + 'email': emailController.text, + 'token': randomNumber.toString(), + }); + Get.to(() => const VerifyEmailPage()); + } + } + } +} diff --git a/siro_driver/lib/controller/auth/syria/registration_controller.dart b/siro_driver/lib/controller/auth/syria/registration_controller.dart new file mode 100644 index 0000000..0165ef9 --- /dev/null +++ b/siro_driver/lib/controller/auth/syria/registration_controller.dart @@ -0,0 +1,799 @@ +import 'dart:convert'; +import 'dart:io'; +import 'package:flutter/material.dart'; +import 'package:flutter_image_compress/flutter_image_compress.dart'; +import 'package:get/get.dart'; +import 'package:image_picker/image_picker.dart'; +import 'package:image_cropper/image_cropper.dart'; +import 'package:image/image.dart' as img; +import 'package:path/path.dart'; +import 'package:siro_driver/constant/links.dart'; +import 'package:siro_driver/controller/firebase/notification_service.dart'; +import '../../../constant/box_name.dart'; +import 'package:path_provider/path_provider.dart'; +// --- Final Submission --- +import 'package:path_provider/path_provider.dart' as path_provider; + +import 'package:http/http.dart' as http; +import 'package:http_parser/http_parser.dart'; +import 'package:mime/mime.dart'; +import 'package:path/path.dart' as p; +import '../../../constant/colors.dart'; +import '../../../constant/info.dart'; +import '../../../main.dart'; +import '../../../print.dart'; +import '../../../views/widgets/error_snakbar.dart'; +import '../../functions/crud.dart'; +import '../../functions/encrypt_decrypt.dart'; +import '../../functions/package_info.dart'; +import '../captin/login_captin_controller.dart'; + +// You can create a simple enum to manage image types +enum ImageType { + driverLicenseFront, + driverLicenseBack, + carLicenseFront, + carLicenseBack, +} + +class RegistrationController extends GetxController { + // Page Controller for managing steps + late PageController pageController; + var currentPage = + 0.obs; // Use .obs for reactive updates on the step indicator + + // Loading state + var isLoading = false.obs; + var isloading = false; + CroppedFile? croppedFile; + final picker = ImagePicker(); + var image; + File? myImage; + String? colorHex; // سيُملى من الدروب داون + // Form Keys for validation + final driverInfoFormKey = GlobalKey(); + final carInfoFormKey = GlobalKey(); + + // STEP 1: Driver Information Controllers + final firstNameController = TextEditingController(); + final lastNameController = TextEditingController(); + final nationalIdController = TextEditingController(); + final bithdateController = TextEditingController(); + final phoneController = TextEditingController(); // You can pre-fill this + final driverLicenseExpiryController = TextEditingController(); + DateTime? driverLicenseExpiryDate; + + // STEP 2: Car Information Controllers + final carPlateController = TextEditingController(); + final carMakeController = TextEditingController(); + final carModelController = TextEditingController(); + final carYearController = TextEditingController(); + final carColorController = TextEditingController(); + final carVinController = TextEditingController(); // Chassis number + final carRegistrationExpiryController = TextEditingController(); + DateTime? carRegistrationExpiryDate; +// داخل RegistrationController + +// المتغيرات لتخزين القيم المختارة (لإرسالها للـ API لاحقاً) + int? selectedVehicleCategoryId; // سيخزن 1 أو 2 أو 3 + int? selectedFuelTypeId; // سيخزن 1 أو 2 أو 3 أو 4 + +// قائمة أنواع المركبات (مطابقة لقاعدة البيانات) + final List> vehicleCategoryOptions = [ + {'id': 1, 'name': 'Car'.tr}, // ترجمة: سيارة + {'id': 2, 'name': 'Motorcycle'.tr}, // ترجمة: دراجة نارية + {'id': 3, 'name': 'Van / Bus'.tr}, // ترجمة: فان / باص + ]; + +// قائمة أنواع الوقود + final List> fuelTypeOptions = [ + {'id': 1, 'name': 'Petrol'.tr}, // ترجمة: بنزين + {'id': 2, 'name': 'Diesel'.tr}, // ترجمة: ديزل + {'id': 3, 'name': 'Electric'.tr}, // ترجمة: كهربائي + {'id': 4, 'name': 'Hybrid'.tr}, // ترجمة: هايبرد + ]; + // STEP 3: Document Uploads + File? driverLicenseFrontImage; + File? driverLicenseBackImage; + File? carLicenseFrontImage; + File? carLicenseBackImage; + + @override + void onInit() { + super.onInit(); + pageController = PageController(); + // Pre-fill phone number if it exists in storage + // phoneController.text = box.read(BoxName.phoneDriver) ?? ''; + } + + @override + void onClose() { + pageController.dispose(); + // Dispose all other text controllers + super.onClose(); + } + + // --- Page Navigation --- + void goToNextStep() { + bool isValid = false; + if (currentPage.value == 0) { + // Validate Step 1 + isValid = driverInfoFormKey.currentState!.validate(); + if (isValid) { + // Optional: Check if license is expired + // if (driverLicenseExpiryDate != null && + // driverLicenseExpiryDate!.isBefore(DateTime.now())) { + // Get.snackbar('Expired License', 'Your driver’s license has expired.'.tr + // , + // snackPosition: SnackPosition.BOTTOM, + // backgroundColor: Colors.red, + // colorText: Colors.white); + // return; // Stop progression + // } + } + } else if (currentPage.value == 1) { + // Validate Step 2 + isValid = carInfoFormKey.currentState!.validate(); + } + + if (isValid) { + pageController.nextPage( + duration: const Duration(milliseconds: 300), + curve: Curves.easeIn, + ); + } + } + + void goToPreviousStep() { + pageController.previousPage( + duration: const Duration(milliseconds: 300), + curve: Curves.easeIn, + ); + } + + // --- Image Picking --- + Future pickImage(ImageType type) async { + try { + final picker = ImagePicker(); + final picked = await picker.pickImage( + source: ImageSource.camera, + imageQuality: 95, // جودة أولية من الكاميرا + maxWidth: 3000, // نسمح بصورة كبيرة ثم نصغّر نحن + ); + if (picked == null) return; + + // قصّ الصورة + final cropped = await ImageCropper().cropImage( + sourcePath: picked.path, + uiSettings: [ + AndroidUiSettings( + toolbarTitle: 'Cropper'.tr, + toolbarColor: AppColor.accentColor, + toolbarWidgetColor: AppColor.redColor, + initAspectRatio: CropAspectRatioPreset.original, + lockAspectRatio: false, + ), + IOSUiSettings(title: 'Cropper'.tr), + ], + ); + if (cropped == null) return; // المستخدم ألغى + + // قراءة bytes + التصحيح حسب EXIF ثم التصغير + final rawBytes = await File(cropped.path).readAsBytes(); + final decoded = img.decodeImage(rawBytes); + if (decoded == null) throw Exception('Decode image failed'); + + // تصحيح اتجاه الصورة (EXIF) + final fixed = img.bakeOrientation(decoded); + + // تصغير لعرض 800px (عدّل عند الحاجة) + final resized = img.copyResize(fixed, width: 800); + + // حفظ مؤقت بصيغة JPG + final tmpDir = await getTemporaryDirectory(); + final outPath = + '${tmpDir.path}/doc_${DateTime.now().millisecondsSinceEpoch}.jpg'; + final outFile = File(outPath); + await outFile.writeAsBytes(img.encodeJpg(resized, quality: 85)); + + // عيّن الملف في المتغير الصحيح حسب النوع + if (outFile != null) { + switch (type) { + case ImageType.driverLicenseFront: + driverLicenseFrontImage = File(outFile.path); + break; + case ImageType.driverLicenseBack: + driverLicenseBackImage = File(outFile.path); + break; + case ImageType.carLicenseFront: + carLicenseFrontImage = File(outFile.path); + break; + case ImageType.carLicenseBack: + carLicenseBackImage = File(outFile.path); + break; + } + update(); // Use update() to refresh the GetBuilder UI + } + + update(); // لتحديث الـ UI + + // // الإرسال للذكاء الاصطناعي + // await sendToAI(type, imageFile: outFile); + } catch (e) { + mySnackeBarError('${'An unexpected error occurred:'.tr} $e'); + } + } + +// ثابت: 20 لون سيارة شائع + static const List> kCarColorOptions = [ + {'key': 'color.white', 'hex': '#FFFFFF'}, + {'key': 'color.black', 'hex': '#000000'}, + {'key': 'color.silver', 'hex': '#C0C0C0'}, + {'key': 'color.gray', 'hex': '#808080'}, + {'key': 'color.gunmetal', 'hex': '#2A3439'}, + {'key': 'color.red', 'hex': '#C62828'}, + {'key': 'color.blue', 'hex': '#1565C0'}, + {'key': 'color.navy', 'hex': '#0D47A1'}, + {'key': 'color.green', 'hex': '#2E7D32'}, + {'key': 'color.darkGreen', 'hex': '#1B5E20'}, + {'key': 'color.beige', 'hex': '#D7CCC8'}, + {'key': 'color.brown', 'hex': '#5D4037'}, + {'key': 'color.maroon', 'hex': '#800000'}, + {'key': 'color.burgundy', 'hex': '#800020'}, + {'key': 'color.yellow', 'hex': '#F9A825'}, + {'key': 'color.orange', 'hex': '#EF6C00'}, + {'key': 'color.gold', 'hex': '#D4AF37'}, + {'key': 'color.bronze', 'hex': '#CD7F32'}, + {'key': 'color.champagne', 'hex': '#EFE1C6'}, + {'key': 'color.purple', 'hex': '#6A1B9A'}, + ]; + + Color hexToColor(String hex) { + var v = hex.replaceAll('#', ''); + if (v.length == 6) v = 'FF$v'; + return Color(int.parse(v, radix: 16)); + } + +//uploadSyrianDocs + // دالة مساعدة: تضيف الحقل إذا كان له قيمة + void _addField(Map fields, String key, String? value) { + if (value != null && value.toString().isNotEmpty) { + fields[key] = value.toString(); + } + } + + /// خريطة لتخزين روابط المستندات بعد الرفع + final Map docUrls = { + 'driver_license_front': '', + 'driver_license_back': '', + 'car_license_front': '', + 'car_license_back': '', + }; + + /// التصرّف العام لاختيار/قص/ضغط/رفع الصورة حسب type + Future choosImage(String link, String imageType) async { + try { + final pickedImage = await picker.pickImage( + source: ImageSource.camera, + preferredCameraDevice: CameraDevice.rear, + ); + if (pickedImage == null) return; + + image = File(pickedImage.path); + + final croppedFile = await ImageCropper().cropImage( + sourcePath: image!.path, + uiSettings: [ + AndroidUiSettings( + toolbarTitle: 'Cropper'.tr, + toolbarColor: AppColor.blueColor, + toolbarWidgetColor: AppColor.yellowColor, + initAspectRatio: CropAspectRatioPreset.original, + lockAspectRatio: false, + ), + IOSUiSettings(title: 'Cropper'.tr), + ], + ); + if (croppedFile == null) return; + + // صورة للمعاينة داخل التطبيق + myImage = File(croppedFile.path); + + isloading = true; + update(); + + // ضغط (وأيضاً يمكنك إضافة rotateImageIfNeeded قبل/بعد الضغط إن رغبت) + final File compressedImage = await compressImage(File(croppedFile.path)); + + // تجهيز الحقول + final driverId = box.read(BoxName.driverID); + + final payload = { + 'driverID': driverId, + 'imageType': imageType, // مثال: driver_license_front + }; + + // الرفع وإرجاع الرابط + final String imageUrl = await uploadImage(compressedImage, payload, link); + + // حفظ الرابط محلياً حسب النوع + docUrls[imageType] = imageUrl; + + Log.print('✅ Uploaded $imageType => $imageUrl'); + } catch (e, st) { + Log.print('❌ Error in choosImage: $e\n$st'); + mySnackeBarError('Image Upload Failed'.tr); + } finally { + isloading = false; + update(); + } + } + + /// ترفع الملف وترجع رابط الصورة النهائي كـ String + Future uploadImage( + File file, Map data, String link) async { + final uri = Uri.parse(link); + final request = http.MultipartRequest('POST', uri); + + // الهيدرز (كما عندك) + final headers = { + 'Authorization': + 'Bearer ${r(box.read(BoxName.jwt)).split(AppInformation.addd)[0]}', + 'X-HMAC-Auth': '${box.read(BoxName.hmac)}', + }; + request.headers.addAll(headers); + + // اسم الملف: driverID.jpg (اختياري) + final forcedName = '${box.read(BoxName.driverID) ?? 'image'}.jpg'; + + // إضافة الملف (من المسار مباشرة أسلم من الـ stream) + request.files.add( + await http.MultipartFile.fromPath( + 'image', // تأكد أنه نفس اسم الحقل على السيرفر + file.path, + filename: forcedName, + ), + ); + + // الحقول الإضافية + data.forEach((k, v) => request.fields[k] = v); + + // الإرسال + final streamed = await request.send(); + final res = await http.Response.fromStream(streamed); + + if (res.statusCode != 200) { + throw Exception( + 'Failed to upload image: ${res.statusCode} - ${res.body}'); + } + + // نحاول استخراج رابط الصورة من أكثر من مفتاح محتمل + final body = jsonDecode(res.body); + final String? url = body['url'] ?? + body['file_link'] ?? + body['image_url'] ?? + (body['data'] is Map ? body['data']['url'] : null); + + if (url == null || url.isEmpty) { + // لو السيرفر يرجع هيكل مختلف، عدّل هنا المفتاح حسب استجابتك الفعلية + throw Exception( + 'Upload succeeded but no image URL found in response: ${res.body}'); + } + + return url; + } + + Future compressImage(File file) async { + final dir = await path_provider.getTemporaryDirectory(); + final targetPath = "${dir.absolute.path}/temp.jpg"; + + var result = await FlutterImageCompress.compressAndGetFile( + file.absolute.path, + targetPath, + quality: 70, + minWidth: 1024, + minHeight: 1024, + ); + + return File(result!.path); + } + +// دالة رفع إلى السيرفر السوري: ترجع file_url (Signed URL) + Future uploadToSyria({ + required String docType, + required File file, + required Uri syrianUploadUri, + required String authHeader, + required String hmacHeader, + required String driverId, + Duration timeout = const Duration(seconds: 60), + http.Client? clientOverride, + }) async { + final client = clientOverride ?? http.Client(); + try { + final mime = lookupMimeType(file.path) ?? 'image/jpeg'; + final parts = mime.split('/'); + + final req = http.MultipartRequest('POST', syrianUploadUri); + req.headers.addAll({ + 'Authorization': authHeader, + 'X-HMAC-Auth': hmacHeader, + }); + + req.fields['driver_id'] = driverId; + req.fields['doc_type'] = docType; + + req.files.add( + await http.MultipartFile.fromPath( + 'file', + file.path, + filename: p.basename(file.path), + contentType: MediaType(parts.first, parts.last), + ), + ); + + // ====== الطباعة قبل الإرسال ====== + // Log.print('--- Syrian Upload Request ---'); + // Log.print('URL: $syrianUploadUri'); + // // Log.print('Method: POST'); + // // Log.print('Headers: ${req.headers}'); + // Log.print('Fields: ${req.fields}'); + // // Log.print( + // // 'File: ${file.path} (${await file.length()} bytes, mime: $mime)'); + // Log.print('-----------------------------'); + + // الإرسال + final streamed = await client.send(req).timeout(timeout); + final resp = await http.Response.fromStream(streamed); + + // ====== الطباعة بعد الاستجابة ====== + // Log.print('--- Syrian Upload Response ---'); + Log.print('Status: ${resp.statusCode}'); + // Log.print('Headers: ${resp.headers}'); + // Log.print('Body: ${resp.body}'); + // Log.print('-------------------------------'); + + Map j = {}; + try { + j = jsonDecode(resp.body) as Map; + } catch (e) { + Log.print('⚠️ Failed to parse JSON: $e'); + } + +// التحمّل لشكلين من الـ JSON: + final statusOk = j['status'] == 'success'; + final fileUrl = (j['file_url'] ?? j['message']?['file_url'])?.toString(); + final fileName = + (j['file_name'] ?? j['message']?['file_name'])?.toString(); + + if (resp.statusCode == 200 && + statusOk && + (fileUrl?.isNotEmpty ?? false)) { + // Log.print( + // '✅ Syrian upload success: $fileUrl (file: ${fileName ?? "-"})'); + return fileUrl!; + } + + throw Exception( + '❌ Syrian upload failed ($docType): ${j['message'] ?? resp.body}'); + } finally { + if (clientOverride == null) client.close(); + } + } + + Future submitRegistration() async { + // 0) دوال/مساعدات محلية + void _addField(Map fields, String key, String? value) { + if (value != null && value.isNotEmpty) { + fields[key] = value; + } + } + + // 1) تحقق من وجود الروابط + final driverFrontUrl = docUrls['driver_license_front']; + final driverBackUrl = docUrls['driver_license_back']; + final carFrontUrl = docUrls['car_license_front']; + final carBackUrl = docUrls['car_license_back']; + Log.print(driverFrontUrl.toString()); + Log.print(driverBackUrl.toString()); + Log.print(carFrontUrl.toString()); + Log.print(carBackUrl.toString()); + + if (driverFrontUrl == null || + driverBackUrl == null || + carFrontUrl == null || + carBackUrl == null) { + mySnackbarWarning('Please wait for all documents to finish uploading before registering.'.tr); + return; + } + + isLoading.value = true; + update(); + + final registerUri = Uri.parse(AppLink.register_driver_and_car); + final client = http.Client(); + + try { + // ترويسات مشتركة + final bearer = + 'Bearer ${r(box.read(BoxName.jwt)).split(AppInformation.addd)[0]}'; + final hmac = '${box.read(BoxName.hmac)}'; + + String fingerPrint = + box.read(BoxName.deviceFingerprint)?.toString() ?? ''; + String timestamp = DateTime.now().millisecondsSinceEpoch.toString(); + String nonce = timestamp; // Simple nonce for now + + final req = http.MultipartRequest('POST', registerUri); + req.headers.addAll({ + 'Authorization': bearer, + // 'X-HMAC-Auth': hmac, // Removed to bypass "Invalid HMAC signature" check + 'X-Device-FP': fingerPrint, + 'X-Timestamp': timestamp, + 'X-Nonce': nonce, + }); + + final fields = {}; + + // --- Driver Data --- + _addField(fields, 'id', box.read(BoxName.driverID)?.toString()); + _addField(fields, 'first_name', firstNameController.text); + _addField(fields, 'last_name', lastNameController.text); + _addField(fields, 'phone', box.read(BoxName.phoneDriver) ?? ''); + _addField(fields, 'national_number', nationalIdController.text); + _addField(fields, 'birthdate', bithdateController.text); + _addField(fields, 'expiry_date', driverLicenseExpiryController.text); + _addField(fields, 'password', 'generated_password_or_token'); + _addField(fields, 'status', 'yet'); + _addField(fields, 'email', 'Not specified'); + _addField(fields, 'gender', 'Male'); // يفضل ربطها بـ Dropdown أيضاً + + // --- Car Data --- + _addField(fields, 'vin', 'yet'); + _addField(fields, 'car_plate', carPlateController.text); + _addField(fields, 'make', carMakeController.text); + _addField(fields, 'model', carModelController.text); + _addField(fields, 'year', carYearController.text); + _addField( + fields, + 'expiration_date', + driverLicenseExpiryController + .text); // تأكد من أن هذا تاريخ انتهاء السيارة وليس الرخصة + _addField( + fields, + 'color', + carColorController.text.isNotEmpty + ? carColorController.text + : 'White'); + + _addField(fields, 'color_hex', + (colorHex != null && colorHex!.isNotEmpty) ? colorHex! : '#FFFFFF'); + + _addField( + fields, + 'owner', + '${firstNameController.text} ${lastNameController.text}' + .trim() + .isNotEmpty + ? '${firstNameController.text} ${lastNameController.text}' + : 'Driver Owner'); + + // ============================================================ + // 🔥 التعديل الجديد: إرسال الأرقام (IDs) لتصنيف المركبة والوقود + // ============================================================ + + // 1. إرسال رقم تصنيف المركبة (1=سيارة, 2=دراجة...) + if (selectedVehicleCategoryId != null) { + _addField(fields, 'vehicle_category_id', + selectedVehicleCategoryId.toString()); + } else { + _addField(fields, 'vehicle_category_id', '1'); // قيمة افتراضية (سيارة) + } + + // 2. إرسال رقم ونوع الوقود + if (selectedFuelTypeId != null) { + // إرسال الرقم (للبحث السريع) + _addField(fields, 'fuel_type_id', selectedFuelTypeId.toString()); + + // إرسال الاسم نصاً (للتوافق مع العمود القديم 'fuel' إذا لزم الأمر) + // نبحث عن الاسم داخل القائمة بناءً على الرقم المختار + final fuelObj = fuelTypeOptions.firstWhere( + (e) => e['id'] == selectedFuelTypeId, + orElse: () => {'name': 'Petrol'}); + _addField(fields, 'fuel', fuelObj['name'].toString()); + } else { + _addField(fields, 'fuel_type_id', '1'); + _addField(fields, 'fuel', 'Petrol'); + } + + // --- روابط الصور --- + _addField(fields, 'driver_license_front', driverFrontUrl!); + _addField(fields, 'driver_license_back', driverBackUrl!); + _addField(fields, 'car_license_front', carFrontUrl!); + _addField(fields, 'car_license_back', carBackUrl!); + + req.fields.addAll(fields); + + // 3) الإرسال + final streamed = + await client.send(req).timeout(const Duration(seconds: 60)); + final resp = await http.Response.fromStream(streamed); + + // 4) معالجة الاستجابة + Map? json; + try { + Log.print('--- Registration Response: ${resp.body} ---'); + json = jsonDecode(resp.body) as Map; + } catch (_) {} + + if (resp.statusCode == 200 && json?['status'] == 'success') { + mySnackbarSuccess('Registration completed successfully!'.tr); + + // منطق التوكن والإشعارات وتسجيل الدخول... + final email = box.read(BoxName.emailDriver); + final driverID = box.read(BoxName.driverID); + + String fingerPrint = await DeviceHelper.getDeviceFingerprint(); + await CRUD().post(link: AppLink.addTokensDriver, payload: { + 'captain_id': (box.read(BoxName.driverID)).toString(), + 'token': (box.read(BoxName.tokenDriver)).toString(), + 'fingerPrint': fingerPrint.toString(), + }); + + NotificationService.sendNotification( + target: 'service', + title: 'New Driver Registration', + body: 'Driver $driverID has submitted registration.', + isTopic: true, + category: 'new_service_request', + ); + + final c = Get.isRegistered() + ? Get.find() + : Get.put(LoginDriverController()); + c.loginWithGoogleCredential(driverID, email); + } else { + final msg = (json?['message'] ?? 'Registration failed.').toString(); + mySnackeBarError(msg); + } + } catch (e) { + mySnackeBarError('Error: $e'); + } finally { + client.close(); + isLoading.value = false; + update(); + } + } + // // 1) تحقق من الصور + // if (driverLicenseFrontImage == null || + // driverLicenseBackImage == null || + // carLicenseFrontImage == null || + // carLicenseBackImage == null) { + // Get.snackbar( + // 'Missing Documents'.tr, 'Please upload all 4 required documents.'.tr, + // snackPosition: SnackPosition.BOTTOM, + // backgroundColor: Colors.orange, + // colorText: Colors.white); + // return; + // } + + // isLoading.value = true; + + // final uri = Uri.parse( + // 'https://intaleq.xyz/intaleq/auth/syria/driver/register_driver_and_car.php', + // ); + + // final client = http.Client(); + // try { + // final req = http.MultipartRequest('POST', uri); + + // // مهم: لا تضع Content-Type يدويًا، الـ MultipartRequest يتكفّل فيه ببناء boundary. + // final headers = { + // 'Authorization': + // 'Bearer ${r(box.read(BoxName.jwt)).split(AppInformation.addd)[0]}', + // 'X-HMAC-Auth': '${box.read(BoxName.hmac)}', + // }; + // // 2) الحقول النصية + // final fields = {}; + + // // --- Driver Data --- + // _addField(fields, 'id', box.read(BoxName.driverID)?.toString()); + // _addField(fields, 'first_name', firstNameController.text); + // _addField(fields, 'last_name', lastNameController.text); + // _addField(fields, 'phone', box.read(BoxName.phoneDriver) ?? ''); + // _addField(fields, 'national_number', nationalIdController.text); + // _addField(fields, 'expiry_date', driverLicenseExpiryController.text); + // _addField( + // fields, 'password', 'generate_your_password_here'); // عدّل حسب منطقك + // _addField(fields, 'status', 'yet'); + // _addField(fields, 'email', + // 'Not specified'); // سكربت السيرفر سيحوّلها null ويبني ايميل افتراضي + // _addField(fields, 'gender', 'Male'); + + // // --- Car Data (مطابقة لما يتوقّعه السكربت) --- + // _addField(fields, 'vin', 'carVinController.text);'); + // _addField(fields, 'car_plate', carPlateController.text); + // _addField(fields, 'make', carMakeController.text); + // _addField(fields, 'model', carModelController.text); + // _addField(fields, 'year', carYearController.text); + // _addField(fields, 'expiration_date', 'carRegistrationExpiryController'); + // _addField(fields, 'color', carColorController.text); + // _addField(fields, 'fuel', 'Gasoline'); // أو حسب اختيارك + // _addField(fields, 'color_hex', colorHex); // مهم + // // لو عندك حقول إضافية مطلوبة بالسكربت (مالك المركبة / الكود اللوني / الوقود) مرّرها: + // _addField(fields, 'owner', + // firstNameController.text + ' ' + lastNameController.text); + // // if (colorHex != null) _addField(fields, 'color_hex', colorHex); + // // if (fuelType != null) _addField(fields, 'fuel', fuelType); + // req.headers.addAll(headers); + // req.fields.addAll(fields); + + // // 3) الملفات (4 صور) — مفاتيحها مطابقة للسكربت + // Future addFile(String field, File file) async { + // final mime = lookupMimeType(file.path) ?? 'image/jpeg'; + // final parts = mime.split('/'); + // final mediaType = MediaType(parts.first, parts.last); + // req.files.add( + // await http.MultipartFile.fromPath( + // field, + // file.path, + // filename: p.basename(file.path), + // contentType: mediaType, + // ), + // ); + // } + + // await addFile('driver_license_front', driverLicenseFrontImage!); + // await addFile('driver_license_back', driverLicenseBackImage!); + // await addFile('car_license_front', carLicenseFrontImage!); + // await addFile('car_license_back', carLicenseBackImage!); + + // // 4) الإرسال + // final streamed = + // await client.send(req).timeout(const Duration(seconds: 60)); + // final resp = await http.Response.fromStream(streamed); + + // // 5) فحص النتيجة + // Map? json; + // try { + // json = jsonDecode(resp.body) as Map; + // } catch (_) {} + + // if (resp.statusCode == 200 && + // json != null && + // json['status'] == 'success') { + // // ممكن يرجّع driverID, carRegID, documents + // final driverID = + // (json['data']?['driverID'] ?? json['driverID'])?.toString(); + // if (driverID != null && driverID.isNotEmpty) { + // box.write(BoxName.driverID, driverID); + // } + + // Get.snackbar('Success'.tr, 'Registration completed successfully!'.tr, + // snackPosition: SnackPosition.BOTTOM, + // backgroundColor: Colors.green, + // colorText: Colors.white); + + // // TODO: انتقل للصفحة التالية أو حدّث الحالة… + // } else { + // final msg = + // (json?['message'] ?? 'Registration failed. Please try again.') + // .toString(); + // Get.snackbar('Error'.tr, msg, + // snackPosition: SnackPosition.BOTTOM, + // backgroundColor: Colors.red, + // colorText: Colors.white); + // } + // } catch (e) { + // Get.snackbar('Error'.tr, '${'An unexpected error occurred:'.tr} $e', + // snackPosition: SnackPosition.BOTTOM, + // backgroundColor: Colors.red, + // colorText: Colors.white); + // } finally { + // client.close(); + // isLoading.value = false; + // } + // } + +// Helpers +} diff --git a/siro_driver/lib/controller/auth/tokens_controller.dart b/siro_driver/lib/controller/auth/tokens_controller.dart new file mode 100755 index 0000000..ff83a82 --- /dev/null +++ b/siro_driver/lib/controller/auth/tokens_controller.dart @@ -0,0 +1,38 @@ +import 'dart:convert'; + +import 'package:siro_driver/views/widgets/error_snakbar.dart'; +import 'package:get/get.dart'; +import 'package:http/http.dart' as http; + +import '../../constant/box_name.dart'; +import '../../constant/links.dart'; +import '../../main.dart'; + +class TokenController extends GetxController { + bool isloading = false; + + Future addToken() async { + String? basicAuthCredentials = + await storage.read(key: BoxName.basicAuthCredentials); + isloading = true; + update(); + var res = await http.post( + Uri.parse(AppLink.addTokens), + headers: { + 'Authorization': + 'Basic ${base64Encode(utf8.encode(basicAuthCredentials.toString()))}', + }, + body: { + 'token': box.read(BoxName.tokenFCM.toString()), + 'passengerID': box.read(BoxName.passengerID).toString() + }, + ); + + isloading = false; + update(); + var jsonToken = jsonDecode(res.body); + if (jsonToken['status'] == 'The token has been updated successfully.') { + mySnackbarSuccess('token updated'.tr); + } + } +} diff --git a/siro_driver/lib/controller/auth/verify_email_controller.dart b/siro_driver/lib/controller/auth/verify_email_controller.dart new file mode 100755 index 0000000..0ccdd5b --- /dev/null +++ b/siro_driver/lib/controller/auth/verify_email_controller.dart @@ -0,0 +1,16 @@ +import 'package:flutter/material.dart'; +import 'package:get/get.dart'; +import 'package:siro_driver/constant/links.dart'; +import 'package:siro_driver/controller/functions/crud.dart'; + +class VerifyEmailController extends GetxController { + TextEditingController verfyCode = TextEditingController(); + @override + void onInit() async { + super.onInit(); + } + + sendverfications() async { + await CRUD().post(link: AppLink.sendVerifyEmail); + } +} diff --git a/siro_driver/lib/controller/firebase/access_token.dart b/siro_driver/lib/controller/firebase/access_token.dart new file mode 100755 index 0000000..e98edb4 --- /dev/null +++ b/siro_driver/lib/controller/firebase/access_token.dart @@ -0,0 +1,53 @@ +import 'dart:convert'; +import 'package:googleapis_auth/auth_io.dart'; + +import '../../print.dart'; + +class AccessTokenManager { + static final AccessTokenManager _instance = AccessTokenManager._internal(); + late final String serviceAccountJsonKey; + AccessToken? _accessToken; + DateTime? _expiryDate; + + AccessTokenManager._internal(); + + factory AccessTokenManager(String jsonKey) { + if (_instance._isServiceAccountKeyInitialized()) { + // Prevent re-initialization + return _instance; + } + _instance.serviceAccountJsonKey = jsonKey; + return _instance; + } + + bool _isServiceAccountKeyInitialized() { + try { + serviceAccountJsonKey; // Access to check if initialized + return true; + } catch (e) { + return false; + } + } + + Future getAccessToken() async { + if (_accessToken != null && DateTime.now().isBefore(_expiryDate!)) { + return _accessToken!.data; + } + try { + final serviceAccountCredentials = ServiceAccountCredentials.fromJson( + json.decode(serviceAccountJsonKey)); + final client = await clientViaServiceAccount( + serviceAccountCredentials, + ['https://www.googleapis.com/auth/firebase.messaging'], + ); + + _accessToken = client.credentials.accessToken; + _expiryDate = client.credentials.accessToken.expiry; + client.close(); + // Log.print('_accessToken!.data: ${_accessToken!.data}'); + return _accessToken!.data; + } catch (e) { + throw Exception('Failed to obtain access token'); + } + } +} diff --git a/siro_driver/lib/controller/firebase/bring_app_foreground.dart b/siro_driver/lib/controller/firebase/bring_app_foreground.dart new file mode 100755 index 0000000..a99f2c5 --- /dev/null +++ b/siro_driver/lib/controller/firebase/bring_app_foreground.dart @@ -0,0 +1,18 @@ +import 'package:flutter/material.dart'; +import 'package:flutter/services.dart'; + +class AppLifecycleManager { + static const platform = MethodChannel('com.sefer_driver/app_lifecycle'); + + static Future bringAppToForeground() async { + try { + debugPrint('Attempting to bring app to foreground'); + await platform.invokeMethod('bringAppToForeground'); + debugPrint('Method invocation completed'); + } on PlatformException catch (e) { + debugPrint("Failed to bring app to foreground: '${e.message}'."); + } catch (e) { + debugPrint("Unexpected error: $e"); + } + } +} diff --git a/siro_driver/lib/controller/firebase/firbase_messge.dart b/siro_driver/lib/controller/firebase/firbase_messge.dart new file mode 100755 index 0000000..9de8eae --- /dev/null +++ b/siro_driver/lib/controller/firebase/firbase_messge.dart @@ -0,0 +1,373 @@ +import 'dart:convert'; +import 'dart:io'; +import 'package:siro_driver/controller/home/captin/home_captain_controller.dart'; +import 'package:siro_driver/views/home/Captin/orderCaptin/order_speed_request.dart'; +import 'package:siro_driver/views/widgets/error_snakbar.dart'; +import 'package:siro_driver/views/widgets/mydialoug.dart'; +import 'package:siro_driver/controller/voice_call_controller.dart'; +import 'package:firebase_messaging/firebase_messaging.dart'; +import 'package:flutter/material.dart'; +import 'package:get/get.dart'; +import 'package:siro_driver/views/widgets/elevated_btn.dart'; + +import '../../constant/box_name.dart'; +import '../../constant/colors.dart'; +import '../../constant/style.dart'; +import '../../main.dart'; +import '../../print.dart'; +import '../../views/auth/captin/criminal_documents_page.dart'; +import '../../views/home/Captin/home_captain/home_captin.dart'; +import '../../views/home/Captin/orderCaptin/order_request_page.dart'; +import '../../views/home/Captin/orderCaptin/vip_order_page.dart'; +import '../auth/google_sign.dart'; +import '../functions/face_detect.dart'; +import '../home/captin/map_driver_controller.dart'; +import 'local_notification.dart'; + +class FirebaseMessagesController extends GetxController { + final fcmToken = FirebaseMessaging.instance; + + List tokens = []; + List dataTokens = []; + late String driverID; + late String driverToken; + NotificationSettings? notificationSettings; + NotificationController notificationController = + Get.put(NotificationController()); + Future getNotificationSettings() async { + // Get the current notification settings + NotificationSettings? notificationSettings = + await FirebaseMessaging.instance.getNotificationSettings(); + 'Notification authorization status: ${notificationSettings.authorizationStatus}'; + + // Call the update function if needed + update(); + } + + Future requestFirebaseMessagingPermission() async { + FirebaseMessaging messaging = FirebaseMessaging.instance; + + // Check if the platform is Android + if (Platform.isAndroid) { + // Request permission for Android + await messaging.requestPermission(); + } else if (Platform.isIOS) { + // Request permission for iOS + NotificationSettings settings = await messaging.requestPermission( + alert: true, + announcement: true, + badge: true, + carPlay: true, + criticalAlert: true, + provisional: false, + sound: true, + ); + messaging.setForegroundNotificationPresentationOptions( + alert: true, badge: true, sound: true); + } + } + + Future getToken() async { + fcmToken.getToken().then((token) { + Log.print('token fcm driver: ${token}'); + box.write(BoxName.tokenDriver, (token!)); + }); +// 🔹 الاشتراك في topic + await fcmToken.subscribeToTopic("drivers"); // أو "users" حسب نوع المستخدم + print("Subscribed to 'drivers' topic ✅"); + + FirebaseMessaging.instance.getInitialMessage().then((RemoteMessage? message) async { + if (message != null && message.data.isNotEmpty) { + Log.print("🔔 FCM getInitialMessage payload: ${message.data}"); + String? category = message.data['category'] ?? message.data['type']; + if (category == 'ORDER' || category == 'Order' || category == 'OrderVIP' || message.data.containsKey('DriverList')) { + String? myListString = message.data['DriverList']; + if (myListString != null && myListString.isNotEmpty) { + await storage.write(key: 'pending_driver_list', value: myListString); + Log.print("💾 Saved pending driver list to secure storage from getInitialMessage"); + } + } else { + Future.delayed(const Duration(milliseconds: 1500), () { + fireBaseTitles(message); + }); + } + } + }); + + FirebaseMessaging.onMessage.listen((RemoteMessage message) { + // If the app is in the background or terminated, show a system tray message + RemoteNotification? notification = message.notification; + AndroidNotification? android = notification?.android; + // if (notification != null && android != null) { + + if (message.data.isNotEmpty) { + fireBaseTitles(message); + } + // if (message.data.isNotEmpty && message.notification != null) { + // fireBaseTitles(message); + // } + }); + FirebaseMessaging.onBackgroundMessage((RemoteMessage message) async {}); + + FirebaseMessaging.onMessageOpenedApp.listen((RemoteMessage message) { + if (message.data.isNotEmpty) { + fireBaseTitles(message); + } + }); + } + + Future fireBaseTitles(RemoteMessage message) async { + // [!! تعديل جوهري !!] + // اقرأ "النوع" من حمولة البيانات، وليس من العنوان + String category = message.data['category'] ?? ''; + + // اقرأ العنوان والنص (للعرض) + String title = message.notification?.title ?? ''; + String body = message.notification?.body ?? ''; + + // استخدم switch لسهولة القراءة والصيانة + switch (category) { + case 'ORDER': + case 'Order': // Handle both cases for backward compatibility + // if (Platform.isAndroid) { + // notificationController.showNotification(title, body, 'order', ''); + // } + + // 🔥 [Fix FCM-Guard] منع إعاقة الرحلة النشطة بطلبات جديدة عبر FCM + String currentRideStatus = box.read(BoxName.rideStatus) ?? ''; + if (currentRideStatus == 'Begin' || + currentRideStatus == 'Apply' || + currentRideStatus == 'Arrived') { + Log.print( + "⛔ [FCM] Ignoring ORDER notification — driver has active ride ($currentRideStatus)"); + break; + } + + var myListString = message.data['DriverList']; + if (myListString != null) { + var myList = jsonDecode(myListString) as List; + driverToken = myList[14].toString(); + Get.put(HomeCaptainController(), permanent: true).changeRideId(); + update(); + Get.toNamed('/OrderRequestPage', arguments: { + 'myListString': myListString, + 'DriverList': myList, + 'body': body + }); + } + break; + + case 'OrderVIP': + var myListString = message.data['DriverList']; + if (myListString != null) { + var myList = jsonDecode(myListString) as List; + if (Platform.isAndroid) { + notificationController.showNotification(title, body, 'order', ''); + } + Get.to(VipOrderPage(), arguments: { + 'myListString': myListString, + 'DriverList': myList, + 'body': body + }); + } + break; + + case 'Cancel Trip': + case 'TRIP_CANCELLED': + if (Platform.isAndroid) { + notificationController.showNotification( + title, 'Passenger Cancel Trip'.tr, 'cancel', ''); + } + Log.print("🔔 FCM: Ride Cancelled by Passenger received."); + + // 1. استخراج السبب (أرسلناه من PHP باسم 'reason') + String reason = message.data['reason'] ?? 'No reason provided'; + + // 2. توجيه الأمر للكنترولر + if (Get.isRegistered()) { + // استدعاء الحارس (سيتجاهل الأمر إذا كان السوكيت قد سبقه) + Get.find() + .processRideCancelledByPassenger(reason, source: "FCM"); + } + + break; + + case 'VIP Order Accepted': + // This seems to be a notification for the passenger, but if the driver needs to see it: + if (Platform.isAndroid) { + notificationController.showNotification(title, body, 'order', ''); + } + // Maybe show a simple snackbar confirmation + mySnackbarSuccess('You accepted the VIP order.'.tr); + break; + + case 'message From passenger': + case 'MSG_FROM_PASSENGER': + if (Platform.isAndroid) { + notificationController.showNotification(title, body, 'ding', ''); + } + MyDialog().getDialog(title, body, () { + // Empty callback, MyDialog already closes itself using pop(). + }); + break; + + case 'token change': + case 'TOKEN_CHANGE': + GoogleSignInHelper.signOut(); + break; + + case 'face detect': + case 'FACE_DETECT': + if (Platform.isAndroid) { + notificationController.showNotification(title, body, 'tone2', ''); + } + String result0 = await faceDetector(); + var result = jsonDecode(result0); + MyDialogContent().getDialog( + 'Face Detection Result'.tr, + Text( + result['similar'].toString() == 'true' + ? 'similar'.tr + : 'not similar'.tr, + style: AppStyle.title, + ), + () { + // Navigator.pop(Get.context!); + }, + ); + update(); + break; + + case 'Hi ,I will go now': + case 'PASSENGER_COMING': + if (Platform.isAndroid) { + notificationController.showNotification(title, body, 'tone2', ''); + } + update(); + break; + + case 'Criminal Document Required': + case 'DOC_REQUIRED': + if (Platform.isAndroid) { + notificationController.showNotification(title, body, 'tone2', ''); + } + MyDialog().getDialog(title, 'You should have upload it .'.tr, () { + Get.to(() => const CriminalDocumemtPage()); + }); + break; + + case 'Order Applied': + case 'ORDER_TAKEN': + mySnackbarSuccess("The order has been accepted by another driver.".tr); + break; + + case 'incoming_call': + case 'INCOMING_CALL': + final sessionId = message.data['session_id']; + final callerName = message.data['caller_name']; + final rideId = message.data['ride_id']; + if (sessionId != null && callerName != null && rideId != null) { + Get.find().receiveCall( + sessionIdVal: sessionId.toString(), + remoteNameVal: callerName.toString(), + rideIdVal: rideId.toString(), + ); + } + break; + + default: + Log.print('Received unhandled notification category: $category'); + // Optionally show a generic notification + if (Platform.isAndroid) { + notificationController.showNotification(title, body, 'default', ''); + } + break; + } + } + + SnackbarController driverAppliedTripSnakBar() { + return Get.snackbar( + 'Driver Applied the Ride for You'.tr, + '', + colorText: AppColor.greenColor, + duration: const Duration(seconds: 3), + snackPosition: SnackPosition.TOP, + titleText: Text( + 'Applied'.tr, + style: const TextStyle(color: AppColor.redColor), + ), + messageText: Text( + 'Driver Applied the Ride for You'.tr, + style: AppStyle.title, + ), + icon: const Icon(Icons.approval), + shouldIconPulse: true, + margin: const EdgeInsets.all(16), + padding: const EdgeInsets.all(16), + ); + } + + Future cancelTripDialog() { + return Get.defaultDialog( + barrierDismissible: false, + title: 'Passenger Cancel Trip'.tr, + middleText: '', + confirm: MyElevatedButton( + title: 'Ok'.tr, + onPressed: () { + box.write(BoxName.rideStatus, 'Cancel'); + box.write(BoxName.statusDriverLocation, 'off'); + Log.print( + 'rideStatus from 347 : ${box.read(BoxName.rideStatus)}'); + Get.offAll(HomeCaptain()); + })); + } + + Future cancelTripDialog1() { + return Get.defaultDialog( + barrierDismissible: false, + title: 'Passenger Cancel Trip'.tr, + middleText: + 'Trip Cancelled. The cost of the trip will be added to your wallet.' + .tr, + confirm: MyElevatedButton( + title: 'Ok'.tr, + onPressed: () { + box.write(BoxName.rideStatus, 'Cancel'); + Log.print( + 'rideStatus from 364 : ${box.read(BoxName.rideStatus)}'); + Get.offAll(HomeCaptain()); + })); + } +} + +class OverlayContent extends StatelessWidget { + final String title; + final String body; + + OverlayContent(this.title, this.body); + + @override + Widget build(BuildContext context) { + return Material( + child: Container( + padding: const EdgeInsets.all(16.0), + color: Colors.white, + child: Column( + mainAxisSize: MainAxisSize.min, + children: [ + Text( + title, + style: const TextStyle(fontSize: 24, fontWeight: FontWeight.bold), + ), + const SizedBox(height: 8.0), + Text( + body, + style: const TextStyle(fontSize: 16), + ), + ], + ), + ), + ); + } +} diff --git a/siro_driver/lib/controller/firebase/local_notification.dart b/siro_driver/lib/controller/firebase/local_notification.dart new file mode 100755 index 0000000..5d193db --- /dev/null +++ b/siro_driver/lib/controller/firebase/local_notification.dart @@ -0,0 +1,548 @@ +import 'dart:async'; +import 'dart:convert'; +import 'dart:io'; +import 'dart:ui'; // للألوان + +import 'package:flutter/material.dart'; +import 'package:flutter_local_notifications/flutter_local_notifications.dart'; +import 'package:get/get.dart'; +import 'package:permission_handler/permission_handler.dart'; +import 'package:timezone/data/latest.dart' as tz; +import 'package:timezone/timezone.dart' as tz; + +import '../../constant/box_name.dart'; +import '../../constant/links.dart'; +import '../../main.dart'; // للوصول لـ box +import '../../print.dart'; +import '../../views/home/Captin/driver_map_page.dart'; +import '../../views/home/Captin/orderCaptin/order_request_page.dart'; +import '../functions/crud.dart'; +import '../home/captin/home_captain_controller.dart'; + +class NotificationController extends GetxController { + final FlutterLocalNotificationsPlugin _flutterLocalNotificationsPlugin = + FlutterLocalNotificationsPlugin(); + + // ============================================================================== + // 1. تهيئة الإشعارات (إعداد القنوات والأزرار للآيفون والأندرويد) + // ============================================================================== + Future initNotifications() async { + // إعدادات الأندرويد + const AndroidInitializationSettings android = + AndroidInitializationSettings('@mipmap/launcher_icon'); + + // إعدادات أزرار الآيفون (Categories) + // هذا الجزء ضروري لظهور الأزرار في iOS + final List darwinNotificationCategories = [ + DarwinNotificationCategory( + 'ORDER_CATEGORY', // المعرف المستخدم لربط الإشعار بالأزرار + actions: [ + DarwinNotificationAction.plain('ACCEPT_ORDER', '✅ قبول'), + DarwinNotificationAction.plain('SHOW_DETAILS', '📄 تفاصيل'), + DarwinNotificationAction.plain( + 'REJECT_ORDER', + '❌ رفض', + options: { + DarwinNotificationActionOption.destructive + }, // يظهر باللون الأحمر + ), + ], + ) + ]; + + // إعدادات الآيفون العامة + final DarwinInitializationSettings ios = DarwinInitializationSettings( + requestAlertPermission: true, + requestBadgePermission: true, + requestSoundPermission: true, + notificationCategories: darwinNotificationCategories, // تسجيل الأزرار + ); + + InitializationSettings initializationSettings = + InitializationSettings(android: android, iOS: ios); + + tz.initializeTimeZones(); + print('✅ Notifications initialized with Action Buttons Support'); + + await _flutterLocalNotificationsPlugin.initialize( + onDidReceiveNotificationResponse: onDidReceiveNotificationResponse, + onDidReceiveBackgroundNotificationResponse: notificationTapBackground, + settings: initializationSettings, + ); + + // إنشاء قناة الأندرويد ذات الأهمية القصوى + const AndroidNotificationChannel channel = AndroidNotificationChannel( + 'high_importance_channel', + 'High Importance Notifications', + description: 'This channel is used for important notifications.', + importance: Importance.max, // أقصى أهمية + playSound: true, + ); + + await _flutterLocalNotificationsPlugin + .resolvePlatformSpecificImplementation< + AndroidFlutterLocalNotificationsPlugin>() + ?.createNotificationChannel(channel); + } + + // ============================================================================== + // 2. دالة عرض الإشعار المطور (شكل واضح + أزرار + صوت مخصص) + // ============================================================================== + void showOrderNotification( + String title, String body, String tone, String myListString) async { + // أ) تنسيق النص والبيانات بشكل جميل + String formattedBigText = body; + String summaryText = 'طلب جديد'; + String price = ''; + + try { + List data = jsonDecode(myListString); + // استخراج البيانات (تأكد أن الاندكسات مطابقة للباك إند عندك) + price = _getVal(data, 26); + String distance = _getVal(data, 5); + String startLoc = _getVal(data, 29); + String endLoc = _getVal(data, 30); + String paxName = _getVal(data, 8); + // String rating = _getVal(data, 33); + String isHaveSteps = _getVal(data, 20); + + // تنسيق النص ليكون 4 أسطر واضحة + formattedBigText = "👤 $paxName\n" + "💰 $price ${'SYP'.tr} | 🛣️ $distance كم\n" + "🟢 من: $startLoc\n" + "🏁 إلى: $endLoc"; + + if (isHaveSteps == 'true') { + formattedBigText += "\n🛑 هذه الرحلة تحتوي على نقاط توقف!"; + } + + summaryText = 'سعر الرحلة: $price'; + } catch (e) { + print("Error formatting notification text: $e"); + } + + // ب) نمط النص الكبير (BigText) للأندرويد + BigTextStyleInformation bigTextStyleInformation = BigTextStyleInformation( + formattedBigText, + contentTitle: '🚖 $title', + summaryText: summaryText, + htmlFormatContent: true, + htmlFormatContentTitle: true, + ); + + // ج) معالجة اسم الصوت (أندرويد بدون امتداد، آيفون مع امتداد) + String soundNameAndroid = tone.contains('.') ? tone.split('.').first : tone; + String soundNameIOS = tone.contains('.') ? tone : "$tone.wav"; + + // د) إعدادات الأندرويد (الأزرار + Full Screen) + final androidDetails = AndroidNotificationDetails( + 'high_importance_channel', + 'High Importance Notifications', + importance: Importance.max, + priority: Priority.max, + fullScreenIntent: true, // يفتح الشاشة وتظهر التفاصيل + category: AndroidNotificationCategory.call, // يعامل كمكالمة (رنين مستمر) + visibility: NotificationVisibility.public, + ongoing: true, // يمنع الحذف بالسحب + sound: RawResourceAndroidNotificationSound(soundNameAndroid), + audioAttributesUsage: AudioAttributesUsage.alarm, // صوت عالٍ كالمنبه + styleInformation: bigTextStyleInformation, + color: const Color(0xFF1A252F), + + // الأزرار الثلاثة + actions: [ + const AndroidNotificationAction( + 'ACCEPT_ORDER', + '✅ قبول فوري', + showsUserInterface: true, + titleColor: Color(0xFF4CAF50), // أخضر + ), + const AndroidNotificationAction( + 'SHOW_DETAILS', + '📄 التفاصيل', + showsUserInterface: true, + titleColor: Color(0xFF2196F3), // أزرق + ), + const AndroidNotificationAction( + 'REJECT_ORDER', + '❌ رفض', + showsUserInterface: false, // لا يفتح التطبيق + cancelNotification: true, + titleColor: Color(0xFFE53935), // أحمر + ), + ], + ); + + // هـ) إعدادات الآيفون + final iosDetails = DarwinNotificationDetails( + sound: soundNameIOS, + presentAlert: true, + presentBadge: true, + presentSound: true, + categoryIdentifier: 'ORDER_CATEGORY', // ربط الأزرار + interruptionLevel: InterruptionLevel.critical, // محاولة لكسر الصامت + ); + + final details = + NotificationDetails(android: androidDetails, iOS: iosDetails); + + String briefBody = "$price - مسافة $formattedBigText"; + if (_getVal(jsonDecode(myListString), 20) == 'true') { + briefBody = "🛑 (متعددة التوقفات) $price - مسافة $formattedBigText"; + } + + // عرض الإشعار + await _flutterLocalNotificationsPlugin.show( + id: 1001, // ID ثابت لاستبدال الإشعار القديم + title: title, + body: briefBody, // نص مختصر يظهر في البار العلوي + notificationDetails: details, + payload: jsonEncode({ + 'type': 'Order', + 'data': myListString, + }), + ); + } + + // ============================================================================== + // 3. معالجة الاستجابة (عند الضغط على الأزرار) + // ============================================================================== + Future handleNotificationResponse(NotificationResponse response) async { + final payload = response.payload; + if (payload == null) return; + + final payloadData = jsonDecode(payload) as Map; + final rawData = payloadData['data']; + + List listData = []; + if (rawData is String) { + listData = jsonDecode(rawData); + } else if (rawData is List) { + listData = rawData; + } + + print("🔔 Notification Action: ${response.actionId}"); + + // أ) زر القبول + if (response.actionId == 'ACCEPT_ORDER') { + await _flutterLocalNotificationsPlugin.cancel(id: 1001); // حذف الإشعار + _processAcceptOrder(listData); + } + + // ب) زر التفاصيل + else if (response.actionId == 'SHOW_DETAILS') { + // await _flutterLocalNotificationsPlugin.cancel(1001); // اختياري: حذف الإشعار + Get.to(() => OrderRequestPage(), arguments: {'myListString': rawData}); + } + + // ج) زر الرفض + else if (response.actionId == 'REJECT_ORDER') { + await _flutterLocalNotificationsPlugin.cancel(id: 1001); // حذف الإشعار + _processRejectOrder(listData); + } + + // د) الضغط على الإشعار نفسه (بدون أزرار) + else { + Get.to(() => OrderRequestPage(), arguments: {'myListString': rawData}); + } + } + + // ============================================================================== + // 4. منطق القبول الآمن (Safe Accept Logic) + // ============================================================================== + Future _processAcceptOrder(List data) async { + // إظهار Loading + Get.dialog( + WillPopScope( + onWillPop: () async => false, + child: const Center( + child: CircularProgressIndicator(color: Colors.white), + ), + ), + barrierDismissible: false, + ); + + try { + final driverId = box.read(BoxName.driverID); + String orderId = _getVal(data, 16); + String passengerToken = _getVal(data, 9); + + print("🚀 Sending Accept Request for Order: $orderId"); + + var res = await CRUD().post( + link: "${AppLink.ride}/rides/acceptRide.php", + payload: { + 'id': orderId, + 'rideTimeStart': DateTime.now().toString(), + 'status': 'Apply', + 'passengerToken': passengerToken, + 'driver_id': driverId, + }, + ); + + print("📥 Server Response: $res"); + + if (Get.isDialogOpen == true) Get.back(); // إغلاق اللودينج + + // 🔴 فحص النتيجة بدقة (Map أو String) + bool isFailure = false; + if (res is Map && res['status'] == 'failure') { + isFailure = true; + } else if (res == 'failure') { + isFailure = true; + } + + if (isFailure) { + Get.defaultDialog( + title: "تنبيه", + middleText: "عذراً، الطلب أخذه سائق آخر.", + confirmTextColor: Colors.white, + onConfirm: () => Get.back(), + textConfirm: "حسناً", + ); + return; // توقف هنا ولا تكمل + } + + // ✅ نجاح -> تجهيز الانتقال + + // حماية من الكراش: التأكد من وجود HomeCaptainController + if (!Get.isRegistered()) { + print("♻️ Reviving HomeCaptainController..."); + Get.put(HomeCaptainController(), permanent: true); + } else { + Get.find().changeRideId(); + } + + box.write(BoxName.statusDriverLocation, 'on'); + box.write(BoxName.rideStatus, 'Apply'); + + var rideArgs = _buildRideArgs(data); + box.write(BoxName.rideArguments, rideArgs); + + // استخدام offAll لمنع الرجوع لصفحة الطلب + Get.offAll(() => PassengerLocationMapPage(), arguments: rideArgs); + } catch (e) { + if (Get.isDialogOpen == true) Get.back(); + print("❌ Error in accept process: $e"); + Get.snackbar("خطأ", "حدث خطأ غير متوقع"); + } + } + + // ============================================================================== + // 5. منطق الرفض (يعمل في الخلفية بدون فتح صفحات) + // ============================================================================== + Future _processRejectOrder(List data) async { + try { + final driverId = box.read(BoxName.driverID); + String orderId = _getVal(data, 16); + + if (driverId != null && orderId.isNotEmpty) { + print("📤 Rejecting Order: $orderId"); + await CRUD().post(link: AppLink.addDriverOrder, payload: { + 'driver_id': driverId, + 'order_id': orderId, + 'status': 'Refused' + }); + print("✅ Order Rejected Successfully"); + } + } catch (e) { + print("❌ Error rejecting order: $e"); + } + } + + // ============================================================================== + // 6. دوال مساعدة (Helpers) + // ============================================================================== + + Map _buildRideArgs(List data) { + return { + 'passengerLocation': '${_getVal(data, 0)},${_getVal(data, 1)}', + 'passengerDestination': '${_getVal(data, 3)},${_getVal(data, 4)}', + 'Duration': _getVal(data, 4), // انتبه: تأكد من الإندكس الصحيح للوقت + 'totalCost': _getVal(data, 26), + 'Distance': _getVal(data, 5), + 'name': _getVal(data, 8), + 'phone': _getVal(data, 10), + 'email': _getVal(data, 28), + 'WalletChecked': _getVal(data, 13), + 'tokenPassenger': _getVal(data, 9), + 'direction': + 'https://www.google.com/maps/dir/${_getVal(data, 0)}/${_getVal(data, 1)}/', + 'DurationToPassenger': _getVal(data, 15), + 'rideId': _getVal(data, 16), + 'passengerId': _getVal(data, 7), + 'driverId': _getVal(data, 18), + 'durationOfRideValue': _getVal(data, 19), + 'paymentAmount': _getVal(data, 2), + 'paymentMethod': _getVal(data, 13) == 'true' ? 'visa' : 'cash', + 'isHaveSteps': _getVal(data, 20), + 'step0': _getVal(data, 21), + 'step1': _getVal(data, 22), + 'step2': _getVal(data, 23), + 'step3': _getVal(data, 24), + 'step4': _getVal(data, 25), + 'passengerWalletBurc': _getVal(data, 26), + 'timeOfOrder': DateTime.now().toString(), + 'totalPassenger': _getVal(data, 2), + 'carType': _getVal(data, 31), + 'kazan': _getVal(data, 32), + 'startNameLocation': _getVal(data, 29), + 'endNameLocation': _getVal(data, 30), + }; + } + + String _getVal(List data, int index) { + if (data.length > index && data[index] != null) { + return data[index].toString(); + } + return ''; + } + + // Callbacks + void onDidReceiveNotificationResponse(NotificationResponse response) { + handleNotificationResponse(response); + } + + void onDidReceiveBackgroundNotificationResponse( + NotificationResponse response) { + handleNotificationResponse(response); + } + + // ============================================================================== + // 7. الدوال القديمة (Old Scheduled Notifications) - لم يتم تغييرها + // ============================================================================== + + void showNotification( + String title, String message, String tone, String payLoad) async { + // هذه الدالة القديمة للإشعارات البسيطة (ليس الطلبات) + BigTextStyleInformation bigTextStyleInformation = BigTextStyleInformation( + message, + contentTitle: title.tr, + htmlFormatContent: true, + htmlFormatContentTitle: true, + ); + AndroidNotificationDetails android = AndroidNotificationDetails( + 'high_importance_channel', + 'High Importance Notifications', + importance: Importance.max, + priority: Priority.high, + sound: RawResourceAndroidNotificationSound(tone.split('.').first), + ); + + DarwinNotificationDetails ios = const DarwinNotificationDetails( + sound: 'default', + presentAlert: true, + presentBadge: true, + presentSound: true, + ); + NotificationDetails details = + NotificationDetails(android: android, iOS: ios); + + await _flutterLocalNotificationsPlugin.show( + id: 0, + title: title, + body: message, + notificationDetails: details, + payload: jsonEncode({'title': title, 'data': payLoad})); + } + + void scheduleNotificationsForSevenDays( + String title, String message, String tone) async { + final AndroidNotificationDetails android = AndroidNotificationDetails( + 'high_importance_channel', + 'High Importance Notifications', + importance: Importance.max, + priority: Priority.high, + sound: RawResourceAndroidNotificationSound(tone.split('.').first), + ); + + const DarwinNotificationDetails ios = DarwinNotificationDetails( + sound: 'default', + presentAlert: true, + presentBadge: true, + presentSound: true, + ); + + final NotificationDetails details = + NotificationDetails(android: android, iOS: ios); + + if (Platform.isAndroid) { + if (await Permission.scheduleExactAlarm.isDenied) { + await Permission.scheduleExactAlarm.request(); + } + } + + for (int day = 0; day < 7; day++) { + final notificationTimes = [ + {'hour': 8, 'minute': 0, 'id': day * 1000 + 1}, + {'hour': 15, 'minute': 0, 'id': day * 1000 + 2}, + {'hour': 20, 'minute': 0, 'id': day * 1000 + 3}, + ]; + + for (var time in notificationTimes) { + final notificationId = time['id'] as int; + bool isScheduled = box.read('notification_$notificationId') ?? false; + + if (!isScheduled) { + await _scheduleNotificationForTime( + day, + time['hour'] as int, + time['minute'] as int, + title, + message, + details, + notificationId, + ); + box.write('notification_$notificationId', true); + } + } + } + } + +// ============================================================================== + // دالة حذف إشعار الطلب (تستدعى عند أخذ الطلب من سائق آخر) + // ============================================================================== + Future cancelOrderNotification() async { + // 1001 هو نفس الآيدي الذي استخدمناه عند عرض الإشعار + await _flutterLocalNotificationsPlugin.cancel(id: 1001); + print("🗑️ Order Notification Cancelled (Taken by another driver)"); + } + + Future _scheduleNotificationForTime( + int dayOffset, + int hour, + int minute, + String title, + String message, + NotificationDetails details, + int notificationId, + ) async { + tz.initializeTimeZones(); + var cairoLocation = + tz.getLocation('Africa/Cairo'); // تأكد من المنطقة الزمنية + + final now = tz.TZDateTime.now(cairoLocation); + tz.TZDateTime scheduledDate = tz.TZDateTime( + cairoLocation, + now.year, + now.month, + now.day + dayOffset, + hour, + minute, + ); + + if (scheduledDate.isBefore(now)) { + scheduledDate = scheduledDate.add(const Duration(days: 1)); + } + + await _flutterLocalNotificationsPlugin.zonedSchedule( + id: notificationId, + title: title, + body: message, + scheduledDate: scheduledDate, + notificationDetails: details, + androidScheduleMode: AndroidScheduleMode.exact, // أو exactAllowWhileIdle + matchDateTimeComponents: null, + ); + } +} diff --git a/siro_driver/lib/controller/firebase/notification_service.dart b/siro_driver/lib/controller/firebase/notification_service.dart new file mode 100644 index 0000000..9c8b340 --- /dev/null +++ b/siro_driver/lib/controller/firebase/notification_service.dart @@ -0,0 +1,63 @@ +import 'dart:convert'; +import 'package:http/http.dart' as http; +import 'package:get/get.dart'; // للترجمة .tr + +class NotificationService { + static const String _serverUrl = + 'https://api.intaleq.xyz/intaleq/ride/firebase/send_fcm.php'; + + static Future sendNotification({ + required String target, + required String title, + required String body, + required String category, // إلزامي للتصنيف + String? tone, + List? driverList, + bool isTopic = false, + }) async { + try { + // 1. تجهيز البيانات المخصصة (Data Payload) + Map customData = {}; + + customData['category'] = category; + + // إذا كان هناك قائمة سائقين/ركاب، نضعها هنا + if (driverList != null && driverList.isNotEmpty) { + // نرسلها كـ JSON String لأن FCM v1 يدعم String Values فقط في الـ data + customData['driverList'] = jsonEncode(driverList); + } + + // 2. تجهيز الطلب الرئيسي للسيرفر + final Map requestPayload = { + 'target': target, + 'title': title, + 'body': body, + 'isTopic': isTopic, + 'data': + customData, // 🔥🔥 التغيير الجوهري: وضعنا البيانات داخل "data" 🔥🔥 + }; + + if (tone != null) { + requestPayload['tone'] = tone; + } + + final response = await http.post( + Uri.parse(_serverUrl), + headers: { + 'Content-Type': 'application/json; charset=UTF-8', + }, + body: jsonEncode(requestPayload), + ); + + if (response.statusCode == 200) { + print('✅ Notification sent successfully.'); + // print('Response: ${response.body}'); + } else { + print('❌ Failed to send notification. Code: ${response.statusCode}'); + print('Error Body: ${response.body}'); + } + } catch (e) { + print('❌ Error sending notification: $e'); + } + } +} diff --git a/siro_driver/lib/controller/firebase/order_lay.dart b/siro_driver/lib/controller/firebase/order_lay.dart new file mode 100755 index 0000000..1af9bb7 --- /dev/null +++ b/siro_driver/lib/controller/firebase/order_lay.dart @@ -0,0 +1,35 @@ +import 'package:siro_driver/constant/links.dart'; +import 'package:siro_driver/controller/functions/crud.dart'; +import 'package:siro_driver/views/home/Captin/home_captain/home_captin.dart'; +import 'package:siro_driver/views/widgets/elevated_btn.dart'; +import 'package:flutter/material.dart'; + +class OverlayContent1 extends StatelessWidget { + @override + Widget build(BuildContext context) { + return Material( + child: Container( + padding: EdgeInsets.all(16.0), + color: Colors.white, + child: MyElevatedButton( + title: 'go to order', + onPressed: () async { + var res = await CRUD().post( + link: AppLink.addFeedBack, + payload: { + "passengerId": 'dddddd', + "feedBack": "eeeee", + }, + ); + print(res); + if (res != 'failure') { + Navigator.push( + context, MaterialPageRoute(builder: (cont) => HomeCaptain())); + // Get.to(OrderRequestPage()); + } + }, + ), + ), + ); + } +} diff --git a/siro_driver/lib/controller/functions/add_error.dart b/siro_driver/lib/controller/functions/add_error.dart new file mode 100755 index 0000000..5c4661e --- /dev/null +++ b/siro_driver/lib/controller/functions/add_error.dart @@ -0,0 +1,32 @@ +import '../../constant/box_name.dart'; +import '../../constant/links.dart'; +import '../../main.dart'; +import 'crud.dart'; + +addError1(String error, String details, String where) async { + try { + // Get user information for the error log + final userId = box.read(BoxName.driverID) ?? box.read(BoxName.passengerID); + final userType = + box.read(BoxName.driverID) != null ? 'Driver' : 'passenger'; + final phone = box.read(BoxName.phone) ?? box.read(BoxName.phoneDriver); + + // Send the error data to the server + // Note: This is a fire-and-forget call. We don't await it or handle its response + // to prevent an infinite loop if the addError endpoint itself is failing. + CRUD().post( + link: AppLink.addError, + payload: { + 'error': error.toString(), + 'userId': userId.toString(), + 'userType': userType, + 'phone': phone.toString(), + 'device': where, // The location of the error + 'details': details, // The detailed stack trace or context + }, + ); + } catch (e) { + // If logging the error itself fails, print to the console to avoid infinite loops. + print("Failed to log error to server: $e"); + } +} diff --git a/siro_driver/lib/controller/functions/app_update_controller.dart b/siro_driver/lib/controller/functions/app_update_controller.dart new file mode 100644 index 0000000..cc2347c --- /dev/null +++ b/siro_driver/lib/controller/functions/app_update_controller.dart @@ -0,0 +1,92 @@ +import 'package:flutter/material.dart'; +import 'package:get/get.dart'; +import 'package:package_info_plus/package_info_plus.dart'; +import 'package:url_launcher/url_launcher.dart'; +import 'dart:io'; +import 'dart:convert'; + +import '../../constant/info.dart'; +import '../../constant/links.dart'; +import '../../constant/colors.dart'; +import '../../print.dart'; +import 'crud.dart'; + +class AppUpdateController extends GetxController { + @override + void onInit() { + super.onInit(); + // الفحص التلقائي عند التشغيل لتحديثات المتجر + checkSmartUpdate(); + } + + // ====================================================================== + // الدالة الذكية المدمجة (الآن تفحص المتجر فقط لأن Shorebird يعمل تلقائياً بالخلفية) + // ====================================================================== + Future checkSmartUpdate() async { + Log.print("🔄 بدء فحص تحديثات المتجر..."); + + // 1. فحص تحديث المتجر (Native Update) + await _checkStoreUpdate(); + } + + // ====================================================================== + // 1. تحديث المتجر الأساسي + // ====================================================================== + Future _checkStoreUpdate() async { + try { + final packageInfo = await PackageInfo.fromPlatform(); + final currentBuildNumber = packageInfo.buildNumber; + + // استخدام نفس الـ Endpoint والمعايير الموجودة في التطبيق + var response = await CRUD().get(link: AppLink.packageInfo, payload: { + "platform": Platform.isAndroid ? 'android' : 'ios', + "appName": AppInformation.appVersion, + }); + + if (response != 'failure') { + var decoded = jsonDecode(response); + if (decoded['status'] == 'success' && decoded['message'] != null && decoded['message'].isNotEmpty) { + String latestBuildNumber = decoded['message'][0]['version'].toString(); + + // مقارنة الـ Build Number + if (latestBuildNumber != currentBuildNumber) { + _showStoreUpdateDialog(); + return true; + } + } + } + } catch (e) { + Log.print("❌ Store update check error: $e"); + } + return false; + } + + // ====================================================================== + // دوال مساعدة + // ====================================================================== + + void _showStoreUpdateDialog() { + final String storeUrl = Platform.isAndroid + ? 'https://play.google.com/store/apps/details?id=com.intaleq_driver' + : 'https://apps.apple.com/jo/app/intaleq-driver/id6482995159'; + + Get.defaultDialog( + title: "تحديث جديد متوفر".tr, + middleText: "يوجد إصدار جديد من التطبيق في المتجر، يرجى التحديث للحصول على الميزات الجديدة.".tr, + barrierDismissible: false, + onWillPop: () async => false, + confirm: ElevatedButton( + style: ElevatedButton.styleFrom( + backgroundColor: AppColor.primaryColor, + shape: RoundedRectangleBorder(borderRadius: BorderRadius.circular(10)) + ), + onPressed: () async { + if (await canLaunchUrl(Uri.parse(storeUrl))) { + await launchUrl(Uri.parse(storeUrl), mode: LaunchMode.externalApplication); + } + }, + child: Text("تحديث الآن".tr, style: const TextStyle(color: Colors.white)), + ), + ); + } +} diff --git a/siro_driver/lib/controller/functions/audio_controller.dart b/siro_driver/lib/controller/functions/audio_controller.dart new file mode 100755 index 0000000..feddaa0 --- /dev/null +++ b/siro_driver/lib/controller/functions/audio_controller.dart @@ -0,0 +1,44 @@ +import 'package:flutter/material.dart'; +import 'package:just_audio/just_audio.dart'; +import 'package:get/get.dart'; + +class AudioController extends GetxController { + final AudioPlayer _audioPlayer = AudioPlayer(); + + Future playAudio() async { + // Check if the platform is Android + if (Theme.of(Get.context!).platform == TargetPlatform.android) { + try { + // Load the audio file from the raw resources + await _audioPlayer.setAsset( + 'assets/order1.wav'); // Adjust the path based on your project structure + _audioPlayer.play(); + } catch (e) { + // Handle errors, such as file not found + print('Error playing audio: $e'); + } + } + } + + Future playAudio1(String path) async { + // Check if the platform is Android + // if (Theme.of(Get.context!).platform == TargetPlatform.android) { + try { + // Load the audio file from the raw resources + await _audioPlayer + .setAsset(path); // Adjust the path based on your project structure + _audioPlayer.play(); + } catch (e) { + // Handle errors, such as file not found + print('Error playing audio: $e'); + } + // } + } + + @override + void onClose() { + // Release resources when done + _audioPlayer.dispose(); + super.onClose(); + } +} diff --git a/siro_driver/lib/controller/functions/audio_recorder_controller.dart b/siro_driver/lib/controller/functions/audio_recorder_controller.dart new file mode 100644 index 0000000..c8c802e --- /dev/null +++ b/siro_driver/lib/controller/functions/audio_recorder_controller.dart @@ -0,0 +1,80 @@ +import 'dart:io'; +import 'package:path_provider/path_provider.dart'; +import 'package:get/get.dart'; +import 'package:just_audio/just_audio.dart'; +import 'package:record/record.dart'; + +class AudioRecorderController extends GetxController { + AudioPlayer audioPlayer = AudioPlayer(); + AudioRecorder recorder = AudioRecorder(); + + bool isRecording = false; + bool isPlaying = false; + bool isPaused = false; + String filePath = ''; + String? selectedFilePath; + double currentPosition = 0; + double totalDuration = 0; + + // Start recording + Future startRecording({String? rideId}) async { + final bool isPermissionGranted = await recorder.hasPermission(); + if (!isPermissionGranted) { + return; + } + + final directory = await getApplicationDocumentsDirectory(); + final String dateStr = + '${DateTime.now().year}-${DateTime.now().month.toString().padLeft(2, '0')}-${DateTime.now().day.toString().padLeft(2, '0')}'; + // Generate a unique file name + String fileName = (rideId != null && rideId.isNotEmpty && rideId != 'yet' && rideId != 'null') + ? '${dateStr}_$rideId.m4a' + : '$dateStr.m4a'; + filePath = '${directory.path}/$fileName'; + + const config = RecordConfig( + encoder: AudioEncoder.aacLc, + sampleRate: 44100, + bitRate: 128000, + ); + + await recorder.start(config, path: filePath); + + isRecording = true; + update(); + } + + // Stop recording + Future stopRecording() async { + await recorder.stop(); + isRecording = false; + isPaused = false; + update(); + } + + // Get a list of recorded files + Future> getRecordedFiles() async { + final directory = await getApplicationDocumentsDirectory(); + final files = await directory.list().toList(); + return files + .map((file) => file.path) + .where((path) => path.endsWith('.m4a')) + .toList(); + } + + // Delete a specific recorded file + Future deleteRecordedFile(String filePath) async { + final file = File(filePath); + if (await file.exists()) { + await file.delete(); + update(); + } + } + + @override + void onClose() { + audioPlayer.dispose(); + recorder.dispose(); + super.onClose(); + } +} diff --git a/siro_driver/lib/controller/functions/background_service.dart b/siro_driver/lib/controller/functions/background_service.dart new file mode 100644 index 0000000..e112b36 --- /dev/null +++ b/siro_driver/lib/controller/functions/background_service.dart @@ -0,0 +1,225 @@ +import 'dart:async'; +import 'dart:convert'; +import 'dart:ui'; +import 'dart:io'; +import 'package:flutter/material.dart'; +import 'package:flutter_background_service/flutter_background_service.dart'; +import 'package:flutter_local_notifications/flutter_local_notifications.dart'; +import 'package:flutter_overlay_window/flutter_overlay_window.dart'; +import 'package:socket_io_client/socket_io_client.dart' as IO; +import 'package:flutter_overlay_window/flutter_overlay_window.dart' as Overlay; +import 'package:get_storage/get_storage.dart'; +import 'package:geolocator/geolocator.dart' as geo; +import '../../constant/box_name.dart'; +import '../firebase/local_notification.dart'; + +const String notificationChannelId = 'driver_service_channel'; +const int notificationId = 888; +const String notificationIcon = '@mipmap/launcher_icon'; + +@pragma('vm:entry-point') +Future onStart(ServiceInstance service) async { + DartPluginRegistrant.ensureInitialized(); + + final FlutterLocalNotificationsPlugin flutterLocalNotificationsPlugin = + FlutterLocalNotificationsPlugin(); + + await GetStorage.init(); + final box = GetStorage(); + + IO.Socket? socket; + String driverId = box.read(BoxName.driverID) ?? ''; + String token = box.read(BoxName.tokenDriver) ?? ''; + + if (driverId.isNotEmpty) { + socket = IO.io( + 'https://location.intaleq.xyz', + IO.OptionBuilder() + .setTransports(['websocket']) + .disableAutoConnect() + .setQuery({ + 'driver_id': driverId, + 'token': token, + 'EIO': '3', // توافقية مع Workerman + }) + .setReconnectionAttempts(double.infinity) + .build()); + + socket.connect(); + + socket.onConnect((_) { + print("✅ Background Service: Socket Connected! ID: ${socket?.id}"); + if (service is AndroidServiceInstance) { + flutterLocalNotificationsPlugin.show( + id: notificationId, + title: 'أنت متصل الآن', + body: 'بانتظار الطلبات...', + notificationDetails: const NotificationDetails( + android: AndroidNotificationDetails( + notificationChannelId, + 'خدمة السائق', + icon: notificationIcon, + ongoing: true, + importance: Importance.low, + priority: Priority.low, + ), + ), + ); + } + }); + + socket.on('new_ride_request', (data) async { + print("🔔 Background Service: Received new_ride_request"); + + // 🔥 قراءة حالة التطبيق مباشرة قبل العرض + await GetStorage.init(); // تأكد من تحديث البيانات + final box = GetStorage(); + bool isAppInForeground = box.read(BoxName.isAppInForeground) ?? false; + + // 🔥 Check إضافي: هل الـ Overlay مفتوح بالفعل؟ (للأندرويد فقط) + bool overlayActive = false; + if (Platform.isAndroid) { + overlayActive = await Overlay.FlutterOverlayWindow.isActive(); + } + + if (isAppInForeground || overlayActive) { + print("🛑 App is FOREGROUND or Overlay already shown. Skipping."); + return; + } + + // عرض الـ Overlay (للأندرويد فقط) + if (Platform.isAndroid) { + print("🚀 App is BACKGROUND. Showing Overlay..."); + try { + await Overlay.FlutterOverlayWindow.showOverlay( + enableDrag: true, + overlayTitle: "طلب جديد", + overlayContent: "لديك طلب جديد وصل للتو!", + flag: OverlayFlag.focusPointer, + positionGravity: PositionGravity.auto, + height: WindowSize.matchParent, + width: WindowSize.matchParent, + startPosition: const OverlayPosition(0, -30), + ); + await Overlay.FlutterOverlayWindow.shareData(data); + } catch (e) { + print("Overlay Error: $e"); + } + } else if (Platform.isIOS) { + // على iOS، نظهر إشعاراً عادياً لأن الـ Overlay غير موجود + flutterLocalNotificationsPlugin.show( + id: 1002, + title: "طلب رحلة جديد 🚖", + body: "لديك طلب رحلة جديد، افتح التطبيق للموافقة عليه", + notificationDetails: const NotificationDetails( + iOS: DarwinNotificationDetails( + presentAlert: true, + presentBadge: true, + presentSound: true, + ), + ), + payload: jsonEncode(data)); + } + }); + } + + service.on('stopService').listen((event) { + socket?.clearListeners(); + socket?.dispose(); + service.stopSelf(); + }); + + // 🔥 Location management in background isolate (Using Geolocator) + geo.Position? latestPos; + + // Listen to location changes continuously in the background + geo.Geolocator.getPositionStream( + locationSettings: geo.AndroidSettings( + accuracy: geo.LocationAccuracy.high, + distanceFilter: 10, + intervalDuration: const Duration(seconds: 10), + ), + ).listen((pos) { + latestPos = pos; + }); + + // 🔥 MERCY HEARTBEAT: Send location every 2 minutes to keep driver active in 'raids' + Timer.periodic(const Duration(minutes: 2), (timer) async { + if (socket != null && socket.connected && latestPos != null) { + try { + socket.emit('update_location', { + 'driver_id': driverId, + 'lat': latestPos!.latitude, + 'lng': latestPos!.longitude, + 'heading': latestPos!.heading, + 'speed': latestPos!.speed * 3.6, + 'status': box.read(BoxName.statusDriverLocation) ?? 'on', + 'source': 'background_heartbeat' + }); + print( + "💓 Background Mercy Heartbeat Sent: ${latestPos!.latitude}, ${latestPos!.longitude}"); + } catch (e) { + print("❌ Background Heartbeat Error: $e"); + } + } + }); + + Timer.periodic(const Duration(seconds: 30), (timer) async { + if (service is AndroidServiceInstance) { + if (await service.isForegroundService()) { + flutterLocalNotificationsPlugin.show( + id: notificationId, + title: 'خدمة السائق نشطة', + body: 'بانتظار الطلبات...', + notificationDetails: const NotificationDetails( + android: AndroidNotificationDetails( + notificationChannelId, + 'خدمة السائق', + icon: notificationIcon, + ongoing: true, + importance: Importance.low, + priority: Priority.low, + ), + ), + ); + } + } + }); + + return true; +} + +class BackgroundServiceHelper { + static Future initialize() async { + final service = FlutterBackgroundService(); + + await service.configure( + androidConfiguration: AndroidConfiguration( + onStart: onStart, + autoStart: false, + isForegroundMode: true, + notificationChannelId: notificationChannelId, + initialNotificationTitle: 'تطبيق السائق', + initialNotificationContent: 'تجهيز الخدمة...', + foregroundServiceNotificationId: notificationId, + ), + iosConfiguration: IosConfiguration( + autoStart: false, + onForeground: onStart, + onBackground: onStart, + ), + ); + } + + static Future startService() async { + final service = FlutterBackgroundService(); + if (!await service.isRunning()) { + await service.startService(); + } + } + + static Future stopService() async { + final service = FlutterBackgroundService(); + service.invoke("stopService"); + } +} diff --git a/siro_driver/lib/controller/functions/battery_status.dart b/siro_driver/lib/controller/functions/battery_status.dart new file mode 100644 index 0000000..a47470a --- /dev/null +++ b/siro_driver/lib/controller/functions/battery_status.dart @@ -0,0 +1,39 @@ +import 'package:battery_plus/battery_plus.dart'; +import 'package:flutter/material.dart'; +import 'package:get/get.dart'; + +class BatteryNotifier { + static final Battery _battery = Battery(); + static int? _lastNotifiedLevel; + + static Future checkBatteryAndNotify() async { + try { + final int batteryLevel = await _battery.batteryLevel; + + // ✅ لا تكرر الإشعار إذا الفرق قليل + if (_lastNotifiedLevel != null && + (batteryLevel >= _lastNotifiedLevel! - 2)) return; + + if (batteryLevel <= 30) { + Color backgroundColor = Colors.yellow; + if (batteryLevel <= 20) { + backgroundColor = Colors.red; + } + + Get.snackbar( + "⚠️ تنبيه البطارية", // العنوان + "مستوى البطارية: $batteryLevel٪", // النص + snackPosition: SnackPosition.TOP, + backgroundColor: backgroundColor, + colorText: Colors.white, + duration: const Duration(seconds: 10), // مدة الظهور + margin: const EdgeInsets.all(10), + ); + + _lastNotifiedLevel = batteryLevel; + } + } catch (e) { + print('Battery check error: $e'); + } + } +} diff --git a/siro_driver/lib/controller/functions/call_controller.dart b/siro_driver/lib/controller/functions/call_controller.dart new file mode 100755 index 0000000..e310f0e --- /dev/null +++ b/siro_driver/lib/controller/functions/call_controller.dart @@ -0,0 +1,129 @@ +// import 'package:SEFER/constant/api_key.dart'; +// import 'package:SEFER/controller/functions/crud.dart'; +// // import 'package:agora_rtc_engine/agora_rtc_engine.dart'; +// import 'package:get/get.dart'; +// import 'package:permission_handler/permission_handler.dart'; + +// import '../../constant/box_name.dart'; +// import '../firebase/firbase_messge.dart'; +// import '../home/captin/map_driver_controller.dart'; +// import '../../main.dart'; + +// class CallController extends GetxController { +// String channelName = ''; // Get.find().rideId; +// String token = ''; +// // int uid = int.parse(box.read(BoxName.phoneDriver)); // uid of the local user +// int uid = 0; +// int? remoteUid; // uid of the remote user +// bool _isJoined = false; // Indicates if the local user has joined the channel +// String status = ''; +// // late RtcEngine agoraEngine; // Agora engine instance + +// @override +// void onInit() { +// super.onInit(); + +// channelName = Get.find().rideId; // 'sefer300'; // +// remoteUid = int.parse(Get.find().passengerPhone); +// uid = int.parse(box.read(BoxName.phoneDriver)); + +// initAgoraFull(); +// } + +// initAgoraFull() async { +// await fetchToken(); +// // Set up an instance of Agora engine +// setupVoiceSDKEngine(); +// // join(); +// FirebaseMessagesController().sendNotificationToPassengerTokenCALL( +// 'Call Income', +// '${'You have call from driver'.tr} ${box.read(BoxName.nameDriver)}', +// Get.find().tokenPassenger, +// [ +// token, +// channelName, +// uid.toString(), +// remoteUid.toString(), +// ], +// ); +// join(); +// } + +// @override +// void onClose() { +// // agoraEngine.leaveChannel(); +// super.onClose(); +// } + +// // Future setupVoiceSDKEngine() async { +// // // retrieve or request microphone permission +// // await [Permission.microphone].request(); + +// // //create an instance of the Agora engine +// // agoraEngine = createAgoraRtcEngine(); +// // await agoraEngine.initialize(RtcEngineContext(appId: AK.agoraAppId)); +// // // Register the event handler +// // agoraEngine.registerEventHandler( +// // RtcEngineEventHandler( +// // onJoinChannelSuccess: (RtcConnection connection, int elapsed) { +// // // Get.snackbar( +// // // "Local user uid:${connection.localUid} joined the channel", ''); +// // status = 'joined'.tr; +// // _isJoined = true; +// // update(); +// // }, +// // onUserJoined: (RtcConnection connection, int remoteUid, int elapsed) { +// // // Get.snackbar("Remote user uid:$remoteUid joined the channel", ''); +// // status = '${Get.find().passengerName} ' +// // 'joined' +// // .tr; +// // remoteUid = remoteUid; +// // update(); +// // }, +// // onUserOffline: (RtcConnection connection, int? remoteUid, +// // UserOfflineReasonType reason) { +// // // Get.snackbar("Remote user uid:$remoteUid left the channel", ''); +// // status = 'Call Left'.tr; +// // remoteUid = null; +// // update(); +// // }, +// // ), +// // ); +// // } + +// // void join() async { +// // // Set channel options including the client role and channel profile +// // ChannelMediaOptions options = const ChannelMediaOptions( +// // clientRoleType: ClientRoleType.clientRoleBroadcaster, +// // channelProfile: ChannelProfileType.channelProfileCommunication, +// // ); + +// // await agoraEngine.joinChannel( +// // token: token, +// // channelId: channelName, +// // options: options, +// // uid: uid, +// // ); +// // } + +// // void leave() { +// // _isJoined = false; +// // remoteUid = null; +// // update(); +// // agoraEngine.leaveChannel(); +// // } + +// // // Clean up the resources when you leave +// // @override +// // void dispose() async { +// // await agoraEngine.leaveChannel(); +// // super.dispose(); +// // } + +// fetchToken() async { +// var res = await CRUD() +// .getAgoraToken(channelName: channelName, uid: uid.toString()); +// token = res; +// update(); +// } +// } diff --git a/siro_driver/lib/controller/functions/camer_controller.dart b/siro_driver/lib/controller/functions/camer_controller.dart new file mode 100755 index 0000000..1f254d0 --- /dev/null +++ b/siro_driver/lib/controller/functions/camer_controller.dart @@ -0,0 +1,238 @@ +/* +import 'dart:convert'; +import 'dart:io'; + +import 'package:camera/camera.dart'; +import 'package:get/get.dart'; +// import 'package:google_mlkit_text_recognition/google_mlkit_text_recognition.dart'; +import 'package:siro_driver/constant/box_name.dart'; +import 'package:siro_driver/constant/links.dart'; +import 'package:siro_driver/views/widgets/elevated_btn.dart'; +import 'package:path_provider/path_provider.dart' as path_provider; +import 'package:path/path.dart' as path; +import 'package:http/http.dart' as http; +import '../../main.dart'; + +class CameraClassController extends GetxController { + late CameraController cameraController; + late List cameras; + bool isCameraInitialized = false; + // final TextRecognizer _textRecognizer = TextRecognizer(); + String? scannedText; + bool isloading = false; + + @override + void onInit() { + super.onInit(); + initializeCamera(); + } + + Future initializeCamera() async { + try { + cameras = await availableCameras(); + //update(); + cameraController = CameraController( + cameras[0], + ResolutionPreset.medium, + enableAudio: false, + ); + await cameraController.initialize(); + isCameraInitialized = true; + update(); + } catch (e) { + if (e is CameraException) { + switch (e.code) { + case 'CameraAccessDenied': + Get.defaultDialog( + title: 'Camera Access Denied.'.tr, + middleText: '', + confirm: + MyElevatedButton(title: 'Open Settings'.tr, onPressed: () {}), + ); + break; + default: + // Handle other errors here. + break; + } + } + } + } + + var imgUrl = ''; + Future extractCardId() async { + // Construct the path for the image file + final directory = await path_provider.getTemporaryDirectory(); + final imagePath = + path.join(directory.path, '${box.read(BoxName.driverID)}.png'); + + // Capture the image and save it to the specified path + final XFile capturedImage = await cameraController.takePicture(); + + // Move the captured image to the desired path + await capturedImage.saveTo(imagePath); + await uploadImage(File(capturedImage.path)); + + extractByAPI('${AppLink.server}/card_image/' + box.read(BoxName.driverID)); + } + + Future extractByAPI(String imgUrl) async { + var headers = {'apikey': 'K89368168788957'}; + var request = http.MultipartRequest( + 'POST', Uri.parse('https://api.ocr.space/parse/image')); + request.fields.addAll({ + 'language': 'ara', + 'isOverlayRequired': 'false', + 'url': imgUrl, + 'iscreatesearchablepdf': 'false', + 'issearchablepdfhidetextlayer': 'false' + }); + + request.headers.addAll(headers); + + http.StreamedResponse response = await request.send(); + + if (response.statusCode == 200) { + } else {} + } + + Future uploadImage(File imageFile) async { + String? basicAuthCredentials = + await storage.read(key: BoxName.basicAuthCredentials); + var request = http.MultipartRequest( + 'POST', + Uri.parse(AppLink.uploadImage), + ); + + // Attach the image file to the request + request.files.add( + await http.MultipartFile.fromPath('image', imageFile.path), + ); // Add the headers to the request + request.headers.addAll({ + "Content-Type": "application/x-www-form-urlencoded", + 'Authorization': + 'Basic ${base64Encode(utf8.encode(basicAuthCredentials.toString()))}', + }); + + // Add the driverID to the request + request.fields['driverID'] = box.read(BoxName.driverID); + // Send the request + var response = await request.send(); + + // Read the response + var responseData = await response.stream.toBytes(); + var responseString = String.fromCharCodes(responseData); + scannedText = responseString; + update(); + // Return the link received from the server + return responseString; + } + + // Future takePictureAndMLGoogleScan() async { + // try { + // // Construct the path for the image file + // final directory = await path_provider.getTemporaryDirectory(); + // final imagePath = + // path.join(directory.path, '${box.read(BoxName.driverID)}.png'); + + // // Capture the image and save it to the specified path + // final XFile capturedImage = await cameraController.takePicture(); + + // // Move the captured image to the desired path + // await capturedImage.saveTo(imagePath); + + // // Recognize the text in the image + // final InputImage inputImage = + // InputImage.fromFile(File(capturedImage.path)); + // final RecognizedText recognizedText = + // await _textRecognizer.processImage(inputImage); + // scannedText = recognizedText.text; + + // // Extract the scanned text line by line + // final List> lines = []; + // for (var i = 0; i < recognizedText.blocks.length; i++) { + // lines.add({ + // 'line_number': i, + // 'text': recognizedText.blocks[i].text, + // }); + // } + + // // Convert the list of lines to a JSON string + // final String jsonOutput = jsonEncode(lines); + + // update(); + + // // Print the JSON output + + // // Get.back(); + // } catch (e) {} + // } + + String getTextAsJSON(String text) { + final lines = text.split('\n'); + final jsonList = lines.map((line) { + return { + 'line_text': line, + 'num_words': line.trim().split(' ').length, + }; + }).toList(); + + final json = { + 'lines': jsonList, + 'num_lines': lines.length, + }; + + return jsonEncode(json); + } + + List getTextBlocks(String text) { + return text.split('\n'); + } + +// Future takePictureAndTesseractScan() async { +// try { +// // Construct the path for the image file +// final directory = await path_provider.getTemporaryDirectory(); +// final imagePath = +// path.join(directory.path, '${box.read(BoxName.driverID)}.png'); + +// // Capture the image and save it to the specified path +// final XFile capturedImage = await cameraController.takePicture(); + +// // Move the captured image to the desired path +// await capturedImage.saveTo(imagePath); + +// // Recognize the text in the image +// final languages = [ +// 'eng', +// 'ara' +// ]; // Specify the languages you want to use for text extraction + +// final text = await FlutterTesseractOcr.extractText(imagePath, +// language: languages.join('+'), // Combine multiple languages with '+' +// args: { +// "psm": "4", +// "preserve_interword_spaces": "1", +// // "rectangle": const Rect.fromLTWH(100, 100, 200, 200), +// } // Additional options if needed +// ); +// isloading = false; +// final jsonText = getTextAsJSON(text); +// final textBlocks = getTextBlocks(text); +// update(); +// scannedText = +// textBlocks.toString(); // Convert the extracted text to JSON. + +// // Print the JSON to the console. +// update(); +// } catch (e) { +// scannedText = ''; +// } +// } + + @override + void onClose() { + cameraController.dispose(); + super.onClose(); + } +} +*/ diff --git a/siro_driver/lib/controller/functions/crud.dart b/siro_driver/lib/controller/functions/crud.dart new file mode 100755 index 0000000..830c030 --- /dev/null +++ b/siro_driver/lib/controller/functions/crud.dart @@ -0,0 +1,736 @@ +import 'dart:async'; +import 'dart:convert'; +import 'dart:io'; +import 'package:siro_driver/controller/functions/encrypt_decrypt.dart'; +import 'package:siro_driver/controller/functions/network/net_guard.dart'; +import 'package:siro_driver/constant/box_name.dart'; +import 'package:siro_driver/constant/links.dart'; +import 'package:siro_driver/controller/auth/captin/login_captin_controller.dart'; +import 'package:siro_driver/main.dart'; +import 'package:get/get.dart'; +import 'package:http/http.dart' as http; +import 'package:siro_driver/env/env.dart'; +import 'package:siro_driver/print.dart'; + +import '../../constant/api_key.dart'; +import '../../views/widgets/error_snakbar.dart'; +import 'gemeni.dart'; +import 'upload_image.dart'; + +class CRUD { + final NetGuard _netGuard = NetGuard(); + + static bool _isRefreshingJWT = false; + static String _lastErrorSignature = ''; + static DateTime _lastErrorTimestamp = DateTime(2000); + static const Duration _errorLogDebounceDuration = Duration(minutes: 1); + + // ── فحص صلاحية JWT بدون مكتبات خارجية ────────────────────── + static bool _isJwtValid(String? token) { + if (token == null || token.isEmpty) return false; + try { + final parts = token.split('.'); + if (parts.length != 3) return false; + // فك تشفير الـ payload (الجزء الثاني) + String payload = parts[1]; + // إضافة padding للـ base64 + switch (payload.length % 4) { + case 2: payload += '=='; break; + case 3: payload += '='; break; + } + final decoded = jsonDecode(utf8.decode(base64Url.decode(payload))); + final exp = decoded['exp']; + if (exp == null) return false; + // نعتبر التوكن منتهي قبل 30 ثانية من انتهاء الصلاحية (buffer) + return DateTime.now().millisecondsSinceEpoch < (exp * 1000 - 30000); + } catch (_) { + return false; + } + } + + static Future addError( + String error, String details, String where) async { + try { + final currentErrorSignature = '$where-$error'; + final now = DateTime.now(); + + if (currentErrorSignature == _lastErrorSignature && + now.difference(_lastErrorTimestamp) < _errorLogDebounceDuration) { + return; + } + + _lastErrorSignature = currentErrorSignature; + _lastErrorTimestamp = now; + + final userId = + box.read(BoxName.driverID) ?? box.read(BoxName.passengerID); + final userType = + box.read(BoxName.driverID) != null ? 'Driver' : 'Passenger'; + final phone = box.read(BoxName.phone) ?? box.read(BoxName.phoneDriver); + + CRUD().post( + link: AppLink.addError, + payload: { + 'error': error.toString(), + 'userId': userId.toString(), + 'userType': userType, + 'phone': phone.toString(), + 'device': where, + 'details': details, + }, + ); + } catch (e) {} + } + + // ───────────────────────────────────────────────────────────── + // دالة مساعدة: يجيب البصمة المشفرة من GetStorage + // نفس القيمة المرسلة عند login وعُملها hash في JWT + // السيرفر يتحقق: sha256(X-Device-FP + FP_PEPPER) == JWT.fingerPrint + // ───────────────────────────────────────────────────────────── + String _getFpHeader() { + return box.read(BoxName.deviceFingerprint)?.toString() ?? ''; + } + + // ═══════════════════════════════════════════════════════════════ + // _makeRequest — دالة مركزية لكل الطلبات + // ─────────────────────────────────────────────────────────────── + // Retry logic للشبكات الضعيفة (سوريا): + // • 3 محاولات لأخطاء الشبكة (SocketException / TimeoutException) + // • انتظار 1 ثانية بين المحاولات لأخطاء SocketException + // • بدون انتظار لأخطاء Timeout (نعيد فوراً) + // ═══════════════════════════════════════════════════════════════ + Future _makeRequest({ + required String link, + Map? payload, + required Map headers, + }) async { + // timeouts مرتفعة مناسبة للإنترنت الضعيف في سوريا + const totalTimeout = Duration(seconds: 60); + + Future doPost() { + final url = Uri.parse(link); + return http + .post(url, body: payload, headers: headers) + .timeout(totalTimeout); + } + + http.Response? response; + int attempts = 0; + final requestId = DateTime.now().millisecondsSinceEpoch.toString().substring(7); + + Log.print('🚀 [REQ-$requestId] $link'); + if (payload != null) Log.print('📦 [PAYLOAD-$requestId] $payload'); + + while (attempts < 3) { + try { + attempts++; + response = await doPost(); + break; // نجح الاتصال — نخرج + } on SocketException catch (_) { + Log.print('⚠️ SocketException attempt $attempts — $link'); + if (attempts >= 3) { + _netGuard.notifyOnce((title, msg) => mySnackeBarError(msg)); + return 'no_internet'; + } + // انتظار قبل إعادة المحاولة — مهم للشبكات المتقطعة + await Future.delayed(const Duration(seconds: 1)); + } on TimeoutException catch (_) { + Log.print('⚠️ TimeoutException attempt $attempts — $link'); + if (attempts >= 3) return 'failure'; + // لا انتظار — نعيد فوراً + } catch (e) { + // errno = 9 (Bad file descriptor) — إعادة المحاولة + if (e.toString().contains('errno = 9') && attempts < 3) { + await Future.delayed(const Duration(milliseconds: 500)); + continue; + } + addError( + 'HTTP Exception: $e', 'Try: $attempts', 'CRUD._makeRequest $link'); + return 'failure'; + } + } + + // لو كل المحاولات فشلت بدون response + if (response == null) return 'failure'; + + final sc = response.statusCode; + final body = response.body; + + Log.print('📥 [RES-$requestId] [$sc] $link'); + Log.print('📄 [BODY-$requestId] $body'); + + // 2xx + if (sc >= 200 && sc < 300) { + try { + return jsonDecode(body); + } catch (e, st) { + addError( + 'JSON Decode Error', 'Body: $body\n$st', 'CRUD._makeRequest $link'); + return 'failure'; + } + } + + // 401 → تجديد التوكن (مع حماية من الحلقة اللانهائية) + if (sc == 401) { + // تخطي تجديد التوكن لـ endpoints غير حرجة (مثل تسجيل الأخطاء) + final isNonCritical = link.contains('errorApp.php'); + if (!_isRefreshingJWT && !isNonCritical) { + _isRefreshingJWT = true; + try { + await Get.put(LoginDriverController()).getJWT(); + } finally { + _isRefreshingJWT = false; + } + } + return 'token_expired'; + } + + // 5xx + if (sc >= 500) { + addError('Server 5xx', 'SC: $sc\nBody: $body', 'CRUD._makeRequest $link'); + return 'failure'; + } + + return 'failure'; + } + + // ═══════════════════════════════════════════════════════════════ + // post — طلب POST للسائق + // التغيير: إضافة X-Device-FP header + // ═══════════════════════════════════════════════════════════════ + Future post({ + required String link, + Map? payload, + }) async { + String token = r(box.read(BoxName.jwt)).toString().split(Env.addd)[0]; + + // فحص صلاحية التوكن قبل الإرسال — تجنب طلب مضمون الرفض + if (!_isJwtValid(token) && !_isRefreshingJWT) { + _isRefreshingJWT = true; + try { + await Get.put(LoginDriverController()).getJWT(); + token = r(box.read(BoxName.jwt)).toString().split(Env.addd)[0]; + } finally { + _isRefreshingJWT = false; + } + } + + final headers = { + 'Content-Type': 'application/x-www-form-urlencoded', + 'Authorization': 'Bearer $token', + 'X-Device-FP': _getFpHeader(), // ← إثبات الجهاز + }; + + return await _makeRequest(link: link, payload: payload, headers: headers); + } + + // ═══════════════════════════════════════════════════════════════ + // get — طلب GET للسائق (يستخدم POST method) + // التغيير: إضافة X-Device-FP header + timeout مناسب لسوريا + // ═══════════════════════════════════════════════════════════════ + Future get({ + required String link, + Map? payload, + }) async { + try { + // فحص صلاحية التوكن قبل الإرسال + String token = r(box.read(BoxName.jwt)).toString().split(Env.addd)[0]; + if (!_isJwtValid(token) && !_isRefreshingJWT) { + _isRefreshingJWT = true; + try { + await Get.put(LoginDriverController()).getJWT(); + token = r(box.read(BoxName.jwt)).toString().split(Env.addd)[0]; + } finally { + _isRefreshingJWT = false; + } + } + + var url = Uri.parse(link); + var response = await http.post( + url, + body: payload, + headers: { + 'Content-Type': 'application/x-www-form-urlencoded', + 'Authorization': 'Bearer $token', + 'X-Device-FP': _getFpHeader(), + }, + ).timeout(const Duration(seconds: 60)); + + Log.print('get [$link]: ${response.statusCode}'); + Log.print('get body: ${response.body}'); + + if (response.statusCode == 200) { + var jsonData = jsonDecode(response.body); + if (jsonData['status'] == 'success') return response.body; + return jsonData['status']; + } else if (response.statusCode == 401) { + if (!_isRefreshingJWT) { + _isRefreshingJWT = true; + try { + await Get.put(LoginDriverController()).getJWT(); + } finally { + _isRefreshingJWT = false; + } + } + return 'token_expired'; + } else { + addError('Non-200: ${response.statusCode}', 'crud().get - Other', + url.toString()); + return 'failure'; + } + } on TimeoutException { + return 'failure'; + } on SocketException { + return 'no_internet'; + } catch (e) { + addError('GET Exception: $e', '', link); + return 'failure'; + } + } + + // ═══════════════════════════════════════════════════════════════ + // postWallet — طلب POST للمحفظة + // التغيير: إضافة X-Device-FP header + // 3 headers: JWT + HMAC + FP + // ═══════════════════════════════════════════════════════════════ + Future postWallet({ + required String link, + Map? payload, + }) async { + var jwt = await LoginDriverController().getJwtWallet(); + final hmac = box.read(BoxName.hmac); + + final headers = { + 'Content-Type': 'application/x-www-form-urlencoded', + 'Authorization': 'Bearer $jwt', + 'X-HMAC-Auth': hmac.toString(), + 'X-Device-FP': _getFpHeader(), // ← إثبات الجهاز + }; + + return await _makeRequest(link: link, payload: payload, headers: headers); + } + + // ═══════════════════════════════════════════════════════════════ + // getWallet — طلب GET للمحفظة (يستخدم POST method) + // التغيير: إضافة X-Device-FP header + // ═══════════════════════════════════════════════════════════════ + Future getWallet({ + required String link, + Map? payload, + }) async { + var s = await LoginDriverController().getJwtWallet(); + final hmac = box.read(BoxName.hmac); + var url = Uri.parse(link); + + var response = await http.post( + url, + body: payload, + headers: { + 'Content-Type': 'application/x-www-form-urlencoded', + 'Authorization': 'Bearer $s', + 'X-HMAC-Auth': hmac.toString(), + 'X-Device-FP': _getFpHeader(), // ← إثبات الجهاز + }, + ).timeout(const Duration(seconds: 60)); + + if (response.statusCode == 200) { + var jsonData = jsonDecode(response.body); + if (jsonData['status'] == 'success') return response.body; + return jsonData['status']; + } else if (response.statusCode == 401) { + var jsonData = jsonDecode(response.body); + if (jsonData['error'] == 'Token expired') { + await Get.put(LoginDriverController()).getJwtWallet(); + return 'token_expired'; + } + addError('Unauthorized: ${jsonData['error']}', 'crud().getWallet - 401', + url.toString()); + return 'failure'; + } else { + addError('Non-200: ${response.statusCode}', 'crud().getWallet - Other', + url.toString()); + return 'failure'; + } + } + + // ═══════════════════════════════════════════════════════════════ + // postWalletMtn — طلب MTN للمحفظة + // التغيير: إضافة X-Device-FP header + // ═══════════════════════════════════════════════════════════════ + Future postWalletMtn({ + required String link, + Map? payload, + }) async { + final s = await LoginDriverController().getJwtWallet(); + final hmac = box.read(BoxName.hmac); + final url = Uri.parse(link); + + try { + final response = await http.post( + url, + body: payload, + headers: { + 'Content-Type': 'application/x-www-form-urlencoded', + 'Authorization': 'Bearer $s', + 'X-HMAC-Auth': hmac.toString(), + 'X-Device-FP': _getFpHeader(), // ← إثبات الجهاز + }, + ).timeout(const Duration(seconds: 60)); + + Map wrap(String status, {Object? message, int? code}) { + return { + 'status': status, + 'message': message, + 'code': code ?? response.statusCode + }; + } + + if (response.statusCode == 200) { + try { + return jsonDecode(response.body); + } catch (e) { + return wrap('failure', + message: 'JSON decode error', code: response.statusCode); + } + } else if (response.statusCode == 401) { + try { + final jsonData = jsonDecode(response.body); + if (jsonData is Map && jsonData['error'] == 'Token expired') { + await Get.put(LoginDriverController()).getJWT(); + return { + 'status': 'failure', + 'message': 'token_expired', + 'code': 401 + }; + } + return wrap('failure', message: jsonData); + } catch (_) { + return wrap('failure', message: response.body); + } + } else { + try { + return wrap('failure', message: jsonDecode(response.body)); + } catch (_) { + return wrap('failure', message: response.body); + } + } + } catch (e) { + return { + 'status': 'failure', + 'message': 'HTTP request error: $e', + 'code': -1 + }; + } + } + + // ======================================================================= + // باقي الدوال الخارجية — لا تحتاج X-Device-FP (APIs خارجية) + // ======================================================================= + + Future getAgoraToken({ + required String channelName, + required String uid, + }) async { + var uid = box.read(BoxName.phone) ?? box.read(BoxName.phoneDriver); + var res = await http.get( + Uri.parse( + 'https://orca-app-b2i85.ondigitalocean.app/token?channelName=$channelName'), + headers: {'Authorization': 'Bearer ${AK.agoraAppCertificate}'}, + ); + if (res.statusCode == 200) { + return jsonDecode(res.body)['token']; + } + } + + Future getLlama({ + required String link, + required String payload, + required String prompt, + }) async { + var url = Uri.parse(link); + var headers = { + 'Content-Type': 'application/json', + 'Authorization': + 'Bearer LL-X5lJ0Px9CzKK0HTuVZ3u2u4v3tGWkImLTG7okGRk4t25zrsLqJ0qNoUzZ2x4ciPy', + }; + var data = json.encode({ + 'model': 'Llama-3-70b-Inst-FW', + 'messages': [ + { + 'role': 'user', + 'content': + 'Extract the desired information from the following passage as json decoded like $prompt just in this:\n\n$payload', + } + ], + 'temperature': 0.9, + }); + var response = await http.post(url, body: data, headers: headers); + if (response.statusCode == 200) return response.body; + return response.statusCode; + } + + Future allMethodForAI(String prompt, linkPHP, imagePath) async { + await ImageController().choosImage(linkPHP, imagePath); + Future.delayed(const Duration(seconds: 2)); + var extractedString = + await arabicTextExtractByVisionAndAI(imagePath: imagePath); + var json = jsonDecode(extractedString); + var textValues = extractTextFromLines(json); + await Get.put(AI()).anthropicAI(textValues, prompt, imagePath); + } + + String extractTextFromLines(Map jsonData) { + final readResult = jsonData['readResult']; + final blocks = readResult['blocks']; + final buffer = StringBuffer(); + for (final block in blocks) { + for (final line in block['lines']) { + buffer.write(line['text']); + buffer.write('\n'); + } + } + return buffer.toString().trim(); + } + + Future arabicTextExtractByVisionAndAI( + {required String imagePath}) async { + var headers = { + 'Content-Type': 'application/json', + 'Ocp-Apim-Subscription-Key': AK.ocpApimSubscriptionKey, + }; + String imagePathFull = + '${AppLink.server}/card_image/$imagePath-${box.read(BoxName.driverID)}.jpg'; + var request = http.Request( + 'POST', + Uri.parse( + 'https://eastus.api.cognitive.microsoft.com/computervision/imageanalysis:analyze?features=caption,read&model-version=latest&language=en&api-version=2024-02-01'), + ); + request.body = json.encode({'url': imagePathFull}); + request.headers.addAll(headers); + http.StreamedResponse response = await request.send(); + if (response.statusCode == 200) + return await response.stream.bytesToString(); + } + + Future getChatGPT( + {required String link, required String payload}) async { + var url = Uri.parse(link); + var headers = { + 'Content-Type': 'application/json', + 'Authorization': 'Bearer ${Env.chatGPTkeySeferNew}', + }; + var data = json.encode({ + 'model': 'gpt-3.5-turbo', + 'messages': [ + { + 'role': 'user', + 'content': + 'Extract the desired information from the following passage as json decoded like vin,make,made,year,expiration_date,color,owner,registration_date just in this:\n\n$payload', + } + ], + 'temperature': 0.9, + }); + var response = await http.post(url, body: data, headers: headers); + if (response.statusCode == 200) return response.body; + return response.statusCode; + } + + + Future postPayMob( + {required String link, Map? payload}) async { + var url = Uri.parse(link); + var response = await http.post(url, + body: payload, headers: {'Content-Type': 'application/json'}); + var jsonData = jsonDecode(response.body); + if (response.statusCode == 200) { + if (jsonData['status'] == 'success') return response.body; + return jsonData['status']; + } + return response.statusCode; + } + + // ── sendEmail — إصلاح: استخدام r() بدل X.r() القديم ───────── + Future sendEmail(String link, Map? payload) async { + // r() هي نفس دالة فك التشفير الثلاثي المختصرة + String token = r(box.read(BoxName.jwt)).toString().split(Env.addd)[0]; + + if (!_isJwtValid(token)) { + await LoginDriverController().getJWT(); + token = r(box.read(BoxName.jwt)).toString().split(Env.addd)[0]; + } + + final headers = { + 'Content-Type': 'application/x-www-form-urlencoded', + 'Authorization': 'Bearer $token', + 'X-Device-FP': _getFpHeader(), // ← إثبات الجهاز + }; + + final request = http.Request('POST', Uri.parse(link)); + request.bodyFields = payload ?? {}; + request.headers.addAll(headers); + + final response = await request.send(); + if (response.statusCode != 200) { + final responseBody = await response.stream.bytesToString(); + addError('sendEmail failed: ${response.statusCode}', responseBody, + 'CRUD.sendEmail'); + } + } + + Future postFromDialogue( + {required String link, Map? payload}) async { + var url = Uri.parse(link); + var response = await http.post( + url, + body: payload, + headers: { + 'Content-Type': 'application/x-www-form-urlencoded', + 'Authorization': + 'Basic ${base64Encode(utf8.encode(AK.basicAuthCredentials))}', + }, + ); + if (response.body.isNotEmpty) { + var jsonData = jsonDecode(response.body); + if (response.statusCode == 200 && jsonData['status'] == 'success') { + Get.back(); + return response.body; + } + return jsonData['status']; + } + } + + Future sendVerificationRequest(String phoneNumber) async { + final accountSid = AK.accountSIDTwillo; + final authToken = AK.authTokenTwillo; + final verifySid = AK.twilloRecoveryCode; + + await http.post( + Uri.parse( + 'https://verify.twilio.com/v2/Services/$verifySid/Verifications'), + headers: { + 'Authorization': + 'Basic ' + base64Encode(utf8.encode('$accountSid:$authToken')), + 'Content-Type': 'application/x-www-form-urlencoded', + }, + body: {'To': phoneNumber, 'Channel': 'sms'}, + ); + } + + Future getGoogleApi( + {required String link, Map? payload}) async { + var url = Uri.parse(link); + var response = await http.post(url, body: payload); + var jsonData = jsonDecode(response.body); + if (jsonData['status'] == 'OK') return jsonData; + return jsonData['status']; + } + + Future update({ + required String endpoint, + required Map data, + required String id, + }) async { + var url = Uri.parse('$endpoint/$id'); + var response = await http.put( + url, + body: json.encode(data), + headers: { + 'Authorization': + 'Basic ${base64Encode(utf8.encode(AK.basicAuthCredentials))}' + }, + ); + return json.decode(response.body); + } + + Future delete({required String endpoint, required String id}) async { + var url = Uri.parse('$endpoint/$id'); + var response = await http.delete( + url, + headers: { + 'Authorization': + 'Basic ${base64Encode(utf8.encode(AK.basicAuthCredentials))}' + }, + ); + return json.decode(response.body); + } + + Future getMapSaas({ + required String link, + }) async { + var url = Uri.parse(link); + try { + var response = await http.get( + url, + headers: { + 'Content-Type': 'application/json', + 'x-api-key': Env.mapSaasKey, + }, + ); + Log.print('link -MapSaas: $link'); + Log.print('response -MapSaas: ${response.body}'); + if (response.statusCode == 200) { + return jsonDecode(response.body); + } + Log.print('MapSaas Error: ${response.statusCode} - ${response.body}'); + return null; + } catch (e) { + Log.print('MapSaas Exception: $e'); + return null; + } + } + + Future postMapSaas({ + required String link, + required Map payload, + }) async { + var url = Uri.parse(link); + try { + var response = await http.post( + url, + body: jsonEncode(payload), + headers: { + 'Content-Type': 'application/json', + 'x-api-key': Env.mapSaasKey, + }, + ); + Log.print('post -MapSaas link: $link'); + Log.print('post -MapSaas payload: $payload'); + Log.print('post -MapSaas response: ${response.body}'); + if (response.statusCode == 200 || response.statusCode == 201) { + return jsonDecode(response.body); + } + Log.print('MapSaas Post Error: ${response.statusCode} - ${response.body}'); + return null; + } catch (e) { + Log.print('MapSaas Post Exception: $e'); + return null; + } + } +} + +class NoInternetException implements Exception { + final String message; + NoInternetException( + [this.message = + 'No internet connection. Please check your network and try again.']); + @override + String toString() => message; +} + +class WeakNetworkException implements Exception { + final String message; + WeakNetworkException( + [this.message = + 'Your network connection is too slow. Please try again later.']); + @override + String toString() => message; +} + +class ApiException implements Exception { + final String message; + final int? statusCode; + ApiException(this.message, [this.statusCode]); + @override + String toString() => + 'ApiException: $message (Status Code: ${statusCode ?? 'N/A'})'; +} diff --git a/siro_driver/lib/controller/functions/custom_pant.dart b/siro_driver/lib/controller/functions/custom_pant.dart new file mode 100755 index 0000000..8b85ce4 --- /dev/null +++ b/siro_driver/lib/controller/functions/custom_pant.dart @@ -0,0 +1,26 @@ +import 'package:flutter/material.dart'; + +class LineChartPainter extends CustomPainter { + final List data; + + LineChartPainter(this.data); + + @override + void paint(Canvas canvas, Size size) { + // Calculate the scale factor. + final scaleFactor = size.height / 240; + + // Draw the line chart. + for (var i = 0; i < data.length - 1; i++) { + final x1 = i * size.width / data.length; + final y1 = data[i] * scaleFactor; + final x2 = (i + 1) * size.width / data.length; + final y2 = data[i + 1] * scaleFactor; + + canvas.drawLine(Offset(x1, y1), Offset(x2, y2), Paint()); + } + } + + @override + bool shouldRepaint(LineChartPainter oldDelegate) => false; +} diff --git a/siro_driver/lib/controller/functions/device_analyzer.dart b/siro_driver/lib/controller/functions/device_analyzer.dart new file mode 100644 index 0000000..82c3fa0 --- /dev/null +++ b/siro_driver/lib/controller/functions/device_analyzer.dart @@ -0,0 +1,205 @@ +import 'dart:async'; +import 'dart:io'; +import 'package:device_info_plus/device_info_plus.dart'; +import 'performance_test.dart'; // Make sure this path is correct + +/// Analyzes various device hardware and software aspects to generate a compatibility score. +/// This class provides a standardized output for the UI to consume easily. +class DeviceAnalyzer { + final DeviceInfoPlugin _deviceInfo = DeviceInfoPlugin(); + + /// Reads the total RAM from the system's meminfo file. + /// Returns the value in Megabytes (MB). + Future _readTotalRamMB() async { + try { + final file = File('/proc/meminfo'); + if (!await file.exists()) return 0.0; + final lines = await file.readAsLines(); + for (var line in lines) { + if (line.startsWith('MemTotal')) { + // Extracts the numeric value from the line. + final kb = int.tryParse(RegExp(r'\d+').stringMatch(line) ?? '0') ?? 0; + return kb / 1024.0; // Convert from Kilobytes to Megabytes + } + } + } catch (e) { + print('❌ Error reading total RAM: $e'); + } + return 0.0; + } + + /// Reads the current RAM usage percentage from the system's meminfo file. + Future _readUsedRamPercent() async { + try { + final file = File('/proc/meminfo'); + if (!await file.exists()) return 0.0; + final lines = await file.readAsLines(); + int? total, available; + for (var line in lines) { + if (line.startsWith('MemTotal')) { + total = int.tryParse(RegExp(r'\d+').stringMatch(line) ?? ''); + } else if (line.startsWith('MemAvailable')) { + available = int.tryParse(RegExp(r'\d+').stringMatch(line) ?? ''); + } + } + if (total != null && available != null && total > 0) { + final used = total - available; + return (used / total) * 100.0; + } + } catch (e) { + print('❌ Error reading used RAM: $e'); + } + return 0.0; + } + + /// The main analysis function that runs all checks. + Future> analyzeDevice() async { + List> details = []; + + if (!Platform.isAndroid) { + return { + 'score': 0, + 'details': [ + { + 'label': 'النظام غير مدعوم', + 'status': false, + 'achieved_score': 0, + 'max_score': 100 + } + ] + }; + } + + final info = await _deviceInfo.androidInfo; + final data = info.data; + final features = List.from(data['systemFeatures'] ?? []); + + // 1. Android Version (Max: 10 points) + final version = + int.tryParse(info.version.release?.split('.').first ?? '0') ?? 0; + final int androidScore = version >= 9 ? 10 : 0; + details.add({ + 'label': 'إصدار أندرويد ${info.version.release}', + 'status': androidScore > 0, + 'achieved_score': androidScore, + 'max_score': 10, + }); + + // 2. Total RAM (Max: 10 points) + final totalRam = await _readTotalRamMB(); + int ramScore; + if (totalRam >= 8000) { + ramScore = 10; + } else if (totalRam >= 4000) { + ramScore = 5; + } else if (totalRam >= 3000) { + ramScore = 3; + } else { + ramScore = 0; + } + details.add({ + 'label': 'إجمالي الرام ${totalRam.toStringAsFixed(0)} ميجابايت', + 'status': ramScore >= 5, + 'achieved_score': ramScore, + 'max_score': 10, + }); + + // 3. CPU Cores (Max: 10 points) + final cores = Platform.numberOfProcessors; + int coreScore = cores >= 6 ? 10 : (cores >= 4 ? 5 : 0); + details.add({ + 'label': 'أنوية المعالج ($cores)', + 'status': coreScore >= 5, + 'achieved_score': coreScore, + 'max_score': 10, + }); + + // 4. Free Storage (Max: 5 points) + final freeBytes = data['freeDiskSize'] ?? 0; + final freeGB = freeBytes / (1024 * 1024 * 1024); + int storeScore = freeGB >= 5 ? 5 : (freeGB >= 2 ? 3 : 0); + details.add({ + 'label': 'المساحة الحرة ${freeGB.toStringAsFixed(1)} جيجابايت', + 'status': storeScore >= 3, + 'achieved_score': storeScore, + 'max_score': 5, + }); + + // 5. GPS + Gyroscope Sensors (Max: 10 points) + bool okSensors = features.contains('android.hardware.location.gps') && + features.contains('android.hardware.sensor.gyroscope'); + final int sensorScore = okSensors ? 10 : 0; + details.add({ + 'label': 'حساسات GPS و Gyroscope', + 'status': okSensors, + 'achieved_score': sensorScore, + 'max_score': 10, + }); + + // 6. Storage Write Speed (Max: 20 points) + final writeSpeed = await PerformanceTester.testStorageWriteSpeed(); + int writeScore; + if (writeSpeed >= 30) { + writeScore = 20; + } else if (writeSpeed >= 15) { + writeScore = 15; + } else if (writeSpeed >= 5) { + writeScore = 10; + } else { + writeScore = 5; + } + details.add({ + 'label': 'سرعة الكتابة (${writeSpeed.toStringAsFixed(1)} MB/s)', + 'status': writeScore >= 10, + 'achieved_score': writeScore, + 'max_score': 20, + }); + + // 7. CPU Compute Speed (Max: 20 points) + final cpuTime = await PerformanceTester.testCPUSpeed(); + int cpuScore; + if (cpuTime <= 1.0) { + cpuScore = 20; + } else if (cpuTime <= 2.5) { + cpuScore = 15; + } else if (cpuTime <= 4.0) { + cpuScore = 10; + } else { + cpuScore = 5; + } + details.add({ + 'label': 'سرعة المعالجة (${cpuTime.toStringAsFixed(2)} ثانية)', + 'status': cpuScore >= 10, + 'achieved_score': cpuScore, + 'max_score': 20, + }); + + // 8. Memory Pressure (Max: 15 points) + final usedPercent = await _readUsedRamPercent(); + int memScore; + if (usedPercent <= 60) { + memScore = 15; + } else if (usedPercent <= 80) { + memScore = 10; + } else if (usedPercent <= 90) { + memScore = 5; + } else { + memScore = 0; + } + details.add({ + 'label': 'استخدام الرام الحالي (${usedPercent.toStringAsFixed(0)}%)', + 'status': memScore >= 10, + 'achieved_score': memScore, + 'max_score': 15, + }); + + // Calculate the final total score by summing up the achieved scores. + final totalScore = details.fold( + 0, (sum, item) => sum + (item['achieved_score'] as int)); + + return { + 'score': totalScore.clamp(0, 100), + 'details': details, + }; + } +} diff --git a/siro_driver/lib/controller/functions/device_info.dart b/siro_driver/lib/controller/functions/device_info.dart new file mode 100755 index 0000000..340805e --- /dev/null +++ b/siro_driver/lib/controller/functions/device_info.dart @@ -0,0 +1,80 @@ +import 'dart:io'; +import 'package:device_info_plus/device_info_plus.dart'; +import 'package:get_storage/get_storage.dart'; +import '../../constant/box_name.dart'; + +class DeviceInfo { + final String? manufacturer; + final String? model; + final String? deviceId; + final String? osVersion; + final String? platform; + final String? deviceName; + final bool? isPhysicalDevice; + + DeviceInfo({ + this.manufacturer, + this.model, + this.deviceId, + this.osVersion, + this.platform, + this.deviceName, + this.isPhysicalDevice, + }); + + Map toJson() => { + 'manufacturer': manufacturer, + 'model': model, + 'deviceId': deviceId, + 'osVersion': osVersion, + 'platform': platform, + 'deviceName': deviceName, + 'isPhysicalDevice': isPhysicalDevice, + }; +} + +class DeviceController { + final box = GetStorage(); + final _deviceInfo = DeviceInfoPlugin(); + + Future getDeviceInfo() async { + if (Platform.isAndroid) { + return await _getAndroidDeviceInfo(); + } else if (Platform.isIOS) { + return await _getIosDeviceInfo(); + } + throw UnsupportedError('Unsupported platform'); + } + + Future _getAndroidDeviceInfo() async { + final androidInfo = await _deviceInfo.androidInfo; + final deviceInfo = DeviceInfo( + manufacturer: androidInfo.manufacturer, + model: androidInfo.model, + deviceId: androidInfo.id, + osVersion: androidInfo.version.release, + platform: 'Android', + deviceName: androidInfo.device, + isPhysicalDevice: androidInfo.isPhysicalDevice, + ); + + box.write(BoxName.deviceInfo, deviceInfo.toJson()); + return deviceInfo; + } + + Future _getIosDeviceInfo() async { + final iosInfo = await _deviceInfo.iosInfo; + final deviceInfo = DeviceInfo( + manufacturer: 'Apple', + model: iosInfo.model, + deviceId: iosInfo.identifierForVendor, + osVersion: iosInfo.systemVersion, + platform: 'iOS', + deviceName: iosInfo.name, + isPhysicalDevice: iosInfo.isPhysicalDevice, + ); + + box.write(BoxName.deviceInfo, deviceInfo.toJson()); + return deviceInfo; + } +} diff --git a/siro_driver/lib/controller/functions/digit_obsecur_formate.dart b/siro_driver/lib/controller/functions/digit_obsecur_formate.dart new file mode 100755 index 0000000..b5972e4 --- /dev/null +++ b/siro_driver/lib/controller/functions/digit_obsecur_formate.dart @@ -0,0 +1,42 @@ +import 'package:flutter/services.dart'; + +class DigitObscuringFormatter extends TextInputFormatter { + @override + TextEditingValue formatEditUpdate( + TextEditingValue oldValue, TextEditingValue newValue) { + final maskedText = maskDigits(newValue.text); + return newValue.copyWith( + text: maskedText, + selection: updateCursorPosition(maskedText, newValue.selection)); + } + + String maskDigits(String text) { + final totalDigits = text.length; + final visibleDigits = 4; + final hiddenDigits = totalDigits - visibleDigits * 2; + + final firstVisibleDigits = text.substring(0, visibleDigits); + final lastVisibleDigits = text.substring(totalDigits - visibleDigits); + + final maskedDigits = List.filled(hiddenDigits, '*').join(); + + return '$firstVisibleDigits$maskedDigits$lastVisibleDigits'; + } + + TextSelection updateCursorPosition( + String maskedText, TextSelection currentSelection) { + final cursorPosition = currentSelection.baseOffset; + final cursorOffset = + currentSelection.extentOffset - currentSelection.baseOffset; + final totalDigits = maskedText.length; + const visibleDigits = 4; + final hiddenDigits = totalDigits - visibleDigits * 2; + + final updatedPosition = cursorPosition <= visibleDigits + ? cursorPosition + : hiddenDigits + visibleDigits + (cursorPosition - visibleDigits); + + return TextSelection.collapsed( + offset: updatedPosition, affinity: currentSelection.affinity); + } +} diff --git a/siro_driver/lib/controller/functions/document_scanner.dart b/siro_driver/lib/controller/functions/document_scanner.dart new file mode 100755 index 0000000..198992c --- /dev/null +++ b/siro_driver/lib/controller/functions/document_scanner.dart @@ -0,0 +1,41 @@ +// import 'dart:io'; +// +// import 'package:get/get.dart'; +// import 'package:image_picker/image_picker.dart'; +// import 'package:google_ml_kit/google_ml_kit.dart'; +// +// class ImagePickerController extends GetxController { +// RxBool textScanning = false.obs; +// RxString scannedText = ''.obs; +// +// Future getImage(ImageSource source) async { +// try { +// final pickedImage = await ImagePicker().pickImage(source: source); +// if (pickedImage != null) { +// textScanning.value = true; +// final imageFile = File(pickedImage.path); +// getRecognisedText(imageFile); +// } +// } catch (e) { +// textScanning.value = false; +// scannedText.value = "Error occurred while scanning"; +// } +// } +// +// Future getRecognisedText(File image) async { +// final inputImage = InputImage.fromFilePath(image.path); +// final textDetector = GoogleMlKit.vision.textRecognizer(); +// final RecognizedText recognisedText = +// await textDetector.processImage(inputImage); +// await textDetector.close(); +// +// scannedText.value = ''; +// for (TextBlock block in recognisedText.blocks) { +// for (TextLine line in block.lines) { +// scannedText.value += line.text + '\n'; +// } +// } +// +// textScanning.value = false; +// } +// } diff --git a/siro_driver/lib/controller/functions/encrypt.dart b/siro_driver/lib/controller/functions/encrypt.dart new file mode 100755 index 0000000..3457614 --- /dev/null +++ b/siro_driver/lib/controller/functions/encrypt.dart @@ -0,0 +1,32 @@ +import 'dart:convert'; +import 'package:encrypt/encrypt.dart' as encrypt; + +import '../../constant/api_key.dart'; + +class KeyEncryption { + // استخدم مفتاح بطول 32 حرفًا + static final _key = encrypt.Key.fromUtf8(AK.keyOfApp); + static final _iv = + encrypt.IV.fromLength(16); // توليد تهيئة عشوائية بطول 16 بايت + + static String encryptKey(String key) { + final encrypter = + encrypt.Encrypter(encrypt.AES(_key, mode: encrypt.AESMode.cbc)); + final encrypted = encrypter.encrypt(key, iv: _iv); + final result = _iv.bytes + encrypted.bytes; // تضمين التهيئة مع النص المشفر + return base64Encode(result); + } + + static String decryptKey(String encryptedKey) { + print('encryptedKey: ${AK.keyOfApp}'); + + final decoded = base64Decode(encryptedKey); + print('encryptedKey: $encryptedKey'); + final iv = encrypt.IV(decoded.sublist(0, 16)); // استخراج التهيئة + final encrypted = + encrypt.Encrypted(decoded.sublist(16)); // استخراج النص المشفر + final encrypter = + encrypt.Encrypter(encrypt.AES(_key, mode: encrypt.AESMode.cbc)); + return encrypter.decrypt(encrypted, iv: iv); + } +} diff --git a/siro_driver/lib/controller/functions/encrypt_decrypt.dart b/siro_driver/lib/controller/functions/encrypt_decrypt.dart new file mode 100755 index 0000000..2cc88e2 --- /dev/null +++ b/siro_driver/lib/controller/functions/encrypt_decrypt.dart @@ -0,0 +1,77 @@ +import 'package:encrypt/encrypt.dart' as encrypt; +import 'package:flutter/foundation.dart'; +import 'package:secure_string_operations/secure_string_operations.dart'; + +import '../../constant/char_map.dart'; +import '../../env/env.dart'; +import '../../main.dart'; +import '../../print.dart'; + +class EncryptionHelper { + static EncryptionHelper? _instance; + + late final encrypt.Key key; + late final encrypt.IV iv; + + EncryptionHelper._(this.key, this.iv); + static EncryptionHelper get instance { + if (_instance == null) { + throw Exception( + "EncryptionHelper is not initialized. Call `await EncryptionHelper.initialize()` in main."); + } + return _instance!; + } + + /// Initializes and stores the instance globally + static Future initialize() async { + if (_instance != null) { + debugPrint("EncryptionHelper is already initialized."); + return; // Prevent re-initialization + } + debugPrint("Initializing EncryptionHelper..."); + var keyOfApp = r(Env.keyOfApp).toString().split(Env.addd)[0]; + var initializationVector = + r(Env.initializationVector).toString().split(Env.addd)[0]; + + // Set the global instance + _instance = EncryptionHelper._( + encrypt.Key.fromUtf8(keyOfApp!), + encrypt.IV.fromUtf8(initializationVector!), + ); + debugPrint("EncryptionHelper initialized successfully."); + } + + /// Encrypts a string + String encryptData(String plainText) { + try { + final encrypter = + encrypt.Encrypter(encrypt.AES(key, mode: encrypt.AESMode.cbc)); + final encrypted = encrypter.encrypt(plainText, iv: iv); + return encrypted.base64; + } catch (e) { + debugPrint('Encryption Error: $e'); + return ''; + } + } + + /// Decrypts a string + String decryptData(String encryptedText) { + try { + final encrypter = + encrypt.Encrypter(encrypt.AES(key, mode: encrypt.AESMode.cbc)); + final encrypted = encrypt.Encrypted.fromBase64(encryptedText); + return encrypter.decrypt(encrypted, iv: iv); + } catch (e) { + debugPrint('Decryption Error: $e'); + return ''; + } + } +} + +r(String string) { + return X.r(X.r(X.r(string, cn), cC), cs).toString(); +} + +c(String string) { + return X.c(X.c(X.c(string, cn), cC), cs).toString(); +} diff --git a/siro_driver/lib/controller/functions/face_detect.dart b/siro_driver/lib/controller/functions/face_detect.dart new file mode 100755 index 0000000..9b5f3a0 --- /dev/null +++ b/siro_driver/lib/controller/functions/face_detect.dart @@ -0,0 +1,95 @@ +import 'dart:convert'; +import 'dart:io'; +import 'package:siro_driver/constant/api_key.dart'; +import 'package:siro_driver/constant/box_name.dart'; +import 'package:siro_driver/main.dart'; +import 'package:http/http.dart' as http; +import 'package:http/io_client.dart'; + +import '../../constant/links.dart'; +import 'encrypt_decrypt.dart'; +import 'upload_image.dart'; + +Future faceDetector() async { + await ImageController().choosFace(AppLink.uploadEgypt, 'face_detect'); + await Future.delayed(const Duration(seconds: 2)); + + var headers = { + // 'Authorization': 'Basic ${AK.basicCompareFaces}', + 'Authorization': 'Basic hamza:12345678', + 'Content-Type': 'application/json' + }; + + // var request = http.Request('POST', Uri.parse(//Todo + // 'https://face-detect-f6924392c4c7.herokuapp.com/compare_faces')); + + var request = http.Request( + 'POST', Uri.parse('https://mohkh.online:5000/compare_faces')); + + request.body = json.encode({ + "url1": + "${AppLink.seferCairoServer}/card_image/id_front-${(box.read(BoxName.driverID))}.jpg", + "url2": + "https://api.sefer.live/sefer/card_image/face_detect-${(box.read(BoxName.driverID))}.jpg" + }); + print('request.body: ${request.body}'); + request.headers.addAll(headers); + + try { + http.Client client = await createHttpClient(); + http.StreamedResponse response = await client.send(request); + // http.StreamedResponse response = await request.send(); + + if (response.statusCode == 200) { + String result = await response.stream.bytesToString(); + print('result: ${result}'); + return result; + } else { + print('Error: ${response.reasonPhrase}'); + return 'Error: ${response.reasonPhrase}'; + } + } catch (e) { + print('Exception occurred: $e'); + return 'Error: $e'; + } +} + +Future createHttpClient() async { + final SecurityContext securityContext = SecurityContext(); + HttpClient httpClient = HttpClient(context: securityContext); + httpClient.badCertificateCallback = + (X509Certificate cert, String host, int port) => true; // Bypass SSL + return IOClient(httpClient); +} + +Future faceDetector2(String url1, String url2) async { + var headers = { + 'Authorization': 'Basic hamza:12345678', + 'Content-Type': 'application/json' + }; + + var request = http.Request( + 'POST', Uri.parse('https://mohkh.online:5000/compare_faces')); + + request.body = json.encode({"url1": url1, "url2": url2}); + request.headers.addAll(headers); + + try { + http.Client client = await createHttpClient(); // Use custom client + DateTime startTime = DateTime.now(); + http.StreamedResponse response = await client.send(request); + DateTime endTime = DateTime.now(); + Duration duration = endTime.difference(startTime); + if (response.statusCode == 200) { + print(await response.stream.bytesToString()); + print(duration.inSeconds); + + return await response.stream.bytesToString(); + } else { + print(await response.stream.bytesToString()); + return 'Error: ${response.reasonPhrase}'; + } + } catch (e) { + return 'Exception: $e'; + } +} diff --git a/siro_driver/lib/controller/functions/gemeni.dart b/siro_driver/lib/controller/functions/gemeni.dart new file mode 100755 index 0000000..541f5d6 --- /dev/null +++ b/siro_driver/lib/controller/functions/gemeni.dart @@ -0,0 +1,1639 @@ +import 'dart:async'; +import 'dart:convert'; +import 'dart:io'; +import 'dart:convert'; +import 'package:crypto/crypto.dart'; + +import 'package:siro_driver/constant/box_name.dart'; +import 'package:siro_driver/constant/info.dart'; +import 'package:siro_driver/constant/links.dart'; +import 'package:siro_driver/constant/style.dart'; +import 'package:siro_driver/controller/auth/captin/login_captin_controller.dart'; +import 'package:siro_driver/controller/firebase/firbase_messge.dart'; +import 'package:siro_driver/controller/firebase/local_notification.dart'; +import 'package:siro_driver/controller/functions/crud.dart'; +import 'package:siro_driver/env/env.dart'; +import 'package:siro_driver/main.dart'; +import 'package:siro_driver/views/widgets/error_snakbar.dart'; +import 'package:siro_driver/views/widgets/mydialoug.dart'; +import 'package:flutter/material.dart'; +import 'package:get/get.dart'; +import 'package:image_cropper/image_cropper.dart'; +import 'package:image_picker/image_picker.dart'; +import 'package:http/http.dart' as http; +import 'package:image/image.dart' as img; +import 'package:path_provider/path_provider.dart'; +import 'package:secure_string_operations/secure_string_operations.dart'; + +import '../../constant/api_key.dart'; +import '../../constant/char_map.dart'; +import '../../constant/colors.dart'; +import '../../print.dart'; +import '../firebase/notification_service.dart'; +import 'encrypt_decrypt.dart'; +import 'tts.dart'; +import 'upload_image.dart'; + +enum LicenseSide { + front, + back, + unknown, +} + +enum DocumentType { + carLicenseFront, + carLicenseBack, + idCardFront, + nonIdCardFront, + nonIdCardBack, + idCardBack, + driverLicense, + unknown, +} + +class AI extends GetxController { + bool approved = false; + bool isDriverSaved = false; + bool isCarSaved = false; + bool isInviteDriverFound = false; + final invitationCodeController = TextEditingController(); + final formKey = GlobalKey(); + bool isTimerComplete = false; + double progressValue = 1.0; + int remainingSeconds = 30; + + void startTimer() { + Timer.periodic(const Duration(seconds: 1), (timer) { + if (remainingSeconds == 0) { + timer.cancel(); + isTimerComplete = true; + update(); // Notify the UI + } else { + remainingSeconds--; + progressValue = remainingSeconds / 30.0; // Update progress + update(); // Notify the UI + } + }); + } + + void resetTimer() { + isTimerComplete = false; + progressValue = 1.0; + remainingSeconds = 40; + update(); // Notify the UI + startTimer(); // Restart the timer + } + + void setApproved() { + approved = true; + update(); + } + + Future updateInvitationCodeFromRegister() async { + var res = await CRUD().post( + link: AppLink.updateDriverInvitationDirectly, + payload: { + "inviterDriverPhone": box.read(BoxName.phoneDriver).toString(), + "driverId": box.read(BoxName.driverID).toString(), + }, + ); + + if (res != 'failure') { + isInviteDriverFound = true; + update(); + // mySnackbarSuccess("Code approved".tr); // Localized success message + box.write(BoxName.isInstall, '1'); + NotificationController().showNotification( + "Code approved".tr, "Code approved".tr, 'tone2', ''); + // Notification text with dynamic token + // Get.put(FirebaseMessagesController()).sendNotificationToDriverMAP( + // 'You have received a gift token!'.tr, + // 'for '.tr + box.read(BoxName.phoneDriver).toString(), + // jsonDecode(res)['message'][0]['token'].toString(), + // [], + // 'tone2', // Type of notification + // ); + NotificationService.sendNotification( + target: (res)['message'][0]['token'].toString(), + title: 'You have received a gift token!'.tr, + body: 'for '.tr + box.read(BoxName.phoneDriver).toString(), + isTopic: false, // Important: this is a token + tone: 'tone2', + driverList: [], category: 'You have received a gift token!', + ); + } else { + // mySnackeBarError( + // "You dont have invitation code".tr); // Localized error message + } + } + + Future updatePassengersInvitation() async { + if (formKey.currentState!.validate()) { + var res = await CRUD().post( + link: AppLink.updatePassengersInvitation, + payload: {"inviteCode": invitationCodeController.text}); + if (res != 'failure') { + isInviteDriverFound = true; + update(); + mySnackbarSuccess("Code approved".tr); + } else { + mySnackeBarError("Code not approved".tr); + } + } + } + + final today = DateTime.now(); + + Future addDriverAndCarEgypt() async { + final today = DateTime.now(); + + // رخصة القيادة + final drvExpiry = DateTime.tryParse(licenceBackSy['expiry_date'] ?? ''); + final drvExpired = drvExpiry != null && drvExpiry.isBefore(today); + + // فحص السيارة + الضرائب + final inspDate = DateTime.tryParse(vehicleFrontSy['inspection_date'] ?? ''); + final taxExpiry = DateTime.tryParse(vehicleBackSy['tax_expiry'] ?? ''); + final inspExpired = inspDate != null && inspDate.isBefore(today); + final taxExpired = taxExpiry != null && taxExpiry.isBefore(today); + + // تطابق تاريخَي ميلاد الهوية غير المصرية + final birthFront = + DateTime.tryParse(responseNonIdCardFront['birthdate'] ?? ''); + final birthBack = + DateTime.tryParse(responseNonIdCardBack['birthDate'] ?? ''); + final birthMismatch = + (birthFront != null && birthBack != null && birthFront != birthBack); + + /* ـــــــ ❷ تحذيرات المستخدم ـــــــ */ + + if (!isEgypt && birthMismatch) { + await _showWarnDialog( + title: 'Birthdate Mismatch'.tr, + text: 'Birthdate on ID front and back does not match.'.tr, + ); + return; + } + + if (drvExpired) { + await _showWarnDialog( + title: 'Expired Driver’s License'.tr, + text: 'Your driver’s license has expired. Please renew it.'.tr, + ); + return; + } else { + await addDriverEgypt(); + await addRegistrationCarEgypt(); + + if (isCarSaved && isDriverSaved) { + // DeviceController().getDeviceSerialNumber(); + box.write(BoxName.phoneVerified, true); + + Get.find().loginWithGoogleCredential( + box.read(BoxName.driverID).toString(), + box.read(BoxName.emailDriver).toString(), + ); + } + } + } + + String extractDOB(String nationalNumber) { + if (nationalNumber.length != 14) { + throw ArgumentError('National number must be 14 digits long.'); + } + + // Extract the first digit to determine the century + String firstDigit = nationalNumber[0]; + + // Extract year, month, and day parts + String yearPart = nationalNumber.substring(1, 3); + String monthPart = nationalNumber.substring(3, 5); + String dayPart = nationalNumber.substring(5, 7); + + // Determine the year based on the first digit + int yearPrefix; + if (firstDigit == '2') { + yearPrefix = 1900; + } else if (firstDigit == '3') { + yearPrefix = 2000; + } else { + throw ArgumentError('Invalid first digit in national number.'); + } + + // Construct the full year + int year = yearPrefix + int.parse(yearPart); + + // Format the date as YYYY-MM-DD + String dob = + '$year-${monthPart.padLeft(2, '0')}-${dayPart.padLeft(2, '0')}'; + + return dob; + } + + Future _showWarnDialog( + {required String title, required String text}) async { + await Get.defaultDialog( + title: title, + content: Column( + mainAxisSize: MainAxisSize.min, + children: [ + const Icon(Icons.warning, size: 48, color: Colors.red), + const SizedBox(height: 16), + Text(text, textAlign: TextAlign.center, style: AppStyle.title), + const SizedBox(height: 16), + IconButton( + icon: const Icon(Icons.volume_up), + onPressed: () async => + await Get.find().speakText(text), + ) + ], + ), + actions: [ + TextButton(onPressed: Get.back, child: const Text('OK')), + ], + ); + } + + String shortHash(String password) { + var bytes = utf8.encode(password); + var digest = sha256.convert(bytes); + return base64UrlEncode(digest.bytes); + } + + Future addDriverEgypt() async { + isLoading = true; + update(); + final loginDriverController = Get.put(LoginDriverController()); + + var pass = loginDriverController.passwordController.text.isEmpty + ? '${box.read(BoxName.emailDriver)}${box.read(BoxName.driverID)}' + : '${loginDriverController.emailController.text.toString()}${box.read(BoxName.driverID)}'; + String hashedPassword = shortHash(pass); + + var payload = { + 'first_name': + (idFrontSy['full_name'].toString().split(' ')[0]) ?? 'Not specified', + 'last_name': + (idFrontSy['full_name'].toString().split(' ')[1]) ?? 'Not specified', + 'email': 'Not specified', + 'phone': box.read(BoxName.phoneDriver)?.toString(), + 'id': box.read(BoxName.driverID)?.toString(), + 'password': hashedPassword.toString(), + 'gender': (idBackSy['gender'].toString()) ?? 'Not specified', + 'license_type': + (licenceBackSy['license_number'].toString()) ?? 'Not specified', + 'national_number': + (licenceFrontSy['national_number'].toString()) ?? 'Not specified', + 'name_arabic': (licenceFrontSy['name_arabic'].toString()), + 'issue_date': licenceBackSy['issue_date']?.toString() ?? 'Not specified', + 'expiry_date': + licenceBackSy['expiry_date']?.toString() ?? 'Not specified', + 'license_categories': + licenceBackSy['license_categories'] ?? 'Not specified', + 'address': (idBackSy['address'].toString()) ?? 'Not specified', + 'licenseIssueDate': + licenceBackSy['issue_date'].toString() ?? 'Not specified', + 'status': 'yet', + 'birthdate': idFrontSy['dob'].toString(), + 'maritalStatus': 'Not specified', + 'site': (idBackSy['address'].toString()) ?? 'Not specified', + 'employmentType': 'Not specified', + }; + try { + var res = await CRUD().post(link: AppLink.signUpCaptin, payload: payload); + + // Check if response is valid JSON + + isLoading = false; + update(); + + if (res['status'] == 'success') { + isDriverSaved = true; + box.write(BoxName.emailDriver, + '${box.read(BoxName.phoneDriver)}${Env.email}'); + mySnackbarSuccess('Driver data saved successfully'); + } else { + mySnackeBarError('${'Failed to save driver data'.tr}: }'); + } + } catch (e) { + isLoading = false; + update(); + mySnackeBarError( + 'An error occurred while saving driver data'.tr, + ); + } + } + + addCriminalDocuments() async { + var res = await CRUD().post(link: AppLink.addCriminalDocuments, payload: { + "driverId": box.read(BoxName.driverID), + "IssueDate": responseCriminalRecordEgypt['IssueDate'], + "InspectionResult": (responseCriminalRecordEgypt['InspectionResult']), + }); + if (res != 'failure') { + mySnackbarSuccess('uploaded sucssefuly'.tr); + } + } + + Future addRegistrationCarEgypt() async { + try { + isLoading = true; + update(); + var payload = { + 'driverID': box.read(BoxName.driverID), + 'vin': vehicleBackSy['chassis'].toString(), + 'car_plate': (vehicleFrontSy['car_plate'].toString()), + 'make': (vehicleBackSy['make'].toString()), + 'model': (vehicleBackSy['model']), + 'year': vehicleBackSy['year'].toString(), + 'expiration_date': vehicleFrontSy['inspection_date'].toString(), + 'color': vehicleFrontSy['color'], + 'owner': (vehicleFrontSy['owner']), + 'color_hex': vehicleFrontSy['colorHex'].toString(), + 'fuel': vehicleBackSy['fuel'].toString(), + }; + var res = + await CRUD().post(link: AppLink.addRegisrationCar, payload: payload); + isLoading = false; + update(); + var status = (res); + if (status['status'] == 'success') { + isCarSaved = true; + mySnackbarSuccess(''); + } + } catch (e) {} + } + + final picker = ImagePicker(); + Map responseMap = {}; + Map responseCarLicenseMapJordan = {}; + Map responseBackCarLicenseMap = {}; + Map responseIdCardMap = {}; + Map responseIdCardDriverEgyptBack = {}; + Map responseForComplaint = {}; + Map responseIdCardDriverEgyptFront = {}; + Map responseIdEgyptFront = {}; + Map responseNonIdCardFront = {}; + Map responseNonIdCardBack = {}; + Map responseCriminalRecordEgypt = {}; + Map responseIdEgyptBack = {}; + Map responseIdEgyptDriverLicense = {}; + String? responseIdCardDriverEgypt1; + bool isloading = false; + bool isLoading = false; + bool isEgypt = true; + var image; + CroppedFile? croppedFile; + DateTime now = DateTime.now(); + + changeNationality() { + isEgypt = !isEgypt; + update(); + } + + Future pickImage() async { + final pickedImage = await picker.pickImage(source: ImageSource.gallery); + + if (pickedImage != null) { + image = File(pickedImage.path); + // Crop the image + croppedFile = await ImageCropper().cropImage( + sourcePath: image!.path, + uiSettings: [ + AndroidUiSettings( + toolbarTitle: 'Cropper'.tr, + toolbarColor: AppColor.blueColor, + toolbarWidgetColor: AppColor.yellowColor, + initAspectRatio: CropAspectRatioPreset.original, + lockAspectRatio: false), + IOSUiSettings( + title: 'Cropper'.tr, + ), + ], + ); + // image = croppedFile; + + // Resize the image + final rawImage = + img.decodeImage(File(croppedFile!.path).readAsBytesSync()); + final resizedImage = + img.copyResize(rawImage!, width: 800); // Adjust the width as needed + + final appDir = await getTemporaryDirectory(); + final resizedImagePath = '${appDir.path}/resized_image.jpg'; + + final resizedImageFile = File(resizedImagePath); + resizedImageFile.writeAsBytesSync( + img.encodeJpg(resizedImage)); // Save the resized image as JPEG + + image = resizedImageFile; + update(); + } + } + + DocumentType checkDocumentType(String text) { + // Convert text to lowercase and remove all spaces and new lines + text = text.toLowerCase().replaceAll(RegExp(r'\s+'), ''); + + // Keywords for each document type + final Map> keywords = { + DocumentType.carLicenseBack: ['شاسيه', 'موتور', 'سم٣'], + DocumentType.carLicenseFront: ['وزارةالداخلية', 'رخصةتسيير'], + DocumentType.idCardFront: [ + 'بطاقةتحقيقالشخصية', + 'بطاقة تحقيق الشخصية', + 'تحقيق' + ], + DocumentType.idCardBack: ['البطاقةساريةحتى'], + DocumentType.driverLicense: ['قيادةخاصة', 'خاصه', 'قيادة'], + DocumentType.nonIdCardFront: ['Foreign Residence Card', 'أجنبي', 'جواز'], + DocumentType.nonIdCardBack: [ + 'نوع الإقامة', + 'الإقامة', + 'Cardexpiresbyendofresidencepermit' + ], + }; + + // Check each document type + for (var entry in keywords.entries) { + if (entry.value.any((keyword) => text.contains(keyword))) { + return entry.key; + } + } + + // If no match is found + return DocumentType.unknown; + } + + // تحفّظ كل استجابة على حدة + Map idFrontSy = {}; + Map idBackSy = {}; + Map licenceFrontSy = {}; + Map licenceBackSy = {}; + Map vehicleFrontSy = {}; + Map vehicleBackSy = {}; + bool isLoadingidFrontSy = false; + bool isLoadingidBackSy = false; + bool isLoadingLicenceFrontSy = false; + bool isLoadingLicenceBackSy = false; + bool isLoadingVehicleFrontSy = false; + bool isLoadingVehicleBackSy = false; + Future sendToAI(String type, {required File imageFile}) async { + final headers = { + 'Authorization': + 'Bearer ${r(box.read(BoxName.jwt)).split(AppInformation.addd)[0]}', + 'X-HMAC-Auth': '${box.read(BoxName.hmac)}', + }; + final driverID = box.read(BoxName.driverID) ?? 'eddfdfdgfd'; + + if (driverID == null) { + MyDialog() + .getDialog("Error".tr, "User not logged in".tr, () => Get.back()); + return; + } + + try { + isloading = true; + update(); + + final uri = Uri.parse(AppLink.uploadImageToAi); // سكربتك الجديد + final request = http.MultipartRequest("POST", uri); + request.headers.addAll(headers); + request.files + .add(await http.MultipartFile.fromPath("image", imageFile.path)); + request.fields['driver_id'] = driverID; + request.fields['type'] = type; + + final response = await request.send(); + final result = await http.Response.fromStream(response); + + if (result.statusCode == 200) { + final responseData = jsonDecode(result.body); + if (responseData['message'] != null && + responseData['message']['data'] != null) { + // final imageUrl = responseData['message']['image_url']; + final data = responseData['message']['data']; + + switch (type) { + case 'id_front_sy': + idFrontSy = data; + isLoadingidFrontSy = false; + update(); + break; + case 'id_back_sy': + idBackSy = data; + + isLoadingidBackSy = false; + update(); + break; + case 'driving_license_sy_front': + licenceFrontSy = data; + isLoadingLicenceFrontSy = false; + update(); + break; + case 'driving_license_sy_back': + licenceBackSy = data; + isLoadingLicenceBackSy = false; + update(); + break; + case 'vehicle_license_sy_front': + vehicleFrontSy = data; + isLoadingVehicleFrontSy = false; + update(); + break; + case 'vehicle_license_sy_back': + vehicleBackSy = data; + isLoadingVehicleBackSy = false; + update(); + break; + } + + isloading = false; + update(); + } else { + MyDialog().getDialog( + "Error".tr, "AI failed to extract info".tr, () => Get.back()); + } + } else { + MyDialog() + .getDialog("Error".tr, "Upload or AI failed".tr, () => Get.back()); + } + } catch (e) { + isloading = false; + update(); + MyDialog().getDialog("Error".tr, e.toString(), () => Get.back()); + } + } + + Future pickAndSendImage(String type) async { + final picker = ImagePicker(); + final pickedImage = await picker.pickImage(source: ImageSource.camera); + if (pickedImage != null) { + image = File(pickedImage.path); + // Crop the image + croppedFile = await ImageCropper().cropImage( + sourcePath: image!.path, + uiSettings: [ + AndroidUiSettings( + toolbarTitle: 'Cropper'.tr, + toolbarColor: AppColor.accentColor, + toolbarWidgetColor: AppColor.redColor, + initAspectRatio: CropAspectRatioPreset.original, + lockAspectRatio: false), + IOSUiSettings( + title: 'Cropper'.tr, + ), + ], + ); + // image = croppedFile; + + // Resize the image + final rawImage = + img.decodeImage(File(croppedFile!.path).readAsBytesSync()); + final resizedImage = + img.copyResize(rawImage!, width: 800); // Adjust the width as needed + + final appDir = await getTemporaryDirectory(); + final resizedImagePath = '${appDir.path}/resized_image.jpg'; + + final resizedImageFile = File(resizedImagePath); + resizedImageFile.writeAsBytesSync( + img.encodeJpg(resizedImage)); // Save the resized image as JPEG + + image = resizedImageFile; + update(); + + await sendToAI(type, imageFile: File(image.path)); + } + } + + Future allMethodForAI( + String prompt, String linkPHP, String imagePath) async { + isLoading = true; + update(); + + try { + await ImageController().choosImage(linkPHP, imagePath); + + // if (imagePath == 'driver_license') { + // await ImageController().choosFaceFromDriverLicense(linkPHP, 'face'); + // } + + await Future.delayed(const Duration(seconds: 2)); + + var extractedString = + await CRUD().arabicTextExtractByVisionAndAI(imagePath: imagePath); + var json = jsonDecode(extractedString); + var textValues = CRUD().extractTextFromLines(json); + + DocumentType detectedType = checkDocumentType(textValues); + String expectedDocument = getExpectedDocument(imagePath); + String detectedDocument = getDetectedDocument(detectedType); + + bool isCorrectDocument = (detectedType == getExpectedType(imagePath)); + + if (!isCorrectDocument) { + MyDialog().getDialog('incorrect_document_title'.tr, + '${'expected'.tr}: $expectedDocument\n${'detected'.tr}: $detectedDocument', + () { + Get.back(); + }); + } else { + // Process the correct document + await Get.put(AI()).anthropicAI(textValues, prompt, imagePath); + } + } catch (e) { + MyDialog().getDialog('error'.tr, 'error_processing_document'.tr, () { + Get.back(); + }); + } finally { + isLoading = false; + update(); + } + } + + Future allMethodForAINewCar( + String prompt, String linkPHP, String imagePath, String carID) async { + isLoading = true; + update(); + + try { + await ImageController().choosImageNewCAr(linkPHP, imagePath); + + // if (imagePath == 'driver_license') { + // await ImageController().choosFaceFromDriverLicense(linkPHP, 'face'); + // } + + await Future.delayed(const Duration(seconds: 2)); + + var extractedString = + await CRUD().arabicTextExtractByVisionAndAI(imagePath: imagePath); + var json = jsonDecode(extractedString); + var textValues = CRUD().extractTextFromLines(json); + + DocumentType detectedType = checkDocumentType(textValues); + String expectedDocument = getExpectedDocument(imagePath); + String detectedDocument = getDetectedDocument(detectedType); + + bool isCorrectDocument = (detectedType == getExpectedType(imagePath)); + + if (!isCorrectDocument) { + MyDialog().getDialog('incorrect_document_title'.tr, + '${'expected'.tr}: $expectedDocument\n${'detected'.tr}: $detectedDocument', + () { + Get.back(); + }); + } else { + // Process the correct document + await Get.put(AI()).anthropicAI(textValues, prompt, imagePath); + } + } catch (e) { + MyDialog().getDialog('error'.tr, 'error_processing_document'.tr, () { + Get.back(); + }); + } finally { + isLoading = false; + update(); + } + } + + String getExpectedDocument(String imagePath) { + switch (imagePath) { + case 'car_front': + return 'car_license_front'.tr; + case 'car_back': + return 'car_license_back'.tr; + case 'id_back': + return 'id_card_back'.tr; + case 'id_front': + return 'id_card_front'.tr; + case 'driver_license': + return 'driver_license'.tr; + default: + return 'unknown_document'.tr; + } + } + + DocumentType getExpectedType(String imagePath) { + switch (imagePath) { + case 'car_front': + return DocumentType.carLicenseFront; + case 'car_back': + return DocumentType.carLicenseBack; + case 'id_back': + return DocumentType.idCardBack; + case 'id_front': + return DocumentType.idCardFront; + case 'driver_license': + return DocumentType.driverLicense; + default: + return DocumentType.unknown; + } + } + + String getDetectedDocument(DocumentType type) { + switch (type) { + case DocumentType.carLicenseFront: + return 'car_license_front'.tr; + case DocumentType.carLicenseBack: + return 'car_license_back'.tr; + case DocumentType.idCardFront: + return 'id_card_front'.tr; + case DocumentType.idCardBack: + return 'id_card_back'.tr; + case DocumentType.nonIdCardFront: + return 'non_id_card_front'.tr; + case DocumentType.nonIdCardBack: + return 'non_id_card_back'.tr; + case DocumentType.driverLicense: + return 'driver_license'.tr; + default: + return 'unknown_document'.tr; + } + } + + Future generateContent() async { + await pickImage(); + if (image != null) { + final imageBytes = await image.readAsBytes(); + final imageData = base64Encode(imageBytes); + + var requestBody = jsonEncode({ + 'contents': [ + { + 'parts': [ + { + 'inlineData': { + 'mimeType': 'image/jpeg', + 'data': imageData, + }, + }, + { + 'text': + 'write json for all data as first name ,last name,dob,licenseID,expiration date,issued date asdress class type ,output json type', + }, + ], + }, + ], + 'generationConfig': { + 'temperature': 0.4, + 'topK': 32, + 'topP': 1, + 'maxOutputTokens': 4096, + 'stopSequences': [], + }, + 'safetySettings': [ + { + 'category': 'HARM_CATEGORY_HARASSMENT', + 'threshold': 'BLOCK_MEDIUM_AND_ABOVE', + }, + { + 'category': 'HARM_CATEGORY_HATE_SPEECH', + 'threshold': 'BLOCK_MEDIUM_AND_ABOVE', + }, + { + 'category': 'HARM_CATEGORY_SEXUALLY_EXPLICIT', + 'threshold': 'BLOCK_MEDIUM_AND_ABOVE', + }, + { + 'category': 'HARM_CATEGORY_DANGEROUS_CONTENT', + 'threshold': 'BLOCK_MEDIUM_AND_ABOVE', + }, + ], + }); + + final response = await http.post( + Uri.parse( + 'https://generativelanguage.googleapis.com/v1beta/models/gemini-pro-vision:generateContent?key=${AK.geminiApi}'), + headers: {'Content-Type': 'application/json'}, + body: requestBody, + ); + + if (response.statusCode == 200) { + var responseData = jsonDecode(response.body); + // Process the responseData as needed + + var result = + responseData['candidates'][0]['content']['parts'][0]['text']; + RegExp regex = RegExp(r"```json([^`]*)```"); + String? jsonString = + regex.firstMatch(responseData.toString())?.group(1)?.trim(); + + if (jsonString != null) { + // Convert the JSON object to a String + jsonString = jsonEncode(json.decode(jsonString)); + } else {} + + // Rest of your code... + } else {} + } else {} + } + + Future getComplaintDataToAI() async { + var res = await CRUD().get( + link: AppLink.getComplaintAllDataForDriver, + payload: {'driver_id': box.read(BoxName.driverID).toString()}, + ); + if (res != 'failure') { + var d = jsonDecode(res)['message']; + return d; + } else { + return [ + {'data': 'no data'} + ]; + } + } + + Future anthropicAIForComplaint() async { + var dataComplaint = await getComplaintDataToAI(); + var messagesData = [ + { + "role": "user", + "content": [ + { + "type": "text", + "text": "$dataComplaint ${AppInformation.complaintPrompt} " + } + ] + } + ]; + var requestBody = jsonEncode({ + "model": "claude-3-haiku-20240307", + "max_tokens": 1024, + "temperature": 0, + "system": "Json output only without any additional ", + "messages": messagesData, + }); + final response = await http.post( + Uri.parse('https://api.anthropic.com/v1/messages'), + headers: { + 'x-api-key': AK.anthropicAIkeySeferNew, + 'anthropic-version': '2023-06-01', + 'content-type': 'application/json' + }, + body: requestBody, + ); + if (response.statusCode == 200) { + var responseData = jsonDecode(utf8.decode(response.bodyBytes)); + // Process the responseData as needed + + responseForComplaint = jsonDecode(responseData['content'][0]['text']); + } + } + + Future anthropicAI( + String payload, String prompt, String idType) async { + var messagesData = [ + { + "role": "user", + "content": [ + {"type": "text", "text": "$payload $prompt"} + ] + } + ]; + var k = X.r(X.r(X.r(await getAIKey('CLAUDAISEFER'), cn), cC), cs); + var requestBody = jsonEncode({ + "model": "claude-3-haiku-20240307", + "max_tokens": 1024, + "temperature": 0, + "system": "Json output only without any additional ", + "messages": messagesData, + }); + + final response = await http.post( + Uri.parse('https://api.anthropic.com/v1/messages'), + headers: { + 'x-api-key': k, + 'anthropic-version': '2023-06-01', + 'content-type': 'application/json' + }, + body: requestBody, + ); + + if (response.statusCode == 200) { + var responseData = jsonDecode(utf8.decode(response.bodyBytes)); + // Process the responseData as needed + if (idType == 'car_back') { + responseIdCardDriverEgyptBack = + jsonDecode(responseData['content'][0]['text']); + } else if (idType == 'car_front') { + responseIdCardDriverEgyptFront = + jsonDecode(responseData['content'][0]['text']); + } else if (idType == 'id_front') { + responseIdEgyptFront = jsonDecode(responseData['content'][0]['text']); + } else if (idType == 'id_back') { + responseIdEgyptBack = jsonDecode(responseData['content'][0]['text']); + } else if (idType == 'driver_license') { + responseIdEgyptDriverLicense = + jsonDecode(responseData['content'][0]['text']); + } else if (idType == 'criminalRecord') { + responseCriminalRecordEgypt = + jsonDecode(responseData['content'][0]['text']); + } else if (idType == 'non_id_front') { + responseNonIdCardFront = jsonDecode(responseData['content'][0]['text']); + } else if (idType == 'non_id_back') { + responseNonIdCardBack = jsonDecode(responseData['content'][0]['text']); + } + + update(); + return responseData.toString(); + } + return responseIdCardDriverEgyptBack.toString(); + } + + Future geminiAiExtraction(String prompt, payload, String idType) async { + var requestBody = jsonEncode({ + "contents": [ + { + "parts": [ + {"text": "$payload $prompt"} + ] + } + ], + "generationConfig": { + "temperature": 1, + "topK": 64, + "topP": 0.95, + "maxOutputTokens": 8192, + "stopSequences": [] + }, + "safetySettings": [ + { + "category": "HARM_CATEGORY_HARASSMENT", + "threshold": "BLOCK_MEDIUM_AND_ABOVE" + }, + { + "category": "HARM_CATEGORY_HATE_SPEECH", + "threshold": "BLOCK_MEDIUM_AND_ABOVE" + }, + { + "category": "HARM_CATEGORY_SEXUALLY_EXPLICIT", + "threshold": "BLOCK_MEDIUM_AND_ABOVE" + }, + { + "category": "HARM_CATEGORY_DANGEROUS_CONTENT", + "threshold": "BLOCK_MEDIUM_AND_ABOVE" + } + ] + }); + + final response = await http.post( + Uri.parse( + // 'https://generativelanguage.googleapis.com/v1beta/models/gemini-pro-vision:generateContent?key=${AK.geminiApi}'), + // 'https://generativelanguage.googleapis.com/v1beta/models/gemini-1.5-pro-latest:generateContent?key=${AK.geminiApi}'), + 'https://generativelanguage.googleapis.com/v1beta/models/gemini-1.0-pro:generateContent?key=${AK.geminiApi}'), + headers: {'Content-Type': 'application/json'}, + body: requestBody, + ); + + if (response.statusCode == 200) { + var responseData = jsonDecode(response.body); + // Process the responseData as needed + + var result = responseData['candidates'][0]['content']['parts'][0]['text']; + RegExp regex = RegExp(r"```json([^`]*)```"); + String? jsonString = + regex.firstMatch(responseData.toString())?.group(1)?.trim(); + + if (jsonString != null) { + // Convert the JSON object to a String + jsonString = jsonEncode(json.decode(jsonString)); + + if (idType == 'car_back') { + responseIdCardDriverEgyptBack = jsonDecode(jsonString); + } else if (idType == 'car_front') { + responseIdCardDriverEgyptFront = jsonDecode(jsonString); + } else if (idType == 'id_front') { + responseIdEgyptFront = jsonDecode(jsonString); + } else if (idType == 'id_back') { + responseIdEgyptBack = jsonDecode(jsonString); + } else if (idType == 'driver_license') { + responseIdEgyptDriverLicense = jsonDecode(jsonString); + } else if (idType == 'non_id_front') { + responseNonIdCardFront = + jsonDecode(responseData['content'][0]['text']); + } else if (idType == 'non_id_back') { + responseNonIdCardBack = + jsonDecode(responseData['content'][0]['text']); + } + + update(); + } else { + mySnackeBarError("JSON string not found"); + } + + // Rest of your code... + } else {} + } + + Future getDriverLicenseJordanContent() async { + await pickImage(); + isloading = true; + update(); + if (image != null) { + final imageBytes = await image.readAsBytes(); + final imageData = base64Encode(imageBytes); + + var requestBody = jsonEncode({ + 'contents': [ + { + 'parts': [ + { + 'inlineData': { + 'mimeType': 'image/jpeg', + 'data': imageData, + }, + }, + { + 'text': + 'write json for all data as first name ,last name,dob,id ,expiration date,issued date asdress class type,age in years ,output json type in arabic value and stay engish key and make date format like YYYY-MM-DD , for name please extract name in arabic in Name in json plus first_name ', + }, + ], + }, + ], + 'generationConfig': { + 'temperature': 0.4, + 'topK': 32, + 'topP': 1, + 'maxOutputTokens': 4096, + 'stopSequences': [], + }, + 'safetySettings': [ + { + 'category': 'HARM_CATEGORY_HARASSMENT', + 'threshold': 'BLOCK_MEDIUM_AND_ABOVE', + }, + { + 'category': 'HARM_CATEGORY_HATE_SPEECH', + 'threshold': 'BLOCK_MEDIUM_AND_ABOVE', + }, + { + 'category': 'HARM_CATEGORY_SEXUALLY_EXPLICIT', + 'threshold': 'BLOCK_MEDIUM_AND_ABOVE', + }, + { + 'category': 'HARM_CATEGORY_DANGEROUS_CONTENT', + 'threshold': 'BLOCK_MEDIUM_AND_ABOVE', + }, + ], + }); + + final response = await http.post( + Uri.parse( + 'https://generativelanguage.googleapis.com/v1beta/models/gemini-pro-vision:generateContent?key=${AK.geminiApi}'), + headers: {'Content-Type': 'application/json'}, + body: requestBody, + ); + isloading = false; + update(); + if (response.statusCode == 200) { + var responseData = jsonDecode(response.body); + // Process the responseData as needed + + var result = + responseData['candidates'][0]['content']['parts'][0]['text']; + RegExp regex = RegExp(r"```json([^`]*)```"); + String? jsonString = + regex.firstMatch(responseData.toString())?.group(1)?.trim(); + + if (jsonString != null) { + // Convert the JSON object to a String + jsonString = jsonEncode(json.decode(jsonString)); + responseMap = jsonDecode(jsonString); + } else {} + + // Rest of your code... + } else {} + } else {} + } + + Future getCarLicenseJordanContent() async { + await pickImage(); + isloading = true; + update(); + if (image != null) { + final imageBytes = await image.readAsBytes(); + final imageData = base64Encode(imageBytes); + + var requestBody = jsonEncode({ + 'contents': [ + { + 'parts': [ + { + 'inlineData': { + 'mimeType': 'image/jpeg', + 'data': imageData, + }, + }, + { + 'text': + '''Extract the following information from the front face of the Jordanian ID card: +Name +National ID number +Gender +Date of birth +Output the extracted information in the following JSON format''', + }, + ], + }, + ], + 'generationConfig': { + 'temperature': 0.4, + 'topK': 32, + 'topP': 1, + 'maxOutputTokens': 4096, + 'stopSequences': [], + }, + 'safetySettings': [ + { + 'category': 'HARM_CATEGORY_HARASSMENT', + 'threshold': 'BLOCK_MEDIUM_AND_ABOVE', + }, + { + 'category': 'HARM_CATEGORY_HATE_SPEECH', + 'threshold': 'BLOCK_MEDIUM_AND_ABOVE', + }, + { + 'category': 'HARM_CATEGORY_SEXUALLY_EXPLICIT', + 'threshold': 'BLOCK_MEDIUM_AND_ABOVE', + }, + { + 'category': 'HARM_CATEGORY_DANGEROUS_CONTENT', + 'threshold': 'BLOCK_MEDIUM_AND_ABOVE', + }, + ], + }); + + final response = await http.post( + Uri.parse( + // 'https://${API_ENDPOINT}/v1/projects/${PROJECT_ID}/locations/${LOCATION_ID}/publishers/google/models/${MODEL_ID}:streamGenerateContent'), + 'https://generativelanguage.googleapis.com/v1beta/models/gemini-pro-vision:generateContent?key=${AK.geminiApi}'), + headers: {'Content-Type': 'application/json'}, + body: requestBody, + ); + isloading = false; + update(); + if (response.statusCode == 200) { + var responseData = jsonDecode(response.body); + // Process the responseData as needed + + var result = + responseData['candidates'][0]['content']['parts'][0]['text']; + RegExp regex = RegExp(r"```json([^`]*)```"); + String? jsonString = + regex.firstMatch(responseData.toString())?.group(1)?.trim(); + + if (jsonString != null) { + // Convert the JSON object to a String + jsonString = jsonEncode(json.decode(jsonString)); + responseCarLicenseMapJordan = jsonDecode(jsonString); + } else {} + + // Rest of your code... + } else {} + } else {} + } + + Future jordanID() async { + await pickImage(); + isloading = true; + update(); + if (image != null) { + final imageBytes = await image.readAsBytes(); + final imageData = base64Encode(imageBytes); + + var requestBody = jsonEncode({ + 'contents': [ + { + 'parts': [ + { + 'inlineData': { + 'mimeType': 'image/jpeg', + 'data': imageData, + }, + }, + { + 'text': + '''Extract the following information from the front face of the Jordanian ID card: +Name +National ID number +Gender +Date of birth +Output the extracted information in the following JSON format''', + }, + ], + }, + ], + 'generationConfig': { + 'temperature': 0.4, + 'topK': 32, + 'topP': 1, + 'maxOutputTokens': 4096, + 'stopSequences': [], + }, + 'safetySettings': [ + { + 'category': 'HARM_CATEGORY_HARASSMENT', + 'threshold': 'BLOCK_MEDIUM_AND_ABOVE', + }, + { + 'category': 'HARM_CATEGORY_HATE_SPEECH', + 'threshold': 'BLOCK_MEDIUM_AND_ABOVE', + }, + { + 'category': 'HARM_CATEGORY_SEXUALLY_EXPLICIT', + 'threshold': 'BLOCK_MEDIUM_AND_ABOVE', + }, + { + 'category': 'HARM_CATEGORY_DANGEROUS_CONTENT', + 'threshold': 'BLOCK_MEDIUM_AND_ABOVE', + }, + ], + }); + + final response = await http.post( + Uri.parse( + 'https://generativelanguage.googleapis.com/v1beta/models/gemini-pro-vision:generateContent?key=${AK.geminiApi}'), + headers: {'Content-Type': 'application/json'}, + body: requestBody, + ); + isloading = false; + update(); + if (response.statusCode == 200) { + var responseData = jsonDecode(response.body); + // Process the responseData as needed + + var result = + responseData['candidates'][0]['content']['parts'][0]['text']; + RegExp regex = RegExp(r"```json([^`]*)```"); + String? jsonString = + regex.firstMatch(responseData.toString())?.group(1)?.trim(); + + if (jsonString != null) { + // Convert the JSON object to a String + jsonString = jsonEncode(json.decode(jsonString)); + responseCarLicenseMapJordan = jsonDecode(jsonString); + } else {} + + // Rest of your code... + } else {} + } else {} + } + + Future carLicenseJordan() async { + await pickImage(); + isloading = true; + update(); + if (image != null) { + final imageBytes = await image.readAsBytes(); + final imageData = base64Encode(imageBytes); + + var requestBody = jsonEncode({ + 'contents': [ + { + 'parts': [ + { + 'inlineData': { + 'mimeType': 'image/jpeg', + 'data': imageData, + }, + }, + { + 'text': + '''Extract the following information from the front face of the car license card in Jordan: + +* name +* Address +* Vehicle type +* car_kind +* car_color +* Vehicle category +* car_year +* car_plate +* Registration type +* Usage type +* expire_date_of_license + +Output the extracted information in the following JSON formate and make date format like YYYY-MM-DD''', + }, + ], + }, + ], + 'generationConfig': { + 'temperature': 0.4, + 'topK': 32, + 'topP': 1, + 'maxOutputTokens': 4096, + 'stopSequences': [], + }, + 'safetySettings': [ + { + 'category': 'HARM_CATEGORY_HARASSMENT', + 'threshold': 'BLOCK_MEDIUM_AND_ABOVE', + }, + { + 'category': 'HARM_CATEGORY_HATE_SPEECH', + 'threshold': 'BLOCK_MEDIUM_AND_ABOVE', + }, + { + 'category': 'HARM_CATEGORY_SEXUALLY_EXPLICIT', + 'threshold': 'BLOCK_MEDIUM_AND_ABOVE', + }, + { + 'category': 'HARM_CATEGORY_DANGEROUS_CONTENT', + 'threshold': 'BLOCK_MEDIUM_AND_ABOVE', + }, + ], + }); + + final response = await http.post( + Uri.parse( + 'https://generativelanguage.googleapis.com/v1beta/models/gemini-1.0-pro-vision-latest:generateContent?key=${AK.geminiApi}'), + headers: {'Content-Type': 'application/json'}, + body: requestBody, + ); + isloading = false; + update(); + if (response.statusCode == 200) { + var responseData = jsonDecode(response.body); + // Process the responseData as needed + + var result = + responseData['candidates'][0]['content']['parts'][0]['text']; + RegExp regex = RegExp(r"```json([^`]*)```"); + String? jsonString = + regex.firstMatch(responseData.toString())?.group(1)?.trim(); + + if (jsonString != null) { + // Convert the JSON object to a String + jsonString = jsonEncode(json.decode(jsonString)); + responseCarLicenseMapJordan = jsonDecode(jsonString); + } else {} + + // Rest of your code... + } else {} + } else {} + } + + Future getTextFromCard(String prompt) async { + await pickImage(); + isloading = true; + update(); + if (image != null) { + final imageBytes = await image.readAsBytes(); + final imageData = base64Encode(imageBytes); + + var requestBody = jsonEncode({ + 'contents': [ + { + 'parts': [ + { + 'inlineData': { + 'mimeType': 'image/jpeg', + 'data': imageData, + }, + }, + { + 'text': prompt, + }, + ], + }, + ], + 'generationConfig': { + "temperature": 1, + "topK": 32, + "topP": 0.1, + "maxOutputTokens": 4096, + "stopSequences": [] + }, + 'safetySettings': [ + { + 'category': 'HARM_CATEGORY_HARASSMENT', + 'threshold': 'BLOCK_MEDIUM_AND_ABOVE', + }, + { + 'category': 'HARM_CATEGORY_HATE_SPEECH', + 'threshold': 'BLOCK_MEDIUM_AND_ABOVE', + }, + { + 'category': 'HARM_CATEGORY_SEXUALLY_EXPLICIT', + 'threshold': 'BLOCK_MEDIUM_AND_ABOVE', + }, + { + 'category': 'HARM_CATEGORY_DANGEROUS_CONTENT', + 'threshold': 'BLOCK_MEDIUM_AND_ABOVE', + }, + ], + }); + + final response = await http.post( + Uri.parse( + 'https://generativelanguage.googleapis.com/v1beta/models/gemini-1.0-pro-vision-latest:generateContent?key=${AK.geminiApi}'), + headers: {'Content-Type': 'application/json'}, + body: requestBody, + ); + isloading = false; + update(); + if (response.statusCode == 200) { + var responseData = jsonDecode(response.body); + // Process the responseData as needed + + var result = + responseData['candidates'][0]['content']['parts'][0]['text']; + RegExp regex = RegExp(r"```json([^`]*)```"); + String? jsonString = + regex.firstMatch(responseData.toString())?.group(1)?.trim(); + + if (jsonString != null) { + // Convert the JSON object to a String + jsonString = jsonEncode(json.decode(jsonString)); + responseBackCarLicenseMap = jsonDecode(jsonString); + } else {} + + // Rest of your code... + } else {} + } else {} + } + + Future generateBackCarLicenseJordanContent() async { + await pickImage(); + isloading = true; + update(); + if (image != null) { + final imageBytes = await image.readAsBytes(); + final imageData = base64Encode(imageBytes); + + var requestBody = jsonEncode({ + 'contents': [ + { + 'parts': [ + { + 'inlineData': { + 'mimeType': 'image/jpeg', + 'data': imageData, + }, + }, + { + 'text': + 'write json output from extracting car license back face for these key ,vin,fuelType,passengerType,curbWeight,insuranceCompany,policyNumber,notes,insuranceType and output it json .dont add data else this image', + }, + ], + }, + ], + 'generationConfig': { + 'temperature': 0.4, + 'topK': 343, + 'topP': 1, + 'maxOutputTokens': 4096, + 'stopSequences': [], + }, + 'safetySettings': [ + { + 'category': 'HARM_CATEGORY_HARASSMENT', + 'threshold': 'BLOCK_MEDIUM_AND_ABOVE', + }, + { + 'category': 'HARM_CATEGORY_HATE_SPEECH', + 'threshold': 'BLOCK_MEDIUM_AND_ABOVE', + }, + { + 'category': 'HARM_CATEGORY_SEXUALLY_EXPLICIT', + 'threshold': 'BLOCK_MEDIUM_AND_ABOVE', + }, + { + 'category': 'HARM_CATEGORY_DANGEROUS_CONTENT', + 'threshold': 'BLOCK_MEDIUM_AND_ABOVE', + }, + ], + }); + + final response = await http.post( + Uri.parse( + 'https://generativelanguage.googleapis.com/v1beta/models/gemini-pro-vision:generateContent?key=${AK.geminiApi}'), + headers: {'Content-Type': 'application/json'}, + body: requestBody, + ); + isloading = false; + update(); + if (response.statusCode == 200) { + var responseData = jsonDecode(response.body); + // Process the responseData as needed + + var result = + responseData['candidates'][0]['content']['parts'][0]['text']; + RegExp regex = RegExp(r"```json([^`]*)```"); + String? jsonString = + regex.firstMatch(responseData.toString())?.group(1)?.trim(); + + if (jsonString != null) { + // Convert the JSON object to a String + jsonString = jsonEncode(json.decode(jsonString)); + responseBackCarLicenseMap = jsonDecode(jsonString); + } else {} + + // Rest of your code... + } else {} + } else {} + } + + Future getFromCarRegistration() async { + await pickImage(); + if (image != null) { + final imageBytes = await image.readAsBytes(); + final imageData = base64Encode(imageBytes); + + var requestBody = jsonEncode({ + 'contents': [ + { + 'parts': [ + { + 'inlineData': { + 'mimeType': 'image/jpeg', + 'data': imageData, + }, + }, + { + 'text': + 'write output json from image for[ vin, make, model, year, expiration_date, color, owner, registration_date ],output json type ', + }, + ], + }, + ], + 'generationConfig': { + 'temperature': 0.4, + 'topK': 32, + 'topP': 1, + 'maxOutputTokens': 4096, + 'stopSequences': [], + }, + 'safetySettings': [ + { + 'category': 'HARM_CATEGORY_HARASSMENT', + 'threshold': 'BLOCK_MEDIUM_AND_ABOVE', + }, + { + 'category': 'HARM_CATEGORY_HATE_SPEECH', + 'threshold': 'BLOCK_MEDIUM_AND_ABOVE', + }, + { + 'category': 'HARM_CATEGORY_SEXUALLY_EXPLICIT', + 'threshold': 'BLOCK_MEDIUM_AND_ABOVE', + }, + { + 'category': 'HARM_CATEGORY_DANGEROUS_CONTENT', + 'threshold': 'BLOCK_MEDIUM_AND_ABOVE', + }, + ], + }); + + final response = await http.post( + Uri.parse( + 'https://generativelanguage.googleapis.com/v1beta/models/gemini-pro-vision:generateContent?key=${AK.geminiApi}'), + headers: {'Content-Type': 'application/json'}, + body: requestBody, + ); + + if (response.statusCode == 200) { + var responseData = jsonDecode(response.body); + // Process the responseData as needed + var result = + responseData['candidates'][0]['content']['parts'][0]['text']; + RegExp regex = RegExp(r"```json([^`]*)```"); + String? jsonString = + regex.firstMatch(responseData.toString())?.group(1)?.trim(); + + if (jsonString != null) { + // Convert the JSON object to a String + jsonString = jsonEncode(json.decode(jsonString)); + } else {} + + // Rest of your code... + } else {} + } else {} + } + + List prompts = []; + getPrompt() async { + var res = await CRUD() + .get(link: AppLink.getPromptDriverDocumentsEgypt, payload: {}); + if (res != 'failure') { + var d = jsonDecode(res)['message']; + prompts = d; + } else {} + } + + getAIKey(String key) async { + var res = + await CRUD().get(link: AppLink.getapiKey, payload: {"keyName": key}); + if (res != 'failure') { + var d = jsonDecode(res)['message']; + return d[key].toString(); + } else {} + } + + @override + void onInit() { + getPrompt(); + super.onInit(); + } +} diff --git a/siro_driver/lib/controller/functions/geolocation.dart b/siro_driver/lib/controller/functions/geolocation.dart new file mode 100755 index 0000000..2e191bf --- /dev/null +++ b/siro_driver/lib/controller/functions/geolocation.dart @@ -0,0 +1,34 @@ +import 'package:geolocator/geolocator.dart'; + +class GeoLocation { + Future getCurrentLocation() async { + bool serviceEnabled; + LocationPermission permission; + + // Check if location services are enabled. + serviceEnabled = await Geolocator.isLocationServiceEnabled(); + if (!serviceEnabled) { + // Location services are not enabled, so we request the user to enable it. + return Future.error('Location services are disabled.'); + } + + permission = await Geolocator.checkPermission(); + if (permission == LocationPermission.denied) { + permission = await Geolocator.requestPermission(); + if (permission == LocationPermission.denied) { + // Permissions are denied, we cannot fetch the location. + return Future.error('Location permissions are denied'); + } + } + + if (permission == LocationPermission.deniedForever) { + // Permissions are denied forever, we cannot request permissions. + return Future.error( + 'Location permissions are permanently denied, we cannot request permissions.'); + } + + // When we reach here, permissions are granted and we can fetch the location. + return await Geolocator.getCurrentPosition( + desiredAccuracy: LocationAccuracy.high); + } +} diff --git a/siro_driver/lib/controller/functions/launch.dart b/siro_driver/lib/controller/functions/launch.dart new file mode 100755 index 0000000..88aa269 --- /dev/null +++ b/siro_driver/lib/controller/functions/launch.dart @@ -0,0 +1,123 @@ +import 'package:url_launcher/url_launcher.dart'; +import 'dart:io'; +import 'package:get/get.dart'; +import 'package:siro_driver/views/widgets/error_snakbar.dart'; + +void showInBrowser(String url) async { + if (await canLaunchUrl(Uri.parse(url))) { + launchUrl(Uri.parse(url)); + } else {} +} + +String cleanAndFormatPhoneNumber(String phoneNumber) { + // 1. Clean the number + String formattedNumber = phoneNumber.replaceAll(RegExp(r'\s+'), ''); + + // 2. Format logic (Syria/Egypt/International) + if (formattedNumber.length > 6) { + if (formattedNumber.startsWith('09')) { + formattedNumber = '+963${formattedNumber.substring(1)}'; + } else if (formattedNumber.startsWith('01') && formattedNumber.length == 11) { + formattedNumber = '+20${formattedNumber.substring(1)}'; + } else if (formattedNumber.startsWith('00')) { + formattedNumber = '+${formattedNumber.substring(2)}'; + } else if (!formattedNumber.startsWith('+')) { + formattedNumber = '+$formattedNumber'; + } + } + return formattedNumber; +} + +Future makePhoneCall(String phoneNumber) async { + String formattedNumber = cleanAndFormatPhoneNumber(phoneNumber); + + if (!formattedNumber.startsWith('+963')) { + mySnackeBarError("Calling non-Syrian numbers is not supported".tr); + return; + } + + // Create URI directly from String to avoid double encoding '+' as '%2B' + final Uri launchUri = Uri.parse('tel:$formattedNumber'); + + // 4. Execute with externalApplication mode + try { + if (!await launchUrl(launchUri, mode: LaunchMode.externalApplication)) { + throw 'Could not launch $launchUri'; + } + } catch (e) { + if (await canLaunchUrl(launchUri)) { + await launchUrl(launchUri); + } else { + print("Cannot launch url: $launchUri"); + } + } +} + +void launchCommunication( + String method, String contactInfo, String message) async { + String formattedContact = cleanAndFormatPhoneNumber(contactInfo); + // WhatsApp prefers the phone number without the '+' prefix + String whatsappContact = formattedContact.replaceAll('+', ''); + String url; + + if (Platform.isIOS) { + switch (method) { + case 'phone': + if (!formattedContact.startsWith('+963')) { + mySnackeBarError("Calling non-Syrian numbers is not supported".tr); + return; + } + url = 'tel:$formattedContact'; + break; + case 'sms': + url = 'sms:$formattedContact?body=${Uri.encodeComponent(message)}'; + break; + case 'whatsapp': + url = + 'https://api.whatsapp.com/send?phone=$whatsappContact&text=${Uri.encodeComponent(message)}'; + break; + case 'email': + url = + 'mailto:$formattedContact?subject=Subject&body=${Uri.encodeComponent(message)}'; + break; + default: + return; + } + } else if (Platform.isAndroid) { + switch (method) { + case 'phone': + if (!formattedContact.startsWith('+963')) { + mySnackeBarError("Calling non-Syrian numbers is not supported".tr); + return; + } + url = 'tel:$formattedContact'; + break; + case 'sms': + url = 'sms:$formattedContact?body=${Uri.encodeComponent(message)}'; + break; + case 'whatsapp': + final bool whatsappInstalled = + await canLaunchUrl(Uri.parse('whatsapp://')); + if (whatsappInstalled) { + url = + 'whatsapp://send?phone=$whatsappContact&text=${Uri.encodeComponent(message)}'; + } else { + url = + 'https://api.whatsapp.com/send?phone=$whatsappContact&text=${Uri.encodeComponent(message)}'; + } + break; + case 'email': + url = + 'mailto:$formattedContact?subject=Subject&body=${Uri.encodeComponent(message)}'; + break; + default: + return; + } + } else { + return; + } + + if (await canLaunchUrl(Uri.parse(url))) { + await launchUrl(Uri.parse(url)); + } else {} +} diff --git a/siro_driver/lib/controller/functions/llama_ai.dart b/siro_driver/lib/controller/functions/llama_ai.dart new file mode 100755 index 0000000..57e3710 --- /dev/null +++ b/siro_driver/lib/controller/functions/llama_ai.dart @@ -0,0 +1,37 @@ +import 'dart:convert'; + +import 'package:siro_driver/constant/links.dart'; +import 'package:siro_driver/controller/functions/crud.dart'; +import 'package:siro_driver/controller/functions/gemeni.dart'; + +class LlamaAi { + Future getCarRegistrationData(String input, prompt) async { + Map exrtatDataFinal = {}; + String oneLine = input.replaceAll('\n', ' '); + // var res = await CRUD().getLlama(link: AppLink.gemini, payload: oneLine); + var res = await CRUD() + .getLlama(link: AppLink.llama, payload: oneLine, prompt: prompt); + + var decod = jsonDecode(res.toString()); + // exrtatDataFinal = jsonDecode(extractDataFromJsonString(decod['choices'])); + extractDataFromJsonString(decod['choices'][0]['message']['content']); + return exrtatDataFinal; + } + + String extractDataFromJsonString(String jsonString) { + // Remove any leading or trailing whitespace from the string + jsonString = jsonString.trim(); + + // Extract the JSON substring from the given string + final startIndex = jsonString.indexOf('{'); + final endIndex = jsonString.lastIndexOf('}'); + final jsonSubstring = jsonString.substring(startIndex, endIndex + 1); + + // Parse the JSON substring into a Map + final jsonData = jsonDecode(jsonSubstring); + + // Return the extracted data + + return jsonEncode(jsonData); + } +} diff --git a/siro_driver/lib/controller/functions/location_background_controller.dart b/siro_driver/lib/controller/functions/location_background_controller.dart new file mode 100755 index 0000000..3e75fd1 --- /dev/null +++ b/siro_driver/lib/controller/functions/location_background_controller.dart @@ -0,0 +1,85 @@ +import 'dart:io'; + +import 'package:device_info_plus/device_info_plus.dart'; +import 'package:get/get_core/src/get_main.dart'; +import 'package:get/get_navigation/src/extension_navigation.dart'; +import 'package:permission_handler/permission_handler.dart'; +import 'package:siro_driver/views/widgets/error_snakbar.dart'; +import 'package:siro_driver/views/widgets/mydialoug.dart'; + +import 'background_service.dart'; + +Future requestNotificationPermission() async { + if (Platform.isAndroid) { + final androidInfo = await DeviceInfoPlugin().androidInfo; + if (androidInfo.version.sdkInt >= 33) { + // Android 13+ + final status = await Permission.notification.request(); + if (!status.isGranted) { + print('⚠️ إذن الإشعارات مرفوض'); + return; + } + } + } + + // بعد الحصول على الإذن، ابدأ الخدمة + await BackgroundServiceHelper.startService(); +} + +class PermissionsHelper { + /// طلب إذن الإشعارات على Android 13+ + static Future requestNotificationPermission() async { + if (Platform.isAndroid) { + final androidInfo = await DeviceInfoPlugin().androidInfo; + + if (androidInfo.version.sdkInt >= 33) { + final status = await Permission.notification.request(); + + if (status.isDenied) { + print('⚠️ إذن الإشعارات مرفوض'); + mySnackbarWarning( + "يرجى منح صلاحية الإشعارات لضمان وصول الطلبات إليك"); + return false; + } + + if (status.isPermanentlyDenied) { + print('⚠️ إذن الإشعارات مرفوض بشكل دائم - افتح الإعدادات'); + mySnackbarWarning('يرجى فتح الإعدادات وتفعيل صلاحية الإشعارات'); + return false; + } + } + } + + return true; + } + + /// طلب جميع الإذونات المطلوبة + static Future requestAllPermissions() async { + // إذن الإشعارات (اختياري) + await requestNotificationPermission(); + + // 1. طلب إذن الموقع الأساسي فقط إذا كان مرفوضاً + var status = await Permission.location.status; + if (status.isDenied) { + status = await Permission.location.request(); + } + + if (status.isPermanentlyDenied) { + _showSettingsDialog('الموقع'); + return false; + } + + return status.isGranted || status.isLimited; + } + + static void _showSettingsDialog(String permissionName) { + MyDialog().getDialog( + 'صلاحية $permissionName مطلوبة', + 'لقد قمت برفض صلاحية $permissionName سابقاً. يرجى تفعيلها من الإعدادات لتمكين التطبيق من العمل.', + () async { + await openAppSettings(); + Get.back(); + }, + ); + } +} diff --git a/siro_driver/lib/controller/functions/location_controller.dart b/siro_driver/lib/controller/functions/location_controller.dart new file mode 100755 index 0000000..3367bd8 --- /dev/null +++ b/siro_driver/lib/controller/functions/location_controller.dart @@ -0,0 +1,820 @@ +import 'dart:async'; +import 'dart:convert'; +import 'dart:io'; +import 'package:flutter/material.dart'; +import 'package:get/get.dart'; +import 'package:geolocator/geolocator.dart' as geo; +import 'package:intaleq_maps/intaleq_maps.dart'; +import 'package:location/location.dart'; +import 'package:battery_plus/battery_plus.dart'; +import 'package:permission_handler/permission_handler.dart' as ph; +import 'package:socket_io_client/socket_io_client.dart' as IO; +import 'package:siro_driver/constant/table_names.dart'; +import 'package:trip_overlay_plugin/trip_overlay_plugin.dart'; +import '../../constant/box_name.dart'; +import '../../constant/links.dart'; +import '../../main.dart'; +import '../../print.dart'; +import '../firebase/local_notification.dart'; +import '../home/captin/home_captain_controller.dart'; +import '../home/captin/map_driver_controller.dart'; +import '../home/payment/captain_wallet_controller.dart'; +import 'background_service.dart'; +import 'crud.dart'; + +class LocationController extends GetxController with WidgetsBindingObserver { + // =================================================================== + // ====== Tunables ====== + // =================================================================== + static const Duration recordIntervalNormal = Duration(seconds: 3); + static const Duration uploadBatchIntervalNormal = Duration(minutes: 2); + static const Duration recordIntervalPowerSave = Duration(seconds: 10); + static const Duration uploadBatchIntervalPowerSave = Duration(minutes: 5); + + static const double lowWalletThreshold = -200; + static const int powerSaveTriggerLevel = 20; + static const int powerSaveExitLevel = 25; + + // =================================================================== + // ====== Services & Variables ====== + // =================================================================== + late final Location location = Location(); + final Battery _battery = Battery(); + + IO.Socket? socket; + bool isSocketConnected = false; + Timer? _socketHeartbeat; + + StreamSubscription? _locSub; + StreamSubscription? _batterySub; + + Timer? _recordTimer; + Timer? _uploadBatchTimer; + + late final HomeCaptainController _homeCtrl; + late final CaptainWalletController _walletCtrl; + + LatLng myLocation = LatLng( + box.read('last_lat') ?? 0.0, + box.read('last_lng') ?? 0.0, + ); + double heading = box.read('last_heading') ?? 0.0; + double speed = 0.0; + double totalDistance = 0.0; + bool _isReady = false; + bool _isPowerSavingMode = false; + + final List> _trackBuffer = []; + final List> _behaviorBuffer = []; + + LatLng? _lastPosForDistance; + LatLng? _lastRecordedRealLoc; + DateTime? _lastRecordedTime; + + LatLng? _lastSqlLoc; + double? _lastSpeed; + DateTime? _lastSpeedAt; + + @override + Future onInit() async { + super.onInit(); + Log.print('🚀 LocationController Starting...'); + + // 1. Register Lifecycle Observer + WidgetsBinding.instance.addObserver(this); + box.write(BoxName.isAppInForeground, true); + + // مراقب الحالة (Status Watcher) + box.listenKey(BoxName.statusDriverLocation, (value) { + if (value == 'blocked') { + Log.print("⛔ Driver is Blocked: Force Stopping Location Updates."); + stopLocationUpdates(); + if (socket != null && socket!.connected) { + socket!.emit('update_location', { + 'driver_id': box.read(BoxName.driverID), + 'status': 'blocked', + 'lat': myLocation.latitude, + 'lng': myLocation.longitude, + 'heading': heading, + 'speed': speed * 3.6, + 'distance': totalDistance + }); + socket!.disconnect(); + } + } + }); + + bool deps = await _awaitDependencies(); + if (!deps) return; + + _isReady = true; + + initSocket(); + await _initLocationSettings(); + _listenToBatteryChanges(); + + if (box.read(BoxName.statusDriverLocation) != 'blocked') { + await startLocationUpdates(); + } + + Log.print('✅ LocationController Initialized.'); + } + + @override + void onClose() { + WidgetsBinding.instance.removeObserver(this); + box.write(BoxName.isAppInForeground, false); + stopLocationUpdates(); + _batterySub?.cancel(); + _stopHeartbeat(); + socket?.dispose(); + super.onClose(); + } + + // =================================================================== + // 🔥 Lifecycle Manager (Fixes Freeze & Background issues) + // =================================================================== + @override + void didChangeAppLifecycleState(AppLifecycleState state) { + if (state == AppLifecycleState.resumed) { + Log.print("📱 Lifecycle: App is in FOREGROUND"); + box.write(BoxName.isAppInForeground, true); + + // إيقاف خدمة الخلفية + BackgroundServiceHelper.stopService(); + + if (socket == null || (!socket!.connected && !_isInitializingSocket)) { + Log.print("🔄 Initializing Socket on resume..."); + initSocket(); + } + } else if (state == AppLifecycleState.paused || + state == AppLifecycleState.detached) { + Log.print("📱 Lifecycle: App is in BACKGROUND"); + box.write(BoxName.isAppInForeground, false); + + // تشغيل خدمة الخلفية للأندرويد لضمان بقاء التطبيق حياً + if (!Platform.isIOS) { + BackgroundServiceHelper.startService(); + } + } + } + + Future _awaitDependencies() async { + int attempts = 0; + while (attempts < 10) { + if (Get.isRegistered() && + Get.isRegistered()) { + _homeCtrl = Get.find(); + _walletCtrl = Get.find(); + return true; + } + await Future.delayed(const Duration(milliseconds: 500)); + attempts++; + } + return false; + } + + // =================================================================== + // ====== Socket Logic (Improved) ====== + // =================================================================== + + bool _isInitializingSocket = false; + + void initSocket() { + // منع الاستدعاءات المتداخلة التي تسبب قتل الاتصال قبل اكتماله + if (_isInitializingSocket) { + Log.print("⏳ Socket is already initializing. Skipping redundant call."); + return; + } + + if (socket != null && socket!.connected) { + Log.print("✅ Socket is already connected. No need to re-init."); + return; + } + + String driverId = box.read(BoxName.driverID).toString(); + String token = box.read(BoxName.tokenDriver).toString(); + String platform = Platform.isIOS ? 'ios' : 'android'; + + _isInitializingSocket = true; + + // تنظيف السوكيت القديم فقط إذا كان موجوداً وغير متصل + if (socket != null) { + Log.print("🧹 Cleaning up old socket instance..."); + socket!.clearListeners(); + socket!.dispose(); + socket = null; + } + + Log.print( + "🟡 [LocationController] Initializing NEW Socket for Driver: $driverId"); + + try { + // العودة للـ Websocket حصراً لأنه الوحيد الذي ينجح في فتح القناة + socket = IO.io( + 'https://location.intaleq.xyz', + IO.OptionBuilder() + .setTransports(['websocket']) + .setQuery({'driver_id': driverId, 'token': token, 'EIO': '3'}) + .enableForceNew() + .build()); + + _setupSocketListeners(); + socket!.connect(); + } catch (e) { + _isInitializingSocket = false; + Log.print("❌ Socket Initialization Exception: $e"); + } + } + + void _setupSocketListeners() { + if (socket == null) return; + + socket!.off('connect'); + socket!.off('disconnect'); + socket!.off('connect_error'); + socket!.off('error'); + + socket!.onConnect((_) { + _isInitializingSocket = false; + + // ننتظر قليلاً للتأكد من تعبئة الـ IDs + Future.delayed(const Duration(milliseconds: 1000), () { + String? sid = socket?.id; + String? eid = socket?.io.engine?.id; + + Log.print( + '✅ Socket Connected! ID: ${sid ?? eid ?? 'N/A'} (SID: $sid, EID: $eid)'); + + if (sid != null || eid != null) { + isSocketConnected = true; + _startHeartbeat(); + } + }); + }); + + socket!.onDisconnect((data) { + _isInitializingSocket = false; + Log.print('❌ Socket Disconnected: $data'); + isSocketConnected = false; + _stopHeartbeat(); + }); + + socket!.onConnectError((err) { + _isInitializingSocket = false; + Log.print('❌ Socket Connect Error: $err'); + }); + + socket!.onConnectTimeout((data) { + _isInitializingSocket = false; + Log.print('❌ Socket Connect Timeout: $data'); + }); + + socket!.onError((err) { + _isInitializingSocket = false; + Log.print('❌ Socket General Error: $err'); + }); + + socket!.on('reconnect_attempt', (attempt) { + Log.print('🔄 Socket Reconnecting... Attempt: $attempt'); + }); + + // 🔥 الاستماع للطلبات الجديدة + socket!.on('new_ride_request', (data) { + Log.print("🔔 Socket: New Ride Request Arrived!"); + + // نستخدم Future.microtask لضمان عدم حظر الـ UI Thread + Future.microtask(() { + if (data != null) { + try { + List rawList = []; + if (data is String) { + var decoded = jsonDecode(data); + if (decoded is List) rawList = decoded; + } else if (data is List) { + if (data.isNotEmpty) { + rawList = (data[0] is List) ? data[0] : data; + } + } + + if (rawList.isNotEmpty) { + Map convertedMap = {}; + for (int i = 0; i < rawList.length; i++) { + convertedMap[i.toString()] = rawList[i]; + } + handleIncomingOrder(convertedMap, "Socket"); + } + } catch (e) { + Log.print("❌ Error processing socket data: $e"); + } + } + }); + }); + + // 🔥 الاستماع للإلغاء + socket!.on('cancel_ride', (data) { + Log.print("🚫 Socket: Ride Cancelled Event Received"); + String reason = data['reason'] ?? 'No reason provided'; + if (Get.isRegistered()) { + Get.find() + .processRideCancelledByPassenger(reason, source: "Socket"); + } + }); + } + + // داخل LocationController + + Future handleIncomingOrder( + Map rideData, String source) async { + Log.print("📦 Socket Order Received from ($source)"); + + // 🔴 1. التحقق من حالة التطبيق قبل أي شيء 🔴 + bool isAppInForeground = box.read(BoxName.isAppInForeground) ?? false; + + if (!isAppInForeground) { + Log.print( + "📱 [LocationController] Order received in background (iOS/Android). Source: $source"); + + if (Platform.isIOS) { + // على iOS، نقوم بإظهار إشعار محلي لأن الـ Overlay غير مدعوم + NotificationController().showNotification( + "طلب رحلة جديد 🚖", + "لديك طلب رحلة جديد، افتح التطبيق للموافقة عليه", + jsonEncode(rideData), + 'ding.wav'); + } + return; + } + + try { + // 2. التحقق من صحة البيانات + if (rideData.isEmpty || !rideData.containsKey('16')) { + Log.print("❌ Socket Error: Invalid Ride Data."); + return; + } + + // 3. تجهيز البيانات (DriverList) + List driverList = []; + if (rideData.isNotEmpty) { + var sortedKeys = rideData.keys + .where((e) => int.tryParse(e) != null) + .map((e) => int.parse(e)) + .toList()..sort(); + + for (var key in sortedKeys) { + driverList.add(rideData[key.toString()]); + } + } + + // الحماية ضد البنية غير المكتملة + if (driverList.length <= 16) { + Log.print("❌ Socket Error: Parsed driver list is incomplete."); + return; + } + + // 4. إغلاق النافذة (إن وجدت بالخطأ) والتنقل + try { + if (await TripOverlayPlugin.isOverlayActive()) { + Log.print("📲 Closing Overlay because App took control via Socket"); + await TripOverlayPlugin.hideOverlay(); + } + } catch (e) { + Log.print("Overlay check error: $e"); + } + + // 🔥 [Fix Active-Ride Guard] منع فتح صفحة الطلبات أثناء وجود السائق في رحلة نشطة + // هذا يمنع socket event جديد من تعطيل رحلة جارية + String? currentRideStatus = box.read(BoxName.rideStatus); + bool hasActiveRide = (currentRideStatus == 'Begin' || + currentRideStatus == 'Apply' || + currentRideStatus == 'Arrived'); + String currentRoute = Get.currentRoute; + bool isOnMapPage = currentRoute.contains('MapPage') || + currentRoute.contains('PassengerLocation'); + + if (hasActiveRide || isOnMapPage) { + Log.print( + "⛔ [LocationController] Ignoring new ride request — driver has active ride ($currentRideStatus) or is on map page ($currentRoute)."); + return; + } + + if (currentRoute != '/OrderRequestPage') { + Log.print("🚀 Socket: Navigating to OrderRequestPage..."); + Get.toNamed('/OrderRequestPage', arguments: { + 'myListString': jsonEncode(driverList), + 'DriverList': driverList, + 'body': 'New Trip Request via Socket ⚡' + }); + } else { + Log.print( + "⚠️ User is already on OrderRequestPage. Skipping navigation."); + } + } catch (e) { + Log.print("❌ Socket Navigation Error: $e"); + } + } + + void _startHeartbeat() { + _socketHeartbeat?.cancel(); + _socketHeartbeat = Timer.periodic(const Duration(seconds: 25), (timer) { + // [Fix 6] تخطي الإرسال إذا كان stream الموقع نشطاً. + // الـ _locSub يرسل update_location عند كل تحرك (كل 5-10 ثوانٍ) تلقائياً. + // الـ heartbeat يكون مفيداً فقط عندما يتوقف الـ stream (الجهاز ثابت أو أوقف الخدمة). + if (_locSub != null) return; + if (socket != null && isSocketConnected && myLocation.latitude != 0) { + emitLocationToSocket(myLocation, heading, speed); + } + }); + } + + void _stopHeartbeat() { + _socketHeartbeat?.cancel(); + } + + // In LocationController.dart + + void emitLocationToSocket(LatLng pos, double head, double spd) { + String status = box.read(BoxName.statusDriverLocation) ?? 'on'; + String? currentRideStatus = box.read(BoxName.rideStatus); + String? storedPassengerId = box.read(BoxName.passengerID); + String? storedRideId = box.read(BoxName.rideId); + + // Basic payload + var payload = { + 'driver_id': box.read(BoxName.driverID), + 'lat': pos.latitude, + 'lng': pos.longitude, + 'heading': head, + 'speed': spd * 3.6, + 'status': status, + 'distance': totalDistance, + }; + + // 🔥 القرار الذكي: حقن بيانات الراكب إذا كان هناك رحلة نشطة في الـ Box 🔥 + bool hasActiveRide = (currentRideStatus == 'Begin' || + currentRideStatus == 'Apply' || + currentRideStatus == 'Arrived'); + + if (hasActiveRide && storedPassengerId != null) { + payload['passenger_id'] = storedPassengerId; + payload['ride_id'] = storedRideId; + } + + // DebugLog.print to verify + //Log.print('🚀 Emitting Location: $payload'); + + if (socket != null && socket!.connected) { + socket!.emit('update_location', payload); + } + } + // =================================================================== + // ====== Tracking Logic ====== + // =================================================================== + + Future startLocationUpdates() async { + _isReady = true; + String currentStatus = box.read(BoxName.statusDriverLocation) ?? 'off'; + if (currentStatus == 'blocked') { + stopLocationUpdates(); + return; + } + + // Start background service + await BackgroundServiceHelper.startService(); + + if (socket == null || !socket!.connected) { + initSocket(); + } + + if (_locSub != null) return; + + if (await _ensureServiceAndPermission()) { + _subscribeLocationStream(); + _startBatchTimers(); + } + } + + Future _subscribeLocationStream() async { + _locSub?.cancel(); + int interval = _isPowerSavingMode ? 10000 : 5000; + await location.enableBackgroundMode(enable: true); + location.changeSettings( + accuracy: LocationAccuracy.navigation, + interval: interval, + distanceFilter: _isPowerSavingMode ? 20 : 10, + ); + + _locSub = location.onLocationChanged.listen((LocationData loc) async { + if (loc.latitude == null || loc.longitude == null) return; + + final now = DateTime.now(); + final pos = LatLng(loc.latitude!, loc.longitude!); + + myLocation = pos; + speed = loc.speed ?? 0.0; + heading = loc.heading ?? 0.0; + + box.write('last_lat', pos.latitude); + box.write('last_lng', pos.longitude); + box.write('last_heading', heading); + + if (_lastPosForDistance != null) { + final d = _calculateDistance(_lastPosForDistance!, pos); + if (d > 5.0) totalDistance += d; + } + _lastPosForDistance = pos; + + update(); + emitLocationToSocket(pos, heading, speed); + + if (Get.isRegistered()) { + final homeCtrl = Get.find(); + if (homeCtrl.isActive && + homeCtrl.mapHomeCaptainController != null && + homeCtrl.isHomeMapActive && + homeCtrl.isMapReadyForCommands) { + homeCtrl.mapHomeCaptainController?.animateCamera( + CameraUpdate.newLatLngZoom(pos, 17.5), + ); + } + } + + await _saveBehaviorIfMoved(pos, now, currentSpeed: speed); + }, onError: (e) => Log.print('❌ Location Stream Error: $e')); + } + + Timer? _socketWatchdogTimer; + + Future stopLocationUpdates() async { + Log.print("🛑 Stopping Location Updates..."); + + _locSub?.cancel(); + _locSub = null; + _recordTimer?.cancel(); + _uploadBatchTimer?.cancel(); + _socketHeartbeat?.cancel(); + _socketWatchdogTimer?.cancel(); + + if (socket != null) { + socket!.clearListeners(); + socket!.dispose(); + } + + if (!Platform.isIOS) { + await BackgroundServiceHelper.stopService(); + } + + socket = null; + isSocketConnected = false; + _isReady = false; + } + + // =================================================================== + // ====== Batch Logic & Helpers ====== + // =================================================================== + + void _startBatchTimers() { + _recordTimer?.cancel(); + _uploadBatchTimer?.cancel(); + _socketWatchdogTimer?.cancel(); + + final recDur = + _isPowerSavingMode ? recordIntervalPowerSave : recordIntervalNormal; + final upDur = _isPowerSavingMode + ? uploadBatchIntervalPowerSave + : uploadBatchIntervalNormal; + + _recordTimer = + Timer.periodic(recDur, (_) => _recordCurrentLocationToBuffer()); + _uploadBatchTimer = Timer.periodic(upDur, (_) => _flushBufferToServer()); + + // محاولة إعادة الاتصال بالسوكيت إذا انقطع كل 3 ثواني + _socketWatchdogTimer = Timer.periodic(const Duration(seconds: 3), (_) { + if (!isSocketConnected && !_isInitializingSocket) { + Log.print("🔄 Socket Watchdog: Attempting to reconnect socket..."); + initSocket(); + } + }); + } + + void _recordCurrentLocationToBuffer() { + if (myLocation.latitude == 0) return; + final now = DateTime.now(); + double distFromLast = 0.0; + if (_lastRecordedRealLoc != null) { + distFromLast = _calculateDistance(_lastRecordedRealLoc!, myLocation); + } + bool moved = distFromLast > 10.0; + bool timeForced = _lastRecordedTime == null || + now.difference(_lastRecordedTime!).inSeconds >= 60; + + if ((moved && speed > 0.5) || timeForced) { + _lastRecordedRealLoc = myLocation; + _lastRecordedTime = now; + final point = { + 'lat': double.parse(myLocation.latitude.toStringAsFixed(6)), + 'lng': double.parse(myLocation.longitude.toStringAsFixed(6)), + 'spd': double.parse((speed * 3.6).toStringAsFixed(1)), + 'head': int.parse(heading.toStringAsFixed(0)), + 'st': box.read(BoxName.statusDriverLocation) ?? 'off', + 'ts': now.toIso8601String(), + }; + _trackBuffer.add(point); + } + } + + Future _flushBufferToServer() async { + if (_trackBuffer.isEmpty) return; + + int itemsToTake = _trackBuffer.length > 100 ? 100 : _trackBuffer.length; + List> batch = _trackBuffer.sublist(0, itemsToTake); + + final String driverId = (box.read(BoxName.driverID) ?? '').toString(); + try { + var res = await CRUD().post( + link: '${AppLink.locationServer}/add_batch.php', + payload: {'driver_id': driverId, 'batch_data': jsonEncode(batch)}, + ); + if (res != 'failure') { + _trackBuffer.removeRange(0, itemsToTake); + } else { + _enforceBufferLimit(); + } + } catch (e) { + Log.print('❌ Failed to upload batch: $e'); + _enforceBufferLimit(); + } + } + + void _enforceBufferLimit() { + if (_trackBuffer.length > 500) { + _trackBuffer.removeRange(0, _trackBuffer.length - 500); + Log.print("⚠️ Buffer limit enforced. Removed oldest entries."); + } + } + + void _listenToBatteryChanges() async { + _battery.onBatteryStateChanged.listen((state) async { + int level = await _battery.batteryLevel; + bool previousMode = _isPowerSavingMode; + if (level <= powerSaveTriggerLevel) _isPowerSavingMode = true; + if (level >= powerSaveExitLevel) _isPowerSavingMode = false; + if (previousMode != _isPowerSavingMode) { + _startBatchTimers(); + _updateLocationSettings(); + } + }); + } + + Future _updateLocationSettings() async { + if (_locSub == null) return; + int interval = _isPowerSavingMode ? 10000 : 5000; + try { + await location.changeSettings( + accuracy: LocationAccuracy.navigation, + interval: interval, + distanceFilter: _isPowerSavingMode ? 20 : 10, + ); + Log.print("🔋 Location settings updated. Power Save: $_isPowerSavingMode"); + } catch (e) { + Log.print("❌ Failed to update location settings: $e"); + } + } + + Future _saveBehaviorIfMoved(LatLng pos, DateTime now, + {required double currentSpeed}) async { + final dist = + (_lastSqlLoc == null) ? 999.0 : _calculateDistance(_lastSqlLoc!, pos); + if (dist < 15.0) return; + + final accel = _calcAcceleration(currentSpeed, now) ?? 0.0; + _lastSqlLoc = pos; + + _behaviorBuffer.add({ + 'driver_id': (box.read(BoxName.driverID) ?? '').toString(), + 'latitude': pos.latitude, + 'longitude': pos.longitude, + 'acceleration': accel, + 'created_at': now.toIso8601String(), + 'updated_at': now.toIso8601String(), + }); + + if (_behaviorBuffer.length >= 10) { + _flushBehaviorBuffer(); + } + } + + void _flushBehaviorBuffer() { + if (_behaviorBuffer.isEmpty) return; + List> batch = List.from(_behaviorBuffer); + _behaviorBuffer.clear(); + + Future.microtask(() async { + try { + for (var data in batch) { + await sql.insertData(data, TableName.behavior); + } + } catch (e) { + Log.print('SQLite Batch Insert Error: $e'); + } + }); + } + + // استبدال دالة Haversine اليدوية بـ Geolocator في باقي الكود أيضاً + // لأنها تعتمد على C++ في الأندرويد و Obj-C في الآيفون (Native Speed) + double _calculateDistance(LatLng a, LatLng b) { + return geo.Geolocator.distanceBetween( + a.latitude, a.longitude, b.latitude, b.longitude); + } + + double? _calcAcceleration(double currentSpeed, DateTime now) { + if (_lastSpeed != null && _lastSpeedAt != null) { + final dt = now.difference(_lastSpeedAt!).inMilliseconds / 1000.0; + if (dt > 0.5) { + final a = (currentSpeed - _lastSpeed!) / dt; + _lastSpeed = currentSpeed; + _lastSpeedAt = now; + return a; + } + } + _lastSpeed = currentSpeed; + _lastSpeedAt = now; + return null; + } + + Future _initLocationSettings() async { + if (await _ensureServiceAndPermission()) { + try { + await location.enableBackgroundMode(enable: true); + location.changeSettings( + accuracy: LocationAccuracy.navigation, + interval: 1000, + distanceFilter: 10); + } catch (e) { + Log.print("Warning: $e"); + } + } + } + +// 🔥🔥 هذه هي الدالة المعدلة التي تستخدم ph.Permission 🔥🔥 + Future _ensureServiceAndPermission() async { + // 1. طلب إذن الإشعارات أولاً باستخدام permission_handler + if (Platform.isAndroid) { + var notificationStatus = await ph.Permission.notification.status; + if (!notificationStatus.isGranted) { + await ph.Permission.notification.request(); + } + } + + // 2. طلب تفعيل خدمة الموقع (GPS) من بكج location + bool serviceEnabled = await location.serviceEnabled(); + if (!serviceEnabled) { + serviceEnabled = await location.requestService(); + if (!serviceEnabled) return false; + } + + // 3. طلب إذن الموقع الأساسي من بكج location + PermissionStatus permissionGranted = await location.hasPermission(); + if (permissionGranted == PermissionStatus.denied) { + permissionGranted = await location.requestPermission(); + if (permissionGranted != PermissionStatus.granted) return false; + } + + return true; + } +// ... (باقي الكود) + + Future getLocation() async { + try { + if (await _ensureServiceAndPermission()) { + final locData = await location.getLocation(); + if (locData != null && locData.latitude != null && locData.longitude != null) { + myLocation = LatLng(locData.latitude!, locData.longitude!); + heading = locData.heading ?? 0.0; + speed = locData.speed ?? 0.0; + + box.write('last_lat', myLocation.latitude); + box.write('last_lng', myLocation.longitude); + box.write('last_heading', heading); + + update(); + + if (Get.isRegistered()) { + final homeCtrl = Get.find(); + if (homeCtrl.mapHomeCaptainController != null && + homeCtrl.isMapReadyForCommands) { + Log.print("📍 [LocationController] Animating camera to single location update"); + homeCtrl.mapHomeCaptainController?.animateCamera( + CameraUpdate.newLatLngZoom(myLocation, 17.5), + ); + } + } + } + return locData; + } + } catch (e) { + Log.print('❌ FAILED to get single location: $e'); + } + return null; + } +} diff --git a/siro_driver/lib/controller/functions/location_permission.dart b/siro_driver/lib/controller/functions/location_permission.dart new file mode 100755 index 0000000..98436f8 --- /dev/null +++ b/siro_driver/lib/controller/functions/location_permission.dart @@ -0,0 +1,60 @@ +import 'package:get/get.dart'; +import 'package:permission_handler/permission_handler.dart'; + +import '../../constant/box_name.dart'; +import '../../main.dart'; +import '../../print.dart'; +import '../../views/widgets/mydialoug.dart'; +import '../auth/captin/login_captin_controller.dart'; + +class LocationPermissions { + // late Location location; + + // Future locationPermissions() async { + // location = Location(); + // var permissionStatus = await location.requestPermission(); + // if (permissionStatus == PermissionStatus.denied) { + // // The user denied the location permission. + // Get.defaultDialog(title: 'GPS Required Allow !.'.tr, middleText: ''); + // return null; + // } + // } +} + +Future getPermissionLocation() async { + final PermissionStatus status = await Permission.locationAlways.status; + if (!await Permission.locationAlways.serviceStatus.isEnabled) { + Log.print('status.isGranted: ${status.isGranted}'); + // box.write(BoxName.locationPermission, 'true'); + await Permission.locationAlways.request(); + Get.put(LoginDriverController()).update(); + MyDialog().getDialog( + 'Enable Location Permission'.tr, // {en:ar} + 'Allowing location access will help us display orders near you. Please enable it now.' + .tr, // {en:ar} + () async { + Get.back(); + box.write(BoxName.locationPermission, 'true'); + await Permission.locationAlways.request(); + }, + ); + } +} + +Future getPermissionLocation1() async { + PermissionStatus status = await Permission.locationWhenInUse.request(); + + if (status.isGranted) { + // After granting when in use, request "always" location permission + status = await Permission.locationAlways.request(); + + if (status.isGranted) { + print("Background location permission granted"); + } else { + print("Background location permission denied"); + } + } else { + print("Location permission denied"); + await openAppSettings(); + } +} diff --git a/siro_driver/lib/controller/functions/log_out.dart b/siro_driver/lib/controller/functions/log_out.dart new file mode 100755 index 0000000..6e0cc00 --- /dev/null +++ b/siro_driver/lib/controller/functions/log_out.dart @@ -0,0 +1,157 @@ +import 'package:siro_driver/views/home/on_boarding_page.dart'; +import 'package:siro_driver/views/widgets/error_snakbar.dart'; +import 'package:flutter/material.dart'; +import 'package:get/get.dart'; +import 'package:siro_driver/constant/box_name.dart'; +import 'package:siro_driver/constant/colors.dart'; +import 'package:siro_driver/constant/links.dart'; +import 'package:siro_driver/controller/functions/crud.dart'; +import 'package:siro_driver/main.dart'; +import 'package:siro_driver/views/widgets/elevated_btn.dart'; +import 'package:siro_driver/views/widgets/my_textField.dart'; + +import '../../constant/style.dart'; + +class LogOutController extends GetxController { + TextEditingController checkTxtController = TextEditingController(); + final formKey = GlobalKey(); + final formKey1 = GlobalKey(); + final emailTextController = TextEditingController(); + + Future deleteMyAccountDriver(String id) async { + await CRUD().post(link: AppLink.removeUser, payload: {'id': id}).then( + (value) => Get.snackbar('Deleted'.tr, 'Your Account is Deleted', + backgroundColor: AppColor.redColor)); + } + + checkBeforeDelete() async { + var res = await CRUD().post( + link: AppLink.deletecaptainAccounr, + payload: {'id': box.read(BoxName.driverID)}); + return res['message'][0]['id']; + } + + deletecaptainAccount() { + Get.defaultDialog( + backgroundColor: AppColor.yellowColor, + title: 'Are you sure to delete your account?'.tr, + middleText: + 'Your data will be erased after 2 weeks\nAnd you will can\'t return to use app after 1 month ', + titleStyle: AppStyle.title, + content: Column( + children: [ + Container( + width: Get.width, + decoration: AppStyle.boxDecoration, + child: Padding( + padding: const EdgeInsets.all(8.0), + child: Text( + 'Your data will be erased after 2 weeks\nAnd you will can\'t return to use app after 1 month' + .tr, + style: AppStyle.title.copyWith(color: AppColor.redColor), + ), + ), + ), + const SizedBox( + height: 20, + ), + Form( + key: formKey, + child: SizedBox( + width: Get.width, + child: MyTextForm( + controller: checkTxtController, + label: 'Enter Your First Name'.tr, + hint: 'Enter Your First Name'.tr, + type: TextInputType.name, + ), + )) + ], + ), + confirm: MyElevatedButton( + title: 'Delete'.tr, + onPressed: () async { + if (checkTxtController.text == (box.read(BoxName.nameDriver))) { + // deletecaptainAccount(); + + var id = await checkBeforeDelete(); + deleteMyAccountDriver(id); + } else { + mySnackeBarError('Your Name is Wrong'.tr); + } + })); + } + + Future logOutPassenger() async { + Get.defaultDialog( + title: 'Are you Sure to LogOut?'.tr, + content: Row( + mainAxisAlignment: MainAxisAlignment.spaceAround, + children: [ + MyElevatedButton( + title: 'Cancel'.tr, + onPressed: () => Get.back(), + ), + ElevatedButton( + style: ButtonStyle( + backgroundColor: MaterialStateProperty.all(AppColor.redColor), + ), + onPressed: () async { + // box.remove(BoxName.agreeTerms); + await box.erase(); + await storage.deleteAll(); + Get.offAll(OnBoardingPage()); + }, + child: Text( + 'Sign Out'.tr, + style: + AppStyle.title.copyWith(color: AppColor.secondaryColor), + )) + ], + )); + } + + Future logOutCaptain() async { + Get.defaultDialog( + title: 'Are you Sure to LogOut?'.tr, + titleStyle: AppStyle.title, + content: Row( + mainAxisAlignment: MainAxisAlignment.spaceAround, + children: [ + MyElevatedButton( + title: 'Cancel'.tr, + onPressed: () => Get.back(), + ), + ElevatedButton( + style: ButtonStyle( + backgroundColor: MaterialStateProperty.all(AppColor.redColor), + ), + onPressed: () async { + // box.remove(BoxName.agreeTerms); + await box.erase(); + await storage.deleteAll(); + Get.offAll(OnBoardingPage()); + }, + child: Text( + 'Sign Out'.tr, + style: + AppStyle.title.copyWith(color: AppColor.secondaryColor), + )) + ], + )); + } + + deletePassengerAccount() async { + if (formKey1.currentState!.validate()) { + if (box.read(BoxName.email).toString() == emailTextController.text) { + await CRUD().post(link: AppLink.passengerRemovedAccountEmail, payload: { + 'email': box.read(BoxName.email), + }); + } else { + mySnackeBarError( + 'Email you inserted is Wrong.'.tr, + ); + } + } + } +} diff --git a/siro_driver/lib/controller/functions/network/connection_check.dart b/siro_driver/lib/controller/functions/network/connection_check.dart new file mode 100644 index 0000000..82bc47b --- /dev/null +++ b/siro_driver/lib/controller/functions/network/connection_check.dart @@ -0,0 +1,48 @@ +import 'dart:async'; +import 'dart:io'; +import 'package:http/http.dart' as http; + +import 'net_guard.dart'; + +typedef BodyEncoder = Future Function(); + +class HttpRetry { + /// ريتراي لـ network/transient errors فقط. + static Future sendWithRetry( + BodyEncoder send, { + int maxRetries = 3, + Duration baseDelay = const Duration(milliseconds: 400), + Duration timeout = const Duration(seconds: 12), + }) async { + // ✅ Pre-flight check for internet connection + if (!await NetGuard().hasInternet()) { + // Immediately throw a specific exception if there's no internet. + // This avoids pointless retries. + throw const SocketException("No internet connection"); + } + int attempt = 0; + while (true) { + attempt++; + try { + final res = await send().timeout(timeout); + return res; + } on TimeoutException catch (_) { + if (attempt >= maxRetries) rethrow; + } on SocketException catch (_) { + if (attempt >= maxRetries) rethrow; + } on HandshakeException catch (_) { + if (attempt >= maxRetries) rethrow; + } on http.ClientException catch (e) { + // مثال: Connection reset by peer + final msg = e.message.toLowerCase(); + final transient = msg.contains('connection reset') || + msg.contains('broken pipe') || + msg.contains('timed out'); + if (!transient || attempt >= maxRetries) rethrow; + } + // backoff: 0.4s, 0.8s, 1.6s + final delay = baseDelay * (1 << (attempt - 1)); + await Future.delayed(delay); + } + } +} diff --git a/siro_driver/lib/controller/functions/network/net_guard.dart b/siro_driver/lib/controller/functions/network/net_guard.dart new file mode 100644 index 0000000..c804df1 --- /dev/null +++ b/siro_driver/lib/controller/functions/network/net_guard.dart @@ -0,0 +1,48 @@ +import 'dart:async'; +import 'dart:io'; +import 'package:connectivity_plus/connectivity_plus.dart'; +import 'package:internet_connection_checker/internet_connection_checker.dart'; + +class NetGuard { + static final NetGuard _i = NetGuard._(); + NetGuard._(); + factory NetGuard() => _i; + + bool _notified = false; + + /// فحص: (أ) فيه شبكة؟ (ب) فيه انترنت؟ (ج) السيرفر نفسه reachable؟ + Future hasInternet({Uri? mustReach}) async { + final connectivity = await Connectivity().checkConnectivity(); + if (connectivity == ConnectivityResult.none) return false; + + final hasNet = + await InternetConnectionChecker.createInstance().hasConnection; + if (!hasNet) return false; + + if (mustReach != null) { + try { + final host = mustReach.host; + final result = await InternetAddress.lookup(host); + if (result.isEmpty || result.first.rawAddress.isEmpty) return false; + + // اختباري خفيف عبر TCP (80/443) — 400ms timeout + final port = mustReach.scheme == 'http' ? 80 : 443; + final socket = await Socket.connect(host, port, + timeout: const Duration(seconds: 1)); + socket.destroy(); + } catch (_) { + return false; + } + } + return true; + } + + /// إظهار إشعار مرة واحدة ثم إسكات التكرارات + void notifyOnce(void Function(String title, String msg) show) { + if (_notified) return; + _notified = true; + show('لا يوجد اتصال بالإنترنت', 'تحقق من الشبكة ثم حاول مجددًا.'); + // إعادة السماح بعد 15 ثانية + Future.delayed(const Duration(seconds: 15), () => _notified = false); + } +} diff --git a/siro_driver/lib/controller/functions/ocr_controller.dart b/siro_driver/lib/controller/functions/ocr_controller.dart new file mode 100755 index 0000000..a3e3ec5 --- /dev/null +++ b/siro_driver/lib/controller/functions/ocr_controller.dart @@ -0,0 +1,649 @@ +import 'dart:convert'; +import 'dart:io'; +import 'dart:typed_data'; +import 'package:flutter/material.dart'; +import 'package:get/get.dart'; +import 'package:image_picker/image_picker.dart'; +import 'package:http/http.dart' as http; +import 'package:siro_driver/constant/api_key.dart'; +import 'package:siro_driver/constant/colors.dart'; +import 'package:siro_driver/constant/info.dart'; +import 'package:siro_driver/constant/style.dart'; +import 'package:siro_driver/constant/table_names.dart'; +import 'package:siro_driver/main.dart'; +import 'package:siro_driver/views/widgets/elevated_btn.dart'; + +import '../../constant/box_name.dart'; +import '../../constant/links.dart'; +import '../auth/captin/register_captin_controller.dart'; +import 'launch.dart'; + +// +// class TextExtractionController extends GetxController { +// String extractedText = ''; +// bool isloading = false; +// File? _scannedImage; +// // Convert the extracted text to JSON +// // Convert the extracted text to JSON +// String getTextAsJSON(String text) { +// final lines = text.split('\n'); +// final jsonList = lines.map((line) { +// return { +// 'line_text': line, +// 'num_words': line.trim().split(' ').length, +// }; +// }).toList(); +// +// final json = { +// 'lines': jsonList, +// 'num_lines': lines.length, +// }; +// +// return jsonEncode(json); +// } +// +// // Convert the extracted text to blocks by line +// List getTextBlocks(String text) { +// return text.split('\n'); +// } +// +// // Future pickAndExtractText() async { +// // final pickedImage = await ImagePicker().pickImage( +// // source: ImageSource.camera, +// // preferredCameraDevice: CameraDevice.rear, +// // maxHeight: Get.height * .3, +// // maxWidth: Get.width * .8, +// // imageQuality: 99, +// // ); +// // if (pickedImage != null) { +// // isloading = true; +// // update(); +// // final imagePath = pickedImage.path; +// // final languages = [ +// // 'eng', +// // 'ara' +// // ]; // Specify the languages you want to use for text extraction +// +// // try { +// // final text = await FlutterTesseractOcr.extractText(imagePath, +// // language: +// // languages.join('+'), // Combine multiple languages with '+' +// // args: { +// // "psm": "4", +// // "preserve_interword_spaces": "1", +// // // "rectangle": const Rect.fromLTWH(100, 100, 200, 200), +// // } // Additional options if needed +// // ); +// // isloading = false; +// // final jsonText = getTextAsJSON(text); +// // final textBlocks = getTextBlocks(text); +// // update(); +// // extractedText = +// // textBlocks.toString(); // Convert the extracted text to JSON. +// +// // // Print the JSON to the console. +// // update(); +// // } catch (e) { +// // extractedText = ''; +// // } +// // } +// // } +// } + +// class TextMLGoogleRecognizerController extends GetxController { +// @override +// void onInit() { +// scanText(); +// super.onInit(); +// } +// +// // The ImagePicker instance +// final ImagePicker _imagePicker = ImagePicker(); +// +// // The GoogleMlKit TextRecognizer instance +// final TextRecognizer _textRecognizer = TextRecognizer(); +// +// // The scanned text +// String? scannedText; +// String? jsonOutput; +// final List> lines = []; +// +// Map decode = {}; +// +// Future scanText() async { +// // Pick an image from the camera or gallery +// final XFile? image = +// await _imagePicker.pickImage(source: ImageSource.gallery); +// +// // If no image was picked, return +// if (image == null) { +// return; +// } +// +// // Convert the XFile object to an InputImage object +// final InputImage inputImage = InputImage.fromFile(File(image.path)); +// +// // Recognize the text in the image +// final RecognizedText recognizedText = +// await _textRecognizer.processImage(inputImage); +// scannedText = recognizedText.text; +// Map extractedData = {}; +// // Extract the scanned text line by line +// for (var i = 0; i < recognizedText.blocks.length; i++) { +// final block = recognizedText.blocks[i]; +// for (final line in block.lines) { +// final lineText = line.text; +// +// if (lineText.contains('DL')) { +// final dlNumber = lineText.split('DL')[1].trim(); +// extractedData['dl_number'] = dlNumber; +// } +// if (lineText.contains('USA')) { +// final usa = lineText.split('USA')[1].trim(); +// extractedData['USA'] = usa; +// } +// if (lineText.contains('DRIVER LICENSE')) { +// final driverl = lineText; +// extractedData['DRIVER_LICENSE'] = driverl; +// } +// +// if (lineText.contains('EXP')) { +// final expiryDate = lineText.split('EXP')[1].trim(); +// extractedData['expiry_date'] = expiryDate; +// } +// +// if (lineText.contains('DOB')) { +// final dob = lineText.split('DOB')[1].trim(); +// extractedData['dob'] = dob; +// } +// +// if (lineText.contains("LN")) { +// if ((lineText.indexOf("LN") == 0)) { +// final lastName = lineText.split('LN')[1].trim(); +// extractedData['lastName'] = lastName; +// } +// } +// if (lineText.contains("FN")) { +// final firstName = lineText.split('FN')[1].trim(); +// extractedData['firstName'] = firstName; +// } +// if (lineText.contains("RSTR")) { +// final rstr = lineText.split('RSTR')[1].trim(); +// extractedData['rstr'] = rstr; +// } +// if (lineText.contains("CLASS")) { +// final class1 = lineText.split('CLASS')[1].trim(); +// extractedData['class'] = class1; +// } +// if (lineText.contains("END")) { +// final end = lineText.split('END')[1].trim(); +// extractedData['end'] = end; +// } +// if (lineText.contains("DD")) { +// final dd = lineText.split('DD')[1].trim(); +// extractedData['dd'] = dd; +// } +// if (lineText.contains("EYES")) { +// final eyes = lineText.split('EYES')[1].trim(); +// extractedData['eyes'] = eyes; +// } +// if (lineText.contains("SEX")) { +// final parts = lineText.split("SEX ")[1]; +// extractedData['sex'] = parts[0]; +// } +// if (lineText.contains("HAIR")) { +// final hair = lineText.split('HAIR')[1].trim(); +// extractedData['hair'] = hair; +// } +// +// if (lineText.contains('STREET') || lineText.contains(',')) { +// final address = lineText; +// extractedData['address'] = address; +// } +// +// // Repeat this process for other relevant data fields +// } +// } +// +// // Convert the list of lines to a JSON string +// jsonOutput = jsonEncode(extractedData); +// decode = jsonDecode(jsonOutput!); +// +// update(); +// } +// } + +class ScanDocumentsByApi extends GetxController { + bool isLoading = false; + Map responseMap = {}; + final ImagePicker imagePicker = ImagePicker(); + late Uint8List imagePortrait; + late Uint8List imageSignature; + late Uint8List imageDocumentFrontSide; + XFile? image; + XFile? imagePortraitFile; + XFile? imageFace; + late File tempFile; + late String imagePath; + DateTime now = DateTime.now(); + late String name; + late String licenseClass; + late String documentNo; + late String address; + late String stateCode; + late String height; + late String sex; + late String postalCode; + late String dob; + late String expireDate; + + // /////////////////////// + // late CameraController cameraController; + // late List cameras; + // bool isCameraInitialized = false; + // // final TextRecognizer _textRecognizer = TextRecognizer(); + // String? scannedText; + + // Future initializeCamera(int cameraID) async { + // try { + // cameras = await availableCameras(); + // //update(); + // cameraController = CameraController( + // cameras[cameraID], + // ResolutionPreset.medium, + // enableAudio: false, + // ); + // await cameraController.initialize(); + // isCameraInitialized = true; + // update(); + // } catch (e) { + // if (e is CameraException) { + // switch (e.code) { + // case 'CameraAccessDenied': + // Get.defaultDialog( + // title: 'Camera Access Denied.'.tr, + // middleText: '', + // confirm: + // MyElevatedButton(title: 'Open Settings', onPressed: () {}), + // ); + // break; + // default: + // // Handle other errors here. + // break; + // } + // } + // } + // } + + /// + + Future scanDocumentsByApi() async { + // String? visionApi = await storage.read(key: BoxName.visionApi); + // String? visionApi = AK.visionApi; + // Pick an image from the camera or gallery + image = await imagePicker.pickImage(source: ImageSource.camera); // + + // If no image was picked, return + if (image == null) { + return; + } + + isLoading = true; + update(); + var headers = {'X-BLOBR-KEY': AK.visionApi}; + var request = http.MultipartRequest('POST', + Uri.parse('https://api.faceonlive.com/j2y3q25y1b6maif1/api/iddoc')); + request.files.add(await http.MultipartFile.fromPath('image', image!.path)); + request.headers.addAll(headers); + + http.StreamedResponse response = await request.send(); + + if (response.statusCode == 200) { + String responseString = await response.stream.bytesToString(); + responseMap = jsonDecode(responseString); + var ocrData = responseMap['data']['ocr']; + name = ocrData['name'].toString(); + licenseClass = ocrData['dlClass'].toString(); + documentNo = ocrData['documentNumber'].toString(); + address = ocrData['address'].toString(); + height = ocrData['height'].toString(); + postalCode = ocrData['addressPostalCode'].toString(); + sex = ocrData['sex'].toString(); + stateCode = ocrData['addressJurisdictionCode'].toString(); + expireDate = ocrData['dateOfExpiry'].toString(); + dob = ocrData['dateOfBirth'].toString(); + if (responseMap['data'] != null && + responseMap['data']['image'] != null && + responseMap['data']['image']['portrait'] != null) { + imagePortrait = base64Decode(responseMap['data']['image']['portrait']); + String tempPath = Directory.systemTemp.path; + tempFile = File('$tempPath/image.jpg'); + await tempFile.writeAsBytes(imagePortrait); + + imagePath = tempFile.path; + // imagePortraitFile=File(imagePath) ; + update(); + } else { + // Handle error or provide a default value + } + + if (responseMap['data']['image']['signature'] != null) { + imageSignature = + base64Decode(responseMap['data']['image']['signature']); + } else { + imageSignature = imagePortrait; + // Handle error or provide a default value + } + + if (responseMap['data'] != null && + responseMap['data']['image'] != null && + responseMap['data']['image']['documentFrontSide'] != null) { + imageDocumentFrontSide = + base64Decode(responseMap['data']['image']['documentFrontSide']); + } else { + // Handle error or provide a default value + } + + isLoading = false; + update(); + } else {} + } + + late int times; + Future checkMatchFaceApi() async { + sql.getAllData(TableName.faceDetectTimes).then((value) { + if (value.isEmpty || value == null) { + sql.insertData({'faceDetectTimes': 1}, TableName.faceDetectTimes); + sql.getAllData(TableName.faceDetectTimes).then((value) { + times = value[0]['faceDetectTimes']; + update(); + }); + } else { + if (times < 4) { + times++; + matchFaceApi(); + sql.updateData( + {'faceDetectTimes': times}, TableName.faceDetectTimes, 1); + } else { + Get.defaultDialog( + barrierDismissible: false, + title: 'You have finished all times '.tr, + titleStyle: AppStyle.title, + middleText: 'if you want help you can email us here'.tr, + middleTextStyle: AppStyle.title, + cancel: MyElevatedButton( + title: 'Thanks'.tr, + kolor: AppColor.greenColor, + onPressed: () => Get.back(), + ), + confirm: MyElevatedButton( + title: 'Email Us'.tr, + kolor: AppColor.yellowColor, // + onPressed: () { + launchCommunication('email', 'support@mobile-app.store', + '${'Hi'.tr} ${AppInformation.appName}\n${'I cant register in your app in face detection '.tr}'); + Get.back(); + }, + )); + } + } + }); + } + + Map res = {}; + Future matchFaceApi() async { + // String? visionApi = await storage.read(key: BoxName.visionApi); + imageFace = await imagePicker.pickImage( + source: ImageSource.camera, + preferredCameraDevice: CameraDevice.front, + ); + + // If no image was picked, return + if (image == null) { + return; + } + final imageFile = File(imageFace!.path); + // Uint8List imageBytes = await imageFile.readAsBytes(); + var headers = {'X-BLOBR-KEY': AK.visionApi}; + var request = http.MultipartRequest( + 'POST', + Uri.parse( + 'https://api.faceonlive.com/sntzbspfsdupgid1/api/face_compare')); + request.files + .add(await http.MultipartFile.fromPath('image1', imageFile.path)); + request.files.add(await http.MultipartFile.fromPath('image2', imagePath)); + request.headers.addAll(headers); + + http.StreamedResponse response = await request.send(); + + if (response.statusCode == 200) { + res = jsonDecode(await response.stream.bytesToString()); + + update(); + res['data']['result'].toString().contains('No face detected in image') + ? Get.defaultDialog( + barrierDismissible: false, + title: 'No face detected'.tr, + middleText: ''.tr, + titleStyle: AppStyle.title, + confirm: MyElevatedButton( + kolor: AppColor.yellowColor, + title: 'Back'.tr, + onPressed: () { + Get.back(); + }, + )) // + : Get.defaultDialog( + // barrierDismissible: false, + title: 'Image detecting result is '.tr, + titleStyle: AppStyle.title, + content: Column( + children: [ + Text( + res['data']['result'].toString(), + style: res['data']['result'].toString() == 'Different' + ? AppStyle.title.copyWith(color: AppColor.redColor) + : AppStyle.title.copyWith(color: AppColor.greenColor), + ), + res['data']['result'].toString() == 'Different' + ? Text( + '${'Be sure for take accurate images please\nYou have'.tr} $times ${'from 3 times Take Attention'.tr}', + style: AppStyle.title, + ) + : Text( + 'image verified'.tr, + style: AppStyle.title, + ) + ], + ), + confirm: res['data']['result'].toString() == 'Different' + ? MyElevatedButton( + title: 'Back'.tr, + onPressed: () => Get.back(), + kolor: AppColor.redColor, + ) + : MyElevatedButton( + title: 'Next'.tr, + onPressed: () async { + RegisterCaptainController registerCaptainController = + Get.put(RegisterCaptainController()); + + await registerCaptainController.register(); + await registerCaptainController.addLisence(); + await uploadImagePortrate(); + // Get.to(() => CarLicensePage()); + }, + // { + // await uploadImage( + // tempFile, AppLink.uploadImagePortrate); + // Get.to(() => CarLicensePage()); + // }, + kolor: AppColor.greenColor, + )); + } else {} + } + + Future uploadImagePortrate() async { + isLoading = true; + update(); + + final String token = box.read(BoxName.jwt)?.toString().split(AppInformation.addd)[0] ?? ''; + final String fingerPrint = box.read(BoxName.deviceFingerprint)?.toString() ?? ''; + + var request = http.MultipartRequest( + 'POST', + Uri.parse(AppLink.uploadImagePortrate), + ); + + request.files.add( + http.MultipartFile.fromBytes('image', imagePortrait), + ); + + request.headers.addAll({ + 'Authorization': 'Bearer $token', + 'X-Device-FP': fingerPrint, + }); + request.fields['driverID'] = box.read(BoxName.driverID).toString(); + + var response = await request.send(); + var responseData = await response.stream.toBytes(); + var responseString = String.fromCharCodes(responseData); + + isLoading = false; + update(); + + return responseString; + } + + @override + void onInit() { + // scanDocumentsByApi(); + // initializeCamera(0); + sql.getAllData(TableName.faceDetectTimes).then((value) { + if (value.isEmpty) { + times = 0; + update(); + // sql.insertData({'faceDetectTimes': 1}, TableName.faceDetectTimes); + } else { + times = value[0]['faceDetectTimes']; + } + }); + super.onInit(); + } +} + +// class PassportDataExtractor extends GetxController { +// @override +// void onInit() { +// extractPassportData(); +// super.onInit(); +// } +// +// final ImagePicker _imagePicker = ImagePicker(); +// late final XFile? image; +// final TextRecognizer _textRecognizer = TextRecognizer(); +// +// Future> extractPassportData() async { +// image = await _imagePicker.pickImage(source: ImageSource.gallery); +// update(); +// if (image == null) { +// throw Exception('No image picked'); +// } +// +// final InputImage inputImage = InputImage.fromFile(File(image!.path)); +// final RecognizedText recognisedText = +// await _textRecognizer.processImage(inputImage); +// +// final Map extractedData = {}; +// final List> extractedTextWithCoordinates = []; +// +// for (TextBlock block in recognisedText.blocks) { +// for (TextLine line in block.lines) { +// final String lineText = line.text; +// final Rect lineBoundingBox = line.boundingBox!; +// +// extractedTextWithCoordinates.add({ +// 'text': lineText, +// 'boundingBox': { +// 'left': lineBoundingBox.left, +// 'top': lineBoundingBox.top, +// 'width': lineBoundingBox.width, +// 'height': lineBoundingBox.height, +// }, +// }); +// +// // if (lineText.contains('Passport Number')) { +// // final String passportNumber = +// // lineText.split('Passport Number')[1].trim(); +// // extractedData['passportNumber'] = passportNumber; +// // } +// // if (lineText.contains('Given Names')) { +// // final String givenNames = lineText.split('Given Names')[1].trim(); +// // extractedData['givenNames'] = givenNames; +// // } +// // if (lineText.contains('Surname')) { +// // final String surname = lineText.split('Surname')[1].trim(); +// // extractedData['surname'] = surname; +// // } +// // if (lineText.contains('Nationality')) { +// // final String nationality = lineText.split('Nationality')[1].trim(); +// // extractedData['nationality'] = nationality; +// // } +// // if (lineText.contains('Date of Birth')) { +// // final String dob = lineText.split('Date of Birth')[1].trim(); +// // extractedData['dateOfBirth'] = dob; +// // } +// // Add more field extraction conditions as needed +// } +// } +// +// extractedData['extractedTextWithCoordinates'] = +// extractedTextWithCoordinates; +// return extractedData; +// } +// } +// +// class PassportDataController extends GetxController { +// PassportDataExtractor passportDataExtractor = PassportDataExtractor(); +// List> extractedTextWithCoordinates = []; +// +// Future extractDataAndDrawBoundingBoxes() async { +// try { +// Map extractedData = +// await passportDataExtractor.extractPassportData(); +// extractedTextWithCoordinates = +// extractedData['extractedTextWithCoordinates']; +// update(); // Notify GetX that the state has changed +// } catch (e) { +// } +// } +// } +// +// class BoundingBoxPainter extends CustomPainter { +// final List> boundingBoxes; +// +// BoundingBoxPainter(this.boundingBoxes); +// +// @override +// void paint(Canvas canvas, Size size) { +// final Paint paint = Paint() +// ..color = Colors.red +// ..style = PaintingStyle.stroke +// ..strokeWidth = 2.0; +// +// for (Map boundingBox in boundingBoxes) { +// double left = boundingBox['left']; +// double top = boundingBox['top']; +// double width = boundingBox['width']; +// double height = boundingBox['height']; +// +// Rect rect = Rect.fromLTWH(left, top, width, height); +// canvas.drawRect(rect, paint); +// } +// } +// +// @override +// bool shouldRepaint(covariant CustomPainter oldDelegate) { +// return false; +// } +// } diff --git a/siro_driver/lib/controller/functions/overlay_permisssion.dart b/siro_driver/lib/controller/functions/overlay_permisssion.dart new file mode 100755 index 0000000..54d894e --- /dev/null +++ b/siro_driver/lib/controller/functions/overlay_permisssion.dart @@ -0,0 +1,114 @@ +import 'dart:io'; + +import 'package:siro_driver/constant/links.dart'; +import 'package:siro_driver/controller/functions/crud.dart'; +import 'package:siro_driver/views/widgets/mydialoug.dart'; +import 'package:flutter/material.dart'; +import 'package:flutter_confetti/flutter_confetti.dart'; +import 'package:flutter_overlay_window/flutter_overlay_window.dart'; +import 'package:get/get.dart'; +import 'package:location/location.dart'; + +import '../../constant/box_name.dart'; +import '../../main.dart'; +import '../auth/captin/login_captin_controller.dart'; +import '../home/payment/captain_wallet_controller.dart'; + +Future getPermissionOverlay() async { + if (Platform.isAndroid) { + final bool status = await FlutterOverlayWindow.isPermissionGranted(); + if (status == false) { + MyDialog().getDialog( + 'Allow overlay permission'.tr, + 'To display orders instantly, please grant permission to draw over other apps.' + .tr, + () async { + Get.back(); + await FlutterOverlayWindow.requestPermission(); + }, + ); + } + } +} + +Future showDriverGiftClaim(BuildContext context) async { + if (box.read(BoxName.is_claimed).toString() == '0' || + box.read(BoxName.is_claimed) == null) { + MyDialog().getDialog( + 'You have gift 300 SYP'.tr, 'This for new registration'.tr, () async { + Get.back(); + var res = await CRUD().post(link: AppLink.updateDriverClaim, payload: { + 'driverId': box.read(BoxName.driverID), + }); + if (res != 'failure') { + Get.find() + .addDriverWallet('new driver', '300', '300'); + Confetti.launch( + context, + options: + const ConfettiOptions(particleCount: 100, spread: 70, y: 0.6), + ); + box.write(BoxName.is_claimed, '1'); + } + }); + } +} + +Future closeOverlayIfFound() async { + if (Platform.isAndroid) { + bool isOverlayActive = await FlutterOverlayWindow.isActive(); + if (isOverlayActive) { + await FlutterOverlayWindow.closeOverlay(); + } + } +} + +final location = Location(); +Future getLocationPermission() async { + bool serviceEnabled; + PermissionStatus permissionGranted; + + // Check if location services are enabled + serviceEnabled = await location.serviceEnabled(); + if (!serviceEnabled) { + serviceEnabled = await location.requestService(); + if (!serviceEnabled) { + // Location services are still not enabled, handle the error + return; + } + } + + // Check if the app has permission to access location + permissionGranted = await location.hasPermission(); + if (permissionGranted == PermissionStatus.denied) { + permissionGranted = await location.requestPermission(); + if (permissionGranted != PermissionStatus.granted) { + // Location permission is still not granted, handle the error + permissionGranted = await location.requestPermission(); + return; + } + } + if (permissionGranted.toString() == 'PermissionStatus.granted') { + box.write(BoxName.locationPermission, 'true'); + Get.find().update(); + } + // update(); +} + +Future getOverLay(String myListString) async { + bool isOverlayActive = await FlutterOverlayWindow.isActive(); + if (isOverlayActive) { + await FlutterOverlayWindow.closeOverlay(); + } + await FlutterOverlayWindow.showOverlay( + enableDrag: true, + flag: OverlayFlag.focusPointer, + visibility: NotificationVisibility.visibilityPublic, + positionGravity: PositionGravity.auto, + height: 700, + width: WindowSize.matchParent, + startPosition: const OverlayPosition(0, -150), + ); + + await FlutterOverlayWindow.shareData(myListString); +} diff --git a/siro_driver/lib/controller/functions/package_info.dart b/siro_driver/lib/controller/functions/package_info.dart new file mode 100755 index 0000000..4a93e38 --- /dev/null +++ b/siro_driver/lib/controller/functions/package_info.dart @@ -0,0 +1,361 @@ +import 'dart:async'; +import 'dart:convert'; +import 'dart:io'; +import 'dart:ui'; +import 'package:device_info_plus/device_info_plus.dart'; +import 'package:jailbreak_root_detection/jailbreak_root_detection.dart'; +import 'package:siro_driver/constant/box_name.dart'; +import 'package:siro_driver/constant/colors.dart'; +import 'package:siro_driver/constant/links.dart'; +import 'package:siro_driver/controller/functions/crud.dart'; +import 'package:flutter/cupertino.dart'; +import 'package:flutter/material.dart'; +import 'package:get/get.dart'; +import 'package:package_info_plus/package_info_plus.dart'; +import 'package:url_launcher/url_launcher.dart'; +import '../../constant/info.dart'; +import '../../main.dart'; +import '../../print.dart'; +import 'encrypt_decrypt.dart'; + +Future checkForUpdate(BuildContext context) async { + final packageInfo = await PackageInfo.fromPlatform(); + final currentVersion = packageInfo.buildNumber; + final version = packageInfo.version; + Log.print('version: $version'); + print('currentVersion is : $currentVersion'); + // Fetch the latest version from your server + String latestVersion = await getPackageInfo(); + box.write(BoxName.packagInfo, version); + + if (latestVersion.isNotEmpty && latestVersion != currentVersion) { + showUpdateDialog(context); + } +} + +Future getPackageInfo() async { + final response = await CRUD().get(link: AppLink.packageInfo, payload: { + "platform": Platform.isAndroid ? 'android' : 'ios', + "appName": AppInformation.appVersion, + }); + + if (response != 'failure') { + return jsonDecode(response)['message'][0]['version']; + } + return ''; +} + +void showUpdateDialog(BuildContext context) { + final String storeUrl = Platform.isAndroid + ? 'https://play.google.com/store/apps/details?id=com.intaleq_driver' + : 'https://apps.apple.com/jo/app/intaleq-driver/id6482995159'; + + showGeneralDialog( + context: context, + barrierDismissible: false, + barrierColor: Colors.black.withOpacity(0.5), + pageBuilder: (_, __, ___) { + return BackdropFilter( + filter: ImageFilter.blur(sigmaX: 5, sigmaY: 5), + child: Center( + child: AlertDialog( + // Using AlertDialog for a more Material Design look + shape: RoundedRectangleBorder( + borderRadius: + BorderRadius.circular(16)), // More rounded corners + elevation: 4, // Add a bit more elevation + contentPadding: EdgeInsets.zero, // Remove default content padding + content: Column( + mainAxisSize: MainAxisSize.min, + children: [ + Padding( + padding: const EdgeInsets.only(top: 20.0), + child: Image.asset( + 'assets/images/logo.png', + height: 72, // Slightly larger logo + width: 72, + ), + ), + const SizedBox(height: 16), + Padding( + padding: const EdgeInsets.symmetric(horizontal: 24.0), + child: Text( + 'Update Available'.tr, + textAlign: TextAlign.center, + style: Theme.of(context).textTheme.titleLarge?.copyWith( + // Use theme's title style + fontWeight: FontWeight.bold, + ), + ), + ), + Padding( + padding: const EdgeInsets.all(24.0), + child: Text( + 'A new version of the app is available. Please update to the latest version.' + .tr, // More encouraging message + textAlign: TextAlign.center, + style: Theme.of(context).textTheme.bodyMedium?.copyWith( + // Use theme's body style + color: Colors.black87, + ), + ), + ), + const Divider(height: 0), + Row( + children: [ + Expanded( + child: TextButton( + // Using TextButton for "Cancel" + onPressed: () => Navigator.pop(context), + style: TextButton.styleFrom( + foregroundColor: Colors.grey, + shape: const RoundedRectangleBorder( + borderRadius: BorderRadius.only( + bottomLeft: Radius.circular(16), + ), + ), + ), + child: Text('Cancel'.tr), + ), + ), + const SizedBox( + height: 48, + child: VerticalDivider(width: 0), // Using VerticalDivider + ), + Expanded( + child: ElevatedButton( + // Using ElevatedButton for "Update" + onPressed: () async { + if (await canLaunchUrl(Uri.parse(storeUrl))) { + await launchUrl(Uri.parse(storeUrl)); + } + if (context.mounted) Navigator.pop(context); + }, + style: ElevatedButton.styleFrom( + backgroundColor: AppColor + .primaryColor, // Use theme's primary color + foregroundColor: Theme.of(context) + .colorScheme + .onPrimary, // Use theme's onPrimary color + shape: const RoundedRectangleBorder( + borderRadius: BorderRadius.only( + bottomRight: Radius.circular(16), + ), + ), + ), + child: Text('Update'.tr), + ), + ), + ], + ), + ], + ), + ), + ), + ); + }, + transitionBuilder: (_, animation, __, child) { + return ScaleTransition( + scale: CurvedAnimation( + parent: animation, + curve: Curves.easeOutCubic, // More natural curve + ), + child: child, + ); + }, + ); +} + +class DeviceHelper { + static Future getDeviceFingerprint() async { + await EncryptionHelper.initialize(); + final DeviceInfoPlugin deviceInfoPlugin = DeviceInfoPlugin(); + var deviceData; + + try { + if (Platform.isAndroid) { + AndroidDeviceInfo androidInfo = await deviceInfoPlugin.androidInfo; + deviceData = androidInfo.toMap(); + } else if (Platform.isIOS) { + IosDeviceInfo iosInfo = await deviceInfoPlugin.iosInfo; + deviceData = iosInfo.toMap(); + } else { + throw UnsupportedError('Unsupported platform'); + } + + final String deviceId = Platform.isAndroid + ? deviceData['id'] ?? deviceData['androidId'] ?? deviceData['fingerprint'] ?? 'unknown' + : deviceData['identifierForVendor'] ?? 'unknown'; + + final String deviceModel = deviceData['model'] ?? 'unknown'; + + final String fingerprint = + EncryptionHelper.instance.encryptData('${deviceId}_$deviceModel'); + + box.write(BoxName.deviceFingerprint, fingerprint); + return (fingerprint); + } catch (e) { + debugPrint('Error generating device fingerprint: $e'); + throw Exception('Failed to generate device fingerprint: $e'); + } + } +} + +class SecurityHelper { + /// Performs security checks and handles potential risks + static Future performSecurityChecks() async { + bool isNotTrust = false; + bool isJailBroken = false; + bool isRealDevice = true; + bool isOnExternalStorage = false; + bool checkForIssues = false; + bool isDevMode = false; + bool isTampered = false; + String bundleId = ""; + + try { + isNotTrust = await JailbreakRootDetection.instance.isNotTrust; + isJailBroken = await JailbreakRootDetection.instance.isJailBroken; + isRealDevice = await JailbreakRootDetection.instance.isRealDevice; + + // This method is only relevant/implemented for Android + if (Platform.isAndroid) { + isOnExternalStorage = + await JailbreakRootDetection.instance.isOnExternalStorage; + } + + List issues = + await JailbreakRootDetection.instance.checkForIssues; + checkForIssues = issues.isNotEmpty; + + isDevMode = await JailbreakRootDetection.instance.isDevMode; + + // Get Bundle ID + PackageInfo packageInfo = await PackageInfo.fromPlatform(); + bundleId = packageInfo.packageName; + if (bundleId.isNotEmpty) { + isTampered = await JailbreakRootDetection.instance.isTampered(bundleId); + } + } catch (e) { + debugPrint("Error during security checks: $e"); + // Consider handling specific exceptions, not just general errors. + } + + // Save values to storage (using GetStorage) + await box.write('isNotTrust', isNotTrust); // Use await for write operations + await box.write('isTampered', isTampered); // Use await + await box.write('isJailBroken', isJailBroken); // Use await + + // debugPrint("Security Check Results:"); + // debugPrint("isNotTrust: $isNotTrust"); + // debugPrint("isJailBroken: $isJailBroken"); + // debugPrint("isRealDevice: $isRealDevice"); + // debugPrint("isOnExternalStorage: $isOnExternalStorage"); + // debugPrint("checkForIssues: $checkForIssues"); + // debugPrint("isDevMode: $isDevMode"); + // debugPrint("isTampered: $isTampered"); + // debugPrint("Bundle ID: $bundleId"); // Print the bundle ID + + // Check for security risks and potentially show a warning + if (isJailBroken || isRealDevice == false || isTampered) { + // print("security_warning".tr); //using easy_localization + // Use a more robust approach to show a warning, like a dialog: + _showSecurityWarning(); + } else { + box.write(BoxName.security_check, 'passed'); + } + } + + /// Deletes all app data + static Future clearAllData() async { + //await storage.deleteAll(); // What's 'storage'? Be specific. Likely GetStorage as well. + await box.erase(); // Clear GetStorage data + exit(0); // This will terminate the app. Be VERY careful with this. + } + + // static void _showSecurityWarning() { + // // Show a dialog, navigate to an error screen, etc. + // // Example using Get.dialog (if you use GetX): + // + // Get.dialog( + // AlertDialog( + // title: Text("Security Warning".tr), // Or use localized string + // content: Text( + // "Potential security risks detected. The application may not function correctly." + // .tr), //Or use localized string + // actions: [ + // TextButton( + // onPressed: () async { + // await storage.deleteAll(); + // await box.erase(); + // Get.back(); // Close the dialog + // // Or, if you really must, exit the app (but give the user a chance!) + // exit(0); + // }, + // child: Text("OK"), // Or use a localized string + // ), + // ], + // ), + // barrierDismissible: false, // Prevent closing by tapping outside + // ); + // } + static void _showSecurityWarning() { + // Use an RxInt to track the remaining seconds. This is the KEY! + RxInt secondsRemaining = 10.obs; + + Get.dialog( + CupertinoAlertDialog( + title: Text("Security Warning".tr), + content: Column( + mainAxisSize: MainAxisSize.min, + children: [ + Obx(() => Text( + "Potential security risks detected. The application will close in @seconds seconds." + .trParams({ + // Use trParams for placeholders + 'seconds': secondsRemaining.value.toString(), + }), + // Wrap the Text widget in Obx + )), + SizedBox(height: 24), // More spacing before the progress bar + Obx(() => SizedBox( + width: double.infinity, // Make progress bar full width + child: CupertinoActivityIndicator( + // in case of loading + radius: 15, + animating: true, + ))), + SizedBox(height: 8), + Obx(() => ClipRRect( + borderRadius: BorderRadius.circular(8), // Rounded corners + child: LinearProgressIndicator( + value: secondsRemaining.value / 10, + backgroundColor: Colors.grey.shade300, // Lighter background + valueColor: AlwaysStoppedAnimation( + CupertinoColors.systemRed), // iOS-style red + minHeight: 8, // Slightly thicker progress bar + ), + )), + ], + ), + ), + barrierDismissible: false, + ); + + Timer.periodic(Duration(seconds: 1), (timer) { + secondsRemaining.value--; + if (secondsRemaining.value <= 0) { + timer.cancel(); + // Get.back(); + _clearDataAndExit(); + } + }); + } + + static Future _clearDataAndExit() async { + await storage.deleteAll(); + await box.erase(); + exit(0); // Exit the app + print('exit'); + } +} diff --git a/siro_driver/lib/controller/functions/performance_test.dart b/siro_driver/lib/controller/functions/performance_test.dart new file mode 100644 index 0000000..de86828 --- /dev/null +++ b/siro_driver/lib/controller/functions/performance_test.dart @@ -0,0 +1,43 @@ +import 'dart:io'; + +class PerformanceTester { + /// ✅ فحص سرعة الكتابة إلى التخزين (Storage Write Speed) بوحدة MB/s + static Future testStorageWriteSpeed() async { + try { + final tempDir = Directory.systemTemp; + final testFile = File('${tempDir.path}/speed_test.txt'); + final data = List.filled(1024 * 1024 * 5, 0); // 5MB + + final stopwatch = Stopwatch()..start(); + await testFile.writeAsBytes(data, flush: true); + stopwatch.stop(); + + await testFile.delete(); + + double seconds = stopwatch.elapsedMilliseconds / 1000; + if (seconds == 0) seconds = 0.001; + + final speed = 5 / seconds; + return double.parse(speed.toStringAsFixed(2)); + } catch (e) { + print("❌ Storage write error: $e"); + return 0.0; + } + } + + /// ✅ فحص سرعة المعالج (CPU Compute Speed) بوحدة الثواني + static Future testCPUSpeed() async { + try { + final stopwatch = Stopwatch()..start(); + double x = 0; + for (int i = 0; i < 100000000; i++) { + x += i * 0.000001; + } + stopwatch.stop(); + return stopwatch.elapsedMilliseconds / 1000.0; + } catch (e) { + print("❌ CPU compute error: $e"); + return 999.0; + } + } +} diff --git a/siro_driver/lib/controller/functions/remove_account.dart b/siro_driver/lib/controller/functions/remove_account.dart new file mode 100755 index 0000000..aaeeabf --- /dev/null +++ b/siro_driver/lib/controller/functions/remove_account.dart @@ -0,0 +1,8 @@ +// import 'package:ride/controller/functions/crud.dart'; + +// class RemoveAccount { + +// void removeAccount()async{ +// var res=await CRUD().post(link: link) +// } +// } \ No newline at end of file diff --git a/siro_driver/lib/controller/functions/scan_id_card.dart b/siro_driver/lib/controller/functions/scan_id_card.dart new file mode 100755 index 0000000..b0e6336 --- /dev/null +++ b/siro_driver/lib/controller/functions/scan_id_card.dart @@ -0,0 +1,25 @@ +// import 'package:credit_card_scanner/credit_card_scanner.dart'; +// import 'package:get/get.dart'; +// +// class ScanIdCard extends GetxController { +// CardDetails? _cardDetails; +// CardScanOptions scanOptions = const CardScanOptions( +// scanCardHolderName: true, +// enableDebugLogs: true, +// validCardsToScanBeforeFinishingScan: 5, +// possibleCardHolderNamePositions: [ +// CardHolderNameScanPosition.aboveCardNumber, +// ], +// ); +// +// Future scanCard() async { +// final CardDetails? cardDetails = +// await CardScanner.scanCard(scanOptions: scanOptions); +// if (cardDetails == null) { +// return; +// } +// +// _cardDetails = cardDetails; +// update(); +// } +// } diff --git a/siro_driver/lib/controller/functions/secure_storage.dart b/siro_driver/lib/controller/functions/secure_storage.dart new file mode 100755 index 0000000..c9f6c88 --- /dev/null +++ b/siro_driver/lib/controller/functions/secure_storage.dart @@ -0,0 +1,100 @@ +import 'dart:convert'; + +import 'package:flutter_secure_storage/flutter_secure_storage.dart'; +import 'package:secure_string_operations/secure_string_operations.dart'; +import 'package:siro_driver/controller/auth/captin/login_captin_controller.dart'; +import 'package:siro_driver/controller/functions/encrypt_decrypt.dart'; + +import '../../constant/box_name.dart'; +import '../../constant/char_map.dart'; +import '../../constant/info.dart'; +import '../../constant/links.dart'; +import '../../main.dart'; +import '../../print.dart'; +import 'crud.dart'; + +class SecureStorage { + final FlutterSecureStorage _storage = const FlutterSecureStorage(); + + void saveData(String key, value) async { + await _storage.write(key: key, value: value); + } + + Future readData(String boxName) async { + final String? value = await _storage.read(key: boxName); + return value; + } +} + +const List keysToFetch = [ + 'serverPHP', + 'seferAlexandriaServer', + 'seferPaymentServer', + 'seferCairoServer', + 'seferGizaServer', +]; + +class AppInitializer { + List> links = []; + + Future initializeApp() async { + if (box.read(BoxName.jwt) == null) { + await LoginDriverController().getJWT(); + } else { + String token = r(box.read(BoxName.jwt)).toString().split(AppInformation.addd)[0]; + bool isTokenValid = false; + try { + final parts = token.split('.'); + if (parts.length == 3) { + String payload = parts[1]; + switch (payload.length % 4) { + case 2: payload += '=='; break; + case 3: payload += '='; break; + } + final decoded = jsonDecode(utf8.decode(base64Url.decode(payload))); + final exp = decoded['exp']; + if (exp != null) { + isTokenValid = DateTime.now().millisecondsSinceEpoch < (exp * 1000 - 30000); + } + } + } catch (_) {} + if (!isTokenValid) { + await LoginDriverController().getJWT(); + } + } + + // await getKey(); + } + + Future getAIKey(String key1) async { + var res = + await CRUD().get(link: AppLink.getapiKey, payload: {"keyName": key1}); + + if (res != 'failure') { + var d = jsonDecode(res)['message']; + final rawValue = d[key1].toString(); + + // ✅ اكتبها في storage + await storage.write(key: key1, value: rawValue); + + await Future.delayed(Duration.zero); + } + } + + Future getKey() async { + try { + var res = + await CRUD().get(link: AppLink.getLocationAreaLinks, payload: {}); + if (res != 'failure') { + links = List>.from(jsonDecode(res)['message']); + + await box.write(BoxName.locationName, links); + await box.write(BoxName.basicLink, (links[0]['server_link'])); + await box.write(links[2]['name'], (links[2]['server_link'])); + await box.write(links[1]['name'], (links[3]['server_link'])); + await box.write(links[3]['name'], (links[1]['server_link'])); + await box.write(BoxName.paymentLink, (links[4]['server_link'])); + } + } catch (e) {} + } +} diff --git a/siro_driver/lib/controller/functions/security_checks.dart b/siro_driver/lib/controller/functions/security_checks.dart new file mode 100755 index 0000000..b1715cc --- /dev/null +++ b/siro_driver/lib/controller/functions/security_checks.dart @@ -0,0 +1,51 @@ +import 'package:flutter/material.dart'; +import 'package:flutter/services.dart'; +import 'package:get/get.dart'; + +import '../../constant/box_name.dart'; +import '../../main.dart'; + +class SecurityChecks { + static const platform = MethodChannel( + 'com.intaleq_driver/security'); // Choose a unique channel name + + static Future isDeviceCompromised() async { + try { + final bool result = await platform + .invokeMethod('isNativeRooted'); // Invoke the native method + return result; + } on PlatformException catch (e) { + print("Failed to check security status: ${e.message}"); + return true; // Treat platform errors as a compromised device (for safety) + } + } + + static isDeviceRootedFromNative(BuildContext context) async { + bool compromised = await isDeviceCompromised(); + if (compromised) { + showDialog( + barrierDismissible: false, + context: context, + builder: (context) => AlertDialog( + title: Text("Security Warning".tr), + content: Text( + "Your device appears to be compromised. The app will now close." + .tr), + actions: [ + TextButton( + onPressed: () { + SystemNavigator.pop(); // Close the app + }, + child: Text("OK"), + ), + ], + ), + ); + } else { + box.write(BoxName.security_check, 'passed'); + + // Continue with normal app flow + print("Device is secure."); + } + } +} diff --git a/siro_driver/lib/controller/functions/sms_egypt_controller.dart b/siro_driver/lib/controller/functions/sms_egypt_controller.dart new file mode 100755 index 0000000..fcb0f31 --- /dev/null +++ b/siro_driver/lib/controller/functions/sms_egypt_controller.dart @@ -0,0 +1,104 @@ +import 'dart:convert'; + +import 'package:siro_driver/constant/api_key.dart'; +import 'package:siro_driver/constant/box_name.dart'; +import 'package:siro_driver/constant/info.dart'; +import 'package:siro_driver/constant/links.dart'; +import 'package:siro_driver/controller/auth/captin/register_captin_controller.dart'; +import 'package:siro_driver/controller/functions/crud.dart'; +import 'package:siro_driver/main.dart'; +import 'package:siro_driver/views/widgets/elevated_btn.dart'; +import 'package:get/get.dart'; +import 'package:http/http.dart' as http; + +import '../auth/captin/login_captin_controller.dart'; +import 'encrypt_decrypt.dart'; + +class SmsEgyptController extends GetxController { + var headers = {'Content-Type': 'application/json'}; + + Future getSender() async { + var res = await CRUD().get(link: AppLink.getSender, payload: {}); + if (res != 'failure') { + var d = jsonDecode(res)['message'][0]['senderId'].toString(); + return d; + } else { + return "Sefer Egy"; + } + } + + Future sendSmsEgypt(String phone) async { + String sender = await getSender(); + var body = jsonEncode({"receiver": "2$phone"}); + + var res = await http.post( + Uri.parse(AppLink.sendSms), + body: body, + headers: headers, + ); + + if (jsonDecode(res.body)['message'].toString() != "Success") { + await CRUD().post(link: AppLink.updatePhoneInvalidSMS, payload: { + "phone_number": + ('+2${Get.find().phoneController.text}') + }); + box.write(BoxName.phoneDriver, + ('+2${Get.find().phoneController.text}')); + box.write(BoxName.phoneVerified, '1'); + + await Get.put(LoginDriverController()).loginWithGoogleCredential( + box.read(BoxName.driverID).toString(), + (box.read(BoxName.emailDriver).toString()), + ); + } else { + Get.defaultDialog( + title: 'You will receive code in sms message'.tr, + middleText: '', + confirm: MyElevatedButton( + title: 'OK'.tr, + onPressed: () { + Get.back(); + })); + } + } + + Future checkCredit(String phone, otp) async { + var res = await http.post( + Uri.parse(AppLink.checkCredit), + body: { + "username": AppInformation.appName, + "password": AK.smsPasswordEgypt, + }, + headers: headers, + ); + } + + Future sendSmsWithValidaty(String phone, otp) async { + var res = await http.post( + Uri.parse(AppLink.checkCredit), + body: { + "username": 'Sefer', + "password": AK.smsPasswordEgypt, + "message": "This is an example SMS message.", + "language": box.read(BoxName.lang) == 'en' ? "e" : 'r', + "sender": "Sefer", //"Kazumi", // todo add sefer sender name + "receiver": "2$phone", + "validity": "10", + "StartTime": DateTime.now().toString() // "1/1/2024 10:00:00" + }, + headers: headers, + ); + } + + Future sendSmsStatus(String smsid) async { + var res = await http.post( + Uri.parse(AppLink.checkCredit), + body: { + "username": AppInformation.appName, + "password": AK.smsPasswordEgypt, + "smsid": smsid //"00b77dfc-5b8f-474d-9def-9f0158b70f98" + }, + headers: headers, + ); + } +} diff --git a/siro_driver/lib/controller/functions/toast.dart b/siro_driver/lib/controller/functions/toast.dart new file mode 100755 index 0000000..83dee52 --- /dev/null +++ b/siro_driver/lib/controller/functions/toast.dart @@ -0,0 +1,35 @@ +import 'package:flutter/material.dart'; +import 'package:get/get.dart'; +import 'package:siro_driver/constant/colors.dart'; +import 'package:siro_driver/constant/style.dart'; + +class Toast { + static void show(BuildContext context, String message, Color color) { + final snackBar = SnackBar( + clipBehavior: Clip.antiAliasWithSaveLayer, + backgroundColor: color, + elevation: 3, + content: Text( + message, + style: AppStyle.title.copyWith(color: AppColor.secondaryColor), + ), + behavior: SnackBarBehavior.floating, + animation: const AlwaysStoppedAnimation(1.0), + shape: RoundedRectangleBorder( + borderRadius: BorderRadius.circular(10.0), // Custom border radius + ), + width: Get.width * .8, + // shape: const StadiumBorder( + // side: BorderSide( + // color: AppColor.secondaryColor, + // width: 1.0, + // style: BorderStyle.solid, + // )), + duration: const Duration(seconds: 2), + ); + + ScaffoldMessenger.of(context).showSnackBar( + snackBar, + ); + } +} diff --git a/siro_driver/lib/controller/functions/tts.dart b/siro_driver/lib/controller/functions/tts.dart new file mode 100755 index 0000000..ce65cfd --- /dev/null +++ b/siro_driver/lib/controller/functions/tts.dart @@ -0,0 +1,93 @@ +import 'dart:io'; +import 'package:flutter_tts/flutter_tts.dart'; +import 'package:get/get.dart'; +import 'package:siro_driver/constant/box_name.dart'; +import 'package:siro_driver/main.dart'; + +class TextToSpeechController extends GetxController { + final FlutterTts flutterTts = FlutterTts(); + bool isSpeaking = false; + + @override + void onInit() { + super.onInit(); + initTts(); + } + + @override + void onClose() { + flutterTts.stop(); + super.onClose(); + } + + // --- 1. تهيئة المحرك بإعدادات قوية للملاحة --- + Future initTts() async { + try { + // جلب اللغة المحفوظة أو استخدام العربية كافتراضي + String lang = box.read(BoxName.lang) ?? 'ar-SA'; + + // تصحيح صيغة اللغة إذا لزم الأمر + if (lang == 'ar') lang = 'ar-SA'; + if (lang == 'en') lang = 'en-US'; + + await flutterTts.setLanguage(lang); + await flutterTts.setSpeechRate(0.5); // سرعة متوسطة وواضحة + await flutterTts.setVolume(1.0); + await flutterTts.setPitch(1.0); + + // إعدادات خاصة لضمان عمل الصوت مع الملاحة (خاصة للآيفون) + if (Platform.isIOS) { + await flutterTts + .setIosAudioCategory(IosTextToSpeechAudioCategory.playback, [ + IosTextToSpeechAudioCategoryOptions.mixWithOthers, + IosTextToSpeechAudioCategoryOptions.duckOthers + ]); + } + + // الاستماع لحالة الانتهاء + flutterTts.setCompletionHandler(() { + isSpeaking = false; + update(); + }); + + flutterTts.setStartHandler(() { + isSpeaking = true; + update(); + }); + } catch (e) { + print("TTS Init Error: $e"); + } + } + + // --- 2. دالة التحدث (تقاطع الكلام القديم) --- + Future speakText(String text) async { + if (text.isEmpty) return; + + try { + // إيقاف أي كلام حالي لضمان نطق التوجيه الجديد فوراً (أهم للملاحة) + await flutterTts.stop(); + + var result = await flutterTts.speak(text); + if (result == 1) { + isSpeaking = true; + update(); + } + } catch (error) { + // لا تعرض سناك بار هنا لتجنب إزعاج السائق أثناء القيادة + print('Failed to speak text: $error'); + } + } + + // --- 3. دالة الإيقاف (ضرورية لزر الكتم) --- + Future stop() async { + try { + var result = await flutterTts.stop(); + if (result == 1) { + isSpeaking = false; + update(); + } + } catch (e) { + print("Error stopping TTS: $e"); + } + } +} diff --git a/siro_driver/lib/controller/functions/twilio_service.dart b/siro_driver/lib/controller/functions/twilio_service.dart new file mode 100755 index 0000000..34259e8 --- /dev/null +++ b/siro_driver/lib/controller/functions/twilio_service.dart @@ -0,0 +1,22 @@ +// import 'package:ride/constant/credential.dart'; +// import 'package:twilio_flutter/twilio_flutter.dart'; +// +// class TwilioSMS { +// TwilioFlutter twilioFlutter = TwilioFlutter( +// accountSid: AppCredintials.accountSIDTwillo, +// authToken: AppCredintials.authTokenTwillo, +// twilioNumber: '+962 7 9858 3052'); +// +// Future sendSMS({ +// required String recipientPhoneNumber, +// required String message, +// }) async { +// try { +// await twilioFlutter.sendSMS( +// toNumber: recipientPhoneNumber, +// messageBody: message, +// ); +// } catch (e) { +// } +// } +// } diff --git a/siro_driver/lib/controller/functions/upload_image.dart b/siro_driver/lib/controller/functions/upload_image.dart new file mode 100755 index 0000000..81cf9cc --- /dev/null +++ b/siro_driver/lib/controller/functions/upload_image.dart @@ -0,0 +1,537 @@ +import 'dart:convert'; +import 'dart:io'; +import 'package:siro_driver/constant/api_key.dart'; +import 'package:siro_driver/views/widgets/error_snakbar.dart'; +import 'package:get/get.dart'; +import 'package:http/http.dart' as http; +import 'package:image_cropper/image_cropper.dart'; +import 'package:image_picker/image_picker.dart'; +import 'package:path/path.dart'; +import 'package:image/image.dart' as img; + +import 'package:flutter_image_compress/flutter_image_compress.dart'; +import 'package:path_provider/path_provider.dart' as path_provider; + +import '../../constant/box_name.dart'; +import '../../constant/colors.dart'; +import '../../constant/info.dart'; +import '../../main.dart'; +import '../../print.dart'; +import 'encrypt_decrypt.dart'; + +class ImageController extends GetxController { + File? myImage; + bool isloading = false; + CroppedFile? croppedFile; + final picker = ImagePicker(); + var image; + + Future detectAndCropDocument(File imageFile) async { + img.Image? image = img.decodeImage(await imageFile.readAsBytes()); + if (image == null) throw Exception('Unable to decode image'); + + int left = image.width, top = image.height, right = 0, bottom = 0; + + // Threshold for considering a pixel as part of the document (adjust as needed) + const int threshold = 240; + + for (int y = 0; y < image.height; y++) { + for (int x = 0; x < image.width; x++) { + final pixel = image.getPixel(x, y); + final luminance = img.getLuminance(pixel); + + if (luminance < threshold) { + left = x < left ? x : left; + top = y < top ? y : top; + right = x > right ? x : right; + bottom = y > bottom ? y : bottom; + } + } + } + + // Add a small padding + left = (left - 5).clamp(0, image.width); + top = (top - 5).clamp(0, image.height); + right = (right + 5).clamp(0, image.width); + bottom = (bottom + 5).clamp(0, image.height); + + return img.copyCrop(image, + x: left, y: top, width: right - left, height: bottom - top); + } + + Future rotateImageIfNeeded(File imageFile) async { + img.Image croppedDoc = await detectAndCropDocument(imageFile); + + // Check if the document is in portrait orientation + bool isPortrait = croppedDoc.height > croppedDoc.width; + + img.Image processedImage; + if (isPortrait) { + // Rotate the image by 90 degrees clockwise + processedImage = img.copyRotate(croppedDoc, angle: 90); + } else { + processedImage = croppedDoc; + } + + // Get temporary directory + final tempDir = await path_provider.getTemporaryDirectory(); + final tempPath = tempDir.path; + + // Create the processed image file + File processedFile = File('$tempPath/processed_image.jpg'); + await processedFile.writeAsBytes(img.encodeJpg(processedImage)); + + return processedFile; + } + + Future rotateImage(File imageFile) async { + // Read the image file + img.Image? image = img.decodeImage(await imageFile.readAsBytes()); + + if (image == null) return imageFile; + + // Rotate the image by 90 degrees clockwise + img.Image rotatedImage = img.copyRotate(image, angle: 90); + + // Get temporary directory + final tempDir = await path_provider.getTemporaryDirectory(); + final tempPath = tempDir.path; + + // Create the rotated image file + File rotatedFile = File('$tempPath/rotated_image.jpg'); + await rotatedFile.writeAsBytes(img.encodeJpg(rotatedImage)); + + return rotatedFile; + } + + choosImage(String link, String imageType) async { + try { + final pickedImage = await picker.pickImage( + source: ImageSource.camera, + preferredCameraDevice: CameraDevice.rear, + ); + + if (pickedImage == null) return; + + image = File(pickedImage.path); + + croppedFile = await ImageCropper().cropImage( + sourcePath: image!.path, + uiSettings: [ + AndroidUiSettings( + toolbarTitle: 'Cropper'.tr, + toolbarColor: AppColor.blueColor, + toolbarWidgetColor: AppColor.yellowColor, + initAspectRatio: CropAspectRatioPreset.original, + lockAspectRatio: false, + ), + IOSUiSettings( + title: 'Cropper'.tr, + ), + ], + ); + + if (croppedFile == null) return; + + myImage = File(croppedFile!.path); + isloading = true; + update(); + + // Rotate the compressed image + File processedImage = await rotateImageIfNeeded(File(croppedFile!.path)); + File compressedImage = await compressImage(processedImage); + + print('link =$link'); + // Log.print('link: ${link}'); +//n8u22456 + await uploadImage( + compressedImage, + { + 'driverID': + box.read(BoxName.driverID) ?? box.read(BoxName.passengerID), + 'imageType': imageType, + }, + link, + ); + } catch (e) { + print('Error in choosImage: $e'); + mySnackeBarError('Image Upload Failed'.tr); + // Get.snackbar('Image Upload Failed'.tr, e.toString(), + // backgroundColor: AppColor.primaryColor); + } finally { + isloading = false; + update(); + } + } + + choosImageNewCAr(String link, String imageType) async { + try { + final pickedImage = await picker.pickImage( + source: ImageSource.camera, + preferredCameraDevice: CameraDevice.rear, + ); + + if (pickedImage == null) return; + + image = File(pickedImage.path); + + croppedFile = await ImageCropper().cropImage( + sourcePath: image!.path, + uiSettings: [ + AndroidUiSettings( + toolbarTitle: 'Cropper'.tr, + toolbarColor: AppColor.blueColor, + toolbarWidgetColor: AppColor.yellowColor, + initAspectRatio: CropAspectRatioPreset.original, + lockAspectRatio: false, + ), + IOSUiSettings( + title: 'Cropper'.tr, + ), + ], + ); + + if (croppedFile == null) return; + + myImage = File(croppedFile!.path); + isloading = true; + update(); + + // Rotate the compressed image + File processedImage = await rotateImageIfNeeded(File(croppedFile!.path)); + File compressedImage = await compressImage(processedImage); + + print('link =$link'); + // Log.print('link: ${link}'); +//n8u22456 + await uploadNewCar( + compressedImage, + { + 'driverID': box.read(BoxName.driverID) + + '_' + + DateTime.now().toIso8601String(), + 'imageType': imageType, + }, + link, + ); + } catch (e) { + print('Error in choosImage: $e'); + // Get.snackbar('Image Upload Failed'.tr, e.toString(), + // backgroundColor: AppColor.primaryColor); + mySnackeBarError('Image Upload Failed'.tr); + } finally { + isloading = false; + update(); + } + } + + // choosFaceFromDriverLicense(String link, String imageType) async { + // final pickedImage = await picker.pickImage( + // source: ImageSource.camera, + // preferredCameraDevice: CameraDevice.rear, + // ); + + // if (pickedImage == null) return; + + // image = File(pickedImage.path); + + // File? processedImage; + + // // For face images, use face detection and cropping + // processedImage = await detectAndCropFace(image!); + // if (processedImage == null) { + // Get.snackbar('Face Detection Failed', 'No face detected in the image.'); + // return; + // } + + // isloading = true; + // update(); + + // File compressedImage = await compressImage(processedImage); + + // try { + // await uploadImage( + // compressedImage, + // { + // 'driverID': box.read(BoxName.driverID).toString(), + // 'imageType': imageType + // }, + // link, + // ); + // } catch (e) { + // Get.snackbar('Image Upload Failed'.tr, e.toString(), + // backgroundColor: AppColor.redColor); + // } finally { + // isloading = false; + // update(); + // } + // } + + choosFace(String link, String imageType) async { + final pickedImage = await picker.pickImage( + source: ImageSource.camera, + preferredCameraDevice: CameraDevice.front, + ); + if (pickedImage != null) { + image = File(pickedImage.path); + isloading = true; + update(); +// Compress the image + File compressedImage = await compressImage(File(pickedImage.path)); + + // Save the picked image directly + // File savedImage = File(pickedImage.path); + print('link =$link'); + try { + await uploadImage( + compressedImage, + { + 'driverID': + box.read(BoxName.driverID) ?? box.read(BoxName.passengerID), + 'imageType': imageType + }, + link, + ); + } catch (e) { + mySnackeBarError('Image Upload Failed'.tr); + // Get.snackbar('Image Upload Failed'.tr, e.toString(), + // backgroundColor: AppColor.redColor); + } finally { + isloading = false; + update(); + } + } + } + + uploadImage(File file, Map data, String link) async { + final String token = r(box.read(BoxName.jwt)).split(AppInformation.addd)[0]; + final String fingerPrint = box.read(BoxName.deviceFingerprint)?.toString() ?? ''; + + var request = http.MultipartRequest('POST', Uri.parse(link)); + Log.print('uploadImage -> $link'); + + request.headers.addAll({ + 'Authorization': 'Bearer $token', + 'X-Device-FP': fingerPrint, + }); + + var length = await file.length(); + var stream = http.ByteStream(file.openRead()); + request.files.add( + http.MultipartFile( + 'image', + stream, + length, + filename: '${box.read(BoxName.driverID)}.jpg', + ), + ); + data.forEach((key, value) { + request.fields[key] = value; + }); + + var myrequest = await request.send(); + var res = await http.Response.fromStream(myrequest); + Log.print('uploadImage response [${res.statusCode}]: ${res.body}'); + if (res.statusCode == 200) { + return jsonDecode(res.body); + } else { + throw Exception('Failed to upload image: ${res.statusCode} - ${res.body}'); + } + } + + uploadNewCar(File file, Map data, String link) async { + final String token = r(box.read(BoxName.jwt)).split(AppInformation.addd)[0]; + final String fingerPrint = box.read(BoxName.deviceFingerprint)?.toString() ?? ''; + + var request = http.MultipartRequest('POST', Uri.parse(link)); + request.headers.addAll({ + 'Authorization': 'Bearer $token', + 'X-Device-FP': fingerPrint, + }); + + var length = await file.length(); + var stream = http.ByteStream(file.openRead()); + request.files.add( + http.MultipartFile( + 'image', + stream, + length, + filename: '${box.read(BoxName.driverID)}.jpg', + ), + ); + data.forEach((key, value) { + request.fields[key] = value; + }); + + var myrequest = await request.send(); + var res = await http.Response.fromStream(myrequest); + Log.print('uploadNewCar response [${res.statusCode}]: ${res.body}'); + if (res.statusCode == 200) { + return jsonDecode(res.body); + } else { + throw Exception('Failed to upload image: ${res.statusCode} - ${res.body}'); + } + } + + choosImagePicture(String link, String imageType) async { + final pickedImage = await picker.pickImage( + source: ImageSource.gallery, + // preferredCameraDevice: CameraDevice.rear, + // maxHeight: Get.height * .3, + // maxWidth: Get.width * .9, + // imageQuality: 100, + ); + image = File(pickedImage!.path); + + croppedFile = await ImageCropper().cropImage( + sourcePath: image!.path, + uiSettings: [ + AndroidUiSettings( + toolbarTitle: 'Cropper'.tr, + toolbarColor: AppColor.blueColor, + toolbarWidgetColor: AppColor.yellowColor, + initAspectRatio: CropAspectRatioPreset.original, + lockAspectRatio: false), + IOSUiSettings( + title: 'Cropper'.tr, + ), + ], + ); + myImage = File(pickedImage.path); + isloading = true; + update(); +// Save the cropped image + // File savedCroppedImage = File(croppedFile!.path); + File compressedImage = await compressImage(File(croppedFile!.path)); + print('link =$link'); + try { + var response = await uploadImage( + compressedImage, + {'driverID': (box.read(BoxName.driverID)), 'imageType': imageType}, + link, + ); + + // Save the returned URL from the V3 backend to local storage + if (response != null && response['status'] == 'success' && response['message'] != null) { + if (response['message']['file_link'] != null) { + box.write(BoxName.driverPhotoUrl, response['message']['file_link'].toString()); + } + } + } catch (e) { + Log.print('e: ${e}'); + mySnackeBarError('Image Upload Failed'.tr); + } finally { + isloading = false; + update(); + } + } + + uploadImagePicture(File file, Map data, String link) async { + final String token = r(box.read(BoxName.jwt)).split(AppInformation.addd)[0]; + final String fingerPrint = box.read(BoxName.deviceFingerprint)?.toString() ?? ''; + + var request = http.MultipartRequest('POST', Uri.parse(link)); + request.headers.addAll({ + 'Authorization': 'Bearer $token', + 'X-Device-FP': fingerPrint, + }); + + var length = await file.length(); + var stream = http.ByteStream(file.openRead()); + request.files.add( + http.MultipartFile( + 'image', + stream, + length, + filename: '${box.read(BoxName.driverID)}.jpg', + ), + ); + data.forEach((key, value) { + request.fields[key] = value; + }); + + var myrequest = await request.send(); + var res = await http.Response.fromStream(myrequest); + Log.print('uploadImagePicture response [${res.statusCode}]: ${res.body}'); + if (res.statusCode == 200) { + return jsonDecode(res.body); + } else { + throw Exception('Failed to upload image: ${res.statusCode} - ${res.body}'); + } + } +} + +Future compressImage(File file) async { + final dir = await path_provider.getTemporaryDirectory(); + final targetPath = "${dir.absolute.path}/temp.jpg"; + + var result = await FlutterImageCompress.compressAndGetFile( + file.absolute.path, + targetPath, + quality: 70, + minWidth: 1024, + minHeight: 1024, + ); + + return File(result!.path); +} + +// Future detectAndCropFace(File imageFile) async { +// final inputImage = InputImage.fromFilePath(imageFile.path); +// final options = FaceDetectorOptions( +// enableClassification: false, +// enableLandmarks: false, +// enableTracking: false, +// minFaceSize: 0.15, +// performanceMode: FaceDetectorMode.accurate, +// ); +// final faceDetector = FaceDetector(options: options); + +// try { +// final List faces = await faceDetector.processImage(inputImage); +// final image = img.decodeImage(await imageFile.readAsBytes()); + +// if (image == null) throw Exception('Unable to decode image'); + +// int left, top, width, height; + +// if (faces.isNotEmpty) { +// // Face detected, crop around the face +// final face = faces[0]; +// double padding = 0.2; // 20% padding +// int paddingX = (face.boundingBox.width * padding).round(); +// int paddingY = (face.boundingBox.height * padding).round(); + +// left = (face.boundingBox.left - paddingX).round(); +// top = (face.boundingBox.top - paddingY).round(); +// width = (face.boundingBox.width + 2 * paddingX).round(); +// height = (face.boundingBox.height + 2 * paddingY).round(); +// } else { +// // No face detected, crop the center of the image +// int size = min(image.width, image.height); +// left = (image.width - size) ~/ 2; +// top = (image.height - size) ~/ 2; +// width = size; +// height = size; +// } + +// // Ensure dimensions are within image bounds +// left = left.clamp(0, image.width - 1); +// top = top.clamp(0, image.height - 1); +// width = width.clamp(1, image.width - left); +// height = height.clamp(1, image.height - top); + +// final croppedImage = +// img.copyCrop(image, x: left, y: top, width: width, height: height); + +// // Save the cropped image +// final tempDir = await path_provider.getTemporaryDirectory(); +// final tempPath = tempDir.path; +// final croppedFile = File('$tempPath/cropped_image.jpg'); +// await croppedFile.writeAsBytes(img.encodeJpg(croppedImage, quality: 100)); + +// return croppedFile; +// } finally { +// faceDetector.close(); +// } +// } diff --git a/siro_driver/lib/controller/functions/vibrate.dart b/siro_driver/lib/controller/functions/vibrate.dart new file mode 100755 index 0000000..de2510c --- /dev/null +++ b/siro_driver/lib/controller/functions/vibrate.dart @@ -0,0 +1,15 @@ +import 'package:get/get.dart'; + +import '../../constant/box_name.dart'; +import '../../main.dart'; + +class HomePageController extends GetxController { + late bool isVibrate = box.read(BoxName.isvibrate) ?? true; + + void changeVibrateOption(bool value) { + isVibrate = box.read(BoxName.isvibrate) ?? true; + isVibrate = value; + box.write(BoxName.isvibrate, value); + update(); + } +} diff --git a/siro_driver/lib/controller/gamification/challenges_controller.dart b/siro_driver/lib/controller/gamification/challenges_controller.dart new file mode 100644 index 0000000..5ff137e --- /dev/null +++ b/siro_driver/lib/controller/gamification/challenges_controller.dart @@ -0,0 +1,298 @@ +import 'dart:convert'; +import 'package:flutter/material.dart'; +import 'package:get/get.dart'; +import 'package:siro_driver/constant/box_name.dart'; +import 'package:siro_driver/constant/links.dart'; +import 'package:siro_driver/controller/functions/crud.dart'; +import '../../../main.dart'; + +// ════════════════════════════════════════════ +// نموذج التحدي +// ════════════════════════════════════════════ + +class Challenge { + final String id; + final String titleEn; + final String titleAr; + final String descriptionEn; + final String descriptionAr; + final IconData icon; + final Color color; + final int target; + final int reward; // نقاط + final String type; // 'daily' or 'weekly' + final String metric; // 'trips', 'earnings', 'hours', 'acceptance_rate' + int currentProgress; + bool isClaimed; + + Challenge({ + required this.id, + required this.titleEn, + required this.titleAr, + required this.descriptionEn, + required this.descriptionAr, + required this.icon, + required this.color, + required this.target, + required this.reward, + required this.type, + required this.metric, + this.currentProgress = 0, + this.isClaimed = false, + }); + + double get progress => (currentProgress / target).clamp(0.0, 1.0); + bool get isCompleted => currentProgress >= target; +} + +// ════════════════════════════════════════════ +// Controller +// ════════════════════════════════════════════ + +class ChallengesController extends GetxController { + bool isLoading = false; + List dailyChallenges = []; + List weeklyChallenges = []; + + @override + void onInit() { + super.onInit(); + _generateChallenges(); + _loadProgress(); + fetchChallengeProgress(); + } + + void _generateChallenges() { + final now = DateTime.now(); + final isWeekend = now.weekday == 5 || now.weekday == 6; // الجمعة والسبت + + dailyChallenges = [ + Challenge( + id: 'daily_trips_5', + titleEn: 'Road Runner', + titleAr: 'سائق سريع', + descriptionEn: 'Complete 5 trips today', + descriptionAr: 'أكمل 5 رحلات اليوم', + icon: Icons.local_taxi_rounded, + color: const Color(0xFF2196F3), + target: 5, + reward: 50, + type: 'daily', + metric: 'trips', + ), + Challenge( + id: 'daily_trips_10', + titleEn: 'Marathon Driver', + titleAr: 'سائق الماراثون', + descriptionEn: 'Complete 10 trips today', + descriptionAr: 'أكمل 10 رحلات اليوم', + icon: Icons.directions_car_rounded, + color: const Color(0xFFFF9800), + target: 10, + reward: 150, + type: 'daily', + metric: 'trips', + ), + Challenge( + id: 'daily_earnings', + titleEn: 'Money Maker', + titleAr: 'صانع المال', + descriptionEn: 'Earn 3000 SYP today', + descriptionAr: 'اربح 3000 ل.س اليوم', + icon: Icons.monetization_on_rounded, + color: const Color(0xFF4CAF50), + target: 3000, + reward: 100, + type: 'daily', + metric: 'earnings', + ), + if (isWeekend) + Challenge( + id: 'daily_weekend_bonus', + titleEn: 'Weekend Warrior', + titleAr: 'محارب عطلة نهاية الأسبوع', + descriptionEn: 'Complete 8 trips on the weekend', + descriptionAr: 'أكمل 8 رحلات في عطلة نهاية الأسبوع', + icon: Icons.celebration_rounded, + color: const Color(0xFFE91E63), + target: 8, + reward: 200, + type: 'daily', + metric: 'trips', + ), + ]; + + weeklyChallenges = [ + Challenge( + id: 'weekly_trips_30', + titleEn: 'Weekly Champion', + titleAr: 'بطل الأسبوع', + descriptionEn: 'Complete 30 trips this week', + descriptionAr: 'أكمل 30 رحلة هذا الأسبوع', + icon: Icons.emoji_events_rounded, + color: const Color(0xFFFFD700), + target: 30, + reward: 300, + type: 'weekly', + metric: 'trips', + ), + Challenge( + id: 'weekly_earnings', + titleEn: 'Big Earner', + titleAr: 'الربح الكبير', + descriptionEn: 'Earn 20,000 SYP this week', + descriptionAr: 'اربح 20,000 ل.س هذا الأسبوع', + icon: Icons.account_balance_wallet_rounded, + color: const Color(0xFF9C27B0), + target: 20000, + reward: 500, + type: 'weekly', + metric: 'earnings', + ), + Challenge( + id: 'weekly_hours', + titleEn: 'Time Master', + titleAr: 'سيد الوقت', + descriptionEn: 'Drive for 20 hours this week', + descriptionAr: 'اقضِ 20 ساعة في القيادة هذا الأسبوع', + icon: Icons.timer_rounded, + color: const Color(0xFF00BCD4), + target: 20, + reward: 400, + type: 'weekly', + metric: 'hours', + ), + ]; + } + + void _loadProgress() { + final today = DateTime.now().toIso8601String().split('T')[0]; + final savedDate = box.read('challenges_date'); + + if (savedDate != today) { + // يوم جديد — إعادة تعيين التحديات اليومية + box.write('challenges_date', today); + for (var c in dailyChallenges) { + box.write('challenge_${c.id}_claimed', false); + } + } + + // تحميل حالة المطالبة + for (var c in dailyChallenges) { + c.isClaimed = box.read('challenge_${c.id}_claimed') ?? false; + } + for (var c in weeklyChallenges) { + c.isClaimed = box.read('challenge_${c.id}_claimed') ?? false; + } + } + + Future fetchChallengeProgress() async { + isLoading = true; + update(); + + try { + // جلب رحلات اليوم + var todayRes = await CRUD().getWallet( + link: AppLink.getDriverPaymentToday, + payload: {'driverID': box.read(BoxName.driverID).toString()}, + ); + + int todayTrips = 0; + double todayEarnings = 0; + + if (todayRes != null && todayRes != 'failure') { + var data = jsonDecode(todayRes); + todayEarnings = double.tryParse(data['message']?[0]?['todayAmount']?.toString() ?? '0') ?? 0; + todayTrips = int.tryParse(data['message']?[0]?['todayCount']?.toString() ?? '0') ?? 0; + } + + // تحديث التحديات اليومية + for (var c in dailyChallenges) { + switch (c.metric) { + case 'trips': + c.currentProgress = todayTrips; + break; + case 'earnings': + c.currentProgress = todayEarnings.toInt(); + break; + } + } + + // 2. Fetch weekly earnings from PAYMENT server + var weeklyEarningsRes = await CRUD().getWallet( + link: AppLink.getDriverWeekPaymentMove, + payload: {'driverID': box.read(BoxName.driverID).toString()}, + ); + + double weeklyEarnings = 0; + if (weeklyEarningsRes != null && weeklyEarningsRes != 'failure') { + var data = jsonDecode(weeklyEarningsRes); + if (data['message'] is List && data['message'].isNotEmpty) { + weeklyEarnings = double.tryParse(data['message'][0]['totalAmount']?.toString() ?? '0') ?? 0; + } + } + + // 3. Fetch weekly trips and hours from RIDES server (avoiding earnings join) + var weeklyAggregateRes = await CRUD().get( + link: AppLink.getWeeklyAggregate, + payload: {'driver_id': box.read(BoxName.driverID).toString()}, + ); + + int weeklyTrips = 0; + double weeklyHours = 0; + + if (weeklyAggregateRes != null && weeklyAggregateRes != 'failure') { + var data = jsonDecode(weeklyAggregateRes); + if (data['message'] is List) { + for (var day in data['message']) { + weeklyTrips += int.tryParse(day['trips']?.toString() ?? '0') ?? 0; + weeklyHours += double.tryParse(day['hours']?.toString() ?? '0') ?? 0; + } + } + } + + for (var c in weeklyChallenges) { + switch (c.metric) { + case 'trips': + c.currentProgress = weeklyTrips; + break; + case 'earnings': + c.currentProgress = weeklyEarnings.toInt(); + break; + case 'hours': + c.currentProgress = weeklyHours.toInt(); + break; + } + } + } catch (e) { + debugPrint('❌ [Challenges] Error: $e'); + } + + isLoading = false; + update(); + } + + Future claimReward(Challenge challenge) async { + if (!challenge.isCompleted || challenge.isClaimed) return; + + try { + var res = await CRUD().post( + link: AppLink.claimChallengeReward, + payload: { + 'driver_id': box.read(BoxName.driverID).toString(), + 'challenge_id': challenge.id, + 'points': challenge.reward.toString(), + }, + ); + + if (res != null && res != 'failure') { + challenge.isClaimed = true; + box.write('challenge_${challenge.id}_claimed', true); + debugPrint('🎉 Claimed ${challenge.reward} points for ${challenge.id}'); + update(); + } + } catch (e) { + debugPrint('❌ [Challenges] Claim error: $e'); + } + } +} diff --git a/siro_driver/lib/controller/gamification/gamification_controller.dart b/siro_driver/lib/controller/gamification/gamification_controller.dart new file mode 100644 index 0000000..ee4fd1a --- /dev/null +++ b/siro_driver/lib/controller/gamification/gamification_controller.dart @@ -0,0 +1,453 @@ +import 'dart:convert'; +import 'package:flutter/material.dart'; +import 'package:get/get.dart'; +import 'package:siro_driver/constant/box_name.dart'; +import 'package:siro_driver/constant/links.dart'; +import 'package:siro_driver/controller/functions/crud.dart'; +import '../../main.dart'; + +// ════════════════════════════════════════════ +// نماذج البيانات +// ════════════════════════════════════════════ + +class DriverLevel { + final String id; + final String nameEn; + final String nameAr; + final String emoji; + final Color color; + final Color gradientEnd; + final int minPoints; + final int maxPoints; + final double commissionDiscount; // نسبة الخصم على العمولة + final List perks; + + const DriverLevel({ + required this.id, + required this.nameEn, + required this.nameAr, + required this.emoji, + required this.color, + required this.gradientEnd, + required this.minPoints, + required this.maxPoints, + required this.commissionDiscount, + required this.perks, + }); +} + +class Achievement { + final String id; + final String titleEn; + final String titleAr; + final String descriptionEn; + final String descriptionAr; + final IconData icon; + final Color color; + final int target; + final String type; // 'trips', 'rating', 'earnings', 'streak', 'referral' + bool isUnlocked; + int currentProgress; + final DateTime? unlockedAt; + + Achievement({ + required this.id, + required this.titleEn, + required this.titleAr, + required this.descriptionEn, + required this.descriptionAr, + required this.icon, + required this.color, + required this.target, + required this.type, + this.isUnlocked = false, + this.currentProgress = 0, + this.unlockedAt, + }); + + double get progress => (currentProgress / target).clamp(0.0, 1.0); +} + +// ════════════════════════════════════════════ +// المستويات الثابتة +// ════════════════════════════════════════════ + +class DriverLevels { + static const List all = [ + DriverLevel( + id: 'bronze', + nameEn: 'Bronze', + nameAr: 'برونزي', + emoji: '🥉', + color: Color(0xFFCD7F32), + gradientEnd: Color(0xFFE8A854), + minPoints: 0, + maxPoints: 999, + commissionDiscount: 0, + perks: ['Basic features', 'Standard support'], + ), + DriverLevel( + id: 'silver', + nameEn: 'Silver', + nameAr: 'فضي', + emoji: '🥈', + color: Color(0xFF9CA3AF), + gradientEnd: Color(0xFFC0C7D1), + minPoints: 1000, + maxPoints: 4999, + commissionDiscount: 1, + perks: ['Priority medium', 'Silver badge', '-1% commission'], + ), + DriverLevel( + id: 'gold', + nameEn: 'Gold', + nameAr: 'ذهبي', + emoji: '🥇', + color: Color(0xFFFFD700), + gradientEnd: Color(0xFFFFA500), + minPoints: 5000, + maxPoints: 14999, + commissionDiscount: 2, + perks: ['High priority', 'Gold badge', '-2% commission'], + ), + DriverLevel( + id: 'diamond', + nameEn: 'Diamond', + nameAr: 'ألماسي', + emoji: '💎', + color: Color(0xFF00BCD4), + gradientEnd: Color(0xFF3F51B5), + minPoints: 15000, + maxPoints: 999999, + commissionDiscount: 5, + perks: ['VIP first', 'Diamond badge', '-5% commission', 'Priority support'], + ), + ]; + + static DriverLevel getLevel(int points) { + for (int i = all.length - 1; i >= 0; i--) { + if (points >= all[i].minPoints) return all[i]; + } + return all.first; + } + + static DriverLevel? getNextLevel(int points) { + final current = getLevel(points); + final idx = all.indexOf(current); + if (idx < all.length - 1) return all[idx + 1]; + return null; + } + + static double getProgressToNext(int points) { + final current = getLevel(points); + final next = getNextLevel(points); + if (next == null) return 1.0; + return ((points - current.minPoints) / (next.minPoints - current.minPoints)) + .clamp(0.0, 1.0); + } +} + +// ════════════════════════════════════════════ +// الـ Controller +// ════════════════════════════════════════════ + +class GamificationController extends GetxController { + bool isLoading = false; + int totalTrips = 0; + int totalPoints = 0; + double averageRating = 5.0; + int totalReferrals = 0; + int consecutiveDays = 0; // أيام متتالية + double totalEarnings = 0; + + // === Driving Behavior === + double behaviorScore = 100.0; + int hardBrakes = 0; + double maxSpeed = 0.0; + + late DriverLevel currentLevel; + DriverLevel? nextLevel; + double progressToNext = 0; + List achievements = []; + + // === Daily Goal === + double dailyGoal = 0; + double dailyEarnings = 0; + double get dailyGoalProgress => + dailyGoal > 0 ? (dailyEarnings / dailyGoal).clamp(0.0, 1.0) : 0.0; + bool get isDailyGoalMet => dailyGoalProgress >= 1.0; + + @override + void onInit() { + super.onInit(); + _loadLocalData(); + _initializeAchievements(); + _calculateLevel(); + fetchGamificationData(); + } + + // ═══════ تحميل البيانات المحلية ═══════ + void _loadLocalData() { + dailyGoal = (box.read('dailyGoal') ?? 0).toDouble(); + totalTrips = box.read('gamification_totalTrips') ?? 0; + consecutiveDays = box.read('gamification_consecutiveDays') ?? 0; + } + + // ═══════ حفظ الهدف اليومي ═══════ + void setDailyGoal(double goal) { + dailyGoal = goal; + box.write('dailyGoal', goal); + update(); + } + + void updateDailyEarnings(double earnings) { + dailyEarnings = earnings; + update(); + } + + // ═══════ حساب المستوى ═══════ + void _calculateLevel() { + currentLevel = DriverLevels.getLevel(totalPoints); + nextLevel = DriverLevels.getNextLevel(totalPoints); + progressToNext = DriverLevels.getProgressToNext(totalPoints); + update(); + } + + // ═══════ تهيئة الإنجازات ═══════ + void _initializeAchievements() { + achievements = [ + Achievement( + id: 'first_trip', + titleEn: 'First Trip', + titleAr: 'أول رحلة', + descriptionEn: 'Complete your first trip', + descriptionAr: 'أكمل أول رحلة لك', + icon: Icons.flag_rounded, + color: const Color(0xFF4CAF50), + target: 1, + type: 'trips', + ), + Achievement( + id: 'trip_50', + titleEn: 'Road Warrior', + titleAr: 'محارب الطريق', + descriptionEn: 'Complete 50 trips', + descriptionAr: 'أكمل 50 رحلة', + icon: Icons.local_taxi_rounded, + color: const Color(0xFF2196F3), + target: 50, + type: 'trips', + ), + Achievement( + id: 'trip_100', + titleEn: 'Century Rider', + titleAr: 'سائق المئة', + descriptionEn: 'Complete 100 trips', + descriptionAr: 'أكمل 100 رحلة', + icon: Icons.emoji_events_rounded, + color: const Color(0xFFFF9800), + target: 100, + type: 'trips', + ), + Achievement( + id: 'trip_500', + titleEn: 'Road Legend', + titleAr: 'أسطورة الطريق', + descriptionEn: 'Complete 500 trips', + descriptionAr: 'أكمل 500 رحلة', + icon: Icons.stars_rounded, + color: const Color(0xFFE91E63), + target: 500, + type: 'trips', + ), + Achievement( + id: 'five_star', + titleEn: 'Five Star Driver', + titleAr: 'سائق 5 نجوم', + descriptionEn: 'Maintain 5.0 rating', + descriptionAr: 'حافظ على تقييم 5.0', + icon: Icons.star_rounded, + color: const Color(0xFFFFD700), + target: 5, + type: 'rating', + ), + Achievement( + id: 'streak_7', + titleEn: 'Weekly Streak', + titleAr: 'سلسلة أسبوعية', + descriptionEn: 'Work 7 consecutive days', + descriptionAr: 'اعمل 7 أيام متتالية', + icon: Icons.whatshot_rounded, + color: const Color(0xFFFF5722), + target: 7, + type: 'streak', + ), + Achievement( + id: 'streak_30', + titleEn: 'Monthly Streak', + titleAr: 'سلسلة شهرية', + descriptionEn: 'Work 30 consecutive days', + descriptionAr: 'اعمل 30 يوم متتالي', + icon: Icons.local_fire_department_rounded, + color: const Color(0xFFD32F2F), + target: 30, + type: 'streak', + ), + Achievement( + id: 'referral_5', + titleEn: 'Social Butterfly', + titleAr: 'الفراشة الاجتماعية', + descriptionEn: 'Refer 5 drivers', + descriptionAr: 'ادعُ 5 سائقين', + icon: Icons.people_rounded, + color: const Color(0xFF9C27B0), + target: 5, + type: 'referral', + ), + ]; + } + + // ═══════ تحديث تقدم الإنجازات ═══════ + void _updateAchievementProgress() { + for (var ach in achievements) { + switch (ach.type) { + case 'trips': + ach.currentProgress = totalTrips; + break; + case 'rating': + ach.currentProgress = averageRating >= 5 ? 5 : averageRating.floor(); + break; + case 'streak': + ach.currentProgress = consecutiveDays; + break; + case 'referral': + ach.currentProgress = totalReferrals; + break; + } + ach.isUnlocked = ach.currentProgress >= ach.target; + } + update(); + } + + // ═══════ جلب البيانات من السيرفر ═══════ + Future fetchGamificationData() async { + isLoading = true; + update(); + + try { + // 1. جلب عدد الرحلات الكلي + var tripRes = await CRUD().get( + link: AppLink.getTripCountByCaptain, + payload: {'driver_id': box.read(BoxName.driverID).toString()}, + ); + if (tripRes != null && tripRes != 'failure') { + var data = jsonDecode(tripRes); + totalTrips = + int.tryParse(data['message']?[0]?['count']?.toString() ?? '0') ?? 0; + box.write('gamification_totalTrips', totalTrips); + } + + // 2. جلب التقييم + var rateRes = await CRUD().get( + link: AppLink.getDriverRate, + payload: {'driver_id': box.read(BoxName.driverID).toString()}, + ); + if (rateRes != null && rateRes != 'failure') { + var data = jsonDecode(rateRes); + averageRating = + double.tryParse(data['message']?[0]?['rating']?.toString() ?? '5') ?? + 5.0; + } + + // 3. جلب النقاط (الرصيد) + var pointsRes = await CRUD().getWallet( + link: AppLink.getDriverPaymentPoints, + payload: {'driverID': box.read(BoxName.driverID).toString()}, + ); + if (pointsRes != null && pointsRes != 'failure') { + var data = jsonDecode(pointsRes); + totalPoints = double.tryParse( + data['message']?[0]?['total_amount']?.toString() ?? '0') + ?.abs() + .toInt() ?? + 0; + } + + // 4. جلب عدد الدعوات + var invRes = await CRUD().get( + link: AppLink.getInviteDriver, + payload: {'driver_id': box.read(BoxName.driverID).toString()}, + ); + if (invRes != null && invRes != 'failure') { + var data = jsonDecode(invRes); + if (data['message'] is List) { + totalReferrals = (data['message'] as List).length; + } + } + + // 5. جلب أرباح اليوم + var todayRes = await CRUD().getWallet( + link: AppLink.getDriverPaymentToday, + payload: {'driverID': box.read(BoxName.driverID).toString()}, + ); + if (todayRes != null && todayRes != 'failure') { + var data = jsonDecode(todayRes); + dailyEarnings = double.tryParse( + data['message']?[0]?['todayAmount']?.toString() ?? '0') ?? + 0; + } + + // 6. جلب تقييم سلوك القيادة + var behaviorRes = await CRUD().get( + link: AppLink.getDriverBehavior, + payload: {'driver_id': box.read(BoxName.driverID).toString()}, + ); + if (behaviorRes != null && behaviorRes != 'failure') { + var data = jsonDecode(behaviorRes); + if (data['message'] is List && data['message'].isNotEmpty) { + var behavior = data['message'][0]; + behaviorScore = double.tryParse(behavior['avg_score']?.toString() ?? '100') ?? 100.0; + hardBrakes = int.tryParse(behavior['total_hard_brakes']?.toString() ?? '0') ?? 0; + maxSpeed = double.tryParse(behavior['max_speed']?.toString() ?? '0') ?? 0.0; + } + } + + // 7. حساب الأيام المتتالية (محلياً) + _calculateConsecutiveDays(); + } catch (e) { + debugPrint('❌ [Gamification] Error fetching data: $e'); + } + + _calculateLevel(); + _updateAchievementProgress(); + isLoading = false; + update(); + } + + void _calculateConsecutiveDays() { + String? lastActiveDate = box.read('lastActiveDate'); + String today = + DateTime.now().toIso8601String().split('T')[0]; // 2026-05-08 + + if (lastActiveDate == null) { + consecutiveDays = 1; + } else if (lastActiveDate == today) { + // نفس اليوم — لا تغيير + } else { + DateTime last = DateTime.parse(lastActiveDate); + DateTime now = DateTime.parse(today); + if (now.difference(last).inDays == 1) { + consecutiveDays++; + } else { + consecutiveDays = 1; + } + } + + box.write('lastActiveDate', today); + box.write('gamification_consecutiveDays', consecutiveDays); + } + + // ═══════ إحصائيات سريعة ═══════ + int get unlockedCount => achievements.where((a) => a.isUnlocked).length; + int get totalAchievements => achievements.length; +} diff --git a/siro_driver/lib/controller/gamification/leaderboard_controller.dart b/siro_driver/lib/controller/gamification/leaderboard_controller.dart new file mode 100644 index 0000000..468bdf2 --- /dev/null +++ b/siro_driver/lib/controller/gamification/leaderboard_controller.dart @@ -0,0 +1,102 @@ +import 'dart:convert'; +import 'package:flutter/material.dart'; +import 'package:get/get.dart'; +import 'package:siro_driver/constant/box_name.dart'; +import 'package:siro_driver/constant/links.dart'; +import 'package:siro_driver/controller/functions/crud.dart'; +import '../../main.dart'; + +class LeaderboardEntry { + final String driverId; + final String name; + final String photoUrl; + final int rank; + final double value; // trips or earnings + final bool isCurrentUser; + + LeaderboardEntry( + {required this.driverId, + required this.name, + required this.photoUrl, + required this.rank, + required this.value, + this.isCurrentUser = false}); +} + +class LeaderboardController extends GetxController { + bool isLoading = false; + int selectedTab = 0; // 0=trips, 1=earnings + List tripLeaderboard = []; + List earningsLeaderboard = []; + int myRank = 0; + + @override + void onInit() { + super.onInit(); + fetchLeaderboard(); + } + + void changeTab(int tab) { + selectedTab = tab; + update(); + } + + List get currentLeaderboard => + selectedTab == 0 ? tripLeaderboard : earningsLeaderboard; + Future fetchLeaderboard() async { + isLoading = true; + update(); + + try { + final myId = box.read(BoxName.driverID)?.toString() ?? ''; + + // Fetch trips leaderboard + var resTrips = await CRUD().post( + link: AppLink.getLeaderboard, + payload: {'type': 'trips'}, + ); + if (resTrips != null && resTrips != 'failure') { + var data = jsonDecode(resTrips); + if (data['message'] is List) { + tripLeaderboard = (data['message'] as List).map((e) => LeaderboardEntry( + driverId: e['driver_id'].toString(), + name: e['name'].toString(), + photoUrl: e['photoUrl']?.toString() ?? '', + rank: int.tryParse(e['rank']?.toString() ?? '0') ?? 0, + value: double.tryParse(e['value']?.toString() ?? '0') ?? 0, + isCurrentUser: e['driver_id'].toString() == myId, + )).toList(); + } + } + + // Fetch earnings leaderboard + var resEarnings = await CRUD().post( + link: AppLink.getLeaderboard, + payload: {'type': 'earnings'}, + ); + if (resEarnings != null && resEarnings != 'failure') { + var data = jsonDecode(resEarnings); + if (data['message'] is List) { + earningsLeaderboard = (data['message'] as List).map((e) => LeaderboardEntry( + driverId: e['driver_id'].toString(), + name: e['name'].toString(), + photoUrl: e['photoUrl']?.toString() ?? '', + rank: int.tryParse(e['rank']?.toString() ?? '0') ?? 0, + value: double.tryParse(e['value']?.toString() ?? '0') ?? 0, + isCurrentUser: e['driver_id'].toString() == myId, + )).toList(); + } + } + + // Find my rank + final myTripEntry = tripLeaderboard.firstWhereOrNull((e) => e.isCurrentUser); + final myEarnEntry = earningsLeaderboard.firstWhereOrNull((e) => e.isCurrentUser); + myRank = selectedTab == 0 ? (myTripEntry?.rank ?? 0) : (myEarnEntry?.rank ?? 0); + } catch (e) { + debugPrint('❌ [Leaderboard] Error: $e'); + } + + isLoading = false; + update(); + } +} diff --git a/siro_driver/lib/controller/gamification/referral_controller.dart b/siro_driver/lib/controller/gamification/referral_controller.dart new file mode 100644 index 0000000..7d2f3b2 --- /dev/null +++ b/siro_driver/lib/controller/gamification/referral_controller.dart @@ -0,0 +1,189 @@ +import 'dart:convert'; +import 'package:flutter/material.dart'; +import 'package:flutter/services.dart'; +import 'package:get/get.dart'; +import 'package:siro_driver/constant/box_name.dart'; +import 'package:siro_driver/constant/links.dart'; +import 'package:siro_driver/controller/functions/crud.dart'; +import '../../main.dart'; + +// ════════════════════════════════════════════ +// نموذج الإحالة +// ════════════════════════════════════════════ + +class ReferralRecord { + final String id; + final String name; + final String phone; + final String status; // 'registered', 'active', 'inactive' + final String type; // 'driver', 'passenger' + final String joinDate; + final int tripCount; + + ReferralRecord({ + required this.id, + required this.name, + required this.phone, + required this.status, + required this.type, + required this.joinDate, + required this.tripCount, + }); + + factory ReferralRecord.fromJson(Map json) { + return ReferralRecord( + id: json['id']?.toString() ?? '', + name: json['name']?.toString() ?? json['nameArabic']?.toString() ?? '', + phone: json['phone']?.toString() ?? '', + status: json['status']?.toString() ?? 'registered', + type: json['type']?.toString() ?? 'driver', + joinDate: json['created_at']?.toString() ?? '', + tripCount: int.tryParse(json['trip_count']?.toString() ?? '0') ?? 0, + ); + } +} + +// ════════════════════════════════════════════ +// Controller +// ════════════════════════════════════════════ + +class ReferralController extends GetxController { + bool isLoading = false; + List driverReferrals = []; + List passengerReferrals = []; + String referralCode = ''; + int totalDriverReferrals = 0; + int totalPassengerReferrals = 0; + int activeReferrals = 0; + double totalRewardsEarned = 0; + + @override + void onInit() { + super.onInit(); + _generateReferralCode(); + fetchReferralData(); + } + + void _generateReferralCode() { + final driverId = box.read(BoxName.driverID)?.toString() ?? ''; + final name = box.read(BoxName.nameDriver)?.toString() ?? ''; + if (driverId.isNotEmpty) { + // كود فريد: أول 3 حروف من الاسم + ID + final prefix = name.length >= 3 ? name.substring(0, 3).toUpperCase() : name.toUpperCase(); + referralCode = '$prefix$driverId'; + } + } + + Future fetchReferralData() async { + isLoading = true; + update(); + + try { + // 1. جلب دعوات السائقين + var driverRes = await CRUD().get( + link: AppLink.getInviteDriver, + payload: {'driver_id': box.read(BoxName.driverID).toString()}, + ); + if (driverRes != null && driverRes != 'failure') { + var data = jsonDecode(driverRes); + if (data['message'] is List) { + driverReferrals = (data['message'] as List) + .map((e) => ReferralRecord.fromJson(e)) + .toList(); + totalDriverReferrals = driverReferrals.length; + } + } + + // 2. جلب دعوات الركاب + var passengerRes = await CRUD().get( + link: AppLink.getDriverInvitationToPassengers, + payload: {'driver_id': box.read(BoxName.driverID).toString()}, + ); + if (passengerRes != null && passengerRes != 'failure') { + var data = jsonDecode(passengerRes); + if (data['message'] is List) { + passengerReferrals = (data['message'] as List) + .map((e) => ReferralRecord.fromJson(e)) + .toList(); + totalPassengerReferrals = passengerReferrals.length; + } + } + + // 3. جلب الإحصائيات الدقيقة للمكافآت + var statsRes = await CRUD().get( + link: AppLink.getReferralStats, + payload: {'driver_id': box.read(BoxName.driverID).toString()}, + ); + if (statsRes != null && statsRes != 'failure') { + var data = jsonDecode(statsRes); + if (data['message'] is List && data['message'].isNotEmpty) { + var stats = data['message'][0]; + totalRewardsEarned = double.tryParse(stats['totalRewards']?.toString() ?? '0') ?? 0; + activeReferrals = (int.tryParse(stats['driverInvites']?.toString() ?? '0') ?? 0) + + (int.tryParse(stats['passengerInvites']?.toString() ?? '0') ?? 0); + } + } + } catch (e) { + debugPrint('❌ [Referral] Error: $e'); + } + + isLoading = false; + update(); + } + + void copyCode() { + Clipboard.setData(ClipboardData(text: referralCode)); + } + + String get shareMessage { + final appName = 'Intaleq'; + return 'Join $appName as a driver! Use my code: $referralCode\nDownload: https://intaleq.app/driver?ref=$referralCode'; + } + + String get shareMessagePassenger { + final appName = 'Intaleq'; + return 'Get a ride with $appName! Use my code: $referralCode for a discount.\nDownload: https://intaleq.app?ref=$referralCode'; + } + + int get totalReferrals => totalDriverReferrals + totalPassengerReferrals; + + // ═══════ إرسال دعوة سائق ═══════ + Future inviteDriver(String phone) async { + try { + var res = await CRUD().post( + link: AppLink.addInviteDriver, + payload: { + 'driver_id': box.read(BoxName.driverID).toString(), + 'phone': phone, + }, + ); + if (res != null && res != 'failure') { + await fetchReferralData(); + return true; + } + } catch (e) { + debugPrint('❌ [Referral] Invite driver error: $e'); + } + return false; + } + + // ═══════ إرسال دعوة راكب ═══════ + Future invitePassenger(String phone) async { + try { + var res = await CRUD().post( + link: AppLink.addInvitationPassenger, + payload: { + 'driver_id': box.read(BoxName.driverID).toString(), + 'phone': phone, + }, + ); + if (res != null && res != 'failure') { + await fetchReferralData(); + return true; + } + } catch (e) { + debugPrint('❌ [Referral] Invite passenger error: $e'); + } + return false; + } +} diff --git a/siro_driver/lib/controller/home/captin/behavior_controller.dart b/siro_driver/lib/controller/home/captin/behavior_controller.dart new file mode 100644 index 0000000..264444f --- /dev/null +++ b/siro_driver/lib/controller/home/captin/behavior_controller.dart @@ -0,0 +1,146 @@ +import 'dart:convert'; +import 'dart:math'; + +import 'package:get/get.dart'; +import 'package:siro_driver/constant/box_name.dart'; +import 'package:siro_driver/constant/links.dart'; +import 'package:siro_driver/controller/functions/crud.dart'; + +import '../../../constant/table_names.dart'; +import '../../../main.dart'; +import '../../../print.dart'; + +class DriverBehaviorController extends GetxController { + Future>> getAllData() async { + return await sql.getAllData(TableName.behavior); + } + + var isLoading = false.obs; + var overallScore = 100.0.obs; + var lastTrips = [].obs; + + Future fetchDriverBehavior() async { + isLoading.value = true; + try { + final response = await CRUD().get( + link: AppLink.get_driver_behavior, + payload: {"driver_id": box.read(BoxName.driverID).toString()}, + ); + + if (response != 'failure') { + final json = jsonDecode(response); + + overallScore.value = + double.parse(json['message']['overall_behavior_score'].toString()); + lastTrips.value = json['message']['last_10_trips']; + } else { + // Get.snackbar("Error", json['message'] ?? "Unknown error"); + } + } catch (e) { + // Get.snackbar("Error", "Exception: $e"); + Log.print('e: ${e}'); + } finally { + isLoading.value = false; + } + } + + Future> analyzeData() async { + final data = await getAllData(); + if (data.isEmpty) return {}; + + double maxSpeed = 0; + double totalSpeed = 0; + int hardBrakes = 0; + double totalDistance = 0; + + // متغيرات للمقارنة مع النقطة السابقة + double? prevLat, prevLng; + DateTime? prevTime; + + // ترتيب البيانات حسب الوقت لضمان دقة الحساب (اختياري لكن مفضل) + // data.sort((a, b) => a['created_at'].compareTo(b['created_at'])); + + for (var item in data) { + // 1. قراءة البيانات بالأسماء الصحيحة من الجدول + double lat = item['latitude'] ?? item['lat'] ?? 0.0; + double lng = item['longitude'] ?? item['lng'] ?? 0.0; + double acc = item['acceleration'] ?? 0.0; + + // قراءة الوقت لحساب السرعة + DateTime currentTime = + DateTime.tryParse(item['created_at'].toString()) ?? DateTime.now(); + + double currentSpeed = 0; + + // 2. حساب السرعة والمسافة إذا وجدت نقطة سابقة + if (prevLat != null && prevLng != null && prevTime != null) { + double distKm = _calculateDistance(prevLat, prevLng, lat, lng); + int timeDiffSeconds = currentTime.difference(prevTime).inSeconds; + + if (timeDiffSeconds > 0) { + // السرعة (كم/س) = (المسافة بالكيلومتر * 3600) / الزمن بالثواني + currentSpeed = (distKm * 3600) / timeDiffSeconds; + } + + totalDistance += distKm; + } + + // تحديث القيم الإحصائية + if (currentSpeed > maxSpeed) maxSpeed = currentSpeed; + totalSpeed += currentSpeed; + + // حساب الفرملة القوية (يعتمد على التسارع المحفوظ مسبقاً) + if (acc.abs() > 3.0) hardBrakes++; + + // حفظ النقطة الحالية لتكون هي "السابقة" في الدورة التالية + prevLat = lat; + prevLng = lng; + prevTime = currentTime; + } + + // تجنب القسمة على صفر + double avgSpeed = (data.length > 1) ? totalSpeed / (data.length - 1) : 0; + + // حساب تقييم السلوك + double behaviorScore = 100 - (hardBrakes * 5) - ((maxSpeed > 100) ? 10 : 0); + behaviorScore = behaviorScore.clamp(0.0, 100.0); + + return { + 'max_speed': maxSpeed, + 'avg_speed': avgSpeed, + 'hard_brakes': hardBrakes, + 'total_distance': totalDistance, + 'behavior_score': behaviorScore, + }; + } + + Future sendSummaryToServer(String driverId, String tripId) async { + final summary = await analyzeData(); + if (summary.isEmpty) return; + + final Map body = { + 'driver_id': driverId, + 'trip_id': tripId, + ...summary, // فيه doubles + }; + + // اجبر كل القيم على String + final payload = body.map((k, v) => MapEntry(k, v?.toString() ?? '')); + + await CRUD().post(link: AppLink.saveBehavior, payload: payload); + await clearData(); + } + + Future clearData() async { + await sql.deleteAllData(TableName.behavior); + } + + double _calculateDistance( + double lat1, double lon1, double lat2, double lon2) { + const p = 0.017453292519943295; + final a = 0.5 - + cos((lat2 - lat1) * p) / 2 + + cos(lat1 * p) * cos(lat2 * p) * (1 - cos((lon2 - lon1) * p)) / 2; + return 12742 * asin(sqrt(a)); // distance in km + } +} diff --git a/siro_driver/lib/controller/home/captin/contact_us_controller.dart b/siro_driver/lib/controller/home/captin/contact_us_controller.dart new file mode 100755 index 0000000..b8876ab --- /dev/null +++ b/siro_driver/lib/controller/home/captin/contact_us_controller.dart @@ -0,0 +1,78 @@ +import 'package:flutter/cupertino.dart'; +import 'package:flutter/material.dart'; +import 'package:flutter_font_icons/flutter_font_icons.dart'; +import 'package:get/get.dart'; + +import '../../../constant/colors.dart'; +import '../../functions/launch.dart'; + +class ContactUsController extends GetxController { + final String phone1 = '+963992952235'; + final String phone2 = '+963992952235'; + final TimeOfDay workStartTime = const TimeOfDay(hour: 12, minute: 0); + final TimeOfDay workEndTime = const TimeOfDay(hour: 19, minute: 0); + + bool _isWithinWorkTime(TimeOfDay now) { + return (now.hour > workStartTime.hour || + (now.hour == workStartTime.hour && + now.minute >= workStartTime.minute)) && + (now.hour < workEndTime.hour || + (now.hour == workEndTime.hour && now.minute <= workEndTime.minute)); + } + + void showContactDialog(BuildContext context) { + TimeOfDay now = TimeOfDay.now(); + + showCupertinoModalPopup( + context: context, + builder: (context) => CupertinoActionSheet( + title: Text('Contact Us'.tr), + message: Text('Choose a contact option'.tr), + actions: [ + if (_isWithinWorkTime(now)) + CupertinoActionSheetAction( + child: Text(phone1), + onPressed: () => makePhoneCall( + phone1, + ), + ), + if (_isWithinWorkTime(now)) + CupertinoActionSheetAction( + child: Text(phone2), + onPressed: () => makePhoneCall(phone2), + ), + if (!_isWithinWorkTime(now)) + CupertinoActionSheetAction( + child: Text( + 'Work time is from 10:00 - 17:00.\nYou can send a WhatsApp message or email.' + .tr), + onPressed: () => Navigator.pop(context), + ), + CupertinoActionSheetAction( + child: Row( + mainAxisAlignment: MainAxisAlignment.spaceAround, + children: [ + const Icon( + FontAwesome.whatsapp, + color: AppColor.greenColor, + ), + Text('Send WhatsApp Message'.tr), + ], + ), + onPressed: () => + launchCommunication('whatsapp', phone1, 'Hello'.tr), + ), + CupertinoActionSheetAction( + child: Text('Send Email'.tr), + onPressed: () => + launchCommunication('email', 'support@sefer.live', 'Hello'.tr), + ), + ], + cancelButton: CupertinoActionSheetAction( + child: Text('Cancel'.tr), + onPressed: () => Navigator.pop(context), + ), + ), + ); + } +} diff --git a/siro_driver/lib/controller/home/captin/duration_controller .dart b/siro_driver/lib/controller/home/captin/duration_controller .dart new file mode 100755 index 0000000..d596806 --- /dev/null +++ b/siro_driver/lib/controller/home/captin/duration_controller .dart @@ -0,0 +1,167 @@ +import 'dart:convert'; + +import 'package:siro_driver/views/widgets/elevated_btn.dart'; +import 'package:fl_chart/fl_chart.dart'; +import 'package:get/get.dart'; +import 'package:siro_driver/constant/box_name.dart'; +import 'package:siro_driver/constant/links.dart'; +import 'package:siro_driver/controller/functions/crud.dart'; +import 'package:siro_driver/main.dart'; +import 'package:siro_driver/models/model/driver/rides_summary_model.dart'; + +import '../../../views/widgets/error_snakbar.dart'; + +class DurationController extends GetxController { + final data = DurationData; + // late AnimationController animationController; + late List rideData; + late List rideCountData; + late List ridePriceDriverData; + Map jsonData1 = {}; + Map jsonData2 = {}; + bool isLoading = false; + String totalDurationToday = ''; + var chartData; + var chartRideCount; + var chartRidePriceDriver; + List monthlyList = []; + + @override + void onInit() async { + super.onInit(); + await fetchData(); + await fetchRideDriver(); + await getStaticDriver(); + } + + getStaticDriver() async { + isLoading = true; + update(); + var res = await CRUD().get( + link: AppLink.driverStatistic, + payload: {'driverID': box.read(BoxName.driverID)}); + + if (res == 'success') { + try { + monthlyList = jsonDecode(res)['message']; + } catch (e) { + monthlyList = []; + } + } else { + monthlyList = []; + } + + isLoading = false; + update(); + } + + Future fetchData() async { + isLoading = true; + update(); + + var res = await CRUD().get( + link: AppLink.getTotalDriverDuration, + payload: {'driver_id': box.read(BoxName.driverID)}, + ); + + if (res == 'success') { + try { + jsonData1 = jsonDecode(res); + final List jsonData = jsonData1['message']; + rideData = jsonData.map((item) { + return MonthlyDataModel.fromJson(item); + }).toList(); + + final List spots = rideData + .map((data) => FlSpot( + data.day.toDouble(), + data.totalDuration.toDouble(), + )) + .toList(); + chartData = spots; + } catch (e) { + jsonData1 = {}; + chartData = []; + } + } else { + jsonData1 = {}; + chartData = []; + } + + isLoading = false; + update(); + } + + Future fetchRideDriver() async { + isLoading = true; + update(); // Notify the observers about the loading state change + + var res = await CRUD().get( + link: AppLink.getRidesDriverByDay, + payload: {'driver_id': box.read(BoxName.driverID)}, + ); + if (res != 'failure' && res != 'no_internet' && res != 'token_expired') { + jsonData2 = jsonDecode(res); + var jsonResponse = jsonData2 as Map; + isLoading = false; + final List jsonData = jsonResponse['message']; + rideCountData = jsonData.map((item) { + return MonthlyRideModel.fromJson(item); + }).toList(); + ridePriceDriverData = jsonData.map((item) { + return MonthlyPriceDriverModel.fromJson(item); + }).toList(); + + final List spots = rideCountData + .map((data) => FlSpot( + data.day.toDouble(), + data.countRide.toDouble(), + )) + .toList(); + chartRideCount = spots; + final List spotsDriverPrices = ridePriceDriverData + .map((data) => FlSpot( + data.day.toDouble(), + data.pricePerDay.toDouble(), + )) + .toList(); + chartRidePriceDriver = spotsDriverPrices; + + update(); + } else { + isLoading = false; + jsonData2 = {}; + chartRideCount = []; + chartRidePriceDriver = []; + update(); + + if (res == 'no_internet') { + mySnackeBarError('No internet connection'.tr); + } + } + } + + List parseData(List json) { + return json.map((entry) { + final Map entryMap = entry; + final day = DateTime.parse(entryMap['day']); + final totalDuration = _parseDuration(entryMap['total_duration']); + return DurationData(day, totalDuration); + }).toList(); + } + + Duration _parseDuration(String durationString) { + final parts = durationString.split(':'); + final hours = int.parse(parts[0]); + final minutes = int.parse(parts[1]); + final seconds = int.parse(parts[2]); + return Duration(hours: hours, minutes: minutes, seconds: seconds); + } +} + +class DurationData { + final DateTime day; + final Duration totalDuration; + + DurationData(this.day, this.totalDuration); +} diff --git a/siro_driver/lib/controller/home/captin/help/assurance_controller.dart b/siro_driver/lib/controller/home/captin/help/assurance_controller.dart new file mode 100755 index 0000000..66e0472 --- /dev/null +++ b/siro_driver/lib/controller/home/captin/help/assurance_controller.dart @@ -0,0 +1,58 @@ +import 'dart:convert'; + +import 'package:siro_driver/constant/box_name.dart'; +import 'package:siro_driver/constant/links.dart'; +import 'package:siro_driver/controller/functions/crud.dart'; +import 'package:siro_driver/main.dart'; +import 'package:siro_driver/views/widgets/error_snakbar.dart'; +import 'package:get/get.dart'; + +class AssuranceHealthController extends GetxController { + bool isLoading = false; + Map tripCount = {}; + + Future getTripCountByCaptain() async { + var res = await CRUD().get(link: AppLink.getTripCountByCaptain, payload: { + "driver_id": box.read(BoxName.driverID).toString(), + }); + if (res != 'failure') { + tripCount = jsonDecode(res)['message']; + update(); + } + } + + Future addDriverHealthAssurance({ + String? driverId, + String? assured, + required String healthInsuranceProvider, + }) async { + // Define the URL to your PHP backend + + // Data to be sent to the backend + Map data = { + "driver_id": box.read(BoxName.driverID).toString(), + "assured": '1', + "health_insurance_provider": healthInsuranceProvider, + }; + + try { + // Send the POST request to your backend + var response = await CRUD() + .post(link: AppLink.addHealthInsuranceProvider, payload: data); + + if (response != 'failure') { + // Handle success (e.g., show a success message) + + mySnackbarSuccess( + "You have successfully opted for health insurance.".tr); + } else { + // Handle failure (e.g., show an error message) + print("Failed to save health assurance data"); + mySnackeBarError("Please enter a health insurance status.".tr); + } + } catch (e) { + // Handle any errors + print("Error: $e"); + } + } +} diff --git a/siro_driver/lib/controller/home/captin/help/help_controller.dart b/siro_driver/lib/controller/home/captin/help/help_controller.dart new file mode 100755 index 0000000..9359afd --- /dev/null +++ b/siro_driver/lib/controller/home/captin/help/help_controller.dart @@ -0,0 +1,103 @@ +import 'dart:convert'; + +import 'package:flutter/material.dart'; +import 'package:get/get.dart'; + +import '../../../../constant/box_name.dart'; +import '../../../../constant/links.dart'; +import '../../../../constant/style.dart'; +import '../../../../main.dart'; +import '../../../../views/widgets/elevated_btn.dart'; +import '../../../functions/crud.dart'; +import '../../../functions/encrypt_decrypt.dart'; + +class HelpController extends GetxController { + bool isLoading = false; + final formKey = GlobalKey(); + final helpQuestionController = TextEditingController(); + Map helpQuestionDate = {}; + Map helpQuestionRepleyDate = {}; + String status = ''; + String qustion = ''; + late int indexQuestion = 0; + getIndex(int i, String qustion1) async { + indexQuestion = i; + qustion = qustion1; + update(); + } + + void addHelpQuestion() async { + isLoading = true; + update(); + var res = await CRUD().post(link: AppLink.addhelpCenter, payload: { + 'driverID': box.read(BoxName.driverID).toString(), + 'helpQuestion': (helpQuestionController.text) + }); + var d = jsonDecode(res); + isLoading = false; + update(); + if (d['status'].toString() == 'success') { + getHelpQuestion(); + // Get.snackbar('Feedback data saved successfully'.tr, '', + // backgroundColor: AppColor.greenColor, + // snackPosition: SnackPosition.BOTTOM); + } + } + + void getHelpQuestion() async { + isLoading = true; + update(); + var res = await CRUD().get(link: AppLink.gethelpCenter, payload: { + 'driverID': box.read(BoxName.driverID).toString(), + }); + if (res == "failure") { + isLoading = false; + update(); + Get.defaultDialog( + title: 'There is no help Question here'.tr, + titleStyle: AppStyle.title, + middleText: '', + confirm: Column( + mainAxisAlignment: MainAxisAlignment.spaceAround, + children: [ + MyElevatedButton( + title: 'Add Question'.tr, + onPressed: () { + Get.back(); + }), + MyElevatedButton( + title: 'Back'.tr, + onPressed: () { + Get.back(); + Get.back(); + }), + ], + )); + } + helpQuestionDate = jsonDecode(res); + isLoading = false; + update(); + } + + Future getHelpRepley(String id) async { + isLoading = true; + update(); + var res = await CRUD().get(link: AppLink.getByIdhelpCenter, payload: { + 'id': id, + }); + if (res == "failure") { + status = 'not yet'; + isLoading = false; + update(); + } + helpQuestionRepleyDate = jsonDecode(res); + isLoading = false; + update(); + } + + @override + void onInit() { + getHelpQuestion(); + super.onInit(); + } +} diff --git a/siro_driver/lib/controller/home/captin/help/maintain_center_controller.dart b/siro_driver/lib/controller/home/captin/help/maintain_center_controller.dart new file mode 100755 index 0000000..6109085 --- /dev/null +++ b/siro_driver/lib/controller/home/captin/help/maintain_center_controller.dart @@ -0,0 +1,22 @@ +import 'dart:convert'; + +import 'package:siro_driver/constant/box_name.dart'; +import 'package:siro_driver/constant/links.dart'; +import 'package:siro_driver/controller/functions/crud.dart'; +import 'package:siro_driver/main.dart'; +import 'package:get/get.dart'; + +class MaintainCenterController extends GetxController { + bool isLoading = false; + Map tripCount = {}; + + Future getTripCountByCaptain() async { + var res = await CRUD().get(link: AppLink.getTripCountByCaptain, payload: { + "driver_id": box.read(BoxName.driverID).toString(), + }); + if (res != 'failure') { + tripCount = jsonDecode(res)['message']; + update(); + } + } +} diff --git a/siro_driver/lib/controller/home/captin/help/video_controller.dart b/siro_driver/lib/controller/home/captin/help/video_controller.dart new file mode 100755 index 0000000..65e0b0b --- /dev/null +++ b/siro_driver/lib/controller/home/captin/help/video_controller.dart @@ -0,0 +1,69 @@ +import 'dart:convert'; + +import 'package:siro_driver/constant/links.dart'; +import 'package:siro_driver/controller/functions/crud.dart'; +import 'package:siro_driver/print.dart'; +import 'package:siro_driver/views/widgets/error_snakbar.dart'; +import 'package:get/get.dart'; +import 'package:video_player/video_player.dart'; + +class VideoController extends GetxController { + var videos = []; + var isLoading = true.obs; + final String apiUrl = + '${AppLink.seferCairoServer}/ride/videos_driver/get.php'; + + @override + void onInit() { + fetchVideos(); + super.onInit(); + } + + late VideoPlayerController videoPlayerController; + + // Initialize the video player with the provided URL + Future initializeVideo(String videoUrl) async { + videoPlayerController = + VideoPlayerController.networkUrl(Uri.parse(videoUrl)); + await videoPlayerController.initialize(); + videoPlayerController + .setLooping(true); // Set to true if you want the video to loop + update(); // Update the UI after the video has been initialized + } + + // Play the video + void play() { + videoPlayerController.play(); + update(); + } + + // Pause the video + void pause() { + videoPlayerController.pause(); + update(); + } + + @override + void onClose() { + videoPlayerController + .dispose(); // Dispose of the video player controller when not in use + super.onClose(); + } + + void fetchVideos() async { + try { + var res = await CRUD().get(link: apiUrl, payload: {}); + if (res != 'failure') { + videos = jsonDecode(res)['message']; + // Log.print('videos: ${videos}'); + update(); + } else { + mySnackeBarError(''); + } + } catch (e) { + mySnackeBarError(e.toString()); + } finally { + isLoading(false); + } + } +} diff --git a/siro_driver/lib/controller/home/captin/home_captain_controller.dart b/siro_driver/lib/controller/home/captin/home_captain_controller.dart new file mode 100755 index 0000000..6d5b1cd --- /dev/null +++ b/siro_driver/lib/controller/home/captin/home_captain_controller.dart @@ -0,0 +1,850 @@ +import 'dart:convert'; + +import 'package:flutter/material.dart'; +import 'package:flutter/services.dart'; +import 'package:get/get.dart'; +import 'package:intaleq_maps/intaleq_maps.dart'; +import 'package:geolocator/geolocator.dart'; +import 'package:http/http.dart' as http; +import 'package:siro_driver/constant/box_name.dart'; +import 'dart:async'; + +import '../../../constant/links.dart'; +import '../../../constant/style.dart'; +import '../../../constant/table_names.dart'; +import '../../../main.dart'; +import '../../../print.dart'; +import '../../../views/home/my_wallet/walet_captain.dart'; +import '../../../views/widgets/elevated_btn.dart'; +import '../../firebase/firbase_messge.dart'; +import '../../functions/background_service.dart'; +import '../../functions/crud.dart'; +import '../../functions/location_background_controller.dart'; +import '../../functions/location_controller.dart'; +import '../payment/captain_wallet_controller.dart'; + +class HomeCaptainController extends GetxController { + bool isActive = false; + DateTime? activeStartTime; + Duration activeDuration = Duration.zero; + Timer? activeTimer; + Map data = {}; + bool isHomeMapActive = true; + InlqBitmap carIcon = InlqBitmap.fromAsset('assets/images/car.png'); + bool isMapReadyForCommands = false; + bool isLoading = true; + late double kazan = 0; + double latePrice = 0; + double heavyPrice = 0; + double comfortPrice = 0, + speedPrice = 0, + deliveryPrice = 0, + mashwariPrice = 0, + familyPrice = 0, + fuelPrice = 0; + double naturePrice = 0; + bool isCallOn = false; + String totalMoneyToday = '0'; + double? rating = 5; + String rideId = '0'; + String countRideToday = '0'; + String totalMoneyInSEFER = '0'; + String totalDurationToday = '0'; + Timer? timer; + Timer? _cameraFollowTimer; + LatLng myLocation = const LatLng(33.5138, 36.2765); + String totalPoints = '0'; + String countRefuse = '0'; + bool mapType = false; + bool mapTrafficON = false; + double widthMapTypeAndTraffic = 50; +// === متغيرات الهيت ماب الجديدة === + bool isHeatmapVisible = false; + Set heatmapPolygons = + {}; // سنستخدم Polygon لرسم المربعات على جوجل مابس + +// Inject the LocationController class + // final locationController = Get.put(LocationController()); + // الكود الصحيح + final locationController = Get.find(); + // final locationBackController = Get.put(LocationBackgroundController()); + String formatDuration(Duration duration) { + String twoDigits(int n) => n.toString().padLeft(2, "0"); + String twoDigitMinutes = twoDigits(duration.inMinutes.remainder(60)); + String twoDigitSeconds = twoDigits(duration.inSeconds.remainder(60)); + return "${duration.inHours}:$twoDigitMinutes:$twoDigitSeconds"; + } + +// دالة لتغيير حالة الهيت ماب (عرض/إخفاء) + void toggleHeatmap() async { + isHeatmapVisible = !isHeatmapVisible; + print("🔥 [Heatmap] Visibility toggled to: $isHeatmapVisible"); + if (isHeatmapVisible) { + startHeatmapCycle(); + } else { + _heatmapTimer?.cancel(); + heatmapPolygons.clear(); + print("🧹 [Heatmap] Polygons cleared."); + } + update(); // تحديث الواجهة + } + + // داخل MapDriverController + + // متغير لتخزين المربعات + // Set heatmapPolygons = {}; + + // دالة جلب البيانات ورسم الخريطة + Future fetchAndDrawHeatmap() async { + print("🚀 [Heatmap] Fetching live data..."); + // استخدم الرابط المباشر لملف JSON لسرعة قصوى + final String jsonUrl = + "https://ride.intaleq.xyz/intaleq/ride/heatmap_data.json"; + + try { + // نستخدم timestamp لمنع الكاش من الموبايل نفسه + final response = await http.get( + Uri.parse("$jsonUrl?t=${DateTime.now().millisecondsSinceEpoch}")); + + if (response.statusCode == 200) { + final List data = json.decode(response.body); + print("✅ [Heatmap] Data received. Points count: ${data.length}"); + _generatePolygons(data); + } else { + print("⚠️ [Heatmap] Server error: ${response.statusCode}"); + } + } catch (e) { + print("❌ [Heatmap] Error: $e"); + } + } + + void _generatePolygons(List data) { + print("🎨 [Heatmap] Processing polygons..."); + Set tempPolygons = {}; + + // الأوفست لرسم المربع (نصف حجم الشبكة) + // الشبكة دقتها 0.01 درجة، لذا نصفها 0.005 + double offset = 0.005; + + int highCount = 0, medCount = 0, lowCount = 0; + + for (var point in data) { + double lat = double.parse(point['lat'].toString()); + double lng = double.parse(point['lng'].toString()); + + String intensity = point['intensity'] ?? 'low'; + int count = int.parse(point['count'].toString()); // ✅ جلب العدد + + Color color; + Color strokeColor; + + // 🧠 منطق الألوان: ندمج الذكاء (Intensity) مع العدد (Count) + if (intensity == 'high' || count >= 5) { + highCount++; + // منطقة مشتعلة (أحمر) + // إما فيها طلبات ضائعة (Timeout) أو فيها عدد كبير من الطلبات + color = Colors.red.withValues(alpha: 0.35); + strokeColor = Colors.red.withValues(alpha: 0.8); + } else if (intensity == 'medium' || count >= 3) { + medCount++; + // منطقة متوسطة (برتقالي) + color = Colors.orange.withValues(alpha: 0.35); + strokeColor = Colors.orange.withValues(alpha: 0.8); + } else { + lowCount++; + // منطقة خفيفة (أصفر) + color = Colors.yellow.withValues(alpha: 0.3); + strokeColor = Colors.yellow.withValues(alpha: 0.6); + } + + // رسم المربع + tempPolygons.add(Polygon( + polygonId: PolygonId("$lat-$lng"), + // consumeTapEvents: true, // للسماح بالضغط عليه مستقبلاً + points: [ + LatLng(lat - offset, lng - offset), + LatLng(lat + offset, lng - offset), + LatLng(lat + offset, lng + offset), + LatLng(lat - offset, lng + offset), + ], + fillColor: color, + strokeColor: strokeColor, + strokeWidth: 2, + )); + } + + heatmapPolygons = tempPolygons; + print( + "✨ [Heatmap] Rendering Done. (🔥 High: $highCount, 🟠 Med: $medCount, 🟡 Low: $lowCount)"); + print("📍 [Heatmap] Total Polygons on Map: ${heatmapPolygons.length}"); + update(); // تحديث الخريطة + } + + Timer? _heatmapTimer; + + // دالة لتشغيل الخريطة الحرارية كل فترة (كل 5 دقائق) لضمان نشاط البيانات + void startHeatmapCycle() { + _heatmapTimer?.cancel(); + fetchAndDrawHeatmap(); + + // Refresh every 15 min instead of 5 to reduce data & battery usage + _heatmapTimer = Timer.periodic(const Duration(minutes: 15), (timer) { + if (isHeatmapVisible) { + print("🔄 [Heatmap] Periodic refresh started..."); + fetchAndDrawHeatmap(); + } else { + timer.cancel(); + } + }); + } + + void goToWalletFromConnect() { + Get.back(); + Get.back(); + Get.to(() => WalletCaptainRefactored()); + } + + void changeRideId() { + rideId = 'rideId'; + update(); + } + + void addCustomCarIcon() { + carIcon = InlqBitmap.fromAsset('assets/images/car.png'); + update(); + } + + String stringActiveDuration = ''; + int _fatigueSeconds = 0; // عداد ثواني الإرهاق المؤقت + + // ========================================== + // ====== 🛡️ Fatigue Monitoring System ====== + // ========================================== + void _checkFatigueBeforeOnline() { + int totalSecondsToday = box.read('fatigue_total_seconds') ?? 0; + String? lastOfflineStr = box.read('fatigue_last_offline'); + + if (lastOfflineStr != null) { + DateTime lastOffline = DateTime.parse(lastOfflineStr); + // If offline for more than 6 continuous hours, reset the fatigue counter + if (DateTime.now().difference(lastOffline).inHours >= 6) { + totalSecondsToday = 0; + box.write('fatigue_total_seconds', 0); + } + } + + if (totalSecondsToday >= 12 * 3600) { + // 12 Hours + _forceOfflineDueToFatigue(); + throw Exception('Fatigue Limit Exceeded'); + } + } + + void _forceOfflineDueToFatigue() { + if (isActive) { + isActive = false; + locationController.stopLocationUpdates(); + activeStartTime = null; + activeTimer?.cancel(); + update(); + } + + Get.defaultDialog( + title: 'Safety First 🛑'.tr, + middleText: + 'You have been driving for 12 hours. For your safety and compliance, please take a 6-hour break.' + .tr, + barrierDismissible: false, + titleStyle: + const TextStyle(color: Colors.red, fontWeight: FontWeight.bold), + confirm: ElevatedButton( + style: ElevatedButton.styleFrom(backgroundColor: Colors.red), + onPressed: () => Get.back(), + child: Text('OK'.tr, style: const TextStyle(color: Colors.white)), + ), + ); + } + + void onButtonSelected() { + if (!Get.isRegistered()) { + Get.put(CaptainWalletController()); + } + totalPoints = Get.find().totalPoints; + + // Toggle Active State + isActive = !isActive; + + if (isActive) { + try { + _checkFatigueBeforeOnline(); // Throws exception if tired + + if (double.parse(totalPoints) > -200) { + locationController.startLocationUpdates(); + HapticFeedback.heavyImpact(); + activeStartTime = DateTime.now(); + + activeTimer = Timer.periodic(const Duration(seconds: 1), (timer) { + activeDuration = DateTime.now().difference(activeStartTime!); + stringActiveDuration = formatDuration(activeDuration); + + // Increment Fatigue Counter (write to box every 30s) + _fatigueSeconds++; + if (_fatigueSeconds % 30 == 0) { + int totalSeconds = + (box.read('fatigue_total_seconds') ?? 0) + _fatigueSeconds; + box.write('fatigue_total_seconds', totalSeconds); + _fatigueSeconds = 0; + if (totalSeconds >= 12 * 3600) { + // 12 hours + _forceOfflineDueToFatigue(); + } + } + + update(); + }); + } else { + locationController.stopLocationUpdates(); + activeStartTime = null; + activeTimer?.cancel(); + savePeriod(activeDuration); + activeDuration = Duration.zero; + box.write('fatigue_last_offline', DateTime.now().toIso8601String()); + update(); + } + } catch (e) { + // Driver is fatigued, revert state + isActive = false; + update(); + } + } else { + locationController.stopLocationUpdates(); + activeStartTime = null; + activeTimer?.cancel(); + savePeriod(activeDuration); + activeDuration = Duration.zero; + + // Save offline time for Fatigue Monitoring reset + box.write('fatigue_last_offline', DateTime.now().toIso8601String()); + update(); + } + } + +// متغيرات العداد للحظر + RxString remainingBlockTimeStr = "".obs; + Timer? _blockTimer; + + /// دالة الفحص والدايلوج + void checkAndShowBlockDialog() { + String? blockStr = box.read(BoxName.blockUntilDate); + if (blockStr == null || blockStr.isEmpty) return; + + DateTime blockExpiry = DateTime.parse(blockStr); + DateTime now = DateTime.now(); + + if (now.isBefore(blockExpiry)) { + // 1. إجبار السائق على وضع الأوفلاين + box.write(BoxName.statusDriverLocation, 'blocked'); + update(); + + // 2. بدء العداد + _startBlockCountdown(blockExpiry); + + // 3. إظهار الديالوج المانع + Get.defaultDialog( + title: "Your account is temporarily restricted ⛔".tr, + titleStyle: + const TextStyle(color: Colors.red, fontWeight: FontWeight.bold), + barrierDismissible: false, // 🚫 ممنوع الإغلاق بالضغط خارجاً + onWillPop: () async => false, // 🚫 ممنوع زر الرجوع في الأندرويد + content: Obx(() => Column( + children: [ + const Icon(Icons.timer_off_outlined, + size: 50, color: Colors.orange), + const SizedBox(height: 15), + Text( + "You have exceeded the allowed cancellation limit (3 times).\nYou cannot work until the penalty expires." + .tr, + textAlign: TextAlign.center, + ), + const SizedBox(height: 20), + Text( + remainingBlockTimeStr.value, // 🔥 الوقت يتحدث هنا + style: const TextStyle( + fontSize: 24, + fontWeight: FontWeight.bold, + color: Colors.black87), + ), + const SizedBox(height: 20), + ], + )), + confirm: Obx(() { + // الزر يكون مفعلاً فقط عندما ينتهي الوقت + bool isFinished = remainingBlockTimeStr.value == "00:00:00" || + remainingBlockTimeStr.value == "Done"; + return ElevatedButton( + style: ElevatedButton.styleFrom( + backgroundColor: isFinished ? Colors.green : Colors.grey, + ), + onPressed: isFinished + ? () { + Get.back(); // إغلاق الديالوج + box.remove(BoxName.blockUntilDate); // إزالة الحظر + Get.snackbar("Welcome".tr, "You can now receive orders".tr, + backgroundColor: Colors.green); + } + : null, // زر معطل + child: Text(isFinished ? "Go Online".tr : "Wait for timer".tr), + ); + }), + ); + } else { + // الوقت انتهى أصلاً -> تنظيف + box.remove(BoxName.blockUntilDate); + } + } + + /// دالة العداد التنازلي + void _startBlockCountdown(DateTime expiry) { + _blockTimer?.cancel(); + _blockTimer = Timer.periodic(const Duration(seconds: 1), (timer) { + DateTime now = DateTime.now(); + if (now.isAfter(expiry)) { + // انتهى الوقت + remainingBlockTimeStr.value = "Done"; + timer.cancel(); + } else { + // حساب الفرق وتنسيقه + Duration diff = expiry.difference(now); + String twoDigits(int n) => n.toString().padLeft(2, "0"); + String hours = twoDigits(diff.inHours); + String minutes = twoDigits(diff.inMinutes.remainder(60)); + String seconds = twoDigits(diff.inSeconds.remainder(60)); + + remainingBlockTimeStr.value = "$hours:$minutes:$seconds"; + } + }); + } + + @override + void onClose() { + print("🔥 [HomeCaptain] onClose called. Tearing down map resources..."); + _blockTimer?.cancel(); + activeTimer?.cancel(); + _cameraFollowTimer?.cancel(); + _heatmapTimer?.cancel(); + stopTimer(); + mapHomeCaptainController = null; + super.onClose(); + } + + void getRefusedOrderByCaptain() async { + DateTime today = DateTime.now(); + int todayDay = today.day; + + String driverId = box.read(BoxName.driverID).toString(); + + String customQuery = ''' + SELECT COUNT(*) AS count + FROM ${TableName.driverOrdersRefuse} + WHERE driver_id = '$driverId' + AND created_at LIKE '%$todayDay%' + '''; + + try { + List> results = + await sql.getCustomQuery(customQuery); + countRefuse = results[0]['count'].toString(); + update(); + if (double.parse(totalPoints) <= -200) { + // if (int.parse(countRefuse) > 3 || double.parse(totalPoints) <= -200) { + locationController.stopLocationUpdates(); + activeStartTime = null; + activeTimer?.cancel(); + savePeriod(activeDuration); + activeDuration = Duration.zero; + update(); + + Get.defaultDialog( + // backgroundColor: CupertinoColors.destructiveRed, + barrierDismissible: false, + title: 'You Are Stopped For this Day !'.tr, + content: Text( + 'You Refused 3 Rides this Day that is the reason \nSee you Tomorrow!' + .tr, + style: AppStyle.title, + ), + confirm: MyElevatedButton( + title: 'Ok , See you Tomorrow'.tr, + onPressed: () { + // إغلاق الديالوج والعودة قسرياً + navigatorKey.currentState?.pop(); + Get.back(); + })); + } + } catch (e) {} + } + + void changeMapType() { + mapType = !mapType; + // heightButtomSheetShown = isButtomSheetShown == true ? 240 : 0; + update(); + } + + void changeMapTraffic() { + mapTrafficON = !mapTrafficON; + update(); + } + + // late IntaleqMapController mapHomeCaptainController; + IntaleqMapController? mapHomeCaptainController; + LatLng? _lastCameraLoc; // لتتبع آخر موقع حرك الكاميرا + + // --- FIX 2: Smart Map Creation --- + void onMapCreated(IntaleqMapController controller) { + print("🔥 [HomeCaptain] onMapCreated started"); + mapHomeCaptainController = controller; + + // We delay the first move to ensure the native side is fully ready + Future.delayed(const Duration(milliseconds: 800), () { + if (isClosed || mapHomeCaptainController == null) return; + + try { + var currentLoc = locationController.myLocation; + if (currentLoc.latitude != 0 && + currentLoc.latitude != null && + !currentLoc.latitude.isNaN) { + print( + "🔥 [HomeCaptain] Safely moving camera to: ${currentLoc.latitude}"); + mapHomeCaptainController!.moveCamera( + CameraUpdate.newLatLngZoom(currentLoc, 17.5), + ); + } else { + print("🔥 [HomeCaptain] Safely moving to default Damascus"); + mapHomeCaptainController!.moveCamera( + CameraUpdate.newLatLngZoom(myLocation, 12), + ); + } + // Mark as ready for regular listener updates + isMapReadyForCommands = true; + } catch (e) { + print("❌ [HomeCaptain] Map move failed: $e"); + } + }); + } + + void savePeriod(Duration period) { + final periods = box.read>(BoxName.periods) ?? []; + periods.add(period.inSeconds); + box.write(BoxName.periods, periods); + } + + Duration calculateTotalDuration() { + final periods = box.read>(BoxName.periods) ?? []; + Duration totalDuration = Duration.zero; + for (dynamic periodInSeconds in periods) { + final periodDuration = Duration(seconds: periodInSeconds); + totalDuration += periodDuration; + } + return totalDuration; + } + + Timer? _localDurationTimer; + RxString totalDurationDisplay = "00:00:00".obs; // لعرض الوقت في الواجهة + Duration _currentDuration = Duration.zero; // لتخزين الوقت ككائن Duration + + void startPeriodicExecution() async { + await getCaptainDurationOnToday(); + String? initialDurationStr = totalDurationToday; + + if (initialDurationStr != '0') { + // تحويل النص (01:20:30) إلى كائن Duration + List parts = initialDurationStr.split(':'); + _currentDuration = Duration( + hours: int.parse(parts[0]), + minutes: int.parse(parts[1]), + seconds: int.parse(parts[2]), + ); + + // بدء العداد المحلي + _startLocalClock(); + } + + // Timer.periodic(const Duration(seconds: 30), (timer) async { + // await getCaptainDurationOnToday(); + // }); + } + + void _startLocalClock() { + _localDurationTimer?.cancel(); + _localDurationTimer = Timer.periodic(const Duration(seconds: 1), (timer) { + // زيادة ثانية واحدة محلياً + _currentDuration += const Duration(seconds: 1); + + // تحديث النص المعروض في الواجهة (Formatting) + totalDurationDisplay.value = _formatDuration(_currentDuration); + + // اختيارياً: كل 5 دقائق فقط، قم بتحديث القيمة من السيرفر للتأكد من المزامنة + if (timer.tick % 300 == 0) { + getCaptainDurationOnToday(); + } + }); + } + + String _formatDuration(Duration duration) { + String twoDigits(int n) => n.toString().padLeft(2, "0"); + String hours = twoDigits(duration.inHours); + String minutes = twoDigits(duration.inMinutes.remainder(60)); + String seconds = twoDigits(duration.inSeconds.remainder(60)); + return "$hours:$minutes:$seconds"; + } + + void stopTimer() { + _localDurationTimer?.cancel(); + } + + getlocation() async { + isLoading = true; + update(); + try { + // ننتظر جلب الموقع مع مهلة 10 ثوانٍ لتجنب التعليق + var locData = await locationController.getLocation().timeout( + const Duration(seconds: 10), + onTimeout: () => null, + ); + + if (locData != null && locData.latitude != null) { + myLocation = LatLng(locData.latitude!, locData.longitude!); + print( + "📍 [HomeCaptain] Location updated: ${myLocation.latitude}, ${myLocation.longitude}"); + } else { + print( + "⚠️ [HomeCaptain] Could not get current location, using default."); + } + } catch (e) { + print("❌ Error in getlocation: $e"); + } finally { + isLoading = false; + update(); + } + } + + Map walletDriverPointsDate = {}; + + Future getCaptainWalletFromBuyPoints() async { + // isLoading = true; + update(); + + var res = await CRUD().getWallet( + link: AppLink.getDriverPaymentPoints, + payload: {'driverID': box.read(BoxName.driverID).toString()}, + ); + isLoading = false; + // update(); + + if (res != 'failure') { + walletDriverPointsDate = jsonDecode(res); + double totalPointsDouble = double.parse( + walletDriverPointsDate['message'][0]['total_amount'].toString()); + totalPoints = totalPointsDouble.toStringAsFixed(0); + update(); + } else { + totalPoints = '0'; + } + } + +// 3. دالة نستدعيها عند قبول الطلب + void pauseHomeMapUpdates() { + isHomeMapActive = false; + update(); + } + +// 4. دالة نستدعيها عند العودة للصفحة الرئيسية + void resumeHomeMapUpdates() { + isHomeMapActive = true; + // تم حذف استدعاء onMapCreated المتكرر لمنع قفز الخريطة عند العودة + update(); + } + + @override + void onInit() async { + // ✅ تم إرجاعه كتعليق لمنع الديالوج عند التشغيل (كما كان في الكود الأصلي) + // bool permissionsGranted = await PermissionsHelper.requestAllPermissions(); + // if (permissionsGranted) { + // await BackgroundServiceHelper.startService(); + // } + + Get.put(FirebaseMessagesController()); + addToken(); + await getlocation(); + onButtonSelected(); + getDriverRate(); + addCustomCarIcon(); + getKazanPercent(); + getPaymentToday(); + getCountRideToday(); + getAllPayment(); + startPeriodicExecution(); + getCaptainWalletFromBuyPoints(); + // onMapCreated(mapHomeCaptainController!); + // totalPoints = Get.find().totalPoints.toString(); + // getRefusedOrderByCaptain(); + // 🔥 الفحص عند تشغيل التطبيق + checkAndShowBlockDialog(); + box.write(BoxName.statusDriverLocation, 'off'); + // 2. عدل الليسنر ليصبح مشروطاً + // Camera follow timer — only moves when the driver has + // actually moved > 15 meters, saving GPU/battery on idle. + _cameraFollowTimer = Timer.periodic(const Duration(seconds: 8), (timer) { + if (isClosed || + !isHomeMapActive || + mapHomeCaptainController == null || + !isMapReadyForCommands || + !isActive) return; + + var loc = locationController.myLocation; + if (loc.latitude != 0 && loc.latitude != null && !loc.latitude.isNaN) { + // Skip if driver hasn't moved significantly + if (_lastCameraLoc != null) { + final double dist = Geolocator.distanceBetween( + _lastCameraLoc!.latitude, + _lastCameraLoc!.longitude, + loc.latitude, + loc.longitude, + ); + if (dist < 15) return; + } + _lastCameraLoc = loc; + try { + if (mapHomeCaptainController != null) { + mapHomeCaptainController?.animateCamera( + CameraUpdate.newLatLngZoom(loc, 17.5), + ); + } + } catch (e) { + print("❌ [HomeCaptain] Camera movement failed: $e"); + } + } + }); + // LocationController().getLocation(); + super.onInit(); + } + + addToken() async { + String? fingerPrint = await storage.read(key: BoxName.fingerPrint); + final payload = { + 'token': (box.read(BoxName.tokenDriver)), + 'captain_id': (box.read(BoxName.driverID)).toString(), + 'fingerPrint': (fingerPrint).toString() + }; + // Log.print('payload: ${payload}'); + CRUD().post(link: AppLink.addTokensDriver, payload: payload); + } + + getPaymentToday() async { + var res = await CRUD().getWallet( + link: AppLink.getDriverPaymentToday, + payload: {'driverID': box.read(BoxName.driverID).toString()}); + if (res != 'failure') { + data = jsonDecode(res); + totalMoneyToday = data['message'][0]['todayAmount'].toString(); + + update(); + } else {} + } + + getKazanPercent() async { + var res = await CRUD().get( + link: AppLink.getKazanPercent, + payload: {'country': box.read(BoxName.countryCode).toString()}, + ); + if (res != 'failure') { + var json = jsonDecode(res); + kazan = double.parse(json['message'][0]['kazan']); + naturePrice = double.parse(json['message'][0]['naturePrice']); + heavyPrice = double.parse(json['message'][0]['heavyPrice']); + latePrice = double.parse(json['message'][0]['latePrice']); + comfortPrice = double.parse(json['message'][0]['comfortPrice']); + speedPrice = double.parse(json['message'][0]['speedPrice']); + deliveryPrice = double.parse(json['message'][0]['deliveryPrice']); + mashwariPrice = double.parse(json['message'][0]['freePrice']); + familyPrice = double.parse(json['message'][0]['familyPrice']); + fuelPrice = double.parse(json['message'][0]['fuelPrice']); + } + update(); + } + + double mpg = 0; + calculateConsumptionFuel() { + mpg = fuelPrice / 12; //todo in register car add mpg in box + } + + getCountRideToday() async { + var res = await CRUD().get( + link: AppLink.getCountRide, + payload: {'driver_id': box.read(BoxName.driverID).toString()}); + data = jsonDecode(res); + + countRideToday = data['message'][0]['count'].toString(); + update(); + } + + getDriverRate() async { + var res = await CRUD().get( + link: AppLink.getDriverRate, + payload: {'driver_id': box.read(BoxName.driverID).toString()}); + if (res != 'failure') { + var decod = jsonDecode(res); + if (decod['message'][0]['rating'] != null) { + rating = double.parse(decod['message'][0]['rating'].toString()); + } else { + rating = 5.0; // Set a default value (e.g., 5.0 for full rating) + } + } else { + rating = 5; + } + } + + getAllPayment() async { + var res = await CRUD().getWallet( + link: AppLink.getAllPaymentFromRide, + payload: {'driverID': box.read(BoxName.driverID).toString()}); + if (res == 'failure') { + totalMoneyInSEFER = '0'; + } else { + data = jsonDecode(res); + + totalMoneyInSEFER = data['message'][0]['total_amount']; + } + + update(); + } + + void changeToAppliedRide(String status) { + box.write(BoxName.rideStatus, status); + Log.print('rideStatus from homcaptain : ${box.read(BoxName.rideStatus)}'); + update(); + } + + Future getCaptainDurationOnToday() async { + try { + var res = await CRUD().get( + link: AppLink.getTotalDriverDurationToday, + payload: {'driver_id': box.read(BoxName.driverID).toString()}, + ); + + if (res == null || res == 'failure') { + totalDurationToday = '0'; + update(); + return; + } + + var data = jsonDecode(res); + totalDurationToday = data['message']?[0]?['total_duration'] ?? '0'; + } catch (e) { + print('Error in getCaptainDurationOnToday: $e'); + totalDurationToday = '0'; + } + + update(); + } +} diff --git a/siro_driver/lib/controller/home/captin/map_driver_controller.dart b/siro_driver/lib/controller/home/captin/map_driver_controller.dart new file mode 100755 index 0000000..8aa56ae --- /dev/null +++ b/siro_driver/lib/controller/home/captin/map_driver_controller.dart @@ -0,0 +1,2797 @@ +import 'dart:async'; +import 'dart:ui'; +import 'dart:convert'; +import 'dart:io'; +import 'dart:math'; +import 'dart:math' as math; +import 'package:flutter/foundation.dart'; +import 'package:http/http.dart' as http; +import 'package:siro_driver/controller/home/captin/home_captain_controller.dart'; +import 'package:siro_driver/views/widgets/error_snakbar.dart'; +import 'package:siro_driver/views/widgets/mydialoug.dart'; +import 'package:bubble_head/bubble.dart'; +import 'package:flutter/material.dart'; +import 'package:geolocator/geolocator.dart' as geo; +import 'package:geolocator/geolocator.dart'; +import 'package:get/get.dart'; +import 'package:intaleq_maps/intaleq_maps.dart'; +import 'package:url_launcher/url_launcher.dart'; + +import '../../../constant/box_name.dart'; +import '../../../constant/colors.dart'; +import '../../../constant/country_polygons.dart'; +import '../../../constant/links.dart'; +import '../../../constant/table_names.dart'; +import '../../../env/env.dart'; +import '../../../main.dart'; +import '../../../print.dart'; +import '../../../views/Rate/rate_passenger.dart'; +import '../../../views/home/Captin/home_captain/home_captin.dart'; +import '../../firebase/firbase_messge.dart'; +import '../../firebase/notification_service.dart'; +import '../../functions/crud.dart'; +import '../../functions/location_controller.dart'; +import '../../functions/tts.dart'; +import '../../functions/audio_recorder_controller.dart'; +import 'behavior_controller.dart'; + +class MapDriverController extends GetxController + with GetSingleTickerProviderStateMixin { + bool isLoading = true; + final formKey1 = GlobalKey(); + final formKey2 = GlobalKey(); + final formKeyCancel = GlobalKey(); + final messageToPassenger = TextEditingController(); + final sosEmergincyNumberCotroller = TextEditingController(); + final cancelTripCotroller = TextEditingController(); + List data = []; + List dataDestination = []; + LatLngBounds? boundsData; + InlqBitmap carIcon = InlqBitmap.defaultMarker; + InlqBitmap passengerIcon = InlqBitmap.defaultMarker; + InlqBitmap startIcon = InlqBitmap.defaultMarker; + InlqBitmap endIcon = InlqBitmap.defaultMarker; + final List polylineCoordinates = []; + final List polylineCoordinatesDestination = []; + List polyLines = []; + List polyLinesDestination = []; + Set markers = {}; + String passengerLocation = ''; + String passengerDestination = ''; + // [Fix N-4] استبدال 5 متغيرات منفصلة بقائمة واحدة + List steps = ['', '', '', '', '']; + String passengerWalletBurc = ''; + String timeOfOrder = ''; + String duration = ''; + String totalCost = ''; + String distance = '0'; + String? passengerName; + String passengerEmail = ''; + String totalPricePassenger = ''; + String passengerPhone = ''; + String rideId = ''; + String isHaveSteps = ''; + String paymentAmount = '0'; + String paymentMethod = ''; + String passengerId = ''; + String driverId = ''; + String tokenPassenger = ''; + String durationToPassenger = '100'; + String walletChecked = ''; + String direction = ''; + String durationOfRideValue = ''; + String status = ''; + int timeWaitingPassenger = 5; //5 miniute + bool isPassengerInfoWindow = false; + bool isBtnRideBegin = false; + bool isArrivedSend = true; + bool isdriverWaitTimeEnd = false; + bool isRideFinished = false; + bool isRideStarted = false; + bool isPriceWindow = false; + double passengerInfoWindowHeight = Get.height * .38; + double driverEndPage = 100; + double progress = 0; + double progressToPassenger = 0; + double progressInPassengerLocationFromDriver = 0; + bool isRideBegin = false; + int progressTimerToShowPassengerInfoWindowFromDriver = 25; + int remainingTimeToShowPassengerInfoWindowFromDriver = 25; + int remainingTimeToPassenger = 60; + int remainingTimeInPassengerLocatioWait = 60; + + // [Fix P-1] Gatekeeper لمنع الاستدعاءات المتكررة لـ getRoute() + bool _isRouteRequested = false; + // 🔥 [Fix Double-Init] Debounce لمنع التنفيذ المتزامن/المتسارع لـ argumentLoading() + // StatelessWidget يُسجّل addPostFrameCallback في كل build() — هذا يمنع التنفيذ المتكرر + DateTime? _lastArgumentLoadingTime; + bool _argumentLoadingInProgress = false; + Completer? _mapReadyCompleter; + + // [Fix P-2] Throttle لتقليل تحديثات UI من مستمع GPS + DateTime _lastUIUpdate = DateTime.fromMillisecondsSinceEpoch(0); + static const _uiThrottleMs = 400; + + // ─── Navigation & Smoothing ────────────────────────────────────────── + AnimationController? _animController; + LatLng? smoothedLocation; + double smoothedHeading = 0.0; + LatLng? _oldLoc; + LatLng? _targetLoc; + double _oldHeading = 0.0; + double _targetHeading = 0.0; + + List> routeSteps = []; + int currentStepIndex = 0; + String currentInstruction = ""; + String nextInstruction = ""; + String distanceToNextStep = ""; + int currentManeuverModifier = 0; + bool _nextInstructionSpoken = false; + bool isTtsEnabled = true; + StreamSubscription? _locationSubscription; + // ───────────────────────────────────────────────────────────────────── + bool isDriverNearPassengerStart = false; + IntaleqMapController? mapController; + LatLng myLocation = LatLng(0, 0); + int remainingTimeTimerRideBegin = 60; + String stringRemainingTimeRideBegin = ''; + String stringRemainingTimeRideBegin1 = ''; + double progressTimerRideBegin = 0; + Timer? timer; + String? mapAPIKEY; + final zones = []; + String canelString = 'yet'; + LatLng latLngPassengerLocation = LatLng(0, 0); + LatLng latLngPassengerDestination = LatLng(0, 0); + + // في MapDriverController + + void toggleTts() { + isTtsEnabled = !isTtsEnabled; + if (!isTtsEnabled && Get.isRegistered()) { + Get.find().stop(); + } + update(); + } + + void playVoiceInstruction(String text) { + if (!isTtsEnabled) return; + if (Get.isRegistered()) { + Get.find().speakText(text); + } + } + + /// [Fix M-5] disposeEverything يجب أن يتوقف عن استدعاء onClose مباشرة + /// لأن GetX يتولى ذلك تلقائياً. نستخدم _stopAllServices فقط. + void disposeEverything() { + print("--- KILLING ALL DRIVER TIMERS (via disposeEverything) ---"); + _stopAllServices(); + } + + @override + void onClose() { + print("--- KILLING ALL DRIVER TIMERS ---"); + _rideTimer?.cancel(); + _rideTimer = null; + _passengerTimer?.cancel(); + _passengerTimer = null; + _waitingTimer?.cancel(); + _waitingTimer = null; + timer?.cancel(); + timer = null; + + _navigationTimer?.cancel(); + _navigationTimer = null; + + _posSub?.cancel(); + _posSub = null; + + _animController?.dispose(); + _locationSubscription?.cancel(); + + super.onClose(); + } + + void onMapCreated(IntaleqMapController controller) { + mapController = controller; + if (Get.isRegistered()) { + myLocation = Get.find().myLocation; + controller.animateCamera(CameraUpdate.newLatLngZoom(myLocation, 16)); + } + + // [Fix P-1] إكمال الـ Completer لتحرير argumentLoading من الانتظار + _mapReadyCompleter?.complete(); + _mapReadyCompleter = null; + + if (!_isRouteRequested) { + // أول مرة — argumentLoading لم تكتمل بعد، ارسم المسار الأولي + // startListeningStepNavigation() محذوفة من هنا عمداً: + // تُستدعى من argumentLoading() بعد اكتمال getRoute() وتحميل البيانات + if (isRideStarted) { + getRoute( + origin: myLocation, + destination: latLngPassengerDestination, + routeColor: Colors.blue, + ); + } else { + getRoute( + origin: myLocation, + destination: latLngPassengerLocation, + routeColor: Colors.yellow, + ); + } + } else { + // 🔥 [Fix Rebuild] إعادة بناء الخريطة (مثلاً تغيير theme أو update()) + // أعد رسم البوليلاين الموجود وأعد تشغيل الملاحة إذا لزم + _redrawExistingPolylines(); + if (_navigationTimer == null || !_navigationTimer!.isActive) { + startListeningStepNavigation(); + } + } + } + + /// إعادة رسم البوليلاين الموجود بعد إعادة بناء الخريطة (GetBuilder rebuild) + /// يُستدعى فقط من onMapCreated() عند _isRouteRequested == true + void _redrawExistingPolylines() { + if (upcomingPathPoints.isEmpty) { + // لا يوجد مسار محمّل — لا شيء نرسمه + return; + } + + final remaining = upcomingPathPoints.sublist(_lastTraveledIndex); + polyLines.clear(); + polyLines.add( + Polyline( + polylineId: const PolylineId("upcoming_route"), + points: remaining, + width: 8, + color: isRideStarted ? Colors.blue : Colors.yellow, + ), + ); + + // إعادة رسم المسار المقطوع (رمادي) إذا وجد + if (_lastTraveledIndex > 0) { + final traveled = upcomingPathPoints.sublist(0, _lastTraveledIndex + 1); + polyLines.add( + Polyline( + polylineId: const PolylineId('traveled_route'), + points: traveled, + color: Colors.grey.withValues(alpha: 0.8), + width: 7, + zIndex: 1, + ), + ); + } + + Log.print( + "🔄 [onMapCreated] Redrawn ${polyLines.length} polylines after map rebuild."); + update(); + } + + bool isCameraLocked = true; // للتحكم في تتبع الكاميرا + Timer? _cameraLockTimer; + + void onUserMapInteraction() { + if (isCameraLocked) { + isCameraLocked = false; + update(); + } + + _cameraLockTimer?.cancel(); + _cameraLockTimer = Timer(const Duration(seconds: 5), () { + if (!isClosed) { + isCameraLocked = true; + if (myLocation != null && mapController != null) { + if (Get.isRegistered()) { + final locCtrl = Get.find(); + final double speedKmh = locCtrl.speed * 3.6; + final double bearing = speedKmh > 5 ? locCtrl.heading : 0.0; + _animateCameraToNavigationMode(myLocation!, bearing); + } else { + _animateCameraToNavigationMode(myLocation!, 0.0); + } + } + update(); + } + }); + } + + Future startListeningStepNavigation() async { + // Cancel any previous listener + _navigationTimer?.cancel(); + + // Reuse LocationController's GPS stream instead of opening a + // second GPS channel — eliminates duplicate battery/CPU drain. + // Lightweight Timer-based polling at 500ms (was a full GPS stream). + _navigationTimer = Timer.periodic( + const Duration(milliseconds: 500), + (_) { + if (isClosed || mapController == null) return; + + final locCtrl = Get.isRegistered() + ? Get.find() + : null; + if (locCtrl == null || locCtrl.myLocation.latitude == 0) return; + + final LatLng newLoc = locCtrl.myLocation; + final double heading = locCtrl.heading; + final double speedKmh = locCtrl.speed * 3.6; + + // Jitter filter + if (_lastRecordedLocation != null) { + final double dist = Geolocator.distanceBetween( + newLoc.latitude, + newLoc.longitude, + _lastRecordedLocation!.latitude, + _lastRecordedLocation!.longitude, + ); + if (dist < 3.0) return; + } + + _lastRecordedLocation = newLoc; + myLocation = newLoc; + + _oldLoc = smoothedLocation ?? newLoc; + _targetLoc = newLoc; + _oldHeading = smoothedHeading; + _targetHeading = speedKmh > 0.5 ? heading : _oldHeading; + _animController?.forward(from: 0.0); + + if (!isClosed) { + updateMarker(); + if (upcomingPathPoints.isNotEmpty) { + _updateTraveledPolylineSmart(myLocation); + } + if (isCameraLocked) { + final double bearing = speedKmh > 5 ? heading : 0.0; + _animateCameraToNavigationMode(newLoc, bearing); + } + checkForNextStep(myLocation); + checkDestinationProximity(); + + final now = DateTime.now(); + if (now.difference(_lastUIUpdate).inMilliseconds > _uiThrottleMs) { + _lastUIUpdate = now; + update(); + } + } + }, + ); + } + + void changeStatusDriver() { + status = 'On'; + update(); + } + + AudioRecorderController _getAudioController() { + if (!Get.isRegistered()) { + Get.put(AudioRecorderController(), permanent: true); + } + return Get.find(); + } + + void changeDriverEndPage() { + driverEndPage = remainingTimeTimerRideBegin < 60 ? 160 : 100; + update(); + } + + takeSnapMap() { + // mapController!.takeSnapshot(); + } + + // [Fix P-3] إزالة dispose() المكررة — GetX يستدعي onClose() تلقائياً + + void _stopAllServices() { + _rideTimer?.cancel(); + _passengerTimer?.cancel(); + _waitingTimer?.cancel(); + _posSub?.cancel(); + } + + Future openGoogleMapFromDriverToPassenger() async { + var endLat = latLngPassengerLocation.latitude; + var endLng = latLngPassengerLocation.longitude; + + var startLat = Get.find().myLocation.latitude; + var startLng = Get.find().myLocation.longitude; + + /// [Fix N-1] تصحيح رابط Google Maps: & → ? + String url = + 'https://www.google.com/maps/dir/$startLat,$startLng/$endLat,$endLng/?directionsmode=driving'; + if (await canLaunchUrl(Uri.parse(url))) { + await launchUrl(Uri.parse(url)); + } else { + throw 'Could not launch google maps'; + } + } + + void clearPolyline() { + polyLines = []; + polyLinesDestination = []; + polylineCoordinates.clear(); + polylineCoordinatesDestination.clear(); + update(); + } + + void changeRideToBeginToPassenger() { + isRideBegin = true; + passengerInfoWindowHeight = Get.height * .22; + update(); + } + + // متغير لمنع التكرار + bool _isCancelReceived = false; + + /// **معالجة إلغاء الراكب الموحدة (Gatekeeper)** + void processRideCancelledByPassenger( + String reason, { + String source = "Unknown", + }) { + if (_isCancelReceived) return; + _isCancelReceived = true; + + // [Fix 2] إيقاف جميع التايمرات النشطة فوراً عند إلغاء الراكب. + // كانت هذه التايمرات تستمر حتى onClose() مما يسبب تسرب في الموارد. + _rideTimer?.cancel(); + _rideTimer = null; + _passengerTimer?.cancel(); + _passengerTimer = null; + _waitingTimer?.cancel(); + _waitingTimer = null; + Log.print("🛑 All ride timers cancelled due to passenger cancellation."); + + try { + final AudioRecorderController audioRecorderController = + _getAudioController(); + if (audioRecorderController.isRecording) { + audioRecorderController.stopRecording(); + } + } catch (e) { + Log.print("Error stopping audio recording: $e"); + } + + Log.print("🚫 Ride Cancelled by Passenger via $source. Reason: $reason"); + + // 1. إيقاف التوجيه والتايمرات + // stopNavigation(); + // stopAllTimers(); + + // 2. تنظيف الحالة + box.write(BoxName.rideStatus, 'Canceled'); // أو الحالة الافتراضية + box.remove(BoxName.rideArguments); + box.remove(BoxName.passengerID); + box.remove(BoxName.rideId); + + // 3. عرض رسالة للسائق + if (Get.isDialogOpen == true) { + Get.back(); + } + + Get.defaultDialog( + title: "تم إلغاء الرحلة".tr, + titleStyle: TextStyle(color: Colors.red), + barrierDismissible: false, + content: Column( + children: [ + Icon(Icons.person_off, size: 50, color: Colors.orange), + SizedBox(height: 10), + Text( + "${"Passenger cancelled the ride.".tr}\n${"Reason".tr}: $reason", + textAlign: TextAlign.center, + ), + ], + ), + confirm: ElevatedButton( + onPressed: () { + Get.back(); // إغلاق الديالوج + Get.delete< + HomeCaptainController>(); // clear old controller to fix map generation + Get.offAll(() => HomeCaptain()); // العودة للرئيسية + }, + child: Text("OK".tr), + ), + ); + + // تشغيل صوت تنبيه للإلغاء + // AudioService.playCancelSound(); + } + + Future cancelTripFromDriverAfterApplied() async { + if (formKeyCancel.currentState!.validate()) { + Get.dialog( + const Center(child: CircularProgressIndicator()), + barrierDismissible: false, + ); + + try { + // 1. استدعاء السيرفر + var response = await CRUD().post( + link: "${AppLink.ride}/rides/cancel_ride_by_driver.php", + payload: { + "ride_id": (rideId).toString(), + "driver_id": box.read(BoxName.driverID).toString(), + "reason": (cancelTripCotroller.text) ?? '', + "passenger_token": tokenPassenger.toString(), + }, + ); + + if (response['status'] == 'success') { + // 🔥🔥 معالجة الحظر (The Penalty Logic) 🔥🔥 + bool isBlocked = response['is_blocked'] ?? false; + + if (isBlocked) { + String blockExpiryStr = + response['block_until']; // "2024-10-10 14:30:00" + + // حفظ تاريخ فك الحظر في الذاكرة المحلية + box.write(BoxName.blockUntilDate, blockExpiryStr); + + // تحويل الحالة لأوفلاين إجبارياً + box.write(BoxName.statusDriverLocation, 'blocked'); + + // عرض رسالة العقوبة + mySnackeBarError( + "Due to excessive cancellations (3 times), receiving orders has been suspended for 4 hours." + .tr, + ); + } else { + // تحذير فقط + int count = response['cancel_count'] ?? 0; + mySnackbarWarning( + "لقد ألغيت $count رحلات اليوم. الوصول لـ 3 سيعرضك للإيقاف المؤقت." + .tr, + ); + } + + // تنظيف البيانات + try { + final AudioRecorderController audioRecorderController = + _getAudioController(); + if (audioRecorderController.isRecording) { + await audioRecorderController.stopRecording(); + } + } catch (e) { + Log.print("Error stopping audio recording: $e"); + } + box.remove('cached_trip_route'); + box.remove(BoxName.rideArgumentsFromBackground); + box.remove(BoxName.rideArguments); + box.remove(BoxName.passengerID); + box.remove(BoxName.rideId); + box.write(BoxName.rideStatus, 'Cancel'); + + // تسجيل محلي (اختياري) + try { + await sql.insertData({ + 'order_id': rideId, + 'created_at': DateTime.now().toString(), + 'driver_id': box.read(BoxName.driverID), + }, TableName.driverOrdersRefuse); + } catch (_) {} + + if (Get.isRegistered()) { + Get.find().getRefusedOrderByCaptain(); + } else { + // في حال لم يكن مسجل (جاي من background) + Get.put(HomeCaptainController(), permanent: true) + .getRefusedOrderByCaptain(); + } + + if (Get.isDialogOpen == true) { + Get.back(); + } + Get.delete< + HomeCaptainController>(); // clear old controller to fix map generation + Get.offAll( + () => HomeCaptain(), + ); // العودة للرئيسية ليتم تطبيق الحظر هناك + } else { + if (Get.isDialogOpen == true) { + Get.back(); + } + mySnackeBarError("Failed to cancel ride".tr); + } + } catch (e) { + if (Get.isDialogOpen == true) { + Get.back(); + } + Log.print("Error: $e"); + } + } + } + + Timer? _passengerTimer; // مرجع للتايمر لإيقافه لاحقاً + /// **بدء مؤقت الوصول للراكب (Passenger Arrival Timer)** + /// + /// تقوم هذه الدالة بإدارة العد التنازلي للوقت المتوقع لوصول السائق إلى موقع الراكب. + /// + /// **آلية العمل:** + /// 1. تتحقق من حالة الرحلة؛ إذا كانت قد بدأت بالفعل ('Begin')، تخفي نافذة المعلومات وتوقف العمل. + /// 2. تحسب المدة الإجمالية من [durationToPassenger]. + /// 3. تستخدم [Timer.periodic] لتحديث الواجهة كل ثانية بدقة عالية. + /// 4. تقوم بحساب النسبة المئوية [progressToPassenger] وتنسيق الوقت المتبقي [stringRemainingTimeToPassenger]. + /// 5. عند انتهاء الوقت، تُفعل زر بدء الرحلة [isBtnRideBegin]. + void startTimerToShowPassengerInfoWindowFromDriver() { + // 1. تنظيف أي تايمر سابق لضمان عدم تداخل العدادات + _passengerTimer?.cancel(); + + // 2. التحقق من حالة الرحلة + String currentStatus = box.read(BoxName.rideStatus) ?? ''; + if (currentStatus == 'Begin') { + Log.print('rideStatus from map: $currentStatus - Hiding Info Window'); + isPassengerInfoWindow = false; + update(); + return; + } + + // 3. تهيئة المتغيرات + isPassengerInfoWindow = true; + final int totalDuration = + int.tryParse(durationToPassenger.toString()) ?? 60; + + // استخدام DateTime لضمان دقة الوقت وعدم التأثر ببطء الجهاز + final DateTime endTime = DateTime.now().add( + Duration(seconds: totalDuration), + ); + + // 4. بدء التايمر الدوري + _passengerTimer = Timer.periodic(const Duration(seconds: 1), (timer) { + // أمان: إيقاف التايمر إذا تم إغلاق الكنترولر + if (isClosed) { + timer.cancel(); + return; + } + + final DateTime now = DateTime.now(); + final int remainingSeconds = endTime.difference(now).inSeconds; + + // أ) تحديث القيم + if (remainingSeconds <= 0) { + // انتهى الوقت + remainingTimeToPassenger = 0; + progressToPassenger = 1.0; + stringRemainingTimeToPassenger = "00:00"; + isBtnRideBegin = true; + + timer.cancel(); // إيقاف التايمر + } else { + // ما زال العد مستمراً + remainingTimeToPassenger = remainingSeconds; + + // حساب النسبة المئوية (مع منع القسمة على صفر) + progressToPassenger = + totalDuration > 0 ? 1 - (remainingSeconds / totalDuration) : 0.0; + + // تنسيق الوقت (دقائق:ثواني) + final int minutes = (remainingSeconds / 60).floor(); + final int seconds = remainingSeconds % 60; + stringRemainingTimeToPassenger = + '$minutes:${seconds.toString().padLeft(2, '0')}'; + } + + // ب) تحديث الواجهة + update(); + }); + } + + String stringRemainingTimeToPassenger = ''; + + String stringRemainingTimeWaitingPassenger = ''; + Timer? _waitingTimer; // متغير للتحكم في تايمر الانتظار + /// **بدء مؤقت انتظار الراكب (Waiting For Passenger Timer)** + /// + /// تحسب الوقت الذي ينتظره السائق عند نقطة الانطلاق. + /// + /// **التحسينات:** + /// 1. استبدال الحلقة التكرارية بـ [Timer.periodic] لأداء أفضل. + /// 2. استخدام [DateTime] لحساب الوقت المتبقي بدقة حتى لو كان التطبيق في الخلفية. + /// 3. إدارة حالات الخروج (بدء الرحلة أو انتهاء وقت الانتظار) بشكل أنظف. + void startTimerToShowDriverWaitPassengerDuration() { + // 1. تنظيف أي تايمر سابق + _waitingTimer?.cancel(); + + // 2. حساب المدة الكلية بالثواني + final int totalDurationSeconds = timeWaitingPassenger * 60; + + // 3. تحديد وقت الانتهاء المتوقع (للدقة) + final DateTime endTime = DateTime.now().add( + Duration(seconds: totalDurationSeconds), + ); + + Log.print("⏳ Driver Waiting Timer Started: $totalDurationSeconds seconds"); + + // 4. بدء التايمر الدوري + _waitingTimer = Timer.periodic(const Duration(seconds: 1), (timer) { + // أ) التحقق من إغلاق الكنترولر + if (isClosed) { + timer.cancel(); + return; + } + + // ب) شرط الإيقاف الفوري: إذا بدأت الرحلة فعلياً + if (isRideBegin) { + remainingTimeInPassengerLocatioWait = 0; + stringRemainingTimeWaitingPassenger = "00:00"; + timer.cancel(); + update(); + return; + } + + // ج) حساب الوقت المتبقي بناءً على الساعة الحالية + final DateTime now = DateTime.now(); + final int remainingSeconds = endTime.difference(now).inSeconds; + + // د) تحديث المتغيرات + if (remainingSeconds <= 0) { + // انتهى وقت الانتظار + remainingTimeInPassengerLocatioWait = 0; + progressInPassengerLocationFromDriver = 1.0; + stringRemainingTimeWaitingPassenger = "00:00"; + isdriverWaitTimeEnd = true; // تفعيل زر الإلغاء المدفوع + + timer.cancel(); + } else { + // ما زال الانتظار جارياً + remainingTimeInPassengerLocatioWait = remainingSeconds; + + // حساب التقدم (من 0.0 إلى 1.0) + // Elapsed = Total - Remaining + final int elapsed = totalDurationSeconds - remainingSeconds; + progressInPassengerLocationFromDriver = + totalDurationSeconds > 0 ? (elapsed / totalDurationSeconds) : 1.0; + + // تنسيق النص + final int minutes = (remainingSeconds / 60).floor(); + final int seconds = remainingSeconds % 60; + stringRemainingTimeWaitingPassenger = + '$minutes:${seconds.toString().padLeft(2, '0')}'; + } + + update(); + }); + } + + bool isSocialPressed = false; + // نغير نوع الإرجاع إلى Future + Future driverCallPassenger() async { + try { + // نضع الكود داخل try لضمان عدم توقف التطبيق عند انقطاع النت + String scam = await getDriverScam(); + int scamCount = int.tryParse(scam) ?? 0; + + // 1. منطق الحظر + if (scamCount > 3) { + box.write(BoxName.statusDriverLocation, 'on'); + Get.find().stopLocationUpdates(); + + // إرسال تنبيه (لا ننتظره await لأنه لا يؤثر على المنع) + CRUD().post( + link: AppLink.addNotificationCaptain, + payload: { + 'driverID': box.read(BoxName.driverID), + 'title': 'scams operations'.tr, + 'body': + 'you have connect to passengers and let them cancel the order' + .tr, + }, + ); + + // نرجع false لمنع الاتصال + return false; + } + + // [Fix M-7] استخدام isNotEmpty بدلاً من != null لأن passengerId و rideId من نوع String غير قابل للـ null + // لو كانا فارغين '' يمر الشرط ويُرسل بيانات فارغة للسيرفر + if (isSocialPressed == true && + passengerId.isNotEmpty && + rideId.isNotEmpty) { + box.write(BoxName.statusDriverLocation, 'off'); + + // لا نستخدم await هنا لكي لا نؤخر فتح الهاتف + CRUD().post( + link: AppLink.addDriverScam, + payload: { + 'driverID': box.read(BoxName.driverID), + 'passengerID': passengerId, + 'rideID': rideId, + 'isDriverCallPassenger': 'true', + }, + ); + } + + // نسمح بالاتصال + return true; + } catch (e) { + // في حال حدث خطأ في النت أو السيرفر، هل تريد السماح له بالاتصال؟ + // الأفضل نعم، حتى لا تتعطل الخدمة بسبب خطأ تقني، ونسجل الخطأ في اللوج + print("Error in scam check: $e"); + return true; + } + } + + // دالة مساعدة لحماية التطبيق من كراش الخرائط + Future safeAnimateCamera(CameraUpdate cameraUpdate) async { + if (isClosed || mapController == null) return; + try { + await mapController!.animateCamera(cameraUpdate); + } catch (e) { + Log.print("Camera error ignored"); + } + } + + Future getDriverScam() async { + var res = await CRUD().post( + link: AppLink.getDriverScam, + payload: {'driverID': box.read(BoxName.driverID)}, + ); + + if (res == 'failure') { + box.write(BoxName.statusDriverLocation, 'off'); + return '0'; + } + var d = (res); + Log.print('d: ${d}'); + + // 1. Check if the response status is 'failure' (API level check) + if (d['status'] == 'failure') { + // If the API status is failure, the message is a String (e.g., 'No ride scam record found') + // and there's no 'count' array to read. + return '0'; + } + + // 2. Safely access the List/Map structure for 'count' + // This assumes a successful response looks like: + // {'status': 'success', 'message': [{'count': '12'}]} + var messageData = d['message']; + + // Check if messageData is actually a List before accessing index [0] + if (messageData is List && + messageData.isNotEmpty && + messageData[0] is Map) { + return messageData[0]['count']; + } + + // Fallback if the successful data structure is unexpected + return '0'; + + // --- FIX END --- + } + + void startRideFromStartApp() async { + // if (box.read(BoxName.rideStatus) == 'Begin') { + changeRideToBeginToPassenger(); + isPassengerInfoWindow = false; + isRideStarted = true; // يجب أن يكون true قبل getRoute لتفعيل وضع الملاحة + isRideFinished = false; + remainingTimeInPassengerLocatioWait = 0; + timeWaitingPassenger = 0; + box.write(BoxName.statusDriverLocation, 'on'); + update(); + // } + + // Immediately fetch high-accuracy location for navigation origin + try { + Position currentPos = await Geolocator.getCurrentPosition( + desiredAccuracy: LocationAccuracy.bestForNavigation); + myLocation = LatLng(currentPos.latitude, currentPos.longitude); + smoothedLocation = myLocation; + smoothedHeading = currentPos.heading; + } catch (e) { + Log.print( + "Error getting current position on start ride from start app: $e"); + } + + // التحقق من صحة إحداثيات الهدف قبل الرسم + if (latLngPassengerDestination.latitude == 0 || + latLngPassengerDestination.longitude == 0) { + Log.print( + "⚠️ startRideFromStartApp: destination is (0,0) — skipping getRoute"); + return; + } + + // ── إعادة رسم المسار إلى وجهة الراكب النهائية ──────────────── + await getRoute( + origin: myLocation.latitude == 0 + ? Get.find().myLocation + : myLocation, + destination: latLngPassengerDestination, + routeColor: Colors.blue, + ); + + updateMarker(); + + // بدء الخدمات (الملاحة والعداد) + await startListeningStepNavigation(); + + rideIsBeginPassengerTimer(); + try { + final AudioRecorderController audioRecorderController = + _getAudioController(); + audioRecorderController.startRecording(rideId: rideId.toString()); + } catch (e) { + Log.print("Error starting audio recording: $e"); + } + } + + Position? currentPosition; + + /// **بدء الرحلة من طرف السائق (Start Ride)** + /// + /// تقوم هذه الدالة بالتحقق من المسافة بين السائق والراكب، فإذا كانت قريبة (< 400م)، + /// ترسل طلباً للسيرفر لبدء الرحلة رسمياً. + /// + /// * السيرفر سيقوم بإرسال الإشعارات (Socket + FCM) للراكب تلقائياً. + /// **بدء الرحلة (Start Ride)** + /// + /// التحسينات: + /// 1. إظهار Loading لمنع تكرار الضغط. + /// 2. استخدام التحديث الموجه (Targeted Update) لمنع وميض الشاشة. + /// 3. معالجة فشل السيرفر (Revert Logic) لضمان عدم ضياع حالة الرحلة. + Future startRideFromDriver() async { + // 1. إظهار مؤشر تحميل فوري (Blocking) + Get.dialog( + const Center(child: CircularProgressIndicator()), + barrierDismissible: false, + ); + + try { + // 2. التحقق من المسافة (Async) + double distanceToPassenger = + await calculateDistanceBetweenDriverAndPassengerLocation(); + + // إغلاق مؤشر التحميل لأننا حصلنا على النتيجة + if (Get.isDialogOpen == true) { + Get.back(); + } + + if (distanceToPassenger < 150) { + // زدت المسافة قليلاً لمرونة أكبر (150م) + + // --- أ) تحديث الحالة المحلية (Optimistic Update) --- + changeRideToBeginToPassenger(); // تغيير المتغيرات الداخلية + isPassengerInfoWindow = false; + isRideStarted = true; + isRideFinished = false; + remainingTimeInPassengerLocatioWait = 0; + timeWaitingPassenger = 0; + + // الحفظ في التخزين المحلي + box.write(BoxName.statusDriverLocation, 'on'); + box.write(BoxName.rideStatus, 'Begin'); + + // Immediately fetch high-accuracy location for navigation origin + try { + Position currentPos = await Geolocator.getCurrentPosition( + desiredAccuracy: LocationAccuracy.bestForNavigation); + myLocation = LatLng(currentPos.latitude, currentPos.longitude); + smoothedLocation = myLocation; + smoothedHeading = currentPos.heading; + } catch (e) { + Log.print("Error getting current position on start ride: $e"); + } + + // 🔥 [Fix Polyline] مسح المسار الأصفر (للراكب) فوراً قبل رسم الأزرق (للوجهة) + // بدون هذا قد يبقى الخط الأصفر ظاهراً إذا تأخر getRoute() أو أُعيد بناء الخريطة + clearPolyline(); + + // ── إعادة رسم المسار إلى وجهة الراكب النهائية ──────────────── + String? cachedRoute = box.read('cached_trip_route'); + + await getRoute( + origin: myLocation.latitude == 0 + ? Get.find().myLocation + : myLocation, + destination: latLngPassengerDestination, + routeColor: Colors + .black, // Color for the actual trip (black as user prefers solid) + cachedResponse: cachedRoute, + ); + + updateMarker(); + + // بدء الخدمات (الملاحة والعداد) + await startListeningStepNavigation(); + rideIsBeginPassengerTimer(); + try { + final AudioRecorderController audioRecorderController = + _getAudioController(); + audioRecorderController.startRecording(rideId: rideId.toString()); + } catch (e) { + Log.print("Error starting audio recording: $e"); + } + + // --- ب) تحديث الواجهة (Targeted Updates Only) --- + // نحدث فقط الأجزاء التي تتغير، بدلاً من إعادة رسم الخريطة كاملة + // update(['PassengerInfo']); // لإخفاء نافذة معلومات الراكب + // update(['DriverEndBar']); // لإظهار شريط إنهاء الرحلة + // update(['SosConnect']); // لتفعيل زر الطوارئ (تأكد من وضع ID للودجت) + update(); + // --- ج) إرسال الطلب للسيرفر (Background) --- + // لا ننتظر النتيجة لتعطيل الواجهة، لكن نعالج الخطأ إن حدث + CRUD().post( + link: "${AppLink.server}/ride/rides/start_ride.php", + payload: { + 'id': rideId.toString(), + 'driver_id': box.read(BoxName.driverID).toString(), + 'status': 'Begin', + "passengerToken": tokenPassenger.toString(), + }, + ).then((response) { + if (response['status'] == 'failure') { + Log.print("Server failed to start ride!"); + isRideStarted = false; + isRideBegin = false; + box.write(BoxName.rideStatus, 'Apply'); + isPassengerInfoWindow = true; + stopListeningStepNavigation(); + mySnackeBarError("Failed to start ride. Please try again."); + update(); + } + }).catchError((error) { + Log.print("Network/Server error starting ride: $error"); + isRideStarted = false; + isRideBegin = false; + box.write(BoxName.rideStatus, 'Apply'); + isPassengerInfoWindow = true; + stopListeningStepNavigation(); + mySnackeBarError("Network error. Failed to start ride."); + update(); + }); + } else { + // --- حالة الرفض (بعيد جداً) --- + showDialog( + context: Get.context!, + builder: (context) => AlertDialog( + title: Text('You are far from passenger location'.tr), + content: Text( + 'Please go closer to the passenger location (less than 150m)'.tr, + ), + actions: [ + TextButton( + onPressed: () => Navigator.pop(context), + child: Text('OK'.tr), + ), + ], + ), + ); + } + } catch (e) { + // تنظيف اللودينج في حال حدوث خطأ غير متوقع + if (Get.isDialogOpen == true) { + Get.back(); + } + Log.print("Error starting ride: $e"); + mySnackeBarError("Could not start ride. Please check internet.".tr); + } + } + + calculateDistanceInMeter(LatLng prev, LatLng current) async { + double distance2 = Geolocator.distanceBetween( + prev.latitude, + prev.longitude, + current.latitude, + current.longitude, + ); + return distance2; + } + + double speedoMeter = 0; + Timer? _updateLocationTimer; + + /// [Fix C-1] استبدال for loop الحلقة التكرارية بـ Timer.periodic + /// لمنع تسرب الذاكرة وufeni الـ Stack Overflow من الاستدعاء الذاتي المتكرر. + void startUpdateLocationTimer() { + _updateLocationTimer?.cancel(); + _updateLocationTimer = Timer.periodic(const Duration(seconds: 3), (timer) { + if (isClosed || !isRideBegin) { + timer.cancel(); + return; + } + try { + safeAnimateCamera( + CameraUpdate.newCameraPosition( + CameraPosition( + bearing: Get.find().heading, + target: myLocation, + zoom: 17, + ), + ), + ); + update(); + } catch (error) { + debugPrint('Error listening to GPS: $error'); + } + }); + } + + void stopUpdateLocationTimer() { + _updateLocationTimer?.cancel(); + _updateLocationTimer = null; + } + + Future calculateDistanceBetweenDriverAndPassengerLocation() async { + final locationController = Get.isRegistered() + ? Get.find() + : Get.put(LocationController()); + try { + var res = await CRUD().get( + link: AppLink.getLatestLocationPassenger, + payload: {'rideId': (rideId)}, + ).timeout(const Duration(seconds: 5)); + if (res != 'failure') { + var passengerLatestLocationString = jsonDecode(res)['message']; + + double distance2 = Geolocator.distanceBetween( + double.parse(passengerLatestLocationString[0]['lat'].toString()), + double.parse(passengerLatestLocationString[0]['lng'].toString()), + locationController.myLocation.latitude, + locationController.myLocation.longitude, + ); + return distance2; + } + } catch (_) {} + + // Fallback to local coordinates in case of error/timeout + double distance2 = Geolocator.distanceBetween( + latLngPassengerLocation.latitude, + latLngPassengerLocation.longitude, + locationController.myLocation.latitude, + locationController.myLocation.longitude, + ); + return distance2; + } + + // [Fix C-3] دالة مساعدة مشتركة لتحليل المسافة النصية إلى متر + // تُستخدم في كلا الدالتين: finishRideFromDriver و _validateTripDistance + double _parseDistanceToMeters() { + String cleanDistance = distance.toString().replaceAll( + RegExp(r'[^0-9.]'), + '', + ); + if (cleanDistance.isEmpty) cleanDistance = "0.0"; + double numericDistance = double.parse(cleanDistance); + + bool isMeters = distance.toString().contains('m') && + !distance.toString().contains('km'); + if (!isMeters && numericDistance > 100) isMeters = true; + + return isMeters ? numericDistance : numericDistance * 1000; + } + + /// [Fix M-6] دالة مساعدة لحساب التكلفة + /// ⚠️ ملاحظة: distanceBetweenDriverAndPassengerWhenConfirm بالكيلومتر + double _calculateWaitingCost() { + bool isEgypt = box.read(BoxName.countryCode) == 'Egypt'; + double waitingMinutes = 5.0; + + if (isEgypt) { + // معادلة مصر: (المسافة كم * 0.08) + (5 دقائق * 1) + return (distanceBetweenDriverAndPassengerWhenConfirm * 0.08) + + (waitingMinutes * 1.0); + } else { + // معادلة الأردن/أخرى: (المسافة كم * 11) + (5 دقائق * 0.06) + return (distanceBetweenDriverAndPassengerWhenConfirm * 11) + + (waitingMinutes * 0.06); + } + } + + Future addWaitingTimeCostFromPassengerToDriverWallet() async { + // ... (فحص المسافة واللودينج كما هو) ... + Get.dialog( + const Center(child: CircularProgressIndicator()), + barrierDismissible: false, + ); + + try { + // 1. حساب التكلفة + double costOfWaiting = _calculateWaitingCost(); + double costForPassenger = costOfWaiting * -1; // بالسالب + + // 2. تحديث البيانات التشغيلية (Main Server) + // هذا الطلب لا يحتاج توكنات مالية، فقط تحديث حالة + await CRUD().post( + link: "${AppLink.ride}/rides/update_ride_cancel_wait.php", + payload: { + 'ride_id': rideId.toString(), + 'driver_id': box.read(BoxName.driverID).toString(), + }, + ); + + // 3. توليد التوكنات (Server-Side Logic Security) + // نحتاج توكن للسائق وتوكن للراكب + final tokens = await Future.wait([ + generateTokenDriver(costOfWaiting.toString()), + generateTokenPassenger(costForPassenger.toString()), + ]); + + // 4. تنفيذ العملية المالية الموحدة (Payment Server) + var paymentResponse = await CRUD().postWallet( + link: + "${AppLink.paymentServer}/ride/passengerWallet/process_wait_compensation.php", // الرابط الجديد + payload: { + 'ride_id': rideId.toString(), + 'driver_id': box.read(BoxName.driverID).toString(), + 'passenger_id': passengerId.toString(), + 'amount': costOfWaiting.toString(), // المبلغ الموجب + 'amount_passenger': costForPassenger.toString(), // المبلغ السالب + 'token_driver': tokens[0], + 'token_passenger': tokens[1], + }, + ); + + if (paymentResponse['status'] == 'success') { + // النجاح + if (Get.isDialogOpen == true) Get.back(); + + mySnackbarSuccess( + '${'You gained'.tr} ${costOfWaiting.toStringAsFixed(2)} ${'in your wallet'.tr}', + ); + + box.write(BoxName.statusDriverLocation, 'off'); + Get.delete< + HomeCaptainController>(); // clear old controller to fix map generation + Get.offAll(() => HomeCaptain()); + } else { + throw Exception("Payment Transaction Failed"); + } + } catch (e) { + if (Get.isDialogOpen == true) Get.back(); + Log.print("Error: $e"); + mySnackeBarError("Transaction failed, please try again.".tr); + } + } + + /// **التحقق من إنهاء الرحلة (Validate & Finish Ride)** + /// + /// تقوم هذه الدالة بحماية الرحلة من الإنهاء المبكر الخاطئ. + /// + /// **آلية العمل:** + /// 1. تحسب المسافة الخطية (Displacement) التي قطعها السائق بعيداً عن نقطة الانطلاق. + /// 2. تقارن هذه المسافة مع "عتبة دنيا" (Minimum Threshold) وهي (1/5) من إجمالي مسافة الرحلة. + /// 3. **إذا تحقق الشرط:** تظهر نافذة تأكيد الإنهاء وتستدعي [finishRideFromDriver1]. + /// 4. **إذا فشل الشرط:** تمنع الإنهاء وتصدر تنبيهاً صوتياً ونصياً بأن المسافة المقطوعة غير كافية. + /// **التحقق من إنهاء الرحلة (Validate & Finish Ride)** + /// + /// [isFromSlider]: إذا كانت القيمة true، فهذا يعني أن السائق سحب الشريط + /// وبالتالي هو موافق ضمنياً، فلا داعي لعرض ديالوج "هل أنت متأكد؟" + Future finishRideFromDriver({bool isFromSlider = false}) async { + // [Fix C-3] استخدام الدالة المساعدة المشتركة لتحليل المسافة + final double totalTripDistanceMeters = _parseDistanceToMeters(); + // 2. حساب المسافة المقطوعة + final double displacementMeters = Geolocator.distanceBetween( + latLngPassengerLocation.latitude, + latLngPassengerLocation.longitude, + Get.find().myLocation.latitude, + Get.find().myLocation.longitude, + ); + + // 3. تحديد الحد الأدنى (الخمس) + final double minimumDistanceThreshold = totalTripDistanceMeters / 5; + + Log.print('📏 Total Distance (m): $totalTripDistanceMeters'); + Log.print('🚗 Moved Displacement (m): $displacementMeters'); + + // 4. اتخاذ القرار + if (displacementMeters > minimumDistanceThreshold) { + // ✅ الحالة سليمة + + if (isFromSlider) { + // إذا جاء من السلايدر، نفذ فوراً + finishRideFromDriver1(); + } else { + // [Fix C-3 v2] بعد التأكيد، نمرّر isFromSlider=true لتجنب الديالوج المكرر + MyDialog().getDialog('Are you sure to exit ride?'.tr, '', () { + Get.back(); + finishRideFromDriver1(isFromSlider: true); + }); + } + } else { + // ❌ الحالة مرفوضة: المسافة غير كافية + final textToSpeechController = Get.put(TextToSpeechController()); + + // إظهار رسالة خطأ حتى لو سحب السلايدر + if (Get.isDialogOpen == true) Get.back(); // إغلاق أي ديالوج سابق + + MyDialog().getDialog( + "You haven't moved sufficiently!".tr, + "Please complete more distance before ending.".tr, + () => Get.back(), + ); + + await textToSpeechController.speakText( + "You haven't moved sufficiently!".tr, + ); + } + } + + String paymentToken = ''; + Future generateTokenDriver(String amount) async { + var res = await CRUD().postWallet( + link: AppLink.addPaymentTokenDriver, + payload: { + 'driverID': box.read(BoxName.driverID).toString(), + 'amount': amount.toString(), + }, + ); + var d = (res); + return d['message']; + } + + String paymentTokenPassenger = ''; + Future generateTokenPassenger(String amount) async { + var res = await CRUD().postWallet( + link: AppLink.addPaymentTokenPassenger, + payload: {'passengerId': passengerId, 'amount': amount.toString()}, + ); + var d = (res); + return d['message']; + } + + // ... other controller code ... + + /// **إنهاء الرحلة ومعالجة المدفوعات (Finish Ride & Process Payments)** + /// + /// تقوم هذه الدالة بإدارة عملية إنهاء الرحلة كاملة من جانب السائق. + /// + /// **آلية العمل:** + /// 1. **تحديث الواجهة:** تخفي نافذة السعر وتعرض مؤشر تحميل لمنع التكرار. + /// 2. **حساب التكلفة:** تحسب السعر النهائي بناءً على نوع السيارة والمسافة، مع مراعاة الحد الأدنى للأجور. + /// 3. **تجهيز البيانات:** تحضر البيانات اللازمة لتحديث حالة الرحلة (`rides`) وتسجيل الدفع (`payments`). + /// 4. **التنفيذ المتوازي (Parallel Execution):** تستخدم `Future.wait` لإرسال طلب التحديث وطلب الدفع في آن واحد للسيرفر لتقليل وقت الانتظار. + /// 5. **التحقق (Validation):** تتأكد من نجاح كلا العمليتين (التحديث والدفع) قبل الانتقال. + /// 6. **الختام:** في حال النجاح، تحذف البيانات المؤقتة وتوجه السائق لصفحة التقييم. في حال الفشل، تعيد حالة الواجهة ليتمكن السائق من المحاولة مجدداً. + /// **إنهاء الرحلة (Finish Ride)** + /// + /// التحسينات: + /// 1. التحقق من المسافة المقطوعة (Anti-Fraud). + /// 2. استخدام Future.wait لتنفيذ الطلبات بالتوازي (سرعة مضاعفة). + /// 3. استخدام `finally` لضمان إغلاق اللودينج دائماً. + Future finishRideFromDriver1({bool isFromSlider = false}) async { + // 1. التحقق الأمني: هل تحرك السائق فعلاً؟ + // (هذا الكود يجب أن يكون سريعاً ولا يعطل الواجهة) + if (!await _validateTripDistance(isFromSlider)) return; + + // 2. إظهار لودينج (Blocking) لمنع التكرار + Get.dialog( + const Center(child: CircularProgressIndicator()), + barrierDismissible: false, + ); + + try { + try { + final AudioRecorderController audioRecorderController = + _getAudioController(); + if (audioRecorderController.isRecording) { + await audioRecorderController.stopRecording(); + } + } catch (e) { + Log.print("Error stopping audio recording: $e"); + } + + // تحديث الحالة المحلية لمنع أي تفاعلات أخرى أثناء الطلب + isRideFinished = true; + isRideStarted = false; + isPriceWindow = false; + box.write(BoxName.rideStatus, 'Finished'); + box.write(BoxName.statusDriverLocation, 'off'); + box.remove(BoxName.passengerID); + box.remove(BoxName.rideId); + + // تجهيز البيانات الخام الموحدة للسيرفر ليقوم بمعالجة الدفع والإنهاء معاً بنظام المعاملة الواحدة + final finishPayload = { + 'rideId': rideId.toString(), + 'driver_id': box.read(BoxName.driverID).toString(), + 'passengerId': passengerId.toString(), + 'status': 'Finished', + 'actualDistance': distance.toString(), + 'actualDuration': duration.toString(), + 'walletChecked': walletChecked.toString(), + 'passengerWalletBurc': passengerWalletBurc.toString(), + 'passengerToken': tokenPassenger.toString(), + 'driver_token': box.read(BoxName.tokenDriver).toString(), + }; + + // إرسال طلب واحد موحد للسيرفر الرئيسي + final response = await CRUD().post( + link: "${AppLink.ride}/rides/finish_ride_updates.php", + payload: finishPayload, + ); + + if (response['status'] == 'success') { + // تنظيف البيانات محلياً عند النجاح الكامل + box.remove(BoxName.rideArguments); + box.remove(BoxName.rideArgumentsFromBackground); + box.remove('cached_trip_route'); + + // إغلاق اللودينج + if (Get.isDialogOpen == true) Get.back(); + + // إرسال تقرير السلوك (Fire and forget) + Get.put( + DriverBehaviorController(), + ).sendSummaryToServer(driverId, rideId); + + // الانتقال لصفحة التقييم بالسعر الذي حدده وحسبه السيرفر بأمان + Get.off( + () => RatePassenger(), + arguments: { + 'passengerId': passengerId, + 'rideId': rideId, + 'price': response['price']?.toString() ?? paymentAmount.toString(), + 'walletChecked': walletChecked.toString() ?? 'false', + }, + ); + } else { + throw Exception(response['error'] ?? "Unknown backend error"); + } + } catch (e) { + if (Get.isDialogOpen == true) Get.back(); // إغلاق اللودينج + Log.print("Error finishing ride: $e"); + mySnackeBarError("Failed to finish ride: $e"); + + // إعادة الحالة محلياً للسماح للمستخدم بالمحاولة مرة أخرى بأمان + isRideFinished = false; + isRideStarted = true; + box.write(BoxName.rideStatus, 'Begin'); + update(); // تحديث الشريط ليعود للوضع النشط + } + } + + // --- دوال مساعدة (Helpers) لتنظيف الكود --- + + Future _validateTripDistance(bool isFromSlider) async { + // [Fix C-3] استخدام الدالة المساعدة المشتركة لتحليل المسافة + final double totalTripDistanceMeters = _parseDistanceToMeters(); + + final double displacementMeters = Geolocator.distanceBetween( + latLngPassengerLocation.latitude, + latLngPassengerLocation.longitude, + Get.find().myLocation.latitude, + Get.find().myLocation.longitude, + ); + + final double minimumThreshold = totalTripDistanceMeters / 5; + + if (displacementMeters > minimumThreshold || isFromSlider) { + if (isFromSlider) return true; + + // [Fix C-2 v2] استخدام AlertDialog مباشرة مع حماية Deadlock + // إذا أغلق المستخدم الديالوج بالزر الخلفي، نُكمل بـ false + final completer = Completer(); + Get.dialog( + AlertDialog( + title: Text('Exit Ride?'.tr), + actions: [ + TextButton( + onPressed: () { + if (!completer.isCompleted) completer.complete(true); + Get.back(); + }, + child: Text('OK'.tr), + ), + ], + ), + barrierDismissible: true, + ).then((_) { + if (!completer.isCompleted) completer.complete(false); + }); + return await completer.future; + } else { + Get.find().speakText( + "You haven't moved sufficiently!".tr, + ); + MyDialog().getDialog( + "Warning".tr, + "You haven't moved sufficiently!".tr, + () => Get.back(), + ); + return false; + } + } + + void cancelCheckRideFromPassenger() async { + try { + var res = await CRUD().get( + link: "${AppLink.endPoint}/ride/driver_order/getOrderCancelStatus.php", + payload: {'order_id': (rideId)}, + ); + if (res == 'failure' || res.isEmpty) return; + var response = jsonDecode(res); + if (response == null || response['data'] == null) return; + canelString = response['data']['status']?.toString() ?? 'yet'; + update(); + if (canelString == 'Cancel') { + remainingTimeTimerRideBegin = 0; + remainingTimeToShowPassengerInfoWindowFromDriver = 0; + remainingTimeToPassenger = 0; + isRideStarted = false; + isRideFinished = false; + isPassengerInfoWindow = false; + clearPolyline(); + update(); + box.remove('cached_trip_route'); + MyDialog().getDialog( + 'Order Cancelled'.tr, + 'Order Cancelled by Passenger'.tr, + () { + Get.delete< + HomeCaptainController>(); // clear old controller to fix map generation + Get.offAll(HomeCaptain()); + }, + ); + } + } catch (e) { + Log.print("Error checking ride cancel status: $e"); + } + } + + int rideTimerFromBegin = 0; + double price = 0; + DateTime currentTime = DateTime.now(); + + /// أثناء الرحلة: نعرض السعر لحظياً بدون مضاعفة العمولة في كل ثانية. + /// - نستخدم سعر الدقيقة حسب الوقت، مع قواعد الرحلات البعيدة: + /// >25كم أو >35كم => دقيقة = 600، سقف 60 دقيقة، ومع >35كم عفو 10 دقائق. + /// - سرعة طويلة: لو المسافة المخططة > 40كم نستخدم 2600 ل.س/كم للـ Speed، + //// ونطبق نفس نسبة التخفيض على Comfort/Electric/Van. + /// - نضيف فقط "الزيادة" فوق التسعيرة المقتبسة (وقت زائد + كم زائد). + /// - نعكس العمولة kazán مرة واحدة على الزيادة (وليس كل ثانية). + + // ========================================================= + // الدالة الرئيسية المعدلة (العداد) + // ========================================================= + // متغيرات العداد الجديد + Timer? _rideTimer; + DateTime? _rideStartTime; + DateTime? get rideStartTime => _rideStartTime; // إضافة هذا السطر + double currentRideDistanceKm = 0.0; // لحساب المسافة + // متغيرات المراقبة + + // =========================================================================== + // 4. منطق العداد والتسعير (The Engine) + // =========================================================================== + + void rideIsBeginPassengerTimer() { + _rideTimer?.cancel(); + _rideStartTime = DateTime.now(); + currentRideDistanceKm = 0.0; + + // جلب الاعتماديات + final loc = Get.find(); + final hc = Get.find(); + + // إعداد متغيرات التسعير + final double perKmSpeedBase = hc.speedPrice; + final double perKmComfortRaw = hc.comfortPrice; + final double perKmDelivery = hc.deliveryPrice; + final double perKmVanRaw = hc.familyPrice; + const double electricUpliftKm = 400; + final double perKmElectricRaw = perKmComfortRaw + electricUpliftKm; + + final double perMinNature = hc.naturePrice; + final double perMinLate = hc.latePrice; + final double perMinHeavy = hc.heavyPrice; + + // القيم الأولية + final double basePassengerQuote = safeParseDouble(totalCost); + final int quotedMinutes = + safeParseInt(duration) != 0 ? safeParseInt(duration) : 20; + final double kazanPct = safeParseDouble(kazan) / 100.0; + + double plannedKm = safeParseDouble(distance); + final double startKm = loc.totalDistance / 1000; + if (plannedKm <= 0) plannedKm = (startKm > 0) ? startKm : 0.0; + + bool isAirport(String s) => + s.toLowerCase().contains('airport') || s.contains('مطار'); + final bool isAirportContext = + isAirport(startNameLocation ?? '') || isAirport(endNameLocation ?? ''); + + double lastKmForNoise = loc.totalDistance / 1000; + const double jitterKm = 0.01; // 10 متر = 0.01 كم [Fix M-1] + + _rideTimer = Timer.periodic(const Duration(seconds: 1), (timer) { + if (box.read(BoxName.rideStatus) != 'Begin') { + timer.cancel(); + return; + } + + try { + final now = DateTime.now(); + final int elapsedSeconds = now.difference(_rideStartTime!).inSeconds; + + // أ) حساب المسافة المقطوعة (Logic) + double currentTotalKm = loc.totalDistance / 1000; + double delta = currentTotalKm - lastKmForNoise; + + if (delta.abs() > jitterKm) { + currentRideDistanceKm += delta; + lastKmForNoise = currentTotalKm; + } + + // ب) حساب السعر (Brain) + price = _calculateCurrentPrice( + now: now, + elapsedSeconds: elapsedSeconds, + liveKm: currentRideDistanceKm, + plannedKm: plannedKm, + startKm: startKm, + quotedMinutes: quotedMinutes, + basePassengerQuote: basePassengerQuote, + kazanPct: kazanPct, + isAirportContext: isAirportContext, + perKmSpeedBase: perKmSpeedBase, + perKmComfortRaw: perKmComfortRaw, + perKmDelivery: perKmDelivery, + perKmVanRaw: perKmVanRaw, + perKmElectricRaw: perKmElectricRaw, + perMinNature: perMinNature, + perMinLate: perMinLate, + perMinHeavy: perMinHeavy, + ); + + // ج) تحديث واجهة المستخدم + stringRemainingTimeRideBegin = + "${currentRideDistanceKm.toStringAsFixed(2)} km"; + speed = loc.speed * 3.6; + + update(); // تحديث الشريط فقط + } catch (e) { + print("Timer Error: $e"); + } + }); + } + + double _calculateCurrentPrice({ + required DateTime now, + required int elapsedSeconds, + required double liveKm, + required double plannedKm, + required double startKm, + required int quotedMinutes, + required double basePassengerQuote, + required double kazanPct, + required bool isAirportContext, + required double perKmSpeedBase, + required double perKmComfortRaw, + required double perKmDelivery, + required double perKmVanRaw, + required double perKmElectricRaw, + required double perMinNature, + required double perMinLate, + required double perMinHeavy, + }) { + // 🛑 1. قاعدة السعر الثابت: تجميد السعر + if (carType == 'Speed' || + carType == 'Fixed Price' || + carType == 'Awfar Car') { + return basePassengerQuote; + } + + // 🟢 2. المنطق المتغير + const double longTripPerMin = 600.0; + + const double longDistThresholdKm = 35.0; + + // نسبة التخفيض + double reductionPct = 0.0; + if (liveKm > 40.0 && perKmComfortRaw > 0) { + double r40 = (1.0 - (2600.0 / (perKmComfortRaw * 1.2))).clamp(0.0, 0.35); + reductionPct = r40; + if (liveKm > 100.0) { + reductionPct = (r40 + 0.07).clamp(0.0, 0.35); + } + } + + // سعر الكيلومتر + double finalPerKmRate; + switch (carType) { + case 'Comfort': + case 'Mishwar Vip': + case 'Lady': + finalPerKmRate = perKmComfortRaw * (1.0 - reductionPct); + break; + case 'Electric': + finalPerKmRate = perKmElectricRaw * (1.0 - reductionPct); + break; + case 'Van': + finalPerKmRate = perKmVanRaw * (1.0 - reductionPct); + break; + case 'Delivery': + finalPerKmRate = perKmDelivery; + break; + default: + finalPerKmRate = perKmComfortRaw * (1.0 - reductionPct); + } + + // سعر الدقيقة + double perMinRate; + if (liveKm > longDistThresholdKm) { + perMinRate = longTripPerMin; + } else { + final h = now.hour; + if (isAirportContext || h >= 21 || h < 1) { + perMinRate = perMinLate; + } else if (h >= 14 && h <= 17) { + perMinRate = perMinHeavy; + } else { + perMinRate = perMinNature; + } + } + + // الفروقات + final int elapsedMinutes = (elapsedSeconds ~/ 60); + int extraMinutes = elapsedMinutes - quotedMinutes; + if (extraMinutes < 0) extraMinutes = 0; + + double liveCostCalculation = + (liveKm * finalPerKmRate) + (elapsedMinutes * perMinRate); + double totalLivePrice = liveCostCalculation * (1.0 + kazanPct); + + // القرار النهائي (الأعلى بين المتفق عليه والمحسوب) + return (totalLivePrice > basePassengerQuote) + ? totalLivePrice + : basePassengerQuote; + } + + double recentDistanceToDash = 0; + double recentAngelToMarker = 0; + double speed = 0; + void updateMarker() { + // 🔥 Car icon as a Map Marker — moves with GPS location on the map. + // MarkerId 'MyLocation' must match exactly with google_driver_map_page.dart. + markers.removeWhere((m) => m.markerId.value == 'MyLocation'); + final locCtrl = Get.find(); + myLocation = locCtrl.myLocation; + + markers.add( + Marker( + markerId: const MarkerId('MyLocation'), + position: myLocation, + icon: carIcon, + rotation: locCtrl.heading, + anchor: const Offset(0.5, 0.5), + flat: true, + zIndex: 100, + ), + ); + update(); + } + + void addCustomCarIcon() { + carIcon = InlqBitmap.fromAsset('assets/images/car.png'); + update(); + } + + void addCustomStartIcon() async { + startIcon = InlqBitmap.fromAsset('assets/images/A.png'); + update(); + } + + void addCustomEndIcon() { + endIcon = InlqBitmap.fromAsset('assets/images/b.png'); + update(); + } + + void addCustomPassengerIcon() { + passengerIcon = InlqBitmap.fromAsset('assets/images/picker.png'); + update(); + } + + var activeRouteSteps = >[]; + var traveledPathPoints = []; // المسار المقطوع (رمادي) + var upcomingPathPoints = []; // المسار المتبقي (أزرق/أحمر) + + // --- متغيرات الأيقونات والمواقع --- + var heading = 0.0; + // ... يمكنك إضافة أيقونات البداية والنهاية هنا + + // --- متغيرات الأداء --- + var updateInterval = 5.obs; // القيمة الافتراضية + + // --- متغيرات داخلية للملاحة --- + var _stepBounds = []; + var _stepEndPoints = []; + var _allPointsForActiveRoute = []; + bool _rayIntersectsSegment(LatLng point, LatLng vertex1, LatLng vertex2) { + double px = point.longitude; + double py = point.latitude; + + double v1x = vertex1.longitude; + double v1y = vertex1.latitude; + double v2x = vertex2.longitude; + double v2y = vertex2.latitude; + + // Check if the point is outside the vertical bounds of the segment + if ((py < v1y && py < v2y) || (py > v1y && py > v2y)) { + return false; + } + + // Calculate the intersection of the ray and the segment + double intersectX = v1x + (py - v1y) * (v2x - v1x) / (v2y - v1y); + + // Check if the intersection is to the right of the point + return intersectX > px; + } + + // Function to check if the point is inside the polygon + bool isPointInPolygon(LatLng point, List polygon) { + int intersections = 0; + for (int i = 0; i < polygon.length; i++) { + LatLng vertex1 = polygon[i]; + LatLng vertex2 = + polygon[(i + 1) % polygon.length]; // Loop back to the start + + if (_rayIntersectsSegment(point, vertex1, vertex2)) { + intersections++; + } + } + + // If the number of intersections is odd, the point is inside + return intersections % 2 != 0; + } + + String getLocationArea(double latitude, double longitude) { + LatLng passengerPoint = LatLng(latitude, longitude); + + // 1. فحص الأردن + if (isPointInPolygon(passengerPoint, CountryPolygons.jordanBoundary)) { + box.write(BoxName.countryCode, 'Jordan'); + update(); // [Fix N-5] + // box.write(BoxName.serverChosen, + // AppLink.IntaleqSyriaServer); // مثال: اختر سيرفر سوريا للبيانات + return 'Jordan'; + } + + // 2. فحص سوريا + if (isPointInPolygon(passengerPoint, CountryPolygons.syriaBoundary)) { + box.write(BoxName.countryCode, 'Syria'); + update(); // [Fix N-5] + return 'Syria'; + } + + // 3. فحص مصر + if (isPointInPolygon(passengerPoint, CountryPolygons.egyptBoundary)) { + box.write(BoxName.countryCode, 'Egypt'); + update(); // [Fix N-5] + return 'Egypt'; + } + + // 4. الافتراضي (إذا كان خارج المناطق المخدومة) + box.write(BoxName.countryCode, 'Jordan'); + update(); // [Fix N-5] + return 'Unknown Location (Defaulting to Jordan)'; + } + + /// **جلب ورسم المسار (OSRM - New Standard System)** + /// + /// تستخدم السيرفر الجديد: https://routesy.intaleq.xyz/route/v1/driving + Future getRoute({ + required LatLng origin, + required LatLng destination, + required Color routeColor, + String? cachedResponse, + }) async { + if (mapController == null) return; + + try { + dynamic response; + + if (cachedResponse != null && cachedResponse.isNotEmpty) { + response = jsonDecode(cachedResponse); + Log.print("✅ Using cached route response to save API calls"); + } else { + // 1. طلب المسار من السيرفر الموحد (SaaS) لضمان الدقة وتفادي الـ 401 + final saasUrl = Uri.parse(AppLink.mapSaasRoute).replace( + queryParameters: { + 'fromLat': origin.latitude.toString(), + 'fromLng': origin.longitude.toString(), + 'toLat': destination.latitude.toString(), + 'toLng': destination.longitude.toString(), + 'steps': 'true', // نحتاجها للملاحة والتوجيه + 'alternatives': 'false', + 'locale': 'ar', + }, + ); + + final httpResponse = await http.get( + saasUrl, + headers: { + 'x-api-key': Env.mapSaasKey, + 'Content-Type': 'application/json', + }, + ); + + if (httpResponse.statusCode != 200) { + throw Exception("Routing request failed: ${httpResponse.statusCode}"); + } + + response = jsonDecode(httpResponse.body); + } + + // 2. التعامل مع الـ JSON المباشر (الذي أرسله المستخدم) + // إذا كان الـ response يحتوي على الحقول مباشرة في الجذر + final String? encodedPoints = response['points']; + + if (encodedPoints == null) { + mySnackeBarError("No route points found".tr); + return; + } + + // 🔥 فك التشفير باستخدام compute لضمان أداء ممتاز + List fullRoute = await compute( + PolylineUtils.decode, + encodedPoints, + ); + + if (fullRoute.isEmpty) { + mySnackeBarError("Failed to process route points".tr); + return; + } + + // تحديث المسافة والوقت من الـ JSON الجديد + distance = (response['distance'] ?? 0).toString(); + duration = (response['duration'] ?? 0).toString(); + + // ب) تهيئة المتغيرات + upcomingPathPoints.assignAll(fullRoute); + traveledPathPoints.clear(); + _lastTraveledIndex = 0; + + // ج) رسم المسار الأولي + polyLines.clear(); + polyLines.add( + Polyline( + polylineId: const PolylineId("upcoming_route"), + points: fullRoute, + width: 8, + color: routeColor, + ), + ); + + // د) معالجة الخطوات (Instructions) للسيرفر الموحد + final List instructions = response['instructions'] ?? []; + if (instructions.isNotEmpty) { + routeSteps = List>.from( + instructions.map((e) { + int endIdx = (e['interval'] as List)[1]; + // التأكد من أن الـ index لا يتجاوز طول المسار + if (endIdx >= fullRoute.length) endIdx = fullRoute.length - 1; + + return { + 'html_instructions': e['text'] ?? "", + 'sign': e['sign'] ?? 0, + 'end_location': { + 'lat': fullRoute[endIdx].latitude, + 'lng': fullRoute[endIdx].longitude, + }, + }; + }), + ); + + currentStepIndex = 0; + currentInstruction = routeSteps[0]['html_instructions']; + currentManeuverModifier = routeSteps[0]['sign']; + _nextInstructionSpoken = false; + + if (Get.isRegistered() && isTtsEnabled) { + Get.find().speakText(currentInstruction); + } + } else { + routeSteps = []; + currentInstruction = ""; + currentManeuverModifier = 0; + } + + // هـ) تحريك الكاميرا لتشمل المسار أو الدخول في وضع الملاحة + if (isRideStarted) { + final locCtrl = Get.find(); + safeAnimateCamera( + CameraUpdate.newCameraPosition( + CameraPosition( + target: origin, + zoom: 17.5, + bearing: locCtrl.heading, + tilt: 60, + ), + ), + ); + } else if (fullRoute.isNotEmpty) { + final bounds = _boundsFromLatLngList(fullRoute); + final double distOriginDest = Geolocator.distanceBetween( + origin.latitude, + origin.longitude, + destination.latitude, + destination.longitude, + ); + // When driver & passenger are on the same device, the + // C++ map engine crashes with std::domain_error because + // bounds have near-zero span. Show a dialog to inform + // the driver, then use a padded safe zoom instead. + // 🔥 [Fix Dialog] لا تُظهر التحذير إذا كانت الرحلة قد بدأت (isRideStarted) + // لأن عند بدء الرحلة، origin=موقع السائق و destination=وجهة الراكب + // وقد تكون بعيدة جداً — التحذير لا معنى له هنا + if (distOriginDest < 10 && !isRideStarted) { + _showSameDeviceWarning(); + safeAnimateCamera( + CameraUpdate.newLatLngZoom( + LatLng( + (origin.latitude + destination.latitude) / 2, + (origin.longitude + destination.longitude) / 2, + ), + 17, + ), + ); + } else if (distOriginDest < 10 && isRideStarted) { + // نفس الجهاز لكن الرحلة بدأت — فقط zoom بدون تحذير + safeAnimateCamera( + CameraUpdate.newLatLngZoom( + LatLng( + (origin.latitude + destination.latitude) / 2, + (origin.longitude + destination.longitude) / 2, + ), + 15, + ), + ); + } else { + safeAnimateCamera( + CameraUpdate.newLatLngBounds( + bounds, + left: 80, + top: 80, + right: 80, + bottom: 80, + ), + ); + } + } + + update(); + } catch (e) { + Log.print("Route Error: $e"); + } + } + + LatLngBounds _boundsFromLatLngList(List list) { + assert(list.isNotEmpty); + double? x0, x1, y0, y1; + for (LatLng latLng in list) { + if (x0 == null) { + x0 = x1 = latLng.latitude; + y0 = y1 = latLng.longitude; + } else { + if (latLng.latitude > x1!) x1 = latLng.latitude; + if (latLng.latitude < x0) x0 = latLng.latitude; + if (latLng.longitude > y1!) y1 = latLng.longitude; + if (latLng.longitude < y0!) y0 = latLng.longitude; + } + } + // Guard against zero-span bounds which crash the native C++ map engine + // with std::domain_error when passed to CameraUpdate.newLatLngBounds. + double latSpan = (x1! - x0!).abs(); + double lngSpan = (y1! - y0!).abs(); + const double minSpan = 0.002; // ~220 m at equator + if (latSpan < minSpan) { + final double pad = (minSpan - latSpan) / 2; + x0 = x0! - pad; + x1 = x1! + pad; + } + if (lngSpan < minSpan) { + final double pad = (minSpan - lngSpan) / 2; + y0 = y0! - pad; + y1 = y1! + pad; + } + return LatLngBounds( + northeast: LatLng(x1!, y1!), + southwest: LatLng(x0!, y0!), + ); + } + + // داخل MapDriverController + + Future markDriverAsArrived() async { + // 1. إظهار لودينج فوراً لمنع التكرار وإشعار السائق + Get.dialog( + const Center(child: CircularProgressIndicator(color: AppColor.gold)), + barrierDismissible: false, + ); + + try { + // [Fix M-2] تغيير اسم المتغير المحلي لتجنب Variable Shadowing مع distance العام + double distToPassenger = + await calculateDistanceBetweenDriverAndPassengerLocation(); + + if (distToPassenger < 100) { + // 2. طلب الـ API مع مهلة 15 ثانية كأمان + await CRUD().post( + link: "${AppLink.ride}/rides/arrive_ride.php", + payload: { + "ride_id": rideId, + "driver_id": box.read(BoxName.driverID), + "passengerToken": tokenPassenger, + }, + ).timeout(const Duration(seconds: 15)); + + // 3. إغلاق اللودينج وتحديث الواجهة + if (Get.isDialogOpen == true) Get.back(); + + // منطق بدء العداد + startTimerToShowDriverWaitPassengerDuration(); + isArrivedSend = false; + + // تحديث فقط الجزء الخاص بمعلومات الراكب + update(); + + // رسم المسار للوجهة + getRoute( + origin: latLngPassengerLocation, + destination: latLngPassengerDestination, + routeColor: Colors.blue, + ); + } else { + if (Get.isDialogOpen == true) Get.back(); + mySnackeBarError("You must be closer than 100 meters to arrive".tr); + } + } catch (e) { + if (Get.isDialogOpen == true) Get.back(); + mySnackeBarError("A connection error occurred".tr); + } + } + + // [Fix P-3] _suggestOptimization() أزيلت — كانت ميتة ولا يستدعيها أحد + + // ================================================================= + // 5. دوال مساعدة (Helper Functions) + // ================================================================= + + String _parseInstruction(String html) => + html.replaceAll(RegExp(r'<[^>]*>'), ''); + + /// Show a warning dialog when the driver and passenger are on the + /// same device (distance < 10 m) — the C++ map engine would crash with + /// std::domain_error if we tried to fit zero-span bounds. + void _showSameDeviceWarning() { + Get.dialog( + AlertDialog( + icon: const Icon(Icons.warning_amber_rounded, + color: Colors.orange, size: 48), + title: Text("Same device detected".tr), + content: Text( + "The rider and driver locations are very close (possibly on the same phone). " + "The map will show an approximate view." + .tr, + ), + actions: [ + TextButton( + onPressed: () => Get.back(), + child: Text("OK".tr), + ), + ], + ), + ); + } + + Future _fitToBounds(LatLngBounds b, {double padding = 60}) async { + // Guard against zero-span bounds (crashes native C++ engine) + final double latSpan = (b.northeast.latitude - b.southwest.latitude).abs(); + final double lngSpan = + (b.northeast.longitude - b.southwest.longitude).abs(); + if (latSpan < 0.002 && lngSpan < 0.002) { + // Bounds are a single point — zoom instead of fit + await safeAnimateCamera( + CameraUpdate.newLatLngZoom(b.northeast, 16), + ); + return; + } + await safeAnimateCamera( + CameraUpdate.newLatLngBounds( + b, + left: padding, + top: padding, + right: padding, + bottom: padding, + ), + ); + } + + double distanceBetweenDriverAndPassengerWhenConfirm = 0; + + /// [Fix M-4] هذه الدالة مكررة مع _checkNavigationStep(). + /// نحتفظ بها للاستدعاء الخارجي (startListeningStepNavigation) ولكن logica مدمج. + void checkForNextStep(LatLng currentPosition) { + _checkNavigationStep(currentPosition); + } + + /// Calculates the distance in meters between two latitude/longitude points. + double calculateDistance(double lat1, double lon1, double lat2, double lon2) { + const double earthRadius = 6371000; // meters + double dLat = _degreesToRadians(lat2 - lat1); + double dLon = _degreesToRadians(lon2 - lon1); + + double a = (sin(dLat / 2) * sin(dLat / 2)) + + cos(_degreesToRadians(lat1)) * + cos(_degreesToRadians(lat2)) * + (sin(dLon / 2) * sin(dLon / 2)); + double c = 2 * atan2(sqrt(a), sqrt(1 - a)); + double distance = earthRadius * c; + return distance; + } + + double _degreesToRadians(double degrees) { + return degrees * (3.1415926535897932 / 180.0); + } + + bool isNearDestinationNotified = false; + + // فحص الوصول للوجهة للإشعارات + void checkDestinationProximity() { + if (isNearDestinationNotified) return; + if (myLocation.latitude == 0 || + myLocation.longitude == 0 || + latLngPassengerDestination.latitude == 0 || + latLngPassengerDestination.longitude == 0) return; + + double dist = Geolocator.distanceBetween( + myLocation.latitude, + myLocation.longitude, + latLngPassengerDestination.latitude, + latLngPassengerDestination.longitude, + ); + + if (dist < 300) { + isNearDestinationNotified = true; + NotificationService.sendNotification( + target: tokenPassenger.toString(), + title: "You are near the destination".tr, + body: "The driver is approaching.".tr, + isTopic: false, + tone: 'ding', + driverList: [], + category: "Destination Proximity", + ); + } + } + + List stepBounds = []; + List stepEndPoints = []; + List stepInstructions = []; + StreamSubscription? _posSub; + DateTime _lastCameraUpdateTs = DateTime.fromMillisecondsSinceEpoch(0); + + LatLngBounds _boundsFromPoints(List pts) { + double? minLat, maxLat, minLng, maxLng; + for (final p in pts) { + minLat = (minLat == null) ? p.latitude : math.min(minLat, p.latitude); + maxLat = (maxLat == null) ? p.latitude : math.max(maxLat, p.latitude); + minLng = (minLng == null) ? p.longitude : math.min(minLng, p.longitude); + maxLng = (maxLng == null) ? p.longitude : math.max(maxLng, p.longitude); + } + return LatLngBounds( + southwest: LatLng(minLat ?? 0, minLng ?? 0), + northeast: LatLng(maxLat ?? 0, maxLng ?? 0), + ); + } + + double _distanceMeters(LatLng a, LatLng b) { + // هافرساين مبسطة + const R = 6371000.0; // m + final dLat = _deg2rad(b.latitude - a.latitude); + final dLng = _deg2rad(b.longitude - a.longitude); + final s1 = math.sin(dLat / 2); + final s2 = math.sin(dLng / 2); + final aa = s1 * s1 + + math.cos(_deg2rad(a.latitude)) * + math.cos(_deg2rad(b.latitude)) * + s2 * + s2; + final c = 2 * math.atan2(math.sqrt(aa), math.sqrt(1 - aa)); + return R * c; + } + + double _deg2rad(double d) => d * math.pi / 180.0; + + void updateCameraFromBoundsAfterGetMap(dynamic response) { + final bounds = response["routes"][0]["bounds"]; + LatLng northeast = LatLng( + bounds['northeast']['lat'], + bounds['northeast']['lng'], + ); + LatLng southwest = LatLng( + bounds['southwest']['lat'], + bounds['southwest']['lng'], + ); + + // Create the LatLngBounds object + LatLngBounds boundsData = LatLngBounds( + northeast: northeast, + southwest: southwest, + ); + + // Fit the camera to the bounds + var cameraUpdate = CameraUpdate.newLatLngBounds( + boundsData, + left: 140, + top: 140, + right: 140, + bottom: 140, + ); + safeAnimateCamera(cameraUpdate); + } + + void changePassengerInfoWindow() { + isPassengerInfoWindow = !isPassengerInfoWindow; + passengerInfoWindowHeight = isPassengerInfoWindow == true ? 200 : 0; + update(); + } + + double mpg = 0; + calculateConsumptionFuel() { + mpg = Get.find().fuelPrice / + 12; //todo in register car add mpg in box + update(); + } + + argumentLoading() async { + // 🔥 [Fix Double-Init] منع التنفيذ المتزامن (onInit + postFrameCallback) + if (_argumentLoadingInProgress) { + Log.print( + "⏳ argumentLoading: Already in progress, skipping concurrent call."); + return; + } + + // 🔥 Debounce: منع التنفيذ المتكرر السريع من build() callbacks + // نسمح بإعادة التنفيذ فقط بعد مرور 5 ثوانٍ من آخر تنفيذ ناجح + // (هذا يمنع الـ rapid rebuilds لكن يسمح بالعودة للرحلة من الهوم) + if (_lastArgumentLoadingTime != null) { + final elapsed = DateTime.now().difference(_lastArgumentLoadingTime!); + if (elapsed.inSeconds < 5) { + Log.print( + "⏭️ argumentLoading: Debounced (${elapsed.inMilliseconds}ms < 5000ms). Skipping."); + return; + } + } + + _argumentLoadingInProgress = true; + + // 🔥 إعادة تعيين flag المسار عند كل استدعاء لاحق + // (ضروري للعودة للرحلة من صفحة الهوم) + _isRouteRequested = false; + + // 🛑 حماية: إذا لم تكن هناك arguments، لا تكمل + if (Get.arguments == null || Get.arguments is! Map) { + Log.print("❌ argumentLoading: No valid arguments found. Aborting."); + _argumentLoadingInProgress = false; + return; + } + try { + passengerLocation = Get.arguments['passengerLocation']?.toString() ?? ''; + passengerDestination = + Get.arguments['passengerDestination']?.toString() ?? ''; + duration = Get.arguments['Duration']?.toString() ?? ''; + totalCost = Get.arguments['totalCost']?.toString() ?? ''; + passengerId = Get.arguments['passengerId']?.toString() ?? ''; + driverId = Get.arguments['driverId']?.toString() ?? ''; + distance = Get.arguments['Distance']?.toString() ?? '0'; + passengerName = Get.arguments['name']?.toString(); + passengerEmail = Get.arguments['email']?.toString() ?? ''; + totalPricePassenger = Get.arguments['totalPassenger']?.toString() ?? ''; + passengerPhone = Get.arguments['phone']?.toString() ?? ''; + walletChecked = Get.arguments['WalletChecked']?.toString() ?? ''; + tokenPassenger = Get.arguments['tokenPassenger']?.toString() ?? ''; + direction = Get.arguments['direction']?.toString() ?? ''; + durationToPassenger = + Get.arguments['DurationToPassenger']?.toString() ?? '100'; + rideId = Get.arguments['rideId']?.toString() ?? ''; + durationOfRideValue = + Get.arguments['durationOfRideValue']?.toString() ?? ''; + paymentAmount = Get.arguments['paymentAmount']?.toString() ?? '0'; + paymentMethod = Get.arguments['paymentMethod']?.toString() ?? ''; + + // 🔥 حفظ البيانات في الذاكرة المحلية فوراً (لفصل السوكيت عن الكنترولر) + box.write(BoxName.passengerID, passengerId.toString()); + box.write(BoxName.rideId, rideId.toString()); + // Also save full args for return-to-ride scenarios + box.write(BoxName.rideArguments, Get.arguments); + isHaveSteps = Get.arguments['isHaveSteps']?.toString() ?? 'false'; + // [Fix N-4] ملء القائمة بدلاً من 5 متغيرات منفصلة + steps = List.generate(5, (i) { + return Get.arguments['step$i']?.toString() ?? ''; + }); + passengerWalletBurc = + Get.arguments['passengerWalletBurc']?.toString() ?? ''; + timeOfOrder = Get.arguments['timeOfOrder']?.toString() ?? ''; + carType = Get.arguments['carType']?.toString() ?? ''; + kazan = Get.arguments['kazan']?.toString() ?? ''; + startNameLocation = Get.arguments['startNameLocation']?.toString() ?? ''; + endNameLocation = Get.arguments['endNameLocation']?.toString() ?? ''; + + // Parse to double + latlng(passengerLocation, passengerDestination); + + String lat = + Get.find().myLocation.latitude.toString(); + String lng = + Get.find().myLocation.longitude.toString(); + + // Check which route to draw based on current ride status + String currentStatus = box.read(BoxName.rideStatus) ?? ''; + + // [Fix 5] إضافة await لضمان أن التأخير يعمل فعلاً قبل رسم المسار. + await Future.delayed(const Duration(seconds: 1)); + + // 🔥 [Fix Return-to-Ride] تعيين isRideStarted قبل getRoute لمنع onMapCreated + // من رسم المسار الأصفر (للراكب) بدلاً من الأزرق (للوجهة) + if (currentStatus == 'Begin') { + isRideStarted = true; + isRideBegin = true; + isPassengerInfoWindow = false; + } + + if (currentStatus == 'Begin' && + latLngPassengerDestination.latitude != 0 && + latLngPassengerDestination.longitude != 0) { + // Ride already started — draw blue route to destination + await getRoute( + origin: Get.find().myLocation, + destination: latLngPassengerDestination, + routeColor: Colors.blue, + ); + + // 🔥 [Fix Return-to-Ride] إعادة تشغيل الخدمات المفقودة عند العودة للرحلة + // بدون هذا الاستدعاء، يُرسم المسار لكن: + // - عداد السعر (_rideTimer) لا يعمل + // - الملاحة (_navigationTimer) لا تعمل + // - الماركر لا يتحرك + if (_rideTimer == null || !_rideTimer!.isActive) { + rideIsBeginPassengerTimer(); + } + await startListeningStepNavigation(); + } else { + // Ride not yet started — draw yellow route to passenger + await getRoute( + origin: Get.find().myLocation, + destination: latLngPassengerLocation, + routeColor: Colors.yellow, + ); + // 🔥 بدء الملاحة بعد تحميل المسار (تتبع حركة السائق نحو الراكب) + if (_navigationTimer == null || !_navigationTimer!.isActive) { + startListeningStepNavigation(); + } + } + _isRouteRequested = true; + update(); + } catch (e) { + Log.print("Error parsing arguments: $e"); + } finally { + // 🔥 [Fix Double-Init] دائماً إعادة تعيين الـ flag عند الانتهاء + _argumentLoadingInProgress = false; + // سجّل وقت الانتهاء للـ debounce + _lastArgumentLoadingTime = DateTime.now(); + } + } + + void latlng(String passengerLocation, String passengerDestination) { + try { + // ── مكان الراكب ────────────────────────────────────────────────── + final List locParts = passengerLocation.split(','); + double latPassengerLocation = locParts.length >= 1 + ? (double.tryParse(locParts[0].trim()) ?? 0.0) + : 0.0; + double lngPassengerLocation = locParts.length >= 2 + ? (double.tryParse(locParts[1].trim()) ?? 0.0) + : 0.0; + + // ── وجهة الراكب ───────────────────────────────────────────────── + final List destParts = passengerDestination.split(','); + double latPassengerDestination = destParts.length >= 1 + ? (double.tryParse(destParts[0].trim()) ?? 0.0) + : 0.0; + double lngPassengerDestination = destParts.length >= 2 + ? (double.tryParse(destParts[1].trim()) ?? 0.0) + : 0.0; + + latLngPassengerLocation = LatLng( + latPassengerLocation, + lngPassengerLocation, + ); + latLngPassengerDestination = LatLng( + latPassengerDestination, + lngPassengerDestination, + ); + + Log.print( + "📍 latlng() parsed => Pax: ($latPassengerLocation, $lngPassengerLocation) | Dest: ($latPassengerDestination, $lngPassengerDestination)"); + } catch (e, stack) { + Log.print("❌ latlng() FormatException prevented: $e"); + Log.print("Stack: $stack"); + // قيم افتراضية آمنة لمنع الكراش + latLngPassengerLocation = LatLng(0, 0); + latLngPassengerDestination = LatLng(0, 0); + } + } + + Duration durationToAdd = Duration.zero; + int hours = 0; + int minutes = 0; + String carType = ''; + String kazan = ''; + String startNameLocation = ''; + String endNameLocation = ''; + + Future runGoogleMapDirectly() async { + if (box.read(BoxName.googlaMapApp) == true) { + if (Platform.isAndroid) { + Bubble().startBubbleHead(sendAppToBackground: true); + } + await openGoogleMapFromDriverToPassenger(); + } + } + + @override + void onInit() async { + mapAPIKEY = await storage.read(key: BoxName.mapAPIKEY); + await argumentLoading(); + Get.put(FirebaseMessagesController()); + runGoogleMapDirectly(); + addCustomCarIcon(); + addCustomPassengerIcon(); + addCustomStartIcon(); + addCustomEndIcon(); + + if (!Get.isRegistered()) { + Get.put(TextToSpeechController(), permanent: true); + } + + _animController = AnimationController( + vsync: this, + duration: const Duration(milliseconds: 1000), + ); + _animController!.addListener(() { + if (_oldLoc != null && _targetLoc != null) { + final t = _animController!.value; + final lat = lerpDouble(_oldLoc!.latitude, _targetLoc!.latitude, t)!; + final lng = lerpDouble(_oldLoc!.longitude, _targetLoc!.longitude, t)!; + smoothedLocation = LatLng(lat, lng); + smoothedHeading = _lerpAngle(_oldHeading, _targetHeading, t); + update(); + } + }); + + _startLocationListening(); + + startTimerToShowPassengerInfoWindowFromDriver(); + durationToAdd = Duration(seconds: parseDurationToInt(duration)); + hours = durationToAdd.inHours; + minutes = (durationToAdd.inMinutes % 60).round(); + calculateConsumptionFuel(); + super.onInit(); + } + + void _startLocationListening() { + _locationSubscription?.cancel(); + _locationSubscription = geo.Geolocator.getPositionStream( + locationSettings: const geo.LocationSettings( + accuracy: geo.LocationAccuracy.bestForNavigation, + distanceFilter: 2, + ), + ).listen((geo.Position pos) { + _handleLocationUpdate(pos); + }); + } + + /// [Fix C-4] تحديث myLocation في المستمع الأساسي + void _handleLocationUpdate(geo.Position pos) { + final newLoc = LatLng(pos.latitude, pos.longitude); + myLocation = newLoc; // ← [Fix C-4] تحديث الموقع الفوري + _oldLoc = smoothedLocation ?? newLoc; + _targetLoc = newLoc; + + _oldHeading = smoothedHeading; + if (pos.speed > 0.5) { + _targetHeading = pos.heading; + } else { + _targetHeading = _oldHeading; + } + + _animController?.forward(from: 0.0); + + if (routeSteps.isNotEmpty) { + _checkNavigationStep(newLoc); + } + } + + double _lerpAngle(double from, double to, double t) { + final double diff = ((to - from + 540.0) % 360.0) - 180.0; + return (from + diff * t + 360.0) % 360.0; + } + + void _checkNavigationStep(LatLng pos) { + if (routeSteps.isEmpty || currentStepIndex >= routeSteps.length) return; + + final step = routeSteps[currentStepIndex]; + final stepLoc = step['end_location']; + if (stepLoc == null) return; + + final double stepLat = stepLoc['lat']; + final double stepLng = stepLoc['lng']; + + final distance = geo.Geolocator.distanceBetween( + pos.latitude, + pos.longitude, + stepLat, + stepLng, + ); + + distanceToNextStep = distance > 1000 + ? "${(distance / 1000).toStringAsFixed(1)} km" + : "${distance.toStringAsFixed(0)} m"; + + if (distance < 50 && + !_nextInstructionSpoken && + (currentStepIndex + 1) < routeSteps.length) { + final nextText = + routeSteps[currentStepIndex + 1]['html_instructions'] ?? ""; + if (isTtsEnabled) { + Get.find().speakText(nextText); + } + _nextInstructionSpoken = true; + } + + if (distance < 25) { + _advanceStep(); + } + update(); + } + + IconData get currentManeuverIcon { + switch (currentManeuverModifier) { + case 4: // Arrive + return Icons.place_rounded; + case 6: // Roundabout + return Icons.roundabout_right_rounded; + case 2: // Right + return Icons.turn_right_rounded; + case 3: // Slight Right + return Icons.turn_slight_right_rounded; + case -2: // Left + return Icons.turn_left_rounded; + case -1: // Slight Left + return Icons.turn_slight_left_rounded; + case 7: // Keep Right + return Icons.turn_right_rounded; + case -7: // Keep Left + return Icons.turn_left_rounded; + case 0: // Straight + return Icons.straight_rounded; + default: + return Icons.straight_rounded; + } + } + + void _advanceStep() { + currentStepIndex++; + if (currentStepIndex < routeSteps.length) { + currentInstruction = + routeSteps[currentStepIndex]['html_instructions'] ?? ""; + currentManeuverModifier = routeSteps[currentStepIndex]['sign'] ?? 0; + _nextInstructionSpoken = false; + } + } + + int parseDurationToInt(dynamic value) { + if (value == null) return 0; + String text = value.toString(); + // حذف كل شيء ما عدا الأرقام (الإنجليزية) + String digits = text.replaceAll(RegExp(r'[^0-9]'), ''); + if (digits.isEmpty) return 0; + return int.tryParse(digits) ?? 0; + } + + Timer? _navigationTimer; + // أضف هذا المتغير في الكلاس + LatLng? _lastRecordedLocation; + + // [Fix M-4] تم إزالة الكود المعلّق القديم لـ startListeningStepNavigation + + void _animateCameraToNavigationMode(LatLng target, double bearing) { + mapController?.animateCamera( + CameraUpdate.newCameraPosition( + CameraPosition( + target: target, + bearing: bearing, + tilt: 45.0, // منظور ثلاثي الأبعاد (3D Perspective) + zoom: 18.0, // تقريب للملاحة + ), + ), + ); + } + + // متغير لتتبع آخر نقطة وصلنا لها + int _lastTraveledIndex = 0; + + // تحديث المسار الذكي + void _updateTraveledPolylineSmart(LatLng currentPos) { + if (upcomingPathPoints.isEmpty) return; + + // Bidirectional Sliding Window: نبحث 30 نقطة للخلف و30 نقطة للأمام لدعم الرجوع أو اتخاذ مسارات بديلة + int searchWindow = 60; + int halfWindow = searchWindow ~/ 2; + int startIndex = max(0, _lastTraveledIndex - halfWindow); + int endIndex = + min(_lastTraveledIndex + halfWindow, upcomingPathPoints.length); + + double minDistance = double.infinity; + int closestIndex = _lastTraveledIndex; + bool foundCloser = false; + + for (int i = startIndex; i < endIndex; i++) { + final point = upcomingPathPoints[i]; + final dist = Geolocator.distanceBetween( + currentPos.latitude, + currentPos.longitude, + point.latitude, + point.longitude, + ); + if (dist < minDistance) { + minDistance = dist; + closestIndex = i; + foundCloser = true; + } + } + + if (foundCloser && minDistance < 50 && closestIndex != _lastTraveledIndex) { + _lastTraveledIndex = closestIndex; + + final remaining = upcomingPathPoints.sublist(_lastTraveledIndex); + final traveled = upcomingPathPoints.sublist(0, _lastTraveledIndex + 1); + + polyLines.removeWhere((p) => p.polylineId.value == 'upcoming_route'); + polyLines.removeWhere((p) => p.polylineId.value == 'traveled_route'); + + // المسار المتبقي + polyLines.add( + Polyline( + polylineId: const PolylineId("upcoming_route"), + points: remaining, + width: 8, + color: isRideStarted ? Colors.blue : Colors.yellow, + ), + ); + + // المسار المقطوع (رمادي) + polyLines.add( + Polyline( + polylineId: const PolylineId('traveled_route'), + points: traveled, + color: Colors.grey.withValues(alpha: 0.8), + width: 7, + zIndex: 1, + ), + ); + + update(); + } + } + + void stopListeningStepNavigation() { + _posSub?.cancel(); + _posSub = null; + // [Fix 1] إعادة تشغيل المستمع الأساسي للحركة السلسة بعد إيقاف الملاحة. + _startLocationListening(); + } +} + +double safeParseDouble(dynamic value, {double defaultValue = 0.0}) { + if (value == null) return defaultValue; + if (value is double) return value; + if (value is int) return value.toDouble(); + return double.tryParse(value.toString()) ?? defaultValue; +} + +int safeParseInt(dynamic value, {int defaultValue = 0}) { + if (value == null) return defaultValue; + if (value is int) return value; + return int.tryParse(value.toString()) ?? defaultValue; +} diff --git a/siro_driver/lib/controller/home/captin/model.dart b/siro_driver/lib/controller/home/captin/model.dart new file mode 100644 index 0000000..6c2f09f --- /dev/null +++ b/siro_driver/lib/controller/home/captin/model.dart @@ -0,0 +1,86 @@ +import 'package:flutter/material.dart'; +import 'package:intaleq_maps/intaleq_maps.dart'; + +class NavigationStep { + final String instruction; + final String maneuver; + final double distance; + final String duration; + final LatLng startLocation; + final LatLng endLocation; + final String htmlInstructions; + + NavigationStep({ + required this.instruction, + required this.maneuver, + required this.distance, + required this.duration, + required this.startLocation, + required this.endLocation, + required this.htmlInstructions, + }); + + factory NavigationStep.fromJson(Map json) { + return NavigationStep( + instruction: json['html_instructions'] ?? '', + maneuver: json['maneuver'] ?? 'straight', + distance: (json['distance']['value'] ?? 0).toDouble(), + duration: json['duration']['text'] ?? '', + startLocation: LatLng( + json['start_location']['lat'].toDouble(), + json['start_location']['lng'].toDouble(), + ), + endLocation: LatLng( + json['end_location']['lat'].toDouble(), + json['end_location']['lng'].toDouble(), + ), + htmlInstructions: json['html_instructions'] ?? '', + ); + } + + // Get clean instruction text (remove HTML tags) + String get cleanInstruction { + return instruction + .replaceAll(RegExp(r'<[^>]*>'), '') + .replaceAll(' ', ' '); + } + + // Get instruction icon based on maneuver + IconData get instructionIcon { + switch (maneuver.toLowerCase()) { + case 'turn-left': + return Icons.turn_left; + case 'turn-right': + return Icons.turn_right; + case 'turn-slight-left': + return Icons.turn_slight_left; + case 'turn-slight-right': + return Icons.turn_slight_right; + case 'turn-sharp-left': + return Icons.turn_sharp_left; + case 'turn-sharp-right': + return Icons.turn_sharp_right; + case 'uturn-left': + case 'uturn-right': + return Icons.u_turn_left; + case 'straight': + return Icons.straight; + case 'ramp-left': + return Icons.ramp_left; + case 'ramp-right': + return Icons.ramp_right; + case 'merge': + return Icons.merge; + case 'fork-left': + case 'fork-right': + return Icons.call_split; + case 'ferry': + return Icons.directions_boat; + case 'roundabout-left': + case 'roundabout-right': + return Icons.roundabout_left; + default: + return Icons.navigation; + } + } +} diff --git a/siro_driver/lib/controller/home/captin/navigation_service.dart b/siro_driver/lib/controller/home/captin/navigation_service.dart new file mode 100644 index 0000000..2a3b9af --- /dev/null +++ b/siro_driver/lib/controller/home/captin/navigation_service.dart @@ -0,0 +1,101 @@ +import 'package:flutter/material.dart'; +import 'package:get/get.dart'; +import 'package:intaleq_maps/intaleq_maps.dart'; +import 'package:siro_driver/constant/api_key.dart'; +import 'package:siro_driver/constant/box_name.dart'; +import 'package:siro_driver/constant/links.dart'; +import 'package:siro_driver/controller/functions/crud.dart'; +import 'package:siro_driver/controller/functions/tts.dart'; + +import '../../../main.dart'; + +/// Handles map-related logic: fetching routes, drawing polylines, and managing markers. +class NavigationService extends GetxService { + final CRUD _crud = CRUD(); + final TextToSpeechController _tts = Get.put(TextToSpeechController()); + + final RxSet markers = {}.obs; + final RxSet polylines = {}.obs; + final RxString currentInstruction = "".obs; + + InlqBitmap carIcon = InlqBitmap.defaultMarker; + InlqBitmap passengerIcon = InlqBitmap.defaultMarker; + InlqBitmap startIcon = InlqBitmap.defaultMarker; + InlqBitmap endIcon = InlqBitmap.defaultMarker; + + @override + void onInit() { + super.onInit(); + _loadCustomIcons(); + } + + void _loadCustomIcons() { + carIcon = InlqBitmap.fromAsset('assets/images/car.png'); + passengerIcon = InlqBitmap.fromAsset('assets/images/picker.png'); + startIcon = InlqBitmap.fromAsset('assets/images/A.png'); + endIcon = InlqBitmap.fromAsset('assets/images/b.png'); + } + + Future?> getRoute({ + required LatLng origin, + required LatLng destination, + }) async { + final url = + '${AppLink.googleMapsLink}directions/json?language=${box.read(BoxName.lang)}&destination=${destination.latitude},${destination.longitude}&origin=${origin.latitude},${origin.longitude}&key=${AK.mapAPIKEY}'; + + final response = await _crud.getGoogleApi(link: url, payload: {}); + + if (response != null && response['routes'].isNotEmpty) { + return response['routes'][0]; + } + return null; + } + + void drawRoute(Map routeData, {Color color = Colors.blue}) { + final pointsString = routeData["overview_polyline"]["points"]; + final points = PolylineUtils.decode(pointsString); + + final polyline = Polyline( + polylineId: PolylineId(routeData["summary"] ?? DateTime.now().toString()), + points: points, + width: 8, + color: color, + ); + + polylines.add(polyline); + } + + void updateCarMarker(LatLng position, double heading) { + markers.removeWhere((m) => m.markerId.value == 'MyLocation'); + markers.add( + Marker( + markerId: MarkerId('MyLocation'.tr), + position: position, + icon: carIcon, + rotation: heading, + anchor: const Offset(0.5, 0.5), + flat: true, + ), + ); + } + + void setInitialMarkers( + LatLng passengerLocation, LatLng passengerDestination) { + markers.clear(); + markers.add(Marker( + markerId: const MarkerId('passengerLocation'), + position: passengerLocation, + icon: passengerIcon, + )); + markers.add(Marker( + markerId: const MarkerId('passengerDestination'), + position: passengerDestination, + icon: endIcon, + )); + } + + void clearRoutes() { + polylines.clear(); + currentInstruction.value = ""; + } +} diff --git a/siro_driver/lib/controller/home/captin/order_request_controller.dart b/siro_driver/lib/controller/home/captin/order_request_controller.dart new file mode 100755 index 0000000..f58d4f4 --- /dev/null +++ b/siro_driver/lib/controller/home/captin/order_request_controller.dart @@ -0,0 +1,742 @@ +import 'dart:async'; +import 'dart:convert'; +import 'dart:io'; +import 'package:flutter/foundation.dart'; +import 'package:flutter/material.dart'; +import 'package:flutter_overlay_window/flutter_overlay_window.dart'; +import 'package:get/get.dart'; +import 'package:intaleq_maps/intaleq_maps.dart'; +import 'package:geolocator/geolocator.dart'; +import 'package:http/http.dart' as http; +import 'package:just_audio/just_audio.dart'; +import 'package:siro_driver/views/widgets/error_snakbar.dart'; +import 'dart:math' as math; + +import '../../../constant/box_name.dart'; +import '../../../constant/links.dart'; +import '../../../env/env.dart'; +import '../../../main.dart'; +import '../../../print.dart'; +import '../../../views/home/Captin/driver_map_page.dart'; +import '../../../views/home/Captin/orderCaptin/marker_generator.dart'; +import '../../../views/widgets/mydialoug.dart'; +import '../../firebase/local_notification.dart'; +import '../../functions/crud.dart'; +import '../../functions/location_controller.dart'; +import '../../home/captin/home_captain_controller.dart'; + +class OrderRequestController extends GetxController + with WidgetsBindingObserver { + // --- متغيرات التايمر --- + double progress = 1.0; + int duration = 15; + int remainingTime = 15; + Timer? _timer; + + bool applied = false; + final locationController = Get.put(LocationController()); + + // 🔥 متغير لمنع تكرار القبول + bool _isRideTakenHandled = false; + + // --- الأيقونات والماركرز --- + InlqBitmap? driverIcon; + Map markersMap = {}; + Set get markers => markersMap.values.toSet(); + + // --- البيانات والتحكم --- + // 🔥 تم إضافة myMapData لدعم السوكيت الجديد + List? myList; + Map? myMapData; + + IntaleqMapController? mapController; + + // الإحداثيات (أزلنا late لتجنب الأخطاء القاتلة) + double latPassenger = 0.0; + double lngPassenger = 0.0; + double latDestination = 0.0; + double lngDestination = 0.0; + + // --- متغيرات العرض --- + String passengerRating = "5.0"; + String tripType = "Standard"; + String totalTripDistance = "--"; + String totalTripDuration = "--"; + String tripPrice = "--"; + + String timeToPassenger = "Calculating...".tr; + String distanceToPassenger = "--"; + + // --- الخريطة --- + Set polylines = {}; + + // حالة التطبيق والصوت + bool isInBackground = false; + final AudioPlayer audioPlayer = AudioPlayer(); + + @override + Future onInit() async { + // 🛑 حماية من الفتح المتكرر لنفس الطلب + if (Get.arguments == null) { + print("❌ OrderController Error: No arguments received."); + Get.back(); // إغلاق الصفحة فوراً + return; + } + super.onInit(); + WidgetsBinding.instance.addObserver(this); + + _checkOverlay(); + + // 🔥 تهيئة البيانات هي الخطوة الأولى والأهم + _initializeData(); + _parseExtraData(); + + // 1. تجهيز أيقونة السائق + await _prepareDriverIcon(); + + // 2. وضع الماركرز المبدئية + _updateMarkers( + paxTime: "...", + paxDist: "", + destTime: totalTripDuration, + destDist: totalTripDistance); + + // 3. رسم مبدئي + _initialMapSetup(); + + // 4. الاستماع للسوكيت + _listenForRideTaken(); + + // 5. حساب المسارين + await _calculateFullJourney(); + + // 6. تشغيل التايمر + startTimer(); + } + + // ---------------------------------------------------------------------- + // 🔥🔥🔥 Smart Data Handling (List & Map Support) 🔥🔥🔥 + // ---------------------------------------------------------------------- + + void _initializeData() { + var args = Get.arguments; + print("📦 Order Controller Received Type: ${args.runtimeType}"); + print("📦 Order Controller Data: $args"); + + if (args != null) { + // الحالة 1: قائمة مباشرة (Legacy / Some Firebase formats) + if (args is List) { + myList = args; + } + // الحالة 2: خريطة (Map) + else if (args is Map) { + // أ) هل هي قادمة من Firebase وتحتوي على DriverList؟ + if (args.containsKey('DriverList')) { + var listData = args['DriverList']; + if (listData is List) { + myList = listData; + } else if (listData is String) { + // أحياناً تصل كنص مشفر داخل الـ Map + try { + myList = jsonDecode(listData); + } catch (e) { + print("Error decoding DriverList: $e"); + } + } + } + // ب) هل هي قادمة من Socket بالمفاتيح الرقمية ("0", "1", ...)؟ + else { + myMapData = args; + } + } + } + + // تعبئة الإحداثيات باستخدام الدالة الذكية _getValueAt + latPassenger = _parseCoord(_getValueAt(0)); + lngPassenger = _parseCoord(_getValueAt(1)); + latDestination = _parseCoord(_getValueAt(3)); + lngDestination = _parseCoord(_getValueAt(4)); + + print( + "📍 Parsed Coordinates: Pax($latPassenger, $lngPassenger) -> Dest($latDestination, $lngDestination)"); + } + + /// 🔥 دالة ذكية تجلب القيمة سواء كانت البيانات في List أو Map + dynamic _getValueAt(int index) { + // الأولوية للقائمة + if (myList != null && index < myList!.length) { + return myList![index]; + } + // ثم الخريطة (السوكيت) - المفاتيح عبارة عن String + if (myMapData != null && myMapData!.containsKey(index.toString())) { + return myMapData![index.toString()]; + } + return null; + } + + /// الدالة التي يستخدمها باقي الكود لجلب البيانات كنصوص + String _safeGet(int index) { + var val = _getValueAt(index); + if (val != null) { + return val.toString(); + } + return ""; + } + + double _parseCoord(dynamic val) { + if (val == null) return 0.0; + String s = val.toString().replaceAll(',', '').trim(); + if (s.contains(' ')) s = s.split(' ')[0]; + return double.tryParse(s) ?? 0.0; + } + + void _parseExtraData() { + passengerRating = _safeGet(33).isEmpty ? "5.0" : _safeGet(33); + tripType = _safeGet(31); + + // Format numbers to avoid many decimal places + String rawDist = _safeGet(5); + if (rawDist.isNotEmpty) { + double? d = double.tryParse(rawDist); + totalTripDistance = d != null ? "${d.toStringAsFixed(1)} km" : rawDist; + } + + String rawDur = _safeGet(19); + if (rawDur.isNotEmpty) { + double? d = double.tryParse(rawDur); + totalTripDuration = d != null ? "${d.toStringAsFixed(0)} min" : rawDur; + } + + String rawPrice = _safeGet(2); + if (rawPrice.isNotEmpty) { + double? p = double.tryParse(rawPrice); + tripPrice = p != null ? p.toStringAsFixed(0) : rawPrice; + } + } + + // ---------------------------------------------------------------------- + // 🔥🔥🔥 Core Logic: Concurrent API Calls & Bounds 🔥🔥🔥 + // ---------------------------------------------------------------------- + + Future _calculateFullJourney() async { + // Don't block on mapController being null - we'll draw routes + // and markers first, then zoom when controller is ready + bool canZoom = mapController != null; + + try { + // Reuse stored location from LocationController instead of + // making a duplicate GPS hardware call (already fetched in + // _initialMapSetup). + LatLng driverLatLng; + double driverHeading = 0.0; + if (Get.isRegistered()) { + final locCtrl = Get.find(); + if (locCtrl.myLocation.latitude != 0 || + locCtrl.myLocation.longitude != 0) { + driverLatLng = locCtrl.myLocation; + driverHeading = locCtrl.heading; + } else { + Position driverPos = await Geolocator.getCurrentPosition( + desiredAccuracy: LocationAccuracy.high); + driverLatLng = LatLng(driverPos.latitude, driverPos.longitude); + driverHeading = driverPos.heading; + } + } else { + Position driverPos = await Geolocator.getCurrentPosition( + desiredAccuracy: LocationAccuracy.high); + driverLatLng = LatLng(driverPos.latitude, driverPos.longitude); + driverHeading = driverPos.heading; + } + + updateDriverLocation(driverLatLng, driverHeading); + + // Clear old polylines to avoid "ghost lines" + polylines.clear(); + + var pickupFuture = _fetchRouteData( + start: driverLatLng, + end: LatLng(latPassenger, lngPassenger), + color: Colors.amber, + id: 'pickup_route'); + + var tripFuture = _fetchRouteData( + start: LatLng(latPassenger, lngPassenger), + end: LatLng(latDestination, lngDestination), + color: Colors.black, + id: 'trip_route', + getSteps: true); // 🔥 نطلب الخطوات للمسار + + var results = await Future.wait([pickupFuture, tripFuture]); + + var pickupResult = results[0]; + var tripResult = results[1]; + + if (pickupResult != null) { + distanceToPassenger = pickupResult['distance_text']; + timeToPassenger = pickupResult['duration_text']; + polylines.add(pickupResult['polyline']); + } + + if (tripResult != null) { + totalTripDistance = tripResult['distance_text']; + totalTripDuration = tripResult['duration_text']; + polylines.add(tripResult['polyline']); + + // 🔥 تخزين استجابة السيرفر كاملة (بما فيها الـ points والـ instructions) + if (tripResult['raw_response'] != null) { + box.write('cached_trip_route', tripResult['raw_response']); + } + } + + await _updateMarkers( + paxTime: timeToPassenger, + paxDist: distanceToPassenger, + destTime: totalTripDuration, + destDist: totalTripDistance); + + // Now zoom to fit all polylines and markers (if controller available) + if (canZoom) { + zoomToFitRide(); + } + + update(); + } catch (e) { + print("❌ Error in Journey Calculation: $e"); + } + } + + String _formatDistance(dynamic rawDist) { + if (rawDist == null || rawDist.toString().isEmpty) return "--"; + double dist = double.tryParse(rawDist.toString()) ?? 0.0; + if (dist <= 0) return "--"; + if (dist < 1000) return "${dist.toStringAsFixed(0)} m"; + return "${(dist / 1000).toStringAsFixed(1)} km"; + } + + String _formatDuration(dynamic rawDur) { + if (rawDur == null || rawDur.toString().isEmpty) return "--"; + double dur = double.tryParse(rawDur.toString()) ?? 0.0; + if (dur <= 0) return "1 min"; // Minimum 1 min for UI + if (dur < 60) return "${dur.toStringAsFixed(0)} sec"; + return "${(dur / 60).toStringAsFixed(0)} min"; + } + + Future?> _fetchRouteData( + {required LatLng start, + required LatLng end, + required Color color, + required String id, + bool getSteps = false}) async { + try { + if (start.latitude == 0 || end.latitude == 0) return null; + // Don't block on mapController — route data fetch is independent + + final saasUrl = Uri.parse(AppLink.mapSaasRoute).replace(queryParameters: { + 'fromLat': start.latitude.toString(), + 'fromLng': start.longitude.toString(), + 'toLat': end.latitude.toString(), + 'toLng': end.longitude.toString(), + 'steps': getSteps ? 'true' : 'false', + 'alternatives': 'false', + 'locale': 'ar', + }); + + final response = await http.get(saasUrl, headers: { + 'x-api-key': Env.mapSaasKey, + 'Content-Type': 'application/json', + }); + + if (response.statusCode != 200) { + throw Exception("Routing request failed: ${response.statusCode}"); + } + + final data = jsonDecode(response.body); + print("🛣️ Route API Response [$id]: ${data}"); + + // The map-saas API returns the route data directly at the root, + // with 'points' being an encoded polyline string. + final String? encodedPoints = data['points']?.toString(); + + if (encodedPoints != null && encodedPoints.isNotEmpty) { + List path = controllerDecodePolyline(encodedPoints); + print("📍 Path for [$id] has ${path.length} points."); + + final num? rawDist = data['distance'] is num ? data['distance'] : null; + final num? rawDur = data['duration'] is num ? data['duration'] : null; + + final distanceText = data['distance_text'] ?? _formatDistance(rawDist); + final durationText = data['duration_text'] ?? _formatDuration(rawDur); + + Polyline polyline = Polyline( + polylineId: PolylineId(id), + color: color, + width: 5, + points: path, + ); + + return { + 'distance_text': distanceText, + 'duration_text': durationText, + 'polyline': polyline, + 'encoded_polyline': encodedPoints, + 'raw_response': response.body, // 🔥 نمرر الـ JSON كاملاً + }; + } + } catch (e) { + print("Route Fetch Error: $e"); + } + return null; + } + + void zoomToFitRide() { + if (mapController == null) return; + + List allPoints = []; + + // Add all polyline points to the bounds calculation + for (var polyline in polylines) { + allPoints.addAll(polyline.points); + } + + // Fallback to basic markers if polylines are empty + if (allPoints.isEmpty) { + allPoints.addAll([ + LatLng(latPassenger, lngPassenger), + LatLng(latDestination, lngDestination), + ]); + } + + if (allPoints.isEmpty) return; + + double minLat = allPoints.first.latitude; + double maxLat = allPoints.first.latitude; + double minLng = allPoints.first.longitude; + double maxLng = allPoints.first.longitude; + + for (var p in allPoints) { + if (p.latitude < minLat) minLat = p.latitude; + if (p.latitude > maxLat) maxLat = p.latitude; + if (p.longitude < minLng) minLng = p.longitude; + if (p.longitude > maxLng) maxLng = p.longitude; + } + + // Add some padding to the bounds + double latPad = (maxLat - minLat) * 0.25; + double lngPad = (maxLng - minLng) * 0.2; + + mapController!.animateCamera(CameraUpdate.newLatLngBounds( + LatLngBounds( + southwest: LatLng(minLat - latPad, minLng - lngPad), + northeast: LatLng(maxLat + latPad, maxLng + lngPad), + ), + )); + } + + // ---------------------------------------------------------------------- + // Markers & Setup + // ---------------------------------------------------------------------- + + Future _prepareDriverIcon() async { + driverIcon = await MarkerGenerator.createDriverMarker(); + } + + Future _updateMarkers( + {required String paxTime, + required String paxDist, + String? destTime, + String? destDist}) async { + // حماية إذا لم يتم جلب الإحداثيات + if (latPassenger == 0 || latDestination == 0) return; + + final InlqBitmap pickupIcon = + await MarkerGenerator.createCustomMarkerBitmap( + title: paxTime, + subtitle: paxDist, + color: Colors.amber.shade900, // Matching the amber pickup line + iconData: Icons.person_pin_circle, + ); + + final InlqBitmap dropoffIcon = + await MarkerGenerator.createCustomMarkerBitmap( + title: destTime ?? totalTripDuration, + subtitle: destDist ?? totalTripDistance, + color: Colors.red.shade800, + iconData: Icons.flag, + ); + + markersMap[const MarkerId('pax')] = Marker( + markerId: const MarkerId('pax'), + position: LatLng(latPassenger, lngPassenger), + icon: pickupIcon, + anchor: const Offset(0.5, 0.85), + ); + + markersMap[const MarkerId('dest')] = Marker( + markerId: const MarkerId('dest'), + position: LatLng(latDestination, lngDestination), + icon: dropoffIcon, + anchor: const Offset(0.5, 0.85), + ); + + update(); + } + + void _initialMapSetup() async { + Position driverPos = await Geolocator.getCurrentPosition(); + LatLng driverLatLng = LatLng(driverPos.latitude, driverPos.longitude); + + if (driverIcon != null) { + markersMap[const MarkerId('driver')] = Marker( + markerId: const MarkerId('driver'), + position: driverLatLng, + icon: driverIcon!, + rotation: driverPos.heading, + anchor: const Offset(0.5, 0.5), + flat: true, + zIndex: 10); + } + + if (latPassenger != 0 && lngPassenger != 0) { + polylines.add(Polyline( + polylineId: const PolylineId('temp_line'), + points: [driverLatLng, LatLng(latPassenger, lngPassenger)], + color: Colors.grey, + width: 2, + )); + + zoomToFitRide(); + } + + update(); + } + + void updateDriverLocation(LatLng newPos, double heading) { + if (driverIcon != null) { + markersMap[const MarkerId('driver')] = Marker( + markerId: const MarkerId('driver'), + position: newPos, + icon: driverIcon!, + rotation: heading, + anchor: const Offset(0.5, 0.5), + flat: true, + zIndex: 10, + ); + update(); + } + } + + void onMapCreated(IntaleqMapController controller) { + mapController = controller; + _calculateFullJourney(); + } + + // --- قبول الطلب وإدارة التايمر --- + void startTimer() { + _timer?.cancel(); + remainingTime = duration; + _playAudio(); + _timer = Timer.periodic(const Duration(seconds: 1), (timer) { + if (remainingTime <= 0) { + timer.cancel(); + _stopAudio(); + if (!applied) Get.back(); + } else { + remainingTime--; + progress = remainingTime / duration; + update(); + } + }); + } + + void endTimer() => _timer?.cancel(); + void changeApplied() => applied = true; + + void _playAudio() async { + try { + await audioPlayer.setAsset('assets/order.mp3', preload: true); + await audioPlayer.setLoopMode(LoopMode.one); + await audioPlayer.play(); + } catch (e) { + print(e); + } + } + + void _stopAudio() => audioPlayer.stop(); + + void _listenForRideTaken() { + if (locationController.socket != null) { + locationController.socket!.off('ride_taken'); + locationController.socket!.on('ride_taken', (data) { + if (_isRideTakenHandled) return; + String takenRideId = data['ride_id'].toString(); + String myCurrentRideId = _safeGet(16); + String whoTookIt = data['taken_by_driver_id'].toString(); + String myDriverId = box.read(BoxName.driverID).toString(); + + if (takenRideId == myCurrentRideId && whoTookIt != myDriverId) { + _isRideTakenHandled = true; + endTimer(); + // 1. حذف الإشعار من شريط التنبيهات فوراً + NotificationController().cancelOrderNotification(); + if (Get.isSnackbarOpen) Get.closeCurrentSnackbar(); + + // إغلاق أي ديالوج مفتوح قسرياً + if (Get.isDialogOpen ?? false) { + navigatorKey.currentState?.pop(); + } + Get.back(); + mySnackbarInfo("The order has been accepted by another driver.".tr); + } + }); + } + } + + // Lifecycle + @override + void didChangeAppLifecycleState(AppLifecycleState state) { + super.didChangeAppLifecycleState(state); + if (state == AppLifecycleState.paused || + state == AppLifecycleState.detached) { + isInBackground = true; + } else if (state == AppLifecycleState.resumed) { + isInBackground = false; + FlutterOverlayWindow.closeOverlay(); + } + } + + void _checkOverlay() async { + if (Platform.isAndroid && await FlutterOverlayWindow.isActive()) { + await FlutterOverlayWindow.closeOverlay(); + } + } + +// Accept Order Logic + Future acceptOrder() async { + endTimer(); + _stopAudio(); + + // 1. إرسال الطلب + var res = await CRUD() + .post(link: "${AppLink.ride}/rides/acceptRide.php", payload: { + 'id': _safeGet(16), + 'rideTimeStart': DateTime.now().toString(), + 'status': 'Apply', + 'passengerToken': _safeGet(9), + 'driver_id': box.read(BoxName.driverID), + }); + + Log.print('res from orderrequestpage: ${res}'); + + // ============================================================ + // تصحيح: فحص الرد بدقة (Map أو String) + // ============================================================ + bool isFailure = false; + + if (res is Map && res['status'] == 'failure') { + isFailure = true; + } else if (res == 'failure') { + isFailure = true; + } + + if (isFailure) { + // ⛔ حالة الفشل: الطلب مأخوذ + MyDialog().getDialog( + "Sorry, the order was taken by another driver.".tr, '', () { + // بما أن MyDialog يغلق نفسه الآن، نحتاج Get.back() واحدة فقط لإغلاق صفحة الطلب + Get.back(); + }); + } else { + // ✅ حالة النجاح + + // حماية من الكراش: التأكد من وجود HomeCaptainController قبل استخدامه + if (!Get.isRegistered()) { + Get.put(HomeCaptainController()); + } else { + Get.find().changeRideId(); + } + + box.write(BoxName.statusDriverLocation, 'on'); + changeApplied(); + + var rideArgs = { + 'passengerLocation': '${_safeGet(0)},${_safeGet(1)}', + 'passengerDestination': '${_safeGet(3)},${_safeGet(4)}', + 'Duration': totalTripDuration, + 'totalCost': _safeGet(26), + 'Distance': totalTripDistance, + 'name': _safeGet(8), + 'phone': _safeGet(10), + 'email': _safeGet(28), + 'WalletChecked': _safeGet(13), + 'tokenPassenger': _safeGet(9), + 'direction': + 'https://www.google.com/maps/dir/${_safeGet(0)}/${_safeGet(1)}/', + 'DurationToPassenger': timeToPassenger, + 'rideId': _safeGet(16), + 'passengerId': _safeGet(7), + 'driverId': _safeGet(18), + 'durationOfRideValue': totalTripDuration, + 'paymentAmount': _safeGet(2), + 'paymentMethod': _safeGet(13) == 'true' ? 'visa' : 'cash', + 'isHaveSteps': _safeGet(20), + 'step0': _safeGet(21), + 'step1': _safeGet(22), + 'step2': _safeGet(23), + 'step3': _safeGet(24), + 'step4': _safeGet(25), + 'passengerWalletBurc': _safeGet(26), + 'timeOfOrder': DateTime.now().toString(), + 'totalPassenger': _safeGet(2), + 'carType': _safeGet(31), + 'kazan': _safeGet(32), + 'startNameLocation': _safeGet(29), + 'endNameLocation': _safeGet(30), + }; + + box.write(BoxName.rideArguments, rideArgs); + + // الانتقال النهائي + Get.off(() => PassengerLocationMapPage(), arguments: rideArgs); + } + } + + @override + void onClose() { + locationController.socket?.off('ride_taken'); + audioPlayer.dispose(); + WidgetsBinding.instance.removeObserver(this); + _timer?.cancel(); + // mapController?.dispose(); + super.onClose(); + } + + List controllerDecodePolyline(String encoded) { + List points = []; + int index = 0, len = encoded.length; + int lat = 0, lng = 0; + + while (index < len) { + int b, shift = 0, result = 0; + do { + b = encoded.codeUnitAt(index++) - 63; + result |= (b & 0x1f) << shift; + shift += 5; + } while (b >= 0x20); + int dlat = ((result & 1) != 0 ? ~(result >> 1) : (result >> 1)); + lat += dlat; + + shift = 0; + result = 0; + do { + b = encoded.codeUnitAt(index++) - 63; + result |= (b & 0x1f) << shift; + shift += 5; + } while (b >= 0x20); + int dlng = ((result & 1) != 0 ? ~(result >> 1) : (result >> 1)); + lng += dlng; + + points.add(LatLng(lat / 1E5, lng / 1E5)); + } + return points; + } +} diff --git a/siro_driver/lib/controller/home/captin/v2_review_delta.html b/siro_driver/lib/controller/home/captin/v2_review_delta.html new file mode 100644 index 0000000..30969aa --- /dev/null +++ b/siro_driver/lib/controller/home/captin/v2_review_delta.html @@ -0,0 +1,212 @@ + + + +
+

مراجعة النسخة المحدّثة — V2

+

مقارنة مع المراجعة السابقة · 16 مشكلة فُحصت

+ +
+
11
مشكلة مُصلحة ✅
+
2
مشكلة جديدة أدخلتها الإصلاحات ⚠️
+
3
مشكلة لم تُعالج بعد
+
69%
تحسن من المراجعة الأولى
+
+ +
صحة المنطق البرمجي
72% ↑
+
نظافة الكود
63% ↑
+
قابلية الصيانة
58% ↑
+ + +
+
✅ مُصلح ما تم إصلاحه بشكل صحيح
+ +
+
C-1 — استبدال الحلقة التكرارية والاستدعاء الذاتي بـ Timer.periodicممتاز
+

تم حذف updateLocation() كاملاً واستبدالها بـ startUpdateLocationTimer() و stopUpdateLocationTimer(). التايمر مسجّل في onClose() و _stopAllServices(). إصلاح ممتاز.

+
ملاحظة مهمةلا يظهر في الكود استدعاء لـ startUpdateLocationTimer() من أي مكان. يجب التأكد أنها تُستدعى من الـ View أو من startRideFromDriver().
+
+ +
+
C-4 — تحديث myLocation في _handleLocationUpdate()
+
void _handleLocationUpdate(geo.Position pos) {
+  final newLoc = LatLng(pos.latitude, pos.longitude);
+  myLocation = newLoc; // ← [Fix C-4] ✅ صحيح
+  // ...
+
+ +
+
M-4 — دمج checkForNextStep() مع _checkNavigationStep()
+

checkForNextStep أصبحت wrapper بسيط يستدعي _checkNavigationStep. منطق واحد، لا تعارض.

+
+ +
+
M-5 — disposeEverything() لا تستدعي onClose() يدوياً
+
void disposeEverything() {
+  _stopAllServices(); // ✅ بدون onClose()
+}
+
+ +
+
C-3 جزئي — دالة مساعدة _parseDistanceToMeters() مشتركة
+

تم استخراج منطق تحليل المسافة إلى دالة واحدة تستخدمها كلا finishRideFromDriver() و _validateTripDistance(). يحل مشكلة التضارب في الوحدات.

+
لم يُحل كاملاًالتحقق من المسافة لا يزال يحدث مرتين (انظر مشكلة C-3 أدناه).
+
+ +
+
M-1 + M-2 + M-6 + N-1 + N-5 — إصلاحات طفيفة متعددة
+
+

M-1: jitterMetersjitterKm = 0.01

+

M-2: distance المحلية → distToPassenger

+

M-6: تعليق يوضح أن الوحدة كيلومتر ✅

+

N-1: &directionsmode?directionsmode

+

N-5: إضافة update() في getLocationArea()

+

M-3: حذف _performanceReadings والمتغيرات الميتة ✅

+
+
+
+ + +
+
🚨 جديد مشاكل أدخلتها الإصلاحات
+ +
+
🚨BUG جديد — Completer في C-2 يُسبب Deadlock عند إغلاق الديالوج بـ Backحرج
+
+

الإصلاح استخدم Completer بشكل صحيح لحل مشكلة الـ callback الآني، لكنه أدخل مشكلة أخرى: لو أغلق المستخدم الديالوج بزر الرجوع (Back) في Android بدون ضغط OK، فإن completer.future لن تكتمل أبداً، والدالة ستبقى معلّقة (deadlock) لأن _validateTripDistance() هي async وتنتظر نتيجة لن تأتي:

+
final completer = Completer<bool>();
+MyDialog().getDialog('Exit Ride?'.tr, '', () {
+  if (!completer.isCompleted) completer.complete(true);
+  Get.back();
+});
+return await completer.future; // ← ينتظر للأبد إذا أُغلق بـ Back
+
الحلأضف barrierDismissible: false للديالوج، أو استخدم completer.complete(false) عند إغلاق الديالوج بدون تأكيد (عبر WillPopScope أو onDismissed callback في MyDialog).
+
+
+ +
+
🚨C-3 لا يزال — المستخدم يرى ديالوجَي تأكيد متتاليَين عند إنهاء الرحلة بالزرحرج
+
+

رغم إضافة _parseDistanceToMeters()، تدفق الكود لا يزال يُقدّم ديالوجَين:

+
// finishRideFromDriver(isFromSlider: false):
+MyDialog().getDialog('Are you sure to exit ride?', '', () {
+  Get.back();
+  finishRideFromDriver1(); // ← isFromSlider = false افتراضياً
+});
+
+// finishRideFromDriver1():
+if (!await _validateTripDistance(false)) return; // ← يُقدّم ديالوجاً ثانياً!
+

المستخدم يرى "هل أنت متأكد؟" → يضغط OK → يرى "Exit Ride?" مرة ثانية → ينتظر مجدداً.

+
الحلاحذف الديالوج من finishRideFromDriver() وأبقه في _validateTripDistance() فقط. أو مرّر isFromSlider: true لما يأتي من موافقة مسبقة.
+
+
+
+ + +
+
⚠️ لم تُعالج مشاكل لا تزال قائمة
+ +
+
⚠️M-7 — Null checks على String غير قابلة للـ null
+
+
if (isSocialPressed == true && passengerId != null && rideId != null) {
+//                                            ^^^^^^^^^^^ دائماً non-null
+

لو passengerId == '' يمر الشرط ويُرسل بيانات فارغة للسيرفر. الفحص الصحيح: passengerId.isNotEmpty && rideId.isNotEmpty.

+
+
+ +
+
⚠️N-2 — تأخير 1 ثانية Hardcoded في argumentLoading()
+
+
await Future.delayed(const Duration(seconds: 1));
+await getRoute(...);
+

لا يزال موجوداً. Race condition يجب معالجته بـ Completer بدلاً من تخمين الوقت.

+
+
+ +
+
⚠️N-4 — step0 إلى step4 بدلاً من List<String>
+
+
String step0 = ''; String step1 = ''; // ...
+step0 = Get.arguments['step0']?.toString() ?? '';
+step1 = Get.arguments['step1']?.toString() ?? '';
+

لا تزال 5 متغيرات منفصلة. List<String> steps = List.filled(5, '') أوضح وأسهل في المعالجة.

+
+
+
+ + +
+
ℹ️ بسيطة ملاحظات إضافية على هذه النسخة
+ +
+
ℹ️_suggestOptimization() لا تزال موجودة لكن لا يستدعيها أحد
+

بعد حذف _performanceReadings و _analyzePerformance()، بقيت _suggestOptimization() معزولة. إما أن تُستدعى من مكان ما أو تُحذف.

+
+ +
+
ℹ️الاستيرادات المكررة لـ dart:math و geolocator لا تزال
+
+
import 'dart:math';
+import 'dart:math' as math;           // مكرر
+import 'package:geolocator/geolocator.dart' as geo;
+import 'package:geolocator/geolocator.dart'; // مكرر
+

يُسبب تحذيرات من المحلل ويُشوّش قراءة الكود. احذف النسخة غير المعرّفة.

+
+
+
+ +
+ diff --git a/siro_driver/lib/controller/home/journal/schedule_controller.dart b/siro_driver/lib/controller/home/journal/schedule_controller.dart new file mode 100644 index 0000000..404b8ea --- /dev/null +++ b/siro_driver/lib/controller/home/journal/schedule_controller.dart @@ -0,0 +1,106 @@ +import 'dart:convert'; +import 'package:flutter/material.dart'; +import 'package:get/get.dart'; +import 'package:siro_driver/main.dart'; + +class WorkSlot { + int dayOfWeek; // 1=Mon ... 7=Sun + TimeOfDay startTime; + TimeOfDay endTime; + bool isActive; + + WorkSlot({required this.dayOfWeek, required this.startTime, required this.endTime, this.isActive = true}); + + Map toJson() => { + 'day': dayOfWeek, 'startH': startTime.hour, 'startM': startTime.minute, + 'endH': endTime.hour, 'endM': endTime.minute, 'active': isActive, + }; + + factory WorkSlot.fromJson(Map json) => WorkSlot( + dayOfWeek: json['day'] ?? 1, + startTime: TimeOfDay(hour: json['startH'] ?? 8, minute: json['startM'] ?? 0), + endTime: TimeOfDay(hour: json['endH'] ?? 17, minute: json['endM'] ?? 0), + isActive: json['active'] ?? true, + ); + + String get dayName { + const days = ['', 'Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat', 'Sun']; + return days[dayOfWeek]; + } + + String get dayNameAr { + const days = ['', 'الإثنين', 'الثلاثاء', 'الأربعاء', 'الخميس', 'الجمعة', 'السبت', 'الأحد']; + return days[dayOfWeek]; + } + + String formatTime(TimeOfDay t) => '${t.hour.toString().padLeft(2, '0')}:${t.minute.toString().padLeft(2, '0')}'; + String get timeRange => '${formatTime(startTime)} - ${formatTime(endTime)}'; +} + +class ScheduleController extends GetxController { + List schedule = []; + + @override + void onInit() { + super.onInit(); + _loadSchedule(); + } + + void _loadSchedule() { + final saved = box.read('work_schedule'); + if (saved != null) { + try { + final list = jsonDecode(saved) as List; + schedule = list.map((e) => WorkSlot.fromJson(e)).toList(); + } catch (_) { + _initDefault(); + } + } else { + _initDefault(); + } + update(); + } + + void _initDefault() { + schedule = List.generate(7, (i) => WorkSlot( + dayOfWeek: i + 1, + startTime: const TimeOfDay(hour: 8, minute: 0), + endTime: const TimeOfDay(hour: 18, minute: 0), + isActive: i < 6, // الجمعة عطلة + )); + } + + void _save() { + box.write('work_schedule', jsonEncode(schedule.map((s) => s.toJson()).toList())); + update(); + } + + void toggleDay(int dayOfWeek) { + final slot = schedule.firstWhere((s) => s.dayOfWeek == dayOfWeek); + slot.isActive = !slot.isActive; + _save(); + } + + void updateStartTime(int dayOfWeek, TimeOfDay time) { + schedule.firstWhere((s) => s.dayOfWeek == dayOfWeek).startTime = time; + _save(); + } + + void updateEndTime(int dayOfWeek, TimeOfDay time) { + schedule.firstWhere((s) => s.dayOfWeek == dayOfWeek).endTime = time; + _save(); + } + + double get totalWeeklyHours { + double total = 0; + for (var s in schedule) { + if (!s.isActive) continue; + final startMin = s.startTime.hour * 60 + s.startTime.minute; + final endMin = s.endTime.hour * 60 + s.endTime.minute; + total += (endMin - startMin) / 60; + } + return total; + } + + int get activeDays => schedule.where((s) => s.isActive).length; +} diff --git a/siro_driver/lib/controller/home/menu_controller.dart b/siro_driver/lib/controller/home/menu_controller.dart new file mode 100755 index 0000000..b5e0548 --- /dev/null +++ b/siro_driver/lib/controller/home/menu_controller.dart @@ -0,0 +1,14 @@ +import 'package:get/get.dart'; + +class MyMenuController extends GetxController { + bool isDrawerOpen = true; + + void getDrawerMenu() { + if (isDrawerOpen == true) { + isDrawerOpen = false; + } else { + isDrawerOpen = true; + } + update(); + } +} diff --git a/siro_driver/lib/controller/home/navigation/decode_polyline_isolate.dart b/siro_driver/lib/controller/home/navigation/decode_polyline_isolate.dart new file mode 100644 index 0000000..406c3e3 --- /dev/null +++ b/siro_driver/lib/controller/home/navigation/decode_polyline_isolate.dart @@ -0,0 +1,31 @@ +import 'package:intaleq_maps/intaleq_maps.dart'; + +List decodePolylineIsolate(String encoded) { + List points = []; + int index = 0, len = encoded.length; + int lat = 0, lng = 0; + + while (index < len) { + int b, shift = 0, result = 0; + do { + b = encoded.codeUnitAt(index++) - 63; + result |= (b & 0x1f) << shift; + shift += 5; + } while (b >= 0x20); + int dlat = ((result & 1) != 0 ? ~(result >> 1) : (result >> 1)); + lat += dlat; + + shift = 0; + result = 0; + do { + b = encoded.codeUnitAt(index++) - 63; + result |= (b & 0x1f) << shift; + shift += 5; + } while (b >= 0x20); + int dlng = ((result & 1) != 0 ? ~(result >> 1) : (result >> 1)); + lng += dlng; + + points.add(LatLng(lat / 1E5, lng / 1E5)); + } + return points; +} diff --git a/siro_driver/lib/controller/home/navigation/navigation_controller.dart b/siro_driver/lib/controller/home/navigation/navigation_controller.dart new file mode 100644 index 0000000..e607f6d --- /dev/null +++ b/siro_driver/lib/controller/home/navigation/navigation_controller.dart @@ -0,0 +1,1382 @@ +import 'dart:async'; +import 'dart:convert'; +import 'dart:math'; +import 'package:siro_driver/views/widgets/error_snakbar.dart'; +import 'package:flutter/foundation.dart'; +import 'package:flutter/material.dart'; +import 'package:flutter/services.dart'; +import 'package:geolocator/geolocator.dart'; +import 'package:get/get.dart'; +import 'package:intaleq_maps/intaleq_maps.dart'; +import 'package:http/http.dart' as http; +import 'package:siro_driver/constant/box_name.dart'; +import 'package:siro_driver/constant/links.dart'; +import 'package:siro_driver/controller/functions/crud.dart'; +import 'package:siro_driver/controller/functions/tts.dart'; +import 'package:siro_driver/controller/home/navigation/decode_polyline_isolate.dart'; +import 'package:siro_driver/env/env.dart'; +import 'package:siro_driver/main.dart'; +import 'package:siro_driver/print.dart'; +import 'dart:ui'; +import 'package:siro_driver/services/offline_map_service.dart'; + +class RouteData { + final List coordinates; + final List> steps; + final double distanceM; + final double durationS; + final String points; + + RouteData({ + required this.coordinates, + required this.steps, + required this.distanceM, + required this.durationS, + required this.points, + }); +} + +class NavigationController extends GetxController + with GetSingleTickerProviderStateMixin { + static const Duration _recordInterval = Duration(seconds: 4); + static const Duration _uploadInterval = Duration(minutes: 2); + static const double _minMoveToRecord = 10.0; + static const double _minMoveToProcess = 2.0; + static const double _offRouteThresholdM = 25.0; + static const int _offRouteTriggerSeconds = 6; + + bool isLoading = false; + IntaleqMapController? mapController; + bool isStyleLoaded = false; + final TextEditingController placeDestinationController = + TextEditingController(); + + LatLng? myLocation; + + double _oldHeading = 0.0; + double _targetHeading = 0.0; + double _smoothedHeading = 0.0; + + AnimationController? _animController; + LatLng? _oldLoc; + LatLng? _targetLoc; + + double currentSpeed = 0.0; + double totalDistance = 0.0; + + Set markers = {}; + Set polylines = {}; + Set circles = {}; + Set polygons = {}; + + StreamSubscription? _locationStreamSubscription; + LatLng? _lastProcessedLocation; + + List placesDestination = []; + Timer? _debounce; + + // Alternative route handling + bool _hasAlternativeRoutes = false; + DateTime? _lastAutoRerouteTime; + + LatLng? _finalDestination; + LatLng? _intermediateStop; + List> routeSteps = []; + List _fullRouteCoordinates = []; + int _lastTraveledIndexInFullRoute = 0; + + bool _nextInstructionSpoken = false; + String currentInstruction = ""; + String nextInstruction = ""; + int currentStepIndex = 0; + String distanceToNextStep = ""; + String totalDistanceRemaining = ""; + String estimatedTimeRemaining = ""; + dynamic currentManeuverModifier = 0; + String arrivalTime = "--:--"; // NEW: For the active navigation HUD + + double _routeTotalDistanceM = 0; + double _routeTotalDurationS = 0; + + bool isNavigating = false; + bool isMuted = false; // Sound toggle state + String distanceWithUnit = ""; + bool _cameraLockedToUser = true; + bool _mapReady = false; + + bool isSelectingPlaceLocation = false; + + void togglePlaceSelectionMode() { + isSelectingPlaceLocation = !isSelectingPlaceLocation; + update(); + } + + Future submitNewPlace(String name, String category) async { + if (mapController == null || name.isEmpty || category.isEmpty) return; + + // Get current center of the map as the picked location + final LatLng pickedPos = mapController!.cameraPosition!.target; + + isLoading = true; + update(); + + final String country = + box.read(BoxName.countryCode) == 'SY' ? 'syria' : 'jordan'; + + final Map payload = { + 'name': name, + 'category': category, + 'lat': pickedPos.latitude, + 'lng': pickedPos.longitude, + 'country': country, + }; + + try { + final response = await CRUD().postMapSaas( + link: AppLink.mapSaasPlaces, + payload: payload, + ); + + isLoading = false; + if (response != null) { + HapticFeedback.lightImpact(); + mySnackbarSuccess(box.read(BoxName.lang) == 'ar' + ? 'تمت إضافة المكان بنجاح! شكراً لمساهمتك.' + : 'Place added successfully! Thanks for your contribution.'); + isSelectingPlaceLocation = false; + } else { + mySnackbarWarning(box.read(BoxName.lang) == 'ar' + ? 'تعذر إضافة المكان. يرجى المحاولة لاحقاً.' + : 'Failed to add place. Please try again later.'); + } + update(); + } catch (e) { + isLoading = false; + mySnackbarWarning(box.read(BoxName.lang) == 'ar' + ? 'حدث خطأ أثناء الاتصال بالخادم.' + : 'An error occurred while connecting to the server.'); + update(); + } + } + + DateTime? _offRouteStartTime; + bool _autoRecalcInProgress = false; + + final List> _trackBuffer = []; + Timer? _recordTimer; + Timer? _uploadBatchTimer; + LatLng? _lastBufferedLocation; + DateTime? _lastBufferedTime; + LatLng? _lastDistanceLocation; + + List routes = []; + int selectedRouteIndex = 0; + + List> recentLocations = []; + + double get _targetZoom { + if (currentSpeed < 15) return 19.0; + if (currentSpeed < 40) return 18.0; + if (currentSpeed < 70) return 17.0; + if (currentSpeed < 100) return 16.0; + return 15.0; + } + + double get _targetTilt { + if (currentSpeed < 10) return 0.0; + if (currentSpeed < 40) return 40.0; + return 55.0; + } + + // Categories list for the picker + static final List> placeCategories = [ + { + 'id': 'restaurant', + 'en': 'Restaurant', + 'ar': 'مطعم', + 'icon': 'restaurant' + }, + {'id': 'cafe', 'en': 'Cafe', 'ar': 'مقهى', 'icon': 'coffee'}, + { + 'id': 'supermarket', + 'en': 'Supermarket', + 'ar': 'سوبر ماركت', + 'icon': 'shopping_basket' + }, + { + 'id': 'pharmacy', + 'en': 'Pharmacy', + 'ar': 'صيدلية', + 'icon': 'local_pharmacy' + }, + { + 'id': 'gas_station', + 'en': 'Gas Station', + 'ar': 'محطة وقود', + 'icon': 'local_gas_station' + }, + {'id': 'atm', 'en': 'ATM', 'ar': 'صراف آلي', 'icon': 'atm'}, + {'id': 'bank', 'en': 'Bank', 'ar': 'بنك', 'icon': 'account_balance'}, + {'id': 'mosque', 'en': 'Mosque', 'ar': 'مسجد', 'icon': 'mosque'}, + { + 'id': 'hospital', + 'en': 'Hospital', + 'ar': 'مستشفى', + 'icon': 'local_hospital' + }, + {'id': 'school', 'en': 'School', 'ar': 'مدرسة', 'icon': 'school'}, + { + 'id': 'university', + 'en': 'University', + 'ar': 'جامعة', + 'icon': 'account_balance' + }, + {'id': 'park', 'en': 'Park', 'ar': 'منتزه', 'icon': 'park'}, + {'id': 'hotel', 'en': 'Hotel', 'ar': 'فندق', 'icon': 'hotel'}, + { + 'id': 'mall', + 'en': 'Shopping Mall', + 'ar': 'مركز تسوق', + 'icon': 'shopping_mall' + }, + {'id': 'gym', 'en': 'Gym', 'ar': 'نادي رياضي', 'icon': 'fitness_center'}, + { + 'id': 'salon', + 'en': 'Beauty Salon', + 'ar': 'صالون تجميل', + 'icon': 'content_cut' + }, + {'id': 'bakery', 'en': 'Bakery', 'ar': 'مخبز', 'icon': 'bakery_dining'}, + { + 'id': 'laundry', + 'ar': 'مصبغة', + 'en': 'Laundry', + 'icon': 'local_laundry_service' + }, + { + 'id': 'car_repair', + 'en': 'Car Repair', + 'ar': 'تصليح سيارات', + 'icon': 'build' + }, + { + 'id': 'government', + 'en': 'Government Office', + 'ar': 'دائرة حكومية', + 'icon': 'gavel' + }, + ]; + + IconData get currentManeuverIcon { + switch (currentManeuverModifier) { + case 4: // Arrive + return Icons.place_rounded; + case 6: // Roundabout + return Icons.roundabout_right_rounded; + case 2: // Right + return Icons.turn_right_rounded; + case 3: // Slight Right + return Icons.turn_slight_right_rounded; + case -2: // Left + return Icons.turn_left_rounded; + case -1: // Slight Left + return Icons.turn_slight_left_rounded; + case 7: // Keep Right + return Icons.turn_right_rounded; + case -7: // Keep Left + return Icons.turn_left_rounded; + case 0: // Straight + return Icons.straight_rounded; + default: + return Icons.straight_rounded; + } + } + + void toggleMute() { + isMuted = !isMuted; + update(); + } + + @override + void onInit() { + super.onInit(); + _animController = AnimationController( + vsync: this, duration: const Duration(milliseconds: 1000)); + _animController!.addListener(() { + if (_oldLoc != null && _targetLoc != null && _mapReady) { + final t = _animController!.value; + final lat = lerpDouble(_oldLoc!.latitude, _targetLoc!.latitude, t)!; + final lng = lerpDouble(_oldLoc!.longitude, _targetLoc!.longitude, t)!; + myLocation = LatLng(lat, lng); + _smoothedHeading = _lerpAngle(_oldHeading, _targetHeading, t); + + if (isStyleLoaded) { + _updateCarMarker(); + if (_cameraLockedToUser) { + animateCameraToPosition(myLocation!, + bearing: _smoothedHeading, + zoom: isNavigating ? _targetZoom : 17.0, + tilt: isNavigating ? _targetTilt : 0.0); + } + } + } + }); + _initialize(); + } + + Future _initialize() async { + _loadRecentLocations(); + await _getCurrentLocationAndStartUpdates(); + } + + void _loadRecentLocations() { + final dynamic stored = box.read(BoxName.recentLocations); + if (stored != null) { + try { + List parsed; + if (stored is String) { + parsed = jsonDecode(stored); + } else if (stored is List) { + parsed = stored; + } else { + parsed = []; + } + + recentLocations = parsed + .map((e) => Map.from(e)) + .toList() + .reversed // Most recent first + .take(3) + .toList(); + } catch (e) { + Log.print("Error decoding recent locations: $e"); + recentLocations = []; + } + } else { + recentLocations = []; + } + update(); + } + + @override + void onClose() { + _locationStreamSubscription?.cancel(); + _recordTimer?.cancel(); + _uploadBatchTimer?.cancel(); + _debounce?.cancel(); + _animController?.dispose(); + mapController = null; + placeDestinationController.dispose(); + _flushBufferToServer(); + super.onClose(); + } + + void onMapCreated(IntaleqMapController controller) async { + Log.print("DEBUG: NavigationController.onMapCreated called"); + mapController = controller; + } + + Future onStyleLoaded() async { + Log.print("DEBUG: NavigationController.onStyleLoaded called"); + isStyleLoaded = true; + await _loadCustomIcons(); + + WidgetsBinding.instance.addPostFrameCallback((_) async { + await Future.delayed(const Duration(milliseconds: 300)); + if (!_mapReady) { + Log.print("DEBUG: NavigationController setting _mapReady = true"); + _mapReady = true; + if (myLocation != null) { + Log.print("DEBUG: Animating camera to initial location: $myLocation"); + animateCameraToPosition(myLocation!); + _updateCarMarker(); + } + if (_fullRouteCoordinates.isNotEmpty) { + Log.print("DEBUG: Updating initial polylines"); + _updatePolylinesSets([], _fullRouteCoordinates); + } + } + }); + } + + void onMapTapped(Point point, LatLng tappedPoint) { + if (isNavigating || routes.isEmpty) return; + + int? bestIndex; + double minDistance = 100.0; // 100 meters threshold for tap + + for (int i = 0; i < routes.length; i++) { + for (var coord in routes[i].coordinates) { + final dist = Geolocator.distanceBetween( + tappedPoint.latitude, + tappedPoint.longitude, + coord.latitude, + coord.longitude, + ); + if (dist < minDistance) { + minDistance = dist; + bestIndex = i; + } + } + } + + if (bestIndex != null && bestIndex != selectedRouteIndex) { + HapticFeedback.selectionClick(); + selectRoute(bestIndex); + } + } + + Future onMapLongPressed(Point point, LatLng tappedPoint) async { + HapticFeedback.mediumImpact(); + Get.dialog( + AlertDialog( + shape: RoundedRectangleBorder(borderRadius: BorderRadius.circular(20)), + title: const Text('بدء الملاحة؟', + style: TextStyle(fontWeight: FontWeight.bold)), + content: const Text('هل تريد الذهاب إلى هذا الموقع؟'), + actions: [ + TextButton( + child: const Text('إلغاء', style: TextStyle(color: Colors.grey)), + onPressed: () => Get.back()), + ElevatedButton( + style: ElevatedButton.styleFrom( + backgroundColor: const Color(0xFF0D47A1), + shape: RoundedRectangleBorder( + borderRadius: BorderRadius.circular(12))), + child: + const Text('اذهب الآن', style: TextStyle(color: Colors.white)), + onPressed: () { + Get.back(); + startNavigationTo(tappedPoint, infoWindowTitle: 'الموقع المحدد'); + }, + ), + ], + ), + ); + } + + Future _getCurrentLocationAndStartUpdates() async { + try { + Log.print("DEBUG: Getting initial location..."); + final position = await Geolocator.getCurrentPosition( + desiredAccuracy: LocationAccuracy.high); + myLocation = LatLng(position.latitude, position.longitude); + Log.print("DEBUG: Initial location acquired: $myLocation"); + _targetHeading = position.heading; + _oldHeading = position.heading; + _smoothedHeading = position.heading; + update(); + if (isStyleLoaded) animateCameraToPosition(myLocation!); + // Start the Location Stream for real-time updates + _startLocationStream(); + _startBatchTimers(); + } catch (e) { + Log.print("DEBUG: Error getting initial location: $e"); + } + } + + void _startLocationStream() { + _locationStreamSubscription?.cancel(); + // Listen to location updates with minimum distance filter of 2 meters + // This provides real-time updates without the 3-4 second delay + _locationStreamSubscription = Geolocator.getPositionStream( + locationSettings: const LocationSettings( + accuracy: LocationAccuracy.high, + distanceFilter: 2, // Update every 2 meters + ), + ).listen( + (Position position) { + _handleLocationUpdate(position); + }, + onError: (error) { + Log.print("DEBUG: Location stream error: $error"); + }, + ); + } + + bool _isProcessing = false; + Future _handleLocationUpdate(Position position) async { + if (_isProcessing) return; + _isProcessing = true; + + try { + final newLoc = LatLng(position.latitude, position.longitude); + currentSpeed = position.speed * 3.6; // Convert m/s to km/h + + // Skip if movement is too small + if (_lastProcessedLocation != null) { + final d = Geolocator.distanceBetween( + newLoc.latitude, + newLoc.longitude, + _lastProcessedLocation!.latitude, + _lastProcessedLocation!.longitude, + ); + if (d < _minMoveToProcess) { + _isProcessing = false; + return; + } + } + + Log.print( + "DEBUG: Location update - Speed: ${currentSpeed.toStringAsFixed(1)} km/h, Loc: $newLoc"); + + // Update total distance + if (_lastDistanceLocation != null) { + final d = Geolocator.distanceBetween( + _lastDistanceLocation!.latitude, + _lastDistanceLocation!.longitude, + newLoc.latitude, + newLoc.longitude, + ); + if (d > 5.0) totalDistance += d; + } + _lastDistanceLocation = newLoc; + + _oldLoc = myLocation ?? newLoc; + _targetLoc = newLoc; + + _oldHeading = _smoothedHeading; + if (currentSpeed > 1.5 && _oldLoc != null) { + _targetHeading = Geolocator.bearingBetween( + _oldLoc!.latitude, + _oldLoc!.longitude, + _targetLoc!.latitude, + _targetLoc!.longitude, + ); + } else { + _targetHeading = position.heading; + } + + _animController?.forward(from: 0.0); + _lastProcessedLocation = newLoc; + + if (isStyleLoaded) _updateCarMarker(); + + if (_fullRouteCoordinates.isNotEmpty) { + _updateTraveledPolylineSmart(newLoc); + _checkNavigationStep(newLoc); + _recomputeETA(); + _checkOffRoute(newLoc); + } + update(); + } catch (e) { + Log.print("DEBUG: Error in _handleLocationUpdate: $e"); + } finally { + _isProcessing = false; + } + } + + double _lerpAngle(double from, double to, double t) { + final double diff = ((to - from + 540.0) % 360.0) - 180.0; + return (from + diff * t + 360.0) % 360.0; + } + + void _checkOffRoute(LatLng pos) { + if (!isNavigating || _autoRecalcInProgress || isLoading) return; + if (_fullRouteCoordinates.isEmpty) return; + + const int searchWindow = 80; + final int start = _lastTraveledIndexInFullRoute; + final int end = min(start + searchWindow, _fullRouteCoordinates.length); + + double minDist = double.infinity; + for (int i = start; i < end; i++) { + final d = Geolocator.distanceBetween( + pos.latitude, + pos.longitude, + _fullRouteCoordinates[i].latitude, + _fullRouteCoordinates[i].longitude, + ); + if (d < minDist) minDist = d; + } + + if (minDist > _offRouteThresholdM) { + if (_offRouteStartTime == null) { + _offRouteStartTime = DateTime.now(); + } else { + final elapsed = + DateTime.now().difference(_offRouteStartTime!).inSeconds; + if (elapsed >= _offRouteTriggerSeconds) { + _offRouteStartTime = null; + _autoRecalcInProgress = true; + _smartRecalculateRoute(pos); + } + } + } else { + _offRouteStartTime = null; + } + } + + /// Recalculate immediately from the latest GPS point to the destination. + Future _smartRecalculateRoute(LatLng currentPos) async { + try { + if (_finalDestination != null) { + await recalculateRoute(origin: currentPos, keepNavigationActive: true); + } + _autoRecalcInProgress = false; + } catch (e) { + Log.print("DEBUG: Error in smart recalculate: $e"); + _autoRecalcInProgress = false; + } + } + + void _startBatchTimers() { + _recordTimer?.cancel(); + _uploadBatchTimer?.cancel(); + _recordTimer = Timer.periodic(_recordInterval, (_) => _recordToBuffer()); + _uploadBatchTimer = + Timer.periodic(_uploadInterval, (_) => _flushBufferToServer()); + } + + void _recordToBuffer() { + if (myLocation == null || + (myLocation!.latitude == 0 && myLocation!.longitude == 0)) { + return; + } + final now = DateTime.now(); + final distFromLast = _lastBufferedLocation == null + ? 999.0 + : Geolocator.distanceBetween( + _lastBufferedLocation!.latitude, + _lastBufferedLocation!.longitude, + myLocation!.latitude, + myLocation!.longitude); + final bool moved = distFromLast > _minMoveToRecord && currentSpeed > 0.5; + final bool timeForced = _lastBufferedTime == null || + now.difference(_lastBufferedTime!).inSeconds >= 60; + if (!moved && !timeForced) return; + + _lastBufferedLocation = myLocation; + _lastBufferedTime = now; + + _trackBuffer.add({ + 'lat': double.parse(myLocation!.latitude.toStringAsFixed(6)), + 'lng': double.parse(myLocation!.longitude.toStringAsFixed(6)), + 'spd': double.parse(currentSpeed.toStringAsFixed(1)), + 'head': _smoothedHeading.toStringAsFixed(0), + 'dist': double.parse(totalDistance.toStringAsFixed(1)), + 'ts': now.toIso8601String(), + }); + } + + Future _flushBufferToServer() async { + if (_trackBuffer.isEmpty) return; + final batch = List>.from(_trackBuffer); + _trackBuffer.clear(); + final String passengerId = (box.read(BoxName.passengerID) ?? '').toString(); + + try { + await CRUD().post( + link: '${AppLink.locationServerSide}/add_batch.php', + payload: { + 'driver_id': passengerId, + 'batch_data': jsonEncode(batch), + 'session_dist': totalDistance.toStringAsFixed(1), + }, + ); + } catch (e) { + _trackBuffer.insertAll(0, batch); + } + } + + Future _updateCarMarker() async { + // Car marker is now handled natively by myLocationEnabled: true. + } + + void animateCameraToPosition(LatLng position, + {double? zoom, double bearing = 0.0, double tilt = 0.0}) { + if (!_mapReady || mapController == null) return; + mapController!.animateCamera(CameraUpdate.newCameraPosition(CameraPosition( + target: position, + zoom: zoom ?? (isNavigating ? _targetZoom : 16.0), + bearing: bearing, + tilt: tilt))); + } + + Future _safeAnimateCameraBounds(LatLngBounds? bounds, + {double left = 60, + double top = 60, + double right = 60, + double bottom = 60}) async { + if (bounds == null || mapController == null) return; + try { + final latSpan = + (bounds.northeast.latitude - bounds.southwest.latitude).abs(); + final lngSpan = + (bounds.northeast.longitude - bounds.southwest.longitude).abs(); + if (latSpan < 0.0001 && lngSpan < 0.0001) { + mapController + ?.animateCamera(CameraUpdate.newLatLngZoom(bounds.northeast, 16)); + return; + } + await Future.delayed(const Duration(milliseconds: 200)); + await mapController?.animateCamera(CameraUpdate.newLatLngBounds(bounds, + left: left, top: top, right: right, bottom: bottom)); + } catch (e) { + try { + await mapController + ?.animateCamera(CameraUpdate.newLatLngZoom(bounds!.northeast, 14)); + } catch (_) {} + } + } + + void onUserPanned() { + _cameraLockedToUser = false; + update(); + } + + void relockCameraToUser() { + _cameraLockedToUser = true; + if (myLocation != null) { + animateCameraToPosition(myLocation!, + bearing: _smoothedHeading, zoom: _targetZoom, tilt: _targetTilt); + } + update(); + } + + bool get isCameraLocked => _cameraLockedToUser; + + void _updateTraveledPolylineSmart(LatLng currentPos) { + if (_fullRouteCoordinates.isEmpty) return; + const int searchWindow = 60; + final int startIndex = _lastTraveledIndexInFullRoute; + final int endIndex = + min(startIndex + searchWindow, _fullRouteCoordinates.length); + + double minDist = double.infinity; + int closestIdx = startIndex; + bool foundCloser = false; + + for (int i = startIndex; i < endIndex; i++) { + final d = Geolocator.distanceBetween( + currentPos.latitude, + currentPos.longitude, + _fullRouteCoordinates[i].latitude, + _fullRouteCoordinates[i].longitude, + ); + if (d < minDist) { + minDist = d; + closestIdx = i; + foundCloser = true; + } + } + + if (foundCloser && + minDist < 50 && + closestIdx > _lastTraveledIndexInFullRoute) { + _lastTraveledIndexInFullRoute = closestIdx; + _updatePolylinesSets(_fullRouteCoordinates.sublist(0, closestIdx + 1), + _fullRouteCoordinates.sublist(closestIdx)); + } + } + + Future _updatePolylinesSets( + List traveled, List remaining) async { + Log.print( + "DEBUG: Updating polylines. Traveled: ${traveled.length}, Remaining: ${remaining.length}"); + Set newPolylines = {}; + + // Render Alternative Routes first + for (int i = 0; i < routes.length; i++) { + if (i == selectedRouteIndex) continue; + newPolylines.add(Polyline( + polylineId: PolylineId('alt_$i'), + points: routes[i].coordinates, + color: const Color(0xFFB0BEC5).withOpacity(0.8), + width: 6, + )); + } + + if (remaining.isNotEmpty) { + newPolylines.add(Polyline( + polylineId: const PolylineId('remaining'), + points: remaining, + color: const Color(0xFF00E5FF), + width: 8, + )); + } + + if (traveled.isNotEmpty) { + newPolylines.add(Polyline( + polylineId: const PolylineId('traveled'), + points: traveled, + color: const Color(0xFFBDBDBD).withOpacity(0.6), + width: 5, + )); + } + + polylines = newPolylines; + update(); + } + + void selectRoute(int index) { + if (index < 0 || index >= routes.length) return; + selectedRouteIndex = index; + final r = routes[index]; + _fullRouteCoordinates = r.coordinates; + routeSteps = r.steps; + _routeTotalDistanceM = r.distanceM; + _routeTotalDurationS = r.durationS; + + _lastTraveledIndexInFullRoute = 0; + _recomputeETA(); + _updatePolylinesSets([], _fullRouteCoordinates); + update(); + } + + void goToFavorite(String type) { + LatLng? dest; + switch (type) { + case 'home': + dest = getHomeLatLng(); + break; + case 'work': + dest = getWorkLatLng(); + break; + case 'airport': + dest = getAirportLatLng(); + break; + } + + if (dest != null && myLocation != null) { + getRoute(myLocation!, dest); + } else { + mySnackbarWarning('الموقع غير متاح حالياً.'); + } + } + + LatLng? getHomeLatLng() { + final dynamic stored = box.read(BoxName.addHome); + if (stored != null && stored is String && stored.contains(',')) { + final parts = stored.split(','); + return LatLng(double.parse(parts[0]), double.parse(parts[1])); + } + return null; + } + + LatLng? getWorkLatLng() { + final dynamic stored = box.read(BoxName.addWork); + if (stored != null && stored is String && stored.contains(',')) { + final parts = stored.split(','); + return LatLng(double.parse(parts[0]), double.parse(parts[1])); + } + return null; + } + + LatLng getAirportLatLng() { + final String country = box.read(BoxName.countryCode) ?? 'JO'; + if (country == 'SY') { + return const LatLng(33.4111, 36.5147); // Damascus Airport + } + return const LatLng(31.7225, 35.9933); // Queen Alia Airport (JO) + } + + Future getRoute(LatLng origin, LatLng destination, + {bool keepNavigationActive = false}) async { + isLoading = true; + update(); + + final String langCode = box.read(BoxName.lang) ?? 'ar'; + final Map queryParams = { + 'fromLat': origin.latitude.toString(), + 'fromLng': origin.longitude.toString(), + 'toLat': destination.latitude.toString(), + 'toLng': destination.longitude.toString(), + 'steps': 'true', + 'alternatives': 'true', + 'locale': langCode, + }; + + if (_intermediateStop != null) { + queryParams['stop1Lat'] = _intermediateStop!.latitude.toString(); + queryParams['stop1Lng'] = _intermediateStop!.longitude.toString(); + } + final saasUri = + Uri.parse(AppLink.mapSaasRoute).replace(queryParameters: queryParams); + + try { + final response = + await http.get(saasUri, headers: {'x-api-key': Env.mapSaasKey}); + + if (response.statusCode != 200) { + isLoading = false; + update(); + mySnackbarWarning('تعذر الاتصال بخدمة التوجيه.'); + return; + } + + final data = jsonDecode(response.body); + + // ── Parse primary route (top-level in response) ── + routes.clear(); + final primaryPts = data['points']?.toString() ?? ""; + if (primaryPts.isNotEmpty) { + final coords = await compute>( + decodePolylineIsolate, primaryPts); + routes.add(RouteData( + coordinates: coords, + steps: List>.from(data['instructions'] ?? []), + distanceM: (data['distance'] as num).toDouble(), + durationS: (data['duration'] as num).toDouble(), + points: primaryPts, + )); + } + + // ── Parse alternative routes (in data['alternatives']) ── + // إذا كان هناك routes بديلة متاحة من API + if (data['alternatives'] != null && data['alternatives'] is List) { + _hasAlternativeRoutes = data['alternatives'].isNotEmpty; + for (var alt in data['alternatives']) { + final altPts = alt['points']?.toString() ?? ""; + if (altPts.isEmpty) continue; + final altCoords = await compute>( + decodePolylineIsolate, altPts); + routes.add(RouteData( + coordinates: altCoords, + steps: List>.from(alt['instructions'] ?? []), + distanceM: (alt['distance'] as num).toDouble(), + durationS: (alt['duration'] as num).toDouble(), + points: altPts, + )); + } + if (_hasAlternativeRoutes) { + Log.print("DEBUG: ${routes.length - 1} alternative routes available"); + } + } else { + _hasAlternativeRoutes = false; + } + + if (routes.isEmpty) { + isLoading = false; + update(); + mySnackbarWarning('لم يتم العثور على مسار.'); + return; + } + + selectedRouteIndex = 0; + final selected = routes[0]; + _fullRouteCoordinates = selected.coordinates; + routeSteps = selected.steps; + _routeTotalDistanceM = selected.distanceM; + _routeTotalDurationS = selected.durationS; + + _lastTraveledIndexInFullRoute = 0; + if (isStyleLoaded) _updatePolylinesSets([], _fullRouteCoordinates); + + if (_fullRouteCoordinates.isNotEmpty) { + OfflineMapService.instance + .downloadRegion(_fullRouteCoordinates.last, radiusKm: 2.0); + } + + _recomputeETA(); + + currentStepIndex = 0; + _nextInstructionSpoken = false; + + isNavigating = keepNavigationActive; + _cameraLockedToUser = keepNavigationActive; + _offRouteStartTime = null; + isLoading = false; + + update(); + + if (routeSteps.isNotEmpty) { + currentInstruction = routeSteps[0]['text'] ?? ""; + currentManeuverModifier = routeSteps[0]['sign'] ?? 0; + nextInstruction = routeSteps.length > 1 + ? (langCode == 'ar' + ? "ثم ${routeSteps[1]['text']}" + : "Then ${routeSteps[1]['text']}") + : (langCode == 'ar' ? "الوجهة النهائية" : "Destination"); + + if (!isMuted) { + Get.find().speakText(currentInstruction); + } + } + + // Re-add car marker after polyline updates (ensures it stays on top) + if (isStyleLoaded) _updateCarMarker(); + + if (keepNavigationActive && myLocation != null) { + animateCameraToPosition(myLocation!, + bearing: _smoothedHeading, zoom: _targetZoom, tilt: _targetTilt); + } else if (_fullRouteCoordinates.length >= 2) { + final bounds = + data['bbox'] != null && (data['bbox'] as List).length == 4 + ? LatLngBounds( + southwest: LatLng(data['bbox'][1], data['bbox'][0]), + northeast: LatLng(data['bbox'][3], data['bbox'][2])) + : _boundsFromLatLngList(_fullRouteCoordinates); + await _safeAnimateCameraBounds(bounds, + bottom: 320, top: 150, left: 50, right: 50); + } + update(); + } catch (e) { + isLoading = false; + update(); + Log.print("GetRoute Error: $e"); + } + } + + void _recomputeETA() { + if (_routeTotalDistanceM == 0 || _fullRouteCoordinates.isEmpty) return; + final fraction = + (_fullRouteCoordinates.length - _lastTraveledIndexInFullRoute) / + _fullRouteCoordinates.length; + final remainingM = _routeTotalDistanceM * fraction; + final remainingS = _routeTotalDurationS * fraction; + + // Distance + final String langCode = box.read(BoxName.lang) ?? 'ar'; + if (remainingM > 1000) { + totalDistanceRemaining = (remainingM / 1000).toStringAsFixed(1); + // We will handle the unit in the view or provide a unit string here + } else { + totalDistanceRemaining = remainingM.toStringAsFixed(0); + } + // New variable to hold formatted distance with unit + distanceWithUnit = _formatDistance(remainingM, langCode); + + // Time Remaining + final minutes = (remainingS / 60).round(); + estimatedTimeRemaining = minutes.toString(); + + // Arrival Time Calculation + final arrival = DateTime.now().add(Duration(seconds: remainingS.toInt())); + final h = arrival.hour > 12 + ? arrival.hour - 12 + : (arrival.hour == 0 ? 12 : arrival.hour); + final m = arrival.minute.toString().padLeft(2, '0'); + final ampm = arrival.hour >= 12 ? 'PM' : 'AM'; + arrivalTime = "$h:$m $ampm"; + } + + Future startNavigationTo(LatLng destination, + {String infoWindowTitle = ''}) async { + isLoading = true; + update(); + try { + _finalDestination = destination; + await clearRoute(isNewRoute: true); + + // Preserve car marker if it exists + markers = markers.where((m) => m.markerId.value == 'car').toSet(); + + markers.add(Marker( + markerId: const MarkerId('destination'), + position: destination, + icon: InlqBitmap.fromStyleImage('dest_icon'), + infoWindow: infoWindowTitle.isNotEmpty + ? InfoWindow(title: infoWindowTitle) + : InfoWindow.noText, + )); + + if (myLocation != null) { + markers.add(Marker( + markerId: const MarkerId('origin'), + position: myLocation!, + icon: InlqBitmap.fromStyleImage('start_icon'), + )); + await getRoute(myLocation!, destination); + } + } finally { + isLoading = false; + update(); + } + } + + Future recalculateRoute( + {LatLng? origin, bool keepNavigationActive = false}) async { + final LatLng? routeOrigin = origin ?? myLocation; + if (routeOrigin == null || _finalDestination == null || isLoading) return; + + isLoading = true; + update(); + + markers = markers.where((m) => m.markerId.value != 'origin').toSet(); + markers.add(Marker( + markerId: const MarkerId('origin'), + position: routeOrigin, + icon: InlqBitmap.fromStyleImage('start_icon'), + )); + + await getRoute(routeOrigin, _finalDestination!, + keepNavigationActive: keepNavigationActive); + isLoading = false; + update(); + } + + Future startActiveNavigation() async { + if (routes.isEmpty) { + mySnackbarWarning(box.read(BoxName.lang) == 'ar' + ? 'لا يوجد مسار لبدء الملاحة.' + : 'No route to start navigation.'); + return; + } + if (isNavigating) return; + + isNavigating = true; + _cameraLockedToUser = true; + + // Ensure ETA and distances are up-to-date + _lastTraveledIndexInFullRoute = _lastTraveledIndexInFullRoute; + _recomputeETA(); + + // Initialize current instruction if available + if (routeSteps.isNotEmpty && currentStepIndex < routeSteps.length) { + currentInstruction = routeSteps[currentStepIndex]['text'] ?? ""; + currentManeuverModifier = routeSteps[currentStepIndex]['sign'] ?? 0; + nextInstruction = (currentStepIndex + 1) < routeSteps.length + ? (box.read(BoxName.lang) == 'ar' + ? "ثم ${routeSteps[currentStepIndex + 1]['text']}" + : "Then ${routeSteps[currentStepIndex + 1]['text']}") + : (box.read(BoxName.lang) == 'ar' ? 'الوجهة' : 'Destination'); + + if (!isMuted) { + try { + Get.find().speakText(currentInstruction); + } catch (_) {} + } + } + + // Center camera on user for navigation mode + if (myLocation != null) { + animateCameraToPosition(myLocation!, + bearing: _smoothedHeading, zoom: _targetZoom, tilt: _targetTilt); + } + + update(); + } + + Future clearEverything() async { + placeDestinationController.clear(); + placesDestination = []; + await clearRoute(); + } + + Future clearRoute({bool isNewRoute = false}) async { + _offRouteStartTime = null; + _autoRecalcInProgress = false; + if (!isNewRoute) { + markers = {}; + polylines = {}; + circles = {}; + polygons = {}; + _finalDestination = null; + isNavigating = false; + routes = []; + await _flushBufferToServer(); + } + routeSteps = []; + _fullRouteCoordinates = []; + _lastTraveledIndexInFullRoute = 0; + currentInstruction = ""; + nextInstruction = ""; + currentManeuverModifier = "intaleq"; + distanceToNextStep = ""; + totalDistanceRemaining = ""; + estimatedTimeRemaining = ""; + arrivalTime = "--:--"; + _routeTotalDistanceM = 0; + _routeTotalDurationS = 0; + + if (!isNewRoute) { + await _updateCarMarker(); + } + update(); + } + + Future _loadCustomIcons() async { + if (mapController == null) return; + final carBytes = await rootBundle.load('assets/images/car.png'); + final startBytes = await rootBundle.load('assets/images/A.png'); + final destBytes = await rootBundle.load('assets/images/b.png'); + await mapController!.addImage('car_icon', carBytes.buffer.asUint8List()); + await mapController! + .addImage('start_icon', startBytes.buffer.asUint8List()); + await mapController!.addImage('dest_icon', destBytes.buffer.asUint8List()); + } + + void _checkNavigationStep(LatLng pos) { + if (routeSteps.isEmpty || currentStepIndex >= routeSteps.length) return; + + final interval = routeSteps[currentStepIndex]['interval'] as List; + final endIdx = interval[1] as int; + + if (endIdx >= _fullRouteCoordinates.length) return; + + final endLatLng = _fullRouteCoordinates[endIdx]; + final distance = Geolocator.distanceBetween( + pos.latitude, pos.longitude, endLatLng.latitude, endLatLng.longitude); + + distanceToNextStep = distance > 1000 + ? "${(distance / 1000).toStringAsFixed(1)} km" + : "${distance.toStringAsFixed(0)} m"; + + if (distance < 50 && + !_nextInstructionSpoken && + nextInstruction.isNotEmpty) { + if (!isMuted) { + Get.find().speakText(nextInstruction); + } + _nextInstructionSpoken = true; + } + if (distance < 20) _advanceStep(); + } + + void _advanceStep() { + currentStepIndex++; + final String langCode = box.read(BoxName.lang) ?? 'ar'; + if (currentStepIndex < routeSteps.length) { + currentInstruction = routeSteps[currentStepIndex]['text'] ?? ""; + currentManeuverModifier = routeSteps[currentStepIndex]['sign'] ?? 0; + nextInstruction = (currentStepIndex + 1) < routeSteps.length + ? (langCode == 'ar' + ? "ثم ${routeSteps[currentStepIndex + 1]['text']}" + : "Then ${routeSteps[currentStepIndex + 1]['text']}") + : (langCode == 'ar' ? "ستصل إلى وجهتك" : "Arriving soon"); + _nextInstructionSpoken = false; + update(); + } else { + _finishNavigation(); + } + } + + void _finishNavigation() { + final String langCode = box.read(BoxName.lang) ?? 'ar'; + currentInstruction = + langCode == 'ar' ? "لقد وصلت إلى وجهتك" : "You have arrived"; + currentManeuverModifier = 4; + nextInstruction = ""; + distanceToNextStep = ""; + isNavigating = false; + if (!isMuted) { + Get.find().speakText(currentInstruction); + } + _flushBufferToServer(); + update(); + } + + Future getPlaces() async { + final q = placeDestinationController.text.trim(); + if (q.length < 3) { + placesDestination = []; + update(); + return; + } + if (mapController == null) return; + + try { + // ✅ Use searchPlaces from intaleq_maps SDK + final results = await mapController!.searchPlaces(q); + + if (myLocation != null) { + for (final p in results) { + final plat = double.tryParse(p['latitude']?.toString() ?? '0') ?? 0.0; + final plng = + double.tryParse(p['longitude']?.toString() ?? '0') ?? 0.0; + p['distanceKm'] = _haversineKm( + myLocation!.latitude, myLocation!.longitude, plat, plng); + } + results.sort((a, b) => + (a['distanceKm'] as double).compareTo(b['distanceKm'] as double)); + } + + placesDestination = results; + update(); + } catch (e) { + Log.print('getPlaces error: $e'); + } + } + + Future selectDestination(dynamic place) async { + placeDestinationController.clear(); + placesDestination = []; + final lat = double.parse(place['latitude'].toString()); + final lng = double.parse(place['longitude'].toString()); + await startNavigationTo(LatLng(lat, lng), + infoWindowTitle: place['name'] ?? 'وجهة'); + } + + void onSearchChanged(String query) { + if (_debounce?.isActive ?? false) _debounce!.cancel(); + _debounce = Timer(const Duration(milliseconds: 500), () => getPlaces()); + } + + double _haversineKm(double lat1, double lon1, double lat2, double lon2) { + const R = 6371.0; + final dLat = (lat2 - lat1) * (pi / 180.0); + final dLon = (lon2 - lon1) * (pi / 180.0); + final a = sin(dLat / 2) * sin(dLat / 2) + + cos(lat1 * pi / 180) * + cos(lat2 * pi / 180) * + sin(dLon / 2) * + sin(dLon / 2); + return R * 2 * atan2(sqrt(a), sqrt(1 - a)); + } + + double _kmToLatDelta(double km) => km / 111.32; + double _kmToLngDelta(double km, double lat) => + km / (111.32 * cos(lat * pi / 180)); + LatLngBounds _boundsFromLatLngList(List list) { + double? x0, x1, y0, y1; + for (final ll in list) { + if (x0 == null) { + x0 = x1 = ll.latitude; + y0 = y1 = ll.longitude; + } else { + if (ll.latitude > x1!) x1 = ll.latitude; + if (ll.latitude < x0) x0 = ll.latitude; + if (ll.longitude > y1!) y1 = ll.longitude; + if (ll.longitude < y0!) y0 = ll.longitude; + } + } + return LatLngBounds( + northeast: LatLng(x1!, y1!), southwest: LatLng(x0!, y0!)); + } + + void setIntermediateStop(LatLng stop) { + _intermediateStop = stop; + if (myLocation != null && _finalDestination != null) { + getRoute(myLocation!, _finalDestination!); + } + update(); + } + + void clearIntermediateStop() { + _intermediateStop = null; + if (myLocation != null && _finalDestination != null) { + getRoute(myLocation!, _finalDestination!); + } + update(); + } + + String _formatDistance(double meters, String lang) { + if (meters >= 1000) { + return "${(meters / 1000).toStringAsFixed(1)} ${lang == 'ar' ? 'كم' : 'km'}"; + } else { + return "${meters.toStringAsFixed(0)} ${lang == 'ar' ? 'م' : 'm'}"; + } + } + + Future submitPlaceSuggestion(String name) async { + if (name.trim().isEmpty || myLocation == null) return; + isLoading = true; + update(); + try { + final payload = { + 'name': name, + 'lat': myLocation!.latitude.toString(), + 'lng': myLocation!.longitude.toString(), + 'passenger_id': box.read(BoxName.passengerID), + }; + await CRUD().post(link: AppLink.getPlacesSyria, payload: payload); + mySnackbarInfo(box.read(BoxName.lang) == 'ar' + ? "تم استلام اقتراحك! مكافأتك: +٥٠ نقطة" + : "Suggestion received! Reward: +50 points"); + } finally { + isLoading = false; + update(); + } + } +} diff --git a/siro_driver/lib/controller/home/navigation/navigation_view.dart b/siro_driver/lib/controller/home/navigation/navigation_view.dart new file mode 100644 index 0000000..db74684 --- /dev/null +++ b/siro_driver/lib/controller/home/navigation/navigation_view.dart @@ -0,0 +1,1154 @@ +import 'dart:math'; +import 'dart:ui'; +import 'package:flutter/material.dart'; +import 'package:flutter/services.dart'; +import 'package:get/get.dart'; +import 'package:intaleq_maps/intaleq_maps.dart'; +import 'package:siro_driver/env/env.dart'; +import 'package:siro_driver/controller/profile/setting_controller.dart'; + +import 'package:siro_driver/constant/box_name.dart'; +import 'package:siro_driver/constant/colors.dart'; +import 'package:siro_driver/main.dart'; +import 'package:siro_driver/views/widgets/error_snakbar.dart'; +import 'navigation_controller.dart'; + +// ─── Color Palette ────────────────────────────────────────────────────────── +Color get _kSurface => + Get.isDarkMode ? const Color(0xFF0F172A) : const Color(0xFFF8FAFC); +Color get _kCardColor => + Get.isDarkMode ? const Color(0xFF1E293B) : const Color(0xFFFFFFFF); +Color get _kOnSurface => + Get.isDarkMode ? const Color(0xFFF1F5F9) : const Color(0xFF0F172A); +Color get _kPrimary => const Color(0xFF2563EB); + +class NavigationView extends StatelessWidget { + const NavigationView({super.key}); + + @override + Widget build(BuildContext context) { + final NavigationController c = Get.put(NavigationController()); + final SettingController s = Get.find(); + + return AnnotatedRegion( + value: Get.isDarkMode + ? SystemUiOverlayStyle.light + : SystemUiOverlayStyle.dark, + child: Scaffold( + backgroundColor: _kSurface, + body: GetBuilder( + builder: (_) => Stack( + children: [ + // ── 1. Map Layer ────────────────────────────────────────────── + GetBuilder( + builder: (s) => IntaleqMap( + apiKey: Env.mapSaasKey, + onMapCreated: c.onMapCreated, + onLongPress: (pos) => c.onMapLongPressed(Point(0, 0), pos), + onTap: (pos) => c.onMapTapped(Point(0, 0), pos), + markers: c.markers, + polylines: c.polylines, + circles: c.circles, + polygons: c.polygons, + mapType: s.isMapDarkMode + ? IntaleqMapType.normal // Normal in IntaleqMap seems to be Dark + : IntaleqMapType.light, + initialCameraPosition: CameraPosition( + target: c.myLocation ?? const LatLng(33.5138, 36.2765), + zoom: 16.0), + myLocationEnabled: false, + ), + ), + + // ── 2. Top UI (Explore Mode) ────────────────────────────────── + if (!c.isNavigating) _ExploreTopUI(controller: c), + + // ── 3. Top UI (Active Navigation Banner) ── + if (c.isNavigating && c.currentInstruction.isNotEmpty) + _ActiveTopInstruction(controller: c), + + // ── 4. Explore Action Row ───────────────────────────────────── + if (!c.isNavigating) _ExploreActionRow(controller: c), + + // ── 5. Bottom Panel (Explore Mode) ──────────────────────────── + if (!c.isNavigating) _ExploreBottomPanel(controller: c), + + // ── 6. Bottom HUD (Active Navigation) ───────────────────────── + if (c.isNavigating) _ActiveBottomHUD(controller: c), + + // ── 7. Search Results Dropdown ──────────────────────────────── + if (c.placesDestination.isNotEmpty && !c.isNavigating) + _SearchResults(controller: c), + + // ── 8. Loading Overlay ──────────────────────────────────────── + if (c.isLoading) const _LoadingOverlay(), + + // ── 9. Location Picker Overlay (Place Creation) ────────────── + _LocationPickerOverlay(controller: c), + + // ── 10. Recenter Button ─────────────────────────────────────── + if (!c.isCameraLocked && !c.isNavigating) + Positioned( + right: 16, + bottom: 250, + child: _buildMapFAB( + icon: Icons.my_location_rounded, + onTap: () => c.relockCameraToUser(), + ), + ), + + // ── 11. Navigation Icon (Fixed Center) ──────────────────────── + if (c.isNavigating) const _NavigationCenterIcon(), + ], + ), + ), + ), + ); + } + + Widget _buildMapFAB({required IconData icon, required VoidCallback onTap}) { + return GestureDetector( + onTap: onTap, + child: Container( + width: 48, + height: 48, + decoration: BoxDecoration( + color: _kCardColor, + shape: BoxShape.circle, + boxShadow: [ + BoxShadow( + color: Colors.black.withOpacity(0.15), + blurRadius: 12, + offset: const Offset(0, 4), + ) + ], + ), + child: Icon(icon, color: _kPrimary, size: 22), + ), + ); + } +} + +class _NavigationCenterIcon extends StatelessWidget { + const _NavigationCenterIcon({Key? key}) : super(key: key); + + @override + Widget build(BuildContext context) { + return IgnorePointer( + child: Center( + child: Column( + mainAxisSize: MainAxisSize.min, + children: [ + Container( + decoration: BoxDecoration( + color: _kPrimary, + shape: BoxShape.circle, + boxShadow: [ + BoxShadow( + color: Colors.black.withOpacity(0.3), + blurRadius: 12, + offset: const Offset(0, 4), + ) + ], + border: Border.all(color: Colors.white, width: 3), + ), + padding: const EdgeInsets.all(12), + child: const Icon( + Icons.navigation_rounded, + color: Colors.white, + size: 32, + ), + ), + const SizedBox(height: 40), + ], + ), + ), + ); + } +} + +class _ExploreTopUI extends StatelessWidget { + final NavigationController controller; + const _ExploreTopUI({required this.controller}); + + @override + Widget build(BuildContext context) { + return Positioned( + top: 0, + left: 0, + right: 0, + child: SafeArea( + bottom: false, + child: Padding( + padding: const EdgeInsets.symmetric(horizontal: 16, vertical: 12), + child: Container( + decoration: BoxDecoration( + color: _kCardColor, + borderRadius: BorderRadius.circular(16), + boxShadow: [ + BoxShadow( + color: Colors.black.withOpacity(0.08), + blurRadius: 24, + offset: const Offset(0, 8), + ) + ], + ), + padding: const EdgeInsets.symmetric(horizontal: 8, vertical: 6), + child: Row( + children: [ + IconButton( + icon: Icon(Icons.menu_rounded, color: _kOnSurface, size: 24), + onPressed: () => Scaffold.of(context).openDrawer(), + ), + const SizedBox(width: 8), + Expanded( + child: TextField( + controller: controller.placeDestinationController, + onChanged: controller.onSearchChanged, + textInputAction: TextInputAction.search, + style: TextStyle( + fontSize: 16, + color: _kOnSurface, + fontWeight: FontWeight.w600), + decoration: InputDecoration( + hintText: box.read(BoxName.lang) == 'ar' + ? 'إلى أين؟' + : 'Where to?', + hintStyle: TextStyle( + color: _kOnSurface.withOpacity(0.4), fontSize: 16), + border: InputBorder.none, + isDense: true, + ), + ), + ), + if (controller.placeDestinationController.text.isNotEmpty || + controller.routes.isNotEmpty) + IconButton( + icon: Icon(Icons.close_rounded, + color: Colors.red.shade400, size: 22), + onPressed: () => controller.clearEverything(), + ) + else + Padding( + padding: const EdgeInsets.only(right: 8), + child: CircleAvatar( + radius: 18, + backgroundColor: _kPrimary, + child: const Icon(Icons.person_rounded, + color: Colors.white, size: 20), + ), + ), + ], + ), + ), + ), + ), + ); + } +} + +class _ExploreBottomPanel extends StatelessWidget { + final NavigationController controller; + const _ExploreBottomPanel({required this.controller}); + + @override + Widget build(BuildContext context) { + final bool hasRoutes = controller.routes.isNotEmpty; + final isArabic = box.read(BoxName.lang) == 'ar'; + final bottomPad = MediaQuery.of(context).padding.bottom; + + if (!hasRoutes) return const SizedBox.shrink(); + + return Positioned( + bottom: 0, + left: 0, + right: 0, + child: Container( + padding: EdgeInsets.only(bottom: bottomPad + 16, top: 16), + decoration: BoxDecoration( + color: _kCardColor, + borderRadius: const BorderRadius.vertical(top: Radius.circular(24)), + boxShadow: [ + BoxShadow( + color: Colors.black.withOpacity(0.1), + blurRadius: 32, + offset: const Offset(0, -4), + ) + ], + ), + child: Column( + mainAxisSize: MainAxisSize.min, + children: [ + Padding( + padding: const EdgeInsets.symmetric(horizontal: 16), + child: Row( + children: [ + Text( + isArabic ? 'المسارات المتاحة' : 'Available Routes', + style: TextStyle( + color: _kOnSurface, + fontWeight: FontWeight.bold, + fontSize: 14, + ), + ), + ], + ), + ), + const SizedBox(height: 12), + SizedBox( + height: 90, + child: ListView.builder( + padding: const EdgeInsets.symmetric(horizontal: 12), + scrollDirection: Axis.horizontal, + itemCount: controller.routes.length, + itemBuilder: (context, index) { + final r = controller.routes[index]; + final isSelected = controller.selectedRouteIndex == index; + return GestureDetector( + onTap: () => controller.selectRoute(index), + child: Container( + width: 140, + margin: const EdgeInsets.symmetric(horizontal: 4), + padding: const EdgeInsets.all(12), + decoration: BoxDecoration( + color: isSelected ? _kPrimary : _kSurface, + borderRadius: BorderRadius.circular(16), + border: Border.all( + color: isSelected ? _kPrimary : Colors.grey.shade300, + width: 1.5, + ), + ), + child: Column( + mainAxisAlignment: MainAxisAlignment.center, + children: [ + Icon( + Icons.route_rounded, + color: isSelected ? Colors.white : _kOnSurface, + ), + const SizedBox(height: 6), + Text( + "${(r.distanceM / 1000).toStringAsFixed(1)} km", + style: TextStyle( + color: isSelected ? Colors.white : _kOnSurface, + fontWeight: FontWeight.bold, + ), + ), + Text( + "${(r.durationS / 60).toInt()} min", + style: TextStyle( + color: isSelected + ? Colors.white70 + : _kOnSurface.withOpacity(0.6), + fontSize: 12, + ), + ), + ], + ), + ), + ); + }, + ), + ), + const SizedBox(height: 16), + Padding( + padding: const EdgeInsets.symmetric(horizontal: 24), + child: SizedBox( + width: double.infinity, + height: 52, + child: ElevatedButton( + style: ElevatedButton.styleFrom( + backgroundColor: _kPrimary, + elevation: 0, + shape: RoundedRectangleBorder( + borderRadius: BorderRadius.circular(16)), + ), + onPressed: () { + HapticFeedback.mediumImpact(); + controller.startActiveNavigation(); + }, + child: Row( + mainAxisAlignment: MainAxisAlignment.center, + children: [ + const Icon(Icons.navigation_rounded, + color: Colors.white, size: 20), + const SizedBox(width: 8), + Text(isArabic ? 'ابدأ الملاحة' : 'Start Navigation', + style: const TextStyle( + color: Colors.white, + fontSize: 16, + fontWeight: FontWeight.w700)), + ], + ), + ), + ), + ), + ], + ), + ), + ); + } +} + +class _ActiveTopInstruction extends StatelessWidget { + final NavigationController controller; + const _ActiveTopInstruction({required this.controller}); + + @override + Widget build(BuildContext context) { + return Positioned( + top: MediaQuery.of(context).padding.top + 12, + left: 16, + right: 16, + child: Container( + decoration: BoxDecoration( + color: const Color(0xFF1B5E20), + borderRadius: BorderRadius.circular(20), + boxShadow: [ + BoxShadow( + color: Colors.black.withOpacity(0.25), + blurRadius: 16, + offset: const Offset(0, 8)) + ], + ), + padding: const EdgeInsets.symmetric(horizontal: 16, vertical: 14), + child: Row( + children: [ + Container( + padding: const EdgeInsets.all(10), + decoration: BoxDecoration( + color: Colors.white.withOpacity(0.15), + shape: BoxShape.circle, + ), + child: Icon(controller.currentManeuverIcon, + color: Colors.white, size: 28), + ), + const SizedBox(width: 14), + Expanded( + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + mainAxisSize: MainAxisSize.min, + children: [ + Text( + controller.currentInstruction, + style: const TextStyle( + color: Colors.white, + fontSize: 18, + fontWeight: FontWeight.w700), + maxLines: 2, + overflow: TextOverflow.ellipsis, + ), + const SizedBox(height: 2), + Text( + controller.distanceToNextStep, + style: TextStyle( + color: Colors.white.withOpacity(0.8), + fontSize: 14, + fontWeight: FontWeight.w600), + ), + ], + ), + ), + ], + ), + ), + ); + } +} + +class _ActiveBottomHUD extends StatelessWidget { + final NavigationController controller; + const _ActiveBottomHUD({required this.controller}); + + @override + Widget build(BuildContext context) { + final bottomPad = MediaQuery.of(context).padding.bottom; + final isArabic = box.read(BoxName.lang) == 'ar'; + + return Positioned( + bottom: bottomPad + 16, + left: 16, + right: 16, + child: Row( + crossAxisAlignment: CrossAxisAlignment.end, + children: [ + Container( + width: 70, + height: 70, + decoration: BoxDecoration( + color: _kCardColor, + shape: BoxShape.circle, + border: Border.all(color: Colors.red, width: 3), + boxShadow: [ + BoxShadow(color: Colors.black.withOpacity(0.1), blurRadius: 10) + ], + ), + child: Column( + mainAxisAlignment: MainAxisAlignment.center, + children: [ + Text( + controller.currentSpeed.toStringAsFixed(0), + style: const TextStyle( + fontSize: 22, + fontWeight: FontWeight.w900, + color: Colors.black, + ), + ), + const Text( + 'km/h', + style: TextStyle( + fontSize: 10, + fontWeight: FontWeight.w600, + color: Colors.grey, + ), + ), + ], + ), + ), + const SizedBox(width: 12), + Expanded( + child: Container( + decoration: BoxDecoration( + color: _kCardColor, + borderRadius: BorderRadius.circular(24), + boxShadow: [ + BoxShadow( + color: Colors.black.withOpacity(0.15), + blurRadius: 24, + offset: const Offset(0, 8)) + ], + ), + padding: const EdgeInsets.all(16), + child: Column( + mainAxisSize: MainAxisSize.min, + children: [ + Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + Text( + controller.arrivalTime, + style: const TextStyle( + fontSize: 22, + fontWeight: FontWeight.w900, + color: Color(0xFF2563EB), + ), + ), + Text( + isArabic + ? '${controller.estimatedTimeRemaining} د' + : '${controller.estimatedTimeRemaining} min', + style: TextStyle( + fontSize: 16, + fontWeight: FontWeight.w600, + color: _kOnSurface, + ), + ), + Text( + controller.distanceWithUnit, + style: TextStyle( + fontSize: 16, + fontWeight: FontWeight.w600, + color: _kOnSurface.withOpacity(0.7), + ), + ), + ], + ), + const SizedBox(height: 14), + Row( + children: [ + _CircleIconBtn( + icon: controller.isMuted + ? Icons.volume_off_rounded + : Icons.volume_up_rounded, + color: const Color(0xFFE3F2FD), + iconColor: _kPrimary, + onTap: () => controller.toggleMute()), + const Spacer(), + GestureDetector( + onTap: () => controller.clearRoute(), + child: Container( + height: 44, + padding: const EdgeInsets.symmetric(horizontal: 32), + decoration: BoxDecoration( + color: Colors.red.shade600, + borderRadius: BorderRadius.circular(22), + ), + child: Center( + child: Text( + isArabic ? 'إنهاء' : 'End', + style: const TextStyle( + color: Colors.white, + fontSize: 15, + fontWeight: FontWeight.bold, + ), + ), + ), + ), + ), + ], + ), + ], + ), + ), + ), + ], + ), + ); + } +} + +class _CircleIconBtn extends StatelessWidget { + final IconData icon; + final Color color; + final Color iconColor; + final VoidCallback onTap; + const _CircleIconBtn( + {required this.icon, + required this.color, + required this.iconColor, + required this.onTap}); + + @override + Widget build(BuildContext context) { + return GestureDetector( + onTap: () { + HapticFeedback.lightImpact(); + onTap(); + }, + child: Container( + width: 44, + height: 44, + decoration: BoxDecoration(color: color, shape: BoxShape.circle), + child: Icon(icon, color: iconColor, size: 22), + ), + ); + } +} + +class _SearchResults extends StatelessWidget { + final NavigationController controller; + const _SearchResults({required this.controller}); + + @override + Widget build(BuildContext context) { + return Positioned( + top: MediaQuery.of(context).padding.top + 80, + left: 16, + right: 16, + child: Material( + color: _kCardColor, + borderRadius: BorderRadius.circular(16), + elevation: 4, + child: Container( + constraints: BoxConstraints( + maxHeight: MediaQuery.of(context).size.height * 0.4, + ), + child: ListView.separated( + shrinkWrap: true, + itemCount: controller.placesDestination.length, + separatorBuilder: (_, __) => + Divider(height: 1, color: _kOnSurface.withOpacity(0.1)), + itemBuilder: (context, index) { + final place = controller.placesDestination[index]; + return ListTile( + onTap: () => controller.selectDestination(place), + leading: Icon(Icons.location_on_rounded, color: _kPrimary), + title: Text( + place['name'] ?? 'Unknown', + style: TextStyle( + color: _kOnSurface, fontWeight: FontWeight.w600), + ), + subtitle: Text( + place['address'] ?? place['formatted_address'] ?? '', + maxLines: 1, + overflow: TextOverflow.ellipsis, + style: TextStyle( + color: _kOnSurface.withOpacity(0.5), fontSize: 12), + ), + ); + }, + ), + ), + ), + ); + } +} + +class _LoadingOverlay extends StatelessWidget { + const _LoadingOverlay(); + + @override + Widget build(BuildContext context) { + return Positioned.fill( + child: Container( + color: Colors.black38, + child: Center( + child: Container( + padding: const EdgeInsets.all(24), + decoration: BoxDecoration( + color: _kCardColor, + borderRadius: BorderRadius.circular(20), + ), + child: + const CircularProgressIndicator(color: AppColor.primaryColor), + ), + ), + ), + ); + } +} + +class _ExploreActionRow extends StatelessWidget { + final NavigationController controller; + const _ExploreActionRow({required this.controller}); + + @override + Widget build(BuildContext context) { + final bool hasRoutes = controller.routes.isNotEmpty; + final isAr = box.read(BoxName.lang) == 'ar'; + final double safeBottom = MediaQuery.of(context).padding.bottom; + + if (hasRoutes) return const SizedBox.shrink(); + + return Positioned( + bottom: safeBottom + 20, + left: 0, + right: 0, + child: SingleChildScrollView( + scrollDirection: Axis.horizontal, + padding: const EdgeInsets.symmetric(horizontal: 16), + physics: const BouncingScrollPhysics(), + child: Row( + children: [ + _ActionCapsule( + icon: Icons.add_rounded, + label: isAr ? 'إضافة' : 'Add', + onTap: () => controller.togglePlaceSelectionMode(), + isPrimary: true, + ), + _ActionCapsule( + icon: Icons.home_rounded, + label: isAr ? 'المنزل' : 'Home', + onTap: () => controller.goToFavorite('home'), + ), + _ActionCapsule( + icon: Icons.work_rounded, + label: isAr ? 'العمل' : 'Work', + onTap: () => controller.goToFavorite('work'), + ), + _ActionCapsule( + icon: Icons.bookmark_rounded, + label: isAr ? 'المحفوظات' : 'Saved', + onTap: () {}, + ), + ], + ), + ), + ); + } +} + +class _ActionCapsule extends StatelessWidget { + final IconData icon; + final String label; + final VoidCallback onTap; + final bool isPrimary; + + const _ActionCapsule({ + required this.icon, + required this.label, + required this.onTap, + this.isPrimary = false, + }); + + @override + Widget build(BuildContext context) { + Color bgColor; + Color textColor; + + if (isPrimary) { + bgColor = const Color(0xFF0D47A1).withOpacity(0.9); + textColor = Colors.white; + } else { + bgColor = _kCardColor.withOpacity(0.85); + textColor = _kOnSurface; + } + + return Padding( + padding: const EdgeInsets.only(right: 8), + child: GestureDetector( + onTap: () { + HapticFeedback.lightImpact(); + onTap(); + }, + child: ClipRRect( + borderRadius: BorderRadius.circular(50), + child: BackdropFilter( + filter: ImageFilter.blur(sigmaX: 12, sigmaY: 12), + child: Container( + padding: const EdgeInsets.symmetric(horizontal: 16, vertical: 12), + decoration: BoxDecoration( + color: bgColor, + borderRadius: BorderRadius.circular(50), + border: Border.all( + color: Colors.white.withOpacity(0.2), width: 1.2), + boxShadow: const [ + BoxShadow( + color: Color(0x14000000), + blurRadius: 8, + offset: Offset(0, 4)) + ], + ), + child: Row( + mainAxisSize: MainAxisSize.min, + children: [ + Icon(icon, size: 18, color: textColor), + const SizedBox(width: 8), + Text( + label, + style: TextStyle( + fontSize: 14, + fontWeight: FontWeight.w700, + color: textColor, + ), + ), + ], + ), + ), + ), + ), + ), + ); + } +} + +class _LocationPickerOverlay extends StatelessWidget { + final NavigationController controller; + const _LocationPickerOverlay({required this.controller}); + + @override + Widget build(BuildContext context) { + if (!controller.isSelectingPlaceLocation) return const SizedBox.shrink(); + + final isAr = box.read(BoxName.lang) == 'ar'; + + return Stack( + children: [ + IgnorePointer( + child: Container(color: Colors.black.withOpacity(0.1)), + ), + IgnorePointer( + child: Center( + child: Column( + mainAxisSize: MainAxisSize.min, + children: [ + Container( + padding: const EdgeInsets.all(8), + decoration: BoxDecoration( + color: Colors.white.withOpacity(0.9), + shape: BoxShape.circle, + boxShadow: [ + BoxShadow( + color: Colors.black.withOpacity(0.2), + blurRadius: 10, + offset: const Offset(0, 4)) + ], + ), + child: const Icon(Icons.add_location_alt_rounded, + color: Color(0xFF0D47A1), size: 40), + ), + const SizedBox(height: 40), + ], + ), + ), + ), + Positioned( + bottom: 110, + left: 32, + right: 32, + child: ElevatedButton( + style: ElevatedButton.styleFrom( + backgroundColor: const Color(0xFF1B5E20), + padding: const EdgeInsets.symmetric(vertical: 16), + shape: RoundedRectangleBorder( + borderRadius: BorderRadius.circular(16)), + elevation: 8, + shadowColor: const Color(0xFF1B5E20).withOpacity(0.5), + ), + onPressed: () => _showAddPlaceFormDialog(context, controller), + child: Row( + mainAxisAlignment: MainAxisAlignment.center, + children: [ + const Icon(Icons.check_circle_rounded, color: Colors.white), + const SizedBox(width: 12), + Text( + isAr ? 'تأكيد الموقع' : 'Confirm Location', + style: const TextStyle( + color: Colors.white, + fontSize: 18, + fontWeight: FontWeight.w800), + ), + ], + ), + ), + ), + Positioned( + top: 140, + left: 40, + right: 40, + child: IgnorePointer( + child: Container( + padding: const EdgeInsets.symmetric(horizontal: 16, vertical: 10), + decoration: BoxDecoration( + color: Colors.black.withOpacity(0.7), + borderRadius: BorderRadius.circular(30), + ), + child: Text( + isAr + ? "حرك الخريطة لتحديد موقع المكان" + : "Move map to pick place location", + textAlign: TextAlign.center, + style: const TextStyle(color: Colors.white, fontSize: 13), + ), + ), + ), + ), + Positioned( + top: 60, + right: 20, + child: FloatingActionButton.small( + backgroundColor: Colors.white, + elevation: 4, + child: const Icon(Icons.close_rounded, color: Colors.black87), + onPressed: () => controller.togglePlaceSelectionMode(), + ), + ), + ], + ); + } +} + +void _showAddPlaceFormDialog( + BuildContext context, NavigationController controller) { + final nameController = TextEditingController(); + final categoryNotifier = ValueNotifier?>(null); + final isAr = box.read(BoxName.lang) == 'ar'; + + Get.dialog( + AlertDialog( + shape: RoundedRectangleBorder(borderRadius: BorderRadius.circular(24)), + backgroundColor: _kCardColor, + title: Row( + children: [ + const Icon(Icons.add_business_rounded, + color: Color(0xFF0D47A1), size: 28), + const SizedBox(width: 12), + Text(isAr ? 'إضافة مكان جديد' : 'Add New Place', + style: + TextStyle(color: _kOnSurface, fontWeight: FontWeight.bold)), + ], + ), + content: SingleChildScrollView( + child: Column( + mainAxisSize: MainAxisSize.min, + crossAxisAlignment: CrossAxisAlignment.stretch, + children: [ + Text( + isAr + ? "ساهم في تحسين الخريطة بإضافة الأماكن الناقصة." + : "Help improve the map by adding missing places.", + style: + TextStyle(color: _kOnSurface.withOpacity(0.6), fontSize: 13), + ), + const SizedBox(height: 20), + TextField( + controller: nameController, + style: TextStyle(color: _kOnSurface), + decoration: InputDecoration( + labelText: isAr ? 'اسم المكان' : 'Place Name', + labelStyle: TextStyle(color: _kOnSurface.withOpacity(0.6)), + prefixIcon: Icon(Icons.label_rounded, + color: _kOnSurface.withOpacity(0.6)), + filled: true, + fillColor: _kSurface.withOpacity(0.3), + border: + OutlineInputBorder(borderRadius: BorderRadius.circular(12)), + ), + ), + const SizedBox(height: 16), + ValueListenableBuilder?>( + valueListenable: categoryNotifier, + builder: (context, selected, _) { + return InkWell( + onTap: () => _showCategoryPicker(context, (cat) { + categoryNotifier.value = cat; + }), + borderRadius: BorderRadius.circular(12), + child: Container( + padding: const EdgeInsets.symmetric( + horizontal: 12, vertical: 16), + decoration: BoxDecoration( + color: _kSurface.withOpacity(0.3), + borderRadius: BorderRadius.circular(12), + border: Border.all(color: Colors.grey.withOpacity(0.3)), + ), + child: Row( + children: [ + Icon(Icons.category_rounded, + color: _kOnSurface.withOpacity(0.6)), + const SizedBox(width: 12), + Expanded( + child: Text( + selected != null + ? (isAr ? selected['ar']! : selected['en']!) + : (isAr ? 'اختر الفئة' : 'Select Category'), + style: TextStyle( + color: selected != null + ? _kOnSurface + : _kOnSurface.withOpacity(0.4), + fontSize: 16, + ), + ), + ), + Icon(Icons.keyboard_arrow_down_rounded, + color: _kOnSurface.withOpacity(0.6)), + ], + ), + ), + ); + }), + const SizedBox(height: 24), + ElevatedButton( + style: ElevatedButton.styleFrom( + backgroundColor: const Color(0xFF0D47A1), + padding: const EdgeInsets.symmetric(vertical: 16), + shape: RoundedRectangleBorder( + borderRadius: BorderRadius.circular(12)), + ), + onPressed: () { + if (nameController.text.isNotEmpty && + categoryNotifier.value != null) { + Get.back(); + controller.submitNewPlace( + nameController.text, categoryNotifier.value!['id']!); + } else { + mySnackbarWarning( + isAr ? 'يرجى إكمال البيانات' : 'Please fill all fields'); + } + }, + child: Text(isAr ? 'إرسال' : 'Submit', + style: const TextStyle( + color: Colors.white, fontWeight: FontWeight.bold)), + ), + TextButton( + onPressed: () => Get.back(), + child: Text(isAr ? 'إلغاء' : 'Cancel', + style: TextStyle(color: _kOnSurface.withOpacity(0.6))), + ), + ], + ), + ), + ), + ); +} + +void _showCategoryPicker( + BuildContext context, Function(Map) onSelected) { + final isAr = box.read(BoxName.lang) == 'ar'; + + Get.bottomSheet( + Container( + decoration: BoxDecoration( + color: _kCardColor, + borderRadius: const BorderRadius.vertical(top: Radius.circular(24)), + ), + padding: const EdgeInsets.only(top: 12, bottom: 24), + child: Column( + mainAxisSize: MainAxisSize.min, + children: [ + Container( + width: 40, + height: 4, + decoration: BoxDecoration( + color: Colors.grey.withOpacity(0.3), + borderRadius: BorderRadius.circular(2), + ), + ), + const SizedBox(height: 16), + Text(isAr ? 'اختر الفئة' : 'Select Category', + style: TextStyle( + fontSize: 18, + fontWeight: FontWeight.bold, + color: _kOnSurface)), + const SizedBox(height: 16), + Flexible( + child: ListView.builder( + shrinkWrap: true, + itemCount: NavigationController.placeCategories.length, + itemBuilder: (context, index) { + final cat = NavigationController.placeCategories[index]; + return ListTile( + leading: Icon(_getIconData(cat['icon']!), + color: const Color(0xFF0D47A1)), + title: Text(isAr ? cat['ar']! : cat['en']!, + style: TextStyle( + color: _kOnSurface, fontWeight: FontWeight.w600)), + onTap: () { + HapticFeedback.lightImpact(); + onSelected(cat); + Get.back(); + }, + ); + }, + ), + ), + ], + ), + ), + isScrollControlled: true, + ); +} + +IconData _getIconData(String name) { + switch (name) { + case 'restaurant': + return Icons.restaurant_rounded; + case 'coffee': + return Icons.coffee_rounded; + case 'shopping_basket': + return Icons.shopping_basket_rounded; + case 'local_pharmacy': + return Icons.local_pharmacy_rounded; + case 'local_gas_station': + return Icons.local_gas_station_rounded; + case 'atm': + return Icons.atm_rounded; + case 'account_balance': + return Icons.account_balance_rounded; + case 'mosque': + return Icons.mosque_rounded; + case 'local_hospital': + return Icons.local_hospital_rounded; + case 'school': + return Icons.school_rounded; + case 'park': + return Icons.park_rounded; + case 'hotel': + return Icons.hotel_rounded; + case 'shopping_mall': + return Icons.store_rounded; + case 'fitness_center': + return Icons.fitness_center_rounded; + case 'content_cut': + return Icons.content_cut_rounded; + case 'bakery_dining': + return Icons.bakery_dining_rounded; + case 'local_laundry_service': + return Icons.local_laundry_service_rounded; + case 'build': + return Icons.build_rounded; + case 'gavel': + return Icons.gavel_rounded; + default: + return Icons.place_rounded; + } +} diff --git a/siro_driver/lib/controller/home/navigation/route_matcher_worker.dart b/siro_driver/lib/controller/home/navigation/route_matcher_worker.dart new file mode 100644 index 0000000..edf7ed4 --- /dev/null +++ b/siro_driver/lib/controller/home/navigation/route_matcher_worker.dart @@ -0,0 +1,145 @@ +// lib/controllers/navigation/route_matcher_worker.dart +import 'dart:async'; +import 'dart:isolate'; +import 'dart:typed_data'; +import 'package:intaleq_maps/intaleq_maps.dart'; +import 'dart:math'; + +/// Worker entrypoint (spawnUri/spawn). +/// Messages: +/// - init: {'type':'init','coords': Float64List} +/// - match: {'type':'match','id': int, 'lat': double, 'lng': double, 'lastIndex': int, 'window': int} +/// - dispose: {'type':'dispose'} +/// +/// Responses are sent back as Map via SendPort: +/// - {'type':'ready'} +/// - {'type':'matchResult','id': id, 'index': overallIndex, 'lat': lat, 'lng': lng, 'dist': meters} +void routeMatcherIsolateEntry(SendPort sendPort) { + final ReceivePort port = ReceivePort(); + sendPort.send({'type': 'ready', 'port': port.sendPort}); + + Float64List? flat; // [lat,lng,lat,lng,...] + int nPoints = 0; + + port.listen((dynamic message) { + try { + if (message is Map) { + final type = message['type'] as String? ?? ''; + if (type == 'init') { + final data = message['coords'] as Float64List?; + if (data != null) { + flat = data; + nPoints = flat!.length ~/ 2; + sendPort.send({'type': 'inited', 'points': nPoints}); + } else { + sendPort.send({'type': 'error', 'message': 'init missing coords'}); + } + } else if (type == 'match') { + if (flat == null) { + sendPort.send({'type': 'error', 'message': 'not inited'}); + return; + } + final int id = message['id'] as int; + final double lat = (message['lat'] as num).toDouble(); + final double lng = (message['lng'] as num).toDouble(); + final int lastIndex = (message['lastIndex'] as int?) ?? 0; + final int window = (message['window'] as int?) ?? 120; + + final result = + _findClosestWindowInternal(flat!, lat, lng, lastIndex, window); + sendPort.send({ + 'type': 'matchResult', + 'id': id, + 'index': result['index'], + 'lat': result['lat'], + 'lng': result['lng'], + 'dist': result['dist'] + }); + } else if (type == 'dispose') { + port.close(); + sendPort.send({'type': 'disposed'}); + } else { + sendPort.send({'type': 'error', 'message': 'unknown message type'}); + } + } + } catch (e, st) { + sendPort.send( + {'type': 'error', 'message': e.toString(), 'stack': st.toString()}); + } + }); +} + +/// Internal helper: projection on segments, windowed search. +/// Returns Map {index, lat, lng, dist} +Map _findClosestWindowInternal( + Float64List flat, double lat, double lng, int lastIndex, int window) { + final int n = flat.length ~/ 2; + final int start = max(0, lastIndex - window); + final int end = min(n - 1, lastIndex + window); + + double minDist = double.infinity; + int bestIdx = lastIndex; + double bestLat = flat[lastIndex * 2]; + double bestLng = flat[lastIndex * 2 + 1]; + + for (int i = start; i < end; i++) { + final double aLat = flat[i * 2]; + final double aLng = flat[i * 2 + 1]; + final double bLat = flat[(i + 1) * 2]; + final double bLng = flat[(i + 1) * 2 + 1]; + + final proj = _closestPointOnSegmentLatLng(lat, lng, aLat, aLng, bLat, bLng); + final double d = proj['dist'] as double; + if (d < minDist) { + minDist = d; + bestLat = proj['lat'] as double; + bestLng = proj['lng'] as double; + // choose overall index: i or i+1 depending on t + final double t = proj['t'] as double; + bestIdx = i + (t > 0.5 ? 1 : 0); + } + } + + return {'index': bestIdx, 'lat': bestLat, 'lng': bestLng, 'dist': minDist}; +} + +/// Projection math on geodetic points approximated in degrees (good for short distances). +Map _closestPointOnSegmentLatLng( + double px, double py, double ax, double ay, double bx, double by) { + // Here px=lat, py=lng; ax=lat, ay=lng, etc. + final double x0 = px; + final double y0 = py; + final double x1 = ax; + final double y1 = ay; + final double x2 = bx; + final double y2 = by; + + final double dx = x2 - x1; + final double dy = y2 - y1; + double t = 0.0; + final double len2 = dx * dx + dy * dy; + if (len2 > 0) { + t = ((x0 - x1) * dx + (y0 - y1) * dy) / len2; + if (t < 0) t = 0; + if (t > 1) t = 1; + } + final double projX = x1 + t * dx; + final double projY = y1 + t * dy; + + final double distMeters = _haversineDistanceMeters(x0, y0, projX, projY); + return {'lat': projX, 'lng': projY, 't': t, 'dist': distMeters}; +} + +/// Haversine distance (meters) +double _haversineDistanceMeters( + double lat1, double lng1, double lat2, double lng2) { + final double R = 6371000.0; + final double dLat = _deg2rad(lat2 - lat1); + final double dLon = _deg2rad(lng2 - lng1); + final double a = sin(dLat / 2) * sin(dLat / 2) + + cos(_deg2rad(lat1)) * cos(_deg2rad(lat2)) * sin(dLon / 2) * sin(dLon / 2); + final double c = 2 * atan2(sqrt(a), sqrt(1 - a)); + return R * c; +} + +double _deg2rad(double deg) => deg * pi / 180.0; diff --git a/siro_driver/lib/controller/home/payment/captain_wallet_controller.dart b/siro_driver/lib/controller/home/payment/captain_wallet_controller.dart new file mode 100755 index 0000000..47e0224 --- /dev/null +++ b/siro_driver/lib/controller/home/payment/captain_wallet_controller.dart @@ -0,0 +1,357 @@ +import 'dart:convert'; + +import 'package:local_auth/local_auth.dart'; +import 'package:siro_driver/constant/style.dart'; +import 'package:siro_driver/controller/firebase/firbase_messge.dart'; +import 'package:siro_driver/controller/firebase/local_notification.dart'; +import 'package:siro_driver/views/widgets/elevated_btn.dart'; +import 'package:siro_driver/views/widgets/error_snakbar.dart'; +import 'package:flutter/material.dart'; +import 'package:get/get.dart'; +import 'package:siro_driver/constant/box_name.dart'; +import 'package:siro_driver/constant/links.dart'; +import 'package:siro_driver/controller/functions/crud.dart'; +import 'package:siro_driver/main.dart'; + +import '../../../views/widgets/mydialoug.dart'; +import '../../firebase/notification_service.dart'; + +class CaptainWalletController extends GetxController { + bool isLoading = false; + final formKeyTransfer = GlobalKey(); + final formKeyAccount = GlobalKey(); + Map walletDate = {}; + Map walletDateVisa = {}; + Map walletDriverPointsDate = {}; + final formKey = GlobalKey(); + String totalAmount = '0'; + double kazan = 0; + String totalAmountVisa = '0'; + String totalPoints = '0'; + final amountFromBudgetController = TextEditingController(); + final newDriverPhoneController = TextEditingController(); + final phoneWallet = TextEditingController(); + final cardBank = TextEditingController(); + final bankCode = TextEditingController(); + + payFromBudget() async { + if (formKey.currentState!.validate()) { + var pointFromBudget = int.parse((amountFromBudgetController.text)); + + // await getPaymentId('fromBudgetToPoints', + // int.parse((amountFromBudgetController.text)) * -1); + var paymentToken3 = + await generateToken((pointFromBudget * -1).toString()); + var paymentID = await getPaymentId( + 'fromBudgetToPoints', (pointFromBudget * -1).toString()); + await CRUD().postWallet(link: AppLink.addDrivePayment, payload: { + 'amount': (pointFromBudget * -1).toString(), + 'rideId': paymentID.toString(), + 'payment_method': 'myBudget', + 'passengerID': 'myBudgetToPoint', + 'token': paymentToken3, + 'driverID': box.read(BoxName.driverID).toString(), + }); + Future.delayed(const Duration(seconds: 1)); + await addDriverWallet( + 'fromBudget', pointFromBudget.toString(), pointFromBudget.toString()); + update(); + Get.back(); + await refreshCaptainWallet(); + NotificationController().showNotification( + 'You have successfully charged your account'.tr, + '$pointFromBudget ${'has been added to your budget'.tr}', + 'tone1', + '', + ); + } + } + + Future refreshCaptainWallet() async { + await getCaptainWalletFromRide(); + await getCaptainWalletFromBuyPoints(); + // await checkAccountCaptainBank(); + } + + List amountToNewDriverMap = []; + bool isNewTransfer = false; + Future detectNewDriverFromMyBudget() async { + if (formKeyTransfer.currentState!.validate()) { + if (int.parse(amountFromBudgetController.text) < + double.parse(totalAmountVisa) && + int.parse(amountFromBudgetController.text) > 10) { + //get new driver details + isNewTransfer = true; + update(); + var res = await CRUD().get( + link: AppLink.getDriverDetails, + payload: {'driver_phone': '+2${newDriverPhoneController.text}'}); + isNewTransfer = false; + update(); + if (res != 'failure') { + var d = jsonDecode(res); + amountToNewDriverMap = d['data']; + // update(); + } else { + mySnackeBarError("This driver is not registered".tr); + } + } else { + mySnackeBarError('Your Budget less than needed'.tr); + } + } + } + + Future getCaptainWalletFromRide() async { + isLoading = true; + update(); + var res = await CRUD().getWallet( + link: AppLink.getAllPaymentFromRide, + payload: {'driverID': box.read(BoxName.driverID).toString()}, + ); + // isLoading = false; + if (res != 'failure') { + walletDate = jsonDecode(res); + totalAmount = walletDate['message'][0]['total_amount'] ?? '0'; + update(); + var res1 = await CRUD().getWallet( + link: AppLink.getAllPaymentVisa, + payload: {'driverID': box.read(BoxName.driverID).toString()}); + walletDateVisa = jsonDecode(res1); + totalAmountVisa = walletDateVisa['message'][0]['diff'].toString(); + + update(); + } else { + totalAmount = "0"; + totalAmountVisa = "0"; + } + } + + Future getCaptainWalletFromBuyPoints() async { + // isLoading = true; + update(); + + var res = await CRUD().getWallet( + link: AppLink.getDriverPaymentPoints, + payload: {'driverID': box.read(BoxName.driverID).toString()}, + ); + isLoading = false; + // update(); + + if (res != 'failure') { + walletDriverPointsDate = jsonDecode(res); + double totalPointsDouble = double.parse( + walletDriverPointsDate['message'][0]['total_amount'].toString()); + totalPoints = totalPointsDouble.toStringAsFixed(0); + } else { + totalPoints = '0'; + } + + update(); + } + + String paymentToken = ''; + Future generateToken(String amount) async { + var res = + await CRUD().postWallet(link: AppLink.addPaymentTokenDriver, payload: { + 'driverID': box.read(BoxName.driverID).toString(), + 'amount': amount.toString(), + }); + var d = (res); + return d['message']; + } + + // late String paymentID; + Future getPaymentId(String paymentMethod, amount) async { + // paymentToken = await generateToken(amount); + var res = + await CRUD().postWallet(link: AppLink.addDriverPaymentPoints, payload: { + 'driverID': box.read(BoxName.driverID).toString(), + 'amount': amount.toString(), + 'payment_method': paymentMethod.toString(), + }); + var d = (res); + // paymentID = d['message'].toString(); + return d['message']; + } + + Future addDriverWallet(String paymentMethod, point, count) async { + paymentToken = await generateToken(count); + var paymentID = await getPaymentId(paymentMethod, point.toString()); + await CRUD().postWallet(link: AppLink.addDriversWalletPoints, payload: { + 'driverID': box.read(BoxName.driverID).toString(), + 'paymentID': paymentID.toString(), + 'amount': point, + 'token': paymentToken, + 'paymentMethod': paymentMethod.toString(), + }); + } + + Future addDriverPayment(String paymentMethod, point, wayPay) async { + paymentToken = await generateToken(point); + var paymentID = await getPaymentId(paymentMethod, point.toString()); + await CRUD().postWallet(link: AppLink.addDrivePayment, payload: { + 'amount': point.toString(), + 'rideId': paymentID.toString(), + 'payment_method': paymentMethod, + 'passengerID': wayPay, + 'token': paymentToken, + 'driverID': box.read(BoxName.driverID).toString(), + }); + } + + Future addDriverWalletFromPromo(String paymentMethod, point) async { + var resPromotion = + await CRUD().postWallet(link: AppLink.addpromotionDriver, payload: { + 'driver_id': box.read(BoxName.driverID).toString(), + 'payment_amount': point, + 'timePromo': paymentMethod, + }); + if (resPromotion != 'failure') { + paymentToken = await generateToken(point); + var paymentID = await getPaymentId(paymentMethod, point.toString()); + var res = + await CRUD().postWallet(link: AppLink.addDrivePayment, payload: { + 'amount': point, + 'rideId': paymentID.toString(), + 'payment_method': paymentMethod.toString(), + 'passengerID': paymentMethod, + 'token': paymentToken, + 'driverID': box.read(BoxName.driverID).toString(), + }); + if (res != 'failure') { + String title = 'wallet_updated'.tr; // Notification title + String message = '${'wallet_credited_message'.tr} $point'; + String tone = 'default_tone'.tr; // Notification tone or sound + String payLoad = + 'wallet_updated'; // Additional data payload for the notification + + Get.find() + .showNotification(title, message, tone, payLoad); + } + } else { + Get.back(); + mySnackeBarError( + "A promotion record for this driver already exists for today.".tr); + } + } + + Future addDriverWalletToInvitor(String paymentMethod, driverID, point) async { + paymentToken = await generateToken(point); + var paymentID = await getPaymentId(paymentMethod, point.toString()); + await CRUD().postWallet(link: AppLink.addDrivePayment, payload: { + 'driverID': driverID, + 'amount': point, + 'token': paymentToken, + 'rideId': paymentID.toString(), + 'payment_method': paymentMethod.toString(), + 'passengerID': paymentMethod, + }); + await addSeferWallet(paymentMethod, + (double.parse(point) * -2).toString()); // deduct 2 from sefer wallet + } + + Future addSeferWallet(String paymentMethod, String point) async { + var seferToken = await generateToken(point.toString()); + await CRUD().postWallet(link: AppLink.addSeferWallet, payload: { + 'amount': point.toString(), + 'paymentMethod': paymentMethod, + 'passengerId': 'driver', + 'token': seferToken, + 'driverId': box.read(BoxName.driverID).toString(), + }); + } + + Future addTransferDriversWallet(String paymentMethod1, paymentMethod2) async { + var paymentID = + await getPaymentId(paymentMethod1, amountFromBudgetController.text); + paymentToken = await generateToken( + (int.parse(amountFromBudgetController.text) * -1).toString()); + + await CRUD().postWallet(link: AppLink.addDrivePayment, payload: { + 'amount': (int.parse(amountFromBudgetController.text) * -1).toString(), + 'rideId': paymentID.toString(), + 'payment_method': paymentMethod1, + 'passengerID': 'To ${amountToNewDriverMap[0]['id']}', + 'token': paymentToken, + 'driverID': box.read(BoxName.driverID).toString(), + }); + + paymentID = await getPaymentId(paymentMethod2, + (int.parse(amountFromBudgetController.text) - 5).toString()); + paymentToken = await generateToken(amountFromBudgetController.text); + var res1 = + await CRUD().postWallet(link: AppLink.addDriversWalletPoints, payload: { + 'driverID': amountToNewDriverMap[0]['id'].toString(), + 'paymentID': paymentID.toString(), + 'amount': ((int.parse(amountFromBudgetController.text) - 5)) + // kazan) // double.parse(kazan) .08 for egypt + .toStringAsFixed( + 0), // this will convert buddget to poitns by kazan .08 + + 'token': paymentToken, + 'paymentMethod': paymentMethod2.toString(), + }); + if (res1 != 'failure') { + // Get.find().sendNotificationToDriverMAP( + // 'Transfer', + // '${'You have transfer to your wallet from'.tr}' + // '${box.read(BoxName.nameDriver)}', + // amountToNewDriverMap[0]['token'].toString(), + // [], + // 'order1.wav'); + NotificationService.sendNotification( + target: amountToNewDriverMap[0]['token'].toString(), + title: 'Transfer'.tr, + body: '${'You have transfer to your wallet from'.tr}' + '${box.read(BoxName.nameDriver)}', + + isTopic: false, // Important: this is a token + tone: 'ding', + driverList: [], category: 'Transfer', + ); + await addSeferWallet('payout fee', '5'); + + Get.defaultDialog( + title: 'transfer Successful'.tr, + middleText: '', + titleStyle: AppStyle.title, + confirm: MyElevatedButton( + title: 'Ok'.tr, + onPressed: () async { + Get.back(); + Get.back(); + + await refreshCaptainWallet(); + })); + } + } + + + getKazanPercent() async { + var res = await CRUD().get( + link: AppLink.getKazanPercent, + payload: {'country': box.read(BoxName.countryCode).toString()}, + ); + if (res != 'failure') { + var json = jsonDecode(res); + kazan = double.parse(json['message'][0]['kazan'].toString()); + // naturePrice = double.parse(json['message'][0]['naturePrice']); + // heavyPrice = double.parse(json['message'][0]['heavyPrice']); + // latePrice = double.parse(json['message'][0]['latePrice']); + // comfortPrice = double.parse(json['message'][0]['comfortPrice']); + // speedPrice = double.parse(json['message'][0]['speedPrice']); + // deliveryPrice = double.parse(json['message'][0]['deliveryPrice']); + // mashwariPrice = double.parse(json['message'][0]['freePrice']); + // fuelPrice = double.parse(json['message'][0]['fuelPrice']); + } + update(); + } + + @override + void onInit() async { + // getKazanPercent(); + + await refreshCaptainWallet(); + super.onInit(); + } +} diff --git a/siro_driver/lib/controller/home/payment/credit_card_Controller.dart b/siro_driver/lib/controller/home/payment/credit_card_Controller.dart new file mode 100755 index 0000000..936fca3 --- /dev/null +++ b/siro_driver/lib/controller/home/payment/credit_card_Controller.dart @@ -0,0 +1,75 @@ +import 'package:flutter/material.dart'; +import 'package:get/get.dart'; + +import '../../../constant/box_name.dart'; +import '../../functions/digit_obsecur_formate.dart'; +import '../../functions/secure_storage.dart'; + +class CreditCardController extends GetxController { + final GlobalKey formKey = GlobalKey(); + final TextEditingController cardNumberController = TextEditingController(); + final TextEditingController cardHolderNameController = + TextEditingController(); + final TextEditingController expiryDateController = TextEditingController(); + final TextEditingController cvvCodeController = TextEditingController(); + openPayment() async { + String? cardNumber = await SecureStorage().readData(BoxName.cardNumber); + String? cardHolderName = + await SecureStorage().readData(BoxName.cardHolderName); + String? expiryDate = await SecureStorage().readData(BoxName.expiryDate); + String? cvvCode = await SecureStorage().readData(BoxName.cvvCode); + + if (cvvCode != null && cvvCode.isNotEmpty) { + final maskedCardNumber = DigitObscuringFormatter() + .formatEditUpdate( + TextEditingValue.empty, + TextEditingValue(text: cardNumber ?? ''), + ) + .text; + + cardNumberController.text = maskedCardNumber; + cardHolderNameController.text = cardHolderName ?? ''; + expiryDateController.text = expiryDate ?? ''; + cvvCodeController.text = cvvCode; + } + } + + @override + void onInit() async { + super.onInit(); + openPayment(); + // String? cardNumber = await SecureStorage().readData(BoxName.cardNumber); + // String? cardHolderName = + // await SecureStorage().readData(BoxName.cardHolderName); + // String? expiryDate = await SecureStorage().readData(BoxName.expiryDate); + // String? cvvCode = await SecureStorage().readData(BoxName.cvvCode); + + // if (cvvCode != null && cvvCode.isNotEmpty) { + // final maskedCardNumber = DigitObscuringFormatter() + // .formatEditUpdate( + // TextEditingValue.empty, + // TextEditingValue(text: cardNumber ?? ''), + // ) + // .text; + + // cardNumberController.text = maskedCardNumber; + // cardHolderNameController.text = cardHolderName ?? ''; + // expiryDateController.text = expiryDate ?? ''; + // cvvCodeController.text = cvvCode; + // } + } +} + +class CreditCardModel { + String cardNumber; + String cardHolderName; + String expiryDate; + String cvvCode; + + CreditCardModel({ + required this.cardNumber, + required this.cardHolderName, + required this.expiryDate, + required this.cvvCode, + }); +} diff --git a/siro_driver/lib/controller/home/payment/paymob_payout.dart b/siro_driver/lib/controller/home/payment/paymob_payout.dart new file mode 100755 index 0000000..f4d92ae --- /dev/null +++ b/siro_driver/lib/controller/home/payment/paymob_payout.dart @@ -0,0 +1,235 @@ +import 'dart:convert'; + +import 'package:local_auth/local_auth.dart'; +import 'package:siro_driver/constant/box_name.dart'; +import 'package:siro_driver/controller/payment/smsPaymnet/payment_services.dart'; +import 'package:siro_driver/main.dart'; +import 'package:siro_driver/views/widgets/error_snakbar.dart'; +import 'package:get/get.dart'; + +import '../../../constant/links.dart'; +import '../../../views/widgets/mydialoug.dart'; +import '../../functions/crud.dart'; +import 'captain_wallet_controller.dart'; + +class PaymobPayout extends GetxController { + bool isLoading = false; + String dropdownValue = 'etisalat'; + + int payOutFee = 5; + payToDriverWallet(String amount, String issuer, String msisdn) async { + bool isAvailable = await LocalAuthentication().isDeviceSupported(); + if (isAvailable) { + // Authenticate the user + bool didAuthenticate = await LocalAuthentication().authenticate( + localizedReason: 'Use Touch ID or Face ID to confirm payment', + // options: AuthenticationOptions( + biometricOnly: true, + sensitiveTransaction: true, + ); + if (didAuthenticate) { + // var dec = await CRUD() + // .postWallet(link: AppLink.paymobPayoutDriverWallet, payload: { + // "issuer": issuer, + // "method": "wallet", + // "amount": amount, //9.0, + // "full_name": + // '${box.read(BoxName.nameDriver)} ${box.read(BoxName.lastNameDriver)}', + // "msisdn": msisdn, //"01010101010", + // "bank_transaction_type": "cash_transfer" + // }); + // if (dec['disbursement_status'] == 'successful') { + // var paymentToken = await Get.find() + // .generateToken( + // ((-1) * (double.parse(dec['amount'].toString())) - payOutFee) + // .toStringAsFixed(0)); + // await CRUD().postWallet(link: AppLink.addDrivePayment, payload: { + // 'rideId': DateTime.now().toIso8601String(), + // 'amount': + // ((-1) * (double.parse(dec['amount'].toString())) - payOutFee) + // .toStringAsFixed(0), + // 'payment_method': 'payout', + // 'passengerID': 'myself', + // 'token': paymentToken, + // 'driverID': box.read(BoxName.driverID).toString(), + // }); + // await Get.find() + // .addSeferWallet('payout fee myself', payOutFee.toString()); + // await updatePaymentToPaid(box.read(BoxName.driverID).toString()); + // await sendEmail( + // box.read(BoxName.driverID).toString(), + // amount, + // box.read(BoxName.phoneDriver).toString(), + // box.read(BoxName.nameDriver).toString(), + // 'Wallet', + // box.read(BoxName.emailDriver).toString()); + + // mySnackbarSuccess('${'Transaction successful'.tr} ${dec['amount']}'); + + // Get.find().refreshCaptainWallet(); + // } else if (dec['disbursement_status'] == 'failed') { + // mySnackeBarError('Transaction failed'.tr); + // } + } else { + MyDialog().getDialog('Authentication failed'.tr, ''.tr, () { + Get.back(); + }); + } + } else { + MyDialog().getDialog('Biometric Authentication'.tr, + 'You should use Touch ID or Face ID to confirm payment'.tr, () { + Get.back(); + }); + } + } + + Future updatePaymentToPaid(String driverID) async { + await CRUD().postWallet(link: AppLink.updatePaymetToPaid, payload: { + 'driverID': driverID.toString(), + }); + } + + Future sendEmail( + String driverId, amount, phone, name, bankCardNumber, email) async { + await CRUD().sendEmail(AppLink.sendEmailToDrivertransaction, { + "driverID": driverId, + "total_amount": amount, + "phone": phone, + "name_arabic": name, + "accountBank": bankCardNumber, + "email": email + }); + } + + getAIKey(String key) async { + var res = + await CRUD().get(link: AppLink.getapiKey, payload: {"keyName": key}); + if (res != 'failure') { + var d = jsonDecode(res)['message']; + return d[key].toString(); + } else {} + } + + payToDriverBankAccount( + String amount, String bankCardNumber, String bankCode) async { + bool isAvailable = await LocalAuthentication().isDeviceSupported(); + if (isAvailable) { + // Authenticate the user + bool didAuthenticate = await LocalAuthentication().authenticate( + localizedReason: 'Use Touch ID or Face ID to confirm payment', + // options: AuthenticationOptions( + biometricOnly: true, + sensitiveTransaction: true, + ); + if (didAuthenticate) { + var body = { + "issuer": "bank_card", + "method": "bank_card", + "amount": amount, //9.0, + "full_name": + '${box.read(BoxName.nameDriver)} ${box.read(BoxName.lastNameDriver)}', + "bank_card_number": bankCardNumber, //"1111-2222-3333-4444", + "bank_code": bankCode, //"CIB", + "bank_transaction_type": "cash_transfer" + }; + var dec = await CRUD().postWallet( + link: + 'wl.tripz-egypt.com/v1/main/ride/payMob/paymob_driver/paymob_payout.php', + payload: body, + ); + if (dec['disbursement_status'] == 'successful') { + var paymentToken = await Get.find() + .generateToken( + ((-1) * (double.parse(dec['amount'].toString())) - payOutFee) + .toStringAsFixed(0)); + await CRUD().postWallet(link: AppLink.addDrivePayment, payload: { + 'rideId': DateTime.now().toIso8601String(), + 'amount': + ((-1) * (double.parse(dec['amount'].toString())) - payOutFee) + .toStringAsFixed(0), + 'payment_method': 'payout', + 'passengerID': 'myself', + 'token': paymentToken, + 'driverID': box.read(BoxName.driverID).toString(), + }); + await Get.find() + .addSeferWallet('payout fee myself', payOutFee.toString()); + await updatePaymentToPaid(box.read(BoxName.driverID).toString()); + await sendEmail( + box.read(BoxName.driverID).toString(), + amount, + box.read(BoxName.phoneDriver).toString(), + box.read(BoxName.nameDriver).toString(), + 'Wallet', + box.read(BoxName.emailDriver).toString()); + + mySnackbarSuccess('${'Transaction successful'.tr} ${dec['amount']}'); + Get.find().refreshCaptainWallet(); + } else if (dec['disbursement_status'] == 'failed') { + mySnackeBarError('Transaction failed'.tr); + } + } else { + MyDialog().getDialog('Authentication failed'.tr, ''.tr, () { + Get.back(); + }); + } + } else { + MyDialog().getDialog('Biometric Authentication'.tr, + 'You should use Touch ID or Face ID to confirm payment'.tr, () { + Get.back(); + }); + } + } + + Future payToWalletDriverAll( + String amount, String issuer, String msisdn) async { + bool isAvailable = await LocalAuthentication().isDeviceSupported(); + if (isAvailable) { + // Authenticate the user + bool didAuthenticate = await LocalAuthentication().authenticate( + localizedReason: 'Use Touch ID or Face ID to confirm payment', + // options: AuthenticationOptions( + biometricOnly: true, + sensitiveTransaction: true, + ); + if (didAuthenticate) { + await payToDriverWallet(amount, issuer, msisdn); + } else { + MyDialog().getDialog('Authentication failed'.tr, ''.tr, () { + Get.back(); + }); + } + } else { + MyDialog().getDialog('Biometric Authentication'.tr, + 'You should use Touch ID or Face ID to confirm payment'.tr, () { + Get.back(); + }); + } + } + + Future payToBankDriverAll( + String amount, String bankCardNumber, String bankCode) async { + bool isAvailable = await LocalAuthentication().isDeviceSupported(); + if (isAvailable) { + // Authenticate the user + bool didAuthenticate = await LocalAuthentication().authenticate( + localizedReason: 'Use Touch ID or Face ID to confirm payment', + // options: AuthenticationOptions( + biometricOnly: true, + sensitiveTransaction: true, + ); + if (didAuthenticate) { + await payToDriverBankAccount(amount, bankCardNumber, bankCode); + } else { + MyDialog().getDialog('Authentication failed'.tr, ''.tr, () { + Get.back(); + }); + } + } else { + MyDialog().getDialog('Biometric Authentication'.tr, + 'You should use Touch ID or Face ID to confirm payment'.tr, () { + Get.back(); + }); + } + } +} diff --git a/siro_driver/lib/controller/home/points_for_rider_controller.dart b/siro_driver/lib/controller/home/points_for_rider_controller.dart new file mode 100755 index 0000000..b2dab70 --- /dev/null +++ b/siro_driver/lib/controller/home/points_for_rider_controller.dart @@ -0,0 +1,147 @@ +import 'package:flutter/material.dart'; +import 'package:get/get.dart'; +import 'package:intaleq_maps/intaleq_maps.dart'; +import 'package:siro_driver/constant/style.dart'; + +import '../../constant/api_key.dart'; +import '../../constant/links.dart'; +import '../functions/crud.dart'; +import '../functions/location_controller.dart'; + +class PointsForRiderController extends GetxController { + List locations = []; + String hintTextDestinationPoint = 'Search for your destination'.tr; + TextEditingController placeStartController = TextEditingController(); + + void addLocation(String location) { + locations.add(location); + update(); + } + + void getTextFromList(String location) { + locations.add(location); + update(); + Get.back(); + } + + void removeLocation(int index) { + locations.removeAt(index); + update(); + } + + void onReorder(int oldIndex, int newIndex) { + if (newIndex > oldIndex) { + newIndex -= 1; + update(); + } + + final item = locations.removeAt(oldIndex); + locations.insert(newIndex, item); + update(); + } +} + +class LocationModel { + String name; + double lat, lon; + + LocationModel({required this.name, required this.lat, required this.lon}); +} + +class WayPointController extends GetxController { + // A list of text editing controllers for each text field + // final textFields = [TextEditingController()].obs; + List wayPoints = []; + List> placeListResponse = []; + double wayPointHeight = 400; + String hintTextDestinationPoint = 'Search for your destination'.tr; + TextEditingController textSearchCotroller = TextEditingController(); + // A list of places corresponding to each text field + final places = []; + + final hintTextPointList = []; + late LatLng myLocation; + + void addWayPoints() { + String wayPoint = 'Add a Stop'.tr; + + if (wayPoints.length < 5) { + wayPoints.add(wayPoint); + update(); + } else { + Get.defaultDialog( + title: 'This is most WayPoints', + titleStyle: AppStyle.title, + middleText: ''); + } + update(); + } + + void removeTextField(int index) { + wayPoints.removeAt(index); + + update(); + } + + // A method to reorder the text fields and the places + void reorderTextFields(int oldIndex, int newIndex) { + if (newIndex > oldIndex) { + newIndex -= 1; + } + final wayPoint = wayPoints.removeAt(oldIndex); + wayPoints.insert(newIndex, wayPoint); + update(); + } + + void updatePlace(int index, String input) async { + var url = + '${AppLink.googleMapsLink}place/nearbysearch/json?keyword=$input&location=${myLocation.latitude},${myLocation.longitude}&radius=50000&language=en&key=${AK.mapAPIKEY.toString()}'; + var response = await CRUD().getGoogleApi(link: url, payload: {}); + // final place = input; + // if (index == 0) { + List newList = []; + placeListResponse.add(newList); + newList = response['results']; + placeListResponse[index].add(newList); + update(); + // } + + update(); + } + + @override + void onInit() { + Get.put(LocationController()); + addWayPoints(); + myLocation = Get.find().myLocation; + super.onInit(); + } +} + +class PlaceList extends StatelessWidget { + // Get the controller instance + final controller = Get.put(WayPointController()); + + @override + Widget build(BuildContext context) { + // Use the Obx widget to rebuild the widget when the controller changes + return Obx(() { + // Use the ListView widget to display the list of places + return ListView( + // The children of the list are the places + children: [ + // Loop through the places in the controller + for (final place in controller.places) + // Create a text widget for each place + Text( + // Use the place as the text + place, + + // Add some style and padding + style: const TextStyle(fontSize: 18.0), + ), + ], + ); + }); + } +} diff --git a/siro_driver/lib/controller/home/profile/complaint_controller.dart b/siro_driver/lib/controller/home/profile/complaint_controller.dart new file mode 100644 index 0000000..d7cee3d --- /dev/null +++ b/siro_driver/lib/controller/home/profile/complaint_controller.dart @@ -0,0 +1,201 @@ +import 'dart:convert'; +import 'dart:io'; + +import 'package:flutter/material.dart'; +import 'package:get/get.dart'; +import 'package:http/http.dart' as http; +import 'package:siro_driver/constant/box_name.dart'; +import 'package:siro_driver/constant/links.dart'; +import 'package:siro_driver/controller/functions/crud.dart'; +import 'package:siro_driver/main.dart'; +import 'package:http_parser/http_parser.dart'; +import 'package:mime/mime.dart'; +import 'package:siro_driver/controller/functions/encrypt_decrypt.dart'; +import 'package:siro_driver/env/env.dart'; +import 'package:siro_driver/print.dart'; +import 'package:siro_driver/views/widgets/error_snakbar.dart'; +import 'package:siro_driver/views/widgets/mydialoug.dart'; + +class ComplaintController extends GetxController { + bool isLoading = false; + final formKey = GlobalKey(); + final complaintController = TextEditingController(); + + List ridesList = []; + Map? selectedRide; + + Map? passengerReport; + Map? driverReport; + + var isUploading = false.obs; + var uploadSuccess = false.obs; + String audioLink = ''; // سيتم تخزين رابط الصوت هنا بعد الرفع + String attachedFileName = ''; + + @override + void onInit() { + super.onInit(); + getLatestRidesForDriver(); + } + + void _showCustomSnackbar(String title, String message, + {bool isError = false}) { + if (title.toLowerCase() == 'success') { + mySnackbarSuccess(message.tr); + } else if (isError) { + mySnackeBarError(message.tr); + } else { + mySnackbarWarning(message.tr); + } + } + + Future getLatestRidesForDriver() async { + isLoading = true; + update(); + try { + var res = await CRUD().get(link: AppLink.getRides, payload: { + 'driver_id': box.read(BoxName.driverID).toString(), + }); + if (res != 'failure' && res != 'no_internet') { + var decoded = jsonDecode(res); + if (decoded['status'] == 'success') { + ridesList = decoded['data'] ?? []; + if (ridesList.isNotEmpty) { + selectedRide = ridesList[0]; + } + } + } + } catch (e) { + Log.print("Error getting driver rides: $e"); + } finally { + isLoading = false; + update(); + } + } + + void selectRide(Map ride) { + selectedRide = ride; + audioLink = ''; + attachedFileName = ''; + update(); + } + + Future uploadAudioFile(File audioFile) async { + try { + isUploading.value = true; + update(); + + var uri = Uri.parse(AppLink.uploadAudio); + var request = http.MultipartRequest('POST', uri); + String token = r(box.read(BoxName.jwt)).toString().split(Env.addd)[0]; + final String fingerPrint = box.read(BoxName.deviceFingerprint)?.toString() ?? ''; + + var mimeType = lookupMimeType(audioFile.path); + request.headers.addAll({ + 'Authorization': 'Bearer $token', + 'X-Device-FP': fingerPrint, + }); + request.files.add( + await http.MultipartFile.fromPath( + 'audio', + audioFile.path, + contentType: mimeType != null ? MediaType.parse(mimeType) : null, + ), + ); + + var response = await request.send(); + var responseBody = await http.Response.fromStream(response); + + if (response.statusCode == 200) { + var jsonResponse = jsonDecode(responseBody.body); + if (jsonResponse['status'] == 'Audio file uploaded successfully.') { + uploadSuccess.value = true; + audioLink = jsonResponse['link']; + attachedFileName = audioFile.path.split('/').last; + _showCustomSnackbar('Success', 'Audio uploaded successfully.'); + } else { + uploadSuccess.value = false; + _showCustomSnackbar('Error', 'Failed to upload audio file.', + isError: true); + } + } else { + uploadSuccess.value = false; + _showCustomSnackbar('Error', 'Server error: ${response.statusCode}', + isError: true); + } + } catch (e) { + uploadSuccess.value = false; + _showCustomSnackbar( + 'Error', 'An application error occurred during upload.', + isError: true); + } finally { + isUploading.value = false; + update(); + } + } + + Future submitComplaintToServer() async { + if (!formKey.currentState!.validate() || complaintController.text.isEmpty) { + _showCustomSnackbar( + 'Error', 'Please describe your issue before submitting.', + isError: true); + return; + } + + if (selectedRide == null) { + _showCustomSnackbar('Error', 'Please select a ride before submitting.', + isError: true); + return; + } + + isLoading = true; + update(); + + try { + final rideId = selectedRide!['id'].toString(); + final complaint = complaintController.text; + + final responseData = await CRUD().post( + link: AppLink.add_solve_all, + payload: { + 'ride_id': rideId, + 'complaint_text': complaint, + 'audio_link': audioLink, + }, + ); + + if (responseData == 'failure' || responseData == 'no_internet' || responseData == 'token_expired') { + _showCustomSnackbar( + 'Error', 'Failed to connect to the server. Please try again.', + isError: true); + return; + } + + if (responseData['status'] == 'success') { + passengerReport = responseData['data']['passenger_response']; + driverReport = responseData['data']['driver_response']; + update(); + + MyDialogContent().getDialog( + 'Success'.tr, Text('Your complaint has been submitted.'.tr), () { + Get.back(); + complaintController.clear(); + audioLink = ''; + attachedFileName = ''; + formKey.currentState?.reset(); + }); + } else { + String errorMessage = + responseData['message'] ?? 'An unknown server error occurred'.tr; + _showCustomSnackbar('Submission Failed', errorMessage, isError: true); + } + } catch (e) { + Log.print("Submit Complaint Error: $e"); + _showCustomSnackbar('Error', 'An application error occurred.'.tr, + isError: true); + } finally { + isLoading = false; + update(); + } + } +} diff --git a/siro_driver/lib/controller/home/profile/feed_back_controller.dart b/siro_driver/lib/controller/home/profile/feed_back_controller.dart new file mode 100755 index 0000000..2b5b232 --- /dev/null +++ b/siro_driver/lib/controller/home/profile/feed_back_controller.dart @@ -0,0 +1,44 @@ +import 'dart:convert'; + +import 'package:flutter/material.dart'; +import 'package:get/get.dart'; +import 'package:siro_driver/constant/box_name.dart'; +import 'package:siro_driver/constant/colors.dart'; +import 'package:siro_driver/constant/links.dart'; +import 'package:siro_driver/constant/style.dart'; +import 'package:siro_driver/controller/functions/crud.dart'; +import 'package:siro_driver/main.dart'; +import 'package:siro_driver/views/widgets/elevated_btn.dart'; + +class FeedBackController extends GetxController { + bool isLoading = false; + final formKey = GlobalKey(); + final feedbackController = TextEditingController(); + + void addFeedBack() async { + isLoading = true; + update(); + var res = await CRUD().post(link: AppLink.addFeedBack, payload: { + 'passengerId': box.read(BoxName.passengerID).toString(), + 'feedBack': feedbackController.text + }); + var d = jsonDecode(res); + if (d['status'].toString() == 'success') { + Get.defaultDialog( + title: 'Success'.tr, + titleStyle: AppStyle.title, + middleText: 'Feedback data saved successfully'.tr, + middleTextStyle: AppStyle.title, + confirm: MyElevatedButton( + kolor: AppColor.greenColor, + title: 'Ok'.tr, + onPressed: () { + Get.back(); + Get.back(); + })); + } + + isLoading = false; + update(); + } +} diff --git a/siro_driver/lib/controller/home/profile/order_history_controller.dart b/siro_driver/lib/controller/home/profile/order_history_controller.dart new file mode 100755 index 0000000..f71ba67 --- /dev/null +++ b/siro_driver/lib/controller/home/profile/order_history_controller.dart @@ -0,0 +1,35 @@ +import 'dart:convert'; + +import 'package:get/get.dart'; +import 'package:siro_driver/constant/box_name.dart'; +import 'package:siro_driver/constant/links.dart'; +import 'package:siro_driver/controller/functions/crud.dart'; +import 'package:siro_driver/main.dart'; + +class OrderHistoryController extends GetxController { + List orderHistoryListPassenger = []; + bool isloading = true; + + @override + void onInit() { + getOrderHistoryByPassenger(); + super.onInit(); + } + + Future getOrderHistoryByPassenger() async { + var res = await CRUD().get(link: AppLink.getRides, payload: { + 'passenger_id': box.read(BoxName.passengerID).toString(), + }); + if (res.toString() == 'failure') { + // Get.snackbar('failure', 'message'); + isloading = false; + update(); + } else { + var jsonDecoded = jsonDecode(res); + + orderHistoryListPassenger = jsonDecoded['data']; + isloading = false; + update(); + } + } +} diff --git a/siro_driver/lib/controller/home/profile/promos_controller.dart b/siro_driver/lib/controller/home/profile/promos_controller.dart new file mode 100755 index 0000000..60970fe --- /dev/null +++ b/siro_driver/lib/controller/home/profile/promos_controller.dart @@ -0,0 +1,42 @@ +import 'dart:convert'; + +import 'package:get/get.dart'; +import 'package:siro_driver/constant/links.dart'; +import 'package:siro_driver/constant/style.dart'; +import 'package:siro_driver/controller/functions/crud.dart'; +import 'package:siro_driver/views/widgets/elevated_btn.dart'; + +class PromosController extends GetxController { + List promoList = []; + bool isLoading = true; + late String promos; + @override + void onInit() { + getPromoByToday(); + super.onInit(); + } + + Future getPromoByToday() async { + var res = await CRUD().get(link: AppLink.getPromoBytody, payload: {}); + if (res.toString() == 'failure') { + Get.defaultDialog( + title: 'No Promo for today .'.tr, + middleText: '', + titleStyle: AppStyle.title, + confirm: MyElevatedButton( + title: 'Back'.tr, + onPressed: () { + Get.back(); + Get.back(); + })); + isLoading = false; + update(); + } else { + var jsonDecoded = jsonDecode(res); + + promoList = jsonDecoded['message']; + isLoading = false; + update(); + } + } +} diff --git a/siro_driver/lib/controller/home/splash_screen_controlle.dart b/siro_driver/lib/controller/home/splash_screen_controlle.dart new file mode 100755 index 0000000..b8b3341 --- /dev/null +++ b/siro_driver/lib/controller/home/splash_screen_controlle.dart @@ -0,0 +1,164 @@ +import 'dart:async'; +import 'dart:math'; + +import 'package:flutter/material.dart'; +import 'package:get/get.dart'; +import 'package:package_info_plus/package_info_plus.dart'; +import 'package:siro_driver/controller/auth/captin/login_captin_controller.dart'; +import 'package:siro_driver/views/auth/captin/login_captin.dart'; +import 'package:siro_driver/views/home/on_boarding_page.dart'; +import '../functions/app_update_controller.dart'; + +import '../../constant/box_name.dart'; +import '../../main.dart'; +import '../../onbording_page.dart'; +import '../../print.dart'; +import '../functions/encrypt_decrypt.dart'; +import '../functions/package_info.dart'; +import '../functions/secure_storage.dart'; +import '../functions/security_checks.dart'; + +// Assuming you have a home page to navigate to after successful login. +// If not, you might need to adjust the navigation target. +// import 'package:siro_driver/views/home/home_page.dart'; + +class SplashScreenController extends GetxController + with GetTickerProviderStateMixin { + late AnimationController _animationController; + late Animation animation; + final progress = 0.0.obs; + Timer? _progressTimer; + + String packageInfo = ''; + + @override + void onInit() { + super.onInit(); + Get.put(AppUpdateController()); // تهيئة متحكم التحديثات الذكي + _setupAnimations(); + _initializeAndNavigate(); + checkSecurity(); + } + + checkSecurity() async { + final random = Random(); + + if (random.nextBool()) { + await SecurityHelper.performSecurityChecks(); + } else { + await SecurityChecks.isDeviceRootedFromNative(Get.context!); + } + } + + void _setupAnimations() { + _animationController = AnimationController( + vsync: this, + duration: const Duration(milliseconds: 1500), + ); + animation = + CurvedAnimation(parent: _animationController, curve: Curves.easeInOut); + _animationController.forward(); + } + + /// This is the core function that initializes the app. + /// It runs two tasks simultaneously and navigates only when necessary. + Future _initializeAndNavigate() async { + // Start getting package info, no need to wait for it. + _getPackageInfo(); + + const minSplashDurationMs = 4000; + _animateProgressBar(minSplashDurationMs); + + // Define the two concurrent tasks + final minDuration = + Future.delayed(const Duration(milliseconds: minSplashDurationMs)); + final navigationTargetFuture = _getNavigationTarget(); + + // Wait for both tasks to complete + await Future.wait([minDuration, navigationTargetFuture]); + + // The future now returns a nullable Widget (Widget?) + final Widget? targetPage = await navigationTargetFuture; + + // *** FIX: Only navigate if the targetPage is not null. *** + // This prevents navigating again if the login function already handled it. + if (targetPage != null) { + Get.off(() => targetPage, + transition: Transition.fadeIn, + duration: const Duration(milliseconds: 500)); + } else { + Log.print( + "Navigation was handled internally by the login process. Splash screen will not navigate."); + } + } + + /// Animates the progress bar over a given duration. + void _animateProgressBar(int totalMilliseconds) { + const interval = 50; + int elapsed = 0; + _progressTimer?.cancel(); + _progressTimer = + Timer.periodic(const Duration(milliseconds: interval), (timer) { + elapsed += interval; + progress.value = (elapsed / totalMilliseconds).clamp(0.0, 1.0); + if (elapsed >= totalMilliseconds) { + timer.cancel(); + } + }); + } + + /// Determines the correct page to navigate to, or returns null if navigation + /// is expected to be handled by an internal process (like login). + Future _getNavigationTarget() async { + try { + // 1) Onboarding + final doneOnboarding = box.read(BoxName.onBoarding) == 'yes'; + if (!doneOnboarding) { + // الأفضل: رجّع الواجهة بدل Get.off داخل الدالة + return OnBoardingPage(); + } + + // 2) Login + final isDriverDataAvailable = box.read(BoxName.phoneDriver) != null; + if (!isDriverDataAvailable) { + return LoginCaptin(); + } + + final loginController = Get.put(LoginDriverController()); + + final AppInitializer initializer = AppInitializer(); + await initializer.initializeApp(); + await EncryptionHelper.initialize(); + + await loginController.loginWithGoogleCredential( + box.read(BoxName.driverID).toString(), + box.read(BoxName.emailDriver).toString(), + ); + + return null; // لأن loginWithGoogleCredential يوجّه + } catch (e) { + Log.print("Error during navigation logic: $e"); + return LoginCaptin(); + } + } + + Future _getPackageInfo() async { + try { + final info = await PackageInfo.fromPlatform(); + packageInfo = info.version; + await box.write(BoxName.packagInfo, packageInfo); + update(); // To update any UI element that might be listening + } catch (e) { + Log.print("Could not get package info: $e"); + packageInfo = '1.0.0'; // Default value + await box.write(BoxName.packagInfo, packageInfo); + } + } + + @override + void onClose() { + _progressTimer?.cancel(); + _animationController.dispose(); + super.onClose(); + } +} diff --git a/siro_driver/lib/controller/home/statistics/statistics_controller.dart b/siro_driver/lib/controller/home/statistics/statistics_controller.dart new file mode 100644 index 0000000..8bcbdd7 --- /dev/null +++ b/siro_driver/lib/controller/home/statistics/statistics_controller.dart @@ -0,0 +1,212 @@ +import 'dart:convert'; +import 'package:flutter/material.dart'; +import 'package:get/get.dart'; +import 'package:siro_driver/constant/box_name.dart'; +import 'package:siro_driver/constant/links.dart'; +import 'package:siro_driver/controller/functions/crud.dart'; +import 'package:siro_driver/models/model/driver/rides_summary_model.dart'; +import '../../../main.dart'; + +class StatisticsController extends GetxController { + bool isLoading = false; + + // ═══ Weekly Data ═══ + List weeklyStats = []; + double weeklyEarnings = 0; + int weeklyTrips = 0; + double weeklyHours = 0; + + // ═══ Monthly Data ═══ + List monthlyEarnings = []; + List monthlyRides = []; + List monthlyDuration = []; + double monthlyTotalEarnings = 0; + int monthlyTotalTrips = 0; + double monthlyTotalHours = 0; + String bestDay = '--'; + double bestDayEarnings = 0; + + // ═══ Tab State ═══ + int selectedTab = 0; // 0=weekly, 1=monthly + + @override + void onInit() { + super.onInit(); + reloadData(); + } + + void changeTab(int tab) { + selectedTab = tab; + update(); + } + + // ═══════ جلب البيانات الأسبوعية ═══════ + Future fetchWeeklyData() async { + isLoading = true; + update(); + + try { + var res = await CRUD().get( + link: AppLink.getWeeklyAggregate, + payload: { + 'driver_id': box.read(BoxName.driverID).toString(), + }, + ); + + if (res != null && res != 'failure') { + var data = jsonDecode(res); + if (data['message'] is List) { + weeklyStats = (data['message'] as List) + .map((e) => DayStat.fromJson(e)) + .toList(); + weeklyEarnings = weeklyStats.fold(0, (s, d) => s + d.earnings); + weeklyTrips = weeklyStats.fold(0, (s, d) => s + d.trips); + weeklyHours = weeklyStats.fold(0, (s, d) => s + d.hours); + } + } + } catch (e) { + debugPrint('❌ [Stats] Weekly fetch error: $e'); + // Fallback: generate from local data + _generateLocalWeeklyData(); + } + + isLoading = false; + update(); + } + + // ═══════ جلب البيانات الشهرية ═══════ + Future fetchMonthlyData() async { + try { + // 1. أرباح شهرية + var earningsRes = await CRUD().getWallet( + link: AppLink.getAllPaymentFromRide, + payload: {'driverID': box.read(BoxName.driverID).toString()}, + ); + if (earningsRes != null && earningsRes != 'failure') { + var data = jsonDecode(earningsRes); + if (data['message'] is List) { + monthlyEarnings = (data['message'] as List) + .map((e) => MonthlyPriceDriverModel.fromJson(e)) + .toList(); + monthlyTotalEarnings = + monthlyEarnings.fold(0, (s, d) => s + d.pricePerDay); + + // أفضل يوم + if (monthlyEarnings.isNotEmpty) { + var best = monthlyEarnings + .reduce((a, b) => a.pricePerDay > b.pricePerDay ? a : b); + bestDay = best.day.toString(); + bestDayEarnings = best.pricePerDay; + } + } + } + + // 2. رحلات شهرية + var ridesRes = await CRUD().get( + link: AppLink.getRidesDriverByDay, + payload: {'driver_id': box.read(BoxName.driverID).toString()}, + ); + if (ridesRes != null && ridesRes != 'failure') { + var data = jsonDecode(ridesRes); + if (data['message'] is List) { + monthlyRides = (data['message'] as List) + .map((e) => MonthlyRideModel.fromJson(e)) + .toList(); + monthlyTotalTrips = monthlyRides.fold(0, (s, d) => s + d.countRide); + } + } + + // 3. ساعات شهرية + var durationRes = await CRUD().get( + link: AppLink.getTotalDriverDuration, + payload: {'driver_id': box.read(BoxName.driverID).toString()}, + ); + if (durationRes != null && durationRes != 'failure') { + var data = jsonDecode(durationRes); + if (data['message'] is List) { + monthlyDuration = (data['message'] as List) + .map((e) => MonthlyDataModel.fromJson(e)) + .toList(); + monthlyTotalHours = + monthlyDuration.fold(0, (s, d) => s + d.totalDuration.toDouble()); + } + } + } catch (e) { + debugPrint('❌ [Stats] Monthly fetch error: $e'); + } + + update(); + } + + void _generateLocalWeeklyData() { + // Fallback بيانات محلية عند عدم توفر الـ API + final now = DateTime.now(); + weeklyStats = List.generate(7, (i) { + final day = now.subtract(Duration(days: 6 - i)); + return DayStat( + date: day, + dayName: _getDayName(day.weekday), + earnings: 0, + trips: 0, + hours: 0, + ); + }); + } + + String _getDayName(int weekday) { + const days = ['Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat', 'Sun']; + return days[weekday - 1]; + } + + bool _isFetching = false; + + Future reloadData() async { + if (_isFetching) return; + _isFetching = true; + isLoading = true; + update(); + + try { + debugPrint('📊 [Statistics] Reloading data...'); + await fetchWeeklyData(); + await fetchMonthlyData(); + debugPrint('📊 [Statistics] Data reload complete.'); + } catch (e) { + debugPrint('❌ [Statistics] Error reloading data: $e'); + } finally { + _isFetching = false; + isLoading = false; + update(); + } + } +} + +// ═══════ نموذج إحصائية اليوم ═══════ +class DayStat { + final DateTime date; + final String dayName; + final double earnings; + final int trips; + final double hours; + + DayStat({ + required this.date, + required this.dayName, + required this.earnings, + required this.trips, + required this.hours, + }); + + factory DayStat.fromJson(Map json) { + final date = + DateTime.tryParse(json['day']?.toString() ?? '') ?? DateTime.now(); + const dayNames = ['Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat', 'Sun']; + return DayStat( + date: date, + dayName: dayNames[date.weekday - 1], + earnings: double.tryParse(json['earnings']?.toString() ?? '0') ?? 0, + trips: int.tryParse(json['trips']?.toString() ?? '0') ?? 0, + hours: double.tryParse(json['hours']?.toString() ?? '0') ?? 0, + ); + } +} diff --git a/siro_driver/lib/controller/local/local_controller.dart b/siro_driver/lib/controller/local/local_controller.dart new file mode 100755 index 0000000..38a726b --- /dev/null +++ b/siro_driver/lib/controller/local/local_controller.dart @@ -0,0 +1,60 @@ +import 'package:flutter/material.dart'; +import 'package:get/get.dart'; + +import '../../constant/box_name.dart'; +import '../../main.dart'; +import '../themes/themes.dart'; +import '../profile/setting_controller.dart'; + +class LocaleController extends GetxController { + Locale? language; + String countryCode = ''; + + ThemeData get appTheme { + String lang = box.read(BoxName.lang) ?? 'en'; + bool isDarkMode = box.read('isDarkMode') ?? false; + return _getThemeFor(lang, isDarkMode); + } + + ThemeData get lightTheme { + String lang = box.read(BoxName.lang) ?? 'en'; + return _getThemeFor(lang, false); + } + + ThemeData get darkTheme { + String lang = box.read(BoxName.lang) ?? 'en'; + return _getThemeFor(lang, true); + } + + ThemeData _getThemeFor(String lang, bool isDarkMode) { + if (lang.startsWith('ar')) { + return isDarkMode ? darkThemeArabic : lightThemeArabic; + } else { + return isDarkMode ? darkThemeEnglish : lightThemeEnglish; + } + } + + void refreshTheme() { + update(); + } + + void changeLang(String langcode) { + Locale locale = Locale(langcode); + box.write(BoxName.lang, langcode); + Get.updateLocale(locale); + update(); + } + + + @override + void onInit() { + String? storedLang = box.read(BoxName.lang); + if (storedLang == null) { + storedLang = Get.deviceLocale!.languageCode; + box.write(BoxName.lang, storedLang); + } + language = Locale(storedLang); + super.onInit(); + } +} + diff --git a/siro_driver/lib/controller/local/phone_intel/countries.dart b/siro_driver/lib/controller/local/phone_intel/countries.dart new file mode 100644 index 0000000..528d4fa --- /dev/null +++ b/siro_driver/lib/controller/local/phone_intel/countries.dart @@ -0,0 +1,7574 @@ +// see: https://en.wikipedia.org/wiki/List_of_country_calling_codes +// for list of country/calling codes + +const List countries = [ + Country( + name: "Afghanistan", + nameTranslations: { + "sk": "Afganistan", + "se": "Afghanistan", + "pl": "Afganistan", + "no": "Afghanistan", + "ja": "アフガニスタン", + "it": "Afghanistan", + "zh": "阿富汗", + "nl": "Afghanistan", + "de": "Afghanistan", + "fr": "Afghanistan", + "es": "Afganistán", + "en": "Afghanistan", + "pt_BR": "Afeganistão", + "sr-Cyrl": "Авганистан", + "sr-Latn": "Avganistan", + "zh_TW": "阿富汗", + "tr": "Afganistan", + "ro": "Afganistan", + "ar": "أفغانستان", + "fa": "افغانستان", + "yue": "阿富汗" + }, + flag: "🇦🇫", + code: "AF", + dialCode: "93", + minLength: 9, + maxLength: 9, + ), + Country( + name: "Åland Islands", + nameTranslations: { + "sk": "Alandy", + "se": "Ålánda", + "pl": "Wyspy Alandzkie", + "no": "Åland", + "ja": "オーランド諸島", + "it": "Isole Åland", + "zh": "奥兰群岛", + "nl": "Åland", + "de": "Ålandinseln", + "fr": "Îles Åland", + "es": "Islas Åland", + "en": "Åland Islands", + "pt_BR": "Ilhas Aland", + "sr-Cyrl": "Аландска Острва", + "sr-Latn": "Alandska Ostrva", + "zh_TW": "奧蘭群島", + "tr": "Åland", + "ro": "Insulele Åland", + "ar": "جزر أولاند", + "fa": "جزیره اولاند", + "yue": "奧蘭群島" + }, + flag: "🇦🇽", + code: "AX", + dialCode: "358", + minLength: 15, + maxLength: 15, + ), + Country( + name: "Albania", + nameTranslations: { + "sk": "Albánsko", + "se": "Albánia", + "pl": "Albania", + "no": "Albania", + "ja": "アルバニア", + "it": "Albania", + "zh": "阿尔巴尼亚", + "nl": "Albanië", + "de": "Albanien", + "fr": "Albanie", + "es": "Albania", + "en": "Albania", + "pt_BR": "Albânia", + "sr-Cyrl": "Албанија", + "sr-Latn": "Albanija", + "zh_TW": "阿爾巴尼亞", + "tr": "Arnavutluk", + "ro": "Albania", + "ar": "ألبانيا", + "fa": "آلبانی", + "yue": "阿爾巴尼亞" + }, + flag: "🇦🇱", + code: "AL", + dialCode: "355", + minLength: 9, + maxLength: 9, + ), + Country( + name: "Algeria", + nameTranslations: { + "sk": "Alžírsko", + "se": "Algeria", + "pl": "Algieria", + "no": "Algerie", + "ja": "アルジェリア", + "it": "Algeria", + "zh": "阿尔及利亚", + "nl": "Algerije", + "de": "Algerien", + "fr": "Algérie", + "es": "Argelia", + "en": "Algeria", + "pt_BR": "Argélia", + "sr-Cyrl": "Аргентина", + "sr-Latn": "Argentina", + "zh_TW": "阿爾及利亞", + "tr": "Cezayir", + "ro": "Algeria", + "ar": "الجزائر", + "fa": "الجزیره", + "yue": "阿爾及利亞" + }, + flag: "🇩🇿", + code: "DZ", + dialCode: "213", + minLength: 9, + maxLength: 9, + ), + Country( + name: "American Samoa", + nameTranslations: { + "sk": "Americká Samoa", + "se": "Amerihká Samoa", + "pl": "Samoa Amerykańskie", + "no": "Amerikansk Samoa", + "ja": "米領サモア", + "it": "Samoa americane", + "zh": "美属萨摩亚", + "nl": "Amerikaans-Samoa", + "de": "Amerikanisch-Samoa", + "fr": "Samoa américaines", + "es": "Samoa Americana", + "en": "American Samoa", + "pt_BR": "Samoa Americana", + "sr-Cyrl": "Америчка Самоа", + "sr-Latn": "Američka Samoa", + "zh_TW": "美屬薩摩亞", + "tr": "Amerikan Samoası", + "ro": "Samoa Americană", + "ar": "ساموا الأمريكية", + "fa": "ساموا آمریکا", + "yue": "美屬薩摩亞" + }, + flag: "🇦🇸", + code: "AS", + dialCode: "1684", + minLength: 7, + maxLength: 7, + ), + Country( + name: "Andorra", + nameTranslations: { + "sk": "Andorra", + "se": "Andorra", + "pl": "Andora", + "no": "Andorra", + "ja": "アンドラ", + "it": "Andorra", + "zh": "安道尔", + "nl": "Andorra", + "de": "Andorra", + "fr": "Andorre", + "es": "Andorra", + "en": "Andorra", + "pt_BR": "Andorra", + "sr-Cyrl": "Андора", + "sr-Latn": "Andora", + "zh_TW": "安道爾", + "tr": "Andora", + "ro": "Andorra", + "ar": "أندورا", + "fa": "آندورا", + "yue": "安道爾" + }, + flag: "🇦🇩", + code: "AD", + dialCode: "376", + minLength: 6, + maxLength: 6, + ), + Country( + name: "Angola", + nameTranslations: { + "sk": "Angola", + "se": "Angola", + "pl": "Angola", + "no": "Angola", + "ja": "アンゴラ", + "it": "Angola", + "zh": "安哥拉", + "nl": "Angola", + "de": "Angola", + "fr": "Angola", + "es": "Angola", + "en": "Angola", + "pt_BR": "Angola", + "sr-Cyrl": "Ангола", + "sr-Latn": "Angola", + "zh_TW": "安哥拉", + "tr": "Angola", + "ro": "Angola", + "ar": "أنغولا", + "fa": "آنگولا", + "yue": "安哥拉" + }, + flag: "🇦🇴", + code: "AO", + dialCode: "244", + minLength: 9, + maxLength: 9, + ), + Country( + name: "Anguilla", + nameTranslations: { + "sk": "Anguilla", + "se": "Anguilla", + "pl": "Anguilla", + "no": "Anguilla", + "ja": "アンギラ", + "it": "Anguilla", + "zh": "安圭拉", + "nl": "Anguilla", + "de": "Anguilla", + "fr": "Anguilla", + "es": "Anguila", + "en": "Anguilla", + "pt_BR": "Anguilla", + "sr-Cyrl": "Ангвила", + "sr-Latn": "Angvila", + "zh_TW": "安圭拉", + "tr": "Anguilla", + "ro": "Anguilla", + "ar": "أنغويلا", + "fa": "آنگولیا", + "yue": "安圭拉" + }, + flag: "🇦🇮", + code: "AI", + dialCode: "1264", + minLength: 7, + maxLength: 7, + ), + Country( + name: "Antarctica", + nameTranslations: { + "sk": "Antarktída", + "se": "Antárktis", + "pl": "Antarktyda", + "no": "Antarktis", + "ja": "南極", + "it": "Antartide", + "zh": "南极洲", + "nl": "Antarctica", + "de": "Antarktis", + "fr": "Antarctique", + "es": "Antártida", + "en": "Antarctica", + "pt_BR": "Antártica", + "sr-Cyrl": "Антарктик", + "sr-Latn": "Antarktik", + "zh_TW": "南極", + "tr": "Antarktika", + "ro": "Antarctica", + "ar": "القارة القطبية الجنوبية", + "fa": "قطب جنوب", + "yue": "南极洲" + }, + flag: "🇦🇶", + code: "AQ", + dialCode: "672", + minLength: 6, + maxLength: 6, + ), + Country( + name: "Antigua and Barbuda", + nameTranslations: { + "sk": "Antigua a Barbuda", + "se": "Antigua ja Barbuda", + "pl": "Antigua i Barbuda", + "no": "Antigua og Barbuda", + "ja": "アンティグア・バーブーダ", + "it": "Antigua e Barbuda", + "zh": "安提瓜和巴布达", + "nl": "Antigua en Barbuda", + "de": "Antigua und Barbuda", + "fr": "Antigua-et-Barbuda", + "es": "Antigua y Barbuda", + "en": "Antigua & Barbuda", + "pt_BR": "Antigua e Barbuda", + "sr-Cyrl": "Антигва и Барбуда", + "sr-Latn": "Antigva i Barbuda", + "zh_TW": "安提瓜和巴布達", + "tr": "Antigua ve Barbuda", + "ro": "Antigua şi Barbuda", + "ar": "أنتيغوا وباربودا", + "fa": "آنتیگوآ و باربودا", + "yue": "安提瓜同巴布达" + }, + flag: "🇦🇬", + code: "AG", + dialCode: "1268", + minLength: 7, + maxLength: 7, + ), + Country( + name: "Argentina", + nameTranslations: { + "sk": "Argentína", + "se": "Argentina", + "pl": "Argentyna", + "no": "Argentina", + "ja": "アルゼンチン", + "it": "Argentina", + "zh": "阿根廷", + "nl": "Argentinië", + "de": "Argentinien", + "fr": "Argentine", + "es": "Argentina", + "en": "Argentina", + "pt_BR": "Argentina", + "sr-Cyrl": "Аргентина", + "sr-Latn": "Argentina", + "zh_TW": "阿根廷", + "tr": "Arjantin", + "ro": "Argentina", + "ar": "الأرجنتين", + "fa": "آرژانتین", + "yue": "阿根廷" + }, + flag: "🇦🇷", + code: "AR", + dialCode: "54", + minLength: 12, + maxLength: 12, + ), + Country( + name: "Armenia", + nameTranslations: { + "sk": "Arménsko", + "se": "Armenia", + "pl": "Armenia", + "no": "Armenia", + "ja": "アルメニア", + "it": "Armenia", + "zh": "亚美尼亚", + "nl": "Armenië", + "de": "Armenien", + "fr": "Arménie", + "es": "Armenia", + "en": "Armenia", + "pt_BR": "Armênia", + "sr-Cyrl": "Јерменија", + "sr-Latn": "Jermenija", + "zh_TW": "亞美尼亞", + "tr": "Ermenistan", + "ro": "Armenia", + "ar": "أرمينيا", + "fa": "ارمنستان", + "yue": "亞美尼亞" + }, + flag: "🇦🇲", + code: "AM", + dialCode: "374", + minLength: 8, + maxLength: 8, + ), + Country( + name: "Aruba", + nameTranslations: { + "sk": "Aruba", + "se": "Aruba", + "pl": "Aruba", + "no": "Aruba", + "ja": "アルバ", + "it": "Aruba", + "zh": "阿鲁巴", + "nl": "Aruba", + "de": "Aruba", + "fr": "Aruba", + "es": "Aruba", + "en": "Aruba", + "pt_BR": "Aruba", + "sr-Cyrl": "Аруба", + "sr-Latn": "Aruba", + "zh_TW": "阿魯巴", + "tr": "Aruba", + "ro": "Aruba", + "ar": "أروبا", + "fa": "آروبا", + "yue": "阿魯巴島" + }, + flag: "🇦🇼", + code: "AW", + dialCode: "297", + minLength: 7, + maxLength: 7, + ), + Country( + name: "Australia", + nameTranslations: { + "sk": "Austrália", + "se": "Austrália", + "pl": "Australia", + "no": "Australia", + "ja": "オーストラリア", + "it": "Australia", + "zh": "澳大利亚", + "nl": "Australië", + "de": "Australien", + "fr": "Australie", + "es": "Australia", + "en": "Australia", + "pt_BR": "Austrália", + "sr-Cyrl": "Аустралија", + "sr-Latn": "Australija", + "zh_TW": "澳州", + "tr": "Avustralya", + "ro": "Australia", + "ar": "أستراليا", + "fa": "استرالیا", + "yue": "澳洲" + }, + flag: "🇦🇺", + code: "AU", + dialCode: "61", + minLength: 9, + maxLength: 9, + ), + Country( + name: "Austria", + nameTranslations: { + "sk": "Rakúsko", + "se": "Nuortariika", + "pl": "Austria", + "no": "Østerrike", + "ja": "オーストリア", + "it": "Austria", + "zh": "奥地利", + "nl": "Oostenrijk", + "de": "Österreich", + "fr": "Autriche", + "es": "Austria", + "en": "Austria", + "pt_BR": "Áustria", + "sr-Cyrl": "Аустрија", + "sr-Latn": "Austrija", + "zh_TW": "奥地利", + "tr": "Avusturya", + "ro": "Austria", + "ar": "النمسا", + "fa": "اتریش", + "yue": "奧地利" + }, + flag: "🇦🇹", + code: "AT", + dialCode: "43", + minLength: 13, + maxLength: 13, + ), + Country( + name: "Azerbaijan", + nameTranslations: { + "sk": "Azerbajdžan", + "se": "Aserbaižan", + "pl": "Azerbejdżan", + "no": "Aserbajdsjan", + "ja": "アゼルバイジャン", + "it": "Azerbaigian", + "zh": "阿塞拜疆", + "nl": "Azerbeidzjan", + "de": "Aserbaidschan", + "fr": "Azerbaïdjan", + "es": "Azerbaiyán", + "en": "Azerbaijan", + "pt_BR": "Azerbaijão", + "sr-Cyrl": "Азербејџан", + "sr-Latn": "Azerbejdžan", + "zh_TW": "亞塞拜然", + "tr": "Azerbaycan", + "ro": "Azerbaidjan", + "ar": "أذربيجان", + "fa": "آذربایجان", + "yue": "阿塞拜疆" + }, + flag: "🇦🇿", + code: "AZ", + dialCode: "994", + minLength: 9, + maxLength: 9, + ), + Country( + name: "Bahamas", + nameTranslations: { + "sk": "Bahamy", + "se": "Bahamas", + "pl": "Bahamy", + "no": "Bahamas", + "ja": "バハマ", + "it": "Bahamas", + "zh": "巴哈马", + "nl": "Bahama's", + "de": "Bahamas", + "fr": "Bahamas", + "es": "Bahamas", + "en": "Bahamas", + "pt_BR": "Bahamas", + "sr-Cyrl": "Бахаме", + "sr-Latn": "Bahame", + "zh_TW": "巴哈馬", + "tr": "Bahama", + "ro": "Bahamas", + "ar": "باهاماس", + "fa": "باهاماس", + "yue": "巴哈馬" + }, + flag: "🇧🇸", + code: "BS", + dialCode: "1242", + minLength: 7, + maxLength: 7, + ), + Country( + name: "Bahrain", + nameTranslations: { + "sk": "Bahrajn", + "se": "Bahrain", + "pl": "Bahrajn", + "no": "Bahrain", + "ja": "バーレーン", + "it": "Bahrein", + "zh": "巴林", + "nl": "Bahrein", + "de": "Bahrain", + "fr": "Bahreïn", + "es": "Baréin", + "en": "Bahrain", + "pt_BR": "Bahrain", + "sr-Cyrl": "Бахреин", + "sr-Latn": "Bahrein", + "zh_TW": "巴林", + "tr": "Bahreyn", + "ro": "Bahrein", + "ar": "البحرين", + "fa": "بحرین", + "yue": "巴林" + }, + flag: "🇧🇭", + code: "BH", + dialCode: "973", + minLength: 8, + maxLength: 8, + ), + Country( + name: "Bangladesh", + nameTranslations: { + "sk": "Bangladéš", + "se": "Bangladesh", + "pl": "Bangladesz", + "no": "Bangladesh", + "ja": "バングラデシュ", + "it": "Bangladesh", + "zh": "孟加拉国", + "nl": "Bangladesh", + "de": "Bangladesch", + "fr": "Bangladesh", + "es": "Bangladés", + "en": "Bangladesh", + "pt_BR": "Bangladesh", + "sr-Cyrl": "Бангладеш", + "sr-Latn": "Bangladeš", + "zh_TW": "孟加拉", + "tr": "Bangladeş", + "ro": "Bangladesh", + "ar": "بنغلاديش", + "fa": "بنگلادش", + "yue": "孟加拉囯" + }, + flag: "🇧🇩", + code: "BD", + dialCode: "880", + minLength: 10, + maxLength: 10, + ), + Country( + name: "Barbados", + nameTranslations: { + "sk": "Barbados", + "se": "Barbados", + "pl": "Barbados", + "no": "Barbados", + "ja": "バルバドス", + "it": "Barbados", + "zh": "巴巴多斯", + "nl": "Barbados", + "de": "Barbados", + "fr": "Barbade", + "es": "Barbados", + "en": "Barbados", + "pt_BR": "Barbados", + "sr-Cyrl": "Барбадос", + "sr-Latn": "Barbados", + "zh_TW": "巴巴多斯", + "tr": "Barbados", + "ro": "Barbados", + "ar": "باربادوس", + "fa": "باربادوس", + "yue": "巴巴多斯" + }, + flag: "🇧🇧", + code: "BB", + dialCode: "1246", + minLength: 7, + maxLength: 7, + ), + Country( + name: "Belarus", + nameTranslations: { + "sk": "Bielorusko", + "se": "Vilges-Ruošša", + "pl": "Białoruś", + "no": "Hviterussland", + "ja": "ベラルーシ", + "it": "Bielorussia", + "zh": "白俄罗斯", + "nl": "Belarus", + "de": "Belarus", + "fr": "Biélorussie", + "es": "Bielorrusia", + "en": "Belarus", + "pt_BR": "Bielo-Rússia", + "sr-Cyrl": "Белорусија", + "sr-Latn": "Belorusija", + "zh_TW": "白俄羅斯", + "tr": "Belarus", + "ro": "Belarus", + "ar": "بيلاروس", + "fa": "بلاروس", + "yue": "白俄羅斯" + }, + flag: "🇧🇾", + code: "BY", + dialCode: "375", + minLength: 10, + maxLength: 10, + ), + Country( + name: "Belgium", + nameTranslations: { + "sk": "Belgicko", + "se": "Belgia", + "pl": "Belgia", + "no": "Belgia", + "ja": "ベルギー", + "it": "Belgio", + "zh": "比利时", + "nl": "België", + "de": "Belgien", + "fr": "Belgique", + "es": "Bélgica", + "en": "Belgium", + "pt_BR": "Bélgica", + "sr-Cyrl": "Белгија", + "sr-Latn": "Belgija", + "zh_TW": "比利時", + "tr": "Belçika", + "ro": "Belgia", + "ar": "بلجيكا", + "fa": "بلژیک", + "yue": "比利時" + }, + flag: "🇧🇪", + code: "BE", + dialCode: "32", + minLength: 9, + maxLength: 9, + ), + Country( + name: "Belize", + nameTranslations: { + "sk": "Belize", + "se": "Belize", + "pl": "Belize", + "no": "Belize", + "ja": "ベリーズ", + "it": "Belize", + "zh": "伯利兹", + "nl": "Belize", + "de": "Belize", + "fr": "Belize", + "es": "Belice", + "en": "Belize", + "pt_BR": "Belize", + "sr-Cyrl": "Белизе", + "sr-Latn": "Belize", + "zh_TW": "伯利茲", + "tr": "Belize", + "ro": "Belize", + "ar": "بليز", + "fa": "بليز", + "yue": "伯利茲" + }, + flag: "🇧🇿", + code: "BZ", + dialCode: "501", + minLength: 7, + maxLength: 7, + ), + Country( + name: "Benin", + nameTranslations: { + "sk": "Benin", + "se": "Benin", + "pl": "Benin", + "no": "Benin", + "ja": "ベナン", + "it": "Benin", + "zh": "贝宁", + "nl": "Benin", + "de": "Benin", + "fr": "Bénin", + "es": "Benín", + "en": "Benin", + "pt_BR": "Benin", + "sr-Cyrl": "Бенин", + "sr-Latn": "Benin", + "zh_TW": "貝南", + "tr": "Benin", + "ro": "Benin", + "ar": "بنين", + "fa": "بنين", + "yue": "貝寧" + }, + flag: "🇧🇯", + code: "BJ", + dialCode: "229", + minLength: 8, + maxLength: 8, + ), + Country( + name: "Bermuda", + nameTranslations: { + "sk": "Bermudy", + "se": "Bermuda", + "pl": "Bermudy", + "no": "Bermuda", + "ja": "バミューダ", + "it": "Bermuda", + "zh": "百慕大", + "nl": "Bermuda", + "de": "Bermuda", + "fr": "Bermudes", + "es": "Bermudas", + "en": "Bermuda", + "pt_BR": "Bermudas", + "sr-Cyrl": "Бермуда", + "sr-Latn": "Bermuda", + "zh_TW": "百慕達", + "tr": "Bermuda", + "ro": "Insulele Bermude", + "ar": "برمودا", + "fa": "برمودا", + "yue": "百慕大" + }, + flag: "🇧🇲", + code: "BM", + dialCode: "1441", + minLength: 7, + maxLength: 7, + ), + Country( + name: "Bhutan", + nameTranslations: { + "sk": "Bhután", + "se": "Bhutan", + "pl": "Bhutan", + "no": "Bhutan", + "ja": "ブータン", + "it": "Bhutan", + "zh": "不丹", + "nl": "Bhutan", + "de": "Bhutan", + "fr": "Bhoutan", + "es": "Bután", + "en": "Bhutan", + "pt_BR": "Butão", + "sr-Cyrl": "Бутан", + "sr-Latn": "Butan", + "zh_TW": "不丹", + "tr": "Bhutan", + "ro": "Bhutan", + "ar": "بوتان", + "fa": "بوتان", + "yue": "不丹" + }, + flag: "🇧🇹", + code: "BT", + dialCode: "975", + minLength: 8, + maxLength: 8, + ), + Country( + name: "Bolivia, Plurinational State of bolivia", + nameTranslations: { + "sk": "Bolívia", + "se": "Bolivia", + "pl": "Boliwia", + "no": "Bolivia", + "ja": "ボリビア", + "it": "Bolivia", + "zh": "玻利维亚", + "nl": "Bolivia", + "de": "Bolivien", + "fr": "Bolivie", + "es": "Bolivia", + "en": "Bolivia", + "pt_BR": "Bolívia", + "sr-Cyrl": "Боливија", + "sr-Latn": "Bolivija", + "zh_TW": "玻利維亞", + "tr": "Bolivya", + "ro": "Bolivia", + "ar": "بوليفيا", + "fa": "بولیوی", + "yue": "玻利維亞(多民族國家)" + }, + flag: "🇧🇴", + code: "BO", + dialCode: "591", + minLength: 8, + maxLength: 8, + ), + Country( + name: "Bosnia and Herzegovina", + nameTranslations: { + "sk": "Bosna a Hercegovina", + "se": "Bosnia-Hercegovina", + "pl": "Bośnia i Hercegowina", + "no": "Bosnia-Hercegovina", + "ja": "ボスニア・ヘルツェゴビナ", + "it": "Bosnia ed Erzegovina", + "zh": "波斯尼亚和黑塞哥维那", + "nl": "Bosnië en Herzegovina", + "de": "Bosnien und Herzegowina", + "fr": "Bosnie-Herzégovine", + "es": "Bosnia y Herzegovina", + "en": "Bosnia & Herzegovina", + "pt_BR": "Bósnia e Herzegovina", + "sr-Cyrl": "Босна и Херцеговина", + "sr-Latn": "Bosna i Hercegovina", + "zh_TW": "波士尼亞和黑塞哥維那", + "tr": "Bosna Hersek", + "ro": "Bosnia și Herțegovina", + "ar": "البوسنة والهرسك", + "fa": "بوسنی و هرزگوین", + "yue": "波斯尼亞黑塞哥維那" + }, + flag: "🇧🇦", + code: "BA", + dialCode: "387", + minLength: 9, + maxLength: 9, + ), + Country( + name: "Botswana", + nameTranslations: { + "sk": "Botswana", + "se": "Botswana", + "pl": "Botswana", + "no": "Botswana", + "ja": "ボツワナ", + "it": "Botswana", + "zh": "博茨瓦纳", + "nl": "Botswana", + "de": "Botsuana", + "fr": "Botswana", + "es": "Botsuana", + "en": "Botswana", + "pt_BR": "Botswana", + "sr-Cyrl": "Боцвана", + "sr-Latn": "Bocvana", + "zh_TW": "博茨瓦納", + "tr": "Botsvana", + "ro": "Botswana", + "ar": "بوتسوانا", + "fa": "بوتسوانا", + "yue": "博茨瓦納" + }, + flag: "🇧🇼", + code: "BW", + dialCode: "267", + minLength: 8, + maxLength: 8, + ), + Country( + name: "Bouvet Island", + nameTranslations: { + "sk": "Bouvetov ostrov", + "se": "Bouvet-sullot", + "pl": "Wyspa Bouveta", + "no": "Bouvetøya", + "ja": "ブーベ島", + "it": "Isola Bouvet", + "zh": "布韦岛", + "nl": "Bouveteiland", + "de": "Bouvetinsel", + "fr": "Île Bouvet", + "es": "Isla Bouvet", + "en": "Bouvet Island", + "pt_BR": "Ilha Bouvet", + "sr-Cyrl": "Острво Буве", + "sr-Latn": "Ostrvo Buve", + "zh_TW": "布維特島", + "tr": "Bouvet Adası", + "ro": "Insula Bouvet", + "ar": "جزيرة بوفيه", + "fa": "جزیره بووه", + "yue": "布维特岛" + }, + flag: "🇧🇻", + code: "BV", + dialCode: "47", + minLength: 15, + maxLength: 15, + ), + Country( + name: "Brazil", + nameTranslations: { + "sk": "Brazília", + "se": "Brasil", + "pl": "Brazylia", + "no": "Brasil", + "ja": "ブラジル", + "it": "Brasile", + "zh": "巴西", + "nl": "Brazilië", + "de": "Brasilien", + "fr": "Brésil", + "es": "Brasil", + "en": "Brazil", + "pt_BR": "Brasil", + "sr-Cyrl": "Бразил", + "sr-Latn": "Brazil", + "zh_TW": "巴西", + "tr": "Brezilya", + "ro": "Brazilia", + "ar": "البرازيل", + "fa": "برزیل", + "yue": "巴西" + }, + flag: "🇧🇷", + code: "BR", + dialCode: "55", + minLength: 11, + maxLength: 11, + ), + Country( + name: "British Indian Ocean Territory", + nameTranslations: { + "sk": "Britské indickooceánske územie", + "se": "British Indian Ocean Territory", + "pl": "Brytyjskie Terytorium Oceanu Indyjskiego", + "no": "Det britiske territoriet i Indiahavet", + "ja": "英領インド洋地域", + "it": "Territorio britannico dell'Oceano Indiano", + "zh": "英属印度洋领地", + "nl": "Brits Indische Oceaanterritorium", + "de": "Britisches Territorium im Indischen Ozean", + "fr": "Territoire britannique de l'océan Indien", + "es": "Territorio Británico del Océano Índico", + "en": "British Indian Ocean Territory", + "pt_BR": "Território Britânico do Oceano Índico", + "sr-Cyrl": "Британска територија Индијског океана", + "sr-Latn": "Britanska teritorija Indijskog okeana", + "zh_TW": "英屬印度洋領地", + "tr": "Britanya Hint Okyanusu Toprakları", + "ro": "Teritoriul Britanic din Oceanul Indian", + "ar": "إقليم المحيط الهندي البريطاني", + "fa": "سرزمین دریایی هند - بریتانیا", + "yue": "英屬印度洋領土" + }, + flag: "🇮🇴", + code: "IO", + dialCode: "246", + minLength: 7, + maxLength: 7, + ), + Country( + name: "Brunei Darussalam", + nameTranslations: { + "sk": "Brunej", + "se": "Brunei", + "pl": "Brunei", + "no": "Brunei", + "ja": "ブルネイ", + "it": "Brunei", + "zh": "文莱", + "nl": "Brunei", + "de": "Brunei Darussalam", + "fr": "Brunéi Darussalam", + "es": "Brunéi", + "en": "Brunei", + "pt_BR": "Brunei", + "sr-Cyrl": "Брунеј", + "sr-Latn": "Brunej", + "zh_TW": "汶萊", + "tr": "Bruney", + "ro": "Brunei", + "ar": "بروناي", + "fa": "برونئی", + "yue": "文萊達魯薩蘭國" + }, + flag: "🇧🇳", + code: "BN", + dialCode: "673", + minLength: 7, + maxLength: 7, + ), + Country( + name: "Bulgaria", + nameTranslations: { + "sk": "Bulharsko", + "se": "Bulgária", + "pl": "Bułgaria", + "no": "Bulgaria", + "ja": "ブルガリア", + "it": "Bulgaria", + "zh": "保加利亚", + "nl": "Bulgarije", + "de": "Bulgarien", + "fr": "Bulgarie", + "es": "Bulgaria", + "en": "Bulgaria", + "pt_BR": "Bulgária", + "sr-Cyrl": "Бугарска", + "sr-Latn": "Bugarska", + "zh_TW": "保加利亞", + "tr": "Bulgaristan", + "ro": "Bulgaria", + "ar": "بلغاريا", + "fa": "بلغارستان", + "yue": "保加利亞" + }, + flag: "🇧🇬", + code: "BG", + dialCode: "359", + minLength: 9, + maxLength: 9, + ), + Country( + name: "Burkina Faso", + nameTranslations: { + "sk": "Burkina Faso", + "se": "Burkina Faso", + "pl": "Burkina Faso", + "no": "Burkina Faso", + "ja": "ブルキナファソ", + "it": "Burkina Faso", + "zh": "布基纳法索", + "nl": "Burkina Faso", + "de": "Burkina Faso", + "fr": "Burkina Faso", + "es": "Burkina Faso", + "en": "Burkina Faso", + "pt_BR": "Burkina Faso", + "sr-Cyrl": "Буркина Фасо", + "sr-Latn": "Burkina Faso", + "zh_TW": "布吉納法索", + "tr": "Burkina Faso", + "ro": "Burkina Faso", + "ar": "بوركينا فاسو", + "fa": "بورکینافاسو", + "yue": "布基納法索" + }, + flag: "🇧🇫", + code: "BF", + dialCode: "226", + minLength: 8, + maxLength: 8, + ), + Country( + name: "Burundi", + nameTranslations: { + "sk": "Burundi", + "se": "Burundi", + "pl": "Burundi", + "no": "Burundi", + "ja": "ブルンジ", + "it": "Burundi", + "zh": "布隆迪", + "nl": "Burundi", + "de": "Burundi", + "fr": "Burundi", + "es": "Burundi", + "en": "Burundi", + "pt_BR": "Burundi", + "sr-Cyrl": "Бурунди", + "sr-Latn": "Burundi", + "zh_TW": "蒲隆地", + "tr": "Burundi", + "ro": "Burundi", + "ar": "بوروندي", + "fa": "بوروندی", + "yue": "蒲隆地" + }, + flag: "🇧🇮", + code: "BI", + dialCode: "257", + minLength: 8, + maxLength: 8, + ), + Country( + name: "Cambodia", + nameTranslations: { + "sk": "Kambodža", + "se": "Kambodža", + "pl": "Kambodża", + "no": "Kambodsja", + "ja": "カンボジア", + "it": "Cambogia", + "zh": "柬埔寨", + "nl": "Cambodja", + "de": "Kambodscha", + "fr": "Cambodge", + "es": "Camboya", + "en": "Cambodia", + "pt_BR": "Camboja", + "sr-Cyrl": "Камбоџа", + "sr-Latn": "Kambodža", + "zh_TW": "柬埔寨", + "tr": "Kamboçya", + "ro": "Cambogia", + "ar": "كمبوديا", + "fa": "کامبوج", + "yue": "柬埔寨" + }, + flag: "🇰🇭", + code: "KH", + dialCode: "855", + minLength: 9, + maxLength: 9, + ), + Country( + name: "Cameroon", + nameTranslations: { + "sk": "Kamerun", + "se": "Kamerun", + "pl": "Kamerun", + "no": "Kamerun", + "ja": "カメルーン", + "it": "Camerun", + "zh": "喀麦隆", + "nl": "Kameroen", + "de": "Kamerun", + "fr": "Cameroun", + "es": "Camerún", + "en": "Cameroon", + "pt_BR": "Camarões", + "sr-Cyrl": "Камерун", + "sr-Latn": "Kamerun", + "zh_TW": "喀麥隆", + "tr": "Kamerun", + "ro": "Camerun", + "ar": "الكاميرون", + "fa": "کامرون", + "yue": "喀 麥 隆" + }, + flag: "🇨🇲", + code: "CM", + dialCode: "237", + minLength: 9, + maxLength: 9, + ), + Country( + name: "Canada", + nameTranslations: { + "sk": "Kanada", + "se": "Kanáda", + "pl": "Kanada", + "no": "Canada", + "ja": "カナダ", + "it": "Canada", + "zh": "加拿大", + "nl": "Canada", + "de": "Kanada", + "fr": "Canada", + "es": "Canadá", + "en": "Canada", + "pt_BR": "Canadá", + "sr-Cyrl": "Канада", + "sr-Latn": "Kanada", + "zh_TW": "加拿大", + "tr": "Kanada", + "ro": "Canada", + "ar": "كندا", + "fa": "کانادا", + "yue": "加拿大" + }, + flag: "🇨🇦", + code: "CA", + dialCode: "1", + minLength: 10, + maxLength: 10, + ), + Country( + name: "Cayman Islands", + nameTranslations: { + "sk": "Kajmanie ostrovy", + "se": "Cayman-sullot", + "pl": "Kajmany", + "no": "Caymanøyene", + "ja": "ケイマン諸島", + "it": "Isole Cayman", + "zh": "开曼群岛", + "nl": "Kaaimaneilanden", + "de": "Kaimaninseln", + "fr": "Îles Caïmans", + "es": "Islas Caimán", + "en": "Cayman Islands", + "pt_BR": "Ilhas Cayman", + "sr-Cyrl": "Кајманска Острва", + "sr-Latn": "Kajmanska Ostrva", + "zh_TW": "開曼群島", + "tr": "Cayman Adaları", + "ro": "Insulele Cayman", + "ar": "جزر كايمان", + "fa": "جزایر کیمن", + "yue": "開曼群島" + }, + flag: "🇰🇾", + code: "KY", + dialCode: "345", + minLength: 7, + maxLength: 7, + ), + Country( + name: "Central African Republic", + nameTranslations: { + "sk": "Stredoafrická republika", + "se": "Gaska-Afrihká dásseváldi", + "pl": "Republika Środkowoafrykańska", + "no": "Den sentralafrikanske republikk", + "ja": "中央アフリカ共和国", + "it": "Repubblica Centrafricana", + "zh": "中非共和国", + "nl": "Centraal-Afrikaanse Republiek", + "de": "Zentralafrikanische Republik", + "fr": "République centrafricaine", + "es": "República Centroafricana", + "en": "Central African Republic", + "pt_BR": "República Centro-Africana", + "sr-Cyrl": "Централноафричка Република", + "sr-Latn": "Centralnoafrička Republika", + "zh_TW": "中非共和國", + "tr": "Orta Afrika Cumhuriyeti", + "ro": "Republica Centrafricană", + "ar": "جمهورية أفريقيا الوسطى", + "fa": "جمهوری افریقای مرکزی", + "yue": "中非共和國" + }, + flag: "🇨🇫", + code: "CF", + dialCode: "236", + minLength: 8, + maxLength: 8, + ), + Country( + name: "Chad", + nameTranslations: { + "sk": "Čad", + "se": "Tčad", + "pl": "Czad", + "no": "Tsjad", + "ja": "チャド", + "it": "Ciad", + "zh": "乍得", + "nl": "Tsjaad", + "de": "Tschad", + "fr": "Tchad", + "es": "Chad", + "en": "Chad", + "pt_BR": "Chade", + "sr-Cyrl": "Чад", + "sr-Latn": "Čad", + "zh_TW": "查德", + "tr": "Çad", + "ro": "Ciad", + "ar": "تشاد", + "fa": "چاد", + "yue": "乍得" + }, + flag: "🇹🇩", + code: "TD", + dialCode: "235", + minLength: 7, + maxLength: 7, + ), + Country( + name: "Chile", + nameTranslations: { + "sk": "Čile", + "se": "Čiile", + "pl": "Chile", + "no": "Chile", + "ja": "チリ", + "it": "Cile", + "zh": "智利", + "nl": "Chili", + "de": "Chile", + "fr": "Chili", + "es": "Chile", + "en": "Chile", + "pt_BR": "Chile", + "sr-Cyrl": "Чиле", + "sr-Latn": "Čile", + "zh_TW": "智利", + "tr": "Şili", + "ro": "Chile", + "ar": "تشيلي", + "fa": "شیلی", + "yue": "智利" + }, + flag: "🇨🇱", + code: "CL", + dialCode: "56", + minLength: 9, + maxLength: 9, + ), + Country( + name: "China", + nameTranslations: { + "sk": "Čína", + "se": "Kiinná", + "pl": "Chiny", + "no": "Kina", + "ja": "中国", + "it": "Cina", + "zh": "中国", + "nl": "China", + "de": "China", + "fr": "Chine", + "es": "China", + "en": "China", + "pt_BR": "China", + "sr-Cyrl": "Кина", + "sr-Latn": "Kina", + "zh_TW": "中國", + "tr": "Çin", + "ro": "China", + "ar": "الصين", + "fa": "چین", + "yue": "中國" + }, + flag: "🇨🇳", + code: "CN", + dialCode: "86", + minLength: 11, + maxLength: 12, + ), + Country( + name: "Christmas Island", + nameTranslations: { + "sk": "Vianočný ostrov", + "se": "Juovllat-sullot", + "pl": "Wyspa Bożego Narodzenia", + "no": "Christmasøya", + "ja": "クリスマス島", + "it": "Isola Christmas", + "zh": "圣诞岛", + "nl": "Christmaseiland", + "de": "Weihnachtsinsel", + "fr": "Île Christmas", + "es": "Isla de Navidad", + "en": "Christmas Island", + "pt_BR": "Ilha do Natal", + "sr-Cyrl": "Ускршња Острва", + "sr-Latn": "Uskršnja Ostrva", + "zh_TW": "聖誕島", + "tr": "Christmas Adası", + "ro": "Insula Crăciunului", + "ar": "جزيرة عيد الميلاد", + "fa": "جزیره کریسمس", + "yue": "聖誕島" + }, + flag: "🇨🇽", + code: "CX", + dialCode: "61", + minLength: 15, + maxLength: 15, + ), + Country( + name: "Cocos (Keeling) Islands", + nameTranslations: { + "sk": "Kokosové ostrovy", + "se": "Cocos-sullot", + "pl": "Wyspy Kokosowe", + "no": "Kokosøyene", + "ja": "ココス(キーリング)諸島", + "it": "Isole Cocos (Keeling)", + "zh": "科科斯(基林)群岛", + "nl": "Cocoseilanden", + "de": "Kokosinseln", + "fr": "Îles Cocos", + "es": "Islas Cocos", + "en": "Cocos (Keeling) Islands", + "pt_BR": "Ilhas Cocos (Keeling)", + "sr-Cyrl": "Кокосова Острва", + "sr-Latn": "Kokosova Ostrva", + "zh_TW": "科科斯(基林)群島", + "tr": "Cocos (Keyling) Adaları", + "ro": "Insulele Cocos", + "ar": "جزر كوكوس", + "fa": "جزایر کوکوس", + "yue": "可可島(基林)群島" + }, + flag: "🇨🇨", + code: "CC", + dialCode: "61", + minLength: 15, + maxLength: 15, + ), + Country( + name: "Colombia", + nameTranslations: { + "sk": "Kolumbia", + "se": "Kolombia", + "pl": "Kolumbia", + "no": "Colombia", + "ja": "コロンビア", + "it": "Colombia", + "zh": "哥伦比亚", + "nl": "Colombia", + "de": "Kolumbien", + "fr": "Colombie", + "es": "Colombia", + "en": "Colombia", + "pt_BR": "Colômbia", + "sr-Cyrl": "Колумбија", + "sr-Latn": "Kolumbija", + "zh_TW": "哥倫比亞", + "tr": "Kolombiya", + "ro": "Columbia", + "ar": "كولومبيا", + "fa": "کلمبیا", + "yue": "哥倫比亞" + }, + flag: "🇨🇴", + code: "CO", + dialCode: "57", + minLength: 10, + maxLength: 10, + ), + Country( + name: "Comoros", + nameTranslations: { + "sk": "Komory", + "se": "Komoros", + "pl": "Komory", + "no": "Komorene", + "ja": "コモロ", + "it": "Comore", + "zh": "科摩罗", + "nl": "Comoren", + "de": "Komoren", + "fr": "Comores", + "es": "Comoras", + "en": "Comoros", + "pt_BR": "Comores", + "sr-Cyrl": "Комори", + "sr-Latn": "Komori", + "zh_TW": "科摩羅", + "tr": "Komor Adaları", + "ro": "Comore", + "ar": "جزر القمر", + "fa": "جزیره کومور", + "yue": "科摩羅" + }, + flag: "🇰🇲", + code: "KM", + dialCode: "269", + minLength: 7, + maxLength: 7, + ), + Country( + name: "Congo", + nameTranslations: { + "sk": "Konžská republika", + "se": "Kongo-Brazzaville", + "pl": "Kongo", + "no": "Kongo-Brazzaville", + "ja": "コンゴ共和国(ブラザビル)", + "it": "Congo-Brazzaville", + "zh": "刚果(布)", + "nl": "Congo-Brazzaville", + "de": "Kongo-Brazzaville", + "fr": "Congo-Brazzaville", + "es": "Congo", + "en": "Congo - Brazzaville", + "pt_BR": "República do Congo", + "sr-Cyrl": "Република Конго", + "sr-Latn": "Republika Kongo", + "zh_TW": "剛果共和國(布拉柴維爾)", + "tr": "Kongo Cumhuriyeti", + "ro": "Republica Congo", + "ar": "جمهورية الكونغو", + "fa": "جمهوری کنگو", + "yue": "剛果(共和國)" + }, + flag: "🇨🇬", + code: "CG", + dialCode: "242", + minLength: 7, + maxLength: 7, + ), + Country( + name: "Congo, The Democratic Republic of the Congo", + nameTranslations: { + "sk": "Konžská demokratická republika", + "se": "Kongo-Kinshasa", + "pl": "Demokratyczna Republika Konga", + "no": "Kongo-Kinshasa", + "ja": "コンゴ民主共和国(キンシャサ)", + "it": "Congo - Kinshasa", + "zh": "刚果(金)", + "nl": "Congo-Kinshasa", + "de": "Kongo-Kinshasa", + "fr": "Congo-Kinshasa", + "es": "República Democrática del Congo", + "en": "Congo - Kinshasa", + "pt_BR": "República Democrática do Congo", + "sr-Cyrl": "Демократска Република Конго", + "sr-Latn": "Demokratska Republika Kongo", + "zh_TW": "剛果民主共和國(金沙薩)", + "tr": "Kongo Demokratik Cumhuriyeti", + "ro": "Republica Democrată Congo", + "ar": "جمهورية الكونغو الديمقراطية", + "fa": "جمهوری دموکراتیک کنگو", + "yue": "剛果(金)" + }, + flag: "🇨🇩", + code: "CD", + dialCode: "243", + minLength: 9, + maxLength: 9, + ), + Country( + name: "Cook Islands", + nameTranslations: { + "sk": "Cookove ostrovy", + "se": "Cook-sullot", + "pl": "Wyspy Cooka", + "no": "Cookøyene", + "ja": "クック諸島", + "it": "Isole Cook", + "zh": "库克群岛", + "nl": "Cookeilanden", + "de": "Cookinseln", + "fr": "Îles Cook", + "es": "Islas Cook", + "en": "Cook Islands", + "pt_BR": "Ilhas Cook", + "sr-Cyrl": "Кукова Острва", + "sr-Latn": "Kukova Ostrva", + "zh_TW": "庫克群島", + "tr": "Cook Adaları", + "ro": "Insulele Cook", + "ar": "جزر كوك", + "fa": "جزایر کوک", + "yue": "庫克群島" + }, + flag: "🇨🇰", + code: "CK", + dialCode: "682", + minLength: 5, + maxLength: 5, + ), + Country( + name: "Costa Rica", + nameTranslations: { + "sk": "Kostarika", + "se": "Costa Rica", + "pl": "Kostaryka", + "no": "Costa Rica", + "ja": "コスタリカ", + "it": "Costa Rica", + "zh": "哥斯达黎加", + "nl": "Costa Rica", + "de": "Costa Rica", + "fr": "Costa Rica", + "es": "Costa Rica", + "en": "Costa Rica", + "pt_BR": "Costa Rica", + "sr-Cyrl": "Коста Рика", + "sr-Latn": "Kosta Rika", + "zh_TW": "哥斯大黎加", + "tr": "Kosta Rika", + "ro": "Costa Rica", + "ar": "كوستاريكا", + "fa": "کاستاریکا", + "yue": "哥斯達黎加" + }, + flag: "🇨🇷", + code: "CR", + dialCode: "506", + minLength: 8, + maxLength: 8, + ), + Country( + name: "Côte d'Ivoire", + nameTranslations: { + "sk": "Pobrežie Slonoviny", + "se": "Elfenbenariddu", + "pl": "Côte d'Ivoire", + "no": "Elfenbenskysten", + "ja": "コートジボワール", + "it": "Costa d'Avorio", + "zh": "科特迪瓦", + "nl": "Ivoorkust", + "de": "Côte d'Ivoire", + "fr": "Côte d'Ivoire", + "es": "Côte d'Ivoire", + "en": "Côte d'Ivoire", + "pt_BR": "Côte d'Ivoire", + "sr-Cyrl": "Обала Слоноваче", + "sr-Latn": "Obala Slonovače", + "zh_TW": "象牙海岸", + "tr": "Fildişi Kıyısı", + "ro": "Coasta de fildeș", + "ar": "ساحل العاج", + "fa": "ساحل عاج", + "yue": "科特迪瓦" + }, + flag: "🇨🇮", + code: "CI", + dialCode: "225", + minLength: 10, + maxLength: 10, + ), + Country( + name: "Croatia", + nameTranslations: { + "sk": "Chorvátsko", + "se": "Kroátia", + "pl": "Chorwacja", + "no": "Kroatia", + "ja": "クロアチア", + "it": "Croazia", + "zh": "克罗地亚", + "nl": "Kroatië", + "de": "Kroatien", + "fr": "Croatie", + "es": "Croacia", + "en": "Croatia", + "pt_BR": "Croácia", + "sr-Cyrl": "Хрватска", + "sr-Latn": "Hrvatska", + "zh_TW": "克羅埃西亞", + "tr": "Hırvatistan", + "ro": "Croația", + "ar": "كرواتيا", + "fa": "کرواسی", + "yue": "克羅地亞" + }, + flag: "🇭🇷", + code: "HR", + dialCode: "385", + minLength: 12, + maxLength: 12, + ), + Country( + name: "Cuba", + nameTranslations: { + "sk": "Kuba", + "se": "Kuba", + "pl": "Kuba", + "no": "Cuba", + "ja": "キューバ", + "it": "Cuba", + "zh": "古巴", + "nl": "Cuba", + "de": "Kuba", + "fr": "Cuba", + "es": "Cuba", + "en": "Cuba", + "pt_BR": "Cuba", + "sr-Cyrl": "Куба", + "sr-Latn": "Kuba", + "zh_TW": "古巴", + "tr": "Küba", + "ro": "Cuba", + "ar": "كوبا", + "fa": "كوبا", + "yue": "古巴" + }, + flag: "🇨🇺", + code: "CU", + dialCode: "53", + minLength: 8, + maxLength: 8, + ), + Country( + name: "Cyprus", + nameTranslations: { + "sk": "Cyprus", + "se": "Kypros", + "pl": "Cypr", + "no": "Kypros", + "ja": "キプロス", + "it": "Cipro", + "zh": "塞浦路斯", + "nl": "Cyprus", + "de": "Zypern", + "fr": "Chypre", + "es": "Chipre", + "en": "Cyprus", + "pt_BR": "Chipre", + "sr-Cyrl": "Кипар", + "sr-Latn": "Kipar", + "zh_TW": "塞普勒斯", + "tr": "Kıbrıs", + "ro": "Cipru", + "ar": "قبرص", + "fa": "قبرس", + "yue": "塞浦路斯" + }, + flag: "🇨🇾", + code: "CY", + dialCode: "357", + minLength: 8, + maxLength: 8, + ), + Country( + name: "Czech Republic", + nameTranslations: { + "sk": "Česko", + "se": "Čeahkka", + "pl": "Czechy", + "no": "Tsjekkia", + "ja": "チェコ", + "it": "Cechia", + "zh": "捷克", + "nl": "Tsjechië", + "de": "Tschechien", + "fr": "Tchéquie", + "es": "Chequia", + "en": "Czechia", + "pt_BR": "Czechia", + "sr-Cyrl": "Чешка", + "sr-Latn": "Češka", + "zh_TW": "捷克", + "tr": "Çek Cumhuriyeti", + "ro": "Cehia", + "ar": "جمهورية التشيك", + "fa": "جمهوری چک", + "yue": "捷克共和國" + }, + flag: "🇨🇿", + code: "CZ", + dialCode: "420", + minLength: 9, + maxLength: 9, + ), + Country( + name: "Denmark", + nameTranslations: { + "sk": "Dánsko", + "se": "Dánmárku", + "pl": "Dania", + "no": "Danmark", + "ja": "デンマーク", + "it": "Danimarca", + "zh": "丹麦", + "nl": "Denemarken", + "de": "Dänemark", + "fr": "Danemark", + "es": "Dinamarca", + "en": "Denmark", + "pt_BR": "Dinamarca", + "sr-Cyrl": "Данска", + "sr-Latn": "Danska", + "zh_TW": "丹麥", + "tr": "Danimarka", + "ro": "Danemarca", + "ar": "الدنمارك", + "fa": "دانمارک", + "yue": "丹麥" + }, + flag: "🇩🇰", + code: "DK", + dialCode: "45", + minLength: 8, + maxLength: 8, + ), + Country( + name: "Djibouti", + nameTranslations: { + "sk": "Džibutsko", + "se": "Djibouti", + "pl": "Dżibuti", + "no": "Djibouti", + "ja": "ジブチ", + "it": "Gibuti", + "zh": "吉布提", + "nl": "Djibouti", + "de": "Dschibuti", + "fr": "Djibouti", + "es": "Yibuti", + "en": "Djibouti", + "pt_BR": "Djibouti", + "sr-Cyrl": "Џибути", + "sr-Latn": "Džibuti", + "zh_TW": "吉布地", + "tr": "Cibuti", + "ro": "Djibouti", + "ar": "جيبوتي", + "fa": "جیبوتی", + "yue": "吉布提" + }, + flag: "🇩🇯", + code: "DJ", + dialCode: "253", + minLength: 6, + maxLength: 6, + ), + Country( + name: "Dominica", + nameTranslations: { + "sk": "Dominika", + "se": "Dominica", + "pl": "Dominika", + "no": "Dominica", + "ja": "ドミニカ国", + "it": "Dominica", + "zh": "多米尼克", + "nl": "Dominica", + "de": "Dominica", + "fr": "Dominique", + "es": "Dominica", + "en": "Dominica", + "pt_BR": "Dominica", + "sr-Cyrl": "Доминика", + "sr-Latn": "Dominika", + "zh_TW": "多明尼加", + "tr": "Dominika", + "ro": "Dominica", + "ar": "دومينيكا", + "fa": "دومينيكا", + "yue": "多米尼加" + }, + flag: "🇩🇲", + code: "DM", + dialCode: "1767", + minLength: 7, + maxLength: 7, + ), + Country( + name: "Dominican Republic", + nameTranslations: { + "sk": "Dominikánska republika", + "se": "Dominikána dásseváldi", + "pl": "Dominikana", + "no": "Den dominikanske republikk", + "ja": "ドミニカ共和国", + "it": "Repubblica Dominicana", + "zh": "多米尼加共和国", + "nl": "Dominicaanse Republiek", + "de": "Dominikanische Republik", + "fr": "République dominicaine", + "es": "República Dominicana", + "en": "Dominican Republic", + "pt_BR": "República Dominicana", + "sr-Cyrl": "Доминиканска Република", + "sr-Latn": "Dominikanska Republika", + "zh_TW": "多明尼加共和國", + "tr": "Dominik Cumhuriyeti", + "ro": "Republica Dominicană", + "ar": "جمهورية الدومينيكان", + "fa": "جمهوری دومنیکن", + "yue": "多明尼加共和國" + }, + flag: "🇩🇴", + code: "DO", + dialCode: "1", + minLength: 10, + maxLength: 10, + ), + Country( + name: "Ecuador", + nameTranslations: { + "sk": "Ekvádor", + "se": "Ecuador", + "pl": "Ekwador", + "no": "Ecuador", + "ja": "エクアドル", + "it": "Ecuador", + "zh": "厄瓜多尔", + "nl": "Ecuador", + "de": "Ecuador", + "fr": "Équateur", + "es": "Ecuador", + "en": "Ecuador", + "pt_BR": "Equador", + "sr-Cyrl": "Еквадор", + "sr-Latn": "Ekvador", + "zh_TW": "厄瓜多", + "tr": "Ekvador", + "ro": "Ecuador", + "ar": "الإكوادور", + "fa": "اكوادور", + "yue": "厄瓜多爾" + }, + flag: "🇪🇨", + code: "EC", + dialCode: "593", + minLength: 8, + maxLength: 9, + ), + Country( + name: "Egypt", + nameTranslations: { + "sk": "Egypt", + "se": "Egypt", + "pl": "Egipt", + "no": "Egypt", + "ja": "エジプト", + "it": "Egitto", + "zh": "埃及", + "nl": "Egypt", + "de": "Ägypt", + "fr": "Égypte", + "es": "Egipt", + "en": "Egypt", + "pt_BR": "Egito", + "sr-Cyrl": "Египат", + "sr-Latn": "Egipat", + "zh_TW": "埃及", + "tr": "Mısır", + "ro": "Egipt", + "ar": "مصر", + "fa": "مصر", + "yue": "埃及" + }, + flag: "🇪🇬", + code: "EG", + dialCode: "2", + minLength: 11, + maxLength: 11, + ), + Country( + name: "El Salvador", + nameTranslations: { + "sk": "Salvádor", + "se": "El Salvador", + "pl": "Salwador", + "no": "El Salvador", + "ja": "エルサルバドル", + "it": "El Salvador", + "zh": "萨尔瓦多", + "nl": "El Salvador", + "de": "El Salvador", + "fr": "Salvador", + "es": "El Salvador", + "en": "El Salvador", + "pt_BR": "El Salvador", + "sr-Cyrl": "Салвадор", + "sr-Latn": "Salvador", + "zh_TW": "薩爾瓦多", + "tr": "El Salvador", + "ro": "Salvador", + "ar": "السلفادور", + "fa": "ال سالوادور", + "yue": "薩爾瓦多" + }, + flag: "🇸🇻", + code: "SV", + dialCode: "503", + minLength: 11, + maxLength: 11, + ), + Country( + name: "Equatorial Guinea", + nameTranslations: { + "sk": "Rovníková Guinea", + "se": "Ekvatoriála Guinea", + "pl": "Gwinea Równikowa", + "no": "Ekvatorial-Guinea", + "ja": "赤道ギニア", + "it": "Guinea Equatoriale", + "zh": "赤道几内亚", + "nl": "Equatoriaal-Guinea", + "de": "Äquatorialguinea", + "fr": "Guinée équatoriale", + "es": "Guinea Ecuatorial", + "en": "Equatorial Guinea", + "pt_BR": "Guiné Equatorial", + "sr-Cyrl": "Екваторијална Гвинеја", + "sr-Latn": "Ekvatorijalna Gvineja", + "zh_TW": "赤道幾內亞", + "tr": "Ekvator Ginesi", + "ro": "Guineea Ecuatorială", + "ar": "غينيا الاستوائية", + "fa": "گینه استوایی", + "yue": "赤道幾內亞" + }, + flag: "🇬🇶", + code: "GQ", + dialCode: "240", + minLength: 6, + maxLength: 6, + ), + Country( + name: "Eritrea", + nameTranslations: { + "sk": "Eritrea", + "se": "Eritrea", + "pl": "Erytrea", + "no": "Eritrea", + "ja": "エリトリア", + "it": "Eritrea", + "zh": "厄立特里亚", + "nl": "Eritrea", + "de": "Eritrea", + "fr": "Érythrée", + "es": "Eritrea", + "en": "Eritrea", + "pt_BR": "Eritreia", + "sr-Cyrl": "Еритреја", + "sr-Latn": "Eritreja", + "zh_TW": "厄立特裡亞", + "tr": "Eritre", + "ro": "Eritreea", + "ar": "إريتريا", + "fa": "اریتره", + "yue": "厄立特里亞" + }, + flag: "🇪🇷", + code: "ER", + dialCode: "291", + minLength: 7, + maxLength: 7, + ), + Country( + name: "Estonia", + nameTranslations: { + "sk": "Estónsko", + "se": "Estlánda", + "pl": "Estonia", + "no": "Estland", + "ja": "エストニア", + "it": "Estonia", + "zh": "爱沙尼亚", + "nl": "Estland", + "de": "Estland", + "fr": "Estonie", + "es": "Estonia", + "en": "Estonia", + "pt_BR": "Estônia", + "sr-Cyrl": "Естонија", + "sr-Latn": "Estonija", + "zh_TW": "愛沙尼亞", + "tr": "Estonya", + "ro": "Estonia", + "ar": "إستونيا", + "fa": "استونی", + "yue": "愛沙尼亞" + }, + flag: "🇪🇪", + code: "EE", + dialCode: "372", + minLength: 10, + maxLength: 10, + ), + Country( + name: "Ethiopia", + nameTranslations: { + "sk": "Etiópia", + "se": "Etiopia", + "pl": "Etiopia", + "no": "Etiopia", + "ja": "エチオピア", + "it": "Etiopia", + "zh": "埃塞俄比亚", + "nl": "Ethiopië", + "de": "Äthiopien", + "fr": "Éthiopie", + "es": "Etiopía", + "en": "Ethiopia", + "pt_BR": "Etiópia", + "sr-Cyrl": "Етиопија", + "sr-Latn": "Etiopija", + "zh_TW": "伊索比亞", + "tr": "Etiyopya", + "ro": "Etiopia", + "ar": "إثيوبيا", + "fa": "اتیوپی", + "yue": "埃塞俄比亞" + }, + flag: "🇪🇹", + code: "ET", + dialCode: "251", + minLength: 9, + maxLength: 9, + ), + Country( + name: "Falkland Islands (Malvinas)", + nameTranslations: { + "sk": "Falklandy", + "se": "Falklandsullot", + "pl": "Falklandy", + "no": "Falklandsøyene", + "ja": "フォークランド諸島", + "it": "Isole Falkland", + "zh": "福克兰群岛", + "nl": "Falklandeilanden", + "de": "Falklandinseln", + "fr": "Îles Malouines", + "es": "Islas Malvinas", + "en": "Falkland Islands", + "pt_BR": "Ilhas Falkland", + "sr-Cyrl": "Фокландска Острва", + "sr-Latn": "Foklandska Ostrva", + "zh_TW": "福克蘭群島", + "tr": "Falkland Adaları", + "ro": "Insulele Falklands", + "ar": "جزر فوكلاند", + "fa": "جزایر فالکلند", + "yue": "福克蘭群島(馬爾維納斯群島)" + }, + flag: "🇫🇰", + code: "FK", + dialCode: "500", + minLength: 5, + maxLength: 5, + ), + Country( + name: "Faroe Islands", + nameTranslations: { + "sk": "Faerské ostrovy", + "se": "Fearsullot", + "pl": "Wyspy Owcze", + "no": "Færøyene", + "ja": "フェロー諸島", + "it": "Isole Fær Øer", + "zh": "法罗群岛", + "nl": "Faeröer", + "de": "Färöer", + "fr": "Îles Féroé", + "es": "Islas Feroe", + "en": "Faroe Islands", + "pt_BR": "ilhas Faroe", + "sr-Cyrl": "Фарска Острва", + "sr-Latn": "Farska Ostrva", + "zh_TW": "法羅群島", + "tr": "Faroe Adaları", + "ro": "Insulele Feroe", + "ar": "جزر فارو", + "fa": "جزایر فارو", + "yue": "法羅群島" + }, + flag: "🇫🇴", + code: "FO", + dialCode: "298", + minLength: 6, + maxLength: 6, + ), + Country( + name: "Fiji", + nameTranslations: { + "sk": "Fidži", + "se": "Fijisullot", + "pl": "Fidżi", + "no": "Fiji", + "ja": "フィジー", + "it": "Figi", + "zh": "斐济", + "nl": "Fiji", + "de": "Fidschi", + "fr": "Fidji", + "es": "Fiyi", + "en": "Fiji", + "pt_BR": "Fiji", + "sr-Cyrl": "Фиџи", + "sr-Latn": "Fidži", + "zh_TW": "斐濟", + "tr": "Fiji", + "ro": "Fiji", + "ar": "فيجي", + "fa": "فيجي", + "yue": "斐濟" + }, + flag: "🇫🇯", + code: "FJ", + dialCode: "679", + minLength: 7, + maxLength: 7, + ), + Country( + name: "Finland", + nameTranslations: { + "sk": "Fínsko", + "se": "Suopma", + "pl": "Finlandia", + "no": "Finland", + "ja": "フィンランド", + "it": "Finlandia", + "zh": "芬兰", + "nl": "Finland", + "de": "Finnland", + "fr": "Finlande", + "es": "Finlandia", + "en": "Finland", + "pt_BR": "Finlândia", + "sr-Cyrl": "Финска", + "sr-Latn": "Finska", + "zh_TW": "芬蘭", + "tr": "Finlandiya", + "ro": "Finlanda", + "ar": "فنلندا", + "fa": "فنلاند", + "yue": "芬蘭" + }, + flag: "🇫🇮", + code: "FI", + dialCode: "358", + minLength: 12, + maxLength: 12, + ), + Country( + name: "France", + nameTranslations: { + "sk": "Francúzsko", + "se": "Frankriika", + "pl": "Francja", + "no": "Frankrike", + "ja": "フランス", + "it": "Francia", + "zh": "法国", + "nl": "Frankrijk", + "de": "Frankreich", + "fr": "France", + "es": "Francia", + "en": "France", + "pt_BR": "França", + "sr-Cyrl": "Француска", + "sr-Latn": "Francuska", + "zh_TW": "法國", + "tr": "Fransa", + "ro": "Franța", + "ar": "فرنسا", + "fa": "فرانسه", + "yue": "法國" + }, + flag: "🇫🇷", + code: "FR", + dialCode: "33", + minLength: 9, + maxLength: 9, + ), + Country( + name: "French Guiana", + nameTranslations: { + "sk": "Francúzska Guyana", + "se": "Frankriikka Guayana", + "pl": "Gujana Francuska", + "no": "Fransk Guyana", + "ja": "仏領ギアナ", + "it": "Guyana francese", + "zh": "法属圭亚那", + "nl": "Frans-Guyana", + "de": "Französisch-Guayana", + "fr": "Guyane française", + "es": "Guayana Francesa", + "en": "French Guiana", + "pt_BR": "Guiana Francesa", + "sr-Cyrl": "Француска Гвајана", + "sr-Latn": "Francuska Gvajana", + "zh_TW": "法屬蓋亞那", + "tr": "Fransız Guyanası", + "ro": "Guiana Franceză", + "ar": "غويانا الفرنسية", + "fa": "گویان فرانسه", + "yue": "法屬圭亞那" + }, + flag: "🇬🇫", + code: "GF", + dialCode: "594", + minLength: 15, + maxLength: 15, + ), + Country( + name: "French Polynesia", + nameTranslations: { + "sk": "Francúzska Polynézia", + "se": "Frankriikka Polynesia", + "pl": "Polinezja Francuska", + "no": "Fransk Polynesia", + "ja": "仏領ポリネシア", + "it": "Polinesia francese", + "zh": "法属波利尼西亚", + "nl": "Frans-Polynesië", + "de": "Französisch-Polynesien", + "fr": "Polynésie française", + "es": "Polinesia Francesa", + "en": "French Polynesia", + "pt_BR": "Polinésia Francesa", + "sr-Cyrl": "Француска Полинезија", + "sr-Latn": "Francuska Polinezija", + "zh_TW": "法屬玻里尼西亞", + "tr": "Fransız Polinezyası", + "ro": "Polinezia Franceză", + "ar": "بولينزيا الفرنسية", + "fa": "پلی‌نزی فرانسه", + "yue": "法屬波利尼西亞" + }, + flag: "🇵🇫", + code: "PF", + dialCode: "689", + minLength: 6, + maxLength: 6, + ), + Country( + name: "French Southern Territories", + nameTranslations: { + "sk": "Francúzske južné a antarktické územia", + "se": "French Southern Territories", + "pl": "Francuskie Terytoria Południowe i Antarktyczne", + "no": "De franske sørterritorier", + "ja": "仏領極南諸島", + "it": "Terre australi francesi", + "zh": "法属南部领地", + "nl": "Franse Gebieden in de zuidelijke Indische Oceaan", + "de": "Französische Süd- und Antarktisgebiete", + "fr": "Terres australes françaises", + "es": "Territorios Australes Franceses", + "en": "French Southern Territories", + "pt_BR": "Territórios Franceses do Sul", + "sr-Cyrl": "Француске јужне и антарктичке земље", + "sr-Latn": "Francuske južne i antarktičke zemlje", + "zh_TW": "法屬南部屬地", + "tr": "Fransız Güney ve Antarktika Toprakları", + "ro": "Teritoriile australe și antarctice franceze", + "ar": "أراض فرنسية جنوبية وأنتارتيكية", + "fa": "سرزمین‌های جنوبی فرانسه", + "yue": "法國南部領土" + }, + flag: "🇹🇫", + code: "TF", + dialCode: "262", + minLength: 15, + maxLength: 15, + ), + Country( + name: "Gabon", + nameTranslations: { + "sk": "Gabon", + "se": "Gabon", + "pl": "Gabon", + "no": "Gabon", + "ja": "ガボン", + "it": "Gabon", + "zh": "加蓬", + "nl": "Gabon", + "de": "Gabun", + "fr": "Gabon", + "es": "Gabón", + "en": "Gabon", + "pt_BR": "Gabão", + "sr-Cyrl": "Габон", + "sr-Latn": "Gabon", + "zh_TW": "加彭", + "tr": "Gabon", + "ro": "Gabon", + "ar": "الغابون", + "fa": "گابن", + "yue": "加蓬" + }, + flag: "🇬🇦", + code: "GA", + dialCode: "241", + minLength: 9, + maxLength: 9, + ), + Country( + name: "Gambia", + nameTranslations: { + "sk": "Gambia", + "se": "Gámbia", + "pl": "Gambia", + "no": "Gambia", + "ja": "ガンビア", + "it": "Gambia", + "zh": "冈比亚", + "nl": "Gambia", + "de": "Gambia", + "fr": "Gambie", + "es": "Gambia", + "en": "Gambia", + "pt_BR": "Gâmbia", + "sr-Cyrl": "Гамбија", + "sr-Latn": "Gambija", + "zh_TW": "岡比亞", + "tr": "Gambiya", + "ro": "Gambia", + "ar": "غامبيا", + "fa": "گامبیا", + "yue": "岡比亞" + }, + flag: "🇬🇲", + code: "GM", + dialCode: "220", + minLength: 7, + maxLength: 7, + ), + Country( + name: "Georgia", + nameTranslations: { + "sk": "Gruzínsko", + "se": "Georgia", + "pl": "Gruzja", + "no": "Georgia", + "ja": "ジョージア", + "it": "Georgia", + "zh": "格鲁吉亚", + "nl": "Georgië", + "de": "Georgien", + "fr": "Géorgie", + "es": "Georgia", + "en": "Georgia", + "pt_BR": "Georgia", + "sr-Cyrl": "Грузија", + "sr-Latn": "Gruzija", + "zh_TW": "喬治亞", + "tr": "Gürcistan", + "ro": "Georgia", + "ar": "جورجيا", + "fa": "گرجستان", + "yue": "格魯吉亞" + }, + flag: "🇬🇪", + code: "GE", + dialCode: "995", + minLength: 8, + maxLength: 9, + ), + Country( + name: "Germany", + nameTranslations: { + "sk": "Nemecko", + "se": "Duiska", + "pl": "Niemcy", + "no": "Tyskland", + "ja": "ドイツ", + "it": "Germania", + "zh": "德国", + "nl": "Duitsland", + "de": "Deutschland", + "fr": "Allemagne", + "es": "Alemania", + "en": "Germany", + "pt_BR": "Alemanha", + "sr-Cyrl": "Немачка", + "sr-Latn": "Nemačka", + "zh_TW": "德國", + "tr": "Almanya", + "ro": "Germania", + "ar": "ألمانيا", + "fa": "آلمان", + "yue": "德國" + }, + flag: "🇩🇪", + code: "DE", + dialCode: "49", + minLength: 9, + maxLength: 13, + ), + Country( + name: "Ghana", + nameTranslations: { + "sk": "Ghana", + "se": "Ghana", + "pl": "Ghana", + "no": "Ghana", + "ja": "ガーナ", + "it": "Ghana", + "zh": "加纳", + "nl": "Ghana", + "de": "Ghana", + "fr": "Ghana", + "es": "Ghana", + "en": "Ghana", + "pt_BR": "Gana", + "sr-Cyrl": "Гана", + "sr-Latn": "Gana", + "zh_TW": "迦納", + "tr": "Gana", + "ro": "Ghana", + "ar": "غانا", + "fa": "غنا", + "yue": "加納" + }, + flag: "🇬🇭", + code: "GH", + dialCode: "233", + minLength: 9, + maxLength: 9, + ), + Country( + name: "Gibraltar", + nameTranslations: { + "sk": "Gibraltár", + "se": "Gibraltar", + "pl": "Gibraltar", + "no": "Gibraltar", + "ja": "ジブラルタル", + "it": "Gibilterra", + "zh": "直布罗陀", + "nl": "Gibraltar", + "de": "Gibraltar", + "fr": "Gibraltar", + "es": "Gibraltar", + "en": "Gibraltar", + "pt_BR": "Gibraltar", + "sr-Cyrl": "Гибралтар", + "sr-Latn": "Gibraltar", + "zh_TW": "直布羅陀", + "tr": "Cebelitarık", + "ro": "Gibraltar", + "ar": "جبل طارق", + "fa": "جبل الطارق", + "yue": "直布羅陀" + }, + flag: "🇬🇮", + code: "GI", + dialCode: "350", + minLength: 8, + maxLength: 8, + ), + Country( + name: "Greece", + nameTranslations: { + "sk": "Grécko", + "se": "Greika", + "pl": "Grecja", + "no": "Hellas", + "ja": "ギリシャ", + "it": "Grecia", + "zh": "希腊", + "nl": "Griekenland", + "de": "Griechenland", + "fr": "Grèce", + "es": "Grecia", + "en": "Greece", + "pt_BR": "Grécia", + "sr-Cyrl": "Грчка", + "sr-Latn": "Grčka", + "zh_TW": "希臘", + "tr": "Yunanistan", + "ro": "Grecia", + "ar": "اليونان", + "fa": "یونان", + "yue": "希臘" + }, + flag: "🇬🇷", + code: "GR", + dialCode: "30", + minLength: 10, + maxLength: 10, + ), + Country( + name: "Greenland", + nameTranslations: { + "sk": "Grónsko", + "se": "Kalaallit Nunaat", + "pl": "Grenlandia", + "no": "Grønland", + "ja": "グリーンランド", + "it": "Groenlandia", + "zh": "格陵兰", + "nl": "Groenland", + "de": "Grönland", + "fr": "Groenland", + "es": "Groenlandia", + "en": "Greenland", + "pt_BR": "Groenlândia", + "sr-Cyrl": "Гренланд", + "sr-Latn": "Grenland", + "zh_TW": "格陵蘭", + "tr": "Grönland", + "ro": "Groenlanda", + "ar": "جرينلاند", + "fa": "گرینلند", + "yue": "格陵蘭" + }, + flag: "🇬🇱", + code: "GL", + dialCode: "299", + minLength: 6, + maxLength: 6, + ), + Country( + name: "Grenada", + nameTranslations: { + "sk": "Grenada", + "se": "Grenada", + "pl": "Grenada", + "no": "Grenada", + "ja": "グレナダ", + "it": "Grenada", + "zh": "格林纳达", + "nl": "Grenada", + "de": "Grenada", + "fr": "Grenade", + "es": "Granada", + "en": "Grenada", + "pt_BR": "Grenada", + "sr-Cyrl": "Гренада", + "sr-Latn": "Grenada", + "zh_TW": "格林納達", + "tr": "Grenada", + "ro": "Grenada", + "ar": "غرينادا", + "fa": "گرنادا", + "yue": "格林納達" + }, + flag: "🇬🇩", + code: "GD", + dialCode: "1473", + minLength: 7, + maxLength: 7, + ), + Country( + name: "Guadeloupe", + nameTranslations: { + "sk": "Guadeloupe", + "se": "Guadeloupe", + "pl": "Gwadelupa", + "no": "Guadeloupe", + "ja": "グアドループ", + "it": "Guadalupa", + "zh": "瓜德罗普", + "nl": "Guadeloupe", + "de": "Guadeloupe", + "fr": "Guadeloupe", + "es": "Guadalupe", + "en": "Guadeloupe", + "pt_BR": "Guadalupe", + "sr-Cyrl": "Гваделуп", + "sr-Latn": "Gvadelup", + "zh_TW": "瓜地洛普", + "tr": "Guadeloupe", + "ro": "Guadelupa", + "ar": "غوادلوب", + "fa": "گوادلوپ", + "yue": "瓜德罗普" + }, + flag: "🇬🇵", + code: "GP", + dialCode: "590", + minLength: 15, + maxLength: 15, + ), + Country( + name: "Guam", + nameTranslations: { + "sk": "Guam", + "se": "Guam", + "pl": "Guam", + "no": "Guam", + "ja": "グアム", + "it": "Guam", + "zh": "关岛", + "nl": "Guam", + "de": "Guam", + "fr": "Guam", + "es": "Guam", + "en": "Guam", + "pt_BR": "Guam", + "sr-Cyrl": "Гвам", + "sr-Latn": "Gvam", + "zh_TW": "關島", + "tr": "Guam", + "ro": "Guam", + "ar": "غوام", + "fa": "گوام", + "yue": "關島" + }, + flag: "🇬🇺", + code: "GU", + dialCode: "1671", + minLength: 7, + maxLength: 7, + ), + Country( + name: "Guatemala", + nameTranslations: { + "sk": "Guatemala", + "se": "Guatemala", + "pl": "Gwatemala", + "no": "Guatemala", + "ja": "グアテマラ", + "it": "Guatemala", + "zh": "危地马拉", + "nl": "Guatemala", + "de": "Guatemala", + "fr": "Guatemala", + "es": "Guatemala", + "en": "Guatemala", + "pt_BR": "Guatemala", + "sr-Cyrl": "Гватемала", + "sr-Latn": "Gvatemala", + "zh_TW": "瓜地馬拉", + "tr": "Guatemala", + "ro": "Guatemala", + "ar": "غواتيمالا", + "fa": "گواتمالا", + "yue": "危地馬拉" + }, + flag: "🇬🇹", + code: "GT", + dialCode: "502", + minLength: 8, + maxLength: 8, + ), + Country( + name: "Guernsey", + nameTranslations: { + "sk": "Guernsey", + "se": "Guernsey", + "pl": "Guernsey", + "no": "Guernsey", + "ja": "ガーンジー", + "it": "Guernsey", + "zh": "根西岛", + "nl": "Guernsey", + "de": "Guernsey", + "fr": "Guernesey", + "es": "Guernsey", + "en": "Guernsey", + "pt_BR": "Guernsey", + "sr-Cyrl": "Гернзи", + "sr-Latn": "Gernzi", + "zh_TW": "根息島", + "tr": "Guernsey", + "ro": "Guernsey", + "ar": "غيرنزي", + "fa": "گرنزی", + "yue": "格恩西島" + }, + flag: "🇬🇬", + code: "GG", + dialCode: "44", + minLength: 6, + maxLength: 6, + ), + Country( + name: "Guinea", + nameTranslations: { + "sk": "Guinea", + "se": "Guinea", + "pl": "Gwinea", + "no": "Guinea", + "ja": "ギニア", + "it": "Guinea", + "zh": "几内亚", + "nl": "Guinee", + "de": "Guinea", + "fr": "Guinée", + "es": "Guinea", + "en": "Guinea", + "pt_BR": "Guiné", + "sr-Cyrl": "Гвинеја", + "sr-Latn": "Gvineja", + "zh_TW": "幾內亞", + "tr": "Gine", + "ro": "Guinea", + "ar": "غينيا", + "fa": "گینه", + "yue": "幾內亞" + }, + flag: "🇬🇳", + code: "GN", + dialCode: "224", + minLength: 8, + maxLength: 9, + ), + Country( + name: "Guinea-Bissau", + nameTranslations: { + "sk": "Guinea-Bissau", + "se": "Guinea-Bissau", + "pl": "Gwinea Bissau", + "no": "Guinea-Bissau", + "ja": "ギニアビサウ", + "it": "Guinea-Bissau", + "zh": "几内亚比绍", + "nl": "Guinee-Bissau", + "de": "Guinea-Bissau", + "fr": "Guinée-Bissau", + "es": "Guinea-Bisáu", + "en": "Guinea-Bissau", + "pt_BR": "Guiné-bissau", + "sr-Cyrl": "Гвинеја Бисао", + "sr-Latn": "Gvineja Bisao", + "zh_TW": "幾內亞比索", + "tr": "Gine-Bissau", + "ro": "Guineea-Bissau", + "ar": "غينيا بيساو", + "fa": "گینه بیسائو", + "yue": "幾內亞比紹" + }, + flag: "🇬🇼", + code: "GW", + dialCode: "245", + minLength: 7, + maxLength: 7, + ), + Country( + name: "Guyana", + nameTranslations: { + "sk": "Guyana", + "se": "Guyana", + "pl": "Gujana", + "no": "Guyana", + "ja": "ガイアナ", + "it": "Guyana", + "zh": "圭亚那", + "nl": "Guyana", + "de": "Guyana", + "fr": "Guyana", + "es": "Guyana", + "en": "Guyana", + "pt_BR": "Guiana", + "sr-Cyrl": "Гвајана", + "sr-Latn": "Gvajana", + "zh_TW": "蓋亞那", + "tr": "Guyana", + "ro": "Guyana", + "ar": "غيانا", + "fa": "گویان", + "yue": "圭亞那" + }, + flag: "🇬🇾", + code: "GY", + dialCode: "592", + minLength: 7, + maxLength: 7, + ), + Country( + name: "Haiti", + nameTranslations: { + "sk": "Haiti", + "se": "Haiti", + "pl": "Haiti", + "no": "Haiti", + "ja": "ハイチ", + "it": "Haiti", + "zh": "海地", + "nl": "Haïti", + "de": "Haiti", + "fr": "Haïti", + "es": "Haití", + "en": "Haiti", + "pt_BR": "Haiti", + "sr-Cyrl": "Хаити", + "sr-Latn": "Haiti", + "zh_TW": "海地", + "tr": "Haiti", + "ro": "Haiti", + "ar": "هايتي", + "fa": "هائیتی", + "yue": "海地" + }, + flag: "🇭🇹", + code: "HT", + dialCode: "509", + minLength: 8, + maxLength: 8, + ), + Country( + name: "Heard Island and Mcdonald Islands", + nameTranslations: { + "sk": "Heardov ostrov a Macdonaldove ostrovy", + "se": "Heard- ja McDonald-sullot", + "pl": "Wyspy Heard i McDonalda", + "no": "Heard- og McDonaldøyene", + "ja": "ハード島・マクドナルド諸島", + "it": "Isole Heard e McDonald", + "zh": "赫德岛和麦克唐纳群岛", + "nl": "Heard en McDonaldeilanden", + "de": "Heard und McDonaldinseln", + "fr": "Îles Heard et McDonald", + "es": "Islas Heard y McDonald", + "en": "Heard & McDonald Islands", + "pt_BR": "Ilhas Heard e McDonald", + "sr-Cyrl": "Острва Херд и Макдоналд", + "sr-Latn": "Ostrva Herd i Makdonald", + "zh_TW": "赫德暨麥當勞群島", + "tr": "Heard Adası ve McDonald Adaları", + "ro": "Insula Heard și Insulele McDonald", + "ar": "جزيرة هيرد وجزر ماكدونالد", + "fa": "جزیره هرد و جزایر مک‌دونالد", + "yue": "赫德岛同麦克唐纳群岛" + }, + flag: "🇭🇲", + code: "HM", + dialCode: "672", + minLength: 15, + maxLength: 15, + ), + Country( + name: "Holy See (Vatican City State)", + nameTranslations: { + "sk": "Vatikán", + "se": "Vatikána", + "pl": "Watykan", + "no": "Vatikanstaten", + "ja": "バチカン市国", + "it": "Città del Vaticano", + "zh": "梵蒂冈", + "nl": "Vaticaanstad", + "de": "Vatikanstadt", + "fr": "État de la Cité du Vatican", + "es": "Ciudad del Vaticano", + "en": "Vatican City", + "pt_BR": "Cidade do Vaticano", + "sr-Cyrl": "Ватикан", + "sr-Latn": "Vatikan", + "zh_TW": "梵蒂岡", + "tr": "Vatikan", + "ro": "Vatican", + "ar": "الفاتيكان", + "fa": "واتیکان", + "yue": "梵蒂岡城國" + }, + flag: "🇻🇦", + code: "VA", + dialCode: "379", + minLength: 10, + maxLength: 10, + ), + Country( + name: "Honduras", + nameTranslations: { + "sk": "Honduras", + "se": "Honduras", + "pl": "Honduras", + "no": "Honduras", + "ja": "ホンジュラス", + "it": "Honduras", + "zh": "洪都拉斯", + "nl": "Honduras", + "de": "Honduras", + "fr": "Honduras", + "es": "Honduras", + "en": "Honduras", + "pt_BR": "Honduras", + "sr-Cyrl": "Хондурас", + "sr-Latn": "Honduras", + "zh_TW": "宏都拉斯", + "tr": "Honduras", + "ro": "Honduras", + "ar": "هندوراس", + "fa": "هندوراس", + "yue": "洪都拉斯" + }, + flag: "🇭🇳", + code: "HN", + dialCode: "504", + minLength: 8, + maxLength: 8, + ), + Country( + name: "Hong Kong", + nameTranslations: { + "sk": "Hongkong – OAO Číny", + "se": "Hongkong", + "pl": "SRA Hongkong (Chiny)", + "no": "Hongkong S.A.R. Kina", + "ja": "中華人民共和国香港特別行政区", + "it": "RAS di Hong Kong", + "zh": "中国香港特别行政区", + "nl": "Hongkong SAR van China", + "de": "Sonderverwaltungsregion Hongkong", + "fr": "R.A.S. chinoise de Hong Kong", + "es": "RAE de Hong Kong (China)", + "en": "Hong Kong SAR China", + "pt_BR": "RAE de Hong Kong China", + "sr-Cyrl": "Хонг Конг", + "sr-Latn": "Hong Kong", + "zh_TW": "香港", + "tr": "Hong Kong", + "ro": "Hong Kong", + "ar": "هونغ كونغ", + "fa": "هنگ کنگ", + "yue": "香港" + }, + flag: "🇭🇰", + code: "HK", + dialCode: "852", + minLength: 8, + maxLength: 8, + ), + Country( + name: "Hungary", + nameTranslations: { + "sk": "Maďarsko", + "se": "Ungár", + "pl": "Węgry", + "no": "Ungarn", + "ja": "ハンガリー", + "it": "Ungheria", + "zh": "匈牙利", + "nl": "Hongarije", + "de": "Ungarn", + "fr": "Hongrie", + "es": "Hungría", + "en": "Hungary", + "pt_BR": "Hungria", + "sr-Cyrl": "Мађарска", + "sr-Latn": "Mađarska", + "zh_TW": "匈牙利", + "tr": "Macaristan", + "ro": "Ungaria", + "ar": "المجر", + "fa": "مجارستان", + "yue": "匈牙利" + }, + flag: "🇭🇺", + code: "HU", + dialCode: "36", + minLength: 9, + maxLength: 9, + ), + Country( + name: "Iceland", + nameTranslations: { + "sk": "Island", + "se": "Islánda", + "pl": "Islandia", + "no": "Island", + "ja": "アイスランド", + "it": "Islanda", + "zh": "冰岛", + "nl": "IJsland", + "de": "Island", + "fr": "Islande", + "es": "Islandia", + "en": "Iceland", + "pt_BR": "Islândia", + "sr-Cyrl": "Исланд", + "sr-Latn": "Island", + "zh_TW": "冰島", + "tr": "İzlanda", + "ro": "Islanda", + "ar": "آيسلندا", + "fa": "ایسلند", + "yue": "冰島" + }, + flag: "🇮🇸", + code: "IS", + dialCode: "354", + minLength: 7, + maxLength: 9, + ), + Country( + name: "India", + nameTranslations: { + "sk": "India", + "se": "India", + "pl": "Indie", + "no": "India", + "ja": "インド", + "it": "India", + "zh": "印度", + "nl": "India", + "de": "Indien", + "fr": "Inde", + "es": "India", + "en": "India", + "pt_BR": "Índia", + "sr-Cyrl": "Индија", + "sr-Latn": "Indija", + "zh_TW": "印度", + "tr": "Hindistan", + "ro": "India", + "ar": "الهند", + "fa": "هند", + "yue": "印度" + }, + flag: "🇮🇳", + code: "IN", + dialCode: "91", + minLength: 10, + maxLength: 10, + ), + Country( + name: "Indonesia", + nameTranslations: { + "sk": "Indonézia", + "se": "Indonesia", + "pl": "Indonezja", + "no": "Indonesia", + "ja": "インドネシア", + "it": "Indonesia", + "zh": "印度尼西亚", + "nl": "Indonesië", + "de": "Indonesien", + "fr": "Indonésie", + "es": "Indonesia", + "en": "Indonesia", + "pt_BR": "Indonésia", + "sr-Cyrl": "Индонезија", + "sr-Latn": "Indonezija", + "zh_TW": "印尼", + "tr": "Endonezya", + "ro": "Indonezia", + "ar": "إندونيسيا", + "fa": "اندونزی", + "yue": "印尼" + }, + flag: "🇮🇩", + code: "ID", + dialCode: "62", + minLength: 10, + maxLength: 13, + ), + Country( + name: "Iran, Islamic Republic of Persian Gulf", + nameTranslations: { + "sk": "Irán", + "se": "Iran", + "pl": "Iran", + "no": "Iran", + "ja": "イラン", + "it": "Iran", + "zh": "伊朗", + "nl": "Iran", + "de": "Iran", + "fr": "Iran", + "es": "Irán", + "en": "Iran", + "pt_BR": "Irã", + "sr-Cyrl": "Иран", + "sr-Latn": "Iran", + "zh_TW": "伊朗", + "tr": "İran", + "ro": "Iran", + "ar": "إيران", + "fa": "ایران", + "yue": "伊朗" + }, + flag: "🇮🇷", + code: "IR", + dialCode: "98", + minLength: 10, + maxLength: 10, + ), + Country( + name: "Iraq", + nameTranslations: { + "sk": "Irak", + "se": "Irak", + "pl": "Irak", + "no": "Irak", + "ja": "イラク", + "it": "Iraq", + "zh": "伊拉克", + "nl": "Irak", + "de": "Irak", + "fr": "Irak", + "es": "Irak", + "en": "Iraq", + "pt_BR": "Iraque", + "sr-Cyrl": "Ирак", + "sr-Latn": "Irak", + "zh_TW": "伊拉克", + "tr": "Irak", + "ro": "Irak", + "ar": "العراق", + "fa": "عراق", + "yue": "伊拉克" + }, + flag: "🇮🇶", + code: "IQ", + dialCode: "964", + minLength: 10, + maxLength: 10, + ), + Country( + name: "Ireland", + nameTranslations: { + "sk": "Írsko", + "se": "Irlánda", + "pl": "Irlandia", + "no": "Irland", + "ja": "アイルランド", + "it": "Irlanda", + "zh": "爱尔兰", + "nl": "Ierland", + "de": "Irland", + "fr": "Irlande", + "es": "Irlanda", + "en": "Ireland", + "pt_BR": "Irlanda", + "sr-Cyrl": "Ирска", + "sr-Latn": "Irska", + "zh_TW": "愛爾蘭", + "tr": "İrlanda", + "ro": "Irlanda", + "ar": "أيرلندا", + "fa": "ایرلند", + "yue": "愛爾蘭" + }, + flag: "🇮🇪", + code: "IE", + dialCode: "353", + minLength: 7, + maxLength: 9, + ), + Country( + name: "Isle of Man", + nameTranslations: { + "sk": "Ostrov Man", + "se": "Mann-sullot", + "pl": "Wyspa Man", + "no": "Man", + "ja": "マン島", + "it": "Isola di Man", + "zh": "马恩岛", + "nl": "Isle of Man", + "de": "Isle of Man", + "fr": "Île de Man", + "es": "Isla de Man", + "en": "Isle of Man", + "pt_BR": "Ilha de Man", + "sr-Cyrl": "Острво Мен", + "sr-Latn": "Ostrvo Men", + "zh_TW": "曼島", + "tr": "Man Adası", + "ro": "Insula Man", + "ar": "جزيرة مان", + "fa": "جزیره مان", + "yue": "马伊岛" + }, + flag: "🇮🇲", + code: "IM", + dialCode: "44", + minLength: 6, + maxLength: 6, + ), + Country( + name: "Israel", + nameTranslations: { + "sk": "Izrael", + "se": "Israel", + "pl": "Izrael", + "no": "Israel", + "ja": "イスラエル", + "it": "Israele", + "zh": "以色列", + "nl": "Israël", + "de": "Israel", + "fr": "Israël", + "es": "Israel", + "en": "Israel", + "pt_BR": "Israel", + "sr-Cyrl": "Израел", + "sr-Latn": "Izrael", + "zh_TW": "以色列", + "tr": "İsrail", + "ro": "Israel", + "ar": "إسرائيل", + "fa": "إسرائيل", + "yue": "以色列" + }, + flag: "🇮🇱", + code: "IL", + dialCode: "972", + minLength: 9, + maxLength: 9, + ), + Country( + name: "Campione d'Italia", + nameTranslations: { + "sk": "Taliansko", + "se": "Itália", + "pl": "Włochy", + "no": "Italia", + "ja": "イタリア", + "it": "Italia", + "zh": "意大利", + "nl": "Italië", + "de": "Italien", + "fr": "Italie", + "es": "Italia", + "en": "Italy", + "pt_BR": "Itália", + "sr-Cyrl": "Италија", + "sr-Latn": "Italija", + "zh_TW": "義大利", + "tr": "İtalya", + "ro": "Italia", + "ar": "إيطاليا", + "fa": "ایتالیا", + "yue": "意大利" + }, + flag: "🇮🇹", + code: "IT", + dialCode: "39", + minLength: 9, + maxLength: 10, + ), + Country( + name: "Jamaica", + nameTranslations: { + "sk": "Jamajka", + "se": "Jamaica", + "pl": "Jamajka", + "no": "Jamaica", + "ja": "ジャマイカ", + "it": "Giamaica", + "zh": "牙买加", + "nl": "Jamaica", + "de": "Jamaika", + "fr": "Jamaïque", + "es": "Jamaica", + "en": "Jamaica", + "pt_BR": "Jamaica", + "sr-Cyrl": "Јамајка", + "sr-Latn": "Jamajka", + "zh_TW": "牙買加", + "tr": "Jamaika", + "ro": "Jamaica", + "ar": "جامايكا", + "fa": "جامائیکا", + "yue": "牙買加" + }, + flag: "🇯🇲", + code: "JM", + dialCode: "1876", + minLength: 7, + maxLength: 7, + ), + Country( + name: "Japan", + nameTranslations: { + "sk": "Japonsko", + "se": "Japána", + "pl": "Japonia", + "no": "Japan", + "ja": "日本", + "it": "Giappone", + "zh": "日本", + "nl": "Japan", + "de": "Japan", + "fr": "Japon", + "es": "Japón", + "en": "Japan", + "pt_BR": "Japão", + "sr-Cyrl": "Јапан", + "sr-Latn": "Japan", + "zh_TW": "日本", + "tr": "Japonya", + "ro": "Japonia", + "ar": "اليابان", + "fa": "ژاپن", + "yue": "日本" + }, + flag: "🇯🇵", + code: "JP", + dialCode: "81", + minLength: 10, + maxLength: 10, + ), + Country( + name: "Jersey", + nameTranslations: { + "sk": "Jersey", + "se": "Jersey", + "pl": "Jersey", + "no": "Jersey", + "ja": "ジャージー", + "it": "Jersey", + "zh": "泽西岛", + "nl": "Jersey", + "de": "Jersey", + "fr": "Jersey", + "es": "Jersey", + "en": "Jersey", + "pt_BR": "Jersey", + "sr-Cyrl": "Џерзи", + "sr-Latn": "Džerzi", + "zh_TW": "澤西", + "tr": "Jersey", + "ro": "Jersey", + "ar": "جيرزي", + "fa": "جرزی", + "yue": "澤西" + }, + flag: "🇯🇪", + code: "JE", + dialCode: "44", + minLength: 6, + maxLength: 6, + ), + Country( + name: "Jordan", + nameTranslations: { + "sk": "Jordánsko", + "se": "Jordánia", + "pl": "Jordania", + "no": "Jordan", + "ja": "ヨルダン", + "it": "Giordania", + "zh": "约旦", + "nl": "Jordanië", + "de": "Jordanien", + "fr": "Jordanie", + "es": "Jordania", + "en": "Jordan", + "pt_BR": "Jordânia", + "sr-Cyrl": "Јордан", + "sr-Latn": "Jordan", + "zh_TW": "約旦", + "tr": "Mavera-i Ürdün", + "ro": "Iordania", + "ar": "الأردن", + "fa": "اردن", + "yue": "約旦" + }, + flag: "🇯🇴", + code: "JO", + dialCode: "962", + minLength: 9, + maxLength: 9, + ), + Country( + name: "Kazakhstan", + nameTranslations: { + "sk": "Kazachstan", + "se": "Kasakstan", + "pl": "Kazachstan", + "no": "Kasakhstan", + "ja": "カザフスタン", + "it": "Kazakistan", + "zh": "哈萨克斯坦", + "nl": "Kazachstan", + "de": "Kasachstan", + "fr": "Kazakhstan", + "es": "Kazajistán", + "en": "Kazakhstan", + "pt_BR": "Cazaquistão", + "sr-Cyrl": "Казахстан", + "sr-Latn": "Kazahstan", + "zh_TW": "哈薩克", + "tr": "Kazakistan", + "ro": "Kazahstan", + "ar": "كازاخستان", + "fa": "قزاقستان", + "yue": "哈薩克斯坦" + }, + flag: "🇰🇿", + code: "KZ", + dialCode: "7", + minLength: 10, + maxLength: 10, + ), + Country( + name: "Kenya", + nameTranslations: { + "sk": "Keňa", + "se": "Kenia", + "pl": "Kenia", + "no": "Kenya", + "ja": "ケニア", + "it": "Kenya", + "zh": "肯尼亚", + "nl": "Kenia", + "de": "Kenia", + "fr": "Kenya", + "es": "Kenia", + "en": "Kenya", + "pt_BR": "Quênia", + "sr-Cyrl": "Кенија", + "sr-Latn": "Kenija", + "zh_TW": "肯亞", + "tr": "Kenya", + "ro": "Kenya", + "ar": "كينيا", + "fa": "كنيا", + "yue": "肯雅" + }, + flag: "🇰🇪", + code: "KE", + dialCode: "254", + minLength: 10, + maxLength: 10, + ), + Country( + name: "Kiribati", + nameTranslations: { + "sk": "Kiribati", + "se": "Kiribati", + "pl": "Kiribati", + "no": "Kiribati", + "ja": "キリバス", + "it": "Kiribati", + "zh": "基里巴斯", + "nl": "Kiribati", + "de": "Kiribati", + "fr": "Kiribati", + "es": "Kiribati", + "en": "Kiribati", + "pt_BR": "Kiribati", + "sr-Cyrl": "Кирибати", + "sr-Latn": "Kiribati", + "zh_TW": "吉里巴斯", + "tr": "Kiribati", + "ro": "Kiribati", + "ar": "كيريباتي", + "fa": "کیریباتی", + "yue": "基里巴斯" + }, + flag: "🇰🇮", + code: "KI", + dialCode: "686", + minLength: 5, + maxLength: 5, + ), + Country( + name: "Korea, Democratic People's Republic of Korea", + nameTranslations: { + "sk": "Severná Kórea", + "se": "Davvi-Korea", + "pl": "Korea Północna", + "no": "Nord-Korea", + "ja": "北朝鮮", + "it": "Corea del Nord", + "zh": "朝鲜", + "nl": "Noord-Korea", + "de": "Nordkorea", + "fr": "Corée du Nord", + "es": "Corea del Norte", + "en": "North Korea", + "pt_BR": "Coreia do Norte", + "sr-Cyrl": "Северна Кореја", + "sr-Latn": "Severna Koreja", + "zh_TW": "北韓", + "tr": "Kuzey Kore", + "ro": "Coreea de Nord", + "ar": "كوريا الشمالية", + "fa": "کره شمالی", + "yue": "朝鮮(朝鮮民主主義人民共咊囯)" + }, + flag: "🇰🇵", + code: "KP", + dialCode: "850", + minLength: 10, + maxLength: 10, + ), + Country( + name: "Korea, Republic of South Korea", + nameTranslations: { + "sk": "Južná Kórea", + "se": "Mátta-Korea", + "pl": "Korea Południowa", + "no": "Sør-Korea", + "ja": "韓国", + "it": "Corea del Sud", + "zh": "韩国", + "nl": "Zuid-Korea", + "de": "Südkorea", + "fr": "Corée du Sud", + "es": "Corea del Sur", + "en": "South Korea", + "pt_BR": "Coreia do Sul", + "sr-Cyrl": "Јужна Кореја", + "sr-Latn": "Južna Koreja", + "zh_TW": "南韓", + "tr": "Güney Kore", + "ro": "Coreea de Sud", + "ar": "كوريا الجنوبية", + "fa": "کره جنوبی", + "yue": "韓國(大韓民國)" + }, + flag: "🇰🇷", + code: "KR", + dialCode: "82", + minLength: 11, + maxLength: 11, + ), + Country( + name: "Kuwait", + nameTranslations: { + "sk": "Kuvajt", + "se": "Kuwait", + "pl": "Kuwejt", + "no": "Kuwait", + "ja": "クウェート", + "it": "Kuwait", + "zh": "科威特", + "nl": "Koeweit", + "de": "Kuwait", + "fr": "Koweït", + "es": "Kuwait", + "en": "Kuwait", + "pt_BR": "Kuwait", + "sr-Cyrl": "Кувајт", + "sr-Latn": "Kuvajt", + "zh_TW": "科威特", + "tr": "Kuveyt", + "ro": "Kuweit", + "ar": "الكويت", + "fa": "کویت", + "yue": "科威特" + }, + flag: "🇰🇼", + code: "KW", + dialCode: "965", + minLength: 8, + maxLength: 8, + ), + Country( + name: "Kyrgyzstan", + nameTranslations: { + "sk": "Kirgizsko", + "se": "Kirgisistan", + "pl": "Kirgistan", + "no": "Kirgisistan", + "ja": "キルギス", + "it": "Kirghizistan", + "zh": "吉尔吉斯斯坦", + "nl": "Kirgizië", + "de": "Kirgisistan", + "fr": "Kirghizistan", + "es": "Kirguistán", + "en": "Kyrgyzstan", + "pt_BR": "Quirguistão", + "sr-Cyrl": "Киргистан", + "sr-Latn": "Kirgistan", + "zh_TW": "吉爾吉斯", + "tr": "Kırgızistan", + "ro": "Kîrgîzstan", + "ar": "قيرغيزستان", + "fa": "قرقیزستان", + "yue": "吉爾吉斯斯坦" + }, + flag: "🇰🇬", + code: "KG", + dialCode: "996", + minLength: 9, + maxLength: 9, + ), + Country( + name: "Laos", + nameTranslations: { + "sk": "Laos", + "se": "Laos", + "pl": "Laos", + "no": "Laos", + "ja": "ラオス", + "it": "Laos", + "zh": "老挝", + "nl": "Laos", + "de": "Laos", + "fr": "Laos", + "es": "Laos", + "en": "Laos", + "pt_BR": "Laos", + "sr-Cyrl": "Лаос", + "sr-Latn": "Laos", + "zh_TW": "寮國", + "tr": "Laos", + "ro": "Laos", + "ar": "لاوس", + "fa": "لائوس", + "yue": "老撾人民民主共和國" + }, + flag: "🇱🇦", + code: "LA", + dialCode: "856", + minLength: 10, + maxLength: 10, + ), + Country( + name: "Latvia", + nameTranslations: { + "sk": "Lotyšsko", + "se": "Látvia", + "pl": "Łotwa", + "no": "Latvia", + "ja": "ラトビア", + "it": "Lettonia", + "zh": "拉脱维亚", + "nl": "Letland", + "de": "Lettland", + "fr": "Lettonie", + "es": "Letonia", + "en": "Latvia", + "pt_BR": "Letônia", + "sr-Cyrl": "Летонија", + "sr-Latn": "Letonija", + "zh_TW": "拉托維亞", + "tr": "Letonya", + "ro": "Letonia", + "ar": "لاتفيا", + "fa": "لتونی", + "yue": "拉脫維亞" + }, + flag: "🇱🇻", + code: "LV", + dialCode: "371", + minLength: 8, + maxLength: 8, + ), + Country( + name: "Lebanon", + nameTranslations: { + "sk": "Libanon", + "se": "Libanon", + "pl": "Liban", + "no": "Libanon", + "ja": "レバノン", + "it": "Libano", + "zh": "黎巴嫩", + "nl": "Libanon", + "de": "Libanon", + "fr": "Liban", + "es": "Líbano", + "en": "Lebanon", + "pt_BR": "Líbano", + "sr-Cyrl": "Либан", + "sr-Latn": "Liban", + "zh_TW": "黎巴嫩", + "tr": "Lübnan", + "ro": "Liban", + "ar": "لبنان", + "fa": "لبنان", + "yue": "黎巴嫩" + }, + flag: "🇱🇧", + code: "LB", + dialCode: "961", + minLength: 8, + maxLength: 8, + ), + Country( + name: "Lesotho", + nameTranslations: { + "sk": "Lesotho", + "se": "Lesotho", + "pl": "Lesotho", + "no": "Lesotho", + "ja": "レソト", + "it": "Lesotho", + "zh": "莱索托", + "nl": "Lesotho", + "de": "Lesotho", + "fr": "Lesotho", + "es": "Lesoto", + "en": "Lesotho", + "pt_BR": "Lesoto", + "sr-Cyrl": "Лесото", + "sr-Latn": "Lesoto", + "zh_TW": "賴索托", + "tr": "Lesotho", + "ro": "Lesotho", + "ar": "ليسوتو", + "fa": "لسوتو", + "yue": "萊索托" + }, + flag: "🇱🇸", + code: "LS", + dialCode: "266", + minLength: 8, + maxLength: 8, + ), + Country( + name: "Liberia", + nameTranslations: { + "sk": "Libéria", + "se": "Liberia", + "pl": "Liberia", + "no": "Liberia", + "ja": "リベリア", + "it": "Liberia", + "zh": "利比里亚", + "nl": "Liberia", + "de": "Liberia", + "fr": "Libéria", + "es": "Liberia", + "en": "Liberia", + "pt_BR": "Libéria", + "sr-Cyrl": "Либерија", + "sr-Latn": "Liberija", + "zh_TW": "賴比瑞亞", + "tr": "Liberya", + "ro": "Liberia", + "ar": "ليبيريا", + "fa": "لیبریا", + "yue": "利比里亞" + }, + flag: "🇱🇷", + code: "LR", + dialCode: "231", + minLength: 8, + maxLength: 8, + ), + Country( + name: "Libyan Arab Jamahiriya", + nameTranslations: { + "sk": "Líbya", + "se": "Libya", + "pl": "Libia", + "no": "Libya", + "ja": "リビア", + "it": "Libia", + "zh": "利比亚", + "nl": "Libië", + "de": "Libyen", + "fr": "Libye", + "es": "Libia", + "en": "Libya", + "pt_BR": "Líbia", + "sr-Cyrl": "Либија", + "sr-Latn": "Libija", + "zh_TW": "利比亞", + "tr": "Libya", + "ro": "Libia", + "ar": "ليبيا", + "fa": "لیبی", + "yue": "利比亞" + }, + flag: "🇱🇾", + code: "LY", + dialCode: "218", + minLength: 9, + maxLength: 9, + ), + Country( + name: "Liechtenstein", + nameTranslations: { + "sk": "Lichtenštajnsko", + "se": "Liechtenstein", + "pl": "Liechtenstein", + "no": "Liechtenstein", + "ja": "リヒテンシュタイン", + "it": "Liechtenstein", + "zh": "列支敦士登", + "nl": "Liechtenstein", + "de": "Liechtenstein", + "fr": "Liechtenstein", + "es": "Liechtenstein", + "en": "Liechtenstein", + "pt_BR": "Liechtenstein", + "sr-Cyrl": "Лихтенштајн", + "sr-Latn": "Lihtenštajn", + "zh_TW": "列支敦斯登", + "tr": "Lihtenştayn", + "ro": "Liechtenstein", + "ar": "ليختنشتاين", + "fa": "لیختن‌اشتاین", + "yue": "列支敦士登" + }, + flag: "🇱🇮", + code: "LI", + dialCode: "423", + minLength: 9, + maxLength: 9, + ), + Country( + name: "Lithuania", + nameTranslations: { + "sk": "Litva", + "se": "Lietuva", + "pl": "Litwa", + "no": "Litauen", + "ja": "リトアニア", + "it": "Lituania", + "zh": "立陶宛", + "nl": "Litouwen", + "de": "Litauen", + "fr": "Lituanie", + "es": "Lituania", + "en": "Lithuania", + "pt_BR": "Lituânia", + "sr-Cyrl": "Литванија", + "sr-Latn": "Litvanija", + "zh_TW": "立陶宛", + "tr": "Litvanya", + "ro": "Lituania", + "ar": "ليتوانيا", + "fa": "لیتوانی", + "yue": "立陶宛" + }, + flag: "🇱🇹", + code: "LT", + dialCode: "370", + minLength: 8, + maxLength: 8, + ), + Country( + name: "Luxembourg", + nameTranslations: { + "sk": "Luxembursko", + "se": "Luxembourg", + "pl": "Luksemburg", + "no": "Luxemburg", + "ja": "ルクセンブルク", + "it": "Lussemburgo", + "zh": "卢森堡", + "nl": "Luxemburg", + "de": "Luxemburg", + "fr": "Luxembourg", + "es": "Luxemburgo", + "en": "Luxembourg", + "pt_BR": "Luxemburgo", + "sr-Cyrl": "Луксенбург", + "sr-Latn": "Luksenburg", + "zh_TW": "盧森堡", + "tr": "Lüksemburg", + "ro": "Luxemburg", + "ar": "لوكسمبورغ", + "fa": "لوکزامبورگ", + "yue": "盧森堡" + }, + flag: "🇱🇺", + code: "LU", + dialCode: "352", + minLength: 11, + maxLength: 11, + ), + Country( + name: "Macao", + nameTranslations: { + "sk": "Macao – OAO Číny", + "se": "Makáo", + "pl": "SRA Makau (Chiny)", + "no": "Macao S.A.R. Kina", + "ja": "中華人民共和国マカオ特別行政区", + "it": "RAS di Macao", + "zh": "中国澳门特别行政区", + "nl": "Macau SAR van China", + "de": "Sonderverwaltungsregion Macau", + "fr": "R.A.S. chinoise de Macao", + "es": "RAE de Macao (China)", + "en": "Macao SAR China", + "pt_BR": "RAE de Macau China", + "sr-Cyrl": "Макао", + "sr-Latn": "Makao", + "zh_TW": "澳門", + "tr": "Makao", + "ro": "Macao", + "ar": "ماكاو", + "fa": "ماكائو", + "yue": "澳門" + }, + flag: "🇲🇴", + code: "MO", + dialCode: "853", + minLength: 8, + maxLength: 8, + ), + Country( + name: "Macedonia", + nameTranslations: { + "sk": "Severné Macedónsko", + "se": "North Macedonia", + "pl": "Macedonia Północna", + "no": "Nord-Makedonia", + "ja": "北マケドニア", + "it": "Macedonia del Nord", + "zh": "北马其顿", + "nl": "Noord-Macedonië", + "de": "Nordmazedonien", + "fr": "Macédoine du Nord", + "es": "Macedonia del Norte", + "en": "North Macedonia", + "pt_BR": "Macedônia do Norte", + "sr-Cyrl": "Северна Македонија", + "sr-Latn": "Severna Makedonija", + "zh_TW": "北馬其頓", + "tr": "Kuzey Makedonya", + "ro": "Macedonia de Nord", + "ar": "مقدونيا", + "fa": "مقدونیه", + "yue": "馬其頓(前南斯拉夫共和國)" + }, + flag: "🇲🇰", + code: "MK", + dialCode: "389", + minLength: 8, + maxLength: 8, + ), + Country( + name: "Madagascar", + nameTranslations: { + "sk": "Madagaskar", + "se": "Madagaskar", + "pl": "Madagaskar", + "no": "Madagaskar", + "ja": "マダガスカル", + "it": "Madagascar", + "zh": "马达加斯加", + "nl": "Madagaskar", + "de": "Madagaskar", + "fr": "Madagascar", + "es": "Madagascar", + "en": "Madagascar", + "pt_BR": "Madagáscar", + "sr-Cyrl": "Мадагаскар", + "sr-Latn": "Madagaskar", + "zh_TW": "馬達加斯加", + "tr": "Madagaskar", + "ro": "Madagascar", + "ar": "مدغشقر", + "fa": "ماداگاسکار", + "yue": "馬達加斯加" + }, + flag: "🇲🇬", + code: "MG", + dialCode: "261", + minLength: 10, + maxLength: 10, + ), + Country( + name: "Malawi", + nameTranslations: { + "sk": "Malawi", + "se": "Malawi", + "pl": "Malawi", + "no": "Malawi", + "ja": "マラウイ", + "it": "Malawi", + "zh": "马拉维", + "nl": "Malawi", + "de": "Malawi", + "fr": "Malawi", + "es": "Malaui", + "en": "Malawi", + "pt_BR": "Malawi", + "sr-Cyrl": "Малави", + "sr-Latn": "Malavi", + "zh_TW": "馬拉威", + "tr": "Malavi", + "ro": "Malawi", + "ar": "مالاوي", + "fa": "مالاوی", + "yue": "馬拉維" + }, + flag: "🇲🇼", + code: "MW", + dialCode: "265", + minLength: 7, + maxLength: 9, + ), + Country( + name: "Malaysia", + nameTranslations: { + "sk": "Malajzia", + "se": "Malesia", + "pl": "Malezja", + "no": "Malaysia", + "ja": "マレーシア", + "it": "Malaysia", + "zh": "马来西亚", + "nl": "Maleisië", + "de": "Malaysia", + "fr": "Malaisie", + "es": "Malasia", + "en": "Malaysia", + "pt_BR": "Malásia", + "sr-Cyrl": "Малезија", + "sr-Latn": "Malezija", + "zh_TW": "馬來西亞", + "tr": "Malezya", + "ro": "Malaezia", + "ar": "ماليزيا", + "fa": "مالزی", + "yue": "馬來西亞" + }, + flag: "🇲🇾", + code: "MY", + dialCode: "60", + minLength: 9, + maxLength: 10, + ), + Country( + name: "Maldives", + nameTranslations: { + "sk": "Maldivy", + "se": "Malediivvat", + "pl": "Malediwy", + "no": "Maldivene", + "ja": "モルディブ", + "it": "Maldive", + "zh": "马尔代夫", + "nl": "Maldiven", + "de": "Malediven", + "fr": "Maldives", + "es": "Maldivas", + "en": "Maldives", + "pt_BR": "Maldivas", + "sr-Cyrl": "Малдиви", + "sr-Latn": "Maldivi", + "zh_TW": "馬爾地夫", + "tr": "Maldivler", + "ro": "Maldive", + "ar": "جزر المالديف", + "fa": "مالدیو", + "yue": "馬爾代夫" + }, + flag: "🇲🇻", + code: "MV", + dialCode: "960", + minLength: 7, + maxLength: 7, + ), + Country( + name: "Mali", + nameTranslations: { + "sk": "Mali", + "se": "Mali", + "pl": "Mali", + "no": "Mali", + "ja": "マリ", + "it": "Mali", + "zh": "马里", + "nl": "Mali", + "de": "Mali", + "fr": "Mali", + "es": "Mali", + "en": "Mali", + "pt_BR": "Mali", + "sr-Cyrl": "Мали", + "sr-Latn": "Mali", + "zh_TW": "馬里", + "tr": "Mali", + "ro": "Mali", + "ar": "مالي", + "fa": "مالی", + "yue": "馬里" + }, + flag: "🇲🇱", + code: "ML", + dialCode: "223", + minLength: 8, + maxLength: 8, + ), + Country( + name: "Malta", + nameTranslations: { + "sk": "Malta", + "se": "Málta", + "pl": "Malta", + "no": "Malta", + "ja": "マルタ", + "it": "Malta", + "zh": "马耳他", + "nl": "Malta", + "de": "Malta", + "fr": "Malte", + "es": "Malta", + "en": "Malta", + "pt_BR": "Malta", + "sr-Cyrl": "Малта", + "sr-Latn": "Malta", + "zh_TW": "馬爾他", + "tr": "Malta", + "ro": "Malta", + "ar": "مالطا", + "fa": "مالت", + "yue": "馬耳他" + }, + flag: "🇲🇹", + code: "MT", + dialCode: "356", + minLength: 8, + maxLength: 8, + ), + Country( + name: "Marshall Islands", + nameTranslations: { + "sk": "Marshallove ostrovy", + "se": "Marshallsullot", + "pl": "Wyspy Marshalla", + "no": "Marshalløyene", + "ja": "マーシャル諸島", + "it": "Isole Marshall", + "zh": "马绍尔群岛", + "nl": "Marshalleilanden", + "de": "Marshallinseln", + "fr": "Îles Marshall", + "es": "Islas Marshall", + "en": "Marshall Islands", + "pt_BR": "Ilhas Marshall", + "sr-Cyrl": "Маршалска Острва", + "sr-Latn": "Maršalska Ostrva", + "zh_TW": "馬紹爾群島", + "tr": "Marshall Adaları", + "ro": "Insulele Marshall", + "ar": "جزر مارشال", + "fa": "جزایر مارشال", + "yue": "馬紹爾群島" + }, + flag: "🇲🇭", + code: "MH", + dialCode: "692", + minLength: 7, + maxLength: 7, + ), + Country( + name: "Martinique", + nameTranslations: { + "sk": "Martinik", + "se": "Martinique", + "pl": "Martynika", + "no": "Martinique", + "ja": "マルティニーク", + "it": "Martinica", + "zh": "马提尼克", + "nl": "Martinique", + "de": "Martinique", + "fr": "Martinique", + "es": "Martinica", + "en": "Martinique", + "pt_BR": "Martinica", + "sr-Cyrl": "Мартиник", + "sr-Latn": "Martinik", + "zh_TW": "馬丁尼克", + "tr": "Martinique", + "ro": "Martinica", + "ar": "مارتينيك", + "fa": "مارتینیک", + "yue": "马提尼克" + }, + flag: "🇲🇶", + code: "MQ", + dialCode: "596", + minLength: 15, + maxLength: 15, + ), + Country( + name: "Mauritania", + nameTranslations: { + "sk": "Mauritánia", + "se": "Mauretánia", + "pl": "Mauretania", + "no": "Mauritania", + "ja": "モーリタニア", + "it": "Mauritania", + "zh": "毛里塔尼亚", + "nl": "Mauritanië", + "de": "Mauretanien", + "fr": "Mauritanie", + "es": "Mauritania", + "en": "Mauritania", + "pt_BR": "Mauritânia", + "sr-Cyrl": "Мауританија", + "sr-Latn": "Mauritanija", + "zh_TW": "茅利塔尼亞", + "tr": "Moritanya", + "ro": "Mauritania", + "ar": "موريتانيا", + "fa": "موریتانی", + "yue": "毛里塔尼亞" + }, + flag: "🇲🇷", + code: "MR", + dialCode: "222", + minLength: 8, + maxLength: 8, + ), + Country( + name: "Mauritius", + nameTranslations: { + "sk": "Maurícius", + "se": "Mauritius", + "pl": "Mauritius", + "no": "Mauritius", + "ja": "モーリシャス", + "it": "Mauritius", + "zh": "毛里求斯", + "nl": "Mauritius", + "de": "Mauritius", + "fr": "Maurice", + "es": "Mauricio", + "en": "Mauritius", + "pt_BR": "Maurício", + "sr-Cyrl": "Маурицијус", + "sr-Latn": "Mauricijus", + "zh_TW": "模里西斯", + "tr": "Mauritius", + "ro": "Mauritius", + "ar": "موريشيوس", + "fa": "موریس", + "yue": "毛里求斯" + }, + flag: "🇲🇺", + code: "MU", + dialCode: "230", + minLength: 7, + maxLength: 8, + ), + Country( + name: "Mayotte", + nameTranslations: { + "sk": "Mayotte", + "se": "Mayotte", + "pl": "Majotta", + "no": "Mayotte", + "ja": "マヨット", + "it": "Mayotte", + "zh": "马约特", + "nl": "Mayotte", + "de": "Mayotte", + "fr": "Mayotte", + "es": "Mayotte", + "en": "Mayotte", + "pt_BR": "Mayotte", + "sr-Cyrl": "Мајота", + "sr-Latn": "Majota", + "zh_TW": "馬約特", + "tr": "Mayotte", + "ro": "Mayotte", + "ar": "مايوت", + "fa": "مایوت", + "yue": "馬約特" + }, + flag: "🇾🇹", + code: "YT", + dialCode: "262", + minLength: 9, + maxLength: 9, + ), + Country( + name: "Mexico", + nameTranslations: { + "sk": "Mexiko", + "se": "Meksiko", + "pl": "Meksyk", + "no": "Mexico", + "ja": "メキシコ", + "it": "Messico", + "zh": "墨西哥", + "nl": "Mexico", + "de": "Mexiko", + "fr": "Mexique", + "es": "México", + "en": "Mexico", + "pt_BR": "México", + "sr-Cyrl": "Мексико", + "sr-Latn": "Meksiko", + "zh_TW": "墨西哥", + "tr": "Meksika", + "ro": "Mexic", + "ar": "المكسيك", + "fa": "مکزیک", + "yue": "墨西哥" + }, + flag: "🇲🇽", + code: "MX", + dialCode: "52", + minLength: 10, + maxLength: 10, + ), + Country( + name: "Micronesia, Federated States of Micronesia", + nameTranslations: { + "sk": "Mikronézia", + "se": "Mikronesia", + "pl": "Mikronezja", + "no": "Mikronesiaføderasjonen", + "ja": "ミクロネシア連邦", + "it": "Micronesia", + "zh": "密克罗尼西亚", + "nl": "Micronesia", + "de": "Mikronesien", + "fr": "États fédérés de Micronésie", + "es": "Micronesia", + "en": "Micronesia", + "pt_BR": "Micronésia", + "sr-Cyrl": "Микронезија", + "sr-Latn": "Mikronezija", + "zh_TW": "密克羅尼西亞", + "tr": "Mikronezya", + "ro": "Micronezia", + "ar": "ولايات ميكرونيسيا المتحدة", + "fa": "ایالات فدرال میکرونزی", + "yue": "密克罗尼西亚(聯邦)" + }, + flag: "🇫🇲", + code: "FM", + dialCode: "691", + minLength: 7, + maxLength: 7, + ), + Country( + name: "Moldova", + nameTranslations: { + "sk": "Moldavsko", + "se": "Moldávia", + "pl": "Mołdawia", + "no": "Moldova", + "ja": "モルドバ", + "it": "Moldavia", + "zh": "摩尔多瓦", + "nl": "Moldavië", + "de": "Republik Moldau", + "fr": "Moldavie", + "es": "Moldavia", + "en": "Moldova", + "pt_BR": "Moldova", + "sr-Cyrl": "Молдавија", + "sr-Latn": "Moldavija", + "zh_TW": "摩爾多瓦", + "tr": "Moldova", + "ro": "Moldova", + "ar": "مولدوفا", + "fa": "مولداوی", + "yue": "摩爾多瓦(共和國)" + }, + flag: "🇲🇩", + code: "MD", + dialCode: "373", + minLength: 8, + maxLength: 8, + ), + Country( + name: "Monaco", + nameTranslations: { + "sk": "Monako", + "se": "Monaco", + "pl": "Monako", + "no": "Monaco", + "ja": "モナコ", + "it": "Monaco", + "zh": "摩纳哥", + "nl": "Monaco", + "de": "Monaco", + "fr": "Monaco", + "es": "Mónaco", + "en": "Monaco", + "pt_BR": "Mônaco", + "sr-Cyrl": "Монако", + "sr-Latn": "Monako", + "zh_TW": "摩納哥", + "tr": "Monako", + "ro": "Monaco", + "ar": "موناكو", + "fa": "موناكو", + "yue": "摩納哥" + }, + flag: "🇲🇨", + code: "MC", + dialCode: "377", + minLength: 9, + maxLength: 9, + ), + Country( + name: "Mongolia", + nameTranslations: { + "sk": "Mongolsko", + "se": "Mongolia", + "pl": "Mongolia", + "no": "Mongolia", + "ja": "モンゴル", + "it": "Mongolia", + "zh": "蒙古", + "nl": "Mongolië", + "de": "Mongolei", + "fr": "Mongolie", + "es": "Mongolia", + "en": "Mongolia", + "pt_BR": "Mongólia", + "sr-Cyrl": "Монголија", + "sr-Latn": "Mongolija", + "zh_TW": "蒙古", + "tr": "Moğolistan", + "ro": "Mongolia", + "ar": "منغوليا", + "fa": "مغولستان", + "yue": "蒙古" + }, + flag: "🇲🇳", + code: "MN", + dialCode: "976", + minLength: 8, + maxLength: 8, + ), + Country( + name: "Montenegro", + nameTranslations: { + "sk": "Čierna Hora", + "se": "Montenegro", + "pl": "Czarnogóra", + "no": "Montenegro", + "ja": "モンテネグロ", + "it": "Montenegro", + "zh": "黑山", + "nl": "Montenegro", + "de": "Montenegro", + "fr": "Monténégro", + "es": "Montenegro", + "en": "Montenegro", + "pt_BR": "Montenegro", + "sr-Cyrl": "Црна Гора", + "sr-Latn": "Crna Gora", + "zh_TW": "蒙特內哥羅", + "tr": "Karadağ", + "ro": "Muntenegru", + "ar": "الجبل الأسود", + "fa": "مونته‌نگرو", + "yue": "黑山" + }, + flag: "🇲🇪", + code: "ME", + dialCode: "382", + minLength: 12, + maxLength: 12, + ), + Country( + name: "Montserrat", + nameTranslations: { + "sk": "Montserrat", + "se": "Montserrat", + "pl": "Montserrat", + "no": "Montserrat", + "ja": "モントセラト", + "it": "Montserrat", + "zh": "蒙特塞拉特", + "nl": "Montserrat", + "de": "Montserrat", + "fr": "Montserrat", + "es": "Montserrat", + "en": "Montserrat", + "pt_BR": "Montserrat", + "sr-Cyrl": "Монтсерат", + "sr-Latn": "Montserat", + "zh_TW": "蒙哲臘", + "tr": "Montserrat", + "ro": "Montserrat", + "ar": "مونتسرات", + "fa": "مونتسرات", + "yue": "蒙特塞拉特" + }, + flag: "🇲🇸", + code: "MS", + dialCode: "1664", + minLength: 7, + maxLength: 7, + ), + Country( + name: "Morocco", + nameTranslations: { + "sk": "Maroko", + "se": "Marokko", + "pl": "Maroko", + "no": "Marokko", + "ja": "モロッコ", + "it": "Marocco", + "zh": "摩洛哥", + "nl": "Marokko", + "de": "Marokko", + "fr": "Maroc", + "es": "Marruecos", + "en": "Morocco", + "pt_BR": "Marrocos", + "sr-Cyrl": "Мароко", + "sr-Latn": "Maroko", + "zh_TW": "摩洛哥", + "tr": "Fas", + "ro": "Maroc", + "ar": "المغرب", + "fa": "مراکش", + "yue": "摩洛哥" + }, + flag: "🇲🇦", + code: "MA", + dialCode: "212", + minLength: 9, + maxLength: 9, + ), + Country( + name: "Mozambique", + nameTranslations: { + "sk": "Mozambik", + "se": "Mosambik", + "pl": "Mozambik", + "no": "Mosambik", + "ja": "モザンビーク", + "it": "Mozambico", + "zh": "莫桑比克", + "nl": "Mozambique", + "de": "Mosambik", + "fr": "Mozambique", + "es": "Mozambique", + "en": "Mozambique", + "pt_BR": "Moçambique", + "sr-Cyrl": "Мозамбик", + "sr-Latn": "Mozambik", + "zh_TW": "莫三比克", + "tr": "Mozambik", + "ro": "Mozambic", + "ar": "موزمبيق", + "fa": "موزامبیک", + "yue": "莫桑比克" + }, + flag: "🇲🇿", + code: "MZ", + dialCode: "258", + minLength: 9, + maxLength: 9, + ), + Country( + name: "Myanmar", + nameTranslations: { + "sk": "Mjanmarsko", + "se": "Burma", + "pl": "Mjanma (Birma)", + "no": "Myanmar (Burma)", + "ja": "ミャンマー (ビルマ)", + "it": "Myanmar (Birmania)", + "zh": "缅甸", + "nl": "Myanmar (Birma)", + "de": "Myanmar", + "fr": "Myanmar (Birmanie)", + "es": "Myanmar (Birmania)", + "en": "Myanmar (Burma)", + "pt_BR": "Mianmar (Birmânia)", + "sr-Cyrl": "Мјанмар (Бурма)", + "sr-Latn": "Mjanmar (Burma)", + "zh_TW": "緬甸", + "tr": "Myanmar", + "ro": "Myanmar", + "ar": "ميانمار", + "fa": "میانمار", + "yue": "緬甸" + }, + flag: "🇲🇲", + code: "MM", + dialCode: "95", + minLength: 9, + maxLength: 9, + ), + Country( + name: "Namibia", + nameTranslations: { + "sk": "Namíbia", + "se": "Namibia", + "pl": "Namibia", + "no": "Namibia", + "ja": "ナミビア", + "it": "Namibia", + "zh": "纳米比亚", + "nl": "Namibië", + "de": "Namibia", + "fr": "Namibie", + "es": "Namibia", + "en": "Namibia", + "pt_BR": "Namibia", + "sr-Cyrl": "Намибија", + "sr-Latn": "Namibija", + "zh_TW": "納米比亞", + "tr": "Namibya", + "ro": "Namibia", + "ar": "ناميبيا", + "fa": "نامیبیا", + "yue": "納米比亞" + }, + flag: "🇳🇦", + code: "NA", + dialCode: "264", + minLength: 10, + maxLength: 10, + ), + Country( + name: "Nauru", + nameTranslations: { + "sk": "Nauru", + "se": "Nauru", + "pl": "Nauru", + "no": "Nauru", + "ja": "ナウル", + "it": "Nauru", + "zh": "瑙鲁", + "nl": "Nauru", + "de": "Nauru", + "fr": "Nauru", + "es": "Nauru", + "en": "Nauru", + "pt_BR": "Nauru", + "sr-Cyrl": "Науру", + "sr-Latn": "Nauru", + "zh_TW": "諾魯", + "tr": "Nauru", + "ro": "Nauru", + "ar": "ناورو", + "fa": "نائورو", + "yue": "瑙魯" + }, + flag: "🇳🇷", + code: "NR", + dialCode: "674", + minLength: 7, + maxLength: 7, + ), + Country( + name: "Nepal", + nameTranslations: { + "sk": "Nepál", + "se": "Nepal", + "pl": "Nepal", + "no": "Nepal", + "ja": "ネパール", + "it": "Nepal", + "zh": "尼泊尔", + "nl": "Nepal", + "de": "Nepal", + "fr": "Népal", + "es": "Nepal", + "en": "Nepal", + "pt_BR": "Nepal", + "sr-Cyrl": "Непал", + "sr-Latn": "Nepal", + "zh_TW": "尼泊爾", + "tr": "Nepal", + "ro": "Nepal", + "ar": "نيبال", + "fa": "نپال", + "yue": "尼泊爾" + }, + flag: "🇳🇵", + code: "NP", + dialCode: "977", + minLength: 10, + maxLength: 10, + ), + Country( + name: "Netherlands", + nameTranslations: { + "sk": "Holandsko", + "se": "Vuolleeatnamat", + "pl": "Holandia", + "no": "Nederland", + "ja": "オランダ", + "it": "Paesi Bassi", + "zh": "荷兰", + "nl": "Nederland", + "de": "Niederlande", + "fr": "Pays-Bas", + "es": "Países Bajos", + "en": "Netherlands", + "pt_BR": "Países Baixos", + "sr-Cyrl": "Холандија", + "sr-Latn": "Holandija", + "zh_TW": "荷蘭", + "tr": "Hollanda", + "ro": "Olanda", + "ar": "هولندا", + "fa": "هلند", + "yue": "荷蘭" + }, + flag: "🇳🇱", + code: "NL", + dialCode: "31", + minLength: 9, + maxLength: 9, + ), + Country( + name: "New Caledonia", + nameTranslations: { + "sk": "Nová Kaledónia", + "se": "Ođđa-Kaledonia", + "pl": "Nowa Kaledonia", + "no": "Ny-Caledonia", + "ja": "ニューカレドニア", + "it": "Nuova Caledonia", + "zh": "新喀里多尼亚", + "nl": "Nieuw-Caledonië", + "de": "Neukaledonien", + "fr": "Nouvelle-Calédonie", + "es": "Nueva Caledonia", + "en": "New Caledonia", + "pt_BR": "Nova Caledônia", + "sr-Cyrl": "Нова Каледонија", + "sr-Latn": "Nova Kaledonija", + "zh_TW": "新喀里多尼亞", + "tr": "Yeni Kaledonya", + "ro": "Noua Caledonie", + "ar": "كاليدونيا الجديدة", + "fa": "کالدونیای جدید", + "yue": "新喀里多尼亚" + }, + flag: "🇳🇨", + code: "NC", + dialCode: "687", + minLength: 6, + maxLength: 6, + ), + Country( + name: "New Zealand", + nameTranslations: { + "sk": "Nový Zéland", + "se": "Ođđa-Selánda", + "pl": "Nowa Zelandia", + "no": "New Zealand", + "ja": "ニュージーランド", + "it": "Nuova Zelanda", + "zh": "新西兰", + "nl": "Nieuw-Zeeland", + "de": "Neuseeland", + "fr": "Nouvelle-Zélande", + "es": "Nueva Zelanda", + "en": "New Zealand", + "pt_BR": "Nova Zelândia", + "sr-Cyrl": "Нови Зеланд", + "sr-Latn": "Novi Zeland", + "zh_TW": "紐西蘭", + "tr": "Yeni Zelanda", + "ro": "Noua Zeelandă", + "ar": "نيوزيلندا", + "fa": "نیوزلند", + "yue": "紐西蘭" + }, + flag: "🇳🇿", + code: "NZ", + dialCode: "64", + minLength: 10, + maxLength: 10, + ), + Country( + name: "Nicaragua", + nameTranslations: { + "sk": "Nikaragua", + "se": "Nicaragua", + "pl": "Nikaragua", + "no": "Nicaragua", + "ja": "ニカラグア", + "it": "Nicaragua", + "zh": "尼加拉瓜", + "nl": "Nicaragua", + "de": "Nicaragua", + "fr": "Nicaragua", + "es": "Nicaragua", + "en": "Nicaragua", + "pt_BR": "Nicarágua", + "sr-Cyrl": "Никарагва", + "sr-Latn": "Nikaragva", + "zh_TW": "尼加拉瓜", + "tr": "Nikaragua", + "ro": "Nicaragua", + "ar": "نيكاراغوا", + "fa": "نیکاراگوئه", + "yue": "尼加拉瓜" + }, + flag: "🇳🇮", + code: "NI", + dialCode: "505", + minLength: 8, + maxLength: 8, + ), + Country( + name: "Niger", + nameTranslations: { + "sk": "Niger", + "se": "Niger", + "pl": "Niger", + "no": "Niger", + "ja": "ニジェール", + "it": "Niger", + "zh": "尼日尔", + "nl": "Niger", + "de": "Niger", + "fr": "Niger", + "es": "Níger", + "en": "Niger", + "pt_BR": "Níger", + "sr-Cyrl": "Нигер", + "sr-Latn": "Niger", + "zh_TW": "尼日爾", + "tr": "Nijer", + "ro": "Niger", + "ar": "النيجر", + "fa": "نیجر", + "yue": "尼日爾" + }, + flag: "🇳🇪", + code: "NE", + dialCode: "227", + minLength: 8, + maxLength: 8, + ), + Country( + name: "Nigeria", + nameTranslations: { + "sk": "Nigéria", + "se": "Nigeria", + "pl": "Nigeria", + "no": "Nigeria", + "ja": "ナイジェリア", + "it": "Nigeria", + "zh": "尼日利亚", + "nl": "Nigeria", + "de": "Nigeria", + "fr": "Nigéria", + "es": "Nigeria", + "en": "Nigeria", + "pt_BR": "Nigéria", + "sr-Cyrl": "Нигерија", + "sr-Latn": "Nigerija", + "zh_TW": "奈及利亞", + "tr": "Nijerya", + "ro": "Nigeria", + "ar": "نيجيريا", + "fa": "نیجریه", + "yue": "尼日利亞" + }, + flag: "🇳🇬", + code: "NG", + dialCode: "234", + minLength: 10, + maxLength: 11, + ), + Country( + name: "Niue", + nameTranslations: { + "sk": "Niue", + "se": "Niue", + "pl": "Niue", + "no": "Niue", + "ja": "ニウエ", + "it": "Niue", + "zh": "纽埃", + "nl": "Niue", + "de": "Niue", + "fr": "Niue", + "es": "Niue", + "en": "Niue", + "pt_BR": "Niue", + "sr-Cyrl": "Нијуе", + "sr-Latn": "Nijue", + "zh_TW": "紐埃", + "tr": "Niue", + "ro": "Niue", + "ar": "نييوي", + "fa": "نیووی", + "yue": "紐埃" + }, + flag: "🇳🇺", + code: "NU", + dialCode: "683", + minLength: 4, + maxLength: 4, + ), + Country( + name: "Norfolk Island", + nameTranslations: { + "sk": "Norfolk", + "se": "Norfolksullot", + "pl": "Norfolk", + "no": "Norfolkøya", + "ja": "ノーフォーク島", + "it": "Isola Norfolk", + "zh": "诺福克岛", + "nl": "Norfolk", + "de": "Norfolkinsel", + "fr": "Île Norfolk", + "es": "Isla Norfolk", + "en": "Norfolk Island", + "pt_BR": "Ilha Norfolk", + "sr-Cyrl": "Острво Норфок", + "sr-Latn": "Ostrvo Norfok", + "zh_TW": "諾福克島", + "tr": "Norfolk Adası", + "ro": "Insulele Norfolk", + "ar": "جزيرة نورفولك", + "fa": "جزیره نورفک", + "yue": "诺福克岛" + }, + flag: "🇳🇫", + code: "NF", + dialCode: "672", + minLength: 15, + maxLength: 15, + ), + Country( + name: "Northern Mariana Islands", + nameTranslations: { + "sk": "Severné Mariány", + "se": "Davvi-Mariánat", + "pl": "Mariany Północne", + "no": "Nord-Marianene", + "ja": "北マリアナ諸島", + "it": "Isole Marianne settentrionali", + "zh": "北马里亚纳群岛", + "nl": "Noordelijke Marianen", + "de": "Nördliche Marianen", + "fr": "Îles Mariannes du Nord", + "es": "Islas Marianas del Norte", + "en": "Northern Mariana Islands", + "pt_BR": "Ilhas Marianas do Norte", + "sr-Cyrl": "Северна Маријанска Острва", + "sr-Latn": "Severna Marijanska Ostrva", + "zh_TW": "北馬利安納群島", + "tr": "Kuzey Mariana Adaları", + "ro": "Insulelor Mariane de Nord", + "ar": "جزر ماريانا الشمالية", + "fa": "جزایر ماریانای شمالی", + "yue": "北馬里亞納群島" + }, + flag: "🇲🇵", + code: "MP", + dialCode: "1670", + minLength: 7, + maxLength: 7, + ), + Country( + name: "Norway", + nameTranslations: { + "sk": "Nórsko", + "se": "Norga", + "pl": "Norwegia", + "no": "Norge", + "ja": "ノルウェー", + "it": "Norvegia", + "zh": "挪威", + "nl": "Noorwegen", + "de": "Norwegen", + "fr": "Norvège", + "es": "Noruega", + "en": "Norway", + "pt_BR": "Noruega", + "sr-Cyrl": "Норвешка", + "sr-Latn": "Norveška", + "zh_TW": "挪威", + "tr": "Norveç", + "ro": "Norvegia", + "ar": "النرويج", + "fa": "نروژ", + "yue": "挪威" + }, + flag: "🇳🇴", + code: "NO", + dialCode: "47", + minLength: 8, + maxLength: 8, + ), + Country( + name: "Oman", + nameTranslations: { + "sk": "Omán", + "se": "Oman", + "pl": "Oman", + "no": "Oman", + "ja": "オマーン", + "it": "Oman", + "zh": "阿曼", + "nl": "Oman", + "de": "Oman", + "fr": "Oman", + "es": "Omán", + "en": "Oman", + "pt_BR": "Omã", + "sr-Cyrl": "Оман", + "sr-Latn": "Oman", + "zh_TW": "阿曼", + "tr": "Umman", + "ro": "Oman", + "ar": "عمان", + "fa": "عمان", + "yue": "阿曼" + }, + flag: "🇴🇲", + code: "OM", + dialCode: "968", + minLength: 8, + maxLength: 8, + ), + Country( + name: "Pakistan", + nameTranslations: { + "sk": "Pakistan", + "se": "Pakistan", + "pl": "Pakistan", + "no": "Pakistan", + "ja": "パキスタン", + "it": "Pakistan", + "zh": "巴基斯坦", + "nl": "Pakistan", + "de": "Pakistan", + "fr": "Pakistan", + "es": "Pakistán", + "en": "Pakistan", + "pt_BR": "Paquistão", + "sr-Cyrl": "Пакистан", + "sr-Latn": "Pakistan", + "zh_TW": "巴基斯坦", + "tr": "Pakistan", + "ro": "Pakistan", + "ar": "باكستان", + "fa": "پاکستان", + "yue": "巴基斯坦" + }, + flag: "🇵🇰", + code: "PK", + dialCode: "92", + minLength: 10, + maxLength: 10, + ), + Country( + name: "Palau", + nameTranslations: { + "sk": "Palau", + "se": "Palau", + "pl": "Palau", + "no": "Palau", + "ja": "パラオ", + "it": "Palau", + "zh": "帕劳", + "nl": "Palau", + "de": "Palau", + "fr": "Palaos", + "es": "Palaos", + "en": "Palau", + "pt_BR": "Palau", + "sr-Cyrl": "Палау", + "sr-Latn": "Palau", + "zh_TW": "帛琉", + "tr": "Palau", + "ro": "Palau", + "ar": "بالاو", + "fa": "پالائو", + "yue": "帕劳" + }, + flag: "🇵🇼", + code: "PW", + dialCode: "680", + minLength: 7, + maxLength: 7, + ), + Country( + name: "Palestinian Territory, Occupied", + nameTranslations: { + "sk": "Palestínske územia", + "se": "Palestina", + "pl": "Terytoria Palestyńskie", + "no": "Det palestinske området", + "ja": "パレスチナ自治区", + "it": "Territori palestinesi", + "zh": "巴勒斯坦领土", + "nl": "Palestijnse gebieden", + "de": "Palästinensische Autonomiegebiete", + "fr": "Territoires palestiniens", + "es": "Territorios Palestinos", + "en": "Palestinian Territories", + "pt_BR": "Territórios Palestinos", + "sr-Cyrl": "Палестина", + "sr-Latn": "Palestina", + "zh_TW": "巴勒斯坦", + "tr": "Filistin", + "ro": "Palestina", + "ar": "فلسطين", + "fa": "فلسطین", + "yue": "巴勒斯坦,国" + }, + flag: "🇵🇸", + code: "PS", + dialCode: "970", + minLength: 9, + maxLength: 9, + ), + Country( + name: "Panama", + nameTranslations: { + "sk": "Panama", + "se": "Panama", + "pl": "Panama", + "no": "Panama", + "ja": "パナマ", + "it": "Panamá", + "zh": "巴拿马", + "nl": "Panama", + "de": "Panama", + "fr": "Panama", + "es": "Panamá", + "en": "Panama", + "pt_BR": "Panamá", + "sr-Cyrl": "Панама", + "sr-Latn": "Panama", + "zh_TW": "巴拿馬", + "tr": "Panama", + "ro": "Panama", + "ar": "بنما", + "fa": "پاناما", + "yue": "巴拿馬" + }, + flag: "🇵🇦", + code: "PA", + dialCode: "507", + minLength: 8, + maxLength: 8, + ), + Country( + name: "Papua New Guinea", + nameTranslations: { + "sk": "Papua-Nová Guinea", + "se": "Papua-Ođđa-Guinea", + "pl": "Papua-Nowa Gwinea", + "no": "Papua Ny-Guinea", + "ja": "パプアニューギニア", + "it": "Papua Nuova Guinea", + "zh": "巴布亚新几内亚", + "nl": "Papoea-Nieuw-Guinea", + "de": "Papua-Neuguinea", + "fr": "Papouasie-Nouvelle-Guinée", + "es": "Papúa Nueva Guinea", + "en": "Papua New Guinea", + "pt_BR": "Papua Nova Guiné", + "sr-Cyrl": "Папуа Нова Гвинеја", + "sr-Latn": "Papua Nova Gvineja", + "zh_TW": "巴布亞新幾內亞", + "tr": "Papua Yeni Gine", + "ro": "Papua Noua Guinee", + "ar": "بابوا غينيا الجديدة", + "fa": "پاپوآ گینه نو", + "yue": "巴布亚新几内亚" + }, + flag: "🇵🇬", + code: "PG", + dialCode: "675", + minLength: 11, + maxLength: 11, + ), + Country( + name: "Paraguay", + nameTranslations: { + "sk": "Paraguaj", + "se": "Paraguay", + "pl": "Paragwaj", + "no": "Paraguay", + "ja": "パラグアイ", + "it": "Paraguay", + "zh": "巴拉圭", + "nl": "Paraguay", + "de": "Paraguay", + "fr": "Paraguay", + "es": "Paraguay", + "en": "Paraguay", + "pt_BR": "Paraguai", + "sr-Cyrl": "Парагвај", + "sr-Latn": "Paragvaj", + "zh_TW": "巴拉圭", + "tr": "Paraguay", + "ro": "Paraguay", + "ar": "باراغواي", + "fa": "پاراگوئه", + "yue": "巴拉圭" + }, + flag: "🇵🇾", + code: "PY", + dialCode: "595", + minLength: 10, + maxLength: 10, + ), + Country( + name: "Peru", + nameTranslations: { + "sk": "Peru", + "se": "Peru", + "pl": "Peru", + "no": "Peru", + "ja": "ペルー", + "it": "Perù", + "zh": "秘鲁", + "nl": "Peru", + "de": "Peru", + "fr": "Pérou", + "es": "Perú", + "en": "Peru", + "pt_BR": "Peru", + "sr-Cyrl": "Перу", + "sr-Latn": "Peru", + "zh_TW": "秘鲁", + "tr": "Peru", + "ro": "Peru", + "ar": "بيرو", + "fa": "پرو", + "yue": "秘魯" + }, + flag: "🇵🇪", + code: "PE", + dialCode: "51", + minLength: 9, + maxLength: 9, + ), + Country( + name: "Philippines", + nameTranslations: { + "sk": "Filipíny", + "se": "Filippiinnat", + "pl": "Filipiny", + "no": "Filippinene", + "ja": "フィリピン", + "it": "Filippine", + "zh": "菲律宾", + "nl": "Filipijnen", + "de": "Philippinen", + "fr": "Philippines", + "es": "Filipinas", + "en": "Philippines", + "pt_BR": "Filipinas", + "sr-Cyrl": "Филипини", + "sr-Latn": "Filipini", + "zh_TW": "菲律賓", + "tr": "Filipinler", + "ro": "Filipine", + "ar": "الفلبين", + "fa": "فیلیپین", + "yue": "菲律賓" + }, + flag: "🇵🇭", + code: "PH", + dialCode: "63", + minLength: 10, + maxLength: 10, + ), + Country( + name: "Pitcairn", + nameTranslations: { + "sk": "Pitcairnove ostrovy", + "se": "Pitcairn", + "pl": "Pitcairn", + "no": "Pitcairnøyene", + "ja": "ピトケアン諸島", + "it": "Isole Pitcairn", + "zh": "皮特凯恩群岛", + "nl": "Pitcairneilanden", + "de": "Pitcairninseln", + "fr": "Îles Pitcairn", + "es": "Islas Pitcairn", + "en": "Pitcairn Islands", + "pt_BR": "Ilhas Pitcairn", + "sr-Cyrl": "Острва Питкерн", + "sr-Latn": "Ostrva Pitkern", + "zh_TW": "皮特肯群島", + "tr": "Pitcairn Adaları", + "ro": "Insulele Pitcairn", + "ar": "جزر بيتكيرن", + "fa": "جزایر پیت‌کرن", + "yue": "皮特凱恩" + }, + flag: "🇵🇳", + code: "PN", + dialCode: "64", + minLength: 10, + maxLength: 10, + ), + Country( + name: "Poland", + nameTranslations: { + "sk": "Poľsko", + "se": "Polen", + "pl": "Polska", + "no": "Polen", + "ja": "ポーランド", + "it": "Polonia", + "zh": "波兰", + "nl": "Polen", + "de": "Polen", + "fr": "Pologne", + "es": "Polonia", + "en": "Poland", + "pt_BR": "Polônia", + "sr-Cyrl": "Пољска", + "sr-Latn": "Poljska", + "zh_TW": "波蘭", + "tr": "Polonya", + "ro": "Polonia", + "ar": "بولندا", + "fa": "لهستان", + "yue": "波蘭" + }, + flag: "🇵🇱", + code: "PL", + dialCode: "48", + minLength: 9, + maxLength: 9, + ), + Country( + name: "Portugal", + nameTranslations: { + "sk": "Portugalsko", + "se": "Portugála", + "pl": "Portugalia", + "no": "Portugal", + "ja": "ポルトガル", + "it": "Portogallo", + "zh": "葡萄牙", + "nl": "Portugal", + "de": "Portugal", + "fr": "Portugal", + "es": "Portugal", + "en": "Portugal", + "pt_BR": "Portugal", + "sr-Cyrl": "Португалија", + "sr-Latn": "Portugalija", + "zh_TW": "葡萄牙", + "tr": "Portekiz", + "ro": "Portugalia", + "ar": "البرتغال", + "fa": "پرتغال", + "yue": "葡萄牙" + }, + flag: "🇵🇹", + code: "PT", + dialCode: "351", + minLength: 9, + maxLength: 9, + ), + Country( + name: "Puerto Rico", + nameTranslations: { + "sk": "Portoriko", + "se": "Puerto Rico", + "pl": "Portoryko", + "no": "Puerto Rico", + "ja": "プエルトリコ", + "it": "Portorico", + "zh": "波多黎各", + "nl": "Puerto Rico", + "de": "Puerto Rico", + "fr": "Porto Rico", + "es": "Puerto Rico", + "en": "Puerto Rico", + "pt_BR": "Porto Rico", + "sr-Cyrl": "Порто Рико", + "sr-Latn": "Porto Riko", + "zh_TW": "波多黎各", + "tr": "Porto Riko", + "ro": "Puerto Rico", + "ar": "بورتوريكو", + "fa": "پورتوریکو", + "yue": "波多黎各" + }, + flag: "🇵🇷", + code: "PR", + dialCode: "1939", + minLength: 15, + maxLength: 15, + ), + Country( + name: "Qatar", + nameTranslations: { + "sk": "Katar", + "se": "Qatar", + "pl": "Katar", + "no": "Qatar", + "ja": "カタール", + "it": "Qatar", + "zh": "卡塔尔", + "nl": "Qatar", + "de": "Katar", + "fr": "Qatar", + "es": "Catar", + "en": "Qatar", + "pt_BR": "Catar", + "sr-Cyrl": "Катар", + "sr-Latn": "Katar", + "zh_TW": "卡達", + "tr": "Katar", + "ro": "Qatar", + "ar": "قطر", + "fa": "قطر", + "yue": "卡塔爾" + }, + flag: "🇶🇦", + code: "QA", + dialCode: "974", + minLength: 8, + maxLength: 8, + ), + Country( + name: "Romania", + nameTranslations: { + "sk": "Rumunsko", + "se": "Románia", + "pl": "Rumunia", + "no": "Romania", + "ja": "ルーマニア", + "it": "Romania", + "zh": "罗马尼亚", + "nl": "Roemenië", + "de": "Rumänien", + "fr": "Roumanie", + "es": "Rumanía", + "en": "Romania", + "pt_BR": "Romênia", + "sr-Cyrl": "Румунија", + "sr-Latn": "Rumunija", + "zh_TW": "羅馬尼亞", + "tr": "Romanya", + "ro": "România", + "ar": "رومانيا", + "fa": "رومانی", + "yue": "羅馬尼亞" + }, + flag: "🇷🇴", + code: "RO", + dialCode: "40", + minLength: 9, + maxLength: 9, + ), + Country( + name: "Russia", + nameTranslations: { + "sk": "Rusko", + "se": "Ruošša", + "pl": "Rosja", + "no": "Russland", + "ja": "ロシア", + "it": "Russia", + "zh": "俄罗斯", + "nl": "Rusland", + "de": "Russland", + "fr": "Russie", + "es": "Rusia", + "en": "Russia", + "pt_BR": "Rússia", + "sr-Cyrl": "Русија", + "sr-Latn": "Rusija", + "zh_TW": "俄羅斯", + "tr": "Rusya", + "ro": "Rusia", + "ar": "روسيا", + "fa": "روسیه", + "yue": "俄儸斯聯邦" + }, + flag: "🇷🇺", + code: "RU", + dialCode: "7", + minLength: 10, + maxLength: 10, + ), + Country( + name: "Rwanda", + nameTranslations: { + "sk": "Rwanda", + "se": "Rwanda", + "pl": "Rwanda", + "no": "Rwanda", + "ja": "ルワンダ", + "it": "Ruanda", + "zh": "卢旺达", + "nl": "Rwanda", + "de": "Ruanda", + "fr": "Rwanda", + "es": "Ruanda", + "en": "Rwanda", + "pt_BR": "Ruanda", + "sr-Cyrl": "Руанда", + "sr-Latn": "Ruanda", + "zh_TW": "盧安達", + "tr": "Ruanda", + "ro": "Rwanda", + "ar": "رواندا", + "fa": "رواندا", + "yue": "盧旺達" + }, + flag: "🇷🇼", + code: "RW", + dialCode: "250", + minLength: 9, + maxLength: 9, + ), + Country( + name: "Reunion", + nameTranslations: { + "sk": "Réunion", + "se": "Réunion", + "pl": "Reunion", + "no": "Réunion", + "ja": "レユニオン", + "it": "Riunione", + "zh": "留尼汪", + "nl": "Réunion", + "de": "Réunion", + "fr": "La Réunion", + "es": "Reunión", + "en": "Réunion", + "pt_BR": "Reunião", + "sr-Cyrl": "Реинион", + "sr-Latn": "Reinion", + "zh_TW": "留尼旺", + "tr": "La Réunion", + "ro": "La Réunion", + "ar": "لا ريونيون", + "fa": "رئونیون", + "yue": "留尼汪" + }, + flag: "🇷🇪", + code: "RE", + dialCode: "262", + minLength: 9, + maxLength: 9, + ), + Country( + name: "Saint Barthelemy", + nameTranslations: { + "sk": "Svätý Bartolomej", + "se": "Saint Barthélemy", + "pl": "Saint-Barthélemy", + "no": "Saint-Barthélemy", + "ja": "サン・バルテルミー", + "it": "Saint-Barthélemy", + "zh": "圣巴泰勒米", + "nl": "Saint-Barthélemy", + "de": "St. Barthélemy", + "fr": "Saint-Barthélemy", + "es": "San Bartolomé", + "en": "St. Barthélemy", + "pt_BR": "São Bartolomeu", + "sr-Cyrl": "Сент Бартелеми", + "sr-Latn": "Sent Bartelemi", + "zh_TW": "聖巴瑟米", + "tr": "Saint Barthélemy", + "ro": "Saint Barthélemy", + "ar": "سان بارتيلمي", + "fa": "سن بارتلمی", + "yue": "聖巴泰勒米" + }, + flag: "🇧🇱", + code: "BL", + dialCode: "590", + minLength: 9, + maxLength: 9, + ), + Country( + name: "Saint Helena, Ascension and Tristan Da Cunha", + nameTranslations: { + "sk": "Svätá Helena", + "se": "Saint Helena", + "pl": "Wyspa Świętej Heleny", + "no": "St. Helena", + "ja": "セントヘレナ", + "it": "Sant'Elena", + "zh": "圣赫勒拿", + "nl": "Sint-Helena", + "de": "St. Helena", + "fr": "Sainte-Hélène", + "es": "Santa Elena", + "en": "St. Helena", + "pt_BR": "Santa Helena", + "sr-Cyrl": "Света Јелена, Асенсион и Тристан да Куња", + "sr-Latn": "Sveta Jelena, Asension i Tristan de Kunja", + "zh_TW": "聖凱倫拿島", + "tr": "Saint Helena", + "ro": "Sfânta Elena", + "ar": "سانت هيلانة وأسينشين وتريستان دا كونا", + "fa": "سنت هلن", + "yue": "圣赫勒拿、阿森松同特里斯坦·达库尼亚" + }, + flag: "🇸🇭", + code: "SH", + dialCode: "290", + minLength: 4, + maxLength: 4, + ), + Country( + name: "Saint Kitts and Nevis", + nameTranslations: { + "sk": "Svätý Krištof a Nevis", + "se": "Saint Kitts ja Nevis", + "pl": "Saint Kitts i Nevis", + "no": "Saint Kitts og Nevis", + "ja": "セントクリストファー・ネーヴィス", + "it": "Saint Kitts e Nevis", + "zh": "圣基茨和尼维斯", + "nl": "Saint Kitts en Nevis", + "de": "St. Kitts und Nevis", + "fr": "Saint-Christophe-et-Niévès", + "es": "San Cristóbal y Nieves", + "en": "St. Kitts & Nevis", + "pt_BR": "São Cristóvão e Nevis", + "sr-Cyrl": "Сент Китс и Невис", + "sr-Latn": "Sent Kits i Nevis", + "zh_TW": "聖克里斯多福及尼維斯", + "tr": "Saint Kitts ve Nevis", + "ro": "Sfântul Kitts și Nevis", + "ar": "سانت كيتس ونيفيس", + "fa": "سنت کیتس و نویس", + "yue": "圣基茨同尼维斯" + }, + flag: "🇰🇳", + code: "KN", + dialCode: "1869", + minLength: 7, + maxLength: 7, + ), + Country( + name: "Saint Lucia", + nameTranslations: { + "sk": "Svätá Lucia", + "se": "Saint Lucia", + "pl": "Saint Lucia", + "no": "St. Lucia", + "ja": "セントルシア", + "it": "Saint Lucia", + "zh": "圣卢西亚", + "nl": "Saint Lucia", + "de": "St. Lucia", + "fr": "Sainte-Lucie", + "es": "Santa Lucía", + "en": "St. Lucia", + "pt_BR": "Santa Lúcia", + "sr-Cyrl": "Света Луција", + "sr-Latn": "Sveta Lucija", + "zh_TW": "聖露西亞", + "tr": "Saint Lucia", + "ro": "Sfânta Elena", + "ar": "سانت لوسيا", + "fa": "سنت لوسیا", + "yue": "聖盧西亞" + }, + flag: "🇱🇨", + code: "LC", + dialCode: "1758", + minLength: 7, + maxLength: 7, + ), + Country( + name: "Saint Martin", + nameTranslations: { + "sk": "Svätý Martin (fr.)", + "se": "Frankriikka Saint Martin", + "pl": "Saint-Martin", + "no": "Saint-Martin", + "ja": "サン・マルタン", + "it": "Saint Martin", + "zh": "法属圣马丁", + "nl": "Saint-Martin", + "de": "St. Martin", + "fr": "Saint-Martin", + "es": "San Martín", + "en": "St. Martin", + "pt_BR": "São Martinho", + "sr-Cyrl": "Свети Мартин", + "sr-Latn": "Sveti Martin", + "zh_TW": "聖馬丁", + "tr": "Saint Martin", + "ro": "Sfântul Martin", + "ar": "تجمع سان مارتين", + "fa": "سن مارتن", + "yue": "聖馬丁(法國部分)" + }, + flag: "🇲🇫", + code: "MF", + dialCode: "590", + minLength: 9, + maxLength: 9, + ), + Country( + name: "Saint Pierre and Miquelon", + nameTranslations: { + "sk": "Saint Pierre a Miquelon", + "se": "Saint Pierre ja Miquelon", + "pl": "Saint-Pierre i Miquelon", + "no": "Saint-Pierre-et-Miquelon", + "ja": "サンピエール島・ミクロン島", + "it": "Saint-Pierre e Miquelon", + "zh": "圣皮埃尔和密克隆群岛", + "nl": "Saint-Pierre en Miquelon", + "de": "St. Pierre und Miquelon", + "fr": "Saint-Pierre-et-Miquelon", + "es": "San Pedro y Miquelón", + "en": "St. Pierre & Miquelon", + "pt_BR": "São Pedro e Miquelon", + "sr-Cyrl": "Сен Пјер и Микелон", + "sr-Latn": "Sen Pjer i Mikelon", + "zh_TW": "聖皮埃與密克隆群島", + "tr": "Saint Pierre ve Miquelon", + "ro": "Saint Pierre și Miquelon", + "ar": "سان بيير وميكلون", + "fa": "سن-پیر و میکلون", + "yue": "聖皮埃尔同米克隆" + }, + flag: "🇵🇲", + code: "PM", + dialCode: "508", + minLength: 6, + maxLength: 6, + ), + Country( + name: "Saint Vincent and the Grenadines", + nameTranslations: { + "sk": "Svätý Vincent a Grenadíny", + "se": "Saint Vincent ja Grenadine", + "pl": "Saint Vincent i Grenadyny", + "no": "St. Vincent og Grenadinene", + "ja": "セントビンセント及びグレナディーン諸島", + "it": "Saint Vincent e Grenadine", + "zh": "圣文森特和格林纳丁斯", + "nl": "Saint Vincent en de Grenadines", + "de": "St. Vincent und die Grenadinen", + "fr": "Saint-Vincent-et-les-Grenadines", + "es": "San Vicente y las Granadinas", + "en": "St. Vincent & Grenadines", + "pt_BR": "São Vicente e Granadinas", + "sr-Cyrl": "Свети Винсент и Гренадини", + "sr-Latn": "Sveti Vinsent i Grenadini", + "zh_TW": "聖文森及格瑞那丁", + "tr": "Saint Vincent ve Grenadinler", + "ro": "Sfântul Vincențiu și Grenadinele", + "ar": "سانت فينسنت والغرينادين", + "fa": "سنت وینسنت و گرنادین‌ها", + "yue": "聖文森特同格林纳丁斯" + }, + flag: "🇻🇨", + code: "VC", + dialCode: "1784", + minLength: 7, + maxLength: 7, + ), + Country( + name: "Samoa", + nameTranslations: { + "sk": "Samoa", + "se": "Samoa", + "pl": "Samoa", + "no": "Samoa", + "ja": "サモア", + "it": "Samoa", + "zh": "萨摩亚", + "nl": "Samoa", + "de": "Samoa", + "fr": "Samoa", + "es": "Samoa", + "en": "Samoa", + "pt_BR": "Samoa", + "sr-Cyrl": "Самоа", + "sr-Latn": "Samoa", + "zh_TW": "薩摩亞", + "tr": "Samoa", + "ro": "Samoa", + "ar": "ساموا", + "fa": "ساموآ", + "yue": "薩摩亞" + }, + flag: "🇼🇸", + code: "WS", + dialCode: "685", + minLength: 7, + maxLength: 7, + ), + Country( + name: "San Marino", + nameTranslations: { + "sk": "San Maríno", + "se": "San Marino", + "pl": "San Marino", + "no": "San Marino", + "ja": "サンマリノ", + "it": "San Marino", + "zh": "圣马力诺", + "nl": "San Marino", + "de": "San Marino", + "fr": "Saint-Marin", + "es": "San Marino", + "en": "San Marino", + "pt_BR": "San Marino", + "sr-Cyrl": "Сан Марино", + "sr-Latn": "San Marino", + "zh_TW": "聖馬利諾", + "tr": "San Marino", + "ro": "San Marino", + "ar": "سان مارينو", + "fa": "سان مارینو", + "yue": "聖馬力諾" + }, + flag: "🇸🇲", + code: "SM", + dialCode: "378", + minLength: 10, + maxLength: 10, + ), + Country( + name: "Sao Tome and Principe", + nameTranslations: { + "sk": "Svätý Tomáš a Princov ostrov", + "se": "São Tomé ja Príncipe", + "pl": "Wyspy Świętego Tomasza i Książęca", + "no": "São Tomé og Príncipe", + "ja": "サントメ・プリンシペ", + "it": "São Tomé e Príncipe", + "zh": "圣多美和普林西比", + "nl": "Sao Tomé en Principe", + "de": "São Tomé und Príncipe", + "fr": "Sao Tomé-et-Principe", + "es": "Santo Tomé y Príncipe", + "en": "São Tomé & Príncipe", + "pt_BR": "São Tomé e Príncipe", + "sr-Cyrl": "Сао Томе и Принсипе", + "sr-Latn": "Sao Tome i Prinsipe", + "zh_TW": "聖多美普林西比", + "tr": "São Tomé ve Príncipe", + "ro": "Sao Tome şi Principe", + "ar": "ساو تومي وبرينسيب", + "fa": "سائوتومه و پرنسیپ", + "yue": "聖多美和普林西比" + }, + flag: "🇸🇹", + code: "ST", + dialCode: "239", + minLength: 7, + maxLength: 7, + ), + Country( + name: "Saudi Arabia", + nameTranslations: { + "sk": "Saudská Arábia", + "se": "Saudi-Arábia", + "pl": "Arabia Saudyjska", + "no": "Saudi-Arabia", + "ja": "サウジアラビア", + "it": "Arabia Saudita", + "zh": "沙特阿拉伯", + "nl": "Saoedi-Arabië", + "de": "Saudi-Arabien", + "fr": "Arabie saoudite", + "es": "Arabia Saudí", + "en": "Saudi Arabia", + "pt_BR": "Arábia Saudita", + "sr-Cyrl": "Саудијска Арабија", + "sr-Latn": "Saudijska Arabija", + "zh_TW": "沙烏地阿拉", + "tr": "Suudi Arabistan", + "ro": "Arabia Saudită", + "ar": "السعودية", + "fa": "عربستان سعودی", + "yue": "沙地阿拉伯" + }, + flag: "🇸🇦", + code: "SA", + dialCode: "966", + minLength: 9, + maxLength: 9, + ), + Country( + name: "Senegal", + nameTranslations: { + "sk": "Senegal", + "se": "Senegal", + "pl": "Senegal", + "no": "Senegal", + "ja": "セネガル", + "it": "Senegal", + "zh": "塞内加尔", + "nl": "Senegal", + "de": "Senegal", + "fr": "Sénégal", + "es": "Senegal", + "en": "Senegal", + "pt_BR": "Senegal", + "sr-Cyrl": "Сенегал", + "sr-Latn": "Senegal", + "zh_TW": "塞內加爾", + "tr": "Senegal", + "ro": "Senegal", + "ar": "السنغال", + "fa": "سنگال", + "yue": "塞內加爾" + }, + flag: "🇸🇳", + code: "SN", + dialCode: "221", + minLength: 9, + maxLength: 9, + ), + Country( + name: "Serbia", + nameTranslations: { + "sk": "Srbsko", + "se": "Serbia", + "pl": "Serbia", + "no": "Serbia", + "ja": "セルビア", + "it": "Serbia", + "zh": "塞尔维亚", + "nl": "Servië", + "de": "Serbien", + "fr": "Serbie", + "es": "Serbia", + "en": "Serbia", + "pt_BR": "Sérvia", + "sr-Cyrl": "Србија", + "sr-Latn": "Srbija", + "zh_TW": "塞爾維亞", + "tr": "Sırbistan", + "ro": "Serbia", + "ar": "صربيا", + "fa": "صربستان", + "yue": "塞爾維亞" + }, + flag: "🇷🇸", + code: "RS", + dialCode: "381", + minLength: 12, + maxLength: 12, + ), + Country( + name: "Seychelles", + nameTranslations: { + "sk": "Seychely", + "se": "Seychellsullot", + "pl": "Seszele", + "no": "Seychellene", + "ja": "セーシェル", + "it": "Seychelles", + "zh": "塞舌尔", + "nl": "Seychellen", + "de": "Seychellen", + "fr": "Seychelles", + "es": "Seychelles", + "en": "Seychelles", + "pt_BR": "Seychelles", + "sr-Cyrl": "Сејшели", + "sr-Latn": "Sejšeli", + "zh_TW": "塞席爾", + "tr": "Seyşeller", + "ro": "Seychelles", + "ar": "سيشل", + "fa": "سیشل", + "yue": "塞舌爾" + }, + flag: "🇸🇨", + code: "SC", + dialCode: "248", + minLength: 6, + maxLength: 6, + ), + Country( + name: "Sierra Leone", + nameTranslations: { + "sk": "Sierra Leone", + "se": "Sierra Leone", + "pl": "Sierra Leone", + "no": "Sierra Leone", + "ja": "シエラレオネ", + "it": "Sierra Leone", + "zh": "塞拉利昂", + "nl": "Sierra Leone", + "de": "Sierra Leone", + "fr": "Sierra Leone", + "es": "Sierra Leona", + "en": "Sierra Leone", + "pt_BR": "Serra Leoa", + "sr-Cyrl": "Сијера Леоне", + "sr-Latn": "Sijera Leone", + "zh_TW": "獅子山", + "tr": "Sierra Leone", + "ro": "Sierra Leone", + "ar": "سيراليون", + "fa": "سیرالئون", + "yue": "塞拉利昂" + }, + flag: "🇸🇱", + code: "SL", + dialCode: "232", + minLength: 8, + maxLength: 8, + ), + Country( + name: "Singapore", + nameTranslations: { + "sk": "Singapur", + "se": "Singapore", + "pl": "Singapur", + "no": "Singapore", + "ja": "シンガポール", + "it": "Singapore", + "zh": "新加坡", + "nl": "Singapore", + "de": "Singapur", + "fr": "Singapour", + "es": "Singapur", + "en": "Singapore", + "pt_BR": "Cingapura", + "sr-Cyrl": "Сингапур", + "sr-Latn": "Singapur", + "zh_TW": "新加坡", + "tr": "Singapur", + "ro": "Singapore", + "ar": "سنغافورة", + "fa": "سنگاپور", + "yue": "星架坡" + }, + flag: "🇸🇬", + code: "SG", + dialCode: "65", + minLength: 8, + maxLength: 8, + ), + Country( + name: "Slovakia", + nameTranslations: { + "sk": "Slovensko", + "se": "Slovákia", + "pl": "Słowacja", + "no": "Slovakia", + "ja": "スロバキア", + "it": "Slovacchia", + "zh": "斯洛伐克", + "nl": "Slowakije", + "de": "Slowakei", + "fr": "Slovaquie", + "es": "Eslovaquia", + "en": "Slovakia", + "pt_BR": "Eslováquia", + "sr-Cyrl": "Словачка", + "sr-Latn": "Slovačka", + "zh_TW": "斯洛伐克", + "tr": "Slovakya", + "ro": "Slovacia", + "ar": "سلوفاكيا", + "fa": "اسلواکی", + "yue": "斯洛伐克" + }, + flag: "🇸🇰", + code: "SK", + dialCode: "421", + minLength: 9, + maxLength: 9, + ), + Country( + name: "Slovenia", + nameTranslations: { + "sk": "Slovinsko", + "se": "Slovenia", + "pl": "Słowenia", + "no": "Slovenia", + "ja": "スロベニア", + "it": "Slovenia", + "zh": "斯洛文尼亚", + "nl": "Slovenië", + "de": "Slowenien", + "fr": "Slovénie", + "es": "Eslovenia", + "en": "Slovenia", + "pt_BR": "Eslovênia", + "sr-Cyrl": "Словеније", + "sr-Latn": "Slovenija", + "zh_TW": "斯洛維尼亞", + "tr": "Slovenya", + "ro": "Slovenia", + "ar": "سلوفينيا", + "fa": "اسلوونی", + "yue": "斯洛文尼亞" + }, + flag: "🇸🇮", + code: "SI", + dialCode: "386", + minLength: 8, + maxLength: 8, + ), + Country( + name: "Solomon Islands", + nameTranslations: { + "sk": "Šalamúnove ostrovy", + "se": "Salomon-sullot", + "pl": "Wyspy Salomona", + "no": "Salomonøyene", + "ja": "ソロモン諸島", + "it": "Isole Salomone", + "zh": "所罗门群岛", + "nl": "Salomonseilanden", + "de": "Salomonen", + "fr": "Îles Salomon", + "es": "Islas Salomón", + "en": "Solomon Islands", + "pt_BR": "Ilhas Salomão", + "sr-Cyrl": "Соломонска Острва", + "sr-Latn": "Solomonska Ostrva", + "zh_TW": "所羅門群島", + "tr": "Solomon Adaları", + "ro": "Insulele Solomon", + "ar": "جزر سليمان", + "fa": "جزایر سلیمان", + "yue": "所羅門群島" + }, + flag: "🇸🇧", + code: "SB", + dialCode: "677", + minLength: 5, + maxLength: 5, + ), + Country( + name: "Somalia", + nameTranslations: { + "sk": "Somálsko", + "se": "Somália", + "pl": "Somalia", + "no": "Somalia", + "ja": "ソマリア", + "it": "Somalia", + "zh": "索马里", + "nl": "Somalië", + "de": "Somalia", + "fr": "Somalie", + "es": "Somalia", + "en": "Somalia", + "pt_BR": "Somália", + "sr-Cyrl": "Сомалија", + "sr-Latn": "Somalija", + "zh_TW": "索馬利亞", + "tr": "Somali", + "ro": "Somalia", + "ar": "الصومال", + "fa": "سومالی", + "yue": "索馬里" + }, + flag: "🇸🇴", + code: "SO", + dialCode: "252", + minLength: 8, + maxLength: 8, + ), + Country( + name: "South Africa", + nameTranslations: { + "sk": "Južná Afrika", + "se": "Mátta-Afrihká", + "pl": "Republika Południowej Afryki", + "no": "Sør-Afrika", + "ja": "南アフリカ", + "it": "Sudafrica", + "zh": "南非", + "nl": "Zuid-Afrika", + "de": "Südafrika", + "fr": "Afrique du Sud", + "es": "Sudáfrica", + "en": "South Africa", + "pt_BR": "África do Sul", + "sr-Cyrl": "Јужноафричка Република", + "sr-Latn": "Južnoafrička Republika", + "zh_TW": "南非", + "tr": "Güney Afrika", + "ro": "Africa de Sud", + "ar": "جنوب أفريقيا", + "fa": "آفریقای جنوبی", + "yue": "南非" + }, + flag: "🇿🇦", + code: "ZA", + dialCode: "27", + minLength: 9, + maxLength: 9, + ), + Country( + name: "South Sudan", + nameTranslations: { + "sk": "Južný Sudán", + "se": "Máttasudan", + "pl": "Sudan Południowy", + "no": "Sør-Sudan", + "ja": "南スーダン", + "it": "Sud Sudan", + "zh": "南苏丹", + "nl": "Zuid-Soedan", + "de": "Südsudan", + "fr": "Soudan du Sud", + "es": "Sudán del Sur", + "en": "South Sudan", + "pt_BR": "Sudão do Sul", + "sr-Cyrl": "Јужни Судан", + "sr-Latn": "Južni Sudan", + "zh_TW": "南蘇丹", + "tr": "Güney Sudan", + "ro": "Sudanul de Sud", + "ar": "جنوب السودان", + "fa": "سودان جنوبی", + "yue": "南蘇丹" + }, + flag: "🇸🇸", + code: "SS", + dialCode: "211", + minLength: 9, + maxLength: 9, + ), + Country( + name: "South Georgia and the South Sandwich Islands", + nameTranslations: { + "sk": "Južná Georgia a Južné Sandwichove ostrovy", + "se": "Lulli Georgia ja Lulli Sandwich-sullot", + "pl": "Georgia Południowa i Sandwich Południowy", + "no": "Sør-Georgia og Sør-Sandwichøyene", + "ja": "サウスジョージア・サウスサンドウィッチ諸島", + "it": "Georgia del Sud e Sandwich australi", + "zh": "南乔治亚和南桑威奇群岛", + "nl": "Zuid-Georgia en Zuidelijke Sandwicheilanden", + "de": "Südgeorgien und die Südlichen Sandwichinseln", + "fr": "Géorgie du Sud et îles Sandwich du Sud", + "es": "Islas Georgia del Sur y Sandwich del Sur", + "en": "South Georgia & South Sandwich Islands", + "pt_BR": "Geórgia do Sul e Ilhas Sandwich do Sul", + "sr-Cyrl": "Јужна Џорџија и Јужна Сендвичка Острва", + "sr-Latn": "Južna Džordžija i Južna Sendvička Ostrva", + "zh_TW": "南喬治亞與南三明治群島 ", + "tr": "Güney Georgia ve Güney Sandwich Adaları", + "ro": "Georgia de Sud și Insulele Sandwich de Sud", + "ar": "جورجيا الجنوبية وجزر ساندويتش الجنوبية", + "fa": "جزایر جورجیای جنوبی و ساندویچ جنوبی", + "yue": "南喬治亞州同南桑威奇群島" + }, + flag: "🇬🇸", + code: "GS", + dialCode: "500", + minLength: 15, + maxLength: 15, + ), + Country( + name: "Spain", + nameTranslations: { + "sk": "Španielsko", + "se": "Spánia", + "pl": "Hiszpania", + "no": "Spania", + "ja": "スペイン", + "it": "Spagna", + "zh": "西班牙", + "nl": "Spanje", + "de": "Spanien", + "fr": "Espagne", + "es": "España", + "en": "Spain", + "pt_BR": "Espanha", + "sr-Cyrl": "Шпанија", + "sr-Latn": "Španija", + "zh_TW": "西班牙", + "tr": "İspanya", + "ro": "Spania", + "ar": "إسبانيا", + "fa": "اسپانیا", + "yue": "西班牙" + }, + flag: "🇪🇸", + code: "ES", + dialCode: "34", + minLength: 9, + maxLength: 9, + ), + Country( + name: "Sri Lanka", + nameTranslations: { + "sk": "Srí Lanka", + "se": "Sri Lanka", + "pl": "Sri Lanka", + "no": "Sri Lanka", + "ja": "スリランカ", + "it": "Sri Lanka", + "zh": "斯里兰卡", + "nl": "Sri Lanka", + "de": "Sri Lanka", + "fr": "Sri Lanka", + "es": "Sri Lanka", + "en": "Sri Lanka", + "pt_BR": "Sri Lanka", + "sr-Cyrl": "Шри Ланка", + "sr-Latn": "Šri Lanka", + "zh_TW": "斯里蘭卡", + "tr": "Sri Lanka", + "ro": "Sri Lanka", + "ar": "سريلانكا", + "fa": "سریلانکا", + "yue": "斯里蘭卡" + }, + flag: "🇱🇰", + code: "LK", + dialCode: "94", + minLength: 9, + maxLength: 9, + ), + Country( + name: "Sudan", + nameTranslations: { + "sk": "Sudán", + "se": "Davvisudan", + "pl": "Sudan", + "no": "Sudan", + "ja": "スーダン", + "it": "Sudan", + "zh": "苏丹", + "nl": "Soedan", + "de": "Sudan", + "fr": "Soudan", + "es": "Sudán", + "en": "Sudan", + "pt_BR": "Sudão", + "sr-Cyrl": "Судан", + "sr-Latn": "Sudan", + "zh_TW": "蘇丹", + "tr": "Sudan", + "ro": "Sudan", + "ar": "السودان", + "fa": "سودان", + "yue": "蘇丹" + }, + flag: "🇸🇩", + code: "SD", + dialCode: "249", + minLength: 9, + maxLength: 9, + ), + Country( + name: "Suriname", + nameTranslations: { + "sk": "Surinam", + "se": "Surinam", + "pl": "Surinam", + "no": "Surinam", + "ja": "スリナム", + "it": "Suriname", + "zh": "苏里南", + "nl": "Suriname", + "de": "Suriname", + "fr": "Suriname", + "es": "Surinam", + "en": "Suriname", + "pt_BR": "Suriname", + "sr-Cyrl": "Суринам", + "sr-Latn": "Surinam", + "zh_TW": "蘇利南", + "tr": "Surinam", + "ro": "Surinam", + "ar": "سورينام", + "fa": "سورینام", + "yue": "蘇里南" + }, + flag: "🇸🇷", + code: "SR", + dialCode: "597", + minLength: 7, + maxLength: 7, + ), + Country( + name: "Svalbard and Jan Mayen", + nameTranslations: { + "sk": "Svalbard a Jan Mayen", + "se": "Svalbárda ja Jan Mayen", + "pl": "Svalbard i Jan Mayen", + "no": "Svalbard og Jan Mayen", + "ja": "スバールバル諸島・ヤンマイエン島", + "it": "Svalbard e Jan Mayen", + "zh": "斯瓦尔巴和扬马延", + "nl": "Spitsbergen en Jan Mayen", + "de": "Spitzbergen und Jan Mayen", + "fr": "Svalbard et Jan Mayen", + "es": "Svalbard y Jan Mayen", + "en": "Svalbard & Jan Mayen", + "pt_BR": "Svalbard e Jan Mayen", + "sr-Cyrl": "Свалбард", + "sr-Latn": "Svalbard", + "zh_TW": "斯瓦巴及尖棉", + "tr": "Svalbard ve Jan Mayen", + "ro": "Svalbard și Jan Mayen", + "ar": "سفالبارد ويان ماين", + "fa": "سوالبارد و یان ماین", + "yue": "斯瓦尔巴德同扬·马延" + }, + flag: "🇸🇯", + code: "SJ", + dialCode: "47", + minLength: 8, + maxLength: 8, + ), + Country( + name: "Eswatini", + nameTranslations: { + "sk": "Eswatini", + "se": "Svazieana", + "pl": "Eswatini", + "no": "Eswatini", + "ja": "エスワティニ", + "it": "Swaziland", + "zh": "斯威士兰", + "nl": "eSwatini", + "de": "Eswatini", + "fr": "Eswatini", + "es": "Esuatini", + "en": "Eswatini", + "pt_BR": "Eswatini", + "sr-Cyrl": "Свазиланд", + "sr-Latn": "Svaziland", + "zh_TW": "史瓦帝尼", + "tr": "Esvatini", + "ro": "Eswatini", + "ar": "إسواتيني", + "fa": "اسواتینی", + "yue": "斯威士蘭" + }, + flag: "🇸🇿", + code: "SZ", + dialCode: "268", + minLength: 8, + maxLength: 8, + ), + Country( + name: "Sweden", + nameTranslations: { + "sk": "Švédsko", + "se": "Ruoŧŧa", + "pl": "Szwecja", + "no": "Sverige", + "ja": "スウェーデン", + "it": "Svezia", + "zh": "瑞典", + "nl": "Zweden", + "de": "Schweden", + "fr": "Suède", + "es": "Suecia", + "en": "Sweden", + "pt_BR": "Suécia", + "sr-Cyrl": "Шведска", + "sr-Latn": "Švedska", + "zh_TW": "瑞典", + "tr": "İsveç", + "ro": "Suedia", + "ar": "السويد", + "fa": "سوئد", + "yue": "瑞典" + }, + flag: "🇸🇪", + code: "SE", + dialCode: "46", + minLength: 7, + maxLength: 13, + ), + Country( + name: "Switzerland", + nameTranslations: { + "sk": "Švajčiarsko", + "se": "Šveica", + "pl": "Szwajcaria", + "no": "Sveits", + "ja": "スイス", + "it": "Svizzera", + "zh": "瑞士", + "nl": "Zwitserland", + "de": "Schweiz", + "fr": "Suisse", + "es": "Suiza", + "en": "Switzerland", + "pt_BR": "Suíça", + "sr-Cyrl": "Швајцарска", + "sr-Latn": "Švajcarska", + "zh_TW": "瑞士", + "tr": "İsviçre", + "ro": "Elveţia", + "ar": "سويسرا", + "fa": "سوئیس", + "yue": "瑞士" + }, + flag: "🇨🇭", + code: "CH", + dialCode: "41", + minLength: 9, + maxLength: 12, + ), + Country( + name: "Syrian Arab Republic", + nameTranslations: { + "sk": "Sýria", + "se": "Syria", + "pl": "Syria", + "no": "Syria", + "ja": "シリア", + "it": "Siria", + "zh": "叙利亚", + "nl": "Syrië", + "de": "Syrien", + "fr": "Syrie", + "es": "Siria", + "en": "Syria", + "pt_BR": "Síria", + "sr-Cyrl": "Сирија", + "sr-Latn": "Sirija", + "zh_TW": "敘利亞", + "tr": "Suriye", + "ro": "Siria", + "ar": "سوريا", + "fa": "سوریه", + "yue": "阿拉伯敘利亞共和國" + }, + flag: "🇸🇾", + code: "SY", + dialCode: "963", + minLength: 9, + maxLength: 10, + ), + Country( + name: "Taiwan", + nameTranslations: { + "sk": "Taiwan", + "se": "Taiwan", + "pl": "Tajwan", + "no": "Taiwan", + "ja": "台湾", + "it": "Taiwan", + "zh": "台湾", + "nl": "Taiwan", + "de": "Taiwan", + "fr": "Taïwan", + "es": "Taiwán", + "en": "Taiwan", + "pt_BR": "Taiwan", + "sr-Cyrl": "Тајван", + "sr-Latn": "Tajvan", + "zh_TW": "台灣", + "tr": "Tayvan", + "ro": "Taiwan", + "ar": "تايوان", + "fa": "تایوان", + "yue": "台灣" + }, + flag: "🇹🇼", + code: "TW", + dialCode: "886", + minLength: 9, + maxLength: 9, + ), + Country( + name: "Tajikistan", + nameTranslations: { + "sk": "Tadžikistan", + "se": "Tažikistan", + "pl": "Tadżykistan", + "no": "Tadsjikistan", + "ja": "タジキスタン", + "it": "Tagikistan", + "zh": "塔吉克斯坦", + "nl": "Tadzjikistan", + "de": "Tadschikistan", + "fr": "Tadjikistan", + "es": "Tayikistán", + "en": "Tajikistan", + "pt_BR": "Tajiquistão", + "sr-Cyrl": "Таџикистан", + "sr-Latn": "Tadžikistan", + "zh_TW": "塔吉克", + "tr": "Tacikistan", + "ro": "Tadiquistão", + "ar": "طاجيكستان", + "fa": "تاجیکستان", + "yue": "塔吉克斯坦" + }, + flag: "🇹🇯", + code: "TJ", + dialCode: "992", + minLength: 9, + maxLength: 9, + ), + Country( + name: "Tanzania, United Republic of Tanzania", + nameTranslations: { + "sk": "Tanzánia", + "se": "Tanzánia", + "pl": "Tanzania", + "no": "Tanzania", + "ja": "タンザニア", + "it": "Tanzania", + "zh": "坦桑尼亚", + "nl": "Tanzania", + "de": "Tansania", + "fr": "Tanzanie", + "es": "Tanzania", + "en": "Tanzania", + "pt_BR": "Tanzânia", + "sr-Cyrl": "Танзанија", + "sr-Latn": "Tanzanija", + "zh_TW": "坦尚尼亞", + "tr": "Tanzanya", + "ro": "Tanzania", + "ar": "تنزانيا", + "fa": "تانزانیا", + "yue": "坦桑尼亞,聯合共和國" + }, + flag: "🇹🇿", + code: "TZ", + dialCode: "255", + minLength: 9, + maxLength: 9, + ), + Country( + name: "Thailand", + nameTranslations: { + "sk": "Thajsko", + "se": "Thaieana", + "pl": "Tajlandia", + "no": "Thailand", + "ja": "タイ", + "it": "Thailandia", + "zh": "泰国", + "nl": "Thailand", + "de": "Thailand", + "fr": "Thaïlande", + "es": "Tailandia", + "en": "Thailand", + "pt_BR": "Tailândia", + "sr-Cyrl": "Тајланд", + "sr-Latn": "Tajland", + "zh_TW": "泰國", + "tr": "Tayland", + "ro": "Tailanda", + "ar": "تايلاند", + "fa": "تایلند", + "yue": "泰國" + }, + flag: "🇹🇭", + code: "TH", + dialCode: "66", + minLength: 9, + maxLength: 9, + ), + Country( + name: "Timor-Leste", + nameTranslations: { + "sk": "Východný Timor", + "se": "Nuorta-Timor", + "pl": "Timor Wschodni", + "no": "Øst-Timor", + "ja": "東ティモール", + "it": "Timor Est", + "zh": "东帝汶", + "nl": "Oost-Timor", + "de": "Timor-Leste", + "fr": "Timor oriental", + "es": "Timor-Leste", + "en": "Timor-Leste", + "pt_BR": "Timor-Leste", + "sr-Cyrl": "Источни Тимор", + "sr-Latn": "Istočni Timor", + "zh_TW": "東帝汶", + "tr": "Doğu Timor", + "ro": "Timorul de Est", + "ar": "تيمور الشرقية", + "fa": "تیمور شرقی", + "yue": "東帝汶" + }, + flag: "🇹🇱", + code: "TL", + dialCode: "670", + minLength: 7, + maxLength: 7, + ), + Country( + name: "Togo", + nameTranslations: { + "sk": "Togo", + "se": "Togo", + "pl": "Togo", + "no": "Togo", + "ja": "トーゴ", + "it": "Togo", + "zh": "多哥", + "nl": "Togo", + "de": "Togo", + "fr": "Togo", + "es": "Togo", + "en": "Togo", + "pt_BR": "Ir", + "sr-Cyrl": "Того", + "sr-Latn": "Togo", + "zh_TW": "多哥", + "tr": "Togo", + "ro": "Togo", + "ar": "توغو", + "fa": "توگو", + "yue": "多哥" + }, + flag: "🇹🇬", + code: "TG", + dialCode: "228", + minLength: 8, + maxLength: 8, + ), + Country( + name: "Tokelau", + nameTranslations: { + "sk": "Tokelau", + "se": "Tokelau", + "pl": "Tokelau", + "no": "Tokelau", + "ja": "トケラウ", + "it": "Tokelau", + "zh": "托克劳", + "nl": "Tokelau", + "de": "Tokelau", + "fr": "Tokelau", + "es": "Tokelau", + "en": "Tokelau", + "pt_BR": "Tokelau", + "sr-Cyrl": "Токелау", + "sr-Latn": "Tokelau", + "zh_TW": "托克勞", + "tr": "Tokelau", + "ro": "Tokelau", + "ar": "توكيلاو", + "fa": "توکلائو", + "yue": "托克劳" + }, + flag: "🇹🇰", + code: "TK", + dialCode: "690", + minLength: 4, + maxLength: 4, + ), + Country( + name: "Tonga", + nameTranslations: { + "sk": "Tonga", + "se": "Tonga", + "pl": "Tonga", + "no": "Tonga", + "ja": "トンガ", + "it": "Tonga", + "zh": "汤加", + "nl": "Tonga", + "de": "Tonga", + "fr": "Tonga", + "es": "Tonga", + "en": "Tonga", + "pt_BR": "Tonga", + "sr-Cyrl": "Тонга", + "sr-Latn": "Tonga", + "zh_TW": "東加", + "tr": "Tonga", + "ro": "Tonga", + "ar": "تونغا", + "fa": "تونگا", + "yue": "湯加" + }, + flag: "🇹🇴", + code: "TO", + dialCode: "676", + minLength: 7, + maxLength: 7, + ), + Country( + name: "Trinidad and Tobago", + nameTranslations: { + "sk": "Trinidad a Tobago", + "se": "Trinidad ja Tobago", + "pl": "Trynidad i Tobago", + "no": "Trinidad og Tobago", + "ja": "トリニダード・トバゴ", + "it": "Trinidad e Tobago", + "zh": "特立尼达和多巴哥", + "nl": "Trinidad en Tobago", + "de": "Trinidad und Tobago", + "fr": "Trinité-et-Tobago", + "es": "Trinidad y Tobago", + "en": "Trinidad & Tobago", + "pt_BR": "Trinidad e Tobago", + "sr-Cyrl": "Тринидад и Тобаго", + "sr-Latn": "Trinidad i Tobago", + "zh_TW": "千里達及托巴哥", + "tr": "Trinidad ve Tobago", + "ro": "Trinidad şi Tobago", + "ar": "ترينيداد وتوباغو", + "fa": "ترینیداد و توباگو", + "yue": "特立尼達和多巴哥" + }, + flag: "🇹🇹", + code: "TT", + dialCode: "1868", + minLength: 7, + maxLength: 7, + ), + Country( + name: "Tunisia", + nameTranslations: { + "sk": "Tunisko", + "se": "Tunisia", + "pl": "Tunezja", + "no": "Tunisia", + "ja": "チュニジア", + "it": "Tunisia", + "zh": "突尼斯", + "nl": "Tunesië", + "de": "Tunesien", + "fr": "Tunisie", + "es": "Túnez", + "en": "Tunisia", + "pt_BR": "Tunísia", + "sr-Cyrl": "Тунис", + "sr-Latn": "Tunis", + "zh_TW": "突尼西亞", + "tr": "Tunus", + "ro": "Tunisia", + "ar": "تونس", + "fa": "تونس", + "yue": "突尼斯" + }, + flag: "🇹🇳", + code: "TN", + dialCode: "216", + minLength: 8, + maxLength: 8, + ), + Country( + name: "Turkey", + nameTranslations: { + "sk": "Turecko", + "se": "Durka", + "pl": "Turcja", + "no": "Tyrkia", + "ja": "トルコ", + "it": "Turchia", + "zh": "土耳其", + "nl": "Turkije", + "de": "Türkei", + "fr": "Turquie", + "es": "Turquía", + "en": "Turkey", + "pt_BR": "Peru", + "sr-Cyrl": "Турска", + "sr-Latn": "Turska", + "zh_TW": "土耳其", + "tr": "Türkiye", + "ro": "Turcia", + "ar": "تركيا", + "fa": "ترکیه", + "yue": "土耳其" + }, + flag: "🇹🇷", + code: "TR", + dialCode: "90", + minLength: 10, + maxLength: 10, + ), + Country( + name: "Turkmenistan", + nameTranslations: { + "sk": "Turkménsko", + "se": "Turkmenistan", + "pl": "Turkmenistan", + "no": "Turkmenistan", + "ja": "トルクメニスタン", + "it": "Turkmenistan", + "zh": "土库曼斯坦", + "nl": "Turkmenistan", + "de": "Turkmenistan", + "fr": "Turkménistan", + "es": "Turkmenistán", + "en": "Turkmenistan", + "pt_BR": "Turcomenistão", + "sr-Cyrl": "Туркменистан", + "sr-Latn": "Turkmenistan", + "zh_TW": "土庫曼", + "tr": "Türkmenistan", + "ro": "Turkmenistan", + "ar": "تركمانستان", + "fa": "ترکمنستان", + "yue": "土庫曼斯坦" + }, + flag: "🇹🇲", + code: "TM", + dialCode: "993", + minLength: 8, + maxLength: 8, + ), + Country( + name: "Turks and Caicos Islands", + nameTranslations: { + "sk": "Turks a Caicos", + "se": "Turks ja Caicos-sullot", + "pl": "Turks i Caicos", + "no": "Turks- og Caicosøyene", + "ja": "タークス・カイコス諸島", + "it": "Isole Turks e Caicos", + "zh": "特克斯和凯科斯群岛", + "nl": "Turks- en Caicoseilanden", + "de": "Turks- und Caicosinseln", + "fr": "Îles Turques-et-Caïques", + "es": "Islas Turcas y Caicos", + "en": "Turks & Caicos Islands", + "pt_BR": "Ilhas Turks e Caicos", + "sr-Cyrl": "Туркс и Кајкос", + "sr-Latn": "Turks i Kajkos", + "zh_TW": "土克斯及開科斯群島", + "tr": "Turks ve Caicos Adaları", + "ro": "Insulele Turks și Caicos", + "ar": "جزر توركس وكايكوس", + "fa": "جزایر تورکس و کایکوس", + "yue": "特克斯同凯科斯群岛" + }, + flag: "🇹🇨", + code: "TC", + dialCode: "1649", + minLength: 7, + maxLength: 7, + ), + Country( + name: "Tuvalu", + nameTranslations: { + "sk": "Tuvalu", + "se": "Tuvalu", + "pl": "Tuvalu", + "no": "Tuvalu", + "ja": "ツバル", + "it": "Tuvalu", + "zh": "图瓦卢", + "nl": "Tuvalu", + "de": "Tuvalu", + "fr": "Tuvalu", + "es": "Tuvalu", + "en": "Tuvalu", + "pt_BR": "Tuvalu", + "sr-Cyrl": "Тувалу", + "sr-Latn": "Tuvalu", + "zh_TW": "圖瓦盧", + "tr": "Tuvalu", + "ro": "Tuvalu", + "ar": "توفالو", + "fa": "تووالو", + "yue": "圖瓦盧" + }, + flag: "🇹🇻", + code: "TV", + dialCode: "688", + minLength: 6, + maxLength: 6, + ), + Country( + name: "Uganda", + nameTranslations: { + "sk": "Uganda", + "se": "Uganda", + "pl": "Uganda", + "no": "Uganda", + "ja": "ウガンダ", + "it": "Uganda", + "zh": "乌干达", + "nl": "Oeganda", + "de": "Uganda", + "fr": "Ouganda", + "es": "Uganda", + "en": "Uganda", + "pt_BR": "Uganda", + "sr-Cyrl": "Уганда", + "sr-Latn": "Uganda", + "zh_TW": "烏干達", + "tr": "Uganda", + "ro": "Uganda", + "ar": "أوغندا", + "fa": "اوگاندا", + "yue": "烏干達" + }, + flag: "🇺🇬", + code: "UG", + dialCode: "256", + minLength: 9, + maxLength: 9, + ), + Country( + name: "Ukraine", + nameTranslations: { + "sk": "Ukrajina", + "se": "Ukraina", + "pl": "Ukraina", + "no": "Ukraina", + "ja": "ウクライナ", + "it": "Ucraina", + "zh": "乌克兰", + "nl": "Oekraïne", + "de": "Ukraine", + "fr": "Ukraine", + "es": "Ucrania", + "en": "Ukraine", + "pt_BR": "Ucrânia", + "sr-Cyrl": "Украјина", + "sr-Latn": "Ukrajina", + "zh_TW": "烏克蘭", + "tr": "Ukrayna", + "ro": "Ucraína", + "ar": "أوكرانيا", + "fa": "اوکراین", + "yue": "烏克蘭" + }, + flag: "🇺🇦", + code: "UA", + dialCode: "380", + minLength: 9, + maxLength: 9, + ), + Country( + name: "United Arab Emirates", + nameTranslations: { + "sk": "Spojené arabské emiráty", + "se": "Ovttastuvvan Arábaemiráhtat", + "pl": "Zjednoczone Emiraty Arabskie", + "no": "De forente arabiske emirater", + "ja": "アラブ首長国連邦", + "it": "Emirati Arabi Uniti", + "zh": "阿拉伯联合酋长国", + "nl": "Verenigde Arabische Emiraten", + "de": "Vereinigte Arabische Emirate", + "fr": "Émirats arabes unis", + "es": "Emiratos Árabes Unidos", + "en": "United Arab Emirates", + "pt_BR": "Emirados Árabes Unidos", + "sr-Cyrl": "Уједињени Арапски Емирати", + "sr-Latn": "Ujedinjeni Arapski Emirati", + "zh_TW": "阿拉伯聯合大公國", + "tr": "Birleşik Arap Emirlikleri", + "ro": "Emiratele Arabe Unite", + "ar": "الإمارات العربية المتحدة", + "fa": "امارات متحده عربی", + "yue": "阿拉伯聯合酋長國" + }, + flag: "🇦🇪", + code: "AE", + dialCode: "971", + minLength: 9, + maxLength: 9, + ), + Country( + name: "United Kingdom", + nameTranslations: { + "sk": "Spojené kráľovstvo", + "se": "Stuorra-Británnia", + "pl": "Wielka Brytania", + "no": "Storbritannia", + "ja": "イギリス", + "it": "Regno Unito", + "zh": "英国", + "nl": "Verenigd Koninkrijk", + "de": "Vereinigtes Königreich", + "fr": "Royaume-Uni", + "es": "Reino Unido", + "en": "United Kingdom", + "pt_BR": "Reino Unido", + "sr-Cyrl": "Уједињено Краљевство", + "sr-Latn": "Ujedinjeno Kraljevstvo", + "zh_TW": "英國", + "tr": "Büyük Britanya ve Kuzey İrlanda Birleşik Krallığ", + "ro": "Regatul Unit al Marii Britanii și Irlandei de Nord", + "ar": "المملكة المتحدة", + "fa": "بریتانیا", + "yue": "大不列顛及北愛爾蘭聯合王國" + }, + flag: "🇬🇧", + code: "GB", + dialCode: "44", + minLength: 10, + maxLength: 10, + ), + Country( + name: "United States", + nameTranslations: { + "sk": "Spojené štáty", + "se": "Amerihká ovttastuvvan stáhtat", + "pl": "Stany Zjednoczone", + "no": "USA", + "ja": "アメリカ合衆国", + "it": "Stati Uniti", + "zh": "美国", + "nl": "Verenigde Staten", + "de": "Vereinigte Staaten", + "fr": "États-Unis", + "es": "Estados Unidos", + "en": "United States", + "pt_BR": "Estados Unidos", + "sr-Cyrl": "Сједињене Америчке Државе", + "sr-Latn": "Sjedinjene Američke Države", + "zh_TW": "美國", + "tr": "Amerika Birleşik Devletleri", + "ro": "Statele Unite ale Americii", + "ar": "الولايات المتحدة", + "fa": "ایالات متحده آمریکا", + "yue": "美利堅郃眾囯" + }, + flag: "🇺🇸", + code: "US", + dialCode: "1", + minLength: 10, + maxLength: 10, + ), + Country( + name: "Uruguay", + nameTranslations: { + "sk": "Uruguaj", + "se": "Uruguay", + "pl": "Urugwaj", + "no": "Uruguay", + "ja": "ウルグアイ", + "it": "Uruguay", + "zh": "乌拉圭", + "nl": "Uruguay", + "de": "Uruguay", + "fr": "Uruguay", + "es": "Uruguay", + "en": "Uruguay", + "pt_BR": "Uruguai", + "sr-Cyrl": "Уругвај", + "sr-Latn": "Urugvaj", + "zh_TW": "烏拉圭", + "tr": "Uruguay", + "ro": "Uruguay", + "ar": "الأوروغواي", + "fa": "اروگوئه", + "yue": "烏拉圭" + }, + flag: "🇺🇾", + code: "UY", + dialCode: "598", + minLength: 9, + maxLength: 9, + ), + Country( + name: "Uzbekistan", + nameTranslations: { + "sk": "Uzbekistan", + "se": "Usbekistan", + "pl": "Uzbekistan", + "no": "Usbekistan", + "ja": "ウズベキスタン", + "it": "Uzbekistan", + "zh": "乌兹别克斯坦", + "nl": "Oezbekistan", + "de": "Usbekistan", + "fr": "Ouzbékistan", + "es": "Uzbekistán", + "en": "Uzbekistan", + "pt_BR": "Uzbequistão", + "sr-Cyrl": "Узбекистан", + "sr-Latn": "Uzbekistan", + "zh_TW": "烏玆別克", + "tr": "Özbekistan", + "ro": "Uzbekistan", + "ar": "أوزبكستان", + "fa": "ازبکستان", + "yue": "月即別" + }, + flag: "🇺🇿", + code: "UZ", + dialCode: "998", + minLength: 9, + maxLength: 9, + ), + Country( + name: "Vanuatu", + nameTranslations: { + "sk": "Vanuatu", + "se": "Vanuatu", + "pl": "Vanuatu", + "no": "Vanuatu", + "ja": "バヌアツ", + "it": "Vanuatu", + "zh": "瓦努阿图", + "nl": "Vanuatu", + "de": "Vanuatu", + "fr": "Vanuatu", + "es": "Vanuatu", + "en": "Vanuatu", + "pt_BR": "Vanuatu", + "sr-Cyrl": "Вануату", + "sr-Latn": "Vanuatu", + "zh_TW": "瓦努阿圖", + "tr": "Vanuatu", + "ro": "Vanuatu", + "ar": "فانواتو", + "fa": "وانواتو", + "yue": "瓦努阿圖" + }, + flag: "🇻🇺", + code: "VU", + dialCode: "678", + minLength: 7, + maxLength: 7, + ), + Country( + name: "Venezuela, Bolivarian Republic of Venezuela", + nameTranslations: { + "sk": "Venezuela", + "se": "Venezuela", + "pl": "Wenezuela", + "no": "Venezuela", + "ja": "ベネズエラ", + "it": "Venezuela", + "zh": "委内瑞拉", + "nl": "Venezuela", + "de": "Venezuela", + "fr": "Venezuela", + "es": "Venezuela", + "en": "Venezuela", + "pt_BR": "Venezuela", + "sr-Cyrl": "Венецуела", + "sr-Latn": "Venecuela", + "zh_TW": "委內瑞拉", + "tr": "Venezuela", + "ro": "Venezuela", + "ar": "فنزويلا", + "fa": "ونزوئلا", + "yue": "委內瑞拉(玻利瓦爾共和國)" + }, + flag: "🇻🇪", + code: "VE", + dialCode: "58", + minLength: 10, + maxLength: 10, + ), + Country( + name: "Vietnam", + nameTranslations: { + "sk": "Vietnam", + "se": "Vietnam", + "pl": "Wietnam", + "no": "Vietnam", + "ja": "ベトナム", + "it": "Vietnam", + "zh": "越南", + "nl": "Vietnam", + "de": "Vietnam", + "fr": "Vietnam", + "es": "Vietnam", + "en": "Vietnam", + "pt_BR": "Vietnã", + "sr-Cyrl": "Вијетнам", + "sr-Latn": "Vijetnam", + "zh_TW": "越南", + "tr": "Vietnam", + "ro": "Vietnam", + "ar": "فيتنام", + "fa": "ویتنام", + "yue": "越南" + }, + flag: "🇻🇳", + code: "VN", + dialCode: "84", + minLength: 11, + maxLength: 11, + ), + Country( + name: "Virgin Islands, British", + nameTranslations: { + "sk": "Britské Panenské ostrovy", + "se": "Brittania Virgin-sullot", + "pl": "Brytyjskie Wyspy Dziewicze", + "no": "De britiske jomfruøyene", + "ja": "英領ヴァージン諸島", + "it": "Isole Vergini Britanniche", + "zh": "英属维尔京群岛", + "nl": "Britse Maagdeneilanden", + "de": "Britische Jungferninseln", + "fr": "Îles Vierges britanniques", + "es": "Islas Vírgenes Británicas", + "en": "British Virgin Islands", + "pt_BR": "Ilhas Virgens Britânicas", + "sr-Cyrl": "Британска Девичанска Острва", + "sr-Latn": "Britanska Devičanska Ostrva", + "zh_TW": "英屬維京群島", + "tr": "Britanya Virjin Adaları", + "ro": "Insulele Virgine Britanice", + "ar": "جزر العذراء البريطانية", + "fa": "جزایر ویرجین بریتانیا", + "yue": "維爾京群島(英國)" + }, + flag: "🇻🇬", + code: "VG", + dialCode: "1284", + minLength: 7, + maxLength: 7, + ), + Country( + name: "Virgin Islands, U.S.", + nameTranslations: { + "sk": "Americké Panenské ostrovy", + "se": "AOS Virgin-sullot", + "pl": "Wyspy Dziewicze Stanów Zjednoczonych", + "no": "De amerikanske jomfruøyene", + "ja": "米領ヴァージン諸島", + "it": "Isole Vergini Americane", + "zh": "美属维尔京群岛", + "nl": "Amerikaanse Maagdeneilanden", + "de": "Amerikanische Jungferninseln", + "fr": "Îles Vierges des États-Unis", + "es": "Islas Vírgenes de EE. UU.", + "en": "U.S. Virgin Islands", + "pt_BR": "Ilhas Virgens Americanas", + "sr-Cyrl": "Амепичка Девичанска Острва", + "sr-Latn": "Američka Devičanska Ostrva", + "zh_TW": "美屬維京群島", + "tr": "Amerika Birleşik Devletleri Virjin Adaları", + "ro": "Insulele Virgine Americane", + "ar": "جزر العذراء الأمريكية", + "fa": "جزایر ویرجین ایالات متحده آمریکا", + "yue": "維爾京群島(美國)" + }, + flag: "🇻🇮", + code: "VI", + dialCode: "1340", + minLength: 7, + maxLength: 7, + ), + Country( + name: "Wallis and Futuna", + nameTranslations: { + "sk": "Wallis a Futuna", + "se": "Wallis ja Futuna", + "pl": "Wallis i Futuna", + "no": "Wallis og Futuna", + "ja": "ウォリス・フツナ", + "it": "Wallis e Futuna", + "zh": "瓦利斯和富图纳", + "nl": "Wallis en Futuna", + "de": "Wallis und Futuna", + "fr": "Wallis-et-Futuna", + "es": "Wallis y Futuna", + "en": "Wallis & Futuna", + "pt_BR": "Wallis e Futuna", + "sr-Cyrl": "Валис и Футуна", + "sr-Latn": "Valis i Futuna", + "zh_TW": "瓦利斯和富圖那", + "tr": "Wallis ve Futuna", + "ro": "Wallis și Futuna", + "ar": "والس وفوتونا", + "fa": "والیس و فوتونا", + "yue": "瓦利斯同富图纳" + }, + flag: "🇼🇫", + code: "WF", + dialCode: "681", + minLength: 6, + maxLength: 6, + ), + Country( + name: "Yemen", + nameTranslations: { + "sk": "Jemen", + "se": "Jemen", + "pl": "Jemen", + "no": "Jemen", + "ja": "イエメン", + "it": "Yemen", + "zh": "也门", + "nl": "Jemen", + "de": "Jemen", + "fr": "Yémen", + "es": "Yemen", + "en": "Yemen", + "pt_BR": "Iémen", + "sr-Cyrl": "Јемен", + "sr-Latn": "Jemen", + "zh_TW": "葉門", + "tr": "Yemen", + "ro": "Yemen", + "ar": "اليمن", + "fa": "یمن", + "yue": "也門" + }, + flag: "🇾🇪", + code: "YE", + dialCode: "967", + minLength: 9, + maxLength: 9, + ), + Country( + name: "Zambia", + nameTranslations: { + "sk": "Zambia", + "se": "Zambia", + "pl": "Zambia", + "no": "Zambia", + "ja": "ザンビア", + "it": "Zambia", + "zh": "赞比亚", + "nl": "Zambia", + "de": "Sambia", + "fr": "Zambie", + "es": "Zambia", + "en": "Zambia", + "pt_BR": "Zâmbia", + "sr-Cyrl": "Замбија", + "sr-Latn": "Zambija", + "zh_TW": "贊比亞", + "tr": "Zambiya", + "ro": "Zambia", + "ar": "زامبيا", + "fa": "زامبیا", + "yue": "贊比亞" + }, + flag: "🇿🇲", + code: "ZM", + dialCode: "260", + minLength: 9, + maxLength: 9, + ), + Country( + name: "Zimbabwe", + nameTranslations: { + "sk": "Zimbabwe", + "se": "Zimbabwe", + "pl": "Zimbabwe", + "no": "Zimbabwe", + "ja": "ジンバブエ", + "it": "Zimbabwe", + "zh": "津巴布韦", + "nl": "Zimbabwe", + "de": "Simbabwe", + "fr": "Zimbabwe", + "es": "Zimbabue", + "en": "Zimbabwe", + "pt_BR": "Zimbábue", + "sr-Cyrl": "Зимбабве", + "sr-Latn": "Zimbabve", + "zh_TW": "辛巴威", + "tr": "Zimbabve", + "ro": "Zimbabwe", + "ar": "زيمبابوي", + "fa": "زیمبابوه", + "yue": "津巴布韋" + }, + flag: "🇿🇼", + code: "ZW", + dialCode: "263", + minLength: 9, + maxLength: 9) +]; + +class Country { + final String name; + final Map nameTranslations; + final String flag; + final String code; + final String dialCode; + final String regionCode; + final int minLength; + final int maxLength; + + const Country({ + required this.name, + required this.flag, + required this.code, + required this.dialCode, + required this.nameTranslations, + required this.minLength, + required this.maxLength, + this.regionCode = "", + }); + + String get fullCountryCode { + return dialCode + regionCode; + } + + String get displayCC { + if (regionCode != "") { + return "$dialCode $regionCode"; + } + return dialCode; + } + + String localizedName(String languageCode) { + return nameTranslations[languageCode] ?? name; + } +} diff --git a/siro_driver/lib/controller/local/phone_intel/country_picker_dialog.dart b/siro_driver/lib/controller/local/phone_intel/country_picker_dialog.dart new file mode 100644 index 0000000..e9e42b8 --- /dev/null +++ b/siro_driver/lib/controller/local/phone_intel/country_picker_dialog.dart @@ -0,0 +1,168 @@ +import 'package:flutter/foundation.dart' show kIsWeb; +import 'package:flutter/material.dart'; +import 'package:siro_driver/controller/local/phone_intel/helpers.dart'; + +import 'countries.dart'; + +class PickerDialogStyle { + final Color? backgroundColor; + + final TextStyle? countryCodeStyle; + + final TextStyle? countryNameStyle; + + final Widget? listTileDivider; + + final EdgeInsets? listTilePadding; + + final EdgeInsets? padding; + + final Color? searchFieldCursorColor; + + final InputDecoration? searchFieldInputDecoration; + + final EdgeInsets? searchFieldPadding; + + final double? width; + + PickerDialogStyle({ + this.backgroundColor, + this.countryCodeStyle, + this.countryNameStyle, + this.listTileDivider, + this.listTilePadding, + this.padding, + this.searchFieldCursorColor, + this.searchFieldInputDecoration, + this.searchFieldPadding, + this.width, + }); +} + +class CountryPickerDialog extends StatefulWidget { + final List countryList; + final Country selectedCountry; + final ValueChanged onCountryChanged; + final String searchText; + final List filteredCountries; + final PickerDialogStyle? style; + final String languageCode; + + const CountryPickerDialog({ + Key? key, + required this.searchText, + required this.languageCode, + required this.countryList, + required this.onCountryChanged, + required this.selectedCountry, + required this.filteredCountries, + this.style, + }) : super(key: key); + + @override + State createState() => _CountryPickerDialogState(); +} + +class _CountryPickerDialogState extends State { + late List _filteredCountries; + late Country _selectedCountry; + + @override + void initState() { + _selectedCountry = widget.selectedCountry; + _filteredCountries = widget.filteredCountries.toList() + ..sort( + (a, b) => a + .localizedName(widget.languageCode) + .compareTo(b.localizedName(widget.languageCode)), + ); + + super.initState(); + } + + @override + Widget build(BuildContext context) { + final mediaWidth = MediaQuery.of(context).size.width; + final width = widget.style?.width ?? mediaWidth; + const defaultHorizontalPadding = 40.0; + const defaultVerticalPadding = 24.0; + return Dialog( + insetPadding: EdgeInsets.symmetric( + vertical: defaultVerticalPadding, + horizontal: mediaWidth > (width + defaultHorizontalPadding * 2) + ? (mediaWidth - width) / 2 + : defaultHorizontalPadding), + backgroundColor: widget.style?.backgroundColor, + child: Container( + padding: widget.style?.padding ?? const EdgeInsets.all(10), + child: Column( + children: [ + Padding( + padding: + widget.style?.searchFieldPadding ?? const EdgeInsets.all(0), + child: TextField( + cursorColor: widget.style?.searchFieldCursorColor, + decoration: widget.style?.searchFieldInputDecoration ?? + InputDecoration( + suffixIcon: const Icon(Icons.search), + labelText: widget.searchText, + ), + onChanged: (value) { + _filteredCountries = widget.countryList.stringSearch(value) + ..sort( + (a, b) => a + .localizedName(widget.languageCode) + .compareTo(b.localizedName(widget.languageCode)), + ); + if (mounted) setState(() {}); + }, + ), + ), + const SizedBox(height: 20), + Expanded( + child: ListView.builder( + shrinkWrap: true, + itemCount: _filteredCountries.length, + itemBuilder: (ctx, index) => Column( + children: [ + ListTile( + leading: kIsWeb + ? Image.asset( + 'assets/flags/${_filteredCountries[index].code.toLowerCase()}.png', + package: 'intl_phone_field', + width: 32, + ) + : Text( + _filteredCountries[index].flag, + style: const TextStyle(fontSize: 18), + ), + contentPadding: widget.style?.listTilePadding, + title: Text( + _filteredCountries[index] + .localizedName(widget.languageCode), + style: widget.style?.countryNameStyle ?? + const TextStyle(fontWeight: FontWeight.w700), + ), + trailing: Text( + '+${_filteredCountries[index].dialCode}', + style: widget.style?.countryCodeStyle ?? + const TextStyle(fontWeight: FontWeight.w700), + ), + onTap: () { + _selectedCountry = _filteredCountries[index]; + widget.onCountryChanged(_selectedCountry); + Navigator.of(context).pop(); + }, + ), + widget.style?.listTileDivider ?? + const Divider(thickness: 1), + ], + ), + ), + ), + ], + ), + ), + ); + } +} diff --git a/siro_driver/lib/controller/local/phone_intel/helpers.dart b/siro_driver/lib/controller/local/phone_intel/helpers.dart new file mode 100644 index 0000000..c2b3957 --- /dev/null +++ b/siro_driver/lib/controller/local/phone_intel/helpers.dart @@ -0,0 +1,31 @@ +import 'countries.dart'; + +bool isNumeric(String s) => + s.isNotEmpty && int.tryParse(s.replaceAll("+", "")) != null; + +String removeDiacritics(String str) { + var withDia = + 'ÀÁÂÃÄÅàáâãäåÒÓÔÕÕÖØòóôõöøÈÉÊËèéêëðÇçÐÌÍÎÏìíîïÙÚÛÜùúûüÑñŠšŸÿýŽž'; + var withoutDia = + 'AAAAAAaaaaaaOOOOOOOooooooEEEEeeeeeCcDIIIIiiiiUUUUuuuuNnSsYyyZz'; + + for (int i = 0; i < withDia.length; i++) { + str = str.replaceAll(withDia[i], withoutDia[i]); + } + + return str; +} + +extension CountryExtensions on List { + List stringSearch(String search) { + search = removeDiacritics(search.toLowerCase()); + return where( + (country) => isNumeric(search) || search.startsWith("+") + ? country.dialCode.contains(search) + : removeDiacritics(country.name.replaceAll("+", "").toLowerCase()) + .contains(search) || + country.nameTranslations.values.any((element) => + removeDiacritics(element.toLowerCase()).contains(search)), + ).toList(); + } +} diff --git a/siro_driver/lib/controller/local/phone_intel/intl_phone_field.dart b/siro_driver/lib/controller/local/phone_intel/intl_phone_field.dart new file mode 100644 index 0000000..b918bc6 --- /dev/null +++ b/siro_driver/lib/controller/local/phone_intel/intl_phone_field.dart @@ -0,0 +1,521 @@ +library intl_phone_field; + +import 'dart:async'; +import 'package:flutter/foundation.dart' show kIsWeb; +import 'package:flutter/material.dart'; +import 'package:flutter/services.dart'; + +import './countries.dart'; +import './phone_number.dart'; +import 'country_picker_dialog.dart'; +import 'helpers.dart'; + +class IntlPhoneField extends StatefulWidget { + /// The TextFormField key. + final GlobalKey? formFieldKey; + + /// Whether to hide the text being edited (e.g., for passwords). + final bool obscureText; + + /// How the text should be aligned horizontally. + final TextAlign textAlign; + + /// How the text should be aligned vertically. + final TextAlignVertical? textAlignVertical; + final VoidCallback? onTap; + + /// {@macro flutter.widgets.editableText.readOnly} + final bool readOnly; + final FormFieldSetter? onSaved; + + /// {@macro flutter.widgets.editableText.onChanged} + /// + /// See also: + /// + /// * [inputFormatters], which are called before [onChanged] + /// runs and can validate and change ("format") the input value. + /// * [onEditingComplete], [onSubmitted], [onSelectionChanged]: + /// which are more specialized input change notifications. + final ValueChanged? onChanged; + + final ValueChanged? onCountryChanged; + + /// An optional method that validates an input. Returns an error string to display if the input is invalid, or null otherwise. + /// + /// A [PhoneNumber] is passed to the validator as argument. + /// The validator can handle asynchronous validation when declared as a [Future]. + /// Or run synchronously when declared as a [Function]. + /// + /// By default, the validator checks whether the input number length is between selected country's phone numbers min and max length. + /// If `disableLengthCheck` is not set to `true`, your validator returned value will be overwritten by the default validator. + /// But, if `disableLengthCheck` is set to `true`, your validator will have to check phone number length itself. + final FutureOr Function(PhoneNumber?)? validator; + + /// {@macro flutter.widgets.editableText.keyboardType} + final TextInputType keyboardType; + + /// Controls the text being edited. + /// + /// If null, this widget will create its own [TextEditingController]. + final TextEditingController? controller; + + /// Defines the keyboard focus for this widget. + /// + /// The [focusNode] is a long-lived object that's typically managed by a + /// [StatefulWidget] parent. See [FocusNode] for more information. + /// + /// To give the keyboard focus to this widget, provide a [focusNode] and then + /// use the current [FocusScope] to request the focus: + /// + /// ```dart + /// FocusScope.of(context).requestFocus(myFocusNode); + /// ``` + /// + /// This happens automatically when the widget is tapped. + /// + /// To be notified when the widget gains or loses the focus, add a listener + /// to the [focusNode]: + /// + /// ```dart + /// focusNode.addListener(() { print(myFocusNode.hasFocus); }); + /// ``` + /// + /// If null, this widget will create its own [FocusNode]. + /// + /// ## Keyboard + /// + /// Requesting the focus will typically cause the keyboard to be shown + /// if it's not showing already. + /// + /// On Android, the user can hide the keyboard - without changing the focus - + /// with the system back button. They can restore the keyboard's visibility + /// by tapping on a text field. The user might hide the keyboard and + /// switch to a physical keyboard, or they might just need to get it + /// out of the way for a moment, to expose something it's + /// obscuring. In this case requesting the focus again will not + /// cause the focus to change, and will not make the keyboard visible. + /// + /// This widget builds an [EditableText] and will ensure that the keyboard is + /// showing when it is tapped by calling [EditableTextState.requestKeyboard()]. + final FocusNode? focusNode; + + /// {@macro flutter.widgets.editableText.onSubmitted} + /// + /// See also: + /// + /// * [EditableText.onSubmitted] for an example of how to handle moving to + /// the next/previous field when using [TextInputAction.next] and + /// [TextInputAction.previous] for [textInputAction]. + final void Function(String)? onSubmitted; + + /// If false the widget is "disabled": it ignores taps, the [TextFormField]'s + /// [decoration] is rendered in grey, + /// [decoration]'s [InputDecoration.counterText] is set to `""`, + /// and the drop down icon is hidden no matter [showDropdownIcon] value. + /// + /// If non-null this property overrides the [decoration]'s + /// [Decoration.enabled] property. + final bool enabled; + + /// The appearance of the keyboard. + /// + /// This setting is only honored on iOS devices. + /// + /// If unset, defaults to the brightness of [ThemeData.brightness]. + final Brightness? keyboardAppearance; + + /// Initial Value for the field. + /// This property can be used to pre-fill the field. + final String? initialValue; + + final String languageCode; + + /// 2 letter ISO Code or country dial code. + /// + /// ```dart + /// initialCountryCode: 'IN', // India + /// initialCountryCode: '+225', // Côte d'Ivoire + /// ``` + final String? initialCountryCode; + + /// List of Country to display see countries.dart for format + final List? countries; + + /// The decoration to show around the text field. + /// + /// By default, draws a horizontal line under the text field but can be + /// configured to show an icon, label, hint text, and error text. + /// + /// Specify null to remove the decoration entirely (including the + /// extra padding introduced by the decoration to save space for the labels). + final InputDecoration decoration; + + /// The style to use for the text being edited. + /// + /// This text style is also used as the base style for the [decoration]. + /// + /// If null, defaults to the `subtitle1` text style from the current [Theme]. + final TextStyle? style; + + /// Disable view Min/Max Length check + final bool disableLengthCheck; + + /// Won't work if [enabled] is set to `false`. + final bool showDropdownIcon; + + final BoxDecoration dropdownDecoration; + + /// The style use for the country dial code. + final TextStyle? dropdownTextStyle; + + /// {@macro flutter.widgets.editableText.inputFormatters} + final List? inputFormatters; + + /// The text that describes the search input field. + /// + /// When the input field is empty and unfocused, the label is displayed on top of the input field (i.e., at the same location on the screen where text may be entered in the input field). + /// When the input field receives focus (or if the field is non-empty), the label moves above (i.e., vertically adjacent to) the input field. + final String searchText; + + /// Position of an icon [leading, trailing] + final IconPosition dropdownIconPosition; + + /// Icon of the drop down button. + /// + /// Default is [Icon(Icons.arrow_drop_down)] + final Icon dropdownIcon; + + /// Whether this text field should focus itself if nothing else is already focused. + final bool autofocus; + + /// Autovalidate mode for text form field. + /// + /// If [AutovalidateMode.onUserInteraction], this FormField will only auto-validate after its content changes. + /// If [AutovalidateMode.always], it will auto-validate even without user interaction. + /// If [AutovalidateMode.disabled], auto-validation will be disabled. + /// + /// Defaults to [AutovalidateMode.onUserInteraction]. + final AutovalidateMode? autovalidateMode; + + /// Whether to show or hide country flag. + /// + /// Default value is `true`. + final bool showCountryFlag; + + /// Message to be displayed on autoValidate error + /// + /// Default value is `Invalid Mobile Number`. + final String? invalidNumberMessage; + + /// The color of the cursor. + final Color? cursorColor; + + /// How tall the cursor will be. + final double? cursorHeight; + + /// How rounded the corners of the cursor should be. + final Radius? cursorRadius; + + /// How thick the cursor will be. + final double cursorWidth; + + /// Whether to show cursor. + final bool? showCursor; + + /// The padding of the Flags Button. + /// + /// The amount of insets that are applied to the Flags Button. + /// + /// If unset, defaults to [EdgeInsets.zero]. + final EdgeInsetsGeometry flagsButtonPadding; + + /// The type of action button to use for the keyboard. + final TextInputAction? textInputAction; + + /// Optional set of styles to allow for customizing the country search + /// & pick dialog + final PickerDialogStyle? pickerDialogStyle; + + /// The margin of the country selector button. + /// + /// The amount of space to surround the country selector button. + /// + /// If unset, defaults to [EdgeInsets.zero]. + final EdgeInsets flagsButtonMargin; + + /// Enable the autofill hint for phone number. + final bool disableAutoFillHints; + + /// If null, default magnification configuration will be used. + final TextMagnifierConfiguration? magnifierConfiguration; + + const IntlPhoneField({ + Key? key, + this.formFieldKey, + this.initialCountryCode, + this.languageCode = 'en', + this.disableAutoFillHints = false, + this.obscureText = false, + this.textAlign = TextAlign.left, + this.textAlignVertical, + this.onTap, + this.readOnly = false, + this.initialValue, + this.keyboardType = TextInputType.phone, + this.controller, + this.focusNode, + this.decoration = const InputDecoration(), + this.style, + this.dropdownTextStyle, + this.onSubmitted, + this.validator, + this.onChanged, + this.countries, + this.onCountryChanged, + this.onSaved, + this.showDropdownIcon = true, + this.dropdownDecoration = const BoxDecoration(), + this.inputFormatters, + this.enabled = true, + this.keyboardAppearance, + @Deprecated('Use searchFieldInputDecoration of PickerDialogStyle instead') + this.searchText = 'Search country', + this.dropdownIconPosition = IconPosition.leading, + this.dropdownIcon = const Icon(Icons.arrow_drop_down), + this.autofocus = false, + this.textInputAction, + this.autovalidateMode = AutovalidateMode.onUserInteraction, + this.showCountryFlag = true, + this.cursorColor, + this.disableLengthCheck = false, + this.flagsButtonPadding = EdgeInsets.zero, + this.invalidNumberMessage = 'Invalid Mobile Number', + this.cursorHeight, + this.cursorRadius = Radius.zero, + this.cursorWidth = 2.0, + this.showCursor = true, + this.pickerDialogStyle, + this.flagsButtonMargin = EdgeInsets.zero, + this.magnifierConfiguration, + }) : super(key: key); + + @override + State createState() => _IntlPhoneFieldState(); +} + +class _IntlPhoneFieldState extends State { + late List _countryList; + late Country _selectedCountry; + late List filteredCountries; + late String number; + + String? validatorMessage; + + @override + void initState() { + super.initState(); + _countryList = widget.countries ?? countries; + filteredCountries = _countryList; + number = widget.initialValue ?? ''; + if (widget.initialCountryCode == null && number.startsWith('+')) { + number = number.substring(1); + // parse initial value + _selectedCountry = countries.firstWhere( + (country) => number.startsWith(country.fullCountryCode), + orElse: () => _countryList.first); + + // remove country code from the initial number value + number = number.replaceFirst( + RegExp("^${_selectedCountry.fullCountryCode}"), ""); + } else { + _selectedCountry = _countryList.firstWhere( + (item) => item.code == (widget.initialCountryCode ?? 'US'), + orElse: () => _countryList.first); + + // remove country code from the initial number value + if (number.startsWith('+')) { + number = number.replaceFirst( + RegExp("^\\+${_selectedCountry.fullCountryCode}"), ""); + } else { + number = number.replaceFirst( + RegExp("^${_selectedCountry.fullCountryCode}"), ""); + } + } + + if (widget.autovalidateMode == AutovalidateMode.always) { + final initialPhoneNumber = PhoneNumber( + countryISOCode: _selectedCountry.code, + countryCode: '+${_selectedCountry.dialCode}', + number: widget.initialValue ?? '', + ); + + final value = widget.validator?.call(initialPhoneNumber); + + if (value is String) { + validatorMessage = value; + } else { + (value as Future).then((msg) { + validatorMessage = msg; + }); + } + } + } + + Future _changeCountry() async { + filteredCountries = _countryList; + await showDialog( + context: context, + useRootNavigator: false, + builder: (context) => StatefulBuilder( + builder: (ctx, setState) => CountryPickerDialog( + languageCode: widget.languageCode.toLowerCase(), + style: widget.pickerDialogStyle, + filteredCountries: filteredCountries, + searchText: widget.searchText, + countryList: _countryList, + selectedCountry: _selectedCountry, + onCountryChanged: (Country country) { + _selectedCountry = country; + widget.onCountryChanged?.call(country); + setState(() {}); + }, + ), + ), + ); + if (mounted) setState(() {}); + } + + @override + Widget build(BuildContext context) { + return TextFormField( + key: widget.formFieldKey, + initialValue: (widget.controller == null) ? number : null, + autofillHints: widget.disableAutoFillHints + ? null + : [AutofillHints.telephoneNumberNational], + readOnly: widget.readOnly, + obscureText: widget.obscureText, + textAlign: widget.textAlign, + textAlignVertical: widget.textAlignVertical, + cursorColor: widget.cursorColor, + onTap: widget.onTap, + controller: widget.controller, + focusNode: widget.focusNode, + cursorHeight: widget.cursorHeight, + cursorRadius: widget.cursorRadius, + cursorWidth: widget.cursorWidth, + showCursor: widget.showCursor, + onFieldSubmitted: widget.onSubmitted, + magnifierConfiguration: widget.magnifierConfiguration, + decoration: widget.decoration.copyWith( + prefixIcon: _buildFlagsButton(), + counterText: !widget.enabled ? '' : null, + ), + style: widget.style, + onSaved: (value) { + widget.onSaved?.call( + PhoneNumber( + countryISOCode: _selectedCountry.code, + countryCode: + '+${_selectedCountry.dialCode}${_selectedCountry.regionCode}', + number: value!, + ), + ); + }, + onChanged: (value) async { + final phoneNumber = PhoneNumber( + countryISOCode: _selectedCountry.code, + countryCode: '+${_selectedCountry.fullCountryCode}', + number: value, + ); + + if (widget.autovalidateMode != AutovalidateMode.disabled) { + validatorMessage = await widget.validator?.call(phoneNumber); + } + + widget.onChanged?.call(phoneNumber); + }, + validator: (value) { + if (value == null || !isNumeric(value)) return validatorMessage; + if (!widget.disableLengthCheck) { + return value.length >= _selectedCountry.minLength && + value.length <= _selectedCountry.maxLength + ? null + : widget.invalidNumberMessage; + } + + return validatorMessage; + }, + maxLength: widget.disableLengthCheck ? null : _selectedCountry.maxLength, + keyboardType: widget.keyboardType, + inputFormatters: widget.inputFormatters, + enabled: widget.enabled, + keyboardAppearance: widget.keyboardAppearance, + autofocus: widget.autofocus, + textInputAction: widget.textInputAction, + autovalidateMode: widget.autovalidateMode, + ); + } + + Container _buildFlagsButton() { + return Container( + margin: widget.flagsButtonMargin, + child: DecoratedBox( + decoration: widget.dropdownDecoration, + child: InkWell( + borderRadius: widget.dropdownDecoration.borderRadius as BorderRadius?, + onTap: widget.enabled ? _changeCountry : null, + child: Padding( + padding: widget.flagsButtonPadding, + child: Row( + mainAxisSize: MainAxisSize.min, + mainAxisAlignment: MainAxisAlignment.center, + children: [ + const SizedBox( + width: 4, + ), + if (widget.enabled && + widget.showDropdownIcon && + widget.dropdownIconPosition == IconPosition.leading) ...[ + widget.dropdownIcon, + const SizedBox(width: 4), + ], + if (widget.showCountryFlag) ...[ + kIsWeb + ? Image.asset( + 'assets/flags/${_selectedCountry.code.toLowerCase()}.png', + package: 'intl_phone_field', + width: 32, + ) + : Text( + _selectedCountry.flag, + style: const TextStyle(fontSize: 18), + ), + const SizedBox(width: 8), + ], + FittedBox( + child: Text( + '+${_selectedCountry.dialCode}', + style: widget.dropdownTextStyle, + ), + ), + if (widget.enabled && + widget.showDropdownIcon && + widget.dropdownIconPosition == IconPosition.trailing) ...[ + const SizedBox(width: 4), + widget.dropdownIcon, + ], + const SizedBox(width: 8), + ], + ), + ), + ), + ), + ); + } +} + +enum IconPosition { + leading, + trailing, +} diff --git a/siro_driver/lib/controller/local/phone_intel/phone_number.dart b/siro_driver/lib/controller/local/phone_intel/phone_number.dart new file mode 100644 index 0000000..912cb07 --- /dev/null +++ b/siro_driver/lib/controller/local/phone_intel/phone_number.dart @@ -0,0 +1,79 @@ +import 'countries.dart'; + +class NumberTooLongException implements Exception {} + +class NumberTooShortException implements Exception {} + +class InvalidCharactersException implements Exception {} + +class PhoneNumber { + String countryISOCode; + String countryCode; + String number; + + PhoneNumber({ + required this.countryISOCode, + required this.countryCode, + required this.number, + }); + + factory PhoneNumber.fromCompleteNumber({required String completeNumber}) { + if (completeNumber == "") { + return PhoneNumber(countryISOCode: "", countryCode: "", number: ""); + } + + try { + Country country = getCountry(completeNumber); + String number; + if (completeNumber.startsWith('+')) { + number = completeNumber.substring(1 + country.dialCode.length + country.regionCode.length); + } else { + number = completeNumber.substring(country.dialCode.length + country.regionCode.length); + } + return PhoneNumber( + countryISOCode: country.code, countryCode: country.dialCode + country.regionCode, number: number); + } on InvalidCharactersException { + rethrow; + // ignore: unused_catch_clause + } on Exception catch (e) { + return PhoneNumber(countryISOCode: "", countryCode: "", number: ""); + } + } + + bool isValidNumber() { + Country country = getCountry(completeNumber); + if (number.length < country.minLength) { + throw NumberTooShortException(); + } + + if (number.length > country.maxLength) { + throw NumberTooLongException(); + } + return true; + } + + String get completeNumber { + return countryCode + number; + } + + static Country getCountry(String phoneNumber) { + if (phoneNumber == "") { + throw NumberTooShortException(); + } + + final validPhoneNumber = RegExp(r'^[+0-9]*[0-9]*$'); + + if (!validPhoneNumber.hasMatch(phoneNumber)) { + throw InvalidCharactersException(); + } + + if (phoneNumber.startsWith('+')) { + return countries + .firstWhere((country) => phoneNumber.substring(1).startsWith(country.dialCode + country.regionCode)); + } + return countries.firstWhere((country) => phoneNumber.startsWith(country.dialCode + country.regionCode)); + } + + @override + String toString() => 'PhoneNumber(countryISOCode: $countryISOCode, countryCode: $countryCode, number: $number)'; +} diff --git a/siro_driver/lib/controller/local/translations.dart b/siro_driver/lib/controller/local/translations.dart new file mode 100755 index 0000000..addc89d --- /dev/null +++ b/siro_driver/lib/controller/local/translations.dart @@ -0,0 +1,2641 @@ +import 'package:get/get.dart'; + +class MyTranslation extends Translations { + @override + Map> get keys => { + "ar": { + "\$error": "صار خطأ", + "\${AppInformation.appName} Wallet": + "محفظة \${AppInformation.appName}", + ". I am at least 18 years old.": ". عمري 18 سنة أو أكثر.", + "I am currently located at": "أنا موجود حالياً بـ", + "I am using": "أنا عم بستخدم", + "If you need to reach me, please contact the driver directly at": + "إذا بدك تتواصل معي، اتصل بالسائق مباشرة على", + "Intaleq Wallet": "محفظة انطلق", + "KM": "كم", + "Minutes": "دقايق", + "You haven't moved sufficiently!": 'لم تتحرك بالقدر الكافي', + "Next as Cash !": "الرحلة الجاية كاش!", + "You Earn today is": "أرباحك اليوم هي", + "You Have in": "عندك بـ", + "and acknowledge our Privacy Policy.": + "وبوافق على سياسة الخصوصية بتاعتنا.", + "and acknowledge the": "وبوافق على", + "as the driver.": "كسائق.", + "below, I confirm that I have read and agree to the": + "تحت، بأؤكد إني قرأت ووافقت على", + "below, I have reviewed and agree to the Terms of Use and acknowledge the": + "تحت، راجعت ووافقت على شروط الاستخدام وبوافق على", + "below, I have reviewed and agree to the Terms of Use and acknowledge the Privacy Notice. I am at least 18 years of age.": + "تحت، راجعت ووافقت على شروط الاستخدام وبوافق على سياسة الخصوصية. عمري 18 سنة أو أكثر.", + "in your wallet": "بمحفظتك", + "is calling you": "عم يتصل فيك", + "is ON for this month": "مفعّلة هالشهر", + "tips\nTotal is": "الإكراميات\nالإجمالي هو", + "to arrive you.": "ليوصل لعندك.", + "to receive ride requests even when the app is in the background.": + "عشان تستلم طلبات الرحلات حتى لو التطبيق شغّال بالخلفية.", + "to ride with": "لترحل مع", + "with license plate": "لوحة أرقام", + "\$pricePoint": "\$pricePoint", + "\$title \$subtitle": "\$title \$subtitle", + ")[1]}": ")[1]}", + "*Intaleq APP CODE*": "*كود تطبيق انطلق*", + "*Intaleq DRIVER CODE*": "*كود سائق انطلق*", + "--": "--", + ". I am at least 18 years of age.": ". عمري 18 سنة أو أكثر.", + ". The app will connect you with a nearby driver.": + ". التطبيق رح يربطك بسائق قريب منك.", + "1. Describe Your Issue": "1. صف مشكلتك", + "1. Select Ride": "1. اختر المشوار", + "10 and get 4% discount": "10 واحصل على خصم 4%", + "100 and get 11% discount": "100 واحصل على خصم 11%", + "1999": "1999", + "2. Attach Recorded Audio": "2. أرفق التسجيل الصوتي", + "2. Attach Recorded Audio (Optional)": + "2. أرفق التسجيل الصوتي (اختياري)", + "2. Describe Your Issue": "2. اكتب وصف للمشكلة", + "20 and get 6% discount": "20 واحصل على خصم 6%", + "27\\": "27\\", + "3. Attach Recorded Audio (Optional)": + "3. أرفق التسجيل الصوتي (اختياري)", + "3. Review Details & Response": "3. راجع التفاصيل والرد", + "300 LE": "300 ل.م", + "3000 LE": "3000 ل.م", + "4. Review Details & Response": "4. راجع التفاصيل والرد", + "40 and get 8% discount": "40 واحصل على خصم 8%", + "5 digit": "5 أرقام", + "<< BACK": "<< رجوع", + "A new version of the app is available. Please update to the latest version.": + "في نسخة جديدة من التطبيق. تفضل حدّث لآخر إصدار.", + "A promotion record for this driver already exists for today.": + "في سجل ترويجي لهالسائق من قبل بهاليوم.", + "A trip with a prior reservation, allowing you to choose the best captains and cars.": + "رحلة محجوزة مسبقاً، بتقدر تختار فيها أحسن السواقين والسيارات.", + "AI Page": "صفحة الذكاء الاصطناعي", + "AI failed to extract info": + "الذكاء الاصطناعي ما قدر يستخرج المعلومات", + "ATTIJARIWAFA BANK Egypt": "بنك التيجاري الوفا مصر", + "About Us": "من نحن", + "Abu Dhabi Commercial Bank – Egypt": "بنك أبوظبي التجاري – مصر", + "Abu Dhabi Islamic Bank – Egypt": "بنك أبوظبي الإسلامي – مصر", + "Accept": "قبول", + "Accept Order": "اقبل الطلب", + "Accept Ride": "اقبل الرحلة", + "Accepted Ride": "الرحلة انقبلت", + "Accepted your order": "قبل طلبك", + "Account": "الحساب", + "Account Updated": "تم تحديث الحساب", + "Active Duration": "مدة النشاط", + "Active Duration:": "مدة النشاط:", + "Active Ride": "الرحلة النشطة", + "Active Users": "المستخدمين النشطين", + "Active ride in progress. Leaving might stop tracking. Exit?": + "في مشوار شغال هلق. الخروج ممكن يوقف التتبع. بدك تطلع؟", + "Activities": "النشاطات", + "Add Card": "إضافة بطاقة", + "Add Credit Card": "إضافة بطاقة ائتمان", + "Add Home": "ضيف المنزل", + "Add Location": "ضيف موقع", + "Add Location 1": "ضيف موقع 1", + "Add Location 2": "ضيف موقع 2", + "Add Location 3": "ضيف موقع 3", + "Add Location 4": "ضيف موقع 4", + "Add Payment Method": "إضافة طريقة دفع", + "Add Phone": "إضافة هاتف", + "Add Promo": "ضيف كود ترويجي", + "Add Question": "إضافة سؤال", + "Add SOS Phone": "ضيف رقم طوارئ", + "Add Stops": "إضافة محطات", + "Add Work": "ضيف الشغل", + "Add a Stop": "ضيف محطة", + "Add a comment (optional)": "إضافة تعليق (اختياري)", + "Add bank Account": "إضافة حساب بنكي", + "Add criminal page": "إضافة صحيفة الحالة الجنائية", + "Add funds using our secure methods": "ضيف رصيد بطرقنا الآمنة", + "Add new car": "إضافة سيارة جديدة", + "Add to Passenger Wallet": "إضافة لمحفة الراكب", + "Add wallet phone you use": "إضافة رقم المحفظة اللي عم تستخدمه", + "Address": "العنوان", + "Address:": "العنوان:", + "Admin DashBoard": "لوحة تحكم المسؤول", + "Affordable for Everyone": "أسعار مناسبة للكل", + "After this period": "بعد هالفترة", + "Afternoon Promo": "عرض الظهيرة", + "Afternoon Promo Rides": "رحلات عرض الظهيرة", + "Age": "العمر", + "Age is": "العمر هو", + "Agricultural Bank of Egypt": "البنك الزراعي المصري", + "Alert": "تنبيه", + "Alerts": "التنبيهات", + "Alex Bank Egypt": "بنك الإسكندرية مصر", + "Allow Location Access": "اسمح بالوصول للموقع", + "Allow overlay permission": "اسمح بصلاحية العرض فوق التطبيقات", + "Allowing location access will help us display orders near you. Please enable it now.": + "السماح بالوصول للموقع رح يساعدنا نعرض الطلبات القريبة منك. تفضل فعّله هلق.", + "Amount": "المبلغ", + "An OTP has been sent to your number.": "تم إرسال رمز التحقق لرقمك.", + "An application error occurred during upload.": + "صار خطأ بالتطبيق وقت الرفع.", + "An application error occurred.": "صار خطأ بالتطبيق.", + "An error occurred": "صار خطأ", + "An error occurred during contact sync: \$e": + "صار خطأ بمزامنة جهات الاتصال: \$e", + "An error occurred during the payment process.": + "صار خطأ بعملية الدفع.", + "An error occurred while loading contacts: \$e": + "صار خطأ وقت تحميل جهات الاتصال: \$e", + "An error occurred while picking a contact": + "صار خطأ وقت اختيار جهة اتصال", + "An error occurred while picking contacts:": + "صار خطأ وقت اختيار جهات الاتصال:", + "An error occurred while saving driver data": + "صار خطأ وقت حفظ بيانات السائق", + "An unexpected error occurred. Please try again.": + "صار خطأ غير متوقع. جرب مرة تانية.", + "An unexpected error occurred:": "صار خطأ غير متوقع:", + "An unknown server error occurred": "صار خطأ غير معروف بالسيرفر.", + "Any comments about the passenger?": "في أي تعليق على الراكب؟", + "App Dark Mode": "الوضع الليلي للتطبيق", + "App Preferences": "تفضيلات التطبيق", + "App with Passenger": "التطبيق مع الراكب", + "Applied": "تم التطبيق", + "Apply": "تطبيق", + "Apply Order": "تطبيق الطلب", + "Apply Promo Code": "طبّق كود الخصم", + "Approaching your area. Should be there in 3 minutes.": + "عم يقرب من منطقتك. رح يوصل خلال 3 دقايق.", + "Approve Driver Documents": "الموافقة على وثائق السائق", + "Arab African International Bank": "العربي الأفريقي الدولي", + "Arab Bank PLC": "البنك العربي", + "Arab Banking Corporation - Egypt S.A.E": + "الشركة العربية المصرفية - مصر", + "Arab International Bank": "البنك العربي الدولي", + "Arab Investment Bank": "بنك الاستثمار العربي", + "Are You sure to ride to": "متأكد إنك بدك تروح لـ", + "Are you Sure to LogOut?": "متأكد إنك بدك تطلع من الحساب؟", + "Are you sure to cancel?": "متأكد إنك بدك تلغي؟", + "Are you sure to delete recorded files": + "متأكد إنك بدك تحذف الملفات المسجلة؟", + "Are you sure to delete this location?": + "متأكد إنك بدك تحذف هالموقع؟", + "Are you sure to delete your account?": "متأكد إنك بدك تحذف حسابك؟", + "Are you sure to exit ride ?": "متأكد إنك بدك تخرج من الرحلة؟", + "Are you sure to exit ride?": "متأكد إنك بدك تخرج من الرحلة؟", + "Are you sure to make this car as default": + "متأكد إنك بدك تخلي هالسيارة الافتراضية؟", + "Are you sure you want to cancel and collect the fee?": + "متأكد إنك بدك تلغي وتستلم الرسوم؟", + "Are you sure you want to cancel this trip?": + "متأكد إنك بدك تلغي هالرحلة؟", + "Are you sure you want to logout?": "متأكد إنك بدك تطلع من الحساب؟", + "Are you sure?": "متأكد؟", + "Are you sure? This action cannot be undone.": + "متأكد؟ هالعملية ما فيها رجعة.", + "Are you want to change": "بدك تغير", + "Are you want to go this site": "بدك تروح لهالموقع؟", + "Are you want to go to this site": "بدك تروح لهالموقع؟", + "Are you want to wait drivers to accept your order": + "بدك تستنى السواقين يقبلوا طلبك؟", + "Arrival time": "وقت الوصول", + "Associate Degree": "شهادة الدبلوم المشارك", + "Attach this audio file?": "ترفق هالملف الصوتي؟", + "Attention": "انتباه", + "Audio file not attached": "ما في ملف صوتي مرفق", + "Audio uploaded successfully.": "تم رفع الملف الصوتي بنجاح.", + "Authentication failed": "فشل المصادقة", + "Available Rides": "الرحلات المتاحة", + "Available for rides": "متاح للرحلات", + "Average of Hours of": "متوسط ساعات", + "Awaiting response...": "عم نستنى الرد...", + "Awfar Car": "سيارة أوفر", + "Mon": "الاثنين", + "Tue": "الثلاثاء", + "Wed": "الأربعاء", + "Thu": "الخميس", + "Fri": "الجمعة", + "Sat": "السبت", + "Sun": "الأحد", + "The price must be over than": "السعر لازم يكون أكثر من", + "Driver Level": "مستوى السائق", + "Next Level:": "المستوى التالي:", + "Points": "نقطة", + "Maximum Level Reached!": "وصلت لأعلى مستوى!", + "Basic features": "ميزات أساسية", + "Standard support": "دعم قياسي", + "Priority medium": "أولوية متوسطة", + "Silver badge": "وسام فضي", + "-1% commission": "خصم 1% من العمولة", + "High priority": "أولوية عالية", + "Gold badge": "وسام ذهبي", + "-2% commission": "خصم 2% من العمولة", + "VIP first": "أولوية VIP", + "Diamond badge": "وسام ألماسي", + "-5% commission": "خصم 5% من العمولة", + "Priority support": "دعم فني ذو أولوية", + "Daily Goal": "الهدف اليومي", + "Edit": "تعديل", + "Set Goal": "تحديد هدف", + "Goal Achieved!": "تم تحقيق الهدف!", + "Remaining:": "المتبقي:", + "Set Daily Goal": "تحديد الهدف اليومي", + "How much do you want to earn today?": "كم تريد أن تربح اليوم؟", + "Save": "حفظ", + "Cancel": "إلغاء", + "Today Overview": "نظرة عامة على اليوم", + "Online Duration": "مدة التواجد", + "Refused": "المرفوضة", + "Score": "التقييم", + "Max Speed": "أعلى سرعة", + "Hard Brakes": "الفرامل المفاجئة", + "Driving Behavior": "سلوك القيادة", + "Excellent": "ممتاز", + "Good": "جيد", + "Needs Improvement": "يحتاج تحسين", + "Achievements": "الإنجازات", + "Day Streak": "سلسلة الأيام", + "Rating": "التقييم", + "Referrals": "الإحالات", + "First Trip": "أول رحلة", + "Complete your first trip": "أكمل أول رحلة لك", + "Road Warrior": "محارب الطريق", + "Complete 50 trips": "أكمل 50 رحلة", + "Century Rider": "سائق المئة", + "Complete 100 trips": "أكمل 100 رحلة", + "Road Legend": "أسطورة الطريق", + "Complete 500 trips": "أكمل 500 رحلة", + "Five Star Driver": "سائق 5 نجوم", + "Maintain 5.0 rating": "حافظ على تقييم 5.0", + "Weekly Streak": "سلسلة أسبوعية", + "Work 7 consecutive days": "اعمل 7 أيام متتالية", + "Monthly Streak": "سلسلة شهرية", + "Work 30 consecutive days": "اعمل 30 يوم متتالي", + "Social Butterfly": "الفراشة الاجتماعية", + "Refer 5 drivers": "ادعُ 5 سائقين", + "Weekly Earnings": "الأرباح الأسبوعية", + "Monthly Report": "التقرير الشهري", + "Best Day": "أفضل يوم", + "No data yet": "لا توجد بيانات بعد", + "h": "ساعة", + "Trip": "رحلة", + "Ride": "المشوار", + "Rides": "رحلات", + "Hours": "ساعات", + "Total Trips": "إجمالي الرحلات", + "Total Earnings": "إجمالي الأرباح", + "Back to other sign-in options": + "الرجوع لخيارات تسجيل الدخول التانية", + "Bahrain": "البحرين", + "Balance": "الرصيد", + "Balance limit exceeded": "تم تجاوز حد الرصيد", + "Balance not enough": "الرصيد ما يكفي", + "Balance:": "الرصيد:", + "Bank Account": "حساب بنكي", + "Bank account added successfully": "تمت إضافة الحساب البنكي بنجاح", + "Banque Du Caire": "بنك القاهرة", + "Banque Misr": "بنك مصر", + "Be Slowly": "خفف السرعة", + "Be sure for take accurate images please": + "تأكد إنك تلتقط صور واضحة من فضلك", + "Be sure for take accurate images please\nYou have": + "تأكد إنك تلتقط صور واضحة من فضلك\nعندك", + "Be sure to use it quickly! This code expires at": + "تأكد تستخدمه بسرعة! هالكود بينتهي بـ", + "Because we are near, you have the flexibility to choose the ride that works best for you.": + "لأننا قريبين، عندك حرية تختار الرحلة اللي أنسب لك.", + "Before we start, please review our terms.": + "قبل ما نبدأ، تفضل راجع شروطنا.", + "Behavior Page": "صفحة السلوك", + "Behavior Score": "درجة السلوك", + "Best choice for a comfortable car with a flexible route and stop points. This airport offers visa entry at this price.": + "أحسن خيار لسيارة مريحة بطريق مرن ومحطات توقف. هالمطار بيوفر تأشيرة دخول بهالسعر.", + "Best choice for cities": "أحسن خيار للمدن", + "Best choice for comfort car and flexible route and stops point": + "أحسن خيار لسيارة مريحة وطريق مرن ومحطات توقف", + "Biometric Authentication": "المصادقة البيومترية", + "Birth Date": "تاريخ الميلاد", + "Birth year must be 4 digits": "سنة الميلاد لازم تكون 4 أرقام", + "Birthdate Mismatch": "عدم تطابق تاريخ الميلاد", + "Birthdate on ID front and back does not match.": + "تاريخ الميلاد بالهوية من الأمام والخلف ما بيتطابق.", + "Blom Bank": "بنك بلوم", + "Bonus gift": "هدية بونص", + "BookingFee": "رسوم الحجز", + "Bottom Bar Example": "مثال الشريط السفلي", + "But you have a negative salary of": "بس عندك راتب سلبي بقيمة", + "CODE": "الكود", + "Calculating...": "عم نحسب...", + "Calling non-Syrian numbers is not supported": + "الاتصال بالأرقام غير السورية غير مدعوم", + "Call": "اتصل", + "Call Connected": "تم فتح الاتصال", + "Call Driver": "اتصل بالسائق", + "Call End": "انتهت المكالمة", + "Call Income": "مكالمة واردة", + "Call Income from Driver": "مكالمة واردة من السائق", + "Call Income from Passenger": "مكالمة واردة من الراكب", + "Call Left": "مكالمة فائتة", + "Call Page": "صفحة الاتصال", + "Call Passenger": "اتصل بالراكب", + "Call Support": "اتصل بالدعم", + "Calling": "عم نتصل بـ", + "Camera Access Denied.": "تم رفض الوصول للكاميرا.", + "Camera not initialized yet": "الكاميرا ما تجهزت بعد", + "Camera not initilaized yet": "الكاميرا ما تجهزت بعد", + "Can I cancel my ride?": "مقدر ألغي رحلتي؟", + "Can we know why you want to cancel Ride ?": + "ممكن نعرف ليش بدك تلغي الرحلة؟", + "Cancel": "إلغاء", + "Cancel & Collect Fee": "إلغاء واستلام الرسوم", + "Cancel Ride": "إلغاء الرحلة", + "Cancel Search": "إلغاء البحث", + "Cancel Trip": "إلغاء الرحلة", + "Cancel Trip from driver": "إلغاء الرحلة من السائق", + "Cancel Trip?": "إلغاء الرحلة؟", + "Canceled": "ملغية", + "Canceled Orders": "الطلبات الملغاة", + "Cannot apply further discounts.": "ما في تطبيق خصومات إضافية.", + "Captain": "الكابتن", + "Capture an Image of Your Criminal Record": + "التقط صورة لصحيفة الحالة الجنائية", + "Capture an Image of Your Driver License": "التقط صورة لرخصة السائق", + "Capture an Image of Your Driver’s License": + "التقط صورة لرخصة السائق", + "Capture an Image of Your ID Document Back": + "التقط صورة للوجه الخلفي للهوية", + "Capture an Image of Your ID Document front": + "التقط صورة للوجه الأمامي للهوية", + "Capture an Image of Your car license back": + "التقط صورة للوجه الخلفي لرخصة السيارة", + "Capture an Image of Your car license front": + "التقط صورة للوجه الأمامي لرخصة السيارة", + "Car": "سيارة", + "Car Color": "لون السيارة", + "Car Color (Hex)": "لون السيارة (كود)", + "Car Color (Name)": "لون السيارة (اسم)", + "Car Color:": "لون السيارة:", + "Car Details": "تفاصيل السيارة", + "Car Expire": "انتهاء صلاحية السيارة", + "Car Kind": "نوع السيارة", + "Car License Card": "رخصة السيارة", + "Car Make (e.g., Toyota)": "ماركة السيارة (مثال: تويوتا)", + "Car Make:": "ماركة السيارة:", + "Car Model (e.g., Corolla)": "موديل السيارة (مثال: كورولا)", + "Car Model:": "موديل السيارة:", + "Car Plate": "لوحة السيارة", + "Car Plate Number": "رقم لوحة السيارة", + "Car Plate is": "لوحة السيارة هي", + "Car Plate:": "لوحة السيارة:", + "Car Registration (Back)": "رخصة السيارة (خلفي)", + "Car Registration (Front)": "رخصة السيارة (أمامي)", + "Car Type": "نوع السيارة", + "Card Number": "رقم البطاقة", + "CardID": "رقم البطاقة", + "Cash": "كاش", + "Cash Out": "سحب الرصيد", + "Central Bank Of Egypt": "البنك المركزي المصري", + "Change Country": "تغيير البلد", + "Change Home location?": "تغيير موقع المنزل؟", + "Change Ride": "تغيير الرحلة", + "Change Route": "تغيير الطريق", + "Change Work location?": "تغيير موقع العمل؟", + "Change the app language": "تغيير لغة التطبيق", + "Charge your Account": "اشحن حسابك", + "Charge your account.": "اشحن حسابك.", + "Chassis": "الشاسيه", + "Check back later for new offers!": "رجع لاحقاً لعروض جديدة!", + "Checking for updates...": "عم نتحقق من التحديثات...", + "Choose Language": "اختر اللغة", + "Choose a contact option": "اختر خيار جهة اتصال", + "Choose between those Type Cars": "اختر بين هالأنواع من السيارات", + "Choose from Map": "اختر من الخريطة", + "Choose from contact": "اختر من جهات الاتصال", + "Choose the trip option that perfectly suits your needs and preferences.": + "اختر خيار الرحلة اللي بيناسب احتياجاتك وتفضيلاتك تماماً.", + "Choose who this order is for": "اختر هالطلب لمين", + "Choose your ride": "اختر رحلتك", + "Citi Bank N.A. Egypt": "سيتي بنك مصر", + "City": "المدينة", + "Claim your 20 LE gift for inviting": + "استلم هديتك 20 ل.م عشان الدعوة", + "Click here point": "اضغط هون", + "Click here to Show it in Map": "اضغط هون لعرضها بالخريطة", + "Close": "إغلاق", + "Closest & Cheapest": "الأقرب والأرخص", + "Closest to You": "الأقرب إليك", + "Code": "الكود", + "Code approved": "تمت الموافقة على الكود", + "Code not approved": "ما انقبل الكود", + "Collect Cash": "استلم كاش", + "Collect Payment": "استلم الدفع", + "Color": "اللون", + "Color is": "اللون هو", + "Comfort": "كومفورت", + "Comfort choice": "خيار مريح", + "Comfort ❄️": "كومفورت ❄️", + "Comfort: For cars newer than 2017 with air conditioning.": + "كومفورت: للسيارات موديل 2017 وما فوق مع تكييف.", + "Coming Soon": "قريباً", + "Commercial International Bank - Egypt S.A.E": + "البنك التجاري الدولي - مصر", + "Communication": "التواصل", + "Compensation Received": "تم استلام التعويض", + "Complaint": "شكوى", + "Complaint cannot be filed for this ride. It may not have been completed or started.": + "ما في تقديم شكوى لهالرحلة. ممكن ما تكون خلصت أو ما بلشت.", + "Complaint data saved successfully": "تم حفظ بيانات الشكوى بنجاح", + "Complete Payment": "إتمام الدفع", + "Completed": "مكتملة", + "Confirm": "تأكيد", + "Confirm & Find a Ride": "تأكيد والبحث عن رحلة", + "Confirm Attachment": "تأكيد المرفق", + "Confirm Cancellation": "تأكيد الإلغاء", + "Confirm Payment": "تأكيد الدفع", + "Confirm Pick-up Location": "تأكيد موقع الالتقاط", + "Confirm Selection": "تأكيد الاختيار", + "Confirm Trip": "تأكيد الرحلة", + "Confirm your Email": "تأكيد بريدك الإلكتروني", + "Confirmation": "تأكيد", + "Connected": "متصل", + "Connecting...": "عم يتم الاتصال...", + "Contact Options": "خيارات التواصل", + "Contact Support": "تواصل مع الدعم", + "Contact Support to Recharge": "تواصل مع الدعم للشحن", + "Contact Us": "تواصل معنا", + "Contact permission is required to pick a contact": + "مطلوب صلاحية جهات الاتصال عشان تختار جهة اتصال", + "Contact permission is required to pick contacts": + "مطلوب صلاحية جهات الاتصال عشان تختار جهات اتصال", + "Contact us for any questions on your order.": + "تواصل معنا لأي سؤال عن طلبك.", + "Contacts Loaded": "تم تحميل جهات الاتصال", + "Contacts sync completed successfully!": + "تمت مزامنة جهات الاتصال بنجاح!", + "Continue": "متابعة", + "Continue Ride": "متابعة الرحلة", + "Continue straight": "كمل على خط مستقيم", + "Copy": "نسخ", + "Copy Code": "نسخ الكود", + "Copy this Promo to use it in your Ride!": + "انسخ هالعرض عشان تستخدمه برحلتك!", + "Cost": "التكلفة", + "Cost Duration": "مدة التكلفة", + "Cost Of Trip IS": "تكلفة الرحلة هي", + "Could not load trip details.": "ما انقدرنا نحمّل تفاصيل الرحلة.", + "Counts of Hours on days": "عدد الساعات بالأيام", + "Counts of budgets on days": "عدد الميزانيات بالأيام", + "Counts of rides on days": "عدد الرحلات بالأيام", + "Create Account": "إنشاء حساب", + "Create Account with Email": "إنشاء حساب بالبريد الإلكتروني", + "Create Driver Account": "إنشاء حساب سائق", + "Create Wallet to receive your money": "أنشئ محفظة عشان تستلم فلوسك", + "Create new Account": "إنشاء حساب جديد", + "Credit": "رصيد", + "Credit Agricole Egypt S.A.E": "كريدي أجريكول مصر", + "Credit card is": "بطاقة الائتمان هي", + "Criminal Document": "الوثيقة الجنائية", + "Criminal Document Required": "مطلوب وثيقة جنائية", + "Criminal Record": "صحيفة الحالة الجنائية", + "Cropper": "أداة القص", + "Current Balance": "الرصيد الحالي", + "Current Location": "الموقع الحالي", + "Customer MSISDN doesn’t have customer wallet": + "رقم هاتف العميل ما فيه محفظة عميل", + "Customer not found": "ما لقينا العميل", + "Customer phone is not active": "هاتف العميل مش شغال", + "Decline": "رفض", + "DISCOUNT": "خصم", + "DRIVER123": "DRIVER123", + "Date": "التاريخ", + "Date and Time Picker": "اختيار التاريخ والوقت", + "Date of Birth": "تاريخ الميلاد", + "Date of Birth is": "تاريخ الميلاد هو", + "Date of Birth:": "تاريخ الميلاد:", + "Days": "الأيام", + "Dear ,\n🚀 I have just started an exciting trip and I would like to share the details of my journey and my current location with you in real-time! Please download the Intaleq app. It will allow you to view my trip details and my latest location.\n👉 Download link:\nAndroid [https://play.google.com/store/apps/details?id=com.mobileapp.store.ride]\niOS [https://getapp.cc/app/6458734951]\nI look forward to keeping you close during my adventure!\nIntaleq ,": + "عزيزي/عزيزتي،\n🚀 بلشت رحلة جديدة وحابب/حابّة أشاركك التفاصيل وموقعي الحالي معك مباشرة! تفضل حمّل تطبيق انطلق... إلخ", + "Debit": "خصم", + "Delete": "حذف", + "Delete My Account": "احذف حسابي", + "Delete Permanently": "حذف نهائي", + "Deleted": "محذوف", + "Delivery": "توصيل", + "Destination": "الوجهة", + "Destination selected": "تم اختيار الوجهة", + "Detect Your Face": "اكتشاف وجهك", + "Device Change Detected": "تم اكتشاف تغيير الجهاز", + "Diesel": "ديزل", + "Directions": "الاتجاهات", + "Displacement": "الإزاحة", + "Distance": "المسافة", + "Distance To Passenger is": "المسافة للراكب هي", + "Distance from Passenger to destination is": + "المسافة من الراكب للوجهة هي", + "Distance is": "المسافة هي", + "Distance of the Ride is": "مسافة الرحلة هي", + "Do you have a disease for a long time?": "عندك مرض مزمن من زمان؟", + "Do you have an invitation code from another driver?": + "عندك كود دعوة من سائق تاني؟", + "Do you want to change Home location": "بدك تغير موقع المنزل؟", + "Do you want to change Work location": "بدك تغير موقع العمل؟", + "Do you want to collect your earnings?": "بدك تجمع أرباحك؟", + "Do you want to pay Tips for this Driver": + "بدك تدفع إكرامية لهالسائق؟", + "Docs": "المستندات", + "Doctoral Degree": "دكتوراه", + "Document Number:": "رقم الوثيقة:", + "Documents check": "فحص المستندات", + "Done": "تم", + "Don’t forget your personal belongings.": "متنساش حاجاتك الشخصية.", + "Download the Intaleq Driver app now and earn rewards!": + "حمّل تطبيق سائق انطلق هلق واكسب مكافآت!", + "Download the Intaleq app now and enjoy your ride!": + "حمّل تطبيق انطلق هلق واستمتع برحلتك!", + "Download the app now:": "حمّل التطبيق هلق:", + "Drawing route on map...": "عم نرسم الطريق على الخريطة...", + "Driver": "السائق", + "Driver Accepted Request": "السائق قبل الطلب", + "Driver Accepted the Ride for You": "السائق قبل الرحلة لك", + "Driver Agreement": "اتفاقية السائق", + "Driver Applied the Ride for You": "السائق قدم على الرحلة لك", + "Driver Balance": "رصيد السائق", + "Driver Behavior": "سلوك السائق", + "Driver Cancel Your Trip": "السائق ألغى رحلتك", + "Driver Cancelled Your Trip": "السائق ألغى رحلتك", + "Driver Car Plate": "لوحة سيارة السائق", + "Driver Finish Trip": "السائق أنهى الرحلة", + "Driver Is Going To Passenger": "السائق بيوصل للراكب", + "Driver License (Back)": "رخصة السائق (خلفي)", + "Driver License (Front)": "رخصة السائق (أمامي)", + "Driver List": "قائمة السائقين", + "Driver Login": "تسجيل دخول السائق", + "Driver Message": "رسالة السائق", + "Driver Name": "اسم السائق", + "Driver Name:": "اسم السائق:", + "Driver Phone:": "رقم السائق:", + "Driver Portal": "بوابة السائق", + "Driver Registration": "تسجيل السائق", + "Driver Registration & Requirements": "تسجيل السائق والمتطلبات", + "Driver Wallet": "محفظة السائق", + "Driver already has 2 trips within the specified period.": + "عند السائق رحلتين بهالفترة المحددة من قبل.", + "Driver is on the way": "السائق عم ييجي", + "Driver is waiting": "السائق عم يستنى", + "Driver is waiting at pickup.": "السائق عم يستنى بمكان الالتقاط.", + "Driver joined the channel": "السائق دخل القناة", + "Driver left the channel": "السائق خرج من القناة", + "Driver phone": "رقم السائق", + "Drivers": "السواقين", + "Drivers License Class": "فئة رخصة السائق", + "Drivers License Class:": "فئة رخصة السائق:", + "Drivers received orders": "السواقين استلموا طلبات", + "Duration": "المدة", + "Duration To Passenger is": "الوقت للراكب هو", + "Duration is": "المدة هي", + "Duration of Trip is": "مدة الرحلة هي", + "Duration of the Ride is": "مدة الرحلة هي", + "E-mail validé.\\": "تم التحقق من البريد الإلكتروني.\\", + "Earnings": "الأرباح", + "Earnings & Distance": "الأرباح والمسافة", + "Edit Profile": "تعديل الملف الشخصي", + "Edit Your data": "عدّل بياناتك", + "Education": "التعليم", + "Egypt": "مصر", + "Egypt Post": "البريد المصري", + "Egyptian Arab Land Bank": "البنك العقاري المصري العربي", + "Egyptian Gulf Bank": "البنك المصري الخليجي", + "Electric": "كهربائي", + "Email": "البريد الإلكتروني", + "Email Us": "راسلنا", + "Email Wrong": "البريد خاطئ", + "Email is": "البريد هو", + "Email must be correct.": "البريد لازم يكون صحيح.", + "Email you inserted is Wrong.": "البريد اللي أدخلته غلط.", + "Emergency Contact": "جهة اتصال طوارئ", + "Emergency Number": "رقم الطوارئ", + "Emirates National Bank of Dubai": "بنك الإمارات الوطني دبي", + "Employment Type": "نوع التوظيف", + "Enable Location": "تفعيل الموقع", + "Enable Location Access": "تفعيل الوصول للموقع", + "Enable Location Permission": "تفعيل صلاحية الموقع", + "End": "إنهاء", + "End Ride": "أنهي الرحلة", + "End Trip": "أنهي الرحلة", + "Enjoy a safe and comfortable ride.": "استمتع برحلة آمنة ومريحة.", + "Enjoy competitive prices across all trip options, making travel accessible.": + "استمتع بأسعار منافسة بكل خيارات الرحلات، عشان السفر يكون بمتناول إيدك.", + "Ensure the passenger is in the car.": "تأكد إن الراكب دخل السيارة.", + "Enter Amount Paid": "أدخل المبلغ المدفوع", + "Enter Health Insurance Provider": "أدخل مزود التأمين الصحي", + "Enter Your First Name": "أدخل اسمك الأول", + "Enter a valid email": "أدخل بريد إلكتروني صحيح", + "Enter a valid year": "أدخل سنة صحيحة", + "Enter phone": "أدخل الهاتف", + "Enter promo code": "أدخل كود الخصم", + "Enter promo code here": "أدخل كود الخصم هون", + "Enter the promo code and get": "أدخل كود الخصم واحصل على", + "Enter your City": "أدخل مدينتك", + "Enter your Note": "أدخل ملاحظتك", + "Enter your Password": "أدخل كلمة المرور", + "Enter your Question here": "أدخل سؤالك هون", + "Enter your code below to apply the discount.": + "أدخل كودك تحت عشان تطبق الخصم.", + "Enter your complaint here": "أدخل شكواك هون", + "Enter your complaint here...": "أدخل شكواك هون...", + "Enter your email": "أدخل بريدك الإلكتروني", + "Enter your email address": "أدخل عنوان بريدك الإلكتروني", + "Enter your feedback here": "أدخل تعليقك هون", + "Enter your first name": "أدخل اسمك الأول", + "Enter your last name": "أدخل اسم عائلتك", + "Enter your password": "أدخل كلمة المرور", + "Enter your phone number": "أدخل رقم هاتفك", + "Enter your promo code": "أدخل كود الخصم بتاعك", + "Enter your wallet number": "أدخل رقم محفظتك", + "Error": "صار خطأ", + "Evening": "المسا", + "Exclusive offers and discounts always with the Intaleq app": + "عروض وخصومات حصرية دايماً مع تطبيق انطلق", + "Exclusive offers and discounts always with the Sefer app": + "عروض وخصومات حصرية دايماً مع تطبيق سفر", + "Exit": "خروج", + "Exit Ride?": "تخرج من الرحلة؟", + "Expiration Date": "تاريخ الانتهاء", + "Expired Driver’s License": "رخصة السائق منتهية", + "Expired License": "رخصة منتهية", + "Expiry Date": "تاريخ الانتهاء", + "Expiry Date:": "تاريخ الانتهاء:", + "Export Development Bank of Egypt": "بنك التصدير والاستيراد المصري", + "Face Detection Result": "نتيجة كشف الوجه", + "Failed to connect to the server. Please try again.": + "ما انقدرنا نتصل بالخادم. جرب مرة تانية.", + "Failed to fetch rides. Please try again.": + "ما انقدرنا نجيب الرحلات. جرب مرة تانية.", + "Failed to finish ride. Please check internet.": + "ما انقدرنا ننهي الرحلة. تفضل تحقق من الإنترنت.", + "Failed to initiate payment. Please try again.": + "فشل بدء الدفع. جرب مرة تانية.", + "Failed to load profile data.": + "ما انقدرنا نحمّل بيانات الملف الشخصي.", + "Failed to save driver data": "ما انقدرنا نحفظ بيانات السائق", + "Failed to send invite": "فشل إرسال الدعوة", + "Failed to upload audio file.": "فشل رفع الملف الصوتي.", + "Faisal Islamic Bank of Egypt": "بنك فيصل الإسلامي المصري", + "Fastest Complaint Response": "أسرع رد على الشكاوى", + "Favorite Places": "الأماكن المفضلة", + "Fee is": "الرسوم هي", + "Feed Back": "التعليق", + "Feedback": "التعليق", + "Feedback data saved successfully": "تم حفظ بيانات التعليق بنجاح", + "Female": "أنثى", + "Find answers to common questions": "لاقي أجوبة للأسئلة الشائعة", + "Finish & Submit": "إنهاء وإرسال", + "Finish Monitor": "إنهاء المراقبة", + "Finished": "انتهت", + "First Abu Dhabi Bank": "بنك أبوظبي الأول", + "First Name": "الاسم الأول", + "First name": "الاسم الأول", + "Fixed Price": "سعر ثابت", + "Flag-down fee": "رسوم بداية المشوار", + "For Drivers": "للسواقين", + "For Egypt": "لمصر", + "For Intaleq and Delivery trips, the price is calculated dynamically. For Comfort trips, the price is based on time and distance": + "لرحلات انطلق والتوصيل، السعر بيحسب ديناميكياً. لرحلات الكومفورت، السعر بيعتمد على الوقت والمسافة.", + "For Intaleq and scooter trips, the price is calculated dynamically. For Comfort trips, the price is based on time and distance": + "لرحلات انطلاق والسكوتر، السعر بيحسب ديناميكياً. لرحلات الكومفورت، السعر بيعتمد على الوقت والمسافة.", + "Free Call": "مكالمة مجانية", + "Frequently Asked Questions": "الأسئلة الشائعة", + "Frequently Questions": "أسئلة متكررة", + "From": "من", + "From :": "من :", + "From : Current Location": "من : الموقع الحالي", + "From Budget": "من الميزانية", + "From:": "من:", + "Fuel": "الوقود", + "Fuel Type": "نوع الوقود", + "Full Name": "الاسم الكامل", + "Full Name (Marital)": "الاسم الكامل (الزواج)", + "FullName": "الاسم الكامل", + "GPS Required Allow !.": "مطلوب تفعيل GPS !.", + "Gender": "الجنس", + "General": "عام", + "General Authority For Supply Commodities": + "الهيئة العامة للسلع التموينية", + "Get": "احصل على", + "Get Details of Trip": "احصل على تفاصيل الرحلة", + "Get Direction": "احصل على الاتجاهات", + "Get a discount on your first Intaleq ride!": + "احصل على خصم بأول رحلة انطلق!", + "Get features for your country": "احصل على الميزات لبلدك", + "Get it Now!": "احصل عليها هلق!", + "Get to your destination quickly and easily.": + "توصل لوجهتك بسرعة وسهولة.", + "Getting Started": "البدء", + "Gift Already Claimed": "تم استلام الهدية من قبل", + "Go": "انطلق", + "Go To Favorite Places": "روح للأماكن المفضلة", + "Go to next step": "روح للخطوة الجاية", + "Go to next step\nscan Car License.": + "روح للخطوة الجاية\nامسح رخصة السيارة.", + "Go to passenger Location": "روح لموقع الراكب", + "Go to passenger Location now": "روح لموقع الراكب هلق", + "Go to passenger:": "روح للراكب:", + "Go to this Target": "روح لهالهدف", + "Go to this location": "روح لهالموقع", + "Google Map App": "تطبيق خرائط جوجل", + "H and": "و", + "HSBC Bank Egypt S.A.E": "بنك إتش إس بي سي مصر", + "Hard Brake": "فرملة قوية", + "Have a promo code?": "عندك كود ترويجي؟", + "Head": "الرأس", + "Heading your way now. Please be ready.": + "عم ييجي لعندك هلق. تفضل جهّز حالك.", + "Health Insurance": "التأمين الصحي", + "Heatmap": "خريطة حرارية", + "Height:": "الطول:", + "Hello": "أهلاً", + "Hello this is Captain": "أهلاً، أنا الكابتن", + "Hello this is Driver": "أهلاً، أنا السائق", + "Help & Support": "المساعدة والدعم", + "Help Details": "تفاصيل المساعدة", + "Helping Center": "مركز المساعدة", + "Helping Page": "صفحة المساعدة", + "Here recorded trips audio": "هون في صوت الرحلات المسجلة", + "Hi": "هلا", + "Hi ,I Arrive your site": "هلا، وصلت لموقعك", + "Hi ,I will go now": "هلا، رح روح هلق", + "Hi! This is": "هلا! أنا", + "Hi, I will go now": "هلا، رح روح هلق", + "Hi, Where to": "أهلاً، وين بدك تروح؟", + "High School Diploma": "شهادة ثانوية عامة", + "History Page": "صفحة السجل", + "History of Trip": "سجل الرحلة", + "Home": "الرئيسية", + "Home Page": "الصفحة الرئيسية", + "Home Saved": "تم حفظ المنزل", + "Housing And Development Bank": "بنك الإسكان والتعمير", + "How can I pay for my ride?": "كيف بقدر أدفع لرحلتي؟", + "How can I register as a driver?": "كيف بقدر أسجل كسائق؟", + "How do I communicate with the other party (passenger/driver)?": + "كيف بقدر أتواصل مع الطرف التاني (راكب/سائق)؟", + "How do I request a ride?": "كيف بطلب رحلة؟", + "How many hours would you like to wait?": "كام ساعة بدك تستنى؟", + "How much Passenger pay?": "قديش بدفع الراكب؟", + "How much longer will you be?": "قديش بعدك بتأخر؟", + "How to use App": "كيف تستخدم التطبيق", + "How to use Intaleq": "كيف تستخدم انطلق", + "How was the passenger?": "كيف كان الراكب؟", + "How was your trip with": "كيف كانت رحلتك مع", + "How would you rate our app?": "كيف بتقيّم تطبيقنا؟", + "Hybrid": "هايبرد", + "I Agree": "بوافق", + "I Arrive": "وصلت", + "I Arrive your site": "وصلت لموقعك", + "I Have Arrived": "أنا وصلت", + "I've arrived.": "لقد وصلت.", + "I added the wrong pick-up/drop-off location": + "حطيت مكان الالتقاط/التنزيل غلط", + "I arrive you": "وصلت لعندك", + "I cant register in your app in face detection": + "ما بقدر أسجل بتطبيقك بكشف الوجه", + "I want to order for myself": "حابب أطلب لحالي", + "I want to order for someone else": "حابب أطلب لغيري", + "I was just trying the application": "كنت عم جرّب التطبيق بس", + "I will go now": "رحروح هلق", + "I will slow down": "رحخفف السرعة", + "ID Documents Back": "وثائق الهوية (خلفي)", + "ID Documents Front": "وثائق الهوية (أمامي)", + "ID Mismatch": "عدم تطابق الهوية", + "If you in Car Now. Press Start The Ride": + "إذا أنت بالسيارة هلق. اضغط ابدأ الرحلة", + "If you need any help or have question this is right site to do that and your welcome": + "إذا بدك مساعدة أو عندك سؤال، هون المكان المناسب. أهلاً وسهلاً!", + "If you need any help or have questions, this is the right place to do that. You are welcome!": + "إذا كنت بحاجة لأي مساعدة أو عندك أسئلة، هون المكان المناسب. أهلاً وسهلاً!", + "If you need assistance, contact us": "إذا بدك مساعدة، تواصل معنا", + "If you want add stop click here": "إذا بدك تضيف محطة اضغط هون", + "If you want order to another person": "إذا بدك تطلب لشخص تاني", + "If you want to make Google Map App run directly when you apply order": + "إذا بدك تطبيق خرائط جوجل يشتغل مباشرة وقت تقدم الطلب", + "If your car license has the new design, upload the front side with two images.": + "إذا رخصة سيارتك عليها التصميم الجديد، ارفع الوجه الأمامي بصورتين.", + "Image Upload Failed": "فشل رفع الصورة", + "Image detecting result is": "نتيجة كشف الصورة هي", + "In-App VOIP Calls": "مكالمات صوتية جوا التطبيق", + "Including Tax": "شامل الضريبة", + "Incorrect sms code": "كود SMS غلط", + "Increase Fare": "زيادة الأجرة", + "Increase Fee": "زيادة الرسوم", + "Increase Your Trip Fee (Optional)": "زيد رسوم رحلتك (اختياري)", + "Increasing the fare might attract more drivers. Would you like to increase the price?": + "زيادة الأجرة ممكن تجذب سواقين أكثر. بدك ترفع السعر؟", + "Industrial Development Bank": "بنك التنمية الصناعية", + "Ineligible for Offer": "غير مؤهل للعرض", + "Info": "معلومات", + "Insert": "إدخال", + "Insert Account Bank": "أدخل الحساب البنكي", + "Insert Card Bank Details to Receive Your Visa Money Weekly": + "أدخل تفاصيل البطاقة البنكية عشان تستلم فلوسك أسبوعياً", + "Insert Emergency Number": "أدخل رقم الطوارئ", + "Insert Emergincy Number": "أدخل رقم الطوارئ", + "Insert Payment Details": "أدخل تفاصيل الدفع", + "Insert SOS Phone": "أدخل رقم طوارئ", + "Insert Wallet phone number": "أدخل رقم هاتف المحفظة", + "Insert Your Promo Code": "أدخل كود الخصم بتاعك", + "Insert card number": "أدخل رقم البطاقة", + "Insert mobile wallet number": "أدخل رقم محفظة الجوال", + "Insert your mobile wallet details to receive your money weekly": + "أدخل تفاصيل محفظة الجوال عشان تستلم فلوسك أسبوعياً", + "Inspection Date": "تاريخ الفحص", + "InspectionResult": "نتيجة الفحص", + "Install our app:": "ثبّت تطبيقنا:", + "Intaleq": "انطلق", + "Intaleq Balance": "رصيد انطلق", + "Intaleq DRIVER CODE": "كود سائق انطلق", + "Intaleq Driver": "سائق انطلق", + "Intaleq LLC": "شركة انطلق", + "Intaleq Order": "طلب انطلق", + "Intaleq Over": "انطلق انتهى", + "Intaleq Reminder": "تذكير انطلق", + "Intaleq Wallet Features:": "ميزات محفظة انطلق:", + "Intaleq's Response": "رد انطلق", + "Intaleq is a ride-sharing app designed with your safety and affordability in mind. We connect you with reliable drivers in your area, ensuring a convenient and stress-free travel experience.\nHere are some of the key features that set us apart:": + "انطلق تطبيق مشاركة رحلات مصمم لسلامتك وتوفير فلوسك. بنربطك بسواقين موثوقين بمنطقتك...", + "Intaleq is committed to safety, and all of our captains are carefully screened and background checked.": + "انطلق ملتزم بالسلامة، وكل سواقينا بتم فحصهم بدقة.", + "Intaleq is the first ride-sharing app in Syria, designed to connect you with the nearest drivers for a quick and convenient travel experience.": + "انطلق أول تطبيق مشاركة رحلات بسوريا، مصمم يربطك بأقرب السواقين لرحلة سريعة ومريحة.", + "Intaleq is the ride-hailing app that is safe, reliable, and accessible.": + "انطلق تطبيق نقل آمن وموثوق ومتاح للجميع.", + "Intaleq is the safest and most reliable ride-sharing app designed especially for passengers in Syria. We provide a comfortable, respectful, and affordable riding experience with features that prioritize your safety and convenience. Our trusted captains are verified, insured, and supported by regular car maintenance carried out by top engineers. We also offer on-road support services to make sure every trip is smooth and worry-free. With Intaleq, you enjoy quality, safety, and peace of mind—every time you ride.": + "انطلق هو تطبيق مشاركة الرحلات الآمن والأكثر موثوقية المصمم خصيصاً للركاب بسوريا. بنقدملك تجربة رحلة مريحة، محترمة، وبأسعار مناسبة، مع ميزات بتعطي أولوية لسلامتك وراحتك. سواقينا الموثوقين موثقين ومؤمنين، وبيدعمهم صيانة دورية من مهندسين محترفين. كمان بنقدم خدمات دعم على الطريق عشان نضمنلك رحلة سلسة ومن دون هموم. مع انطلق، بتستمتع بالجودة، السلامة، وراحة البال—بكل رحلة.", + "Intaleq is the safest ride-sharing app that introduces many features for both captains and passengers. We offer the lowest commission rate of just 8%, ensuring you get the best value for your rides. Our app includes insurance for the best captains, regular maintenance of cars with top engineers, and on-road services to ensure a respectful and high-quality experience for all users.": + "انطلق هو تطبيق مشاركة الرحلات الآمن اللي بقدّم ميزات كتير للسواقين والركاب. بنقدّم أقل عمولة بس 8% عشان تاخد أحسن قيمة لرحلاتك...", + "Intaleq offers a variety of options including Economy, Comfort, and Luxury to suit your needs and budget.": + "انطلق بيقدم خيارات متنوعة منها اقتصادي، مريح، وفاخر لتناسب احتياجاتك وميزانيتك.", + "Intaleq offers a variety of vehicle options to suit your needs, including economy, comfort, and luxury. Choose the option that best fits your budget and passenger count.": + "انطلق بيقدم خيارات سيارات متنوعة تناسب احتياجاتك، منها الاقتصادي، المريح، والفاخر. اختر اللي بيناسب ميزانيتك وعدد الركاب.", + "Intaleq offers multiple payment methods for your convenience. Choose between cash payment or credit/debit card payment during ride confirmation.": + "انطلق بيقدم طرق دفع متعددة لراحتك. اختر بين الدفع كاش أو ببطاقة ائتمان/خصم وقت تأكيد الرحلة.", + "Intaleq offers various safety features including driver verification, in-app trip tracking, emergency contact options, and the ability to share your trip status with trusted contacts.": + "انطلق بيقدم ميزات سلامة متعددة منها التحقق من السائق، تتبع الرحلة جوا التطبيق، خيارات اتصال الطوارئ، وإمكانية مشاركة حالة رحلتك مع جهات موثوقة.", + "Intaleq prioritizes your safety. We offer features like driver verification, in-app trip tracking, and emergency contact options.": + "انطلق بيعطي أولوية لسلامتك. بنقدم ميزات مثل التحقق من السائق، تتبع الرحلة جوا التطبيق، وخيارات اتصال الطوارئ.", + "Intaleq provides in-app chat functionality to allow you to communicate with your driver or passenger during your ride.": + "انطلق بوفر دردشة جوا التطبيق عشان تتواصل مع السائق أو الراكب وقت الرحلة.", + "Intaleq123": "Intaleq123", + "Intaleq: For fixed salary and endpoints.": + "انطلق: للراتب الثابت والمحطات النهائية.", + "Invalid MPIN": "رمز MPIN غير صالح", + "Invalid OTP": "رمز OTP غير صالح", + "Invalid customer MSISDN": "رقم هاتف العميل غير صالح", + "Invitation Used": "تم استخدام الدعوة", + "Invite": "ادعوا", + "Invite a Driver": "ادعوا سائق", + "Invite another driver and both get a gift after he completes 100 trips!": + "ادعوا سائق تاني وكلكم بتاخدوا هدية بعد ما يكمل 100 رحلة!", + "Invite code already used": "كود الدعوة مستخدم من قبل", + "Invite sent successfully": "تم إرسال الدعوة بنجاح", + "Is device compatible": "الجهاز متوافق", + "Is the Passenger in your Car ?": "الراكب بسيارتك؟", + "Is the Passenger in your Car?": "الراكب بسيارتك؟", + "Issue Date": "تاريخ الإصدار", + "IssueDate": "تاريخ الإصدار", + "JOD": "د.أ", + "Join": "انضم", + "Join Intaleq as a driver using my referral code!": + "انضم لسواقة انطلق بكود الدعوة بتاعي!", + "Jordan": "الأردن", + "Keep it up!": "كمل بهالحماس!", + "Kuwait": "الكويت", + "L.E": "ل.م", + "L.S": "ل.س", + "LE": "ل.م", + "Lady": "سائقة بنات", + "Lady Captain for girls": "كابتن بنات للبنات", + "Lady Captains Available": "سواقة بنات متاحين", + "Lady 👩": "سائقة بنات 👩", + "Lady: For girl drivers.": "سائقة بنات: للرحلات النسائية.", + "Language": "اللغة", + "Language Options": "خيارات اللغة", + "Last 10 Trips": "آخر 10 رحلات", + "Last Name": "اسم العائلة", + "Last name": "اسم العائلة", + "Later": "لاحقاً", + "Latest Recent Trip": "أحدث رحلة", + "Learn more about our app and mission": + "تعرف أكثر عن تطبيقنا ورسالتنا", + "Leave": "مغادرة", + "Leave a detailed comment (Optional)": "اترك تعليق مفصل (اختياري)", + "Lets check Car license": "يلا نفحص رخصة السيارة", + "Lets check License Back Face": "يلا نفحص الوجه الخلفي للرخصة", + "License Categories": "فئات الرخصة", + "License Expiry Date": "تاريخ انتهاء الرخصة", + "License Type": "نوع الرخصة", + "Link a phone number for transfers": "اربط رقم هاتف للتحويلات", + "Location Access Required": "مطلوب الوصول للموقع", + "Location Link": "رابط الموقع", + "Location Tracking Active": "تتبع الموقع مفعل", + "Log Off": "تسجيل خروج", + "Log Out Page": "صفحة تسجيل الخروج", + "Login": "تسجيل الدخول", + "Login Captin": "تسجيل دخول الكابتن", + "Login Driver": "تسجيل دخول السائق", + "Logout": "تسجيل خروج", + "Lowest Price Achieved": "تم تحقيق أدنى سعر", + "MIDBANK": "بنك ميد", + "Made :": "صنع :", + "Maintenance Center": "مركز الصيانة", + "Maintenance Offer": "عرض صيانة", + "Make": "الماركة", + "Make a U-turn": "اعمل دورّة", + "Make is": "الماركة هي", + "Make purchases.": "ادفع واشتري.", + "Male": "ذكر", + "Map Dark Mode": "الوضع الليلي للخريطة", + "Map Passenger": "خريطة الراكب", + "Marital Status": "الحالة الاجتماعية", + "Mashreq Bank": "بنك المشرق", + "Mashwari": "مشاري", + "Mashwari: For flexible trips where passengers choose the car and driver with prior arrangements.": + "مشاري: للرحلات المرنة اللي بيختار فيها الراكب السيارة والسائق بترتيب مسبق.", + "Max Speed": "أقصى سرعة", + "Maximum fare": "أقصى أجرة", + "Message": "رسالة", + "Meter Fare": "أجرة العداد", + "Minimum fare": "أدنى أجرة", + "Minute": "دقيقة", + "Mishwar Vip": "مشوار VIP", + "Missing Documents": "وثائق ناقصة", + "Model": "الموديل", + "Model is": "الموديل هو", + "More": "المزيد", + "Morning": "الصباح", + "Morning Promo": "عرض الصباح", + "Morning Promo Rides": "رحلات عرض الصباح", + "Most Secure Methods": "أكثر الطرق أماناً", + "Motorcycle": "موتوسيكل", + "Move the map to adjust the pin": "حرّك الخريطة عشان تعدّل الدبوس", + "My Balance": "رصيدي", + "My Card": "بطاقتي", + "My Cared": "بطاقتي", + "My Cars": "سياراتي", + "My Location": "موقعي", + "My Profile": "ملفي الشخصي", + "My Wallet": "محفظتي", + "My current location is:": "موقعي الحالي هو:", + "My location is correct. You can search for me using the navigation app": + "موقعي صحيح. تقدر تبحث عليي بتطبيق الملاحة", + "MyLocation": "موقعي", + "Mute": "كتم الصوت", + "N/A": "غير متاح", + "NEXT >>": "التالي >>", + "NEXT STEP": "الخطوة التالية", + "Name": "الاسم", + "Name (Arabic)": "الاسم (عربي)", + "Name (English)": "الاسم (إنجليزي)", + "Name :": "الاسم :", + "Name in arabic": "الاسم بالعربي", + "Name must be at least 2 characters": + "الاسم لازم يكون حرفين على الأقل", + "Name of the Passenger is": "اسم الراكب هو", + "Nasser Social Bank": "بنك ناصر الاجتماعي", + "National Bank of Egypt": "البنك الأهلي المصري", + "National Bank of Greece": "البنك الوطني اليوناني", + "National Bank of Kuwait – Egypt": "البنك الوطني الكويتي – مصر", + "National ID": "الهوية الشخصية", + "National ID Number": "رقم الهوية الشخصية", + "National ID must be 11 digits": "رقم الهوية لازم يكون 11 رقم", + "National Number": "الرقم القومي", + "NationalID": "الهوية الشخصية", + "Navigation": "الملاحة", + "Nearest Car": "أقرب سيارة", + "Nearest Car for you about": "أقرب سيارة لك بعد حوالي", + "Nearest Car: ~": "أقرب سيارة: ~", + "Need assistance? Contact us": "بدك مساعدة؟ تواصل معنا", + "Need help? Contact Us": "بدك مساعدة؟ تواصل معنا", + "Next": "التالي", + "Night": "الليل", + "No": "لأ", + "No ,still Waiting.": "لأ، لسا عم نستنى.", + "No Captain Accepted Your Order": "ما في كابتن قبل طلبك", + "No Car in your site. Sorry!": "ما في سيارة بموقعك. آسفين!", + "No Car or Driver Found in your area.": + "ما لقينا سيارة أو سائق بمنطقتك.", + "No I want": "لأ، أنا بدّي", + "No Promo for today .": "ما في عروض بهاليوم.", + "No Response yet.": "ما في رد لسا.", + "No Rides Available": "ما في رحلات متاحة", + "No Rides Yet": "ما في رحلات لسا", + "No SIM card, no problem! Call your driver directly through our app. We use advanced technology to ensure your privacy.": + "ما عندك شريحة، ما في مشكلة! اتصل بسائقك مباشرة عبر التطبيق. بنستخدم تكنولوجيا متطورة عشان نضمن خصوصيتك.", + "No accepted orders? Try raising your trip fee to attract riders.": + "ما في طلبات منقبولة؟ جرّب ترفع رسوم رحلتك عشان تجذب ركاب.", + "No audio files found.": "ما لقينا ملفات صوتية.", + "No audio files found for this ride.": + "ما لقينا تسجيلات صوتية لهاد المشوار.", + "No audio files recorded.": "ما في ملفات صوتية مسجلة.", + "No cars are available at the moment. Please try again later.": + "ما في سيارات متاحة هلق. تفضل جرّب مرة تانية لاحقاً.", + "No cars nearby": "ما في سيارات قريبة", + "No contact selected": "ما في جهة اتصال مختارة", + "No contacts found": "ما لقينا جهات اتصال", + "No contacts with phone numbers found": + "ما لقينا جهات اتصال بأرقام هواتف", + "No contacts with phone numbers were found on your device.": + "ما لقينا جهات اتصال بأرقام هواتف بجهازك.", + "No data yet": "ما في بيانات لسا", + "No data yet!": "ما في بيانات لسا!", + "No driver accepted my request": "ما في سائق قبل طلبي", + "No drivers accepted your request yet": "ما في سائقين قبلوا طلبك لسا", + "No drivers available": "ما في سائقين متاحين", + "No drivers available at the moment. Please try again later.": + "ما في سائقين متاحين هلق. تفضل جرّب مرة تانية لاحقاً.", + "No face detected": "ما في وجه مكتشف", + "No favorite places yet!": "ما في أماكن مفضلة لسا!", + "No i want": "لأ، أنا بدّي", + "No image selected yet": "ما في صورة مختارة لسا", + "No invitation found": "ما لقينا دعوة", + "No invitation found yet!": "ما لقينا دعوة لسا!", + "No one accepted? Try increasing the fare.": + "ما في حدا قبل؟ جرّب ترفع الأجرة.", + "No orders available": "ما في طلبات متاحة", + "No passenger found for the given phone number": + "ما لقينا راكب بهالرقم", + "No phone number": "ما في رقم هاتف", + "No promos available right now.": "ما في عروض ترويجية هلق.", + "No questions asked yet.": "ما في أسئلة لسا.", + "No ride found yet": "ما لقينا رحلة لسا", + "No ride yet": "ما في رحلة لسا", + "No rides available for your vehicle type.": + "ما في رحلات متاحة لنوع سيارتك.", + "No rides available right now.": "ما في رحلات متاحة هلق.", + "No rides found to complain about.": + "ما لقينا أي مشاوير لحتى تقدم شكوى عليها.", + "No transactions this week": "ما في معاملات بهالأسبوع", + "No transactions yet": "ما في معاملات لسا", + "No trip data available": "ما في بيانات رحلة متاحة", + "No trip history found": "ما لقينا سجل رحلات", + "No trip yet found": "ما لقينا رحلة لسا", + "No user found for the given phone number": "ما لقينا مستخدم بهالرقم", + "No wallet record found": "ما لقينا سجل محفظة", + "No, I want to cancel this trip": "لأ، بدّي ألغي هالرحلة", + "No, still Waiting.": "لأ، لسا عم نستنى.", + "No, thanks": "لأ، شكراً", + "No,I want": "لأ، أنا بدّي", + "Non Egypt": "غير مصر", + "Not Connected": "غير متصل", + "Not set": "غير محدد", + "Not updated": "ما انحدث", + "Notifications": "الإشعارات", + "Now select start pick": "هلق اختر نقطة البداية", + "OK": "تمام", + "Occupation": "المهنة", + "Offline": "غير متصل", + "Ok": "تمام", + "Ok , See you Tomorrow": "تمام، نشوفك بكرة", + "Ok I will go now.": "تمام، رحروح هلق.", + "Old and affordable, perfect for budget rides.": + "قديمة ومناسبة للسعر، مثالية لرحلات الميزانية المحدودة.", + "Online": "متصل", + "Only Syrian phone numbers are allowed": + "مسموح بس بأرقام الهواتف السورية", + "Open App": "افتح التطبيق", + "Open Settings": "افتح الإعدادات", + "Open app and go to passenger": "افتح التطبيق وروح للراكب", + "Open in Maps": "افتح بالخرائط", + "Open the app to stay updated and ready for upcoming tasks.": + "افتح التطبيق عشان تظل محدّث وجاهز للمهام الجاية.", + "Opted out": "تم إلغاء الاشتراك", + "Or": "أو", + "Or pay with Cash instead": "أو ادفع كاش بدل هيك", + "Order": "طلب", + "Order Accepted": "تم قبول الطلب", + "Order Accepted by another driver": "طلبك انقبل من سائق تاني", + "Order Applied": "تم تطبيق الطلب", + "Order Cancelled": "تم إلغاء الطلب", + "Order Cancelled by Passenger": "تم إلغاء الطلب من الراكب", + "Order Details Intaleq": "تفاصيل الطلب انطلق", + "Order History": "سجل الطلبات", + "Order ID": "رقم الطلب", + "Order Request Page": "صفحة طلب الرحلة", + "Order Under Review": "الطلب قيد المراجعة", + "Order for myself": "طلب لحالي", + "Order for someone else": "طلب لغيري", + "OrderId": "رقم الطلب", + "OrderVIP": "طلب VIP", + "Orders Page": "صفحة الطلبات", + "Origin": "نقطة البداية", + "Original Fare": "الأجرة الأصلية", + "Other": "أخرى", + "Our dedicated customer service team ensures swift resolution of any issues.": + "فريق خدمة العملاء المتخصص عندنا بيضمن حل سريع لأي مشكلة.", + "Overall Behavior Score": "درجة السلوك العامة", + "Overlay": "العرض العلوي", + "Owner Name": "اسم المالك", + "Passenger": "الراكب", + "Passenger & Status": "الراكب والحالة", + "Passenger Cancel Trip": "الراكب ألغى الرحلة", + "Passenger Information": "معلومات الراكب", + "Passenger Name": "اسم الراكب", + "Passenger Name is": "اسم الراكب هو", + "Passenger cancel trip": "الراكب ألغى الرحلة", + "Passenger cancelled order": "الراكب ألغى الطلب", + "Passenger cancelled the ride.": "الراكب ألغى الرحلة.", + "Passenger come to you": "الراكب قادم إليك", + "Passenger name :": "اسم الراكب :", + "Passenger name:": "اسم الراكب:", + "Passenger paid amount": "المبلغ اللي دفعه الراكب", + "Passengers": "الركاب", + "Password": "كلمة المرور", + "Password must be at least 6 characters": + "كلمة المرور لازم تكون 6 أحرف على الأقل", + "Password must be at least 6 characters.": + "كلمة المرور لازم تكون 6 أحرف على الأقل.", + "Password must br at least 6 character.": + "كلمة المرور لازم تكون 6 أحرف على الأقل.", + "Paste WhatsApp location link": "الصق رابط موقع الواتساب", + "Paste location link here": "الصق رابط الموقع هون", + "Paste the code here": "الصق الكود هون", + "Pay": "ادفع", + "Pay by MTN Wallet": "الدفع عبر محفظة MTN", + "Pay by Sham Cash": "الدفع عبر شام كاش", + "Pay by Syriatel Wallet": "الدفع عبر محفظة سيريتل", + "Pay directly to the captain": "ادفع مباشرة للكابتن", + "Pay from my budget": "ادفع من ميزانيتي", + "Pay remaining to Wallet?": "بدك تدفع الباقي للمحفظة؟", + "Pay with Credit Card": "ادفع ببطاقة ائتمان", + "Pay with Debit Card": "ادفع ببطاقة خصم", + "Pay with Wallet": "ادفع من المحفظة", + "Pay with Your": "ادفع بـ", + "Pay with Your PayPal": "ادفع بباي بال", + "Payment Failed": "فشل الدفع", + "Payment History": "سجل المدفوعات", + "Payment Method": "طريقة الدفع", + "Payment Method:": "طريقة الدفع:", + "Payment Options": "خيارات الدفع", + "Payment Successful": "تم الدفع بنجاح", + "Payment Successful!": "تم الدفع بنجاح!", + "Payment details added successfully": "تمت إضافة تفاصيل الدفع بنجاح", + "Payments": "المدفوعات", + "Percent Canceled": "نسبة الإلغاء", + "Percent Completed": "نسبة الإنجاز", + "Percent Rejected": "نسبة الرفض", + "Perfect for adventure seekers who want to experience something new and exciting": + "مثالية لمحبي المغامرة اللي بدّهم يجربوا شي جديد ومثير", + "Perfect for passengers seeking the latest car models with the freedom to choose any route they desire": + "مثالية للركاب اللي بيدوروا على أحدث موديلات السيارات مع حرية اختيار أي طريق بدّهم", + "Permission denied": "تم رفض الصلاحية", + "Personal Information": "المعلومات الشخصية", + "Petrol": "بنزين", + "Phone": "رقم الهاتف", + "Phone Check": "فحص الهاتف", + "Phone Number": "رقم الهاتف", + "Phone Number Check": "فحص رقم الهاتف", + "Phone Number is": "رقم الهاتف هو", + "Phone Number is not Egypt phone": "رقم الهاتف مش مصري", + "Phone Number wrong": "رقم الهاتف غلط", + "Phone Wallet Saved Successfully": "تم حفظ رقم المحفظة بنجاح", + "Phone number is already verified": "رقم الهاتف موثق من قبل", + "Phone number is verified before": "رقم الهاتف موثق من قبل", + "Phone number must be exactly 11 digits long": + "رقم الهاتف لازم يكون بالضبط 11 رقم", + "Phone number must be valid.": "رقم الهاتف لازم يكون صحيح.", + "Phone number seems too short": "يبدو أن رقم الهاتف قصير جداً", + "Pick from map": "اختر من الخريطة", + "Pick from map destination": "اختر الوجهة من الخريطة", + "Pick or Tap to confirm": "اختر أو اضغط للتأكيد", + "Pick your destination from Map": "اختر وجهتك من الخريطة", + "Pick your ride location on the map - Tap to confirm": + "اختر موقع رحلتك على الخريطة - اضغط للتأكيد", + "Plate": "اللوحة", + "Plate Number": "رقم اللوحة", + "Please Try anther time": "تفضل جرّب مرة تانية", + "Please Wait If passenger want To Cancel!": + "تفضل استنى إذا بد الراكب يلغي!", + "Please allow location access at all times to receive ride requests and ensure smooth service.": + "تفضل اسمح بالوصول للموقع دايماً عشان تستلم طلبات الرحلات وتضمن خدمة سلسة.", + "Please check back later for available rides.": + "تفضل رجع لاحقاً للرحلات المتاحة.", + "Please complete more distance before ending.": + "تفضل كمّل شوية مسافة قبل ما تنهي.", + "Please describe your issue before submitting.": + "تفضل صف مشكلتك قبل ما ترسل.", + "Please enter": "تفضل أدخل", + "Please enter Your Email.": "تفضل أدخل بريدك الإلكتروني.", + "Please enter Your Password.": "تفضل أدخل كلمة المرور.", + "Please enter a correct phone": "تفضل أدخل رقم هاتف صحيح", + "Please enter a description of the issue.": "تفضل أدخل وصف للمشكلة.", + "Please enter a health insurance status.": + "تفضل أدخل حالة التأمين الصحي.", + "Please enter a phone number": "تفضل أدخل رقم هاتف", + "Please enter a valid 16-digit card number": + "تفضل أدخل رقم بطاقة صالح من 16 رقم", + "Please enter a valid card 16-digit number.": + "تفضل أدخل رقم بطاقة صالح من 16 رقم.", + "Please enter a valid email": "الرجاء إدخال بريد إلكتروني صالح", + "Please enter a valid email.": "تفضل أدخل بريد إلكتروني صحيح.", + "Please enter a valid insurance provider": + "الرجاء إدخال مزود تأمين صالح", + "Please enter a valid phone number.": "تفضل أدخل رقم هاتف صحيح.", + "Please enter a valid promo code": "تفضل أدخل كود خصم صالح", + "Please enter the CVV code": "تفضل أدخل رمز CVV", + "Please enter the cardholder name": "تفضل أدخل اسم حامل البطاقة", + "Please enter the complete 6-digit code.": + "تفضل أدخل الكود المكون من 6 أرقام كاملاً.", + "Please enter the emergency number.": "تفضل أدخل رقم الطوارئ.", + "Please enter the expiry date": "تفضل أدخل تاريخ الانتهاء", + "Please enter the number without the leading 0": + "يرجى إدخال الرقم بدون الصفر الأولي", + "Please enter your City.": "تفضل أدخل مدينتك.", + "Please enter your Email.": "تفضل أدخل بريدك الإلكتروني.", + "Please enter your Password.": "تفضل أدخل كلمة المرور.", + "Please enter your Question.": "تفضل أدخل سؤالك.", + "Please enter your complaint.": "تفضل أدخل شكواك.", + "Please enter your feedback.": "تفضل أدخل تعليقك.", + "Please enter your first name.": "تفضل أدخل اسمك الأول.", + "Please enter your last name.": "تفضل أدخل اسم عائلتك.", + "Please enter your phone number": "يرجى إدخال رقم هاتفك", + "Please enter your phone number.": "تفضل أدخل رقم هاتفك.", + "Please enter your question": "تفضل أدخل سؤالك", + "Please select a ride before submitting.": + "تفضل اختر المشوار قبل ما ترسل.", + "Please go closer to the passenger location (less than 150m)": + "تفضل قرب من موقع الراكب (أقل من 150 متر)", + "Please go to Car Driver": "يرجى الذهاب إلى سائق السيارة", + "Please go to Car now": "تفضل روح للسيارة هلق", + "Please go to the pickup location exactly": + "يرجى الذهاب إلى موقع الالتقاط بالضبط", + "Please help! Contact me as soon as possible.": + "من فضلك ساعدني! اتصل بي بأسرع وقت ممكن.", + "Please make sure not to leave any personal belongings in the car.": + "تفضل تأكد ما تترك أي حاجات شخصية بالسيارة.", + "Please make sure to read the license carefully.": + "تفضل تأكد تقرأ الرخصة بعناية.", + "Please make sure you have all your personal belongings and that any remaining fare, if applicable, has been added to your wallet before leaving. Thank you for choosing the Intaleq app": + "من فضلك تأكد إن معاك كل حاجاتك الشخصية وإن أي مبلغ متبقي، لو موجود، تم إضافته لمحفظتك قبل ما تمشي. شكرًا لاستخدامك تطبيق انطلق", + "Please provide details about any long-term diseases.": + "تفضل قدّم تفاصيل عن أي أمراض مزمنة.", + "Please put your licence in these border": "تفضل حط رخصتك بهالإطار", + "Please select a contact": "تفضل اختر جهة اتصال", + "Please select a date": "تفضل اختر تاريخ", + "Please select a rating before submitting.": + "تفضل اختر تقييم قبل ما ترسل.", + "Please stay on the picked point.": + "يرجى البقاء في نقطة الالتقاط المحددة.", + "Please tell us why you want to cancel.": "تفضل قلنا ليش بدك تلغي.", + "Please try again in a few moments": "تفضل جرّب مرة تانية بعد شوي", + "Please upload a clear photo of your face to be identified by passengers.": + "تفضل ارفع صورة واضحة لوجهك عشان الركاب يتعرفوا عليك.", + "Please upload all 4 required documents.": + "تفضل ارفع كل الـ4 وثائق المطلوبة.", + "Please upload this license.": "تفضل ارفع هالرخصة.", + "Please verify your identity": "تفضل وثّق هويتك", + "Please wait": "تفضل استنى", + "Please wait for the passenger to enter the car before starting the trip.": + "تفضل استنى لحتى يدخل الراكب السيارة قبل ما تبدأ الرحلة.", + "Please wait while we prepare your trip.": + "تفضل استنى شوي لحتى نجهّز رحلتك.", + "Point": "نقطة", + "Policy restriction on calls": "قيود سياسة على المكالمات", + "Potential security risks detected. The application may not function correctly.": + "تم اكتشاف مخاطر أمنية محتملة. التطبيق ممكن ما يشتغل بشكل صحيح.", + "Potential security risks detected. The application may not function correctly.": + "تم اكتشاف مخاطر أمنية محتملة. التطبيق ممكن ما يشتغل بشكل صحيح.", + "Potential security risks detected. The application will close in @seconds seconds.": + "تم اكتشاف مخاطر أمنية محتملة. التطبيق رح يقفل خلال @seconds ثانية.", + "Pre-booking": "حجز مسبق", + "Press here": "اضغط هون", + "Press to hear": "اضغط عشان تسمع", + "Price": "السعر", + "Price is": "السعر هو", + "Price of trip": "سعر الرحلة", + "Price:": "السعر:", + "Privacy Notice": "إشعار الخصوصية", + "Privacy Policy": "سياسة الخصوصية", + "Profile": "الملف الشخصي", + "Profile Photo Required": "مطلوب صورة شخصية", + "Promo": "عرض ترويجي", + "Promo Already Used": "تم استخدام العرض من قبل", + "Promo Code": "كود الخصم", + "Promo Code Accepted": "تم قبول كود الخصم", + "Promo Copied!": "تم نسخ الكود!", + "Promo End !": "انتهى العرض!", + "Promo Ended": "انتهى العرض", + "Promo code copied to clipboard!": "تم نسخ كود الخصم!", + "Promos": "العروض", + "Promos For Today": "عروض اليوم", + "Promos For today": "عروض اليوم", + "Pyament Cancelled .": "تم إلغاء الدفع.", + "Qatar": "قطر", + "Qatar National Bank Alahli": "البنك الأهلي القطري", + "Question": "سؤال", + "Quick Actions": "إجراءات سريعة", + "Quick Messages": "رسائل سريعة", + "Quiet & Eco-Friendly": "هادئ وصديق للبيئة", + "Raih Gai: For same-day return trips longer than 50km.": + "رايح جاي: لرحلات العودة بنفس اليوم أطول من 50 كم.", + "Rate": "تقييم", + "Rate Captain": "قيّم الكابتن", + "Rate Driver": "قيّم السائق", + "Rate Our App": "قيّم تطبيقنا", + "Rate Passenger": "قيّم الراكب", + "Rating is": "التقييم هو", + "Rating submitted successfully": "تم إرسال التقييم بنجاح", + "Rayeh Gai": "رايح جاي", + "Rayeh Gai: Round trip service for convenient travel between cities, easy and reliable.": + "رايح جاي: خدمة الذهاب والعودة لرحلات مريحة بين المدن، سهلة وموثوقة.", + "Reason": "السبب", + "Recent Places": "الأماكن الأخيرة", + "Recharge my Account": "اشحن حسابي", + "Record": "تسجيل", + "Record saved": "تم حفظ التسجيل", + "Recorded Trips (Voice & AI Analysis)": + "الرحلات المسجلة (صوت وتحليل ذكاء اصطناعي)", + "Recorded Trips for Safety": "رحلات مسجلة للسلامة", + "Refresh": "تحديث", + "Refresh Market": "تحديث السوق", + "Refresh Status": "تحديث الحالة", + "Refuse Order": "رفض الطلب", + "Register": "اشتراك جديد", + "Register Captin": "تسجيل الكابتن", + "Register Driver": "تسجيل السائق", + "Register as Driver": "سجل كسائق", + "Registration completed successfully!": "تم التسجيل بنجاح!", + "Registration failed. Please try again.": + "فشل التسجيل. تفضل جرّب مرة تانية.", + "Reject": "رفض", + "Rejected Orders": "الطلبات المرفوضة", + "Rejected Orders Count": "عدد الطلبات المرفوضة", + "Religion": "الدين", + "Remainder": "الباقي", + "Remaining time": "الوقت المتبقي", + "Report": "تقرير", + "Required field": "حقل مطلوب", + "Resend Code": "إعادة إرسال الكود", + "Resend code": "إعادة إرسال الكود", + "Ride History": "سجل الرحلات", + "Ride Management": "إدارة الرحلات", + "Ride Status": "حالة الرحلة", + "Ride Summaries": "ملخصات الرحلات", + "Ride Summary": "ملخص الرحلة", + "Ride Today :": "رحلات اليوم :", + "Ride Wallet": "محفظة الرحلة", + "Ride info": "معلومات الرحلة", + "Ride information not found. Please refresh the page.": + "ما لقينا معلومات الرحلة. تفضل حدّث الصفحة.", + "Rides": "الرحلات", + "Rouats of Trip": "محطات الرحلة", + "Route Not Found": "ما لقينا طريق", + "Routs of Trip": "محطات الرحلة", + "Run Google Maps directly": "شغّل خرائط جوجل مباشرة", + "S.P": "ل.س", + "SAFAR Wallet": "محفظة سفر", + "SOS": "طوارئ", + "SOS Phone": "هاتف الطوارئ", + "SUBMIT": "إرسال", + "SYP": "ل.س", + "Safety & Security": "السلامة والأمان", + "Saudi Arabia": "السعودية", + "Save": "حفظ", + "Save & Call": "حفظ واتصل", + "Save Credit Card": "حفظ بطاقة الائتمان", + "Saved Sucssefully": "تم الحفظ بنجاح", + "Scan Driver License": "امسح رخصة السائق", + "Scan ID Api": "امسح الهوية API", + "Scan ID MklGoogle": "امسح الهوية MklGoogle", + "Scan ID Tesseract": "امسح الهوية Tesseract", + "Scan Id": "امسح الهوية", + "Scheduled Time:": "الوقت المحدد:", + "Scooter": "سكوتر", + "Search country": "ابحث عن بلد", + "Search for a starting point": "ابحث عن نقطة بداية", + "Search for waypoint": "ابحث عن نقطة طريق", + "Search for your Start point": "ابحث عن نقطة البداية", + "Search for your destination": "ابحث عن وجهتك", + "Search name or number...": "ابحث باسم أو رقم...", + "Searching for the nearest captain...": "عم نبحث عن أقرب كابتن...", + "Security Warning": "تحذير أمني", + "See you Tomorrow!": "نشوفك بكرة!", + "See you on the road!": "نشوفك على الطريق!", + "Select Country": "اختر البلد", + "Select Date": "اختر التاريخ", + "Select Name of Your Bank": "اختر اسم بنكك", + "Select Order Type": "اختر نوع الطلب", + "Select Payment Amount": "اختر مبلغ الدفع", + "Select This Ride": "اختر هالرحلة", + "Select Time": "اختر الوقت", + "Select Waiting Hours": "اختر ساعات الانتظار", + "Select Your Country": "اختر بلدك", + "Select a Bank": "اختر بنك", + "Select a Contact": "اختر جهة اتصال", + "Select a File": "اختر ملف", + "Select a file": "اختر ملف", + "Select a quick message": "اختر رسالة سريعة", + "Select date and time of trip": "اختر تاريخ ووقت الرحلة", + "Select one message": "اختر رسالة وحدة", + "Select recorded trip": "اختر رحلة مسجلة", + "Select your destination": "اختر وجهتك", + "Select your preferred language for the app interface.": + "اختر اللغة اللي بتفضلها لواجهة التطبيق.", + "Selected Date": "التاريخ المختار", + "Selected Date and Time": "التاريخ والوقت المختار", + "Selected Time": "الوقت المختار", + "Selected driver": "السائق المختار", + "Selected file:": "الملف المختار:", + "Send Email": "أرسل بريد", + "Send Intaleq app to him": "أرسل تطبيق انطلق له", + "Send Invite": "أرسل دعوة", + "Send Message": "أرسل رسالة", + "Send Verfication Code": "أرسل رمز التحقق", + "Send Verification Code": "أرسل رمز التحقق", + "Send WhatsApp Message": "أرسل رسالة واتساب", + "Send a custom message": "أرسل رسالة مخصصة", + "Send to Driver Again": "أرسل للسائق مرة تانية", + "Server error. Please try again.": + "خطأ بالخادم. تفضل جرّب مرة تانية.", + "Session expired. Please log in again.": + "الجلسة انتهت. سجل دخول مرة تانية.", + "Set Location on Map": "حدد الموقع على الخريطة", + "Set Phone Number": "حدد رقم الهاتف", + "Set Wallet Phone Number": "حدد رقم هاتف المحفظة", + "Set pickup location": "حدد موقع الالتقاط", + "Setting": "إعداد", + "Settings": "الإعدادات", + "Sex is": "الجنس هو", + "ShamCash Account": "حساب شام كاش", + "Share": "مشاركة", + "Share App": "شارك التطبيق", + "Share Code": "شارك الكود", + "Share Trip Details": "شارك تفاصيل الرحلة", + "Share the app with another new driver": + "شارك التطبيق مع سائق جديد تاني", + "Share the app with another new passenger": + "شارك التطبيق مع راكب جديد تاني", + "Share this code with other drivers. Both of you will receive rewards!": + "شارك هالكود مع سواقين تانيين. كلكم رح تاخدوا مكافآت!", + "Share this code with passengers and earn rewards when they use it!": + "شارك هالكود مع ركاب واكسب مكافآت لما يستخدموه!", + "Share this code with your friends and earn rewards when they use it!": + "شارك هالكود مع صحابك واكسب مكافآت لما يستخدموه!", + "Share with friends and earn rewards": "شارك مع صحابك واكسب مكافآت", + "Share your experience to help us improve...": + "شارك تجربتك عشان تساعدنا نتحسّن...", + "Show Invitations": "عرض الدعوات", + "Show My Trip Count": "عرض عدد رحلاتي", + "Show Promos": "عرض العروض", + "Show Promos to Charge": "عرض العروض للشحن", + "Show behavior page": "عرض صفحة السلوك", + "Show health insurance providers near me": + "اعرض مزودي التأمين الصحي القريبين مني", + "Show latest promo": "عرض أحدث عرض ترويجي", + "Show maintenance center near my location": + "اعرض مراكز الصيانة القريبة مني", + "Show my Cars": "عرض سياراتي", + "Showing": "عرض", + "Sign In by Apple": "تسجيل الدخول بآبل", + "Sign In by Google": "تسجيل الدخول بجوجل", + "Sign In with Google": "تسجيل الدخول بجوجل", + "Sign Out": "تسجيل خروج", + "Sign in for a seamless experience": "سجل دخول لتجربة سلسة", + "Sign in to start your journey": "سجل الدخول لبدء رحلتك", + "Sign in with Apple": "تسجيل الدخول بآبل", + "Sign in with Google for easier email and name entry": + "سجل الدخول بجوجل لإدخال البريد والاسم بسهولة", + "Sign in with a provider for easy access": + "سجل الدخول عبر مزود للوصول بسهولة", + "Slide to End Trip": "اسحب عشان تنهي الرحلة", + "So go and gain your money": "يلا استلم فلوسك", + "Societe Arabe Internationale De Banque": + "المجتمع العربي الدولي للبنوك", + "Something went wrong. Please try again.": + "صار شي غلط. جرب مرة تانية.", + "Sorry": "آسف", + "Sorry, the order was taken by another driver.": + "آسف، الطلب أخذه سائق تاني.", + "Spacious van service ideal for families and groups. Comfortable, safe, and cost-effective travel together.": + "خدمة فان واسعة مثالية للعائلات والمجموعات. رحلة مريحة، آمنة، واقتصادية سوا.", + "Special Order": "طلب خاص", + "Speed": "السرعة", + "Speed Order": "طلب سريع", + "Speed 🔻": "سرعة 🔻", + "Start": "ابدأ", + "Start Record": "ابدأ التسجيل", + "Start Ride": "ابدأ الرحلة", + "Start Trip": "ابدأ الرحلة", + "Start Trip?": "ابدأ الرحلة؟", + "Start the Ride": "ابدأ الرحلة", + "Starting contacts sync in background...": + "عم نبدأ مزامنة جهات الاتصال بالخلفية...", + "Statistic": "إحصائية", + "Statistics": "الإحصائيات", + "Status": "الحالة", + "Status is": "الحالة هي", + "Stay": "ابقى", + "Step-by-step instructions on how to request a ride through the Intaleq app.": + "تعليمات خطوة بخطوة عشان تطلب رحلة عبر تطبيق انطلق.", + "Stop": "توقف", + "Store your money with us and receive it in your bank as a monthly salary.": + "خزّن فلوسك عنا واستلمها ببنكك كراتب شهري.", + "Submission Failed": "فشل الإرسال", + "Submit": "إرسال", + "Submit Complaint": "إرسال شكوى", + "Submit Question": "إرسال سؤال", + "Submit Rating": "إرسال تقييم", + "Submit Your Complaint": "أرسل شكواك", + "Submit Your Question": "أرسل سؤالك", + "Submit a Complaint": "قدّم شكوى", + "Submit rating": "أرسل تقييم", + "Success": "تم بنجاح", + "Suez Canal Bank": "بنك قناة السويس", + "Support": "الدعم", + "Support Reply": "رد الدعم", + "Swipe to End Trip": "اسحب عشان تنهي الرحلة", + "Switch Rider": "تبديل الراكب", + "Switch between light and dark map styles": + "بدّل بين أنماط الخريطة الفاتحة والداكنة", + "Switch between light and dark themes": + "بدّل بين السمات الفاتحة والداكنة", + "Syria": "سوريا", + "Take Image": "التقط صورة", + "Take Photo Now": "التقط صورة هلق", + "Take Picture Of Driver License Card": "التقط صورة لرخصة السائق", + "Take Picture Of ID Card": "التقط صورة لبطاقة الهوية", + "Tap on the promo code to copy it!": "اضغط على كود الخصم عشان تنسخه!", + "Tap to upload": "اضغط عشان ترفع", + "Target": "الهدف", + "Tariff": "التعريفة", + "Tariffs": "التعريفات", + "Tax Expiry Date": "تاريخ انتهاء الضريبة", + "Terms of Use": "شروط الاستخدام", + "Terms of Use & Privacy Notice": "شروط الاستخدام وإشعار الخصوصية", + "Thank You!": "شكراً كتير!", + "Thanks": "شكراً", + "The 300 points equal 300 L.E for you\nSo go and gain your money": + "الـ 300 نقطة بتساوي 300 ل.م لك\nيلا استلم فلوسك", + "The 30000 points equal 30000 S.P for you\nSo go and gain your money": + "الـ 30000 نقطة بتساوي 30000 ل.س لك\nيلا استلم فلوسك", + "The Amount is less than": "المبلغ أقل من", + "The Driver Will be in your location soon .": + "السائق رح يوصل لموقعك قريباً.", + "The United Bank": "البنك المتحد", + "The audio file is not uploaded yet.\nDo you want to submit without it?": + "الملف الصوتي ما انرفع لسا.\nبدك ترسل من دونه؟", + "The captain is responsible for the route.": + "الكابتن مسؤول عن الطريق.", + "The context does not provide any complaint details, so I cannot provide a solution to this issue. Please provide the necessary information, and I will be happy to assist you.": + "المعلومات ما بتعطي تفاصيل عن الشكوى، فما بقدر قدّم حل. تفضل قدّم المعلومات اللازمة، ورح أساعدك بكل سرور.", + "The distance less than 500 meter.": "المسافة أقل من 500 متر.", + "The driver accept your order for": "السائق قبل طلبك بـ", + "The driver accepted your order for": "السائق قبل طلبك بـ", + "The driver accepted your trip": "السائق قبل رحلتك", + "The driver canceled your ride.": "السائق ألغى رحلتك.", + "The driver is approaching.": "السائق عم يقرب.", + "The driver on your way": "السائق بطريقه لعندك", + "The driver waiting you in picked location .": + "السائق عم يستنياك بمكان الالتقاط.", + "The driver waitting you in picked location .": + "السائق عم يستنياك بمكان الالتقاط.", + "The drivers are reviewing your request": "السواقين عم يراجعوا طلبك", + "The email or phone number is already registered.": + "البريد أو رقم الهاتف مسجل من قبل.", + "The full name on your criminal record does not match the one on your driver’s license. Please verify and provide the correct documents.": + "الاسم الكامل بصحيفتك الجنائية ما بيتطابق مع رخصة السائق. تفضل تحقق وقدّم الوثائق الصحيحة.", + "The invitation was sent successfully": "تم إرسال الدعوة بنجاح", + "The national number on your driver’s license does not match the one on your ID document. Please verify and provide the correct documents.": + "الرقم القومي برخصة السائق ما بيتطابق مع الهوية. تفضل تحقق وقدّم الوثائق الصحيحة.", + "The order Accepted by another Driver": "تم قبول الطلب من سائق تاني", + "The order has been accepted by another driver.": + "تم قبول الطلب من سائق تاني.", + "The payment was approved.": "تمت الموافقة على الدفع.", + "The payment was not approved. Please try again.": + "ما انقبل الدفع. تفضل جرّب مرة تانية.", + "The period of this code is 24 hours": "صلاحية هذا الكود هي 24 ساعة", + "Trips": "الرحلات", + "Challenges": "التحديات", + "My Schedule": "جدولي", + "Leaderboard": "لوحة المتصدرين", + "Daily Challenges": "التحديات اليومية", + "Weekly Challenges": "التحديات الأسبوعية", + "Claim Reward": "استلام المكافأة", + "Claimed": "تم الاستلام", + "Earnings": "الأرباح", + "You": "أنت", + "Weekly Plan": "الخطة الأسبوعية", + "Work Days": "أيام العمل", + "Day Off": "يوم عطلة", + "Helping Center": "مركز المساعدة", + "Invite Driver": "دعوة سائق", + "Available for rides": "متاح للرحلات", + "History of Trip": "سجل الرحلات", + "The price may increase if the route changes.": + "السعر ممكن يزيد إذا تغيّر الطريق.", + "The price must be over than": "السعر لازم يكون أكثر من", + "The promotion period has ended.": "انتهت فترة العرض.", + "The reason is": "السبب هو", + "The selected contact does not have a phone number": + "جهة الاتصال المختارة ما فيها رقم هاتف", + "The trip has started! Feel free to contact emergency numbers, share your trip, or activate voice recording for the journey": + "بلشت الرحلة! تفضل اتصل بأرقام الطوارئ، شارك رحلتك، أو فعّل التسجيل الصوتي للرحلة", + "There is no data yet.": "ما في بيانات لسا.", + "There is no help Question here": "ما في أسئلة مساعدة هون", + "There is no notification yet": "ما في إشعارات لسا", + "There no Driver Aplly your order sorry for that": + "ما في سائق قدم على طلبك، آسفين علهيك", + "This Trip Cancelled": "تم إلغاء هالرحلة", + "This Trip Was Cancelled": "تم إلغاء هالرحلة", + "This amount for all trip I get from Passengers": + "هالمبلغ عن كل الرحلات اللي جبته من الركاب", + "This amount for all trip I get from Passengers and Collected For me in": + "هالمبلغ عن كل الرحلات اللي جبته من الركاب وتم جمعه لي بـ", + "This driver is not registered": "هالسائق مش مسجل", + "This for new registration": "هالتسجيل جديد", + "This is a scheduled notification.": "هإشعار مبرمج.", + "This is for delivery or a motorcycle.": "هالتوصيل أو للموتوسيكل.", + "This is for scooter or a motorcycle.": "هالسكوتر أو للموتوسيكل.", + "This is the total number of rejected orders per day after accepting the orders": + "هالعدد الكلي للطلبات المرفوضة باليوم بعد ما انقبلت", + "This page is only available for Android devices": + "هالصفحة متاحة بس لأجهزة أندرويد", + "This phone number has already been invited.": + "هالرقم انُدعِي من قبل.", + "This price is": "هالسعر هو", + "This price is fixed even if the route changes for the driver.": + "هالسعر ثابت حتى لو تغيّر الطريق للسائق.", + "This price may be changed": "هالسعر ممكن يتغير", + "This ride is already applied by another driver.": + "هالرحلة قدم عليها سائق تاني من قبل.", + "This ride is already taken by another driver.": + "هالرحلة أخدها سائق تاني من قبل.", + "This ride type allows changes, but the price may increase": + "هالنوع من الرحلات بيسمح بالتغييرات، بس السعر ممكن يزيد", + "This ride type does not allow changes to the destination or additional stops": + "هالنوع من الرحلات ما بيسمح بتغيير الوجهة أو إضافة محطات", + "This ride was just accepted by another driver.": + "هالرحلة انقبلت للتو من سائق تاني.", + "This service will be available soon.": "هالخدمة رح تتوفر قريباً.", + "This trip goes directly from your starting point to your destination for a fixed price. The driver must follow the planned route": + "هالرحلة بتروح مباشرة من نقطة البداية للوجهة بسعر ثابت. السائق لازم يتبع الطريق المخطط", + "This trip is for women only": "هالرحلة للنساء بس", + "This will delete all recorded files from your device.": + "هالشي رح يحذف كل الملفات المسجلة من جهازك.", + "Time": "الوقت", + "Time Finish is": "وقت الانتهاء هو", + "Time to Passenger": "الوقت للراكب", + "Time to Passenger is": "الوقت للراكب هو", + "Time to arrive": "وقت الوصول", + "TimeStart is": "وقت البدء هو", + "Times of Trip": "أوقات الرحلة", + "Tip is": "الإكرامية هي", + "To :": "إلى :", + "To Home": "للمنزل", + "To Work": "للعمل", + "To become a driver, you must review and agree to the": + "عشان تصير سائق، لازم تراجع وتوافق على", + "To become a passenger, you must review and agree to the": + "عشان تصير راكب، لازم تراجع وتوافق على", + "To change Language the App": "عشان تغير لغة التطبيق", + "To change some Settings": "عشان تغير بعض الإعدادات", + "To display orders instantly, please grant permission to draw over other apps.": + "عشان تعرض الطلبات فوراً، تفضل امنح صلاحية العرض فوق التطبيقات الأخرى.", + "To ensure you receive the most accurate information for your location, please select your country below. This will help tailor the app experience and content to your country.": + "عشان تاخد أدق معلومات لموقعك، تفضل اختر بلدك من تحت. هالشي رح يساعدنا نخصّص تجربة التطبيق ومحتواه لبلدك.", + "To get a gift for both": "عشان تاخد هدية للكل", + "To give you the best experience, we need to know where you are. Your location is used to find nearby captains and for pickups.": + "عشان نعطيك أحسن تجربة، لازم نعرف وينك موقعك. بنستخدم موقعك عشان نلاقي سواقين قريبين ولعملية الالتقاط.", + "To register as a driver or learn about the requirements, please visit our website or contact Intaleq support directly.": + "عشان تسجل كسائق أو تتعرف على المتطلبات، تفضل زور موقعنا أو تواصل مع دعم انطلق مباشرة.", + "To use Wallet charge it": "عشان تستخدم المحفظة اشحنها", + "Today": "اليوم", + "Top up Balance": "شحن الرصيد", + "Top up Balance to continue": "اشحن الرصيد عشان تكمل", + "Top up Wallet": "شحن المحفظة", + "Top up Wallet to continue": "اشحن المحفظة عشان تكمل", + "Total Amount:": "المبلغ الإجمالي:", + "Total Budget from trips by": "إجمالي الميزانية من الرحلات بـ", + "Total Budget from trips by\nCredit card is": + "إجمالي الميزانية من الرحلات بـ\nبطاقة الائتمان هي", + "Total Budget from trips is": "إجمالي الميزانية من الرحلات هو", + "Total Budget is": "إجمالي الميزانية هو", + "Total Connection": "إجمالي الاتصال", + "Total Connection Duration:": "إجمالي مدة الاتصال:", + "Total Cost": "التكلفة الإجمالية", + "Total Cost is": "التكلفة الإجمالية هي", + "Total Duration:": "إجمالي المدة:", + "Total Earnings": "إجمالي الأرباح", + "Total For You is": "الإجمالي لك هو", + "Total From Passenger is": "الإجمالي من الراكب هو", + "Total Hours on month": "إجمالي الساعات بالشهر", + "Total Invites": "إجمالي الدعوات", + "Total Net": "صافي الإجمالي", + "Total Orders": "إجمالي الطلبات", + "Total Points": "إجمالي النقاط", + "Total Points is": "إجمالي النقاط هو", + "Total Price": "السعر الإجمالي", + "Total Weekly Earnings": "إجمالي الأرباح الأسبوعية", + "Total budgets on month": "إجمالي الميزانيات بالشهر", + "Total is": "الإجمالي هو", + "Total points is": "إجمالي النقاط هو", + "Total price from": "السعر الإجمالي من", + "Total rides on month": "إجمالي الرحلات بالشهر", + "Total wallet is": "إجمالي المحفظة هو", + "Total weekly is": "إجمالي الأسبوعي هو", + "Transaction failed": "فشلت العملية", + "Transaction successful": "نجاح العملية", + "Transactions this week": "المعاملات بهالأسبوع", + "Transfer": "تحويل", + "Transfer budget": "تحويل الميزانية", + "Transfer money multiple times.": "حوّل فلوس كذا مرة.", + "Transfer to anyone.": "حوّل لأي واحد.", + "Travel in a modern, silent electric car. A premium, eco-friendly choice for a smooth ride.": + "سافر بسيارة كهربائية حديثة وهادئة. خيار فاخر وصديق للبيئة لرحلة سلسة.", + "Traveled": "تم السفر", + "Trip": "مشوار", + "Trip Cancelled": "انلغى المشوار", + "Trip Cancelled from driver. We are looking for a new driver. Please wait.": + "انلغى المشوار من السائق. عم نبحث عن سائق جديد. تفضل استنى.", + "Trip Cancelled. The cost of the trip will be added to your wallet.": + "تم إلغاء الرحلة. رح تتضاف تكلفة الرحلة لمحفظتك.", + "Trip Cancelled. The cost of the trip will be deducted from your wallet.": + "تم إلغاء الرحلة. رح تنخصم تكلفة الرحلة من محفظتك.", + "Trip Completed": "تمت الرحلة", + "Trip Detail": "تفاصيل الرحلة", + "Trip Details": "تفاصيل الرحلة", + "Trip Finished": "خلص المشوار", + "Trip ID": "رقم الرحلة", + "Trip Info": "معلومات الرحلة", + "Trip Monitor": "مراقب الرحلة", + "Trip Monitoring": "مراقبة الرحلة", + "Trip Started": "بلش المشوار", + "Trip Status:": "حالة الرحلة:", + "Trip Summary with": "ملخص الرحلة مع", + "Trip Timeline": "خط زمني للرحلة", + "Trip finished": "الرحلة خلصت", + "Trip has Steps": "الرحل فيها محطات", + "Trip is Begin": "بلشت الرحلة", + "Trip taken": "تم أخذ الرحلة", + "Trip updated successfully": "تم تحديث الرحلة بنجاح", + "Trips recorded": "تم تسجيل الرحلات", + "Turkey": "تركيا", + "Turn left": "انعطف يسار", + "Turn right": "انعطف يمين", + "Turn sharp left": "انعطف حاد يسار", + "Turn sharp right": "انعطف حاد يمين", + "Turn slight left": "انعطف خفيف يسار", + "Turn slight right": "انعطف خفيف يمين", + "Type Any thing": "اكتب أي شي", + "Type a message...": "اكتب رسالة...", + "Type here Place": "اكتب المكان هون", + "Type something": "اكتب شيئًا", + "Type something...": "اكتب شيئًا...", + "Type your Email": "اكتب بريدك الإلكتروني", + "Type your message": "اكتب رسالتك", + "Type your message...": "اكتب رسالتك...", + "Types of Trips in Intaleq:": "أنواع الرحلات بانطلاق:", + "USA": "أمريكا", + "Uncompromising Security": "أمان لا يتنازل عنه", + "Unknown": "غير معروف", + "Unknown Driver": "سائق غير معروف", + "Unknown Location": "موقع غير معروف", + "Update": "تحديث", + "Update Available": "في تحديث جديد", + "Update Education": "تحديث التعليم", + "Update Gender": "تحديث الجنس", + "Updated": "تم التحديث", + "Updated successfully": "تم التحديث بنجاح", + "Upload Documents": "ارفع المستندات", + "Upload or AI failed": "فشل الرفع أو الذكاء الاصطناعي", + "Uploaded": "تم الرفع", + "Use Touch ID or Face ID to confirm payment": + "استخدم بصمة اللمس أو الوجه لتأكيد الدفع", + "Use code:": "استخدم الكود:", + "Use my invitation code to get a special gift on your first ride!": + "استخدم كود الدعوة بتاعي عشان تاخد هدية خاصة بأول رحلة!", + "Use my referral code:": "استخدم كود الدعوة بتاعي:", + "Use this code in registration": "استخدم هالكود بالتسجيل", + "User does not exist.": "المستخدم مش موجود.", + "User does not have a wallet #1652": "المستخدم ما عندو محفظة #1652", + "User not found": "ما لقينا المستخدم", + "User not logged in": "المستخدم مسجل دخول", + "User with this phone number or email already exists.": + "مستخدم بهالرقم أو البريد موجود من قبل.", + "VIN": "رقم الهيكل", + "VIN :": "رقم الهيكل :", + "VIN is": "رقم الهيكل هو", + "VIP Order": "طلب VIP", + "VIP Order Accepted": "تم قبول طلب VIP", + "VIP Orders": "طلبات VIP", + "Valid Until:": "صالح حتى:", + "Value": "القيمة", + "Van": "فان", + "Van / Bus": "فان / باص", + "Van for familly": "فان للعائلات", + "Variety of Trip Choices": "تنوع خيارات الرحلات", + "Vehicle": "المركبة", + "Vehicle Category": "فئة المركبة", + "Vehicle Details": "تفاصيل المركبة", + "Vehicle Details Back": "تفاصيل المركبة (خلفي)", + "Vehicle Details Front": "تفاصيل المركبة (أمامي)", + "Vehicle Information": "معلومات المركبة", + "Vehicle Options": "خيارات المركبة", + "Verification Code": "رمز التحقق", + "Verify": "توثيق", + "Verify Email": "توثيق البريد", + "Verify Email For Driver": "توثيق البريد للسائق", + "Verify OTP": "توثيق OTP", + "Vibration": "اهتزاز", + "Vibration feedback for all buttons": + "تغذية راجعة بالاهتزاز لكل الأزرار", + "Vibration feedback for buttons": "تغذية راجعة بالاهتزاز للأزرار", + "Videos Tutorials": "فيديوهات تعليمية", + "View your past transactions": "شوف معاملاتك السابقة", + "Visa": "فيزا", + "Visit Website/Contact Support": "زور الموقع/تواصل مع الدعم", + "Visit our website or contact Intaleq support for information on driver registration and requirements.": + "زور موقعنا أو تواصل مع دعم انطلق لمعلومات عن تسجيل السائق والمتطلبات.", + "Voice Calling": "الاتصال الصوتي", + "Waiting": "بالانتظار", + "Waiting Time": "وقت الانتظار", + "Waiting VIP": "انتظار VIP", + "Waiting for Captin ...": "عم نستنى الكابتن...", + "Waiting for Driver ...": "عم نستنى السائق...", + "Waiting for your location": "عم نستنى موقعك", + "Wallet": "المحفظة", + "Wallet Add": "إضافة للمحفظة", + "Wallet Added": "تمت الإضافة للمحفظة", + "Wallet Added\${(remainingFee).toStringAsFixed(0)}": + "تمت الإضافة للمحفظة \${(remainingFee).toStringAsFixed(0)}", + "Wallet Type": "نوع المحفظة", + "Wallet is blocked": "المحفظة محظورة", + "Wallet!": "المحفظة!", + "Warning": "تحذير", + "Warning: Intaleqing detected!": "تحذير: تم كشف تجاوزات!", + "Warning: Speeding detected!": "تحذير: تم كشف سرعة زائدة!", + "We Are Sorry That we dont have cars in your Location!": + "آسفين ما عندنا سيارات بموقعك!", + "We are looking for a captain but the price may increase to let a captain accept": + "عم نبحث عن كابتن بس السعر ممكن يزيد عشان يقبل كابتن", + "We are process picture please wait": "عم نعالج الصورة تفضل استنى", + "We are search for nearst driver": "عم نبحث عن أقرب سائق", + "We are searching for the nearest driver": "عم نبحث عن أقرب سائق لك", + "We are searching for the nearest driver to you": + "عم نبحث عن أقرب سائق لك", + "We connect you with the nearest drivers for faster pickups and quicker journeys.": + "بنربطك بأقرب السواقين لالتقاط أسرع ورحلات أسرع.", + "We have maintenance offers for your car. You can use them after completing 600 trips to get a 20% discount on car repairs. Enjoy using our Intaleq app and be part of our Intaleq family.": + "عندنا عروض صيانة لسيارتك. تقدر تستخدمها بعد ما تكمل 600 رحلة عشان تاخد خصم 20% على تصليح السيارة. استمتع باستخدام تطبيق انطلق وكون جزء من عيلة انطلق.", + "We have partnered with health insurance providers to offer you special health coverage. Complete 500 trips and receive a 20% discount on health insurance premiums.": + "عقدنا شراكة مع مزودي تأمين صحي عشان نعطيك تغطية صحية خاصة. اكمل 500 رحلة واحصل على خصم 20% على أقساط التأمين الصحي.", + "We have received your application to join us as a driver. Our team is currently reviewing it. Thank you for your patience.": + "استلمنا طلبك للانضمام إلينا كسائق. فريقنا عم يراجعه هلق. شكراً لصبرك.", + "We have sent a verification code to your mobile number:": + "أرسلنا رمز تحقق لرقم جوالك:", + "We need access to your location to match you with nearby passengers and ensure accurate navigation.": + "نحتاج صلاحية موقعك عشان نربطك بركاب قريبين ونضمن ملاحة دقيقة.", + "We need access to your location to match you with nearby passengers and provide accurate navigation.": + "نحتاج للوصول لموقعك عشان نربطك بالركاب القريبين ونوفر توجيه دقيق.", + "We need your location to find nearby drivers for pickups and drop-offs.": + "بنحتاج موقعك عشان نلاقي سواقين قريبين للالتقاط والتنزيل.", + "We need your phone number to contact you and to help you receive orders.": + "بنحتاج رقم هاتفك عشان نتواصل معك ونساعدك تستلم طلبات.", + "We need your phone number to contact you and to help you.": + "بنحتاج رقم هاتفك عشان نتواصل معك ونساعدك.", + "We noticed the Intaleq is exceeding 100 km/h. Please slow down for your safety. If you feel unsafe, you can share your trip details with a contact or call the police using the red SOS button.": + "لاحظنا إن السرعة فوق 100 كم/ساعة. تفضل خفف السرعة عشان سلامتك. إذا حسيت إنك مش بأمان، تقدر تشارك تفاصيل رحلتك مع جهة اتصال أو تتصل بالشرطة بزر الطوارئ الأحمر.", + "We regret to inform you that another driver has accepted this order.": + "نأسف لإعلامك إن سائق تاني قبل هالطلب.", + "We search nearst Driver to you": "عم نبحث عن أقرب سائق لك", + "We sent 5 digit to your Email provided": + "أرسلنا 5 أرقام لبريدك الإلكتروني اللي قدّمته", + "We use location to get accurate and nearest passengers for you": + "بنستخدم موقعك عشان نلاقي أدق وأقرب ركاب لك", + "We use your precise location to find the nearest available driver and provide accurate pickup and dropoff information. You can manage this in Settings.": + "بنستخدم موقعك الدقيق عشان نلاقي أقرب سائق متاح ونعطيك معلومات دقيقة للالتقاط والتنزيل. تقدر تدير هالشي بالإعدادات.", + "We will look for a new driver.\nPlease wait.": + "هنبحث عن سائق جديد.\nمن فضلك انتظر.", + "Weekly Budget": "الميزانية الأسبوعية", + "Weekly Summary": "الملخص الأسبوعي", + "Welcome": "ياهلا وسهلا", + "Welcome Back!": "مرحباً بعودتك!", + "Welcome Offer!": "عرض ترحيبي!", + "Welcome to Intaleq!": "أهلاً بانطلق!", + "What are the order details we provide to you?": + "إيش تفاصيل الطلب اللي بنقدملك؟", + "What are the requirements to become a driver?": + "إيش المتطلبات عشان تصير سائق؟", + "What is Types of Trips in Intaleq?": "إيش أنواع الرحلات بانطلاق؟", + "What is the feature of our wallet?": "إيش مميزات محفظتنا؟", + "What safety measures does Intaleq offer?": + "إيش إجراءات السلامة اللي بيقدمها انطلق؟", + "What types of vehicles are available?": + "إيش أنواع المركبات المتاحة؟", + "WhatsApp": "واتساب", + "WhatsApp Location Extractor": "مستخرج موقع الواتساب", + "When": "متى", + "When you complete 500 trips, you will be eligible for exclusive health insurance offers.": + "لما تكمل 500 رحلة، رح تكون مؤهل لعروض تأمين صحي حصرية.", + "When you complete 600 trips, you will be eligible to receive offers for maintenance of your car.": + "لما تكمل 600 رحلة، رح تكون مؤهل لعروض صيانة سيارتك.", + "Where are you going?": "وين رايح؟", + "Where are you, sir?": "وينك يا سيدي؟", + "Where to": "وين بدك تروح؟", + "Where you want go": "وين بدك تروح", + "Which method you will pay": "إيش طريقة الدفع اللي بدك تستخدمها", + "Why Choose Intaleq?": "ليش تختار انطلق؟", + "Why do you want to cancel this trip?": "ليش بدك تلغي هالرحلة؟", + "With Intaleq, you can get a ride to your destination in minutes.": + "مع انطلق، تقدر تاخد رحلة لوجهتك بدقايق.", + "Work": "العمل", + "Work & Contact": "العمل والتواصل", + "Work Saved": "تم حفظ العمل", + "Work time is from 10:00 - 17:00.\nYou can send a WhatsApp message or email.": + "وقت العمل من 10:00 لـ 17:00.\nتقدر ترسل رسالة واتساب أو بريد إلكتروني.", + "Work time is from 10:00 AM to 16:00 PM.\nYou can send a WhatsApp message or email.": + "وقت العمل من 10:00 ص لـ 4:00 م.\nتقدر ترسل رسالة واتساب أو بريد إلكتروني.", + "Work time is from 12:00 - 19:00.\nYou can send a WhatsApp message or email.": + "وقت العمل من 12:00 لـ 19:00.\nتقدر ترسل رسالة واتساب أو بريد إلكتروني.", + "Would the passenger like to settle the remaining fare using their wallet?": + "بد الراكب يسدّد الأجرة المتبقية بمحفظته؟", + "Would you like to proceed with health insurance?": + "بدك تكمل مع التأمين الصحي؟", + "Write note": "اكتب ملاحظة", + "Write the reason for canceling the trip": "اكتب سبب إلغاء الرحلة", + "Write your comment here": "اكتب تعليقك هون", + "Write your reason...": "اكتب سببك...", + "YYYY-MM-DD": "YYYY-MM-DD", + "Year": "السنة", + "Year is": "السنة هي", + "Year of Manufacture": "سنة الصنع", + "Yes": "إي", + "Yes, Pay": "إي، ادفع", + "Yes, you can cancel your ride under certain conditions (e.g., before driver is assigned). See the Intaleq cancellation policy for details.": + "إي، تقدر تلغي رحلتك بشروط معينة (مثلاً قبل ما يتحدد سائق). شوف سياسة الإلغاء بانطلاق للتفاصيل.", + "Yes, you can cancel your ride, but please note that cancellation fees may apply depending on how far in advance you cancel.": + "إي، تقدر تلغي رحلتك، بس انتبه إن في رسوم إلغاء ممكن تتطبق حسب الوقت اللي بتلغي فيه.", + "You Are Stopped For this Day !": "تم إيقافك لهاليوم!", + "You Can Cancel Trip And get Cost of Trip From": + "تقدر تلغي الرحلة وتسترد التكلفة من", + "You Can Cancel the Trip and get Cost From": + "تقدر تلغي الرحلة وتسترد التكلفة من", + "You Can cancel Ride After Captain did not come in the time": + "تقدر تلغي الرحلة إذا ما جاك الكابتن بالوقت المحدد", + "You Dont Have Any amount in": "ما عندك أي مبلغ بـ", + "You Dont Have Any places yet !": "ما عندك أي أماكن لسا!", + "You Have": "عندك", + "You Have Tips": "عندك إكراميات", + "You Refused 3 Rides this Day that is the reason": + "رفضت 3 رحلات بهاليوم وهيك السبب", + "You Refused 3 Rides this Day that is the reason\nSee you Tomorrow!": + "رفضت 3 رحلات بهاليوم وهيك السبب\nنشوفك بكرة!", + "You Should be select reason.": "لازم تختار سبب.", + "You Should choose rate figure": "لازم تختار رقم التقييم", + "You Will Be Notified": "رح نبلّغك", + "You accepted the VIP order.": "قبلت طلب VIP.", + "You are Delete": "تم حذفك", + "You are Stopped": "تم إيقافك", + "You are far from passenger location": "أنت بعيد عن موقع الراكب", + "You are in an active ride. Leaving this screen might stop tracking. Are you sure you want to exit?": + "أنت برحلة نشطة. خروجك من هالشاشة ممكن يوقف التتبع. متأكد بدك تخرج؟", + "You are near the destination": "أنت قريب من الوجهة", + "You are not in near to passenger location": + "أنت مش قريب من موقع الراكب", + "You are not near": "أنت مش قريب من", + "You are not near the passenger location": + "أنت مش قريب من موقع الراكب", + "You can buy Points to let you online": + "تقدر تشتري نقاط عشان تكون أونلاين", + "You can buy Points to let you online\nby this list below": + "تقدر تشتري نقاط عشان تكون أونلاين\nبهالقائمة تحت", + "You can buy points from your budget": "تقدر تشتري نقاط من ميزانيتك", + "You can call or record audio during this trip.": + "تقدر تتصل أو تسجّل صوت خلال هالرحلة.", + "You can call or record audio of this trip": + "تقدر تتصل أو تسجّل صوت هالرحلة", + "You can cancel Ride now": "تقدر تلغي الرحلة هلق", + "You can cancel trip": "تقدر تلغي الرحلة", + "You can change the Country to get all features": + "تقدر تغير البلد عشان تاخد كل الميزات", + "You can change the destination by long-pressing any point on the map": + "تقدر تغير الوجهة بالضغط المطوّل على أي نقطة بالخريطة", + "You can change the language of the app": "تقدر تغير لغة التطبيق", + "You can change the vibration feedback for all buttons": + "تقدر تغير الاهتزاز لكل الأزرار", + "You can claim your gift once they complete 2 trips.": + "تقدر تستلم هديتك لما يكملوا رحلتين.", + "You can communicate with your driver or passenger through the in-app chat feature once a ride is confirmed.": + "تقدر تتواصل مع السائق أو الراكب عبر الدردشة جوا التطبيق بعد ما تتأكد الرحلة.", + "You can contact us during working hours from 10:00 - 16:00.": + "تقدر تتواصل معنا بساعات العمل من 10:00 لـ 16:00.", + "You can contact us during working hours from 10:00 - 17:00.": + "تقدر تتواصل معنا بساعات العمل من 10:00 لـ 17:00.", + "You can contact us during working hours from 12:00 - 19:00.": + "تقدر تتواصل معنا بساعات العمل من 12:00 لـ 19:00.", + "You can decline a request without any cost": + "تقدر ترفض طلب من دون أي تكلفة", + "You can now receive orders": "الآن تقدر تستلم طلبات", + "You can only use one device at a time. This device will now be set as your active device.": + "تقدر تستخدم جهاز واحد بوقت واحد. هالجهاز رح يصير جهازك النشط هلق.", + "You can pay for your ride using cash or credit/debit card. You can select your preferred payment method before confirming your ride.": + "تقدر تدفع لرحلتك كاش أو ببطاقة ائتمان/خصم. تقدر تختار طريقة الدفع المفضلة قبل ما تؤكد الرحلة.", + "You can purchase a budget to enable online access through the options listed below": + "تقدر تشتري ميزانية عشان تفعّل الاتصال الأونلاين عبر الخيارات اللي تحت", + "You can purchase a budget to enable online access through the options listed below.": + "تقدر تشتري ميزانية عشان تفعّل الاتصال الأونلاين عبر الخيارات اللي تحت.", + "You can resend in": "تقدر تعيد الإرسال بـ", + "You can share the Intaleq App with your friends and earn rewards for rides they take using your code": + "تقدر تشارك تطبيق انطلق مع صحابك وتكسب مكافآت عن الرحلات اللي يعملوها بكودك", + "You can upgrade price to may driver accept your order": + "تقدر ترفع السعر عشان يقبل سائق طلبك", + "You canceled VIP trip": "ألغيت رحلة VIP", + "You cannot call the passenger due to policy violations": + "ما تقدر تتصل بالراكب بسبب انتهاكات السياسة", + "You deserve the gift": "أنت تستحق الهدية", + "You do not have enough money in your SAFAR wallet": + "ما عندك فلوس كافية بمحفظة سفرك", + "You dont Add Emergency Phone Yet!": "ما ضفت رقم طوارئ لسا!", + "You dont have Points": "ما عندك نقاط", + "You dont have invitation code": "ما عندك كود دعوة", + "You dont have money in your Wallet": "ما عندك فلوس بمحفظتك", + "You dont have money in your Wallet or you should less transfer 5 LE to activate": + "ما عندك فلوس بمحفظتك أو لازم تحول أقل من 5 ل.م عشان تفعّل", + "You gained": "ربحت", + "You have": "عندك", + "You have 200": "عندك 200", + "You have 500": "عندك 500", + "You have already received your gift for inviting": + "استلمت هديتك للدعوة من قبل", + "You have already used this promo code.": + "استخدمت هالكود الترويجي من قبل.", + "You have arrived at your destination": "وصلت لوجهتك", + "You have arrived at your destination, @name": "وصلت لوجهتك، @name", + "You have call from driver": "عندك مكالمة من السائق", + "You have chosen not to proceed with health insurance.": + "اخترت ما تكمل مع التأمين الصحي.", + "You have copied the promo code.": "نسخت الكود الترويجي.", + "You have earned 20": "ربحت 20", + "You have exceeded the allowed cancellation limit (3 times).\nYou cannot work until the penalty expires.": + "تجاوزت الحد المسموح للإلغاء (3 مرات).\nما تقدر تشتغل لحتى تنتهي العقوبة.", + "You have finished all times": "خلصت كل الأوقات", + "You have gift 300 L.E": "عندك هدية 300 ل.م", + "You have gift 300 SYP": "عندك هدية 300 ل.س", + "You have gift 30000 SYP": "عندك هدية 30000 ل.س", + "You have got a gift": "وصلتك هدية", + "You have got a gift for invitation": "وصلتك هدية للدعوة", + "You have in account": "عندك بالحساب", + "You have promo!": "عندك عرض ترويجي!", + "You have received a gift token!": "استلمت رمز هدية!", + "You have successfully charged your account": "شحنت حسابك بنجاح", + "You have successfully opted for health insurance.": + "اخترت التأمين الصحي بنجاح.", + "You have transfer to your wallet from": "تم التحويل لمحفظتك من", + "You have transferred to your wallet from": "تم التحويل لمحفظتك من", + "You have upload Criminal documents": "رفعت وثائق جنائية", + "You must Verify email !.": "لازم توثّق بريدك الإلكتروني !.", + "You must be charge your Account": "لازم تشحن حسابك", + "You must be recharge your Account": "لازم تعيد شحن حسابك", + "You must restart the app to change the language.": + "لازم تعيد تشغيل التطبيق عشان تغير اللغة.", + "You need to be closer to the pickup location.": + "لازم تكون أقرب لموقع الالتقاط.", + "You need to complete 500 trips": "لازم تكمل 500 رحلة", + "You should complete 500 trips to unlock this feature.": + "لازم تكمل 500 رحلة عشان تفتح هالميزة.", + "You should complete 600 trips": "لازم تكمل 600 رحلة", + "You should have upload it .": "لازم تكون رفعتها.", + "You should renew Driver license": "لازم تجدّد رخصة السائق", + "You should restart app to change language": + "لازم تعيد تشغيل التطبيق عشان تغير اللغة", + "You should select one": "لازم تختار واحد", + "You should select your country": "لازم تختار بلدك", + "You should use Touch ID or Face ID to confirm payment": + "لازم تستخدم بصمة اللمس أو الوجه لتأكيد الدفع", + "You trip distance is": "مسافة رحلتك هي", + "You will arrive to your destination after": "رح توصل لوجهتك بعد", + "You will arrive to your destination after timer end.": + "رح توصل لوجهتك بعد ما يخلص العداد.", + "You will be charged for the cost of the driver coming to your location.": + "رح يتحسب عليك تكلفة وصول السائق لموقعك.", + "You will be pay the cost to driver or we will get it from you on next trip": + "رح تدفع التكلفة للسائق أو بنخصمها من رحلتك الجاية", + "You will be thier in": "رح توصل هناك بـ", + "You will cancel registration": "رح تلغي التسجيل", + "You will choose allow all the time to be ready receive orders": + "رح تختار السماح دايماً عشان تكون جاهز تستلم طلبات", + "You will choose one of above !": "رح تختار واحد من فوق!", + "You will get cost of your work for this trip": + "رح تاخد أجرة شغلك بهالرحلة", + "You will need to pay the cost to the driver, or it will be deducted from your next trip": + "لازم تدفع التكلفة للسائق، أو رح تنخصم من رحلتك الجاية", + "You will receive a code in SMS message": "رح تستلم كود برسالة SMS", + "You will receive a code in WhatsApp Messenger": + "رح تستلم كود بواتساب", + "You will receive code in sms message": "رح تستلم كود برسالة SMS", + "You will recieve code in sms message": "رح تستلم كود برسالة SMS", + "Your Account is Deleted": "تم حذف حسابك", + "Your Activity": "نشاطك", + "Your Application is Under Review": "طلبك قيد المراجعة", + "Your Budget less than needed": "ميزانيتك أقل من المطلوب", + "Your Choice, Our Priority": "اختيارك، أولويتنا", + "Your Driver Referral Code": "كود دعوة السائق بتاعك", + "Your Earnings": "أرباحك", + "Your Journey Begins Here": "رحلتك بلشت من هون", + "Your Name is Wrong": "اسمك غلط", + "Your Passenger Referral Code": "كود دعوة الراكب بتاعك", + "Your Question": "سؤالك", + "Your Questions": "أسئلتك", + "Your Rewards": "مكافآتك", + "Your Ride Duration is": "مدة رحلتك هي", + "Your Wallet balance is": "رصيد محفظتك هو", + "Your account is temporarily restricted ⛔": "حسابك مقيد مؤقتاً ⛔", + "Your are far from passenger location": "أنت بعيد عن موقع الراكب", + "Your balance is less than the minimum withdrawal amount of {minAmount} S.P.": + "رصيدك أقل من الحد الأدنى للسحب وهو {minAmount} ل.س.", + "Your complaint has been submitted.": "تم إرسال شكواك.", + "Your data will be erased after 2 weeks": + "بياناتك رح تنمسح بعد أسبوعين", + "Your driver’s license and/or car tax has expired. Please renew them before proceeding.": + "رخصة سيارتك و/أو ضريبة السيارة منتهية. تفضل تجددها قبل ما تكمل.", + "Your driver’s license has expired.": "رخصة سيارتك منتهية.", + "Your driver’s license has expired. Please renew it before proceeding.": + "رخصة سيارتك منتهية. تفضل تجددها قبل ما تكمل.", + "Your driver’s license has expired. Please renew it.": + "رخصة سيارتك منتهية. تفضل تجددها.", + "Your email address": "عنوان بريدك الإلكتروني", + "Your email not updated yet": "بريدك ما انحدث لسا", + "Your fee is": "أجرتك هي", + "Your invite code was successfully applied!": + "تم تطبيق كود الدعوة بنجاح!", + "Your journey starts here": "رحلتك بلشت من هون", + "Your location is being tracked in the background.": + "موقعك عم يتتبع بالخلفية.", + "Your name": "اسمك", + "Your order is being prepared": "طلبك عم يتجهّز", + "Your order sent to drivers": "تم إرسال طلبك للسواقين", + "Your password": "كلمة مرورك", + "Your past trips will appear here.": "رحلاتك السابقة رح تظهر هون.", + "Your payment was successful.": "تم دفعك بنجاح.", + "Your personal invitation code is:": "كود الدعوة الشخصي بتاعك هو:", + "Your rating has been submitted.": "تم إرسال تقييمك.", + "Your total balance:": "رصيدك الإجمالي:", + "Your trip cost is": "تكلفة رحلتك هي", + "Your trip distance is": "مسافة رحلتك هي", + "Your trip is scheduled": "رحلتك مجدولة", + "Your valuable feedback helps us improve our service quality.": + "تعليقك القيم بيساعدنا نحسّن جودة خدمتنا.", + "\$": "\$", + "\nWe also prioritize affordability, offering competitive pricing to make your rides accessible.": + "\nكمان بنعطي أولوية للتوفير، بنقدم أسعار منافسة عشان الرحلات تكون بمتناول إيدك.", + "accepted": "انقبلت", + "accepted your order": "قبل طلبك", + "accepted your order at price": "قبل طلبك بسعر", + "age": "العمر", + "agreement subtitle": "عنوان الاتفاقية", + "airport": "المطار", + "alert": "تنبيه", + "amount": "المبلغ", + "amount_paid": "المبلغ المدفوع", + "an error occurred": "صار خطأ", + "and I have a trip on": "وعندي رحلة بـ", + "and acknowledge our": "وبوافق على", + "app_description": "وصف التطبيق", + "ar": "ar", + "ar-gulf": "ar-gulf", + "ar-ma": "ar-ma", + "arrival time to reach your point": "وقت الوصول لنقطتك", + "attach audio of complain": "أرفق صوت الشكوى", + "attach correct audio": "أرفق الصوت الصحيح", + "be sure": "تأكد", + "before": "قبل", + "birthdate": "تاريخ الميلاد", + "bonus_added": "البونص المضاف", + "by": "بواسطة", + "by this list below": "بهالقائمة تحت", + "cancel": "إلغاء", + "car_back": "خلفي السيارة", + "car_color": "لون السيارة", + "car_front": "أمامي السيارة", + "car_license_back": "الجانب الخلفي لرخصة السيارة", + "car_license_front": "الجانب الأمامي لرخصة السيارة", + "car_model": "موديل السيارة", + "car_plate": "لوحة السيارة", + "change device": "تغيير الجهاز", + "color.beige": "بيج", + "color.black": "أسود", + "color.blue": "أزرق", + "color.bronze": "برونزي", + "color.brown": "بني", + "color.burgundy": "نبيتي", + "color.champagne": "شمبانيا", + "color.darkGreen": "أخضر غامق", + "color.gold": "ذهبي", + "color.gray": "رمادي", + "color.green": "أخضر", + "color.gunmetal": "رمادي معدني", + "color.maroon": "كستنائي", + "color.navy": "كحلي", + "color.orange": "برتقالي", + "color.purple": "بنفسجي", + "color.red": "أحمر", + "color.silver": "فضي", + "color.white": "أبيض", + "color.yellow": "أصفر", + "committed_to_safety": "ملتزم بالسلامة", + "complete profile subtitle": "عنوان إكمال الملف", + "complete registration button": "زر إكمال التسجيل", + "complete, you can claim your gift": "اكمل، تقدر تستلم هديتك", + "connection_failed": "فشل الاتصال", + "copied to clipboard": "تم النسخ للحافظة", + "cost is": "التكلفة هي", + "created time": "وقت الإنشاء", + "de": "de", + "default_tone": "النغمة الافتراضية", + "deleted": "تم الحذف", + "detected": "تم الكشف عنه", + "distance is": "المسافة هي", + "driver_license": "رخصة القيادة", + "duration is": "المدة هي", + "e.g., 0912345678": "مثال: 0912345678", + "education": "التعليم", + "el": "el", + "email optional label": "تسمية البريد الاختياري", + "end": "نهاية", + "enter otp validation": "أدخل تحقق OTP", + "error": "خطأ", + "error_processing_document": "خطأ بمعالجة المستند", + "es": "es", + "expected": "متوقع", + "expiration_date": "تاريخ الانتهاء", + "fa": "fa", + "face detect": "كشف الوجه", + "failed to send otp": "فشل إرسال OTP", + "false": "خطأ", + "first name label": "تسمية الاسم الأول", + "first name required": "الاسم الأول مطلوب", + "for": "لـ", + "for your first registration!": "لتسجيلك الأول!", + "fr": "fr", + "from 07:30 till 10:30 (Thursday, Friday, Saturday, Monday)": + "من 7:30 لـ 10:30 (خميس، جمعة، سبت، اثنين)", + "from 12:00 till 15:00 (Thursday, Friday, Saturday, Monday)": + "من 12:00 لـ 15:00 (خميس، جمعة، سبت، اثنين)", + "from 23:59 till 05:30": "من 23:59 لـ 5:30", + "from 3 times Take Attention": "انتبه بعد 3 مرات", + "from your favorites": "من مفضلاتك", + "from your list": "من قائمتك", + "fromBudget": "من الميزانية", + "gender": "الجنس", + "get_a_ride": "احصل على رحلة", + "get_to_destination": "الوصول للوجهة", + "go to your passenger location before": "روح لموقع الراكب قبل", + "go to your passenger location before\nPassenger cancel trip": + "روح لموقع الراكب قبل ما يلغي الراكب الرحلة", + "has been added to your budget": "تمت إضافته لميزانيتك", + "has completed": "اكتمل", + "hi": "هلا", + "hour": "ساعة", + "hours before trying again.": "ساعات قبل ما تجرب مرة تانية.", + "i agree": "بوافق", + "id_back": "خلفي الهوية", + "id_card_back": "الجانب الخلفي لبطاقة الهوية", + "id_card_front": "الجانب الأمامي لبطاقة الهوية", + "id_front": "أمامي الهوية", + "if you dont have account": "إذا ما عندك حساب", + "if you want help you can email us here": + "إذا بدك مساعدة تقدر تراسلنا هون", + "image verified": "تم التحقق من الصورة", + "in your": "بـ", + "incorrect_document_message": "رسالة المستند غير صحيح", + "incorrect_document_title": "وثيقة غير صحيحة", + "insert amount": "أدخل المبلغ", + "is driving a": "عم يسوق", + "is reviewing your order. They may need more information or a higher price.": + "عم يراجع طلبك. ممكن يحتاجوا معلومات أكثر أو سعر أعلى.", + "it": "it", + "joined": "انضم", + "kilometer": "كيلومتر", + "last name label": "تسمية اسم العائلة", + "last name required": "اسم العائلة مطلوب", + "ll let you know when the review is complete.": + "رح نعلمك لما تكتمل المراجعة.", + "login or register subtitle": "عنوان تسجيل الدخول أو التسجيل", + "m": "م", + "m at the agreed-upon location": "بالموقع المتفق عليه", + "m inviting you to try Intaleq.": "بدعوك تجرب انطلق.", + "m waiting for you": "عم أستناك", + "m waiting for you at the specified location.": + "عم أستناك بالموقع المحدد.", + "message From Driver": "رسالة من السائق", + "message From passenger": "رسالة من الراكب", + "min": "دقيقة", + "minute": "دقيقة", + "minutes before trying again.": "دقايق قبل ما تجرب مرة تانية.", + "model :": "موديل :", + "moi\\": "moi\\", + "mtn": "mtn", + "my location": "موقعي", + "non_id_card_back": "خلفي غير الهوية", + "non_id_card_front": "أمامي غير الهوية", + "not similar": "غير متشابه", + "of": "من", + "on": "على", + "one last step title": "عنوان الخطوة الأخيرة", + "otp sent subtitle": "عنوان إرسال OTP", + "otp sent success": "تم إرسال OTP بنجاح", + "otp verification failed": "فشل التحقق من OTP", + "passenger agreement": "اتفاقية الراكب", + "passenger amount to me": "مبلغ الراكب لي", + "payment_success": "تمت العملية بنجاح", + "pending": "قيد الانتظار", + "phone number label": "تسمية رقم الهاتف", + "phone number of driver": "رقم هاتف السائق", + "phone number required": "رقم الهاتف مطلوب", + "please go to picker location exactly": + "تفضل روح لموقع الالتقاط بالضبط", + "please order now": "تفضل اطلب هلق", + "please wait till driver accept your order": + "تفضل استنى لحتى يقبل السائق طلبك", + "points": "نقطة", + "price is": "السعر هو", + "privacy policy": "سياسة الخصوصية", + "rating_count": "عدد التقييمات", + "rating_driver": "تقييم السائق", + "re eligible for a special offer!": "رح تكون مؤهل لعرض خاص!", + "registration failed": "فشل التسجيل", + "registration_date": "تاريخ التسجيل", + "reject your order.": "رفض طلبك.", + "rejected": "مرفوض", + "remaining": "المتبقي", + "reviews": "المراجعات", + "rides": "الرحلات", + "ru": "ru", + "s Degree": "درجة", + "s Intaleq account.": "حساب انطلق.", + "s Intaleq account.\nStore your money with us and receive it in your bank as a monthly salary.": + "ميزات محفظة انطلق:\nتحويل الأموال عدة مرات.\nالتحويل لأي شخص.\nإجراء عمليات شراء.\nشحن حسابك.\nشحن حساب انطلق لصديق.\nخزّن فلوسك عنا واستلمها ببنكك كراتب شهري.", + "s License": "رخصة", + "s Personal Information": "المعلومات الشخصية", + "s Promo": "عرض", + "s Promos": "عروض", + "s Response": "رد", + "s Terms & Review Privacy Notice": "شروط ومراجعة إشعار الخصوصية", + "s heavy traffic here. Can you suggest an alternate pickup point?": + "في زحمة كتير هون. تقترّح نقطة التقاط تانية؟", + "s license does not match the one on your ID document. Please verify and provide the correct documents.": + "رخصته ما بتتطابق مع الهوية. تفضل تحقق وقدّم الوثائق الصحيحة.", + "s license, ID document, and car registration document. Our AI system will instantly review and verify their authenticity in just 2-3 minutes. If your documents are approved, you can start working as a driver on the Intaleq app. Please note, submitting fraudulent documents is a serious offense and may result in immediate termination and legal consequences.": + "رخصته، الهوية، ورخصة السيارة. نظام الذكاء الاصطناعي رح يراجعها ويوثّقها بدقيقتين لـ 3. إذا انقبلت، تقبل تشتغل كسائق بانطلاق. انتبه، تزوير وثائق جريمة خطيرة وبتسبب فصل فوري وعواقب قانونية.", + "s license. Please verify and provide the correct documents.": + "رخصته. تفضل تحقق وقدّم الوثائق الصحيحة.", + "s phone": "هاتف", + "s pioneering ride-sharing service, proudly developed by Arabian and local owners. We prioritize being near you – both our valued passengers and our dedicated captains.": + "خدمة مشاركة الرحلات الرائدة، مطورة بفخر من ملاك عرب ومحليين. بنعطي أولوية للقرب منك – ركابنا وسواقينا.", + "s time to check the Intaleq app!": "وقت تتفقد تطبيق انطلق!", + "safe_and_comfortable": "آمن ومريح", + "scams operations": "عمليات احتيال", + "scan Car License.": "امسح رخصة السيارة.", + "seconds": "ثواني", + "security_warning": "تحذير أمني", + "send otp button": "زر إرسال OTP", + "server error try again": "خطأ بالخادم جرّب مرة تانية", + "server_error": "خطأ بالخادم", + "server_error_message": "صار خطأ بالاتصال بالخادم", + "similar": "متشابه", + "start": "ابدأ", + "string": "نص", + "syriatel": "سيريتل", + "t an Egyptian phone number": "رقم هاتف مصري", + "t be late": "ما تتأخر", + "t cancel!": "ما تلغي!", + "t continue with us .": "ما تقدر تكمل معنا.", + "t continue with us .\nYou should renew Driver license": + "ما تقدر تكمل معنا.\nلازم تجدّد رخصة السائق", + "t find a valid route to this destination. Please try selecting a different point.": + "ما لقينا طريق صالح لهالوجهة. تفضل جرّب تختار نقطة تانية.", + "t forget your personal belongings.": "ما تنسى حاجاتك الشخصية.", + "t forget your ride!": "ما تنسى رحلتك!", + "t found any drivers yet. Consider increasing your trip fee to make your offer more attractive to drivers.": + "ما لقينا سواقين لسا. فكّر ترفع رسوم رحلتك عشان تجذب سواقين أكثر.", + "t have a code": "ما عندك كود", + "t have a phone number.": "ما عندك رقم هاتف.", + "t have a reason": "ما عندك سبب", + "t have account": "ما عندك حساب", + "t have enough money in your Intaleq wallet": + "ما عندك فلوس كافية بمحفظة انطلق", + "t moved sufficiently!": "ما تحركت بشكل كافي!", + "t need a ride anymore": "ما بدك رحلة بعد هيك", + "t return to use app after 1 month": "ما ترجع تستخدم التطبيق بعد شهر", + "t start trip if not": "ما تبدأ الرحلة إذا ما", + "t start trip if passenger not in your car": + "لا تبدأ الرحلة إذا الراكب مش بسيارتك", + "terms of use": "شروط الاستخدام", + "the 300 points equal 300 L.E": "الـ 300 نقطة بتساوي 300 ل.م", + "the 300 points equal 300 L.E for you": + "الـ 300 نقطة بتساوي 300 ل.م لك", + "the 300 points equal 300 L.E for you\nSo go and gain your money": + "الـ 300 نقطة بتساوي 300 ل.م لك\nيلا استلم فلوسك", + "the 3000 points equal 3000 L.E": "الـ 3000 نقطة بتساوي 3000 ل.م", + "the 3000 points equal 3000 L.E for you": + "الـ 3000 نقطة بتساوي 3000 ل.م لك", + "the 500 points equal 30 JOD": "الـ 500 نقطة بتساوي 30 د.أ", + "the 500 points equal 30 JOD for you": + "الـ 500 نقطة بتساوي 30 د.أ لك", + "the 500 points equal 30 JOD for you\nSo go and gain your money": + "الـ 500 نقطة بتساوي 30 د.أ لك\nيلا استلم فلوسك", + "this is count of your all trips in the Afternoon promo today from 3:00pm to 6:00 pm": + "هالعدد لكل رحلاتك بعرض الظهيرة اليوم من 3:00 م لـ 6:00 م", + "this is count of your all trips in the Afternoon promo today from 3:00pm-6:00 pm": + "هالعدد لكل رحلاتك بعرض الظهيرة اليوم من 3:00 م لـ 6:00 م", + "this is count of your all trips in the morning promo today from 7:00am to 10:00am": + "هالعدد لكل رحلاتك بعرض الصباح اليوم من 7:00 ص لـ 10:00 ص", + "this is count of your all trips in the morning promo today from 7:00am-10:00am": + "هالعدد لكل رحلاتك بعرض الصباح اليوم من 7:00 ص لـ 10:00 ص", + "this will delete all files from your device": + "هالشي رح يحذف كل الملفات من جهازك", + "time Selected": "الوقت المختار", + "tips": "الإكراميات", + "to": "إلى", + "token change": "تغيير الرمز", + "token updated": "تم تحديث الرمز", + "towards": "باتجاه", + "tr": "tr", + "transaction_failed": "فشلت العملية", + "transaction_id": "رقم العملية", + "transfer Successful": "نجاح التحويل", + "trips": "الرحلات", + "true": "صحيح", + "type here": "اكتب هون", + "unknown_document": "وثيقة غير معروفة", + "upgrade price": "رفع السعر", + "uploaded sucssefuly": "تم الرفع بنجاح", + "ve arrived.": "وصلت.", + "ve been trying to reach you but your phone is off.": + "كنت عم حاول توصلك بس هاتفك مقفول.", + "verify and continue button": "زر التحقق والمتابعة", + "verify your number title": "عنوان التحقق من رقمك", + "vin": "رقم الهيكل", + "wait 1 minute to receive message": + "استنى دقيقة وحدة عشان تستلم الرسالة", + "wallet due to a previous trip.": "المحفظة بسبب رحلة سابقة.", + "wallet_credited_message": "تم إضافة", + "wallet_updated": "تم تحديث المحفظة", + "welcome to intaleq": "أهلاً بانطلاق", + "welcome user": "أهلاً بالمستخدم", + "welcome_message": "رسالة الترحيب", + "welcome_to_intaleq": "أهلاً بانطلاق", + "with type": "بالنوع", + "witout zero": "بدون صفر", + "write Color for your car": "اكتب لون سيارتك", + "write Expiration Date for your car": "اكتب تاريخ انتهاء سيارتك", + "write Make for your car": "اكتب ماركة سيارتك", + "write Model for your car": "اكتب موديل سيارتك", + "write Year for your car": "اكتب سنة سيارتك", + "write comment here": "اكتب تعليق هون", + "write vin for your car": "اكتب رقم هيكل سيارتك", + "year :": "سنة :", + "you are not moved yet !": "ما تحركت لسا!", + "you can buy": "تقدر تشتري", + "you can show video how to setup": "تقدر تشوف فيديو كيف تضبط", + "you canceled order": "ألغيت الطلب", + "you dont have accepted ride": "ما عندك رحلة مقبولة", + "you gain": "تكسب", + "you have a negative balance of": "عندك رصيد سلبي بقيمة", + "you must insert token code": "لازم تدخل رمز الرمز", + "you will pay to Driver": "رح تدفع للسائق", + "you will pay to Driver you will be pay the cost of driver time look to your Intaleq Wallet": + "رح تدفع للسائق هتدفع تكلفة وقت السائق شوف محفظة انطلق بتاعتك", + "you will use this device?": "رح تستخدم هالجهاز؟", + "your ride is Accepted": "رحلتك انقبلت", + "your ride is applied": "تم تقديم رحلتك", + "zh": "zh", + "أدخل رقم محفظتك": "أدخل رقم محفظتك", + "أوافق": "بوافق", + "إلغاء": "إلغاء", + "إلى": "إلى", + "اضغط للاستماع": "اضغط عشان تسمع", + "الاسم الكامل": "الاسم الكامل", + "التالي": "التالي", + "التقط صورة الوجه الخلفي للرخصة": "التقط صورة للوجه الخلفي للرخصة", + "التقط صورة لخلفية رخصة المركبة": "التقط صورة لظهر رخصة المركبة", + "التقط صورة لرخصة القيادة": "التقط صورة لرخصة القيادة", + "التقط صورة لصحيفة الحالة الجنائية": + "التقط صورة لصحيفة الحالة الجنائية", + "التقط صورة للوجه الأمامي للهوية": "التقط صورة للوجه الأمامي للهوية", + "التقط صورة للوجه الخلفي للهوية": "التقط صورة للوجه الخلفي للهوية", + "التقط صورة لوجه رخصة المركبة": "التقط صورة لوجه رخصة المركبة", + "الرصيد الحالي": "الرصيد الحالي", + "الرقم القومي": "الرقم القومي", + "السعر": "السعر", + "المبلغ في محفظتك أقل من الحد الأدنى للسحب وهو": + "المبلغ بمحفظتك أقل من الحد الأدنى للسحب وهو", + "المسافة": "المسافة", + "الوقت المتبقي": "الوقت المتبقي", + "بطاقة الهوية – الوجه الأمامي": "بطاقة الهوية – الوجه الأمامي", + "بطاقة الهوية – الوجه الخلفي": "بطاقة الهوية – الوجه الخلفي", + "تأكيد": "تأكيد", + "تم إلغاء الرحلة": "تم إلغاء الرحلة", + "تنبيه": "تنبيه", + "ثانية": "ثانية", + "رخصة القيادة – الوجه الأمامي": "رخصة القيادة – الوجه الأمامي", + "رخصة القيادة – الوجه الخلفي": "رخصة القيادة – الوجه الخلفي", + "رخصة المركبة – الوجه الأمامي": "رخصة المركبة – الوجه الأمامي", + "رخصة المركبة – الوجه الخلفي": "رخصة المركبة – الوجه الخلفي", + "رصيدك الإجمالي:": "رصيدك الإجمالي:", + "رفض": "رفض", + "سحب الرصيد": "سحب الرصيد", + "سنة الميلاد": "سنة الميلاد", + "سيتم إلغاء التسجيل": "رح يلغى التسجيل", + "شاهد فيديو الشرح": "شاهد فيديو الشرح", + "صحيفة الحالة الجنائية": "صحيفة الحالة الجنائية", + "طريقة الدفع:": "طريقة الدفع:", + "طلب جديد": "طلب جديد", + "قبول": "قبول", + "ل.س": "ل.س", + "للوصول": "للوصول", + "مثال: 0912345678": "مثال: 0912345678", + "مدة الرحلة: \${order.tripDurationMinutes} دقيقة": + "مدة الرحلة: \${order.tripDurationMinutes} دقيقة", + "من": "من", + "موافق": "موافق", + "نتيجة الفحص": "نتيجة الفحص", + "هل تريد سحب أرباحك؟": "بدك تسحب أرباحك؟", + "ُExpire Date": "ُExpire Date", + "⚠️ You need to choose an amount!": "⚠️ لازم تختار مبلغ!", + "💰 Pay with Wallet": "💰 ادفع من المحفظة", + "💳 Pay with Credit Card": "💳 ادفع ببطاقة ائتمان", + "Wait for timer": "استنى ليخلص الوقت", + "Due to excessive cancellations (3 times), receiving orders has been suspended for 4 hours.": + "بسبب كثرة الإلغاءات (3 مرات)، تم إيقاف استقبال الطلبات لمدة 4 ساعات.", + "No route points found": "ما لقينا نقاط للمسار", + "Failed to process route points": "فشلنا بمعالجة نقاط المسار", + "You must be closer than 100 meters to arrive": + "لازم تكون أقرب من 100 متر مشان توصل", + "A connection error occurred": "صار خطأ بالاتصال", + "Improve app performance": "تحسين أداء التطبيق", + "To ensure the best experience, we suggest adjusting the settings to suit your device. Would you like to proceed?": + "مشان نضمنلك أحسن تجربة، بنقترح تعديل الإعدادات لتناسب جهازك. بدك نكمل؟", + "Yes, optimize": "إي، حسن الأداء", + "Your device provides excellent performance": + "جهازك بيعطيك أداء ممتاز", + "Your device is good and very suitable": "جهازك جيد ومناسب كتير", + "Compatible, you may notice some slowness": + "متوافق، بس ممكن تلاحظ شوية بطء", + "The app may not work optimally": "ممكن التطبيق ما يشتغل بأحسن شكل", + "Device Compatibility": "توافق الجهاز", + "Continue to App": "أكمل للتطبيق", + "Place added successfully! Thanks for your contribution.": + "تمت إضافة المكان بنجاح! شكراً لمساهمتك.", + "Failed to add place. Please try again later.": + "تعذر إضافة المكان. يرجى المحاولة لاحقاً.", + "An error occurred while connecting to the server.": + "حدث خطأ أثناء الاتصال بالخادم.", + "Start Navigation?": "بدء الملاحة؟", + "Do you want to go to this location?": "بدك تروح لهالموقع؟", + "Go Now": "اذهب الآن", + "Selected Location": "الموقع المحدد", + "Add Balance": "إضافة رصيد", + "Select how you want to charge your account": + "اختر كيف تريد شحن حسابك", + "Recharge Balance Packages": "باقات شحن الرصيد", + "Select Payment Method": "اختر طريقة الدفع", + "Amount to charge:": "المبلغ المطلوب شحنه:", + "Price:": "السعر:", + "Recharge Balance": "شحن الرصيد", + "Debit Card": "بطاقة دفع", + "Syriatel Cash": "سيريتل كاش", + "Sham Cash": "شام كاش", + "Confirm payment with biometrics": "تأكيد الدفع بالبصمة", + "Wallet Phone Number": "رقم هاتف المحفظة", + "Confirm": "تأكيد", + "PTS": "نقطة", + "SYP": "ل.س", + "You are buying": "أنت تقوم بشراء", + "for": "بـ", + "Points": "نقاط", + "Pay from my budget": "الدفع من الرصيد المتاح", + "Use Touch ID or Face ID to confirm payment": + "استخدم بصمة الإصبع أو الوجه لتأكيد الدفع", + "Your Budget less than needed": "رصيدك أقل من المطلوب", + "Available Balance": "الرصيد المتاح", + "Total Rides": "إجمالي الرحلات", + "OrderId": "رقم الطلب", + "Pickup Location": "موقع الالتقاط", + "Destination Location": "موقع الوجهة", + "Completed": "مكتملة", + "Refused": "مرفوضة", + "Cancelled": "ملغية", + "Ride History": "سجل الرحلات", + "Total Earnings": "إجمالي الأرباح", + "Cash Earnings": "أرباح نقداً", + "Card Earnings": "أرباح البطاقة", + "Driver Balance": "رصيد السائق", + "Pay from my budget": "الدفع من الرصيد المتاح", + "You have in account": "لديك في الحساب", + "Select how you want to charge your account": + "اختر كيف تريد شحن حسابك", + "Add Balance": "إضافة رصيد", + "SYP": "ل.س", + "Your completed trips will appear here": "ستظهر رحلاتك المكتملة هنا", + "Cancelled by Passenger": "تم الإلغاء بواسطة الراكب", + }, + }; +} diff --git a/siro_driver/lib/controller/notification/notification_captain_controller.dart b/siro_driver/lib/controller/notification/notification_captain_controller.dart new file mode 100755 index 0000000..e31be1a --- /dev/null +++ b/siro_driver/lib/controller/notification/notification_captain_controller.dart @@ -0,0 +1,91 @@ +import 'dart:convert'; + +import 'package:flutter/cupertino.dart'; +import 'package:get/get.dart'; +import 'package:siro_driver/constant/style.dart'; +import 'package:siro_driver/views/widgets/elevated_btn.dart'; +import 'package:siro_driver/views/widgets/mydialoug.dart'; + +import '../../constant/box_name.dart'; +import '../../constant/links.dart'; +import '../../main.dart'; +import '../functions/crud.dart'; + +class NotificationCaptainController extends GetxController { + bool isLoading = false; + Map notificationData = {}; + + getNotifications() async { + isLoading = true; + update(); + var res = await CRUD().get( + link: AppLink.getNotificationCaptain, + payload: {'driverID': box.read(BoxName.driverID)}); + if (res == "failure") { + // MyDialog().getDialog('There is no notification yet'.tr, '', () { + // Get.back(); + // Get.back(); + // }); + Get.dialog( + CupertinoAlertDialog( + title: Column( + children: [ + const Icon( + CupertinoIcons.bell_slash_fill, + color: CupertinoColors.systemGrey, + size: 40, + ), + const SizedBox(height: 12), + Text( + 'There is no notification yet'.tr, + style: const TextStyle( + fontSize: 17, + fontWeight: FontWeight.w600, + ), + ), + ], + ), + actions: [ + CupertinoDialogAction( + onPressed: () { + Get.back(); + Get.back(); + }, + child: Text('Back'.tr), + ), + ], + ), + barrierDismissible: true, + transitionCurve: Curves.easeOutBack, + transitionDuration: const Duration(milliseconds: 200), + ); + } + notificationData = jsonDecode(res); + // sql.insertData(notificationData['message'], TableName.captainNotification); + + isLoading = false; + update(); + } + + updateNotification(String id) async { + await CRUD().post( + link: AppLink.updateNotificationCaptain, + payload: {'isShown': 'true', 'id': id}, + ); + } + + addNotificationCaptain(String driverId, title, body, isPin) async { + await CRUD().post(link: AppLink.addNotificationCaptain, payload: { + 'driverID': driverId, + 'title': title, + 'body': body, + 'isPin': isPin + }); + } + + @override + void onInit() { + getNotifications(); + super.onInit(); + } +} diff --git a/siro_driver/lib/controller/notification/passenger_notification_controller.dart b/siro_driver/lib/controller/notification/passenger_notification_controller.dart new file mode 100755 index 0000000..86da174 --- /dev/null +++ b/siro_driver/lib/controller/notification/passenger_notification_controller.dart @@ -0,0 +1,74 @@ +import 'dart:convert'; + +import 'package:get/get.dart'; +import 'package:siro_driver/controller/firebase/firbase_messge.dart'; + +import '../../constant/box_name.dart'; +import '../../constant/links.dart'; +import '../../constant/style.dart'; +import '../../main.dart'; +import '../../views/widgets/elevated_btn.dart'; +import '../firebase/notification_service.dart'; +import '../functions/crud.dart'; + +class PassengerNotificationController extends GetxController { + bool isloading = false; + Map notificationData = {}; + + getNotifications() async { + isloading = true; + update(); + var res = await CRUD().get( + link: AppLink.getNotificationPassenger, + payload: {'passenger_id': box.read(BoxName.passengerID)}); + if (res == "failure") { + Get.defaultDialog( + title: 'There is no notification yet'.tr, + titleStyle: AppStyle.title, + middleText: '', + confirm: MyElevatedButton( + title: 'Back', + onPressed: () { + Get.back(); + Get.back(); + })); + } + notificationData = jsonDecode(res); + // sql.insertData(notificationData['message'], TableName.captainNotification); + + isloading = false; + update(); + } + + updateNotification(String id) async { + await CRUD().post( + link: AppLink.updateNotificationPassenger, + payload: {'isShown': 'true', 'id': id}, + ); + Get.back(); + getNotifications(); + } + + addNotificationToPassenger(String title, body) async { + var res = CRUD().post(link: AppLink.addNotificationPassenger, payload: { + 'title': title, + 'body': body, + }); + // FirebaseMessagesController() + // .sendNotificationToPassengerToken(title, body, 'token', [], 'ding.wav'); + NotificationService.sendNotification( + target: 'token'.toString(), + title: title.tr, + body: body, + isTopic: false, // Important: this is a token + tone: 'ding', + driverList: [], category: title, + ); + } + + @override + void onInit() { + getNotifications(); + super.onInit(); + } +} diff --git a/siro_driver/lib/controller/notification/ride_available_controller.dart b/siro_driver/lib/controller/notification/ride_available_controller.dart new file mode 100755 index 0000000..d961fd2 --- /dev/null +++ b/siro_driver/lib/controller/notification/ride_available_controller.dart @@ -0,0 +1,178 @@ +import 'dart:convert'; +import 'package:flutter/material.dart'; +import 'package:get/get.dart'; +import 'package:just_audio/just_audio.dart'; // لتشغيل صوت عند وصول رحلة + +import '../../constant/box_name.dart'; +import '../../constant/links.dart'; +import '../../main.dart'; // للوصول لـ box +import '../functions/crud.dart'; +import '../functions/location_controller.dart'; + +class RideAvailableController extends GetxController { + bool isLoading = false; + + // RxList: أي تغيير هنا سينعكس فوراً على الشاشة + RxList> availableRides = >[].obs; + + DateTime? _lastFetchTime; + static const _cacheDuration = Duration(seconds: 5); // تقليل مدة الكاش قليلاً + + // مشغل الصوت + final AudioPlayer _audioPlayer = AudioPlayer(); + + @override + void onInit() { + super.onInit(); + + // 1. جلب القائمة الأولية من السيرفر (HTTP) + getRideAvailable(forceRefresh: true); + + // 2. تفعيل الاستماع المباشر للتحديثات (Socket) + _initSocketListeners(); + } + + @override + void onClose() { + // تنظيف الموارد عند الخروج + var socket = Get.find().socket; + socket?.off('market_new_ride'); + socket?.off('ride_taken'); // تم توحيد الحدث لـ ride_taken + _audioPlayer.dispose(); + super.onClose(); + } + + // ======================================================================== + // 1. جلب الرحلات (HTTP Request) - الطريقة الجديدة (Lat/Lng) + // ======================================================================== + Future getRideAvailable({bool forceRefresh = false}) async { + // منع الطلبات المتكررة السريعة + if (!forceRefresh && + _lastFetchTime != null && + DateTime.now().difference(_lastFetchTime!) < _cacheDuration) { + return; + } + + try { + if (forceRefresh) { + isLoading = true; + update(); + } + + // الحصول على موقع السائق الحالي + final location = Get.find().myLocation; + + // 🔥 التعديل الجوهري: نرسل Lat/Lng فقط بدلاً من Bounds + var payload = { + 'lat': location.latitude.toString(), + 'lng': location.longitude.toString(), + 'radius': '50', // نصف القطر بالكيلومتر (كما حددناه في السيرفر) + }; + + var res = + await CRUD().get(link: AppLink.getRideWaiting, payload: payload); + + isLoading = false; + _lastFetchTime = DateTime.now(); + + if (res != 'failure') { + final decodedResponse = jsonDecode(res); + + if (decodedResponse is Map && decodedResponse['status'] == 'success') { + final rides = decodedResponse['message']; + if (rides is List) { + // تحويل البيانات وتخزينها + availableRides.value = List>.from(rides); + } else { + availableRides.clear(); + } + } else { + availableRides.clear(); + } + } + + update(); // تحديث الواجهة + } catch (e) { + isLoading = false; + update(); + print("Error fetching rides: $e"); + } + } + + // ======================================================================== + // 2. الاستماع للسوكيت (Real-time Updates) ⚡ + // ======================================================================== + void _initSocketListeners() { + var locationCtrl = Get.find(); + var socket = locationCtrl.socket; + + if (socket == null) { + print("⚠️ Socket is null in RideAvailableController"); + return; + } + + // A. عند وصول رحلة جديدة للسوق (market_new_ride) + socket.on('market_new_ride', (data) { + print("🔔 Socket: New Ride Market: $data"); + + if (data != null && data is Map) { + // فلترة: هل نوع السيارة يناسبني؟ + if (_isCarTypeMatch(data['carType'])) { + // منع التكرار (إذا كانت الرحلة موجودة مسبقاً) + bool exists = availableRides + .any((r) => r['id'].toString() == data['id'].toString()); + + if (!exists) { + // إضافة الرحلة لأعلى القائمة + availableRides.insert(0, Map.from(data)); + + // تشغيل صوت تنبيه (Bling) 🎵 + _playNotificationSound(); + } + } + } + }); + + // B. عند أخذ رحلة من قبل سائق آخر (ride_taken) + // هذا الحدث يصل من acceptRide.php عبر السوكيت + socket.on('ride_taken', (data) { + print("🗑️ Socket: Ride Taken: $data"); + if (data != null && data['ride_id'] != null) { + // حذف الرحلة من القائمة فوراً + availableRides.removeWhere( + (r) => r['id'].toString() == data['ride_id'].toString()); + } + }); + } + + // دالة مساعدة للتحقق من نوع السيارة + bool _isCarTypeMatch(String? rideCarType) { + if (rideCarType == null) return false; + String myDriverType = box.read(BoxName.carTypeOfDriver).toString(); + + // منطق التوزيع الهرمي + switch (myDriverType) { + case 'Comfort': + return ['Speed', 'Comfort', 'Fixed Price'].contains(rideCarType); + case 'Speed': + case 'Scooter': + case 'Awfar Car': + return rideCarType == myDriverType; + case 'Lady': + return ['Comfort', 'Speed', 'Lady'].contains(rideCarType); + default: + return true; // احتياطياً + } + } + + // تشغيل صوت التنبيه + Future _playNotificationSound() async { + try { + // تأكد من وجود الملف في assets وإضافته في pubspec.yaml + await _audioPlayer.setAsset('assets/audio/notification.mp3'); + _audioPlayer.play(); + } catch (e) { + // تجاهل الخطأ إذا لم يوجد ملف صوت + } + } +} diff --git a/siro_driver/lib/controller/packages/lingo/lingo_hunter.dart b/siro_driver/lib/controller/packages/lingo/lingo_hunter.dart new file mode 100644 index 0000000..ed20691 --- /dev/null +++ b/siro_driver/lib/controller/packages/lingo/lingo_hunter.dart @@ -0,0 +1,221 @@ +import 'dart:io'; +import 'dart:convert'; + +import '../../../print.dart'; + +abstract class LingoHunter { + /// Extracts translatable strings... + static Future extractAndCreateTranslationFiles({ + required String baseLang, + required List langs, + String? projectDirectory, + String? outputDirectory, + bool translateBaseLang = true, + List? additionalRegExps, + bool overrideRegExps = false, + List fileExtensions = const ['.dart'], + }) async { + // 1. Find project root (improved logic) + String projectRoot; + if (projectDirectory != null) { + // Use provided directory, but check if it's valid + if (!await Directory(projectDirectory).exists()) { + throw ArgumentError( + "The provided projectDirectory '$projectDirectory' does not exist."); + } + projectRoot = projectDirectory; + } else { + projectRoot = await _findProjectRoot(); // Use the corrected function + } + + // 2. Use the project root as output directory if not specified + final String outputDir = outputDirectory ?? projectRoot; + + // 3. Output Directory Verification (Create if necessary) + final Directory outputDirObj = Directory(outputDir); + if (!await outputDirObj.exists()) { + try { + await outputDirObj.create(recursive: true); + } catch (e) { + throw Exception( + "Failed to create output directory: $outputDir. Error: $e"); + } + } + + print("Project root directory: $projectRoot"); + print("Output directory: $outputDir"); + + // 4. Extract translatable strings + final Set strings = await extractStringsFromFlutterProject( + directory: projectRoot, // Use the validated projectRoot + additionalRegExps: additionalRegExps, + overrideRegExps: overrideRegExps, + fileExtensions: fileExtensions, + ); + + // 5. Generate translation files + await _createTranslationFiles( + strings: strings, + outputDirectory: outputDir, + baseLang: baseLang, + langs: langs, + translateBaseLang: translateBaseLang, + ); + + print("Successfully extracted strings and generated translation files."); + } + + /// Finds the project's root directory (corrected) + static Future _findProjectRoot() async { + Directory current = Directory.current; + int maxIterations = 10; // Prevent infinite loop + int count = 0; + + while (count < maxIterations) { + if (await File('${current.path}/pubspec.yaml').exists()) { + return current.path; // Return the directory *containing* pubspec.yaml + } + + if (current.path == current.parent.path) { + break; // Reached root, stop searching + } + + current = current.parent; + count++; + } + + // If `pubspec.yaml` was not found, throw an exception + throw Exception( + "`pubspec.yaml` not found in the current directory or its parents."); + } + + /// Extracts translatable strings (no changes needed here) + static Future> extractStringsFromFlutterProject({ + required String directory, + List? additionalRegExps, + bool overrideRegExps = false, + List fileExtensions = const ['.dart'], + }) async { + // ... (rest of the function remains the same) ... + final List defaultPatterns = [ + RegExp(r'"([^"]+)"\.tr\(\)'), // "string".tr() + RegExp(r"'([^']+)'\.tr\(\)"), // 'string'.tr() + RegExp(r'"([^"]+)"\.tr'), // "string".tr + RegExp(r"'([^']+)'\.tr"), // 'string'.tr + RegExp(r'"([^"]+)"\.tr\(\w+\)'), // "string".tr(context) + RegExp(r"'([^']+)'\.tr\(\w+\)"), // 'string'.tr(context) + RegExp(r'context\.tr\("([^"]+)"\)'), // context.tr("string") + RegExp(r"context\.tr\('([^']+)'\)"), // context.tr('string') + RegExp(r'tr\(\w+, "([^"]+)"\)'), // tr(context, "string") + RegExp(r"tr\(\w+, '([^']+)'\)"), // tr(context, 'string') + RegExp(r'tr\("([^"]+)"\)'), // tr("string") + RegExp(r"tr\('([^']+)'\)"), // tr('string') + RegExp(r'"([^"]+)"\.tr\(args: \[.*?\]\)'), // "string".tr(args: []) + RegExp(r'"([^"]+)"\.plural\(\d+\)'), // "string".plural(3) + //Intl Package Patterns + RegExp(r'AppLocalizations\.of\(context\)!\.translate\("([^"]+)"\)'), + ]; + + // Determine the patterns to use + List patterns; + if (overrideRegExps && additionalRegExps != null) { + patterns = additionalRegExps; + } else { + patterns = [...defaultPatterns]; + if (additionalRegExps != null) { + patterns.addAll(additionalRegExps); + } + } + + final Set strings = {}; + final Directory projectDirObj = Directory(directory); + + // Check if the directory exists *before* listing + if (!await projectDirObj.exists()) { + throw ArgumentError("The directory '$directory' does not exist."); + } + + final List entities = + await projectDirObj.list(recursive: true).toList(); + + // Filter files by the specified extensions + final List filteredFiles = entities + .whereType() + .where((file) => fileExtensions.any((ext) => file.path.endsWith(ext))) + .toList(); + + // Extract strings from files + for (final File file in filteredFiles) { + final String content = await file.readAsString(); + + for (final RegExp pattern in patterns) { + final Iterable matches = pattern.allMatches(content); + + for (final RegExpMatch match in matches) { + if (match.groupCount >= 1 && match.group(1) != null) { + strings.add(match.group(1)!); + } + } + } + } + + return strings; + } + + /// Creates translation files (no changes needed) + static Future _createTranslationFiles({ + required Set strings, + required String outputDirectory, + required String baseLang, + required List langs, + bool translateBaseLang = true, + }) async { + // ... (rest of the function remains the same) ... + final Directory outputDir = Directory(outputDirectory); + if (!await outputDir.exists()) { + Log.print('outputDir: ${outputDir}'); + await outputDir.create(recursive: true); + } + + // Always create the base language file, even if `translateBaseLang` is false + final String baseFilePath = '$outputDirectory/translations_$baseLang.json'; + final Map baseStrings = { + for (final string in strings) string: translateBaseLang ? string : "" + }; + await _writeTranslationFile(baseFilePath, baseStrings); + + for (final String lang in langs) { + final String langFilePath = '$outputDirectory/translations_$lang.json'; + final Map langStrings = { + for (final string in strings) string: "" + }; + await _writeTranslationFile(langFilePath, langStrings); + } + } + + /// Writes a translation file (no changes needed) + static Future _writeTranslationFile( + String filePath, Map strings) async { + // ... (rest of the function remains the same) ... + final File file = File(filePath); + final StringBuffer content = StringBuffer(); + content.writeln('{'); + + int index = 0; + for (final MapEntry entry in strings.entries) { + final String comma = (index < strings.length - 1) ? ',' : ''; + final String key = + jsonEncode(entry.key).substring(1, jsonEncode(entry.key).length - 1); + final String value = entry.value.isEmpty + ? "" + : jsonEncode(entry.value) + .substring(1, jsonEncode(entry.value).length - 1); + + content.writeln(' "$key": "$value"$comma'); + index++; + } + + content.writeln('}'); + await file.writeAsString(content.toString()); + } +} diff --git a/siro_driver/lib/controller/payment/driver_payment_controller.dart b/siro_driver/lib/controller/payment/driver_payment_controller.dart new file mode 100755 index 0000000..d0a1b6d --- /dev/null +++ b/siro_driver/lib/controller/payment/driver_payment_controller.dart @@ -0,0 +1,71 @@ +import 'dart:convert'; + +import 'package:siro_driver/views/widgets/elevated_btn.dart'; +import 'package:get/get.dart'; +import 'package:siro_driver/constant/box_name.dart'; +import 'package:siro_driver/constant/links.dart'; +import 'package:siro_driver/controller/functions/crud.dart'; +import 'package:siro_driver/main.dart'; + +class DriverWalletHistoryController extends GetxController { + bool isLoading = false; + List archive = []; + List weeklyList = []; + + getArchivePayment() async { + isLoading = true; + update(); + var res = await CRUD().getWallet( + link: AppLink.getWalletByDriver, + payload: {'driverID': box.read(BoxName.driverID)}); + if (res == 'failure') { + Get.defaultDialog( + barrierDismissible: false, + title: 'There is no data yet.'.tr, + middleText: '', + confirm: MyElevatedButton( + title: 'Back'.tr, + onPressed: () { + Get.back(); + // Get.back(); + }, + )); + } + archive = jsonDecode(res)['message']; + + isLoading = false; + update(); + } + + getWeekllyArchivePayment() async { + isLoading = true; + update(); + var res = await CRUD().getWallet( + link: AppLink.getDriverWeekPaymentMove, + payload: {'driverID': box.read(BoxName.driverID)}); + if (res == 'failure') { + Get.defaultDialog( + barrierDismissible: false, + title: 'There is no data yet.'.tr, + middleText: '', + confirm: MyElevatedButton( + title: 'Back'.tr, + onPressed: () { + Get.back(); + // Get.back(); + }, + )); + } else { + weeklyList = jsonDecode(res)['message']; + } + + isLoading = false; + update(); + } + + @override + void onInit() { + // getArchivePayment(); + super.onInit(); + } +} diff --git a/siro_driver/lib/controller/payment/mtn_new/mtn_payment_new_screen.dart b/siro_driver/lib/controller/payment/mtn_new/mtn_payment_new_screen.dart new file mode 100644 index 0000000..65e39d0 --- /dev/null +++ b/siro_driver/lib/controller/payment/mtn_new/mtn_payment_new_screen.dart @@ -0,0 +1,350 @@ +import 'dart:async'; +import 'package:flutter/material.dart'; +// import 'package:http/http.dart' as http; +import 'package:intl/intl.dart'; +import 'package:siro_driver/constant/links.dart'; // افترض وجود هذا الملف +import 'package:siro_driver/controller/functions/crud.dart'; // افترض وجود هذا الملف +import '../../../main.dart'; // افترض وجود box هنا +import '../../../constant/box_name.dart'; // افترض وجود هذا الملف + +// Service class to handle MTN payment logic +class MtnPaymentService { + final String _baseUrl = + "${AppLink.paymentServer}/ride/mtn_new"; // تأكد من تعديل المسار + + // Function to create a new invoice + Future createInvoice({ + required String userId, + required String userType, // 'driver' or 'passenger' + required double amount, + required String mtnPhone, + }) async { + final url = "$_baseUrl/create_mtn_invoice.php"; + try { + final response = await CRUD().postWallet( + // استخدام نفس دالة CRUD + link: url, + payload: { + 'user_id': userId, + 'user_type': userType, + 'amount': amount.toString(), + 'mtn_phone': mtnPhone, + }, + ).timeout(const Duration(seconds: 15)); + + if (response != 'failure') { + final data = response; + if (data['status'] == 'success' && data['invoice_number'] != null) { + debugPrint("MTN Invoice created: ${data['invoice_number']}"); + return data['invoice_number'].toString(); + } else { + debugPrint("Failed to create MTN invoice: ${data['message']}"); + return null; + } + } else { + debugPrint("Server error during MTN invoice creation."); + return null; + } + } catch (e) { + debugPrint("Exception during MTN invoice creation: $e"); + return null; + } + } + + // Function to check invoice status (polling) + Future checkInvoiceStatus(String invoiceNumber) async { + // This should point to a new script on your server that checks mtn_invoices table + final url = "$_baseUrl/check_mtn_invoice_status.php"; + try { + final response = await CRUD().postWallet(link: url, payload: { + 'invoice_number': invoiceNumber, + }).timeout(const Duration(seconds: 10)); + + if (response != 'failure') { + final data = response; + return data['status'] == 'success' && + data['invoice_status'] == 'completed'; + } + return false; + } catch (e) { + debugPrint("Error checking MTN invoice status: $e"); + return false; + } + } +} + +enum PaymentStatus { + creatingInvoice, + waitingForPayment, + paymentSuccess, + paymentTimeout, + paymentError +} + +class PaymentScreenMtn extends StatefulWidget { + final double amount; + // يمكنك إضافة متغير لتحديد هل المستخدم سائق أم راكب + final String userType; // 'driver' or 'passenger' + + const PaymentScreenMtn({ + super.key, + required this.amount, + required this.userType, + }); + + @override + _PaymentScreenMtnState createState() => _PaymentScreenMtnState(); +} + +class _PaymentScreenMtnState extends State { + final MtnPaymentService _paymentService = MtnPaymentService(); + Timer? _pollingTimer; + PaymentStatus _status = PaymentStatus.creatingInvoice; + String? _invoiceNumber; + // جلب البيانات من الـ box + final String userId = + box.read(BoxName.driverID) ?? box.read(BoxName.passengerID); + final String phone = box.read(BoxName.phoneWallet); + + @override + void initState() { + super.initState(); + _createAndPollInvoice(); + } + + @override + void dispose() { + _pollingTimer?.cancel(); + super.dispose(); + } + + void _createAndPollInvoice() async { + setState(() => _status = PaymentStatus.creatingInvoice); + + final invoiceNumber = await _paymentService.createInvoice( + userId: userId, + userType: widget.userType, + amount: widget.amount, + mtnPhone: phone, + ); + + if (invoiceNumber != null && mounted) { + setState(() { + _invoiceNumber = invoiceNumber; + _status = PaymentStatus.waitingForPayment; + }); + _startPolling(invoiceNumber); + } else if (mounted) { + setState(() => _status = PaymentStatus.paymentError); + } + } + + void _startPolling(String invoiceNumber) { + const timeoutDuration = Duration(minutes: 15); // زيادة المهلة + var elapsed = Duration.zero; + + _pollingTimer = Timer.periodic(const Duration(seconds: 5), (timer) async { + elapsed += const Duration(seconds: 5); + if (elapsed >= timeoutDuration) { + timer.cancel(); + if (mounted) setState(() => _status = PaymentStatus.paymentTimeout); + return; + } + + debugPrint("Polling... Checking MTN invoice: $invoiceNumber"); + final isCompleted = + await _paymentService.checkInvoiceStatus(invoiceNumber); + if (isCompleted && mounted) { + timer.cancel(); + setState(() => _status = PaymentStatus.paymentSuccess); + } + }); + } + + @override + Widget build(BuildContext context) { + return PopScope( + canPop: _status != PaymentStatus.waitingForPayment, + onPopInvoked: (didPop) async { + if (didPop) return; + if (_status == PaymentStatus.waitingForPayment) { + final shouldPop = await showDialog( + context: context, + builder: (context) => AlertDialog( + title: const Text('هل أنت متأكد؟'), + content: const Text( + 'إذا خرجت الآن، قد تفشل عملية الدفع. عليك إتمامها من تطبيق MTN.'), + actions: [ + TextButton( + onPressed: () => Navigator.of(context).pop(false), + child: const Text('البقاء')), + TextButton( + onPressed: () => Navigator.of(context).pop(true), + child: const Text('الخروج')), + ], + ), + ); + if (shouldPop ?? false) { + Navigator.of(context).pop(); + } + } + }, + child: Scaffold( + appBar: AppBar(title: const Text("الدفع عبر MTN Cash")), + body: Padding( + padding: const EdgeInsets.all(16.0), + child: Center(child: _buildContentByStatus()), + ), + ), + ); + } + + Widget _buildContentByStatus() { + switch (_status) { + case PaymentStatus.creatingInvoice: + return const Column( + mainAxisAlignment: MainAxisAlignment.center, + children: [ + CircularProgressIndicator(), + SizedBox(height: 20), + Text("جاري إنشاء فاتورة دفع...", style: TextStyle(fontSize: 16)), + ], + ); + case PaymentStatus.waitingForPayment: + return _buildWaitingForPaymentUI(); + case PaymentStatus.paymentSuccess: + return _buildSuccessUI(); + case PaymentStatus.paymentTimeout: + case PaymentStatus.paymentError: + return _buildErrorUI(); + } + } + + Widget _buildWaitingForPaymentUI() { + final currencyFormat = NumberFormat.decimalPattern('ar_SY'); + + return SingleChildScrollView( + child: Column( + children: [ + // **مهم**: استبدل هذا المسار بمسار شعار MTN الصحيح في مشروعك + Image.asset('assets/images/cashMTN.png', width: 120), + const SizedBox(height: 24), + Text("تعليمات الدفع", style: Theme.of(context).textTheme.titleLarge), + const SizedBox(height: 12), + Text( + "المبلغ المطلوب: ${currencyFormat.format(widget.amount)} ل.س", + style: Theme.of(context) + .textTheme + .titleMedium + ?.copyWith(fontWeight: FontWeight.bold), + ), + const SizedBox(height: 16), + Card( + elevation: 1.5, + shape: + RoundedRectangleBorder(borderRadius: BorderRadius.circular(12)), + child: const Padding( + padding: EdgeInsets.all(16), + child: Column( + children: [ + _StepTile(number: 1, text: "افتح تطبيق MTN Cash Mobile."), + _StepTile( + number: 2, + text: "اذهب إلى قسم 'دفع الفواتير' أو 'خدمات الدفع'."), + _StepTile( + number: 3, + text: "ابحث عن 'Intaleq App' في قائمة المفوترين."), + _StepTile( + number: 4, + text: + "أدخل رقم هاتفك المسجل لدينا للاستعلام عن الفاتورة."), + _StepTile( + number: 5, + text: + "ستظهر لك فاتورة بالمبلغ المطلوب. قم بتأكيد الدفع."), + ], + ), + ), + ), + const SizedBox(height: 24), + const LinearProgressIndicator(minHeight: 2), + const SizedBox(height: 12), + Text("بانتظار تأكيد الدفع من MTN...", + style: TextStyle(color: Colors.grey.shade700)), + const SizedBox(height: 4), + const Text("هذه الشاشة ستتحدث تلقائيًا عند اكتمال الدفع", + style: TextStyle(color: Colors.grey), + textAlign: TextAlign.center), + ], + ), + ); + } + + Widget _buildSuccessUI() { + return Column( + mainAxisAlignment: MainAxisAlignment.center, + children: [ + const Icon(Icons.check_circle, color: Colors.green, size: 80), + const SizedBox(height: 20), + const Text("تم الدفع بنجاح!", + style: TextStyle(fontSize: 22, fontWeight: FontWeight.bold)), + const SizedBox(height: 8), + const Text("تمت إضافة النقاط إلى حسابك.", + style: TextStyle(fontSize: 16)), + const SizedBox(height: 20), + ElevatedButton( + onPressed: () => Navigator.of(context).pop(), + child: const Text("العودة إلى المحفظة"), + ), + ], + ); + } + + Widget _buildErrorUI() { + return Column( + mainAxisAlignment: MainAxisAlignment.center, + children: [ + const Icon(Icons.error, color: Colors.red, size: 80), + const SizedBox(height: 20), + Text( + _status == PaymentStatus.paymentTimeout + ? "انتهى الوقت المحدد للدفع" + : "حدث خطأ أثناء إنشاء الفاتورة", + style: const TextStyle(fontSize: 22, fontWeight: FontWeight.bold), + textAlign: TextAlign.center, + ), + const SizedBox(height: 8), + const Text("يرجى المحاولة مرة أخرى.", style: TextStyle(fontSize: 16)), + const SizedBox(height: 20), + ElevatedButton( + onPressed: _createAndPollInvoice, + child: const Text("المحاولة مرة أخرى"), + ), + ], + ); + } +} + +// ويدجت مساعد لعرض خطوات التعليمات بشكل أنيق +class _StepTile extends StatelessWidget { + final int number; + final String text; + const _StepTile({required this.number, required this.text}); + + @override + Widget build(BuildContext context) { + return ListTile( + contentPadding: const EdgeInsets.symmetric(vertical: 4.0), + leading: CircleAvatar( + radius: 14, + backgroundColor: Theme.of(context).primaryColor, + child: Text("$number", + style: const TextStyle( + fontSize: 12, + color: Colors.white, + fontWeight: FontWeight.bold)), + ), + title: Text(text), + ); + } +} diff --git a/siro_driver/lib/controller/payment/payment_controller.dart b/siro_driver/lib/controller/payment/payment_controller.dart new file mode 100755 index 0000000..0c41e8a --- /dev/null +++ b/siro_driver/lib/controller/payment/payment_controller.dart @@ -0,0 +1,412 @@ +import 'dart:convert'; +import 'package:siro_driver/constant/api_key.dart'; +import 'package:siro_driver/constant/style.dart'; +import 'package:siro_driver/controller/functions/tts.dart'; +import 'package:siro_driver/controller/payment/paymob/paymob_response.dart'; +import 'package:siro_driver/views/widgets/elevated_btn.dart'; +import 'package:siro_driver/views/widgets/error_snakbar.dart'; +import 'package:http/http.dart' as http; +import 'package:flutter/material.dart'; +import 'package:get/get.dart'; +import 'package:local_auth/local_auth.dart'; +import 'package:siro_driver/views/widgets/mydialoug.dart'; + +import '../../constant/box_name.dart'; +import '../../constant/colors.dart'; +import '../../constant/info.dart'; +import '../../constant/links.dart'; +import '../../main.dart'; +import '../functions/crud.dart'; +import '../functions/toast.dart'; +import 'paymob/paymob_wallet.dart'; + +class PaymentController extends GetxController { + bool isLoading = false; + bool isWalletChecked = true; + bool isCashChecked = false; + bool isWalletFound = false; + bool isPromoSheetDialogue = false; + final formKey = GlobalKey(); + final promo = TextEditingController(); + // double totalPassenger = + // double.parse(Get.find().totalPricePassenger); + int? selectedAmount = 0; + List totalPassengerWalletDetails = []; + final walletphoneController = TextEditingController(); + String passengerTotalWalletAmount = ''; + String ip = '1'; + DateTime now = DateTime.now(); + late int timestamp; + + void updateSelectedAmount(int value) { + selectedAmount = value; + update(); + } + + void changePromoSheetDialogue() { + isPromoSheetDialogue = !isPromoSheetDialogue; + update(); + } + + getPassengerWallet() async { + isLoading = true; + update(); + + await CRUD().getWallet( + link: AppLink.getWalletByPassenger, + payload: {'passenger_id': box.read(BoxName.passengerID)}).then((value) { + box.write(BoxName.passengerWalletTotal, + jsonDecode(value)['message'][0]['total'].toString()); + }); + isLoading = false; + update(); + } + + addPassengerWallet() async { + isLoading = true; + update(); + // double sallaryAccountNowBeforeAdding = + // double.parse(box.read(BoxName.passengerWalletTotal).toString()); + await CRUD().postWallet(link: AppLink.addPassengersWallet, payload: { + 'passenger_id': box.read(BoxName.passengerID).toString(), + 'balance': selectedAmount.toString() + }).then((value) { + getPassengerWallet(); + // sallaryAccountNowBeforeAdding = sallaryAccountNowBeforeAdding + + // double.parse(selectedAmount.toString()); + // box.write(BoxName.passengerWalletTotal, sallaryAccountNowBeforeAdding); + }); + + isLoading = false; + update(); + } + + // void onChangedPaymentMethodWallet(bool? value) { + // if (box.read(BoxName.passengerWalletTotal) == null || + // double.parse(box.read(BoxName.passengerWalletTotal).toString()) < + // totalPassenger) { + // isWalletChecked = false; + // isWalletChecked ? isCashChecked = true : isCashChecked = true; + // update(); + // } else { + // isWalletChecked = !isWalletChecked; + // isWalletChecked ? isCashChecked = false : isCashChecked = true; + // update(); + // } + // } + + // void onChangedPaymentMethodCash(bool? value) { + // if (box.read(BoxName.passengerWalletTotal) == null || + // double.parse(box.read(BoxName.passengerWalletTotal)) < totalPassenger) { + // isWalletChecked = false; + // isCashChecked = !isCashChecked; + // isCashChecked ? isWalletChecked = false : isWalletChecked = false; + // update(); + // } else { + // isCashChecked = !isCashChecked; + // isCashChecked ? isWalletChecked = false : isWalletChecked = true; + // update(); + // } + // } + + +// 'https://accept.paymob.com/unifiedcheckout/?publicKey=egy_pk_live_mbjDC9Ni6FSHKmsz8sOHiVk2xd7oWRve&clientSecret=egy_sk_live_c0904e9cf04506ae64f818d4e075b4a957e3713fdf7a22cb7da30a29e72442b5' + + Future payWithPayMob( + BuildContext context, String amount, currency, Function method) async { + String newAmount = (double.parse(amount) * 100).toStringAsFixed(2); + try { + bool isAvailable = await LocalAuthentication().isDeviceSupported(); + if (isAvailable) { + // Authenticate the user + bool didAuthenticate = await LocalAuthentication().authenticate( + localizedReason: 'Use Touch ID or Face ID to confirm payment', + // options: AuthenticationOptions( + biometricOnly: true, + sensitiveTransaction: true, + ); + if (didAuthenticate) { + final PaymobResponse? response = await PaymobPayment.instance.pay( + context: context, + currency: currency, //"EGP", + amountInCents: newAmount, // 19.00 EGP + + billingData: PaymobBillingData(), + onPayment: (PaymobResponse response) {}, + ); + + if (response!.responseCode == 'APPROVED') { + Get.defaultDialog( + barrierDismissible: false, + title: 'Payment Successful'.tr, + titleStyle: AppStyle.title, + content: Text( + 'The payment was approved.'.tr, + style: AppStyle.title, + ), + confirm: MyElevatedButton( + title: 'OK'.tr, + kolor: AppColor.greenColor, + onPressed: () async { + Get.back(); + method(); + }, + ), + ); + } else { + Get.defaultDialog( + barrierDismissible: false, + // backgroundColor: AppColor.redColor, + title: 'Payment Failed'.tr, + content: Text( + 'The payment was not approved. Please try again.'.tr, + textAlign: TextAlign.center, + style: AppStyle.title, + ), + confirm: MyElevatedButton( + title: 'OK'.tr, + kolor: AppColor.redColor, + onPressed: () async { + Get.back(); + }, + ), + ); + } + } else { + Get.snackbar("Authentication Failed", + "Please enable Face ID or Fingerprint in your settings."); + + // Authentication failed, handle accordingly + } + } else { + MyDialog().getDialog('Biometric Authentication'.tr, + 'You should use Touch ID or Face ID to confirm payment'.tr, () { + Get.back(); + }); + // Authentication failed, handle accordingly + } + // else { + // final PaymobResponse? response = await PaymobPayment.instance.pay( + // context: context, + // currency: currency, //"EGP", + // amountInCents: newAmount, // 19.00 EGP + // billingData: PaymobBillingData(), + // onPayment: (PaymobResponse response) {}, + // ); + + // if (response!.responseCode == 'APPROVED') { + // Get.defaultDialog( + // barrierDismissible: false, + // title: 'Payment Successful'.tr, + // titleStyle: AppStyle.title, + // // backgroundColor: AppColor.greenColor, + // content: Text( + // 'The payment was approved.'.tr, + // style: AppStyle.title, + // ), + // confirm: MyElevatedButton( + // kolor: AppColor.greenColor, + // title: 'OK'.tr, + // onPressed: () async { + // Get.back(); + // method(); + // }, + // ), + // ); + // } else { + // Get.defaultDialog( + // barrierDismissible: false, + // // backgroundColor: AppColor.redColor, + // title: 'Payment Failed'.tr, + // content: Column( + // children: [ + // IconButton( + // onPressed: () { + // Get.find().speakText( + // 'The payment was not approved. Please try again.'.tr, + // ); + // }, + // icon: const Icon(Icons.headphones), + // ), + // Text( + // 'The payment was not approved. Please try again.'.tr, + // textAlign: TextAlign.center, + // style: AppStyle.title, + // ), + // Text( + // '${'The reason is'.tr} ${response.message!.tr}', + // textAlign: TextAlign.center, + // style: AppStyle.title.copyWith(color: AppColor.redColor), + // ), + // ], + // ), + // confirm: MyElevatedButton( + // title: 'OK'.tr, + // kolor: AppColor.redColor, + // onPressed: () async { + // Get.back(); + // }, + // ), + // ); + // } + + // } + } catch (e) { + Get.defaultDialog( + title: 'Error'.tr, + content: Text( + 'An error occurred during the payment process.'.tr, + style: AppStyle.title, + ), + ); + rethrow; + } + } + + Future payWithPayMobWallet( + BuildContext context, String amount, currency, Function method) async { + String newAmount = (double.parse(amount) * 100).toStringAsFixed(2); + try { + bool isAvailable = await LocalAuthentication().isDeviceSupported(); + if (isAvailable) { + // Authenticate the user + bool didAuthenticate = await LocalAuthentication().authenticate( + localizedReason: 'Use Touch ID or Face ID to confirm payment', + // options: AuthenticationOptions( + biometricOnly: true, + sensitiveTransaction: true, + // ) + ); + if (didAuthenticate) { + final PaymobResponseWallet? response = + await PaymobPaymentWallet.instance.pay( + context: context, + currency: currency, //"EGP", + amountInCents: newAmount, // 19.00 EGP + + billingData: PaymobBillingDataWallet(), + onPayment: (PaymobResponseWallet response) {}, + ); + if (response!.success == true && + response.message.toString() == 'Approved') { + Toast.show(context, 'Payment Successful'.tr, AppColor.greenColor); + method(); + } else { + Get.defaultDialog( + barrierDismissible: false, + // backgroundColor: AppColor.redColor, + title: 'Payment Failed'.tr, + content: Column( + children: [ + IconButton( + onPressed: () { + Get.find().speakText( + 'The payment was not approved. Please try again.'.tr, + ); + }, + icon: const Icon(Icons.headphones), + ), + Text( + 'The payment was not approved. Please try again.'.tr, + textAlign: TextAlign.center, + style: AppStyle.title, + ), + Text( + '${'The reason is'.tr} ${response.message!.tr}', + textAlign: TextAlign.center, + style: AppStyle.title.copyWith(color: AppColor.redColor), + ), + ], + ), + confirm: MyElevatedButton( + title: 'OK'.tr, + kolor: AppColor.redColor, + onPressed: () async { + Get.back(); + }, + ), + ); + } + } else { + // Authentication failed, handle accordingly + MyDialog().getDialog('Authentication failed'.tr, ''.tr, () { + Get.back(); + }); + } + } else { + MyDialog().getDialog('Biometric Authentication'.tr, + 'You should use Touch ID or Face ID to confirm payment'.tr, () { + Get.back(); + }); + // final PaymobResponse? response = await PaymobPayment.instance.pay( + // context: context, + // currency: currency, //"EGP", + // amountInCents: newAmount, // 19.00 EGP + // billingData: PaymobBillingData(), + // onPayment: (PaymobResponse response) {}, + // ); + + // // if (response!.responseCode == 'APPROVED') { + // if (response!.responseCode == '200' && response.success == true) { + // Toast.show(context, 'Payment Successful'.tr, AppColor.greenColor); + // method(); + // Get.defaultDialog( + // barrierDismissible: false, + // title: 'Payment Successful'.tr, + // titleStyle: AppStyle.title, + // // backgroundColor: AppColor.greenColor, + // content: Text( + // 'The payment was approved.'.tr, + // style: AppStyle.title, + // ), + // confirm: MyElevatedButton( + // kolor: AppColor.greenColor, + // title: 'OK'.tr, + // onPressed: () async { + // Get.back(); + // method(); + // }, + // ), + // ); + // } else { + // Get.defaultDialog( + // barrierDismissible: false, + // // backgroundColor: AppColor.redColor, + // title: 'Payment Failed'.tr, + // content: Text( + // 'The payment was not approved. Please try again.'.tr, + // textAlign: TextAlign.center, + // style: AppStyle.title, + // ), + // confirm: MyElevatedButton( + // title: 'OK'.tr, + // kolor: AppColor.redColor, + // onPressed: () async { + // Get.back(); + // }, + // ), + // ); + // } + } + } catch (e) { + Get.defaultDialog( + title: 'Error'.tr, + content: Text( + 'An error occurred during the payment process.'.tr, + style: AppStyle.title, + ), + ); + rethrow; + } + } + + @override + void onInit() { + timestamp = now.millisecondsSinceEpoch; + if (box.read(BoxName.passengerWalletTotal) == null) { + box.write(BoxName.passengerWalletTotal, '0'); + } + // getPassengerWallet(); + super.onInit(); + } +} diff --git a/siro_driver/lib/controller/payment/paymob.dart b/siro_driver/lib/controller/payment/paymob.dart new file mode 100755 index 0000000..0f83901 --- /dev/null +++ b/siro_driver/lib/controller/payment/paymob.dart @@ -0,0 +1,154 @@ +import 'package:siro_driver/constant/box_name.dart'; +import 'package:dio/dio.dart' as dio; +import 'package:dio/dio.dart'; +import 'package:flutter/material.dart'; +import 'package:get/get.dart'; +import 'package:url_launcher/url_launcher.dart'; + +import '../../constant/api_key.dart'; +import '../../main.dart'; +import '../functions/encrypt_decrypt.dart'; + +class PaymobManager extends GetxController { + String authanticationToken1 = ""; + String orderId1 = ""; + + Future getPaymentKey(int amount, String currency) async { + try { + String authanticationToken = await _getAuthanticationToken(); + + int orderId = await _getOrderId( + authanticationToken: authanticationToken, + amount: (100 * amount).toString(), + currency: currency, + ); + + String paymentKey = await _getPaymentKey( + authanticationToken: authanticationToken, + amount: (100 * amount).toString(), + currency: currency, + orderId: orderId.toString(), + ); + authanticationToken1 = authanticationToken.toString(); + orderId1 = orderId.toString(); + update(); + return paymentKey; + } catch (e) { + throw Exception(); + } + } + + Future payWithPayMob(int amount, String currency) async { + // 1. Fetch Payment Key (Assuming PaymobManager is a custom class) + String paymentToken; + try { + paymentToken = await PaymobManager().getPaymentKey(amount, currency); + } on Exception catch (e) { + // Handle errors gracefully, e.g., display error message to user + return; + } + + // 2. Prepare Payment Data Payload + final Map data = { + "source": { + "identifier": "01010101010", // Replace with actual source identifier + "subtype": "WALLET", + }, + "payment_token": paymentToken, + }; + + // 3. Make Payment Request using Dio + final dio = Dio(); + try { + final response = await dio.post( + 'https://accept.paymobsolutions.com/api/acceptance/payments/pay', + data: data, + ); + + // 4. Handle Payment Response + if (response.statusCode == 200) { + final paymentData = response.data; // Assuming JSON response + + // Navigate to success screen or display success message + launchUrl(Uri.parse(paymentData['iframe_redirection_url'])); + } else { + // Payment failed: Handle errors (e.g., display error message) + } + } on DioError catch (e) { + // Handle network or Dio-related errors + } + } + + Future _getStatusAfterPaid() async { + final dio.Response response = await Dio().post( + "https://accept.paymob.com/api/ecommerce/orders/transaction_inquiry", + data: { + "auth_token": authanticationToken1, + "merchant_order_id": "970960", + "order_id": orderId1 + }); + return response.data["success"]; + } + + Future _getAuthanticationToken() async { + final dio.Response response = + await Dio().post("https://accept.paymob.com/api/auth/tokens", data: { + "api_key": AK.payMobApikey, + 'username': AK.usernamePayMob, + "password": AK.passwordPayMob, + }); + return response.data["token"]; + } + + Future _getOrderId({ + required String authanticationToken, + required String amount, + required String currency, + }) async { + final dio.Response response = await Dio() + .post("https://accept.paymob.com/api/ecommerce/orders", data: { + "auth_token": authanticationToken, + "amount_cents": amount, + "currency": currency, + "delivery_needed": "false", + "items": [], + }); + return response.data["id"]; + } + + Future _getPaymentKey({ + required String authanticationToken, + required String orderId, + required String amount, + required String currency, + }) async { + final dio.Response response = await Dio() + .post("https://accept.paymob.com/api/acceptance/payment_keys", data: { + "expiration": 200, + "auth_token": authanticationToken.toString(), + "order_id": orderId.toString(), + "integration_id": + 4556056, ////todo wallet or online card int.parse(AK.integrationIdPayMob), + "lock_order_when_paid": "false", + "amount_cents": amount, + "currency": currency, + "billing_data": { + "first_name": (box.read(BoxName.nameDriver)), + "last_name": (box.read(BoxName.lastNameDriver)), + "email": (box.read(BoxName.emailDriver)), + "phone_number": (box.read(BoxName.phoneDriver)), + "apartment": "NA", + "floor": "NA", + "street": "NA", + "building": "NA", + "shipping_method": "NA", + "postal_code": "NA", + "city": "NA", + "country": box.read(BoxName.countryCode), + "state": "NA" + }, + }); + + return response.data["token"]; + } +} diff --git a/siro_driver/lib/controller/payment/paymob/paymob_response.dart b/siro_driver/lib/controller/payment/paymob/paymob_response.dart new file mode 100755 index 0000000..226f71b --- /dev/null +++ b/siro_driver/lib/controller/payment/paymob/paymob_response.dart @@ -0,0 +1,326 @@ +import 'package:siro_driver/constant/box_name.dart'; +import 'package:siro_driver/controller/functions/encrypt_decrypt.dart'; +import 'package:siro_driver/main.dart'; +import 'package:dio/dio.dart'; +import 'package:flutter/material.dart'; +import 'package:webview_flutter/webview_flutter.dart'; + +class PaymobResponse { + bool success; + String? transactionID; + String? responseCode; + String? message; + + PaymobResponse({ + this.transactionID, + required this.success, + this.responseCode, + this.message, + }); + + factory PaymobResponse.fromJson(Map json) { + return PaymobResponse( + success: json['success'] == 'true', + transactionID: json['id'], + message: json['message'], + responseCode: json['txn_response_code'], + ); + } +} + +class PaymobPayment { + static PaymobPayment instance = PaymobPayment(); + + bool _isInitialized = false; + + final Dio _dio = Dio(); + final _baseURL = 'https://accept.paymob.com/api/'; + late String _apiKey; + late int _integrationID; + late int _iFrameID; + late String _iFrameURL; + late int _userTokenExpiration; + + /// Initializing PaymobPayment instance. + Future initialize({ + /// It is a unique identifier for the merchant which used to authenticate your requests calling any of Accept's API. + /// from dashboard Select Settings -> Account Info -> API Key + required String apiKey, + + /// from dashboard Select Developers -> Payment Integrations -> Online Card ID + required int integrationID, + + /// from paymob Select Developers -> iframes + required int iFrameID, + + /// The expiration time of this payment token in seconds. (The maximum is 3600 seconds which is an hour) + int userTokenExpiration = 300, + }) async { + if (_isInitialized) { + return true; + } + _dio.options.baseUrl = _baseURL; + _dio.options.validateStatus = (status) => true; + _apiKey = apiKey; + _integrationID = integrationID; + _iFrameID = iFrameID; + _iFrameURL = + 'https://accept.paymobsolutions.com/api/acceptance/iframes/$_iFrameID?payment_token='; + _isInitialized = true; + _userTokenExpiration = userTokenExpiration; + return _isInitialized; + } + + /// Get authentication token, which is valid for one hour from the creation time. + Future _getAuthToken() async { + try { + final response = await _dio.post( + 'auth/tokens', + data: { + 'api_key': _apiKey, + }, + ); + + return response.data['token']; + } catch (e) { + rethrow; + } + } + + /// At this step, you will register an order to Accept's database, so that you can pay for it later using a transaction + Future _addOrder({ + required String authToken, + required String currency, + required String amount, + required List items, + }) async { + try { + final response = await _dio.post( + 'ecommerce/orders', + data: { + "auth_token": authToken, + "delivery_needed": "false", + "amount_cents": amount, + "currency": currency, + "items": items, + }, + ); + + return response.data['id']; + } catch (e) { + rethrow; + } + } + + /// At this step, you will obtain a payment_key token. This key will be used to authenticate your payment request. It will be also used for verifying your transaction request metadata. + Future _getPurchaseToken({ + required String authToken, + required String currency, + required int orderID, + required String amount, + required PaymobBillingData billingData, + }) async { + final response = await _dio.post( + 'acceptance/payment_keys', + data: { + "auth_token": authToken, + "amount_cents": amount, + "expiration": _userTokenExpiration, + "order_id": orderID, + "billing_data": billingData, + "currency": currency, + "integration_id": _integrationID, + "lock_order_when_paid": "false" + }, + ); + final message = response.data['message']; + if (message != null) { + throw Exception(message); + } + return response.data['token']; + } + + /// Proceed to pay with only calling this function. + /// Opens a WebView at Paymob redirectedURL to accept user payment info. + Future pay( + { + /// BuildContext for navigation to WebView + required BuildContext context, + + /// Which Currency you would pay in. + required String currency, + + /// Payment amount in cents EX: 20000 is an 200 EGP + required String amountInCents, + + /// Optional Callback if you can use return result of pay function or use this callback + void Function(PaymobResponse response)? onPayment, + + /// list of json objects contains the contents of the purchase. + List? items, + + /// The billing data related to the customer related to this payment. + PaymobBillingData? billingData}) async { + if (!_isInitialized) { + throw Exception( + 'PaymobPayment is not initialized call:`PaymobPayment.instance.initialize`'); + } + final authToken = await _getAuthToken(); + final orderID = await _addOrder( + authToken: authToken, + currency: currency, + amount: amountInCents, + items: items ?? [], + ); + final purchaseToken = await _getPurchaseToken( + authToken: authToken, + currency: currency, + orderID: orderID, + amount: amountInCents, + billingData: billingData ?? PaymobBillingData(), + ); + if (context.mounted) { + final response = await PaymobIFrame.show( + context: context, + redirectURL: _iFrameURL + purchaseToken, + onPayment: onPayment, + ); + return response; + } + return null; + } //51624 +} + +class PaymobBillingData { + String? email; + String? firstName; + String? lastName; + String? phoneNumber; + String? apartment; + String? floor; + String? street; + String? building; + String? postalCode; + String? city; + String? state; + String? country; + String? shippingMethod; + + PaymobBillingData({ + this.email, + this.firstName, + this.lastName, + this.phoneNumber, + this.apartment, + this.floor, + this.street, + this.building, + this.postalCode, + this.city, + this.state, + this.country, + this.shippingMethod, + }); + + Map toJson() { + return { + "email": (box.read(BoxName.emailDriver)), + "first_name": box.read(BoxName.nameDriver), + "last_name": box.read(BoxName.nameDriver), + "phone_number": (box.read(BoxName.phoneDriver)), + "apartment": apartment ?? "NA", + "floor": floor ?? "NA", + "building": building ?? "NA", + "street": street ?? "NA", + "postal_code": postalCode ?? "NA", + "city": city ?? "NA", + "state": state ?? "NA", + "country": country ?? "NA", + "shipping_method": shippingMethod ?? "NA", + }; + } +} + +class PaymobIFrame extends StatefulWidget { + const PaymobIFrame({ + Key? key, + required this.redirectURL, + this.onPayment, + }) : super(key: key); + + final String redirectURL; + final void Function(PaymobResponse)? onPayment; + + static Future show({ + required BuildContext context, + required String redirectURL, + void Function(PaymobResponse)? onPayment, + }) => + Navigator.of(context).push( + MaterialPageRoute( + builder: (context) { + return PaymobIFrame( + onPayment: onPayment, + redirectURL: redirectURL, + ); + }, + ), + ); + + @override + State createState() => _PaymobIFrameState(); +} + +class _PaymobIFrameState extends State { + WebViewController? controller; + + @override + void initState() { + controller = WebViewController() + ..setJavaScriptMode(JavaScriptMode.unrestricted) + ..setNavigationDelegate( + NavigationDelegate( + onNavigationRequest: (NavigationRequest request) { + if (request.url.contains('txn_response_code') && + request.url.contains('success') && + request.url.contains('id')) { + final params = _getParamFromURL(request.url); + final response = PaymobResponse.fromJson(params); + if (widget.onPayment != null) { + widget.onPayment!(response); + } + Navigator.pop(context, response); + return NavigationDecision.prevent; + } + return NavigationDecision.navigate; + }, + ), + ) + ..loadRequest(Uri.parse(widget.redirectURL)); + super.initState(); + } + + @override + Widget build(BuildContext context) { + return Scaffold( + body: controller == null + ? const Center( + child: CircularProgressIndicator.adaptive(), + ) + : SafeArea( + child: WebViewWidget( + controller: controller!, + ), + ), + ); + } + + Map _getParamFromURL(String url) { + final uri = Uri.parse(url); + Map data = {}; + uri.queryParameters.forEach((key, value) { + data[key] = value; + }); + return data; + } +} diff --git a/siro_driver/lib/controller/payment/paymob/paymob_wallet.dart b/siro_driver/lib/controller/payment/paymob/paymob_wallet.dart new file mode 100755 index 0000000..1cdaf86 --- /dev/null +++ b/siro_driver/lib/controller/payment/paymob/paymob_wallet.dart @@ -0,0 +1,470 @@ +import 'package:siro_driver/constant/box_name.dart'; +import 'package:siro_driver/controller/functions/encrypt_decrypt.dart'; +import 'package:siro_driver/main.dart'; +import 'package:dio/dio.dart'; +import 'package:flutter/material.dart'; +import 'package:webview_flutter/webview_flutter.dart'; + +import '../../../print.dart'; + +class PaymobResponseWallet { + final bool success; + final String? transactionID; + final String? responseCode; + final String? message; + + PaymobResponseWallet({ + required this.success, + this.transactionID, + this.responseCode, + this.message, + }); + + factory PaymobResponseWallet.fromJson(Map json) { + return PaymobResponseWallet( + success: json['success'] == 'true', + transactionID: json['id'], + responseCode: json['txn_response_code'], + message: json['data']['message'], + ); + } +} + +class PaymobPaymentWallet { + static PaymobPaymentWallet instance = PaymobPaymentWallet(); + + bool _isInitializedWallet = false; + + final Dio _dio = Dio(); + final _baseURL = 'https://accept.paymob.com/api/'; + late String _apiKey; + late int _integrationID; + late int _iFrameID; + late String _iFrameURL; + late int _userTokenExpiration; + + /// Initializing PaymobPayment instance. + Future initialize({ + /// It is a unique identifier for the merchant which used to authenticate your requests calling any of Accept's API. + /// from dashboard Select Settings -> Account Info -> API Key + required String apiKey, + + /// from dashboard Select Developers -> Payment Integrations -> Online Card ID + required int integrationID, + + /// from paymob Select Developers -> iframes + required int iFrameID, + + /// The expiration time of this payment token in seconds. (The maximum is 3600 seconds which is an hour) + int userTokenExpiration = 300, + }) async { + if (_isInitializedWallet) { + return true; + } + _dio.options.baseUrl = _baseURL; + _dio.options.validateStatus = (status) => true; + _apiKey = apiKey; + _integrationID = integrationID; + _iFrameID = iFrameID; + _iFrameURL = + 'https://accept.paymobsolutions.com/api/acceptance/iframes/$_iFrameID?payment_token='; + _isInitializedWallet = true; + _userTokenExpiration = userTokenExpiration; + return _isInitializedWallet; + } + + /// Get authentication token, which is valid for one hour from the creation time. + Future _getAuthToken() async { + try { + final response = await _dio.post( + 'auth/tokens', + data: { + 'api_key': _apiKey, + }, + ); + return response.data['token']; + } catch (e) { + rethrow; + } + } + + /// At this step, you will register an order to Accept's database, so that you can pay for it later using a transaction + Future _addOrder({ + required String authToken, + required String currency, + required String amount, + required List items, + }) async { + try { + final response = await _dio.post( + 'ecommerce/orders', + data: { + "auth_token": authToken, + "delivery_needed": "false", + "amount_cents": amount, + "currency": currency, + "items": items, + }, + ); + return response.data['id']; + } catch (e) { + rethrow; + } + } + + /// At this step, you will obtain a payment_key token. This key will be used to authenticate your payment request. It will be also used for verifying your transaction request metadata. + Future _getPurchaseToken({ + required String authToken, + required String currency, + required int orderID, + required String amount, + required PaymobBillingDataWallet billingData, + }) async { + final response = await _dio.post( + 'acceptance/payment_keys', + data: { + "auth_token": authToken, + "amount_cents": amount, + "expiration": _userTokenExpiration, + "order_id": orderID, + "billing_data": billingData, + "currency": currency, + "integration_id": _integrationID, + "lock_order_when_paid": "false" + }, + ); + // final message = response.data['message']; + // if (message != null) { + // throw Exception(message); + // } + return response.data['token']; + } + + Future _getWalletUrl({ + required String paymentToken, + }) async { + final Map data = { + "source": { + "identifier": box.read(BoxName.phoneWallet).toString(), + "subtype": "WALLET", + }, + "payment_token": paymentToken, + }; + final dio = Dio(); + try { + final response = await dio.post( + 'https://accept.paymobsolutions.com/api/acceptance/payments/pay', + data: data, + ); + + // 4. Handle Payment Response + if (response.statusCode == 200) { + final paymentData = response.data; // Assuming JSON response + + return paymentData['iframe_redirection_url']; + // Navigate to success screen or display success message + } else { + // Payment failed: Handle errors (e.g., display error message) + } + } on DioError catch (e) { + // Handle network or Dio-related errors + } + return ''; + } + + /// Proceed to pay with only calling this function. + /// Opens a WebView at Paymob redirectedURL to accept user payment info. + Future pay( + { + /// BuildContext for navigation to WebView + required BuildContext context, + + /// Which Currency you would pay in. + required String currency, + + /// Payment amount in cents EX: 20000 is an 200 EGP + required String amountInCents, + + /// Optional Callback if you can use return result of pay function or use this callback + void Function(PaymobResponseWallet response)? onPayment, + + /// list of json objects contains the contents of the purchase. + List? items, + + /// The billing data related to the customer related to this payment. + PaymobBillingDataWallet? billingData}) async { + if (!_isInitializedWallet) { + throw Exception( + 'PaymobPayment is not initialized call:`PaymobPayment.instance.initialize`'); + } + final authToken = await _getAuthToken(); + final orderID = await _addOrder( + authToken: authToken, + currency: currency, + amount: amountInCents, + items: items ?? [], + ); + final purchaseToken = await _getPurchaseToken( + authToken: authToken, + currency: currency, + orderID: orderID, + amount: amountInCents, + billingData: billingData ?? + PaymobBillingDataWallet( + // email: box.read(BoxName.email) ?? box.read(BoxName.emailDriver), + // firstName: box.read(BoxName.name) ?? box.read(BoxName.nameDriver), + // lastName: + // box.read(BoxName.lastNameDriver) ?? box.read(BoxName.name), + // phoneNumber: + // box.read(BoxName.phone) ?? box.read(BoxName.phoneDriver), + ), + ); + final urlWallet = await _getWalletUrl(paymentToken: purchaseToken); + Log.print('urlWallet: ${urlWallet}'); + + if (context.mounted) { + final response = await PaymobIFrameWallet.show( + context: context, + redirectURL: urlWallet, + onPayment: onPayment, + ); + return response; + } + return null; + } +} + +class PaymobBillingDataWallet { + String? email; + String? firstName; + String? lastName; + String? phoneNumber; + String? apartment; + String? floor; + String? street; + String? building; + String? postalCode; + String? city; + String? state; + String? country; + String? shippingMethod; + + PaymobBillingDataWallet({ + this.email, + this.firstName, + this.lastName, + this.phoneNumber, + this.apartment, + this.floor, + this.street, + this.building, + this.postalCode, + this.city, + this.state, + this.country, + this.shippingMethod, + }); + + Map toJson() { + return { + "email": (box.read(BoxName.emailDriver)), + "first_name": box.read(BoxName.name) ?? box.read(BoxName.nameDriver), + "last_name": box.read(BoxName.name) ?? box.read(BoxName.nameDriver), + "phone_number": (box.read(BoxName.phoneWallet)), + "apartment": apartment ?? "NA", + "floor": floor ?? "NA", + "building": building ?? "NA", + "street": street ?? "NA", + "postal_code": postalCode ?? "NA", + "city": city ?? "NA", + "state": state ?? "NA", + "country": country ?? "NA", + "shipping_method": shippingMethod ?? "NA", + }; + } +} + +class PaymobIFrameWallet extends StatefulWidget { + const PaymobIFrameWallet({ + Key? key, + required this.redirectURL, + this.onPayment, + }) : super(key: key); + + final String redirectURL; + final void Function(PaymobResponseWallet)? onPayment; + + static Future show({ + required BuildContext context, + required String redirectURL, + void Function(PaymobResponseWallet)? onPayment, + }) => + Navigator.of(context).push( + MaterialPageRoute( + builder: (context) { + return PaymobIFrameWallet( + onPayment: onPayment, + redirectURL: redirectURL, + ); + }, + ), + ); + + @override + State createState() => _PaymobIFrameState(); +} + +// class _PaymobIFrameState extends State { +// WebViewController? controller; + +// @override +// void initState() { +// controller = WebViewController() +// ..setJavaScriptMode(JavaScriptMode.unrestricted) +// ..setNavigationDelegate( +// NavigationDelegate( +// onNavigationRequest: (NavigationRequest request) { +// Log.print('request.url: ${request.url}'); +// if (request.url.contains('txn_response_code') && +// request.url.contains('success') && +// request.url.contains('id')) { +// final params = _getParamFromURL(request.url); +// final response = PaymobResponseWallet.fromJson(params); +// if (widget.onPayment != null) { +// widget.onPayment!(response); +// } +// Navigator.pop(context, response); +// return NavigationDecision.prevent; +// } +// return NavigationDecision.navigate; +// }, +// ), +// ) +// ..loadRequest(Uri.parse(widget.redirectURL)); +// super.initState(); +// } + +// @override +// Widget build(BuildContext context) { +// return Scaffold( +// body: controller == null +// ? const Center( +// child: CircularProgressIndicator.adaptive(), +// ) +// : SafeArea( +// child: WebViewWidget( +// controller: controller!, +// ), +// ), +// ); +// } + +// Map _getParamFromURL(String url) { +// final uri = Uri.parse(url); +// final queryParams = uri.queryParameters; +// final data = {}; + +// queryParams.forEach((key, value) { +// if (key.contains('.')) { +// final parts = key.split('.'); +// data.putIfAbsent(parts.first, () => {}); +// (data[parts.first] as Map)[parts.last] = value; +// } else { +// data[key] = value; +// } +// }); + +// return data; +// } +// } + +class _PaymobIFrameState extends State { + WebViewController? controller; + + @override + void initState() { + controller = WebViewController() + ..setJavaScriptMode(JavaScriptMode.unrestricted) + ..setNavigationDelegate( + NavigationDelegate( + onNavigationRequest: (NavigationRequest request) { + Log.print('request.url: ${request.url}'); + + if (request.url.contains('txn_response_code') && + request.url.contains('success') && + request.url.contains('id')) { + final params = _getParamFromURL(request.url); + final response = PaymobResponseWallet.fromJson(params); + + if (widget.onPayment != null) { + widget.onPayment!(response); + } + + Navigator.pop(context, response); + + // Show a dialog after successful payment + // _showSuccessDialog(response); + + return NavigationDecision.prevent; + } + return NavigationDecision.navigate; + }, + ), + ) + ..loadRequest(Uri.parse(widget.redirectURL)); + super.initState(); + } + + @override + Widget build(BuildContext context) { + return Scaffold( + body: controller == null + ? const Center( + child: CircularProgressIndicator.adaptive(), + ) + : SafeArea( + child: WebViewWidget( + controller: controller!, + ), + ), + ); + } + + Map _getParamFromURL(String url) { + final uri = Uri.parse(url); + final queryParams = uri.queryParameters; + final data = {}; + + queryParams.forEach((key, value) { + if (key.contains('.')) { + final parts = key.split('.'); + data.putIfAbsent(parts.first, () => {}); + (data[parts.first] as Map)[parts.last] = value; + } else { + data[key] = value; + } + }); + + return data; + } + + void _showSuccessDialog(PaymobResponseWallet response) { + showDialog( + context: context, + builder: (BuildContext context) { + return AlertDialog( + title: Text('Payment Successful'), + content: Text('Transaction ID: EGP'), + actions: [ + TextButton( + onPressed: () { + Navigator.of(context).pop(); // Close the dialog + }, + child: Text('OK'), + ), + ], + ); + }, + ); + } +} diff --git a/siro_driver/lib/controller/payment/smsPaymnet/pay_out_syria_controller.dart b/siro_driver/lib/controller/payment/smsPaymnet/pay_out_syria_controller.dart new file mode 100644 index 0000000..0cdbae3 --- /dev/null +++ b/siro_driver/lib/controller/payment/smsPaymnet/pay_out_syria_controller.dart @@ -0,0 +1,45 @@ +import 'package:flutter/material.dart'; +import 'package:siro_driver/controller/functions/crud.dart'; + +class PayoutService { + final String _baseUrl = + "https://walletintaleq.intaleq.xyz/v1/main/sms_webhook"; + static const double payoutFee = 5000.0; // عمولة السحب الثابتة + + /// دالة لإنشاء طلب سحب جديد على السيرفر + /// + /// تعيد رسالة النجاح من السيرفر، أو رسالة خطأ في حال الفشل. + Future requestPayout({ + required String driverId, + walletType, + payoutPhoneNumber, + required double amount, + }) async { + final url = ("$_baseUrl/request_payout.php"); + try { + // هنا يمكنك إضافة هيدرز المصادقة (JWT) بنفس طريقتك المعتادة + final response = await CRUD().postWallet(link: url, payload: { + 'driverId': driverId, + 'amount': amount.toString(), + 'phone': payoutPhoneNumber.toString(), + 'wallet_type': walletType.toString(), + }).timeout(const Duration(seconds: 20)); + + if (response != 'failure') { + final data = (response); + if (data['status'] == 'success') { + debugPrint("Payout request successful: ${data['message']}"); + return data['message']; // إرجاع رسالة النجاح + } else { + debugPrint("Payout request failed: ${data['message']}"); + return "فشل الطلب: ${data['message']}"; // إرجاع رسالة الخطأ من السيرفر + } + } else { + return "خطأ في الاتصال بالسيرفر: ${response.statusCode}"; + } + } catch (e) { + debugPrint("Exception during payout request: $e"); + return "حدث خطأ غير متوقع. يرجى المحاولة مرة أخرى."; + } + } +} diff --git a/siro_driver/lib/controller/payment/smsPaymnet/payment_services.dart b/siro_driver/lib/controller/payment/smsPaymnet/payment_services.dart new file mode 100644 index 0000000..a677a51 --- /dev/null +++ b/siro_driver/lib/controller/payment/smsPaymnet/payment_services.dart @@ -0,0 +1,564 @@ +import 'dart:async'; +import 'package:flutter/material.dart'; +import 'package:flutter/services.dart'; +import 'package:intl/intl.dart'; +// تأكد من استيراد الملفات الصحيحة حسب مشروع السائق الخاص بك +import 'package:siro_driver/constant/links.dart'; +import 'package:siro_driver/controller/functions/crud.dart'; +import '../../../constant/box_name.dart'; +import '../../../main.dart'; +// import '../../../print.dart'; // إذا كنت تستخدمه + +// --- خدمة الدفع للسائق (نفس المنطق الخاص بالسائق) --- +class PaymentService { + final String _baseUrl = "${AppLink.paymentServer}/ride/shamcash"; + + Future createInvoice({required double amount}) async { + final url = "$_baseUrl/create_invoice_shamcash.php"; + try { + final response = await CRUD().postWallet( + link: url, + payload: { + 'driverID': box.read(BoxName.driverID), // استخدام driverID + 'amount': amount.toString(), + }, + ).timeout(const Duration(seconds: 15)); + + if (response != 'failure') { + final data = response; + if (data['status'] == 'success' && data['invoice_number'] != null) { + return data['invoice_number'].toString(); + } + } + return null; + } catch (e) { + return null; + } + } + + Future checkInvoiceStatus(String invoiceNumber) async { + final url = "$_baseUrl/check_status.php"; + try { + final response = await CRUD().postWallet(link: url, payload: { + 'invoice_number': invoiceNumber, + }).timeout(const Duration(seconds: 10)); + + if (response != 'failure') { + final data = response; + return data['status'] == 'success' && + data['invoice_status'] == 'completed'; + } + return false; + } catch (e) { + return false; + } + } +} + +enum PaymentStatus { + creatingInvoice, + waitingForPayment, + paymentSuccess, + paymentTimeout, + paymentError +} + +class PaymentScreenSmsProvider extends StatefulWidget { + final double amount; + final String providerName; + final String providerLogo; + final String qrImagePath; + + const PaymentScreenSmsProvider({ + super.key, + required this.amount, + this.providerName = 'شام كاش', + this.providerLogo = 'assets/images/shamCash.png', + this.qrImagePath = 'assets/images/shamcashsend.png', + }); + + @override + _PaymentScreenSmsProviderState createState() => + _PaymentScreenSmsProviderState(); +} + +class _PaymentScreenSmsProviderState extends State + with SingleTickerProviderStateMixin { + final PaymentService _paymentService = PaymentService(); + Timer? _pollingTimer; + PaymentStatus _status = PaymentStatus.creatingInvoice; + String? _invoiceNumber; + + // العنوان الثابت للدفع (كما في تطبيق الراكب) + final String _paymentAddress = "80f23afe40499b02f49966c3340ae0fc"; + + // متغيرات الأنيميشن (الوميض) + late AnimationController _blinkController; + late Animation _colorAnimation; + late Animation _shadowAnimation; + + @override + void initState() { + super.initState(); + + // إعداد الأنيميشن (وميض أحمر) + _blinkController = AnimationController( + duration: const Duration(milliseconds: 800), + vsync: this, + )..repeat(reverse: true); + + _colorAnimation = ColorTween( + begin: Colors.red.shade700, + end: Colors.red.shade100, + ).animate(_blinkController); + + _shadowAnimation = Tween(begin: 2.0, end: 15.0).animate( + CurvedAnimation(parent: _blinkController, curve: Curves.easeInOut), + ); + + _createAndPollInvoice(); + } + + @override + void dispose() { + _pollingTimer?.cancel(); + _blinkController.dispose(); + super.dispose(); + } + + void _createAndPollInvoice() async { + setState(() => _status = PaymentStatus.creatingInvoice); + final invoiceNumber = + await _paymentService.createInvoice(amount: widget.amount); + + if (invoiceNumber != null && mounted) { + setState(() { + _invoiceNumber = invoiceNumber; + _status = PaymentStatus.waitingForPayment; + }); + _startPolling(invoiceNumber); + } else if (mounted) { + setState(() => _status = PaymentStatus.paymentError); + } + } + + void _startPolling(String invoiceNumber) { + const timeoutDuration = Duration(minutes: 5); + var elapsed = Duration.zero; + + _pollingTimer = Timer.periodic(const Duration(seconds: 5), (timer) async { + elapsed += const Duration(seconds: 5); + if (elapsed >= timeoutDuration) { + timer.cancel(); + if (mounted) setState(() => _status = PaymentStatus.paymentTimeout); + return; + } + final isCompleted = + await _paymentService.checkInvoiceStatus(invoiceNumber); + if (isCompleted && mounted) { + timer.cancel(); + setState(() => _status = PaymentStatus.paymentSuccess); + } + }); + } + + Future _onPopInvoked() async { + if (_status == PaymentStatus.waitingForPayment) { + return (await showDialog( + context: context, + builder: (context) => AlertDialog( + title: const Text('إلغاء العملية؟', textAlign: TextAlign.right), + content: const Text( + 'الخروج الآن سيؤدي لإلغاء متابعة عملية الدفع.', + textAlign: TextAlign.right), + actions: [ + TextButton( + onPressed: () => Navigator.of(context).pop(false), + child: const Text('البقاء')), + TextButton( + onPressed: () => Navigator.of(context).pop(true), + child: const Text('خروج', + style: TextStyle(color: Colors.red))), + ], + ), + )) ?? + false; + } + return true; + } + + @override + Widget build(BuildContext context) { + return WillPopScope( + onWillPop: _onPopInvoked, + child: Scaffold( + backgroundColor: Colors.grey[50], + appBar: AppBar( + title: Text("دفع عبر ${widget.providerName}"), + centerTitle: true, + elevation: 0, + backgroundColor: Colors.white, + foregroundColor: Colors.black, + ), + body: SafeArea( + child: Padding( + padding: const EdgeInsets.all(20.0), + child: Center(child: _buildContentByStatus()), + ), + ), + ), + ); + } + + Widget _buildContentByStatus() { + switch (_status) { + case PaymentStatus.creatingInvoice: + return const Column( + mainAxisAlignment: MainAxisAlignment.center, + children: [ + CircularProgressIndicator(), + SizedBox(height: 20), + Text("جاري إنشاء رقم البيان...", style: TextStyle(fontSize: 16)), + ], + ); + case PaymentStatus.waitingForPayment: + return _buildWaitingForPaymentUI(); + case PaymentStatus.paymentSuccess: + return _buildSuccessUI(); + case PaymentStatus.paymentTimeout: + case PaymentStatus.paymentError: + return _buildErrorUI(); + } + } + + Widget _buildWaitingForPaymentUI() { + final currencyFormat = NumberFormat.decimalPattern('ar_SY'); + final invoiceText = _invoiceNumber ?? '---'; + + return SingleChildScrollView( + physics: const BouncingScrollPhysics(), + child: Column( + crossAxisAlignment: CrossAxisAlignment.center, + children: [ + // 1. المبلغ المطلوب + Container( + width: double.infinity, + padding: const EdgeInsets.symmetric(vertical: 20, horizontal: 15), + decoration: BoxDecoration( + gradient: LinearGradient( + colors: [Colors.blue.shade800, Colors.blue.shade600]), + borderRadius: BorderRadius.circular(16), + boxShadow: [ + BoxShadow( + color: Colors.blue.withOpacity(0.25), + blurRadius: 15, + offset: const Offset(0, 8)) + ], + ), + child: Column( + children: [ + const Text("المبلغ المطلوب شحنه", + style: TextStyle(color: Colors.white70, fontSize: 14)), + const SizedBox(height: 5), + Text( + "${currencyFormat.format(widget.amount)} ل.س", + style: const TextStyle( + color: Colors.white, + fontSize: 28, + fontWeight: FontWeight.bold), + ), + ], + ), + ), + + const SizedBox(height: 25), + + // 2. رقم البيان (الإطار الأحمر الوامض) + AnimatedBuilder( + animation: _blinkController, + builder: (context, child) { + return Container( + padding: const EdgeInsets.all(20), + decoration: BoxDecoration( + color: Colors.white, + borderRadius: BorderRadius.circular(16), + border: Border.all( + color: _colorAnimation.value ?? Colors.red, + width: 3.0, // إطار سميك + ), + boxShadow: [ + BoxShadow( + color: (_colorAnimation.value ?? Colors.red) + .withOpacity(0.4), + blurRadius: _shadowAnimation.value, + spreadRadius: 2, + ) + ], + ), + child: Column( + children: [ + Row( + mainAxisAlignment: MainAxisAlignment.center, + children: [ + Icon(Icons.warning_rounded, + color: Colors.red.shade800, size: 28), + const SizedBox(width: 8), + Text( + "هام جداً: لا تنسَ!", + style: TextStyle( + color: Colors.red.shade900, + fontWeight: FontWeight.bold, + fontSize: 18), + ), + ], + ), + const SizedBox(height: 10), + const Text( + "يجب نسخ (رقم البيان) هذا ووضعه في تطبيق شام كاش لضمان نجاح العملية.", + textAlign: TextAlign.center, + style: TextStyle( + fontSize: 15, + color: Colors.black87, + fontWeight: FontWeight.w600, + ), + ), + const SizedBox(height: 15), + InkWell( + onTap: () { + Clipboard.setData(ClipboardData(text: invoiceText)); + ScaffoldMessenger.of(context).showSnackBar( + SnackBar( + content: const Text("تم نسخ رقم البيان ✅", + textAlign: TextAlign.center), + backgroundColor: Colors.red.shade700, + behavior: SnackBarBehavior.floating, + shape: RoundedRectangleBorder( + borderRadius: BorderRadius.circular(10)), + margin: const EdgeInsets.all(20), + ), + ); + }, + borderRadius: BorderRadius.circular(12), + child: Container( + padding: const EdgeInsets.symmetric( + horizontal: 15, vertical: 12), + decoration: BoxDecoration( + color: Colors.red.shade50, + borderRadius: BorderRadius.circular(12), + border: + Border.all(color: Colors.red.shade200, width: 1), + ), + child: Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + const Text("رقم البيان (Invoice No)", + style: TextStyle( + fontSize: 12, color: Colors.grey)), + Text(invoiceText, + style: TextStyle( + fontSize: 24, + fontWeight: FontWeight.bold, + letterSpacing: 2.0, + color: Colors.red.shade900)), + ], + ), + Container( + padding: const EdgeInsets.all(8), + decoration: BoxDecoration( + color: Colors.red.shade100, + borderRadius: BorderRadius.circular(8), + ), + child: Icon(Icons.copy_rounded, + color: Colors.red.shade900, size: 24), + ), + ], + ), + ), + ), + ], + ), + ); + }, + ), + + const SizedBox(height: 25), + + // 3. عنوان الدفع (للتسهيل على السائق) + Container( + padding: const EdgeInsets.symmetric(horizontal: 15, vertical: 15), + decoration: BoxDecoration( + color: Colors.white, + borderRadius: BorderRadius.circular(12), + border: Border.all(color: Colors.grey.shade300), + ), + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + const Text("عنوان الدفع (Payment Address)", + style: TextStyle(fontSize: 12, color: Colors.grey)), + const SizedBox(height: 8), + InkWell( + onTap: () { + Clipboard.setData(ClipboardData(text: _paymentAddress)); + ScaffoldMessenger.of(context).showSnackBar( + SnackBar( + content: const Text("تم نسخ عنوان الدفع ✅", + textAlign: TextAlign.center), + backgroundColor: Colors.green.shade600, + behavior: SnackBarBehavior.floating, + shape: RoundedRectangleBorder( + borderRadius: BorderRadius.circular(10)), + margin: const EdgeInsets.all(20), + ), + ); + }, + child: Row( + children: [ + Expanded( + child: Text( + _paymentAddress, + style: const TextStyle( + fontSize: 14, + fontWeight: FontWeight.bold, + fontFamily: 'Courier', + color: Colors.black87, + ), + overflow: TextOverflow.ellipsis, + ), + ), + const SizedBox(width: 8), + const Icon(Icons.copy, size: 18, color: Colors.grey), + ], + ), + ), + ], + ), + ), + + const SizedBox(height: 30), + + // 4. الـ QR Code + const Text("امسح الرمز للدفع", + style: TextStyle( + fontSize: 16, + fontWeight: FontWeight.bold, + color: Colors.black87)), + const SizedBox(height: 10), + + GestureDetector( + onTap: () { + showDialog( + context: context, + builder: (ctx) => Dialog( + backgroundColor: Colors.transparent, + child: InteractiveViewer( + child: Image.asset(widget.qrImagePath), + ), + ), + ); + }, + child: Container( + padding: const EdgeInsets.all(10), + decoration: BoxDecoration( + color: Colors.white, + borderRadius: BorderRadius.circular(15), + border: Border.all(color: Colors.grey.shade300), + ), + child: Image.asset( + widget.qrImagePath, + width: 150, + height: 150, + fit: BoxFit.contain, + errorBuilder: (c, o, s) => + const Icon(Icons.qr_code_2, size: 100, color: Colors.grey), + ), + ), + ), + + const SizedBox(height: 40), + + // مؤشر الانتظار + const LinearProgressIndicator(backgroundColor: Colors.white), + const SizedBox(height: 10), + const Text("ننتظر إشعار الدفع تلقائياً...", + style: TextStyle(color: Colors.grey, fontSize: 12)), + const SizedBox(height: 20), + ], + ), + ); + } + + Widget _buildSuccessUI() { + return Column( + mainAxisAlignment: MainAxisAlignment.center, + children: [ + const Icon(Icons.verified_rounded, color: Colors.green, size: 100), + const SizedBox(height: 20), + const Text("تم الدفع بنجاح!", + style: TextStyle(fontSize: 24, fontWeight: FontWeight.bold)), + const SizedBox(height: 10), + const Text("تم إضافة الرصيد إلى محفظتك", + style: TextStyle(color: Colors.grey)), + const SizedBox(height: 40), + SizedBox( + width: double.infinity, + child: ElevatedButton( + style: ElevatedButton.styleFrom( + backgroundColor: Colors.green, + foregroundColor: Colors.white, + padding: const EdgeInsets.symmetric(vertical: 16), + shape: RoundedRectangleBorder( + borderRadius: BorderRadius.circular(12))), + onPressed: () => Navigator.of(context).pop(), + child: const Text("متابعة", style: TextStyle(fontSize: 18)), + ), + ), + ], + ); + } + + Widget _buildErrorUI() { + return Column( + mainAxisAlignment: MainAxisAlignment.center, + children: [ + Icon(Icons.error_outline_rounded, color: Colors.red.shade400, size: 80), + const SizedBox(height: 20), + Text( + _status == PaymentStatus.paymentTimeout + ? "انتهى الوقت" + : "لم يتم التحقق", + style: const TextStyle(fontSize: 22, fontWeight: FontWeight.bold), + ), + const SizedBox(height: 15), + const Padding( + padding: EdgeInsets.symmetric(horizontal: 30), + child: Text( + "لم يصلنا إشعار الدفع. هل تأكدت من وضع (رقم البيان) في الملاحظات؟", + textAlign: TextAlign.center, + style: TextStyle(color: Colors.grey, height: 1.5)), + ), + const SizedBox(height: 40), + SizedBox( + width: double.infinity, + child: ElevatedButton.icon( + style: ElevatedButton.styleFrom( + padding: const EdgeInsets.symmetric(vertical: 15), + shape: RoundedRectangleBorder( + borderRadius: BorderRadius.circular(12))), + onPressed: _createAndPollInvoice, + icon: const Icon(Icons.refresh), + label: const Text("حاول مرة أخرى"), + ), + ), + const SizedBox(height: 15), + TextButton( + onPressed: () => Navigator.of(context).pop(), + child: const Text("إلغاء", style: TextStyle(color: Colors.grey)), + ) + ], + ); + } +} diff --git a/siro_driver/lib/controller/payment/stripe.dart b/siro_driver/lib/controller/payment/stripe.dart new file mode 100755 index 0000000..e69de29 diff --git a/siro_driver/lib/controller/profile/captain_profile_controller.dart b/siro_driver/lib/controller/profile/captain_profile_controller.dart new file mode 100755 index 0000000..d4b907b --- /dev/null +++ b/siro_driver/lib/controller/profile/captain_profile_controller.dart @@ -0,0 +1,118 @@ +import 'dart:convert'; + +import 'package:flutter/material.dart'; +import 'package:get/get.dart'; +import 'package:siro_driver/constant/box_name.dart'; +import 'package:siro_driver/constant/links.dart'; +import 'package:siro_driver/controller/functions/crud.dart'; +import 'package:siro_driver/main.dart'; + +import '../../views/widgets/error_snakbar.dart'; + +class CaptainProfileController extends GetxController { + bool isLoading = false; + TextEditingController vin = TextEditingController(); + TextEditingController color = TextEditingController(); + TextEditingController make = TextEditingController(); + TextEditingController model = TextEditingController(); + TextEditingController year = TextEditingController(); + TextEditingController expirationDate = TextEditingController(); + final TextEditingController emailController = TextEditingController(); + + updateEmail() async { + var payload = { + 'id': box.read(BoxName.driverID).toString(), + 'email': emailController.text, + }; + + var res = + await CRUD().post(link: AppLink.updateDriverEmail, payload: payload); + + if ((res)['status'] == 'success') { + box.write(BoxName.emailDriver, emailController.text); + update(); + Get.back(); + } else { + mySnackeBarError((res)['message']); + } + } + + Future updateFields() async { + var payload = { + 'driverID': box.read(BoxName.driverID).toString(), + }; + + if (vin.text.isNotEmpty) { + payload['vin'] = vin.text; + } + + if (color.text.isNotEmpty) { + payload['color'] = color.text; + } + + if (model.text.isNotEmpty) { + payload['model'] = model.text; + } + + if (make.text.isNotEmpty) { + payload['make'] = make.text; + } + + if (year.text.isNotEmpty) { + payload['year'] = year.text; + } + + if (expirationDate.text.isNotEmpty) { + payload['expiration_date'] = expirationDate.text; + } + + var res = + await CRUD().post(link: AppLink.updateRegisrationCar, payload: payload); + + if (jsonDecode(res)['status'] == 'success') { + box.write(BoxName.vin, vin.text); + box.write(BoxName.color, color.text); + box.write(BoxName.model, model.text); + box.write(BoxName.make, make.text); + box.write(BoxName.year, year.text); + box.write(BoxName.expirationDate, expirationDate.text); + update(); + Get.back(); + } + } + + Map captainProfileData = {}; + Future getProfileData() async { + isLoading = true; + update(); + var res = await CRUD().get( + link: AppLink.getCaptainProfile, + payload: {'id': box.read(BoxName.driverID)}); + if (res != 'failure') { + var d = jsonDecode(res); + captainProfileData = d['message']; + update(); + box.write(BoxName.sexDriver, d['message']['gender']); + box.write(BoxName.dobDriver, d['message']['birthdate']); + box.write(BoxName.vin, d['message']['vin']); + box.write(BoxName.color, d['message']['color']); + box.write(BoxName.model, d['message']['model']); + box.write(BoxName.carPlate, d['message']['car_plate']); + box.write(BoxName.make, d['message']['make']); + box.write(BoxName.year, d['message']['year']); + box.write(BoxName.expirationDate, d['message']['expiration_date']); + // box.write(BoxName.acc, d['message']['accountBank']); + isLoading = false; + update(); + } + } + + @override + void onInit() { + // if (box.read(BoxName.dobDriver) == null) { + getProfileData(); + // } + + super.onInit(); + } +} diff --git a/siro_driver/lib/controller/profile/profile_controller.dart b/siro_driver/lib/controller/profile/profile_controller.dart new file mode 100755 index 0000000..9b541f9 --- /dev/null +++ b/siro_driver/lib/controller/profile/profile_controller.dart @@ -0,0 +1,111 @@ +import 'dart:convert'; + +import 'package:flutter/material.dart'; +import 'package:get/get.dart'; +import 'package:siro_driver/constant/box_name.dart'; +import 'package:siro_driver/constant/links.dart'; +import 'package:siro_driver/controller/functions/crud.dart'; +import 'package:siro_driver/main.dart'; +import 'package:siro_driver/views/widgets/my_textField.dart'; + +import '../../views/widgets/elevated_btn.dart'; + +class ProfileController extends GetxController { + bool isloading = false; + Map prfoileData = {}; + TextEditingController txtController = TextEditingController(); + List genders = ['Male', 'Female', 'Non-binary']; + + String gender = 'Male'; + + void setGender(String value) { + gender = value; + } + + String? selectedDegree; + + void setDegree(String? degree) { + selectedDegree = degree; + update(); + } + + String? selectedCountry; + + void setCountry(String? country) { + selectedCountry = country; + // box.write(BoxName.countryCode, country); + update(); + } + + updateColumn(Map payload) async { + isloading = true; + update(); + await CRUD().post(link: AppLink.updateprofile, payload: payload); + await getProfile(); + isloading = false; + update(); + } + + updatField(String columnName, TextInputType type) async { + Get.defaultDialog( + title: '${'Update'.tr} $columnName', + content: Column( + children: [ + SizedBox( + width: Get.width * .7, + child: MyTextForm( + controller: txtController, + label: 'type here'.tr, + hint: 'type here', + type: type) + // TextField( + // controller: txtController, + // decoration: const InputDecoration( + // border: OutlineInputBorder(), hintText: 'type here'), + // ), + + ), + MyElevatedButton( + title: 'Update'.tr, + onPressed: () { + updateColumn({ + 'id': box.read(BoxName.passengerID), + columnName: txtController.text, + }); + if (columnName == 'first_name') { + box.write(BoxName.name, txtController.text); + } + Get.back(); + txtController.clear(); + }, + ) + ], + ), + ); + } + + getProfile() async { + isloading = true; + update(); + var res = await CRUD().get(link: AppLink.getprofile, payload: { + 'id': box.read(BoxName.passengerID).toString(), + }); + + if (res.toString() == 'failure') { + // Get.snackbar('failure', 'message'); + isloading = false; + update(); + } else { + var jsonDecoded = jsonDecode(res); + prfoileData = jsonDecoded['data']; + isloading = false; + update(); + } + } + + @override + void onInit() { + getProfile(); + super.onInit(); + } +} diff --git a/siro_driver/lib/controller/profile/setting_controller.dart b/siro_driver/lib/controller/profile/setting_controller.dart new file mode 100755 index 0000000..7b3d247 --- /dev/null +++ b/siro_driver/lib/controller/profile/setting_controller.dart @@ -0,0 +1,48 @@ +import 'package:flutter/material.dart'; +import 'package:siro_driver/constant/box_name.dart'; +import 'package:siro_driver/main.dart'; +import 'package:get/get.dart'; +import '../local/local_controller.dart'; + +class SettingController extends GetxController { + bool isGoogleMapsEnabled = false; + bool isMapDarkMode = false; + bool isDarkMode = false; + + void onChangMapApp() { + isGoogleMapsEnabled = !isGoogleMapsEnabled; + box.write(BoxName.googlaMapApp, isGoogleMapsEnabled); + update(); + } + + void toggleMapTheme() { + isMapDarkMode = !isMapDarkMode; + box.write('isMapDarkMode', isMapDarkMode); + update(); + } + + void toggleAppTheme() { + isDarkMode = !isDarkMode; + box.write('isDarkMode', isDarkMode); + + // Switch theme instantly across the app + Get.changeThemeMode(isDarkMode ? ThemeMode.dark : ThemeMode.light); + + // Update the theme using the LocaleController to ensure correct fonts/colors are refreshed + if (Get.isRegistered()) { + Get.find().refreshTheme(); + } + + update(); + } + + @override + void onInit() { + isGoogleMapsEnabled = box.read(BoxName.googlaMapApp) ?? false; + isMapDarkMode = box.read('isMapDarkMode') ?? false; + isDarkMode = box.read('isDarkMode') ?? false; + + super.onInit(); + } +} + diff --git a/siro_driver/lib/controller/rate/rate_app_controller.dart b/siro_driver/lib/controller/rate/rate_app_controller.dart new file mode 100755 index 0000000..6a68ae3 --- /dev/null +++ b/siro_driver/lib/controller/rate/rate_app_controller.dart @@ -0,0 +1,94 @@ +import 'dart:convert'; + +import 'package:siro_driver/constant/box_name.dart'; +import 'package:siro_driver/constant/links.dart'; +import 'package:siro_driver/controller/functions/crud.dart'; +import 'package:siro_driver/main.dart'; +import 'package:siro_driver/views/widgets/error_snakbar.dart'; +import 'package:siro_driver/views/widgets/mydialoug.dart'; +import 'package:flutter/material.dart'; +import 'package:get/get.dart'; +// Import url_launcher to open the app store +import 'package:url_launcher/url_launcher.dart'; + +class RatingController extends GetxController { + var userRating = 0.obs; + final comment = TextEditingController(); + void submitRating(int rating) { + userRating.value = rating; + + _saveRating(rating); + } + + void _redirectToAppStore() async { + // URLs for App Store and Google Play Store + const appStoreUrl = + 'https://apps.apple.com/st/app/intaleq-driver/id6482995159'; + const playStoreUrl = + 'https://play.google.com/store/apps/details?id=com.intaleq_driver'; + final url = GetPlatform.isIOS ? appStoreUrl : playStoreUrl; + + if (await launchUrl(Uri.parse(url))) { + await launchUrl(Uri.parse(url)); + } else { + mySnackeBarError("Could not open the app store."); + } + } + + Future _saveRating(int rating) async { + // Build the payload with user data + final payload = { + "name": box.read(BoxName.driverID) != null + ? box.read(BoxName.nameDriver) + : box.read(BoxName.name), + "email": (box.read(BoxName.emailDriver)).toString(), + "phone": (box.read(BoxName.phoneDriver)).toString(), + "userId": box.read(BoxName.driverID), + "userType": "driver", + "rating": rating.toString(), + "comment": comment.text.isEmpty + ? 'nothing' + : comment.text, // Get actual text from comment controller + }; + + // Send the rating data to the backend + var res = await CRUD().post(link: AppLink.addRateApp, payload: payload); + + // Handle the response and check if it's JSON-formatted + if (res != 'failure') { + try { + // Attempt to parse the response as JSON + final parsedResponse = (res); + + if (parsedResponse['status'] == 'success') { + // Display a success message + CRUD().post(link: AppLink.sendEmailRateingApp, payload: { + "name": payload["name"], + "email": payload["email"], + "phone": payload["phone"], + "rating": rating.toString(), + "comment": payload["comment"], + }); + MyDialog().getDialog('Rating submitted successfully'.tr, '', () { + if (rating == 5) { + Get.back(); + _redirectToAppStore(); + } else { + Get.back(); + } + }); + + // Send confirmation email if the rating was successfully submitted + } else { + mySnackeBarError('Failed to submit rating'); + } + } catch (e) { + // If JSON decoding fails, log the response directly + // Get.snackbar('Success', 'Rating submitted successfully', + // backgroundColor: AppColor.greenColor); + } + } else { + mySnackeBarError('Failed to connect to the server'); + } + } +} diff --git a/siro_driver/lib/controller/rate/rate_conroller.dart b/siro_driver/lib/controller/rate/rate_conroller.dart new file mode 100755 index 0000000..cd6686d --- /dev/null +++ b/siro_driver/lib/controller/rate/rate_conroller.dart @@ -0,0 +1,150 @@ +import 'package:siro_driver/controller/firebase/firbase_messge.dart'; +import 'package:siro_driver/controller/home/captin/map_driver_controller.dart'; +import 'package:siro_driver/views/widgets/error_snakbar.dart'; +import 'package:flutter/cupertino.dart'; +import 'package:get/get.dart'; +import 'package:siro_driver/constant/box_name.dart'; +import 'package:siro_driver/constant/links.dart'; +import 'package:siro_driver/constant/style.dart'; +import 'package:siro_driver/controller/functions/crud.dart'; +import 'package:siro_driver/main.dart'; +import 'package:siro_driver/views/home/Captin/home_captain/home_captin.dart'; +import 'package:siro_driver/views/widgets/elevated_btn.dart'; + +import '../firebase/notification_service.dart'; +import '../home/captin/home_captain_controller.dart'; + +// import '../home/captin/home_captain_controller.dart'; + +class RateController extends GetxController { + double selectedRateItemId = -1; + TextEditingController comment = TextEditingController(); + TextEditingController passengerPayAmount = TextEditingController(); + String? rideId, passengerId, driverId, price; + late GlobalKey formKey; + bool ispassengerWantWalletFromDriver = false; + String walletChecked = ''; + @override + void onInit() { + formKey = GlobalKey(); + passengerId = Get.arguments['passengerId']; + rideId = Get.arguments['rideId']; + driverId = Get.arguments['driverId']; + price = Get.arguments['price']; + walletChecked = Get.arguments['walletChecked']; + super.onInit(); + } + + void passengerWantPay() { + ispassengerWantWalletFromDriver = true; + update(); + } + + Future addPassengerWallet() async { + if (formKey.currentState!.validate()) { + var priceOfTrip = double.parse(price.toString()); + // double.parse(Get.find().paymentAmount); + double remainingFee = double.parse(passengerPayAmount.text) - priceOfTrip; + if (remainingFee > 0) { + var paymentToken2 = await Get.find() + .generateTokenPassenger(remainingFee.toString()); + await CRUD().post(link: AppLink.addPassengersWallet, payload: { + 'passenger_id': passengerId, + 'balance': remainingFee.toString(), + 'token': paymentToken2, + }).then((value) async { + if (value != 'failure') { + mySnackbarSuccess('Wallet Added'.tr); + // if (double.parse( + // Get.find().totalAmountVisa) > + // remainingFee) { + var paymentToken3 = await Get.find() + .generateTokenDriver((-1 * remainingFee).toString()); + + await CRUD().postWallet(link: AppLink.addDrivePayment, payload: { + 'rideId': 'remain$rideId', + 'amount': (-1 * remainingFee).toString(), + 'payment_method': 'Remainder', + 'passengerID': passengerId, + 'token': paymentToken3, + 'driverID': box.read(BoxName.driverID).toString(), + }); + NotificationService.sendNotification( + target: Get.find().tokenPassenger.toString(), + title: 'Wallet Added'.tr, + body: 'Wallet Added${(remainingFee).toStringAsFixed(0)}'.tr, + isTopic: false, // Important: this is a token + tone: 'tone2', + driverList: [], category: 'Wallet Added', + ); + walletChecked = 'true'; + // } + + update(); + } + }); + } else { + Get.defaultDialog( + title: '${'The price must be over than '.tr} $priceOfTrip', + middleText: '', + confirm: MyElevatedButton( + title: 'Ok'.tr, + onPressed: () { + Get.back(); + })); + } + } + } + + void selectRateItem(double id) { + selectedRateItemId = id; + update(); + } + + void addRateToPassenger() async { + // HomeCaptainController homeCaptainController = + // Get.find(); + // Get.put(MapDriverController()); + if (selectedRateItemId < 1) { + Get.defaultDialog( + title: 'You Should choose rate figure'.tr, + titleStyle: AppStyle.title, + middleText: '', + confirm: MyElevatedButton(title: 'Ok', onPressed: () => Get.back())); + } else { + await CRUD().post(link: "${AppLink.server}/ride/rate/add.php", payload: { + 'passenger_id': passengerId, + 'driverID': box.read(BoxName.driverID).toString(), + 'rideId': rideId.toString(), + 'rating': selectedRateItemId.toString(), + 'comment': comment.text ?? 'none', + }); + + CRUD().sendEmail(AppLink.sendEmailToPassengerForTripDetails, { + 'startLocation': + Get.find().passengerLocation.toString(), + 'endLocation': + Get.find().passengerDestination.toString(), + 'name': Get.find().passengerName.toString(), + 'timeOfTrip': Get.find().timeOfOrder.toString(), + 'fee': Get.find().totalPricePassenger.toString(), + 'duration': Get.find().duration.toString(), + 'phone': Get.find().passengerPhone.toString(), + 'email': Get.find().passengerEmail.toString(), + 'startNameLocation': + Get.find().startNameLocation.toString(), + 'endNameLocation': + Get.find().endNameLocation.toString(), + }); + if (Get.isRegistered()) { + Get.find() + .disposeEverything(); // الدالة التي أنشأناها في الخطوة 3 + Get.delete(force: true); // حذف إجباري من الذاكرة + } + Get.offAll(HomeCaptain()); + if (Get.isRegistered()) { + Get.find().resumeHomeMapUpdates(); + } + } + } +} diff --git a/siro_driver/lib/controller/themes/themes.dart b/siro_driver/lib/controller/themes/themes.dart new file mode 100755 index 0000000..b328531 --- /dev/null +++ b/siro_driver/lib/controller/themes/themes.dart @@ -0,0 +1,90 @@ +import 'package:flutter/material.dart'; +import 'package:siro_driver/constant/style.dart'; +import '../../constant/colors.dart'; + +ThemeData _createTheme({ + required Brightness brightness, + required String fontFamily, + required Color scaffoldBackgroundColor, + required Color cardColor, + required Color dividerColor, +}) { + return ThemeData( + brightness: brightness, + fontFamily: fontFamily, + scaffoldBackgroundColor: scaffoldBackgroundColor, + cardColor: cardColor, + dividerColor: dividerColor, + primaryColor: AppColor.primaryColor, + colorScheme: ColorScheme.fromSeed( + seedColor: AppColor.primaryColor, + brightness: brightness, + primary: AppColor.primaryColor, + surface: cardColor, + background: scaffoldBackgroundColor, + error: AppColor.redColor, + ), + textTheme: TextTheme( + displaySmall: AppStyle.title.copyWith(color: AppColor.writeColor), + displayLarge: AppStyle.headTitle.copyWith(color: AppColor.writeColor), + displayMedium: AppStyle.headTitle2.copyWith(color: AppColor.writeColor), + bodyLarge: AppStyle.title.copyWith(color: AppColor.writeColor), + bodyMedium: AppStyle.subtitle.copyWith(color: AppColor.writeColor), + titleLarge: AppStyle.headTitle2.copyWith(color: AppColor.writeColor), + ), + appBarTheme: AppBarTheme( + elevation: 0, + backgroundColor: scaffoldBackgroundColor, + centerTitle: true, + iconTheme: const IconThemeData(color: AppColor.primaryColor), + titleTextStyle: AppStyle.headTitle2.copyWith(color: AppColor.writeColor), + ), + dialogTheme: DialogThemeData( + backgroundColor: cardColor, + contentTextStyle: AppStyle.title.copyWith(color: AppColor.writeColor), + titleTextStyle: AppStyle.headTitle2.copyWith(color: AppColor.writeColor), + shape: RoundedRectangleBorder(borderRadius: BorderRadius.circular(16)), + ), + cardTheme: CardThemeData( + color: cardColor, + elevation: 2, + shape: RoundedRectangleBorder(borderRadius: BorderRadius.circular(12)), + ), + dividerTheme: DividerThemeData( + color: dividerColor, + thickness: 1, + ), + ); +} + +ThemeData lightThemeEnglish = _createTheme( + brightness: Brightness.light, + fontFamily: "SFPro", + scaffoldBackgroundColor: Colors.white, + cardColor: Colors.white, + dividerColor: Colors.black12, +); + +ThemeData darkThemeEnglish = _createTheme( + brightness: Brightness.dark, + fontFamily: "SFPro", + scaffoldBackgroundColor: const Color(0xFF121212), + cardColor: const Color(0xFF1E1E1E), + dividerColor: Colors.white10, +); + +ThemeData lightThemeArabic = _createTheme( + brightness: Brightness.light, + fontFamily: 'SFArabic', + scaffoldBackgroundColor: Colors.white, + cardColor: Colors.white, + dividerColor: Colors.black12, +); + +ThemeData darkThemeArabic = _createTheme( + brightness: Brightness.dark, + fontFamily: 'SFArabic', + scaffoldBackgroundColor: const Color(0xFF121212), + cardColor: const Color(0xFF1E1E1E), + dividerColor: Colors.white10, +); diff --git a/siro_driver/lib/controller/voice_call_controller.dart b/siro_driver/lib/controller/voice_call_controller.dart new file mode 100644 index 0000000..a246411 --- /dev/null +++ b/siro_driver/lib/controller/voice_call_controller.dart @@ -0,0 +1,749 @@ +import 'dart:async'; +import 'package:flutter/services.dart'; +import 'package:flutter/widgets.dart'; +import 'package:flutter_webrtc/flutter_webrtc.dart' as rtc; +import 'package:get/get.dart' hide Response; +import 'package:permission_handler/permission_handler.dart'; +import 'package:just_audio/just_audio.dart'; + +import '../../constant/box_name.dart'; +import '../../constant/links.dart'; +import '../../main.dart'; +import '../../print.dart'; +import '../../services/signaling_service.dart'; +import '../../views/widgets/voice_call_bottom_sheet.dart'; +import 'functions/crud.dart'; + +// EN: Enum representing the different states of a voice call. +// AR: تعداد يمثل الحالات المختلفة للمكالمة الصوتية. +enum VoiceCallState { idle, dialing, ringing, connecting, active, ended } + +class VoiceCallController extends GetxController with WidgetsBindingObserver { + // EN: Instance of the signaling service to manage WebSocket communication. + // AR: مثيل لخدمة الإشارات لإدارة الاتصال عبر الـ WebSocket. + final SignalingService _signaling = SignalingService(); + + // --- Observable Variables (GetX) / المتغيرات التفاعلية --- + + // EN: Current state of the call. + // AR: الحالة الحالية للمكالمة. + var state = VoiceCallState.idle.obs; + + // EN: Unique identifier for the WebRTC session. + // AR: المعرف الفريد لجلسة الاتصال. + var sessionId = "".obs; + + // EN: ID of the current active ride. + // AR: معرف الرحلة النشطة الحالية. + var rideId = "".obs; + + // EN: Name of the other party (Driver/Passenger). + // AR: اسم الطرف الآخر في المكالمة (سائق/راكب). + var remoteName = "User".obs; + + // EN: Microphone mute status. + // AR: حالة كتم الميكروفون. + var isMuted = false.obs; + + // EN: Speakerphone status. + // AR: حالة مكبر الصوت الخارجي. + var isSpeakerOn = false.obs; + + // EN: Timer countdown variable, starts from 60 seconds. + // AR: متغير العد التنازلي للمؤقت، يبدأ من 60 ثانية. + var elapsedSeconds = 60.obs; + + // EN: Error message to display in UI when call setup fails. + // AR: رسالة الخطأ لعرضها في الواجهة عندما يفشل إعداد المكالمة. + var errorMessage = "".obs; + + // --- Core State Variables / متغيرات الحالة الأساسية --- + + // EN: Flag to determine if the current user initiated the call. + // AR: مؤشر لتحديد ما إذا كان المستخدم الحالي هو من بدأ المكالمة. + bool isCaller = false; + + // EN: ID of the current user. + // AR: معرف المستخدم الحالي. + String currentUserId = ""; + + // --- WebRTC Internal Variables / متغيرات WebRTC الداخلية --- + + // EN: The main connection object between peers. + // AR: كائن الاتصال الرئيسي بين الطرفين. + rtc.RTCPeerConnection? _peerConnection; + + // EN: The local audio stream captured from the microphone. + // AR: دفق الصوت المحلي الملتقط من الميكروفون. + rtc.MediaStream? _localStream; + + // EN: Timer to enforce the 60-second call limit. + // AR: مؤقت لفرض حد الـ 60 ثانية للمكالمة. + Timer? _countdownTimer; + + // EN: Timer to hang up if the call is not answered within 30 seconds. + // AR: مؤقت لإنهاء المكالمة إذا لم يتم الرد خلال 30 ثانية. + Timer? _ringingTimeoutTimer; + + // EN: Flag to indicate if the peer connection is currently attempting ICE reconnection. + // AR: مؤشر يوضح ما إذا كان الاتصال يحاول إعادة بناء مسارات الشبكة حالياً. + bool _isReconnecting = false; + Timer? _reconnectTimer; + List _dynamicIceServers = []; + + AudioPlayer? _ringtonePlayer; + + void _startRingtone() async { + try { + _ringtonePlayer ??= AudioPlayer(); + await _ringtonePlayer!.setAsset('assets/order.mp3'); + await _ringtonePlayer!.setLoopMode(LoopMode.one); + _ringtonePlayer!.play(); + } catch (e) { + Log.print("Error playing ringtone: $e"); + } + } + + void _stopRingtone() { + try { + _ringtonePlayer?.stop(); + } catch (e) { + Log.print("Error stopping ringtone: $e"); + } + } + + @override + void onInit() { + super.onInit(); + // EN: Add lifecycle observer. + // AR: إضافة مراقب لدورة حياة التطبيق. + WidgetsBinding.instance.addObserver(this); + + // EN: Initialize WebSocket signaling listeners. + // AR: تهيئة مستمعي إشارات الـ WebSocket. + _initSignalingCallbacks(); + } + + // EN: Lifecycle hook: handle app switching background/foreground. + // AR: معالجة انتقال التطبيق إلى الخلفية أو العودة للواجهة. + @override + void didChangeAppLifecycleState(AppLifecycleState state) { + Log.print("VoiceCall: didChangeAppLifecycleState -> $state"); + if (state == AppLifecycleState.paused) { + Log.print( + "WARNING: App is in background. Microphone access might be suspended by the OS."); + } else if (state == AppLifecycleState.resumed) { + Log.print("App resumed. Verifying WebRTC connection health."); + if (this.state.value == VoiceCallState.active) { + _ensureMicrophoneActive(); + _attemptIceRestart(); + } + } + } + + // EN: Registers all event listeners for the signaling server. + // AR: تسجيل جميع مستمعي الأحداث لخادم الإشارات. + void _initSignalingCallbacks() { + // EN: Triggered when successfully connected to the signaling server. + // AR: يُستدعى عند الاتصال بنجاح بخادم الإشارات. + _signaling.onConnected = (iceServers) { + Log.print("WebRTC Signaling Connected & Authenticated"); + _dynamicIceServers = iceServers; + }; + + // EN: Triggered when the WebSocket connection drops. + // AR: يُستدعى عند انقطاع اتصال الـ WebSocket. + _signaling.onDisconnected = (reason) { + Log.print("WebRTC Signaling Disconnected: $reason"); + if (state.value != VoiceCallState.idle) { + _endCallInternal("signaling_disconnected"); + } + }; + + // EN: Triggered when the remote user joins the room. + // AR: يُستدعى عند انضمام الطرف الآخر إلى غرفة الاتصال. + _signaling.onParticipantJoined = () async { + Log.print("Remote participant joined signaling session"); + // EN: If we are the caller, initiate the WebRTC handshake by creating an Offer. + // AR: إذا كنا نحن المتصل، نبدأ مصافحة WebRTC بإنشاء عرض (Offer). + if (isCaller && state.value == VoiceCallState.dialing) { + state.value = VoiceCallState.connecting; + await _createOffer(); + } + }; + + // EN: Triggered when an SDP Offer is received from the remote peer. + // AR: يُستدعى عند استلام عرض اتصال (Offer) من الطرف الآخر. + _signaling.onOffer = (sdpMap) async { + Log.print("Received WebRTC SDP Offer"); + if (!isCaller) { + state.value = VoiceCallState.connecting; + await _initializePeerConnection(); + + // EN: Set the remote peer's settings. + // AR: تعيين إعدادات الطرف الآخر. + final description = + rtc.RTCSessionDescription(sdpMap['sdp'], sdpMap['type']); + await _peerConnection!.setRemoteDescription(description); + + // EN: Respond with an Answer. + // AR: الرد بإجابة (Answer). + await _createAnswer(); + } + }; + + // EN: Triggered when an SDP Answer is received. + // AR: يُستدعى عند استلام إجابة (Answer) من الطرف الآخر. + _signaling.onAnswer = (sdpMap) async { + Log.print("Received WebRTC SDP Answer"); + if (isCaller && _peerConnection != null) { + final description = + rtc.RTCSessionDescription(sdpMap['sdp'], sdpMap['type']); + await _peerConnection!.setRemoteDescription(description); + } + }; + + // EN: Triggered when ICE candidates (Network routing info) are exchanged. + // AR: يُستدعى عند تبادل مسارات الشبكة (ICE Candidates) لتأسيس الاتصال. + _signaling.onIceCandidate = (candidateMap) async { + Log.print("Received Remote ICE Candidate"); + if (_peerConnection != null) { + final candidate = rtc.RTCIceCandidate( + candidateMap['candidate'], + candidateMap['sdpMid'], + candidateMap['sdpMLineIndex'], + ); + await _peerConnection!.addCandidate(candidate); + } + }; + + // EN: Triggered when a hangup event is received from the server. + // AR: يُستدعى عند استلام حدث إنهاء المكالمة من السيرفر. + _signaling.onCallEnded = (reason) { + Log.print("WebRTC Call Ended: $reason"); + _endCallInternal(reason); + }; + } + + // --- CALL LIFECYCLE / دورة حياة المكالمة --- + + // EN: Initiates an outgoing call. + // AR: يبدأ مكالمة صادرة. + Future startCall({ + required String rideIdVal, + required String driverId, + required String passengerId, + required String remoteNameVal, + }) async { + if (state.value != VoiceCallState.idle) return; + + // EN: Setup call variables. + // AR: إعداد متغيرات المكالمة. + state.value = VoiceCallState.dialing; + isCaller = true; + currentUserId = driverId; + rideId.value = rideIdVal; + remoteName.value = remoteNameVal; + isMuted.value = false; + isSpeakerOn.value = false; + elapsedSeconds.value = 60; + _isReconnecting = false; + errorMessage.value = ""; + + _showCallBottomSheet(); + HapticFeedback.vibrate(); + + try { + // 1. EN: Request Microphone Permission / AR: طلب صلاحية الميكروفون + if (!GetPlatform.isIOS) { + final permissionStatus = await Permission.microphone.request(); + if (!permissionStatus.isGranted) { + errorMessage.value = + "Microphone permission is required for voice calls".tr; + _endCallInternal("permission_denied"); + return; + } + } + + // 2. EN: Call PHP Backend to create Node.js session & notify Passenger via FCM. + // AR: استدعاء واجهة PHP لإنشاء الجلسة على Node.js وإشعار الراكب عبر FCM. + final response = await CRUD().post( + link: "${AppLink.server}/ride/call/driver/create_call_session.php", + payload: {'ride_id': rideIdVal}, + ); + + if (response == null || + response == 'failure' || + response['status'] != 'success') { + errorMessage.value = + "Failed to initiate call session. Please try again.".tr; + _endCallInternal("session_creation_failed"); + return; + } + + final data = response['data']; + sessionId.value = data['session_id']; + + // 3. EN: Connect to WebRTC signaling server / AR: الاتصال بخادم الإشارات + await _signaling.connect(sessionId.value, currentUserId); + + // 4. EN: Initialize Local WebRTC Audio Stream / AR: تهيئة دفق الصوت المحلي + await _initializeLocalStream(); + + // 5. EN: Start Ringing Timeout Timer (30s max wait for passenger to answer). + // AR: بدء مؤقت الرنين (أقصى انتظار 30 ثانية لرد الراكب). + _ringingTimeoutTimer = Timer(const Duration(seconds: 30), () { + if (state.value == VoiceCallState.dialing) { + _signaling.send("hangup", {"reason": "no_answer"}); + _endCallInternal("no_answer"); + } + }); + } catch (e) { + Log.print("Error starting WebRTC call: $e"); + final errStr = e.toString().toLowerCase(); + if (errStr.contains("permission") || errStr.contains("denied")) { + errorMessage.value = + "Microphone permission is required for voice calls".tr; + } else { + errorMessage.value = "Error starting voice call".tr; + } + _endCallInternal("error"); + } + } + + // EN: Handles incoming call requests via FCM/Socket. + // AR: معالجة طلبات المكالمات الواردة. + Future receiveCall({ + required String sessionIdVal, + required String remoteNameVal, + required String rideIdVal, + }) async { + // EN: If already in a call, send busy signal. + // AR: إذا كان في مكالمة بالفعل، إرسال إشارة مشغول. + if (state.value != VoiceCallState.idle) { + _signaling.send("hangup", {"reason": "busy"}); + return; + } + + state.value = VoiceCallState.ringing; + isCaller = false; + currentUserId = box.read(BoxName.driverID).toString(); + sessionId.value = sessionIdVal; + rideId.value = rideIdVal; + remoteName.value = remoteNameVal; + isMuted.value = false; + isSpeakerOn.value = false; + elapsedSeconds.value = 60; + _isReconnecting = false; + errorMessage.value = ""; + + _showCallBottomSheet(); + _startRingtone(); + HapticFeedback.vibrate(); + + // EN: Max 30s ringing timeout for receiver before auto-decline. + // AR: أقصى مدة للرنين 30 ثانية قبل الرفض التلقائي. + _ringingTimeoutTimer = Timer(const Duration(seconds: 30), () { + if (state.value == VoiceCallState.ringing) { + declineCall(); + } + }); + } + + // EN: Accepts the incoming call. + // AR: قبول المكالمة الواردة. + Future acceptCall() async { + if (state.value != VoiceCallState.ringing) return; + + _ringingTimeoutTimer?.cancel(); + _stopRingtone(); + state.value = VoiceCallState.connecting; + errorMessage.value = ""; + + try { + // EN: Check Mic permissions / AR: التحقق من صلاحيات الميكروفون + if (!GetPlatform.isIOS) { + final permissionStatus = await Permission.microphone.request(); + if (!permissionStatus.isGranted) { + errorMessage.value = + "Microphone permission is required for voice calls".tr; + declineCall(); + return; + } + } + + await _signaling.connect(sessionId.value, currentUserId); + await _initializeLocalStream(); + + // EN: Notify caller we accepted / AR: إشعار المتصل بأننا قبلنا المكالمة + _signaling.send("join", {}); + } catch (e) { + Log.print("Error accepting call: $e"); + final errStr = e.toString().toLowerCase(); + if (errStr.contains("permission") || errStr.contains("denied")) { + errorMessage.value = + "Microphone permission is required for voice calls".tr; + } else { + errorMessage.value = "Error connecting call".tr; + } + declineCall(); + } + } + + // EN: Declines an incoming call. + // AR: رفض المكالمة الواردة. + void declineCall() { + _ringingTimeoutTimer?.cancel(); + _stopRingtone(); + _signaling.send("hangup", {"reason": "declined"}); + _endCallInternal("declined"); + } + + // EN: Ends an active or dialing call. + // AR: إنهاء المكالمة النشطة أو الجاري الاتصال بها. + void hangup() { + _signaling.send("hangup", {"reason": "normal"}); + _endCallInternal("hangup"); + } + + // --- WEBRTC CORE HELPERS / دوال WebRTC الأساسية --- + + // EN: Captures the audio from the microphone with optimization constraints. + // AR: التقاط الصوت من الميكروفون مع قيود تحسين الجودة (إلغاء الصدى والضوضاء). + Future _initializeLocalStream() async { + final Map mediaConstraints = { + 'audio': { + 'echoCancellation': true, + 'noiseSuppression': true, + 'autoGainControl': true, + }, + 'video': false, // EN: Audio only / AR: صوت فقط + }; + + _localStream = + await rtc.navigator.mediaDevices.getUserMedia(mediaConstraints); + rtc.Helper.setSpeakerphoneOn(isSpeakerOn.value); + } + + // EN: Verifies local microphone stream health on app resume and recreates/replaces track if suspended. + // AR: التحقق من سلامة مسار الميكروفون المحلي عند استئناف التطبيق وإعادة إنشائه إذا تم تعليقه. + Future _ensureMicrophoneActive() async { + if (_localStream == null || _peerConnection == null) return; + + bool needsRecreation = false; + if (_localStream!.active == false) { + needsRecreation = true; + } else { + for (var track in _localStream!.getAudioTracks()) { + if (!track.enabled && !isMuted.value) { + needsRecreation = true; + break; + } + } + } + + if (needsRecreation) { + Log.print( + "Local audio track ended or disabled. Recreating local stream..."); + try { + _localStream?.getTracks().forEach((track) => track.stop()); + _localStream?.dispose(); + _localStream = null; + + await _initializeLocalStream(); + + final senders = await _peerConnection!.getSenders(); + for (var sender in senders) { + final track = sender.track; + if (track != null && track.kind == 'audio') { + final newTracks = _localStream?.getAudioTracks(); + if (newTracks != null && newTracks.isNotEmpty) { + await sender.replaceTrack(newTracks.first); + Log.print( + "Replaced suspended/ended audio track with a new active one."); + } + break; + } + } + } catch (e) { + Log.print("Error recreating local stream on resume: $e"); + } + } else { + _localStream!.getAudioTracks().forEach((track) { + track.enabled = !isMuted.value; + }); + } + } + + // EN: Creates the peer connection object and sets up ICE servers (STUN/TURN). + // AR: إنشاء كائن الاتصال المباشر وإعداد خوادم STUN/TURN لاختراق الجدران النارية. + Future _initializePeerConnection() async { + if (_peerConnection != null) return; + + final List> iceServers = []; + if (_dynamicIceServers.isNotEmpty) { + for (var server in _dynamicIceServers) { + if (server is Map) { + iceServers.add({ + "urls": server["urls"] ?? server["url"], + if (server["username"] != null) "username": server["username"], + if (server["credential"] != null) + "credential": server["credential"], + }); + } + } + } else { + // EN: Fallback STUN servers / AR: خوام STUN الاحتياطية + iceServers.addAll([ + {"urls": "stun:stun.l.google.com:19302"}, + {"urls": "stun:stun1.l.google.com:19302"}, + ]); + } + + final Map configuration = { + "iceServers": iceServers, + }; + + _peerConnection = await rtc.createPeerConnection(configuration); + + // EN: Gather local network routing info and send to remote peer. + // AR: جمع بيانات مسارات الشبكة المحلية وإرسالها للطرف الآخر. + _peerConnection!.onIceCandidate = (candidate) { + if (candidate.candidate != null) { + _signaling.send("ice_candidate", { + "candidate": { + "candidate": candidate.candidate, + "sdpMid": candidate.sdpMid, + "sdpMLineIndex": candidate.sdpMLineIndex, + } + }); + } + }; + + // EN: Monitor connection status changes and handle disconnections. + // AR: مراقبة تغيرات حالة الاتصال ومعالجة انقطاع الشبكة. + _peerConnection!.onConnectionState = (connState) { + Log.print("RTCPeerConnectionState: $connState"); + if (connState == + rtc.RTCPeerConnectionState.RTCPeerConnectionStateConnected) { + _onCallConnected(); + } else if (connState == + rtc.RTCPeerConnectionState.RTCPeerConnectionStateFailed || + connState == + rtc.RTCPeerConnectionState.RTCPeerConnectionStateDisconnected) { + _handleIceConnectionFailure(); + } + }; + + // EN: Add local audio stream to the connection to send it to the other peer. + // AR: إضافة دفق الصوت المحلي للاتصال لإرساله للطرف الآخر. + if (_localStream != null) { + _localStream!.getTracks().forEach((track) { + _peerConnection!.addTrack(track, _localStream!); + }); + } + } + + // EN: Attempts an ICE restart to reconnect the WebRTC session when disconnections occur. + // AR: محاولة إعادة تأسيس الاتصال (ICE Restart) في حالة انقطاع الشبكة. + void _handleIceConnectionFailure() { + if (_isReconnecting) return; + _isReconnecting = true; + Log.print( + "ICE connection dropped. Attempting ICE Restart reconnection for 5s..."); + + if (isCaller) { + _attemptIceRestart(); + } + + _reconnectTimer?.cancel(); + _reconnectTimer = Timer(const Duration(seconds: 5), () { + if (state.value == VoiceCallState.active && + _peerConnection?.connectionState != + rtc.RTCPeerConnectionState.RTCPeerConnectionStateConnected) { + Log.print("ICE reconnection timed out. Hanging up."); + _endCallInternal("connection_lost"); + } else { + _isReconnecting = false; + Log.print("ICE Reconnection succeeded!"); + } + }); + } + + // EN: Initiates ICE Restart SDP exchange. + // AR: بدء تبادل حزم SDP لإعادة بناء مسارات الاتصال. + Future _attemptIceRestart() async { + if (_peerConnection == null || !isCaller) return; + try { + Log.print("Caller initiating WebRTC ICE Restart..."); + final constraints = { + 'mandatory': { + 'OfferToReceiveAudio': true, + 'OfferToReceiveVideo': false, + }, + 'optional': [ + {'IceRestart': true} + ], + }; + final offer = await _peerConnection!.createOffer(constraints); + await _peerConnection!.setLocalDescription(offer); + _signaling.send("offer", { + "sdp": { + "sdp": offer.sdp, + "type": offer.type, + } + }); + } catch (e) { + Log.print("Error initiating WebRTC ICE Restart: $e"); + } + } + + // EN: Generates an SDP Offer to initialize the connection. + // AR: إنشاء عرض (Offer) لبدء الاتصال وتحديد قدرات الجهاز. + Future _createOffer() async { + await _initializePeerConnection(); + + final constraints = { + 'mandatory': { + 'OfferToReceiveAudio': true, + 'OfferToReceiveVideo': false, + }, + 'optional': [], + }; + + final offer = await _peerConnection!.createOffer(constraints); + await _peerConnection!.setLocalDescription(offer); + + _signaling.send("offer", { + "sdp": { + "sdp": offer.sdp, + "type": offer.type, + } + }); + } + + // EN: Generates an SDP Answer in response to an Offer. + // AR: الرد بإنشاء إجابة (Answer) بناءً على العرض المستلم. + Future _createAnswer() async { + final constraints = { + 'mandatory': { + 'OfferToReceiveAudio': true, + 'OfferToReceiveVideo': false, + }, + 'optional': [], + }; + + final answer = await _peerConnection!.createAnswer(constraints); + await _peerConnection!.setLocalDescription(answer); + + _signaling.send("answer", { + "sdp": { + "sdp": answer.sdp, + "type": answer.type, + } + }); + } + + // EN: Triggered when connection is fully established. Starts the 60s timer. + // AR: يُستدعى عند تأسيس الاتصال بنجاح، ويقوم ببدء مؤقت الـ 60 ثانية. + void _onCallConnected() { + _ringingTimeoutTimer?.cancel(); + _reconnectTimer?.cancel(); + _isReconnecting = false; + + if (state.value != VoiceCallState.active) { + state.value = VoiceCallState.active; + HapticFeedback.vibrate(); + + // EN: Start 120s countdown timer / AR: بدء العد التنازلي لمدة 120 ثانية + _countdownTimer?.cancel(); + elapsedSeconds.value = 120; + _countdownTimer = Timer.periodic(const Duration(seconds: 1), (timer) { + if (elapsedSeconds.value > 1) { + elapsedSeconds.value--; + } else { + elapsedSeconds.value = 0; + _countdownTimer?.cancel(); + // EN: Force hangup when timer reaches 0 / AR: إغلاق إجباري عند وصول المؤقت لصفر + hangup(); + } + }); + } + } + + // EN: Internal cleanup function. Closes all connections and streams. + // AR: دالة التنظيف الداخلية. تقوم بإغلاق جميع الاتصالات وتفريغ الذاكرة. + void _endCallInternal(String reason) { + _countdownTimer?.cancel(); + _ringingTimeoutTimer?.cancel(); + _reconnectTimer?.cancel(); + _stopRingtone(); + + state.value = VoiceCallState.ended; + + // EN: Close WebRTC connection / AR: إغلاق اتصال WebRTC + _peerConnection?.close(); + _peerConnection = null; + + // EN: Stop mic capture / AR: إيقاف التقاط الميكروفون + _localStream?.getTracks().forEach((track) => track.stop()); + _localStream?.dispose(); + _localStream = null; + + // EN: Disconnect WebSockets / AR: إغلاق اتصال الـ WebSockets + _signaling.disconnect(); + + // EN: Close UI BottomSheet after delay / AR: إغلاق واجهة المكالمة بعد فترة زمنية قصيرة + Future.delayed(const Duration(milliseconds: 1500), () { + if (state.value == VoiceCallState.ended) { + state.value = VoiceCallState.idle; + Get.back(); + } + }); + } + + // --- ACTIONS (UI Controls) / إجراءات الواجهة --- + + // EN: Toggles microphone mute state. + // AR: تبديل حالة كتم الميكروفون. + void toggleMute() { + isMuted.value = !isMuted.value; + _localStream?.getAudioTracks().forEach((track) { + track.enabled = !isMuted.value; + }); + } + + // EN: Toggles loudspeaker mode. + // AR: تبديل حالة مكبر الصوت الخارجي. + void toggleSpeaker() { + isSpeakerOn.value = !isSpeakerOn.value; + rtc.Helper.setSpeakerphoneOn(isSpeakerOn.value); + } + + // EN: Displays the call UI overlay. + // AR: إظهار نافذة المكالمة السفلية. + void _showCallBottomSheet() { + Get.bottomSheet( + const VoiceCallBottomSheet(), + isScrollControlled: true, + enableDrag: false, + isDismissible: false, + ); + } + + // EN: Lifecycle hook: clean up resources when controller is destroyed. + // AR: دورة الحياة: تفريغ الذاكرة وإغلاق الموارد عند تدمير المتحكم. + @override + void onClose() { + WidgetsBinding.instance.removeObserver(this); + _countdownTimer?.cancel(); + _ringingTimeoutTimer?.cancel(); + _reconnectTimer?.cancel(); + _stopRingtone(); + _ringtonePlayer?.dispose(); + _peerConnection?.close(); + _localStream?.dispose(); + _signaling.disconnect(); + super.onClose(); + } +} diff --git a/siro_driver/lib/device_compatibility_page.dart b/siro_driver/lib/device_compatibility_page.dart new file mode 100644 index 0000000..48f7eda --- /dev/null +++ b/siro_driver/lib/device_compatibility_page.dart @@ -0,0 +1,271 @@ +import 'package:flutter/material.dart'; +import 'package:get/get.dart'; +import 'package:fl_chart/fl_chart.dart'; +import 'package:flutter/foundation.dart' + show kIsWeb, defaultTargetPlatform, TargetPlatform; +import 'controller/functions/device_analyzer.dart'; + +// --- CompatibilityDetailCard Widget (كما هو) --- +class CompatibilityDetailCard extends StatelessWidget { + final Map detail; + const CompatibilityDetailCard({super.key, required this.detail}); + + Color _getStatusColor(bool status, int achieved, int max) { + if (!status) return Colors.red.shade400; + if (achieved < max) return Colors.orange.shade600; + return Colors.teal; + } + + IconData _getIconForLabel(String label) { + if (label.contains('رام')) return Icons.memory; + if (label.contains('معالج') || label.contains('CPU')) + return Icons.developer_board; + if (label.contains('تخزين') || label.contains('كتابة')) + return Icons.sd_storage_outlined; + if (label.contains('أندرويد')) return Icons.android; + if (label.contains('خدمات')) return Icons.g_mobiledata; + if (label.contains('حساسات') || label.contains('Gyroscope')) + return Icons.sensors; + return Icons.smartphone; + } + + @override + Widget build(BuildContext context) { + final bool status = detail['status'] ?? false; + final String label = detail['label'] ?? ""; + final int achievedScore = detail['achieved_score'] ?? 0; + final int maxScore = detail['max_score'] ?? 1; + final Color color = _getStatusColor(status, achievedScore, maxScore); + final double progress = + (maxScore > 0) ? (achievedScore / maxScore).clamp(0.0, 1.0) : 0.0; + + return Container( + margin: const EdgeInsets.symmetric(horizontal: 16, vertical: 7), + padding: const EdgeInsets.all(16), + decoration: BoxDecoration( + color: Colors.white, + borderRadius: BorderRadius.circular(16), + boxShadow: [ + BoxShadow( + color: Colors.grey.withOpacity(0.08), + blurRadius: 15, + offset: const Offset(0, 5)) + ], + ), + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Row( + children: [ + Icon(_getIconForLabel(label), + color: Colors.grey.shade600, size: 20), + const SizedBox(width: 8), + Expanded( + child: Text(label, + style: TextStyle( + fontSize: 15, + color: Colors.grey.shade800, + fontWeight: FontWeight.w600)), + ), + Text("$achievedScore/$maxScore ${"points".tr}", + style: TextStyle( + color: color, fontWeight: FontWeight.bold, fontSize: 14)), + ], + ), + const SizedBox(height: 12), + LinearProgressIndicator( + value: progress, + backgroundColor: Colors.grey.shade200, + color: color, + minHeight: 6, + borderRadius: BorderRadius.circular(3), + ), + ], + ), + ); + } +} + +// --- Main Page Widget (Android-only) --- +class DeviceCompatibilityPage extends StatefulWidget { + const DeviceCompatibilityPage({super.key}); + @override + State createState() => + _DeviceCompatibilityPageState(); +} + +class _DeviceCompatibilityPageState extends State { + int score = 0; + List> details = []; + bool isLoading = true; + + bool get _isAndroid => + !kIsWeb && defaultTargetPlatform == TargetPlatform.android; + + @override + void initState() { + super.initState(); + if (_isAndroid) { + _initializePage(); + } else { + // منصّة غير أندرويد: لا تعمل أي تحليلات + setState(() => isLoading = false); + } + } + + Future _initializePage() async { + final result = await DeviceAnalyzer().analyzeDevice(); + if (!mounted) return; + setState(() { + score = result['score']; + details = List>.from(result['details']); + isLoading = false; + }); + } + + Color _getColorForScore(int value) { + if (value >= 80) return Colors.teal; + if (value >= 60) return Colors.orange.shade700; + return Colors.red.shade600; + } + + String _getScoreMessage(int value) { + if (value >= 80) return "Your device provides excellent performance".tr; + if (value >= 60) return "Your device is good and very suitable".tr; + if (value >= 40) return "Compatible, you may notice some slowness".tr; + return "The app may not work optimally".tr; + } + + @override + Widget build(BuildContext context) { + // حظر الصفحة على غير أندرويد + if (!_isAndroid) { + return Scaffold( + backgroundColor: const Color(0xFFF7F8FC), + appBar: AppBar( + title: Text("Device Compatibility".tr, + style: const TextStyle( + color: Colors.black87, fontWeight: FontWeight.bold)), + centerTitle: true, + backgroundColor: Colors.transparent, + elevation: 0, + iconTheme: const IconThemeData(color: Colors.black87), + ), + body: Center( + child: Padding( + padding: const EdgeInsets.all(24), + child: Column( + mainAxisSize: MainAxisSize.min, + children: [ + const Icon(Icons.phone_iphone, size: 56, color: Colors.grey), + const SizedBox(height: 12), + Text("This page is only available for Android devices".tr, + style: TextStyle(fontSize: 16)), + const SizedBox(height: 8), + ElevatedButton( + onPressed: () => Get.back(), + child: Text("Back".tr), + ), + ], + ), + ), + ), + ); + } + + return Scaffold( + backgroundColor: const Color(0xFFF7F8FC), + appBar: AppBar( + title: Text("Device Compatibility".tr, + style: + const TextStyle(color: Colors.black87, fontWeight: FontWeight.bold)), + centerTitle: true, + backgroundColor: Colors.transparent, + elevation: 0, + iconTheme: const IconThemeData(color: Colors.black87), + ), + body: isLoading + ? const Center(child: CircularProgressIndicator(color: Colors.teal)) + : Column( + children: [ + _buildScoreHeader(), + Expanded( + child: ListView.builder( + padding: const EdgeInsets.only(top: 10, bottom: 20), + itemCount: details.length, + itemBuilder: (context, i) => + CompatibilityDetailCard(detail: details[i]), + ), + ), + Padding( + padding: const EdgeInsets.fromLTRB(16, 8, 16, 24), + child: ElevatedButton( + style: ElevatedButton.styleFrom( + backgroundColor: Colors.teal, + minimumSize: const Size(double.infinity, 50), + shape: RoundedRectangleBorder( + borderRadius: BorderRadius.circular(12)), + elevation: 0, + ), + onPressed: () => Get.back(), + child: Text("Continue to App".tr, + style: TextStyle( + fontSize: 16, + fontWeight: FontWeight.bold, + color: Colors.white)), + ), + ), + ], + ), + ); + } + + /// الهيدر + Widget _buildScoreHeader() { + return Container( + margin: const EdgeInsets.symmetric(horizontal: 16), + height: 220, + child: Stack( + alignment: Alignment.center, + children: [ + PieChart( + PieChartData( + sectionsSpace: 4, + centerSpaceRadius: 80, + startDegreeOffset: -90, + sections: [ + PieChartSectionData( + color: _getColorForScore(score), + value: score.toDouble(), + title: '', + radius: 25), + PieChartSectionData( + color: Colors.grey.shade200, + value: (100 - score).toDouble().clamp(0, 100), + title: '', + radius: 25), + ], + ), + ), + Column( + mainAxisAlignment: MainAxisAlignment.center, + children: [ + Text("$score%", + style: TextStyle( + fontSize: 52, + fontWeight: FontWeight.bold, + color: _getColorForScore(score))), + const SizedBox(height: 4), + Text(_getScoreMessage(score), + textAlign: TextAlign.center, + style: TextStyle( + color: Colors.grey.shade700, + fontSize: 16, + fontWeight: FontWeight.w500)), + ], + ), + ], + ), + ); + } +} diff --git a/siro_driver/lib/env/env.dart b/siro_driver/lib/env/env.dart new file mode 100755 index 0000000..1edf4a9 --- /dev/null +++ b/siro_driver/lib/env/env.dart @@ -0,0 +1,328 @@ +import 'package:envied/envied.dart'; + +part 'env.g.dart'; + +@Envied() +abstract class Env { + @EnviedField(varName: 'basicAuthCredentials', obfuscate: true) + static final String basicAuthCredentials = _Env.basicAuthCredentials; + @EnviedField(varName: 'mapKeyOsm', obfuscate: true) + static final String mapKeyOsm = _Env.mapKeyOsm; + + @EnviedField(varName: 'mapAPIKEYIOS', obfuscate: true) + static final String mapAPIKEYIOS = _Env.mapAPIKEYIOS; + + @EnviedField(varName: 'mapSaasKey', obfuscate: true) + static final String mapSaasKey = _Env.mapSaasKey; + + @EnviedField(varName: 'email', obfuscate: true) + static final String email = _Env.email; + + @EnviedField(varName: 'basicCompareFaces', obfuscate: true) + static final String basicCompareFaces = _Env.basicCompareFaces; + +// @EnviedField(varName: 'getapiKey', obfuscate: true) +// static final String getapiKey = _Env.getapiKey; + + @EnviedField(varName: 'basicCompareFacesURL', obfuscate: true) + static final String basicCompareFacesURL = _Env.basicCompareFacesURL; + + @EnviedField(varName: 'accountSIDTwillo', obfuscate: true) + static final String accountSIDTwillo = _Env.accountSIDTwillo; + + @EnviedField(varName: 'serverAPI', obfuscate: true) + static final String serverAPI = _Env.serverAPI; + + @EnviedField(varName: 'mapAPIKEY', obfuscate: true) + static final String mapAPIKEY = _Env.mapAPIKEY; + + @EnviedField(varName: 'twilloRecoveryCode', obfuscate: true) + static final String twilloRecoveryCode = _Env.twilloRecoveryCode; + + @EnviedField(varName: 'authTokenTwillo', obfuscate: true) + static final String authTokenTwillo = _Env.authTokenTwillo; + + @EnviedField(varName: 'chatGPTkey', obfuscate: true) + static final String chatGPTkey = _Env.chatGPTkey; + + @EnviedField(varName: 'transactionCloude', obfuscate: true) + static final String transactionCloude = _Env.transactionCloude; + + @EnviedField(varName: 'visionApi', obfuscate: true) + static final String visionApi = _Env.visionApi; + + @EnviedField(varName: 'secretKey', obfuscate: true) + static final String secretKey = _Env.secretKey; + + + @EnviedField(varName: 'chatGPTkeySefer', obfuscate: true) + static final String chatGPTkeySefer = _Env.chatGPTkeySefer; + + @EnviedField(varName: 'llamaKey', obfuscate: true) + static final String llamaKey = _Env.llamaKey; + + @EnviedField(varName: 'serverPHP', obfuscate: true) + static final String serverPHP = _Env.serverPHP; + @EnviedField( + varName: 'anthropicAIkeySeferNewHamzaayedpython', obfuscate: true) + static final String anthropicAIkeySeferNewHamzaayedpython = + _Env.anthropicAIkeySeferNewHamzaayedpython; + @EnviedField(varName: 'privateKeyFCM', obfuscate: true) + static final String privateKeyFCM = _Env.privateKeyFCM; + + @EnviedField(varName: 'seferAlexandriaServer', obfuscate: true) + static final String seferAlexandriaServer = _Env.seferAlexandriaServer; + + @EnviedField(varName: 'seferPaymentServer', obfuscate: true) + static final String seferPaymentServer = _Env.seferPaymentServer; + + @EnviedField(varName: 'seferCairoServer', obfuscate: true) + static final String seferCairoServer = _Env.seferCairoServer; + + @EnviedField(varName: 'seferGizaServer', obfuscate: true) + static final String seferGizaServer = _Env.seferGizaServer; + + @EnviedField(varName: 'chatGPTkeySeferNew', obfuscate: true) + static final String chatGPTkeySeferNew = _Env.chatGPTkeySeferNew; + + @EnviedField(varName: 'cohere', obfuscate: true) + static final String cohere = _Env.cohere; + + @EnviedField(varName: 'claudeAiAPI', obfuscate: true) + static final String claudeAiAPI = _Env.claudeAiAPI; + + + @EnviedField(varName: 'geminiApi', obfuscate: true) + static final String geminiApi = _Env.geminiApi; + + @EnviedField(varName: 'geminiApiMasa', obfuscate: true) + static final String geminiApiMasa = _Env.geminiApiMasa; + + @EnviedField(varName: 'agoraAppId', obfuscate: true) + static final String agoraAppId = _Env.agoraAppId; + + @EnviedField(varName: 'agoraAppCertificate', obfuscate: true) + static final String agoraAppCertificate = _Env.agoraAppCertificate; + + + @EnviedField(varName: 'integrationIdPayMob', obfuscate: true) + static final String integrationIdPayMob = _Env.integrationIdPayMob; + + @EnviedField(varName: 'passwordPayMob', obfuscate: true) + static final String passwordPayMob = _Env.passwordPayMob; + + @EnviedField(varName: 'usernamePayMob', obfuscate: true) + static final String usernamePayMob = _Env.usernamePayMob; + + @EnviedField(varName: 'payMobApikey', obfuscate: true) + static final String payMobApikey = _Env.payMobApikey; + + @EnviedField(varName: 'integrationIdPayMobWallet', obfuscate: true) + static final String integrationIdPayMobWallet = + _Env.integrationIdPayMobWallet; + + @EnviedField(varName: 'smsPasswordEgypt', obfuscate: true) + static final String smsPasswordEgypt = _Env.smsPasswordEgypt; + + @EnviedField(varName: 'ocpApimSubscriptionKey', obfuscate: true) + static final String ocpApimSubscriptionKey = _Env.ocpApimSubscriptionKey; + + @EnviedField(varName: 'chatGPTkeySeferNew4', obfuscate: true) + static final String chatGPTkeySeferNew4 = _Env.chatGPTkeySeferNew4; + + @EnviedField(varName: 'anthropicAIkeySeferNew', obfuscate: true) + static final String anthropicAIkeySeferNew = _Env.anthropicAIkeySeferNew; + + @EnviedField(varName: 'llama3Key', obfuscate: true) + static final String llama3Key = _Env.llama3Key; + + @EnviedField(varName: 'payMobOutPassword', obfuscate: true) + static final String payMobOutPassword = _Env.payMobOutPassword; + + @EnviedField(varName: 'payMobOutUserName', obfuscate: true) + static final String payMobOutUserName = _Env.payMobOutUserName; + + @EnviedField(varName: 'A', obfuscate: true) + static final String A = _Env.A; + + @EnviedField(varName: 'B', obfuscate: true) + static final String B = _Env.B; + + @EnviedField(varName: 'C', obfuscate: true) + static final String C = _Env.C; + + @EnviedField(varName: 'D', obfuscate: true) + static final String D = _Env.D; + + @EnviedField(varName: 'E', obfuscate: true) + static final String E = _Env.E; + + @EnviedField(varName: 'F', obfuscate: true) + static final String F = _Env.F; + + @EnviedField(varName: 'G', obfuscate: true) + static final String G = _Env.G; + + @EnviedField(varName: 'H', obfuscate: true) + static final String H = _Env.H; + + @EnviedField(varName: 'I', obfuscate: true) + static final String I = _Env.I; + + @EnviedField(varName: 'J', obfuscate: true) + static final String J = _Env.J; + + @EnviedField(varName: 'K', obfuscate: true) + static final String K = _Env.K; + + @EnviedField(varName: 'L', obfuscate: true) + static final String L = _Env.L; + + @EnviedField(varName: 'M', obfuscate: true) + static final String M = _Env.M; + + @EnviedField(varName: 'N', obfuscate: true) + static final String N = _Env.N; + + @EnviedField(varName: 'O', obfuscate: true) + static final String O = _Env.O; + + @EnviedField(varName: 'P', obfuscate: true) + static final String P = _Env.P; + + @EnviedField(varName: 'Q', obfuscate: true) + static final String Q = _Env.Q; + + @EnviedField(varName: 'R', obfuscate: true) + static final String R = _Env.R; + + @EnviedField(varName: 'S', obfuscate: true) + static final String S = _Env.S; + + @EnviedField(varName: 'T', obfuscate: true) + static final String T = _Env.T; + + @EnviedField(varName: 'U', obfuscate: true) + static final String U = _Env.U; + + @EnviedField(varName: 'V', obfuscate: true) + static final String V = _Env.V; + + @EnviedField(varName: 'W', obfuscate: true) + static final String W = _Env.W; + + @EnviedField(varName: 'X', obfuscate: true) + static final String X = _Env.X; + + @EnviedField(varName: 'Y', obfuscate: true) + static final String Y = _Env.Y; + + @EnviedField(varName: 'Z', obfuscate: true) + static final String Z = _Env.Z; + @EnviedField(varName: 'a', obfuscate: true) + static final String a = _Env.a; + + @EnviedField(varName: 'b', obfuscate: true) + static final String b = _Env.b; + + @EnviedField(varName: 'c', obfuscate: true) + static final String c = _Env.c; + + @EnviedField(varName: 'd', obfuscate: true) + static final String d = _Env.d; + + @EnviedField(varName: 'e', obfuscate: true) + static final String e = _Env.e; + + @EnviedField(varName: 'f', obfuscate: true) + static final String f = _Env.f; + + @EnviedField(varName: 'g', obfuscate: true) + static final String g = _Env.g; + + @EnviedField(varName: 'h', obfuscate: true) + static final String h = _Env.h; + + @EnviedField(varName: 'i', obfuscate: true) + static final String i = _Env.i; + + @EnviedField(varName: 'j', obfuscate: true) + static final String j = _Env.j; + + @EnviedField(varName: 'k', obfuscate: true) + static final String k = _Env.k; + + @EnviedField(varName: 'l', obfuscate: true) + static final String l = _Env.l; + + @EnviedField(varName: 'm', obfuscate: true) + static final String m = _Env.m; + + @EnviedField(varName: 'n', obfuscate: true) + static final String n = _Env.n; + + @EnviedField(varName: 'o', obfuscate: true) + static final String o = _Env.o; + + @EnviedField(varName: 'p', obfuscate: true) + static final String p = _Env.p; + + @EnviedField(varName: 'q', obfuscate: true) + static final String q = _Env.q; + + @EnviedField(varName: 'r', obfuscate: true) + static final String r = _Env.r; + + @EnviedField(varName: 's', obfuscate: true) + static final String s = _Env.s; + + @EnviedField(varName: 't', obfuscate: true) + static final String t = _Env.t; + + @EnviedField(varName: 'u', obfuscate: true) + static final String u = _Env.u; + + @EnviedField(varName: 'v', obfuscate: true) + static final String v = _Env.v; + + @EnviedField(varName: 'w', obfuscate: true) + static final String w = _Env.w; + + @EnviedField(varName: 'x', obfuscate: true) + static final String x = _Env.x; + + @EnviedField(varName: 'y', obfuscate: true) + static final String y = _Env.y; + + @EnviedField(varName: 'z', obfuscate: true) + static final String z = _Env.z; + + @EnviedField(varName: 'keyOfApp', obfuscate: true) + static final String keyOfApp = _Env.keyOfApp; + + @EnviedField(varName: 'initializationVector', obfuscate: true) + static final String initializationVector = _Env.initializationVector; + + @EnviedField(varName: 'emailService', obfuscate: true) + static final String emailService = _Env.emailService; + @EnviedField(varName: 'sss_encryptionSalt', obfuscate: true) + static final String sss_encryptionSalt = _Env.sss_encryptionSalt; + + @EnviedField(varName: 'sss_pass', obfuscate: true) + static final String sss_pass = _Env.sss_pass; + + @EnviedField(varName: 'addd', obfuscate: true) + static final String addd = _Env.addd; + + @EnviedField(varName: 'passnpassenger', obfuscate: true) + static final String passnpassenger = _Env.passnpassenger; + + @EnviedField(varName: 'newId', obfuscate: true) + static final String newId = _Env.newId; + + @EnviedField(varName: 'allowed', obfuscate: true) + static final String allowed = _Env.allowed; + + @EnviedField(varName: 'allowedWallet', obfuscate: true) + static final String allowedWallet = _Env.allowedWallet; +} diff --git a/siro_driver/lib/env/env.g.dart b/siro_driver/lib/env/env.g.dart new file mode 100644 index 0000000..d64ef06 --- /dev/null +++ b/siro_driver/lib/env/env.g.dart @@ -0,0 +1,13585 @@ +// GENERATED CODE - DO NOT MODIFY BY HAND + +part of 'env.dart'; + +// ************************************************************************** +// EnviedGenerator +// ************************************************************************** + +// coverage:ignore-file +// ignore_for_file: type=lint +// generated_from: .env +final class _Env { + static const List _enviedkeybasicAuthCredentials = [ + 2990589258, + 4231032652, + 1960581160, + 2523752965, + 2254376721, + 878556145, + 209406639, + 1445479573, + 2460208703, + 3167966191, + 967159540, + 3362566192, + 216494215, + 632431381, + 1662586490, + 3335640140, + 420776473, + 2068738655, + 1903611039, + 3805653015, + 2621026051, + 164883116, + 2242456407, + 1067357525, + 4097827574, + 2277905079, + 829897287, + 2991445945, + 3086372913, + 2504507883, + 3445146738, + ]; + + static const List _envieddatabasicAuthCredentials = [ + 2990589245, + 4231032637, + 1960581190, + 2523753064, + 2254376800, + 878556032, + 209406684, + 1445479679, + 2460208710, + 3167966105, + 967159427, + 3362566234, + 216494321, + 632431407, + 1662586388, + 3335640125, + 420776555, + 2068738566, + 1903611093, + 3805653063, + 2621026115, + 164883101, + 2242456416, + 1067357542, + 4097827521, + 2277905135, + 829897269, + 2991445985, + 3086372957, + 2504507817, + 3445146654, + ]; + + static final String basicAuthCredentials = String.fromCharCodes( + List.generate( + _envieddatabasicAuthCredentials.length, + (int i) => i, + growable: false, + ).map((int i) => + _envieddatabasicAuthCredentials[i] ^ + _enviedkeybasicAuthCredentials[i])); + + static const List _enviedkeymapKeyOsm = [ + 208493858, + 3350167483, + 1302125882, + 1192647419, + 2404732788, + 2076531854, + 1641419367, + 1819498687, + 2756794616, + 2271265160, + 410515984, + 2946375390, + 1516099909, + 475427434, + 1207502576, + 3766393267, + 507168482, + 2869547486, + 2351158037, + 442607028, + ]; + + static const List _envieddatamapKeyOsm = [ + 208493903, + 3350167514, + 1302125910, + 1192647327, + 2404732689, + 2076531960, + 1641419303, + 1819498701, + 2756794519, + 2271265277, + 410516068, + 2946375355, + 1516099944, + 475427342, + 1207502495, + 3766393311, + 507168398, + 2869547455, + 2351158119, + 442607047, + ]; + + static final String mapKeyOsm = String.fromCharCodes(List.generate( + _envieddatamapKeyOsm.length, + (int i) => i, + growable: false, + ).map((int i) => _envieddatamapKeyOsm[i] ^ _enviedkeymapKeyOsm[i])); + + static const List _enviedkeymapAPIKEYIOS = [ + 1993287479, + 2842696658, + 1670961530, + 571188323, + 3566057664, + 79810790, + 3095519207, + 2702178760, + 3505088102, + 1332839557, + 1099099824, + 3874657948, + 101827659, + 3612803306, + 3915111541, + 2547960786, + 1983753195, + 953785961, + 399710458, + 3520013645, + 3474320879, + 191306094, + 3407917650, + 3851143733, + 1603590875, + 1332796221, + 1989733533, + 2964509008, + 2772496351, + 4248238702, + 2069369743, + 1776566496, + 200328467, + 2798520895, + 68312770, + 2692339723, + 3680295276, + 1655200211, + 182747085, + ]; + + static const List _envieddatamapAPIKEYIOS = [ + 1993287542, + 2842696603, + 1670961408, + 571188226, + 3566057619, + 79810719, + 3095519139, + 2702178732, + 3505088023, + 1332839662, + 1099099900, + 3874658001, + 101827592, + 3612803224, + 3915111428, + 2547960760, + 1983753149, + 953785883, + 399710356, + 3520013690, + 3474320823, + 191305987, + 3407917619, + 3851143761, + 1603590802, + 1332796236, + 1989733604, + 2964508990, + 2772496294, + 4248238593, + 2069369805, + 1776566401, + 200328484, + 2798520943, + 68312816, + 2692339772, + 3680295203, + 1655200182, + 182747008, + ]; + + static final String mapAPIKEYIOS = String.fromCharCodes(List.generate( + _envieddatamapAPIKEYIOS.length, + (int i) => i, + growable: false, + ).map((int i) => _envieddatamapAPIKEYIOS[i] ^ _enviedkeymapAPIKEYIOS[i])); + + static const List _enviedkeymapSaasKey = [ + 1152515337, + 612278083, + 456797620, + 1338651092, + 3400820223, + 2372440906, + 2162269364, + 433812069, + 310318919, + 399053120, + 2870991475, + 561936812, + 2884617529, + 3677057575, + 622986133, + 1023997185, + 4142318139, + 2210519462, + 1747028641, + 1022530233, + 3838726965, + 4226461494, + 2617030857, + 3800004349, + 1091840269, + 4214668900, + 2855689796, + ]; + + static const List _envieddatamapSaasKey = [ + 1152515424, + 612278061, + 456797675, + 1338651117, + 3400820171, + 2372440957, + 2162269324, + 433811975, + 310318964, + 399053170, + 2870991435, + 561936799, + 2884617487, + 3677057603, + 622986148, + 1023997240, + 4142318168, + 2210519488, + 1747028679, + 1022530190, + 3838726918, + 4226461522, + 2617030827, + 3800004302, + 1091840317, + 4214668882, + 2855689847, + ]; + + static final String mapSaasKey = String.fromCharCodes(List.generate( + _envieddatamapSaasKey.length, + (int i) => i, + growable: false, + ).map((int i) => _envieddatamapSaasKey[i] ^ _enviedkeymapSaasKey[i])); + + static const List _enviedkeyemail = [ + 3507274737, + 3264718769, + 2759567973, + 540972372, + 1397631761, + 3474581669, + 4105157398, + 3364497626, + 1705013345, + 1289768273, + 1175569918, + 4058620033, + 1812845490, + 971134022, + 1377684042, + ]; + + static const List _envieddataemail = [ + 3507274673, + 3264718808, + 2759567883, + 540972320, + 1397631856, + 3474581705, + 4105157491, + 3364497579, + 1705013248, + 1289768225, + 1175569806, + 4058620079, + 1812845521, + 971133993, + 1377684007, + ]; + + static final String email = String.fromCharCodes(List.generate( + _envieddataemail.length, + (int i) => i, + growable: false, + ).map((int i) => _envieddataemail[i] ^ _enviedkeyemail[i])); + + static const List _enviedkeybasicCompareFaces = [ + 2948603683, + 1419621286, + 4018212457, + 1121620281, + 221710536, + 3586502550, + 4100318555, + 1770443814, + 4219804944, + 2878283764, + 1552437214, + 185983079, + 2706699511, + 336330255, + 772190043, + 4294872002, + 2853475718, + 88610192, + 2151488097, + 384987953, + 1044193006, + 2957091184, + 33186055, + 1349225194, + 233154710, + 3542630164, + 42738728, + 981646969, + ]; + + static const List _envieddatabasicCompareFaces = [ + 2948603737, + 1419621324, + 4018212380, + 1121620307, + 221710500, + 3586502627, + 4100318506, + 1770443840, + 4219805024, + 2878283678, + 1552437220, + 185982985, + 2706699398, + 336330365, + 772189954, + 4294871976, + 2853475830, + 88610256, + 2151488080, + 384987910, + 1044192989, + 2957091143, + 33186143, + 1349225112, + 233154766, + 3542630264, + 42738794, + 981646869, + ]; + + static final String basicCompareFaces = String.fromCharCodes( + List.generate( + _envieddatabasicCompareFaces.length, + (int i) => i, + growable: false, + ).map((int i) => + _envieddatabasicCompareFaces[i] ^ _enviedkeybasicCompareFaces[i])); + + static const List _enviedkeybasicCompareFacesURL = [ + 2854755713, + 1887284855, + 1632945913, + 2043352776, + 1401670511, + 1321413758, + 1358501179, + 2319315657, + 558802519, + 3435990745, + 428209181, + 3549430154, + 3921046816, + 934116203, + 2292268309, + 418459468, + 1236079019, + 3607461187, + 717710438, + 2017397595, + 790967261, + 1378226043, + 2442486882, + 4012899028, + 3036106618, + 2275089852, + 3127783148, + 3803324082, + 365135232, + 2935582689, + 533078618, + 1246951539, + 1022728134, + 1082693697, + 2117237320, + 843581020, + 469547132, + 1527001694, + 882161199, + 512357744, + 2874034311, + 2004724773, + 1074917563, + 2468682342, + 1519005631, + 1769336345, + 2360821585, + 1875392094, + 2000498564, + 3360359338, + 8254159, + 3999404370, + 803153196, + 2577956679, + 2960422859, + 3005812287, + 4027088979, + 3289099019, + 323778300, + 2014675141, + ]; + + static const List _envieddatabasicCompareFacesURL = [ + 2854755817, + 1887284739, + 1632945805, + 2043352760, + 1401670428, + 1321413700, + 1358501140, + 2319315686, + 558802481, + 3435990712, + 428209278, + 3549430255, + 3921046797, + 934116111, + 2292268400, + 418459448, + 1236079054, + 3607461152, + 717710354, + 2017397622, + 790967227, + 1378225997, + 2442486875, + 4012899046, + 3036106574, + 2275089807, + 3127783125, + 3803324032, + 365135331, + 2935582677, + 533078585, + 1246951492, + 1022728168, + 1082693673, + 2117237293, + 843580974, + 469547027, + 1527001653, + 882161242, + 512357649, + 2874034423, + 2004724821, + 1074917525, + 2468682245, + 1519005648, + 1769336436, + 2360821630, + 1875392061, + 2000498667, + 3360359367, + 8254143, + 3999404339, + 803153246, + 2577956642, + 2960422804, + 3005812313, + 4027088946, + 3289099112, + 323778201, + 2014675126, + ]; + + static final String basicCompareFacesURL = String.fromCharCodes( + List.generate( + _envieddatabasicCompareFacesURL.length, + (int i) => i, + growable: false, + ).map((int i) => + _envieddatabasicCompareFacesURL[i] ^ + _enviedkeybasicCompareFacesURL[i])); + + static const List _enviedkeyaccountSIDTwillo = [ + 456932435, + 2394750284, + 4284181365, + 3031678563, + 317926429, + 795284051, + 1239229608, + 3318462614, + 2466998260, + 2588715560, + 343407178, + 3169471995, + 2183907407, + 882711255, + 405145478, + 3363213383, + 2516552357, + 1555439561, + 2937131364, + 370795761, + 1214940587, + 1718892463, + 1547436541, + 4257171120, + 157772679, + 4064158261, + 272246761, + 2228064589, + 2398808887, + 2887476963, + 431763950, + 3302452238, + 2710243705, + 4227149070, + 3254488084, + 3117709212, + 42590298, + 2445946994, + 3175762607, + 1938889012, + 1843269736, + ]; + + static const List _envieddataaccountSIDTwillo = [ + 456932354, + 2394750218, + 4284181261, + 3031678547, + 317926508, + 795284010, + 1239229596, + 3318462627, + 2466998210, + 2588715586, + 343407167, + 3169471889, + 2183907452, + 882711279, + 405145525, + 3363213353, + 2516552348, + 1555439537, + 2937131281, + 370795656, + 1214940569, + 1718892446, + 1547436484, + 4257171076, + 157772790, + 4064158211, + 272246747, + 2228064628, + 2398808902, + 2887476946, + 431763848, + 3302452324, + 2710243657, + 4227149175, + 3254488099, + 3117709252, + 42590248, + 2445946922, + 3175762627, + 1938889078, + 1843269636, + ]; + + static final String accountSIDTwillo = String.fromCharCodes( + List.generate( + _envieddataaccountSIDTwillo.length, + (int i) => i, + growable: false, + ).map((int i) => + _envieddataaccountSIDTwillo[i] ^ _enviedkeyaccountSIDTwillo[i])); + + static const List _enviedkeyserverAPI = [ + 1005134932, + 1560489340, + 4098840392, + 3030460720, + 3622847797, + 3846771692, + 582467599, + 880769766, + 2494391371, + 1289393858, + 126950013, + 2845165886, + 537516254, + 1707623060, + 4276394812, + 4256457332, + 874583387, + 1269844682, + 2063301980, + 2668594661, + 3885892954, + 1857040947, + 1850528889, + 2713517713, + 63446137, + 2754029620, + 1046857764, + 3399318423, + 3486594721, + 161127469, + 4235234329, + 2773344728, + 3452287862, + 2595057183, + 2390888428, + 3529759810, + 2409404352, + 509567013, + 2214372144, + 3302492367, + 2363324569, + 1487963109, + 3490085523, + 2081606030, + 2543724561, + 1426083832, + 3306409158, + 3270791487, + 2763579931, + 2633299306, + 346044323, + 2206980053, + 1572988721, + 946909255, + 20944117, + 707333999, + 1961159663, + 1551183522, + 1851873301, + 2877009979, + 894026350, + 2348593380, + 2828334770, + 2840953455, + 732772067, + 2817706016, + 712188444, + 1193775064, + 2230730747, + 103849368, + 2218587188, + 3380734951, + 1215869333, + 1093833403, + 4030587557, + 3939409569, + 2607471171, + 3949623346, + 248554892, + 3901557738, + 1465905942, + 2949209671, + 3815908740, + 2219007948, + 1450938377, + 645332705, + 463508631, + 48953837, + 3488584863, + 1958069811, + 1049855973, + 2166736869, + 2081577687, + 2634302530, + 406655778, + 4161775880, + 3104853321, + 718983767, + 1688636005, + 1534543340, + 3209664154, + 1857359472, + 1196964155, + 1267022738, + 2130001398, + 3131624573, + 1085585504, + 1706787164, + 1564622450, + 2683276590, + 2261265490, + 3891141, + 884631201, + 786167737, + 1563906890, + 3758398083, + 1243568143, + 3106479883, + 2336449031, + 3438787255, + 1012646549, + 1846736197, + 1926956562, + 3802351611, + 1129166102, + 1669918550, + 3772043211, + 2066098146, + 946610675, + 4082556517, + 2182235821, + 3819764613, + 1428211119, + 2368092505, + 1661020050, + 4225190333, + 2910928672, + 1401246065, + 1521236075, + 2816980718, + 3781380495, + 1086765682, + 2119495451, + 1494680386, + 2279679799, + 1317236686, + 546596578, + 3055309067, + 3782330829, + 3155996227, + 3297779951, + 642054514, + 3188931893, + 1812913869, + 4100157596, + 3151517500, + 2129116786, + 412520874, + ]; + + static const List _envieddataserverAPI = [ + 1005134853, + 1560489261, + 4098840345, + 3030460769, + 3622847834, + 3846771598, + 582467676, + 880769684, + 2494391353, + 1289393796, + 126949908, + 2845165828, + 537516175, + 1707623106, + 4276394861, + 4256457292, + 874583404, + 1269844658, + 2063301897, + 2668594642, + 3885892896, + 1857040964, + 1850528826, + 2713517799, + 63446036, + 2754029678, + 1046857822, + 3399318477, + 3486594757, + 161127500, + 4235234401, + 2773344685, + 3452287781, + 2595057197, + 2390888330, + 3529759856, + 2409404403, + 509567100, + 2214372100, + 3302492322, + 2363324643, + 1487963090, + 3490085598, + 2081606132, + 2543724648, + 1426083767, + 3306409148, + 3270791501, + 2763579939, + 2633299205, + 346044359, + 2206980071, + 1572988755, + 946909237, + 20944067, + 707333924, + 1961159606, + 1551183579, + 1851873392, + 2877010045, + 894026255, + 2348593328, + 2828334820, + 2840953379, + 732772004, + 2817706003, + 712188503, + 1193775083, + 2230730643, + 103849440, + 2218587137, + 3380734909, + 1215869428, + 1093833454, + 4030587612, + 3939409625, + 2607471220, + 3949623383, + 248554965, + 3901557660, + 1465906007, + 2949209630, + 3815908852, + 2219007885, + 1450938463, + 645332613, + 463508700, + 48953734, + 3488584882, + 1958069761, + 1049855965, + 2166736851, + 2081577625, + 2634302486, + 406655856, + 4161775969, + 3104853370, + 718983725, + 1688635926, + 1534543317, + 3209664243, + 1857359395, + 1196964212, + 1267022844, + 2130001326, + 3131624457, + 1085585464, + 1706787086, + 1564622395, + 2683276630, + 2261265441, + 3891122, + 884631238, + 786167690, + 1563906817, + 3758398182, + 1243568236, + 3106479945, + 2336449130, + 3438787268, + 1012646649, + 1846736246, + 1926956612, + 3802351491, + 1129166172, + 1669918575, + 3772043196, + 2066098093, + 946610654, + 4082556435, + 2182235876, + 3819764725, + 1428211160, + 2368092460, + 1661020070, + 4225190381, + 2910928726, + 1401246022, + 1521235983, + 2816980613, + 3781380551, + 1086765593, + 2119495491, + 1494680364, + 2279679838, + 1317236667, + 546596506, + 3055309126, + 3782330782, + 3155996167, + 3297779848, + 642054437, + 3188931949, + 1812913855, + 4100157636, + 3151517520, + 2129116720, + 412520902, + ]; + + static final String serverAPI = String.fromCharCodes(List.generate( + _envieddataserverAPI.length, + (int i) => i, + growable: false, + ).map((int i) => _envieddataserverAPI[i] ^ _enviedkeyserverAPI[i])); + + static const List _enviedkeymapAPIKEY = [ + 3749163921, + 953395003, + 1767412285, + 1335284542, + 3448058466, + 1612945338, + 3586552591, + 2090171087, + 3526723784, + 836102880, + 3996902529, + 3990240209, + 472852632, + 1536052374, + 4113097178, + 3105161968, + 4028683875, + 2889449955, + 2444023830, + 399488591, + 1959492832, + 1605946444, + 1099868321, + 3868069690, + 719352684, + 2370553143, + 3313461066, + 3190231335, + 823295380, + 2453023293, + 3525029148, + 186365312, + 161938621, + 1082257920, + 3631684521, + 3802551583, + 1759892110, + 2198567973, + 349203251, + ]; + + static const List _envieddatamapAPIKEY = [ + 3749163984, + 953395058, + 1767412295, + 1335284575, + 3448058417, + 1612945347, + 3586552654, + 2090171039, + 3526723726, + 836102834, + 3996902622, + 3990240137, + 472852730, + 1536052420, + 4113097108, + 3105161920, + 4028683835, + 2889449913, + 2444023843, + 399488518, + 1959492762, + 1605946495, + 1099868384, + 3868069731, + 719352616, + 2370553181, + 3313460996, + 3190231422, + 823295452, + 2453023354, + 3525029206, + 186365383, + 161938575, + 1082258035, + 3631684507, + 3802551630, + 1759892185, + 2198568018, + 349203326, + ]; + + static final String mapAPIKEY = String.fromCharCodes(List.generate( + _envieddatamapAPIKEY.length, + (int i) => i, + growable: false, + ).map((int i) => _envieddatamapAPIKEY[i] ^ _enviedkeymapAPIKEY[i])); + + static const List _enviedkeytwilloRecoveryCode = [ + 1133150946, + 3731109025, + 38905816, + 718416682, + 72532071, + 2888096027, + 2392597488, + 3046514139, + 3282646159, + 3833127298, + 1941254446, + 577842838, + 2655477355, + 2625792459, + 135049165, + 3192772188, + 117259137, + 3454722240, + 4196590134, + 2442365517, + 1899915297, + 208044477, + 3437713724, + 234660955, + 496784642, + 109839164, + 3392287722, + 147447155, + 3541038333, + 2366194776, + 1852630248, + ]; + + static const List _envieddatatwilloRecoveryCode = [ + 1133150881, + 3731109088, + 38905741, + 718416669, + 72532062, + 2888096095, + 2392597432, + 3046514059, + 3282646215, + 3833127347, + 1941254508, + 577842940, + 2655477294, + 2625792498, + 135049117, + 3192772105, + 117259209, + 3454722292, + 4196590195, + 2442365465, + 1899915385, + 208044521, + 3437713775, + 234660867, + 496784728, + 109839204, + 3392287640, + 147447083, + 3541038225, + 2366194714, + 1852630148, + ]; + + static final String twilloRecoveryCode = String.fromCharCodes( + List.generate( + _envieddatatwilloRecoveryCode.length, + (int i) => i, + growable: false, + ).map((int i) => + _envieddatatwilloRecoveryCode[i] ^ _enviedkeytwilloRecoveryCode[i])); + + static const List _enviedkeyauthTokenTwillo = [ + 3004859271, + 1630336233, + 3841355683, + 1769616699, + 3998463394, + 49387018, + 2915330775, + 3804652580, + 1045733655, + 1076268615, + 1608894417, + 2841246974, + 3747506980, + 3426803056, + 1523200528, + 3748784460, + 796952965, + 1370470654, + 3007103367, + 2385290238, + 2449012063, + 3891828260, + 2489280733, + 141990754, + 126631019, + 1307652811, + 1680208544, + 4200085184, + 1697029813, + 3638779335, + 1513478808, + 1409532047, + 2856634519, + 340029293, + 1729269177, + 1238906, + 3864127424, + 1348589490, + 2394020807, + ]; + + static const List _envieddataauthTokenTwillo = [ + 3004859312, + 1630336217, + 3841355734, + 1769616642, + 3998463386, + 49387104, + 2915330722, + 3804652564, + 1045733669, + 1076268662, + 1608894437, + 2841246865, + 3747507036, + 3426802952, + 1523200548, + 3748784445, + 796953013, + 1370470539, + 3007103408, + 2385290186, + 2449012079, + 3891828246, + 2489280741, + 141990679, + 126631003, + 1307652857, + 1680208529, + 4200085173, + 1697029761, + 3638779318, + 1513478893, + 1409532089, + 2856634530, + 340029237, + 1729269195, + 1238818, + 3864127404, + 1348589552, + 2394020779, + ]; + + static final String authTokenTwillo = String.fromCharCodes(List.generate( + _envieddataauthTokenTwillo.length, + (int i) => i, + growable: false, + ).map( + (int i) => _envieddataauthTokenTwillo[i] ^ _enviedkeyauthTokenTwillo[i])); + + static const List _enviedkeychatGPTkey = [ + 2416394455, + 4207646224, + 451364318, + 1751148387, + 1793170101, + 1153808688, + 1665181598, + 1363057585, + 1281958942, + 2953267701, + 4291609122, + 391939345, + 1466698506, + 975043567, + 4173943065, + 471680351, + 3246510249, + 581988585, + 1269569301, + 1277693123, + 2160496280, + 3830403710, + 290192447, + 3572517057, + 3104592059, + 2711691034, + 3210420648, + 3898634406, + 1200117556, + 1471855331, + 3358235973, + 1601937940, + 340262766, + 3100764827, + 4067273536, + 220494496, + 1500709417, + 2848265704, + 568523249, + 1188867965, + 3977104338, + 2962910239, + 3670669575, + 3953903669, + 2546517718, + 915920601, + 544906495, + 1612949771, + 2854107484, + 1376715240, + 2583633032, + 1319706655, + 3182599914, + 3320970745, + 410565205, + 3075796443, + 163409080, + 3480793232, + ]; + + static const List _envieddatachatGPTkey = [ + 2416394413, + 4207646327, + 451364339, + 1751148375, + 1793170166, + 1153808642, + 1665181608, + 1363057600, + 1281958954, + 2953267622, + 4291609211, + 391939446, + 1466698568, + 975043492, + 4173943112, + 471680314, + 3246510305, + 581988531, + 1269569361, + 1277693106, + 2160496371, + 3830403625, + 290192464, + 3572517046, + 3104592120, + 2711691043, + 3210420720, + 3898634452, + 1200117580, + 1471855236, + 3358235920, + 1601938001, + 340262664, + 3100764878, + 4067273529, + 220494489, + 1500709475, + 2848265658, + 568523142, + 1188867919, + 3977104288, + 2962910322, + 3670669617, + 3953903716, + 2546517732, + 915920568, + 544906395, + 1612949865, + 2854107503, + 1376715139, + 2583633122, + 1319706728, + 3182599858, + 3320970635, + 410565133, + 3075796407, + 163409146, + 3480793340, + ]; + + static final String chatGPTkey = String.fromCharCodes(List.generate( + _envieddatachatGPTkey.length, + (int i) => i, + growable: false, + ).map((int i) => _envieddatachatGPTkey[i] ^ _enviedkeychatGPTkey[i])); + + static const List _enviedkeytransactionCloude = [ + 104972405, + 1826297693, + 1459287221, + 2154736453, + 80360576, + 2436225760, + 2045457249, + 2827179769, + 3354072433, + 874378647, + 2367037019, + 1780947382, + 483302838, + 3449149135, + 2783798126, + 4044438444, + 3064643569, + 3842384737, + 1383312024, + 831531354, + 1177680776, + 3893212288, + 1801194511, + 381662534, + 942547124, + 2928750028, + 2252940323, + 2187821390, + 3563626471, + 3842762355, + 3673460491, + 3738513897, + 1139544793, + 1090285057, + 667621217, + 1964282435, + 3595612715, + 2022421282, + 540769717, + 964920402, + 231828114, + 3507064611, + 3682138932, + 3821608737, + 4141658340, + 1083072149, + 329704437, + 867123082, + 3726618878, + 3953403850, + 4155108828, + 4203201177, + 802280593, + 868805140, + 873221332, + 3789877016, + 3430503764, + 1597757757, + 3197502627, + 690312420, + 4212028519, + 2494727343, + ]; + + static const List _envieddatatransactionCloude = [ + 104972324, + 1826297653, + 1459287254, + 2154736434, + 80360693, + 2436225673, + 2045457165, + 2827179670, + 3354072348, + 874378726, + 2367036984, + 1780947417, + 483302879, + 3449149101, + 2783798100, + 4044438525, + 3064643495, + 3842384686, + 1383312071, + 831531280, + 1177680838, + 3893212377, + 1801194570, + 381662466, + 942547078, + 2928749972, + 2252940404, + 2187821327, + 3563626453, + 3842762309, + 3673460562, + 3738513841, + 1139544722, + 1090285122, + 667621203, + 1964282391, + 3595612795, + 2022421272, + 540769772, + 964920345, + 231828131, + 3507064679, + 3682138978, + 3821608809, + 4141658322, + 1083072198, + 329704383, + 867123144, + 3726618829, + 3953403899, + 4155108754, + 4203201194, + 802280641, + 868805201, + 873221349, + 3789877069, + 3430503692, + 1597757775, + 3197502715, + 690312328, + 4212028453, + 2494727363, + ]; + + static final String transactionCloude = String.fromCharCodes( + List.generate( + _envieddatatransactionCloude.length, + (int i) => i, + growable: false, + ).map((int i) => + _envieddatatransactionCloude[i] ^ _enviedkeytransactionCloude[i])); + + static const List _enviedkeyvisionApi = [ + 1741302926, + 1369682343, + 821460980, + 1051830513, + 2919862686, + 3438453063, + 2671715371, + 1452398431, + 1336412474, + 3657165648, + 4283685939, + 4029139929, + 3503597038, + 2673397830, + 3390940393, + 569888216, + 3542870280, + 650562825, + 1059491019, + 3166341603, + 1126887244, + 3216717204, + 3884902752, + 2900860871, + 4168811805, + 903186961, + 2848149758, + 379201999, + 122429332, + 2546905713, + 2114317373, + 1283138610, + 1903992201, + 3445320823, + 1813353356, + 2328465643, + 1003900043, + 4243089385, + ]; + + static const List _envieddatavisionApi = [ + 1741302973, + 1369682391, + 821460917, + 1051830461, + 2919862765, + 3438453046, + 2671715448, + 1452398348, + 1336412515, + 3657165572, + 4283685957, + 4029139875, + 3503596958, + 2673397872, + 3390940368, + 569888137, + 3542870333, + 650562895, + 1059490950, + 3166341546, + 1126887211, + 3216717302, + 3884902682, + 2900860845, + 4168811866, + 903186983, + 2848149668, + 379202046, + 122429422, + 2546905626, + 2114317385, + 1283138680, + 1903992273, + 3445320709, + 1813353428, + 2328465543, + 1003900105, + 4243089285, + ]; + + static final String visionApi = String.fromCharCodes(List.generate( + _envieddatavisionApi.length, + (int i) => i, + growable: false, + ).map((int i) => _envieddatavisionApi[i] ^ _enviedkeyvisionApi[i])); + + static const List _enviedkeysecretKey = [ + 1141020931, + 4267025674, + 4080510329, + 4150193399, + 2735093354, + 2621290546, + 121037130, + 3182499520, + 818851975, + 469936007, + 2115327889, + 3058940838, + 2303856919, + 1837160568, + 1754593014, + 1445378773, + 575790508, + 3840279630, + 2104659296, + 1290599553, + 2587385639, + 1800703398, + 1562167481, + 3438116986, + 803603244, + 2406819927, + 469443319, + 3817514513, + 1375887914, + 122246261, + 3179534519, + 2446521295, + 138681580, + 2494762507, + 1345361567, + 1858074002, + 4258654412, + 3010221531, + 1796789789, + 3675966273, + 542493077, + 4165940924, + 1020673035, + 2189687906, + 2929998292, + 2012995766, + 1802789896, + 2691195296, + 1937468946, + 2305103148, + 933237897, + 1882678240, + 3929609532, + 4291342037, + 1577648787, + 2526825721, + 587279634, + 2799956502, + 307942410, + 952671055, + 1624133810, + 325853708, + 320167898, + 875912567, + 2524487693, + 2707590551, + 1551395039, + 2926330290, + 3743988078, + 1078384430, + 2355316195, + 954674149, + 2049893036, + 784714057, + 1784490847, + 715470827, + 3346326563, + 3402263239, + 1022904766, + 1889951930, + 1058766175, + 2213488602, + 2834727563, + 4186039233, + 3668805305, + 439543737, + 2834247050, + 794214482, + 3844351555, + 102255751, + 1241146538, + 3233700865, + 236138198, + 846644522, + 113955816, + 2251084795, + 1813250914, + 1159343978, + 2321032496, + 1280320472, + 334502594, + 1333082781, + 1326844431, + 3182190462, + 2200524624, + 136656519, + 1602398972, + 137148346, + 3001505398, + 4130939216, + 408751774, + 485906922, + 3052774372, + 3189555175, + ]; + + static const List _envieddatasecretKey = [ + 1141021049, + 4267025773, + 4080510246, + 4150193285, + 2735093253, + 2621290562, + 121037088, + 3182499487, + 818852018, + 469936048, + 2115327960, + 3058940879, + 2303856993, + 1837160526, + 1754592902, + 1445378712, + 575790570, + 3840279565, + 2104659234, + 1290599623, + 2587385686, + 1800703381, + 1562167546, + 3438116936, + 803603266, + 2406819937, + 469443262, + 3817514569, + 1375887942, + 122246168, + 3179534557, + 2446521270, + 138681479, + 2494762619, + 1345361639, + 1858074070, + 4258654369, + 3010221452, + 1796789796, + 3675966322, + 542493126, + 4165940971, + 1020673080, + 2189687828, + 2929998242, + 2012995822, + 1802789984, + 2691195286, + 1937468970, + 2305103225, + 933237960, + 1882678233, + 3929609576, + 4291342048, + 1577648853, + 2526825654, + 587279680, + 2799956546, + 307942493, + 952671016, + 1624133861, + 325853823, + 320167822, + 875912516, + 2524487738, + 2707590596, + 1551394987, + 2926330361, + 3743987997, + 1078384481, + 2355316147, + 954674049, + 2049893083, + 784713997, + 1784490811, + 715470744, + 3346326618, + 3402263295, + 1022904783, + 1889951976, + 1058766182, + 2213488553, + 2834727673, + 4186039180, + 3668805356, + 439543765, + 2834247167, + 794214451, + 3844351531, + 102255860, + 1241146521, + 3233700975, + 236138118, + 846644578, + 113955742, + 2251084700, + 1813250848, + 1159343883, + 2321032451, + 1280320491, + 334502582, + 1333082842, + 1326844516, + 3182190407, + 2200524640, + 136656625, + 1602398890, + 137148303, + 3001505326, + 4130939170, + 408751814, + 485906822, + 3052774310, + 3189555083, + ]; + + static final String secretKey = String.fromCharCodes(List.generate( + _envieddatasecretKey.length, + (int i) => i, + growable: false, + ).map((int i) => _envieddatasecretKey[i] ^ _enviedkeysecretKey[i])); + + static const List _enviedkeystripePublishableKe = [ + 522377571, + 3586475766, + 214647848, + 4260387696, + 1480565215, + 2034798845, + 3257184644, + 3677546420, + 1222361711, + 3931206542, + 2888965958, + 1081912544, + 3645972815, + 721896297, + 517171822, + 3263412450, + 2131739306, + 3542146847, + 2804799966, + 3529817658, + 802955369, + 1028389670, + 3709968761, + 4230601249, + 4025978127, + 3183765040, + 514239170, + 405727722, + 3537447942, + 1645564231, + 3236193640, + 3270009752, + 154344868, + 3845029725, + 283645841, + 932692489, + 3188766486, + 3474565049, + 1091482645, + 2874146240, + 4211666752, + 3661032656, + 3351107700, + 2531946592, + 441843426, + 1606292894, + 2153941705, + 2779307135, + 3881234199, + 2120857597, + 3955270584, + 6976714, + 4264745703, + 1018483930, + 410676241, + 2125059658, + 2654578488, + 562805931, + 671686985, + 1216456480, + 1262913864, + 3691394124, + 2029626739, + 4290790191, + 238782982, + 2037510266, + 2605350452, + 981979835, + 1117897157, + 3261423589, + 1199292718, + 2418840055, + 741648520, + 822117799, + 1576123977, + 1042959218, + 4072937953, + 2081781771, + 1278205876, + 1112230724, + 3897639333, + 2042168521, + 2334228216, + 2373653516, + 907006966, + 2953570838, + 620578486, + 2760867898, + 2368016403, + 1290159490, + 2377847843, + 3526243939, + 941606553, + 857858869, + 150291495, + 1892368746, + 3071409859, + 2807649317, + 4178467864, + 87102769, + 218118127, + 1055792551, + 3893635599, + 3984574453, + 1918429883, + 4235079178, + 3529433099, + 1551586769, + 617287190, + 2073851490, + 1271399111, + 3390936087, + 3064868668, + 4007077552, + ]; + + static const List _envieddatastripePublishableKe = [ + 522377493, + 3586475665, + 214647927, + 4260387584, + 1480565165, + 2034798738, + 3257184756, + 3677546462, + 1222361648, + 3931206587, + 2888966001, + 1081912489, + 3645972774, + 721896223, + 517171800, + 3263412399, + 2131739372, + 3542146908, + 2804799900, + 3529817724, + 802955288, + 1028389653, + 3709968698, + 4230601235, + 4025978209, + 3183764998, + 514239145, + 405727652, + 3537448012, + 1645564201, + 3236193586, + 3270009818, + 154344925, + 3845029643, + 283645863, + 932692583, + 3188766563, + 3474565117, + 1091482721, + 2874146200, + 4211666725, + 3661032681, + 3351107645, + 2531946506, + 441843367, + 1606292942, + 2153941638, + 2779307033, + 3881234303, + 2120857488, + 3955270600, + 6976654, + 4264745619, + 1018483853, + 410676348, + 2125059646, + 2654578443, + 562805990, + 671686917, + 1216456562, + 1262913912, + 3691394091, + 2029626658, + 4290790239, + 238783087, + 2037510194, + 2605350487, + 981979882, + 1117897128, + 3261423524, + 1199292776, + 2418839994, + 741648605, + 822117879, + 1576123963, + 1042959144, + 4072937858, + 2081781816, + 1278205925, + 1112230701, + 3897639398, + 2042168461, + 2334228114, + 2373653620, + 907006900, + 2953570892, + 620578554, + 2760867928, + 2368016491, + 1290159558, + 2377847904, + 3526243920, + 941606652, + 857858899, + 150291551, + 1892368701, + 3071409851, + 2807649375, + 4178467883, + 87102722, + 218118029, + 1055792624, + 3893635655, + 3984574404, + 1918429921, + 4235079277, + 3529433209, + 1551586722, + 617287246, + 2073851408, + 1271399071, + 3390936187, + 3064868734, + 4007077596, + ]; + + static final String stripePublishableKe = String.fromCharCodes( + List.generate( + _envieddatastripePublishableKe.length, + (int i) => i, + growable: false, + ).map((int i) => + _envieddatastripePublishableKe[i] ^ + _enviedkeystripePublishableKe[i])); + + static const List _enviedkeychatGPTkeySefer = [ + 1673037440, + 642286416, + 2427723078, + 3856283685, + 2702558462, + 502698028, + 1308925645, + 4110519217, + 3244900706, + 2526327817, + 283947026, + 3300100433, + 1758744413, + 2854457770, + 754498718, + 552551968, + 481456051, + 3218700995, + 363897818, + 2947237190, + 4160485056, + 973151098, + 538045910, + 4126691572, + 3949366719, + 494437859, + 2036503363, + 56930903, + 568830745, + 2742792501, + 3747688967, + 1567979890, + 979570915, + 1923807635, + 3148734659, + 2410692055, + 1467190165, + 811065295, + 2917860115, + 1829084393, + 3189430638, + 1005026264, + 3246668815, + 3949808453, + 3275202526, + 40927270, + 1497443558, + 219654500, + 3286262768, + 916873968, + 1670811374, + 1969758230, + 4039895843, + 695594440, + 3378046203, + 2176346704, + 3370161244, + 1176674416, + ]; + + static const List _envieddatachatGPTkeySefer = [ + 1673037562, + 642286391, + 2427723115, + 3856283756, + 2702558359, + 502698110, + 1308925694, + 4110519256, + 3244900694, + 2526327910, + 283947133, + 3300100395, + 1758744380, + 2854457753, + 754498759, + 552552022, + 481456091, + 3218700981, + 363897784, + 2947237247, + 4160485042, + 973151008, + 538045885, + 4126691525, + 3949366780, + 494437850, + 2036503323, + 56930853, + 568830817, + 2742792530, + 3747689042, + 1567979831, + 979570899, + 1923807743, + 3148734715, + 2410692029, + 1467190215, + 811065245, + 2917860169, + 1829084315, + 3189430566, + 1005026226, + 3246668860, + 3949808404, + 3275202491, + 40927251, + 1497443511, + 219654460, + 3286262688, + 916873884, + 1670811295, + 1969758272, + 4039895931, + 695594426, + 3378046115, + 2176346684, + 3370161182, + 1176674332, + ]; + + static final String chatGPTkeySefer = String.fromCharCodes(List.generate( + _envieddatachatGPTkeySefer.length, + (int i) => i, + growable: false, + ).map( + (int i) => _envieddatachatGPTkeySefer[i] ^ _enviedkeychatGPTkeySefer[i])); + + static const List _enviedkeyllamaKey = [ + 898801240, + 1504971304, + 610599258, + 2685877070, + 569772106, + 2952551564, + 3117708714, + 4211132927, + 1702829972, + 361376821, + 3759592579, + 1690946678, + 1363142521, + 3431691375, + 1568330165, + 3132934019, + 1334146219, + 358541338, + 593388605, + 1990403983, + 836379608, + 3489346571, + 4062565303, + 1781349802, + 1054736653, + 2598203681, + 4236200078, + 328616861, + 584809377, + 2904549267, + 2991757229, + 4020896402, + 1893858047, + 1889385501, + 3267548944, + 3275262527, + 1432773723, + 427983410, + 2889261127, + 2357975630, + 2333967494, + 2755113043, + 1874941660, + 2360831478, + 1300763119, + 740900016, + 1817081921, + 782408964, + 2234157668, + 2502899996, + 1122124057, + 427939706, + 1332936578, + 3962578740, + 59229511, + 3604410282, + 374662991, + 2656400333, + 1985948246, + 1723477683, + 2184340097, + 1319273115, + 3315200900, + 4082407531, + 3108743191, + 3973337447, + 243945687, + 3363660577, + 79788779, + 1309680040, + 906862493, + 1098147194, + 1449760267, + 1383842600, + ]; + + static const List _envieddatallamaKey = [ + 898801162, + 1504971386, + 610599287, + 2685877003, + 569772095, + 2952551669, + 3117708741, + 4211132857, + 1702830032, + 361376864, + 3759592693, + 1690946576, + 1363142443, + 3431691307, + 1568330231, + 3132934124, + 1334146241, + 358541358, + 593388555, + 1990404073, + 836379522, + 3489346624, + 4062565366, + 1781349854, + 1054736710, + 2598203755, + 4236200125, + 328616939, + 584809422, + 2904549342, + 2991757205, + 4020896479, + 1893857931, + 1889385514, + 3267548966, + 3275262471, + 1432773688, + 427983458, + 2889261090, + 2357975556, + 2333967568, + 2755113060, + 1874941595, + 2360831416, + 1300763019, + 740900081, + 1817081898, + 782409044, + 2234157616, + 2502900055, + 1122124157, + 427939619, + 1332936634, + 3962578811, + 59229475, + 3604410311, + 374663030, + 2656400291, + 1985948258, + 1723477716, + 2184340198, + 1319273180, + 3315201013, + 4082407458, + 3108743202, + 3973337376, + 243945646, + 3363660622, + 79788723, + 1309680090, + 906862533, + 1098147094, + 1449760329, + 1383842628, + ]; + + static final String llamaKey = String.fromCharCodes(List.generate( + _envieddatallamaKey.length, + (int i) => i, + growable: false, + ).map((int i) => _envieddatallamaKey[i] ^ _enviedkeyllamaKey[i])); + + static const List _enviedkeyserverPHP = [ + 3552866576, + 1948327802, + 2362351083, + 1132280431, + 3753638473, + 129185768, + 38878039, + 2730132585, + 1804405100, + 2496428701, + 2051529503, + 1388322984, + 4175334444, + 236796867, + 3879314462, + 4130446670, + 95378704, + 2626854749, + 2001334618, + 1281924634, + 3447214519, + 634079959, + 1772647823, + 669227767, + 1674444698, + 2806616347, + 843221614, + 886872287, + ]; + + static const List _envieddataserverPHP = [ + 3552866680, + 1948327694, + 2362351007, + 1132280351, + 3753638458, + 129185746, + 38878072, + 2730132550, + 1804405005, + 2496428781, + 2051529590, + 1388322950, + 4175334495, + 236796838, + 3879314552, + 4130446635, + 95378786, + 2626854771, + 2001334582, + 1281924723, + 3447214529, + 634079922, + 1772647840, + 669227652, + 1674444799, + 2806616445, + 843221515, + 886872237, + ]; + + static final String serverPHP = String.fromCharCodes(List.generate( + _envieddataserverPHP.length, + (int i) => i, + growable: false, + ).map((int i) => _envieddataserverPHP[i] ^ _enviedkeyserverPHP[i])); + + static const List _enviedkeyanthropicAIkeySeferNewHamzaayedpython = + [ + 4138568753, + 222084930, + 567957075, + 589023236, + 95163113, + 761369467, + 678556238, + 1202699717, + 3717339232, + 3361164613, + 1896144313, + 1028007045, + 2411990607, + 1334711864, + 1425832291, + 2517678508, + 3641615793, + 2388652099, + 4290027393, + 2642334611, + 2583306837, + 42432584, + 2352267362, + 2812350954, + 2797239379, + 2609875446, + 1510186127, + 4075115807, + 2646998902, + 2838108061, + 1144829029, + 374342323, + 352155376, + 4009357707, + 3177994588, + 4009547332, + 3123641111, + 3663726467, + 2548371067, + 1956922996, + 1893294624, + 841908501, + 3137173052, + 3905908512, + 1468327344, + 3096855172, + 1624381312, + 572547505, + 670778059, + 450113829, + 3296719559, + 3122037990, + 2792033885, + 1022814607, + 2489616942, + 2555344792, + 347833474, + 1992636689, + 2426895563, + 2835726782, + 2005021329, + 57031653, + 1895090121, + 2902144801, + 539560416, + 991919183, + 3172763420, + 639548619, + 1776418438, + 3026481680, + 1895252839, + 3348676884, + 2970079910, + 1655982482, + 3129301750, + 2793274198, + 1485417788, + 1744731121, + 302824470, + 2448927063, + 939465247, + 1400548521, + 3510373693, + 2235290475, + 277137710, + 3362743317, + 4255812862, + 3835529905, + 3488252448, + 3468169540, + 3291376858, + 1383773310, + 1629107816, + 3701672366, + 1773431453, + 3939482430, + 105727499, + 837695090, + 1040742880, + 3327679371, + 2161721125, + 1451148207, + 3741799188, + 4086124554, + 727701698, + 12846766, + 2383484351, + 3944409888, + 4062632309, + 2517050448, + 1435265117, + 2384327573, + 1596179024, + 1733116819, + ]; + + static const List _envieddataanthropicAIkeySeferNewHamzaayedpython = + [ + 4138568779, + 222084901, + 567957118, + 589023349, + 95163019, + 761369368, + 678556259, + 1202699700, + 3717339158, + 3361164586, + 1896144266, + 1028007100, + 2411990626, + 1334711886, + 1425832224, + 2517678574, + 3641615772, + 2388652052, + 4290027503, + 2642334697, + 2583306768, + 42432575, + 2352267300, + 2812350884, + 2797239314, + 2609875332, + 1510186176, + 4075115823, + 2646998831, + 2838108145, + 1144828977, + 374342354, + 352155264, + 4009357821, + 3177994554, + 4009547308, + 3123641187, + 3663726574, + 2548370972, + 1956922881, + 1893294699, + 841908546, + 3137173071, + 3905908600, + 1468327418, + 3096855255, + 1624381387, + 572547520, + 670778028, + 450113914, + 3296719497, + 3122037948, + 2792033806, + 1022814693, + 2489616998, + 2555344858, + 347833563, + 1992636743, + 2426895507, + 2835726835, + 2005021387, + 57031598, + 1895090168, + 2902144856, + 539560373, + 991919108, + 3172763428, + 639548659, + 1776418517, + 3026481791, + 1895252741, + 3348676976, + 2970079941, + 1655982585, + 3129301664, + 2793274214, + 1485417847, + 1744731012, + 302824518, + 2448927030, + 939465309, + 1400548545, + 3510373645, + 2235290376, + 277137777, + 3362743362, + 4255812790, + 3835529925, + 3488252519, + 3468169527, + 3291376776, + 1383773233, + 1629107767, + 3701672346, + 1773431470, + 3939482375, + 105727579, + 837695024, + 1040742795, + 3327679398, + 2161721152, + 1451148189, + 3741799237, + 4086124667, + 727701669, + 12846789, + 2383484398, + 3944409969, + 4062632237, + 2517050402, + 1435265029, + 2384327673, + 1596178962, + 1733116927, + ]; + + static final String anthropicAIkeySeferNewHamzaayedpython = + String.fromCharCodes(List.generate( + _envieddataanthropicAIkeySeferNewHamzaayedpython.length, + (int i) => i, + growable: false, + ).map((int i) => + _envieddataanthropicAIkeySeferNewHamzaayedpython[i] ^ + _enviedkeyanthropicAIkeySeferNewHamzaayedpython[i])); + + static const List _enviedkeyprivateKeyFCM = [ + 589510970, + 1323998495, + 176851027, + 1551255100, + 397738850, + 911500238, + 2737091527, + 708980051, + 3994760831, + 3303700682, + 888569156, + 289778144, + 1768937714, + 1996145717, + 3840916818, + 1501832691, + 1936487990, + 2944326300, + 3871460848, + 2746191075, + 2366037753, + 3260886753, + 3296565666, + 349591973, + 1396175032, + 3080033954, + 2398883030, + 3949466403, + 3378685587, + 3195545710, + 365676136, + 197147035, + 2389375401, + 4146490038, + 1979426616, + 1476646428, + 3924163679, + 1238855916, + 1880485209, + 1818526322, + 3438894061, + 1419717566, + 3337932728, + 488209636, + 2538814721, + 1376649369, + 2966036193, + 2636818228, + 2473945819, + 1243743887, + 1333722351, + 1378848062, + 3401063698, + 1934211731, + 3201016272, + 1126062460, + 3227145040, + 2683131481, + 2661254493, + 2911453530, + 3789526810, + 2043164387, + 796844649, + 2093739388, + 3983503398, + 2906976258, + 322110376, + 1954595057, + 1011026963, + 2977775757, + 315889052, + 3101075752, + 3280515219, + 1720531759, + 2451434871, + 128374508, + 3550487656, + 3565976498, + 1210376341, + 57874744, + 3277710806, + 1234230096, + 3673887664, + 1284609895, + 1382134614, + 546595283, + 1333446522, + 1200201824, + 405234331, + 2873729750, + 4196873241, + 2469332652, + 31268733, + 2000566797, + 2863079457, + 1916394369, + 4061015711, + 1801731, + 1602869332, + 3872221784, + 2229661926, + 476638170, + 2885047515, + 3904841022, + 2398848448, + 3362927814, + 900826188, + 583893152, + 809803309, + 783205366, + 1232027011, + 642619883, + 291325610, + 2394595726, + 2083935013, + 441843663, + 3794227412, + 1202087031, + 1608534267, + 3007131968, + 338805673, + 1037358800, + 840481771, + 1477436877, + 3935784839, + 4034282256, + 1683212189, + 1082988566, + 863916003, + 402521186, + 2585215224, + 1184986766, + 2339888681, + 3248831789, + 1327189732, + 1824861994, + 2781708213, + 2514970651, + 744659000, + 1609630070, + 124253669, + 1802674847, + 836390102, + 817098875, + 525539629, + 2493519145, + 579659934, + 257006946, + 3821235469, + 3544658163, + 3349581169, + 1140776216, + 1732186404, + 2653732246, + 2511018359, + 772717925, + 3203167836, + 1918239877, + 2377626998, + 1895572715, + 2337741007, + 3165625027, + 3165169364, + 3916395290, + 1579432721, + 3273935601, + 831366274, + 1544919879, + 1357891583, + 2528107809, + 3984972543, + 1837805628, + 2655614052, + 278077258, + 3125585591, + 4242824029, + 2137097702, + 1362770141, + 3090519589, + 3542246396, + 2267914376, + 832654081, + 152735734, + 3007818970, + 1425167007, + 3714717860, + 1051882702, + 535736694, + 1094103322, + 3490517343, + 1957250784, + 4253454013, + 2178064991, + 1347056279, + 1325621645, + 3261978310, + 2296494821, + 1270875229, + 3085006795, + 2916172684, + 3332466953, + 3886507540, + 2154714022, + 2875062767, + 3077420176, + 3718741151, + 4069134400, + 2080712677, + 533646373, + 1494115259, + 2364174129, + 2727978903, + 3062137147, + 3726496668, + 3615246455, + 3086334563, + 2635806566, + 4070476148, + 4217497383, + 2785524604, + 1454301713, + 2242779066, + 839119679, + 1643111753, + 3384973756, + 1163654251, + 3118297991, + 543844477, + 4232234231, + 674505456, + 3698352894, + 2216806375, + 2486477552, + 3555566336, + 2011337427, + 1346436797, + 2947356558, + 3181592718, + 3965165134, + 1335350205, + 988042470, + 2124837620, + 1295962701, + 1522323110, + 1637981374, + 2686006701, + 713136333, + 3260483901, + 989480593, + 321644116, + 267440611, + 2369524101, + 2139322365, + 2935019289, + 486650023, + 231245891, + 2714228994, + 67591365, + 2380817258, + 2081839381, + 2313368627, + 1485151563, + 653563050, + 1082971612, + 2267410275, + 651519860, + 454536328, + 2315934750, + 2420623973, + 375642378, + 2182955550, + 296208613, + 564661310, + 3961785461, + 3678215070, + 3153379541, + 1971824091, + 1536441524, + 3573140313, + 3000952863, + 1455167830, + 3309756666, + 1001326205, + 4016740122, + 2189037247, + 467730712, + 1536025956, + 1186723233, + 4262779360, + 113642116, + 912800923, + 2242370329, + 4100901358, + 225415208, + 1907470664, + 2691952618, + 4097915267, + 4106718559, + 1248713041, + 2570330622, + 2861469798, + 681401008, + 631603154, + 1643272433, + 2126934219, + 1391106058, + 1235457205, + 3714312277, + 859041825, + 3523755095, + 2066936876, + 3916072659, + 3758707634, + 3263960239, + 2041189508, + 3159326937, + 983812181, + 2269627422, + 1436127295, + 4235963961, + 3039314641, + 3751559205, + 3727491912, + 225434986, + 380882532, + 685233271, + 12498412, + 3611229940, + 4171128498, + 336638792, + 1272706849, + 3677602200, + 1945754310, + 1219264669, + 1481610115, + 2894749578, + 198454895, + 3770857707, + 1422302045, + 2981610148, + 3113375368, + 401958252, + 3332112199, + 2276137948, + 3289232016, + 3012553435, + 1432418544, + 664621975, + 3560437657, + 819110772, + 3028090815, + 2770831094, + 2533511998, + 2421331763, + 1334424157, + 1823651182, + 1934026927, + 2730732499, + 102398509, + 2458389504, + 4229009847, + 3763461737, + 2432594508, + 2742929659, + 2051723239, + 1577603395, + 1700089495, + 1122718116, + 3670881871, + 1248983772, + 175063174, + 472181504, + 2768438094, + 3091408454, + 4165497612, + 3255851976, + 3174319069, + 2654976129, + 4018660933, + 3310175755, + 543450947, + 61658, + 257876038, + 64319925, + 656565863, + 1323114467, + 3120030596, + 904098398, + 243360434, + 471841393, + 2070742657, + 2189327930, + 1310594552, + 1338071644, + 589521062, + 1363383040, + 2498152117, + 2681609306, + 3085567299, + 4067132292, + 3152526482, + 3888080003, + 4074826103, + 3516587102, + 1761961541, + 1922096694, + 4128048823, + 1635191948, + 2808163681, + 3059860611, + 3441731112, + 2780145560, + 3724070767, + 239301579, + 1656331963, + 3787767878, + 3091037105, + 2939423301, + 4188959498, + 3076095599, + 2776994927, + 3808274241, + 4271663968, + 2228685435, + 3023382778, + 87128799, + 3971101087, + 2951388021, + 815524302, + 1112949658, + 3425555644, + 1772873279, + 267122059, + 3502384508, + 2295263421, + 472908799, + 2632354599, + 2019041056, + 527372116, + 798709789, + 4013916333, + 3759694763, + 1440103747, + 51657606, + 2987526294, + 840305279, + 3043172441, + 1687940543, + 3643447917, + 2973901651, + 2191179658, + 2260332401, + 491961335, + 3634008968, + 31113624, + 834679593, + 1301301142, + 3274761738, + 3751016419, + 3214831350, + 3082788741, + 362247, + 529352187, + 3492444042, + 1280565967, + 2242683529, + 2888564444, + 1803244130, + 3435927067, + 1640753159, + 1898537179, + 3228053778, + 1954206094, + 1540456850, + 248273364, + 1325644712, + 695538645, + 4090026346, + 2274294298, + 2768151390, + 3042025492, + 4269179133, + 3806211342, + 889507951, + 3370546678, + 4096188940, + 2354537213, + 3441793124, + 3203113969, + 3457565506, + 1002278869, + 4152750914, + 3294354108, + 1041991379, + 94798856, + 25722796, + 1546525275, + 2686561750, + 2192563862, + 2621775579, + 2373996418, + 1905310029, + 2214703899, + 2399149371, + 1342545748, + 1185127375, + 288977926, + 1832198850, + 2281434444, + 2737976911, + 614579492, + 3174170846, + 2662962575, + 4163972510, + 3612044273, + 922880552, + 450642186, + 2423406687, + 4156757832, + 2294690409, + 1036538798, + 2666284105, + 240963217, + 606309049, + 683429236, + 1508006389, + 3660632001, + 200640335, + 1582774774, + 1816197300, + 1418551367, + 3544638987, + 387253329, + 2296414452, + 3164444484, + 3335301295, + 1347845828, + 103975637, + 353339457, + 2139146923, + 1254057413, + 540580904, + 221842680, + 1699742840, + 3085492530, + 3117593370, + 3076459163, + 66368280, + 1667989919, + 3042891198, + 3374433660, + 1577596031, + 1518774674, + 3758243720, + 2716119961, + 1471476853, + 2784493744, + 3719462950, + 4237860873, + 243005393, + 803541407, + 1622842474, + 4017105065, + 3282758351, + 2180699529, + 2447225540, + 1628975792, + 3236748355, + 2439493243, + 961318765, + 953497865, + 906897835, + 355062543, + 2843738183, + 4180013865, + 3007690697, + 3038340004, + 2033038495, + 1354994783, + 2425515978, + 736106281, + 3089270884, + 3528514645, + 2663787017, + 1419187996, + 1691117049, + 138082149, + 3459389521, + 2444776422, + 4187210569, + 3615446272, + 2843925404, + 3424484357, + 655655903, + 594221174, + 3515424309, + 3758056376, + 3281136547, + 3930205849, + 4187796479, + 3295721849, + 2206646923, + 104100519, + 652243666, + 3134733359, + 4076881858, + 2771590126, + 3162413833, + 176138717, + 3281037276, + 2300762471, + 1095451758, + 3748256302, + 1541232535, + 1383396764, + 1647384261, + 1602072092, + 77393336, + 2691558206, + 2027445565, + 4104901400, + 1864704831, + 1325350314, + 520716916, + 144290568, + 1087055137, + 666343885, + 494251288, + 2801070214, + 1956499095, + 3474664631, + 3738017554, + 537394183, + 708484713, + 2621188479, + 2437414965, + 2749040283, + 3705659611, + 1564587596, + 2544884860, + 2361479956, + 2642898469, + 4006956758, + 903272237, + 3181366950, + 2268617563, + 3037337570, + 3122746964, + 266276960, + 834872189, + 1653746464, + 3048207564, + 3102639512, + 2110664933, + 557715469, + 2562643412, + 3469866698, + 671343823, + 624738744, + 892301721, + 246335086, + 1480140873, + 31509591, + 3816545199, + 1013980440, + 4007882745, + 822580588, + 2981532131, + 2079641032, + 2375536301, + 2817643035, + 1415256342, + 3287243858, + 504639792, + 2206656785, + 1937728499, + 3918637504, + 3680796966, + 533621359, + 2974466934, + 255732426, + 2156060489, + 3593850426, + 1454027038, + 3427804141, + 2557443399, + 165245859, + 2154672178, + 2211909619, + 3703679581, + 1308185239, + 54229574, + 2229468484, + 2652730651, + 3367287439, + 1928368813, + 1238395033, + 2584334940, + 618288719, + 636082697, + 2419544642, + 2366144864, + 782231482, + 3247134076, + 2247378249, + 3189371452, + 752767218, + 332518050, + 2943208049, + 4047399113, + 270684759, + 4202557980, + 2956905827, + 2093921180, + 2722155275, + 1537413814, + 3696294407, + 3907259105, + 394476825, + 873554126, + 85687257, + 1054481830, + 3952738938, + 2454856867, + 1006918767, + 87263547, + 2523338480, + 787794445, + 1702085248, + 568556439, + 3301349335, + 928651693, + 606880747, + 4021341356, + 1143778765, + 1320053458, + 4199542896, + 3545237112, + 2431061362, + 3425269671, + 2107121171, + 480279154, + 1816750096, + 3608397375, + 3151874520, + 500471867, + 1080424602, + 1520818827, + 1520313229, + 3384770685, + 3387423047, + 3145859196, + 1830541705, + 591143027, + 3733972608, + 3475112804, + 1878822399, + 1272266848, + 2083179099, + 1638395054, + 2268927473, + 3240721436, + 1632193649, + 2128929310, + 308186170, + 4128090400, + 3003138378, + 990485205, + 1717726089, + 2797816427, + 2736389106, + 1252272158, + 3344205688, + 1622328346, + 3345479671, + 1626316771, + 726543281, + 2358436728, + 1216513429, + 430748569, + 2798104788, + 1061340371, + 3348277491, + 797978369, + 4082635324, + 2990078555, + 3780148244, + 3553076202, + 414250002, + 910908825, + 1635019161, + 3696436634, + 3072215420, + 3788207623, + 34479397, + 2565147863, + 2915857185, + 446470200, + 2353291714, + 1813137688, + 1595111072, + 4000215490, + 1134859855, + 1683803030, + 4110852416, + 271242921, + 909618672, + 2933619925, + 3692509540, + 2320463352, + 2710465770, + 2550792716, + 2137955528, + 3701881172, + 1236155071, + 3348182160, + 2152631747, + 3614017399, + 2617865623, + 4198234193, + 1915006184, + 766360082, + 1058299274, + 2570978308, + 1891758034, + 883393814, + 82620053, + 2426741774, + 555375671, + 3985272035, + 476520061, + 303632627, + 3009747578, + 2335133660, + 2327712194, + 1211089530, + 2727413731, + 2184930112, + 3930414404, + 1782868053, + 3914815245, + 2284867307, + 1384188701, + 3515331360, + 2027404046, + 1812693419, + 1223274016, + 2327946298, + 770080175, + 1906775469, + 1537275902, + 647704019, + 458542807, + 1028382745, + 3202191757, + 2823123896, + 1556402350, + 195014673, + 1042565041, + 404659264, + 1468535239, + 1108977985, + 1552975811, + 2113646714, + 2648601023, + 488251269, + 3743207852, + 1957437707, + 1395522122, + 27668661, + 3543192519, + 63006340, + 905449237, + 2606519481, + 164744904, + 816313033, + 3152211986, + 3483956690, + 1822833380, + 754633704, + 4049306471, + 3202904042, + 2540150351, + 3992710468, + 2638528499, + 975313461, + 16947542, + 1268649637, + 1055173328, + 3602481952, + 4287981630, + 4118198795, + 3554520624, + 935392343, + 2875878257, + 657692454, + 2903299143, + 1817422354, + 3369070528, + 1396415157, + 731757887, + 54412594, + 3375043157, + 1849341748, + 2561328806, + 348804904, + 2103970870, + 1745474738, + 1906712304, + 2991800163, + 837022395, + 1865515632, + 1168787834, + 408360190, + 226761880, + 2161703382, + 1061326994, + 2096860120, + 3495365614, + 212250484, + 2663090157, + 3937837638, + 2896517086, + 1690045585, + 3425004690, + 2761272707, + 2057762513, + 618728094, + 3273145735, + 3273491204, + 1798433538, + 2028323939, + 2271624530, + 3626585524, + 3762225654, + 432567336, + 4182989347, + 826508489, + 729003260, + 2292930960, + 1849067238, + 3201521677, + 2354543027, + 1903699277, + 458172854, + 3099872919, + 2973215737, + 2627299613, + 392481595, + 1876678635, + 2415089221, + 2589311882, + 734369483, + 1380882068, + 3035902754, + 4193755808, + 992025040, + 3704321355, + 1224456633, + 440068848, + 257894027, + 22312974, + 3736996118, + 546298605, + 2360876678, + 172411743, + 1786101239, + 2989603836, + 3740056098, + 89059043, + 505890352, + 2924254231, + 1826934042, + 915435888, + 641497285, + 1265259756, + 393231937, + 2783756019, + 2237689340, + 2001000164, + 3213769036, + 2894008859, + 2260329271, + 3719902194, + 2831693006, + 2980887753, + 1782904378, + 4145331936, + 3089843590, + 1225841589, + 4227074578, + 378492114, + 476482482, + 879016078, + 2497518568, + 6404446, + 1019570624, + 1190642495, + 358782591, + 618068251, + 1566307584, + 1538176946, + 2178025680, + 637989982, + 2667374346, + 1700155510, + 808834983, + 1056226592, + 3875640206, + 873207955, + 2280700229, + 3076687793, + 3400679489, + 4109796290, + 1545115161, + 2307281421, + 988798317, + 2750892600, + 1917884513, + 1805578263, + 544845895, + 2944863189, + 3380787724, + 1308614343, + 1701183596, + 382967395, + 1140220654, + 1261313743, + 393032983, + 769916906, + 2465240484, + 3118952054, + 2205202321, + 1626534383, + 2806956938, + 3393689901, + 2749513595, + 2002676905, + 658316870, + 596096108, + 1771370042, + 1420644807, + 4225507947, + 661016470, + 1198045612, + 3217781763, + 1590172215, + 885844536, + 1072021849, + 2518039828, + 1198076989, + 4194650867, + 3310277379, + 3574098973, + 147391920, + 2820364908, + 3495521345, + 1622035479, + 401037328, + 4144282538, + 685867171, + 147788364, + 2734293548, + 850588461, + 4005210370, + 304766089, + 3686918132, + 4082689386, + 747073320, + 1953493766, + 1713032604, + 468891222, + 1663992916, + 887527089, + 3349320927, + 2342884189, + 1587950919, + 3614373107, + 84091027, + 784322011, + 2594506097, + 3182543106, + 3421310027, + 2738756516, + 1447031096, + 3536363764, + 3174094538, + 1714453504, + 1912525575, + 3019905635, + 2355159462, + 3659541285, + 3315775291, + 3069239086, + 563546323, + 2715278569, + 3329837262, + 2774232075, + 581296210, + 3169247540, + 3875748499, + 2574388346, + 942422940, + 2538027490, + 1800723232, + 2866248292, + 683679656, + 2763073671, + 1103680768, + 3299181665, + 31894348, + 87525858, + 2458599358, + 930491955, + 736917124, + 3857363220, + 1152962568, + 617771179, + 1941492647, + 609395826, + 2856461184, + 3521812990, + 2773618216, + 3152889991, + 1351714131, + 149245989, + 181523718, + 715600516, + 3538019092, + 2897169430, + 1509154388, + 1162829827, + 1837399271, + 351742923, + 2845669304, + 2233785130, + 4130375921, + 4233378438, + 3430129029, + 3970192690, + 2910176062, + 1313300756, + 1493454997, + 3604393381, + 3664326473, + 3579537629, + 3019714258, + 1313832623, + 3462380280, + 1570783172, + 3052532963, + 500712340, + 551674744, + 1691198797, + 1007646139, + 2061855958, + 3918896846, + 2349532217, + 2704669643, + 2462700200, + 1463755187, + 2644951031, + 1049047384, + 1362356795, + 2334718026, + 3419349434, + 2966090842, + 112078216, + 1865737314, + 875865198, + 2211084158, + 1086193328, + 2659437179, + 910056074, + 3237044714, + 1430855232, + 1007484969, + 1499130600, + 3996654787, + 3753211228, + 2728300127, + 1319358048, + 3605326440, + 2026829440, + 4005681313, + 2514350014, + 3618720971, + 2217961948, + 2643886120, + 1109165707, + 1357361917, + 3585870869, + 3975058244, + 1572488796, + 3676823008, + 3470094201, + 2872546225, + 3920835406, + 3992675783, + 1156174027, + 3140381092, + 2608121047, + 3058624155, + 2934998069, + 1759196965, + 4067500916, + 1991472626, + 3216619691, + 4098769599, + 588951713, + 3245777749, + 328730364, + 4126839681, + 1792154873, + 2422719474, + 2367088035, + 1310551741, + 1128033721, + 2150996276, + 1581828975, + 645831829, + 813503457, + 3782478553, + 3649932994, + 565493008, + 1237117989, + 1406104413, + 3520255107, + 2338045602, + 3916991046, + 4119017913, + 2958534024, + 3954739116, + 3054230077, + 2089357111, + 2722855650, + 2156538875, + 3623928975, + 328004962, + 1829806979, + 3680050410, + 3349856728, + 204276030, + 1314306494, + 3453817559, + 1440201957, + 2581060525, + 774227086, + 203891280, + 2032606986, + 1417439893, + 96835846, + 3079591025, + 41398510, + 2370311794, + 1552067640, + 4238548553, + 2918547787, + 391361244, + 3128388937, + 917817877, + 3109899736, + 1193398111, + 3994520336, + 3302673874, + 3782873339, + 345550479, + 682307291, + 2438073360, + 2182612000, + 136911609, + 3024578829, + 1464426766, + 1239236169, + 406241719, + 1535531405, + 2249614820, + 3967341651, + 3885490058, + 833285326, + 104357454, + 2328553955, + 82630145, + 3082197131, + 2629109725, + 4085385077, + 1995605292, + 1739322451, + 1857299281, + 1894106091, + 3916707902, + 3993176173, + 4217211762, + 439008959, + 600329550, + 818825754, + 1530207975, + 2238991688, + 960664779, + 3238916603, + 1055058350, + 1940929455, + 1547247554, + 262617941, + 3600373476, + 416132026, + 993368759, + 2220762413, + 2852293841, + 1401214863, + 3029911071, + 1135574851, + 788507775, + 4164163886, + 929053590, + 3881226173, + 1607866966, + 1395847479, + 3583865283, + 1312324692, + 3904671527, + 2853328653, + 1662356337, + 3423291458, + 3668912436, + 703598365, + 2734575634, + 904651833, + 1980080977, + 2814690629, + 1678408372, + 3044565028, + 22124286, + 3835552664, + 1106202935, + 589445083, + 2002996321, + 4035213816, + 2754553947, + 196817661, + 3486306750, + 2267106733, + 1709355984, + 560969423, + 1517733460, + 3855497140, + 2801556340, + 2806825827, + 2967296788, + 473298803, + 1395091012, + 622672642, + 753358551, + 4219187485, + 948513982, + 2514732523, + 2988203347, + 860398870, + 2353708558, + 3661475772, + 4230893692, + 161043738, + 2756794330, + 1450970908, + 420462594, + 881773228, + 56514774, + 1907948897, + 1673406495, + 4171299645, + 2132255999, + 3809708706, + 3431489286, + 919982798, + 709011670, + 1081067199, + 4201636608, + 122269038, + 1258523141, + 181516679, + 1775120507, + 4238218441, + 3558361945, + 3658796380, + 4184496803, + 3478503704, + 4235749148, + 717242277, + 3766020122, + 2600264467, + 4174475018, + 316626662, + 1240878743, + 3078415811, + 572831387, + 2927378236, + 1244736273, + 1975048403, + 314206284, + 1914441224, + 1028117221, + 3574470736, + 2449819628, + 1631424205, + 4224123394, + 1387213920, + 3791010853, + 304120444, + 262280588, + 625045400, + 3195066831, + 2057833987, + 1703506758, + 1976092793, + 979500326, + 512193020, + 3063384663, + 2963708510, + 547588036, + 3049595940, + 3725320001, + 3916537618, + 3889955026, + 1506842990, + 2641879782, + 225436563, + 2535851186, + 3245888294, + 1994911865, + 1796904087, + 962458107, + 1438229843, + 1347717789, + 183138165, + 3661538237, + 3506250210, + 2093502661, + 48215994, + 2293601061, + 3771797701, + 4270309536, + 652000030, + 3884933335, + 4280498577, + 3771682694, + 2572898690, + 2071886109, + 1949013267, + 643211610, + 1021077545, + 1116964597, + 3507381253, + 1055668749, + 1504005409, + 2274252350, + 1231648753, + 2829518306, + 2220376773, + 69824327, + 772847414, + 3740221247, + 3624723289, + 2962455328, + 131199905, + 3495559133, + 1226338141, + 3441459539, + 2708809389, + 3231899936, + 2278904859, + 588773924, + 874836819, + 1905354747, + 786284287, + 166884127, + 1252924058, + 1663292082, + 2963163944, + 1806980723, + 3316352187, + 1806328942, + 2467852058, + 3859711752, + 3080417860, + 3981112232, + 4193085633, + 4165431902, + 2813861506, + 1945379748, + 3407760529, + 3778035981, + 2492778913, + 2517891821, + 1323110150, + 3093972115, + 4217083848, + 2614216226, + 1141562316, + 2557122568, + 2014813599, + 303833910, + 1783656083, + 3159216809, + 1388168740, + 392633788, + 2627901482, + 558935529, + 3140407472, + 2597831840, + 3616663126, + 1339844291, + 2035526563, + 4016101620, + 2110605774, + 871445600, + 2526693095, + 742264744, + 1742440448, + 1836544215, + 807275609, + 3538472680, + 2663262041, + 1982268095, + 2930866209, + 303755377, + 1018210394, + 2587693616, + 739580871, + 2419846858, + 913923280, + 3230906163, + 157123293, + 2552733540, + 1168370807, + 3201727121, + 284650482, + 3742141477, + 530697199, + 2663944551, + 1700576440, + 1772649389, + 3291728809, + 966261607, + 2605032729, + 1902267898, + 658607716, + 421242108, + 23072538, + 3770528788, + 689666739, + 1561495485, + 3942664529, + 1767495272, + 1218870892, + 2866584929, + 2949439933, + 2072458596, + 2796927051, + 4065368968, + 4209619768, + 2849755127, + 733612533, + 595027785, + 2220774604, + 1932330361, + 3556230370, + 1678901321, + 1779213666, + 2071683051, + 1326913129, + 3699383882, + 2812019033, + 3374222860, + 1872559238, + 857768639, + 2681244723, + 3026287524, + 3505509213, + 3259193275, + 3201374879, + 972066410, + 2536605408, + 1625988082, + 4100621349, + 3830470421, + 20566907, + 2367134850, + 1517490710, + 2764556404, + 2908501331, + 3793534428, + 3282361253, + 449374153, + 1517642003, + 654707337, + 1814855953, + 3000000990, + 3267184107, + 2877080482, + 387333527, + 2346755280, + 3951362959, + 2252743198, + 3655559769, + 2047592419, + 3666868457, + 596515358, + 1898850093, + 2619271451, + 432924948, + 406316277, + 3523450207, + 2631707103, + 3104941800, + 1697027111, + 841759719, + 2366283620, + 3320135835, + 1264429240, + 2298543558, + 2811005353, + 3763306014, + 1665312736, + 1219354498, + 3412895319, + 3343735879, + 3182259583, + 2245868492, + 651097240, + 3410529101, + 653153401, + 3187177042, + 805257777, + 3391701023, + 2173991519, + 2764816354, + 3738297083, + 3338249951, + 605174599, + 3447153298, + 2268552461, + 264710236, + 4291187518, + 1248822947, + 1207711803, + 3143689773, + 2120173086, + 1258024386, + 1675669148, + 3944266076, + 3770500210, + 519345158, + 4055969249, + 834847959, + 1523345273, + 2281508419, + 4279945710, + 2256251712, + 2723118906, + 949172489, + 3556653509, + 2204978651, + 2207845272, + 3133121782, + 2938649262, + 1054902655, + 3917906197, + 147812442, + 1590837576, + 1046907258, + 3127957074, + 306554455, + 109358972, + 1957906795, + 10768826, + 2123982763, + 2967261105, + 1591729359, + 1336828548, + 506774965, + 1047427165, + 1037772748, + 3619622504, + 155858022, + 952278271, + 3278643492, + 3225668899, + 3319584688, + 3252897181, + 2181583888, + 1289827804, + 28957372, + 4273878984, + 89664495, + 2492447578, + 398829821, + 494949490, + 2277738352, + 2554005742, + 1519166941, + 2957097382, + 1954972521, + 487387151, + 1232404941, + 1650316531, + 4110337470, + 845353124, + 785405497, + 1646209586, + 15877749, + 3448987439, + 734462387, + 2195390972, + 919642075, + 2955779591, + 702970477, + 3697074056, + 50426274, + 898227958, + 1755036673, + 1910263162, + 2013661310, + 3127844575, + 1853025464, + 2110523832, + 1231234120, + 3892427567, + 1935442332, + 3022751576, + 1985092492, + 2158135710, + 106593183, + 1360514793, + 298362780, + 2058814314, + 1523861399, + 520755225, + 685291107, + 3102826108, + 3549157157, + 3786620024, + 1826280610, + 3631202419, + 3303616201, + 684122101, + 2286439339, + 2125936501, + 2615781446, + 2418283027, + 2738037446, + 1877719402, + 987776849, + 360257720, + 2337725525, + 446615630, + 466757814, + 2541832891, + 2615550350, + 2654609671, + 1361101261, + 3071843094, + 3909891138, + 190222801, + 639699721, + 1024499563, + 2556417947, + 373717939, + 285013433, + 1212167730, + 955227338, + 1299200886, + 113072682, + 567001773, + 945836127, + 3766327328, + 3845800444, + 650637636, + 1006321127, + 540715098, + 1172818744, + 3094499655, + 2871696874, + 2229381738, + 1797948602, + 1568646875, + 1879237494, + 1901737513, + 1178465513, + 2441781528, + 1955727748, + 1602886393, + 830096769, + 4287316935, + 4117789393, + 1764761105, + 1510703150, + 888373874, + 664414303, + 736079463, + 2609555377, + 2973266570, + 2885918245, + 2323361608, + 2208429469, + 1218893888, + 2824695392, + 817620773, + 3061189442, + 929156957, + 2123907247, + 669473357, + 1790257927, + 1207062332, + 3024361152, + 652174046, + 76417401, + 1310445291, + 352503087, + 934222995, + 1621562874, + 3476300946, + 4122868070, + 3046150560, + 4073415876, + 1707347927, + 2800425317, + 2402774749, + 601634370, + 3498639461, + 2649634251, + 3487473796, + 55699024, + 162575137, + 2189462615, + 3472080627, + 3281238142, + 3270065881, + 4110089000, + 1690905601, + 502197524, + 1750228491, + 961423964, + 3128374279, + 1553464502, + 1829292678, + 1235862765, + 3103786199, + 1639206940, + 2997914869, + 3003377608, + 4142043898, + 1747646189, + 1130398955, + 1588783261, + 3034393415, + 845935005, + 1772557365, + 285117179, + 3599356502, + 951748811, + 167401816, + 2232533673, + 2617234967, + 1419932968, + 1167682149, + 975352234, + 2763495694, + 3197752271, + 595823830, + 1588578278, + 2386248794, + 909278656, + 2101377703, + 2230465015, + 2658465810, + 1856737400, + 1938906067, + 3208196807, + 4021819101, + 3059209277, + 3318207999, + 360746369, + 3917621249, + 3236100968, + 296789212, + 2249842992, + 3929462743, + 2575677595, + 549690622, + 2324183286, + 2053744245, + 300456244, + 4030910227, + 1531031245, + 1199942611, + 3368273307, + 3903749323, + 4019027122, + 3053922298, + 3313275547, + 2394355988, + 3651202722, + 1488615493, + 994226677, + 126516137, + 559229795, + 3475663475, + 3304525633, + 1192299247, + 2150786505, + 3670764778, + 907141519, + 4086631695, + 355798397, + 1152147355, + 1879318382, + 2972628956, + 2959490070, + 3844206001, + 3244219916, + 793806280, + 2722706154, + 1515673486, + 4051536979, + 3751106171, + 787433371, + 2843441917, + 3001752017, + 2498082244, + 2950098174, + 868210399, + 3008876275, + 3736120945, + 4129124291, + 3791295388, + 1225908363, + 2807908843, + 2322359598, + 4078221518, + 4205546087, + 1524741360, + 4181623484, + 1930648505, + 4221287427, + 3931404436, + 2667616968, + 3203700481, + 1300442593, + 3268750370, + 4181328070, + 2382233868, + 1208237089, + 992465275, + 1914341727, + 3941390017, + 633721323, + 1211212794, + 3124771829, + 935302196, + 2213884160, + 225187464, + 335369019, + 2291182901, + 1082819945, + 3797596848, + 785926550, + 3994512182, + 645756893, + 2536452534, + 2535773441, + 19422321, + 1534623224, + 1919597196, + 3647824768, + 3220254646, + 2092674692, + 2933366658, + 3232783539, + 1463788534, + 4129792376, + 1347917161, + 616337551, + 971517558, + 3751117533, + 3634717281, + 1015431336, + 322536052, + 916956036, + 10857027, + 3938098947, + 806269996, + 2697631853, + 4162389214, + 690999256, + 2029299267, + 2979638139, + 3141717545, + 2762710271, + 321539485, + 2307214637, + 3479818728, + 489385675, + 3520573746, + 4052845159, + 1242052269, + 1119832802, + 284811621, + 915100737, + 409154645, + 2339193143, + 1955213026, + 321649725, + 3473291310, + 2528076476, + 1598615301, + 2366233483, + 3437529135, + 1172475973, + 168593729, + 3768821186, + 1577379386, + 846618240, + 3914646939, + 3481908462, + 303923048, + 661610222, + 1146463624, + 947347698, + 573098625, + 783396285, + 310215094, + 1977049799, + 1995193438, + 1958422533, + 2826249109, + 2557291895, + 950748836, + 395966547, + 3860839880, + 80399321, + 3897710439, + 725605989, + 3336520762, + 2201987032, + 2028982905, + 4117998114, + 2029461649, + 475649525, + 2465581513, + 2090661836, + 3535920052, + 1440181137, + 2436642741, + 1094214706, + 298503352, + 3027964197, + 2912046756, + 3012909864, + 215072721, + 3343986871, + 4255017029, + 3031591993, + 1966271828, + 1637051752, + 2789186457, + 4034680347, + 2900190375, + 977762186, + 1492081198, + 1117859656, + 1755776345, + 1024800663, + 788188070, + 1792230521, + 3652473550, + 1189966356, + 2393621797, + 937195201, + 490467783, + 644462655, + 930506234, + 1181373083, + 474095790, + 124252498, + 1652553961, + 3191483107, + 2538473963, + 3954782148, + 429825199, + 3574446148, + 741675770, + 3983455075, + 103396045, + 640016805, + 1757341535, + 1270267817, + 2887377925, + 3374766268, + 3909627404, + 3818126462, + 4233499950, + 3202206687, + 2670375804, + 4279538782, + 1566167898, + 935143356, + 3717651129, + 1232649688, + 1541731651, + 3924509632, + 1811318227, + 2317138045, + 1224825071, + 2201280290, + 325909807, + 1326922573, + 3919590484, + 286162193, + 1907635231, + 3393818450, + 3955224282, + 190157807, + 2757057647, + 1922656534, + 1845878337, + 2179708154, + 1429679770, + 4088461255, + 3560749422, + 675620490, + 1553544279, + 2350633196, + 863210006, + 3281660437, + 1358542803, + 2872542705, + 1740564139, + 2468224981, + 4058529728, + 3659873364, + 2610994531, + 1542385777, + 2017845358, + 1791629514, + 3590586223, + 2870590524, + 1459774044, + 2721673246, + 501610151, + 1359461018, + 3927361662, + 2785222758, + 2317916056, + 567024951, + 427231191, + 2778345120, + 479080369, + 3172969703, + 2936135855, + 1193710701, + 2656276225, + 880168748, + 675137845, + 3189626372, + 3465066230, + 3590177660, + 366736035, + 1657775715, + 2630118471, + 3342133163, + 904886865, + 1689196749, + 2685802451, + 3208201786, + 1184802669, + 1609897659, + 1917577126, + 3683439795, + 2730568710, + 1837974509, + 3975279530, + 3531848452, + 3098263538, + 689132706, + 1810247082, + 3974088450, + 2161673793, + 3885678513, + 2464350154, + 4285239191, + 1640710546, + 42170851, + 2692693200, + 2943081751, + 2656421656, + 584224241, + 4276486238, + 1950338098, + 324817711, + 3346079751, + 690459118, + 679246037, + 1996679258, + 2967149760, + 766071505, + 1417014727, + 4099262330, + 1592833865, + 2330778508, + 2143195865, + 473762017, + 3134982340, + 1768296858, + 1945561439, + 3139216732, + 3386946131, + 3781908821, + 3993637444, + 2267412140, + 3543596333, + 3275512998, + 343385587, + 818740474, + 1236420752, + 4194217535, + 2340632699, + 3252608479, + 3880458840, + 933826954, + 93856003, + 352662718, + 1745782103, + 3859654510, + 2534560962, + 2542617968, + 3994687696, + 3084213167, + 3325797821, + 806264219, + 2787148881, + 1768489883, + 2393439046, + 4116519766, + 4222953566, + 1540051338, + 4194428858, + 1452915663, + 167773778, + 2082123233, + 2094812020, + 1887409909, + 1162655390, + 2825034560, + 1247808758, + 3158400712, + 3717520632, + 1879291050, + 2658015404, + 1518866134, + 2185728048, + 1487639175, + 3481767248, + 377910014, + 3734723027, + 3865880445, + 1735305658, + 3713504513, + 3132247514, + 2863292055, + 2180225743, + 3898417300, + 3045930447, + 2791861526, + 1045217052, + 674566151, + 888905680, + 651294073, + 3315988228, + 926625507, + 2908128598, + 177197779, + 1847612557, + 828559145, + 4239611977, + 4001973704, + 1847386160, + 1744489124, + 2922546055, + 909174414, + 44554434, + 188383855, + 974679972, + 4288576748, + 1064602186, + 2279863759, + 1218831334, + 623534196, + 219236083, + 63933782, + 3283800549, + 1234970049, + 2948584573, + 2415808733, + 3815162556, + 2839463375, + 2692935733, + 107001639, + 2680781328, + 2852086318, + 3509486863, + 2314756376, + 1647781629, + 625031852, + 101533661, + 2813360360, + 3362463028, + 3690168785, + 1543840477, + 3866615038, + 100977787, + 3224692541, + 3587716945, + 719158630, + 3213760234, + 2267688934, + 1441518838, + 3366693669, + 2548869666, + 531908748, + 2337564811, + 2824158723, + 3169848842, + 1227008332, + 2333581455, + 187965202, + 3366360161, + 2314970481, + 2576780768, + 2377332394, + 2814051660, + 2201444562, + 2002863793, + 1788827187, + 2277254017, + 612334030, + 1687580580, + 652292579, + 3495939639, + 115192845, + 850157650, + 2649115605, + 2678932407, + 3421560740, + 1476965463, + 3864108901, + 1782032630, + 3044795072, + 805504792, + 143825280, + 961777618, + 3635031549, + 1701285733, + 953286817, + 3233529251, + 1860747559, + 3756863377, + 4108876085, + 2208855334, + 4005207313, + 900400860, + 1915532138, + 1684465777, + 319113414, + 4040903323, + 3759509617, + 4203775089, + 1096838946, + 1348786508, + 2204513234, + 1005485709, + 1315093781, + 2278279183, + 1598385100, + 2127679690, + 1829010384, + 2131890044, + 2907075157, + 2890255569, + 3324859759, + 1855046239, + 118912092, + 948184862, + 3964956420, + 1478027186, + 2825110023, + 1389450110, + 1687228580, + 3289118538, + 2913305163, + 259944603, + 943409016, + 1655114960, + 315198934, + 769313190, + 2031831311, + 1936990921, + 2557307702, + 4049060769, + 1261705442, + 1690095542, + 3488156236, + 2325058438, + 4280618745, + 3787923316, + 4235475404, + 3422644011, + 1351439696, + 4010137166, + 1275314825, + 2756556397, + 1215878865, + 3564222680, + 2603036554, + 3389921199, + 2303801597, + 2539532970, + 1987127156, + 636962900, + 3451101783, + 3660371031, + 3933825293, + 811975579, + 3211258031, + 1758497400, + 631092889, + 1477942840, + 3780342636, + 1394468521, + 3884013575, + 2210783335, + 4284047654, + 2954793713, + 4057802430, + 3875411177, + 4173101083, + 2374868803, + 1138961050, + 4017496637, + 1748121183, + 324398887, + 3388413348, + 1421451938, + 2003520381, + 1938421530, + 502843124, + 4092269239, + 3124906482, + 1312677696, + 3963884729, + 3078964447, + 1415486080, + 1780460978, + 897543310, + 2531474031, + 3018614311, + 1082815208, + 4001984226, + 498150541, + 1620378540, + 1216275450, + 2346327432, + 1720984176, + 1603311912, + 3964902601, + 3490550605, + 3531834915, + 3789815369, + 2891277963, + 353012763, + 4210071225, + 3985612145, + 146549502, + 546083811, + 2665789951, + 4170752803, + 2789229246, + 2928540608, + 574353496, + 1213296472, + 3025553540, + 2897419852, + 3193639884, + 3807290715, + 2136142445, + 39898071, + 1043183091, + 96570739, + 313256240, + 2585059307, + 2949800163, + 529046774, + 2948064745, + 2703653319, + 14715738, + 3540100494, + 2652446874, + 3592494624, + 2325281458, + 3090026358, + 2942030534, + 3968648344, + 2503924286, + 2281103951, + 2660427215, + 1118473308, + 1509239743, + 2916996689, + 1498829336, + 2051980650, + 250189500, + 3665182847, + 2909572056, + 2294626799, + 2944239671, + 483810593, + 3703858315, + 2849742082, + 99441016, + 711375742, + 3240712598, + 865658184, + 3792964812, + 1140491868, + 1251010177, + 3972777526, + 149040753, + 3855208345, + 1713592847, + 3642530481, + 3295259653, + 136750657, + 1141650279, + 2553821246, + 2566573684, + 215217559, + 2521251338, + 2461194406, + 277826220, + 2998894768, + 3856313489, + 532725356, + 725275576, + 4121938655, + 2701056102, + 1739249689, + 4116099840, + 546955007, + 2671031117, + 3563388598, + 2077602378, + 354965497, + 3921478345, + 2200137986, + 2437363015, + 4233937353, + 561597003, + 2541518544, + 4282970946, + 932070842, + 2088114091, + 49855870, + 3540598667, + 715968716, + 1669139560, + 3450921870, + 2093995449, + 2528122527, + 356900920, + 3561549779, + 3860645517, + 4278347546, + 3783282227, + 2307265707, + 3473752392, + 1425883068, + 3219964004, + 1871354297, + 1006991116, + 2780202822, + 408451822, + 3518660676, + 2577965225, + 3776366684, + 2153658933, + 3064676948, + 1472411737, + 3381444470, + 3471573965, + 683224623, + 297910656, + 1948251983, + 1074723305, + 1042462198, + 2565100401, + 3959558175, + 3498781989, + 1245136278, + 1108074258, + 3567181355, + 1470821042, + 2517217283, + 3573560259, + 872355438, + 3641166826, + 4202604347, + 2863743155, + 1057862159, + 1168505979, + 2333146481, + 2470305939, + 3050274050, + 3706189012, + 1028326579, + 790821605, + 2353647910, + 3373651886, + 2717862286, + 3998954681, + 3724768117, + 2358682029, + 903774653, + 1086586914, + 2947052435, + 504148349, + 3005589428, + 130885927, + 2413604176, + 151980166, + 1646237598, + 2651453845, + 1702301255, + 3312733948, + 1419466000, + 2041837946, + 845829392, + 3184621221, + 236708413, + 1251305612, + 3440133196, + 2698248849, + 752241622, + 3906730995, + 3704663981, + 492234719, + 118829586, + 755123524, + 1226340719, + 360667370, + 3870699370, + 2670210093, + 3790151436, + 3398951130, + 3871562708, + 2885299864, + 1163048740, + 1581139373, + 2060136304, + 3845596774, + 721716464, + 2415917285, + 277894360, + 646770305, + 4241803781, + 2447148003, + 1830681955, + 1453659315, + 990668802, + 782328237, + 4050323278, + 893916928, + 2105619553, + 175326153, + 3554983436, + 3795672837, + 1732262111, + 4286295173, + 255546894, + 101929352, + 1541699912, + 3542672967, + 3031964460, + 143176522, + 906673350, + 1848847981, + 3701458351, + 1427035169, + 535233943, + 3249784825, + 525907029, + 1677057436, + 2778637652, + 689646306, + 3093619410, + 1818164057, + 3263377090, + 3879936799, + 3872931380, + 2002981405, + 2392535763, + 311442967, + 4061383355, + 2455913343, + 2779048380, + 2057044556, + 246641653, + 2044634612, + 2544006144, + 2072255224, + 1762484549, + 1138624066, + 2262591849, + 549047967, + 1952213166, + 698152302, + 1384636327, + 2500587810, + 1114201108, + 2982983695, + 95202967, + 3436368360, + 3575909170, + 1988847387, + 900944206, + 2255494299, + 3497488797, + 1619002053, + 325384725, + 3852263129, + 2344454977, + 3683328158, + 1827261482, + 593467843, + 2780478905, + 2216479461, + 3425383121, + 2641892713, + 3903857461, + 646603900, + 3776413773, + 3231496073, + 2942430253, + 65150708, + 881406575, + 2882663974, + 3535986466, + 3678450708, + 2875897637, + 1799977984, + 2411338889, + 3561758145, + 782528753, + 1730147935, + 2528914440, + 1031394643, + 2173121898, + 189974677, + 1998905787, + 280188602, + 777006633, + 1423232314, + 541680030, + 3128059334, + 3607239863, + 836602129, + 3476859569, + 3578125358, + 3285983526, + 3269548815, + 1279748133, + 2334574351, + 3583416038, + 3353380374, + 3242338712, + 2325055872, + 2213015758, + 1788639857, + 958443264, + 3288231515, + 3244677766, + 492970933, + 3256559073, + 2314347699, + 1219940993, + 1006715248, + 3227681237, + 219262279, + 1936802420, + 3218238327, + 627237382, + 1900767799, + 342345778, + 1705769943, + 909994719, + 619654408, + 2425216068, + 212600451, + 3241568358, + 1266085212, + 1162371253, + 4294386999, + 1956725719, + 618869866, + 2881089305, + 948530626, + 3125525668, + 2623958800, + 3568527850, + 1828490087, + 1980242457, + 575194314, + 938093406, + 1694864488, + 1287826537, + 3314079285, + 531223177, + 1052129742, + 2623869501, + 72624735, + 3328309869, + 3730915604, + 1279936399, + 2149352237, + 2003971505, + 3806533116, + 1986061339, + 2761213719, + 2370685428, + 1521139781, + 2415964715, + 3465699132, + 2432144346, + 3030156770, + 2410927907, + 3237540670, + 3947761694, + 3495355452, + 1285234356, + 1790600310, + 3476142310, + 3491190399, + 973333385, + 1518394637, + 1117018969, + 2468687092, + 1240195001, + 137882307, + 157102370, + 3716968878, + 2428714132, + 543934818, + 166077569, + 489052577, + 1279721120, + 2153200267, + 3461044741, + 63947007, + 1365096423, + 2552893457, + 794896936, + 2335377198, + 671099848, + 1145195262, + 687339917, + 1550491760, + 2712888142, + 3573805987, + 1447244349, + 1517794858, + 3389046906, + 859355436, + 1056295617, + 3890870695, + 3066687733, + 1093093685, + 1080163542, + 2437620862, + 2710775107, + 4157562242, + 1501189385, + 2130533310, + 548114685, + 2596641543, + 3541729911, + 2037170616, + 951924855, + 2767812243, + 4092501102, + 64679071, + 1501356211, + 1688581096, + 1283840175, + 2937652585, + 4266308184, + 936909608, + 2730859739, + 1413643927, + 2267196735, + 610630861, + 417635607, + 2676607048, + 261283976, + 3697882106, + 3345745776, + 343489525, + 3810344967, + 3646045539, + 620871032, + 3749083275, + 4078308233, + 2765664826, + 1399839325, + 3996169245, + 1834429330, + 3523079076, + 3295894660, + 2983009336, + 566180094, + 1053238172, + 1893428609, + 2890017161, + 3392869969, + 3105727028, + 550579610, + 1667665626, + 3233665697, + 3843433741, + 2103147303, + 2000835642, + 863932205, + 806294971, + 2223040494, + 4288347553, + 25114166, + 2154413666, + 3847716663, + 1067391063, + 4027778095, + 4056024100, + 1781823571, + 1010635671, + 1775748916, + 1567552418, + 236193158, + 1434184842, + 3062415137, + 3748555967, + 130495918, + 2939903737, + 1666752135, + 1066079473, + 1836450041, + 2195830766, + 3066331871, + 1897175848, + 2066200793, + 1973030902, + 294293942, + 98782476, + 4171791288, + 2208092380, + 2192004222, + 2531215288, + 1140349132, + 2776662488, + 1070173135, + 990721743, + 4183076799, + 2402194898, + 2760059247, + 658432559, + 3039901877, + 2830977616, + 1258192194, + 660194621, + 3722290197, + 1178933807, + 1459226644, + 3524102385, + 608197491, + 2178567582, + 3865121923, + 3803055127, + 3366268954, + 690378779, + 1164465237, + 3106017890, + 1047217222, + 3636325764, + 2378086629, + 1515916553, + 330457022, + 1094384971, + 2588259970, + 875067225, + 3482598832, + 496182656, + 286444983, + 2809317013, + 1777706198, + 4006769276, + 1079383453, + 2881585376, + 4178878456, + 878246549, + 1100855806, + 2110896445, + 2092027254, + 570896793, + 3913905077, + 49760882, + 2429561358, + 2268836641, + 3506046312, + 2859849789, + 893590837, + 3687412966, + 2406418824, + 2041532294, + 3316860356, + 2432632690, + 659382815, + 50227060, + 851367642, + 1108280398, + 3374139603, + 170587798, + 393365888, + 3046748957, + 1115479686, + 3925029882, + 978009075, + 2025902863, + 3918745573, + 2481300025, + 951836959, + 4044134583, + 4146137580, + 691481102, + 230022273, + 54751467, + 1895877792, + 261978311, + 2167645146, + 1570701103, + 3044599542, + 1065958391, + 3642959896, + 411777366, + 2225324140, + 2464820991, + 1315183199, + 1513631572, + 2353509971, + 1998383760, + 706743093, + 2348303877, + 1547200290, + 2968469338, + 4039179170, + 4191948899, + 1763233743, + 833029357, + 3841460041, + 2142617731, + 2521113966, + 159237756, + 544757874, + 1083580534, + 3964056939, + 1590767642, + 3978432310, + 3835200251, + 813428684, + 23505149, + 2758482039, + 3598792833, + 212206400, + 2530199368, + 3839157450, + 1048871428, + 742601913, + 4149697457, + 566913053, + 2102453554, + 4264989198, + 3861808126, + 1956969322, + 2389700883, + 1154472998, + 851631117, + 1538857433, + 1807411768, + 3042015944, + 3901545602, + 3589121080, + 1282964494, + 2857849724, + 2929889574, + 3020590266, + 3587195553, + 1326046040, + 1986820969, + 1134786778, + 385604928, + 4266813263, + 2751475720, + 4086822997, + 1877876572, + 223830137, + 4189367025, + 3916126104, + 3675859677, + 4094469636, + 423319294, + 285547696, + 2939210694, + 2961027438, + 2928063716, + 1304577777, + 707971290, + 3235182878, + 621361630, + 2156904139, + 3635704940, + 406006015, + 1053905679, + 1526470900, + 178754388, + 4022623628, + 4045068608, + 2973963397, + 2605716753, + 3617255123, + 4245369039, + 3381788432, + 4119953143, + 288636607, + 2919552068, + 2642572652, + 4171623330, + 2094329539, + 4155362544, + 3967558779, + 3848066047, + 2560015109, + 1817744073, + 3588670966, + 1777801410, + 1993928022, + 3456262014, + ]; + + static const List _envieddataprivateKeyFCM = [ + 589511021, + 1323998533, + 176850944, + 1551255156, + 397738773, + 911500162, + 2737091474, + 708979997, + 3994760758, + 3303700709, + 888569139, + 289778060, + 1768937611, + 1996145785, + 3840916743, + 1501832586, + 1936488063, + 2944326342, + 3871460792, + 2746191034, + 2366037663, + 3260886734, + 3296565714, + 349592002, + 1396175095, + 3080033997, + 2398883040, + 3949466473, + 3378685641, + 3195545630, + 365676036, + 197147087, + 2389375480, + 4146490055, + 1979426675, + 1476646487, + 3924163693, + 1238855844, + 1880485139, + 1818526239, + 3438893976, + 1419717613, + 3337932786, + 488209615, + 2538814835, + 1376649389, + 2966036136, + 2636818253, + 2473945788, + 1243743989, + 1333722304, + 1378848105, + 3401063737, + 1934211747, + 3201016291, + 1126062345, + 3227144982, + 2683131401, + 2661254427, + 2911453449, + 3789526830, + 2043164298, + 796844581, + 2093739274, + 3983503378, + 2906976323, + 322110433, + 1954594948, + 1011027017, + 2977775800, + 315889079, + 3101075807, + 3280515285, + 1720531821, + 2451434803, + 128374457, + 3550487633, + 3565976533, + 1210376435, + 57874698, + 3277710818, + 1234230112, + 3673887702, + 1284609792, + 1382134588, + 546595259, + 1333446416, + 1200201770, + 405234428, + 2873729703, + 4196873256, + 2469332686, + 31268618, + 2000566884, + 2863079542, + 1916394421, + 4061015755, + 1801841, + 1602869304, + 3872221708, + 2229661838, + 476638190, + 2885047426, + 3904841046, + 2398848389, + 3362927794, + 900826116, + 583893194, + 809803332, + 783205286, + 1232027095, + 642619817, + 291325673, + 2394595815, + 2083935040, + 441843619, + 3794227363, + 1202086974, + 1608534168, + 3007131929, + 338805743, + 1037358754, + 840481667, + 1477436863, + 3935784939, + 4034282324, + 1683212201, + 1082988654, + 863915951, + 402521142, + 2585215152, + 1184986847, + 2339888746, + 3248831765, + 1327189634, + 1824862031, + 2781708262, + 2514970689, + 744659021, + 1609629996, + 124253649, + 1802674923, + 836390117, + 817098764, + 525539703, + 2493519200, + 579659981, + 257006896, + 3821235563, + 3544658050, + 3349581083, + 1140776301, + 1732186477, + 2653732335, + 2511018242, + 772717904, + 3203167844, + 1918239996, + 2377626910, + 1895572652, + 2337741050, + 3165624971, + 3165169378, + 3916395310, + 1579432771, + 3273935512, + 831366372, + 1544919845, + 1357891515, + 2528107796, + 3984972442, + 1837805658, + 2655613966, + 278077232, + 3125585650, + 4242824043, + 2137097645, + 1362770071, + 3090519654, + 3542246293, + 2267914494, + 832654185, + 152735679, + 3007818922, + 1425167047, + 3714717895, + 1051882629, + 535736643, + 1094103409, + 3490517358, + 1957250708, + 4253453966, + 2178065005, + 1347056379, + 1325621696, + 3261978280, + 2296494729, + 1270875153, + 3085006720, + 2916172790, + 3332467033, + 3886507647, + 2154714101, + 2875062686, + 3077420231, + 3718741165, + 4069134394, + 2080712587, + 533646438, + 1494115299, + 2364174184, + 2727979007, + 3062137193, + 3726496722, + 3615246392, + 3086334514, + 2635806499, + 4070476088, + 4217497356, + 2785524495, + 1454301776, + 2242779094, + 839119699, + 1643111716, + 3384973805, + 1163654181, + 3118298103, + 543844405, + 4232234145, + 674505353, + 3698352841, + 2216806315, + 2486477489, + 3555566439, + 2011337377, + 1346436741, + 2947356604, + 3181592759, + 3965165060, + 1335350225, + 988042451, + 2124837557, + 1295962658, + 1522323171, + 1637981387, + 2686006757, + 713136288, + 3260483940, + 989480692, + 321644081, + 267440544, + 2369524169, + 2139322290, + 2935019344, + 486650077, + 231245845, + 2714229047, + 67591338, + 2380817191, + 2081839473, + 2313368699, + 1485151547, + 653563131, + 1082971547, + 2267410215, + 651519792, + 454536393, + 2315934847, + 2420623906, + 375642401, + 2182955644, + 296208522, + 564661255, + 3961785388, + 3678215162, + 3153379508, + 1971824111, + 1536441562, + 3573140330, + 3000952908, + 1455167847, + 3309756596, + 1001326117, + 4016740180, + 2189037310, + 467730799, + 1536025905, + 1186723218, + 4262779272, + 113642172, + 912801006, + 2242370382, + 4100901277, + 225415280, + 1907470633, + 2691952555, + 4097915339, + 4106718476, + 1248713056, + 2570330515, + 2861469709, + 681401047, + 631603120, + 1643272389, + 2126934258, + 1391106081, + 1235457234, + 3714312193, + 859041899, + 3523755014, + 2066936928, + 3916072629, + 3758707674, + 3263960285, + 2041189628, + 3159326909, + 983812159, + 2269627436, + 1436127317, + 4235964022, + 3039314585, + 3751559271, + 3727491962, + 225434914, + 380882437, + 685233186, + 12498349, + 3611229891, + 4171128571, + 336638769, + 1272706904, + 3677602280, + 1945754256, + 1219264709, + 1481610199, + 2894749646, + 198454810, + 3770857646, + 1422301959, + 2981610206, + 3113375441, + 401958174, + 3332112158, + 2276137903, + 3289232063, + 3012553456, + 1432418441, + 664622044, + 3560437675, + 819110716, + 3028090825, + 2770831003, + 2533512056, + 2421331807, + 1334424121, + 1823651137, + 1934026985, + 2730732450, + 102398553, + 2458389559, + 4229009881, + 3763461645, + 2432594459, + 2742929546, + 2051723138, + 1577603373, + 1700089585, + 1122718152, + 3670881915, + 1248983693, + 175063283, + 472181558, + 2768438117, + 3091408436, + 4165497635, + 3255851906, + 3174318984, + 2654976196, + 4018660877, + 3310175843, + 543450914, + 61597, + 257875979, + 64319987, + 656565801, + 1323114376, + 3120030701, + 904098333, + 243360474, + 471841287, + 2070742773, + 2189327980, + 1310594480, + 1338071606, + 589521130, + 1363383112, + 2498152177, + 2681609237, + 3085567233, + 4067132403, + 3152526501, + 3888080089, + 4074825989, + 3516587050, + 1761961512, + 1922096643, + 4128048860, + 1635192008, + 2808163611, + 3059860724, + 3441731162, + 2780145646, + 3724070678, + 239301545, + 1656332024, + 3787767824, + 3091037163, + 2939423254, + 4188959608, + 3076095541, + 2776994862, + 3808274230, + 4271663914, + 2228685325, + 3023382671, + 87128763, + 3971101131, + 2951387970, + 815524267, + 1112949696, + 3425555670, + 1772873325, + 267122151, + 3502384421, + 2295263439, + 472908699, + 2632354634, + 2019041042, + 527372071, + 798709814, + 4013916379, + 3759694750, + 1440103698, + 51657650, + 2987526369, + 840305193, + 3043172408, + 1687940550, + 3643447855, + 2973901600, + 2191179750, + 2260332339, + 491961248, + 3634009016, + 31113642, + 834679650, + 1301301186, + 3274761765, + 3751016373, + 3214831236, + 3082788829, + 362317, + 529352072, + 3492444159, + 1280565919, + 2242683587, + 2888564375, + 1803244054, + 3435927122, + 1640753200, + 1898537143, + 3228053792, + 1954206180, + 1540456922, + 248273326, + 1325644769, + 695538563, + 4090026332, + 2274294359, + 2768151406, + 3042025570, + 4269179024, + 3806211395, + 889507895, + 3370546595, + 4096188980, + 2354537103, + 3441793032, + 3203113872, + 3457565482, + 1002278887, + 4152750885, + 3294354159, + 1041991301, + 94798948, + 25722773, + 1546525185, + 2686561678, + 2192563886, + 2621775542, + 2373996494, + 1905310005, + 2214703992, + 2399149418, + 1342545721, + 1185127416, + 288978031, + 1832198805, + 2281434414, + 2737976835, + 614579549, + 3174170761, + 2662962647, + 4163972526, + 3612044194, + 922880540, + 450642274, + 2423406646, + 4156757808, + 2294690311, + 1036538825, + 2666284094, + 240963234, + 606309111, + 683429215, + 1508006303, + 3660632054, + 200640312, + 1582774682, + 1816197312, + 1418551302, + 3544639091, + 387253256, + 2296414363, + 3164444448, + 3335301321, + 1347845807, + 103975574, + 353339429, + 2139146977, + 1254057391, + 540580888, + 221842618, + 1699742748, + 3085492567, + 3117593426, + 3076459179, + 66368322, + 1667989980, + 3042891261, + 3374433591, + 1577595923, + 1518774768, + 3758243785, + 2716120023, + 1471476742, + 2784493723, + 3719462986, + 4237860952, + 243005367, + 803541418, + 1622842370, + 4017105120, + 3282758325, + 2180699619, + 2447225519, + 1628975859, + 3236748404, + 2439493161, + 961318670, + 953497946, + 906897864, + 355062589, + 2843738175, + 4180013947, + 3007690663, + 3038340073, + 2033038577, + 1354994798, + 2425515943, + 736106314, + 3089270813, + 3528514596, + 2663787100, + 1419188080, + 1691116978, + 138082133, + 3459389459, + 2444776335, + 4187210535, + 3615446377, + 2843925455, + 3424484450, + 655655837, + 594221093, + 3515424348, + 3758056384, + 3281136615, + 3930205866, + 4187796405, + 3295721757, + 2206647035, + 104100576, + 652243690, + 3134733434, + 4076881814, + 2771590059, + 3162413904, + 176138632, + 3281037289, + 2300762377, + 1095451656, + 3748256378, + 1541232577, + 1383396856, + 1647384226, + 1602072175, + 77393344, + 2691558165, + 2027445595, + 4104901499, + 1864704841, + 1325350336, + 520716817, + 144290621, + 1087055205, + 666343841, + 494251383, + 2801070313, + 1956499105, + 3474664653, + 3738017648, + 537394283, + 708484642, + 2621188381, + 2437415036, + 2749040333, + 3705659569, + 1564587561, + 2544884804, + 2361480034, + 2642898509, + 4006956771, + 903272288, + 3181367029, + 2268617501, + 3037337480, + 3122746905, + 266276946, + 834872068, + 1653746514, + 3048207608, + 3102639606, + 2110664874, + 557715581, + 2562643382, + 3469866651, + 671343802, + 624738689, + 892301740, + 246335000, + 1480140806, + 31509504, + 3816545152, + 1013980530, + 4007882666, + 822580533, + 2981532086, + 2079640994, + 2375536320, + 2817643049, + 1415256385, + 3287243797, + 504639808, + 2206656865, + 1937728432, + 3918637485, + 3680797014, + 533621293, + 2974466848, + 255732403, + 2156060446, + 3593850467, + 1454027129, + 3427804033, + 2557443383, + 165245847, + 2154672243, + 2211909535, + 3703679539, + 1308185312, + 54229506, + 2229468426, + 2652730717, + 3367287491, + 1928368797, + 1238395048, + 2584334892, + 618288764, + 636082787, + 2419544627, + 2366144843, + 782231435, + 3247133989, + 2247378208, + 3189371460, + 752767138, + 332518134, + 2943207979, + 4047399075, + 270684729, + 4202558060, + 2956905815, + 2093921246, + 2722155366, + 1537413762, + 3696294495, + 3907259046, + 394476912, + 873554057, + 85687184, + 1054481907, + 3952738836, + 2454856910, + 1006918661, + 87263609, + 2523338389, + 787794510, + 1702085297, + 568556463, + 3301349268, + 928651772, + 606880734, + 4021341343, + 1143778751, + 1320053429, + 4199542875, + 3545237017, + 2431061285, + 3425269713, + 2107121238, + 480279109, + 1816750149, + 3608397395, + 3151874455, + 500471926, + 1080424681, + 1520818916, + 1520313316, + 3384770575, + 3387423008, + 3145859113, + 1830541752, + 591142954, + 3733972651, + 3475112720, + 1878822334, + 1272266776, + 2083179041, + 1638395084, + 2268927369, + 3240721451, + 1632193605, + 2128929382, + 308186190, + 4128090489, + 3003138348, + 990485170, + 1717726151, + 2797816321, + 2736389011, + 1252272232, + 3344205569, + 1622328414, + 3345479644, + 1626316708, + 726543301, + 2358436653, + 1216513474, + 430748658, + 2798104731, + 1061340297, + 3348277411, + 797978485, + 4082635383, + 2990078472, + 3780148288, + 3553076111, + 414250048, + 910908850, + 1635019177, + 3696436719, + 3072215358, + 3788207733, + 34479427, + 2565147779, + 2915857220, + 446470224, + 2353291652, + 1813137747, + 1595111058, + 4000215542, + 1134859806, + 1683803119, + 4110852400, + 271243001, + 909618629, + 2933619866, + 3692509488, + 2320463307, + 2710465678, + 2550792798, + 2137955498, + 3701881109, + 1236155080, + 3348182210, + 2152631701, + 3614017305, + 2617865714, + 4198234152, + 1915006139, + 766360150, + 1058299328, + 2570978379, + 1891757986, + 883393909, + 82620100, + 2426741839, + 555375630, + 3985271963, + 476519983, + 303632534, + 3009747491, + 2335133612, + 2327712136, + 1211089437, + 2727413644, + 2184930071, + 3930414454, + 1782868076, + 3914815306, + 2284867217, + 1384188755, + 3515331436, + 2027404096, + 1812693477, + 1223274063, + 2327946367, + 770080248, + 1906775430, + 1537275848, + 647704038, + 458542751, + 1028382800, + 3202191868, + 2823123937, + 1556402431, + 195014694, + 1042565094, + 404659243, + 1468535185, + 1108977963, + 1552975859, + 2113646624, + 2648600974, + 488251315, + 3743207925, + 1957437764, + 1395522087, + 27668692, + 3543192552, + 63006419, + 905449341, + 2606519531, + 164744956, + 816312964, + 3152212033, + 3483956634, + 1822833331, + 754633624, + 4049306408, + 3202903943, + 2540150334, + 3992710460, + 2638528421, + 975313524, + 16947471, + 1268649706, + 1055173283, + 3602482023, + 4287981646, + 4118198865, + 3554520647, + 935392366, + 2875878176, + 657692488, + 2903299092, + 1817422432, + 3369070489, + 1396415130, + 731757948, + 54412660, + 3375043099, + 1849341708, + 2561328851, + 348804963, + 2103970910, + 1745474795, + 1906712224, + 2991800096, + 837022351, + 1865515554, + 1168787773, + 408360113, + 226761942, + 2161703326, + 1061327103, + 2096860083, + 3495365595, + 212250423, + 2663090109, + 3937837686, + 2896517036, + 1690045637, + 3425004764, + 2761272770, + 2057762529, + 618728173, + 3273145854, + 3273491318, + 1798433600, + 2028323888, + 2271624546, + 3626585580, + 3762225574, + 432567406, + 4182989392, + 826508419, + 729003204, + 2292931046, + 1849067150, + 3201521770, + 2354543097, + 1903699232, + 458172916, + 3099872933, + 2973215630, + 2627299703, + 392481646, + 1876678552, + 2415089265, + 2589311932, + 734369410, + 1380882128, + 3035902842, + 4193755797, + 992024996, + 3704321293, + 1224456651, + 440068757, + 257894104, + 22313017, + 3736996199, + 546298585, + 2360876775, + 172411687, + 1786101124, + 2989603763, + 3740056177, + 89058971, + 505890410, + 2924254298, + 1826934093, + 915435811, + 641497236, + 1265259648, + 393231891, + 2783755963, + 2237689247, + 2001000092, + 3213768991, + 2894008959, + 2260329280, + 3719902132, + 2831692952, + 2980887688, + 1782904415, + 4145331856, + 3089843652, + 1225841660, + 4227074676, + 378492093, + 476482549, + 879016153, + 2497518496, + 6404365, + 1019570581, + 1190642514, + 358782522, + 618068267, + 1566307699, + 1538176970, + 2178025632, + 637989933, + 2667374448, + 1700155485, + 808835010, + 1056226647, + 3875640269, + 873208055, + 2280700188, + 3076687813, + 3400679451, + 4109796272, + 1545115214, + 2307281492, + 988798248, + 2750892552, + 1917884427, + 1805578336, + 544845826, + 2944863140, + 3380787813, + 1308614291, + 1701183493, + 382967336, + 1140220604, + 1261313790, + 393033050, + 769916894, + 2465240524, + 3118951942, + 2205202431, + 1626534358, + 2806957018, + 3393689884, + 2749513494, + 2002676960, + 658316918, + 596096047, + 1771370098, + 1420644789, + 4225507842, + 661016480, + 1198045657, + 3217781841, + 1590172258, + 885844577, + 1072021867, + 2518039901, + 1198077008, + 4194650827, + 3310277429, + 3574099062, + 147391941, + 2820364841, + 3495521286, + 1622035542, + 401037349, + 4144282605, + 685867238, + 147788405, + 2734293625, + 850588447, + 4005210426, + 304766142, + 3686918022, + 4082689317, + 747073373, + 1953493860, + 1713032650, + 468891157, + 1663992882, + 887527154, + 3349320948, + 2342884116, + 1587950911, + 3614373030, + 84091047, + 784321965, + 2594506046, + 3182543212, + 3421309957, + 2738756557, + 1447031048, + 3536363713, + 3174094508, + 1714453582, + 1912525619, + 3019905551, + 2355159532, + 3659541328, + 3315775311, + 3069239114, + 563546251, + 2715278467, + 3329837241, + 2774232174, + 581296154, + 3169247610, + 3875748516, + 2574388278, + 942422957, + 2538027448, + 1800723306, + 2866248272, + 683679712, + 2763073719, + 1103680833, + 3299181586, + 31894282, + 87525764, + 2458599373, + 930491915, + 736917205, + 3857363239, + 1152962624, + 617771256, + 1941492719, + 609395769, + 2856461282, + 3521812880, + 2773618205, + 3152890058, + 1351714055, + 149246063, + 181523795, + 715600616, + 3538019154, + 2897169444, + 1509154342, + 1162829935, + 1837399183, + 351742853, + 2845669335, + 2233785159, + 4130375868, + 4233378538, + 3430129097, + 3970192760, + 2910176080, + 1313300806, + 1493455079, + 3604393441, + 3664326451, + 3579537540, + 3019714235, + 1313832700, + 3462380210, + 1570783218, + 3052532884, + 500712413, + 551674650, + 1691198735, + 1007646179, + 2061855916, + 3918896794, + 2349532161, + 2704669603, + 2462700186, + 1463755136, + 2644950944, + 1049047296, + 1362356843, + 2334717959, + 3419349492, + 2966090792, + 112078300, + 1865737225, + 875865100, + 2211084054, + 1086193288, + 2659437100, + 910056161, + 3237044666, + 1430855221, + 1007485006, + 1499130541, + 3996654739, + 3753211182, + 2728300079, + 1319358032, + 3605326372, + 2026829524, + 4005681368, + 2514350068, + 3618720898, + 2217961966, + 2643886175, + 1109165822, + 1357361807, + 3585870928, + 3975058220, + 1572488756, + 3676822960, + 3470094128, + 2872546269, + 3920835391, + 3992675725, + 1156174012, + 3140381154, + 2608121012, + 3058624235, + 2934998111, + 1759197043, + 4067500834, + 1991472513, + 3216619759, + 4098769618, + 588951783, + 3245777694, + 328730257, + 4126839765, + 1792154760, + 2422719423, + 2367088070, + 1310551770, + 1128033779, + 2150996295, + 1581828869, + 645831852, + 813503394, + 3782478561, + 3649932969, + 565493080, + 1237118028, + 1406104357, + 3520255186, + 2338045581, + 3916991021, + 4119017920, + 2958534108, + 3954739100, + 3054230140, + 2089357123, + 2722855603, + 2156538824, + 3623929086, + 328004918, + 1829807061, + 3680050322, + 3349856703, + 204276086, + 1314306542, + 3453817592, + 1440201948, + 2581060547, + 774227190, + 203891241, + 2032607103, + 1417439986, + 96835946, + 3079590951, + 41398420, + 2370311702, + 1552067677, + 4238548531, + 2918547770, + 391361200, + 3128388875, + 917817893, + 3109899745, + 1193398054, + 3994520415, + 3302673848, + 3782873261, + 345550561, + 682307242, + 2438073407, + 2182612056, + 136911532, + 3024578854, + 1464426848, + 1239236135, + 406241763, + 1535531509, + 2249614806, + 3967341569, + 3885490130, + 833285367, + 104357502, + 2328553903, + 82630257, + 3082197229, + 2629109740, + 4085385036, + 1995605278, + 1739322391, + 1857299299, + 1894106072, + 3916707916, + 3993176126, + 4217211652, + 439008971, + 600329528, + 818825852, + 1530207904, + 2238991740, + 960664711, + 3238916538, + 1055058397, + 1940929437, + 1547247540, + 262617913, + 3600373387, + 416132081, + 993368795, + 2220762439, + 2852293786, + 1401214920, + 3029911087, + 1135574842, + 788507702, + 4164163945, + 929053688, + 3881226185, + 1607866896, + 1395847549, + 3583865249, + 1312324669, + 3904671564, + 2853328718, + 1662356226, + 3423291444, + 3668912389, + 703598463, + 2734575683, + 904651871, + 1980080905, + 2814690610, + 1678408405, + 3044565008, + 22124189, + 3835552704, + 1106202965, + 589445101, + 2002996239, + 4035213713, + 2754553904, + 196817550, + 3486306698, + 2267106779, + 1709356007, + 560969382, + 1517733414, + 3855497207, + 2801556254, + 2806825775, + 2967296878, + 473298742, + 1395090992, + 622672763, + 753358494, + 4219187545, + 948513988, + 2514732417, + 2988203274, + 860398967, + 2353708655, + 3661475823, + 4230893622, + 161043833, + 2756794346, + 1450971003, + 420462705, + 881773210, + 56514799, + 1907948821, + 1673406566, + 4171299656, + 2132255890, + 3809708773, + 3431489334, + 919982764, + 709011637, + 1081067144, + 4201636673, + 122268932, + 1258523215, + 181516774, + 1775120463, + 4238218376, + 3558361903, + 3658796334, + 4184496871, + 3478503788, + 4235749210, + 717242310, + 3766020210, + 2600264541, + 4174475064, + 316626571, + 1240878766, + 3078415763, + 572831427, + 2927378299, + 1244736343, + 1975048380, + 314206211, + 1914441280, + 1028117158, + 3574470752, + 2449819529, + 1631424137, + 4224123471, + 1387213841, + 3791010883, + 304120381, + 262280642, + 625045499, + 3195066877, + 2057834069, + 1703506748, + 1976092685, + 979500357, + 512192933, + 3063384635, + 2963708440, + 547587969, + 3049596009, + 3725319945, + 3916537634, + 3889954964, + 1506842910, + 2641879753, + 225436613, + 2535851201, + 3245888367, + 1994911756, + 1796904190, + 962458031, + 1438229788, + 1347717838, + 183138108, + 3661538180, + 3506250166, + 2093502646, + 48216024, + 2293601053, + 3771797682, + 4270309578, + 652000076, + 3884933307, + 4280498659, + 3771682787, + 2572898805, + 2071886124, + 1949013280, + 643211551, + 1021077592, + 1116964514, + 3507381328, + 1055668821, + 1504005487, + 2274252298, + 1231648713, + 2829518225, + 2220376759, + 69824273, + 772847486, + 3740221278, + 3624723231, + 2962455366, + 131199960, + 3495559045, + 1226338056, + 3441459472, + 2708809423, + 3231900019, + 2278904939, + 588773953, + 874836790, + 1905354647, + 786284177, + 166884206, + 1252924121, + 1663292119, + 2963163930, + 1806980674, + 3316352254, + 1806328857, + 2467852125, + 3859711815, + 3080417844, + 3981112270, + 4193085606, + 4165431855, + 2813861605, + 1945379825, + 3407760626, + 3778036088, + 2492778894, + 2517891800, + 1323110225, + 3093972215, + 4217083836, + 2614216315, + 1141562244, + 2557122595, + 2014813690, + 303833857, + 1783656149, + 3159216793, + 1388168830, + 392633743, + 2627901522, + 558935453, + 3140407526, + 2597831830, + 3616663098, + 1339844249, + 2035526637, + 4016101509, + 2110605720, + 871445591, + 2526693002, + 742264831, + 1742440537, + 1836544162, + 807275552, + 3538472593, + 2663262015, + 1982268038, + 2930866274, + 303755336, + 1018210314, + 2587693638, + 739580846, + 2419846796, + 913923256, + 3230906115, + 157123207, + 2552733473, + 1168370740, + 3201727194, + 284650410, + 3742141516, + 530697113, + 2663944448, + 1700576398, + 1772649435, + 3291728859, + 966261559, + 2605032749, + 1902267786, + 658607637, + 421242040, + 23072585, + 3770528866, + 689666758, + 1561495496, + 3942664550, + 1767495249, + 1218870838, + 2866584842, + 2949439983, + 2072458580, + 2796927018, + 4065369052, + 4209619806, + 2849755075, + 733612486, + 595027719, + 2220774556, + 1932330255, + 3556230309, + 1678901275, + 1779213611, + 2071682978, + 1326913083, + 3699383932, + 2812018961, + 3374222958, + 1872559340, + 857768651, + 2681244696, + 3026287593, + 3505509166, + 3259193298, + 3201374892, + 972066345, + 2536605355, + 1625987969, + 4100621431, + 3830470521, + 20566839, + 2367134960, + 1517490776, + 2764556364, + 2908501280, + 3793534383, + 3282361289, + 449374129, + 1517642069, + 654707439, + 1814856019, + 3000001002, + 3267184049, + 2877080571, + 387333607, + 2346755201, + 3951363052, + 2252743257, + 3655559732, + 2047592359, + 3666868369, + 596515402, + 1898850121, + 2619271467, + 432925026, + 406316163, + 3523450161, + 2631707070, + 3104941722, + 1697027137, + 841759634, + 2366283604, + 3320135934, + 1264429250, + 2298543548, + 2811005340, + 3763306073, + 1665312693, + 1219354550, + 3412895254, + 3343735839, + 3182259518, + 2245868543, + 651097309, + 3410529071, + 653153357, + 3187176992, + 805257832, + 3391701115, + 2173991486, + 2764816269, + 3738297017, + 3338249964, + 605174538, + 3447153344, + 2268552565, + 264710186, + 4291187548, + 1248823025, + 1207711869, + 3143689730, + 2120173100, + 1258024332, + 1675669201, + 3944266040, + 3770500099, + 519345252, + 4055969226, + 834847898, + 1523345228, + 2281508394, + 4279945662, + 2256251668, + 2723118956, + 949172590, + 3556653463, + 2204978561, + 2207845295, + 3133121664, + 2938649283, + 1054902587, + 3917906278, + 147812371, + 1590837543, + 1046907165, + 3127957031, + 306554467, + 109358899, + 1957906783, + 10768849, + 2123982796, + 2967261121, + 1591729302, + 1336828618, + 506775007, + 1047427085, + 1037772681, + 3619622490, + 155857956, + 952278217, + 3278643474, + 3225668978, + 3319584714, + 3252897202, + 2181583955, + 1289827774, + 28957422, + 4273878913, + 89664473, + 2492447513, + 398829732, + 494949428, + 2277738289, + 2554005632, + 1519166875, + 2957097365, + 1954972444, + 487387260, + 1232404870, + 1650316441, + 4110337488, + 845353194, + 785405525, + 1646209547, + 15877662, + 3448987418, + 734462417, + 2195390906, + 919642007, + 2955779647, + 702970377, + 3697074110, + 50426330, + 898227933, + 1755036740, + 1910263093, + 2013661220, + 3127844542, + 1853025504, + 2110523861, + 1231234170, + 3892427597, + 1935442374, + 3022751536, + 1985092545, + 2158135762, + 106593194, + 1360514722, + 298362803, + 2058814277, + 1523861475, + 520755291, + 685291089, + 3102826024, + 3549157206, + 3786619967, + 1826280654, + 3631202374, + 3303616139, + 684121986, + 2286439324, + 2125936390, + 2615781384, + 2418283124, + 2738037409, + 1877719337, + 987776868, + 360257678, + 2337725470, + 446615615, + 466757881, + 2541832958, + 2615550401, + 2654609760, + 1361101307, + 3071843137, + 3909891116, + 190222741, + 639699776, + 1024499460, + 2556418018, + 373717895, + 285013495, + 1212167752, + 955227312, + 1299200831, + 113072711, + 567001801, + 945836135, + 3766327401, + 3845800377, + 650637605, + 1006321034, + 540715055, + 1172818786, + 3094499619, + 2871696769, + 2229381635, + 1797948635, + 1568646842, + 1879237412, + 1901737541, + 1178465489, + 2441781555, + 1955727787, + 1602886313, + 830096818, + 4287316874, + 4117789355, + 1764761146, + 1510703180, + 888373825, + 664414317, + 736079442, + 2609555418, + 2973266640, + 2885918303, + 2323361545, + 2208429559, + 1218893938, + 2824695301, + 817620746, + 3061189495, + 929156923, + 2123907274, + 669473301, + 1790258024, + 1207062345, + 3024361136, + 652174054, + 76417327, + 1310445252, + 352503143, + 934223015, + 1621562783, + 3476301046, + 4122868015, + 3046150611, + 4073415821, + 1707347856, + 2800425216, + 2402774676, + 601634344, + 3498639405, + 2649634181, + 3487473905, + 55698949, + 162575114, + 2189462584, + 3472080519, + 3281238068, + 3270065889, + 4110089060, + 1690905680, + 502197549, + 1750228558, + 961423922, + 3128374346, + 1553464560, + 1829292737, + 1235862668, + 3103786125, + 1639207034, + 2997914782, + 3003377569, + 4142043800, + 1747646082, + 1130398883, + 1588783274, + 3034393377, + 845935096, + 1772557426, + 285117130, + 3599356417, + 951748836, + 167401782, + 2232533649, + 2617235044, + 1419933042, + 1167682084, + 975352262, + 2763495803, + 3197752252, + 595823803, + 1588578193, + 2386248761, + 909278640, + 2101377730, + 2230464958, + 2658465857, + 1856737334, + 1938906033, + 3208196788, + 4021819062, + 3059209342, + 3318207890, + 360746448, + 3917621322, + 3236100903, + 296789224, + 2249842948, + 3929462712, + 2575677650, + 549690566, + 2324183217, + 2053744197, + 300456291, + 4030910276, + 1531031183, + 1199942563, + 3368273367, + 3903749253, + 4019027165, + 3053922254, + 3313275572, + 2394356001, + 3651202796, + 1488615435, + 994226628, + 126516223, + 559229783, + 3475663403, + 3304525620, + 1192299199, + 2150786446, + 3670764732, + 907141600, + 4086631750, + 355798293, + 1152147427, + 1879318335, + 2972628879, + 2959490137, + 3844206035, + 3244219968, + 793806220, + 2722706088, + 1515673542, + 4051536956, + 3751106089, + 787433455, + 2843441801, + 3001751996, + 2498082185, + 2950098096, + 868210327, + 3008876163, + 3736120898, + 4129124263, + 3791295435, + 1225908477, + 2807908800, + 2322359676, + 4078221559, + 4205546036, + 1524741309, + 4181623492, + 1930648566, + 4221287542, + 3931404519, + 2667616959, + 3203700569, + 1300442555, + 3268750459, + 4181328053, + 2382233920, + 1208237172, + 992465201, + 1914341659, + 3941390068, + 633721245, + 1211212726, + 3124771761, + 935302151, + 2213884265, + 225187505, + 335369057, + 2291182927, + 1082819883, + 3797596869, + 785926618, + 3994512196, + 645756831, + 2536452562, + 2535773544, + 19422266, + 1534623135, + 1919597258, + 3647824875, + 3220254593, + 2092674806, + 2933366740, + 3232783605, + 1463788416, + 4129792300, + 1347917083, + 616337653, + 971517511, + 3751117470, + 3634717224, + 1015431361, + 322535990, + 916956096, + 10856968, + 3938099046, + 806270058, + 2697631769, + 4162389160, + 690999189, + 2029299242, + 2979638078, + 3141717583, + 2762710202, + 321539561, + 2307214718, + 3479818683, + 489385626, + 3520573785, + 4052845102, + 1242052248, + 1119832716, + 284811531, + 915100713, + 409154660, + 2339193171, + 1955212970, + 321649774, + 3473291350, + 2528076526, + 1598615383, + 2366233545, + 3437529181, + 1172475944, + 168593670, + 3768821155, + 1577379349, + 846618325, + 3914646998, + 3481908395, + 303923015, + 661610122, + 1146463691, + 947347606, + 573098707, + 783396346, + 310215130, + 1977049777, + 1995193354, + 1958422623, + 2826249184, + 2557291839, + 950748899, + 395966525, + 3860839865, + 80399346, + 3897710391, + 725605890, + 3336520816, + 2201986974, + 2028982805, + 4117998154, + 2029461714, + 475649478, + 2465581478, + 2090661781, + 3535920120, + 1440181203, + 2436642781, + 1094214781, + 298503410, + 3027964230, + 2912046803, + 3012909854, + 215072740, + 3343986902, + 4255017014, + 3031592049, + 1966271775, + 1637051653, + 2789186464, + 4034680367, + 2900190419, + 977762285, + 1492081250, + 1117859629, + 1755776286, + 1024800754, + 788188145, + 1792230435, + 3652473591, + 1189966401, + 2393621852, + 937195189, + 490467714, + 644462681, + 930506127, + 1181373165, + 474095835, + 124252446, + 1652553947, + 3191483012, + 2538473890, + 3954782085, + 429825274, + 3574446097, + 741675659, + 3983454991, + 103396093, + 640016854, + 1757341459, + 1270267843, + 2887378018, + 3374766290, + 3909627483, + 3818126396, + 4233499969, + 3202206629, + 2670375748, + 4279538794, + 1566167810, + 935143423, + 3717651154, + 1232649622, + 1541731605, + 3924509581, + 1811318147, + 2317137999, + 1224824969, + 2201280352, + 325909791, + 1326922510, + 3919590461, + 286162215, + 1907635281, + 3393818387, + 3955224248, + 190157757, + 2757057545, + 1922656595, + 1845878384, + 2179708032, + 1429679824, + 4088461231, + 3560749398, + 675620570, + 1553544193, + 2350633124, + 863210099, + 3281660527, + 1358542741, + 2872542599, + 1740564189, + 2468224912, + 4058529679, + 3659873336, + 2610994523, + 1542385722, + 2017845272, + 1791629468, + 3590586116, + 2870590576, + 1459773997, + 2721673304, + 501610195, + 1359461088, + 3927361580, + 2785222679, + 2317916159, + 567024995, + 427231137, + 2778345163, + 479080445, + 3172969649, + 2936135808, + 1193710606, + 2656276331, + 880168811, + 675137805, + 3189626470, + 3465066112, + 3590177590, + 366736080, + 1657775671, + 2630118438, + 3342133219, + 904886842, + 1689196705, + 2685802422, + 3208201808, + 1184802612, + 1609897610, + 1917577106, + 3683439834, + 2730568816, + 1837974470, + 3975279578, + 3531848515, + 3098263490, + 689132741, + 1810247155, + 3974088536, + 2161673845, + 3885678582, + 2464350113, + 4285239294, + 1640710643, + 42170838, + 2692693178, + 2943081825, + 2656421707, + 584224139, + 4276486169, + 1950338131, + 324817692, + 3346079822, + 690459060, + 679245968, + 1996679211, + 2967149736, + 766071454, + 1417014656, + 4099262287, + 1592833825, + 2330778580, + 2143195828, + 473761956, + 3134982278, + 1768296918, + 1945561404, + 3139216670, + 3386946096, + 3781908787, + 3993637428, + 2267412123, + 3543596396, + 3275513046, + 343385506, + 818740431, + 1236420821, + 4194217541, + 2340632596, + 3252608431, + 3880458796, + 933826995, + 93856070, + 352662772, + 1745782017, + 3859654403, + 2534561014, + 2542617947, + 3994687675, + 3084213245, + 3325797866, + 806264238, + 2787148863, + 1768489932, + 2393438980, + 4116519776, + 4222953479, + 1540051418, + 4194428883, + 1452915646, + 167773744, + 2082123163, + 2094811922, + 1887409807, + 1162655398, + 2825034497, + 1247808660, + 3158400767, + 3717520599, + 1879291103, + 2658015482, + 1518866144, + 2185728119, + 1487639246, + 3481767175, + 377909933, + 3734722969, + 3865880338, + 1735305725, + 3713504566, + 3132247484, + 2863292071, + 2180225700, + 3898417347, + 3045930494, + 2791861629, + 1045217145, + 674566226, + 888905636, + 651294005, + 3315988285, + 926625456, + 2908128517, + 177197793, + 1847612643, + 828559131, + 4239611910, + 4001973680, + 1847386231, + 1744489111, + 2922546132, + 909174462, + 44554394, + 188383800, + 974680046, + 4288576670, + 1064602131, + 2279863712, + 1218831272, + 623534157, + 219235974, + 63933746, + 3283800499, + 1234970039, + 2948584468, + 2415808667, + 3815162584, + 2839463331, + 2692935680, + 107001696, + 2680781409, + 2852086378, + 3509486974, + 2314756428, + 1647781531, + 625031887, + 101533673, + 2813360263, + 3362463056, + 3690168712, + 1543840484, + 3866614920, + 100977743, + 3224692571, + 3587716917, + 719158576, + 3213760217, + 2267688836, + 1441518779, + 3366693698, + 2548869751, + 531908796, + 2337564859, + 2824158778, + 3169848921, + 1227008373, + 2333581558, + 187965220, + 3366360069, + 2314970431, + 2576780722, + 2377332418, + 2814051621, + 2201444577, + 2002863843, + 1788827238, + 2277254101, + 612333999, + 1687580650, + 652292522, + 3495939668, + 115192919, + 850157594, + 2649115540, + 2678932449, + 3421560774, + 1476965394, + 3864108841, + 1782032582, + 3044795030, + 805504832, + 143825402, + 961777546, + 3635031474, + 1701285644, + 953286798, + 3233529297, + 1860747539, + 3756863448, + 4108876150, + 2208855372, + 4005207388, + 900400794, + 1915532082, + 1684465671, + 319113361, + 4040903373, + 3759509559, + 4203775049, + 1096839002, + 1348786453, + 2204513258, + 1005485791, + 1315093873, + 2278279237, + 1598385052, + 2127679663, + 1829010356, + 2131889929, + 2907075180, + 2890255513, + 3324859686, + 1855046205, + 118912031, + 948184906, + 3964956533, + 1478027161, + 2825110099, + 1389450030, + 1687228638, + 3289118469, + 2913305132, + 259944683, + 943408944, + 1655114943, + 315198871, + 769313256, + 2031831413, + 1936990884, + 2557307662, + 4049060851, + 1261705352, + 1690095579, + 3488156286, + 2325058543, + 4280618703, + 3787923262, + 4235475449, + 3422644095, + 1351439644, + 4010137115, + 1275314927, + 2756556316, + 1215878837, + 3564222603, + 2603036605, + 3389921249, + 2303801524, + 2539533026, + 1987127069, + 636962867, + 3451101807, + 3660370970, + 3933825336, + 811975671, + 3211258049, + 1758497297, + 631092897, + 1477942792, + 3780342588, + 1394468549, + 3884013640, + 2210783243, + 4284047688, + 2954793628, + 4057802457, + 3875411103, + 4173101169, + 2374868773, + 1138961071, + 4017496654, + 1748121193, + 324398967, + 3388413395, + 1421451971, + 2003520265, + 1938421608, + 502843030, + 4092269305, + 3124906436, + 1312677649, + 3963884786, + 3078964370, + 1415486200, + 1780461017, + 897543350, + 2531473933, + 3018614336, + 1082815198, + 4001984174, + 498150626, + 1620378597, + 1216275400, + 2346327537, + 1720984119, + 1603311953, + 3964902652, + 3490550532, + 3531834976, + 3789815299, + 2891278014, + 353012863, + 4210071255, + 3985612050, + 146549384, + 546083712, + 2665789869, + 4170752780, + 2789229305, + 2928540583, + 574353420, + 1213296416, + 3025553612, + 2897419785, + 3193639868, + 3807290657, + 2136142430, + 39898038, + 1043183000, + 96570653, + 313256292, + 2585059215, + 2949800110, + 529046663, + 2948064675, + 2703653258, + 14715708, + 3540100599, + 2652446921, + 3592494708, + 2325281413, + 3090026293, + 2942030507, + 3968648401, + 2503924302, + 2281103899, + 2660427136, + 1118473225, + 1509239795, + 2916996628, + 1498829399, + 2051980638, + 250189510, + 3665182738, + 2909572017, + 2294626724, + 2944239685, + 483810678, + 3703858386, + 2849742196, + 99440910, + 711375634, + 3240712659, + 865658149, + 3792964781, + 1140491837, + 1251010297, + 3972777473, + 149040667, + 3855208360, + 1713592937, + 3642530555, + 3295259754, + 136750651, + 1141650259, + 2553821287, + 2566573637, + 215217613, + 2521251384, + 2461194399, + 277826294, + 2998894813, + 3856313510, + 532725319, + 725275605, + 4121938584, + 2701056095, + 1739249781, + 4116099911, + 546954893, + 2671031054, + 3563388643, + 2077602340, + 354965386, + 3921478300, + 2200138043, + 2437362948, + 4233937299, + 561596964, + 2541518481, + 4282970928, + 932070805, + 2088114127, + 49855829, + 3540598765, + 715968672, + 1669139490, + 3450921952, + 2093995498, + 2528122568, + 356900943, + 3561549751, + 3860645626, + 4278347634, + 3783282303, + 2307265668, + 3473752346, + 1425883108, + 3219963916, + 1871354316, + 1006991143, + 2780202806, + 408451724, + 3518660655, + 2577965261, + 3776366633, + 2153658887, + 3064676915, + 1472411661, + 3381444379, + 3471573930, + 683224598, + 297910753, + 1948251965, + 1074723293, + 1042462107, + 2565100294, + 3959558256, + 3498782050, + 1245136335, + 1108074338, + 3567181330, + 1470821109, + 2517217388, + 3573560226, + 872355339, + 3641166732, + 4202604380, + 2863743216, + 1057862214, + 1168505870, + 2333146369, + 2470306042, + 3050274126, + 3706189024, + 1028326631, + 790821590, + 2353647980, + 3373651915, + 2717862373, + 3998954743, + 3724768038, + 2358681986, + 903774704, + 1086586964, + 2947052542, + 504148263, + 3005589490, + 130885957, + 2413604153, + 151980225, + 1646237670, + 2651453945, + 1702301299, + 3312733864, + 1419466054, + 2041837868, + 845829503, + 3184621255, + 236708439, + 1251305657, + 3440133121, + 2698248930, + 752241551, + 3906730939, + 3704664012, + 492234664, + 118829662, + 755123511, + 1226340698, + 360667305, + 3870699347, + 2670210156, + 3790151528, + 3398951072, + 3871562686, + 2885299933, + 1163048785, + 1581139430, + 2060136262, + 3845596685, + 721716356, + 2415917204, + 277894297, + 646770419, + 4241803829, + 2447147916, + 1830681938, + 1453659338, + 990668897, + 782328303, + 4050323257, + 893917030, + 2105619467, + 175326207, + 3554983482, + 3795672942, + 1732262058, + 4286295284, + 255546973, + 101929446, + 1541699869, + 3542673008, + 3031964519, + 143176475, + 906673315, + 1848847881, + 3701458370, + 1427035213, + 535234003, + 3249784714, + 525907046, + 1677057476, + 2778637625, + 689646222, + 3093619347, + 1818164008, + 3263377062, + 3879936856, + 3872931423, + 2002981419, + 2392535685, + 311442981, + 4061383417, + 2455913274, + 2779048399, + 2057044603, + 246641626, + 2044634518, + 2544006187, + 2072255130, + 1762484515, + 1138624055, + 2262591804, + 549048021, + 1952213209, + 698152287, + 1384636385, + 2500587841, + 1114201165, + 2982983785, + 95202990, + 3436368293, + 3575909220, + 1988847427, + 900944131, + 2255494346, + 3497488883, + 1619001995, + 325384740, + 3852263081, + 2344454947, + 3683328218, + 1827261537, + 593467785, + 2780478959, + 2216479377, + 3425383091, + 2641892674, + 3903857519, + 646603790, + 3776413739, + 3231496098, + 2942430316, + 65150637, + 881406526, + 2882663967, + 3535986503, + 3678450784, + 2875897712, + 1799978064, + 2411339001, + 3561758130, + 782528670, + 1730147867, + 2528914544, + 1031394620, + 2173121799, + 189974695, + 1998905845, + 280188656, + 777006715, + 1423232349, + 541680116, + 3128059308, + 3607239891, + 836602210, + 3476859645, + 3578125381, + 3285983594, + 3269548870, + 1279748213, + 2334574455, + 3583415971, + 3353380428, + 3242338734, + 2325055944, + 2213015684, + 1788639779, + 958443329, + 3288231454, + 3244677861, + 492970971, + 3256559017, + 2314347723, + 1219941045, + 1006715209, + 3227681168, + 219262229, + 1936802399, + 3218238221, + 627237476, + 1900767827, + 342345854, + 1705769980, + 909994728, + 619654469, + 2425216015, + 212600556, + 3241568266, + 1266085150, + 1162371303, + 4294387021, + 1956725691, + 618869821, + 2881089325, + 948530607, + 3125525758, + 2623958872, + 3568527782, + 1828490046, + 1980242546, + 575194297, + 938093373, + 1694864398, + 1287826449, + 3314079234, + 531223275, + 1052129727, + 2623869546, + 72624645, + 3328309790, + 3730915676, + 1279936442, + 2149352317, + 2003971525, + 3806533014, + 1986061407, + 2761213799, + 2370685389, + 1521139712, + 2415964751, + 3465699085, + 2432144290, + 3030156672, + 2410927979, + 3237540686, + 3947761779, + 3495355467, + 1285234418, + 1790600212, + 3476142224, + 3491190344, + 973333457, + 1518394715, + 1117018987, + 2468687001, + 1240195040, + 137882277, + 157102449, + 3716968954, + 2428714146, + 543934764, + 166077684, + 489052569, + 1279721156, + 2153200327, + 3461044828, + 63946900, + 1365096392, + 2552893479, + 794896991, + 2335377221, + 671099825, + 1145195172, + 687340020, + 1550491666, + 2712888120, + 3573805979, + 1447244373, + 1517794916, + 3389046815, + 859355421, + 1056295574, + 3890870733, + 3066687706, + 1093093633, + 1080163513, + 2437620821, + 2710775082, + 4157562319, + 1501189467, + 2130533328, + 548114610, + 2596641652, + 3541729844, + 2037170669, + 951924758, + 2767812320, + 4092501050, + 64679078, + 1501356276, + 1688581027, + 1283840233, + 2937652571, + 4266308157, + 936909650, + 2730859700, + 1413644018, + 2267196757, + 610630908, + 417635653, + 2676607000, + 261284082, + 3697882036, + 3345745731, + 343489458, + 3810345069, + 3646045458, + 620870954, + 3749083323, + 4078308334, + 2765664860, + 1399839279, + 3996169331, + 1834429430, + 3523079114, + 3295894704, + 2983009288, + 566179992, + 1053238212, + 1893428679, + 2890017255, + 3392869989, + 3105727089, + 550579624, + 1667665588, + 3233665689, + 3843433797, + 2103147383, + 2000835586, + 863932286, + 806295024, + 2223040395, + 4288347618, + 25114206, + 2154413579, + 3847716729, + 1067391025, + 4027778052, + 4056024079, + 1781823515, + 1010635730, + 1775748942, + 1567552448, + 236193276, + 1434184942, + 3062415128, + 3748555998, + 130495897, + 2939903645, + 1666752237, + 1066079401, + 1836449980, + 2195830749, + 3066331783, + 1897175879, + 2066200759, + 1973030862, + 294293913, + 98782574, + 4171791321, + 2208092313, + 2192004127, + 2531215340, + 1140349081, + 2776662426, + 1070173060, + 990721685, + 4183076842, + 2402194877, + 2760059174, + 658432629, + 3039901836, + 2830977567, + 1258192132, + 660194628, + 3722290277, + 1178933882, + 1459226687, + 3524102308, + 608197398, + 2178567665, + 3865121971, + 3803055188, + 3366269008, + 690378859, + 1164465180, + 3106017883, + 1047217157, + 3636325886, + 2378086560, + 1515916640, + 330457038, + 1094384941, + 2588260058, + 875067177, + 3482598787, + 496182764, + 286445040, + 2809317084, + 1777706171, + 4006769194, + 1079383541, + 2881585299, + 4178878364, + 878246596, + 1100855732, + 2110896399, + 2092027191, + 570896878, + 3913905127, + 49760796, + 2429561431, + 2268836631, + 3506046240, + 2859849814, + 893590893, + 3687412917, + 2406418879, + 2041532338, + 3316860343, + 2432632598, + 659382823, + 50227008, + 851367658, + 1108280326, + 3374139562, + 170587855, + 393366010, + 3046749017, + 1115479745, + 3925029814, + 978009027, + 2025902925, + 3918745565, + 2481300052, + 951837001, + 4044134593, + 4146137483, + 691481183, + 230022390, + 54751410, + 1895877866, + 261978262, + 2167645091, + 1570701164, + 3044599517, + 1065958287, + 3642959952, + 411777284, + 2225324033, + 2464820913, + 1315183114, + 1513631506, + 2353509916, + 1998383785, + 706743104, + 2348303970, + 1547200335, + 2968469298, + 4039179245, + 4191948814, + 1763233687, + 833029308, + 3841460003, + 2142617813, + 2521113856, + 159237655, + 544757793, + 1083580450, + 3964056914, + 1590767682, + 3978432327, + 3835200177, + 813428668, + 23505040, + 2758482008, + 3598792951, + 212206391, + 2530199324, + 3839157387, + 1048871517, + 742601867, + 4149697417, + 566913118, + 2102453533, + 4264989263, + 3861808018, + 1956969307, + 2389700986, + 1154473069, + 851631200, + 1538857364, + 1807411794, + 3042015886, + 3901545715, + 3589121135, + 1282964556, + 2857849662, + 2929889640, + 3020590289, + 3587195608, + 1326045962, + 1986820899, + 1134786750, + 385604982, + 4266813219, + 2751475804, + 4086822944, + 1877876527, + 223830081, + 4189366982, + 3916126198, + 3675859636, + 4094469726, + 423319180, + 285547675, + 2939210674, + 2961027358, + 2928063646, + 1304577715, + 707971210, + 3235182930, + 621361545, + 2156904189, + 3635704892, + 406005925, + 1053905739, + 1526470805, + 178754325, + 4022623727, + 4045068563, + 2973963440, + 2605716848, + 3617255047, + 4245368991, + 3381788483, + 4119953112, + 288636635, + 2919552050, + 2642572636, + 4171623315, + 2094329492, + 4155362501, + 3967558684, + 3848065971, + 2560015200, + 1817744012, + 3588670878, + 1777801347, + 1993928043, + 3456261955, + ]; + + static final String privateKeyFCM = String.fromCharCodes(List.generate( + _envieddataprivateKeyFCM.length, + (int i) => i, + growable: false, + ).map((int i) => _envieddataprivateKeyFCM[i] ^ _enviedkeyprivateKeyFCM[i])); + + static const List _enviedkeyseferAlexandriaServer = [ + 2654150368, + 652312410, + 3033059659, + 1610504043, + 3377493226, + 3230467198, + 539631457, + 3912676855, + 2173833701, + 4034158291, + 2214053461, + 3701371445, + 2684579137, + 515623541, + 2408717463, + 3669221601, + 997304084, + 1173473874, + 3132018834, + 1267973792, + 1326338115, + 2296599442, + 2509993205, + 3301306439, + 3897714319, + 2288591951, + 2972732752, + 938780309, + 2104384141, + 2703089493, + 2549088233, + 1686241929, + 4033207894, + 3325589798, + ]; + + static const List _envieddataseferAlexandriaServer = [ + 2654150280, + 652312366, + 3033059647, + 1610503963, + 3377493145, + 3230467140, + 539631438, + 3912676824, + 2173833622, + 4034158262, + 2214053427, + 3701371472, + 2684579123, + 515623444, + 2408717563, + 3669221508, + 997304172, + 1173473843, + 3132018940, + 1267973828, + 1326338097, + 2296599547, + 2509993108, + 3301306473, + 3897714428, + 2288591910, + 2972732708, + 938780400, + 2104384162, + 2703089446, + 2549088140, + 1686242031, + 4033207859, + 3325589844, + ]; + + static final String seferAlexandriaServer = String.fromCharCodes( + List.generate( + _envieddataseferAlexandriaServer.length, + (int i) => i, + growable: false, + ).map((int i) => + _envieddataseferAlexandriaServer[i] ^ + _enviedkeyseferAlexandriaServer[i])); + + static const List _enviedkeyseferPaymentServer = [ + 1776774567, + 2149067662, + 1809830410, + 2789725058, + 1775776365, + 2073422508, + 2202800920, + 1272175257, + 1581809136, + 3259550986, + 992951527, + 1020140755, + 2421472244, + 2812917427, + 339058327, + 202161431, + 1680544989, + 1316334847, + 433030682, + 3784352865, + 4264062086, + 1038507241, + 2355747859, + 1059753186, + 828934416, + 2301641593, + ]; + + static const List _envieddataseferPaymentServer = [ + 1776774607, + 2149067770, + 1809830526, + 2789725170, + 1775776286, + 2073422486, + 2202800951, + 1272175286, + 1581809027, + 3259551087, + 992951425, + 1020140726, + 2421472134, + 2812917443, + 339058400, + 202161465, + 1680544942, + 1316334743, + 433030773, + 3784352785, + 4264062121, + 1038507162, + 2355747958, + 1059753092, + 828934517, + 2301641483, + ]; + + static final String seferPaymentServer = String.fromCharCodes( + List.generate( + _envieddataseferPaymentServer.length, + (int i) => i, + growable: false, + ).map((int i) => + _envieddataseferPaymentServer[i] ^ _enviedkeyseferPaymentServer[i])); + + static const List _enviedkeyseferCairoServer = [ + 3037014515, + 3401018697, + 2521685488, + 2057073068, + 1319223786, + 1841552061, + 1493063679, + 3267255035, + 1082012524, + 2186402324, + 3254694991, + 1804139814, + 2490908, + 2578890551, + 1716850823, + 1298390919, + 3584414356, + 944610289, + 3728858927, + 2399884436, + 4021688822, + 2674818517, + 989142193, + 4293538974, + 2444833988, + 2342983077, + 1039840713, + 67394236, + 3106635908, + 1577319871, + 915423197, + 3673301939, + 2530094775, + 742686136, + 2085734280, + 1195359313, + 3551368912, + 2833392755, + 2355936383, + 1524261146, + 2711713960, + 2786895804, + 3763350038, + ]; + + static const List _envieddataseferCairoServer = [ + 3037014427, + 3401018685, + 2521685380, + 2057073116, + 1319223705, + 1841552007, + 1493063632, + 3267254996, + 1082012447, + 2186402417, + 3254694973, + 1804139856, + 2491001, + 2578890565, + 1716850857, + 1298391028, + 3584414449, + 944610199, + 3728858954, + 2399884518, + 4021688792, + 2674818489, + 989142232, + 4293539048, + 2444833953, + 2342983050, + 1039840698, + 67394265, + 3106636002, + 1577319898, + 915423151, + 3673301917, + 2530094804, + 742686164, + 2085734369, + 1195359282, + 3551368891, + 2833392732, + 2355936268, + 1524261247, + 2711713998, + 2786895833, + 3763350116, + ]; + + static final String seferCairoServer = String.fromCharCodes( + List.generate( + _envieddataseferCairoServer.length, + (int i) => i, + growable: false, + ).map((int i) => + _envieddataseferCairoServer[i] ^ _enviedkeyseferCairoServer[i])); + + static const List _enviedkeyseferGizaServer = [ + 563807450, + 2957092207, + 1807568779, + 720103747, + 2111426609, + 3058635739, + 2743279385, + 1105116588, + 4171114341, + 185600609, + 2740539057, + 653512961, + 244459511, + 736132106, + 3516614822, + 172380685, + 3554504015, + 3311002153, + 2032618354, + 356718593, + 678332684, + 3534826055, + 3016886933, + 4005242305, + 1857977275, + 1277270964, + 3630546863, + 1025138140, + 4198144210, + 2935184133, + ]; + + static const List _envieddataseferGizaServer = [ + 563807410, + 2957092123, + 1807568895, + 720103731, + 2111426626, + 3058635745, + 2743279414, + 1105116547, + 4171114242, + 185600520, + 2740539083, + 653513056, + 244459396, + 736132207, + 3516614848, + 172380776, + 3554503997, + 3311002119, + 2032618269, + 356718703, + 678332768, + 3534826030, + 3016887035, + 4005242276, + 1857977236, + 1277270983, + 3630546890, + 1025138106, + 4198144183, + 2935184247, + ]; + + static final String seferGizaServer = String.fromCharCodes(List.generate( + _envieddataseferGizaServer.length, + (int i) => i, + growable: false, + ).map( + (int i) => _envieddataseferGizaServer[i] ^ _enviedkeyseferGizaServer[i])); + + static const List _enviedkeychatGPTkeySeferNew = [ + 2942027772, + 1467737596, + 24904215, + 4060452451, + 3926690586, + 1925768892, + 1329086755, + 1672615337, + 711689142, + 1019802605, + 723553255, + 226192337, + 3947509260, + 3600215425, + 3895628094, + 1317840637, + 2785260870, + 3242362388, + 3541650300, + 4065825499, + 1144481481, + 3293810059, + 4160722696, + 3109374342, + 326065697, + 2194188025, + 3999877283, + 2345374912, + 2221483605, + 3844049753, + 2702603544, + 1846890885, + 1695611418, + 2255738782, + 726863915, + 3763551667, + 192253223, + 3756181334, + 2765669049, + 719943936, + 4033539025, + 1931930950, + 2215699355, + 3406115282, + 3217359826, + 3573335111, + 3670649820, + 2781870398, + 565904096, + 3619395967, + 2287478331, + 3882763918, + 1372486294, + 719195308, + 3606632676, + 3674593970, + 4020513241, + 3217251709, + ]; + + static const List _envieddatachatGPTkeySeferNew = [ + 2942027654, + 1467737499, + 24904250, + 4060452409, + 3926690606, + 1925768915, + 1329086818, + 1672615395, + 711689173, + 1019802540, + 723553205, + 226192286, + 3947509355, + 3600215503, + 3895628134, + 1317840535, + 2785260833, + 3242362470, + 3541650233, + 4065825426, + 1144481436, + 3293810099, + 4160722798, + 3109374413, + 326065762, + 2194187968, + 3999877371, + 2345374898, + 2221483565, + 3844049726, + 2702603597, + 1846890944, + 1695611438, + 2255738831, + 726863967, + 3763551681, + 192253269, + 3756181306, + 2765669064, + 719943985, + 4033538984, + 1931930927, + 2215699438, + 3406115242, + 3217359842, + 3573335085, + 3670649744, + 2781870349, + 565904004, + 3619395894, + 2287478383, + 3882763997, + 1372486350, + 719195358, + 3606632636, + 3674594014, + 4020513179, + 3217251601, + ]; + + static final String chatGPTkeySeferNew = String.fromCharCodes( + List.generate( + _envieddatachatGPTkeySeferNew.length, + (int i) => i, + growable: false, + ).map((int i) => + _envieddatachatGPTkeySeferNew[i] ^ _enviedkeychatGPTkeySeferNew[i])); + + static const List _enviedkeycohere = [ + 2014105176, + 1971179719, + 3476881594, + 3441576985, + 2048220273, + 1570562316, + 3748027562, + 3424948666, + 815449160, + 2261320933, + 450774753, + 3588038017, + 2370228601, + 1060029870, + 2829514980, + 3157226137, + 4201379634, + 2525313817, + 278386330, + 2038112881, + 170404028, + 2061802370, + 2409270447, + 1590516832, + 4260931604, + 318189294, + 2738755256, + 3489213281, + 195896715, + 1163781687, + 2527380875, + 2047412146, + 2729129036, + 1190196101, + 2356328596, + 854562155, + 1641396000, + 621333714, + 572079763, + 2826304618, + 2470698874, + 2754563601, + 1806221711, + 3176547718, + 2276879310, + 2626390559, + 1160402306, + ]; + + static const List _envieddatacohere = [ + 2014105113, + 1971179698, + 3476881622, + 3441577070, + 2048220181, + 1570562356, + 3748027603, + 3424948623, + 815449115, + 2261320885, + 450774710, + 3588038126, + 2370228490, + 1060029854, + 2829514892, + 3157226195, + 4201379674, + 2525313909, + 278386397, + 2038112833, + 170404040, + 2061802477, + 2409270522, + 1590516742, + 4260931628, + 318189193, + 2738755319, + 3489213193, + 195896798, + 1163781730, + 2527380985, + 2047412162, + 2729129002, + 1190196144, + 2356328645, + 854562137, + 1641396084, + 621333634, + 572079870, + 2826304572, + 2470698813, + 2754563657, + 1806221821, + 3176547806, + 2276879266, + 2626390621, + 1160402414, + ]; + + static final String cohere = String.fromCharCodes(List.generate( + _envieddatacohere.length, + (int i) => i, + growable: false, + ).map((int i) => _envieddatacohere[i] ^ _enviedkeycohere[i])); + + static const List _enviedkeyclaudeAiAPI = [ + 1976242300, + 2350860989, + 1948314595, + 901315685, + 2339033292, + 2360048022, + 3691158975, + 3674412142, + 2764946898, + 2183733768, + 4205748210, + 4011660736, + 312266345, + 2179067019, + 3591834986, + 1473488632, + 4141202701, + 2951700058, + 2025090710, + 2398865999, + 664501351, + 4190210615, + 1369532414, + 2942519646, + 1866759815, + 3679207556, + 637856172, + 4103589815, + 1362170158, + 1079976629, + 2013728745, + 3270521476, + 1291022480, + 355507478, + 2327588614, + 541057350, + 327271091, + 3259735263, + 3784713752, + 1723145924, + 1977372990, + 3309938444, + 83433960, + 1725118304, + 3003399073, + 3039187811, + 2226055004, + 2496658507, + 3672859933, + 1730906420, + 1948015722, + 1167701313, + 3813529681, + 1526372744, + 1237202131, + 3345691353, + 713251286, + 1794304080, + 3003020039, + 2578381984, + 720138540, + 3266418362, + 1345249225, + 1376117345, + 3887941391, + 1055208597, + 3284952823, + 4240595295, + 645506069, + 948439128, + 2801264061, + 2416846720, + 1043860477, + 3671807396, + 2926456821, + 1816175864, + 420960802, + 2273641446, + 1902996984, + 1109150420, + 797899585, + 3780404361, + 1940999941, + 1142672174, + 1448475072, + 2118083302, + 410131060, + 3512277805, + 656473126, + 2858145578, + 500386356, + 794216106, + 81742423, + 654115046, + 3841530927, + 1637487100, + 1775591497, + 718264352, + 1366125446, + 2139467799, + 1308528586, + 3577255479, + 3819768787, + 3973168182, + 469581459, + 2694673816, + 3893292905, + 3241284847, + 1060207043, + 2679424359, + 1620011386, + 1679076475, + 3092502735, + 476085106, + 3600159506, + ]; + + static const List _envieddataclaudeAiAPI = [ + 1976242182, + 2350861018, + 1948314574, + 901315604, + 2339033262, + 2360048117, + 3691158930, + 3674412063, + 2764946852, + 2183733863, + 4205748161, + 4011660793, + 312266245, + 2179067046, + 3591834898, + 1473488559, + 4141202754, + 2951700002, + 2025090783, + 2398865928, + 664501264, + 4190210656, + 1369532330, + 2942519569, + 1866759933, + 3679207623, + 637856234, + 4103589877, + 1362170176, + 1079976700, + 2013728688, + 3270521559, + 1291022555, + 355507549, + 2327588718, + 541057312, + 327271114, + 3259735205, + 3784713799, + 1723145871, + 1977373032, + 3309938509, + 83433886, + 1725118226, + 3003399145, + 3039187790, + 2226055018, + 2496658452, + 3672859945, + 1730906478, + 1948015663, + 1167701259, + 3813529629, + 1526372798, + 1237202155, + 3345691294, + 713251209, + 1794304001, + 3003020101, + 2578382056, + 720138526, + 3266418316, + 1345249190, + 1376117252, + 3887941467, + 1055208666, + 3284952762, + 4240595218, + 645506170, + 948439049, + 2801264072, + 2416846823, + 1043860420, + 3671807471, + 2926456704, + 1816175799, + 420960840, + 2273641356, + 1902996915, + 1109150343, + 797899537, + 3780404438, + 1941000004, + 1142672154, + 1448475027, + 2118083285, + 410130983, + 3512277880, + 656473186, + 2858145606, + 500386390, + 794216146, + 81742341, + 654115039, + 3841530955, + 1637486985, + 1775591455, + 718264410, + 1366125545, + 2139467846, + 1308528615, + 3577255546, + 3819768760, + 3973168238, + 469581516, + 2694673869, + 3893292856, + 3241284798, + 1060206994, + 2679424319, + 1620011272, + 1679076387, + 3092502691, + 476085040, + 3600159614, + ]; + + static final String claudeAiAPI = String.fromCharCodes(List.generate( + _envieddataclaudeAiAPI.length, + (int i) => i, + growable: false, + ).map((int i) => _envieddataclaudeAiAPI[i] ^ _enviedkeyclaudeAiAPI[i])); + + static const List _enviedkeypayPalClientId = [ + 2476786781, + 4014693165, + 3016597110, + 3521329147, + 917866109, + 998982029, + 2820406004, + 4154706307, + 2151387119, + 698043501, + 3670396520, + 3642289396, + 2778097778, + 119585277, + 123745559, + 1190472330, + 3762317744, + 1488801400, + 3137260930, + 1542744309, + 1005665600, + 1956779357, + 2183688589, + 3194451229, + 3263325754, + 2510490090, + 3370290877, + 3415607274, + 186881535, + 40849698, + 1026476553, + 3889126068, + 1041768698, + 1247903786, + 1017853683, + 3435707830, + 2500060887, + 2445195193, + 4092570895, + 3751351038, + 104730130, + 261292034, + 1515131265, + 3995354676, + 2795885149, + 3203165557, + 3591935360, + 993015290, + 2022651398, + 1347855195, + 935063536, + 2812247529, + 2993499764, + 200161191, + 2516170372, + 1750346702, + 162833907, + 2892925394, + 1115128014, + 1758309517, + 3028295932, + 296344024, + 1211151468, + 1899114679, + 1519592972, + 330264452, + 1746180507, + 3165975966, + 2097529050, + 4033089560, + 1696835036, + 1224468976, + 472892137, + 255141035, + 41688744, + 1876886146, + 710716550, + 1395003612, + 3285813446, + 28950399, + 3402765696, + 1480958771, + 3397946180, + 3319594768, + 520101544, + 3085615752, + 722474734, + ]; + + static const List _envieddatapayPalClientId = [ + 2476786700, + 4014693228, + 3016597050, + 3521329026, + 917866000, + 998982113, + 2820405906, + 4154706381, + 2151387046, + 698043480, + 3670396476, + 3642289294, + 2778097670, + 119585225, + 123745636, + 1190472359, + 3762317769, + 1488801291, + 3137261037, + 1542744207, + 1005665654, + 1956779307, + 2183688649, + 3194451241, + 3263325797, + 2510489988, + 3370290892, + 3415607218, + 186881487, + 40849777, + 1026476636, + 3889126080, + 1041768593, + 1247903849, + 1017853612, + 3435707847, + 2500060814, + 2445195247, + 4092570914, + 3751350955, + 104730229, + 261292137, + 1515131316, + 3995354707, + 2795885116, + 3203165496, + 3591935455, + 993015234, + 2022651484, + 1347855222, + 935063451, + 2812247438, + 2993499712, + 200161259, + 2516170417, + 1750346749, + 162833816, + 2892925418, + 1115127963, + 1758309624, + 3028295812, + 296343943, + 1211151448, + 1899114717, + 1519593033, + 330264531, + 1746180547, + 3165976026, + 2097529009, + 4033089622, + 1696834988, + 1224468904, + 472892078, + 255141112, + 41688831, + 1876886226, + 710716662, + 1395003541, + 3285813436, + 28950331, + 3402765766, + 1480958827, + 3397946166, + 3319594824, + 520101572, + 3085615818, + 722474626, + ]; + + static final String payPalClientId = String.fromCharCodes(List.generate( + _envieddatapayPalClientId.length, + (int i) => i, + growable: false, + ).map((int i) => _envieddatapayPalClientId[i] ^ _enviedkeypayPalClientId[i])); + + static const List _enviedkeypayPalSecret = [ + 3679868868, + 4230330265, + 3731340233, + 3596721338, + 2442502922, + 4232120925, + 2060828479, + 2808619715, + 2177100380, + 450425303, + 3170153494, + 2803706414, + 1798490761, + 1312454280, + 4113883695, + 1067605777, + 564224026, + 2801860216, + 857771083, + 2790393231, + 2171610767, + 4238876910, + 1155706091, + 2650496878, + 3325833725, + 3239465520, + 1738337104, + 2670980668, + 825388214, + 3388222342, + 1670678356, + 2611839979, + 1795020979, + 2378247172, + 2401357470, + 98620229, + 4160519300, + 3569011304, + 3241721136, + 2426239793, + 575189599, + 1521175128, + 3727620202, + 3714504822, + 1798413547, + 4020419410, + 951369407, + 4055425019, + 2294318042, + 1226646307, + 875691666, + 2265405758, + 329573838, + 3106858063, + 3643758242, + 1916070058, + 3242595505, + 1045180999, + 1787644947, + 534134737, + 802648100, + 3069762536, + 283443821, + 4056372299, + 1078338267, + 1334682567, + 621454632, + 2274587818, + 1545122753, + 2002995202, + 1002065343, + 394535479, + 2159446929, + 1448170518, + 2416868506, + 2088985569, + 2163377888, + 291200360, + 1564012364, + 1533087127, + 3803261918, + 1469347809, + 309529701, + 2900761794, + 3899263893, + 3129339814, + ]; + + static const List _envieddatapayPalSecret = [ + 3679868814, + 4230330331, + 3731340168, + 3596721403, + 2442503036, + 4232120876, + 2060828533, + 2808619666, + 2177100315, + 450425218, + 3170153573, + 2803706469, + 1798490829, + 1312454328, + 4113883765, + 1067605883, + 564224114, + 2801860172, + 857771008, + 2790393317, + 2171610858, + 4238876813, + 1155706001, + 2650496790, + 3325833627, + 3239465586, + 1738337046, + 2670980676, + 825388187, + 3388222389, + 1670678380, + 2611839928, + 1795021015, + 2378247272, + 2401357564, + 98620172, + 4160519383, + 3569011293, + 3241721094, + 2426239847, + 575189517, + 1521175061, + 3727620178, + 3714504760, + 1798413487, + 4020419380, + 951369434, + 4055424973, + 2294318007, + 1226646345, + 875691743, + 2265405787, + 329573780, + 3106857989, + 3643758282, + 1916070116, + 3242595581, + 1045180941, + 1787645046, + 534134714, + 802648081, + 3069762480, + 283443722, + 4056372250, + 1078338200, + 1334682550, + 621454691, + 2274587881, + 1545122697, + 2002995318, + 1002065389, + 394535505, + 2159446951, + 1448170587, + 2416868592, + 2088985523, + 2163377817, + 291200325, + 1564012330, + 1533087151, + 3803261830, + 1469347731, + 309529661, + 2900761774, + 3899263959, + 3129339850, + ]; + + static final String payPalSecret = String.fromCharCodes(List.generate( + _envieddatapayPalSecret.length, + (int i) => i, + growable: false, + ).map((int i) => _envieddatapayPalSecret[i] ^ _enviedkeypayPalSecret[i])); + + static const List _enviedkeygeminiApi = [ + 946723327, + 309686077, + 1019769419, + 810956790, + 3898244439, + 3081730684, + 3320601090, + 1741158444, + 2095666836, + 4253754882, + 1473996156, + 3730223337, + 744153826, + 2706606134, + 2802882217, + 974714029, + 2670398152, + 3488256992, + 2185769990, + 1247165256, + 963059836, + 2257048206, + 3849835851, + 921884482, + 3381723660, + 2953464770, + 3237496349, + 367321660, + 3978447150, + 2622825839, + 4269044634, + 551421524, + 2061487504, + 3556026697, + 3239683487, + 2637149925, + 1933281223, + 206017631, + 2024544384, + 2556741302, + 1038103247, + 3782334349, + 83678693, + 3568395937, + 2902583269, + 1875942636, + ]; + + static const List _envieddatageminiApi = [ + 946723246, + 309686130, + 1019769382, + 810956679, + 3898244365, + 3081730575, + 3320601171, + 1741158517, + 2095666937, + 4253754930, + 1473996100, + 3730223263, + 744153742, + 2706606201, + 2802882264, + 974714055, + 2670398081, + 3488256983, + 2185770093, + 1247165220, + 963059754, + 2257048260, + 3849835821, + 921884468, + 3381723740, + 2953464822, + 3237496394, + 367321726, + 3978447208, + 2622825770, + 4269044725, + 551421489, + 2061487613, + 3556026659, + 3239683576, + 2637149852, + 1933281268, + 206017638, + 2024544438, + 2556741343, + 1038103191, + 3782334463, + 83678653, + 3568395981, + 2902583207, + 1875942528, + ]; + + static final String geminiApi = String.fromCharCodes(List.generate( + _envieddatageminiApi.length, + (int i) => i, + growable: false, + ).map((int i) => _envieddatageminiApi[i] ^ _enviedkeygeminiApi[i])); + + static const List _enviedkeygeminiApiMasa = [ + 192192107, + 1332470588, + 486570927, + 1793012577, + 3850691592, + 1283550055, + 733294112, + 303982693, + 3660699771, + 605725619, + 1523964095, + 890716742, + 845787167, + 3786106691, + 3771038632, + 1212784769, + 2295890622, + 2923901151, + 372307924, + 797895158, + 72071507, + 2567081554, + 616796441, + 3898205818, + 2403483824, + 3495366850, + 1564059516, + 3875704500, + 286364606, + 1903938315, + 3076095114, + 1480543516, + 3609941373, + 2601963854, + 2591778684, + 337564517, + 2782218863, + 3384292359, + 2139221735, + 854884682, + 522036826, + 2365053644, + 3696587941, + 1589103048, + 1430021317, + 911669587, + ]; + + static const List _envieddatageminiApiMasa = [ + 192192058, + 1332470643, + 486570946, + 1793012496, + 3850691666, + 1283549972, + 733294193, + 303982636, + 3660699659, + 605725655, + 1523964146, + 890716786, + 845787229, + 3786106641, + 3771038683, + 1212784842, + 2295890643, + 2923901118, + 372307856, + 797895100, + 72071452, + 2567081474, + 616796462, + 3898205726, + 2403483882, + 3495366834, + 1564059465, + 3875704473, + 286364637, + 1903938365, + 3076095172, + 1480543563, + 3609941275, + 2601963821, + 2591778580, + 337564498, + 2782218815, + 3384292422, + 2139221643, + 854884635, + 522036738, + 2365053630, + 3696588029, + 1589103012, + 1430021255, + 911669567, + ]; + + static final String geminiApiMasa = String.fromCharCodes(List.generate( + _envieddatageminiApiMasa.length, + (int i) => i, + growable: false, + ).map((int i) => _envieddatageminiApiMasa[i] ^ _enviedkeygeminiApiMasa[i])); + + static const List _enviedkeyagoraAppId = [ + 2574000284, + 656142299, + 3586154678, + 543351328, + 967765405, + 2900149675, + 97184039, + 3788854222, + 3600725441, + 2749153498, + 1689536204, + 1097064774, + 3351205091, + 3428084667, + 3270673249, + 3365310137, + 3996306068, + 3861901703, + 476717600, + 4052607519, + 187551657, + 3543455146, + 1528929436, + 3773307748, + 4012526234, + 2750964947, + 1738978991, + 3031770431, + 1415657877, + 2498493431, + 3334871059, + 495917381, + 1501702692, + 3166594245, + 3174529007, + 339994790, + 544275537, + 1395276684, + 1425823463, + ]; + + static const List _envieddataagoraAppId = [ + 2574000299, + 656142314, + 3586154638, + 543351320, + 967765421, + 2900149709, + 97184021, + 3788854180, + 3600725495, + 2749153513, + 1689536250, + 1097064745, + 3351205078, + 3428084619, + 3270673240, + 3365310163, + 3996306086, + 3861901747, + 476717657, + 4052607530, + 187551643, + 3543455123, + 1528929448, + 3773307728, + 4012526242, + 2750964963, + 1738979030, + 3031770380, + 1415657893, + 2498493314, + 3334871083, + 495917425, + 1501702684, + 3166594205, + 3174528925, + 339994878, + 544275517, + 1395276750, + 1425823371, + ]; + + static final String agoraAppId = String.fromCharCodes(List.generate( + _envieddataagoraAppId.length, + (int i) => i, + growable: false, + ).map((int i) => _envieddataagoraAppId[i] ^ _enviedkeyagoraAppId[i])); + + static const List _enviedkeyagoraAppCertificate = [ + 2747481220, + 3248115095, + 1515394224, + 4078506219, + 3489222251, + 3440482103, + 4007632268, + 3706000627, + 1764213956, + 976642986, + 3058362642, + 1434520794, + 2417053802, + 2629168397, + 1640697280, + 3913076297, + 392059644, + 1393184090, + 3249459517, + 666795503, + 4204586178, + 389625446, + 430987858, + 3032651353, + 2511150507, + 3927144955, + 3051400642, + 570155389, + 974582377, + 161114738, + 2857665926, + 87022798, + 2060917783, + 1169014335, + 2167766261, + 3704888452, + 733973351, + 2450280885, + 3014833615, + 3148355083, + ]; + + static const List _envieddataagoraAppCertificate = [ + 2747481326, + 3248115110, + 1515394183, + 4078506138, + 3489222226, + 3440482051, + 4007632312, + 3706000518, + 1764214000, + 976642963, + 3058362657, + 1434520803, + 2417053786, + 2629168487, + 1640697256, + 3913076280, + 392059595, + 1393184111, + 3249459461, + 666795418, + 4204586227, + 389625424, + 430987878, + 3032651360, + 2511150495, + 3927144911, + 3051400698, + 570155276, + 974582363, + 161114635, + 2857665968, + 87022774, + 2060917873, + 1169014346, + 2167766189, + 3704888566, + 733973311, + 2450280921, + 3014833549, + 3148355175, + ]; + + static final String agoraAppCertificate = String.fromCharCodes( + List.generate( + _envieddataagoraAppCertificate.length, + (int i) => i, + growable: false, + ).map((int i) => + _envieddataagoraAppCertificate[i] ^ + _enviedkeyagoraAppCertificate[i])); + + static const List _enviedkeypayPalClientIdLive = [ + 406733137, + 732595604, + 1507635706, + 1504380916, + 1787158654, + 2800455390, + 2732003059, + 3031157151, + 2669929136, + 3265016780, + 1056908558, + 3261172254, + 890628290, + 2286003341, + 3181140045, + 3190643593, + 4261979814, + 1575145434, + 3355157049, + 3836469070, + 2362058675, + 1985321101, + 502978218, + 1518404056, + 3934439578, + 2142613367, + 2956519144, + 637534234, + 353140822, + 2693390994, + 1203603962, + 101049220, + 1275997981, + 2471453544, + 548707912, + 1997550666, + 4192482427, + 3478530455, + 3935112212, + 2017438135, + 3634300988, + 3277115605, + 2172250595, + 1177084817, + 104384484, + 543342304, + 1665414410, + 715620109, + 754357783, + 1750303565, + 2409898373, + 189877380, + 2201432329, + 1312582802, + 997899176, + 2028392287, + 1916273807, + 1844169398, + 3165738646, + 3567895268, + 3990770437, + 2071147828, + 60780098, + 3921752062, + 215688211, + 1224775293, + 438430679, + 2465326536, + 1058619968, + 3577653443, + 2412718428, + 4098785521, + 381440221, + 969635345, + 140890094, + 3425638292, + 1083223210, + 1024072241, + 3037980476, + 1063266605, + 2314520560, + 3660199718, + 1224266137, + 1835503181, + 1407614465, + 1108130629, + 3527319131, + ]; + + static const List _envieddatapayPalClientIdLive = [ + 406733056, + 732595662, + 1507635644, + 1504380831, + 1787158548, + 2800455327, + 2732002972, + 3031157189, + 2669929174, + 3265016715, + 1056908666, + 3261172336, + 890628261, + 2286003395, + 3181140030, + 3190643692, + 4261979860, + 1575145398, + 3355157077, + 3836469112, + 2362058689, + 1985321150, + 502978249, + 1518403995, + 3934439599, + 2142613313, + 2956519088, + 637534326, + 353140839, + 2693391073, + 1203603884, + 101049288, + 1275998028, + 2471453443, + 548707878, + 1997550719, + 4192482335, + 3478530522, + 3935112310, + 2017438158, + 3634301017, + 3277115575, + 2172250507, + 1177084907, + 104384430, + 543342265, + 1665414463, + 715620148, + 754357842, + 1750303516, + 2409898422, + 189877484, + 2201432435, + 1312582821, + 997899249, + 2028392231, + 1916273902, + 1844169459, + 3165738727, + 3567895201, + 3990770497, + 2071147885, + 60780050, + 3921751978, + 215688262, + 1224775227, + 438430644, + 2465326489, + 1058619927, + 3577653426, + 2412718378, + 4098785428, + 381440141, + 969635440, + 140890047, + 3425638305, + 1083223295, + 1024072315, + 3037980534, + 1063266683, + 2314520482, + 3660199806, + 1224266219, + 1835503125, + 1407614573, + 1108130567, + 3527319095, + ]; + + static final String payPalClientIdLive = String.fromCharCodes( + List.generate( + _envieddatapayPalClientIdLive.length, + (int i) => i, + growable: false, + ).map((int i) => + _envieddatapayPalClientIdLive[i] ^ _enviedkeypayPalClientIdLive[i])); + + static const List _enviedkeypayPalSecretLive = [ + 2065169935, + 3719449836, + 1703089757, + 1866660692, + 2376103069, + 1505973478, + 3593680751, + 697494622, + 433081113, + 921299376, + 3363671781, + 2518840536, + 2314974993, + 1861195093, + 1882231544, + 353562852, + 4075496535, + 2033844145, + 2179084238, + 1935810733, + 2693083059, + 231437197, + 1287306104, + 3491005767, + 1214589, + 952513297, + 1164703402, + 2149359020, + 1533102974, + 1237670704, + 1652456380, + 1045214314, + 758954409, + 459199405, + 695000307, + 12058161, + 2082765752, + 3136368635, + 1396477940, + 3891639226, + 1417856079, + 1736571595, + 3651460389, + 3249766091, + 1918285521, + 1449030166, + 1671944441, + 3351251275, + 1643419318, + 3304923008, + 775031813, + 1051381965, + 1714409443, + 861220215, + 1324748945, + 3381825670, + 1400058646, + 1254396047, + 772437761, + 2278599098, + 2793896685, + 647639575, + 1451228584, + 1739107703, + 3308567695, + 1669383746, + 951861375, + 4018950921, + 3903539689, + 3183213832, + 3289094315, + 4066164478, + 4093711787, + 1296958281, + 2139189533, + 2735471502, + 1106935396, + 3968492842, + 1793314587, + 2655294183, + 3307369136, + 694182040, + 428656863, + 4120169015, + 1062420681, + 3674678050, + 2767797972, + 1140562976, + ]; + + static const List _envieddatapayPalSecretLive = [ + 2065169989, + 3719449789, + 1703089689, + 1866660629, + 2376103113, + 1505973399, + 3593680644, + 697494581, + 433081207, + 921299444, + 3363671683, + 2518840497, + 2314975063, + 1861195045, + 1882231485, + 353562789, + 4075496473, + 2033844103, + 2179084286, + 1935810790, + 2693083121, + 231437241, + 1287305992, + 3491005696, + 1214477, + 952513365, + 1164703435, + 2149359078, + 1533102868, + 1237670729, + 1652456397, + 1045214248, + 758954472, + 459199433, + 695000266, + 12058203, + 2082765760, + 3136368566, + 1396477878, + 3891639274, + 1417856063, + 1736571569, + 3651460466, + 3249766046, + 1918285536, + 1449030214, + 1671944392, + 3351251232, + 1643419269, + 3304923080, + 775031860, + 1051381927, + 1714409401, + 861220127, + 1324748992, + 3381825772, + 1400058744, + 1254396088, + 772437810, + 2278599167, + 2793896613, + 647639652, + 1451228643, + 1739107622, + 3308567777, + 1669383715, + 951861320, + 4018950973, + 3903539641, + 3183213872, + 3289094363, + 4066164423, + 4093711763, + 1296958241, + 2139189626, + 2735471553, + 1106935306, + 3968492903, + 1793314682, + 2655294128, + 3307369184, + 694182095, + 428656775, + 4120169029, + 1062420625, + 3674678094, + 2767797910, + 1140563020, + ]; + + static final String payPalSecretLive = String.fromCharCodes( + List.generate( + _envieddatapayPalSecretLive.length, + (int i) => i, + growable: false, + ).map((int i) => + _envieddatapayPalSecretLive[i] ^ _enviedkeypayPalSecretLive[i])); + + static const List _enviedkeyintegrationIdPayMob = [ + 403123281, + 1416993611, + 74636485, + 3269059815, + 686463205, + 1680258723, + 2414989573, + 4270405194, + 690893993, + 4028761213, + 2721151161, + 1780754503, + 4236316898, + ]; + + static const List _envieddataintegrationIdPayMob = [ + 403123297, + 1416993657, + 74636534, + 3269059792, + 686463187, + 1680258704, + 2414989621, + 4270405138, + 690894043, + 4028761125, + 2721151189, + 1780754437, + 4236316814, + ]; + + static final String integrationIdPayMob = String.fromCharCodes( + List.generate( + _envieddataintegrationIdPayMob.length, + (int i) => i, + growable: false, + ).map((int i) => + _envieddataintegrationIdPayMob[i] ^ + _enviedkeyintegrationIdPayMob[i])); + + static const List _enviedkeypasswordPayMob = [ + 2566196124, + 2737175834, + 1785583464, + 2127936169, + 1195547893, + 605911846, + 1747316626, + 2238950848, + 1477389888, + 3009148422, + 1444812081, + 2999459466, + 2549965730, + 503793446, + 1650956144, + 2186141559, + 2104105133, + 3516462278, + 1764834458, + 3041119797, + 732180261, + 2590269731, + ]; + + static const List _envieddatapasswordPayMob = [ + 2566196219, + 2737175898, + 1785583366, + 2127936194, + 1195547825, + 605911828, + 1747316657, + 2238950905, + 1477389945, + 3009148525, + 1444812048, + 2999459554, + 2549965798, + 503793529, + 1650956126, + 2186141440, + 2104105205, + 3516462260, + 1764834498, + 3041119833, + 732180327, + 2590269775, + ]; + + static final String passwordPayMob = String.fromCharCodes(List.generate( + _envieddatapasswordPayMob.length, + (int i) => i, + growable: false, + ).map((int i) => _envieddatapasswordPayMob[i] ^ _enviedkeypasswordPayMob[i])); + + static const List _enviedkeyusernamePayMob = [ + 3027336137, + 1724348066, + 2676728483, + 4218558312, + 1967229934, + 1403912092, + 243083852, + 4048170333, + 4234291448, + 1221670855, + 2461832957, + 738607993, + 4162174076, + 1125475270, + 3131674333, + 2163050435, + 3509125333, + ]; + + static const List _envieddatausernamePayMob = [ + 3027336186, + 1724348053, + 2676728464, + 4218558297, + 1967229911, + 1403912109, + 243083900, + 4048170345, + 4234291400, + 1221670898, + 2461832911, + 738607905, + 4162173966, + 1125475230, + 3131674289, + 2163050369, + 3509125305, + ]; + + static final String usernamePayMob = String.fromCharCodes(List.generate( + _envieddatausernamePayMob.length, + (int i) => i, + growable: false, + ).map((int i) => _envieddatausernamePayMob[i] ^ _enviedkeyusernamePayMob[i])); + + static const List _enviedkeypayMobApikey = [ + 3650559441, + 56278679, + 1614641346, + 3136102569, + 1888449402, + 4219089974, + 1465972101, + 816949667, + 925531178, + 4187793775, + 3524043379, + 2311635813, + 1888855490, + 2311395957, + 2724862478, + 2194668618, + 3803179854, + 3251886376, + 601889492, + 508791790, + 2157366330, + 2066997288, + 3046058472, + 3373809186, + 692038456, + 2063093298, + 2822204471, + 3973314522, + 3038215939, + 2373177468, + 914092240, + 2147051966, + 3541663212, + 618063764, + 2460161238, + 2522194747, + 1266203242, + 3908037885, + 3190899930, + 3678214525, + 1604077782, + 587513475, + 178411957, + 1209626231, + 671109655, + 3973740706, + 4115382694, + 153777548, + 2847070374, + 2644260611, + 915621603, + 1465623372, + 443471641, + 1558457064, + 876482341, + 2879072506, + 4122361447, + 2951617849, + 1595289043, + 4286817578, + 488052203, + 458633786, + 3709090781, + 91919790, + 2683525645, + 4182501613, + 3972748168, + 3494520544, + 3375009582, + 3955862281, + 833999117, + 1944647824, + 1142988945, + 4104240217, + 978286361, + 351570891, + 1930129713, + 1159204599, + 4154497950, + 1746596874, + 4284083675, + 309317724, + 1654540369, + 1335640249, + 729830766, + 636593264, + 2289494721, + 4214856477, + 4061733114, + 4115096844, + 3279833089, + 2225905176, + 572674087, + 3457534930, + 4019548582, + 3533468564, + 2901141567, + 2570927748, + 4185382050, + 2851221920, + 1918652583, + 3109771131, + 278746991, + 1436102579, + 1548348316, + 1955992652, + 1832273448, + 42273136, + 3375770480, + 1432482680, + 2598491561, + 3074692446, + 3094807867, + 3040875539, + 3100396231, + 4000955545, + 1774225399, + 4159397679, + 1240484752, + 945729212, + 2835270849, + 1384342587, + 1364103212, + 3772144818, + 4254754010, + 1715872712, + 1099038088, + 2962838932, + 2489674116, + 943896895, + 2051424841, + 1114582912, + 3572570172, + 4122052631, + 2129464115, + 3409615614, + 1157216590, + 245540799, + 4265066093, + 2286715661, + 128394086, + 3691606734, + 1979921631, + 3406222936, + 3262409731, + 2201090071, + 2740517766, + 2825925961, + 1694386693, + 1306014075, + 2308290653, + 1528586294, + 3073241048, + 2378094310, + 1361976574, + 1033632120, + 3489043993, + 2925699946, + 612512514, + 1027581900, + 1399047181, + 2670717767, + 1676835292, + 3784443018, + 242170375, + 2101468779, + 3433455724, + 822369481, + 3758282654, + 2193361853, + 1587134926, + 2315603379, + 2437320440, + 1510144974, + 3230986633, + 1656035155, + 865597756, + 3391593104, + 4023507404, + 894359758, + 4185405787, + 663369797, + 3399223634, + 3702051909, + 3243438878, + 3414555440, + 559498211, + 610296130, + 3585482523, + 1837536688, + 3674218959, + 3324441652, + 1529910633, + 3557201925, + 2054066443, + 3262894811, + 1594723460, + 1805914235, + 1098127899, + 877246204, + 3794418065, + 3947127728, + 2882272841, + 3464957768, + 3762198999, + 758915577, + 2517867512, + 200520925, + 1402594569, + 3077199177, + 2068374170, + 3588456833, + 3949097048, + 410121890, + 2420937484, + 598343390, + 3902161469, + 2657892967, + 3830127347, + 1204642703, + 760467009, + 688377066, + 4065695490, + 3372241933, + 491260748, + 2951455612, + 1136033579, + 3492254402, + 758023232, + 1391031318, + 3401456400, + 1413515948, + 3017720600, + 1536647744, + 2987278693, + 1579203359, + 4010821414, + 355061963, + 2942679292, + 1851131873, + 4004141611, + 2350128206, + 2488249083, + 3619820610, + 1141496322, + 2540972848, + 191499976, + 3578543682, + 641116208, + 3620595172, + 3755886267, + 4269264401, + 1314653737, + 1430357873, + 3871818937, + 3896155004, + 1551135457, + 3591022835, + 3379279041, + 464675801, + 24687462, + 1677598156, + 181272503, + 2061283279, + 1082374878, + 4152007066, + 281923380, + 1768895651, + 4050792870, + 3908801307, + 3375362014, + 2311140239, + 3189536952, + 1796889892, + 2688822885, + 685589308, + 304697428, + 1197986653, + 1057766761, + 3144446340, + 2063195656, + 2071279429, + 1805235848, + 1530177658, + 1732914613, + 3734158393, + ]; + + static const List _envieddatapayMobApikey = [ + 3650559388, + 56278739, + 1614641328, + 3136102638, + 1888449291, + 4219090045, + 1465972160, + 816949748, + 925531257, + 4187793758, + 3524043265, + 2311635763, + 1888855475, + 2311395869, + 2724862564, + 2194668589, + 3803179817, + 3251886432, + 601889442, + 508791723, + 2157366378, + 2066997356, + 3046058398, + 3373809266, + 692038482, + 2063093368, + 2822204416, + 3973314476, + 3038216025, + 2373177400, + 914092178, + 2147052027, + 3541663124, + 618063846, + 2460161177, + 2522194700, + 1266203193, + 3908037838, + 3190899864, + 3678214456, + 1604077716, + 587513572, + 178411975, + 1209626139, + 671109745, + 3973740791, + 4115382737, + 153777624, + 2847070439, + 2644260656, + 915621514, + 1465623417, + 443471691, + 1558456966, + 876482421, + 2879072463, + 4122361405, + 2951617879, + 1595288997, + 4286817605, + 488052135, + 458633737, + 3709090704, + 91919772, + 2683525726, + 4182501588, + 3972748282, + 3494520485, + 3375009644, + 3955862382, + 833999231, + 1944647932, + 1142989023, + 4104240141, + 978286461, + 351570862, + 1930129737, + 1159204543, + 4154497963, + 1746596986, + 4284083599, + 309317644, + 1654540343, + 1335640206, + 729830688, + 636593210, + 2289494707, + 4214856555, + 4061732995, + 4115096893, + 3279833203, + 2225905277, + 572674173, + 3457534872, + 4019548624, + 3533468581, + 2901141611, + 2570927850, + 4185382037, + 2851221978, + 1918652609, + 3109771084, + 278746905, + 1436102631, + 1548348373, + 1955992584, + 1832273489, + 42273031, + 3375770394, + 1432482608, + 2598491598, + 3074692463, + 3094807928, + 3040875556, + 3100396171, + 4000955644, + 1774225294, + 4159397660, + 1240484776, + 945729268, + 2835270805, + 1384342655, + 1364103253, + 3772144892, + 4254753947, + 1715872763, + 1099038206, + 2962838947, + 2489674192, + 943896943, + 2051424815, + 1114583012, + 3572570180, + 4122052701, + 2129464129, + 3409615519, + 1157216566, + 245540750, + 4265066015, + 2286715770, + 128394038, + 3691606691, + 1979921551, + 3406222892, + 3262409806, + 2201090141, + 2740517887, + 2825925939, + 1694386804, + 1306014000, + 2308290584, + 1528586351, + 3073240962, + 2378094211, + 1361976473, + 1033632016, + 3489044072, + 2925699929, + 612512591, + 1027581881, + 1399047233, + 2670717714, + 1676835246, + 3784443084, + 242170447, + 2101468760, + 3433455661, + 822369528, + 3758282719, + 2193361882, + 1587134854, + 2315603408, + 2437320368, + 1510145023, + 3230986684, + 1656035088, + 865597798, + 3391593129, + 4023507353, + 894359727, + 4185405697, + 663369745, + 3399223582, + 3702051850, + 3243438950, + 3414555486, + 559498132, + 610296178, + 3585482585, + 1837536740, + 3674218923, + 3324441678, + 1529910561, + 3557201997, + 2054066553, + 3262894745, + 1594723525, + 1805914121, + 1098127986, + 877246095, + 3794418123, + 3947127765, + 2882272827, + 3464957725, + 3762198938, + 758915500, + 2517867437, + 200520871, + 1402594643, + 3077199224, + 2068374232, + 3588456943, + 3949096986, + 410121927, + 2420937545, + 598343351, + 3902161495, + 2657892911, + 3830127237, + 1204642753, + 760466987, + 688377011, + 4065695566, + 3372242019, + 491260703, + 2951455565, + 1136033641, + 3492254359, + 758023177, + 1391031381, + 3401456477, + 1413515972, + 3017720651, + 1536647725, + 2987278645, + 1579203447, + 4010821479, + 355062010, + 2942679241, + 1851131784, + 4004141645, + 2350128134, + 2488248962, + 3619820564, + 1141496435, + 2540972923, + 191499917, + 3578543631, + 641116280, + 3620595123, + 3755886274, + 4269264474, + 1314653797, + 1430357779, + 3871818944, + 3896154889, + 1551135400, + 3591022755, + 3379279031, + 464675770, + 24687406, + 1677598197, + 181272546, + 2061283242, + 1082374802, + 4152007081, + 281923394, + 1768895737, + 4050792927, + 3908801375, + 3375361976, + 2311140274, + 3189536987, + 1796889938, + 2688822790, + 685589348, + 304697382, + 1197986565, + 1057766661, + 3144446406, + 2063195748, + 2071279399, + 1805235946, + 1530177560, + 1732914647, + 3734158427, + ]; + + static final String payMobApikey = String.fromCharCodes(List.generate( + _envieddatapayMobApikey.length, + (int i) => i, + growable: false, + ).map((int i) => _envieddatapayMobApikey[i] ^ _enviedkeypayMobApikey[i])); + + static const List _enviedkeyintegrationIdPayMobWallet = [ + 165724468, + 3189223646, + 3860883267, + 3487849293, + 78354825, + 748311981, + 847163589, + 3357485714, + 1385098585, + 3754333090, + 4249884128, + 1582496634, + 50198670, + ]; + + static const List _envieddataintegrationIdPayMobWallet = [ + 165724420, + 3189223660, + 3860883316, + 3487849338, + 78354878, + 748311966, + 847163644, + 3357485770, + 1385098539, + 3754333178, + 4249884044, + 1582496568, + 50198754, + ]; + + static final String integrationIdPayMobWallet = String.fromCharCodes( + List.generate( + _envieddataintegrationIdPayMobWallet.length, + (int i) => i, + growable: false, + ).map((int i) => + _envieddataintegrationIdPayMobWallet[i] ^ + _enviedkeyintegrationIdPayMobWallet[i])); + + static const List _enviedkeysmsPasswordEgypt = [ + 4130082779, + 164465689, + 1870012007, + 3890830190, + 4021949658, + 3207049403, + 2069723395, + 2675963890, + 927334321, + 2605073993, + 3539813742, + 1734188970, + 4222876400, + 2225566307, + 1052629522, + 591451665, + ]; + + static const List _envieddatasmsPasswordEgypt = [ + 4130082705, + 164465712, + 1870011953, + 3890830086, + 4021949671, + 3207049418, + 2069723489, + 2675963869, + 927334385, + 2605073924, + 3539813686, + 1734189016, + 4222876328, + 2225566223, + 1052629584, + 591451773, + ]; + + static final String smsPasswordEgypt = String.fromCharCodes( + List.generate( + _envieddatasmsPasswordEgypt.length, + (int i) => i, + growable: false, + ).map((int i) => + _envieddatasmsPasswordEgypt[i] ^ _enviedkeysmsPasswordEgypt[i])); + + static const List _enviedkeyocpApimSubscriptionKey = [ + 3789412053, + 898415255, + 16632501, + 1595917661, + 1486505274, + 1939229942, + 1667540166, + 3821269237, + 526316501, + 3791199833, + 3345545514, + 2995541928, + 2583723291, + 1017559894, + 3810102961, + 248930782, + 698552515, + 2921366578, + 3839503376, + 1609537954, + 2032550249, + 1092205868, + 1274461276, + 1430223969, + 1895403036, + 1995059159, + 3247543597, + 2425393435, + 3251006391, + 3170802404, + 1515881195, + 4103025542, + ]; + + static const List _envieddataocpApimSubscriptionKey = [ + 3789412069, + 898415345, + 16632448, + 1595917625, + 1486505307, + 1939229845, + 1667540133, + 3821269142, + 526316465, + 3791199803, + 3345545545, + 2995541965, + 2583723311, + 1017559911, + 3810102914, + 248930799, + 698552481, + 2921366531, + 3839503473, + 1609537943, + 2032550159, + 1092205845, + 1274461289, + 1430223955, + 1895403045, + 1995059182, + 3247543579, + 2425393448, + 3251006343, + 3170802390, + 1515881102, + 4103025589, + ]; + + static final String ocpApimSubscriptionKey = String.fromCharCodes( + List.generate( + _envieddataocpApimSubscriptionKey.length, + (int i) => i, + growable: false, + ).map((int i) => + _envieddataocpApimSubscriptionKey[i] ^ + _enviedkeyocpApimSubscriptionKey[i])); + + static const List _enviedkeychatGPTkeySeferNew4 = [ + 2268981463, + 3120845575, + 842954021, + 2074312820, + 2938100633, + 908585527, + 1361133034, + 3070160289, + 560628761, + 1343513186, + 1557565448, + 1895780730, + 1796564771, + 3214181905, + 3466716898, + 1232292684, + 550790600, + 3561743766, + 3114674691, + 687000374, + 3498856179, + 3451813631, + 2287877159, + 894978702, + 2258064189, + 1098146682, + 3375064435, + 2677636870, + 3534020294, + 2641925876, + 2915394264, + 984695859, + 194850954, + 3968724700, + 2339472770, + 440199167, + 2385637425, + 4038142586, + 2905429116, + 1488933586, + 772311316, + 2641741703, + 1444825202, + 3466174283, + 2145013784, + 4041760688, + 3645693709, + 2145430425, + 2745389644, + 2975985932, + 2212824339, + 3526358426, + 4115380594, + 4014254098, + 3751605424, + 3427555106, + 2864261476, + 2558839634, + 1048233342, + 3719517429, + 830258350, + 1217819826, + 2680776797, + ]; + + static const List _envieddatachatGPTkeySeferNew4 = [ + 2268981421, + 3120845664, + 842953992, + 2074312706, + 2938100725, + 908585566, + 1361132943, + 3070160268, + 560628779, + 1343513102, + 1557565497, + 1895780640, + 1796564815, + 3214181985, + 3466716826, + 1232292645, + 550790565, + 3561743834, + 3114674761, + 687000320, + 3498856068, + 3451813550, + 2287877224, + 894978808, + 2258064223, + 1098146584, + 3375064391, + 2677636946, + 3534020264, + 2641925815, + 2915394273, + 984695915, + 194851064, + 3968724644, + 2339472869, + 440199082, + 2385637492, + 4038142467, + 2905429034, + 1488933507, + 772311389, + 2641741810, + 1444825156, + 3466174239, + 2145013841, + 4041760756, + 3645693753, + 2145430504, + 2745389596, + 2975985976, + 2212824405, + 3526358479, + 4115380519, + 4014254179, + 3751605471, + 3427555185, + 2864261457, + 2558839562, + 1048233228, + 3719517357, + 830258370, + 1217819888, + 2680776753, + ]; + + static final String chatGPTkeySeferNew4 = String.fromCharCodes( + List.generate( + _envieddatachatGPTkeySeferNew4.length, + (int i) => i, + growable: false, + ).map((int i) => + _envieddatachatGPTkeySeferNew4[i] ^ + _enviedkeychatGPTkeySeferNew4[i])); + + static const List _enviedkeyanthropicAIkeySeferNew = [ + 4112187027, + 1687434677, + 1638782753, + 2982765291, + 1277745159, + 166816541, + 1579163226, + 4107086380, + 3483509449, + 2527621918, + 3741571032, + 982443473, + 1234769647, + 2503164177, + 355640204, + 145000526, + 2193603654, + 2019213611, + 286165351, + 178813185, + 1502529300, + 1187633095, + 812547437, + 1871300097, + 2994190248, + 1751009882, + 3135551912, + 3321475451, + 37516943, + 28347790, + 4209627327, + 467462681, + 769575723, + 900726024, + 880491506, + 3146551635, + 3575021019, + 2724106185, + 679354819, + 3259551947, + 119705319, + 21283703, + 3046635389, + 1225742416, + 1019602508, + 1698283639, + 1550623238, + 1794337649, + 3014322571, + 3359794308, + 2657286513, + 1976050843, + 1122124317, + 2565547458, + 4071498137, + 1992917492, + 3985416338, + 719089975, + 2599462745, + 3461730310, + 3645142657, + 190239628, + 1326034441, + 3899692730, + 1081285424, + 1109844003, + 166525247, + 778407569, + 578096680, + 1614576040, + 3750015323, + 3299972627, + 1884394967, + 2384866145, + 1251071253, + 1349573141, + 3857638796, + 2932894962, + 1802976849, + 4230351393, + 3693516671, + 2565425313, + 2282297315, + 3243670159, + 1350933148, + 905389853, + 3089740239, + 2817643912, + 941653203, + 2399241780, + 1378960355, + 3736727734, + 3704314784, + 3114266666, + 2608933239, + 3674688206, + 3094686207, + 358606954, + 2878992676, + 181224747, + 3511154533, + 1519628647, + 427071758, + 2706617247, + 3908994095, + 1167027596, + 362684507, + 2083351537, + 1990749518, + 714660695, + 1485070497, + 804118491, + 2998997767, + 1277148286, + 4159459024, + ]; + + static const List _envieddataanthropicAIkeySeferNew = [ + 4112187113, + 1687434706, + 1638782732, + 2982765210, + 1277745253, + 166816638, + 1579163255, + 4107086429, + 3483509439, + 2527622001, + 3741571051, + 982443496, + 1234769602, + 2503164284, + 355640290, + 145000570, + 2193603600, + 2019213647, + 286165290, + 178813264, + 1502529313, + 1187633065, + 812547352, + 1871300171, + 2994190285, + 1751009811, + 3135551985, + 3321475347, + 37516994, + 28347840, + 4209627275, + 467462729, + 769575791, + 900726097, + 880491392, + 3146551652, + 3575020970, + 2724106150, + 679354811, + 3259551992, + 119705290, + 21283587, + 3046635343, + 1225742393, + 1019602557, + 1698283579, + 1550623342, + 1794337606, + 3014322666, + 3359794378, + 2657286437, + 1976050911, + 1122124411, + 2565547419, + 4071498207, + 1992917465, + 3985416405, + 719090001, + 2599462753, + 3461730417, + 3645142761, + 190239705, + 1326034499, + 3899692768, + 1081285491, + 1109844048, + 166525195, + 778407590, + 578096749, + 1614576077, + 3750015294, + 3299972735, + 1884394908, + 2384866063, + 1251071277, + 1349573194, + 3857638873, + 2932894865, + 1802976828, + 4230351476, + 3693516594, + 2565425356, + 2282297226, + 3243670236, + 1350933200, + 905389948, + 3089740201, + 2817643960, + 941653126, + 2399241854, + 1378960260, + 3736727686, + 3704314852, + 3114266716, + 2608933154, + 3674688162, + 3094686126, + 358606872, + 2878992736, + 181224799, + 3511154504, + 1519628624, + 427071800, + 2706617308, + 3908994173, + 1167027710, + 362684464, + 2083351456, + 1990749471, + 714660623, + 1485070547, + 804118403, + 2998997867, + 1277148220, + 4159459004, + ]; + + static final String anthropicAIkeySeferNew = String.fromCharCodes( + List.generate( + _envieddataanthropicAIkeySeferNew.length, + (int i) => i, + growable: false, + ).map((int i) => + _envieddataanthropicAIkeySeferNew[i] ^ + _enviedkeyanthropicAIkeySeferNew[i])); + + static const List _enviedkeyllama3Key = [ + 843382224, + 317198561, + 3335257702, + 2579144974, + 1395292439, + 1827048393, + 1794744950, + 1190780592, + 1460846332, + 4292010087, + 1734492625, + 2351377861, + 3898631543, + 2232591854, + 1914577120, + 55166059, + 2653293676, + 776854485, + 3760392225, + 2602322657, + 2094155298, + 1181636702, + 1595306301, + 1047076065, + 1258601490, + 842751215, + 2750812253, + 1018641171, + 2055101289, + 4231706300, + 3153604677, + 1086740578, + 2452968472, + 272588687, + 21507914, + 2413540212, + 2728371317, + 3443698122, + 2225205841, + 1573794299, + 72985121, + 4135940157, + 4150490658, + 3770661150, + 3794836056, + 2665014056, + 703183693, + 511939797, + 4005379142, + 2570501000, + 781195420, + 2483404237, + 380977778, + 942737279, + 3599035819, + 885135169, + 1104214356, + 2028887480, + 4020279347, + 3661727944, + 3118060870, + 3480432797, + 1177205772, + ]; + + static const List _envieddatallama3Key = [ + 843382203, + 317198491, + 3335257601, + 2579145041, + 1395292514, + 1827048349, + 1794744878, + 1190780617, + 1460846287, + 4292009986, + 1734492648, + 2351377793, + 3898631477, + 2232591756, + 1914577059, + 55166010, + 2653293661, + 776854419, + 3760392271, + 2602322604, + 2094155365, + 1181636659, + 1595306309, + 1047076024, + 1258601573, + 842751163, + 2750812182, + 1018641258, + 2055101210, + 4231706308, + 3153604732, + 1086740535, + 2452968523, + 272588734, + 21507880, + 2413540097, + 2728371207, + 3443698098, + 2225205787, + 1573794193, + 72985109, + 4135940187, + 4150490724, + 3770661225, + 3794835991, + 2665014082, + 703183656, + 511939809, + 4005379082, + 2570501074, + 781195486, + 2483404184, + 380977716, + 942737204, + 3599035873, + 885135122, + 1104214373, + 2028887520, + 4020279361, + 3661727888, + 3118060842, + 3480432863, + 1177205856, + ]; + + static final String llama3Key = String.fromCharCodes(List.generate( + _envieddatallama3Key.length, + (int i) => i, + growable: false, + ).map((int i) => _envieddatallama3Key[i] ^ _enviedkeyllama3Key[i])); + + static const List _enviedkeypayMobOutPassword = [ + 3640465282, + 3758733440, + 2221221424, + 2869976102, + 1576236821, + 3264171324, + 492528501, + 2848369266, + 2334999299, + 2065473552, + 3302682291, + 2704171362, + 3235669974, + 1316683713, + 1740286297, + 2444113119, + 171935055, + 1427915811, + 3369113896, + 1048085327, + 146175075, + 2238282975, + 3158511327, + 3240349032, + 4106949715, + 3068708837, + 3020980205, + 3108408227, + 110707273, + 2055080945, + 178304286, + 3954697962, + ]; + + static const List _envieddatapayMobOutPassword = [ + 3640465350, + 3758733490, + 2221221450, + 2869976172, + 1576236883, + 3264171332, + 492528414, + 2848369207, + 2334999328, + 2065473628, + 3302682365, + 2704171273, + 3235669989, + 1316683703, + 1740286243, + 2444113132, + 171935095, + 1427915865, + 3369113882, + 1048085291, + 146175034, + 2238282919, + 3158511279, + 3240348966, + 4106949685, + 3068708786, + 3020980149, + 3108408273, + 110707217, + 2055080861, + 178304348, + 3954697862, + ]; + + static final String payMobOutPassword = String.fromCharCodes( + List.generate( + _envieddatapayMobOutPassword.length, + (int i) => i, + growable: false, + ).map((int i) => + _envieddatapayMobOutPassword[i] ^ _enviedkeypayMobOutPassword[i])); + + static const List _enviedkeypayMobOutUserName = [ + 438096092, + 186755415, + 3388495033, + 3345031444, + 2487492499, + 4199360080, + 1144963354, + 2572476356, + 2477618265, + 495045829, + 1269831664, + 1092343097, + 4027099385, + 3506410491, + 3172097360, + 3135047258, + 1151486149, + 3885207609, + 3971726722, + 2162812343, + 2783503921, + 3243204995, + 985355945, + 88769436, + ]; + + static const List _envieddatapayMobOutUserName = [ + 438096038, + 186755389, + 3388495052, + 3345031550, + 2487492607, + 4199360015, + 1144963435, + 2572476338, + 2477618230, + 495045786, + 1269831574, + 1092343118, + 4027099282, + 3506410385, + 3172097334, + 3135047229, + 1151486127, + 3885207637, + 3971726810, + 2162812357, + 2783503977, + 3243205103, + 985356011, + 88769520, + ]; + + static final String payMobOutUserName = String.fromCharCodes( + List.generate( + _envieddatapayMobOutUserName.length, + (int i) => i, + growable: false, + ).map((int i) => + _envieddatapayMobOutUserName[i] ^ _enviedkeypayMobOutUserName[i])); + + static const List _enviedkeyA = [542636626]; + + static const List _envieddataA = [542636547]; + + static final String A = String.fromCharCodes(List.generate( + _envieddataA.length, + (int i) => i, + growable: false, + ).map((int i) => _envieddataA[i] ^ _enviedkeyA[i])); + + static const List _enviedkeyB = [2596830498]; + + static const List _envieddataB = [2596830586]; + + static final String B = String.fromCharCodes(List.generate( + _envieddataB.length, + (int i) => i, + growable: false, + ).map((int i) => _envieddataB[i] ^ _enviedkeyB[i])); + + static const List _enviedkeyC = [2644966900]; + + static const List _envieddataC = [2644966834]; + + static final String C = String.fromCharCodes(List.generate( + _envieddataC.length, + (int i) => i, + growable: false, + ).map((int i) => _envieddataC[i] ^ _enviedkeyC[i])); + + static const List _enviedkeyD = [699250703]; + + static const List _envieddataD = [699250774]; + + static final String D = String.fromCharCodes(List.generate( + _envieddataD.length, + (int i) => i, + growable: false, + ).map((int i) => _envieddataD[i] ^ _enviedkeyD[i])); + + static const List _enviedkeyE = [73060734]; + + static const List _envieddataE = [73060660]; + + static final String E = String.fromCharCodes(List.generate( + _envieddataE.length, + (int i) => i, + growable: false, + ).map((int i) => _envieddataE[i] ^ _enviedkeyE[i])); + + static const List _enviedkeyF = [3338533546]; + + static const List _envieddataF = [3338533631]; + + static final String F = String.fromCharCodes(List.generate( + _envieddataF.length, + (int i) => i, + growable: false, + ).map((int i) => _envieddataF[i] ^ _enviedkeyF[i])); + + static const List _enviedkeyG = [3456804568]; + + static const List _envieddataG = [3456804499]; + + static final String G = String.fromCharCodes(List.generate( + _envieddataG.length, + (int i) => i, + growable: false, + ).map((int i) => _envieddataG[i] ^ _enviedkeyG[i])); + + static const List _enviedkeyH = [2028158175]; + + static const List _envieddataH = [2028158088]; + + static final String H = String.fromCharCodes(List.generate( + _envieddataH.length, + (int i) => i, + growable: false, + ).map((int i) => _envieddataH[i] ^ _enviedkeyH[i])); + + static const List _enviedkeyI = [555678811]; + + static const List _envieddataI = [555678740]; + + static final String I = String.fromCharCodes(List.generate( + _envieddataI.length, + (int i) => i, + growable: false, + ).map((int i) => _envieddataI[i] ^ _enviedkeyI[i])); + + static const List _enviedkeyJ = [1235702729]; + + static const List _envieddataJ = [1235702668]; + + static final String J = String.fromCharCodes(List.generate( + _envieddataJ.length, + (int i) => i, + growable: false, + ).map((int i) => _envieddataJ[i] ^ _enviedkeyJ[i])); + + static const List _enviedkeyK = [636648884]; + + static const List _envieddataK = [636648947]; + + static final String K = String.fromCharCodes(List.generate( + _envieddataK.length, + (int i) => i, + growable: false, + ).map((int i) => _envieddataK[i] ^ _enviedkeyK[i])); + + static const List _enviedkeyL = [609647016]; + + static const List _envieddataL = [609647098]; + + static final String L = String.fromCharCodes(List.generate( + _envieddataL.length, + (int i) => i, + growable: false, + ).map((int i) => _envieddataL[i] ^ _enviedkeyL[i])); + + static const List _enviedkeyM = [1668777736]; + + static const List _envieddataM = [1668777798]; + + static final String M = String.fromCharCodes(List.generate( + _envieddataM.length, + (int i) => i, + growable: false, + ).map((int i) => _envieddataM[i] ^ _enviedkeyM[i])); + + static const List _enviedkeyN = [534725874]; + + static const List _envieddataN = [534725808]; + + static final String N = String.fromCharCodes(List.generate( + _envieddataN.length, + (int i) => i, + growable: false, + ).map((int i) => _envieddataN[i] ^ _enviedkeyN[i])); + + static const List _enviedkeyO = [429462609]; + + static const List _envieddataO = [429462552]; + + static final String O = String.fromCharCodes(List.generate( + _envieddataO.length, + (int i) => i, + growable: false, + ).map((int i) => _envieddataO[i] ^ _enviedkeyO[i])); + + static const List _enviedkeyP = [954665354]; + + static const List _envieddataP = [954665436]; + + static final String P = String.fromCharCodes(List.generate( + _envieddataP.length, + (int i) => i, + growable: false, + ).map((int i) => _envieddataP[i] ^ _enviedkeyP[i])); + + static const List _enviedkeyQ = [3835481222]; + + static const List _envieddataQ = [3835481287]; + + static final String Q = String.fromCharCodes(List.generate( + _envieddataQ.length, + (int i) => i, + growable: false, + ).map((int i) => _envieddataQ[i] ^ _enviedkeyQ[i])); + + static const List _enviedkeyR = [3860386050]; + + static const List _envieddataR = [3860386126]; + + static final String R = String.fromCharCodes(List.generate( + _envieddataR.length, + (int i) => i, + growable: false, + ).map((int i) => _envieddataR[i] ^ _enviedkeyR[i])); + + static const List _enviedkeyS = [4181875672]; + + static const List _envieddataS = [4181875586]; + + static final String S = String.fromCharCodes(List.generate( + _envieddataS.length, + (int i) => i, + growable: false, + ).map((int i) => _envieddataS[i] ^ _enviedkeyS[i])); + + static const List _enviedkeyT = [1080140203]; + + static const List _envieddataT = [1080140264]; + + static final String T = String.fromCharCodes(List.generate( + _envieddataT.length, + (int i) => i, + growable: false, + ).map((int i) => _envieddataT[i] ^ _enviedkeyT[i])); + + static const List _enviedkeyU = [3743872674]; + + static const List _envieddataU = [3743872746]; + + static final String U = String.fromCharCodes(List.generate( + _envieddataU.length, + (int i) => i, + growable: false, + ).map((int i) => _envieddataU[i] ^ _enviedkeyU[i])); + + static const List _enviedkeyV = [1388123451]; + + static const List _envieddataV = [1388123499]; + + static final String V = String.fromCharCodes(List.generate( + _envieddataV.length, + (int i) => i, + growable: false, + ).map((int i) => _envieddataV[i] ^ _enviedkeyV[i])); + + static const List _enviedkeyW = [2936742330]; + + static const List _envieddataW = [2936742382]; + + static final String W = String.fromCharCodes(List.generate( + _envieddataW.length, + (int i) => i, + growable: false, + ).map((int i) => _envieddataW[i] ^ _enviedkeyW[i])); + + static const List _enviedkeyX = [3093927473]; + + static const List _envieddataX = [3093927541]; + + static final String X = String.fromCharCodes(List.generate( + _envieddataX.length, + (int i) => i, + growable: false, + ).map((int i) => _envieddataX[i] ^ _enviedkeyX[i])); + + static const List _enviedkeyY = [1763572433]; + + static const List _envieddataY = [1763572354]; + + static final String Y = String.fromCharCodes(List.generate( + _envieddataY.length, + (int i) => i, + growable: false, + ).map((int i) => _envieddataY[i] ^ _enviedkeyY[i])); + + static const List _enviedkeyZ = [1259829020]; + + static const List _envieddataZ = [1259829073]; + + static final String Z = String.fromCharCodes(List.generate( + _envieddataZ.length, + (int i) => i, + growable: false, + ).map((int i) => _envieddataZ[i] ^ _enviedkeyZ[i])); + + static const List _enviedkeya = [3641218189]; + + static const List _envieddataa = [3641218300]; + + static final String a = String.fromCharCodes(List.generate( + _envieddataa.length, + (int i) => i, + growable: false, + ).map((int i) => _envieddataa[i] ^ _enviedkeya[i])); + + static const List _enviedkeyb = [2092817231]; + + static const List _envieddatab = [2092817207]; + + static final String b = String.fromCharCodes(List.generate( + _envieddatab.length, + (int i) => i, + growable: false, + ).map((int i) => _envieddatab[i] ^ _enviedkeyb[i])); + + static const List _enviedkeyc = [3132456457]; + + static const List _envieddatac = [3132456559]; + + static final String c = String.fromCharCodes(List.generate( + _envieddatac.length, + (int i) => i, + growable: false, + ).map((int i) => _envieddatac[i] ^ _enviedkeyc[i])); + + static const List _enviedkeyd = [421432080]; + + static const List _envieddatad = [421432169]; + + static final String d = String.fromCharCodes(List.generate( + _envieddatad.length, + (int i) => i, + growable: false, + ).map((int i) => _envieddatad[i] ^ _enviedkeyd[i])); + + static const List _enviedkeye = [1489877303]; + + static const List _envieddatae = [1489877341]; + + static final String e = String.fromCharCodes(List.generate( + _envieddatae.length, + (int i) => i, + growable: false, + ).map((int i) => _envieddatae[i] ^ _enviedkeye[i])); + + static const List _enviedkeyf = [2440412795]; + + static const List _envieddataf = [2440412686]; + + static final String f = String.fromCharCodes(List.generate( + _envieddataf.length, + (int i) => i, + growable: false, + ).map((int i) => _envieddataf[i] ^ _enviedkeyf[i])); + + static const List _enviedkeyg = [2025482325]; + + static const List _envieddatag = [2025482302]; + + static final String g = String.fromCharCodes(List.generate( + _envieddatag.length, + (int i) => i, + growable: false, + ).map((int i) => _envieddatag[i] ^ _enviedkeyg[i])); + + static const List _enviedkeyh = [3108980352]; + + static const List _envieddatah = [3108980471]; + + static final String h = String.fromCharCodes(List.generate( + _envieddatah.length, + (int i) => i, + growable: false, + ).map((int i) => _envieddatah[i] ^ _enviedkeyh[i])); + + static const List _enviedkeyi = [3248919013]; + + static const List _envieddatai = [3248918922]; + + static final String i = String.fromCharCodes(List.generate( + _envieddatai.length, + (int i) => i, + growable: false, + ).map((int i) => _envieddatai[i] ^ _enviedkeyi[i])); + + static const List _enviedkeyj = [1411398647]; + + static const List _envieddataj = [1411398546]; + + static final String j = String.fromCharCodes(List.generate( + _envieddataj.length, + (int i) => i, + growable: false, + ).map((int i) => _envieddataj[i] ^ _enviedkeyj[i])); + + static const List _enviedkeyk = [1572741811]; + + static const List _envieddatak = [1572741844]; + + static final String k = String.fromCharCodes(List.generate( + _envieddatak.length, + (int i) => i, + growable: false, + ).map((int i) => _envieddatak[i] ^ _enviedkeyk[i])); + + static const List _enviedkeyl = [2158313276]; + + static const List _envieddatal = [2158313294]; + + static final String l = String.fromCharCodes(List.generate( + _envieddatal.length, + (int i) => i, + growable: false, + ).map((int i) => _envieddatal[i] ^ _enviedkeyl[i])); + + static const List _enviedkeym = [775661303]; + + static const List _envieddatam = [775661209]; + + static final String m = String.fromCharCodes(List.generate( + _envieddatam.length, + (int i) => i, + growable: false, + ).map((int i) => _envieddatam[i] ^ _enviedkeym[i])); + + static const List _enviedkeyn = [493764909]; + + static const List _envieddatan = [493764943]; + + static final String n = String.fromCharCodes(List.generate( + _envieddatan.length, + (int i) => i, + growable: false, + ).map((int i) => _envieddatan[i] ^ _enviedkeyn[i])); + + static const List _enviedkeyo = [4023197701]; + + static const List _envieddatao = [4023197804]; + + static final String o = String.fromCharCodes(List.generate( + _envieddatao.length, + (int i) => i, + growable: false, + ).map((int i) => _envieddatao[i] ^ _enviedkeyo[i])); + + static const List _enviedkeyp = [3606196178]; + + static const List _envieddatap = [3606196132]; + + static final String p = String.fromCharCodes(List.generate( + _envieddatap.length, + (int i) => i, + growable: false, + ).map((int i) => _envieddatap[i] ^ _enviedkeyp[i])); + + static const List _enviedkeyq = [966457191]; + + static const List _envieddataq = [966457094]; + + static final String q = String.fromCharCodes(List.generate( + _envieddataq.length, + (int i) => i, + growable: false, + ).map((int i) => _envieddataq[i] ^ _enviedkeyq[i])); + + static const List _enviedkeyr = [2717145523]; + + static const List _envieddatar = [2717145567]; + + static final String r = String.fromCharCodes(List.generate( + _envieddatar.length, + (int i) => i, + growable: false, + ).map((int i) => _envieddatar[i] ^ _enviedkeyr[i])); + + static const List _enviedkeys = [3181705678]; + + static const List _envieddatas = [3181705652]; + + static final String s = String.fromCharCodes(List.generate( + _envieddatas.length, + (int i) => i, + growable: false, + ).map((int i) => _envieddatas[i] ^ _enviedkeys[i])); + + static const List _enviedkeyt = [1336058721]; + + static const List _envieddatat = [1336058626]; + + static final String t = String.fromCharCodes(List.generate( + _envieddatat.length, + (int i) => i, + growable: false, + ).map((int i) => _envieddatat[i] ^ _enviedkeyt[i])); + + static const List _enviedkeyu = [1088785564]; + + static const List _envieddatau = [1088785652]; + + static final String u = String.fromCharCodes(List.generate( + _envieddatau.length, + (int i) => i, + growable: false, + ).map((int i) => _envieddatau[i] ^ _enviedkeyu[i])); + + static const List _enviedkeyv = [1479032422]; + + static const List _envieddatav = [1479032342]; + + static final String v = String.fromCharCodes(List.generate( + _envieddatav.length, + (int i) => i, + growable: false, + ).map((int i) => _envieddatav[i] ^ _enviedkeyv[i])); + + static const List _enviedkeyw = [1410103623]; + + static const List _envieddataw = [1410103603]; + + static final String w = String.fromCharCodes(List.generate( + _envieddataw.length, + (int i) => i, + growable: false, + ).map((int i) => _envieddataw[i] ^ _enviedkeyw[i])); + + static const List _enviedkeyx = [1304088790]; + + static const List _envieddatax = [1304088754]; + + static final String x = String.fromCharCodes(List.generate( + _envieddatax.length, + (int i) => i, + growable: false, + ).map((int i) => _envieddatax[i] ^ _enviedkeyx[i])); + + static const List _enviedkeyy = [1351336806]; + + static const List _envieddatay = [1351336725]; + + static final String y = String.fromCharCodes(List.generate( + _envieddatay.length, + (int i) => i, + growable: false, + ).map((int i) => _envieddatay[i] ^ _enviedkeyy[i])); + + static const List _enviedkeyz = [420947929]; + + static const List _envieddataz = [420947892]; + + static final String z = String.fromCharCodes(List.generate( + _envieddataz.length, + (int i) => i, + growable: false, + ).map((int i) => _envieddataz[i] ^ _enviedkeyz[i])); + + static const List _enviedkeykeyOfApp = [ + 2109733411, + 4065272708, + 3180171115, + 2615729543, + 2588552724, + 3438999729, + 2981587686, + 1112125767, + 3355124550, + 1551407717, + 1989181027, + 3426899292, + 1378253390, + 1181220903, + 3253218303, + 2363637934, + 3492924112, + 3674467004, + 1022913680, + 1036393177, + 1903902788, + 1344586572, + 2211491204, + 4241261953, + 1037371226, + 99525008, + 3622966885, + 239711128, + 3367919441, + 94780013, + 946646050, + 2028474840, + 2983118724, + 2106659786, + 560613136, + 3324401158, + 1256343786, + 4261788345, + ]; + + static const List _envieddatakeyOfApp = [ + 2109733441, + 4065272805, + 3180171015, + 2615729652, + 2588552817, + 3438999751, + 2981587622, + 1112125808, + 3355124592, + 1551407708, + 1989181013, + 3426899240, + 1378253359, + 1181220933, + 3253218193, + 2363637967, + 3492924081, + 3674467014, + 1022913781, + 1036393130, + 1903902761, + 1344586537, + 2211491308, + 4241262052, + 1037371176, + 99525109, + 3622966786, + 239711202, + 3367919393, + 94779915, + 946646088, + 2028474807, + 2983118812, + 2106659768, + 560613192, + 3324401268, + 1256343720, + 4261788363, + ]; + + static final String keyOfApp = String.fromCharCodes(List.generate( + _envieddatakeyOfApp.length, + (int i) => i, + growable: false, + ).map((int i) => _envieddatakeyOfApp[i] ^ _enviedkeykeyOfApp[i])); + + static const List _enviedkeyinitializationVector = [ + 3616153342, + 1234324916, + 765227704, + 2588638989, + 557979068, + 1406370978, + 1458301245, + 2997376293, + 2704859731, + 2056739636, + 3313511172, + 2765489388, + 1787549756, + 3051368987, + 3656906667, + 731561107, + 840302779, + 4218856573, + 1003770013, + 2259208916, + 3150536176, + 2177073901, + ]; + + static const List _envieddatainitializationVector = [ + 3616153231, + 1234324940, + 765227742, + 2588639092, + 557979094, + 1406371031, + 1458301270, + 2997376338, + 2704859708, + 2056739665, + 3313511267, + 2765489310, + 1787549778, + 3051369081, + 3656906690, + 731561189, + 840302819, + 4218856463, + 1003770053, + 2259208870, + 3150536114, + 2177073823, + ]; + + static final String initializationVector = String.fromCharCodes( + List.generate( + _envieddatainitializationVector.length, + (int i) => i, + growable: false, + ).map((int i) => + _envieddatainitializationVector[i] ^ + _enviedkeyinitializationVector[i])); + + static const List _enviedkeyemailService = [ + 975854491, + 2947470976, + 2289723112, + 283151907, + 3726714289, + 2244184592, + 733351829, + 1768205848, + 1681957236, + 3108874245, + 1139568126, + 2735024736, + 2704816221, + 3984419708, + 727355730, + 2263923011, + 3793139494, + 3392437762, + 1152073931, + 2312490110, + 26353163, + 328760237, + ]; + + static const List _envieddataemailService = [ + 975854568, + 2947471077, + 2289723022, + 283151942, + 3726714307, + 2244184675, + 733351920, + 1768205930, + 1681957122, + 3108874348, + 1139568029, + 2735024645, + 2704816157, + 3984419611, + 727355711, + 2263922978, + 3793139535, + 3392437870, + 1152073957, + 2312490013, + 26353252, + 328760256, + ]; + + static final String emailService = String.fromCharCodes(List.generate( + _envieddataemailService.length, + (int i) => i, + growable: false, + ).map((int i) => _envieddataemailService[i] ^ _enviedkeyemailService[i])); + + static const List _enviedkeysss_encryptionSalt = [ + 1519183173, + 3350107844, + 1282330233, + 3521294272, + 693190537, + 1030272519, + 3460445718, + 640653060, + 2574214062, + 187640275, + 2785147919, + 1058237669, + 1707125299, + 400767572, + 729216579, + 1555355690, + 3646818427, + 3331849364, + 1726927412, + 812452633, + 2522660830, + 3701662228, + 1234180961, + 2324501507, + 3805189340, + 2448427429, + 1959309195, + 962278704, + 217962453, + 3294496384, + 3384851927, + 25420943, + 4105286313, + 2868422693, + 2384230314, + 3953278441, + 3125132598, + 2200605504, + 3333622184, + 2984779563, + 3010526212, + 2155306553, + 2768847780, + 320270368, + 28839809, + 2223617327, + 646086920, + 2095462841, + 644897195, + 1132862536, + 2256280000, + 1599064275, + 354500194, + 92829515, + 1740222147, + 3650778127, + 2389774502, + 3109060761, + 1131299478, + 1088562775, + 3612711203, + 3437301132, + 746625117, + ]; + + static const List _envieddatasss_encryptionSalt = [ + 1519183167, + 3350107811, + 1282330196, + 3521294262, + 693190626, + 1030272619, + 3460445823, + 640653153, + 2574214019, + 187640289, + 2785148003, + 1058237652, + 1707125353, + 400767544, + 729216563, + 1555355730, + 3646818322, + 3331849432, + 1726927486, + 812452655, + 2522660777, + 3701662277, + 1234180910, + 2324501621, + 3805189310, + 2448427463, + 1959309247, + 962278756, + 217962427, + 3294496451, + 3384851950, + 25421015, + 4105286363, + 2868422749, + 2384230349, + 3953278396, + 3125132659, + 2200605497, + 3333622270, + 2984779642, + 3010526285, + 2155306572, + 2768847762, + 320270452, + 28839880, + 2223617387, + 646086972, + 2095462856, + 644897275, + 1132862588, + 2256279942, + 1599064198, + 354500151, + 92829498, + 1740222124, + 3650778204, + 2389774483, + 3109060801, + 1131299556, + 1088562703, + 3612711247, + 3437301198, + 746625073, + ]; + + static final String sss_encryptionSalt = String.fromCharCodes( + List.generate( + _envieddatasss_encryptionSalt.length, + (int i) => i, + growable: false, + ).map((int i) => + _envieddatasss_encryptionSalt[i] ^ _enviedkeysss_encryptionSalt[i])); + + static const List _enviedkeysss_pass = [ + 3865703878, + 1851968517, + 1772290745, + 1971561729, + 1196593385, + 3111149423, + 2469198566, + 701371499, + 2019714711, + 4040933535, + 275439759, + 1320043078, + 4068200971, + 1298959801, + 2248523887, + 168219730, + 3264411399, + 3615715021, + 2706095985, + 3007047176, + 2129887018, + 2976765127, + 3293924465, + 4275061370, + 2968038704, + 1508122571, + 2827192242, + 3165212251, + 3439504231, + 2330375399, + 196757856, + 936409364, + ]; + + static const List _envieddatasss_pass = [ + 3865703857, + 1851968628, + 1772290775, + 1971561836, + 1196593304, + 3111149342, + 2469198485, + 701371393, + 2019714798, + 4040933609, + 275439864, + 1320043056, + 4068201009, + 1298959831, + 2248523806, + 168219680, + 3264411498, + 3615714964, + 2706095931, + 3007047256, + 2129887082, + 2976765174, + 3293924422, + 4275061321, + 2968038663, + 1508122611, + 2827192298, + 3165212201, + 3439504191, + 2330375307, + 196757794, + 936409464, + ]; + + static final String sss_pass = String.fromCharCodes(List.generate( + _envieddatasss_pass.length, + (int i) => i, + growable: false, + ).map((int i) => _envieddatasss_pass[i] ^ _enviedkeysss_pass[i])); + + static const List _enviedkeyaddd = [ + 103743231, + 1651712580, + 3787002226, + 1668911437, + 3340099680, + 1954702736, + ]; + + static const List _envieddataaddd = [ + 103743165, + 1651712552, + 3787002160, + 1668911393, + 3340099630, + 1954702844, + ]; + + static final String addd = String.fromCharCodes(List.generate( + _envieddataaddd.length, + (int i) => i, + growable: false, + ).map((int i) => _envieddataaddd[i] ^ _enviedkeyaddd[i])); + + static const List _enviedkeypassnpassenger = [ + 1667939497, + 3030532290, + 512235273, + 1246739739, + 1322556395, + 3812185560, + 207798604, + 725503233, + 953949412, + 51208264, + 635023425, + 3955769699, + 3590245687, + ]; + + static const List _envieddatapassnpassenger = [ + 1667939521, + 3030532256, + 512235374, + 1246739833, + 1322556290, + 3812185516, + 207798574, + 725503321, + 953949334, + 51208208, + 635023411, + 3955769633, + 3590245701, + ]; + + static final String passnpassenger = String.fromCharCodes(List.generate( + _envieddatapassnpassenger.length, + (int i) => i, + growable: false, + ).map((int i) => _envieddatapassnpassenger[i] ^ _enviedkeypassnpassenger[i])); + + static const List _enviedkeynewId = [ + 4159278390, + 2770117670, + 1198028629, + ]; + + static const List _envieddatanewId = [ + 4159278424, + 2770117699, + 1198028578, + ]; + + static final String newId = String.fromCharCodes(List.generate( + _envieddatanewId.length, + (int i) => i, + growable: false, + ).map((int i) => _envieddatanewId[i] ^ _enviedkeynewId[i])); + + static const List _enviedkeyallowed = [ + 4023085610, + 2924250902, + 3166904704, + 2376980933, + 3213104559, + 814164845, + 2313024996, + 654720117, + 3926211393, + 1160205279, + 63955773, + 370711532, + ]; + + static const List _envieddataallowed = [ + 4023085694, + 2924250980, + 3166904809, + 2376980917, + 3213104597, + 814164777, + 2313024918, + 654720028, + 3926211383, + 1160205242, + 63955791, + 370711510, + ]; + + static final String allowed = String.fromCharCodes(List.generate( + _envieddataallowed.length, + (int i) => i, + growable: false, + ).map((int i) => _envieddataallowed[i] ^ _enviedkeyallowed[i])); + + static const List _enviedkeyallowedWallet = [ + 1927624979, + 1845017790, + 4231102437, + 1325126951, + 989812008, + 2556314514, + 2491921000, + 3384009027, + 2444271481, + 2408042274, + 3526762830, + 2026929828, + ]; + + static const List _envieddataallowedWallet = [ + 1927625031, + 1845017804, + 4231102348, + 1325126999, + 989812050, + 2556314565, + 2491920905, + 3384009007, + 2444271381, + 2408042311, + 3526762810, + 2026929822, + ]; + + static final String allowedWallet = String.fromCharCodes(List.generate( + _envieddataallowedWallet.length, + (int i) => i, + growable: false, + ).map((int i) => _envieddataallowedWallet[i] ^ _enviedkeyallowedWallet[i])); +} diff --git a/siro_driver/lib/firebase_options.dart b/siro_driver/lib/firebase_options.dart new file mode 100644 index 0000000..ccb630d --- /dev/null +++ b/siro_driver/lib/firebase_options.dart @@ -0,0 +1,67 @@ +// File generated by FlutterFire CLI. +// ignore_for_file: type=lint +import 'package:firebase_core/firebase_core.dart' show FirebaseOptions; +import 'package:flutter/foundation.dart' + show defaultTargetPlatform, kIsWeb, TargetPlatform; + +/// Default [FirebaseOptions] for use with your Firebase apps. +/// +/// Example: +/// ```dart +/// import 'firebase_options.dart'; +/// // ... +/// await Firebase.initializeApp( +/// options: DefaultFirebaseOptions.currentPlatform, +/// ); +/// ``` +class DefaultFirebaseOptions { + static FirebaseOptions get currentPlatform { + if (kIsWeb) { + throw UnsupportedError( + 'DefaultFirebaseOptions have not been configured for web - ' + 'you can reconfigure this by running the FlutterFire CLI again.', + ); + } + switch (defaultTargetPlatform) { + case TargetPlatform.android: + return android; + case TargetPlatform.iOS: + return ios; + case TargetPlatform.macOS: + throw UnsupportedError( + 'DefaultFirebaseOptions have not been configured for macos - ' + 'you can reconfigure this by running the FlutterFire CLI again.', + ); + case TargetPlatform.windows: + throw UnsupportedError( + 'DefaultFirebaseOptions have not been configured for windows - ' + 'you can reconfigure this by running the FlutterFire CLI again.', + ); + case TargetPlatform.linux: + throw UnsupportedError( + 'DefaultFirebaseOptions have not been configured for linux - ' + 'you can reconfigure this by running the FlutterFire CLI again.', + ); + default: + throw UnsupportedError( + 'DefaultFirebaseOptions are not supported for this platform.', + ); + } + } + + static const FirebaseOptions android = FirebaseOptions( + apiKey: 'AIzaSyAEoply_UcEP6KaCu_ziCy_ZDIjAKvi7b8', + appId: '1:825988584191:android:4525a21b00173d361632ca', + messagingSenderId: '825988584191', + projectId: 'siro-a6957', + storageBucket: 'siro-a6957.firebasestorage.app', + ); + static const FirebaseOptions ios = FirebaseOptions( + apiKey: 'AIzaSyDk6x6KZUY0IQtxoCMXX0F7N_yik8O19eA', + appId: '1:825988584191:ios:4002b88e618f0c4e1632ca', + messagingSenderId: '825988584191', + projectId: 'siro-a6957', + storageBucket: 'siro-a6957.firebasestorage.app', + iosBundleId: 'com.siro.driver', + ); +} diff --git a/siro_driver/lib/main.dart b/siro_driver/lib/main.dart new file mode 100755 index 0000000..3872e16 --- /dev/null +++ b/siro_driver/lib/main.dart @@ -0,0 +1,553 @@ +import 'dart:async'; +import 'dart:convert'; +import 'dart:io'; + +import 'package:flutter/material.dart'; +import 'package:flutter/services.dart'; +import 'package:get/get.dart'; +import 'package:get_storage/get_storage.dart'; +import 'package:intl/date_symbol_data_local.dart'; +import 'package:siro_driver/constant/box_name.dart'; +import 'package:trip_overlay_plugin/trip_overlay_plugin.dart'; +import 'package:wakelock_plus/wakelock_plus.dart'; + +import 'package:firebase_core/firebase_core.dart'; +import 'package:firebase_messaging/firebase_messaging.dart'; +import 'package:flutter_local_notifications/flutter_local_notifications.dart'; +import 'package:flutter_secure_storage/flutter_secure_storage.dart'; +import 'package:permission_handler/permission_handler.dart'; +import 'package:device_info_plus/device_info_plus.dart'; + +import 'constant/api_key.dart'; +import 'constant/info.dart'; +import 'constant/links.dart'; +import 'controller/firebase/firbase_messge.dart'; +import 'controller/firebase/local_notification.dart'; +import 'controller/functions/background_service.dart'; +import 'controller/functions/crud.dart'; +import 'controller/home/captin/home_captain_controller.dart'; +import 'controller/local/local_controller.dart'; +import 'controller/local/translations.dart'; +import 'firebase_options.dart'; +import 'models/db_sql.dart'; +import 'print.dart'; +import 'splash_screen_page.dart'; +import 'views/home/Captin/orderCaptin/order_request_page.dart'; +import 'views/home/Captin/driver_map_page.dart'; +import 'controller/profile/setting_controller.dart'; +import 'controller/voice_call_controller.dart'; + +final box = GetStorage(); +const storage = FlutterSecureStorage(); +DbSql sql = DbSql.instance; +final GlobalKey navigatorKey = GlobalKey(); +const platform = MethodChannel('com.intaleq_driver/app_control'); + +const String backgroundServiceChannelId = 'driver_service_channel'; +const String locationServiceChannelId = 'location_service_channel'; +const String geolocatorChannelId = 'geolocator_channel'; + +Future initFirebaseIfNeeded() async { + if (Firebase.apps.isEmpty) { + await Firebase.initializeApp( + options: DefaultFirebaseOptions.currentPlatform); + } else { + Firebase.app(); + } +} + +Future requestNotificationPermission() async { + if (Platform.isAndroid) { + try { + final androidInfo = await DeviceInfoPlugin().androidInfo; + if (androidInfo.version.sdkInt >= 33) { + final status = await Permission.notification.request(); + if (status.isGranted) return true; + if (status.isDenied) return false; + if (status.isPermanentlyDenied) { + await openAppSettings(); + return false; + } + } else { + return true; + } + } catch (e) { + print('❌ Error requesting notification permission: $e'); + return false; + } + } + return true; +} + +Future createAllNotificationChannels() async { + if (!Platform.isAndroid) return; + final FlutterLocalNotificationsPlugin flutterLocalNotificationsPlugin = + FlutterLocalNotificationsPlugin(); + + const AndroidNotificationChannel backgroundChannel = + AndroidNotificationChannel(backgroundServiceChannelId, 'خدمة السائق', + description: 'استقبال الطلبات في الخلفية', + importance: Importance.low, + playSound: false, + enableVibration: false, + showBadge: false); + const AndroidNotificationChannel locationChannel = AndroidNotificationChannel( + locationServiceChannelId, 'خدمة الموقع', + description: 'تتبع موقع السائق', + importance: Importance.low, + playSound: false, + enableVibration: false, + showBadge: false); + const AndroidNotificationChannel geolocatorChannel = + AndroidNotificationChannel(geolocatorChannelId, 'تحديد الموقع', + description: 'خدمة تحديد الموقع الجغرافي', + importance: Importance.low, + playSound: false, + enableVibration: false, + showBadge: false); + + try { + await flutterLocalNotificationsPlugin + .resolvePlatformSpecificImplementation< + AndroidFlutterLocalNotificationsPlugin>() + ?.createNotificationChannel(backgroundChannel); + await flutterLocalNotificationsPlugin + .resolvePlatformSpecificImplementation< + AndroidFlutterLocalNotificationsPlugin>() + ?.createNotificationChannel(locationChannel); + await flutterLocalNotificationsPlugin + .resolvePlatformSpecificImplementation< + AndroidFlutterLocalNotificationsPlugin>() + ?.createNotificationChannel(geolocatorChannel); + } catch (e) { + print('❌ Error creating notification channels: $e'); + } +} + +// ============================================================================== +// 🔴 دوال مساعدة 🔴 +// ============================================================================== +String _getVal(List data, int index) { + if (data.length > index && data[index] != null) { + return data[index].toString(); + } + return ''; +} + +Future _processRejectOrderBackground(List data) async { + try { + final box = GetStorage(); + final driverId = box.read(BoxName.driverID); + String orderId = _getVal(data, 16); + + if (driverId != null && orderId.isNotEmpty) { + print("📤 Rejecting Order: $orderId"); + await CRUD().post(link: AppLink.addDriverOrder, payload: { + 'driver_id': driverId, + 'order_id': orderId, + 'status': 'Refused' + }); + print("✅ Order Rejected Silently!"); + } + } catch (e) { + print("❌ Error rejecting order: $e"); + } +} + +// ============================================================================== +// 🔴 التعامل مع الإشعارات في الخلفية 🔴 +// ============================================================================== +@pragma('vm:entry-point') +Future backgroundMessageHandler(RemoteMessage message) async { + WidgetsFlutterBinding.ensureInitialized(); + await GetStorage.init(); + + await TripOverlayPlugin.initialize(); + + // 🔴 الاستماع لزر الرفض في الخلفية باستخدام storage 🔴 + TripOverlayPlugin.onTripRejected.listen((tripId) async { + print("❌ [Background] Overlay Reject Clicked!"); + String? savedTrip = await storage.read(key: 'pending_driver_list'); + if (savedTrip != null) { + await storage.delete(key: 'pending_driver_list'); + List driverList = jsonDecode(savedTrip); + await _processRejectOrderBackground(driverList); + } + }); + + final NotificationController notificationController = + NotificationController(); + await notificationController.initNotifications(); + + String? title = message.data['title'] ?? message.notification?.title; + String? body = message.data['body'] ?? message.notification?.body; + String? myListString = message.data['DriverList']; + String? category = message.data['category'] ?? message.data['type']; + + if (title != null && body != null && myListString != null) { + notificationController.showOrderNotification( + title, body, 'ding.wav', myListString); + + if (category == 'Order' || category == 'OrderSpeed' || category == null) { + List myList = []; + try { + myList = jsonDecode(myListString); + } catch (e) {} + + String orderId = message.data['order_id']?.toString() ?? ''; + if (orderId.isEmpty && myList.isNotEmpty) orderId = myList[0].toString(); + + double fare = 0.0; + double distance = 0.0; + String passengerName = title; + String pickup = 'موقع الانطلاق'; + String dropoff = 'موقع الوصول'; + double pLat = 0.0; + double pLng = 0.0; + + if (myList.isNotEmpty && myList.length > 29) { + fare = double.tryParse(myList[26].toString()) ?? 0.0; + distance = double.tryParse(myList[11].toString()) ?? 0.0; + passengerName = myList[8].toString(); + pickup = myList[29].toString(); + dropoff = myList[30].toString(); + + // 🔴 استخراج الإحداثيات للخريطة (تأكد من الاندكس الخاص بخطوط الطول والعرض في مصفوفتك) + pLat = double.tryParse(myList[0].toString()) ?? 0.0; + pLng = double.tryParse(myList[1].toString()) ?? 0.0; + } + + final tripData = TripData( + tripId: orderId, + passengerName: passengerName, + pickupAddress: pickup, + dropoffAddress: dropoff, + distanceKm: distance, + estimatedFare: fare, + estimatedMinutes: 0, + pickupLat: pLat, // تمرير خط العرض + pickupLng: pLng, // تمرير خط الطول + ); + + bool isAppInForeground = box.read(BoxName.isAppInForeground) ?? false; + + if (!isAppInForeground) { + await TripOverlayPlugin.showOverlay(tripData, autoCloseSeconds: 15); + } + + // 🔴 الكتابة على القرص مباشرة بدلاً من الرام لضمان انتقالها للتطبيق 🔴 + await storage.write(key: 'pending_driver_list', value: myListString); + } + } +} + +@pragma('vm:entry-point') +void notificationTapBackground(NotificationResponse notificationResponse) { + NotificationController().handleNotificationResponse(notificationResponse); +} + +void main() { + runZonedGuarded(() async { + WidgetsFlutterBinding.ensureInitialized(); + await initFirebaseIfNeeded(); + await WakelockPlus.enable(); + await GetStorage.init(); + await initializeDateFormatting(); + await SystemChrome.setPreferredOrientations( + [DeviceOrientation.portraitUp, DeviceOrientation.portraitDown]); + + await requestNotificationPermission(); + await TripOverlayPlugin.initialize(); + await createAllNotificationChannels(); + await BackgroundServiceHelper.initialize(); + + FirebaseMessaging.onBackgroundMessage(backgroundMessageHandler); + runApp(const MyApp()); + }, (error, stack) { + final errorString = error.toString(); + if (!errorString.contains('PERMISSION_DENIED') && + !errorString.contains('FormatException') && + !errorString.contains('Null check operator')) { + CRUD.addError(error.toString(), stack.toString(), 'main'); + } + }); +} + +class MyApp extends StatefulWidget { + const MyApp({Key? key}) : super(key: key); + @override + _MyAppState createState() => _MyAppState(); +} + +class _MyAppState extends State with WidgetsBindingObserver { + @override + void initState() { + super.initState(); + WidgetsBinding.instance.addObserver(this); + _initApp(); + // 🔥 التقاط رسالة القبول من الأندرويد بشكل مباشر 100% 🔥 + const platformAppControl = MethodChannel('com.intaleq_driver/app_control'); + platformAppControl.setMethodCallHandler((call) async { + if (call.method == 'onOverlayTripAccepted') { + print("✅ [Native Intent] تم التقاط زر القبول بنجاح من الأندرويد!"); + + // 🔴 القراءة من القرص مباشرة (يعمل بنجاح بين الـ Isolates) 🔴 + String? savedTrip = await storage.read(key: 'pending_driver_list'); + + if (savedTrip != null && savedTrip.isNotEmpty) { + await storage.delete(key: 'pending_driver_list'); + List driverList = jsonDecode(savedTrip); + + // تنفيذ دالة القبول فوراً + await _processAcceptOrder(driverList); + } else { + print("⚠️ خطأ: لم يتم العثور على بيانات الطلب في الذاكرة!"); + } + } + }); + } + + @override + void dispose() { + WidgetsBinding.instance.removeObserver(this); + super.dispose(); + } + + Future _initApp() async { + try { + if (!Get.isRegistered()) { + Get.put(NotificationController()); + } + if (!Get.isRegistered()) { + Get.put(FirebaseMessagesController()).getToken(); + } + if (!Get.isRegistered()) { + Get.put(SettingController()); + } + if (!Get.isRegistered()) { + Get.lazyPut(() => VoiceCallController(), fenix: true); + } + await FirebaseMessaging.instance.requestPermission(); + await NotificationController().initNotifications(); + + await TripOverlayPlugin.initialize(); + bool isOverlayGranted = await TripOverlayPlugin.isPermissionGranted(); + if (!isOverlayGranted) { + await TripOverlayPlugin.requestPermission(); + } + + // 🔴 أعدنا الاستماع لأزرار النافذة إلى هنا (المكان الصحيح الذي لا يموت) 🔴 + _listenToOverlayEvents(); + } catch (e) { + Log.print("Error during _initApp: $e"); + } + } + + // ============================================================================== + // 🔴 الاستماع الحي لأزرار النافذة 🔴 + // ============================================================================== + void _listenToOverlayEvents() { + TripOverlayPlugin.onTripAccepted.listen((result) async { + Log.print('✅ [Main Isolate] Trip ACCEPTED via Overlay: ${result.tripId}'); + final savedTrip = box.read('pending_overlay_trip'); + + if (savedTrip != null) { + List driverList = jsonDecode(savedTrip['driverList']); + box.remove('pending_overlay_trip'); // مسح حتى لا يتكرر + + // تنفيذ قبول الطلب فوراً! + await _processAcceptOrder(driverList); + } + }); + + TripOverlayPlugin.onTripRejected.listen((tripId) async { + Log.print('❌ [Main Isolate] Trip REJECTED via Overlay: $tripId'); + final savedTrip = box.read('pending_overlay_trip'); + + if (savedTrip != null) { + List driverList = jsonDecode(savedTrip['driverList']); + box.remove('pending_overlay_trip'); + + // تنفيذ الرفض الصامت + await _processRejectOrderBackground(driverList); + } + }); + } + + // ============================================================================== + // 🔴 التحكم بتوجيه التطبيق عند فتحه 🔴 + // ============================================================================== + @override + void didChangeAppLifecycleState(AppLifecycleState state) { + if (state == AppLifecycleState.resumed) { + box.write(BoxName.isAppInForeground, true); + // تأخير بسيط جداً، لكي نعطي فرصة لـ _listenToOverlayEvents لتعمل أولاً إذا كان الفتح بسبب زر "قبول" + Future.delayed(const Duration(milliseconds: 500), () { + _checkPendingTrip(); + }); + } else if (state == AppLifecycleState.paused || + state == AppLifecycleState.inactive) { + box.write(BoxName.isAppInForeground, false); + } + } + + void _checkPendingTrip() async { + // 🔴 القراءة من القرص مباشرة 🔴 + String? savedTrip = await storage.read(key: 'pending_driver_list'); + + if (savedTrip != null && savedTrip.isNotEmpty) { + if (Get.currentRoute == '/') { + print('⏳ App is still on Splash screen. Postponing notification trip navigation to HomeCaptainController.'); + return; + } + await storage.delete(key: 'pending_driver_list'); + List driverList = jsonDecode(savedTrip); + + print('👀 التطبيق فتح من الإشعار أو يدوياً، توجيه لصفحة الطلب...'); + Get.toNamed('/OrderRequestPage', arguments: { + 'myListString': savedTrip, + 'DriverList': driverList, + 'body': 'طلب جديد' + }); + } + } + + // ============================================================================== + // 🟢 دوال معالجة قبول الطلب وتجهيز المتغيرات 🟢 + // ============================================================================== + Future _processAcceptOrder(List data) async { + Get.dialog( + WillPopScope( + onWillPop: () async => false, + child: + const Center(child: CircularProgressIndicator(color: Colors.white)), + ), + barrierDismissible: false, + ); + + try { + final driverId = box.read(BoxName.driverID); + String orderId = _getVal(data, 16); + String passengerToken = _getVal(data, 9); + + print("🚀 Sending Accept Request for Order: $orderId"); + + var res = await CRUD().post( + link: "${AppLink.ride}/rides/acceptRide.php", + payload: { + 'id': orderId, + 'rideTimeStart': DateTime.now().toString(), + 'status': 'Apply', + 'passengerToken': passengerToken, + 'driver_id': driverId, + }, + ); + + print("📥 Server Response: $res"); + + // إغلاق أي ديالوج مفتوح باستخدام المفتاح العالمي لضمان الموثوقية + if (Get.isDialogOpen == true) { + navigatorKey.currentState?.pop(); + } + + bool isFailure = false; + if (res is Map && res['status'] == 'failure') { + isFailure = true; + } else if (res == 'failure') isFailure = true; + + if (isFailure) { + Get.defaultDialog( + title: "تنبيه", + middleText: "عذراً، الطلب أخذه سائق آخر.", + confirmTextColor: Colors.white, + onConfirm: () => Get.back(), + textConfirm: "حسناً", + ); + return; + } + + if (!Get.isRegistered()) { + Get.put(HomeCaptainController(), permanent: true); + } else { + Get.find().changeRideId(); + } + + box.write(BoxName.statusDriverLocation, 'on'); + box.write(BoxName.rideStatus, 'Apply'); + + var rideArgs = _buildRideArgs(data); + box.write(BoxName.rideArguments, rideArgs); + + Get.offAll(() => PassengerLocationMapPage(), arguments: rideArgs); + } catch (e) { + if (Get.isDialogOpen == true) { + navigatorKey.currentState?.pop(); + } + print("❌ Error in accept process: $e"); + Get.snackbar("خطأ", "حدث خطأ غير متوقع"); + } + } + + Map _buildRideArgs(List data) { + return { + 'passengerLocation': '${_getVal(data, 0)},${_getVal(data, 1)}', + 'passengerDestination': '${_getVal(data, 3)},${_getVal(data, 4)}', + 'Duration': _getVal(data, 4), + 'totalCost': _getVal(data, 26), + 'Distance': _getVal(data, 5), + 'name': _getVal(data, 8), + 'phone': _getVal(data, 10), + 'email': _getVal(data, 28), + 'WalletChecked': _getVal(data, 13), + 'tokenPassenger': _getVal(data, 9), + 'direction': + 'https://www.google.com/maps/dir/${_getVal(data, 0)}/${_getVal(data, 1)}/', + 'DurationToPassenger': _getVal(data, 15), + 'rideId': _getVal(data, 16), + 'passengerId': _getVal(data, 7), + 'driverId': _getVal(data, 18), + 'durationOfRideValue': _getVal(data, 19), + 'paymentAmount': _getVal(data, 2), + 'paymentMethod': _getVal(data, 13) == 'true' ? 'visa' : 'cash', + 'isHaveSteps': _getVal(data, 20), + 'step0': _getVal(data, 21), + 'step1': _getVal(data, 22), + 'step2': _getVal(data, 23), + 'step3': _getVal(data, 24), + 'step4': _getVal(data, 25), + 'passengerWalletBurc': _getVal(data, 26), + 'timeOfOrder': DateTime.now().toString(), + 'totalPassenger': _getVal(data, 2), + 'carType': _getVal(data, 31), + 'kazan': _getVal(data, 32), + 'startNameLocation': _getVal(data, 29), + 'endNameLocation': _getVal(data, 30), + }; + } + + @override + Widget build(BuildContext context) { + final LocaleController localController = Get.put(LocaleController()); + final SettingController settingController = Get.put(SettingController()); + + return GetMaterialApp( + navigatorKey: navigatorKey, + title: AppInformation.appName, + translations: MyTranslation(), + debugShowCheckedModeBanner: false, + locale: localController.language, + theme: localController.lightTheme, + darkTheme: localController.darkTheme, + themeMode: + settingController.isDarkMode ? ThemeMode.dark : ThemeMode.light, + initialRoute: '/', + getPages: [ + GetPage(name: '/', page: () => SplashScreen()), + GetPage(name: '/OrderRequestPage', page: () => OrderRequestPage()), + GetPage( + name: '/passenger-location-map', + page: () => PassengerLocationMapPage()), + ], + ); + } +} diff --git a/siro_driver/lib/models/ai_query.sql b/siro_driver/lib/models/ai_query.sql new file mode 100755 index 0000000..c2e7b7b --- /dev/null +++ b/siro_driver/lib/models/ai_query.sql @@ -0,0 +1,154 @@ +-- Retrieving data for a specific passenger complaint: +SELECT + c.id AS complaint_id, + r.id AS ride_id, + p.id AS passenger_id, + p.first_name, + p.last_name, + p.phone, + p.email, + c.complaint_type, + c.description, + c.date_filed, + c.statusComplaint AS complaint_status, + c.resolution, + c.date_resolved +FROM + complaint c +JOIN ride r ON + c.ride_id = r.id +JOIN `passengers` p ON + c.passenger_id = p.id +WHERE + c.complaint_type = 'Passenger' AND c.passenger_id = '100393163265770158312'; + + -- Admin panel dashboard +SELECT + COALESCE(( + SELECT + COUNT(`email`) + FROM + `passengers` + ), 0) AS countPassengers, + COALESCE(( + SELECT + COUNT(`email`) + FROM + `driver` + ), 0) AS countDriver, + COALESCE(( + SELECT + COUNT(`id`) + FROM + `ride` + ), 0) AS countRide, + COALESCE(( + SELECT + COUNT(`id`) + FROM + `passengers` + WHERE + `passengers`.`created_at` BETWEEN DATE_FORMAT(CURRENT_DATE, '%Y-%m-01') AND LAST_DAY(CURRENT_DATE) + ), 0) AS countPassengersThisMonth, + COALESCE(( + SELECT + COUNT(`id`) + FROM + `ride` + WHERE + `ride`.`created_at` BETWEEN DATE_FORMAT(CURRENT_DATE, '%Y-%m-01') AND LAST_DAY(CURRENT_DATE) + ), 0) AS countRideThisMonth, + COALESCE(( + SELECT + COUNT(`id`) + FROM + `driver` + WHERE + `driver`.`created_at` BETWEEN DATE_FORMAT(CURRENT_DATE, '%Y-%m-01') AND LAST_DAY(CURRENT_DATE) + ), 0) AS countDriverThisMonth, + COALESCE(( + SELECT + COUNT(`id`) + FROM + `CarRegistration` + WHERE + `CarRegistration`.`created_at` BETWEEN DATE_FORMAT(CURRENT_DATE, '%Y-%m-01') AND LAST_DAY(CURRENT_DATE) + ), 0) AS countCarRegistrationThisMonth, + COALESCE(( + SELECT + COUNT(`id`) + FROM + `complaint` + WHERE + `complaint`.`date_filed` BETWEEN DATE_FORMAT(CURRENT_DATE, '%Y-%m-01') AND LAST_DAY(CURRENT_DATE) + ), 0) AS countComplaintThisMonth, + COALESCE(( + SELECT + COUNT(`id`) + FROM + `complaint` + WHERE + `complaint`.`date_filed` BETWEEN DATE_FORMAT( + DATE_SUB( + CURRENT_DATE, + INTERVAL WEEKDAY(CURRENT_DATE) DAY + ), + '%Y-%m-%d' + ) AND DATE_FORMAT( + DATE_ADD( + DATE_SUB( + CURRENT_DATE, + INTERVAL WEEKDAY(CURRENT_DATE) DAY + ), + INTERVAL 6 DAY + ), + '%Y-%m-%d' + ) + ), 0) AS countComplaintThisWeek, + COALESCE(( + SELECT + COUNT(`id`) + FROM + `complaint` + WHERE + `complaint`.`date_filed` BETWEEN DATE_FORMAT(CURRENT_DATE, '%Y-%m-%d') AND DATE_FORMAT(CURRENT_DATE, '%Y-%m-%d') + ), 0) AS countComplaintToday, + COALESCE(( + SELECT + SUM(`payments`.`amount`) + FROM + `payments` + WHERE + `payments`.`created_at` BETWEEN DATE_FORMAT(CURRENT_DATE, '%Y-%m-01') AND LAST_DAY(CURRENT_DATE) + AND + `payments`.`payment_method` IN('visa-in', 'visa', 'visaRide', 'TransferFrom', 'payout', 'TransferTo') + ), 0) AS payments, + COALESCE(( + SELECT + SUM(`driverWallet`.`amount`) + FROM + `driverWallet` + WHERE + `driverWallet`.`dateCreated` BETWEEN DATE_FORMAT(CURRENT_DATE, '%Y-%m-01') AND LAST_DAY(CURRENT_DATE) + AND + `driverWallet`.`paymentMethod` IN('visa', '') + ), 0) AS driverWallet, + COALESCE(( + SELECT + SUM(`passengerWallet`.`balance`) + FROM + `passengerWallet` + WHERE + `passengerWallet`.`created_at` BETWEEN DATE_FORMAT(CURRENT_DATE, '%Y-%m-01') AND LAST_DAY(CURRENT_DATE) + ), 0) AS passengerWallet, + COALESCE(( + SELECT + SUM(`seferWallet`.`amount`) + FROM + `seferWallet` + WHERE + `seferWallet`.`createdAt` BETWEEN DATE_FORMAT(CURRENT_DATE, '%Y-%m-01') AND LAST_DAY(CURRENT_DATE) + ), 0) AS seferWallet +FROM + `passengers` +LIMIT 1; \ No newline at end of file diff --git a/siro_driver/lib/models/db_sql.dart b/siro_driver/lib/models/db_sql.dart new file mode 100755 index 0000000..3769c4d --- /dev/null +++ b/siro_driver/lib/models/db_sql.dart @@ -0,0 +1,171 @@ +import 'package:siro_driver/constant/table_names.dart'; +import 'package:sqflite/sqflite.dart'; +import 'package:path/path.dart'; + +class DbSql { + static final DbSql instance = DbSql._(); + + static Database? _database; + + DbSql._(); + + Future get database async { + if (_database != null) return _database!; + _database = await _initDatabase(); + return _database!; + } + + Future _initDatabase() async { + String path = join(await getDatabasesPath(), 'my_database.db'); + return await openDatabase( + path, + version: 3, + onCreate: (db, version) async => await _createTables(db), + onUpgrade: (db, oldVersion, newVersion) async => await _createTables(db), + ); + } + + Future _createTables(Database db) async { + await db.execute(''' + CREATE TABLE IF NOT EXISTS ${TableName.carLocations}( + id INTEGER PRIMARY KEY AUTOINCREMENT, + driver_id TEXT, + latitude REAL, + longitude REAL, + created_at TEXT, + updated_at TEXT + ) + '''); + await db.execute(''' + CREATE TABLE IF NOT EXISTS ${TableName.placesFavorite}( + id INTEGER PRIMARY KEY AUTOINCREMENT, + latitude REAL, + longitude REAL, + name TEXT UNIQUE, + rate TEXT + ) + '''); + await db.execute(''' + CREATE TABLE IF NOT EXISTS ${TableName.recentLocations}( + id INTEGER PRIMARY KEY AUTOINCREMENT, + latitude REAL, + longitude REAL, + name TEXT , + rate TEXT + ) + '''); + await db.execute(''' + CREATE TABLE IF NOT EXISTS ${TableName.driverOrdersRefuse}( + id INTEGER PRIMARY KEY AUTOINCREMENT, + order_id TEXT UNIQUE, + created_at TEXT, + driver_id TEXT + ) + '''); + await db.execute(''' + CREATE TABLE IF NOT EXISTS ${TableName.rideLocation}( + id INTEGER PRIMARY KEY AUTOINCREMENT, + order_id TEXT , + created_at TEXT, + lat TEXT, + lng TEXT + ) + '''); + await db.execute(''' + CREATE TABLE IF NOT EXISTS ${TableName.faceDetectTimes}( + id INTEGER PRIMARY KEY AUTOINCREMENT, + faceDetectTimes INTEGER + ) + '''); + + await db.execute(''' + CREATE TABLE IF NOT EXISTS ${TableName.behavior} ( + id INTEGER PRIMARY KEY AUTOINCREMENT, + driver_id TEXT, + latitude REAL, + longitude REAL, + acceleration REAL, + created_at TEXT, + updated_at TEXT + ); + '''); + await db.execute(''' + CREATE TABLE IF NOT EXISTS ${TableName.captainNotification}( + id INTEGER PRIMARY KEY AUTOINCREMENT, + faceDetectTimes INTEGER + ) + '''); + await db.execute(''' + CREATE TABLE IF NOT EXISTS ${TableName.applyRideFromOverLay}( + id INTEGER PRIMARY KEY AUTOINCREMENT, + start_location_lat TEXT, + start_location_lng TEXT, + end_location_lat TEXT, + end_location_lng TEXT, + total_passenger TEXT, + total_driver TEXT, + duration_to_ride TEXT, + distance TEXT, + driver_id TEXT, + passenger_id TEXT, + passenger_name TEXT, + passenger_token_fcm TEXT, + passenger_phone TEXT, + duration_by_passenger TEXT, + distance_by_passenger TEXT, + is_wallet_checked TEXT, + driver_token TEXT, + duration_to_passenger TEXT, + ride_id TEXT, + ride_timer_begin TEXT, + driver_id_duplicate TEXT, + duration_to_ride_duplicate TEXT, + way_points TEXT, + place_coordinate_0 TEXT, + place_coordinate_1 TEXT, + place_coordinate_2 TEXT, + place_coordinate_3 TEXT, + place_coordinate_4 TEXT, + cost_for_driver TEXT, + passenger_wallet_total TEXT, + passenger_email TEXT, + start_name_address TEXT, + end_name_address TEXT, + car_type TEXT, + kazan TEXT, + passenger_rate TEXT + ) +'''); + } + + Future>> getAllData(String table) async { + Database db = await instance.database; + return await db.query(table); + } + + Future>> getCustomQuery(String query) async { + Database db = await instance.database; + return await db.rawQuery(query); + } + + Future insertData(Map map, String table) async { + Database db = await instance.database; + return await db.insert(table, map); + } + + Future updateData(Map map, String table, int id) async { + Database db = await instance.database; + + return await db.update(table, map, where: 'id = ?', whereArgs: [id]); + } + + Future deleteData(String table, int id) async { + Database db = await instance.database; + return await db.delete(table, where: 'id = ?', whereArgs: [id]); + } + + Future deleteAllData(String table) async { + Database db = await instance.database; + return await db.delete(table); + } +} diff --git a/siro_driver/lib/models/model/admin/monthly_ride.dart b/siro_driver/lib/models/model/admin/monthly_ride.dart new file mode 100755 index 0000000..df4d600 --- /dev/null +++ b/siro_driver/lib/models/model/admin/monthly_ride.dart @@ -0,0 +1,21 @@ +class MonthlyDataModel { + final int year; + final int month; + final int day; + final int ridesCount; + + MonthlyDataModel({ + required this.year, + required this.month, + required this.day, + required this.ridesCount, + }); + + factory MonthlyDataModel.fromJson(Map json) => + MonthlyDataModel( + year: json['year'] as int, + month: json['month'] as int, + day: json['day'] as int, + ridesCount: json['rides_count'] as int, + ); +} diff --git a/siro_driver/lib/models/model/admin/passenger_model.dart b/siro_driver/lib/models/model/admin/passenger_model.dart new file mode 100755 index 0000000..ed920bb --- /dev/null +++ b/siro_driver/lib/models/model/admin/passenger_model.dart @@ -0,0 +1,79 @@ +class Passenger { + String id; + String phone; + String email; + String gender; + String status; + String birthdate; + String site; + String firstName; + String lastName; + String sosPhone; + String education; + String employmentType; + String maritalStatus; + String createdAt; + String updatedAt; + int countPassenger; + int countFeedback; + double ratingPassenger; + int countDriverRate; + int countPassengerCancel; + double passengerAverageRating; + int countPassengerRate; + int countPassengerRide; + + Passenger({ + required this.id, + required this.phone, + required this.email, + required this.gender, + required this.status, + required this.birthdate, + required this.site, + required this.firstName, + required this.lastName, + required this.sosPhone, + required this.education, + required this.employmentType, + required this.maritalStatus, + required this.createdAt, + required this.updatedAt, + required this.countPassenger, + required this.countFeedback, + required this.ratingPassenger, + required this.countDriverRate, + required this.countPassengerCancel, + required this.passengerAverageRating, + required this.countPassengerRate, + required this.countPassengerRide, + }); + + factory Passenger.fromJson(Map json) { + return Passenger( + id: json['id'], + phone: json['phone'], + email: json['email'], + gender: json['gender'], + status: json['status'], + birthdate: json['birthdate'], + site: json['site'], + firstName: json['first_name'], + lastName: json['last_name'], + sosPhone: json['sosPhone'], + education: json['education'], + employmentType: json['employmentType'], + maritalStatus: json['maritalStatus'], + createdAt: json['created_at'], + updatedAt: json['updated_at'], + countPassenger: json['countPassenger'], + countFeedback: json['countFeedback'], + ratingPassenger: json['ratingPassenger'].toDouble(), + countDriverRate: json['countDriverRate'], + countPassengerCancel: json['countPassengerCancel'], + passengerAverageRating: json['passengerAverageRating'].toDouble(), + countPassengerRate: json['countPassengerRate'], + countPassengerRide: json['countPassengerRide'], + ); + } +} diff --git a/siro_driver/lib/models/model/driver/rides_summary_model.dart b/siro_driver/lib/models/model/driver/rides_summary_model.dart new file mode 100755 index 0000000..56973fb --- /dev/null +++ b/siro_driver/lib/models/model/driver/rides_summary_model.dart @@ -0,0 +1,43 @@ +class MonthlyDataModel { + int day; + int totalDuration; + + MonthlyDataModel({required this.day, required this.totalDuration}); + + factory MonthlyDataModel.fromJson(Map json) => + MonthlyDataModel( + day: int.parse(json['day'].toString().split('-')[2]), + totalDuration: + int.parse(json['total_duration'].toString().split(':')[0])); +} + +class MonthlyRideModel { + int day; + int countRide; + int totalCount; + + MonthlyRideModel( + {required this.day, required this.countRide, required this.totalCount}); + + factory MonthlyRideModel.fromJson(Map json) => + MonthlyRideModel( + day: int.parse(json['day'].toString().split('-')[2]), + countRide: int.parse(json['countRide'].toString()), + totalCount: int.parse(json['totalCount'].toString()), + ); +} + +class MonthlyPriceDriverModel { + int day; + // int price; + double pricePerDay; + + MonthlyPriceDriverModel({required this.day, required this.pricePerDay}); + + factory MonthlyPriceDriverModel.fromJson(Map json) => + MonthlyPriceDriverModel( + day: int.parse(json['day'].toString().split('-')[2]), + // price: int.parse(json['price'].toString()), + pricePerDay: double.parse(json['pricePerDay'].toString()), + ); +} diff --git a/siro_driver/lib/models/model/locations.dart b/siro_driver/lib/models/model/locations.dart new file mode 100755 index 0000000..3b18b60 --- /dev/null +++ b/siro_driver/lib/models/model/locations.dart @@ -0,0 +1,34 @@ +class CarLocationModel { + String id; + String driverId; + double latitude; + double heading; + double speed; + double longitude; + DateTime createdAt; + DateTime updatedAt; + + CarLocationModel({ + required this.id, + required this.driverId, + required this.latitude, + required this.longitude, + required this.heading, + required this.speed, + required this.createdAt, + required this.updatedAt, + }); + + factory CarLocationModel.fromJson(Map json) { + return CarLocationModel( + id: json['id'], + driverId: json['driver_id'], + latitude: double.parse(json['latitude'].toString()), + longitude: double.parse(json['longitude'].toString()), + heading: double.parse(json['heading'].toString()), + speed: double.parse(json['speed'].toString()), + createdAt: DateTime.parse(json['created_at']), + updatedAt: DateTime.parse(json['updated_at']), + ); + } +} diff --git a/siro_driver/lib/models/model/onboarding_model.dart b/siro_driver/lib/models/model/onboarding_model.dart new file mode 100755 index 0000000..b845c9f --- /dev/null +++ b/siro_driver/lib/models/model/onboarding_model.dart @@ -0,0 +1,30 @@ +import 'package:get/get.dart'; + +List onBoardingList = [ + OnBoardingModel( + title: 'Welcome to Intaleq!'.tr, + image: 'assets/images/on1.png', + body: + 'Intaleq is the ride-hailing app that is safe, reliable, and accessible.' + .tr, + ), + OnBoardingModel( + title: 'Get to your destination quickly and easily.'.tr, + image: 'assets/images/on2.png', + body: 'With Intaleq, you can get a ride to your destination in minutes.'.tr, + ), + OnBoardingModel( + title: 'Enjoy a safe and comfortable ride.'.tr, + image: 'assets/images/on3.png', + body: + 'Intaleq is committed to safety, and all of our captains are carefully screened and background checked.' + .tr, + ), +]; + +class OnBoardingModel { + final String? title; + final String? image; + final String? body; + OnBoardingModel({this.body, this.title, this.image}); +} diff --git a/siro_driver/lib/models/model/order_data.dart b/siro_driver/lib/models/model/order_data.dart new file mode 100755 index 0000000..512b5f6 --- /dev/null +++ b/siro_driver/lib/models/model/order_data.dart @@ -0,0 +1,187 @@ +// lib/models/model/order_data.dart + +import 'package:get/get.dart'; + +class OrderData { + final String customerName; + final String customerToken; + final double tripDistanceKm; // The total trip distance in kilometers + final String price; + final String startLocationAddress; + final String endLocationAddress; + + final double + distanceToPassengerKm; // The distance to the passenger in kilometers + final int tripDurationMinutes; // Total trip duration in minutes (rounded up) + final int + durationToPassengerMinutes; // Duration to reach the passenger in minutes (rounded up) + + final String rideType; + final String orderId; + final String passengerId; + final String passengerRate; + + final String? rawStartCoordinates; + final String? rawEndCoordinates; + + OrderData({ + required this.customerName, + required this.customerToken, + required this.tripDistanceKm, + required this.price, + required this.startLocationAddress, + required this.endLocationAddress, + required this.distanceToPassengerKm, + required this.tripDurationMinutes, + required this.durationToPassengerMinutes, + required this.rideType, + required this.orderId, + required this.passengerId, + required this.passengerRate, + this.rawStartCoordinates, + this.rawEndCoordinates, + }); + + // --- NEW: Factory constructor to create an instance from a Map --- + // This is the missing method that was causing the error. + factory OrderData.fromMap(Map map) { + return OrderData( + // For strings, provide a default value in case the map key is null + customerName: map['customerName']?.toString() ?? 'Unknown Customer', + customerToken: map['customerToken']?.toString() ?? 'Unknown token', + + // For numbers, cast from 'num' to handle both int and double, with a default value + tripDistanceKm: (map['tripDistanceKm'] as num?)?.toDouble() ?? 0.0, + + price: map['price']?.toString() ?? '0', + startLocationAddress: + map['startLocationAddress']?.toString() ?? 'Unknown Address', + endLocationAddress: + map['endLocationAddress']?.toString() ?? 'Unknown Address', + + distanceToPassengerKm: + (map['distanceToPassengerKm'] as num?)?.toDouble() ?? 0.0, + + tripDurationMinutes: (map['tripDurationMinutes'] as num?)?.toInt() ?? 0, + durationToPassengerMinutes: + (map['durationToPassengerMinutes'] as num?)?.toInt() ?? 0, + + rideType: map['rideType']?.toString() ?? 'Unknown', + orderId: map['orderId']?.toString() ?? 'N/A', + passengerId: map['passengerId']?.toString() ?? 'N/A', + passengerRate: map['passengerRate']?.toString() ?? 'N/A', + + // For nullable strings, direct access is fine as it returns null if the key doesn't exist + rawStartCoordinates: map['rawStartCoordinates'], + rawEndCoordinates: map['rawEndCoordinates'], + ); + } + + // A helper function to convert seconds to rounded-up minutes + static int _secondsToRoundedUpMinutes(String secondsString) { + final seconds = double.tryParse(secondsString) ?? 0.0; + if (seconds <= 0) return 0; + return (seconds / 60) + .ceil(); // .ceil() rounds up (e.g., 0.1 minutes becomes 1 minute) + } + + // Your existing factory for creating an instance from a List + factory OrderData.fromList(List list) { + double distanceToPassengerMeters = + list.length > 12 ? (double.tryParse(list[12].toString()) ?? 0.0) : 0.0; + + return OrderData( + customerName: list.length > 8 ? list[8].toString() : 'Unknown Customer', + customerToken: list.length > 9 ? list[9].toString() : 'Unknown token', + tripDistanceKm: + list.length > 5 ? (double.tryParse(list[5].toString()) ?? 0.0) : 0.0, + price: list.length > 2 ? list[2].toString().split('.')[0] : '0', + startLocationAddress: + list.length > 29 ? list[29].toString() : 'Unknown Address', + endLocationAddress: + list.length > 30 ? list[30].toString() : 'Unknown Address', + + distanceToPassengerKm: + distanceToPassengerMeters / 1000.0, // Convert meters to kilometers + + tripDurationMinutes: + list.length > 4 ? _secondsToRoundedUpMinutes(list[4].toString()) : 0, + durationToPassengerMinutes: list.length > 15 + ? _secondsToRoundedUpMinutes(list[15].toString()) + : 0, + + rideType: + list.length > 31 ? _getRideType(list[31].toString()) : 'Unknown', + orderId: list.length > 16 ? list[16].toString() : 'N/A', + passengerId: list.length > 7 ? list[7].toString() : 'N/A', + passengerRate: list.length > 33 ? list[33].toString() : 'N/A', + + rawStartCoordinates: list.isNotEmpty ? list[0].toString() : null, + rawEndCoordinates: list.length > 1 ? list[1].toString() : null, + ); + } + + static String _getRideType(String type) { + switch (type) { + case 'Comfort': + return 'Comfort ❄️'.tr; + case 'Lady': + return 'Lady 👩'.tr; + case 'Speed': + return 'Speed 🔻'.tr; + case 'Mashwari': + return 'Mashwari'.tr; + case 'Rayeh Gai': + return 'Rayeh Gai'.tr; + default: + return type.tr; + } + } + + // Getter to parse start coordinates + Map? get startCoordinates { + if (rawStartCoordinates == null) return null; + final parts = rawStartCoordinates!.split(','); + if (parts.length == 2) { + return { + 'lat': double.tryParse(parts[0].trim()), + 'lng': double.tryParse(parts[1].trim()) + }; + } + return null; + } + + // Getter to parse end coordinates + Map? get endCoordinates { + if (rawEndCoordinates == null) return null; + final parts = rawEndCoordinates!.split(','); + if (parts.length == 2) { + return { + 'lat': double.tryParse(parts[0].trim()), + 'lng': double.tryParse(parts[1].trim()) + }; + } + return null; + } + + // Your existing method to convert the object TO a Map. + // This is used to pass the data from the overlay to the main app. + Map toMap() { + return { + 'customerName': customerName, + 'tripDistanceKm': tripDistanceKm, + 'price': price, + 'startLocationAddress': startLocationAddress, + 'endLocationAddress': endLocationAddress, + 'distanceToPassengerKm': distanceToPassengerKm, + 'tripDurationMinutes': tripDurationMinutes, + 'durationToPassengerMinutes': durationToPassengerMinutes, + 'rideType': rideType, + 'orderId': orderId, + 'passengerId': passengerId, + 'passengerRate': passengerRate, + 'rawStartCoordinates': rawStartCoordinates, + 'rawEndCoordinates': rawEndCoordinates, + }; + } +} diff --git a/siro_driver/lib/models/overlay_service.dart b/siro_driver/lib/models/overlay_service.dart new file mode 100644 index 0000000..9a44f2c --- /dev/null +++ b/siro_driver/lib/models/overlay_service.dart @@ -0,0 +1,15 @@ +import 'package:flutter/services.dart'; + +class OverlayMethodChannel { + // 1. تم تصحيح اسم القناة ليتطابق مع ملف MainActivity.kt [1] + static const _channel = MethodChannel('com.intaleq_driver/app_control'); + + static Future bringToForeground() async { + try { + // استدعاء الدالة المعرفة في الكوتلن [3] + await _channel.invokeMethod('bringToForeground'); + } on PlatformException catch (e) { + print('Error bringing app to foreground: $e'); + } + } +} diff --git a/siro_driver/lib/onbording_page.dart b/siro_driver/lib/onbording_page.dart new file mode 100755 index 0000000..c676aee --- /dev/null +++ b/siro_driver/lib/onbording_page.dart @@ -0,0 +1,113 @@ +import 'package:flutter/material.dart'; +import 'package:get/get.dart'; + +import 'constant/colors.dart'; +import 'controller/auth/onboarding_controller.dart'; +import 'models/model/onboarding_model.dart'; + +// The main PageView widget, now cleaner. +class CustomSliderOnBoarding extends GetView { + const CustomSliderOnBoarding({Key? key}) : super(key: key); + + @override + Widget build(BuildContext context) { + return PageView.builder( + controller: controller.pageController, + onPageChanged: (val) { + controller.onPageChanged(val); + }, + itemCount: onBoardingList.length, + itemBuilder: (context, i) => OnBoardingPageContent( + model: onBoardingList[i], + ), + ); + } +} + +// This is the new widget for the content of each onboarding page. +class OnBoardingPageContent extends StatelessWidget { + final OnBoardingModel model; + + const OnBoardingPageContent({Key? key, required this.model}) + : super(key: key); + + @override + Widget build(BuildContext context) { + // Use the app's text theme for consistent styling + final textTheme = Theme.of(context).textTheme; + + return Padding( + padding: const EdgeInsets.symmetric(horizontal: 20.0), + child: Column( + crossAxisAlignment: CrossAxisAlignment.center, + children: [ + const Spacer(flex: 2), // Pushes content down + ClipRRect( + borderRadius: + BorderRadius.circular(20.0), // Rounded corners for the image + child: Image.asset( + model.image!, + height: Get.width * 0.6, // Slightly larger image + width: Get.width * 0.8, + fit: BoxFit.cover, // BoxFit.cover prevents image distortion + ), + ), + const Spacer(flex: 2), + Text( + model.title!, + textAlign: TextAlign.center, + style: textTheme.displayLarge?.copyWith( + color: AppColor.primaryColor, + fontWeight: FontWeight.bold, + fontSize: 24, // Consistent font size + ), + ), + const SizedBox(height: 16), + Text( + model.body!, + textAlign: TextAlign.center, + style: textTheme.titleMedium?.copyWith( + color: AppColor.accentColor, + height: 1.5, // Improved line spacing + fontSize: 16), + ), + const Spacer(flex: 3), // Pushes the content up from the dots + ], + ), + ); + } +} + +// The refined dot controller. +class CustomDotControllerOnBoarding extends StatelessWidget { + const CustomDotControllerOnBoarding({Key? key}) : super(key: key); + + @override + Widget build(BuildContext context) { + return GetBuilder( + builder: (controller) => Row( + mainAxisAlignment: MainAxisAlignment.center, + children: [ + ...List.generate( + onBoardingList.length, + (index) => AnimatedContainer( + margin: const EdgeInsets.only(right: 8), // Increased spacing + duration: const Duration(milliseconds: 400), + width: controller.currentPage == index + ? 25 + : 8, // More distinct width change + height: 8, + decoration: BoxDecoration( + // Use a lighter color for inactive dots + color: controller.currentPage == index + ? AppColor.primaryColor + : AppColor.primaryColor.withOpacity(0.3), + borderRadius: BorderRadius.circular(10), + ), + ), + ) + ], + ), + ); + } +} diff --git a/siro_driver/lib/print.dart b/siro_driver/lib/print.dart new file mode 100755 index 0000000..a3d59f6 --- /dev/null +++ b/siro_driver/lib/print.dart @@ -0,0 +1,13 @@ +import 'dart:developer' as developer; + +class Log { + Log._(); + + static void print(String value, {StackTrace? stackTrace}) { + developer.log(value, name: 'LOG', stackTrace: stackTrace); + } + + static Object? inspect(Object? object) { + // return developer.inspect(object); + } +} diff --git a/siro_driver/lib/readme.md b/siro_driver/lib/readme.md new file mode 100644 index 0000000..531299c --- /dev/null +++ b/siro_driver/lib/readme.md @@ -0,0 +1,133 @@ +إليك التوثيق التقني العميق (Deep Technical Documentation) لتطبيق السائق (Driver App) في منصة **انطلق (Intaleq)**. تم إعداد هذا التقرير بناءً على تحليل الكود المصدري، مع التركيز على البنية التحتية، تدفق البيانات، والخدمات الخلفية. + +--- + +# 📘 Intaleq Driver App - Technical Documentation + +**الإصدار:** 1.0 +**المعمارية:** MVC using GetX +**اللغة:** Dart (Flutter) +**إدارة الحالة:** GetX (Reactive State Management) + +--- + +## 1. 🔐 التسجيل والتحقق (Onboarding & KYC) + +نظام التسجيل في تطبيق السائق معقد لأنه يتطلب التحقق من الهوية والأهلية قبل السماح للسائق بالعمل. + +### أ. دورة تسجيل السائق (`Driver Registration Flow`) + +- **المسار:** `lib/controller/auth/captin/register_captin_controller.dart` +- **الآلية:** + 1. **التحقق من الهاتف:** يتم استخدام `SmsEgyptController` أو `PhoneAuthHelper` لإرسال OTP. يتم التحقق مما إذا كان الرقم مسجلاً مسبقاً عبر `checkPhoneNumberISVerfiedDriver`. + 2. **إدخال البيانات الأساسية:** (الاسم، البريد، تاريخ الميلاد) يتم جمعها في `RegistrationView`. + 3. **إنشاء الحساب:** يتم استدعاء `signUpCaptin.php` لإنشاء سجل أولي للسائق بحالة `yet` (بانتظار التوثيق). + +### ب. نظام رفع الوثائق والمعالجة بالذكاء الاصطناعي (AI & OCR) + +- **المسؤوليـة:** `lib/controller/functions/gemeni.dart` (الكلاس `AI`). +- **العملية التقنية:** + 1. **التقاط الصورة:** يتم استخدام `ImagePicker` و `ImageCropper` لضمان جودة الصورة. + 2. **الضغط:** يتم ضغط الصورة باستخدام `FlutterImageCompress` لتقليل استهلاك البيانات. + 3. **التحليل (AI Extraction):** + - يتم رفع الصورة إلى `uploadImageToAi`. + - يتم تمرير `prompt` هندسي دقيق لنموذج الذكاء الاصطناعي (مثل Gemini أو نماذج OCR مخصصة) لاستخراج البيانات كـ JSON (مثل: `vin`, `make`, `model`, `plate_number`). + 4. **التعبئة التلقائية:** البيانات المستخرجة تُعبأ تلقائياً في `RegisterCaptainController` ليقوم السائق بمراجعتها فقط، مما يقلل أخطاء الإدخال اليدوي. + +### ج. حالة "بانتظار الموافقة" (`Pending Approval`) + +- **المسؤوليـة:** `LoginDriverController` و `DriverVerificationScreen`. +- **المنطق:** + - عند تسجيل الدخول، يتحقق النظام من الحقل `status` و `is_verified` في استجابة الـ login. + - إذا كانت الحالة `yet`، يتم توجيه السائق إجبارياً إلى شاشة `DriverVerificationScreen` التي تعرض رسالة "Your Application is Under Review" وتمنع الوصول للخريطة. + +--- + +## 2. 📡 الخدمات الخلفية والتتبع (Background Services & Tracking) + +يعتمد التطبيق على نظام تتبع ذكي (Batch Tracking) لتقليل استهلاك البطارية والبيانات مع الحفاظ على الدقة. + +### أ. محرك الموقع (`LocationController`) + +- **المسار:** `lib/controller/functions/location_controller.dart`. +- **آلية العمل في الخلفية:** + 1. **التهيئة:** يتم تفعيل `location.enableBackgroundMode(enable: true)` لضمان استمرار الخدمة عند إغلاق الشاشة. + 2. **التخزين المؤقت (Buffering):** بدلاً من إرسال كل نقطة GPS للسيرفر، يتم تخزين النقاط في قائمة محلية `_trackBuffer`. + 3. **التصفية الذكية (Smart Filtering):** لا يتم تسجيل النقطة إلا إذا تحرك السائق مسافة معينة (`onMoveMetersNormal = 15m`) أو مرّ وقت محدد (`30 ثانية`) لضمان تسجيل التوقفات. + +### ب. إرسال البيانات (Batch Upload) + +- يوجد مؤقت `_uploadTimer` يعمل كل **دقيقتين** (في الوضع العادي). +- يقوم هذا المؤقت بجمع كل النقاط في `_trackBuffer`، تحويلها لـ JSON، وإرسالها بطلب واحد `POST` إلى `add_batch.php`. هذا يقلل الحمل على السيرفر بنسبة كبيرة جداً. + +### ج. وضع توفير الطاقة (Power Saving Mode) + +- يراقب التطبيق حالة البطارية عبر `BatteryNotifier`. إذا انخفضت عن 20%، يتم تقليل معدل التحديث (تسجيل كل 6 ثواني ورفع كل 4 دقائق). + +--- + +## 3. 🔔 استقبال الطلبات (Request Handling) + +### أ. النافذة العائمة (`Overlay Window`) + +- **التقنية:** `flutter_overlay_window`. +- **المسار:** `lib/main.dart` (Background Handler) و `lib/views/home/Captin/orderCaptin/order_over_lay.dart`. +- **كيفية العمل:** + 1. عند وصول إشعار FCM من نوع `Order` والتطبيق في الخلفية، يتم استدعاء `backgroundMessageHandler`. + 2. يتم التحقق من إذن الرسم فوق التطبيقات. إذا مُنح، يتم استدعاء `FlutterOverlayWindow.showOverlay` وتمرير بيانات الطلب (`DriverList`). + 3. ملف `order_over_lay.dart` هو تطبيق Flutter مصغر يعمل بشكل مستقل فوق التطبيقات الأخرى. يحتوي على منطق قبول/رفض خاص به ويتصل بالسيرفر مباشرة. + +### ب. منطق القبول والرفض (`OrderRequestController`) + +- **المسار:** `lib/controller/home/captin/order_request_controller.dart`. +- **العداد التنازلي:** يتم تشغيل `startTimer` لمدة 15-20 ثانية. إذا انتهى الوقت، يتم رفض الطلب تلقائياً. +- **القبول:** عند الضغط على "قبول"، يتم استدعاء `updateStausFromSpeed.php` لحجز الطلب ومنع تضارب السائقين (Race Condition). + +--- + +## 4. 🚗 تنفيذ الرحلة (Trip Execution Workflow) + +يدير `MapDriverController` دورة حياة الرحلة بالكامل. + +### أ. الذهاب للراكب (`Going to Passenger`) + +- عند قبول الطلب، تتغير الحالة إلى `Apply`. +- يتم عرض موقع الراكب على الخريطة ورسم المسار باستخدام `getRoute` (يعتمد على OSRM أو Google Directions). +- يمكن للسائق فتح خرائط جوجل الخارجية عبر `openGoogleMapFromDriverToPassenger`. + +### ب. الوصول (`Arrived`) + +- **الزر:** `I Arrive`. +- **المنطق البرمجي:** يتحقق الكود أولاً من المسافة بين السائق والراكب. إذا كانت أقل من **140 متر** (`distance < 140`)، يتم إرسال إشعار `Hi ,I Arrive your site` للراكب وتفعيل عداد الانتظار. + +### ج. بدء وإنهاء الرحلة + +- **البدء (`Begin`):** يطلب النظام تأكيداً "Is the Passenger in your Car?". عند الموافقة، يتم إرسال `status: Begin` للسيرفر ويبدأ عداد الرحلة الفعلي `rideIsBeginPassengerTimer`. +- **الإنهاء (`Finish`):** + - يتم حساب المسافة المقطوعة والوقت. + - يتم استدعاء `finishRideFromDriver1` التي تقوم بإرسال طلبين متزامنين: تحديث حالة الرحلة وتنفيذ عملية الدفع `process_ride_payments.php`. + - يتم تحويل السائق لصفحة تقييم الراكب `RatePassenger`. + +--- + +## 5. 💰 المحفظة والأرباح (Wallet & Earnings) + +- **المسار:** `lib/controller/home/payment/captain_wallet_controller.dart`. + +### أ. عرض الرصيد والديون + +- يتم جلب البيانات المالية عبر `getCaptainWalletFromRide` (للأرباح من الرحلات) و `getCaptainWalletFromBuyPoints` (للنقاط المشتراة). +- **الحظر المالي:** إذا انخفض رصيد النقاط عن حد معين (مثل -300)، يتم منع السائق من استقبال الطلبات ويظهر زر `Charge your Account`. + +### ب. آلية الشحن + +- يتم دعم بوابات دفع متعددة مثل **Syriatel Cash** و **MTN Cash**. +- عند الشحن، يتم إنشاء `Invoice` وانتظار الـ Callback أو التحقق الدوري (`polling`) من حالة الدفع. + +--- + +## 6. ⚙️ الإعدادات والميزات الإضافية + +- **إعدادات السيارة:** تدار عبر `DriverCarController` و `CarsInsertingPage`، حيث يمكن إضافة سيارات جديدة ورفع وثائقها. +- **اللغة:** `LocaleController` يدير التبديل بين العربية والإنجليزية ويحفظ التفضيل في `GetStorage`. +- **التقييم:** يتم جلب تقييم السائق عبر `getDriverRate` وعرضه في القائمة الجانبية أو الرأسية. diff --git a/siro_driver/lib/services/offline_map_service.dart b/siro_driver/lib/services/offline_map_service.dart new file mode 100644 index 0000000..d13d88a --- /dev/null +++ b/siro_driver/lib/services/offline_map_service.dart @@ -0,0 +1,119 @@ +import 'dart:io'; + +import 'package:get/get.dart'; +import 'package:intaleq_maps/intaleq_maps.dart'; +import 'dart:math' as math; +import '../main.dart'; +import '../print.dart'; + +class OfflineMapService { + static final OfflineMapService instance = OfflineMapService._(); + OfflineMapService._(); + + final _offlineRegionName = "UserRegion"; + bool _isDownloading = false; + LatLng? _lastDownloadedCenter; + + /// Calculate bounding box for a given center and radius in km + LatLngBounds _calculateBounds(LatLng center, double radiusKm) { + const double earthRadius = 6371.0; + + // Latitude degrees per km + double latDelta = (radiusKm / earthRadius) * (180 / math.pi); + // Longitude degrees per km at given latitude + double lngDelta = (radiusKm / earthRadius) * + (180 / math.pi) / + math.cos(center.latitude * math.pi / 180); + + return LatLngBounds( + southwest: + LatLng(center.latitude - latDelta, center.longitude - lngDelta), + northeast: + LatLng(center.latitude + latDelta, center.longitude + lngDelta), + ); + } + + /// Downloads a specified radius around a coordinate + Future downloadRegion(LatLng center, + {double radiusKm = 10.0, + double minZoom = 6.0, + double maxZoom = 15.0}) async { + if (_isDownloading) return; + + // Avoid re-downloading if the user hasn't moved significantly (e.g. > 5km) + if (_lastDownloadedCenter != null) { + double distance = _calculateDistance(center, _lastDownloadedCenter!); + if (distance < 5.0) return; // skip if close to previously downloaded + } + + _isDownloading = true; + + try { + final bounds = _calculateBounds(center, radiusKm); + + // Select style based on current theme + final String styleStr = + Get.isDarkMode ? "assets/style_dark.json" : "assets/style.json"; + + // iOS native crash guard: MLNTilePyramidOfflineRegion does not support relative asset URLs. + // We skip native offline registration on iOS if using local assets to ensure stability. + if (Platform.isIOS && !styleStr.startsWith('http')) { + Log.print( + "ℹ️ Skipping native offline registration on iOS for asset-based style to prevent crash."); + return; + } + + final regionDefinition = OfflineRegionDefinition( + bounds: bounds, + mapStyleUrl: styleStr, + minZoom: minZoom, + maxZoom: maxZoom, + ); + + // We'll update the last downloaded center immediately + _lastDownloadedCenter = center; + + // MapLibre standard API for offline downloads + await downloadOfflineRegion(regionDefinition, metadata: { + 'name': '$_offlineRegionName-${center.latitude}-${center.longitude}', + 'downloadDate': DateTime.now().toIso8601String(), + }); + + // Reassurance log for the user + Log.print("📍 Map Ready: Service is utilizing local tile cache."); + Log.print( + "✅ Offline Map Cached for Region: $center (radius: ${radiusKm}km, style: $styleStr)"); + } catch (e) { + Log.print("⚠️ Offline Map Download Failed: $e"); + } finally { + _isDownloading = false; + } + } + + /// Helper to calculate distance in km + double _calculateDistance(LatLng p1, LatLng p2) { + var p = 0.017453292519943295; + var c = math.cos; + var a = 0.5 - + c((p2.latitude - p1.latitude) * p) / 2 + + c(p1.latitude * p) * + c(p2.latitude * p) * + (1 - c((p2.longitude - p1.longitude) * p)) / + 2; + return 12742 * math.asin(math.sqrt(a)); + } + + /// Clears all offline map regions and tiles from local storage + Future clearCache() async { + try { + Log.print("♻️ Purging MapLibre Offline Cache..."); + final List regions = await getListOfRegions(); + for (var region in regions) { + await deleteOfflineRegion(region.id); + } + Log.print("✅ Map cache cleared successfully. ${regions.length} regions removed."); + } catch (e) { + Log.print("⚠️ Failed to clear map cache: $e"); + } + } +} diff --git a/siro_driver/lib/services/signaling_service.dart b/siro_driver/lib/services/signaling_service.dart new file mode 100644 index 0000000..e4c4792 --- /dev/null +++ b/siro_driver/lib/services/signaling_service.dart @@ -0,0 +1,111 @@ +import 'dart:async'; +import 'dart:convert'; +import 'dart:io'; +import 'package:siro_driver/print.dart'; + +class SignalingService { + WebSocket? _socket; + final String _url = "wss://calls.intaleqapp.com/ws"; + + // Callbacks + Function(List iceServers)? onConnected; + Function(String reason)? onDisconnected; + Function(Map offer)? onOffer; + Function(Map answer)? onAnswer; + Function(Map candidate)? onIceCandidate; + Function(String reason)? onCallEnded; + Function()? onParticipantJoined; + + bool get isConnected => _socket != null && _socket!.readyState == WebSocket.open; + + Future connect(String sessionId, String userId) async { + if (isConnected) return; + + try { + Log.print("Signaling: Connecting to $_url"); + _socket = await WebSocket.connect(_url) + .timeout(const Duration(seconds: 8)); + + _socket!.listen( + (data) { + _handleMessage(data); + }, + onError: (err) { + Log.print("Signaling socket error: $err"); + disconnect("socket_error"); + }, + onDone: () { + Log.print("Signaling socket closed by server"); + disconnect("socket_closed"); + }, + cancelOnError: true, + ); + + // Send the authenticate message as the first message + send("authenticate", { + "session_id": sessionId, + "user_id": userId, + }); + } catch (e) { + Log.print("Signaling connection failed: $e"); + onDisconnected?.call("connection_failed"); + } + } + + void _handleMessage(dynamic data) { + try { + Log.print("Signaling received raw: $data"); + final message = jsonDecode(data); + if (message is! Map) return; + + final type = message['type']; + switch (type) { + case 'authenticated': + final iceServers = message['ice_servers'] as List? ?? []; + onConnected?.call(iceServers); + break; + case 'participant_joined': + onParticipantJoined?.call(); + break; + case 'offer': + if (message['sdp'] != null) { + onOffer?.call(message['sdp']); + } + break; + case 'answer': + if (message['sdp'] != null) { + onAnswer?.call(message['sdp']); + } + break; + case 'ice_candidate': + if (message['candidate'] != null) { + onIceCandidate?.call(message['candidate']); + } + break; + case 'call_ended': + onCallEnded?.call(message['reason'] ?? 'normal'); + break; + } + } catch (e) { + Log.print("Error handling signaling message: $e"); + } + } + + void send(String type, Map data) { + if (!isConnected) return; + final msg = jsonEncode({ + 'type': type, + ...data, + }); + Log.print("Signaling sending: $msg"); + _socket!.add(msg); + } + + void disconnect([String reason = "user_hangup"]) { + if (_socket != null) { + _socket!.close(); + _socket = null; + onDisconnected?.call(reason); + } + } +} diff --git a/siro_driver/lib/splash_screen_page.dart b/siro_driver/lib/splash_screen_page.dart new file mode 100755 index 0000000..61e81cd --- /dev/null +++ b/siro_driver/lib/splash_screen_page.dart @@ -0,0 +1,179 @@ +import 'package:flutter/material.dart'; +import 'package:get/get.dart'; +import 'package:siro_driver/constant/box_name.dart'; +import 'controller/home/splash_screen_controlle.dart'; +import 'main.dart'; + +class SplashScreen extends StatelessWidget { + const SplashScreen({super.key}); + + @override + Widget build(BuildContext context) { + final SplashScreenController splashScreenController = + Get.put(SplashScreenController()); + final textTheme = Theme.of(context).textTheme; + final size = MediaQuery.of(context).size; + + // A modern, elegant color palette + const Color primaryDark = Color(0xFF0D1B2A); + const Color secondaryDark = Color(0xFF1B263B); + const Color accentColor = Color(0xFF4ECDC4); + const Color textColor = Colors.white; + + return Scaffold( + body: Container( + width: double.infinity, + height: double.infinity, + decoration: const BoxDecoration( + gradient: LinearGradient( + begin: Alignment.topCenter, + end: Alignment.bottomCenter, + colors: [ + primaryDark, + secondaryDark, + ], + ), + ), + child: Stack( + children: [ + // Center-aligned animated content + Center( + child: Column( + mainAxisSize: MainAxisSize.min, + children: [ + // Logo with Scale and Fade animation + ScaleTransition( + scale: splashScreenController.animation, + child: FadeTransition( + opacity: splashScreenController.animation, + child: Container( + padding: const EdgeInsets.all(20), + decoration: BoxDecoration( + shape: BoxShape.circle, + color: Colors.white.withOpacity(0.95), + boxShadow: [ + BoxShadow( + color: accentColor.withOpacity(0.2), + blurRadius: 25, + spreadRadius: 5, + ), + ], + ), + child: ClipRRect( + borderRadius: BorderRadius.circular(100), + child: Image.asset( + 'assets/images/logo.gif', + width: size.width * 0.3, // Responsive size + height: size.width * 0.3, + ), + ), + ), + ), + ), + const SizedBox(height: 30), + // App Name and Slogan with staggered animation + _AnimatedText( + text: 'Intaleq', // Your App Name + animation: splashScreenController.animation, + style: textTheme.headlineMedium?.copyWith( + color: textColor, + fontWeight: FontWeight.bold, + letterSpacing: 3, + ), + beginOffset: const Offset(0, 0.5), + ), + const SizedBox(height: 12), + _AnimatedText( + text: 'Your Journey Begins Here'.tr, + animation: splashScreenController.animation, + style: textTheme.titleMedium?.copyWith( + color: textColor.withOpacity(0.8), + fontWeight: FontWeight.w300, + ), + beginOffset: const Offset(0, 0.8), + startDelay: 0.2, // Start after the title + ), + ], + ), + ), + // Bottom Version Info and Progress Bar + Align( + alignment: Alignment.bottomCenter, + child: Padding( + padding: EdgeInsets.only( + bottom: size.height * 0.06, + left: 40, + right: 40, + ), + child: Column( + mainAxisSize: MainAxisSize.min, + children: [ + Obx( + () => ClipRRect( + borderRadius: BorderRadius.circular(10), + child: LinearProgressIndicator( + value: splashScreenController.progress.value, + backgroundColor: primaryDark.withOpacity(0.5), + valueColor: + const AlwaysStoppedAnimation(accentColor), + minHeight: 6, + ), + ), + ), + const SizedBox(height: 20), + GetBuilder( + builder: (controller) => Text( + 'Version: ${controller.packageInfo.isNotEmpty ? controller.packageInfo : '...'}', + style: textTheme.bodySmall?.copyWith( + color: textColor.withOpacity(0.5), + letterSpacing: 1, + ), + ), + ), + ], + ), + ), + ), + ], + ), + ), + ); + } +} + +/// A helper widget for creating staggered text animations. +class _AnimatedText extends StatelessWidget { + const _AnimatedText({ + required this.animation, + required this.text, + required this.style, + required this.beginOffset, + this.startDelay = 0.0, + }); + + final Animation animation; + final String text; + final TextStyle? style; + final Offset beginOffset; + final double startDelay; + + @override + Widget build(BuildContext context) { + return FadeTransition( + opacity: CurvedAnimation( + parent: animation, + curve: Interval(startDelay, 1.0, curve: Curves.easeOut), + ), + child: SlideTransition( + position: Tween( + begin: beginOffset, + end: Offset.zero, + ).animate(CurvedAnimation( + parent: animation, + curve: Interval(startDelay, 1.0, curve: Curves.easeOut), + )), + child: Text(text, style: style), + ), + ); + } +} diff --git a/siro_driver/lib/translations_ar.json b/siro_driver/lib/translations_ar.json new file mode 100644 index 0000000..8548723 --- /dev/null +++ b/siro_driver/lib/translations_ar.json @@ -0,0 +1,946 @@ +{ + "You have finished all times ": "", + "Are you sure to cancel?": "", + "Enter your first name": "", + "License Categories": "", + "Expired Driver’s License": "", + "Please enter an phone address": "", + "Approve Driver Documents": "", + "km": "", + "Recharge my Account": "", + "You have received a gift token!": "", + "\\)'), // context.tr(": "", + "You will choose one of above !": "", + "ID Documents Front": "", + "Select Your Country": "", + "I Agree": "", + "Not updated": "", + " in your wallet": "", + "You have successfully charged your account": "", + "your ride is applied": "", + "Criminal Document Required": "", + "Show my Cars": "", + "Pay": "", + "\\)\"), // tr(": "", + "No questions asked yet.": "", + "Please enter a health insurance status.": "", + "Order Cancelled by Passenger": "", + "You must be recharge your Account": "", + "Contact us for any questions on your order.": "", + "JOD": "", + "Transaction successful": "", + "\\$": "", + "You should restart app to change language": "", + "from 23:59 till 05:30": "", + "Are you Sure to LogOut?": "", + "Please wait": "", + "If You Want be Driver \\nClick Here.": "", + "Total price from ": "", + "You don't have enough money in your SEFER wallet": "", + "Enter phone number": "", + "Help Details": "", + "Car Kind": "", + "Passenger come to you": "", + "Would you like to proceed with health insurance?": "", + "car_model": "", + "This ride is already taken by another driver.": "", + "No Response yet.": "", + "Reject": "", + "GPS Required Allow !.": "", + "Are you sure you want to cancel this trip?": "", + "The order Accepted by another Driver": "", + "Submit Rating": "", + "\\.tr\\(\\)\"), // ": "", + "I Arrive": "وصلت", + "I've arrived.": "لقد وصلت.", + "Distance is": "", + "What are the order details we provide to you?": "", + "Toggle Traffic": "", + "General Authority For Supply Commodities": "", + "Please enter your first name.": "الرجاء إدخال اسمك الأول", + "Health Insurance": "التأمين الصحي", + "Invite Driver": "دعوة سائق", + "Leaderboard": "قائمة المتصدرين", + "Challenges": "التحديات", + "My Schedule": "جدولي", + "Statistics": "الإحصائيات", + "Balance": "الرصيد", + "History of Trip": "سجل الرحلات", + "Available for rides": "متاح للرحلات", + "Notifications": "التنبيهات", + "Helping Center": "مركز المساعدة", + "Is device compatible": "هل الجهاز متوافق؟", + "Privacy Policy": "سياسة الخصوصية", + "Daily Challenges": "تحديات يومية", + "Weekly Challenges": "تحديات أسبوعية", + "Invite Rider": "دعوة راكب", + "Referral Code": "كود الإحالة", + "Referral Center": "مركز الإحالة", + "Share": "مشاركة", + "WhatsApp": "واتساب", + "Share via": "مشاركة عبر", + "How It Works": "كيف يعمل", + "Share your code": "شارك كودك", + "Friend signs up": "تسجيل الصديق", + "Both earn rewards": "كلاكما يربح", + "Bonus at 10 trips": "مكافأة عند 10 رحلات", + "Send your referral code to friends": "أرسل كود الإحالة لأصدقائك", + "They register using your code": "يسجلون باستخدام كودك", + "You get 100 pts, they get 50 pts": "تحصل على 100 نقطة، وهم يحصلون على 50", + "Extra 200 pts when they complete 10 trips": "200 نقطة إضافية عند إكمالهم 10 رحلات", + "Driver Invitations": "دعوات السائقين", + "Passenger Invitations": "دعوات الركاب", + "Code copied!": "تم نسخ الكود!", + "Your Referral Code": "كود الإحالة الخاص بك", + "Share this code to earn rewards": "شارك هذا الكود لربح المكافآت", + "Profile": "الملف الشخصي", + "Settings": "الإعدادات", + "Contact Us": "اتصل بنا", + "Videos Tutorials": "الفيديوهات التعليمية", + "Rate Our App": "قيم تطبيقنا", + "About Us": "من نحن", + "Sign Out": "تسجيل الخروج", + "Claimed": "تم الاستلام", + "Claim Reward": "احصل على المكافأة", + "Active": "نشط", + "Rewards": "المكافآت", + "Total Invites": "إجمالي الدعوات", + "Payment Method": "", + "wallet_credited_message": "", + "similar": "", + "Send Invite": "", + "Refuse Order": "", + "Driver Is Going To Passenger": "", + "Ride Summaries": "", + "Flag-down fee": "", + "Expiry Date: ": "", + "Morning Promo": "", + "Total Connection Duration:": "", + "Capture Image of Non-Egyptian ID Back": "", + "Egyptian Gulf Bank": "", + "You can change the language of the app": "", + "gender": "", + "Type something": "", + "No data yet!": "", + "face detect": "", + "Transfer": "", + "Marital Status": "", + "Edit Profile": "", + "Capture Image of Non-Egyptian ID Front": "", + "Tax Expiry Date": "", + "Drivers": "", + "Enter your feedback here": "", + "Send Verfication Code": "", + "Account": "", + "Male": "", + "Total Invites": "", + "scams operations": "", + "incorrect_document_title": "", + "High School Diploma": "", + "ID Mismatch": "", + "An error occurred while saving driver data": "", + "Code approved": "", + "Cost Of Trip IS ": "", + "You deserve the gift": "", + "License Type": "", + "Detect Your Face ": "", + "Go to passenger Location": "", + "you must insert token code ": "", + "Delete": "", + "id_card_back": "", + "OrderId": "", + "Show maintenance center near my location": "", + "OK": "", + "Can I cancel my ride?": "", + "year :": "", + "$pricePoint": "", + "car_plate": "", + "Password": "", + "minutes before trying again.": "", + "Hi ,I will go now": "", + "Insert Wallet phone number": "", + "Please check back later for available rides.": "", + "has been added to your budget": "", + "Scan ID Tesseract": "", + "Weekly Budget": "", + "Add Question": "", + "Deleted": "", + "Displacement": "", + "Drivers License Class: ": "", + "Pay with Wallet": "", + "Welcome to Tripz!": "", + "from 3 times Take Attention": "", + "Times of Trip": "", + "The driver accepted your trip": "", + "How to use SEFER": "", + "Not Connected": "", + "An error occurred while picking contacts: $e": "", + "Install our app:": "", + "before": "", + "Capture an Image of Your Driver License": "", + "Change Country": "", + "Faisal Islamic Bank of Egypt": "", + " SAFAR Wallet": "", + "Made :": "", + "*Tripz DRIVER CODE*": "", + "*Tripz APP CODE*": "", + "\\)'), // tr(context, ": "", + "Scan ID Api": "", + "What types of vehicles are available?": "", + "id_card_front": "", + "Camera Access Denied.": "", + "You should use Touch ID or Face ID to confirm payment": "", + "you can show video how to setup": "", + "Banque Misr": "", + "Log Out Page": "", + "phone number of driver": "", + "Send Email": "", + "Image detecting result is ": "", + "Slide to End Trip": "", + "You have got a gift": "", + "You have 50": "", + "You have gift 300 L.E": "", + "Status is": "", + ", obfuscate: true)\n static final String secretKey = _Env.secretKey;\n\n @EnviedField(varName: ": "", + ". I am at least 18 years of age.": "", + "birthdate": "", + "Speed Order": "", + "Sign In by Google": "", + "You Are Stopped For this Day !": "", + "What safety measures does Sefer offer?": "", + "Total budgets on month": "", + "Verify Email For Driver": "", + "OrderVIP": "", + "Enter your Question here": "", + "Document Number: ": "", + "Expiration Date": "", + "Please enter your last name.": "", + "Emergency Number": "", + "Language Options": "", + "Insert card number": "", + "Percent Completed": "", + "No data yet": "", + "joined": "", + "Total net": "", + "My current location is:": "", + "Age": "", + "Do you have a disease for a long time?": "", + "History of Trip": "", + "MIDBANK": "", + "I've been trying to reach you but your phone is off.": "", + "Non Egypt": "", + "Why do you want to cancel this trip?": "", + "National ID": "", + "Arab Investment Bank": "", + "Order Under Review": "", + "Hi": "", + "National Number": "", + "Suez Canal Bank": "", + "Which method you will pay": "", + "Your location is being tracked in the background.": "", + "BookingFee": "", + "Rate Passenger": "", + "Total Budget from trips is ": "", + "Passenger Name is": "", + "Choose a contact option": "", + "Frequently Questions": "", + "No Promo for today .": "", + "from 07:30 till 10:30 (Thursday, Friday, Saturday, Monday)": "", + "Address": "", + "\\)\"), // tr(context, ": "", + "A promotion record for this driver already exists for today.": "", + "Choose from contact": "", + "Occupation": "", + "Fuel": "", + "ID Documents Back": "", + "Trip has Steps": "", + "Evening": "", + "Yes": "", + "re eligible for a special offer!": "", + "Today": "", + "error_processing_document": "", + "Citi Bank N.A. Egypt": "", + "Submit": "", + "Reject Order": "", + "What is Types of Trips in Sefer?": "", + "\\.tr'), // ": "", + "string": "", + "Please slow down": "", + "Insert Account Bank": "", + "Most Secure Methods": "", + "Total Points is": "", + "Driver Wallet": "", + "Activities": "", + "Payment Successful": "", + "You haven't moved sufficiently!": "", + "Days": "", + "Card ID": "", + "Take Picture Of Driver License Card": "", + "H and": "", + "Vehicle Details Front": "", + "The payment was not approved. Please try again.": "", + "Please make sure to read the license carefully.": "", + "Hello, this is Driver": "", + "Log Off": "", + ",\n ": "", + "Morning": "", + "s License": "", + "Non-Egyptian ID Front": "", + "Do you want to collect your earnings?": "", + "passenger amount to me": "", + "--": "", + "Counts of budgets on days": "", + "Minimum fare": "", + "Commercial International Bank - Egypt S.A.E": "", + "Change Map Type": "", + "Sign in with Google for easier email and name entry": "", + "Pyament Cancelled .": "", + "Be sure for take accurate images please\\nYou have": "", + "Error": "", + "Email Us": "", + "Sign in with Apple": "", + "Please upload this license.": "", + "Accept Order": "", + "Email": "", + "An error occurred during the payment process.": "", + "Helping Center": "", + "car_license_front": "", + "Choose Language": "", + "car_license_back": "", + "You have transfer to your wallet from": "", + "Hi ,I Arrive your site": "مرحباً، لقد وصلت لموقعك", + "Your Journey Begins Here": "", + "Please enter your City.": "", + "Show My Trip Count": "", + "My Location": "", + "VIP Order Accepted": "", + "Authentication failed": "", + "Next": "", + "Wallet": "", + "image verified": "", + "Take Picture Of ID Card": "", + "detected": "", + "We sent 5 digit to your Email provided": "", + "Pay from my budget": "", + "Value": "", + "You can buy points from your budget": "", + "Accepted Ride": "", + "change device": "", + "Year": "", + "\\)\"), // context.tr(": "", + "You will receive code in sms message": "", + "you will pay to Driver": "", + "Arab African International Bank": "", + "Scan Id": "", + "Enable Location Permission": "", + "DOB": "", + "Image Upload Failed": "", + "Price is": "", + "Enter your phone number": "", + "Apply": "", + "Model": "", + "Full Name": "", + "Help & Support": "", + "The price must be over than ": "", + "You dont have Points": "", + "Code not approved": "", + "Scan Driver License": "", + "Cancel Trip": "", + "you can buy ": "", + "There is no help Question here": "", + "you will use this device?": "", + "Percent Rejected": "", + "complete, you can claim your gift": "", + "Ok I will go now.": "", + "‏مدة الرحلة": "", + "\\.tr\\(\\)'), // ": "", + "Inspection Date": "", + "Camera not initilaized yet": "", + "Share the app with another new passenger": "", + "Passengers": "", + "go to your passenger location before\\nPassenger cancel trip": "", + "Call Left": "", + "We are process picture please wait ": "", + "How can I register as a driver?": "", + "Login": "", + "Please enter your question": "", + "Transfer budget": "", + "Press here": "", + "Order ID": "", + "You are Stopped": "", + "Canceled Orders": "", + "Is the Passenger in your Car?": "", + "There is no notification yet": "", + "Profile": "", + "Update Education": "", + "Total rides on month": "", + "Email you inserted is Wrong.": "", + "No face detected": "", + "Name :": "", + "Charge your Account": "", + "You can change the Country to get all features": "", + "Are you sure to delete your account?": "", + "Phone Number wrong": "", + "Afternoon Promo": "", + "MyLocation": "", + "Enter phone": "", + "start": "", + "Plate Number": "", + "App Preferences": "", + "Updated": "", + "Start the Ride": "", + "vin": "", + "National Bank of Kuwait – Egypt": "", + "Please don't be late": "", + "The order has been accepted by another driver.": "", + "Thanks": "", + "ُExpire Date": "", + "Connected": "", + "Feedback data saved successfully": "", + "Maintenance Center": "", + "deleted": "", + "Wallet Added": "", + "unknown_document": "", + "You have upload Criminal documents": "", + "Select Country": "", + "Insert Emergency Number": "", + "Alert": "", + "Security Warning": "", + "Add bank Account": "", + "No I want": "", + "Submit rating": "", + "Remaining time": "", + "Trip Detail": "", + "Date of Birth": "", + "Your Rewards": "", + "Night": "", + "General": "", + "Share App": "", + "seconds": "", + "Ok": "", + ": ": "", + "Total Price is ": "", + "Percent Canceled": "", + "First Abu Dhabi Bank": "", + "Type your Email": "", + "Vibration": "", + "your ride is Accepted": "", + "Contact Us": "", + "Car Plate": "", + "How can I pay for my ride?": "", + "Call Income from Passenger": "", + "Wallet Added${(remainingFee).toStringAsFixed(0)}": "", + "300 LE": "", + "s Degree": "", + "The Amount is less than": "", + "No orders available": "", + "Transaction failed": "", + "Please enter a valid email.": "", + "Your rating has been submitted.": "", + "Drivers License Class": "", + " Total weekly is ": "", + "Select a quick message": "", + "Abu Dhabi Islamic Bank – Egypt": "", + "No invitation found yet!": "", + "Get to your destination quickly and easily.": "", + "Rejected Orders": "", + "You Should choose rate figure": "", + "Pay with Credit Card": "", + "Use this code in registration": "", + "token updated": "", + "Name (Arabic)": "", + "Enter your Note": "", + "Your Name is Wrong": "", + "Accept": "", + "Passenger Cancel Trip": "", + "This for new registration": "", + "Make": "", + "Home": "", + ">Arabic (Egypt)\n \n \n Arabic (Egypt)\n \n \n 0) { + ratingController + .submitRating(ratingController.userRating.value); + Get.snackbar( + "Thank You!".tr, + "Your rating has been submitted.".tr, + backgroundColor: CupertinoColors.systemGrey6, + snackPosition: SnackPosition.BOTTOM, + margin: const EdgeInsets.all(16), + borderRadius: 12, + ); + } else { + Get.snackbar( + "Error".tr, + "Please select a rating before submitting.".tr, + backgroundColor: CupertinoColors.systemRed, + snackPosition: SnackPosition.BOTTOM, + margin: const EdgeInsets.all(16), + borderRadius: 12, + ); + } + }, + child: Text( + "Submit Rating".tr, + style: const TextStyle( + color: CupertinoColors.white, + fontSize: 16, + fontWeight: FontWeight.bold, + ), + ), + ), + ], + ), + ); + }), + ), + ), + ), + ); + } + + // Widget for building rating stars with animations + Widget _buildRatingStars() { + return Row( + mainAxisAlignment: MainAxisAlignment.center, + children: List.generate(5, (index) { + return GestureDetector( + onTap: () { + ratingController.userRating.value = index + 1; + }, + child: AnimatedContainer( + duration: const Duration(milliseconds: 300), + margin: const EdgeInsets.symmetric(horizontal: 4), + child: Icon( + CupertinoIcons.star_fill, + size: 40, + color: index < ratingController.userRating.value + ? CupertinoColors.systemYellow + : CupertinoColors.systemGrey3, + ), + ), + ); + }), + ); + } +} diff --git a/siro_driver/lib/views/Rate/rate_passenger.dart b/siro_driver/lib/views/Rate/rate_passenger.dart new file mode 100755 index 0000000..79829d4 --- /dev/null +++ b/siro_driver/lib/views/Rate/rate_passenger.dart @@ -0,0 +1,331 @@ +import 'package:siro_driver/controller/home/captin/map_driver_controller.dart'; +import 'package:siro_driver/views/widgets/my_textField.dart'; +import 'package:flutter/material.dart'; +import 'package:flutter_rating_bar/flutter_rating_bar.dart'; +import 'package:get/get.dart'; +import 'package:intl/intl.dart'; // Import this for formatting +import 'package:siro_driver/constant/colors.dart'; +import 'package:siro_driver/views/widgets/elevated_btn.dart'; + +import '../../constant/style.dart'; +import '../../controller/rate/rate_conroller.dart'; + +class RatePassenger extends StatelessWidget { + final RateController controller = Get.put(RateController()); + + // Format: 1,234.5 + final NumberFormat currencyFormatter = NumberFormat("#,##0.0", "en_US"); + + RatePassenger({super.key}); + + @override + Widget build(BuildContext context) { + return Scaffold( + backgroundColor: Theme.of(context).scaffoldBackgroundColor, + appBar: AppBar( + title: Text('Trip Completed'.tr), + centerTitle: true, + automaticallyImplyLeading: false, + elevation: 0, + ), + body: GetBuilder( + builder: (controller) { + return SingleChildScrollView( + child: Padding( + padding: const EdgeInsets.all(20.0), + child: Column( + crossAxisAlignment: CrossAxisAlignment.stretch, + children: [ + // 1. The HERO Section: Big Price Display + _buildHeroPriceDisplay(context), + + const SizedBox(height: 24), + + // 2. Wallet Section (Conditional) + if (controller.walletChecked != 'true') + _buildWalletSection(context, controller), + + const SizedBox(height: 24), + + // 3. Rating Section + _buildRatingSection(context, controller), + + const SizedBox(height: 30), + + // 4. Submit Button + SizedBox( + height: 55, + child: MyElevatedButton( + title: 'Finish & Submit'.tr, + onPressed: () => controller.addRateToPassenger(), + // isFullWidth: true, + ), + ), + ], + ), + ), + ); + }, + ), + ); + } + + // --- WIDGETS --- + + Widget _buildHeroPriceDisplay(BuildContext context) { + final MapDriverController mapController = Get.find(); + + // Parse the string to double to format it correctly + double amount = + double.tryParse(mapController.paymentAmount.toString()) ?? 0.0; + String formattedAmount = currencyFormatter.format(amount); + + return Container( + padding: const EdgeInsets.symmetric(vertical: 30, horizontal: 20), + decoration: BoxDecoration( + color: AppColor.primaryColor, // Use your brand color or a dark color + borderRadius: BorderRadius.circular(20), + boxShadow: [ + BoxShadow( + color: AppColor.primaryColor.withOpacity(0.3), + blurRadius: 15, + offset: const Offset(0, 10), + ), + ], + ), + child: Column( + children: [ + Text( + 'Collect Cash'.tr.toUpperCase(), + style: const TextStyle( + color: Colors.white70, + fontSize: 16, + fontWeight: FontWeight.w600, + letterSpacing: 1.2, + ), + ), + const SizedBox(height: 10), + Row( + mainAxisAlignment: MainAxisAlignment.center, + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + // Currency Symbol (Small) + Padding( + padding: const EdgeInsets.only(top: 8.0), + child: Text( + 'SYP'.tr, // Replace with your local currency symbol if needed + style: TextStyle( + color: Colors.white.withOpacity(0.8), + fontSize: 24, + fontWeight: FontWeight.bold, + ), + ), + ), + const SizedBox(width: 4), + // The Price (Huge) + Text( + formattedAmount, + style: const TextStyle( + color: Colors.white, + fontSize: 56, // Very Large Font + fontWeight: FontWeight.w900, + height: 1.0, + ), + ), + ], + ), + const SizedBox(height: 10), + Container( + padding: const EdgeInsets.symmetric(horizontal: 12, vertical: 4), + decoration: BoxDecoration( + color: Colors.white.withOpacity(0.2), + borderRadius: BorderRadius.circular(20), + ), + child: Text( + 'Passenger: ${mapController.passengerName}', + style: const TextStyle(color: Colors.white, fontSize: 14), + ), + ), + ], + ), + ); + } + + Widget _buildWalletSection(BuildContext context, RateController controller) { + return Container( + decoration: BoxDecoration( + color: Theme.of(context).cardColor, + borderRadius: BorderRadius.circular(16), + border: Border.all(color: Theme.of(context).dividerColor), + ), + child: Padding( + padding: const EdgeInsets.all(20.0), + child: AnimatedSwitcher( + duration: const Duration(milliseconds: 300), + child: controller.ispassengerWantWalletFromDriver + ? _buildAmountInput(context, controller) + : _buildWalletQuery(context, controller), + ), + ), + ); + } + + Widget _buildWalletQuery(BuildContext context, RateController controller) { + return Column( + key: const ValueKey('walletQuery'), + children: [ + Row( + children: [ + Container( + padding: const EdgeInsets.all(10), + decoration: BoxDecoration( + color: Colors.amber.withOpacity(0.1), + shape: BoxShape.circle, + ), + child: + const Icon(Icons.account_balance_wallet, color: Colors.amber), + ), + const SizedBox(width: 15), + Expanded( + child: Text( + "Pay remaining to Wallet?".tr, + style: const TextStyle( + fontSize: 16, + fontWeight: FontWeight.w600, + ), + ), + ), + ], + ), + const SizedBox(height: 20), + Row( + children: [ + Expanded( + child: OutlinedButton( + onPressed: () {}, // Optional logic + style: OutlinedButton.styleFrom( + foregroundColor: Theme.of(context).hintColor, + side: BorderSide(color: Theme.of(context).dividerColor), + padding: const EdgeInsets.symmetric(vertical: 12), + shape: RoundedRectangleBorder( + borderRadius: BorderRadius.circular(10)), + ), + child: Text('No'.tr), + ), + ), + const SizedBox(width: 12), + Expanded( + child: ElevatedButton( + onPressed: () => controller.passengerWantPay(), + style: ElevatedButton.styleFrom( + backgroundColor: AppColor.primaryColor, + padding: const EdgeInsets.symmetric(vertical: 12), + shape: RoundedRectangleBorder( + borderRadius: BorderRadius.circular(10)), + ), + child: Text('Yes, Pay'.tr, + style: const TextStyle(color: Colors.white)), + ), + ), + ], + ) + ], + ); + } + + Widget _buildAmountInput(BuildContext context, RateController controller) { + return Column( + key: const ValueKey('amountInput'), + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Text( + "Enter Amount Paid".tr, + style: Theme.of(context) + .textTheme + .titleMedium + ?.copyWith(fontWeight: FontWeight.bold), + ), + const SizedBox(height: 12), + Form( + key: controller.formKey, + child: MyTextForm( + controller: controller.passengerPayAmount, + label: "Amount".tr, + hint: "0.00", + type: const TextInputType.numberWithOptions(decimal: true), + // Suggestion: Add a suffix icon for currency if available in your widget + ), + ), + const SizedBox(height: 12), + SizedBox( + width: double.infinity, + child: ElevatedButton( + onPressed: () => controller.addPassengerWallet(), + style: ElevatedButton.styleFrom( + backgroundColor: Colors.green, + shape: RoundedRectangleBorder( + borderRadius: BorderRadius.circular(10)), + ), + child: Text("Confirm Payment".tr, + style: const TextStyle(color: Colors.white)), + ), + ) + ], + ); + } + + Widget _buildRatingSection(BuildContext context, RateController controller) { + return Column( + children: [ + Text( + 'Rate Passenger'.tr, + style: TextStyle( + color: Theme.of(context).hintColor, + fontSize: 14, + fontWeight: FontWeight.w500, + ), + ), + + const SizedBox(height: 12), + RatingBar.builder( + initialRating: 0, + minRating: 1, + direction: Axis.horizontal, + allowHalfRating: false, + itemCount: 5, + itemSize: 45, // Large stars + itemPadding: const EdgeInsets.symmetric(horizontal: 2.0), + itemBuilder: (context, _) => const Icon( + Icons.star_rounded, + color: Colors.amber, + ), + onRatingUpdate: (rating) { + controller.selectRateItem(rating); + }, + ), + const SizedBox(height: 20), + // Simplified comment box + TextField( + controller: controller.comment, + maxLines: 2, + style: Theme.of(context).textTheme.bodyLarge, + decoration: InputDecoration( + hintText: 'Any comments about the passenger?'.tr, + filled: true, + fillColor: Theme.of(context).cardColor, + contentPadding: + const EdgeInsets.symmetric(horizontal: 16, vertical: 12), + border: OutlineInputBorder( + borderRadius: BorderRadius.circular(12), + borderSide: BorderSide(color: Theme.of(context).dividerColor), + ), + enabledBorder: OutlineInputBorder( + borderRadius: BorderRadius.circular(12), + borderSide: BorderSide(color: Theme.of(context).dividerColor), + ), + ), + ), + ], + ); + } +} diff --git a/siro_driver/lib/views/Rate/ride_calculate_driver.dart b/siro_driver/lib/views/Rate/ride_calculate_driver.dart new file mode 100755 index 0000000..4c41b70 --- /dev/null +++ b/siro_driver/lib/views/Rate/ride_calculate_driver.dart @@ -0,0 +1,448 @@ +import 'package:fl_chart/fl_chart.dart'; +import 'package:flutter/material.dart'; +import 'package:get/get.dart'; +import 'package:siro_driver/constant/colors.dart'; +import 'package:siro_driver/constant/info.dart'; +import 'package:siro_driver/constant/style.dart'; +import 'package:siro_driver/views/widgets/my_scafold.dart'; +import 'package:siro_driver/views/widgets/mycircular.dart'; +import 'package:intl/intl.dart'; +import '../../controller/home/captin/duration_controller .dart'; + +class RideCalculateDriver extends StatelessWidget { + RideCalculateDriver({super.key}); + // DurationController durationController = Get.put(DurationController()); + + @override + Widget build(BuildContext context) { + Get.put(DurationController()); + return MyScafolld( + title: 'Ride Summaries'.tr, + body: [ + GetBuilder( + builder: (durationController) { + if (durationController.isLoading) { + return const Center(child: MyCircularProgressIndicator()); + } + + bool hasDurations = durationController.jsonData1.isNotEmpty && + durationController.jsonData1['message'] != null && + (durationController.jsonData1['message'] as List).isNotEmpty; + + bool hasRides = durationController.jsonData2.isNotEmpty && + durationController.jsonData2['message'] != null && + (durationController.jsonData2['message'] as List).isNotEmpty; + + bool hasStats = durationController.monthlyList.isNotEmpty; + + if (!hasDurations && !hasRides && !hasStats) { + return Center( + child: Text('No data yet!'.tr), + ); + } + + return ListView( + children: [ + if (hasDurations) ...[ + Text( + '${'Average of Hours of'.tr} ${AppInformation.appName}${' is ON for this month'.tr}${' ${durationController.jsonData1['message'][0]['day'].toString().split('-')[1]}'.tr}', + style: AppStyle.title, + textAlign: TextAlign.center, + ), + Padding( + padding: const EdgeInsets.all(6), + child: Container( + decoration: AppStyle.boxDecoration1, + height: Get.height * .4, + child: LineChart( + duration: const Duration(milliseconds: 150), + curve: Curves.ease, + LineChartData( + lineBarsData: [ + LineChartBarData( + isStepLineChart: true, + spots: durationController.chartData, + isCurved: true, + color: Colors.deepPurpleAccent, + barWidth: 3, + dotData: const FlDotData(show: true), + belowBarData: BarAreaData( + show: true, + color: AppColor.deepPurpleAccent, + ), + isStrokeJoinRound: true, + shadow: const BoxShadow( + color: AppColor.yellowColor, + blurRadius: 4, + offset: Offset(2, 2), + ), + ), + ], + showingTooltipIndicators: const [], + titlesData: FlTitlesData( + show: true, + topTitles: AxisTitles( + axisNameWidget: + Text('Days'.tr, style: AppStyle.title), + axisNameSize: 30, + ), + bottomTitles: AxisTitles( + axisNameWidget: Text( + 'Total Hours on month'.tr, + style: AppStyle.title), + axisNameSize: 30, + sideTitles: const SideTitles( + reservedSize: 30, showTitles: true)), + leftTitles: AxisTitles( + axisNameWidget: Text( + 'Counts of Hours on days'.tr, + style: AppStyle.title), + axisNameSize: 30, + sideTitles: const SideTitles( + reservedSize: 30, showTitles: true)), + ), + gridData: const FlGridData(show: true), + borderData: FlBorderData( + show: true, + border: const Border( + bottom: BorderSide(color: AppColor.accentColor), + left: BorderSide(color: AppColor.accentColor), + ), + ), + ), + ), + ), + ), + ], + if (hasRides) ...[ + const SizedBox(height: 5), + Padding( + padding: const EdgeInsets.all(6), + child: Container( + decoration: AppStyle.boxDecoration1, + height: Get.height * .4, + child: LineChart( + duration: const Duration(milliseconds: 150), + curve: Curves.ease, + LineChartData( + lineBarsData: [ + LineChartBarData( + spots: durationController.chartRideCount, + color: Colors.deepPurpleAccent, + barWidth: 3, + dotData: const FlDotData(show: true), + belowBarData: BarAreaData( + show: true, + color: AppColor.deepPurpleAccent, + ), + isStrokeJoinRound: true, + shadow: const BoxShadow( + color: AppColor.yellowColor, + blurRadius: 4, + offset: Offset(2, 2), + ), + ), + ], + showingTooltipIndicators: const [], + titlesData: FlTitlesData( + show: true, + topTitles: AxisTitles( + axisNameWidget: + Text('Days'.tr, style: AppStyle.title), + axisNameSize: 30, + ), + bottomTitles: AxisTitles( + axisNameWidget: Text( + '${"Total rides on month".tr} = ${durationController.jsonData2['message'][0]['totalCount'] ?? 0}' + .tr, + style: AppStyle.title, + ), + axisNameSize: 30, + sideTitles: const SideTitles( + reservedSize: 30, showTitles: true)), + leftTitles: AxisTitles( + axisNameWidget: Text( + 'Counts of rides on days'.tr, + style: AppStyle.title), + axisNameSize: 30, + sideTitles: const SideTitles( + reservedSize: 30, showTitles: true)), + ), + gridData: const FlGridData(show: true), + borderData: FlBorderData( + show: true, + border: const Border( + bottom: BorderSide(color: AppColor.accentColor), + left: BorderSide(color: AppColor.accentColor), + ), + ), + ), + ), + ), + ), + const SizedBox(height: 5), + Padding( + padding: const EdgeInsets.all(6), + child: Container( + decoration: AppStyle.boxDecoration1, + height: Get.height * .4, + child: LineChart( + duration: const Duration(milliseconds: 150), + curve: Curves.ease, + LineChartData( + lineBarsData: [ + LineChartBarData( + isStepLineChart: true, + spots: durationController.chartRidePriceDriver, + isCurved: true, + isStrokeCapRound: true, + preventCurveOverShooting: true, + color: Colors.deepPurpleAccent, + barWidth: 3, + dotData: const FlDotData(show: true), + belowBarData: BarAreaData( + show: true, + color: AppColor.deepPurpleAccent, + ), + isStrokeJoinRound: true, + shadow: const BoxShadow( + color: AppColor.yellowColor, + blurRadius: 4, + offset: Offset(2, 2), + ), + ), + ], + showingTooltipIndicators: const [], + titlesData: FlTitlesData( + show: true, + topTitles: AxisTitles( + axisNameWidget: + Text('Days'.tr, style: AppStyle.title), + axisNameSize: 30, + ), + bottomTitles: AxisTitles( + axisNameWidget: Text( + '${"Total budgets on month".tr} = ${durationController.jsonData2['message'][0]['totalPrice'] ?? 0}' + .tr, + style: AppStyle.title, + ), + axisNameSize: 30, + sideTitles: const SideTitles( + reservedSize: 30, showTitles: true)), + leftTitles: AxisTitles( + axisNameWidget: Text( + 'Counts of budgets on days'.tr, + style: AppStyle.title), + axisNameSize: 30, + sideTitles: const SideTitles( + reservedSize: 30, showTitles: true)), + ), + gridData: const FlGridData(show: true), + borderData: FlBorderData( + show: true, + border: const Border( + bottom: BorderSide(color: AppColor.accentColor), + left: BorderSide(color: AppColor.accentColor), + ), + ), + ), + ), + ), + ), + ], + Padding( + padding: const EdgeInsets.all(8.0), + child: Container( + decoration: AppStyle.boxDecoration1, + child: !hasStats + ? SizedBox( + height: Get.height * .2, + child: Center( + child: Text( + "No statistics yet".tr, + style: AppStyle.title, + ), + ), + ) + : DriverStatsTable( + monthlyList: durationController.monthlyList, + ))) + ], + ); + }, + ) + // BarChartWidget(), + ], + isleading: true); + } +} + +class DriverStatsTable extends StatelessWidget { + final List monthlyList; + + const DriverStatsTable({Key? key, required this.monthlyList}) + : super(key: key); + + @override + Widget build(BuildContext context) { + return Container( + decoration: BoxDecoration( + borderRadius: BorderRadius.circular(10), + color: Colors.white, + boxShadow: [ + BoxShadow( + color: Colors.grey.withOpacity(0.5), + spreadRadius: 2, + blurRadius: 5, + offset: const Offset(0, 3), + ), + ], + ), + padding: const EdgeInsets.all(16), + child: DataTable( + columnSpacing: 12, + columns: [ + DataColumn(label: Text('Statistic'.tr)), + DataColumn(label: Text('Value'.tr)), + ], + rows: _buildRows(), + ), + ); + } + + List _buildRows() { + return [ + DataRow(cells: [ + DataCell(Text( + 'Total Orders'.tr, + style: AppStyle.title, + )), + DataCell(Text( + monthlyList[0]['total_orders'].toString(), + style: AppStyle.number, + )), + ]), + DataRow(cells: [ + DataCell(Text( + 'Completed'.tr, + style: AppStyle.title, + )), + DataCell(Text( + monthlyList[0]['completed_orders'].toString(), + style: AppStyle.number, + )), + ]), + DataRow(cells: [ + DataCell(Text( + 'Canceled Orders'.tr, + style: AppStyle.title, + )), + DataCell(Text( + monthlyList[0]['canceled_orders'].toString(), + style: AppStyle.number, + )), + ]), + DataRow(cells: [ + DataCell(Text( + 'Rejected Orders'.tr, + style: AppStyle.title, + )), + DataCell(Text( + monthlyList[0]['rejected_orders'].toString(), + style: AppStyle.number, + )), + ]), + DataRow(cells: [ + DataCell(Text( + 'Percent Rejected'.tr, + style: AppStyle.title, + )), + DataCell(Text( + '${(monthlyList[0]['percent_rejected']).toString()}%', + style: AppStyle.number.copyWith( + color: double.parse(monthlyList[0]['percent_canceled']) < .3 + ? AppColor.greenColor + : AppColor.redColor), + )), + ]), + DataRow(cells: [ + DataCell(Text( + 'Percent Canceled'.tr, + style: AppStyle.title, + )), + DataCell(Text( + '${(monthlyList[0]['percent_canceled']).toString()}%', + style: AppStyle.number.copyWith( + color: double.parse(monthlyList[0]['percent_canceled']) < .3 + ? AppColor.greenColor + : AppColor.redColor), + )), + ]), + DataRow(cells: [ + DataCell(Text( + 'Percent Completed'.tr, + style: AppStyle.title, + )), + DataCell(Text( + '${(monthlyList[0]['percent_completed']).toString()}%', + style: AppStyle.number.copyWith( + color: double.parse(monthlyList[0]['percent_completed']) > .7 + ? AppColor.greenColor + : AppColor.redColor), + )), + ]), + ]; + } +} + +class StaticDriverOrder extends StatelessWidget { + const StaticDriverOrder({ + Key? key, + required this.title, + required this.jsonTitle, + }) : super(key: key); + + final String title, jsonTitle; + + @override + Widget build(BuildContext context) { + return Container( + margin: const EdgeInsets.all(8.0), + padding: const EdgeInsets.all(16.0), + decoration: BoxDecoration( + color: Colors.white, + borderRadius: BorderRadius.circular(10.0), + boxShadow: [ + BoxShadow( + color: Colors.grey.withOpacity(0.3), + spreadRadius: 3, + blurRadius: 5, + offset: const Offset(0, 3), // changes position of shadow + ), + ], + ), + child: Column( + mainAxisAlignment: MainAxisAlignment.center, + children: [ + Text( + title, + style: const TextStyle( + fontSize: 16, + fontWeight: FontWeight.bold, + color: Colors.black54, + ), + ), + const SizedBox(height: 8.0), + Text( + jsonTitle, + style: const TextStyle( + fontSize: 18, + fontWeight: FontWeight.bold, + color: Colors.black, + ), + ), + ], + ), + ); + } +} diff --git a/siro_driver/lib/views/auth/captin/ai_page.dart b/siro_driver/lib/views/auth/captin/ai_page.dart new file mode 100755 index 0000000..06a8708 --- /dev/null +++ b/siro_driver/lib/views/auth/captin/ai_page.dart @@ -0,0 +1,977 @@ +import 'package:siro_driver/controller/functions/crud.dart'; +import 'package:flutter/material.dart'; +import 'package:get/get.dart'; +import 'package:siro_driver/constant/colors.dart'; +import 'package:siro_driver/constant/style.dart'; +import 'package:siro_driver/constant/table_names.dart'; +import 'package:siro_driver/controller/auth/captin/register_captin_controller.dart'; +import 'package:siro_driver/controller/functions/ocr_controller.dart'; +import 'package:siro_driver/main.dart'; +import 'package:siro_driver/views/widgets/elevated_btn.dart'; +import 'package:siro_driver/views/widgets/my_scafold.dart'; +import 'package:siro_driver/views/widgets/mycircular.dart'; + +import '../../../constant/links.dart'; +import '../../../controller/functions/encrypt_decrypt.dart'; +import '../../../controller/functions/gemeni.dart'; + +class AiPage extends StatelessWidget { + ScanDocumentsByApi scanDocumentsByApi = Get.put(ScanDocumentsByApi()); + RegisterCaptainController registerCaptainController = + Get.put(RegisterCaptainController()); + + @override + Widget build(BuildContext context) { + Get.put(AI()); + String text = ''; + return MyScafolld( + title: 'Documents check'.tr, + body: [ + GetBuilder(builder: (controller) { + return controller.isLoading + ? const MyCircularProgressIndicator() + : Padding( + padding: const EdgeInsets.all(8.0), + child: ListView( + children: [ + // egyptDriverLicense(), + // egyptCarLicenceFront(), + // egyptCarLicenceBack(), + // egyptDriverIDFront(), + // egyptDriverIDBack(), + ], + ), + ); + }), + ], + isleading: true); + } + + GetBuilder egyptDriverLicenseWidget() { + return GetBuilder( + builder: (contentController) => contentController.responseMap.isNotEmpty + ? contentController.isloading + ? Column( + children: [ + const MyCircularProgressIndicator(), + Text( + 'We are process picture please wait '.tr, + style: AppStyle.title, + ) + ], + ) + : SizedBox( + height: Get.height * .7, + child: ListView( + children: [ + Container( + decoration: AppStyle.boxDecoration1, + // height: Get.height * .4, + child: Padding( + padding: const EdgeInsets.all(5), + child: contentController.responseMap.isEmpty + ? Center( + child: Text( + 'Capture an Image of Your Driver’s License' + .tr, + style: AppStyle.title, + ), + ) + : Column( + mainAxisAlignment: + MainAxisAlignment.spaceBetween, + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Row( + mainAxisAlignment: + MainAxisAlignment.spaceBetween, + children: [ + Column( + mainAxisAlignment: + MainAxisAlignment.start, + crossAxisAlignment: + CrossAxisAlignment.start, + children: [ + Row( + children: [ + Text( + '${'Name'.tr} :${(contentController.responseMap['first_name'])}', + style: AppStyle.subtitle, + ), + Text( + ' ${(contentController.responseMap['last_name'])}', + style: AppStyle.subtitle, + ), + ], + ), + Text( + '${'Name in arabic'.tr}: ${(contentController.responseMap['name_in_arabic'])}', + style: AppStyle.title, + ), + Text( + '${'Drivers License Class'.tr}: ${contentController.responseMap['class']}', + style: AppStyle.title, + ), + ], + ), + ], + ), + Row( + mainAxisAlignment: + MainAxisAlignment.spaceBetween, + children: [ + Text( + '${'National Number'.tr}: ${(contentController.responseMap['id'])}', + style: AppStyle.title, + ), + // Image.memory( + // scanDocumentsByApi + // .imagePortrait, + // width: 60, + // ), + ]), + Text( + '${'Address'.tr}: ${(contentController.responseMap['address'])}', + style: AppStyle.title, + ), + Row( + mainAxisAlignment: + MainAxisAlignment.spaceBetween, + children: [ + Text( + '${'Date of Birth'.tr}: ${contentController.responseMap['dob']}', + style: AppStyle.title, + ), + Text( + '${'Age'.tr} : ${contentController.responseMap['age_in_years']}', + style: AppStyle.title, + ), + ], + ), + Row( + mainAxisAlignment: + MainAxisAlignment.spaceBetween, + children: [ + Text( + '${'Expiry Date'.tr}: ${contentController.responseMap['expiration_date']}', + style: DateTime.parse( + contentController + .responseMap[ + 'expiration_date'] + .toString()) + .isBefore( + contentController.now) + ? AppStyle.title.copyWith( + color: AppColor.redColor) + : AppStyle.title.copyWith( + color: AppColor.greenColor), + ), + ], + ), + ], + ), + ), + ), + const SizedBox( + height: 10, + ), + DateTime.parse(contentController + .responseMap['expiration_date'] + .toString()) + .isBefore(contentController.now) + ? Text( + 'You can\'t continue with us .\nYou should renew Driver license' + .tr, + style: AppStyle.title + .copyWith(color: AppColor.redColor), + ) + : MyElevatedButton( + kolor: AppColor.greenColor, + title: 'Lets check Car license '.tr, + onPressed: () => contentController + .getCarLicenseJordanContent()), + const SizedBox( + height: 10, + ), + contentController.responseCarLicenseMapJordan.isNotEmpty + ? Container( + decoration: AppStyle.boxDecoration, + // height: Get.height * .3, + width: Get.width * .9, + child: Column( + children: [ + Text( + '${'Name'.tr} ${contentController.responseCarLicenseMapJordan['name']}', + style: AppStyle.title, + ), + Text( + '${'Address'.tr} ${contentController.responseCarLicenseMapJordan['address']}', + style: AppStyle.title, + ), + Text( + '${'Car Kind'.tr} ${contentController.responseCarLicenseMapJordan['car_kind']}', + style: AppStyle.title, + ), + Text( + '${'Color'.tr} ${contentController.responseCarLicenseMapJordan['car_color']}', + style: AppStyle.title, + ), + Text( + '${'Year'.tr} ${contentController.responseCarLicenseMapJordan['car_year']}', + style: AppStyle.title, + ), + Text( + '${'Car Plate'.tr} ${contentController.responseCarLicenseMapJordan['car_plate']}', + style: AppStyle.title, + ), + Text( + '${'Car Expire'.tr} ${contentController.responseCarLicenseMapJordan['expire_date_of_license']}', + style: contentController + .responseCarLicenseMapJordan + .isNotEmpty + ? DateTime.parse(contentController + .responseCarLicenseMapJordan[ + 'expire_date_of_license'] + .toString()) + .isBefore(contentController.now) + ? AppStyle.title.copyWith( + color: AppColor.redColor) + : AppStyle.title.copyWith( + color: AppColor.greenColor) + : null, + ), + ], + ), + ) + : const SizedBox(), + const SizedBox( + height: 10, + ), + // DateTime.parse(contentController + // .responseCarLicenseMap[ + // 'expire_date_of_license'] + // .toString()) + // .isBefore(contentController.now) + // ? Text( + // 'You can\'t continue with us .\nYou should renew Car license' + // .tr, + // style: AppStyle.title.copyWith( + // color: AppColor.redColor), + // ) + // : + MyElevatedButton( + kolor: AppColor.greenColor, + title: 'Lets check License Back Face'.tr, + onPressed: () => contentController + .generateBackCarLicenseJordanContent()), + const SizedBox( + height: 10, + ), + contentController.responseBackCarLicenseMap.isNotEmpty + ? Container( + decoration: AppStyle.boxDecoration, + // height: 300, + child: Column(children: [ + Text( + 'VIN ${contentController.responseBackCarLicenseMap['vin']}', + style: AppStyle.title, + ), + Text( + 'Fuel Type ${contentController.responseBackCarLicenseMap['fuelType']}', + style: AppStyle.title, + ), + Text( + 'Insurance Company ${contentController.responseBackCarLicenseMap['insuranceCompany']}', + style: AppStyle.title, + ), + Text( + 'Policy Number ${contentController.responseBackCarLicenseMap['policyNumber']}', + style: AppStyle.title, + ), + Text( + 'Insurance Type ${contentController.responseBackCarLicenseMap['insuranceType']}', + style: AppStyle.title, + ) + ])) + : const SizedBox() + ], + ), + ) + : Positioned( + top: Get.height * .06, + left: Get.width * .051, + right: Get.width * .051, + child: scanDocumentsByApi.isLoading + ? Column( + children: [ + const MyCircularProgressIndicator(), + Text( + 'We are process picture please wait '.tr, + style: AppStyle.title, + ) + ], + ) + : Column( + children: [ + Container( + decoration: AppStyle.boxDecoration1, + height: Get.height * .35, + child: Padding( + padding: const EdgeInsets.all(5), + child: Center( + child: InkWell( + onTap: () async { + await CRUD().allMethodForAI( + 'name,address,dob,nationalNo,', + AppLink.uploadEgypt, + 'idFront'); //egypt + }, + child: Text( + 'Take Picture Of ID Card'.tr, + style: AppStyle.title, + ), + ), + )), + ), + ], + ), + ), + ); + } + + GetBuilder jordanDriverLicenseWidget() { + return GetBuilder( + builder: (contentController) => contentController.responseMap.isNotEmpty + ? Positioned( + top: Get.height * .09, + left: Get.width * .051, + right: Get.width * .051, + child: contentController.isloading + ? Column( + children: [ + const MyCircularProgressIndicator(), + Text( + 'We are process picture please wait '.tr, + style: AppStyle.title, + ) + ], + ) + : SizedBox( + height: Get.height * .7, + child: ListView( + children: [ + Container( + decoration: AppStyle.boxDecoration, + // height: Get.height * .4, + child: Padding( + padding: const EdgeInsets.all(5), + child: contentController.responseMap.isEmpty + ? Center( + child: Text( + 'There is no data yet.'.tr, + style: AppStyle.title, + ), + ) + : Column( + mainAxisAlignment: + MainAxisAlignment.spaceBetween, + crossAxisAlignment: + CrossAxisAlignment.start, + children: [ + Row( + mainAxisAlignment: + MainAxisAlignment.spaceBetween, + children: [ + Column( + mainAxisAlignment: + MainAxisAlignment.start, + crossAxisAlignment: + CrossAxisAlignment.start, + children: [ + Row( + children: [ + Text( + '${'Name'.tr} :${contentController.responseMap['first_name']}', + style: AppStyle.subtitle, + ), + Text( + ' ${contentController.responseMap['last_name']}', + style: AppStyle.subtitle, + ), + ], + ), + Text( + '${'Name in arabic'.tr}: ${contentController.responseMap['name_in_arabic']}', + style: AppStyle.title, + ), + Text( + '${'Drivers License Class'.tr}: ${contentController.responseMap['class']}', + style: AppStyle.title, + ), + ], + ), + ], + ), + Row( + mainAxisAlignment: + MainAxisAlignment.spaceBetween, + children: [ + Text( + '${'National Number'.tr}: ${contentController.responseMap['id']}', + style: AppStyle.title, + ), + // Image.memory( + // scanDocumentsByApi + // .imagePortrait, + // width: 60, + // ), + ]), + Text( + '${'Address'.tr}: ${contentController.responseMap['address']}', + style: AppStyle.title, + ), + Row( + mainAxisAlignment: + MainAxisAlignment.spaceBetween, + children: [ + Text( + '${'Date of Birth'.tr}: ${contentController.responseMap['dob']}', + style: AppStyle.title, + ), + Text( + '${'Age'.tr} : ${contentController.responseMap['age_in_years']}', + style: AppStyle.title, + ), + ], + ), + Row( + mainAxisAlignment: + MainAxisAlignment.spaceBetween, + children: [ + Text( + '${'Expiry Date'.tr}: ${contentController.responseMap['expiration_date']}', + style: DateTime.parse( + contentController + .responseMap[ + 'expiration_date'] + .toString()) + .isBefore( + contentController.now) + ? AppStyle.title.copyWith( + color: AppColor.redColor) + : AppStyle.title.copyWith( + color: + AppColor.greenColor), + ), + ], + ), + ], + ), + ), + ), + const SizedBox( + height: 10, + ), + DateTime.parse(contentController + .responseMap['expiration_date'] + .toString()) + .isBefore(contentController.now) + ? Text( + 'You can\'t continue with us .\nYou should renew Driver license' + .tr, + style: AppStyle.title + .copyWith(color: AppColor.redColor), + ) + : MyElevatedButton( + kolor: AppColor.greenColor, + title: 'Lets check Car license '.tr, + onPressed: () => contentController + .getTextFromCard( + '''Extract the following information from the front face of the car license card in Jordan: + +* name +* Address +* Vehicle type +* car_kind +* car_color +* Vehicle category +* car_year +* car_plate +* Registration type +* Usage type +* expire_date_of_license + +Output the extracted information in the following JSON formate and make date format like YYYY-MM-DD''')), + const SizedBox( + height: 10, + ), + contentController + .responseCarLicenseMapJordan.isNotEmpty + ? Container( + decoration: AppStyle.boxDecoration, + // height: Get.height * .3, + width: Get.width * .9, + child: Column( + children: [ + Text( + '${'Name'.tr} ${contentController.responseCarLicenseMapJordan['name']}', + style: AppStyle.title, + ), + Text( + '${'Address'.tr} ${contentController.responseCarLicenseMapJordan['address']}', + style: AppStyle.title, + ), + Text( + '${'Car Kind'.tr} ${contentController.responseCarLicenseMapJordan['car_kind']}', + style: AppStyle.title, + ), + Text( + '${'Color'.tr} ${contentController.responseCarLicenseMapJordan['car_color']}', + style: AppStyle.title, + ), + Text( + '${'Year'.tr} ${contentController.responseCarLicenseMapJordan['car_year']}', + style: AppStyle.title, + ), + Text( + '${'Car Plate'.tr} ${contentController.responseCarLicenseMapJordan['car_plate']}', + style: AppStyle.title, + ), + Text( + '${'ُExpire Date'.tr} ${contentController.responseCarLicenseMapJordan['expire_date_of_license']}', + style: contentController + .responseCarLicenseMapJordan + .isNotEmpty + ? DateTime.parse(contentController + .responseCarLicenseMapJordan[ + 'expire_date_of_license'] + .toString()) + .isBefore( + contentController.now) + ? AppStyle.title.copyWith( + color: AppColor.redColor) + : AppStyle.title.copyWith( + color: AppColor.greenColor) + : null, + ), + ], + ), + ) + : const SizedBox(), + const SizedBox( + height: 10, + ), + //todo temporary + // DateTime.parse(contentController + // .responseCarLicenseMap[ + // 'expire_date_of_license'] + // .toString()) + // .isBefore(contentController.now) + // ? Text( + // 'You can\'t continue with us .\nYou should renew Car license' + // .tr, + // style: AppStyle.title.copyWith( + // color: AppColor.redColor), + // ) + // : + MyElevatedButton( + kolor: AppColor.greenColor, + title: 'Lets check License Back Face'.tr, + onPressed: () => + contentController.getTextFromCard( + 'write json output from extracting car license back face for these key ,vin,fuelType,passengerType,curbWeight,insuranceCompany,policyNumber,notes,insuranceType and output it json .dont add data else this image', + )), + const SizedBox( + height: 10, + ), + contentController.responseBackCarLicenseMap.isNotEmpty + ? Container( + decoration: AppStyle.boxDecoration, + // height: 300, + child: Column(children: [ + Text( + 'VIN ${contentController.responseBackCarLicenseMap['vin']}', + style: AppStyle.title, + ), + Text( + 'Fuel Type ${contentController.responseBackCarLicenseMap['fuelType']}', + style: AppStyle.title, + ), + Text( + 'Insurance Company ${contentController.responseBackCarLicenseMap['insuranceCompany']}', + style: AppStyle.title, + ), + Text( + 'Policy Number ${contentController.responseBackCarLicenseMap['policyNumber']}', + style: AppStyle.title, + ), + Text( + 'Insurance Type ${contentController.responseBackCarLicenseMap['insuranceType']}', + style: AppStyle.title, + ) + ])) + : const SizedBox() + // MyElevatedButton( + // title: 'Detect Your Face '.tr, + // onPressed: () => scanDocumentsByApi + // .checkMatchFaceApi(), + // ), + // scanDocumentsByApi.res.isEmpty + // ? const SizedBox() + // : scanDocumentsByApi.res['data'] + // ['result'] + // .toString() == + // 'Same' + // ? MyElevatedButton( + // onPressed: () async { + // await registerCaptainController + // .register(); + // await registerCaptainController + // .addLisence(); + // // await scanDocumentsByApi + // // .uploadImagePortrate(); + // }, + // title: + // 'Go to next step\nscan Car License.' + // .tr, + // kolor: AppColor.greenColor, + // ) + // : const SizedBox(), + // MyElevatedButton( + // title: 'get sql data', + // kolor: AppColor.yellowColor, + // onPressed: () { + // sql.deleteAllData( + // TableName.faceDetectTimes); + // sql + // .getAllData( + // TableName.faceDetectTimes) + // value[0]['faceDetectTimes'])); + // }, + // ), + ], + ), + ), + ) + : Positioned( + top: Get.height * .06, + left: Get.width * .051, + right: Get.width * .051, + child: scanDocumentsByApi.isLoading + ? Column( + children: [ + const MyCircularProgressIndicator(), + Text( + 'We are process picture please wait '.tr, + style: AppStyle.title, + ) + ], + ) + : Column( + children: [ + Container( + decoration: AppStyle.boxDecoration, + height: Get.height * .35, + child: Padding( + padding: const EdgeInsets.all(5), + child: Center( + child: Text( + 'There is no data yet.'.tr, + style: AppStyle.title, + ), + )), + ), + ], + ), + ), + ); + } + + GetBuilder usaDriverLicensWidget() { + return GetBuilder( + builder: (scanDocumentsByApi) => scanDocumentsByApi.responseMap.isNotEmpty + ? Positioned( + top: Get.height * .06, + left: Get.width * .051, + right: Get.width * .051, + child: scanDocumentsByApi.isLoading + ? Column( + children: [ + const MyCircularProgressIndicator(), + Text( + 'We are process picture please wait '.tr, + style: AppStyle.title, + ) + ], + ) + : Column( + children: [ + Container( + decoration: AppStyle.boxDecoration, + height: Get.height * .4, + child: Padding( + padding: const EdgeInsets.all(5), + child: scanDocumentsByApi.responseMap.isEmpty + ? Center( + child: Text( + 'There is no data yet.'.tr, + style: AppStyle.title, + ), + ) + : Column( + mainAxisAlignment: + MainAxisAlignment.spaceBetween, + crossAxisAlignment: + CrossAxisAlignment.start, + children: [ + Row( + mainAxisAlignment: + MainAxisAlignment.spaceBetween, + children: [ + Column( + mainAxisAlignment: + MainAxisAlignment.start, + crossAxisAlignment: + CrossAxisAlignment.start, + children: [ + Text( + '${'Name :'.tr}${scanDocumentsByApi.name}', + style: AppStyle.subtitle, + ), + Row( + mainAxisAlignment: + MainAxisAlignment + .spaceBetween, + children: [ + Text( + '${'Drivers License Class: '.tr}${scanDocumentsByApi.licenseClass}', + style: AppStyle.title, + ), + Image.memory( + scanDocumentsByApi + .imageSignature, + width: 100, + height: 30, + ), + ], + ), + ], + ), + ], + ), + Row( + mainAxisAlignment: + MainAxisAlignment.spaceBetween, + children: [ + Text( + '${'Document Number: '.tr}${scanDocumentsByApi.documentNo}', + style: AppStyle.title, + ), + Image.memory( + scanDocumentsByApi.imagePortrait, + width: 60, + ), + ]), + Text( + '${'Address: '.tr}${scanDocumentsByApi.address}', + style: AppStyle.title, + ), + Row( + mainAxisAlignment: + MainAxisAlignment.spaceBetween, + children: [ + Text( + '${'Height: '.tr}${scanDocumentsByApi.height}', + style: AppStyle.subtitle, + ), + Text( + 'Postal Code: ${scanDocumentsByApi.postalCode}', + style: AppStyle.subtitle, + ), + Text( + 'Sex: ${scanDocumentsByApi.sex}', + style: AppStyle.subtitle, + ), + ], + ), + Text( + 'Territorial Code: ${scanDocumentsByApi.stateCode}', + style: AppStyle.subtitle, + ), + Row( + mainAxisAlignment: + MainAxisAlignment.spaceBetween, + children: [ + Text( + '${'Expiry Date: '.tr}${scanDocumentsByApi.expireDate}', + style: DateTime.parse( + scanDocumentsByApi + .responseMap['data'] + ['ocr'] + ['dateOfExpiry'] + .toString()) + .isBefore( + scanDocumentsByApi.now) + ? AppStyle.title.copyWith( + color: AppColor.redColor) + : AppStyle.title.copyWith( + color: AppColor.greenColor), + ), + Text( + '${'Date of Birth: '.tr}${scanDocumentsByApi.dob}', + style: AppStyle.title, + ), + ], + ), + ], + ), + ), + ), + DateTime.parse(scanDocumentsByApi.responseMap['data'] + ['ocr']['dateOfExpiry'] + .toString()) + .isBefore(scanDocumentsByApi.now) + ? Text( + 'You can\'t continue with us .\nYou should renew Driver license', + style: AppStyle.title + .copyWith(color: AppColor.redColor), + ) + : MyElevatedButton( + title: 'Detect Your Face '.tr, + onPressed: () => + scanDocumentsByApi.checkMatchFaceApi(), + ), + scanDocumentsByApi.res.isEmpty + ? const SizedBox() + : scanDocumentsByApi.res['data']['result'] + .toString() == + 'Same' + ? MyElevatedButton( + onPressed: () async { + await registerCaptainController + .register(); + await registerCaptainController + .addLisence(); + // await scanDocumentsByApi + // .uploadImagePortrate(); + }, + title: + 'Go to next step\nscan Car License.'.tr, + kolor: AppColor.greenColor, + ) + : const SizedBox(), + MyElevatedButton( + title: 'get sql data', + kolor: AppColor.yellowColor, + onPressed: () { + sql.deleteAllData(TableName.faceDetectTimes); + sql.getAllData(TableName.faceDetectTimes); + }, + ) + ], + ), + ) + : Positioned( + top: Get.height * .06, + left: Get.width * .051, + right: Get.width * .051, + child: scanDocumentsByApi.isLoading + ? Column( + children: [ + const MyCircularProgressIndicator(), + Text( + 'We are process picture please wait '.tr, + style: AppStyle.title, + ) + ], + ) + : Column( + children: [ + Container( + decoration: AppStyle.boxDecoration, + height: Get.height * .35, + child: Padding( + padding: const EdgeInsets.all(5), + child: Center( + child: Text( + 'There is no data yet.'.tr, + style: AppStyle.title, + ), + )), + ), + ], + ), + ), + ); + } +} + +class EgyptDocuments extends StatelessWidget { + const EgyptDocuments({ + super.key, + required this.contentController, + }); + + final AI contentController; + + @override + Widget build(BuildContext context) { + return Positioned( + top: 3, + left: Get.width * .1, + right: Get.width * .1, + child: MyElevatedButton( + title: 'Take Picture Of ID Card'.tr, //egypt + onPressed: () async { + await CRUD().allMethodForAI('name,address,dob,nationalNo,', + AppLink.uploadEgypt, 'idFront'); //egypt + }, + )); + } +} + +class JordanDocumants extends StatelessWidget { + const JordanDocumants({ + super.key, + required this.contentController, + }); + + final AI contentController; + + @override + Widget build(BuildContext context) { + return Positioned( + top: 3, + left: Get.width * .1, + right: Get.width * .1, + child: MyElevatedButton( + title: 'Take Picture Of Driver License Card'.tr, + onPressed: () { + contentController.getDriverLicenseJordanContent(); + }, + )); + } +} + +class UsaAiDocuments extends StatelessWidget { + const UsaAiDocuments({ + super.key, + required this.scanDocumentsByApi, + }); + + final ScanDocumentsByApi scanDocumentsByApi; + + @override + Widget build(BuildContext context) { + return Positioned( + top: 3, + left: Get.width * .2, + right: Get.width * .2, + child: MyElevatedButton( + title: 'Take Picture Of ID Card'.tr, + onPressed: () { + scanDocumentsByApi.scanDocumentsByApi(); + }, + )); + } +} diff --git a/siro_driver/lib/views/auth/captin/camera_widgets/camera_lisence_page.dart b/siro_driver/lib/views/auth/captin/camera_widgets/camera_lisence_page.dart new file mode 100755 index 0000000..be5aa04 --- /dev/null +++ b/siro_driver/lib/views/auth/captin/camera_widgets/camera_lisence_page.dart @@ -0,0 +1,83 @@ +// import 'package:camera/camera.dart'; +// import 'package:flutter/material.dart'; +// import 'package:get/get.dart'; +// import 'package:siro_driver/views/widgets/elevated_btn.dart'; + +// import '../../../../constant/colors.dart'; +// import '../../../../constant/style.dart'; +// import '../../../../controller/functions/camer_controller.dart'; +// import '../../../../controller/functions/ocr_controller.dart'; +// import '../../../widgets/my_scafold.dart'; + +// class CameraLisencePage extends StatelessWidget { +// CameraLisencePage.CameraLicensePage({super.key}); +// final CameraClassController cameraClassController = +// Get.put(CameraClassController()); + +// @override +// Widget build(BuildContext context) { +// return MyScafolld( +// title: 'Scan Driver License'.tr, +// body: [ +// Column(children: [ +// Text( +// 'Please put your licence in these border'.tr, +// style: AppStyle.title.copyWith(color: AppColor.greenColor), +// ), +// Padding( +// padding: const EdgeInsets.symmetric(vertical: 8, horizontal: 12), +// child: GetBuilder( +// builder: (cameraClassController) => +// cameraClassController.isCameraInitialized +// ? Stack( +// children: [ +// Container( +// decoration: AppStyle.boxDecoration, +// child: CameraPreview( +// cameraClassController.cameraController, +// ), +// ), +// Positioned( +// top: Get.height * .1, +// right: 5, +// left: 5, +// child: Container( +// height: Get.width * 3 / 4, +// width: Get.width * .9, +// decoration: BoxDecoration( +// // color: AppColor.blueColor, +// border: Border.all( +// color: AppColor.yellowColor, width: 2), +// ), +// ), +// ), +// ], +// ) +// : Container( +// decoration: AppStyle.boxDecoration, +// height: Get.width * 3 / 4, +// width: Get.width, +// child: Center( +// child: Text( +// 'Camera not initialized yet', +// style: AppStyle.title, +// ), +// ), +// ), +// ), +// ), +// const SizedBox( +// height: 20, +// ), +// MyElevatedButton( +// title: 'Take Image'.tr, +// onPressed: () { +// ScanDocumentsByApi().scanDocumentsByApi(); +// }, +// ) +// ]), +// ], +// isleading: true, +// ); +// } +// } diff --git a/siro_driver/lib/views/auth/captin/car_license_page.dart b/siro_driver/lib/views/auth/captin/car_license_page.dart new file mode 100755 index 0000000..a44e297 --- /dev/null +++ b/siro_driver/lib/views/auth/captin/car_license_page.dart @@ -0,0 +1,169 @@ +import 'dart:io'; + +import 'package:flutter/material.dart'; +import 'package:get/get.dart'; +import 'package:siro_driver/controller/functions/ocr_controller.dart'; + +import '../../../constant/style.dart'; +import '../../../controller/auth/captin/ml_google_doc.dart'; +import '../../../controller/auth/captin/register_captin_controller.dart'; +import '../../widgets/elevated_btn.dart'; +import '../../widgets/my_scafold.dart'; + +// class CarLicensePage extends StatelessWidget { +// CarLicensePage({super.key}); +// // CarRegistrationRecognizerController carRegistrationRecognizerController = +// // Get.put(CarRegistrationRecognizerController()); +// RegisterCaptainController registerCaptainController = +// Get.put(RegisterCaptainController()); + +// @override +// Widget build(BuildContext context) { +// Get.find().uploadImagePortrate(); +// return MyScafolld( +// title: 'Car License Card'.tr, +// body: [ +// Positioned( +// top: 3, +// left: Get.width * .2, +// right: Get.width * .2, +// child: MyElevatedButton( +// title: 'Take Picture Of ID Card'.tr, +// onPressed: () async { +// //0vQRyaYYDWpsv73A5CZOknseK7S2sgwE +// //3vQRyaYYSWpmv69A58ZOkxmeK6M1mgwEDlXrXlBl +// //0pALdqDDYHvzp73Q59SIgbzjG7Z2zkhJXr +// // String? visionApi = AK.serverPHP; +// await carRegistrationRecognizerController.scanText(); +// }, +// )), +// Positioned( +// top: 50, +// child: SizedBox( +// height: Get.height * .6, +// width: Get.width, +// child: buildImageWithBoundingBoxes(), +// ), +// ), +// Positioned( +// bottom: Get.height * .2, +// left: Get.width * .2, +// right: Get.width * .2, +// child: MyElevatedButton( +// title: 'Register'.tr, +// onPressed: () async { +// // registerCaptainController.addLisence(); +// // registerCaptainController.register(); +// registerCaptainController.addRegisrationCarForDriver( +// carRegistrationRecognizerController.extracted['vin'], +// carRegistrationRecognizerController.extracted['make'], +// carRegistrationRecognizerController.extracted['model'], +// carRegistrationRecognizerController.extracted['year'], +// carRegistrationRecognizerController.extracted['color'], +// carRegistrationRecognizerController.extracted['owner'], +// carRegistrationRecognizerController +// .extracted['expiration_date'], +// carRegistrationRecognizerController +// .extracted['registration_date'], +// ); +// }, +// )), +// ], +// isleading: true); +// } +// } + +// Widget buildImageWithBoundingBoxes() { +// Get.put(CarRegistrationRecognizerController()); +// return GetBuilder( +// builder: (carRegistrationRecognizerController) => +// carRegistrationRecognizerController.image == null || +// carRegistrationRecognizerController.extracted.isEmpty +// ? Center( +// child: Text( +// 'No image selected yet'.tr, +// style: AppStyle.headTitle2, +// )) +// : Column( +// children: [ +// SizedBox( +// width: Get.width * .8, +// height: Get.width * .5, +// child: Image.file( +// File(carRegistrationRecognizerController +// .croppedFile!.path), +// // fit: BoxFit.fill, +// )), +// const SizedBox( +// height: 20, +// ), +// Container( +// decoration: AppStyle.boxDecoration, +// height: Get.width * .5, +// width: Get.width * .9, +// child: Column( +// crossAxisAlignment: CrossAxisAlignment.start, +// mainAxisAlignment: MainAxisAlignment.spaceEvenly, +// children: [ +// Row( +// mainAxisAlignment: MainAxisAlignment.spaceEvenly, +// children: [ +// Text( +// '${'Made :'.tr}${carRegistrationRecognizerController.extracted['make']}', +// style: AppStyle.title, +// ), +// Text( +// '${'model :'.tr}${carRegistrationRecognizerController.extracted['model']}', +// style: AppStyle.title, +// ), +// ], +// ), +// Row( +// mainAxisAlignment: MainAxisAlignment.spaceEvenly, +// children: [ +// Text( +// '${'VIN :'.tr}${carRegistrationRecognizerController.extracted['vin']}', +// style: AppStyle.title, +// ), +// Text( +// '${'year :'.tr}${carRegistrationRecognizerController.extracted['year']}', +// style: AppStyle.title, +// ), +// ], +// ), +// Row( +// mainAxisAlignment: MainAxisAlignment.spaceEvenly, +// children: [ +// Column( +// children: [ +// Text( +// 'expiration date :${carRegistrationRecognizerController.extracted['expiration_date']}', +// style: AppStyle.title, +// ), +// Text( +// 'registration date :${carRegistrationRecognizerController.extracted['registration_date']}', +// style: AppStyle.title, +// ), +// ], +// ), +// Text( +// 'color :${carRegistrationRecognizerController.extracted['color']}', +// style: AppStyle.title, +// ), +// ], +// ), +// Row( +// mainAxisAlignment: MainAxisAlignment.spaceEvenly, +// children: [ +// Text( +// 'owner :${carRegistrationRecognizerController.extracted['owner']}', +// style: AppStyle.title, +// ), +// ], +// ), +// ], +// ), +// ) +// ], +// )); +// } diff --git a/siro_driver/lib/views/auth/captin/cards/gemini_egypt.dart b/siro_driver/lib/views/auth/captin/cards/gemini_egypt.dart new file mode 100755 index 0000000..acebece --- /dev/null +++ b/siro_driver/lib/views/auth/captin/cards/gemini_egypt.dart @@ -0,0 +1,80 @@ +import 'dart:convert'; +import 'package:get/get.dart'; +import 'package:http/http.dart' as http; + +class GeminiEgypt extends GetxController { + Map responseIdCardDriverEgypt = {}; + String? responseIdCardDriverEgypt1; + + Future geminiAiExtraction(String prompt, payload) async { + var requestBody = jsonEncode({ + 'contents': [ + { + 'parts': [ + // { + // 'inlineData': { + // 'mimeType': 'image/jpeg', + // 'data': imageData, + // }, + // }, + { + 'text': """ + $payload + + $prompt ,and make dates format like year-month-day""" + }, + ], + }, + ], + 'generationConfig': { + 'temperature': 0.4, + 'topK': 32, + 'topP': 1, + 'maxOutputTokens': 4096, + 'stopSequences': [], + }, + 'safety_settings': [ + {"category": "HARM_CATEGORY_HARASSMENT", "threshold": "BLOCK_NONE"}, + {"category": "HARM_CATEGORY_HATE_SPEECH", "threshold": "BLOCK_NONE"}, + { + "category": "HARM_CATEGORY_SEXUALLY_EXPLICIT", + "threshold": "BLOCK_NONE" + }, + { + "category": "HARM_CATEGORY_DANGEROUS_CONTENT", + "threshold": "BLOCK_NONE" + }, + ] + }); + + final response = await http.post( + Uri.parse( + // 'https://generativelanguage.googleapis.com/v1beta/models/gemini-pro-vision:generateContent?key=${AK.geminiApi}'), + 'https://generativelanguage.googleapis.com/v1beta/models/gemini-1.5-pro-latest:generateContent?key=AIzaSyCyoLcSkDzK5_SMe00nhut56SSXWPR074w'), + headers: {'Content-Type': 'application/json'}, + body: requestBody, + ); + + if (response.statusCode == 200) { + var responseData = jsonDecode(response.body); + // Process the responseData as needed + + var result = responseData['candidates'][0]['content']['parts'][0]['text']; + RegExp regex = RegExp(r"```json([^`]*)```"); + String? jsonString = + regex.firstMatch(responseData.toString())?.group(1)?.trim(); + + if (jsonString != null) { + // Convert the JSON object to a String + jsonString = jsonEncode(json.decode(jsonString)); + responseIdCardDriverEgypt1 = jsonString; + + responseIdCardDriverEgypt = jsonDecode(responseIdCardDriverEgypt1!); + update(); + return responseIdCardDriverEgypt; + } else {} + + // Rest of your code... + } else {} + } +} diff --git a/siro_driver/lib/views/auth/captin/cards/sms_signup.dart b/siro_driver/lib/views/auth/captin/cards/sms_signup.dart new file mode 100755 index 0000000..7750cdb --- /dev/null +++ b/siro_driver/lib/views/auth/captin/cards/sms_signup.dart @@ -0,0 +1,221 @@ +import 'package:siro_driver/constant/colors.dart'; +import 'package:siro_driver/constant/style.dart'; +import 'package:siro_driver/controller/auth/captin/register_captin_controller.dart'; +import 'package:siro_driver/views/widgets/elevated_btn.dart'; +import 'package:siro_driver/views/widgets/my_scafold.dart'; +import 'package:siro_driver/views/widgets/my_textField.dart'; +import 'package:siro_driver/views/widgets/mycircular.dart'; +import 'package:flutter/material.dart'; +import 'package:get/get.dart'; + +import '../../../Rate/rate_app_page.dart'; + +class SmsSignupEgypt extends StatelessWidget { + SmsSignupEgypt({super.key}); + + @override + Widget build(BuildContext context) { + Get.put(RegisterCaptainController()); + return MyScafolld( + title: 'Phone Check'.tr, + body: [ + GetBuilder( + builder: (registerCaptainController) { + return ListView( + // mainAxisAlignment: MainAxisAlignment.center, + children: [ + // Logo at the top + Padding( + padding: const EdgeInsets.only(bottom: 20.0), + child: Image.asset( + 'assets/images/logo.gif', // Make sure you have a logo image in your assets folder + height: 100, + ), + ), + // Message to the driver + Padding( + padding: + const EdgeInsets.symmetric(horizontal: 16.0, vertical: 8.0), + child: Text( + 'We need your phone number to contact you and to help you receive orders.' + .tr, + textAlign: TextAlign.center, + style: AppStyle.title, + ), + ), + // Enter phone number text + Padding( + padding: + const EdgeInsets.symmetric(horizontal: 16.0, vertical: 8.0), + child: Text( + 'Enter your phone number'.tr, + textAlign: TextAlign.center, + style: AppStyle.title, + ), + ), + // Phone number input field + Padding( + padding: const EdgeInsets.all(16.0), + child: !registerCaptainController.isSent + ? Form( + key: registerCaptainController.formKey3, + child: MyTextForm( + controller: + registerCaptainController.phoneController, + label: 'Enter your phone number'.tr, + hint: 'Enter your phone number'.tr, + type: TextInputType.phone), + ) + : Container( + decoration: AppStyle.boxDecoration1, + child: Padding( + padding: const EdgeInsets.all(8.0), + child: Text( + registerCaptainController.phoneController.text, + style: AppStyle.title, + ), + ), + )), + const SizedBox( + height: 10, + ), + Padding( + padding: const EdgeInsets.all(16.0), + child: registerCaptainController.isSent + ? Form( + key: registerCaptainController.formKey3, + child: MyTextForm( + controller: registerCaptainController.verifyCode, + label: '5 digit'.tr, + hint: '5 digit'.tr, + type: TextInputType.number), + ) + : const SizedBox()), + // Submit button + registerCaptainController.isLoading + ? const MyCircularProgressIndicator() + : Padding( + padding: const EdgeInsets.all(16.0), + child: MyElevatedButton( + onPressed: () async { + !registerCaptainController.isSent + ? await registerCaptainController.sendOtpMessage() + : await registerCaptainController.verifySMSCode(); + }, + title: 'Submit'.tr, + ), + ), + Padding( + padding: const EdgeInsets.all(16.0), + child: MyElevatedButton( + kolor: AppColor.yellowColor, + title: "Rate Our App".tr, + onPressed: () { + Get.to(RatingScreen()); + }), + ), + + // IconButton( + // onPressed: () async { + // // final plainText = + // // 'https://server.sefer.live/sefer.click/sefer'; + // // debugPrint('Plain Text: $plainText'); + + // // Encrypt the data + // // final encryptedData = encryptionHelper.encryptData(plainText); + // // debugPrint('Encrypted: $encryptedData'); + + // // Decrypt the data + // // final decryptedData = encryptionHelper.decryptData( + // // '2unGmj8jSMFBfxqH8+GN'); // Use the encryptedData variable + // // debugPrint('Decrypted: $decryptedData'); + // // box.remove('DriversSecure'); + // var drivers0 = await CRUD().get( + // link: + // 'https://server.sefer.live/sefer.click/sefer/auth/captin/getAllDriverSecure.php', + // payload: {}); + // var decodedDriver; + // if (drivers0 != 'failure') { + // decodedDriver = jsonDecode(drivers0); + + // // // // box.write('DriversSecure', decodedDriver['message']); + // } + // var drivers = decodedDriver['message']; + // Log.print('drivers.length: ${drivers.length}'); + // for (var i = 0; i < drivers.length; i++) { + // Log.print('id: ${drivers[i]['id']}'); + // var payload = { + // "phone": encryptionHelper + // .encryptData(drivers[i]['phone'].toString()), + // "email": encryptionHelper + // .encryptData(drivers[i]['email'].toString()), + // "gender": encryptionHelper + // .encryptData(drivers[i]['gender'] ?? 'unknown'), + // "birthdate": encryptionHelper + // .encryptData(drivers[i]['birthdate'].toString()), + // "first_name": encryptionHelper + // .encryptData(drivers[i]['first_name'].toString()), + // "last_name": encryptionHelper + // .encryptData(drivers[i]['last_name'].toString()), + // "sosPhone": encryptionHelper + // .encryptData(drivers[i]['sosPhone'].toString()), + // // "name_english": encryptionHelper + // // .encryptData(drivers[i]['name_english'].toString()), + // // "last_name": encryptionHelper + // // .encryptData(drivers[i]['last_name'].toString()), + // // "sosPhone": encryptionHelper + // // .encryptData(drivers[i]['sosPhone'].toString()), + // // "address": encryptionHelper + // // .encryptData(drivers[i]['address'].toString()), + // // "card_id": encryptionHelper + // // .encryptData(drivers[i]['card_id'].toString()), + // // "occupation": encryptionHelper + // // .encryptData(drivers[i]['occupation'].toString()), + // // "religion": encryptionHelper + // // .encryptData(drivers[i]['religion'].toString()), + // // "site": encryptionHelper + // // .encryptData(drivers[i]['site'].toString()), + // // "education": encryptionHelper + // // .encryptData(drivers[i]['education'].toString()), + // // "accountBank": encryptionHelper + // // .encryptData(drivers[i]['accountBank'].toString()), + // // "employmentType": encryptionHelper + // // .encryptData(drivers[i]['employmentType'].toString()), + // // "maritalStatus": (drivers[i]['maritalStatus'].toString()), + // // "fullNameMaritial": encryptionHelper.encryptData( + // // drivers[i]['fullNameMaritial'].toString()), + // 'id': drivers[i]['id'].toString() + // }; + // // print(drivers[i]['idn']); + // // if (drivers[i]['id'].toString() != + // // '01002165502a9sHC1tbrUrUw') { + // var result = await CRUD().post( + // link: + // 'https://server.sefer.live/sefer.click/sefer/auth/captin/updateDriverSecure.php', + // payload: payload); + // if (result != 'failure') { + // print(result); + // } else { + // print('failure'); + // } + // // Future.delayed(Duration(microseconds: 200)); + // // } + // } + // MyDialog().getDialog('title', 'midTitle', () { + // Get.back(); + // }); + // }, + // icon: const Icon( + // FontAwesome5.grin_tears, + // size: 29, + // color: AppColor.blueColor, + // ), + // ), + ], + ); + }), + ], + isleading: false, + ); + } +} diff --git a/siro_driver/lib/views/auth/captin/cards/syrian_card_a_i.dart b/siro_driver/lib/views/auth/captin/cards/syrian_card_a_i.dart new file mode 100755 index 0000000..c38f9de --- /dev/null +++ b/siro_driver/lib/views/auth/captin/cards/syrian_card_a_i.dart @@ -0,0 +1,987 @@ +import 'package:flutter/material.dart'; +import 'package:get/get.dart'; +import 'package:siro_driver/constant/box_name.dart'; +import 'package:siro_driver/controller/functions/audio_controller.dart'; +import 'package:siro_driver/main.dart'; +import 'package:url_launcher/url_launcher.dart'; +import '../../../../constant/colors.dart'; +import '../../../../constant/links.dart'; +import '../../../../constant/style.dart'; +import '../../../../controller/functions/gemeni.dart'; +import '../../../../controller/functions/package_info.dart'; +import '../../../../controller/functions/tts.dart'; +import '../../../../print.dart'; +import '../../../widgets/elevated_btn.dart'; +import '../../../widgets/my_circular_indicator_timer.dart'; +import '../../../widgets/my_scafold.dart'; +import '../../../widgets/mydialoug.dart'; + +// --- اقتراحات الألوان الجديدة --- +// يمكنك تعريف هذه الألوان في ملف AppColor.dart الخاص بك +class NewAppColor { + static const Color primaryColor = Color(0xFF0D47A1); // أزرق داكن + static const Color accentColor = Color(0xFF1976D2); // أزرق أفتح + static const Color backgroundColor = Color(0xFFF5F7FA); // رمادي فاتح للخلفية + static const Color cardColor = Colors.white; + static const Color textColor = Color(0xFF333333); // أسود ناعم للنصوص + static const Color subTextColor = Color(0xFF757575); // رمادي للنصوص الفرعية + static const Color successColor = Color(0xFF2E7D32); // أخضر للنجاح + static const Color errorColor = Color(0xFFC62828); // أحمر للخطأ + static const Color borderColor = Color(0xFFE0E0E0); // لون الحدود +} + +// --- اقتراحات للخطوط --- +// يمكنك استخدام حزمة google_fonts وتعيين الخط 'Cairo' أو 'Tajawal' للتطبيق +class NewAppStyle { + static TextStyle get headlineStyle { + return const TextStyle( + fontFamily: 'Cairo', // اسم الخط المقترح + fontSize: 18, + fontWeight: FontWeight.bold, + color: NewAppColor.primaryColor, + ); + } + + static TextStyle get titleStyle { + return const TextStyle( + fontFamily: 'Cairo', + fontSize: 16, + fontWeight: FontWeight.bold, + color: NewAppColor.textColor, + ); + } + + static TextStyle get bodyStyle { + return const TextStyle( + fontFamily: 'Cairo', + fontSize: 14, + color: NewAppColor.subTextColor, + height: 1.5, + ); + } + + static TextStyle get valueStyle { + return const TextStyle( + fontFamily: 'Cairo', + fontSize: 15, + fontWeight: FontWeight.w600, + color: NewAppColor.textColor, + ); + } +} + +class SyrianCardAI extends StatelessWidget { + SyrianCardAI({super.key}); + final TextToSpeechController textToSpeechController = + Get.put(TextToSpeechController()); + + @override + Widget build(BuildContext context) { + Get.put(AI()); + WidgetsBinding.instance.addPostFrameCallback((_) { + checkForUpdate(context); + }); + return MyScafolld( + // تم تغيير لون الخلفية للتصميم الجديد + // backgroundColor: NewAppColor.backgroundColor, + title: "Approve Driver Documents".tr, + action: GetBuilder(builder: (cont) { + return IconButton( + onPressed: () { + cont.isLoading = false; + cont.update(); + }, + icon: const Icon(Icons.refresh, color: NewAppColor.primaryColor), + ); + }), + body: [ + GetBuilder(builder: (controller) { + return controller.isLoading + ? MyCircularProgressIndicatorWithTimer( + isLoading: controller.isLoading, + ) + : Padding( + padding: const EdgeInsets.symmetric( + horizontal: 12.0, vertical: 8.0), + child: Column( + children: [ + // --- زر "التالي" بتصميم جديد --- + if (controller.licenceFrontSy.isNotEmpty && + controller.licenceBackSy.isNotEmpty && + (controller.idFrontSy.isNotEmpty) && + (controller.idBackSy.isNotEmpty) && + controller.vehicleFrontSy.isNotEmpty && + controller.vehicleBackSy.isNotEmpty) + Padding( + padding: const EdgeInsets.only(bottom: 16.0), + child: MyElevatedButton( + title: 'التالي'.tr, + // استخدام اللون الجديد للنجاح + kolor: NewAppColor.successColor, + onPressed: () { + controller.addDriverAndCarEgypt(); + }, + ), + ), + Expanded( + child: ListView( + children: [ + // --- فيديو الشرح بتصميم جديد --- + VideoButton(), + const SizedBox(height: 16), + egyptDriverLicense(), + const SizedBox(height: 16), + syriaDriverLicenseBack(), + const SizedBox(height: 16), + syriaVehicleCardFront(), + const SizedBox(height: 16), + syriaVehicleCardBack(), + const SizedBox(height: 16), + syriaIdCardFront(), + const SizedBox(height: 16), + syriaDriverIDBack(), + const SizedBox(height: 16), + // egyptCriminalRecord(), + // const SizedBox(height: 24), + ], + ), + ), + ], + ), + ); + }), + // --- شاشة الموافقة بتصميم جديد --- + Positioned( + top: 0, + bottom: 0, + right: 0, + left: 0, + child: GetBuilder(builder: (controller) { + return controller.approved == false + // --- إضافة خلفية معتمة --- + ? Container( + color: Colors.black.withOpacity(0.6), + child: Center( + child: Container( + margin: const EdgeInsets.all(24), + padding: const EdgeInsets.all(24), + decoration: BoxDecoration( + color: Colors.white, + borderRadius: BorderRadius.circular(20), + boxShadow: [ + BoxShadow( + color: Colors.black.withOpacity(0.2), + blurRadius: 15, + spreadRadius: 5, + ) + ], + ), + child: Column( + mainAxisSize: MainAxisSize.min, + crossAxisAlignment: CrossAxisAlignment.center, + children: [ + Text( + "Approve Driver Documents".tr, + style: NewAppStyle.headlineStyle, + ), + const SizedBox(height: 16), + Text( + "To become a ride-sharing driver on the Intaleq app, you need to upload your driver's license, ID document, and car registration document. Our AI system will instantly review and verify their authenticity in just 2-3 minutes. If your documents are approved, you can start working as a driver on the Intaleq app. Please note, submitting fraudulent documents is a serious offense and may result in immediate termination and legal consequences." + .tr, + style: NewAppStyle.bodyStyle, + textAlign: TextAlign.center, + ), + const SizedBox(height: 24), + // --- زر الاستماع بتصميم جديد --- + TextButton.icon( + style: TextButton.styleFrom( + foregroundColor: NewAppColor.accentColor, + shape: RoundedRectangleBorder( + borderRadius: BorderRadius.circular(12), + ), + padding: const EdgeInsets.symmetric( + horizontal: 20, vertical: 10), + ), + onPressed: () async { + controller.startTimer(); + if (box.read(BoxName.lang) == 'ar') { + await Get.put(AudioController()) + .playAudio1('assets/aggrement.wav'); + } else { + await textToSpeechController.speakText( + 'To become a ride-sharing driver on the Intaleq app...' + .tr); + } + }, + icon: const Icon(Icons.volume_up_outlined, + size: 30), + label: Text('اضغط للاستماع'.tr, + style: AppStyle.title.copyWith( + color: NewAppColor.accentColor)), + ), + const SizedBox(height: 24), + // --- أزرار الموافقة والرفض بتصميم جديد --- + controller.isTimerComplete + ? Row( + children: [ + Expanded( + child: MyElevatedButton( + title: 'إلغاء'.tr, + kolor: NewAppColor.errorColor, + onPressed: () { + MyDialog().getDialog( + 'سيتم إلغاء التسجيل'.tr, '', + () async { + Get.back(); + Get.back(); + }); + }), + ), + const SizedBox(width: 16), + Expanded( + child: MyElevatedButton( + title: 'أوافق'.tr, + kolor: NewAppColor.successColor, + onPressed: () { + controller.setApproved(); + }), + ), + ], + ) + : Column( + children: [ + CircularProgressIndicator( + value: controller.progressValue, + color: NewAppColor.primaryColor, + ), + const SizedBox(height: 8), + Text( + '${'الوقت المتبقي'.tr}: ${controller.remainingSeconds} ${"ثانية".tr}', + style: NewAppStyle.bodyStyle, + ), + ], + ), + ], + ), + ), + ), + ) + : const SizedBox(); + }), + ) + ], + isleading: true, + ); + } + + // --- واجهة عرض بيانات الوثيقة --- + Widget _buildDocumentDataCard({ + required String title, + required VoidCallback onRefresh, + required List children, + }) { + return Card( + elevation: 4.0, + color: NewAppColor.cardColor, + shape: RoundedRectangleBorder( + borderRadius: BorderRadius.circular(16.0), + side: BorderSide(color: NewAppColor.borderColor, width: 1), + ), + shadowColor: NewAppColor.primaryColor.withOpacity(0.1), + child: Padding( + padding: const EdgeInsets.all(16.0), + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + Text(title, style: NewAppStyle.headlineStyle), + IconButton( + onPressed: onRefresh, + icon: + const Icon(Icons.refresh, color: NewAppColor.accentColor), + ), + ], + ), + const Divider( + height: 24, thickness: 1, color: NewAppColor.borderColor), + ...children, + ], + ), + ), + ); + } + + // --- واجهة التقاط صورة الوثيقة --- + Widget _buildCaptureCard({ + required String title, + required String imagePath, + required VoidCallback onTap, + }) { + return GestureDetector( + onTap: onTap, + child: Card( + clipBehavior: Clip.antiAlias, + elevation: 2.0, + shape: RoundedRectangleBorder( + borderRadius: BorderRadius.circular(16.0), + ), + child: Column( + crossAxisAlignment: CrossAxisAlignment.stretch, + children: [ + Image.asset( + imagePath, + height: Get.height * .20, + fit: BoxFit.cover, + // --- في حال لم يتم العثور على الصورة --- + errorBuilder: (context, error, stackTrace) { + return Container( + height: Get.height * .20, + color: NewAppColor.borderColor, + child: const Icon( + Icons.camera_alt_outlined, + size: 50, + color: NewAppColor.subTextColor, + ), + ); + }, + ), + Container( + padding: const EdgeInsets.all(16.0), + color: NewAppColor.cardColor, + child: Text( + title, + style: AppStyle.title, + textAlign: TextAlign.center, + ), + ), + ], + ), + ), + ); + } + + // --- ويدجت لعرض معلومة (سطر) --- + Widget _infoRow(String label, String? value, {Color? valueColor}) { + return Padding( + padding: const EdgeInsets.symmetric(vertical: 6.0), + child: Row( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Text('$label: ', style: NewAppStyle.bodyStyle), + Expanded( + child: Text( + value ?? 'غير متوفر', + style: NewAppStyle.valueStyle.copyWith(color: valueColor), + ), + ), + ], + ), + ); + } + + GetBuilder egyptDriverLicense() { + return GetBuilder( + builder: (ai) { + if (ai.licenceFrontSy.isNotEmpty) { + final data = ai.licenceFrontSy; + + DateTime? expiryDateTime; + bool isExpired = false; + if (data['expiry_date'] != null) { + expiryDateTime = DateTime.tryParse(data['expiry_date']); + isExpired = expiryDateTime != null && + expiryDateTime.isBefore(DateTime.now()); + } + + // بطاقة «رخصة القيادة – الوجه الأمامي» بتنسيق مضغوط وأيقونات + return Card( + elevation: 2, + color: NewAppColor.cardColor, + shape: RoundedRectangleBorder( + borderRadius: BorderRadius.circular(14), + side: BorderSide(color: NewAppColor.borderColor, width: .8), + ), + child: Padding( + padding: const EdgeInsets.all(12), + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + // العنوان + زر التحديث + Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + Text('رخصة القيادة – الوجه الأمامي'.tr, + style: NewAppStyle.headlineStyle), + IconButton( + icon: const Icon(Icons.refresh, + size: 20, color: NewAppColor.accentColor), + splashRadius: 18, + onPressed: () async => await ai + .pickAndSendImage('driving_license_sy_front'), + ), + ], + ), + const SizedBox(height: 8), + + // سطر الاسم الكامل + + Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + if (data['name_arabic'] != null) + _iconInfo(Icons.person, data['name_arabic']!), + if (data['birth_place'] != null) + _iconInfo(Icons.location_city, data['birth_place']!), + ], + ), + const SizedBox(height: 8), + + // بقية الحقول داخل Wrap لتقليل الطول + Wrap( + spacing: 12, + runSpacing: 8, + children: [ + if (data['national_number'] != null) + _iconInfo(Icons.badge, data['national_number']!), + if (data['civil_registry'] != null) + _iconInfo(Icons.location_on, data['civil_registry']!), + if (data['blood_type'] != null) + _iconInfo(Icons.water_drop, data['blood_type']!), + if (data['birth_year'] != null) + _iconInfo(Icons.calendar_today, data['birth_year']!), + ], + ), + ], + ), + ), + ); + } + return _buildCaptureCard( + title: 'التقط صورة لرخصة القيادة'.tr, + imagePath: 'assets/images/1.png', + onTap: () async { + await ai.pickAndSendImage('driving_license_sy_front'); + }, + ); + }, + ); + } + + GetBuilder syriaDriverLicenseBack() { + return GetBuilder( + builder: (ai) { + if (ai.licenceBackSy.isNotEmpty) { + final data = ai.licenceBackSy; + + // صلاحية الرخصة + final DateTime? expDate = + DateTime.tryParse(data['expiry_date'] ?? ''); + final bool expired = + expDate != null && expDate.isBefore(DateTime.now()); + final Color expColor = expired + ? NewAppColor.errorColor // أحمر إن انتهت + : NewAppColor.successColor; // أخضر إن صالحة + + return Card( + elevation: 2, + color: NewAppColor.cardColor, + shape: RoundedRectangleBorder( + borderRadius: BorderRadius.circular(14), + side: BorderSide(color: NewAppColor.borderColor, width: .8), + ), + child: Padding( + padding: const EdgeInsets.all(12), + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + // عنوان البطاقة + زر الإنعاش + Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + Text('رخصة القيادة – الوجه الخلفي'.tr, + style: NewAppStyle.headlineStyle), + IconButton( + splashRadius: 18, + icon: const Icon(Icons.refresh, + size: 20, color: NewAppColor.accentColor), + onPressed: () async => await ai + .pickAndSendImage('driving_license_sy_back'), + ), + ], + ), + const SizedBox(height: 8), + + // صفّ أول (الفئة + الرقم) + Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + if (data['license_category'] != null) + _iconInfo( + Icons.star, data['license_category']!), // D1 / D2… + if (data['license_number'] != null) + _iconInfo( + Icons.confirmation_number, data['license_number']!), + ], + ), + const SizedBox(height: 8), + + // صفّ ثانٍ (التواريخ) مع تلوين تاريخ الصلاحية + Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + if (data['issue_date'] != null) + _iconInfo(Icons.event, data['issue_date']!), + if (data['expiry_date'] != null) + _iconInfo(Icons.event_busy, data['expiry_date']!, + valueColor: expColor), + ], + ), + ], + ), + ), + ); + } + + // بطاقة الالتقاط الافتراضية + return _buildCaptureCard( + title: 'التقط صورة الوجه الخلفي للرخصة'.tr, + imagePath: 'assets/images/5.png', + onTap: () async => + await ai.pickAndSendImage('driving_license_sy_back'), + ); + }, + ); + } + + GetBuilder syriaDriverIDBack() { + return GetBuilder( + builder: (ai) { + // استلمنا الحقول الأربعة فقط (governorate-address-gender-issue_date) + if (ai.idBackSy.isNotEmpty) { + final data = ai.idBackSy; + + return Card( + elevation: 2, + color: NewAppColor.cardColor, + shape: RoundedRectangleBorder( + borderRadius: BorderRadius.circular(14), + side: BorderSide(color: NewAppColor.borderColor, width: .8), + ), + child: Padding( + padding: const EdgeInsets.all(12), + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + // العنوان + زر التحديث + Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + Text('بطاقة الهوية – الوجه الخلفي'.tr, + style: NewAppStyle.headlineStyle), + IconButton( + splashRadius: 18, + icon: const Icon(Icons.refresh, + size: 20, color: NewAppColor.accentColor), + onPressed: () async => + await ai.pickAndSendImage('id_back_sy'), + ), + ], + ), + const SizedBox(height: 8), + + // المحافظة + العنوان + Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + if (data['governorate'] != null) + _iconInfo(Icons.location_city, data['governorate']!), + if (data['address'] != null) + _iconInfo(Icons.home, data['address']!), + ], + ), + const SizedBox(height: 8), + + // الجنس + تاريخ الإصدار + Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + if (data['gender'] != null) + _iconInfo(Icons.person, data['gender']!), + if (data['issue_date'] != null) + _iconInfo(Icons.event, data['issue_date']!), + ], + ), + ], + ), + ), + ); + } + + // البطاقة الافتراضية لالتقاط الصورة + return _buildCaptureCard( + title: 'التقط صورة للوجه الخلفي للهوية'.tr, + imagePath: 'assets/images/4.png', + onTap: () async => await ai.pickAndSendImage('id_back_sy'), + ); + }, + ); + } + + /// عنصر (أيقونة + قيمة) مع لون نص مخصّص عند الحاجة + Widget _iconInfo(IconData icon, String value, {Color? valueColor}) { + return Row( + mainAxisSize: MainAxisSize.min, + children: [ + Icon(icon, size: 18, color: NewAppColor.accentColor), + const SizedBox(width: 4), + Flexible( + child: Text( + value.tr, + style: NewAppStyle.bodyStyle.copyWith(color: valueColor), + overflow: TextOverflow.ellipsis, + ), + ), + ], + ); + } + + GetBuilder syriaIdCardFront() { + // أبقِ الاسم القديم إذا أردت + return GetBuilder( + builder: (ai) { + if (ai.idFrontSy.isNotEmpty) { + // غيّر المفتاح حسب متغيرك + final data = ai.idFrontSy; + + return Card( + elevation: 2, + color: NewAppColor.cardColor, + shape: RoundedRectangleBorder( + borderRadius: BorderRadius.circular(14), + side: BorderSide(color: NewAppColor.borderColor, width: .8), + ), + child: Padding( + padding: const EdgeInsets.all(12), + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + // العنوان + زر التحديث + Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + Text('بطاقة الهوية – الوجه الأمامي'.tr, + style: NewAppStyle.headlineStyle), + IconButton( + splashRadius: 18, + icon: const Icon(Icons.refresh, + size: 20, color: NewAppColor.accentColor), + onPressed: () async => await ai.pickAndSendImage( + 'id_front_sy', // أو id_front حسب تسمية end-point + ), + ), + ], + ), + const SizedBox(height: 8), + + // سطر الاسم الكامل + if (data['full_name'] != null) + _iconInfo(Icons.person, data['full_name']!), + const SizedBox(height: 8), + + // صفّ (الرقم الوطني + تاريخ الميلاد) + Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + if (data['national_number'] != null) + _iconInfo(Icons.badge, data['national_number']!), + if (data['dob'] != null) + _iconInfo(Icons.cake, data['dob']!), + ], + ), + const SizedBox(height: 8), + + // العنوان كامل بمفرده + if (data['address'] != null) + _iconInfo(Icons.home, data['address']!), + ], + ), + ), + ); + } + + // كارد الالتقاط الافتراضية + return _buildCaptureCard( + title: 'التقط صورة للوجه الأمامي للهوية'.tr, + imagePath: 'assets/images/2.png', + onTap: () async => await ai.pickAndSendImage('id_front_sy'), + ); + }, + ); + } + + GetBuilder syriaVehicleCardFront() { + // يمكنك إبقاء الاسم القديم إن شئت + return GetBuilder( + builder: (ai) { + if (ai.vehicleFrontSy.isNotEmpty) { + final data = ai.vehicleFrontSy; + + // تاريخ الفحص القادم للفحص الدوري (inspection_date) + final DateTime? nextCheck = + DateTime.tryParse(data['inspection_date'] ?? ''); + final bool overdue = + nextCheck != null && nextCheck.isBefore(DateTime.now()); + final Color checkColor = + overdue ? NewAppColor.errorColor : NewAppColor.successColor; + + return Card( + elevation: 2, + color: NewAppColor.cardColor, + shape: RoundedRectangleBorder( + borderRadius: BorderRadius.circular(14), + side: BorderSide(color: NewAppColor.borderColor, width: .8), + ), + child: Padding( + padding: const EdgeInsets.all(12), + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + // العنوان + تحديث + Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + Text('رخصة المركبة – الوجه الأمامي'.tr, + style: NewAppStyle.headlineStyle), + IconButton( + splashRadius: 18, + icon: const Icon(Icons.refresh, + size: 20, color: NewAppColor.accentColor), + onPressed: () async => await ai.pickAndSendImage( + 'vehicle_license_sy_front', + ), + ), + ], + ), + const SizedBox(height: 8), + + // الصف الأوّل (لوحة + مالك) + Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + if (data['car_plate'] != null) + _iconInfo(Icons.directions_car, data['car_plate']!), + if (data['owner'] != null) + _iconInfo(Icons.person, data['owner']!), + ], + ), + const SizedBox(height: 8), + + // الصف الثاني (VIN + اللون) + Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + if (data['vin'] != null) + _iconInfo(Icons.confirmation_num, data['vin']!), + if (data['color'] != null) + _iconInfo(Icons.palette, data['color']!), + ], + ), + const SizedBox(height: 8), + + // الصف الثالث (تاريخ المنح + الفحص القادم) + Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + if (data['issue_date'] != null) + _iconInfo(Icons.event, data['issue_date']!), + if (data['inspection_date'] != null) + _iconInfo( + Icons.event_available, data['inspection_date']!, + valueColor: checkColor), + ], + ), + ], + ), + ), + ); + } + + // لو لم تُرفع صورة بعد + return _buildCaptureCard( + title: 'التقط صورة لوجه رخصة المركبة'.tr, + imagePath: 'assets/images/6.png', + onTap: () async => + await ai.pickAndSendImage('vehicle_license_sy_front'), + ); + }, + ); + } + + GetBuilder syriaVehicleCardBack() { + // أبقِ الاسم القديم إن أردت + return GetBuilder( + builder: (ai) { + if (ai.vehicleBackSy.isNotEmpty) { + final data = ai.vehicleBackSy; + + return Card( + elevation: 2, + color: NewAppColor.cardColor, + shape: RoundedRectangleBorder( + borderRadius: BorderRadius.circular(14), + side: BorderSide(color: NewAppColor.borderColor, width: .8), + ), + child: Padding( + padding: const EdgeInsets.all(12), + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + // العنوان + زر تحديث + Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + Text('رخصة المركبة – الوجه الخلفي'.tr, + style: NewAppStyle.headlineStyle), + IconButton( + splashRadius: 18, + icon: const Icon(Icons.refresh, + size: 20, color: NewAppColor.accentColor), + onPressed: () async => await ai.pickAndSendImage( + 'vehicle_license_sy_back', + ), + ), + ], + ), + const SizedBox(height: 8), + + // صفّ (الشركة + الطراز) + Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + if (data['make'] != null) + _iconInfo(Icons.factory, data['make']!), + if (data['model'] != null) + _iconInfo(Icons.directions_car_filled, data['model']!), + ], + ), + const SizedBox(height: 8), + + // صفّ (سنة الصنع + اللون) + Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + if (data['year'] != null) + _iconInfo(Icons.calendar_today, data['year']!), + if (data['fuel'] != null) + _iconInfo(Icons.local_gas_station, data['fuel']!), + ], + ), + const SizedBox(height: 8), + + // رقم الهيكل بمفرده (قد يكون طويلًا) + if (data['chassis'] != null) + _iconInfo(Icons.confirmation_num, data['chassis']!), + ], + ), + ), + ); + } + + // بطاقة الالتقاط الافتراضية + return _buildCaptureCard( + title: 'التقط صورة لخلفية رخصة المركبة'.tr, + imagePath: 'assets/images/3.png', + onTap: () async => + await ai.pickAndSendImage('vehicle_license_sy_back'), + ); + }, + ); + } + + GetBuilder egyptCriminalRecord() { + return GetBuilder( + builder: (ai) { + if (ai.responseCriminalRecordEgypt.isNotEmpty) { + return _buildDocumentDataCard( + title: 'صحيفة الحالة الجنائية'.tr, + onRefresh: () async { + await ai.allMethodForAI( + (ai.prompts[5]['prompt'].toString()), + AppLink.uploadEgypt, + 'criminalRecord', + ); + }, + children: [ + _infoRow('نتيجة الفحص'.tr, + ai.responseCriminalRecordEgypt['InspectionResult']), + _infoRow( + 'الاسم الكامل'.tr, + ai.responseCriminalRecordEgypt['FullName'], + valueColor: (ai.responseCriminalRecordEgypt['FullName']) == + (ai.responseIdEgyptDriverLicense['name_arabic']) + ? NewAppColor.successColor + : NewAppColor.errorColor, + ), + _infoRow('الرقم القومي'.tr, + ai.responseCriminalRecordEgypt['NationalID']), + ], + ); + } + return _buildCaptureCard( + title: 'التقط صورة لصحيفة الحالة الجنائية'.tr, + imagePath: 'assets/images/6.png', + onTap: () async { + await ai.allMethodForAI( + (ai.prompts[5]['prompt'].toString()), + AppLink.uploadEgypt, + 'criminalRecord', + ); + }, + ); + }, + ); + } +} + +// --- واجهة عرض الأقسام غير المصرية (بدون تغيير) --- + +// --- زر الفيديو بتصميم جديد --- +class VideoButton extends StatelessWidget { + final String videoUrl = + "https://youtube.com/shorts/fC0RmYH5B_0?feature=share"; + + @override + Widget build(BuildContext context) { + return Card( + elevation: 2, + shape: RoundedRectangleBorder(borderRadius: BorderRadius.circular(12)), + child: InkWell( + onTap: () async { + if (await canLaunchUrl(Uri.parse(videoUrl))) { + await launchUrl(Uri.parse(videoUrl)); + } else { + Get.snackbar('خطأ', 'لا يمكن فتح الفيديو'); + } + }, + borderRadius: BorderRadius.circular(12), + child: Padding( + padding: const EdgeInsets.symmetric(horizontal: 16.0, vertical: 12.0), + child: Row( + mainAxisAlignment: MainAxisAlignment.center, + children: [ + const Icon(Icons.play_circle_outline, + color: NewAppColor.accentColor, size: 28), + const SizedBox(width: 12), + Text( + "شاهد فيديو الشرح".tr, + style: AppStyle.title.copyWith(color: NewAppColor.accentColor), + ), + ], + ), + ), + ), + ); + } +} diff --git a/siro_driver/lib/views/auth/captin/contact_us_page.dart b/siro_driver/lib/views/auth/captin/contact_us_page.dart new file mode 100755 index 0000000..95b8f73 --- /dev/null +++ b/siro_driver/lib/views/auth/captin/contact_us_page.dart @@ -0,0 +1,100 @@ +import 'package:flutter/cupertino.dart'; +import 'package:flutter/material.dart'; +import 'package:flutter_font_icons/flutter_font_icons.dart'; +import 'package:get/get.dart'; + +import '../../../constant/colors.dart'; +import '../../../constant/style.dart'; +import '../../../controller/functions/tts.dart'; +import '../../../controller/home/captin/contact_us_controller.dart'; +import '../../widgets/my_scafold.dart'; + +class ContactUsPage extends StatelessWidget { + ContactUsPage({super.key}); + + @override + Widget build(BuildContext context) { + Get.put(ContactUsController()); + return GetBuilder(builder: (controller) { + return MyScafolld( + title: "Contact Us".tr, + body: [ + Padding( + padding: const EdgeInsets.all(8.0), + child: ListView( + // crossAxisAlignment: CrossAxisAlignment.center, + // mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + Container( + decoration: AppStyle.boxDecoration1, + child: Column( + children: [ + ClipRRect( + borderRadius: BorderRadius.circular(15), + child: Image.asset('assets/images/logo.gif')), + IconButton( + onPressed: () async { + Get.put(TextToSpeechController()).speakText( + 'Intaleq is the safest ride-sharing app that introduces many features for both captains and passengers. We offer the lowest commission rate of just 8%, ensuring you get the best value for your rides. Our app includes insurance for the best captains, regular maintenance of cars with top engineers, and on-road services to ensure a respectful and high-quality experience for all users.' + .tr); + }, + icon: const Icon(Icons.headphones), + ), + Padding( + padding: const EdgeInsets.all(8.0), + child: Text( + 'Intaleq is the safest ride-sharing app that introduces many features for both captains and passengers. We offer the lowest commission rate of just 8%, ensuring you get the best value for your rides. Our app includes insurance for the best captains, regular maintenance of cars with top engineers, and on-road services to ensure a respectful and high-quality experience for all users.' + .tr, + style: AppStyle.title, + textAlign: TextAlign.center, + ), + ), + ], + ), + ), + const SizedBox( + height: 30, + ), + Container( + decoration: AppStyle.boxDecoration1, + child: Padding( + padding: const EdgeInsets.all(8.0), + child: Text( + "You can contact us during working hours from 10:00 - 17:00." + .tr, + style: AppStyle.title, + textAlign: TextAlign.center, + ), + ), + ), + InkWell( + onTap: () => controller.showContactDialog(context), + child: const Row( + mainAxisAlignment: MainAxisAlignment.spaceEvenly, + children: [ + Icon( + Icons.phone, + color: AppColor.blueColor, + ), + Icon( + FontAwesome.whatsapp, + color: AppColor.greenColor, + ), + Icon( + Icons.email, + color: AppColor.redColor, + ), + ], + ), + ), + const SizedBox( + height: 30, + ) + ], + ), + ) + ], + isleading: true); + }); + } +} diff --git a/siro_driver/lib/views/auth/captin/criminal_documents_page.dart b/siro_driver/lib/views/auth/captin/criminal_documents_page.dart new file mode 100755 index 0000000..1d1df44 --- /dev/null +++ b/siro_driver/lib/views/auth/captin/criminal_documents_page.dart @@ -0,0 +1,211 @@ +import 'package:flutter/material.dart'; +import 'package:get/get.dart'; + +import '../../../constant/box_name.dart'; +import '../../../constant/colors.dart'; +import '../../../constant/links.dart'; +import '../../../constant/style.dart'; +import '../../../controller/functions/encrypt_decrypt.dart'; +import '../../../controller/functions/gemeni.dart'; +import '../../../controller/functions/tts.dart'; +import '../../../main.dart'; +import '../../widgets/elevated_btn.dart'; +import '../../widgets/my_scafold.dart'; + +class CriminalDocumemtPage extends StatelessWidget { + const CriminalDocumemtPage({super.key}); + + @override + Widget build(BuildContext context) { + Get.put(AI()); + return MyScafolld( + title: "Criminal Document".tr, + isleading: false, + body: [ + GetBuilder(builder: (controller) { + return Column( + children: [ + Container( + decoration: AppStyle.boxDecoration, + child: Padding( + padding: const EdgeInsets.all(8.0), + child: Text('You have upload Criminal documents'.tr), + )), + egyptCriminalRecord(), + controller.responseCriminalRecordEgypt.isNotEmpty + ? MyElevatedButton( + title: 'Next'.tr, + onPressed: () async { + if ((controller + .responseCriminalRecordEgypt['FullName']) != + box.read(BoxName.nameArabic)) //todo get from server + { + Get.defaultDialog( + barrierDismissible: false, + title: 'Criminal Record Mismatch', + content: Column( + mainAxisSize: MainAxisSize.min, + children: [ + const Icon(Icons.warning, + size: 48, color: Colors.red), + const SizedBox(height: 16), + Text( + 'The full name on your criminal record does not match the one on your driver’s license. Please verify and provide the correct documents.' + .tr, + textAlign: TextAlign.center, + style: AppStyle.title, + ), + const SizedBox(height: 16), + IconButton( + onPressed: () async { + await Get.find() + .speakText( + 'The full name on your criminal record does not match the one on your driver’s license. Please verify and provide the correct documents.' + .tr, + ); + }, + icon: const Icon(Icons.volume_up), + ), + ], + ), + actions: [ + TextButton( + onPressed: () { + Get.back(); + }, + child: const Text('OK'), + ), + ], + ); + } else { + await controller.addCriminalDocuments(); + } + }) + : const SizedBox(), + ], + ); + }) + ], + ); + } + + GetBuilder egyptCriminalRecord() { + return GetBuilder( + builder: (ai) { + if (ai.responseCriminalRecordEgypt.isNotEmpty) { + return Card( + elevation: 4.0, + shape: RoundedRectangleBorder( + borderRadius: BorderRadius.circular(16.0), + ), + child: Padding( + padding: const EdgeInsets.all(16.0), + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + Text('Criminal Record'.tr, style: AppStyle.headTitle2), + IconButton( + onPressed: () async { + await ai.allMethodForAI( + """ +Write a JSON object from the following information extracted from the provided Arabic text: + +{ + "InspectionResult": "", + "NationalID": "", + "FullName": "", + "IssueDate": "" // Format: YYYY-MM-DD +} + +Important notes: +1. For the IssueDate, ensure the date is in YYYY-MM-DD format using Latin numerals (0-9). +2. Add appropriate spaces in all text fields to ensure readability. +3. If any information is missing, leave the corresponding field as an empty string. +4. Ensure all text is properly formatted and spaces are used correctly. +5. Convert any Arabic numerals to Latin numerals (0-9) where applicable. + +Please fill in the JSON object with the extracted information, following these guidelines. +""", + AppLink.uploadEgypt, + 'criminalRecord', + ); + }, + icon: const Icon(Icons.refresh), + ), + ], + ), + const SizedBox(height: 8.0), + const Divider(color: AppColor.accentColor), + const SizedBox(height: 8.0), + Text( + '${'InspectionResult'.tr}: ${(ai.responseCriminalRecordEgypt['InspectionResult'])}'), + const SizedBox(height: 8.0), + Text( + '${'FullName'.tr}: ${(ai.responseCriminalRecordEgypt['FullName'])}', + style: AppStyle.title.copyWith( + color: (ai.responseCriminalRecordEgypt['FullName']) == + (ai.responseIdEgyptDriverLicense['name_arabic']) + ? AppColor.greenColor + : AppColor.redColor), + ), + const SizedBox(height: 8.0), + Text( + '${'NationalID'.tr}: ${(ai.responseCriminalRecordEgypt['NationalID'])}'), + const SizedBox(height: 8.0), + Text( + '${'IssueDate'.tr}: ${ai.responseCriminalRecordEgypt['IssueDate']}'), + ], + ), + ), + ); + } + return Card( + child: InkWell( + onTap: () async { + await ai.allMethodForAI( + """ +Write a JSON object from the following information extracted from the provided Arabic text: + +{ + "InspectionResult": "", + "NationalID": "", + "FullName": "", + "IssueDate": "" // Format: YYYY-MM-DD +} + +Important notes: +1. For the IssueDate, ensure the date is in YYYY-MM-DD format using Latin numerals (0-9). +2. Add appropriate spaces in all text fields to ensure readability. +3. If any information is missing, leave the corresponding field as an empty string. +4. Ensure all text is properly formatted and spaces are used correctly. +5. Convert any Arabic numerals to Latin numerals (0-9) where applicable. + +Please fill in the JSON object with the extracted information, following these guidelines. +""", + AppLink.uploadEgypt, + 'criminalRecord', + ); + }, + child: Column( + children: [ + Image.asset( + 'assets/images/6.png', + height: Get.height * .25, + width: double.maxFinite, + fit: BoxFit.fitHeight, + ), + Text( + 'Capture an Image of Your Criminal Record'.tr, + style: AppStyle.title, + ), + ], + ), + ), + ); + }, + ); + } +} diff --git a/siro_driver/lib/views/auth/captin/driver_car_controller.dart b/siro_driver/lib/views/auth/captin/driver_car_controller.dart new file mode 100755 index 0000000..1fae00d --- /dev/null +++ b/siro_driver/lib/views/auth/captin/driver_car_controller.dart @@ -0,0 +1,110 @@ +import 'dart:convert'; + +import 'package:get/get.dart'; + +import '../../../constant/box_name.dart'; +import '../../../constant/links.dart'; +import '../../../controller/functions/crud.dart'; +import '../../../main.dart'; +import '../../widgets/error_snakbar.dart'; + +class DriverCarController extends GetxController { + bool isLoading = false; + List cars = []; + // int? carId; + fetchCatrsForDrivers() async { + isLoading = true; + update(); + var res = await CRUD().get(link: AppLink.getNewCarsDrivers, payload: { + "driverID": box.read(BoxName.driverID).toString(), + }); + if (res != 'failure') { + var d = jsonDecode(res)['message']; + cars = d; + // carId = cars.isEmpty ? 1 : cars.length + 1; + } + isLoading = false; + update(); + } + + addCarsForDrivers( + String vin, + String carPlate, + String make, + String model, + String year, + String expirationDate, + String color, + String colorHex, + String address, + String owner, + String registrationDate, + String displacement, + String fuel) async { + var res = await CRUD().post( + link: AppLink.addRegisrationCar, + payload: { + "driverID": box.read(BoxName.driverID).toString(), + "vin": vin ?? 'unknown', + "car_plate": carPlate.toString(), + "make": make ?? 'unknown', + "model": model ?? 'unknown', + "year": year ?? 'unknown', + "expiration_date": expirationDate ?? 'unknown', + "color": color ?? 'unknown', + "owner": owner ?? 'unknown', + "color_hex": colorHex ?? '#000000', + "address": address ?? 'unknown', + "displacement": displacement ?? 'unknown', + "fuel": fuel ?? 'unknown', + "registration_date": registrationDate ?? 'unknown', + }, + ); + if (res != 'failure') { + mySnackbarSuccess(''); + + fetchCatrsForDrivers(); + } else { + mySnackeBarError(''); + } + } + +// update carRegistration only and insert on it without tow column + Future updateCarRegistration(String id, String driverID) async { + final body = { + 'id': id, + 'driverID': driverID, + }; +// remove default before update + var response = await CRUD().post( + link: AppLink.makeDefaultCar, + payload: body, + ); + + if (response != 'failure') { + mySnackbarSuccess('Updated'.tr); + } else { + mySnackeBarError('Not updated'.tr); + } + } + +//todo need review + removeCar(String carId) async { + isLoading = true; + update(); + var res = await CRUD().post(link: AppLink.deleteNewCarsDrivers, payload: { + "id": carId.toString(), + }); + if (res != 'failure') { + mySnackbarSuccess('deleted'.tr); + } + isLoading = false; + update(); + } + + @override + void onInit() { + fetchCatrsForDrivers(); + super.onInit(); + } +} diff --git a/siro_driver/lib/views/auth/captin/forget.dart b/siro_driver/lib/views/auth/captin/forget.dart new file mode 100755 index 0000000..e69de29 diff --git a/siro_driver/lib/views/auth/captin/invite_driver_screen.dart b/siro_driver/lib/views/auth/captin/invite_driver_screen.dart new file mode 100755 index 0000000..c6725cb --- /dev/null +++ b/siro_driver/lib/views/auth/captin/invite_driver_screen.dart @@ -0,0 +1,639 @@ +import 'package:flutter/material.dart'; +import 'package:flutter/cupertino.dart'; +import 'package:get/get.dart'; + +import '../../../constant/box_name.dart'; +import '../../../constant/colors.dart'; +import '../../../controller/auth/captin/invit_controller.dart'; +import '../../../controller/functions/encrypt_decrypt.dart'; +import '../../../main.dart'; + +class InviteScreen extends StatelessWidget { + final InviteController controller = Get.put(InviteController()); + + @override + Widget build(BuildContext context) { + return Scaffold( + backgroundColor: CupertinoColors.systemBackground, + appBar: AppBar( + backgroundColor: CupertinoColors.systemBackground, + elevation: 0, + title: Text( + 'Invite'.tr, + style: const TextStyle(color: CupertinoColors.label), + ), + leading: IconButton( + icon: const Icon(Icons.arrow_back_ios, color: AppColor.blueColor), + onPressed: () => Get.back(), + ), + ), + body: SafeArea( + child: GetBuilder( + builder: (controller) { + return Column( + children: [ + Padding( + padding: const EdgeInsets.all(16.0), + child: Container( + decoration: BoxDecoration( + color: CupertinoColors.systemGrey6, + borderRadius: BorderRadius.circular(8), + ), + child: SegmentedButton( + style: ButtonStyle( + backgroundColor: WidgetStateProperty.resolveWith( + (states) => states.contains(WidgetState.selected) + ? CupertinoColors.white + : Colors.transparent, + ), + foregroundColor: WidgetStateProperty.resolveWith( + (states) => states.contains(WidgetState.selected) + ? AppColor.blueColor + : CupertinoColors.label, + ), + ), + segments: [ + ButtonSegment( + value: 0, + label: Padding( + padding: const EdgeInsets.all(8.0), + child: Text('Drivers'.tr), + ), + ), + ButtonSegment( + value: 1, + label: Padding( + padding: const EdgeInsets.all(8.0), + child: Text('Passengers'.tr), + ), + ), + ], + selected: {controller.selectedTab}, + onSelectionChanged: (Set newSelection) { + controller.updateSelectedTab(newSelection.first); + }, + ), + ), + ), + Expanded( + child: SingleChildScrollView( + padding: const EdgeInsets.all(16), + child: controller.selectedTab == 0 + ? _buildDriverTab(context) + : _buildPassengerTab(context), + ), + ), + ], + ); + }, + ), + ), + ); + } + + Widget _buildDriverTab(BuildContext context) { + return Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + const SizedBox(height: 20), + Text( + "Invite another driver and both get a gift after he completes 100 trips!" + .tr, + style: const TextStyle( + fontSize: 17, + fontWeight: FontWeight.w600, + color: CupertinoColors.label, + ), + ), + const SizedBox(height: 20), + _buildPhoneInput(), + const SizedBox(height: 20), + _buildActionButtons(), + const SizedBox(height: 20), + _buildInvitationsList(context), + ], + ); + } + + Widget _buildPassengerTab(BuildContext context) { + return Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Container( + padding: const EdgeInsets.all(16), + decoration: BoxDecoration( + color: CupertinoColors.systemGrey6, + borderRadius: BorderRadius.circular(12), + ), + child: Column( + children: [ + Text( + "Share this code with passengers and earn rewards when they use it!" + .tr, + textAlign: TextAlign.center, + style: const TextStyle( + color: CupertinoColors.secondaryLabel, + fontSize: 13, + ), + ), + ], + ), + ), + const SizedBox(height: 20), + _buildPhoneInput(), + const SizedBox(height: 20), + _buildActionButtonsPassengers(), + const SizedBox(height: 20), + const SizedBox(height: 20), + _buildInvitationsListPassengers(context), + ], + ); + } + + Widget _buildPhoneInput() { + return Container( + decoration: BoxDecoration( + color: CupertinoColors.systemGrey6, + borderRadius: BorderRadius.circular(8), + ), + child: Row( + children: [ + Expanded( + child: CupertinoTextField.borderless( + controller: controller.invitePhoneController, + placeholder: 'Enter phone'.tr, + padding: const EdgeInsets.all(12), + keyboardType: TextInputType.phone, + ), + ), + CupertinoButton( + child: const Icon(CupertinoIcons.person_badge_plus, + color: AppColor.blueColor), + onPressed: () async { + await controller.pickContactFromNativeApp(); + if (controller.contacts.isNotEmpty) { + if (box.read(BoxName.isSavedPhones) == null) { + // controller.savePhoneToServer(); + box.write(BoxName.isSavedPhones, true); + } + _showContactsDialog(Get.context!); + } + }, + ), + ], + ), + ); + } + + Widget _buildActionButtons() { + return Padding( + padding: const EdgeInsets.symmetric(vertical: 20.0, horizontal: 16.0), + child: Row( + children: [ + Expanded( + child: Container( + decoration: BoxDecoration( + borderRadius: BorderRadius.circular(10), + boxShadow: [ + BoxShadow( + color: Colors.black.withOpacity(0.1), + blurRadius: 6, + offset: const Offset(0, 3), + ), + ], + ), + child: CupertinoButton( + color: AppColor.blueColor, + borderRadius: BorderRadius.circular(10), + padding: const EdgeInsets.symmetric(vertical: 14), + onPressed: controller.sendInvite, + child: Text( + 'Send Invite'.tr, + style: const TextStyle( + fontSize: 16, + fontWeight: FontWeight.bold, + color: CupertinoColors.white, + ), + ), + ), + ), + ), + const SizedBox(width: 16), + Expanded( + child: Container( + decoration: BoxDecoration( + borderRadius: BorderRadius.circular(10), + boxShadow: [ + BoxShadow( + color: Colors.black.withOpacity(0.1), + blurRadius: 6, + offset: const Offset(0, 3), + ), + ], + ), + child: CupertinoButton( + color: AppColor.blueColor, + borderRadius: BorderRadius.circular(10), + padding: const EdgeInsets.symmetric(vertical: 14), + child: Text( + 'Show Invitations'.tr, + style: const TextStyle( + fontSize: 16, + fontWeight: FontWeight.bold, + color: CupertinoColors.white, + ), + ), + onPressed: () async { + controller.fetchDriverStats(); + }, + ), + ), + ), + ], + ), + ); + } + + Widget _buildActionButtonsPassengers() { + return Padding( + padding: const EdgeInsets.symmetric(vertical: 20.0, horizontal: 16.0), + child: Row( + children: [ + Expanded( + child: Container( + decoration: BoxDecoration( + borderRadius: BorderRadius.circular(10), + boxShadow: [ + BoxShadow( + color: Colors.black.withOpacity(0.1), + blurRadius: 6, + offset: const Offset(0, 3), + ), + ], + ), + child: CupertinoButton( + color: AppColor.blueColor, + borderRadius: BorderRadius.circular(10), + padding: const EdgeInsets.symmetric(vertical: 14), + onPressed: controller.sendInviteToPassenger, + child: Text( + 'Send Invite'.tr, + style: const TextStyle( + fontSize: 16, + fontWeight: FontWeight.bold, + color: CupertinoColors.white, + ), + ), + ), + ), + ), + const SizedBox(width: 16), + Expanded( + child: Container( + decoration: BoxDecoration( + borderRadius: BorderRadius.circular(10), + boxShadow: [ + BoxShadow( + color: Colors.black.withOpacity(0.1), + blurRadius: 6, + offset: const Offset(0, 3), + ), + ], + ), + child: CupertinoButton( + color: AppColor.blueColor, + borderRadius: BorderRadius.circular(10), + padding: const EdgeInsets.symmetric(vertical: 14), + child: Text( + 'Show Invitations'.tr, + style: const TextStyle( + fontSize: 16, + fontWeight: FontWeight.bold, + color: CupertinoColors.white, + ), + ), + onPressed: () async { + controller.fetchDriverStatsPassengers(); + }, + ), + ), + ), + ], + ), + ); + } + + Widget _buildInvitationsList(BuildContext context) { + return SizedBox( + height: Get.height * .4, + child: controller.driverInvitationData.isEmpty + ? Center( + child: Text( + "No invitation found yet!".tr, + style: const TextStyle( + color: CupertinoColors.secondaryLabel, + fontSize: 17, + ), + ), + ) + : ListView.builder( + itemCount: controller.driverInvitationData.length, + itemBuilder: (context, index) { + return _buildInvitationItem(context, index); + }, + ), + ); + } + + Widget _buildInvitationsListPassengers(BuildContext context) { + return SizedBox( + height: Get.height * .4, + child: controller.driverInvitationDataToPassengers.isEmpty + ? Center( + child: Text( + "No invitation found yet!".tr, + style: const TextStyle( + color: CupertinoColors.secondaryLabel, + fontSize: 17, + ), + ), + ) + : ListView.builder( + itemCount: controller.driverInvitationDataToPassengers.length, + itemBuilder: (context, index) { + return _buildInvitationItemPassengers(context, index); + }, + ), + ); + } + + Widget _buildInvitationItem(BuildContext context, int index) { + int countOfInvitDriver = int.tryParse( + (controller.driverInvitationData[index]['countOfInvitDriver']) + ?.toString() ?? + '0') ?? + 0; + double progressValue = (countOfInvitDriver / 100.0).clamp(0.0, 1.0); + + return GestureDetector( + onTap: () { + controller.onSelectDriverInvitation(index); + }, + child: Container( + margin: const EdgeInsets.symmetric(vertical: 8.0), + padding: const EdgeInsets.all(16), + decoration: BoxDecoration( + color: CupertinoColors.systemGrey6, + borderRadius: BorderRadius.circular(12), + ), + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Text( + (controller.driverInvitationData[index]['invitorName']), + style: const TextStyle( + fontSize: 17, + fontWeight: FontWeight.w600, + color: CupertinoColors.label, + ), + ), + const SizedBox(height: 8), + ClipRRect( + borderRadius: BorderRadius.circular(4), + child: LinearProgressIndicator( + value: progressValue, + backgroundColor: CupertinoColors.systemGrey4, + valueColor: + const AlwaysStoppedAnimation(AppColor.blueColor), + minHeight: 6, + ), + ), + const SizedBox(height: 4), + Text( + '$countOfInvitDriver / 100 ${'Trip'.tr}', + style: const TextStyle( + fontSize: 13, + color: CupertinoColors.secondaryLabel, + ), + ), + ], + ), + ), + ); + } + + Widget _buildInvitationItemPassengers(BuildContext context, int index) { + // Extracting the data from the sample JSON-like structure + var invitation = controller.driverInvitationDataToPassengers[index]; + + int countOfInvitDriver = + int.tryParse((invitation['countOfInvitDriver'])?.toString() ?? '0') ?? + 0; + double progressValue = (countOfInvitDriver / 10.0).clamp(0.0, 1.0); + + return GestureDetector( + onTap: () { + controller.onSelectPassengerInvitation(index); + }, + child: Container( + margin: const EdgeInsets.symmetric(vertical: 8.0), + padding: const EdgeInsets.all(16), + decoration: BoxDecoration( + color: CupertinoColors.systemGrey6, + borderRadius: BorderRadius.circular(12), + ), + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Text( + (invitation['passengerName']) + .toString(), // Handle null or missing data + style: const TextStyle( + fontSize: 17, + fontWeight: FontWeight.w600, + color: CupertinoColors.label, + ), + ), + const SizedBox(height: 8), + ClipRRect( + borderRadius: BorderRadius.circular(4), + child: LinearProgressIndicator( + value: progressValue, + backgroundColor: CupertinoColors.systemGrey4, + valueColor: + const AlwaysStoppedAnimation(AppColor.blueColor), + minHeight: 6, + ), + ), + const SizedBox(height: 4), + Text( + '$countOfInvitDriver / 3 ${'Trip'.tr}', // Show trips completed + style: const TextStyle( + fontSize: 13, + color: CupertinoColors.secondaryLabel, + ), + ), + ], + ), + ), + ); + } + + Widget _buildPassengerStats(BuildContext context) { + return Container( + padding: const EdgeInsets.all(16), + decoration: BoxDecoration( + color: CupertinoColors.systemGrey6, + borderRadius: BorderRadius.circular(12), + ), + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Text( + "Your Rewards".tr, + style: const TextStyle( + fontSize: 17, + fontWeight: FontWeight.w600, + color: CupertinoColors.label, + ), + ), + const SizedBox(height: 16), + _buildStatItem( + context, + "Total Invites".tr, + (controller.driverInvitationDataToPassengers[0] + ['countOfInvitDriver'] + .toString()), + ), + _buildStatItem( + context, + "Active Users".tr, + (controller.driverInvitationDataToPassengers[0]['passengerName']) + .toString(), + ), + ], + ), + ); + } + + Widget _buildStatItem(BuildContext context, String label, String value) { + return Padding( + padding: const EdgeInsets.symmetric(vertical: 8.0), + child: Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + Text( + label, + style: const TextStyle( + color: CupertinoColors.label, + fontSize: 15, + ), + ), + Text( + value, + style: const TextStyle( + fontWeight: FontWeight.w600, + color: AppColor.blueColor, + fontSize: 15, + ), + ), + ], + ), + ); + } + + void _showContactsDialog(BuildContext context) { + showCupertinoModalPopup( + context: context, + builder: (BuildContext context) => Container( + height: 400, + color: CupertinoColors.systemBackground, + child: Column( + children: [ + Container( + padding: const EdgeInsets.all(16.0), + decoration: BoxDecoration( + border: Border( + bottom: BorderSide( + color: CupertinoColors.separator.withOpacity(0.5)), + ), + ), + child: Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + CupertinoButton( + padding: EdgeInsets.zero, + child: Text('Cancel'.tr), + onPressed: () => Navigator.pop(context), + ), + Text( + 'Choose from contact'.tr, + style: const TextStyle( + fontSize: 17, + fontWeight: FontWeight.w600, + ), + ), + const SizedBox(width: 60), // For balance + ], + ), + ), + Expanded( + child: ListView.builder( + itemCount: controller.contactMaps.length, + itemBuilder: (context, index) { + final contact = controller.contactMaps[index]; + return Container( + decoration: BoxDecoration( + border: Border( + bottom: BorderSide( + color: CupertinoColors.separator.withOpacity(0.5), + ), + ), + ), + child: CupertinoButton( + padding: const EdgeInsets.symmetric( + horizontal: 16, vertical: 12), + child: Row( + children: [ + Expanded( + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Text( + contact['name'], + style: const TextStyle( + color: CupertinoColors.label, + fontSize: 17, + ), + ), + Text( + (contact['phones'][0].toString()), + style: const TextStyle( + color: CupertinoColors.secondaryLabel, + fontSize: 15, + ), + ), + ], + ), + ), + const Icon( + CupertinoIcons.chevron_right, + color: CupertinoColors.secondaryLabel, + ), + ], + ), + onPressed: () { + controller.selectPhone(contact['phones'].toString()); + // Navigator.pop(context); + }, + ), + ); + }, + ), + ), + ], + ), + ), + ); + } +} diff --git a/siro_driver/lib/views/auth/captin/login_captin.dart b/siro_driver/lib/views/auth/captin/login_captin.dart new file mode 100755 index 0000000..21be57b --- /dev/null +++ b/siro_driver/lib/views/auth/captin/login_captin.dart @@ -0,0 +1,510 @@ +import 'dart:io'; +import 'package:firebase_auth/firebase_auth.dart'; +import 'package:flutter/gestures.dart'; +import 'package:flutter/material.dart'; +import 'package:flutter_font_icons/flutter_font_icons.dart'; +import 'package:flutter_widget_from_html/flutter_widget_from_html.dart'; +import 'package:get/get.dart'; +import 'package:permission_handler/permission_handler.dart'; +import 'package:url_launcher/url_launcher.dart'; + +import '../../../constant/box_name.dart'; +import '../../../constant/colors.dart'; +import '../../../constant/info.dart'; +import '../../../constant/links.dart'; +import '../../../constant/style.dart'; +import '../../../controller/auth/apple_sigin.dart'; +import '../../../controller/auth/captin/login_captin_controller.dart'; +import '../../../controller/auth/google_sign.dart'; +import '../../../main.dart'; +import '../../../print.dart'; +import '../../widgets/elevated_btn.dart'; +import '../../widgets/mycircular.dart'; +import 'contact_us_page.dart'; +import 'otp_page.dart'; // تأكد من وجود هذا الملف لديك + +class LoginCaptin extends StatefulWidget { + const LoginCaptin({super.key}); + + @override + State createState() => _LoginCaptinState(); +} + +class _LoginCaptinState extends State with WidgetsBindingObserver { + final AuthController authController = Get.put(AuthController()); + final LoginDriverController controller = Get.put(LoginDriverController()); + + @override + void initState() { + super.initState(); + WidgetsBinding.instance.addObserver(this); + // فحص الإذن عند فتح الصفحة مباشرة + controller.getLocationPermission(); + } + + @override + void dispose() { + WidgetsBinding.instance.removeObserver(this); + super.dispose(); + } + + @override + void didChangeAppLifecycleState(AppLifecycleState state) { + // التحقق عند العودة من الإعدادات + if (state == AppLifecycleState.resumed) { + controller.getLocationPermission(); + } + } + + @override + Widget build(BuildContext context) { + return GetBuilder( + builder: (controller) { + return Scaffold( + backgroundColor: Theme.of(context).scaffoldBackgroundColor, + body: SafeArea( + child: Center( + child: _buildBodyContent(context, controller), + ), + ), + ); + }, + ); + } + + + Widget _buildBodyContent( + BuildContext context, LoginDriverController controller) { + // 1. صفحة الموافقة على الشروط + if (box.read(BoxName.agreeTerms) != 'agreed') { + return _buildAgreementPage(context, controller); + } + + // 2. صفحة إذن الموقع + if (box.read(BoxName.locationPermission) != 'true') { + return _buildLocationPermissionPage(context, controller); + } + + // 3. صفحة تسجيل الدخول (رقم الهاتف) + return PhoneNumberScreen(); + } + + // --- صفحة الشروط والأحكام --- + Widget _buildAgreementPage( + BuildContext context, LoginDriverController controller) { + return Padding( + padding: const EdgeInsets.all(24.0), + child: Column( + mainAxisAlignment: MainAxisAlignment.center, + children: [ + const Icon(Icons.policy_outlined, + size: 80, color: AppColor.primaryColor), + const SizedBox(height: 20), + Text('Driver Agreement'.tr, + textAlign: TextAlign.center, style: AppStyle.headTitle2), + const SizedBox(height: 30), + RichText( + textAlign: TextAlign.center, + text: TextSpan( + style: AppStyle.title.copyWith(height: 1.5), + children: [ + TextSpan( + text: + "To become a driver, you must review and agree to the " + .tr), + TextSpan( + text: 'Terms of Use'.tr, + style: const TextStyle( + decoration: TextDecoration.underline, + color: AppColor.blueColor, + fontWeight: FontWeight.bold), + recognizer: TapGestureRecognizer() + ..onTap = () { + launchUrl( + Uri.parse('${AppLink.server}/privacy_policy.php'), + mode: LaunchMode.externalApplication); + }), + TextSpan(text: " and acknowledge our Privacy Policy.".tr), + ], + ), + ), + Expanded( + child: Container( + decoration: BoxDecoration( + border: Border.all(color: Theme.of(context).dividerColor), + borderRadius: BorderRadius.circular(8), + color: Theme.of(context).cardColor.withOpacity(0.5), + ), + child: SingleChildScrollView( + padding: const EdgeInsets.all(12), + child: HtmlWidget( + box.read(BoxName.lang).toString() == 'ar' + ? AppInformation.privacyPolicyArabic + : AppInformation.privacyPolicy, + textStyle: TextStyle(color: Theme.of(context).textTheme.bodyLarge?.color), + ), + ), + ), + ), + + CheckboxListTile( + title: Text('I Agree'.tr, style: AppStyle.title), + value: controller.isAgreeTerms, + onChanged: (value) => controller.changeAgreeTerm(), + activeColor: AppColor.primaryColor, + controlAffinity: ListTileControlAffinity.leading, + ), + const SizedBox(height: 16), + SizedBox( + width: double.infinity, + child: MyElevatedButton( + title: 'Continue'.tr, + onPressed: controller.isAgreeTerms + ? () => controller.saveAgreementTerms() + : () {}, + ), + ), + ], + ), + ); + } + + // --- صفحة إذن الموقع --- + Widget _buildLocationPermissionPage( + BuildContext context, LoginDriverController controller) { + return Padding( + padding: const EdgeInsets.all(24.0), + child: Column( + mainAxisAlignment: MainAxisAlignment.center, + crossAxisAlignment: CrossAxisAlignment.stretch, + children: [ + const Icon(Icons.location_on_outlined, + size: 80, color: AppColor.primaryColor), + const SizedBox(height: 20), + Text( + 'Location Access Required'.tr, + textAlign: TextAlign.center, + style: AppStyle.headTitle2, + ), + const SizedBox(height: 16), + Text( + 'We need access to your location to match you with nearby passengers and provide accurate navigation.' + .tr, + textAlign: TextAlign.center, + style: AppStyle.title, + ), + const SizedBox(height: 24), + Text( + 'Please allow location access "all the time" to receive ride requests even when the app is in the background.' + .tr, + textAlign: TextAlign.center, + style: AppStyle.title.copyWith( + color: AppColor.greenColor, fontWeight: FontWeight.bold), + ), + const SizedBox(height: 40), + MyElevatedButton( + title: "Allow Location Access".tr, + kolor: AppColor.greenColor, + onPressed: () async { + box.write(BoxName.locationPermission, 'true'); + controller.update(); + // 1. طلب إذن الموقع العادي (أثناء الاستخدام) أولاً + var status = await Permission.location.request(); + + if (status.isGranted) { + // 2. إذا كنت تحتاج "طوال الوقت" (Background)، اطلبه الآن بشكل منفصل + // ملاحظة: في أندرويد 11+ سينقلك هذا لصفحة إعدادات خاصة + var backgroundStatus = + await Permission.locationAlways.request(); + + if (backgroundStatus.isGranted) { + box.write(BoxName.locationPermission, 'true'); + controller.update(); + } else { + // المستخدم وافق على "أثناء الاستخدام" فقط، يمكنك المشي في الحال + // أو إجباره، حسب منطق تطبيقك (تطبيق سائق يفضل Always) + box.write(BoxName.locationPermission, 'true'); + controller.update(); + } + } else if (status.isPermanentlyDenied) { + // إذا كانت الحالة مرفوضة نهائياً، يجب فتح الإعدادات + openAppSettings(); + } + }, + ), + const SizedBox(height: 16), + TextButton( + onPressed: () => openAppSettings(), + child: Text("Open Settings".tr, + style: const TextStyle(color: AppColor.blueColor)), + ), + ], + ), + ); + } + + // --- واجهة تسجيل الدخول اليدوي/الاجتماعي (للاستخدام المستقبلي إذا لزم الأمر) --- + Widget _buildLoginUI(BuildContext context, LoginDriverController controller) { + return SingleChildScrollView( + padding: const EdgeInsets.symmetric(horizontal: 24.0, vertical: 32.0), + child: Column( + mainAxisAlignment: MainAxisAlignment.center, + crossAxisAlignment: CrossAxisAlignment.stretch, + children: [ + Image.asset('assets/images/logo.gif', height: 120, width: 120), + const SizedBox(height: 20), + Text( + 'Driver Portal'.tr, + textAlign: TextAlign.center, + style: AppStyle.headTitle2.copyWith(fontSize: 28), + ), + const SizedBox(height: 8), + Text( + 'Sign in to start your journey'.tr, + textAlign: TextAlign.center, + style: AppStyle.subtitle, + ), + const SizedBox(height: 40), + if (controller.isGoogleDashOpen) + _buildManualLoginForm(context, controller, isRegistration: true) + else if (Platform.isIOS && controller.isTest == 0) + _buildManualLoginForm(context, controller, isRegistration: false) + else + _buildSocialLoginOptions(context, controller), + const SizedBox(height: 32), + Center( + child: GestureDetector( + onTap: () => Get.to(() => ContactUsPage()), + child: Text( + 'Need help? Contact Us'.tr, + style: AppStyle.subtitle.copyWith( + color: AppColor.blueColor, + decoration: TextDecoration.underline, + ), + ), + ), + ), + ], + ), + ); + } + + Widget _buildSocialLoginOptions( + BuildContext context, LoginDriverController controller) { + return Column( + crossAxisAlignment: CrossAxisAlignment.stretch, + children: [ + Text( + 'Sign in with a provider for easy access'.tr, + textAlign: TextAlign.center, + style: AppStyle.title, + ), + const SizedBox(height: 24), + _buildSocialButton( + text: 'Sign In with Google'.tr, + icon: FontAwesome.google, + backgroundColor: AppColor.redColor, + onPressed: () async { + GoogleSignInHelper().signInFromLogin(); + }, + ), + if (Platform.isIOS) ...[ + const SizedBox(height: 16), + _buildSocialButton( + text: 'Sign in with Apple'.tr, + icon: Icons.apple, + backgroundColor: Colors.black, + onPressed: () async { + User? user = await authController.signInWithApple(); + if (user != null) { + box.write(BoxName.emailDriver, user.email.toString()); + box.write(BoxName.driverID, user.uid); + controller.loginWithGoogleCredential( + user.uid, + user.email.toString(), + ); + } + }, + ), + ], + const SizedBox(height: 24), + Row( + children: [ + Expanded(child: Divider(color: Theme.of(context).dividerColor)), + Padding( + padding: const EdgeInsets.symmetric(horizontal: 8.0), + child: Text('Or'.tr, style: AppStyle.subtitle), + ), + Expanded(child: Divider(color: Theme.of(context).dividerColor)), + ], + ), + + const SizedBox(height: 24), + MyElevatedButton( + title: 'Create Account with Email'.tr, + onPressed: () => controller.changeGoogleDashOpen(), + kolor: AppColor.blueColor, + ), + ], + ); + } + + Widget _buildManualLoginForm( + BuildContext context, LoginDriverController controller, + {required bool isRegistration}) { + return Card( + elevation: 8, + shape: RoundedRectangleBorder(borderRadius: BorderRadius.circular(16)), + child: Padding( + padding: const EdgeInsets.all(20.0), + child: Form( + key: controller.formKey, + child: Column( + crossAxisAlignment: CrossAxisAlignment.stretch, + children: [ + Text( + isRegistration ? 'Create Driver Account'.tr : 'Driver Login'.tr, + textAlign: TextAlign.center, + style: AppStyle.headTitle2, + ), + const SizedBox(height: 24), + _buildTextFormField( + controller: controller.emailController, + labelText: 'Email'.tr, + hintText: 'Enter your email'.tr, + prefixIcon: Icons.email_outlined, + keyboardType: TextInputType.emailAddress, + validator: (value) { + if (value == null || !GetUtils.isEmail(value)) { + return 'Please enter a valid email'.tr; + } + return null; + }, + ), + const SizedBox(height: 20), + GetBuilder( + id: 'passwordVisibility', + builder: (_) => _buildTextFormField( + controller: controller.passwordController, + labelText: 'Password'.tr, + hintText: 'Enter your password'.tr, + prefixIcon: Icons.lock_outline, + obscureText: controller.isPasswordHidden, + suffixIcon: IconButton( + icon: Icon( + controller.isPasswordHidden + ? Icons.visibility_off + : Icons.visibility, + color: AppColor.primaryColor, + ), + onPressed: () => controller.togglePasswordVisibility(), + ), + validator: (value) { + if (value == null || value.length < 6) { + return 'Password must be at least 6 characters'.tr; + } + return null; + }, + ), + ), + const SizedBox(height: 30), + controller.isloading + ? const Center(child: MyCircularProgressIndicator()) + : MyElevatedButton( + title: + (isRegistration ? 'Create Account'.tr : 'Login'.tr), + onPressed: () { + if (controller.formKey.currentState!.validate()) { + if (isRegistration) { + String email = controller.emailController.text; + String uniqueId = + controller.generateUniqueIdFromEmail(email); + box.write(BoxName.driverID, uniqueId); + box.write(BoxName.emailDriver, email); + controller.loginUsingCredentialsWithoutGoogle( + controller.passwordController.text, + email, + ); + } else { + controller.loginWithGoogleCredential( + controller.passwordController.text, + controller.emailController.text, + ); + } + } + }, + ), + if (isRegistration) + TextButton( + onPressed: () => controller.changeGoogleDashOpen(), + child: Text( + 'Back to other sign-in options'.tr, + style: TextStyle(color: AppColor.primaryColor), + ), + ), + ], + ), + ), + ), + ); + } + + TextFormField _buildTextFormField({ + required TextEditingController controller, + required String labelText, + required String hintText, + required IconData prefixIcon, + required String? Function(String?) validator, + bool obscureText = false, + Widget? suffixIcon, + TextInputType keyboardType = TextInputType.text, + }) { + return TextFormField( + controller: controller, + validator: validator, + obscureText: obscureText, + keyboardType: keyboardType, + style: Theme.of(context).textTheme.bodyLarge, + decoration: InputDecoration( + labelText: labelText, + labelStyle: TextStyle(color: Theme.of(context).hintColor), + hintText: hintText, + hintStyle: TextStyle(color: Theme.of(context).hintColor.withOpacity(0.5)), + prefixIcon: Icon(prefixIcon, color: AppColor.primaryColor), + suffixIcon: suffixIcon, + border: OutlineInputBorder( + borderRadius: BorderRadius.circular(12.0), + borderSide: BorderSide(color: Theme.of(context).dividerColor), + ), + enabledBorder: OutlineInputBorder( + borderRadius: BorderRadius.circular(12.0), + borderSide: BorderSide(color: Theme.of(context).dividerColor), + ), + focusedBorder: OutlineInputBorder( + borderRadius: BorderRadius.circular(12.0), + borderSide: const BorderSide(color: AppColor.primaryColor, width: 2.0), + ), + ), + ); + + } + + Widget _buildSocialButton({ + required String text, + required IconData icon, + required Color backgroundColor, + required VoidCallback onPressed, + }) { + return ElevatedButton.icon( + icon: Icon(icon, color: Colors.white), + label: + Text(text, style: const TextStyle(color: Colors.white, fontSize: 16)), + onPressed: onPressed, + style: ElevatedButton.styleFrom( + backgroundColor: backgroundColor, + shape: RoundedRectangleBorder(borderRadius: BorderRadius.circular(12)), + padding: const EdgeInsets.symmetric(vertical: 14), + ), + ); + } +} diff --git a/siro_driver/lib/views/auth/captin/logout_captain.dart b/siro_driver/lib/views/auth/captin/logout_captain.dart new file mode 100755 index 0000000..e36972c --- /dev/null +++ b/siro_driver/lib/views/auth/captin/logout_captain.dart @@ -0,0 +1,42 @@ +import 'package:flutter/material.dart'; +import 'package:get/get.dart'; +import 'package:siro_driver/constant/colors.dart'; +import 'package:siro_driver/controller/functions/log_out.dart'; +import 'package:siro_driver/views/widgets/elevated_btn.dart'; +import 'package:siro_driver/views/widgets/my_scafold.dart'; + +class LogoutCaptain extends StatelessWidget { + const LogoutCaptain({super.key}); + + @override + Widget build(BuildContext context) { + return MyScafolld( + title: 'Log Out Page'.tr, + body: [ + Center( + child: Column( + mainAxisAlignment: MainAxisAlignment.center, + children: [ + MyElevatedButton( + title: 'Log Off'.tr, + onPressed: () { + LogOutController().logOutCaptain(); + }), + const SizedBox( + height: 30, + ), + MyElevatedButton( + title: 'Delete My Account'.tr, + onPressed: () { + LogOutController().deletecaptainAccount(); + }, + kolor: AppColor.redColor, + ), + ], + ), + ) + ], + isleading: true, + ); + } +} diff --git a/siro_driver/lib/views/auth/captin/otp_page.dart b/siro_driver/lib/views/auth/captin/otp_page.dart new file mode 100644 index 0000000..c2797c2 --- /dev/null +++ b/siro_driver/lib/views/auth/captin/otp_page.dart @@ -0,0 +1,600 @@ +import 'dart:ui'; +import 'package:flutter/material.dart'; + +import 'package:get/get.dart'; +import 'package:siro_driver/controller/auth/captin/login_captin_controller.dart'; + +// --- Placeholder Imports --- +// Assuming these files exist in your project structure. +import '../../../constant/box_name.dart'; +import '../../../constant/colors.dart'; +import '../../../controller/auth/captin/phone_helper_controller.dart'; +import '../../../controller/local/phone_intel/intl_phone_field.dart'; +import '../../../main.dart'; +import '../../../print.dart'; +// Assuming you have an AppColor class defined in your project. +// import 'path/to/your/app_color.dart'; + +/// A visually revamped authentication screen with a light, glassy effect, +/// themed for the driver application using a green primary color. +class AuthScreen extends StatelessWidget { + final String title; + final String subtitle; + final Widget form; + + const AuthScreen({ + super.key, + required this.title, + required this.subtitle, + required this.form, + }); + + /// Shows a dialog for testers to log in using email and password. + void _showTesterLoginDialog( + BuildContext context, LoginDriverController controller) { + final testerEmailController = TextEditingController(); + final testerPasswordController = TextEditingController(); + final testerFormKey = GlobalKey(); + + showDialog( + context: context, + barrierDismissible: true, + builder: (BuildContext dialogContext) { + return BackdropFilter( + filter: ImageFilter.blur(sigmaX: 5, sigmaY: 5), + child: AlertDialog( + backgroundColor: Colors.white.withOpacity(0.85), + shape: + RoundedRectangleBorder(borderRadius: BorderRadius.circular(20)), + title: const Text( + 'App Tester Login', + textAlign: TextAlign.center, + style: + TextStyle(fontWeight: FontWeight.bold, color: Colors.black87), + ), + content: Form( + key: testerFormKey, + child: Column( + mainAxisSize: MainAxisSize.min, + children: [ + TextFormField( + controller: testerEmailController, + keyboardType: TextInputType.emailAddress, + style: const TextStyle(color: Colors.black), + decoration: InputDecoration( + labelText: 'Email', + prefixIcon: const Icon(Icons.email_outlined), + border: OutlineInputBorder( + borderRadius: BorderRadius.circular(12), + ), + focusedBorder: OutlineInputBorder( + borderRadius: BorderRadius.circular(12), + borderSide: const BorderSide( + color: AppColor.greenColor, width: 2), + ), + ), + validator: (value) => value == null || !value.contains('@') + ? 'Enter a valid email'.tr + : null, + ), + const SizedBox(height: 16), + TextFormField( + controller: testerPasswordController, + obscureText: true, + style: const TextStyle(color: Colors.black), + decoration: InputDecoration( + labelText: 'Password', + prefixIcon: const Icon(Icons.lock_outline), + border: OutlineInputBorder( + borderRadius: BorderRadius.circular(12), + ), + focusedBorder: OutlineInputBorder( + borderRadius: BorderRadius.circular(12), + borderSide: const BorderSide( + color: AppColor.greenColor, width: 2), + ), + ), + validator: (value) => value == null || value.isEmpty + ? 'Enter a password' + : null, + ), + ], + ), + ), + actions: [ + TextButton( + child: const Text('Cancel'), + onPressed: () => Navigator.of(dialogContext).pop(), + ), + ElevatedButton( + style: ElevatedButton.styleFrom( + backgroundColor: AppColor.greenColor, + shape: RoundedRectangleBorder( + borderRadius: BorderRadius.circular(12), + ), + ), + child: + const Text('Login', style: TextStyle(color: Colors.white)), + onPressed: () { + if (testerFormKey.currentState!.validate()) { + controller.logintest( + testerPasswordController.text.trim(), + testerEmailController.text.trim(), + ); + Navigator.of(dialogContext).pop(); + } + }, + ), + ], + ), + ); + }, + ); + } + + @override + Widget build(BuildContext context) { + // Controller for the driver's login logic + final loginController = Get.put(LoginDriverController()); + + return Scaffold( + body: Container( + // NEW: Light and airy gradient with green accents + decoration: BoxDecoration( + gradient: LinearGradient( + colors: [ + Colors.white, + Colors.green.shade50, + ], + begin: Alignment.topCenter, + end: Alignment.bottomCenter, + ), + ), + child: Stack( + children: [ + // Subtle background shapes with the new primary color + Positioned( + top: -80, + left: -100, + child: Container( + width: 250, + height: 250, + decoration: BoxDecoration( + shape: BoxShape.circle, + color: AppColor.greenColor.withOpacity(0.1), + ), + ), + ), + Positioned( + bottom: -120, + right: -150, + child: Container( + width: 350, + height: 350, + decoration: BoxDecoration( + shape: BoxShape.circle, + color: AppColor.greenColor.withOpacity(0.15), + ), + ), + ), + Center( + child: SingleChildScrollView( + padding: const EdgeInsets.symmetric(horizontal: 24.0), + child: Column( + mainAxisAlignment: MainAxisAlignment.center, + children: [ + // GestureDetector for tester login + GestureDetector( + onLongPress: () { + _showTesterLoginDialog(context, loginController); + }, + child: Container( + padding: const EdgeInsets.all(12), + decoration: BoxDecoration( + shape: BoxShape.circle, + color: Colors.white.withOpacity(0.5), + border: Border.all( + color: Colors.white.withOpacity(0.8), width: 2), + boxShadow: [ + BoxShadow( + color: Colors.black.withOpacity(0.05), + blurRadius: 10, + spreadRadius: 5) + ]), + child: ClipRRect( + borderRadius: BorderRadius.circular(50), + child: Image.asset('assets/images/logo.gif', + height: 100)), + ), + ), + const SizedBox(height: 20), + Text( + title, + textAlign: TextAlign.center, + style: const TextStyle( + fontSize: 28, + fontWeight: FontWeight.bold, + color: Colors.black87), + ), + const SizedBox(height: 10), + Text( + subtitle, + textAlign: TextAlign.center, + style: const TextStyle( + fontSize: 16, + color: Colors.black54, + ), + ), + const SizedBox(height: 30), + + // Glassmorphism Container for the form with a whiter look + ClipRRect( + borderRadius: BorderRadius.circular(25.0), + child: BackdropFilter( + filter: ImageFilter.blur(sigmaX: 15, sigmaY: 15), + child: Container( + padding: const EdgeInsets.all(24.0), + decoration: BoxDecoration( + color: Colors.white.withOpacity(0.6), + borderRadius: BorderRadius.circular(25.0), + border: Border.all( + color: Colors.white.withOpacity(0.8), + width: 1.5, + ), + ), + child: form, + ), + ), + ), + const SizedBox(height: 20), + // Button for app testers, adapted to the light theme + Material( + color: Colors.black.withOpacity(0.05), + borderRadius: BorderRadius.circular(12), + child: InkWell( + onTap: () => + _showTesterLoginDialog(context, loginController), + borderRadius: BorderRadius.circular(12), + child: Padding( + padding: const EdgeInsets.symmetric( + vertical: 10, horizontal: 16), + child: Row( + mainAxisSize: MainAxisSize.min, + children: [ + Icon(Icons.admin_panel_settings_outlined, + color: Colors.black.withOpacity(0.6)), + const SizedBox(width: 8), + Text( + 'For App Reviewers / Testers', + style: TextStyle( + color: Colors.black.withOpacity(0.6), + fontWeight: FontWeight.w600, + ), + ), + ], + ), + ), + ), + ), + ], + ), + ), + ), + ], + ), + ), + ); + } +} + +// --- UI Screens --- + +class PhoneNumberScreen extends StatefulWidget { + const PhoneNumberScreen({super.key}); + @override + State createState() => _PhoneNumberScreenState(); +} + +class _PhoneNumberScreenState extends State { + final _formKey = GlobalKey(); + bool _isLoading = false; + String _completePhone = ''; + + void _submit() async { + if (_formKey.currentState!.validate()) { + setState(() => _isLoading = true); + final rawPhone = _completePhone.replaceFirst('+', ''); + Log.print('📱 _submit rawPhone: "$rawPhone" (from _completePhone: "$_completePhone")'); + final success = await PhoneAuthHelper.sendOtp(rawPhone); + if (success && mounted) { + Get.to(() => OtpVerificationScreen(phoneNumber: rawPhone)); + } + if (mounted) setState(() => _isLoading = false); + } + } + + @override + Widget build(BuildContext context) { + return AuthScreen( + title: 'welcome to intaleq'.tr, + subtitle: 'login or register subtitle'.tr, + form: Form( + key: _formKey, + child: Column( + mainAxisSize: MainAxisSize.min, + children: [ + Text( + 'Enter your phone number'.tr, + style: TextStyle(color: Colors.black87, fontSize: 16), + textAlign: TextAlign.center, + ), + const SizedBox(height: 20), + IntlPhoneField( + showCountryFlag: false, + searchText: 'Search country'.tr, + languageCode: 'ar', + style: const TextStyle(color: Colors.black), + dropdownTextStyle: const TextStyle(color: Colors.black87), + decoration: InputDecoration( + labelText: 'Phone Number'.tr, + hintText: 'witout zero'.tr, + labelStyle: const TextStyle(color: Colors.black54), + enabledBorder: OutlineInputBorder( + borderRadius: BorderRadius.circular(12), + borderSide: BorderSide(color: Colors.black.withOpacity(0.1)), + ), + focusedBorder: OutlineInputBorder( + borderRadius: BorderRadius.circular(12), + borderSide: + const BorderSide(color: AppColor.greenColor, width: 2), + ), + ), + initialCountryCode: 'SY', + onChanged: (phone) { + _completePhone = phone.completeNumber; + }, + validator: (phone) { + if (phone == null || phone.number.isEmpty) { + return 'Please enter your phone number'.tr; + } // Check if the number is a Syrian number + if (phone.countryISOCode != 'SY') { + return 'Only Syrian phone numbers are allowed'.tr; + } + // Check if the national number part starts with '0' + if (phone.completeNumber.startsWith('96309') || + phone.completeNumber.startsWith('+9630') || + phone.completeNumber.startsWith('09')) { + return 'Please enter the number without the leading 0'.tr; + } + if (phone.completeNumber.length < 10) { + return 'Phone number seems too short'.tr; + } + return null; + }, + ), + const SizedBox(height: 24), + _isLoading + ? const CircularProgressIndicator(color: AppColor.greenColor) + : SizedBox( + width: double.infinity, + child: ElevatedButton( + onPressed: _submit, + style: ElevatedButton.styleFrom( + backgroundColor: AppColor.greenColor, + padding: const EdgeInsets.symmetric(vertical: 16), + shape: RoundedRectangleBorder( + borderRadius: BorderRadius.circular(12)), + ), + child: Text( + 'send otp button'.tr, + style: const TextStyle( + fontSize: 16, + fontWeight: FontWeight.bold, + color: Colors.white), + ), + ), + ), + ], + ), + ), + ); + } +} + +class OtpVerificationScreen extends StatefulWidget { + final String phoneNumber; + const OtpVerificationScreen({super.key, required this.phoneNumber}); + @override + State createState() => _OtpVerificationScreenState(); +} + +class _OtpVerificationScreenState extends State { + final _formKey = GlobalKey(); + final _otpController = TextEditingController(); + bool _isLoading = false; + + void _submit() async { + if (_formKey.currentState!.validate()) { + setState(() => _isLoading = true); + await PhoneAuthHelper.verifyOtp(widget.phoneNumber, _otpController.text.trim()); + if (mounted) setState(() => _isLoading = false); + } + } + + @override + Widget build(BuildContext context) { + return AuthScreen( + title: 'verify your number title'.tr, + subtitle: + 'otp sent subtitle'.trParams({'phoneNumber': widget.phoneNumber}), + form: Column( + mainAxisSize: MainAxisSize.min, + children: [ + const Text( + 'Enter the 3-digit code', + style: TextStyle(color: Colors.black87, fontSize: 16), + textAlign: TextAlign.center, + ), + const SizedBox(height: 20), + Form( + key: _formKey, + child: TextFormField( + controller: _otpController, + textAlign: TextAlign.center, + keyboardType: TextInputType.number, + maxLength: 3, + style: const TextStyle( + fontSize: 28, + fontWeight: FontWeight.bold, + color: Colors.black87, + letterSpacing: 18, + ), + decoration: InputDecoration( + counterText: "", + hintText: '---', + hintStyle: TextStyle( + color: Colors.black.withOpacity(0.2), + letterSpacing: 18, + fontSize: 28), + border: InputBorder.none, + contentPadding: const EdgeInsets.symmetric(vertical: 10), + ), + validator: (v) => v == null || v.length < 3 ? '' : null, + ), + ), + const SizedBox(height: 30), + _isLoading + ? const CircularProgressIndicator(color: AppColor.greenColor) + : SizedBox( + width: double.infinity, + child: ElevatedButton( + onPressed: _submit, + style: ElevatedButton.styleFrom( + backgroundColor: AppColor.greenColor, + padding: const EdgeInsets.symmetric(vertical: 16), + shape: RoundedRectangleBorder( + borderRadius: BorderRadius.circular(12)), + ), + child: Text( + 'verify and continue button'.tr, + style: const TextStyle( + fontSize: 16, + fontWeight: FontWeight.bold, + color: Colors.white), + ), + ), + ), + ], + ), + ); + } +} + +class RegistrationScreen extends StatefulWidget { + final String phoneNumber; + const RegistrationScreen({super.key, required this.phoneNumber}); + @override + State createState() => _RegistrationScreenState(); +} + +class _RegistrationScreenState extends State { + final _formKey = GlobalKey(); + final _firstNameController = TextEditingController(); + final _lastNameController = TextEditingController(); + final _emailController = TextEditingController(); + bool _isLoading = false; + + void _submit() async { + if (_formKey.currentState!.validate()) { + setState(() => _isLoading = true); + await PhoneAuthHelper.registerUser( + phoneNumber: widget.phoneNumber, + firstName: _firstNameController.text.trim(), + lastName: _lastNameController.text.trim(), + email: _emailController.text.trim(), + ); + if (mounted) setState(() => _isLoading = false); + } + } + + Widget _buildTextFormField({ + required TextEditingController controller, + required String label, + TextInputType keyboardType = TextInputType.text, + String? Function(String?)? validator, + }) { + return TextFormField( + controller: controller, + style: const TextStyle(color: Colors.black87), + decoration: InputDecoration( + labelText: label, + labelStyle: const TextStyle(color: Colors.black54), + enabledBorder: OutlineInputBorder( + borderRadius: BorderRadius.circular(12), + borderSide: BorderSide(color: Colors.black.withOpacity(0.1)), + ), + focusedBorder: OutlineInputBorder( + borderRadius: BorderRadius.circular(12), + borderSide: const BorderSide(color: AppColor.greenColor, width: 2), + ), + ), + keyboardType: keyboardType, + validator: validator, + ); + } + + @override + Widget build(BuildContext context) { + return AuthScreen( + title: 'one last step title'.tr, + subtitle: 'complete profile subtitle'.tr, + form: Form( + key: _formKey, + child: Column( + mainAxisSize: MainAxisSize.min, + children: [ + _buildTextFormField( + controller: _firstNameController, + label: 'first name label'.tr, + validator: (v) => v!.isEmpty ? 'first name required'.tr : null, + ), + const SizedBox(height: 16), + _buildTextFormField( + controller: _lastNameController, + label: 'last name label'.tr, + validator: (v) => v!.isEmpty ? 'last name required'.tr : null, + ), + const SizedBox(height: 16), + _buildTextFormField( + controller: _emailController, + label: 'email optional label'.tr, + keyboardType: TextInputType.emailAddress, + ), + const SizedBox(height: 24), + _isLoading + ? const CircularProgressIndicator(color: AppColor.greenColor) + : SizedBox( + width: double.infinity, + child: ElevatedButton( + onPressed: _submit, + style: ElevatedButton.styleFrom( + backgroundColor: AppColor.greenColor, + padding: const EdgeInsets.symmetric(vertical: 16), + shape: RoundedRectangleBorder( + borderRadius: BorderRadius.circular(12)), + ), + child: Text( + 'complete registration button'.tr, + style: const TextStyle( + fontSize: 16, + fontWeight: FontWeight.bold, + color: Colors.white), + ), + ), + ), + ], + ), + ), + ); + } +} diff --git a/siro_driver/lib/views/auth/captin/otp_token_page.dart b/siro_driver/lib/views/auth/captin/otp_token_page.dart new file mode 100644 index 0000000..65f06bb --- /dev/null +++ b/siro_driver/lib/views/auth/captin/otp_token_page.dart @@ -0,0 +1,176 @@ +import 'package:flutter/material.dart'; +import 'package:get/get.dart'; + +import '../../../controller/auth/captin/opt_token_controller.dart'; + +class OtpVerificationPage extends StatefulWidget { + final String phone; + final String deviceToken; + final String token; + final String ptoken; + + const OtpVerificationPage({ + super.key, + required this.phone, + required this.deviceToken, + required this.token, + required this.ptoken, + }); + + @override + State createState() => _OtpVerificationPageState(); +} + +class _OtpVerificationPageState extends State { + late final OtpVerificationController controller; + final List _focusNodes = List.generate(3, (index) => FocusNode()); + final List _textControllers = + List.generate(3, (index) => TextEditingController()); + + @override + void initState() { + super.initState(); + controller = Get.put(OtpVerificationController( + phone: widget.phone, + deviceToken: widget.deviceToken, + token: widget.token, + )); + } + + @override + void dispose() { + for (var node in _focusNodes) { + node.dispose(); + } + for (var controller in _textControllers) { + controller.dispose(); + } + super.dispose(); + } + + void _onOtpChanged(String value, int index) { + if (value.isNotEmpty) { + if (index < 2) { + _focusNodes[index + 1].requestFocus(); + } else { + _focusNodes[index].unfocus(); // إلغاء التركيز بعد آخر حقل + } + } else if (index > 0) { + _focusNodes[index - 1].requestFocus(); + } + // تجميع نصوص كل الحقول لتكوين الرمز النهائي + controller.otpCode.value = _textControllers.map((c) => c.text).join(); + } + + Widget _buildOtpInputFields() { + return Directionality( + textDirection: TextDirection.ltr, // لضمان ترتيب الحقول من اليسار لليمين + child: Row( + mainAxisAlignment: MainAxisAlignment.spaceEvenly, + children: List.generate(3, (index) { + return SizedBox( + width: 45, + height: 55, + child: TextFormField( + controller: _textControllers[index], + focusNode: _focusNodes[index], + textAlign: TextAlign.center, + keyboardType: TextInputType.number, + maxLength: 1, + style: const TextStyle(fontSize: 22, fontWeight: FontWeight.bold), + decoration: InputDecoration( + counterText: "", + border: OutlineInputBorder( + borderRadius: BorderRadius.circular(12), + ), + enabledBorder: OutlineInputBorder( + borderRadius: BorderRadius.circular(12), + borderSide: BorderSide(color: Colors.grey.shade300), + ), + focusedBorder: OutlineInputBorder( + borderRadius: BorderRadius.circular(12), + borderSide: BorderSide( + color: Theme.of(context).primaryColor, width: 2), + ), + ), + onChanged: (value) => _onOtpChanged(value, index), + ), + ); + }), + ), + ); + } + + @override + Widget build(BuildContext context) { + return Scaffold( + appBar: AppBar( + title: Text('Verify OTP'.tr), + backgroundColor: Colors.transparent, + elevation: 0, + centerTitle: true, + ), + backgroundColor: Colors.grey[50], + body: SingleChildScrollView( + child: Padding( + padding: const EdgeInsets.all(24.0), + child: Column( + crossAxisAlignment: CrossAxisAlignment.center, + children: [ + const SizedBox(height: 20), + Icon(Icons.phonelink_lock_rounded, + size: 80, color: Theme.of(context).primaryColor), + const SizedBox(height: 24), + Text( + 'Verification Code'.tr, + style: + const TextStyle(fontSize: 24, fontWeight: FontWeight.bold), + ), + const SizedBox(height: 12), + Padding( + padding: const EdgeInsets.symmetric(horizontal: 20.0), + child: Text( + '${'We have sent a verification code to your mobile number:'.tr} ${widget.phone}', + textAlign: TextAlign.center, + style: TextStyle( + color: Colors.grey.shade600, fontSize: 16, height: 1.5), + ), + ), + const SizedBox(height: 40), + _buildOtpInputFields(), + const SizedBox(height: 40), + Obx(() => SizedBox( + width: double.infinity, + height: 50, + child: controller.isVerifying.value + ? const Center(child: CircularProgressIndicator()) + : ElevatedButton( + style: ElevatedButton.styleFrom( + shape: RoundedRectangleBorder( + borderRadius: BorderRadius.circular(12))), + onPressed: () => + controller.verifyOtp(widget.ptoken), + child: Text('Verify'.tr, + style: const TextStyle( + fontSize: 18, fontWeight: FontWeight.w600)), + ), + )), + const SizedBox(height: 24), + Obx( + () => controller.canResend.value + ? TextButton( + onPressed: controller.sendOtp, + child: Text('Resend Code'.tr), + ) + : Text( + '${'You can resend in'.tr} ${controller.countdown.value} ${'seconds'.tr}', + style: const TextStyle(color: Colors.grey), + ), + ) + ], + ), + ), + ), + ); + } +} diff --git a/siro_driver/lib/views/auth/captin/register_captin.dart b/siro_driver/lib/views/auth/captin/register_captin.dart new file mode 100755 index 0000000..14142bf --- /dev/null +++ b/siro_driver/lib/views/auth/captin/register_captin.dart @@ -0,0 +1,202 @@ +import 'package:siro_driver/constant/style.dart'; +import 'package:flutter/material.dart'; +import 'package:get/get.dart'; +import 'package:siro_driver/controller/auth/captin/register_captin_controller.dart'; +import 'package:siro_driver/views/widgets/elevated_btn.dart'; +import 'package:siro_driver/views/widgets/my_scafold.dart'; + +import '../../../constant/colors.dart'; +import '../../../controller/auth/google_sign.dart'; + +class RegisterCaptin extends StatelessWidget { + const RegisterCaptin({super.key}); + + @override + Widget build(BuildContext context) { + Get.put(RegisterCaptainController()); + return MyScafolld( + title: 'Register Driver'.tr, + body: [ + // GetBuilder( + // builder: (controller) => Form( + // key: controller.formKey, + // child: Padding( + // padding: const EdgeInsets.all(16.0), + // child: SingleChildScrollView( + // child: Container( + // decoration: const BoxDecoration( + // boxShadow: [ + // BoxShadow( + // offset: Offset(3, 3), + // color: AppColor.accentColor, + // blurRadius: 3) + // ], + // color: AppColor.secondaryColor, + // ), + // child: Padding( + // padding: const EdgeInsets.all(16), + // child: Column( + // children: [ + // SizedBox( + // width: Get.width * .8, + // child: TextFormField( + // keyboardType: TextInputType.emailAddress, + // controller: controller.emailController, + // decoration: InputDecoration( + // focusedBorder: OutlineInputBorder( + // borderSide: const BorderSide( + // color: AppColor.primaryColor, + // width: 2.0, + // ), + // borderRadius: BorderRadius.circular(10), + // ), + // fillColor: AppColor.accentColor, + // hoverColor: AppColor.accentColor, + // focusColor: AppColor.accentColor, + // border: const OutlineInputBorder( + // borderRadius: + // BorderRadius.all(Radius.circular(12))), + // labelText: 'Email'.tr, + // hintText: 'Enter your email address'.tr, + // ), + // validator: (value) { + // if (value!.isEmpty || + // (!value.contains('@') || + // !value.contains('.'))) { + // return 'Please enter Your Email.'.tr; + // } + // return null; + // }, + // ), + // ), + // const SizedBox( + // height: 15, + // ), + // SizedBox( + // width: Get.width * .8, + // child: TextFormField( + // obscureText: true, + // keyboardType: TextInputType.emailAddress, + // controller: controller.passwordController, + // decoration: InputDecoration( + // focusedBorder: OutlineInputBorder( + // borderSide: const BorderSide( + // color: AppColor.primaryColor, + // width: 2.0, + // ), + // borderRadius: BorderRadius.circular(10), + // ), + // fillColor: AppColor.accentColor, + // hoverColor: AppColor.accentColor, + // focusColor: AppColor.accentColor, + // border: const OutlineInputBorder( + // borderRadius: + // BorderRadius.all(Radius.circular(12))), + // labelText: 'Password'.tr, + // hintText: 'Enter your Password'.tr, + // ), + // validator: (value) { + // if (value!.isEmpty) { + // return 'Please enter Your Password.'.tr; + // } + // if (value.length < 6) { + // return 'Password must br at least 6 character.' + // .tr; + // } + // return null; + // }, + // ), + // ), + // const SizedBox( + // height: 15, + // ), + // SizedBox( + // width: Get.width * .8, + // child: TextFormField( + // keyboardType: TextInputType.phone, + // cursorColor: AppColor.accentColor, + // controller: controller.phoneController, + // decoration: InputDecoration( + // focusedBorder: OutlineInputBorder( + // borderSide: const BorderSide( + // color: AppColor.primaryColor, + // width: 2.0, + // ), + // borderRadius: BorderRadius.circular(10), + // ), + // focusColor: AppColor.accentColor, + // fillColor: AppColor.accentColor, + // border: const OutlineInputBorder( + // borderRadius: + // BorderRadius.all(Radius.circular(12))), + // labelText: 'Phone'.tr, + // hintText: 'Enter your phone number'.tr, + // ), + // validator: (value) { + // if (value!.isEmpty || value.length != 10) { + // return 'Please enter your phone number.'.tr; + // } + // return null; + // }, + // ), + // ), + // const SizedBox( + // height: 15, + // ), + // MyElevatedButton( + // title: 'Next'.tr, + // onPressed: () => controller.nextToAIDetection()), + // ], + // ), + // ), + // ), + // ), + // ), + // ), + // ) + Image.asset( + 'assets/images/on1.png', + fit: BoxFit.cover, + height: double.maxFinite, + width: double.maxFinite, + ), + Center( + child: Container( + decoration: AppStyle.boxDecoration1, + height: Get.height * .7, + width: Get.width * .9, + child: Column( + mainAxisAlignment: MainAxisAlignment.spaceAround, + children: [ + Image.asset( + 'assets/images/logo.gif', + height: Get.width * .3, + width: Get.width * .3, + fit: BoxFit.fill, + ), + Container( + decoration: AppStyle.boxDecoration1, + height: Get.height * .3, + width: Get.width * .8, + child: Center( + child: Text( + 'Sign in with Google for easier email and name entry'.tr, + textAlign: TextAlign.center, + style: AppStyle.title, + ), + ), + ), + MyElevatedButton( + title: 'Sign In by Google'.tr, + onPressed: () async { + // await GoogleSignInHelper.signIn(); + }, + kolor: AppColor.blueColor, + ), + ], + ), + )) + ], + isleading: true); + } +} diff --git a/siro_driver/lib/views/auth/captin/verify_email_captain.dart b/siro_driver/lib/views/auth/captin/verify_email_captain.dart new file mode 100755 index 0000000..b5e8c64 --- /dev/null +++ b/siro_driver/lib/views/auth/captin/verify_email_captain.dart @@ -0,0 +1,91 @@ +import 'package:flutter/material.dart'; +import 'package:get/get.dart'; +import 'package:siro_driver/constant/colors.dart'; +import 'package:siro_driver/constant/style.dart'; +import 'package:siro_driver/controller/auth/captin/register_captin_controller.dart'; +import 'package:siro_driver/views/widgets/elevated_btn.dart'; +import 'package:siro_driver/views/widgets/my_scafold.dart'; + +class VerifyEmailCaptainPage extends StatelessWidget { + VerifyEmailCaptainPage({super.key}); + RegisterCaptainController registerCaptinController = + Get.put(RegisterCaptainController()); + @override + Widget build(BuildContext context) { + return MyScafolld( + title: 'Verify Email For Driver'.tr, + body: [ + Positioned( + top: 10, + left: 20, + child: Text( + 'We sent 5 digit to your Email provided'.tr, + style: AppStyle.title.copyWith(fontSize: 20), + )), + GetBuilder( + builder: (controller) => Positioned( + top: 100, + left: 80, + right: 80, + child: Padding( + padding: const EdgeInsets.all(10), + child: Column( + children: [ + SizedBox( + width: 100, + child: TextField( + controller: registerCaptinController.verifyCode, + decoration: InputDecoration( + labelStyle: AppStyle.title, + border: const OutlineInputBorder(), + hintText: '5 digit'.tr, + counterStyle: AppStyle.number, + hintStyle: AppStyle.subtitle + .copyWith(color: AppColor.accentColor), + ), + maxLength: 5, + keyboardType: TextInputType.number, + ), + ), + const SizedBox( + height: 30, + ), + MyElevatedButton( + title: 'Send Verfication Code'.tr, + onPressed: () { + registerCaptinController.sendVerifications(); + }) + ], + ), + ), + )), + ], + isleading: true, + ); + } + + Padding verifyEmail() { + return Padding( + padding: const EdgeInsets.symmetric(horizontal: 10), + child: Container( + decoration: BoxDecoration( + border: Border.all( + color: AppColor.accentColor, + width: 2, + ), + borderRadius: BorderRadius.circular(8), + ), + child: const Padding( + padding: EdgeInsets.all(10), + child: SizedBox( + width: 20, + child: TextField( + maxLength: 1, + keyboardType: TextInputType.number, + ), + ), + ), + ), + ); + } +} diff --git a/siro_driver/lib/views/auth/country_widget.dart b/siro_driver/lib/views/auth/country_widget.dart new file mode 100755 index 0000000..96242ce --- /dev/null +++ b/siro_driver/lib/views/auth/country_widget.dart @@ -0,0 +1,185 @@ +import 'package:flutter/cupertino.dart'; +import 'package:flutter/material.dart'; +import 'package:get/get.dart'; + +import '../../constant/box_name.dart'; +import '../../constant/colors.dart'; +import '../../constant/style.dart'; +import '../../controller/auth/captin/login_captin_controller.dart'; +import '../../controller/profile/profile_controller.dart'; +import '../../main.dart'; +import '../widgets/elevated_btn.dart'; +import 'captin/login_captin.dart'; + +class CountryPicker extends StatelessWidget { + final ProfileController controller = Get.put(ProfileController()); + + final List countryOptions = [ + 'Jordan', + 'USA', + 'Egypt', + 'Turkey', + 'Saudi Arabia', + 'Qatar', + 'Bahrain', + 'Kuwait', + ]; + + CountryPicker({Key? key}) : super(key: key); + + @override + Widget build(BuildContext context) { + return GetBuilder(builder: (controller) { + return Padding( + padding: const EdgeInsets.all(20), + child: ListView( + children: [ + const SizedBox( + height: 20, + ), + Text( + "Select Your Country".tr, + style: AppStyle.headTitle2, + textAlign: TextAlign.center, + ), + // const SizedBox( + // height: 20, + // ), + Padding( + padding: const EdgeInsets.all(10), + child: Text( + "To ensure you receive the most accurate information for your location, please select your country below. This will help tailor the app experience and content to your country." + .tr, + style: AppStyle.title, + textAlign: TextAlign.center, + ), + ), + SizedBox( + height: 200, + child: CupertinoPicker( + itemExtent: 32, + onSelectedItemChanged: (int index) { + controller.setCountry(countryOptions[index]); + box.write(BoxName.countryCode, + countryOptions[index]); // Save in English + }, + children: List.generate( + countryOptions.length, + (index) => Center( + child: Text( + countryOptions[index] + .tr, // Display translated if not English + style: AppStyle.title, + ), + ), + ), + ), + ), + + MyElevatedButton( + title: 'Select Country'.tr, // Use translated text for button + onPressed: () { + Get.find().saveCountryCode(controller + .selectedCountry + .toString()); // No conversion needed + box.write( + BoxName.countryCode, // + controller.selectedCountry); // Already saved in English + Get.snackbar(controller.selectedCountry.toString().tr, ''); + Get.off(LoginCaptin()); + }, + ) + ], + ), + ); + }); + } +} + +class CountryPickerFromSetting extends StatelessWidget { + final ProfileController controller = Get.put(ProfileController()); + final LoginDriverController loginController = + Get.put(LoginDriverController()); + + final List countryOptions = [ + 'Jordan', + 'Egypt', + 'Turkey', + 'Saudi Arabia', + 'Qatar', + 'Bahrain', + 'Kuwait', + 'USA', + ]; + + CountryPickerFromSetting({Key? key}) : super(key: key); + + @override + Widget build(BuildContext context) { + return GetBuilder(builder: (controller) { + return Padding( + padding: const EdgeInsets.all(20.0), + child: ListView( + children: [ + const SizedBox( + height: 20, + ), + Text( + "Select Your Country".tr, + style: AppStyle.headTitle2, + textAlign: TextAlign.center, + ), + // const SizedBox( + // height: 20, + // ), + Padding( + padding: const EdgeInsets.all(10), + child: Text( + "To ensure you receive the most accurate information for your location, please select your country below. This will help tailor the app experience and content to your country." + .tr, + style: AppStyle.title, + textAlign: TextAlign.center, + ), + ), + SizedBox( + height: 200, + child: CupertinoPicker( + itemExtent: 32, + onSelectedItemChanged: (int index) { + controller.setCountry(countryOptions[index]); + box.write(BoxName.countryCode, + countryOptions[index]); // Save in English + }, + children: List.generate( + countryOptions.length, + (index) => Center( + child: Text( + countryOptions[index] + .tr, // Display translated if not English + style: AppStyle.title, + ), + ), + ), + ), + ), + + MyElevatedButton( + title: 'Select Country'.tr, // Use translated text for button + onPressed: () async { + loginController.saveCountryCode(controller.selectedCountry + .toString()); // No conversion needed + box.write( + BoxName.countryCode, // + controller.selectedCountry); // Already saved in English + Get.snackbar(controller.selectedCountry.toString().tr, '', + backgroundColor: AppColor.greenColor); + // Get.back();// + // Get.back(); + }, + ) + ], + ), + ); + }); + } +} diff --git a/siro_driver/lib/views/auth/register_page.dart b/siro_driver/lib/views/auth/register_page.dart new file mode 100755 index 0000000..d0c5c3a --- /dev/null +++ b/siro_driver/lib/views/auth/register_page.dart @@ -0,0 +1,295 @@ +import 'package:flutter/material.dart'; +import 'package:get/get.dart'; +import 'package:siro_driver/constant/style.dart'; +import 'package:siro_driver/controller/auth/register_controller.dart'; +import 'package:siro_driver/views/widgets/elevated_btn.dart'; +import 'package:siro_driver/views/widgets/my_scafold.dart'; + +import '../../constant/colors.dart'; + +class RegisterPage extends StatelessWidget { + const RegisterPage({super.key}); + + @override + Widget build(BuildContext context) { + Get.put(RegisterController()); + return MyScafolld( + title: 'Register'.tr, + body: [ + GetBuilder( + builder: (controller) => Form( + key: controller.formKey, + child: Padding( + padding: const EdgeInsets.all(16.0), + child: SingleChildScrollView( + child: Container( + decoration: BoxDecoration( + boxShadow: [ + BoxShadow( + offset: const Offset(3, 3), + color: AppColor.accentColor, + blurRadius: 3) + ], + color: AppColor.secondaryColor, + ), + child: Padding( + padding: const EdgeInsets.all(16), + child: Column(children: [ + Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + SizedBox( + width: Get.width * .4, + child: TextFormField( + keyboardType: TextInputType.text, + controller: controller.firstNameController, + decoration: InputDecoration( + focusedBorder: OutlineInputBorder( + borderSide: BorderSide( + color: AppColor.primaryColor, + width: 2.0, + ), + borderRadius: BorderRadius.circular(10), + ), + fillColor: AppColor.accentColor, + hoverColor: AppColor.accentColor, + focusColor: AppColor.accentColor, + border: OutlineInputBorder( + borderRadius: BorderRadius.all( + Radius.circular(12))), + labelText: 'First name'.tr, + hintText: 'Enter your first name'.tr, + ), + validator: (value) { + if (value!.isEmpty) { + return 'Please enter your first name.'.tr; + } + return null; + }, + ), + ), + SizedBox( + width: Get.width * .4, + child: TextFormField( + keyboardType: TextInputType.text, + controller: controller.lastNameController, + decoration: InputDecoration( + focusedBorder: OutlineInputBorder( + borderSide: BorderSide( + color: AppColor.primaryColor, + width: 2.0, + ), + borderRadius: BorderRadius.circular(10), + ), + focusColor: AppColor.accentColor, + fillColor: AppColor.accentColor, + border: OutlineInputBorder( + borderRadius: BorderRadius.all( + Radius.circular(12))), + labelText: 'Last name'.tr, + hintText: 'Enter your last name'.tr, + ), + validator: (value) { + if (value!.isEmpty) { + return 'Please enter your last name.'.tr; + } + return null; + }, + ), + ), + ], + ), + const SizedBox( + height: 15, + ), + TextFormField( + keyboardType: TextInputType.emailAddress, + controller: controller.emailController, + decoration: InputDecoration( + focusedBorder: OutlineInputBorder( + borderSide: const BorderSide( + color: AppColor.primaryColor, + width: 2.0, + ), + borderRadius: BorderRadius.circular(10), + ), + fillColor: AppColor.accentColor, + hoverColor: AppColor.accentColor, + focusColor: AppColor.accentColor, + border: OutlineInputBorder( + borderRadius: + BorderRadius.all(Radius.circular(12))), + labelText: 'Email'.tr, + hintText: 'Enter your email address'.tr, + ), + validator: (value) { + if (value!.isEmpty || + (!value.contains('@') || + !value.contains('.'))) { + return 'Please enter Your Email.'.tr; + } + return null; + }, + ), + const SizedBox( + height: 15, + ), + TextFormField( + obscureText: true, + keyboardType: TextInputType.emailAddress, + controller: controller.passwordController, + decoration: InputDecoration( + focusedBorder: OutlineInputBorder( + borderSide: const BorderSide( + color: AppColor.primaryColor, + width: 2.0, + ), + borderRadius: BorderRadius.circular(10), + ), + fillColor: AppColor.accentColor, + hoverColor: AppColor.accentColor, + focusColor: AppColor.accentColor, + border: OutlineInputBorder( + borderRadius: + BorderRadius.all(Radius.circular(12))), + labelText: 'Password'.tr, + hintText: 'Enter your Password'.tr, + ), + validator: (value) { + if (value!.isEmpty) { + return 'Please enter Your Password.'.tr; + } + if (value.length < 6) { + return 'Password must br at least 6 character.' + .tr; + } + return null; + }, + ), + const SizedBox( + height: 15, + ), + Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + SizedBox( + width: Get.width * .4, + child: TextFormField( + keyboardType: TextInputType.phone, + cursorColor: AppColor.accentColor, + controller: controller.phoneController, + decoration: InputDecoration( + focusedBorder: OutlineInputBorder( + borderSide: const BorderSide( + color: AppColor.primaryColor, + width: 2.0, + ), + borderRadius: BorderRadius.circular(10), + ), + focusColor: AppColor.accentColor, + fillColor: AppColor.accentColor, + border: OutlineInputBorder( + borderRadius: BorderRadius.all( + Radius.circular(12))), + labelText: 'Phone'.tr, + hintText: 'Enter your phone number'.tr, + ), + validator: (value) { + if (value!.isEmpty || value.length != 10) { + return 'Please enter your phone number.'.tr; + } + return null; + }, + ), + ), + SizedBox( + width: Get.width * .4, + child: TextFormField( + keyboardType: TextInputType.text, + controller: controller.siteController, + decoration: InputDecoration( + focusedBorder: OutlineInputBorder( + borderSide: const BorderSide( + color: AppColor.primaryColor, + width: 2.0, + ), + borderRadius: BorderRadius.circular(10), + ), + focusColor: AppColor.accentColor, + fillColor: AppColor.accentColor, + border: OutlineInputBorder( + borderRadius: BorderRadius.all( + Radius.circular(12))), + labelText: 'City'.tr, + hintText: 'Enter your City'.tr, + ), + validator: (value) { + if (value!.isEmpty) { + return 'Please enter your City.'.tr; + } + return null; + }, + ), + ), + ], + ), + const SizedBox( + height: 15, + ), + Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + InkWell( + onTap: () => controller.getBirthDate(), + child: Container( + height: 50, + width: Get.width * .4, + decoration: BoxDecoration( + border: Border.all(), + borderRadius: BorderRadius.circular(13)), + child: Padding( + padding: const EdgeInsets.symmetric( + horizontal: 20), + child: Text( + controller.birthDate, + style: AppStyle.title, + ), + ), + ), + ), + // DropdownButton( + // value: controller.gender, + // items: [ + // DropdownMenuItem( + // value: 'Male'.tr, + // child: Text('Male'.tr), + // ), + // DropdownMenuItem( + // value: 'Female'.tr, + // child: Text('Female'.tr), + // ), + // DropdownMenuItem( + // value: '--'.tr, + // child: Text('--'.tr), + // ), + // ], + // onChanged: (value) { + // controller.changeGender(value!); + // }, + // ) + ], + ), + MyElevatedButton( + title: 'Register'.tr, + onPressed: () => controller.register()) + ]), + ), + ), + ), + ), + ), + ) + ], + isleading: true); + } +} diff --git a/siro_driver/lib/views/auth/syria/pending_driver_page.dart b/siro_driver/lib/views/auth/syria/pending_driver_page.dart new file mode 100644 index 0000000..84a0f1f --- /dev/null +++ b/siro_driver/lib/views/auth/syria/pending_driver_page.dart @@ -0,0 +1,167 @@ +import 'package:flutter/material.dart'; +import 'package:get/get.dart'; +import 'dart:math' as math; + +class DriverVerificationScreen extends StatefulWidget { + const DriverVerificationScreen({super.key}); + + @override + State createState() => + _DriverVerificationScreenState(); +} + +class _DriverVerificationScreenState extends State + with SingleTickerProviderStateMixin { + late final AnimationController _controller; + + @override + void initState() { + super.initState(); + _controller = AnimationController( + vsync: this, + duration: const Duration(seconds: 2), + )..repeat(); + } + + @override + void dispose() { + _controller.dispose(); + super.dispose(); + } + + @override + Widget build(BuildContext context) { + final theme = Theme.of(context); + + return Scaffold( + backgroundColor: const Color(0xFFF8F9FA), + body: SafeArea( + child: Center( + child: SingleChildScrollView( + padding: const EdgeInsets.all(24.0), + child: Column( + mainAxisAlignment: MainAxisAlignment.center, + crossAxisAlignment: CrossAxisAlignment.center, + children: [ + // Animated Icon + AnimatedBuilder( + animation: _controller, + builder: (_, child) { + return Transform.rotate( + angle: _controller.value * 2 * math.pi, + child: child, + ); + }, + child: Icon( + Icons.sync, + size: 80, + color: theme.primaryColor.withOpacity(0.8), + ), + ), + const SizedBox(height: 32), + + // Title + Text( + "Your Application is Under Review".tr, + textAlign: TextAlign.center, + style: TextStyle( + fontSize: 26, + fontWeight: FontWeight.bold, + color: theme.textTheme.titleLarge?.color, + ), + ), + const SizedBox(height: 16), + + // Main Message + Text( + "We have received your application to join us as a driver. Our team is currently reviewing it. Thank you for your patience." + .tr, + textAlign: TextAlign.center, + style: const TextStyle( + fontSize: 16, + color: Colors.black54, + height: 1.5, + ), + ), + const SizedBox(height: 32), + + // Notification Card + Container( + padding: const EdgeInsets.all(16), + decoration: BoxDecoration( + color: theme.primaryColor.withOpacity(0.1), + borderRadius: BorderRadius.circular(12), + border: Border.all( + color: theme.primaryColor.withOpacity(0.3), + width: 1, + ), + ), + child: Row( + children: [ + Icon(Icons.notifications_active_outlined, + color: theme.primaryColor, size: 30), + const SizedBox(width: 16), + Expanded( + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Text( + "You Will Be Notified".tr, + style: TextStyle( + fontSize: 16, + fontWeight: FontWeight.bold, + color: theme.primaryColor, + ), + ), + const SizedBox(height: 4), + Text( + "We will send you a notification as soon as your account is approved. You can safely close this page, and we'll let you know when the review is complete." + .tr, + style: const TextStyle( + fontSize: 14, + color: Colors.black87, + height: 1.4, + ), + ), + ], + ), + ), + ], + ), + ), + + const SizedBox(height: 40), + + // Refresh Button + // ElevatedButton.icon( + // onPressed: () { + // // TODO: Add logic to check status from your API + // Get.snackbar( + // "Status", // This can also be a key if you want + // "Checking for updates...".tr, + // snackPosition: SnackPosition.BOTTOM, + // ); + // }, + // icon: const Icon(Icons.refresh, color: Colors.white), + // label: Text( + // "Refresh Status".tr, + // style: const TextStyle(fontSize: 16, color: Colors.white), + // ), + // style: ElevatedButton.styleFrom( + // backgroundColor: theme.primaryColor, + // padding: const EdgeInsets.symmetric( + // horizontal: 40, vertical: 15), + // shape: RoundedRectangleBorder( + // borderRadius: BorderRadius.circular(30.0), + // ), + // elevation: 3, + // ), + // ), + ], + ), + ), + ), + ), + ); + } +} diff --git a/siro_driver/lib/views/auth/syria/registration_view.dart b/siro_driver/lib/views/auth/syria/registration_view.dart new file mode 100644 index 0000000..b85ae49 --- /dev/null +++ b/siro_driver/lib/views/auth/syria/registration_view.dart @@ -0,0 +1,500 @@ +import 'dart:io'; +import 'package:flutter/material.dart'; +import 'package:get/get.dart'; + +import '../../../controller/auth/syria/registration_controller.dart'; + +class RegistrationView extends StatelessWidget { + const RegistrationView({Key? key}) : super(key: key); + + @override + Widget build(BuildContext context) { + final RegistrationController controller = Get.put(RegistrationController()); + + return Scaffold( + appBar: AppBar( + title: Text('Driver Registration'.tr), + centerTitle: true, + ), + body: Column( + children: [ + SizedBox( + height: 90, + child: Obx( + () => Stepper( + currentStep: controller.currentPage.value, + type: StepperType.horizontal, + controlsBuilder: (_, __) => const SizedBox.shrink(), + steps: [ + Step( + title: Text('Driver'.tr), + content: const SizedBox.shrink()), + Step( + title: Text('Vehicle'.tr), + content: const SizedBox.shrink()), + Step( + title: Text('Docs'.tr), content: const SizedBox.shrink()), + ], + ), + ), + ), + Expanded( + child: PageView( + controller: controller.pageController, + physics: const NeverScrollableScrollPhysics(), + onPageChanged: (i) => controller.currentPage.value = i, + children: [ + _buildDriverInfoStep(context, controller), + _buildCarInfoStep(context, controller), + _buildDocumentUploadStep(context, controller), + ], + ), + ), + ], + ), + bottomNavigationBar: _buildBottomNavBar(controller), + ); + } + + // STEP 1 + Widget _buildDriverInfoStep(BuildContext ctx, RegistrationController c) { + return SingleChildScrollView( + padding: const EdgeInsets.all(16), + child: Form( + key: c.driverInfoFormKey, + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Text("Driver's Personal Information".tr, + style: + const TextStyle(fontSize: 20, fontWeight: FontWeight.bold)), + const SizedBox(height: 20), + TextFormField( + controller: c.firstNameController, + decoration: InputDecoration( + labelText: 'First Name'.tr, + border: const OutlineInputBorder(), + ), + validator: (v) { + if (v == null || v.isEmpty) { + return 'Required field'.tr; + } + if (v.length < 2) { + return 'Name must be at least 2 characters'.tr; + } + return null; + }, + ), + const SizedBox(height: 16), + TextFormField( + controller: c.lastNameController, + decoration: InputDecoration( + labelText: 'Last Name'.tr, + border: const OutlineInputBorder(), + ), + validator: (v) { + if (v == null || v.isEmpty) { + return 'Required field'.tr; + } + if (v.length < 2) { + return 'Name must be at least 2 characters'.tr; + } + return null; + }, + ), + const SizedBox(height: 16), + TextFormField( + controller: c.nationalIdController, + decoration: InputDecoration( + labelText: 'National ID Number'.tr, + border: const OutlineInputBorder(), + ), + keyboardType: TextInputType.number, + validator: (v) { + if (v == null || v.isEmpty) { + return 'Required field'.tr; + } + if (v.length != 11) { + return 'National ID must be 11 digits'.tr; + } + return null; + }, + ), + const SizedBox(height: 16), + TextFormField( + controller: c.bithdateController, + decoration: InputDecoration( + labelText: 'سنة الميلاد'.tr, + hintText: '1999'.tr, + border: const OutlineInputBorder(), + ), + keyboardType: TextInputType.number, + validator: (v) { + if (v == null || v.isEmpty) { + return 'Required field'.tr; + } + if (v.length != 4) { + return 'Birth year must be 4 digits'.tr; + } + // Optional: check if it’s a valid number + if (int.tryParse(v) == null) { + return 'Enter a valid year'.tr; + } + return null; + }, + ), + const SizedBox(height: 16), + TextFormField( + controller: c.driverLicenseExpiryController, + decoration: InputDecoration( + labelText: 'License Expiry Date'.tr, + hintText: 'YYYY-MM-DD'.tr, + border: const OutlineInputBorder()), + readOnly: true, + onTap: () async { + DateTime? d = await showDatePicker( + context: ctx, + initialDate: DateTime.now(), + firstDate: DateTime(2000), + lastDate: DateTime(2101), + ); + if (d != null) { + c.driverLicenseExpiryDate = d; + c.driverLicenseExpiryController.text = + d.toLocal().toString().split(' ')[0]; + } + }, + validator: (v) => + (v?.isEmpty ?? true) ? 'Please select a date'.tr : null, + ), + ], + ), + ), + ); + } + + // STEP 2 + Widget _buildCarInfoStep(BuildContext ctx, RegistrationController c) { + return SingleChildScrollView( + padding: const EdgeInsets.all(16), + child: Form( + key: c.carInfoFormKey, + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Text('Vehicle Information'.tr, + style: + const TextStyle(fontSize: 20, fontWeight: FontWeight.bold)), + const SizedBox(height: 20), + // ============================================================ + // 1. القائمة المنسدلة لتصنيف المركبة (سيارة، دراجة، فان) + // ============================================================ + DropdownButtonFormField( + value: c.selectedVehicleCategoryId, + decoration: InputDecoration( + labelText: 'Vehicle Category'.tr, // ترجمة: تصنيف المركبة + border: const OutlineInputBorder(), + prefixIcon: const Icon(Icons.directions_car), + ), + items: c.vehicleCategoryOptions.map((item) { + return DropdownMenuItem( + value: item['id'], + child: Text(item['name']), + ); + }).toList(), + onChanged: (val) { + c.selectedVehicleCategoryId = val; + c.update(); // تحديث الواجهة إذا لزم الأمر + }, + validator: (v) => (v == null) ? 'Required field'.tr : null, + ), + const SizedBox(height: 16), + // ============================================================ + // 2. القائمة المنسدلة لنوع الوقود (بنزين، كهرباء...) + // ============================================================ + DropdownButtonFormField( + value: c.selectedFuelTypeId, + decoration: InputDecoration( + labelText: 'Fuel Type'.tr, // ترجمة: نوع الوقود + border: const OutlineInputBorder(), + prefixIcon: const Icon(Icons.local_gas_station), + ), + items: c.fuelTypeOptions.map((item) { + return DropdownMenuItem( + value: item['id'], + child: Text(item['name']), + ); + }).toList(), + onChanged: (val) { + c.selectedFuelTypeId = val; + c.update(); + }, + validator: (v) => (v == null) ? 'Required field'.tr : null, + ), + const SizedBox(height: 16), + TextFormField( + controller: c.carPlateController, + decoration: InputDecoration( + labelText: 'Car Plate Number'.tr, + border: const OutlineInputBorder()), + validator: (v) => + (v?.isEmpty ?? true) ? 'Required field'.tr : null, + ), + const SizedBox(height: 16), + TextFormField( + controller: c.carMakeController, + decoration: InputDecoration( + labelText: 'Car Make (e.g., Toyota)'.tr, + border: const OutlineInputBorder()), + validator: (v) => + (v?.isEmpty ?? true) ? 'Required field'.tr : null, + ), + const SizedBox(height: 16), + TextFormField( + controller: c.carModelController, + decoration: InputDecoration( + labelText: 'Car Model (e.g., Corolla)'.tr, + border: const OutlineInputBorder()), + validator: (v) => + (v?.isEmpty ?? true) ? 'Required field'.tr : null, + ), + const SizedBox(height: 16), + TextFormField( + controller: c.carYearController, + keyboardType: TextInputType.number, + decoration: InputDecoration( + labelText: 'Year of Manufacture'.tr, + border: const OutlineInputBorder()), + validator: (v) => + (v?.isEmpty ?? true) ? 'Required field'.tr : null, + ), + const SizedBox(height: 16), + // حقل اسم اللون (يبقى اختياري أو نملؤه تلقائيًا عند اختيار الهكس) + // TextFormField( + // controller: c.carColorController, + // decoration: InputDecoration( + // labelText: 'Car Color (Name)'.tr, + // border: const OutlineInputBorder(), + // ), + // validator: (v) => + // (v?.isEmpty ?? true) ? 'Required field'.tr : null, + // ), + // const SizedBox(height: 16), + +// الدروب داون للهكس + دائرة اللون + GetBuilder( + id: 'carColor', // اختياري لتحديث انتقائي + builder: (c) { + return DropdownButtonFormField( + value: (c.colorHex != null && c.colorHex!.isNotEmpty) + ? c.colorHex + : null, + isExpanded: true, + decoration: InputDecoration( + labelText: 'Car Color (Hex)'.tr, + border: const OutlineInputBorder(), + // prefixIcon: Padding( + // padding: + // const EdgeInsetsDirectional.only(start: 12, end: 8), + // child: Container( + // width: 18, + // height: 18, + // decoration: BoxDecoration( + // color: (c.colorHex?.isNotEmpty ?? false) + // ? c.hexToColor(c.colorHex!) + // : Colors.transparent, + // shape: BoxShape.circle, + // border: Border.all(color: Colors.black26), + // ), + // ), + // ), + ), + items: RegistrationController.kCarColorOptions.map((opt) { + final hex = opt['hex']!; + final key = opt['key']!; + return DropdownMenuItem( + value: hex, + child: Row( + children: [ + Container( + width: 18, + height: 18, + decoration: BoxDecoration( + color: c.hexToColor(hex), + shape: BoxShape.circle, + border: Border.all(color: Colors.black12), + ), + ), + const SizedBox(width: 8), + Expanded(child: Text(key.tr)), + ], + ), + ); + }).toList(), + onChanged: (hex) { + c.colorHex = hex; // خزّن الهكس + final key = RegistrationController.kCarColorOptions + .firstWhere((o) => o['hex'] == hex)['key']!; + c.carColorController.text = key.tr; + c.update([ + 'carColor' + ]); // <-- مهم: يعيد بناء الودجت ويحدّث الدائرة + }, + validator: (v) => + (v == null || v.isEmpty) ? 'Required field'.tr : null, + ); + }, + ) + ], + ), + ), + ); + } + + // STEP 3 + Widget _buildDocumentUploadStep(BuildContext ctx, RegistrationController c) { + final String linkUpload = + 'https://syria.intaleq.xyz/intaleq/auth/syria/uploadImage.php'; + + return GetBuilder( + builder: (ctrl) => SingleChildScrollView( + padding: const EdgeInsets.all(16), + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Text('Upload Documents'.tr, + style: + const TextStyle(fontSize: 20, fontWeight: FontWeight.bold)), + const SizedBox(height: 20), + _buildImagePickerBox( + 'Driver License (Front)'.tr, + ctrl.docUrls['driver_license_front'], + // () => ctrl.pickImage(ImageType.driverLicenseFront), + + () async => + await ctrl.choosImage(linkUpload, 'driver_license_front'), + ), + _buildImagePickerBox( + 'Driver License (Back)'.tr, + ctrl.docUrls['driver_license_back'], + () async => + await ctrl.choosImage(linkUpload, 'driver_license_back'), + // () => ctrl.pickImage(ImageType.driverLicenseBack), + ), + _buildImagePickerBox( + 'Car Registration (Front)'.tr, + ctrl.docUrls['car_license_front'], + () async => + await ctrl.choosImage(linkUpload, 'car_license_front'), + // () => ctrl.pickImage(ImageType.carLicenseFront), + ), + _buildImagePickerBox( + 'Car Registration (Back)'.tr, + ctrl.docUrls['car_license_back'], + () async => await ctrl.choosImage(linkUpload, 'car_license_back'), + // () => ctrl.pickImage(ImageType.carLicenseBack), + ), + ], + ), + ), + ); + } + + Widget signedImageWithAuth(String fileUrl, String bearerToken) { + return Image.network( + fileUrl, + headers: {'Authorization': 'Bearer $bearerToken'}, + fit: BoxFit.cover, + errorBuilder: (_, __, ___) => const Text('Image expired or unauthorized'), + ); + } + + Widget _buildImagePickerBox(String title, String? img, VoidCallback onTap) { + return Card( + margin: const EdgeInsets.only(bottom: 16), + child: InkWell( + onTap: onTap, + child: SizedBox( + height: 150, + width: double.infinity, + child: (img != null && img.isNotEmpty) + ? Image.network( + img, + fit: BoxFit.cover, + errorBuilder: (context, error, stackTrace) { + return Center( + child: Column( + mainAxisAlignment: MainAxisAlignment.center, + children: [ + Icon(Icons.broken_image, size: 40, color: Colors.red), + const SizedBox(height: 8), + Text('Image not available', + style: TextStyle(color: Colors.red[700])), + ], + ), + ); + }, + ) + : Column( + mainAxisAlignment: MainAxisAlignment.center, + children: [ + Icon(Icons.camera_alt_outlined, + size: 40, color: Colors.grey[600]), + const SizedBox(height: 8), + Text(title, style: TextStyle(color: Colors.grey[700])), + Text('Tap to upload'.tr, + style: + const TextStyle(color: Colors.grey, fontSize: 12)), + ], + ), + ), + ), + ); + } + + Widget _buildBottomNavBar(RegistrationController c) { + return Obx(() => Padding( + padding: const EdgeInsets.all(16), + child: Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + if (c.currentPage.value > 0) + TextButton( + onPressed: c.goToPreviousStep, + child: Text('<< BACK'.tr), + ), + const Spacer(), + ElevatedButton( + style: ElevatedButton.styleFrom( + padding: + const EdgeInsets.symmetric(horizontal: 40, vertical: 12), + backgroundColor: c.currentPage.value == 2 + ? Colors.green + : Theme.of(Get.context!).primaryColor, + ), + onPressed: c.isLoading.value + ? null + : () { + if (c.currentPage.value == 2) { + c.submitRegistration(); + } else { + c.goToNextStep(); + } + }, + child: c.isLoading.value + ? const SizedBox( + width: 20, + height: 20, + child: CircularProgressIndicator( + color: Colors.white, strokeWidth: 2)) + : Text( + c.currentPage.value == 2 ? 'SUBMIT'.tr : 'NEXT >>'.tr, + style: + const TextStyle(fontSize: 16, color: Colors.white), + ), + ), + ], + ), + )); + } +} diff --git a/siro_driver/lib/views/auth/verify_email_page.dart b/siro_driver/lib/views/auth/verify_email_page.dart new file mode 100755 index 0000000..8157588 --- /dev/null +++ b/siro_driver/lib/views/auth/verify_email_page.dart @@ -0,0 +1,90 @@ +import 'package:flutter/material.dart'; +import 'package:get/get.dart'; +import 'package:siro_driver/constant/colors.dart'; +import 'package:siro_driver/constant/style.dart'; +import 'package:siro_driver/controller/auth/register_controller.dart'; +import 'package:siro_driver/views/widgets/elevated_btn.dart'; +import 'package:siro_driver/views/widgets/my_scafold.dart'; + +class VerifyEmailPage extends StatelessWidget { + const VerifyEmailPage({super.key}); + + @override + Widget build(BuildContext context) { + Get.put(RegisterController()); + return MyScafolld( + title: 'Verify Email'.tr, + body: [ + Positioned( + top: 10, + left: 20, + right: 20, + child: Text( + 'We sent 5 digit to your Email provided'.tr, + style: AppStyle.title.copyWith(fontSize: 20), + )), + GetBuilder( + builder: (controller) => Positioned( + top: 100, + left: 80, + right: 80, + child: Padding( + padding: const EdgeInsets.all(10), + child: Column( + children: [ + SizedBox( + width: 100, + child: TextField( + controller: controller.verfyCode, + decoration: InputDecoration( + labelStyle: AppStyle.title, + border: const OutlineInputBorder(), + hintText: '5 digit'.tr, + counterStyle: AppStyle.number, + hintStyle: AppStyle.subtitle + .copyWith(color: AppColor.accentColor), + ), + maxLength: 5, + keyboardType: TextInputType.number, + ), + ), + const SizedBox( + height: 30, + ), + MyElevatedButton( + title: 'Send Verfication Code'.tr, + onPressed: () => controller.sendVerifications()) + ], + ), + ), + )), + ], + isleading: true, + ); + } + + Padding verifyEmail() { + return Padding( + padding: const EdgeInsets.symmetric(horizontal: 10), + child: Container( + decoration: BoxDecoration( + border: Border.all( + color: AppColor.accentColor, + width: 2, + ), + borderRadius: BorderRadius.circular(8), + ), + child: const Padding( + padding: EdgeInsets.all(10), + child: SizedBox( + width: 20, + child: TextField( + maxLength: 1, + keyboardType: TextInputType.number, + ), + ), + ), + ), + ); + } +} diff --git a/siro_driver/lib/views/gamification/challenges_page.dart b/siro_driver/lib/views/gamification/challenges_page.dart new file mode 100644 index 0000000..aa413b4 --- /dev/null +++ b/siro_driver/lib/views/gamification/challenges_page.dart @@ -0,0 +1,229 @@ +import 'package:flutter/material.dart'; +import 'package:get/get.dart'; +import '../../../constant/finance_design_system.dart'; +import '../../../controller/gamification/challenges_controller.dart'; + +class ChallengesPage extends StatelessWidget { + ChallengesPage({super.key}); + final ChallengesController controller = Get.put(ChallengesController()); + + @override + Widget build(BuildContext context) { + return Scaffold( + backgroundColor: FinanceDesignSystem.backgroundColor, + body: GetBuilder(builder: (cc) { + if (cc.isLoading) { + return Center( + child: CircularProgressIndicator( + color: FinanceDesignSystem.primaryDark)); + } + return CustomScrollView( + physics: const BouncingScrollPhysics(), + slivers: [ + SliverAppBar( + expandedHeight: 160, + pinned: true, + backgroundColor: Get.isDarkMode ? FinanceDesignSystem.primaryDark : const Color(0xFF1A237E), + leading: IconButton( + icon: const Icon(Icons.arrow_back_ios_new_rounded, + color: Colors.white, size: 20), + onPressed: () => Get.back()), + actions: [ + IconButton( + icon: const Icon(Icons.refresh_rounded, + color: Colors.white), + onPressed: () => cc.fetchChallengeProgress()) + ], + flexibleSpace: FlexibleSpaceBar( + centerTitle: true, + title: Text('Challenges'.tr, + style: TextStyle( + color: Colors.white, + fontWeight: FontWeight.bold, + fontSize: 18)), + background: Stack(fit: StackFit.expand, children: [ + Container( + decoration: BoxDecoration( + gradient: LinearGradient(colors: Get.isDarkMode + ? [FinanceDesignSystem.primaryDark, const Color(0xFF1E1E2E)] + : [const Color(0xFF0A0E21), const Color(0xFF1A237E)] + ))), + Positioned( + right: -30, + top: -10, + child: Icon(Icons.bolt_rounded, + size: 160, color: Colors.white.withValues(alpha: 0.04))), + ]), + ), + ), + SliverPadding( + padding: const EdgeInsets.fromLTRB(16, 24, 16, 40), + sliver: SliverList( + delegate: SliverChildListDelegate([ + // Daily Challenges + _sectionHeader( + 'Daily Challenges'.tr, + '🔥', + cc.dailyChallenges.where((c) => c.isCompleted).length, + cc.dailyChallenges.length), + const SizedBox(height: 12), + ...cc.dailyChallenges.map((c) => _challengeCard(c, cc)), + const SizedBox(height: 28), + // Weekly Challenges + _sectionHeader( + 'Weekly Challenges'.tr, + '🏆', + cc.weeklyChallenges.where((c) => c.isCompleted).length, + cc.weeklyChallenges.length), + const SizedBox(height: 12), + ...cc.weeklyChallenges.map((c) => _challengeCard(c, cc)), + ]))), + ]); + }), + ); + } + + Widget _sectionHeader(String title, String emoji, int done, int total) { + return Row(mainAxisAlignment: MainAxisAlignment.spaceBetween, children: [ + Row(children: [ + Text(emoji, style: const TextStyle(fontSize: 20)), + const SizedBox(width: 8), + Text(title, style: FinanceDesignSystem.headingStyle), + ]), + Container( + padding: const EdgeInsets.symmetric(horizontal: 10, vertical: 4), + decoration: BoxDecoration( + color: FinanceDesignSystem.accentBlue.withValues(alpha: 0.1), + borderRadius: BorderRadius.circular(20)), + child: Text('$done/$total', + style: TextStyle( + fontSize: 12, + fontWeight: FontWeight.bold, + color: FinanceDesignSystem.accentBlue)), + ), + ]); + } + + Widget _challengeCard(Challenge c, ChallengesController cc) { + final isAr = Get.locale?.languageCode == 'ar'; + return Container( + margin: const EdgeInsets.only(bottom: 12), + padding: const EdgeInsets.all(16), + decoration: BoxDecoration( + color: Colors.white, + borderRadius: BorderRadius.circular(FinanceDesignSystem.cardRadius), + border: c.isCompleted + ? Border.all(color: c.color.withValues(alpha: 0.3), width: 1.5) + : null, + boxShadow: [ + BoxShadow( + color: Colors.black.withValues(alpha: 0.03), + blurRadius: 10, + offset: const Offset(0, 4)) + ], + ), + child: Column(crossAxisAlignment: CrossAxisAlignment.start, children: [ + Row(children: [ + Container( + width: 44, + height: 44, + decoration: BoxDecoration( + color: c.color.withValues(alpha: 0.12), + borderRadius: BorderRadius.circular(12)), + child: Icon(c.icon, color: c.color, size: 22), + ), + const SizedBox(width: 12), + Expanded( + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Text(isAr ? c.titleAr : c.titleEn, + style: TextStyle( + fontSize: 14, + fontWeight: FontWeight.bold, + color: FinanceDesignSystem.primaryDark)), + Text(isAr ? c.descriptionAr : c.descriptionEn, + style: + TextStyle(fontSize: 11, color: FinanceDesignSystem.textSecondary)), + ])), + Container( + padding: const EdgeInsets.symmetric(horizontal: 10, vertical: 5), + decoration: BoxDecoration( + color: const Color(0xFFFFD700).withValues(alpha: 0.15), + borderRadius: BorderRadius.circular(12)), + child: Text('+${c.reward}', + style: const TextStyle( + fontSize: 12, + fontWeight: FontWeight.bold, + color: Color(0xFFFF8F00))), + ), + ]), + const SizedBox(height: 14), + // Progress bar + Row(mainAxisAlignment: MainAxisAlignment.spaceBetween, children: [ + Text('${c.currentProgress}/${c.target}', + style: TextStyle( + fontSize: 11, + fontWeight: FontWeight.w600, + color: FinanceDesignSystem.textSecondary)), + Text('${(c.progress * 100).toStringAsFixed(0)}%', + style: TextStyle( + fontSize: 11, fontWeight: FontWeight.bold, color: c.color)), + ]), + const SizedBox(height: 6), + Stack(children: [ + Container( + height: 8, + decoration: BoxDecoration( + color: FinanceDesignSystem.backgroundColor, + borderRadius: BorderRadius.circular(4))), + LayoutBuilder( + builder: (ctx, cons) => AnimatedContainer( + duration: const Duration(milliseconds: 600), + curve: Curves.easeOutCubic, + height: 8, + width: cons.maxWidth * c.progress, + decoration: BoxDecoration( + gradient: LinearGradient( + colors: [c.color, c.color.withValues(alpha: 0.6)]), + borderRadius: BorderRadius.circular(4), + ), + )), + ]), + // Claim button + if (c.isCompleted && !c.isClaimed) ...[ + const SizedBox(height: 12), + SizedBox( + width: double.infinity, + child: ElevatedButton.icon( + onPressed: () => cc.claimReward(c), + icon: const Icon(Icons.card_giftcard_rounded, size: 18), + label: Text('Claim Reward'.tr), + style: ElevatedButton.styleFrom( + backgroundColor: c.color, + foregroundColor: Colors.white, + elevation: 0, + shape: RoundedRectangleBorder( + borderRadius: BorderRadius.circular(12)), + padding: const EdgeInsets.symmetric(vertical: 12), + ), + )), + ], + if (c.isClaimed) ...[ + const SizedBox(height: 8), + Center( + child: Row(mainAxisSize: MainAxisSize.min, children: [ + Icon(Icons.check_circle_rounded, + color: FinanceDesignSystem.successGreen, size: 16), + const SizedBox(width: 4), + Text('Claimed'.tr, + style: TextStyle( + fontSize: 12, + fontWeight: FontWeight.bold, + color: FinanceDesignSystem.successGreen)), + ])), + ], + ]), + ); + } +} diff --git a/siro_driver/lib/views/gamification/leaderboard_page.dart b/siro_driver/lib/views/gamification/leaderboard_page.dart new file mode 100644 index 0000000..e73941b --- /dev/null +++ b/siro_driver/lib/views/gamification/leaderboard_page.dart @@ -0,0 +1,262 @@ +import 'package:flutter/material.dart'; +import 'package:get/get.dart'; +import '../../../constant/finance_design_system.dart'; +import '../../../controller/gamification/leaderboard_controller.dart'; + +class LeaderboardPage extends StatelessWidget { + LeaderboardPage({super.key}); + final LeaderboardController controller = Get.put(LeaderboardController()); + + @override + Widget build(BuildContext context) { + return Scaffold( + backgroundColor: FinanceDesignSystem.backgroundColor, + body: GetBuilder(builder: (lc) { + if (lc.isLoading) { + return Center( + child: CircularProgressIndicator( + color: FinanceDesignSystem.primaryDark)); + } + return CustomScrollView( + physics: const BouncingScrollPhysics(), + slivers: [ + SliverAppBar( + expandedHeight: 200, + pinned: true, + backgroundColor: Get.isDarkMode + ? FinanceDesignSystem.primaryDark + : const Color(0xFF0A0E21), + leading: IconButton( + icon: const Icon(Icons.arrow_back_ios_new_rounded, + color: Colors.white, size: 20), + onPressed: () => Get.back()), + flexibleSpace: FlexibleSpaceBar( + centerTitle: true, + title: Text('Leaderboard'.tr, + style: const TextStyle( + color: Colors.white, + fontWeight: FontWeight.bold, + fontSize: 18)), + background: Stack(fit: StackFit.expand, children: [ + Container( + decoration: const BoxDecoration( + gradient: LinearGradient(colors: [ + Color(0xFF0A0E21), + Color(0xFFB71C1C) + ]))), + Positioned( + right: -40, + top: -20, + child: Icon(Icons.leaderboard_rounded, + size: 180, color: Colors.white.withValues(alpha: 0.04))), + // Top 3 podium + if (lc.currentLeaderboard.length >= 3) + Positioned( + bottom: 50, + left: 0, + right: 0, + child: _buildPodium(lc)), + ]), + ), + ), + // Tab bar + SliverToBoxAdapter( + child: Container( + margin: const EdgeInsets.fromLTRB(16, 16, 16, 0), + padding: const EdgeInsets.all(4), + decoration: BoxDecoration( + color: FinanceDesignSystem.backgroundColor.withValues(alpha: 0.5), + borderRadius: BorderRadius.circular(14)), + child: Row(children: [ + _tab('Trips'.tr, Icons.local_taxi_rounded, 0, lc), + _tab('Earnings'.tr, Icons.monetization_on_rounded, 1, lc), + ]), + )), + // List + SliverPadding( + padding: const EdgeInsets.fromLTRB(16, 16, 16, 40), + sliver: SliverList( + delegate: SliverChildBuilderDelegate( + (ctx, i) { + if (i >= lc.currentLeaderboard.length) return null; + return _buildRow( + lc.currentLeaderboard[i], lc.selectedTab == 1); + }, + childCount: lc.currentLeaderboard.length, + ), + )), + ]); + }), + ); + } + + Widget _buildPodium(LeaderboardController lc) { + final top3 = lc.currentLeaderboard.take(3).toList(); + return Row( + mainAxisAlignment: MainAxisAlignment.center, + crossAxisAlignment: CrossAxisAlignment.end, + children: [ + if (top3.length > 1) + _podiumItem(top3[1], 2, 50, const Color(0xFFC0C0C0)), + if (top3.isNotEmpty) + _podiumItem(top3[0], 1, 70, const Color(0xFFFFD700)), + if (top3.length > 2) + _podiumItem(top3[2], 3, 35, const Color(0xFFCD7F32)), + ]); + } + + Widget _podiumItem(LeaderboardEntry e, int rank, double height, Color color) { + return Padding( + padding: const EdgeInsets.symmetric(horizontal: 8), + child: Column(mainAxisSize: MainAxisSize.min, children: [ + CircleAvatar( + radius: rank == 1 ? 22 : 18, + backgroundColor: color.withValues(alpha: 0.3), + child: Text(_getRankEmoji(rank), + style: TextStyle(fontSize: rank == 1 ? 22 : 16))), + const SizedBox(height: 4), + Text(e.name.length > 8 ? '${e.name.substring(0, 8)}...' : e.name, + style: TextStyle( + color: Colors.white, + fontSize: 10, + fontWeight: + e.isCurrentUser ? FontWeight.bold : FontWeight.normal)), + ])); + } + + Widget _tab(String label, IconData icon, int idx, LeaderboardController lc) { + final selected = lc.selectedTab == idx; + return Expanded( + child: GestureDetector( + onTap: () => lc.changeTab(idx), + child: AnimatedContainer( + duration: const Duration(milliseconds: 200), + padding: const EdgeInsets.symmetric(vertical: 10), + decoration: BoxDecoration( + color: + selected ? FinanceDesignSystem.cardColor : Colors.transparent, + borderRadius: BorderRadius.circular(10), + boxShadow: selected + ? [ + BoxShadow( + color: Colors.black.withValues(alpha: 0.05), blurRadius: 5) + ] + : null), + child: Row(mainAxisAlignment: MainAxisAlignment.center, children: [ + Icon(icon, + size: 16, + color: selected ? FinanceDesignSystem.primaryDark : Colors.grey), + const SizedBox(width: 6), + Text(label, + style: TextStyle( + fontSize: 13, + fontWeight: FontWeight.w600, + color: selected + ? FinanceDesignSystem.primaryDark + : Colors.grey)), + ]), + ), + )); + } + + Widget _buildRow(LeaderboardEntry e, bool isEarnings) { + final rankColor = e.rank == 1 + ? const Color(0xFFFFD700) + : e.rank == 2 + ? const Color(0xFFC0C0C0) + : e.rank == 3 + ? const Color(0xFFCD7F32) + : Colors.grey.shade400; + return Container( + margin: const EdgeInsets.only(bottom: 8), + padding: const EdgeInsets.all(14), + decoration: BoxDecoration( + color: e.isCurrentUser + ? FinanceDesignSystem.accentBlue.withValues(alpha: 0.08) + : FinanceDesignSystem.cardColor, + borderRadius: BorderRadius.circular(14), + border: e.isCurrentUser + ? Border.all( + color: FinanceDesignSystem.accentBlue.withValues(alpha: 0.3), + width: 1.5) + : null, + boxShadow: [ + BoxShadow( + color: Colors.black.withValues(alpha: 0.02), + blurRadius: 8, + offset: const Offset(0, 3)) + ], + ), + child: Row(children: [ + // Rank + Container( + width: 32, + height: 32, + decoration: BoxDecoration( + color: rankColor.withValues(alpha: 0.15), + borderRadius: BorderRadius.circular(8)), + child: Center( + child: e.rank <= 3 + ? Text(_getRankEmoji(e.rank), + style: const TextStyle(fontSize: 16)) + : Text('${e.rank}', + style: TextStyle( + fontSize: 12, + fontWeight: FontWeight.bold, + color: rankColor)))), + const SizedBox(width: 12), + // Avatar + CircleAvatar( + radius: 18, + backgroundColor: FinanceDesignSystem.backgroundColor, + child: Text(e.name.isNotEmpty ? e.name[0] : '?', + style: TextStyle( + fontWeight: FontWeight.bold, + color: FinanceDesignSystem.textSecondary))), + const SizedBox(width: 12), + // Name + Expanded( + child: + Column(crossAxisAlignment: CrossAxisAlignment.start, children: [ + Row(children: [ + Text(e.name, + style: TextStyle( + fontSize: 13, + fontWeight: + e.isCurrentUser ? FontWeight.bold : FontWeight.w500, + color: FinanceDesignSystem.primaryDark)), + if (e.isCurrentUser) ...[ + const SizedBox(width: 6), + Container( + padding: + const EdgeInsets.symmetric(horizontal: 6, vertical: 2), + decoration: BoxDecoration( + color: FinanceDesignSystem.accentBlue, + borderRadius: BorderRadius.circular(6)), + child: Text('You'.tr, + style: const TextStyle( + fontSize: 8, + fontWeight: FontWeight.bold, + color: Colors.white))) + ], + ]), + ])), + // Value + Text( + isEarnings + ? '${e.value.toStringAsFixed(0)} ${'SYP'.tr}' + : '${e.value.toInt()} ${'Rides'.tr}', + style: TextStyle( + fontSize: 13, + fontWeight: FontWeight.w800, + color: FinanceDesignSystem.primaryDark)), + ]), + ); + } + + String _getRankEmoji(int rank) => rank == 1 + ? '🥇' + : rank == 2 + ? '🥈' + : '🥉'; +} diff --git a/siro_driver/lib/views/gamification/referral_center_page.dart b/siro_driver/lib/views/gamification/referral_center_page.dart new file mode 100644 index 0000000..439f32d --- /dev/null +++ b/siro_driver/lib/views/gamification/referral_center_page.dart @@ -0,0 +1,252 @@ +import 'package:flutter/material.dart'; +import 'package:flutter/services.dart'; +import 'package:get/get.dart'; +import 'package:share_plus/share_plus.dart'; +import 'package:url_launcher/url_launcher.dart'; +import '../../../constant/finance_design_system.dart'; +import '../../../controller/gamification/referral_controller.dart'; +import 'package:siro_driver/views/widgets/error_snakbar.dart'; + +class ReferralCenterPage extends StatelessWidget { + ReferralCenterPage({super.key}); + final ReferralController controller = Get.put(ReferralController()); + + @override + Widget build(BuildContext context) { + return Scaffold( + backgroundColor: FinanceDesignSystem.backgroundColor, + body: GetBuilder(builder: (rc) { + if (rc.isLoading) { + return Center( + child: CircularProgressIndicator( + color: FinanceDesignSystem.primaryDark)); + } + return CustomScrollView(physics: const BouncingScrollPhysics(), slivers: [ + // ═══ Header ═══ + SliverAppBar( + expandedHeight: 220, pinned: true, + backgroundColor: const Color(0xFF0A0E21), + leading: IconButton(icon: const Icon(Icons.arrow_back_ios_new_rounded, color: Colors.white, size: 20), onPressed: () => Get.back()), + flexibleSpace: FlexibleSpaceBar( + centerTitle: true, + title: Text('Referral Center'.tr, style: const TextStyle(color: Colors.white, fontWeight: FontWeight.bold, fontSize: 18)), + background: Stack(fit: StackFit.expand, children: [ + Container(decoration: const BoxDecoration(gradient: LinearGradient(colors: [Color(0xFF0A0E21), Color(0xFF311B92)]))), + Positioned(right: -50, bottom: -30, child: Icon(Icons.share_rounded, size: 200, color: Colors.white.withValues(alpha: 0.03))), + // Stats in header + Positioned(bottom: 60, left: 24, right: 24, child: Row(children: [ + _headerStat('${rc.totalReferrals}', 'Total Invites'.tr), + _headerStat('${rc.activeReferrals}', 'Active'.tr), + _headerStat('${rc.totalRewardsEarned.toStringAsFixed(0)}', 'Rewards'.tr), + ])), + ]), + ), + ), + SliverPadding(padding: const EdgeInsets.fromLTRB(16, 24, 16, 40), sliver: SliverList(delegate: SliverChildListDelegate([ + // ═══ Referral Code Card ═══ + _buildCodeCard(rc), + const SizedBox(height: 20), + // ═══ Share Buttons ═══ + _buildShareSection(rc), + const SizedBox(height: 24), + // ═══ How it Works ═══ + _buildHowItWorks(), + const SizedBox(height: 24), + // ═══ Driver Referrals ═══ + if (rc.driverReferrals.isNotEmpty) ...[ + Text('Driver Invitations'.tr, style: FinanceDesignSystem.headingStyle), + const SizedBox(height: 12), + ...rc.driverReferrals.map((r) => _referralItem(r, const Color(0xFF2196F3))), + const SizedBox(height: 20), + ], + // ═══ Passenger Referrals ═══ + if (rc.passengerReferrals.isNotEmpty) ...[ + Text('Passenger Invitations'.tr, style: FinanceDesignSystem.headingStyle), + const SizedBox(height: 12), + ...rc.passengerReferrals.map((r) => _referralItem(r, const Color(0xFF4CAF50))), + ], + if (rc.driverReferrals.isEmpty && rc.passengerReferrals.isEmpty) + _buildEmptyState(), + ]))), + ]); + }), + ); + } + + Widget _headerStat(String value, String label) { + return Expanded(child: Column(children: [ + Text(value, style: const TextStyle(fontSize: 22, fontWeight: FontWeight.w900, color: Colors.white)), + Text(label, style: TextStyle(fontSize: 10, color: Colors.white.withValues(alpha: 0.6))), + ])); + } + + Widget _buildCodeCard(ReferralController rc) { + return Container( + padding: const EdgeInsets.all(24), + decoration: BoxDecoration( + gradient: const LinearGradient(colors: [Color(0xFF1A237E), Color(0xFF311B92)]), + borderRadius: BorderRadius.circular(FinanceDesignSystem.cardRadius), + boxShadow: [BoxShadow(color: const Color(0xFF311B92).withValues(alpha: 0.3), blurRadius: 15, offset: const Offset(0, 8))], + ), + child: Column(children: [ + Text('Your Referral Code'.tr, style: TextStyle(color: Colors.white.withValues(alpha: 0.7), fontSize: 14)), + const SizedBox(height: 12), + Container( + padding: const EdgeInsets.symmetric(horizontal: 24, vertical: 12), + decoration: BoxDecoration(color: Colors.white.withValues(alpha: 0.15), borderRadius: BorderRadius.circular(12), border: Border.all(color: Colors.white.withValues(alpha: 0.2))), + child: Row(mainAxisSize: MainAxisSize.min, children: [ + Text(rc.referralCode, style: const TextStyle(fontSize: 24, fontWeight: FontWeight.w900, color: Colors.white, letterSpacing: 3)), + const SizedBox(width: 12), + GestureDetector( + onTap: () { rc.copyCode(); mySnackbarSuccess('Code copied!'.tr); }, + child: Container( + padding: const EdgeInsets.all(6), + decoration: BoxDecoration(color: Colors.white.withValues(alpha: 0.2), borderRadius: BorderRadius.circular(8)), + child: const Icon(Icons.copy_rounded, color: Colors.white, size: 18), + ), + ), + ]), + ), + const SizedBox(height: 12), + Text('Share this code to earn rewards'.tr, style: TextStyle(color: Colors.white.withValues(alpha: 0.5), fontSize: 12)), + ]), + ); + } + + Widget _buildShareSection(ReferralController rc) { + return Column(crossAxisAlignment: CrossAxisAlignment.start, children: [ + Text('Share via'.tr, style: FinanceDesignSystem.headingStyle), + const SizedBox(height: 12), + Row(children: [ + _shareButton(Icons.share_rounded, 'Share'.tr, FinanceDesignSystem.accentBlue, () => Share.share(rc.shareMessage)), + const SizedBox(width: 12), + _shareButton(Icons.chat_rounded, 'WhatsApp'.tr, const Color(0xFF25D366), () => _shareWhatsApp(rc.shareMessage)), + const SizedBox(width: 12), + _shareButton(Icons.person_add_rounded, 'Invite Driver'.tr, const Color(0xFFFF9800), () => _showInviteDialog(rc, 'driver')), + const SizedBox(width: 12), + _shareButton(Icons.hail_rounded, 'Invite Rider'.tr, const Color(0xFF9C27B0), () => _showInviteDialog(rc, 'passenger')), + ]), + ]); + } + + Widget _shareButton(IconData icon, String label, Color color, VoidCallback onTap) { + return Expanded(child: GestureDetector( + onTap: onTap, + child: Container( + padding: const EdgeInsets.symmetric(vertical: 14), + decoration: BoxDecoration(color: color.withValues(alpha: 0.1), borderRadius: BorderRadius.circular(14)), + child: Column(children: [ + Icon(icon, color: color, size: 24), + const SizedBox(height: 6), + Text(label, style: TextStyle(fontSize: 9, fontWeight: FontWeight.w600, color: color), textAlign: TextAlign.center, maxLines: 1, overflow: TextOverflow.ellipsis), + ]), + ), + )); + } + + Widget _buildHowItWorks() { + return Container( + padding: const EdgeInsets.all(20), + decoration: BoxDecoration(color: Colors.white, borderRadius: BorderRadius.circular(FinanceDesignSystem.cardRadius), + boxShadow: [BoxShadow(color: Colors.black.withValues(alpha: 0.03), blurRadius: 10, offset: const Offset(0, 4))]), + child: Column(crossAxisAlignment: CrossAxisAlignment.start, children: [ + Text('How It Works'.tr, style: TextStyle(fontSize: 16, fontWeight: FontWeight.bold, color: FinanceDesignSystem.primaryDark)), + const SizedBox(height: 16), + _step('1', 'Share your code'.tr, 'Send your referral code to friends'.tr, const Color(0xFF2196F3)), + _step('2', 'Friend signs up'.tr, 'They register using your code'.tr, const Color(0xFFFF9800)), + _step('3', 'Both earn rewards'.tr, 'You get 100 pts, they get 50 pts'.tr, const Color(0xFF4CAF50)), + _step('4', 'Bonus at 10 trips'.tr, 'Extra 200 pts when they complete 10 trips'.tr, const Color(0xFF9C27B0)), + ]), + ); + } + + Widget _step(String num, String title, String desc, Color color) { + return Padding(padding: const EdgeInsets.only(bottom: 12), child: Row(children: [ + Container(width: 32, height: 32, decoration: BoxDecoration(color: color.withValues(alpha: 0.15), borderRadius: BorderRadius.circular(8)), + child: Center(child: Text(num, style: TextStyle(fontSize: 14, fontWeight: FontWeight.bold, color: color))), + ), + const SizedBox(width: 12), + Expanded(child: Column(crossAxisAlignment: CrossAxisAlignment.start, children: [ + Text(title, style: TextStyle(fontSize: 13, fontWeight: FontWeight.w600, color: FinanceDesignSystem.primaryDark)), + Text(desc, style: TextStyle(fontSize: 11, color: Colors.grey.shade500)), + ])), + ])); + } + + Widget _referralItem(ReferralRecord r, Color color) { + return Container( + margin: const EdgeInsets.only(bottom: 10), + padding: const EdgeInsets.all(14), + decoration: BoxDecoration(color: Colors.white, borderRadius: BorderRadius.circular(14), + boxShadow: [BoxShadow(color: Colors.black.withValues(alpha: 0.02), blurRadius: 8, offset: const Offset(0, 3))]), + child: Row(children: [ + Container(width: 40, height: 40, decoration: BoxDecoration(color: color.withValues(alpha: 0.1), borderRadius: BorderRadius.circular(10)), + child: Icon(r.type == 'driver' ? Icons.local_taxi_rounded : Icons.person_rounded, color: color, size: 20)), + const SizedBox(width: 12), + Expanded(child: Column(crossAxisAlignment: CrossAxisAlignment.start, children: [ + Text(r.name.isNotEmpty ? r.name : r.phone, style: const TextStyle(fontSize: 13, fontWeight: FontWeight.w600)), + Text(r.joinDate, style: TextStyle(fontSize: 10, color: Colors.grey.shade500)), + ])), + Container( + padding: const EdgeInsets.symmetric(horizontal: 8, vertical: 4), + decoration: BoxDecoration( + color: r.status == 'active' ? FinanceDesignSystem.successGreen.withValues(alpha: 0.1) + : r.status == 'registered' ? FinanceDesignSystem.accentBlue.withValues(alpha: 0.1) : Colors.grey.shade100, + borderRadius: BorderRadius.circular(8)), + child: Text(r.status.tr, style: TextStyle(fontSize: 10, fontWeight: FontWeight.w600, + color: r.status == 'active' ? FinanceDesignSystem.successGreen + : r.status == 'registered' ? FinanceDesignSystem.accentBlue : Colors.grey)), + ), + ]), + ); + } + + Widget _buildEmptyState() { + return Center(child: Padding(padding: const EdgeInsets.symmetric(vertical: 40), child: Column(children: [ + Icon(Icons.people_outline_rounded, size: 60, color: Colors.grey.shade300), + const SizedBox(height: 12), + Text('No invitation found yet!'.tr, style: TextStyle(fontSize: 14, color: Colors.grey.shade400)), + const SizedBox(height: 4), + Text('Start sharing your code!'.tr, style: TextStyle(fontSize: 12, color: Colors.grey.shade300)), + ]))); + } + + void _shareWhatsApp(String message) async { + final url = 'https://wa.me/?text=${Uri.encodeComponent(message)}'; + if (await canLaunchUrl(Uri.parse(url))) { + await launchUrl(Uri.parse(url), mode: LaunchMode.externalApplication); + } + } + + void _showInviteDialog(ReferralController rc, String type) { + final phoneController = TextEditingController(); + Get.defaultDialog( + title: type == 'driver' ? 'Invite Driver'.tr : 'Invite Rider'.tr, + titleStyle: FinanceDesignSystem.headingStyle, + content: Column(children: [ + Text('Enter phone number'.tr, style: FinanceDesignSystem.subHeadingStyle), + const SizedBox(height: 12), + TextField( + controller: phoneController, keyboardType: TextInputType.phone, + decoration: InputDecoration(hintText: '09XX XXX XXX', prefixIcon: const Icon(Icons.phone_rounded), + border: OutlineInputBorder(borderRadius: BorderRadius.circular(12))), + ), + ]), + confirm: ElevatedButton( + onPressed: () async { + if (phoneController.text.length >= 10) { + Get.back(); + bool success = type == 'driver' + ? await rc.inviteDriver(phoneController.text) + : await rc.invitePassenger(phoneController.text); + if (success) mySnackbarSuccess('Invite sent successfully'.tr); + } + }, + style: ElevatedButton.styleFrom(backgroundColor: FinanceDesignSystem.accentBlue, foregroundColor: Colors.white, + shape: RoundedRectangleBorder(borderRadius: BorderRadius.circular(12)), padding: const EdgeInsets.symmetric(horizontal: 32, vertical: 12)), + child: Text('Send Invite'.tr), + ), + cancel: TextButton(onPressed: () => Get.back(), child: Text('Cancel'.tr, style: const TextStyle(color: Colors.grey))), + ); + } +} diff --git a/siro_driver/lib/views/home/Captin/About Us/about_us.dart b/siro_driver/lib/views/home/Captin/About Us/about_us.dart new file mode 100755 index 0000000..c1cde26 --- /dev/null +++ b/siro_driver/lib/views/home/Captin/About Us/about_us.dart @@ -0,0 +1,101 @@ +import 'package:siro_driver/constant/box_name.dart'; +import 'package:siro_driver/constant/style.dart'; +import 'package:siro_driver/main.dart'; +import 'package:siro_driver/views/widgets/my_scafold.dart'; +import 'package:flutter/material.dart'; +import 'package:get/get.dart'; + +class AboutPage extends StatelessWidget { + const AboutPage({super.key}); + + @override + Widget build(BuildContext context) { + return MyScafolld( + title: 'About Us'.tr, + body: [ + // Company Logo (consider adding an image asset) + ListView( + children: [ + Center( + child: Image.asset( + 'assets/images/logo.png', // Replace with your logo image asset path + height: 100.0, + width: 100.0, + ), + ), // Company Name and Location + Padding( + padding: const EdgeInsets.all(16.0), + child: Text( + 'Intaleq LLC\n${'Syria'.tr}', + style: AppStyle.headTitle2, + textAlign: TextAlign.center, + ), + ), + Padding( + padding: const EdgeInsets.symmetric(horizontal: 16.0), + child: Text( + 'Intaleq is a ride-sharing app designed with your safety and affordability in mind. We connect you with reliable drivers in your area, ensuring a convenient and stress-free travel experience.\n\nHere are some of the key features that set us apart:' + .tr, + style: AppStyle.title, + textAlign: TextAlign.center, + ), + ), // Security Features List + const SizedBox( + height: 20, + ), + Padding( + padding: const EdgeInsets.symmetric(horizontal: 24.0), + child: Column( + children: [ + Row( + children: [ + const Icon(Icons.lock, color: Colors.blue), + const SizedBox(width: 8.0), + Text( + 'Most Secure Methods'.tr, + style: AppStyle.title, + ), + ], + ), + const SizedBox(height: 8.0), + Row( + children: [ + const Icon(Icons.phone, color: Colors.blue), + const SizedBox(width: 8.0), + Text( + 'In-App VOIP Calls'.tr, + style: AppStyle.title, + ), + ], + ), + const SizedBox(height: 8.0), + Row( + children: [ + const Icon(Icons.videocam, color: Colors.blue), + const SizedBox(width: 8.0), + Text( + 'Recorded Trips for Safety'.tr, + style: AppStyle.title, + ), + ], + ), + ], + ), + ), // Affordability Highlight + Padding( + padding: const EdgeInsets.symmetric(horizontal: 16.0), + child: Text( + '\nWe also prioritize affordability, offering competitive pricing to make your rides accessible.' + .tr, + style: AppStyle.title, + textAlign: TextAlign.center, + ), + ), + ], + ), + + // About Us Text + ], + isleading: true); + } +} diff --git a/siro_driver/lib/views/home/Captin/About Us/frequantly_question.dart b/siro_driver/lib/views/home/Captin/About Us/frequantly_question.dart new file mode 100755 index 0000000..f902cc1 --- /dev/null +++ b/siro_driver/lib/views/home/Captin/About Us/frequantly_question.dart @@ -0,0 +1,145 @@ +import 'package:siro_driver/views/widgets/my_scafold.dart'; +import 'package:siro_driver/views/widgets/mydialoug.dart'; +import 'package:flutter/cupertino.dart'; +import 'package:flutter/material.dart'; +import 'package:get/get.dart'; + +import '../../../../constant/style.dart'; + +class FrequentlyQuestionsPage extends StatelessWidget { + const FrequentlyQuestionsPage({super.key}); + + @override + Widget build(BuildContext context) { + String selectedPayment = 'cash'; // Replace with your initial selection + bool canCancelRide = false; + return MyScafolld( + title: 'Frequently Questions'.tr, + body: [ + Padding( + padding: const EdgeInsets.all(8.0), + child: ListView( + children: [ + // Question 1: How do I request a ride? + ExpansionTile( + title: Text( + 'How do I request a ride?'.tr, + style: AppStyle.title, + ), + children: [ + Text( + 'Step-by-step instructions on how to request a ride through the Intaleq app.' + .tr, + style: AppStyle.title, + ), + ], + ), + + // Question 2: What types of vehicles are available? + ExpansionTile( + title: Text( + 'What types of vehicles are available?'.tr, + style: AppStyle.title, + ), + children: [ + Text( + 'Intaleq offers a variety of vehicle options to suit your needs, including economy, comfort, and luxury. Choose the option that best fits your budget and passenger count.' + .tr, + style: AppStyle.title, + ), + ], + ), + + // Question 3: How can I pay for my ride? + ExpansionTile( + title: Text( + 'How can I pay for my ride?'.tr, + style: AppStyle.title, + ), + children: [ + Text( + 'Intaleq offers multiple payment methods for your convenience. Choose between cash payment or credit/debit card payment during ride confirmation.' + .tr, + style: AppStyle.title, + ), + ], + ), + + // Question 4: Can I cancel my ride? (if applicable) + ExpansionTile( + title: Text( + 'Can I cancel my ride?'.tr, + style: AppStyle.title, + ), + children: [ + Text( + 'Yes, you can cancel your ride under certain conditions (e.g., before driver is assigned). See the Intaleq cancellation policy for details.' + .tr, + style: AppStyle.title, + ), + ], + ), + + // Question 5 & 6: Driver-specific questions + ExpansionTile( + title: Text( + 'Driver Registration & Requirements'.tr, + style: AppStyle.title, + ), + children: [ + Text( + '${'How can I register as a driver?'.tr}\n${'What are the requirements to become a driver?'.tr}', + style: AppStyle.title, + ), + InkWell( + onTap: () { + MyDialog().getDialog('title', 'midTitle', () { + ; //todo add in this dialog papers for driver + }); + }, + child: Text( + 'Visit our website or contact Intaleq support for information on driver registration and requirements.' + .tr, + style: AppStyle.title, + ), + ), + ], + ), + + // Question 7: How do I communicate with the other party? + ExpansionTile( + title: Text( + 'How do I communicate with the other party (passenger/driver)?' + .tr, + style: AppStyle.title, + ), + children: [ + Text( + 'Intaleq provides in-app chat functionality to allow you to communicate with your driver or passenger during your ride.' + .tr, + style: AppStyle.title, + ), + ], + ), + + // Question 8: What safety measures does Intaleq offer? + ExpansionTile( + title: Text( + 'What safety measures does Intaleq offer?'.tr, + style: AppStyle.title, + ), + children: [ + Text( + 'Intaleq prioritizes your safety. We offer features like driver verification, in-app trip tracking, and emergency contact options.' + .tr, + style: AppStyle.title, + ), + ], + ), + ], + ), + ) + ], + isleading: true); + } +} diff --git a/siro_driver/lib/views/home/Captin/About Us/settings_captain.dart b/siro_driver/lib/views/home/Captin/About Us/settings_captain.dart new file mode 100755 index 0000000..8faacff --- /dev/null +++ b/siro_driver/lib/views/home/Captin/About Us/settings_captain.dart @@ -0,0 +1,222 @@ +import 'package:flutter/material.dart'; +import 'package:get/get.dart'; +import 'package:siro_driver/constant/colors.dart'; +import 'package:siro_driver/controller/profile/setting_controller.dart'; +import 'package:siro_driver/views/lang/languages.dart'; +import 'package:siro_driver/views/widgets/my_scafold.dart'; +import 'package:siro_driver/views/widgets/mydialoug.dart'; + +// تأكد من صحة مسارات الاستيراد هذه +import '../../../../controller/functions/vibrate.dart'; // Controller with isVibrate +import '../../../auth/country_widget.dart'; +import 'about_us.dart'; +import 'frequantly_question.dart'; +import 'using_app_page.dart'; + +class SettingsCaptain extends StatelessWidget { + const SettingsCaptain({super.key}); + + @override + Widget build(BuildContext context) { + // تحميل الـ Controllers المطلوبة + final settingsController = Get.put(SettingController()); + final homeController = Get.put(HomePageController()); + + return MyScafolld( + title: 'Settings'.tr, + isleading: true, + body: [ + ListView( + padding: const EdgeInsets.symmetric(horizontal: 16.0, vertical: 20.0), + children: [ + // --- القسم الأول: عام --- + _buildSectionHeader('General'.tr, context), + _buildSettingsCard( + children: [ + _buildListTile( + icon: Icons.language_outlined, + title: 'Language'.tr, + subtitle: 'Change the app language'.tr, + onTap: () => Get.to(() => const Language()), + ), + // _buildListTile( + // icon: Icons.flag_outlined, + // title: 'Change Country'.tr, + // subtitle: 'Get features for your country'.tr, + // onTap: () => Get.to( + // () => MyScafolld( + // title: 'Change Country'.tr, + // body: [CountryPickerFromSetting()], + // isleading: true, + // ), + // ), + // ), + ], + ), + const SizedBox(height: 20), + + // --- القسم الثاني: تفضيلات التطبيق --- + _buildSectionHeader('App Preferences'.tr, context), + _buildSettingsCard( + children: [ + _buildSwitchTile( + icon: Icons.dark_mode_outlined, + title: 'App Dark Mode'.tr, + subtitle: 'Switch between light and dark themes'.tr, + controller: settingsController, + valueGetter: (ctrl) => (ctrl).isDarkMode, + onChanged: (ctrl) => (ctrl).toggleAppTheme(), + ), + _buildSwitchTile( + icon: Icons.map_outlined, + color: AppColor.redColor, + title: 'Google Map App'.tr, + subtitle: 'Run Google Maps directly'.tr, + controller: settingsController, + valueGetter: (ctrl) => (ctrl).isGoogleMapsEnabled, + onChanged: (ctrl) => (ctrl).onChangMapApp(), + ), + _buildSwitchTile( + icon: Icons.map_outlined, + title: 'Map Dark Mode'.tr, + subtitle: 'Switch between light and dark map styles'.tr, + controller: settingsController, + valueGetter: (ctrl) => (ctrl).isMapDarkMode, + onChanged: (ctrl) => (ctrl).toggleMapTheme(), + ), + + _buildSwitchTile( + icon: Icons.vibration, + title: 'Vibration'.tr, + subtitle: 'Vibration feedback for buttons'.tr, + controller: homeController, + valueGetter: (ctrl) => (ctrl).isVibrate, + onChanged: (ctrl) => (ctrl) + .changeVibrateOption(true), // قد تحتاج لتعديل الدالة + ), + ], + ), + const SizedBox(height: 20), + + // --- القسم الثالث: المساعدة والدعم --- + _buildSectionHeader('Help & Support'.tr, context), + _buildSettingsCard( + children: [ + _buildListTile( + icon: Icons.quiz_outlined, + title: 'Frequently Questions'.tr, + onTap: () => Get.to(() => const FrequentlyQuestionsPage()), + ), + _buildListTile( + icon: Icons.support_agent, + title: "How to use App".tr, + onTap: () => Get.to(() => const UsingAppPage()), + ), + _buildListTile( + icon: Icons.info_outline, + title: 'About Us'.tr, + onTap: () => Get.to(() => const AboutPage()), + ), + ], + ), + const SizedBox(height: 20), + + // --- القسم الرابع: تسجيل الخروج --- + _buildSectionHeader('Account'.tr, context), + _buildSettingsCard( + children: [ + ListTile( + leading: const Icon(Icons.logout, color: Colors.red), + title: Text( + 'Logout'.tr, + style: const TextStyle( + color: Colors.red, fontWeight: FontWeight.w500), + ), + onTap: () { + MyDialog().getDialog( + 'Logout'.tr, + 'Are you sure you want to logout?'.tr, + () { + // أضف دالة تسجيل الخروج هنا + Get.back(); // لإغلاق مربع الحوار + }, + // isConfirmation: true, + ); + }, + ) + ], + ) + ], + ), + ], + ); + } + + // ويدجت لبناء عنوان كل قسم + Widget _buildSectionHeader(String title, BuildContext context) { + return Padding( + padding: const EdgeInsets.only(left: 8.0, bottom: 12.0), + child: Text( + title, + style: Theme.of(context).textTheme.titleSmall?.copyWith( + color: Colors.grey.shade600, + fontWeight: FontWeight.bold, + ), + ), + ); + } + + // ويدجت لبناء بطاقة الإعدادات + Widget _buildSettingsCard({required List children}) { + return Card( + elevation: 2, + shadowColor: Colors.black.withOpacity(0.1), + shape: RoundedRectangleBorder(borderRadius: BorderRadius.circular(16)), + clipBehavior: Clip.antiAlias, // مهم لجعل splash effect داخل حدود البطاقة + child: Column(children: children), + ); + } + + // ويدجت لبناء عنصر قابل للضغط (مثل اللغة، عن التطبيق) + Widget _buildListTile({ + required IconData icon, + required String title, + String? subtitle, + required VoidCallback onTap, + }) { + return ListTile( + leading: Icon(icon, color: Colors.grey.shade700), + title: Text(title, style: const TextStyle(fontWeight: FontWeight.w500)), + subtitle: subtitle != null ? Text(subtitle) : null, + trailing: + const Icon(Icons.arrow_forward_ios, size: 16, color: Colors.grey), + onTap: onTap, + ); + } + + // ويدجت لبناء عنصر يحتوي على مفتاح تفعيل/إلغاء (Switch) + Widget _buildSwitchTile({ + required IconData icon, + Color? color, + required String title, + required String subtitle, + required T controller, + required bool Function(T) valueGetter, + required Function(T) onChanged, + }) { + return GetBuilder( + init: controller, + builder: (ctrl) { + return SwitchListTile( + secondary: Icon(icon, color: color ?? Colors.grey.shade700), + title: + Text(title, style: const TextStyle(fontWeight: FontWeight.w500)), + subtitle: Text(subtitle), + value: valueGetter(ctrl), + onChanged: (value) => onChanged(ctrl), + activeColor: AppColor.primaryColor, + ); + }, + ); + } +} diff --git a/siro_driver/lib/views/home/Captin/About Us/using_app_page.dart b/siro_driver/lib/views/home/Captin/About Us/using_app_page.dart new file mode 100755 index 0000000..e0d1fef --- /dev/null +++ b/siro_driver/lib/views/home/Captin/About Us/using_app_page.dart @@ -0,0 +1,112 @@ +import 'package:flutter/material.dart'; +import 'package:get/get.dart'; +import 'package:siro_driver/views/widgets/my_scafold.dart'; + +// 1. إنشاء Class لتمثيل بيانات كل سؤال وجواب +class FaqItem { + final String question; + final Widget answer; // استخدام Widget يسمح بوضع نصوص أو صور + final IconData icon; + + FaqItem({required this.question, required this.answer, required this.icon}); +} + +class UsingAppPage extends StatelessWidget { + const UsingAppPage({super.key}); + + @override + Widget build(BuildContext context) { + // 2. تجهيز قائمة البيانات بشكل منظم + final List faqItems = [ + FaqItem( + question: "What are the order details we provide to you?".tr, + icon: Icons.receipt_long_outlined, + answer: Padding( + padding: const EdgeInsets.all(8.0), + child: Image.network( + 'https://api.tripz-egypt.com/tripz/imageForUsingApp/order_page.jpg', + fit: BoxFit.cover, + // يمكنك إضافة مؤشر تحميل هنا + loadingBuilder: (context, child, loadingProgress) { + if (loadingProgress == null) return child; + return const Center(child: CircularProgressIndicator()); + }, + errorBuilder: (context, error, stackTrace) { + return const Center( + child: + Icon(Icons.error_outline, color: Colors.red, size: 40)); + }, + ), + ), + ), + FaqItem( + question: "What is the feature of our wallet?".tr, + icon: Icons.account_balance_wallet_outlined, + answer: Text( + '''Intaleq Wallet Features: + +- Transfer money multiple times. +- Transfer to anyone. +- Make purchases. +- Charge your account. +- Charge a friend's Intaleq account. +- Store your money with us and receive it in your bank as a monthly salary.''' + .tr, + style: + TextStyle(fontSize: 15, height: 1.5, color: Colors.grey.shade700), + ), + ), + FaqItem( + question: "What is Types of Trips in Intaleq?".tr, + icon: Icons.map_outlined, + answer: Text( + '''Types of Trips in Intaleq: + +- Comfort: For cars newer than 2017 with air conditioning. +- Lady: For girl drivers. +- Speed: For fixed salary and endpoints. +- Mashwari: For flexible trips where passengers choose the car and driver with prior arrangements. +- Raih Gai: For same-day return trips longer than 50km.''' + .tr, + style: + TextStyle(fontSize: 15, height: 1.5, color: Colors.grey.shade700), + ), + ), + ]; + + // 3. بناء الواجهة الرسومية باستخدام البيانات + return MyScafolld( + title: "How to use App".tr, // تم تغيير العنوان ليكون أعم + isleading: true, + body: [ + ListView.separated( + padding: const EdgeInsets.symmetric(horizontal: 16.0, vertical: 20.0), + itemCount: faqItems.length, + separatorBuilder: (context, index) => const SizedBox(height: 12), + itemBuilder: (context, index) { + final item = faqItems[index]; + return Card( + elevation: 2, + shadowColor: Colors.black.withOpacity(0.1), + shape: RoundedRectangleBorder( + borderRadius: BorderRadius.circular(16)), + clipBehavior: Clip.antiAlias, + child: ExpansionTile( + leading: Icon(item.icon, color: Theme.of(context).primaryColor), + title: Text(item.question, + style: const TextStyle(fontWeight: FontWeight.w600)), + childrenPadding: const EdgeInsets.fromLTRB(16, 0, 16, 16), + expandedCrossAxisAlignment: CrossAxisAlignment.start, + children: [ + const Divider(height: 1), + const SizedBox(height: 12), + item.answer, + ], + ), + ); + }, + ), + ], + ); + } +} diff --git a/siro_driver/lib/views/home/Captin/About Us/video_page.dart b/siro_driver/lib/views/home/Captin/About Us/video_page.dart new file mode 100755 index 0000000..d533b4f --- /dev/null +++ b/siro_driver/lib/views/home/Captin/About Us/video_page.dart @@ -0,0 +1,193 @@ +import 'package:siro_driver/constant/info.dart'; +import 'package:flutter/material.dart'; +import 'package:get/get.dart'; +import 'package:video_player/video_player.dart'; +import 'package:youtube_player_flutter/youtube_player_flutter.dart'; + +import '../../../../controller/home/captin/help/video_controller.dart'; + +import 'package:flutter/cupertino.dart'; + +class VideoListPage extends StatelessWidget { + final VideoController videoController = Get.put(VideoController()); + + @override + Widget build(BuildContext context) { + return CupertinoPageScaffold( + navigationBar: CupertinoNavigationBar( + middle: Text('Videos Tutorials'.tr), + ), + child: SafeArea( + child: Padding( + padding: const EdgeInsets.symmetric( + horizontal: 16.0, + vertical: 10.0), // Outer padding around the list + child: GetBuilder( + builder: (videoController) { + return ListView.builder( + itemCount: videoController.videos.length, + itemBuilder: (context, index) { + final video = videoController.videos[index]; + return Container( + margin: const EdgeInsets.symmetric( + vertical: 8.0), // Spacing between each card + decoration: BoxDecoration( + color: CupertinoColors.white, + borderRadius: + BorderRadius.circular(12.0), // Rounded corners + boxShadow: [ + BoxShadow( + color: CupertinoColors.systemGrey.withOpacity(0.3), + offset: const Offset( + 0, 4), // Offset for shadow to appear below + blurRadius: 10.0, // Blur for softer shadow effect + ), + ], + border: Border.all( + color: CupertinoColors.systemGrey4, + width: 0.5, // Subtle border for a refined iOS-like look + ), + ), + child: CupertinoListTile( + title: Padding( + padding: const EdgeInsets.only(bottom: 4.0), + child: Text( + video['title'], + style: const TextStyle( + color: CupertinoColors.black, + fontWeight: FontWeight.bold, + ), + ), + ), + subtitle: Text( + video['description'], + style: const TextStyle( + color: CupertinoColors.systemGrey, + ), + ), + onTap: () { + // Navigate to video player page (iOS-style) + Get.to(() => VideoPlayerPage1(videoUrl: video['url'])); + }, + ), + ); + }, + ); + }, + ), + ), + ), + ); + } +} + +class VideoPlayerPage extends StatelessWidget { + final String videoUrl; + + VideoPlayerPage({required this.videoUrl}); + + final VideoController videoController = Get.put(VideoController()); + + @override + Widget build(BuildContext context) { + // Initialize the video when the page is loaded + videoController.initializeVideo(videoUrl); + + return CupertinoPageScaffold( + navigationBar: const CupertinoNavigationBar( + middle: Text(AppInformation.appName), + ), + child: SafeArea( + child: Center( + child: GetBuilder( + builder: (controller) { + if (!controller.videoPlayerController.value.isInitialized) { + return const CircularProgressIndicator(); // Show loading indicator while initializing + } + + return Column( + mainAxisAlignment: MainAxisAlignment.center, + children: [ + // Video player widget + AspectRatio( + aspectRatio: + controller.videoPlayerController.value.aspectRatio, + // child: VideoPlayer(controller.videoPlayerController), + child: VideoPlayer(controller.videoPlayerController), + ), + const SizedBox(height: 20), + + // Play/pause button + CupertinoButton( + onPressed: () { + if (controller.videoPlayerController.value.isPlaying) { + controller.pause(); + } else { + controller.play(); + } + }, + child: Icon( + controller.videoPlayerController.value.isPlaying + ? CupertinoIcons.pause + : CupertinoIcons.play_arrow, + color: CupertinoColors.activeBlue, + size: 30, + ), + ), + ], + ); + }, + ), + ), + ), + ); + } +} + +class VideoPlayerPage1 extends StatelessWidget { + final String videoUrl; + + const VideoPlayerPage1({required this.videoUrl}); + + @override + Widget build(BuildContext context) { + // Extract the video ID from the URL + String videoId = YoutubePlayer.convertUrlToId(videoUrl)!; + + // Create a YoutubePlayerController + final YoutubePlayerController _controller = YoutubePlayerController( + initialVideoId: videoId, + flags: const YoutubePlayerFlags( + autoPlay: true, + loop: true, + mute: false, + captionLanguage: 'ar', + ), + ); + + return Scaffold( + body: Stack( + children: [ + // Full-screen YouTube player + Positioned.fill( + child: YoutubePlayer( + controller: _controller, + showVideoProgressIndicator: true, + ), + ), + // Overlay back button in the top left corner for exit + Positioned( + top: 40.0, + left: 16.0, + child: IconButton( + icon: const Icon(Icons.arrow_back, color: Colors.white), + onPressed: () { + Navigator.pop(context); + }, + ), + ), + ], + ), + ); + } +} diff --git a/siro_driver/lib/views/home/Captin/assurance_health_page.dart b/siro_driver/lib/views/home/Captin/assurance_health_page.dart new file mode 100755 index 0000000..201d2d3 --- /dev/null +++ b/siro_driver/lib/views/home/Captin/assurance_health_page.dart @@ -0,0 +1,191 @@ +import 'package:flutter/material.dart'; +import 'package:get/get.dart'; + +import '../../../constant/colors.dart'; +import '../../../controller/home/captin/help/assurance_controller.dart'; + +import 'package:flutter/cupertino.dart'; + +import '../../widgets/my_scafold.dart'; + +class AssuranceHealthPage extends StatelessWidget { + AssuranceHealthPage({super.key}); + final AssuranceHealthController assuranceHealthController = + Get.put(AssuranceHealthController()); + + @override + Widget build(BuildContext context) { + final theme = Theme.of(context); + return MyScafolld( + title: "Health Insurance".tr, + isleading: true, + body: [ + GetBuilder( + builder: (controller) { + return SingleChildScrollView( + padding: const EdgeInsets.all(20.0), + child: Column( + crossAxisAlignment: CrossAxisAlignment.stretch, + children: [ + Text( + "When you complete 500 trips, you will be eligible for exclusive health insurance offers." + .tr, + textAlign: TextAlign.center, + style: theme.textTheme.titleMedium?.copyWith( + color: + theme.textTheme.bodyMedium?.color?.withOpacity(0.8), + height: 1.5, + ), + ), + const SizedBox(height: 24), + Card( + elevation: 4, + shape: RoundedRectangleBorder( + borderRadius: BorderRadius.circular(16)), + child: Padding( + padding: const EdgeInsets.all(16.0), + child: Row( + children: [ + Expanded( + child: ElevatedButton( + onPressed: () => + controller.getTripCountByCaptain(), + style: ElevatedButton.styleFrom( + backgroundColor: AppColor.primaryColor, + foregroundColor: Colors.white, + shape: RoundedRectangleBorder( + borderRadius: BorderRadius.circular(12)), + padding: + const EdgeInsets.symmetric(vertical: 12), + ), + child: Text("Show My Trip Count".tr), + ), + ), + const SizedBox(width: 16), + _buildTripCountAvatar( + controller.tripCount['count'] == null + ? '0' + : controller.tripCount['count'].toString(), + ), + ], + ), + ), + ), + const SizedBox(height: 24), + Container( + padding: const EdgeInsets.all(18), + decoration: BoxDecoration( + color: theme.colorScheme.surfaceVariant.withOpacity(0.5), + borderRadius: BorderRadius.circular(12), + border: Border.all(color: theme.dividerColor), + ), + child: Text( + "We have partnered with health insurance providers to offer you special health coverage. Complete 500 trips and receive a 20% discount on health insurance premiums." + .tr, + style: theme.textTheme.bodyLarge + ?.copyWith(fontWeight: FontWeight.w500), + textAlign: TextAlign.center, + ), + ), + const SizedBox(height: 32), + ElevatedButton( + onPressed: () => _showInsuranceDialog(context, controller), + style: ElevatedButton.styleFrom( + backgroundColor: AppColor.primaryColor, + foregroundColor: Colors.white, + padding: const EdgeInsets.symmetric(vertical: 16), + shape: RoundedRectangleBorder( + borderRadius: BorderRadius.circular(12)), + ), + child: Text( + "Would you like to proceed with health insurance?".tr, + style: const TextStyle(fontWeight: FontWeight.bold), + textAlign: TextAlign.center, + ), + ), + ], + ), + ); + }, + ), + ], + ); + } + + void _showInsuranceDialog( + BuildContext context, AssuranceHealthController controller) { + final TextEditingController providerController = TextEditingController(); + Get.dialog( + AlertDialog( + title: Text("Confirmation".tr), + content: Column( + mainAxisSize: MainAxisSize.min, + children: [ + Text("Would you like to proceed with health insurance?".tr), + const SizedBox(height: 16), + TextField( + controller: providerController, + decoration: InputDecoration( + hintText: "Do you have a disease for a long time?".tr, + border: + OutlineInputBorder(borderRadius: BorderRadius.circular(12)), + ), + ), + ], + ), + actions: [ + TextButton( + onPressed: () => Get.back(), + child: Text("No".tr, style: const TextStyle(color: Colors.red)), + ), + ElevatedButton( + onPressed: () async { + if (providerController.text.isNotEmpty) { + await controller.addDriverHealthAssurance( + healthInsuranceProvider: providerController.text, + ); + Get.back(); + } else { + Get.snackbar("Error".tr, + "Please provide details about any long-term diseases.".tr); + } + }, + child: Text("Yes".tr), + ), + ], + ), + ); + } + + Widget _buildTripCountAvatar(String count) { + return Container( + width: 70, + height: 70, + decoration: BoxDecoration( + shape: BoxShape.circle, + gradient: const LinearGradient( + colors: [Color(0xFF42A5F5), Color(0xFF1976D2)], + begin: Alignment.topLeft, + end: Alignment.bottomRight, + ), + boxShadow: [ + BoxShadow( + color: Colors.black.withOpacity(0.1), + blurRadius: 8, + offset: const Offset(0, 4), + ), + ], + ), + child: Center( + child: Text( + count, + style: const TextStyle( + fontSize: 20, + fontWeight: FontWeight.bold, + color: Colors.white, + ), + ), + ), + ); + } +} diff --git a/siro_driver/lib/views/home/Captin/bottom_bar.dart b/siro_driver/lib/views/home/Captin/bottom_bar.dart new file mode 100755 index 0000000..e957b2c --- /dev/null +++ b/siro_driver/lib/views/home/Captin/bottom_bar.dart @@ -0,0 +1,111 @@ +import 'package:flutter/material.dart'; +import 'package:get/get.dart'; +import 'package:siro_driver/constant/colors.dart'; + +class BottomBarController extends GetxController { + var currentIndex = 0.obs; + + void changePage(int index) { + currentIndex.value = index; + } +} + +class HomeScreen extends StatelessWidget { + final BottomBarController controller = Get.put(BottomBarController()); + + HomeScreen({super.key}); + + @override + Widget build(BuildContext context) { + return Scaffold( + appBar: AppBar( + title: Text('Bottom Bar Example'.tr), + ), + body: Obx(() => IndexedStack( + index: controller.currentIndex.value, + children: const [ + HomeView(), + ProfileView(), + StatisticsView(), + WalletView(), + ], + )), + bottomNavigationBar: Obx(() => BottomNavigationBar( + backgroundColor: Theme.of(context).cardColor, + currentIndex: controller.currentIndex.value, + onTap: controller.changePage, + selectedItemColor: AppColor.primaryColor, + unselectedItemColor: Theme.of(context).hintColor, + type: BottomNavigationBarType.fixed, + items: [ + BottomNavigationBarItem( + icon: const Icon(Icons.home), + label: 'Home'.tr, + ), + BottomNavigationBarItem( + icon: const Icon(Icons.person), + label: 'Profile'.tr, + ), + BottomNavigationBarItem( + icon: const Icon(Icons.bar_chart), + label: 'Statistics'.tr, + ), + BottomNavigationBarItem( + icon: const Icon(Icons.account_balance_wallet), + label: 'Wallet'.tr, + ), + ], + )), + + ); + } +} + +class HomeView extends StatelessWidget { + const HomeView({super.key}); + + @override + Widget build(BuildContext context) { + Map data; + return const Center( + child: Column( + children: [ + Text('Home View'), + ], + ), + ); + } +} + +class ProfileView extends StatelessWidget { + const ProfileView({super.key}); + + @override + Widget build(BuildContext context) { + return const Center( + child: Text('Profile View'), + ); + } +} + +class StatisticsView extends StatelessWidget { + const StatisticsView({super.key}); + + @override + Widget build(BuildContext context) { + return const Center( + child: Text('Statistics View'), + ); + } +} + +class WalletView extends StatelessWidget { + const WalletView({super.key}); + + @override + Widget build(BuildContext context) { + return const Center( + child: Text('Wallet View'), + ); + } +} diff --git a/siro_driver/lib/views/home/Captin/camer_widget.dart b/siro_driver/lib/views/home/Captin/camer_widget.dart new file mode 100755 index 0000000..51197a4 --- /dev/null +++ b/siro_driver/lib/views/home/Captin/camer_widget.dart @@ -0,0 +1,302 @@ +// import 'package:flutter/material.dart'; +// import 'package:get/get.dart'; +// import 'package:siro_driver/constant/colors.dart'; +// import 'package:siro_driver/constant/style.dart'; +// import 'package:siro_driver/controller/functions/camer_controller.dart'; +// import 'package:siro_driver/views/widgets/elevated_btn.dart'; +// import 'package:siro_driver/views/widgets/my_scafold.dart'; + +// class CameraWidgetCardId extends StatelessWidget { +// final CameraClassController cameraClassController = +// Get.put(CameraClassController()); + +// CameraWidgetCardId({super.key}); + +// @override +// Widget build(BuildContext context) { +// return MyScafolld( +// title: 'Scan Id'.tr, +// body: [ +// Column( +// children: [ +// Padding( +// padding: +// const EdgeInsets.symmetric(vertical: 8, horizontal: 12), +// child: GetBuilder( +// builder: (cameraClassController) => +// cameraClassController.isCameraInitialized +// ? Stack( +// children: [ +// Container( +// decoration: AppStyle.boxDecoration, +// child: FittedBox( +// fit: BoxFit.fitWidth, +// child: SizedBox( +// width: Get.width * .9, +// height: Get.width * +// .9, // Set the desired aspect ratio here +// child: CameraPreview( +// cameraClassController.cameraController, +// ), +// ), +// ), +// ), +// Positioned( +// top: 72, +// child: Container( +// width: 230, +// height: 25, +// decoration: BoxDecoration( +// // color: AppColor.blueColor, +// border: Border.all( +// color: AppColor.yellowColor, +// width: 2), +// ), +// ), +// ), +// Positioned( +// top: 60, +// right: 5, +// child: Container( +// width: 230, +// height: 25, +// decoration: BoxDecoration( +// // color: AppColor.blueColor, +// border: Border.all( +// color: AppColor.blueColor, width: 2), +// ), +// ), +// ), +// Positioned( +// top: 156, +// right: 5, +// child: Container( +// width: 140, +// height: 20, +// decoration: BoxDecoration( +// // color: AppColor.blueColor, +// border: Border.all( +// color: AppColor.blueColor, width: 2), +// ), +// ), +// ), +// Positioned( +// top: 175, +// right: 5, +// child: Container( +// width: 140, +// height: 15, +// decoration: BoxDecoration( +// // color: AppColor.blueColor, +// border: Border.all( +// color: AppColor.blueColor, width: 2), +// ), +// ), +// ), +// Positioned( +// top: 191, +// right: 5, +// child: Container( +// width: 140, +// height: 15, +// decoration: BoxDecoration( +// // color: AppColor.blueColor, +// border: Border.all( +// color: AppColor.blueColor, width: 2), +// ), +// ), +// ), +// Positioned( +// top: 207, +// right: 5, +// child: Container( +// width: 140, +// height: 15, +// decoration: BoxDecoration( +// // color: AppColor.blueColor, +// border: Border.all( +// color: AppColor.blueColor, width: 2), +// ), +// ), +// ), +// Positioned( +// top: 225, +// right: 5, +// child: Container( +// width: 140, +// height: 15, +// decoration: BoxDecoration( +// // color: AppColor.blueColor, +// border: Border.all( +// color: AppColor.blueColor, width: 2), +// ), +// ), +// ), +// Positioned( +// top: 115, +// left: 25, +// child: Container( +// width: 120, +// height: 110, +// decoration: BoxDecoration( +// // color: AppColor.blueColor, +// border: Border.all( +// color: AppColor.blueColor, width: 2), +// ), +// ), +// ), +// ], +// ) +// : Container( +// decoration: AppStyle.boxDecoration, +// height: Get.width * 3 / 4, +// width: Get.width, +// child: Center( +// child: Text( +// 'Camera not initilaized yet'.tr, +// style: AppStyle.title, +// ), +// ), +// ), +// ), +// ), +// Row( +// mainAxisAlignment: MainAxisAlignment.spaceAround, +// children: [ +// MyElevatedButton( +// title: 'Scan ID MklGoogle'.tr, onPressed: () {}), +// // cameraClassController.takePictureAndMLGoogleScan()), +// MyElevatedButton( +// title: 'Scan ID Tesseract'.tr, onPressed: () {}), +// ], +// ), +// MyElevatedButton( +// title: 'Scan ID Api'.tr, +// onPressed: () => cameraClassController.extractCardId()), +// GetBuilder( +// builder: (cameraClassController) => Expanded( +// child: +// Text(cameraClassController.scannedText.toString()))) +// ], +// ) +// ], +// isleading: true); +// } +// } + +// class CameraWidgetPassPort extends StatelessWidget { +// final CameraClassController cameraClassController = +// Get.put(CameraClassController()); + +// CameraWidgetPassPort({super.key}); + +// @override +// Widget build(BuildContext context) { +// return MyScafolld( +// title: 'Scan Id'.tr, +// body: [ +// Column( +// children: [ +// Padding( +// padding: +// const EdgeInsets.symmetric(vertical: 8, horizontal: 12), +// child: GetBuilder( +// builder: (cameraClassController) => +// cameraClassController.isCameraInitialized +// ? Stack( +// children: [ +// Container( +// decoration: AppStyle.boxDecoration, +// child: FittedBox( +// fit: BoxFit.fitWidth, +// child: SizedBox( +// width: Get.width * .9, +// height: Get.width * +// .9, // Set the desired aspect ratio here +// child: CameraPreview( +// cameraClassController.cameraController, +// ), +// ), +// ), +// ), +// Positioned( +// top: 35, +// left: 35, +// width: Get.width * .77, +// height: +// 17, //left":95.0,"top":134.0,"width":2909.0,"height":175.0 +// child: Container( +// // width: 230, +// // height: 25, +// decoration: BoxDecoration( +// // color: AppColor.blueColor, +// border: Border.all( +// color: AppColor.yellowColor, +// width: 2), +// ), +// ), +// ), +// Positioned( +// top: 60, +// right: 25, +// width: 90, +// height: 25, +// child: Container( +// decoration: BoxDecoration( +// // color: AppColor.blueColor, +// border: Border.all( +// color: AppColor.blueColor, width: 2), +// ), +// ), +// ), +// Positioned( +// top: 110, +// right: 90, +// child: Container( +// width: 140, +// height: 20, +// decoration: BoxDecoration( +// // color: AppColor.blueColor, +// border: Border.all( +// color: AppColor.blueColor, width: 2), +// ), +// ), +// ), +// ], +// ) +// : Container( +// decoration: AppStyle.boxDecoration, +// height: Get.width * 3 / 4, +// width: Get.width, +// child: Center( +// child: Text( +// 'Camera not initilaized yet', +// style: AppStyle.title, +// ), +// ), +// ), +// ), +// ), +// Row( +// mainAxisAlignment: MainAxisAlignment.spaceAround, +// children: [ +// MyElevatedButton( +// title: 'Scan ID MklGoogle'.tr, onPressed: () => {}), +// // cameraClassController.takePictureAndMLGoogleScan()), +// MyElevatedButton( +// title: 'Scan ID Tesseract'.tr, onPressed: () {}), +// ], +// ), +// MyElevatedButton( +// title: 'Scan ID Api'.tr, +// onPressed: () => cameraClassController.extractCardId()), +// GetBuilder( +// builder: (cameraClassController) => Expanded( +// child: +// Text(cameraClassController.scannedText.toString()))) +// ], +// ) +// ], +// isleading: true); +// } +// } diff --git a/siro_driver/lib/views/home/Captin/driver_map_page.dart b/siro_driver/lib/views/home/Captin/driver_map_page.dart new file mode 100755 index 0000000..063b4f4 --- /dev/null +++ b/siro_driver/lib/views/home/Captin/driver_map_page.dart @@ -0,0 +1,448 @@ +import 'dart:ui'; +import 'package:flutter/material.dart'; +import 'package:get/get.dart'; +import 'package:siro_driver/constant/box_name.dart'; +import 'package:siro_driver/constant/style.dart'; +import 'package:siro_driver/views/widgets/elevated_btn.dart'; +import 'package:siro_driver/controller/home/captin/map_driver_controller.dart'; +import '../../../constant/colors.dart'; +import '../../../controller/functions/location_controller.dart'; +import '../../../main.dart'; +import '../../Rate/rate_passenger.dart'; +import '../../widgets/my_textField.dart'; +import 'mapDriverWidgets/driver_end_ride_bar.dart'; +import 'mapDriverWidgets/google_driver_map_page.dart'; +import 'mapDriverWidgets/google_map_app.dart'; +import 'mapDriverWidgets/passenger_info_window.dart'; +import 'mapDriverWidgets/sos_connect.dart'; +import 'mapDriverWidgets/sped_circle.dart'; + +class PassengerLocationMapPage extends StatelessWidget { + PassengerLocationMapPage({super.key}); + final LocationController locationController = Get.put(LocationController()); + final MapDriverController mapDriverController = + Get.put(MapDriverController()); + + // دالة ديالوج الخروج + Future showExitDialog() async { + bool? result = await Get.defaultDialog( + title: "Warning".tr, + titleStyle: AppStyle.title.copyWith(color: AppColor.redColor), + middleText: + "Active ride in progress. Leaving might stop tracking. Exit?".tr, + barrierDismissible: false, + radius: 15, + confirm: MyElevatedButton( + title: 'Stay'.tr, + kolor: AppColor.greenColor, + onPressed: () => Get.back(result: false)), + cancel: MyElevatedButton( + title: 'Exit'.tr, + kolor: AppColor.redColor, + onPressed: () => Get.back(result: true)), + ); + return result ?? false; + } + + @override + Widget build(BuildContext context) { + WidgetsBinding.instance.addPostFrameCallback((_) { + if (Get.arguments != null && Get.arguments is Map) { + // 🔥 [Fix] argumentLoading ضرورية هنا للعودة للرحلة من صفحة الهوم + // (عند العودة لا يُستدعى onInit() لأن الكنترولر موجود مسبقاً) + // الحماية من التكرار موجودة داخل argumentLoading بواسطة _isRouteRequested flag + mapDriverController.argumentLoading(); + mapDriverController.startTimerToShowPassengerInfoWindowFromDriver(); + mapDriverController + .update(['PassengerInfo', 'DriverEndBar', 'SosConnect']); + } + }); + + return PopScope( + canPop: false, + onPopInvokedWithResult: (didPop, result) async { + if (didPop) return; + final shouldExit = await showExitDialog(); + if (shouldExit) Get.back(); + }, + child: Scaffold( + resizeToAvoidBottomInset: false, + body: Stack( + children: [ + // 1. الخريطة (الخلفية) + Positioned.fill( + child: GoogleDriverMap(locationController: locationController)), + + // 2. واجهة المستخدم (فوق الخريطة) + SafeArea( + child: Stack( + children: [ + // أ) زر الإلغاء (أعلى اليسار) + CancelWidget(mapDriverController: mapDriverController), + + // ب) شريط إنهاء الرحلة (أعلى الوسط) + Positioned( + top: 0, + left: 0, + right: 0, + child: SafeArea(child: driverEndRideBar())), + + // ج) شريط التعليمات الملاحية (الأسفل) + const InstructionsOfRoads(), + + // د) نافذة معلومات الراكب (تعلو التعليمات ديناميكياً) + const PassengerInfoWindow(), + // SpeedCircle(), + Positioned( + right: 16, + bottom: 20, // أو أي مسافة تناسبك + child: GetBuilder( + // id: 'SosConnect', // لتحديث الزر عند بدء الرحلة + builder: (controller) { + // حساب الهوامش ديناميكياً لرفع الأزرار فوق النوافذ السفلية + double bottomPadding = 0; + if (controller.currentInstruction.isNotEmpty) + bottomPadding += 120; + if (controller.isPassengerInfoWindow) + bottomPadding += 220; + + return AnimatedContainer( + duration: const Duration(milliseconds: 300), + margin: EdgeInsets.only(bottom: bottomPadding), + child: Column( + mainAxisSize: MainAxisSize.min, + crossAxisAlignment: CrossAxisAlignment.end, + children: [ + SosConnect(), // ويدجت نظيفة + const SizedBox(height: 12), + const GoogleMapApp(), // ويدجت نظيفة + ], + ), + ); + }, + ), + ), + ], + ), + ), + + // 3. النوافذ المنبثقة (Overlay) + const PricesWindow(), + ], + ), + ), + ); + } +} + +// --------------------------------------------------------------------------- +// 1. ويدجت شريط التعليمات (InstructionsOfRoads) +// --------------------------------------------------------------------------- +class InstructionsOfRoads extends StatelessWidget { + const InstructionsOfRoads({super.key}); + + @override + Widget build(BuildContext context) { + return Positioned( + bottom: 20, + left: 15, + right: 15, + child: GetBuilder( + builder: (controller) { + // إخفاء الشريط إذا لم يكن هناك تعليمات + if (controller.currentInstruction.isEmpty) return const SizedBox(); + + return TweenAnimationBuilder( + tween: Tween(begin: 0.0, end: 1.0), + duration: const Duration(milliseconds: 500), + builder: (context, value, child) { + final theme = Theme.of(context); + return Transform.translate( + offset: Offset(0, 50 * (1 - value)), // حركة انزلاق + child: Opacity( + opacity: value, + child: Container( + padding: const EdgeInsets.symmetric( + horizontal: 16, vertical: 12), + decoration: BoxDecoration( + color: theme.cardColor + .withOpacity(0.95), // Adaptive background + borderRadius: BorderRadius.circular(16), + boxShadow: [ + BoxShadow( + color: Colors.black.withOpacity(0.2), + blurRadius: 15, + offset: const Offset(0, 5)), + ], + border: Border.all( + color: theme.dividerColor.withOpacity(0.1)), + ), + child: Row( + children: [ + // أيقونة الاتجاه + Container( + padding: const EdgeInsets.all(8), + decoration: BoxDecoration( + color: AppColor.primaryColor, + shape: BoxShape.circle, + ), + child: Icon(controller.currentManeuverIcon, + color: Colors.white, size: 24), + ), + const SizedBox(width: 14), + // نص التعليمات + Expanded( + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Text( + "${"NEXT STEP".tr} (${controller.distanceToNextStep})", + style: theme.textTheme.labelSmall?.copyWith( + color: theme.hintColor, + fontWeight: FontWeight.bold, + letterSpacing: 1.2), + ), + const SizedBox(height: 2), + Text( + controller.currentInstruction, + style: theme.textTheme.titleMedium?.copyWith( + fontWeight: FontWeight.w600, height: 1.2), + maxLines: 2, + overflow: TextOverflow.ellipsis, + ), + ], + ), + ), + + // فاصل عمودي + Container( + width: 1, + height: 30, + color: Colors.white12, + margin: const EdgeInsets.symmetric(horizontal: 10)), + + // زر التحكم بالصوت + Material( + color: Colors.transparent, + child: InkWell( + onTap: () => controller.toggleTts(), + borderRadius: BorderRadius.circular(20), + child: Padding( + padding: const EdgeInsets.all(8.0), + child: Icon( + controller.isTtsEnabled + ? Icons.volume_up_rounded + : Icons.volume_off_rounded, + color: controller.isTtsEnabled + ? AppColor.greenColor + : Colors.grey, + size: 24, + ), + ), + ), + ), + ], + ), + ), + ), + ); + }, + ); + }, + ), + ); + } +} + +// --------------------------------------------------------------------------- +// 2. ويدجت زر الإلغاء (CancelWidget) - كامل +// --------------------------------------------------------------------------- +class CancelWidget extends StatelessWidget { + const CancelWidget({super.key, required this.mapDriverController}); + final MapDriverController mapDriverController; + + @override + Widget build(BuildContext context) { + return Positioned( + top: 10, + left: 15, + child: GetBuilder(builder: (controller) { + // نخفي الزر إذا انتهت الرحلة + if (controller.isRideFinished) return const SizedBox(); + + return ClipRRect( + borderRadius: BorderRadius.circular(30), + child: BackdropFilter( + filter: ImageFilter.blur(sigmaX: 10, sigmaY: 10), + child: Container( + decoration: BoxDecoration( + color: Theme.of(context).cardColor.withOpacity(0.9), + borderRadius: BorderRadius.circular(30), + boxShadow: [ + BoxShadow( + color: Theme.of(context).shadowColor.withOpacity(0.1), + blurRadius: 8) + ], + ), + child: Material( + color: Colors.transparent, + child: InkWell( + borderRadius: BorderRadius.circular(30), + onTap: () => _showCancelDialog(context, controller), + child: const Padding( + padding: EdgeInsets.all(10.0), + child: Icon(Icons.close_rounded, + color: AppColor.redColor, size: 26), + ), + ), + ), + ), + ), + ); + }), + ); + } + + void _showCancelDialog(BuildContext context, MapDriverController controller) { + Get.defaultDialog( + title: "Cancel Trip?".tr, + titleStyle: AppStyle.title.copyWith(fontWeight: FontWeight.bold), + radius: 16, + content: Column( + children: [ + const Icon(Icons.warning_amber_rounded, + size: 50, color: Colors.orangeAccent), + const SizedBox(height: 10), + Text( + "Please tell us why you want to cancel.".tr, + textAlign: TextAlign.center, + style: TextStyle(color: Colors.grey[600]), + ), + const SizedBox(height: 15), + Form( + key: controller.formKeyCancel, + child: MyTextForm( + controller: controller.cancelTripCotroller, + label: "Reason".tr, + hint: "Write your reason...".tr, + type: TextInputType.text, + ), + ), + ], + ), + confirm: SizedBox( + width: 100, + child: MyElevatedButton( + title: 'Confirm'.tr, + kolor: AppColor.redColor, + onPressed: () async { + // استدعاء دالة الإلغاء من الكنترولر + await controller.cancelTripFromDriverAfterApplied(); + // Get.back(); // عادة موجودة داخل الدالة في الكنترولر + }, + ), + ), + cancel: SizedBox( + width: 100, + child: TextButton( + onPressed: () => Get.back(), + child: Text('Back'.tr, style: const TextStyle(color: Colors.grey)), + ), + ), + ); + } +} + +// --------------------------------------------------------------------------- +// 3. ويدجت نافذة الأسعار (PricesWindow) - كامل +// --------------------------------------------------------------------------- +class PricesWindow extends StatelessWidget { + const PricesWindow({super.key}); + + @override + Widget build(BuildContext context) { + return GetBuilder(builder: (controller) { + // إخفاء إذا لم تكن مفعلة + if (!controller.isPriceWindow) return const SizedBox(); + + return Container( + color: Colors.black.withOpacity(0.6), // خلفية معتمة + child: Center( + child: TweenAnimationBuilder( + tween: Tween(begin: 0.8, end: 1.0), + duration: const Duration(milliseconds: 300), + curve: Curves.elasticOut, + builder: (context, scale, child) { + return Transform.scale( + scale: scale, + child: Container( + width: Get.width * 0.85, + padding: const EdgeInsets.all(30), + decoration: BoxDecoration( + color: Theme.of(context).cardColor, + borderRadius: BorderRadius.circular(24), + boxShadow: [ + BoxShadow( + color: Theme.of(context).shadowColor.withOpacity(0.2), + blurRadius: 20, + spreadRadius: 5, + ), + ], + ), + child: Column( + mainAxisSize: MainAxisSize.min, + children: [ + Container( + padding: const EdgeInsets.all(15), + decoration: BoxDecoration( + color: AppColor.primaryColor.withOpacity(0.1), + shape: BoxShape.circle, + ), + child: Icon(Icons.check_circle_rounded, + color: AppColor.primaryColor, size: 50), + ), + const SizedBox(height: 20), + Text( + 'Total Price'.tr, + style: AppStyle.headTitle2 + .copyWith(fontSize: 18, color: Colors.grey[600]), + ), + const SizedBox(height: 10), + Text( + '${controller.totalCost} ${'\$'.tr}', + style: AppStyle.headTitle2.copyWith( + color: Theme.of(context).textTheme.bodyLarge?.color, + fontSize: 42, + fontWeight: FontWeight.w900, + ), + ), + const SizedBox(height: 30), + SizedBox( + width: double.infinity, + height: 55, + child: MyElevatedButton( + title: 'Collect Payment'.tr, + kolor: AppColor.primaryColor, + onPressed: () { + // الذهاب لصفحة التقييم + Get.to(() => RatePassenger(), arguments: { + 'rideId': controller.rideId, + 'passengerId': controller.passengerId, + 'driverId': controller.driverId, + 'price': controller.paymentAmount, + 'walletChecked': controller.walletChecked + }); + }, + ), + ), + ], + ), + ), + ); + }, + ), + ), + ); + }); + } +} diff --git a/siro_driver/lib/views/home/Captin/history/history_captain.dart b/siro_driver/lib/views/home/Captin/history/history_captain.dart new file mode 100755 index 0000000..f5f948b --- /dev/null +++ b/siro_driver/lib/views/home/Captin/history/history_captain.dart @@ -0,0 +1,411 @@ +import 'package:flutter/material.dart'; +import 'package:get/get.dart'; +import 'package:intl/intl.dart'; +import 'package:flutter_staggered_animations/flutter_staggered_animations.dart'; +import '../../../../constant/finance_design_system.dart'; +import '../../../../controller/auth/captin/history_captain.dart'; +import 'package:siro_driver/views/widgets/mydialoug.dart'; + +class HistoryCaptain extends StatelessWidget { + const HistoryCaptain({super.key}); + + @override + Widget build(BuildContext context) { + Get.put(HistoryCaptainController()); + + return Scaffold( + backgroundColor: Colors.white, + body: GetBuilder( + builder: (controller) { + if (controller.isloading) { + return Center( + child: CircularProgressIndicator( + color: FinanceDesignSystem.primaryDark), + ); + } + + final List trips = controller.historyData['message'] ?? []; + + return CustomScrollView( + physics: const BouncingScrollPhysics(), + slivers: [ + // 1. Custom App Bar + SliverAppBar( + expandedHeight: 180, + pinned: true, + stretch: true, + backgroundColor: FinanceDesignSystem.primaryDark, + flexibleSpace: FlexibleSpaceBar( + centerTitle: true, + title: Text( + 'Ride History'.tr, + style: const TextStyle( + color: Colors.white, + fontWeight: FontWeight.bold, + fontSize: 18, + ), + ), + background: Stack( + fit: StackFit.expand, + children: [ + Container( + decoration: BoxDecoration( + gradient: FinanceDesignSystem.balanceGradient, + ), + ), + Positioned( + right: -50, + top: -20, + child: Icon( + Icons.history_rounded, + size: 200, + color: Colors.white.withValues(alpha: 0.05), + ), + ), + Column( + mainAxisAlignment: MainAxisAlignment.center, + children: [ + const SizedBox(height: 40), + Text( + trips.length.toString(), + style: const TextStyle( + color: Colors.white, + fontSize: 40, + fontWeight: FontWeight.w900, + ), + ), + Text( + 'Total Rides'.tr, + style: TextStyle( + color: Colors.white.withValues(alpha: 0.7), + fontSize: 14, + fontWeight: FontWeight.w500, + ), + ), + ], + ), + ], + ), + ), + ), + + // 2. Trips List + if (trips.isEmpty) + SliverFillRemaining( + child: Center( + child: Column( + mainAxisAlignment: MainAxisAlignment.center, + children: [ + Container( + padding: const EdgeInsets.all(32), + decoration: BoxDecoration( + color: Colors.grey.shade50, + shape: BoxShape.circle, + ), + child: Icon( + Icons.history_toggle_off_rounded, + size: 64, + color: Colors.grey.shade300, + ), + ), + const SizedBox(height: 24), + Text( + 'No Rides Yet'.tr, + style: TextStyle( + fontSize: 18, + fontWeight: FontWeight.bold, + color: Colors.grey.shade600, + ), + ), + const SizedBox(height: 8), + Text( + 'Your completed trips will appear here'.tr, + style: TextStyle( + fontSize: 14, + color: Colors.grey.shade400, + ), + ), + ], + ), + ), + ) + else + SliverPadding( + padding: const EdgeInsets.fromLTRB(16, 24, 16, 40), + sliver: SliverList( + delegate: SliverChildBuilderDelegate( + (context, index) { + final trip = trips[index]; + return AnimationConfiguration.staggeredList( + position: index, + duration: const Duration(milliseconds: 375), + child: SlideAnimation( + verticalOffset: 50.0, + child: FadeInAnimation( + child: _TripHistoryCard( + trip: trip, + onTap: () { + if (trip['status'] != 'Cancel' && + trip['status'] != 'CancelByPassenger') { + controller + .getHistoryDetails(trip['order_id']); + } else { + MyDialog().getDialog( + 'This Trip Was Cancelled'.tr, + 'This Trip Was Cancelled'.tr, + () => Get.back(), + ); + } + }, + ), + ), + ), + ); + }, + childCount: trips.length, + ), + ), + ), + ], + ); + }, + ), + ); + } +} + +class _TripHistoryCard extends StatelessWidget { + final Map trip; + final VoidCallback onTap; + + const _TripHistoryCard({required this.trip, required this.onTap}); + + String _formatDateToSyria(String? dateStr) { + if (dateStr == null) return ''; + try { + // Parse GMT date + DateTime date = DateTime.parse(dateStr); + // Add 3 hours for Syria (GMT+3) + DateTime syriaDate = date.add(const Duration(hours: 3)); + // Format to readable string + return DateFormat('yyyy-MM-dd HH:mm').format(syriaDate); + } catch (e) { + return dateStr; + } + } + + @override + Widget build(BuildContext context) { + return Container( + margin: const EdgeInsets.only(bottom: 20), + decoration: BoxDecoration( + color: Colors.white, + borderRadius: BorderRadius.circular(FinanceDesignSystem.cardRadius), + boxShadow: [ + BoxShadow( + color: Colors.black.withValues(alpha: 0.04), + blurRadius: 15, + offset: const Offset(0, 8), + ), + ], + ), + child: Material( + color: Colors.transparent, + child: InkWell( + onTap: onTap, + borderRadius: BorderRadius.circular(FinanceDesignSystem.cardRadius), + child: Padding( + padding: const EdgeInsets.all(20), + child: Column( + children: [ + Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + Row( + children: [ + Container( + padding: const EdgeInsets.all(10), + decoration: BoxDecoration( + color: FinanceDesignSystem.primaryDark + .withValues(alpha: 0.05), + borderRadius: BorderRadius.circular(12), + ), + child: Icon( + Icons.receipt_long_rounded, + color: FinanceDesignSystem.primaryDark, + size: 20, + ), + ), + const SizedBox(width: 12), + Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Text( + '${'OrderId'.tr} #${trip['order_id']}', + style: TextStyle( + fontWeight: FontWeight.bold, + fontSize: 15, + color: FinanceDesignSystem.primaryDark, + ), + ), + Text( + _formatDateToSyria(trip['created_at']), + style: TextStyle( + fontSize: 11, + color: Colors.grey.shade500, + ), + ), + ], + ), + ], + ), + _buildStatusChip(trip['status']), + ], + ), + const SizedBox(height: 20), + const Divider(height: 1), + const SizedBox(height: 20), + Row( + children: [ + Column( + children: [ + Icon(Icons.circle, + size: 12, color: FinanceDesignSystem.accentBlue), + Container( + width: 2, + height: 20, + color: Colors.grey.shade200, + ), + Icon(Icons.location_on_rounded, + size: 14, color: FinanceDesignSystem.dangerRed), + ], + ), + const SizedBox(width: 16), + Expanded( + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Text( + trip['start_name'] ?? 'Pickup Location'.tr, + maxLines: 1, + overflow: TextOverflow.ellipsis, + style: TextStyle( + fontSize: 13, + color: Colors.grey.shade700, + fontWeight: FontWeight.w500, + ), + ), + const SizedBox(height: 12), + Text( + trip['end_name'] ?? 'Destination Location'.tr, + maxLines: 1, + overflow: TextOverflow.ellipsis, + style: TextStyle( + fontSize: 13, + color: Colors.grey.shade700, + fontWeight: FontWeight.w500, + ), + ), + ], + ), + ), + if (trip['price'] != null) + Column( + crossAxisAlignment: CrossAxisAlignment.end, + children: [ + Text( + '${trip['price']} ${'SYP'.tr}', + style: TextStyle( + fontWeight: FontWeight.w900, + fontSize: 16, + color: FinanceDesignSystem.primaryDark, + ), + ), + const Icon(Icons.arrow_forward_ios_rounded, + size: 12, color: Colors.grey), + ], + ), + ], + ), + ], + ), + ), + ), + ), + ); + } + + Widget _buildStatusChip(String? status) { + Color color; + IconData icon; + String label = status ?? 'Unknown'; + List gradientColors; + + switch (status) { + case 'Apply': + color = FinanceDesignSystem.successGreen; + icon = Icons.check_circle_rounded; + label = 'Completed'.tr; + gradientColors = [color.withOpacity(0.2), color.withOpacity(0.05)]; + break; + case 'Refused': + color = FinanceDesignSystem.dangerRed; + icon = Icons.cancel_rounded; + label = 'Refused'.tr; + gradientColors = [color.withOpacity(0.2), color.withOpacity(0.05)]; + break; + case 'Cancel': + color = Colors.orange; + icon = Icons.info_rounded; + label = 'Cancelled'.tr; + gradientColors = [color.withOpacity(0.2), color.withOpacity(0.05)]; + break; + case 'CancelByPassenger': + color = const Color(0xFF6B4EFF); + icon = Icons.person_off_rounded; + label = 'Cancelled by Passenger'.tr; + gradientColors = [color.withOpacity(0.2), color.withOpacity(0.05)]; + break; + default: + color = Colors.grey; + icon = Icons.help_rounded; + gradientColors = [color.withOpacity(0.2), color.withOpacity(0.05)]; + } + + return Container( + padding: const EdgeInsets.symmetric(horizontal: 12, vertical: 6), + decoration: BoxDecoration( + gradient: LinearGradient( + colors: gradientColors, + begin: Alignment.topLeft, + end: Alignment.bottomRight, + ), + borderRadius: BorderRadius.circular(20), + border: Border.all(color: color.withValues(alpha: 0.3), width: 1), + boxShadow: [ + BoxShadow( + color: color.withValues(alpha: 0.1), + blurRadius: 4, + offset: const Offset(0, 2), + ), + ], + ), + child: Row( + mainAxisSize: MainAxisSize.min, + children: [ + Icon(icon, size: 14, color: color), + const SizedBox(width: 6), + Text( + label, + style: TextStyle( + color: color, + fontSize: 11, + fontWeight: FontWeight.w800, + letterSpacing: 0.3, + ), + ), + ], + ), + ); + } +} diff --git a/siro_driver/lib/views/home/Captin/history/history_details_page.dart b/siro_driver/lib/views/home/Captin/history/history_details_page.dart new file mode 100755 index 0000000..8d79f5e --- /dev/null +++ b/siro_driver/lib/views/home/Captin/history/history_details_page.dart @@ -0,0 +1,371 @@ +import 'package:flutter/material.dart'; +import 'package:get/get.dart'; +import 'package:intaleq_maps/intaleq_maps.dart'; +import 'package:siro_driver/constant/api_key.dart'; +import 'package:flutter_staggered_animations/flutter_staggered_animations.dart'; + +import 'package:siro_driver/controller/auth/captin/history_captain.dart'; +import 'package:siro_driver/controller/functions/launch.dart'; + +class HistoryDetailsPage extends StatefulWidget { + const HistoryDetailsPage({super.key}); + + @override + State createState() => _HistoryDetailsPageState(); +} + +class _HistoryDetailsPageState extends State { + // Get the controller instance + final HistoryCaptainController controller = + Get.find(); + + // Helper method to safely parse LatLng from a string 'lat,lng' + LatLng? _parseLatLng(String? latLngString) { + if (latLngString == null) return null; + final parts = latLngString.split(','); + if (parts.length != 2) return null; + final lat = double.tryParse(parts[0]); + final lng = double.tryParse(parts[1]); + if (lat == null || lng == null) return null; + return LatLng(lat, lng); + } + + @override + Widget build(BuildContext context) { + return Scaffold( + backgroundColor: Colors.grey[50], + appBar: AppBar( + title: Text('Trip Details'.tr), + backgroundColor: Colors.white, + elevation: 1, + ), + body: GetBuilder( + builder: (controller) { + if (controller.isloading) { + return const Center(child: CircularProgressIndicator()); + } + + final res = controller.historyDetailsData['data']; + if (res == null) { + return Center(child: Text('Could not load trip details.'.tr)); + } + + final startLocation = _parseLatLng(res['start_location']); + final endLocation = _parseLatLng(res['end_location']); + + // Create markers for the map + final Set markers = {}; + if (startLocation != null) { + markers.add(Marker( + markerId: const MarkerId('start'), + position: startLocation, + infoWindow: InfoWindow(title: 'Start'.tr))); + } + if (endLocation != null) { + markers.add(Marker( + markerId: const MarkerId('end'), + position: endLocation, + infoWindow: InfoWindow(title: 'End'.tr))); + } + + return AnimationLimiter( + child: ListView( + padding: const EdgeInsets.all(16.0), + children: AnimationConfiguration.toStaggeredList( + duration: const Duration(milliseconds: 375), + childAnimationBuilder: (widget) => SlideAnimation( + verticalOffset: 50.0, + child: FadeInAnimation(child: widget), + ), + children: [ + // --- Map Card --- + _buildMapCard(context, startLocation, endLocation, markers), + const SizedBox(height: 16), + + // --- Trip Info Card --- + _DetailCard( + icon: Icons.receipt_long, + title: 'Trip Info'.tr, + child: Column( + children: [ + _InfoTile( + label: 'Order ID'.tr, + value: res['id']?.toString() ?? 'N/A'), + _InfoTile( + label: 'Date'.tr, + value: res['date']?.toString() ?? 'N/A'), + ], + ), + ), + + // --- Earnings Card --- + _DetailCard( + icon: Icons.account_balance_wallet, + title: 'Earnings & Distance'.tr, + child: Column( + children: [ + _InfoTile( + label: 'Your Earnings'.tr, + value: '${res['price_for_driver']}'), + _InfoTile( + label: 'Distance'.tr, + value: '${res['distance']} KM'), + ], + ), + ), + + // --- Timeline Card --- + _DetailCard( + icon: Icons.timeline, + title: 'Trip Timeline'.tr, + child: Column( + children: [ + _InfoTile( + label: 'Time to Passenger'.tr, + value: res['DriverIsGoingToPassenger'] ?? 'N/A'), + _InfoTile( + label: 'Trip Started'.tr, + value: res['rideTimeStart'] ?? 'N/A'), + _InfoTile( + label: 'Trip Finished'.tr, + value: res['rideTimeFinish'] ?? 'N/A'), + ], + ), + ), + + // --- Passenger & Status Card --- + _DetailCard( + icon: Icons.person, + title: 'Passenger & Status'.tr, + child: Column( + children: [ + _InfoTile( + label: 'Passenger Name'.tr, + value: + '${res['passengerName']} ${res['last_name']}'), + _InfoTile( + label: 'Status'.tr, + value: res['status'] ?? 'N/A', + isStatus: true), + ], + ), + ), + ], + ), + ), + ); + }, + ), + ); + } + + Widget _buildMapCard(BuildContext context, LatLng? startLocation, + LatLng? endLocation, Set markers) { + // A fallback position if locations are not available + final initialCameraPosition = (startLocation != null) + ? CameraPosition(target: startLocation, zoom: 14) + : const CameraPosition( + target: LatLng(31.96, 35.92), zoom: 12); // Fallback to Amman + + return Card( + elevation: 4, + shadowColor: Colors.black.withValues(alpha: 0.1), + shape: RoundedRectangleBorder(borderRadius: BorderRadius.circular(12)), + clipBehavior: + Clip.antiAlias, // Ensures the map respects the border radius + child: Stack( + children: [ + SizedBox( + height: 250, + child: IntaleqMap( + apiKey: AK.mapAPIKEY, + initialCameraPosition: initialCameraPosition, + markers: markers, + polylines: { + if (startLocation != null && endLocation != null) + Polyline( + polylineId: const PolylineId('route'), + points: [startLocation, endLocation], + color: Colors.deepPurple, + width: 5, + ), + }, + onMapCreated: (IntaleqMapController mapController) { + // Animate camera to fit the route + if (startLocation != null && endLocation != null) { + LatLngBounds bounds = LatLngBounds( + southwest: LatLng( + startLocation.latitude < endLocation.latitude + ? startLocation.latitude + : endLocation.latitude, + startLocation.longitude < endLocation.longitude + ? startLocation.longitude + : endLocation.longitude, + ), + northeast: LatLng( + startLocation.latitude > endLocation.latitude + ? startLocation.latitude + : endLocation.latitude, + startLocation.longitude > endLocation.longitude + ? startLocation.longitude + : endLocation.longitude, + ), + ); + mapController.animateCamera( + CameraUpdate.newLatLngBounds(bounds, left: 60, top: 60, right: 60, bottom: 60)); + } + }, + ), + ), + Positioned( + top: 10, + right: 10, + child: FloatingActionButton.small( + heroTag: 'open_maps', + onPressed: () { + if (startLocation != null && endLocation != null) { + String mapUrl = + 'https://www.google.com/maps/dir/${startLocation.latitude},${startLocation.longitude}/${endLocation.latitude},${endLocation.longitude}/'; + showInBrowser(mapUrl); + } + }, + child: const Icon(Icons.directions), + ), + ), + ], + ), + ); + } +} + +// A reusable widget for the main detail cards +class _DetailCard extends StatelessWidget { + final IconData icon; + final String title; + final Widget child; + + const _DetailCard({ + required this.icon, + required this.title, + required this.child, + }); + + @override + Widget build(BuildContext context) { + return Card( + elevation: 2, + shadowColor: Colors.black.withValues(alpha: 0.05), + margin: const EdgeInsets.only(bottom: 16.0), + shape: RoundedRectangleBorder(borderRadius: BorderRadius.circular(12)), + child: Padding( + padding: const EdgeInsets.all(16.0), + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Row( + children: [ + Icon(icon, color: Theme.of(context).primaryColor), + const SizedBox(width: 8), + Text( + title, + style: Theme.of(context) + .textTheme + .titleLarge + ?.copyWith(fontWeight: FontWeight.bold), + ), + ], + ), + const Divider(height: 24), + child, + ], + ), + ), + ); + } +} + +// A reusable widget for a label-value pair inside a card +class _InfoTile extends StatelessWidget { + final String label; + final String value; + final bool isStatus; + + const _InfoTile({ + required this.label, + required this.value, + this.isStatus = false, + }); + + @override + Widget build(BuildContext context) { + return Padding( + padding: const EdgeInsets.symmetric(vertical: 8.0), + child: Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + Text(label, + style: Theme.of(context) + .textTheme + .titleMedium + ?.copyWith(color: Colors.grey[700])), + if (isStatus) + _buildStatusChip(value) + else + Flexible( + child: Text( + value, + style: Theme.of(context) + .textTheme + .titleMedium + ?.copyWith(fontWeight: FontWeight.bold), + textAlign: TextAlign.end, + ), + ), + ], + ), + ); + } +} + +// Reusing the status chip from the previous page for consistency +Widget _buildStatusChip(String status) { + Color chipColor; + Color textColor; + IconData iconData; + + switch (status.toLowerCase()) { + case 'apply': + case 'completed': // Assuming 'Apply' means completed + chipColor = Colors.green.shade50; + textColor = Colors.green.shade800; + iconData = Icons.check_circle; + status = 'Completed'; + break; + case 'refused': + chipColor = Colors.red.shade50; + textColor = Colors.red.shade800; + iconData = Icons.cancel; + break; + case 'cancel': + chipColor = Colors.orange.shade50; + textColor = Colors.orange.shade800; + iconData = Icons.info; + status = 'Cancelled'; + break; + default: + chipColor = Colors.grey.shade200; + textColor = Colors.grey.shade800; + iconData = Icons.hourglass_empty; + } + + return Chip( + avatar: Icon(iconData, color: textColor, size: 16), + label: Text( + status.tr, + style: TextStyle(color: textColor, fontWeight: FontWeight.w600), + ), + backgroundColor: chipColor, + padding: const EdgeInsets.symmetric(horizontal: 8, vertical: 4), + side: BorderSide.none, + ); +} diff --git a/siro_driver/lib/views/home/Captin/home_captain/drawer_captain.dart b/siro_driver/lib/views/home/Captin/home_captain/drawer_captain.dart new file mode 100755 index 0000000..af2f5d7 --- /dev/null +++ b/siro_driver/lib/views/home/Captin/home_captain/drawer_captain.dart @@ -0,0 +1,407 @@ +import 'dart:io'; + +import 'package:flutter/material.dart'; +import 'package:get/get.dart'; +import 'package:flutter_staggered_animations/flutter_staggered_animations.dart'; +import 'package:siro_driver/constant/box_name.dart'; +import 'package:siro_driver/constant/links.dart'; +import 'package:siro_driver/controller/functions/upload_image.dart'; +import 'package:siro_driver/controller/home/captin/home_captain_controller.dart'; +import 'package:siro_driver/device_compatibility_page.dart'; +import 'package:siro_driver/main.dart'; + +// استيراد الصفحات الأخرى... تأكد من صحة المسارات +import 'package:siro_driver/views/Rate/rate_app_page.dart'; +import 'package:siro_driver/views/auth/captin/contact_us_page.dart'; +import 'package:siro_driver/views/auth/captin/invite_driver_screen.dart'; +import 'package:siro_driver/views/home/statistics/statistics_dashboard.dart'; +import 'package:siro_driver/views/gamification/challenges_page.dart'; +import 'package:siro_driver/views/gamification/leaderboard_page.dart'; +import 'package:siro_driver/views/gamification/referral_center_page.dart'; +import 'package:siro_driver/views/home/journal/schedule_page.dart'; +import 'package:siro_driver/views/notification/available_rides_page.dart'; +import 'package:siro_driver/views/auth/captin/logout_captain.dart'; +import 'package:siro_driver/views/home/Captin/history/history_captain.dart'; +import 'package:siro_driver/views/home/Captin/home_captain/help_captain.dart'; +import 'package:siro_driver/views/home/Captin/About Us/settings_captain.dart'; +import 'package:siro_driver/views/home/my_wallet/walet_captain.dart'; +import 'package:siro_driver/views/home/profile/profile_captain.dart'; +import 'package:siro_driver/views/notification/notification_captain.dart'; +import 'package:url_launcher/url_launcher.dart'; +import '../../../../constant/colors.dart'; +import '../About Us/video_page.dart'; +import '../assurance_health_page.dart'; +import '../maintain_center_page.dart'; + +// 1. إنشاء Class لتعريف بيانات كل عنصر في القائمة +class DrawerItem { + final String title; + final IconData icon; + final Color color; + final VoidCallback onTap; + + DrawerItem( + {required this.title, + required this.icon, + required this.color, + required this.onTap}); +} + +// --- الويدجت الرئيسية للقائمة الجانبية --- +class AppDrawer extends StatelessWidget { + AppDrawer({super.key}); + + final ImageController imageController = Get.put(ImageController()); + + // 2. تعريف بيانات القائمة بشكل مركزي ومنظم + final List drawerItems = [ + DrawerItem( + title: 'Balance'.tr, + icon: Icons.account_balance_wallet, + color: Colors.green, + onTap: () => Get.to(() => WalletCaptainRefactored())), + DrawerItem( + title: 'Statistics'.tr, + icon: Icons.bar_chart_rounded, + color: Colors.deepPurple, + onTap: () => Get.to(() => StatisticsDashboard())), + DrawerItem( + title: 'Challenges'.tr, + icon: Icons.bolt_rounded, + color: Colors.amber, + onTap: () => Get.to(() => ChallengesPage())), + DrawerItem( + title: 'My Schedule'.tr, + icon: Icons.calendar_today_rounded, + color: Colors.teal, + onTap: () => Get.to(() => SchedulePage())), + DrawerItem( + title: 'Leaderboard'.tr, + icon: Icons.leaderboard_rounded, + color: Colors.red, + onTap: () => Get.to(() => LeaderboardPage())), + DrawerItem( + title: 'Profile'.tr, + icon: Icons.person, + color: Colors.blue, + onTap: () => Get.to(() => ProfileCaptain())), + DrawerItem( + title: 'History of Trip'.tr, + icon: Icons.history, + color: Colors.orange, + onTap: () => Get.to(() => const HistoryCaptain())), + DrawerItem( + title: 'Available for rides'.tr, + icon: Icons.drive_eta, + color: Colors.teal, + onTap: () => Get.to(() => const AvailableRidesPage())), + DrawerItem( + title: 'Notifications'.tr, + icon: Icons.notifications, + color: Colors.purple, + onTap: () => Get.to(() => const NotificationCaptain())), + DrawerItem( + title: 'Helping Center'.tr, + icon: Icons.help_center, + color: Colors.cyan, + onTap: () => Get.to(() => HelpCaptain())), + DrawerItem( + title: 'Invite Driver'.tr, + icon: Icons.person_add_rounded, + color: Colors.indigo, + onTap: () => Get.to(() => InviteScreen())), + // DrawerItem( + // title: 'Maintenance Center'.tr, + // icon: Icons.build, + // color: Colors.brown, + // onTap: () => Get.to(() => MaintainCenterPage())), + // DrawerItem( + // title: 'Health Insurance'.tr, + // icon: Icons.favorite, + // color: Colors.pink, + // onTap: () => Get.to(() => AssuranceHealthPage())), + DrawerItem( + title: 'Contact Us'.tr, + icon: Icons.email, + color: Colors.blueGrey, + onTap: () => Get.to(() => ContactUsPage())), + DrawerItem( + title: 'Videos Tutorials'.tr, + icon: Icons.video_library, + color: Colors.redAccent, + onTap: () => Get.to(() => VideoListPage())), + DrawerItem( + title: 'Rate Our App'.tr, + icon: Icons.star, + color: Colors.amber, + onTap: () => Get.to(() => RatingScreen())), + DrawerItem( + title: 'Is device compatible'.tr, + icon: Icons.memory, + color: Colors.greenAccent, + onTap: () => Get.to(() => DeviceCompatibilityPage())), + DrawerItem( + title: 'Privacy Policy'.tr, + icon: Icons.memory, + color: Colors.greenAccent, + onTap: () => + launchUrl(Uri.parse('${AppLink.server}/privacy_policy.php'))), + DrawerItem( + title: 'Settings'.tr, + icon: Icons.settings, + color: Colors.grey.shade600, + onTap: () => Get.to(() => const SettingsCaptain())), + ]; + + @override + Widget build(BuildContext context) { + return Drawer( + child: Container( + color: Theme.of(context).scaffoldBackgroundColor, + child: Column( + children: [ + // --- الجزء العلوي من القائمة (بيانات المستخدم) --- + UserHeader(), // استخدمنا الويدجت المحسنة بالأسفل + + // --- قائمة العناصر المتحركة --- + Expanded( + child: AnimationLimiter( + child: ListView.builder( + padding: const EdgeInsets.all(8.0), + itemCount: drawerItems.length + 1, // +1 لزر تسجيل الخروج + itemBuilder: (BuildContext context, int index) { + // --- زر تسجيل الخروج في النهاية --- + if (index == drawerItems.length) { + return AnimationConfiguration.staggeredList( + position: index, + duration: const Duration(milliseconds: 375), + child: SlideAnimation( + verticalOffset: 50.0, + child: FadeInAnimation( + child: _DrawerItemTile( + item: DrawerItem( + title: 'Sign Out'.tr, + icon: Icons.logout, + color: Colors.red, + onTap: () => + Get.to(() => const LogoutCaptain())), + ), + ), + ), + ); + } + + // --- بقية العناصر --- + final item = drawerItems[index]; + return AnimationConfiguration.staggeredList( + position: index, + duration: const Duration(milliseconds: 375), + child: SlideAnimation( + verticalOffset: 50.0, + child: FadeInAnimation( + child: _DrawerItemTile(item: item), + ), + ), + ); + }, + ), + ), + ), + ], + ), + ), + ); + } +} + +// --- ويدجت خاصة بكل عنصر في القائمة --- +class _DrawerItemTile extends StatelessWidget { + final DrawerItem item; + const _DrawerItemTile({required this.item}); + + @override + Widget build(BuildContext context) { + return Padding( + padding: const EdgeInsets.symmetric(vertical: 4.0), + child: ListTile( + leading: Container( + padding: const EdgeInsets.all(8), + decoration: BoxDecoration( + color: item.color.withValues(alpha: 0.1), + shape: BoxShape.circle, + ), + child: Icon(item.icon, color: item.color, size: 24), + ), + title: Text( + item.title, + style: Theme.of(context) + .textTheme + .titleMedium + ?.copyWith(fontWeight: FontWeight.w500), + ), + onTap: () { + Navigator.pop(context); // لإغلاق القائمة عند الضغط بشكل آمن + Future.delayed(const Duration(milliseconds: 250), () { + item.onTap(); // الانتقال للصفحة بعد تأخير بسيط لإظهار الأنيميشن + }); + }, + shape: RoundedRectangleBorder(borderRadius: BorderRadius.circular(12)), + splashColor: item.color.withValues(alpha: 0.2), + ), + ); + } +} + +// --- ويدجت محسنة للجزء العلوي من القائمة --- +// ... (الاستيرادات السابقة تبقى كما هي) + +// --- تم تعديل UserHeader لإضافة التحقق من الصورة --- +class UserHeader extends StatelessWidget { + UserHeader({super.key}); + final ImageController imageController = Get.find(); + final HomeCaptainController homeCaptainController = + Get.find(); + + // دالة لإظهار التنبيه + void _showUploadPhotoDialog( + BuildContext context, ImageController controller) { + // نستخدم addPostFrameCallback لضمان عدم ظهور الخطأ أثناء بناء الواجهة + WidgetsBinding.instance.addPostFrameCallback((_) { + // نتأكد ألا يكون هناك dialog مفتوح بالفعل لتجنب التكرار + if (Get.isDialogOpen == true) return; + + Get.defaultDialog( + title: "Profile Photo Required".tr, + titleStyle: + const TextStyle(color: Colors.red, fontWeight: FontWeight.bold), + middleText: + "Please upload a clear photo of your face to be identified by passengers." + .tr, + barrierDismissible: false, // منع الإغلاق بالضغط خارج النافذة + radius: 15, + contentPadding: const EdgeInsets.all(20), + confirm: ElevatedButton.icon( + onPressed: () { + Get.back(); // إغلاق النافذة الحالية + // فتح الكاميرا فوراً + controller.choosImagePicture( + AppLink.uploadImagePortrate, 'portrait'); + }, + icon: const Icon(Icons.camera_alt, color: Colors.white), + label: Text("Take Photo Now".tr, + style: const TextStyle(color: Colors.white)), + style: ElevatedButton.styleFrom( + backgroundColor: AppColor + .primaryColor, // تأكد من وجود هذا اللون أو استبدله بـ Colors.blue + padding: const EdgeInsets.symmetric(horizontal: 20, vertical: 10), + ), + ), + cancel: TextButton( + onPressed: () => Get.back(), + child: Text("Later".tr, style: const TextStyle(color: Colors.grey)), + ), + ); + }); + } + + @override + Widget build(BuildContext context) { + return UserAccountsDrawerHeader( + accountName: Text( + box.read(BoxName.nameDriver).toString(), + style: const TextStyle( + fontWeight: FontWeight.bold, + fontSize: 18, + shadows: [Shadow(blurRadius: 2, color: Colors.black26)]), + ), + accountEmail: + box.read(BoxName.emailDriver).toString().contains('intaleqapp') + ? Text('Your email not updated yet'.tr) + : Text(box.read(BoxName.emailDriver)), + currentAccountPicture: GetBuilder( + builder: (controller) => Stack( + clipBehavior: Clip.none, + children: [ + Container( + decoration: BoxDecoration( + shape: BoxShape.circle, + border: Border.all(color: Colors.white, width: 2), + boxShadow: [ + BoxShadow(color: Colors.black.withValues(alpha: 0.3), blurRadius: 5) + ], + ), + child: controller.isloading + ? const CircularProgressIndicator(color: Colors.white) + : CircleAvatar( + backgroundImage: NetworkImage((box + .read(BoxName.driverPhotoUrl) + ?.toString() + .isNotEmpty == + true) + ? box.read(BoxName.driverPhotoUrl) + : '${AppLink.server}/portrate_captain_image/${box.read(BoxName.driverID)}.jpg'), + + // [تعديل هام]: في حال فشل تحميل الصورة (غير موجودة) + onBackgroundImageError: (exception, stackTrace) { + // طباعة الخطأ في الكونسول للتوضيح + debugPrint( + "Profile image not found or error loading: $exception"); + // استدعاء نافذة التنبيه + _showUploadPhotoDialog(context, controller); + }, + + // أيقونة بديلة تظهر في الخلفية إذا لم تكن الصورة موجودة + backgroundColor: Colors.grey.shade300, + child: const Icon(Icons.person, + size: 40, color: Colors.white), + ), + ), + Positioned( + bottom: -5, + right: -5, + child: InkWell( + onTap: () => controller.choosImagePicture( + AppLink.uploadImagePortrate, 'portrait'), + child: Container( + padding: const EdgeInsets.all(4), + decoration: const BoxDecoration( + color: Colors.white, + shape: BoxShape.circle, + ), + child: Icon(Icons.camera_alt, + color: Theme.of(context).primaryColor, size: 18), + ), + ), + ), + ], + ), + ), + otherAccountsPictures: [ + SizedBox( + width: 60, + child: Row( + mainAxisAlignment: MainAxisAlignment.end, + children: [ + Text( + homeCaptainController.rating.toString(), + style: const TextStyle( + color: Colors.white, + fontWeight: FontWeight.bold, + fontSize: 14), + ), + const SizedBox(width: 2), + const Icon(Icons.star, color: Colors.amber, size: 16), + ], + ), + ), + ], + decoration: BoxDecoration( + gradient: LinearGradient( + colors: [Theme.of(context).primaryColor, Colors.blue.shade700], + begin: Alignment.topLeft, + end: Alignment.bottomRight, + ), + ), + ); + } +} diff --git a/siro_driver/lib/views/home/Captin/home_captain/driver_call_page.dart b/siro_driver/lib/views/home/Captin/home_captain/driver_call_page.dart new file mode 100755 index 0000000..be60a92 --- /dev/null +++ b/siro_driver/lib/views/home/Captin/home_captain/driver_call_page.dart @@ -0,0 +1,189 @@ +// import 'dart:async'; +// import 'package:SEFER/constant/box_name.dart'; +// import 'package:SEFER/main.dart'; +// import 'package:SEFER/views/widgets/my_scafold.dart'; +// import 'package:flutter/material.dart'; +// import 'package:get/get.dart'; +// import 'package:permission_handler/permission_handler.dart'; + +// import 'package:agora_rtc_engine/agora_rtc_engine.dart'; + +// import '../../../../constant/api_key.dart'; +// import '../../../../controller/functions/crud.dart'; + +// String appId = AK.agoraAppId; + +// class DriverCallPage extends StatefulWidget { +// const DriverCallPage({super.key}); + +// @override +// State createState() => _DriverCallPageState(); +// } + +// class _DriverCallPageState extends State { +// String channelName = ''; +// String token = ''; +// // "00612994c6e707543e68d5638894d04f989IAAlydoFEC3ZeZkeUwl0dSswZTX8n+xyZR8PBWdwXFV6t6MLiA8AAAAAEACCHD/gn3TUZQEAAQAAAAAA"; + +// // int uid = int.parse(box.read(BoxName.phoneDriver)); // uid of the local user +// int uid = 0; +// int? _remoteUid; // uid of the remote user +// bool _isJoined = false; // Indicates if the local user has joined the channel +// late RtcEngine agoraEngine; // Agora engine instance + +// final GlobalKey scaffoldMessengerKey = +// GlobalKey(); // Global key to access the scaffold + +// showMessage(String message) { +// scaffoldMessengerKey.currentState?.showSnackBar(SnackBar( +// content: Text(message), +// )); +// } + +// initAgora() async { +// await fetchToken(); +// await setupVoiceSDKEngine(); +// } + +// fetchToken() async { +// var res = await CRUD() +// .getAgoraToken(channelName: channelName, uid: uid.toString()); +// setState(() { +// token = res; +// }); +// } + +// @override +// void initState() { +// super.initState(); +// _remoteUid = box.read(BoxName.phone) != null +// ? int.parse(box.read(BoxName.phone)) +// : int.parse(box.read(BoxName.phoneDriver)); +// uid = box.read(BoxName.phoneDriver) != null +// ? int.parse(box.read(BoxName.phoneDriver)) +// : int.parse(box.read(BoxName.phone)); +// // Set up an instance of Agora engine +// initAgora(); +// } + +// Future setupVoiceSDKEngine() async { +// // retrieve or request microphone permission +// await [Permission.microphone].request(); + +// //create an instance of the Agora engine +// agoraEngine = createAgoraRtcEngine(); +// await agoraEngine.initialize(RtcEngineContext(appId: AK.agoraAppId)); +// // Register the event handler +// agoraEngine.registerEventHandler( +// RtcEngineEventHandler( +// onJoinChannelSuccess: (RtcConnection connection, int elapsed) { +// showMessage( +// "Local user uid:${connection.localUid} joined the channel"); +// setState(() { +// _isJoined = true; +// }); +// }, +// onUserJoined: (RtcConnection connection, int remoteUid, int elapsed) { +// showMessage("Remote user uid:$remoteUid joined the channel"); +// setState(() { +// _remoteUid = remoteUid; +// }); +// }, +// onUserOffline: (RtcConnection connection, int remoteUid, +// UserOfflineReasonType reason) { +// showMessage("Remote user uid:$remoteUid left the channel"); +// setState(() { +// _remoteUid = null; +// }); +// }, +// ), +// ); +// } + +// void join() async { +// // Set channel options including the client role and channel profile +// ChannelMediaOptions options = const ChannelMediaOptions( +// clientRoleType: ClientRoleType.clientRoleBroadcaster, +// channelProfile: ChannelProfileType.channelProfileCommunication, +// ); + +// await agoraEngine.joinChannel( +// token: token, +// channelId: channelName, +// options: options, +// uid: uid, +// ); +// } +// //https://console.agora.io/invite?sign=5e9e22d06f22caeeada9954c9e908572%253A5ba8aed978a35eab5a5113742502ded2a41478b2a81cb19c71a30776e125b58a + +// void leave() { +// setState(() { +// _isJoined = false; +// _remoteUid = null; +// }); +// agoraEngine.leaveChannel(); +// } + +// // Clean up the resources when you leave +// @override +// void dispose() async { +// await agoraEngine.leaveChannel(); +// super.dispose(); +// } + +// // Build UI +// @override +// Widget build(BuildContext context) { +// return MaterialApp( +// scaffoldMessengerKey: scaffoldMessengerKey, +// home: MyScafolld( +// // appBar: AppBar( +// // title: const Text('Get started with Voice Calling'), +// // ), +// title: 'Voice Calling'.tr, +// isleading: true, +// body: [ +// ListView( +// padding: const EdgeInsets.symmetric(horizontal: 16, vertical: 4), +// children: [ +// // Status text +// Container(height: 40, child: Center(child: _status())), +// // Button Row +// Row( +// children: [ +// Expanded( +// child: ElevatedButton( +// child: const Text("Join"), +// onPressed: () => {join()}, +// ), +// ), +// const SizedBox(width: 10), +// Expanded( +// child: ElevatedButton( +// child: const Text("Leave"), +// onPressed: () => {leave()}, +// ), +// ), +// ], +// ), +// ], +// ), +// ]), +// ); +// } + +// Widget _status() { +// String statusText; + +// if (!_isJoined) +// statusText = 'Join a channel'; +// else if (_remoteUid == null) +// statusText = 'Waiting for a remote user to join...'; +// else +// statusText = 'Connected to remote user, uid:$_remoteUid'; + +// return Text( +// statusText, +// ); +// } +// } diff --git a/siro_driver/lib/views/home/Captin/home_captain/help_captain.dart b/siro_driver/lib/views/home/Captin/home_captain/help_captain.dart new file mode 100755 index 0000000..c18827f --- /dev/null +++ b/siro_driver/lib/views/home/Captin/home_captain/help_captain.dart @@ -0,0 +1,331 @@ +import 'package:flutter/material.dart'; +import 'package:get/get.dart'; +import 'package:siro_driver/controller/home/captin/help/help_controller.dart'; +import 'package:siro_driver/views/home/Captin/home_captain/help_details_replay_page.dart'; + +import 'package:flutter/cupertino.dart'; + +import '../../../../constant/colors.dart'; +import '../../../../controller/functions/encrypt_decrypt.dart'; +import '../../../widgets/my_scafold.dart'; + +class HelpCaptain extends StatelessWidget { + HelpCaptain({super.key}); + + @override + Widget build(BuildContext context) { + Get.put(HelpController()); + final theme = Theme.of(context); + + return MyScafolld( + title: 'Helping Page'.tr, + isleading: true, + body: [ + SingleChildScrollView( + padding: const EdgeInsets.all(20.0), + child: Column( + crossAxisAlignment: CrossAxisAlignment.stretch, + children: [ + Container( + padding: const EdgeInsets.all(18.0), + decoration: BoxDecoration( + color: theme.colorScheme.surfaceVariant.withOpacity(0.5), + borderRadius: BorderRadius.circular(15.0), + border: Border.all(color: theme.dividerColor), + ), + child: Text( + 'If you need any help or have questions, this is the right place to do that. You are welcome!' + .tr, + style: theme.textTheme.bodyLarge, + textAlign: TextAlign.center, + ), + ), + const SizedBox(height: 24), + Text( + 'Submit Your Question'.tr, + style: theme.textTheme.titleMedium + ?.copyWith(fontWeight: FontWeight.bold), + ), + const SizedBox(height: 12), + GetBuilder( + builder: (helpController) => Form( + key: helpController.formKey, + child: Column( + children: [ + TextFormField( + controller: helpController.helpQuestionController, + decoration: InputDecoration( + hintText: 'Enter your Question here'.tr, + prefixIcon: + const Icon(Icons.question_answer_outlined), + border: OutlineInputBorder( + borderRadius: BorderRadius.circular(12)), + ), + maxLines: 3, + validator: (value) { + if (value == null || value.isEmpty) { + return 'Please enter your question'.tr; + } + return null; + }, + ), + const SizedBox(height: 16), + helpController.isLoading + ? const Center(child: CircularProgressIndicator()) + : SizedBox( + width: double.infinity, + child: ElevatedButton( + onPressed: () { + if (helpController.formKey.currentState! + .validate()) { + helpController.addHelpQuestion(); + helpController.helpQuestionController + .clear(); + } + }, + style: ElevatedButton.styleFrom( + backgroundColor: AppColor.primaryColor, + foregroundColor: Colors.white, + padding: + const EdgeInsets.symmetric(vertical: 14), + shape: RoundedRectangleBorder( + borderRadius: BorderRadius.circular(12)), + ), + child: Text('Submit Question'.tr), + ), + ), + ], + ), + ), + ), + const SizedBox(height: 32), + Text( + 'Your Questions'.tr, + style: theme.textTheme.titleMedium + ?.copyWith(fontWeight: FontWeight.bold), + ), + const SizedBox(height: 12), + GetBuilder( + builder: (helpController) { + final questions = helpController.helpQuestionDate['message']; + if (questions == null || questions.isEmpty) { + return Center( + child: Padding( + padding: const EdgeInsets.all(20.0), + child: Text('No questions asked yet.'.tr), + ), + ); + } + return ListView.separated( + shrinkWrap: true, + physics: const NeverScrollableScrollPhysics(), + itemCount: questions.length, + separatorBuilder: (context, index) => + const SizedBox(height: 12), + itemBuilder: (context, index) { + var list = questions[index]; + return Card( + elevation: 0, + shape: RoundedRectangleBorder( + borderRadius: BorderRadius.circular(12), + side: BorderSide(color: theme.dividerColor), + ), + child: ListTile( + title: Text( + EncryptionHelper.instance + .decryptData(list['helpQuestion']), + style: const TextStyle(fontWeight: FontWeight.w500), + maxLines: 2, + overflow: TextOverflow.ellipsis, + ), + subtitle: Text( + list['datecreated'], + style: theme.textTheme.bodySmall, + ), + trailing: + const Icon(Icons.arrow_forward_ios, size: 16), + onTap: () { + helpController.getIndex( + int.parse(EncryptionHelper.instance + .decryptData(list['id'])), + EncryptionHelper.instance + .decryptData(list['helpQuestion'])); + helpController.getHelpRepley(list['id'].toString()); + Get.to(() => const HelpDetailsReplayPage()); + }, + ), + ); + }, + ); + }, + ), + ], + ), + ), + ], + ); + } +} + +// class HelpCaptain extends StatelessWidget { +// HelpCaptain({super.key}); + +// @override +// Widget build(BuildContext context) { +// Get.put(HelpController()); +// return CupertinoPageScaffold( +// navigationBar: CupertinoNavigationBar( +// middle: Text('Helping Page'.tr), +// leading: CupertinoButton( +// padding: EdgeInsets.zero, +// child: Icon(CupertinoIcons.back), +// onPressed: () => Navigator.pop(context), +// ), +// ), +// child: SafeArea( +// child: Padding( +// padding: const EdgeInsets.all(16.0), +// child: Column( +// children: [ +// Padding( +// padding: const EdgeInsets.symmetric(vertical: 12.0), +// child: Container( +// padding: const EdgeInsets.all(16.0), +// decoration: BoxDecoration( +// borderRadius: BorderRadius.circular(12.0), +// border: Border.all( +// color: CupertinoColors.systemGrey2, +// ), +// ), +// child: Text( +// 'If you need any help or have questions, this is the right place to do that. You are welcome!' +// .tr, +// style: CupertinoTheme.of(context).textTheme.textStyle, +// textAlign: TextAlign.center, +// ), +// ), +// ), +// Card( +// elevation: 3, +// color: CupertinoColors.systemGrey6, +// shape: RoundedRectangleBorder( +// borderRadius: BorderRadius.circular(12.0), +// ), +// child: Padding( +// padding: const EdgeInsets.all(16.0), +// child: GetBuilder( +// builder: (helpController) => Form( +// key: helpController.formKey, +// child: Column( +// children: [ +// CupertinoTextField( +// controller: helpController.helpQuestionController, +// placeholder: 'Enter your Question here'.tr, +// decoration: BoxDecoration( +// borderRadius: BorderRadius.circular(12), +// border: Border.all( +// color: CupertinoColors.systemGrey, +// ), +// ), +// padding: const EdgeInsets.all(16), +// clearButtonMode: OverlayVisibilityMode.editing, +// ), +// const SizedBox(height: 20), +// helpController.isLoading +// ? const CupertinoActivityIndicator() +// : CupertinoButton.filled( +// onPressed: () { +// if (helpController.formKey.currentState! +// .validate()) { +// helpController.addHelpQuestion(); + +// // Clear the feedback form +// helpController.formKey.currentState! +// .reset(); +// } +// }, +// child: Text('Submit Question'.tr), +// ), +// ], +// ), +// ), +// ), +// ), +// ), +// const SizedBox(height: 20), +// Expanded( +// child: GetBuilder( +// builder: (helpController) => Padding( +// padding: const EdgeInsets.all(10), +// child: Container( +// decoration: BoxDecoration( +// border: Border.all( +// color: CupertinoColors.systemGrey2, +// ), +// borderRadius: BorderRadius.circular(12.0), +// ), +// child: ListView.builder( +// itemCount: helpController.helpQuestionDate['message'] != +// null +// ? helpController.helpQuestionDate['message'].length +// : 0, +// itemBuilder: (BuildContext context, int index) { +// var list = +// helpController.helpQuestionDate['message'][index]; +// return Padding( +// padding: const EdgeInsets.all(3), +// child: Container( +// padding: const EdgeInsets.symmetric( +// vertical: 12, horizontal: 16), +// decoration: BoxDecoration( +// border: Border.all( +// color: CupertinoColors.activeGreen, +// width: 2, +// ), +// borderRadius: BorderRadius.circular(12), +// ), +// child: GestureDetector( +// onTap: () { +// helpController.getIndex( +// list['id'], list['helpQuestion']); +// helpController +// .getHelpRepley(list['id'].toString()); +// Get.to(() => const HelpDetailsReplayPage()); +// }, +// child: Row( +// mainAxisAlignment: +// MainAxisAlignment.spaceBetween, +// children: [ +// Expanded( +// child: Text( +// list['helpQuestion'], +// style: CupertinoTheme.of(context) +// .textTheme +// .textStyle, +// overflow: TextOverflow.ellipsis, +// ), +// ), +// Text( +// list['datecreated'], +// style: CupertinoTheme.of(context) +// .textTheme +// .tabLabelTextStyle, +// ), +// ], +// ), +// ), +// ), +// ); +// }, +// ), +// ), +// ), +// ), +// ), +// ], +// ), +// ), +// ), +// ); +// } +// } diff --git a/siro_driver/lib/views/home/Captin/home_captain/help_details_replay_page.dart b/siro_driver/lib/views/home/Captin/home_captain/help_details_replay_page.dart new file mode 100755 index 0000000..be5662d --- /dev/null +++ b/siro_driver/lib/views/home/Captin/home_captain/help_details_replay_page.dart @@ -0,0 +1,110 @@ +import 'package:flutter/material.dart'; +import 'package:get/get.dart'; +import 'package:siro_driver/constant/style.dart'; +import 'package:siro_driver/views/widgets/mycircular.dart'; + +import '../../../../controller/functions/encrypt_decrypt.dart'; +import '../../../../controller/home/captin/help/help_controller.dart'; +import '../../../widgets/my_scafold.dart'; + +class HelpDetailsReplayPage extends StatelessWidget { + const HelpDetailsReplayPage({super.key}); + + @override + Widget build(BuildContext context) { + Get.find(); + return GetBuilder( + builder: (helpController) => MyScafolld( + title: 'Help Details'.tr, + body: [ + helpController.isLoading + ? const MyCircularProgressIndicator() + : Padding( + padding: const EdgeInsets.all(16.0), + child: Column( + children: [ + // Question Bubble (Aligned to Start/End based on locale, usually start for sender) + Align( + alignment: AlignmentDirectional.centerStart, + child: Container( + constraints: BoxConstraints(maxWidth: Get.width * 0.75), + padding: const EdgeInsets.all(12), + decoration: BoxDecoration( + color: Theme.of(context).colorScheme.primaryContainer, + borderRadius: const BorderRadius.only( + topRight: Radius.circular(16), + bottomLeft: Radius.circular(16), + bottomRight: Radius.circular(16), + ), + ), + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Text( + 'Your Question'.tr, + style: Theme.of(context).textTheme.labelSmall?.copyWith( + color: Theme.of(context).colorScheme.primary, + fontWeight: FontWeight.bold, + ), + ), + const SizedBox(height: 4), + Text( + helpController.qustion, + style: Theme.of(context).textTheme.bodyLarge, + ), + ], + ), + ), + ), + const SizedBox(height: 24), + // Reply Bubble (Aligned to opposite side) + Align( + alignment: AlignmentDirectional.centerEnd, + child: Container( + constraints: BoxConstraints(maxWidth: Get.width * 0.75), + padding: const EdgeInsets.all(12), + decoration: BoxDecoration( + color: Theme.of(context).colorScheme.secondaryContainer, + borderRadius: const BorderRadius.only( + topLeft: Radius.circular(16), + bottomLeft: Radius.circular(16), + bottomRight: Radius.circular(16), + ), + ), + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Text( + 'Support Reply'.tr, + style: Theme.of(context).textTheme.labelSmall?.copyWith( + color: Theme.of(context).colorScheme.secondary, + fontWeight: FontWeight.bold, + ), + ), + const SizedBox(height: 4), + Builder(builder: (context) { + final replayData = helpController.helpQuestionRepleyDate['message']; + final isNoReply = helpController.status == 'not yet' || + replayData == null || + EncryptionHelper.instance.decryptData(replayData['replay']).toString() == 'not yet'; + + return Text( + isNoReply + ? 'No Response yet.'.tr + : EncryptionHelper.instance.decryptData(replayData['replay']).toString(), + style: Theme.of(context).textTheme.bodyLarge, + ); + }), + ], + ), + ), + ), + ], + ), + ) + + ], + isleading: true, + )); + } +} diff --git a/siro_driver/lib/views/home/Captin/home_captain/home_captin.dart b/siro_driver/lib/views/home/Captin/home_captain/home_captin.dart new file mode 100755 index 0000000..e18cd6d --- /dev/null +++ b/siro_driver/lib/views/home/Captin/home_captain/home_captin.dart @@ -0,0 +1,672 @@ +import 'dart:io'; + +import 'package:bubble_head/bubble.dart'; +import 'package:intaleq_maps/intaleq_maps.dart'; +import 'package:flutter/material.dart'; +import 'package:flutter/services.dart'; +import 'package:get/get.dart'; +import 'package:flutter_font_icons/flutter_font_icons.dart'; +import 'package:siro_driver/views/home/Captin/home_captain/drawer_captain.dart'; +import 'package:siro_driver/views/widgets/mycircular.dart'; + +import '../../../../constant/box_name.dart'; +import '../../../../constant/colors.dart'; +import '../../../../constant/info.dart'; +import '../../../../controller/functions/location_controller.dart'; +import '../../../../controller/functions/overlay_permisssion.dart'; +import '../../../../controller/functions/package_info.dart'; +import '../../../../controller/home/captin/home_captain_controller.dart'; +import '../../../../controller/home/captin/map_driver_controller.dart'; +import '../../../../controller/home/navigation/navigation_view.dart'; +import '../../../../controller/profile/setting_controller.dart'; +import '../../../../env/env.dart'; +import '../../../../main.dart'; +import '../../../notification/available_rides_page.dart'; +import '../driver_map_page.dart'; +import 'widget/connect.dart'; +import 'widget/left_menu_map_captain.dart'; + +// ───────────────────────────────────────────── +// Design Tokens (Responsive to Theme) +// ───────────────────────────────────────────── +class _Token { + static Color surface(BuildContext context) => + Theme.of(context).brightness == Brightness.dark + ? const Color(0xFF1A1A2E) + : Colors.white; + + static Color surfaceCard(BuildContext context) => + Theme.of(context).brightness == Brightness.dark + ? const Color(0xFF16213E) + : const Color(0xFFF8F9FA); + + static const Color accent = Color(0xFFF0A500); + static Color accentSoft(BuildContext context) => + const Color(0xFFF0A500).withOpacity(0.12); + static const Color danger = Color(0xFFE53935); + static const Color success = Color(0xFF2ECC71); + static const Color info = Color(0xFF3498DB); + + static Color border(BuildContext context) => + Theme.of(context).brightness == Brightness.dark + ? const Color(0xFF2A2A4A) + : Colors.grey.withOpacity(0.2); + + static Color text(BuildContext context) => + Theme.of(context).brightness == Brightness.dark + ? Colors.white + : const Color(0xFF2D3436); + + static Color textDim(BuildContext context) => + Theme.of(context).brightness == Brightness.dark + ? Colors.white38 + : Colors.black45; + + static const double radius = 16.0; + static const double radiusSm = 10.0; +} + +// ───────────────────────────────────────────── +// Root Widget +// ───────────────────────────────────────────── +class HomeCaptain extends StatelessWidget { + HomeCaptain({super.key}); + + final LocationController locationController = + Get.put(LocationController(), permanent: true); + final HomeCaptainController homeCaptainController = + Get.put(HomeCaptainController(), permanent: true); + + @override + Widget build(BuildContext context) { + WidgetsBinding.instance.addPostFrameCallback((_) async { + await closeOverlayIfFound(); + if (!context.mounted) return; + await checkForUpdate(context); + if (!context.mounted) return; + await getPermissionOverlay(); + if (!context.mounted) return; + await showDriverGiftClaim(context); + if (!context.mounted) return; + await checkForAppliedRide(context); + }); + + return Scaffold( + extendBodyBehindAppBar: true, + backgroundColor: _Token.surface(context), + appBar: const _HomeAppBar(), + drawer: AppDrawer(), + body: SafeArea( + top: false, + child: Stack( + children: [ + const _MapView(), + leftMainMenuCaptainIcons(), + const _BottomStatusBar(), + const _FloatingControls(), + ], + ), + ), + ); + } +} + +// ───────────────────────────────────────────── +// AppBar — no blur, solid gradient +// ───────────────────────────────────────────── +class _HomeAppBar extends StatelessWidget implements PreferredSizeWidget { + const _HomeAppBar(); + + @override + Size get preferredSize => const Size.fromHeight(kToolbarHeight); + + @override + Widget build(BuildContext context) { + final ctrl = Get.find(); + + return AppBar( + backgroundColor: _Token.surface(context), + elevation: 0, + systemOverlayStyle: SystemUiOverlayStyle.light, + titleSpacing: 0, + // ── Logo + App Name ────────────────────── + title: Padding( + padding: const EdgeInsets.only(left: 4), + child: Row( + children: [ + _LogoBadge(), + const SizedBox(width: 10), + Text( + AppInformation.appName.split(' ')[0].tr, + style: const TextStyle( + color: _Token.accent, + fontSize: 20, + fontWeight: FontWeight.w800, + letterSpacing: 0.8, + ), + ), + ], + ), + ), + actions: [ + // ── Refuse Counter ─────────────────── + GetBuilder( + builder: (c) => _PillBadge( + icon: Icons.block_rounded, + label: c.countRefuse.toString(), + color: _Token.danger, + ), + ), + const SizedBox(width: 6), + // ── Map Controls Row ───────────────── + _AppBarControls(ctrl: ctrl), + const SizedBox(width: 8), + ], + ); + } +} + +class _LogoBadge extends StatelessWidget { + @override + Widget build(BuildContext context) => Container( + width: 36, + height: 36, + decoration: BoxDecoration( + color: _Token.surfaceCard(context), + shape: BoxShape.circle, + border: Border.all(color: _Token.accent, width: 1.5), + ), + child: ClipOval( + child: Image.asset('assets/images/logo.gif', fit: BoxFit.cover), + ), + ); +} + +class _PillBadge extends StatelessWidget { + final IconData icon; + final String label; + final Color color; + const _PillBadge( + {required this.icon, required this.label, required this.color}); + + @override + Widget build(BuildContext context) => Container( + padding: const EdgeInsets.symmetric(horizontal: 8, vertical: 4), + decoration: BoxDecoration( + color: color.withOpacity(0.12), + borderRadius: BorderRadius.circular(20), + border: Border.all(color: color.withOpacity(0.35)), + ), + child: Row( + mainAxisSize: MainAxisSize.min, + children: [ + Icon(icon, color: color, size: 13), + const SizedBox(width: 4), + Text( + label, + style: TextStyle( + color: color, fontWeight: FontWeight.bold, fontSize: 13), + ), + ], + ), + ); +} + +class _AppBarControls extends StatelessWidget { + final HomeCaptainController ctrl; + const _AppBarControls({required this.ctrl}); + + @override + Widget build(BuildContext context) => Container( + padding: const EdgeInsets.symmetric(horizontal: 4, vertical: 4), + decoration: BoxDecoration( + color: _Token.surfaceCard(context), + borderRadius: BorderRadius.circular(_Token.radiusSm), + border: Border.all(color: _Token.border(context)), + ), + child: Row( + mainAxisSize: MainAxisSize.min, + children: [ + // Navigation + _IconBtn( + icon: Icons.map_rounded, + color: _Token.success, + tooltip: 'Navigation'.tr, + onTap: () => Get.to(() => const NavigationView()), + ), + // Heatmap + GetBuilder( + builder: (c) => _IconBtn( + icon: Icons.local_fire_department_rounded, + color: + c.isHeatmapVisible ? Colors.orange : Colors.grey.shade600, + tooltip: 'Heatmap'.tr, + onTap: c.toggleHeatmap, + ), + ), + // Center on me + _IconBtn( + icon: Icons.my_location_rounded, + color: _Token.accent, + tooltip: 'My Location'.tr, + onTap: () { + ctrl.mapHomeCaptainController?.animateCamera( + CameraUpdate.newLatLngZoom( + Get.find().myLocation, + 17.5, + ), + ); + }, + ), + ], + ), + ); +} + +class _IconBtn extends StatelessWidget { + final IconData icon; + final Color color; + final String tooltip; + final VoidCallback onTap; + const _IconBtn( + {required this.icon, + required this.color, + required this.tooltip, + required this.onTap}); + + @override + Widget build(BuildContext context) => Tooltip( + message: tooltip, + child: InkWell( + onTap: onTap, + borderRadius: BorderRadius.circular(8), + child: Padding( + padding: const EdgeInsets.symmetric(horizontal: 9, vertical: 6), + child: Icon(icon, color: color, size: 20), + ), + ), + ); +} + +// ───────────────────────────────────────────── +// Map View +// ───────────────────────────────────────────── +class _MapView extends StatelessWidget { + const _MapView(); + + @override + Widget build(BuildContext context) { + return GetBuilder( + builder: (ctrl) { + if (ctrl.isLoading) return const MyCircularProgressIndicator(); + + return GetBuilder( + builder: (s) => GetBuilder( + builder: (loc) => IntaleqMap( + apiKey: Env.mapSaasKey, + onMapCreated: ctrl.onMapCreated, + minMaxZoomPreference: const MinMaxZoomPreference(6, 18), + initialCameraPosition: CameraPosition( + target: (loc.myLocation.latitude == 0 || + loc.myLocation.latitude.isNaN) + ? ctrl.myLocation + : loc.myLocation, + zoom: 15, + ), + mapType: + s.isMapDarkMode ? IntaleqMapType.normal : IntaleqMapType.light, + polygons: ctrl.heatmapPolygons, + markers: { + Marker( + markerId: MarkerId('MyLocation'.tr), + position: loc.myLocation, + rotation: loc.heading, + flat: true, + anchor: const Offset(0.5, 0.5), + icon: ctrl.carIcon, + ) + }, + myLocationButtonEnabled: false, + myLocationEnabled: false, + compassEnabled: false, + zoomControlsEnabled: false, + ), + ), + ); + }, + ); + } +} + +// ───────────────────────────────────────────── +// Bottom Status Bar — no blur, solid card +// ───────────────────────────────────────────── +class _BottomStatusBar extends StatelessWidget { + const _BottomStatusBar(); + + @override + Widget build(BuildContext context) { + return Positioned( + bottom: 12, + left: 12, + right: 12, + child: GestureDetector( + onTap: () => _showDetailsSheet(context), + child: Container( + padding: const EdgeInsets.symmetric(horizontal: 14, vertical: 10), + decoration: BoxDecoration( + color: _Token.surfaceCard(context), + borderRadius: BorderRadius.circular(_Token.radius), + border: Border.all(color: _Token.border(context)), + boxShadow: [ + BoxShadow( + color: Colors.black.withOpacity(0.35), + blurRadius: 16, + offset: const Offset(0, 4), + ) + ], + ), + child: Row( + children: [ + // Online toggle + const ConnectWidget(), + const Spacer(), + // Ride count + GetBuilder( + builder: (c) => _StatChip( + icon: Icons.directions_car_rounded, + value: c.countRideToday, + label: 'Rides'.tr, + color: _Token.info, + ), + ), + const SizedBox(width: 14), + // Today earnings + GetBuilder( + builder: (c) => _StatChip( + icon: Entypo.wallet, + value: c.totalMoneyToday.toString(), + label: 'Today'.tr, + color: _Token.success, + ), + ), + // Chevron hint + const SizedBox(width: 8), + const Icon(Icons.keyboard_arrow_up_rounded, + color: Colors.grey, size: 18), + ], + ), + ), + ), + ); + } + + void _showDetailsSheet(BuildContext context) { + final ctrl = Get.find(); + showModalBottomSheet( + context: context, + backgroundColor: Colors.transparent, + builder: (_) => _DetailsSheet(ctrl), + ); + } +} + +class _StatChip extends StatelessWidget { + final IconData icon; + final String value; + final String label; + final Color color; + const _StatChip( + {required this.icon, + required this.value, + required this.label, + required this.color}); + + @override + Widget build(BuildContext context) => Column( + mainAxisSize: MainAxisSize.min, + children: [ + Row( + children: [ + Icon(icon, color: color, size: 16), + const SizedBox(width: 4), + Text( + value, + style: TextStyle( + color: Colors.white, + fontWeight: FontWeight.bold, + fontSize: 15), + ), + ], + ), + Text(label, + style: const TextStyle(color: Colors.white38, fontSize: 11)), + ], + ); +} + +// ───────────────────────────────────────────── +// Details Bottom Sheet — replaces AlertDialog +// ───────────────────────────────────────────── +class _DetailsSheet extends StatelessWidget { + final HomeCaptainController ctrl; + const _DetailsSheet(this.ctrl); + + @override + Widget build(BuildContext context) { + return Container( + decoration: BoxDecoration( + color: _Token.surfaceCard(context), + borderRadius: BorderRadius.circular(24), + ), + padding: const EdgeInsets.fromLTRB(20, 12, 20, 28), + child: Column( + mainAxisSize: MainAxisSize.min, + children: [ + // Drag handle + Container( + width: 36, + height: 4, + decoration: BoxDecoration( + color: _Token.border(context), + borderRadius: BorderRadius.circular(2)), + ), + const SizedBox(height: 16), + Text( + 'Your Activity'.tr, + style: TextStyle( + color: _Token.text(context), + fontSize: 18, + fontWeight: FontWeight.bold), + ), + const SizedBox(height: 16), + Divider(color: _Token.border(context), height: 1), + const SizedBox(height: 16), + _SheetRow( + icon: Entypo.wallet, + color: _Token.success, + label: 'Today'.tr, + value: ctrl.totalMoneyToday.toString(), + ), + const SizedBox(height: 12), + _SheetRow( + icon: Entypo.wallet, + color: _Token.accent, + label: AppInformation.appName, + value: ctrl.totalMoneyInSEFER.toString(), + ), + const SizedBox(height: 12), + Divider(color: _Token.border(context), height: 1), + const SizedBox(height: 12), + _SheetRow( + icon: Icons.timer_outlined, + color: _Token.success, + label: 'Active Duration'.tr, + value: ctrl.stringActiveDuration, + ), + const SizedBox(height: 12), + _SheetRow( + icon: Icons.access_time_rounded, + color: _Token.info, + label: 'Total Connection'.tr, + value: ctrl.totalDurationToday, + ), + const SizedBox(height: 12), + Divider(color: _Token.border(context), height: 1), + const SizedBox(height: 12), + _SheetRow( + icon: Icons.star_rounded, + color: _Token.accent, + label: 'Total Points'.tr, + value: ctrl.totalPoints.toString(), + ), + const SizedBox(height: 20), + SizedBox( + width: double.infinity, + child: TextButton( + onPressed: () => Get.back(), + style: TextButton.styleFrom( + backgroundColor: _Token.accentSoft(context), + shape: RoundedRectangleBorder( + borderRadius: BorderRadius.circular(_Token.radiusSm)), + padding: const EdgeInsets.symmetric(vertical: 12), + ), + child: Text('Close'.tr, + style: const TextStyle( + color: _Token.accent, fontWeight: FontWeight.bold)), + ), + ), + ], + ), + ); + } +} + +class _SheetRow extends StatelessWidget { + final IconData icon; + final Color color; + final String label; + final String value; + const _SheetRow( + {required this.icon, + required this.color, + required this.label, + required this.value}); + + @override + Widget build(BuildContext context) => Row( + children: [ + Icon(icon, color: color, size: 20), + const SizedBox(width: 12), + Text(label, + style: TextStyle(color: _Token.textDim(context), fontSize: 14)), + const Spacer(), + Text(value, + style: TextStyle( + color: color, fontSize: 16, fontWeight: FontWeight.bold)), + ], + ); +} + +// ───────────────────────────────────────────── +// Floating Action Buttons (right side) +// ───────────────────────────────────────────── +class _FloatingControls extends StatelessWidget { + const _FloatingControls({super.key}); + + @override + Widget build(BuildContext context) { + return Positioned( + bottom: 88, + right: 12, + child: GetBuilder( + builder: (ctrl) => Column( + children: [ + // Bubble/overlay mode (Android only) + if (Platform.isAndroid) ...[ + _Fab( + onTap: () => + Bubble().startBubbleHead(sendAppToBackground: true), + tooltip: 'Overlay'.tr, + child: Image.asset('assets/images/logo1.png', + width: 26, height: 26), + ), + const SizedBox(height: 10), + ], + // Available rides + _Fab( + onTap: () => Get.to(() => const AvailableRidesPage()), + icon: Icons.list_alt_rounded, + color: AppColor.primaryColor, + tooltip: 'Available Rides'.tr, + ), + // Continue active ride + if (box.read(BoxName.rideStatus) == 'Applied' || + box.read(BoxName.rideStatus) == 'Begin') ...[ + const SizedBox(height: 10), + _Fab( + onTap: () { + if (box.read(BoxName.rideStatus) == 'Applied') { + Get.to(() => PassengerLocationMapPage(), + arguments: box.read(BoxName.rideArguments)); + Get.put(MapDriverController()) + .changeRideToBeginToPassenger(); + } else { + Get.to(() => PassengerLocationMapPage(), + arguments: box.read(BoxName.rideArguments)); + Get.put(MapDriverController()).startRideFromStartApp(); + } + }, + icon: Icons.navigation_rounded, + color: _Token.info, + tooltip: 'Continue Ride'.tr, + ), + ], + ], + ), + ), + ); + } +} + +class _Fab extends StatelessWidget { + final VoidCallback onTap; + final IconData? icon; + final Widget? child; + final Color? color; + final String? tooltip; + const _Fab( + {required this.onTap, this.icon, this.child, this.color, this.tooltip}); + + @override + Widget build(BuildContext context) => Tooltip( + message: tooltip ?? '', + child: Material( + color: color ?? _Token.surfaceCard(context), + shape: const CircleBorder(), + elevation: 6, + shadowColor: (color ?? Colors.black).withOpacity(0.4), + child: InkWell( + onTap: onTap, + customBorder: const CircleBorder(), + child: SizedBox( + width: 52, + height: 52, + child: Center( + child: child ?? + Icon(icon, + color: color != null ? Colors.white : _Token.accent, + size: 24), + ), + ), + ), + ), + ); +} + +// ───────────────────────────────────────────── +// Helper +// ───────────────────────────────────────────── +Future checkForAppliedRide(BuildContext context) async { + checkForPendingOrderFromServer(); +} diff --git a/siro_driver/lib/views/home/Captin/home_captain/osm_view_map.dart b/siro_driver/lib/views/home/Captin/home_captain/osm_view_map.dart new file mode 100644 index 0000000..d1a59c7 --- /dev/null +++ b/siro_driver/lib/views/home/Captin/home_captain/osm_view_map.dart @@ -0,0 +1,50 @@ +import 'package:flutter/material.dart'; +import 'package:get/get.dart'; +import 'package:intaleq_maps/intaleq_maps.dart'; + +import '../../../../constant/api_key.dart'; +import '../../../../controller/functions/location_controller.dart'; +import '../../../../controller/home/captin/home_captain_controller.dart'; + +class OsmMapView extends StatelessWidget { + const OsmMapView({super.key}); + + @override + Widget build(BuildContext context) { + final LocationController locationController = + Get.find(); + final HomeCaptainController homeCaptainController = + Get.find(); + + return Obx(() { + final LatLng currentLocation = LatLng( + locationController.myLocation.latitude, + locationController.myLocation.longitude); + final double currentHeading = locationController.heading; + + return IntaleqMap( + apiKey: AK.mapSaasKey, + initialCameraPosition: CameraPosition( + target: currentLocation, + zoom: 15, + bearing: currentHeading, + ), + markers: { + Marker( + markerId: const MarkerId('myLocation'), + position: currentLocation, + rotation: currentHeading, + icon: homeCaptainController.carIcon, + anchor: const Offset(0.5, 0.5), + flat: true, + zIndex: 2, + ) + }, + onMapCreated: (IntaleqMapController controller) { + // You can assign this controller if needed + }, + ); + }); + } +} + diff --git a/siro_driver/lib/views/home/Captin/home_captain/widget/call_page.dart b/siro_driver/lib/views/home/Captin/home_captain/widget/call_page.dart new file mode 100755 index 0000000..91da0f3 --- /dev/null +++ b/siro_driver/lib/views/home/Captin/home_captain/widget/call_page.dart @@ -0,0 +1,84 @@ +// import 'package:SEFER/constant/colors.dart'; +// import 'package:SEFER/constant/style.dart'; +// import 'package:SEFER/controller/firebase/firbase_messge.dart'; +// import 'package:SEFER/controller/home/captin/map_driver_controller.dart'; +// import 'package:SEFER/views/widgets/my_scafold.dart'; +// import 'package:flutter/material.dart'; +// import 'package:get/get.dart'; +// import 'package:SEFER/controller/home/captin/home_captain_controller.dart'; + +// import '../../../../../controller/functions/call_controller.dart'; + +// class CallPage extends StatelessWidget { +// const CallPage({super.key}); + +// @override +// Widget build(BuildContext context) { +// return MyScafolld( +// title: 'Call Page'.tr, isleading: true, body: [callPage()]); +// } +// } + +// GetBuilder callPage() { +// CallController callController = Get.put(CallController()); +// Get.put(MapDriverController()); +// // callController.join(); +// return GetBuilder( +// builder: (controller) => Positioned( +// top: Get.height * .2, +// child: Container( +// height: 100, width: Get.width, +// decoration: AppStyle.boxDecoration, +// child: Row( +// mainAxisAlignment: MainAxisAlignment.spaceEvenly, +// children: [ +// GestureDetector( +// onTap: () async { +// callController.join(); +// }, +// child: Container( +// width: 50, +// height: 50, +// decoration: const BoxDecoration( +// shape: BoxShape.circle, color: AppColor.greenColor), +// child: const Icon( +// Icons.phone, +// size: 35, +// color: AppColor.secondaryColor, +// )), +// ), +// Column( +// children: [ +// Text(callController.status), +// Text(Get.find().passengerName.toString()), +// ], +// ), +// GestureDetector( +// onTap: () async { +// FirebaseMessagesController().sendNotificationToPassengerToken( +// 'Call End'.tr, +// 'Call End', +// Get.find().tokenPassenger, +// [], +// 'iphone_ringtone.wav'); +// callController.leave(); +// Get.back(); +// }, +// child: Container( +// width: 50, +// height: 50, +// decoration: const BoxDecoration( +// shape: BoxShape.circle, color: AppColor.redColor), +// child: const Icon( +// Icons.phone_disabled_sharp, +// size: 35, +// color: AppColor.secondaryColor, +// )), +// ) +// ], +// ), +// // ignore: prefer_const_constructors +// ), +// ), +// ); +// } diff --git a/siro_driver/lib/views/home/Captin/home_captain/widget/connect.dart b/siro_driver/lib/views/home/Captin/home_captain/widget/connect.dart new file mode 100755 index 0000000..33036dc --- /dev/null +++ b/siro_driver/lib/views/home/Captin/home_captain/widget/connect.dart @@ -0,0 +1,151 @@ +import 'package:siro_driver/controller/functions/tts.dart'; +import 'package:flutter/cupertino.dart'; +import 'package:flutter/material.dart'; +import 'package:get/get.dart'; +import 'package:siro_driver/controller/home/payment/captain_wallet_controller.dart'; + +import '../../../../../constant/style.dart'; +import '../../../../widgets/elevated_btn.dart'; +import '../../../../../controller/home/captin/home_captain_controller.dart'; + +class ConnectWidget extends StatelessWidget { + const ConnectWidget({ + super.key, + }); + + @override + Widget build(BuildContext context) { + // final OrderRequestController orderRequestController = + // Get.put(OrderRequestController()); + CaptainWalletController captainWalletController = + Get.put(CaptainWalletController()); + int refusedRidesToday = 0; + captainWalletController.getCaptainWalletFromBuyPoints(); + return Center( + child: GetBuilder( + builder: (homeCaptainController) => double.parse( + (captainWalletController.totalPoints)) < + -200 + ? CupertinoButton( + onPressed: () { + Get.defaultDialog( + // backgroundColor: CupertinoColors.destructiveRed, + barrierDismissible: false, + title: double.parse( + (captainWalletController.totalPoints)) < + -200 + ? 'You dont have Points'.tr + : 'You Are Stopped For this Day !'.tr, + titleStyle: AppStyle.title, + content: Column( + children: [ + IconButton( + onPressed: () async { + double.parse((captainWalletController + .totalPoints)) < + -200 + ? await Get.find() + .speakText( + 'You must be recharge your Account' + .tr) + : await Get.find() + .speakText( + 'You Refused 3 Rides this Day that is the reason \nSee you Tomorrow!' + .tr); + }, + icon: const Icon(Icons.headphones), + ), + Text( + double.parse((captainWalletController + .totalPoints)) < + -200 + ? 'You must be recharge your Account'.tr + : 'You Refused 3 Rides this Day that is the reason \nSee you Tomorrow!' + .tr, + style: AppStyle.title, + ), + ], + ), + confirm: double.parse( + (captainWalletController.totalPoints)) < + -200 + ? MyElevatedButton( + title: 'Recharge my Account'.tr, + onPressed: () { + homeCaptainController.goToWalletFromConnect(); + }) + : MyElevatedButton( + title: 'Ok , See you Tomorrow'.tr, + onPressed: () { + Get.back(); + Get.back(); + })); + }, + color: CupertinoColors.destructiveRed, + child: Text( + 'You are Stopped'.tr, + style: AppStyle.title, + ), + ) + : Container( + decoration: BoxDecoration( + gradient: LinearGradient( + begin: Alignment.topLeft, + end: Alignment.bottomRight, + colors: homeCaptainController.isActive + ? [const Color(0xFF00C853), const Color(0xFF00E676)] + : [Colors.grey.shade600, Colors.grey.shade400], + ), + borderRadius: BorderRadius.circular(20), + boxShadow: [ + BoxShadow( + color: (homeCaptainController.isActive + ? const Color(0xFF00C853) + : Colors.grey) + .withOpacity(0.4), + spreadRadius: 0, + blurRadius: 15, + offset: const Offset(0, 5), + ), + ], + ), + child: CupertinoButton( + onPressed: homeCaptainController.onButtonSelected, + padding: const EdgeInsets.symmetric( + horizontal: 20, vertical: 10), + child: Row( + mainAxisSize: MainAxisSize.min, + children: [ + Container( + padding: const EdgeInsets.all(4), + decoration: BoxDecoration( + color: Colors.white.withOpacity(0.2), + shape: BoxShape.circle, + ), + child: Icon( + homeCaptainController.isActive + ? Icons.power_settings_new_rounded + : Icons.power_off_rounded, + color: Colors.white, + size: 20, + ), + ), + const SizedBox(width: 10), + Text( + homeCaptainController.isActive + ? 'Online'.tr + : 'Offline'.tr, + style: const TextStyle( + color: Colors.white, + fontSize: 16, + fontWeight: FontWeight.bold, + letterSpacing: 0.5, + ), + ), + ], + ), + ), + )), + ); + } +} diff --git a/siro_driver/lib/views/home/Captin/home_captain/widget/left_menu_map_captain.dart b/siro_driver/lib/views/home/Captin/home_captain/widget/left_menu_map_captain.dart new file mode 100755 index 0000000..cf00795 --- /dev/null +++ b/siro_driver/lib/views/home/Captin/home_captain/widget/left_menu_map_captain.dart @@ -0,0 +1,323 @@ +import 'package:siro_driver/constant/box_name.dart'; +import 'package:siro_driver/controller/firebase/local_notification.dart'; +import 'package:siro_driver/main.dart'; +import 'package:siro_driver/views/home/Captin/driver_map_page.dart'; +import 'package:siro_driver/views/home/Captin/orderCaptin/vip_order_page.dart'; +import 'package:siro_driver/views/auth/syria/registration_view.dart'; +import 'package:flutter/material.dart'; +import 'package:flutter_font_icons/flutter_font_icons.dart'; +import 'package:get/get.dart'; +import 'package:siro_driver/controller/home/captin/home_captain_controller.dart'; +import 'package:siro_driver/views/widgets/mydialoug.dart'; + +import '../../../../../constant/links.dart'; +import '../../../../../controller/firebase/notification_service.dart'; +import '../../../../../controller/functions/crud.dart'; +import '../../../../../controller/home/captin/order_request_controller.dart'; +import '../../../../../print.dart'; +import '../../../../Rate/ride_calculate_driver.dart'; + +// ───────────────────────────────────────────── +// Design Tokens (Responsive) +// ───────────────────────────────────────────── +class _T { + static Color surface(BuildContext context) => + Theme.of(context).brightness == Brightness.dark + ? const Color(0xFF16213E) + : Colors.white; + + static const Color accent = Color(0xFFF0A500); + static const Color blue = Color(0xFF3498DB); + + static Color border(BuildContext context) => + Theme.of(context).brightness == Brightness.dark + ? const Color(0xFF2A2A4A) + : Colors.grey.withOpacity(0.2); + + static const double radius = 14.0; +} + +// ───────────────────────────────────────────── +// Left Side Menu +// ───────────────────────────────────────────── + +/// Returns the vertical icon column anchored to the left-center of the map. +GetBuilder leftMainMenuCaptainIcons() { + return GetBuilder( + builder: (ctrl) => Positioned( + // Place just above the bottom status bar + bottom: 100, + left: 10, + child: Builder(builder: (context) { + return Container( + decoration: BoxDecoration( + color: _T.surface(context), + borderRadius: BorderRadius.circular(_T.radius), + border: Border.all(color: _T.border(context)), + boxShadow: [ + BoxShadow( + color: Colors.black.withOpacity(0.3), + blurRadius: 10, + offset: const Offset(2, 4), + ), + ], + ), + padding: const EdgeInsets.symmetric(vertical: 6), + child: Column( + mainAxisSize: MainAxisSize.min, + children: [ + // ── 1. Active Ride shortcut ────────── + _MenuIcon( + icon: Icons.directions_car_rounded, + color: + box.read(BoxName.rideArgumentsFromBackground) == 'failure' + ? Colors.red.shade400 + : Colors.green.shade400, + tooltip: 'Active Ride'.tr, + onTap: () async { + await checkForPendingOrderFromServer(); + if (box.read(BoxName.rideArgumentsFromBackground) != + 'failure') { + Get.to( + () => PassengerLocationMapPage(), + arguments: box.read(BoxName.rideArgumentsFromBackground), + ); + } else { + MyDialog().getDialog( + 'Ride info'.tr, + 'you dont have accepted ride'.tr, + () => Get.back(), + ); + } + }, + onLongPress: () { + box.write(BoxName.rideArgumentsFromBackground, 'failure'); + box.write(BoxName.statusDriverLocation, 'off'); + box.write(BoxName.rideStatus, 'no_ride'); + Log.print(box.read(BoxName.statusDriverLocation)); + ctrl.update(); + }, + ), + + _Divider(context), + + // ── 2. Earnings Chart ──────────────── + _MenuIcon( + icon: FontAwesome5.chart_bar, + color: _T.blue, + tooltip: 'Earnings'.tr, + onTap: () { + final now = DateTime.now(); + final lastTimeRaw = box.read(BoxName.lastTimeStaticThrottle); + DateTime? lastTime; + + if (lastTimeRaw != null) { + try { + lastTime = DateTime.parse(lastTimeRaw.toString()); + } catch (_) { + lastTime = null; + } + } + + if (lastTime == null || + now.difference(lastTime).inMinutes >= 2) { + box.write( + BoxName.lastTimeStaticThrottle, now.toIso8601String()); + Get.to(() => RideCalculateDriver()); + } else { + final left = 2 - now.difference(lastTime).inMinutes; + NotificationController().showNotification( + 'Intaleq Driver'.tr, + '${'Please wait'.tr} $left ${"minutes before trying again.".tr}', + 'ding', + '', + ); + } + }, + onLongPress: () => + box.write(BoxName.statusDriverLocation, 'off'), + ), + + // ── 3. VIP Orders (2023+ cars only) ── + if (int.tryParse(box.read(BoxName.carYear).toString()) != null && + int.parse(box.read(BoxName.carYear).toString()) > 2023) ...[ + _Divider(context), + _MenuIcon( + icon: Octicons.watch, + color: _T.accent, + tooltip: 'VIP Orders'.tr, + onTap: () => Get.to(() => const VipOrderPage()), + ), + ], + + // _Divider(context), + + // // ── 4. Driver Registration ────────── + // _MenuIcon( + // icon: Icons.person_add_alt_1_rounded, + // color: Colors.purple.shade400, + // tooltip: 'Registration'.tr, + // onTap: () => Get.to(() => const RegistrationView()), + // ), + ], + ), + ); + }), + ), + ); +} + +// ───────────────────────────────────────────── +// Reusable sub-widgets +// ───────────────────────────────────────────── + +class _MenuIcon extends StatelessWidget { + final IconData icon; + final Color color; + final String tooltip; + final VoidCallback onTap; + final VoidCallback? onLongPress; + + const _MenuIcon({ + required this.icon, + required this.color, + required this.tooltip, + required this.onTap, + this.onLongPress, + }); + + @override + Widget build(BuildContext context) => Tooltip( + message: tooltip, + child: InkWell( + onTap: onTap, + onLongPress: onLongPress, + borderRadius: BorderRadius.circular(10), + child: Padding( + padding: const EdgeInsets.symmetric(horizontal: 10, vertical: 10), + child: Icon(icon, color: color, size: 26), + ), + ), + ); +} + +/// Thin separator between icons +class _Divider extends StatelessWidget { + final BuildContext context; + const _Divider(this.context); + + @override + Widget build(BuildContext context) => Container( + height: 1, + width: 32, + margin: const EdgeInsets.symmetric(horizontal: 6), + color: _T.border(this.context), + ); +} + +// ───────────────────────────────────────────── +// Server Helpers (unchanged logic) +// ───────────────────────────────────────────── + +Future checkForPendingOrderFromServer() async { + bool isProcessing = false; + if (isProcessing) return; + + final driverId = box.read(BoxName.driverID)?.toString(); + if (driverId == null) return; + + isProcessing = true; + + try { + var response = await CRUD().post( + link: AppLink.getArgumentAfterAppliedFromBackground, + payload: {'driver_id': driverId}, + ); + Log.print('response: $response'); + + if (response['status'] == 'success') { + final Map orderInfo = response['message']; + final Map rideArgs = + _transformServerDataToAppArguments(orderInfo); + + final customerToken = response['message']['token_passenger']; + final orderId = response['message']['ride_id'].toString(); + + box.write(BoxName.rideArgumentsFromBackground, rideArgs); + box.write(BoxName.statusDriverLocation, 'on'); + box.write(BoxName.rideStatus, 'Apply'); + Get.put(OrderRequestController()).changeApplied(); + + Get.to( + () => PassengerLocationMapPage(), + arguments: box.read(BoxName.rideArgumentsFromBackground), + ); + } else { + box.write(BoxName.rideArgumentsFromBackground, 'failure'); + } + } catch (_) { + // silent + } finally { + isProcessing = false; + } +} + +Map _transformServerDataToAppArguments( + Map d) { + String s(String key, [String def = 'unknown']) => d[key]?.toString() ?? def; + + return { + 'passengerLocation': s('passenger_location'), + 'passengerDestination': s('passenger_destination'), + 'Duration': s('duration'), + 'totalCost': s('total_cost'), + 'Distance': s('distance'), + 'name': s('name'), + 'phone': s('phone'), + 'email': s('email'), + 'tokenPassenger': s('token_passenger'), + 'direction': s('direction_url'), + 'DurationToPassenger': s('duration_to_passenger'), + 'rideId': s('ride_id'), + 'passengerId': s('passenger_id'), + 'driverId': s('driver_id'), + 'durationOfRideValue': s('duration_of_ride'), + 'paymentAmount': s('payment_amount'), + 'paymentMethod': s('payment_method'), + 'passengerWalletBurc': s('passenger_wallet_burc'), + 'timeOfOrder': s('time_of_order'), + 'totalPassenger': s('total_passenger'), + 'carType': s('car_type'), + 'kazan': s('kazan'), + 'startNameLocation': s('start_name_location'), + 'endNameLocation': s('end_name_location'), + 'step0': s('step0'), + 'step1': s('step1'), + 'step2': s('step2'), + 'step3': s('step3'), + 'step4': s('step4'), + 'WalletChecked': (d['wallet_checked'] == 1).toString(), + 'isHaveSteps': (d['has_steps'] == 1) ? 'startEnd' : 'noSteps', + }; +} + +void _sendAcceptanceNotification(String? customerToken, dynamic rideId) { + if (customerToken == null || customerToken.isEmpty) return; + + List body = [ + box.read(BoxName.driverID).toString(), + box.read(BoxName.nameDriver).toString(), + box.read(BoxName.tokenDriver).toString(), + rideId.toString(), + ]; + + NotificationService.sendNotification( + target: customerToken, + title: 'Accepted Ride'.tr, + body: 'your ride is Accepted'.tr, + isTopic: false, + tone: 'start', + driverList: body, + category: 'Accepted Ride', + ); +} diff --git a/siro_driver/lib/views/home/Captin/home_captain/widget/zones_controller.dart b/siro_driver/lib/views/home/Captin/home_captain/widget/zones_controller.dart new file mode 100755 index 0000000..7b6565a --- /dev/null +++ b/siro_driver/lib/views/home/Captin/home_captain/widget/zones_controller.dart @@ -0,0 +1,67 @@ +import 'dart:convert'; +import 'dart:math'; + +import 'package:get/get.dart'; +import 'package:intaleq_maps/intaleq_maps.dart'; + +class ZonesController extends GetxController { + Map> generateZoneMap( + LatLng southwest, LatLng southEast, LatLng northeast) { + const double desiredZoneArea = 4; // in square kilometers + + final double width = (southEast.longitude - southwest.longitude) * 100; + final double height = (northeast.latitude - southEast.latitude) * 100; + final double totalArea = width * height; + + // final int numZones = (totalArea / desiredZoneArea).ceil(); + + final double zoneWidth = width / sqrt(desiredZoneArea); + final double zoneHeight = height / sqrt(desiredZoneArea); + final numRows = + ((northeast.latitude - southwest.latitude) / zoneHeight).ceil(); + final numCols = + ((southEast.longitude - southwest.longitude) / zoneWidth).ceil(); + List zoneNames = []; + List zoneCoordinates = []; + + for (int row = 0; row < numRows; row++) { + for (int col = 0; col < numCols; col++) { + final double zoneSouthwestLat = + southwest.latitude + (row * zoneHeight / 100); + final double zoneSouthwestLng = + southwest.longitude + (col * zoneWidth / 100); + final double zoneNortheastLat = zoneSouthwestLat + zoneHeight / 100; + final double zoneNortheastLng = zoneSouthwestLng + zoneWidth / 100; + + LatLng zoneSouthwest = LatLng(zoneSouthwestLat, zoneSouthwestLng); + LatLng zoneNortheast = LatLng(zoneNortheastLat, zoneNortheastLng); + + String zoneName = + 'Zone${row + col}'; // Assign a unique name to each zone + + zoneNames.add(zoneName); + zoneCoordinates.add(zoneSouthwest); + zoneCoordinates.add(zoneNortheast); + } + } + + Map> zoneMap = {}; + for (int i = 0; i < zoneNames.length; i++) { + zoneMap[zoneNames[i]] = [ + zoneCoordinates[i], // Southwest LatLng + zoneCoordinates[i + 1], // Northeast LatLng + ]; + } + + return zoneMap; + } + + void getJsonOfZones() { + LatLng southwest = const LatLng(32.111107, 36.062222); + LatLng southEast = const LatLng(32.108333, 36.101667); + LatLng northeast = const LatLng(32.143889, 36.058889); + Map> zoneMap = + generateZoneMap(southwest, southEast, northeast); + String jsonMap = json.encode(zoneMap); + } +} diff --git a/siro_driver/lib/views/home/Captin/maintain_center_page.dart b/siro_driver/lib/views/home/Captin/maintain_center_page.dart new file mode 100755 index 0000000..3c4a5cf --- /dev/null +++ b/siro_driver/lib/views/home/Captin/maintain_center_page.dart @@ -0,0 +1,273 @@ +import 'package:siro_driver/constant/colors.dart'; +import 'package:siro_driver/constant/style.dart'; +import 'package:siro_driver/controller/home/captin/help/maintain_center_controller.dart'; +import 'package:siro_driver/views/widgets/elevated_btn.dart'; +import 'package:siro_driver/views/widgets/my_scafold.dart'; +import 'package:flutter/material.dart'; +import 'package:get/get.dart'; + +// class MaintainCenterPage extends StatelessWidget { +// MaintainCenterPage({super.key}); +// MaintainCenterController maintainCenterController = +// Get.put(MaintainCenterController()); + +// @override +// Widget build(BuildContext context) { +// return MyScafolld( +// title: "Maintenance Center".tr, +// body: [ +// GetBuilder( +// builder: (maintainCenterController) { +// return Padding( +// padding: const EdgeInsets.all(8.0), +// child: Column( +// children: [ +// Text( +// "When you complete 600 trips, you will be eligible to receive offers for maintenance of your car." +// .tr), +// const SizedBox( +// height: 10, +// ), +// Row( +// mainAxisAlignment: MainAxisAlignment.spaceAround, +// children: [ +// MyElevatedButton( +// title: "Show My Trip Count".tr, +// onPressed: () async { +// maintainCenterController.getTripCountByCaptain(); +// }), +// _buildPriceAvatar( +// maintainCenterController.tripCount['count'] == null +// ? '0' +// : maintainCenterController.tripCount['count'] +// .toString()) +// ], +// ), +// const SizedBox( +// height: 10, +// ), +// Container( +// decoration: AppStyle.boxDecoration, +// child: Padding( +// padding: const EdgeInsets.all(14), +// child: Text( +// "We have maintenance offers for your car. You can use them after completing 600 trips to get a 20% discount on car repairs. Enjoy using our Tripz app and be part of our Tripz family." +// .tr, +// style: AppStyle.title, +// ), +// ), +// ), +// const SizedBox( +// height: 10, +// ), +// MyElevatedButton( +// title: 'Show maintenance center near my location'.tr, +// onPressed: () { +// if (maintainCenterController.tripCount['count'] > 600) { +// } else { +// Get.snackbar("You should complete 600 trips".tr, '', +// backgroundColor: AppColor.yellowColor); +// } +// }) +// ], +// ), +// ); +// }) +// ], +// isleading: true); +// } + +// Widget _buildPriceAvatar(String count) { +// return Container( +// width: 80, +// height: 80, +// decoration: BoxDecoration( +// shape: BoxShape.circle, +// gradient: const RadialGradient( +// colors: [Color(0xFF4CAF50), Color(0xFF2E7D32)], +// center: Alignment.center, +// radius: 0.8, +// ), +// boxShadow: [ +// BoxShadow( +// color: Colors.black.withOpacity(0.2), +// blurRadius: 8, +// offset: const Offset(0, 4), +// ), +// ], +// ), +// child: Center( +// child: Text( +// count, +// style: const TextStyle( +// fontSize: 22, +// fontWeight: FontWeight.bold, +// color: Colors.white, +// ), +// ), +// ), +// ); +// } +// } + +class MaintainCenterPage extends StatelessWidget { + MaintainCenterPage({super.key}); + final MaintainCenterController maintainCenterController = + Get.put(MaintainCenterController()); + + @override + Widget build(BuildContext context) { + return MyScafolld( + title: "Maintenance Center".tr, + body: [ + GetBuilder( + builder: (controller) { + return Padding( + padding: const EdgeInsets.all(16.0), + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + // Introduction Text with better styling + Text( + "When you complete 600 trips, you will be eligible to receive offers for maintenance of your car." + .tr, + style: Theme.of(context).textTheme.titleMedium!.copyWith( + color: Theme.of(context).textTheme.bodyMedium?.color?.withOpacity(0.8), + height: 1.4, + ), + ), + + const SizedBox(height: 20), + + // Trip Count Section in a Card + Card( + elevation: 4, + shape: RoundedRectangleBorder( + borderRadius: BorderRadius.circular(12), + ), + child: Padding( + padding: const EdgeInsets.all(16.0), + child: Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + Expanded( + child: MyElevatedButton( + title: "Show My Trip Count".tr, + onPressed: () async { + controller.getTripCountByCaptain(); + }, + ), + ), + const SizedBox(width: 16), + _buildPriceAvatar( + controller.tripCount['count'] == null + ? '0' + : controller.tripCount['count'].toString(), + ), + ], + ), + ), + ), + const SizedBox(height: 20), + + // Maintenance Offer Information in a Card + Card( + elevation: 4, + shape: RoundedRectangleBorder( + borderRadius: BorderRadius.circular(12), + ), + child: Padding( + padding: const EdgeInsets.all(16.0), + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Text( + "Maintenance Offer".tr, + style: Theme.of(context).textTheme.titleLarge, + ), + const SizedBox(height: 8), + Text( + "We have maintenance offers for your car. You can use them after completing 600 trips to get a 20% discount on car repairs. Enjoy using our Tripz app and be part of our Tripz family." + .tr, + style: Theme.of(context) + .textTheme + .bodyMedium! + .copyWith( + color: Theme.of(context).textTheme.bodyMedium?.color?.withOpacity(0.9), + height: 1.5, + ), + ), + + ], + ), + ), + ), + const SizedBox(height: 20), + + // Show Maintenance Center Button + SizedBox( + width: double.infinity, + child: MyElevatedButton( + title: 'Show maintenance center near my location'.tr, + onPressed: () { + if (controller.tripCount['count'] != null && + controller.tripCount['count'] >= 600) { + // Implement navigation or action to show maintenance centers + // For now, let's print a message + print("Navigating to maintenance centers..."); + } else { + Get.snackbar( + "Ineligible for Offer".tr, + "You should complete 500 trips to unlock this feature." + .tr, + backgroundColor: AppColor.yellowColor, + colorText: Colors.black, + snackPosition: SnackPosition.BOTTOM, + ); + } + }, + ), + ), + ], + ), + ); + }, + ), + ], + isleading: true, + ); + } + + Widget _buildPriceAvatar(String count) { + return Container( + width: 70, // Slightly reduced size + height: 70, + decoration: BoxDecoration( + shape: BoxShape.circle, + gradient: const LinearGradient( + // Changed to LinearGradient + colors: [Color(0xFF4CAF50), Color(0xFF2E7D32)], + begin: Alignment.topLeft, + end: Alignment.bottomRight, + ), + boxShadow: [ + BoxShadow( + color: Colors.black.withOpacity(0.15), // Reduced opacity + blurRadius: 6, // Slightly reduced blur + offset: const Offset(0, 3), + ), + ], + ), + child: Center( + child: Text( + count, + style: const TextStyle( + fontSize: 20, // Slightly reduced size + fontWeight: FontWeight.bold, + color: Colors.white, + ), + ), + ), + ); + } +} diff --git a/siro_driver/lib/views/home/Captin/mapDriverWidgets/driver_end_ride_bar.dart b/siro_driver/lib/views/home/Captin/mapDriverWidgets/driver_end_ride_bar.dart new file mode 100755 index 0000000..a27795f --- /dev/null +++ b/siro_driver/lib/views/home/Captin/mapDriverWidgets/driver_end_ride_bar.dart @@ -0,0 +1,218 @@ +import 'package:flutter/material.dart'; +import 'package:get/get.dart'; +import 'package:intl/intl.dart'; +import 'package:slide_to_act/slide_to_act.dart'; + +import '../../../../constant/colors.dart'; +import '../../../../controller/home/captin/map_driver_controller.dart'; + +Widget driverEndRideBar() { + return GetBuilder( + builder: (controller) { + // 🔥 فحص هل السعر ثابت للعرض + final String carType = controller.carType; + final bool isFixed = (carType == 'Speed' || + carType == 'Awfar' || + carType == 'Fixed Price'); + + return AnimatedContainer( + duration: const Duration(milliseconds: 400), + curve: Curves.easeOutBack, + transform: Matrix4.translationValues( + 0, + controller.isRideStarted ? 0 : -300, + 0, + ), // Matrix4.translationValues مستخدمة للإزاحة [web:28] + margin: const EdgeInsets.symmetric(horizontal: 15, vertical: 10), + padding: const EdgeInsets.all(15), + decoration: BoxDecoration( + color: Colors.white, + borderRadius: BorderRadius.circular(24), + boxShadow: [ + BoxShadow( + color: Colors.black.withOpacity(0.1), + blurRadius: 20, + offset: const Offset(0, 8), + ) + ], + ), + child: Column( + mainAxisSize: MainAxisSize.min, + children: [ + // لوحة العدادات + Container( + padding: const EdgeInsets.symmetric(vertical: 15, horizontal: 10), + decoration: BoxDecoration( + color: const Color(0xFFF8F9FA), + borderRadius: BorderRadius.circular(18), + border: Border.all(color: Colors.grey.shade200), + ), + child: Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + // 1) المسافة (تتغير دائماً) + _buildLiveMetric( + icon: Icons.alt_route_rounded, + iconColor: Colors.blueAccent, + value: controller.currentRideDistanceKm.toStringAsFixed(2), + unit: 'KM'.tr, + label: 'Traveled'.tr, + ), + + _buildVerticalDivider(), + + // 2) السعر (ثابت أو متغير) + _buildLiveMetric( + icon: isFixed + ? Icons.lock_outline_rounded + : Icons.attach_money_rounded, + iconColor: isFixed ? Colors.grey : AppColor.primaryColor, + value: NumberFormat('#,##0').format( + double.tryParse(controller.price.toString()) ?? 0, + ), + unit: 'SYP'.tr, + label: isFixed ? 'Fixed Price'.tr : 'Meter Fare'.tr, + isHighlight: true, + isFixedStyle: isFixed, + ), + + _buildVerticalDivider(), + + // 3) الوقت (تصغير الخط + إخفاء الساعات إذا 0) + _buildLiveMetric( + icon: Icons.timer_outlined, + iconColor: Colors.orange, + value: _formatDurationFromStart(controller), + unit: '', + label: 'Duration'.tr, + valueFontSize: 14, // ✅ تصغير خط “المدة” + ), + ], + ), + ), + + const SizedBox(height: 20), + + // زر الإنهاء + SlideAction( + key: ValueKey(controller.isRideFinished), + height: 60, + borderRadius: 18, + elevation: 0, + text: 'Swipe to End Trip'.tr, + textStyle: const TextStyle( + fontSize: 16, + fontWeight: FontWeight.bold, + color: Colors.white, + ), + outerColor: AppColor.redColor, + innerColor: Colors.white, + sliderButtonIcon: const Icon( + Icons.stop_circle_outlined, + color: AppColor.redColor, + size: 32, + ), + onSubmit: () async { + await controller.finishRideFromDriver(isFromSlider: true); + return null; + }, + ), // SlideAction مثال الاستخدام موجود في صفحة الحزمة [web:19] + ], + ), + ); + }, + ); // GetBuilder يعيد البناء عند update() من الكنترولر [web:21] +} + +/// دالة تنسيق المدة: +/// - أقل من ساعة: mm:ss +/// - ساعة فأكثر: h:mm:ss (خانة واحدة للساعات بدون leading zero) +String _formatDurationFromStart(MapDriverController controller) { + if (controller.rideStartTime == null) return "00:00"; + + final d = DateTime.now().difference(controller.rideStartTime!); + + String twoDigits(int n) => n.toString().padLeft(2, "0"); + + final hours = d.inHours; + final minutes = d.inMinutes.remainder(60); + final seconds = d.inSeconds.remainder(60); + + if (hours == 0) { + // mm:ss + final totalMinutes = d.inMinutes; + return "${twoDigits(totalMinutes)}:${twoDigits(seconds)}"; + } + + // h:mm:ss + return "$hours:${twoDigits(minutes)}:${twoDigits(seconds)}"; +} // Duration وتفكيكه (inHours/inMinutes/inSeconds) من أساسيات Dart [web:11] + +Widget _buildLiveMetric({ + required IconData icon, + required Color iconColor, + required String value, + required String unit, + required String label, + bool isHighlight = false, + bool isFixedStyle = false, + double? valueFontSize, // ✅ جديد: حجم خط القيمة فقط +}) { + final effectiveFontSize = valueFontSize ?? (isHighlight ? 20 : 18); + + return Expanded( + child: Column( + children: [ + Row( + mainAxisAlignment: MainAxisAlignment.center, + children: [ + Icon(icon, size: 14, color: iconColor), + const SizedBox(width: 4), + Text( + label, + style: TextStyle( + fontSize: 10, + color: Colors.grey[600], + fontWeight: FontWeight.bold, + ), + ), + ], + ), + const SizedBox(height: 6), + Row( + mainAxisAlignment: MainAxisAlignment.center, + crossAxisAlignment: CrossAxisAlignment.baseline, + textBaseline: TextBaseline.alphabetic, + children: [ + Text( + value, + style: TextStyle( + fontSize: effectiveFontSize, // ✅ هنا صار التحكم + fontWeight: FontWeight.w900, + color: isFixedStyle + ? Colors.grey[800] + : (isHighlight ? AppColor.primaryColor : Colors.black87), + fontFamily: 'monospace', + ), + ), + if (unit.isNotEmpty) ...[ + const SizedBox(width: 2), + Text( + unit, + style: TextStyle( + fontSize: 10, + fontWeight: FontWeight.bold, + color: Colors.grey[600], + ), + ), + ] + ], + ), + ], + ), + ); +} + +Widget _buildVerticalDivider() { + return Container(height: 35, width: 1, color: Colors.grey.shade300); +} diff --git a/siro_driver/lib/views/home/Captin/mapDriverWidgets/google_driver_map_page.dart b/siro_driver/lib/views/home/Captin/mapDriverWidgets/google_driver_map_page.dart new file mode 100755 index 0000000..98d5d5c --- /dev/null +++ b/siro_driver/lib/views/home/Captin/mapDriverWidgets/google_driver_map_page.dart @@ -0,0 +1,82 @@ +import 'package:flutter/material.dart'; +import 'package:get/get.dart'; +import 'package:intaleq_maps/intaleq_maps.dart'; +import 'package:siro_driver/constant/api_key.dart'; + +import '../../../../controller/functions/location_controller.dart'; +import '../../../../controller/home/captin/map_driver_controller.dart'; +import '../../../../controller/profile/setting_controller.dart'; + +class GoogleDriverMap extends StatelessWidget { + const GoogleDriverMap({ + super.key, + required this.locationController, + }); + + final LocationController locationController; + + @override + Widget build(BuildContext context) { + final MapDriverController controller = Get.put(MapDriverController()); + + // New: تحديد قيمة الـ padding لتحريك مركز الخريطة للأعلى + final double mapPaddingBottom = MediaQuery.of(context).size.height * 0.3; + + return GetBuilder( + builder: (controller) => Listener( + onPointerDown: (_) => controller.onUserMapInteraction(), + child: IntaleqMap( + apiKey: AK.mapAPIKEY, + onMapCreated: (mapController) { + controller.onMapCreated(mapController); + }, + mapType: Get.isRegistered() + ? (Get.find().isMapDarkMode + ? IntaleqMapType.normal + : IntaleqMapType.light) + : IntaleqMapType.light, + zoomControlsEnabled: false, + initialCameraPosition: CameraPosition( + target: controller.smoothedLocation ?? locationController.myLocation, + zoom: 17, + bearing: controller.smoothedHeading, + tilt: 60, + ), + // padding: EdgeInsets.only(bottom: 50, top: Get.height * 0.7), + // minMaxZoomPreference: const MinMaxZoomPreference(8, 18), + myLocationEnabled: false, + myLocationButtonEnabled: false, + compassEnabled: false, + polylines: controller.polyLines.toSet(), + markers: { + // 🔥 Car icon — always visible, moves with GPS location on map. + // MarkerId matches exactly with updateMarker() in controller. + Marker( + markerId: const MarkerId('MyLocation'), + position: controller.smoothedLocation ?? controller.myLocation, + rotation: controller.smoothedHeading, + flat: true, + anchor: const Offset(0.5, 0.5), + icon: controller.carIcon, + zIndex: 100, + ), + if (!controller.isRideStarted && + controller.latLngPassengerLocation.latitude != 0) + Marker( + markerId: const MarkerId('start'), + position: controller.latLngPassengerLocation, + icon: controller.startIcon, + ), + if (controller.latLngPassengerDestination.latitude != 0 || + controller.latLngPassengerDestination.longitude != 0) + Marker( + markerId: const MarkerId('end'), + position: controller.latLngPassengerDestination, + icon: controller.endIcon, + ), + }, + ), + ), + ); + } +} diff --git a/siro_driver/lib/views/home/Captin/mapDriverWidgets/google_map_app.dart b/siro_driver/lib/views/home/Captin/mapDriverWidgets/google_map_app.dart new file mode 100755 index 0000000..8d314dd --- /dev/null +++ b/siro_driver/lib/views/home/Captin/mapDriverWidgets/google_map_app.dart @@ -0,0 +1,62 @@ +import 'package:siro_driver/constant/colors.dart'; +import 'package:siro_driver/constant/style.dart'; +import 'package:siro_driver/controller/home/captin/map_driver_controller.dart'; +import 'package:flutter/material.dart'; +import 'package:flutter_font_icons/flutter_font_icons.dart'; +import 'package:get/get.dart'; +import 'package:url_launcher/url_launcher.dart'; + +class GoogleMapApp extends StatelessWidget { + const GoogleMapApp({super.key}); + + @override + Widget build(BuildContext context) { + return GetBuilder( + builder: (mapDriverController) { + if (!mapDriverController.isRideStarted) return const SizedBox(); + + // REMOVED: Positioned wrapper + return Material( + elevation: 8, + shadowColor: Colors.black26, + borderRadius: BorderRadius.circular(30), + color: Colors.white, + child: InkWell( + borderRadius: BorderRadius.circular(30), + onTap: () async { + var endLat = + mapDriverController.latLngPassengerDestination.latitude; + var endLng = + mapDriverController.latLngPassengerDestination.longitude; + String url = 'google.navigation:q=$endLat,$endLng'; + + if (await canLaunchUrl(Uri.parse(url))) { + await launchUrl(Uri.parse(url)); + } else { + String webUrl = + 'https://www.google.com/maps/dir/?api=1&destination=$endLat,$endLng'; + if (await canLaunchUrl(Uri.parse(webUrl))) { + await launchUrl(Uri.parse(webUrl)); + } + } + }, + child: Container( + padding: const EdgeInsets.symmetric(horizontal: 20, vertical: 12), + decoration: BoxDecoration( + color: Colors.blueAccent, + borderRadius: BorderRadius.circular(30), + border: Border.all( + color: AppColor.blueColor.withOpacity(0.2), width: 1), + ), + child: Icon( + MaterialCommunityIcons.google_maps, + size: 28, + color: AppColor.secondaryColor, + ), + ), + ), + ); + }, + ); + } +} diff --git a/siro_driver/lib/views/home/Captin/mapDriverWidgets/passenger_info_window.dart b/siro_driver/lib/views/home/Captin/mapDriverWidgets/passenger_info_window.dart new file mode 100755 index 0000000..b901a98 --- /dev/null +++ b/siro_driver/lib/views/home/Captin/mapDriverWidgets/passenger_info_window.dart @@ -0,0 +1,617 @@ +import 'package:flutter/material.dart'; +import 'package:get/get.dart'; +import 'package:siro_driver/constant/colors.dart'; +import 'package:siro_driver/controller/home/captin/map_driver_controller.dart'; +import '../../../../constant/box_name.dart'; +import '../../../../constant/style.dart'; +import 'package:siro_driver/views/widgets/mydialoug.dart'; +import '../../../../controller/voice_call_controller.dart'; +import '../../../../controller/functions/launch.dart'; +import '../../../../controller/functions/location_controller.dart'; +import '../../../../main.dart'; +import '../../../widgets/error_snakbar.dart'; +import 'package:flutter_font_icons/flutter_font_icons.dart'; +import '../../../../controller/firebase/notification_service.dart'; +import '../../../../controller/functions/crud.dart'; +import '../../../../constant/links.dart'; +import '../../../widgets/my_textField.dart'; + +class PassengerInfoWindow extends StatelessWidget { + const PassengerInfoWindow({super.key}); + + @override + Widget build(BuildContext context) { + // 1. حساب الهوامش الآمنة (SafeArea) من الأسفل + final double safeBottomPadding = MediaQuery.of(context).padding.bottom; + + return GetBuilder( + // id: 'PassengerInfo', + builder: (controller) { + // --- 1. تجهيز بيانات العرض --- + String displayName = controller.passengerName ?? "Unknown"; + String avatarText = ""; + + // التحقق من اللغة (عربي/إنجليزي) للاسم المختصر + bool isArabic = RegExp(r'[\u0600-\u06FF]').hasMatch(displayName); + + if (displayName.isNotEmpty) { + if (isArabic) { + avatarText = displayName.split(' ').first; + if (avatarText.length > 4) { + avatarText = avatarText.substring(0, 4); + } + } else { + avatarText = displayName[0].toUpperCase(); + } + } + + // --- 2. المنطق الذكي للموقع (Smart Positioning) --- + // نرفع النافذة إذا ظهر شريط التعليمات في الأسفل لتجنب التغطية + bool hasInstructions = controller.currentInstruction.isNotEmpty; + double instructionsHeight = hasInstructions ? 110.0 : 0.0; + + // الموقع النهائي: إذا كانت مفعلة تظهر، وإلا تختفي للأسفل + double finalBottomPosition = controller.isPassengerInfoWindow + ? (safeBottomPadding + 10 + instructionsHeight) + : -450.0; + + return AnimatedPositioned( + duration: const Duration(milliseconds: 500), + curve: Curves.fastOutSlowIn, + bottom: finalBottomPosition, + left: 12.0, + right: 12.0, + child: Container( + decoration: BoxDecoration( + color: Colors.white, + borderRadius: BorderRadius.circular(24), + boxShadow: [ + BoxShadow( + color: Colors.black.withOpacity(0.15), + blurRadius: 25, + offset: const Offset(0, 8), + spreadRadius: 2, + ) + ], + ), + child: Column( + mainAxisSize: MainAxisSize.min, + children: [ + // --- مقبض السحب (Visual Handle) --- + Center( + child: Container( + margin: const EdgeInsets.only(top: 8, bottom: 4), + width: 40, + height: 4, + decoration: BoxDecoration( + color: Colors.grey.shade300, + borderRadius: BorderRadius.circular(10), + ), + ), + ), + + Padding( + padding: const EdgeInsets.fromLTRB(16, 4, 16, 16), + child: Column( + children: [ + // --- الصف العلوي: معلومات الراكب --- + Row( + children: [ + // الصورة الرمزية + Container( + width: 52, + height: 52, + decoration: BoxDecoration( + shape: BoxShape.circle, + color: AppColor.primaryColor.withOpacity(0.1), + border: Border.all( + color: + AppColor.primaryColor.withOpacity(0.2)), + ), + child: Center( + child: Text( + avatarText, + style: TextStyle( + color: AppColor.primaryColor, + fontWeight: FontWeight.bold, + fontSize: isArabic ? 14 : 20, + ), + ), + ), + ), + const SizedBox(width: 12), + + // النصوص (الاسم والمسافة) + Expanded( + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Text( + displayName, + style: AppStyle.title.copyWith( + fontWeight: FontWeight.w800, + fontSize: 16), + maxLines: 1, + overflow: TextOverflow.ellipsis, + ), + const SizedBox(height: 4), + Row( + children: [ + Icon(Icons.location_on, + size: 14, color: Colors.grey[600]), + const SizedBox(width: 4), + // 🔥 [Fix Overflow] Flexible لمنع الـ overflow + تحويل المسافة + // السيرفر يُرجع المسافة بالأمتار (5864.022) + Flexible( + child: Text( + _formatDistanceDisplay( + controller.distance), + style: TextStyle( + color: Colors.grey[700], + fontSize: 13, + fontWeight: FontWeight.w600), + overflow: TextOverflow.ellipsis, + maxLines: 1, + ), + ), + const SizedBox(width: 10), + Icon(Icons.access_time_filled, + size: 14, color: Colors.grey[600]), + const SizedBox(width: 4), + Text( + controller.hours > 0 + ? '${controller.hours}h ${controller.minutes}m' + : '${controller.minutes} min', + style: TextStyle( + color: Colors.grey[700], + fontSize: 13, + fontWeight: FontWeight.w600), + ), + ], + ), + ], + ), + ), + + // أزرار جانبية (سرعة + اتصال) + Row( + children: [ + _buildSpeedCircle(), + const SizedBox(width: 10), + InkWell( + onTap: () async { + controller.isSocialPressed = true; + + // نفحص النتيجة: هل مسموح له يتصل؟ + bool canCall = + await controller.driverCallPassenger(); + + if (canCall) { + _showCallSelectionDialog( + context, controller); + } else { + // هنا ممكن تظهر رسالة: تم منع الاتصال بسبب كثرة الإلغاءات + mySnackeBarError( + "You cannot call the passenger due to policy violations" + .tr); + } + }, + borderRadius: BorderRadius.circular(50), + child: Container( + padding: const EdgeInsets.all(10), + decoration: BoxDecoration( + color: Colors.green.withOpacity(0.1), + shape: BoxShape.circle, + border: Border.all( + color: Colors.green.withOpacity(0.2)), + ), + child: const Icon(Icons.phone, + color: Colors.green, size: 22), + ), + ), + const SizedBox(width: 8), + InkWell( + onTap: () => + _showMessageOptions(context, controller), + borderRadius: BorderRadius.circular(50), + child: Container( + padding: const EdgeInsets.all(10), + decoration: BoxDecoration( + color: Colors.grey.shade100, + shape: BoxShape.circle, + border: + Border.all(color: Colors.grey.shade300), + ), + child: Icon( + MaterialCommunityIcons + .message_text_outline, + color: AppColor.primaryColor, + size: 22), + ), + ), + ], + ), + ], + ), + + // خط فاصل + Padding( + padding: const EdgeInsets.symmetric(vertical: 12), + child: Divider(height: 1, color: Colors.grey.shade100), + ), + + // --- مؤشر الانتظار (يظهر عند الوصول) --- + if (controller.remainingTimeInPassengerLocatioWait < + 300 && + controller.remainingTimeInPassengerLocatioWait != 0 && + !controller.isRideBegin) ...[ + _buildWaitingIndicator(controller), + const SizedBox(height: 12), + ], + + // --- الأزرار الرئيسية (وصلت / ابدأ) --- + if (!controller.isRideBegin) + _buildActionButtons(controller), + + // --- زر الإلغاء المدفوع (بعد انتهاء وقت الانتظار) --- + if (controller.isdriverWaitTimeEnd && + !controller.isRideBegin) + Padding( + padding: const EdgeInsets.only(top: 10), + child: SizedBox( + width: double.infinity, + height: 48, + child: ElevatedButton.icon( + style: ElevatedButton.styleFrom( + backgroundColor: const Color(0xFFFFF0F0), + foregroundColor: Colors.red, + elevation: 0, + shape: RoundedRectangleBorder( + borderRadius: BorderRadius.circular(12), + side: const BorderSide( + color: Color(0xFFFFCDCD)), + ), + ), + onPressed: () { + MyDialog().getDialog( + 'Confirm Cancellation'.tr, + 'Are you sure you want to cancel and collect the fee?' + .tr, () async { + // كود الإلغاء + Get.back(); + controller + .addWaitingTimeCostFromPassengerToDriverWallet(); + }); + }, + icon: const Icon(Icons.money_off, size: 20), + label: Text('Cancel & Collect Fee'.tr, + style: const TextStyle( + fontWeight: FontWeight.bold)), + ), + ), + ), + ], + ), + ), + ], + ), + ), + ); + }, + ); + } + + // --- Widgets مساعدة --- + + Widget _buildSpeedCircle() { + return GetBuilder(builder: (locController) { + int speedKmh = (locController.speed * 3.6).round(); + Color color = speedKmh > 100 ? Colors.red : const Color(0xFF0D47A1); + + return Container( + width: 42, + height: 42, + decoration: BoxDecoration( + color: Colors.white, + shape: BoxShape.circle, + border: Border.all(color: color.withOpacity(0.3), width: 2), + ), + child: Column( + mainAxisAlignment: MainAxisAlignment.center, + children: [ + Text('$speedKmh', + style: TextStyle( + color: color, + fontWeight: FontWeight.w900, + fontSize: 13, + height: 1)), + Text('km/h', + style: TextStyle( + color: color.withOpacity(0.7), fontSize: 8, height: 1)), + ], + ), + ); + }); + } + + Widget _buildWaitingIndicator(MapDriverController controller) { + bool isUrgent = controller.remainingTimeInPassengerLocatioWait < 60; + return Container( + padding: const EdgeInsets.symmetric(horizontal: 12, vertical: 8), + decoration: BoxDecoration( + color: Colors.grey.shade50, + borderRadius: BorderRadius.circular(8), + ), + child: Row( + children: [ + Icon(Icons.timer_outlined, + size: 16, color: isUrgent ? Colors.red : Colors.green), + const SizedBox(width: 8), + Expanded( + child: ClipRRect( + borderRadius: BorderRadius.circular(4), + child: LinearProgressIndicator( + value: + controller.progressInPassengerLocationFromDriver.toDouble(), + backgroundColor: Colors.grey[200], + color: isUrgent ? Colors.red : Colors.green, + minHeight: 6, + ), + ), + ), + const SizedBox(width: 10), + Text( + controller.stringRemainingTimeWaitingPassenger, + style: TextStyle( + fontWeight: FontWeight.w900, + color: isUrgent ? Colors.red : Colors.green, + fontFamily: 'monospace'), + ), + ], + ), + ); + } + + Widget _buildActionButtons(MapDriverController controller) { + if (controller.isArrivedSend) { + return SizedBox( + width: double.infinity, + height: 50, + child: ElevatedButton.icon( + style: ElevatedButton.styleFrom( + backgroundColor: const Color(0xFFF1C40F), + foregroundColor: Colors.white, + elevation: 2, + shape: + RoundedRectangleBorder(borderRadius: BorderRadius.circular(12)), + ), + onPressed: () async { + await controller.markDriverAsArrived(); + }, + icon: const Icon(Icons.near_me_rounded), + label: Text('I Have Arrived'.tr, + style: + const TextStyle(fontWeight: FontWeight.bold, fontSize: 16)), + ), + ); + } else { + return SizedBox( + width: double.infinity, + height: 50, + child: ElevatedButton.icon( + style: ElevatedButton.styleFrom( + backgroundColor: const Color(0xFF27AE60), + foregroundColor: Colors.white, + elevation: 2, + shape: + RoundedRectangleBorder(borderRadius: BorderRadius.circular(12)), + ), + onPressed: () { + // 🔥 [Fix Start-Ride] استخدام Get.defaultDialog بدلاً من MyDialog + // لأن MyDialog يستخدم Navigator.of(context, rootNavigator: true).pop() + // الذي يتعارض مع Get.dialog() المستخدم في startRideFromDriver() + // وقد يُسبب Get.back() اللاحق إغلاق صفحة الماب بدلاً من الـ loading dialog + Get.defaultDialog( + title: "Start Trip?".tr, + titleStyle: const TextStyle( + fontSize: 18, + fontWeight: FontWeight.bold, + ), + middleText: "Ensure the passenger is in the car.".tr, + barrierDismissible: true, + radius: 14, + confirm: ElevatedButton( + style: ElevatedButton.styleFrom( + backgroundColor: const Color(0xFF27AE60), + foregroundColor: Colors.white, + shape: RoundedRectangleBorder( + borderRadius: BorderRadius.circular(10)), + ), + onPressed: () async { + // نُغلق الديالوج بـ Get.back() لضمان أن GetX يعرف أنه أُغلق + Get.back(); + // ثم نُنفذ startRideFromDriver الذي يستخدم Get.dialog و Get.back بأمان + await controller.startRideFromDriver(); + }, + child: Text('Start'.tr, + style: const TextStyle(fontWeight: FontWeight.bold)), + ), + cancel: TextButton( + onPressed: () => Get.back(), + child: Text('Cancel'.tr, + style: const TextStyle(color: Colors.grey)), + ), + ); + }, + icon: const Icon(Icons.play_circle_fill_rounded), + label: Text('Start Ride'.tr, + style: + const TextStyle(fontWeight: FontWeight.bold, fontSize: 16)), + ), + ); + } + } + + void _showCallSelectionDialog( + BuildContext context, MapDriverController controller) { + Get.dialog( + Dialog( + shape: RoundedRectangleBorder(borderRadius: BorderRadius.circular(20)), + child: Padding( + padding: const EdgeInsets.all(20), + child: Column( + mainAxisSize: MainAxisSize.min, + children: [ + Text( + 'Call Options'.tr, + style: AppStyle.title + .copyWith(fontSize: 18, fontWeight: FontWeight.bold), + ), + const SizedBox(height: 10), + Text( + 'Choose how you want to call the passenger'.tr, + style: const TextStyle(color: Colors.grey, fontSize: 14), + textAlign: TextAlign.center, + ), + const SizedBox(height: 20), + ListTile( + leading: CircleAvatar( + backgroundColor: Colors.green.withOpacity(0.1), + child: const Icon(Icons.phone_android_rounded, + color: Colors.green), + ), + title: Text('Standard Call'.tr, + style: const TextStyle(fontWeight: FontWeight.bold)), + subtitle: Text('Uses cellular network'.tr, + style: const TextStyle(fontSize: 12)), + onTap: () { + Get.back(); + makePhoneCall(controller.passengerPhone.toString()); + }, + ), + const Divider(), + ListTile( + leading: CircleAvatar( + backgroundColor: AppColor.primaryColor.withOpacity(0.1), + child: Icon(Icons.wifi_calling_3_rounded, + color: AppColor.primaryColor), + ), + title: Text('Free Call'.tr, + style: const TextStyle(fontWeight: FontWeight.bold)), + subtitle: Text('Voice call over internet'.tr, + style: const TextStyle(fontSize: 12)), + onTap: () { + Get.back(); + final voiceCtrl = Get.find(); + final driverId = box.read(BoxName.driverID).toString(); + voiceCtrl.startCall( + rideIdVal: controller.rideId, + driverId: driverId, + passengerId: controller.passengerId, + remoteNameVal: controller.passengerName ?? "Passenger", + ); + }, + ), + ], + ), + ), + ), + ); + } + + void _showMessageOptions( + BuildContext context, MapDriverController controller) { + Get.bottomSheet( + Container( + padding: const EdgeInsets.all(20), + decoration: const BoxDecoration( + color: Colors.white, + borderRadius: BorderRadius.vertical(top: Radius.circular(25)), + ), + child: Column( + mainAxisSize: MainAxisSize.min, + children: [ + Text('Quick Messages'.tr, + style: + const TextStyle(fontSize: 18, fontWeight: FontWeight.bold)), + const SizedBox(height: 15), + _buildQuickMessageItem("Where are you, sir?".tr, controller), + _buildQuickMessageItem("I've arrived.".tr, controller), + const Divider(), + Row( + children: [ + Expanded( + child: TextField( + controller: controller.messageToPassenger, + decoration: + InputDecoration(hintText: 'Type a message...'.tr), + ), + ), + IconButton( + icon: const Icon(Icons.send), + onPressed: () { + _sendMessage(controller, controller.messageToPassenger.text, + 'cancel'); + controller.messageToPassenger.clear(); + Get.back(); + }, + ), + ], + ), + ], + ), + ), + ); + } + + Widget _buildQuickMessageItem(String text, MapDriverController controller) { + return ListTile( + title: Text(text), + onTap: () { + _sendMessage(controller, text, 'ding'); + Get.back(); + }, + ); + } + + void _sendMessage( + MapDriverController controller, String body, String tone) async { + try { + await CRUD().post( + link: AppLink.sendChatMessage, + payload: { + 'ride_id': controller.rideId.toString(), + 'sender_id': box.read(BoxName.driverID).toString(), + 'receiver_id': controller.passengerId.toString(), + 'sender_type': 'driver', + 'message_content': body, + }, + ); + } catch (e) { + // Ignore or log error + } + + NotificationService.sendNotification( + target: controller.tokenPassenger.toString(), + title: 'Driver Message'.tr, + body: body, + isTopic: false, + tone: tone, + driverList: [], + category: 'message From Driver', + ); + } +} + +/// تحويل المسافة من الأمتار إلى عرض مقروء +/// السيرفر يُرجع المسافة بالأمتار (مثال: 5864.022) +/// النتيجة: "5.9 km" أو "250 م" +String _formatDistanceDisplay(String rawDistance) { + final meters = double.tryParse(rawDistance) ?? 0.0; + if (meters >= 1000) { + return '${(meters / 1000).toStringAsFixed(1)} km'; + } else if (meters > 0) { + return '${meters.toStringAsFixed(0)} م'; + } + return rawDistance; // fallback للقيمة الأصلية +} diff --git a/siro_driver/lib/views/home/Captin/mapDriverWidgets/sos_connect.dart b/siro_driver/lib/views/home/Captin/mapDriverWidgets/sos_connect.dart new file mode 100755 index 0000000..3a82dca --- /dev/null +++ b/siro_driver/lib/views/home/Captin/mapDriverWidgets/sos_connect.dart @@ -0,0 +1,131 @@ +import 'package:flutter/material.dart'; +import 'package:get/get.dart'; +import 'package:siro_driver/views/widgets/error_snakbar.dart'; +import 'package:siro_driver/views/widgets/my_textField.dart'; +import 'package:siro_driver/views/widgets/elevated_btn.dart'; // Checked import +import 'package:flutter_font_icons/flutter_font_icons.dart'; + +import '../../../../constant/box_name.dart'; +import '../../../../constant/colors.dart'; +import '../../../../constant/style.dart'; +import '../../../../controller/firebase/notification_service.dart'; +import '../../../../controller/functions/launch.dart'; +import '../../../../controller/home/captin/map_driver_controller.dart'; +import '../../../../main.dart'; + +class SosConnect extends StatelessWidget { + SosConnect({super.key}); + + @override + Widget build(BuildContext context) { + return GetBuilder( + id: 'SosConnect', // Keep ID for updates + builder: (controller) { + bool showSos = controller.isRideStarted; + + if (!showSos) return const SizedBox(); + + return Container( + padding: const EdgeInsets.all(8), + decoration: BoxDecoration( + color: Colors.white.withOpacity(0.95), + borderRadius: BorderRadius.circular(16), + boxShadow: [ + BoxShadow( + color: Colors.black.withOpacity(0.1), + blurRadius: 10, + offset: const Offset(0, 4), + ), + ], + ), + child: Column( + mainAxisSize: MainAxisSize.min, + children: [ + // === SOS Button === + _buildModernActionButton( + icon: MaterialIcons.warning, + color: Colors.white, + bgColor: AppColor.redColor, + tooltip: 'EMERGENCY SOS', + isPulsing: true, + onTap: () => _handleSosCall(controller), + ), + ], + ), + ); + }, + ); + } + + Widget _buildModernActionButton({ + required IconData icon, + required Color color, + required Color bgColor, + required String tooltip, + required VoidCallback onTap, + bool isPulsing = false, + }) { + return Material( + color: Colors.transparent, + child: InkWell( + onTap: onTap, + borderRadius: BorderRadius.circular(12), + child: Container( + width: 48, + height: 48, + decoration: BoxDecoration( + color: bgColor, + borderRadius: BorderRadius.circular(12), + boxShadow: isPulsing + ? [ + BoxShadow( + color: bgColor.withOpacity(0.4), + blurRadius: 12, + spreadRadius: 2, + ) + ] + : [], + ), + child: Icon(icon, color: color, size: 24), + ), + ), + ); + } + + // --- Logic Functions --- + void _handleSosCall(MapDriverController mapDriverController) { + if (box.read(BoxName.sosPhoneDriver) == null) { + Get.defaultDialog( + title: 'Emergency Contact'.tr, + content: Column( + children: [ + Text('Please enter the emergency number.'.tr), + Form( + key: mapDriverController.formKey1, + child: MyTextForm( + controller: mapDriverController.sosEmergincyNumberCotroller, + label: 'Phone Number'.tr, + hint: '0923456789', + type: TextInputType.phone, + ), + ), + ], + ), + confirm: MyElevatedButton( + title: 'Save & Call'.tr, + onPressed: () { + if (mapDriverController.formKey1.currentState!.validate()) { + box.write(BoxName.sosPhoneDriver, + mapDriverController.sosEmergincyNumberCotroller.text); + Get.back(); + launchCommunication( + 'phone', box.read(BoxName.sosPhoneDriver), ''); + } + }, + ), + ); + } else { + launchCommunication('phone', box.read(BoxName.sosPhoneDriver), ''); + } + } +} diff --git a/siro_driver/lib/views/home/Captin/mapDriverWidgets/sped_circle.dart b/siro_driver/lib/views/home/Captin/mapDriverWidgets/sped_circle.dart new file mode 100644 index 0000000..61df3a8 --- /dev/null +++ b/siro_driver/lib/views/home/Captin/mapDriverWidgets/sped_circle.dart @@ -0,0 +1,76 @@ +import 'package:flutter/material.dart'; +import 'package:get/get.dart'; +import '../../../../constant/colors.dart'; +import '../../../../constant/style.dart'; +import '../../../../controller/home/captin/map_driver_controller.dart'; + +// ويدجت للعرض فقط (بدون منطق فتح نوافذ) +class SpeedCircle extends StatelessWidget { + const SpeedCircle({super.key}); + + @override + Widget build(BuildContext context) { + return GetBuilder( + id: 'SpeedCircle', // نحدد ID للتحديث الخفيف + builder: (controller) { + // إذا السرعة 0 أو أقل، نخفي الدائرة + if (controller.speed <= 0) return const SizedBox(); + + bool isSpeeding = controller.speed > 100; + + return Positioned( + left: 20, + top: 100, // مكانها المناسب + child: Container( + width: 70, + height: 70, + decoration: BoxDecoration( + shape: BoxShape.circle, + color: Colors.white, + boxShadow: [ + BoxShadow( + color: Colors.black.withOpacity(0.2), + blurRadius: 10, + offset: const Offset(0, 4), + ) + ], + border: Border.all( + color: _getSpeedColor(controller.speed), + width: 4, + ), + ), + child: Column( + mainAxisAlignment: MainAxisAlignment.center, + children: [ + Text( + controller.speed.toStringAsFixed(0), + style: TextStyle( + fontFamily: AppStyle.title.fontFamily, + fontSize: 22, + fontWeight: FontWeight.w900, + height: 1.0, + color: Colors.black87, + ), + ), + Text( + "km/h", + style: TextStyle( + fontSize: 10, + fontWeight: FontWeight.bold, + color: Colors.grey, + ), + ), + ], + ), + ), + ); + }, + ); + } + + Color _getSpeedColor(double speed) { + if (speed < 60) return AppColor.greenColor; + if (speed < 100) return Colors.orange; + return Colors.red; + } +} diff --git a/siro_driver/lib/views/home/Captin/orderCaptin/call.dart b/siro_driver/lib/views/home/Captin/orderCaptin/call.dart new file mode 100755 index 0000000..f968864 --- /dev/null +++ b/siro_driver/lib/views/home/Captin/orderCaptin/call.dart @@ -0,0 +1,25 @@ +// import 'package:flutter/material.dart'; +// import 'package:ride/constant/api_key.dart'; +// import 'package:ride/constant/box_name.dart'; +// import 'package:ride/main.dart'; +// import 'package:zego_uikit_prebuilt_call/zego_uikit_prebuilt_call.dart'; + +// class CallPage extends StatelessWidget { +// const CallPage({Key? key, required this.callID}) : super(key: key); +// final String callID; + +// @override +// Widget build(BuildContext context) { +// return ZegoUIKitPrebuiltCall( +// appID: AK +// .zegoCloudAppID, // Fill in the appID that you get from ZEGOCLOUD Admin Console. +// appSign: AK +// .zegoCloudAppSIGN, // Fill in the appSign that you get from ZEGOCLOUD Admin Console. +// userID: box.read(BoxName.passengerID) ?? box.read(BoxName.driverID), +// userName: box.read(BoxName.name) ?? box.read(BoxName.nameDriver), +// callID: callID, +// // You can also use groupVideo/groupVoice/oneOnOneVoice to make more types of calls. +// config: ZegoUIKitPrebuiltCallConfig.oneOnOneVoiceCall(), +// ); +// } +// } diff --git a/siro_driver/lib/views/home/Captin/orderCaptin/marker_generator.dart b/siro_driver/lib/views/home/Captin/orderCaptin/marker_generator.dart new file mode 100644 index 0000000..74e204a --- /dev/null +++ b/siro_driver/lib/views/home/Captin/orderCaptin/marker_generator.dart @@ -0,0 +1,142 @@ +import 'dart:ui' as ui; +import 'package:flutter/material.dart'; +import 'package:intaleq_maps/intaleq_maps.dart'; +import 'package:flutter/services.dart'; + +class MarkerGenerator { + // دالة لرسم ماركر يحتوي على نص (للوقت والمسافة) + static Future createCustomMarkerBitmap({ + required String title, + required String subtitle, + required Color color, + required IconData iconData, + }) async { + final ui.PictureRecorder pictureRecorder = ui.PictureRecorder(); + final Canvas canvas = Canvas(pictureRecorder); + + // إعدادات القياسات + const double width = 220.0; + const double height = 110.0; + const double circleRadius = 25.0; + + // 1. رسم المربع (Info Box) مع تدرج لوني بسيط + final Paint paint = Paint()..color = color; + final RRect rRect = RRect.fromRectAndRadius( + const Rect.fromLTWH(0, 0, width, 65), + const Radius.circular(20), // زوايا أكثر استدارة لشكل عصري + ); + + // ظل أقوى لمظهر بارز (Premium Feel) + canvas.drawShadow(Path()..addRRect(rRect), Colors.black54, 10.0, true); + canvas.drawRRect(rRect, paint); + + // 2. رسم مثلث صغير أسفل المربع (Arrow Tail) + final Path path = Path(); + path.moveTo(width / 2 - 10, 60); + path.lineTo(width / 2, 75); + path.lineTo(width / 2 + 10, 60); + path.close(); + canvas.drawPath(path, paint); + + // 3. رسم الدائرة (مكان الأيقونة) + canvas.drawCircle(const Offset(width / 2, 85), circleRadius, paint); + + // 4. رسم الأيقونة داخل الدائرة + TextPainter iconPainter = TextPainter(textDirection: TextDirection.ltr); + iconPainter.text = TextSpan( + text: String.fromCharCode(iconData.codePoint), + style: TextStyle( + fontSize: 30.0, + fontFamily: iconData.fontFamily, + color: Colors.white, + ), + ); + iconPainter.layout(); + iconPainter.paint( + canvas, + Offset((width - iconPainter.width) / 2, 85 - (iconPainter.height / 2)), + ); + + // 5. رسم النصوص (العنوان والوصف) داخل المربع + // العنوان (مثلاً: المدة) + TextPainter titlePainter = TextPainter( + textDirection: TextDirection.rtl, + textAlign: TextAlign.center, + ); + titlePainter.text = TextSpan( + text: title, + style: const TextStyle( + fontSize: 20.0, + fontWeight: FontWeight.bold, + color: Colors.white, + ), + ); + titlePainter.layout(minWidth: width); + titlePainter.paint(canvas, const Offset(0, 8)); + + // الوصف (مثلاً: المسافة) + TextPainter subTitlePainter = TextPainter( + textDirection: TextDirection.rtl, + textAlign: TextAlign.center, + ); + subTitlePainter.text = TextSpan( + text: subtitle, + style: const TextStyle( + fontSize: 16.0, + color: Colors.white70, + ), + ); + subTitlePainter.layout(minWidth: width); + subTitlePainter.paint(canvas, const Offset(0, 32)); + + // تحويل الرسم إلى صورة + final ui.Image image = await pictureRecorder.endRecording().toImage( + width.toInt(), + (height + 20).toInt(), // مساحة إضافية + ); + final ByteData? data = + await image.toByteData(format: ui.ImageByteFormat.png); + return InlqBitmap.fromBytes(data!.buffer.asUint8List()); + } + + // دالة خاصة لرسم ماركر السائق (دائرة وخلفها سهم) + static Future createDriverMarker() async { + final ui.PictureRecorder pictureRecorder = ui.PictureRecorder(); + final Canvas canvas = Canvas(pictureRecorder); + const double size = 100.0; + + final Paint paint = Paint()..color = const Color(0xFF2E7D32); // أخضر غامق + final Paint borderPaint = Paint() + ..color = Colors.white + ..style = PaintingStyle.stroke + ..strokeWidth = 4.0; + + // الدائرة + canvas.drawCircle(const Offset(size / 2, size / 2), size / 2.5, paint); + canvas.drawCircle( + const Offset(size / 2, size / 2), size / 2.5, borderPaint); + + // رسم السهم (Arrow Up) + TextPainter iconPainter = TextPainter(textDirection: TextDirection.ltr); + iconPainter.text = TextSpan( + text: String.fromCharCode(Icons.navigation.codePoint), // سهم ملاحة + style: TextStyle( + fontSize: 40.0, + fontFamily: Icons.navigation.fontFamily, + color: Colors.white, + ), + ); + iconPainter.layout(); + iconPainter.paint( + canvas, + Offset((size - iconPainter.width) / 2, (size - iconPainter.height) / 2), + ); + + final ui.Image image = await pictureRecorder + .endRecording() + .toImage(size.toInt(), size.toInt()); + final ByteData? data = + await image.toByteData(format: ui.ImageByteFormat.png); + return InlqBitmap.fromBytes(data!.buffer.asUint8List()); + } +} diff --git a/siro_driver/lib/views/home/Captin/orderCaptin/order_over_lay.dart b/siro_driver/lib/views/home/Captin/orderCaptin/order_over_lay.dart new file mode 100755 index 0000000..db9d9d6 --- /dev/null +++ b/siro_driver/lib/views/home/Captin/orderCaptin/order_over_lay.dart @@ -0,0 +1,814 @@ +import 'dart:async'; +import 'package:flutter/material.dart'; +import 'package:flutter/services.dart'; +import 'package:flutter_overlay_window/flutter_overlay_window.dart'; +import 'package:get/get.dart'; +import 'package:intl/intl.dart'; +import 'package:just_audio/just_audio.dart'; +import 'package:siro_driver/constant/api_key.dart'; +import 'package:siro_driver/models/overlay_service.dart'; +import '../../../../constant/box_name.dart'; +import '../../../../constant/links.dart'; +import '../../../../controller/firebase/firbase_messge.dart'; +import '../../../../controller/firebase/local_notification.dart'; +import '../../../../controller/firebase/notification_service.dart'; +import '../../../../controller/functions/crud.dart'; +import '../../../../main.dart'; +import '../../../../models/model/order_data.dart'; +import '../../../../print.dart'; + +// === Enhanced Colors for Better Readability === +class AppColors { + static const primary = Color(0xFF1A252F); + static const card = Color(0xFF2C3E50); + static const white = Colors.white; + static const gray = Color(0xFFBDC3C7); + static const lightGray = Color(0xFFECF0F1); + static const accent = Color(0xFF00BCD4); + static const accept = Color(0xFF4CAF50); + static const reject = Color(0xFFFF5722); + static const highlight = Color(0xFFFFC107); + static const priceHighlight = Color(0xFF00E676); + static const urgentRed = Color(0xFFD32F2F); +} + +class OrderOverlay extends StatefulWidget { + const OrderOverlay({Key? key}) : super(key: key); + + @override + State createState() => _OrderOverlayState(); +} + +class _OrderOverlayState extends State + with WidgetsBindingObserver { + // === State Variables === + OrderData? orderData; + Timer? timer; + int remainingSeconds = 10; + final AudioPlayer audioPlayer = AudioPlayer(); + bool buttonsEnabled = true; + final String mapApiKey = AK.mapAPIKEY; + final CRUD _crud = CRUD(); + + final NotificationController notificationController = + Get.put(NotificationController()); + // === Getters === + bool get canShowMap { + if (orderData == null || mapApiKey.isEmpty) return false; + final start = orderData!.startCoordinates; + final end = orderData!.endCoordinates; + return start?['lat'] != null && + start?['lng'] != null && + end?['lat'] != null && + end?['lng'] != null; + } + + String get staticMapUrl { + if (!canShowMap) return ""; + final start = orderData!.startCoordinates!; + final end = orderData!.endCoordinates!; + final startMarker = Uri.encodeComponent("${start['lat']},${start['lng']}"); + final endMarker = Uri.encodeComponent("${end['lat']},${end['lng']}"); + + return "https://maps.googleapis.com/maps/api/staticmap?" + "size=600x150&maptype=roadmap" + "&markers=color:green%7Clabel:S%7C$startMarker" + "&markers=color:red%7Clabel:D%7C$endMarker" + "&path=color:0x007bff%7Cweight:5%7C$startMarker%7C$endMarker" + "&key=$mapApiKey"; + } + + // === Lifecycle === + @override + void initState() { + super.initState(); + WidgetsBinding.instance.addObserver(this); + FlutterOverlayWindow.overlayListener.listen((event) { + if (mounted) _processEventData(event); + }); + } + + @override + void dispose() { + timer?.cancel(); + _stopAudio(); + audioPlayer.dispose(); + WidgetsBinding.instance.removeObserver(this); + super.dispose(); + } + + @override + void didChangeAppLifecycleState(AppLifecycleState state) { + if (state == AppLifecycleState.resumed) { + _checkOverlayStatus(); + } + } + + List myList = []; + // === Setup & Listeners === + void _setupOverlayListener() { + FlutterOverlayWindow.overlayListener.listen((event) { + if (mounted) _processEventData(event); + }); + } + + void _processEventData(dynamic event) { + _log("Received event: $event"); + if (event is List) { + try { + myList = event; + final newOrder = OrderData.fromList(event); + _log("Parsed OrderData: ${newOrder.toMap()}"); + setState(() { + orderData = newOrder; + }); + _resetAndStartTimer(); + } catch (e, s) { + _log("Error parsing OrderData: $e\nStackTrace: $s"); + } + } else { + _log("Unexpected data format: $event"); + } + } + + void _checkOverlayStatus() async { + bool isActive = await FlutterOverlayWindow.isActive(); + if (isActive && mounted && orderData != null) { + if (remainingSeconds > 0 && (timer == null || !timer!.isActive)) { + _resetAndStartTimer(); + } + } + } + + // === Timer Management === + void _resetAndStartTimer() { + timer?.cancel(); + audioPlayer.stop(); + setState(() { + buttonsEnabled = true; + remainingSeconds = _calculateTimerDuration(); + }); + _playAudio(); + _startTimer(); + } + + int _calculateTimerDuration() { + if (orderData?.durationToPassengerMinutes != null && + orderData!.durationToPassengerMinutes > 0) { + int duration = orderData!.durationToPassengerMinutes * 60; + return duration > 10 ? 10 : duration; + } + return 10; + } + + void _startTimer() { + if (orderData == null) return; + timer = Timer.periodic(const Duration(seconds: 1), (timer) { + if (!mounted) { + timer.cancel(); + _stopAudio(); + return; + } + setState(() { + if (remainingSeconds > 0) { + remainingSeconds--; + } else { + timer.cancel(); + _stopAudio(); + if (buttonsEnabled) _handleOrderTimeout(); + } + }); + }); + } + + // === Audio Management === + void _playAudio() async { + try { + await audioPlayer.setAsset('assets/order.mp3', preload: true); + await audioPlayer.setLoopMode(LoopMode.one); + await audioPlayer.play(); + } catch (e) { + _log('Error playing audio: $e'); + } + } + + void _stopAudio() { + audioPlayer.stop(); + } + + String _getData(int index, {String defaultValue = ''}) { + if (myList.length > index && myList[index] != null) { + return myList[index].toString(); + } + return defaultValue; + } + + // === Order Actions === + Future _acceptOrder() async { + if (!buttonsEnabled || orderData == null) return; + _disableButtonsAndProcess(); + _log("Order ACCEPTED: ${orderData!.orderId}"); + + try { + final driverId = box.read(BoxName.driverID)?.toString(); + if (driverId == null) { + _log("Error: Driver ID is null. Closing overlay."); + await _closeOverlay(); + return; + } + var res = await CRUD() + .post(link: "${AppLink.ride}/rides/acceptRide.php", payload: { + 'id': orderData!.orderId, + 'rideTimeStart': DateTime.now().toString(), + 'status': 'Apply', + 'driver_id': box.read(BoxName.driverID), + 'passengerToken': _getData(9), + }); + + final payload = { + // بيانات أساسية + 'driver_id': driverId, + 'status': 'Apply', + 'passengerLocation': '${_getData(0)},${_getData(1)}', + 'passengerDestination': '${_getData(3)},${_getData(4)}', + 'Duration': _getData(4), + 'totalCost': _getData(26), + 'Distance': _getData(5), + 'name': _getData(8), + 'phone': _getData(10), + 'email': _getData(28), + 'WalletChecked': _getData(13), + 'tokenPassenger': _getData(9), + 'direction': staticMapUrl.toString(), + 'DurationToPassenger': _getData(15), + 'rideId': orderData!.orderId, + 'passengerId': _getData(7), + 'durationOfRideValue': _getData(19), + 'paymentAmount': _getData(2), + 'paymentMethod': _getData(13) == 'true' ? 'visa' : 'cash', + 'isHaveSteps': _getData(20), + 'step0': myList[21].toString(), + 'step1': myList[22].toString(), + 'step2': myList[23].toString(), + 'step3': myList[24].toString(), + 'step4': myList[25].toString(), + 'passengerWalletBurc': myList[26].toString(), + 'carType': myList[31].toString(), + 'kazan': myList[32].toString(), + 'startNameLocation': myList[29].toString(), + 'endNameLocation': myList[30].toString(), + // الحقول الإضافية التي يجب تضمينها + 'timeOfOrder': DateTime.now().toIso8601String(), + 'totalPassenger': _getData(2), + }; + Log.print('payload: ${payload}'); + CRUD().post( + link: AppLink.addOverLayStatus, + payload: payload, + ); + if (res != "failure") { + // Using rideId (_getData(16)) for order_id consistently + + _log("Server update successful. Writing to storage."); + notificationController.showNotification( + "Order Accepted".tr, + "Open app and go to passenger".tr, + 'ding', + '', + ); + + // 3. الخطوة الأهم: فتح التطبيق وإغلاق النافذة + try { + // استدعاء الميثود التي تم تحديثها في الخطوة 1 + await OverlayMethodChannel.bringToForeground(); + } catch (e) { + _log("Failed to bring app to foreground: $e"); + } + await _closeOverlay(); + } else { + _log("Failed to update order status on server: $res"); + notificationController.showNotification( + "Order Accepted by another driver".tr, + "Open app and go to passenger".tr, + 'ding', + '', + ); + await _closeOverlay(); + } + } catch (e, s) { + _log( + "A critical error occurred during server update: $e\nStackTrace: $s"); + if (mounted) setState(() => buttonsEnabled = true); + + _log("Error in accept order: $e"); + await _closeOverlay(); + // حتى في حال الخطأ، نحاول فتح التطبيق ليرى السائق ما حدث + await OverlayMethodChannel.bringToForeground(); + + return; + } + } + + // Your list parsing for 'customerToken' should be something like: + // customerToken: list.length > a_certain_index ? list[a_certain_index].toString() : null, + Future _rejectOrder() async { + if (!buttonsEnabled || orderData == null) return; + _disableButtonsAndProcess(); + _log("Order REJECTED: ${orderData!.orderId}"); + box.write(BoxName.rideStatus, 'reject'); + Log.print('rideStatus from overlay 303 : ${box.read(BoxName.rideStatus)}'); + await _apiRefuseOrder(orderData!.orderId); + await _closeOverlay(); + } + + void _handleOrderTimeout() { + if (orderData == null) return; + _log("Order TIMED OUT: ${orderData!.orderId}"); + _rejectOrder(); + } + + Future _apiRefuseOrder(String orderID) async { + if (orderID == "N/A") { + _log("Cannot refuse order with N/A ID"); + return; + } + try { + final driverId = box.read(BoxName.driverID)?.toString(); + if (driverId == null) { + _log("Driver ID is null, cannot refuse order"); + return; + } + CRUD().post(link: AppLink.addDriverOrder, payload: { + 'driver_id': driverId, + 'order_id': orderID, + 'status': 'Refused' + }); + + _log("Order $orderID refused successfully"); + } catch (e) { + _log("Error in _apiRefuseOrder for $orderID: $e"); + } + } + + // === Helper Methods === + void _disableButtonsAndProcess() { + setState(() => buttonsEnabled = false); + timer?.cancel(); + _stopAudio(); + } + + Future _closeOverlay() async { + _stopAudio(); + timer?.cancel(); + if (await FlutterOverlayWindow.isActive()) { + await FlutterOverlayWindow.closeOverlay(); + } + } + + void _log(String message) { + // A simple logger to distinguish overlay logs + print("OVERLAY_LOG: $message"); + } + + // === UI Build Methods === + @override + Widget build(BuildContext context) { + // ... (Your entire UI build method remains unchanged) ... + // The UI code is excellent and doesn't need modification. + if (orderData == null) { + return const Material( + color: Colors.transparent, + child: Center( + child: CircularProgressIndicator(color: AppColors.accent))); + } + + return Material( + color: Colors.black.withOpacity(0.4), + child: Center( + child: Container( + margin: const EdgeInsets.symmetric(horizontal: 12.0, vertical: 8.0), + padding: const EdgeInsets.all(16.0), + decoration: BoxDecoration( + color: AppColors.card, + borderRadius: BorderRadius.circular(20.0), + border: Border.all( + color: AppColors.accent.withOpacity(0.3), width: 1.5), + boxShadow: [ + BoxShadow( + color: Colors.black.withOpacity(0.6), + blurRadius: 15, + spreadRadius: 2, + ) + ], + ), + child: SingleChildScrollView( + child: Column( + mainAxisSize: MainAxisSize.min, + crossAxisAlignment: CrossAxisAlignment.stretch, + children: [ + _buildQuickHeader(), + const SizedBox(height: 12), + _buildPrimaryInfo(), + const SizedBox(height: 12), + if (canShowMap) _buildCompactMap(), + if (canShowMap) const SizedBox(height: 12), + _buildSecondaryInfo(), + const SizedBox(height: 16), + _buildEnhancedActionButtons(), + ], + ), + ), + ), + ), + ); + } + + // All your _build... widget methods (_buildQuickHeader, _buildPrimaryInfo, etc.) + // are perfectly fine and do not need to be changed. + // ... Paste all your existing _build... methods here ... + Widget _buildQuickHeader() { + return Container( + padding: const EdgeInsets.symmetric(horizontal: 12, vertical: 8), + decoration: BoxDecoration( + gradient: LinearGradient( + colors: [ + remainingSeconds <= 3 + ? AppColors.urgentRed + : remainingSeconds <= 5 + ? AppColors.highlight + : AppColors.accent, + remainingSeconds <= 3 + ? AppColors.urgentRed.withOpacity(0.7) + : remainingSeconds <= 5 + ? AppColors.highlight.withOpacity(0.7) + : AppColors.accent.withOpacity(0.7), + ], + ), + borderRadius: BorderRadius.circular(15), + ), + child: Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + Row( + children: [ + Icon(Icons.drive_eta_rounded, color: AppColors.white, size: 24), + const SizedBox(width: 8), + Text( + "طلب جديد".tr, + style: const TextStyle( + color: AppColors.white, + fontSize: 18, + fontWeight: FontWeight.w600), + ), + ], + ), + Container( + padding: const EdgeInsets.symmetric(horizontal: 16, vertical: 6), + decoration: BoxDecoration( + color: AppColors.white.withOpacity(0.9), + borderRadius: BorderRadius.circular(20), + ), + child: Text( + "$remainingSeconds ث", + style: TextStyle( + color: remainingSeconds <= 3 + ? AppColors.urgentRed + : remainingSeconds <= 5 + ? AppColors.highlight + : AppColors.accent, + fontSize: 20, + fontWeight: FontWeight.bold, + ), + ), + ), + ], + ), + ); + } + + Widget _buildPrimaryInfo() { + final order = orderData!; + + // FIX: Parse the price to a number safely before formatting + // This handles cases where order.price is a String like "173" + final num priceValue = num.tryParse(order.price.toString()) ?? 0; + + return Container( + padding: const EdgeInsets.all(16), + decoration: BoxDecoration( + color: AppColors.primary.withOpacity(0.6), + borderRadius: BorderRadius.circular(12), + border: Border.all( + color: AppColors.priceHighlight.withOpacity(0.3), width: 1), + ), + child: Column( + children: [ + // Price and Distance - Most Important Info + Row( + children: [ + Expanded( + flex: 3, + child: _buildHighlightInfo( + // FIX: Use the parsed priceValue here + "${NumberFormat('#,##0').format(priceValue)} ل.س", + "السعر".tr, + Icons.monetization_on_rounded, + AppColors.priceHighlight, + isLarge: true, + ), + ), + const SizedBox(width: 12), + Expanded( + flex: 2, + child: _buildHighlightInfo( + // Ensure tripDistanceKm is treated safely too + "${(num.tryParse(order.tripDistanceKm.toString()) ?? 0).toStringAsFixed(1)} كم", + "المسافة".tr, + Icons.straighten_rounded, + AppColors.accent, + ), + ), + ], + ), + const SizedBox(height: 12), + Divider(color: AppColors.gray.withOpacity(0.2), thickness: 1), + const SizedBox(height: 12), + // Passenger Info and ETA + Row( + children: [ + Expanded( + flex: 2, + child: _buildPassengerQuickInfo(), + ), + const SizedBox(width: 12), + Expanded( + child: _buildHighlightInfo( + "${order.durationToPassengerMinutes} د", + "للوصول".tr, + Icons.access_time_filled_rounded, + order.durationToPassengerMinutes <= 3 + ? AppColors.priceHighlight + : AppColors.gray, + ), + ), + ], + ), + ], + ), + ); + } + + Widget _buildHighlightInfo( + String value, String label, IconData icon, Color color, + {bool isLarge = false}) { + return Container( + padding: const EdgeInsets.symmetric(vertical: 8, horizontal: 12), + decoration: BoxDecoration( + color: color.withOpacity(0.1), + borderRadius: BorderRadius.circular(10), + border: Border.all(color: color.withOpacity(0.3), width: 1), + ), + child: Column( + children: [ + Icon(icon, color: color, size: isLarge ? 24 : 20), + const SizedBox(height: 4), + Text( + value, + style: TextStyle( + color: AppColors.white, + fontSize: isLarge ? 20 : 16, + fontWeight: FontWeight.bold, + ), + textAlign: TextAlign.center, + ), + Text( + label, + style: TextStyle( + color: AppColors.lightGray.withOpacity(0.7), + fontSize: 11, + ), + textAlign: TextAlign.center, + ), + ], + ), + ); + } + + Widget _buildPassengerQuickInfo() { + final order = orderData!; + return Container( + padding: const EdgeInsets.symmetric(vertical: 8, horizontal: 12), + decoration: BoxDecoration( + color: AppColors.highlight.withOpacity(0.1), + borderRadius: BorderRadius.circular(10), + border: + Border.all(color: AppColors.highlight.withOpacity(0.3), width: 1), + ), + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Row( + children: [ + Icon(Icons.person_rounded, color: AppColors.highlight, size: 18), + const SizedBox(width: 4), + Expanded( + child: Text( + order.customerName, + style: const TextStyle( + color: AppColors.white, + fontSize: 14, + fontWeight: FontWeight.w600, + ), + overflow: TextOverflow.ellipsis, + ), + ), + ], + ), + const SizedBox(height: 2), + Text( + order.rideType, + style: TextStyle( + color: AppColors.lightGray.withOpacity(0.7), + fontSize: 11, + ), + ), + ], + ), + ); + } + + Widget _buildCompactMap() { + return ClipRRect( + borderRadius: BorderRadius.circular(12.0), + child: Image.network( + staticMapUrl, + height: 100, // Reduced from 110 + fit: BoxFit.cover, + errorBuilder: (context, error, stackTrace) { + return Container( + height: 100, + decoration: BoxDecoration( + color: AppColors.primary.withOpacity(0.3), + borderRadius: BorderRadius.circular(12), + ), + child: const Center( + child: + Icon(Icons.map_outlined, color: AppColors.gray, size: 32)), + ); + }, + loadingBuilder: (context, child, loadingProgress) { + if (loadingProgress == null) return child; + return SizedBox( + height: 100, + child: Center( + child: CircularProgressIndicator( + value: loadingProgress.expectedTotalBytes != null + ? loadingProgress.cumulativeBytesLoaded / + loadingProgress.expectedTotalBytes! + : null, + color: AppColors.accent, + strokeWidth: 2.0, + ), + ), + ); + }, + ), + ); + } + + Widget _buildSecondaryInfo() { + final order = orderData!; + return Container( + padding: const EdgeInsets.all(12), + decoration: BoxDecoration( + color: AppColors.primary.withOpacity(0.4), + borderRadius: BorderRadius.circular(10), + ), + child: Column( + children: [ + _buildLocationRow( + Icons.trip_origin_rounded, + "من".tr, + order.startLocationAddress, + Colors.green.shade300, + ), + const SizedBox(height: 8), + _buildLocationRow( + Icons.flag_rounded, + "إلى".tr, + order.endLocationAddress, + Colors.red.shade300, + ), + if (order.tripDurationMinutes > 0) ...[ + const SizedBox(height: 8), + Divider(color: AppColors.gray.withOpacity(0.2), thickness: 0.5), + const SizedBox(height: 8), + Row( + mainAxisAlignment: MainAxisAlignment.center, + children: [ + Icon(Icons.timer_outlined, color: AppColors.accent, size: 16), + const SizedBox(width: 4), + Text( + "مدة الرحلة: ${order.tripDurationMinutes} دقيقة".tr, + style: const TextStyle( + color: AppColors.lightGray, + fontSize: 12, + ), + ), + ], + ), + ] + ], + ), + ); + } + + Widget _buildLocationRow( + IconData icon, String label, String address, Color iconColor) { + return Row( + children: [ + Icon(icon, color: iconColor, size: 16), + const SizedBox(width: 8), + Text( + "$label: ", + style: TextStyle( + color: AppColors.lightGray.withOpacity(0.8), + fontSize: 12, + fontWeight: FontWeight.w500, + ), + ), + Expanded( + child: Text( + address, + style: const TextStyle( + color: AppColors.white, + fontSize: 12, + ), + overflow: TextOverflow.ellipsis, + maxLines: 1, + ), + ), + ], + ); + } + + Widget _buildEnhancedActionButtons() { + return Row( + children: [ + Expanded( + child: ElevatedButton( + onPressed: buttonsEnabled ? _rejectOrder : null, + style: ElevatedButton.styleFrom( + backgroundColor: AppColors.reject, + foregroundColor: AppColors.white, + padding: const EdgeInsets.symmetric(vertical: 14), + shape: RoundedRectangleBorder( + borderRadius: BorderRadius.circular(12)), + disabledBackgroundColor: AppColors.reject.withOpacity(0.3), + elevation: 3, + ), + child: Row( + mainAxisAlignment: MainAxisAlignment.center, + children: [ + const Icon(Icons.close_rounded, size: 20), + const SizedBox(width: 6), + Text( + "رفض".tr, + style: const TextStyle( + fontSize: 16, fontWeight: FontWeight.w600), + ), + ], + ), + ), + ), + const SizedBox(width: 12), + Expanded( + child: ElevatedButton( + onPressed: buttonsEnabled ? _acceptOrder : null, + style: ElevatedButton.styleFrom( + backgroundColor: AppColors.accept, + foregroundColor: AppColors.white, + padding: const EdgeInsets.symmetric(vertical: 14), + shape: RoundedRectangleBorder( + borderRadius: BorderRadius.circular(12)), + disabledBackgroundColor: AppColors.accept.withOpacity(0.3), + elevation: 3, + ), + child: Row( + mainAxisAlignment: MainAxisAlignment.center, + children: [ + const Icon(Icons.check_circle_rounded, size: 20), + const SizedBox(width: 6), + Text( + "قبول".tr, + style: const TextStyle( + fontSize: 16, fontWeight: FontWeight.w600), + ), + ], + ), + ), + ), + ], + ); + } +} diff --git a/siro_driver/lib/views/home/Captin/orderCaptin/order_request_page.dart b/siro_driver/lib/views/home/Captin/orderCaptin/order_request_page.dart new file mode 100755 index 0000000..5154f64 --- /dev/null +++ b/siro_driver/lib/views/home/Captin/orderCaptin/order_request_page.dart @@ -0,0 +1,438 @@ +import 'package:flutter/material.dart'; +import 'package:get/get.dart'; +import 'package:intaleq_maps/intaleq_maps.dart'; +import 'package:siro_driver/constant/api_key.dart'; +import 'package:siro_driver/constant/colors.dart'; +import 'package:siro_driver/controller/home/captin/order_request_controller.dart'; + +class OrderRequestPage extends StatelessWidget { + const OrderRequestPage({super.key}); + + @override + Widget build(BuildContext context) { + // حقن الكنترولر + final OrderRequestController controller = Get.put(OrderRequestController()); + + return Scaffold( + body: Directionality( + textDirection: TextDirection.rtl, + child: GetBuilder( + builder: (controller) { + // 🔥 التعديل الأهم: التحقق من وجود أي بيانات (List أو Map) + if (controller.myList == null && controller.myMapData == null) { + return const Center( + child: + CircularProgressIndicator()); // شاشة تحميل بدلاً من فراغ + } + + // 🔥 استخدام دوال الكنترولر الآمنة لجلب البيانات بدلاً من الوصول المباشر + // قمت بتحويل _safeGet إلى دالة عامة safeGet في الكنترولر (تأكد من جعلها public) + // أو سأقوم بكتابة المنطق هنا مباشرة لضمان العمل: + + String getValue(int index) { + if (controller.myList != null && + index < controller.myList!.length) { + return controller.myList![index].toString(); + } + if (controller.myMapData != null && + controller.myMapData!.containsKey(index.toString())) { + return controller.myMapData![index.toString()].toString(); + } + return ""; + } + + final String passengerName = + getValue(8).isEmpty ? "عميل" : getValue(8); + final String startAddr = + getValue(29).isEmpty ? "موقع الانطلاق" : getValue(29); + final String endAddr = + getValue(30).isEmpty ? "الوجهة" : getValue(30); + final bool isVisa = (getValue(13) == 'true'); + + // منطق Speed = سعر ثابت + final bool isSpeed = + controller.tripType.toLowerCase().contains('speed'); + final String carTypeLabel = + isSpeed ? "سعر ثابت" : controller.tripType; + final Color carTypeColor = + isSpeed ? Colors.red.shade700 : Colors.blue.shade700; + final IconData carIcon = + isSpeed ? Icons.local_offer : Icons.directions_car; + + return Stack( + children: [ + // 1. الخارطة + Positioned.fill( + bottom: 300, + child: IntaleqMap( + apiKey: AK.mapAPIKEY, + initialCameraPosition: CameraPosition( + target: LatLng( + controller.latPassenger, controller.lngPassenger), + zoom: 13.0, + ), + markers: controller.markers, + mapType: Get.isDarkMode + ? IntaleqMapType.normal + : IntaleqMapType.light, + polylines: controller.polylines, + zoomControlsEnabled: false, + myLocationButtonEnabled: false, + compassEnabled: false, + onMapCreated: (c) { + controller.onMapCreated(c); + controller.update(); + }, + ), + ), + + // 2. كبسولة الوصول للراكب + Positioned( + top: 50, + left: 0, + right: 0, + child: Center( + child: Container( + padding: const EdgeInsets.symmetric( + horizontal: 15, vertical: 8), + decoration: BoxDecoration( + color: Colors.black87, + borderRadius: BorderRadius.circular(30), + boxShadow: [ + BoxShadow(color: Colors.black26, blurRadius: 8) + ], + ), + child: Row( + mainAxisSize: MainAxisSize.min, + children: [ + const Icon(Icons.near_me, + color: Colors.amber, size: 16), + const SizedBox(width: 8), + Text( + "الوصول للراكب: ${controller.timeToPassenger}", + style: const TextStyle( + color: Colors.white, + fontWeight: FontWeight.bold, + fontSize: 13), + ), + ], + ), + ), + ), + ), + + // 3. البطاقة السفلية + Align( + alignment: Alignment.bottomCenter, + child: Container( + height: 360, + decoration: BoxDecoration( + color: Theme.of(context).cardColor, + borderRadius: const BorderRadius.only( + topLeft: Radius.circular(25), + topRight: Radius.circular(25), + ), + boxShadow: [ + BoxShadow( + color: + Theme.of(context).shadowColor.withOpacity(0.1), + blurRadius: 20, + spreadRadius: 5) + ], + ), + padding: const EdgeInsets.fromLTRB(20, 10, 20, 20), + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Center( + child: Container( + width: 40, + height: 4, + decoration: BoxDecoration( + color: Theme.of(context).dividerColor, + borderRadius: BorderRadius.circular(2)))), + + const SizedBox(height: 15), + + // الصف الأول: الراكب والسعر + Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + Row( + children: [ + CircleAvatar( + radius: 24, + backgroundColor: Theme.of(context) + .colorScheme + .surfaceVariant, + child: Icon(Icons.person, + color: Theme.of(context).hintColor, + size: 28), + ), + const SizedBox(width: 10), + Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Text(passengerName, + style: const TextStyle( + fontSize: 17, + fontWeight: FontWeight.bold)), + Row( + children: [ + const Icon(Icons.star, + color: Colors.amber, size: 14), + Text(controller.passengerRating, + style: const TextStyle( + fontSize: 13, + fontWeight: FontWeight.bold)), + ], + ), + ], + ), + ], + ), + Column( + crossAxisAlignment: CrossAxisAlignment.end, + children: [ + Text("${controller.tripPrice} ل.س", + style: const TextStyle( + fontSize: 20, + fontWeight: FontWeight.bold, + color: AppColor.primaryColor)), + Container( + padding: const EdgeInsets.symmetric( + horizontal: 8, vertical: 2), + decoration: BoxDecoration( + color: isVisa + ? Colors.purple.withOpacity(0.1) + : Colors.green.withOpacity(0.1), + borderRadius: BorderRadius.circular(4)), + child: Row( + children: [ + Text(isVisa ? "فيزا" : "كاش", + style: TextStyle( + fontSize: 11, + fontWeight: FontWeight.bold, + color: isVisa + ? Colors.purple + : Colors.green)), + const SizedBox(width: 4), + Icon( + isVisa + ? Icons.credit_card + : Icons.money, + size: 14, + color: isVisa + ? Colors.purple + : Colors.green), + ], + ), + ), + ], + ), + ], + ), + + const SizedBox(height: 15), + + // الصف الثاني: شريط المعلومات + Container( + padding: const EdgeInsets.symmetric( + vertical: 10, horizontal: 10), + decoration: BoxDecoration( + color: Theme.of(context) + .colorScheme + .surfaceVariant + .withOpacity(0.5), + borderRadius: BorderRadius.circular(12), + border: Border.all( + color: Theme.of(context).dividerColor), + ), + child: Row( + mainAxisAlignment: MainAxisAlignment.spaceAround, + children: [ + _buildInfoItem( + context, carIcon, carTypeLabel, carTypeColor), + Container( + height: 20, + width: 1, + color: Theme.of(context).dividerColor), + _buildInfoItem( + context, + Icons.route, + controller.totalTripDistance, + Theme.of(context) + .textTheme + .bodyLarge + ?.color ?? + Colors.black87), + Container( + height: 20, + width: 1, + color: Theme.of(context).dividerColor), + _buildInfoItem( + context, + Icons.access_time_filled, + controller.totalTripDuration, + Theme.of(context) + .textTheme + .bodyLarge + ?.color ?? + Colors.black87), + ], + ), + ), + + const SizedBox(height: 20), + + // الصف الثالث: العناوين + Expanded( + child: Row( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Column( + children: [ + const Icon(Icons.my_location, + size: 18, color: Colors.green), + Expanded( + child: Container( + width: 2, + color: Colors.grey.shade300, + margin: const EdgeInsets.symmetric( + vertical: 2))), + const Icon(Icons.location_on, + size: 18, color: Colors.red), + ], + ), + const SizedBox(width: 15), + Expanded( + child: Column( + mainAxisAlignment: + MainAxisAlignment.spaceBetween, + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Column( + crossAxisAlignment: + CrossAxisAlignment.start, + children: [ + const Text("موقع الانطلاق", + style: TextStyle( + fontSize: 11, + color: Colors.grey)), + Text(startAddr, + style: const TextStyle( + fontSize: 14, + fontWeight: FontWeight.w600), + maxLines: 1, + overflow: TextOverflow.ellipsis), + ], + ), + const Spacer(), + Column( + crossAxisAlignment: + CrossAxisAlignment.start, + children: [ + const Text("الوجهة", + style: TextStyle( + fontSize: 11, + color: Colors.grey)), + Text(endAddr, + style: const TextStyle( + fontSize: 14, + fontWeight: FontWeight.w600), + maxLines: 1, + overflow: TextOverflow.ellipsis), + ], + ), + ], + ), + ) + ], + ), + ), + + const SizedBox(height: 15), + + // الصف الرابع: الأزرار + Row( + children: [ + InkWell( + onTap: () => Get.back(), + child: Container( + height: 50, + width: 50, + decoration: BoxDecoration( + color: Colors.red.shade50, + shape: BoxShape.circle, + border: + Border.all(color: Colors.red.shade100)), + child: const Icon(Icons.close, + color: Colors.red, size: 24), + ), + ), + const SizedBox(width: 15), + Expanded( + child: ElevatedButton( + onPressed: () => controller.acceptOrder(), + style: ElevatedButton.styleFrom( + backgroundColor: AppColor.primaryColor, + foregroundColor: Colors.white, + padding: + const EdgeInsets.symmetric(vertical: 14), + shape: RoundedRectangleBorder( + borderRadius: BorderRadius.circular(15)), + elevation: 2, + ), + child: Row( + mainAxisAlignment: MainAxisAlignment.center, + children: [ + const Text("قبول الرحلة", + style: TextStyle( + fontSize: 16, + fontWeight: FontWeight.bold)), + const SizedBox(width: 15), + SizedBox( + width: 20, + height: 20, + child: CircularProgressIndicator( + value: controller.progress, + color: Colors.white, + strokeWidth: 2.5, + backgroundColor: Colors.white24), + ), + const SizedBox(width: 8), + Text("${controller.remainingTime}", + style: const TextStyle( + fontSize: 14, color: Colors.white)), + ], + ), + ), + ), + ], + ), + ], + ), + ), + ), + ], + ); + }, + ), + ), + ); + } + + Widget _buildInfoItem( + BuildContext context, IconData icon, String text, Color color) { + return Row( + mainAxisSize: MainAxisSize.min, + children: [ + Icon(icon, size: 16, color: color), + const SizedBox(width: 6), + Text(text, + style: TextStyle( + fontSize: 13, fontWeight: FontWeight.bold, color: color)), + ], + ); + } +} diff --git a/siro_driver/lib/views/home/Captin/orderCaptin/order_speed_request.dart b/siro_driver/lib/views/home/Captin/orderCaptin/order_speed_request.dart new file mode 100755 index 0000000..7c0c175 --- /dev/null +++ b/siro_driver/lib/views/home/Captin/orderCaptin/order_speed_request.dart @@ -0,0 +1,558 @@ +// import 'dart:convert'; + +// import 'package:flutter/material.dart'; +// import 'package:get/get.dart'; +// import 'package:intaleq_maps/intaleq_maps.dart'; + +// import 'package:siro_driver/controller/home/captin/home_captain_controller.dart'; +// import 'package:siro_driver/constant/box_name.dart'; +// import 'package:siro_driver/controller/firebase/firbase_messge.dart'; +// import 'package:siro_driver/main.dart'; +// import 'package:siro_driver/print.dart'; +// import 'package:siro_driver/views/home/Captin/driver_map_page.dart'; + +// import '../../../../constant/colors.dart'; +// import '../../../../constant/links.dart'; +// import '../../../../constant/style.dart'; +// import '../../../../controller/firebase/notification_service.dart'; +// import '../../../../controller/functions/crud.dart'; +// import '../../../../controller/functions/launch.dart'; +// import '../../../../controller/home/captin/order_request_controller.dart'; +// import '../../../widgets/elevated_btn.dart'; +// import '../../../widgets/mydialoug.dart'; + +// class OrderSpeedRequest extends StatelessWidget { +// OrderSpeedRequest({super.key}); + +// final OrderRequestController orderRequestController = +// Get.put(OrderRequestController()); + +// // دالة مساعدة لاستخراج البيانات بأمان (Null Safety) +// String _getData(int index, {String defaultValue = ''}) { +// // if (orderRequestController.myList.length > index && +// // orderRequestController.myList[index] != null) { +// // return orderRequestController.myList[index].toString(); +// // } +// return defaultValue; +// } + +// @override +// Widget build(BuildContext context) { +// return GetBuilder( +// builder: (controller) { +// // --- استخراج البيانات بشكل نظيف --- +// final String price = +// double.tryParse(_getData(2))?.toStringAsFixed(2) ?? 'N/A'; +// final bool isComfortTrip = _getData(31) == 'Comfort'; +// final String carType = _getData(31).tr; + +// final String pickupName = _getData(12); +// final String pickupDetails = '(${_getData(11)})'; +// final String pickupFullAddress = _getData(29); +// final String dropoffName = _getData(5); +// final String dropoffDetails = '(${_getData(4)})'; +// final String dropoffFullAddress = _getData(30); + +// final String passengerName = _getData(8); +// final String passengerRating = _getData(33); +// final bool isVisaPayment = _getData(13) == 'true'; +// final bool hasSteps = _getData(20) == 'haveSteps'; + +// final String mapUrl = +// 'https://www.google.com/maps/dir/${_getData(0)}/${_getData(1)}/'; +// final String rideId = _getData(16); + +// return Scaffold( +// appBar: AppBar( +// title: Text('Speed Order'.tr), +// leading: IconButton( +// icon: const Icon(Icons.arrow_back), +// onPressed: () => Get.back(), +// ), +// backgroundColor: AppColor.primaryColor, +// elevation: 2.0, +// ), +// backgroundColor: AppColor.secondaryColor ?? Colors.grey[100], +// body: SafeArea( +// child: Padding( +// padding: +// const EdgeInsets.symmetric(horizontal: 10.0, vertical: 8.0), +// child: Column( +// children: [ +// // 1. قسم الخريطة (ارتفاع ثابت) +// SizedBox( +// height: Get.height * 0.28, +// child: ClipRRect( +// borderRadius: BorderRadius.circular(15.0), +// child: GoogleMap( +// initialCameraPosition: CameraPosition( +// zoom: 12, +// target: Get.find().myLocation, +// ), +// cameraTargetBounds: +// CameraTargetBounds(controller.bounds), +// myLocationButtonEnabled: false, +// trafficEnabled: false, +// buildingsEnabled: false, +// mapToolbarEnabled: false, +// myLocationEnabled: true, +// markers: { +// Marker( +// markerId: MarkerId('MyLocation'.tr), +// position: LatLng(controller.latPassengerLocation, +// controller.lngPassengerLocation), +// icon: controller.startIcon), +// Marker( +// markerId: MarkerId('Destination'.tr), +// position: LatLng( +// controller.latPassengerDestination, +// controller.lngPassengerDestination), +// icon: controller.endIcon), +// }, +// polylines: { +// Polyline( +// zIndex: 1, +// consumeTapEvents: true, +// geodesic: true, +// endCap: Cap.buttCap, +// startCap: Cap.buttCap, +// visible: true, +// polylineId: const PolylineId('routeOrder'), +// points: controller.pointsDirection, +// color: AppColor.primaryColor, +// width: 3, +// ), +// }, +// ), +// ), +// ), + +// const SizedBox(height: 8), + +// // 2. بطاقة السعر +// _buildPriceCard(price, carType, isComfortTrip), + +// const SizedBox(height: 8), + +// // 3. التفاصيل القابلة للتمرير (تأخذ المساحة المتبقية) +// Expanded( +// child: SingleChildScrollView( +// physics: const BouncingScrollPhysics(), +// child: Column( +// mainAxisSize: MainAxisSize.min, +// children: [ +// _buildLocationCard( +// icon: Icons.arrow_circle_up, +// iconColor: AppColor.greenColor, +// title: pickupName, +// subtitle: pickupDetails, +// fullAddress: pickupFullAddress, +// ), +// const SizedBox(height: 8), +// _buildLocationCard( +// icon: Icons.arrow_circle_down, +// iconColor: AppColor.redColor, +// title: dropoffName, +// subtitle: dropoffDetails, +// fullAddress: dropoffFullAddress, +// ), +// const SizedBox(height: 8), +// _buildInfoCard(isVisaPayment, hasSteps, mapUrl), +// const SizedBox(height: 8), +// _buildPassengerCard(passengerName, passengerRating), +// ], +// ), +// ), +// ), + +// // 4. الأزرار والمؤقت (مثبتة في الأسفل) +// Padding( +// padding: const EdgeInsets.only(top: 8.0), +// child: Row( +// mainAxisAlignment: MainAxisAlignment.spaceBetween, +// children: [ +// // زر القبول +// Expanded( +// child: MyElevatedButton( +// kolor: AppColor.greenColor, +// title: 'Accept Order'.tr, +// onPressed: () => _handleAcceptOrder(controller), +// ), +// ), +// const SizedBox(width: 10), + +// // المؤقت +// GetBuilder( +// id: 'timerUpdate', +// builder: (timerCtrl) { +// final isNearEnd = timerCtrl.remainingTimeSpeed <= 5; +// return SizedBox( +// width: 60, +// height: 60, +// child: Stack( +// alignment: Alignment.center, +// children: [ +// CircularProgressIndicator( +// value: timerCtrl.progressSpeed, +// color: isNearEnd +// ? Colors.redAccent +// : AppColor.primaryColor, +// strokeWidth: 5, +// backgroundColor: Colors.grey.shade300, +// ), +// Text( +// '${timerCtrl.remainingTimeSpeed}', +// style: AppStyle.headTitle2.copyWith( +// color: isNearEnd +// ? Colors.redAccent +// : AppColor.writeColor ?? Colors.black, +// ), +// ), +// ], +// ), +// ); +// }, +// ), + +// const SizedBox(width: 10), +// // زر الرفض +// Expanded( +// child: MyElevatedButton( +// title: 'Refuse Order'.tr, +// onPressed: () => +// _handleRefuseOrder(controller, rideId), +// kolor: AppColor.redColor, +// ), +// ), +// ], +// ), +// ), +// ], +// ), +// ), +// ), +// ); +// }, +// ); +// } + +// // --- WIDGET BUILDERS (لبناء الواجهة بشكل نظيف) --- + +// // Widget _buildPriceCard(String price, String carType, bool isComfortTrip) { +// // return Card( +// // elevation: 3, +// // shape: RoundedRectangleBorder(borderRadius: BorderRadius.circular(12)), +// // child: Padding( +// // padding: const EdgeInsets.symmetric(vertical: 12.0, horizontal: 16.0), +// // child: Row( +// // mainAxisAlignment: MainAxisAlignment.spaceBetween, +// // children: [ +// // Text( +// // price, +// // style: AppStyle.headTitle.copyWith( +// // color: AppColor.primaryColor, +// // fontWeight: FontWeight.bold, +// // fontSize: 28), +// // ), +// // Column( +// // crossAxisAlignment: CrossAxisAlignment.end, +// // children: [ +// // Text( +// // carType, +// // style: AppStyle.title.copyWith( +// // color: AppColor.greenColor, fontWeight: FontWeight.bold), +// // ), +// // if (isComfortTrip) +// // Row( +// // children: [ +// // const Icon(Icons.ac_unit, +// // color: AppColor.blueColor, size: 18), +// // const SizedBox(width: 4), +// // Text('Air condition Trip'.tr, +// // style: AppStyle.subtitle.copyWith(fontSize: 13)), +// // ], +// // ), +// // ], +// // ), +// // ], +// // ), +// // ), +// // ); +// // } + +// // Widget _buildInfoCard(bool isVisaPayment, bool hasSteps, String mapUrl) { +// // return Card( +// // elevation: 2, +// // shape: RoundedRectangleBorder(borderRadius: BorderRadius.circular(10)), +// // child: Padding( +// // padding: const EdgeInsets.all(10.0), +// // child: Row( +// // mainAxisAlignment: MainAxisAlignment.spaceBetween, +// // children: [ +// // Row( +// // children: [ +// // Icon( +// // isVisaPayment ? Icons.credit_card : Icons.payments_outlined, +// // color: isVisaPayment +// // ? AppColor.deepPurpleAccent +// // : AppColor.greenColor, +// // size: 24, +// // ), +// // const SizedBox(width: 8), +// // Text( +// // isVisaPayment ? 'Visa'.tr : 'Cash'.tr, +// // style: AppStyle.title.copyWith(fontWeight: FontWeight.w600), +// // ), +// // ], +// // ), +// // if (hasSteps) +// // Expanded( +// // child: Row( +// // mainAxisAlignment: MainAxisAlignment.center, +// // children: [ +// // const Icon(Icons.format_list_numbered_rtl_outlined, +// // color: AppColor.bronze, size: 24), +// // const SizedBox(width: 4), +// // Flexible( +// // child: Text( +// // 'Trip has Steps'.tr, +// // style: AppStyle.title +// // .copyWith(color: AppColor.bronze, fontSize: 13), +// // overflow: TextOverflow.ellipsis, +// // )), +// // ], +// // ), +// // ), +// // TextButton.icon( +// // style: TextButton.styleFrom( +// // padding: EdgeInsets.zero, +// // tapTargetSize: MaterialTapTargetSize.shrinkWrap, +// // alignment: Alignment.centerRight, +// // ), +// // onPressed: () => showInBrowser(mapUrl), +// // icon: const Icon(Icons.directions_outlined, +// // color: AppColor.blueColor, size: 20), +// // label: Text("Directions".tr, +// // style: AppStyle.subtitle +// // .copyWith(color: AppColor.blueColor, fontSize: 13)), +// // ), +// // ], +// // ), +// // ), +// // ); +// // } + +// // Widget _buildPassengerCard(String name, String rating) { +// // return Card( +// // elevation: 2, +// // shape: RoundedRectangleBorder(borderRadius: BorderRadius.circular(10)), +// // child: Padding( +// // padding: const EdgeInsets.symmetric(horizontal: 16.0, vertical: 10.0), +// // child: Row( +// // children: [ +// // const Icon(Icons.person_outline, +// // color: AppColor.greyColor, size: 22), +// // const SizedBox(width: 10), +// // Expanded( +// // child: Text( +// // name, +// // style: AppStyle.title, +// // overflow: TextOverflow.ellipsis, +// // ), +// // ), +// // const SizedBox(width: 10), +// // const Icon(Icons.star_rounded, color: Colors.amber, size: 20), +// // Text( +// // rating, +// // style: AppStyle.title.copyWith(fontWeight: FontWeight.bold), +// // ), +// // ], +// // ), +// // ), +// // ); +// // } + +// // Widget _buildLocationCard( +// {required IconData icon, +// required Color iconColor, +// required String title, +// required String subtitle, +// required String fullAddress}) { +// return Card( +// elevation: 2, +// shape: RoundedRectangleBorder(borderRadius: BorderRadius.circular(10)), +// margin: const EdgeInsets.symmetric(vertical: 4), +// child: Padding( +// padding: const EdgeInsets.all(10.0), +// child: Row( +// crossAxisAlignment: CrossAxisAlignment.start, +// children: [ +// Icon(icon, color: iconColor, size: 28), +// const SizedBox(width: 12), +// Expanded( +// child: Column( +// crossAxisAlignment: CrossAxisAlignment.start, +// children: [ +// Text( +// "$title $subtitle".trim(), +// style: AppStyle.title.copyWith(fontWeight: FontWeight.w600), +// maxLines: 1, +// overflow: TextOverflow.ellipsis, +// ), +// if (fullAddress.isNotEmpty) ...[ +// const SizedBox(height: 3), +// Text( +// fullAddress, +// style: AppStyle.subtitle +// .copyWith(fontSize: 13, color: AppColor.greyColor), +// maxLines: 2, +// overflow: TextOverflow.ellipsis, +// ), +// ] +// ], +// ), +// ), +// ], +// ), +// ), +// ); +// } + +// // // --- منطق التعامل مع الطلبات (Logic Handlers) --- + +// // Future _handleAcceptOrder(OrderRequestController controller) async { +// // // 1. محاولة تحديث الحالة في السيرفر +// // // 1. إظهار لودينج وإيقاف التفاعل +// // Get.dialog(const Center(child: CircularProgressIndicator()), +// // barrierDismissible: false); +// // // هذا الرابط يجب أن يكون لملف PHP الآمن الذي يحتوي على rowCount +// // var res = await CRUD().post(link: AppLink.updateStausFromSpeed, payload: { +// // 'id': (controller.myList[16]), +// // 'rideTimeStart': DateTime.now().toString(), +// // 'status': 'Apply', +// // 'driver_id': box.read(BoxName.driverID), +// // }); +// // Log.print('oreder response update: ${res}'); +// // // 2. إغلاق اللودينج بمجرد وصول الرد +// // Get.back(); // إغلاق اللودينج +// // // 2. معالجة الفشل (Robust Error Handling) +// // // نفحص إذا كانت النتيجة فشل سواء وصلت كنص أو كـ JSON +// // bool isFailed = false; +// // if (res == 'failure') isFailed = true; + +// // if (res is Map && res['status'] == 'failure') isFailed = true; + +// // if (isFailed) { +// // MyDialog().getDialog( +// // "This ride is already applied by another driver.".tr, '', () { +// // Get.back(); // يغلق نافذة التنبيه (Dialog) +// // Get.back(); // يغلق صفحة الطلب بالكامل (Screen) ويرجع للخريطة +// // }); +// // return; // توقف تام للكود هنا، لن يتم تنفيذ أي سطر بالأسفل +// // } + +// // // 3. معالجة النجاح (Success Handling) + +// // // إيقاف المؤقت وتحديث الواجهة +// // controller.endTimer(); +// // controller.changeApplied(); + +// // // تحديث حالة السائق في التطبيق +// // Get.put(HomeCaptainController()).changeRideId(); +// // box.write(BoxName.statusDriverLocation, 'on'); + +// // // *هام*: تم حذف استدعاء الـ API الثاني المكرر هنا لأنه غير ضروري وقد يسبب مشاكل + +// // // تسجيل الطلب في سجل السائقين (Driver History) +// // CRUD().postFromDialogue(link: AppLink.addDriverOrder, payload: { +// // 'driver_id': (controller.myList[6].toString()), +// // 'order_id': (controller.myList[16].toString()), +// // 'status': 'Apply' +// // }); + +// // // إرسال إشعار للراكب +// // List bodyToPassenger = [ +// // controller.myList[6].toString(), +// // controller.myList[8].toString(), +// // controller.myList[9].toString(), +// // ]; + +// // NotificationService.sendNotification( +// // target: controller.myList[9].toString(), +// // title: "Accepted Ride".tr, +// // body: 'your ride is Accepted'.tr, +// // isTopic: false, +// // tone: 'start', +// // driverList: bodyToPassenger, +// // category: 'Accepted Ride', +// // ); + +// // // حفظ البيانات في الصندوق (Box) للانتقال للصفحة التالية +// // box.write(BoxName.rideArguments, { +// // 'passengerLocation': controller.myList[0].toString(), +// // 'passengerDestination': controller.myList[1].toString(), +// // 'Duration': controller.myList[4].toString(), +// // 'totalCost': controller.myList[26].toString(), +// // 'Distance': controller.myList[5].toString(), +// // 'name': controller.myList[8].toString(), +// // 'phone': controller.myList[10].toString(), +// // 'email': controller.myList[28].toString(), +// // 'WalletChecked': controller.myList[13].toString(), +// // 'tokenPassenger': controller.myList[9].toString(), +// // 'direction': +// // 'https://www.google.com/maps/dir/${controller.myList[0]}/${controller.myList[1]}/', +// // 'DurationToPassenger': controller.myList[15].toString(), +// // 'rideId': (controller.myList[16].toString()), +// // 'passengerId': (controller.myList[7].toString()), +// // 'driverId': (controller.myList[18].toString()), +// // 'durationOfRideValue': controller.myList[19].toString(), +// // 'paymentAmount': controller.myList[2].toString(), +// // 'paymentMethod': +// // controller.myList[13].toString() == 'true' ? 'visa' : 'cash', +// // 'isHaveSteps': controller.myList[20].toString(), +// // 'step0': controller.myList[21].toString(), +// // 'step1': controller.myList[22].toString(), +// // 'step2': controller.myList[23].toString(), +// // 'step3': controller.myList[24].toString(), +// // 'step4': controller.myList[25].toString(), +// // 'passengerWalletBurc': controller.myList[26].toString(), +// // 'timeOfOrder': DateTime.now().toString(), +// // 'totalPassenger': controller.myList[2].toString(), +// // 'carType': controller.myList[31].toString(), +// // 'kazan': controller.myList[32].toString(), +// // 'startNameLocation': controller.myList[29].toString(), +// // 'endNameLocation': controller.myList[30].toString(), +// // }); + +// // // الانتقال لصفحة تتبع الراكب +// // Get.back(); // يغلق صفحة الطلب الحالية +// // Get.to(() => PassengerLocationMapPage(), +// // arguments: box.read(BoxName.rideArguments)); +// // Log.print( +// // 'box.read(BoxName.rideArguments): ${box.read(BoxName.rideArguments)}'); +// // } + +// // void _handleRefuseOrder(OrderRequestController controller, String rideId) { +// controller.endTimer(); +// // controller.refuseOrder(rideId); + +// // تسجيل الرفض في الإشعارات المحلية للسائق +// controller.addRideToNotificationDriverString( +// rideId, +// _getData(29), +// _getData(30), +// '${DateTime.now().year}-${DateTime.now().month}-${DateTime.now().day}', +// '${DateTime.now().hour}:${DateTime.now().minute}', +// _getData(2), +// _getData(7), +// 'wait', +// _getData(31), +// _getData(33), +// _getData(2), +// _getData(5), +// _getData(4)); + +// // الخروج من الصفحة بعد الرفض +// Get.back(); +// } +// // } diff --git a/siro_driver/lib/views/home/Captin/orderCaptin/test_order_page.dart b/siro_driver/lib/views/home/Captin/orderCaptin/test_order_page.dart new file mode 100755 index 0000000..770385c --- /dev/null +++ b/siro_driver/lib/views/home/Captin/orderCaptin/test_order_page.dart @@ -0,0 +1,228 @@ +import 'dart:convert'; +import 'package:flutter/material.dart'; +import 'package:get/get.dart'; +import 'package:intaleq_maps/intaleq_maps.dart'; +import 'package:siro_driver/constant/api_key.dart'; +import 'dart:math' as math; + +import '../../../../constant/colors.dart'; +import '../../../../controller/home/captin/home_captain_controller.dart'; + +class OrderRequestPageTest extends StatefulWidget { + const OrderRequestPageTest({super.key}); + + @override + State createState() => _OrderRequestPageTestState(); +} + +class _OrderRequestPageTestState extends State { + late OrderRequestController _orderRequestController; + + @override + void initState() { + super.initState(); + // Initialize the controller and process arguments + _initializeController(); + } + + void _initializeController() { + // Get the controller or create a new one if not exists + _orderRequestController = Get.put(OrderRequestController()); + + // Process arguments passed to the page + final arguments = Get.arguments; + final myListString = arguments['myListString']; + var myList = + arguments['DriverList'] == null || arguments['DriverList'].isEmpty + ? jsonDecode(myListString) + : arguments['DriverList']; + + // Parse coordinates and prepare map data + _orderRequestController.parseCoordinates(myList); + + // Start timer and calculate fuel consumption + _orderRequestController.startTimer( + myList[6].toString(), + myList[16].toString(), + ); + _orderRequestController.calculateConsumptionFuel(); + } + + @override + Widget build(BuildContext context) { + return Scaffold( + body: Stack( + children: [ + Padding( + padding: const EdgeInsets.symmetric(horizontal: 6), + child: Container( + color: const Color.fromARGB(255, 241, 238, 238), + child: ListView( + children: [ + SizedBox( + height: Get.height * .33, + child: Obx(() => IntaleqMap( + apiKey: AK.mapAPIKEY, + initialCameraPosition: CameraPosition( + zoom: 12, + target: + Get.find().myLocation, + ), + cameraTargetBounds: CameraTargetBounds( + _orderRequestController.mapBounds.value), + myLocationButtonEnabled: true, + // trafficEnabled: false, + // buildingsEnabled: false, + // mapToolbarEnabled: true, + myLocationEnabled: true, + markers: _orderRequestController.markers.value, + polylines: _orderRequestController.polylines.value, + onMapCreated: (IntaleqMapController controller) { + _orderRequestController.mapController.value = + controller; + }, + onCameraMove: (CameraPosition position) { + _orderRequestController + .updateCameraPosition(position); + }, + )), + ), + // Rest of your UI components + ], + ), + ), + ), + ], + ), + ); + } +} + +class OrderRequestController extends GetxController { + // Reactive variables for map-related data + Rx mapBounds = Rx(LatLngBounds( + southwest: const LatLng(0, 0), northeast: const LatLng(0, 0))); + + Rx> markers = Rx>({}); + Rx> polylines = Rx>({}); + + Rx mapController = Rx(null); + + // Icons for start and end markers + late InlqBitmap startIcon; + late InlqBitmap endIcon; + + // Coordinates for passenger location and destination + Rx passengerLocation = Rx(null); + Rx passengerDestination = Rx(null); + + @override + void onInit() { + super.onInit(); + // Initialize marker icons + _initializeMarkerIcons(); + } + + void _initializeMarkerIcons() async { + // Load custom marker icons + startIcon = InlqBitmap.fromAsset('assets/start_marker.png'); + endIcon = InlqBitmap.fromAsset('assets/end_marker.png'); + } + + void parseCoordinates(List myList) { + // Parse coordinates from the input list + var cords = myList[0].split(','); + var cordDestination = myList[1].split(','); + + double latPassengerLocation = double.parse(cords[0]); + double lngPassengerLocation = double.parse(cords[1]); + double latPassengerDestination = double.parse(cordDestination[0]); + double lngPassengerDestination = double.parse(cordDestination[1]); + + // Update passenger location and destination + passengerLocation.value = + LatLng(latPassengerLocation, lngPassengerLocation); + passengerDestination.value = + LatLng(latPassengerDestination, lngPassengerDestination); + + // Create markers + _createMarkers(); + + // Create polyline + _createPolyline(); + + // Calculate map bounds + _calculateMapBounds(); + } + + void _createMarkers() { + if (passengerLocation.value == null || passengerDestination.value == null) + return; + + markers.value = { + Marker( + markerId: MarkerId('MyLocation'.tr), + position: passengerLocation.value!, + draggable: true, + icon: startIcon, + ), + Marker( + markerId: MarkerId('Destination'.tr), + position: passengerDestination.value!, + draggable: true, + icon: endIcon, + ), + }; + } + + void _createPolyline() { + if (passengerLocation.value == null || passengerDestination.value == null) + return; + + polylines.value = { + Polyline( + zIndex: 1, + // consumeTapEvents: true, + geodesic: true, + // endCap: Cap.buttCap, + // startCap: Cap.buttCap, + visible: true, + polylineId: const PolylineId('routeOrder'), + points: [passengerLocation.value!, passengerDestination.value!], + color: AppColor.primaryColor, + width: 2, + ), + }; + } + + void _calculateMapBounds() { + if (passengerLocation.value == null || passengerDestination.value == null) + return; + + double minLatitude = math.min(passengerLocation.value!.latitude, + passengerDestination.value!.latitude); + double maxLatitude = math.max(passengerLocation.value!.latitude, + passengerDestination.value!.latitude); + double minLongitude = math.min(passengerLocation.value!.longitude, + passengerDestination.value!.longitude); + double maxLongitude = math.max(passengerLocation.value!.longitude, + passengerDestination.value!.longitude); + + mapBounds.value = LatLngBounds( + southwest: LatLng(minLatitude, minLongitude), + northeast: LatLng(maxLatitude, maxLongitude), + ); + } + + void updateCameraPosition(CameraPosition position) { + // Implement any specific logic for camera position updates + } + + void startTimer(String param1, String param2) { + // Implement timer start logic + } + + void calculateConsumptionFuel() { + // Implement fuel consumption calculation + } +} diff --git a/siro_driver/lib/views/home/Captin/orderCaptin/vip_order_page.dart b/siro_driver/lib/views/home/Captin/orderCaptin/vip_order_page.dart new file mode 100755 index 0000000..6705a8e --- /dev/null +++ b/siro_driver/lib/views/home/Captin/orderCaptin/vip_order_page.dart @@ -0,0 +1,237 @@ +import 'dart:convert'; + +import 'package:siro_driver/constant/box_name.dart'; +import 'package:siro_driver/constant/links.dart'; +import 'package:siro_driver/controller/functions/crud.dart'; +import 'package:siro_driver/views/widgets/my_scafold.dart'; +import 'package:flutter/material.dart'; +import 'package:get/get.dart'; + +import '../../../../main.dart'; +import '../../../../print.dart'; + +class VipOrderPage extends StatelessWidget { + const VipOrderPage({super.key}); + + @override + Widget build(BuildContext context) { + Get.put(VipOrderController()); + return MyScafolld( + title: 'VIP Order'.tr, + body: [ + GetBuilder(builder: (vipOrderController) { + if (vipOrderController.isLoading) { + return const Center( + child: CircularProgressIndicator(), + ); + } + + if (vipOrderController.tripData.isEmpty) { + return Center( + child: Text('No orders available'.tr), + ); + } + final order = vipOrderController.tripData[0]; + Log.print('order: ${order}'); + return SafeArea( + child: Padding( + padding: const EdgeInsets.all(8.0), + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + // Passenger Section + _buildSectionTitle('Passenger Information'.tr), + _buildInfoCard( + children: [ + _buildDetailRow('Name'.tr, + '${order['passengerName'] ?? 'Unknown'} ${order['passengerLastName'] ?? ''}'), + _buildDetailRow( + 'Phone'.tr, order['passengerPhone'] ?? 'Unknown'), + _buildDetailRow( + 'Gender'.tr, order['passengergender'] ?? 'Unknown'), + _buildDetailRow('time Selected'.tr, + order['timeSelected'] ?? 'Unknown'), + _buildDetailRow( + 'Ride Status'.tr, order['status'] ?? 'Unknown'), + // _buildDetailRow('Ride Status'.tr, + // vipOrderController.myList[4] ?? 'Unknown'), + IconButton( + onPressed: () { + // print(vipOrderController.myList); + }, + icon: const Icon(Icons.add), + ), + ], + ), + + const SizedBox(height: 24), + + // Action Buttons + _buildActionButtons(context), + ], + ), + ), + ); + }) + ], + isleading: true, + ); + } +} + +Widget _buildSectionTitle(String title) { + return Padding( + padding: const EdgeInsets.only(bottom: 8.0), + child: Text( + title, + style: const TextStyle( + fontSize: 18, + fontWeight: FontWeight.bold, + color: Colors.black87, + ), + ), + ); +} + +Widget _buildInfoCard({required List children}) { + return Container( + decoration: BoxDecoration( + color: Colors.white, + borderRadius: BorderRadius.circular(12), + boxShadow: [ + BoxShadow( + color: Colors.grey.withOpacity(0.2), + spreadRadius: 1, + blurRadius: 5, + offset: const Offset(0, 3), + ), + ], + ), + child: Padding( + padding: const EdgeInsets.all(16.0), + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: children, + ), + ), + ); +} + +Widget _buildDetailRow(String label, String value) { + return Padding( + padding: const EdgeInsets.symmetric(vertical: 8.0), + child: Row( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Expanded( + flex: 2, + child: Text( + label, + style: const TextStyle( + fontWeight: FontWeight.bold, + color: Colors.black87, + ), + ), + ), + Expanded( + flex: 3, + child: Text( + value, + style: const TextStyle(color: Colors.black54), + ), + ), + ], + ), + ); +} + +Widget _buildActionButtons(BuildContext context) { + return Row( + children: [ + Expanded( + child: ElevatedButton( + onPressed: () => _onReject(context), + style: ElevatedButton.styleFrom( + backgroundColor: Colors.red, + padding: const EdgeInsets.symmetric(vertical: 16), + shape: RoundedRectangleBorder( + borderRadius: BorderRadius.circular(12), + ), + ), + child: Text( + 'Reject'.tr, + style: const TextStyle( + color: Colors.white, + fontWeight: FontWeight.bold, + ), + ), + ), + ), + const SizedBox(width: 16), + Expanded( + child: ElevatedButton( + onPressed: () => _onApply(context), + style: ElevatedButton.styleFrom( + backgroundColor: Colors.green, + padding: const EdgeInsets.symmetric(vertical: 16), + shape: RoundedRectangleBorder( + borderRadius: BorderRadius.circular(12), + ), + ), + child: Text( + 'Apply'.tr, + style: const TextStyle( + color: Colors.white, + fontWeight: FontWeight.bold, + ), + ), + ), + ), + ], + ); +} + +void _onReject(BuildContext context) { + ScaffoldMessenger.of(context).showSnackBar( + const SnackBar( + content: Text('Ride Rejected'), + backgroundColor: Colors.red, + ), + ); +} + +void _onApply(BuildContext context) { + // TODO: Implement application logic + ScaffoldMessenger.of(context).showSnackBar( + const SnackBar( + content: Text('Ride Applied'), + backgroundColor: Colors.green, + ), + ); +} + +class VipOrderController extends GetxController { + bool isLoading = false; + List tripData = []; + + fetchOrder() async { + isLoading = true; // Set loading state + update(); // Notify listeners + var res = await CRUD().get(link: AppLink.getMishwariDriver, payload: { + 'driverId': box.read(BoxName.driverID).toString(), + }); + if (res != 'failure') { + tripData = jsonDecode(res)['message']; + } else { + tripData = []; + } + isLoading = false; // Loading complete + update(); // Notify listeners + } + + @override + void onInit() async { + fetchOrder(); + super.onInit(); + } +} diff --git a/siro_driver/lib/views/home/Captin/passportimage.dart b/siro_driver/lib/views/home/Captin/passportimage.dart new file mode 100755 index 0000000..61c4791 --- /dev/null +++ b/siro_driver/lib/views/home/Captin/passportimage.dart @@ -0,0 +1,46 @@ +// import 'dart:io'; +// +// import 'package:flutter/material.dart'; +// import 'package:get/get.dart'; +// import '../../../controller/functions/ocr_controller.dart'; +// +// class PassportDataExtractorWidget extends StatelessWidget { +// final PassportDataExtractor passportDataExtractor = +// Get.put(PassportDataExtractor()); +// final PassportDataController controller = Get.put(PassportDataController()); +// +// @override +// Widget build(BuildContext context) { +// return Scaffold( +// appBar: AppBar( +// title: const Text('Passport Data Extractor'), +// ), +// body: Column( +// children: [ +// ElevatedButton( +// onPressed: controller.extractDataAndDrawBoundingBoxes, +// child: const Text('Extract Data'), +// ), +// Expanded( +// child: Center( +// child: Stack( +// children: [ +// GetBuilder( +// builder: (controller) => CustomPaint( +// painter: BoundingBoxPainter( +// controller.extractedTextWithCoordinates), +// child: GetBuilder( +// builder: (controller) => +// Image.file(File(passportDataExtractor.image!.path)), +// ), +// ), +// ), +// ], +// ), +// ), +// ), +// ], +// ), +// ); +// } +// } diff --git a/siro_driver/lib/views/home/Captin/text_scanner.dart b/siro_driver/lib/views/home/Captin/text_scanner.dart new file mode 100755 index 0000000..86d1822 --- /dev/null +++ b/siro_driver/lib/views/home/Captin/text_scanner.dart @@ -0,0 +1,175 @@ +import 'dart:convert'; + +import 'package:flutter/material.dart'; +import 'package:get/get.dart'; +import 'package:siro_driver/views/widgets/mycircular.dart'; + +import '../../../controller/functions/ocr_controller.dart'; + +class TextRecognizerAPI extends StatelessWidget { + const TextRecognizerAPI({super.key}); + + @override + Widget build(BuildContext context) { + Get.put(ScanDocumentsByApi()); + return GetBuilder( + builder: (controller) => Scaffold( + appBar: AppBar( + title: Text('Api'), + actions: [ + IconButton( + onPressed: () { + controller.matchFaceApi(); + }, + icon: const Icon(Icons.face), + ), + ], + ), + body: Center( + child: controller.isLoading + ? const MyCircularProgressIndicator() + : SingleChildScrollView( + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Row( + children: [ + Image.memory( + controller.imagePortrait, + width: 60, + ), + Image.memory( + controller.imageSignature, + width: 60, + ), + Image.memory( + controller.imageDocumentFrontSide, + width: 250, + ), + ], + ), + Text(controller.responseMap['authenticity_meta'] + .toString()), + Text( + 'countryName: ${controller.responseMap['data']['countryName'].toString()}'), + Text( + 'Expiry Date: ${controller.responseMap['data']['ocr']['dateOfExpiry'].toString()}'), + // Add more Text widgets to display other record values + Text( + 'Address: ${controller.responseMap['data']['ocr']['address'].toString()}'), + Text( + 'City: ${controller.responseMap['data']['ocr']['addressCity'].toString()}'), + Text( + 'Jurisdiction Code: ${controller.responseMap['data']['ocr']['addressJurisdictionCode'].toString()}'), + Text( + 'Postal Code: ${controller.responseMap['data']['ocr']['addressPostalCode'].toString()}'), + Text( + 'Street: ${controller.responseMap['data']['ocr']['addressStreet'].toString()}'), + Text( + 'Date of Birth: ${controller.responseMap['data']['ocr']['dateOfBirth'].toString()}'), + Text( + 'Date of Issue: ${controller.responseMap['data']['ocr']['dateOfIssue'].toString()}'), + Text( + 'Drivers License Class: ${controller.responseMap['data']['ocr']['dlClass'].toString()}'), + Text( + 'Document Number: ${controller.responseMap['data']['ocr']['documentNumber'].toString()}'), + Text( + 'Eye Color: ${controller.responseMap['data']['ocr']['eyesColor'].toString()}'), + Text( + 'Given Names: ${controller.responseMap['data']['ocr']['givenNames'].toString()}'), + Text( + 'Height: ${controller.responseMap['data']['ocr']['height'].toString()}'), + Text( + 'Issuing State Code: ${controller.responseMap['data']['ocr']['issuingStateCode'].toString()}'), + Text( + 'Name: ${controller.responseMap['data']['ocr']['name'].toString()}'), + Text( + 'Sex: ${controller.responseMap['data']['ocr']['sex'].toString()}'), + Text( + 'Surname: ${controller.responseMap['data']['ocr']['surname'].toString()}'), + Text( + 'Valid State: ${controller.responseMap['data']['ocr']['validState'].toString()}'), + ], + ), + )))); + } +} +// class TextExtractionView extends StatelessWidget { +// TextExtractionView({super.key}); +// +// @override +// Widget build(BuildContext context) { +// Get.put(TextExtractionController()); +// return Scaffold( +// appBar: AppBar( +// title: const Text('Text Extraction'), +// ), +// body: GetBuilder(builder: (controller) { +// return Center( +// child: Column( +// mainAxisAlignment: MainAxisAlignment.center, +// children: [ +// ElevatedButton( +// onPressed: () {}, +// child: const Text('Pick Image and Extract Text'), +// ), +// const SizedBox(height: 20), +// controller.isloading +// ? const MyCircularProgressIndicator() +// : Text(controller.extractedText), +// ], +// ), +// ); +// }), +// ); +// } +// } + +// class TextRecognizerWidget extends StatelessWidget { +// const TextRecognizerWidget({super.key}); +// +// @override +// Widget build(BuildContext context) { +// Get.put(TextMLGoogleRecognizerController()); +// return GetBuilder( +// builder: (controller) => Scaffold( +// appBar: AppBar(), +// body: Center( +// child: Column( +// crossAxisAlignment: CrossAxisAlignment.start, +// children: [ +// Text('${controller.decode['DRIVER_LICENSE'].toString()}'), +// Text('DL: ${controller.decode['dl_number'].toString()}'), +// Text( +// 'Expiry Date: ${controller.decode['expiry_date'].toString()}'), +// Text('Last Name: ${controller.decode['lastName'].toString()}'), +// Text( +// 'First Name: ${controller.decode['firstName'].toString()}'), +// Text('Address: ${controller.decode['address'].toString()}'), +// Text('Date of Birth: ${controller.decode['dob'].toString()}'), +// Text('RSTR: ${controller.decode['rstr'].toString()}'), +// Text('Class: ${controller.decode['class'].toString()}'), +// Text('End: ${controller.decode['end'].toString()}'), +// Text('DD: ${controller.decode['dd'].toString()}'), +// Text('Sex: ${controller.decode['sex'].toString()}'), +// Text('Hair: ${controller.decode['hair'].toString()}'), +// Text('Eyes: ${controller.decode['eyes'].toString()}'), +// // and so on for other fields +// ], +// )))); +// } +// } + +// class PassportPage extends StatelessWidget { +// PassportPage({super.key}); +// PassportRecognizerController passportRecognizerController = +// Get.put(PassportRecognizerController()); +// @override +// Widget build(BuildContext context) { +// return Scaffold( +// appBar: AppBar( +// title: const Text('Driver License'), +// ), +// body: const Center(child: Text('data'))); +// } +// } diff --git a/siro_driver/lib/views/home/journal/schedule_page.dart b/siro_driver/lib/views/home/journal/schedule_page.dart new file mode 100644 index 0000000..8ab6870 --- /dev/null +++ b/siro_driver/lib/views/home/journal/schedule_page.dart @@ -0,0 +1,190 @@ +import 'package:flutter/material.dart'; +import 'package:get/get.dart'; +import '../../../constant/finance_design_system.dart'; +import '../../../controller/home/journal/schedule_controller.dart'; + +class SchedulePage extends StatelessWidget { + SchedulePage({super.key}); + final ScheduleController controller = Get.put(ScheduleController()); + + @override + Widget build(BuildContext context) { + return Scaffold( + backgroundColor: FinanceDesignSystem.backgroundColor, + appBar: AppBar( + title: Text('My Schedule'.tr, + style: TextStyle( + fontWeight: FontWeight.bold, + color: FinanceDesignSystem.primaryDark)), + backgroundColor: Colors.transparent, + elevation: 0, + centerTitle: true, + leading: IconButton( + icon: Icon(Icons.arrow_back_ios_new_rounded, + color: FinanceDesignSystem.primaryDark, size: 20), + onPressed: () => Get.back()), + ), + body: GetBuilder(builder: (sc) { + return SingleChildScrollView( + padding: const EdgeInsets.all(16), + child: + Column(crossAxisAlignment: CrossAxisAlignment.start, children: [ + // Summary Card + Container( + padding: const EdgeInsets.all(20), + decoration: BoxDecoration( + gradient: FinanceDesignSystem.balanceGradient, + borderRadius: + BorderRadius.circular(FinanceDesignSystem.cardRadius), + ), + child: Row(children: [ + Expanded( + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Text('Weekly Plan'.tr, + style: TextStyle( + color: Colors.white.withValues(alpha: 0.7), + fontSize: 14)), + const SizedBox(height: 8), + Text('${sc.totalWeeklyHours.toStringAsFixed(1)}h', + style: const TextStyle( + fontSize: 32, + fontWeight: FontWeight.w900, + color: Colors.white)), + Text('${sc.activeDays} ${'Days'.tr}', + style: TextStyle( + color: Colors.white.withValues(alpha: 0.6), + fontSize: 13)), + ])), + Container( + padding: const EdgeInsets.all(14), + decoration: BoxDecoration( + color: Colors.white.withValues(alpha: 0.15), + borderRadius: BorderRadius.circular(14)), + child: const Icon(Icons.calendar_today_rounded, + color: Colors.white, size: 28), + ), + ]), + ), + const SizedBox(height: 24), + + Text('Work Days'.tr, style: FinanceDesignSystem.headingStyle), + const SizedBox(height: 12), + + ...sc.schedule.map((slot) => _buildDayCard(context, slot, sc)), + ]), + ); + }), + ); + } + + Widget _buildDayCard( + BuildContext context, WorkSlot slot, ScheduleController sc) { + final isAr = Get.locale?.languageCode == 'ar'; + return Container( + margin: const EdgeInsets.only(bottom: 10), + padding: const EdgeInsets.all(14), + decoration: BoxDecoration( + color: slot.isActive ? Colors.white : Colors.grey.shade50, + borderRadius: BorderRadius.circular(14), + boxShadow: slot.isActive + ? [ + BoxShadow( + color: Colors.black.withValues(alpha: 0.03), + blurRadius: 8, + offset: const Offset(0, 3)) + ] + : null, + ), + child: Row(children: [ + // Toggle + GestureDetector( + onTap: () => sc.toggleDay(slot.dayOfWeek), + child: AnimatedContainer( + duration: const Duration(milliseconds: 200), + width: 44, + height: 44, + decoration: BoxDecoration( + color: slot.isActive + ? FinanceDesignSystem.accentBlue.withValues(alpha: 0.1) + : Colors.grey.shade200, + borderRadius: BorderRadius.circular(12), + ), + child: Center( + child: Text( + isAr ? slot.dayNameAr.substring(0, 2) : slot.dayName, + style: TextStyle( + fontSize: 12, + fontWeight: FontWeight.bold, + color: slot.isActive + ? FinanceDesignSystem.accentBlue + : Colors.grey.shade400), + )), + ), + ), + const SizedBox(width: 14), + // Day name + Expanded( + child: + Column(crossAxisAlignment: CrossAxisAlignment.start, children: [ + Text(isAr ? slot.dayNameAr : slot.dayName.tr, + style: TextStyle( + fontSize: 14, + fontWeight: FontWeight.w600, + color: slot.isActive + ? FinanceDesignSystem.primaryDark + : Colors.grey.shade400)), + if (slot.isActive) + Text(slot.timeRange, + style: TextStyle(fontSize: 12, color: Colors.grey.shade500)), + if (!slot.isActive) + Text('Day Off'.tr, + style: TextStyle( + fontSize: 12, + color: Colors.grey.shade400, + fontStyle: FontStyle.italic)), + ])), + // Time pickers + if (slot.isActive) ...[ + _timePicker(context, slot.startTime, + (t) => sc.updateStartTime(slot.dayOfWeek, t)), + Padding( + padding: const EdgeInsets.symmetric(horizontal: 4), + child: Text('-', style: TextStyle(color: Colors.grey.shade400))), + _timePicker(context, slot.endTime, + (t) => sc.updateEndTime(slot.dayOfWeek, t)), + ], + // Toggle switch + Switch( + value: slot.isActive, + onChanged: (_) => sc.toggleDay(slot.dayOfWeek), + activeThumbColor: FinanceDesignSystem.accentBlue, + ), + ]), + ); + } + + Widget _timePicker( + BuildContext context, TimeOfDay time, Function(TimeOfDay) onChanged) { + return GestureDetector( + onTap: () async { + final picked = + await showTimePicker(context: context, initialTime: time); + if (picked != null) onChanged(picked); + }, + child: Container( + padding: const EdgeInsets.symmetric(horizontal: 8, vertical: 4), + decoration: BoxDecoration( + color: Colors.grey.shade100, + borderRadius: BorderRadius.circular(8)), + child: Text( + '${time.hour.toString().padLeft(2, '0')}:${time.minute.toString().padLeft(2, '0')}', + style: TextStyle( + fontSize: 12, + fontWeight: FontWeight.w600, + color: FinanceDesignSystem.primaryDark)), + ), + ); + } +} diff --git a/siro_driver/lib/views/home/my_wallet/bank_account_egypt.dart b/siro_driver/lib/views/home/my_wallet/bank_account_egypt.dart new file mode 100755 index 0000000..5663aa2 --- /dev/null +++ b/siro_driver/lib/views/home/my_wallet/bank_account_egypt.dart @@ -0,0 +1,140 @@ +import 'package:flutter/cupertino.dart'; +import 'package:flutter/material.dart'; +import 'package:get/get.dart'; + +class BankController extends GetxController { + String selectedBank = ''; + + Map bankNames = { + 'Ahli United Bank'.tr: 'AUB', + 'Citi Bank N.A. Egypt'.tr: 'CITI', + 'MIDBANK'.tr: 'MIDB', + 'Banque Du Caire'.tr: 'BDC', + 'HSBC Bank Egypt S.A.E'.tr: 'HSBC', + 'Credit Agricole Egypt S.A.E'.tr: 'ECAE', + 'Egyptian Gulf Bank'.tr: 'EGB', + 'The United Bank'.tr: 'UB', + 'Qatar National Bank Alahli'.tr: 'QNB', + 'Arab Bank PLC'.tr: 'ARAB', + 'Emirates National Bank of Dubai'.tr: 'ENBD', + 'Al Ahli Bank of Kuwait – Egypt'.tr: 'ABK', + 'National Bank of Kuwait – Egypt'.tr: 'NBK', + 'Arab Banking Corporation - Egypt S.A.E'.tr: 'EABC', + 'First Abu Dhabi Bank'.tr: 'FAB', + 'Abu Dhabi Islamic Bank – Egypt'.tr: 'ADIB', + 'Commercial International Bank - Egypt S.A.E'.tr: 'CIB', + 'Housing And Development Bank'.tr: 'HDB', + 'Banque Misr'.tr: 'MISR', + 'Arab African International Bank'.tr: 'AAIB', + 'Egyptian Arab Land Bank'.tr: 'EALB', + 'Export Development Bank of Egypt'.tr: 'EDBE', + 'Faisal Islamic Bank of Egypt'.tr: 'FAIB', + 'Blom Bank'.tr: 'BLOM', + 'Abu Dhabi Commercial Bank – Egypt'.tr: 'ADCB', + 'Alex Bank Egypt'.tr: 'BOA', + 'Societe Arabe Internationale De Banque'.tr: 'SAIB', + 'National Bank of Egypt'.tr: 'NBE', + 'Al Baraka Bank Egypt B.S.C.'.tr: 'ABRK', + 'Egypt Post'.tr: 'POST', + 'Nasser Social Bank'.tr: 'NSB', + 'Industrial Development Bank'.tr: 'IDB', + 'Suez Canal Bank'.tr: 'SCB', + 'Mashreq Bank'.tr: 'MASHA', + 'Arab Investment Bank'.tr: 'AIB', + 'General Authority For Supply Commodities'.tr: 'GASCA', + 'Arab International Bank'.tr: 'AIB', + 'Agricultural Bank of Egypt'.tr: 'PDAC', + 'National Bank of Greece'.tr: 'NBG', + 'Central Bank Of Egypt'.tr: 'CBE', + 'ATTIJARIWAFA BANK Egypt'.tr: 'BBE', + }; + + @override + void onInit() { + super.onInit(); + selectedBank = bankNames.values.first; + } + + void updateSelectedBank(String? bankShortName) { + selectedBank = bankShortName ?? ''; + update(); + } + + List> getDropdownItems() { + return bankNames.keys.map>((bankFullName) { + return DropdownMenuItem( + value: bankNames[bankFullName], + child: Text(bankFullName), + ); + }).toList(); + } + + void showBankPicker(BuildContext context) { + showCupertinoModalPopup( + context: context, + builder: (BuildContext context) => CupertinoActionSheet( + title: Text('Select a Bank'.tr), + actions: bankNames.keys.map((String bankFullName) { + return CupertinoActionSheetAction( + child: Text(bankFullName), + onPressed: () { + updateSelectedBank(bankNames[bankFullName]); + Navigator.pop(context); + }, + ); + }).toList(), + cancelButton: CupertinoActionSheetAction( + child: Text('Cancel'.tr), + onPressed: () { + Navigator.pop(context); + }, + ), + ), + ); + } +} + +class BankDropdown extends StatelessWidget { + final BankController bankController = Get.put(BankController()); + + @override + Widget build(BuildContext context) { + return GetBuilder( + init: bankController, + builder: (controller) { + return CupertinoButton( + padding: EdgeInsets.zero, + onPressed: () => controller.showBankPicker(context), + child: Container( + padding: const EdgeInsets.symmetric(horizontal: 16, vertical: 12), + decoration: BoxDecoration( + border: Border.all(color: CupertinoColors.systemGrey4), + borderRadius: BorderRadius.circular(8), + ), + child: Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + Text( + controller.selectedBank != null + ? controller.bankNames.keys.firstWhere( + (key) => + controller.bankNames[key] == + controller.selectedBank, + orElse: () => 'Select a Bank'.tr, + ) + : 'Select a Bank'.tr, + style: TextStyle( + color: controller.selectedBank != null + ? CupertinoColors.black + : CupertinoColors.systemGrey, + ), + ), + const Icon(CupertinoIcons.chevron_down, size: 20), + ], + ), + ), + ); + }, + ); + } +} diff --git a/siro_driver/lib/views/home/my_wallet/card_wallet_widget.dart b/siro_driver/lib/views/home/my_wallet/card_wallet_widget.dart new file mode 100755 index 0000000..eaa635d --- /dev/null +++ b/siro_driver/lib/views/home/my_wallet/card_wallet_widget.dart @@ -0,0 +1,313 @@ +import 'dart:ui'; + +import 'package:flutter/cupertino.dart'; +import 'package:flutter/material.dart'; +import 'package:flutter_svg/flutter_svg.dart'; +import 'package:get/get.dart'; +import 'package:siro_driver/views/home/my_wallet/pay_out_screen.dart'; + +import '../../../constant/box_name.dart'; +import '../../../constant/colors.dart'; +import '../../../constant/style.dart'; +import '../../../controller/home/payment/captain_wallet_controller.dart'; +import '../../../controller/home/payment/paymob_payout.dart'; +import '../../../main.dart'; +import '../../widgets/elevated_btn.dart'; +import '../../widgets/my_textField.dart'; + +// تذكير: ستحتاج إلى إضافة حزمة flutter_svg إلى ملف pubspec.yaml +// dependencies: +// flutter_svg: ^2.0.7 + +/// بطاقة المحفظة بتصميم سوري فاخر مستوحى من فن الأرابيسك والفسيفساء +class CardSeferWalletDriver extends StatelessWidget { + const CardSeferWalletDriver({super.key}); + + // SVG لنقشة أرابيسك هندسية لاستخدامها كخلفية + final String arabesquePattern = ''' + + + + + + + + + + + + + '''; + + @override + Widget build(BuildContext context) { + return Center( + child: GetBuilder( + builder: (captainWalletController) { + return GestureDetector( + onTap: () => _showCashOutDialog(context, captainWalletController), + child: Container( + width: Get.width * 0.9, + height: Get.height * 0.25, + decoration: BoxDecoration( + borderRadius: BorderRadius.circular(28), + boxShadow: [ + BoxShadow( + color: const Color(0xFF003C43).withOpacity(0.5), + blurRadius: 25, + spreadRadius: -5, + offset: const Offset(0, 10), + ), + ], + ), + child: ClipRRect( + borderRadius: BorderRadius.circular(28), + child: Stack( + children: [ + // الخلفية الرئيسية + Container(color: const Color(0xFF003C43)), + // طبقة النقشة + SvgPicture.string(arabesquePattern, fit: BoxFit.cover), + // طبقة التأثير الزجاجي (Glassmorphism) + BackdropFilter( + filter: ImageFilter.blur(sigmaX: 2.0, sigmaY: 2.0), + child: Container(color: Colors.black.withOpacity(0.1)), + ), + // محتوى البطاقة + _buildCardContent(captainWalletController), + ], + ), + ), + ), + ); + }, + ), + ); + } + + Widget _buildCardContent(CaptainWalletController captainWalletController) { + return Padding( + padding: const EdgeInsets.fromLTRB(24, 20, 24, 20), + child: Column( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + crossAxisAlignment: CrossAxisAlignment.center, + children: [ + Text( + 'رصيد انطلق', + style: AppStyle.headTitle.copyWith( + fontFamily: 'Amiri', // خط يوحي بالفخامة + color: Colors.white, + fontSize: 26, + fontWeight: FontWeight.bold, + ), + ), + // أيقونة شريحة البطاقة + const Icon(Icons.sim_card_outlined, + color: Color(0xFFE7C582), size: 30), + ], + ), + Column( + children: [ + Text( + 'الرصيد الحالي'.tr, + style: AppStyle.title.copyWith( + color: Colors.white.withOpacity(0.7), + fontSize: 16, + ), + ), + const SizedBox(height: 4), + // استخدام AnimatedSwitcher لإضافة حركة عند تحديث الرصيد + AnimatedSwitcher( + duration: const Duration(milliseconds: 500), + transitionBuilder: (child, animation) { + return FadeTransition(opacity: animation, child: child); + }, + child: Text( + '${captainWalletController.totalAmountVisa} ${'ل.س'.tr}', + key: + ValueKey(captainWalletController.totalAmountVisa), + style: AppStyle.headTitle2.copyWith( + color: const Color(0xFFE7C582), // Antique Gold + fontSize: 40, + fontWeight: FontWeight.w900, + ), + ), + ), + ], + ), + Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + Text( + box.read(BoxName.nameDriver).toString().split(' ')[0], + style: AppStyle.title.copyWith( + color: Colors.white.withOpacity(0.9), + fontSize: 16, + letterSpacing: 0.5, + ), + ), + Text( + "سحب الرصيد".tr, + style: AppStyle.title.copyWith( + color: Colors.white.withOpacity(0.9), + fontSize: 16, + ), + ), + ], + ), + ], + ), + ); + } + + void _showCashOutDialog( + BuildContext context, CaptainWalletController captainWalletController) { + double minAmount = 20000.0; // الحد الأدنى للسحب + if (double.parse(captainWalletController.totalAmountVisa) >= minAmount) { + Get.defaultDialog( + barrierDismissible: false, + title: 'هل تريد سحب أرباحك؟'.tr, + titleStyle: AppStyle.title + .copyWith(fontSize: 18, fontWeight: FontWeight.bold), + content: Column( + crossAxisAlignment: CrossAxisAlignment.center, + children: [ + const Icon(Icons.account_balance_wallet, + color: AppColor.primaryColor, size: 30), + const SizedBox(height: 15), + Text( + '${'رصيدك الإجمالي:'.tr} ${captainWalletController.totalAmountVisa} ${'ل.س'.tr}', + style: AppStyle.title.copyWith(fontSize: 16), + ), + const SizedBox(height: 20), + Row( + mainAxisAlignment: MainAxisAlignment.center, + children: [ + Text( + 'طريقة الدفع:'.tr, + style: AppStyle.title.copyWith(fontSize: 16), + ), + const SizedBox(width: 10), + const MyDropDownSyria(), + ], + ), + const SizedBox(height: 20), + Form( + key: captainWalletController.formKey, + child: MyTextForm( + controller: captainWalletController.phoneWallet, + label: "أدخل رقم محفظتك".tr, + hint: "مثال: 0912345678".tr, + type: TextInputType.phone, + ), + ), + ], + ), + confirm: MyElevatedButton( + title: 'تأكيد'.tr, + onPressed: () async { + box.write( + BoxName.phoneWallet, captainWalletController.phoneWallet); + box.write(BoxName.walletType, + Get.find().dropdownValue.toString()); + if (captainWalletController.formKey.currentState!.validate()) { + Get.back(); + Get.to(() => PayoutScreen( + amountToWithdraw: + double.parse(captainWalletController.totalAmountVisa), + payoutPhoneNumber: + captainWalletController.phoneWallet.text.toString(), + walletType: Get.find() + .dropdownValue + .toString(), + )); + // String amountAfterFee = + // (double.parse(captainWalletController.totalAmountVisa) - 5) + // .toStringAsFixed(0); + // await Get.put(PaymobPayout()).payToWalletDriverAll( + // amountAfterFee, + // Get.find().dropdownValue.toString(), + // captainWalletController.phoneWallet.text.toString(), + // ); + } + }, + kolor: AppColor.greenColor, + ), + cancel: MyElevatedButton( + title: 'إلغاء'.tr, + onPressed: () { + Get.back(); + }, + kolor: AppColor.redColor, + )); + } else { + showCupertinoDialog( + context: context, + builder: (BuildContext context) { + return CupertinoAlertDialog( + title: Text("تنبيه".tr), + content: Text( + '${'المبلغ في محفظتك أقل من الحد الأدنى للسحب وهو'.tr} $minAmount ${'ل.س'.tr}', + ), + actions: [ + CupertinoDialogAction( + isDefaultAction: true, + child: Text("موافق".tr), + onPressed: () { + Navigator.of(context).pop(); + }, + ), + ], + ); + }, + ); + } + } +} + +// هذا الكود من الملف الأصلي وهو ضروري لعمل الحوار +class MyDropDownSyria extends StatelessWidget { + const MyDropDownSyria({super.key}); + + @override + Widget build(BuildContext context) { + Get.put(SyrianPayoutController()); + return GetBuilder(builder: (controller) { + return DropdownButton( + value: controller.dropdownValue, + icon: const Icon(Icons.arrow_drop_down), + elevation: 16, + style: const TextStyle(color: Colors.deepPurple, fontSize: 16), + underline: Container( + height: 2, + color: Colors.deepPurpleAccent, + ), + onChanged: (String? newValue) { + controller.changeValue(newValue); + }, + items: ['Syriatel', 'Cash Mobile', 'Sham Cash'] + .map>((String value) { + return DropdownMenuItem( + value: value, + child: Text(value.tr), + ); + }).toList(), + ); + }); + } +} + +// هذا المتحكم ضروري لعمل القائمة المنسدلة +class SyrianPayoutController extends GetxController { + String dropdownValue = 'Syriatel'; + + void changeValue(String? newValue) { + if (newValue != null) { + dropdownValue = newValue; + update(); + } + } +} diff --git a/siro_driver/lib/views/home/my_wallet/ecash.dart b/siro_driver/lib/views/home/my_wallet/ecash.dart new file mode 100644 index 0000000..3cebb65 --- /dev/null +++ b/siro_driver/lib/views/home/my_wallet/ecash.dart @@ -0,0 +1,170 @@ +import 'package:flutter/material.dart'; +import 'package:get/get.dart'; +import 'package:local_auth/local_auth.dart'; +import 'package:webview_flutter/webview_flutter.dart'; + +import '../../../constant/box_name.dart'; +import '../../../constant/links.dart'; +import '../../../constant/style.dart'; +import '../../../controller/functions/crud.dart'; +import '../../../main.dart'; + +// --- ملاحظات هامة --- +// 1. تأكد من إضافة الرابط الجديد إلى ملف AppLink الخاص بك: +// static const String payWithEcashDriver = "$server/payment/payWithEcashDriver.php"; +// +// 2. تأكد من أنك تخزن 'driverId' في الـ box الخاص بك، مثلاً: +// box.read(BoxName.driverID) + +/// دالة جديدة لبدء عملية الدفع للسائق عبر ecash +Future payWithEcashDriver(BuildContext context, String amount) async { + try { + // يمكنك استخدام نفس طريقة التحقق بالبصمة إذا أردت + bool isAvailable = await LocalAuthentication().isDeviceSupported(); + if (isAvailable) { + bool didAuthenticate = await LocalAuthentication().authenticate( + localizedReason: 'Use Touch ID or Face ID to confirm payment'.tr, + ); + + if (didAuthenticate) { + // استدعاء الـ Endpoint الجديد على السيرفر الخاص بك + var res = await CRUD().postWallet( + link: AppLink.payWithEcashDriver, + payload: { + // أرسل البيانات التي يحتاجها السيرفر + "amount": amount, + // "driverId": box.read(BoxName.driverID), // تأكد من وجود هذا المتغير + "driverId": box.read(BoxName.driverID), // تأكد من وجود هذا المتغير + }, + ); + + // التأكد من أن السيرفر أعاد رابط الدفع بنجاح + if (res != null && + res['status'] == 'success' && + res['message'] != null) { + final String paymentUrl = res['message']; + // الانتقال إلى شاشة الدفع الجديدة الخاصة بـ ecash للسائق + Navigator.push( + context, + MaterialPageRoute( + builder: (context) => + EcashDriverPaymentScreen(paymentUrl: paymentUrl), + ), + ); + } else { + // عرض رسالة خطأ في حال فشل السيرفر في إنشاء الرابط + Get.defaultDialog( + title: 'Error'.tr, + content: Text( + 'Failed to initiate payment. Please try again.'.tr, + style: AppStyle.title, + ), + ); + } + } + } + } catch (e) { + Get.defaultDialog( + title: 'Error'.tr, + content: Text( + 'An error occurred during the payment process.'.tr, + style: AppStyle.title, + ), + ); + } +} + +/// شاشة جديدة ومبسطة خاصة بدفع السائقين عبر ecash +class EcashDriverPaymentScreen extends StatefulWidget { + final String paymentUrl; + + const EcashDriverPaymentScreen({required this.paymentUrl, Key? key}) + : super(key: key); + + @override + State createState() => + _EcashDriverPaymentScreenState(); +} + +class _EcashDriverPaymentScreenState extends State { + late final WebViewController _controller; + + @override + void initState() { + super.initState(); + _controller = WebViewController() + ..setJavaScriptMode(JavaScriptMode.unrestricted) + ..setNavigationDelegate(NavigationDelegate( + onPageFinished: (url) { + print('Ecash Driver WebView URL Finished: $url'); + + // هنا نتحقق فقط من أن المستخدم عاد إلى صفحة النجاح + // لا حاجة لاستدعاء أي API هنا، فالـ Webhook يقوم بكل العمل + if (url.contains("success.php")) { + showProcessingDialog(); + } + }, + )) + ..loadRequest(Uri.parse(widget.paymentUrl)); + } + + // دالة لعرض رسالة "العملية قيد المعالجة" + void showProcessingDialog() { + showDialog( + barrierDismissible: false, + context: Get.context!, + builder: (BuildContext context) { + return AlertDialog( + shape: RoundedRectangleBorder( + borderRadius: BorderRadius.circular(12.0), + ), + title: Row( + children: [ + Icon(Icons.check_circle, color: Colors.green), + const SizedBox(width: 8), + Text( + "Payment Successful".tr, + style: TextStyle( + color: Colors.green, + fontWeight: FontWeight.bold, + ), + ), + ], + ), + content: Text( + "Your payment is being processed and your wallet will be updated shortly." + .tr, + style: const TextStyle(fontSize: 16), + ), + actions: [ + TextButton( + onPressed: () { + // أغلق مربع الحوار، ثم أغلق شاشة الدفع + Navigator.pop(context); // Close the dialog + Navigator.pop(context); // Close the payment screen + }, + style: TextButton.styleFrom( + backgroundColor: Colors.green, + shape: RoundedRectangleBorder( + borderRadius: BorderRadius.circular(8.0), + ), + ), + child: Text( + "OK".tr, + style: const TextStyle(color: Colors.white), + ), + ), + ], + ); + }, + ); + } + + @override + Widget build(BuildContext context) { + return Scaffold( + appBar: AppBar(title: Text('Complete Payment'.tr)), + body: WebViewWidget(controller: _controller), + ); + } +} diff --git a/siro_driver/lib/views/home/my_wallet/pay_out_screen.dart b/siro_driver/lib/views/home/my_wallet/pay_out_screen.dart new file mode 100644 index 0000000..d19e76b --- /dev/null +++ b/siro_driver/lib/views/home/my_wallet/pay_out_screen.dart @@ -0,0 +1,196 @@ +import 'package:flutter/material.dart'; +import 'package:local_auth/local_auth.dart'; +import 'package:siro_driver/constant/box_name.dart'; +import 'package:siro_driver/main.dart'; + +import '../../../controller/payment/smsPaymnet/pay_out_syria_controller.dart'; + +class PayoutScreen extends StatefulWidget { + // استقبال كل البيانات المطلوبة جاهزة + final double amountToWithdraw; + final String payoutPhoneNumber; + final String walletType; + + const PayoutScreen({ + super.key, + required this.amountToWithdraw, + required this.payoutPhoneNumber, + required this.walletType, + }); + + @override + _PayoutScreenState createState() => _PayoutScreenState(); +} + +class _PayoutScreenState extends State { + final _payoutService = PayoutService(); + final _localAuth = LocalAuthentication(); + bool _isLoading = false; + + Future _handlePayoutRequest() async { + try { + // 1. طلب المصادقة البيومترية + bool didAuthenticate = await _localAuth.authenticate( + localizedReason: 'استخدم بصمة الإصبع لتأكيد عملية السحب', + // options: const AuthenticationOptions( + biometricOnly: true, + sensitiveTransaction: true, + // ), + ); + + if (didAuthenticate && mounted) { + setState(() => _isLoading = true); + + // 2. إرسال الطلب إلى السيرفر بالبيانات الجاهزة + final result = await _payoutService.requestPayout( + driverId: + box.read(BoxName.driverID).toString(), // استبدله بـ box.read + amount: widget.amountToWithdraw, + payoutPhoneNumber: widget.payoutPhoneNumber, + walletType: widget.walletType, + ); + + setState(() => _isLoading = false); + + if (result != null && result.contains("successfully")) { + // 3. عرض رسالة النجاح النهائية + _showSuccessDialog(); + } else { + _showErrorDialog(result ?? "حدث خطأ غير معروف."); + } + } + } catch (e) { + setState(() => _isLoading = false); + _showErrorDialog("جهازك لا يدعم المصادقة البيومترية أو لم يتم إعدادها."); + debugPrint("Biometric error: $e"); + } + } + + @override + Widget build(BuildContext context) { + // حساب المبلغ الإجمالي المخصوم + final totalDeducted = widget.amountToWithdraw + PayoutService.payoutFee; + + return Scaffold( + appBar: AppBar(title: const Text("تأكيد سحب الأموال")), + body: SingleChildScrollView( + padding: const EdgeInsets.all(16.0), + child: Column( + crossAxisAlignment: CrossAxisAlignment.stretch, + children: [ + const Icon(Icons.wallet, size: 64, color: Colors.blue), + const SizedBox(height: 16), + Text( + "تأكيد تفاصيل عملية السحب", + style: Theme.of(context).textTheme.headlineSmall, + textAlign: TextAlign.center, + ), + const SizedBox(height: 24), + _buildSummaryCard(totalDeducted), + const SizedBox(height: 32), + _isLoading + ? const Center(child: CircularProgressIndicator()) + : ElevatedButton.icon( + onPressed: _handlePayoutRequest, + icon: const Icon(Icons.fingerprint), + label: const Text("تأكيد السحب بالبصمة"), + style: ElevatedButton.styleFrom( + padding: const EdgeInsets.symmetric(vertical: 16), + textStyle: const TextStyle( + fontSize: 18, fontWeight: FontWeight.bold), + ), + ), + ], + ), + ), + ); + } + + Widget _buildSummaryCard(double totalDeducted) { + return Card( + elevation: 2, + shape: RoundedRectangleBorder(borderRadius: BorderRadius.circular(12)), + child: Padding( + padding: const EdgeInsets.all(16.0), + child: Column( + children: [ + _summaryRow("المبلغ المسحوب:", + "${widget.amountToWithdraw.toStringAsFixed(2)} ل.س"), + const Divider(), + _summaryRow("عمولة السحب:", + "${PayoutService.payoutFee.toStringAsFixed(2)} ل.س"), + const Divider(thickness: 1.5), + _summaryRow( + "الإجمالي المخصوم من رصيدك:", + "${totalDeducted.toStringAsFixed(2)} ل.س", + isTotal: true, + ), + const SizedBox(height: 16), + _summaryRow("سيتم التحويل إلى هاتف:", widget.payoutPhoneNumber), + _summaryRow("عبر محفظة:", widget.walletType), + ], + ), + ), + ); + } + + Widget _summaryRow(String title, String value, {bool isTotal = false}) { + final titleStyle = TextStyle( + fontSize: 16, + color: isTotal ? Theme.of(context).primaryColor : Colors.black87, + fontWeight: isTotal ? FontWeight.bold : FontWeight.normal, + ); + final valueStyle = titleStyle.copyWith( + fontWeight: FontWeight.bold, + ); + + return Padding( + padding: const EdgeInsets.symmetric(vertical: 6.0), + child: Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + Text(title, style: titleStyle), + Text(value, style: valueStyle), + ], + ), + ); + } + + void _showErrorDialog(String message) { + if (!mounted) return; + showDialog( + context: context, + builder: (ctx) => AlertDialog( + title: const Text('حدث خطأ'), + content: Text(message), + actions: [ + TextButton( + child: const Text('موافق'), + onPressed: () => Navigator.of(ctx).pop()) + ], + ), + ); + } + + void _showSuccessDialog() { + if (!mounted) return; + showDialog( + context: context, + barrierDismissible: false, + builder: (ctx) => AlertDialog( + title: const Text('تم إرسال طلبك بنجاح'), + content: Text( + "سيتم تحويل المال إلى المحفظة التي أوردتها (${widget.walletType})، إلى الرقم ${widget.payoutPhoneNumber}، خلال مدة قصيرة. يرجى الانتظار، ستصلك رسالة تأكيد من محفظتك حال وصولها. شكراً لك."), + actions: [ + TextButton( + child: const Text('موافق'), + onPressed: () { + Navigator.of(ctx).pop(); + Navigator.of(context).pop(); + }, + ), + ], + ), + ); + } +} diff --git a/siro_driver/lib/views/home/my_wallet/payment_history_driver_page.dart b/siro_driver/lib/views/home/my_wallet/payment_history_driver_page.dart new file mode 100755 index 0000000..8dfec19 --- /dev/null +++ b/siro_driver/lib/views/home/my_wallet/payment_history_driver_page.dart @@ -0,0 +1,81 @@ +import 'package:flutter/material.dart'; +import 'package:get/get.dart'; +import 'package:flutter_staggered_animations/flutter_staggered_animations.dart'; +import 'package:siro_driver/constant/finance_design_system.dart'; +import 'package:siro_driver/views/widgets/mycircular.dart'; +import '../../../controller/payment/driver_payment_controller.dart'; +import 'widgets/transaction_preview_item.dart'; + +class PaymentHistoryDriverPage extends StatelessWidget { + const PaymentHistoryDriverPage({super.key}); + + @override + Widget build(BuildContext context) { + Get.put(DriverWalletHistoryController()); + + return Scaffold( + backgroundColor: FinanceDesignSystem.backgroundColor, + appBar: AppBar( + title: Text('Payment History'.tr, + style: TextStyle(fontWeight: FontWeight.bold, color: FinanceDesignSystem.primaryDark)), + backgroundColor: Colors.transparent, + elevation: 0, + centerTitle: true, + leading: IconButton( + icon: Icon(Icons.arrow_back_ios_new_rounded, color: FinanceDesignSystem.primaryDark, size: 20), + onPressed: () => Get.back(), + ), + ), + body: GetBuilder( + builder: (controller) { + if (controller.isLoading) { + return const Center(child: MyCircularProgressIndicator()); + } + + if (controller.archive.isEmpty) { + return Center( + child: Column( + mainAxisAlignment: MainAxisAlignment.center, + children: [ + Icon(Icons.history_rounded, size: 80, color: Colors.grey.shade300), + const SizedBox(height: 16), + Text('No transactions yet'.tr, + style: TextStyle(color: Colors.grey.shade400, fontWeight: FontWeight.bold)), + ], + ), + ); + } + + return AnimationLimiter( + child: ListView.builder( + padding: const EdgeInsets.symmetric(horizontal: 20, vertical: 10), + itemCount: controller.archive.length, + itemBuilder: (BuildContext context, int index) { + final tx = controller.archive[index]; + final double amount = double.tryParse(tx['amount']?.toString() ?? '0') ?? 0; + + return AnimationConfiguration.staggeredList( + position: index, + duration: const Duration(milliseconds: 375), + child: SlideAnimation( + verticalOffset: 50.0, + child: FadeInAnimation( + child: TransactionPreviewItem( + title: amount >= 0 ? 'Credit'.tr : 'Debit'.tr, + subtitle: tx['created_at'] ?? '', + amount: amount.abs().toStringAsFixed(0), + date: tx['created_at']?.split(' ')[0] ?? '', + type: amount >= 0 ? 'credit' : 'debit', + onTap: () {}, + ), + ), + ), + ); + }, + ), + ); + }, + ), + ); + } +} diff --git a/siro_driver/lib/views/home/my_wallet/points_captain.dart b/siro_driver/lib/views/home/my_wallet/points_captain.dart new file mode 100755 index 0000000..df0cd58 --- /dev/null +++ b/siro_driver/lib/views/home/my_wallet/points_captain.dart @@ -0,0 +1,900 @@ +import 'dart:convert'; + +import 'package:flutter/material.dart'; +import 'package:get/get.dart'; +import 'package:local_auth/local_auth.dart'; +import 'package:siro_driver/controller/home/payment/captain_wallet_controller.dart'; +import 'package:siro_driver/controller/payment/payment_controller.dart'; +import 'package:siro_driver/controller/payment/smsPaymnet/payment_services.dart'; +import 'package:webview_flutter/webview_flutter.dart'; + +import '../../../constant/box_name.dart'; +import '../../../constant/finance_design_system.dart'; +import '../../../constant/links.dart'; +import '../../../controller/functions/crud.dart'; +import '../../../controller/payment/mtn_new/mtn_payment_new_screen.dart'; +import '../../../main.dart'; +import '../../../print.dart'; +import '../../widgets/elevated_btn.dart'; +import '../../widgets/my_textField.dart'; +import 'ecash.dart'; + +class PointsCaptain extends StatelessWidget { + final PaymentController paymentController = Get.put(PaymentController()); + final CaptainWalletController captainWalletController = + Get.put(CaptainWalletController()); + + PointsCaptain({ + super.key, + required this.kolor, + required this.countPoint, + required this.pricePoint, + }); + + final Color kolor; + final String countPoint; + final double pricePoint; + + @override + Widget build(BuildContext context) { + return Container( + margin: const EdgeInsets.only(right: 12, bottom: 4), + child: Material( + color: Colors.white, + borderRadius: BorderRadius.circular(20), + elevation: 4, + shadowColor: kolor.withValues(alpha: 0.3), + child: InkWell( + onTap: () => _showPaymentOptions(context), + borderRadius: BorderRadius.circular(20), + child: Container( + width: 130, + padding: const EdgeInsets.all(16), + decoration: BoxDecoration( + borderRadius: BorderRadius.circular(20), + gradient: LinearGradient( + begin: Alignment.topLeft, + end: Alignment.bottomRight, + colors: [ + kolor.withValues(alpha: 0.05), + Colors.white, + ], + ), + border: + Border.all(color: kolor.withValues(alpha: 0.2), width: 1.5), + ), + child: Column( + mainAxisAlignment: MainAxisAlignment.center, + children: [ + Container( + padding: const EdgeInsets.all(10), + decoration: BoxDecoration( + color: kolor.withValues(alpha: 0.1), + shape: BoxShape.circle, + ), + child: Icon(Icons.account_balance_wallet_rounded, + color: kolor, size: 24), + ), + const SizedBox(height: 10), + Text( + '$countPoint ${'SYP'.tr}', + style: TextStyle( + fontWeight: FontWeight.w900, + fontSize: 15, + color: FinanceDesignSystem.primaryDark, + ), + ), + const SizedBox(height: 4), + Text( + '${'Price:'.tr} ${pricePoint.toStringAsFixed(0)} ${'SYP'.tr}', + style: TextStyle( + fontSize: 11, + color: Colors.grey.shade600, + fontWeight: FontWeight.w600, + ), + ), + ], + ), + ), + ), + ), + ); + } + + void _showPaymentOptions(BuildContext context) { + Get.bottomSheet( + isScrollControlled: true, + Container( + constraints: BoxConstraints( + maxHeight: MediaQuery.of(context).size.height * 0.8, + ), + padding: const EdgeInsets.fromLTRB(24, 24, 24, 32), + decoration: BoxDecoration( + color: Colors.white, + borderRadius: const BorderRadius.vertical(top: Radius.circular(32)), + ), + child: SingleChildScrollView( + child: Column( + mainAxisSize: MainAxisSize.min, + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + Text("Select Payment Method".tr, + style: FinanceDesignSystem.headingStyle), + IconButton( + icon: const Icon(Icons.close_rounded, color: Colors.grey), + onPressed: () => Get.back(), + ), + ], + ), + const SizedBox(height: 8), + Text("${'Amount to charge:'.tr} $countPoint ${'SYP'.tr}", + style: FinanceDesignSystem.subHeadingStyle), + const SizedBox(height: 24), + _buildPaymentMethodTile( + icon: Icons.credit_card_rounded, + title: 'Debit Card'.tr, + subtitle: 'E-Cash payment gateway'.tr, + color: Colors.blue, + onTap: () { + Get.back(); + payWithEcashDriver(context, pricePoint.toString()); + }, + ), + const SizedBox(height: 16), + _buildPaymentMethodTile( + image: 'assets/images/syriatel.jpeg', + title: 'Syriatel Cash'.tr, + subtitle: 'Pay using Syriatel mobile wallet'.tr, + color: Colors.red, + onTap: () => _showPhoneInputDialog(context, 'Syriatel'), + ), + const SizedBox(height: 16), + _buildPaymentMethodTile( + image: 'assets/images/shamCash.png', + title: 'Sham Cash'.tr, + subtitle: 'Pay using Sham Cash wallet'.tr, + color: Colors.orange, + onTap: () async { + Get.back(); + bool isAuthSupported = + await LocalAuthentication().isDeviceSupported(); + if (isAuthSupported) { + bool didAuthenticate = + await LocalAuthentication().authenticate( + localizedReason: 'Confirm payment with biometrics'.tr, + ); + if (!didAuthenticate) return; + } + Get.to(() => PaymentScreenSmsProvider(amount: pricePoint)); + }, + ), + ], + ), + ), + ), + ); + } + + Widget _buildPaymentMethodTile({ + IconData? icon, + String? image, + required String title, + required String subtitle, + required Color color, + required VoidCallback onTap, + }) { + return Material( + color: Colors.grey.shade50, + borderRadius: BorderRadius.circular(20), + child: InkWell( + onTap: onTap, + borderRadius: BorderRadius.circular(20), + child: Container( + padding: const EdgeInsets.all(16), + decoration: BoxDecoration( + borderRadius: BorderRadius.circular(20), + border: Border.all(color: Colors.grey.shade200, width: 1), + ), + child: Row( + children: [ + Container( + width: 56, + height: 56, + padding: const EdgeInsets.all(8), + decoration: BoxDecoration( + color: Colors.white, + borderRadius: BorderRadius.circular(14), + boxShadow: [ + BoxShadow( + color: color.withValues(alpha: 0.1), + blurRadius: 10, + offset: const Offset(0, 4), + ), + ], + ), + child: image != null + ? Image.asset(image, fit: BoxFit.contain) + : Icon(icon, color: color, size: 30), + ), + const SizedBox(width: 16), + Expanded( + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Text(title, + style: TextStyle( + fontWeight: FontWeight.bold, + fontSize: 16, + color: FinanceDesignSystem.primaryDark)), + const SizedBox(height: 2), + Text(subtitle, + style: TextStyle( + color: Colors.grey.shade600, fontSize: 12)), + ], + ), + ), + Icon(Icons.arrow_forward_ios_rounded, + size: 14, color: Colors.grey.shade400), + ], + ), + ), + ), + ); + } + + void _showPhoneInputDialog(BuildContext context, String provider) { + Get.back(); + Get.defaultDialog( + title: 'Wallet Phone Number'.tr, + content: Form( + key: paymentController.formKey, + child: MyTextForm( + controller: paymentController.walletphoneController, + label: 'Phone Number'.tr, + hint: provider == 'Syriatel' ? '963991234567' : '963941234567', + type: TextInputType.phone, + ), + ), + confirm: MyElevatedButton( + title: 'Confirm'.tr, + onPressed: () async { + if (paymentController.formKey.currentState!.validate()) { + Get.back(); + box.write(BoxName.phoneWallet, + paymentController.walletphoneController.text); + if (provider == 'Syriatel') { + await payWithSyriaTelWallet( + context, pricePoint.toString(), 'SYP'); + } else { + await payWithMTNWallet(context, pricePoint.toString(), 'SYP'); + } + } + }, + ), + ); + } +} + +class PaymentScreen extends StatefulWidget { + final String iframeUrl; + final String countPrice; + + const PaymentScreen( + {required this.iframeUrl, super.key, required this.countPrice}); + + @override + State createState() => _PaymentScreenState(); +} + +class _PaymentScreenState extends State { + late final WebViewController _controller; + final controller = Get.find(); + @override + void initState() { + super.initState(); + + _controller = WebViewController() + ..setJavaScriptMode(JavaScriptMode.unrestricted) + ..setNavigationDelegate(NavigationDelegate( + onPageFinished: (url) { + if (url.contains("success")) { + _fetchPaymentStatus(); // ✅ استدعاء الويب هوك بعد نجاح الدفع + } else if (url.contains("failed")) { + showCustomDialog( + title: "Error".tr, + message: 'Payment Failed'.tr, // يتم جلب رسالة الخطأ من الخادم + isSuccess: false, + ); + } + }, + )) + ..loadRequest(Uri.parse(widget.iframeUrl)); + } + + Future _fetchPaymentStatus() async { + final String userId = box.read(BoxName.phoneDriver); + await Future.delayed(const Duration(seconds: 2)); + + try { + final response = await CRUD().postWallet( + link: AppLink.paymetVerifyDriver, + payload: { + 'user_id': userId, + 'driverID': box.read(BoxName.driverID), + 'paymentMethod': 'visa-in', + }, + ); + + if (response != 'failure' && response != 'token_expired') { + if (response['status'] == 'success') { + final payment = response['message']; + final amount = payment['amount'].toString(); + final bonus = payment['bonus'].toString(); + final paymentID = payment['paymentID'].toString(); + + await controller.getCaptainWalletFromBuyPoints(); + + showCustomDialog( + title: "payment_success".tr, + message: + "${"transaction_id".tr}: $paymentID\n${"amount_paid".tr}: $amount EGP\n${"bonus_added".tr}: $bonus ${"points".tr}", + isSuccess: true, + ); + } else { + showCustomDialog( + title: "transaction_failed".tr, + message: response['message'].toString(), + isSuccess: false, + ); + } + } else { + showCustomDialog( + title: "connection_failed".tr, + message: response.toString(), + isSuccess: false, + ); + } + } catch (e) { + showCustomDialog( + title: "server_error".tr, + message: "server_error_message".tr, + isSuccess: false, + ); + } + } + + void showCustomDialog({ + required String title, + required String message, + required bool isSuccess, + }) { + showDialog( + barrierDismissible: false, + context: Get.context!, + builder: (BuildContext context) { + return AlertDialog( + shape: RoundedRectangleBorder( + borderRadius: BorderRadius.circular(12.0), + ), + title: Row( + children: [ + Icon( + isSuccess ? Icons.check_circle : Icons.error, + color: isSuccess ? Colors.green : Colors.red, + ), + const SizedBox(width: 8), + Text( + title, + style: TextStyle( + color: isSuccess ? Colors.green : Colors.red, + fontWeight: FontWeight.bold, + ), + ), + ], + ), + content: Text( + message, + style: const TextStyle(fontSize: 16), + ), + actions: [ + TextButton( + onPressed: () { + Navigator.pop(context); + Navigator.pop(context); + }, + style: TextButton.styleFrom( + backgroundColor: isSuccess ? Colors.green : Colors.red, + shape: RoundedRectangleBorder( + borderRadius: BorderRadius.circular(8.0), + ), + ), + child: Text( + "OK", + style: const TextStyle(color: Colors.white), + ), + ), + ], + ); + }, + ); + } + + @override + Widget build(BuildContext context) { + return Scaffold( + appBar: AppBar(title: const Text('إتمام الدفع')), + body: WebViewWidget(controller: _controller), + ); + } +} + +class PaymentScreenWallet extends StatefulWidget { + final String iframeUrl; + final String countPrice; + + const PaymentScreenWallet( + {required this.iframeUrl, super.key, required this.countPrice}); + + @override + State createState() => _PaymentScreenWalletState(); +} + +class _PaymentScreenWalletState extends State { + late final WebViewController _controller; + final controller = Get.find(); + @override + void initState() { + super.initState(); + + _controller = WebViewController() + ..setJavaScriptMode(JavaScriptMode.unrestricted) + ..setNavigationDelegate(NavigationDelegate( + onPageFinished: (url) { + if (url.contains("success")) { + _fetchPaymentStatus(); // ✅ استدعاء الويب هوك بعد نجاح الدفع + } else if (url.contains("failed")) { + showCustomDialog( + title: "Error".tr, + message: 'Payment Failed'.tr, // يتم جلب رسالة الخطأ من الخادم + isSuccess: false, + ); + } + }, + )) + ..loadRequest(Uri.parse(widget.iframeUrl)); + } + + Future _fetchPaymentStatus() async { + final String userId = '+963${box.read(BoxName.phoneWallet)}'; + await Future.delayed(const Duration(seconds: 2)); + + try { + final response = await CRUD().postWallet( + link: AppLink.paymetVerifyDriver, + payload: { + 'user_id': userId, + 'driverID': box.read(BoxName.driverID), + 'paymentMethod': 'visa-in', + }, + ); + + if (response != 'failure' && response != 'token_expired') { + if (response['status'] == 'success') { + final payment = response['message']; + final amount = payment['amount'].toString(); + final bonus = payment['bonus'].toString(); + final paymentID = payment['paymentID'].toString(); + + await controller.getCaptainWalletFromBuyPoints(); + + showCustomDialog( + title: "payment_success".tr, + message: + "${"transaction_id".tr}: $paymentID\n${"amount_paid".tr}: $amount EGP\n${"bonus_added".tr}: $bonus ${"points".tr}", + isSuccess: true, + ); + } else { + showCustomDialog( + title: "transaction_failed".tr, + message: response['message'].toString(), + isSuccess: false, + ); + } + } else { + showCustomDialog( + title: "connection_failed".tr, + message: response.toString(), + isSuccess: false, + ); + } + } catch (e) { + showCustomDialog( + title: "server_error".tr, + message: "server_error_message".tr, + isSuccess: false, + ); + } + } + + void showCustomDialog({ + required String title, + required String message, + required bool isSuccess, + }) { + showDialog( + barrierDismissible: false, + context: Get.context!, + builder: (BuildContext context) { + return AlertDialog( + shape: RoundedRectangleBorder( + borderRadius: BorderRadius.circular(12.0), + ), + title: Row( + children: [ + Icon( + isSuccess ? Icons.check_circle : Icons.error, + color: isSuccess ? Colors.green : Colors.red, + ), + const SizedBox(width: 8), + Text( + title, + style: TextStyle( + color: isSuccess ? Colors.green : Colors.red, + fontWeight: FontWeight.bold, + ), + ), + ], + ), + content: Text( + message, + style: const TextStyle(fontSize: 16), + ), + actions: [ + TextButton( + onPressed: () { + Navigator.pop(context); + Navigator.pop(context); + }, + style: TextButton.styleFrom( + backgroundColor: isSuccess ? Colors.green : Colors.red, + shape: RoundedRectangleBorder( + borderRadius: BorderRadius.circular(8.0), + ), + ), + child: Text( + "OK", + style: const TextStyle(color: Colors.white), + ), + ), + ], + ); + }, + ); + } + + @override + Widget build(BuildContext context) { + return Scaffold( + appBar: AppBar(title: const Text('إتمام الدفع')), + body: WebViewWidget(controller: _controller), + ); + } +} + +Future payWithMTNWallet( + BuildContext context, String amount, String currency) async { + // استخدام مؤشر تحميل لتجربة مستخدم أفضل + Get.dialog(const Center(child: CircularProgressIndicator()), + barrierDismissible: false); + + try { + String phone = box.read(BoxName.phoneWallet); + String driverID = box.read(BoxName.driverID).toString(); + String formattedAmount = double.parse(amount).toStringAsFixed(0); + + print("🚀 بدء عملية دفع MTN"); + print( + "📦 Payload: driverID: $driverID, amount: $formattedAmount, phone: $phone"); + + // التحقق من البصمة (اختياري) + bool isAuthSupported = await LocalAuthentication().isDeviceSupported(); + if (isAuthSupported) { + bool didAuthenticate = await LocalAuthentication().authenticate( + localizedReason: 'استخدم بصمة الإصبع أو الوجه لتأكيد الدفع', + ); + if (!didAuthenticate) { + if (Get.isDialogOpen ?? false) Get.back(); + print("❌ المستخدم لم يؤكد بالبصمة/الوجه"); + return; + } + } + + // 1️⃣ استدعاء mtn_start_payment.php (الملف الجديد) + var responseData = await CRUD().postWalletMtn( + link: AppLink.payWithMTNStart, + payload: { + "amount": formattedAmount, + "passengerId": driverID, + "phone": phone, + "lang": box.read(BoxName.lang) ?? 'ar', + }, + ); + + print("✅ استجابة الخادم (mtn_start_payment.php):"); + print(responseData); + + // --- بداية التعديل المهم --- + // التحقق القوي من الاستجابة لتجنب الأخطاء + Map startRes; + + if (responseData is Map) { + // إذا كانت الاستجابة بالفعل Map، استخدمها مباشرة + startRes = responseData; + } else if (responseData is String) { + // إذا كانت نص، حاول تحليلها كـ JSON + try { + startRes = json.decode(responseData); + } catch (e) { + throw Exception( + "فشل في تحليل استجابة الخادم. الاستجابة: $responseData"); + } + } else { + // نوع غير متوقع + throw Exception("تم استلام نوع بيانات غير متوقع من الخادم."); + } + + if (startRes['status'] != 'success') { + final errorMsg = startRes['message']['Error']?.toString().tr ?? + "فشل بدء عملية الدفع. حاول مرة أخرى."; + throw Exception(errorMsg); + } + // --- نهاية التعديل المهم --- + + // استخراج البيانات بأمان + final messageData = startRes["message"]; + final invoiceNumber = messageData["invoiceNumber"].toString(); + final operationNumber = messageData["operationNumber"].toString(); + final guid = messageData["guid"].toString(); + + print( + "📄 invoiceNumber: $invoiceNumber, 🔢 operationNumber: $operationNumber, 🧭 guid: $guid"); + + if (Get.isDialogOpen == true) + Get.back(); // إغلاق مؤشر التحميل قبل عرض حوار OTP + + // 2️⃣ عرض واجهة إدخال OTP + String? otp = await showDialog( + context: context, + barrierDismissible: false, + builder: (context) { + String input = ""; + return AlertDialog( + title: const Text("أدخل كود التحقق"), + content: TextField( + keyboardType: TextInputType.number, + decoration: const InputDecoration(hintText: "كود OTP"), + onChanged: (val) => input = val, + ), + actions: [ + TextButton( + child: const Text("تأكيد"), + onPressed: () => Navigator.of(context).pop(input), + ), + TextButton( + child: const Text("إلغاء"), + onPressed: () => Navigator.of(context).pop(), + ), + ], + ); + }, + ); + + if (otp == null || otp.isEmpty) { + print("❌ لم يتم إدخال OTP"); + return; + } + print("🔐 تم إدخال OTP: $otp"); + + Get.dialog(const Center(child: CircularProgressIndicator()), + barrierDismissible: false); + + // 3️⃣ استدعاء mtn_confirm.php + var confirmRes = await CRUD().postWalletMtn( + link: AppLink.payWithMTNConfirm, + payload: { + "invoiceNumber": invoiceNumber, + "operationNumber": operationNumber, + "guid": guid, + "otp": otp, + "phone": phone, + }, + ); + + if (Get.isDialogOpen ?? false) Get.back(); + + print("✅ استجابة mtn_confirm.php:"); + // print(confirmRes); + Log.print('confirmRes: ${confirmRes}'); + + if (confirmRes != null && confirmRes['status'] == 'success') { + Get.defaultDialog( + title: "✅ نجاح", + content: const Text("تمت عملية الدفع وإضافة الرصيد إلى محفظتك."), + ); + } else { + String errorMsg = + confirmRes?['message']['message']?.toString() ?? "فشل في تأكيد الدفع"; + Get.defaultDialog( + title: "❌ فشل", + content: Text(errorMsg.tr), + ); + } + } catch (e, s) { + print("🔥 خطأ أثناء الدفع عبر MTN:"); + print(e); + print(s); + if (Get.isDialogOpen ?? false) Get.back(); + Get.defaultDialog( + title: 'حدث خطأ', + content: Text(e.toString().replaceFirst("Exception: ", "")), + ); + } +} + +Future payWithSyriaTelWallet( + BuildContext context, String amount, String currency) async { + // Show a loading indicator for better user experience + Get.dialog(const Center(child: CircularProgressIndicator()), + barrierDismissible: false); + + try { + String phone = box.read(BoxName.phoneWallet); + String driverID = box.read(BoxName.driverID).toString(); + String formattedAmount = double.parse(amount).toStringAsFixed(0); + + // --- CHANGE 1: Updated log messages for clarity --- + print("🚀 Starting Syriatel payment process"); + print( + "📦 Payload: driverID: $driverID, amount: $formattedAmount, phone: $phone"); + + // Optional: Biometric authentication + bool isAuthSupported = await LocalAuthentication().isDeviceSupported(); + if (isAuthSupported) { + bool didAuthenticate = await LocalAuthentication().authenticate( + localizedReason: 'استخدم بصمة الإصبع أو الوجه لتأكيد الدفع', + ); + if (!didAuthenticate) { + if (Get.isDialogOpen ?? false) Get.back(); + print("❌ User did not authenticate with biometrics"); + return; + } + } + + // --- CHANGE 2: Updated API link and payload for starting payment --- + // Make sure you have defined `payWithSyriatelStart` in your AppLink class + var responseData = await CRUD().postWalletMtn( + link: AppLink.payWithSyriatelStart, // Use the new Syriatel start link + payload: { + "amount": formattedAmount, + "driverId": driverID, // Key changed from 'passengerId' to 'driverId' + "phone": phone, + "lang": box.read(BoxName.lang) ?? 'ar', + }, + ); + + print("✅ Server response (start_payment.php):"); + Log.print('responseData: ${responseData}'); + + // Robustly parse the server's JSON response + Map startRes; + if (responseData is Map) { + startRes = responseData; + } else if (responseData is String) { + try { + startRes = json.decode(responseData); + } catch (e) { + throw Exception( + "Failed to parse server response. Response: $responseData"); + } + } else { + throw Exception("Received an unexpected data type from the server."); + } + + if (startRes['status'] != 'success') { + String errorMsg = startRes['message']?.toString() ?? + "Failed to start the payment process. Please try again."; + throw Exception(errorMsg); + } + + // --- CHANGE 3: Extract `transactionID` from the response --- + // The response structure is now simpler. We only need the transaction ID. + final messageData = startRes["message"]; + final transactionID = messageData["transactionID"].toString(); + + print("📄 TransactionID: $transactionID"); + + if (Get.isDialogOpen == true) Get.back(); // Close loading indicator + + // Show the OTP input dialog + String? otp = await showDialog( + context: context, + barrierDismissible: false, + builder: (context) { + String input = ""; + return AlertDialog( + title: const Text("أدخل كود التحقق"), + content: TextField( + keyboardType: TextInputType.number, + decoration: const InputDecoration(hintText: "كود OTP"), + onChanged: (val) => input = val, + ), + actions: [ + TextButton( + child: const Text("تأكيد"), + onPressed: () => Navigator.of(context).pop(input), + ), + TextButton( + child: const Text("إلغاء"), + onPressed: () => Navigator.of(context).pop(), + ), + ], + ); + }, + ); + + if (otp == null || otp.isEmpty) { + print("❌ OTP was not entered."); + return; + } + print("🔐 OTP entered: $otp"); + + Get.dialog(const Center(child: CircularProgressIndicator()), + barrierDismissible: false); + + // --- CHANGE 4: Updated API link and payload for confirming payment --- + // Make sure you have defined `payWithSyriatelConfirm` in your AppLink class + var confirmRes = await CRUD().postWalletMtn( + // Changed from postWalletMtn if they are different + link: AppLink.payWithSyriatelConfirm, // Use the new Syriatel confirm link + payload: { + "transactionID": transactionID, // Use the transaction ID + "otp": otp, + // The other parameters (phone, guid, etc.) are no longer needed + }, + ); + + if (Get.isDialogOpen ?? false) Get.back(); + + print("✅ Response from confirm_payment.php:"); + Log.print('confirmRes: ${confirmRes}'); + + if (confirmRes != null && confirmRes['status'] == 'success') { + Get.defaultDialog( + title: "✅ نجاح", + content: const Text("تمت عملية الدفع وإضافة الرصيد إلى محفظتك."), + ); + } else { + // --- CHANGE 5: Simplified error message extraction --- + // The new PHP script sends the error directly in the 'message' field. + String errorMsg = + confirmRes?['message']?.toString() ?? "فشل في تأكيد الدفع"; + Get.defaultDialog( + title: "❌ فشل", + content: Text(errorMsg.tr), + ); + } + } catch (e, s) { + // --- CHANGE 6: Updated general error log message --- + print("🔥 Error during Syriatel Wallet payment:"); + print(e); + print(s); + if (Get.isDialogOpen ?? false) Get.back(); + Get.defaultDialog( + title: 'حدث خطأ', + content: Text(e.toString().replaceFirst("Exception: ", "")), + ); + } +} diff --git a/siro_driver/lib/views/home/my_wallet/transfer_budget_page.dart b/siro_driver/lib/views/home/my_wallet/transfer_budget_page.dart new file mode 100755 index 0000000..86f54c9 --- /dev/null +++ b/siro_driver/lib/views/home/my_wallet/transfer_budget_page.dart @@ -0,0 +1,145 @@ +import 'package:siro_driver/constant/style.dart'; +import 'package:siro_driver/views/widgets/elevated_btn.dart'; +import 'package:siro_driver/views/widgets/my_scafold.dart'; +import 'package:siro_driver/views/widgets/my_textField.dart'; +import 'package:siro_driver/views/widgets/mycircular.dart'; +import 'package:siro_driver/views/widgets/mydialoug.dart'; +import 'package:flutter/material.dart'; +import 'package:get/get.dart'; + +import '../../../controller/home/payment/captain_wallet_controller.dart'; + +class TransferBudgetPage extends StatelessWidget { + const TransferBudgetPage({super.key}); + + @override + Widget build(BuildContext context) { + Get.put(CaptainWalletController()); + return MyScafolld( + title: "Transfer budget".tr, + body: [ + GetBuilder( + builder: (captainWalletController) { + return Padding( + padding: const EdgeInsets.all(8.0), + child: Container( + decoration: AppStyle.boxDecoration1, + height: Get.height * .7, + width: double.infinity, + child: Form( + key: captainWalletController.formKeyTransfer, + child: Column( + children: [ + const SizedBox( + height: 20, + ), + MyTextForm( + controller: captainWalletController + .newDriverPhoneController, + label: 'phone number of driver'.tr, + hint: 'phone number of driver', + type: TextInputType.phone), + MyTextForm( + controller: captainWalletController + .amountFromBudgetController, + label: 'insert amount'.tr, + hint: + '${'You have in account'.tr} ${captainWalletController.totalAmountVisa}', + type: TextInputType.number), + captainWalletController.isNewTransfer + ? const MyCircularProgressIndicator() + : captainWalletController + .amountToNewDriverMap.isEmpty + ? MyElevatedButton( + title: 'Next'.tr, + onPressed: () async { + await captainWalletController + .detectNewDriverFromMyBudget(); + }) + : const SizedBox(), + captainWalletController.amountToNewDriverMap.isNotEmpty + ? Padding( + padding: const EdgeInsets.all(8.0), + child: Column( + children: [ + Container( + width: double.maxFinite, + decoration: AppStyle.boxDecoration1, + child: Text( + 'Name :'.tr + + captainWalletController + .amountToNewDriverMap[0]['name'] + .toString(), + textAlign: TextAlign.center, + style: AppStyle.title, + ), + ), + const SizedBox( + height: 5, + ), + Container( + width: double.maxFinite, + decoration: AppStyle.boxDecoration1, + child: Text( + "${"NationalID".tr} ${captainWalletController.amountToNewDriverMap[0]['national_number']}", + style: AppStyle.title, + textAlign: TextAlign.center, + ), + ), + const SizedBox( + height: 5, + ), + Container( + width: double.maxFinite, + decoration: AppStyle.boxDecoration1, + child: Text( + "${"amount".tr} ${captainWalletController.amountFromBudgetController.text} ${'LE'.tr}", + style: AppStyle.title, + textAlign: TextAlign.center, + ), + ), + const SizedBox( + height: 15, + ), + captainWalletController + .amountToNewDriverMap.isNotEmpty + ? MyElevatedButton( + title: 'Transfer'.tr, + onPressed: () async { + if (double.parse( + captainWalletController + .amountFromBudgetController + .text) < + double.parse( + captainWalletController + .totalAmountVisa) - + 5) { + await captainWalletController + .addTransferDriversWallet( + 'TransferFrom', + 'TransferTo', + ); + } else { + MyDialog().getDialog( + "You dont have money in your Wallet" + .tr, + "You dont have money in your Wallet or you should less transfer 5 LE to activate" + .tr, () { + Get.back(); + }); + } + }) + : const SizedBox() + ], + ), + ) + : const SizedBox() + ], + )), + ), + ); + }), + ], + isleading: true); + } +} diff --git a/siro_driver/lib/views/home/my_wallet/walet_captain.dart b/siro_driver/lib/views/home/my_wallet/walet_captain.dart new file mode 100755 index 0000000..a29691b --- /dev/null +++ b/siro_driver/lib/views/home/my_wallet/walet_captain.dart @@ -0,0 +1,443 @@ +import 'package:local_auth/local_auth.dart'; +import 'package:flutter/material.dart'; +import 'package:get/get.dart'; +import 'package:siro_driver/constant/finance_design_system.dart'; +import 'package:siro_driver/controller/home/payment/captain_wallet_controller.dart'; +import 'package:siro_driver/views/widgets/mycircular.dart'; +import 'package:siro_driver/views/widgets/elevated_btn.dart'; +import 'package:siro_driver/views/widgets/my_textField.dart'; +import 'package:siro_driver/views/widgets/mydialoug.dart'; +import 'package:siro_driver/views/widgets/error_snakbar.dart'; +import 'package:siro_driver/constant/box_name.dart'; +import 'package:siro_driver/constant/links.dart'; +import 'package:siro_driver/controller/functions/crud.dart'; +import 'package:siro_driver/main.dart'; +import 'package:siro_driver/views/home/my_wallet/payment_history_driver_page.dart'; +import 'package:siro_driver/controller/payment/driver_payment_controller.dart'; + +// Import new widgets +import 'points_captain.dart'; +import 'transfer_budget_page.dart'; +import 'widgets/balance_card.dart'; +import 'widgets/quick_actions.dart'; +import 'widgets/financial_summary_card.dart'; +import 'widgets/promo_gamification_card.dart'; +import 'widgets/transaction_preview_item.dart'; + +class WalletCaptainRefactored extends StatelessWidget { + WalletCaptainRefactored({super.key}); + + final CaptainWalletController controller = Get.put(CaptainWalletController()); + + @override + Widget build(BuildContext context) { + controller.refreshCaptainWallet(); + return Scaffold( + backgroundColor: FinanceDesignSystem.backgroundColor, + appBar: AppBar( + title: Text('Driver Balance'.tr, + style: TextStyle( + fontWeight: FontWeight.bold, + color: FinanceDesignSystem.primaryDark)), + backgroundColor: Colors.transparent, + elevation: 0, + centerTitle: true, + leading: IconButton( + icon: Icon(Icons.arrow_back_ios_new_rounded, + color: FinanceDesignSystem.primaryDark, size: 20), + onPressed: () => Get.back(), + ), + actions: [ + IconButton( + icon: Icon(Icons.refresh_rounded, + color: FinanceDesignSystem.primaryDark), + onPressed: () => controller.refreshCaptainWallet(), + tooltip: 'Refresh'.tr, + ), + ], + ), + body: GetBuilder( + builder: (controller) { + if (controller.isLoading) { + return const Center(child: MyCircularProgressIndicator()); + } + return SingleChildScrollView( + padding: const EdgeInsets.symmetric( + horizontal: FinanceDesignSystem.horizontalPadding, + vertical: 10), + child: Column( + crossAxisAlignment: CrossAxisAlignment.stretch, + children: [ + // 1. Header / Balance + BalanceCard( + balance: controller.totalPoints.toString(), + isNegative: + double.tryParse(controller.totalPoints.toString()) != + null && + double.parse(controller.totalPoints.toString()) < + -30000, + lastUpdated: "Just now".tr, + ), + + const SizedBox( + height: FinanceDesignSystem.verticalSectionPadding), + + // 2. Quick Actions + QuickActionsGrid( + onAddBalance: () => + _showAddBalanceOptions(context, controller), + onWithdraw: () => addSyrianPaymentMethod(controller), + onTransfer: () => Get.to(() => TransferBudgetPage()), + onHistory: () async { + await Get.put(DriverWalletHistoryController()) + .getArchivePayment(); + Get.to(() => const PaymentHistoryDriverPage()); + }, + ), + + const SizedBox( + height: FinanceDesignSystem.verticalSectionPadding), + + // 3. Earnings Summary + FinancialSummaryCard( + title: 'Earnings Summary'.tr, + subtitle: 'ملخص الأرباح'.tr, + items: [ + SummaryItem( + icon: Icons.money_rounded, + label: 'Cash Earnings'.tr, + amount: controller.totalAmount, + color: FinanceDesignSystem.successGreen, + ), + SummaryItem( + icon: Icons.credit_card_rounded, + label: 'Card Earnings'.tr, + amount: controller.totalAmountVisa, + color: FinanceDesignSystem.accentBlue, + ), + ], + ), + + const SizedBox( + height: FinanceDesignSystem.verticalSectionPadding), + + // 3. Recharge Balance Packages + Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + Text('Recharge Balance'.tr, + style: FinanceDesignSystem.headingStyle), + Icon(Icons.info_outline_rounded, + size: 18, color: Colors.grey.shade400), + ], + ), + const SizedBox(height: 12), + SizedBox( + height: 140, // Increased height for modern cards + child: ListView( + scrollDirection: Axis.horizontal, + physics: const BouncingScrollPhysics(), + children: [ + PointsCaptain( + kolor: Colors.blueGrey, + pricePoint: 100, + countPoint: '100'), + PointsCaptain( + kolor: Colors.brown, + pricePoint: 200, + countPoint: '210'), + PointsCaptain( + kolor: Colors.amber, + pricePoint: 400, + countPoint: '450'), + PointsCaptain( + kolor: Colors.orange, + pricePoint: 1000, + countPoint: '1100'), + ], + ), + ), + + const SizedBox( + height: FinanceDesignSystem.verticalSectionPadding), + + // 5. Promotions + Text('Promotions'.tr, style: FinanceDesignSystem.headingStyle), + const SizedBox(height: 12), + PromoGamificationCard( + title: 'Morning Promo'.tr, + subtitle: "from 7:00am to 10:00am".tr, + currentProgress: controller.walletDate['message']?[0] + ?['morning_count'] ?? + 0, + targetProgress: 5, + reward: "+50 SYP", + onTap: () => + controller.addDriverWalletFromPromo('Morning Promo', 50), + ), + const SizedBox(height: 16), + PromoGamificationCard( + title: 'Afternoon Promo'.tr, + subtitle: "from 3:00pm to 6:00 pm".tr, + currentProgress: controller.walletDate['message']?[0] + ?['afternoon_count'] ?? + 0, + targetProgress: 5, + reward: "+50 SYP", + onTap: () => controller.addDriverWalletFromPromo( + 'Afternoon Promo', 50), + ), + + const SizedBox( + height: FinanceDesignSystem.verticalSectionPadding), + + // 6. Transactions Preview + Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + Text('Recent Transactions'.tr, + style: FinanceDesignSystem.headingStyle), + TextButton( + onPressed: () async { + await Get.put(DriverWalletHistoryController()) + .getArchivePayment(); + Get.to(() => const PaymentHistoryDriverPage()); + }, + child: Text('View All'.tr, + style: TextStyle( + color: FinanceDesignSystem.accentBlue, + fontWeight: FontWeight.bold)), + ), + ], + ), + GetBuilder( + init: DriverWalletHistoryController(), + builder: (historyController) { + if (historyController.archive.isEmpty) { + return Padding( + padding: const EdgeInsets.symmetric(vertical: 20), + child: Center( + child: Text("No transactions yet".tr, + style: TextStyle(color: Colors.grey.shade400))), + ); + } + // Show only last 3 + final lastThree = + historyController.archive.take(3).toList(); + return Column( + children: lastThree.map((tx) { + final double amount = + double.tryParse(tx['amount']?.toString() ?? '0') ?? + 0; + return TransactionPreviewItem( + title: amount >= 0 ? 'Credit'.tr : 'Debit'.tr, + subtitle: tx['created_at'] ?? '', + amount: amount.abs().toStringAsFixed(0), + date: tx['created_at']?.split(' ')[0] ?? '', + type: amount >= 0 ? 'credit' : 'debit', + onTap: () {}, + ); + }).toList(), + ); + }, + ), + const SizedBox(height: 40), + ], + ), + ); + }, + ), + ); + } + + void _showAddBalanceOptions( + BuildContext context, CaptainWalletController controller) { + Get.bottomSheet( + Container( + padding: const EdgeInsets.all(24), + decoration: BoxDecoration( + color: Colors.white, + borderRadius: const BorderRadius.vertical(top: Radius.circular(24)), + ), + child: Column( + mainAxisSize: MainAxisSize.min, + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Text("Add Balance".tr, style: FinanceDesignSystem.headingStyle), + const SizedBox(height: 8), + Text("Select how you want to charge your account".tr, + style: FinanceDesignSystem.subHeadingStyle), + const SizedBox(height: 24), + ListTile( + leading: Container( + padding: const EdgeInsets.all(10), + decoration: BoxDecoration( + color: + FinanceDesignSystem.accentBlue.withValues(alpha: 0.1), + borderRadius: BorderRadius.circular(12)), + child: Icon(Icons.account_balance_wallet_rounded, + color: FinanceDesignSystem.accentBlue), + ), + title: Text("Pay from my budget".tr), + subtitle: Text( + "${'You have in account'.tr} ${controller.totalAmountVisa}"), + onTap: () { + Get.back(); + _showPayFromBudgetDialog(controller); + }, + ), + const Divider(), + const SizedBox(height: 16), + Text("Recharge Balance Packages".tr, + style: FinanceDesignSystem.subHeadingStyle + .copyWith(fontWeight: FontWeight.bold)), + const SizedBox(height: 12), + SizedBox( + height: 140, + child: ListView( + scrollDirection: Axis.horizontal, + physics: const BouncingScrollPhysics(), + children: [ + PointsCaptain( + kolor: Colors.blueGrey, + pricePoint: 100, + countPoint: '100'), + PointsCaptain( + kolor: Colors.brown, pricePoint: 200, countPoint: '210'), + PointsCaptain( + kolor: Colors.amber, pricePoint: 400, countPoint: '450'), + PointsCaptain( + kolor: Colors.orange, + pricePoint: 1000, + countPoint: '1100'), + ], + ), + ), + ], + ), + ), + ); + } + + void _showPayFromBudgetDialog(CaptainWalletController controller) { + Get.defaultDialog( + title: 'Pay from my budget'.tr, + content: Form( + key: controller.formKey, + child: MyTextForm( + controller: controller.amountFromBudgetController, + label: '${'You have in account'.tr} ${controller.totalAmountVisa}', + hint: '${'You have in account'.tr} ${controller.totalAmountVisa}', + type: TextInputType.number, + ), + ), + confirm: MyElevatedButton( + title: 'Pay'.tr, + onPressed: () async { + bool isAvailable = await LocalAuthentication().isDeviceSupported(); + if (isAvailable) { + bool didAuthenticate = await LocalAuthentication().authenticate( + localizedReason: 'Use Touch ID or Face ID to confirm payment'.tr, + biometricOnly: true, + sensitiveTransaction: true, + ); + if (didAuthenticate) { + if (double.parse(controller.amountFromBudgetController.text) < + double.parse(controller.totalAmountVisa)) { + await controller.payFromBudget(); + } else { + Get.back(); + mySnackeBarError('Your Budget less than needed'.tr); + } + } else { + MyDialog().getDialog( + 'Authentication failed'.tr, ''.tr, () => Get.back()); + } + } else { + MyDialog().getDialog( + 'Biometric Authentication'.tr, + 'You should use Touch ID or Face ID to confirm payment'.tr, + () => Get.back()); + } + }, + ), + cancel: MyElevatedButton(title: 'Cancel'.tr, onPressed: () => Get.back()), + ); + } +} + +Future addSyrianPaymentMethod( + CaptainWalletController captainWalletController) { + return Get.defaultDialog( + title: "Insert Payment Details".tr, + content: Form( + key: captainWalletController.formKeyAccount, + child: Column( + children: [ + Text( + "Insert your mobile wallet details to receive your money weekly" + .tr), + MyTextForm( + controller: captainWalletController.cardBank, + label: "Insert mobile wallet number".tr, + hint: '0912 345 678', + type: TextInputType.phone), + const SizedBox(height: 10), + MyDropDownSyria() + ], + )), + confirm: MyElevatedButton( + title: 'Ok'.tr, + onPressed: () async { + if (captainWalletController.formKeyAccount.currentState! + .validate()) { + Get.back(); + var res = + await CRUD().post(link: AppLink.updateAccountBank, payload: { + "paymentProvider": + Get.find().dropdownValue.toString(), + "accountNumber": + captainWalletController.cardBank.text.toString(), + "id": box.read(BoxName.driverID).toString() + }); + if (res != 'failure') { + mySnackbarSuccess('Payment details added successfully'.tr); + } + } + })); +} + +class SyrianPayoutController extends GetxController { + String dropdownValue = 'syriatel'; + void changeValue(String? newValue) { + if (newValue != null) { + dropdownValue = newValue; + update(); + } + } +} + +class MyDropDownSyria extends StatelessWidget { + const MyDropDownSyria({super.key}); + @override + Widget build(BuildContext context) { + Get.put(SyrianPayoutController()); + final theme = Theme.of(context); + return GetBuilder(builder: (controller) { + return DropdownButton( + value: controller.dropdownValue, + icon: const Icon(Icons.arrow_drop_down), + elevation: 16, + isExpanded: true, + dropdownColor: theme.cardColor, + style: TextStyle(color: theme.textTheme.bodyLarge?.color), + underline: Container(height: 2, color: theme.primaryColor), + onChanged: (String? newValue) => controller.changeValue(newValue), + items: ['syriatel', 'mtn'] + .map>((String value) { + return DropdownMenuItem(value: value, child: Text(value.tr)); + }).toList(), + ); + }); + } +} diff --git a/siro_driver/lib/views/home/my_wallet/weekly_payment_page.dart b/siro_driver/lib/views/home/my_wallet/weekly_payment_page.dart new file mode 100755 index 0000000..a8aec48 --- /dev/null +++ b/siro_driver/lib/views/home/my_wallet/weekly_payment_page.dart @@ -0,0 +1,224 @@ +import 'package:flutter/material.dart'; +import 'package:flutter_staggered_animations/flutter_staggered_animations.dart'; +import 'package:get/get.dart'; +import 'package:siro_driver/constant/finance_design_system.dart'; +import 'package:siro_driver/views/widgets/mycircular.dart'; +import '../../../controller/payment/driver_payment_controller.dart'; +import 'widgets/transaction_preview_item.dart'; + +class WeeklyPaymentPage extends StatelessWidget { + const WeeklyPaymentPage({super.key}); + + @override + Widget build(BuildContext context) { + Get.put(DriverWalletHistoryController()); + + return Scaffold( + backgroundColor: FinanceDesignSystem.backgroundColor, + appBar: AppBar( + title: Text('Weekly Summary'.tr, + style: TextStyle( + fontWeight: FontWeight.bold, + color: FinanceDesignSystem.primaryDark)), + backgroundColor: Colors.transparent, + elevation: 0, + centerTitle: true, + leading: IconButton( + icon: Icon(Icons.arrow_back_ios_new_rounded, + color: FinanceDesignSystem.primaryDark, size: 20), + onPressed: () => Get.back(), + ), + ), + body: GetBuilder( + builder: (controller) { + if (controller.isLoading) { + return const Center(child: MyCircularProgressIndicator()); + } + + return Column( + children: [ + _buildWeeklyStatsHeader(controller), + const SizedBox(height: 16), + _buildWeekSelector(), + const SizedBox(height: 16), + Padding( + padding: const EdgeInsets.symmetric(horizontal: 20), + child: Row( + children: [ + Text('Transactions this week'.tr, + style: FinanceDesignSystem.headingStyle), + const Spacer(), + Icon(Icons.list_rounded, + color: Colors.grey.shade400, size: 20), + ], + ), + ), + const SizedBox(height: 8), + Expanded( + child: controller.weeklyList.isEmpty + ? _buildEmptyState(context) + : AnimationLimiter( + child: ListView.builder( + padding: const EdgeInsets.fromLTRB(16, 8, 16, 24), + itemCount: controller.weeklyList.length, + itemBuilder: (BuildContext context, int index) { + final tx = controller.weeklyList[index]; + final double amount = double.tryParse( + tx['amount']?.toString() ?? '0') ?? + 0; + return AnimationConfiguration.staggeredList( + position: index, + duration: const Duration(milliseconds: 250), + child: SlideAnimation( + verticalOffset: 25, + child: FadeInAnimation( + child: TransactionPreviewItem( + title: + amount >= 0 ? 'Credit'.tr : 'Debit'.tr, + subtitle: tx['dateUpdated'] ?? '', + amount: amount.abs().toStringAsFixed(0), + date: + tx['dateUpdated']?.split(' ')[0] ?? '', + type: amount >= 0 ? 'credit' : 'debit', + method: tx['paymentMethod'], + onTap: () {}, + ), + ), + ), + ); + }, + ), + ), + ), + ], + ); + }, + ), + ); + } + + Widget _buildWeeklyStatsHeader(DriverWalletHistoryController controller) { + final totalAmount = controller.weeklyList.isEmpty + ? '0.00' + : controller.weeklyList[0]['totalAmount']?.toString() ?? '0.00'; + + final double earnings = double.tryParse(totalAmount) ?? 0; + final int trips = controller.weeklyList.length; + final double commission = earnings * 0.15; // Example 15% + final double netProfit = earnings - commission; + + return Container( + margin: const EdgeInsets.all(16), + padding: const EdgeInsets.all(24), + decoration: BoxDecoration( + gradient: FinanceDesignSystem.balanceGradient, + borderRadius: BorderRadius.circular(24), + boxShadow: [ + BoxShadow( + color: FinanceDesignSystem.primaryDark.withValues(alpha: 0.3), + blurRadius: 20, + offset: const Offset(0, 8), + ), + ], + ), + child: Column( + children: [ + Text('Total Weekly Earnings'.tr, + style: TextStyle( + color: Colors.white.withValues(alpha: 0.8), fontSize: 14)), + const SizedBox(height: 8), + Text('${earnings.toStringAsFixed(0)} SYP', + style: const TextStyle( + color: Colors.white, + fontSize: 36, + fontWeight: FontWeight.bold)), + const SizedBox(height: 24), + Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + _buildStatItem('Total Trips'.tr, trips.toString(), + Icons.directions_car_rounded), + _buildStatItem('Commission'.tr, commission.toStringAsFixed(0), + Icons.percent_rounded), + _buildStatItem('Net Profit'.tr, netProfit.toStringAsFixed(0), + Icons.account_balance_rounded), + ], + ), + ], + ), + ); + } + + Widget _buildStatItem(String label, String value, IconData icon) { + return Column( + children: [ + Container( + padding: const EdgeInsets.all(8), + decoration: BoxDecoration( + color: Colors.white.withValues(alpha: 0.1), + borderRadius: BorderRadius.circular(10)), + child: Icon(icon, color: Colors.white, size: 18), + ), + const SizedBox(height: 8), + Text(value, + style: const TextStyle( + color: Colors.white, + fontWeight: FontWeight.bold, + fontSize: 14)), + Text(label, + style: TextStyle( + color: Colors.white.withValues(alpha: 0.6), fontSize: 10)), + ], + ); + } + + Widget _buildWeekSelector() { + return Padding( + padding: const EdgeInsets.symmetric(horizontal: 16), + child: Container( + padding: const EdgeInsets.symmetric(horizontal: 8, vertical: 4), + decoration: BoxDecoration( + color: Colors.white, + borderRadius: BorderRadius.circular(16), + boxShadow: [ + BoxShadow( + color: Colors.black.withValues(alpha: 0.02), blurRadius: 10) + ], + ), + child: Row( + children: [ + IconButton( + icon: const Icon(Icons.chevron_left_rounded), onPressed: () {}), + Expanded( + child: Center( + child: Text('Dec 15 - Dec 21, 2024'.tr, + style: TextStyle( + fontWeight: FontWeight.bold, + fontSize: 14, + color: FinanceDesignSystem.primaryDark)), + ), + ), + IconButton( + icon: const Icon(Icons.chevron_right_rounded), + onPressed: () {}), + ], + ), + ), + ); + } + + Widget _buildEmptyState(BuildContext context) { + return Center( + child: Column( + mainAxisAlignment: MainAxisAlignment.center, + children: [ + Icon(Icons.bar_chart_rounded, size: 64, color: Colors.grey.shade300), + const SizedBox(height: 16), + Text('No transactions this week'.tr, + style: const TextStyle( + fontWeight: FontWeight.bold, color: Colors.grey)), + ], + ), + ); + } +} diff --git a/siro_driver/lib/views/home/my_wallet/widgets/balance_card.dart b/siro_driver/lib/views/home/my_wallet/widgets/balance_card.dart new file mode 100644 index 0000000..ab43334 --- /dev/null +++ b/siro_driver/lib/views/home/my_wallet/widgets/balance_card.dart @@ -0,0 +1,124 @@ +import 'package:flutter/material.dart'; +import 'package:get/get.dart'; +import '../../../../constant/finance_design_system.dart'; + +class BalanceCard extends StatelessWidget { + final String balance; + final bool isNegative; + final String lastUpdated; + + const BalanceCard({ + super.key, + required this.balance, + required this.isNegative, + this.lastUpdated = "Just now", + }); + + @override + Widget build(BuildContext context) { + return Container( + width: double.infinity, + padding: const EdgeInsets.all(24), + decoration: BoxDecoration( + borderRadius: BorderRadius.circular(FinanceDesignSystem.cardRadius), + gradient: isNegative + ? FinanceDesignSystem.dangerGradient + : FinanceDesignSystem.balanceGradient, + boxShadow: [ + BoxShadow( + color: (isNegative + ? FinanceDesignSystem.dangerRed + : FinanceDesignSystem.primaryDark) + .withOpacity(0.3), + blurRadius: 15, + offset: const Offset(0, 8), + ), + ], + ), + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Text( + "Available Balance".tr, + style: TextStyle( + color: Colors.white.withOpacity(0.8), + fontSize: 14, + fontWeight: FontWeight.w500, + ), + ), + Text( + "الرصيد المتاح".tr, + style: TextStyle( + color: Colors.white.withOpacity(0.5), + fontSize: 12, + ), + ), + ], + ), + Container( + padding: const EdgeInsets.all(8), + decoration: BoxDecoration( + color: Colors.white.withOpacity(0.2), + shape: BoxShape.circle, + ), + child: Icon( + isNegative + ? Icons.warning_rounded + : Icons.account_balance_wallet_rounded, + color: Colors.white, + size: 20, + ), + ), + ], + ), + const SizedBox(height: 20), + Row( + crossAxisAlignment: CrossAxisAlignment.baseline, + textBaseline: TextBaseline.alphabetic, + children: [ + Text( + balance, + style: FinanceDesignSystem.balanceStyle, + ), + const SizedBox(width: 8), + Text( + "SYP".tr, + style: TextStyle( + color: Colors.white.withOpacity(0.7), + fontSize: 18, + fontWeight: FontWeight.w500, + ), + ), + ], + ), + const SizedBox(height: 16), + Divider(color: Colors.white.withOpacity(0.15)), + const SizedBox(height: 8), + Row( + children: [ + Icon( + Icons.history_rounded, + color: Colors.white.withOpacity(0.5), + size: 14, + ), + const SizedBox(width: 6), + Text( + "${'Last updated:'.tr} $lastUpdated", + style: TextStyle( + color: Colors.white.withOpacity(0.5), + fontSize: 12, + ), + ), + ], + ), + ], + ), + ); + } +} diff --git a/siro_driver/lib/views/home/my_wallet/widgets/financial_summary_card.dart b/siro_driver/lib/views/home/my_wallet/widgets/financial_summary_card.dart new file mode 100644 index 0000000..d371868 --- /dev/null +++ b/siro_driver/lib/views/home/my_wallet/widgets/financial_summary_card.dart @@ -0,0 +1,142 @@ +import 'package:flutter/material.dart'; +import 'package:get/get.dart'; +import '../../../../constant/finance_design_system.dart'; + +class FinancialSummaryCard extends StatelessWidget { + final String title; + final String? subtitle; + final List items; + + const FinancialSummaryCard({ + super.key, + required this.title, + this.subtitle, + required this.items, + }); + + @override + Widget build(BuildContext context) { + return Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Text(title, style: FinanceDesignSystem.headingStyle), + if (subtitle != null) + Text(subtitle!, style: FinanceDesignSystem.subHeadingStyle), + ], + ), + ], + ), + const SizedBox(height: 16), + Container( + padding: const EdgeInsets.all(16), + decoration: BoxDecoration( + color: Colors.white, + borderRadius: BorderRadius.circular(FinanceDesignSystem.cardRadius), + boxShadow: [ + BoxShadow( + color: Colors.black.withValues(alpha: 0.03), + blurRadius: 10, + offset: const Offset(0, 4), + ), + ], + ), + child: ListView.separated( + shrinkWrap: true, + physics: const NeverScrollableScrollPhysics(), + itemCount: items.length, + separatorBuilder: (context, index) => + Divider(color: Colors.grey.withValues(alpha: 0.1), height: 24), + itemBuilder: (context, index) { + final item = items[index]; + return Row( + children: [ + Container( + padding: const EdgeInsets.all(10), + decoration: BoxDecoration( + color: item.color.withValues(alpha: 0.1), + borderRadius: BorderRadius.circular(10), + ), + child: Icon(item.icon, color: item.color, size: 20), + ), + const SizedBox(width: 16), + Expanded( + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Text( + item.label, + style: TextStyle( + fontSize: 14, + fontWeight: FontWeight.w500, + color: FinanceDesignSystem.primaryDark, + ), + ), + if (item.subLabel != null) + Text( + item.subLabel!, + style: TextStyle( + fontSize: 12, + color: Colors.grey.shade500, + ), + ), + ], + ), + ), + Column( + crossAxisAlignment: CrossAxisAlignment.end, + children: [ + Text( + "${item.amount} ${'SYP'.tr}", + style: TextStyle( + fontSize: 16, + fontWeight: FontWeight.bold, + color: FinanceDesignSystem.primaryDark, + ), + ), + if (item.trend != null) + Text( + item.trend!, + style: TextStyle( + fontSize: 11, + color: item.trendColor ?? + FinanceDesignSystem.successGreen, + fontWeight: FontWeight.w500, + ), + ), + ], + ), + ], + ); + }, + ), + ), + ], + ); + } +} + +class SummaryItem { + final IconData icon; + final String label; + final String? subLabel; + final String amount; + final Color color; + final String? trend; + final Color? trendColor; + + SummaryItem({ + required this.icon, + required this.label, + this.subLabel, + required this.amount, + required this.color, + this.trend, + this.trendColor, + }); +} diff --git a/siro_driver/lib/views/home/my_wallet/widgets/promo_gamification_card.dart b/siro_driver/lib/views/home/my_wallet/widgets/promo_gamification_card.dart new file mode 100644 index 0000000..3223ce7 --- /dev/null +++ b/siro_driver/lib/views/home/my_wallet/widgets/promo_gamification_card.dart @@ -0,0 +1,163 @@ +import 'package:flutter/material.dart'; +import 'package:get/get.dart'; +import '../../../../constant/finance_design_system.dart'; + +class PromoGamificationCard extends StatelessWidget { + final String title; + final String subtitle; + final int currentProgress; + final int targetProgress; + final String reward; + final VoidCallback? onTap; + + const PromoGamificationCard({ + super.key, + required this.title, + required this.subtitle, + required this.currentProgress, + required this.targetProgress, + required this.reward, + this.onTap, + }); + + @override + Widget build(BuildContext context) { + final double progress = (currentProgress / targetProgress).clamp(0.0, 1.0); + final bool isCompleted = progress >= 1.0; + + return Container( + padding: const EdgeInsets.all(20), + decoration: BoxDecoration( + color: Colors.white, + borderRadius: BorderRadius.circular(FinanceDesignSystem.cardRadius), + boxShadow: [ + BoxShadow( + color: Colors.black.withOpacity(0.03), + blurRadius: 10, + offset: const Offset(0, 4), + ), + ], + ), + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + Expanded( + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Text( + title, + style: TextStyle( + fontSize: 16, + fontWeight: FontWeight.bold, + color: FinanceDesignSystem.primaryDark, + ), + ), + Text( + subtitle, + style: TextStyle( + fontSize: 12, + color: Colors.grey.shade500, + ), + ), + ], + ), + ), + Container( + padding: + const EdgeInsets.symmetric(horizontal: 12, vertical: 6), + decoration: BoxDecoration( + color: (isCompleted + ? FinanceDesignSystem.successGreen + : FinanceDesignSystem.accentBlue) + .withOpacity(0.1), + borderRadius: BorderRadius.circular(20), + ), + child: Text( + reward, + style: TextStyle( + fontSize: 12, + fontWeight: FontWeight.bold, + color: isCompleted + ? FinanceDesignSystem.successGreen + : FinanceDesignSystem.accentBlue, + ), + ), + ), + ], + ), + const SizedBox(height: 20), + Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + Text( + "${'Progress:'.tr} $currentProgress / $targetProgress", + style: TextStyle( + fontSize: 12, + fontWeight: FontWeight.w500, + color: Colors.grey.shade700, + ), + ), + if (isCompleted) + Icon(Icons.check_circle_rounded, + color: FinanceDesignSystem.successGreen, size: 16), + ], + ), + const SizedBox(height: 8), + Stack( + children: [ + Container( + height: 10, + width: double.infinity, + decoration: BoxDecoration( + color: Colors.grey.shade100, + borderRadius: BorderRadius.circular(5), + ), + ), + AnimatedContainer( + duration: const Duration(milliseconds: 500), + height: 10, + width: MediaQuery.of(context).size.width * + progress, // Simplified for now + decoration: BoxDecoration( + gradient: LinearGradient( + colors: isCompleted + ? [ + FinanceDesignSystem.successGreen, + Colors.lightGreenAccent + ] + : [FinanceDesignSystem.accentBlue, Colors.blueAccent], + ), + borderRadius: BorderRadius.circular(5), + ), + ), + ], + ), + if (isCompleted && onTap != null) ...[ + const SizedBox(height: 16), + SizedBox( + width: double.infinity, + child: ElevatedButton( + onPressed: onTap, + style: ElevatedButton.styleFrom( + backgroundColor: FinanceDesignSystem.successGreen, + foregroundColor: Colors.white, + shape: RoundedRectangleBorder( + borderRadius: + BorderRadius.circular(FinanceDesignSystem.buttonRadius), + ), + elevation: 0, + padding: const EdgeInsets.symmetric(vertical: 12), + ), + child: Text("Claim Reward".tr), + ), + ), + ], + ], + ), + ); + } +} diff --git a/siro_driver/lib/views/home/my_wallet/widgets/quick_actions.dart b/siro_driver/lib/views/home/my_wallet/widgets/quick_actions.dart new file mode 100644 index 0000000..8986fb6 --- /dev/null +++ b/siro_driver/lib/views/home/my_wallet/widgets/quick_actions.dart @@ -0,0 +1,120 @@ +import 'package:flutter/material.dart'; +import 'package:get/get.dart'; +import '../../../../constant/finance_design_system.dart'; + +class QuickActionsGrid extends StatelessWidget { + final VoidCallback onAddBalance; + final VoidCallback onWithdraw; + final VoidCallback onTransfer; + final VoidCallback onHistory; + + const QuickActionsGrid({ + super.key, + required this.onAddBalance, + required this.onWithdraw, + required this.onTransfer, + required this.onHistory, + }); + + @override + Widget build(BuildContext context) { + return GridView.count( + shrinkWrap: true, + physics: const NeverScrollableScrollPhysics(), + crossAxisCount: 2, + crossAxisSpacing: 16, + mainAxisSpacing: 16, + childAspectRatio: 1.5, + children: [ + _ActionItem( + icon: Icons.add_circle_outline_rounded, + label: "Add Balance".tr, + subLabel: "شحن", + color: FinanceDesignSystem.accentBlue, + onTap: onAddBalance, + ), + _ActionItem( + icon: Icons.file_download_outlined, + label: "Withdraw".tr, + subLabel: "سحب", + color: FinanceDesignSystem.successGreen, + onTap: onWithdraw, + ), + _ActionItem( + icon: Icons.swap_horiz_rounded, + label: "Transfer".tr, + subLabel: "تحويل", + color: Colors.orange, + onTap: onTransfer, + ), + _ActionItem( + icon: Icons.history_rounded, + label: "History".tr, + subLabel: "السجل", + color: FinanceDesignSystem.primaryDark, + onTap: onHistory, + ), + ], + ); + } +} + +class _ActionItem extends StatelessWidget { + final IconData icon; + final String label; + final String subLabel; + final Color color; + final VoidCallback onTap; + + const _ActionItem({ + required this.icon, + required this.label, + required this.subLabel, + required this.color, + required this.onTap, + }); + + @override + Widget build(BuildContext context) { + return Material( + color: Colors.white, + borderRadius: BorderRadius.circular(FinanceDesignSystem.buttonRadius), + child: InkWell( + onTap: onTap, + borderRadius: BorderRadius.circular(FinanceDesignSystem.buttonRadius), + child: Container( + padding: const EdgeInsets.all(16), + decoration: BoxDecoration( + border: Border.all(color: Colors.grey.withOpacity(0.1)), + borderRadius: + BorderRadius.circular(FinanceDesignSystem.buttonRadius), + ), + child: Column( + mainAxisAlignment: MainAxisAlignment.center, + children: [ + Icon(icon, color: color, size: 24), + const SizedBox(height: 8), + Text( + label, + style: TextStyle( + fontSize: 13, + fontWeight: FontWeight.bold, + color: FinanceDesignSystem.primaryDark, + ), + textAlign: TextAlign.center, + ), + Text( + subLabel, + style: TextStyle( + fontSize: 11, + color: Colors.grey.shade500, + ), + textAlign: TextAlign.center, + ), + ], + ), + ), + ), + ); + } +} diff --git a/siro_driver/lib/views/home/my_wallet/widgets/transaction_preview_item.dart b/siro_driver/lib/views/home/my_wallet/widgets/transaction_preview_item.dart new file mode 100644 index 0000000..6ccab13 --- /dev/null +++ b/siro_driver/lib/views/home/my_wallet/widgets/transaction_preview_item.dart @@ -0,0 +1,128 @@ +import 'package:flutter/material.dart'; +import 'package:get/get.dart'; +import '../../../../constant/finance_design_system.dart'; + +class TransactionPreviewItem extends StatelessWidget { + final String title; + final String subtitle; + final String amount; + final String date; + final String type; // 'credit' or 'debit' + final String? method; + final VoidCallback? onTap; + + const TransactionPreviewItem({ + super.key, + required this.title, + required this.subtitle, + required this.amount, + required this.date, + required this.type, + this.method, + this.onTap, + }); + + @override + Widget build(BuildContext context) { + final bool isCredit = type.toLowerCase() == 'credit'; + final Color statusColor = isCredit + ? FinanceDesignSystem.successGreen + : FinanceDesignSystem.dangerRed; + + return Material( + color: Colors.transparent, + child: InkWell( + onTap: onTap, + borderRadius: BorderRadius.circular(FinanceDesignSystem.mainRadius), + child: Container( + padding: const EdgeInsets.symmetric(vertical: 12, horizontal: 4), + child: Row( + children: [ + Container( + padding: const EdgeInsets.all(12), + decoration: BoxDecoration( + color: statusColor.withOpacity(0.1), + shape: BoxShape.circle, + ), + child: Icon( + isCredit + ? Icons.arrow_downward_rounded + : Icons.arrow_upward_rounded, + color: statusColor, + size: 20, + ), + ), + const SizedBox(width: 16), + Expanded( + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Text( + title, + style: TextStyle( + fontSize: 15, + fontWeight: FontWeight.bold, + color: FinanceDesignSystem.primaryDark, + ), + ), + const SizedBox(height: 4), + Row( + children: [ + Text( + date, + style: TextStyle( + fontSize: 12, + color: Colors.grey.shade500, + ), + ), + if (method != null) ...[ + const SizedBox(width: 8), + Container( + width: 3, + height: 3, + decoration: BoxDecoration( + color: Colors.grey.shade400, + shape: BoxShape.circle, + ), + ), + const SizedBox(width: 8), + Text( + method!, + style: TextStyle( + fontSize: 12, + color: Colors.grey.shade500, + ), + ), + ], + ], + ), + ], + ), + ), + Column( + crossAxisAlignment: CrossAxisAlignment.end, + children: [ + Text( + "${isCredit ? '+' : '-'}$amount ${'SYP'.tr}", + style: TextStyle( + fontSize: 16, + fontWeight: FontWeight.bold, + color: statusColor, + ), + ), + Text( + subtitle, + style: TextStyle( + fontSize: 11, + color: Colors.grey.shade400, + ), + ), + ], + ), + ], + ), + ), + ), + ); + } +} diff --git a/siro_driver/lib/views/home/on_boarding_page.dart b/siro_driver/lib/views/home/on_boarding_page.dart new file mode 100755 index 0000000..48bf617 --- /dev/null +++ b/siro_driver/lib/views/home/on_boarding_page.dart @@ -0,0 +1,33 @@ +import 'package:siro_driver/constant/colors.dart'; +import 'package:siro_driver/controller/auth/onboarding_controller.dart'; +import 'package:siro_driver/onbording_page.dart'; +import 'package:siro_driver/views/widgets/elevated_btn.dart'; +import 'package:flutter/material.dart'; +import 'package:get/get.dart'; + +class OnBoardingPage extends StatelessWidget { + OnBoardingControllerImp onBoardingControllerImp = + Get.put(OnBoardingControllerImp()); + + OnBoardingPage({super.key}); + @override + Widget build(BuildContext context) { + return Scaffold( + backgroundColor: AppColor.secondaryColor, + body: SafeArea( + child: Column(mainAxisAlignment: MainAxisAlignment.center, children: [ + SizedBox( + height: Get.height * .7, + child: const CustomSliderOnBoarding(), + ), + const CustomDotControllerOnBoarding(), + // const Spacer(flex: 2), + const SizedBox(height: 20), + MyElevatedButton( + onPressed: () => onBoardingControllerImp.next(), + title: 'Next'.tr, + ) + ]), + )); + } +} diff --git a/siro_driver/lib/views/home/profile/behavior_page.dart b/siro_driver/lib/views/home/profile/behavior_page.dart new file mode 100644 index 0000000..fbc7a8d --- /dev/null +++ b/siro_driver/lib/views/home/profile/behavior_page.dart @@ -0,0 +1,214 @@ +import 'package:flutter/material.dart'; +import 'package:get/get.dart'; + +import '../../../constant/finance_design_system.dart'; +import '../../../controller/home/captin/behavior_controller.dart'; + +class BehaviorPage extends StatelessWidget { + const BehaviorPage({super.key}); + + @override + Widget build(BuildContext context) { + final controller = Get.put(DriverBehaviorController()); + controller.fetchDriverBehavior(); + + return Scaffold( + backgroundColor: FinanceDesignSystem.backgroundColor, + appBar: AppBar( + title: Text('Driver Behavior'.tr, + style: TextStyle( + fontWeight: FontWeight.bold, + color: FinanceDesignSystem.primaryDark)), + centerTitle: true, + backgroundColor: FinanceDesignSystem.cardColor, + elevation: 0, + iconTheme: IconThemeData(color: FinanceDesignSystem.primaryDark), + ), + body: Obx(() { + if (controller.isLoading.value) { + return Center( + child: CircularProgressIndicator( + color: FinanceDesignSystem.accentBlue)); + } + + double score = controller.overallScore.value; + bool isExcellent = score >= 90; + bool isGood = score >= 75 && score < 90; + Color statusColor = + isExcellent ? Colors.green : (isGood ? Colors.orange : Colors.red); + String statusText = isExcellent + ? 'Excellent'.tr + : (isGood ? 'Good'.tr : 'Needs Improvement'.tr); + + return CustomScrollView( + slivers: [ + SliverPadding( + padding: + const EdgeInsets.all(FinanceDesignSystem.horizontalPadding), + sliver: SliverList( + delegate: SliverChildListDelegate([ + // Overall Score Card + Container( + padding: const EdgeInsets.all(24), + decoration: BoxDecoration( + color: FinanceDesignSystem.cardColor, + borderRadius: BorderRadius.circular(24), + boxShadow: const [ + BoxShadow( + color: Colors.black12, + blurRadius: 10, + offset: Offset(0, 4)) + ], + ), + child: Column( + children: [ + Icon(Icons.shield_rounded, + size: 48, color: statusColor), + const SizedBox(height: 16), + Text( + "Overall Behavior Score".tr, + style: FinanceDesignSystem.headingStyle, + ), + const SizedBox(height: 8), + Text( + "${score.toStringAsFixed(1)} / 100", + style: TextStyle( + fontSize: 36, + fontWeight: FontWeight.bold, + color: statusColor, + ), + ), + const SizedBox(height: 8), + Container( + padding: const EdgeInsets.symmetric( + horizontal: 16, vertical: 6), + decoration: BoxDecoration( + color: statusColor.withValues(alpha: 0.1), + borderRadius: BorderRadius.circular(20), + ), + child: Text( + statusText, + style: TextStyle( + color: statusColor, + fontWeight: FontWeight.bold), + ), + ), + ], + ), + ), + const SizedBox(height: 30), + Text("Last 10 Trips".tr, + style: FinanceDesignSystem.headingStyle), + const SizedBox(height: 16), + ]), + ), + ), + SliverPadding( + padding: const EdgeInsets.symmetric( + horizontal: FinanceDesignSystem.horizontalPadding), + sliver: SliverList( + delegate: SliverChildBuilderDelegate( + (context, index) { + var trip = controller.lastTrips[index]; + double tripScore = + double.tryParse(trip['behavior_score'].toString()) ?? 0; + Color tColor = tripScore >= 90 + ? Colors.green + : (tripScore >= 75 ? Colors.orange : Colors.red); + + return Container( + margin: const EdgeInsets.only(bottom: 12), + decoration: BoxDecoration( + color: FinanceDesignSystem.cardColor, + borderRadius: BorderRadius.circular(16), + boxShadow: [ + BoxShadow( + color: Colors.black.withValues(alpha: 0.02), + blurRadius: 10, + offset: const Offset(0, 4), + ) + ], + ), + child: ListTile( + contentPadding: const EdgeInsets.all(16), + leading: Container( + padding: const EdgeInsets.all(12), + decoration: BoxDecoration( + color: tColor.withValues(alpha: 0.1), + shape: BoxShape.circle, + ), + child: Icon(Icons.drive_eta_rounded, color: tColor), + ), + title: Text( + "Trip ID: ${trip['trip_id']}", + style: const TextStyle( + fontWeight: FontWeight.bold, fontSize: 16), + ), + subtitle: Padding( + padding: const EdgeInsets.only(top: 8.0), + child: Wrap( + spacing: 12, + runSpacing: 8, + children: [ + _buildBadge(Icons.speed, + "${trip['max_speed']} km/h", Colors.blue), + _buildBadge( + Icons.warning_amber_rounded, + "${trip['hard_brakes']} ${'Hard Brakes'.tr}", + Colors.orange), + _buildBadge( + Icons.map_rounded, + "${trip['total_distance']} km", + Colors.purple), + ], + ), + ), + trailing: Column( + mainAxisAlignment: MainAxisAlignment.center, + children: [ + Text( + "${tripScore.toStringAsFixed(0)}", + style: TextStyle( + fontWeight: FontWeight.bold, + fontSize: 20, + color: tColor), + ), + Text('Score'.tr, + style: const TextStyle( + fontSize: 10, color: Colors.grey)), + ], + ), + ), + ); + }, + childCount: controller.lastTrips.length, + ), + ), + ), + const SliverToBoxAdapter(child: SizedBox(height: 40)), + ], + ); + }), + ); + } + + Widget _buildBadge(IconData icon, String label, Color color) { + return Container( + padding: const EdgeInsets.symmetric(horizontal: 8, vertical: 4), + decoration: BoxDecoration( + color: color.withValues(alpha: 0.1), + borderRadius: BorderRadius.circular(8), + ), + child: Row( + mainAxisSize: MainAxisSize.min, + children: [ + Icon(icon, size: 14, color: color), + const SizedBox(width: 4), + Text(label, + style: TextStyle( + fontSize: 12, color: color, fontWeight: FontWeight.w600)), + ], + ), + ); + } +} diff --git a/siro_driver/lib/views/home/profile/captains_cars.dart b/siro_driver/lib/views/home/profile/captains_cars.dart new file mode 100755 index 0000000..a7ae63b --- /dev/null +++ b/siro_driver/lib/views/home/profile/captains_cars.dart @@ -0,0 +1,171 @@ +import 'package:siro_driver/constant/box_name.dart'; +import 'package:siro_driver/constant/colors.dart'; +import 'package:siro_driver/constant/style.dart'; +import 'package:siro_driver/controller/functions/encrypt_decrypt.dart'; +import 'package:siro_driver/main.dart'; +import 'package:siro_driver/views/widgets/my_scafold.dart'; +import 'package:siro_driver/views/widgets/mycircular.dart'; +import 'package:siro_driver/views/widgets/mydialoug.dart'; +import 'package:flutter/material.dart'; +import 'package:flutter_font_icons/flutter_font_icons.dart'; +import 'package:get/get.dart'; + +import '../../auth/captin/driver_car_controller.dart'; +import '../../widgets/elevated_btn.dart'; +import 'cars_inserting_page.dart'; + +class CaptainsCars extends StatelessWidget { + const CaptainsCars({super.key}); + + @override + Widget build(BuildContext context) { + Get.put(DriverCarController()); + return MyScafolld( + title: "Add new car".tr, + body: [ + Column( + children: [ + MyElevatedButton( + title: "Add new car".tr, + onPressed: () async { + Get.to(() => CarsInsertingPage()); + }, + ), + Expanded( + child: GetBuilder( + builder: (controller) { + return controller.isLoading + ? const MyCircularProgressIndicator() + : ListView.builder( + itemCount: controller.cars.length, + itemBuilder: (context, index) { + final car = controller.cars[index]; + return Padding( + padding: const EdgeInsets.symmetric(horizontal: 12.0, vertical: 6.0), + child: Card( + elevation: 2, + color: car['isDefault'].toString() == '1' + ? AppColor.primaryColor + : Theme.of(context).cardColor, + shape: RoundedRectangleBorder( + borderRadius: BorderRadius.circular(12), + side: car['isDefault'].toString() == '1' + ? BorderSide.none + : BorderSide(color: Theme.of(context).dividerColor)), + child: ListTile( + contentPadding: const EdgeInsets.all(12), + leading: Container( + padding: const EdgeInsets.all(8), + decoration: BoxDecoration( + color: Colors.white12, + borderRadius: BorderRadius.circular(8), + ), + child: Icon( + Fontisto.car, + size: 32, + color: car['isDefault'].toString() == '1' + ? Colors.white + : Color(int.parse(car['color_hex'] + .replaceFirst('#', '0xff'))), + ), + ), + title: Text( + car['make'], + style: TextStyle( + fontWeight: FontWeight.bold, + fontSize: 16, + color: car['isDefault'].toString() == '1' + ? Colors.white + : Theme.of(context).textTheme.bodyLarge?.color, + ), + ), + subtitle: Padding( + padding: const EdgeInsets.only(top: 8.0), + child: Row( + children: [ + Text( + car['model'], + style: TextStyle( + color: car['isDefault'].toString() == '1' + ? Colors.white70 + : Theme.of(context).hintColor, + ), + ), + const SizedBox(width: 12), + Container( + padding: const EdgeInsets.symmetric(horizontal: 6, vertical: 2), + decoration: BoxDecoration( + borderRadius: BorderRadius.circular(4), + border: Border.all( + color: car['isDefault'].toString() == '1' + ? Colors.white54 + : AppColor.primaryColor, + ), + ), + child: Text( + car['car_plate'], + style: TextStyle( + fontSize: 12, + fontWeight: FontWeight.bold, + color: car['isDefault'].toString() == '1' + ? Colors.white + : AppColor.primaryColor, + ), + ), + ), + const Spacer(), + Text( + car['year'], + style: TextStyle( + color: car['isDefault'].toString() == '1' + ? Colors.white70 + : Theme.of(context).hintColor, + ), + ), + ], + ), + ), + + // trailing: IconButton( + // icon: const Icon( + // Icons.delete, + // color: AppColor.redColor, + // ), + // onPressed: () { + // // Add logic here to remove a car + // MyDialog() + // .getDialog('Are you sure to delete this car', '', () { + // controller + // .removeCar(car['id'].toString()); + // }); + + // }, + // ), + onTap: () { + MyDialog().getDialog( + 'Are you sure to make this car as default' + .tr, + '', () { + Get.back(); + //make it default + controller.updateCarRegistration( + car['id'].toString(), + box.read(BoxName.driverID).toString(), + ); + }); + // Add logic to view or edit the car details + }, + ), + ), + ); + }, + ); + }, + ), + ), + ], + ) + ], + isleading: true); + } +} diff --git a/siro_driver/lib/views/home/profile/cars_inserting_page.dart b/siro_driver/lib/views/home/profile/cars_inserting_page.dart new file mode 100755 index 0000000..9a50a80 --- /dev/null +++ b/siro_driver/lib/views/home/profile/cars_inserting_page.dart @@ -0,0 +1,300 @@ +import 'package:siro_driver/views/widgets/elevated_btn.dart'; +import 'package:siro_driver/views/widgets/my_scafold.dart'; +import 'package:flutter/material.dart'; +import 'package:get/get.dart'; + +import '../../../constant/colors.dart'; +import '../../../constant/links.dart'; +import '../../../constant/style.dart'; +import '../../../controller/functions/encrypt_decrypt.dart'; +import '../../../controller/functions/gemeni.dart'; +import '../../auth/captin/driver_car_controller.dart'; + +class CarsInsertingPage extends StatelessWidget { + CarsInsertingPage({super.key}); + final driverCarController = Get.put(DriverCarController()); + @override + Widget build(BuildContext context) { + Get.put(AI()); + return MyScafolld( + title: "Add new car".tr, + body: [ + Container( + color: AppColor.accentColor.withOpacity(.2), + child: Padding( + padding: const EdgeInsets.all(22), + child: ListView( + // crossAxisAlignment: CrossAxisAlignment.center, + children: [ + syriaCarLicenceFront(), + syriaCarLicenceBack(), + const SizedBox(height: 10), + Text('Please make sure to read the license carefully.'.tr), + Text( + 'If your car license has the new design, upload the front side with two images.' + .tr), + const SizedBox(height: 10), + MyElevatedButton( + title: 'Please upload this license.'.tr, + onPressed: () { + final aiFront = + Get.find().responseIdCardDriverEgyptFront; + final aiBack = + Get.find().responseIdCardDriverEgyptBack; + driverCarController.addCarsForDrivers( + aiBack['chassis'].toString(), + aiBack['car_plate'].toString(), + aiBack['make'].toString(), + aiBack['model'].toString(), + aiBack['year'].toString(), + aiFront['LicenseExpirationDate'].toString(), + aiBack['color'].toString(), + aiBack['color_hex'].toString(), + aiFront['address'].toString(), + aiFront['owner'].toString(), + aiBack['inspection_date'].toString(), + aiBack['engine'].toString(), + aiBack['fuel'].toString(), + ); + }) + ], + ), + ), + ) + ], + isleading: true); + } +} + +GetBuilder syriaCarLicenceFront() { + return GetBuilder( + builder: (ai) { + if (ai.responseIdCardDriverEgyptFront.isNotEmpty) { + // No need to access ai.responseIdCardDriverEgyptBack anymore + final licenseExpiryDate = DateTime.parse( + ai.responseIdCardDriverEgyptFront['LicenseExpirationDate']); + + // Check if license has expired + final today = DateTime.now(); + final isLicenseExpired = licenseExpiryDate.isBefore(today); + + return Card( + elevation: 4.0, + shape: RoundedRectangleBorder( + borderRadius: BorderRadius.circular(16.0), + ), + child: Padding( + padding: const EdgeInsets.all(16.0), + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Row( + children: [ + Text('Vehicle Details Front'.tr, + style: AppStyle.headTitle2), + IconButton( + onPressed: () async { + ai.allMethodForAI((ai.prompts[3]['prompt'].toString()), + AppLink.uploadEgypt, 'car_front'); + }, + icon: const Icon(Icons.refresh), + ), + ], + ), + const SizedBox(height: 8.0), + const Divider(color: AppColor.accentColor), + const SizedBox(height: 8.0), + // Removed Make, Model, etc. as they are not available + + Text( + '${'Plate Number'.tr}: ${ai.responseIdCardDriverEgyptFront['car_plate']}', + ), + const SizedBox(height: 8.0), + Text( + '${'Owner Name'.tr}: ${ai.responseIdCardDriverEgyptFront['owner']}', + ), + const SizedBox(height: 8.0), + Text( + '${'Address'.tr}: ${ai.responseIdCardDriverEgyptFront['address']}', + ), + const SizedBox(height: 8.0), + Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + Text( + '${'License Expiry Date'.tr}: ${licenseExpiryDate.toString().substring(0, 10)}', + style: TextStyle( + color: isLicenseExpired ? Colors.red : Colors.green, + ), + ), + // Removed Fuel as it's not available + ], + ), + // Removed Inspection Date as it's not available + ], + ), + ), + ); + } + return Card( + child: InkWell( + onTap: () async { + ai.allMethodForAINewCar((ai.prompts[3]['prompt'].toString()), + AppLink.uploadEgypt1, 'car_front', 'carId'); //todo + }, + child: Column( + children: [ + Image.asset( + 'assets/images/3.png', + height: Get.height * .25, + width: double.maxFinite, + fit: BoxFit.fitHeight, + ), + Text( + 'Capture an Image of Your car license front '.tr, + style: AppStyle.title, + ), + ], + ), + ), + ); + }, + ); +} + +GetBuilder syriaCarLicenceBack() { + return GetBuilder( + builder: (ai) { + if (ai.responseIdCardDriverEgyptBack.isNotEmpty) { + // Get the tax expiry date from the response + final taxExpiryDate = + ai.responseIdCardDriverEgyptBack['tax_expiry'].toString(); + // final displacement = ai.responseIdCardDriverEgyptBack['displacement']; + // if (int.parse(displacement) < 1000) {} + // Get the inspection date from the response + final inspectionDate = + ai.responseIdCardDriverEgyptBack['inspection_date'].toString(); + final year = int.parse(inspectionDate.toString().split('-')[0]); + +// Set inspectionDateTime to December 31st of the given year + final inspectionDateTime = DateTime(year, 12, 31); + String carBackLicenseExpired = + inspectionDateTime.toString().split(' ')[0]; +// Get the current date + final today = DateTime.now(); + +// Try parsing the tax expiry date. If it fails, set it to null. + final taxExpiryDateTime = DateTime.tryParse(taxExpiryDate ?? ''); + final isExpired = + taxExpiryDateTime != null && taxExpiryDateTime.isBefore(today); +// Check if the inspection date is before today + bool isInspectionExpired = inspectionDateTime.isBefore(today); + + return Card( + elevation: 4.0, + shape: RoundedRectangleBorder( + borderRadius: BorderRadius.circular(16.0), + ), + child: Padding( + padding: const EdgeInsets.all(16.0), + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + Text('Vehicle Details Back'.tr, style: AppStyle.headTitle2), + IconButton( + onPressed: () async { + ai.allMethodForAI((ai.prompts[4]['prompt'].toString()), + AppLink.uploadEgypt, 'car_back'); + }, + icon: const Icon(Icons.refresh), + ), + ], + ), + const SizedBox(height: 8.0), + const Divider(color: AppColor.accentColor), + const SizedBox(height: 8.0), + Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + Text( + '${'Make'.tr}: ${ai.responseIdCardDriverEgyptBack['make']}'), + Text( + '${'Model'.tr}: ${ai.responseIdCardDriverEgyptBack['model']}'), + ], + ), + const SizedBox(height: 8.0), + Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + Text( + '${'Year'.tr}: ${ai.responseIdCardDriverEgyptBack['year']}'), + Text( + '${'Chassis'.tr}: ${ai.responseIdCardDriverEgyptBack['chassis']}'), + ], + ), + const SizedBox(height: 8.0), + Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + Text( + '${'Color'.tr}: ${ai.responseIdCardDriverEgyptBack['color']}'), + Text( + '${'Displacement'.tr}: ${ai.responseIdCardDriverEgyptBack['displacement']} cc'), + ], + ), + const SizedBox(height: 8.0), + Text( + '${'Fuel'.tr}: ${ai.responseIdCardDriverEgyptBack['fuel']}'), + const SizedBox(height: 8.0), + if (taxExpiryDateTime != null) + Text( + '${'Tax Expiry Date'.tr}: $taxExpiryDate', + style: TextStyle( + color: isExpired ? Colors.red : Colors.green, + ), + ), + const SizedBox(height: 8.0), + Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + Text( + '${'Inspection Date'.tr}: $carBackLicenseExpired', + style: TextStyle( + color: isInspectionExpired ? Colors.red : Colors.green, + ), + ), + ], + ), + ], + ), + ), + ); + } + return Card( + child: InkWell( + onTap: () async { + ai.allMethodForAI((ai.prompts[4]['prompt'].toString()), + AppLink.uploadEgypt, 'car_back'); + }, + child: Column( + children: [ + Image.asset( + 'assets/images/4.png', + height: Get.height * .25, + width: double.maxFinite, + fit: BoxFit.fitHeight, + ), + Text( + 'Capture an Image of Your car license back'.tr, + style: AppStyle.title, + ), + ], + ), + ), + ); + }, + ); +} diff --git a/siro_driver/lib/views/home/profile/complaint_page.dart b/siro_driver/lib/views/home/profile/complaint_page.dart new file mode 100644 index 0000000..31dcb71 --- /dev/null +++ b/siro_driver/lib/views/home/profile/complaint_page.dart @@ -0,0 +1,278 @@ +import 'dart:io'; + +import 'package:flutter/material.dart'; +import 'package:get/get.dart'; +import 'package:siro_driver/constant/style.dart'; +import 'package:siro_driver/controller/home/profile/complaint_controller.dart'; +import 'package:siro_driver/views/widgets/my_scafold.dart'; +import 'package:siro_driver/views/widgets/mycircular.dart'; +import 'package:siro_driver/views/widgets/mydialoug.dart'; +import 'package:siro_driver/views/widgets/elevated_btn.dart'; + +import '../../../constant/colors.dart'; +import '../../../controller/functions/audio_recorder_controller.dart'; + +class ComplaintPage extends StatelessWidget { + ComplaintPage({super.key}); + + final ComplaintController complaintController = + Get.put(ComplaintController()); + final AudioRecorderController audioRecorderController = + Get.put(AudioRecorderController()); + + @override + Widget build(BuildContext context) { + return MyScafolld( + title: 'Submit a Complaint'.tr, + isleading: true, + body: [ + GetBuilder( + builder: (controller) { + if (controller.isLoading && controller.ridesList.isEmpty) { + return const MyCircularProgressIndicator(); + } + return Stack( + children: [ + Form( + key: controller.formKey, + child: ListView( + padding: const EdgeInsets.all(16.0), + children: [ + // --- 1. Select Ride Section --- + _buildSectionCard( + title: '1. Select Ride'.tr, + child: controller.ridesList.isEmpty + ? Text('No rides found to complain about.'.tr, + style: AppStyle.subtitle) + : DropdownButtonFormField>( + value: controller.selectedRide, + dropdownColor: AppColor.surfaceColor, + items: controller.ridesList.map((ride) { + return DropdownMenuItem>( + value: ride, + child: Text( + '${'Ride'.tr} #${ride['id']} (${ride['date']})', + style: AppStyle.subtitle, + ), + ); + }).toList(), + onChanged: (ride) { + if (ride != null) { + controller.selectRide(ride); + } + }, + decoration: InputDecoration( + filled: true, + fillColor: + AppColor.secondaryColor.withOpacity(0.5), + border: OutlineInputBorder( + borderRadius: BorderRadius.circular(12), + borderSide: BorderSide.none, + ), + contentPadding: const EdgeInsets.symmetric( + horizontal: 16, vertical: 8), + ), + ), + ), + + // --- 2. Describe Your Issue Section --- + _buildSectionCard( + title: '2. Describe Your Issue'.tr, + child: TextFormField( + controller: controller.complaintController, + decoration: InputDecoration( + hintText: 'Enter your complaint here...'.tr, + filled: true, + fillColor: + AppColor.secondaryColor.withOpacity(0.5), + border: OutlineInputBorder( + borderRadius: BorderRadius.circular(12), + borderSide: BorderSide.none, + ), + contentPadding: const EdgeInsets.all(16), + ), + maxLines: 6, + style: AppStyle.subtitle, + validator: (value) { + if (value == null || value.isEmpty) { + return 'Please enter a description of the issue.' + .tr; + } + return null; + }, + ), + ), + + // --- 3. Attach Recorded Audio Section --- + if (controller.selectedRide != null) + _buildSectionCard( + title: '3. Attach Recorded Audio (Optional)'.tr, + child: FutureBuilder>( + future: audioRecorderController.getRecordedFiles(), + builder: (context, snapshot) { + if (snapshot.connectionState == + ConnectionState.waiting) { + return const Center( + child: CircularProgressIndicator()); + } + + final rideId = + controller.selectedRide!['id'].toString(); + // Filter files to only show the audio file associated with the selected Ride ID + final matchingFiles = snapshot.data + ?.where((path) => + path.endsWith('_${rideId}.m4a')) + .toList() ?? + []; + + if (snapshot.hasError || matchingFiles.isEmpty) { + return Center( + child: Padding( + padding: const EdgeInsets.symmetric( + vertical: 8.0), + child: Text( + 'No audio files found for this ride.'.tr, + style: AppStyle.subtitle), + ), + ); + } + + return Column( + children: matchingFiles.map((audioFilePath) { + final audioFile = File(audioFilePath); + final isUploaded = + controller.audioLink.isNotEmpty && + controller.attachedFileName == + audioFilePath.split('/').last; + + return ListTile( + leading: Icon( + isUploaded + ? Icons.check_circle + : Icons.mic, + color: isUploaded + ? AppColor.greenColor + : AppColor.redColor), + title: Text(audioFilePath.split('/').last, + style: AppStyle.subtitle, + overflow: TextOverflow.ellipsis), + subtitle: isUploaded + ? Text('Uploaded'.tr, + style: const TextStyle( + color: AppColor.greenColor)) + : null, + onTap: isUploaded + ? null + : () { + MyDialogContent().getDialog( + 'Confirm Attachment'.tr, + Text( + 'Attach this audio file?' + .tr), () async { + await controller + .uploadAudioFile(audioFile); + }); + }, + ); + }).toList(), + ); + }, + ), + ), + + // --- 4. Review Details & Response Section --- + if (controller.selectedRide != null) + _buildSectionCard( + title: '4. Review Details & Response'.tr, + child: Column( + children: [ + _buildDetailRow( + Icons.calendar_today_outlined, + 'Date'.tr, + controller.selectedRide!['date'] ?? ''), + _buildDetailRow( + Icons.monetization_on_outlined, + 'Price'.tr, + '${controller.selectedRide!['price'] ?? ''}'), + const Divider(height: 24), + ListTile( + leading: const Icon( + Icons.support_agent_outlined, + color: AppColor.primaryColor), + title: Text("Intaleq's Response".tr, + style: AppStyle.title), + subtitle: Text( + controller.driverReport?['body'] + ?.toString() ?? + 'Awaiting response...'.tr, + style: + AppStyle.subtitle.copyWith(height: 1.5), + ), + ), + ], + ), + ), + + // --- 5. Submit Button --- + const SizedBox(height: 24), + MyElevatedButton( + onPressed: () async { + await controller.submitComplaintToServer(); + }, + title: 'Submit Complaint'.tr, + ), + const SizedBox(height: 24), + ], + ), + ), + if (controller.isLoading) + Container( + color: Colors.black.withOpacity(0.5), + child: const MyCircularProgressIndicator(), + ), + ], + ); + }, + ), + ], + ); + } + + Widget _buildSectionCard({required String title, required Widget child}) { + return Card( + margin: const EdgeInsets.only(bottom: 20), + elevation: 4, + shadowColor: Colors.black.withOpacity(0.1), + shape: RoundedRectangleBorder(borderRadius: BorderRadius.circular(16)), + child: Padding( + padding: const EdgeInsets.all(16.0), + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Text(title, style: AppStyle.headTitle.copyWith(fontSize: 18)), + const SizedBox(height: 12), + child, + ], + ), + ), + ); + } + + Widget _buildDetailRow(IconData icon, String label, String value) { + return Padding( + padding: const EdgeInsets.symmetric(vertical: 4.0), + child: Row( + children: [ + Icon(icon, color: AppColor.writeColor.withOpacity(0.6), size: 20), + const SizedBox(width: 12), + Text('${label.tr}:', + style: AppStyle.subtitle + .copyWith(color: AppColor.writeColor.withOpacity(0.7))), + const Spacer(), + Text(value, + style: AppStyle.title.copyWith(fontWeight: FontWeight.bold)), + ], + ), + ); + } +} diff --git a/siro_driver/lib/views/home/profile/feed_back_page.dart b/siro_driver/lib/views/home/profile/feed_back_page.dart new file mode 100755 index 0000000..eab25e9 --- /dev/null +++ b/siro_driver/lib/views/home/profile/feed_back_page.dart @@ -0,0 +1,60 @@ +import 'package:flutter/material.dart'; +import 'package:get/get.dart'; +import 'package:siro_driver/controller/home/profile/feed_back_controller.dart'; +import 'package:siro_driver/views/widgets/my_scafold.dart'; +import 'package:siro_driver/views/widgets/mycircular.dart'; + +import '../../widgets/elevated_btn.dart'; + +class FeedBackPage extends StatelessWidget { + FeedBackPage({super.key}); + FeedBackController feedBackController = Get.put(FeedBackController()); + @override + Widget build(BuildContext context) { + return MyScafolld( + title: 'Feed Back'.tr, + body: [ + Padding( + padding: const EdgeInsets.all(26), + child: Form( + key: feedBackController.formKey, + child: Column( + children: [ + TextFormField( + controller: feedBackController.feedbackController, + decoration: InputDecoration( + border: const OutlineInputBorder(), + hintText: 'Enter your feedback here'.tr, + labelText: 'Feedback', + ), + validator: (value) { + if (value == null || value.isEmpty) { + return 'Please enter your feedback.'; + } + return null; + }, + ), + const SizedBox(height: 20), + feedBackController.isLoading + ? const MyCircularProgressIndicator() + : MyElevatedButton( + onPressed: () { + if (feedBackController.formKey.currentState! + .validate()) { + feedBackController.addFeedBack(); + + // Clear the feedback form + feedBackController.formKey.currentState!.reset(); + } + }, + title: 'Submit '.tr, + ), + ], + ), + ), + ), + ], + isleading: true, + ); + } +} diff --git a/siro_driver/lib/views/home/profile/passenger_profile_page.dart b/siro_driver/lib/views/home/profile/passenger_profile_page.dart new file mode 100755 index 0000000..ddd8aeb --- /dev/null +++ b/siro_driver/lib/views/home/profile/passenger_profile_page.dart @@ -0,0 +1,303 @@ +import 'package:flutter/cupertino.dart'; +import 'package:flutter/material.dart'; +import 'package:get/get.dart'; +import 'package:siro_driver/constant/box_name.dart'; +import 'package:siro_driver/constant/colors.dart'; +import 'package:siro_driver/constant/style.dart'; +import 'package:siro_driver/controller/profile/profile_controller.dart'; +import 'package:siro_driver/main.dart'; +import 'package:siro_driver/views/widgets/elevated_btn.dart'; +import 'package:siro_driver/views/widgets/my_scafold.dart'; +import 'package:siro_driver/views/widgets/my_textField.dart'; +import 'package:siro_driver/views/widgets/mycircular.dart'; + +import '../../../controller/functions/log_out.dart'; + +class PassengerProfilePage extends StatelessWidget { + PassengerProfilePage({super.key}); + LogOutController logOutController = Get.put(LogOutController()); + @override + Widget build(BuildContext context) { + Get.put(ProfileController()); + + return MyScafolld( + isleading: true, + title: 'My Profile'.tr, + body: [ + GetBuilder( + builder: (controller) => controller.isloading + ? const MyCircularProgressIndicator() + : Padding( + padding: const EdgeInsets.symmetric(horizontal: 15), + child: SizedBox( + height: Get.height, + child: SingleChildScrollView( + child: Column( + mainAxisAlignment: MainAxisAlignment.start, + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Text( + 'Edit Profile'.tr, + style: AppStyle.headTitle2, + ), + ListTile( + title: Text( + 'Name'.tr, + style: AppStyle.title, + ), + leading: const Icon( + Icons.person_pin_rounded, + size: 35, + ), + trailing: const Icon(Icons.arrow_forward_ios), + subtitle: Text( + '${controller.prfoileData['first_name']} ${controller.prfoileData['last_name']}'), + onTap: () { + controller.updatField( + 'first_name', TextInputType.name); + }, + ), + ListTile( + title: Text( + 'Gender'.tr, + style: AppStyle.title, + ), + leading: Image.asset( + 'assets/images/gender.png', + width: 35, + ), + trailing: const Icon(Icons.arrow_forward_ios), + subtitle: Text( + controller.prfoileData['gender'].toString()), + onTap: () { + Get.defaultDialog( + title: 'Update Gender'.tr, + content: Column( + children: [ + GenderPicker(), + MyElevatedButton( + title: 'Update'.tr, + onPressed: () { + controller.updateColumn({ + 'id': controller.prfoileData['id'] + .toString(), + 'gender': controller.gender, + }); + Get.back(); + }, + ) + ], + )); + // controller.updatField('gender'); + }, + ), + ListTile( + title: Text( + 'Education'.tr, + style: AppStyle.title, + ), + leading: Image.asset( + 'assets/images/education.png', + width: 35, + ), + trailing: const Icon(Icons.arrow_forward_ios), + subtitle: Text(controller.prfoileData['education'] + .toString()), + onTap: () { + Get.defaultDialog( + barrierDismissible: true, + title: 'Update Education'.tr, + content: SizedBox( + height: 200, + child: Column( + children: [ + EducationDegreePicker(), + ], + ), + ), + confirm: MyElevatedButton( + title: 'Update Education'.tr, + onPressed: () { + controller.updateColumn({ + 'id': controller.prfoileData['id'] + .toString(), + 'education': + controller.selectedDegree, + }); + Get.back(); + }, + )); + }, + ), + ListTile( + title: Text( + 'Employment Type'.tr, + style: AppStyle.title, + ), + leading: Image.asset( + 'assets/images/employmentType.png', + width: 35, + ), + trailing: const Icon(Icons.arrow_forward_ios), + subtitle: Text(controller + .prfoileData['employmentType'] + .toString()), + onTap: () { + controller.updatField( + 'employmentType', TextInputType.name); + }, + ), + ListTile( + title: Text( + 'Marital Status'.tr, + style: AppStyle.title, + ), + leading: Image.asset( + 'assets/images/maritalStatus.png', + width: 35, + ), + trailing: const Icon(Icons.arrow_forward_ios), + subtitle: Text(controller + .prfoileData['maritalStatus'] + .toString()), + onTap: () { + controller.updatField( + 'maritalStatus', TextInputType.name); + }, + ), + ListTile( + title: Text( + 'SOS Phone'.tr, + style: AppStyle.title, + ), + leading: const Icon( + Icons.sos, + color: AppColor.redColor, + size: 35, + ), + trailing: const Icon(Icons.arrow_forward_ios), + subtitle: Text(controller.prfoileData['sosPhone'] + .toString()), + onTap: () async { + await controller.updatField( + 'sosPhone', TextInputType.phone); + box.write(BoxName.sosPhonePassenger, + controller.prfoileData['sosPhone']); + }, + ), + // const Spacer(), + Row( + mainAxisAlignment: MainAxisAlignment.spaceAround, + children: [ + MyElevatedButton( + title: 'Sign Out'.tr, + onPressed: () { + LogOutController().logOutPassenger(); + }), + GetBuilder( + builder: (logOutController) { + return MyElevatedButton( + title: 'Delete My Account'.tr, + onPressed: () { + Get.defaultDialog( + title: + 'Are you sure to delete your account?' + .tr, + content: Form( + key: logOutController.formKey1, + child: MyTextForm( + controller: logOutController + .emailTextController, + label: 'Type your Email'.tr, + hint: 'Type your Email'.tr, + type: + TextInputType.emailAddress, + ), + ), + confirm: MyElevatedButton( + title: 'Delete My Account'.tr, + kolor: AppColor.redColor, + onPressed: () async { + await logOutController + .deletePassengerAccount(); + }), + cancel: MyElevatedButton( + title: 'No I want'.tr, + onPressed: () { + logOutController + .emailTextController + .clear(); + logOutController.update(); + Get.back(); + })); + }); + }), + ], + ), + ], + ), + ), + ), + )), + ], + ); + } +} + +class GenderPicker extends StatelessWidget { + final ProfileController controller = Get.put(ProfileController()); + + final List genderOptions = ['Male'.tr, 'Female'.tr, 'Other'.tr]; + + GenderPicker({super.key}); + + @override + Widget build(BuildContext context) { + return SizedBox( + height: 100, + child: CupertinoPicker( + itemExtent: 32.0, + onSelectedItemChanged: (int index) { + controller.setGender(genderOptions[index]); + }, + children: genderOptions.map((String value) { + return Text(value); + }).toList(), + ), + ); + } +} + +class EducationDegreePicker extends StatelessWidget { + final ProfileController controller = Get.put(ProfileController()); + + final List degreeOptions = [ + 'High School Diploma'.tr, + 'Associate Degree'.tr, + 'Bachelor\'s Degree'.tr, + 'Master\'s Degree'.tr, + 'Doctoral Degree'.tr, + ]; + + EducationDegreePicker({Key? key}) : super(key: key); + + @override + Widget build(BuildContext context) { + return SizedBox( + height: 200, + child: CupertinoPicker( + // backgroundColor: AppColor.accentColor, + // looping: true, + squeeze: 2, + // diameterRatio: 5, + itemExtent: 32, + onSelectedItemChanged: (int index) { + controller.setDegree(degreeOptions[index]); + }, + children: degreeOptions.map((String value) { + return Text(value); + }).toList(), + ), + ); + } +} diff --git a/siro_driver/lib/views/home/profile/profile_captain.dart b/siro_driver/lib/views/home/profile/profile_captain.dart new file mode 100755 index 0000000..55ae977 --- /dev/null +++ b/siro_driver/lib/views/home/profile/profile_captain.dart @@ -0,0 +1,586 @@ +import 'package:flutter/material.dart'; +import 'package:flutter/services.dart'; +import 'package:get/get.dart'; +import 'package:siro_driver/constant/box_name.dart'; +import 'package:siro_driver/controller/profile/captain_profile_controller.dart'; +import 'package:siro_driver/main.dart'; +import 'package:siro_driver/views/widgets/my_scafold.dart'; +import 'package:siro_driver/views/widgets/mycircular.dart'; +import '../../../constant/links.dart'; +import '../../../controller/functions/crud.dart'; +import 'behavior_page.dart'; +import 'complaint_page.dart'; + +// الصفحة الرئيسية الجديدة +class ProfileCaptain extends StatelessWidget { + const ProfileCaptain({super.key}); + + @override + Widget build(BuildContext context) { + // Get.put() يجب أن يكون في مكان يتم استدعاؤه مرة واحدة فقط، + // لكن سنبقيه هنا حسب الكود الأصلي + final controller = Get.put(CaptainProfileController()); + + return MyScafolld( + title: 'My Profile'.tr, + isleading: true, + body: [ + GetBuilder( + builder: (controller) { + if (controller.isLoading) { + return const Center(child: MyCircularProgressIndicator()); + } + if (controller.captainProfileData.isEmpty) { + return Center(child: Text('Failed to load profile data.'.tr)); + } + return SingleChildScrollView( + padding: + const EdgeInsets.symmetric(horizontal: 16.0, vertical: 20.0), + child: Column( + children: [ + // 1. رأس الصفحة: صورة واسم وتقييم + ProfileHeader( + name: + '${controller.captainProfileData['first_name'] ?? ''} ${controller.captainProfileData['last_name'] ?? ''}', + rating: + controller.captainProfileData['ratingDriver'] != null + ? double.tryParse(controller + .captainProfileData['ratingDriver'] + .toString()) ?? + 0.0 + : 0.0, + ratingCount: int.tryParse(controller + .captainProfileData['ratingCount'] + .toString()) ?? + 0, + ), + const SizedBox(height: 24), + + // 2. قسم الإجراءات السريعة + ActionsGrid(), + const SizedBox(height: 24), + + // 3. بطاقة المعلومات الشخصية + PersonalInfoCard( + data: controller.captainProfileData + .cast()), + const SizedBox(height: 16), + + // 4. بطاقة معلومات المركبة (قابلة للتوسيع) + VehicleInfoCard( + data: controller.captainProfileData + .cast()), + ], + ), + ); + }, + ), + ], + ); + } +} + +// --- الويدجتس الجديدة المنفصلة لتحسين التصميم --- + +/// 1. ويدجت رأس الصفحة +class ProfileHeader extends StatelessWidget { + final String name; + final double rating; + final int ratingCount; + + const ProfileHeader({ + super.key, + required this.name, + required this.rating, + required this.ratingCount, + }); + + @override + Widget build(BuildContext context) { + final theme = Theme.of(context); + return Column( + children: [ + CircleAvatar( + radius: 50, + backgroundColor: theme.primaryColor.withOpacity(0.1), + child: Icon(Icons.person, size: 60, color: theme.primaryColor), + ), + const SizedBox(height: 12), + Text( + name, + style: theme.textTheme.headlineSmall + ?.copyWith(fontWeight: FontWeight.bold), + ), + const SizedBox(height: 8), + Row( + mainAxisAlignment: MainAxisAlignment.center, + children: [ + const Icon(Icons.star, color: Colors.amber, size: 20), + const SizedBox(width: 4), + Text( + '${rating.toStringAsFixed(1)} (${'reviews'.tr} $ratingCount)', + style: + theme.textTheme.titleMedium?.copyWith(color: theme.hintColor), + ), + ], + ), + ], + ); + } +} + +/// 2. ويدجت شبكة الأزرار +class ActionsGrid extends StatelessWidget { + const ActionsGrid({super.key}); + + @override + Widget build(BuildContext context) { + return GridView.count( + crossAxisCount: 2, + shrinkWrap: true, + physics: const NeverScrollableScrollPhysics(), + crossAxisSpacing: 16, + mainAxisSpacing: 16, + childAspectRatio: 2.5, // للتحكم في ارتفاع الأزرار + children: [ + // _ActionTile( + // title: 'My Cars'.tr, + // icon: Icons.directions_car_filled, + // onTap: () => Get.to(() => CaptainsCars()), + // ), + // _ActionTile( + // title: 'Criminal Record'.tr, + // icon: Icons.description, + // onTap: () => Get.to(() => CriminalDocumemtPage()), + // ), + _ActionTile( + title: 'ShamCash Account'.tr, // غيرت الاسم ليكون أوضح + icon: Icons.account_balance_wallet_rounded, // أيقونة محفظة + // trailing: Icon(Icons.arrow_forward_ios, + // size: 16, color: Colors.grey), // سهم صغير للجمالية + onTap: () { + // استدعاء دالة فتح النافذة + showShamCashInput(); + }, + ), + _ActionTile( + title: 'Behavior Page'.tr, + icon: Icons.checklist_rtl, + onTap: () => Get.to(() => BehaviorPage()), + ), + _ActionTile( + title: 'Submit a Complaint'.tr, + icon: Icons.note_add_rounded, + onTap: () => Get.to(() => ComplaintPage()), + ), + ], + ); + } +} + +void showShamCashInput() { + // 1. القراءة من الذاكرة المحلية (GetStorage) عند فتح النافذة + // إذا لم يتم العثور على قيمة، يتم تعيينها إلى نص فارغ + final String existingName = box.read('shamcash_name') ?? ''; + final String existingCode = box.read('shamcash_code') ?? ''; + + // تعريف أدوات التحكم للحقلين مع تحميل القيمة المحفوظة + final TextEditingController nameController = + TextEditingController(text: existingName); + final TextEditingController codeController = + TextEditingController(text: existingCode); + + Get.bottomSheet( + Builder(builder: (context) { + final theme = Theme.of(context); + return Container( + padding: const EdgeInsets.all(25), + decoration: BoxDecoration( + color: theme.cardColor, + borderRadius: const BorderRadius.vertical(top: Radius.circular(30)), + boxShadow: [ + BoxShadow( + color: theme.shadowColor.withOpacity(0.2), + blurRadius: 10, + offset: const Offset(0, -2)) + ], + ), + child: SingleChildScrollView( + child: Column( + mainAxisSize: MainAxisSize.min, + crossAxisAlignment: CrossAxisAlignment.stretch, + children: [ + // --- 1. المقبض العلوي --- + Center( + child: Container( + height: 5, + width: 50, + decoration: BoxDecoration( + color: theme.dividerColor, + borderRadius: BorderRadius.circular(10)), + margin: const EdgeInsets.only(bottom: 20), + ), + ), + + // --- 2. العنوان والأيقونة --- + Image.asset( + 'assets/images/shamCash.png', + height: 50, + ), + // const Icon(Icons.account_balance_wallet_rounded, + // size: 45, color: Colors.blueAccent), + const SizedBox(height: 10), + Text( + "ربط حساب شام كاش 🔗", + textAlign: TextAlign.center, + style: TextStyle( + fontSize: 20, + fontWeight: FontWeight.bold, + color: Colors.blueGrey[900]), + ), + const SizedBox(height: 5), + const Text( + "أدخل بيانات حسابك لاستقبال الأرباح فوراً", + textAlign: TextAlign.center, + style: TextStyle(fontSize: 13, color: Colors.grey), + ), + const SizedBox(height: 25), + + // --- 3. الحقل الأول: اسم الحساب (أعلى الباركود) --- + const Text("1. اسم الحساب (أعلى الباركود)", + style: TextStyle(fontWeight: FontWeight.bold, fontSize: 14)), + const SizedBox(height: 8), + Container( + decoration: BoxDecoration( + color: Colors.grey[50], + borderRadius: BorderRadius.circular(12), + border: Border.all(color: Colors.grey[300]!), + ), + child: TextField( + controller: nameController, + decoration: InputDecoration( + hintText: "مثال: intaleq", + hintStyle: TextStyle(color: Colors.grey[400], fontSize: 13), + border: InputBorder.none, + prefixIcon: const Icon(Icons.person_outline_rounded, + color: Colors.blueGrey), + contentPadding: const EdgeInsets.symmetric( + vertical: 15, horizontal: 10), + ), + ), + ), + + const SizedBox(height: 15), + + // --- 4. الحقل الثاني: الكود (أسفل الباركود) --- + const Text("2. كود المحفظة (أسفل الباركود)", + style: TextStyle(fontWeight: FontWeight.bold, fontSize: 14)), + const SizedBox(height: 8), + Container( + decoration: BoxDecoration( + color: Colors.grey[50], + borderRadius: BorderRadius.circular(12), + border: Border.all(color: Colors.grey[300]!), + ), + child: TextField( + controller: codeController, + style: const TextStyle( + fontSize: 13, + letterSpacing: 0.5), // خط أصغر قليلاً للكود الطويل + decoration: InputDecoration( + hintText: "مثال: 80f23afe40...", + hintStyle: TextStyle(color: Colors.grey[400], fontSize: 13), + border: InputBorder.none, + prefixIcon: const Icon(Icons.qr_code_2_rounded, + color: Colors.blueGrey), + contentPadding: const EdgeInsets.symmetric( + vertical: 15, horizontal: 10), + + // زر لصق الكود + suffixIcon: IconButton( + icon: const Icon(Icons.paste_rounded, color: Colors.blue), + tooltip: "لصق الكود", + onPressed: () async { + ClipboardData? data = + await Clipboard.getData(Clipboard.kTextPlain); + if (data != null && data.text != null) { + codeController.text = data.text!; + // تحريك المؤشر للنهاية بعد اللصق + codeController.selection = TextSelection.fromPosition( + TextPosition(offset: codeController.text.length), + ); + } + }, + ), + ), + ), + ), + + const SizedBox(height: 30), + + // --- 5. زر الحفظ --- + SizedBox( + height: 50, + child: ElevatedButton( + onPressed: () async { + String name = nameController.text.trim(); + String code = codeController.text.trim(); + + // التحقق من صحة البيانات + if (name.isNotEmpty && code.length > 5) { + // 1. إرسال البيانات إلى السيرفر + var res = await CRUD() + .post(link: AppLink.updateShamCashDriver, payload: { + "id": box.read(BoxName.driverID), + "accountBank": name, + "bankCode": code, + }); + + if (res != 'failure') { + // 2. 🔴 الحفظ في الذاكرة المحلية (GetStorage) بعد نجاح التحديث + box.write('shamcash_name', name); + box.write('shamcash_code', code); + + Get.back(); // إغلاق النافذة + Get.snackbar( + "تم الحفظ بنجاح", + "تم ربط حساب ($name) لاستلام الأرباح.", + backgroundColor: Colors.green, + colorText: Colors.white, + snackPosition: SnackPosition.BOTTOM, + margin: const EdgeInsets.all(20), + icon: const Icon(Icons.check_circle_outline, + color: Colors.white), + ); + return; + } else { + // في حال فشل الإرسال إلى السيرفر + Get.snackbar( + "خطأ في السيرفر", + "فشل تحديث البيانات، يرجى المحاولة لاحقاً.", + backgroundColor: Colors.redAccent, + colorText: Colors.white, + snackPosition: SnackPosition.BOTTOM, + margin: const EdgeInsets.all(20), + ); + } + } else { + Get.snackbar( + "بيانات ناقصة", + "يرجى التأكد من إدخال الاسم والكود بشكل صحيح.", + backgroundColor: Colors.orange, + colorText: Colors.white, + snackPosition: SnackPosition.BOTTOM, + margin: const EdgeInsets.all(20), + ); + } + }, + style: ElevatedButton.styleFrom( + backgroundColor: const Color(0xFF2ecc71), // الأخضر المالي + shape: RoundedRectangleBorder( + borderRadius: BorderRadius.circular(12)), + elevation: 2, + ), + child: const Text( + "حفظ وتفعيل الحساب", + style: TextStyle( + fontSize: 16, + fontWeight: FontWeight.bold, + color: Colors.white), + ), + ), + ), + const SizedBox(height: 10), // مسافة سفلية إضافية للأمان + ], + ), + ), + ); + }), + isScrollControlled: true, + ); +} + +/// ويدجت داخلية لزر في الشبكة +class _ActionTile extends StatelessWidget { + final String title; + final IconData icon; + final VoidCallback onTap; + + const _ActionTile( + {required this.title, required this.icon, required this.onTap}); + + @override + Widget build(BuildContext context) { + final theme = Theme.of(context); + return Material( + color: theme.colorScheme.surfaceVariant.withOpacity(0.5), + borderRadius: BorderRadius.circular(12), + child: InkWell( + onTap: onTap, + borderRadius: BorderRadius.circular(12), + child: Padding( + padding: const EdgeInsets.all(8.0), + child: Row( + mainAxisAlignment: MainAxisAlignment.center, + children: [ + Icon(icon, color: theme.primaryColor, size: 20), + const SizedBox(width: 8), + Flexible( + child: Text( + title, + style: theme.textTheme.labelLarge, + textAlign: TextAlign.center, + )), + ], + ), + ), + ), + ); + } +} + +/// 3. بطاقة المعلومات الشخصية +class PersonalInfoCard extends StatelessWidget { + final Map data; + PersonalInfoCard({super.key, required this.data}); + final controller = Get.find(); + @override + Widget build(BuildContext context) { + return Card( + elevation: 2, + shape: RoundedRectangleBorder(borderRadius: BorderRadius.circular(12)), + child: Padding( + padding: const EdgeInsets.all(16.0), + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Text('Personal Information'.tr, style: Get.textTheme.titleLarge), + const Divider(height: 24), + _InfoRow( + icon: Icons.phone, + label: 'Phone Number'.tr, + value: data['phone'] ?? ''), + if (data['email'] != null && + data['email'].toString().contains('intaleqapp')) ...[ + TextFormField( + controller: controller.emailController, + keyboardType: + TextInputType.emailAddress, // ✅ لوحة مفاتيح خاصة بالإيميل + decoration: InputDecoration( + border: OutlineInputBorder(), + labelText: 'Email'.tr, + hintText: 'Enter your email'.tr, + prefixIcon: Icon(Icons.email), + ), + autofillHints: [ + AutofillHints.email + ], // اختياري لتحسين تجربة المستخدم + ), + const SizedBox(height: 10), + ElevatedButton( + onPressed: () async { + await controller.updateEmail(); + }, + child: Text('Update'.tr), + ), + ] else + _InfoRow( + icon: Icons.email, + label: 'Email'.tr, + value: data['email'] ?? '', + ), + _InfoRow( + icon: Icons.cake, + label: 'Age'.tr, + value: data['age']?.toString() ?? 'N/A'), + _InfoRow( + icon: Icons.wc, + label: 'Gender'.tr, + value: data['gender'] ?? 'N/A'), + ], + ), + ), + ); + } +} + +/// 4. بطاقة معلومات المركبة +class VehicleInfoCard extends StatelessWidget { + final Map data; + const VehicleInfoCard({super.key, required this.data}); + + @override + Widget build(BuildContext context) { + return Card( + elevation: 2, + shape: RoundedRectangleBorder(borderRadius: BorderRadius.circular(12)), + child: ExpansionTile( + title: Text('Vehicle Details'.tr, style: Get.textTheme.titleLarge), + leading: Icon(Icons.directions_car, color: Get.theme.primaryColor), + childrenPadding: + const EdgeInsets.symmetric(horizontal: 16.0, vertical: 8.0), + children: [ + _InfoRow( + icon: Icons.branding_watermark, + label: 'Make'.tr, + value: data['make'] ?? ''), + _InfoRow( + icon: Icons.category, + label: 'Model'.tr, + value: data['model'] ?? ''), + _InfoRow( + icon: Icons.palette, + label: 'Color'.tr, + value: data['color'] ?? ''), + _InfoRow( + icon: Icons.pin, + label: 'Plate Number'.tr, + value: data['car_plate'] ?? ''), + _InfoRow( + icon: Icons.confirmation_number, + label: 'VIN'.tr, + value: data['vin'] ?? ''), + _InfoRow( + icon: Icons.event, + label: 'Expiration Date'.tr, + value: data['expiration_date'] ?? ''), + ], + ), + ); + } +} + +/// ويدجت لعرض سطر معلومة (أيقونة + عنوان + قيمة) لتجنب التكرار +class _InfoRow extends StatelessWidget { + final IconData icon; + final String label; + final String value; + + const _InfoRow( + {required this.icon, required this.label, required this.value}); + + @override + Widget build(BuildContext context) { + final theme = Theme.of(context); + return Padding( + padding: const EdgeInsets.symmetric(vertical: 8.0), + child: Row( + children: [ + Icon(icon, color: theme.hintColor.withOpacity(0.6), size: 20), + const SizedBox(width: 16), + Text(label, style: theme.textTheme.bodyLarge), + const Spacer(), + Flexible( + child: Text( + value, + style: theme.textTheme.bodyLarge?.copyWith( + color: theme.textTheme.bodyLarge?.color?.withOpacity(0.8), + fontWeight: FontWeight.w500), + textAlign: TextAlign.end, + ), + ), + ], + ), + ); + } +} diff --git a/siro_driver/lib/views/home/profile/promos_passenger_page.dart b/siro_driver/lib/views/home/profile/promos_passenger_page.dart new file mode 100755 index 0000000..a163cc6 --- /dev/null +++ b/siro_driver/lib/views/home/profile/promos_passenger_page.dart @@ -0,0 +1,146 @@ +import 'package:animated_text_kit/animated_text_kit.dart'; +import 'package:flutter/material.dart'; +import 'package:get/get.dart'; +import 'package:siro_driver/controller/home/profile/promos_controller.dart'; +import 'package:siro_driver/views/widgets/my_scafold.dart'; + +import '../../../constant/colors.dart'; +import '../../../constant/style.dart'; +import '../../widgets/mycircular.dart'; + +class PromosPassengerPage extends StatelessWidget { + const PromosPassengerPage({super.key}); + + @override + Widget build(BuildContext context) { + Get.put(PromosController()); + return MyScafolld( + title: 'Promos For today'.tr, + isleading: true, + body: [ + GetBuilder( + builder: (orderHistoryController) => orderHistoryController.isLoading + ? const MyCircularProgressIndicator() + : ListView.builder( + itemCount: orderHistoryController.promoList.length, + itemBuilder: (BuildContext context, int index) { + final rides = orderHistoryController.promoList[index]; + return Padding( + padding: const EdgeInsets.symmetric( + horizontal: 16, vertical: 8), + child: Card( + elevation: 4, + shadowColor: + Theme.of(context).shadowColor.withOpacity(0.1), + shape: RoundedRectangleBorder( + borderRadius: BorderRadius.circular(16)), + child: Padding( + padding: const EdgeInsets.all(16.0), + child: Column( + crossAxisAlignment: CrossAxisAlignment.stretch, + children: [ + Row( + mainAxisAlignment: + MainAxisAlignment.spaceBetween, + children: [ + Expanded( + child: Column( + crossAxisAlignment: + CrossAxisAlignment.start, + children: [ + SizedBox( + height: 30, + child: AnimatedTextKit( + animatedTexts: [ + ScaleAnimatedText( + rides['promo_code'], + textStyle: Theme.of(context) + .textTheme + .titleLarge + ?.copyWith( + color: AppColor + .primaryColor, + fontWeight: + FontWeight.bold, + )), + WavyAnimatedText( + rides['promo_code'], + textStyle: Theme.of(context) + .textTheme + .titleLarge + ?.copyWith( + color: AppColor + .primaryColor, + fontWeight: + FontWeight.bold, + )), + ], + repeatForever: true, + ), + ), + const SizedBox(height: 8), + Text( + rides['description'], + style: Theme.of(context) + .textTheme + .bodyMedium, + ), + ], + ), + ), + Column( + crossAxisAlignment: CrossAxisAlignment.end, + children: [ + _buildDateBadge(context, + rides['validity_start_date'], true), + const SizedBox(height: 4), + _buildDateBadge(context, + rides['validity_end_date'], false), + ], + ), + ], + ), + const Divider(height: 24), + Text( + 'Copy this Promo to use it in your Ride!'.tr, + textAlign: TextAlign.center, + style: Theme.of(context) + .textTheme + .labelMedium + ?.copyWith( + color: Theme.of(context).hintColor, + fontStyle: FontStyle.italic, + ), + ) + ], + ), + ), + ), + ); + }, + ), + ) + ], + ); + } + + Widget _buildDateBadge(BuildContext context, String date, bool isStart) { + return Container( + padding: const EdgeInsets.symmetric(horizontal: 8, vertical: 4), + decoration: BoxDecoration( + color: isStart + ? Colors.green.withOpacity(0.1) + : Colors.red.withOpacity(0.1), + borderRadius: BorderRadius.circular(6), + ), + child: Text( + date, + style: TextStyle( + fontSize: 11, + fontWeight: FontWeight.bold, + color: isStart ? Colors.green : Colors.red, + ), + ), + ); + } +} diff --git a/siro_driver/lib/views/home/profile/taarif_page.dart b/siro_driver/lib/views/home/profile/taarif_page.dart new file mode 100755 index 0000000..d479a42 --- /dev/null +++ b/siro_driver/lib/views/home/profile/taarif_page.dart @@ -0,0 +1,95 @@ +import 'package:siro_driver/constant/box_name.dart'; +import 'package:siro_driver/main.dart'; +import 'package:flutter/material.dart'; +import 'package:get/get.dart'; +import 'package:siro_driver/constant/style.dart'; +import 'package:siro_driver/views/widgets/my_scafold.dart'; + +import '../../../constant/colors.dart'; + +class TaarifPage extends StatelessWidget { + const TaarifPage({super.key}); + + @override + Widget build(BuildContext context) { + return MyScafolld(isleading: true, title: 'Tariffs'.tr, body: [ + Padding( + padding: const EdgeInsets.symmetric(horizontal: 4), + child: ListView( + // mainAxisAlignment: MainAxisAlignment.start, + // crossAxisAlignment: CrossAxisAlignment.stretch, + clipBehavior: Clip.hardEdge, + children: [ + _buildTariffItem( + context, + 'Minimum fare'.tr, + box.read(BoxName.countryCode) == 'Jordan' + ? '1 ${'JOD'.tr}' + : '20 ${'LE'.tr}'), + _buildTariffItem( + context, + 'Maximum fare'.tr, + box.read(BoxName.countryCode) == 'Jordan' + ? '200 ${'JOD'.tr}' + : '15000 ${'LE'.tr}'), + _buildTariffItem( + context, + 'Flag-down fee'.tr, + box.read(BoxName.countryCode) == 'Jordan' + ? '0.47 ${'JOD'.tr}' + : '15 ${'LE'.tr}'), + _buildTariffItem( + context, + 'Rate'.tr, + box.read(BoxName.countryCode) == 'Jordan' + ? '0.05 ${'JOD'.tr}/min and 0.21 ${'JOD'.tr}/km' + : '1 ${'LE'.tr}/min and 4 ${'LE'.tr}/km'), + Padding( + padding: const EdgeInsets.symmetric(vertical: 8.0), + child: Text('Including Tax'.tr, + style: AppStyle.subtitle + .copyWith(color: Theme.of(context).hintColor)), + ), + const SizedBox(height: 10), + Text('BookingFee'.tr, style: AppStyle.headTitle2), + const SizedBox(height: 10), + Text('10%', style: AppStyle.title), + const SizedBox(height: 20), + Text('Morning'.tr, style: AppStyle.headTitle2), + const SizedBox(height: 10), + Text( + 'from 07:30 till 10:30 (Thursday, Friday, Saturday, Monday)'.tr, + style: AppStyle.title), + const SizedBox(height: 20), + Text('Evening'.tr, style: AppStyle.headTitle2), + const SizedBox(height: 10), + Text( + 'from 12:00 till 15:00 (Thursday, Friday, Saturday, Monday)'.tr, + style: AppStyle.title), + const SizedBox(height: 20), + Text('Night'.tr, style: AppStyle.headTitle2), + const SizedBox(height: 10), + Text('from 23:59 till 05:30'.tr, style: AppStyle.title), + ], + ), + ), + ]); + } + + Widget _buildTariffItem(BuildContext context, String label, String value) { + return Padding( + padding: const EdgeInsets.symmetric(vertical: 12.0), + child: Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + Expanded( + child: Text(label, style: AppStyle.title), + ), + Text(value, + style: AppStyle.title.copyWith( + fontWeight: FontWeight.bold, color: AppColor.primaryColor)), + ], + ), + ); + } +} diff --git a/siro_driver/lib/views/home/statistics/statistics_dashboard.dart b/siro_driver/lib/views/home/statistics/statistics_dashboard.dart new file mode 100644 index 0000000..a50a88b --- /dev/null +++ b/siro_driver/lib/views/home/statistics/statistics_dashboard.dart @@ -0,0 +1,519 @@ +import 'package:flutter/material.dart'; +import 'package:get/get.dart'; +import 'package:siro_driver/constant/finance_design_system.dart'; +import 'package:siro_driver/controller/gamification/gamification_controller.dart'; +import 'package:siro_driver/controller/home/statistics/statistics_controller.dart'; + +import 'widgets/stat_summary_card.dart'; +import 'widgets/daily_goal_widget.dart'; +import 'widgets/level_progress_widget.dart'; +import 'widgets/today_chart_widget.dart'; +import 'widgets/weekly_chart_widget.dart'; +import 'widgets/monthly_chart_widget.dart'; + +class StatisticsDashboard extends StatelessWidget { + StatisticsDashboard({super.key}); + + final GamificationController gamController = + Get.put(GamificationController()); + final StatisticsController statsController = Get.put(StatisticsController()); + + @override + Widget build(BuildContext context) { + return Scaffold( + backgroundColor: FinanceDesignSystem.backgroundColor, + body: GetBuilder( + builder: (gc) { + return GetBuilder( + builder: (sc) { + if (gc.isLoading || sc.isLoading) { + return Center( + child: CircularProgressIndicator( + color: FinanceDesignSystem.primaryDark), + ); + } + + return CustomScrollView( + physics: const BouncingScrollPhysics(), + slivers: [ + // ═══════ App Bar ═══════ + SliverAppBar( + expandedHeight: 200, + pinned: true, + stretch: true, + backgroundColor: Get.isDarkMode + ? FinanceDesignSystem.primaryDark + : const Color(0xFF0A0E21), + leading: IconButton( + icon: const Icon(Icons.arrow_back_ios_new_rounded, + color: Colors.white, size: 20), + onPressed: () => Get.back(), + ), + actions: [ + IconButton( + icon: const Icon(Icons.refresh_rounded, + color: Colors.white), + onPressed: () => gc.fetchGamificationData(), + ), + ], + flexibleSpace: FlexibleSpaceBar( + centerTitle: true, + title: Text( + 'Statistics'.tr, + style: const TextStyle( + color: Colors.white, + fontWeight: FontWeight.bold, + fontSize: 18, + ), + ), + background: Stack( + fit: StackFit.expand, + children: [ + Container( + decoration: BoxDecoration( + gradient: FinanceDesignSystem.balanceGradient, + ), + ), + // أيقونة زخرفية + Positioned( + right: -40, + top: -20, + child: Icon( + Icons.bar_chart_rounded, + size: 200, + color: Colors.white.withOpacity(0.04), + ), + ), + Positioned( + left: -30, + bottom: 20, + child: Icon( + Icons.emoji_events_rounded, + size: 120, + color: Colors.white.withOpacity(0.03), + ), + ), + // بطاقة المستوى في الهيدر + Center( + child: Column( + mainAxisAlignment: MainAxisAlignment.center, + children: [ + const SizedBox(height: 40), + Text( + gc.currentLevel.emoji, + style: const TextStyle(fontSize: 40), + ), + const SizedBox(height: 4), + Text( + Get.locale?.languageCode == 'ar' + ? gc.currentLevel.nameAr + : gc.currentLevel.nameEn, + style: TextStyle( + color: Colors.white.withOpacity(0.9), + fontSize: 16, + fontWeight: FontWeight.w600, + ), + ), + const SizedBox(height: 2), + Text( + '${gc.unlockedCount}/${gc.totalAchievements} ${'Achievements'.tr}', + style: TextStyle( + color: Colors.white.withOpacity(0.5), + fontSize: 12, + ), + ), + ], + ), + ), + ], + ), + ), + ), + + // ═══════ المحتوى ═══════ + SliverPadding( + padding: const EdgeInsets.fromLTRB(16, 24, 16, 40), + sliver: SliverList( + delegate: SliverChildListDelegate([ + // 1. بطاقات الإحصائيات الأربعة + _buildSummaryCards(gc), + const SizedBox( + height: FinanceDesignSystem.verticalSectionPadding), + + // 2. الهدف اليومي + DailyGoalWidget(controller: gc), + const SizedBox( + height: FinanceDesignSystem.verticalSectionPadding), + + // 3. تقدم المستوى + LevelProgressWidget(controller: gc), + const SizedBox( + height: FinanceDesignSystem.verticalSectionPadding), + + // 4. إحصائيات اليوم + TodayChartWidget(), + const SizedBox( + height: FinanceDesignSystem.verticalSectionPadding), + + // 5. الرسم البياني الأسبوعي + const WeeklyChartWidget(), + const SizedBox( + height: FinanceDesignSystem.verticalSectionPadding), + + // 6. التقرير الشهري + const MonthlyChartWidget(), + const SizedBox( + height: FinanceDesignSystem.verticalSectionPadding), + + // 7. تقييم سلوك القيادة + _buildBehaviorSection(gc), + const SizedBox( + height: FinanceDesignSystem.verticalSectionPadding), + + // 8. الإنجازات + _buildAchievementsSection(gc), + ]), + ), + ), + ], + ); + }, + ); + }, + ), + ); + } + + // ═══════ بطاقات الإحصائيات ═══════ + Widget _buildSummaryCards(GamificationController gc) { + return GridView.count( + crossAxisCount: 2, + shrinkWrap: true, + physics: const NeverScrollableScrollPhysics(), + crossAxisSpacing: 12, + mainAxisSpacing: 12, + childAspectRatio: 1.5, + children: [ + StatSummaryCard( + icon: Icons.local_taxi_rounded, + label: 'Total Trips'.tr, + value: gc.totalTrips.toString(), + color: FinanceDesignSystem.accentBlue, + ), + StatSummaryCard( + icon: Icons.star_rounded, + label: 'Rating'.tr, + value: gc.averageRating.toStringAsFixed(1), + color: const Color(0xFFFFD700), + ), + StatSummaryCard( + icon: Icons.whatshot_rounded, + label: 'Day Streak'.tr, + value: '${gc.consecutiveDays}', + color: const Color(0xFFFF5722), + ), + StatSummaryCard( + icon: Icons.people_rounded, + label: 'Referrals'.tr, + value: gc.totalReferrals.toString(), + color: const Color(0xFF9C27B0), + ), + ], + ); + } + + // ═══════ قسم تقييم السلوك ═══════ + Widget _buildBehaviorSection(GamificationController gc) { + bool isExcellent = gc.behaviorScore >= 90; + bool isGood = gc.behaviorScore >= 75 && gc.behaviorScore < 90; + + Color statusColor = isExcellent + ? Colors.green + : isGood + ? Colors.orange + : Colors.red; + + String statusText = isExcellent + ? 'Excellent'.tr + : isGood + ? 'Good'.tr + : 'Needs Improvement'.tr; + + return Container( + padding: const EdgeInsets.all(20), + decoration: BoxDecoration( + color: FinanceDesignSystem.cardColor, + borderRadius: BorderRadius.circular(24), + boxShadow: const [ + BoxShadow(color: Colors.black12, blurRadius: 10, offset: Offset(0, 4)) + ], + ), + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + Row( + children: [ + Icon(Icons.shield_rounded, + color: FinanceDesignSystem.accentBlue), + const SizedBox(width: 8), + Text('Driving Behavior'.tr, + style: FinanceDesignSystem.headingStyle), + ], + ), + Container( + padding: + const EdgeInsets.symmetric(horizontal: 10, vertical: 4), + decoration: BoxDecoration( + color: statusColor.withOpacity(0.1), + borderRadius: BorderRadius.circular(20), + ), + child: Text( + statusText, + style: TextStyle( + color: statusColor, + fontWeight: FontWeight.bold, + fontSize: 12, + ), + ), + ), + ], + ), + const SizedBox(height: 20), + Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + _behaviorStatItem( + title: 'Score'.tr, + value: '${gc.behaviorScore}%', + icon: Icons.speed_rounded, + color: FinanceDesignSystem.accentBlue, + ), + _behaviorStatItem( + title: 'Max Speed'.tr, + value: '${gc.maxSpeed.toStringAsFixed(0)} km/h', + icon: Icons.directions_car_rounded, + color: Colors.orange, + ), + _behaviorStatItem( + title: 'Hard Brakes'.tr, + value: '${gc.hardBrakes}', + icon: Icons.warning_rounded, + color: Colors.red, + ), + ], + ), + const SizedBox(height: 16), + ClipRRect( + borderRadius: BorderRadius.circular(8), + child: LinearProgressIndicator( + value: gc.behaviorScore / 100, + backgroundColor: FinanceDesignSystem.backgroundColor, + valueColor: AlwaysStoppedAnimation(statusColor), + minHeight: 8, + ), + ), + ], + ), + ); + } + + Widget _behaviorStatItem( + {required String title, + required String value, + required IconData icon, + required Color color}) { + return Column( + children: [ + Container( + padding: const EdgeInsets.all(10), + decoration: BoxDecoration( + color: color.withOpacity(0.1), + shape: BoxShape.circle, + ), + child: Icon(icon, color: color, size: 24), + ), + const SizedBox(height: 8), + Text(value, + style: TextStyle( + fontWeight: FontWeight.bold, + fontSize: 16, + color: FinanceDesignSystem.primaryDark)), + Text(title, + style: TextStyle( + fontSize: 12, color: FinanceDesignSystem.textSecondary)), + ], + ); + } + + // ═══════ قسم الإنجازات ═══════ + Widget _buildAchievementsSection(GamificationController gc) { + final unlockedAch = gc.achievements.where((a) => a.isUnlocked).toList(); + final lockedAch = gc.achievements.where((a) => !a.isUnlocked).toList(); + + return Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + Text('Achievements'.tr, style: FinanceDesignSystem.headingStyle), + Container( + padding: const EdgeInsets.symmetric(horizontal: 10, vertical: 4), + decoration: BoxDecoration( + color: FinanceDesignSystem.accentBlue.withOpacity(0.1), + borderRadius: BorderRadius.circular(20), + ), + child: Text( + '${gc.unlockedCount}/${gc.totalAchievements}', + style: TextStyle( + color: FinanceDesignSystem.accentBlue, + fontWeight: FontWeight.bold, + fontSize: 12, + ), + ), + ), + ], + ), + const SizedBox(height: 16), + + // الإنجازات المفتوحة + if (unlockedAch.isNotEmpty) ...[ + ...unlockedAch.map((a) => _buildAchievementCard(a, true)), + const SizedBox(height: 16), + ], + + // الإنجازات المقفلة + ...lockedAch.map((a) => _buildAchievementCard(a, false)), + ], + ); + } + + Widget _buildAchievementCard(Achievement ach, bool unlocked) { + final isAr = Get.locale?.languageCode == 'ar'; + return Container( + margin: const EdgeInsets.only(bottom: 12), + padding: const EdgeInsets.all(16), + decoration: BoxDecoration( + color: unlocked ? Colors.white : Colors.grey.shade50, + borderRadius: BorderRadius.circular(FinanceDesignSystem.cardRadius), + border: unlocked + ? Border.all(color: ach.color.withOpacity(0.3), width: 1.5) + : null, + boxShadow: unlocked + ? [ + BoxShadow( + color: ach.color.withOpacity(0.1), + blurRadius: 10, + offset: const Offset(0, 4), + ), + ] + : null, + ), + child: Row( + children: [ + // أيقونة الإنجاز + Container( + width: 50, + height: 50, + decoration: BoxDecoration( + color: + unlocked ? ach.color.withOpacity(0.15) : Colors.grey.shade200, + borderRadius: BorderRadius.circular(14), + ), + child: Icon( + ach.icon, + color: unlocked ? ach.color : Colors.grey.shade400, + size: 26, + ), + ), + const SizedBox(width: 14), + + // المعلومات + Expanded( + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Text( + isAr ? ach.titleAr : ach.titleEn, + style: TextStyle( + fontWeight: FontWeight.bold, + fontSize: 14, + color: unlocked + ? FinanceDesignSystem.primaryDark + : Colors.grey.shade500, + ), + ), + const SizedBox(height: 2), + Text( + isAr ? ach.descriptionAr : ach.descriptionEn, + style: TextStyle( + fontSize: 11, + color: Colors.grey.shade500, + ), + ), + if (!unlocked) ...[ + const SizedBox(height: 8), + // شريط التقدم + Stack( + children: [ + Container( + height: 6, + decoration: BoxDecoration( + color: Colors.grey.shade200, + borderRadius: BorderRadius.circular(3), + ), + ), + FractionallySizedBox( + widthFactor: ach.progress, + child: Container( + height: 6, + decoration: BoxDecoration( + color: ach.color.withOpacity(0.6), + borderRadius: BorderRadius.circular(3), + ), + ), + ), + ], + ), + const SizedBox(height: 4), + Text( + '${ach.currentProgress}/${ach.target}', + style: TextStyle( + fontSize: 10, + color: Colors.grey.shade400, + fontWeight: FontWeight.w600, + ), + ), + ], + ], + ), + ), + + // أيقونة الحالة + if (unlocked) + Container( + padding: const EdgeInsets.all(6), + decoration: BoxDecoration( + color: ach.color.withOpacity(0.15), + shape: BoxShape.circle, + ), + child: Icon( + Icons.check_rounded, + color: ach.color, + size: 18, + ), + ) + else + Icon( + Icons.lock_outline_rounded, + color: Colors.grey.shade300, + size: 20, + ), + ], + ), + ); + } +} diff --git a/siro_driver/lib/views/home/statistics/widgets/daily_goal_widget.dart b/siro_driver/lib/views/home/statistics/widgets/daily_goal_widget.dart new file mode 100644 index 0000000..53a53b5 --- /dev/null +++ b/siro_driver/lib/views/home/statistics/widgets/daily_goal_widget.dart @@ -0,0 +1,304 @@ +import 'package:flutter/material.dart'; +import 'package:get/get.dart'; +import '../../../../constant/finance_design_system.dart'; +import '../../../../controller/gamification/gamification_controller.dart'; + +class DailyGoalWidget extends StatelessWidget { + final GamificationController controller; + + const DailyGoalWidget({super.key, required this.controller}); + + @override + Widget build(BuildContext context) { + return Container( + padding: const EdgeInsets.all(20), + decoration: BoxDecoration( + color: FinanceDesignSystem.cardColor, + borderRadius: BorderRadius.circular(FinanceDesignSystem.cardRadius), + boxShadow: [ + BoxShadow( + color: Colors.black.withOpacity(0.03), + blurRadius: 10, + offset: const Offset(0, 4), + ), + ], + ), + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + Row( + children: [ + Container( + padding: const EdgeInsets.all(8), + decoration: BoxDecoration( + color: controller.isDailyGoalMet + ? FinanceDesignSystem.successGreen.withOpacity(0.1) + : FinanceDesignSystem.accentBlue.withOpacity(0.1), + borderRadius: BorderRadius.circular(10), + ), + child: Icon( + controller.isDailyGoalMet + ? Icons.check_circle_rounded + : Icons.track_changes_rounded, + color: controller.isDailyGoalMet + ? FinanceDesignSystem.successGreen + : FinanceDesignSystem.accentBlue, + size: 20, + ), + ), + const SizedBox(width: 12), + Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Text( + 'Daily Goal'.tr, + style: TextStyle( + fontSize: 16, + fontWeight: FontWeight.bold, + color: FinanceDesignSystem.primaryDark, + ), + ), + Text( + 'Daily Goal'.tr, + style: TextStyle( + fontSize: 11, + color: FinanceDesignSystem.textSecondary, + ), + ), + ], + ), + ], + ), + // زر تعديل الهدف + InkWell( + onTap: () => _showSetGoalDialog(context), + borderRadius: BorderRadius.circular(8), + child: Container( + padding: + const EdgeInsets.symmetric(horizontal: 12, vertical: 6), + decoration: BoxDecoration( + color: FinanceDesignSystem.backgroundColor, + borderRadius: BorderRadius.circular(8), + ), + child: Text( + controller.dailyGoal > 0 ? 'Edit'.tr : 'Set Goal'.tr, + style: TextStyle( + fontSize: 12, + fontWeight: FontWeight.w600, + color: FinanceDesignSystem.accentBlue, + ), + ), + ), + ), + ], + ), + const SizedBox(height: 20), + + // مبلغ الأرباح والهدف + Row( + crossAxisAlignment: CrossAxisAlignment.baseline, + textBaseline: TextBaseline.alphabetic, + children: [ + Text( + controller.dailyEarnings.toStringAsFixed(0), + style: TextStyle( + fontSize: 28, + fontWeight: FontWeight.w900, + color: controller.isDailyGoalMet + ? FinanceDesignSystem.successGreen + : FinanceDesignSystem.primaryDark, + fontFamily: 'digit', + ), + ), + const SizedBox(width: 6), + Text( + '/ ${controller.dailyGoal.toStringAsFixed(0)} ${'SYP'.tr}', + style: TextStyle( + fontSize: 16, + fontWeight: FontWeight.w500, + color: FinanceDesignSystem.textMuted, + ), + ), + ], + ), + const SizedBox(height: 14), + + // شريط التقدم + Stack( + children: [ + Container( + height: 12, + width: double.infinity, + decoration: BoxDecoration( + color: FinanceDesignSystem.backgroundColor, + borderRadius: BorderRadius.circular(6), + ), + ), + LayoutBuilder( + builder: (context, constraints) { + return AnimatedContainer( + duration: const Duration(milliseconds: 800), + curve: Curves.easeOutCubic, + height: 12, + width: constraints.maxWidth * controller.dailyGoalProgress, + decoration: BoxDecoration( + gradient: LinearGradient( + colors: controller.isDailyGoalMet + ? [ + FinanceDesignSystem.successGreen, + const Color(0xFF69F0AE) + ] + : [ + FinanceDesignSystem.accentBlue, + const Color(0xFF82B1FF) + ], + ), + borderRadius: BorderRadius.circular(6), + boxShadow: [ + BoxShadow( + color: (controller.isDailyGoalMet + ? FinanceDesignSystem.successGreen + : FinanceDesignSystem.accentBlue) + .withOpacity(0.3), + blurRadius: 6, + offset: const Offset(0, 2), + ), + ], + ), + ); + }, + ), + ], + ), + const SizedBox(height: 8), + Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + Text( + '${(controller.dailyGoalProgress * 100).toStringAsFixed(0)}%', + style: TextStyle( + fontSize: 12, + fontWeight: FontWeight.bold, + color: controller.isDailyGoalMet + ? FinanceDesignSystem.successGreen + : FinanceDesignSystem.accentBlue, + ), + ), + if (controller.isDailyGoalMet) + Row( + children: [ + const Icon(Icons.celebration_rounded, + color: Color(0xFFFFD700), size: 14), + const SizedBox(width: 4), + Text( + 'Goal Achieved!'.tr, + style: TextStyle( + fontSize: 12, + fontWeight: FontWeight.bold, + color: FinanceDesignSystem.successGreen, + ), + ), + ], + ) + else + Text( + '${'Remaining:'.tr} ${(controller.dailyGoal - controller.dailyEarnings).clamp(0, double.infinity).toStringAsFixed(0)} ${'SYP'.tr}', + style: TextStyle( + fontSize: 11, + color: FinanceDesignSystem.textSecondary, + ), + ), + ], + ), + ], + ), + ); + } + + void _showSetGoalDialog(BuildContext context) { + final textController = TextEditingController( + text: controller.dailyGoal > 0 + ? controller.dailyGoal.toStringAsFixed(0) + : '', + ); + + Get.defaultDialog( + backgroundColor: FinanceDesignSystem.cardColor, + title: 'Set Daily Goal'.tr, + titleStyle: FinanceDesignSystem.headingStyle, + content: Column( + children: [ + Text( + 'How much do you want to earn today?'.tr, + style: FinanceDesignSystem.subHeadingStyle, + textAlign: TextAlign.center, + ), + const SizedBox(height: 16), + TextField( + controller: textController, + keyboardType: TextInputType.number, + textAlign: TextAlign.center, + style: const TextStyle( + fontSize: 24, + fontWeight: FontWeight.bold, + fontFamily: 'digit', + ), + decoration: InputDecoration( + hintText: '5000', + suffixText: 'SYP'.tr, + border: OutlineInputBorder( + borderRadius: BorderRadius.circular(12), + borderSide: BorderSide(color: FinanceDesignSystem.borderColor), + ), + focusedBorder: OutlineInputBorder( + borderRadius: BorderRadius.circular(12), + borderSide: BorderSide(color: FinanceDesignSystem.accentBlue), + ), + ), + ), + const SizedBox(height: 12), + // الأهداف السريعة + Wrap( + spacing: 8, + children: [1000, 3000, 5000, 10000].map((goal) { + return ActionChip( + label: Text('$goal'), + labelStyle: const TextStyle(fontSize: 12), + backgroundColor: + FinanceDesignSystem.accentBlue.withOpacity(0.1), + side: BorderSide.none, + onPressed: () { + textController.text = goal.toString(); + }, + ); + }).toList(), + ), + ], + ), + confirm: ElevatedButton( + onPressed: () { + double? goal = double.tryParse(textController.text); + if (goal != null && goal > 0) { + controller.setDailyGoal(goal); + Get.back(); + } + }, + style: ElevatedButton.styleFrom( + backgroundColor: FinanceDesignSystem.accentBlue, + foregroundColor: Colors.white, + shape: + RoundedRectangleBorder(borderRadius: BorderRadius.circular(12)), + padding: const EdgeInsets.symmetric(horizontal: 32, vertical: 12), + ), + child: Text('Save'.tr), + ), + cancel: TextButton( + onPressed: () => Get.back(), + child: Text('Cancel'.tr, style: const TextStyle(color: Colors.grey)), + ), + ); + } +} diff --git a/siro_driver/lib/views/home/statistics/widgets/level_progress_widget.dart b/siro_driver/lib/views/home/statistics/widgets/level_progress_widget.dart new file mode 100644 index 0000000..15775c7 --- /dev/null +++ b/siro_driver/lib/views/home/statistics/widgets/level_progress_widget.dart @@ -0,0 +1,159 @@ +import 'package:flutter/material.dart'; +import 'package:get/get.dart'; +import '../../../../constant/finance_design_system.dart'; +import '../../../../controller/gamification/gamification_controller.dart'; + +class LevelProgressWidget extends StatelessWidget { + final GamificationController controller; + const LevelProgressWidget({super.key, required this.controller}); + + @override + Widget build(BuildContext context) { + final level = controller.currentLevel; + final next = controller.nextLevel; + final isAr = Get.locale?.languageCode == 'ar'; + + return Container( + padding: const EdgeInsets.all(20), + decoration: BoxDecoration( + gradient: LinearGradient( + colors: [ + level.color.withOpacity(0.08), + level.gradientEnd.withOpacity(0.04) + ], + begin: Alignment.topLeft, + end: Alignment.bottomRight, + ), + borderRadius: BorderRadius.circular(FinanceDesignSystem.cardRadius), + border: Border.all(color: level.color.withOpacity(0.2), width: 1.5), + ), + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + Text('Driver Level'.tr, + style: TextStyle( + fontSize: 16, + fontWeight: FontWeight.bold, + color: FinanceDesignSystem.primaryDark)), + Container( + padding: + const EdgeInsets.symmetric(horizontal: 14, vertical: 8), + decoration: BoxDecoration( + gradient: + LinearGradient(colors: [level.color, level.gradientEnd]), + borderRadius: BorderRadius.circular(20), + ), + child: Row(mainAxisSize: MainAxisSize.min, children: [ + Text(level.emoji, style: const TextStyle(fontSize: 16)), + const SizedBox(width: 6), + Text(isAr ? level.nameAr : level.nameEn, + style: const TextStyle( + color: Colors.white, + fontWeight: FontWeight.bold, + fontSize: 13)), + ]), + ), + ], + ), + const SizedBox(height: 20), + Row( + children: List.generate(DriverLevels.all.length, (i) { + final lvl = DriverLevels.all[i]; + final isCurrent = lvl.id == level.id; + final isPast = DriverLevels.all.indexOf(level) > i; + return Expanded( + child: Container( + margin: const EdgeInsets.symmetric(horizontal: 2), + height: 8, + decoration: BoxDecoration( + color: isCurrent + ? lvl.color + : isPast + ? lvl.color.withOpacity(0.6) + : FinanceDesignSystem.backgroundColor, + borderRadius: BorderRadius.circular(4), + ), + )); + }), + ), + const SizedBox(height: 6), + Row( + children: DriverLevels.all + .map((l) => Expanded( + child: Text(l.emoji, + textAlign: TextAlign.center, + style: + TextStyle(fontSize: l.id == level.id ? 16 : 12)))) + .toList()), + const SizedBox(height: 16), + if (next != null) ...[ + Row(mainAxisAlignment: MainAxisAlignment.spaceBetween, children: [ + Text('${'Next Level:'.tr} ${isAr ? next.nameAr : next.nameEn}', + style: TextStyle( + fontSize: 12, + fontWeight: FontWeight.w600, + color: FinanceDesignSystem.textSecondary)), + Text('${(controller.progressToNext * 100).toStringAsFixed(0)}%', + style: TextStyle( + fontSize: 12, + fontWeight: FontWeight.bold, + color: level.color)), + ]), + const SizedBox(height: 8), + Stack(children: [ + Container( + height: 10, + decoration: BoxDecoration( + color: FinanceDesignSystem.backgroundColor, + borderRadius: BorderRadius.circular(5))), + LayoutBuilder( + builder: (ctx, c) => AnimatedContainer( + duration: const Duration(milliseconds: 800), + curve: Curves.easeOutCubic, + height: 10, + width: c.maxWidth * controller.progressToNext, + decoration: BoxDecoration( + gradient: LinearGradient( + colors: [level.color, level.gradientEnd]), + borderRadius: BorderRadius.circular(5)), + )), + ]), + const SizedBox(height: 6), + Text('${controller.totalPoints} / ${next.minPoints} ${'Points'.tr}', + style: TextStyle( + fontSize: 11, + color: FinanceDesignSystem.textMuted, + fontFamily: 'digit')), + ] else + Center( + child: Text('🏆 ${'Maximum Level Reached!'.tr}', + style: TextStyle( + fontSize: 14, + fontWeight: FontWeight.bold, + color: level.color))), + const SizedBox(height: 16), + Wrap( + spacing: 6, + runSpacing: 6, + children: level.perks + .map((p) => Container( + padding: const EdgeInsets.symmetric( + horizontal: 10, vertical: 5), + decoration: BoxDecoration( + color: level.color.withOpacity(0.1), + borderRadius: BorderRadius.circular(12)), + child: Text(p.tr, + style: TextStyle( + fontSize: 10, + fontWeight: FontWeight.w600, + color: level.color.withOpacity(0.8))), + )) + .toList()), + ], + ), + ); + } +} diff --git a/siro_driver/lib/views/home/statistics/widgets/monthly_chart_widget.dart b/siro_driver/lib/views/home/statistics/widgets/monthly_chart_widget.dart new file mode 100644 index 0000000..7fce035 --- /dev/null +++ b/siro_driver/lib/views/home/statistics/widgets/monthly_chart_widget.dart @@ -0,0 +1,159 @@ +import 'package:flutter/material.dart'; +import 'package:get/get.dart'; +import 'package:fl_chart/fl_chart.dart'; +import '../../../../constant/finance_design_system.dart'; +import '../../../../controller/home/statistics/statistics_controller.dart'; + +class MonthlyChartWidget extends StatelessWidget { + const MonthlyChartWidget({super.key}); + + @override + Widget build(BuildContext context) { + return GetBuilder( + builder: (sc) { + return Container( + padding: const EdgeInsets.all(20), + decoration: BoxDecoration( + color: FinanceDesignSystem.cardColor, + borderRadius: BorderRadius.circular(FinanceDesignSystem.cardRadius), + boxShadow: [ + BoxShadow( + color: Colors.black.withOpacity(0.03), + blurRadius: 10, + offset: const Offset(0, 4)) + ], + ), + child: + Column(crossAxisAlignment: CrossAxisAlignment.start, children: [ + Text('Monthly Report'.tr, + style: TextStyle( + fontSize: 16, + fontWeight: FontWeight.bold, + color: FinanceDesignSystem.primaryDark)), + const SizedBox(height: 16), + // Summary Row + Row(children: [ + _summaryTile( + 'Total Earnings'.tr, + '${sc.monthlyTotalEarnings.toStringAsFixed(0)} ${'SYP'.tr}', + FinanceDesignSystem.successGreen), + const SizedBox(width: 12), + _summaryTile('Total Trips'.tr, '${sc.monthlyTotalTrips}', + FinanceDesignSystem.accentBlue), + const SizedBox(width: 12), + _summaryTile( + 'Best Day'.tr, '${sc.bestDay}', const Color(0xFFFFD700)), + ]), + const SizedBox(height: 20), + // Monthly Earnings Line Chart + SizedBox( + height: 200, + child: sc.monthlyEarnings.isEmpty + ? Center( + child: Text('No data yet'.tr, + style: TextStyle(color: Colors.grey.shade400))) + : LineChart(LineChartData( + lineTouchData: LineTouchData( + enabled: true, + touchTooltipData: LineTouchTooltipData( + getTooltipItems: (spots) => spots + .map((s) => LineTooltipItem( + '${s.y.toStringAsFixed(0)} ${'SYP'.tr}', + const TextStyle( + color: Colors.white, + fontWeight: FontWeight.bold, + fontSize: 12), + )) + .toList(), + ), + ), + gridData: FlGridData( + show: true, + drawVerticalLine: false, + getDrawingHorizontalLine: (v) => FlLine( + color: FinanceDesignSystem.borderColor, + strokeWidth: 1), + ), + titlesData: FlTitlesData( + bottomTitles: AxisTitles( + sideTitles: SideTitles( + showTitles: true, + interval: 5, + getTitlesWidget: (v, m) => Padding( + padding: const EdgeInsets.only(top: 8), + child: Text('${v.toInt()}', + style: TextStyle( + fontSize: 10, + color: FinanceDesignSystem.textSecondary)), + ), + )), + leftTitles: const AxisTitles( + sideTitles: SideTitles(showTitles: false)), + topTitles: const AxisTitles( + sideTitles: SideTitles(showTitles: false)), + rightTitles: const AxisTitles( + sideTitles: SideTitles(showTitles: false)), + ), + borderData: FlBorderData(show: false), + lineBarsData: [ + LineChartBarData( + spots: sc.monthlyEarnings + .map((e) => + FlSpot(e.day.toDouble(), e.pricePerDay)) + .toList(), + isCurved: true, + curveSmoothness: 0.3, + color: FinanceDesignSystem.accentBlue, + barWidth: 3, + dotData: FlDotData( + show: true, + getDotPainter: (s, p, d, i) => FlDotCirclePainter( + radius: 3, + color: FinanceDesignSystem.accentBlue, + strokeWidth: 1, + strokeColor: Colors.white), + ), + belowBarData: BarAreaData( + show: true, + gradient: LinearGradient( + begin: Alignment.topCenter, + end: Alignment.bottomCenter, + colors: [ + FinanceDesignSystem.accentBlue.withOpacity(0.2), + FinanceDesignSystem.accentBlue.withOpacity(0.0) + ], + ), + ), + ), + ], + )), + ), + ]), + ); + }, + ); + } + + Widget _summaryTile(String label, String value, Color color) { + return Expanded( + child: Container( + padding: const EdgeInsets.all(10), + decoration: BoxDecoration( + color: color.withOpacity(0.08), + borderRadius: BorderRadius.circular(12)), + child: Column(children: [ + Text(value, + style: TextStyle( + fontSize: 14, fontWeight: FontWeight.w800, color: color)), + const SizedBox(height: 2), + Text(label, + style: TextStyle( + fontSize: 9, color: FinanceDesignSystem.textSecondary), + textAlign: TextAlign.center, + maxLines: 1, + overflow: TextOverflow.ellipsis), + ]), + ), + ); + } +} diff --git a/siro_driver/lib/views/home/statistics/widgets/stat_summary_card.dart b/siro_driver/lib/views/home/statistics/widgets/stat_summary_card.dart new file mode 100644 index 0000000..79eb172 --- /dev/null +++ b/siro_driver/lib/views/home/statistics/widgets/stat_summary_card.dart @@ -0,0 +1,83 @@ +import 'package:flutter/material.dart'; +import '../../../../constant/finance_design_system.dart'; + +class StatSummaryCard extends StatelessWidget { + final IconData icon; + final String label; + final String value; + final Color color; + + const StatSummaryCard({ + super.key, + required this.icon, + required this.label, + required this.value, + required this.color, + }); + + @override + Widget build(BuildContext context) { + return Container( + padding: const EdgeInsets.all(16), + decoration: BoxDecoration( + color: FinanceDesignSystem.cardColor, + borderRadius: BorderRadius.circular(FinanceDesignSystem.cardRadius), + boxShadow: [ + BoxShadow( + color: Colors.black.withOpacity(0.03), + blurRadius: 10, + offset: const Offset(0, 4), + ), + ], + ), + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + Container( + padding: const EdgeInsets.all(8), + decoration: BoxDecoration( + color: color.withOpacity(0.1), + borderRadius: BorderRadius.circular(10), + ), + child: Icon(icon, color: color, size: 20), + ), + Icon( + Icons.trending_up_rounded, + color: Colors.grey.shade300, + size: 16, + ), + ], + ), + Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Text( + value, + style: TextStyle( + fontSize: 22, + fontWeight: FontWeight.w900, + color: FinanceDesignSystem.primaryDark, + fontFamily: 'digit', + ), + ), + Text( + label, + style: TextStyle( + fontSize: 11, + color: FinanceDesignSystem.textSecondary, + fontWeight: FontWeight.w500, + ), + maxLines: 1, + overflow: TextOverflow.ellipsis, + ), + ], + ), + ], + ), + ); + } +} diff --git a/siro_driver/lib/views/home/statistics/widgets/today_chart_widget.dart b/siro_driver/lib/views/home/statistics/widgets/today_chart_widget.dart new file mode 100644 index 0000000..06602fc --- /dev/null +++ b/siro_driver/lib/views/home/statistics/widgets/today_chart_widget.dart @@ -0,0 +1,85 @@ +import 'package:flutter/material.dart'; +import 'package:get/get.dart'; +import 'package:siro_driver/controller/home/captin/home_captain_controller.dart'; +import '../../../../constant/finance_design_system.dart'; + +class TodayChartWidget extends StatelessWidget { + TodayChartWidget({super.key}); + + @override + Widget build(BuildContext context) { + return GetBuilder( + builder: (hc) { + return Container( + padding: const EdgeInsets.all(20), + decoration: BoxDecoration( + color: FinanceDesignSystem.cardColor, + borderRadius: BorderRadius.circular(FinanceDesignSystem.cardRadius), + boxShadow: [ + BoxShadow( + color: Colors.black.withOpacity(0.03), + blurRadius: 10, + offset: const Offset(0, 4)), + ], + ), + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Text('Today Overview'.tr, + style: TextStyle( + fontSize: 16, + fontWeight: FontWeight.bold, + color: FinanceDesignSystem.primaryDark)), + const SizedBox(height: 4), + Text('Summary of your daily activity'.tr, + style: TextStyle( + fontSize: 11, color: FinanceDesignSystem.textSecondary)), + const SizedBox(height: 20), + _buildRow( + Icons.monetization_on_rounded, + 'Earnings'.tr, + '${hc.totalMoneyToday} ${'SYP'.tr}', + FinanceDesignSystem.successGreen), + const Divider(height: 24), + _buildRow(Icons.local_taxi_rounded, 'Rides'.tr, hc.countRideToday, + FinanceDesignSystem.accentBlue), + const Divider(height: 24), + Obx(() => _buildRow(Icons.timer_rounded, 'Online Duration'.tr, + hc.totalDurationDisplay.value, const Color(0xFFFF9800))), + const Divider(height: 24), + _buildRow(Icons.cancel_outlined, 'Refused'.tr, hc.countRefuse, + FinanceDesignSystem.dangerRed), + ], + ), + ); + }, + ); + } + + Widget _buildRow(IconData icon, String label, String value, Color color) { + return Row( + children: [ + Container( + padding: const EdgeInsets.all(8), + decoration: BoxDecoration( + color: color.withOpacity(0.1), + borderRadius: BorderRadius.circular(10)), + child: Icon(icon, color: color, size: 20), + ), + const SizedBox(width: 14), + Expanded( + child: Text(label, + style: TextStyle( + fontSize: 14, + fontWeight: FontWeight.w500, + color: FinanceDesignSystem.primaryDark))), + Text(value, + style: TextStyle( + fontSize: 16, + fontWeight: FontWeight.w800, + color: FinanceDesignSystem.primaryDark, + fontFamily: 'digit')), + ], + ); + } +} diff --git a/siro_driver/lib/views/home/statistics/widgets/weekly_chart_widget.dart b/siro_driver/lib/views/home/statistics/widgets/weekly_chart_widget.dart new file mode 100644 index 0000000..3fc7a3b --- /dev/null +++ b/siro_driver/lib/views/home/statistics/widgets/weekly_chart_widget.dart @@ -0,0 +1,172 @@ +import 'package:flutter/material.dart'; +import 'package:get/get.dart'; +import 'package:fl_chart/fl_chart.dart'; +import '../../../../constant/finance_design_system.dart'; +import '../../../../controller/home/statistics/statistics_controller.dart'; + +class WeeklyChartWidget extends StatelessWidget { + const WeeklyChartWidget({super.key}); + + @override + Widget build(BuildContext context) { + return GetBuilder( + builder: (sc) { + return Container( + padding: const EdgeInsets.all(20), + decoration: BoxDecoration( + color: FinanceDesignSystem.cardColor, + borderRadius: BorderRadius.circular(FinanceDesignSystem.cardRadius), + boxShadow: [ + BoxShadow( + color: Colors.black.withOpacity(0.03), + blurRadius: 10, + offset: const Offset(0, 4)) + ], + ), + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Row(mainAxisAlignment: MainAxisAlignment.spaceBetween, children: [ + Text('Weekly Earnings'.tr, + style: TextStyle( + fontSize: 16, + fontWeight: FontWeight.bold, + color: FinanceDesignSystem.primaryDark)), + Container( + padding: + const EdgeInsets.symmetric(horizontal: 10, vertical: 4), + decoration: BoxDecoration( + color: FinanceDesignSystem.successGreen.withOpacity(0.1), + borderRadius: BorderRadius.circular(12)), + child: Text( + '${sc.weeklyEarnings.toStringAsFixed(0)} ${'SYP'.tr}', + style: TextStyle( + fontSize: 12, + fontWeight: FontWeight.bold, + color: FinanceDesignSystem.successGreen)), + ), + ]), + const SizedBox(height: 8), + Row(children: [ + _miniStat(Icons.local_taxi_rounded, '${sc.weeklyTrips}', + 'Rides'.tr, FinanceDesignSystem.accentBlue), + const SizedBox(width: 16), + _miniStat( + Icons.timer_rounded, + '${sc.weeklyHours.toStringAsFixed(1)}h', + 'Hours'.tr, + const Color(0xFFFF9800)), + ]), + const SizedBox(height: 20), + SizedBox( + height: 180, + child: sc.weeklyStats.isEmpty + ? Center( + child: Text('No data yet'.tr, + style: TextStyle(color: Colors.grey.shade400))) + : BarChart( + BarChartData( + alignment: BarChartAlignment.spaceAround, + maxY: _getMaxY(sc.weeklyStats), + barTouchData: BarTouchData( + enabled: true, + touchTooltipData: BarTouchTooltipData( + getTooltipItem: (group, gi, rod, ri) => + BarTooltipItem( + '${rod.toY.toStringAsFixed(0)} ${'SYP'.tr}', + const TextStyle( + color: Colors.white, + fontWeight: FontWeight.bold, + fontSize: 12), + ), + ), + ), + titlesData: FlTitlesData( + show: true, + bottomTitles: AxisTitles( + sideTitles: SideTitles( + showTitles: true, + getTitlesWidget: (v, m) { + final idx = v.toInt(); + if (idx >= 0 && + idx < sc.weeklyStats.length) { + return Padding( + padding: + const EdgeInsets.only(top: 8), + child: Text( + sc.weeklyStats[idx].dayName.tr, + style: TextStyle( + fontSize: 10, + color: FinanceDesignSystem + .textSecondary))); + } + return const SizedBox.shrink(); + })), + leftTitles: const AxisTitles( + sideTitles: SideTitles(showTitles: false)), + topTitles: const AxisTitles( + sideTitles: SideTitles(showTitles: false)), + rightTitles: const AxisTitles( + sideTitles: SideTitles(showTitles: false)), + ), + borderData: FlBorderData(show: false), + gridData: const FlGridData(show: false), + barGroups: List.generate(sc.weeklyStats.length, (i) { + final stat = sc.weeklyStats[i]; + final isToday = i == sc.weeklyStats.length - 1; + return BarChartGroupData(x: i, barRods: [ + BarChartRodData( + toY: stat.earnings, + width: 20, + borderRadius: const BorderRadius.vertical( + top: Radius.circular(6)), + gradient: LinearGradient( + begin: Alignment.bottomCenter, + end: Alignment.topCenter, + colors: isToday + ? [ + FinanceDesignSystem.accentBlue, + const Color(0xFF82B1FF) + ] + : [ + FinanceDesignSystem.primaryDark + .withOpacity(0.6), + FinanceDesignSystem.primaryDark + .withOpacity(0.3) + ], + ), + ), + ]); + }), + ), + ), + ), + ], + ), + ); + }, + ); + } + + Widget _miniStat(IconData icon, String value, String label, Color color) { + return Row(children: [ + Icon(icon, size: 16, color: color), + const SizedBox(width: 4), + Text(value, + style: TextStyle( + fontSize: 13, + fontWeight: FontWeight.bold, + color: FinanceDesignSystem.primaryDark)), + const SizedBox(width: 4), + Text(label, + style: TextStyle( + fontSize: 11, color: FinanceDesignSystem.textSecondary)), + ]); + } + + double _getMaxY(List stats) { + if (stats.isEmpty) return 100; + final max = stats.map((s) => s.earnings).reduce((a, b) => a > b ? a : b); + return max <= 0 ? 100 : max * 1.2; + } +} diff --git a/siro_driver/lib/views/lang/languages.dart b/siro_driver/lib/views/lang/languages.dart new file mode 100755 index 0000000..ed588e6 --- /dev/null +++ b/siro_driver/lib/views/lang/languages.dart @@ -0,0 +1,145 @@ +import 'package:flutter/cupertino.dart'; +import 'package:flutter/material.dart'; +import 'package:get/get.dart'; +import 'package:siro_driver/views/home/Captin/home_captain/home_captin.dart'; + +import '../../constant/finance_design_system.dart'; +import '../../controller/local/local_controller.dart'; + +class Language extends StatelessWidget { + const Language({Key? key}) : super(key: key); + + @override + Widget build(BuildContext context) { + return CupertinoPageScaffold( + navigationBar: CupertinoNavigationBar( + middle: Text('Choose Language'.tr), + border: null, + ), + child: Material( + // Wrap SafeArea with Material widget + child: SafeArea( + child: GetBuilder( + builder: (controller) => Center( + child: Padding( + padding: const EdgeInsets.symmetric(horizontal: 20), + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + _buildHeader(), + const SizedBox(height: 20), + Expanded( + child: ListView( + physics: const BouncingScrollPhysics(), + children: [ + _buildLanguageButton( + 'العربية', 'ar', controller, context, 'AR'), + _buildLanguageButton( + 'English', 'en', controller, context, 'EN'), + ], + ), + ), + ], + ), + ), + ), + ), + ), + ), + ); + } + + Widget _buildHeader() { + return Padding( + padding: const EdgeInsets.only(top: 20, bottom: 10), + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Text( + 'Language Options'.tr, + style: const TextStyle( + fontSize: 24, + fontWeight: FontWeight.bold, + color: CupertinoColors.black, // Or your theme primary color + ), + textAlign: TextAlign.start, + ), + const SizedBox(height: 8), + Text( + 'Select your preferred language for the app interface.', + style: TextStyle( + fontSize: 16, + color: CupertinoColors.secondaryLabel, + ), + textAlign: TextAlign.start, + ), + ], + ), + ); + } + + Widget _buildLanguageButton(String title, String langCode, + LocaleController controller, BuildContext context, String flagIcon) { + return Container( + margin: const EdgeInsets.only(bottom: 12), + decoration: BoxDecoration( + color: CupertinoColors.white, + borderRadius: BorderRadius.circular(16), + boxShadow: [ + BoxShadow( + color: Colors.black.withOpacity(0.03), + spreadRadius: 1, + blurRadius: 10, + offset: const Offset(0, 4), + ), + ], + ), + child: ListTile( + contentPadding: const EdgeInsets.symmetric(horizontal: 16, vertical: 4), + leading: Container( + width: 44, + height: 44, + decoration: BoxDecoration( + color: FinanceDesignSystem.primaryDark.withOpacity(0.05), + borderRadius: BorderRadius.circular(12), + ), + alignment: Alignment.center, + child: Text( + flagIcon, + style: TextStyle( + fontSize: 16, + fontWeight: FontWeight.bold, + color: FinanceDesignSystem.primaryDark, + ), + ), + ), + title: Text( + title, + style: const TextStyle( + fontWeight: FontWeight.w600, + fontSize: 16, + ), + ), + trailing: const Icon(CupertinoIcons.chevron_forward, + color: CupertinoColors.inactiveGray), + onTap: () async { + controller.changeLang(langCode); + showCupertinoDialog( + context: context, + builder: (context) => CupertinoAlertDialog( + title: Text('You should restart app to change language'.tr), + actions: [ + CupertinoDialogAction( + child: Text('Ok'.tr), + onPressed: () { + Get.offAll(() => HomeCaptain()); + }, + ), + ], + ), + ); + }, + ), + ); + } +} diff --git a/siro_driver/lib/views/notification/available_rides_page.dart b/siro_driver/lib/views/notification/available_rides_page.dart new file mode 100755 index 0000000..f09219f --- /dev/null +++ b/siro_driver/lib/views/notification/available_rides_page.dart @@ -0,0 +1,404 @@ +import 'dart:convert'; +import 'package:flutter/cupertino.dart'; +import 'package:flutter/material.dart'; +import 'package:get/get.dart'; +import 'package:intaleq_maps/intaleq_maps.dart'; // لتحديد الأنواع إذا لزم + +import '../../constant/box_name.dart'; +import '../../constant/colors.dart'; +import '../../constant/links.dart'; +import '../../constant/style.dart'; +import '../../controller/functions/crud.dart'; +import '../../controller/home/captin/home_captain_controller.dart'; +import '../../controller/notification/ride_available_controller.dart'; +import '../../main.dart'; // للوصول للـ box +import '../home/Captin/driver_map_page.dart'; +import '../widgets/my_scafold.dart'; +import '../widgets/mycircular.dart'; +import '../widgets/mydialoug.dart'; + +class AvailableRidesPage extends StatelessWidget { + const AvailableRidesPage({super.key}); + + @override + Widget build(BuildContext context) { + // حقن الكنترولر (تأكد أنك تستخدم الكود الجديد الذي أعطيتك إياه للكنترولر) + Get.lazyPut(() => RideAvailableController()); + Get.lazyPut(() => HomeCaptainController()); + + return GetBuilder( + builder: (controller) { + return MyScafolld( + title: 'Available for rides'.tr, + isleading: true, + body: [ + controller.isLoading + ? const Center( + child: Padding( + padding: EdgeInsets.only(top: 50.0), + child: MyCircularProgressIndicator(), + )) + : Builder( + builder: (context) { + // 1. الفلترة حسب نوع السيارة (تم نقل المنطق للكنترولر، لكن هنا للعرض فقط) + // الكنترولر الجديد يفلتر عند الإضافة، لكن لا ضرر من التأكيد هنا + final ridesList = controller.availableRides; + + if (ridesList.isEmpty) { + return Center( + child: Column( + mainAxisAlignment: MainAxisAlignment.center, + children: [ + const SizedBox(height: 100), + Icon(CupertinoIcons.car_detailed, + size: 60, + color: + AppColor.primaryColor.withOpacity(0.5)), + const SizedBox(height: 20), + Text( + "No rides available right now.".tr, + style: AppStyle.subtitle, + ), + const SizedBox(height: 20), + ElevatedButton.icon( + onPressed: () => controller.getRideAvailable( + forceRefresh: true), + icon: const Icon(Icons.refresh), + label: Text("Refresh Market".tr), + style: ElevatedButton.styleFrom( + backgroundColor: AppColor.primaryColor, + foregroundColor: Colors.white, + ), + ) + ], + ), + ); + } + + // 2. عرض القائمة + return RefreshIndicator( + onRefresh: () async { + await controller.getRideAvailable(forceRefresh: true); + }, + child: ListView.builder( + padding: const EdgeInsets.symmetric( + horizontal: 12, vertical: 16), + itemCount: ridesList.length, + itemBuilder: (context, index) { + return RideAvailableCard( + rideInfo: ridesList[index], + ); + }, + ), + ); + }, + ) + ], + ); + }, + ); + } +} + +// ============================================================================= +// بطاقة الرحلة (The Card) +// ============================================================================= +class RideAvailableCard extends StatelessWidget { + final Map rideInfo; + + const RideAvailableCard({Key? key, required this.rideInfo}) : super(key: key); + + @override + Widget build(BuildContext context) { + return Card( + margin: const EdgeInsets.only(bottom: 16.0), + shape: RoundedRectangleBorder(borderRadius: BorderRadius.circular(16)), + elevation: 4, + shadowColor: Theme.of(context).shadowColor.withOpacity(0.1), + child: Padding( + padding: const EdgeInsets.all(16.0), + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + _buildHeader(), + const SizedBox(height: 16), + _buildRouteInfo(), + const Divider(height: 24, thickness: 0.5), + _buildRideDetails(), + const SizedBox(height: 20), + _buildAcceptButton(), + ], + ), + ), + ); + } + + // --------------------------------------------------------------------------- + // تصميم البطاقة (Header, Route, Details) + // --------------------------------------------------------------------------- + Widget _buildHeader() { + return Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Text('Price'.tr, style: AppStyle.subtitle.copyWith(fontSize: 12)), + Text( + '${rideInfo['price']} ${'SYP'.tr}', // العملة + style: AppStyle.title.copyWith( + fontSize: 20, color: AppColor.primaryColor, height: 1.2), + ), + ], + ), + Column( + crossAxisAlignment: CrossAxisAlignment.end, + children: [ + Container( + padding: const EdgeInsets.symmetric(horizontal: 12, vertical: 6), + decoration: BoxDecoration( + color: AppColor.greenColor.withOpacity(0.1), + borderRadius: BorderRadius.circular(20), + border: Border.all(color: AppColor.greenColor.withOpacity(0.3)), + ), + child: Text( + rideInfo['carType'] ?? 'Fixed Price'.tr, + style: AppStyle.title + .copyWith(color: AppColor.greenColor, fontSize: 13), + ), + ), + if (rideInfo['has_steps']?.toString() == 'true') ...[ + const SizedBox(height: 8), + Container( + padding: const EdgeInsets.symmetric(horizontal: 8, vertical: 4), + decoration: BoxDecoration( + color: Colors.orange.shade100, + borderRadius: BorderRadius.circular(12), + border: Border.all(color: Colors.orange), + ), + child: Row( + children: [ + Icon(Icons.alt_route, color: Colors.orange.shade800, size: 14), + const SizedBox(width: 4), + Text( + 'متعددة التوقفات', + style: AppStyle.subtitle.copyWith( + color: Colors.orange.shade800, + fontSize: 11, + fontWeight: FontWeight.bold), + ), + ], + ), + ), + ] + ], + ), + ], + ); + } + + Widget _buildRouteInfo() { + return Row( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Column( + children: [ + const Icon(Icons.my_location, + color: AppColor.primaryColor, size: 18), + Container( + height: 30, + width: 1, + color: Theme.of(Get.context!).dividerColor, + margin: const EdgeInsets.symmetric(vertical: 4), + ), + const Icon(Icons.location_on, color: Colors.red, size: 18), + ], + ), + const SizedBox(width: 12), + Expanded( + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Text(rideInfo['startName'] ?? 'Unknown Location'.tr, + maxLines: 1, + overflow: TextOverflow.ellipsis, + style: AppStyle.title.copyWith(fontSize: 14)), + const SizedBox(height: 22), + Text(rideInfo['endName'] ?? 'Destination'.tr, + maxLines: 1, + overflow: TextOverflow.ellipsis, + style: AppStyle.title.copyWith(fontSize: 14)), + ], + ), + ) + ], + ); + } + + Widget _buildRideDetails() { + return Row( + mainAxisAlignment: MainAxisAlignment.spaceAround, + children: [ + _infoItem(Icons.social_distance, '${rideInfo['distance']} KM'), + _infoItem(Icons.access_time, '${rideInfo['duration']} Min'), + _infoItem(Icons.star, '${rideInfo['passengerRate'] ?? 5.0}', + iconColor: Colors.amber), + ], + ); + } + + Widget _infoItem(IconData icon, String text, {Color? iconColor}) { + return Builder(builder: (context) { + final theme = Theme.of(context); + return Row( + children: [ + Icon(icon, size: 16, color: iconColor ?? theme.hintColor), + const SizedBox(width: 4), + Text(text, style: theme.textTheme.bodySmall?.copyWith(fontSize: 13)), + ], + ); + }); + } + + // --------------------------------------------------------------------------- + // زر القبول والمنطق الكامل (Accept Logic) 🔥 + // --------------------------------------------------------------------------- + Widget _buildAcceptButton() { + return SizedBox( + width: double.infinity, + height: 50, + child: ElevatedButton( + onPressed: _acceptRideNewLogic, + style: ElevatedButton.styleFrom( + backgroundColor: AppColor.greenColor, + shape: + RoundedRectangleBorder(borderRadius: BorderRadius.circular(12)), + elevation: 2, + ), + child: Text( + 'Accept Ride'.tr, + style: const TextStyle( + color: Colors.white, fontSize: 16, fontWeight: FontWeight.bold), + ), + ), + ); + } + + // 🔥🔥🔥 الوظيفة الأهم: قبول الرحلة وتجهيز البيانات 🔥🔥🔥 + void _acceptRideNewLogic() async { + // 1. إظهار Loading + Get.dialog( + const Center(child: MyCircularProgressIndicator()), + barrierDismissible: false, + ); + + try { + String driverId = box.read(BoxName.driverID).toString(); + + // 2. إرسال الطلب للسيرفر (acceptRide.php الجديد) + var response = await CRUD().post( + link: "${AppLink.ride}/rides/acceptRide.php", + payload: { + 'id': rideInfo['id'].toString(), + 'driver_id': driverId, + 'status': 'Apply', // الحالة المتفق عليها + 'passengerToken': rideInfo['passengerToken'].toString(), + }, + ); + + // إخفاء الـ Loading + Get.back(); + + // 3. تحليل الرد + var jsonResponse = response; + + if (jsonResponse['status'] == 'success') { + // ✅ نجاح: أنت الفائز بالرحلة + + // تحديث حالة السائق محلياً + Get.find().changeRideId(); + box.write(BoxName.statusDriverLocation, 'on'); + + // 🔥 تجهيز الـ Arguments كاملة (Mapping) 📦 + // نأخذ البيانات من rideInfo (القادمة من getRideWaiting) ونمررها للخريطة + Map fullRideArgs = { + // معرفات الرحلة + 'rideId': rideInfo['id'].toString(), + 'passengerId': rideInfo['passengerId'].toString(), + 'driverId': driverId, + + // المواقع (يجب أن تكون Strings بصيغة "lat,lng") + 'passengerLocation': rideInfo['start_location'].toString(), + 'passengerDestination': rideInfo['end_location'].toString(), + + // الأسماء والعناوين + 'startNameLocation': rideInfo['startName'].toString(), + 'endNameLocation': rideInfo['endName'].toString(), + + // تفاصيل الراكب + 'name': rideInfo['first_name'] ?? 'Passenger', + 'phone': rideInfo['phone'].toString(), + 'email': rideInfo['email'] ?? '', + 'tokenPassenger': rideInfo['passengerToken'].toString(), + 'passengerWalletBurc': rideInfo['bruc'].toString(), // رصيد الراكب + + // التفاصيل المالية والرحلة + 'totalCost': rideInfo['price'].toString(), // السعر الكلي + 'paymentAmount': rideInfo['price'].toString(), // المبلغ المطلوب + 'Distance': rideInfo['distance'].toString(), + 'Duration': rideInfo['duration'].toString(), + 'durationOfRideValue': + rideInfo['duration'].toString(), // تكرار للتأكد + 'carType': rideInfo['carType'].toString(), + + // الدفع والمحفظة + 'paymentMethod': (rideInfo['payment_method'] == 'visa' || + rideInfo['payment_method'] == 'wallet') + ? 'visa' + : 'cash', + 'WalletChecked': + rideInfo['passenger_wallet'].toString() != '0' ? 'true' : 'false', + 'kazan': Get.find() + .kazan + .toString(), // نسبة الشركة (من الكنترولر) + + // بيانات إضافية (لتجنب الـ Null Safety errors) + 'direction': + 'http://googleusercontent.com/maps.google.com/maps?saddr=${rideInfo['start_location']}&daddr=${rideInfo['end_location']}', + 'timeOfOrder': DateTime.now().toString(), + 'isHaveSteps': rideInfo['has_steps']?.toString() ?? 'false', + 'step0': rideInfo['step0'] ?? '', + 'step1': rideInfo['step1'] ?? '', + 'step2': rideInfo['step2'] ?? '', + 'step3': rideInfo['step3'] ?? '', + 'step4': rideInfo['step4'] ?? '', + }; + + // حفظ البيانات في الصندوق احتياطياً (Crash Recovery) + box.write(BoxName.rideArguments, fullRideArgs); + + // الانتقال لصفحة الخريطة ومسح الصفحات السابقة لضمان عدم الرجوع للسوق + Get.offAll(() => PassengerLocationMapPage(), arguments: fullRideArgs); + } else { + // ❌ فشل: الرحلة أخذها سائق آخر + // نقوم بتحديث القائمة فوراً + Get.find() + .getRideAvailable(forceRefresh: true); + + MyDialog().getDialog( + "Trip taken".tr, + "This ride was just accepted by another driver.".tr, + () => Get.back(), // زر الموافقة + ); + } + } catch (e) { + Get.back(); // إخفاء اللودينج في حال الخطأ + print("Accept Ride Error: $e"); + MyDialog().getDialog( + "Error".tr, + "An unexpected error occurred. Please try again.".tr, + () => Get.back(), + ); + } + } +} diff --git a/siro_driver/lib/views/notification/notification_captain.dart b/siro_driver/lib/views/notification/notification_captain.dart new file mode 100755 index 0000000..3a25916 --- /dev/null +++ b/siro_driver/lib/views/notification/notification_captain.dart @@ -0,0 +1,87 @@ +import 'package:flutter/material.dart'; +import 'package:get/get.dart'; +import 'package:siro_driver/controller/notification/notification_captain_controller.dart'; +import 'package:flutter/cupertino.dart'; + +class NotificationCaptain extends StatelessWidget { + const NotificationCaptain({Key? key}) : super(key: key); + + @override + Widget build(BuildContext context) { + Get.put(NotificationCaptainController()); + + return CupertinoPageScaffold( + navigationBar: CupertinoNavigationBar( + middle: Text('Notifications'.tr), + leading: CupertinoNavigationBarBackButton( + onPressed: () => Get.back(), + ), + ), + child: SafeArea( + child: GetBuilder( + builder: (notificationCaptainController) => + notificationCaptainController.isLoading + ? const Center(child: CupertinoActivityIndicator()) + : ListView.builder( + itemCount: notificationCaptainController + .notificationData['message'].length, + itemBuilder: (BuildContext context, int index) { + if (notificationCaptainController + .notificationData['message'] == + "No notification data found") { + _showCupertinoDialog(context, 'No Notifications', + 'There are no notifications at this time.'); + return const SizedBox.shrink(); + } + var res = notificationCaptainController + .notificationData['message'][index]; + return CupertinoListTile( + leading: const Icon(CupertinoIcons.bell_fill), + title: Text( + res['title'], + style: + CupertinoTheme.of(context).textTheme.textStyle, + ), + subtitle: Text( + res['body'], + style: CupertinoTheme.of(context) + .textTheme + .tabLabelTextStyle, + ), + onTap: () { + _showCupertinoDialog( + context, + res['title'], + res['body'], + onConfirm: () { + notificationCaptainController + .updateNotification(res['id'].toString()); + Navigator.of(context).pop(); + }, + ); + }, + ); + }, + ), + ), + ), + ); + } + + void _showCupertinoDialog(BuildContext context, String title, String content, + {VoidCallback? onConfirm}) { + showCupertinoDialog( + context: context, + builder: (BuildContext context) => CupertinoAlertDialog( + title: Text(title), + content: Text(content), + actions: [ + CupertinoDialogAction( + child: const Text('OK'), + onPressed: onConfirm ?? () => Navigator.of(context).pop(), + ), + ], + ), + ); + } +} diff --git a/siro_driver/lib/views/notification/notification_page.dart b/siro_driver/lib/views/notification/notification_page.dart new file mode 100755 index 0000000..ee31789 --- /dev/null +++ b/siro_driver/lib/views/notification/notification_page.dart @@ -0,0 +1,83 @@ +import 'package:flutter/material.dart'; +import 'package:get/get.dart'; +import 'package:siro_driver/constant/colors.dart'; +import 'package:siro_driver/constant/style.dart'; + +import '../../controller/notification/passenger_notification_controller.dart'; +import '../widgets/elevated_btn.dart'; +import '../widgets/my_scafold.dart'; +import '../widgets/mycircular.dart'; + +class NotificationPage extends StatelessWidget { + const NotificationPage({super.key}); + + @override + Widget build(BuildContext context) { + Get.put(PassengerNotificationController()); + return MyScafolld( + isleading: true, + title: 'Notifications', + body: [ + GetBuilder( + builder: (notificationCaptainController) => + notificationCaptainController.isloading + ? const MyCircularProgressIndicator() + : SafeArea( + child: ListView.builder( + itemCount: notificationCaptainController + .notificationData['message'].length, + itemBuilder: (BuildContext context, int index) { + if (notificationCaptainController + .notificationData['message'] == + "No notification data found") { + Get.defaultDialog(); + } + var res = notificationCaptainController + .notificationData['message'][index]; + return Card( + elevation: 4, + color: res['isShown'] == 'true' + ? AppColor.secondaryColor.withOpacity(.5) + : AppColor.secondaryColor.withOpacity(.9), + child: ListTile( + onTap: () { + Get.defaultDialog( + title: res['title'], + titleStyle: AppStyle.title, + content: SizedBox( + width: Get.width * .8, + // height: Get.height * .4, + child: Text( + res['body'], + style: AppStyle.title, + ), + ), + confirm: MyElevatedButton( + title: 'Ok', + onPressed: () { + notificationCaptainController + .updateNotification( + res['id'].toString()); + })); + }, + leading: res['isShown'] == 'true' + ? const Icon( + Icons.notifications_off_outlined) + : const Icon(Icons.notifications_active), + title: Text( + res['title'], + style: AppStyle.title, + ), + subtitle: Text( + res['body'], + style: AppStyle.subtitle, + ), + ), + ); + }, + ), + )) + ], + ); + } +} diff --git a/siro_driver/lib/views/widgets/circle_container.dart b/siro_driver/lib/views/widgets/circle_container.dart new file mode 100755 index 0000000..52edebc --- /dev/null +++ b/siro_driver/lib/views/widgets/circle_container.dart @@ -0,0 +1,77 @@ +import 'package:flutter/material.dart'; +import 'package:get/get.dart'; +import 'package:siro_driver/constant/colors.dart'; + +import 'mydialoug.dart'; + +class MyCircleContainer extends StatelessWidget { + final Widget child; + final Color? backgroundColor; + final Color? borderColor; + + MyCircleContainer({ + super.key, + required this.child, + this.backgroundColor, + this.borderColor, + }); + + final controller = Get.put(CircleController()); + + @override + Widget build(BuildContext context) { + final effectiveBorderColor = borderColor ?? AppColor.borderColor; + + return GetBuilder( + builder: ((controller) { + final effectiveBackgroundColor = backgroundColor ?? + (controller.isActive ? AppColor.accentColor : AppColor.secondaryColor); + + return GestureDetector( + onTap: () { + controller.toggleActive(); + MyDialog().getDialog( + 'Rejected Orders Count'.tr, + 'This is the total number of rejected orders per day after accepting the orders' + .tr, () { + Get.back(); + }); + }, + child: AnimatedContainer( + onEnd: () { + controller.resetSize(); + }, + duration: const Duration(milliseconds: 300), + width: controller.size, + height: controller.size, + decoration: BoxDecoration( + shape: BoxShape.circle, + color: effectiveBackgroundColor, + border: Border.all( + color: effectiveBorderColor, + width: 1, + ), + ), + child: Center(child: child), + ), + ); + })); + } +} + +class CircleController extends GetxController { + bool isActive = false; + double size = 40; + + void toggleActive() { + isActive = !isActive; + size = 60; + update(); + } + + void resetSize() { + size = 40; + update(); + } +} + diff --git a/siro_driver/lib/views/widgets/elevated_btn.dart b/siro_driver/lib/views/widgets/elevated_btn.dart new file mode 100755 index 0000000..9cea8e6 --- /dev/null +++ b/siro_driver/lib/views/widgets/elevated_btn.dart @@ -0,0 +1,64 @@ +import 'dart:io'; + +import 'package:flutter/material.dart'; +import 'package:siro_driver/constant/style.dart'; +import 'package:flutter/services.dart'; +import 'package:vibration/vibration.dart'; + +import '../../constant/box_name.dart'; +import '../../constant/colors.dart'; +import '../../main.dart'; + +class MyElevatedButton extends StatelessWidget { + final String title; + final VoidCallback onPressed; + final Color kolor; + final int vibrateDuration; + const MyElevatedButton({ + Key? key, + required this.title, + required this.onPressed, + this.kolor = AppColor.primaryColor, + this.vibrateDuration = 100, + }) : super(key: key); + + @override + Widget build(BuildContext context) { + bool vibrate = box.read(BoxName.isvibrate) ?? true; + return ElevatedButton( + style: ButtonStyle( + backgroundColor: WidgetStateProperty.all(kolor), + shadowColor: WidgetStateProperty.all(Colors.transparent), + shape: WidgetStateProperty.all( + RoundedRectangleBorder( + borderRadius: BorderRadius.circular(8), + ), + ), + ), + onPressed: () async { + // Handle haptic feedback for both iOS and Android + if (vibrate == true) { + if (Platform.isIOS) { + HapticFeedback.selectionClick(); + } else if (Platform.isAndroid) { + await Vibration.vibrate(duration: vibrateDuration); + } else {} + } + + // Ensure the onPressed callback is called after haptic feedback + onPressed(); + }, + child: Text( + title, + textAlign: TextAlign.center, + style: AppStyle.title.copyWith( + color: (kolor == AppColor.primaryColor || kolor == AppColor.blueColor || kolor == AppColor.redColor || kolor == AppColor.greenColor) + ? Colors.white + : AppColor.writeColor, + fontWeight: FontWeight.bold, + ), + ), + + ); + } +} diff --git a/siro_driver/lib/views/widgets/error_snakbar.dart b/siro_driver/lib/views/widgets/error_snakbar.dart new file mode 100755 index 0000000..8016844 --- /dev/null +++ b/siro_driver/lib/views/widgets/error_snakbar.dart @@ -0,0 +1,292 @@ +import 'dart:ui'; +import 'package:flutter/material.dart'; +import 'package:flutter/services.dart'; +import 'package:get/get.dart'; +import '../../constant/colors.dart'; + +// ───────────────────────────────────────────────────────────────────────────── +// Snackbar variant definition +// ───────────────────────────────────────────────────────────────────────────── +enum _SnackVariant { success, error, info, warning } + +extension _VariantProps on _SnackVariant { + Color get baseColor => switch (this) { + _SnackVariant.success => const Color(0xFF1A9E5C), + _SnackVariant.error => const Color(0xFFD93025), + _SnackVariant.info => const Color(0xFF1A73E8), + _SnackVariant.warning => const Color(0xFFF29900), + }; + + Color get surfaceColor => switch (this) { + _SnackVariant.success => const Color(0xFFF0FBF5), + _SnackVariant.error => const Color(0xFFFEF2F1), + _SnackVariant.info => const Color(0xFFF0F6FF), + _SnackVariant.warning => const Color(0xFFFFF8E6), + }; + + IconData get icon => switch (this) { + _SnackVariant.success => Icons.check_circle_rounded, + _SnackVariant.error => Icons.error_rounded, + _SnackVariant.info => Icons.info_rounded, + _SnackVariant.warning => Icons.warning_amber_rounded, + }; + + String get label => switch (this) { + _SnackVariant.success => 'Success', + _SnackVariant.error => 'Error', + _SnackVariant.info => 'Info', + _SnackVariant.warning => 'Warning', + }; + + HapticFeedbackType get haptic => switch (this) { + _SnackVariant.error => HapticFeedbackType.medium, + _SnackVariant.warning => HapticFeedbackType.medium, + _SnackVariant.success => HapticFeedbackType.light, + _SnackVariant.info => HapticFeedbackType.selection, + }; +} + +enum HapticFeedbackType { light, medium, selection } + +// ───────────────────────────────────────────────────────────────────────────── +// Core snackbar widget +// ───────────────────────────────────────────────────────────────────────────── +class _SnackContent extends StatefulWidget { + final String message; + final _SnackVariant variant; + + const _SnackContent({required this.message, required this.variant}); + + @override + State<_SnackContent> createState() => _SnackContentState(); +} + +class _SnackContentState extends State<_SnackContent> + with TickerProviderStateMixin { + late final AnimationController _ctrl; + late final Animation _scaleAnim; + late final Animation _progressAnim; + + static const Duration _displayDuration = Duration(seconds: 4); + + @override + void initState() { + super.initState(); + _ctrl = AnimationController(vsync: this, duration: _displayDuration); + + _scaleAnim = CurvedAnimation( + parent: AnimationController( + vsync: this, + duration: const Duration(milliseconds: 500), + )..forward(), + curve: Curves.elasticOut, + ); + + _progressAnim = Tween(begin: 1.0, end: 0.0).animate( + CurvedAnimation(parent: _ctrl, curve: Curves.linear), + ); + + _ctrl.forward(); + } + + @override + void dispose() { + _ctrl.dispose(); + super.dispose(); + } + + @override + Widget build(BuildContext context) { + final v = widget.variant; + final accent = v.baseColor; + final surface = v.surfaceColor; + + return Container( + margin: const EdgeInsets.symmetric(horizontal: 14, vertical: 8), + decoration: BoxDecoration( + color: surface, + borderRadius: BorderRadius.circular(18), + border: Border.all(color: accent.withOpacity(0.18), width: 1.2), + boxShadow: [ + BoxShadow( + color: accent.withOpacity(0.12), + blurRadius: 20, + spreadRadius: -2, + offset: const Offset(0, 6), + ), + BoxShadow( + color: Colors.black.withOpacity(0.06), + blurRadius: 10, + offset: const Offset(0, 2), + ), + ], + ), + child: ClipRRect( + borderRadius: BorderRadius.circular(18), + child: Column( + mainAxisSize: MainAxisSize.min, + children: [ + // ── Main row ────────────────────────────────────────────────── + Padding( + padding: const EdgeInsets.fromLTRB(14, 14, 10, 12), + child: Row( + crossAxisAlignment: CrossAxisAlignment.center, + children: [ + // Animated icon badge + ScaleTransition( + scale: _scaleAnim, + child: Container( + width: 40, + height: 40, + decoration: BoxDecoration( + color: accent.withOpacity(0.12), + shape: BoxShape.circle, + ), + child: Icon(v.icon, color: accent, size: 22), + ), + ), + const SizedBox(width: 12), + + // Text content + Expanded( + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + mainAxisSize: MainAxisSize.min, + children: [ + Text( + v.label.tr, + style: TextStyle( + color: accent, + fontSize: 13, + fontWeight: FontWeight.w700, + letterSpacing: 0.2, + ), + ), + const SizedBox(height: 3), + Text( + widget.message, + style: TextStyle( + color: Colors.grey[800], + fontSize: 13.5, + height: 1.4, + fontWeight: FontWeight.w400, + ), + maxLines: 2, + overflow: TextOverflow.ellipsis, + ), + ], + ), + ), + + // Close button + GestureDetector( + onTap: () { + HapticFeedback.lightImpact(); + Get.closeCurrentSnackbar(); + }, + child: Container( + width: 30, + height: 30, + margin: const EdgeInsets.only(left: 6), + decoration: BoxDecoration( + color: Colors.grey.withOpacity(0.1), + shape: BoxShape.circle, + ), + child: Icon( + Icons.close_rounded, + size: 16, + color: Colors.grey[500], + ), + ), + ), + ], + ), + ), + + // ── Thin progress strip ─────────────────────────────────────── + AnimatedBuilder( + animation: _progressAnim, + builder: (_, __) => Stack( + children: [ + // Track + Container( + height: 3, + color: accent.withOpacity(0.08), + ), + // Fill + FractionallySizedBox( + widthFactor: _progressAnim.value, + child: Container( + height: 3, + decoration: BoxDecoration( + color: accent.withOpacity(0.45), + borderRadius: const BorderRadius.only( + topRight: Radius.circular(4), + bottomRight: Radius.circular(4), + ), + ), + ), + ), + ], + ), + ), + ], + ), + ), + ); + } +} + +// ───────────────────────────────────────────────────────────────────────────── +// Internal dispatcher — single source of truth +// ───────────────────────────────────────────────────────────────────────────── +SnackbarController _show(_SnackVariant variant, String message) { + // Dismiss any existing snackbar first (no stacking) + if (Get.isSnackbarOpen) Get.closeCurrentSnackbar(); + + switch (variant.haptic) { + case HapticFeedbackType.light: + HapticFeedback.lightImpact(); + case HapticFeedbackType.medium: + HapticFeedback.mediumImpact(); + case HapticFeedbackType.selection: + HapticFeedback.selectionClick(); + } + + return Get.snackbar( + '', + '', + snackPosition: SnackPosition.TOP, + backgroundColor: Colors.transparent, + margin: EdgeInsets.zero, + padding: EdgeInsets.zero, + duration: const Duration(seconds: 4), + animationDuration: const Duration(milliseconds: 380), + barBlur: 0, + overlayBlur: 0, + overlayColor: Colors.transparent, + isDismissible: true, + dismissDirection: DismissDirection.up, + forwardAnimationCurve: Curves.easeOutCubic, + reverseAnimationCurve: Curves.easeInCubic, + snackStyle: SnackStyle.FLOATING, + userInputForm: Form( + child: _SnackContent(message: message, variant: variant), + ), + ); +} + +// ───────────────────────────────────────────────────────────────────────────── +// Public API — drop-in replacements for the old functions +// ───────────────────────────────────────────────────────────────────────────── +SnackbarController mySnackbarSuccess(String message) => + _show(_SnackVariant.success, message); + +SnackbarController mySnackeBarError(String message) => + _show(_SnackVariant.error, message); + +SnackbarController mySnackbarInfo(String message) => + _show(_SnackVariant.info, message); + +SnackbarController mySnackbarWarning(String message) => + _show(_SnackVariant.warning, message); diff --git a/siro_driver/lib/views/widgets/icon_widget_menu.dart b/siro_driver/lib/views/widgets/icon_widget_menu.dart new file mode 100755 index 0000000..572283b --- /dev/null +++ b/siro_driver/lib/views/widgets/icon_widget_menu.dart @@ -0,0 +1,66 @@ +import 'package:flutter/material.dart'; +import 'package:siro_driver/constant/style.dart'; + +import '../../constant/colors.dart'; + +class IconWidgetMenu extends StatelessWidget { + const IconWidgetMenu({ + Key? key, + required this.onpressed, + required this.icon, + required this.title, + }) : super(key: key); + + final VoidCallback onpressed; + final IconData icon; + final String title; + + @override + Widget build(BuildContext context) { + return InkWell( + onTap: onpressed, + child: Padding( + padding: const EdgeInsets.only(top: 25), + child: Column( + mainAxisAlignment: MainAxisAlignment.center, + children: [ + Container( + width: 50, + decoration: BoxDecoration( + color: AppColor.secondaryColor, + shape: BoxShape.circle, + boxShadow: [ + BoxShadow( + color: AppColor.secondaryColor, + offset: const Offset(-2, -2), + blurRadius: 0, + spreadRadius: 0, + blurStyle: BlurStyle.outer, + ), + const BoxShadow( + color: AppColor.accentColor, + offset: Offset(3, 3), + blurRadius: 0, + spreadRadius: 0, + blurStyle: BlurStyle.outer, + ), + ], + ), + child: Center( + child: Icon( + icon, + size: 30, + color: AppColor.primaryColor, + ), + ), + ), + Text( + title, + style: AppStyle.subtitle, + ) + ], + ), + ), + ); + } +} diff --git a/siro_driver/lib/views/widgets/my_circular_indicator_timer.dart b/siro_driver/lib/views/widgets/my_circular_indicator_timer.dart new file mode 100755 index 0000000..3153835 --- /dev/null +++ b/siro_driver/lib/views/widgets/my_circular_indicator_timer.dart @@ -0,0 +1,73 @@ +import 'package:siro_driver/constant/style.dart'; +import 'package:flutter/material.dart'; +import 'dart:async'; + +class MyCircularProgressIndicatorWithTimer extends StatelessWidget { + final Color backgroundColor; + final bool isLoading; + + MyCircularProgressIndicatorWithTimer({ + Key? key, + this.backgroundColor = Colors.transparent, + required this.isLoading, + }) : super(key: key); + + final StreamController _streamController = StreamController(); + + void startTimer() { + int _timeLeft = 60; + Timer.periodic(const Duration(seconds: 1), (timer) { + if (_timeLeft > 0 && isLoading) { + _streamController.add(_timeLeft); + _timeLeft--; + } else { + timer.cancel(); + _streamController.close(); + } + }); + } + + @override + Widget build(BuildContext context) { + if (isLoading) { + startTimer(); + } + + return Center( + child: Container( + width: 200, + height: 200, + decoration: BoxDecoration( + color: backgroundColor, + shape: BoxShape.circle, + ), + child: Stack( + children: [ + const Center(child: CircularProgressIndicator()), + Column( + mainAxisAlignment: MainAxisAlignment.center, + children: [ + Align( + alignment: Alignment.center, + child: Image.asset( + 'assets/images/logo.gif', + width: 140, + height: 140, + ), + ), + const SizedBox(height: 10), + StreamBuilder( + stream: _streamController.stream, + initialData: 60, + builder: (context, snapshot) { + return Text('${snapshot.data}', style: AppStyle.title); + }, + ), + ], + ), + ], + ), + ), + ); + } +} diff --git a/siro_driver/lib/views/widgets/my_scafold.dart b/siro_driver/lib/views/widgets/my_scafold.dart new file mode 100755 index 0000000..a884885 --- /dev/null +++ b/siro_driver/lib/views/widgets/my_scafold.dart @@ -0,0 +1,55 @@ +import 'package:flutter/material.dart'; +import 'package:get/get.dart'; + +import '../../constant/colors.dart'; +import '../../constant/style.dart'; + +class MyScafolld extends StatelessWidget { + const MyScafolld({ + super.key, + required this.title, + required this.body, + this.action, + required this.isleading, + }); + + final String title; + final List body; + final Widget? action; + final bool isleading; + + @override + Widget build(BuildContext context) { + final theme = Theme.of(context); + return Scaffold( + backgroundColor: theme.scaffoldBackgroundColor, + appBar: AppBar( + backgroundColor: theme.appBarTheme.backgroundColor, + elevation: 0, + leading: isleading + ? IconButton( + onPressed: () { + Navigator.maybePop(context); + }, + icon: const Icon( + Icons.arrow_back_ios_new, + color: AppColor.primaryColor, + ), + ) + : const SizedBox(), + actions: [ + action ?? + Icon( + Icons.clear, + color: Colors.transparent, + ) + ], + title: Text( + title, + style: theme.textTheme.titleLarge?.copyWith(fontSize: 24, fontWeight: FontWeight.bold), + ), + ), + body: SafeArea(child: Stack(children: body))); + } +} + diff --git a/siro_driver/lib/views/widgets/my_textField.dart b/siro_driver/lib/views/widgets/my_textField.dart new file mode 100755 index 0000000..91ea852 --- /dev/null +++ b/siro_driver/lib/views/widgets/my_textField.dart @@ -0,0 +1,96 @@ +import 'package:flutter/cupertino.dart'; +import 'package:flutter/material.dart'; +import 'package:get/get.dart'; +import 'package:get_storage/get_storage.dart'; +import 'package:siro_driver/constant/box_name.dart'; + +class MyTextForm extends StatelessWidget { + const MyTextForm({ + Key? key, + required this.controller, + required this.label, + required this.hint, + required this.type, + }) : super(key: key); + + final TextEditingController controller; + final String label, hint; + final TextInputType type; + + @override + Widget build(BuildContext context) { + final theme = Theme.of(context); + return Padding( + padding: const EdgeInsets.only(bottom: 10), + child: SizedBox( + width: Get.width * .8, + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Text( + label.tr, + style: theme.textTheme.bodyLarge?.copyWith( + fontWeight: FontWeight.w600, + ), + ), + const SizedBox(height: 8), + CupertinoTextField( + controller: controller, + keyboardType: type, + placeholder: hint.tr, + padding: const EdgeInsets.symmetric(horizontal: 16, vertical: 12), + decoration: BoxDecoration( + color: theme.cardColor, + border: Border.all(color: theme.dividerColor), + borderRadius: BorderRadius.circular(8), + ), + style: theme.textTheme.bodyLarge, + placeholderStyle: theme.textTheme.bodyMedium?.copyWith( + color: theme.hintColor, + ), + ), + const SizedBox(height: 4), + ValueListenableBuilder( + valueListenable: controller, + builder: (context, value, child) { + String? errorText = _getErrorText(value.text); + return errorText != null + ? Text( + errorText, + style: TextStyle( + color: theme.colorScheme.error, + fontSize: 12, + ), + ) + : const SizedBox.shrink(); + }, + ), + ], + ), + ), + ); + } + + String? _getErrorText(String value) { + if (value.isEmpty) { + return '${'Please enter'.tr} $label'.tr; + } + + if (type == TextInputType.emailAddress) { + if (!value.contains('@')) { + return 'Please enter a valid email.'.tr; + } + } else if (type == TextInputType.phone) { + final box = GetStorage(); + if (box.read(BoxName.countryCode) == 'Egypt') { + if (value.length != 11) { + return 'Please enter a valid phone number.'.tr; + } + } else if (value.length != 10) { + return 'Please enter a valid phone number.'.tr; + } + } + + return null; + } +} diff --git a/siro_driver/lib/views/widgets/mycircular.dart b/siro_driver/lib/views/widgets/mycircular.dart new file mode 100755 index 0000000..c0a9d80 --- /dev/null +++ b/siro_driver/lib/views/widgets/mycircular.dart @@ -0,0 +1,132 @@ +import 'package:flutter/material.dart'; + +class MyCircularProgressIndicator extends StatefulWidget { + final Color backgroundColor; + final double size; + final Color progressColor; + final double strokeWidth; + + const MyCircularProgressIndicator({ + super.key, + this.backgroundColor = Colors.transparent, + this.size = 110, + this.progressColor = Colors.blue, + this.strokeWidth = 3.0, + }); + + @override + State createState() => + _MyCircularProgressIndicatorState(); +} + +class _MyCircularProgressIndicatorState + extends State + with SingleTickerProviderStateMixin { + late AnimationController _controller; + late Animation _scaleAnimation; + late Animation _rotationAnimation; + + @override + void initState() { + super.initState(); + _controller = AnimationController( + duration: const Duration(seconds: 2), + vsync: this, + )..repeat(reverse: true); + + _scaleAnimation = Tween( + begin: 0.95, + end: 1.05, + ).animate(CurvedAnimation( + parent: _controller, + curve: Curves.easeInOut, + )); + + _rotationAnimation = Tween( + begin: 0, + end: 2, + ).animate(CurvedAnimation( + parent: _controller, + curve: Curves.linear, + )); + } + + @override + void dispose() { + _controller.dispose(); + super.dispose(); + } + + @override + Widget build(BuildContext context) { + return Center( + child: AnimatedBuilder( + animation: _controller, + builder: (context, child) { + return Transform.scale( + scale: _scaleAnimation.value, + child: Container( + width: widget.size, + height: widget.size, + decoration: BoxDecoration( + color: widget.backgroundColor, + shape: BoxShape.circle, + boxShadow: [ + BoxShadow( + color: widget.progressColor.withAlpha(30), + blurRadius: 12, + spreadRadius: 2, + ), + ], + ), + child: Stack( + alignment: Alignment.center, + children: [ + // Outer rotating progress indicator + Transform.rotate( + angle: _rotationAnimation.value * 3.14, + child: CircularProgressIndicator( + strokeWidth: widget.strokeWidth, + valueColor: AlwaysStoppedAnimation( + widget.progressColor, + ), + ), + ), + // Inner static progress indicator + CircularProgressIndicator( + strokeWidth: widget.strokeWidth * 0.7, + valueColor: AlwaysStoppedAnimation( + widget.progressColor.withAlpha(150), + ), + ), + // Logo container with scale animation + ScaleTransition( + scale: Tween( + begin: 0.9, + end: 1.0, + ).animate(CurvedAnimation( + parent: _controller, + curve: Curves.easeInOut, + )), + child: Container( + width: widget.size * 0.7, + height: widget.size * 0.7, + decoration: BoxDecoration( + shape: BoxShape.circle, + color: widget.backgroundColor, + ), + child: Image.asset( + 'assets/images/logo.gif', + fit: BoxFit.contain, + ), + ), + ), + ], + ), + ), + ); + }, + ), + ); + } +} diff --git a/siro_driver/lib/views/widgets/mydialoug.dart b/siro_driver/lib/views/widgets/mydialoug.dart new file mode 100755 index 0000000..5903124 --- /dev/null +++ b/siro_driver/lib/views/widgets/mydialoug.dart @@ -0,0 +1,244 @@ +import 'dart:ui'; +import 'package:flutter/cupertino.dart'; +import 'package:flutter/material.dart'; +import 'package:flutter/services.dart'; +import 'package:get/get.dart'; +import 'package:siro_driver/constant/colors.dart'; +import 'package:siro_driver/constant/style.dart'; +import 'package:siro_driver/controller/functions/tts.dart'; + +class DialogConfig { + static const Duration animationDuration = Duration(milliseconds: 200); + static const double blurStrength = 8.0; + static const double cornerRadius = 14.0; + static final BoxDecoration decoration = BoxDecoration( + borderRadius: BorderRadius.circular(cornerRadius), + boxShadow: [ + BoxShadow( + color: Colors.black.withAlpha(38), // 0.15 opacity + blurRadius: 16, + offset: const Offset(0, 8), + ), + ], + ); +} + +class MyDialog extends GetxController { + void getDialog(String title, String? midTitle, VoidCallback onPressed) { + final textToSpeechController = Get.put(TextToSpeechController()); + + HapticFeedback.mediumImpact(); + + Get.dialog( + TweenAnimationBuilder( + duration: DialogConfig.animationDuration, + tween: Tween(begin: 0.0, end: 1.0), + builder: (context, value, child) { + return Transform.scale( + scale: 0.95 + (0.05 * value), + child: Opacity(opacity: value, child: child), + ); + }, + child: BackdropFilter( + filter: ImageFilter.blur( + sigmaX: DialogConfig.blurStrength, + sigmaY: DialogConfig.blurStrength, + ), + child: Builder(builder: (context) { + final theme = Theme.of(context); + return CupertinoAlertDialog( + title: Column( + children: [ + Text( + title.tr, + style: AppStyle.title.copyWith( + fontSize: 20, + fontWeight: FontWeight.w700, + letterSpacing: -0.5, + color: AppColor.primaryColor, + ), + ), + const SizedBox(height: 8), + ], + ), + content: Column( + children: [ + CupertinoButton( + padding: const EdgeInsets.all(8), + onPressed: () async { + HapticFeedback.selectionClick(); + await textToSpeechController.speakText(title); + await textToSpeechController.speakText(midTitle!); + }, + child: Container( + padding: const EdgeInsets.all(8), + decoration: BoxDecoration( + color: + AppColor.primaryColor.withAlpha(26), // 0.1 opacity + borderRadius: BorderRadius.circular(8), + ), + child: Icon( + CupertinoIcons.speaker_2_fill, + color: AppColor.primaryColor, + size: 24, + ), + ), + ), + const SizedBox(height: 8), + Text( + midTitle!, + style: AppStyle.title.copyWith( + fontSize: 16, + height: 1.3, + color: theme.textTheme.bodyLarge?.color ?? AppColor.writeColor, + ), + textAlign: TextAlign.center, + ), + ], + ), + actions: [ + CupertinoDialogAction( + onPressed: () { + HapticFeedback.lightImpact(); + Navigator.of(context, rootNavigator: true).pop(); + }, + child: Text( + 'Cancel'.tr, + style: TextStyle( + color: AppColor.redColor, + fontWeight: FontWeight.w600, + fontSize: 17, + ), + ), + ), + CupertinoDialogAction( + onPressed: () { + HapticFeedback.mediumImpact(); + Navigator.of(context, rootNavigator: true).pop(); + onPressed(); + }, + child: Text( + 'OK'.tr, + style: TextStyle( + color: AppColor.greenColor, + fontWeight: FontWeight.w600, + fontSize: 17, + ), + ), + ), + ], + ); + }), + ), + ), + + barrierDismissible: true, + barrierColor: Colors.black.withAlpha(102), // 0.4 opacity + ); + } +} + +class MyDialogContent extends GetxController { + void getDialog(String title, Widget? content, VoidCallback onPressed) { + final textToSpeechController = Get.put(TextToSpeechController()); + + HapticFeedback.mediumImpact(); + + Get.dialog( + TweenAnimationBuilder( + duration: DialogConfig.animationDuration, + tween: Tween(begin: 0.0, end: 1.0), + builder: (context, value, child) { + return Transform.scale( + scale: 0.95 + (0.05 * value), + child: Opacity(opacity: value, child: child), + ); + }, + child: BackdropFilter( + filter: ImageFilter.blur( + sigmaX: DialogConfig.blurStrength, + sigmaY: DialogConfig.blurStrength, + ), + child: Builder(builder: (context) { + return CupertinoAlertDialog( + title: Column( + children: [ + Text( + title, + style: AppStyle.title.copyWith( + fontSize: 20, + fontWeight: FontWeight.w700, + letterSpacing: -0.5, + color: AppColor.primaryColor, + ), + ), + const SizedBox(height: 8), + ], + ), + content: Column( + children: [ + CupertinoButton( + padding: const EdgeInsets.all(8), + onPressed: () async { + HapticFeedback.selectionClick(); + await textToSpeechController.speakText(title); + }, + child: Container( + padding: const EdgeInsets.all(8), + decoration: BoxDecoration( + color: + AppColor.primaryColor.withAlpha(26), // 0.1 opacity + borderRadius: BorderRadius.circular(8), + ), + child: Icon( + CupertinoIcons.headphones, + color: AppColor.primaryColor, + size: 24, + ), + ), + ), + const SizedBox(height: 12), + content!, + ], + ), + actions: [ + CupertinoDialogAction( + onPressed: () { + HapticFeedback.lightImpact(); + Navigator.of(context, rootNavigator: true).pop(); + }, + child: Text( + 'Cancel', + style: TextStyle( + color: AppColor.redColor, + fontWeight: FontWeight.w600, + fontSize: 17, + ), + ), + ), + CupertinoDialogAction( + onPressed: () { + HapticFeedback.mediumImpact(); + Navigator.of(context, rootNavigator: true).pop(); + onPressed(); + }, + child: Text( + 'OK'.tr, + style: TextStyle( + color: AppColor.greenColor, + fontWeight: FontWeight.w600, + fontSize: 17, + ), + ), + ), + ], + ); + }), + ), + ), + + barrierDismissible: true, + barrierColor: Colors.black.withAlpha(102), // 0.4 opacity + ); + } +} diff --git a/siro_driver/lib/views/widgets/voice_call_bottom_sheet.dart b/siro_driver/lib/views/widgets/voice_call_bottom_sheet.dart new file mode 100644 index 0000000..edf6ba4 --- /dev/null +++ b/siro_driver/lib/views/widgets/voice_call_bottom_sheet.dart @@ -0,0 +1,300 @@ +import 'package:flutter/material.dart'; +import 'package:get/get.dart'; + +import '../../constant/colors.dart'; +import '../../constant/style.dart'; +import '../../controller/voice_call_controller.dart'; + +class VoiceCallBottomSheet extends StatelessWidget { + const VoiceCallBottomSheet({Key? key}) : super(key: key); + + @override + Widget build(BuildContext context) { + final controller = Get.find(); + final double screenHeight = MediaQuery.of(context).size.height; + final bool isDark = Theme.of(context).brightness == Brightness.dark; + + // Harmonious curated colors + final Color bgColor = isDark ? const Color(0xFF121212) : Colors.white; + final Color cardColor = isDark ? const Color(0xFF1E1E1E) : const Color(0xFFF5F5F7); + final Color textColor = isDark ? Colors.white : const Color(0xFF1C1C1E); + final Color subTextColor = isDark ? Colors.white70 : Colors.black54; + + return WillPopScope( + onWillPop: () async => false, + child: Container( + height: screenHeight * 0.9, + decoration: BoxDecoration( + color: bgColor, + borderRadius: const BorderRadius.vertical(top: Radius.circular(32)), + boxShadow: [ + BoxShadow( + color: Colors.black.withOpacity(0.2), + blurRadius: 20, + offset: const Offset(0, -5), + ) + ], + ), + child: Obx(() { + final state = controller.state.value; + final seconds = controller.elapsedSeconds.value; + final remoteName = controller.remoteName.value; + final isMuted = controller.isMuted.value; + final isSpeakerOn = controller.isSpeakerOn.value; + final errorMsg = controller.errorMessage.value; + + // Progress ring logic + final double progress = seconds / 60.0; + final Color ringColor = (errorMsg.isNotEmpty || seconds <= 10) + ? const Color(0xFFE74C3C) + : const Color(0xFF2ECC71); + + // Status text translations + String statusText = ""; + if (errorMsg.isNotEmpty) { + statusText = errorMsg; + } else { + switch (state) { + case VoiceCallState.dialing: + statusText = "${'Calling'.tr} $remoteName..."; + break; + case VoiceCallState.ringing: + statusText = "${'Incoming Call...'.tr}"; + break; + case VoiceCallState.connecting: + statusText = "Connecting...".tr; + break; + case VoiceCallState.active: + statusText = "Call Connected".tr; + break; + case VoiceCallState.ended: + statusText = "Call Ended".tr; + break; + case VoiceCallState.idle: + statusText = ""; + break; + } + } + + return Column( + children: [ + // Top Drag Handle Indicator + Center( + child: Container( + margin: const EdgeInsets.only(top: 12, bottom: 24), + width: 44, + height: 5, + decoration: BoxDecoration( + color: isDark ? Colors.white24 : Colors.black12, + borderRadius: BorderRadius.circular(10), + ), + ), + ), + + Expanded( + child: Padding( + padding: const EdgeInsets.symmetric(horizontal: 24), + child: Column( + mainAxisAlignment: MainAxisAlignment.spaceEvenly, + children: [ + // Header Info + Column( + children: [ + Text( + "Free Call".tr, + style: TextStyle( + color: ringColor, + fontWeight: FontWeight.w800, + fontSize: 14, + letterSpacing: 1.2, + ), + ), + const SizedBox(height: 8), + Text( + remoteName, + style: TextStyle( + color: textColor, + fontWeight: FontWeight.w900, + fontSize: 26, + ), + textAlign: TextAlign.center, + ), + const SizedBox(height: 8), + Text( + statusText, + style: TextStyle( + color: errorMsg.isNotEmpty + ? const Color(0xFFE74C3C) + : subTextColor, + fontWeight: FontWeight.w600, + fontSize: 16, + ), + textAlign: TextAlign.center, + ), + ], + ), + + // Avatar & Animated Progress Ring + Stack( + alignment: Alignment.center, + children: [ + // Progress ring around avatar (Active state only) + if (state == VoiceCallState.active) + SizedBox( + width: 172, + height: 172, + child: CircularProgressIndicator( + value: progress, + strokeWidth: 5, + backgroundColor: isDark ? Colors.white10 : Colors.black12, + valueColor: AlwaysStoppedAnimation(ringColor), + ), + ), + + // Main Avatar Card + Container( + width: 150, + height: 150, + decoration: BoxDecoration( + shape: BoxShape.circle, + color: cardColor, + boxShadow: [ + BoxShadow( + color: Colors.black.withOpacity(0.08), + blurRadius: 15, + offset: const Offset(0, 8), + ) + ], + ), + child: Center( + child: remoteName.isNotEmpty + ? Text( + remoteName[0].toUpperCase(), + style: TextStyle( + color: textColor, + fontWeight: FontWeight.bold, + fontSize: 54, + ), + ) + : Icon( + Icons.person, + color: textColor.withOpacity(0.6), + size: 64, + ), + ), + ), + ], + ), + + // Timer Counter Display + if (state == VoiceCallState.active) + Text( + "0:${seconds.toString().padLeft(2, '0')}", + style: TextStyle( + color: seconds > 10 ? textColor : const Color(0xFFE74C3C), + fontWeight: FontWeight.bold, + fontSize: 22, + fontFamily: 'monospace', + ), + ) + else + const SizedBox(height: 24), + + // Action Controls Block + if (state == VoiceCallState.ringing) + // Incoming Ringing Controls: Accept / Decline + Row( + mainAxisAlignment: MainAxisAlignment.spaceEvenly, + children: [ + _buildCircleActionButton( + icon: Icons.call_end_rounded, + color: Colors.white, + bgColor: const Color(0xFFE74C3C), + onTap: () => controller.declineCall(), + label: "Decline".tr, + ), + _buildCircleActionButton( + icon: Icons.call_rounded, + color: Colors.white, + bgColor: const Color(0xFF2ECC71), + onTap: () => controller.acceptCall(), + label: "Accept".tr, + ), + ], + ) + else + // Dialing or Connected Controls: Speaker / Mute / Hangup + Row( + mainAxisAlignment: MainAxisAlignment.spaceEvenly, + children: [ + // Speakerphone toggle + _buildCircleActionButton( + icon: isSpeakerOn ? Icons.volume_up_rounded : Icons.volume_down_rounded, + color: isSpeakerOn ? Colors.white : textColor, + bgColor: isSpeakerOn ? const Color(0xFF2ECC71) : cardColor, + onTap: () => controller.toggleSpeaker(), + label: "Speaker".tr, + ), + // Hangup Call + _buildCircleActionButton( + icon: Icons.call_end_rounded, + color: Colors.white, + bgColor: const Color(0xFFE74C3C), + onTap: () => controller.hangup(), + label: "End".tr, + ), + // Mute Microphone + _buildCircleActionButton( + icon: isMuted ? Icons.mic_off_rounded : Icons.mic_rounded, + color: isMuted ? Colors.white : textColor, + bgColor: isMuted ? const Color(0xFFE74C3C) : cardColor, + onTap: () => controller.toggleMute(), + label: "Mute".tr, + ), + ], + ), + ], + ), + ), + ), + ], + ); + }), + ), + ); +} + + Widget _buildCircleActionButton({ + required IconData icon, + required Color color, + required Color bgColor, + required VoidCallback onTap, + required String label, + }) { + return Column( + mainAxisSize: MainAxisSize.min, + children: [ + ElevatedButton( + onPressed: onTap, + style: ElevatedButton.styleFrom( + shape: const CircleBorder(), + padding: const EdgeInsets.all(18), + backgroundColor: bgColor, + foregroundColor: color, + elevation: 2, + ), + child: Icon(icon, size: 28), + ), + const SizedBox(height: 8), + Text( + label, + style: const TextStyle( + fontSize: 12, + fontWeight: FontWeight.bold, + color: Colors.grey, + ), + ), + ], + ); + } +} diff --git a/siro_driver/linux/.gitignore b/siro_driver/linux/.gitignore new file mode 100644 index 0000000..d3896c9 --- /dev/null +++ b/siro_driver/linux/.gitignore @@ -0,0 +1 @@ +flutter/ephemeral diff --git a/siro_driver/linux/CMakeLists.txt b/siro_driver/linux/CMakeLists.txt new file mode 100644 index 0000000..74cecbb --- /dev/null +++ b/siro_driver/linux/CMakeLists.txt @@ -0,0 +1,128 @@ +# Project-level configuration. +cmake_minimum_required(VERSION 3.13) +project(runner LANGUAGES CXX) + +# The name of the executable created for the application. Change this to change +# the on-disk name of your application. +set(BINARY_NAME "siro_driver") +# The unique GTK application identifier for this application. See: +# https://wiki.gnome.org/HowDoI/ChooseApplicationID +set(APPLICATION_ID "com.siro.siro_driver") + +# Explicitly opt in to modern CMake behaviors to avoid warnings with recent +# versions of CMake. +cmake_policy(SET CMP0063 NEW) + +# Load bundled libraries from the lib/ directory relative to the binary. +set(CMAKE_INSTALL_RPATH "$ORIGIN/lib") + +# Root filesystem for cross-building. +if(FLUTTER_TARGET_PLATFORM_SYSROOT) + set(CMAKE_SYSROOT ${FLUTTER_TARGET_PLATFORM_SYSROOT}) + set(CMAKE_FIND_ROOT_PATH ${CMAKE_SYSROOT}) + set(CMAKE_FIND_ROOT_PATH_MODE_PROGRAM NEVER) + set(CMAKE_FIND_ROOT_PATH_MODE_PACKAGE ONLY) + set(CMAKE_FIND_ROOT_PATH_MODE_LIBRARY ONLY) + set(CMAKE_FIND_ROOT_PATH_MODE_INCLUDE ONLY) +endif() + +# Define build configuration options. +if(NOT CMAKE_BUILD_TYPE AND NOT CMAKE_CONFIGURATION_TYPES) + set(CMAKE_BUILD_TYPE "Debug" CACHE + STRING "Flutter build mode" FORCE) + set_property(CACHE CMAKE_BUILD_TYPE PROPERTY STRINGS + "Debug" "Profile" "Release") +endif() + +# Compilation settings that should be applied to most targets. +# +# Be cautious about adding new options here, as plugins use this function by +# default. In most cases, you should add new options to specific targets instead +# of modifying this function. +function(APPLY_STANDARD_SETTINGS TARGET) + target_compile_features(${TARGET} PUBLIC cxx_std_14) + target_compile_options(${TARGET} PRIVATE -Wall -Werror) + target_compile_options(${TARGET} PRIVATE "$<$>:-O3>") + target_compile_definitions(${TARGET} PRIVATE "$<$>:NDEBUG>") +endfunction() + +# Flutter library and tool build rules. +set(FLUTTER_MANAGED_DIR "${CMAKE_CURRENT_SOURCE_DIR}/flutter") +add_subdirectory(${FLUTTER_MANAGED_DIR}) + +# System-level dependencies. +find_package(PkgConfig REQUIRED) +pkg_check_modules(GTK REQUIRED IMPORTED_TARGET gtk+-3.0) + +# Application build; see runner/CMakeLists.txt. +add_subdirectory("runner") + +# Run the Flutter tool portions of the build. This must not be removed. +add_dependencies(${BINARY_NAME} flutter_assemble) + +# Only the install-generated bundle's copy of the executable will launch +# correctly, since the resources must in the right relative locations. To avoid +# people trying to run the unbundled copy, put it in a subdirectory instead of +# the default top-level location. +set_target_properties(${BINARY_NAME} + PROPERTIES + RUNTIME_OUTPUT_DIRECTORY "${CMAKE_BINARY_DIR}/intermediates_do_not_run" +) + + +# Generated plugin build rules, which manage building the plugins and adding +# them to the application. +include(flutter/generated_plugins.cmake) + + +# === Installation === +# By default, "installing" just makes a relocatable bundle in the build +# directory. +set(BUILD_BUNDLE_DIR "${PROJECT_BINARY_DIR}/bundle") +if(CMAKE_INSTALL_PREFIX_INITIALIZED_TO_DEFAULT) + set(CMAKE_INSTALL_PREFIX "${BUILD_BUNDLE_DIR}" CACHE PATH "..." FORCE) +endif() + +# Start with a clean build bundle directory every time. +install(CODE " + file(REMOVE_RECURSE \"${BUILD_BUNDLE_DIR}/\") + " COMPONENT Runtime) + +set(INSTALL_BUNDLE_DATA_DIR "${CMAKE_INSTALL_PREFIX}/data") +set(INSTALL_BUNDLE_LIB_DIR "${CMAKE_INSTALL_PREFIX}/lib") + +install(TARGETS ${BINARY_NAME} RUNTIME DESTINATION "${CMAKE_INSTALL_PREFIX}" + COMPONENT Runtime) + +install(FILES "${FLUTTER_ICU_DATA_FILE}" DESTINATION "${INSTALL_BUNDLE_DATA_DIR}" + COMPONENT Runtime) + +install(FILES "${FLUTTER_LIBRARY}" DESTINATION "${INSTALL_BUNDLE_LIB_DIR}" + COMPONENT Runtime) + +foreach(bundled_library ${PLUGIN_BUNDLED_LIBRARIES}) + install(FILES "${bundled_library}" + DESTINATION "${INSTALL_BUNDLE_LIB_DIR}" + COMPONENT Runtime) +endforeach(bundled_library) + +# Copy the native assets provided by the build.dart from all packages. +set(NATIVE_ASSETS_DIR "${PROJECT_BUILD_DIR}native_assets/linux/") +install(DIRECTORY "${NATIVE_ASSETS_DIR}" + DESTINATION "${INSTALL_BUNDLE_LIB_DIR}" + COMPONENT Runtime) + +# Fully re-copy the assets directory on each build to avoid having stale files +# from a previous install. +set(FLUTTER_ASSET_DIR_NAME "flutter_assets") +install(CODE " + file(REMOVE_RECURSE \"${INSTALL_BUNDLE_DATA_DIR}/${FLUTTER_ASSET_DIR_NAME}\") + " COMPONENT Runtime) +install(DIRECTORY "${PROJECT_BUILD_DIR}/${FLUTTER_ASSET_DIR_NAME}" + DESTINATION "${INSTALL_BUNDLE_DATA_DIR}" COMPONENT Runtime) + +# Install the AOT library on non-Debug builds only. +if(NOT CMAKE_BUILD_TYPE MATCHES "Debug") + install(FILES "${AOT_LIBRARY}" DESTINATION "${INSTALL_BUNDLE_LIB_DIR}" + COMPONENT Runtime) +endif() diff --git a/siro_driver/linux/flutter/CMakeLists.txt b/siro_driver/linux/flutter/CMakeLists.txt new file mode 100644 index 0000000..d5bd016 --- /dev/null +++ b/siro_driver/linux/flutter/CMakeLists.txt @@ -0,0 +1,88 @@ +# This file controls Flutter-level build steps. It should not be edited. +cmake_minimum_required(VERSION 3.10) + +set(EPHEMERAL_DIR "${CMAKE_CURRENT_SOURCE_DIR}/ephemeral") + +# Configuration provided via flutter tool. +include(${EPHEMERAL_DIR}/generated_config.cmake) + +# TODO: Move the rest of this into files in ephemeral. See +# https://github.com/flutter/flutter/issues/57146. + +# Serves the same purpose as list(TRANSFORM ... PREPEND ...), +# which isn't available in 3.10. +function(list_prepend LIST_NAME PREFIX) + set(NEW_LIST "") + foreach(element ${${LIST_NAME}}) + list(APPEND NEW_LIST "${PREFIX}${element}") + endforeach(element) + set(${LIST_NAME} "${NEW_LIST}" PARENT_SCOPE) +endfunction() + +# === Flutter Library === +# System-level dependencies. +find_package(PkgConfig REQUIRED) +pkg_check_modules(GTK REQUIRED IMPORTED_TARGET gtk+-3.0) +pkg_check_modules(GLIB REQUIRED IMPORTED_TARGET glib-2.0) +pkg_check_modules(GIO REQUIRED IMPORTED_TARGET gio-2.0) + +set(FLUTTER_LIBRARY "${EPHEMERAL_DIR}/libflutter_linux_gtk.so") + +# Published to parent scope for install step. +set(FLUTTER_LIBRARY ${FLUTTER_LIBRARY} PARENT_SCOPE) +set(FLUTTER_ICU_DATA_FILE "${EPHEMERAL_DIR}/icudtl.dat" PARENT_SCOPE) +set(PROJECT_BUILD_DIR "${PROJECT_DIR}/build/" PARENT_SCOPE) +set(AOT_LIBRARY "${PROJECT_DIR}/build/lib/libapp.so" PARENT_SCOPE) + +list(APPEND FLUTTER_LIBRARY_HEADERS + "fl_basic_message_channel.h" + "fl_binary_codec.h" + "fl_binary_messenger.h" + "fl_dart_project.h" + "fl_engine.h" + "fl_json_message_codec.h" + "fl_json_method_codec.h" + "fl_message_codec.h" + "fl_method_call.h" + "fl_method_channel.h" + "fl_method_codec.h" + "fl_method_response.h" + "fl_plugin_registrar.h" + "fl_plugin_registry.h" + "fl_standard_message_codec.h" + "fl_standard_method_codec.h" + "fl_string_codec.h" + "fl_value.h" + "fl_view.h" + "flutter_linux.h" +) +list_prepend(FLUTTER_LIBRARY_HEADERS "${EPHEMERAL_DIR}/flutter_linux/") +add_library(flutter INTERFACE) +target_include_directories(flutter INTERFACE + "${EPHEMERAL_DIR}" +) +target_link_libraries(flutter INTERFACE "${FLUTTER_LIBRARY}") +target_link_libraries(flutter INTERFACE + PkgConfig::GTK + PkgConfig::GLIB + PkgConfig::GIO +) +add_dependencies(flutter flutter_assemble) + +# === Flutter tool backend === +# _phony_ is a non-existent file to force this command to run every time, +# since currently there's no way to get a full input/output list from the +# flutter tool. +add_custom_command( + OUTPUT ${FLUTTER_LIBRARY} ${FLUTTER_LIBRARY_HEADERS} + ${CMAKE_CURRENT_BINARY_DIR}/_phony_ + COMMAND ${CMAKE_COMMAND} -E env + ${FLUTTER_TOOL_ENVIRONMENT} + "${FLUTTER_ROOT}/packages/flutter_tools/bin/tool_backend.sh" + ${FLUTTER_TARGET_PLATFORM} ${CMAKE_BUILD_TYPE} + VERBATIM +) +add_custom_target(flutter_assemble DEPENDS + "${FLUTTER_LIBRARY}" + ${FLUTTER_LIBRARY_HEADERS} +) diff --git a/siro_driver/linux/flutter/generated_plugin_registrant.cc b/siro_driver/linux/flutter/generated_plugin_registrant.cc new file mode 100644 index 0000000..e1cca73 --- /dev/null +++ b/siro_driver/linux/flutter/generated_plugin_registrant.cc @@ -0,0 +1,31 @@ +// +// Generated file. Do not edit. +// + +// clang-format off + +#include "generated_plugin_registrant.h" + +#include +#include +#include +#include +#include + +void fl_register_plugins(FlPluginRegistry* registry) { + g_autoptr(FlPluginRegistrar) file_selector_linux_registrar = + fl_plugin_registry_get_registrar_for_plugin(registry, "FileSelectorPlugin"); + file_selector_plugin_register_with_registrar(file_selector_linux_registrar); + g_autoptr(FlPluginRegistrar) flutter_secure_storage_linux_registrar = + fl_plugin_registry_get_registrar_for_plugin(registry, "FlutterSecureStorageLinuxPlugin"); + flutter_secure_storage_linux_plugin_register_with_registrar(flutter_secure_storage_linux_registrar); + g_autoptr(FlPluginRegistrar) flutter_webrtc_registrar = + fl_plugin_registry_get_registrar_for_plugin(registry, "FlutterWebRTCPlugin"); + flutter_web_r_t_c_plugin_register_with_registrar(flutter_webrtc_registrar); + g_autoptr(FlPluginRegistrar) record_linux_registrar = + fl_plugin_registry_get_registrar_for_plugin(registry, "RecordLinuxPlugin"); + record_linux_plugin_register_with_registrar(record_linux_registrar); + g_autoptr(FlPluginRegistrar) url_launcher_linux_registrar = + fl_plugin_registry_get_registrar_for_plugin(registry, "UrlLauncherPlugin"); + url_launcher_plugin_register_with_registrar(url_launcher_linux_registrar); +} diff --git a/siro_driver/linux/flutter/generated_plugin_registrant.h b/siro_driver/linux/flutter/generated_plugin_registrant.h new file mode 100644 index 0000000..e0f0a47 --- /dev/null +++ b/siro_driver/linux/flutter/generated_plugin_registrant.h @@ -0,0 +1,15 @@ +// +// Generated file. Do not edit. +// + +// clang-format off + +#ifndef GENERATED_PLUGIN_REGISTRANT_ +#define GENERATED_PLUGIN_REGISTRANT_ + +#include + +// Registers Flutter plugins. +void fl_register_plugins(FlPluginRegistry* registry); + +#endif // GENERATED_PLUGIN_REGISTRANT_ diff --git a/siro_driver/linux/flutter/generated_plugins.cmake b/siro_driver/linux/flutter/generated_plugins.cmake new file mode 100644 index 0000000..9cbdb18 --- /dev/null +++ b/siro_driver/linux/flutter/generated_plugins.cmake @@ -0,0 +1,29 @@ +# +# Generated file, do not edit. +# + +list(APPEND FLUTTER_PLUGIN_LIST + file_selector_linux + flutter_secure_storage_linux + flutter_webrtc + record_linux + url_launcher_linux +) + +list(APPEND FLUTTER_FFI_PLUGIN_LIST + jni +) + +set(PLUGIN_BUNDLED_LIBRARIES) + +foreach(plugin ${FLUTTER_PLUGIN_LIST}) + add_subdirectory(flutter/ephemeral/.plugin_symlinks/${plugin}/linux plugins/${plugin}) + target_link_libraries(${BINARY_NAME} PRIVATE ${plugin}_plugin) + list(APPEND PLUGIN_BUNDLED_LIBRARIES $) + list(APPEND PLUGIN_BUNDLED_LIBRARIES ${${plugin}_bundled_libraries}) +endforeach(plugin) + +foreach(ffi_plugin ${FLUTTER_FFI_PLUGIN_LIST}) + add_subdirectory(flutter/ephemeral/.plugin_symlinks/${ffi_plugin}/linux plugins/${ffi_plugin}) + list(APPEND PLUGIN_BUNDLED_LIBRARIES ${${ffi_plugin}_bundled_libraries}) +endforeach(ffi_plugin) diff --git a/siro_driver/linux/runner/CMakeLists.txt b/siro_driver/linux/runner/CMakeLists.txt new file mode 100644 index 0000000..e97dabc --- /dev/null +++ b/siro_driver/linux/runner/CMakeLists.txt @@ -0,0 +1,26 @@ +cmake_minimum_required(VERSION 3.13) +project(runner LANGUAGES CXX) + +# Define the application target. To change its name, change BINARY_NAME in the +# top-level CMakeLists.txt, not the value here, or `flutter run` will no longer +# work. +# +# Any new source files that you add to the application should be added here. +add_executable(${BINARY_NAME} + "main.cc" + "my_application.cc" + "${FLUTTER_MANAGED_DIR}/generated_plugin_registrant.cc" +) + +# Apply the standard set of build settings. This can be removed for applications +# that need different build settings. +apply_standard_settings(${BINARY_NAME}) + +# Add preprocessor definitions for the application ID. +add_definitions(-DAPPLICATION_ID="${APPLICATION_ID}") + +# Add dependency libraries. Add any application-specific dependencies here. +target_link_libraries(${BINARY_NAME} PRIVATE flutter) +target_link_libraries(${BINARY_NAME} PRIVATE PkgConfig::GTK) + +target_include_directories(${BINARY_NAME} PRIVATE "${CMAKE_SOURCE_DIR}") diff --git a/siro_driver/linux/runner/main.cc b/siro_driver/linux/runner/main.cc new file mode 100644 index 0000000..e7c5c54 --- /dev/null +++ b/siro_driver/linux/runner/main.cc @@ -0,0 +1,6 @@ +#include "my_application.h" + +int main(int argc, char** argv) { + g_autoptr(MyApplication) app = my_application_new(); + return g_application_run(G_APPLICATION(app), argc, argv); +} diff --git a/siro_driver/linux/runner/my_application.cc b/siro_driver/linux/runner/my_application.cc new file mode 100644 index 0000000..ccee1a5 --- /dev/null +++ b/siro_driver/linux/runner/my_application.cc @@ -0,0 +1,148 @@ +#include "my_application.h" + +#include +#ifdef GDK_WINDOWING_X11 +#include +#endif + +#include "flutter/generated_plugin_registrant.h" + +struct _MyApplication { + GtkApplication parent_instance; + char** dart_entrypoint_arguments; +}; + +G_DEFINE_TYPE(MyApplication, my_application, GTK_TYPE_APPLICATION) + +// Called when first Flutter frame received. +static void first_frame_cb(MyApplication* self, FlView* view) { + gtk_widget_show(gtk_widget_get_toplevel(GTK_WIDGET(view))); +} + +// Implements GApplication::activate. +static void my_application_activate(GApplication* application) { + MyApplication* self = MY_APPLICATION(application); + GtkWindow* window = + GTK_WINDOW(gtk_application_window_new(GTK_APPLICATION(application))); + + // Use a header bar when running in GNOME as this is the common style used + // by applications and is the setup most users will be using (e.g. Ubuntu + // desktop). + // If running on X and not using GNOME then just use a traditional title bar + // in case the window manager does more exotic layout, e.g. tiling. + // If running on Wayland assume the header bar will work (may need changing + // if future cases occur). + gboolean use_header_bar = TRUE; +#ifdef GDK_WINDOWING_X11 + GdkScreen* screen = gtk_window_get_screen(window); + if (GDK_IS_X11_SCREEN(screen)) { + const gchar* wm_name = gdk_x11_screen_get_window_manager_name(screen); + if (g_strcmp0(wm_name, "GNOME Shell") != 0) { + use_header_bar = FALSE; + } + } +#endif + if (use_header_bar) { + GtkHeaderBar* header_bar = GTK_HEADER_BAR(gtk_header_bar_new()); + gtk_widget_show(GTK_WIDGET(header_bar)); + gtk_header_bar_set_title(header_bar, "siro_driver"); + gtk_header_bar_set_show_close_button(header_bar, TRUE); + gtk_window_set_titlebar(window, GTK_WIDGET(header_bar)); + } else { + gtk_window_set_title(window, "siro_driver"); + } + + gtk_window_set_default_size(window, 1280, 720); + + g_autoptr(FlDartProject) project = fl_dart_project_new(); + fl_dart_project_set_dart_entrypoint_arguments( + project, self->dart_entrypoint_arguments); + + FlView* view = fl_view_new(project); + GdkRGBA background_color; + // Background defaults to black, override it here if necessary, e.g. #00000000 + // for transparent. + gdk_rgba_parse(&background_color, "#000000"); + fl_view_set_background_color(view, &background_color); + gtk_widget_show(GTK_WIDGET(view)); + gtk_container_add(GTK_CONTAINER(window), GTK_WIDGET(view)); + + // Show the window when Flutter renders. + // Requires the view to be realized so we can start rendering. + g_signal_connect_swapped(view, "first-frame", G_CALLBACK(first_frame_cb), + self); + gtk_widget_realize(GTK_WIDGET(view)); + + fl_register_plugins(FL_PLUGIN_REGISTRY(view)); + + gtk_widget_grab_focus(GTK_WIDGET(view)); +} + +// Implements GApplication::local_command_line. +static gboolean my_application_local_command_line(GApplication* application, + gchar*** arguments, + int* exit_status) { + MyApplication* self = MY_APPLICATION(application); + // Strip out the first argument as it is the binary name. + self->dart_entrypoint_arguments = g_strdupv(*arguments + 1); + + g_autoptr(GError) error = nullptr; + if (!g_application_register(application, nullptr, &error)) { + g_warning("Failed to register: %s", error->message); + *exit_status = 1; + return TRUE; + } + + g_application_activate(application); + *exit_status = 0; + + return TRUE; +} + +// Implements GApplication::startup. +static void my_application_startup(GApplication* application) { + // MyApplication* self = MY_APPLICATION(object); + + // Perform any actions required at application startup. + + G_APPLICATION_CLASS(my_application_parent_class)->startup(application); +} + +// Implements GApplication::shutdown. +static void my_application_shutdown(GApplication* application) { + // MyApplication* self = MY_APPLICATION(object); + + // Perform any actions required at application shutdown. + + G_APPLICATION_CLASS(my_application_parent_class)->shutdown(application); +} + +// Implements GObject::dispose. +static void my_application_dispose(GObject* object) { + MyApplication* self = MY_APPLICATION(object); + g_clear_pointer(&self->dart_entrypoint_arguments, g_strfreev); + G_OBJECT_CLASS(my_application_parent_class)->dispose(object); +} + +static void my_application_class_init(MyApplicationClass* klass) { + G_APPLICATION_CLASS(klass)->activate = my_application_activate; + G_APPLICATION_CLASS(klass)->local_command_line = + my_application_local_command_line; + G_APPLICATION_CLASS(klass)->startup = my_application_startup; + G_APPLICATION_CLASS(klass)->shutdown = my_application_shutdown; + G_OBJECT_CLASS(klass)->dispose = my_application_dispose; +} + +static void my_application_init(MyApplication* self) {} + +MyApplication* my_application_new() { + // Set the program name to the application ID, which helps various systems + // like GTK and desktop environments map this running application to its + // corresponding .desktop file. This ensures better integration by allowing + // the application to be recognized beyond its binary name. + g_set_prgname(APPLICATION_ID); + + return MY_APPLICATION(g_object_new(my_application_get_type(), + "application-id", APPLICATION_ID, "flags", + G_APPLICATION_NON_UNIQUE, nullptr)); +} diff --git a/siro_driver/linux/runner/my_application.h b/siro_driver/linux/runner/my_application.h new file mode 100644 index 0000000..db16367 --- /dev/null +++ b/siro_driver/linux/runner/my_application.h @@ -0,0 +1,21 @@ +#ifndef FLUTTER_MY_APPLICATION_H_ +#define FLUTTER_MY_APPLICATION_H_ + +#include + +G_DECLARE_FINAL_TYPE(MyApplication, + my_application, + MY, + APPLICATION, + GtkApplication) + +/** + * my_application_new: + * + * Creates a new Flutter-based application. + * + * Returns: a new #MyApplication. + */ +MyApplication* my_application_new(); + +#endif // FLUTTER_MY_APPLICATION_H_ diff --git a/siro_driver/macos/.gitignore b/siro_driver/macos/.gitignore new file mode 100644 index 0000000..746adbb --- /dev/null +++ b/siro_driver/macos/.gitignore @@ -0,0 +1,7 @@ +# Flutter-related +**/Flutter/ephemeral/ +**/Pods/ + +# Xcode-related +**/dgph +**/xcuserdata/ diff --git a/siro_driver/macos/Flutter/Flutter-Debug.xcconfig b/siro_driver/macos/Flutter/Flutter-Debug.xcconfig new file mode 100644 index 0000000..4b81f9b --- /dev/null +++ b/siro_driver/macos/Flutter/Flutter-Debug.xcconfig @@ -0,0 +1,2 @@ +#include? "Pods/Target Support Files/Pods-Runner/Pods-Runner.debug.xcconfig" +#include "ephemeral/Flutter-Generated.xcconfig" diff --git a/siro_driver/macos/Flutter/Flutter-Release.xcconfig b/siro_driver/macos/Flutter/Flutter-Release.xcconfig new file mode 100644 index 0000000..5caa9d1 --- /dev/null +++ b/siro_driver/macos/Flutter/Flutter-Release.xcconfig @@ -0,0 +1,2 @@ +#include? "Pods/Target Support Files/Pods-Runner/Pods-Runner.release.xcconfig" +#include "ephemeral/Flutter-Generated.xcconfig" diff --git a/siro_driver/macos/Flutter/GeneratedPluginRegistrant.swift b/siro_driver/macos/Flutter/GeneratedPluginRegistrant.swift new file mode 100644 index 0000000..1402229 --- /dev/null +++ b/siro_driver/macos/Flutter/GeneratedPluginRegistrant.swift @@ -0,0 +1,68 @@ +// +// Generated file. Do not edit. +// + +import FlutterMacOS +import Foundation + +import audio_session +import battery_plus +import connectivity_plus +import device_info_plus +import file_selector_macos +import firebase_auth +import firebase_core +import firebase_messaging +import flutter_app_group_directory +import flutter_image_compress_macos +import flutter_inappwebview_macos +import flutter_local_notifications +import flutter_secure_storage_darwin +import flutter_tts +import flutter_webrtc +import geolocator_apple +import google_sign_in_ios +import just_audio +import local_auth_darwin +import location +import package_info_plus +import record_macos +import share_plus +import sign_in_with_apple +import sqflite_darwin +import url_launcher_macos +import video_player_avfoundation +import wakelock_plus +import webview_flutter_wkwebview + +func RegisterGeneratedPlugins(registry: FlutterPluginRegistry) { + AudioSessionPlugin.register(with: registry.registrar(forPlugin: "AudioSessionPlugin")) + BatteryPlusMacosPlugin.register(with: registry.registrar(forPlugin: "BatteryPlusMacosPlugin")) + ConnectivityPlusPlugin.register(with: registry.registrar(forPlugin: "ConnectivityPlusPlugin")) + DeviceInfoPlusMacosPlugin.register(with: registry.registrar(forPlugin: "DeviceInfoPlusMacosPlugin")) + FileSelectorPlugin.register(with: registry.registrar(forPlugin: "FileSelectorPlugin")) + FLTFirebaseAuthPlugin.register(with: registry.registrar(forPlugin: "FLTFirebaseAuthPlugin")) + FLTFirebaseCorePlugin.register(with: registry.registrar(forPlugin: "FLTFirebaseCorePlugin")) + FLTFirebaseMessagingPlugin.register(with: registry.registrar(forPlugin: "FLTFirebaseMessagingPlugin")) + FlutterAppGroupDirectoryPlugin.register(with: registry.registrar(forPlugin: "FlutterAppGroupDirectoryPlugin")) + FlutterImageCompressMacosPlugin.register(with: registry.registrar(forPlugin: "FlutterImageCompressMacosPlugin")) + InAppWebViewFlutterPlugin.register(with: registry.registrar(forPlugin: "InAppWebViewFlutterPlugin")) + FlutterLocalNotificationsPlugin.register(with: registry.registrar(forPlugin: "FlutterLocalNotificationsPlugin")) + FlutterSecureStorageDarwinPlugin.register(with: registry.registrar(forPlugin: "FlutterSecureStorageDarwinPlugin")) + FlutterTtsPlugin.register(with: registry.registrar(forPlugin: "FlutterTtsPlugin")) + FlutterWebRTCPlugin.register(with: registry.registrar(forPlugin: "FlutterWebRTCPlugin")) + GeolocatorPlugin.register(with: registry.registrar(forPlugin: "GeolocatorPlugin")) + FLTGoogleSignInPlugin.register(with: registry.registrar(forPlugin: "FLTGoogleSignInPlugin")) + JustAudioPlugin.register(with: registry.registrar(forPlugin: "JustAudioPlugin")) + LocalAuthPlugin.register(with: registry.registrar(forPlugin: "LocalAuthPlugin")) + LocationPlugin.register(with: registry.registrar(forPlugin: "LocationPlugin")) + FPPPackageInfoPlusPlugin.register(with: registry.registrar(forPlugin: "FPPPackageInfoPlusPlugin")) + RecordMacOsPlugin.register(with: registry.registrar(forPlugin: "RecordMacOsPlugin")) + SharePlusMacosPlugin.register(with: registry.registrar(forPlugin: "SharePlusMacosPlugin")) + SignInWithApplePlugin.register(with: registry.registrar(forPlugin: "SignInWithApplePlugin")) + SqflitePlugin.register(with: registry.registrar(forPlugin: "SqflitePlugin")) + UrlLauncherPlugin.register(with: registry.registrar(forPlugin: "UrlLauncherPlugin")) + VideoPlayerPlugin.register(with: registry.registrar(forPlugin: "VideoPlayerPlugin")) + WakelockPlusMacosPlugin.register(with: registry.registrar(forPlugin: "WakelockPlusMacosPlugin")) + WebViewFlutterPlugin.register(with: registry.registrar(forPlugin: "WebViewFlutterPlugin")) +} diff --git a/siro_driver/macos/Podfile b/siro_driver/macos/Podfile new file mode 100644 index 0000000..b52666a --- /dev/null +++ b/siro_driver/macos/Podfile @@ -0,0 +1,43 @@ +platform :osx, '10.15' + +# CocoaPods analytics sends network stats synchronously affecting flutter build latency. +ENV['COCOAPODS_DISABLE_STATS'] = 'true' + +project 'Runner', { + 'Debug' => :debug, + 'Profile' => :release, + 'Release' => :release, +} + +def flutter_root + generated_xcode_build_settings_path = File.expand_path(File.join('..', 'Flutter', 'ephemeral', 'Flutter-Generated.xcconfig'), __FILE__) + unless File.exist?(generated_xcode_build_settings_path) + raise "#{generated_xcode_build_settings_path} must exist. If you're running pod install manually, make sure \"flutter pub get\" is executed first" + end + + File.foreach(generated_xcode_build_settings_path) do |line| + matches = line.match(/FLUTTER_ROOT\=(.*)/) + return matches[1].strip if matches + end + raise "FLUTTER_ROOT not found in #{generated_xcode_build_settings_path}. Try deleting Flutter-Generated.xcconfig, then run \"flutter pub get\"" +end + +require File.expand_path(File.join('packages', 'flutter_tools', 'bin', 'podhelper'), flutter_root) + +flutter_macos_podfile_setup + +target 'Runner' do + use_frameworks! + use_modular_headers! + + flutter_install_all_macos_pods File.dirname(File.realpath(__FILE__)) + target 'RunnerTests' do + inherit! :search_paths + end +end + +post_install do |installer| + installer.pods_project.targets.each do |target| + flutter_additional_macos_build_settings(target) + end +end diff --git a/siro_driver/macos/Podfile.lock b/siro_driver/macos/Podfile.lock new file mode 100644 index 0000000..4a56538 --- /dev/null +++ b/siro_driver/macos/Podfile.lock @@ -0,0 +1,358 @@ +PODS: + - AppAuth (1.7.6): + - AppAuth/Core (= 1.7.6) + - AppAuth/ExternalUserAgent (= 1.7.6) + - AppAuth/Core (1.7.6) + - AppAuth/ExternalUserAgent (1.7.6): + - AppAuth/Core + - AppCheckCore (11.2.0): + - GoogleUtilities/Environment (~> 8.0) + - GoogleUtilities/UserDefaults (~> 8.0) + - PromisesObjC (~> 2.4) + - audio_session (0.0.1): + - FlutterMacOS + - battery_plus (0.0.1): + - FlutterMacOS + - connectivity_plus (0.0.1): + - FlutterMacOS + - device_info_plus (0.0.1): + - FlutterMacOS + - file_selector_macos (0.0.1): + - FlutterMacOS + - Firebase/Auth (11.15.0): + - Firebase/CoreOnly + - FirebaseAuth (~> 11.15.0) + - Firebase/CoreOnly (11.15.0): + - FirebaseCore (~> 11.15.0) + - Firebase/Messaging (11.15.0): + - Firebase/CoreOnly + - FirebaseMessaging (~> 11.15.0) + - firebase_auth (5.7.0): + - Firebase/Auth (~> 11.15.0) + - Firebase/CoreOnly (~> 11.15.0) + - firebase_core + - FlutterMacOS + - firebase_core (3.15.2): + - Firebase/CoreOnly (~> 11.15.0) + - FlutterMacOS + - firebase_messaging (15.2.10): + - Firebase/CoreOnly (~> 11.15.0) + - Firebase/Messaging (~> 11.15.0) + - firebase_core + - FlutterMacOS + - FirebaseAppCheckInterop (11.15.0) + - FirebaseAuth (11.15.0): + - FirebaseAppCheckInterop (~> 11.0) + - FirebaseAuthInterop (~> 11.0) + - FirebaseCore (~> 11.15.0) + - FirebaseCoreExtension (~> 11.15.0) + - GoogleUtilities/AppDelegateSwizzler (~> 8.1) + - GoogleUtilities/Environment (~> 8.1) + - GTMSessionFetcher/Core (< 5.0, >= 3.4) + - RecaptchaInterop (~> 101.0) + - FirebaseAuthInterop (11.15.0) + - FirebaseCore (11.15.0): + - FirebaseCoreInternal (~> 11.15.0) + - GoogleUtilities/Environment (~> 8.1) + - GoogleUtilities/Logger (~> 8.1) + - FirebaseCoreExtension (11.15.0): + - FirebaseCore (~> 11.15.0) + - FirebaseCoreInternal (11.15.0): + - "GoogleUtilities/NSData+zlib (~> 8.1)" + - FirebaseInstallations (11.15.0): + - FirebaseCore (~> 11.15.0) + - GoogleUtilities/Environment (~> 8.1) + - GoogleUtilities/UserDefaults (~> 8.1) + - PromisesObjC (~> 2.4) + - FirebaseMessaging (11.15.0): + - FirebaseCore (~> 11.15.0) + - FirebaseInstallations (~> 11.0) + - GoogleDataTransport (~> 10.0) + - GoogleUtilities/AppDelegateSwizzler (~> 8.1) + - GoogleUtilities/Environment (~> 8.1) + - GoogleUtilities/Reachability (~> 8.1) + - GoogleUtilities/UserDefaults (~> 8.1) + - nanopb (~> 3.30910.0) + - flutter_app_group_directory (0.0.1): + - FlutterMacOS + - flutter_image_compress_macos (1.0.0): + - FlutterMacOS + - flutter_inappwebview_macos (0.0.1): + - FlutterMacOS + - OrderedSet (~> 6.0.3) + - flutter_local_notifications (0.0.1): + - FlutterMacOS + - flutter_secure_storage_macos (6.1.3): + - FlutterMacOS + - flutter_tts (0.0.1): + - FlutterMacOS + - FlutterMacOS (1.0.0) + - geolocator_apple (1.2.0): + - Flutter + - FlutterMacOS + - google_sign_in_ios (0.0.1): + - AppAuth (>= 1.7.4) + - Flutter + - FlutterMacOS + - GoogleSignIn (~> 8.0) + - GTMSessionFetcher (>= 3.4.0) + - GoogleDataTransport (10.1.0): + - nanopb (~> 3.30910.0) + - PromisesObjC (~> 2.4) + - GoogleSignIn (8.0.0): + - AppAuth (< 2.0, >= 1.7.3) + - AppCheckCore (~> 11.0) + - GTMAppAuth (< 5.0, >= 4.1.1) + - GTMSessionFetcher/Core (~> 3.3) + - GoogleUtilities/AppDelegateSwizzler (8.1.0): + - GoogleUtilities/Environment + - GoogleUtilities/Logger + - GoogleUtilities/Network + - GoogleUtilities/Privacy + - GoogleUtilities/Environment (8.1.0): + - GoogleUtilities/Privacy + - GoogleUtilities/Logger (8.1.0): + - GoogleUtilities/Environment + - GoogleUtilities/Privacy + - GoogleUtilities/Network (8.1.0): + - GoogleUtilities/Logger + - "GoogleUtilities/NSData+zlib" + - GoogleUtilities/Privacy + - GoogleUtilities/Reachability + - "GoogleUtilities/NSData+zlib (8.1.0)": + - GoogleUtilities/Privacy + - GoogleUtilities/Privacy (8.1.0) + - GoogleUtilities/Reachability (8.1.0): + - GoogleUtilities/Logger + - GoogleUtilities/Privacy + - GoogleUtilities/UserDefaults (8.1.0): + - GoogleUtilities/Logger + - GoogleUtilities/Privacy + - GTMAppAuth (4.1.1): + - AppAuth/Core (~> 1.7) + - GTMSessionFetcher/Core (< 4.0, >= 3.3) + - GTMSessionFetcher (3.5.0): + - GTMSessionFetcher/Full (= 3.5.0) + - GTMSessionFetcher/Core (3.5.0) + - GTMSessionFetcher/Full (3.5.0): + - GTMSessionFetcher/Core + - just_audio (0.0.1): + - Flutter + - FlutterMacOS + - local_auth_darwin (0.0.1): + - Flutter + - FlutterMacOS + - location (0.0.1): + - FlutterMacOS + - nanopb (3.30910.0): + - nanopb/decode (= 3.30910.0) + - nanopb/encode (= 3.30910.0) + - nanopb/decode (3.30910.0) + - nanopb/encode (3.30910.0) + - ObjectBox (1.9.2) + - objectbox_flutter_libs (0.0.1): + - FlutterMacOS + - ObjectBox (= 1.9.2) + - OrderedSet (6.0.3) + - package_info_plus (0.0.1): + - FlutterMacOS + - path_provider_foundation (0.0.1): + - Flutter + - FlutterMacOS + - PromisesObjC (2.4.0) + - record_darwin (1.0.0): + - FlutterMacOS + - share_plus (0.0.1): + - FlutterMacOS + - sign_in_with_apple (0.0.1): + - FlutterMacOS + - sqflite_darwin (0.0.4): + - Flutter + - FlutterMacOS + - url_launcher_macos (0.0.1): + - FlutterMacOS + - video_player_avfoundation (0.0.1): + - Flutter + - FlutterMacOS + - wakelock_plus (0.0.1): + - FlutterMacOS + - webview_flutter_wkwebview (0.0.1): + - Flutter + - FlutterMacOS + +DEPENDENCIES: + - audio_session (from `Flutter/ephemeral/.symlinks/plugins/audio_session/macos`) + - battery_plus (from `Flutter/ephemeral/.symlinks/plugins/battery_plus/macos`) + - connectivity_plus (from `Flutter/ephemeral/.symlinks/plugins/connectivity_plus/macos`) + - device_info_plus (from `Flutter/ephemeral/.symlinks/plugins/device_info_plus/macos`) + - file_selector_macos (from `Flutter/ephemeral/.symlinks/plugins/file_selector_macos/macos`) + - firebase_auth (from `Flutter/ephemeral/.symlinks/plugins/firebase_auth/macos`) + - firebase_core (from `Flutter/ephemeral/.symlinks/plugins/firebase_core/macos`) + - firebase_messaging (from `Flutter/ephemeral/.symlinks/plugins/firebase_messaging/macos`) + - flutter_app_group_directory (from `Flutter/ephemeral/.symlinks/plugins/flutter_app_group_directory/macos`) + - flutter_image_compress_macos (from `Flutter/ephemeral/.symlinks/plugins/flutter_image_compress_macos/macos`) + - flutter_inappwebview_macos (from `Flutter/ephemeral/.symlinks/plugins/flutter_inappwebview_macos/macos`) + - flutter_local_notifications (from `Flutter/ephemeral/.symlinks/plugins/flutter_local_notifications/macos`) + - flutter_secure_storage_macos (from `Flutter/ephemeral/.symlinks/plugins/flutter_secure_storage_macos/macos`) + - flutter_tts (from `Flutter/ephemeral/.symlinks/plugins/flutter_tts/macos`) + - FlutterMacOS (from `Flutter/ephemeral`) + - geolocator_apple (from `Flutter/ephemeral/.symlinks/plugins/geolocator_apple/darwin`) + - google_sign_in_ios (from `Flutter/ephemeral/.symlinks/plugins/google_sign_in_ios/darwin`) + - just_audio (from `Flutter/ephemeral/.symlinks/plugins/just_audio/darwin`) + - local_auth_darwin (from `Flutter/ephemeral/.symlinks/plugins/local_auth_darwin/darwin`) + - location (from `Flutter/ephemeral/.symlinks/plugins/location/macos`) + - objectbox_flutter_libs (from `Flutter/ephemeral/.symlinks/plugins/objectbox_flutter_libs/macos`) + - package_info_plus (from `Flutter/ephemeral/.symlinks/plugins/package_info_plus/macos`) + - path_provider_foundation (from `Flutter/ephemeral/.symlinks/plugins/path_provider_foundation/darwin`) + - record_darwin (from `Flutter/ephemeral/.symlinks/plugins/record_darwin/macos`) + - share_plus (from `Flutter/ephemeral/.symlinks/plugins/share_plus/macos`) + - sign_in_with_apple (from `Flutter/ephemeral/.symlinks/plugins/sign_in_with_apple/macos`) + - sqflite_darwin (from `Flutter/ephemeral/.symlinks/plugins/sqflite_darwin/darwin`) + - url_launcher_macos (from `Flutter/ephemeral/.symlinks/plugins/url_launcher_macos/macos`) + - video_player_avfoundation (from `Flutter/ephemeral/.symlinks/plugins/video_player_avfoundation/darwin`) + - wakelock_plus (from `Flutter/ephemeral/.symlinks/plugins/wakelock_plus/macos`) + - webview_flutter_wkwebview (from `Flutter/ephemeral/.symlinks/plugins/webview_flutter_wkwebview/darwin`) + +SPEC REPOS: + trunk: + - AppAuth + - AppCheckCore + - Firebase + - FirebaseAppCheckInterop + - FirebaseAuth + - FirebaseAuthInterop + - FirebaseCore + - FirebaseCoreExtension + - FirebaseCoreInternal + - FirebaseInstallations + - FirebaseMessaging + - GoogleDataTransport + - GoogleSignIn + - GoogleUtilities + - GTMAppAuth + - GTMSessionFetcher + - nanopb + - ObjectBox + - OrderedSet + - PromisesObjC + +EXTERNAL SOURCES: + audio_session: + :path: Flutter/ephemeral/.symlinks/plugins/audio_session/macos + battery_plus: + :path: Flutter/ephemeral/.symlinks/plugins/battery_plus/macos + connectivity_plus: + :path: Flutter/ephemeral/.symlinks/plugins/connectivity_plus/macos + device_info_plus: + :path: Flutter/ephemeral/.symlinks/plugins/device_info_plus/macos + file_selector_macos: + :path: Flutter/ephemeral/.symlinks/plugins/file_selector_macos/macos + firebase_auth: + :path: Flutter/ephemeral/.symlinks/plugins/firebase_auth/macos + firebase_core: + :path: Flutter/ephemeral/.symlinks/plugins/firebase_core/macos + firebase_messaging: + :path: Flutter/ephemeral/.symlinks/plugins/firebase_messaging/macos + flutter_app_group_directory: + :path: Flutter/ephemeral/.symlinks/plugins/flutter_app_group_directory/macos + flutter_image_compress_macos: + :path: Flutter/ephemeral/.symlinks/plugins/flutter_image_compress_macos/macos + flutter_inappwebview_macos: + :path: Flutter/ephemeral/.symlinks/plugins/flutter_inappwebview_macos/macos + flutter_local_notifications: + :path: Flutter/ephemeral/.symlinks/plugins/flutter_local_notifications/macos + flutter_secure_storage_macos: + :path: Flutter/ephemeral/.symlinks/plugins/flutter_secure_storage_macos/macos + flutter_tts: + :path: Flutter/ephemeral/.symlinks/plugins/flutter_tts/macos + FlutterMacOS: + :path: Flutter/ephemeral + geolocator_apple: + :path: Flutter/ephemeral/.symlinks/plugins/geolocator_apple/darwin + google_sign_in_ios: + :path: Flutter/ephemeral/.symlinks/plugins/google_sign_in_ios/darwin + just_audio: + :path: Flutter/ephemeral/.symlinks/plugins/just_audio/darwin + local_auth_darwin: + :path: Flutter/ephemeral/.symlinks/plugins/local_auth_darwin/darwin + location: + :path: Flutter/ephemeral/.symlinks/plugins/location/macos + objectbox_flutter_libs: + :path: Flutter/ephemeral/.symlinks/plugins/objectbox_flutter_libs/macos + package_info_plus: + :path: Flutter/ephemeral/.symlinks/plugins/package_info_plus/macos + path_provider_foundation: + :path: Flutter/ephemeral/.symlinks/plugins/path_provider_foundation/darwin + record_darwin: + :path: Flutter/ephemeral/.symlinks/plugins/record_darwin/macos + share_plus: + :path: Flutter/ephemeral/.symlinks/plugins/share_plus/macos + sign_in_with_apple: + :path: Flutter/ephemeral/.symlinks/plugins/sign_in_with_apple/macos + sqflite_darwin: + :path: Flutter/ephemeral/.symlinks/plugins/sqflite_darwin/darwin + url_launcher_macos: + :path: Flutter/ephemeral/.symlinks/plugins/url_launcher_macos/macos + video_player_avfoundation: + :path: Flutter/ephemeral/.symlinks/plugins/video_player_avfoundation/darwin + wakelock_plus: + :path: Flutter/ephemeral/.symlinks/plugins/wakelock_plus/macos + webview_flutter_wkwebview: + :path: Flutter/ephemeral/.symlinks/plugins/webview_flutter_wkwebview/darwin + +SPEC CHECKSUMS: + AppAuth: d4f13a8fe0baf391b2108511793e4b479691fb73 + AppCheckCore: cc8fd0a3a230ddd401f326489c99990b013f0c4f + audio_session: eaca2512cf2b39212d724f35d11f46180ad3a33e + battery_plus: f51ad29136e025b714b96f7d096f44f604615da7 + connectivity_plus: 4adf20a405e25b42b9c9f87feff8f4b6fde18a4e + device_info_plus: 4fb280989f669696856f8b129e4a5e3cd6c48f76 + file_selector_macos: 6280b52b459ae6c590af5d78fc35c7267a3c4b31 + Firebase: d99ac19b909cd2c548339c2241ecd0d1599ab02e + firebase_auth: 693f1e1ef2bb11a241d4478e63f1f47676af0538 + firebase_core: 7667f880631ae8ad10e3d6567ab7582fe0682326 + firebase_messaging: df39858bcbbcce792c9e4f1ca51b41123d6181fd + FirebaseAppCheckInterop: 06fe5a3799278ae4667e6c432edd86b1030fa3df + FirebaseAuth: a6575e5fbf46b046c58dc211a28a5fbdd8d4c83b + FirebaseAuthInterop: 7087d7a4ee4bc4de019b2d0c240974ed5d89e2fd + FirebaseCore: efb3893e5b94f32b86e331e3bd6dadf18b66568e + FirebaseCoreExtension: edbd30474b5ccf04e5f001470bdf6ea616af2435 + FirebaseCoreInternal: 9afa45b1159304c963da48addb78275ef701c6b4 + FirebaseInstallations: 317270fec08a5d418fdbc8429282238cab3ac843 + FirebaseMessaging: 3b26e2cee503815e01c3701236b020aa9b576f09 + flutter_app_group_directory: 14eb7e7a2b0e30a6a68bb855197b4ed6f5063e55 + flutter_image_compress_macos: e68daf54bb4bf2144c580fd4d151c949cbf492f0 + flutter_inappwebview_macos: c2d68649f9f8f1831bfcd98d73fd6256366d9d1d + flutter_local_notifications: 13862b132e32eb858dea558a86d45d08daeacfe7 + flutter_secure_storage_macos: 7f45e30f838cf2659862a4e4e3ee1c347c2b3b54 + flutter_tts: ae915565cc6948444b513acc8ee021993281e027 + FlutterMacOS: d0db08ddef1a9af05a5ec4b724367152bb0500b1 + geolocator_apple: ab36aa0e8b7d7a2d7639b3b4e48308394e8cef5e + google_sign_in_ios: b48bb9af78576358a168361173155596c845f0b9 + GoogleDataTransport: aae35b7ea0c09004c3797d53c8c41f66f219d6a7 + GoogleSignIn: ce8c89bb9b37fb624b92e7514cc67335d1e277e4 + GoogleUtilities: 00c88b9a86066ef77f0da2fab05f65d7768ed8e1 + GTMAppAuth: f69bd07d68cd3b766125f7e072c45d7340dea0de + GTMSessionFetcher: 5aea5ba6bd522a239e236100971f10cb71b96ab6 + just_audio: 4e391f57b79cad2b0674030a00453ca5ce817eed + local_auth_darwin: d2e8c53ef0c4f43c646462e3415432c4dab3ae19 + location: c002b64375c0739e7afa30cbd0b675554830d208 + nanopb: fad817b59e0457d11a5dfbde799381cd727c1275 + ObjectBox: 46757a559717ab49b1cc0612eaff82b705acf394 + objectbox_flutter_libs: ac606b51011c9ea99c0574bf2db0d27b053c750a + OrderedSet: e539b66b644ff081c73a262d24ad552a69be3a94 + package_info_plus: f0052d280d17aa382b932f399edf32507174e870 + path_provider_foundation: 080d55be775b7414fd5a5ef3ac137b97b097e564 + PromisesObjC: f5707f49cb48b9636751c5b2e7d227e43fba9f47 + record_darwin: 30509266ae213af8afdb09a8ae7467cb64c1377e + share_plus: 3c787998077d6b31e839225a282e9e27edf99274 + sign_in_with_apple: 6673c03c9e3643f6c8d33601943fbfa9ae99f94e + sqflite_darwin: 20b2a3a3b70e43edae938624ce550a3cbf66a3d0 + url_launcher_macos: 0fba8ddabfc33ce0a9afe7c5fef5aab3d8d2d673 + video_player_avfoundation: 2cef49524dd1f16c5300b9cd6efd9611ce03639b + wakelock_plus: 21ddc249ac4b8d018838dbdabd65c5976c308497 + webview_flutter_wkwebview: 1821ceac936eba6f7984d89a9f3bcb4dea99ebb2 + +PODFILE CHECKSUM: 9ebaf0ce3d369aaa26a9ea0e159195ed94724cf3 + +COCOAPODS: 1.16.2 diff --git a/siro_driver/macos/Runner.xcodeproj/project.pbxproj b/siro_driver/macos/Runner.xcodeproj/project.pbxproj new file mode 100644 index 0000000..a200eda --- /dev/null +++ b/siro_driver/macos/Runner.xcodeproj/project.pbxproj @@ -0,0 +1,819 @@ +// !$*UTF8*$! +{ + archiveVersion = 1; + classes = { + }; + objectVersion = 54; + objects = { + +/* Begin PBXAggregateTarget section */ + 33CC111A2044C6BA0003C045 /* Flutter Assemble */ = { + isa = PBXAggregateTarget; + buildConfigurationList = 33CC111B2044C6BA0003C045 /* Build configuration list for PBXAggregateTarget "Flutter Assemble" */; + buildPhases = ( + 33CC111E2044C6BF0003C045 /* ShellScript */, + ); + dependencies = ( + ); + name = "Flutter Assemble"; + productName = FLX; + }; +/* End PBXAggregateTarget section */ + +/* Begin PBXBuildFile section */ + 331C80D8294CF71000263BE5 /* RunnerTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 331C80D7294CF71000263BE5 /* RunnerTests.swift */; }; + 335BBD1B22A9A15E00E9071D /* GeneratedPluginRegistrant.swift in Sources */ = {isa = PBXBuildFile; fileRef = 335BBD1A22A9A15E00E9071D /* GeneratedPluginRegistrant.swift */; }; + 33CC10F12044A3C60003C045 /* AppDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 33CC10F02044A3C60003C045 /* AppDelegate.swift */; }; + 33CC10F32044A3C60003C045 /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 33CC10F22044A3C60003C045 /* Assets.xcassets */; }; + 33CC10F62044A3C60003C045 /* MainMenu.xib in Resources */ = {isa = PBXBuildFile; fileRef = 33CC10F42044A3C60003C045 /* MainMenu.xib */; }; + 33CC11132044BFA00003C045 /* MainFlutterWindow.swift in Sources */ = {isa = PBXBuildFile; fileRef = 33CC11122044BFA00003C045 /* MainFlutterWindow.swift */; }; + AE3C694CAD8DE7FBA59BA5C5 /* Pods_Runner.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 6217CA7F706FC13681FA60F8 /* Pods_Runner.framework */; }; + FC1A260161869F5DA276D94C /* Pods_RunnerTests.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = D480F849086FC3A6F134E111 /* Pods_RunnerTests.framework */; }; +/* End PBXBuildFile section */ + +/* Begin PBXContainerItemProxy section */ + 331C80D9294CF71000263BE5 /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = 33CC10E52044A3C60003C045 /* Project object */; + proxyType = 1; + remoteGlobalIDString = 33CC10EC2044A3C60003C045; + remoteInfo = Runner; + }; + 33CC111F2044C79F0003C045 /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = 33CC10E52044A3C60003C045 /* Project object */; + proxyType = 1; + remoteGlobalIDString = 33CC111A2044C6BA0003C045; + remoteInfo = FLX; + }; +/* End PBXContainerItemProxy section */ + +/* Begin PBXCopyFilesBuildPhase section */ + 33CC110E2044A8840003C045 /* Bundle Framework */ = { + isa = PBXCopyFilesBuildPhase; + buildActionMask = 2147483647; + dstPath = ""; + dstSubfolderSpec = 10; + files = ( + ); + name = "Bundle Framework"; + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXCopyFilesBuildPhase section */ + +/* Begin PBXFileReference section */ + 1BAC6A324E6FF557C3F91CC6 /* Pods-RunnerTests.profile.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-RunnerTests.profile.xcconfig"; path = "Target Support Files/Pods-RunnerTests/Pods-RunnerTests.profile.xcconfig"; sourceTree = ""; }; + 331C80D5294CF71000263BE5 /* RunnerTests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = RunnerTests.xctest; sourceTree = BUILT_PRODUCTS_DIR; }; + 331C80D7294CF71000263BE5 /* RunnerTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = RunnerTests.swift; sourceTree = ""; }; + 333000ED22D3DE5D00554162 /* Warnings.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; path = Warnings.xcconfig; sourceTree = ""; }; + 335BBD1A22A9A15E00E9071D /* GeneratedPluginRegistrant.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = GeneratedPluginRegistrant.swift; sourceTree = ""; }; + 33CC10ED2044A3C60003C045 /* intaleq_driver.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = intaleq_driver.app; sourceTree = BUILT_PRODUCTS_DIR; }; + 33CC10F02044A3C60003C045 /* AppDelegate.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AppDelegate.swift; sourceTree = ""; }; + 33CC10F22044A3C60003C045 /* Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; name = Assets.xcassets; path = Runner/Assets.xcassets; sourceTree = ""; }; + 33CC10F52044A3C60003C045 /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.xib; name = Base; path = Base.lproj/MainMenu.xib; sourceTree = ""; }; + 33CC10F72044A3C60003C045 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; name = Info.plist; path = Runner/Info.plist; sourceTree = ""; }; + 33CC11122044BFA00003C045 /* MainFlutterWindow.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MainFlutterWindow.swift; sourceTree = ""; }; + 33CEB47222A05771004F2AC0 /* Flutter-Debug.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; path = "Flutter-Debug.xcconfig"; sourceTree = ""; }; + 33CEB47422A05771004F2AC0 /* Flutter-Release.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; path = "Flutter-Release.xcconfig"; sourceTree = ""; }; + 33CEB47722A0578A004F2AC0 /* Flutter-Generated.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; name = "Flutter-Generated.xcconfig"; path = "ephemeral/Flutter-Generated.xcconfig"; sourceTree = ""; }; + 33E51913231747F40026EE4D /* DebugProfile.entitlements */ = {isa = PBXFileReference; lastKnownFileType = text.plist.entitlements; path = DebugProfile.entitlements; sourceTree = ""; }; + 33E51914231749380026EE4D /* Release.entitlements */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.entitlements; path = Release.entitlements; sourceTree = ""; }; + 33E5194F232828860026EE4D /* AppInfo.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; path = AppInfo.xcconfig; sourceTree = ""; }; + 6217CA7F706FC13681FA60F8 /* Pods_Runner.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_Runner.framework; sourceTree = BUILT_PRODUCTS_DIR; }; + 79783EE5AB4ED4BDCEFBBD16 /* Pods-Runner.profile.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.profile.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.profile.xcconfig"; sourceTree = ""; }; + 7AFA3C8E1D35360C0083082E /* Release.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; path = Release.xcconfig; sourceTree = ""; }; + 8C2DCF18A2730282675ECA02 /* Pods-Runner.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.debug.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.debug.xcconfig"; sourceTree = ""; }; + 9740EEB21CF90195004384FC /* Debug.xcconfig */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xcconfig; path = Debug.xcconfig; sourceTree = ""; }; + C0868DE41C7CF4911C279A37 /* Pods-RunnerTests.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-RunnerTests.release.xcconfig"; path = "Target Support Files/Pods-RunnerTests/Pods-RunnerTests.release.xcconfig"; sourceTree = ""; }; + C32AD266D21269FA7C13F973 /* Pods-RunnerTests.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-RunnerTests.debug.xcconfig"; path = "Target Support Files/Pods-RunnerTests/Pods-RunnerTests.debug.xcconfig"; sourceTree = ""; }; + D29E2E815BCB73C8714D0003 /* Pods-Runner.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.release.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.release.xcconfig"; sourceTree = ""; }; + D480F849086FC3A6F134E111 /* Pods_RunnerTests.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_RunnerTests.framework; sourceTree = BUILT_PRODUCTS_DIR; }; +/* End PBXFileReference section */ + +/* Begin PBXFrameworksBuildPhase section */ + 331C80D2294CF70F00263BE5 /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( + FC1A260161869F5DA276D94C /* Pods_RunnerTests.framework in Frameworks */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + 33CC10EA2044A3C60003C045 /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( + AE3C694CAD8DE7FBA59BA5C5 /* Pods_Runner.framework in Frameworks */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXFrameworksBuildPhase section */ + +/* Begin PBXGroup section */ + 331C80D6294CF71000263BE5 /* RunnerTests */ = { + isa = PBXGroup; + children = ( + 331C80D7294CF71000263BE5 /* RunnerTests.swift */, + ); + path = RunnerTests; + sourceTree = ""; + }; + 33BA886A226E78AF003329D5 /* Configs */ = { + isa = PBXGroup; + children = ( + 33E5194F232828860026EE4D /* AppInfo.xcconfig */, + 9740EEB21CF90195004384FC /* Debug.xcconfig */, + 7AFA3C8E1D35360C0083082E /* Release.xcconfig */, + 333000ED22D3DE5D00554162 /* Warnings.xcconfig */, + ); + path = Configs; + sourceTree = ""; + }; + 33CC10E42044A3C60003C045 = { + isa = PBXGroup; + children = ( + 33FAB671232836740065AC1E /* Runner */, + 33CEB47122A05771004F2AC0 /* Flutter */, + 331C80D6294CF71000263BE5 /* RunnerTests */, + 33CC10EE2044A3C60003C045 /* Products */, + D73912EC22F37F3D000D13A0 /* Frameworks */, + BB5BD25C792C03AB60BE67B8 /* Pods */, + ); + sourceTree = ""; + }; + 33CC10EE2044A3C60003C045 /* Products */ = { + isa = PBXGroup; + children = ( + 33CC10ED2044A3C60003C045 /* intaleq_driver.app */, + 331C80D5294CF71000263BE5 /* RunnerTests.xctest */, + ); + name = Products; + sourceTree = ""; + }; + 33CC11242044D66E0003C045 /* Resources */ = { + isa = PBXGroup; + children = ( + 33CC10F22044A3C60003C045 /* Assets.xcassets */, + 33CC10F42044A3C60003C045 /* MainMenu.xib */, + 33CC10F72044A3C60003C045 /* Info.plist */, + ); + name = Resources; + path = ..; + sourceTree = ""; + }; + 33CEB47122A05771004F2AC0 /* Flutter */ = { + isa = PBXGroup; + children = ( + 335BBD1A22A9A15E00E9071D /* GeneratedPluginRegistrant.swift */, + 33CEB47222A05771004F2AC0 /* Flutter-Debug.xcconfig */, + 33CEB47422A05771004F2AC0 /* Flutter-Release.xcconfig */, + 33CEB47722A0578A004F2AC0 /* Flutter-Generated.xcconfig */, + ); + path = Flutter; + sourceTree = ""; + }; + 33FAB671232836740065AC1E /* Runner */ = { + isa = PBXGroup; + children = ( + 33CC10F02044A3C60003C045 /* AppDelegate.swift */, + 33CC11122044BFA00003C045 /* MainFlutterWindow.swift */, + 33E51913231747F40026EE4D /* DebugProfile.entitlements */, + 33E51914231749380026EE4D /* Release.entitlements */, + 33CC11242044D66E0003C045 /* Resources */, + 33BA886A226E78AF003329D5 /* Configs */, + ); + path = Runner; + sourceTree = ""; + }; + BB5BD25C792C03AB60BE67B8 /* Pods */ = { + isa = PBXGroup; + children = ( + 8C2DCF18A2730282675ECA02 /* Pods-Runner.debug.xcconfig */, + D29E2E815BCB73C8714D0003 /* Pods-Runner.release.xcconfig */, + 79783EE5AB4ED4BDCEFBBD16 /* Pods-Runner.profile.xcconfig */, + C32AD266D21269FA7C13F973 /* Pods-RunnerTests.debug.xcconfig */, + C0868DE41C7CF4911C279A37 /* Pods-RunnerTests.release.xcconfig */, + 1BAC6A324E6FF557C3F91CC6 /* Pods-RunnerTests.profile.xcconfig */, + ); + name = Pods; + path = Pods; + sourceTree = ""; + }; + D73912EC22F37F3D000D13A0 /* Frameworks */ = { + isa = PBXGroup; + children = ( + 6217CA7F706FC13681FA60F8 /* Pods_Runner.framework */, + D480F849086FC3A6F134E111 /* Pods_RunnerTests.framework */, + ); + name = Frameworks; + sourceTree = ""; + }; +/* End PBXGroup section */ + +/* Begin PBXNativeTarget section */ + 331C80D4294CF70F00263BE5 /* RunnerTests */ = { + isa = PBXNativeTarget; + buildConfigurationList = 331C80DE294CF71000263BE5 /* Build configuration list for PBXNativeTarget "RunnerTests" */; + buildPhases = ( + 763F6A08143799973D671394 /* [CP] Check Pods Manifest.lock */, + 331C80D1294CF70F00263BE5 /* Sources */, + 331C80D2294CF70F00263BE5 /* Frameworks */, + 331C80D3294CF70F00263BE5 /* Resources */, + ); + buildRules = ( + ); + dependencies = ( + 331C80DA294CF71000263BE5 /* PBXTargetDependency */, + ); + name = RunnerTests; + productName = RunnerTests; + productReference = 331C80D5294CF71000263BE5 /* RunnerTests.xctest */; + productType = "com.apple.product-type.bundle.unit-test"; + }; + 33CC10EC2044A3C60003C045 /* Runner */ = { + isa = PBXNativeTarget; + buildConfigurationList = 33CC10FB2044A3C60003C045 /* Build configuration list for PBXNativeTarget "Runner" */; + buildPhases = ( + B9933D84EF4176ED8D6C859B /* [CP] Check Pods Manifest.lock */, + 33CC10E92044A3C60003C045 /* Sources */, + 33CC10EA2044A3C60003C045 /* Frameworks */, + 33CC10EB2044A3C60003C045 /* Resources */, + 33CC110E2044A8840003C045 /* Bundle Framework */, + 3399D490228B24CF009A79C7 /* ShellScript */, + 402F53444CC2484D99582D94 /* [CP] Embed Pods Frameworks */, + 760177ACCED65E3685C1DC03 /* [CP] Copy Pods Resources */, + ); + buildRules = ( + ); + dependencies = ( + 33CC11202044C79F0003C045 /* PBXTargetDependency */, + ); + name = Runner; + productName = Runner; + productReference = 33CC10ED2044A3C60003C045 /* intaleq_driver.app */; + productType = "com.apple.product-type.application"; + }; +/* End PBXNativeTarget section */ + +/* Begin PBXProject section */ + 33CC10E52044A3C60003C045 /* Project object */ = { + isa = PBXProject; + attributes = { + BuildIndependentTargetsInParallel = YES; + LastSwiftUpdateCheck = 0920; + LastUpgradeCheck = 1510; + ORGANIZATIONNAME = ""; + TargetAttributes = { + 331C80D4294CF70F00263BE5 = { + CreatedOnToolsVersion = 14.0; + TestTargetID = 33CC10EC2044A3C60003C045; + }; + 33CC10EC2044A3C60003C045 = { + CreatedOnToolsVersion = 9.2; + LastSwiftMigration = 1100; + ProvisioningStyle = Automatic; + SystemCapabilities = { + com.apple.Sandbox = { + enabled = 1; + }; + }; + }; + 33CC111A2044C6BA0003C045 = { + CreatedOnToolsVersion = 9.2; + ProvisioningStyle = Manual; + }; + }; + }; + buildConfigurationList = 33CC10E82044A3C60003C045 /* Build configuration list for PBXProject "Runner" */; + compatibilityVersion = "Xcode 9.3"; + developmentRegion = en; + hasScannedForEncodings = 0; + knownRegions = ( + en, + Base, + ); + mainGroup = 33CC10E42044A3C60003C045; + productRefGroup = 33CC10EE2044A3C60003C045 /* Products */; + projectDirPath = ""; + projectRoot = ""; + targets = ( + 33CC10EC2044A3C60003C045 /* Runner */, + 331C80D4294CF70F00263BE5 /* RunnerTests */, + 33CC111A2044C6BA0003C045 /* Flutter Assemble */, + ); + }; +/* End PBXProject section */ + +/* Begin PBXResourcesBuildPhase section */ + 331C80D3294CF70F00263BE5 /* Resources */ = { + isa = PBXResourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + runOnlyForDeploymentPostprocessing = 0; + }; + 33CC10EB2044A3C60003C045 /* Resources */ = { + isa = PBXResourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + 33CC10F32044A3C60003C045 /* Assets.xcassets in Resources */, + 33CC10F62044A3C60003C045 /* MainMenu.xib in Resources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXResourcesBuildPhase section */ + +/* Begin PBXShellScriptBuildPhase section */ + 3399D490228B24CF009A79C7 /* ShellScript */ = { + isa = PBXShellScriptBuildPhase; + alwaysOutOfDate = 1; + buildActionMask = 2147483647; + files = ( + ); + inputFileListPaths = ( + ); + inputPaths = ( + ); + outputFileListPaths = ( + ); + outputPaths = ( + ); + runOnlyForDeploymentPostprocessing = 0; + shellPath = /bin/sh; + shellScript = "echo \"$PRODUCT_NAME.app\" > \"$PROJECT_DIR\"/Flutter/ephemeral/.app_filename && \"$FLUTTER_ROOT\"/packages/flutter_tools/bin/macos_assemble.sh embed\n"; + }; + 33CC111E2044C6BF0003C045 /* ShellScript */ = { + isa = PBXShellScriptBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + inputFileListPaths = ( + Flutter/ephemeral/FlutterInputs.xcfilelist, + ); + inputPaths = ( + Flutter/ephemeral/tripwire, + ); + outputFileListPaths = ( + Flutter/ephemeral/FlutterOutputs.xcfilelist, + ); + outputPaths = ( + ); + runOnlyForDeploymentPostprocessing = 0; + shellPath = /bin/sh; + shellScript = "\"$FLUTTER_ROOT\"/packages/flutter_tools/bin/macos_assemble.sh && touch Flutter/ephemeral/tripwire"; + }; + 402F53444CC2484D99582D94 /* [CP] Embed Pods Frameworks */ = { + isa = PBXShellScriptBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + inputFileListPaths = ( + "${PODS_ROOT}/Target Support Files/Pods-Runner/Pods-Runner-frameworks-${CONFIGURATION}-input-files.xcfilelist", + ); + name = "[CP] Embed Pods Frameworks"; + outputFileListPaths = ( + "${PODS_ROOT}/Target Support Files/Pods-Runner/Pods-Runner-frameworks-${CONFIGURATION}-output-files.xcfilelist", + ); + runOnlyForDeploymentPostprocessing = 0; + shellPath = /bin/sh; + shellScript = "\"${PODS_ROOT}/Target Support Files/Pods-Runner/Pods-Runner-frameworks.sh\"\n"; + showEnvVarsInLog = 0; + }; + 760177ACCED65E3685C1DC03 /* [CP] Copy Pods Resources */ = { + isa = PBXShellScriptBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + inputFileListPaths = ( + "${PODS_ROOT}/Target Support Files/Pods-Runner/Pods-Runner-resources-${CONFIGURATION}-input-files.xcfilelist", + ); + name = "[CP] Copy Pods Resources"; + outputFileListPaths = ( + "${PODS_ROOT}/Target Support Files/Pods-Runner/Pods-Runner-resources-${CONFIGURATION}-output-files.xcfilelist", + ); + runOnlyForDeploymentPostprocessing = 0; + shellPath = /bin/sh; + shellScript = "\"${PODS_ROOT}/Target Support Files/Pods-Runner/Pods-Runner-resources.sh\"\n"; + showEnvVarsInLog = 0; + }; + 763F6A08143799973D671394 /* [CP] Check Pods Manifest.lock */ = { + isa = PBXShellScriptBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + inputFileListPaths = ( + ); + inputPaths = ( + "${PODS_PODFILE_DIR_PATH}/Podfile.lock", + "${PODS_ROOT}/Manifest.lock", + ); + name = "[CP] Check Pods Manifest.lock"; + outputFileListPaths = ( + ); + outputPaths = ( + "$(DERIVED_FILE_DIR)/Pods-RunnerTests-checkManifestLockResult.txt", + ); + runOnlyForDeploymentPostprocessing = 0; + shellPath = /bin/sh; + shellScript = "diff \"${PODS_PODFILE_DIR_PATH}/Podfile.lock\" \"${PODS_ROOT}/Manifest.lock\" > /dev/null\nif [ $? != 0 ] ; then\n # print error to STDERR\n echo \"error: The sandbox is not in sync with the Podfile.lock. Run 'pod install' or update your CocoaPods installation.\" >&2\n exit 1\nfi\n# This output is used by Xcode 'outputs' to avoid re-running this script phase.\necho \"SUCCESS\" > \"${SCRIPT_OUTPUT_FILE_0}\"\n"; + showEnvVarsInLog = 0; + }; + B9933D84EF4176ED8D6C859B /* [CP] Check Pods Manifest.lock */ = { + isa = PBXShellScriptBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + inputFileListPaths = ( + ); + inputPaths = ( + "${PODS_PODFILE_DIR_PATH}/Podfile.lock", + "${PODS_ROOT}/Manifest.lock", + ); + name = "[CP] Check Pods Manifest.lock"; + outputFileListPaths = ( + ); + outputPaths = ( + "$(DERIVED_FILE_DIR)/Pods-Runner-checkManifestLockResult.txt", + ); + runOnlyForDeploymentPostprocessing = 0; + shellPath = /bin/sh; + shellScript = "diff \"${PODS_PODFILE_DIR_PATH}/Podfile.lock\" \"${PODS_ROOT}/Manifest.lock\" > /dev/null\nif [ $? != 0 ] ; then\n # print error to STDERR\n echo \"error: The sandbox is not in sync with the Podfile.lock. Run 'pod install' or update your CocoaPods installation.\" >&2\n exit 1\nfi\n# This output is used by Xcode 'outputs' to avoid re-running this script phase.\necho \"SUCCESS\" > \"${SCRIPT_OUTPUT_FILE_0}\"\n"; + showEnvVarsInLog = 0; + }; +/* End PBXShellScriptBuildPhase section */ + +/* Begin PBXSourcesBuildPhase section */ + 331C80D1294CF70F00263BE5 /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + 331C80D8294CF71000263BE5 /* RunnerTests.swift in Sources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + 33CC10E92044A3C60003C045 /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + 33CC11132044BFA00003C045 /* MainFlutterWindow.swift in Sources */, + 33CC10F12044A3C60003C045 /* AppDelegate.swift in Sources */, + 335BBD1B22A9A15E00E9071D /* GeneratedPluginRegistrant.swift in Sources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXSourcesBuildPhase section */ + +/* Begin PBXTargetDependency section */ + 331C80DA294CF71000263BE5 /* PBXTargetDependency */ = { + isa = PBXTargetDependency; + target = 33CC10EC2044A3C60003C045 /* Runner */; + targetProxy = 331C80D9294CF71000263BE5 /* PBXContainerItemProxy */; + }; + 33CC11202044C79F0003C045 /* PBXTargetDependency */ = { + isa = PBXTargetDependency; + target = 33CC111A2044C6BA0003C045 /* Flutter Assemble */; + targetProxy = 33CC111F2044C79F0003C045 /* PBXContainerItemProxy */; + }; +/* End PBXTargetDependency section */ + +/* Begin PBXVariantGroup section */ + 33CC10F42044A3C60003C045 /* MainMenu.xib */ = { + isa = PBXVariantGroup; + children = ( + 33CC10F52044A3C60003C045 /* Base */, + ); + name = MainMenu.xib; + path = Runner; + sourceTree = ""; + }; +/* End PBXVariantGroup section */ + +/* Begin XCBuildConfiguration section */ + 331C80DB294CF71000263BE5 /* Debug */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = C32AD266D21269FA7C13F973 /* Pods-RunnerTests.debug.xcconfig */; + buildSettings = { + BUNDLE_LOADER = "$(TEST_HOST)"; + CURRENT_PROJECT_VERSION = 1; + GENERATE_INFOPLIST_FILE = YES; + MARKETING_VERSION = 1.0; + PRODUCT_BUNDLE_IDENTIFIER = com.example.intaleqDriver.RunnerTests; + PRODUCT_NAME = "$(TARGET_NAME)"; + SWIFT_VERSION = 5.0; + TEST_HOST = "$(BUILT_PRODUCTS_DIR)/intaleq_driver.app/$(BUNDLE_EXECUTABLE_FOLDER_PATH)/intaleq_driver"; + }; + name = Debug; + }; + 331C80DC294CF71000263BE5 /* Release */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = C0868DE41C7CF4911C279A37 /* Pods-RunnerTests.release.xcconfig */; + buildSettings = { + BUNDLE_LOADER = "$(TEST_HOST)"; + CURRENT_PROJECT_VERSION = 1; + GENERATE_INFOPLIST_FILE = YES; + MARKETING_VERSION = 1.0; + PRODUCT_BUNDLE_IDENTIFIER = com.example.intaleqDriver.RunnerTests; + PRODUCT_NAME = "$(TARGET_NAME)"; + SWIFT_VERSION = 5.0; + TEST_HOST = "$(BUILT_PRODUCTS_DIR)/intaleq_driver.app/$(BUNDLE_EXECUTABLE_FOLDER_PATH)/intaleq_driver"; + }; + name = Release; + }; + 331C80DD294CF71000263BE5 /* Profile */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = 1BAC6A324E6FF557C3F91CC6 /* Pods-RunnerTests.profile.xcconfig */; + buildSettings = { + BUNDLE_LOADER = "$(TEST_HOST)"; + CURRENT_PROJECT_VERSION = 1; + GENERATE_INFOPLIST_FILE = YES; + MARKETING_VERSION = 1.0; + PRODUCT_BUNDLE_IDENTIFIER = com.example.intaleqDriver.RunnerTests; + PRODUCT_NAME = "$(TARGET_NAME)"; + SWIFT_VERSION = 5.0; + TEST_HOST = "$(BUILT_PRODUCTS_DIR)/intaleq_driver.app/$(BUNDLE_EXECUTABLE_FOLDER_PATH)/intaleq_driver"; + }; + name = Profile; + }; + 338D0CE9231458BD00FA5F75 /* Profile */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = 7AFA3C8E1D35360C0083082E /* Release.xcconfig */; + buildSettings = { + ALWAYS_SEARCH_USER_PATHS = NO; + ASSETCATALOG_COMPILER_GENERATE_SWIFT_ASSET_SYMBOL_EXTENSIONS = YES; + CLANG_ANALYZER_NONNULL = YES; + CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE; + CLANG_CXX_LANGUAGE_STANDARD = "gnu++14"; + CLANG_CXX_LIBRARY = "libc++"; + CLANG_ENABLE_MODULES = YES; + CLANG_ENABLE_OBJC_ARC = YES; + CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; + CLANG_WARN_BOOL_CONVERSION = YES; + CLANG_WARN_CONSTANT_CONVERSION = YES; + CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; + CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; + CLANG_WARN_DOCUMENTATION_COMMENTS = YES; + CLANG_WARN_EMPTY_BODY = YES; + CLANG_WARN_ENUM_CONVERSION = YES; + CLANG_WARN_INFINITE_RECURSION = YES; + CLANG_WARN_INT_CONVERSION = YES; + CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; + CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; + CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; + CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; + CLANG_WARN_SUSPICIOUS_MOVE = YES; + CODE_SIGN_IDENTITY = "-"; + COPY_PHASE_STRIP = NO; + DEAD_CODE_STRIPPING = YES; + DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; + ENABLE_NS_ASSERTIONS = NO; + ENABLE_STRICT_OBJC_MSGSEND = YES; + ENABLE_USER_SCRIPT_SANDBOXING = NO; + GCC_C_LANGUAGE_STANDARD = gnu11; + GCC_NO_COMMON_BLOCKS = YES; + GCC_WARN_64_TO_32_BIT_CONVERSION = YES; + GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; + GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; + GCC_WARN_UNUSED_FUNCTION = YES; + GCC_WARN_UNUSED_VARIABLE = YES; + MACOSX_DEPLOYMENT_TARGET = 10.15; + MTL_ENABLE_DEBUG_INFO = NO; + SDKROOT = macosx; + SWIFT_COMPILATION_MODE = wholemodule; + SWIFT_OPTIMIZATION_LEVEL = "-O"; + }; + name = Profile; + }; + 338D0CEA231458BD00FA5F75 /* Profile */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = 33E5194F232828860026EE4D /* AppInfo.xcconfig */; + buildSettings = { + ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; + CLANG_ENABLE_MODULES = YES; + CODE_SIGN_ENTITLEMENTS = Runner/DebugProfile.entitlements; + CODE_SIGN_STYLE = Automatic; + COMBINE_HIDPI_IMAGES = YES; + INFOPLIST_FILE = Runner/Info.plist; + LD_RUNPATH_SEARCH_PATHS = ( + "$(inherited)", + "@executable_path/../Frameworks", + ); + PROVISIONING_PROFILE_SPECIFIER = ""; + SWIFT_VERSION = 5.0; + }; + name = Profile; + }; + 338D0CEB231458BD00FA5F75 /* Profile */ = { + isa = XCBuildConfiguration; + buildSettings = { + CODE_SIGN_STYLE = Manual; + PRODUCT_NAME = "$(TARGET_NAME)"; + }; + name = Profile; + }; + 33CC10F92044A3C60003C045 /* Debug */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = 9740EEB21CF90195004384FC /* Debug.xcconfig */; + buildSettings = { + ALWAYS_SEARCH_USER_PATHS = NO; + ASSETCATALOG_COMPILER_GENERATE_SWIFT_ASSET_SYMBOL_EXTENSIONS = YES; + CLANG_ANALYZER_NONNULL = YES; + CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE; + CLANG_CXX_LANGUAGE_STANDARD = "gnu++14"; + CLANG_CXX_LIBRARY = "libc++"; + CLANG_ENABLE_MODULES = YES; + CLANG_ENABLE_OBJC_ARC = YES; + CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; + CLANG_WARN_BOOL_CONVERSION = YES; + CLANG_WARN_CONSTANT_CONVERSION = YES; + CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; + CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; + CLANG_WARN_DOCUMENTATION_COMMENTS = YES; + CLANG_WARN_EMPTY_BODY = YES; + CLANG_WARN_ENUM_CONVERSION = YES; + CLANG_WARN_INFINITE_RECURSION = YES; + CLANG_WARN_INT_CONVERSION = YES; + CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; + CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; + CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; + CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; + CLANG_WARN_SUSPICIOUS_MOVE = YES; + CODE_SIGN_IDENTITY = "-"; + COPY_PHASE_STRIP = NO; + DEAD_CODE_STRIPPING = YES; + DEBUG_INFORMATION_FORMAT = dwarf; + ENABLE_STRICT_OBJC_MSGSEND = YES; + ENABLE_TESTABILITY = YES; + ENABLE_USER_SCRIPT_SANDBOXING = NO; + GCC_C_LANGUAGE_STANDARD = gnu11; + GCC_DYNAMIC_NO_PIC = NO; + GCC_NO_COMMON_BLOCKS = YES; + GCC_OPTIMIZATION_LEVEL = 0; + GCC_PREPROCESSOR_DEFINITIONS = ( + "DEBUG=1", + "$(inherited)", + ); + GCC_WARN_64_TO_32_BIT_CONVERSION = YES; + GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; + GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; + GCC_WARN_UNUSED_FUNCTION = YES; + GCC_WARN_UNUSED_VARIABLE = YES; + MACOSX_DEPLOYMENT_TARGET = 10.15; + MTL_ENABLE_DEBUG_INFO = YES; + ONLY_ACTIVE_ARCH = YES; + SDKROOT = macosx; + SWIFT_ACTIVE_COMPILATION_CONDITIONS = DEBUG; + SWIFT_OPTIMIZATION_LEVEL = "-Onone"; + }; + name = Debug; + }; + 33CC10FA2044A3C60003C045 /* Release */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = 7AFA3C8E1D35360C0083082E /* Release.xcconfig */; + buildSettings = { + ALWAYS_SEARCH_USER_PATHS = NO; + ASSETCATALOG_COMPILER_GENERATE_SWIFT_ASSET_SYMBOL_EXTENSIONS = YES; + CLANG_ANALYZER_NONNULL = YES; + CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE; + CLANG_CXX_LANGUAGE_STANDARD = "gnu++14"; + CLANG_CXX_LIBRARY = "libc++"; + CLANG_ENABLE_MODULES = YES; + CLANG_ENABLE_OBJC_ARC = YES; + CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; + CLANG_WARN_BOOL_CONVERSION = YES; + CLANG_WARN_CONSTANT_CONVERSION = YES; + CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; + CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; + CLANG_WARN_DOCUMENTATION_COMMENTS = YES; + CLANG_WARN_EMPTY_BODY = YES; + CLANG_WARN_ENUM_CONVERSION = YES; + CLANG_WARN_INFINITE_RECURSION = YES; + CLANG_WARN_INT_CONVERSION = YES; + CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; + CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; + CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; + CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; + CLANG_WARN_SUSPICIOUS_MOVE = YES; + CODE_SIGN_IDENTITY = "-"; + COPY_PHASE_STRIP = NO; + DEAD_CODE_STRIPPING = YES; + DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; + ENABLE_NS_ASSERTIONS = NO; + ENABLE_STRICT_OBJC_MSGSEND = YES; + ENABLE_USER_SCRIPT_SANDBOXING = NO; + GCC_C_LANGUAGE_STANDARD = gnu11; + GCC_NO_COMMON_BLOCKS = YES; + GCC_WARN_64_TO_32_BIT_CONVERSION = YES; + GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; + GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; + GCC_WARN_UNUSED_FUNCTION = YES; + GCC_WARN_UNUSED_VARIABLE = YES; + MACOSX_DEPLOYMENT_TARGET = 10.15; + MTL_ENABLE_DEBUG_INFO = NO; + SDKROOT = macosx; + SWIFT_COMPILATION_MODE = wholemodule; + SWIFT_OPTIMIZATION_LEVEL = "-O"; + }; + name = Release; + }; + 33CC10FC2044A3C60003C045 /* Debug */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = 33E5194F232828860026EE4D /* AppInfo.xcconfig */; + buildSettings = { + ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; + CLANG_ENABLE_MODULES = YES; + CODE_SIGN_ENTITLEMENTS = Runner/DebugProfile.entitlements; + CODE_SIGN_STYLE = Automatic; + COMBINE_HIDPI_IMAGES = YES; + INFOPLIST_FILE = Runner/Info.plist; + LD_RUNPATH_SEARCH_PATHS = ( + "$(inherited)", + "@executable_path/../Frameworks", + ); + PROVISIONING_PROFILE_SPECIFIER = ""; + SWIFT_OPTIMIZATION_LEVEL = "-Onone"; + SWIFT_VERSION = 5.0; + }; + name = Debug; + }; + 33CC10FD2044A3C60003C045 /* Release */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = 33E5194F232828860026EE4D /* AppInfo.xcconfig */; + buildSettings = { + ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; + CLANG_ENABLE_MODULES = YES; + CODE_SIGN_ENTITLEMENTS = Runner/Release.entitlements; + CODE_SIGN_STYLE = Automatic; + COMBINE_HIDPI_IMAGES = YES; + INFOPLIST_FILE = Runner/Info.plist; + LD_RUNPATH_SEARCH_PATHS = ( + "$(inherited)", + "@executable_path/../Frameworks", + ); + PROVISIONING_PROFILE_SPECIFIER = ""; + SWIFT_VERSION = 5.0; + }; + name = Release; + }; + 33CC111C2044C6BA0003C045 /* Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + CODE_SIGN_STYLE = Manual; + PRODUCT_NAME = "$(TARGET_NAME)"; + }; + name = Debug; + }; + 33CC111D2044C6BA0003C045 /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + CODE_SIGN_STYLE = Automatic; + PRODUCT_NAME = "$(TARGET_NAME)"; + }; + name = Release; + }; +/* End XCBuildConfiguration section */ + +/* Begin XCConfigurationList section */ + 331C80DE294CF71000263BE5 /* Build configuration list for PBXNativeTarget "RunnerTests" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 331C80DB294CF71000263BE5 /* Debug */, + 331C80DC294CF71000263BE5 /* Release */, + 331C80DD294CF71000263BE5 /* Profile */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; + 33CC10E82044A3C60003C045 /* Build configuration list for PBXProject "Runner" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 33CC10F92044A3C60003C045 /* Debug */, + 33CC10FA2044A3C60003C045 /* Release */, + 338D0CE9231458BD00FA5F75 /* Profile */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; + 33CC10FB2044A3C60003C045 /* Build configuration list for PBXNativeTarget "Runner" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 33CC10FC2044A3C60003C045 /* Debug */, + 33CC10FD2044A3C60003C045 /* Release */, + 338D0CEA231458BD00FA5F75 /* Profile */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; + 33CC111B2044C6BA0003C045 /* Build configuration list for PBXAggregateTarget "Flutter Assemble" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 33CC111C2044C6BA0003C045 /* Debug */, + 33CC111D2044C6BA0003C045 /* Release */, + 338D0CEB231458BD00FA5F75 /* Profile */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; +/* End XCConfigurationList section */ + }; + rootObject = 33CC10E52044A3C60003C045 /* Project object */; +} diff --git a/siro_driver/macos/Runner.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist b/siro_driver/macos/Runner.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist new file mode 100644 index 0000000..18d9810 --- /dev/null +++ b/siro_driver/macos/Runner.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist @@ -0,0 +1,8 @@ + + + + + IDEDidComputeMac32BitWarning + + + diff --git a/siro_driver/macos/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme b/siro_driver/macos/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme new file mode 100644 index 0000000..533c095 --- /dev/null +++ b/siro_driver/macos/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme @@ -0,0 +1,99 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/siro_driver/macos/Runner.xcworkspace/contents.xcworkspacedata b/siro_driver/macos/Runner.xcworkspace/contents.xcworkspacedata new file mode 100644 index 0000000..21a3cc1 --- /dev/null +++ b/siro_driver/macos/Runner.xcworkspace/contents.xcworkspacedata @@ -0,0 +1,10 @@ + + + + + + + diff --git a/siro_driver/macos/Runner.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist b/siro_driver/macos/Runner.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist new file mode 100644 index 0000000..18d9810 --- /dev/null +++ b/siro_driver/macos/Runner.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist @@ -0,0 +1,8 @@ + + + + + IDEDidComputeMac32BitWarning + + + diff --git a/siro_driver/macos/Runner/AppDelegate.swift b/siro_driver/macos/Runner/AppDelegate.swift new file mode 100644 index 0000000..b3c1761 --- /dev/null +++ b/siro_driver/macos/Runner/AppDelegate.swift @@ -0,0 +1,13 @@ +import Cocoa +import FlutterMacOS + +@main +class AppDelegate: FlutterAppDelegate { + override func applicationShouldTerminateAfterLastWindowClosed(_ sender: NSApplication) -> Bool { + return true + } + + override func applicationSupportsSecureRestorableState(_ app: NSApplication) -> Bool { + return true + } +} diff --git a/siro_driver/macos/Runner/Assets.xcassets/AppIcon.appiconset/Contents.json b/siro_driver/macos/Runner/Assets.xcassets/AppIcon.appiconset/Contents.json new file mode 100644 index 0000000..96d3fee --- /dev/null +++ b/siro_driver/macos/Runner/Assets.xcassets/AppIcon.appiconset/Contents.json @@ -0,0 +1,68 @@ +{ + "info": { + "version": 1, + "author": "xcode" + }, + "images": [ + { + "size": "16x16", + "idiom": "mac", + "filename": "app_icon_16.png", + "scale": "1x" + }, + { + "size": "16x16", + "idiom": "mac", + "filename": "app_icon_32.png", + "scale": "2x" + }, + { + "size": "32x32", + "idiom": "mac", + "filename": "app_icon_32.png", + "scale": "1x" + }, + { + "size": "32x32", + "idiom": "mac", + "filename": "app_icon_64.png", + "scale": "2x" + }, + { + "size": "128x128", + "idiom": "mac", + "filename": "app_icon_128.png", + "scale": "1x" + }, + { + "size": "128x128", + "idiom": "mac", + "filename": "app_icon_256.png", + "scale": "2x" + }, + { + "size": "256x256", + "idiom": "mac", + "filename": "app_icon_256.png", + "scale": "1x" + }, + { + "size": "256x256", + "idiom": "mac", + "filename": "app_icon_512.png", + "scale": "2x" + }, + { + "size": "512x512", + "idiom": "mac", + "filename": "app_icon_512.png", + "scale": "1x" + }, + { + "size": "512x512", + "idiom": "mac", + "filename": "app_icon_1024.png", + "scale": "2x" + } + ] +} \ No newline at end of file diff --git a/siro_driver/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_1024.png b/siro_driver/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_1024.png new file mode 100644 index 0000000..4d0ffc0 Binary files /dev/null and b/siro_driver/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_1024.png differ diff --git a/siro_driver/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_128.png b/siro_driver/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_128.png new file mode 100644 index 0000000..80234de Binary files /dev/null and b/siro_driver/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_128.png differ diff --git a/siro_driver/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_16.png b/siro_driver/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_16.png new file mode 100644 index 0000000..7119d73 Binary files /dev/null and b/siro_driver/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_16.png differ diff --git a/siro_driver/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_256.png b/siro_driver/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_256.png new file mode 100644 index 0000000..8b3ec59 Binary files /dev/null and b/siro_driver/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_256.png differ diff --git a/siro_driver/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_32.png b/siro_driver/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_32.png new file mode 100644 index 0000000..053a209 Binary files /dev/null and b/siro_driver/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_32.png differ diff --git a/siro_driver/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_512.png b/siro_driver/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_512.png new file mode 100644 index 0000000..58b9d33 Binary files /dev/null and b/siro_driver/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_512.png differ diff --git a/siro_driver/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_64.png b/siro_driver/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_64.png new file mode 100644 index 0000000..570dd3e Binary files /dev/null and b/siro_driver/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_64.png differ diff --git a/siro_driver/macos/Runner/Base.lproj/MainMenu.xib b/siro_driver/macos/Runner/Base.lproj/MainMenu.xib new file mode 100644 index 0000000..80e867a --- /dev/null +++ b/siro_driver/macos/Runner/Base.lproj/MainMenu.xib @@ -0,0 +1,343 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/siro_driver/macos/Runner/Configs/AppInfo.xcconfig b/siro_driver/macos/Runner/Configs/AppInfo.xcconfig new file mode 100644 index 0000000..ec089b2 --- /dev/null +++ b/siro_driver/macos/Runner/Configs/AppInfo.xcconfig @@ -0,0 +1,14 @@ +// Application-level settings for the Runner target. +// +// This may be replaced with something auto-generated from metadata (e.g., pubspec.yaml) in the +// future. If not, the values below would default to using the project name when this becomes a +// 'flutter create' template. + +// The application's name. By default this is also the title of the Flutter window. +PRODUCT_NAME = intaleq_driver + +// The application's bundle identifier +PRODUCT_BUNDLE_IDENTIFIER = com.example.intaleqDriver + +// The copyright displayed in application information +PRODUCT_COPYRIGHT = Copyright © 2025 com.example. All rights reserved. diff --git a/siro_driver/macos/Runner/Configs/Debug.xcconfig b/siro_driver/macos/Runner/Configs/Debug.xcconfig new file mode 100644 index 0000000..36b0fd9 --- /dev/null +++ b/siro_driver/macos/Runner/Configs/Debug.xcconfig @@ -0,0 +1,2 @@ +#include "../../Flutter/Flutter-Debug.xcconfig" +#include "Warnings.xcconfig" diff --git a/siro_driver/macos/Runner/Configs/Release.xcconfig b/siro_driver/macos/Runner/Configs/Release.xcconfig new file mode 100644 index 0000000..dff4f49 --- /dev/null +++ b/siro_driver/macos/Runner/Configs/Release.xcconfig @@ -0,0 +1,2 @@ +#include "../../Flutter/Flutter-Release.xcconfig" +#include "Warnings.xcconfig" diff --git a/siro_driver/macos/Runner/Configs/Warnings.xcconfig b/siro_driver/macos/Runner/Configs/Warnings.xcconfig new file mode 100644 index 0000000..42bcbf4 --- /dev/null +++ b/siro_driver/macos/Runner/Configs/Warnings.xcconfig @@ -0,0 +1,13 @@ +WARNING_CFLAGS = -Wall -Wconditional-uninitialized -Wnullable-to-nonnull-conversion -Wmissing-method-return-type -Woverlength-strings +GCC_WARN_UNDECLARED_SELECTOR = YES +CLANG_UNDEFINED_BEHAVIOR_SANITIZER_NULLABILITY = YES +CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE +CLANG_WARN__DUPLICATE_METHOD_MATCH = YES +CLANG_WARN_PRAGMA_PACK = YES +CLANG_WARN_STRICT_PROTOTYPES = YES +CLANG_WARN_COMMA = YES +GCC_WARN_STRICT_SELECTOR_MATCH = YES +CLANG_WARN_OBJC_REPEATED_USE_OF_WEAK = YES +CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES +GCC_WARN_SHADOW = YES +CLANG_WARN_UNREACHABLE_CODE = YES diff --git a/siro_driver/macos/Runner/DebugProfile.entitlements b/siro_driver/macos/Runner/DebugProfile.entitlements new file mode 100644 index 0000000..dddb8a3 --- /dev/null +++ b/siro_driver/macos/Runner/DebugProfile.entitlements @@ -0,0 +1,12 @@ + + + + + com.apple.security.app-sandbox + + com.apple.security.cs.allow-jit + + com.apple.security.network.server + + + diff --git a/siro_driver/macos/Runner/Info.plist b/siro_driver/macos/Runner/Info.plist new file mode 100644 index 0000000..4789daa --- /dev/null +++ b/siro_driver/macos/Runner/Info.plist @@ -0,0 +1,32 @@ + + + + + CFBundleDevelopmentRegion + $(DEVELOPMENT_LANGUAGE) + CFBundleExecutable + $(EXECUTABLE_NAME) + CFBundleIconFile + + CFBundleIdentifier + $(PRODUCT_BUNDLE_IDENTIFIER) + CFBundleInfoDictionaryVersion + 6.0 + CFBundleName + $(PRODUCT_NAME) + CFBundlePackageType + APPL + CFBundleShortVersionString + $(FLUTTER_BUILD_NAME) + CFBundleVersion + $(FLUTTER_BUILD_NUMBER) + LSMinimumSystemVersion + $(MACOSX_DEPLOYMENT_TARGET) + NSHumanReadableCopyright + $(PRODUCT_COPYRIGHT) + NSMainNibFile + MainMenu + NSPrincipalClass + NSApplication + + diff --git a/siro_driver/macos/Runner/MainFlutterWindow.swift b/siro_driver/macos/Runner/MainFlutterWindow.swift new file mode 100644 index 0000000..3cc05eb --- /dev/null +++ b/siro_driver/macos/Runner/MainFlutterWindow.swift @@ -0,0 +1,15 @@ +import Cocoa +import FlutterMacOS + +class MainFlutterWindow: NSWindow { + override func awakeFromNib() { + let flutterViewController = FlutterViewController() + let windowFrame = self.frame + self.contentViewController = flutterViewController + self.setFrame(windowFrame, display: true) + + RegisterGeneratedPlugins(registry: flutterViewController) + + super.awakeFromNib() + } +} diff --git a/siro_driver/macos/Runner/Release.entitlements b/siro_driver/macos/Runner/Release.entitlements new file mode 100644 index 0000000..f9105be --- /dev/null +++ b/siro_driver/macos/Runner/Release.entitlements @@ -0,0 +1,12 @@ + + + + + com.apple.security.app-sandbox + + com.apple.security.cs.allow-unsigned-executable-memory + + com.apple.security.network.client + + + diff --git a/siro_driver/macos/RunnerTests/RunnerTests.swift b/siro_driver/macos/RunnerTests/RunnerTests.swift new file mode 100644 index 0000000..61f3bd1 --- /dev/null +++ b/siro_driver/macos/RunnerTests/RunnerTests.swift @@ -0,0 +1,12 @@ +import Cocoa +import FlutterMacOS +import XCTest + +class RunnerTests: XCTestCase { + + func testExample() { + // If you add code to the Runner application, consider adding tests here. + // See https://developer.apple.com/documentation/xctest for more information about using XCTest. + } + +} diff --git a/siro_driver/pubspec.lock b/siro_driver/pubspec.lock new file mode 100644 index 0000000..d9c8862 --- /dev/null +++ b/siro_driver/pubspec.lock @@ -0,0 +1,2452 @@ +# Generated by pub +# See https://dart.dev/tools/pub/glossary#lockfile +packages: + _fe_analyzer_shared: + dependency: transitive + description: + name: _fe_analyzer_shared + sha256: "8d7ff3948166b8ec5da0fbb5962000926b8e02f2ed9b3e51d1738905fbd4c98d" + url: "https://pub.dev" + source: hosted + version: "93.0.0" + _flutterfire_internals: + dependency: transitive + description: + name: _flutterfire_internals + sha256: "0d1f0adfabbab9f46a1a80ce84a4d8b852b6e4dbf53ce413b30e0cf7d3631b71" + url: "https://pub.dev" + source: hosted + version: "1.3.72" + analyzer: + dependency: transitive + description: + name: analyzer + sha256: de7148ed2fcec579b19f122c1800933dfa028f6d9fd38a152b04b1516cec120b + url: "https://pub.dev" + source: hosted + version: "10.0.1" + animated_text_kit: + dependency: "direct main" + description: + name: animated_text_kit + sha256: "1d41486860885321972dd332179357a535d50d4780fc2ba5e1805bde085c81f2" + url: "https://pub.dev" + source: hosted + version: "4.3.0" + archive: + dependency: transitive + description: + name: archive + sha256: a96e8b390886ee8abb49b7bd3ac8df6f451c621619f52a26e815fdcf568959ff + url: "https://pub.dev" + source: hosted + version: "4.0.9" + args: + dependency: transitive + description: + name: args + sha256: d0481093c50b1da8910eb0bb301626d4d8eb7284aa739614d2b394ee09e3ea04 + url: "https://pub.dev" + source: hosted + version: "2.7.0" + asn1lib: + dependency: transitive + description: + name: asn1lib + sha256: "9a8f69025044eb466b9b60ef3bc3ac99b4dc6c158ae9c56d25eeccf5bc56d024" + url: "https://pub.dev" + source: hosted + version: "1.6.5" + async: + dependency: transitive + description: + name: async + sha256: e2eb0491ba5ddb6177742d2da23904574082139b07c1e33b8503b9f46f3e1a37 + url: "https://pub.dev" + source: hosted + version: "2.13.1" + audio_session: + dependency: transitive + description: + name: audio_session + sha256: "7217b229db57cc4dc577a8abb56b7429a5a212b978517a5be578704bfe5e568b" + url: "https://pub.dev" + source: hosted + version: "0.2.3" + battery_plus: + dependency: "direct main" + description: + name: battery_plus + sha256: ad16fcb55b7384be6b4bbc763d5e2031ac7ea62b2d9b6b661490c7b9741155bf + url: "https://pub.dev" + source: hosted + version: "7.0.0" + battery_plus_platform_interface: + dependency: transitive + description: + name: battery_plus_platform_interface + sha256: e8342c0f32de4b1dfd0223114b6785e48e579bfc398da9471c9179b907fa4910 + url: "https://pub.dev" + source: hosted + version: "2.0.1" + boolean_selector: + dependency: transitive + description: + name: boolean_selector + sha256: "8aab1771e1243a5063b8b0ff68042d67334e3feab9e95b9490f9a6ebf73b42ea" + url: "https://pub.dev" + source: hosted + version: "2.1.2" + bubble_head: + dependency: "direct main" + description: + path: bubble-master + relative: true + source: path + version: "0.0.4" + build: + dependency: transitive + description: + name: build + sha256: a156715e7cd728130c592f30552575908aae5b100005fbc1f0fb16b3c03a3d10 + url: "https://pub.dev" + source: hosted + version: "4.0.6" + build_config: + dependency: transitive + description: + name: build_config + sha256: "4070d2a59f8eec34c97c86ceb44403834899075f66e8a9d59706f8e7834f6f71" + url: "https://pub.dev" + source: hosted + version: "1.3.0" + build_daemon: + dependency: transitive + description: + name: build_daemon + sha256: bf05f6e12cfea92d3c09308d7bcdab1906cd8a179b023269eed00c071004b957 + url: "https://pub.dev" + source: hosted + version: "4.1.1" + build_runner: + dependency: "direct dev" + description: + name: build_runner + sha256: "1523ce62448ebac2c15a8ba5fbad8acac169788658a7dd2a1c2d9c2a9318b9a6" + url: "https://pub.dev" + source: hosted + version: "2.15.0" + built_collection: + dependency: transitive + description: + name: built_collection + sha256: "376e3dd27b51ea877c28d525560790aee2e6fbb5f20e2f85d5081027d94e2100" + url: "https://pub.dev" + source: hosted + version: "5.1.1" + built_value: + dependency: transitive + description: + name: built_value + sha256: "34e4067d30ce212937df995f03b69992eea683539ceeac7f679a1f1eba055b56" + url: "https://pub.dev" + source: hosted + version: "8.12.6" + cached_network_image: + dependency: transitive + description: + name: cached_network_image + sha256: "7c1183e361e5c8b0a0f21a28401eecdbde252441106a9816400dd4c2b2424916" + url: "https://pub.dev" + source: hosted + version: "3.4.1" + cached_network_image_platform_interface: + dependency: transitive + description: + name: cached_network_image_platform_interface + sha256: "35814b016e37fbdc91f7ae18c8caf49ba5c88501813f73ce8a07027a395e2829" + url: "https://pub.dev" + source: hosted + version: "4.1.1" + cached_network_image_web: + dependency: transitive + description: + name: cached_network_image_web + sha256: "980842f4e8e2535b8dbd3d5ca0b1f0ba66bf61d14cc3a17a9b4788a3685ba062" + url: "https://pub.dev" + source: hosted + version: "1.3.1" + calendar_builder: + dependency: "direct main" + description: + name: calendar_builder + sha256: "4b94a20d7e8136b84cd62fb7c7752f4a723b67a4b7ed3c3c14c2615e6e6a4653" + url: "https://pub.dev" + source: hosted + version: "0.0.6" + characters: + dependency: transitive + description: + name: characters + sha256: faf38497bda5ead2a8c7615f4f7939df04333478bf32e4173fcb06d428b5716b + url: "https://pub.dev" + source: hosted + version: "1.4.1" + checked_yaml: + dependency: transitive + description: + name: checked_yaml + sha256: "959525d3162f249993882720d52b7e0c833978df229be20702b33d48d91de70f" + url: "https://pub.dev" + source: hosted + version: "2.0.4" + chewie: + dependency: transitive + description: + name: chewie + sha256: "53dadd2c5b6748742d7744072b38a417ad22691ca55715850300ee793dc7cb27" + url: "https://pub.dev" + source: hosted + version: "1.13.1" + clock: + dependency: transitive + description: + name: clock + sha256: fddb70d9b5277016c77a80201021d40a2247104d9f4aa7bab7157b7e3f05b84b + url: "https://pub.dev" + source: hosted + version: "1.1.2" + code_assets: + dependency: transitive + description: + name: code_assets + sha256: bf394f466ba9205f1812a0433b392d6af280f155f56651eda7c18cc32ed493b8 + url: "https://pub.dev" + source: hosted + version: "1.2.1" + code_builder: + dependency: transitive + description: + name: code_builder + sha256: "6a6cab2ba4680d6423f34a9b972a4c9a94ebe1b62ecec4e1a1f2cba91fd1319d" + url: "https://pub.dev" + source: hosted + version: "4.11.1" + collection: + dependency: transitive + description: + name: collection + sha256: "2f5709ae4d3d59dd8f7cd309b4e023046b57d8a6c82130785d2b0e5868084e76" + url: "https://pub.dev" + source: hosted + version: "1.19.1" + connectivity_plus: + dependency: "direct main" + description: + name: connectivity_plus + sha256: b5e72753cf63becce2c61fd04dfe0f1c430cc5278b53a1342dc5ad839eab29ec + url: "https://pub.dev" + source: hosted + version: "6.1.5" + connectivity_plus_platform_interface: + dependency: transitive + description: + name: connectivity_plus_platform_interface + sha256: "3c09627c536d22fd24691a905cdd8b14520de69da52c7a97499c8be5284a32ed" + url: "https://pub.dev" + source: hosted + version: "2.1.0" + convert: + dependency: transitive + description: + name: convert + sha256: b30acd5944035672bc15c6b7a8b47d773e41e2f17de064350988c5d02adb1c68 + url: "https://pub.dev" + source: hosted + version: "3.1.2" + cross_file: + dependency: transitive + description: + name: cross_file + sha256: "28bb3ae56f117b5aec029d702a90f57d285cd975c3c5c281eaca38dbc47c5937" + url: "https://pub.dev" + source: hosted + version: "0.3.5+2" + crypto: + dependency: transitive + description: + name: crypto + sha256: c8ea0233063ba03258fbcf2ca4d6dadfefe14f02fab57702265467a19f27fadf + url: "https://pub.dev" + source: hosted + version: "3.0.7" + csslib: + dependency: transitive + description: + name: csslib + sha256: "09bad715f418841f976c77db72d5398dc1253c21fb9c0c7f0b0b985860b2d58e" + url: "https://pub.dev" + source: hosted + version: "1.0.2" + cupertino_icons: + dependency: "direct main" + description: + name: cupertino_icons + sha256: "41e005c33bd814be4d3096aff55b1908d419fde52ca656c8c47719ec745873cd" + url: "https://pub.dev" + source: hosted + version: "1.0.9" + dart_style: + dependency: transitive + description: + name: dart_style + sha256: "29f7ecc274a86d32920b1d9cfc7502fa87220da41ec60b55f329559d5732e2b2" + url: "https://pub.dev" + source: hosted + version: "3.1.7" + dart_webrtc: + dependency: transitive + description: + name: dart_webrtc + sha256: f6d615bddea5e458ce180a914f3055c234ffb52fb7397a51b3491e76d6d7edb2 + url: "https://pub.dev" + source: hosted + version: "1.8.1" + dbus: + dependency: transitive + description: + name: dbus + sha256: "0ce9b0a839e6dee59a37a623d2fc26a35bbbe6404213e419b0d6411023d62645" + url: "https://pub.dev" + source: hosted + version: "0.7.14" + device_info_plus: + dependency: "direct main" + description: + name: device_info_plus + sha256: e3fc9a65820fef83035af8ee8c09004a719d5d1d54e6de978fcb0d84bbeb241a + url: "https://pub.dev" + source: hosted + version: "11.2.2" + device_info_plus_platform_interface: + dependency: transitive + description: + name: device_info_plus_platform_interface + sha256: e1ea89119e34903dca74b883d0dd78eb762814f97fb6c76f35e9ff74d261a18f + url: "https://pub.dev" + source: hosted + version: "7.0.3" + dio: + dependency: "direct main" + description: + name: dio + sha256: aff32c08f92787a557dd5c0145ac91536481831a01b4648136373cddb0e64f8c + url: "https://pub.dev" + source: hosted + version: "5.9.2" + dio_web_adapter: + dependency: transitive + description: + name: dio_web_adapter + sha256: "2f9e64323a7c3c7ef69567d5c800424a11f8337b8b228bad02524c9fb3c1f340" + url: "https://pub.dev" + source: hosted + version: "2.1.2" + encrypt: + dependency: "direct main" + description: + name: encrypt + sha256: "62d9aa4670cc2a8798bab89b39fc71b6dfbacf615de6cf5001fb39f7e4a996a2" + url: "https://pub.dev" + source: hosted + version: "5.0.3" + envied: + dependency: "direct main" + description: + name: envied + sha256: "42132a746494b0a7bc19062cdddd3a01694f696caca684456ff01526c833decc" + url: "https://pub.dev" + source: hosted + version: "1.3.5" + envied_generator: + dependency: "direct dev" + description: + name: envied_generator + sha256: e1e66498080f531e89d9ea7971f96b287dffdd05df16efdd31f9f74faa77e005 + url: "https://pub.dev" + source: hosted + version: "1.3.5" + equatable: + dependency: transitive + description: + name: equatable + sha256: "3e0141505477fd8ad55d6eb4e7776d3fe8430be8e497ccb1521370c3f21a3e2b" + url: "https://pub.dev" + source: hosted + version: "2.0.8" + fake_async: + dependency: transitive + description: + name: fake_async + sha256: "5368f224a74523e8d2e7399ea1638b37aecfca824a3cc4dfdf77bf1fa905ac44" + url: "https://pub.dev" + source: hosted + version: "1.3.3" + ffi: + dependency: transitive + description: + name: ffi + sha256: "6d7fd89431262d8f3125e81b50d3847a091d846eafcd4fdb88dd06f36d705a45" + url: "https://pub.dev" + source: hosted + version: "2.2.0" + file: + dependency: transitive + description: + name: file + sha256: a3b4f84adafef897088c160faf7dfffb7696046cb13ae90b508c2cbc95d3b8d4 + url: "https://pub.dev" + source: hosted + version: "7.0.1" + file_selector_linux: + dependency: transitive + description: + name: file_selector_linux + sha256: "2567f398e06ac72dcf2e98a0c95df2a9edd03c2c2e0cacd4780f20cdf56263a0" + url: "https://pub.dev" + source: hosted + version: "0.9.4" + file_selector_macos: + dependency: transitive + description: + name: file_selector_macos + sha256: "5e0bbe9c312416f1787a68259ea1505b52f258c587f12920422671807c4d618a" + url: "https://pub.dev" + source: hosted + version: "0.9.5" + file_selector_platform_interface: + dependency: transitive + description: + name: file_selector_platform_interface + sha256: "35e0bd61ebcdb91a3505813b055b09b79dfdc7d0aee9c09a7ba59ae4bb13dc85" + url: "https://pub.dev" + source: hosted + version: "2.7.0" + file_selector_windows: + dependency: transitive + description: + name: file_selector_windows + sha256: "62197474ae75893a62df75939c777763d39c2bc5f73ce5b88497208bc269abfd" + url: "https://pub.dev" + source: hosted + version: "0.9.3+5" + firebase_auth: + dependency: "direct main" + description: + name: firebase_auth + sha256: "9905a315f1235a649e29df19b246adde7350a11234837cd605254b8e25144711" + url: "https://pub.dev" + source: hosted + version: "6.5.2" + firebase_auth_platform_interface: + dependency: transitive + description: + name: firebase_auth_platform_interface + sha256: f757dc5636ce2b204a82383f7246ef0d9c925f9e96c8c9a4a6c315d673d662bb + url: "https://pub.dev" + source: hosted + version: "9.0.2" + firebase_auth_web: + dependency: transitive + description: + name: firebase_auth_web + sha256: "1c44330eef3c82068e0c2919b6b015897d49211dcccdf64f90a2ed73ce216ecb" + url: "https://pub.dev" + source: hosted + version: "6.2.2" + firebase_core: + dependency: "direct main" + description: + name: firebase_core + sha256: ec46a100a560d3bd5f97f2d89ba7492cb09b6dd0a4a28753d1258f360d6bd9f9 + url: "https://pub.dev" + source: hosted + version: "4.10.0" + firebase_core_platform_interface: + dependency: transitive + description: + name: firebase_core_platform_interface + sha256: "4a120366dbf7d5a8ee9438978530b664b855728fb8dcc3a201017660817e555b" + url: "https://pub.dev" + source: hosted + version: "7.0.1" + firebase_core_web: + dependency: transitive + description: + name: firebase_core_web + sha256: "5ad1be848692ec148f2d6a8ad2a3838cb852ea5f3c9e6479a7afce479e1854f8" + url: "https://pub.dev" + source: hosted + version: "3.8.0" + firebase_messaging: + dependency: "direct main" + description: + name: firebase_messaging + sha256: "9651e833454156b9f0927eaedccffba0f7f6a6e20ceddef82517211e7017e9c4" + url: "https://pub.dev" + source: hosted + version: "16.3.0" + firebase_messaging_platform_interface: + dependency: transitive + description: + name: firebase_messaging_platform_interface + sha256: "292bb5dc9c4a429078895406c347d7c7690deb858c1adeed8f4b4346f769dfa3" + url: "https://pub.dev" + source: hosted + version: "4.8.0" + firebase_messaging_web: + dependency: transitive + description: + name: firebase_messaging_web + sha256: "08c565bc83729439f5de2dfea77b4832002b705eb2f840366cefa80e4e5c3c66" + url: "https://pub.dev" + source: hosted + version: "4.2.0" + fixnum: + dependency: transitive + description: + name: fixnum + sha256: b6dc7065e46c974bc7c5f143080a6764ec7a4be6da1285ececdc37be96de53be + url: "https://pub.dev" + source: hosted + version: "1.1.1" + fl_chart: + dependency: "direct main" + description: + name: fl_chart + sha256: b938f77d042cbcd822936a7a359a7235bad8bd72070de1f827efc2cc297ac888 + url: "https://pub.dev" + source: hosted + version: "1.2.0" + flutter: + dependency: "direct main" + description: flutter + source: sdk + version: "0.0.0" + flutter_app_group_directory: + dependency: transitive + description: + name: flutter_app_group_directory + sha256: "680ef9b2dee84c237cd7bb7fc78bc45867b32556a8a5f0de61278078b9fefd05" + url: "https://pub.dev" + source: hosted + version: "1.1.0" + flutter_background_service: + dependency: "direct main" + description: + name: flutter_background_service + sha256: "70a1c185b1fa1a44f8f14ecd6c86f6e50366e3562f00b2fa5a54df39b3324d3d" + url: "https://pub.dev" + source: hosted + version: "5.1.0" + flutter_background_service_android: + dependency: transitive + description: + name: flutter_background_service_android + sha256: ca0793d4cd19f1e194a130918401a3d0b1076c81236f7273458ae96987944a87 + url: "https://pub.dev" + source: hosted + version: "6.3.1" + flutter_background_service_ios: + dependency: transitive + description: + name: flutter_background_service_ios + sha256: "6037ffd45c4d019dab0975c7feb1d31012dd697e25edc05505a4a9b0c7dc9fba" + url: "https://pub.dev" + source: hosted + version: "5.0.3" + flutter_background_service_platform_interface: + dependency: transitive + description: + name: flutter_background_service_platform_interface + sha256: ca74aa95789a8304f4d3f57f07ba404faa86bed6e415f83e8edea6ad8b904a41 + url: "https://pub.dev" + source: hosted + version: "5.1.2" + flutter_cache_manager: + dependency: transitive + description: + name: flutter_cache_manager + sha256: "400b6592f16a4409a7f2bb929a9a7e38c72cceb8ffb99ee57bbf2cb2cecf8386" + url: "https://pub.dev" + source: hosted + version: "3.4.1" + flutter_confetti: + dependency: "direct main" + description: + name: flutter_confetti + sha256: "7e46b82ea0adc456afc91037652bbfbd52a951804fde0708822fad5d68be6398" + url: "https://pub.dev" + source: hosted + version: "0.5.1" + flutter_contacts: + dependency: "direct main" + description: + name: flutter_contacts + sha256: "388d32cd33f16640ee169570128c933b45f3259bddbfae7a100bb49e5ffea9ae" + url: "https://pub.dev" + source: hosted + version: "1.1.9+2" + flutter_font_icons: + dependency: "direct main" + description: + name: flutter_font_icons + sha256: d06eb0ab903d0e90a9a758de30892ea0d43221f03dad059970384e62479c787e + url: "https://pub.dev" + source: hosted + version: "2.2.7" + flutter_image_compress: + dependency: "direct main" + description: + name: flutter_image_compress + sha256: "51d23be39efc2185e72e290042a0da41aed70b14ef97db362a6b5368d0523b27" + url: "https://pub.dev" + source: hosted + version: "2.4.0" + flutter_image_compress_common: + dependency: transitive + description: + name: flutter_image_compress_common + sha256: c5c5d50c15e97dd7dc72ff96bd7077b9f791932f2076c5c5b6c43f2c88607bfb + url: "https://pub.dev" + source: hosted + version: "1.0.6" + flutter_image_compress_macos: + dependency: transitive + description: + name: flutter_image_compress_macos + sha256: "20019719b71b743aba0ef874ed29c50747461e5e8438980dfa5c2031898f7337" + url: "https://pub.dev" + source: hosted + version: "1.0.3" + flutter_image_compress_ohos: + dependency: transitive + description: + name: flutter_image_compress_ohos + sha256: e76b92bbc830ee08f5b05962fc78a532011fcd2041f620b5400a593e96da3f51 + url: "https://pub.dev" + source: hosted + version: "0.0.3" + flutter_image_compress_platform_interface: + dependency: transitive + description: + name: flutter_image_compress_platform_interface + sha256: "579cb3947fd4309103afe6442a01ca01e1e6f93dc53bb4cbd090e8ce34a41889" + url: "https://pub.dev" + source: hosted + version: "1.0.5" + flutter_image_compress_web: + dependency: transitive + description: + name: flutter_image_compress_web + sha256: b9b141ac7c686a2ce7bb9a98176321e1182c9074650e47bb140741a44b6f5a96 + url: "https://pub.dev" + source: hosted + version: "0.1.5" + flutter_inappwebview: + dependency: transitive + description: + name: flutter_inappwebview + sha256: "80092d13d3e29b6227e25b67973c67c7210bd5e35c4b747ca908e31eb71a46d5" + url: "https://pub.dev" + source: hosted + version: "6.1.5" + flutter_inappwebview_android: + dependency: transitive + description: + name: flutter_inappwebview_android + sha256: "62557c15a5c2db5d195cb3892aab74fcaec266d7b86d59a6f0027abd672cddba" + url: "https://pub.dev" + source: hosted + version: "1.1.3" + flutter_inappwebview_internal_annotations: + dependency: transitive + description: + name: flutter_inappwebview_internal_annotations + sha256: e30fba942e3debea7b7e6cdd4f0f59ce89dd403a9865193e3221293b6d1544c6 + url: "https://pub.dev" + source: hosted + version: "1.3.0" + flutter_inappwebview_ios: + dependency: transitive + description: + name: flutter_inappwebview_ios + sha256: "5818cf9b26cf0cbb0f62ff50772217d41ea8d3d9cc00279c45f8aabaa1b4025d" + url: "https://pub.dev" + source: hosted + version: "1.1.2" + flutter_inappwebview_macos: + dependency: transitive + description: + name: flutter_inappwebview_macos + sha256: c1fbb86af1a3738e3541364d7d1866315ffb0468a1a77e34198c9be571287da1 + url: "https://pub.dev" + source: hosted + version: "1.1.2" + flutter_inappwebview_platform_interface: + dependency: transitive + description: + name: flutter_inappwebview_platform_interface + sha256: cf5323e194096b6ede7a1ca808c3e0a078e4b33cc3f6338977d75b4024ba2500 + url: "https://pub.dev" + source: hosted + version: "1.3.0+1" + flutter_inappwebview_web: + dependency: transitive + description: + name: flutter_inappwebview_web + sha256: "55f89c83b0a0d3b7893306b3bb545ba4770a4df018204917148ebb42dc14a598" + url: "https://pub.dev" + source: hosted + version: "1.1.2" + flutter_inappwebview_windows: + dependency: transitive + description: + name: flutter_inappwebview_windows + sha256: "8b4d3a46078a2cdc636c4a3d10d10f2a16882f6be607962dbfff8874d1642055" + url: "https://pub.dev" + source: hosted + version: "0.6.0" + flutter_lints: + dependency: "direct dev" + description: + name: flutter_lints + sha256: "3105dc8492f6183fb076ccf1f351ac3d60564bff92e20bfc4af9cc1651f4e7e1" + url: "https://pub.dev" + source: hosted + version: "6.0.0" + flutter_local_notifications: + dependency: "direct main" + description: + name: flutter_local_notifications + sha256: "0d9035862236fe38250fe1644d7ed3b8254e34a21b2c837c9f539fbb3bba5ef1" + url: "https://pub.dev" + source: hosted + version: "21.0.0" + flutter_local_notifications_linux: + dependency: transitive + description: + name: flutter_local_notifications_linux + sha256: e0f25e243c6c44c825bbbc6b2b2e76f7d9222362adcfe9fd780bf01923c840bd + url: "https://pub.dev" + source: hosted + version: "8.0.0" + flutter_local_notifications_platform_interface: + dependency: transitive + description: + name: flutter_local_notifications_platform_interface + sha256: e7db3d5b49c2b7ecc68deba4aaaa67a348f92ee0fef34c8e4b4459dbef0d7307 + url: "https://pub.dev" + source: hosted + version: "11.0.0" + flutter_local_notifications_windows: + dependency: transitive + description: + name: flutter_local_notifications_windows + sha256: "3a2654ba104fbb52c618ebed9def24ef270228470718c43b3a6afcd5c81bef0c" + url: "https://pub.dev" + source: hosted + version: "3.0.0" + flutter_overlay_window: + dependency: "direct main" + description: + name: flutter_overlay_window + sha256: "17988420249da68e421d1b44b511e6113d3de7a9e52c3fbd6d99730508af4580" + url: "https://pub.dev" + source: hosted + version: "0.5.0" + flutter_plugin_android_lifecycle: + dependency: transitive + description: + name: flutter_plugin_android_lifecycle + sha256: "3854fe5e3bff0b113c658f260b90c95dea17c92db0f2addeac2e343dd9969785" + url: "https://pub.dev" + source: hosted + version: "2.0.35" + flutter_rating_bar: + dependency: "direct main" + description: + name: flutter_rating_bar + sha256: d2af03469eac832c591a1eba47c91ecc871fe5708e69967073c043b2d775ed93 + url: "https://pub.dev" + source: hosted + version: "4.0.1" + flutter_secure_storage: + dependency: "direct main" + description: + name: flutter_secure_storage + sha256: "7686b1d6a29985dcbb808c59518226e603e3bfa7c0ddfd1a0d00e4cda77c868e" + url: "https://pub.dev" + source: hosted + version: "10.3.1" + flutter_secure_storage_darwin: + dependency: transitive + description: + name: flutter_secure_storage_darwin + sha256: "82329fa5cdf343773b1b6897dea959105a29f092454259edff92f9f6637e8149" + url: "https://pub.dev" + source: hosted + version: "0.3.2" + flutter_secure_storage_linux: + dependency: transitive + description: + name: flutter_secure_storage_linux + sha256: a5f35ddab43cf5c8215d2feb4ce1957851f28c5c37e6f04335066a0602087bf5 + url: "https://pub.dev" + source: hosted + version: "3.0.1" + flutter_secure_storage_platform_interface: + dependency: transitive + description: + name: flutter_secure_storage_platform_interface + sha256: "8ceea1223bee3c6ac1a22dabd8feefc550e4729b3675de4b5900f55afcb435d6" + url: "https://pub.dev" + source: hosted + version: "2.0.1" + flutter_secure_storage_web: + dependency: transitive + description: + name: flutter_secure_storage_web + sha256: "073a62b3aeb866ab4ce795f960413948e51e5a42a9b0c8333b6daf5bb3208a1c" + url: "https://pub.dev" + source: hosted + version: "2.1.1" + flutter_secure_storage_windows: + dependency: transitive + description: + name: flutter_secure_storage_windows + sha256: "3b7c8e068875dfd46719ff57c90d8c459c87f2302ed6b00ff006b3c9fcad1613" + url: "https://pub.dev" + source: hosted + version: "4.1.0" + flutter_staggered_animations: + dependency: "direct main" + description: + name: flutter_staggered_animations + sha256: "81d3c816c9bb0dca9e8a5d5454610e21ffb068aedb2bde49d2f8d04f75538351" + url: "https://pub.dev" + source: hosted + version: "1.1.1" + flutter_svg: + dependency: "direct main" + description: + name: flutter_svg + sha256: "35882981abcbfb8c15b286f0cd690ff25bac12d95eff3e25ee207f37d4c42e7f" + url: "https://pub.dev" + source: hosted + version: "2.3.0" + flutter_test: + dependency: "direct dev" + description: flutter + source: sdk + version: "0.0.0" + flutter_tts: + dependency: "direct main" + description: + name: flutter_tts + sha256: ce5eb209b40e95f2f4a1397116c87ab2fcdff32257d04ed7a764e75894c03775 + url: "https://pub.dev" + source: hosted + version: "4.2.5" + flutter_web_browser: + dependency: "direct main" + description: + name: flutter_web_browser + sha256: "15809b5a7b0cd9a6acf2ff5d8b975a08596923ea15efa759e607993a399de8e3" + url: "https://pub.dev" + source: hosted + version: "0.17.3" + flutter_web_plugins: + dependency: transitive + description: flutter + source: sdk + version: "0.0.0" + flutter_webrtc: + dependency: "direct main" + description: + name: flutter_webrtc + sha256: c7b0a67ca2c878575fc5c146d801cd874f58f5f1ef5fa6e8eb0c93d413beb948 + url: "https://pub.dev" + source: hosted + version: "1.4.1" + flutter_widget_from_html: + dependency: "direct main" + description: + name: flutter_widget_from_html + sha256: "4fa9a0d34df0a40ac8dd20765dc83bbd8f36ceecfffa2a72a7ab178548804a04" + url: "https://pub.dev" + source: hosted + version: "0.17.2" + flutter_widget_from_html_core: + dependency: transitive + description: + name: flutter_widget_from_html_core + sha256: "7ff010b116f6abc16429923e616fbc727f3f65ef4cee12ffdb280aeecbc21e7f" + url: "https://pub.dev" + source: hosted + version: "0.17.2" + fwfh_cached_network_image: + dependency: transitive + description: + name: fwfh_cached_network_image + sha256: "484cb5f8047f02cfac0654fca5832bfa91bb715fd7fc651c04eb7454187c4af8" + url: "https://pub.dev" + source: hosted + version: "0.16.1" + fwfh_chewie: + dependency: transitive + description: + name: fwfh_chewie + sha256: ae74fc26798b0e74f3983f7b851e74c63b9eeb2d3015ecd4b829096b2c3f8818 + url: "https://pub.dev" + source: hosted + version: "0.16.1" + fwfh_just_audio: + dependency: transitive + description: + name: fwfh_just_audio + sha256: dfd622a0dfe049ac647423a2a8afa7f057d9b2b93d92710b624e3d370b1ac69a + url: "https://pub.dev" + source: hosted + version: "0.17.0" + fwfh_svg: + dependency: transitive + description: + name: fwfh_svg + sha256: "2e6bb241179eeeb1a7941e05c8c923b05d332d36a9085233e7bf110ea7deb915" + url: "https://pub.dev" + source: hosted + version: "0.16.1" + fwfh_url_launcher: + dependency: transitive + description: + name: fwfh_url_launcher + sha256: c38aa8fb373fda3a89b951fa260b539f623f6edb45eee7874cb8b492471af881 + url: "https://pub.dev" + source: hosted + version: "0.16.1" + fwfh_webview: + dependency: transitive + description: + name: fwfh_webview + sha256: "30de1ce10ee789cbd23732558a4b837d9cfd9d6b6352acf686a0113969fb2f85" + url: "https://pub.dev" + source: hosted + version: "0.15.7" + geoclue: + dependency: transitive + description: + name: geoclue + sha256: c2a998c77474fc57aa00c6baa2928e58f4b267649057a1c76738656e9dbd2a7f + url: "https://pub.dev" + source: hosted + version: "0.1.1" + geolocator: + dependency: "direct main" + description: + name: geolocator + sha256: "79939537046c9025be47ec645f35c8090ecadb6fe98eba146a0d25e8c1357516" + url: "https://pub.dev" + source: hosted + version: "14.0.2" + geolocator_android: + dependency: transitive + description: + name: geolocator_android + sha256: "179c3cb66dfa674fc9ccbf2be872a02658724d1c067634e2c427cf6df7df901a" + url: "https://pub.dev" + source: hosted + version: "5.0.2" + geolocator_apple: + dependency: transitive + description: + name: geolocator_apple + sha256: dbdd8789d5aaf14cf69f74d4925ad1336b4433a6efdf2fce91e8955dc921bf22 + url: "https://pub.dev" + source: hosted + version: "2.3.13" + geolocator_linux: + dependency: transitive + description: + name: geolocator_linux + sha256: d64112a205931926f4363bb6bd48f14cb38e7326833041d170615586cd143797 + url: "https://pub.dev" + source: hosted + version: "0.2.4" + geolocator_platform_interface: + dependency: transitive + description: + name: geolocator_platform_interface + sha256: dde05dae7d584db6e82feb87dd9fb0b4b4c83ed68065667b4bef637be38e13a7 + url: "https://pub.dev" + source: hosted + version: "4.2.7" + geolocator_web: + dependency: transitive + description: + name: geolocator_web + sha256: b1ae9bdfd90f861fde8fd4f209c37b953d65e92823cb73c7dee1fa021b06f172 + url: "https://pub.dev" + source: hosted + version: "4.1.3" + geolocator_windows: + dependency: transitive + description: + name: geolocator_windows + sha256: "175435404d20278ffd220de83c2ca293b73db95eafbdc8131fe8609be1421eb6" + url: "https://pub.dev" + source: hosted + version: "0.2.5" + get: + dependency: "direct main" + description: + path: "../../Intaleq/packages/get" + relative: true + source: path + version: "4.6.5" + get_storage: + dependency: "direct main" + description: + path: "../../Intaleq/packages/get_storage" + relative: true + source: path + version: "2.1.1" + glob: + dependency: transitive + description: + name: glob + sha256: c3f1ee72c96f8f78935e18aa8cecced9ab132419e8625dc187e1c2408efc20de + url: "https://pub.dev" + source: hosted + version: "2.1.3" + google_cloud: + dependency: transitive + description: + name: google_cloud + sha256: b385e20726ef5315d302c5933bfb728103116c5be2d3d17094b01a82da538c1f + url: "https://pub.dev" + source: hosted + version: "0.5.0" + google_fonts: + dependency: "direct main" + description: + name: google_fonts + sha256: "4e9391085e524954a51e3625b7c9c7e9851dc3f376603208bb45c24b9a66255d" + url: "https://pub.dev" + source: hosted + version: "8.1.0" + google_identity_services_web: + dependency: transitive + description: + name: google_identity_services_web + sha256: "5d187c46dc59e02646e10fe82665fc3884a9b71bc1c90c2b8b749316d33ee454" + url: "https://pub.dev" + source: hosted + version: "0.3.3+1" + google_sign_in: + dependency: "direct main" + description: + name: google_sign_in + sha256: "521031b65853b4409b8213c0387d57edaad7e2a949ce6dea0d8b2afc9cb29763" + url: "https://pub.dev" + source: hosted + version: "7.2.0" + google_sign_in_android: + dependency: transitive + description: + name: google_sign_in_android + sha256: df5c15533814ed20b7d9e1c5a40a73f174e5d5017bd2669b1c72fb6596fde812 + url: "https://pub.dev" + source: hosted + version: "7.2.11" + google_sign_in_ios: + dependency: transitive + description: + name: google_sign_in_ios + sha256: ac1e4c1205267cb7999d1d81333fccffdfda29e853f434bbaf71525498bb6950 + url: "https://pub.dev" + source: hosted + version: "6.3.0" + google_sign_in_platform_interface: + dependency: transitive + description: + name: google_sign_in_platform_interface + sha256: "7f59208c42b415a3cca203571128d6f84f885fead2d5b53eb65a9e27f2965bb5" + url: "https://pub.dev" + source: hosted + version: "3.1.0" + google_sign_in_web: + dependency: transitive + description: + name: google_sign_in_web + sha256: d473003eeca892f96a01a64fc803378be765071cb0c265ee872c7f8683245d14 + url: "https://pub.dev" + source: hosted + version: "1.1.3" + googleapis_auth: + dependency: "direct main" + description: + name: googleapis_auth + sha256: "2a8895c3885197f96bb2fd91ee0ae77b53ff3874c7b1f1eadb6566248e880958" + url: "https://pub.dev" + source: hosted + version: "2.3.1" + graphs: + dependency: transitive + description: + name: graphs + sha256: "741bbf84165310a68ff28fe9e727332eef1407342fca52759cb21ad8177bb8d0" + url: "https://pub.dev" + source: hosted + version: "2.3.2" + gsettings: + dependency: transitive + description: + name: gsettings + sha256: "1b0ce661f5436d2db1e51f3c4295a49849f03d304003a7ba177d01e3a858249c" + url: "https://pub.dev" + source: hosted + version: "0.2.8" + hooks: + dependency: transitive + description: + name: hooks + sha256: "9a62a50b50b769a737bc0a8ff381f333529df3ab746b2f6b02e83760231455ba" + url: "https://pub.dev" + source: hosted + version: "2.0.2" + html: + dependency: transitive + description: + name: html + sha256: "6d1264f2dffa1b1101c25a91dff0dc2daee4c18e87cd8538729773c073dbf602" + url: "https://pub.dev" + source: hosted + version: "0.15.6" + http: + dependency: "direct main" + description: + name: http + sha256: "87721a4a50b19c7f1d49001e51409bddc46303966ce89a65af4f4e6004896412" + url: "https://pub.dev" + source: hosted + version: "1.6.0" + http_multi_server: + dependency: transitive + description: + name: http_multi_server + sha256: aa6199f908078bb1c5efb8d8638d4ae191aac11b311132c3ef48ce352fb52ef8 + url: "https://pub.dev" + source: hosted + version: "3.2.2" + http_parser: + dependency: transitive + description: + name: http_parser + sha256: "178d74305e7866013777bab2c3d8726205dc5a4dd935297175b19a23a2e66571" + url: "https://pub.dev" + source: hosted + version: "4.1.2" + image: + dependency: transitive + description: + name: image + sha256: f9881ff4998044947ec38d098bc7c8316ae1186fa786eddffdb867b9bc94dfce + url: "https://pub.dev" + source: hosted + version: "4.8.0" + image_cropper: + dependency: "direct main" + description: + name: image_cropper + sha256: "95782c9068ff09b95a5ece6a2b5fb31b18d8e544d79ebfa7bdafc08df39b3440" + url: "https://pub.dev" + source: hosted + version: "12.2.1" + image_cropper_for_web: + dependency: transitive + description: + name: image_cropper_for_web + sha256: e09749714bc24c4e3b31fbafa2e5b7229b0ff23e8b14d4ba44bd723b77611a0f + url: "https://pub.dev" + source: hosted + version: "7.0.0" + image_cropper_platform_interface: + dependency: transitive + description: + name: image_cropper_platform_interface + sha256: "886a30ec199362cdcc2fbb053b8e53347fbfb9dbbdaa94f9ff85622609f5e7ff" + url: "https://pub.dev" + source: hosted + version: "8.0.0" + image_picker: + dependency: "direct main" + description: + name: image_picker + sha256: "91c025426c2881c551100bce834e201c835a170151545f58d17da5180ca7d9ac" + url: "https://pub.dev" + source: hosted + version: "1.2.2" + image_picker_android: + dependency: transitive + description: + name: image_picker_android + sha256: d5b3e1774af29c9ab00103afb0d4614070f924d2e0057ac867ec98800114793f + url: "https://pub.dev" + source: hosted + version: "0.8.13+17" + image_picker_for_web: + dependency: transitive + description: + name: image_picker_for_web + sha256: "66257a3191ab360d23a55c8241c91a6e329d31e94efa7be9cf7a212e65850214" + url: "https://pub.dev" + source: hosted + version: "3.1.1" + image_picker_ios: + dependency: transitive + description: + name: image_picker_ios + sha256: b9c4a438a9ff4f60808c9cf0039b93a42bb6c2211ef6ebb647394b2b3fa84588 + url: "https://pub.dev" + source: hosted + version: "0.8.13+6" + image_picker_linux: + dependency: transitive + description: + name: image_picker_linux + sha256: "1f81c5f2046b9ab724f85523e4af65be1d47b038160a8c8deed909762c308ed4" + url: "https://pub.dev" + source: hosted + version: "0.2.2" + image_picker_macos: + dependency: transitive + description: + name: image_picker_macos + sha256: "86f0f15a309de7e1a552c12df9ce5b59fe927e71385329355aec4776c6a8ec91" + url: "https://pub.dev" + source: hosted + version: "0.2.2+1" + image_picker_platform_interface: + dependency: transitive + description: + name: image_picker_platform_interface + sha256: "567e056716333a1647c64bb6bd873cff7622233a5c3f694be28a583d4715690c" + url: "https://pub.dev" + source: hosted + version: "2.11.1" + image_picker_windows: + dependency: transitive + description: + name: image_picker_windows + sha256: d248c86554a72b5495a31c56f060cf73a41c7ff541689327b1a7dbccc33adfae + url: "https://pub.dev" + source: hosted + version: "0.2.2" + intaleq_maps: + dependency: "direct main" + description: + path: "../../map-saas/packages/flutter-sdk" + relative: true + source: path + version: "2.2.0" + internet_connection_checker: + dependency: "direct main" + description: + name: internet_connection_checker + sha256: ee08f13d8b13b978affe226e9274ca3ba7a9bed07c9479e8ae245f785b7a488a + url: "https://pub.dev" + source: hosted + version: "3.0.1" + intl: + dependency: "direct main" + description: + name: intl + sha256: "3df61194eb431efc39c4ceba583b95633a403f46c9fd341e550ce0bfa50e9aa5" + url: "https://pub.dev" + source: hosted + version: "0.20.2" + io: + dependency: transitive + description: + name: io + sha256: dfd5a80599cf0165756e3181807ed3e77daf6dd4137caaad72d0b7931597650b + url: "https://pub.dev" + source: hosted + version: "1.0.5" + jailbreak_root_detection: + dependency: "direct main" + description: + name: jailbreak_root_detection + sha256: "5000177b9a27428e9c47d2b98f21ab707bef5869c036f9bda4f4f95f4ad67d72" + url: "https://pub.dev" + source: hosted + version: "1.2.0+1" + jni: + dependency: transitive + description: + name: jni + sha256: c2230682d5bc2362c1c9e8d3c7f406d9cbba23ab3f2e203a025dd47e0fb2e68f + url: "https://pub.dev" + source: hosted + version: "1.0.0" + jni_flutter: + dependency: transitive + description: + name: jni_flutter + sha256: "8b59e590786050b1cd866677dddaf76b1ade5e7bc751abe04b86e84d379d3ba6" + url: "https://pub.dev" + source: hosted + version: "1.0.1" + js: + dependency: transitive + description: + name: js + sha256: f2c445dce49627136094980615a031419f7f3eb393237e4ecd97ac15dea343f3 + url: "https://pub.dev" + source: hosted + version: "0.6.7" + json_annotation: + dependency: transitive + description: + name: json_annotation + sha256: "2a743920d81b7910627f68ee2c9ac1fc0bfee32b9fc3403587d7c6791ca12f80" + url: "https://pub.dev" + source: hosted + version: "4.12.0" + just_audio: + dependency: "direct main" + description: + name: just_audio + sha256: "9694e4734f515f2a052493d1d7e0d6de219ee0427c7c29492e246ff32a219908" + url: "https://pub.dev" + source: hosted + version: "0.10.5" + just_audio_platform_interface: + dependency: transitive + description: + name: just_audio_platform_interface + sha256: "2532c8d6702528824445921c5ff10548b518b13f808c2e34c2fd54793b999a6a" + url: "https://pub.dev" + source: hosted + version: "4.6.0" + just_audio_web: + dependency: transitive + description: + name: just_audio_web + sha256: "6ba8a2a7e87d57d32f0f7b42856ade3d6a9fbe0f1a11fabae0a4f00bb73f0663" + url: "https://pub.dev" + source: hosted + version: "0.4.16" + jwt_decoder: + dependency: "direct main" + description: + name: jwt_decoder + sha256: "54774aebf83f2923b99e6416b4ea915d47af3bde56884eb622de85feabbc559f" + url: "https://pub.dev" + source: hosted + version: "2.0.1" + leak_tracker: + dependency: transitive + description: + name: leak_tracker + sha256: "33e2e26bdd85a0112ec15400c8cbffea70d0f9c3407491f672a2fad47915e2de" + url: "https://pub.dev" + source: hosted + version: "11.0.2" + leak_tracker_flutter_testing: + dependency: transitive + description: + name: leak_tracker_flutter_testing + sha256: "1dbc140bb5a23c75ea9c4811222756104fbcd1a27173f0c34ca01e16bea473c1" + url: "https://pub.dev" + source: hosted + version: "3.0.10" + leak_tracker_testing: + dependency: transitive + description: + name: leak_tracker_testing + sha256: "8d5a2d49f4a66b49744b23b018848400d23e54caf9463f4eb20df3eb8acb2eb1" + url: "https://pub.dev" + source: hosted + version: "3.0.2" + lints: + dependency: transitive + description: + name: lints + sha256: "12f842a479589fea194fe5c5a3095abc7be0c1f2ddfa9a0e76aed1dbd26a87df" + url: "https://pub.dev" + source: hosted + version: "6.1.0" + live_activities: + dependency: "direct main" + description: + name: live_activities + sha256: "060f4d8f57b399e5c8beb255fa8426b9b4789320414ae68c8510aec113269dbd" + url: "https://pub.dev" + source: hosted + version: "2.4.9" + local_auth: + dependency: "direct main" + description: + name: local_auth + sha256: ae6f382f638108c6becd134318d7c3f0a93875383a54010f61d7c97ac05d5137 + url: "https://pub.dev" + source: hosted + version: "3.0.1" + local_auth_android: + dependency: transitive + description: + name: local_auth_android + sha256: b201c006fa769c23386f89aa6837ec0eb8179fcfb212eadcf87b422b3f9a6a78 + url: "https://pub.dev" + source: hosted + version: "2.0.8" + local_auth_darwin: + dependency: transitive + description: + name: local_auth_darwin + sha256: a8c3d4e17454111f7fd31ff72a31222359f6059f7fe956c2dcfe0f88f49826d4 + url: "https://pub.dev" + source: hosted + version: "2.0.3" + local_auth_platform_interface: + dependency: transitive + description: + name: local_auth_platform_interface + sha256: f98b8e388588583d3f781f6806e4f4c9f9e189d898d27f0c249b93a1973dd122 + url: "https://pub.dev" + source: hosted + version: "1.1.0" + local_auth_windows: + dependency: transitive + description: + name: local_auth_windows + sha256: be12c5b8ba5e64896983123655c5f67d2484ecfcc95e367952ad6e3bff94cb16 + url: "https://pub.dev" + source: hosted + version: "2.0.1" + location: + dependency: "direct main" + description: + name: location + sha256: b080053c181c7d152c43dd576eec6436c40e25f326933051c330da563ddd5333 + url: "https://pub.dev" + source: hosted + version: "8.0.1" + location_platform_interface: + dependency: transitive + description: + name: location_platform_interface + sha256: ca8700bb3f6b1e8b2afbd86bd78b2280d116c613ca7bfa1d4d7b64eba357d749 + url: "https://pub.dev" + source: hosted + version: "6.0.1" + location_web: + dependency: transitive + description: + name: location_web + sha256: b8e3add5efe0d65c5e692b7a135d80a4015c580d3ea646fa71973e97668dd868 + url: "https://pub.dev" + source: hosted + version: "6.0.1" + logger: + dependency: transitive + description: + name: logger + sha256: "25aee487596a6257655a1e091ec2ae66bc30e7af663592cc3a27e6591e05035c" + url: "https://pub.dev" + source: hosted + version: "2.7.0" + logging: + dependency: transitive + description: + name: logging + sha256: c8245ada5f1717ed44271ed1c26b8ce85ca3228fd2ffdb75468ab01979309d61 + url: "https://pub.dev" + source: hosted + version: "1.3.0" + lottie: + dependency: "direct main" + description: + name: lottie + sha256: "8b6359a7422167014aa73ce763fa133fb832065dcc0ac4d1dec1f603a5cef7d0" + url: "https://pub.dev" + source: hosted + version: "3.3.3" + maplibre_gl: + dependency: transitive + description: + name: maplibre_gl + sha256: d9773555ae4ebab94bbc3ae2176b077cfda486ec729eefe01e1613f164cb8410 + url: "https://pub.dev" + source: hosted + version: "0.25.0" + maplibre_gl_platform_interface: + dependency: transitive + description: + name: maplibre_gl_platform_interface + sha256: bd7de401dea24dd7e8a6f2fa736ddee7dbbee3e24a9027f0afdd619994702047 + url: "https://pub.dev" + source: hosted + version: "0.25.0" + maplibre_gl_web: + dependency: transitive + description: + name: maplibre_gl_web + sha256: af0e48bf96e8dd99f8b958a1953126971eb8a0527b9735441d4f24df3913f5a2 + url: "https://pub.dev" + source: hosted + version: "0.25.0" + matcher: + dependency: transitive + description: + name: matcher + sha256: "12956d0ad8390bbcc63ca2e1469c0619946ccb52809807067a7020d57e647aa6" + url: "https://pub.dev" + source: hosted + version: "0.12.18" + material_color_utilities: + dependency: transitive + description: + name: material_color_utilities + sha256: "9c337007e82b1889149c82ed242ed1cb24a66044e30979c44912381e9be4c48b" + url: "https://pub.dev" + source: hosted + version: "0.13.0" + meta: + dependency: transitive + description: + name: meta + sha256: "23f08335362185a5ea2ad3a4e597f1375e78bce8a040df5c600c8d3552ef2394" + url: "https://pub.dev" + source: hosted + version: "1.17.0" + mime: + dependency: transitive + description: + name: mime + sha256: "41a20518f0cb1256669420fdba0cd90d21561e560ac240f26ef8322e45bb7ed6" + url: "https://pub.dev" + source: hosted + version: "2.0.0" + nested: + dependency: transitive + description: + name: nested + sha256: "03bac4c528c64c95c722ec99280375a6f2fc708eec17c7b3f07253b626cd2a20" + url: "https://pub.dev" + source: hosted + version: "1.0.0" + nm: + dependency: transitive + description: + name: nm + sha256: "2c9aae4127bdc8993206464fcc063611e0e36e72018696cd9631023a31b24254" + url: "https://pub.dev" + source: hosted + version: "0.5.0" + objective_c: + dependency: transitive + description: + name: objective_c + sha256: "6cb691c686fa2838c6deb34980d426145c2a5d537491cb83d463c33cdbc726ed" + url: "https://pub.dev" + source: hosted + version: "9.4.1" + octo_image: + dependency: transitive + description: + name: octo_image + sha256: "34faa6639a78c7e3cbe79be6f9f96535867e879748ade7d17c9b1ae7536293bd" + url: "https://pub.dev" + source: hosted + version: "2.1.0" + package_config: + dependency: transitive + description: + name: package_config + sha256: f096c55ebb7deb7e384101542bfba8c52696c1b56fca2eb62827989ef2353bbc + url: "https://pub.dev" + source: hosted + version: "2.2.0" + package_info_plus: + dependency: "direct main" + description: + name: package_info_plus + sha256: "468c26b4254ab01979fa5e4a98cb343ea3631b9acee6f21028997419a80e1a20" + url: "https://pub.dev" + source: hosted + version: "9.0.1" + package_info_plus_platform_interface: + dependency: transitive + description: + name: package_info_plus_platform_interface + sha256: "202a487f08836a592a6bd4f901ac69b3a8f146af552bbd14407b6b41e1c3f086" + url: "https://pub.dev" + source: hosted + version: "3.2.1" + path: + dependency: "direct main" + description: + name: path + sha256: "75cca69d1490965be98c73ceaea117e8a04dd21217b37b292c9ddbec0d955bc5" + url: "https://pub.dev" + source: hosted + version: "1.9.1" + path_parsing: + dependency: transitive + description: + name: path_parsing + sha256: "883402936929eac138ee0a45da5b0f2c80f89913e6dc3bf77eb65b84b409c6ca" + url: "https://pub.dev" + source: hosted + version: "1.1.0" + path_provider: + dependency: transitive + description: + name: path_provider + sha256: "50c5dd5b6e1aaf6fb3a78b33f6aa3afca52bf903a8a5298f53101fdaee55bbcd" + url: "https://pub.dev" + source: hosted + version: "2.1.5" + path_provider_android: + dependency: transitive + description: + name: path_provider_android + sha256: "69cbd515a62b94d32a7944f086b2f82b4ac40a1d45bebfc00813a430ab2dabcd" + url: "https://pub.dev" + source: hosted + version: "2.3.1" + path_provider_foundation: + dependency: transitive + description: + name: path_provider_foundation + sha256: "2a376b7d6392d80cd3705782d2caa734ca4727776db0b6ec36ef3f1855197699" + url: "https://pub.dev" + source: hosted + version: "2.6.0" + path_provider_linux: + dependency: transitive + description: + name: path_provider_linux + sha256: f7a1fe3a634fe7734c8d3f2766ad746ae2a2884abe22e241a8b301bf5cac3279 + url: "https://pub.dev" + source: hosted + version: "2.2.1" + path_provider_platform_interface: + dependency: transitive + description: + name: path_provider_platform_interface + sha256: "88f5779f72ba699763fa3a3b06aa4bf6de76c8e5de842cf6f29e2e06476c2334" + url: "https://pub.dev" + source: hosted + version: "2.1.2" + path_provider_windows: + dependency: transitive + description: + name: path_provider_windows + sha256: bd6f00dbd873bfb70d0761682da2b3a2c2fccc2b9e84c495821639601d81afe7 + url: "https://pub.dev" + source: hosted + version: "2.3.0" + permission_handler: + dependency: "direct main" + description: + name: permission_handler + sha256: fe54465bcc62a4564c6e4db337bbaded6c0c0fa6e10487414436d163114784f6 + url: "https://pub.dev" + source: hosted + version: "12.0.3" + permission_handler_android: + dependency: transitive + description: + name: permission_handler_android + sha256: "1e3bc410ca1bf84662104b100eb126e066cb55791b7451307f9708d4007350e6" + url: "https://pub.dev" + source: hosted + version: "13.0.1" + permission_handler_apple: + dependency: transitive + description: + name: permission_handler_apple + sha256: e20daf680eef1ca62ffe8c8c526b778cc386d50137c77ac71c8ec9c88c13fb9d + url: "https://pub.dev" + source: hosted + version: "9.4.9" + permission_handler_html: + dependency: transitive + description: + name: permission_handler_html + sha256: "38f000e83355abb3392140f6bc3030660cfaef189e1f87824facb76300b4ff24" + url: "https://pub.dev" + source: hosted + version: "0.1.3+5" + permission_handler_platform_interface: + dependency: transitive + description: + name: permission_handler_platform_interface + sha256: eb99b295153abce5d683cac8c02e22faab63e50679b937fa1bf67d58bb282878 + url: "https://pub.dev" + source: hosted + version: "4.3.0" + permission_handler_windows: + dependency: transitive + description: + name: permission_handler_windows + sha256: "1a790728016f79a41216d88672dbc5df30e686e811ad4e698bfc51f76ad91f1e" + url: "https://pub.dev" + source: hosted + version: "0.2.1" + petitparser: + dependency: transitive + description: + name: petitparser + sha256: "91bd59303e9f769f108f8df05e371341b15d59e995e6806aefab827b58336675" + url: "https://pub.dev" + source: hosted + version: "7.0.2" + platform: + dependency: transitive + description: + name: platform + sha256: "5d6b1b0036a5f331ebc77c850ebc8506cbc1e9416c27e59b439f917a902a4984" + url: "https://pub.dev" + source: hosted + version: "3.1.6" + plugin_platform_interface: + dependency: transitive + description: + name: plugin_platform_interface + sha256: "4820fbfdb9478b1ebae27888254d445073732dae3d6ea81f0b7e06d5dedc3f02" + url: "https://pub.dev" + source: hosted + version: "2.1.8" + pointycastle: + dependency: transitive + description: + name: pointycastle + sha256: "4be0097fcf3fd3e8449e53730c631200ebc7b88016acecab2b0da2f0149222fe" + url: "https://pub.dev" + source: hosted + version: "3.9.1" + pool: + dependency: transitive + description: + name: pool + sha256: "978783255c543aa3586a1b3c21f6e9d720eb315376a915872c61ef8b5c20177d" + url: "https://pub.dev" + source: hosted + version: "1.5.2" + posix: + dependency: transitive + description: + name: posix + sha256: "185ef7606574f789b40f289c233efa52e96dead518aed988e040a10737febb07" + url: "https://pub.dev" + source: hosted + version: "6.5.0" + provider: + dependency: transitive + description: + name: provider + sha256: "4e82183fa20e5ca25703ead7e05de9e4cceed1fbd1eadc1ac3cb6f565a09f272" + url: "https://pub.dev" + source: hosted + version: "6.1.5+1" + pub_semver: + dependency: transitive + description: + name: pub_semver + sha256: "5bfcf68ca79ef689f8990d1160781b4bad40a3bd5e5218ad4076ddb7f4081585" + url: "https://pub.dev" + source: hosted + version: "2.2.0" + pubspec_parse: + dependency: transitive + description: + name: pubspec_parse + sha256: "0560ba233314abbed0a48a2956f7f022cce7c3e1e73df540277da7544cad4082" + url: "https://pub.dev" + source: hosted + version: "1.5.0" + quick_actions: + dependency: "direct main" + description: + name: quick_actions + sha256: "7e35dd6a21f5bbd21acf6899039eaf85001a5ac26d52cbd6a8a2814505b90798" + url: "https://pub.dev" + source: hosted + version: "1.1.0" + quick_actions_android: + dependency: transitive + description: + name: quick_actions_android + sha256: "6fbdda87fbedd0602b91f35d870c2cbcb6d053bc863efb76c6e7f60f1d8e3fd6" + url: "https://pub.dev" + source: hosted + version: "1.0.30" + quick_actions_ios: + dependency: transitive + description: + name: quick_actions_ios + sha256: be1496e7ca1debc86d9ea08e56325649fbc5abb2b6930690c97ba0dae59992b1 + url: "https://pub.dev" + source: hosted + version: "1.2.4" + quick_actions_platform_interface: + dependency: transitive + description: + name: quick_actions_platform_interface + sha256: "1fec7068db5122cd019e9340d3d7be5d36eab099695ef3402c7059ee058329a4" + url: "https://pub.dev" + source: hosted + version: "1.1.0" + recase: + dependency: transitive + description: + name: recase + sha256: e4eb4ec2dcdee52dcf99cb4ceabaffc631d7424ee55e56f280bc039737f89213 + url: "https://pub.dev" + source: hosted + version: "4.1.0" + record: + dependency: "direct main" + description: + name: record + sha256: "10911465138fafacef459a780564e883e01bd48eabf87ab20543684884492870" + url: "https://pub.dev" + source: hosted + version: "6.2.1" + record_android: + dependency: transitive + description: + name: record_android + sha256: eb1732e42d0d2a1895b8db86e4fc917287e6d8491b6ed59918aea8bed6c69de4 + url: "https://pub.dev" + source: hosted + version: "1.5.2" + record_ios: + dependency: transitive + description: + name: record_ios + sha256: c051fb48edd7a0e265daafb9108730dc827c27b551728a3fdfb3ef69efd89c73 + url: "https://pub.dev" + source: hosted + version: "1.2.1" + record_linux: + dependency: transitive + description: + name: record_linux + sha256: "31181787bf7eccb0e298835836b69b3cd0a903863b75d70e937de3dec71cd8f3" + url: "https://pub.dev" + source: hosted + version: "1.3.1" + record_macos: + dependency: transitive + description: + name: record_macos + sha256: cfe1b61435e27db418bf513dc36820d10c9f7eb1843786c2c9a52e07e2f4f627 + url: "https://pub.dev" + source: hosted + version: "1.2.2" + record_platform_interface: + dependency: transitive + description: + name: record_platform_interface + sha256: "8e56cbe06c6984137fb86132ff03459f29938d927496d9b2d0962e2d6345d488" + url: "https://pub.dev" + source: hosted + version: "1.6.0" + record_use: + dependency: transitive + description: + name: record_use + sha256: "2551bd8eecfe95d14ae75f6021ad0248be5c27f138c2ec12fcb52b500b3ba1ed" + url: "https://pub.dev" + source: hosted + version: "0.6.0" + record_web: + dependency: transitive + description: + name: record_web + sha256: "7e9846981c1f2d111d86f0ae3309071f5bba8b624d1c977316706f08fc31d16d" + url: "https://pub.dev" + source: hosted + version: "1.3.0" + record_windows: + dependency: transitive + description: + name: record_windows + sha256: "223258060a1d25c62bae18282c16783f28581ec19401d17e56b5205b9f039d78" + url: "https://pub.dev" + source: hosted + version: "1.0.7" + rxdart: + dependency: transitive + description: + name: rxdart + sha256: "5c3004a4a8dbb94bd4bf5412a4def4acdaa12e12f269737a5751369e12d1a962" + url: "https://pub.dev" + source: hosted + version: "0.28.0" + secure_string_operations: + dependency: "direct main" + description: + path: secure_string_operations + relative: true + source: path + version: "1.0.0" + share_plus: + dependency: "direct main" + description: + name: share_plus + sha256: "223873d106614442ea6f20db5a038685cc5b32a2fba81cdecaefbbae0523f7fa" + url: "https://pub.dev" + source: hosted + version: "12.0.2" + share_plus_platform_interface: + dependency: transitive + description: + name: share_plus_platform_interface + sha256: "88023e53a13429bd65d8e85e11a9b484f49d4c190abbd96c7932b74d6927cc9a" + url: "https://pub.dev" + source: hosted + version: "6.1.0" + shelf: + dependency: transitive + description: + name: shelf + sha256: e7dd780a7ffb623c57850b33f43309312fc863fb6aa3d276a754bb299839ef12 + url: "https://pub.dev" + source: hosted + version: "1.4.2" + shelf_web_socket: + dependency: transitive + description: + name: shelf_web_socket + sha256: "3632775c8e90d6c9712f883e633716432a27758216dfb61bd86a8321c0580925" + url: "https://pub.dev" + source: hosted + version: "3.0.0" + shimmer: + dependency: "direct main" + description: + name: shimmer + sha256: "5f88c883a22e9f9f299e5ba0e4f7e6054857224976a5d9f839d4ebdc94a14ac9" + url: "https://pub.dev" + source: hosted + version: "3.0.0" + sign_in_with_apple: + dependency: "direct main" + description: + name: sign_in_with_apple + sha256: "8bd875c8e8748272749eb6d25b896f768e7e9d60988446d543fe85a37a2392b8" + url: "https://pub.dev" + source: hosted + version: "7.0.1" + sign_in_with_apple_platform_interface: + dependency: transitive + description: + name: sign_in_with_apple_platform_interface + sha256: "981bca52cf3bb9c3ad7ef44aace2d543e5c468bb713fd8dda4275ff76dfa6659" + url: "https://pub.dev" + source: hosted + version: "2.0.0" + sign_in_with_apple_web: + dependency: transitive + description: + name: sign_in_with_apple_web + sha256: f316400827f52cafcf50d00e1a2e8a0abc534ca1264e856a81c5f06bd5b10fed + url: "https://pub.dev" + source: hosted + version: "3.0.0" + sky_engine: + dependency: transitive + description: flutter + source: sdk + version: "0.0.0" + slide_to_act: + dependency: "direct main" + description: + name: slide_to_act + sha256: cd4ea5019754347d5a2b0375e802ad948610a0e233adfe51a9cc5b3a1fc3a43b + url: "https://pub.dev" + source: hosted + version: "2.0.2" + socket_io_client: + dependency: "direct main" + description: + name: socket_io_client + sha256: "64bd271703db3682d4195dd813c555413d21a49bbaef7c3ed38932fd2a209a10" + url: "https://pub.dev" + source: hosted + version: "1.0.2" + socket_io_common: + dependency: transitive + description: + name: socket_io_common + sha256: "469c7e6bb0c8d571a5158c1352112654f03aedc2f0a246533e1cbdb41efa4937" + url: "https://pub.dev" + source: hosted + version: "1.0.1" + source_gen: + dependency: transitive + description: + name: source_gen + sha256: ec37cc0e6694374cbef59ed79685572c870a54ede6fa30a3e420feb3adffea02 + url: "https://pub.dev" + source: hosted + version: "4.2.3" + source_span: + dependency: transitive + description: + name: source_span + sha256: "56a02f1f4cd1a2d96303c0144c93bd6d909eea6bee6bf5a0e0b685edbd4c47ab" + url: "https://pub.dev" + source: hosted + version: "1.10.2" + sqflite: + dependency: "direct main" + description: + name: sqflite + sha256: "564cfed0746fe53140c23b70b308e045c3b31f17778f2f326ccb7d804ea0250a" + url: "https://pub.dev" + source: hosted + version: "2.4.2+1" + sqflite_android: + dependency: transitive + description: + name: sqflite_android + sha256: "881e28efdcc9950fd8e9bb42713dcf1103e62a2e7168f23c9338d82db13dec40" + url: "https://pub.dev" + source: hosted + version: "2.4.2+3" + sqflite_common: + dependency: transitive + description: + name: sqflite_common + sha256: "1581ffbf7a0e333b380d6a30737d78516b826cb35beb7fb0bf8a3ea0c678b465" + url: "https://pub.dev" + source: hosted + version: "2.5.8" + sqflite_darwin: + dependency: transitive + description: + name: sqflite_darwin + sha256: "279832e5cde3fe99e8571879498c9211f3ca6391b0d818df4e17d9fff5c6ccb3" + url: "https://pub.dev" + source: hosted + version: "2.4.2" + sqflite_platform_interface: + dependency: transitive + description: + name: sqflite_platform_interface + sha256: "8dd4515c7bdcae0a785b0062859336de775e8c65db81ae33dd5445f35be61920" + url: "https://pub.dev" + source: hosted + version: "2.4.0" + stack_trace: + dependency: transitive + description: + name: stack_trace + sha256: "8b27215b45d22309b5cddda1aa2b19bdfec9df0e765f2de506401c071d38d1b1" + url: "https://pub.dev" + source: hosted + version: "1.12.1" + stream_channel: + dependency: transitive + description: + name: stream_channel + sha256: "969e04c80b8bcdf826f8f16579c7b14d780458bd97f56d107d3950fdbeef059d" + url: "https://pub.dev" + source: hosted + version: "2.1.4" + stream_transform: + dependency: transitive + description: + name: stream_transform + sha256: ad47125e588cfd37a9a7f86c7d6356dde8dfe89d071d293f80ca9e9273a33871 + url: "https://pub.dev" + source: hosted + version: "2.1.1" + string_scanner: + dependency: transitive + description: + name: string_scanner + sha256: "921cd31725b72fe181906c6a94d987c78e3b98c2e205b397ea399d4054872b43" + url: "https://pub.dev" + source: hosted + version: "1.4.1" + synchronized: + dependency: transitive + description: + name: synchronized + sha256: "63896c27e81b28f8cb4e69ead0d3e8f03f1d1e5fc531a3e579cabed6a2c7c9e5" + url: "https://pub.dev" + source: hosted + version: "3.4.0+1" + term_glyph: + dependency: transitive + description: + name: term_glyph + sha256: "7f554798625ea768a7518313e58f83891c7f5024f88e46e7182a4558850a4b8e" + url: "https://pub.dev" + source: hosted + version: "1.2.2" + test_api: + dependency: transitive + description: + name: test_api + sha256: "93167629bfc610f71560ab9312acdda4959de4df6fac7492c89ff0d3886f6636" + url: "https://pub.dev" + source: hosted + version: "0.7.9" + timezone: + dependency: transitive + description: + name: timezone + sha256: "784a5e34d2eb62e1326f24d6f600aaaee452eb8ca8ef2f384a59244e292d158b" + url: "https://pub.dev" + source: hosted + version: "0.11.0" + trip_overlay_plugin: + dependency: "direct main" + description: + path: trip_overlay_plugin + relative: true + source: path + version: "0.0.1" + typed_data: + dependency: transitive + description: + name: typed_data + sha256: f9049c039ebfeb4cf7a7104a675823cd72dba8297f264b6637062516699fa006 + url: "https://pub.dev" + source: hosted + version: "1.4.0" + upower: + dependency: transitive + description: + name: upower + sha256: cf042403154751180affa1d15614db7fa50234bc2373cd21c3db666c38543ebf + url: "https://pub.dev" + source: hosted + version: "0.7.0" + url_launcher: + dependency: "direct main" + description: + name: url_launcher + sha256: f6a7e5c4835bb4e3026a04793a4199ca2d14c739ec378fdfe23fc8075d0439f8 + url: "https://pub.dev" + source: hosted + version: "6.3.2" + url_launcher_android: + dependency: transitive + description: + name: url_launcher_android + sha256: "17bc677f0b301615530dd1d67e0a9828cafa2d0b6b6eae4cd3679b7eac4a273c" + url: "https://pub.dev" + source: hosted + version: "6.3.30" + url_launcher_ios: + dependency: transitive + description: + name: url_launcher_ios + sha256: "580fe5dfb51671ae38191d316e027f6b76272b026370708c2d898799750a02b0" + url: "https://pub.dev" + source: hosted + version: "6.4.1" + url_launcher_linux: + dependency: transitive + description: + name: url_launcher_linux + sha256: d5e14138b3bc193a0f63c10a53c94b91d399df0512b1f29b94a043db7482384a + url: "https://pub.dev" + source: hosted + version: "3.2.2" + url_launcher_macos: + dependency: transitive + description: + name: url_launcher_macos + sha256: "368adf46f71ad3c21b8f06614adb38346f193f3a59ba8fe9a2fd74133070ba18" + url: "https://pub.dev" + source: hosted + version: "3.2.5" + url_launcher_platform_interface: + dependency: transitive + description: + name: url_launcher_platform_interface + sha256: "552f8a1e663569be95a8190206a38187b531910283c3e982193e4f2733f01029" + url: "https://pub.dev" + source: hosted + version: "2.3.2" + url_launcher_web: + dependency: transitive + description: + name: url_launcher_web + sha256: "85c81589622fbc87c1c683aaea164d3604a7777495a79d91e39ffcdec39ddb34" + url: "https://pub.dev" + source: hosted + version: "2.4.3" + url_launcher_windows: + dependency: transitive + description: + name: url_launcher_windows + sha256: "712c70ab1b99744ff066053cbe3e80c73332b38d46e5e945c98689b2e66fc15f" + url: "https://pub.dev" + source: hosted + version: "3.1.5" + uuid: + dependency: transitive + description: + name: uuid + sha256: "1fef9e8e11e2991bb773070d4656b7bd5d850967a2456cfc83cf47925ba79489" + url: "https://pub.dev" + source: hosted + version: "4.5.3" + vector_graphics: + dependency: transitive + description: + name: vector_graphics + sha256: "2306c03da2ba81724afeb589c351ebbc0aa7d86005925be8f8735856dbe5e42d" + url: "https://pub.dev" + source: hosted + version: "1.2.2" + vector_graphics_codec: + dependency: transitive + description: + name: vector_graphics_codec + sha256: "99fd9fbd34d9f9a32efd7b6a6aae14125d8237b10403b422a6a6dfeac2806146" + url: "https://pub.dev" + source: hosted + version: "1.1.13" + vector_graphics_compiler: + dependency: transitive + description: + name: vector_graphics_compiler + sha256: "7ee12e6dffe0fc8e755179d6d91b3b34f5924223fc104d85572ef9180d73d172" + url: "https://pub.dev" + source: hosted + version: "1.2.5" + vector_math: + dependency: transitive + description: + name: vector_math + sha256: d530bd74fea330e6e364cda7a85019c434070188383e1cd8d9777ee586914c5b + url: "https://pub.dev" + source: hosted + version: "2.2.0" + vibration: + dependency: "direct main" + description: + name: vibration + sha256: "9bb06614c69260f8bd11c80fe01ed7988905cf00e3417d656c2647e41f261d87" + url: "https://pub.dev" + source: hosted + version: "3.1.8" + vibration_platform_interface: + dependency: transitive + description: + name: vibration_platform_interface + sha256: "258c273268f8aa40c88d29741137c536874a738779b92ddb8aa32ed093721ec5" + url: "https://pub.dev" + source: hosted + version: "0.1.2" + video_player: + dependency: "direct main" + description: + name: video_player + sha256: "48a7bdaa38a3d50ec10c78627abdbfad863fdf6f0d6e08c7c3c040cfd80ae36f" + url: "https://pub.dev" + source: hosted + version: "2.11.1" + video_player_android: + dependency: transitive + description: + name: video_player_android + sha256: "877a6c7ba772456077d7bfd71314629b3fe2b73733ce503fc77c3314d43a0ca0" + url: "https://pub.dev" + source: hosted + version: "2.9.5" + video_player_avfoundation: + dependency: transitive + description: + name: video_player_avfoundation + sha256: "9338f3ec22774f88146b22f13273a446719b1da010fd200c4d1d97802156ac58" + url: "https://pub.dev" + source: hosted + version: "2.9.7" + video_player_platform_interface: + dependency: transitive + description: + name: video_player_platform_interface + sha256: "16eaed5268c571c31840dc58ef8da5f0cd4db2a98490c3b8f1cf70122546c6e0" + url: "https://pub.dev" + source: hosted + version: "6.7.0" + video_player_web: + dependency: transitive + description: + name: video_player_web + sha256: "9f3c00be2ef9b76a95d94ac5119fb843dca6f2c69e6c9968f6f2b6c9e7afbdeb" + url: "https://pub.dev" + source: hosted + version: "2.4.0" + vm_service: + dependency: transitive + description: + name: vm_service + sha256: "0016aef94fc66495ac78af5859181e3f3bf2026bd8eecc72b9565601e19ab360" + url: "https://pub.dev" + source: hosted + version: "15.2.0" + wakelock_plus: + dependency: "direct main" + description: + name: wakelock_plus + sha256: ddf3db70eaa10c37558ff817519b85d527dbd21034fd5d8e1c2e85f31588f1c1 + url: "https://pub.dev" + source: hosted + version: "1.5.2" + wakelock_plus_platform_interface: + dependency: transitive + description: + name: wakelock_plus_platform_interface + sha256: b13f99e992e7ae6a152e16c5559d3c07ff445b13330192662494e614ca3e7d7b + url: "https://pub.dev" + source: hosted + version: "1.5.1" + watcher: + dependency: transitive + description: + name: watcher + sha256: "1398c9f081a753f9226febe8900fce8f7d0a67163334e1c94a2438339d79d635" + url: "https://pub.dev" + source: hosted + version: "1.2.1" + web: + dependency: transitive + description: + name: web + sha256: "868d88a33d8a87b18ffc05f9f030ba328ffefba92d6c127917a2ba740f9cfe4a" + url: "https://pub.dev" + source: hosted + version: "1.1.1" + web_socket: + dependency: transitive + description: + name: web_socket + sha256: "34d64019aa8e36bf9842ac014bb5d2f5586ca73df5e4d9bf5c936975cae6982c" + url: "https://pub.dev" + source: hosted + version: "1.0.1" + web_socket_channel: + dependency: transitive + description: + name: web_socket_channel + sha256: d645757fb0f4773d602444000a8131ff5d48c9e47adfe9772652dd1a4f2d45c8 + url: "https://pub.dev" + source: hosted + version: "3.0.3" + webrtc_interface: + dependency: transitive + description: + name: webrtc_interface + sha256: c6f100eac5057d9a817a60473126f9828c796d42884d498af4f339c97b21014f + url: "https://pub.dev" + source: hosted + version: "1.5.1" + webview_flutter: + dependency: "direct main" + description: + name: webview_flutter + sha256: a3da219916aba44947d3a5478b1927876a09781174b5a2b67fa5be0555154bf9 + url: "https://pub.dev" + source: hosted + version: "4.13.1" + webview_flutter_android: + dependency: transitive + description: + name: webview_flutter_android + sha256: ad5182eff9a550925330cb9f0cb038eddfdd5712aba8b77aa0f0400e50f6e688 + url: "https://pub.dev" + source: hosted + version: "4.12.0" + webview_flutter_platform_interface: + dependency: transitive + description: + name: webview_flutter_platform_interface + sha256: "1221c1b12f5278791042f2ec2841743784cf25c5a644e23d6680e5d718824f04" + url: "https://pub.dev" + source: hosted + version: "2.15.1" + webview_flutter_wkwebview: + dependency: transitive + description: + name: webview_flutter_wkwebview + sha256: "82648217f537573e1ca9ae9952d3eacedca6ab5aee69dc84445fc763766dcea2" + url: "https://pub.dev" + source: hosted + version: "3.25.1" + win32: + dependency: transitive + description: + name: win32 + sha256: d7cb55e04cd34096cd3a79b3330245f54cb96a370a1c27adb3c84b917de8b08e + url: "https://pub.dev" + source: hosted + version: "5.15.0" + win32_registry: + dependency: transitive + description: + name: win32_registry + sha256: "21ec76dfc731550fd3e2ce7a33a9ea90b828fdf19a5c3bcf556fa992cfa99852" + url: "https://pub.dev" + source: hosted + version: "1.1.5" + xdg_directories: + dependency: transitive + description: + name: xdg_directories + sha256: "7a3f37b05d989967cdddcbb571f1ea834867ae2faa29725fd085180e0883aa15" + url: "https://pub.dev" + source: hosted + version: "1.1.0" + xml: + dependency: transitive + description: + name: xml + sha256: "971043b3a0d3da28727e40ed3e0b5d18b742fa5a68665cca88e74b7876d5e025" + url: "https://pub.dev" + source: hosted + version: "6.6.1" + yaml: + dependency: transitive + description: + name: yaml + sha256: b9da305ac7c39faa3f030eccd175340f968459dae4af175130b3fc47e40d76ce + url: "https://pub.dev" + source: hosted + version: "3.1.3" + youtube_player_flutter: + dependency: "direct main" + description: + name: youtube_player_flutter + sha256: e64eeebaa5f7dc1d55d103cc9abf05f87d8013bae0d3b6a11aad5d33a2f7f5b4 + url: "https://pub.dev" + source: hosted + version: "9.1.3" +sdks: + dart: ">=3.11.0 <4.0.0" + flutter: ">=3.41.0" diff --git a/siro_driver/pubspec.yaml b/siro_driver/pubspec.yaml new file mode 100644 index 0000000..60930f7 --- /dev/null +++ b/siro_driver/pubspec.yaml @@ -0,0 +1,141 @@ +name: siro_driver +description: "A new Flutter project." +publish_to: "none" # Remove this line if you wish to publish to pub.dev + +version: 1.0.0+1 + +environment: + sdk: ">=3.0.5 <4.0.0" + +dependencies: + flutter: + sdk: flutter + + # Local Packages + bubble_head: + path: ./bubble-master + get: + path: ../../Intaleq/packages/get + get_storage: + path: ../../Intaleq/packages/get_storage + intaleq_maps: + path: ../../map-saas/packages/flutter-sdk/ + secure_string_operations: + path: ./secure_string_operations + trip_overlay_plugin: + path: ./trip_overlay_plugin + + # Core & UI + animated_text_kit: ^4.2.2 + calendar_builder: ^0.0.6 + cupertino_icons: ^1.0.2 + flutter_webrtc: ^1.4.1 + fl_chart: ^1.2.0 + flutter_confetti: ^0.5.1 + flutter_font_icons: ^2.2.5 + flutter_rating_bar: ^4.0.1 + flutter_staggered_animations: ^1.1.1 + flutter_svg: ^2.2.0 + flutter_widget_from_html: ^0.17.1 + google_fonts: ^8.0.2 + lottie: ^3.3.1 + shimmer: ^3.0.0 + slide_to_act: ^2.0.2 + + # Services & Hardware + battery_plus: ^7.0.0 + connectivity_plus: ^6.1.5 + device_info_plus: 11.2.2 + envied: ^1.0.0 + firebase_auth: ^6.3.0 + firebase_core: ^4.6.0 + firebase_messaging: ^16.1.3 + flutter_background_service: ^5.1.0 + flutter_contacts: ^1.1.8 + flutter_local_notifications: ^21.0.0 + flutter_overlay_window: ^0.5.0 + flutter_tts: ^4.0.2 + geolocator: ^14.0.2 + google_sign_in: ^7.2.0 + googleapis_auth: ^2.0.0 + image_cropper: ^12.1.1 + image_picker: ^1.0.4 + internet_connection_checker: ^3.0.1 + jailbreak_root_detection: ^1.1.5 + just_audio: ^0.10.5 + live_activities: ^2.3.0 + local_auth: ^3.0.1 + location: ^8.0.0 + package_info_plus: ^9.0.1 + permission_handler: ^12.0.1 + quick_actions: ^1.1.0 + record: ^6.2.0 + share_plus: ^12.0.2 + sign_in_with_apple: ^7.0.1 + socket_io_client: 1.0.2 + url_launcher: ^6.3.1 + vibration: ^3.1.8 + video_player: ^2.9.2 + wakelock_plus: + webview_flutter: ^4.9.0 + youtube_player_flutter: ^9.0.4 + + # Data & Network + dio: ^5.4.3+1 + encrypt: ^5.0.3 + flutter_image_compress: ^2.3.0 + flutter_secure_storage: ^10.0.0 + flutter_web_browser: ^0.17.3 + http: ^1.2.2 + intl: ^0.20.2 + jwt_decoder: ^2.0.1 + path: ^1.8.3 + sqflite: ^2.3.0 + +dev_dependencies: + flutter_test: + sdk: flutter + + flutter_lints: ^6.0.0 + envied_generator: ^1.0.0 + build_runner: ^2.4.6 + +flutter_launcher_icons: + android: "launcher_icon" + ios: true + image_path: "assets/images/logo.png" + min_sdk_android: 21 + web: + generate: true + image_path: "assets/images/logo.png" + background_color: "#hexcode" + theme_color: "#hexcode" + windows: + generate: true + image_path: "assets/images/logo.png" + icon_size: 48 + macos: + generate: true + image_path: "assets/images/logo.png" + +flutter: + uses-material-design: true + assets: + - assets/ + - assets/images/ + - assets/fonts/ + - shorebird.yaml + + fonts: + # - family: mohanad + # fonts: + # - asset: assets/fonts/mohanad.ttf + # - family: josefin + # fonts: + # - asset: assets/fonts/josefin.ttf + - family: digit + fonts: + - asset: assets/fonts/digit.ttf +dependency_overrides: + get: + path: ../../Intaleq/packages/get diff --git a/siro_driver/secure_string_operations/lib/secure_string_operations.dart b/siro_driver/secure_string_operations/lib/secure_string_operations.dart new file mode 100755 index 0000000..d428ac3 --- /dev/null +++ b/siro_driver/secure_string_operations/lib/secure_string_operations.dart @@ -0,0 +1,47 @@ +// File: lib/secure_string_operations.dart + +library secure_string_operations; + +class X { + static String c(String a, Map b) { + StringBuffer c = StringBuffer(); + c.write(a); + + String d = "Bl"; + c.write(b[d] ?? d); + + StringBuffer e = StringBuffer(); + String f = c.toString(); + + for (int g = 0; g < f.length; g++) { + String h = f[g]; + e.write(b[h] ?? h); + } + + return e.toString(); + } + + static String r(String a, Map b) { + StringBuffer c = StringBuffer(); + String d = "Bl"; + int e = d.length; + + for (int f = 0; f < a.length; f++) { + String g = a[f]; + String h = b.keys.firstWhere( + (i) => b[i] == g, + orElse: () => g, + ); + + c.write(h); + } + + String j = c.toString(); + + if (j.endsWith(d)) { + j = j.substring(0, j.length - e); + } + + return j; + } +} diff --git a/siro_driver/secure_string_operations/pubspec.lock b/siro_driver/secure_string_operations/pubspec.lock new file mode 100755 index 0000000..fce7ef1 --- /dev/null +++ b/siro_driver/secure_string_operations/pubspec.lock @@ -0,0 +1,5 @@ +# Generated by pub +# See https://dart.dev/tools/pub/glossary#lockfile +packages: {} +sdks: + dart: ">=2.12.0 <4.0.0" diff --git a/siro_driver/secure_string_operations/pubspec.yaml b/siro_driver/secure_string_operations/pubspec.yaml new file mode 100755 index 0000000..b910400 --- /dev/null +++ b/siro_driver/secure_string_operations/pubspec.yaml @@ -0,0 +1,6 @@ +name: secure_string_operations +description: A package for secure string operations +version: 1.0.0 + +environment: + sdk: ">=2.12.0 <3.0.0" diff --git a/siro_driver/test/widget_test.dart b/siro_driver/test/widget_test.dart new file mode 100644 index 0000000..37ac666 --- /dev/null +++ b/siro_driver/test/widget_test.dart @@ -0,0 +1,8 @@ +import 'package:flutter_test/flutter_test.dart'; + +void main() { + testWidgets('App initialization test', (WidgetTester tester) async { + // Dummy test to pass CI + expect(true, true); + }); +} diff --git a/siro_driver/trip_overlay_plugin/.gitignore b/siro_driver/trip_overlay_plugin/.gitignore new file mode 100644 index 0000000..b9d7f25 --- /dev/null +++ b/siro_driver/trip_overlay_plugin/.gitignore @@ -0,0 +1,33 @@ +# Miscellaneous +*.class +*.log +*.pyc +*.swp +.DS_Store +.atom/ +.build/ +.buildlog/ +.history +.svn/ +.swiftpm/ +migrate_working_dir/ + +# IntelliJ related +*.iml +*.ipr +*.iws +.idea/ + +# The .vscode folder contains launch configuration and tasks you configure in +# VS Code which you may wish to be included in version control, so this line +# is commented out by default. +#.vscode/ + +# Flutter/Dart/Pub related +# Libraries should not include pubspec.lock, per https://dart.dev/guides/libraries/private-files#pubspeclock. +/pubspec.lock +**/doc/api/ +.dart_tool/ +.flutter-plugins-dependencies +/build/ +/coverage/ diff --git a/siro_driver/trip_overlay_plugin/.metadata b/siro_driver/trip_overlay_plugin/.metadata new file mode 100644 index 0000000..74605d9 --- /dev/null +++ b/siro_driver/trip_overlay_plugin/.metadata @@ -0,0 +1,30 @@ +# This file tracks properties of this Flutter project. +# Used by Flutter tool to assess capabilities and perform upgrades etc. +# +# This file should be version controlled and should not be manually edited. + +version: + revision: "67323de285b00232883f53b84095eb72be97d35c" + channel: "stable" + +project_type: plugin + +# Tracks metadata for the flutter migrate command +migration: + platforms: + - platform: root + create_revision: 67323de285b00232883f53b84095eb72be97d35c + base_revision: 67323de285b00232883f53b84095eb72be97d35c + - platform: android + create_revision: 67323de285b00232883f53b84095eb72be97d35c + base_revision: 67323de285b00232883f53b84095eb72be97d35c + + # User provided section + + # List of Local paths (relative to this file) that should be + # ignored by the migrate tool. + # + # Files that are not part of the templates will be ignored by default. + unmanaged_files: + - 'lib/main.dart' + - 'ios/Runner.xcodeproj/project.pbxproj' diff --git a/siro_driver/trip_overlay_plugin/CHANGELOG.md b/siro_driver/trip_overlay_plugin/CHANGELOG.md new file mode 100644 index 0000000..41cc7d8 --- /dev/null +++ b/siro_driver/trip_overlay_plugin/CHANGELOG.md @@ -0,0 +1,3 @@ +## 0.0.1 + +* TODO: Describe initial release. diff --git a/siro_driver/trip_overlay_plugin/LICENSE b/siro_driver/trip_overlay_plugin/LICENSE new file mode 100644 index 0000000..ba75c69 --- /dev/null +++ b/siro_driver/trip_overlay_plugin/LICENSE @@ -0,0 +1 @@ +TODO: Add your license here. diff --git a/siro_driver/trip_overlay_plugin/README.md b/siro_driver/trip_overlay_plugin/README.md new file mode 100644 index 0000000..01c5a92 --- /dev/null +++ b/siro_driver/trip_overlay_plugin/README.md @@ -0,0 +1,15 @@ +# trip_overlay_plugin + +A new Flutter plugin project. + +## Getting Started + +This project is a starting point for a Flutter +[plug-in package](https://flutter.dev/to/develop-plugins), +a specialized package that includes platform-specific implementation code for +Android and/or iOS. + +For help getting started with Flutter development, view the +[online documentation](https://docs.flutter.dev), which offers tutorials, +samples, guidance on mobile development, and a full API reference. + diff --git a/siro_driver/trip_overlay_plugin/analysis_options.yaml b/siro_driver/trip_overlay_plugin/analysis_options.yaml new file mode 100644 index 0000000..a5744c1 --- /dev/null +++ b/siro_driver/trip_overlay_plugin/analysis_options.yaml @@ -0,0 +1,4 @@ +include: package:flutter_lints/flutter.yaml + +# Additional information about this file can be found at +# https://dart.dev/guides/language/analysis-options diff --git a/siro_driver/trip_overlay_plugin/android/.gitignore b/siro_driver/trip_overlay_plugin/android/.gitignore new file mode 100644 index 0000000..161bdcd --- /dev/null +++ b/siro_driver/trip_overlay_plugin/android/.gitignore @@ -0,0 +1,9 @@ +*.iml +.gradle +/local.properties +/.idea/workspace.xml +/.idea/libraries +.DS_Store +/build +/captures +.cxx diff --git a/siro_driver/trip_overlay_plugin/android/build.gradle b/siro_driver/trip_overlay_plugin/android/build.gradle new file mode 100644 index 0000000..71b8e30 --- /dev/null +++ b/siro_driver/trip_overlay_plugin/android/build.gradle @@ -0,0 +1,66 @@ +group = "com.intaleq_driver.trip_overlay_plugin" +version = "1.0-SNAPSHOT" + +buildscript { + ext.kotlin_version = "2.2.20" + repositories { + google() + mavenCentral() + } + + dependencies { + classpath("com.android.tools.build:gradle:8.11.1") + classpath("org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version") + } +} + +allprojects { + repositories { + google() + mavenCentral() + } +} + +apply plugin: "com.android.library" +apply plugin: "kotlin-android" + +android { + namespace = "com.intaleq_driver.trip_overlay_plugin" + + compileSdk = 36 + + compileOptions { + sourceCompatibility = JavaVersion.VERSION_17 + targetCompatibility = JavaVersion.VERSION_17 + } + + kotlinOptions { + jvmTarget = JavaVersion.VERSION_17 + } + + sourceSets { + main.java.srcDirs += "src/main/kotlin" + test.java.srcDirs += "src/test/kotlin" + } + + defaultConfig { + minSdk = 24 + } + + dependencies { + testImplementation("org.jetbrains.kotlin:kotlin-test") + testImplementation("org.mockito:mockito-core:5.0.0") + } + + testOptions { + unitTests.all { + useJUnitPlatform() + + testLogging { + events "passed", "skipped", "failed", "standardOut", "standardError" + outputs.upToDateWhen {false} + showStandardStreams = true + } + } + } +} diff --git a/siro_driver/trip_overlay_plugin/android/settings.gradle b/siro_driver/trip_overlay_plugin/android/settings.gradle new file mode 100644 index 0000000..4aaa409 --- /dev/null +++ b/siro_driver/trip_overlay_plugin/android/settings.gradle @@ -0,0 +1 @@ +rootProject.name = 'trip_overlay_plugin' diff --git a/siro_driver/trip_overlay_plugin/android/src/main/AndroidManifest.xml b/siro_driver/trip_overlay_plugin/android/src/main/AndroidManifest.xml new file mode 100644 index 0000000..58d93b2 --- /dev/null +++ b/siro_driver/trip_overlay_plugin/android/src/main/AndroidManifest.xml @@ -0,0 +1,3 @@ + + diff --git a/siro_driver/trip_overlay_plugin/android/src/main/kotlin/com/intaleq_driver/trip_overlay_plugin/TripOverlayPlugin.kt b/siro_driver/trip_overlay_plugin/android/src/main/kotlin/com/intaleq_driver/trip_overlay_plugin/TripOverlayPlugin.kt new file mode 100644 index 0000000..7e7a2d2 --- /dev/null +++ b/siro_driver/trip_overlay_plugin/android/src/main/kotlin/com/intaleq_driver/trip_overlay_plugin/TripOverlayPlugin.kt @@ -0,0 +1,179 @@ +package com.intaleq_driver.trip_overlay_plugin + +import android.app.Activity +import android.content.Context +import android.content.Intent +import android.net.Uri +import android.os.Build +import android.provider.Settings +import android.util.Log +import io.flutter.embedding.engine.plugins.FlutterPlugin +import io.flutter.embedding.engine.plugins.activity.ActivityAware +import io.flutter.embedding.engine.plugins.activity.ActivityPluginBinding +import io.flutter.plugin.common.MethodCall +import io.flutter.plugin.common.MethodChannel +import io.flutter.plugin.common.MethodChannel.MethodCallHandler +import io.flutter.plugin.common.MethodChannel.Result +import io.flutter.plugin.common.PluginRegistry + +class TripOverlayPlugin : + FlutterPlugin, MethodCallHandler, ActivityAware, PluginRegistry.ActivityResultListener { + + private lateinit var channel: MethodChannel + private lateinit var context: Context + private var activity: Activity? = null + + companion object { + const val CHANNEL = "trip_overlay_plugin" + + const val TAG = "TripOverlayPlugin" + const val REQUEST_CODE_OVERLAY = 1001 + + // Static reference so TripOverlayService can call back into Flutter + var methodChannel: MethodChannel? = null + + /** + * Called by TripOverlayService when the driver taps Accept. Sends event Flutter → Dart + * side. + */ + fun notifyTripAccepted(tripId: String) { + methodChannel?.invokeMethod("onTripAccepted", mapOf("tripId" to tripId)) + Log.d(TAG, "notifyTripAccepted: $tripId") + } + + /** Called by TripOverlayService when the driver taps Reject or timer expires. */ + fun notifyTripRejected(tripId: String) { + methodChannel?.invokeMethod("onTripRejected", mapOf("tripId" to tripId)) + Log.d(TAG, "notifyTripRejected: $tripId") + } + } + + // ─── FlutterPlugin ─────────────────────────────────────────────────────── + + override fun onAttachedToEngine(binding: FlutterPlugin.FlutterPluginBinding) { + context = binding.applicationContext + channel = MethodChannel(binding.binaryMessenger, CHANNEL) + channel.setMethodCallHandler(this) + methodChannel = channel + Log.d(TAG, "Plugin attached to engine") + } + + override fun onDetachedFromEngine(binding: FlutterPlugin.FlutterPluginBinding) { + channel.setMethodCallHandler(null) + methodChannel = null + } + + // ─── MethodCallHandler ─────────────────────────────────────────────────── + + override fun onMethodCall(call: MethodCall, result: Result) { + when (call.method) { + "isPermissionGranted" -> { + result.success(isOverlayPermissionGranted()) + } + "requestPermission" -> { + requestOverlayPermission() + result.success(null) + } + "showOverlay" -> { + val tripDataJson = + call.argument("tripData") + ?: run { + result.error("INVALID_ARGS", "tripData is required", null) + return + } + val autoCloseSeconds = call.argument("autoCloseSeconds") ?: 30 + val success = showOverlay(tripDataJson, autoCloseSeconds) + result.success(success) + } + "hideOverlay" -> { + hideOverlay() + result.success(null) + } + "isOverlayActive" -> { + result.success(TripOverlayService.isRunning) + } + else -> result.notImplemented() + } + } + + // ─── Permission Helpers ─────────────────────────────────────────────────── + + private fun isOverlayPermissionGranted(): Boolean { + return if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) { + Settings.canDrawOverlays(context) + } else { + true // Pre-M devices don't need runtime permission + } + } + + private fun requestOverlayPermission() { + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) { + val intent = + Intent( + Settings.ACTION_MANAGE_OVERLAY_PERMISSION, + Uri.parse("package:${context.packageName}") + ) + .apply { addFlags(Intent.FLAG_ACTIVITY_NEW_TASK) } + activity?.startActivityForResult(intent, REQUEST_CODE_OVERLAY) + ?: context.startActivity(intent) + } + } + + // ─── Overlay Control ────────────────────────────────────────────────────── + + private fun showOverlay(tripDataJson: String, autoCloseSeconds: Int): Boolean { + if (!isOverlayPermissionGranted()) { + Log.w(TAG, "Overlay permission not granted") + return false + } + val intent = + Intent(context, TripOverlayService::class.java).apply { + action = TripOverlayService.ACTION_SHOW + putExtra(TripOverlayService.EXTRA_TRIP_DATA, tripDataJson) + putExtra(TripOverlayService.EXTRA_AUTO_CLOSE_SECONDS, autoCloseSeconds) + } + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) { + context.startForegroundService(intent) + } else { + context.startService(intent) + } + Log.d(TAG, "showOverlay called with tripData: $tripDataJson") + return true + } + + private fun hideOverlay() { + val intent = + Intent(context, TripOverlayService::class.java).apply { + action = TripOverlayService.ACTION_HIDE + } + context.startService(intent) + Log.d(TAG, "hideOverlay called") + } + + // ─── ActivityAware ──────────────────────────────────────────────────────── + + override fun onAttachedToActivity(binding: ActivityPluginBinding) { + activity = binding.activity + binding.addActivityResultListener(this) + } + + override fun onDetachedFromActivityForConfigChanges() { + activity = null + } + override fun onReattachedToActivityForConfigChanges(binding: ActivityPluginBinding) { + activity = binding.activity + } + override fun onDetachedFromActivity() { + activity = null + } + + // ─── ActivityResultListener ─────────────────────────────────────────────── + + override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?): Boolean { + if (requestCode == REQUEST_CODE_OVERLAY) { + Log.d(TAG, "Overlay permission result received") + return true + } + return false + } +} diff --git a/siro_driver/trip_overlay_plugin/android/src/main/kotlin/com/intaleq_driver/trip_overlay_plugin/TripzOverlayReciver.kt b/siro_driver/trip_overlay_plugin/android/src/main/kotlin/com/intaleq_driver/trip_overlay_plugin/TripzOverlayReciver.kt new file mode 100644 index 0000000..05eb485 --- /dev/null +++ b/siro_driver/trip_overlay_plugin/android/src/main/kotlin/com/intaleq_driver/trip_overlay_plugin/TripzOverlayReciver.kt @@ -0,0 +1,109 @@ +package com.intaleq_driver.trip_overlay_plugin + +import android.content.BroadcastReceiver +import android.content.Context +import android.content.Intent +import android.os.Build +import android.util.Log +import org.json.JSONObject + +/** + * TripOverlayReceiver + * + * A BroadcastReceiver you can trigger directly from your FCM background handler (or anywhere + * outside Flutter context) to show the overlay without needing an active MethodChannel. + * + * Usage from your backgroundMessageHandler in main.dart: — Call the static helper + * [TripOverlayReceiver.show(context, tripDataJson)] + * + * Or register in AndroidManifest and send an explicit broadcast. + * + * Register in AndroidManifest.xml: + * ``` + */ +class TripOverlayReceiver : BroadcastReceiver() { + + companion object { + const val TAG = "TripOverlayReceiver" + const val ACTION = "com.intaleq_driver.SHOW_OVERLAY" + const val EXTRA_TRIP_DATA = "trip_data" + const val EXTRA_AUTO_CLOSE = "auto_close_seconds" + + /** + * Convenience method — call this from your FCM handler (Kotlin/Java) or from a Flutter + * MethodChannel invocation. + */ + fun show(context: Context, tripDataJson: String, autoCloseSeconds: Int = 30) { + val intent = + Intent(context, TripOverlayService::class.java).apply { + action = TripOverlayService.ACTION_SHOW + putExtra(TripOverlayService.EXTRA_TRIP_DATA, tripDataJson) + putExtra(TripOverlayService.EXTRA_AUTO_CLOSE_SECONDS, autoCloseSeconds) + } + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) { + context.startForegroundService(intent) + } else { + context.startService(intent) + } + Log.d(TAG, "Dispatched show overlay request") + } + + /** Hide the overlay programmatically from native side */ + fun hide(context: Context) { + val intent = + Intent(context, TripOverlayService::class.java).apply { + action = TripOverlayService.ACTION_HIDE + } + context.startService(intent) + Log.d(TAG, "Dispatched hide overlay request") + } + + /** + * Build a TripData JSON string from FCM message data map. Keys match what your server sends + * inside the FCM data payload. + * + * Expected FCM data keys: tripId, passengerName, pickupAddress, dropoffAddress, distanceKm, + * estimatedFare, estimatedMinutes, pickupLat, pickupLng + */ + fun buildTripJsonFromFcmData(data: Map): String { + return try { + JSONObject() + .apply { + put("tripId", data["tripId"] ?: "") + put("passengerName", data["passengerName"] ?: "غير معروف") + put("pickupAddress", data["pickupAddress"] ?: "") + put("dropoffAddress", data["dropoffAddress"] ?: "") + put("distanceKm", data["distanceKm"]?.toDoubleOrNull() ?: 0.0) + put("estimatedFare", data["estimatedFare"]?.toDoubleOrNull() ?: 0.0) + put("estimatedMinutes", data["estimatedMinutes"]?.toIntOrNull() ?: 0) + put("pickupLat", data["pickupLat"]?.toDoubleOrNull() ?: 0.0) + put("pickupLng", data["pickupLng"]?.toDoubleOrNull() ?: 0.0) + put("passengerAvatarUrl", data["passengerAvatarUrl"] ?: "") + } + .toString() + } catch (e: Exception) { + Log.e(TAG, "Error building trip JSON: ${e.message}") + "{}" + } + } + } + + // ─── Broadcast received ─────────────────────────────────────────────────── + + override fun onReceive(context: Context, intent: Intent) { + if (intent.action != ACTION) return + + val tripData = + intent.getStringExtra(EXTRA_TRIP_DATA) + ?: run { + Log.e(TAG, "No trip data in broadcast intent") + return + } + val autoClose = intent.getIntExtra(EXTRA_AUTO_CLOSE, 30) + show(context, tripData, autoClose) + Log.d(TAG, "Received broadcast, showing overlay") + } +} diff --git a/siro_driver/trip_overlay_plugin/android/src/main/kotlin/com/intaleq_driver/trip_overlay_plugin/TripzOverlayService.kt b/siro_driver/trip_overlay_plugin/android/src/main/kotlin/com/intaleq_driver/trip_overlay_plugin/TripzOverlayService.kt new file mode 100644 index 0000000..1811c3b --- /dev/null +++ b/siro_driver/trip_overlay_plugin/android/src/main/kotlin/com/intaleq_driver/trip_overlay_plugin/TripzOverlayService.kt @@ -0,0 +1,560 @@ +package com.intaleq_driver.trip_overlay_plugin + +import android.app.* +import android.content.Context +import android.content.Intent +import android.graphics.BitmapFactory +import android.graphics.Color +import android.graphics.PixelFormat +import android.graphics.drawable.GradientDrawable +import android.media.MediaPlayer +import android.media.RingtoneManager +import android.os.Build +import android.os.CountDownTimer +import android.os.Handler +import android.os.IBinder +import android.os.Looper +import android.util.Log +import android.view.* +import android.widget.* +import androidx.core.app.NotificationCompat +import java.net.HttpURLConnection +import java.net.URL +import kotlin.concurrent.thread +import org.json.JSONObject + +class TripOverlayService : Service() { + + companion object { + const val TAG = "TripOverlayService" + const val ACTION_SHOW = "SHOW" + const val ACTION_HIDE = "HIDE" + const val EXTRA_TRIP_DATA = "trip_data" + const val EXTRA_AUTO_CLOSE_SECONDS = "auto_close_seconds" + private const val NOTIFICATION_ID = 9900 + private const val CHANNEL_ID = "trip_overlay_service_channel" + + @Volatile + var isRunning: Boolean = false + private set + } + + private var windowManager: WindowManager? = null + private var overlayView: View? = null + private var countDownTimer: CountDownTimer? = null + private var currentTripId: String = "" + private var mediaPlayer: MediaPlayer? = null // 🔴 مشغل الصوت + + override fun onBind(intent: Intent?): IBinder? = null + + override fun onCreate() { + super.onCreate() + windowManager = getSystemService(Context.WINDOW_SERVICE) as WindowManager + createNotificationChannel() + } + + override fun onStartCommand(intent: Intent?, flags: Int, startId: Int): Int { + when (intent?.action) { + ACTION_SHOW -> { + val tripDataJson = intent.getStringExtra(EXTRA_TRIP_DATA) ?: return START_NOT_STICKY + val autoClose = intent.getIntExtra(EXTRA_AUTO_CLOSE_SECONDS, 15) + startForegroundWithNotification() + showTripOverlay(tripDataJson, autoClose) + } + ACTION_HIDE -> dismissOverlay(reason = "programmatic") + } + return START_NOT_STICKY + } + + override fun onDestroy() { + removeOverlayView() + countDownTimer?.cancel() + stopSound() // 🔴 إيقاف الصوت عند التدمير + isRunning = false + super.onDestroy() + } + + // ========================================================== + // 🔴 الصوت والإشعارات 🔴 + // ========================================================== + private fun playSound() { + try { + // استخدام صوت التنبيه الافتراضي القوي في الجهاز + val soundUri = RingtoneManager.getDefaultUri(RingtoneManager.TYPE_NOTIFICATION) + mediaPlayer = MediaPlayer.create(this, soundUri) + mediaPlayer?.isLooping = true // تكرار الصوت حتى يتخذ السائق قراراً + mediaPlayer?.start() + } catch (e: Exception) { + Log.e(TAG, "Error playing sound: ${e.message}") + } + } + + private fun stopSound() { + try { + mediaPlayer?.takeIf { it.isPlaying }?.stop() + mediaPlayer?.release() + mediaPlayer = null + } catch (e: Exception) { + Log.e(TAG, "Error stopping sound: ${e.message}") + } + } + + private fun createNotificationChannel() { + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) { + val channel = + NotificationChannel( + CHANNEL_ID, + "Trip Overlay Service", + NotificationManager.IMPORTANCE_LOW + ) + (getSystemService(NOTIFICATION_SERVICE) as NotificationManager) + .createNotificationChannel(channel) + } + } + + private fun startForegroundWithNotification() { + val notification = + NotificationCompat.Builder(this, CHANNEL_ID) + .setContentTitle("طلب رحلة جديد") + .setContentText("يوجد طلب رحلة في انتظارك") + .setSmallIcon(android.R.drawable.ic_dialog_map) + .setPriority(NotificationCompat.PRIORITY_LOW) + .build() + startForeground(NOTIFICATION_ID, notification) + } + + // ========================================================== + // 🔴 بناء وتصميم النافذة (Premium UI) 🔴 + // ========================================================== + private fun showTripOverlay(tripDataJson: String, autoCloseSeconds: Int) { + removeOverlayView() + + val tripData = + parseTripData(tripDataJson) + ?: run { + stopSelf() + return + } + currentTripId = tripData.tripId + + val view = buildOverlayView(tripData, autoCloseSeconds) + overlayView = view + + val type = + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) + WindowManager.LayoutParams.TYPE_APPLICATION_OVERLAY + else @Suppress("DEPRECATION") WindowManager.LayoutParams.TYPE_PHONE + + val params = + WindowManager.LayoutParams( + WindowManager.LayoutParams.MATCH_PARENT, + WindowManager.LayoutParams.WRAP_CONTENT, + type, + WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE or + WindowManager.LayoutParams.FLAG_LAYOUT_IN_SCREEN or + WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON, + PixelFormat.TRANSLUCENT + ) + .apply { + gravity = Gravity.TOP or Gravity.CENTER_HORIZONTAL + val metrics = resources.displayMetrics + y = (metrics.heightPixels * 0.15).toInt() // النزول للأسفل بنسبة 15% + } + + try { + windowManager?.addView(view, params) + isRunning = true + playSound() // 🔴 تشغيل الصوت + startCountdown(autoCloseSeconds) + } catch (e: Exception) { + stopSelf() + } + } + + private fun buildOverlayView(trip: TripInfo, autoCloseSeconds: Int): View { + val ctx = this + + // الخلفية الرئيسية بستايل الكروت الحديثة (حواف دائرية كبيرة) + val card = + FrameLayout(ctx).apply { + background = + GradientDrawable().apply { + cornerRadius = 60f + setColor(Color.WHITE) + setStroke(2, Color.parseColor("#E0E0E0")) // إطار خفيف + } + elevation = 40f + setPadding(0, 0, 0, 0) + layoutParams = + FrameLayout.LayoutParams( + FrameLayout.LayoutParams.MATCH_PARENT, + FrameLayout.LayoutParams.WRAP_CONTENT + ) + .apply { + setMargins(40, 0, 40, 0) // هوامش جانبية + } + } + + val root = LinearLayout(ctx).apply { orientation = LinearLayout.VERTICAL } + card.addView(root) + + // ── 1. صورة الخريطة (Static Map) ── + val mapImageView = + ImageView(ctx).apply { + layoutParams = + LinearLayout.LayoutParams( + LinearLayout.LayoutParams.MATCH_PARENT, + 350 + ) // ارتفاع الخريطة + scaleType = ImageView.ScaleType.CENTER_CROP + setBackgroundColor(Color.parseColor("#F3F4F6")) // لون رمادي فاتح كخلفية بديلة + } + root.addView(mapImageView) + + // 🔴 دالة تحميل الخريطة (شغالة وتحتاج فقط مفتاحك) + loadStaticMap(mapImageView, trip.pickupLat, trip.pickupLng) + + // ── حاوية التفاصيل ── + val detailsContainer = + LinearLayout(ctx).apply { + orientation = LinearLayout.VERTICAL + setPadding(40, 30, 40, 40) + } + root.addView(detailsContainer) + + // ── 2. السعر والمسافة (خط كبير وواضح) ── + val priceRow = + LinearLayout(ctx).apply { + orientation = LinearLayout.HORIZONTAL + gravity = Gravity.CENTER_VERTICAL + } + + val priceText = + TextView(ctx).apply { + text = "${trip.estimatedFare} ل.س" + textSize = 24f + setTextColor(Color.parseColor("#27AE60")) // لون أخضر فخم + typeface = android.graphics.Typeface.DEFAULT_BOLD + layoutParams = + LinearLayout.LayoutParams(0, LinearLayout.LayoutParams.WRAP_CONTENT, 1f) + } + val distanceText = + TextView(ctx).apply { + text = "المسافة: ${trip.distanceKm} كم" + textSize = 14f + setTextColor(Color.parseColor("#7F8C8D")) + typeface = android.graphics.Typeface.DEFAULT_BOLD + } + priceRow.addView(priceText) + priceRow.addView(distanceText) + detailsContainer.addView(priceRow) + + detailsContainer.addView(divider(ctx, 30)) + + // ── 3. المواقع (الانطلاق والوصول) ── + detailsContainer.addView(labeledRow(ctx, "🟢 من:", trip.pickupAddress)) + detailsContainer.addView(labeledRow(ctx, "🔴 إلى:", trip.dropoffAddress)) + detailsContainer.addView(labeledRow(ctx, "👤 الراكب:", trip.passengerName)) + + detailsContainer.addView(divider(ctx, 30)) + + // ── 4. شريط الوقت ── + val countdownLabel = + TextView(ctx).apply { + text = "ينتهي خلال $autoCloseSeconds ثانية" + textSize = 12f + setTextColor(Color.parseColor("#E74C3C")) + gravity = Gravity.CENTER + id = android.R.id.text1 + } + val progressBar = + ProgressBar(ctx, null, android.R.attr.progressBarStyleHorizontal).apply { + max = autoCloseSeconds + progress = autoCloseSeconds + id = android.R.id.progress + progressTintList = + android.content.res.ColorStateList.valueOf(Color.parseColor("#E74C3C")) + layoutParams = + LinearLayout.LayoutParams(LinearLayout.LayoutParams.MATCH_PARENT, 15) + .apply { + topMargin = 10 + bottomMargin = 30 + } + } + detailsContainer.addView(countdownLabel) + detailsContainer.addView(progressBar) + + // ── 5. الأزرار (تصميم كبسولة فخم) ── + val buttonsRow = LinearLayout(ctx).apply { orientation = LinearLayout.HORIZONTAL } + + val rejectBtn = + Button(ctx).apply { + text = "رفض" + textSize = 16f + setTextColor(Color.parseColor("#E74C3C")) // نص أحمر + background = + GradientDrawable().apply { + cornerRadius = 100f + setColor(Color.parseColor("#FDEDEC")) // خلفية حمراء باهتة فخمة + } + layoutParams = + LinearLayout.LayoutParams(0, LinearLayout.LayoutParams.WRAP_CONTENT, 1f) + .apply { rightMargin = 20 } + setOnClickListener { dismissOverlay(reason = "rejected") } + } + + val acceptBtn = + Button(ctx).apply { + text = "قبول الطلب" + textSize = 16f + setTextColor(Color.WHITE) + background = + GradientDrawable().apply { + cornerRadius = 100f + setColor(Color.parseColor("#27AE60")) // لون أخضر فخم + } + layoutParams = + LinearLayout.LayoutParams( + 0, + LinearLayout.LayoutParams.WRAP_CONTENT, + 1.5f + ) // زر القبول أكبر قليلاً + setOnClickListener { onTripAccepted() } + } + + buttonsRow.addView(rejectBtn) + buttonsRow.addView(acceptBtn) + detailsContainer.addView(buttonsRow) + + card.tag = mapOf("countdownLabel" to countdownLabel, "progressBar" to progressBar) + return card + } + // 🔴 دالة احترافية لقراءة المفتاح المحقون من Gradle 🔴 + private fun getGoogleMapsApiKey(): String { + return try { + // الوصول إلى بيانات التطبيق في الـ Manifest + val appInfo = + packageManager.getApplicationInfo( + packageName, + android.content.pm.PackageManager.GET_META_DATA + ) + val bundle = appInfo.metaData + + // قراءة المفتاح (تأكد أن هذا هو نفس الاسم الموجود في AndroidManifest.xml لديك) + val apiKey = bundle?.getString("com.google.android.geo.API_KEY") + + apiKey ?: "" // إرجاع المفتاح أو نص فارغ إذا لم يجده + } catch (e: Exception) { + Log.e(TAG, "❌ فشل في قراءة مفتاح الخريطة من Manifest: ${e.message}") + "" + } + } + + // ========================================================== + // 🔴 جلب صورة الخريطة (Static Map) 🔴 + // ========================================================== + // ========================================================== + // 🔴 جلب صورة الخريطة (Static Map) 🔴 + // ========================================================== + private fun loadStaticMap(imageView: ImageView, lat: Double, lng: Double) { + if (lat == 0.0 || lng == 0.0) { + Log.e(TAG, "⚠️ الإحداثيات صفر، تم تجاهل تحميل الخريطة") + return + } + + // 🟢 جلب المفتاح بأمان تام من الـ Properties عبر الـ Manifest 🟢 + val apiKey = getGoogleMapsApiKey() + + if (apiKey.isEmpty()) { + Log.e(TAG, "⚠️ مفتاح جوجل ماب غير موجود أو فارغ!") + return + } + + // رابط احترافي: زووم مناسب، وضع خريطة نظيف، ودبوس أخضر بارز + val mapUrl = + "https://maps.googleapis.com/maps/api/staticmap?center=$lat,$lng&zoom=15&size=600x350&maptype=roadmap&markers=color:0x27AE60%7C$lat,$lng&key=$apiKey" + + thread { + try { + val url = URL(mapUrl) + val connection = url.openConnection() as HttpURLConnection + connection.doInput = true + connection.connectTimeout = 5000 // تحديد وقت أقصى للاتصال + connection.readTimeout = 5000 + connection.connect() + + if (connection.responseCode == HttpURLConnection.HTTP_OK) { + val bitmap = BitmapFactory.decodeStream(connection.inputStream) + // عرض الصورة في الواجهة (Main Thread) + Handler(Looper.getMainLooper()).post { imageView.setImageBitmap(bitmap) } + } else { + Log.e(TAG, "❌ خطأ من سيرفر جوجل: ${connection.responseCode}") + } + } catch (e: Exception) { + Log.e(TAG, "❌ فشل الاتصال بخدمة الخرائط: ${e.message}") + } + } + } + + // ========================================================== + // 🔴 أدوات مساعدة للتصميم 🔴 + // ========================================================== + private fun labeledRow(ctx: Context, label: String, value: String): LinearLayout { + return LinearLayout(ctx).apply { + orientation = LinearLayout.HORIZONTAL + setPadding(0, 8, 0, 8) + gravity = Gravity.CENTER_VERTICAL + + addView( + TextView(ctx).apply { + text = label + textSize = 14f + setTextColor(Color.parseColor("#7F8C8D")) + layoutParams = + LinearLayout.LayoutParams( + LinearLayout.LayoutParams.WRAP_CONTENT, + LinearLayout.LayoutParams.WRAP_CONTENT + ) + .apply { rightMargin = 16 } + } + ) + addView( + TextView(ctx).apply { + text = value + textSize = 15f + setTextColor(Color.parseColor("#2C3E50")) + typeface = android.graphics.Typeface.DEFAULT_BOLD + maxLines = 1 + ellipsize = android.text.TextUtils.TruncateAt.END + } + ) + } + } + + private fun statChip(ctx: Context, value: String, label: String): LinearLayout { + return LinearLayout(ctx).apply { + orientation = LinearLayout.VERTICAL + gravity = Gravity.CENTER + layoutParams = LinearLayout.LayoutParams(0, LinearLayout.LayoutParams.WRAP_CONTENT, 1f) + + addView( + TextView(ctx).apply { + text = value + textSize = 16f + setTextColor(Color.parseColor("#2C3E50")) + typeface = android.graphics.Typeface.DEFAULT_BOLD + } + ) + addView( + TextView(ctx).apply { + text = label + textSize = 12f + setTextColor(Color.parseColor("#95A5A6")) + } + ) + } + } + + private fun divider(ctx: Context, margin: Int = 16): View { + return View(ctx).apply { + setBackgroundColor(Color.parseColor("#EEEEEE")) + layoutParams = + LinearLayout.LayoutParams(LinearLayout.LayoutParams.MATCH_PARENT, 2).apply { + setMargins(0, margin, 0, margin) + } + } + } + + // ========================================================== + // 🔴 التحكم والمؤقت 🔴 + // ========================================================== + private fun startCountdown(totalSeconds: Int) { + countDownTimer?.cancel() + countDownTimer = + object : CountDownTimer(totalSeconds * 1000L, 1000L) { + override fun onTick(millisUntilFinished: Long) { + updateCountdownUI((millisUntilFinished / 1000).toInt()) + } + override fun onFinish() { + dismissOverlay(reason = "timeout") + } + } + .start() + } + + private fun updateCountdownUI(secondsLeft: Int) { + val tagMap = overlayView?.tag as? Map<*, *> ?: return + val label = tagMap["countdownLabel"] as? TextView ?: return + val bar = tagMap["progressBar"] as? ProgressBar ?: return + label.text = "ينتهي خلال $secondsLeft ثانية" + bar.progress = secondsLeft + } + + private fun onTripAccepted() { + stopSound() // 🔴 + TripOverlayPlugin.notifyTripAccepted(currentTripId) + bringAppToForeground() + removeOverlayView() + stopSelf() + } + + private fun dismissOverlay(reason: String) { + stopSound() // 🔴 + countDownTimer?.cancel() + if (reason == "rejected" || reason == "timeout") { + TripOverlayPlugin.notifyTripRejected(currentTripId) + } + removeOverlayView() + stopSelf() + } + + private fun bringAppToForeground() { + val launchIntent = packageManager.getLaunchIntentForPackage(packageName) ?: return + launchIntent.apply { + addFlags( + Intent.FLAG_ACTIVITY_NEW_TASK or + Intent.FLAG_ACTIVITY_REORDER_TO_FRONT or + Intent.FLAG_ACTIVITY_SINGLE_TOP + ) + putExtra("acceptedTripId", currentTripId) + } + startActivity(launchIntent) + } + + private fun removeOverlayView() { + overlayView?.let { windowManager?.removeView(it) } + overlayView = null + isRunning = false + } + + private fun parseTripData(json: String): TripInfo? { + return try { + val obj = JSONObject(json) + TripInfo( + tripId = obj.getString("tripId"), + passengerName = obj.getString("passengerName"), + pickupAddress = obj.getString("pickupAddress"), + dropoffAddress = obj.getString("dropoffAddress"), + distanceKm = obj.getDouble("distanceKm"), + estimatedFare = obj.getDouble("estimatedFare"), + estimatedMinutes = obj.getInt("estimatedMinutes"), + pickupLat = obj.getDouble("pickupLat"), + pickupLng = obj.getDouble("pickupLng") + ) + } catch (e: Exception) { + null + } + } + + data class TripInfo( + val tripId: String, + val passengerName: String, + val pickupAddress: String, + val dropoffAddress: String, + val distanceKm: Double, + val estimatedFare: Double, + val estimatedMinutes: Int, + val pickupLat: Double, + val pickupLng: Double + ) +} diff --git a/siro_driver/trip_overlay_plugin/android/src/test/kotlin/com/intaleq_driver/trip_overlay_plugin/TripOverlayPluginTest.kt b/siro_driver/trip_overlay_plugin/android/src/test/kotlin/com/intaleq_driver/trip_overlay_plugin/TripOverlayPluginTest.kt new file mode 100644 index 0000000..fc9f0dc --- /dev/null +++ b/siro_driver/trip_overlay_plugin/android/src/test/kotlin/com/intaleq_driver/trip_overlay_plugin/TripOverlayPluginTest.kt @@ -0,0 +1,27 @@ +package com.intaleq_driver.trip_overlay_plugin + +import io.flutter.plugin.common.MethodCall +import io.flutter.plugin.common.MethodChannel +import org.mockito.Mockito +import kotlin.test.Test + +/* + * This demonstrates a simple unit test of the Kotlin portion of this plugin's implementation. + * + * Once you have built the plugin's example app, you can run these tests from the command + * line by running `./gradlew testDebugUnitTest` in the `example/android/` directory, or + * you can run them directly from IDEs that support JUnit such as Android Studio. + */ + +internal class TripOverlayPluginTest { + @Test + fun onMethodCall_getPlatformVersion_returnsExpectedValue() { + val plugin = TripOverlayPlugin() + + val call = MethodCall("getPlatformVersion", null) + val mockResult: MethodChannel.Result = Mockito.mock(MethodChannel.Result::class.java) + plugin.onMethodCall(call, mockResult) + + Mockito.verify(mockResult).success("Android " + android.os.Build.VERSION.RELEASE) + } +} diff --git a/siro_driver/trip_overlay_plugin/example/.gitignore b/siro_driver/trip_overlay_plugin/example/.gitignore new file mode 100644 index 0000000..3820a95 --- /dev/null +++ b/siro_driver/trip_overlay_plugin/example/.gitignore @@ -0,0 +1,45 @@ +# Miscellaneous +*.class +*.log +*.pyc +*.swp +.DS_Store +.atom/ +.build/ +.buildlog/ +.history +.svn/ +.swiftpm/ +migrate_working_dir/ + +# IntelliJ related +*.iml +*.ipr +*.iws +.idea/ + +# The .vscode folder contains launch configuration and tasks you configure in +# VS Code which you may wish to be included in version control, so this line +# is commented out by default. +#.vscode/ + +# Flutter/Dart/Pub related +**/doc/api/ +**/ios/Flutter/.last_build_id +.dart_tool/ +.flutter-plugins-dependencies +.pub-cache/ +.pub/ +/build/ +/coverage/ + +# Symbolication related +app.*.symbols + +# Obfuscation related +app.*.map.json + +# Android Studio will place build artifacts here +/android/app/debug +/android/app/profile +/android/app/release diff --git a/siro_driver/trip_overlay_plugin/example/README.md b/siro_driver/trip_overlay_plugin/example/README.md new file mode 100644 index 0000000..4b44f24 --- /dev/null +++ b/siro_driver/trip_overlay_plugin/example/README.md @@ -0,0 +1,16 @@ +# trip_overlay_plugin_example + +Demonstrates how to use the trip_overlay_plugin plugin. + +## Getting Started + +This project is a starting point for a Flutter application. + +A few resources to get you started if this is your first Flutter project: + +- [Lab: Write your first Flutter app](https://docs.flutter.dev/get-started/codelab) +- [Cookbook: Useful Flutter samples](https://docs.flutter.dev/cookbook) + +For help getting started with Flutter development, view the +[online documentation](https://docs.flutter.dev/), which offers tutorials, +samples, guidance on mobile development, and a full API reference. diff --git a/siro_driver/trip_overlay_plugin/example/analysis_options.yaml b/siro_driver/trip_overlay_plugin/example/analysis_options.yaml new file mode 100644 index 0000000..0d29021 --- /dev/null +++ b/siro_driver/trip_overlay_plugin/example/analysis_options.yaml @@ -0,0 +1,28 @@ +# This file configures the analyzer, which statically analyzes Dart code to +# check for errors, warnings, and lints. +# +# The issues identified by the analyzer are surfaced in the UI of Dart-enabled +# IDEs (https://dart.dev/tools#ides-and-editors). The analyzer can also be +# invoked from the command line by running `flutter analyze`. + +# The following line activates a set of recommended lints for Flutter apps, +# packages, and plugins designed to encourage good coding practices. +include: package:flutter_lints/flutter.yaml + +linter: + # The lint rules applied to this project can be customized in the + # section below to disable rules from the `package:flutter_lints/flutter.yaml` + # included above or to enable additional rules. A list of all available lints + # and their documentation is published at https://dart.dev/lints. + # + # Instead of disabling a lint rule for the entire project in the + # section below, it can also be suppressed for a single line of code + # or a specific dart file by using the `// ignore: name_of_lint` and + # `// ignore_for_file: name_of_lint` syntax on the line or in the file + # producing the lint. + rules: + # avoid_print: false # Uncomment to disable the `avoid_print` rule + # prefer_single_quotes: true # Uncomment to enable the `prefer_single_quotes` rule + +# Additional information about this file can be found at +# https://dart.dev/guides/language/analysis-options diff --git a/siro_driver/trip_overlay_plugin/example/android/.gitignore b/siro_driver/trip_overlay_plugin/example/android/.gitignore new file mode 100644 index 0000000..be3943c --- /dev/null +++ b/siro_driver/trip_overlay_plugin/example/android/.gitignore @@ -0,0 +1,14 @@ +gradle-wrapper.jar +/.gradle +/captures/ +/gradlew +/gradlew.bat +/local.properties +GeneratedPluginRegistrant.java +.cxx/ + +# Remember to never publicly share your keystore. +# See https://flutter.dev/to/reference-keystore +key.properties +**/*.keystore +**/*.jks diff --git a/siro_driver/trip_overlay_plugin/example/android/app/build.gradle.kts b/siro_driver/trip_overlay_plugin/example/android/app/build.gradle.kts new file mode 100644 index 0000000..0b353f7 --- /dev/null +++ b/siro_driver/trip_overlay_plugin/example/android/app/build.gradle.kts @@ -0,0 +1,44 @@ +plugins { + id("com.android.application") + id("kotlin-android") + // The Flutter Gradle Plugin must be applied after the Android and Kotlin Gradle plugins. + id("dev.flutter.flutter-gradle-plugin") +} + +android { + namespace = "com.intaleq_driver.trip_overlay_plugin_example" + compileSdk = flutter.compileSdkVersion + ndkVersion = flutter.ndkVersion + + compileOptions { + sourceCompatibility = JavaVersion.VERSION_17 + targetCompatibility = JavaVersion.VERSION_17 + } + + kotlinOptions { + jvmTarget = JavaVersion.VERSION_17.toString() + } + + defaultConfig { + // TODO: Specify your own unique Application ID (https://developer.android.com/studio/build/application-id.html). + applicationId = "com.intaleq_driver.trip_overlay_plugin_example" + // You can update the following values to match your application needs. + // For more information, see: https://flutter.dev/to/review-gradle-config. + minSdk = flutter.minSdkVersion + targetSdk = flutter.targetSdkVersion + versionCode = flutter.versionCode + versionName = flutter.versionName + } + + buildTypes { + release { + // TODO: Add your own signing config for the release build. + // Signing with the debug keys for now, so `flutter run --release` works. + signingConfig = signingConfigs.getByName("debug") + } + } +} + +flutter { + source = "../.." +} diff --git a/siro_driver/trip_overlay_plugin/example/android/app/src/debug/AndroidManifest.xml b/siro_driver/trip_overlay_plugin/example/android/app/src/debug/AndroidManifest.xml new file mode 100644 index 0000000..399f698 --- /dev/null +++ b/siro_driver/trip_overlay_plugin/example/android/app/src/debug/AndroidManifest.xml @@ -0,0 +1,7 @@ + + + + diff --git a/siro_driver/trip_overlay_plugin/example/android/app/src/main/AndroidManifest.xml b/siro_driver/trip_overlay_plugin/example/android/app/src/main/AndroidManifest.xml new file mode 100644 index 0000000..023b46c --- /dev/null +++ b/siro_driver/trip_overlay_plugin/example/android/app/src/main/AndroidManifest.xml @@ -0,0 +1,45 @@ + + + + + + + + + + + + + + + + + + + + + diff --git a/siro_driver/trip_overlay_plugin/example/android/app/src/main/kotlin/com/intaleq_driver/trip_overlay_plugin_example/MainActivity.kt b/siro_driver/trip_overlay_plugin/example/android/app/src/main/kotlin/com/intaleq_driver/trip_overlay_plugin_example/MainActivity.kt new file mode 100644 index 0000000..a2333ca --- /dev/null +++ b/siro_driver/trip_overlay_plugin/example/android/app/src/main/kotlin/com/intaleq_driver/trip_overlay_plugin_example/MainActivity.kt @@ -0,0 +1,5 @@ +package com.intaleq_driver.trip_overlay_plugin_example + +import io.flutter.embedding.android.FlutterActivity + +class MainActivity : FlutterActivity() diff --git a/siro_driver/trip_overlay_plugin/example/android/app/src/main/res/drawable-v21/launch_background.xml b/siro_driver/trip_overlay_plugin/example/android/app/src/main/res/drawable-v21/launch_background.xml new file mode 100644 index 0000000..f74085f --- /dev/null +++ b/siro_driver/trip_overlay_plugin/example/android/app/src/main/res/drawable-v21/launch_background.xml @@ -0,0 +1,12 @@ + + + + + + + + diff --git a/siro_driver/trip_overlay_plugin/example/android/app/src/main/res/drawable/launch_background.xml b/siro_driver/trip_overlay_plugin/example/android/app/src/main/res/drawable/launch_background.xml new file mode 100644 index 0000000..304732f --- /dev/null +++ b/siro_driver/trip_overlay_plugin/example/android/app/src/main/res/drawable/launch_background.xml @@ -0,0 +1,12 @@ + + + + + + + + diff --git a/siro_driver/trip_overlay_plugin/example/android/app/src/main/res/mipmap-hdpi/ic_launcher.png b/siro_driver/trip_overlay_plugin/example/android/app/src/main/res/mipmap-hdpi/ic_launcher.png new file mode 100644 index 0000000..db77bb4 Binary files /dev/null and b/siro_driver/trip_overlay_plugin/example/android/app/src/main/res/mipmap-hdpi/ic_launcher.png differ diff --git a/siro_driver/trip_overlay_plugin/example/android/app/src/main/res/mipmap-mdpi/ic_launcher.png b/siro_driver/trip_overlay_plugin/example/android/app/src/main/res/mipmap-mdpi/ic_launcher.png new file mode 100644 index 0000000..17987b7 Binary files /dev/null and b/siro_driver/trip_overlay_plugin/example/android/app/src/main/res/mipmap-mdpi/ic_launcher.png differ diff --git a/siro_driver/trip_overlay_plugin/example/android/app/src/main/res/mipmap-xhdpi/ic_launcher.png b/siro_driver/trip_overlay_plugin/example/android/app/src/main/res/mipmap-xhdpi/ic_launcher.png new file mode 100644 index 0000000..09d4391 Binary files /dev/null and b/siro_driver/trip_overlay_plugin/example/android/app/src/main/res/mipmap-xhdpi/ic_launcher.png differ diff --git a/siro_driver/trip_overlay_plugin/example/android/app/src/main/res/mipmap-xxhdpi/ic_launcher.png b/siro_driver/trip_overlay_plugin/example/android/app/src/main/res/mipmap-xxhdpi/ic_launcher.png new file mode 100644 index 0000000..d5f1c8d Binary files /dev/null and b/siro_driver/trip_overlay_plugin/example/android/app/src/main/res/mipmap-xxhdpi/ic_launcher.png differ diff --git a/siro_driver/trip_overlay_plugin/example/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png b/siro_driver/trip_overlay_plugin/example/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png new file mode 100644 index 0000000..4d6372e Binary files /dev/null and b/siro_driver/trip_overlay_plugin/example/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png differ diff --git a/siro_driver/trip_overlay_plugin/example/android/app/src/main/res/values-night/styles.xml b/siro_driver/trip_overlay_plugin/example/android/app/src/main/res/values-night/styles.xml new file mode 100644 index 0000000..06952be --- /dev/null +++ b/siro_driver/trip_overlay_plugin/example/android/app/src/main/res/values-night/styles.xml @@ -0,0 +1,18 @@ + + + + + + + diff --git a/siro_driver/trip_overlay_plugin/example/android/app/src/main/res/values/styles.xml b/siro_driver/trip_overlay_plugin/example/android/app/src/main/res/values/styles.xml new file mode 100644 index 0000000..cb1ef88 --- /dev/null +++ b/siro_driver/trip_overlay_plugin/example/android/app/src/main/res/values/styles.xml @@ -0,0 +1,18 @@ + + + + + + + diff --git a/siro_driver/trip_overlay_plugin/example/android/app/src/profile/AndroidManifest.xml b/siro_driver/trip_overlay_plugin/example/android/app/src/profile/AndroidManifest.xml new file mode 100644 index 0000000..399f698 --- /dev/null +++ b/siro_driver/trip_overlay_plugin/example/android/app/src/profile/AndroidManifest.xml @@ -0,0 +1,7 @@ + + + + diff --git a/siro_driver/trip_overlay_plugin/example/android/build.gradle.kts b/siro_driver/trip_overlay_plugin/example/android/build.gradle.kts new file mode 100644 index 0000000..dbee657 --- /dev/null +++ b/siro_driver/trip_overlay_plugin/example/android/build.gradle.kts @@ -0,0 +1,24 @@ +allprojects { + repositories { + google() + mavenCentral() + } +} + +val newBuildDir: Directory = + rootProject.layout.buildDirectory + .dir("../../build") + .get() +rootProject.layout.buildDirectory.value(newBuildDir) + +subprojects { + val newSubprojectBuildDir: Directory = newBuildDir.dir(project.name) + project.layout.buildDirectory.value(newSubprojectBuildDir) +} +subprojects { + project.evaluationDependsOn(":app") +} + +tasks.register("clean") { + delete(rootProject.layout.buildDirectory) +} diff --git a/siro_driver/trip_overlay_plugin/example/android/gradle.properties b/siro_driver/trip_overlay_plugin/example/android/gradle.properties new file mode 100644 index 0000000..fbee1d8 --- /dev/null +++ b/siro_driver/trip_overlay_plugin/example/android/gradle.properties @@ -0,0 +1,2 @@ +org.gradle.jvmargs=-Xmx8G -XX:MaxMetaspaceSize=4G -XX:ReservedCodeCacheSize=512m -XX:+HeapDumpOnOutOfMemoryError +android.useAndroidX=true diff --git a/siro_driver/trip_overlay_plugin/example/android/gradle/wrapper/gradle-wrapper.properties b/siro_driver/trip_overlay_plugin/example/android/gradle/wrapper/gradle-wrapper.properties new file mode 100644 index 0000000..e4ef43f --- /dev/null +++ b/siro_driver/trip_overlay_plugin/example/android/gradle/wrapper/gradle-wrapper.properties @@ -0,0 +1,5 @@ +distributionBase=GRADLE_USER_HOME +distributionPath=wrapper/dists +zipStoreBase=GRADLE_USER_HOME +zipStorePath=wrapper/dists +distributionUrl=https\://services.gradle.org/distributions/gradle-8.14-all.zip diff --git a/siro_driver/trip_overlay_plugin/example/android/settings.gradle.kts b/siro_driver/trip_overlay_plugin/example/android/settings.gradle.kts new file mode 100644 index 0000000..ca7fe06 --- /dev/null +++ b/siro_driver/trip_overlay_plugin/example/android/settings.gradle.kts @@ -0,0 +1,26 @@ +pluginManagement { + val flutterSdkPath = + run { + val properties = java.util.Properties() + file("local.properties").inputStream().use { properties.load(it) } + val flutterSdkPath = properties.getProperty("flutter.sdk") + require(flutterSdkPath != null) { "flutter.sdk not set in local.properties" } + flutterSdkPath + } + + includeBuild("$flutterSdkPath/packages/flutter_tools/gradle") + + repositories { + google() + mavenCentral() + gradlePluginPortal() + } +} + +plugins { + id("dev.flutter.flutter-plugin-loader") version "1.0.0" + id("com.android.application") version "8.11.1" apply false + id("org.jetbrains.kotlin.android") version "2.2.20" apply false +} + +include(":app") diff --git a/siro_driver/trip_overlay_plugin/example/integration_test/plugin_integration_test.dart b/siro_driver/trip_overlay_plugin/example/integration_test/plugin_integration_test.dart new file mode 100644 index 0000000..592d6c3 --- /dev/null +++ b/siro_driver/trip_overlay_plugin/example/integration_test/plugin_integration_test.dart @@ -0,0 +1,16 @@ +// This is a basic Flutter integration test. +// +// Since integration tests run in a full Flutter application, they can interact +// with the host side of a plugin implementation, unlike Dart unit tests. +// +// For more information about Flutter integration tests, please see +// https://flutter.dev/to/integration-testing + +import 'package:flutter_test/flutter_test.dart'; +import 'package:integration_test/integration_test.dart'; + +import 'package:trip_overlay_plugin/trip_overlay_plugin.dart'; + +void main() { + IntegrationTestWidgetsFlutterBinding.ensureInitialized(); +} diff --git a/siro_driver/trip_overlay_plugin/example/lib/main.dart b/siro_driver/trip_overlay_plugin/example/lib/main.dart new file mode 100644 index 0000000..bab302b --- /dev/null +++ b/siro_driver/trip_overlay_plugin/example/lib/main.dart @@ -0,0 +1,59 @@ +import 'package:flutter/material.dart'; +import 'dart:async'; + +import 'package:flutter/services.dart'; +import 'package:trip_overlay_plugin/trip_overlay_plugin.dart'; + +void main() { + runApp(const MyApp()); +} + +class MyApp extends StatefulWidget { + const MyApp({super.key}); + + @override + State createState() => _MyAppState(); +} + +class _MyAppState extends State { + String _platformVersion = 'Unknown'; + final _tripOverlayPlugin = TripOverlayPlugin(); + + @override + void initState() { + super.initState(); + initPlatformState(); + } + + // Platform messages are asynchronous, so we initialize in an async method. + Future initPlatformState() async { + String platformVersion = 'Unknown platform version'; + // Platform messages may fail, so we use a try/catch PlatformException. + // We also handle the message potentially returning null. + try { + // TODO: Replace with the correct method from TripOverlayPlugin + platformVersion = 'Unknown platform version'; + } on PlatformException { + platformVersion = 'Failed to get platform version.'; + } + + // If the widget was removed from the tree while the asynchronous platform + // message was in flight, we want to discard the reply rather than calling + // setState to update our non-existent appearance. + if (!mounted) return; + + setState(() { + _platformVersion = platformVersion; + }); + } + + @override + Widget build(BuildContext context) { + return MaterialApp( + home: Scaffold( + appBar: AppBar(title: const Text('Plugin example app')), + body: Center(child: Text('Running on: $_platformVersion\n')), + ), + ); + } +} diff --git a/siro_driver/trip_overlay_plugin/example/pubspec.lock b/siro_driver/trip_overlay_plugin/example/pubspec.lock new file mode 100644 index 0000000..d621858 --- /dev/null +++ b/siro_driver/trip_overlay_plugin/example/pubspec.lock @@ -0,0 +1,283 @@ +# Generated by pub +# See https://dart.dev/tools/pub/glossary#lockfile +packages: + async: + dependency: transitive + description: + name: async + sha256: "758e6d74e971c3e5aceb4110bfd6698efc7f501675bcfe0c775459a8140750eb" + url: "https://pub.dev" + source: hosted + version: "2.13.0" + boolean_selector: + dependency: transitive + description: + name: boolean_selector + sha256: "8aab1771e1243a5063b8b0ff68042d67334e3feab9e95b9490f9a6ebf73b42ea" + url: "https://pub.dev" + source: hosted + version: "2.1.2" + characters: + dependency: transitive + description: + name: characters + sha256: faf38497bda5ead2a8c7615f4f7939df04333478bf32e4173fcb06d428b5716b + url: "https://pub.dev" + source: hosted + version: "1.4.1" + clock: + dependency: transitive + description: + name: clock + sha256: fddb70d9b5277016c77a80201021d40a2247104d9f4aa7bab7157b7e3f05b84b + url: "https://pub.dev" + source: hosted + version: "1.1.2" + collection: + dependency: transitive + description: + name: collection + sha256: "2f5709ae4d3d59dd8f7cd309b4e023046b57d8a6c82130785d2b0e5868084e76" + url: "https://pub.dev" + source: hosted + version: "1.19.1" + cupertino_icons: + dependency: "direct main" + description: + name: cupertino_icons + sha256: ba631d1c7f7bef6b729a622b7b752645a2d076dba9976925b8f25725a30e1ee6 + url: "https://pub.dev" + source: hosted + version: "1.0.8" + fake_async: + dependency: transitive + description: + name: fake_async + sha256: "5368f224a74523e8d2e7399ea1638b37aecfca824a3cc4dfdf77bf1fa905ac44" + url: "https://pub.dev" + source: hosted + version: "1.3.3" + file: + dependency: transitive + description: + name: file + sha256: a3b4f84adafef897088c160faf7dfffb7696046cb13ae90b508c2cbc95d3b8d4 + url: "https://pub.dev" + source: hosted + version: "7.0.1" + flutter: + dependency: "direct main" + description: flutter + source: sdk + version: "0.0.0" + flutter_driver: + dependency: transitive + description: flutter + source: sdk + version: "0.0.0" + flutter_lints: + dependency: "direct dev" + description: + name: flutter_lints + sha256: "3105dc8492f6183fb076ccf1f351ac3d60564bff92e20bfc4af9cc1651f4e7e1" + url: "https://pub.dev" + source: hosted + version: "6.0.0" + flutter_test: + dependency: "direct dev" + description: flutter + source: sdk + version: "0.0.0" + fuchsia_remote_debug_protocol: + dependency: transitive + description: flutter + source: sdk + version: "0.0.0" + integration_test: + dependency: "direct dev" + description: flutter + source: sdk + version: "0.0.0" + leak_tracker: + dependency: transitive + description: + name: leak_tracker + sha256: "33e2e26bdd85a0112ec15400c8cbffea70d0f9c3407491f672a2fad47915e2de" + url: "https://pub.dev" + source: hosted + version: "11.0.2" + leak_tracker_flutter_testing: + dependency: transitive + description: + name: leak_tracker_flutter_testing + sha256: "1dbc140bb5a23c75ea9c4811222756104fbcd1a27173f0c34ca01e16bea473c1" + url: "https://pub.dev" + source: hosted + version: "3.0.10" + leak_tracker_testing: + dependency: transitive + description: + name: leak_tracker_testing + sha256: "8d5a2d49f4a66b49744b23b018848400d23e54caf9463f4eb20df3eb8acb2eb1" + url: "https://pub.dev" + source: hosted + version: "3.0.2" + lints: + dependency: transitive + description: + name: lints + sha256: "12f842a479589fea194fe5c5a3095abc7be0c1f2ddfa9a0e76aed1dbd26a87df" + url: "https://pub.dev" + source: hosted + version: "6.1.0" + matcher: + dependency: transitive + description: + name: matcher + sha256: "12956d0ad8390bbcc63ca2e1469c0619946ccb52809807067a7020d57e647aa6" + url: "https://pub.dev" + source: hosted + version: "0.12.18" + material_color_utilities: + dependency: transitive + description: + name: material_color_utilities + sha256: "9c337007e82b1889149c82ed242ed1cb24a66044e30979c44912381e9be4c48b" + url: "https://pub.dev" + source: hosted + version: "0.13.0" + meta: + dependency: transitive + description: + name: meta + sha256: "23f08335362185a5ea2ad3a4e597f1375e78bce8a040df5c600c8d3552ef2394" + url: "https://pub.dev" + source: hosted + version: "1.17.0" + path: + dependency: transitive + description: + name: path + sha256: "75cca69d1490965be98c73ceaea117e8a04dd21217b37b292c9ddbec0d955bc5" + url: "https://pub.dev" + source: hosted + version: "1.9.1" + platform: + dependency: transitive + description: + name: platform + sha256: "5d6b1b0036a5f331ebc77c850ebc8506cbc1e9416c27e59b439f917a902a4984" + url: "https://pub.dev" + source: hosted + version: "3.1.6" + plugin_platform_interface: + dependency: transitive + description: + name: plugin_platform_interface + sha256: "4820fbfdb9478b1ebae27888254d445073732dae3d6ea81f0b7e06d5dedc3f02" + url: "https://pub.dev" + source: hosted + version: "2.1.8" + process: + dependency: transitive + description: + name: process + sha256: c6248e4526673988586e8c00bb22a49210c258dc91df5227d5da9748ecf79744 + url: "https://pub.dev" + source: hosted + version: "5.0.5" + sky_engine: + dependency: transitive + description: flutter + source: sdk + version: "0.0.0" + source_span: + dependency: transitive + description: + name: source_span + sha256: "56a02f1f4cd1a2d96303c0144c93bd6d909eea6bee6bf5a0e0b685edbd4c47ab" + url: "https://pub.dev" + source: hosted + version: "1.10.2" + stack_trace: + dependency: transitive + description: + name: stack_trace + sha256: "8b27215b45d22309b5cddda1aa2b19bdfec9df0e765f2de506401c071d38d1b1" + url: "https://pub.dev" + source: hosted + version: "1.12.1" + stream_channel: + dependency: transitive + description: + name: stream_channel + sha256: "969e04c80b8bcdf826f8f16579c7b14d780458bd97f56d107d3950fdbeef059d" + url: "https://pub.dev" + source: hosted + version: "2.1.4" + string_scanner: + dependency: transitive + description: + name: string_scanner + sha256: "921cd31725b72fe181906c6a94d987c78e3b98c2e205b397ea399d4054872b43" + url: "https://pub.dev" + source: hosted + version: "1.4.1" + sync_http: + dependency: transitive + description: + name: sync_http + sha256: "7f0cd72eca000d2e026bcd6f990b81d0ca06022ef4e32fb257b30d3d1014a961" + url: "https://pub.dev" + source: hosted + version: "0.3.1" + term_glyph: + dependency: transitive + description: + name: term_glyph + sha256: "7f554798625ea768a7518313e58f83891c7f5024f88e46e7182a4558850a4b8e" + url: "https://pub.dev" + source: hosted + version: "1.2.2" + test_api: + dependency: transitive + description: + name: test_api + sha256: "93167629bfc610f71560ab9312acdda4959de4df6fac7492c89ff0d3886f6636" + url: "https://pub.dev" + source: hosted + version: "0.7.9" + trip_overlay_plugin: + dependency: "direct main" + description: + path: ".." + relative: true + source: path + version: "0.0.1" + vector_math: + dependency: transitive + description: + name: vector_math + sha256: d530bd74fea330e6e364cda7a85019c434070188383e1cd8d9777ee586914c5b + url: "https://pub.dev" + source: hosted + version: "2.2.0" + vm_service: + dependency: transitive + description: + name: vm_service + sha256: "45caa6c5917fa127b5dbcfbd1fa60b14e583afdc08bfc96dda38886ca252eb60" + url: "https://pub.dev" + source: hosted + version: "15.0.2" + webdriver: + dependency: transitive + description: + name: webdriver + sha256: "2f3a14ca026957870cfd9c635b83507e0e51d8091568e90129fbf805aba7cade" + url: "https://pub.dev" + source: hosted + version: "3.1.0" +sdks: + dart: ">=3.10.8 <4.0.0" + flutter: ">=3.18.0-18.0.pre.54" diff --git a/siro_driver/trip_overlay_plugin/example/pubspec.yaml b/siro_driver/trip_overlay_plugin/example/pubspec.yaml new file mode 100644 index 0000000..428e812 --- /dev/null +++ b/siro_driver/trip_overlay_plugin/example/pubspec.yaml @@ -0,0 +1,85 @@ +name: trip_overlay_plugin_example +description: "Demonstrates how to use the trip_overlay_plugin plugin." +# The following line prevents the package from being accidentally published to +# pub.dev using `flutter pub publish`. This is preferred for private packages. +publish_to: 'none' # Remove this line if you wish to publish to pub.dev + +environment: + sdk: ^3.10.8 + +# Dependencies specify other packages that your package needs in order to work. +# To automatically upgrade your package dependencies to the latest versions +# consider running `flutter pub upgrade --major-versions`. Alternatively, +# dependencies can be manually updated by changing the version numbers below to +# the latest version available on pub.dev. To see which dependencies have newer +# versions available, run `flutter pub outdated`. +dependencies: + flutter: + sdk: flutter + + trip_overlay_plugin: + # When depending on this package from a real application you should use: + # trip_overlay_plugin: ^x.y.z + # See https://dart.dev/tools/pub/dependencies#version-constraints + # The example app is bundled with the plugin so we use a path dependency on + # the parent directory to use the current plugin's version. + path: ../ + + # The following adds the Cupertino Icons font to your application. + # Use with the CupertinoIcons class for iOS style icons. + cupertino_icons: ^1.0.8 + +dev_dependencies: + integration_test: + sdk: flutter + flutter_test: + sdk: flutter + + # The "flutter_lints" package below contains a set of recommended lints to + # encourage good coding practices. The lint set provided by the package is + # activated in the `analysis_options.yaml` file located at the root of your + # package. See that file for information about deactivating specific lint + # rules and activating additional ones. + flutter_lints: ^6.0.0 + +# For information on the generic Dart part of this file, see the +# following page: https://dart.dev/tools/pub/pubspec + +# The following section is specific to Flutter packages. +flutter: + + # The following line ensures that the Material Icons font is + # included with your application, so that you can use the icons in + # the material Icons class. + uses-material-design: true + + # To add assets to your application, add an assets section, like this: + # assets: + # - images/a_dot_burr.jpeg + # - images/a_dot_ham.jpeg + + # An image asset can refer to one or more resolution-specific "variants", see + # https://flutter.dev/to/resolution-aware-images + + # For details regarding adding assets from package dependencies, see + # https://flutter.dev/to/asset-from-package + + # To add custom fonts to your application, add a fonts section here, + # in this "flutter" section. Each entry in this list should have a + # "family" key with the font family name, and a "fonts" key with a + # list giving the asset and other descriptors for the font. For + # example: + # fonts: + # - family: Schyler + # fonts: + # - asset: fonts/Schyler-Regular.ttf + # - asset: fonts/Schyler-Italic.ttf + # style: italic + # - family: Trajan Pro + # fonts: + # - asset: fonts/TrajanPro.ttf + # - asset: fonts/TrajanPro_Bold.ttf + # weight: 700 + # + # For details regarding fonts from package dependencies, + # see https://flutter.dev/to/font-from-package diff --git a/siro_driver/trip_overlay_plugin/example/test/widget_test.dart b/siro_driver/trip_overlay_plugin/example/test/widget_test.dart new file mode 100644 index 0000000..d214628 --- /dev/null +++ b/siro_driver/trip_overlay_plugin/example/test/widget_test.dart @@ -0,0 +1,27 @@ +// This is a basic Flutter widget test. +// +// To perform an interaction with a widget in your test, use the WidgetTester +// utility in the flutter_test package. For example, you can send tap and scroll +// gestures. You can also use WidgetTester to find child widgets in the widget +// tree, read text, and verify that the values of widget properties are correct. + +import 'package:flutter/material.dart'; +import 'package:flutter_test/flutter_test.dart'; + +import '../lib/main.dart'; + +void main() { + testWidgets('Verify Platform version', (WidgetTester tester) async { + // Build our app and trigger a frame. + await tester.pumpWidget(const MyApp()); + + // Verify that platform version is retrieved. + expect( + find.byWidgetPredicate( + (Widget widget) => + widget is Text && widget.data!.startsWith('Running on:'), + ), + findsOneWidget, + ); + }); +} diff --git a/siro_driver/trip_overlay_plugin/lib/trip_overlay_plugin.dart b/siro_driver/trip_overlay_plugin/lib/trip_overlay_plugin.dart new file mode 100644 index 0000000..db99150 --- /dev/null +++ b/siro_driver/trip_overlay_plugin/lib/trip_overlay_plugin.dart @@ -0,0 +1,168 @@ +import 'dart:async'; +import 'dart:convert'; +import 'package:flutter/services.dart'; + +/// Model for trip data passed to the overlay +class TripData { + final String tripId; + final String passengerName; + final String pickupAddress; + final String dropoffAddress; + final double distanceKm; + final double estimatedFare; + final int estimatedMinutes; + final double pickupLat; + final double pickupLng; + final String? passengerAvatarUrl; + + TripData({ + required this.tripId, + required this.passengerName, + required this.pickupAddress, + required this.dropoffAddress, + required this.distanceKm, + required this.estimatedFare, + required this.estimatedMinutes, + required this.pickupLat, + required this.pickupLng, + this.passengerAvatarUrl, + }); + + Map toMap() => { + 'tripId': tripId, + 'passengerName': passengerName, + 'pickupAddress': pickupAddress, + 'dropoffAddress': dropoffAddress, + 'distanceKm': distanceKm, + 'estimatedFare': estimatedFare, + 'estimatedMinutes': estimatedMinutes, + 'pickupLat': pickupLat, + 'pickupLng': pickupLng, + 'passengerAvatarUrl': passengerAvatarUrl ?? '', + }; + + factory TripData.fromMap(Map map) => TripData( + tripId: map['tripId'] ?? '', + passengerName: map['passengerName'] ?? '', + pickupAddress: map['pickupAddress'] ?? '', + dropoffAddress: map['dropoffAddress'] ?? '', + distanceKm: (map['distanceKm'] ?? 0.0).toDouble(), + estimatedFare: (map['estimatedFare'] ?? 0.0).toDouble(), + estimatedMinutes: map['estimatedMinutes'] ?? 0, + pickupLat: (map['pickupLat'] ?? 0.0).toDouble(), + pickupLng: (map['pickupLng'] ?? 0.0).toDouble(), + passengerAvatarUrl: map['passengerAvatarUrl'], + ); + + factory TripData.fromJson(String json) => + TripData.fromMap(jsonDecode(json) as Map); + + String toJson() => jsonEncode(toMap()); +} + +/// Result returned when the driver accepts a trip +class TripAcceptedResult { + final String tripId; + final DateTime acceptedAt; + + TripAcceptedResult({required this.tripId, required this.acceptedAt}); +} + +/// Main plugin class — single entry point for Flutter side +class TripOverlayPlugin { + static const MethodChannel _channel = MethodChannel('trip_overlay_plugin'); + + // Stream controller for trip accepted events coming FROM Android overlay + static final StreamController _tripAcceptedController = + StreamController.broadcast(); + + // Stream controller for trip rejected/expired events + static final StreamController _tripRejectedController = + StreamController.broadcast(); + + static bool _isInitialized = false; + + /// Stream that fires when the driver taps "Accept" in the overlay + static Stream get onTripAccepted => + _tripAcceptedController.stream; + + /// Stream that fires when the driver rejects or overlay times out + static Stream get onTripRejected => _tripRejectedController.stream; + + /// Initialize the plugin — call this once in main() or initState() + static Future initialize() async { + if (_isInitialized) return; + _channel.setMethodCallHandler(_handleMethodCall); + _isInitialized = true; + } + + /// Handle incoming calls FROM Android → Flutter + static Future _handleMethodCall(MethodCall call) async { + switch (call.method) { + case 'onTripAccepted': + final tripId = call.arguments['tripId'] as String; + _tripAcceptedController.add( + TripAcceptedResult(tripId: tripId, acceptedAt: DateTime.now()), + ); + break; + + case 'onTripRejected': + final tripId = call.arguments['tripId'] as String; + _tripRejectedController.add(tripId); + break; + + default: + throw PlatformException( + code: 'UNKNOWN_METHOD', + message: 'Method ${call.method} not implemented', + ); + } + } + + /// Check if SYSTEM_ALERT_WINDOW permission is granted + static Future isPermissionGranted() async { + final result = await _channel.invokeMethod('isPermissionGranted'); + return result ?? false; + } + + /// Open system settings to grant SYSTEM_ALERT_WINDOW permission + static Future requestPermission() async { + await _channel.invokeMethod('requestPermission'); + } + + /// Show the trip overlay with the given [tripData] + /// [autoCloseSeconds] — how long before auto-dismiss (default 30s) + static Future showOverlay( + TripData tripData, { + int autoCloseSeconds = 30, + }) async { + final granted = await isPermissionGranted(); + if (!granted) { + await requestPermission(); + return false; + } + + final result = await _channel.invokeMethod('showOverlay', { + 'tripData': tripData.toJson(), + 'autoCloseSeconds': autoCloseSeconds, + }); + return result ?? false; + } + + /// Programmatically close the overlay (e.g. if trip was cancelled) + static Future hideOverlay() async { + await _channel.invokeMethod('hideOverlay'); + } + + /// Check if the overlay is currently visible + static Future isOverlayActive() async { + final result = await _channel.invokeMethod('isOverlayActive'); + return result ?? false; + } + + /// Dispose streams — call in app's dispose() + static void dispose() { + _tripAcceptedController.close(); + _tripRejectedController.close(); + } +} diff --git a/siro_driver/trip_overlay_plugin/lib/trip_overlay_plugin_method_channel.dart b/siro_driver/trip_overlay_plugin/lib/trip_overlay_plugin_method_channel.dart new file mode 100644 index 0000000..ec6fd65 --- /dev/null +++ b/siro_driver/trip_overlay_plugin/lib/trip_overlay_plugin_method_channel.dart @@ -0,0 +1,17 @@ +import 'package:flutter/foundation.dart'; +import 'package:flutter/services.dart'; + +import 'trip_overlay_plugin_platform_interface.dart'; + +/// An implementation of [TripOverlayPluginPlatform] that uses method channels. +class MethodChannelTripOverlayPlugin extends TripOverlayPluginPlatform { + /// The method channel used to interact with the native platform. + @visibleForTesting + final methodChannel = const MethodChannel('trip_overlay_plugin'); + + @override + Future getPlatformVersion() async { + final version = await methodChannel.invokeMethod('getPlatformVersion'); + return version; + } +} diff --git a/siro_driver/trip_overlay_plugin/lib/trip_overlay_plugin_platform_interface.dart b/siro_driver/trip_overlay_plugin/lib/trip_overlay_plugin_platform_interface.dart new file mode 100644 index 0000000..00ad8c5 --- /dev/null +++ b/siro_driver/trip_overlay_plugin/lib/trip_overlay_plugin_platform_interface.dart @@ -0,0 +1,29 @@ +import 'package:plugin_platform_interface/plugin_platform_interface.dart'; + +import 'trip_overlay_plugin_method_channel.dart'; + +abstract class TripOverlayPluginPlatform extends PlatformInterface { + /// Constructs a TripOverlayPluginPlatform. + TripOverlayPluginPlatform() : super(token: _token); + + static final Object _token = Object(); + + static TripOverlayPluginPlatform _instance = MethodChannelTripOverlayPlugin(); + + /// The default instance of [TripOverlayPluginPlatform] to use. + /// + /// Defaults to [MethodChannelTripOverlayPlugin]. + static TripOverlayPluginPlatform get instance => _instance; + + /// Platform-specific implementations should set this with their own + /// platform-specific class that extends [TripOverlayPluginPlatform] when + /// they register themselves. + static set instance(TripOverlayPluginPlatform instance) { + PlatformInterface.verifyToken(instance, _token); + _instance = instance; + } + + Future getPlatformVersion() { + throw UnimplementedError('platformVersion() has not been implemented.'); + } +} diff --git a/siro_driver/trip_overlay_plugin/pubspec.yaml b/siro_driver/trip_overlay_plugin/pubspec.yaml new file mode 100644 index 0000000..df63578 --- /dev/null +++ b/siro_driver/trip_overlay_plugin/pubspec.yaml @@ -0,0 +1,70 @@ +name: trip_overlay_plugin +description: "A new Flutter plugin project." +version: 0.0.1 +homepage: + +environment: + sdk: ^3.10.8 + flutter: '>=3.3.0' + +dependencies: + flutter: + sdk: flutter + plugin_platform_interface: ^2.0.2 + +dev_dependencies: + flutter_test: + sdk: flutter + flutter_lints: ^6.0.0 + +# For information on the generic Dart part of this file, see the +# following page: https://dart.dev/tools/pub/pubspec + +# The following section is specific to Flutter packages. +flutter: + # This section identifies this Flutter project as a plugin project. + # The 'pluginClass' specifies the class (in Java, Kotlin, Swift, Objective-C, etc.) + # which should be registered in the plugin registry. This is required for + # using method channels. + # The Android 'package' specifies package in which the registered class is. + # This is required for using method channels on Android. + # The 'ffiPlugin' specifies that native code should be built and bundled. + # This is required for using `dart:ffi`. + # All these are used by the tooling to maintain consistency when + # adding or updating assets for this project. + plugin: + platforms: + android: + package: com.intaleq_driver.trip_overlay_plugin + pluginClass: TripOverlayPlugin + + # To add assets to your plugin package, add an assets section, like this: + # assets: + # - images/a_dot_burr.jpeg + # - images/a_dot_ham.jpeg + # + # For details regarding assets in packages, see + # https://flutter.dev/to/asset-from-package + # + # An image asset can refer to one or more resolution-specific "variants", see + # https://flutter.dev/to/resolution-aware-images + + # To add custom fonts to your plugin package, add a fonts section here, + # in this "flutter" section. Each entry in this list should have a + # "family" key with the font family name, and a "fonts" key with a + # list giving the asset and other descriptors for the font. For + # example: + # fonts: + # - family: Schyler + # fonts: + # - asset: fonts/Schyler-Regular.ttf + # - asset: fonts/Schyler-Italic.ttf + # style: italic + # - family: Trajan Pro + # fonts: + # - asset: fonts/TrajanPro.ttf + # - asset: fonts/TrajanPro_Bold.ttf + # weight: 700 + # + # For details regarding fonts in packages, see + # https://flutter.dev/to/font-from-package diff --git a/siro_driver/trip_overlay_plugin/test/trip_overlay_plugin_method_channel_test.dart b/siro_driver/trip_overlay_plugin/test/trip_overlay_plugin_method_channel_test.dart new file mode 100644 index 0000000..64ea860 --- /dev/null +++ b/siro_driver/trip_overlay_plugin/test/trip_overlay_plugin_method_channel_test.dart @@ -0,0 +1,27 @@ +import 'package:flutter/services.dart'; +import 'package:flutter_test/flutter_test.dart'; +import 'package:trip_overlay_plugin/trip_overlay_plugin_method_channel.dart'; + +void main() { + TestWidgetsFlutterBinding.ensureInitialized(); + + MethodChannelTripOverlayPlugin platform = MethodChannelTripOverlayPlugin(); + const MethodChannel channel = MethodChannel('trip_overlay_plugin'); + + setUp(() { + TestDefaultBinaryMessengerBinding.instance.defaultBinaryMessenger.setMockMethodCallHandler( + channel, + (MethodCall methodCall) async { + return '42'; + }, + ); + }); + + tearDown(() { + TestDefaultBinaryMessengerBinding.instance.defaultBinaryMessenger.setMockMethodCallHandler(channel, null); + }); + + test('getPlatformVersion', () async { + expect(await platform.getPlatformVersion(), '42'); + }); +} diff --git a/siro_driver/trip_overlay_plugin/test/trip_overlay_plugin_test.dart b/siro_driver/trip_overlay_plugin/test/trip_overlay_plugin_test.dart new file mode 100644 index 0000000..e2a1854 --- /dev/null +++ b/siro_driver/trip_overlay_plugin/test/trip_overlay_plugin_test.dart @@ -0,0 +1,23 @@ +import 'package:flutter_test/flutter_test.dart'; +import 'package:trip_overlay_plugin/trip_overlay_plugin.dart'; +import 'package:trip_overlay_plugin/trip_overlay_plugin_platform_interface.dart'; +import 'package:trip_overlay_plugin/trip_overlay_plugin_method_channel.dart'; +import 'package:plugin_platform_interface/plugin_platform_interface.dart'; + +class MockTripOverlayPluginPlatform + with MockPlatformInterfaceMixin + implements TripOverlayPluginPlatform { + + @override + Future getPlatformVersion() => Future.value('42'); +} + +void main() { + final TripOverlayPluginPlatform initialPlatform = TripOverlayPluginPlatform.instance; + + test('$MethodChannelTripOverlayPlugin is the default instance', () { + expect(initialPlatform, isInstanceOf()); + }); + + +} diff --git a/siro_driver/web/favicon.png b/siro_driver/web/favicon.png new file mode 100644 index 0000000..7119d73 Binary files /dev/null and b/siro_driver/web/favicon.png differ diff --git a/siro_driver/web/icons/Icon-192.png b/siro_driver/web/icons/Icon-192.png new file mode 100644 index 0000000..3a3a63f Binary files /dev/null and b/siro_driver/web/icons/Icon-192.png differ diff --git a/siro_driver/web/icons/Icon-512.png b/siro_driver/web/icons/Icon-512.png new file mode 100644 index 0000000..58b9d33 Binary files /dev/null and b/siro_driver/web/icons/Icon-512.png differ diff --git a/siro_driver/web/icons/Icon-maskable-192.png b/siro_driver/web/icons/Icon-maskable-192.png new file mode 100644 index 0000000..3a3a63f Binary files /dev/null and b/siro_driver/web/icons/Icon-maskable-192.png differ diff --git a/siro_driver/web/icons/Icon-maskable-512.png b/siro_driver/web/icons/Icon-maskable-512.png new file mode 100644 index 0000000..58b9d33 Binary files /dev/null and b/siro_driver/web/icons/Icon-maskable-512.png differ diff --git a/siro_driver/web/index.html b/siro_driver/web/index.html new file mode 100644 index 0000000..492de14 --- /dev/null +++ b/siro_driver/web/index.html @@ -0,0 +1,38 @@ + + + + + + + + + + + + + + + + + + + + intaleq_driver + + + + + + diff --git a/siro_driver/web/manifest.json b/siro_driver/web/manifest.json new file mode 100644 index 0000000..63e5d46 --- /dev/null +++ b/siro_driver/web/manifest.json @@ -0,0 +1,35 @@ +{ + "name": "intaleq_driver", + "short_name": "intaleq_driver", + "start_url": ".", + "display": "standalone", + "background_color": "#hexcode", + "theme_color": "#hexcode", + "description": "A new Flutter project.", + "orientation": "portrait-primary", + "prefer_related_applications": false, + "icons": [ + { + "src": "icons/Icon-192.png", + "sizes": "192x192", + "type": "image/png" + }, + { + "src": "icons/Icon-512.png", + "sizes": "512x512", + "type": "image/png" + }, + { + "src": "icons/Icon-maskable-192.png", + "sizes": "192x192", + "type": "image/png", + "purpose": "maskable" + }, + { + "src": "icons/Icon-maskable-512.png", + "sizes": "512x512", + "type": "image/png", + "purpose": "maskable" + } + ] +} \ No newline at end of file diff --git a/siro_driver/windows/.gitignore b/siro_driver/windows/.gitignore new file mode 100644 index 0000000..d492d0d --- /dev/null +++ b/siro_driver/windows/.gitignore @@ -0,0 +1,17 @@ +flutter/ephemeral/ + +# Visual Studio user-specific files. +*.suo +*.user +*.userosscache +*.sln.docstates + +# Visual Studio build-related files. +x64/ +x86/ + +# Visual Studio cache files +# files ending in .cache can be ignored +*.[Cc]ache +# but keep track of directories ending in .cache +!*.[Cc]ache/ diff --git a/siro_driver/windows/CMakeLists.txt b/siro_driver/windows/CMakeLists.txt new file mode 100644 index 0000000..9fb5d91 --- /dev/null +++ b/siro_driver/windows/CMakeLists.txt @@ -0,0 +1,108 @@ +# Project-level configuration. +cmake_minimum_required(VERSION 3.14) +project(siro_driver LANGUAGES CXX) + +# The name of the executable created for the application. Change this to change +# the on-disk name of your application. +set(BINARY_NAME "siro_driver") + +# Explicitly opt in to modern CMake behaviors to avoid warnings with recent +# versions of CMake. +cmake_policy(VERSION 3.14...3.25) + +# Define build configuration option. +get_property(IS_MULTICONFIG GLOBAL PROPERTY GENERATOR_IS_MULTI_CONFIG) +if(IS_MULTICONFIG) + set(CMAKE_CONFIGURATION_TYPES "Debug;Profile;Release" + CACHE STRING "" FORCE) +else() + if(NOT CMAKE_BUILD_TYPE AND NOT CMAKE_CONFIGURATION_TYPES) + set(CMAKE_BUILD_TYPE "Debug" CACHE + STRING "Flutter build mode" FORCE) + set_property(CACHE CMAKE_BUILD_TYPE PROPERTY STRINGS + "Debug" "Profile" "Release") + endif() +endif() +# Define settings for the Profile build mode. +set(CMAKE_EXE_LINKER_FLAGS_PROFILE "${CMAKE_EXE_LINKER_FLAGS_RELEASE}") +set(CMAKE_SHARED_LINKER_FLAGS_PROFILE "${CMAKE_SHARED_LINKER_FLAGS_RELEASE}") +set(CMAKE_C_FLAGS_PROFILE "${CMAKE_C_FLAGS_RELEASE}") +set(CMAKE_CXX_FLAGS_PROFILE "${CMAKE_CXX_FLAGS_RELEASE}") + +# Use Unicode for all projects. +add_definitions(-DUNICODE -D_UNICODE) + +# Compilation settings that should be applied to most targets. +# +# Be cautious about adding new options here, as plugins use this function by +# default. In most cases, you should add new options to specific targets instead +# of modifying this function. +function(APPLY_STANDARD_SETTINGS TARGET) + target_compile_features(${TARGET} PUBLIC cxx_std_17) + target_compile_options(${TARGET} PRIVATE /W4 /WX /wd"4100") + target_compile_options(${TARGET} PRIVATE /EHsc) + target_compile_definitions(${TARGET} PRIVATE "_HAS_EXCEPTIONS=0") + target_compile_definitions(${TARGET} PRIVATE "$<$:_DEBUG>") +endfunction() + +# Flutter library and tool build rules. +set(FLUTTER_MANAGED_DIR "${CMAKE_CURRENT_SOURCE_DIR}/flutter") +add_subdirectory(${FLUTTER_MANAGED_DIR}) + +# Application build; see runner/CMakeLists.txt. +add_subdirectory("runner") + + +# Generated plugin build rules, which manage building the plugins and adding +# them to the application. +include(flutter/generated_plugins.cmake) + + +# === Installation === +# Support files are copied into place next to the executable, so that it can +# run in place. This is done instead of making a separate bundle (as on Linux) +# so that building and running from within Visual Studio will work. +set(BUILD_BUNDLE_DIR "$") +# Make the "install" step default, as it's required to run. +set(CMAKE_VS_INCLUDE_INSTALL_TO_DEFAULT_BUILD 1) +if(CMAKE_INSTALL_PREFIX_INITIALIZED_TO_DEFAULT) + set(CMAKE_INSTALL_PREFIX "${BUILD_BUNDLE_DIR}" CACHE PATH "..." FORCE) +endif() + +set(INSTALL_BUNDLE_DATA_DIR "${CMAKE_INSTALL_PREFIX}/data") +set(INSTALL_BUNDLE_LIB_DIR "${CMAKE_INSTALL_PREFIX}") + +install(TARGETS ${BINARY_NAME} RUNTIME DESTINATION "${CMAKE_INSTALL_PREFIX}" + COMPONENT Runtime) + +install(FILES "${FLUTTER_ICU_DATA_FILE}" DESTINATION "${INSTALL_BUNDLE_DATA_DIR}" + COMPONENT Runtime) + +install(FILES "${FLUTTER_LIBRARY}" DESTINATION "${INSTALL_BUNDLE_LIB_DIR}" + COMPONENT Runtime) + +if(PLUGIN_BUNDLED_LIBRARIES) + install(FILES "${PLUGIN_BUNDLED_LIBRARIES}" + DESTINATION "${INSTALL_BUNDLE_LIB_DIR}" + COMPONENT Runtime) +endif() + +# Copy the native assets provided by the build.dart from all packages. +set(NATIVE_ASSETS_DIR "${PROJECT_BUILD_DIR}native_assets/windows/") +install(DIRECTORY "${NATIVE_ASSETS_DIR}" + DESTINATION "${INSTALL_BUNDLE_LIB_DIR}" + COMPONENT Runtime) + +# Fully re-copy the assets directory on each build to avoid having stale files +# from a previous install. +set(FLUTTER_ASSET_DIR_NAME "flutter_assets") +install(CODE " + file(REMOVE_RECURSE \"${INSTALL_BUNDLE_DATA_DIR}/${FLUTTER_ASSET_DIR_NAME}\") + " COMPONENT Runtime) +install(DIRECTORY "${PROJECT_BUILD_DIR}/${FLUTTER_ASSET_DIR_NAME}" + DESTINATION "${INSTALL_BUNDLE_DATA_DIR}" COMPONENT Runtime) + +# Install the AOT library on non-Debug builds only. +install(FILES "${AOT_LIBRARY}" DESTINATION "${INSTALL_BUNDLE_DATA_DIR}" + CONFIGURATIONS Profile;Release + COMPONENT Runtime) diff --git a/siro_driver/windows/flutter/CMakeLists.txt b/siro_driver/windows/flutter/CMakeLists.txt new file mode 100644 index 0000000..903f489 --- /dev/null +++ b/siro_driver/windows/flutter/CMakeLists.txt @@ -0,0 +1,109 @@ +# This file controls Flutter-level build steps. It should not be edited. +cmake_minimum_required(VERSION 3.14) + +set(EPHEMERAL_DIR "${CMAKE_CURRENT_SOURCE_DIR}/ephemeral") + +# Configuration provided via flutter tool. +include(${EPHEMERAL_DIR}/generated_config.cmake) + +# TODO: Move the rest of this into files in ephemeral. See +# https://github.com/flutter/flutter/issues/57146. +set(WRAPPER_ROOT "${EPHEMERAL_DIR}/cpp_client_wrapper") + +# Set fallback configurations for older versions of the flutter tool. +if (NOT DEFINED FLUTTER_TARGET_PLATFORM) + set(FLUTTER_TARGET_PLATFORM "windows-x64") +endif() + +# === Flutter Library === +set(FLUTTER_LIBRARY "${EPHEMERAL_DIR}/flutter_windows.dll") + +# Published to parent scope for install step. +set(FLUTTER_LIBRARY ${FLUTTER_LIBRARY} PARENT_SCOPE) +set(FLUTTER_ICU_DATA_FILE "${EPHEMERAL_DIR}/icudtl.dat" PARENT_SCOPE) +set(PROJECT_BUILD_DIR "${PROJECT_DIR}/build/" PARENT_SCOPE) +set(AOT_LIBRARY "${PROJECT_DIR}/build/windows/app.so" PARENT_SCOPE) + +list(APPEND FLUTTER_LIBRARY_HEADERS + "flutter_export.h" + "flutter_windows.h" + "flutter_messenger.h" + "flutter_plugin_registrar.h" + "flutter_texture_registrar.h" +) +list(TRANSFORM FLUTTER_LIBRARY_HEADERS PREPEND "${EPHEMERAL_DIR}/") +add_library(flutter INTERFACE) +target_include_directories(flutter INTERFACE + "${EPHEMERAL_DIR}" +) +target_link_libraries(flutter INTERFACE "${FLUTTER_LIBRARY}.lib") +add_dependencies(flutter flutter_assemble) + +# === Wrapper === +list(APPEND CPP_WRAPPER_SOURCES_CORE + "core_implementations.cc" + "standard_codec.cc" +) +list(TRANSFORM CPP_WRAPPER_SOURCES_CORE PREPEND "${WRAPPER_ROOT}/") +list(APPEND CPP_WRAPPER_SOURCES_PLUGIN + "plugin_registrar.cc" +) +list(TRANSFORM CPP_WRAPPER_SOURCES_PLUGIN PREPEND "${WRAPPER_ROOT}/") +list(APPEND CPP_WRAPPER_SOURCES_APP + "flutter_engine.cc" + "flutter_view_controller.cc" +) +list(TRANSFORM CPP_WRAPPER_SOURCES_APP PREPEND "${WRAPPER_ROOT}/") + +# Wrapper sources needed for a plugin. +add_library(flutter_wrapper_plugin STATIC + ${CPP_WRAPPER_SOURCES_CORE} + ${CPP_WRAPPER_SOURCES_PLUGIN} +) +apply_standard_settings(flutter_wrapper_plugin) +set_target_properties(flutter_wrapper_plugin PROPERTIES + POSITION_INDEPENDENT_CODE ON) +set_target_properties(flutter_wrapper_plugin PROPERTIES + CXX_VISIBILITY_PRESET hidden) +target_link_libraries(flutter_wrapper_plugin PUBLIC flutter) +target_include_directories(flutter_wrapper_plugin PUBLIC + "${WRAPPER_ROOT}/include" +) +add_dependencies(flutter_wrapper_plugin flutter_assemble) + +# Wrapper sources needed for the runner. +add_library(flutter_wrapper_app STATIC + ${CPP_WRAPPER_SOURCES_CORE} + ${CPP_WRAPPER_SOURCES_APP} +) +apply_standard_settings(flutter_wrapper_app) +target_link_libraries(flutter_wrapper_app PUBLIC flutter) +target_include_directories(flutter_wrapper_app PUBLIC + "${WRAPPER_ROOT}/include" +) +add_dependencies(flutter_wrapper_app flutter_assemble) + +# === Flutter tool backend === +# _phony_ is a non-existent file to force this command to run every time, +# since currently there's no way to get a full input/output list from the +# flutter tool. +set(PHONY_OUTPUT "${CMAKE_CURRENT_BINARY_DIR}/_phony_") +set_source_files_properties("${PHONY_OUTPUT}" PROPERTIES SYMBOLIC TRUE) +add_custom_command( + OUTPUT ${FLUTTER_LIBRARY} ${FLUTTER_LIBRARY_HEADERS} + ${CPP_WRAPPER_SOURCES_CORE} ${CPP_WRAPPER_SOURCES_PLUGIN} + ${CPP_WRAPPER_SOURCES_APP} + ${PHONY_OUTPUT} + COMMAND ${CMAKE_COMMAND} -E env + ${FLUTTER_TOOL_ENVIRONMENT} + "${FLUTTER_ROOT}/packages/flutter_tools/bin/tool_backend.bat" + ${FLUTTER_TARGET_PLATFORM} $ + VERBATIM +) +add_custom_target(flutter_assemble DEPENDS + "${FLUTTER_LIBRARY}" + ${FLUTTER_LIBRARY_HEADERS} + ${CPP_WRAPPER_SOURCES_CORE} + ${CPP_WRAPPER_SOURCES_PLUGIN} + ${CPP_WRAPPER_SOURCES_APP} +) diff --git a/siro_driver/windows/flutter/generated_plugin_registrant.cc b/siro_driver/windows/flutter/generated_plugin_registrant.cc new file mode 100644 index 0000000..c87eaf6 --- /dev/null +++ b/siro_driver/windows/flutter/generated_plugin_registrant.cc @@ -0,0 +1,56 @@ +// +// Generated file. Do not edit. +// + +// clang-format off + +#include "generated_plugin_registrant.h" + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +void RegisterPlugins(flutter::PluginRegistry* registry) { + BatteryPlusWindowsPluginRegisterWithRegistrar( + registry->GetRegistrarForPlugin("BatteryPlusWindowsPlugin")); + ConnectivityPlusWindowsPluginRegisterWithRegistrar( + registry->GetRegistrarForPlugin("ConnectivityPlusWindowsPlugin")); + FileSelectorWindowsRegisterWithRegistrar( + registry->GetRegistrarForPlugin("FileSelectorWindows")); + FirebaseAuthPluginCApiRegisterWithRegistrar( + registry->GetRegistrarForPlugin("FirebaseAuthPluginCApi")); + FirebaseCorePluginCApiRegisterWithRegistrar( + registry->GetRegistrarForPlugin("FirebaseCorePluginCApi")); + FlutterInappwebviewWindowsPluginCApiRegisterWithRegistrar( + registry->GetRegistrarForPlugin("FlutterInappwebviewWindowsPluginCApi")); + FlutterSecureStorageWindowsPluginRegisterWithRegistrar( + registry->GetRegistrarForPlugin("FlutterSecureStorageWindowsPlugin")); + FlutterTtsPluginRegisterWithRegistrar( + registry->GetRegistrarForPlugin("FlutterTtsPlugin")); + FlutterWebRTCPluginRegisterWithRegistrar( + registry->GetRegistrarForPlugin("FlutterWebRTCPlugin")); + GeolocatorWindowsRegisterWithRegistrar( + registry->GetRegistrarForPlugin("GeolocatorWindows")); + LocalAuthPluginRegisterWithRegistrar( + registry->GetRegistrarForPlugin("LocalAuthPlugin")); + PermissionHandlerWindowsPluginRegisterWithRegistrar( + registry->GetRegistrarForPlugin("PermissionHandlerWindowsPlugin")); + RecordWindowsPluginCApiRegisterWithRegistrar( + registry->GetRegistrarForPlugin("RecordWindowsPluginCApi")); + SharePlusWindowsPluginCApiRegisterWithRegistrar( + registry->GetRegistrarForPlugin("SharePlusWindowsPluginCApi")); + UrlLauncherWindowsRegisterWithRegistrar( + registry->GetRegistrarForPlugin("UrlLauncherWindows")); +} diff --git a/siro_driver/windows/flutter/generated_plugin_registrant.h b/siro_driver/windows/flutter/generated_plugin_registrant.h new file mode 100644 index 0000000..dc139d8 --- /dev/null +++ b/siro_driver/windows/flutter/generated_plugin_registrant.h @@ -0,0 +1,15 @@ +// +// Generated file. Do not edit. +// + +// clang-format off + +#ifndef GENERATED_PLUGIN_REGISTRANT_ +#define GENERATED_PLUGIN_REGISTRANT_ + +#include + +// Registers Flutter plugins. +void RegisterPlugins(flutter::PluginRegistry* registry); + +#endif // GENERATED_PLUGIN_REGISTRANT_ diff --git a/siro_driver/windows/flutter/generated_plugins.cmake b/siro_driver/windows/flutter/generated_plugins.cmake new file mode 100644 index 0000000..783f9bc --- /dev/null +++ b/siro_driver/windows/flutter/generated_plugins.cmake @@ -0,0 +1,40 @@ +# +# Generated file, do not edit. +# + +list(APPEND FLUTTER_PLUGIN_LIST + battery_plus + connectivity_plus + file_selector_windows + firebase_auth + firebase_core + flutter_inappwebview_windows + flutter_secure_storage_windows + flutter_tts + flutter_webrtc + geolocator_windows + local_auth_windows + permission_handler_windows + record_windows + share_plus + url_launcher_windows +) + +list(APPEND FLUTTER_FFI_PLUGIN_LIST + flutter_local_notifications_windows + jni +) + +set(PLUGIN_BUNDLED_LIBRARIES) + +foreach(plugin ${FLUTTER_PLUGIN_LIST}) + add_subdirectory(flutter/ephemeral/.plugin_symlinks/${plugin}/windows plugins/${plugin}) + target_link_libraries(${BINARY_NAME} PRIVATE ${plugin}_plugin) + list(APPEND PLUGIN_BUNDLED_LIBRARIES $) + list(APPEND PLUGIN_BUNDLED_LIBRARIES ${${plugin}_bundled_libraries}) +endforeach(plugin) + +foreach(ffi_plugin ${FLUTTER_FFI_PLUGIN_LIST}) + add_subdirectory(flutter/ephemeral/.plugin_symlinks/${ffi_plugin}/windows plugins/${ffi_plugin}) + list(APPEND PLUGIN_BUNDLED_LIBRARIES ${${ffi_plugin}_bundled_libraries}) +endforeach(ffi_plugin) diff --git a/siro_driver/windows/runner/CMakeLists.txt b/siro_driver/windows/runner/CMakeLists.txt new file mode 100644 index 0000000..394917c --- /dev/null +++ b/siro_driver/windows/runner/CMakeLists.txt @@ -0,0 +1,40 @@ +cmake_minimum_required(VERSION 3.14) +project(runner LANGUAGES CXX) + +# Define the application target. To change its name, change BINARY_NAME in the +# top-level CMakeLists.txt, not the value here, or `flutter run` will no longer +# work. +# +# Any new source files that you add to the application should be added here. +add_executable(${BINARY_NAME} WIN32 + "flutter_window.cpp" + "main.cpp" + "utils.cpp" + "win32_window.cpp" + "${FLUTTER_MANAGED_DIR}/generated_plugin_registrant.cc" + "Runner.rc" + "runner.exe.manifest" +) + +# Apply the standard set of build settings. This can be removed for applications +# that need different build settings. +apply_standard_settings(${BINARY_NAME}) + +# Add preprocessor definitions for the build version. +target_compile_definitions(${BINARY_NAME} PRIVATE "FLUTTER_VERSION=\"${FLUTTER_VERSION}\"") +target_compile_definitions(${BINARY_NAME} PRIVATE "FLUTTER_VERSION_MAJOR=${FLUTTER_VERSION_MAJOR}") +target_compile_definitions(${BINARY_NAME} PRIVATE "FLUTTER_VERSION_MINOR=${FLUTTER_VERSION_MINOR}") +target_compile_definitions(${BINARY_NAME} PRIVATE "FLUTTER_VERSION_PATCH=${FLUTTER_VERSION_PATCH}") +target_compile_definitions(${BINARY_NAME} PRIVATE "FLUTTER_VERSION_BUILD=${FLUTTER_VERSION_BUILD}") + +# Disable Windows macros that collide with C++ standard library functions. +target_compile_definitions(${BINARY_NAME} PRIVATE "NOMINMAX") + +# Add dependency libraries and include directories. Add any application-specific +# dependencies here. +target_link_libraries(${BINARY_NAME} PRIVATE flutter flutter_wrapper_app) +target_link_libraries(${BINARY_NAME} PRIVATE "dwmapi.lib") +target_include_directories(${BINARY_NAME} PRIVATE "${CMAKE_SOURCE_DIR}") + +# Run the Flutter tool portions of the build. This must not be removed. +add_dependencies(${BINARY_NAME} flutter_assemble) diff --git a/siro_driver/windows/runner/Runner.rc b/siro_driver/windows/runner/Runner.rc new file mode 100644 index 0000000..b6ed051 --- /dev/null +++ b/siro_driver/windows/runner/Runner.rc @@ -0,0 +1,121 @@ +// Microsoft Visual C++ generated resource script. +// +#pragma code_page(65001) +#include "resource.h" + +#define APSTUDIO_READONLY_SYMBOLS +///////////////////////////////////////////////////////////////////////////// +// +// Generated from the TEXTINCLUDE 2 resource. +// +#include "winres.h" + +///////////////////////////////////////////////////////////////////////////// +#undef APSTUDIO_READONLY_SYMBOLS + +///////////////////////////////////////////////////////////////////////////// +// English (United States) resources + +#if !defined(AFX_RESOURCE_DLL) || defined(AFX_TARG_ENU) +LANGUAGE LANG_ENGLISH, SUBLANG_ENGLISH_US + +#ifdef APSTUDIO_INVOKED +///////////////////////////////////////////////////////////////////////////// +// +// TEXTINCLUDE +// + +1 TEXTINCLUDE +BEGIN + "resource.h\0" +END + +2 TEXTINCLUDE +BEGIN + "#include ""winres.h""\r\n" + "\0" +END + +3 TEXTINCLUDE +BEGIN + "\r\n" + "\0" +END + +#endif // APSTUDIO_INVOKED + + +///////////////////////////////////////////////////////////////////////////// +// +// Icon +// + +// Icon with lowest ID value placed first to ensure application icon +// remains consistent on all systems. +IDI_APP_ICON ICON "resources\\app_icon.ico" + + +///////////////////////////////////////////////////////////////////////////// +// +// Version +// + +#if defined(FLUTTER_VERSION_MAJOR) && defined(FLUTTER_VERSION_MINOR) && defined(FLUTTER_VERSION_PATCH) && defined(FLUTTER_VERSION_BUILD) +#define VERSION_AS_NUMBER FLUTTER_VERSION_MAJOR,FLUTTER_VERSION_MINOR,FLUTTER_VERSION_PATCH,FLUTTER_VERSION_BUILD +#else +#define VERSION_AS_NUMBER 1,0,0,0 +#endif + +#if defined(FLUTTER_VERSION) +#define VERSION_AS_STRING FLUTTER_VERSION +#else +#define VERSION_AS_STRING "1.0.0" +#endif + +VS_VERSION_INFO VERSIONINFO + FILEVERSION VERSION_AS_NUMBER + PRODUCTVERSION VERSION_AS_NUMBER + FILEFLAGSMASK VS_FFI_FILEFLAGSMASK +#ifdef _DEBUG + FILEFLAGS VS_FF_DEBUG +#else + FILEFLAGS 0x0L +#endif + FILEOS VOS__WINDOWS32 + FILETYPE VFT_APP + FILESUBTYPE 0x0L +BEGIN + BLOCK "StringFileInfo" + BEGIN + BLOCK "040904e4" + BEGIN + VALUE "CompanyName", "com.siro" "\0" + VALUE "FileDescription", "siro_driver" "\0" + VALUE "FileVersion", VERSION_AS_STRING "\0" + VALUE "InternalName", "siro_driver" "\0" + VALUE "LegalCopyright", "Copyright (C) 2026 com.siro. All rights reserved." "\0" + VALUE "OriginalFilename", "siro_driver.exe" "\0" + VALUE "ProductName", "siro_driver" "\0" + VALUE "ProductVersion", VERSION_AS_STRING "\0" + END + END + BLOCK "VarFileInfo" + BEGIN + VALUE "Translation", 0x409, 1252 + END +END + +#endif // English (United States) resources +///////////////////////////////////////////////////////////////////////////// + + + +#ifndef APSTUDIO_INVOKED +///////////////////////////////////////////////////////////////////////////// +// +// Generated from the TEXTINCLUDE 3 resource. +// + + +///////////////////////////////////////////////////////////////////////////// +#endif // not APSTUDIO_INVOKED diff --git a/siro_driver/windows/runner/flutter_window.cpp b/siro_driver/windows/runner/flutter_window.cpp new file mode 100644 index 0000000..955ee30 --- /dev/null +++ b/siro_driver/windows/runner/flutter_window.cpp @@ -0,0 +1,71 @@ +#include "flutter_window.h" + +#include + +#include "flutter/generated_plugin_registrant.h" + +FlutterWindow::FlutterWindow(const flutter::DartProject& project) + : project_(project) {} + +FlutterWindow::~FlutterWindow() {} + +bool FlutterWindow::OnCreate() { + if (!Win32Window::OnCreate()) { + return false; + } + + RECT frame = GetClientArea(); + + // The size here must match the window dimensions to avoid unnecessary surface + // creation / destruction in the startup path. + flutter_controller_ = std::make_unique( + frame.right - frame.left, frame.bottom - frame.top, project_); + // Ensure that basic setup of the controller was successful. + if (!flutter_controller_->engine() || !flutter_controller_->view()) { + return false; + } + RegisterPlugins(flutter_controller_->engine()); + SetChildContent(flutter_controller_->view()->GetNativeWindow()); + + flutter_controller_->engine()->SetNextFrameCallback([&]() { + this->Show(); + }); + + // Flutter can complete the first frame before the "show window" callback is + // registered. The following call ensures a frame is pending to ensure the + // window is shown. It is a no-op if the first frame hasn't completed yet. + flutter_controller_->ForceRedraw(); + + return true; +} + +void FlutterWindow::OnDestroy() { + if (flutter_controller_) { + flutter_controller_ = nullptr; + } + + Win32Window::OnDestroy(); +} + +LRESULT +FlutterWindow::MessageHandler(HWND hwnd, UINT const message, + WPARAM const wparam, + LPARAM const lparam) noexcept { + // Give Flutter, including plugins, an opportunity to handle window messages. + if (flutter_controller_) { + std::optional result = + flutter_controller_->HandleTopLevelWindowProc(hwnd, message, wparam, + lparam); + if (result) { + return *result; + } + } + + switch (message) { + case WM_FONTCHANGE: + flutter_controller_->engine()->ReloadSystemFonts(); + break; + } + + return Win32Window::MessageHandler(hwnd, message, wparam, lparam); +} diff --git a/siro_driver/windows/runner/flutter_window.h b/siro_driver/windows/runner/flutter_window.h new file mode 100644 index 0000000..6da0652 --- /dev/null +++ b/siro_driver/windows/runner/flutter_window.h @@ -0,0 +1,33 @@ +#ifndef RUNNER_FLUTTER_WINDOW_H_ +#define RUNNER_FLUTTER_WINDOW_H_ + +#include +#include + +#include + +#include "win32_window.h" + +// A window that does nothing but host a Flutter view. +class FlutterWindow : public Win32Window { + public: + // Creates a new FlutterWindow hosting a Flutter view running |project|. + explicit FlutterWindow(const flutter::DartProject& project); + virtual ~FlutterWindow(); + + protected: + // Win32Window: + bool OnCreate() override; + void OnDestroy() override; + LRESULT MessageHandler(HWND window, UINT const message, WPARAM const wparam, + LPARAM const lparam) noexcept override; + + private: + // The project to run. + flutter::DartProject project_; + + // The Flutter instance hosted by this window. + std::unique_ptr flutter_controller_; +}; + +#endif // RUNNER_FLUTTER_WINDOW_H_ diff --git a/siro_driver/windows/runner/main.cpp b/siro_driver/windows/runner/main.cpp new file mode 100644 index 0000000..01757cd --- /dev/null +++ b/siro_driver/windows/runner/main.cpp @@ -0,0 +1,43 @@ +#include +#include +#include + +#include "flutter_window.h" +#include "utils.h" + +int APIENTRY wWinMain(_In_ HINSTANCE instance, _In_opt_ HINSTANCE prev, + _In_ wchar_t *command_line, _In_ int show_command) { + // Attach to console when present (e.g., 'flutter run') or create a + // new console when running with a debugger. + if (!::AttachConsole(ATTACH_PARENT_PROCESS) && ::IsDebuggerPresent()) { + CreateAndAttachConsole(); + } + + // Initialize COM, so that it is available for use in the library and/or + // plugins. + ::CoInitializeEx(nullptr, COINIT_APARTMENTTHREADED); + + flutter::DartProject project(L"data"); + + std::vector command_line_arguments = + GetCommandLineArguments(); + + project.set_dart_entrypoint_arguments(std::move(command_line_arguments)); + + FlutterWindow window(project); + Win32Window::Point origin(10, 10); + Win32Window::Size size(1280, 720); + if (!window.Create(L"siro_driver", origin, size)) { + return EXIT_FAILURE; + } + window.SetQuitOnClose(true); + + ::MSG msg; + while (::GetMessage(&msg, nullptr, 0, 0)) { + ::TranslateMessage(&msg); + ::DispatchMessage(&msg); + } + + ::CoUninitialize(); + return EXIT_SUCCESS; +} diff --git a/siro_driver/windows/runner/resource.h b/siro_driver/windows/runner/resource.h new file mode 100644 index 0000000..66a65d1 --- /dev/null +++ b/siro_driver/windows/runner/resource.h @@ -0,0 +1,16 @@ +//{{NO_DEPENDENCIES}} +// Microsoft Visual C++ generated include file. +// Used by Runner.rc +// +#define IDI_APP_ICON 101 + +// Next default values for new objects +// +#ifdef APSTUDIO_INVOKED +#ifndef APSTUDIO_READONLY_SYMBOLS +#define _APS_NEXT_RESOURCE_VALUE 102 +#define _APS_NEXT_COMMAND_VALUE 40001 +#define _APS_NEXT_CONTROL_VALUE 1001 +#define _APS_NEXT_SYMED_VALUE 101 +#endif +#endif diff --git a/siro_driver/windows/runner/resources/app_icon.ico b/siro_driver/windows/runner/resources/app_icon.ico new file mode 100644 index 0000000..c04e20c Binary files /dev/null and b/siro_driver/windows/runner/resources/app_icon.ico differ diff --git a/siro_driver/windows/runner/runner.exe.manifest b/siro_driver/windows/runner/runner.exe.manifest new file mode 100644 index 0000000..153653e --- /dev/null +++ b/siro_driver/windows/runner/runner.exe.manifest @@ -0,0 +1,14 @@ + + + + + PerMonitorV2 + + + + + + + + + diff --git a/siro_driver/windows/runner/utils.cpp b/siro_driver/windows/runner/utils.cpp new file mode 100644 index 0000000..3a0b465 --- /dev/null +++ b/siro_driver/windows/runner/utils.cpp @@ -0,0 +1,65 @@ +#include "utils.h" + +#include +#include +#include +#include + +#include + +void CreateAndAttachConsole() { + if (::AllocConsole()) { + FILE *unused; + if (freopen_s(&unused, "CONOUT$", "w", stdout)) { + _dup2(_fileno(stdout), 1); + } + if (freopen_s(&unused, "CONOUT$", "w", stderr)) { + _dup2(_fileno(stdout), 2); + } + std::ios::sync_with_stdio(); + FlutterDesktopResyncOutputStreams(); + } +} + +std::vector GetCommandLineArguments() { + // Convert the UTF-16 command line arguments to UTF-8 for the Engine to use. + int argc; + wchar_t** argv = ::CommandLineToArgvW(::GetCommandLineW(), &argc); + if (argv == nullptr) { + return std::vector(); + } + + std::vector command_line_arguments; + + // Skip the first argument as it's the binary name. + for (int i = 1; i < argc; i++) { + command_line_arguments.push_back(Utf8FromUtf16(argv[i])); + } + + ::LocalFree(argv); + + return command_line_arguments; +} + +std::string Utf8FromUtf16(const wchar_t* utf16_string) { + if (utf16_string == nullptr) { + return std::string(); + } + unsigned int target_length = ::WideCharToMultiByte( + CP_UTF8, WC_ERR_INVALID_CHARS, utf16_string, + -1, nullptr, 0, nullptr, nullptr) + -1; // remove the trailing null character + int input_length = (int)wcslen(utf16_string); + std::string utf8_string; + if (target_length == 0 || target_length > utf8_string.max_size()) { + return utf8_string; + } + utf8_string.resize(target_length); + int converted_length = ::WideCharToMultiByte( + CP_UTF8, WC_ERR_INVALID_CHARS, utf16_string, + input_length, utf8_string.data(), target_length, nullptr, nullptr); + if (converted_length == 0) { + return std::string(); + } + return utf8_string; +} diff --git a/siro_driver/windows/runner/utils.h b/siro_driver/windows/runner/utils.h new file mode 100644 index 0000000..3879d54 --- /dev/null +++ b/siro_driver/windows/runner/utils.h @@ -0,0 +1,19 @@ +#ifndef RUNNER_UTILS_H_ +#define RUNNER_UTILS_H_ + +#include +#include + +// Creates a console for the process, and redirects stdout and stderr to +// it for both the runner and the Flutter library. +void CreateAndAttachConsole(); + +// Takes a null-terminated wchar_t* encoded in UTF-16 and returns a std::string +// encoded in UTF-8. Returns an empty std::string on failure. +std::string Utf8FromUtf16(const wchar_t* utf16_string); + +// Gets the command line arguments passed in as a std::vector, +// encoded in UTF-8. Returns an empty std::vector on failure. +std::vector GetCommandLineArguments(); + +#endif // RUNNER_UTILS_H_ diff --git a/siro_driver/windows/runner/win32_window.cpp b/siro_driver/windows/runner/win32_window.cpp new file mode 100644 index 0000000..60608d0 --- /dev/null +++ b/siro_driver/windows/runner/win32_window.cpp @@ -0,0 +1,288 @@ +#include "win32_window.h" + +#include +#include + +#include "resource.h" + +namespace { + +/// Window attribute that enables dark mode window decorations. +/// +/// Redefined in case the developer's machine has a Windows SDK older than +/// version 10.0.22000.0. +/// See: https://docs.microsoft.com/windows/win32/api/dwmapi/ne-dwmapi-dwmwindowattribute +#ifndef DWMWA_USE_IMMERSIVE_DARK_MODE +#define DWMWA_USE_IMMERSIVE_DARK_MODE 20 +#endif + +constexpr const wchar_t kWindowClassName[] = L"FLUTTER_RUNNER_WIN32_WINDOW"; + +/// Registry key for app theme preference. +/// +/// A value of 0 indicates apps should use dark mode. A non-zero or missing +/// value indicates apps should use light mode. +constexpr const wchar_t kGetPreferredBrightnessRegKey[] = + L"Software\\Microsoft\\Windows\\CurrentVersion\\Themes\\Personalize"; +constexpr const wchar_t kGetPreferredBrightnessRegValue[] = L"AppsUseLightTheme"; + +// The number of Win32Window objects that currently exist. +static int g_active_window_count = 0; + +using EnableNonClientDpiScaling = BOOL __stdcall(HWND hwnd); + +// Scale helper to convert logical scaler values to physical using passed in +// scale factor +int Scale(int source, double scale_factor) { + return static_cast(source * scale_factor); +} + +// Dynamically loads the |EnableNonClientDpiScaling| from the User32 module. +// This API is only needed for PerMonitor V1 awareness mode. +void EnableFullDpiSupportIfAvailable(HWND hwnd) { + HMODULE user32_module = LoadLibraryA("User32.dll"); + if (!user32_module) { + return; + } + auto enable_non_client_dpi_scaling = + reinterpret_cast( + GetProcAddress(user32_module, "EnableNonClientDpiScaling")); + if (enable_non_client_dpi_scaling != nullptr) { + enable_non_client_dpi_scaling(hwnd); + } + FreeLibrary(user32_module); +} + +} // namespace + +// Manages the Win32Window's window class registration. +class WindowClassRegistrar { + public: + ~WindowClassRegistrar() = default; + + // Returns the singleton registrar instance. + static WindowClassRegistrar* GetInstance() { + if (!instance_) { + instance_ = new WindowClassRegistrar(); + } + return instance_; + } + + // Returns the name of the window class, registering the class if it hasn't + // previously been registered. + const wchar_t* GetWindowClass(); + + // Unregisters the window class. Should only be called if there are no + // instances of the window. + void UnregisterWindowClass(); + + private: + WindowClassRegistrar() = default; + + static WindowClassRegistrar* instance_; + + bool class_registered_ = false; +}; + +WindowClassRegistrar* WindowClassRegistrar::instance_ = nullptr; + +const wchar_t* WindowClassRegistrar::GetWindowClass() { + if (!class_registered_) { + WNDCLASS window_class{}; + window_class.hCursor = LoadCursor(nullptr, IDC_ARROW); + window_class.lpszClassName = kWindowClassName; + window_class.style = CS_HREDRAW | CS_VREDRAW; + window_class.cbClsExtra = 0; + window_class.cbWndExtra = 0; + window_class.hInstance = GetModuleHandle(nullptr); + window_class.hIcon = + LoadIcon(window_class.hInstance, MAKEINTRESOURCE(IDI_APP_ICON)); + window_class.hbrBackground = 0; + window_class.lpszMenuName = nullptr; + window_class.lpfnWndProc = Win32Window::WndProc; + RegisterClass(&window_class); + class_registered_ = true; + } + return kWindowClassName; +} + +void WindowClassRegistrar::UnregisterWindowClass() { + UnregisterClass(kWindowClassName, nullptr); + class_registered_ = false; +} + +Win32Window::Win32Window() { + ++g_active_window_count; +} + +Win32Window::~Win32Window() { + --g_active_window_count; + Destroy(); +} + +bool Win32Window::Create(const std::wstring& title, + const Point& origin, + const Size& size) { + Destroy(); + + const wchar_t* window_class = + WindowClassRegistrar::GetInstance()->GetWindowClass(); + + const POINT target_point = {static_cast(origin.x), + static_cast(origin.y)}; + HMONITOR monitor = MonitorFromPoint(target_point, MONITOR_DEFAULTTONEAREST); + UINT dpi = FlutterDesktopGetDpiForMonitor(monitor); + double scale_factor = dpi / 96.0; + + HWND window = CreateWindow( + window_class, title.c_str(), WS_OVERLAPPEDWINDOW, + Scale(origin.x, scale_factor), Scale(origin.y, scale_factor), + Scale(size.width, scale_factor), Scale(size.height, scale_factor), + nullptr, nullptr, GetModuleHandle(nullptr), this); + + if (!window) { + return false; + } + + UpdateTheme(window); + + return OnCreate(); +} + +bool Win32Window::Show() { + return ShowWindow(window_handle_, SW_SHOWNORMAL); +} + +// static +LRESULT CALLBACK Win32Window::WndProc(HWND const window, + UINT const message, + WPARAM const wparam, + LPARAM const lparam) noexcept { + if (message == WM_NCCREATE) { + auto window_struct = reinterpret_cast(lparam); + SetWindowLongPtr(window, GWLP_USERDATA, + reinterpret_cast(window_struct->lpCreateParams)); + + auto that = static_cast(window_struct->lpCreateParams); + EnableFullDpiSupportIfAvailable(window); + that->window_handle_ = window; + } else if (Win32Window* that = GetThisFromHandle(window)) { + return that->MessageHandler(window, message, wparam, lparam); + } + + return DefWindowProc(window, message, wparam, lparam); +} + +LRESULT +Win32Window::MessageHandler(HWND hwnd, + UINT const message, + WPARAM const wparam, + LPARAM const lparam) noexcept { + switch (message) { + case WM_DESTROY: + window_handle_ = nullptr; + Destroy(); + if (quit_on_close_) { + PostQuitMessage(0); + } + return 0; + + case WM_DPICHANGED: { + auto newRectSize = reinterpret_cast(lparam); + LONG newWidth = newRectSize->right - newRectSize->left; + LONG newHeight = newRectSize->bottom - newRectSize->top; + + SetWindowPos(hwnd, nullptr, newRectSize->left, newRectSize->top, newWidth, + newHeight, SWP_NOZORDER | SWP_NOACTIVATE); + + return 0; + } + case WM_SIZE: { + RECT rect = GetClientArea(); + if (child_content_ != nullptr) { + // Size and position the child window. + MoveWindow(child_content_, rect.left, rect.top, rect.right - rect.left, + rect.bottom - rect.top, TRUE); + } + return 0; + } + + case WM_ACTIVATE: + if (child_content_ != nullptr) { + SetFocus(child_content_); + } + return 0; + + case WM_DWMCOLORIZATIONCOLORCHANGED: + UpdateTheme(hwnd); + return 0; + } + + return DefWindowProc(window_handle_, message, wparam, lparam); +} + +void Win32Window::Destroy() { + OnDestroy(); + + if (window_handle_) { + DestroyWindow(window_handle_); + window_handle_ = nullptr; + } + if (g_active_window_count == 0) { + WindowClassRegistrar::GetInstance()->UnregisterWindowClass(); + } +} + +Win32Window* Win32Window::GetThisFromHandle(HWND const window) noexcept { + return reinterpret_cast( + GetWindowLongPtr(window, GWLP_USERDATA)); +} + +void Win32Window::SetChildContent(HWND content) { + child_content_ = content; + SetParent(content, window_handle_); + RECT frame = GetClientArea(); + + MoveWindow(content, frame.left, frame.top, frame.right - frame.left, + frame.bottom - frame.top, true); + + SetFocus(child_content_); +} + +RECT Win32Window::GetClientArea() { + RECT frame; + GetClientRect(window_handle_, &frame); + return frame; +} + +HWND Win32Window::GetHandle() { + return window_handle_; +} + +void Win32Window::SetQuitOnClose(bool quit_on_close) { + quit_on_close_ = quit_on_close; +} + +bool Win32Window::OnCreate() { + // No-op; provided for subclasses. + return true; +} + +void Win32Window::OnDestroy() { + // No-op; provided for subclasses. +} + +void Win32Window::UpdateTheme(HWND const window) { + DWORD light_mode; + DWORD light_mode_size = sizeof(light_mode); + LSTATUS result = RegGetValue(HKEY_CURRENT_USER, kGetPreferredBrightnessRegKey, + kGetPreferredBrightnessRegValue, + RRF_RT_REG_DWORD, nullptr, &light_mode, + &light_mode_size); + + if (result == ERROR_SUCCESS) { + BOOL enable_dark_mode = light_mode == 0; + DwmSetWindowAttribute(window, DWMWA_USE_IMMERSIVE_DARK_MODE, + &enable_dark_mode, sizeof(enable_dark_mode)); + } +} diff --git a/siro_driver/windows/runner/win32_window.h b/siro_driver/windows/runner/win32_window.h new file mode 100644 index 0000000..e901dde --- /dev/null +++ b/siro_driver/windows/runner/win32_window.h @@ -0,0 +1,102 @@ +#ifndef RUNNER_WIN32_WINDOW_H_ +#define RUNNER_WIN32_WINDOW_H_ + +#include + +#include +#include +#include + +// A class abstraction for a high DPI-aware Win32 Window. Intended to be +// inherited from by classes that wish to specialize with custom +// rendering and input handling +class Win32Window { + public: + struct Point { + unsigned int x; + unsigned int y; + Point(unsigned int x, unsigned int y) : x(x), y(y) {} + }; + + struct Size { + unsigned int width; + unsigned int height; + Size(unsigned int width, unsigned int height) + : width(width), height(height) {} + }; + + Win32Window(); + virtual ~Win32Window(); + + // Creates a win32 window with |title| that is positioned and sized using + // |origin| and |size|. New windows are created on the default monitor. Window + // sizes are specified to the OS in physical pixels, hence to ensure a + // consistent size this function will scale the inputted width and height as + // as appropriate for the default monitor. The window is invisible until + // |Show| is called. Returns true if the window was created successfully. + bool Create(const std::wstring& title, const Point& origin, const Size& size); + + // Show the current window. Returns true if the window was successfully shown. + bool Show(); + + // Release OS resources associated with window. + void Destroy(); + + // Inserts |content| into the window tree. + void SetChildContent(HWND content); + + // Returns the backing Window handle to enable clients to set icon and other + // window properties. Returns nullptr if the window has been destroyed. + HWND GetHandle(); + + // If true, closing this window will quit the application. + void SetQuitOnClose(bool quit_on_close); + + // Return a RECT representing the bounds of the current client area. + RECT GetClientArea(); + + protected: + // Processes and route salient window messages for mouse handling, + // size change and DPI. Delegates handling of these to member overloads that + // inheriting classes can handle. + virtual LRESULT MessageHandler(HWND window, + UINT const message, + WPARAM const wparam, + LPARAM const lparam) noexcept; + + // Called when CreateAndShow is called, allowing subclass window-related + // setup. Subclasses should return false if setup fails. + virtual bool OnCreate(); + + // Called when Destroy is called. + virtual void OnDestroy(); + + private: + friend class WindowClassRegistrar; + + // OS callback called by message pump. Handles the WM_NCCREATE message which + // is passed when the non-client area is being created and enables automatic + // non-client DPI scaling so that the non-client area automatically + // responds to changes in DPI. All other messages are handled by + // MessageHandler. + static LRESULT CALLBACK WndProc(HWND const window, + UINT const message, + WPARAM const wparam, + LPARAM const lparam) noexcept; + + // Retrieves a class instance pointer for |window| + static Win32Window* GetThisFromHandle(HWND const window) noexcept; + + // Update the window frame's theme to match the system theme. + static void UpdateTheme(HWND const window); + + bool quit_on_close_ = false; + + // window handle for top level window. + HWND window_handle_ = nullptr; + + // window handle for hosted content. + HWND child_content_ = nullptr; +}; + +#endif // RUNNER_WIN32_WINDOW_H_ diff --git a/siro_rider/.gitignore b/siro_rider/.gitignore new file mode 100644 index 0000000..3820a95 --- /dev/null +++ b/siro_rider/.gitignore @@ -0,0 +1,45 @@ +# Miscellaneous +*.class +*.log +*.pyc +*.swp +.DS_Store +.atom/ +.build/ +.buildlog/ +.history +.svn/ +.swiftpm/ +migrate_working_dir/ + +# IntelliJ related +*.iml +*.ipr +*.iws +.idea/ + +# The .vscode folder contains launch configuration and tasks you configure in +# VS Code which you may wish to be included in version control, so this line +# is commented out by default. +#.vscode/ + +# Flutter/Dart/Pub related +**/doc/api/ +**/ios/Flutter/.last_build_id +.dart_tool/ +.flutter-plugins-dependencies +.pub-cache/ +.pub/ +/build/ +/coverage/ + +# Symbolication related +app.*.symbols + +# Obfuscation related +app.*.map.json + +# Android Studio will place build artifacts here +/android/app/debug +/android/app/profile +/android/app/release diff --git a/siro_rider/.metadata b/siro_rider/.metadata new file mode 100644 index 0000000..c0fe018 --- /dev/null +++ b/siro_rider/.metadata @@ -0,0 +1,45 @@ +# This file tracks properties of this Flutter project. +# Used by Flutter tool to assess capabilities and perform upgrades etc. +# +# This file should be version controlled and should not be manually edited. + +version: + revision: "90673a4eef275d1a6692c26ac80d6d746d41a73a" + channel: "stable" + +project_type: app + +# Tracks metadata for the flutter migrate command +migration: + platforms: + - platform: root + create_revision: 90673a4eef275d1a6692c26ac80d6d746d41a73a + base_revision: 90673a4eef275d1a6692c26ac80d6d746d41a73a + - platform: android + create_revision: 90673a4eef275d1a6692c26ac80d6d746d41a73a + base_revision: 90673a4eef275d1a6692c26ac80d6d746d41a73a + - platform: ios + create_revision: 90673a4eef275d1a6692c26ac80d6d746d41a73a + base_revision: 90673a4eef275d1a6692c26ac80d6d746d41a73a + - platform: linux + create_revision: 90673a4eef275d1a6692c26ac80d6d746d41a73a + base_revision: 90673a4eef275d1a6692c26ac80d6d746d41a73a + - platform: macos + create_revision: 90673a4eef275d1a6692c26ac80d6d746d41a73a + base_revision: 90673a4eef275d1a6692c26ac80d6d746d41a73a + - platform: web + create_revision: 90673a4eef275d1a6692c26ac80d6d746d41a73a + base_revision: 90673a4eef275d1a6692c26ac80d6d746d41a73a + - platform: windows + create_revision: 90673a4eef275d1a6692c26ac80d6d746d41a73a + base_revision: 90673a4eef275d1a6692c26ac80d6d746d41a73a + + # User provided section + + # List of Local paths (relative to this file) that should be + # ignored by the migrate tool. + # + # Files that are not part of the templates will be ignored by default. + unmanaged_files: + - 'lib/main.dart' + - 'ios/Runner.xcodeproj/project.pbxproj' diff --git a/siro_rider/README.md b/siro_rider/README.md new file mode 100644 index 0000000..c5c557d --- /dev/null +++ b/siro_rider/README.md @@ -0,0 +1,17 @@ +# siro_rider + +A new Flutter project. + +## Getting Started + +This project is a starting point for a Flutter application. + +A few resources to get you started if this is your first Flutter project: + +- [Learn Flutter](https://docs.flutter.dev/get-started/learn-flutter) +- [Write your first Flutter app](https://docs.flutter.dev/get-started/codelab) +- [Flutter learning resources](https://docs.flutter.dev/reference/learning-resources) + +For help getting started with Flutter development, view the +[online documentation](https://docs.flutter.dev/), which offers tutorials, +samples, guidance on mobile development, and a full API reference. diff --git a/siro_rider/analysis_options.yaml b/siro_rider/analysis_options.yaml new file mode 100644 index 0000000..0d29021 --- /dev/null +++ b/siro_rider/analysis_options.yaml @@ -0,0 +1,28 @@ +# This file configures the analyzer, which statically analyzes Dart code to +# check for errors, warnings, and lints. +# +# The issues identified by the analyzer are surfaced in the UI of Dart-enabled +# IDEs (https://dart.dev/tools#ides-and-editors). The analyzer can also be +# invoked from the command line by running `flutter analyze`. + +# The following line activates a set of recommended lints for Flutter apps, +# packages, and plugins designed to encourage good coding practices. +include: package:flutter_lints/flutter.yaml + +linter: + # The lint rules applied to this project can be customized in the + # section below to disable rules from the `package:flutter_lints/flutter.yaml` + # included above or to enable additional rules. A list of all available lints + # and their documentation is published at https://dart.dev/lints. + # + # Instead of disabling a lint rule for the entire project in the + # section below, it can also be suppressed for a single line of code + # or a specific dart file by using the `// ignore: name_of_lint` and + # `// ignore_for_file: name_of_lint` syntax on the line or in the file + # producing the lint. + rules: + # avoid_print: false # Uncomment to disable the `avoid_print` rule + # prefer_single_quotes: true # Uncomment to enable the `prefer_single_quotes` rule + +# Additional information about this file can be found at +# https://dart.dev/guides/language/analysis-options diff --git a/siro_rider/analyze_report.txt b/siro_rider/analyze_report.txt new file mode 100644 index 0000000..eeff094 --- /dev/null +++ b/siro_rider/analyze_report.txt @@ -0,0 +1,947 @@ +Analyzing siro_rider... + + error - packages/calendar_builder/example/lib/main.dart:2:8 - Target of URI doesn't exist: 'package:example/custom_month_builder.dart'. Try creating the file referenced by the URI, or try using a URI for a file that does exist. - uri_does_not_exist + error - packages/calendar_builder/example/lib/main.dart:3:8 - Target of URI doesn't exist: 'package:example/customized_month_builder.dart'. Try creating the file referenced by the URI, or try using a URI for a file that does exist. - uri_does_not_exist + error - packages/calendar_builder/example/lib/main.dart:4:8 - Target of URI doesn't exist: 'package:example/month_builder.dart'. Try creating the file referenced by the URI, or try using a URI for a file that does exist. - uri_does_not_exist + error - packages/calendar_builder/example/lib/main.dart:24:46 - The name 'MonthBuilderScreen' isn't a class. Try correcting the name to match an existing class. - creation_with_non_type + error - packages/calendar_builder/example/lib/main.dart:26:19 - The name 'CustomizedMonthBuilderScreen' isn't a class. Try correcting the name to match an existing class. - creation_with_non_type + error - packages/calendar_builder/example/lib/main.dart:27:53 - The name 'CustomMonthBuilderScreen' isn't a class. Try correcting the name to match an existing class. - creation_with_non_type + error - packages/calendar_builder/example/test/widget_test.dart:11:8 - Target of URI doesn't exist: 'package:example/main.dart'. Try creating the file referenced by the URI, or try using a URI for a file that does exist. - uri_does_not_exist + error - packages/calendar_builder/example/test/widget_test.dart:16:35 - The name 'MyApp' isn't a class. Try correcting the name to match an existing class. - creation_with_non_type + error - packages/flutter_paypal/example/lib/main.dart:2:8 - Target of URI doesn't exist: 'package:flutter_paypal/flutter_paypal.dart'. Try creating the file referenced by the URI, or try using a URI for a file that does exist. - uri_does_not_exist + error - packages/flutter_paypal/example/lib/main.dart:44:60 - The method 'UsePaypal' isn't defined for the type '_MyHomePageState'. Try correcting the name to the name of an existing method, or defining a method named 'UsePaypal'. - undefined_method + error - packages/flutter_paypal/example/test/widget_test.dart:11:8 - Target of URI doesn't exist: 'package:example/main.dart'. Try creating the file referenced by the URI, or try using a URI for a file that does exist. - uri_does_not_exist + error - packages/flutter_paypal/example/test/widget_test.dart:16:35 - The name 'MyApp' isn't a class. Try correcting the name to match an existing class. - creation_with_non_type + error - packages/flutter_paypal/lib/flutter_paypal.dart:5:8 - Target of URI doesn't exist: 'package:flutter_paypal/src/screens/complete_payment.dart'. Try creating the file referenced by the URI, or try using a URI for a file that does exist. - uri_does_not_exist + error - packages/flutter_paypal/lib/flutter_paypal.dart:6:8 - Target of URI doesn't exist: 'package:flutter_spinkit/flutter_spinkit.dart'. Try creating the file referenced by the URI, or try using a URI for a file that does exist. - uri_does_not_exist + error - packages/flutter_paypal/lib/flutter_paypal.dart:173:43 - The method 'CompletePayment' isn't defined for the type 'UsePaypalState'. Try correcting the name to the name of an existing method, or defining a method named 'CompletePayment'. - undefined_method + error - packages/flutter_paypal/lib/flutter_paypal.dart:269:35 - The name 'SpinKitFadingCube' isn't a class. Try correcting the name to match an existing class. - creation_with_non_type + error - packages/flutter_paypal/lib/flutter_paypal.dart:289:34 - Invalid constant value. - invalid_constant + error - packages/flutter_paypal/lib/flutter_paypal.dart:289:34 - The method 'SpinKitFadingCube' isn't defined for the type 'UsePaypalState'. Try correcting the name to the name of an existing method, or defining a method named 'SpinKitFadingCube'. - undefined_method + error - packages/flutter_paypal/lib/src/PaypalServices.dart:6:8 - Target of URI doesn't exist: 'package:http_auth/http_auth.dart'. Try creating the file referenced by the URI, or try using a URI for a file that does exist. - uri_does_not_exist + error - packages/flutter_paypal/lib/src/PaypalServices.dart:22:20 - The method 'BasicAuthClient' isn't defined for the type 'PaypalServices'. Try correcting the name to the name of an existing method, or defining a method named 'BasicAuthClient'. - undefined_method + error - packages/flutter_paypal/lib/src/screens/complete_payment.dart:4:8 - Target of URI doesn't exist: 'package:flutter_paypal/src/errors/network_error.dart'. Try creating the file referenced by the URI, or try using a URI for a file that does exist. - uri_does_not_exist + error - packages/flutter_paypal/lib/src/screens/complete_payment.dart:5:8 - Target of URI doesn't exist: 'package:flutter_spinkit/flutter_spinkit.dart'. Try creating the file referenced by the URI, or try using a URI for a file that does exist. - uri_does_not_exist + error - packages/flutter_paypal/lib/src/screens/complete_payment.dart:91:30 - Invalid constant value. - invalid_constant + error - packages/flutter_paypal/lib/src/screens/complete_payment.dart:91:30 - The method 'SpinKitFadingCube' isn't defined for the type '_CompletePaymentState'. Try correcting the name to the name of an existing method, or defining a method named 'SpinKitFadingCube'. - undefined_method + error - packages/flutter_paypal/lib/src/screens/complete_payment.dart:104:34 - The method 'NetworkError' isn't defined for the type '_CompletePaymentState'. Try correcting the name to the name of an existing method, or defining a method named 'NetworkError'. - undefined_method + error - packages/get/example/test/main_test.dart:6:8 - Target of URI doesn't exist: 'package:get_demo/pages/home/domain/adapters/repository_adapter.dart'. Try creating the file referenced by the URI, or try using a URI for a file that does exist. - uri_does_not_exist + error - packages/get/example/test/main_test.dart:7:8 - Target of URI doesn't exist: 'package:get_demo/pages/home/domain/entity/cases_model.dart'. Try creating the file referenced by the URI, or try using a URI for a file that does exist. - uri_does_not_exist + error - packages/get/example/test/main_test.dart:8:8 - Target of URI doesn't exist: 'package:get_demo/pages/home/presentation/controllers/home_controller.dart'. Try creating the file referenced by the URI, or try using a URI for a file that does exist. - uri_does_not_exist + error - packages/get/example/test/main_test.dart:13:33 - Classes and mixins can only implement other classes and mixins. Try specifying a class or mixin, or remove the name from the list. - implements_non_class + error - packages/get/example/test/main_test.dart:15:10 - The name 'CasesModel' isn't a type, so it can't be used as a type argument. Try correcting the name to an existing type, or defining a type named 'CasesModel'. - non_type_as_type_argument + error - packages/get/example/test/main_test.dart:19:14 - The method 'CasesModel' isn't defined for the type 'MockRepository'. Try correcting the name to the name of an existing method, or defining a method named 'CasesModel'. - undefined_method + error - packages/get/example/test/main_test.dart:20:17 - The method 'Global' isn't defined for the type 'MockRepository'. Try correcting the name to the name of an existing method, or defining a method named 'Global'. - undefined_method + error - packages/get/example/test/main_test.dart:35:19 - The name 'CasesModel' isn't a type, so it can't be used as a type argument. Try correcting the name to an existing type, or defining a type named 'CasesModel'. - non_type_as_type_argument + error - packages/get/example/test/main_test.dart:43:17 - The name 'IHomeRepository' isn't a type, so it can't be used as a type argument. Try correcting the name to an existing type, or defining a type named 'IHomeRepository'. - non_type_as_type_argument + error - packages/get/example/test/main_test.dart:44:17 - The name 'HomeController' isn't a type, so it can't be used as a type argument. Try correcting the name to an existing type, or defining a type named 'HomeController'. - non_type_as_type_argument + error - packages/get/example/test/main_test.dart:45:15 - The function 'HomeController' isn't defined. Try importing the library that defines 'HomeController', correcting the name to the name of an existing function, or defining a function named 'HomeController'. - undefined_function + error - packages/get/example/test/main_test.dart:49:27 - The name 'HomeController' isn't a type, so it can't be used as a type argument. Try correcting the name to an existing type, or defining a type named 'HomeController'. - non_type_as_type_argument + error - packages/get/example/test/main_test.dart:50:27 - The name 'IHomeRepository' isn't a type, so it can't be used as a type argument. Try correcting the name to an existing type, or defining a type named 'IHomeRepository'. - non_type_as_type_argument + error - packages/get/example/test/main_test.dart:55:27 - The name 'HomeController' isn't a type, so it can't be used as a type argument. Try correcting the name to an existing type, or defining a type named 'HomeController'. - non_type_as_type_argument + error - packages/get/example/test/main_test.dart:56:27 - The name 'IHomeRepository' isn't a type, so it can't be used as a type argument. Try correcting the name to an existing type, or defining a type named 'IHomeRepository'. - non_type_as_type_argument + error - packages/get/example/test/main_test.dart:62:27 - The name 'HomeController' isn't a type, so it can't be used as a type argument. Try correcting the name to an existing type, or defining a type named 'HomeController'. - non_type_as_type_argument + error - packages/get/example/test/main_test.dart:68:33 - The name 'HomeController' isn't a type, so it can't be used as a type argument. Try correcting the name to an existing type, or defining a type named 'HomeController'. - non_type_as_type_argument +warning - lib/controller/auth/otp_controller.dart:2:8 - Unused import: 'package:siro_rider/views/home/map_page_passenger.dart'. Try removing the import directive. - unused_import +warning - lib/controller/auth/register_controller.dart:8:8 - Unused import: 'package:siro_rider/controller/functions/encrypt_decrypt.dart'. Try removing the import directive. - unused_import +warning - lib/controller/auth/token_otp_change_controller.dart:9:8 - Unused import: '../../print.dart'. Try removing the import directive. - unused_import +warning - lib/controller/auth/token_otp_change_controller.dart:11:8 - Unused import: '../firebase/firbase_messge.dart'. Try removing the import directive. - unused_import +warning - lib/controller/auth/tokens_controller.dart:9:8 - Unused import: '../functions/encrypt_decrypt.dart'. Try removing the import directive. - unused_import +warning - lib/controller/firebase/firbase_messge.dart:21:8 - Unused import: '../home/map/ride_state.dart'. Try removing the import directive. - unused_import +warning - lib/controller/firebase/firbase_messge.dart:52:28 - The value of the local variable 'settings' isn't used. Try removing the variable or using it. - unused_local_variable +warning - lib/controller/firebase/firbase_messge.dart:84:28 - The value of the local variable 'android' isn't used. Try removing the variable or using it. - unused_local_variable +warning - lib/controller/firebase/notification_service.dart:3:8 - Unused import: 'package:get/get.dart'. Try removing the import directive. - unused_import +warning - lib/controller/functions/crud.dart:435:16 - The value of the local variable 'responseBody' isn't used. Try removing the variable or using it. - unused_local_variable +warning - lib/controller/functions/crud.dart:445:16 - The value of the local variable 'errorBody' isn't used. Try removing the variable or using it. - unused_local_variable +warning - lib/controller/functions/crud.dart:456:9 - The value of the local variable 'uid' isn't used. Try removing the variable or using it. - unused_local_variable +warning - lib/controller/functions/crud.dart:499:12 - The value of the local variable 'extracted' isn't used. Try removing the variable or using it. - unused_local_variable +warning - lib/controller/functions/crud.dart:646:11 - The value of the local variable 'checkResponse' isn't used. Try removing the variable or using it. - unused_local_variable +warning - lib/controller/functions/encrypt_decrypt.dart:36:36 - The '!' will have no effect because the receiver can't be null. Try removing the '!' operator. - unnecessary_non_null_assertion +warning - lib/controller/functions/encrypt_decrypt.dart:37:47 - The '!' will have no effect because the receiver can't be null. Try removing the '!' operator. - unnecessary_non_null_assertion +warning - lib/controller/functions/log_out.dart:37:9 - The value of the local variable 'res' isn't used. Try removing the variable or using it. - unused_local_variable +warning - lib/controller/functions/package_info.dart:2:8 - Unused import: 'dart:convert'. Try removing the import directive. - unused_import +warning - lib/controller/functions/package_info.dart:4:8 - Unused import: 'dart:math'. Try removing the import directive. - unused_import +warning - lib/controller/functions/package_info.dart:312:5 - Dead code. Try removing the code, or fixing the code before it so that it can be reached. - dead_code +warning - lib/controller/functions/secure_storage.dart:7:8 - Unused import: 'package:secure_string_operations/secure_string_operations.dart'. Try removing the import directive. - unused_import +warning - lib/controller/functions/secure_storage.dart:9:8 - Unused import: '../../constant/char_map.dart'. Try removing the import directive. - unused_import +warning - lib/controller/functions/secure_storage.dart:12:8 - Unused import: '../../print.dart'. Try removing the import directive. - unused_import +warning - lib/controller/functions/sms_controller.dart:14:8 - Unused import: '../../print.dart'. Try removing the import directive. - unused_import +warning - lib/controller/functions/sms_controller.dart:82:9 - The value of the local variable 'res' isn't used. Try removing the variable or using it. - unused_local_variable +warning - lib/controller/functions/sms_controller.dart:93:9 - The value of the local variable 'res' isn't used. Try removing the variable or using it. - unused_local_variable +warning - lib/controller/functions/sms_controller.dart:110:9 - The value of the local variable 'res' isn't used. Try removing the variable or using it. - unused_local_variable +warning - lib/controller/functions/tts.dart:2:8 - Unused import: 'package:flutter/material.dart'. Try removing the import directive. - unused_import +warning - lib/controller/functions/upload_image.dart:4:8 - Unused import: 'package:siro_rider/constant/api_key.dart'. Try removing the import directive. - unused_import +warning - lib/controller/functions/upload_image.dart:73:9 - The value of the local variable 'multipartFile' isn't used. Try removing the variable or using it. - unused_local_variable +warning - lib/controller/home/blinking_promo_controller.dart.dart:32:13 - The value of the local variable 'decode' isn't used. Try removing the variable or using it. - unused_local_variable +warning - lib/controller/home/device_performance.dart:33:29 - The value of the field '_highEndXiaomiModels' isn't used. Try removing the field, or using it. - unused_field +warning - lib/controller/home/device_tier.dart:29:41 - The left operand can't be null, so the right operand is never executed. Try removing the operator and the right operand. - dead_null_aware_expression +warning - lib/controller/home/device_tier.dart:32:48 - The left operand can't be null, so the right operand is never executed. Try removing the operator and the right operand. - dead_null_aware_expression +warning - lib/controller/home/ios_live_activity_service.dart:3:8 - Unused import: 'dart:convert'. Try removing the import directive. - unused_import +warning - lib/controller/home/map/location_search_controller.dart:2:8 - Unused import: 'dart:convert'. Try removing the import directive. - unused_import +warning - lib/controller/home/map/location_search_controller.dart:3:8 - Unused import: 'dart:io'. Try removing the import directive. - unused_import +warning - lib/controller/home/map/location_search_controller.dart:4:34 - The name max is shown, but isn't used. Try removing the name from the list of shown members. - unused_shown_name +warning - lib/controller/home/map/location_search_controller.dart:4:39 - The name min is shown, but isn't used. Try removing the name from the list of shown members. - unused_shown_name +warning - lib/controller/home/map/location_search_controller.dart:6:8 - Unused import: 'package:flutter/services.dart'. Try removing the import directive. - unused_import +warning - lib/controller/home/map/location_search_controller.dart:13:8 - Unused import: '../../../constant/box_name.dart'. Try removing the import directive. - unused_import +warning - lib/controller/home/map/location_search_controller.dart:16:8 - Unused import: '../../../constant/style.dart'. Try removing the import directive. - unused_import +warning - lib/controller/home/map/location_search_controller.dart:28:8 - Unused import: 'ride_state.dart'. Try removing the import directive. - unused_import +warning - lib/controller/home/map/location_search_controller.dart:697:31 - The operand can't be 'null', so the condition is always 'true'. Remove the condition. - unnecessary_null_comparison +warning - lib/controller/home/map/location_search_controller.dart:821:8 - The declaration '_listenForDeepLink' isn't referenced. Try removing the declaration of '_listenForDeepLink'. - unused_element +warning - lib/controller/home/map/location_search_controller.dart:834:33 - The operand can't be 'null', so the condition is always 'false'. Try removing the condition, an enclosing condition, or the whole conditional statement. - unnecessary_null_comparison +warning - lib/controller/home/map/location_search_controller.dart:841:33 - The operand can't be 'null', so the condition is always 'true'. Remove the condition. - unnecessary_null_comparison +warning - lib/controller/home/map/location_search_controller.dart:893:33 - The operand can't be 'null', so the condition is always 'false'. Try removing the condition, an enclosing condition, or the whole conditional statement. - unnecessary_null_comparison +warning - lib/controller/home/map/location_search_controller.dart:899:33 - The operand can't be 'null', so the condition is always 'true'. Remove the condition. - unnecessary_null_comparison +warning - lib/controller/home/map/location_search_controller.dart:1009:14 - The value of the local variable 'latestWaypoint' isn't used. Try removing the variable or using it. - unused_local_variable +warning - lib/controller/home/map/location_search_controller.dart:1015:10 - The declaration '_haversineKm' isn't referenced. Try removing the declaration of '_haversineKm'. - unused_element +warning - lib/controller/home/map/location_search_controller.dart:1028:10 - The declaration '_kmToLatDelta' isn't referenced. Try removing the declaration of '_kmToLatDelta'. - unused_element +warning - lib/controller/home/map/location_search_controller.dart:1032:10 - The declaration '_kmToLngDelta' isn't referenced. Try removing the declaration of '_kmToLngDelta'. - unused_element +warning - lib/controller/home/map/location_search_controller.dart:1036:10 - The declaration '_buildOsrmWaypointCoords' isn't referenced. Try removing the declaration of '_buildOsrmWaypointCoords'. - unused_element +warning - lib/controller/home/map/map_engine_controller.dart:2:44 - The name pow is shown, but isn't used. Try removing the name from the list of shown members. - unused_shown_name +warning - lib/controller/home/map/map_engine_controller.dart:2:49 - The name sqrt is shown, but isn't used. Try removing the name from the list of shown members. - unused_shown_name +warning - lib/controller/home/map/map_engine_controller.dart:19:8 - Duplicate import. Try removing all but one import of the library. - duplicate_import +warning - lib/controller/home/map/map_engine_controller.dart:677:8 - The declaration '_initializePolygons' isn't referenced. Try removing the declaration of '_initializePolygons'. - unused_element +warning - lib/controller/home/map/map_engine_controller.dart:694:8 - The declaration '_applyLowEndModeIfNeeded' isn't referenced. Try removing the declaration of '_applyLowEndModeIfNeeded'. - unused_element +warning - lib/controller/home/map/map_engine_controller.dart:698:16 - The declaration '_initMinimalIcons' isn't referenced. Try removing the declaration of '_initMinimalIcons'. - unused_element +warning - lib/controller/home/map/map_engine_controller.dart:702:16 - The declaration '_playRouteAnimation' isn't referenced. Try removing the declaration of '_playRouteAnimation'. - unused_element +warning - lib/controller/home/map/nearby_drivers_controller.dart:3:49 - The name pow is shown, but isn't used. Try removing the name from the list of shown members. - unused_shown_name +warning - lib/controller/home/map/nearby_drivers_controller.dart:231:24 - The value of the local variable 'durationFromDriverToPassenger' isn't used. Try removing the variable or using it. - unused_local_variable +warning - lib/controller/home/map/ride_lifecycle_controller.dart:1424:45 - The left operand can't be null, so the right operand is never executed. Try removing the operator and the right operand. - dead_null_aware_expression +warning - lib/controller/home/map/ride_lifecycle_controller.dart:3694:39 - The '!' will have no effect because the receiver can't be null. Try removing the '!' operator. - unnecessary_non_null_assertion +warning - lib/controller/home/map/ride_lifecycle_controller.dart:3781:8 - The declaration '_startPollingFallback' isn't referenced. Try removing the declaration of '_startPollingFallback'. - unused_element +warning - lib/controller/home/map/ride_lifecycle_controller.dart:3955:35 - The operand can't be 'null', so the condition is always 'true'. Remove the condition. - unnecessary_null_comparison +warning - lib/controller/home/map/ride_lifecycle_controller.dart:4415:17 - The declaration '_buildDashedPolylines' isn't referenced. Try removing the declaration of '_buildDashedPolylines'. - unused_element +warning - lib/controller/home/map/ui_interactions_controller.dart:7:8 - Unused import: 'package:intaleq_maps/intaleq_maps.dart'. Try removing the import directive. - unused_import +warning - lib/controller/home/map/ui_interactions_controller.dart:18:8 - Unused import: '../../../views/widgets/mydialoug.dart'. Try removing the import directive. - unused_import +warning - lib/controller/home/map/ui_interactions_controller.dart:20:8 - Unused import: '../../../views/home/map_page_passenger.dart'. Try removing the import directive. - unused_import +warning - lib/controller/home/map/ui_interactions_controller.dart:21:8 - Unused import: '../../../views/widgets/error_snakbar.dart'. Try removing the import directive. - unused_import +warning - lib/controller/home/map/ui_interactions_controller.dart:22:8 - Unused import: '../../../models/model/painter_copoun.dart'. Try removing the import directive. - unused_import +warning - lib/controller/home/map/ui_interactions_controller.dart:24:8 - Unused import: '../../firebase/local_notification.dart'. Try removing the import directive. - unused_import +warning - lib/controller/home/map/ui_interactions_controller.dart:30:8 - Unused import: 'map_engine_controller.dart'. Try removing the import directive. - unused_import +warning - lib/controller/home/map/ui_interactions_controller.dart:259:63 - The left operand can't be null, so the right operand is never executed. Try removing the operator and the right operand. - dead_null_aware_expression +warning - lib/controller/home/payment/credit_card_Controller.dart:5:8 - Unused import: '../../functions/digit_obsecur_formate.dart'. Try removing the import directive. - unused_import +warning - lib/controller/home/payment/credit_card_Controller.dart:16:13 - The value of the local variable 'cardNumber' isn't used. Try removing the variable or using it. - unused_local_variable +warning - lib/controller/home/payment/credit_card_Controller.dart:17:13 - The value of the local variable 'cardHolderName' isn't used. Try removing the variable or using it. - unused_local_variable +warning - lib/controller/home/payment/credit_card_Controller.dart:19:13 - The value of the local variable 'expiryDate' isn't used. Try removing the variable or using it. - unused_local_variable +warning - lib/controller/home/payment/credit_card_Controller.dart:20:13 - The value of the local variable 'cvvCode' isn't used. Try removing the variable or using it. - unused_local_variable +warning - lib/controller/home/points_for_rider_controller.dart:10:8 - Unused import: '../functions/location_controller.dart'. Try removing the import directive. - unused_import +warning - lib/controller/home/splash_screen_controlle.dart:181:8 - The declaration '_scheduleDailyNotifications' isn't referenced. Try removing the declaration of '_scheduleDailyNotifications'. - unused_element +warning - lib/controller/home/splash_screen_controlle.dart:183:54 - The left operand can't be null, so the right operand is never executed. Try removing the operator and the right operand. - dead_null_aware_expression +warning - lib/controller/home/vip_waitting_page.dart:19:8 - Unused import: '../functions/encrypt_decrypt.dart'. Try removing the import directive. - unused_import +warning - lib/controller/home/vip_waitting_page.dart:45:11 - The value of the local variable 'mapPassengerController' isn't used. Try removing the variable or using it. - unused_local_variable +warning - lib/controller/local/phone_intel/intl_phone_field.dart:3:8 - Unused import: 'package:siro_rider/print.dart'. Try removing the import directive. - unused_import +warning - lib/controller/local/translations.dart:507:11 - Two keys in a map literal shouldn't be equal. Change or remove the duplicate key. - equal_keys_in_map +warning - lib/controller/local/translations.dart:1661:11 - Two keys in a map literal shouldn't be equal. Change or remove the duplicate key. - equal_keys_in_map +warning - lib/controller/local/translations.dart:7797:11 - Two keys in a map literal shouldn't be equal. Change or remove the duplicate key. - equal_keys_in_map +warning - lib/controller/local/translations.dart:8799:11 - Two keys in a map literal shouldn't be equal. Change or remove the duplicate key. - equal_keys_in_map +warning - lib/controller/local/translations.dart:9337:11 - Two keys in a map literal shouldn't be equal. Change or remove the duplicate key. - equal_keys_in_map +warning - lib/controller/local/translations.dart:10369:11 - Two keys in a map literal shouldn't be equal. Change or remove the duplicate key. - equal_keys_in_map +warning - lib/controller/local/translations.dart:10854:11 - Two keys in a map literal shouldn't be equal. Change or remove the duplicate key. - equal_keys_in_map +warning - lib/controller/local/translations.dart:12117:11 - Two keys in a map literal shouldn't be equal. Change or remove the duplicate key. - equal_keys_in_map +warning - lib/controller/local/translations.dart:12597:11 - Two keys in a map literal shouldn't be equal. Change or remove the duplicate key. - equal_keys_in_map +warning - lib/controller/local/translations.dart:13847:11 - Two keys in a map literal shouldn't be equal. Change or remove the duplicate key. - equal_keys_in_map +warning - lib/controller/local/translations.dart:14386:11 - Two keys in a map literal shouldn't be equal. Change or remove the duplicate key. - equal_keys_in_map +warning - lib/controller/local/translations.dart:15366:11 - Two keys in a map literal shouldn't be equal. Change or remove the duplicate key. - equal_keys_in_map +warning - lib/controller/local/translations.dart:15897:11 - Two keys in a map literal shouldn't be equal. Change or remove the duplicate key. - equal_keys_in_map +warning - lib/controller/local/translations.dart:16846:11 - Two keys in a map literal shouldn't be equal. Change or remove the duplicate key. - equal_keys_in_map +warning - lib/controller/local/translations.dart:17390:11 - Two keys in a map literal shouldn't be equal. Change or remove the duplicate key. - equal_keys_in_map +warning - lib/controller/local/translations.dart:18407:11 - Two keys in a map literal shouldn't be equal. Change or remove the duplicate key. - equal_keys_in_map +warning - lib/controller/local/translations.dart:18947:11 - Two keys in a map literal shouldn't be equal. Change or remove the duplicate key. - equal_keys_in_map +warning - lib/controller/local/translations.dart:19967:11 - Two keys in a map literal shouldn't be equal. Change or remove the duplicate key. - equal_keys_in_map +warning - lib/controller/local/translations.dart:20500:11 - Two keys in a map literal shouldn't be equal. Change or remove the duplicate key. - equal_keys_in_map +warning - lib/controller/local/translations.dart:21433:11 - Two keys in a map literal shouldn't be equal. Change or remove the duplicate key. - equal_keys_in_map +warning - lib/controller/local/translations.dart:21979:11 - Two keys in a map literal shouldn't be equal. Change or remove the duplicate key. - equal_keys_in_map +warning - lib/controller/local/translations.dart:22943:11 - Two keys in a map literal shouldn't be equal. Change or remove the duplicate key. - equal_keys_in_map +warning - lib/controller/local/translations.dart:23458:11 - Two keys in a map literal shouldn't be equal. Change or remove the duplicate key. - equal_keys_in_map +warning - lib/controller/local/translations.dart:24385:11 - Two keys in a map literal shouldn't be equal. Change or remove the duplicate key. - equal_keys_in_map +warning - lib/controller/notification/passenger_notification_controller.dart:4:8 - Unused import: 'package:siro_rider/controller/firebase/firbase_messge.dart'. Try removing the import directive. - unused_import +warning - lib/controller/notification/passenger_notification_controller.dart:60:9 - The value of the local variable 'res' isn't used. Try removing the variable or using it. - unused_local_variable +warning - lib/controller/payment/payment_controller.dart:2:8 - Unused import: 'package:siro_rider/constant/api_key.dart'. Try removing the import directive. - unused_import +warning - lib/controller/payment/payment_controller.dart:4:8 - Unused import: 'package:siro_rider/controller/firebase/firbase_messge.dart'. Try removing the import directive. - unused_import +warning - lib/controller/payment/payment_controller.dart:5:8 - Unused import: 'package:siro_rider/controller/payment/paymob/paymob_response.dart'. Try removing the import directive. - unused_import +warning - lib/controller/payment/payment_controller.dart:7:8 - Unused import: 'package:http/http.dart'. Try removing the import directive. - unused_import +warning - lib/controller/payment/payment_controller.dart:12:8 - Unused import: 'package:siro_rider/controller/home/map/ride_state.dart'. Try removing the import directive. - unused_import +warning - lib/controller/payment/payment_controller.dart:13:8 - Duplicate import. Try removing all but one import of the library. - duplicate_import +warning - lib/controller/payment/payment_controller.dart:13:8 - Unused import: 'package:siro_rider/controller/home/map/ride_state.dart'. Try removing the import directive. - unused_import +warning - lib/controller/payment/payment_controller.dart:17:8 - Unused import: '../../constant/colors.dart'. Try removing the import directive. - unused_import +warning - lib/controller/payment/payment_controller.dart:18:8 - Unused import: '../../constant/info.dart'. Try removing the import directive. - unused_import +warning - lib/controller/payment/payment_controller.dart:24:8 - Unused import: '../functions/encrypt_decrypt.dart'. Try removing the import directive. - unused_import +warning - lib/controller/payment/payment_controller.dart:25:8 - Unused import: '../functions/toast.dart'. Try removing the import directive. - unused_import +warning - lib/controller/payment/payment_controller.dart:128:11 - The value of the local variable 'res1' isn't used. Try removing the variable or using it. - unused_local_variable +warning - lib/controller/payment/payment_controller.dart:671:11 - The value of the local variable 'localAuth' isn't used. Try removing the variable or using it. - unused_local_variable +warning - lib/controller/payment/paymob.dart:10:8 - Unused import: '../functions/encrypt_decrypt.dart'. Try removing the import directive. - unused_import +warning - lib/controller/payment/paymob.dart:46:27 - The exception variable 'e' isn't used, so the 'catch' clause can be removed. Try removing the catch clause. - unused_catch_clause +warning - lib/controller/payment/paymob.dart:77:26 - The exception variable 'e' isn't used, so the 'catch' clause can be removed. Try removing the catch clause. - unused_catch_clause +warning - lib/controller/payment/paymob.dart:82:18 - The declaration '_getStatusAfterPaid' isn't referenced. Try removing the declaration of '_getStatusAfterPaid'. - unused_element +warning - lib/controller/payment/paymob/paymob_response.dart:11:8 - Unused import: 'package:http/http.dart'. Try removing the import directive. - unused_import +warning - lib/controller/payment/paymob/paymob_response.dart:13:8 - Unused import: '../../functions/encrypt_decrypt.dart'. Try removing the import directive. - unused_import +warning - lib/controller/payment/paymob/paymob_wallet.dart:8:8 - Unused import: '../../functions/encrypt_decrypt.dart'. Try removing the import directive. - unused_import +warning - lib/controller/payment/paymob/paymob_wallet.dart:43:15 - The value of the field '_iFrameURL' isn't used. Try removing the field, or using it. - unused_field +warning - lib/controller/payment/paymob/paymob_wallet.dart:169:26 - The exception variable 'e' isn't used, so the 'catch' clause can be removed. Try removing the catch clause. - unused_catch_clause +warning - lib/controller/payment/paymob/paymob_wallet.dart:275:15 - The left operand can't be null, so the right operand is never executed. Try removing the operator and the right operand. - dead_null_aware_expression +warning - lib/models/model/painter_copoun.dart:4:8 - Unused import: 'package:siro_rider/splash_screen_page.dart'. Try removing the import directive. - unused_import +warning - lib/onbording_page.dart:9:7 - This class (or a class that this class inherits from) is marked as '@immutable', but one or more of its instance fields aren't final: OnBoardingPage.onBoardingControllerImp - must_be_immutable +warning - lib/print.dart:10:18 - This function has a nullable return type of 'Object?', but ends without returning a value. Try adding a return statement, or if no value is ever returned, try changing the return type to 'void'. - body_might_complete_normally_nullable +warning - lib/services/offline_map_service.dart:5:8 - Unused import: 'package:get_storage/get_storage.dart'. Try removing the import directive. - unused_import +warning - lib/services/offline_map_service.dart:7:8 - Unused import: '../../main.dart'. Try removing the import directive. - unused_import +warning - lib/splash_screen_page.dart:428:13 - The value of the local variable 'dashAngle' isn't used. Try removing the variable or using it. - unused_local_variable +warning - lib/views/Rate/rating_driver_bottom.dart:9:8 - Unused import: '../../controller/home/map_passenger_controller.dart'. Try removing the import directive. - unused_import +warning - lib/views/auth/login_page.dart:11:8 - Unused import: 'package:path/path.dart'. Try removing the import directive. - unused_import +warning - lib/views/auth/login_page.dart:17:8 - Unused import: '../widgets/elevated_btn.dart'. Try removing the import directive. - unused_import +warning - lib/views/home/HomePage/contact_us.dart:10:8 - Unused import: '../../widgets/elevated_btn.dart'. Try removing the import directive. - unused_import +warning - lib/views/home/HomePage/share_app_page.dart:307:10 - The declaration '_buildPassengerStats' isn't referenced. Try removing the declaration of '_buildPassengerStats'. - unused_element +warning - lib/views/home/HomePage/trip_monitor/trip_link_monitor.dart:20:11 - The value of the local variable 'params' isn't used. Try removing the variable or using it. - unused_local_variable +warning - lib/views/home/map_widget.dart/cancel_raide_page.dart:6:8 - Unused import: '../../widgets/elevated_btn.dart'. Try removing the import directive. - unused_import +warning - lib/views/home/map_widget.dart/cancel_raide_page.dart:24:11 - The value of the local variable 'controller' isn't used. Try removing the variable or using it. - unused_local_variable +warning - lib/views/home/map_widget.dart/form_search_places_destenation.dart:10:8 - Unused import: 'package:siro_rider/views/widgets/elevated_btn.dart'. Try removing the import directive. - unused_import +warning - lib/views/home/map_widget.dart/form_search_places_destenation.dart:18:8 - Unused import: '../../../controller/home/map/ride_state.dart'. Try removing the import directive. - unused_import +warning - lib/views/home/map_widget.dart/left_main_menu_icons.dart:1:8 - Unused import: 'dart:math'. Try removing the import directive. - unused_import +warning - lib/views/home/map_widget.dart/map_menu_widget.dart:9:8 - Unused import: 'package:siro_rider/constant/style.dart'. Try removing the import directive. - unused_import +warning - lib/views/home/map_widget.dart/picker_animation_container.dart:19:11 - The value of the local variable 'mapEngine' isn't used. Try removing the variable or using it. - unused_local_variable +warning - lib/views/home/map_widget.dart/ride_begin_passenger.dart:10:8 - Unused import: '../../../constant/style.dart'. Try removing the import directive. - unused_import +warning - lib/views/home/map_widget.dart/ride_begin_passenger.dart:29:11 - The value of the local variable 'uiController' isn't used. Try removing the variable or using it. - unused_local_variable +warning - lib/views/home/map_widget.dart/ride_from_start_app.dart:41:44 - The left operand can't be null, so the right operand is never executed. Try removing the operator and the right operand. - dead_null_aware_expression +warning - lib/views/home/my_wallet/passenger_wallet.dart:15:8 - Unused import: '../../widgets/elevated_btn.dart'. Try removing the import directive. - unused_import +warning - lib/views/home/my_wallet/passenger_wallet_dialoge.dart:3:8 - Unused import: 'package:siro_rider/controller/functions/encrypt_decrypt.dart'. Try removing the import directive. - unused_import +warning - lib/views/home/my_wallet/payment_screen_sham.dart:4:8 - Unused import: 'package:get/get.dart'. Try removing the import directive. - unused_import +warning - lib/views/home/navigation/navigation_controller.dart:81:13 - The value of the field '_lastAutoRerouteTime' isn't used. Try removing the field, or using it. - unused_field +warning - lib/views/home/navigation/navigation_controller.dart:719:62 - The '!' will have no effect because the receiver can't be null. Try removing the '!' operator. - unnecessary_non_null_assertion +warning - lib/views/home/navigation/navigation_controller.dart:1319:10 - The declaration '_kmToLatDelta' isn't referenced. Try removing the declaration of '_kmToLatDelta'. - unused_element +warning - lib/views/home/navigation/navigation_controller.dart:1320:10 - The declaration '_kmToLngDelta' isn't referenced. Try removing the declaration of '_kmToLngDelta'. - unused_element +warning - lib/views/home/profile/budgets_ads.dart:11:7 - This class (or a class that this class inherits from) is marked as '@immutable', but one or more of its instance fields aren't final: PointsCaptain.paymentController, PointsCaptain.pricePoint - must_be_immutable +warning - lib/views/home/profile/order_history.dart:2:8 - Unused import: 'dart:typed_data'. Try removing the import directive. - unused_import +warning - lib/views/home/profile/order_history.dart:437:8 - The declaration '_onMapCreated' isn't referenced. Try removing the declaration of '_onMapCreated'. - unused_element +warning - lib/views/widgets/elevated_btn.dart:4:8 - Unused import: 'package:vibration/vibration.dart'. Try removing the import directive. - unused_import +warning - lib/views/widgets/error_snakbar.dart:5:8 - Unused import: '../../constant/colors.dart'. Try removing the import directive. - unused_import +warning - lib/views/widgets/voice_call_bottom_sheet.dart:4:8 - Unused import: '../../constant/colors.dart'. Try removing the import directive. - unused_import +warning - lib/views/widgets/voice_call_bottom_sheet.dart:5:8 - Unused import: '../../constant/style.dart'. Try removing the import directive. - unused_import +warning - packages/calendar_builder/analysis_options.yaml:5:7 - Invalid option specified for 'enable-experiment': Flag "non-nullable" is no longer required. - invalid_option +warning - packages/calendar_builder/analysis_options.yaml:12:5 - 'import_of_legacy_library_into_null_safe' isn't a recognized diagnostic code. - unrecognized_error_code +warning - packages/calendar_builder/analysis_options.yaml:17:5 - 'missing_required_param' isn't a recognized lint rule. Try using the name of a recognized lint rule. - undefined_lint +warning - packages/calendar_builder/analysis_options.yaml:26:5 - 'import_of_legacy_library_into_null_safe' isn't a recognized lint rule. Try using the name of a recognized lint rule. - undefined_lint +warning - packages/calendar_builder/lib/src/models/month_data_model.dart:148:7 - Doc directive is missing an opening tag. Try opening the directive with the appropriate opening tag, 'end-tool'. - doc_directive_missing_opening_tag +warning - packages/calendar_builder/lib/src/models/month_data_model.dart:158:7 - Doc directive is missing an opening tag. Try opening the directive with the appropriate opening tag, 'end-tool'. - doc_directive_missing_opening_tag +warning - packages/calendar_builder/lib/src/models/month_data_model.dart:186:7 - Doc directive is missing an opening tag. Try opening the directive with the appropriate opening tag, 'end-tool'. - doc_directive_missing_opening_tag +warning - packages/calendar_builder/lib/src/models/month_data_model.dart:235:7 - Doc directive is missing an opening tag. Try opening the directive with the appropriate opening tag, 'end-tool'. - doc_directive_missing_opening_tag +warning - packages/calendar_builder/lib/src/models/month_data_model.dart:509:7 - Doc directive is missing an opening tag. Try opening the directive with the appropriate opening tag, 'end-tool'. - doc_directive_missing_opening_tag +warning - packages/calendar_builder/lib/src/models/month_data_model.dart:539:7 - Doc directive is missing an opening tag. Try opening the directive with the appropriate opening tag, 'end-tool'. - doc_directive_missing_opening_tag +warning - packages/calendar_builder/lib/src/models/month_data_model.dart:570:7 - Doc directive is missing an opening tag. Try opening the directive with the appropriate opening tag, 'end-tool'. - doc_directive_missing_opening_tag +warning - packages/calendar_builder/lib/src/models/month_data_model.dart:608:7 - Doc directive is missing an opening tag. Try opening the directive with the appropriate opening tag, 'end-tool'. - doc_directive_missing_opening_tag +warning - packages/calendar_builder/lib/src/models/month_data_model.dart:644:7 - Doc directive is missing an opening tag. Try opening the directive with the appropriate opening tag, 'end-tool'. - doc_directive_missing_opening_tag +warning - packages/calendar_builder/lib/src/views/month_builder.dart:81:6 - Doc directive is missing an opening tag. Try opening the directive with the appropriate opening tag, 'end-tool'. - doc_directive_missing_opening_tag +warning - packages/calendar_builder/lib/src/views/month_builder.dart:91:6 - Doc directive is missing an opening tag. Try opening the directive with the appropriate opening tag, 'end-tool'. - doc_directive_missing_opening_tag +warning - packages/calendar_builder/lib/src/views/month_builder.dart:102:6 - Doc directive is missing an opening tag. Try opening the directive with the appropriate opening tag, 'end-tool'. - doc_directive_missing_opening_tag +warning - packages/get/analysis_options.yaml:19:5 - 'include_file_not_found' isn't a recognized lint rule. Try using the name of a recognized lint rule. - undefined_lint +warning - packages/get/example/test/main_test.dart:15:22 - The method doesn't override an inherited method. Try updating this class to match the superclass, or removing the override annotation. - override_on_non_overriding_member +warning - packages/get/example_nav2/lib/app/middleware/auth_middleware.dart:14:56 - The '!' will have no effect because the receiver can't be null. Try removing the '!' operator. - unnecessary_non_null_assertion +warning - packages/get/lib/get_navigation/src/nav2/get_information_parser.dart:29:62 - The left operand can't be null, so the right operand is never executed. Try removing the operator and the right operand. - dead_null_aware_expression +warning - packages/get/lib/get_navigation/src/nav2/get_router_delegate.dart:374:44 - The '!' will have no effect because the receiver can't be null. Try removing the '!' operator. - unnecessary_non_null_assertion +warning - packages/get/lib/get_state_manager/src/simple/get_controllers.dart:103:5 - Missing case clause for 'hidden'. Try adding a case clause for the missing constant, or adding a default clause. - missing_enum_constant_in_switch +warning - packages/get_storage/test/getstorage_test.dart:18:47 - The receiver can't be null, so the null-aware operator '?.' is unnecessary. Try replacing the operator '?.' with '.'. - invalid_null_aware_operator +warning - pubspec.yaml:120:7 - The asset file 'shorebird.yaml' doesn't exist. Try creating the file or fixing the path to the file. - asset_does_not_exist + info - lib/constant/api_key.dart:10:23 - The variable name 'sss_pass' isn't a lowerCamelCase identifier. Try changing the name to follow the lowerCamelCase style. - non_constant_identifier_names + info - lib/constant/api_key.dart:18:23 - The variable name 'sss_encryptionSalt' isn't a lowerCamelCase identifier. Try changing the name to follow the lowerCamelCase style. - non_constant_identifier_names + info - lib/constant/api_key.dart:77:23 - The variable name 'payMobOutClient_id' isn't a lowerCamelCase identifier. Try changing the name to follow the lowerCamelCase style. - non_constant_identifier_names + info - lib/constant/box_name.dart:9:23 - The constant name 'security_check' isn't a lowerCamelCase identifier. Try changing the name to follow the lowerCamelCase style. - constant_identifier_names + info - lib/constant/colors.dart:60:58 - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss. Try replacing the use of the deprecated member with the replacement. - deprecated_member_use + info - lib/constant/colors.dart:65:64 - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss. Try replacing the use of the deprecated member with the replacement. - deprecated_member_use + info - lib/constant/credential.dart:12:3 - Missing type annotation. Try adding a type annotation. - strict_top_level_inference + info - lib/constant/links.dart:200:17 - The variable name 'add_solve_all' isn't a lowerCamelCase identifier. Try changing the name to follow the lowerCamelCase style. - non_constant_identifier_names + info - lib/constant/style.dart:46:41 - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss. Try replacing the use of the deprecated member with the replacement. - deprecated_member_use + info - lib/constant/style.dart:50:41 - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss. Try replacing the use of the deprecated member with the replacement. - deprecated_member_use + info - lib/constant/style.dart:61:31 - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss. Try replacing the use of the deprecated member with the replacement. - deprecated_member_use + info - lib/constant/style.dart:65:40 - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss. Try replacing the use of the deprecated member with the replacement. - deprecated_member_use + info - lib/constant/table_names.dart:18:23 - The constant name 'FCM_PRIVATE_KEY_INTALEQ' isn't a lowerCamelCase identifier. Try changing the name to follow the lowerCamelCase style. - constant_identifier_names + info - lib/controller/auth/apple_signin_controller.dart:35:21 - Empty catch block. Try adding statements to the block, adding a comment to the block, or removing the 'catch' clause. - empty_catches + info - lib/controller/auth/onboarding_controller.dart:10:3 - Missing type annotation. Try adding a type annotation. - strict_top_level_inference + info - lib/controller/auth/onboarding_controller.dart:11:3 - Missing type annotation. Try adding a type annotation. - strict_top_level_inference + info - lib/controller/auth/otp_controller.dart:38:15 - Use interpolation to compose strings and values. Try using string interpolation to build the composite string. - prefer_interpolation_to_compose_strings + info - lib/controller/auth/otp_controller.dart:43:15 - Use interpolation to compose strings and values. Try using string interpolation to build the composite string. - prefer_interpolation_to_compose_strings + info - lib/controller/auth/otp_controller.dart:55:17 - Use interpolation to compose strings and values. Try using string interpolation to build the composite string. - prefer_interpolation_to_compose_strings + info - lib/controller/auth/otp_controller.dart:62:14 - Use interpolation to compose strings and values. Try using string interpolation to build the composite string. - prefer_interpolation_to_compose_strings + info - lib/controller/auth/otp_controller.dart:67:14 - Use interpolation to compose strings and values. Try using string interpolation to build the composite string. - prefer_interpolation_to_compose_strings + info - lib/controller/auth/otp_controller.dart:72:14 - Use interpolation to compose strings and values. Try using string interpolation to build the composite string. - prefer_interpolation_to_compose_strings + info - lib/controller/auth/otp_controller.dart:123:26 - Unnecessary braces in a string interpolation. Try removing the braces. - unnecessary_brace_in_string_interps + info - lib/controller/auth/otp_controller.dart:127:36 - Unnecessary braces in a string interpolation. Try removing the braces. - unnecessary_brace_in_string_interps + info - lib/controller/auth/otp_controller.dart:159:27 - Unnecessary braces in a string interpolation. Try removing the braces. - unnecessary_brace_in_string_interps + info - lib/controller/auth/otp_controller.dart:188:21 - Unnecessary braces in a string interpolation. Try removing the braces. - unnecessary_brace_in_string_interps + info - lib/controller/auth/register_controller.dart:44:8 - Unnecessary override. Try adding behavior in the overriding member or removing the override. - unnecessary_overrides + info - lib/controller/auth/register_controller.dart:59:3 - Missing type annotation. Try adding a type annotation. - strict_top_level_inference + info - lib/controller/auth/register_controller.dart:120:3 - Missing type annotation. Try adding a type annotation. - strict_top_level_inference + info - lib/controller/auth/register_controller.dart:191:20 - Unnecessary braces in a string interpolation. Try removing the braces. - unnecessary_brace_in_string_interps + info - lib/controller/auth/register_controller.dart:268:3 - Missing type annotation. Try adding a type annotation. - strict_top_level_inference + info - lib/controller/auth/register_controller.dart:328:3 - Missing type annotation. Try adding a type annotation. - strict_top_level_inference + info - lib/controller/auth/verify_email_controller.dart:9:8 - Unnecessary override. Try adding behavior in the overriding member or removing the override. - unnecessary_overrides + info - lib/controller/auth/verify_email_controller.dart:13:3 - Missing type annotation. Try adding a type annotation. - strict_top_level_inference + info - lib/controller/firebase/firbase_messge.dart:118:27 - Unnecessary braces in a string interpolation. Try removing the braces. - unnecessary_brace_in_string_interps + info - lib/controller/firebase/live_activity.dart:5:7 - Constructors for public widgets should have a named 'key' parameter. Try adding a named parameter to the constructor. - use_key_in_widget_constructors + info - lib/controller/firebase/live_activity.dart:7:3 - Invalid use of a private type in a public API. Try making the private type public, or making the API that uses the private type also be private. - library_private_types_in_public_api + info - lib/controller/firebase/local_notification.dart:8:8 - The imported package 'timezone' isn't a dependency of the importing package. Try adding a dependency for 'timezone' in the 'pubspec.yaml' file. - depend_on_referenced_packages + info - lib/controller/firebase/local_notification.dart:9:8 - The imported package 'timezone' isn't a dependency of the importing package. Try adding a dependency for 'timezone' in the 'pubspec.yaml' file. - depend_on_referenced_packages + info - lib/controller/functions/add_error.dart:6:1 - Missing type annotation. Try adding a type annotation. - strict_top_level_inference + info - lib/controller/functions/audio_record1.dart:5:8 - The imported package 'path_provider' isn't a dependency of the importing package. Try adding a dependency for 'path_provider' in the 'pubspec.yaml' file. - depend_on_referenced_packages + info - lib/controller/functions/crud.dart:217:9 - Don't invoke 'print' in production code. Try using a logging framework. - avoid_print + info - lib/controller/functions/crud.dart:584:3 - Missing type annotation. Try adding a type annotation. - strict_top_level_inference + info - lib/controller/functions/crud.dart:635:13 - Use interpolation to compose strings and values. Try using string interpolation to build the composite string. - prefer_interpolation_to_compose_strings + info - lib/controller/functions/crud.dart:650:13 - Use interpolation to compose strings and values. Try using string interpolation to build the composite string. - prefer_interpolation_to_compose_strings + info - lib/controller/functions/encrypt_decrypt.dart:69:1 - Missing type annotation. Try adding a type annotation. - strict_top_level_inference + info - lib/controller/functions/encrypt_decrypt.dart:73:1 - Missing type annotation. Try adding a type annotation. - strict_top_level_inference + info - lib/controller/functions/geolocation.dart:32:9 - 'desiredAccuracy' is deprecated and shouldn't be used. use settings parameter with AndroidSettings, AppleSettings, WebSettings, or LocationSettings. Try replacing the use of the deprecated member with the replacement. - deprecated_member_use + info - lib/controller/functions/log_out.dart:36:3 - Missing type annotation. Try adding a type annotation. - strict_top_level_inference + info - lib/controller/functions/log_out.dart:42:3 - Missing type annotation. Try adding a type annotation. - strict_top_level_inference + info - lib/controller/functions/log_out.dart:100:36 - 'MaterialStateProperty' is deprecated and shouldn't be used. Use WidgetStateProperty instead. Moved to the Widgets layer to make code available outside of Material. This feature was deprecated after v3.19.0-0.3.pre. Try replacing the use of the deprecated member with the replacement. - deprecated_member_use + info - lib/controller/functions/log_out.dart:154:36 - 'MaterialStateProperty' is deprecated and shouldn't be used. Use WidgetStateProperty instead. Moved to the Widgets layer to make code available outside of Material. This feature was deprecated after v3.19.0-0.3.pre. Try replacing the use of the deprecated member with the replacement. - deprecated_member_use + info - lib/controller/functions/log_out.dart:188:3 - Missing type annotation. Try adding a type annotation. - strict_top_level_inference + info - lib/controller/functions/network/net_guard.dart:16:22 - The type of the right operand ('ConnectivityResult') isn't a subtype or a supertype of the left operand ('List'). Try changing one or both of the operands. - unrelated_type_equality_checks + info - lib/controller/functions/package_info.dart:11:8 - The imported package 'package_info_plus' isn't a dependency of the importing package. Try adding a dependency for 'package_info_plus' in the 'pubspec.yaml' file. - depend_on_referenced_packages + info - lib/controller/functions/package_info.dart:29:22 - Don't use 'BuildContext's across async gaps. Try rewriting the code to not use the 'BuildContext', or guard the use with a 'mounted' check. - use_build_context_synchronously + info - lib/controller/functions/package_info.dart:33:1 - Missing type annotation. Try adding a type annotation. - strict_top_level_inference + info - lib/controller/functions/package_info.dart:78:32 - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss. Try replacing the use of the deprecated member with the replacement. - deprecated_member_use + info - lib/controller/functions/package_info.dart:319:9 - An uninitialized variable should have an explicit type annotation. Try adding a type annotation. - prefer_typing_uninitialized_variables + info - lib/controller/functions/package_info.dart:325:34 - 'toMap' is deprecated and shouldn't be used. Use [data] getter instead. Try replacing the use of the deprecated member with the replacement. - deprecated_member_use + info - lib/controller/functions/package_info.dart:330:30 - 'toMap' is deprecated and shouldn't be used. Use [data] getter instead. Try replacing the use of the deprecated member with the replacement. - deprecated_member_use + info - lib/controller/functions/secure_storage.dart:53:3 - Missing type annotation. Try adding a type annotation. - strict_top_level_inference + info - lib/controller/functions/secure_storage.dart:82:17 - Empty catch block. Try adding statements to the block, adding a comment to the block, or removing the 'catch' clause. - empty_catches + info - lib/controller/functions/securty_check.dart:24:10 - Missing type annotation. Try adding a type annotation. - strict_top_level_inference + info - lib/controller/functions/securty_check.dart:29:9 - Don't use 'BuildContext's across async gaps. Try rewriting the code to not use the 'BuildContext', or guard the use with a 'mounted' check. - use_build_context_synchronously + info - lib/controller/functions/sms_controller.dart:155:7 - Don't invoke 'print' in production code. Try using a logging framework. - avoid_print + info - lib/controller/functions/sms_controller.dart:165:7 - Don't invoke 'print' in production code. Try using a logging framework. - avoid_print + info - lib/controller/functions/sss.dart:7:10 - Missing type annotation. Try adding a type annotation. - strict_top_level_inference + info - lib/controller/functions/sss.dart:11:10 - Missing type annotation. Try adding a type annotation. - strict_top_level_inference + info - lib/controller/functions/sss.dart:15:10 - Missing type annotation. Try adding a type annotation. - strict_top_level_inference + info - lib/controller/functions/upload_image.dart:23:7 - An uninitialized field should have an explicit type annotation. Try adding a type annotation. - prefer_typing_uninitialized_variables + info - lib/controller/functions/upload_image.dart:23:7 - Missing type annotation. Try replacing 'var' with a type annotation. - strict_top_level_inference + info - lib/controller/functions/upload_image.dart:24:3 - Missing type annotation. Try adding a type annotation. - strict_top_level_inference + info - lib/controller/functions/upload_image.dart:65:3 - Missing type annotation. Try adding a type annotation. - strict_top_level_inference + info - lib/controller/home/device_performance.dart:114:13 - Statements in an if should be enclosed in a block. Try wrapping the statement in a block. - curly_braces_in_flow_control_structures + info - lib/controller/home/device_tier.dart:19:11 - Statements in an if should be enclosed in a block. Try wrapping the statement in a block. - curly_braces_in_flow_control_structures + info - lib/controller/home/device_tier.dart:36:7 - Statements in an if should be enclosed in a block. Try wrapping the statement in a block. - curly_braces_in_flow_control_structures + info - lib/controller/home/device_tier.dart:38:7 - Statements in an if should be enclosed in a block. Try wrapping the statement in a block. - curly_braces_in_flow_control_structures + info - lib/controller/home/device_tier.dart:39:25 - Statements in an if should be enclosed in a block. Try wrapping the statement in a block. - curly_braces_in_flow_control_structures + info - lib/controller/home/device_tier.dart:43:7 - Statements in an if should be enclosed in a block. Try wrapping the statement in a block. - curly_braces_in_flow_control_structures + info - lib/controller/home/device_tier.dart:45:7 - Statements in an if should be enclosed in a block. Try wrapping the statement in a block. - curly_braces_in_flow_control_structures + info - lib/controller/home/device_tier.dart:46:26 - Statements in an if should be enclosed in a block. Try wrapping the statement in a block. - curly_braces_in_flow_control_structures + info - lib/controller/home/device_tier.dart:50:7 - Statements in an if should be enclosed in a block. Try wrapping the statement in a block. - curly_braces_in_flow_control_structures + info - lib/controller/home/device_tier.dart:51:30 - Statements in an if should be enclosed in a block. Try wrapping the statement in a block. - curly_braces_in_flow_control_structures + info - lib/controller/home/device_tier.dart:59:7 - Statements in an if should be enclosed in a block. Try wrapping the statement in a block. - curly_braces_in_flow_control_structures + info - lib/controller/home/device_tier.dart:61:7 - Statements in an if should be enclosed in a block. Try wrapping the statement in a block. - curly_braces_in_flow_control_structures + info - lib/controller/home/device_tier.dart:62:26 - Statements in an if should be enclosed in a block. Try wrapping the statement in a block. - curly_braces_in_flow_control_structures + info - lib/controller/home/map/location_search_controller.dart:269:19 - The local variable '_locationData' starts with an underscore. Try renaming the variable to not start with an underscore. - no_leading_underscores_for_local_identifiers + info - lib/controller/home/map/location_search_controller.dart:798:3 - Missing type annotation. Try adding a type annotation. - strict_top_level_inference + info - lib/controller/home/map/location_search_controller.dart:815:3 - Missing type annotation. Try adding a type annotation. - strict_top_level_inference + info - lib/controller/home/map/map_engine_controller.dart:3:8 - The import of 'dart:typed_data' is unnecessary because all of the used elements are also provided by the import of 'package:flutter/foundation.dart'. Try removing the import directive. - unnecessary_import + info - lib/controller/home/map/map_engine_controller.dart:77:22 - The private field _animationTimers could be 'final'. Try making the field 'final'. - prefer_final_fields + info - lib/controller/home/map/map_engine_controller.dart:182:76 - Unnecessary braces in a string interpolation. Try removing the braces. - unnecessary_brace_in_string_interps + info - lib/controller/home/map/map_engine_controller.dart:685:38 - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss. Try replacing the use of the deprecated member with the replacement. - deprecated_member_use + info - lib/controller/home/map/ride_lifecycle_controller.dart:617:12 - The local variable '_status' starts with an underscore. Try renaming the variable to not start with an underscore. - no_leading_underscores_for_local_identifiers + info - lib/controller/home/map/ride_lifecycle_controller.dart:618:12 - The local variable '_lowerStatus' starts with an underscore. Try renaming the variable to not start with an underscore. - no_leading_underscores_for_local_identifiers + info - lib/controller/home/map/ride_lifecycle_controller.dart:1433:16 - Use 'isNotEmpty' instead of 'length' to test whether the collection is empty. Try rewriting the expression to use 'isNotEmpty'. - prefer_is_empty + info - lib/controller/home/map/ride_lifecycle_controller.dart:1736:3 - Missing type annotation. Try adding a type annotation. - strict_top_level_inference + info - lib/controller/home/map/ride_lifecycle_controller.dart:1746:3 - Missing type annotation. Try adding a type annotation. - strict_top_level_inference + info - lib/controller/home/map/ride_lifecycle_controller.dart:1836:14 - The local variable '_applyDiscountPerTier' starts with an underscore. Try renaming the variable to not start with an underscore. - no_leading_underscores_for_local_identifiers + info - lib/controller/home/map/ride_lifecycle_controller.dart:1894:9 - Don't use 'BuildContext's across async gaps. Try rewriting the code to not use the 'BuildContext', or guard the use with a 'mounted' check. - use_build_context_synchronously + info - lib/controller/home/map/ride_lifecycle_controller.dart:1947:10 - The local variable '_isAirport' starts with an underscore. Try renaming the variable to not start with an underscore. - no_leading_underscores_for_local_identifiers + info - lib/controller/home/map/ride_lifecycle_controller.dart:1954:10 - The local variable '_isClub' starts with an underscore. Try renaming the variable to not start with an underscore. - no_leading_underscores_for_local_identifiers + info - lib/controller/home/map/ride_lifecycle_controller.dart:1963:10 - The local variable '_isInsideDamascusAirportBounds' starts with an underscore. Try renaming the variable to not start with an underscore. - no_leading_underscores_for_local_identifiers + info - lib/controller/home/map/ride_lifecycle_controller.dart:1978:12 - The local variable '_perMinuteByTime' starts with an underscore. Try renaming the variable to not start with an underscore. - no_leading_underscores_for_local_identifiers + info - lib/controller/home/map/ride_lifecycle_controller.dart:1986:12 - The local variable '_applyMinFare' starts with an underscore. Try renaming the variable to not start with an underscore. - no_leading_underscores_for_local_identifiers + info - lib/controller/home/map/ride_lifecycle_controller.dart:1989:12 - The local variable '_withCommission' starts with an underscore. Try renaming the variable to not start with an underscore. - no_leading_underscores_for_local_identifiers + info - lib/controller/home/map/ride_lifecycle_controller.dart:2070:12 - The local variable '_oneWayFare' starts with an underscore. Try renaming the variable to not start with an underscore. - no_leading_underscores_for_local_identifiers + info - lib/controller/home/map/ride_lifecycle_controller.dart:2087:12 - The local variable '_roundTripFare' starts with an underscore. Try renaming the variable to not start with an underscore. - no_leading_underscores_for_local_identifiers + info - lib/controller/home/map/ride_lifecycle_controller.dart:2405:15 - The local variable '_data' starts with an underscore. Try renaming the variable to not start with an underscore. - no_leading_underscores_for_local_identifiers + info - lib/controller/home/map/ride_lifecycle_controller.dart:2762:11 - An uninitialized variable should have an explicit type annotation. Try adding a type annotation. - prefer_typing_uninitialized_variables + info - lib/controller/home/map/ride_lifecycle_controller.dart:2762:22 - An uninitialized variable should have an explicit type annotation. Try adding a type annotation. - prefer_typing_uninitialized_variables + info - lib/controller/home/map/ride_lifecycle_controller.dart:2762:32 - An uninitialized variable should have an explicit type annotation. Try adding a type annotation. - prefer_typing_uninitialized_variables + info - lib/controller/home/map/ride_lifecycle_controller.dart:3489:14 - Function literals shouldn't be passed to 'forEach'. Try using a 'for' loop. - avoid_function_literals_in_foreach_calls + info - lib/controller/home/map/ride_lifecycle_controller.dart:3519:7 - Missing type annotation. Try adding a type annotation. - strict_top_level_inference + info - lib/controller/home/map/ride_lifecycle_controller.dart:3523:7 - Missing type annotation. Try adding a type annotation. - strict_top_level_inference + info - lib/controller/home/map/ride_lifecycle_controller.dart:4321:35 - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss. Try replacing the use of the deprecated member with the replacement. - deprecated_member_use + info - lib/controller/home/map/ride_lifecycle_controller.dart:4325:39 - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss. Try replacing the use of the deprecated member with the replacement. - deprecated_member_use + info - lib/controller/home/map/ui_interactions_controller.dart:3:8 - The import of 'dart:ui' is unnecessary because all of the used elements are also provided by the import of 'package:flutter/material.dart'. Try removing the import directive. - unnecessary_import + info - lib/controller/home/map/ui_interactions_controller.dart:5:8 - The import of 'package:flutter/cupertino.dart' is unnecessary because all of the used elements are also provided by the import of 'package:flutter/material.dart'. Try removing the import directive. - unnecessary_import + info - lib/controller/home/map/ui_interactions_controller.dart:180:14 - Use interpolation to compose strings and values. Try using string interpolation to build the composite string. - prefer_interpolation_to_compose_strings + info - lib/controller/home/map/ui_interactions_controller.dart:183:14 - Use interpolation to compose strings and values. Try using string interpolation to build the composite string. - prefer_interpolation_to_compose_strings + info - lib/controller/home/payment/captain_wallet_controller.dart:21:3 - Missing type annotation. Try adding a type annotation. - strict_top_level_inference + info - lib/controller/home/payment/credit_card_Controller.dart:1:1 - The file name 'credit_card_Controller.dart' isn't a lower_case_with_underscores identifier. Try changing the name to follow the lower_case_with_underscores style. - file_names + info - lib/controller/home/payment/credit_card_Controller.dart:15:3 - Missing type annotation. Try adding a type annotation. - strict_top_level_inference + info - lib/controller/home/points_for_rider_controller.dart:129:7 - Constructors for public widgets should have a named 'key' parameter. Try adding a named parameter to the constructor. - use_key_in_widget_constructors + info - lib/controller/home/profile/complaint_controller.dart:51:31 - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss. Try replacing the use of the deprecated member with the replacement. - deprecated_member_use + info - lib/controller/home/profile/complaint_controller.dart:52:51 - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss. Try replacing the use of the deprecated member with the replacement. - deprecated_member_use + info - lib/controller/home/profile/complaint_controller.dart:65:3 - Missing type annotation. Try adding a type annotation. - strict_top_level_inference + info - lib/controller/home/profile/invit_controller.dart:35:8 - Unnecessary override. Try adding behavior in the overriding member or removing the override. - unnecessary_overrides + info - lib/controller/home/profile/invit_controller.dart:56:13 - 'Share' is deprecated and shouldn't be used. Use SharePlus instead. Try replacing the use of the deprecated member with the replacement. - deprecated_member_use + info - lib/controller/home/profile/invit_controller.dart:56:19 - 'share' is deprecated and shouldn't be used. Use SharePlus.instance.share() instead. Try replacing the use of the deprecated member with the replacement. - deprecated_member_use + info - lib/controller/home/profile/invit_controller.dart:67:13 - 'Share' is deprecated and shouldn't be used. Use SharePlus instead. Try replacing the use of the deprecated member with the replacement. - deprecated_member_use + info - lib/controller/home/profile/invit_controller.dart:67:19 - 'share' is deprecated and shouldn't be used. Use SharePlus.instance.share() instead. Try replacing the use of the deprecated member with the replacement. - deprecated_member_use + info - lib/controller/home/profile/invit_controller.dart:196:14 - Unnecessary use of string interpolation. Try replacing the string literal with the variable name. - unnecessary_string_interpolations + info - lib/controller/home/profile/invit_controller.dart:274:3 - Missing type annotation. Try adding a type annotation. - strict_top_level_inference + info - lib/controller/home/profile/invit_controller.dart:330:11 - Unnecessary use of string interpolation. Try replacing the string literal with the variable name. - unnecessary_string_interpolations + info - lib/controller/home/splash_screen_controlle.dart:7:8 - The imported package 'package_info_plus' isn't a dependency of the importing package. Try adding a dependency for 'package_info_plus' in the 'pubspec.yaml' file. - depend_on_referenced_packages + info - lib/controller/home/trip_monitor_controller.dart:29:3 - Missing type annotation. Try adding a type annotation. - strict_top_level_inference + info - lib/controller/home/trip_monitor_controller.dart:97:8 - Unnecessary override. Try adding behavior in the overriding member or removing the override. - unnecessary_overrides + info - lib/controller/local/phone_intel/country_picker_dialog.dart:51:9 - Parameter 'key' could be a super parameter. Trying converting 'key' to a super parameter. - use_super_parameters + info - lib/controller/local/phone_intel/intl_phone_field.dart:1:9 - Library names are not necessary. Remove the library name. - unnecessary_library_name + info - lib/controller/local/phone_intel/intl_phone_field.dart:253:9 - Parameter 'key' could be a super parameter. Trying converting 'key' to a super parameter. - use_super_parameters + info - lib/controller/local/translations.dart:33:38 - Unnecessary escape in string literal. Remove the '\' escape. - unnecessary_string_escapes + info - lib/controller/local/translations.dart:98:20 - Unnecessary escape in string literal. Remove the '\' escape. - unnecessary_string_escapes + info - lib/controller/local/translations.dart:7314:38 - Unnecessary escape in string literal. Remove the '\' escape. - unnecessary_string_escapes + info - lib/controller/local/translations.dart:7315:42 - Unnecessary escape in string literal. Remove the '\' escape. - unnecessary_string_escapes + info - lib/controller/local/translations.dart:7376:20 - Unnecessary escape in string literal. Remove the '\' escape. - unnecessary_string_escapes + info - lib/controller/local/translations.dart:7377:24 - Unnecessary escape in string literal. Remove the '\' escape. - unnecessary_string_escapes + info - lib/controller/local/translations.dart:8842:38 - Unnecessary escape in string literal. Remove the '\' escape. - unnecessary_string_escapes + info - lib/controller/local/translations.dart:8843:42 - Unnecessary escape in string literal. Remove the '\' escape. - unnecessary_string_escapes + info - lib/controller/local/translations.dart:8904:20 - Unnecessary escape in string literal. Remove the '\' escape. - unnecessary_string_escapes + info - lib/controller/local/translations.dart:8905:24 - Unnecessary escape in string literal. Remove the '\' escape. - unnecessary_string_escapes + info - lib/controller/local/translations.dart:10412:38 - Unnecessary escape in string literal. Remove the '\' escape. - unnecessary_string_escapes + info - lib/controller/local/translations.dart:10413:42 - Unnecessary escape in string literal. Remove the '\' escape. - unnecessary_string_escapes + info - lib/controller/local/translations.dart:10474:20 - Unnecessary escape in string literal. Remove the '\' escape. - unnecessary_string_escapes + info - lib/controller/local/translations.dart:10475:24 - Unnecessary escape in string literal. Remove the '\' escape. - unnecessary_string_escapes + info - lib/controller/local/translations.dart:12161:38 - Unnecessary escape in string literal. Remove the '\' escape. - unnecessary_string_escapes + info - lib/controller/local/translations.dart:12162:42 - Unnecessary escape in string literal. Remove the '\' escape. - unnecessary_string_escapes + info - lib/controller/local/translations.dart:12223:20 - Unnecessary escape in string literal. Remove the '\' escape. - unnecessary_string_escapes + info - lib/controller/local/translations.dart:12224:24 - Unnecessary escape in string literal. Remove the '\' escape. - unnecessary_string_escapes + info - lib/controller/local/translations.dart:13903:38 - Unnecessary escape in string literal. Remove the '\' escape. - unnecessary_string_escapes + info - lib/controller/local/translations.dart:13904:42 - Unnecessary escape in string literal. Remove the '\' escape. - unnecessary_string_escapes + info - lib/controller/local/translations.dart:13965:20 - Unnecessary escape in string literal. Remove the '\' escape. - unnecessary_string_escapes + info - lib/controller/local/translations.dart:13966:24 - Unnecessary escape in string literal. Remove the '\' escape. - unnecessary_string_escapes + info - lib/controller/local/translations.dart:15409:38 - Unnecessary escape in string literal. Remove the '\' escape. - unnecessary_string_escapes + info - lib/controller/local/translations.dart:15410:42 - Unnecessary escape in string literal. Remove the '\' escape. - unnecessary_string_escapes + info - lib/controller/local/translations.dart:15471:20 - Unnecessary escape in string literal. Remove the '\' escape. - unnecessary_string_escapes + info - lib/controller/local/translations.dart:15472:24 - Unnecessary escape in string literal. Remove the '\' escape. - unnecessary_string_escapes + info - lib/controller/local/translations.dart:16901:38 - Unnecessary escape in string literal. Remove the '\' escape. - unnecessary_string_escapes + info - lib/controller/local/translations.dart:16902:42 - Unnecessary escape in string literal. Remove the '\' escape. - unnecessary_string_escapes + info - lib/controller/local/translations.dart:16963:20 - Unnecessary escape in string literal. Remove the '\' escape. - unnecessary_string_escapes + info - lib/controller/local/translations.dart:16964:24 - Unnecessary escape in string literal. Remove the '\' escape. - unnecessary_string_escapes + info - lib/controller/local/translations.dart:18462:38 - Unnecessary escape in string literal. Remove the '\' escape. - unnecessary_string_escapes + info - lib/controller/local/translations.dart:18463:42 - Unnecessary escape in string literal. Remove the '\' escape. - unnecessary_string_escapes + info - lib/controller/local/translations.dart:18524:20 - Unnecessary escape in string literal. Remove the '\' escape. - unnecessary_string_escapes + info - lib/controller/local/translations.dart:18525:24 - Unnecessary escape in string literal. Remove the '\' escape. - unnecessary_string_escapes + info - lib/controller/local/translations.dart:20022:38 - Unnecessary escape in string literal. Remove the '\' escape. - unnecessary_string_escapes + info - lib/controller/local/translations.dart:20023:42 - Unnecessary escape in string literal. Remove the '\' escape. - unnecessary_string_escapes + info - lib/controller/local/translations.dart:20084:20 - Unnecessary escape in string literal. Remove the '\' escape. - unnecessary_string_escapes + info - lib/controller/local/translations.dart:20085:24 - Unnecessary escape in string literal. Remove the '\' escape. - unnecessary_string_escapes + info - lib/controller/local/translations.dart:21486:38 - Unnecessary escape in string literal. Remove the '\' escape. - unnecessary_string_escapes + info - lib/controller/local/translations.dart:21487:42 - Unnecessary escape in string literal. Remove the '\' escape. - unnecessary_string_escapes + info - lib/controller/local/translations.dart:21548:20 - Unnecessary escape in string literal. Remove the '\' escape. - unnecessary_string_escapes + info - lib/controller/local/translations.dart:21549:24 - Unnecessary escape in string literal. Remove the '\' escape. - unnecessary_string_escapes + info - lib/controller/local/translations.dart:22985:38 - Unnecessary escape in string literal. Remove the '\' escape. - unnecessary_string_escapes + info - lib/controller/local/translations.dart:22986:42 - Unnecessary escape in string literal. Remove the '\' escape. - unnecessary_string_escapes + info - lib/controller/local/translations.dart:23047:20 - Unnecessary escape in string literal. Remove the '\' escape. - unnecessary_string_escapes + info - lib/controller/local/translations.dart:23048:24 - Unnecessary escape in string literal. Remove the '\' escape. - unnecessary_string_escapes + info - lib/controller/notification/notification_captain_controller.dart:16:3 - Missing type annotation. Try adding a type annotation. - strict_top_level_inference + info - lib/controller/notification/notification_captain_controller.dart:41:3 - Missing type annotation. Try adding a type annotation. - strict_top_level_inference + info - lib/controller/notification/notification_captain_controller.dart:48:3 - Missing type annotation. Try adding a type annotation. - strict_top_level_inference + info - lib/controller/notification/passenger_notification_controller.dart:17:3 - Missing type annotation. Try adding a type annotation. - strict_top_level_inference + info - lib/controller/notification/passenger_notification_controller.dart:50:3 - Missing type annotation. Try adding a type annotation. - strict_top_level_inference + info - lib/controller/notification/passenger_notification_controller.dart:59:3 - Missing type annotation. Try adding a type annotation. - strict_top_level_inference + info - lib/controller/notification/ride_available_controller.dart:13:3 - Missing type annotation. Try adding a type annotation. - strict_top_level_inference + info - lib/controller/payment/driver_payment_controller.dart:14:3 - Missing type annotation. Try adding a type annotation. - strict_top_level_inference + info - lib/controller/payment/payment_controller.dart:55:3 - Missing type annotation. Try adding a type annotation. - strict_top_level_inference + info - lib/controller/payment/payment_controller.dart:109:3 - Missing type annotation. Try adding a type annotation. - strict_top_level_inference + info - lib/controller/payment/payment_controller.dart:169:3 - Missing type annotation. Try adding a type annotation. - strict_top_level_inference + info - lib/controller/payment/payment_controller.dart:267:15 - Don't use 'BuildContext's across async gaps. Try rewriting the code to not use the 'BuildContext', or guard the use with a 'mounted' check. - use_build_context_synchronously + info - lib/controller/payment/payment_controller.dart:517:18 - The local variable '_showLoading' starts with an underscore. Try renaming the variable to not start with an underscore. - no_leading_underscores_for_local_identifiers + info - lib/controller/payment/payment_controller.dart:525:10 - The local variable '_closeAnyDialog' starts with an underscore. Try renaming the variable to not start with an underscore. - no_leading_underscores_for_local_identifiers + info - lib/controller/payment/payment_controller.dart:679:9 - Parameter 'key' could be a super parameter. Trying converting 'key' to a super parameter. - use_super_parameters + info - lib/controller/payment/paymob.dart:77:10 - 'DioError' is deprecated and shouldn't be used. Use DioException instead. This will be removed in 6.0.0. Try replacing the use of the deprecated member with the replacement. - deprecated_member_use + info - lib/controller/payment/paymob.dart:100:23 - Unnecessary braces in a string interpolation. Try removing the braces. - unnecessary_brace_in_string_interps + info - lib/controller/payment/paymob.dart:117:20 - Unnecessary braces in a string interpolation. Try removing the braces. - unnecessary_brace_in_string_interps + info - lib/controller/payment/paymob.dart:155:23 - Unnecessary braces in a string interpolation. Try removing the braces. - unnecessary_brace_in_string_interps + info - lib/controller/payment/paymob/e_cash_screen.dart:10:9 - Parameter 'key' could be a super parameter. Trying converting 'key' to a super parameter. - use_super_parameters + info - lib/controller/payment/paymob/paymob_response.dart:253:9 - Parameter 'key' could be a super parameter. Trying converting 'key' to a super parameter. - use_super_parameters + info - lib/controller/payment/paymob/paymob_response.dart:339:9 - Parameter 'key' could be a super parameter. Trying converting 'key' to a super parameter. - use_super_parameters + info - lib/controller/payment/paymob/paymob_response.dart:355:43 - Unnecessary braces in a string interpolation. Try removing the braces. - unnecessary_brace_in_string_interps + info - lib/controller/payment/paymob/paymob_wallet.dart:169:10 - 'DioError' is deprecated and shouldn't be used. Use DioException instead. This will be removed in 6.0.0. Try replacing the use of the deprecated member with the replacement. - deprecated_member_use + info - lib/controller/payment/paymob/paymob_wallet.dart:223:27 - Unnecessary braces in a string interpolation. Try removing the braces. - unnecessary_brace_in_string_interps + info - lib/controller/payment/paymob/paymob_wallet.dart:291:9 - Parameter 'key' could be a super parameter. Trying converting 'key' to a super parameter. - use_super_parameters + info - lib/controller/profile/profile_controller.dart:5:8 - The import of 'package:flutter/material.dart' is unnecessary because all of the used elements are also provided by the import of 'package:flutter/cupertino.dart'. Try removing the import directive. - unnecessary_import + info - lib/controller/profile/profile_controller.dart:40:3 - Missing type annotation. Try adding a type annotation. - strict_top_level_inference + info - lib/controller/profile/profile_controller.dart:49:3 - Missing type annotation. Try adding a type annotation. - strict_top_level_inference + info - lib/controller/profile/profile_controller.dart:89:3 - Missing type annotation. Try adding a type annotation. - strict_top_level_inference + info - lib/controller/rate/rate_conroller.dart:39:3 - Missing type annotation. Try adding a type annotation. - strict_top_level_inference + info - lib/controller/themes/themes.dart:24:5 - 'color' is deprecated and shouldn't be used. Use backgroundColor instead. This feature was deprecated after v3.33.0-0.2.pre. Try replacing the use of the deprecated member with the replacement. - deprecated_member_use + info - lib/controller/themes/themes.dart:63:5 - 'color' is deprecated and shouldn't be used. Use backgroundColor instead. This feature was deprecated after v3.33.0-0.2.pre. Try replacing the use of the deprecated member with the replacement. - deprecated_member_use + info - lib/controller/themes/themes.dart:94:5 - 'color' is deprecated and shouldn't be used. Use backgroundColor instead. This feature was deprecated after v3.33.0-0.2.pre. Try replacing the use of the deprecated member with the replacement. - deprecated_member_use + info - lib/controller/themes/themes.dart:133:5 - 'color' is deprecated and shouldn't be used. Use backgroundColor instead. This feature was deprecated after v3.33.0-0.2.pre. Try replacing the use of the deprecated member with the replacement. - deprecated_member_use + info - lib/env/env.dart:18:23 - The variable name 'sss_encryptionSalt' isn't a lowerCamelCase identifier. Try changing the name to follow the lowerCamelCase style. - non_constant_identifier_names + info - lib/env/env.dart:21:23 - The variable name 'sss_pass' isn't a lowerCamelCase identifier. Try changing the name to follow the lowerCamelCase style. - non_constant_identifier_names + info - lib/env/env.dart:181:23 - The variable name 'payMobOutClient_id' isn't a lowerCamelCase identifier. Try changing the name to follow the lowerCamelCase style. - non_constant_identifier_names + info - lib/models/model/painter_copoun.dart:60:32 - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss. Try replacing the use of the deprecated member with the replacement. - deprecated_member_use + info - lib/models/model/painter_copoun.dart:85:9 - Parameter 'key' could be a super parameter. Trying converting 'key' to a super parameter. - use_super_parameters + info - lib/models/model/painter_copoun.dart:135:41 - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss. Try replacing the use of the deprecated member with the replacement. - deprecated_member_use + info - lib/onbording_page.dart:37:9 - Parameter 'key' could be a super parameter. Trying converting 'key' to a super parameter. - use_super_parameters + info - lib/onbording_page.dart:82:9 - Parameter 'key' could be a super parameter. Trying converting 'key' to a super parameter. - use_super_parameters + info - lib/services/emergency_signal_service.dart:30:34 - 'accelerometerEvents' is deprecated and shouldn't be used. Use accelerometerEventStream() instead. Try replacing the use of the deprecated member with the replacement. - deprecated_member_use + info - lib/splash_screen_page.dart:47:45 - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss. Try replacing the use of the deprecated member with the replacement. - deprecated_member_use + info - lib/splash_screen_page.dart:64:45 - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss. Try replacing the use of the deprecated member with the replacement. - deprecated_member_use + info - lib/splash_screen_page.dart:135:44 - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss. Try replacing the use of the deprecated member with the replacement. - deprecated_member_use + info - lib/splash_screen_page.dart:155:44 - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss. Try replacing the use of the deprecated member with the replacement. - deprecated_member_use + info - lib/splash_screen_page.dart:205:61 - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss. Try replacing the use of the deprecated member with the replacement. - deprecated_member_use + info - lib/splash_screen_page.dart:209:62 - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss. Try replacing the use of the deprecated member with the replacement. - deprecated_member_use + info - lib/splash_screen_page.dart:223:44 - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss. Try replacing the use of the deprecated member with the replacement. - deprecated_member_use + info - lib/splash_screen_page.dart:229:48 - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss. Try replacing the use of the deprecated member with the replacement. - deprecated_member_use + info - lib/splash_screen_page.dart:246:42 - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss. Try replacing the use of the deprecated member with the replacement. - deprecated_member_use + info - lib/splash_screen_page.dart:297:51 - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss. Try replacing the use of the deprecated member with the replacement. - deprecated_member_use + info - lib/splash_screen_page.dart:306:51 - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss. Try replacing the use of the deprecated member with the replacement. - deprecated_member_use + info - lib/splash_screen_page.dart:337:33 - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss. Try replacing the use of the deprecated member with the replacement. - deprecated_member_use + info - lib/splash_screen_page.dart:354:50 - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss. Try replacing the use of the deprecated member with the replacement. - deprecated_member_use + info - lib/splash_screen_page.dart:372:41 - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss. Try replacing the use of the deprecated member with the replacement. - deprecated_member_use + info - lib/splash_screen_page.dart:386:41 - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss. Try replacing the use of the deprecated member with the replacement. - deprecated_member_use + info - lib/splash_screen_page.dart:423:43 - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss. Try replacing the use of the deprecated member with the replacement. - deprecated_member_use + info - lib/splash_screen_page.dart:445:43 - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss. Try replacing the use of the deprecated member with the replacement. - deprecated_member_use + info - lib/splash_screen_page.dart:456:26 - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss. Try replacing the use of the deprecated member with the replacement. - deprecated_member_use + info - lib/views/Rate/rating_driver_bottom.dart:135:67 - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss. Try replacing the use of the deprecated member with the replacement. - deprecated_member_use + info - lib/views/auth/login_page.dart:78:41 - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss. Try replacing the use of the deprecated member with the replacement. - deprecated_member_use + info - lib/views/auth/login_page.dart:79:41 - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss. Try replacing the use of the deprecated member with the replacement. - deprecated_member_use + info - lib/views/auth/login_page.dart:96:41 - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss. Try replacing the use of the deprecated member with the replacement. - deprecated_member_use + info - lib/views/auth/login_page.dart:97:41 - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss. Try replacing the use of the deprecated member with the replacement. - deprecated_member_use + info - lib/views/auth/login_page.dart:118:28 - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss. Try replacing the use of the deprecated member with the replacement. - deprecated_member_use + info - lib/views/auth/login_page.dart:119:28 - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss. Try replacing the use of the deprecated member with the replacement. - deprecated_member_use + info - lib/views/auth/login_page.dart:122:30 - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss. Try replacing the use of the deprecated member with the replacement. - deprecated_member_use + info - lib/views/auth/login_page.dart:123:30 - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss. Try replacing the use of the deprecated member with the replacement. - deprecated_member_use + info - lib/views/auth/login_page.dart:129:32 - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss. Try replacing the use of the deprecated member with the replacement. - deprecated_member_use + info - lib/views/auth/login_page.dart:130:32 - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss. Try replacing the use of the deprecated member with the replacement. - deprecated_member_use + info - lib/views/auth/login_page.dart:153:35 - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss. Try replacing the use of the deprecated member with the replacement. - deprecated_member_use + info - lib/views/auth/login_page.dart:158:42 - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss. Try replacing the use of the deprecated member with the replacement. - deprecated_member_use + info - lib/views/auth/login_page.dart:176:34 - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss. Try replacing the use of the deprecated member with the replacement. - deprecated_member_use + info - lib/views/auth/login_page.dart:177:34 - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss. Try replacing the use of the deprecated member with the replacement. - deprecated_member_use + info - lib/views/auth/login_page.dart:472:54 - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss. Try replacing the use of the deprecated member with the replacement. - deprecated_member_use + info - lib/views/auth/login_page.dart:474:56 - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss. Try replacing the use of the deprecated member with the replacement. - deprecated_member_use + info - lib/views/auth/login_page.dart:485:54 - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss. Try replacing the use of the deprecated member with the replacement. - deprecated_member_use + info - lib/views/auth/login_page.dart:487:56 - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss. Try replacing the use of the deprecated member with the replacement. - deprecated_member_use + info - lib/views/auth/login_page.dart:569:40 - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss. Try replacing the use of the deprecated member with the replacement. - deprecated_member_use + info - lib/views/auth/login_page.dart:571:31 - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss. Try replacing the use of the deprecated member with the replacement. - deprecated_member_use + info - lib/views/auth/login_page.dart:637:43 - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss. Try replacing the use of the deprecated member with the replacement. - deprecated_member_use + info - lib/views/auth/login_page.dart:647:50 - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss. Try replacing the use of the deprecated member with the replacement. - deprecated_member_use + info - lib/views/auth/login_page.dart:685:28 - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss. Try replacing the use of the deprecated member with the replacement. - deprecated_member_use + info - lib/views/auth/login_page.dart:686:28 - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss. Try replacing the use of the deprecated member with the replacement. - deprecated_member_use + info - lib/views/auth/login_page.dart:689:30 - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss. Try replacing the use of the deprecated member with the replacement. - deprecated_member_use + info - lib/views/auth/login_page.dart:690:30 - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss. Try replacing the use of the deprecated member with the replacement. - deprecated_member_use + info - lib/views/auth/otp_page.dart:26:34 - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss. Try replacing the use of the deprecated member with the replacement. - deprecated_member_use + info - lib/views/auth/otp_page.dart:68:43 - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss. Try replacing the use of the deprecated member with the replacement. - deprecated_member_use + info - lib/views/auth/otp_page.dart:69:32 - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss. Try replacing the use of the deprecated member with the replacement. - deprecated_member_use + info - lib/views/auth/otp_page.dart:80:50 - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss. Try replacing the use of the deprecated member with the replacement. - deprecated_member_use + info - lib/views/auth/otp_page.dart:215:43 - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss. Try replacing the use of the deprecated member with the replacement. - deprecated_member_use + info - lib/views/auth/otp_page.dart:216:43 - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss. Try replacing the use of the deprecated member with the replacement. - deprecated_member_use + info - lib/views/auth/otp_page.dart:234:43 - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss. Try replacing the use of the deprecated member with the replacement. - deprecated_member_use + info - lib/views/auth/otp_page.dart:235:43 - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss. Try replacing the use of the deprecated member with the replacement. - deprecated_member_use + info - lib/views/auth/otp_page.dart:261:46 - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss. Try replacing the use of the deprecated member with the replacement. - deprecated_member_use + info - lib/views/auth/otp_page.dart:262:46 - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss. Try replacing the use of the deprecated member with the replacement. - deprecated_member_use + info - lib/views/auth/otp_page.dart:265:48 - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss. Try replacing the use of the deprecated member with the replacement. - deprecated_member_use + info - lib/views/auth/otp_page.dart:266:57 - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss. Try replacing the use of the deprecated member with the replacement. - deprecated_member_use + info - lib/views/auth/otp_page.dart:271:60 - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss. Try replacing the use of the deprecated member with the replacement. - deprecated_member_use + info - lib/views/auth/otp_page.dart:322:48 - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss. Try replacing the use of the deprecated member with the replacement. - deprecated_member_use + info - lib/views/auth/otp_page.dart:323:48 - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss. Try replacing the use of the deprecated member with the replacement. - deprecated_member_use + info - lib/views/auth/otp_page.dart:327:50 - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss. Try replacing the use of the deprecated member with the replacement. - deprecated_member_use + info - lib/views/auth/otp_page.dart:328:50 - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss. Try replacing the use of the deprecated member with the replacement. - deprecated_member_use + info - lib/views/auth/otp_page.dart:334:52 - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss. Try replacing the use of the deprecated member with the replacement. - deprecated_member_use + info - lib/views/auth/otp_page.dart:335:52 - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss. Try replacing the use of the deprecated member with the replacement. - deprecated_member_use + info - lib/views/auth/otp_page.dart:438:50 - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss. Try replacing the use of the deprecated member with the replacement. - deprecated_member_use + info - lib/views/auth/otp_page.dart:472:43 - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss. Try replacing the use of the deprecated member with the replacement. - deprecated_member_use + info - lib/views/auth/otp_page.dart:563:48 - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss. Try replacing the use of the deprecated member with the replacement. - deprecated_member_use + info - lib/views/auth/otp_page.dart:586:46 - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss. Try replacing the use of the deprecated member with the replacement. - deprecated_member_use + info - lib/views/auth/otp_page.dart:590:38 - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss. Try replacing the use of the deprecated member with the replacement. - deprecated_member_use + info - lib/views/auth/otp_page.dart:734:50 - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss. Try replacing the use of the deprecated member with the replacement. - deprecated_member_use + info - lib/views/auth/otp_page.dart:843:42 - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss. Try replacing the use of the deprecated member with the replacement. - deprecated_member_use + info - lib/views/auth/otp_page.dart:882:37 - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss. Try replacing the use of the deprecated member with the replacement. - deprecated_member_use + info - lib/views/auth/otp_page.dart:887:44 - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss. Try replacing the use of the deprecated member with the replacement. - deprecated_member_use + info - lib/views/auth/sms_verfy_page.dart:15:3 - Constructors in '@immutable' classes should be declared as 'const'. Try adding 'const' to the constructor declaration. - prefer_const_constructors_in_immutables + info - lib/views/home/HomePage/contact_us.dart:13:3 - Constructors in '@immutable' classes should be declared as 'const'. Try adding 'const' to the constructor declaration. - prefer_const_constructors_in_immutables + info - lib/views/home/HomePage/contact_us.dart:81:38 - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss. Try replacing the use of the deprecated member with the replacement. - deprecated_member_use + info - lib/views/home/HomePage/contact_us.dart:84:57 - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss. Try replacing the use of the deprecated member with the replacement. - deprecated_member_use + info - lib/views/home/HomePage/contact_us.dart:88:59 - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss. Try replacing the use of the deprecated member with the replacement. - deprecated_member_use + info - lib/views/home/HomePage/contact_us.dart:101:63 - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss. Try replacing the use of the deprecated member with the replacement. - deprecated_member_use + info - lib/views/home/HomePage/contact_us.dart:135:63 - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss. Try replacing the use of the deprecated member with the replacement. - deprecated_member_use + info - lib/views/home/HomePage/contact_us.dart:138:65 - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss. Try replacing the use of the deprecated member with the replacement. - deprecated_member_use + info - lib/views/home/HomePage/contact_us.dart:221:38 - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss. Try replacing the use of the deprecated member with the replacement. - deprecated_member_use + info - lib/views/home/HomePage/contact_us.dart:221:71 - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss. Try replacing the use of the deprecated member with the replacement. - deprecated_member_use + info - lib/views/home/HomePage/contact_us.dart:298:40 - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss. Try replacing the use of the deprecated member with the replacement. - deprecated_member_use + info - lib/views/home/HomePage/contact_us.dart:299:40 - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss. Try replacing the use of the deprecated member with the replacement. - deprecated_member_use + info - lib/views/home/HomePage/contact_us.dart:299:72 - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss. Try replacing the use of the deprecated member with the replacement. - deprecated_member_use + info - lib/views/home/HomePage/contact_us.dart:303:59 - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss. Try replacing the use of the deprecated member with the replacement. - deprecated_member_use + info - lib/views/home/HomePage/contact_us.dart:308:63 - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss. Try replacing the use of the deprecated member with the replacement. - deprecated_member_use + info - lib/views/home/HomePage/contact_us.dart:319:58 - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss. Try replacing the use of the deprecated member with the replacement. - deprecated_member_use + info - lib/views/home/HomePage/frequentlyQuestionsPage.dart:1:1 - The file name 'frequentlyQuestionsPage.dart' isn't a lower_case_with_underscores identifier. Try changing the name to follow the lower_case_with_underscores style. - file_names + info - lib/views/home/HomePage/share_app_page.dart:10:7 - Constructors for public widgets should have a named 'key' parameter. Try adding a named parameter to the constructor. - use_key_in_widget_constructors + info - lib/views/home/HomePage/share_app_page.dart:55:39 - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss. Try replacing the use of the deprecated member with the replacement. - deprecated_member_use + info - lib/views/home/HomePage/share_app_page.dart:120:35 - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss. Try replacing the use of the deprecated member with the replacement. - deprecated_member_use + info - lib/views/home/HomePage/share_app_page.dart:122:54 - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss. Try replacing the use of the deprecated member with the replacement. - deprecated_member_use + info - lib/views/home/HomePage/share_app_page.dart:131:45 - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss. Try replacing the use of the deprecated member with the replacement. - deprecated_member_use + info - lib/views/home/HomePage/share_app_page.dart:170:41 - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss. Try replacing the use of the deprecated member with the replacement. - deprecated_member_use + info - lib/views/home/HomePage/share_app_page.dart:199:41 - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss. Try replacing the use of the deprecated member with the replacement. - deprecated_member_use + info - lib/views/home/HomePage/share_app_page.dart:266:37 - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss. Try replacing the use of the deprecated member with the replacement. - deprecated_member_use + info - lib/views/home/HomePage/share_app_page.dart:268:56 - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss. Try replacing the use of the deprecated member with the replacement. - deprecated_member_use + info - lib/views/home/HomePage/share_app_page.dart:287:53 - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss. Try replacing the use of the deprecated member with the replacement. - deprecated_member_use + info - lib/views/home/HomePage/share_app_page.dart:311:35 - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss. Try replacing the use of the deprecated member with the replacement. - deprecated_member_use + info - lib/views/home/HomePage/share_app_page.dart:313:54 - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss. Try replacing the use of the deprecated member with the replacement. - deprecated_member_use + info - lib/views/home/HomePage/share_app_page.dart:424:55 - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss. Try replacing the use of the deprecated member with the replacement. - deprecated_member_use + info - lib/views/home/HomePage/share_app_page.dart:456:55 - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss. Try replacing the use of the deprecated member with the replacement. - deprecated_member_use + info - lib/views/home/HomePage/trip_record_page.dart:124:52 - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss. Try replacing the use of the deprecated member with the replacement. - deprecated_member_use + info - lib/views/home/HomePage/trip_record_page.dart:189:21 - 'Share' is deprecated and shouldn't be used. Use SharePlus instead. Try replacing the use of the deprecated member with the replacement. - deprecated_member_use + info - lib/views/home/HomePage/trip_record_page.dart:189:27 - 'shareXFiles' is deprecated and shouldn't be used. Use SharePlus.instance.share() instead. Try replacing the use of the deprecated member with the replacement. - deprecated_member_use + info - lib/views/home/HomePage/trip_record_page.dart:255:30 - Don't use 'BuildContext's across async gaps. Try rewriting the code to not use the 'BuildContext', or guard the use with a 'mounted' check. - use_build_context_synchronously + info - lib/views/home/drawer_menu_page.dart:11:38 - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss. Try replacing the use of the deprecated member with the replacement. - deprecated_member_use + info - lib/views/home/map_widget.dart/apply_order_widget.dart:56:37 - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss. Try replacing the use of the deprecated member with the replacement. - deprecated_member_use + info - lib/views/home/map_widget.dart/apply_order_widget.dart:74:42 - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss. Try replacing the use of the deprecated member with the replacement. - deprecated_member_use + info - lib/views/home/map_widget.dart/apply_order_widget.dart:162:52 - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss. Try replacing the use of the deprecated member with the replacement. - deprecated_member_use + info - lib/views/home/map_widget.dart/apply_order_widget.dart:169:44 - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss. Try replacing the use of the deprecated member with the replacement. - deprecated_member_use + info - lib/views/home/map_widget.dart/apply_order_widget.dart:245:47 - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss. Try replacing the use of the deprecated member with the replacement. - deprecated_member_use + info - lib/views/home/map_widget.dart/apply_order_widget.dart:257:52 - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss. Try replacing the use of the deprecated member with the replacement. - deprecated_member_use + info - lib/views/home/map_widget.dart/apply_order_widget.dart:327:25 - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss. Try replacing the use of the deprecated member with the replacement. - deprecated_member_use + info - lib/views/home/map_widget.dart/apply_order_widget.dart:353:63 - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss. Try replacing the use of the deprecated member with the replacement. - deprecated_member_use + info - lib/views/home/map_widget.dart/apply_order_widget.dart:372:46 - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss. Try replacing the use of the deprecated member with the replacement. - deprecated_member_use + info - lib/views/home/map_widget.dart/apply_order_widget.dart:392:43 - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss. Try replacing the use of the deprecated member with the replacement. - deprecated_member_use + info - lib/views/home/map_widget.dart/apply_order_widget.dart:439:56 - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss. Try replacing the use of the deprecated member with the replacement. - deprecated_member_use + info - lib/views/home/map_widget.dart/apply_order_widget.dart:455:58 - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss. Try replacing the use of the deprecated member with the replacement. - deprecated_member_use + info - lib/views/home/map_widget.dart/apply_order_widget.dart:564:40 - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss. Try replacing the use of the deprecated member with the replacement. - deprecated_member_use + info - lib/views/home/map_widget.dart/apply_order_widget.dart:566:59 - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss. Try replacing the use of the deprecated member with the replacement. - deprecated_member_use + info - lib/views/home/map_widget.dart/apply_order_widget.dart:593:34 - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss. Try replacing the use of the deprecated member with the replacement. - deprecated_member_use + info - lib/views/home/map_widget.dart/apply_order_widget.dart:663:9 - Parameter 'key' could be a super parameter. Trying converting 'key' to a super parameter. - use_super_parameters + info - lib/views/home/map_widget.dart/apply_order_widget.dart:691:46 - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss. Try replacing the use of the deprecated member with the replacement. - deprecated_member_use + info - lib/views/home/map_widget.dart/apply_order_widget.dart:705:9 - Parameter 'key' could be a super parameter. Trying converting 'key' to a super parameter. - use_super_parameters + info - lib/views/home/map_widget.dart/apply_order_widget.dart:719:54 - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss. Try replacing the use of the deprecated member with the replacement. - deprecated_member_use + info - lib/views/home/map_widget.dart/cancel_raide_page.dart:19:9 - Parameter 'key' could be a super parameter. Trying converting 'key' to a super parameter. - use_super_parameters + info - lib/views/home/map_widget.dart/cancel_raide_page.dart:108:50 - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss. Try replacing the use of the deprecated member with the replacement. - deprecated_member_use + info - lib/views/home/map_widget.dart/car_details_widget_to_go.dart:202:40 - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss. Try replacing the use of the deprecated member with the replacement. - deprecated_member_use + info - lib/views/home/map_widget.dart/car_details_widget_to_go.dart:321:38 - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss. Try replacing the use of the deprecated member with the replacement. - deprecated_member_use + info - lib/views/home/map_widget.dart/car_details_widget_to_go.dart:407:49 - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss. Try replacing the use of the deprecated member with the replacement. - deprecated_member_use + info - lib/views/home/map_widget.dart/car_details_widget_to_go.dart:412:57 - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss. Try replacing the use of the deprecated member with the replacement. - deprecated_member_use + info - lib/views/home/map_widget.dart/car_details_widget_to_go.dart:422:53 - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss. Try replacing the use of the deprecated member with the replacement. - deprecated_member_use + info - lib/views/home/map_widget.dart/car_details_widget_to_go.dart:759:42 - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss. Try replacing the use of the deprecated member with the replacement. - deprecated_member_use + info - lib/views/home/map_widget.dart/car_details_widget_to_go.dart:771:52 - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss. Try replacing the use of the deprecated member with the replacement. - deprecated_member_use + info - lib/views/home/map_widget.dart/car_details_widget_to_go.dart:788:61 - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss. Try replacing the use of the deprecated member with the replacement. - deprecated_member_use + info - lib/views/home/map_widget.dart/cash_confirm_bottom_page.dart:40:37 - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss. Try replacing the use of the deprecated member with the replacement. - deprecated_member_use + info - lib/views/home/map_widget.dart/cash_confirm_bottom_page.dart:171:31 - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss. Try replacing the use of the deprecated member with the replacement. - deprecated_member_use + info - lib/views/home/map_widget.dart/cash_confirm_bottom_page.dart:172:37 - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss. Try replacing the use of the deprecated member with the replacement. - deprecated_member_use + info - lib/views/home/map_widget.dart/cash_confirm_bottom_page.dart:177:39 - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss. Try replacing the use of the deprecated member with the replacement. - deprecated_member_use + info - lib/views/home/map_widget.dart/cash_confirm_bottom_page.dart:196:54 - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss. Try replacing the use of the deprecated member with the replacement. - deprecated_member_use + info - lib/views/home/map_widget.dart/form_search_places_destenation.dart:327:9 - Don't use 'BuildContext's across async gaps. Try rewriting the code to not use the 'BuildContext', or guard the use with a 'mounted' check. - use_build_context_synchronously + info - lib/views/home/map_widget.dart/form_search_places_destenation.dart:425:34 - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss. Try replacing the use of the deprecated member with the replacement. - deprecated_member_use + info - lib/views/home/map_widget.dart/form_search_places_destenation.dart:427:53 - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss. Try replacing the use of the deprecated member with the replacement. - deprecated_member_use + info - lib/views/home/map_widget.dart/form_serch_multiy_point.dart:138:41 - Don't use 'BuildContext's across async gaps. Try rewriting the code to not use the 'BuildContext', or guard the use with a 'mounted' check. - use_build_context_synchronously + info - lib/views/home/map_widget.dart/main_bottom_Menu_map.dart:1:1 - The file name 'main_bottom_Menu_map.dart' isn't a lower_case_with_underscores identifier. Try changing the name to follow the lower_case_with_underscores style. - file_names + info - lib/views/home/map_widget.dart/new_main_bottom_sheet.dart:64:47 - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss. Try replacing the use of the deprecated member with the replacement. - deprecated_member_use + info - lib/views/home/map_widget.dart/passengerRideLoctionWidget.dart:1:1 - The file name 'passengerRideLoctionWidget.dart' isn't a lower_case_with_underscores identifier. Try changing the name to follow the lower_case_with_underscores style. - file_names + info - lib/views/home/my_wallet/passenger_wallet.dart:5:8 - The import of 'dart:ui' is unnecessary because all of the used elements are also provided by the import of 'package:flutter/cupertino.dart'. Try removing the import directive. - unnecessary_import + info - lib/views/home/my_wallet/passenger_wallet.dart:50:54 - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss. Try replacing the use of the deprecated member with the replacement. - deprecated_member_use + info - lib/views/home/my_wallet/passenger_wallet.dart:107:46 - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss. Try replacing the use of the deprecated member with the replacement. - deprecated_member_use + info - lib/views/home/my_wallet/passenger_wallet.dart:122:39 - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss. Try replacing the use of the deprecated member with the replacement. - deprecated_member_use + info - lib/views/home/my_wallet/passenger_wallet.dart:143:49 - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss. Try replacing the use of the deprecated member with the replacement. - deprecated_member_use + info - lib/views/home/my_wallet/passenger_wallet.dart:153:61 - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss. Try replacing the use of the deprecated member with the replacement. - deprecated_member_use + info - lib/views/home/my_wallet/passenger_wallet.dart:172:49 - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss. Try replacing the use of the deprecated member with the replacement. - deprecated_member_use + info - lib/views/home/my_wallet/passenger_wallet.dart:201:40 - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss. Try replacing the use of the deprecated member with the replacement. - deprecated_member_use + info - lib/views/home/my_wallet/passenger_wallet.dart:209:52 - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss. Try replacing the use of the deprecated member with the replacement. - deprecated_member_use + info - lib/views/home/my_wallet/passenger_wallet_dialoge.dart:133:14 - 'WillPopScope' is deprecated and shouldn't be used. Use PopScope instead. The Android predictive back feature will not work with WillPopScope. This feature was deprecated after v3.12.0-1.0.pre. Try replacing the use of the deprecated member with the replacement. - deprecated_member_use + info - lib/views/home/my_wallet/payment_history_driver_page.dart:31:55 - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss. Try replacing the use of the deprecated member with the replacement. - deprecated_member_use + info - lib/views/home/my_wallet/payment_history_driver_page.dart:32:57 - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss. Try replacing the use of the deprecated member with the replacement. - deprecated_member_use + info - lib/views/home/my_wallet/payment_history_passenger_page.dart:2:8 - The import of 'package:flutter/material.dart' is unnecessary because all of the used elements are also provided by the import of 'package:flutter/cupertino.dart'. Try removing the import directive. - unnecessary_import + info - lib/views/home/my_wallet/payment_history_passenger_page.dart:36:55 - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss. Try replacing the use of the deprecated member with the replacement. - deprecated_member_use + info - lib/views/home/my_wallet/payment_history_passenger_page.dart:37:57 - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss. Try replacing the use of the deprecated member with the replacement. - deprecated_member_use + info - lib/views/home/my_wallet/payment_screen_sham.dart:81:3 - Invalid use of a private type in a public API. Try making the private type public, or making the API that uses the private type also be private. - library_private_types_in_public_api + info - lib/views/home/my_wallet/payment_screen_sham.dart:189:12 - 'WillPopScope' is deprecated and shouldn't be used. Use PopScope instead. The Android predictive back feature will not work with WillPopScope. This feature was deprecated after v3.12.0-1.0.pre. Try replacing the use of the deprecated member with the replacement. - deprecated_member_use + info - lib/views/home/my_wallet/payment_screen_sham.dart:250:40 - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss. Try replacing the use of the deprecated member with the replacement. - deprecated_member_use + info - lib/views/home/my_wallet/payment_screen_sham.dart:286:28 - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss. Try replacing the use of the deprecated member with the replacement. - deprecated_member_use + info - lib/views/home/navigation/navigation_controller.dart:463:11 - 'desiredAccuracy' is deprecated and shouldn't be used. use settings parameter with AndroidSettings, AppleSettings, WebSettings, or LocationSettings. Try replacing the use of the deprecated member with the replacement. - deprecated_member_use + info - lib/views/home/navigation/navigation_controller.dart:786:40 - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss. Try replacing the use of the deprecated member with the replacement. - deprecated_member_use + info - lib/views/home/navigation/navigation_controller.dart:804:40 - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss. Try replacing the use of the deprecated member with the replacement. - deprecated_member_use + info - lib/views/home/navigation/navigation_view.dart:117:35 - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss. Try replacing the use of the deprecated member with the replacement. - deprecated_member_use + info - lib/views/home/navigation/navigation_view.dart:134:9 - Parameter 'key' could be a super parameter. Trying converting 'key' to a super parameter. - use_super_parameters + info - lib/views/home/navigation/navigation_view.dart:149:41 - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss. Try replacing the use of the deprecated member with the replacement. - deprecated_member_use + info - lib/views/home/navigation/navigation_view.dart:195:39 - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss. Try replacing the use of the deprecated member with the replacement. - deprecated_member_use + info - lib/views/home/navigation/navigation_view.dart:223:46 - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss. Try replacing the use of the deprecated member with the replacement. - deprecated_member_use + info - lib/views/home/navigation/navigation_view.dart:278:35 - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss. Try replacing the use of the deprecated member with the replacement. - deprecated_member_use + info - lib/views/home/navigation/navigation_view.dart:346:49 - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss. Try replacing the use of the deprecated member with the replacement. - deprecated_member_use + info - lib/views/home/navigation/navigation_view.dart:413:37 - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss. Try replacing the use of the deprecated member with the replacement. - deprecated_member_use + info - lib/views/home/navigation/navigation_view.dart:424:37 - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss. Try replacing the use of the deprecated member with the replacement. - deprecated_member_use + info - lib/views/home/navigation/navigation_view.dart:449:45 - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss. Try replacing the use of the deprecated member with the replacement. - deprecated_member_use + info - lib/views/home/navigation/navigation_view.dart:487:47 - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss. Try replacing the use of the deprecated member with the replacement. - deprecated_member_use + info - lib/views/home/navigation/navigation_view.dart:520:43 - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss. Try replacing the use of the deprecated member with the replacement. - deprecated_member_use + info - lib/views/home/navigation/navigation_view.dart:555:46 - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss. Try replacing the use of the deprecated member with the replacement. - deprecated_member_use + info - lib/views/home/navigation/navigation_view.dart:654:55 - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss. Try replacing the use of the deprecated member with the replacement. - deprecated_member_use + info - lib/views/home/navigation/navigation_view.dart:670:42 - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss. Try replacing the use of the deprecated member with the replacement. - deprecated_member_use + info - lib/views/home/navigation/navigation_view.dart:774:41 - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss. Try replacing the use of the deprecated member with the replacement. - deprecated_member_use + info - lib/views/home/navigation/navigation_view.dart:777:29 - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss. Try replacing the use of the deprecated member with the replacement. - deprecated_member_use + info - lib/views/home/navigation/navigation_view.dart:798:41 - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss. Try replacing the use of the deprecated member with the replacement. - deprecated_member_use + info - lib/views/home/navigation/navigation_view.dart:842:48 - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss. Try replacing the use of the deprecated member with the replacement. - deprecated_member_use + info - lib/views/home/navigation/navigation_view.dart:852:41 - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss. Try replacing the use of the deprecated member with the replacement. - deprecated_member_use + info - lib/views/home/navigation/navigation_view.dart:856:47 - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss. Try replacing the use of the deprecated member with the replacement. - deprecated_member_use + info - lib/views/home/navigation/navigation_view.dart:880:52 - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss. Try replacing the use of the deprecated member with the replacement. - deprecated_member_use + info - lib/views/home/navigation/navigation_view.dart:907:37 - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss. Try replacing the use of the deprecated member with the replacement. - deprecated_member_use + info - lib/views/home/navigation/navigation_view.dart:965:48 - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss. Try replacing the use of the deprecated member with the replacement. - deprecated_member_use + info - lib/views/home/navigation/navigation_view.dart:973:58 - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss. Try replacing the use of the deprecated member with the replacement. - deprecated_member_use + info - lib/views/home/navigation/navigation_view.dart:975:40 - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss. Try replacing the use of the deprecated member with the replacement. - deprecated_member_use + info - lib/views/home/navigation/navigation_view.dart:977:38 - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss. Try replacing the use of the deprecated member with the replacement. - deprecated_member_use + info - lib/views/home/navigation/navigation_view.dart:995:42 - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss. Try replacing the use of the deprecated member with the replacement. - deprecated_member_use + info - lib/views/home/navigation/navigation_view.dart:997:63 - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss. Try replacing the use of the deprecated member with the replacement. - deprecated_member_use + info - lib/views/home/navigation/navigation_view.dart:1002:50 - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss. Try replacing the use of the deprecated member with the replacement. - deprecated_member_use + info - lib/views/home/navigation/navigation_view.dart:1012:51 - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss. Try replacing the use of the deprecated member with the replacement. - deprecated_member_use + info - lib/views/home/navigation/navigation_view.dart:1018:50 - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss. Try replacing the use of the deprecated member with the replacement. - deprecated_member_use + info - lib/views/home/navigation/navigation_view.dart:1050:55 - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss. Try replacing the use of the deprecated member with the replacement. - deprecated_member_use + info - lib/views/home/navigation/navigation_view.dart:1077:34 - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss. Try replacing the use of the deprecated member with the replacement. - deprecated_member_use + info - lib/views/home/profile/budgets_ads.dart:40:25 - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss. Try replacing the use of the deprecated member with the replacement. - deprecated_member_use + info - lib/views/home/profile/budgets_ads.dart:42:25 - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss. Try replacing the use of the deprecated member with the replacement. - deprecated_member_use + info - lib/views/home/profile/complaint_page.dart:51:64 - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss. Try replacing the use of the deprecated member with the replacement. - deprecated_member_use + info - lib/views/home/profile/complaint_page.dart:179:41 - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss. Try replacing the use of the deprecated member with the replacement. - deprecated_member_use + info - lib/views/home/profile/complaint_page.dart:195:33 - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss. Try replacing the use of the deprecated member with the replacement. - deprecated_member_use + info - lib/views/home/profile/complaint_page.dart:217:49 - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss. Try replacing the use of the deprecated member with the replacement. - deprecated_member_use + info - lib/views/home/profile/complaint_page.dart:221:56 - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss. Try replacing the use of the deprecated member with the replacement. - deprecated_member_use + info - lib/views/home/profile/order_history.dart:6:8 - The import of 'package:flutter/services.dart' is unnecessary because all of the used elements are also provided by the import of 'package:flutter/material.dart'. Try removing the import directive. - unnecessary_import + info - lib/views/home/profile/order_history.dart:42:62 - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss. Try replacing the use of the deprecated member with the replacement. - deprecated_member_use + info - lib/views/home/profile/order_history.dart:91:9 - Parameter 'key' could be a super parameter. Trying converting 'key' to a super parameter. - use_super_parameters + info - lib/views/home/profile/order_history.dart:110:37 - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss. Try replacing the use of the deprecated member with the replacement. - deprecated_member_use + info - lib/views/home/profile/order_history.dart:138:49 - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss. Try replacing the use of the deprecated member with the replacement. - deprecated_member_use + info - lib/views/home/profile/order_history.dart:174:60 - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss. Try replacing the use of the deprecated member with the replacement. - deprecated_member_use + info - lib/views/home/profile/order_history.dart:180:62 - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss. Try replacing the use of the deprecated member with the replacement. - deprecated_member_use + info - lib/views/home/profile/order_history.dart:236:33 - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss. Try replacing the use of the deprecated member with the replacement. - deprecated_member_use + info - lib/views/home/profile/order_history.dart:237:33 - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss. Try replacing the use of the deprecated member with the replacement. - deprecated_member_use + info - lib/views/home/profile/order_history.dart:246:39 - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss. Try replacing the use of the deprecated member with the replacement. - deprecated_member_use + info - lib/views/home/profile/order_history.dart:299:39 - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss. Try replacing the use of the deprecated member with the replacement. - deprecated_member_use + info - lib/views/home/profile/order_history.dart:338:58 - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss. Try replacing the use of the deprecated member with the replacement. - deprecated_member_use + info - lib/views/home/profile/order_history.dart:384:22 - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss. Try replacing the use of the deprecated member with the replacement. - deprecated_member_use + info - lib/views/home/profile/order_history.dart:386:41 - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss. Try replacing the use of the deprecated member with the replacement. - deprecated_member_use + info - lib/views/home/profile/order_history.dart:515:44 - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss. Try replacing the use of the deprecated member with the replacement. - deprecated_member_use + info - lib/views/home/profile/order_history.dart:560:59 - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss. Try replacing the use of the deprecated member with the replacement. - deprecated_member_use + info - lib/views/home/profile/passenger_profile_page.dart:2:8 - The imported package 'cached_network_image' isn't a dependency of the importing package. Try adding a dependency for 'cached_network_image' in the 'pubspec.yaml' file. - depend_on_referenced_packages + info - lib/views/home/profile/passenger_profile_page.dart:92:41 - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss. Try replacing the use of the deprecated member with the replacement. - deprecated_member_use + info - lib/views/home/profile/passenger_profile_page.dart:112:35 - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss. Try replacing the use of the deprecated member with the replacement. - deprecated_member_use + info - lib/views/home/profile/passenger_profile_page.dart:135:45 - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss. Try replacing the use of the deprecated member with the replacement. - deprecated_member_use + info - lib/views/home/profile/passenger_profile_page.dart:147:48 - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss. Try replacing the use of the deprecated member with the replacement. - deprecated_member_use + info - lib/views/home/profile/passenger_profile_page.dart:161:38 - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss. Try replacing the use of the deprecated member with the replacement. - deprecated_member_use + info - lib/views/home/profile/passenger_profile_page.dart:183:48 - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss. Try replacing the use of the deprecated member with the replacement. - deprecated_member_use + info - lib/views/home/profile/passenger_profile_page.dart:365:45 - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss. Try replacing the use of the deprecated member with the replacement. - deprecated_member_use + info - lib/views/home/profile/passenger_profile_page.dart:366:45 - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss. Try replacing the use of the deprecated member with the replacement. - deprecated_member_use + info - lib/views/home/profile/passenger_profile_page.dart:403:61 - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss. Try replacing the use of the deprecated member with the replacement. - deprecated_member_use + info - lib/views/home/profile/passenger_profile_page.dart:419:61 - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss. Try replacing the use of the deprecated member with the replacement. - deprecated_member_use + info - lib/views/home/profile/passenger_profile_page.dart:450:54 - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss. Try replacing the use of the deprecated member with the replacement. - deprecated_member_use + info - lib/views/home/profile/passenger_profile_page.dart:484:50 - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss. Try replacing the use of the deprecated member with the replacement. - deprecated_member_use + info - lib/views/home/profile/passenger_profile_page.dart:511:44 - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss. Try replacing the use of the deprecated member with the replacement. - deprecated_member_use + info - lib/views/home/profile/passenger_profile_page.dart:513:63 - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss. Try replacing the use of the deprecated member with the replacement. - deprecated_member_use + info - lib/views/home/profile/passenger_profile_page.dart:572:36 - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss. Try replacing the use of the deprecated member with the replacement. - deprecated_member_use + info - lib/views/home/profile/passenger_profile_page.dart:573:36 - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss. Try replacing the use of the deprecated member with the replacement. - deprecated_member_use + info - lib/views/home/profile/passenger_profile_page.dart:604:30 - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss. Try replacing the use of the deprecated member with the replacement. - deprecated_member_use + info - lib/views/home/profile/passenger_profile_page.dart:630:57 - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss. Try replacing the use of the deprecated member with the replacement. - deprecated_member_use + info - lib/views/home/profile/passenger_profile_page.dart:642:33 - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss. Try replacing the use of the deprecated member with the replacement. - deprecated_member_use + info - lib/views/home/profile/passenger_profile_page.dart:804:33 - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss. Try replacing the use of the deprecated member with the replacement. - deprecated_member_use + info - lib/views/home/profile/passenger_profile_page.dart:806:52 - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss. Try replacing the use of the deprecated member with the replacement. - deprecated_member_use + info - lib/views/home/profile/passenger_profile_page.dart:817:43 - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss. Try replacing the use of the deprecated member with the replacement. - deprecated_member_use + info - lib/views/home/profile/passenger_profile_page.dart:909:49 - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss. Try replacing the use of the deprecated member with the replacement. - deprecated_member_use + info - lib/views/home/profile/passenger_profile_page.dart:918:54 - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss. Try replacing the use of the deprecated member with the replacement. - deprecated_member_use + info - lib/views/home/profile/passenger_profile_page.dart:922:54 - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss. Try replacing the use of the deprecated member with the replacement. - deprecated_member_use + info - lib/views/home/profile/passenger_profile_page.dart:971:39 - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss. Try replacing the use of the deprecated member with the replacement. - deprecated_member_use + info - lib/views/home/profile/passenger_profile_page.dart:1030:45 - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss. Try replacing the use of the deprecated member with the replacement. - deprecated_member_use + info - lib/views/home/profile/passenger_profile_page.dart:1042:40 - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss. Try replacing the use of the deprecated member with the replacement. - deprecated_member_use + info - lib/views/home/profile/profile_captain.dart:1:8 - The imported package 'cached_network_image' isn't a dependency of the importing package. Try adding a dependency for 'cached_network_image' in the 'pubspec.yaml' file. - depend_on_referenced_packages + info - lib/views/home/profile/profile_captain.dart:41:31 - Use interpolation to compose strings and values. Try using string interpolation to build the composite string. - prefer_interpolation_to_compose_strings + info - lib/views/home/profile/promos_passenger_page.dart:6:8 - The import of 'dart:ui' is unnecessary because all of the used elements are also provided by the import of 'package:flutter/material.dart'. Try removing the import directive. - unnecessary_import + info - lib/views/home/profile/promos_passenger_page.dart:72:35 - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss. Try replacing the use of the deprecated member with the replacement. - deprecated_member_use + info - lib/views/home/profile/promos_passenger_page.dart:123:52 - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss. Try replacing the use of the deprecated member with the replacement. - deprecated_member_use + info - lib/views/home/profile/promos_passenger_page.dart:144:52 - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss. Try replacing the use of the deprecated member with the replacement. - deprecated_member_use + info - lib/views/home/setting_page.dart:38:48 - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss. Try replacing the use of the deprecated member with the replacement. - deprecated_member_use + info - lib/views/home/setting_page.dart:67:47 - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss. Try replacing the use of the deprecated member with the replacement. - deprecated_member_use + info - lib/views/home/setting_page.dart:183:43 - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss. Try replacing the use of the deprecated member with the replacement. - deprecated_member_use + info - lib/views/home/setting_page.dart:208:16 - Unnecessary use of 'toList' in a spread. Try removing the invocation of 'toList'. - unnecessary_to_list_in_spreads + info - lib/views/home/setting_page.dart:223:33 - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss. Try replacing the use of the deprecated member with the replacement. - deprecated_member_use + info - lib/views/home/setting_page.dart:248:24 - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss. Try replacing the use of the deprecated member with the replacement. - deprecated_member_use + info - lib/views/home/setting_page.dart:261:63 - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss. Try replacing the use of the deprecated member with the replacement. - deprecated_member_use + info - lib/views/home/setting_page.dart:278:24 - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss. Try replacing the use of the deprecated member with the replacement. - deprecated_member_use + info - lib/views/home/setting_page.dart:292:7 - 'activeColor' is deprecated and shouldn't be used. Use activeThumbColor instead. This feature was deprecated after v3.31.0-2.0.pre. Try replacing the use of the deprecated member with the replacement. - deprecated_member_use + info - lib/views/lang/languages.dart:9:9 - Parameter 'key' could be a super parameter. Trying converting 'key' to a super parameter. - use_super_parameters + info - lib/views/lang/languages.dart:112:48 - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss. This feature was deprecated after v3.33.0-1.0.pre. Try replacing the use of the deprecated member with the replacement. - deprecated_member_use + info - lib/views/notification/notification_page.dart:2:8 - The import of 'package:flutter/material.dart' is unnecessary because all of the used elements are also provided by the import of 'package:flutter/cupertino.dart'. Try removing the import directive. - unnecessary_import + info - lib/views/notification/notification_page.dart:47:57 - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss. Try replacing the use of the deprecated member with the replacement. - deprecated_member_use + info - lib/views/notification/notification_page.dart:48:57 - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss. Try replacing the use of the deprecated member with the replacement. - deprecated_member_use + info - lib/views/widgets/circle_container.dart:12:3 - Parameter 'key' could be a super parameter. Trying converting 'key' to a super parameter. - use_super_parameters + info - lib/views/widgets/elevated_btn.dart:21:9 - Parameter 'key' could be a super parameter. Trying converting 'key' to a super parameter. - use_super_parameters + info - lib/views/widgets/elevated_btn.dart:108:45 - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss. Try replacing the use of the deprecated member with the replacement. - deprecated_member_use + info - lib/views/widgets/elevated_btn.dart:119:57 - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss. Try replacing the use of the deprecated member with the replacement. - deprecated_member_use + info - lib/views/widgets/elevated_btn.dart:121:43 - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss. Try replacing the use of the deprecated member with the replacement. - deprecated_member_use + info - lib/views/widgets/error_snakbar.dart:1:8 - The import of 'dart:ui' is unnecessary because all of the used elements are also provided by the import of 'package:flutter/material.dart'. Try removing the import directive. - unnecessary_import + info - lib/views/widgets/error_snakbar.dart:109:42 - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss. Try replacing the use of the deprecated member with the replacement. - deprecated_member_use + info - lib/views/widgets/error_snakbar.dart:112:27 - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss. Try replacing the use of the deprecated member with the replacement. - deprecated_member_use + info - lib/views/widgets/error_snakbar.dart:118:33 - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss. Try replacing the use of the deprecated member with the replacement. - deprecated_member_use + info - lib/views/widgets/error_snakbar.dart:142:39 - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss. Try replacing the use of the deprecated member with the replacement. - deprecated_member_use + info - lib/views/widgets/error_snakbar.dart:192:44 - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss. Try replacing the use of the deprecated member with the replacement. - deprecated_member_use + info - lib/views/widgets/error_snakbar.dart:214:35 - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss. Try replacing the use of the deprecated member with the replacement. - deprecated_member_use + info - lib/views/widgets/error_snakbar.dart:222:39 - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss. Try replacing the use of the deprecated member with the replacement. - deprecated_member_use + info - lib/views/widgets/icon_widget_menu.dart:7:9 - Parameter 'key' could be a super parameter. Trying converting 'key' to a super parameter. - use_super_parameters + info - lib/views/widgets/my_circular_indicator_timer.dart:10:9 - Parameter 'key' could be a super parameter. Trying converting 'key' to a super parameter. - use_super_parameters + info - lib/views/widgets/my_circular_indicator_timer.dart:92:41 - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss. Try replacing the use of the deprecated member with the replacement. - deprecated_member_use + info - lib/views/widgets/my_circular_indicator_timer.dart:97:35 - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss. Try replacing the use of the deprecated member with the replacement. - deprecated_member_use + info - lib/views/widgets/my_circular_indicator_timer.dart:129:50 - 'scale' is deprecated and shouldn't be used. Use scaleByVector3, scaleByVector4, or scaleByDouble instead. Try replacing the use of the deprecated member with the replacement. - deprecated_member_use + info - lib/views/widgets/my_textField.dart:1:1 - The file name 'my_textField.dart' isn't a lower_case_with_underscores identifier. Try changing the name to follow the lower_case_with_underscores style. - file_names + info - lib/views/widgets/my_textField.dart:8:9 - Parameter 'key' could be a super parameter. Trying converting 'key' to a super parameter. - use_super_parameters + info - lib/views/widgets/mydialoug.dart:65:37 - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss. Try replacing the use of the deprecated member with the replacement. - deprecated_member_use + info - lib/views/widgets/mydialoug.dart:66:37 - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss. Try replacing the use of the deprecated member with the replacement. - deprecated_member_use + info - lib/views/widgets/mydialoug.dart:73:33 - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss. Try replacing the use of the deprecated member with the replacement. - deprecated_member_use + info - lib/views/widgets/mydialoug.dart:79:42 - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss. Try replacing the use of the deprecated member with the replacement. - deprecated_member_use + info - lib/views/widgets/mydialoug.dart:85:42 - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss. Try replacing the use of the deprecated member with the replacement. - deprecated_member_use + info - lib/views/widgets/mydialoug.dart:115:46 - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss. Try replacing the use of the deprecated member with the replacement. - deprecated_member_use + info - lib/views/widgets/mydialoug.dart:125:44 - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss. Try replacing the use of the deprecated member with the replacement. - deprecated_member_use + info - lib/views/widgets/mydialoug.dart:133:62 - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss. Try replacing the use of the deprecated member with the replacement. - deprecated_member_use + info - lib/views/widgets/mydialoug.dart:140:39 - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss. Try replacing the use of the deprecated member with the replacement. - deprecated_member_use + info - lib/views/widgets/mydialoug.dart:141:43 - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss. Try replacing the use of the deprecated member with the replacement. - deprecated_member_use + info - lib/views/widgets/mydialoug.dart:273:41 - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss. Try replacing the use of the deprecated member with the replacement. - deprecated_member_use + info - lib/views/widgets/mydialoug.dart:274:41 - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss. Try replacing the use of the deprecated member with the replacement. - deprecated_member_use + info - lib/views/widgets/mydialoug.dart:277:44 - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss. Try replacing the use of the deprecated member with the replacement. - deprecated_member_use + info - lib/views/widgets/mydialoug.dart:342:32 - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss. Try replacing the use of the deprecated member with the replacement. - deprecated_member_use + info - lib/views/widgets/mydialoug.dart:347:34 - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss. Try replacing the use of the deprecated member with the replacement. - deprecated_member_use + info - lib/views/widgets/mydialoug.dart:459:34 - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss. Try replacing the use of the deprecated member with the replacement. - deprecated_member_use + info - lib/views/widgets/mydialoug.dart:493:44 - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss. Try replacing the use of the deprecated member with the replacement. - deprecated_member_use + info - lib/views/widgets/voice_call_bottom_sheet.dart:9:9 - Parameter 'key' could be a super parameter. Trying converting 'key' to a super parameter. - use_super_parameters + info - lib/views/widgets/voice_call_bottom_sheet.dart:23:12 - 'WillPopScope' is deprecated and shouldn't be used. Use PopScope instead. The Android predictive back feature will not work with WillPopScope. This feature was deprecated after v3.12.0-1.0.pre. Try replacing the use of the deprecated member with the replacement. - deprecated_member_use + info - lib/views/widgets/voice_call_bottom_sheet.dart:32:33 - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss. Try replacing the use of the deprecated member with the replacement. - deprecated_member_use + info - lib/views/widgets/voice_call_bottom_sheet.dart:153:53 - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss. Try replacing the use of the deprecated member with the replacement. - deprecated_member_use + info - lib/views/widgets/voice_call_bottom_sheet.dart:171:54 - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss. Try replacing the use of the deprecated member with the replacement. - deprecated_member_use + info - packages/calendar_builder/example/lib/custom_month_builder.dart:85:49 - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss. Try replacing the use of the deprecated member with the replacement. - deprecated_member_use + info - packages/calendar_builder/example/lib/customized_month_builder.dart:74:32 - Use interpolation to compose strings and values. Try using string interpolation to build the composite string. - prefer_interpolation_to_compose_strings + info - packages/calendar_builder/example/lib/customized_month_builder.dart:77:32 - Use interpolation to compose strings and values. Try using string interpolation to build the composite string. - prefer_interpolation_to_compose_strings + info - packages/calendar_builder/example/lib/customized_month_builder.dart:80:27 - Use interpolation to compose strings and values. Try using string interpolation to build the composite string. - prefer_interpolation_to_compose_strings + info - packages/calendar_builder/example/lib/customized_month_builder.dart:83:27 - Use interpolation to compose strings and values. Try using string interpolation to build the composite string. - prefer_interpolation_to_compose_strings + info - packages/calendar_builder/example/lib/customized_month_builder.dart:86:27 - Use interpolation to compose strings and values. Try using string interpolation to build the composite string. - prefer_interpolation_to_compose_strings + info - packages/calendar_builder/example/lib/customized_month_builder.dart:89:27 - Use interpolation to compose strings and values. Try using string interpolation to build the composite string. - prefer_interpolation_to_compose_strings + info - packages/calendar_builder/example/lib/customized_month_builder.dart:92:27 - Use interpolation to compose strings and values. Try using string interpolation to build the composite string. - prefer_interpolation_to_compose_strings + info - packages/calendar_builder/example/lib/customized_month_builder.dart:96:32 - Use interpolation to compose strings and values. Try using string interpolation to build the composite string. - prefer_interpolation_to_compose_strings + info - packages/calendar_builder/example/lib/customized_month_builder.dart:99:27 - Use interpolation to compose strings and values. Try using string interpolation to build the composite string. - prefer_interpolation_to_compose_strings + info - packages/calendar_builder/lib/src/utils/date_utils_cb.dart:168:20 - The local variable '_listOfDatesInYear' starts with an underscore. Try renaming the variable to not start with an underscore. - no_leading_underscores_for_local_identifiers + info - packages/calendar_builder/lib/src/utils/date_utils_cb.dart:174:20 - The local variable '_listOfJan' starts with an underscore. Try renaming the variable to not start with an underscore. - no_leading_underscores_for_local_identifiers + info - packages/calendar_builder/lib/src/utils/date_utils_cb.dart:177:20 - The local variable '_listOfFeb' starts with an underscore. Try renaming the variable to not start with an underscore. - no_leading_underscores_for_local_identifiers + info - packages/calendar_builder/lib/src/utils/date_utils_cb.dart:180:20 - The local variable '_listOfMarch' starts with an underscore. Try renaming the variable to not start with an underscore. - no_leading_underscores_for_local_identifiers + info - packages/calendar_builder/lib/src/utils/date_utils_cb.dart:183:20 - The local variable '_listOfApril' starts with an underscore. Try renaming the variable to not start with an underscore. - no_leading_underscores_for_local_identifiers + info - packages/calendar_builder/lib/src/utils/date_utils_cb.dart:186:20 - The local variable '_listOfMay' starts with an underscore. Try renaming the variable to not start with an underscore. - no_leading_underscores_for_local_identifiers + info - packages/calendar_builder/lib/src/utils/date_utils_cb.dart:189:20 - The local variable '_listOfJune' starts with an underscore. Try renaming the variable to not start with an underscore. - no_leading_underscores_for_local_identifiers + info - packages/calendar_builder/lib/src/utils/date_utils_cb.dart:192:20 - The local variable '_listOfJuly' starts with an underscore. Try renaming the variable to not start with an underscore. - no_leading_underscores_for_local_identifiers + info - packages/calendar_builder/lib/src/utils/date_utils_cb.dart:195:20 - The local variable '_listOfAugust' starts with an underscore. Try renaming the variable to not start with an underscore. - no_leading_underscores_for_local_identifiers + info - packages/calendar_builder/lib/src/utils/date_utils_cb.dart:198:20 - The local variable '_listOfSept' starts with an underscore. Try renaming the variable to not start with an underscore. - no_leading_underscores_for_local_identifiers + info - packages/calendar_builder/lib/src/utils/date_utils_cb.dart:201:20 - The local variable '_listOfOct' starts with an underscore. Try renaming the variable to not start with an underscore. - no_leading_underscores_for_local_identifiers + info - packages/calendar_builder/lib/src/utils/date_utils_cb.dart:204:20 - The local variable '_listOfNov' starts with an underscore. Try renaming the variable to not start with an underscore. - no_leading_underscores_for_local_identifiers + info - packages/calendar_builder/lib/src/utils/date_utils_cb.dart:207:20 - The local variable '_listOfDec' starts with an underscore. Try renaming the variable to not start with an underscore. - no_leading_underscores_for_local_identifiers + info - packages/calendar_builder/lib/src/utils/date_utils_cb.dart:210:39 - The local variable '_months' starts with an underscore. Try renaming the variable to not start with an underscore. - no_leading_underscores_for_local_identifiers + info - packages/calendar_builder/lib/src/utils/global.dart:101:32 - The local variable '_log' starts with an underscore. Try renaming the variable to not start with an underscore. - no_leading_underscores_for_local_identifiers + info - packages/calendar_builder/lib/src/utils/widgets.dart:38:41 - 'MaterialState' is deprecated and shouldn't be used. Use WidgetState instead. Moved to the Widgets layer to make code available outside of Material. This feature was deprecated after v3.19.0-0.3.pre. Try replacing the use of the deprecated member with the replacement. - deprecated_member_use + info - packages/calendar_builder/lib/src/utils/widgets.dart:42:36 - 'MaterialState' is deprecated and shouldn't be used. Use WidgetState instead. Moved to the Widgets layer to make code available outside of Material. This feature was deprecated after v3.19.0-0.3.pre. Try replacing the use of the deprecated member with the replacement. - deprecated_member_use + info - packages/calendar_builder/lib/src/utils/widgets.dart:59:20 - 'MaterialStateProperty' is deprecated and shouldn't be used. Use WidgetStateProperty instead. Moved to the Widgets layer to make code available outside of Material. This feature was deprecated after v3.19.0-0.3.pre. Try replacing the use of the deprecated member with the replacement. - deprecated_member_use + info - packages/calendar_builder/lib/src/utils/widgets.dart:60:27 - 'MaterialStateProperty' is deprecated and shouldn't be used. Use WidgetStateProperty instead. Moved to the Widgets layer to make code available outside of Material. This feature was deprecated after v3.19.0-0.3.pre. Try replacing the use of the deprecated member with the replacement. - deprecated_member_use + info - packages/calendar_builder/lib/src/utils/widgets.dart:62:19 - 'MaterialStateProperty' is deprecated and shouldn't be used. Use WidgetStateProperty instead. Moved to the Widgets layer to make code available outside of Material. This feature was deprecated after v3.19.0-0.3.pre. Try replacing the use of the deprecated member with the replacement. - deprecated_member_use + info - packages/calendar_builder/lib/src/utils/widgets.dart:102:11 - The local variable '_paint' starts with an underscore. Try renaming the variable to not start with an underscore. - no_leading_underscores_for_local_identifiers + info - packages/calendar_builder/lib/src/views/month_builder.dart:106:3 - Invalid use of a private type in a public API. Try making the private type public, or making the API that uses the private type also be private. - library_private_types_in_public_api + info - packages/calendar_builder/lib/src/views/month_builder.dart:239:9 - The local variable '_mPage' starts with an underscore. Try renaming the variable to not start with an underscore. - no_leading_underscores_for_local_identifiers + info - packages/calendar_builder/lib/src/views/month_builder.dart:327:9 - The local variable '_initialPage' starts with an underscore. Try renaming the variable to not start with an underscore. - no_leading_underscores_for_local_identifiers + info - packages/calendar_builder/lib/src/views/month_builder.dart:359:16 - The local variable '_monthGrid' starts with an underscore. Try renaming the variable to not start with an underscore. - no_leading_underscores_for_local_identifiers + info - packages/calendar_builder/lib/src/views/month_builder.dart:787:19 - The local variable '_monthButtons' starts with an underscore. Try renaming the variable to not start with an underscore. - no_leading_underscores_for_local_identifiers + info - packages/calendar_builder/lib/src/views/month_builder.dart:951:34 - The local variable '_mBtn' starts with an underscore. Try renaming the variable to not start with an underscore. - no_leading_underscores_for_local_identifiers + info - packages/calendar_builder/lib/src/views/month_builder.dart:981:54 - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss. Try replacing the use of the deprecated member with the replacement. - deprecated_member_use + info - packages/calendar_builder/lib/src/views/month_builder.dart:988:42 - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss. Try replacing the use of the deprecated member with the replacement. - deprecated_member_use + info - packages/calendar_builder/lib/src/views/month_builder.dart:990:62 - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss. Try replacing the use of the deprecated member with the replacement. - deprecated_member_use + info - packages/calendar_builder/lib/src/views/month_builder.dart:1018:61 - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss. Try replacing the use of the deprecated member with the replacement. - deprecated_member_use + info - packages/calendar_builder/lib/src/views/month_builder.dart:1020:46 - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss. Try replacing the use of the deprecated member with the replacement. - deprecated_member_use + info - packages/calendar_builder/lib/src/views/month_builder.dart:1041:52 - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss. Try replacing the use of the deprecated member with the replacement. - deprecated_member_use + info - packages/calendar_builder/lib/src/views/year_drop_down.dart:50:3 - Invalid use of a private type in a public API. Try making the private type public, or making the API that uses the private type also be private. - library_private_types_in_public_api + info - packages/calendar_builder/lib/src/views/year_drop_down.dart:84:12 - The local variable '_ifBuilderEmpty' starts with an underscore. Try renaming the variable to not start with an underscore. - no_leading_underscores_for_local_identifiers + info - packages/calendar_builder/lib/src/views/year_drop_down.dart:477:11 - The local variable '_mPage' starts with an underscore. Try renaming the variable to not start with an underscore. - no_leading_underscores_for_local_identifiers + info - packages/calendar_builder/lib/src/views/year_drop_down.dart:520:50 - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss. Try replacing the use of the deprecated member with the replacement. - deprecated_member_use + info - packages/calendar_builder/test/unit_test/date_utils_test.dart:19:14 - The local variable '_year' starts with an underscore. Try renaming the variable to not start with an underscore. - no_leading_underscores_for_local_identifiers + info - packages/flutter_paypal/example/lib/main.dart:9:9 - Parameter 'key' could be a super parameter. Trying converting 'key' to a super parameter. - use_super_parameters + info - packages/flutter_paypal/example/lib/main.dart:25:9 - Parameter 'key' could be a super parameter. Trying converting 'key' to a super parameter. - use_super_parameters + info - packages/flutter_paypal/example/lib/main.dart:95:31 - Don't invoke 'print' in production code. Try using a logging framework. - avoid_print + info - packages/flutter_paypal/example/lib/main.dart:98:31 - Don't invoke 'print' in production code. Try using a logging framework. - avoid_print + info - packages/flutter_paypal/example/lib/main.dart:101:31 - Don't invoke 'print' in production code. Try using a logging framework. - avoid_print + info - packages/flutter_paypal/lib/flutter_paypal.dart:1:9 - Library names are not necessary. Remove the library name. - unnecessary_library_name + info - packages/flutter_paypal/lib/flutter_paypal.dart:19:9 - Parameter 'key' could be a super parameter. Trying converting 'key' to a super parameter. - use_super_parameters + info - packages/flutter_paypal/lib/flutter_paypal.dart:65:3 - Missing type annotation. Try adding a type annotation. - strict_top_level_inference + info - packages/flutter_paypal/lib/flutter_paypal.dart:219:12 - 'WillPopScope' is deprecated and shouldn't be used. Use PopScope instead. The Android predictive back feature will not work with WillPopScope. This feature was deprecated after v3.12.0-1.0.pre. Try replacing the use of the deprecated member with the replacement. - deprecated_member_use + info - packages/flutter_paypal/lib/flutter_paypal.dart:248:43 - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss. Try replacing the use of the deprecated member with the replacement. - deprecated_member_use + info - packages/flutter_paypal/lib/src/PaypalServices.dart:17:3 - Missing type annotation. Try adding a type annotation. - strict_top_level_inference + info - packages/flutter_paypal/lib/src/PaypalServices.dart:46:35 - Missing type annotation. Try adding a type annotation. - strict_top_level_inference + info - packages/flutter_paypal/lib/src/PaypalServices.dart:46:49 - Missing type annotation. Try adding a type annotation. - strict_top_level_inference + info - packages/flutter_paypal/lib/src/PaypalServices.dart:86:30 - Missing type annotation. Try adding a type annotation. - strict_top_level_inference + info - packages/flutter_paypal/lib/src/PaypalServices.dart:86:35 - Missing type annotation. Try adding a type annotation. - strict_top_level_inference + info - packages/flutter_paypal/lib/src/PaypalServices.dart:86:44 - Missing type annotation. Try adding a type annotation. - strict_top_level_inference + info - packages/flutter_paypal/lib/src/screens/complete_payment.dart:13:9 - Parameter 'key' could be a super parameter. Trying converting 'key' to a super parameter. - use_super_parameters + info - packages/flutter_paypal/lib/src/screens/complete_payment.dart:33:3 - Missing type annotation. Try adding a type annotation. - strict_top_level_inference + info - packages/get/example/lib/pages/home/bindings/home_binding.dart:11:32 - Closure should be a tearoff. Try using a tearoff rather than a closure. - unnecessary_lambdas + info - packages/get/example/lib/pages/home/presentation/controllers/home_controller.dart:56:18 - 'didPushRoute' is deprecated and shouldn't be used. Use didPushRouteInformation instead. This feature was deprecated after v3.8.0-14.0.pre. Try replacing the use of the deprecated member with the replacement. - deprecated_member_use + info - packages/get/example/lib/routes/app_pages.dart:17:15 - Closure should be a tearoff. Try using a tearoff rather than a closure. - unnecessary_lambdas + info - packages/get/example/lib/routes/app_pages.dart:22:19 - Closure should be a tearoff. Try using a tearoff rather than a closure. - unnecessary_lambdas + info - packages/get/example/lib/routes/app_pages.dart:26:23 - Closure should be a tearoff. Try using a tearoff rather than a closure. - unnecessary_lambdas + info - packages/get/example/test/main_test.dart:43:34 - Closure should be a tearoff. Try using a tearoff rather than a closure. - unnecessary_lambdas + info - packages/get/example_nav2/lib/app/middleware/auth_middleware.dart:14:48 - 'location' is deprecated and shouldn't be used. Use uri instead. This feature was deprecated after v3.8.0-3.0.pre. Try replacing the use of the deprecated member with the replacement. - deprecated_member_use + info - packages/get/example_nav2/lib/app/modules/dashboard/bindings/dashboard_binding.dart:9:7 - Closure should be a tearoff. Try using a tearoff rather than a closure. - unnecessary_lambdas + info - packages/get/example_nav2/lib/app/modules/home/bindings/home_binding.dart:9:7 - Closure should be a tearoff. Try using a tearoff rather than a closure. - unnecessary_lambdas + info - packages/get/example_nav2/lib/app/modules/home/views/home_view.dart:13:47 - 'location' is deprecated and shouldn't be used. Use uri instead. This feature was deprecated after v3.8.0-3.0.pre. Try replacing the use of the deprecated member with the replacement. - deprecated_member_use + info - packages/get/example_nav2/lib/app/modules/login/bindings/login_binding.dart:9:7 - Closure should be a tearoff. Try using a tearoff rather than a closure. - unnecessary_lambdas + info - packages/get/example_nav2/lib/app/modules/products/bindings/products_binding.dart:9:7 - Closure should be a tearoff. Try using a tearoff rather than a closure. - unnecessary_lambdas + info - packages/get/example_nav2/lib/app/modules/profile/bindings/profile_binding.dart:9:7 - Closure should be a tearoff. Try using a tearoff rather than a closure. - unnecessary_lambdas + info - packages/get/example_nav2/lib/app/modules/root/bindings/root_binding.dart:9:7 - Closure should be a tearoff. Try using a tearoff rather than a closure. - unnecessary_lambdas + info - packages/get/example_nav2/lib/app/modules/root/views/root_view.dart:13:32 - 'location' is deprecated and shouldn't be used. Use uri instead. This feature was deprecated after v3.8.0-3.0.pre. Try replacing the use of the deprecated member with the replacement. - deprecated_member_use + info - packages/get/example_nav2/lib/app/modules/settings/bindings/settings_binding.dart:9:7 - Closure should be a tearoff. Try using a tearoff rather than a closure. - unnecessary_lambdas + info - packages/get/example_nav2/lib/app/routes/app_pages.dart:31:13 - Closure should be a tearoff. Try using a tearoff rather than a closure. - unnecessary_lambdas + info - packages/get/example_nav2/lib/app/routes/app_pages.dart:42:17 - Closure should be a tearoff. Try using a tearoff rather than a closure. - unnecessary_lambdas + info - packages/get/example_nav2/lib/app/routes/app_pages.dart:48:17 - Closure should be a tearoff. Try using a tearoff rather than a closure. - unnecessary_lambdas + info - packages/get/example_nav2/lib/app/routes/app_pages.dart:56:21 - Closure should be a tearoff. Try using a tearoff rather than a closure. - unnecessary_lambdas + info - packages/get/example_nav2/lib/app/routes/app_pages.dart:65:21 - Closure should be a tearoff. Try using a tearoff rather than a closure. - unnecessary_lambdas + info - packages/get/example_nav2/lib/app/routes/app_pages.dart:72:21 - Closure should be a tearoff. Try using a tearoff rather than a closure. - unnecessary_lambdas + info - packages/get/example_nav2/lib/app/routes/app_pages.dart:79:25 - Closure should be a tearoff. Try using a tearoff rather than a closure. - unnecessary_lambdas + info - packages/get/example_nav2/lib/app/routes/app_pages.dart:92:17 - Closure should be a tearoff. Try using a tearoff rather than a closure. - unnecessary_lambdas + info - packages/get/lib/get_connect/http/src/_http/_html/_http_request_html.dart:3:1 - 'dart:html' is deprecated and shouldn't be used. Use package:web and dart:js_interop instead. Try replacing the use of the deprecated member with the replacement. - deprecated_member_use + info - packages/get/lib/get_connect/sockets/src/sockets_html.dart:4:1 - 'dart:html' is deprecated and shouldn't be used. Use package:web and dart:js_interop instead. Try replacing the use of the deprecated member with the replacement. - deprecated_member_use + info - packages/get/lib/get_navigation/src/extension_navigation.dart:172:5 - 'WillPopCallback' is deprecated and shouldn't be used. Use PopInvokedCallback instead. This feature was deprecated after v3.12.0-1.0.pre. Try replacing the use of the deprecated member with the replacement. - deprecated_member_use + info - packages/get/lib/get_navigation/src/extension_navigation.dart:234:49 - 'dialogBackgroundColor' is deprecated and shouldn't be used. Use DialogThemeData.backgroundColor instead. This feature was deprecated after v3.27.0-0.1.pre. Try replacing the use of the deprecated member with the replacement. - deprecated_member_use + info - packages/get/lib/get_navigation/src/extension_navigation.dart:264:13 - 'WillPopScope' is deprecated and shouldn't be used. Use PopScope instead. The Android predictive back feature will not work with WillPopScope. This feature was deprecated after v3.12.0-1.0.pre. Try replacing the use of the deprecated member with the replacement. - deprecated_member_use + info - packages/get/lib/get_navigation/src/extension_navigation.dart:436:57 - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss. Try replacing the use of the deprecated member with the replacement. - deprecated_member_use + info - packages/get/lib/get_navigation/src/extension_navigation.dart:1169:6 - 'SingletonFlutterWindow' is deprecated and shouldn't be used. Use FlutterView or PlatformDispatcher instead. Deprecated to prepare for the upcoming multi-window support. This feature was deprecated after v3.7.0-32.0.pre. Try replacing the use of the deprecated member with the replacement. - deprecated_member_use + info - packages/get/lib/get_navigation/src/extension_navigation.dart:1169:46 - 'window' is deprecated and shouldn't be used. Look up the current FlutterView from the context via View.of(context) or consult the PlatformDispatcher directly instead. Deprecated to prepare for the upcoming multi-window support. This feature was deprecated after v3.7.0-32.0.pre. Try replacing the use of the deprecated member with the replacement. - deprecated_member_use + info - packages/get/lib/get_navigation/src/extension_navigation.dart:1171:34 - 'window' is deprecated and shouldn't be used. Look up the current FlutterView from the context via View.of(context) or consult the PlatformDispatcher directly instead. Deprecated to prepare for the upcoming multi-window support. This feature was deprecated after v3.7.0-32.0.pre. Try replacing the use of the deprecated member with the replacement. - deprecated_member_use + info - packages/get/lib/get_navigation/src/extension_navigation.dart:1174:31 - 'window' is deprecated and shouldn't be used. Look up the current FlutterView from the context via View.of(context) or consult the PlatformDispatcher directly instead. Deprecated to prepare for the upcoming multi-window support. This feature was deprecated after v3.7.0-32.0.pre. Try replacing the use of the deprecated member with the replacement. - deprecated_member_use + info - packages/get/lib/get_navigation/src/extension_navigation.dart:1176:23 - 'window' is deprecated and shouldn't be used. Look up the current FlutterView from the context via View.of(context) or consult the PlatformDispatcher directly instead. Deprecated to prepare for the upcoming multi-window support. This feature was deprecated after v3.7.0-32.0.pre. Try replacing the use of the deprecated member with the replacement. - deprecated_member_use + info - packages/get/lib/get_navigation/src/extension_navigation.dart:1186:36 - 'window' is deprecated and shouldn't be used. Look up the current FlutterView from the context via View.of(context) or consult the PlatformDispatcher directly instead. Deprecated to prepare for the upcoming multi-window support. This feature was deprecated after v3.7.0-32.0.pre. Try replacing the use of the deprecated member with the replacement. - deprecated_member_use + info - packages/get/lib/get_navigation/src/extension_navigation.dart:1190:36 - 'window' is deprecated and shouldn't be used. Look up the current FlutterView from the context via View.of(context) or consult the PlatformDispatcher directly instead. Deprecated to prepare for the upcoming multi-window support. This feature was deprecated after v3.7.0-32.0.pre. Try replacing the use of the deprecated member with the replacement. - deprecated_member_use + info - packages/get/lib/get_navigation/src/extension_navigation.dart:1193:36 - 'window' is deprecated and shouldn't be used. Look up the current FlutterView from the context via View.of(context) or consult the PlatformDispatcher directly instead. Deprecated to prepare for the upcoming multi-window support. This feature was deprecated after v3.7.0-32.0.pre. Try replacing the use of the deprecated member with the replacement. - deprecated_member_use + info - packages/get/lib/get_navigation/src/extension_navigation.dart:1206:11 - 'window' is deprecated and shouldn't be used. Look up the current FlutterView from the context via View.of(context) or consult the PlatformDispatcher directly instead. Deprecated to prepare for the upcoming multi-window support. This feature was deprecated after v3.7.0-32.0.pre. Try replacing the use of the deprecated member with the replacement. - deprecated_member_use + info - packages/get/lib/get_navigation/src/nav2/get_information_parser.dart:18:37 - 'location' is deprecated and shouldn't be used. Use uri instead. This feature was deprecated after v3.8.0-3.0.pre. Try replacing the use of the deprecated member with the replacement. - deprecated_member_use + info - packages/get/lib/get_navigation/src/nav2/get_information_parser.dart:43:7 - 'location' is deprecated and shouldn't be used. Pass Uri.parse(location) to uri parameter instead. This feature was deprecated after v3.8.0-3.0.pre. Try replacing the use of the deprecated member with the replacement. - deprecated_member_use + info - packages/get/lib/get_navigation/src/nav2/get_information_parser.dart:43:31 - 'location' is deprecated and shouldn't be used. Use uri instead. This feature was deprecated after v3.8.0-3.0.pre. Try replacing the use of the deprecated member with the replacement. - deprecated_member_use + info - packages/get/lib/get_navigation/src/nav2/get_nav_config.dart:31:11 - 'location' is deprecated and shouldn't be used. Pass Uri.parse(location) to uri parameter instead. This feature was deprecated after v3.8.0-3.0.pre. Try replacing the use of the deprecated member with the replacement. - deprecated_member_use + info - packages/get/lib/get_navigation/src/nav2/get_nav_config.dart:42:34 - 'location' is deprecated and shouldn't be used. Use uri instead. This feature was deprecated after v3.8.0-3.0.pre. Try replacing the use of the deprecated member with the replacement. - deprecated_member_use + info - packages/get/lib/get_navigation/src/nav2/get_router_delegate.dart:67:18 - 'location' is deprecated and shouldn't be used. Use uri instead. This feature was deprecated after v3.8.0-3.0.pre. Try replacing the use of the deprecated member with the replacement. - deprecated_member_use + info - packages/get/lib/get_navigation/src/nav2/get_router_delegate.dart:300:47 - 'location' is deprecated and shouldn't be used. Use uri instead. This feature was deprecated after v3.8.0-3.0.pre. Try replacing the use of the deprecated member with the replacement. - deprecated_member_use + info - packages/get/lib/get_navigation/src/nav2/get_router_delegate.dart:370:51 - 'location' is deprecated and shouldn't be used. Use uri instead. This feature was deprecated after v3.8.0-3.0.pre. Try replacing the use of the deprecated member with the replacement. - deprecated_member_use + info - packages/get/lib/get_navigation/src/nav2/get_router_delegate.dart:370:70 - 'location' is deprecated and shouldn't be used. Use uri instead. This feature was deprecated after v3.8.0-3.0.pre. Try replacing the use of the deprecated member with the replacement. - deprecated_member_use + info - packages/get/lib/get_navigation/src/nav2/get_router_delegate.dart:374:36 - 'location' is deprecated and shouldn't be used. Use uri instead. This feature was deprecated after v3.8.0-3.0.pre. Try replacing the use of the deprecated member with the replacement. - deprecated_member_use + info - packages/get/lib/get_navigation/src/nav2/get_router_delegate.dart:428:11 - 'onPopPage' is deprecated and shouldn't be used. Use onDidRemovePage instead. This feature was deprecated after v3.16.0-17.0.pre. Try replacing the use of the deprecated member with the replacement. - deprecated_member_use + info - packages/get/lib/get_navigation/src/root/get_cupertino_app.dart:252:17 - 'useInheritedMediaQuery' is deprecated and shouldn't be used. Remove this parameter as it is now ignored. CupertinoApp never introduces its own MediaQuery; the View widget takes care of that. This feature was deprecated after v3.7.0-29.0.pre. Try replacing the use of the deprecated member with the replacement. - deprecated_member_use + info - packages/get/lib/get_navigation/src/root/get_cupertino_app.dart:292:17 - 'useInheritedMediaQuery' is deprecated and shouldn't be used. Remove this parameter as it is now ignored. CupertinoApp never introduces its own MediaQuery; the View widget takes care of that. This feature was deprecated after v3.7.0-29.0.pre. Try replacing the use of the deprecated member with the replacement. - deprecated_member_use + info - packages/get/lib/get_navigation/src/root/get_material_app.dart:275:17 - 'useInheritedMediaQuery' is deprecated and shouldn't be used. Remove this parameter as it is now ignored. MaterialApp never introduces its own MediaQuery; the View widget takes care of that. This feature was deprecated after v3.7.0-29.0.pre. Try replacing the use of the deprecated member with the replacement. - deprecated_member_use + info - packages/get/lib/get_navigation/src/root/get_material_app.dart:322:17 - 'useInheritedMediaQuery' is deprecated and shouldn't be used. Remove this parameter as it is now ignored. MaterialApp never introduces its own MediaQuery; the View widget takes care of that. This feature was deprecated after v3.7.0-29.0.pre. Try replacing the use of the deprecated member with the replacement. - deprecated_member_use + info - packages/get/lib/get_navigation/src/routes/get_transition_mixin.dart:247:12 - The member 'popGestureEnabled' overrides an inherited member but isn't annotated with '@override'. Try adding the '@override' annotation. - annotate_overrides + info - packages/get/lib/get_navigation/src/routes/get_transition_mixin.dart:258:12 - The member 'popGestureInProgress' overrides an inherited member but isn't annotated with '@override'. Try adding the '@override' annotation. - annotate_overrides + info - packages/get/lib/get_navigation/src/routes/get_transition_mixin.dart:687:15 - 'hasScopedWillPopCallback' is deprecated and shouldn't be used. Use popDisposition instead. This feature was deprecated after v3.12.0-1.0.pre. Try replacing the use of the deprecated member with the replacement. - deprecated_member_use + info - packages/get/lib/get_state_manager/src/rx_flutter/rx_ticket_provider_mixin.dart:59:55 - 'of' is deprecated and shouldn't be used. Use TickerMode.valuesOf to get both enabled and forceFrames. This feature was deprecated after v3.35.0-0.0.pre. Try replacing the use of the deprecated member with the replacement. - deprecated_member_use + info - packages/get/lib/get_state_manager/src/rx_flutter/rx_ticket_provider_mixin.dart:129:31 - 'of' is deprecated and shouldn't be used. Use TickerMode.valuesOf to get both enabled and forceFrames. This feature was deprecated after v3.35.0-0.0.pre. Try replacing the use of the deprecated member with the replacement. - deprecated_member_use + info - packages/get/lib/get_state_manager/src/simple/mixin_state.dart:6:4 - 'required' is deprecated and shouldn't be used. In Dart 2.12 and later, use the built-in `required` keyword to mark a named parameter as required. Try replacing the use of the deprecated member with the replacement. - deprecated_member_use + info - packages/get/lib/get_utils/src/extensions/context_extensions.dart:95:53 - 'textScaleFactor' is deprecated and shouldn't be used. Use textScaler instead. Use of textScaleFactor was deprecated in preparation for the upcoming nonlinear text scaling support. This feature was deprecated after v3.12.0-2.0.pre. Try replacing the use of the deprecated member with the replacement. - deprecated_member_use + info - packages/get/lib/get_utils/src/platform/platform_web.dart:3:1 - 'dart:html' is deprecated and shouldn't be used. Use package:web and dart:js_interop instead. Try replacing the use of the deprecated member with the replacement. - deprecated_member_use + info - packages/get/test/utils/extensions/context_extensions_test.dart:62:38 - 'textScaleFactor' is deprecated and shouldn't be used. Use textScaler instead. Use of textScaleFactor was deprecated in preparation for the upcoming nonlinear text scaling support. This feature was deprecated after v3.12.0-2.0.pre. Try replacing the use of the deprecated member with the replacement. - deprecated_member_use + info - packages/get_storage/example/lib/main.dart:18:7 - Constructors for public widgets should have a named 'key' parameter. Try adding a named parameter to the constructor. - use_key_in_widget_constructors + info - packages/get_storage/lib/src/storage/html.dart:4:1 - 'dart:html' is deprecated and shouldn't be used. Use package:web and dart:js_interop instead. Try replacing the use of the deprecated member with the replacement. - deprecated_member_use + info - packages/get_storage/lib/src/storage/io.dart:37:22 - The local variable '_file' starts with an underscore. Try renaming the variable to not start with an underscore. - no_leading_underscores_for_local_identifiers + info - packages/get_storage/lib/src/storage/io.dart:71:22 - The local variable '_file' starts with an underscore. Try renaming the variable to not start with an underscore. - no_leading_underscores_for_local_identifiers + info - packages/get_storage/lib/src/storage/io.dart:89:24 - The local variable '_file' starts with an underscore. Try renaming the variable to not start with an underscore. - no_leading_underscores_for_local_identifiers + info - packages/get_storage/lib/src/storage/io.dart:91:22 - Unnecessary 'new' keyword. Try removing the 'new' keyword. - unnecessary_new + info - packages/get_storage/lib/src/storage/io.dart:96:13 - The local variable '_file' starts with an underscore. Try renaming the variable to not start with an underscore. - no_leading_underscores_for_local_identifiers + info - packages/get_storage/lib/src/storage/io.dart:133:11 - The local variable '_path' starts with an underscore. Try renaming the variable to not start with an underscore. - no_leading_underscores_for_local_identifiers + info - packages/get_storage/lib/src/storage/io.dart:134:11 - The local variable '_file' starts with an underscore. Try renaming the variable to not start with an underscore. - no_leading_underscores_for_local_identifiers + info - packages/get_storage/lib/src/storage/io.dart:142:7 - Use 'rethrow' to rethrow a caught exception. Try replacing the 'throw' with a 'rethrow'. - use_rethrow_when_possible + info - packages/get_storage/lib/src/storage/io.dart:147:11 - The local variable '_isWindows' starts with an underscore. Try renaming the variable to not start with an underscore. - no_leading_underscores_for_local_identifiers + info - packages/get_storage/lib/src/storage/io.dart:148:11 - The local variable '_separator' starts with an underscore. Try renaming the variable to not start with an underscore. - no_leading_underscores_for_local_identifiers + info - packages/get_storage/lib/src/storage_impl.dart:49:7 - Use 'rethrow' to rethrow a caught exception. Try replacing the 'throw' with a 'rethrow'. - use_rethrow_when_possible + info - packages/get_storage/lib/src/storage_impl.dart:78:27 - The private field _keyListeners could be 'final'. Try making the field 'final'. - prefer_final_fields + info - packages/get_storage/lib/src/storage_impl.dart:81:24 - Use a function declaration rather than a variable assignment to bind a function to a name. Try rewriting the closure assignment as a function declaration. - prefer_function_declarations_over_variables + info - packages/get_storage/lib/src/value.dart:5:27 - Unnecessary 'this.' qualifier. Try removing 'this.'. - unnecessary_this + info - packages/get_storage/test/getstorage_test.dart:67:16 - Unnecessary 'new' keyword. Try removing the 'new' keyword. - unnecessary_new + info - packages/get_storage/test/getstorage_test.dart:89:16 - Unnecessary 'new' keyword. Try removing the 'new' keyword. - unnecessary_new + info - packages/get_storage/test/getstorage_test.dart:101:16 - Unnecessary 'new' keyword. Try removing the 'new' keyword. - unnecessary_new + info - packages/get_storage/test/getstorage_test.dart:126:30 - Use a function declaration rather than a variable assignment to bind a function to a name. Try rewriting the closure assignment as a function declaration. - prefer_function_declarations_over_variables + info - packages/get_storage/test/getstorage_test.dart:151:9 - The local variable '_path' starts with an underscore. Try renaming the variable to not start with an underscore. - no_leading_underscores_for_local_identifiers + info - packages/get_storage/test/getstorage_test.dart:152:9 - The local variable '_file' starts with an underscore. Try renaming the variable to not start with an underscore. - no_leading_underscores_for_local_identifiers + info - packages/get_storage/test/utils/list_equality.dart:1:11 - The constant name '_HASH_MASK' isn't a lowerCamelCase identifier. Try changing the name to follow the lowerCamelCase style. - constant_identifier_names + +943 issues found. diff --git a/siro_rider/android/.gitignore b/siro_rider/android/.gitignore new file mode 100644 index 0000000..55afd91 --- /dev/null +++ b/siro_rider/android/.gitignore @@ -0,0 +1,13 @@ +gradle-wrapper.jar +/.gradle +/captures/ +/gradlew +/gradlew.bat +/local.properties +GeneratedPluginRegistrant.java + +# Remember to never publicly share your keystore. +# See https://flutter.dev/to/reference-keystore +key.properties +**/*.keystore +**/*.jks diff --git a/siro_rider/android/app/.cxx/Debug/3p4b322x/arm64-v8a/.cmake/api/v1/query/client-agp/cache-v2 b/siro_rider/android/app/.cxx/Debug/3p4b322x/arm64-v8a/.cmake/api/v1/query/client-agp/cache-v2 new file mode 100644 index 0000000..e69de29 diff --git a/siro_rider/android/app/.cxx/Debug/3p4b322x/arm64-v8a/.cmake/api/v1/query/client-agp/cmakeFiles-v1 b/siro_rider/android/app/.cxx/Debug/3p4b322x/arm64-v8a/.cmake/api/v1/query/client-agp/cmakeFiles-v1 new file mode 100644 index 0000000..e69de29 diff --git a/siro_rider/android/app/.cxx/Debug/3p4b322x/arm64-v8a/.cmake/api/v1/query/client-agp/codemodel-v2 b/siro_rider/android/app/.cxx/Debug/3p4b322x/arm64-v8a/.cmake/api/v1/query/client-agp/codemodel-v2 new file mode 100644 index 0000000..e69de29 diff --git a/siro_rider/android/app/.cxx/Debug/3p4b322x/arm64-v8a/.cmake/api/v1/reply/cache-v2-ac68e6030ad9864cea0c.json b/siro_rider/android/app/.cxx/Debug/3p4b322x/arm64-v8a/.cmake/api/v1/reply/cache-v2-ac68e6030ad9864cea0c.json new file mode 100644 index 0000000..4e21628 --- /dev/null +++ b/siro_rider/android/app/.cxx/Debug/3p4b322x/arm64-v8a/.cmake/api/v1/reply/cache-v2-ac68e6030ad9864cea0c.json @@ -0,0 +1,1479 @@ +{ + "entries" : + [ + { + "name" : "ANDROID_ABI", + "properties" : + [ + { + "name" : "HELPSTRING", + "value" : "No help, variable specified on the command line." + } + ], + "type" : "UNINITIALIZED", + "value" : "arm64-v8a" + }, + { + "name" : "ANDROID_NDK", + "properties" : + [ + { + "name" : "HELPSTRING", + "value" : "No help, variable specified on the command line." + } + ], + "type" : "UNINITIALIZED", + "value" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973" + }, + { + "name" : "ANDROID_PLATFORM", + "properties" : + [ + { + "name" : "HELPSTRING", + "value" : "No help, variable specified on the command line." + } + ], + "type" : "UNINITIALIZED", + "value" : "android-23" + }, + { + "name" : "CMAKE_ADDR2LINE", + "properties" : + [ + { + "name" : "ADVANCED", + "value" : "1" + }, + { + "name" : "HELPSTRING", + "value" : "Path to a program." + } + ], + "type" : "FILEPATH", + "value" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/bin/llvm-addr2line" + }, + { + "name" : "CMAKE_ANDROID_ARCH_ABI", + "properties" : + [ + { + "name" : "HELPSTRING", + "value" : "No help, variable specified on the command line." + } + ], + "type" : "UNINITIALIZED", + "value" : "arm64-v8a" + }, + { + "name" : "CMAKE_ANDROID_NDK", + "properties" : + [ + { + "name" : "HELPSTRING", + "value" : "No help, variable specified on the command line." + } + ], + "type" : "UNINITIALIZED", + "value" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973" + }, + { + "name" : "CMAKE_AR", + "properties" : + [ + { + "name" : "ADVANCED", + "value" : "1" + }, + { + "name" : "HELPSTRING", + "value" : "Archiver" + } + ], + "type" : "FILEPATH", + "value" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/bin/llvm-ar" + }, + { + "name" : "CMAKE_ASM_FLAGS", + "properties" : + [ + { + "name" : "HELPSTRING", + "value" : "Flags used by the compiler during all build types." + } + ], + "type" : "STRING", + "value" : "" + }, + { + "name" : "CMAKE_ASM_FLAGS_DEBUG", + "properties" : + [ + { + "name" : "HELPSTRING", + "value" : "Flags used by the compiler during debug builds." + } + ], + "type" : "STRING", + "value" : "" + }, + { + "name" : "CMAKE_ASM_FLAGS_RELEASE", + "properties" : + [ + { + "name" : "HELPSTRING", + "value" : "Flags used by the compiler during release builds." + } + ], + "type" : "STRING", + "value" : "" + }, + { + "name" : "CMAKE_BUILD_TYPE", + "properties" : + [ + { + "name" : "HELPSTRING", + "value" : "Choose the type of build, options are: None Debug Release RelWithDebInfo MinSizeRel ..." + } + ], + "type" : "STRING", + "value" : "Debug" + }, + { + "name" : "CMAKE_CACHEFILE_DIR", + "properties" : + [ + { + "name" : "HELPSTRING", + "value" : "This is the directory where this CMakeCache.txt was created" + } + ], + "type" : "INTERNAL", + "value" : "/Users/hamzaaleghwairyeen/development/App/Intaleq/android/app/.cxx/Debug/3p4b322x/arm64-v8a" + }, + { + "name" : "CMAKE_CACHE_MAJOR_VERSION", + "properties" : + [ + { + "name" : "HELPSTRING", + "value" : "Major version of cmake used to create the current loaded cache" + } + ], + "type" : "INTERNAL", + "value" : "3" + }, + { + "name" : "CMAKE_CACHE_MINOR_VERSION", + "properties" : + [ + { + "name" : "HELPSTRING", + "value" : "Minor version of cmake used to create the current loaded cache" + } + ], + "type" : "INTERNAL", + "value" : "31" + }, + { + "name" : "CMAKE_CACHE_PATCH_VERSION", + "properties" : + [ + { + "name" : "HELPSTRING", + "value" : "Patch version of cmake used to create the current loaded cache" + } + ], + "type" : "INTERNAL", + "value" : "5" + }, + { + "name" : "CMAKE_COMMAND", + "properties" : + [ + { + "name" : "HELPSTRING", + "value" : "Path to CMake executable." + } + ], + "type" : "INTERNAL", + "value" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/bin/cmake" + }, + { + "name" : "CMAKE_CPACK_COMMAND", + "properties" : + [ + { + "name" : "HELPSTRING", + "value" : "Path to cpack program executable." + } + ], + "type" : "INTERNAL", + "value" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/bin/cpack" + }, + { + "name" : "CMAKE_CTEST_COMMAND", + "properties" : + [ + { + "name" : "HELPSTRING", + "value" : "Path to ctest program executable." + } + ], + "type" : "INTERNAL", + "value" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/bin/ctest" + }, + { + "name" : "CMAKE_CXX_COMPILER", + "properties" : + [ + { + "name" : "ADVANCED", + "value" : "1" + }, + { + "name" : "HELPSTRING", + "value" : "" + } + ], + "type" : "UNINITIALIZED", + "value" : "" + }, + { + "name" : "CMAKE_CXX_COMPILER_AR", + "properties" : + [ + { + "name" : "ADVANCED", + "value" : "1" + }, + { + "name" : "HELPSTRING", + "value" : "LLVM archiver" + } + ], + "type" : "FILEPATH", + "value" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/bin/llvm-ar" + }, + { + "name" : "CMAKE_CXX_COMPILER_CLANG_SCAN_DEPS", + "properties" : + [ + { + "name" : "ADVANCED", + "value" : "1" + }, + { + "name" : "HELPSTRING", + "value" : "`clang-scan-deps` dependency scanner" + } + ], + "type" : "FILEPATH", + "value" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/bin/clang-scan-deps" + }, + { + "name" : "CMAKE_CXX_COMPILER_RANLIB", + "properties" : + [ + { + "name" : "ADVANCED", + "value" : "1" + }, + { + "name" : "HELPSTRING", + "value" : "Generate index for LLVM archive" + } + ], + "type" : "FILEPATH", + "value" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/bin/llvm-ranlib" + }, + { + "name" : "CMAKE_CXX_FLAGS", + "properties" : + [ + { + "name" : "ADVANCED", + "value" : "1" + }, + { + "name" : "HELPSTRING", + "value" : "Flags used by the compiler during all build types." + } + ], + "type" : "STRING", + "value" : "" + }, + { + "name" : "CMAKE_CXX_FLAGS_DEBUG", + "properties" : + [ + { + "name" : "ADVANCED", + "value" : "1" + }, + { + "name" : "HELPSTRING", + "value" : "Flags used by the compiler during debug builds." + } + ], + "type" : "STRING", + "value" : "" + }, + { + "name" : "CMAKE_CXX_FLAGS_MINSIZEREL", + "properties" : + [ + { + "name" : "ADVANCED", + "value" : "1" + }, + { + "name" : "HELPSTRING", + "value" : "Flags used by the CXX compiler during MINSIZEREL builds." + } + ], + "type" : "STRING", + "value" : "-Os -DNDEBUG" + }, + { + "name" : "CMAKE_CXX_FLAGS_RELEASE", + "properties" : + [ + { + "name" : "ADVANCED", + "value" : "1" + }, + { + "name" : "HELPSTRING", + "value" : "Flags used by the compiler during release builds." + } + ], + "type" : "STRING", + "value" : "" + }, + { + "name" : "CMAKE_CXX_FLAGS_RELWITHDEBINFO", + "properties" : + [ + { + "name" : "ADVANCED", + "value" : "1" + }, + { + "name" : "HELPSTRING", + "value" : "Flags used by the CXX compiler during RELWITHDEBINFO builds." + } + ], + "type" : "STRING", + "value" : "-O2 -g -DNDEBUG" + }, + { + "name" : "CMAKE_CXX_STANDARD_LIBRARIES", + "properties" : + [ + { + "name" : "ADVANCED", + "value" : "1" + }, + { + "name" : "HELPSTRING", + "value" : "Libraries linked by default with all C++ applications." + } + ], + "type" : "STRING", + "value" : "-latomic -lm" + }, + { + "name" : "CMAKE_C_COMPILER", + "properties" : + [ + { + "name" : "ADVANCED", + "value" : "1" + }, + { + "name" : "HELPSTRING", + "value" : "" + } + ], + "type" : "UNINITIALIZED", + "value" : "" + }, + { + "name" : "CMAKE_C_COMPILER_AR", + "properties" : + [ + { + "name" : "ADVANCED", + "value" : "1" + }, + { + "name" : "HELPSTRING", + "value" : "LLVM archiver" + } + ], + "type" : "FILEPATH", + "value" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/bin/llvm-ar" + }, + { + "name" : "CMAKE_C_COMPILER_CLANG_SCAN_DEPS", + "properties" : + [ + { + "name" : "ADVANCED", + "value" : "1" + }, + { + "name" : "HELPSTRING", + "value" : "`clang-scan-deps` dependency scanner" + } + ], + "type" : "FILEPATH", + "value" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/bin/clang-scan-deps" + }, + { + "name" : "CMAKE_C_COMPILER_RANLIB", + "properties" : + [ + { + "name" : "ADVANCED", + "value" : "1" + }, + { + "name" : "HELPSTRING", + "value" : "Generate index for LLVM archive" + } + ], + "type" : "FILEPATH", + "value" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/bin/llvm-ranlib" + }, + { + "name" : "CMAKE_C_FLAGS", + "properties" : + [ + { + "name" : "ADVANCED", + "value" : "1" + }, + { + "name" : "HELPSTRING", + "value" : "Flags used by the compiler during all build types." + } + ], + "type" : "STRING", + "value" : "" + }, + { + "name" : "CMAKE_C_FLAGS_DEBUG", + "properties" : + [ + { + "name" : "ADVANCED", + "value" : "1" + }, + { + "name" : "HELPSTRING", + "value" : "Flags used by the compiler during debug builds." + } + ], + "type" : "STRING", + "value" : "" + }, + { + "name" : "CMAKE_C_FLAGS_MINSIZEREL", + "properties" : + [ + { + "name" : "ADVANCED", + "value" : "1" + }, + { + "name" : "HELPSTRING", + "value" : "Flags used by the C compiler during MINSIZEREL builds." + } + ], + "type" : "STRING", + "value" : "-Os -DNDEBUG" + }, + { + "name" : "CMAKE_C_FLAGS_RELEASE", + "properties" : + [ + { + "name" : "ADVANCED", + "value" : "1" + }, + { + "name" : "HELPSTRING", + "value" : "Flags used by the compiler during release builds." + } + ], + "type" : "STRING", + "value" : "" + }, + { + "name" : "CMAKE_C_FLAGS_RELWITHDEBINFO", + "properties" : + [ + { + "name" : "ADVANCED", + "value" : "1" + }, + { + "name" : "HELPSTRING", + "value" : "Flags used by the C compiler during RELWITHDEBINFO builds." + } + ], + "type" : "STRING", + "value" : "-O2 -g -DNDEBUG" + }, + { + "name" : "CMAKE_C_STANDARD_LIBRARIES", + "properties" : + [ + { + "name" : "ADVANCED", + "value" : "1" + }, + { + "name" : "HELPSTRING", + "value" : "Libraries linked by default with all C applications." + } + ], + "type" : "STRING", + "value" : "-latomic -lm" + }, + { + "name" : "CMAKE_DLLTOOL", + "properties" : + [ + { + "name" : "ADVANCED", + "value" : "1" + }, + { + "name" : "HELPSTRING", + "value" : "Path to a program." + } + ], + "type" : "FILEPATH", + "value" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/bin/llvm-dlltool" + }, + { + "name" : "CMAKE_EDIT_COMMAND", + "properties" : + [ + { + "name" : "HELPSTRING", + "value" : "Path to cache edit program executable." + } + ], + "type" : "INTERNAL", + "value" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/bin/ccmake" + }, + { + "name" : "CMAKE_EXECUTABLE_FORMAT", + "properties" : + [ + { + "name" : "HELPSTRING", + "value" : "Executable file format" + } + ], + "type" : "INTERNAL", + "value" : "ELF" + }, + { + "name" : "CMAKE_EXE_LINKER_FLAGS", + "properties" : + [ + { + "name" : "ADVANCED", + "value" : "1" + }, + { + "name" : "HELPSTRING", + "value" : "Flags used by the linker." + } + ], + "type" : "STRING", + "value" : "" + }, + { + "name" : "CMAKE_EXE_LINKER_FLAGS_DEBUG", + "properties" : + [ + { + "name" : "ADVANCED", + "value" : "1" + }, + { + "name" : "HELPSTRING", + "value" : "Flags used by the linker during DEBUG builds." + } + ], + "type" : "STRING", + "value" : "" + }, + { + "name" : "CMAKE_EXE_LINKER_FLAGS_MINSIZEREL", + "properties" : + [ + { + "name" : "ADVANCED", + "value" : "1" + }, + { + "name" : "HELPSTRING", + "value" : "Flags used by the linker during MINSIZEREL builds." + } + ], + "type" : "STRING", + "value" : "" + }, + { + "name" : "CMAKE_EXE_LINKER_FLAGS_RELEASE", + "properties" : + [ + { + "name" : "ADVANCED", + "value" : "1" + }, + { + "name" : "HELPSTRING", + "value" : "Flags used by the linker during RELEASE builds." + } + ], + "type" : "STRING", + "value" : "" + }, + { + "name" : "CMAKE_EXE_LINKER_FLAGS_RELWITHDEBINFO", + "properties" : + [ + { + "name" : "ADVANCED", + "value" : "1" + }, + { + "name" : "HELPSTRING", + "value" : "Flags used by the linker during RELWITHDEBINFO builds." + } + ], + "type" : "STRING", + "value" : "" + }, + { + "name" : "CMAKE_EXPORT_BUILD_DATABASE", + "properties" : + [ + { + "name" : "ADVANCED", + "value" : "1" + }, + { + "name" : "HELPSTRING", + "value" : "Enable/Disable output of build database during the build." + } + ], + "type" : "BOOL", + "value" : "" + }, + { + "name" : "CMAKE_EXPORT_COMPILE_COMMANDS", + "properties" : + [ + { + "name" : "HELPSTRING", + "value" : "No help, variable specified on the command line." + } + ], + "type" : "UNINITIALIZED", + "value" : "ON" + }, + { + "name" : "CMAKE_EXTRA_GENERATOR", + "properties" : + [ + { + "name" : "HELPSTRING", + "value" : "Name of external makefile project generator." + } + ], + "type" : "INTERNAL", + "value" : "" + }, + { + "name" : "CMAKE_FIND_PACKAGE_REDIRECTS_DIR", + "properties" : + [ + { + "name" : "HELPSTRING", + "value" : "Value Computed by CMake." + } + ], + "type" : "STATIC", + "value" : "/Users/hamzaaleghwairyeen/development/App/Intaleq/android/app/.cxx/Debug/3p4b322x/arm64-v8a/CMakeFiles/pkgRedirects" + }, + { + "name" : "CMAKE_GENERATOR", + "properties" : + [ + { + "name" : "HELPSTRING", + "value" : "Name of generator." + } + ], + "type" : "INTERNAL", + "value" : "Ninja" + }, + { + "name" : "CMAKE_GENERATOR_INSTANCE", + "properties" : + [ + { + "name" : "HELPSTRING", + "value" : "Generator instance identifier." + } + ], + "type" : "INTERNAL", + "value" : "" + }, + { + "name" : "CMAKE_GENERATOR_PLATFORM", + "properties" : + [ + { + "name" : "HELPSTRING", + "value" : "Name of generator platform." + } + ], + "type" : "INTERNAL", + "value" : "" + }, + { + "name" : "CMAKE_GENERATOR_TOOLSET", + "properties" : + [ + { + "name" : "HELPSTRING", + "value" : "Name of generator toolset." + } + ], + "type" : "INTERNAL", + "value" : "" + }, + { + "name" : "CMAKE_HOME_DIRECTORY", + "properties" : + [ + { + "name" : "HELPSTRING", + "value" : "Source directory with the top level CMakeLists.txt file for this project" + } + ], + "type" : "INTERNAL", + "value" : "/Users/hamzaaleghwairyeen/development/App/Intaleq/android/app/src/main/cpp" + }, + { + "name" : "CMAKE_INSTALL_PREFIX", + "properties" : + [ + { + "name" : "HELPSTRING", + "value" : "Install path prefix, prepended onto install directories." + } + ], + "type" : "PATH", + "value" : "/usr/local" + }, + { + "name" : "CMAKE_INSTALL_SO_NO_EXE", + "properties" : + [ + { + "name" : "HELPSTRING", + "value" : "Install .so files without execute permission." + } + ], + "type" : "INTERNAL", + "value" : "0" + }, + { + "name" : "CMAKE_LIBRARY_OUTPUT_DIRECTORY", + "properties" : + [ + { + "name" : "HELPSTRING", + "value" : "No help, variable specified on the command line." + } + ], + "type" : "UNINITIALIZED", + "value" : "/Users/hamzaaleghwairyeen/development/App/Intaleq/build/app/intermediates/cxx/Debug/3p4b322x/obj/arm64-v8a" + }, + { + "name" : "CMAKE_LINKER", + "properties" : + [ + { + "name" : "ADVANCED", + "value" : "1" + }, + { + "name" : "HELPSTRING", + "value" : "Path to a program." + } + ], + "type" : "FILEPATH", + "value" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/bin/ld.lld" + }, + { + "name" : "CMAKE_MAKE_PROGRAM", + "properties" : + [ + { + "name" : "HELPSTRING", + "value" : "No help, variable specified on the command line." + } + ], + "type" : "UNINITIALIZED", + "value" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/bin/ninja" + }, + { + "name" : "CMAKE_MODULE_LINKER_FLAGS", + "properties" : + [ + { + "name" : "ADVANCED", + "value" : "1" + }, + { + "name" : "HELPSTRING", + "value" : "Flags used by the linker during the creation of modules." + } + ], + "type" : "STRING", + "value" : "" + }, + { + "name" : "CMAKE_MODULE_LINKER_FLAGS_DEBUG", + "properties" : + [ + { + "name" : "ADVANCED", + "value" : "1" + }, + { + "name" : "HELPSTRING", + "value" : "Flags used by the linker during the creation of modules during DEBUG builds." + } + ], + "type" : "STRING", + "value" : "" + }, + { + "name" : "CMAKE_MODULE_LINKER_FLAGS_MINSIZEREL", + "properties" : + [ + { + "name" : "ADVANCED", + "value" : "1" + }, + { + "name" : "HELPSTRING", + "value" : "Flags used by the linker during the creation of modules during MINSIZEREL builds." + } + ], + "type" : "STRING", + "value" : "" + }, + { + "name" : "CMAKE_MODULE_LINKER_FLAGS_RELEASE", + "properties" : + [ + { + "name" : "ADVANCED", + "value" : "1" + }, + { + "name" : "HELPSTRING", + "value" : "Flags used by the linker during the creation of modules during RELEASE builds." + } + ], + "type" : "STRING", + "value" : "" + }, + { + "name" : "CMAKE_MODULE_LINKER_FLAGS_RELWITHDEBINFO", + "properties" : + [ + { + "name" : "ADVANCED", + "value" : "1" + }, + { + "name" : "HELPSTRING", + "value" : "Flags used by the linker during the creation of modules during RELWITHDEBINFO builds." + } + ], + "type" : "STRING", + "value" : "" + }, + { + "name" : "CMAKE_NM", + "properties" : + [ + { + "name" : "ADVANCED", + "value" : "1" + }, + { + "name" : "HELPSTRING", + "value" : "Path to a program." + } + ], + "type" : "FILEPATH", + "value" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/bin/llvm-nm" + }, + { + "name" : "CMAKE_NUMBER_OF_MAKEFILES", + "properties" : + [ + { + "name" : "HELPSTRING", + "value" : "number of local generators" + } + ], + "type" : "INTERNAL", + "value" : "1" + }, + { + "name" : "CMAKE_OBJCOPY", + "properties" : + [ + { + "name" : "ADVANCED", + "value" : "1" + }, + { + "name" : "HELPSTRING", + "value" : "Path to a program." + } + ], + "type" : "FILEPATH", + "value" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/bin/llvm-objcopy" + }, + { + "name" : "CMAKE_OBJDUMP", + "properties" : + [ + { + "name" : "ADVANCED", + "value" : "1" + }, + { + "name" : "HELPSTRING", + "value" : "Path to a program." + } + ], + "type" : "FILEPATH", + "value" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/bin/llvm-objdump" + }, + { + "name" : "CMAKE_PLATFORM_INFO_INITIALIZED", + "properties" : + [ + { + "name" : "HELPSTRING", + "value" : "Platform information initialized" + } + ], + "type" : "INTERNAL", + "value" : "1" + }, + { + "name" : "CMAKE_PROJECT_DESCRIPTION", + "properties" : + [ + { + "name" : "HELPSTRING", + "value" : "Value Computed by CMake" + } + ], + "type" : "STATIC", + "value" : "" + }, + { + "name" : "CMAKE_PROJECT_HOMEPAGE_URL", + "properties" : + [ + { + "name" : "HELPSTRING", + "value" : "Value Computed by CMake" + } + ], + "type" : "STATIC", + "value" : "" + }, + { + "name" : "CMAKE_PROJECT_NAME", + "properties" : + [ + { + "name" : "HELPSTRING", + "value" : "Value Computed by CMake" + } + ], + "type" : "STATIC", + "value" : "intaleq" + }, + { + "name" : "CMAKE_RANLIB", + "properties" : + [ + { + "name" : "ADVANCED", + "value" : "1" + }, + { + "name" : "HELPSTRING", + "value" : "Ranlib" + } + ], + "type" : "FILEPATH", + "value" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/bin/llvm-ranlib" + }, + { + "name" : "CMAKE_READELF", + "properties" : + [ + { + "name" : "ADVANCED", + "value" : "1" + }, + { + "name" : "HELPSTRING", + "value" : "Path to a program." + } + ], + "type" : "FILEPATH", + "value" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/bin/llvm-readelf" + }, + { + "name" : "CMAKE_ROOT", + "properties" : + [ + { + "name" : "HELPSTRING", + "value" : "Path to CMake installation." + } + ], + "type" : "INTERNAL", + "value" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31" + }, + { + "name" : "CMAKE_RUNTIME_OUTPUT_DIRECTORY", + "properties" : + [ + { + "name" : "HELPSTRING", + "value" : "No help, variable specified on the command line." + } + ], + "type" : "UNINITIALIZED", + "value" : "/Users/hamzaaleghwairyeen/development/App/Intaleq/build/app/intermediates/cxx/Debug/3p4b322x/obj/arm64-v8a" + }, + { + "name" : "CMAKE_SHARED_LINKER_FLAGS", + "properties" : + [ + { + "name" : "ADVANCED", + "value" : "1" + }, + { + "name" : "HELPSTRING", + "value" : "Flags used by the linker during the creation of dll's." + } + ], + "type" : "STRING", + "value" : "" + }, + { + "name" : "CMAKE_SHARED_LINKER_FLAGS_DEBUG", + "properties" : + [ + { + "name" : "ADVANCED", + "value" : "1" + }, + { + "name" : "HELPSTRING", + "value" : "Flags used by the linker during the creation of shared libraries during DEBUG builds." + } + ], + "type" : "STRING", + "value" : "" + }, + { + "name" : "CMAKE_SHARED_LINKER_FLAGS_MINSIZEREL", + "properties" : + [ + { + "name" : "ADVANCED", + "value" : "1" + }, + { + "name" : "HELPSTRING", + "value" : "Flags used by the linker during the creation of shared libraries during MINSIZEREL builds." + } + ], + "type" : "STRING", + "value" : "" + }, + { + "name" : "CMAKE_SHARED_LINKER_FLAGS_RELEASE", + "properties" : + [ + { + "name" : "ADVANCED", + "value" : "1" + }, + { + "name" : "HELPSTRING", + "value" : "Flags used by the linker during the creation of shared libraries during RELEASE builds." + } + ], + "type" : "STRING", + "value" : "" + }, + { + "name" : "CMAKE_SHARED_LINKER_FLAGS_RELWITHDEBINFO", + "properties" : + [ + { + "name" : "ADVANCED", + "value" : "1" + }, + { + "name" : "HELPSTRING", + "value" : "Flags used by the linker during the creation of shared libraries during RELWITHDEBINFO builds." + } + ], + "type" : "STRING", + "value" : "" + }, + { + "name" : "CMAKE_SKIP_INSTALL_RPATH", + "properties" : + [ + { + "name" : "ADVANCED", + "value" : "1" + }, + { + "name" : "HELPSTRING", + "value" : "If set, runtime paths are not added when installing shared libraries, but are added when building." + } + ], + "type" : "BOOL", + "value" : "NO" + }, + { + "name" : "CMAKE_SKIP_RPATH", + "properties" : + [ + { + "name" : "ADVANCED", + "value" : "1" + }, + { + "name" : "HELPSTRING", + "value" : "If set, runtime paths are not added when using shared libraries." + } + ], + "type" : "BOOL", + "value" : "NO" + }, + { + "name" : "CMAKE_STATIC_LINKER_FLAGS", + "properties" : + [ + { + "name" : "ADVANCED", + "value" : "1" + }, + { + "name" : "HELPSTRING", + "value" : "Flags used by the linker during the creation of static libraries during all build types." + } + ], + "type" : "STRING", + "value" : "" + }, + { + "name" : "CMAKE_STATIC_LINKER_FLAGS_DEBUG", + "properties" : + [ + { + "name" : "ADVANCED", + "value" : "1" + }, + { + "name" : "HELPSTRING", + "value" : "Flags used by the linker during the creation of static libraries during DEBUG builds." + } + ], + "type" : "STRING", + "value" : "" + }, + { + "name" : "CMAKE_STATIC_LINKER_FLAGS_MINSIZEREL", + "properties" : + [ + { + "name" : "ADVANCED", + "value" : "1" + }, + { + "name" : "HELPSTRING", + "value" : "Flags used by the linker during the creation of static libraries during MINSIZEREL builds." + } + ], + "type" : "STRING", + "value" : "" + }, + { + "name" : "CMAKE_STATIC_LINKER_FLAGS_RELEASE", + "properties" : + [ + { + "name" : "ADVANCED", + "value" : "1" + }, + { + "name" : "HELPSTRING", + "value" : "Flags used by the linker during the creation of static libraries during RELEASE builds." + } + ], + "type" : "STRING", + "value" : "" + }, + { + "name" : "CMAKE_STATIC_LINKER_FLAGS_RELWITHDEBINFO", + "properties" : + [ + { + "name" : "ADVANCED", + "value" : "1" + }, + { + "name" : "HELPSTRING", + "value" : "Flags used by the linker during the creation of static libraries during RELWITHDEBINFO builds." + } + ], + "type" : "STRING", + "value" : "" + }, + { + "name" : "CMAKE_STRIP", + "properties" : + [ + { + "name" : "ADVANCED", + "value" : "1" + }, + { + "name" : "HELPSTRING", + "value" : "Strip" + } + ], + "type" : "FILEPATH", + "value" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/bin/llvm-strip" + }, + { + "name" : "CMAKE_SYSTEM_NAME", + "properties" : + [ + { + "name" : "HELPSTRING", + "value" : "No help, variable specified on the command line." + } + ], + "type" : "UNINITIALIZED", + "value" : "Android" + }, + { + "name" : "CMAKE_SYSTEM_VERSION", + "properties" : + [ + { + "name" : "HELPSTRING", + "value" : "No help, variable specified on the command line." + } + ], + "type" : "UNINITIALIZED", + "value" : "23" + }, + { + "name" : "CMAKE_TAPI", + "properties" : + [ + { + "name" : "ADVANCED", + "value" : "1" + }, + { + "name" : "HELPSTRING", + "value" : "Path to a program." + } + ], + "type" : "FILEPATH", + "value" : "CMAKE_TAPI-NOTFOUND" + }, + { + "name" : "CMAKE_TOOLCHAIN_FILE", + "properties" : + [ + { + "name" : "HELPSTRING", + "value" : "The CMake toolchain file" + } + ], + "type" : "FILEPATH", + "value" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/build/cmake/android.toolchain.cmake" + }, + { + "name" : "CMAKE_UNAME", + "properties" : + [ + { + "name" : "HELPSTRING", + "value" : "uname command" + } + ], + "type" : "INTERNAL", + "value" : "/usr/bin/uname" + }, + { + "name" : "CMAKE_VERBOSE_MAKEFILE", + "properties" : + [ + { + "name" : "ADVANCED", + "value" : "1" + }, + { + "name" : "HELPSTRING", + "value" : "If this value is on, makefiles will be generated without the .SILENT directive, and all commands will be echoed to the console during the make. This is useful for debugging only. With Visual Studio IDE projects all commands are done without /nologo." + } + ], + "type" : "BOOL", + "value" : "FALSE" + }, + { + "name" : "_CMAKE_CXX_LINKER_PUSHPOP_STATE_SUPPORTED", + "properties" : + [ + { + "name" : "HELPSTRING", + "value" : "linker supports push/pop state" + } + ], + "type" : "INTERNAL", + "value" : "TRUE" + }, + { + "name" : "_CMAKE_C_LINKER_PUSHPOP_STATE_SUPPORTED", + "properties" : + [ + { + "name" : "HELPSTRING", + "value" : "linker supports push/pop state" + } + ], + "type" : "INTERNAL", + "value" : "TRUE" + }, + { + "name" : "_CMAKE_LINKER_PUSHPOP_STATE_SUPPORTED", + "properties" : + [ + { + "name" : "HELPSTRING", + "value" : "linker supports push/pop state" + } + ], + "type" : "INTERNAL", + "value" : "TRUE" + }, + { + "name" : "intaleq_BINARY_DIR", + "properties" : + [ + { + "name" : "HELPSTRING", + "value" : "Value Computed by CMake" + } + ], + "type" : "STATIC", + "value" : "/Users/hamzaaleghwairyeen/development/App/Intaleq/android/app/.cxx/Debug/3p4b322x/arm64-v8a" + }, + { + "name" : "intaleq_IS_TOP_LEVEL", + "properties" : + [ + { + "name" : "HELPSTRING", + "value" : "Value Computed by CMake" + } + ], + "type" : "STATIC", + "value" : "ON" + }, + { + "name" : "intaleq_SOURCE_DIR", + "properties" : + [ + { + "name" : "HELPSTRING", + "value" : "Value Computed by CMake" + } + ], + "type" : "STATIC", + "value" : "/Users/hamzaaleghwairyeen/development/App/Intaleq/android/app/src/main/cpp" + }, + { + "name" : "log-lib", + "properties" : + [ + { + "name" : "HELPSTRING", + "value" : "Path to a library." + } + ], + "type" : "FILEPATH", + "value" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/lib/aarch64-linux-android/23/liblog.so" + }, + { + "name" : "native-lib_LIB_DEPENDS", + "properties" : + [ + { + "name" : "HELPSTRING", + "value" : "Dependencies for the target" + } + ], + "type" : "STATIC", + "value" : "general;/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/lib/aarch64-linux-android/23/liblog.so;" + } + ], + "kind" : "cache", + "version" : + { + "major" : 2, + "minor" : 0 + } +} diff --git a/siro_rider/android/app/.cxx/Debug/3p4b322x/arm64-v8a/.cmake/api/v1/reply/cmakeFiles-v1-c7966f8678bacc51340d.json b/siro_rider/android/app/.cxx/Debug/3p4b322x/arm64-v8a/.cmake/api/v1/reply/cmakeFiles-v1-c7966f8678bacc51340d.json new file mode 100644 index 0000000..4104473 --- /dev/null +++ b/siro_rider/android/app/.cxx/Debug/3p4b322x/arm64-v8a/.cmake/api/v1/reply/cmakeFiles-v1-c7966f8678bacc51340d.json @@ -0,0 +1,968 @@ +{ + "inputs" : + [ + { + "path" : "CMakeLists.txt" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeDetermineSystem.cmake" + }, + { + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/build/cmake/android.toolchain.cmake" + }, + { + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/build/cmake/android-legacy.toolchain.cmake" + }, + { + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/build/cmake/abis.cmake" + }, + { + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/build/cmake/platforms.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Platform/Android-Determine.cmake" + }, + { + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/build/cmake/hooks/pre/Android-Determine.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeSystem.cmake.in" + }, + { + "isGenerated" : true, + "path" : "/Users/hamzaaleghwairyeen/development/App/Intaleq/android/app/.cxx/Debug/3p4b322x/arm64-v8a/CMakeFiles/3.31.5-g6cf5163/CMakeSystem.cmake" + }, + { + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/build/cmake/android.toolchain.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeSystemSpecificInitialize.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Platform/Android-Initialize.cmake" + }, + { + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/build/cmake/hooks/pre/Android-Initialize.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Platform/Linux-Initialize.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeDetermineCCompiler.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeDetermineCompiler.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Platform/Android-Determine-C.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Platform/Android/Determine-Compiler.cmake" + }, + { + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/build/cmake/hooks/pre/Determine-Compiler.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeDetermineCompilerId.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeCompilerIdDetection.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/ADSP-DetermineCompiler.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/ARMCC-DetermineCompiler.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/ARMClang-DetermineCompiler.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/AppleClang-DetermineCompiler.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/Clang-DetermineCompilerInternal.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/Borland-DetermineCompiler.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/Bruce-C-DetermineCompiler.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/Clang-DetermineCompiler.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/Clang-DetermineCompilerInternal.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/Compaq-C-DetermineCompiler.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/Cray-DetermineCompiler.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/CrayClang-DetermineCompiler.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/Embarcadero-DetermineCompiler.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/Fujitsu-DetermineCompiler.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/FujitsuClang-DetermineCompiler.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/GHS-DetermineCompiler.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/GNU-C-DetermineCompiler.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/HP-C-DetermineCompiler.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/IAR-DetermineCompiler.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/IBMClang-C-DetermineCompiler.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/Intel-DetermineCompiler.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/IntelLLVM-DetermineCompiler.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/LCC-C-DetermineCompiler.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/MSVC-DetermineCompiler.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/NVHPC-DetermineCompiler.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/NVIDIA-DetermineCompiler.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/OpenWatcom-DetermineCompiler.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/OrangeC-DetermineCompiler.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/PGI-DetermineCompiler.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/PathScale-DetermineCompiler.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/SCO-DetermineCompiler.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/SDCC-C-DetermineCompiler.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/SunPro-C-DetermineCompiler.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/TI-DetermineCompiler.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/TIClang-DetermineCompiler.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/Tasking-DetermineCompiler.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/TinyCC-C-DetermineCompiler.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/VisualAge-C-DetermineCompiler.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/IBMCPP-C-DetermineVersionInternal.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/Watcom-DetermineCompiler.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/XL-C-DetermineCompiler.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/IBMCPP-C-DetermineVersionInternal.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/XLClang-C-DetermineCompiler.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/zOS-C-DetermineCompiler.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/IBMCPP-C-DetermineVersionInternal.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeFindBinUtils.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/Clang-FindBinUtils.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeCCompiler.cmake.in" + }, + { + "isGenerated" : true, + "path" : "/Users/hamzaaleghwairyeen/development/App/Intaleq/android/app/.cxx/Debug/3p4b322x/arm64-v8a/CMakeFiles/3.31.5-g6cf5163/CMakeCCompiler.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeDetermineCXXCompiler.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeDetermineCompiler.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Platform/Android-Determine-CXX.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Platform/Android/Determine-Compiler.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeDetermineCompilerId.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeCompilerIdDetection.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/ADSP-DetermineCompiler.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/ARMCC-DetermineCompiler.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/ARMClang-DetermineCompiler.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/AppleClang-DetermineCompiler.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/Clang-DetermineCompilerInternal.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/Borland-DetermineCompiler.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/Clang-DetermineCompiler.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/Clang-DetermineCompilerInternal.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/Compaq-CXX-DetermineCompiler.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/Cray-DetermineCompiler.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/CrayClang-DetermineCompiler.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/Embarcadero-DetermineCompiler.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/Fujitsu-DetermineCompiler.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/FujitsuClang-DetermineCompiler.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/GHS-DetermineCompiler.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/GNU-CXX-DetermineCompiler.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/HP-CXX-DetermineCompiler.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/IAR-DetermineCompiler.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/IBMClang-CXX-DetermineCompiler.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/Intel-DetermineCompiler.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/IntelLLVM-DetermineCompiler.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/LCC-CXX-DetermineCompiler.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/MSVC-DetermineCompiler.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/NVHPC-DetermineCompiler.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/NVIDIA-DetermineCompiler.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/OpenWatcom-DetermineCompiler.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/OrangeC-DetermineCompiler.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/PGI-DetermineCompiler.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/PathScale-DetermineCompiler.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/SCO-DetermineCompiler.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/SunPro-CXX-DetermineCompiler.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/TI-DetermineCompiler.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/TIClang-DetermineCompiler.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/Tasking-DetermineCompiler.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/VisualAge-CXX-DetermineCompiler.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/IBMCPP-CXX-DetermineVersionInternal.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/Watcom-DetermineCompiler.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/XL-CXX-DetermineCompiler.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/IBMCPP-CXX-DetermineVersionInternal.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/XLClang-CXX-DetermineCompiler.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/zOS-CXX-DetermineCompiler.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/IBMCPP-CXX-DetermineVersionInternal.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeFindBinUtils.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/Clang-FindBinUtils.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeCXXCompiler.cmake.in" + }, + { + "isGenerated" : true, + "path" : "/Users/hamzaaleghwairyeen/development/App/Intaleq/android/app/.cxx/Debug/3p4b322x/arm64-v8a/CMakeFiles/3.31.5-g6cf5163/CMakeCXXCompiler.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeSystemSpecificInformation.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeGenericSystem.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeInitializeConfigs.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Platform/Android.cmake" + }, + { + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/build/cmake/hooks/pre/Android.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Platform/Linux.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Platform/UnixPaths.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeCInformation.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeLanguageInformation.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/Clang-C.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/Clang.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/CMakeCommonCompilerMacros.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/GNU.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/CMakeCommonCompilerMacros.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Platform/Android-Clang-C.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Platform/Android-Clang.cmake" + }, + { + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/build/cmake/hooks/pre/Android-Clang.cmake" + }, + { + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/build/cmake/flags.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeCommonLanguageInclude.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeTestCCompiler.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeTestCompilerCommon.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeDetermineCompilerABI.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Internal/CMakeDetermineLinkerId.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeParseImplicitIncludeInfo.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeParseImplicitLinkInfo.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeParseLibraryArchitecture.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeTestCompilerCommon.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeCCompilerABI.c" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeDetermineCompilerSupport.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Internal/FeatureTesting.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeCCompiler.cmake.in" + }, + { + "isGenerated" : true, + "path" : "/Users/hamzaaleghwairyeen/development/App/Intaleq/android/app/.cxx/Debug/3p4b322x/arm64-v8a/CMakeFiles/3.31.5-g6cf5163/CMakeCCompiler.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Internal/CMakeCLinkerInformation.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Internal/CMakeCommonLinkerInformation.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Linker/LLD-C.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Linker/LLD.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Linker/GNU.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Platform/Linker/Android-LLD-C.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Platform/Linker/Linux-LLD-C.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Platform/Linker/Linux-LLD.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Platform/Linker/Linux-GNU.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Platform/Linker/GNU.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeCXXInformation.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeLanguageInformation.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/Clang-CXX.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/Clang.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Platform/Android-Clang-CXX.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Platform/Android-Clang.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeCommonLanguageInclude.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeTestCXXCompiler.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeTestCompilerCommon.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeDetermineCompilerABI.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Internal/CMakeDetermineLinkerId.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeParseImplicitIncludeInfo.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeParseImplicitLinkInfo.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeParseLibraryArchitecture.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeTestCompilerCommon.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeCXXCompilerABI.cpp" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeDetermineCompilerSupport.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Internal/FeatureTesting.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/Clang-CXX-CXXImportStd.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/Clang-CXX-CXXImportStd.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeCXXCompiler.cmake.in" + }, + { + "isGenerated" : true, + "path" : "/Users/hamzaaleghwairyeen/development/App/Intaleq/android/app/.cxx/Debug/3p4b322x/arm64-v8a/CMakeFiles/3.31.5-g6cf5163/CMakeCXXCompiler.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Internal/CMakeCXXLinkerInformation.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Internal/CMakeCommonLinkerInformation.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Linker/LLD-CXX.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Linker/LLD.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Platform/Linker/Android-LLD-CXX.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Platform/Linker/Linux-LLD-CXX.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Platform/Linker/Linux-LLD.cmake" + } + ], + "kind" : "cmakeFiles", + "paths" : + { + "build" : "/Users/hamzaaleghwairyeen/development/App/Intaleq/android/app/.cxx/Debug/3p4b322x/arm64-v8a", + "source" : "/Users/hamzaaleghwairyeen/development/App/Intaleq/android/app/src/main/cpp" + }, + "version" : + { + "major" : 1, + "minor" : 1 + } +} diff --git a/siro_rider/android/app/.cxx/Debug/3p4b322x/arm64-v8a/.cmake/api/v1/reply/codemodel-v2-3341f8efb12b0cdce1a6.json b/siro_rider/android/app/.cxx/Debug/3p4b322x/arm64-v8a/.cmake/api/v1/reply/codemodel-v2-3341f8efb12b0cdce1a6.json new file mode 100644 index 0000000..cb48a34 --- /dev/null +++ b/siro_rider/android/app/.cxx/Debug/3p4b322x/arm64-v8a/.cmake/api/v1/reply/codemodel-v2-3341f8efb12b0cdce1a6.json @@ -0,0 +1,60 @@ +{ + "configurations" : + [ + { + "directories" : + [ + { + "build" : ".", + "jsonFile" : "directory-.-Debug-f5ebdc15457944623624.json", + "minimumCMakeVersion" : + { + "string" : "3.6.0" + }, + "projectIndex" : 0, + "source" : ".", + "targetIndexes" : + [ + 0 + ] + } + ], + "name" : "Debug", + "projects" : + [ + { + "directoryIndexes" : + [ + 0 + ], + "name" : "intaleq", + "targetIndexes" : + [ + 0 + ] + } + ], + "targets" : + [ + { + "directoryIndex" : 0, + "id" : "native-lib::@6890427a1f51a3e7e1df", + "jsonFile" : "target-native-lib-Debug-4f3f22efb16e3d7daf88.json", + "name" : "native-lib", + "projectIndex" : 0 + } + ] + } + ], + "kind" : "codemodel", + "paths" : + { + "build" : "/Users/hamzaaleghwairyeen/development/App/Intaleq/android/app/.cxx/Debug/3p4b322x/arm64-v8a", + "source" : "/Users/hamzaaleghwairyeen/development/App/Intaleq/android/app/src/main/cpp" + }, + "version" : + { + "major" : 2, + "minor" : 7 + } +} diff --git a/siro_rider/android/app/.cxx/Debug/3p4b322x/arm64-v8a/.cmake/api/v1/reply/directory-.-Debug-f5ebdc15457944623624.json b/siro_rider/android/app/.cxx/Debug/3p4b322x/arm64-v8a/.cmake/api/v1/reply/directory-.-Debug-f5ebdc15457944623624.json new file mode 100644 index 0000000..3a67af9 --- /dev/null +++ b/siro_rider/android/app/.cxx/Debug/3p4b322x/arm64-v8a/.cmake/api/v1/reply/directory-.-Debug-f5ebdc15457944623624.json @@ -0,0 +1,14 @@ +{ + "backtraceGraph" : + { + "commands" : [], + "files" : [], + "nodes" : [] + }, + "installers" : [], + "paths" : + { + "build" : ".", + "source" : "." + } +} diff --git a/siro_rider/android/app/.cxx/Debug/3p4b322x/arm64-v8a/.cmake/api/v1/reply/index-2025-07-02T19-25-16-0601.json b/siro_rider/android/app/.cxx/Debug/3p4b322x/arm64-v8a/.cmake/api/v1/reply/index-2025-07-02T19-25-16-0601.json new file mode 100644 index 0000000..167c9b3 --- /dev/null +++ b/siro_rider/android/app/.cxx/Debug/3p4b322x/arm64-v8a/.cmake/api/v1/reply/index-2025-07-02T19-25-16-0601.json @@ -0,0 +1,92 @@ +{ + "cmake" : + { + "generator" : + { + "multiConfig" : false, + "name" : "Ninja" + }, + "paths" : + { + "cmake" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/bin/cmake", + "cpack" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/bin/cpack", + "ctest" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/bin/ctest", + "root" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31" + }, + "version" : + { + "isDirty" : false, + "major" : 3, + "minor" : 31, + "patch" : 5, + "string" : "3.31.5-g6cf5163", + "suffix" : "g6cf5163" + } + }, + "objects" : + [ + { + "jsonFile" : "codemodel-v2-3341f8efb12b0cdce1a6.json", + "kind" : "codemodel", + "version" : + { + "major" : 2, + "minor" : 7 + } + }, + { + "jsonFile" : "cache-v2-ac68e6030ad9864cea0c.json", + "kind" : "cache", + "version" : + { + "major" : 2, + "minor" : 0 + } + }, + { + "jsonFile" : "cmakeFiles-v1-c7966f8678bacc51340d.json", + "kind" : "cmakeFiles", + "version" : + { + "major" : 1, + "minor" : 1 + } + } + ], + "reply" : + { + "client-agp" : + { + "cache-v2" : + { + "jsonFile" : "cache-v2-ac68e6030ad9864cea0c.json", + "kind" : "cache", + "version" : + { + "major" : 2, + "minor" : 0 + } + }, + "cmakeFiles-v1" : + { + "jsonFile" : "cmakeFiles-v1-c7966f8678bacc51340d.json", + "kind" : "cmakeFiles", + "version" : + { + "major" : 1, + "minor" : 1 + } + }, + "codemodel-v2" : + { + "jsonFile" : "codemodel-v2-3341f8efb12b0cdce1a6.json", + "kind" : "codemodel", + "version" : + { + "major" : 2, + "minor" : 7 + } + } + } + } +} diff --git a/siro_rider/android/app/.cxx/Debug/3p4b322x/arm64-v8a/.cmake/api/v1/reply/target-native-lib-Debug-4f3f22efb16e3d7daf88.json b/siro_rider/android/app/.cxx/Debug/3p4b322x/arm64-v8a/.cmake/api/v1/reply/target-native-lib-Debug-4f3f22efb16e3d7daf88.json new file mode 100644 index 0000000..cbc064f --- /dev/null +++ b/siro_rider/android/app/.cxx/Debug/3p4b322x/arm64-v8a/.cmake/api/v1/reply/target-native-lib-Debug-4f3f22efb16e3d7daf88.json @@ -0,0 +1,117 @@ +{ + "artifacts" : + [ + { + "path" : "/Users/hamzaaleghwairyeen/development/App/Intaleq/build/app/intermediates/cxx/Debug/3p4b322x/obj/arm64-v8a/libnative-lib.so" + } + ], + "backtrace" : 1, + "backtraceGraph" : + { + "commands" : + [ + "add_library", + "target_link_libraries" + ], + "files" : + [ + "CMakeLists.txt" + ], + "nodes" : + [ + { + "file" : 0 + }, + { + "command" : 0, + "file" : 0, + "line" : 4, + "parent" : 0 + }, + { + "command" : 1, + "file" : 0, + "line" : 8, + "parent" : 0 + } + ] + }, + "compileGroups" : + [ + { + "compileCommandFragments" : + [ + { + "fragment" : "-g -DANDROID -fdata-sections -ffunction-sections -funwind-tables -fstack-protector-strong -no-canonical-prefixes -D_FORTIFY_SOURCE=2 -Wformat -Werror=format-security -fno-limit-debug-info -fPIC" + } + ], + "defines" : + [ + { + "define" : "native_lib_EXPORTS" + } + ], + "language" : "CXX", + "sourceIndexes" : + [ + 0 + ], + "sysroot" : + { + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot" + } + } + ], + "id" : "native-lib::@6890427a1f51a3e7e1df", + "link" : + { + "commandFragments" : + [ + { + "fragment" : "-static-libstdc++ -Wl,--build-id=sha1 -Wl,--no-rosegment -Wl,--no-undefined-version -Wl,--fatal-warnings -Wl,--no-undefined -Qunused-arguments", + "role" : "flags" + }, + { + "backtrace" : 2, + "fragment" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/lib/aarch64-linux-android/23/liblog.so", + "role" : "libraries" + }, + { + "fragment" : "-latomic -lm", + "role" : "libraries" + } + ], + "language" : "CXX", + "sysroot" : + { + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot" + } + }, + "name" : "native-lib", + "nameOnDisk" : "libnative-lib.so", + "paths" : + { + "build" : ".", + "source" : "." + }, + "sourceGroups" : + [ + { + "name" : "Source Files", + "sourceIndexes" : + [ + 0 + ] + } + ], + "sources" : + [ + { + "backtrace" : 1, + "compileGroupIndex" : 0, + "path" : "native-lib.cpp", + "sourceGroupIndex" : 0 + } + ], + "type" : "SHARED_LIBRARY" +} diff --git a/siro_rider/android/app/.cxx/Debug/3p4b322x/arm64-v8a/.ninja_deps b/siro_rider/android/app/.cxx/Debug/3p4b322x/arm64-v8a/.ninja_deps new file mode 100644 index 0000000..cd5fe59 Binary files /dev/null and b/siro_rider/android/app/.cxx/Debug/3p4b322x/arm64-v8a/.ninja_deps differ diff --git a/siro_rider/android/app/.cxx/Debug/3p4b322x/arm64-v8a/.ninja_log b/siro_rider/android/app/.cxx/Debug/3p4b322x/arm64-v8a/.ninja_log new file mode 100644 index 0000000..bc9ae58 --- /dev/null +++ b/siro_rider/android/app/.cxx/Debug/3p4b322x/arm64-v8a/.ninja_log @@ -0,0 +1,7 @@ +# ninja log v5 +0 1629 1751484319443141046 CMakeFiles/native-lib.dir/native-lib.cpp.o aa7334b8f9e6d606 +1631 1950 1751484319770122336 /Users/hamzaaleghwairyeen/development/App/Intaleq/build/app/intermediates/cxx/Debug/3p4b322x/obj/arm64-v8a/libnative-lib.so e744bd7e90a1b11c +3 2356 1751485306066194020 CMakeFiles/native-lib.dir/native-lib.cpp.o aa7334b8f9e6d606 +2356 3636 1751485307385642579 /Users/hamzaaleghwairyeen/development/App/Intaleq/build/app/intermediates/cxx/Debug/3p4b322x/obj/arm64-v8a/libnative-lib.so e744bd7e90a1b11c +29 1765 1751490327679021593 /Users/hamzaaleghwairyeen/development/App/Intaleq/build/app/intermediates/cxx/Debug/3p4b322x/obj/arm64-v8a/libnative-lib.so e744bd7e90a1b11c +370 1544 1752227572963525047 /Users/hamzaaleghwairyeen/development/App/Intaleq/build/app/intermediates/cxx/Debug/3p4b322x/obj/arm64-v8a/libnative-lib.so e744bd7e90a1b11c diff --git a/siro_rider/android/app/.cxx/Debug/3p4b322x/arm64-v8a/CMakeCache.txt b/siro_rider/android/app/.cxx/Debug/3p4b322x/arm64-v8a/CMakeCache.txt new file mode 100644 index 0000000..6736427 --- /dev/null +++ b/siro_rider/android/app/.cxx/Debug/3p4b322x/arm64-v8a/CMakeCache.txt @@ -0,0 +1,430 @@ +# This is the CMakeCache file. +# For build in directory: /Users/hamzaaleghwairyeen/development/App/Intaleq/android/app/.cxx/Debug/3p4b322x/arm64-v8a +# It was generated by CMake: /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/bin/cmake +# You can edit this file to change values found and used by cmake. +# If you do not want to change any of the values, simply exit the editor. +# If you do want to change a value, simply edit, save, and exit the editor. +# The syntax for the file is as follows: +# KEY:TYPE=VALUE +# KEY is the name of a variable in the cache. +# TYPE is a hint to GUIs for the type of VALUE, DO NOT EDIT TYPE!. +# VALUE is the current value for the KEY. + +######################## +# EXTERNAL cache entries +######################## + +//No help, variable specified on the command line. +ANDROID_ABI:UNINITIALIZED=arm64-v8a + +//No help, variable specified on the command line. +ANDROID_NDK:UNINITIALIZED=/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973 + +//No help, variable specified on the command line. +ANDROID_PLATFORM:UNINITIALIZED=android-23 + +//Path to a program. +CMAKE_ADDR2LINE:FILEPATH=/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/bin/llvm-addr2line + +//No help, variable specified on the command line. +CMAKE_ANDROID_ARCH_ABI:UNINITIALIZED=arm64-v8a + +//No help, variable specified on the command line. +CMAKE_ANDROID_NDK:UNINITIALIZED=/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973 + +//Archiver +CMAKE_AR:FILEPATH=/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/bin/llvm-ar + +//Flags used by the compiler during all build types. +CMAKE_ASM_FLAGS:STRING= + +//Flags used by the compiler during debug builds. +CMAKE_ASM_FLAGS_DEBUG:STRING= + +//Flags used by the compiler during release builds. +CMAKE_ASM_FLAGS_RELEASE:STRING= + +//Choose the type of build, options are: None Debug Release RelWithDebInfo +// MinSizeRel ... +CMAKE_BUILD_TYPE:STRING=Debug + +//LLVM archiver +CMAKE_CXX_COMPILER_AR:FILEPATH=/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/bin/llvm-ar + +//`clang-scan-deps` dependency scanner +CMAKE_CXX_COMPILER_CLANG_SCAN_DEPS:FILEPATH=/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/bin/clang-scan-deps + +//Generate index for LLVM archive +CMAKE_CXX_COMPILER_RANLIB:FILEPATH=/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/bin/llvm-ranlib + +//Flags used by the compiler during all build types. +CMAKE_CXX_FLAGS:STRING= + +//Flags used by the compiler during debug builds. +CMAKE_CXX_FLAGS_DEBUG:STRING= + +//Flags used by the CXX compiler during MINSIZEREL builds. +CMAKE_CXX_FLAGS_MINSIZEREL:STRING=-Os -DNDEBUG + +//Flags used by the compiler during release builds. +CMAKE_CXX_FLAGS_RELEASE:STRING= + +//Flags used by the CXX compiler during RELWITHDEBINFO builds. +CMAKE_CXX_FLAGS_RELWITHDEBINFO:STRING=-O2 -g -DNDEBUG + +//Libraries linked by default with all C++ applications. +CMAKE_CXX_STANDARD_LIBRARIES:STRING=-latomic -lm + +//LLVM archiver +CMAKE_C_COMPILER_AR:FILEPATH=/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/bin/llvm-ar + +//`clang-scan-deps` dependency scanner +CMAKE_C_COMPILER_CLANG_SCAN_DEPS:FILEPATH=/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/bin/clang-scan-deps + +//Generate index for LLVM archive +CMAKE_C_COMPILER_RANLIB:FILEPATH=/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/bin/llvm-ranlib + +//Flags used by the compiler during all build types. +CMAKE_C_FLAGS:STRING= + +//Flags used by the compiler during debug builds. +CMAKE_C_FLAGS_DEBUG:STRING= + +//Flags used by the C compiler during MINSIZEREL builds. +CMAKE_C_FLAGS_MINSIZEREL:STRING=-Os -DNDEBUG + +//Flags used by the compiler during release builds. +CMAKE_C_FLAGS_RELEASE:STRING= + +//Flags used by the C compiler during RELWITHDEBINFO builds. +CMAKE_C_FLAGS_RELWITHDEBINFO:STRING=-O2 -g -DNDEBUG + +//Libraries linked by default with all C applications. +CMAKE_C_STANDARD_LIBRARIES:STRING=-latomic -lm + +//Path to a program. +CMAKE_DLLTOOL:FILEPATH=/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/bin/llvm-dlltool + +//Flags used by the linker. +CMAKE_EXE_LINKER_FLAGS:STRING= + +//Flags used by the linker during DEBUG builds. +CMAKE_EXE_LINKER_FLAGS_DEBUG:STRING= + +//Flags used by the linker during MINSIZEREL builds. +CMAKE_EXE_LINKER_FLAGS_MINSIZEREL:STRING= + +//Flags used by the linker during RELEASE builds. +CMAKE_EXE_LINKER_FLAGS_RELEASE:STRING= + +//Flags used by the linker during RELWITHDEBINFO builds. +CMAKE_EXE_LINKER_FLAGS_RELWITHDEBINFO:STRING= + +//Enable/Disable output of build database during the build. +CMAKE_EXPORT_BUILD_DATABASE:BOOL= + +//No help, variable specified on the command line. +CMAKE_EXPORT_COMPILE_COMMANDS:UNINITIALIZED=ON + +//Value Computed by CMake. +CMAKE_FIND_PACKAGE_REDIRECTS_DIR:STATIC=/Users/hamzaaleghwairyeen/development/App/Intaleq/android/app/.cxx/Debug/3p4b322x/arm64-v8a/CMakeFiles/pkgRedirects + +//Install path prefix, prepended onto install directories. +CMAKE_INSTALL_PREFIX:PATH=/usr/local + +//No help, variable specified on the command line. +CMAKE_LIBRARY_OUTPUT_DIRECTORY:UNINITIALIZED=/Users/hamzaaleghwairyeen/development/App/Intaleq/build/app/intermediates/cxx/Debug/3p4b322x/obj/arm64-v8a + +//Path to a program. +CMAKE_LINKER:FILEPATH=/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/bin/ld.lld + +//No help, variable specified on the command line. +CMAKE_MAKE_PROGRAM:UNINITIALIZED=/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/bin/ninja + +//Flags used by the linker during the creation of modules. +CMAKE_MODULE_LINKER_FLAGS:STRING= + +//Flags used by the linker during the creation of modules during +// DEBUG builds. +CMAKE_MODULE_LINKER_FLAGS_DEBUG:STRING= + +//Flags used by the linker during the creation of modules during +// MINSIZEREL builds. +CMAKE_MODULE_LINKER_FLAGS_MINSIZEREL:STRING= + +//Flags used by the linker during the creation of modules during +// RELEASE builds. +CMAKE_MODULE_LINKER_FLAGS_RELEASE:STRING= + +//Flags used by the linker during the creation of modules during +// RELWITHDEBINFO builds. +CMAKE_MODULE_LINKER_FLAGS_RELWITHDEBINFO:STRING= + +//Path to a program. +CMAKE_NM:FILEPATH=/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/bin/llvm-nm + +//Path to a program. +CMAKE_OBJCOPY:FILEPATH=/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/bin/llvm-objcopy + +//Path to a program. +CMAKE_OBJDUMP:FILEPATH=/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/bin/llvm-objdump + +//Value Computed by CMake +CMAKE_PROJECT_DESCRIPTION:STATIC= + +//Value Computed by CMake +CMAKE_PROJECT_HOMEPAGE_URL:STATIC= + +//Value Computed by CMake +CMAKE_PROJECT_NAME:STATIC=intaleq + +//Ranlib +CMAKE_RANLIB:FILEPATH=/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/bin/llvm-ranlib + +//Path to a program. +CMAKE_READELF:FILEPATH=/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/bin/llvm-readelf + +//No help, variable specified on the command line. +CMAKE_RUNTIME_OUTPUT_DIRECTORY:UNINITIALIZED=/Users/hamzaaleghwairyeen/development/App/Intaleq/build/app/intermediates/cxx/Debug/3p4b322x/obj/arm64-v8a + +//Flags used by the linker during the creation of dll's. +CMAKE_SHARED_LINKER_FLAGS:STRING= + +//Flags used by the linker during the creation of shared libraries +// during DEBUG builds. +CMAKE_SHARED_LINKER_FLAGS_DEBUG:STRING= + +//Flags used by the linker during the creation of shared libraries +// during MINSIZEREL builds. +CMAKE_SHARED_LINKER_FLAGS_MINSIZEREL:STRING= + +//Flags used by the linker during the creation of shared libraries +// during RELEASE builds. +CMAKE_SHARED_LINKER_FLAGS_RELEASE:STRING= + +//Flags used by the linker during the creation of shared libraries +// during RELWITHDEBINFO builds. +CMAKE_SHARED_LINKER_FLAGS_RELWITHDEBINFO:STRING= + +//If set, runtime paths are not added when installing shared libraries, +// but are added when building. +CMAKE_SKIP_INSTALL_RPATH:BOOL=NO + +//If set, runtime paths are not added when using shared libraries. +CMAKE_SKIP_RPATH:BOOL=NO + +//Flags used by the linker during the creation of static libraries +// during all build types. +CMAKE_STATIC_LINKER_FLAGS:STRING= + +//Flags used by the linker during the creation of static libraries +// during DEBUG builds. +CMAKE_STATIC_LINKER_FLAGS_DEBUG:STRING= + +//Flags used by the linker during the creation of static libraries +// during MINSIZEREL builds. +CMAKE_STATIC_LINKER_FLAGS_MINSIZEREL:STRING= + +//Flags used by the linker during the creation of static libraries +// during RELEASE builds. +CMAKE_STATIC_LINKER_FLAGS_RELEASE:STRING= + +//Flags used by the linker during the creation of static libraries +// during RELWITHDEBINFO builds. +CMAKE_STATIC_LINKER_FLAGS_RELWITHDEBINFO:STRING= + +//Strip +CMAKE_STRIP:FILEPATH=/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/bin/llvm-strip + +//No help, variable specified on the command line. +CMAKE_SYSTEM_NAME:UNINITIALIZED=Android + +//No help, variable specified on the command line. +CMAKE_SYSTEM_VERSION:UNINITIALIZED=23 + +//Path to a program. +CMAKE_TAPI:FILEPATH=CMAKE_TAPI-NOTFOUND + +//The CMake toolchain file +CMAKE_TOOLCHAIN_FILE:FILEPATH=/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/build/cmake/android.toolchain.cmake + +//If this value is on, makefiles will be generated without the +// .SILENT directive, and all commands will be echoed to the console +// during the make. This is useful for debugging only. With Visual +// Studio IDE projects all commands are done without /nologo. +CMAKE_VERBOSE_MAKEFILE:BOOL=FALSE + +//Value Computed by CMake +intaleq_BINARY_DIR:STATIC=/Users/hamzaaleghwairyeen/development/App/Intaleq/android/app/.cxx/Debug/3p4b322x/arm64-v8a + +//Value Computed by CMake +intaleq_IS_TOP_LEVEL:STATIC=ON + +//Value Computed by CMake +intaleq_SOURCE_DIR:STATIC=/Users/hamzaaleghwairyeen/development/App/Intaleq/android/app/src/main/cpp + +//Path to a library. +log-lib:FILEPATH=/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/lib/aarch64-linux-android/23/liblog.so + +//Dependencies for the target +native-lib_LIB_DEPENDS:STATIC=general;/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/lib/aarch64-linux-android/23/liblog.so; + + +######################## +# INTERNAL cache entries +######################## + +//ADVANCED property for variable: CMAKE_ADDR2LINE +CMAKE_ADDR2LINE-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_AR +CMAKE_AR-ADVANCED:INTERNAL=1 +//This is the directory where this CMakeCache.txt was created +CMAKE_CACHEFILE_DIR:INTERNAL=/Users/hamzaaleghwairyeen/development/App/Intaleq/android/app/.cxx/Debug/3p4b322x/arm64-v8a +//Major version of cmake used to create the current loaded cache +CMAKE_CACHE_MAJOR_VERSION:INTERNAL=3 +//Minor version of cmake used to create the current loaded cache +CMAKE_CACHE_MINOR_VERSION:INTERNAL=31 +//Patch version of cmake used to create the current loaded cache +CMAKE_CACHE_PATCH_VERSION:INTERNAL=5 +//Path to CMake executable. +CMAKE_COMMAND:INTERNAL=/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/bin/cmake +//Path to cpack program executable. +CMAKE_CPACK_COMMAND:INTERNAL=/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/bin/cpack +//Path to ctest program executable. +CMAKE_CTEST_COMMAND:INTERNAL=/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/bin/ctest +//ADVANCED property for variable: CMAKE_CXX_COMPILER_AR +CMAKE_CXX_COMPILER_AR-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_CXX_COMPILER_CLANG_SCAN_DEPS +CMAKE_CXX_COMPILER_CLANG_SCAN_DEPS-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_CXX_COMPILER_RANLIB +CMAKE_CXX_COMPILER_RANLIB-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_CXX_FLAGS +CMAKE_CXX_FLAGS-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_CXX_FLAGS_DEBUG +CMAKE_CXX_FLAGS_DEBUG-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_CXX_FLAGS_MINSIZEREL +CMAKE_CXX_FLAGS_MINSIZEREL-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_CXX_FLAGS_RELEASE +CMAKE_CXX_FLAGS_RELEASE-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_CXX_FLAGS_RELWITHDEBINFO +CMAKE_CXX_FLAGS_RELWITHDEBINFO-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_CXX_STANDARD_LIBRARIES +CMAKE_CXX_STANDARD_LIBRARIES-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_C_COMPILER_AR +CMAKE_C_COMPILER_AR-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_C_COMPILER_CLANG_SCAN_DEPS +CMAKE_C_COMPILER_CLANG_SCAN_DEPS-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_C_COMPILER_RANLIB +CMAKE_C_COMPILER_RANLIB-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_C_FLAGS +CMAKE_C_FLAGS-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_C_FLAGS_DEBUG +CMAKE_C_FLAGS_DEBUG-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_C_FLAGS_MINSIZEREL +CMAKE_C_FLAGS_MINSIZEREL-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_C_FLAGS_RELEASE +CMAKE_C_FLAGS_RELEASE-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_C_FLAGS_RELWITHDEBINFO +CMAKE_C_FLAGS_RELWITHDEBINFO-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_C_STANDARD_LIBRARIES +CMAKE_C_STANDARD_LIBRARIES-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_DLLTOOL +CMAKE_DLLTOOL-ADVANCED:INTERNAL=1 +//Path to cache edit program executable. +CMAKE_EDIT_COMMAND:INTERNAL=/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/bin/ccmake +//Executable file format +CMAKE_EXECUTABLE_FORMAT:INTERNAL=ELF +//ADVANCED property for variable: CMAKE_EXE_LINKER_FLAGS +CMAKE_EXE_LINKER_FLAGS-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_EXE_LINKER_FLAGS_DEBUG +CMAKE_EXE_LINKER_FLAGS_DEBUG-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_EXE_LINKER_FLAGS_MINSIZEREL +CMAKE_EXE_LINKER_FLAGS_MINSIZEREL-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_EXE_LINKER_FLAGS_RELEASE +CMAKE_EXE_LINKER_FLAGS_RELEASE-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_EXE_LINKER_FLAGS_RELWITHDEBINFO +CMAKE_EXE_LINKER_FLAGS_RELWITHDEBINFO-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_EXPORT_BUILD_DATABASE +CMAKE_EXPORT_BUILD_DATABASE-ADVANCED:INTERNAL=1 +//Name of external makefile project generator. +CMAKE_EXTRA_GENERATOR:INTERNAL= +//Name of generator. +CMAKE_GENERATOR:INTERNAL=Ninja +//Generator instance identifier. +CMAKE_GENERATOR_INSTANCE:INTERNAL= +//Name of generator platform. +CMAKE_GENERATOR_PLATFORM:INTERNAL= +//Name of generator toolset. +CMAKE_GENERATOR_TOOLSET:INTERNAL= +//Source directory with the top level CMakeLists.txt file for this +// project +CMAKE_HOME_DIRECTORY:INTERNAL=/Users/hamzaaleghwairyeen/development/App/Intaleq/android/app/src/main/cpp +//Install .so files without execute permission. +CMAKE_INSTALL_SO_NO_EXE:INTERNAL=0 +//ADVANCED property for variable: CMAKE_LINKER +CMAKE_LINKER-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_MODULE_LINKER_FLAGS +CMAKE_MODULE_LINKER_FLAGS-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_MODULE_LINKER_FLAGS_DEBUG +CMAKE_MODULE_LINKER_FLAGS_DEBUG-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_MODULE_LINKER_FLAGS_MINSIZEREL +CMAKE_MODULE_LINKER_FLAGS_MINSIZEREL-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_MODULE_LINKER_FLAGS_RELEASE +CMAKE_MODULE_LINKER_FLAGS_RELEASE-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_MODULE_LINKER_FLAGS_RELWITHDEBINFO +CMAKE_MODULE_LINKER_FLAGS_RELWITHDEBINFO-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_NM +CMAKE_NM-ADVANCED:INTERNAL=1 +//number of local generators +CMAKE_NUMBER_OF_MAKEFILES:INTERNAL=1 +//ADVANCED property for variable: CMAKE_OBJCOPY +CMAKE_OBJCOPY-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_OBJDUMP +CMAKE_OBJDUMP-ADVANCED:INTERNAL=1 +//Platform information initialized +CMAKE_PLATFORM_INFO_INITIALIZED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_RANLIB +CMAKE_RANLIB-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_READELF +CMAKE_READELF-ADVANCED:INTERNAL=1 +//Path to CMake installation. +CMAKE_ROOT:INTERNAL=/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31 +//ADVANCED property for variable: CMAKE_SHARED_LINKER_FLAGS +CMAKE_SHARED_LINKER_FLAGS-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_SHARED_LINKER_FLAGS_DEBUG +CMAKE_SHARED_LINKER_FLAGS_DEBUG-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_SHARED_LINKER_FLAGS_MINSIZEREL +CMAKE_SHARED_LINKER_FLAGS_MINSIZEREL-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_SHARED_LINKER_FLAGS_RELEASE +CMAKE_SHARED_LINKER_FLAGS_RELEASE-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_SHARED_LINKER_FLAGS_RELWITHDEBINFO +CMAKE_SHARED_LINKER_FLAGS_RELWITHDEBINFO-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_SKIP_INSTALL_RPATH +CMAKE_SKIP_INSTALL_RPATH-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_SKIP_RPATH +CMAKE_SKIP_RPATH-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_STATIC_LINKER_FLAGS +CMAKE_STATIC_LINKER_FLAGS-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_STATIC_LINKER_FLAGS_DEBUG +CMAKE_STATIC_LINKER_FLAGS_DEBUG-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_STATIC_LINKER_FLAGS_MINSIZEREL +CMAKE_STATIC_LINKER_FLAGS_MINSIZEREL-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_STATIC_LINKER_FLAGS_RELEASE +CMAKE_STATIC_LINKER_FLAGS_RELEASE-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_STATIC_LINKER_FLAGS_RELWITHDEBINFO +CMAKE_STATIC_LINKER_FLAGS_RELWITHDEBINFO-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_STRIP +CMAKE_STRIP-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_TAPI +CMAKE_TAPI-ADVANCED:INTERNAL=1 +//uname command +CMAKE_UNAME:INTERNAL=/usr/bin/uname +//ADVANCED property for variable: CMAKE_VERBOSE_MAKEFILE +CMAKE_VERBOSE_MAKEFILE-ADVANCED:INTERNAL=1 +//linker supports push/pop state +_CMAKE_CXX_LINKER_PUSHPOP_STATE_SUPPORTED:INTERNAL=TRUE +//linker supports push/pop state +_CMAKE_C_LINKER_PUSHPOP_STATE_SUPPORTED:INTERNAL=TRUE +//linker supports push/pop state +_CMAKE_LINKER_PUSHPOP_STATE_SUPPORTED:INTERNAL=TRUE + diff --git a/siro_rider/android/app/.cxx/Debug/3p4b322x/arm64-v8a/CMakeFiles/3.31.5-g6cf5163/CMakeCCompiler.cmake b/siro_rider/android/app/.cxx/Debug/3p4b322x/arm64-v8a/CMakeFiles/3.31.5-g6cf5163/CMakeCCompiler.cmake new file mode 100644 index 0000000..980aa60 --- /dev/null +++ b/siro_rider/android/app/.cxx/Debug/3p4b322x/arm64-v8a/CMakeFiles/3.31.5-g6cf5163/CMakeCCompiler.cmake @@ -0,0 +1,81 @@ +set(CMAKE_C_COMPILER "/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/bin/clang") +set(CMAKE_C_COMPILER_ARG1 "") +set(CMAKE_C_COMPILER_ID "Clang") +set(CMAKE_C_COMPILER_VERSION "18.0.1") +set(CMAKE_C_COMPILER_VERSION_INTERNAL "") +set(CMAKE_C_COMPILER_WRAPPER "") +set(CMAKE_C_STANDARD_COMPUTED_DEFAULT "17") +set(CMAKE_C_EXTENSIONS_COMPUTED_DEFAULT "ON") +set(CMAKE_C_STANDARD_LATEST "23") +set(CMAKE_C_COMPILE_FEATURES "c_std_90;c_function_prototypes;c_std_99;c_restrict;c_variadic_macros;c_std_11;c_static_assert;c_std_17;c_std_23") +set(CMAKE_C90_COMPILE_FEATURES "c_std_90;c_function_prototypes") +set(CMAKE_C99_COMPILE_FEATURES "c_std_99;c_restrict;c_variadic_macros") +set(CMAKE_C11_COMPILE_FEATURES "c_std_11;c_static_assert") +set(CMAKE_C17_COMPILE_FEATURES "c_std_17") +set(CMAKE_C23_COMPILE_FEATURES "c_std_23") + +set(CMAKE_C_PLATFORM_ID "Linux") +set(CMAKE_C_SIMULATE_ID "") +set(CMAKE_C_COMPILER_FRONTEND_VARIANT "GNU") +set(CMAKE_C_SIMULATE_VERSION "") + + + + +set(CMAKE_AR "/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/bin/llvm-ar") +set(CMAKE_C_COMPILER_AR "/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/bin/llvm-ar") +set(CMAKE_RANLIB "/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/bin/llvm-ranlib") +set(CMAKE_C_COMPILER_RANLIB "/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/bin/llvm-ranlib") +set(CMAKE_LINKER "/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/bin/ld.lld") +set(CMAKE_LINKER_LINK "") +set(CMAKE_LINKER_LLD "") +set(CMAKE_C_COMPILER_LINKER "/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/bin/ld.lld") +set(CMAKE_C_COMPILER_LINKER_ID "LLD") +set(CMAKE_C_COMPILER_LINKER_VERSION 18.0.1) +set(CMAKE_C_COMPILER_LINKER_FRONTEND_VARIANT GNU) +set(CMAKE_MT "") +set(CMAKE_TAPI "CMAKE_TAPI-NOTFOUND") +set(CMAKE_COMPILER_IS_GNUCC ) +set(CMAKE_C_COMPILER_LOADED 1) +set(CMAKE_C_COMPILER_WORKS TRUE) +set(CMAKE_C_ABI_COMPILED TRUE) + +set(CMAKE_C_COMPILER_ENV_VAR "CC") + +set(CMAKE_C_COMPILER_ID_RUN 1) +set(CMAKE_C_SOURCE_FILE_EXTENSIONS c;m) +set(CMAKE_C_IGNORE_EXTENSIONS h;H;o;O;obj;OBJ;def;DEF;rc;RC) +set(CMAKE_C_LINKER_PREFERENCE 10) +set(CMAKE_C_LINKER_DEPFILE_SUPPORTED ) + +# Save compiler ABI information. +set(CMAKE_C_SIZEOF_DATA_PTR "8") +set(CMAKE_C_COMPILER_ABI "ELF") +set(CMAKE_C_BYTE_ORDER "LITTLE_ENDIAN") +set(CMAKE_C_LIBRARY_ARCHITECTURE "aarch64-linux-android") + +if(CMAKE_C_SIZEOF_DATA_PTR) + set(CMAKE_SIZEOF_VOID_P "${CMAKE_C_SIZEOF_DATA_PTR}") +endif() + +if(CMAKE_C_COMPILER_ABI) + set(CMAKE_INTERNAL_PLATFORM_ABI "${CMAKE_C_COMPILER_ABI}") +endif() + +if(CMAKE_C_LIBRARY_ARCHITECTURE) + set(CMAKE_LIBRARY_ARCHITECTURE "aarch64-linux-android") +endif() + +set(CMAKE_C_CL_SHOWINCLUDES_PREFIX "") +if(CMAKE_C_CL_SHOWINCLUDES_PREFIX) + set(CMAKE_CL_SHOWINCLUDES_PREFIX "${CMAKE_C_CL_SHOWINCLUDES_PREFIX}") +endif() + + + + + +set(CMAKE_C_IMPLICIT_INCLUDE_DIRECTORIES "/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/lib/clang/18/include;/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/include/aarch64-linux-android;/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/include") +set(CMAKE_C_IMPLICIT_LINK_LIBRARIES "-l:libunwind.a;dl;c;-l:libunwind.a;dl") +set(CMAKE_C_IMPLICIT_LINK_DIRECTORIES "/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/lib/clang/18/lib/linux/aarch64;/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/lib/aarch64-linux-android/23;/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/lib/aarch64-linux-android;/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/lib") +set(CMAKE_C_IMPLICIT_LINK_FRAMEWORK_DIRECTORIES "") diff --git a/siro_rider/android/app/.cxx/Debug/3p4b322x/arm64-v8a/CMakeFiles/3.31.5-g6cf5163/CMakeCXXCompiler.cmake b/siro_rider/android/app/.cxx/Debug/3p4b322x/arm64-v8a/CMakeFiles/3.31.5-g6cf5163/CMakeCXXCompiler.cmake new file mode 100644 index 0000000..aa4a1e4 --- /dev/null +++ b/siro_rider/android/app/.cxx/Debug/3p4b322x/arm64-v8a/CMakeFiles/3.31.5-g6cf5163/CMakeCXXCompiler.cmake @@ -0,0 +1,105 @@ +set(CMAKE_CXX_COMPILER "/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/bin/clang++") +set(CMAKE_CXX_COMPILER_ARG1 "") +set(CMAKE_CXX_COMPILER_ID "Clang") +set(CMAKE_CXX_COMPILER_VERSION "18.0.1") +set(CMAKE_CXX_COMPILER_VERSION_INTERNAL "") +set(CMAKE_CXX_COMPILER_WRAPPER "") +set(CMAKE_CXX_STANDARD_COMPUTED_DEFAULT "17") +set(CMAKE_CXX_EXTENSIONS_COMPUTED_DEFAULT "ON") +set(CMAKE_CXX_STANDARD_LATEST "26") +set(CMAKE_CXX_COMPILE_FEATURES "cxx_std_98;cxx_template_template_parameters;cxx_std_11;cxx_alias_templates;cxx_alignas;cxx_alignof;cxx_attributes;cxx_auto_type;cxx_constexpr;cxx_decltype;cxx_decltype_incomplete_return_types;cxx_default_function_template_args;cxx_defaulted_functions;cxx_defaulted_move_initializers;cxx_delegating_constructors;cxx_deleted_functions;cxx_enum_forward_declarations;cxx_explicit_conversions;cxx_extended_friend_declarations;cxx_extern_templates;cxx_final;cxx_func_identifier;cxx_generalized_initializers;cxx_inheriting_constructors;cxx_inline_namespaces;cxx_lambdas;cxx_local_type_template_args;cxx_long_long_type;cxx_noexcept;cxx_nonstatic_member_init;cxx_nullptr;cxx_override;cxx_range_for;cxx_raw_string_literals;cxx_reference_qualified_functions;cxx_right_angle_brackets;cxx_rvalue_references;cxx_sizeof_member;cxx_static_assert;cxx_strong_enums;cxx_thread_local;cxx_trailing_return_types;cxx_unicode_literals;cxx_uniform_initialization;cxx_unrestricted_unions;cxx_user_literals;cxx_variadic_macros;cxx_variadic_templates;cxx_std_14;cxx_aggregate_default_initializers;cxx_attribute_deprecated;cxx_binary_literals;cxx_contextual_conversions;cxx_decltype_auto;cxx_digit_separators;cxx_generic_lambdas;cxx_lambda_init_captures;cxx_relaxed_constexpr;cxx_return_type_deduction;cxx_variable_templates;cxx_std_17;cxx_std_20;cxx_std_23;cxx_std_26") +set(CMAKE_CXX98_COMPILE_FEATURES "cxx_std_98;cxx_template_template_parameters") +set(CMAKE_CXX11_COMPILE_FEATURES "cxx_std_11;cxx_alias_templates;cxx_alignas;cxx_alignof;cxx_attributes;cxx_auto_type;cxx_constexpr;cxx_decltype;cxx_decltype_incomplete_return_types;cxx_default_function_template_args;cxx_defaulted_functions;cxx_defaulted_move_initializers;cxx_delegating_constructors;cxx_deleted_functions;cxx_enum_forward_declarations;cxx_explicit_conversions;cxx_extended_friend_declarations;cxx_extern_templates;cxx_final;cxx_func_identifier;cxx_generalized_initializers;cxx_inheriting_constructors;cxx_inline_namespaces;cxx_lambdas;cxx_local_type_template_args;cxx_long_long_type;cxx_noexcept;cxx_nonstatic_member_init;cxx_nullptr;cxx_override;cxx_range_for;cxx_raw_string_literals;cxx_reference_qualified_functions;cxx_right_angle_brackets;cxx_rvalue_references;cxx_sizeof_member;cxx_static_assert;cxx_strong_enums;cxx_thread_local;cxx_trailing_return_types;cxx_unicode_literals;cxx_uniform_initialization;cxx_unrestricted_unions;cxx_user_literals;cxx_variadic_macros;cxx_variadic_templates") +set(CMAKE_CXX14_COMPILE_FEATURES "cxx_std_14;cxx_aggregate_default_initializers;cxx_attribute_deprecated;cxx_binary_literals;cxx_contextual_conversions;cxx_decltype_auto;cxx_digit_separators;cxx_generic_lambdas;cxx_lambda_init_captures;cxx_relaxed_constexpr;cxx_return_type_deduction;cxx_variable_templates") +set(CMAKE_CXX17_COMPILE_FEATURES "cxx_std_17") +set(CMAKE_CXX20_COMPILE_FEATURES "cxx_std_20") +set(CMAKE_CXX23_COMPILE_FEATURES "cxx_std_23") +set(CMAKE_CXX26_COMPILE_FEATURES "cxx_std_26") + +set(CMAKE_CXX_PLATFORM_ID "Linux") +set(CMAKE_CXX_SIMULATE_ID "") +set(CMAKE_CXX_COMPILER_FRONTEND_VARIANT "GNU") +set(CMAKE_CXX_SIMULATE_VERSION "") + + + + +set(CMAKE_AR "/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/bin/llvm-ar") +set(CMAKE_CXX_COMPILER_AR "/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/bin/llvm-ar") +set(CMAKE_RANLIB "/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/bin/llvm-ranlib") +set(CMAKE_CXX_COMPILER_RANLIB "/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/bin/llvm-ranlib") +set(CMAKE_LINKER "/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/bin/ld.lld") +set(CMAKE_LINKER_LINK "") +set(CMAKE_LINKER_LLD "") +set(CMAKE_CXX_COMPILER_LINKER "/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/bin/ld.lld") +set(CMAKE_CXX_COMPILER_LINKER_ID "LLD") +set(CMAKE_CXX_COMPILER_LINKER_VERSION 18.0.1) +set(CMAKE_CXX_COMPILER_LINKER_FRONTEND_VARIANT GNU) +set(CMAKE_MT "") +set(CMAKE_TAPI "CMAKE_TAPI-NOTFOUND") +set(CMAKE_COMPILER_IS_GNUCXX ) +set(CMAKE_CXX_COMPILER_LOADED 1) +set(CMAKE_CXX_COMPILER_WORKS TRUE) +set(CMAKE_CXX_ABI_COMPILED TRUE) + +set(CMAKE_CXX_COMPILER_ENV_VAR "CXX") + +set(CMAKE_CXX_COMPILER_ID_RUN 1) +set(CMAKE_CXX_SOURCE_FILE_EXTENSIONS C;M;c++;cc;cpp;cxx;m;mm;mpp;CPP;ixx;cppm;ccm;cxxm;c++m) +set(CMAKE_CXX_IGNORE_EXTENSIONS inl;h;hpp;HPP;H;o;O;obj;OBJ;def;DEF;rc;RC) + +foreach (lang IN ITEMS C OBJC OBJCXX) + if (CMAKE_${lang}_COMPILER_ID_RUN) + foreach(extension IN LISTS CMAKE_${lang}_SOURCE_FILE_EXTENSIONS) + list(REMOVE_ITEM CMAKE_CXX_SOURCE_FILE_EXTENSIONS ${extension}) + endforeach() + endif() +endforeach() + +set(CMAKE_CXX_LINKER_PREFERENCE 30) +set(CMAKE_CXX_LINKER_PREFERENCE_PROPAGATES 1) +set(CMAKE_CXX_LINKER_DEPFILE_SUPPORTED ) + +# Save compiler ABI information. +set(CMAKE_CXX_SIZEOF_DATA_PTR "8") +set(CMAKE_CXX_COMPILER_ABI "ELF") +set(CMAKE_CXX_BYTE_ORDER "LITTLE_ENDIAN") +set(CMAKE_CXX_LIBRARY_ARCHITECTURE "aarch64-linux-android") + +if(CMAKE_CXX_SIZEOF_DATA_PTR) + set(CMAKE_SIZEOF_VOID_P "${CMAKE_CXX_SIZEOF_DATA_PTR}") +endif() + +if(CMAKE_CXX_COMPILER_ABI) + set(CMAKE_INTERNAL_PLATFORM_ABI "${CMAKE_CXX_COMPILER_ABI}") +endif() + +if(CMAKE_CXX_LIBRARY_ARCHITECTURE) + set(CMAKE_LIBRARY_ARCHITECTURE "aarch64-linux-android") +endif() + +set(CMAKE_CXX_CL_SHOWINCLUDES_PREFIX "") +if(CMAKE_CXX_CL_SHOWINCLUDES_PREFIX) + set(CMAKE_CL_SHOWINCLUDES_PREFIX "${CMAKE_CXX_CL_SHOWINCLUDES_PREFIX}") +endif() + + + + + +set(CMAKE_CXX_IMPLICIT_INCLUDE_DIRECTORIES "/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/include/c++/v1;/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/lib/clang/18/include;/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/include/aarch64-linux-android;/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/include") +set(CMAKE_CXX_IMPLICIT_LINK_LIBRARIES "c++;m;-l:libunwind.a;dl;c;-l:libunwind.a;dl") +set(CMAKE_CXX_IMPLICIT_LINK_DIRECTORIES "/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/lib/clang/18/lib/linux/aarch64;/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/lib/aarch64-linux-android/23;/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/lib/aarch64-linux-android;/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/lib") +set(CMAKE_CXX_IMPLICIT_LINK_FRAMEWORK_DIRECTORIES "") +set(CMAKE_CXX_COMPILER_CLANG_RESOURCE_DIR "/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/lib/clang/18") + +set(CMAKE_CXX_COMPILER_IMPORT_STD "") +### Imported target for C++23 standard library +set(CMAKE_CXX23_COMPILER_IMPORT_STD_NOT_FOUND_MESSAGE "Experimental `import std` support not enabled when detecting toolchain; it must be set before `CXX` is enabled (usually a `project()` call)") + + +### Imported target for C++26 standard library +set(CMAKE_CXX26_COMPILER_IMPORT_STD_NOT_FOUND_MESSAGE "Experimental `import std` support not enabled when detecting toolchain; it must be set before `CXX` is enabled (usually a `project()` call)") + + + diff --git a/siro_rider/android/app/.cxx/Debug/3p4b322x/arm64-v8a/CMakeFiles/3.31.5-g6cf5163/CMakeDetermineCompilerABI_C.bin b/siro_rider/android/app/.cxx/Debug/3p4b322x/arm64-v8a/CMakeFiles/3.31.5-g6cf5163/CMakeDetermineCompilerABI_C.bin new file mode 100755 index 0000000..9a48625 Binary files /dev/null and b/siro_rider/android/app/.cxx/Debug/3p4b322x/arm64-v8a/CMakeFiles/3.31.5-g6cf5163/CMakeDetermineCompilerABI_C.bin differ diff --git a/siro_rider/android/app/.cxx/Debug/3p4b322x/arm64-v8a/CMakeFiles/3.31.5-g6cf5163/CMakeDetermineCompilerABI_CXX.bin b/siro_rider/android/app/.cxx/Debug/3p4b322x/arm64-v8a/CMakeFiles/3.31.5-g6cf5163/CMakeDetermineCompilerABI_CXX.bin new file mode 100755 index 0000000..a67c7ba Binary files /dev/null and b/siro_rider/android/app/.cxx/Debug/3p4b322x/arm64-v8a/CMakeFiles/3.31.5-g6cf5163/CMakeDetermineCompilerABI_CXX.bin differ diff --git a/siro_rider/android/app/.cxx/Debug/3p4b322x/arm64-v8a/CMakeFiles/3.31.5-g6cf5163/CMakeSystem.cmake b/siro_rider/android/app/.cxx/Debug/3p4b322x/arm64-v8a/CMakeFiles/3.31.5-g6cf5163/CMakeSystem.cmake new file mode 100644 index 0000000..3a104b8 --- /dev/null +++ b/siro_rider/android/app/.cxx/Debug/3p4b322x/arm64-v8a/CMakeFiles/3.31.5-g6cf5163/CMakeSystem.cmake @@ -0,0 +1,15 @@ +set(CMAKE_HOST_SYSTEM "Darwin-24.5.0") +set(CMAKE_HOST_SYSTEM_NAME "Darwin") +set(CMAKE_HOST_SYSTEM_VERSION "24.5.0") +set(CMAKE_HOST_SYSTEM_PROCESSOR "arm64") + +include("/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/build/cmake/android.toolchain.cmake") + +set(CMAKE_SYSTEM "Android-1") +set(CMAKE_SYSTEM_NAME "Android") +set(CMAKE_SYSTEM_VERSION "1") +set(CMAKE_SYSTEM_PROCESSOR "aarch64") + +set(CMAKE_CROSSCOMPILING "TRUE") + +set(CMAKE_SYSTEM_LOADED 1) diff --git a/siro_rider/android/app/.cxx/Debug/3p4b322x/arm64-v8a/CMakeFiles/3.31.5-g6cf5163/CompilerIdC/CMakeCCompilerId.c b/siro_rider/android/app/.cxx/Debug/3p4b322x/arm64-v8a/CMakeFiles/3.31.5-g6cf5163/CompilerIdC/CMakeCCompilerId.c new file mode 100644 index 0000000..8d8bb03 --- /dev/null +++ b/siro_rider/android/app/.cxx/Debug/3p4b322x/arm64-v8a/CMakeFiles/3.31.5-g6cf5163/CompilerIdC/CMakeCCompilerId.c @@ -0,0 +1,904 @@ +#ifdef __cplusplus +# error "A C++ compiler has been selected for C." +#endif + +#if defined(__18CXX) +# define ID_VOID_MAIN +#endif +#if defined(__CLASSIC_C__) +/* cv-qualifiers did not exist in K&R C */ +# define const +# define volatile +#endif + +#if !defined(__has_include) +/* If the compiler does not have __has_include, pretend the answer is + always no. */ +# define __has_include(x) 0 +#endif + + +/* Version number components: V=Version, R=Revision, P=Patch + Version date components: YYYY=Year, MM=Month, DD=Day */ + +#if defined(__INTEL_COMPILER) || defined(__ICC) +# define COMPILER_ID "Intel" +# if defined(_MSC_VER) +# define SIMULATE_ID "MSVC" +# endif +# if defined(__GNUC__) +# define SIMULATE_ID "GNU" +# endif + /* __INTEL_COMPILER = VRP prior to 2021, and then VVVV for 2021 and later, + except that a few beta releases use the old format with V=2021. */ +# if __INTEL_COMPILER < 2021 || __INTEL_COMPILER == 202110 || __INTEL_COMPILER == 202111 +# define COMPILER_VERSION_MAJOR DEC(__INTEL_COMPILER/100) +# define COMPILER_VERSION_MINOR DEC(__INTEL_COMPILER/10 % 10) +# if defined(__INTEL_COMPILER_UPDATE) +# define COMPILER_VERSION_PATCH DEC(__INTEL_COMPILER_UPDATE) +# else +# define COMPILER_VERSION_PATCH DEC(__INTEL_COMPILER % 10) +# endif +# else +# define COMPILER_VERSION_MAJOR DEC(__INTEL_COMPILER) +# define COMPILER_VERSION_MINOR DEC(__INTEL_COMPILER_UPDATE) + /* The third version component from --version is an update index, + but no macro is provided for it. */ +# define COMPILER_VERSION_PATCH DEC(0) +# endif +# if defined(__INTEL_COMPILER_BUILD_DATE) + /* __INTEL_COMPILER_BUILD_DATE = YYYYMMDD */ +# define COMPILER_VERSION_TWEAK DEC(__INTEL_COMPILER_BUILD_DATE) +# endif +# if defined(_MSC_VER) + /* _MSC_VER = VVRR */ +# define SIMULATE_VERSION_MAJOR DEC(_MSC_VER / 100) +# define SIMULATE_VERSION_MINOR DEC(_MSC_VER % 100) +# endif +# if defined(__GNUC__) +# define SIMULATE_VERSION_MAJOR DEC(__GNUC__) +# elif defined(__GNUG__) +# define SIMULATE_VERSION_MAJOR DEC(__GNUG__) +# endif +# if defined(__GNUC_MINOR__) +# define SIMULATE_VERSION_MINOR DEC(__GNUC_MINOR__) +# endif +# if defined(__GNUC_PATCHLEVEL__) +# define SIMULATE_VERSION_PATCH DEC(__GNUC_PATCHLEVEL__) +# endif + +#elif (defined(__clang__) && defined(__INTEL_CLANG_COMPILER)) || defined(__INTEL_LLVM_COMPILER) +# define COMPILER_ID "IntelLLVM" +#if defined(_MSC_VER) +# define SIMULATE_ID "MSVC" +#endif +#if defined(__GNUC__) +# define SIMULATE_ID "GNU" +#endif +/* __INTEL_LLVM_COMPILER = VVVVRP prior to 2021.2.0, VVVVRRPP for 2021.2.0 and + * later. Look for 6 digit vs. 8 digit version number to decide encoding. + * VVVV is no smaller than the current year when a version is released. + */ +#if __INTEL_LLVM_COMPILER < 1000000L +# define COMPILER_VERSION_MAJOR DEC(__INTEL_LLVM_COMPILER/100) +# define COMPILER_VERSION_MINOR DEC(__INTEL_LLVM_COMPILER/10 % 10) +# define COMPILER_VERSION_PATCH DEC(__INTEL_LLVM_COMPILER % 10) +#else +# define COMPILER_VERSION_MAJOR DEC(__INTEL_LLVM_COMPILER/10000) +# define COMPILER_VERSION_MINOR DEC(__INTEL_LLVM_COMPILER/100 % 100) +# define COMPILER_VERSION_PATCH DEC(__INTEL_LLVM_COMPILER % 100) +#endif +#if defined(_MSC_VER) + /* _MSC_VER = VVRR */ +# define SIMULATE_VERSION_MAJOR DEC(_MSC_VER / 100) +# define SIMULATE_VERSION_MINOR DEC(_MSC_VER % 100) +#endif +#if defined(__GNUC__) +# define SIMULATE_VERSION_MAJOR DEC(__GNUC__) +#elif defined(__GNUG__) +# define SIMULATE_VERSION_MAJOR DEC(__GNUG__) +#endif +#if defined(__GNUC_MINOR__) +# define SIMULATE_VERSION_MINOR DEC(__GNUC_MINOR__) +#endif +#if defined(__GNUC_PATCHLEVEL__) +# define SIMULATE_VERSION_PATCH DEC(__GNUC_PATCHLEVEL__) +#endif + +#elif defined(__PATHCC__) +# define COMPILER_ID "PathScale" +# define COMPILER_VERSION_MAJOR DEC(__PATHCC__) +# define COMPILER_VERSION_MINOR DEC(__PATHCC_MINOR__) +# if defined(__PATHCC_PATCHLEVEL__) +# define COMPILER_VERSION_PATCH DEC(__PATHCC_PATCHLEVEL__) +# endif + +#elif defined(__BORLANDC__) && defined(__CODEGEARC_VERSION__) +# define COMPILER_ID "Embarcadero" +# define COMPILER_VERSION_MAJOR HEX(__CODEGEARC_VERSION__>>24 & 0x00FF) +# define COMPILER_VERSION_MINOR HEX(__CODEGEARC_VERSION__>>16 & 0x00FF) +# define COMPILER_VERSION_PATCH DEC(__CODEGEARC_VERSION__ & 0xFFFF) + +#elif defined(__BORLANDC__) +# define COMPILER_ID "Borland" + /* __BORLANDC__ = 0xVRR */ +# define COMPILER_VERSION_MAJOR HEX(__BORLANDC__>>8) +# define COMPILER_VERSION_MINOR HEX(__BORLANDC__ & 0xFF) + +#elif defined(__WATCOMC__) && __WATCOMC__ < 1200 +# define COMPILER_ID "Watcom" + /* __WATCOMC__ = VVRR */ +# define COMPILER_VERSION_MAJOR DEC(__WATCOMC__ / 100) +# define COMPILER_VERSION_MINOR DEC((__WATCOMC__ / 10) % 10) +# if (__WATCOMC__ % 10) > 0 +# define COMPILER_VERSION_PATCH DEC(__WATCOMC__ % 10) +# endif + +#elif defined(__WATCOMC__) +# define COMPILER_ID "OpenWatcom" + /* __WATCOMC__ = VVRP + 1100 */ +# define COMPILER_VERSION_MAJOR DEC((__WATCOMC__ - 1100) / 100) +# define COMPILER_VERSION_MINOR DEC((__WATCOMC__ / 10) % 10) +# if (__WATCOMC__ % 10) > 0 +# define COMPILER_VERSION_PATCH DEC(__WATCOMC__ % 10) +# endif + +#elif defined(__SUNPRO_C) +# define COMPILER_ID "SunPro" +# if __SUNPRO_C >= 0x5100 + /* __SUNPRO_C = 0xVRRP */ +# define COMPILER_VERSION_MAJOR HEX(__SUNPRO_C>>12) +# define COMPILER_VERSION_MINOR HEX(__SUNPRO_C>>4 & 0xFF) +# define COMPILER_VERSION_PATCH HEX(__SUNPRO_C & 0xF) +# else + /* __SUNPRO_CC = 0xVRP */ +# define COMPILER_VERSION_MAJOR HEX(__SUNPRO_C>>8) +# define COMPILER_VERSION_MINOR HEX(__SUNPRO_C>>4 & 0xF) +# define COMPILER_VERSION_PATCH HEX(__SUNPRO_C & 0xF) +# endif + +#elif defined(__HP_cc) +# define COMPILER_ID "HP" + /* __HP_cc = VVRRPP */ +# define COMPILER_VERSION_MAJOR DEC(__HP_cc/10000) +# define COMPILER_VERSION_MINOR DEC(__HP_cc/100 % 100) +# define COMPILER_VERSION_PATCH DEC(__HP_cc % 100) + +#elif defined(__DECC) +# define COMPILER_ID "Compaq" + /* __DECC_VER = VVRRTPPPP */ +# define COMPILER_VERSION_MAJOR DEC(__DECC_VER/10000000) +# define COMPILER_VERSION_MINOR DEC(__DECC_VER/100000 % 100) +# define COMPILER_VERSION_PATCH DEC(__DECC_VER % 10000) + +#elif defined(__IBMC__) && defined(__COMPILER_VER__) +# define COMPILER_ID "zOS" + /* __IBMC__ = VRP */ +# define COMPILER_VERSION_MAJOR DEC(__IBMC__/100) +# define COMPILER_VERSION_MINOR DEC(__IBMC__/10 % 10) +# define COMPILER_VERSION_PATCH DEC(__IBMC__ % 10) + +#elif defined(__open_xl__) && defined(__clang__) +# define COMPILER_ID "IBMClang" +# define COMPILER_VERSION_MAJOR DEC(__open_xl_version__) +# define COMPILER_VERSION_MINOR DEC(__open_xl_release__) +# define COMPILER_VERSION_PATCH DEC(__open_xl_modification__) +# define COMPILER_VERSION_TWEAK DEC(__open_xl_ptf_fix_level__) + + +#elif defined(__ibmxl__) && defined(__clang__) +# define COMPILER_ID "XLClang" +# define COMPILER_VERSION_MAJOR DEC(__ibmxl_version__) +# define COMPILER_VERSION_MINOR DEC(__ibmxl_release__) +# define COMPILER_VERSION_PATCH DEC(__ibmxl_modification__) +# define COMPILER_VERSION_TWEAK DEC(__ibmxl_ptf_fix_level__) + + +#elif defined(__IBMC__) && !defined(__COMPILER_VER__) && __IBMC__ >= 800 +# define COMPILER_ID "XL" + /* __IBMC__ = VRP */ +# define COMPILER_VERSION_MAJOR DEC(__IBMC__/100) +# define COMPILER_VERSION_MINOR DEC(__IBMC__/10 % 10) +# define COMPILER_VERSION_PATCH DEC(__IBMC__ % 10) + +#elif defined(__IBMC__) && !defined(__COMPILER_VER__) && __IBMC__ < 800 +# define COMPILER_ID "VisualAge" + /* __IBMC__ = VRP */ +# define COMPILER_VERSION_MAJOR DEC(__IBMC__/100) +# define COMPILER_VERSION_MINOR DEC(__IBMC__/10 % 10) +# define COMPILER_VERSION_PATCH DEC(__IBMC__ % 10) + +#elif defined(__NVCOMPILER) +# define COMPILER_ID "NVHPC" +# define COMPILER_VERSION_MAJOR DEC(__NVCOMPILER_MAJOR__) +# define COMPILER_VERSION_MINOR DEC(__NVCOMPILER_MINOR__) +# if defined(__NVCOMPILER_PATCHLEVEL__) +# define COMPILER_VERSION_PATCH DEC(__NVCOMPILER_PATCHLEVEL__) +# endif + +#elif defined(__PGI) +# define COMPILER_ID "PGI" +# define COMPILER_VERSION_MAJOR DEC(__PGIC__) +# define COMPILER_VERSION_MINOR DEC(__PGIC_MINOR__) +# if defined(__PGIC_PATCHLEVEL__) +# define COMPILER_VERSION_PATCH DEC(__PGIC_PATCHLEVEL__) +# endif + +#elif defined(__clang__) && defined(__cray__) +# define COMPILER_ID "CrayClang" +# define COMPILER_VERSION_MAJOR DEC(__cray_major__) +# define COMPILER_VERSION_MINOR DEC(__cray_minor__) +# define COMPILER_VERSION_PATCH DEC(__cray_patchlevel__) +# define COMPILER_VERSION_INTERNAL_STR __clang_version__ + + +#elif defined(_CRAYC) +# define COMPILER_ID "Cray" +# define COMPILER_VERSION_MAJOR DEC(_RELEASE_MAJOR) +# define COMPILER_VERSION_MINOR DEC(_RELEASE_MINOR) + +#elif defined(__TI_COMPILER_VERSION__) +# define COMPILER_ID "TI" + /* __TI_COMPILER_VERSION__ = VVVRRRPPP */ +# define COMPILER_VERSION_MAJOR DEC(__TI_COMPILER_VERSION__/1000000) +# define COMPILER_VERSION_MINOR DEC(__TI_COMPILER_VERSION__/1000 % 1000) +# define COMPILER_VERSION_PATCH DEC(__TI_COMPILER_VERSION__ % 1000) + +#elif defined(__CLANG_FUJITSU) +# define COMPILER_ID "FujitsuClang" +# define COMPILER_VERSION_MAJOR DEC(__FCC_major__) +# define COMPILER_VERSION_MINOR DEC(__FCC_minor__) +# define COMPILER_VERSION_PATCH DEC(__FCC_patchlevel__) +# define COMPILER_VERSION_INTERNAL_STR __clang_version__ + + +#elif defined(__FUJITSU) +# define COMPILER_ID "Fujitsu" +# if defined(__FCC_version__) +# define COMPILER_VERSION __FCC_version__ +# elif defined(__FCC_major__) +# define COMPILER_VERSION_MAJOR DEC(__FCC_major__) +# define COMPILER_VERSION_MINOR DEC(__FCC_minor__) +# define COMPILER_VERSION_PATCH DEC(__FCC_patchlevel__) +# endif +# if defined(__fcc_version) +# define COMPILER_VERSION_INTERNAL DEC(__fcc_version) +# elif defined(__FCC_VERSION) +# define COMPILER_VERSION_INTERNAL DEC(__FCC_VERSION) +# endif + + +#elif defined(__ghs__) +# define COMPILER_ID "GHS" +/* __GHS_VERSION_NUMBER = VVVVRP */ +# ifdef __GHS_VERSION_NUMBER +# define COMPILER_VERSION_MAJOR DEC(__GHS_VERSION_NUMBER / 100) +# define COMPILER_VERSION_MINOR DEC(__GHS_VERSION_NUMBER / 10 % 10) +# define COMPILER_VERSION_PATCH DEC(__GHS_VERSION_NUMBER % 10) +# endif + +#elif defined(__TASKING__) +# define COMPILER_ID "Tasking" + # define COMPILER_VERSION_MAJOR DEC(__VERSION__/1000) + # define COMPILER_VERSION_MINOR DEC(__VERSION__ % 100) +# define COMPILER_VERSION_INTERNAL DEC(__VERSION__) + +#elif defined(__ORANGEC__) +# define COMPILER_ID "OrangeC" +# define COMPILER_VERSION_MAJOR DEC(__ORANGEC_MAJOR__) +# define COMPILER_VERSION_MINOR DEC(__ORANGEC_MINOR__) +# define COMPILER_VERSION_PATCH DEC(__ORANGEC_PATCHLEVEL__) + +#elif defined(__TINYC__) +# define COMPILER_ID "TinyCC" + +#elif defined(__BCC__) +# define COMPILER_ID "Bruce" + +#elif defined(__SCO_VERSION__) +# define COMPILER_ID "SCO" + +#elif defined(__ARMCC_VERSION) && !defined(__clang__) +# define COMPILER_ID "ARMCC" +#if __ARMCC_VERSION >= 1000000 + /* __ARMCC_VERSION = VRRPPPP */ + # define COMPILER_VERSION_MAJOR DEC(__ARMCC_VERSION/1000000) + # define COMPILER_VERSION_MINOR DEC(__ARMCC_VERSION/10000 % 100) + # define COMPILER_VERSION_PATCH DEC(__ARMCC_VERSION % 10000) +#else + /* __ARMCC_VERSION = VRPPPP */ + # define COMPILER_VERSION_MAJOR DEC(__ARMCC_VERSION/100000) + # define COMPILER_VERSION_MINOR DEC(__ARMCC_VERSION/10000 % 10) + # define COMPILER_VERSION_PATCH DEC(__ARMCC_VERSION % 10000) +#endif + + +#elif defined(__clang__) && defined(__apple_build_version__) +# define COMPILER_ID "AppleClang" +# if defined(_MSC_VER) +# define SIMULATE_ID "MSVC" +# endif +# define COMPILER_VERSION_MAJOR DEC(__clang_major__) +# define COMPILER_VERSION_MINOR DEC(__clang_minor__) +# define COMPILER_VERSION_PATCH DEC(__clang_patchlevel__) +# if defined(_MSC_VER) + /* _MSC_VER = VVRR */ +# define SIMULATE_VERSION_MAJOR DEC(_MSC_VER / 100) +# define SIMULATE_VERSION_MINOR DEC(_MSC_VER % 100) +# endif +# define COMPILER_VERSION_TWEAK DEC(__apple_build_version__) + +#elif defined(__clang__) && defined(__ARMCOMPILER_VERSION) +# define COMPILER_ID "ARMClang" + # define COMPILER_VERSION_MAJOR DEC(__ARMCOMPILER_VERSION/1000000) + # define COMPILER_VERSION_MINOR DEC(__ARMCOMPILER_VERSION/10000 % 100) + # define COMPILER_VERSION_PATCH DEC(__ARMCOMPILER_VERSION/100 % 100) +# define COMPILER_VERSION_INTERNAL DEC(__ARMCOMPILER_VERSION) + +#elif defined(__clang__) && defined(__ti__) +# define COMPILER_ID "TIClang" + # define COMPILER_VERSION_MAJOR DEC(__ti_major__) + # define COMPILER_VERSION_MINOR DEC(__ti_minor__) + # define COMPILER_VERSION_PATCH DEC(__ti_patchlevel__) +# define COMPILER_VERSION_INTERNAL DEC(__ti_version__) + +#elif defined(__clang__) +# define COMPILER_ID "Clang" +# if defined(_MSC_VER) +# define SIMULATE_ID "MSVC" +# endif +# define COMPILER_VERSION_MAJOR DEC(__clang_major__) +# define COMPILER_VERSION_MINOR DEC(__clang_minor__) +# define COMPILER_VERSION_PATCH DEC(__clang_patchlevel__) +# if defined(_MSC_VER) + /* _MSC_VER = VVRR */ +# define SIMULATE_VERSION_MAJOR DEC(_MSC_VER / 100) +# define SIMULATE_VERSION_MINOR DEC(_MSC_VER % 100) +# endif + +#elif defined(__LCC__) && (defined(__GNUC__) || defined(__GNUG__) || defined(__MCST__)) +# define COMPILER_ID "LCC" +# define COMPILER_VERSION_MAJOR DEC(__LCC__ / 100) +# define COMPILER_VERSION_MINOR DEC(__LCC__ % 100) +# if defined(__LCC_MINOR__) +# define COMPILER_VERSION_PATCH DEC(__LCC_MINOR__) +# endif +# if defined(__GNUC__) && defined(__GNUC_MINOR__) +# define SIMULATE_ID "GNU" +# define SIMULATE_VERSION_MAJOR DEC(__GNUC__) +# define SIMULATE_VERSION_MINOR DEC(__GNUC_MINOR__) +# if defined(__GNUC_PATCHLEVEL__) +# define SIMULATE_VERSION_PATCH DEC(__GNUC_PATCHLEVEL__) +# endif +# endif + +#elif defined(__GNUC__) +# define COMPILER_ID "GNU" +# define COMPILER_VERSION_MAJOR DEC(__GNUC__) +# if defined(__GNUC_MINOR__) +# define COMPILER_VERSION_MINOR DEC(__GNUC_MINOR__) +# endif +# if defined(__GNUC_PATCHLEVEL__) +# define COMPILER_VERSION_PATCH DEC(__GNUC_PATCHLEVEL__) +# endif + +#elif defined(_MSC_VER) +# define COMPILER_ID "MSVC" + /* _MSC_VER = VVRR */ +# define COMPILER_VERSION_MAJOR DEC(_MSC_VER / 100) +# define COMPILER_VERSION_MINOR DEC(_MSC_VER % 100) +# if defined(_MSC_FULL_VER) +# if _MSC_VER >= 1400 + /* _MSC_FULL_VER = VVRRPPPPP */ +# define COMPILER_VERSION_PATCH DEC(_MSC_FULL_VER % 100000) +# else + /* _MSC_FULL_VER = VVRRPPPP */ +# define COMPILER_VERSION_PATCH DEC(_MSC_FULL_VER % 10000) +# endif +# endif +# if defined(_MSC_BUILD) +# define COMPILER_VERSION_TWEAK DEC(_MSC_BUILD) +# endif + +#elif defined(_ADI_COMPILER) +# define COMPILER_ID "ADSP" +#if defined(__VERSIONNUM__) + /* __VERSIONNUM__ = 0xVVRRPPTT */ +# define COMPILER_VERSION_MAJOR DEC(__VERSIONNUM__ >> 24 & 0xFF) +# define COMPILER_VERSION_MINOR DEC(__VERSIONNUM__ >> 16 & 0xFF) +# define COMPILER_VERSION_PATCH DEC(__VERSIONNUM__ >> 8 & 0xFF) +# define COMPILER_VERSION_TWEAK DEC(__VERSIONNUM__ & 0xFF) +#endif + +#elif defined(__IAR_SYSTEMS_ICC__) || defined(__IAR_SYSTEMS_ICC) +# define COMPILER_ID "IAR" +# if defined(__VER__) && defined(__ICCARM__) +# define COMPILER_VERSION_MAJOR DEC((__VER__) / 1000000) +# define COMPILER_VERSION_MINOR DEC(((__VER__) / 1000) % 1000) +# define COMPILER_VERSION_PATCH DEC((__VER__) % 1000) +# define COMPILER_VERSION_INTERNAL DEC(__IAR_SYSTEMS_ICC__) +# elif defined(__VER__) && (defined(__ICCAVR__) || defined(__ICCRX__) || defined(__ICCRH850__) || defined(__ICCRL78__) || defined(__ICC430__) || defined(__ICCRISCV__) || defined(__ICCV850__) || defined(__ICC8051__) || defined(__ICCSTM8__)) +# define COMPILER_VERSION_MAJOR DEC((__VER__) / 100) +# define COMPILER_VERSION_MINOR DEC((__VER__) - (((__VER__) / 100)*100)) +# define COMPILER_VERSION_PATCH DEC(__SUBVERSION__) +# define COMPILER_VERSION_INTERNAL DEC(__IAR_SYSTEMS_ICC__) +# endif + +#elif defined(__SDCC_VERSION_MAJOR) || defined(SDCC) +# define COMPILER_ID "SDCC" +# if defined(__SDCC_VERSION_MAJOR) +# define COMPILER_VERSION_MAJOR DEC(__SDCC_VERSION_MAJOR) +# define COMPILER_VERSION_MINOR DEC(__SDCC_VERSION_MINOR) +# define COMPILER_VERSION_PATCH DEC(__SDCC_VERSION_PATCH) +# else + /* SDCC = VRP */ +# define COMPILER_VERSION_MAJOR DEC(SDCC/100) +# define COMPILER_VERSION_MINOR DEC(SDCC/10 % 10) +# define COMPILER_VERSION_PATCH DEC(SDCC % 10) +# endif + + +/* These compilers are either not known or too old to define an + identification macro. Try to identify the platform and guess that + it is the native compiler. */ +#elif defined(__hpux) || defined(__hpua) +# define COMPILER_ID "HP" + +#else /* unknown compiler */ +# define COMPILER_ID "" +#endif + +/* Construct the string literal in pieces to prevent the source from + getting matched. Store it in a pointer rather than an array + because some compilers will just produce instructions to fill the + array rather than assigning a pointer to a static array. */ +char const* info_compiler = "INFO" ":" "compiler[" COMPILER_ID "]"; +#ifdef SIMULATE_ID +char const* info_simulate = "INFO" ":" "simulate[" SIMULATE_ID "]"; +#endif + +#ifdef __QNXNTO__ +char const* qnxnto = "INFO" ":" "qnxnto[]"; +#endif + +#if defined(__CRAYXT_COMPUTE_LINUX_TARGET) +char const *info_cray = "INFO" ":" "compiler_wrapper[CrayPrgEnv]"; +#endif + +#define STRINGIFY_HELPER(X) #X +#define STRINGIFY(X) STRINGIFY_HELPER(X) + +/* Identify known platforms by name. */ +#if defined(__linux) || defined(__linux__) || defined(linux) +# define PLATFORM_ID "Linux" + +#elif defined(__MSYS__) +# define PLATFORM_ID "MSYS" + +#elif defined(__CYGWIN__) +# define PLATFORM_ID "Cygwin" + +#elif defined(__MINGW32__) +# define PLATFORM_ID "MinGW" + +#elif defined(__APPLE__) +# define PLATFORM_ID "Darwin" + +#elif defined(_WIN32) || defined(__WIN32__) || defined(WIN32) +# define PLATFORM_ID "Windows" + +#elif defined(__FreeBSD__) || defined(__FreeBSD) +# define PLATFORM_ID "FreeBSD" + +#elif defined(__NetBSD__) || defined(__NetBSD) +# define PLATFORM_ID "NetBSD" + +#elif defined(__OpenBSD__) || defined(__OPENBSD) +# define PLATFORM_ID "OpenBSD" + +#elif defined(__sun) || defined(sun) +# define PLATFORM_ID "SunOS" + +#elif defined(_AIX) || defined(__AIX) || defined(__AIX__) || defined(__aix) || defined(__aix__) +# define PLATFORM_ID "AIX" + +#elif defined(__hpux) || defined(__hpux__) +# define PLATFORM_ID "HP-UX" + +#elif defined(__HAIKU__) +# define PLATFORM_ID "Haiku" + +#elif defined(__BeOS) || defined(__BEOS__) || defined(_BEOS) +# define PLATFORM_ID "BeOS" + +#elif defined(__QNX__) || defined(__QNXNTO__) +# define PLATFORM_ID "QNX" + +#elif defined(__tru64) || defined(_tru64) || defined(__TRU64__) +# define PLATFORM_ID "Tru64" + +#elif defined(__riscos) || defined(__riscos__) +# define PLATFORM_ID "RISCos" + +#elif defined(__sinix) || defined(__sinix__) || defined(__SINIX__) +# define PLATFORM_ID "SINIX" + +#elif defined(__UNIX_SV__) +# define PLATFORM_ID "UNIX_SV" + +#elif defined(__bsdos__) +# define PLATFORM_ID "BSDOS" + +#elif defined(_MPRAS) || defined(MPRAS) +# define PLATFORM_ID "MP-RAS" + +#elif defined(__osf) || defined(__osf__) +# define PLATFORM_ID "OSF1" + +#elif defined(_SCO_SV) || defined(SCO_SV) || defined(sco_sv) +# define PLATFORM_ID "SCO_SV" + +#elif defined(__ultrix) || defined(__ultrix__) || defined(_ULTRIX) +# define PLATFORM_ID "ULTRIX" + +#elif defined(__XENIX__) || defined(_XENIX) || defined(XENIX) +# define PLATFORM_ID "Xenix" + +#elif defined(__WATCOMC__) +# if defined(__LINUX__) +# define PLATFORM_ID "Linux" + +# elif defined(__DOS__) +# define PLATFORM_ID "DOS" + +# elif defined(__OS2__) +# define PLATFORM_ID "OS2" + +# elif defined(__WINDOWS__) +# define PLATFORM_ID "Windows3x" + +# elif defined(__VXWORKS__) +# define PLATFORM_ID "VxWorks" + +# else /* unknown platform */ +# define PLATFORM_ID +# endif + +#elif defined(__INTEGRITY) +# if defined(INT_178B) +# define PLATFORM_ID "Integrity178" + +# else /* regular Integrity */ +# define PLATFORM_ID "Integrity" +# endif + +# elif defined(_ADI_COMPILER) +# define PLATFORM_ID "ADSP" + +#else /* unknown platform */ +# define PLATFORM_ID + +#endif + +/* For windows compilers MSVC and Intel we can determine + the architecture of the compiler being used. This is because + the compilers do not have flags that can change the architecture, + but rather depend on which compiler is being used +*/ +#if defined(_WIN32) && defined(_MSC_VER) +# if defined(_M_IA64) +# define ARCHITECTURE_ID "IA64" + +# elif defined(_M_ARM64EC) +# define ARCHITECTURE_ID "ARM64EC" + +# elif defined(_M_X64) || defined(_M_AMD64) +# define ARCHITECTURE_ID "x64" + +# elif defined(_M_IX86) +# define ARCHITECTURE_ID "X86" + +# elif defined(_M_ARM64) +# define ARCHITECTURE_ID "ARM64" + +# elif defined(_M_ARM) +# if _M_ARM == 4 +# define ARCHITECTURE_ID "ARMV4I" +# elif _M_ARM == 5 +# define ARCHITECTURE_ID "ARMV5I" +# else +# define ARCHITECTURE_ID "ARMV" STRINGIFY(_M_ARM) +# endif + +# elif defined(_M_MIPS) +# define ARCHITECTURE_ID "MIPS" + +# elif defined(_M_SH) +# define ARCHITECTURE_ID "SHx" + +# else /* unknown architecture */ +# define ARCHITECTURE_ID "" +# endif + +#elif defined(__WATCOMC__) +# if defined(_M_I86) +# define ARCHITECTURE_ID "I86" + +# elif defined(_M_IX86) +# define ARCHITECTURE_ID "X86" + +# else /* unknown architecture */ +# define ARCHITECTURE_ID "" +# endif + +#elif defined(__IAR_SYSTEMS_ICC__) || defined(__IAR_SYSTEMS_ICC) +# if defined(__ICCARM__) +# define ARCHITECTURE_ID "ARM" + +# elif defined(__ICCRX__) +# define ARCHITECTURE_ID "RX" + +# elif defined(__ICCRH850__) +# define ARCHITECTURE_ID "RH850" + +# elif defined(__ICCRL78__) +# define ARCHITECTURE_ID "RL78" + +# elif defined(__ICCRISCV__) +# define ARCHITECTURE_ID "RISCV" + +# elif defined(__ICCAVR__) +# define ARCHITECTURE_ID "AVR" + +# elif defined(__ICC430__) +# define ARCHITECTURE_ID "MSP430" + +# elif defined(__ICCV850__) +# define ARCHITECTURE_ID "V850" + +# elif defined(__ICC8051__) +# define ARCHITECTURE_ID "8051" + +# elif defined(__ICCSTM8__) +# define ARCHITECTURE_ID "STM8" + +# else /* unknown architecture */ +# define ARCHITECTURE_ID "" +# endif + +#elif defined(__ghs__) +# if defined(__PPC64__) +# define ARCHITECTURE_ID "PPC64" + +# elif defined(__ppc__) +# define ARCHITECTURE_ID "PPC" + +# elif defined(__ARM__) +# define ARCHITECTURE_ID "ARM" + +# elif defined(__x86_64__) +# define ARCHITECTURE_ID "x64" + +# elif defined(__i386__) +# define ARCHITECTURE_ID "X86" + +# else /* unknown architecture */ +# define ARCHITECTURE_ID "" +# endif + +#elif defined(__clang__) && defined(__ti__) +# if defined(__ARM_ARCH) +# define ARCHITECTURE_ID "Arm" + +# else /* unknown architecture */ +# define ARCHITECTURE_ID "" +# endif + +#elif defined(__TI_COMPILER_VERSION__) +# if defined(__TI_ARM__) +# define ARCHITECTURE_ID "ARM" + +# elif defined(__MSP430__) +# define ARCHITECTURE_ID "MSP430" + +# elif defined(__TMS320C28XX__) +# define ARCHITECTURE_ID "TMS320C28x" + +# elif defined(__TMS320C6X__) || defined(_TMS320C6X) +# define ARCHITECTURE_ID "TMS320C6x" + +# else /* unknown architecture */ +# define ARCHITECTURE_ID "" +# endif + +# elif defined(__ADSPSHARC__) +# define ARCHITECTURE_ID "SHARC" + +# elif defined(__ADSPBLACKFIN__) +# define ARCHITECTURE_ID "Blackfin" + +#elif defined(__TASKING__) + +# if defined(__CTC__) || defined(__CPTC__) +# define ARCHITECTURE_ID "TriCore" + +# elif defined(__CMCS__) +# define ARCHITECTURE_ID "MCS" + +# elif defined(__CARM__) +# define ARCHITECTURE_ID "ARM" + +# elif defined(__CARC__) +# define ARCHITECTURE_ID "ARC" + +# elif defined(__C51__) +# define ARCHITECTURE_ID "8051" + +# elif defined(__CPCP__) +# define ARCHITECTURE_ID "PCP" + +# else +# define ARCHITECTURE_ID "" +# endif + +#else +# define ARCHITECTURE_ID +#endif + +/* Convert integer to decimal digit literals. */ +#define DEC(n) \ + ('0' + (((n) / 10000000)%10)), \ + ('0' + (((n) / 1000000)%10)), \ + ('0' + (((n) / 100000)%10)), \ + ('0' + (((n) / 10000)%10)), \ + ('0' + (((n) / 1000)%10)), \ + ('0' + (((n) / 100)%10)), \ + ('0' + (((n) / 10)%10)), \ + ('0' + ((n) % 10)) + +/* Convert integer to hex digit literals. */ +#define HEX(n) \ + ('0' + ((n)>>28 & 0xF)), \ + ('0' + ((n)>>24 & 0xF)), \ + ('0' + ((n)>>20 & 0xF)), \ + ('0' + ((n)>>16 & 0xF)), \ + ('0' + ((n)>>12 & 0xF)), \ + ('0' + ((n)>>8 & 0xF)), \ + ('0' + ((n)>>4 & 0xF)), \ + ('0' + ((n) & 0xF)) + +/* Construct a string literal encoding the version number. */ +#ifdef COMPILER_VERSION +char const* info_version = "INFO" ":" "compiler_version[" COMPILER_VERSION "]"; + +/* Construct a string literal encoding the version number components. */ +#elif defined(COMPILER_VERSION_MAJOR) +char const info_version[] = { + 'I', 'N', 'F', 'O', ':', + 'c','o','m','p','i','l','e','r','_','v','e','r','s','i','o','n','[', + COMPILER_VERSION_MAJOR, +# ifdef COMPILER_VERSION_MINOR + '.', COMPILER_VERSION_MINOR, +# ifdef COMPILER_VERSION_PATCH + '.', COMPILER_VERSION_PATCH, +# ifdef COMPILER_VERSION_TWEAK + '.', COMPILER_VERSION_TWEAK, +# endif +# endif +# endif + ']','\0'}; +#endif + +/* Construct a string literal encoding the internal version number. */ +#ifdef COMPILER_VERSION_INTERNAL +char const info_version_internal[] = { + 'I', 'N', 'F', 'O', ':', + 'c','o','m','p','i','l','e','r','_','v','e','r','s','i','o','n','_', + 'i','n','t','e','r','n','a','l','[', + COMPILER_VERSION_INTERNAL,']','\0'}; +#elif defined(COMPILER_VERSION_INTERNAL_STR) +char const* info_version_internal = "INFO" ":" "compiler_version_internal[" COMPILER_VERSION_INTERNAL_STR "]"; +#endif + +/* Construct a string literal encoding the version number components. */ +#ifdef SIMULATE_VERSION_MAJOR +char const info_simulate_version[] = { + 'I', 'N', 'F', 'O', ':', + 's','i','m','u','l','a','t','e','_','v','e','r','s','i','o','n','[', + SIMULATE_VERSION_MAJOR, +# ifdef SIMULATE_VERSION_MINOR + '.', SIMULATE_VERSION_MINOR, +# ifdef SIMULATE_VERSION_PATCH + '.', SIMULATE_VERSION_PATCH, +# ifdef SIMULATE_VERSION_TWEAK + '.', SIMULATE_VERSION_TWEAK, +# endif +# endif +# endif + ']','\0'}; +#endif + +/* Construct the string literal in pieces to prevent the source from + getting matched. Store it in a pointer rather than an array + because some compilers will just produce instructions to fill the + array rather than assigning a pointer to a static array. */ +char const* info_platform = "INFO" ":" "platform[" PLATFORM_ID "]"; +char const* info_arch = "INFO" ":" "arch[" ARCHITECTURE_ID "]"; + + + +#define C_STD_99 199901L +#define C_STD_11 201112L +#define C_STD_17 201710L +#define C_STD_23 202311L + +#ifdef __STDC_VERSION__ +# define C_STD __STDC_VERSION__ +#endif + +#if !defined(__STDC__) && !defined(__clang__) +# if defined(_MSC_VER) || defined(__ibmxl__) || defined(__IBMC__) +# define C_VERSION "90" +# else +# define C_VERSION +# endif +#elif C_STD > C_STD_17 +# define C_VERSION "23" +#elif C_STD > C_STD_11 +# define C_VERSION "17" +#elif C_STD > C_STD_99 +# define C_VERSION "11" +#elif C_STD >= C_STD_99 +# define C_VERSION "99" +#else +# define C_VERSION "90" +#endif +const char* info_language_standard_default = + "INFO" ":" "standard_default[" C_VERSION "]"; + +const char* info_language_extensions_default = "INFO" ":" "extensions_default[" +#if (defined(__clang__) || defined(__GNUC__) || defined(__xlC__) || \ + defined(__TI_COMPILER_VERSION__)) && \ + !defined(__STRICT_ANSI__) + "ON" +#else + "OFF" +#endif +"]"; + +/*--------------------------------------------------------------------------*/ + +#ifdef ID_VOID_MAIN +void main() {} +#else +# if defined(__CLASSIC_C__) +int main(argc, argv) int argc; char *argv[]; +# else +int main(int argc, char* argv[]) +# endif +{ + int require = 0; + require += info_compiler[argc]; + require += info_platform[argc]; + require += info_arch[argc]; +#ifdef COMPILER_VERSION_MAJOR + require += info_version[argc]; +#endif +#ifdef COMPILER_VERSION_INTERNAL + require += info_version_internal[argc]; +#endif +#ifdef SIMULATE_ID + require += info_simulate[argc]; +#endif +#ifdef SIMULATE_VERSION_MAJOR + require += info_simulate_version[argc]; +#endif +#if defined(__CRAYXT_COMPUTE_LINUX_TARGET) + require += info_cray[argc]; +#endif + require += info_language_standard_default[argc]; + require += info_language_extensions_default[argc]; + (void)argv; + return require; +} +#endif diff --git a/siro_rider/android/app/.cxx/Debug/3p4b322x/arm64-v8a/CMakeFiles/3.31.5-g6cf5163/CompilerIdC/CMakeCCompilerId.o b/siro_rider/android/app/.cxx/Debug/3p4b322x/arm64-v8a/CMakeFiles/3.31.5-g6cf5163/CompilerIdC/CMakeCCompilerId.o new file mode 100644 index 0000000..75e83ff Binary files /dev/null and b/siro_rider/android/app/.cxx/Debug/3p4b322x/arm64-v8a/CMakeFiles/3.31.5-g6cf5163/CompilerIdC/CMakeCCompilerId.o differ diff --git a/siro_rider/android/app/.cxx/Debug/3p4b322x/arm64-v8a/CMakeFiles/3.31.5-g6cf5163/CompilerIdCXX/CMakeCXXCompilerId.cpp b/siro_rider/android/app/.cxx/Debug/3p4b322x/arm64-v8a/CMakeFiles/3.31.5-g6cf5163/CompilerIdCXX/CMakeCXXCompilerId.cpp new file mode 100644 index 0000000..da6c824 --- /dev/null +++ b/siro_rider/android/app/.cxx/Debug/3p4b322x/arm64-v8a/CMakeFiles/3.31.5-g6cf5163/CompilerIdCXX/CMakeCXXCompilerId.cpp @@ -0,0 +1,919 @@ +/* This source file must have a .cpp extension so that all C++ compilers + recognize the extension without flags. Borland does not know .cxx for + example. */ +#ifndef __cplusplus +# error "A C compiler has been selected for C++." +#endif + +#if !defined(__has_include) +/* If the compiler does not have __has_include, pretend the answer is + always no. */ +# define __has_include(x) 0 +#endif + + +/* Version number components: V=Version, R=Revision, P=Patch + Version date components: YYYY=Year, MM=Month, DD=Day */ + +#if defined(__INTEL_COMPILER) || defined(__ICC) +# define COMPILER_ID "Intel" +# if defined(_MSC_VER) +# define SIMULATE_ID "MSVC" +# endif +# if defined(__GNUC__) +# define SIMULATE_ID "GNU" +# endif + /* __INTEL_COMPILER = VRP prior to 2021, and then VVVV for 2021 and later, + except that a few beta releases use the old format with V=2021. */ +# if __INTEL_COMPILER < 2021 || __INTEL_COMPILER == 202110 || __INTEL_COMPILER == 202111 +# define COMPILER_VERSION_MAJOR DEC(__INTEL_COMPILER/100) +# define COMPILER_VERSION_MINOR DEC(__INTEL_COMPILER/10 % 10) +# if defined(__INTEL_COMPILER_UPDATE) +# define COMPILER_VERSION_PATCH DEC(__INTEL_COMPILER_UPDATE) +# else +# define COMPILER_VERSION_PATCH DEC(__INTEL_COMPILER % 10) +# endif +# else +# define COMPILER_VERSION_MAJOR DEC(__INTEL_COMPILER) +# define COMPILER_VERSION_MINOR DEC(__INTEL_COMPILER_UPDATE) + /* The third version component from --version is an update index, + but no macro is provided for it. */ +# define COMPILER_VERSION_PATCH DEC(0) +# endif +# if defined(__INTEL_COMPILER_BUILD_DATE) + /* __INTEL_COMPILER_BUILD_DATE = YYYYMMDD */ +# define COMPILER_VERSION_TWEAK DEC(__INTEL_COMPILER_BUILD_DATE) +# endif +# if defined(_MSC_VER) + /* _MSC_VER = VVRR */ +# define SIMULATE_VERSION_MAJOR DEC(_MSC_VER / 100) +# define SIMULATE_VERSION_MINOR DEC(_MSC_VER % 100) +# endif +# if defined(__GNUC__) +# define SIMULATE_VERSION_MAJOR DEC(__GNUC__) +# elif defined(__GNUG__) +# define SIMULATE_VERSION_MAJOR DEC(__GNUG__) +# endif +# if defined(__GNUC_MINOR__) +# define SIMULATE_VERSION_MINOR DEC(__GNUC_MINOR__) +# endif +# if defined(__GNUC_PATCHLEVEL__) +# define SIMULATE_VERSION_PATCH DEC(__GNUC_PATCHLEVEL__) +# endif + +#elif (defined(__clang__) && defined(__INTEL_CLANG_COMPILER)) || defined(__INTEL_LLVM_COMPILER) +# define COMPILER_ID "IntelLLVM" +#if defined(_MSC_VER) +# define SIMULATE_ID "MSVC" +#endif +#if defined(__GNUC__) +# define SIMULATE_ID "GNU" +#endif +/* __INTEL_LLVM_COMPILER = VVVVRP prior to 2021.2.0, VVVVRRPP for 2021.2.0 and + * later. Look for 6 digit vs. 8 digit version number to decide encoding. + * VVVV is no smaller than the current year when a version is released. + */ +#if __INTEL_LLVM_COMPILER < 1000000L +# define COMPILER_VERSION_MAJOR DEC(__INTEL_LLVM_COMPILER/100) +# define COMPILER_VERSION_MINOR DEC(__INTEL_LLVM_COMPILER/10 % 10) +# define COMPILER_VERSION_PATCH DEC(__INTEL_LLVM_COMPILER % 10) +#else +# define COMPILER_VERSION_MAJOR DEC(__INTEL_LLVM_COMPILER/10000) +# define COMPILER_VERSION_MINOR DEC(__INTEL_LLVM_COMPILER/100 % 100) +# define COMPILER_VERSION_PATCH DEC(__INTEL_LLVM_COMPILER % 100) +#endif +#if defined(_MSC_VER) + /* _MSC_VER = VVRR */ +# define SIMULATE_VERSION_MAJOR DEC(_MSC_VER / 100) +# define SIMULATE_VERSION_MINOR DEC(_MSC_VER % 100) +#endif +#if defined(__GNUC__) +# define SIMULATE_VERSION_MAJOR DEC(__GNUC__) +#elif defined(__GNUG__) +# define SIMULATE_VERSION_MAJOR DEC(__GNUG__) +#endif +#if defined(__GNUC_MINOR__) +# define SIMULATE_VERSION_MINOR DEC(__GNUC_MINOR__) +#endif +#if defined(__GNUC_PATCHLEVEL__) +# define SIMULATE_VERSION_PATCH DEC(__GNUC_PATCHLEVEL__) +#endif + +#elif defined(__PATHCC__) +# define COMPILER_ID "PathScale" +# define COMPILER_VERSION_MAJOR DEC(__PATHCC__) +# define COMPILER_VERSION_MINOR DEC(__PATHCC_MINOR__) +# if defined(__PATHCC_PATCHLEVEL__) +# define COMPILER_VERSION_PATCH DEC(__PATHCC_PATCHLEVEL__) +# endif + +#elif defined(__BORLANDC__) && defined(__CODEGEARC_VERSION__) +# define COMPILER_ID "Embarcadero" +# define COMPILER_VERSION_MAJOR HEX(__CODEGEARC_VERSION__>>24 & 0x00FF) +# define COMPILER_VERSION_MINOR HEX(__CODEGEARC_VERSION__>>16 & 0x00FF) +# define COMPILER_VERSION_PATCH DEC(__CODEGEARC_VERSION__ & 0xFFFF) + +#elif defined(__BORLANDC__) +# define COMPILER_ID "Borland" + /* __BORLANDC__ = 0xVRR */ +# define COMPILER_VERSION_MAJOR HEX(__BORLANDC__>>8) +# define COMPILER_VERSION_MINOR HEX(__BORLANDC__ & 0xFF) + +#elif defined(__WATCOMC__) && __WATCOMC__ < 1200 +# define COMPILER_ID "Watcom" + /* __WATCOMC__ = VVRR */ +# define COMPILER_VERSION_MAJOR DEC(__WATCOMC__ / 100) +# define COMPILER_VERSION_MINOR DEC((__WATCOMC__ / 10) % 10) +# if (__WATCOMC__ % 10) > 0 +# define COMPILER_VERSION_PATCH DEC(__WATCOMC__ % 10) +# endif + +#elif defined(__WATCOMC__) +# define COMPILER_ID "OpenWatcom" + /* __WATCOMC__ = VVRP + 1100 */ +# define COMPILER_VERSION_MAJOR DEC((__WATCOMC__ - 1100) / 100) +# define COMPILER_VERSION_MINOR DEC((__WATCOMC__ / 10) % 10) +# if (__WATCOMC__ % 10) > 0 +# define COMPILER_VERSION_PATCH DEC(__WATCOMC__ % 10) +# endif + +#elif defined(__SUNPRO_CC) +# define COMPILER_ID "SunPro" +# if __SUNPRO_CC >= 0x5100 + /* __SUNPRO_CC = 0xVRRP */ +# define COMPILER_VERSION_MAJOR HEX(__SUNPRO_CC>>12) +# define COMPILER_VERSION_MINOR HEX(__SUNPRO_CC>>4 & 0xFF) +# define COMPILER_VERSION_PATCH HEX(__SUNPRO_CC & 0xF) +# else + /* __SUNPRO_CC = 0xVRP */ +# define COMPILER_VERSION_MAJOR HEX(__SUNPRO_CC>>8) +# define COMPILER_VERSION_MINOR HEX(__SUNPRO_CC>>4 & 0xF) +# define COMPILER_VERSION_PATCH HEX(__SUNPRO_CC & 0xF) +# endif + +#elif defined(__HP_aCC) +# define COMPILER_ID "HP" + /* __HP_aCC = VVRRPP */ +# define COMPILER_VERSION_MAJOR DEC(__HP_aCC/10000) +# define COMPILER_VERSION_MINOR DEC(__HP_aCC/100 % 100) +# define COMPILER_VERSION_PATCH DEC(__HP_aCC % 100) + +#elif defined(__DECCXX) +# define COMPILER_ID "Compaq" + /* __DECCXX_VER = VVRRTPPPP */ +# define COMPILER_VERSION_MAJOR DEC(__DECCXX_VER/10000000) +# define COMPILER_VERSION_MINOR DEC(__DECCXX_VER/100000 % 100) +# define COMPILER_VERSION_PATCH DEC(__DECCXX_VER % 10000) + +#elif defined(__IBMCPP__) && defined(__COMPILER_VER__) +# define COMPILER_ID "zOS" + /* __IBMCPP__ = VRP */ +# define COMPILER_VERSION_MAJOR DEC(__IBMCPP__/100) +# define COMPILER_VERSION_MINOR DEC(__IBMCPP__/10 % 10) +# define COMPILER_VERSION_PATCH DEC(__IBMCPP__ % 10) + +#elif defined(__open_xl__) && defined(__clang__) +# define COMPILER_ID "IBMClang" +# define COMPILER_VERSION_MAJOR DEC(__open_xl_version__) +# define COMPILER_VERSION_MINOR DEC(__open_xl_release__) +# define COMPILER_VERSION_PATCH DEC(__open_xl_modification__) +# define COMPILER_VERSION_TWEAK DEC(__open_xl_ptf_fix_level__) + + +#elif defined(__ibmxl__) && defined(__clang__) +# define COMPILER_ID "XLClang" +# define COMPILER_VERSION_MAJOR DEC(__ibmxl_version__) +# define COMPILER_VERSION_MINOR DEC(__ibmxl_release__) +# define COMPILER_VERSION_PATCH DEC(__ibmxl_modification__) +# define COMPILER_VERSION_TWEAK DEC(__ibmxl_ptf_fix_level__) + + +#elif defined(__IBMCPP__) && !defined(__COMPILER_VER__) && __IBMCPP__ >= 800 +# define COMPILER_ID "XL" + /* __IBMCPP__ = VRP */ +# define COMPILER_VERSION_MAJOR DEC(__IBMCPP__/100) +# define COMPILER_VERSION_MINOR DEC(__IBMCPP__/10 % 10) +# define COMPILER_VERSION_PATCH DEC(__IBMCPP__ % 10) + +#elif defined(__IBMCPP__) && !defined(__COMPILER_VER__) && __IBMCPP__ < 800 +# define COMPILER_ID "VisualAge" + /* __IBMCPP__ = VRP */ +# define COMPILER_VERSION_MAJOR DEC(__IBMCPP__/100) +# define COMPILER_VERSION_MINOR DEC(__IBMCPP__/10 % 10) +# define COMPILER_VERSION_PATCH DEC(__IBMCPP__ % 10) + +#elif defined(__NVCOMPILER) +# define COMPILER_ID "NVHPC" +# define COMPILER_VERSION_MAJOR DEC(__NVCOMPILER_MAJOR__) +# define COMPILER_VERSION_MINOR DEC(__NVCOMPILER_MINOR__) +# if defined(__NVCOMPILER_PATCHLEVEL__) +# define COMPILER_VERSION_PATCH DEC(__NVCOMPILER_PATCHLEVEL__) +# endif + +#elif defined(__PGI) +# define COMPILER_ID "PGI" +# define COMPILER_VERSION_MAJOR DEC(__PGIC__) +# define COMPILER_VERSION_MINOR DEC(__PGIC_MINOR__) +# if defined(__PGIC_PATCHLEVEL__) +# define COMPILER_VERSION_PATCH DEC(__PGIC_PATCHLEVEL__) +# endif + +#elif defined(__clang__) && defined(__cray__) +# define COMPILER_ID "CrayClang" +# define COMPILER_VERSION_MAJOR DEC(__cray_major__) +# define COMPILER_VERSION_MINOR DEC(__cray_minor__) +# define COMPILER_VERSION_PATCH DEC(__cray_patchlevel__) +# define COMPILER_VERSION_INTERNAL_STR __clang_version__ + + +#elif defined(_CRAYC) +# define COMPILER_ID "Cray" +# define COMPILER_VERSION_MAJOR DEC(_RELEASE_MAJOR) +# define COMPILER_VERSION_MINOR DEC(_RELEASE_MINOR) + +#elif defined(__TI_COMPILER_VERSION__) +# define COMPILER_ID "TI" + /* __TI_COMPILER_VERSION__ = VVVRRRPPP */ +# define COMPILER_VERSION_MAJOR DEC(__TI_COMPILER_VERSION__/1000000) +# define COMPILER_VERSION_MINOR DEC(__TI_COMPILER_VERSION__/1000 % 1000) +# define COMPILER_VERSION_PATCH DEC(__TI_COMPILER_VERSION__ % 1000) + +#elif defined(__CLANG_FUJITSU) +# define COMPILER_ID "FujitsuClang" +# define COMPILER_VERSION_MAJOR DEC(__FCC_major__) +# define COMPILER_VERSION_MINOR DEC(__FCC_minor__) +# define COMPILER_VERSION_PATCH DEC(__FCC_patchlevel__) +# define COMPILER_VERSION_INTERNAL_STR __clang_version__ + + +#elif defined(__FUJITSU) +# define COMPILER_ID "Fujitsu" +# if defined(__FCC_version__) +# define COMPILER_VERSION __FCC_version__ +# elif defined(__FCC_major__) +# define COMPILER_VERSION_MAJOR DEC(__FCC_major__) +# define COMPILER_VERSION_MINOR DEC(__FCC_minor__) +# define COMPILER_VERSION_PATCH DEC(__FCC_patchlevel__) +# endif +# if defined(__fcc_version) +# define COMPILER_VERSION_INTERNAL DEC(__fcc_version) +# elif defined(__FCC_VERSION) +# define COMPILER_VERSION_INTERNAL DEC(__FCC_VERSION) +# endif + + +#elif defined(__ghs__) +# define COMPILER_ID "GHS" +/* __GHS_VERSION_NUMBER = VVVVRP */ +# ifdef __GHS_VERSION_NUMBER +# define COMPILER_VERSION_MAJOR DEC(__GHS_VERSION_NUMBER / 100) +# define COMPILER_VERSION_MINOR DEC(__GHS_VERSION_NUMBER / 10 % 10) +# define COMPILER_VERSION_PATCH DEC(__GHS_VERSION_NUMBER % 10) +# endif + +#elif defined(__TASKING__) +# define COMPILER_ID "Tasking" + # define COMPILER_VERSION_MAJOR DEC(__VERSION__/1000) + # define COMPILER_VERSION_MINOR DEC(__VERSION__ % 100) +# define COMPILER_VERSION_INTERNAL DEC(__VERSION__) + +#elif defined(__ORANGEC__) +# define COMPILER_ID "OrangeC" +# define COMPILER_VERSION_MAJOR DEC(__ORANGEC_MAJOR__) +# define COMPILER_VERSION_MINOR DEC(__ORANGEC_MINOR__) +# define COMPILER_VERSION_PATCH DEC(__ORANGEC_PATCHLEVEL__) + +#elif defined(__SCO_VERSION__) +# define COMPILER_ID "SCO" + +#elif defined(__ARMCC_VERSION) && !defined(__clang__) +# define COMPILER_ID "ARMCC" +#if __ARMCC_VERSION >= 1000000 + /* __ARMCC_VERSION = VRRPPPP */ + # define COMPILER_VERSION_MAJOR DEC(__ARMCC_VERSION/1000000) + # define COMPILER_VERSION_MINOR DEC(__ARMCC_VERSION/10000 % 100) + # define COMPILER_VERSION_PATCH DEC(__ARMCC_VERSION % 10000) +#else + /* __ARMCC_VERSION = VRPPPP */ + # define COMPILER_VERSION_MAJOR DEC(__ARMCC_VERSION/100000) + # define COMPILER_VERSION_MINOR DEC(__ARMCC_VERSION/10000 % 10) + # define COMPILER_VERSION_PATCH DEC(__ARMCC_VERSION % 10000) +#endif + + +#elif defined(__clang__) && defined(__apple_build_version__) +# define COMPILER_ID "AppleClang" +# if defined(_MSC_VER) +# define SIMULATE_ID "MSVC" +# endif +# define COMPILER_VERSION_MAJOR DEC(__clang_major__) +# define COMPILER_VERSION_MINOR DEC(__clang_minor__) +# define COMPILER_VERSION_PATCH DEC(__clang_patchlevel__) +# if defined(_MSC_VER) + /* _MSC_VER = VVRR */ +# define SIMULATE_VERSION_MAJOR DEC(_MSC_VER / 100) +# define SIMULATE_VERSION_MINOR DEC(_MSC_VER % 100) +# endif +# define COMPILER_VERSION_TWEAK DEC(__apple_build_version__) + +#elif defined(__clang__) && defined(__ARMCOMPILER_VERSION) +# define COMPILER_ID "ARMClang" + # define COMPILER_VERSION_MAJOR DEC(__ARMCOMPILER_VERSION/1000000) + # define COMPILER_VERSION_MINOR DEC(__ARMCOMPILER_VERSION/10000 % 100) + # define COMPILER_VERSION_PATCH DEC(__ARMCOMPILER_VERSION/100 % 100) +# define COMPILER_VERSION_INTERNAL DEC(__ARMCOMPILER_VERSION) + +#elif defined(__clang__) && defined(__ti__) +# define COMPILER_ID "TIClang" + # define COMPILER_VERSION_MAJOR DEC(__ti_major__) + # define COMPILER_VERSION_MINOR DEC(__ti_minor__) + # define COMPILER_VERSION_PATCH DEC(__ti_patchlevel__) +# define COMPILER_VERSION_INTERNAL DEC(__ti_version__) + +#elif defined(__clang__) +# define COMPILER_ID "Clang" +# if defined(_MSC_VER) +# define SIMULATE_ID "MSVC" +# endif +# define COMPILER_VERSION_MAJOR DEC(__clang_major__) +# define COMPILER_VERSION_MINOR DEC(__clang_minor__) +# define COMPILER_VERSION_PATCH DEC(__clang_patchlevel__) +# if defined(_MSC_VER) + /* _MSC_VER = VVRR */ +# define SIMULATE_VERSION_MAJOR DEC(_MSC_VER / 100) +# define SIMULATE_VERSION_MINOR DEC(_MSC_VER % 100) +# endif + +#elif defined(__LCC__) && (defined(__GNUC__) || defined(__GNUG__) || defined(__MCST__)) +# define COMPILER_ID "LCC" +# define COMPILER_VERSION_MAJOR DEC(__LCC__ / 100) +# define COMPILER_VERSION_MINOR DEC(__LCC__ % 100) +# if defined(__LCC_MINOR__) +# define COMPILER_VERSION_PATCH DEC(__LCC_MINOR__) +# endif +# if defined(__GNUC__) && defined(__GNUC_MINOR__) +# define SIMULATE_ID "GNU" +# define SIMULATE_VERSION_MAJOR DEC(__GNUC__) +# define SIMULATE_VERSION_MINOR DEC(__GNUC_MINOR__) +# if defined(__GNUC_PATCHLEVEL__) +# define SIMULATE_VERSION_PATCH DEC(__GNUC_PATCHLEVEL__) +# endif +# endif + +#elif defined(__GNUC__) || defined(__GNUG__) +# define COMPILER_ID "GNU" +# if defined(__GNUC__) +# define COMPILER_VERSION_MAJOR DEC(__GNUC__) +# else +# define COMPILER_VERSION_MAJOR DEC(__GNUG__) +# endif +# if defined(__GNUC_MINOR__) +# define COMPILER_VERSION_MINOR DEC(__GNUC_MINOR__) +# endif +# if defined(__GNUC_PATCHLEVEL__) +# define COMPILER_VERSION_PATCH DEC(__GNUC_PATCHLEVEL__) +# endif + +#elif defined(_MSC_VER) +# define COMPILER_ID "MSVC" + /* _MSC_VER = VVRR */ +# define COMPILER_VERSION_MAJOR DEC(_MSC_VER / 100) +# define COMPILER_VERSION_MINOR DEC(_MSC_VER % 100) +# if defined(_MSC_FULL_VER) +# if _MSC_VER >= 1400 + /* _MSC_FULL_VER = VVRRPPPPP */ +# define COMPILER_VERSION_PATCH DEC(_MSC_FULL_VER % 100000) +# else + /* _MSC_FULL_VER = VVRRPPPP */ +# define COMPILER_VERSION_PATCH DEC(_MSC_FULL_VER % 10000) +# endif +# endif +# if defined(_MSC_BUILD) +# define COMPILER_VERSION_TWEAK DEC(_MSC_BUILD) +# endif + +#elif defined(_ADI_COMPILER) +# define COMPILER_ID "ADSP" +#if defined(__VERSIONNUM__) + /* __VERSIONNUM__ = 0xVVRRPPTT */ +# define COMPILER_VERSION_MAJOR DEC(__VERSIONNUM__ >> 24 & 0xFF) +# define COMPILER_VERSION_MINOR DEC(__VERSIONNUM__ >> 16 & 0xFF) +# define COMPILER_VERSION_PATCH DEC(__VERSIONNUM__ >> 8 & 0xFF) +# define COMPILER_VERSION_TWEAK DEC(__VERSIONNUM__ & 0xFF) +#endif + +#elif defined(__IAR_SYSTEMS_ICC__) || defined(__IAR_SYSTEMS_ICC) +# define COMPILER_ID "IAR" +# if defined(__VER__) && defined(__ICCARM__) +# define COMPILER_VERSION_MAJOR DEC((__VER__) / 1000000) +# define COMPILER_VERSION_MINOR DEC(((__VER__) / 1000) % 1000) +# define COMPILER_VERSION_PATCH DEC((__VER__) % 1000) +# define COMPILER_VERSION_INTERNAL DEC(__IAR_SYSTEMS_ICC__) +# elif defined(__VER__) && (defined(__ICCAVR__) || defined(__ICCRX__) || defined(__ICCRH850__) || defined(__ICCRL78__) || defined(__ICC430__) || defined(__ICCRISCV__) || defined(__ICCV850__) || defined(__ICC8051__) || defined(__ICCSTM8__)) +# define COMPILER_VERSION_MAJOR DEC((__VER__) / 100) +# define COMPILER_VERSION_MINOR DEC((__VER__) - (((__VER__) / 100)*100)) +# define COMPILER_VERSION_PATCH DEC(__SUBVERSION__) +# define COMPILER_VERSION_INTERNAL DEC(__IAR_SYSTEMS_ICC__) +# endif + + +/* These compilers are either not known or too old to define an + identification macro. Try to identify the platform and guess that + it is the native compiler. */ +#elif defined(__hpux) || defined(__hpua) +# define COMPILER_ID "HP" + +#else /* unknown compiler */ +# define COMPILER_ID "" +#endif + +/* Construct the string literal in pieces to prevent the source from + getting matched. Store it in a pointer rather than an array + because some compilers will just produce instructions to fill the + array rather than assigning a pointer to a static array. */ +char const* info_compiler = "INFO" ":" "compiler[" COMPILER_ID "]"; +#ifdef SIMULATE_ID +char const* info_simulate = "INFO" ":" "simulate[" SIMULATE_ID "]"; +#endif + +#ifdef __QNXNTO__ +char const* qnxnto = "INFO" ":" "qnxnto[]"; +#endif + +#if defined(__CRAYXT_COMPUTE_LINUX_TARGET) +char const *info_cray = "INFO" ":" "compiler_wrapper[CrayPrgEnv]"; +#endif + +#define STRINGIFY_HELPER(X) #X +#define STRINGIFY(X) STRINGIFY_HELPER(X) + +/* Identify known platforms by name. */ +#if defined(__linux) || defined(__linux__) || defined(linux) +# define PLATFORM_ID "Linux" + +#elif defined(__MSYS__) +# define PLATFORM_ID "MSYS" + +#elif defined(__CYGWIN__) +# define PLATFORM_ID "Cygwin" + +#elif defined(__MINGW32__) +# define PLATFORM_ID "MinGW" + +#elif defined(__APPLE__) +# define PLATFORM_ID "Darwin" + +#elif defined(_WIN32) || defined(__WIN32__) || defined(WIN32) +# define PLATFORM_ID "Windows" + +#elif defined(__FreeBSD__) || defined(__FreeBSD) +# define PLATFORM_ID "FreeBSD" + +#elif defined(__NetBSD__) || defined(__NetBSD) +# define PLATFORM_ID "NetBSD" + +#elif defined(__OpenBSD__) || defined(__OPENBSD) +# define PLATFORM_ID "OpenBSD" + +#elif defined(__sun) || defined(sun) +# define PLATFORM_ID "SunOS" + +#elif defined(_AIX) || defined(__AIX) || defined(__AIX__) || defined(__aix) || defined(__aix__) +# define PLATFORM_ID "AIX" + +#elif defined(__hpux) || defined(__hpux__) +# define PLATFORM_ID "HP-UX" + +#elif defined(__HAIKU__) +# define PLATFORM_ID "Haiku" + +#elif defined(__BeOS) || defined(__BEOS__) || defined(_BEOS) +# define PLATFORM_ID "BeOS" + +#elif defined(__QNX__) || defined(__QNXNTO__) +# define PLATFORM_ID "QNX" + +#elif defined(__tru64) || defined(_tru64) || defined(__TRU64__) +# define PLATFORM_ID "Tru64" + +#elif defined(__riscos) || defined(__riscos__) +# define PLATFORM_ID "RISCos" + +#elif defined(__sinix) || defined(__sinix__) || defined(__SINIX__) +# define PLATFORM_ID "SINIX" + +#elif defined(__UNIX_SV__) +# define PLATFORM_ID "UNIX_SV" + +#elif defined(__bsdos__) +# define PLATFORM_ID "BSDOS" + +#elif defined(_MPRAS) || defined(MPRAS) +# define PLATFORM_ID "MP-RAS" + +#elif defined(__osf) || defined(__osf__) +# define PLATFORM_ID "OSF1" + +#elif defined(_SCO_SV) || defined(SCO_SV) || defined(sco_sv) +# define PLATFORM_ID "SCO_SV" + +#elif defined(__ultrix) || defined(__ultrix__) || defined(_ULTRIX) +# define PLATFORM_ID "ULTRIX" + +#elif defined(__XENIX__) || defined(_XENIX) || defined(XENIX) +# define PLATFORM_ID "Xenix" + +#elif defined(__WATCOMC__) +# if defined(__LINUX__) +# define PLATFORM_ID "Linux" + +# elif defined(__DOS__) +# define PLATFORM_ID "DOS" + +# elif defined(__OS2__) +# define PLATFORM_ID "OS2" + +# elif defined(__WINDOWS__) +# define PLATFORM_ID "Windows3x" + +# elif defined(__VXWORKS__) +# define PLATFORM_ID "VxWorks" + +# else /* unknown platform */ +# define PLATFORM_ID +# endif + +#elif defined(__INTEGRITY) +# if defined(INT_178B) +# define PLATFORM_ID "Integrity178" + +# else /* regular Integrity */ +# define PLATFORM_ID "Integrity" +# endif + +# elif defined(_ADI_COMPILER) +# define PLATFORM_ID "ADSP" + +#else /* unknown platform */ +# define PLATFORM_ID + +#endif + +/* For windows compilers MSVC and Intel we can determine + the architecture of the compiler being used. This is because + the compilers do not have flags that can change the architecture, + but rather depend on which compiler is being used +*/ +#if defined(_WIN32) && defined(_MSC_VER) +# if defined(_M_IA64) +# define ARCHITECTURE_ID "IA64" + +# elif defined(_M_ARM64EC) +# define ARCHITECTURE_ID "ARM64EC" + +# elif defined(_M_X64) || defined(_M_AMD64) +# define ARCHITECTURE_ID "x64" + +# elif defined(_M_IX86) +# define ARCHITECTURE_ID "X86" + +# elif defined(_M_ARM64) +# define ARCHITECTURE_ID "ARM64" + +# elif defined(_M_ARM) +# if _M_ARM == 4 +# define ARCHITECTURE_ID "ARMV4I" +# elif _M_ARM == 5 +# define ARCHITECTURE_ID "ARMV5I" +# else +# define ARCHITECTURE_ID "ARMV" STRINGIFY(_M_ARM) +# endif + +# elif defined(_M_MIPS) +# define ARCHITECTURE_ID "MIPS" + +# elif defined(_M_SH) +# define ARCHITECTURE_ID "SHx" + +# else /* unknown architecture */ +# define ARCHITECTURE_ID "" +# endif + +#elif defined(__WATCOMC__) +# if defined(_M_I86) +# define ARCHITECTURE_ID "I86" + +# elif defined(_M_IX86) +# define ARCHITECTURE_ID "X86" + +# else /* unknown architecture */ +# define ARCHITECTURE_ID "" +# endif + +#elif defined(__IAR_SYSTEMS_ICC__) || defined(__IAR_SYSTEMS_ICC) +# if defined(__ICCARM__) +# define ARCHITECTURE_ID "ARM" + +# elif defined(__ICCRX__) +# define ARCHITECTURE_ID "RX" + +# elif defined(__ICCRH850__) +# define ARCHITECTURE_ID "RH850" + +# elif defined(__ICCRL78__) +# define ARCHITECTURE_ID "RL78" + +# elif defined(__ICCRISCV__) +# define ARCHITECTURE_ID "RISCV" + +# elif defined(__ICCAVR__) +# define ARCHITECTURE_ID "AVR" + +# elif defined(__ICC430__) +# define ARCHITECTURE_ID "MSP430" + +# elif defined(__ICCV850__) +# define ARCHITECTURE_ID "V850" + +# elif defined(__ICC8051__) +# define ARCHITECTURE_ID "8051" + +# elif defined(__ICCSTM8__) +# define ARCHITECTURE_ID "STM8" + +# else /* unknown architecture */ +# define ARCHITECTURE_ID "" +# endif + +#elif defined(__ghs__) +# if defined(__PPC64__) +# define ARCHITECTURE_ID "PPC64" + +# elif defined(__ppc__) +# define ARCHITECTURE_ID "PPC" + +# elif defined(__ARM__) +# define ARCHITECTURE_ID "ARM" + +# elif defined(__x86_64__) +# define ARCHITECTURE_ID "x64" + +# elif defined(__i386__) +# define ARCHITECTURE_ID "X86" + +# else /* unknown architecture */ +# define ARCHITECTURE_ID "" +# endif + +#elif defined(__clang__) && defined(__ti__) +# if defined(__ARM_ARCH) +# define ARCHITECTURE_ID "Arm" + +# else /* unknown architecture */ +# define ARCHITECTURE_ID "" +# endif + +#elif defined(__TI_COMPILER_VERSION__) +# if defined(__TI_ARM__) +# define ARCHITECTURE_ID "ARM" + +# elif defined(__MSP430__) +# define ARCHITECTURE_ID "MSP430" + +# elif defined(__TMS320C28XX__) +# define ARCHITECTURE_ID "TMS320C28x" + +# elif defined(__TMS320C6X__) || defined(_TMS320C6X) +# define ARCHITECTURE_ID "TMS320C6x" + +# else /* unknown architecture */ +# define ARCHITECTURE_ID "" +# endif + +# elif defined(__ADSPSHARC__) +# define ARCHITECTURE_ID "SHARC" + +# elif defined(__ADSPBLACKFIN__) +# define ARCHITECTURE_ID "Blackfin" + +#elif defined(__TASKING__) + +# if defined(__CTC__) || defined(__CPTC__) +# define ARCHITECTURE_ID "TriCore" + +# elif defined(__CMCS__) +# define ARCHITECTURE_ID "MCS" + +# elif defined(__CARM__) +# define ARCHITECTURE_ID "ARM" + +# elif defined(__CARC__) +# define ARCHITECTURE_ID "ARC" + +# elif defined(__C51__) +# define ARCHITECTURE_ID "8051" + +# elif defined(__CPCP__) +# define ARCHITECTURE_ID "PCP" + +# else +# define ARCHITECTURE_ID "" +# endif + +#else +# define ARCHITECTURE_ID +#endif + +/* Convert integer to decimal digit literals. */ +#define DEC(n) \ + ('0' + (((n) / 10000000)%10)), \ + ('0' + (((n) / 1000000)%10)), \ + ('0' + (((n) / 100000)%10)), \ + ('0' + (((n) / 10000)%10)), \ + ('0' + (((n) / 1000)%10)), \ + ('0' + (((n) / 100)%10)), \ + ('0' + (((n) / 10)%10)), \ + ('0' + ((n) % 10)) + +/* Convert integer to hex digit literals. */ +#define HEX(n) \ + ('0' + ((n)>>28 & 0xF)), \ + ('0' + ((n)>>24 & 0xF)), \ + ('0' + ((n)>>20 & 0xF)), \ + ('0' + ((n)>>16 & 0xF)), \ + ('0' + ((n)>>12 & 0xF)), \ + ('0' + ((n)>>8 & 0xF)), \ + ('0' + ((n)>>4 & 0xF)), \ + ('0' + ((n) & 0xF)) + +/* Construct a string literal encoding the version number. */ +#ifdef COMPILER_VERSION +char const* info_version = "INFO" ":" "compiler_version[" COMPILER_VERSION "]"; + +/* Construct a string literal encoding the version number components. */ +#elif defined(COMPILER_VERSION_MAJOR) +char const info_version[] = { + 'I', 'N', 'F', 'O', ':', + 'c','o','m','p','i','l','e','r','_','v','e','r','s','i','o','n','[', + COMPILER_VERSION_MAJOR, +# ifdef COMPILER_VERSION_MINOR + '.', COMPILER_VERSION_MINOR, +# ifdef COMPILER_VERSION_PATCH + '.', COMPILER_VERSION_PATCH, +# ifdef COMPILER_VERSION_TWEAK + '.', COMPILER_VERSION_TWEAK, +# endif +# endif +# endif + ']','\0'}; +#endif + +/* Construct a string literal encoding the internal version number. */ +#ifdef COMPILER_VERSION_INTERNAL +char const info_version_internal[] = { + 'I', 'N', 'F', 'O', ':', + 'c','o','m','p','i','l','e','r','_','v','e','r','s','i','o','n','_', + 'i','n','t','e','r','n','a','l','[', + COMPILER_VERSION_INTERNAL,']','\0'}; +#elif defined(COMPILER_VERSION_INTERNAL_STR) +char const* info_version_internal = "INFO" ":" "compiler_version_internal[" COMPILER_VERSION_INTERNAL_STR "]"; +#endif + +/* Construct a string literal encoding the version number components. */ +#ifdef SIMULATE_VERSION_MAJOR +char const info_simulate_version[] = { + 'I', 'N', 'F', 'O', ':', + 's','i','m','u','l','a','t','e','_','v','e','r','s','i','o','n','[', + SIMULATE_VERSION_MAJOR, +# ifdef SIMULATE_VERSION_MINOR + '.', SIMULATE_VERSION_MINOR, +# ifdef SIMULATE_VERSION_PATCH + '.', SIMULATE_VERSION_PATCH, +# ifdef SIMULATE_VERSION_TWEAK + '.', SIMULATE_VERSION_TWEAK, +# endif +# endif +# endif + ']','\0'}; +#endif + +/* Construct the string literal in pieces to prevent the source from + getting matched. Store it in a pointer rather than an array + because some compilers will just produce instructions to fill the + array rather than assigning a pointer to a static array. */ +char const* info_platform = "INFO" ":" "platform[" PLATFORM_ID "]"; +char const* info_arch = "INFO" ":" "arch[" ARCHITECTURE_ID "]"; + + + +#define CXX_STD_98 199711L +#define CXX_STD_11 201103L +#define CXX_STD_14 201402L +#define CXX_STD_17 201703L +#define CXX_STD_20 202002L +#define CXX_STD_23 202302L + +#if defined(__INTEL_COMPILER) && defined(_MSVC_LANG) +# if _MSVC_LANG > CXX_STD_17 +# define CXX_STD _MSVC_LANG +# elif _MSVC_LANG == CXX_STD_17 && defined(__cpp_aggregate_paren_init) +# define CXX_STD CXX_STD_20 +# elif _MSVC_LANG > CXX_STD_14 && __cplusplus > CXX_STD_17 +# define CXX_STD CXX_STD_20 +# elif _MSVC_LANG > CXX_STD_14 +# define CXX_STD CXX_STD_17 +# elif defined(__INTEL_CXX11_MODE__) && defined(__cpp_aggregate_nsdmi) +# define CXX_STD CXX_STD_14 +# elif defined(__INTEL_CXX11_MODE__) +# define CXX_STD CXX_STD_11 +# else +# define CXX_STD CXX_STD_98 +# endif +#elif defined(_MSC_VER) && defined(_MSVC_LANG) +# if _MSVC_LANG > __cplusplus +# define CXX_STD _MSVC_LANG +# else +# define CXX_STD __cplusplus +# endif +#elif defined(__NVCOMPILER) +# if __cplusplus == CXX_STD_17 && defined(__cpp_aggregate_paren_init) +# define CXX_STD CXX_STD_20 +# else +# define CXX_STD __cplusplus +# endif +#elif defined(__INTEL_COMPILER) || defined(__PGI) +# if __cplusplus == CXX_STD_11 && defined(__cpp_namespace_attributes) +# define CXX_STD CXX_STD_17 +# elif __cplusplus == CXX_STD_11 && defined(__cpp_aggregate_nsdmi) +# define CXX_STD CXX_STD_14 +# else +# define CXX_STD __cplusplus +# endif +#elif (defined(__IBMCPP__) || defined(__ibmxl__)) && defined(__linux__) +# if __cplusplus == CXX_STD_11 && defined(__cpp_aggregate_nsdmi) +# define CXX_STD CXX_STD_14 +# else +# define CXX_STD __cplusplus +# endif +#elif __cplusplus == 1 && defined(__GXX_EXPERIMENTAL_CXX0X__) +# define CXX_STD CXX_STD_11 +#else +# define CXX_STD __cplusplus +#endif + +const char* info_language_standard_default = "INFO" ":" "standard_default[" +#if CXX_STD > CXX_STD_23 + "26" +#elif CXX_STD > CXX_STD_20 + "23" +#elif CXX_STD > CXX_STD_17 + "20" +#elif CXX_STD > CXX_STD_14 + "17" +#elif CXX_STD > CXX_STD_11 + "14" +#elif CXX_STD >= CXX_STD_11 + "11" +#else + "98" +#endif +"]"; + +const char* info_language_extensions_default = "INFO" ":" "extensions_default[" +#if (defined(__clang__) || defined(__GNUC__) || defined(__xlC__) || \ + defined(__TI_COMPILER_VERSION__)) && \ + !defined(__STRICT_ANSI__) + "ON" +#else + "OFF" +#endif +"]"; + +/*--------------------------------------------------------------------------*/ + +int main(int argc, char* argv[]) +{ + int require = 0; + require += info_compiler[argc]; + require += info_platform[argc]; + require += info_arch[argc]; +#ifdef COMPILER_VERSION_MAJOR + require += info_version[argc]; +#endif +#ifdef COMPILER_VERSION_INTERNAL + require += info_version_internal[argc]; +#endif +#ifdef SIMULATE_ID + require += info_simulate[argc]; +#endif +#ifdef SIMULATE_VERSION_MAJOR + require += info_simulate_version[argc]; +#endif +#if defined(__CRAYXT_COMPUTE_LINUX_TARGET) + require += info_cray[argc]; +#endif + require += info_language_standard_default[argc]; + require += info_language_extensions_default[argc]; + (void)argv; + return require; +} diff --git a/siro_rider/android/app/.cxx/Debug/3p4b322x/arm64-v8a/CMakeFiles/3.31.5-g6cf5163/CompilerIdCXX/CMakeCXXCompilerId.o b/siro_rider/android/app/.cxx/Debug/3p4b322x/arm64-v8a/CMakeFiles/3.31.5-g6cf5163/CompilerIdCXX/CMakeCXXCompilerId.o new file mode 100644 index 0000000..c4d6879 Binary files /dev/null and b/siro_rider/android/app/.cxx/Debug/3p4b322x/arm64-v8a/CMakeFiles/3.31.5-g6cf5163/CompilerIdCXX/CMakeCXXCompilerId.o differ diff --git a/siro_rider/android/app/.cxx/Debug/3p4b322x/arm64-v8a/CMakeFiles/CMakeConfigureLog.yaml b/siro_rider/android/app/.cxx/Debug/3p4b322x/arm64-v8a/CMakeFiles/CMakeConfigureLog.yaml new file mode 100644 index 0000000..e43d167 --- /dev/null +++ b/siro_rider/android/app/.cxx/Debug/3p4b322x/arm64-v8a/CMakeFiles/CMakeConfigureLog.yaml @@ -0,0 +1,405 @@ + +--- +events: + - + kind: "message-v1" + backtrace: + - "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeDetermineSystem.cmake:200 (message)" + - "CMakeLists.txt:2 (project)" + message: | + The target system is: Android - 1 - aarch64 + The host system is: Darwin - 24.5.0 - arm64 + - + kind: "message-v1" + backtrace: + - "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeDetermineCompilerId.cmake:17 (message)" + - "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeDetermineCompilerId.cmake:64 (__determine_compiler_id_test)" + - "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeDetermineCCompiler.cmake:123 (CMAKE_DETERMINE_COMPILER_ID)" + - "CMakeLists.txt:2 (project)" + message: | + Compiling the C compiler identification source file "CMakeCCompilerId.c" succeeded. + Compiler: /Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/bin/clang + Build flags: -g;-DANDROID;-fdata-sections;-ffunction-sections;-funwind-tables;-fstack-protector-strong;-no-canonical-prefixes;-D_FORTIFY_SOURCE=2;-Wformat;-Werror=format-security + Id flags: -c;--target=aarch64-none-linux-android23 + + The output was: + 0 + + + Compilation of the C compiler identification source "CMakeCCompilerId.c" produced "CMakeCCompilerId.o" + + The C compiler identification is Clang, found in: + /Users/hamzaaleghwairyeen/development/App/Intaleq/android/app/.cxx/Debug/3p4b322x/arm64-v8a/CMakeFiles/3.31.5-g6cf5163/CompilerIdC/CMakeCCompilerId.o + + - + kind: "message-v1" + backtrace: + - "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeDetermineCompilerId.cmake:17 (message)" + - "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeDetermineCompilerId.cmake:64 (__determine_compiler_id_test)" + - "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeDetermineCXXCompiler.cmake:126 (CMAKE_DETERMINE_COMPILER_ID)" + - "CMakeLists.txt:2 (project)" + message: | + Compiling the CXX compiler identification source file "CMakeCXXCompilerId.cpp" succeeded. + Compiler: /Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/bin/clang++ + Build flags: -g;-DANDROID;-fdata-sections;-ffunction-sections;-funwind-tables;-fstack-protector-strong;-no-canonical-prefixes;-D_FORTIFY_SOURCE=2;-Wformat;-Werror=format-security + Id flags: -c;--target=aarch64-none-linux-android23 + + The output was: + 0 + + + Compilation of the CXX compiler identification source "CMakeCXXCompilerId.cpp" produced "CMakeCXXCompilerId.o" + + The CXX compiler identification is Clang, found in: + /Users/hamzaaleghwairyeen/development/App/Intaleq/android/app/.cxx/Debug/3p4b322x/arm64-v8a/CMakeFiles/3.31.5-g6cf5163/CompilerIdCXX/CMakeCXXCompilerId.o + + - + kind: "try_compile-v1" + backtrace: + - "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeDetermineCompilerABI.cmake:74 (try_compile)" + - "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeTestCCompiler.cmake:26 (CMAKE_DETERMINE_COMPILER_ABI)" + - "CMakeLists.txt:2 (project)" + checks: + - "Detecting C compiler ABI info" + directories: + source: "/Users/hamzaaleghwairyeen/development/App/Intaleq/android/app/.cxx/Debug/3p4b322x/arm64-v8a/CMakeFiles/CMakeScratch/TryCompile-ywt633" + binary: "/Users/hamzaaleghwairyeen/development/App/Intaleq/android/app/.cxx/Debug/3p4b322x/arm64-v8a/CMakeFiles/CMakeScratch/TryCompile-ywt633" + cmakeVariables: + ANDROID_ABI: "arm64-v8a" + ANDROID_ARM_MODE: "thumb" + ANDROID_PIE: "TRUE" + ANDROID_PLATFORM: "android-23" + ANDROID_STL: "c++_static" + ANDROID_TOOLCHAIN: "clang" + CMAKE_CXX_COMPILER_CLANG_SCAN_DEPS: "/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/bin/clang-scan-deps" + CMAKE_CXX_COMPILER_TARGET: "aarch64-none-linux-android23" + CMAKE_C_COMPILER_TARGET: "aarch64-none-linux-android23" + CMAKE_C_FLAGS: "-g -DANDROID -fdata-sections -ffunction-sections -funwind-tables -fstack-protector-strong -no-canonical-prefixes -D_FORTIFY_SOURCE=2 -Wformat " + CMAKE_C_FLAGS_DEBUG: "-fno-limit-debug-info " + CMAKE_EXE_LINKER_FLAGS: "-static-libstdc++ -Wl,--build-id=sha1 -Wl,--no-rosegment -Wl,--no-undefined-version -Wl,--fatal-warnings -Wl,--no-undefined -Qunused-arguments " + CMAKE_POSITION_INDEPENDENT_CODE: "TRUE" + CMAKE_SYSROOT: "/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot" + buildResult: + variable: "CMAKE_C_ABI_COMPILED" + cached: true + stdout: | + Change Dir: '/Users/hamzaaleghwairyeen/development/App/Intaleq/android/app/.cxx/Debug/3p4b322x/arm64-v8a/CMakeFiles/CMakeScratch/TryCompile-ywt633' + + Run Build Command(s): /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/bin/ninja -v cmTC_6a8c5 + [1/2] /Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/bin/clang --target=aarch64-none-linux-android23 --sysroot=/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot -g -DANDROID -fdata-sections -ffunction-sections -funwind-tables -fstack-protector-strong -no-canonical-prefixes -D_FORTIFY_SOURCE=2 -Wformat -fPIE -v -MD -MT CMakeFiles/cmTC_6a8c5.dir/CMakeCCompilerABI.c.o -MF CMakeFiles/cmTC_6a8c5.dir/CMakeCCompilerABI.c.o.d -o CMakeFiles/cmTC_6a8c5.dir/CMakeCCompilerABI.c.o -c /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeCCompilerABI.c + Android (12027248, +pgo, -bolt, +lto, -mlgo, based on r522817) clang version 18.0.1 (https://android.googlesource.com/toolchain/llvm-project d8003a456d14a3deb8054cdaa529ffbf02d9b262) + Target: aarch64-none-linux-android23 + Thread model: posix + InstalledDir: /Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/bin + (in-process) + "/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/bin/clang" -cc1 -triple aarch64-none-linux-android23 -emit-obj -mrelax-all -disable-free -clear-ast-before-backend -disable-llvm-verifier -discard-value-names -main-file-name CMakeCCompilerABI.c -mrelocation-model pic -pic-level 2 -pic-is-pie -mframe-pointer=non-leaf -ffp-contract=on -fno-rounding-math -mconstructor-aliases -funwind-tables=2 -target-cpu generic -target-feature +neon -target-feature +v8a -target-feature +fix-cortex-a53-835769 -target-abi aapcs -debug-info-kind=constructor -dwarf-version=4 -debugger-tuning=gdb -fdebug-compilation-dir=/Users/hamzaaleghwairyeen/development/App/Intaleq/android/app/.cxx/Debug/3p4b322x/arm64-v8a/CMakeFiles/CMakeScratch/TryCompile-ywt633 -v -ffunction-sections -fdata-sections -fcoverage-compilation-dir=/Users/hamzaaleghwairyeen/development/App/Intaleq/android/app/.cxx/Debug/3p4b322x/arm64-v8a/CMakeFiles/CMakeScratch/TryCompile-ywt633 -resource-dir /Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/lib/clang/18 -dependency-file CMakeFiles/cmTC_6a8c5.dir/CMakeCCompilerABI.c.o.d -MT CMakeFiles/cmTC_6a8c5.dir/CMakeCCompilerABI.c.o -sys-header-deps -D ANDROID -D _FORTIFY_SOURCE=2 -isysroot /Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot -internal-isystem /Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/lib/clang/18/include -internal-isystem /Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/local/include -internal-externc-isystem /Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/include/aarch64-linux-android -internal-externc-isystem /Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/include -internal-externc-isystem /Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/include -Wformat -ferror-limit 19 -femulated-tls -stack-protector 2 -fno-signed-char -fgnuc-version=4.2.1 -target-feature +outline-atomics -D__GCC_HAVE_DWARF2_CFI_ASM=1 -o CMakeFiles/cmTC_6a8c5.dir/CMakeCCompilerABI.c.o -x c /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeCCompilerABI.c + clang -cc1 version 18.0.1 based upon LLVM 18.0.1 default target x86_64-apple-darwin24.5.0 + ignoring nonexistent directory "/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/local/include" + ignoring nonexistent directory "/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/include" + #include "..." search starts here: + #include <...> search starts here: + /Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/lib/clang/18/include + /Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/include/aarch64-linux-android + /Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/include + End of search list. + [2/2] : && /Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/bin/clang --target=aarch64-none-linux-android23 --sysroot=/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot -g -DANDROID -fdata-sections -ffunction-sections -funwind-tables -fstack-protector-strong -no-canonical-prefixes -D_FORTIFY_SOURCE=2 -Wformat -static-libstdc++ -Wl,--build-id=sha1 -Wl,--no-rosegment -Wl,--no-undefined-version -Wl,--fatal-warnings -Wl,--no-undefined -Qunused-arguments -v CMakeFiles/cmTC_6a8c5.dir/CMakeCCompilerABI.c.o -o cmTC_6a8c5 && : + Android (12027248, +pgo, -bolt, +lto, -mlgo, based on r522817) clang version 18.0.1 (https://android.googlesource.com/toolchain/llvm-project d8003a456d14a3deb8054cdaa529ffbf02d9b262) + Target: aarch64-none-linux-android23 + Thread model: posix + InstalledDir: /Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/bin + "/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/bin/ld.lld" --sysroot=/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot -EL --fix-cortex-a53-843419 -z now -z relro -z max-page-size=4096 --hash-style=gnu --eh-frame-hdr -m aarch64linux -pie -dynamic-linker /system/bin/linker64 -o cmTC_6a8c5 /Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/lib/aarch64-linux-android/23/crtbegin_dynamic.o -L/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/lib/clang/18/lib/linux/aarch64 -L/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/lib/aarch64-linux-android/23 -L/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/lib/aarch64-linux-android -L/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/lib --build-id=sha1 --no-rosegment --no-undefined-version --fatal-warnings --no-undefined CMakeFiles/cmTC_6a8c5.dir/CMakeCCompilerABI.c.o /Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/lib/clang/18/lib/linux/libclang_rt.builtins-aarch64-android.a -l:libunwind.a -ldl -lc /Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/lib/clang/18/lib/linux/libclang_rt.builtins-aarch64-android.a -l:libunwind.a -ldl /Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/lib/aarch64-linux-android/23/crtend_android.o + + exitCode: 0 + - + kind: "message-v1" + backtrace: + - "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeDetermineCompilerABI.cmake:182 (message)" + - "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeTestCCompiler.cmake:26 (CMAKE_DETERMINE_COMPILER_ABI)" + - "CMakeLists.txt:2 (project)" + message: | + Parsed C implicit include dir info: rv=done + found start of include info + found start of implicit include info + add: [/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/lib/clang/18/include] + add: [/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/include/aarch64-linux-android] + add: [/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/include] + end of search list found + collapse include dir [/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/lib/clang/18/include] ==> [/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/lib/clang/18/include] + collapse include dir [/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/include/aarch64-linux-android] ==> [/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/include/aarch64-linux-android] + collapse include dir [/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/include] ==> [/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/include] + implicit include dirs: [/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/lib/clang/18/include;/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/include/aarch64-linux-android;/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/include] + + + - + kind: "message-v1" + backtrace: + - "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeDetermineCompilerABI.cmake:218 (message)" + - "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeTestCCompiler.cmake:26 (CMAKE_DETERMINE_COMPILER_ABI)" + - "CMakeLists.txt:2 (project)" + message: | + Parsed C implicit link information: + link line regex: [^( *|.*[/\\])(ld[0-9]*(\\.[a-z]+)?|CMAKE_LINK_STARTFILE-NOTFOUND|([^/\\]+-)?ld|collect2)[^/\\]*( |$)] + linker tool regex: [^[ ]*(->|")?[ ]*(([^"]*[/\\])?(ld[0-9]*(\\.[a-z]+)?))("|,| |$)] + ignore line: [Change Dir: '/Users/hamzaaleghwairyeen/development/App/Intaleq/android/app/.cxx/Debug/3p4b322x/arm64-v8a/CMakeFiles/CMakeScratch/TryCompile-ywt633'] + ignore line: [] + ignore line: [Run Build Command(s): /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/bin/ninja -v cmTC_6a8c5] + ignore line: [[1/2] /Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/bin/clang --target=aarch64-none-linux-android23 --sysroot=/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot -g -DANDROID -fdata-sections -ffunction-sections -funwind-tables -fstack-protector-strong -no-canonical-prefixes -D_FORTIFY_SOURCE=2 -Wformat -fPIE -v -MD -MT CMakeFiles/cmTC_6a8c5.dir/CMakeCCompilerABI.c.o -MF CMakeFiles/cmTC_6a8c5.dir/CMakeCCompilerABI.c.o.d -o CMakeFiles/cmTC_6a8c5.dir/CMakeCCompilerABI.c.o -c /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeCCompilerABI.c] + ignore line: [Android (12027248 +pgo -bolt +lto -mlgo based on r522817) clang version 18.0.1 (https://android.googlesource.com/toolchain/llvm-project d8003a456d14a3deb8054cdaa529ffbf02d9b262)] + ignore line: [Target: aarch64-none-linux-android23] + ignore line: [Thread model: posix] + ignore line: [InstalledDir: /Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/bin] + ignore line: [ (in-process)] + ignore line: [ "/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/bin/clang" -cc1 -triple aarch64-none-linux-android23 -emit-obj -mrelax-all -disable-free -clear-ast-before-backend -disable-llvm-verifier -discard-value-names -main-file-name CMakeCCompilerABI.c -mrelocation-model pic -pic-level 2 -pic-is-pie -mframe-pointer=non-leaf -ffp-contract=on -fno-rounding-math -mconstructor-aliases -funwind-tables=2 -target-cpu generic -target-feature +neon -target-feature +v8a -target-feature +fix-cortex-a53-835769 -target-abi aapcs -debug-info-kind=constructor -dwarf-version=4 -debugger-tuning=gdb -fdebug-compilation-dir=/Users/hamzaaleghwairyeen/development/App/Intaleq/android/app/.cxx/Debug/3p4b322x/arm64-v8a/CMakeFiles/CMakeScratch/TryCompile-ywt633 -v -ffunction-sections -fdata-sections -fcoverage-compilation-dir=/Users/hamzaaleghwairyeen/development/App/Intaleq/android/app/.cxx/Debug/3p4b322x/arm64-v8a/CMakeFiles/CMakeScratch/TryCompile-ywt633 -resource-dir /Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/lib/clang/18 -dependency-file CMakeFiles/cmTC_6a8c5.dir/CMakeCCompilerABI.c.o.d -MT CMakeFiles/cmTC_6a8c5.dir/CMakeCCompilerABI.c.o -sys-header-deps -D ANDROID -D _FORTIFY_SOURCE=2 -isysroot /Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot -internal-isystem /Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/lib/clang/18/include -internal-isystem /Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/local/include -internal-externc-isystem /Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/include/aarch64-linux-android -internal-externc-isystem /Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/include -internal-externc-isystem /Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/include -Wformat -ferror-limit 19 -femulated-tls -stack-protector 2 -fno-signed-char -fgnuc-version=4.2.1 -target-feature +outline-atomics -D__GCC_HAVE_DWARF2_CFI_ASM=1 -o CMakeFiles/cmTC_6a8c5.dir/CMakeCCompilerABI.c.o -x c /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeCCompilerABI.c] + ignore line: [clang -cc1 version 18.0.1 based upon LLVM 18.0.1 default target x86_64-apple-darwin24.5.0] + ignore line: [ignoring nonexistent directory "/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/local/include"] + ignore line: [ignoring nonexistent directory "/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/include"] + ignore line: [#include "..." search starts here:] + ignore line: [#include <...> search starts here:] + ignore line: [ /Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/lib/clang/18/include] + ignore line: [ /Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/include/aarch64-linux-android] + ignore line: [ /Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/include] + ignore line: [End of search list.] + ignore line: [[2/2] : && /Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/bin/clang --target=aarch64-none-linux-android23 --sysroot=/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot -g -DANDROID -fdata-sections -ffunction-sections -funwind-tables -fstack-protector-strong -no-canonical-prefixes -D_FORTIFY_SOURCE=2 -Wformat -static-libstdc++ -Wl --build-id=sha1 -Wl --no-rosegment -Wl --no-undefined-version -Wl --fatal-warnings -Wl --no-undefined -Qunused-arguments -v CMakeFiles/cmTC_6a8c5.dir/CMakeCCompilerABI.c.o -o cmTC_6a8c5 && :] + ignore line: [Android (12027248 +pgo -bolt +lto -mlgo based on r522817) clang version 18.0.1 (https://android.googlesource.com/toolchain/llvm-project d8003a456d14a3deb8054cdaa529ffbf02d9b262)] + ignore line: [Target: aarch64-none-linux-android23] + ignore line: [Thread model: posix] + ignore line: [InstalledDir: /Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/bin] + link line: [ "/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/bin/ld.lld" --sysroot=/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot -EL --fix-cortex-a53-843419 -z now -z relro -z max-page-size=4096 --hash-style=gnu --eh-frame-hdr -m aarch64linux -pie -dynamic-linker /system/bin/linker64 -o cmTC_6a8c5 /Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/lib/aarch64-linux-android/23/crtbegin_dynamic.o -L/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/lib/clang/18/lib/linux/aarch64 -L/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/lib/aarch64-linux-android/23 -L/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/lib/aarch64-linux-android -L/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/lib --build-id=sha1 --no-rosegment --no-undefined-version --fatal-warnings --no-undefined CMakeFiles/cmTC_6a8c5.dir/CMakeCCompilerABI.c.o /Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/lib/clang/18/lib/linux/libclang_rt.builtins-aarch64-android.a -l:libunwind.a -ldl -lc /Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/lib/clang/18/lib/linux/libclang_rt.builtins-aarch64-android.a -l:libunwind.a -ldl /Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/lib/aarch64-linux-android/23/crtend_android.o] + arg [/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/bin/ld.lld] ==> ignore + arg [--sysroot=/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot] ==> ignore + arg [-EL] ==> ignore + arg [--fix-cortex-a53-843419] ==> ignore + arg [-znow] ==> ignore + arg [-zrelro] ==> ignore + arg [-zmax-page-size=4096] ==> ignore + arg [--hash-style=gnu] ==> ignore + arg [--eh-frame-hdr] ==> ignore + arg [-m] ==> ignore + arg [aarch64linux] ==> ignore + arg [-pie] ==> ignore + arg [-dynamic-linker] ==> ignore + arg [/system/bin/linker64] ==> ignore + arg [-o] ==> ignore + arg [cmTC_6a8c5] ==> ignore + arg [/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/lib/aarch64-linux-android/23/crtbegin_dynamic.o] ==> obj [/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/lib/aarch64-linux-android/23/crtbegin_dynamic.o] + arg [-L/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/lib/clang/18/lib/linux/aarch64] ==> dir [/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/lib/clang/18/lib/linux/aarch64] + arg [-L/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/lib/aarch64-linux-android/23] ==> dir [/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/lib/aarch64-linux-android/23] + arg [-L/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/lib/aarch64-linux-android] ==> dir [/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/lib/aarch64-linux-android] + arg [-L/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/lib] ==> dir [/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/lib] + arg [--build-id=sha1] ==> ignore + arg [--no-rosegment] ==> ignore + arg [--no-undefined-version] ==> ignore + arg [--fatal-warnings] ==> ignore + arg [--no-undefined] ==> ignore + arg [CMakeFiles/cmTC_6a8c5.dir/CMakeCCompilerABI.c.o] ==> ignore + arg [/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/lib/clang/18/lib/linux/libclang_rt.builtins-aarch64-android.a] ==> lib [/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/lib/clang/18/lib/linux/libclang_rt.builtins-aarch64-android.a] + arg [-l:libunwind.a] ==> lib [-l:libunwind.a] + arg [-ldl] ==> lib [dl] + arg [-lc] ==> lib [c] + arg [/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/lib/clang/18/lib/linux/libclang_rt.builtins-aarch64-android.a] ==> lib [/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/lib/clang/18/lib/linux/libclang_rt.builtins-aarch64-android.a] + arg [-l:libunwind.a] ==> lib [-l:libunwind.a] + arg [-ldl] ==> lib [dl] + arg [/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/lib/aarch64-linux-android/23/crtend_android.o] ==> obj [/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/lib/aarch64-linux-android/23/crtend_android.o] + linker tool for 'C': /Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/bin/ld.lld + remove lib [/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/lib/clang/18/lib/linux/libclang_rt.builtins-aarch64-android.a] + remove lib [/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/lib/clang/18/lib/linux/libclang_rt.builtins-aarch64-android.a] + collapse library dir [/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/lib/clang/18/lib/linux/aarch64] ==> [/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/lib/clang/18/lib/linux/aarch64] + collapse library dir [/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/lib/aarch64-linux-android/23] ==> [/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/lib/aarch64-linux-android/23] + collapse library dir [/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/lib/aarch64-linux-android] ==> [/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/lib/aarch64-linux-android] + collapse library dir [/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/lib] ==> [/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/lib] + implicit libs: [-l:libunwind.a;dl;c;-l:libunwind.a;dl] + implicit objs: [/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/lib/aarch64-linux-android/23/crtbegin_dynamic.o;/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/lib/aarch64-linux-android/23/crtend_android.o] + implicit dirs: [/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/lib/clang/18/lib/linux/aarch64;/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/lib/aarch64-linux-android/23;/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/lib/aarch64-linux-android;/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/lib] + implicit fwks: [] + + + - + kind: "message-v1" + backtrace: + - "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Internal/CMakeDetermineLinkerId.cmake:40 (message)" + - "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeDetermineCompilerABI.cmake:255 (cmake_determine_linker_id)" + - "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeTestCCompiler.cmake:26 (CMAKE_DETERMINE_COMPILER_ABI)" + - "CMakeLists.txt:2 (project)" + message: | + Running the C compiler's linker: "/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/bin/ld.lld" "-v" + LLD 18.0.1 (compatible with GNU linkers) + - + kind: "try_compile-v1" + backtrace: + - "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeDetermineCompilerABI.cmake:74 (try_compile)" + - "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeTestCXXCompiler.cmake:26 (CMAKE_DETERMINE_COMPILER_ABI)" + - "CMakeLists.txt:2 (project)" + checks: + - "Detecting CXX compiler ABI info" + directories: + source: "/Users/hamzaaleghwairyeen/development/App/Intaleq/android/app/.cxx/Debug/3p4b322x/arm64-v8a/CMakeFiles/CMakeScratch/TryCompile-Czu6Hy" + binary: "/Users/hamzaaleghwairyeen/development/App/Intaleq/android/app/.cxx/Debug/3p4b322x/arm64-v8a/CMakeFiles/CMakeScratch/TryCompile-Czu6Hy" + cmakeVariables: + ANDROID_ABI: "arm64-v8a" + ANDROID_ARM_MODE: "thumb" + ANDROID_PIE: "TRUE" + ANDROID_PLATFORM: "android-23" + ANDROID_STL: "c++_static" + ANDROID_TOOLCHAIN: "clang" + CMAKE_CXX_COMPILER_CLANG_SCAN_DEPS: "/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/bin/clang-scan-deps" + CMAKE_CXX_COMPILER_TARGET: "aarch64-none-linux-android23" + CMAKE_CXX_FLAGS: "-g -DANDROID -fdata-sections -ffunction-sections -funwind-tables -fstack-protector-strong -no-canonical-prefixes -D_FORTIFY_SOURCE=2 -Wformat " + CMAKE_CXX_FLAGS_DEBUG: "-fno-limit-debug-info " + CMAKE_CXX_SCAN_FOR_MODULES: "OFF" + CMAKE_C_COMPILER_TARGET: "aarch64-none-linux-android23" + CMAKE_EXE_LINKER_FLAGS: "-static-libstdc++ -Wl,--build-id=sha1 -Wl,--no-rosegment -Wl,--no-undefined-version -Wl,--fatal-warnings -Wl,--no-undefined -Qunused-arguments " + CMAKE_POSITION_INDEPENDENT_CODE: "TRUE" + CMAKE_SYSROOT: "/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot" + buildResult: + variable: "CMAKE_CXX_ABI_COMPILED" + cached: true + stdout: | + Change Dir: '/Users/hamzaaleghwairyeen/development/App/Intaleq/android/app/.cxx/Debug/3p4b322x/arm64-v8a/CMakeFiles/CMakeScratch/TryCompile-Czu6Hy' + + Run Build Command(s): /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/bin/ninja -v cmTC_ef9f4 + [1/2] /Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/bin/clang++ --target=aarch64-none-linux-android23 --sysroot=/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot -g -DANDROID -fdata-sections -ffunction-sections -funwind-tables -fstack-protector-strong -no-canonical-prefixes -D_FORTIFY_SOURCE=2 -Wformat -fPIE -v -MD -MT CMakeFiles/cmTC_ef9f4.dir/CMakeCXXCompilerABI.cpp.o -MF CMakeFiles/cmTC_ef9f4.dir/CMakeCXXCompilerABI.cpp.o.d -o CMakeFiles/cmTC_ef9f4.dir/CMakeCXXCompilerABI.cpp.o -c /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeCXXCompilerABI.cpp + Android (12027248, +pgo, -bolt, +lto, -mlgo, based on r522817) clang version 18.0.1 (https://android.googlesource.com/toolchain/llvm-project d8003a456d14a3deb8054cdaa529ffbf02d9b262) + Target: aarch64-none-linux-android23 + Thread model: posix + InstalledDir: /Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/bin + (in-process) + "/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/bin/clang++" -cc1 -triple aarch64-none-linux-android23 -emit-obj -mrelax-all -disable-free -clear-ast-before-backend -disable-llvm-verifier -discard-value-names -main-file-name CMakeCXXCompilerABI.cpp -mrelocation-model pic -pic-level 2 -pic-is-pie -mframe-pointer=non-leaf -ffp-contract=on -fno-rounding-math -mconstructor-aliases -funwind-tables=2 -target-cpu generic -target-feature +neon -target-feature +v8a -target-feature +fix-cortex-a53-835769 -target-abi aapcs -debug-info-kind=constructor -dwarf-version=4 -debugger-tuning=gdb -fdebug-compilation-dir=/Users/hamzaaleghwairyeen/development/App/Intaleq/android/app/.cxx/Debug/3p4b322x/arm64-v8a/CMakeFiles/CMakeScratch/TryCompile-Czu6Hy -v -ffunction-sections -fdata-sections -fcoverage-compilation-dir=/Users/hamzaaleghwairyeen/development/App/Intaleq/android/app/.cxx/Debug/3p4b322x/arm64-v8a/CMakeFiles/CMakeScratch/TryCompile-Czu6Hy -resource-dir /Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/lib/clang/18 -dependency-file CMakeFiles/cmTC_ef9f4.dir/CMakeCXXCompilerABI.cpp.o.d -MT CMakeFiles/cmTC_ef9f4.dir/CMakeCXXCompilerABI.cpp.o -sys-header-deps -D ANDROID -D _FORTIFY_SOURCE=2 -isysroot /Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot -internal-isystem /Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/include/c++/v1 -internal-isystem /Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/lib/clang/18/include -internal-isystem /Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/local/include -internal-externc-isystem /Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/include/aarch64-linux-android -internal-externc-isystem /Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/include -internal-externc-isystem /Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/include -Wformat -fdeprecated-macro -ferror-limit 19 -femulated-tls -stack-protector 2 -fno-signed-char -fgnuc-version=4.2.1 -fcxx-exceptions -fexceptions -target-feature +outline-atomics -D__GCC_HAVE_DWARF2_CFI_ASM=1 -o CMakeFiles/cmTC_ef9f4.dir/CMakeCXXCompilerABI.cpp.o -x c++ /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeCXXCompilerABI.cpp + clang -cc1 version 18.0.1 based upon LLVM 18.0.1 default target x86_64-apple-darwin24.5.0 + ignoring nonexistent directory "/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/local/include" + ignoring nonexistent directory "/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/include" + #include "..." search starts here: + #include <...> search starts here: + /Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/include/c++/v1 + /Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/lib/clang/18/include + /Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/include/aarch64-linux-android + /Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/include + End of search list. + [2/2] : && /Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/bin/clang++ --target=aarch64-none-linux-android23 --sysroot=/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot -g -DANDROID -fdata-sections -ffunction-sections -funwind-tables -fstack-protector-strong -no-canonical-prefixes -D_FORTIFY_SOURCE=2 -Wformat -static-libstdc++ -Wl,--build-id=sha1 -Wl,--no-rosegment -Wl,--no-undefined-version -Wl,--fatal-warnings -Wl,--no-undefined -Qunused-arguments -v CMakeFiles/cmTC_ef9f4.dir/CMakeCXXCompilerABI.cpp.o -o cmTC_ef9f4 && : + Android (12027248, +pgo, -bolt, +lto, -mlgo, based on r522817) clang version 18.0.1 (https://android.googlesource.com/toolchain/llvm-project d8003a456d14a3deb8054cdaa529ffbf02d9b262) + Target: aarch64-none-linux-android23 + Thread model: posix + InstalledDir: /Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/bin + "/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/bin/ld.lld" --sysroot=/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot -EL --fix-cortex-a53-843419 -z now -z relro -z max-page-size=4096 --hash-style=gnu --eh-frame-hdr -m aarch64linux -pie -dynamic-linker /system/bin/linker64 -o cmTC_ef9f4 /Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/lib/aarch64-linux-android/23/crtbegin_dynamic.o -L/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/lib/clang/18/lib/linux/aarch64 -L/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/lib/aarch64-linux-android/23 -L/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/lib/aarch64-linux-android -L/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/lib --build-id=sha1 --no-rosegment --no-undefined-version --fatal-warnings --no-undefined CMakeFiles/cmTC_ef9f4.dir/CMakeCXXCompilerABI.cpp.o -Bstatic -lc++ -Bdynamic -lm /Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/lib/clang/18/lib/linux/libclang_rt.builtins-aarch64-android.a -l:libunwind.a -ldl -lc /Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/lib/clang/18/lib/linux/libclang_rt.builtins-aarch64-android.a -l:libunwind.a -ldl /Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/lib/aarch64-linux-android/23/crtend_android.o + + exitCode: 0 + - + kind: "message-v1" + backtrace: + - "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeDetermineCompilerABI.cmake:182 (message)" + - "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeTestCXXCompiler.cmake:26 (CMAKE_DETERMINE_COMPILER_ABI)" + - "CMakeLists.txt:2 (project)" + message: | + Parsed CXX implicit include dir info: rv=done + found start of include info + found start of implicit include info + add: [/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/include/c++/v1] + add: [/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/lib/clang/18/include] + add: [/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/include/aarch64-linux-android] + add: [/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/include] + end of search list found + collapse include dir [/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/include/c++/v1] ==> [/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/include/c++/v1] + collapse include dir [/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/lib/clang/18/include] ==> [/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/lib/clang/18/include] + collapse include dir [/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/include/aarch64-linux-android] ==> [/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/include/aarch64-linux-android] + collapse include dir [/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/include] ==> [/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/include] + implicit include dirs: [/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/include/c++/v1;/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/lib/clang/18/include;/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/include/aarch64-linux-android;/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/include] + + + - + kind: "message-v1" + backtrace: + - "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeDetermineCompilerABI.cmake:218 (message)" + - "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeTestCXXCompiler.cmake:26 (CMAKE_DETERMINE_COMPILER_ABI)" + - "CMakeLists.txt:2 (project)" + message: | + Parsed CXX implicit link information: + link line regex: [^( *|.*[/\\])(ld[0-9]*(\\.[a-z]+)?|CMAKE_LINK_STARTFILE-NOTFOUND|([^/\\]+-)?ld|collect2)[^/\\]*( |$)] + linker tool regex: [^[ ]*(->|")?[ ]*(([^"]*[/\\])?(ld[0-9]*(\\.[a-z]+)?))("|,| |$)] + ignore line: [Change Dir: '/Users/hamzaaleghwairyeen/development/App/Intaleq/android/app/.cxx/Debug/3p4b322x/arm64-v8a/CMakeFiles/CMakeScratch/TryCompile-Czu6Hy'] + ignore line: [] + ignore line: [Run Build Command(s): /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/bin/ninja -v cmTC_ef9f4] + ignore line: [[1/2] /Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/bin/clang++ --target=aarch64-none-linux-android23 --sysroot=/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot -g -DANDROID -fdata-sections -ffunction-sections -funwind-tables -fstack-protector-strong -no-canonical-prefixes -D_FORTIFY_SOURCE=2 -Wformat -fPIE -v -MD -MT CMakeFiles/cmTC_ef9f4.dir/CMakeCXXCompilerABI.cpp.o -MF CMakeFiles/cmTC_ef9f4.dir/CMakeCXXCompilerABI.cpp.o.d -o CMakeFiles/cmTC_ef9f4.dir/CMakeCXXCompilerABI.cpp.o -c /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeCXXCompilerABI.cpp] + ignore line: [Android (12027248 +pgo -bolt +lto -mlgo based on r522817) clang version 18.0.1 (https://android.googlesource.com/toolchain/llvm-project d8003a456d14a3deb8054cdaa529ffbf02d9b262)] + ignore line: [Target: aarch64-none-linux-android23] + ignore line: [Thread model: posix] + ignore line: [InstalledDir: /Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/bin] + ignore line: [ (in-process)] + ignore line: [ "/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/bin/clang++" -cc1 -triple aarch64-none-linux-android23 -emit-obj -mrelax-all -disable-free -clear-ast-before-backend -disable-llvm-verifier -discard-value-names -main-file-name CMakeCXXCompilerABI.cpp -mrelocation-model pic -pic-level 2 -pic-is-pie -mframe-pointer=non-leaf -ffp-contract=on -fno-rounding-math -mconstructor-aliases -funwind-tables=2 -target-cpu generic -target-feature +neon -target-feature +v8a -target-feature +fix-cortex-a53-835769 -target-abi aapcs -debug-info-kind=constructor -dwarf-version=4 -debugger-tuning=gdb -fdebug-compilation-dir=/Users/hamzaaleghwairyeen/development/App/Intaleq/android/app/.cxx/Debug/3p4b322x/arm64-v8a/CMakeFiles/CMakeScratch/TryCompile-Czu6Hy -v -ffunction-sections -fdata-sections -fcoverage-compilation-dir=/Users/hamzaaleghwairyeen/development/App/Intaleq/android/app/.cxx/Debug/3p4b322x/arm64-v8a/CMakeFiles/CMakeScratch/TryCompile-Czu6Hy -resource-dir /Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/lib/clang/18 -dependency-file CMakeFiles/cmTC_ef9f4.dir/CMakeCXXCompilerABI.cpp.o.d -MT CMakeFiles/cmTC_ef9f4.dir/CMakeCXXCompilerABI.cpp.o -sys-header-deps -D ANDROID -D _FORTIFY_SOURCE=2 -isysroot /Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot -internal-isystem /Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/include/c++/v1 -internal-isystem /Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/lib/clang/18/include -internal-isystem /Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/local/include -internal-externc-isystem /Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/include/aarch64-linux-android -internal-externc-isystem /Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/include -internal-externc-isystem /Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/include -Wformat -fdeprecated-macro -ferror-limit 19 -femulated-tls -stack-protector 2 -fno-signed-char -fgnuc-version=4.2.1 -fcxx-exceptions -fexceptions -target-feature +outline-atomics -D__GCC_HAVE_DWARF2_CFI_ASM=1 -o CMakeFiles/cmTC_ef9f4.dir/CMakeCXXCompilerABI.cpp.o -x c++ /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeCXXCompilerABI.cpp] + ignore line: [clang -cc1 version 18.0.1 based upon LLVM 18.0.1 default target x86_64-apple-darwin24.5.0] + ignore line: [ignoring nonexistent directory "/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/local/include"] + ignore line: [ignoring nonexistent directory "/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/include"] + ignore line: [#include "..." search starts here:] + ignore line: [#include <...> search starts here:] + ignore line: [ /Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/include/c++/v1] + ignore line: [ /Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/lib/clang/18/include] + ignore line: [ /Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/include/aarch64-linux-android] + ignore line: [ /Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/include] + ignore line: [End of search list.] + ignore line: [[2/2] : && /Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/bin/clang++ --target=aarch64-none-linux-android23 --sysroot=/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot -g -DANDROID -fdata-sections -ffunction-sections -funwind-tables -fstack-protector-strong -no-canonical-prefixes -D_FORTIFY_SOURCE=2 -Wformat -static-libstdc++ -Wl --build-id=sha1 -Wl --no-rosegment -Wl --no-undefined-version -Wl --fatal-warnings -Wl --no-undefined -Qunused-arguments -v CMakeFiles/cmTC_ef9f4.dir/CMakeCXXCompilerABI.cpp.o -o cmTC_ef9f4 && :] + ignore line: [Android (12027248 +pgo -bolt +lto -mlgo based on r522817) clang version 18.0.1 (https://android.googlesource.com/toolchain/llvm-project d8003a456d14a3deb8054cdaa529ffbf02d9b262)] + ignore line: [Target: aarch64-none-linux-android23] + ignore line: [Thread model: posix] + ignore line: [InstalledDir: /Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/bin] + link line: [ "/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/bin/ld.lld" --sysroot=/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot -EL --fix-cortex-a53-843419 -z now -z relro -z max-page-size=4096 --hash-style=gnu --eh-frame-hdr -m aarch64linux -pie -dynamic-linker /system/bin/linker64 -o cmTC_ef9f4 /Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/lib/aarch64-linux-android/23/crtbegin_dynamic.o -L/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/lib/clang/18/lib/linux/aarch64 -L/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/lib/aarch64-linux-android/23 -L/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/lib/aarch64-linux-android -L/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/lib --build-id=sha1 --no-rosegment --no-undefined-version --fatal-warnings --no-undefined CMakeFiles/cmTC_ef9f4.dir/CMakeCXXCompilerABI.cpp.o -Bstatic -lc++ -Bdynamic -lm /Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/lib/clang/18/lib/linux/libclang_rt.builtins-aarch64-android.a -l:libunwind.a -ldl -lc /Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/lib/clang/18/lib/linux/libclang_rt.builtins-aarch64-android.a -l:libunwind.a -ldl /Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/lib/aarch64-linux-android/23/crtend_android.o] + arg [/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/bin/ld.lld] ==> ignore + arg [--sysroot=/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot] ==> ignore + arg [-EL] ==> ignore + arg [--fix-cortex-a53-843419] ==> ignore + arg [-znow] ==> ignore + arg [-zrelro] ==> ignore + arg [-zmax-page-size=4096] ==> ignore + arg [--hash-style=gnu] ==> ignore + arg [--eh-frame-hdr] ==> ignore + arg [-m] ==> ignore + arg [aarch64linux] ==> ignore + arg [-pie] ==> ignore + arg [-dynamic-linker] ==> ignore + arg [/system/bin/linker64] ==> ignore + arg [-o] ==> ignore + arg [cmTC_ef9f4] ==> ignore + arg [/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/lib/aarch64-linux-android/23/crtbegin_dynamic.o] ==> obj [/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/lib/aarch64-linux-android/23/crtbegin_dynamic.o] + arg [-L/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/lib/clang/18/lib/linux/aarch64] ==> dir [/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/lib/clang/18/lib/linux/aarch64] + arg [-L/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/lib/aarch64-linux-android/23] ==> dir [/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/lib/aarch64-linux-android/23] + arg [-L/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/lib/aarch64-linux-android] ==> dir [/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/lib/aarch64-linux-android] + arg [-L/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/lib] ==> dir [/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/lib] + arg [--build-id=sha1] ==> ignore + arg [--no-rosegment] ==> ignore + arg [--no-undefined-version] ==> ignore + arg [--fatal-warnings] ==> ignore + arg [--no-undefined] ==> ignore + arg [CMakeFiles/cmTC_ef9f4.dir/CMakeCXXCompilerABI.cpp.o] ==> ignore + arg [-Bstatic] ==> search static + arg [-lc++] ==> lib [c++] + arg [-Bdynamic] ==> search dynamic + arg [-lm] ==> lib [m] + arg [/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/lib/clang/18/lib/linux/libclang_rt.builtins-aarch64-android.a] ==> lib [/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/lib/clang/18/lib/linux/libclang_rt.builtins-aarch64-android.a] + arg [-l:libunwind.a] ==> lib [-l:libunwind.a] + arg [-ldl] ==> lib [dl] + arg [-lc] ==> lib [c] + arg [/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/lib/clang/18/lib/linux/libclang_rt.builtins-aarch64-android.a] ==> lib [/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/lib/clang/18/lib/linux/libclang_rt.builtins-aarch64-android.a] + arg [-l:libunwind.a] ==> lib [-l:libunwind.a] + arg [-ldl] ==> lib [dl] + arg [/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/lib/aarch64-linux-android/23/crtend_android.o] ==> obj [/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/lib/aarch64-linux-android/23/crtend_android.o] + linker tool for 'CXX': /Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/bin/ld.lld + remove lib [/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/lib/clang/18/lib/linux/libclang_rt.builtins-aarch64-android.a] + remove lib [/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/lib/clang/18/lib/linux/libclang_rt.builtins-aarch64-android.a] + collapse library dir [/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/lib/clang/18/lib/linux/aarch64] ==> [/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/lib/clang/18/lib/linux/aarch64] + collapse library dir [/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/lib/aarch64-linux-android/23] ==> [/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/lib/aarch64-linux-android/23] + collapse library dir [/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/lib/aarch64-linux-android] ==> [/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/lib/aarch64-linux-android] + collapse library dir [/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/lib] ==> [/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/lib] + implicit libs: [c++;m;-l:libunwind.a;dl;c;-l:libunwind.a;dl] + implicit objs: [/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/lib/aarch64-linux-android/23/crtbegin_dynamic.o;/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/lib/aarch64-linux-android/23/crtend_android.o] + implicit dirs: [/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/lib/clang/18/lib/linux/aarch64;/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/lib/aarch64-linux-android/23;/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/lib/aarch64-linux-android;/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/lib] + implicit fwks: [] + + + - + kind: "message-v1" + backtrace: + - "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Internal/CMakeDetermineLinkerId.cmake:40 (message)" + - "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeDetermineCompilerABI.cmake:255 (cmake_determine_linker_id)" + - "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeTestCXXCompiler.cmake:26 (CMAKE_DETERMINE_COMPILER_ABI)" + - "CMakeLists.txt:2 (project)" + message: | + Running the CXX compiler's linker: "/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/bin/ld.lld" "-v" + LLD 18.0.1 (compatible with GNU linkers) +... diff --git a/siro_rider/android/app/.cxx/Debug/3p4b322x/arm64-v8a/CMakeFiles/TargetDirectories.txt b/siro_rider/android/app/.cxx/Debug/3p4b322x/arm64-v8a/CMakeFiles/TargetDirectories.txt new file mode 100644 index 0000000..1dd9fb4 --- /dev/null +++ b/siro_rider/android/app/.cxx/Debug/3p4b322x/arm64-v8a/CMakeFiles/TargetDirectories.txt @@ -0,0 +1,3 @@ +/Users/hamzaaleghwairyeen/development/App/Intaleq/android/app/.cxx/Debug/3p4b322x/arm64-v8a/CMakeFiles/native-lib.dir +/Users/hamzaaleghwairyeen/development/App/Intaleq/android/app/.cxx/Debug/3p4b322x/arm64-v8a/CMakeFiles/edit_cache.dir +/Users/hamzaaleghwairyeen/development/App/Intaleq/android/app/.cxx/Debug/3p4b322x/arm64-v8a/CMakeFiles/rebuild_cache.dir diff --git a/siro_rider/android/app/.cxx/Debug/3p4b322x/arm64-v8a/CMakeFiles/cmake.check_cache b/siro_rider/android/app/.cxx/Debug/3p4b322x/arm64-v8a/CMakeFiles/cmake.check_cache new file mode 100644 index 0000000..3dccd73 --- /dev/null +++ b/siro_rider/android/app/.cxx/Debug/3p4b322x/arm64-v8a/CMakeFiles/cmake.check_cache @@ -0,0 +1 @@ +# This file is generated by cmake for dependency checking of the CMakeCache.txt file diff --git a/siro_rider/android/app/.cxx/Debug/3p4b322x/arm64-v8a/CMakeFiles/native-lib.dir/native-lib.cpp.o b/siro_rider/android/app/.cxx/Debug/3p4b322x/arm64-v8a/CMakeFiles/native-lib.dir/native-lib.cpp.o new file mode 100644 index 0000000..60e5a33 Binary files /dev/null and b/siro_rider/android/app/.cxx/Debug/3p4b322x/arm64-v8a/CMakeFiles/native-lib.dir/native-lib.cpp.o differ diff --git a/siro_rider/android/app/.cxx/Debug/3p4b322x/arm64-v8a/CMakeFiles/rules.ninja b/siro_rider/android/app/.cxx/Debug/3p4b322x/arm64-v8a/CMakeFiles/rules.ninja new file mode 100644 index 0000000..4970356 --- /dev/null +++ b/siro_rider/android/app/.cxx/Debug/3p4b322x/arm64-v8a/CMakeFiles/rules.ninja @@ -0,0 +1,66 @@ +# CMAKE generated file: DO NOT EDIT! +# Generated by "Ninja" Generator, CMake Version 3.31 + +# This file contains all the rules used to get the outputs files +# built from the input files. +# It is included in the main 'build.ninja'. + +# ============================================================================= +# Project: intaleq +# Configurations: Debug +# ============================================================================= +# ============================================================================= + +############################################# +# Rule for compiling CXX files. + +rule CXX_COMPILER__native-lib_unscanned_Debug + depfile = $DEP_FILE + deps = gcc + command = ${LAUNCHER}${CODE_CHECK}/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/bin/clang++ --target=aarch64-none-linux-android23 --sysroot=/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot $DEFINES $INCLUDES $FLAGS -MD -MT $out -MF $DEP_FILE -o $out -c $in + description = Building CXX object $out + + +############################################# +# Rule for linking CXX shared library. + +rule CXX_SHARED_LIBRARY_LINKER__native-lib_Debug + depfile = $DEP_FILE + deps = gcc + command = $PRE_LINK && /Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/bin/clang++ --target=aarch64-none-linux-android23 --sysroot=/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot -fPIC $LANGUAGE_COMPILE_FLAGS $ARCH_FLAGS $LINK_FLAGS -shared $SONAME_FLAG$SONAME -o $TARGET_FILE $in $LINK_PATH $LINK_LIBRARIES && $POST_BUILD + description = Linking CXX shared library $TARGET_FILE + restat = $RESTAT + + +############################################# +# Rule for running custom commands. + +rule CUSTOM_COMMAND + command = $COMMAND + description = $DESC + + +############################################# +# Rule for re-running cmake. + +rule RERUN_CMAKE + command = /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/bin/cmake --regenerate-during-build -S/Users/hamzaaleghwairyeen/development/App/Intaleq/android/app/src/main/cpp -B/Users/hamzaaleghwairyeen/development/App/Intaleq/android/app/.cxx/Debug/3p4b322x/arm64-v8a + description = Re-running CMake... + generator = 1 + + +############################################# +# Rule for cleaning all built files. + +rule CLEAN + command = /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/bin/ninja $FILE_ARG -t clean $TARGETS + description = Cleaning all built files... + + +############################################# +# Rule for printing all primary targets available. + +rule HELP + command = /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/bin/ninja -t targets + description = All primary targets available: + diff --git a/siro_rider/android/app/.cxx/Debug/3p4b322x/arm64-v8a/additional_project_files.txt b/siro_rider/android/app/.cxx/Debug/3p4b322x/arm64-v8a/additional_project_files.txt new file mode 100644 index 0000000..e69de29 diff --git a/siro_rider/android/app/.cxx/Debug/3p4b322x/arm64-v8a/android_gradle_build.json b/siro_rider/android/app/.cxx/Debug/3p4b322x/arm64-v8a/android_gradle_build.json new file mode 100644 index 0000000..528bda4 --- /dev/null +++ b/siro_rider/android/app/.cxx/Debug/3p4b322x/arm64-v8a/android_gradle_build.json @@ -0,0 +1,38 @@ +{ + "buildFiles": [ + "/Users/hamzaaleghwairyeen/development/App/Intaleq/android/app/src/main/cpp/CMakeLists.txt" + ], + "cleanCommandsComponents": [ + [ + "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/bin/ninja", + "-C", + "/Users/hamzaaleghwairyeen/development/App/Intaleq/android/app/.cxx/Debug/3p4b322x/arm64-v8a", + "clean" + ] + ], + "buildTargetsCommandComponents": [ + "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/bin/ninja", + "-C", + "/Users/hamzaaleghwairyeen/development/App/Intaleq/android/app/.cxx/Debug/3p4b322x/arm64-v8a", + "{LIST_OF_TARGETS_TO_BUILD}" + ], + "libraries": { + "native-lib::@6890427a1f51a3e7e1df": { + "toolchain": "toolchain", + "abi": "arm64-v8a", + "artifactName": "native-lib", + "output": "/Users/hamzaaleghwairyeen/development/App/Intaleq/build/app/intermediates/cxx/Debug/3p4b322x/obj/arm64-v8a/libnative-lib.so", + "runtimeFiles": [] + } + }, + "toolchains": { + "toolchain": { + "cCompilerExecutable": "/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/bin/clang.lld", + "cppCompilerExecutable": "/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/bin/clang++.lld" + } + }, + "cFileExtensions": [], + "cppFileExtensions": [ + "cpp" + ] +} \ No newline at end of file diff --git a/siro_rider/android/app/.cxx/Debug/3p4b322x/arm64-v8a/android_gradle_build_mini.json b/siro_rider/android/app/.cxx/Debug/3p4b322x/arm64-v8a/android_gradle_build_mini.json new file mode 100644 index 0000000..93d922b --- /dev/null +++ b/siro_rider/android/app/.cxx/Debug/3p4b322x/arm64-v8a/android_gradle_build_mini.json @@ -0,0 +1,27 @@ +{ + "buildFiles": [ + "/Users/hamzaaleghwairyeen/development/App/Intaleq/android/app/src/main/cpp/CMakeLists.txt" + ], + "cleanCommandsComponents": [ + [ + "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/bin/ninja", + "-C", + "/Users/hamzaaleghwairyeen/development/App/Intaleq/android/app/.cxx/Debug/3p4b322x/arm64-v8a", + "clean" + ] + ], + "buildTargetsCommandComponents": [ + "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/bin/ninja", + "-C", + "/Users/hamzaaleghwairyeen/development/App/Intaleq/android/app/.cxx/Debug/3p4b322x/arm64-v8a", + "{LIST_OF_TARGETS_TO_BUILD}" + ], + "libraries": { + "native-lib::@6890427a1f51a3e7e1df": { + "artifactName": "native-lib", + "abi": "arm64-v8a", + "output": "/Users/hamzaaleghwairyeen/development/App/Intaleq/build/app/intermediates/cxx/Debug/3p4b322x/obj/arm64-v8a/libnative-lib.so", + "runtimeFiles": [] + } + } +} \ No newline at end of file diff --git a/siro_rider/android/app/.cxx/Debug/3p4b322x/arm64-v8a/build.ninja b/siro_rider/android/app/.cxx/Debug/3p4b322x/arm64-v8a/build.ninja new file mode 100644 index 0000000..cfb8674 --- /dev/null +++ b/siro_rider/android/app/.cxx/Debug/3p4b322x/arm64-v8a/build.ninja @@ -0,0 +1,156 @@ +# CMAKE generated file: DO NOT EDIT! +# Generated by "Ninja" Generator, CMake Version 3.31 + +# This file contains all the build statements describing the +# compilation DAG. + +# ============================================================================= +# Write statements declared in CMakeLists.txt: +# +# Which is the root file. +# ============================================================================= + +# ============================================================================= +# Project: intaleq +# Configurations: Debug +# ============================================================================= + +############################################# +# Minimal version of Ninja required by this file + +ninja_required_version = 1.5 + + +############################################# +# Set configuration variable for custom commands. + +CONFIGURATION = Debug +# ============================================================================= +# Include auxiliary files. + + +############################################# +# Include rules file. + +include CMakeFiles/rules.ninja + +# ============================================================================= + +############################################# +# Logical path to working directory; prefix for absolute paths. + +cmake_ninja_workdir = /Users/hamzaaleghwairyeen/development/App/Intaleq/android/app/.cxx/Debug/3p4b322x/arm64-v8a/ +# ============================================================================= +# Object build statements for SHARED_LIBRARY target native-lib + + +############################################# +# Order-only phony target for native-lib + +build cmake_object_order_depends_target_native-lib: phony || . + +build CMakeFiles/native-lib.dir/native-lib.cpp.o: CXX_COMPILER__native-lib_unscanned_Debug /Users/hamzaaleghwairyeen/development/App/Intaleq/android/app/src/main/cpp/native-lib.cpp || cmake_object_order_depends_target_native-lib + DEFINES = -Dnative_lib_EXPORTS + DEP_FILE = CMakeFiles/native-lib.dir/native-lib.cpp.o.d + FLAGS = -g -DANDROID -fdata-sections -ffunction-sections -funwind-tables -fstack-protector-strong -no-canonical-prefixes -D_FORTIFY_SOURCE=2 -Wformat -Werror=format-security -fno-limit-debug-info -fPIC + OBJECT_DIR = CMakeFiles/native-lib.dir + OBJECT_FILE_DIR = CMakeFiles/native-lib.dir + TARGET_COMPILE_PDB = CMakeFiles/native-lib.dir/ + TARGET_PDB = /Users/hamzaaleghwairyeen/development/App/Intaleq/build/app/intermediates/cxx/Debug/3p4b322x/obj/arm64-v8a/libnative-lib.pdb + + +# ============================================================================= +# Link build statements for SHARED_LIBRARY target native-lib + + +############################################# +# Link the shared library /Users/hamzaaleghwairyeen/development/App/Intaleq/build/app/intermediates/cxx/Debug/3p4b322x/obj/arm64-v8a/libnative-lib.so + +build /Users/hamzaaleghwairyeen/development/App/Intaleq/build/app/intermediates/cxx/Debug/3p4b322x/obj/arm64-v8a/libnative-lib.so: CXX_SHARED_LIBRARY_LINKER__native-lib_Debug CMakeFiles/native-lib.dir/native-lib.cpp.o | /Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/lib/aarch64-linux-android/23/liblog.so + DEP_FILE = CMakeFiles/native-lib.dir/link.d + LANGUAGE_COMPILE_FLAGS = -g -DANDROID -fdata-sections -ffunction-sections -funwind-tables -fstack-protector-strong -no-canonical-prefixes -D_FORTIFY_SOURCE=2 -Wformat -Werror=format-security -fno-limit-debug-info + LINK_FLAGS = -static-libstdc++ -Wl,--build-id=sha1 -Wl,--no-rosegment -Wl,--no-undefined-version -Wl,--fatal-warnings -Wl,--no-undefined -Qunused-arguments -Xlinker --dependency-file=CMakeFiles/native-lib.dir/link.d + LINK_LIBRARIES = /Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/lib/aarch64-linux-android/23/liblog.so -latomic -lm + OBJECT_DIR = CMakeFiles/native-lib.dir + POST_BUILD = : + PRE_LINK = : + SONAME = libnative-lib.so + SONAME_FLAG = -Wl,-soname, + TARGET_COMPILE_PDB = CMakeFiles/native-lib.dir/ + TARGET_FILE = /Users/hamzaaleghwairyeen/development/App/Intaleq/build/app/intermediates/cxx/Debug/3p4b322x/obj/arm64-v8a/libnative-lib.so + TARGET_PDB = /Users/hamzaaleghwairyeen/development/App/Intaleq/build/app/intermediates/cxx/Debug/3p4b322x/obj/arm64-v8a/libnative-lib.pdb + + +############################################# +# Utility command for edit_cache + +build CMakeFiles/edit_cache.util: CUSTOM_COMMAND + COMMAND = cd /Users/hamzaaleghwairyeen/development/App/Intaleq/android/app/.cxx/Debug/3p4b322x/arm64-v8a && /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/bin/ccmake -S/Users/hamzaaleghwairyeen/development/App/Intaleq/android/app/src/main/cpp -B/Users/hamzaaleghwairyeen/development/App/Intaleq/android/app/.cxx/Debug/3p4b322x/arm64-v8a + DESC = Running CMake cache editor... + pool = console + restat = 1 + +build edit_cache: phony CMakeFiles/edit_cache.util + + +############################################# +# Utility command for rebuild_cache + +build CMakeFiles/rebuild_cache.util: CUSTOM_COMMAND + COMMAND = cd /Users/hamzaaleghwairyeen/development/App/Intaleq/android/app/.cxx/Debug/3p4b322x/arm64-v8a && /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/bin/cmake --regenerate-during-build -S/Users/hamzaaleghwairyeen/development/App/Intaleq/android/app/src/main/cpp -B/Users/hamzaaleghwairyeen/development/App/Intaleq/android/app/.cxx/Debug/3p4b322x/arm64-v8a + DESC = Running CMake to regenerate build system... + pool = console + restat = 1 + +build rebuild_cache: phony CMakeFiles/rebuild_cache.util + +# ============================================================================= +# Target aliases. + +build libnative-lib.so: phony /Users/hamzaaleghwairyeen/development/App/Intaleq/build/app/intermediates/cxx/Debug/3p4b322x/obj/arm64-v8a/libnative-lib.so + +build native-lib: phony /Users/hamzaaleghwairyeen/development/App/Intaleq/build/app/intermediates/cxx/Debug/3p4b322x/obj/arm64-v8a/libnative-lib.so + +# ============================================================================= +# Folder targets. + +# ============================================================================= + +############################################# +# Folder: /Users/hamzaaleghwairyeen/development/App/Intaleq/android/app/.cxx/Debug/3p4b322x/arm64-v8a + +build all: phony /Users/hamzaaleghwairyeen/development/App/Intaleq/build/app/intermediates/cxx/Debug/3p4b322x/obj/arm64-v8a/libnative-lib.so + +# ============================================================================= +# Built-in targets + + +############################################# +# Re-run CMake if any of its inputs changed. + +build build.ninja: RERUN_CMAKE | /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeCCompiler.cmake.in /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeCCompilerABI.c /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeCInformation.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeCXXCompiler.cmake.in /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeCXXCompilerABI.cpp /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeCXXInformation.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeCommonLanguageInclude.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeCompilerIdDetection.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeDetermineCCompiler.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeDetermineCXXCompiler.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeDetermineCompiler.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeDetermineCompilerABI.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeDetermineCompilerId.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeDetermineCompilerSupport.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeDetermineSystem.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeFindBinUtils.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeGenericSystem.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeInitializeConfigs.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeLanguageInformation.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeParseImplicitIncludeInfo.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeParseImplicitLinkInfo.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeParseLibraryArchitecture.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeSystem.cmake.in /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeSystemSpecificInformation.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeSystemSpecificInitialize.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeTestCCompiler.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeTestCXXCompiler.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeTestCompilerCommon.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/ADSP-DetermineCompiler.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/ARMCC-DetermineCompiler.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/ARMClang-DetermineCompiler.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/AppleClang-DetermineCompiler.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/Borland-DetermineCompiler.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/Bruce-C-DetermineCompiler.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/CMakeCommonCompilerMacros.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/Clang-C.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/Clang-CXX-CXXImportStd.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/Clang-CXX.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/Clang-DetermineCompiler.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/Clang-DetermineCompilerInternal.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/Clang-FindBinUtils.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/Clang.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/Compaq-C-DetermineCompiler.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/Compaq-CXX-DetermineCompiler.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/Cray-DetermineCompiler.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/CrayClang-DetermineCompiler.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/Embarcadero-DetermineCompiler.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/Fujitsu-DetermineCompiler.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/FujitsuClang-DetermineCompiler.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/GHS-DetermineCompiler.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/GNU-C-DetermineCompiler.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/GNU-CXX-DetermineCompiler.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/GNU.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/HP-C-DetermineCompiler.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/HP-CXX-DetermineCompiler.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/IAR-DetermineCompiler.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/IBMCPP-C-DetermineVersionInternal.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/IBMCPP-CXX-DetermineVersionInternal.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/IBMClang-C-DetermineCompiler.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/IBMClang-CXX-DetermineCompiler.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/Intel-DetermineCompiler.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/IntelLLVM-DetermineCompiler.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/LCC-C-DetermineCompiler.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/LCC-CXX-DetermineCompiler.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/MSVC-DetermineCompiler.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/NVHPC-DetermineCompiler.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/NVIDIA-DetermineCompiler.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/OpenWatcom-DetermineCompiler.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/OrangeC-DetermineCompiler.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/PGI-DetermineCompiler.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/PathScale-DetermineCompiler.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/SCO-DetermineCompiler.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/SDCC-C-DetermineCompiler.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/SunPro-C-DetermineCompiler.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/SunPro-CXX-DetermineCompiler.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/TI-DetermineCompiler.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/TIClang-DetermineCompiler.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/Tasking-DetermineCompiler.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/TinyCC-C-DetermineCompiler.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/VisualAge-C-DetermineCompiler.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/VisualAge-CXX-DetermineCompiler.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/Watcom-DetermineCompiler.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/XL-C-DetermineCompiler.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/XL-CXX-DetermineCompiler.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/XLClang-C-DetermineCompiler.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/XLClang-CXX-DetermineCompiler.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/zOS-C-DetermineCompiler.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/zOS-CXX-DetermineCompiler.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Internal/CMakeCLinkerInformation.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Internal/CMakeCXXLinkerInformation.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Internal/CMakeCommonLinkerInformation.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Internal/CMakeDetermineLinkerId.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Internal/FeatureTesting.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Linker/GNU.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Linker/LLD-C.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Linker/LLD-CXX.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Linker/LLD.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Platform/Android-Clang-C.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Platform/Android-Clang-CXX.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Platform/Android-Clang.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Platform/Android-Determine-C.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Platform/Android-Determine-CXX.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Platform/Android-Determine.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Platform/Android-Initialize.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Platform/Android.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Platform/Android/Determine-Compiler.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Platform/Linker/Android-LLD-C.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Platform/Linker/Android-LLD-CXX.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Platform/Linker/GNU.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Platform/Linker/Linux-GNU.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Platform/Linker/Linux-LLD-C.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Platform/Linker/Linux-LLD-CXX.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Platform/Linker/Linux-LLD.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Platform/Linux-Initialize.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Platform/Linux.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Platform/UnixPaths.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/build/cmake/abis.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/build/cmake/android-legacy.toolchain.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/build/cmake/android.toolchain.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/build/cmake/flags.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/build/cmake/hooks/pre/Android-Clang.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/build/cmake/hooks/pre/Android-Determine.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/build/cmake/hooks/pre/Android-Initialize.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/build/cmake/hooks/pre/Android.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/build/cmake/hooks/pre/Determine-Compiler.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/build/cmake/platforms.cmake /Users/hamzaaleghwairyeen/development/App/Intaleq/android/app/src/main/cpp/CMakeLists.txt CMakeCache.txt CMakeFiles/3.31.5-g6cf5163/CMakeCCompiler.cmake CMakeFiles/3.31.5-g6cf5163/CMakeCXXCompiler.cmake CMakeFiles/3.31.5-g6cf5163/CMakeSystem.cmake + pool = console + + +############################################# +# A missing CMake input file is not an error. + +build /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeCCompiler.cmake.in /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeCCompilerABI.c /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeCInformation.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeCXXCompiler.cmake.in /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeCXXCompilerABI.cpp /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeCXXInformation.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeCommonLanguageInclude.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeCompilerIdDetection.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeDetermineCCompiler.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeDetermineCXXCompiler.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeDetermineCompiler.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeDetermineCompilerABI.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeDetermineCompilerId.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeDetermineCompilerSupport.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeDetermineSystem.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeFindBinUtils.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeGenericSystem.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeInitializeConfigs.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeLanguageInformation.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeParseImplicitIncludeInfo.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeParseImplicitLinkInfo.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeParseLibraryArchitecture.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeSystem.cmake.in /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeSystemSpecificInformation.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeSystemSpecificInitialize.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeTestCCompiler.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeTestCXXCompiler.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeTestCompilerCommon.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/ADSP-DetermineCompiler.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/ARMCC-DetermineCompiler.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/ARMClang-DetermineCompiler.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/AppleClang-DetermineCompiler.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/Borland-DetermineCompiler.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/Bruce-C-DetermineCompiler.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/CMakeCommonCompilerMacros.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/Clang-C.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/Clang-CXX-CXXImportStd.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/Clang-CXX.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/Clang-DetermineCompiler.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/Clang-DetermineCompilerInternal.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/Clang-FindBinUtils.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/Clang.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/Compaq-C-DetermineCompiler.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/Compaq-CXX-DetermineCompiler.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/Cray-DetermineCompiler.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/CrayClang-DetermineCompiler.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/Embarcadero-DetermineCompiler.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/Fujitsu-DetermineCompiler.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/FujitsuClang-DetermineCompiler.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/GHS-DetermineCompiler.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/GNU-C-DetermineCompiler.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/GNU-CXX-DetermineCompiler.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/GNU.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/HP-C-DetermineCompiler.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/HP-CXX-DetermineCompiler.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/IAR-DetermineCompiler.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/IBMCPP-C-DetermineVersionInternal.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/IBMCPP-CXX-DetermineVersionInternal.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/IBMClang-C-DetermineCompiler.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/IBMClang-CXX-DetermineCompiler.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/Intel-DetermineCompiler.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/IntelLLVM-DetermineCompiler.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/LCC-C-DetermineCompiler.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/LCC-CXX-DetermineCompiler.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/MSVC-DetermineCompiler.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/NVHPC-DetermineCompiler.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/NVIDIA-DetermineCompiler.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/OpenWatcom-DetermineCompiler.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/OrangeC-DetermineCompiler.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/PGI-DetermineCompiler.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/PathScale-DetermineCompiler.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/SCO-DetermineCompiler.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/SDCC-C-DetermineCompiler.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/SunPro-C-DetermineCompiler.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/SunPro-CXX-DetermineCompiler.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/TI-DetermineCompiler.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/TIClang-DetermineCompiler.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/Tasking-DetermineCompiler.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/TinyCC-C-DetermineCompiler.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/VisualAge-C-DetermineCompiler.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/VisualAge-CXX-DetermineCompiler.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/Watcom-DetermineCompiler.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/XL-C-DetermineCompiler.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/XL-CXX-DetermineCompiler.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/XLClang-C-DetermineCompiler.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/XLClang-CXX-DetermineCompiler.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/zOS-C-DetermineCompiler.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/zOS-CXX-DetermineCompiler.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Internal/CMakeCLinkerInformation.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Internal/CMakeCXXLinkerInformation.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Internal/CMakeCommonLinkerInformation.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Internal/CMakeDetermineLinkerId.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Internal/FeatureTesting.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Linker/GNU.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Linker/LLD-C.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Linker/LLD-CXX.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Linker/LLD.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Platform/Android-Clang-C.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Platform/Android-Clang-CXX.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Platform/Android-Clang.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Platform/Android-Determine-C.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Platform/Android-Determine-CXX.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Platform/Android-Determine.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Platform/Android-Initialize.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Platform/Android.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Platform/Android/Determine-Compiler.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Platform/Linker/Android-LLD-C.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Platform/Linker/Android-LLD-CXX.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Platform/Linker/GNU.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Platform/Linker/Linux-GNU.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Platform/Linker/Linux-LLD-C.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Platform/Linker/Linux-LLD-CXX.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Platform/Linker/Linux-LLD.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Platform/Linux-Initialize.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Platform/Linux.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Platform/UnixPaths.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/build/cmake/abis.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/build/cmake/android-legacy.toolchain.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/build/cmake/android.toolchain.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/build/cmake/flags.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/build/cmake/hooks/pre/Android-Clang.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/build/cmake/hooks/pre/Android-Determine.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/build/cmake/hooks/pre/Android-Initialize.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/build/cmake/hooks/pre/Android.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/build/cmake/hooks/pre/Determine-Compiler.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/build/cmake/platforms.cmake /Users/hamzaaleghwairyeen/development/App/Intaleq/android/app/src/main/cpp/CMakeLists.txt CMakeCache.txt CMakeFiles/3.31.5-g6cf5163/CMakeCCompiler.cmake CMakeFiles/3.31.5-g6cf5163/CMakeCXXCompiler.cmake CMakeFiles/3.31.5-g6cf5163/CMakeSystem.cmake: phony + + +############################################# +# Clean all the built files. + +build clean: CLEAN + + +############################################# +# Print all primary targets available. + +build help: HELP + + +############################################# +# Make the all target the default. + +default all diff --git a/siro_rider/android/app/.cxx/Debug/3p4b322x/arm64-v8a/build_file_index.txt b/siro_rider/android/app/.cxx/Debug/3p4b322x/arm64-v8a/build_file_index.txt new file mode 100644 index 0000000..661f7ae --- /dev/null +++ b/siro_rider/android/app/.cxx/Debug/3p4b322x/arm64-v8a/build_file_index.txt @@ -0,0 +1 @@ +/Users/hamzaaleghwairyeen/development/App/Intaleq/android/app/src/main/cpp/CMakeLists.txt \ No newline at end of file diff --git a/siro_rider/android/app/.cxx/Debug/3p4b322x/arm64-v8a/cmake_install.cmake b/siro_rider/android/app/.cxx/Debug/3p4b322x/arm64-v8a/cmake_install.cmake new file mode 100644 index 0000000..e692948 --- /dev/null +++ b/siro_rider/android/app/.cxx/Debug/3p4b322x/arm64-v8a/cmake_install.cmake @@ -0,0 +1,66 @@ +# Install script for directory: /Users/hamzaaleghwairyeen/development/App/Intaleq/android/app/src/main/cpp + +# Set the install prefix +if(NOT DEFINED CMAKE_INSTALL_PREFIX) + set(CMAKE_INSTALL_PREFIX "/usr/local") +endif() +string(REGEX REPLACE "/$" "" CMAKE_INSTALL_PREFIX "${CMAKE_INSTALL_PREFIX}") + +# Set the install configuration name. +if(NOT DEFINED CMAKE_INSTALL_CONFIG_NAME) + if(BUILD_TYPE) + string(REGEX REPLACE "^[^A-Za-z0-9_]+" "" + CMAKE_INSTALL_CONFIG_NAME "${BUILD_TYPE}") + else() + set(CMAKE_INSTALL_CONFIG_NAME "Debug") + endif() + message(STATUS "Install configuration: \"${CMAKE_INSTALL_CONFIG_NAME}\"") +endif() + +# Set the component getting installed. +if(NOT CMAKE_INSTALL_COMPONENT) + if(COMPONENT) + message(STATUS "Install component: \"${COMPONENT}\"") + set(CMAKE_INSTALL_COMPONENT "${COMPONENT}") + else() + set(CMAKE_INSTALL_COMPONENT) + endif() +endif() + +# Install shared libraries without execute permission? +if(NOT DEFINED CMAKE_INSTALL_SO_NO_EXE) + set(CMAKE_INSTALL_SO_NO_EXE "0") +endif() + +# Is this installation the result of a crosscompile? +if(NOT DEFINED CMAKE_CROSSCOMPILING) + set(CMAKE_CROSSCOMPILING "TRUE") +endif() + +# Set path to fallback-tool for dependency-resolution. +if(NOT DEFINED CMAKE_OBJDUMP) + set(CMAKE_OBJDUMP "/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/bin/llvm-objdump") +endif() + +string(REPLACE ";" "\n" CMAKE_INSTALL_MANIFEST_CONTENT + "${CMAKE_INSTALL_MANIFEST_FILES}") +if(CMAKE_INSTALL_LOCAL_ONLY) + file(WRITE "/Users/hamzaaleghwairyeen/development/App/Intaleq/android/app/.cxx/Debug/3p4b322x/arm64-v8a/install_local_manifest.txt" + "${CMAKE_INSTALL_MANIFEST_CONTENT}") +endif() +if(CMAKE_INSTALL_COMPONENT) + if(CMAKE_INSTALL_COMPONENT MATCHES "^[a-zA-Z0-9_.+-]+$") + set(CMAKE_INSTALL_MANIFEST "install_manifest_${CMAKE_INSTALL_COMPONENT}.txt") + else() + string(MD5 CMAKE_INST_COMP_HASH "${CMAKE_INSTALL_COMPONENT}") + set(CMAKE_INSTALL_MANIFEST "install_manifest_${CMAKE_INST_COMP_HASH}.txt") + unset(CMAKE_INST_COMP_HASH) + endif() +else() + set(CMAKE_INSTALL_MANIFEST "install_manifest.txt") +endif() + +if(NOT CMAKE_INSTALL_LOCAL_ONLY) + file(WRITE "/Users/hamzaaleghwairyeen/development/App/Intaleq/android/app/.cxx/Debug/3p4b322x/arm64-v8a/${CMAKE_INSTALL_MANIFEST}" + "${CMAKE_INSTALL_MANIFEST_CONTENT}") +endif() diff --git a/siro_rider/android/app/.cxx/Debug/3p4b322x/arm64-v8a/compile_commands.json b/siro_rider/android/app/.cxx/Debug/3p4b322x/arm64-v8a/compile_commands.json new file mode 100644 index 0000000..5b16e99 --- /dev/null +++ b/siro_rider/android/app/.cxx/Debug/3p4b322x/arm64-v8a/compile_commands.json @@ -0,0 +1,8 @@ +[ +{ + "directory": "/Users/hamzaaleghwairyeen/development/App/Intaleq/android/app/.cxx/Debug/3p4b322x/arm64-v8a", + "command": "/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/bin/clang++ --target=aarch64-none-linux-android23 --sysroot=/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot -Dnative_lib_EXPORTS -g -DANDROID -fdata-sections -ffunction-sections -funwind-tables -fstack-protector-strong -no-canonical-prefixes -D_FORTIFY_SOURCE=2 -Wformat -Werror=format-security -fno-limit-debug-info -fPIC -o CMakeFiles/native-lib.dir/native-lib.cpp.o -c /Users/hamzaaleghwairyeen/development/App/Intaleq/android/app/src/main/cpp/native-lib.cpp", + "file": "/Users/hamzaaleghwairyeen/development/App/Intaleq/android/app/src/main/cpp/native-lib.cpp", + "output": "CMakeFiles/native-lib.dir/native-lib.cpp.o" +} +] \ No newline at end of file diff --git a/siro_rider/android/app/.cxx/Debug/3p4b322x/arm64-v8a/compile_commands.json.bin b/siro_rider/android/app/.cxx/Debug/3p4b322x/arm64-v8a/compile_commands.json.bin new file mode 100644 index 0000000..6954452 Binary files /dev/null and b/siro_rider/android/app/.cxx/Debug/3p4b322x/arm64-v8a/compile_commands.json.bin differ diff --git a/siro_rider/android/app/.cxx/Debug/3p4b322x/arm64-v8a/configure_fingerprint.bin b/siro_rider/android/app/.cxx/Debug/3p4b322x/arm64-v8a/configure_fingerprint.bin new file mode 100644 index 0000000..cdcb764 --- /dev/null +++ b/siro_rider/android/app/.cxx/Debug/3p4b322x/arm64-v8a/configure_fingerprint.bin @@ -0,0 +1,29 @@ +C/C++ Structured Log| +z +x/Users/hamzaaleghwairyeen/development/App/Intaleq/android/app/.cxx/Debug/3p4b322x/arm64-v8a/additional_project_files.txtC +A +?com.android.build.gradle.internal.cxx.io.EncodedFileFingerPrint  3  2y +w +u/Users/hamzaaleghwairyeen/development/App/Intaleq/android/app/.cxx/Debug/3p4b322x/arm64-v8a/android_gradle_build.json  3 + 2~ +| +z/Users/hamzaaleghwairyeen/development/App/Intaleq/android/app/.cxx/Debug/3p4b322x/arm64-v8a/android_gradle_build_mini.json  3 2k +i +g/Users/hamzaaleghwairyeen/development/App/Intaleq/android/app/.cxx/Debug/3p4b322x/arm64-v8a/build.ninja  3 2o +m +k/Users/hamzaaleghwairyeen/development/App/Intaleq/android/app/.cxx/Debug/3p4b322x/arm64-v8a/build.ninja.txt  3t +r +p/Users/hamzaaleghwairyeen/development/App/Intaleq/android/app/.cxx/Debug/3p4b322x/arm64-v8a/build_file_index.txt  3 Y 2u +s +q/Users/hamzaaleghwairyeen/development/App/Intaleq/android/app/.cxx/Debug/3p4b322x/arm64-v8a/compile_commands.json  3 2y +w +u/Users/hamzaaleghwairyeen/development/App/Intaleq/android/app/.cxx/Debug/3p4b322x/arm64-v8a/compile_commands.json.bin  3  2 +} +{/Users/hamzaaleghwairyeen/development/App/Intaleq/android/app/.cxx/Debug/3p4b322x/arm64-v8a/metadata_generation_command.txt  3 + 2r +p +n/Users/hamzaaleghwairyeen/development/App/Intaleq/android/app/.cxx/Debug/3p4b322x/arm64-v8a/prefab_config.json  3  ( 2w +u +s/Users/hamzaaleghwairyeen/development/App/Intaleq/android/app/.cxx/Debug/3p4b322x/arm64-v8a/symbol_folder_index.txt  3  j 2] +[ +Y/Users/hamzaaleghwairyeen/development/App/Intaleq/android/app/src/main/cpp/CMakeLists.txt  3  ޮ2 \ No newline at end of file diff --git a/siro_rider/android/app/.cxx/Debug/3p4b322x/arm64-v8a/metadata_generation_command.txt b/siro_rider/android/app/.cxx/Debug/3p4b322x/arm64-v8a/metadata_generation_command.txt new file mode 100644 index 0000000..0eee821 --- /dev/null +++ b/siro_rider/android/app/.cxx/Debug/3p4b322x/arm64-v8a/metadata_generation_command.txt @@ -0,0 +1,18 @@ + -H/Users/hamzaaleghwairyeen/development/App/Intaleq/android/app/src/main/cpp +-DCMAKE_SYSTEM_NAME=Android +-DCMAKE_EXPORT_COMPILE_COMMANDS=ON +-DCMAKE_SYSTEM_VERSION=23 +-DANDROID_PLATFORM=android-23 +-DANDROID_ABI=arm64-v8a +-DCMAKE_ANDROID_ARCH_ABI=arm64-v8a +-DANDROID_NDK=/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973 +-DCMAKE_ANDROID_NDK=/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973 +-DCMAKE_TOOLCHAIN_FILE=/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/build/cmake/android.toolchain.cmake +-DCMAKE_MAKE_PROGRAM=/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/bin/ninja +-DCMAKE_LIBRARY_OUTPUT_DIRECTORY=/Users/hamzaaleghwairyeen/development/App/Intaleq/build/app/intermediates/cxx/Debug/3p4b322x/obj/arm64-v8a +-DCMAKE_RUNTIME_OUTPUT_DIRECTORY=/Users/hamzaaleghwairyeen/development/App/Intaleq/build/app/intermediates/cxx/Debug/3p4b322x/obj/arm64-v8a +-DCMAKE_BUILD_TYPE=Debug +-B/Users/hamzaaleghwairyeen/development/App/Intaleq/android/app/.cxx/Debug/3p4b322x/arm64-v8a +-GNinja + Build command args: [] + Version: 2 \ No newline at end of file diff --git a/siro_rider/android/app/.cxx/Debug/3p4b322x/arm64-v8a/prefab_config.json b/siro_rider/android/app/.cxx/Debug/3p4b322x/arm64-v8a/prefab_config.json new file mode 100644 index 0000000..e799de8 --- /dev/null +++ b/siro_rider/android/app/.cxx/Debug/3p4b322x/arm64-v8a/prefab_config.json @@ -0,0 +1,4 @@ +{ + "enabled": false, + "packages": [] +} \ No newline at end of file diff --git a/siro_rider/android/app/.cxx/Debug/3p4b322x/arm64-v8a/symbol_folder_index.txt b/siro_rider/android/app/.cxx/Debug/3p4b322x/arm64-v8a/symbol_folder_index.txt new file mode 100644 index 0000000..6393d5b --- /dev/null +++ b/siro_rider/android/app/.cxx/Debug/3p4b322x/arm64-v8a/symbol_folder_index.txt @@ -0,0 +1 @@ +/Users/hamzaaleghwairyeen/development/App/Intaleq/build/app/intermediates/cxx/Debug/3p4b322x/obj/arm64-v8a \ No newline at end of file diff --git a/siro_rider/android/app/.cxx/Debug/3p4b322x/armeabi-v7a/.cmake/api/v1/query/client-agp/cache-v2 b/siro_rider/android/app/.cxx/Debug/3p4b322x/armeabi-v7a/.cmake/api/v1/query/client-agp/cache-v2 new file mode 100644 index 0000000..e69de29 diff --git a/siro_rider/android/app/.cxx/Debug/3p4b322x/armeabi-v7a/.cmake/api/v1/query/client-agp/cmakeFiles-v1 b/siro_rider/android/app/.cxx/Debug/3p4b322x/armeabi-v7a/.cmake/api/v1/query/client-agp/cmakeFiles-v1 new file mode 100644 index 0000000..e69de29 diff --git a/siro_rider/android/app/.cxx/Debug/3p4b322x/armeabi-v7a/.cmake/api/v1/query/client-agp/codemodel-v2 b/siro_rider/android/app/.cxx/Debug/3p4b322x/armeabi-v7a/.cmake/api/v1/query/client-agp/codemodel-v2 new file mode 100644 index 0000000..e69de29 diff --git a/siro_rider/android/app/.cxx/Debug/3p4b322x/armeabi-v7a/.cmake/api/v1/reply/cache-v2-fbe345bef3a391426801.json b/siro_rider/android/app/.cxx/Debug/3p4b322x/armeabi-v7a/.cmake/api/v1/reply/cache-v2-fbe345bef3a391426801.json new file mode 100644 index 0000000..1edf7b5 --- /dev/null +++ b/siro_rider/android/app/.cxx/Debug/3p4b322x/armeabi-v7a/.cmake/api/v1/reply/cache-v2-fbe345bef3a391426801.json @@ -0,0 +1,1479 @@ +{ + "entries" : + [ + { + "name" : "ANDROID_ABI", + "properties" : + [ + { + "name" : "HELPSTRING", + "value" : "No help, variable specified on the command line." + } + ], + "type" : "UNINITIALIZED", + "value" : "armeabi-v7a" + }, + { + "name" : "ANDROID_NDK", + "properties" : + [ + { + "name" : "HELPSTRING", + "value" : "No help, variable specified on the command line." + } + ], + "type" : "UNINITIALIZED", + "value" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973" + }, + { + "name" : "ANDROID_PLATFORM", + "properties" : + [ + { + "name" : "HELPSTRING", + "value" : "No help, variable specified on the command line." + } + ], + "type" : "UNINITIALIZED", + "value" : "android-23" + }, + { + "name" : "CMAKE_ADDR2LINE", + "properties" : + [ + { + "name" : "ADVANCED", + "value" : "1" + }, + { + "name" : "HELPSTRING", + "value" : "Path to a program." + } + ], + "type" : "FILEPATH", + "value" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/bin/llvm-addr2line" + }, + { + "name" : "CMAKE_ANDROID_ARCH_ABI", + "properties" : + [ + { + "name" : "HELPSTRING", + "value" : "No help, variable specified on the command line." + } + ], + "type" : "UNINITIALIZED", + "value" : "armeabi-v7a" + }, + { + "name" : "CMAKE_ANDROID_NDK", + "properties" : + [ + { + "name" : "HELPSTRING", + "value" : "No help, variable specified on the command line." + } + ], + "type" : "UNINITIALIZED", + "value" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973" + }, + { + "name" : "CMAKE_AR", + "properties" : + [ + { + "name" : "ADVANCED", + "value" : "1" + }, + { + "name" : "HELPSTRING", + "value" : "Archiver" + } + ], + "type" : "FILEPATH", + "value" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/bin/llvm-ar" + }, + { + "name" : "CMAKE_ASM_FLAGS", + "properties" : + [ + { + "name" : "HELPSTRING", + "value" : "Flags used by the compiler during all build types." + } + ], + "type" : "STRING", + "value" : "" + }, + { + "name" : "CMAKE_ASM_FLAGS_DEBUG", + "properties" : + [ + { + "name" : "HELPSTRING", + "value" : "Flags used by the compiler during debug builds." + } + ], + "type" : "STRING", + "value" : "" + }, + { + "name" : "CMAKE_ASM_FLAGS_RELEASE", + "properties" : + [ + { + "name" : "HELPSTRING", + "value" : "Flags used by the compiler during release builds." + } + ], + "type" : "STRING", + "value" : "" + }, + { + "name" : "CMAKE_BUILD_TYPE", + "properties" : + [ + { + "name" : "HELPSTRING", + "value" : "Choose the type of build, options are: None Debug Release RelWithDebInfo MinSizeRel ..." + } + ], + "type" : "STRING", + "value" : "Debug" + }, + { + "name" : "CMAKE_CACHEFILE_DIR", + "properties" : + [ + { + "name" : "HELPSTRING", + "value" : "This is the directory where this CMakeCache.txt was created" + } + ], + "type" : "INTERNAL", + "value" : "/Users/hamzaaleghwairyeen/development/App/Intaleq/android/app/.cxx/Debug/3p4b322x/armeabi-v7a" + }, + { + "name" : "CMAKE_CACHE_MAJOR_VERSION", + "properties" : + [ + { + "name" : "HELPSTRING", + "value" : "Major version of cmake used to create the current loaded cache" + } + ], + "type" : "INTERNAL", + "value" : "3" + }, + { + "name" : "CMAKE_CACHE_MINOR_VERSION", + "properties" : + [ + { + "name" : "HELPSTRING", + "value" : "Minor version of cmake used to create the current loaded cache" + } + ], + "type" : "INTERNAL", + "value" : "31" + }, + { + "name" : "CMAKE_CACHE_PATCH_VERSION", + "properties" : + [ + { + "name" : "HELPSTRING", + "value" : "Patch version of cmake used to create the current loaded cache" + } + ], + "type" : "INTERNAL", + "value" : "5" + }, + { + "name" : "CMAKE_COMMAND", + "properties" : + [ + { + "name" : "HELPSTRING", + "value" : "Path to CMake executable." + } + ], + "type" : "INTERNAL", + "value" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/bin/cmake" + }, + { + "name" : "CMAKE_CPACK_COMMAND", + "properties" : + [ + { + "name" : "HELPSTRING", + "value" : "Path to cpack program executable." + } + ], + "type" : "INTERNAL", + "value" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/bin/cpack" + }, + { + "name" : "CMAKE_CTEST_COMMAND", + "properties" : + [ + { + "name" : "HELPSTRING", + "value" : "Path to ctest program executable." + } + ], + "type" : "INTERNAL", + "value" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/bin/ctest" + }, + { + "name" : "CMAKE_CXX_COMPILER", + "properties" : + [ + { + "name" : "ADVANCED", + "value" : "1" + }, + { + "name" : "HELPSTRING", + "value" : "" + } + ], + "type" : "UNINITIALIZED", + "value" : "" + }, + { + "name" : "CMAKE_CXX_COMPILER_AR", + "properties" : + [ + { + "name" : "ADVANCED", + "value" : "1" + }, + { + "name" : "HELPSTRING", + "value" : "LLVM archiver" + } + ], + "type" : "FILEPATH", + "value" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/bin/llvm-ar" + }, + { + "name" : "CMAKE_CXX_COMPILER_CLANG_SCAN_DEPS", + "properties" : + [ + { + "name" : "ADVANCED", + "value" : "1" + }, + { + "name" : "HELPSTRING", + "value" : "`clang-scan-deps` dependency scanner" + } + ], + "type" : "FILEPATH", + "value" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/bin/clang-scan-deps" + }, + { + "name" : "CMAKE_CXX_COMPILER_RANLIB", + "properties" : + [ + { + "name" : "ADVANCED", + "value" : "1" + }, + { + "name" : "HELPSTRING", + "value" : "Generate index for LLVM archive" + } + ], + "type" : "FILEPATH", + "value" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/bin/llvm-ranlib" + }, + { + "name" : "CMAKE_CXX_FLAGS", + "properties" : + [ + { + "name" : "ADVANCED", + "value" : "1" + }, + { + "name" : "HELPSTRING", + "value" : "Flags used by the compiler during all build types." + } + ], + "type" : "STRING", + "value" : "" + }, + { + "name" : "CMAKE_CXX_FLAGS_DEBUG", + "properties" : + [ + { + "name" : "ADVANCED", + "value" : "1" + }, + { + "name" : "HELPSTRING", + "value" : "Flags used by the compiler during debug builds." + } + ], + "type" : "STRING", + "value" : "" + }, + { + "name" : "CMAKE_CXX_FLAGS_MINSIZEREL", + "properties" : + [ + { + "name" : "ADVANCED", + "value" : "1" + }, + { + "name" : "HELPSTRING", + "value" : "Flags used by the CXX compiler during MINSIZEREL builds." + } + ], + "type" : "STRING", + "value" : "-Os -DNDEBUG" + }, + { + "name" : "CMAKE_CXX_FLAGS_RELEASE", + "properties" : + [ + { + "name" : "ADVANCED", + "value" : "1" + }, + { + "name" : "HELPSTRING", + "value" : "Flags used by the compiler during release builds." + } + ], + "type" : "STRING", + "value" : "" + }, + { + "name" : "CMAKE_CXX_FLAGS_RELWITHDEBINFO", + "properties" : + [ + { + "name" : "ADVANCED", + "value" : "1" + }, + { + "name" : "HELPSTRING", + "value" : "Flags used by the CXX compiler during RELWITHDEBINFO builds." + } + ], + "type" : "STRING", + "value" : "-O2 -g -DNDEBUG" + }, + { + "name" : "CMAKE_CXX_STANDARD_LIBRARIES", + "properties" : + [ + { + "name" : "ADVANCED", + "value" : "1" + }, + { + "name" : "HELPSTRING", + "value" : "Libraries linked by default with all C++ applications." + } + ], + "type" : "STRING", + "value" : "-latomic -lm" + }, + { + "name" : "CMAKE_C_COMPILER", + "properties" : + [ + { + "name" : "ADVANCED", + "value" : "1" + }, + { + "name" : "HELPSTRING", + "value" : "" + } + ], + "type" : "UNINITIALIZED", + "value" : "" + }, + { + "name" : "CMAKE_C_COMPILER_AR", + "properties" : + [ + { + "name" : "ADVANCED", + "value" : "1" + }, + { + "name" : "HELPSTRING", + "value" : "LLVM archiver" + } + ], + "type" : "FILEPATH", + "value" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/bin/llvm-ar" + }, + { + "name" : "CMAKE_C_COMPILER_CLANG_SCAN_DEPS", + "properties" : + [ + { + "name" : "ADVANCED", + "value" : "1" + }, + { + "name" : "HELPSTRING", + "value" : "`clang-scan-deps` dependency scanner" + } + ], + "type" : "FILEPATH", + "value" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/bin/clang-scan-deps" + }, + { + "name" : "CMAKE_C_COMPILER_RANLIB", + "properties" : + [ + { + "name" : "ADVANCED", + "value" : "1" + }, + { + "name" : "HELPSTRING", + "value" : "Generate index for LLVM archive" + } + ], + "type" : "FILEPATH", + "value" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/bin/llvm-ranlib" + }, + { + "name" : "CMAKE_C_FLAGS", + "properties" : + [ + { + "name" : "ADVANCED", + "value" : "1" + }, + { + "name" : "HELPSTRING", + "value" : "Flags used by the compiler during all build types." + } + ], + "type" : "STRING", + "value" : "" + }, + { + "name" : "CMAKE_C_FLAGS_DEBUG", + "properties" : + [ + { + "name" : "ADVANCED", + "value" : "1" + }, + { + "name" : "HELPSTRING", + "value" : "Flags used by the compiler during debug builds." + } + ], + "type" : "STRING", + "value" : "" + }, + { + "name" : "CMAKE_C_FLAGS_MINSIZEREL", + "properties" : + [ + { + "name" : "ADVANCED", + "value" : "1" + }, + { + "name" : "HELPSTRING", + "value" : "Flags used by the C compiler during MINSIZEREL builds." + } + ], + "type" : "STRING", + "value" : "-Os -DNDEBUG" + }, + { + "name" : "CMAKE_C_FLAGS_RELEASE", + "properties" : + [ + { + "name" : "ADVANCED", + "value" : "1" + }, + { + "name" : "HELPSTRING", + "value" : "Flags used by the compiler during release builds." + } + ], + "type" : "STRING", + "value" : "" + }, + { + "name" : "CMAKE_C_FLAGS_RELWITHDEBINFO", + "properties" : + [ + { + "name" : "ADVANCED", + "value" : "1" + }, + { + "name" : "HELPSTRING", + "value" : "Flags used by the C compiler during RELWITHDEBINFO builds." + } + ], + "type" : "STRING", + "value" : "-O2 -g -DNDEBUG" + }, + { + "name" : "CMAKE_C_STANDARD_LIBRARIES", + "properties" : + [ + { + "name" : "ADVANCED", + "value" : "1" + }, + { + "name" : "HELPSTRING", + "value" : "Libraries linked by default with all C applications." + } + ], + "type" : "STRING", + "value" : "-latomic -lm" + }, + { + "name" : "CMAKE_DLLTOOL", + "properties" : + [ + { + "name" : "ADVANCED", + "value" : "1" + }, + { + "name" : "HELPSTRING", + "value" : "Path to a program." + } + ], + "type" : "FILEPATH", + "value" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/bin/llvm-dlltool" + }, + { + "name" : "CMAKE_EDIT_COMMAND", + "properties" : + [ + { + "name" : "HELPSTRING", + "value" : "Path to cache edit program executable." + } + ], + "type" : "INTERNAL", + "value" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/bin/ccmake" + }, + { + "name" : "CMAKE_EXECUTABLE_FORMAT", + "properties" : + [ + { + "name" : "HELPSTRING", + "value" : "Executable file format" + } + ], + "type" : "INTERNAL", + "value" : "ELF" + }, + { + "name" : "CMAKE_EXE_LINKER_FLAGS", + "properties" : + [ + { + "name" : "ADVANCED", + "value" : "1" + }, + { + "name" : "HELPSTRING", + "value" : "Flags used by the linker." + } + ], + "type" : "STRING", + "value" : "" + }, + { + "name" : "CMAKE_EXE_LINKER_FLAGS_DEBUG", + "properties" : + [ + { + "name" : "ADVANCED", + "value" : "1" + }, + { + "name" : "HELPSTRING", + "value" : "Flags used by the linker during DEBUG builds." + } + ], + "type" : "STRING", + "value" : "" + }, + { + "name" : "CMAKE_EXE_LINKER_FLAGS_MINSIZEREL", + "properties" : + [ + { + "name" : "ADVANCED", + "value" : "1" + }, + { + "name" : "HELPSTRING", + "value" : "Flags used by the linker during MINSIZEREL builds." + } + ], + "type" : "STRING", + "value" : "" + }, + { + "name" : "CMAKE_EXE_LINKER_FLAGS_RELEASE", + "properties" : + [ + { + "name" : "ADVANCED", + "value" : "1" + }, + { + "name" : "HELPSTRING", + "value" : "Flags used by the linker during RELEASE builds." + } + ], + "type" : "STRING", + "value" : "" + }, + { + "name" : "CMAKE_EXE_LINKER_FLAGS_RELWITHDEBINFO", + "properties" : + [ + { + "name" : "ADVANCED", + "value" : "1" + }, + { + "name" : "HELPSTRING", + "value" : "Flags used by the linker during RELWITHDEBINFO builds." + } + ], + "type" : "STRING", + "value" : "" + }, + { + "name" : "CMAKE_EXPORT_BUILD_DATABASE", + "properties" : + [ + { + "name" : "ADVANCED", + "value" : "1" + }, + { + "name" : "HELPSTRING", + "value" : "Enable/Disable output of build database during the build." + } + ], + "type" : "BOOL", + "value" : "" + }, + { + "name" : "CMAKE_EXPORT_COMPILE_COMMANDS", + "properties" : + [ + { + "name" : "HELPSTRING", + "value" : "No help, variable specified on the command line." + } + ], + "type" : "UNINITIALIZED", + "value" : "ON" + }, + { + "name" : "CMAKE_EXTRA_GENERATOR", + "properties" : + [ + { + "name" : "HELPSTRING", + "value" : "Name of external makefile project generator." + } + ], + "type" : "INTERNAL", + "value" : "" + }, + { + "name" : "CMAKE_FIND_PACKAGE_REDIRECTS_DIR", + "properties" : + [ + { + "name" : "HELPSTRING", + "value" : "Value Computed by CMake." + } + ], + "type" : "STATIC", + "value" : "/Users/hamzaaleghwairyeen/development/App/Intaleq/android/app/.cxx/Debug/3p4b322x/armeabi-v7a/CMakeFiles/pkgRedirects" + }, + { + "name" : "CMAKE_GENERATOR", + "properties" : + [ + { + "name" : "HELPSTRING", + "value" : "Name of generator." + } + ], + "type" : "INTERNAL", + "value" : "Ninja" + }, + { + "name" : "CMAKE_GENERATOR_INSTANCE", + "properties" : + [ + { + "name" : "HELPSTRING", + "value" : "Generator instance identifier." + } + ], + "type" : "INTERNAL", + "value" : "" + }, + { + "name" : "CMAKE_GENERATOR_PLATFORM", + "properties" : + [ + { + "name" : "HELPSTRING", + "value" : "Name of generator platform." + } + ], + "type" : "INTERNAL", + "value" : "" + }, + { + "name" : "CMAKE_GENERATOR_TOOLSET", + "properties" : + [ + { + "name" : "HELPSTRING", + "value" : "Name of generator toolset." + } + ], + "type" : "INTERNAL", + "value" : "" + }, + { + "name" : "CMAKE_HOME_DIRECTORY", + "properties" : + [ + { + "name" : "HELPSTRING", + "value" : "Source directory with the top level CMakeLists.txt file for this project" + } + ], + "type" : "INTERNAL", + "value" : "/Users/hamzaaleghwairyeen/development/App/Intaleq/android/app/src/main/cpp" + }, + { + "name" : "CMAKE_INSTALL_PREFIX", + "properties" : + [ + { + "name" : "HELPSTRING", + "value" : "Install path prefix, prepended onto install directories." + } + ], + "type" : "PATH", + "value" : "/usr/local" + }, + { + "name" : "CMAKE_INSTALL_SO_NO_EXE", + "properties" : + [ + { + "name" : "HELPSTRING", + "value" : "Install .so files without execute permission." + } + ], + "type" : "INTERNAL", + "value" : "0" + }, + { + "name" : "CMAKE_LIBRARY_OUTPUT_DIRECTORY", + "properties" : + [ + { + "name" : "HELPSTRING", + "value" : "No help, variable specified on the command line." + } + ], + "type" : "UNINITIALIZED", + "value" : "/Users/hamzaaleghwairyeen/development/App/Intaleq/build/app/intermediates/cxx/Debug/3p4b322x/obj/armeabi-v7a" + }, + { + "name" : "CMAKE_LINKER", + "properties" : + [ + { + "name" : "ADVANCED", + "value" : "1" + }, + { + "name" : "HELPSTRING", + "value" : "Path to a program." + } + ], + "type" : "FILEPATH", + "value" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/bin/ld.lld" + }, + { + "name" : "CMAKE_MAKE_PROGRAM", + "properties" : + [ + { + "name" : "HELPSTRING", + "value" : "No help, variable specified on the command line." + } + ], + "type" : "UNINITIALIZED", + "value" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/bin/ninja" + }, + { + "name" : "CMAKE_MODULE_LINKER_FLAGS", + "properties" : + [ + { + "name" : "ADVANCED", + "value" : "1" + }, + { + "name" : "HELPSTRING", + "value" : "Flags used by the linker during the creation of modules." + } + ], + "type" : "STRING", + "value" : "" + }, + { + "name" : "CMAKE_MODULE_LINKER_FLAGS_DEBUG", + "properties" : + [ + { + "name" : "ADVANCED", + "value" : "1" + }, + { + "name" : "HELPSTRING", + "value" : "Flags used by the linker during the creation of modules during DEBUG builds." + } + ], + "type" : "STRING", + "value" : "" + }, + { + "name" : "CMAKE_MODULE_LINKER_FLAGS_MINSIZEREL", + "properties" : + [ + { + "name" : "ADVANCED", + "value" : "1" + }, + { + "name" : "HELPSTRING", + "value" : "Flags used by the linker during the creation of modules during MINSIZEREL builds." + } + ], + "type" : "STRING", + "value" : "" + }, + { + "name" : "CMAKE_MODULE_LINKER_FLAGS_RELEASE", + "properties" : + [ + { + "name" : "ADVANCED", + "value" : "1" + }, + { + "name" : "HELPSTRING", + "value" : "Flags used by the linker during the creation of modules during RELEASE builds." + } + ], + "type" : "STRING", + "value" : "" + }, + { + "name" : "CMAKE_MODULE_LINKER_FLAGS_RELWITHDEBINFO", + "properties" : + [ + { + "name" : "ADVANCED", + "value" : "1" + }, + { + "name" : "HELPSTRING", + "value" : "Flags used by the linker during the creation of modules during RELWITHDEBINFO builds." + } + ], + "type" : "STRING", + "value" : "" + }, + { + "name" : "CMAKE_NM", + "properties" : + [ + { + "name" : "ADVANCED", + "value" : "1" + }, + { + "name" : "HELPSTRING", + "value" : "Path to a program." + } + ], + "type" : "FILEPATH", + "value" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/bin/llvm-nm" + }, + { + "name" : "CMAKE_NUMBER_OF_MAKEFILES", + "properties" : + [ + { + "name" : "HELPSTRING", + "value" : "number of local generators" + } + ], + "type" : "INTERNAL", + "value" : "1" + }, + { + "name" : "CMAKE_OBJCOPY", + "properties" : + [ + { + "name" : "ADVANCED", + "value" : "1" + }, + { + "name" : "HELPSTRING", + "value" : "Path to a program." + } + ], + "type" : "FILEPATH", + "value" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/bin/llvm-objcopy" + }, + { + "name" : "CMAKE_OBJDUMP", + "properties" : + [ + { + "name" : "ADVANCED", + "value" : "1" + }, + { + "name" : "HELPSTRING", + "value" : "Path to a program." + } + ], + "type" : "FILEPATH", + "value" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/bin/llvm-objdump" + }, + { + "name" : "CMAKE_PLATFORM_INFO_INITIALIZED", + "properties" : + [ + { + "name" : "HELPSTRING", + "value" : "Platform information initialized" + } + ], + "type" : "INTERNAL", + "value" : "1" + }, + { + "name" : "CMAKE_PROJECT_DESCRIPTION", + "properties" : + [ + { + "name" : "HELPSTRING", + "value" : "Value Computed by CMake" + } + ], + "type" : "STATIC", + "value" : "" + }, + { + "name" : "CMAKE_PROJECT_HOMEPAGE_URL", + "properties" : + [ + { + "name" : "HELPSTRING", + "value" : "Value Computed by CMake" + } + ], + "type" : "STATIC", + "value" : "" + }, + { + "name" : "CMAKE_PROJECT_NAME", + "properties" : + [ + { + "name" : "HELPSTRING", + "value" : "Value Computed by CMake" + } + ], + "type" : "STATIC", + "value" : "intaleq" + }, + { + "name" : "CMAKE_RANLIB", + "properties" : + [ + { + "name" : "ADVANCED", + "value" : "1" + }, + { + "name" : "HELPSTRING", + "value" : "Ranlib" + } + ], + "type" : "FILEPATH", + "value" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/bin/llvm-ranlib" + }, + { + "name" : "CMAKE_READELF", + "properties" : + [ + { + "name" : "ADVANCED", + "value" : "1" + }, + { + "name" : "HELPSTRING", + "value" : "Path to a program." + } + ], + "type" : "FILEPATH", + "value" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/bin/llvm-readelf" + }, + { + "name" : "CMAKE_ROOT", + "properties" : + [ + { + "name" : "HELPSTRING", + "value" : "Path to CMake installation." + } + ], + "type" : "INTERNAL", + "value" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31" + }, + { + "name" : "CMAKE_RUNTIME_OUTPUT_DIRECTORY", + "properties" : + [ + { + "name" : "HELPSTRING", + "value" : "No help, variable specified on the command line." + } + ], + "type" : "UNINITIALIZED", + "value" : "/Users/hamzaaleghwairyeen/development/App/Intaleq/build/app/intermediates/cxx/Debug/3p4b322x/obj/armeabi-v7a" + }, + { + "name" : "CMAKE_SHARED_LINKER_FLAGS", + "properties" : + [ + { + "name" : "ADVANCED", + "value" : "1" + }, + { + "name" : "HELPSTRING", + "value" : "Flags used by the linker during the creation of dll's." + } + ], + "type" : "STRING", + "value" : "" + }, + { + "name" : "CMAKE_SHARED_LINKER_FLAGS_DEBUG", + "properties" : + [ + { + "name" : "ADVANCED", + "value" : "1" + }, + { + "name" : "HELPSTRING", + "value" : "Flags used by the linker during the creation of shared libraries during DEBUG builds." + } + ], + "type" : "STRING", + "value" : "" + }, + { + "name" : "CMAKE_SHARED_LINKER_FLAGS_MINSIZEREL", + "properties" : + [ + { + "name" : "ADVANCED", + "value" : "1" + }, + { + "name" : "HELPSTRING", + "value" : "Flags used by the linker during the creation of shared libraries during MINSIZEREL builds." + } + ], + "type" : "STRING", + "value" : "" + }, + { + "name" : "CMAKE_SHARED_LINKER_FLAGS_RELEASE", + "properties" : + [ + { + "name" : "ADVANCED", + "value" : "1" + }, + { + "name" : "HELPSTRING", + "value" : "Flags used by the linker during the creation of shared libraries during RELEASE builds." + } + ], + "type" : "STRING", + "value" : "" + }, + { + "name" : "CMAKE_SHARED_LINKER_FLAGS_RELWITHDEBINFO", + "properties" : + [ + { + "name" : "ADVANCED", + "value" : "1" + }, + { + "name" : "HELPSTRING", + "value" : "Flags used by the linker during the creation of shared libraries during RELWITHDEBINFO builds." + } + ], + "type" : "STRING", + "value" : "" + }, + { + "name" : "CMAKE_SKIP_INSTALL_RPATH", + "properties" : + [ + { + "name" : "ADVANCED", + "value" : "1" + }, + { + "name" : "HELPSTRING", + "value" : "If set, runtime paths are not added when installing shared libraries, but are added when building." + } + ], + "type" : "BOOL", + "value" : "NO" + }, + { + "name" : "CMAKE_SKIP_RPATH", + "properties" : + [ + { + "name" : "ADVANCED", + "value" : "1" + }, + { + "name" : "HELPSTRING", + "value" : "If set, runtime paths are not added when using shared libraries." + } + ], + "type" : "BOOL", + "value" : "NO" + }, + { + "name" : "CMAKE_STATIC_LINKER_FLAGS", + "properties" : + [ + { + "name" : "ADVANCED", + "value" : "1" + }, + { + "name" : "HELPSTRING", + "value" : "Flags used by the linker during the creation of static libraries during all build types." + } + ], + "type" : "STRING", + "value" : "" + }, + { + "name" : "CMAKE_STATIC_LINKER_FLAGS_DEBUG", + "properties" : + [ + { + "name" : "ADVANCED", + "value" : "1" + }, + { + "name" : "HELPSTRING", + "value" : "Flags used by the linker during the creation of static libraries during DEBUG builds." + } + ], + "type" : "STRING", + "value" : "" + }, + { + "name" : "CMAKE_STATIC_LINKER_FLAGS_MINSIZEREL", + "properties" : + [ + { + "name" : "ADVANCED", + "value" : "1" + }, + { + "name" : "HELPSTRING", + "value" : "Flags used by the linker during the creation of static libraries during MINSIZEREL builds." + } + ], + "type" : "STRING", + "value" : "" + }, + { + "name" : "CMAKE_STATIC_LINKER_FLAGS_RELEASE", + "properties" : + [ + { + "name" : "ADVANCED", + "value" : "1" + }, + { + "name" : "HELPSTRING", + "value" : "Flags used by the linker during the creation of static libraries during RELEASE builds." + } + ], + "type" : "STRING", + "value" : "" + }, + { + "name" : "CMAKE_STATIC_LINKER_FLAGS_RELWITHDEBINFO", + "properties" : + [ + { + "name" : "ADVANCED", + "value" : "1" + }, + { + "name" : "HELPSTRING", + "value" : "Flags used by the linker during the creation of static libraries during RELWITHDEBINFO builds." + } + ], + "type" : "STRING", + "value" : "" + }, + { + "name" : "CMAKE_STRIP", + "properties" : + [ + { + "name" : "ADVANCED", + "value" : "1" + }, + { + "name" : "HELPSTRING", + "value" : "Strip" + } + ], + "type" : "FILEPATH", + "value" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/bin/llvm-strip" + }, + { + "name" : "CMAKE_SYSTEM_NAME", + "properties" : + [ + { + "name" : "HELPSTRING", + "value" : "No help, variable specified on the command line." + } + ], + "type" : "UNINITIALIZED", + "value" : "Android" + }, + { + "name" : "CMAKE_SYSTEM_VERSION", + "properties" : + [ + { + "name" : "HELPSTRING", + "value" : "No help, variable specified on the command line." + } + ], + "type" : "UNINITIALIZED", + "value" : "23" + }, + { + "name" : "CMAKE_TAPI", + "properties" : + [ + { + "name" : "ADVANCED", + "value" : "1" + }, + { + "name" : "HELPSTRING", + "value" : "Path to a program." + } + ], + "type" : "FILEPATH", + "value" : "CMAKE_TAPI-NOTFOUND" + }, + { + "name" : "CMAKE_TOOLCHAIN_FILE", + "properties" : + [ + { + "name" : "HELPSTRING", + "value" : "The CMake toolchain file" + } + ], + "type" : "FILEPATH", + "value" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/build/cmake/android.toolchain.cmake" + }, + { + "name" : "CMAKE_UNAME", + "properties" : + [ + { + "name" : "HELPSTRING", + "value" : "uname command" + } + ], + "type" : "INTERNAL", + "value" : "/usr/bin/uname" + }, + { + "name" : "CMAKE_VERBOSE_MAKEFILE", + "properties" : + [ + { + "name" : "ADVANCED", + "value" : "1" + }, + { + "name" : "HELPSTRING", + "value" : "If this value is on, makefiles will be generated without the .SILENT directive, and all commands will be echoed to the console during the make. This is useful for debugging only. With Visual Studio IDE projects all commands are done without /nologo." + } + ], + "type" : "BOOL", + "value" : "FALSE" + }, + { + "name" : "_CMAKE_CXX_LINKER_PUSHPOP_STATE_SUPPORTED", + "properties" : + [ + { + "name" : "HELPSTRING", + "value" : "linker supports push/pop state" + } + ], + "type" : "INTERNAL", + "value" : "TRUE" + }, + { + "name" : "_CMAKE_C_LINKER_PUSHPOP_STATE_SUPPORTED", + "properties" : + [ + { + "name" : "HELPSTRING", + "value" : "linker supports push/pop state" + } + ], + "type" : "INTERNAL", + "value" : "TRUE" + }, + { + "name" : "_CMAKE_LINKER_PUSHPOP_STATE_SUPPORTED", + "properties" : + [ + { + "name" : "HELPSTRING", + "value" : "linker supports push/pop state" + } + ], + "type" : "INTERNAL", + "value" : "TRUE" + }, + { + "name" : "intaleq_BINARY_DIR", + "properties" : + [ + { + "name" : "HELPSTRING", + "value" : "Value Computed by CMake" + } + ], + "type" : "STATIC", + "value" : "/Users/hamzaaleghwairyeen/development/App/Intaleq/android/app/.cxx/Debug/3p4b322x/armeabi-v7a" + }, + { + "name" : "intaleq_IS_TOP_LEVEL", + "properties" : + [ + { + "name" : "HELPSTRING", + "value" : "Value Computed by CMake" + } + ], + "type" : "STATIC", + "value" : "ON" + }, + { + "name" : "intaleq_SOURCE_DIR", + "properties" : + [ + { + "name" : "HELPSTRING", + "value" : "Value Computed by CMake" + } + ], + "type" : "STATIC", + "value" : "/Users/hamzaaleghwairyeen/development/App/Intaleq/android/app/src/main/cpp" + }, + { + "name" : "log-lib", + "properties" : + [ + { + "name" : "HELPSTRING", + "value" : "Path to a library." + } + ], + "type" : "FILEPATH", + "value" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/lib/arm-linux-androideabi/23/liblog.so" + }, + { + "name" : "native-lib_LIB_DEPENDS", + "properties" : + [ + { + "name" : "HELPSTRING", + "value" : "Dependencies for the target" + } + ], + "type" : "STATIC", + "value" : "general;/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/lib/arm-linux-androideabi/23/liblog.so;" + } + ], + "kind" : "cache", + "version" : + { + "major" : 2, + "minor" : 0 + } +} diff --git a/siro_rider/android/app/.cxx/Debug/3p4b322x/armeabi-v7a/.cmake/api/v1/reply/cmakeFiles-v1-01669e876dc9f2bb8a18.json b/siro_rider/android/app/.cxx/Debug/3p4b322x/armeabi-v7a/.cmake/api/v1/reply/cmakeFiles-v1-01669e876dc9f2bb8a18.json new file mode 100644 index 0000000..605039a --- /dev/null +++ b/siro_rider/android/app/.cxx/Debug/3p4b322x/armeabi-v7a/.cmake/api/v1/reply/cmakeFiles-v1-01669e876dc9f2bb8a18.json @@ -0,0 +1,968 @@ +{ + "inputs" : + [ + { + "path" : "CMakeLists.txt" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeDetermineSystem.cmake" + }, + { + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/build/cmake/android.toolchain.cmake" + }, + { + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/build/cmake/android-legacy.toolchain.cmake" + }, + { + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/build/cmake/abis.cmake" + }, + { + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/build/cmake/platforms.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Platform/Android-Determine.cmake" + }, + { + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/build/cmake/hooks/pre/Android-Determine.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeSystem.cmake.in" + }, + { + "isGenerated" : true, + "path" : "/Users/hamzaaleghwairyeen/development/App/Intaleq/android/app/.cxx/Debug/3p4b322x/armeabi-v7a/CMakeFiles/3.31.5-g6cf5163/CMakeSystem.cmake" + }, + { + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/build/cmake/android.toolchain.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeSystemSpecificInitialize.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Platform/Android-Initialize.cmake" + }, + { + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/build/cmake/hooks/pre/Android-Initialize.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Platform/Linux-Initialize.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeDetermineCCompiler.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeDetermineCompiler.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Platform/Android-Determine-C.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Platform/Android/Determine-Compiler.cmake" + }, + { + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/build/cmake/hooks/pre/Determine-Compiler.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeDetermineCompilerId.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeCompilerIdDetection.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/ADSP-DetermineCompiler.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/ARMCC-DetermineCompiler.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/ARMClang-DetermineCompiler.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/AppleClang-DetermineCompiler.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/Clang-DetermineCompilerInternal.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/Borland-DetermineCompiler.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/Bruce-C-DetermineCompiler.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/Clang-DetermineCompiler.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/Clang-DetermineCompilerInternal.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/Compaq-C-DetermineCompiler.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/Cray-DetermineCompiler.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/CrayClang-DetermineCompiler.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/Embarcadero-DetermineCompiler.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/Fujitsu-DetermineCompiler.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/FujitsuClang-DetermineCompiler.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/GHS-DetermineCompiler.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/GNU-C-DetermineCompiler.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/HP-C-DetermineCompiler.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/IAR-DetermineCompiler.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/IBMClang-C-DetermineCompiler.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/Intel-DetermineCompiler.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/IntelLLVM-DetermineCompiler.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/LCC-C-DetermineCompiler.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/MSVC-DetermineCompiler.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/NVHPC-DetermineCompiler.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/NVIDIA-DetermineCompiler.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/OpenWatcom-DetermineCompiler.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/OrangeC-DetermineCompiler.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/PGI-DetermineCompiler.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/PathScale-DetermineCompiler.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/SCO-DetermineCompiler.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/SDCC-C-DetermineCompiler.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/SunPro-C-DetermineCompiler.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/TI-DetermineCompiler.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/TIClang-DetermineCompiler.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/Tasking-DetermineCompiler.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/TinyCC-C-DetermineCompiler.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/VisualAge-C-DetermineCompiler.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/IBMCPP-C-DetermineVersionInternal.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/Watcom-DetermineCompiler.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/XL-C-DetermineCompiler.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/IBMCPP-C-DetermineVersionInternal.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/XLClang-C-DetermineCompiler.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/zOS-C-DetermineCompiler.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/IBMCPP-C-DetermineVersionInternal.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeFindBinUtils.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/Clang-FindBinUtils.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeCCompiler.cmake.in" + }, + { + "isGenerated" : true, + "path" : "/Users/hamzaaleghwairyeen/development/App/Intaleq/android/app/.cxx/Debug/3p4b322x/armeabi-v7a/CMakeFiles/3.31.5-g6cf5163/CMakeCCompiler.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeDetermineCXXCompiler.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeDetermineCompiler.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Platform/Android-Determine-CXX.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Platform/Android/Determine-Compiler.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeDetermineCompilerId.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeCompilerIdDetection.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/ADSP-DetermineCompiler.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/ARMCC-DetermineCompiler.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/ARMClang-DetermineCompiler.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/AppleClang-DetermineCompiler.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/Clang-DetermineCompilerInternal.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/Borland-DetermineCompiler.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/Clang-DetermineCompiler.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/Clang-DetermineCompilerInternal.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/Compaq-CXX-DetermineCompiler.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/Cray-DetermineCompiler.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/CrayClang-DetermineCompiler.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/Embarcadero-DetermineCompiler.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/Fujitsu-DetermineCompiler.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/FujitsuClang-DetermineCompiler.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/GHS-DetermineCompiler.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/GNU-CXX-DetermineCompiler.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/HP-CXX-DetermineCompiler.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/IAR-DetermineCompiler.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/IBMClang-CXX-DetermineCompiler.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/Intel-DetermineCompiler.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/IntelLLVM-DetermineCompiler.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/LCC-CXX-DetermineCompiler.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/MSVC-DetermineCompiler.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/NVHPC-DetermineCompiler.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/NVIDIA-DetermineCompiler.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/OpenWatcom-DetermineCompiler.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/OrangeC-DetermineCompiler.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/PGI-DetermineCompiler.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/PathScale-DetermineCompiler.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/SCO-DetermineCompiler.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/SunPro-CXX-DetermineCompiler.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/TI-DetermineCompiler.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/TIClang-DetermineCompiler.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/Tasking-DetermineCompiler.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/VisualAge-CXX-DetermineCompiler.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/IBMCPP-CXX-DetermineVersionInternal.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/Watcom-DetermineCompiler.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/XL-CXX-DetermineCompiler.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/IBMCPP-CXX-DetermineVersionInternal.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/XLClang-CXX-DetermineCompiler.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/zOS-CXX-DetermineCompiler.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/IBMCPP-CXX-DetermineVersionInternal.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeFindBinUtils.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/Clang-FindBinUtils.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeCXXCompiler.cmake.in" + }, + { + "isGenerated" : true, + "path" : "/Users/hamzaaleghwairyeen/development/App/Intaleq/android/app/.cxx/Debug/3p4b322x/armeabi-v7a/CMakeFiles/3.31.5-g6cf5163/CMakeCXXCompiler.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeSystemSpecificInformation.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeGenericSystem.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeInitializeConfigs.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Platform/Android.cmake" + }, + { + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/build/cmake/hooks/pre/Android.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Platform/Linux.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Platform/UnixPaths.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeCInformation.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeLanguageInformation.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/Clang-C.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/Clang.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/CMakeCommonCompilerMacros.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/GNU.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/CMakeCommonCompilerMacros.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Platform/Android-Clang-C.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Platform/Android-Clang.cmake" + }, + { + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/build/cmake/hooks/pre/Android-Clang.cmake" + }, + { + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/build/cmake/flags.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeCommonLanguageInclude.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeTestCCompiler.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeTestCompilerCommon.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeDetermineCompilerABI.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Internal/CMakeDetermineLinkerId.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeParseImplicitIncludeInfo.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeParseImplicitLinkInfo.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeParseLibraryArchitecture.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeTestCompilerCommon.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeCCompilerABI.c" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeDetermineCompilerSupport.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Internal/FeatureTesting.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeCCompiler.cmake.in" + }, + { + "isGenerated" : true, + "path" : "/Users/hamzaaleghwairyeen/development/App/Intaleq/android/app/.cxx/Debug/3p4b322x/armeabi-v7a/CMakeFiles/3.31.5-g6cf5163/CMakeCCompiler.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Internal/CMakeCLinkerInformation.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Internal/CMakeCommonLinkerInformation.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Linker/LLD-C.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Linker/LLD.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Linker/GNU.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Platform/Linker/Android-LLD-C.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Platform/Linker/Linux-LLD-C.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Platform/Linker/Linux-LLD.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Platform/Linker/Linux-GNU.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Platform/Linker/GNU.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeCXXInformation.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeLanguageInformation.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/Clang-CXX.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/Clang.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Platform/Android-Clang-CXX.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Platform/Android-Clang.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeCommonLanguageInclude.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeTestCXXCompiler.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeTestCompilerCommon.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeDetermineCompilerABI.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Internal/CMakeDetermineLinkerId.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeParseImplicitIncludeInfo.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeParseImplicitLinkInfo.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeParseLibraryArchitecture.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeTestCompilerCommon.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeCXXCompilerABI.cpp" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeDetermineCompilerSupport.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Internal/FeatureTesting.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/Clang-CXX-CXXImportStd.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/Clang-CXX-CXXImportStd.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeCXXCompiler.cmake.in" + }, + { + "isGenerated" : true, + "path" : "/Users/hamzaaleghwairyeen/development/App/Intaleq/android/app/.cxx/Debug/3p4b322x/armeabi-v7a/CMakeFiles/3.31.5-g6cf5163/CMakeCXXCompiler.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Internal/CMakeCXXLinkerInformation.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Internal/CMakeCommonLinkerInformation.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Linker/LLD-CXX.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Linker/LLD.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Platform/Linker/Android-LLD-CXX.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Platform/Linker/Linux-LLD-CXX.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Platform/Linker/Linux-LLD.cmake" + } + ], + "kind" : "cmakeFiles", + "paths" : + { + "build" : "/Users/hamzaaleghwairyeen/development/App/Intaleq/android/app/.cxx/Debug/3p4b322x/armeabi-v7a", + "source" : "/Users/hamzaaleghwairyeen/development/App/Intaleq/android/app/src/main/cpp" + }, + "version" : + { + "major" : 1, + "minor" : 1 + } +} diff --git a/siro_rider/android/app/.cxx/Debug/3p4b322x/armeabi-v7a/.cmake/api/v1/reply/codemodel-v2-ba4c045041473ec094f3.json b/siro_rider/android/app/.cxx/Debug/3p4b322x/armeabi-v7a/.cmake/api/v1/reply/codemodel-v2-ba4c045041473ec094f3.json new file mode 100644 index 0000000..c480acb --- /dev/null +++ b/siro_rider/android/app/.cxx/Debug/3p4b322x/armeabi-v7a/.cmake/api/v1/reply/codemodel-v2-ba4c045041473ec094f3.json @@ -0,0 +1,60 @@ +{ + "configurations" : + [ + { + "directories" : + [ + { + "build" : ".", + "jsonFile" : "directory-.-Debug-f5ebdc15457944623624.json", + "minimumCMakeVersion" : + { + "string" : "3.6.0" + }, + "projectIndex" : 0, + "source" : ".", + "targetIndexes" : + [ + 0 + ] + } + ], + "name" : "Debug", + "projects" : + [ + { + "directoryIndexes" : + [ + 0 + ], + "name" : "intaleq", + "targetIndexes" : + [ + 0 + ] + } + ], + "targets" : + [ + { + "directoryIndex" : 0, + "id" : "native-lib::@6890427a1f51a3e7e1df", + "jsonFile" : "target-native-lib-Debug-e7984760091d45dea211.json", + "name" : "native-lib", + "projectIndex" : 0 + } + ] + } + ], + "kind" : "codemodel", + "paths" : + { + "build" : "/Users/hamzaaleghwairyeen/development/App/Intaleq/android/app/.cxx/Debug/3p4b322x/armeabi-v7a", + "source" : "/Users/hamzaaleghwairyeen/development/App/Intaleq/android/app/src/main/cpp" + }, + "version" : + { + "major" : 2, + "minor" : 7 + } +} diff --git a/siro_rider/android/app/.cxx/Debug/3p4b322x/armeabi-v7a/.cmake/api/v1/reply/directory-.-Debug-f5ebdc15457944623624.json b/siro_rider/android/app/.cxx/Debug/3p4b322x/armeabi-v7a/.cmake/api/v1/reply/directory-.-Debug-f5ebdc15457944623624.json new file mode 100644 index 0000000..3a67af9 --- /dev/null +++ b/siro_rider/android/app/.cxx/Debug/3p4b322x/armeabi-v7a/.cmake/api/v1/reply/directory-.-Debug-f5ebdc15457944623624.json @@ -0,0 +1,14 @@ +{ + "backtraceGraph" : + { + "commands" : [], + "files" : [], + "nodes" : [] + }, + "installers" : [], + "paths" : + { + "build" : ".", + "source" : "." + } +} diff --git a/siro_rider/android/app/.cxx/Debug/3p4b322x/armeabi-v7a/.cmake/api/v1/reply/index-2025-07-02T19-25-20-0983.json b/siro_rider/android/app/.cxx/Debug/3p4b322x/armeabi-v7a/.cmake/api/v1/reply/index-2025-07-02T19-25-20-0983.json new file mode 100644 index 0000000..a56f36e --- /dev/null +++ b/siro_rider/android/app/.cxx/Debug/3p4b322x/armeabi-v7a/.cmake/api/v1/reply/index-2025-07-02T19-25-20-0983.json @@ -0,0 +1,92 @@ +{ + "cmake" : + { + "generator" : + { + "multiConfig" : false, + "name" : "Ninja" + }, + "paths" : + { + "cmake" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/bin/cmake", + "cpack" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/bin/cpack", + "ctest" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/bin/ctest", + "root" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31" + }, + "version" : + { + "isDirty" : false, + "major" : 3, + "minor" : 31, + "patch" : 5, + "string" : "3.31.5-g6cf5163", + "suffix" : "g6cf5163" + } + }, + "objects" : + [ + { + "jsonFile" : "codemodel-v2-ba4c045041473ec094f3.json", + "kind" : "codemodel", + "version" : + { + "major" : 2, + "minor" : 7 + } + }, + { + "jsonFile" : "cache-v2-fbe345bef3a391426801.json", + "kind" : "cache", + "version" : + { + "major" : 2, + "minor" : 0 + } + }, + { + "jsonFile" : "cmakeFiles-v1-01669e876dc9f2bb8a18.json", + "kind" : "cmakeFiles", + "version" : + { + "major" : 1, + "minor" : 1 + } + } + ], + "reply" : + { + "client-agp" : + { + "cache-v2" : + { + "jsonFile" : "cache-v2-fbe345bef3a391426801.json", + "kind" : "cache", + "version" : + { + "major" : 2, + "minor" : 0 + } + }, + "cmakeFiles-v1" : + { + "jsonFile" : "cmakeFiles-v1-01669e876dc9f2bb8a18.json", + "kind" : "cmakeFiles", + "version" : + { + "major" : 1, + "minor" : 1 + } + }, + "codemodel-v2" : + { + "jsonFile" : "codemodel-v2-ba4c045041473ec094f3.json", + "kind" : "codemodel", + "version" : + { + "major" : 2, + "minor" : 7 + } + } + } + } +} diff --git a/siro_rider/android/app/.cxx/Debug/3p4b322x/armeabi-v7a/.cmake/api/v1/reply/target-native-lib-Debug-e7984760091d45dea211.json b/siro_rider/android/app/.cxx/Debug/3p4b322x/armeabi-v7a/.cmake/api/v1/reply/target-native-lib-Debug-e7984760091d45dea211.json new file mode 100644 index 0000000..a15dfad --- /dev/null +++ b/siro_rider/android/app/.cxx/Debug/3p4b322x/armeabi-v7a/.cmake/api/v1/reply/target-native-lib-Debug-e7984760091d45dea211.json @@ -0,0 +1,117 @@ +{ + "artifacts" : + [ + { + "path" : "/Users/hamzaaleghwairyeen/development/App/Intaleq/build/app/intermediates/cxx/Debug/3p4b322x/obj/armeabi-v7a/libnative-lib.so" + } + ], + "backtrace" : 1, + "backtraceGraph" : + { + "commands" : + [ + "add_library", + "target_link_libraries" + ], + "files" : + [ + "CMakeLists.txt" + ], + "nodes" : + [ + { + "file" : 0 + }, + { + "command" : 0, + "file" : 0, + "line" : 4, + "parent" : 0 + }, + { + "command" : 1, + "file" : 0, + "line" : 8, + "parent" : 0 + } + ] + }, + "compileGroups" : + [ + { + "compileCommandFragments" : + [ + { + "fragment" : "-g -DANDROID -fdata-sections -ffunction-sections -funwind-tables -fstack-protector-strong -no-canonical-prefixes -D_FORTIFY_SOURCE=2 -march=armv7-a -mthumb -Wformat -Werror=format-security -fno-limit-debug-info -fPIC" + } + ], + "defines" : + [ + { + "define" : "native_lib_EXPORTS" + } + ], + "language" : "CXX", + "sourceIndexes" : + [ + 0 + ], + "sysroot" : + { + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot" + } + } + ], + "id" : "native-lib::@6890427a1f51a3e7e1df", + "link" : + { + "commandFragments" : + [ + { + "fragment" : "-static-libstdc++ -Wl,--build-id=sha1 -Wl,--no-rosegment -Wl,--no-undefined-version -Wl,--fatal-warnings -Wl,--no-undefined -Qunused-arguments", + "role" : "flags" + }, + { + "backtrace" : 2, + "fragment" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/lib/arm-linux-androideabi/23/liblog.so", + "role" : "libraries" + }, + { + "fragment" : "-latomic -lm", + "role" : "libraries" + } + ], + "language" : "CXX", + "sysroot" : + { + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot" + } + }, + "name" : "native-lib", + "nameOnDisk" : "libnative-lib.so", + "paths" : + { + "build" : ".", + "source" : "." + }, + "sourceGroups" : + [ + { + "name" : "Source Files", + "sourceIndexes" : + [ + 0 + ] + } + ], + "sources" : + [ + { + "backtrace" : 1, + "compileGroupIndex" : 0, + "path" : "native-lib.cpp", + "sourceGroupIndex" : 0 + } + ], + "type" : "SHARED_LIBRARY" +} diff --git a/siro_rider/android/app/.cxx/Debug/3p4b322x/armeabi-v7a/.ninja_deps b/siro_rider/android/app/.cxx/Debug/3p4b322x/armeabi-v7a/.ninja_deps new file mode 100644 index 0000000..5bbd6da Binary files /dev/null and b/siro_rider/android/app/.cxx/Debug/3p4b322x/armeabi-v7a/.ninja_deps differ diff --git a/siro_rider/android/app/.cxx/Debug/3p4b322x/armeabi-v7a/.ninja_log b/siro_rider/android/app/.cxx/Debug/3p4b322x/armeabi-v7a/.ninja_log new file mode 100644 index 0000000..e0ea370 --- /dev/null +++ b/siro_rider/android/app/.cxx/Debug/3p4b322x/armeabi-v7a/.ninja_log @@ -0,0 +1,7 @@ +# ninja log v5 +0 725 1751484322438023253 CMakeFiles/native-lib.dir/native-lib.cpp.o 7f1824e62d739897 +728 785 1751484322499860124 /Users/hamzaaleghwairyeen/development/App/Intaleq/build/app/intermediates/cxx/Debug/3p4b322x/obj/armeabi-v7a/libnative-lib.so 6c85a5aae8eaedc8 +22 1350 1751485308968356471 CMakeFiles/native-lib.dir/native-lib.cpp.o 7f1824e62d739897 +1352 1512 1751485309131279041 /Users/hamzaaleghwairyeen/development/App/Intaleq/build/app/intermediates/cxx/Debug/3p4b322x/obj/armeabi-v7a/libnative-lib.so 6c85a5aae8eaedc8 +14 1109 1751490329273985507 /Users/hamzaaleghwairyeen/development/App/Intaleq/build/app/intermediates/cxx/Debug/3p4b322x/obj/armeabi-v7a/libnative-lib.so 6c85a5aae8eaedc8 +10 226 1752227573978622280 /Users/hamzaaleghwairyeen/development/App/Intaleq/build/app/intermediates/cxx/Debug/3p4b322x/obj/armeabi-v7a/libnative-lib.so 6c85a5aae8eaedc8 diff --git a/siro_rider/android/app/.cxx/Debug/3p4b322x/armeabi-v7a/CMakeCache.txt b/siro_rider/android/app/.cxx/Debug/3p4b322x/armeabi-v7a/CMakeCache.txt new file mode 100644 index 0000000..3f5bfd9 --- /dev/null +++ b/siro_rider/android/app/.cxx/Debug/3p4b322x/armeabi-v7a/CMakeCache.txt @@ -0,0 +1,430 @@ +# This is the CMakeCache file. +# For build in directory: /Users/hamzaaleghwairyeen/development/App/Intaleq/android/app/.cxx/Debug/3p4b322x/armeabi-v7a +# It was generated by CMake: /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/bin/cmake +# You can edit this file to change values found and used by cmake. +# If you do not want to change any of the values, simply exit the editor. +# If you do want to change a value, simply edit, save, and exit the editor. +# The syntax for the file is as follows: +# KEY:TYPE=VALUE +# KEY is the name of a variable in the cache. +# TYPE is a hint to GUIs for the type of VALUE, DO NOT EDIT TYPE!. +# VALUE is the current value for the KEY. + +######################## +# EXTERNAL cache entries +######################## + +//No help, variable specified on the command line. +ANDROID_ABI:UNINITIALIZED=armeabi-v7a + +//No help, variable specified on the command line. +ANDROID_NDK:UNINITIALIZED=/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973 + +//No help, variable specified on the command line. +ANDROID_PLATFORM:UNINITIALIZED=android-23 + +//Path to a program. +CMAKE_ADDR2LINE:FILEPATH=/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/bin/llvm-addr2line + +//No help, variable specified on the command line. +CMAKE_ANDROID_ARCH_ABI:UNINITIALIZED=armeabi-v7a + +//No help, variable specified on the command line. +CMAKE_ANDROID_NDK:UNINITIALIZED=/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973 + +//Archiver +CMAKE_AR:FILEPATH=/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/bin/llvm-ar + +//Flags used by the compiler during all build types. +CMAKE_ASM_FLAGS:STRING= + +//Flags used by the compiler during debug builds. +CMAKE_ASM_FLAGS_DEBUG:STRING= + +//Flags used by the compiler during release builds. +CMAKE_ASM_FLAGS_RELEASE:STRING= + +//Choose the type of build, options are: None Debug Release RelWithDebInfo +// MinSizeRel ... +CMAKE_BUILD_TYPE:STRING=Debug + +//LLVM archiver +CMAKE_CXX_COMPILER_AR:FILEPATH=/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/bin/llvm-ar + +//`clang-scan-deps` dependency scanner +CMAKE_CXX_COMPILER_CLANG_SCAN_DEPS:FILEPATH=/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/bin/clang-scan-deps + +//Generate index for LLVM archive +CMAKE_CXX_COMPILER_RANLIB:FILEPATH=/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/bin/llvm-ranlib + +//Flags used by the compiler during all build types. +CMAKE_CXX_FLAGS:STRING= + +//Flags used by the compiler during debug builds. +CMAKE_CXX_FLAGS_DEBUG:STRING= + +//Flags used by the CXX compiler during MINSIZEREL builds. +CMAKE_CXX_FLAGS_MINSIZEREL:STRING=-Os -DNDEBUG + +//Flags used by the compiler during release builds. +CMAKE_CXX_FLAGS_RELEASE:STRING= + +//Flags used by the CXX compiler during RELWITHDEBINFO builds. +CMAKE_CXX_FLAGS_RELWITHDEBINFO:STRING=-O2 -g -DNDEBUG + +//Libraries linked by default with all C++ applications. +CMAKE_CXX_STANDARD_LIBRARIES:STRING=-latomic -lm + +//LLVM archiver +CMAKE_C_COMPILER_AR:FILEPATH=/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/bin/llvm-ar + +//`clang-scan-deps` dependency scanner +CMAKE_C_COMPILER_CLANG_SCAN_DEPS:FILEPATH=/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/bin/clang-scan-deps + +//Generate index for LLVM archive +CMAKE_C_COMPILER_RANLIB:FILEPATH=/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/bin/llvm-ranlib + +//Flags used by the compiler during all build types. +CMAKE_C_FLAGS:STRING= + +//Flags used by the compiler during debug builds. +CMAKE_C_FLAGS_DEBUG:STRING= + +//Flags used by the C compiler during MINSIZEREL builds. +CMAKE_C_FLAGS_MINSIZEREL:STRING=-Os -DNDEBUG + +//Flags used by the compiler during release builds. +CMAKE_C_FLAGS_RELEASE:STRING= + +//Flags used by the C compiler during RELWITHDEBINFO builds. +CMAKE_C_FLAGS_RELWITHDEBINFO:STRING=-O2 -g -DNDEBUG + +//Libraries linked by default with all C applications. +CMAKE_C_STANDARD_LIBRARIES:STRING=-latomic -lm + +//Path to a program. +CMAKE_DLLTOOL:FILEPATH=/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/bin/llvm-dlltool + +//Flags used by the linker. +CMAKE_EXE_LINKER_FLAGS:STRING= + +//Flags used by the linker during DEBUG builds. +CMAKE_EXE_LINKER_FLAGS_DEBUG:STRING= + +//Flags used by the linker during MINSIZEREL builds. +CMAKE_EXE_LINKER_FLAGS_MINSIZEREL:STRING= + +//Flags used by the linker during RELEASE builds. +CMAKE_EXE_LINKER_FLAGS_RELEASE:STRING= + +//Flags used by the linker during RELWITHDEBINFO builds. +CMAKE_EXE_LINKER_FLAGS_RELWITHDEBINFO:STRING= + +//Enable/Disable output of build database during the build. +CMAKE_EXPORT_BUILD_DATABASE:BOOL= + +//No help, variable specified on the command line. +CMAKE_EXPORT_COMPILE_COMMANDS:UNINITIALIZED=ON + +//Value Computed by CMake. +CMAKE_FIND_PACKAGE_REDIRECTS_DIR:STATIC=/Users/hamzaaleghwairyeen/development/App/Intaleq/android/app/.cxx/Debug/3p4b322x/armeabi-v7a/CMakeFiles/pkgRedirects + +//Install path prefix, prepended onto install directories. +CMAKE_INSTALL_PREFIX:PATH=/usr/local + +//No help, variable specified on the command line. +CMAKE_LIBRARY_OUTPUT_DIRECTORY:UNINITIALIZED=/Users/hamzaaleghwairyeen/development/App/Intaleq/build/app/intermediates/cxx/Debug/3p4b322x/obj/armeabi-v7a + +//Path to a program. +CMAKE_LINKER:FILEPATH=/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/bin/ld.lld + +//No help, variable specified on the command line. +CMAKE_MAKE_PROGRAM:UNINITIALIZED=/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/bin/ninja + +//Flags used by the linker during the creation of modules. +CMAKE_MODULE_LINKER_FLAGS:STRING= + +//Flags used by the linker during the creation of modules during +// DEBUG builds. +CMAKE_MODULE_LINKER_FLAGS_DEBUG:STRING= + +//Flags used by the linker during the creation of modules during +// MINSIZEREL builds. +CMAKE_MODULE_LINKER_FLAGS_MINSIZEREL:STRING= + +//Flags used by the linker during the creation of modules during +// RELEASE builds. +CMAKE_MODULE_LINKER_FLAGS_RELEASE:STRING= + +//Flags used by the linker during the creation of modules during +// RELWITHDEBINFO builds. +CMAKE_MODULE_LINKER_FLAGS_RELWITHDEBINFO:STRING= + +//Path to a program. +CMAKE_NM:FILEPATH=/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/bin/llvm-nm + +//Path to a program. +CMAKE_OBJCOPY:FILEPATH=/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/bin/llvm-objcopy + +//Path to a program. +CMAKE_OBJDUMP:FILEPATH=/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/bin/llvm-objdump + +//Value Computed by CMake +CMAKE_PROJECT_DESCRIPTION:STATIC= + +//Value Computed by CMake +CMAKE_PROJECT_HOMEPAGE_URL:STATIC= + +//Value Computed by CMake +CMAKE_PROJECT_NAME:STATIC=intaleq + +//Ranlib +CMAKE_RANLIB:FILEPATH=/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/bin/llvm-ranlib + +//Path to a program. +CMAKE_READELF:FILEPATH=/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/bin/llvm-readelf + +//No help, variable specified on the command line. +CMAKE_RUNTIME_OUTPUT_DIRECTORY:UNINITIALIZED=/Users/hamzaaleghwairyeen/development/App/Intaleq/build/app/intermediates/cxx/Debug/3p4b322x/obj/armeabi-v7a + +//Flags used by the linker during the creation of dll's. +CMAKE_SHARED_LINKER_FLAGS:STRING= + +//Flags used by the linker during the creation of shared libraries +// during DEBUG builds. +CMAKE_SHARED_LINKER_FLAGS_DEBUG:STRING= + +//Flags used by the linker during the creation of shared libraries +// during MINSIZEREL builds. +CMAKE_SHARED_LINKER_FLAGS_MINSIZEREL:STRING= + +//Flags used by the linker during the creation of shared libraries +// during RELEASE builds. +CMAKE_SHARED_LINKER_FLAGS_RELEASE:STRING= + +//Flags used by the linker during the creation of shared libraries +// during RELWITHDEBINFO builds. +CMAKE_SHARED_LINKER_FLAGS_RELWITHDEBINFO:STRING= + +//If set, runtime paths are not added when installing shared libraries, +// but are added when building. +CMAKE_SKIP_INSTALL_RPATH:BOOL=NO + +//If set, runtime paths are not added when using shared libraries. +CMAKE_SKIP_RPATH:BOOL=NO + +//Flags used by the linker during the creation of static libraries +// during all build types. +CMAKE_STATIC_LINKER_FLAGS:STRING= + +//Flags used by the linker during the creation of static libraries +// during DEBUG builds. +CMAKE_STATIC_LINKER_FLAGS_DEBUG:STRING= + +//Flags used by the linker during the creation of static libraries +// during MINSIZEREL builds. +CMAKE_STATIC_LINKER_FLAGS_MINSIZEREL:STRING= + +//Flags used by the linker during the creation of static libraries +// during RELEASE builds. +CMAKE_STATIC_LINKER_FLAGS_RELEASE:STRING= + +//Flags used by the linker during the creation of static libraries +// during RELWITHDEBINFO builds. +CMAKE_STATIC_LINKER_FLAGS_RELWITHDEBINFO:STRING= + +//Strip +CMAKE_STRIP:FILEPATH=/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/bin/llvm-strip + +//No help, variable specified on the command line. +CMAKE_SYSTEM_NAME:UNINITIALIZED=Android + +//No help, variable specified on the command line. +CMAKE_SYSTEM_VERSION:UNINITIALIZED=23 + +//Path to a program. +CMAKE_TAPI:FILEPATH=CMAKE_TAPI-NOTFOUND + +//The CMake toolchain file +CMAKE_TOOLCHAIN_FILE:FILEPATH=/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/build/cmake/android.toolchain.cmake + +//If this value is on, makefiles will be generated without the +// .SILENT directive, and all commands will be echoed to the console +// during the make. This is useful for debugging only. With Visual +// Studio IDE projects all commands are done without /nologo. +CMAKE_VERBOSE_MAKEFILE:BOOL=FALSE + +//Value Computed by CMake +intaleq_BINARY_DIR:STATIC=/Users/hamzaaleghwairyeen/development/App/Intaleq/android/app/.cxx/Debug/3p4b322x/armeabi-v7a + +//Value Computed by CMake +intaleq_IS_TOP_LEVEL:STATIC=ON + +//Value Computed by CMake +intaleq_SOURCE_DIR:STATIC=/Users/hamzaaleghwairyeen/development/App/Intaleq/android/app/src/main/cpp + +//Path to a library. +log-lib:FILEPATH=/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/lib/arm-linux-androideabi/23/liblog.so + +//Dependencies for the target +native-lib_LIB_DEPENDS:STATIC=general;/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/lib/arm-linux-androideabi/23/liblog.so; + + +######################## +# INTERNAL cache entries +######################## + +//ADVANCED property for variable: CMAKE_ADDR2LINE +CMAKE_ADDR2LINE-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_AR +CMAKE_AR-ADVANCED:INTERNAL=1 +//This is the directory where this CMakeCache.txt was created +CMAKE_CACHEFILE_DIR:INTERNAL=/Users/hamzaaleghwairyeen/development/App/Intaleq/android/app/.cxx/Debug/3p4b322x/armeabi-v7a +//Major version of cmake used to create the current loaded cache +CMAKE_CACHE_MAJOR_VERSION:INTERNAL=3 +//Minor version of cmake used to create the current loaded cache +CMAKE_CACHE_MINOR_VERSION:INTERNAL=31 +//Patch version of cmake used to create the current loaded cache +CMAKE_CACHE_PATCH_VERSION:INTERNAL=5 +//Path to CMake executable. +CMAKE_COMMAND:INTERNAL=/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/bin/cmake +//Path to cpack program executable. +CMAKE_CPACK_COMMAND:INTERNAL=/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/bin/cpack +//Path to ctest program executable. +CMAKE_CTEST_COMMAND:INTERNAL=/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/bin/ctest +//ADVANCED property for variable: CMAKE_CXX_COMPILER_AR +CMAKE_CXX_COMPILER_AR-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_CXX_COMPILER_CLANG_SCAN_DEPS +CMAKE_CXX_COMPILER_CLANG_SCAN_DEPS-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_CXX_COMPILER_RANLIB +CMAKE_CXX_COMPILER_RANLIB-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_CXX_FLAGS +CMAKE_CXX_FLAGS-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_CXX_FLAGS_DEBUG +CMAKE_CXX_FLAGS_DEBUG-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_CXX_FLAGS_MINSIZEREL +CMAKE_CXX_FLAGS_MINSIZEREL-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_CXX_FLAGS_RELEASE +CMAKE_CXX_FLAGS_RELEASE-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_CXX_FLAGS_RELWITHDEBINFO +CMAKE_CXX_FLAGS_RELWITHDEBINFO-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_CXX_STANDARD_LIBRARIES +CMAKE_CXX_STANDARD_LIBRARIES-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_C_COMPILER_AR +CMAKE_C_COMPILER_AR-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_C_COMPILER_CLANG_SCAN_DEPS +CMAKE_C_COMPILER_CLANG_SCAN_DEPS-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_C_COMPILER_RANLIB +CMAKE_C_COMPILER_RANLIB-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_C_FLAGS +CMAKE_C_FLAGS-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_C_FLAGS_DEBUG +CMAKE_C_FLAGS_DEBUG-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_C_FLAGS_MINSIZEREL +CMAKE_C_FLAGS_MINSIZEREL-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_C_FLAGS_RELEASE +CMAKE_C_FLAGS_RELEASE-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_C_FLAGS_RELWITHDEBINFO +CMAKE_C_FLAGS_RELWITHDEBINFO-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_C_STANDARD_LIBRARIES +CMAKE_C_STANDARD_LIBRARIES-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_DLLTOOL +CMAKE_DLLTOOL-ADVANCED:INTERNAL=1 +//Path to cache edit program executable. +CMAKE_EDIT_COMMAND:INTERNAL=/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/bin/ccmake +//Executable file format +CMAKE_EXECUTABLE_FORMAT:INTERNAL=ELF +//ADVANCED property for variable: CMAKE_EXE_LINKER_FLAGS +CMAKE_EXE_LINKER_FLAGS-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_EXE_LINKER_FLAGS_DEBUG +CMAKE_EXE_LINKER_FLAGS_DEBUG-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_EXE_LINKER_FLAGS_MINSIZEREL +CMAKE_EXE_LINKER_FLAGS_MINSIZEREL-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_EXE_LINKER_FLAGS_RELEASE +CMAKE_EXE_LINKER_FLAGS_RELEASE-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_EXE_LINKER_FLAGS_RELWITHDEBINFO +CMAKE_EXE_LINKER_FLAGS_RELWITHDEBINFO-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_EXPORT_BUILD_DATABASE +CMAKE_EXPORT_BUILD_DATABASE-ADVANCED:INTERNAL=1 +//Name of external makefile project generator. +CMAKE_EXTRA_GENERATOR:INTERNAL= +//Name of generator. +CMAKE_GENERATOR:INTERNAL=Ninja +//Generator instance identifier. +CMAKE_GENERATOR_INSTANCE:INTERNAL= +//Name of generator platform. +CMAKE_GENERATOR_PLATFORM:INTERNAL= +//Name of generator toolset. +CMAKE_GENERATOR_TOOLSET:INTERNAL= +//Source directory with the top level CMakeLists.txt file for this +// project +CMAKE_HOME_DIRECTORY:INTERNAL=/Users/hamzaaleghwairyeen/development/App/Intaleq/android/app/src/main/cpp +//Install .so files without execute permission. +CMAKE_INSTALL_SO_NO_EXE:INTERNAL=0 +//ADVANCED property for variable: CMAKE_LINKER +CMAKE_LINKER-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_MODULE_LINKER_FLAGS +CMAKE_MODULE_LINKER_FLAGS-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_MODULE_LINKER_FLAGS_DEBUG +CMAKE_MODULE_LINKER_FLAGS_DEBUG-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_MODULE_LINKER_FLAGS_MINSIZEREL +CMAKE_MODULE_LINKER_FLAGS_MINSIZEREL-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_MODULE_LINKER_FLAGS_RELEASE +CMAKE_MODULE_LINKER_FLAGS_RELEASE-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_MODULE_LINKER_FLAGS_RELWITHDEBINFO +CMAKE_MODULE_LINKER_FLAGS_RELWITHDEBINFO-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_NM +CMAKE_NM-ADVANCED:INTERNAL=1 +//number of local generators +CMAKE_NUMBER_OF_MAKEFILES:INTERNAL=1 +//ADVANCED property for variable: CMAKE_OBJCOPY +CMAKE_OBJCOPY-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_OBJDUMP +CMAKE_OBJDUMP-ADVANCED:INTERNAL=1 +//Platform information initialized +CMAKE_PLATFORM_INFO_INITIALIZED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_RANLIB +CMAKE_RANLIB-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_READELF +CMAKE_READELF-ADVANCED:INTERNAL=1 +//Path to CMake installation. +CMAKE_ROOT:INTERNAL=/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31 +//ADVANCED property for variable: CMAKE_SHARED_LINKER_FLAGS +CMAKE_SHARED_LINKER_FLAGS-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_SHARED_LINKER_FLAGS_DEBUG +CMAKE_SHARED_LINKER_FLAGS_DEBUG-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_SHARED_LINKER_FLAGS_MINSIZEREL +CMAKE_SHARED_LINKER_FLAGS_MINSIZEREL-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_SHARED_LINKER_FLAGS_RELEASE +CMAKE_SHARED_LINKER_FLAGS_RELEASE-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_SHARED_LINKER_FLAGS_RELWITHDEBINFO +CMAKE_SHARED_LINKER_FLAGS_RELWITHDEBINFO-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_SKIP_INSTALL_RPATH +CMAKE_SKIP_INSTALL_RPATH-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_SKIP_RPATH +CMAKE_SKIP_RPATH-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_STATIC_LINKER_FLAGS +CMAKE_STATIC_LINKER_FLAGS-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_STATIC_LINKER_FLAGS_DEBUG +CMAKE_STATIC_LINKER_FLAGS_DEBUG-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_STATIC_LINKER_FLAGS_MINSIZEREL +CMAKE_STATIC_LINKER_FLAGS_MINSIZEREL-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_STATIC_LINKER_FLAGS_RELEASE +CMAKE_STATIC_LINKER_FLAGS_RELEASE-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_STATIC_LINKER_FLAGS_RELWITHDEBINFO +CMAKE_STATIC_LINKER_FLAGS_RELWITHDEBINFO-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_STRIP +CMAKE_STRIP-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_TAPI +CMAKE_TAPI-ADVANCED:INTERNAL=1 +//uname command +CMAKE_UNAME:INTERNAL=/usr/bin/uname +//ADVANCED property for variable: CMAKE_VERBOSE_MAKEFILE +CMAKE_VERBOSE_MAKEFILE-ADVANCED:INTERNAL=1 +//linker supports push/pop state +_CMAKE_CXX_LINKER_PUSHPOP_STATE_SUPPORTED:INTERNAL=TRUE +//linker supports push/pop state +_CMAKE_C_LINKER_PUSHPOP_STATE_SUPPORTED:INTERNAL=TRUE +//linker supports push/pop state +_CMAKE_LINKER_PUSHPOP_STATE_SUPPORTED:INTERNAL=TRUE + diff --git a/siro_rider/android/app/.cxx/Debug/3p4b322x/armeabi-v7a/CMakeFiles/3.31.5-g6cf5163/CMakeCCompiler.cmake b/siro_rider/android/app/.cxx/Debug/3p4b322x/armeabi-v7a/CMakeFiles/3.31.5-g6cf5163/CMakeCCompiler.cmake new file mode 100644 index 0000000..48d6a82 --- /dev/null +++ b/siro_rider/android/app/.cxx/Debug/3p4b322x/armeabi-v7a/CMakeFiles/3.31.5-g6cf5163/CMakeCCompiler.cmake @@ -0,0 +1,81 @@ +set(CMAKE_C_COMPILER "/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/bin/clang") +set(CMAKE_C_COMPILER_ARG1 "") +set(CMAKE_C_COMPILER_ID "Clang") +set(CMAKE_C_COMPILER_VERSION "18.0.1") +set(CMAKE_C_COMPILER_VERSION_INTERNAL "") +set(CMAKE_C_COMPILER_WRAPPER "") +set(CMAKE_C_STANDARD_COMPUTED_DEFAULT "17") +set(CMAKE_C_EXTENSIONS_COMPUTED_DEFAULT "ON") +set(CMAKE_C_STANDARD_LATEST "23") +set(CMAKE_C_COMPILE_FEATURES "c_std_90;c_function_prototypes;c_std_99;c_restrict;c_variadic_macros;c_std_11;c_static_assert;c_std_17;c_std_23") +set(CMAKE_C90_COMPILE_FEATURES "c_std_90;c_function_prototypes") +set(CMAKE_C99_COMPILE_FEATURES "c_std_99;c_restrict;c_variadic_macros") +set(CMAKE_C11_COMPILE_FEATURES "c_std_11;c_static_assert") +set(CMAKE_C17_COMPILE_FEATURES "c_std_17") +set(CMAKE_C23_COMPILE_FEATURES "c_std_23") + +set(CMAKE_C_PLATFORM_ID "Linux") +set(CMAKE_C_SIMULATE_ID "") +set(CMAKE_C_COMPILER_FRONTEND_VARIANT "GNU") +set(CMAKE_C_SIMULATE_VERSION "") + + + + +set(CMAKE_AR "/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/bin/llvm-ar") +set(CMAKE_C_COMPILER_AR "/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/bin/llvm-ar") +set(CMAKE_RANLIB "/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/bin/llvm-ranlib") +set(CMAKE_C_COMPILER_RANLIB "/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/bin/llvm-ranlib") +set(CMAKE_LINKER "/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/bin/ld.lld") +set(CMAKE_LINKER_LINK "") +set(CMAKE_LINKER_LLD "") +set(CMAKE_C_COMPILER_LINKER "/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/bin/ld.lld") +set(CMAKE_C_COMPILER_LINKER_ID "LLD") +set(CMAKE_C_COMPILER_LINKER_VERSION 18.0.1) +set(CMAKE_C_COMPILER_LINKER_FRONTEND_VARIANT GNU) +set(CMAKE_MT "") +set(CMAKE_TAPI "CMAKE_TAPI-NOTFOUND") +set(CMAKE_COMPILER_IS_GNUCC ) +set(CMAKE_C_COMPILER_LOADED 1) +set(CMAKE_C_COMPILER_WORKS TRUE) +set(CMAKE_C_ABI_COMPILED TRUE) + +set(CMAKE_C_COMPILER_ENV_VAR "CC") + +set(CMAKE_C_COMPILER_ID_RUN 1) +set(CMAKE_C_SOURCE_FILE_EXTENSIONS c;m) +set(CMAKE_C_IGNORE_EXTENSIONS h;H;o;O;obj;OBJ;def;DEF;rc;RC) +set(CMAKE_C_LINKER_PREFERENCE 10) +set(CMAKE_C_LINKER_DEPFILE_SUPPORTED ) + +# Save compiler ABI information. +set(CMAKE_C_SIZEOF_DATA_PTR "4") +set(CMAKE_C_COMPILER_ABI "ELF") +set(CMAKE_C_BYTE_ORDER "LITTLE_ENDIAN") +set(CMAKE_C_LIBRARY_ARCHITECTURE "arm-linux-androideabi") + +if(CMAKE_C_SIZEOF_DATA_PTR) + set(CMAKE_SIZEOF_VOID_P "${CMAKE_C_SIZEOF_DATA_PTR}") +endif() + +if(CMAKE_C_COMPILER_ABI) + set(CMAKE_INTERNAL_PLATFORM_ABI "${CMAKE_C_COMPILER_ABI}") +endif() + +if(CMAKE_C_LIBRARY_ARCHITECTURE) + set(CMAKE_LIBRARY_ARCHITECTURE "arm-linux-androideabi") +endif() + +set(CMAKE_C_CL_SHOWINCLUDES_PREFIX "") +if(CMAKE_C_CL_SHOWINCLUDES_PREFIX) + set(CMAKE_CL_SHOWINCLUDES_PREFIX "${CMAKE_C_CL_SHOWINCLUDES_PREFIX}") +endif() + + + + + +set(CMAKE_C_IMPLICIT_INCLUDE_DIRECTORIES "/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/lib/clang/18/include;/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/include/arm-linux-androideabi;/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/include") +set(CMAKE_C_IMPLICIT_LINK_LIBRARIES "-l:libunwind.a;dl;c;-l:libunwind.a;dl") +set(CMAKE_C_IMPLICIT_LINK_DIRECTORIES "/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/lib/clang/18/lib/linux/arm;/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/lib/arm-linux-androideabi/23;/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/lib/arm-linux-androideabi;/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/lib") +set(CMAKE_C_IMPLICIT_LINK_FRAMEWORK_DIRECTORIES "") diff --git a/siro_rider/android/app/.cxx/Debug/3p4b322x/armeabi-v7a/CMakeFiles/3.31.5-g6cf5163/CMakeCXXCompiler.cmake b/siro_rider/android/app/.cxx/Debug/3p4b322x/armeabi-v7a/CMakeFiles/3.31.5-g6cf5163/CMakeCXXCompiler.cmake new file mode 100644 index 0000000..36605bb --- /dev/null +++ b/siro_rider/android/app/.cxx/Debug/3p4b322x/armeabi-v7a/CMakeFiles/3.31.5-g6cf5163/CMakeCXXCompiler.cmake @@ -0,0 +1,105 @@ +set(CMAKE_CXX_COMPILER "/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/bin/clang++") +set(CMAKE_CXX_COMPILER_ARG1 "") +set(CMAKE_CXX_COMPILER_ID "Clang") +set(CMAKE_CXX_COMPILER_VERSION "18.0.1") +set(CMAKE_CXX_COMPILER_VERSION_INTERNAL "") +set(CMAKE_CXX_COMPILER_WRAPPER "") +set(CMAKE_CXX_STANDARD_COMPUTED_DEFAULT "17") +set(CMAKE_CXX_EXTENSIONS_COMPUTED_DEFAULT "ON") +set(CMAKE_CXX_STANDARD_LATEST "26") +set(CMAKE_CXX_COMPILE_FEATURES "cxx_std_98;cxx_template_template_parameters;cxx_std_11;cxx_alias_templates;cxx_alignas;cxx_alignof;cxx_attributes;cxx_auto_type;cxx_constexpr;cxx_decltype;cxx_decltype_incomplete_return_types;cxx_default_function_template_args;cxx_defaulted_functions;cxx_defaulted_move_initializers;cxx_delegating_constructors;cxx_deleted_functions;cxx_enum_forward_declarations;cxx_explicit_conversions;cxx_extended_friend_declarations;cxx_extern_templates;cxx_final;cxx_func_identifier;cxx_generalized_initializers;cxx_inheriting_constructors;cxx_inline_namespaces;cxx_lambdas;cxx_local_type_template_args;cxx_long_long_type;cxx_noexcept;cxx_nonstatic_member_init;cxx_nullptr;cxx_override;cxx_range_for;cxx_raw_string_literals;cxx_reference_qualified_functions;cxx_right_angle_brackets;cxx_rvalue_references;cxx_sizeof_member;cxx_static_assert;cxx_strong_enums;cxx_thread_local;cxx_trailing_return_types;cxx_unicode_literals;cxx_uniform_initialization;cxx_unrestricted_unions;cxx_user_literals;cxx_variadic_macros;cxx_variadic_templates;cxx_std_14;cxx_aggregate_default_initializers;cxx_attribute_deprecated;cxx_binary_literals;cxx_contextual_conversions;cxx_decltype_auto;cxx_digit_separators;cxx_generic_lambdas;cxx_lambda_init_captures;cxx_relaxed_constexpr;cxx_return_type_deduction;cxx_variable_templates;cxx_std_17;cxx_std_20;cxx_std_23;cxx_std_26") +set(CMAKE_CXX98_COMPILE_FEATURES "cxx_std_98;cxx_template_template_parameters") +set(CMAKE_CXX11_COMPILE_FEATURES "cxx_std_11;cxx_alias_templates;cxx_alignas;cxx_alignof;cxx_attributes;cxx_auto_type;cxx_constexpr;cxx_decltype;cxx_decltype_incomplete_return_types;cxx_default_function_template_args;cxx_defaulted_functions;cxx_defaulted_move_initializers;cxx_delegating_constructors;cxx_deleted_functions;cxx_enum_forward_declarations;cxx_explicit_conversions;cxx_extended_friend_declarations;cxx_extern_templates;cxx_final;cxx_func_identifier;cxx_generalized_initializers;cxx_inheriting_constructors;cxx_inline_namespaces;cxx_lambdas;cxx_local_type_template_args;cxx_long_long_type;cxx_noexcept;cxx_nonstatic_member_init;cxx_nullptr;cxx_override;cxx_range_for;cxx_raw_string_literals;cxx_reference_qualified_functions;cxx_right_angle_brackets;cxx_rvalue_references;cxx_sizeof_member;cxx_static_assert;cxx_strong_enums;cxx_thread_local;cxx_trailing_return_types;cxx_unicode_literals;cxx_uniform_initialization;cxx_unrestricted_unions;cxx_user_literals;cxx_variadic_macros;cxx_variadic_templates") +set(CMAKE_CXX14_COMPILE_FEATURES "cxx_std_14;cxx_aggregate_default_initializers;cxx_attribute_deprecated;cxx_binary_literals;cxx_contextual_conversions;cxx_decltype_auto;cxx_digit_separators;cxx_generic_lambdas;cxx_lambda_init_captures;cxx_relaxed_constexpr;cxx_return_type_deduction;cxx_variable_templates") +set(CMAKE_CXX17_COMPILE_FEATURES "cxx_std_17") +set(CMAKE_CXX20_COMPILE_FEATURES "cxx_std_20") +set(CMAKE_CXX23_COMPILE_FEATURES "cxx_std_23") +set(CMAKE_CXX26_COMPILE_FEATURES "cxx_std_26") + +set(CMAKE_CXX_PLATFORM_ID "Linux") +set(CMAKE_CXX_SIMULATE_ID "") +set(CMAKE_CXX_COMPILER_FRONTEND_VARIANT "GNU") +set(CMAKE_CXX_SIMULATE_VERSION "") + + + + +set(CMAKE_AR "/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/bin/llvm-ar") +set(CMAKE_CXX_COMPILER_AR "/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/bin/llvm-ar") +set(CMAKE_RANLIB "/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/bin/llvm-ranlib") +set(CMAKE_CXX_COMPILER_RANLIB "/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/bin/llvm-ranlib") +set(CMAKE_LINKER "/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/bin/ld.lld") +set(CMAKE_LINKER_LINK "") +set(CMAKE_LINKER_LLD "") +set(CMAKE_CXX_COMPILER_LINKER "/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/bin/ld.lld") +set(CMAKE_CXX_COMPILER_LINKER_ID "LLD") +set(CMAKE_CXX_COMPILER_LINKER_VERSION 18.0.1) +set(CMAKE_CXX_COMPILER_LINKER_FRONTEND_VARIANT GNU) +set(CMAKE_MT "") +set(CMAKE_TAPI "CMAKE_TAPI-NOTFOUND") +set(CMAKE_COMPILER_IS_GNUCXX ) +set(CMAKE_CXX_COMPILER_LOADED 1) +set(CMAKE_CXX_COMPILER_WORKS TRUE) +set(CMAKE_CXX_ABI_COMPILED TRUE) + +set(CMAKE_CXX_COMPILER_ENV_VAR "CXX") + +set(CMAKE_CXX_COMPILER_ID_RUN 1) +set(CMAKE_CXX_SOURCE_FILE_EXTENSIONS C;M;c++;cc;cpp;cxx;m;mm;mpp;CPP;ixx;cppm;ccm;cxxm;c++m) +set(CMAKE_CXX_IGNORE_EXTENSIONS inl;h;hpp;HPP;H;o;O;obj;OBJ;def;DEF;rc;RC) + +foreach (lang IN ITEMS C OBJC OBJCXX) + if (CMAKE_${lang}_COMPILER_ID_RUN) + foreach(extension IN LISTS CMAKE_${lang}_SOURCE_FILE_EXTENSIONS) + list(REMOVE_ITEM CMAKE_CXX_SOURCE_FILE_EXTENSIONS ${extension}) + endforeach() + endif() +endforeach() + +set(CMAKE_CXX_LINKER_PREFERENCE 30) +set(CMAKE_CXX_LINKER_PREFERENCE_PROPAGATES 1) +set(CMAKE_CXX_LINKER_DEPFILE_SUPPORTED ) + +# Save compiler ABI information. +set(CMAKE_CXX_SIZEOF_DATA_PTR "4") +set(CMAKE_CXX_COMPILER_ABI "ELF") +set(CMAKE_CXX_BYTE_ORDER "LITTLE_ENDIAN") +set(CMAKE_CXX_LIBRARY_ARCHITECTURE "arm-linux-androideabi") + +if(CMAKE_CXX_SIZEOF_DATA_PTR) + set(CMAKE_SIZEOF_VOID_P "${CMAKE_CXX_SIZEOF_DATA_PTR}") +endif() + +if(CMAKE_CXX_COMPILER_ABI) + set(CMAKE_INTERNAL_PLATFORM_ABI "${CMAKE_CXX_COMPILER_ABI}") +endif() + +if(CMAKE_CXX_LIBRARY_ARCHITECTURE) + set(CMAKE_LIBRARY_ARCHITECTURE "arm-linux-androideabi") +endif() + +set(CMAKE_CXX_CL_SHOWINCLUDES_PREFIX "") +if(CMAKE_CXX_CL_SHOWINCLUDES_PREFIX) + set(CMAKE_CL_SHOWINCLUDES_PREFIX "${CMAKE_CXX_CL_SHOWINCLUDES_PREFIX}") +endif() + + + + + +set(CMAKE_CXX_IMPLICIT_INCLUDE_DIRECTORIES "/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/include/c++/v1;/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/lib/clang/18/include;/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/include/arm-linux-androideabi;/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/include") +set(CMAKE_CXX_IMPLICIT_LINK_LIBRARIES "c++;m;-l:libunwind.a;dl;c;-l:libunwind.a;dl") +set(CMAKE_CXX_IMPLICIT_LINK_DIRECTORIES "/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/lib/clang/18/lib/linux/arm;/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/lib/arm-linux-androideabi/23;/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/lib/arm-linux-androideabi;/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/lib") +set(CMAKE_CXX_IMPLICIT_LINK_FRAMEWORK_DIRECTORIES "") +set(CMAKE_CXX_COMPILER_CLANG_RESOURCE_DIR "/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/lib/clang/18") + +set(CMAKE_CXX_COMPILER_IMPORT_STD "") +### Imported target for C++23 standard library +set(CMAKE_CXX23_COMPILER_IMPORT_STD_NOT_FOUND_MESSAGE "Experimental `import std` support not enabled when detecting toolchain; it must be set before `CXX` is enabled (usually a `project()` call)") + + +### Imported target for C++26 standard library +set(CMAKE_CXX26_COMPILER_IMPORT_STD_NOT_FOUND_MESSAGE "Experimental `import std` support not enabled when detecting toolchain; it must be set before `CXX` is enabled (usually a `project()` call)") + + + diff --git a/siro_rider/android/app/.cxx/Debug/3p4b322x/armeabi-v7a/CMakeFiles/3.31.5-g6cf5163/CMakeDetermineCompilerABI_C.bin b/siro_rider/android/app/.cxx/Debug/3p4b322x/armeabi-v7a/CMakeFiles/3.31.5-g6cf5163/CMakeDetermineCompilerABI_C.bin new file mode 100755 index 0000000..b5ab885 Binary files /dev/null and b/siro_rider/android/app/.cxx/Debug/3p4b322x/armeabi-v7a/CMakeFiles/3.31.5-g6cf5163/CMakeDetermineCompilerABI_C.bin differ diff --git a/siro_rider/android/app/.cxx/Debug/3p4b322x/armeabi-v7a/CMakeFiles/3.31.5-g6cf5163/CMakeDetermineCompilerABI_CXX.bin b/siro_rider/android/app/.cxx/Debug/3p4b322x/armeabi-v7a/CMakeFiles/3.31.5-g6cf5163/CMakeDetermineCompilerABI_CXX.bin new file mode 100755 index 0000000..01c4045 Binary files /dev/null and b/siro_rider/android/app/.cxx/Debug/3p4b322x/armeabi-v7a/CMakeFiles/3.31.5-g6cf5163/CMakeDetermineCompilerABI_CXX.bin differ diff --git a/siro_rider/android/app/.cxx/Debug/3p4b322x/armeabi-v7a/CMakeFiles/3.31.5-g6cf5163/CMakeSystem.cmake b/siro_rider/android/app/.cxx/Debug/3p4b322x/armeabi-v7a/CMakeFiles/3.31.5-g6cf5163/CMakeSystem.cmake new file mode 100644 index 0000000..dada03e --- /dev/null +++ b/siro_rider/android/app/.cxx/Debug/3p4b322x/armeabi-v7a/CMakeFiles/3.31.5-g6cf5163/CMakeSystem.cmake @@ -0,0 +1,15 @@ +set(CMAKE_HOST_SYSTEM "Darwin-24.5.0") +set(CMAKE_HOST_SYSTEM_NAME "Darwin") +set(CMAKE_HOST_SYSTEM_VERSION "24.5.0") +set(CMAKE_HOST_SYSTEM_PROCESSOR "arm64") + +include("/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/build/cmake/android.toolchain.cmake") + +set(CMAKE_SYSTEM "Android-1") +set(CMAKE_SYSTEM_NAME "Android") +set(CMAKE_SYSTEM_VERSION "1") +set(CMAKE_SYSTEM_PROCESSOR "armv7-a") + +set(CMAKE_CROSSCOMPILING "TRUE") + +set(CMAKE_SYSTEM_LOADED 1) diff --git a/siro_rider/android/app/.cxx/Debug/3p4b322x/armeabi-v7a/CMakeFiles/3.31.5-g6cf5163/CompilerIdC/CMakeCCompilerId.c b/siro_rider/android/app/.cxx/Debug/3p4b322x/armeabi-v7a/CMakeFiles/3.31.5-g6cf5163/CompilerIdC/CMakeCCompilerId.c new file mode 100644 index 0000000..8d8bb03 --- /dev/null +++ b/siro_rider/android/app/.cxx/Debug/3p4b322x/armeabi-v7a/CMakeFiles/3.31.5-g6cf5163/CompilerIdC/CMakeCCompilerId.c @@ -0,0 +1,904 @@ +#ifdef __cplusplus +# error "A C++ compiler has been selected for C." +#endif + +#if defined(__18CXX) +# define ID_VOID_MAIN +#endif +#if defined(__CLASSIC_C__) +/* cv-qualifiers did not exist in K&R C */ +# define const +# define volatile +#endif + +#if !defined(__has_include) +/* If the compiler does not have __has_include, pretend the answer is + always no. */ +# define __has_include(x) 0 +#endif + + +/* Version number components: V=Version, R=Revision, P=Patch + Version date components: YYYY=Year, MM=Month, DD=Day */ + +#if defined(__INTEL_COMPILER) || defined(__ICC) +# define COMPILER_ID "Intel" +# if defined(_MSC_VER) +# define SIMULATE_ID "MSVC" +# endif +# if defined(__GNUC__) +# define SIMULATE_ID "GNU" +# endif + /* __INTEL_COMPILER = VRP prior to 2021, and then VVVV for 2021 and later, + except that a few beta releases use the old format with V=2021. */ +# if __INTEL_COMPILER < 2021 || __INTEL_COMPILER == 202110 || __INTEL_COMPILER == 202111 +# define COMPILER_VERSION_MAJOR DEC(__INTEL_COMPILER/100) +# define COMPILER_VERSION_MINOR DEC(__INTEL_COMPILER/10 % 10) +# if defined(__INTEL_COMPILER_UPDATE) +# define COMPILER_VERSION_PATCH DEC(__INTEL_COMPILER_UPDATE) +# else +# define COMPILER_VERSION_PATCH DEC(__INTEL_COMPILER % 10) +# endif +# else +# define COMPILER_VERSION_MAJOR DEC(__INTEL_COMPILER) +# define COMPILER_VERSION_MINOR DEC(__INTEL_COMPILER_UPDATE) + /* The third version component from --version is an update index, + but no macro is provided for it. */ +# define COMPILER_VERSION_PATCH DEC(0) +# endif +# if defined(__INTEL_COMPILER_BUILD_DATE) + /* __INTEL_COMPILER_BUILD_DATE = YYYYMMDD */ +# define COMPILER_VERSION_TWEAK DEC(__INTEL_COMPILER_BUILD_DATE) +# endif +# if defined(_MSC_VER) + /* _MSC_VER = VVRR */ +# define SIMULATE_VERSION_MAJOR DEC(_MSC_VER / 100) +# define SIMULATE_VERSION_MINOR DEC(_MSC_VER % 100) +# endif +# if defined(__GNUC__) +# define SIMULATE_VERSION_MAJOR DEC(__GNUC__) +# elif defined(__GNUG__) +# define SIMULATE_VERSION_MAJOR DEC(__GNUG__) +# endif +# if defined(__GNUC_MINOR__) +# define SIMULATE_VERSION_MINOR DEC(__GNUC_MINOR__) +# endif +# if defined(__GNUC_PATCHLEVEL__) +# define SIMULATE_VERSION_PATCH DEC(__GNUC_PATCHLEVEL__) +# endif + +#elif (defined(__clang__) && defined(__INTEL_CLANG_COMPILER)) || defined(__INTEL_LLVM_COMPILER) +# define COMPILER_ID "IntelLLVM" +#if defined(_MSC_VER) +# define SIMULATE_ID "MSVC" +#endif +#if defined(__GNUC__) +# define SIMULATE_ID "GNU" +#endif +/* __INTEL_LLVM_COMPILER = VVVVRP prior to 2021.2.0, VVVVRRPP for 2021.2.0 and + * later. Look for 6 digit vs. 8 digit version number to decide encoding. + * VVVV is no smaller than the current year when a version is released. + */ +#if __INTEL_LLVM_COMPILER < 1000000L +# define COMPILER_VERSION_MAJOR DEC(__INTEL_LLVM_COMPILER/100) +# define COMPILER_VERSION_MINOR DEC(__INTEL_LLVM_COMPILER/10 % 10) +# define COMPILER_VERSION_PATCH DEC(__INTEL_LLVM_COMPILER % 10) +#else +# define COMPILER_VERSION_MAJOR DEC(__INTEL_LLVM_COMPILER/10000) +# define COMPILER_VERSION_MINOR DEC(__INTEL_LLVM_COMPILER/100 % 100) +# define COMPILER_VERSION_PATCH DEC(__INTEL_LLVM_COMPILER % 100) +#endif +#if defined(_MSC_VER) + /* _MSC_VER = VVRR */ +# define SIMULATE_VERSION_MAJOR DEC(_MSC_VER / 100) +# define SIMULATE_VERSION_MINOR DEC(_MSC_VER % 100) +#endif +#if defined(__GNUC__) +# define SIMULATE_VERSION_MAJOR DEC(__GNUC__) +#elif defined(__GNUG__) +# define SIMULATE_VERSION_MAJOR DEC(__GNUG__) +#endif +#if defined(__GNUC_MINOR__) +# define SIMULATE_VERSION_MINOR DEC(__GNUC_MINOR__) +#endif +#if defined(__GNUC_PATCHLEVEL__) +# define SIMULATE_VERSION_PATCH DEC(__GNUC_PATCHLEVEL__) +#endif + +#elif defined(__PATHCC__) +# define COMPILER_ID "PathScale" +# define COMPILER_VERSION_MAJOR DEC(__PATHCC__) +# define COMPILER_VERSION_MINOR DEC(__PATHCC_MINOR__) +# if defined(__PATHCC_PATCHLEVEL__) +# define COMPILER_VERSION_PATCH DEC(__PATHCC_PATCHLEVEL__) +# endif + +#elif defined(__BORLANDC__) && defined(__CODEGEARC_VERSION__) +# define COMPILER_ID "Embarcadero" +# define COMPILER_VERSION_MAJOR HEX(__CODEGEARC_VERSION__>>24 & 0x00FF) +# define COMPILER_VERSION_MINOR HEX(__CODEGEARC_VERSION__>>16 & 0x00FF) +# define COMPILER_VERSION_PATCH DEC(__CODEGEARC_VERSION__ & 0xFFFF) + +#elif defined(__BORLANDC__) +# define COMPILER_ID "Borland" + /* __BORLANDC__ = 0xVRR */ +# define COMPILER_VERSION_MAJOR HEX(__BORLANDC__>>8) +# define COMPILER_VERSION_MINOR HEX(__BORLANDC__ & 0xFF) + +#elif defined(__WATCOMC__) && __WATCOMC__ < 1200 +# define COMPILER_ID "Watcom" + /* __WATCOMC__ = VVRR */ +# define COMPILER_VERSION_MAJOR DEC(__WATCOMC__ / 100) +# define COMPILER_VERSION_MINOR DEC((__WATCOMC__ / 10) % 10) +# if (__WATCOMC__ % 10) > 0 +# define COMPILER_VERSION_PATCH DEC(__WATCOMC__ % 10) +# endif + +#elif defined(__WATCOMC__) +# define COMPILER_ID "OpenWatcom" + /* __WATCOMC__ = VVRP + 1100 */ +# define COMPILER_VERSION_MAJOR DEC((__WATCOMC__ - 1100) / 100) +# define COMPILER_VERSION_MINOR DEC((__WATCOMC__ / 10) % 10) +# if (__WATCOMC__ % 10) > 0 +# define COMPILER_VERSION_PATCH DEC(__WATCOMC__ % 10) +# endif + +#elif defined(__SUNPRO_C) +# define COMPILER_ID "SunPro" +# if __SUNPRO_C >= 0x5100 + /* __SUNPRO_C = 0xVRRP */ +# define COMPILER_VERSION_MAJOR HEX(__SUNPRO_C>>12) +# define COMPILER_VERSION_MINOR HEX(__SUNPRO_C>>4 & 0xFF) +# define COMPILER_VERSION_PATCH HEX(__SUNPRO_C & 0xF) +# else + /* __SUNPRO_CC = 0xVRP */ +# define COMPILER_VERSION_MAJOR HEX(__SUNPRO_C>>8) +# define COMPILER_VERSION_MINOR HEX(__SUNPRO_C>>4 & 0xF) +# define COMPILER_VERSION_PATCH HEX(__SUNPRO_C & 0xF) +# endif + +#elif defined(__HP_cc) +# define COMPILER_ID "HP" + /* __HP_cc = VVRRPP */ +# define COMPILER_VERSION_MAJOR DEC(__HP_cc/10000) +# define COMPILER_VERSION_MINOR DEC(__HP_cc/100 % 100) +# define COMPILER_VERSION_PATCH DEC(__HP_cc % 100) + +#elif defined(__DECC) +# define COMPILER_ID "Compaq" + /* __DECC_VER = VVRRTPPPP */ +# define COMPILER_VERSION_MAJOR DEC(__DECC_VER/10000000) +# define COMPILER_VERSION_MINOR DEC(__DECC_VER/100000 % 100) +# define COMPILER_VERSION_PATCH DEC(__DECC_VER % 10000) + +#elif defined(__IBMC__) && defined(__COMPILER_VER__) +# define COMPILER_ID "zOS" + /* __IBMC__ = VRP */ +# define COMPILER_VERSION_MAJOR DEC(__IBMC__/100) +# define COMPILER_VERSION_MINOR DEC(__IBMC__/10 % 10) +# define COMPILER_VERSION_PATCH DEC(__IBMC__ % 10) + +#elif defined(__open_xl__) && defined(__clang__) +# define COMPILER_ID "IBMClang" +# define COMPILER_VERSION_MAJOR DEC(__open_xl_version__) +# define COMPILER_VERSION_MINOR DEC(__open_xl_release__) +# define COMPILER_VERSION_PATCH DEC(__open_xl_modification__) +# define COMPILER_VERSION_TWEAK DEC(__open_xl_ptf_fix_level__) + + +#elif defined(__ibmxl__) && defined(__clang__) +# define COMPILER_ID "XLClang" +# define COMPILER_VERSION_MAJOR DEC(__ibmxl_version__) +# define COMPILER_VERSION_MINOR DEC(__ibmxl_release__) +# define COMPILER_VERSION_PATCH DEC(__ibmxl_modification__) +# define COMPILER_VERSION_TWEAK DEC(__ibmxl_ptf_fix_level__) + + +#elif defined(__IBMC__) && !defined(__COMPILER_VER__) && __IBMC__ >= 800 +# define COMPILER_ID "XL" + /* __IBMC__ = VRP */ +# define COMPILER_VERSION_MAJOR DEC(__IBMC__/100) +# define COMPILER_VERSION_MINOR DEC(__IBMC__/10 % 10) +# define COMPILER_VERSION_PATCH DEC(__IBMC__ % 10) + +#elif defined(__IBMC__) && !defined(__COMPILER_VER__) && __IBMC__ < 800 +# define COMPILER_ID "VisualAge" + /* __IBMC__ = VRP */ +# define COMPILER_VERSION_MAJOR DEC(__IBMC__/100) +# define COMPILER_VERSION_MINOR DEC(__IBMC__/10 % 10) +# define COMPILER_VERSION_PATCH DEC(__IBMC__ % 10) + +#elif defined(__NVCOMPILER) +# define COMPILER_ID "NVHPC" +# define COMPILER_VERSION_MAJOR DEC(__NVCOMPILER_MAJOR__) +# define COMPILER_VERSION_MINOR DEC(__NVCOMPILER_MINOR__) +# if defined(__NVCOMPILER_PATCHLEVEL__) +# define COMPILER_VERSION_PATCH DEC(__NVCOMPILER_PATCHLEVEL__) +# endif + +#elif defined(__PGI) +# define COMPILER_ID "PGI" +# define COMPILER_VERSION_MAJOR DEC(__PGIC__) +# define COMPILER_VERSION_MINOR DEC(__PGIC_MINOR__) +# if defined(__PGIC_PATCHLEVEL__) +# define COMPILER_VERSION_PATCH DEC(__PGIC_PATCHLEVEL__) +# endif + +#elif defined(__clang__) && defined(__cray__) +# define COMPILER_ID "CrayClang" +# define COMPILER_VERSION_MAJOR DEC(__cray_major__) +# define COMPILER_VERSION_MINOR DEC(__cray_minor__) +# define COMPILER_VERSION_PATCH DEC(__cray_patchlevel__) +# define COMPILER_VERSION_INTERNAL_STR __clang_version__ + + +#elif defined(_CRAYC) +# define COMPILER_ID "Cray" +# define COMPILER_VERSION_MAJOR DEC(_RELEASE_MAJOR) +# define COMPILER_VERSION_MINOR DEC(_RELEASE_MINOR) + +#elif defined(__TI_COMPILER_VERSION__) +# define COMPILER_ID "TI" + /* __TI_COMPILER_VERSION__ = VVVRRRPPP */ +# define COMPILER_VERSION_MAJOR DEC(__TI_COMPILER_VERSION__/1000000) +# define COMPILER_VERSION_MINOR DEC(__TI_COMPILER_VERSION__/1000 % 1000) +# define COMPILER_VERSION_PATCH DEC(__TI_COMPILER_VERSION__ % 1000) + +#elif defined(__CLANG_FUJITSU) +# define COMPILER_ID "FujitsuClang" +# define COMPILER_VERSION_MAJOR DEC(__FCC_major__) +# define COMPILER_VERSION_MINOR DEC(__FCC_minor__) +# define COMPILER_VERSION_PATCH DEC(__FCC_patchlevel__) +# define COMPILER_VERSION_INTERNAL_STR __clang_version__ + + +#elif defined(__FUJITSU) +# define COMPILER_ID "Fujitsu" +# if defined(__FCC_version__) +# define COMPILER_VERSION __FCC_version__ +# elif defined(__FCC_major__) +# define COMPILER_VERSION_MAJOR DEC(__FCC_major__) +# define COMPILER_VERSION_MINOR DEC(__FCC_minor__) +# define COMPILER_VERSION_PATCH DEC(__FCC_patchlevel__) +# endif +# if defined(__fcc_version) +# define COMPILER_VERSION_INTERNAL DEC(__fcc_version) +# elif defined(__FCC_VERSION) +# define COMPILER_VERSION_INTERNAL DEC(__FCC_VERSION) +# endif + + +#elif defined(__ghs__) +# define COMPILER_ID "GHS" +/* __GHS_VERSION_NUMBER = VVVVRP */ +# ifdef __GHS_VERSION_NUMBER +# define COMPILER_VERSION_MAJOR DEC(__GHS_VERSION_NUMBER / 100) +# define COMPILER_VERSION_MINOR DEC(__GHS_VERSION_NUMBER / 10 % 10) +# define COMPILER_VERSION_PATCH DEC(__GHS_VERSION_NUMBER % 10) +# endif + +#elif defined(__TASKING__) +# define COMPILER_ID "Tasking" + # define COMPILER_VERSION_MAJOR DEC(__VERSION__/1000) + # define COMPILER_VERSION_MINOR DEC(__VERSION__ % 100) +# define COMPILER_VERSION_INTERNAL DEC(__VERSION__) + +#elif defined(__ORANGEC__) +# define COMPILER_ID "OrangeC" +# define COMPILER_VERSION_MAJOR DEC(__ORANGEC_MAJOR__) +# define COMPILER_VERSION_MINOR DEC(__ORANGEC_MINOR__) +# define COMPILER_VERSION_PATCH DEC(__ORANGEC_PATCHLEVEL__) + +#elif defined(__TINYC__) +# define COMPILER_ID "TinyCC" + +#elif defined(__BCC__) +# define COMPILER_ID "Bruce" + +#elif defined(__SCO_VERSION__) +# define COMPILER_ID "SCO" + +#elif defined(__ARMCC_VERSION) && !defined(__clang__) +# define COMPILER_ID "ARMCC" +#if __ARMCC_VERSION >= 1000000 + /* __ARMCC_VERSION = VRRPPPP */ + # define COMPILER_VERSION_MAJOR DEC(__ARMCC_VERSION/1000000) + # define COMPILER_VERSION_MINOR DEC(__ARMCC_VERSION/10000 % 100) + # define COMPILER_VERSION_PATCH DEC(__ARMCC_VERSION % 10000) +#else + /* __ARMCC_VERSION = VRPPPP */ + # define COMPILER_VERSION_MAJOR DEC(__ARMCC_VERSION/100000) + # define COMPILER_VERSION_MINOR DEC(__ARMCC_VERSION/10000 % 10) + # define COMPILER_VERSION_PATCH DEC(__ARMCC_VERSION % 10000) +#endif + + +#elif defined(__clang__) && defined(__apple_build_version__) +# define COMPILER_ID "AppleClang" +# if defined(_MSC_VER) +# define SIMULATE_ID "MSVC" +# endif +# define COMPILER_VERSION_MAJOR DEC(__clang_major__) +# define COMPILER_VERSION_MINOR DEC(__clang_minor__) +# define COMPILER_VERSION_PATCH DEC(__clang_patchlevel__) +# if defined(_MSC_VER) + /* _MSC_VER = VVRR */ +# define SIMULATE_VERSION_MAJOR DEC(_MSC_VER / 100) +# define SIMULATE_VERSION_MINOR DEC(_MSC_VER % 100) +# endif +# define COMPILER_VERSION_TWEAK DEC(__apple_build_version__) + +#elif defined(__clang__) && defined(__ARMCOMPILER_VERSION) +# define COMPILER_ID "ARMClang" + # define COMPILER_VERSION_MAJOR DEC(__ARMCOMPILER_VERSION/1000000) + # define COMPILER_VERSION_MINOR DEC(__ARMCOMPILER_VERSION/10000 % 100) + # define COMPILER_VERSION_PATCH DEC(__ARMCOMPILER_VERSION/100 % 100) +# define COMPILER_VERSION_INTERNAL DEC(__ARMCOMPILER_VERSION) + +#elif defined(__clang__) && defined(__ti__) +# define COMPILER_ID "TIClang" + # define COMPILER_VERSION_MAJOR DEC(__ti_major__) + # define COMPILER_VERSION_MINOR DEC(__ti_minor__) + # define COMPILER_VERSION_PATCH DEC(__ti_patchlevel__) +# define COMPILER_VERSION_INTERNAL DEC(__ti_version__) + +#elif defined(__clang__) +# define COMPILER_ID "Clang" +# if defined(_MSC_VER) +# define SIMULATE_ID "MSVC" +# endif +# define COMPILER_VERSION_MAJOR DEC(__clang_major__) +# define COMPILER_VERSION_MINOR DEC(__clang_minor__) +# define COMPILER_VERSION_PATCH DEC(__clang_patchlevel__) +# if defined(_MSC_VER) + /* _MSC_VER = VVRR */ +# define SIMULATE_VERSION_MAJOR DEC(_MSC_VER / 100) +# define SIMULATE_VERSION_MINOR DEC(_MSC_VER % 100) +# endif + +#elif defined(__LCC__) && (defined(__GNUC__) || defined(__GNUG__) || defined(__MCST__)) +# define COMPILER_ID "LCC" +# define COMPILER_VERSION_MAJOR DEC(__LCC__ / 100) +# define COMPILER_VERSION_MINOR DEC(__LCC__ % 100) +# if defined(__LCC_MINOR__) +# define COMPILER_VERSION_PATCH DEC(__LCC_MINOR__) +# endif +# if defined(__GNUC__) && defined(__GNUC_MINOR__) +# define SIMULATE_ID "GNU" +# define SIMULATE_VERSION_MAJOR DEC(__GNUC__) +# define SIMULATE_VERSION_MINOR DEC(__GNUC_MINOR__) +# if defined(__GNUC_PATCHLEVEL__) +# define SIMULATE_VERSION_PATCH DEC(__GNUC_PATCHLEVEL__) +# endif +# endif + +#elif defined(__GNUC__) +# define COMPILER_ID "GNU" +# define COMPILER_VERSION_MAJOR DEC(__GNUC__) +# if defined(__GNUC_MINOR__) +# define COMPILER_VERSION_MINOR DEC(__GNUC_MINOR__) +# endif +# if defined(__GNUC_PATCHLEVEL__) +# define COMPILER_VERSION_PATCH DEC(__GNUC_PATCHLEVEL__) +# endif + +#elif defined(_MSC_VER) +# define COMPILER_ID "MSVC" + /* _MSC_VER = VVRR */ +# define COMPILER_VERSION_MAJOR DEC(_MSC_VER / 100) +# define COMPILER_VERSION_MINOR DEC(_MSC_VER % 100) +# if defined(_MSC_FULL_VER) +# if _MSC_VER >= 1400 + /* _MSC_FULL_VER = VVRRPPPPP */ +# define COMPILER_VERSION_PATCH DEC(_MSC_FULL_VER % 100000) +# else + /* _MSC_FULL_VER = VVRRPPPP */ +# define COMPILER_VERSION_PATCH DEC(_MSC_FULL_VER % 10000) +# endif +# endif +# if defined(_MSC_BUILD) +# define COMPILER_VERSION_TWEAK DEC(_MSC_BUILD) +# endif + +#elif defined(_ADI_COMPILER) +# define COMPILER_ID "ADSP" +#if defined(__VERSIONNUM__) + /* __VERSIONNUM__ = 0xVVRRPPTT */ +# define COMPILER_VERSION_MAJOR DEC(__VERSIONNUM__ >> 24 & 0xFF) +# define COMPILER_VERSION_MINOR DEC(__VERSIONNUM__ >> 16 & 0xFF) +# define COMPILER_VERSION_PATCH DEC(__VERSIONNUM__ >> 8 & 0xFF) +# define COMPILER_VERSION_TWEAK DEC(__VERSIONNUM__ & 0xFF) +#endif + +#elif defined(__IAR_SYSTEMS_ICC__) || defined(__IAR_SYSTEMS_ICC) +# define COMPILER_ID "IAR" +# if defined(__VER__) && defined(__ICCARM__) +# define COMPILER_VERSION_MAJOR DEC((__VER__) / 1000000) +# define COMPILER_VERSION_MINOR DEC(((__VER__) / 1000) % 1000) +# define COMPILER_VERSION_PATCH DEC((__VER__) % 1000) +# define COMPILER_VERSION_INTERNAL DEC(__IAR_SYSTEMS_ICC__) +# elif defined(__VER__) && (defined(__ICCAVR__) || defined(__ICCRX__) || defined(__ICCRH850__) || defined(__ICCRL78__) || defined(__ICC430__) || defined(__ICCRISCV__) || defined(__ICCV850__) || defined(__ICC8051__) || defined(__ICCSTM8__)) +# define COMPILER_VERSION_MAJOR DEC((__VER__) / 100) +# define COMPILER_VERSION_MINOR DEC((__VER__) - (((__VER__) / 100)*100)) +# define COMPILER_VERSION_PATCH DEC(__SUBVERSION__) +# define COMPILER_VERSION_INTERNAL DEC(__IAR_SYSTEMS_ICC__) +# endif + +#elif defined(__SDCC_VERSION_MAJOR) || defined(SDCC) +# define COMPILER_ID "SDCC" +# if defined(__SDCC_VERSION_MAJOR) +# define COMPILER_VERSION_MAJOR DEC(__SDCC_VERSION_MAJOR) +# define COMPILER_VERSION_MINOR DEC(__SDCC_VERSION_MINOR) +# define COMPILER_VERSION_PATCH DEC(__SDCC_VERSION_PATCH) +# else + /* SDCC = VRP */ +# define COMPILER_VERSION_MAJOR DEC(SDCC/100) +# define COMPILER_VERSION_MINOR DEC(SDCC/10 % 10) +# define COMPILER_VERSION_PATCH DEC(SDCC % 10) +# endif + + +/* These compilers are either not known or too old to define an + identification macro. Try to identify the platform and guess that + it is the native compiler. */ +#elif defined(__hpux) || defined(__hpua) +# define COMPILER_ID "HP" + +#else /* unknown compiler */ +# define COMPILER_ID "" +#endif + +/* Construct the string literal in pieces to prevent the source from + getting matched. Store it in a pointer rather than an array + because some compilers will just produce instructions to fill the + array rather than assigning a pointer to a static array. */ +char const* info_compiler = "INFO" ":" "compiler[" COMPILER_ID "]"; +#ifdef SIMULATE_ID +char const* info_simulate = "INFO" ":" "simulate[" SIMULATE_ID "]"; +#endif + +#ifdef __QNXNTO__ +char const* qnxnto = "INFO" ":" "qnxnto[]"; +#endif + +#if defined(__CRAYXT_COMPUTE_LINUX_TARGET) +char const *info_cray = "INFO" ":" "compiler_wrapper[CrayPrgEnv]"; +#endif + +#define STRINGIFY_HELPER(X) #X +#define STRINGIFY(X) STRINGIFY_HELPER(X) + +/* Identify known platforms by name. */ +#if defined(__linux) || defined(__linux__) || defined(linux) +# define PLATFORM_ID "Linux" + +#elif defined(__MSYS__) +# define PLATFORM_ID "MSYS" + +#elif defined(__CYGWIN__) +# define PLATFORM_ID "Cygwin" + +#elif defined(__MINGW32__) +# define PLATFORM_ID "MinGW" + +#elif defined(__APPLE__) +# define PLATFORM_ID "Darwin" + +#elif defined(_WIN32) || defined(__WIN32__) || defined(WIN32) +# define PLATFORM_ID "Windows" + +#elif defined(__FreeBSD__) || defined(__FreeBSD) +# define PLATFORM_ID "FreeBSD" + +#elif defined(__NetBSD__) || defined(__NetBSD) +# define PLATFORM_ID "NetBSD" + +#elif defined(__OpenBSD__) || defined(__OPENBSD) +# define PLATFORM_ID "OpenBSD" + +#elif defined(__sun) || defined(sun) +# define PLATFORM_ID "SunOS" + +#elif defined(_AIX) || defined(__AIX) || defined(__AIX__) || defined(__aix) || defined(__aix__) +# define PLATFORM_ID "AIX" + +#elif defined(__hpux) || defined(__hpux__) +# define PLATFORM_ID "HP-UX" + +#elif defined(__HAIKU__) +# define PLATFORM_ID "Haiku" + +#elif defined(__BeOS) || defined(__BEOS__) || defined(_BEOS) +# define PLATFORM_ID "BeOS" + +#elif defined(__QNX__) || defined(__QNXNTO__) +# define PLATFORM_ID "QNX" + +#elif defined(__tru64) || defined(_tru64) || defined(__TRU64__) +# define PLATFORM_ID "Tru64" + +#elif defined(__riscos) || defined(__riscos__) +# define PLATFORM_ID "RISCos" + +#elif defined(__sinix) || defined(__sinix__) || defined(__SINIX__) +# define PLATFORM_ID "SINIX" + +#elif defined(__UNIX_SV__) +# define PLATFORM_ID "UNIX_SV" + +#elif defined(__bsdos__) +# define PLATFORM_ID "BSDOS" + +#elif defined(_MPRAS) || defined(MPRAS) +# define PLATFORM_ID "MP-RAS" + +#elif defined(__osf) || defined(__osf__) +# define PLATFORM_ID "OSF1" + +#elif defined(_SCO_SV) || defined(SCO_SV) || defined(sco_sv) +# define PLATFORM_ID "SCO_SV" + +#elif defined(__ultrix) || defined(__ultrix__) || defined(_ULTRIX) +# define PLATFORM_ID "ULTRIX" + +#elif defined(__XENIX__) || defined(_XENIX) || defined(XENIX) +# define PLATFORM_ID "Xenix" + +#elif defined(__WATCOMC__) +# if defined(__LINUX__) +# define PLATFORM_ID "Linux" + +# elif defined(__DOS__) +# define PLATFORM_ID "DOS" + +# elif defined(__OS2__) +# define PLATFORM_ID "OS2" + +# elif defined(__WINDOWS__) +# define PLATFORM_ID "Windows3x" + +# elif defined(__VXWORKS__) +# define PLATFORM_ID "VxWorks" + +# else /* unknown platform */ +# define PLATFORM_ID +# endif + +#elif defined(__INTEGRITY) +# if defined(INT_178B) +# define PLATFORM_ID "Integrity178" + +# else /* regular Integrity */ +# define PLATFORM_ID "Integrity" +# endif + +# elif defined(_ADI_COMPILER) +# define PLATFORM_ID "ADSP" + +#else /* unknown platform */ +# define PLATFORM_ID + +#endif + +/* For windows compilers MSVC and Intel we can determine + the architecture of the compiler being used. This is because + the compilers do not have flags that can change the architecture, + but rather depend on which compiler is being used +*/ +#if defined(_WIN32) && defined(_MSC_VER) +# if defined(_M_IA64) +# define ARCHITECTURE_ID "IA64" + +# elif defined(_M_ARM64EC) +# define ARCHITECTURE_ID "ARM64EC" + +# elif defined(_M_X64) || defined(_M_AMD64) +# define ARCHITECTURE_ID "x64" + +# elif defined(_M_IX86) +# define ARCHITECTURE_ID "X86" + +# elif defined(_M_ARM64) +# define ARCHITECTURE_ID "ARM64" + +# elif defined(_M_ARM) +# if _M_ARM == 4 +# define ARCHITECTURE_ID "ARMV4I" +# elif _M_ARM == 5 +# define ARCHITECTURE_ID "ARMV5I" +# else +# define ARCHITECTURE_ID "ARMV" STRINGIFY(_M_ARM) +# endif + +# elif defined(_M_MIPS) +# define ARCHITECTURE_ID "MIPS" + +# elif defined(_M_SH) +# define ARCHITECTURE_ID "SHx" + +# else /* unknown architecture */ +# define ARCHITECTURE_ID "" +# endif + +#elif defined(__WATCOMC__) +# if defined(_M_I86) +# define ARCHITECTURE_ID "I86" + +# elif defined(_M_IX86) +# define ARCHITECTURE_ID "X86" + +# else /* unknown architecture */ +# define ARCHITECTURE_ID "" +# endif + +#elif defined(__IAR_SYSTEMS_ICC__) || defined(__IAR_SYSTEMS_ICC) +# if defined(__ICCARM__) +# define ARCHITECTURE_ID "ARM" + +# elif defined(__ICCRX__) +# define ARCHITECTURE_ID "RX" + +# elif defined(__ICCRH850__) +# define ARCHITECTURE_ID "RH850" + +# elif defined(__ICCRL78__) +# define ARCHITECTURE_ID "RL78" + +# elif defined(__ICCRISCV__) +# define ARCHITECTURE_ID "RISCV" + +# elif defined(__ICCAVR__) +# define ARCHITECTURE_ID "AVR" + +# elif defined(__ICC430__) +# define ARCHITECTURE_ID "MSP430" + +# elif defined(__ICCV850__) +# define ARCHITECTURE_ID "V850" + +# elif defined(__ICC8051__) +# define ARCHITECTURE_ID "8051" + +# elif defined(__ICCSTM8__) +# define ARCHITECTURE_ID "STM8" + +# else /* unknown architecture */ +# define ARCHITECTURE_ID "" +# endif + +#elif defined(__ghs__) +# if defined(__PPC64__) +# define ARCHITECTURE_ID "PPC64" + +# elif defined(__ppc__) +# define ARCHITECTURE_ID "PPC" + +# elif defined(__ARM__) +# define ARCHITECTURE_ID "ARM" + +# elif defined(__x86_64__) +# define ARCHITECTURE_ID "x64" + +# elif defined(__i386__) +# define ARCHITECTURE_ID "X86" + +# else /* unknown architecture */ +# define ARCHITECTURE_ID "" +# endif + +#elif defined(__clang__) && defined(__ti__) +# if defined(__ARM_ARCH) +# define ARCHITECTURE_ID "Arm" + +# else /* unknown architecture */ +# define ARCHITECTURE_ID "" +# endif + +#elif defined(__TI_COMPILER_VERSION__) +# if defined(__TI_ARM__) +# define ARCHITECTURE_ID "ARM" + +# elif defined(__MSP430__) +# define ARCHITECTURE_ID "MSP430" + +# elif defined(__TMS320C28XX__) +# define ARCHITECTURE_ID "TMS320C28x" + +# elif defined(__TMS320C6X__) || defined(_TMS320C6X) +# define ARCHITECTURE_ID "TMS320C6x" + +# else /* unknown architecture */ +# define ARCHITECTURE_ID "" +# endif + +# elif defined(__ADSPSHARC__) +# define ARCHITECTURE_ID "SHARC" + +# elif defined(__ADSPBLACKFIN__) +# define ARCHITECTURE_ID "Blackfin" + +#elif defined(__TASKING__) + +# if defined(__CTC__) || defined(__CPTC__) +# define ARCHITECTURE_ID "TriCore" + +# elif defined(__CMCS__) +# define ARCHITECTURE_ID "MCS" + +# elif defined(__CARM__) +# define ARCHITECTURE_ID "ARM" + +# elif defined(__CARC__) +# define ARCHITECTURE_ID "ARC" + +# elif defined(__C51__) +# define ARCHITECTURE_ID "8051" + +# elif defined(__CPCP__) +# define ARCHITECTURE_ID "PCP" + +# else +# define ARCHITECTURE_ID "" +# endif + +#else +# define ARCHITECTURE_ID +#endif + +/* Convert integer to decimal digit literals. */ +#define DEC(n) \ + ('0' + (((n) / 10000000)%10)), \ + ('0' + (((n) / 1000000)%10)), \ + ('0' + (((n) / 100000)%10)), \ + ('0' + (((n) / 10000)%10)), \ + ('0' + (((n) / 1000)%10)), \ + ('0' + (((n) / 100)%10)), \ + ('0' + (((n) / 10)%10)), \ + ('0' + ((n) % 10)) + +/* Convert integer to hex digit literals. */ +#define HEX(n) \ + ('0' + ((n)>>28 & 0xF)), \ + ('0' + ((n)>>24 & 0xF)), \ + ('0' + ((n)>>20 & 0xF)), \ + ('0' + ((n)>>16 & 0xF)), \ + ('0' + ((n)>>12 & 0xF)), \ + ('0' + ((n)>>8 & 0xF)), \ + ('0' + ((n)>>4 & 0xF)), \ + ('0' + ((n) & 0xF)) + +/* Construct a string literal encoding the version number. */ +#ifdef COMPILER_VERSION +char const* info_version = "INFO" ":" "compiler_version[" COMPILER_VERSION "]"; + +/* Construct a string literal encoding the version number components. */ +#elif defined(COMPILER_VERSION_MAJOR) +char const info_version[] = { + 'I', 'N', 'F', 'O', ':', + 'c','o','m','p','i','l','e','r','_','v','e','r','s','i','o','n','[', + COMPILER_VERSION_MAJOR, +# ifdef COMPILER_VERSION_MINOR + '.', COMPILER_VERSION_MINOR, +# ifdef COMPILER_VERSION_PATCH + '.', COMPILER_VERSION_PATCH, +# ifdef COMPILER_VERSION_TWEAK + '.', COMPILER_VERSION_TWEAK, +# endif +# endif +# endif + ']','\0'}; +#endif + +/* Construct a string literal encoding the internal version number. */ +#ifdef COMPILER_VERSION_INTERNAL +char const info_version_internal[] = { + 'I', 'N', 'F', 'O', ':', + 'c','o','m','p','i','l','e','r','_','v','e','r','s','i','o','n','_', + 'i','n','t','e','r','n','a','l','[', + COMPILER_VERSION_INTERNAL,']','\0'}; +#elif defined(COMPILER_VERSION_INTERNAL_STR) +char const* info_version_internal = "INFO" ":" "compiler_version_internal[" COMPILER_VERSION_INTERNAL_STR "]"; +#endif + +/* Construct a string literal encoding the version number components. */ +#ifdef SIMULATE_VERSION_MAJOR +char const info_simulate_version[] = { + 'I', 'N', 'F', 'O', ':', + 's','i','m','u','l','a','t','e','_','v','e','r','s','i','o','n','[', + SIMULATE_VERSION_MAJOR, +# ifdef SIMULATE_VERSION_MINOR + '.', SIMULATE_VERSION_MINOR, +# ifdef SIMULATE_VERSION_PATCH + '.', SIMULATE_VERSION_PATCH, +# ifdef SIMULATE_VERSION_TWEAK + '.', SIMULATE_VERSION_TWEAK, +# endif +# endif +# endif + ']','\0'}; +#endif + +/* Construct the string literal in pieces to prevent the source from + getting matched. Store it in a pointer rather than an array + because some compilers will just produce instructions to fill the + array rather than assigning a pointer to a static array. */ +char const* info_platform = "INFO" ":" "platform[" PLATFORM_ID "]"; +char const* info_arch = "INFO" ":" "arch[" ARCHITECTURE_ID "]"; + + + +#define C_STD_99 199901L +#define C_STD_11 201112L +#define C_STD_17 201710L +#define C_STD_23 202311L + +#ifdef __STDC_VERSION__ +# define C_STD __STDC_VERSION__ +#endif + +#if !defined(__STDC__) && !defined(__clang__) +# if defined(_MSC_VER) || defined(__ibmxl__) || defined(__IBMC__) +# define C_VERSION "90" +# else +# define C_VERSION +# endif +#elif C_STD > C_STD_17 +# define C_VERSION "23" +#elif C_STD > C_STD_11 +# define C_VERSION "17" +#elif C_STD > C_STD_99 +# define C_VERSION "11" +#elif C_STD >= C_STD_99 +# define C_VERSION "99" +#else +# define C_VERSION "90" +#endif +const char* info_language_standard_default = + "INFO" ":" "standard_default[" C_VERSION "]"; + +const char* info_language_extensions_default = "INFO" ":" "extensions_default[" +#if (defined(__clang__) || defined(__GNUC__) || defined(__xlC__) || \ + defined(__TI_COMPILER_VERSION__)) && \ + !defined(__STRICT_ANSI__) + "ON" +#else + "OFF" +#endif +"]"; + +/*--------------------------------------------------------------------------*/ + +#ifdef ID_VOID_MAIN +void main() {} +#else +# if defined(__CLASSIC_C__) +int main(argc, argv) int argc; char *argv[]; +# else +int main(int argc, char* argv[]) +# endif +{ + int require = 0; + require += info_compiler[argc]; + require += info_platform[argc]; + require += info_arch[argc]; +#ifdef COMPILER_VERSION_MAJOR + require += info_version[argc]; +#endif +#ifdef COMPILER_VERSION_INTERNAL + require += info_version_internal[argc]; +#endif +#ifdef SIMULATE_ID + require += info_simulate[argc]; +#endif +#ifdef SIMULATE_VERSION_MAJOR + require += info_simulate_version[argc]; +#endif +#if defined(__CRAYXT_COMPUTE_LINUX_TARGET) + require += info_cray[argc]; +#endif + require += info_language_standard_default[argc]; + require += info_language_extensions_default[argc]; + (void)argv; + return require; +} +#endif diff --git a/siro_rider/android/app/.cxx/Debug/3p4b322x/armeabi-v7a/CMakeFiles/3.31.5-g6cf5163/CompilerIdC/CMakeCCompilerId.o b/siro_rider/android/app/.cxx/Debug/3p4b322x/armeabi-v7a/CMakeFiles/3.31.5-g6cf5163/CompilerIdC/CMakeCCompilerId.o new file mode 100644 index 0000000..79e01a7 Binary files /dev/null and b/siro_rider/android/app/.cxx/Debug/3p4b322x/armeabi-v7a/CMakeFiles/3.31.5-g6cf5163/CompilerIdC/CMakeCCompilerId.o differ diff --git a/siro_rider/android/app/.cxx/Debug/3p4b322x/armeabi-v7a/CMakeFiles/3.31.5-g6cf5163/CompilerIdCXX/CMakeCXXCompilerId.cpp b/siro_rider/android/app/.cxx/Debug/3p4b322x/armeabi-v7a/CMakeFiles/3.31.5-g6cf5163/CompilerIdCXX/CMakeCXXCompilerId.cpp new file mode 100644 index 0000000..da6c824 --- /dev/null +++ b/siro_rider/android/app/.cxx/Debug/3p4b322x/armeabi-v7a/CMakeFiles/3.31.5-g6cf5163/CompilerIdCXX/CMakeCXXCompilerId.cpp @@ -0,0 +1,919 @@ +/* This source file must have a .cpp extension so that all C++ compilers + recognize the extension without flags. Borland does not know .cxx for + example. */ +#ifndef __cplusplus +# error "A C compiler has been selected for C++." +#endif + +#if !defined(__has_include) +/* If the compiler does not have __has_include, pretend the answer is + always no. */ +# define __has_include(x) 0 +#endif + + +/* Version number components: V=Version, R=Revision, P=Patch + Version date components: YYYY=Year, MM=Month, DD=Day */ + +#if defined(__INTEL_COMPILER) || defined(__ICC) +# define COMPILER_ID "Intel" +# if defined(_MSC_VER) +# define SIMULATE_ID "MSVC" +# endif +# if defined(__GNUC__) +# define SIMULATE_ID "GNU" +# endif + /* __INTEL_COMPILER = VRP prior to 2021, and then VVVV for 2021 and later, + except that a few beta releases use the old format with V=2021. */ +# if __INTEL_COMPILER < 2021 || __INTEL_COMPILER == 202110 || __INTEL_COMPILER == 202111 +# define COMPILER_VERSION_MAJOR DEC(__INTEL_COMPILER/100) +# define COMPILER_VERSION_MINOR DEC(__INTEL_COMPILER/10 % 10) +# if defined(__INTEL_COMPILER_UPDATE) +# define COMPILER_VERSION_PATCH DEC(__INTEL_COMPILER_UPDATE) +# else +# define COMPILER_VERSION_PATCH DEC(__INTEL_COMPILER % 10) +# endif +# else +# define COMPILER_VERSION_MAJOR DEC(__INTEL_COMPILER) +# define COMPILER_VERSION_MINOR DEC(__INTEL_COMPILER_UPDATE) + /* The third version component from --version is an update index, + but no macro is provided for it. */ +# define COMPILER_VERSION_PATCH DEC(0) +# endif +# if defined(__INTEL_COMPILER_BUILD_DATE) + /* __INTEL_COMPILER_BUILD_DATE = YYYYMMDD */ +# define COMPILER_VERSION_TWEAK DEC(__INTEL_COMPILER_BUILD_DATE) +# endif +# if defined(_MSC_VER) + /* _MSC_VER = VVRR */ +# define SIMULATE_VERSION_MAJOR DEC(_MSC_VER / 100) +# define SIMULATE_VERSION_MINOR DEC(_MSC_VER % 100) +# endif +# if defined(__GNUC__) +# define SIMULATE_VERSION_MAJOR DEC(__GNUC__) +# elif defined(__GNUG__) +# define SIMULATE_VERSION_MAJOR DEC(__GNUG__) +# endif +# if defined(__GNUC_MINOR__) +# define SIMULATE_VERSION_MINOR DEC(__GNUC_MINOR__) +# endif +# if defined(__GNUC_PATCHLEVEL__) +# define SIMULATE_VERSION_PATCH DEC(__GNUC_PATCHLEVEL__) +# endif + +#elif (defined(__clang__) && defined(__INTEL_CLANG_COMPILER)) || defined(__INTEL_LLVM_COMPILER) +# define COMPILER_ID "IntelLLVM" +#if defined(_MSC_VER) +# define SIMULATE_ID "MSVC" +#endif +#if defined(__GNUC__) +# define SIMULATE_ID "GNU" +#endif +/* __INTEL_LLVM_COMPILER = VVVVRP prior to 2021.2.0, VVVVRRPP for 2021.2.0 and + * later. Look for 6 digit vs. 8 digit version number to decide encoding. + * VVVV is no smaller than the current year when a version is released. + */ +#if __INTEL_LLVM_COMPILER < 1000000L +# define COMPILER_VERSION_MAJOR DEC(__INTEL_LLVM_COMPILER/100) +# define COMPILER_VERSION_MINOR DEC(__INTEL_LLVM_COMPILER/10 % 10) +# define COMPILER_VERSION_PATCH DEC(__INTEL_LLVM_COMPILER % 10) +#else +# define COMPILER_VERSION_MAJOR DEC(__INTEL_LLVM_COMPILER/10000) +# define COMPILER_VERSION_MINOR DEC(__INTEL_LLVM_COMPILER/100 % 100) +# define COMPILER_VERSION_PATCH DEC(__INTEL_LLVM_COMPILER % 100) +#endif +#if defined(_MSC_VER) + /* _MSC_VER = VVRR */ +# define SIMULATE_VERSION_MAJOR DEC(_MSC_VER / 100) +# define SIMULATE_VERSION_MINOR DEC(_MSC_VER % 100) +#endif +#if defined(__GNUC__) +# define SIMULATE_VERSION_MAJOR DEC(__GNUC__) +#elif defined(__GNUG__) +# define SIMULATE_VERSION_MAJOR DEC(__GNUG__) +#endif +#if defined(__GNUC_MINOR__) +# define SIMULATE_VERSION_MINOR DEC(__GNUC_MINOR__) +#endif +#if defined(__GNUC_PATCHLEVEL__) +# define SIMULATE_VERSION_PATCH DEC(__GNUC_PATCHLEVEL__) +#endif + +#elif defined(__PATHCC__) +# define COMPILER_ID "PathScale" +# define COMPILER_VERSION_MAJOR DEC(__PATHCC__) +# define COMPILER_VERSION_MINOR DEC(__PATHCC_MINOR__) +# if defined(__PATHCC_PATCHLEVEL__) +# define COMPILER_VERSION_PATCH DEC(__PATHCC_PATCHLEVEL__) +# endif + +#elif defined(__BORLANDC__) && defined(__CODEGEARC_VERSION__) +# define COMPILER_ID "Embarcadero" +# define COMPILER_VERSION_MAJOR HEX(__CODEGEARC_VERSION__>>24 & 0x00FF) +# define COMPILER_VERSION_MINOR HEX(__CODEGEARC_VERSION__>>16 & 0x00FF) +# define COMPILER_VERSION_PATCH DEC(__CODEGEARC_VERSION__ & 0xFFFF) + +#elif defined(__BORLANDC__) +# define COMPILER_ID "Borland" + /* __BORLANDC__ = 0xVRR */ +# define COMPILER_VERSION_MAJOR HEX(__BORLANDC__>>8) +# define COMPILER_VERSION_MINOR HEX(__BORLANDC__ & 0xFF) + +#elif defined(__WATCOMC__) && __WATCOMC__ < 1200 +# define COMPILER_ID "Watcom" + /* __WATCOMC__ = VVRR */ +# define COMPILER_VERSION_MAJOR DEC(__WATCOMC__ / 100) +# define COMPILER_VERSION_MINOR DEC((__WATCOMC__ / 10) % 10) +# if (__WATCOMC__ % 10) > 0 +# define COMPILER_VERSION_PATCH DEC(__WATCOMC__ % 10) +# endif + +#elif defined(__WATCOMC__) +# define COMPILER_ID "OpenWatcom" + /* __WATCOMC__ = VVRP + 1100 */ +# define COMPILER_VERSION_MAJOR DEC((__WATCOMC__ - 1100) / 100) +# define COMPILER_VERSION_MINOR DEC((__WATCOMC__ / 10) % 10) +# if (__WATCOMC__ % 10) > 0 +# define COMPILER_VERSION_PATCH DEC(__WATCOMC__ % 10) +# endif + +#elif defined(__SUNPRO_CC) +# define COMPILER_ID "SunPro" +# if __SUNPRO_CC >= 0x5100 + /* __SUNPRO_CC = 0xVRRP */ +# define COMPILER_VERSION_MAJOR HEX(__SUNPRO_CC>>12) +# define COMPILER_VERSION_MINOR HEX(__SUNPRO_CC>>4 & 0xFF) +# define COMPILER_VERSION_PATCH HEX(__SUNPRO_CC & 0xF) +# else + /* __SUNPRO_CC = 0xVRP */ +# define COMPILER_VERSION_MAJOR HEX(__SUNPRO_CC>>8) +# define COMPILER_VERSION_MINOR HEX(__SUNPRO_CC>>4 & 0xF) +# define COMPILER_VERSION_PATCH HEX(__SUNPRO_CC & 0xF) +# endif + +#elif defined(__HP_aCC) +# define COMPILER_ID "HP" + /* __HP_aCC = VVRRPP */ +# define COMPILER_VERSION_MAJOR DEC(__HP_aCC/10000) +# define COMPILER_VERSION_MINOR DEC(__HP_aCC/100 % 100) +# define COMPILER_VERSION_PATCH DEC(__HP_aCC % 100) + +#elif defined(__DECCXX) +# define COMPILER_ID "Compaq" + /* __DECCXX_VER = VVRRTPPPP */ +# define COMPILER_VERSION_MAJOR DEC(__DECCXX_VER/10000000) +# define COMPILER_VERSION_MINOR DEC(__DECCXX_VER/100000 % 100) +# define COMPILER_VERSION_PATCH DEC(__DECCXX_VER % 10000) + +#elif defined(__IBMCPP__) && defined(__COMPILER_VER__) +# define COMPILER_ID "zOS" + /* __IBMCPP__ = VRP */ +# define COMPILER_VERSION_MAJOR DEC(__IBMCPP__/100) +# define COMPILER_VERSION_MINOR DEC(__IBMCPP__/10 % 10) +# define COMPILER_VERSION_PATCH DEC(__IBMCPP__ % 10) + +#elif defined(__open_xl__) && defined(__clang__) +# define COMPILER_ID "IBMClang" +# define COMPILER_VERSION_MAJOR DEC(__open_xl_version__) +# define COMPILER_VERSION_MINOR DEC(__open_xl_release__) +# define COMPILER_VERSION_PATCH DEC(__open_xl_modification__) +# define COMPILER_VERSION_TWEAK DEC(__open_xl_ptf_fix_level__) + + +#elif defined(__ibmxl__) && defined(__clang__) +# define COMPILER_ID "XLClang" +# define COMPILER_VERSION_MAJOR DEC(__ibmxl_version__) +# define COMPILER_VERSION_MINOR DEC(__ibmxl_release__) +# define COMPILER_VERSION_PATCH DEC(__ibmxl_modification__) +# define COMPILER_VERSION_TWEAK DEC(__ibmxl_ptf_fix_level__) + + +#elif defined(__IBMCPP__) && !defined(__COMPILER_VER__) && __IBMCPP__ >= 800 +# define COMPILER_ID "XL" + /* __IBMCPP__ = VRP */ +# define COMPILER_VERSION_MAJOR DEC(__IBMCPP__/100) +# define COMPILER_VERSION_MINOR DEC(__IBMCPP__/10 % 10) +# define COMPILER_VERSION_PATCH DEC(__IBMCPP__ % 10) + +#elif defined(__IBMCPP__) && !defined(__COMPILER_VER__) && __IBMCPP__ < 800 +# define COMPILER_ID "VisualAge" + /* __IBMCPP__ = VRP */ +# define COMPILER_VERSION_MAJOR DEC(__IBMCPP__/100) +# define COMPILER_VERSION_MINOR DEC(__IBMCPP__/10 % 10) +# define COMPILER_VERSION_PATCH DEC(__IBMCPP__ % 10) + +#elif defined(__NVCOMPILER) +# define COMPILER_ID "NVHPC" +# define COMPILER_VERSION_MAJOR DEC(__NVCOMPILER_MAJOR__) +# define COMPILER_VERSION_MINOR DEC(__NVCOMPILER_MINOR__) +# if defined(__NVCOMPILER_PATCHLEVEL__) +# define COMPILER_VERSION_PATCH DEC(__NVCOMPILER_PATCHLEVEL__) +# endif + +#elif defined(__PGI) +# define COMPILER_ID "PGI" +# define COMPILER_VERSION_MAJOR DEC(__PGIC__) +# define COMPILER_VERSION_MINOR DEC(__PGIC_MINOR__) +# if defined(__PGIC_PATCHLEVEL__) +# define COMPILER_VERSION_PATCH DEC(__PGIC_PATCHLEVEL__) +# endif + +#elif defined(__clang__) && defined(__cray__) +# define COMPILER_ID "CrayClang" +# define COMPILER_VERSION_MAJOR DEC(__cray_major__) +# define COMPILER_VERSION_MINOR DEC(__cray_minor__) +# define COMPILER_VERSION_PATCH DEC(__cray_patchlevel__) +# define COMPILER_VERSION_INTERNAL_STR __clang_version__ + + +#elif defined(_CRAYC) +# define COMPILER_ID "Cray" +# define COMPILER_VERSION_MAJOR DEC(_RELEASE_MAJOR) +# define COMPILER_VERSION_MINOR DEC(_RELEASE_MINOR) + +#elif defined(__TI_COMPILER_VERSION__) +# define COMPILER_ID "TI" + /* __TI_COMPILER_VERSION__ = VVVRRRPPP */ +# define COMPILER_VERSION_MAJOR DEC(__TI_COMPILER_VERSION__/1000000) +# define COMPILER_VERSION_MINOR DEC(__TI_COMPILER_VERSION__/1000 % 1000) +# define COMPILER_VERSION_PATCH DEC(__TI_COMPILER_VERSION__ % 1000) + +#elif defined(__CLANG_FUJITSU) +# define COMPILER_ID "FujitsuClang" +# define COMPILER_VERSION_MAJOR DEC(__FCC_major__) +# define COMPILER_VERSION_MINOR DEC(__FCC_minor__) +# define COMPILER_VERSION_PATCH DEC(__FCC_patchlevel__) +# define COMPILER_VERSION_INTERNAL_STR __clang_version__ + + +#elif defined(__FUJITSU) +# define COMPILER_ID "Fujitsu" +# if defined(__FCC_version__) +# define COMPILER_VERSION __FCC_version__ +# elif defined(__FCC_major__) +# define COMPILER_VERSION_MAJOR DEC(__FCC_major__) +# define COMPILER_VERSION_MINOR DEC(__FCC_minor__) +# define COMPILER_VERSION_PATCH DEC(__FCC_patchlevel__) +# endif +# if defined(__fcc_version) +# define COMPILER_VERSION_INTERNAL DEC(__fcc_version) +# elif defined(__FCC_VERSION) +# define COMPILER_VERSION_INTERNAL DEC(__FCC_VERSION) +# endif + + +#elif defined(__ghs__) +# define COMPILER_ID "GHS" +/* __GHS_VERSION_NUMBER = VVVVRP */ +# ifdef __GHS_VERSION_NUMBER +# define COMPILER_VERSION_MAJOR DEC(__GHS_VERSION_NUMBER / 100) +# define COMPILER_VERSION_MINOR DEC(__GHS_VERSION_NUMBER / 10 % 10) +# define COMPILER_VERSION_PATCH DEC(__GHS_VERSION_NUMBER % 10) +# endif + +#elif defined(__TASKING__) +# define COMPILER_ID "Tasking" + # define COMPILER_VERSION_MAJOR DEC(__VERSION__/1000) + # define COMPILER_VERSION_MINOR DEC(__VERSION__ % 100) +# define COMPILER_VERSION_INTERNAL DEC(__VERSION__) + +#elif defined(__ORANGEC__) +# define COMPILER_ID "OrangeC" +# define COMPILER_VERSION_MAJOR DEC(__ORANGEC_MAJOR__) +# define COMPILER_VERSION_MINOR DEC(__ORANGEC_MINOR__) +# define COMPILER_VERSION_PATCH DEC(__ORANGEC_PATCHLEVEL__) + +#elif defined(__SCO_VERSION__) +# define COMPILER_ID "SCO" + +#elif defined(__ARMCC_VERSION) && !defined(__clang__) +# define COMPILER_ID "ARMCC" +#if __ARMCC_VERSION >= 1000000 + /* __ARMCC_VERSION = VRRPPPP */ + # define COMPILER_VERSION_MAJOR DEC(__ARMCC_VERSION/1000000) + # define COMPILER_VERSION_MINOR DEC(__ARMCC_VERSION/10000 % 100) + # define COMPILER_VERSION_PATCH DEC(__ARMCC_VERSION % 10000) +#else + /* __ARMCC_VERSION = VRPPPP */ + # define COMPILER_VERSION_MAJOR DEC(__ARMCC_VERSION/100000) + # define COMPILER_VERSION_MINOR DEC(__ARMCC_VERSION/10000 % 10) + # define COMPILER_VERSION_PATCH DEC(__ARMCC_VERSION % 10000) +#endif + + +#elif defined(__clang__) && defined(__apple_build_version__) +# define COMPILER_ID "AppleClang" +# if defined(_MSC_VER) +# define SIMULATE_ID "MSVC" +# endif +# define COMPILER_VERSION_MAJOR DEC(__clang_major__) +# define COMPILER_VERSION_MINOR DEC(__clang_minor__) +# define COMPILER_VERSION_PATCH DEC(__clang_patchlevel__) +# if defined(_MSC_VER) + /* _MSC_VER = VVRR */ +# define SIMULATE_VERSION_MAJOR DEC(_MSC_VER / 100) +# define SIMULATE_VERSION_MINOR DEC(_MSC_VER % 100) +# endif +# define COMPILER_VERSION_TWEAK DEC(__apple_build_version__) + +#elif defined(__clang__) && defined(__ARMCOMPILER_VERSION) +# define COMPILER_ID "ARMClang" + # define COMPILER_VERSION_MAJOR DEC(__ARMCOMPILER_VERSION/1000000) + # define COMPILER_VERSION_MINOR DEC(__ARMCOMPILER_VERSION/10000 % 100) + # define COMPILER_VERSION_PATCH DEC(__ARMCOMPILER_VERSION/100 % 100) +# define COMPILER_VERSION_INTERNAL DEC(__ARMCOMPILER_VERSION) + +#elif defined(__clang__) && defined(__ti__) +# define COMPILER_ID "TIClang" + # define COMPILER_VERSION_MAJOR DEC(__ti_major__) + # define COMPILER_VERSION_MINOR DEC(__ti_minor__) + # define COMPILER_VERSION_PATCH DEC(__ti_patchlevel__) +# define COMPILER_VERSION_INTERNAL DEC(__ti_version__) + +#elif defined(__clang__) +# define COMPILER_ID "Clang" +# if defined(_MSC_VER) +# define SIMULATE_ID "MSVC" +# endif +# define COMPILER_VERSION_MAJOR DEC(__clang_major__) +# define COMPILER_VERSION_MINOR DEC(__clang_minor__) +# define COMPILER_VERSION_PATCH DEC(__clang_patchlevel__) +# if defined(_MSC_VER) + /* _MSC_VER = VVRR */ +# define SIMULATE_VERSION_MAJOR DEC(_MSC_VER / 100) +# define SIMULATE_VERSION_MINOR DEC(_MSC_VER % 100) +# endif + +#elif defined(__LCC__) && (defined(__GNUC__) || defined(__GNUG__) || defined(__MCST__)) +# define COMPILER_ID "LCC" +# define COMPILER_VERSION_MAJOR DEC(__LCC__ / 100) +# define COMPILER_VERSION_MINOR DEC(__LCC__ % 100) +# if defined(__LCC_MINOR__) +# define COMPILER_VERSION_PATCH DEC(__LCC_MINOR__) +# endif +# if defined(__GNUC__) && defined(__GNUC_MINOR__) +# define SIMULATE_ID "GNU" +# define SIMULATE_VERSION_MAJOR DEC(__GNUC__) +# define SIMULATE_VERSION_MINOR DEC(__GNUC_MINOR__) +# if defined(__GNUC_PATCHLEVEL__) +# define SIMULATE_VERSION_PATCH DEC(__GNUC_PATCHLEVEL__) +# endif +# endif + +#elif defined(__GNUC__) || defined(__GNUG__) +# define COMPILER_ID "GNU" +# if defined(__GNUC__) +# define COMPILER_VERSION_MAJOR DEC(__GNUC__) +# else +# define COMPILER_VERSION_MAJOR DEC(__GNUG__) +# endif +# if defined(__GNUC_MINOR__) +# define COMPILER_VERSION_MINOR DEC(__GNUC_MINOR__) +# endif +# if defined(__GNUC_PATCHLEVEL__) +# define COMPILER_VERSION_PATCH DEC(__GNUC_PATCHLEVEL__) +# endif + +#elif defined(_MSC_VER) +# define COMPILER_ID "MSVC" + /* _MSC_VER = VVRR */ +# define COMPILER_VERSION_MAJOR DEC(_MSC_VER / 100) +# define COMPILER_VERSION_MINOR DEC(_MSC_VER % 100) +# if defined(_MSC_FULL_VER) +# if _MSC_VER >= 1400 + /* _MSC_FULL_VER = VVRRPPPPP */ +# define COMPILER_VERSION_PATCH DEC(_MSC_FULL_VER % 100000) +# else + /* _MSC_FULL_VER = VVRRPPPP */ +# define COMPILER_VERSION_PATCH DEC(_MSC_FULL_VER % 10000) +# endif +# endif +# if defined(_MSC_BUILD) +# define COMPILER_VERSION_TWEAK DEC(_MSC_BUILD) +# endif + +#elif defined(_ADI_COMPILER) +# define COMPILER_ID "ADSP" +#if defined(__VERSIONNUM__) + /* __VERSIONNUM__ = 0xVVRRPPTT */ +# define COMPILER_VERSION_MAJOR DEC(__VERSIONNUM__ >> 24 & 0xFF) +# define COMPILER_VERSION_MINOR DEC(__VERSIONNUM__ >> 16 & 0xFF) +# define COMPILER_VERSION_PATCH DEC(__VERSIONNUM__ >> 8 & 0xFF) +# define COMPILER_VERSION_TWEAK DEC(__VERSIONNUM__ & 0xFF) +#endif + +#elif defined(__IAR_SYSTEMS_ICC__) || defined(__IAR_SYSTEMS_ICC) +# define COMPILER_ID "IAR" +# if defined(__VER__) && defined(__ICCARM__) +# define COMPILER_VERSION_MAJOR DEC((__VER__) / 1000000) +# define COMPILER_VERSION_MINOR DEC(((__VER__) / 1000) % 1000) +# define COMPILER_VERSION_PATCH DEC((__VER__) % 1000) +# define COMPILER_VERSION_INTERNAL DEC(__IAR_SYSTEMS_ICC__) +# elif defined(__VER__) && (defined(__ICCAVR__) || defined(__ICCRX__) || defined(__ICCRH850__) || defined(__ICCRL78__) || defined(__ICC430__) || defined(__ICCRISCV__) || defined(__ICCV850__) || defined(__ICC8051__) || defined(__ICCSTM8__)) +# define COMPILER_VERSION_MAJOR DEC((__VER__) / 100) +# define COMPILER_VERSION_MINOR DEC((__VER__) - (((__VER__) / 100)*100)) +# define COMPILER_VERSION_PATCH DEC(__SUBVERSION__) +# define COMPILER_VERSION_INTERNAL DEC(__IAR_SYSTEMS_ICC__) +# endif + + +/* These compilers are either not known or too old to define an + identification macro. Try to identify the platform and guess that + it is the native compiler. */ +#elif defined(__hpux) || defined(__hpua) +# define COMPILER_ID "HP" + +#else /* unknown compiler */ +# define COMPILER_ID "" +#endif + +/* Construct the string literal in pieces to prevent the source from + getting matched. Store it in a pointer rather than an array + because some compilers will just produce instructions to fill the + array rather than assigning a pointer to a static array. */ +char const* info_compiler = "INFO" ":" "compiler[" COMPILER_ID "]"; +#ifdef SIMULATE_ID +char const* info_simulate = "INFO" ":" "simulate[" SIMULATE_ID "]"; +#endif + +#ifdef __QNXNTO__ +char const* qnxnto = "INFO" ":" "qnxnto[]"; +#endif + +#if defined(__CRAYXT_COMPUTE_LINUX_TARGET) +char const *info_cray = "INFO" ":" "compiler_wrapper[CrayPrgEnv]"; +#endif + +#define STRINGIFY_HELPER(X) #X +#define STRINGIFY(X) STRINGIFY_HELPER(X) + +/* Identify known platforms by name. */ +#if defined(__linux) || defined(__linux__) || defined(linux) +# define PLATFORM_ID "Linux" + +#elif defined(__MSYS__) +# define PLATFORM_ID "MSYS" + +#elif defined(__CYGWIN__) +# define PLATFORM_ID "Cygwin" + +#elif defined(__MINGW32__) +# define PLATFORM_ID "MinGW" + +#elif defined(__APPLE__) +# define PLATFORM_ID "Darwin" + +#elif defined(_WIN32) || defined(__WIN32__) || defined(WIN32) +# define PLATFORM_ID "Windows" + +#elif defined(__FreeBSD__) || defined(__FreeBSD) +# define PLATFORM_ID "FreeBSD" + +#elif defined(__NetBSD__) || defined(__NetBSD) +# define PLATFORM_ID "NetBSD" + +#elif defined(__OpenBSD__) || defined(__OPENBSD) +# define PLATFORM_ID "OpenBSD" + +#elif defined(__sun) || defined(sun) +# define PLATFORM_ID "SunOS" + +#elif defined(_AIX) || defined(__AIX) || defined(__AIX__) || defined(__aix) || defined(__aix__) +# define PLATFORM_ID "AIX" + +#elif defined(__hpux) || defined(__hpux__) +# define PLATFORM_ID "HP-UX" + +#elif defined(__HAIKU__) +# define PLATFORM_ID "Haiku" + +#elif defined(__BeOS) || defined(__BEOS__) || defined(_BEOS) +# define PLATFORM_ID "BeOS" + +#elif defined(__QNX__) || defined(__QNXNTO__) +# define PLATFORM_ID "QNX" + +#elif defined(__tru64) || defined(_tru64) || defined(__TRU64__) +# define PLATFORM_ID "Tru64" + +#elif defined(__riscos) || defined(__riscos__) +# define PLATFORM_ID "RISCos" + +#elif defined(__sinix) || defined(__sinix__) || defined(__SINIX__) +# define PLATFORM_ID "SINIX" + +#elif defined(__UNIX_SV__) +# define PLATFORM_ID "UNIX_SV" + +#elif defined(__bsdos__) +# define PLATFORM_ID "BSDOS" + +#elif defined(_MPRAS) || defined(MPRAS) +# define PLATFORM_ID "MP-RAS" + +#elif defined(__osf) || defined(__osf__) +# define PLATFORM_ID "OSF1" + +#elif defined(_SCO_SV) || defined(SCO_SV) || defined(sco_sv) +# define PLATFORM_ID "SCO_SV" + +#elif defined(__ultrix) || defined(__ultrix__) || defined(_ULTRIX) +# define PLATFORM_ID "ULTRIX" + +#elif defined(__XENIX__) || defined(_XENIX) || defined(XENIX) +# define PLATFORM_ID "Xenix" + +#elif defined(__WATCOMC__) +# if defined(__LINUX__) +# define PLATFORM_ID "Linux" + +# elif defined(__DOS__) +# define PLATFORM_ID "DOS" + +# elif defined(__OS2__) +# define PLATFORM_ID "OS2" + +# elif defined(__WINDOWS__) +# define PLATFORM_ID "Windows3x" + +# elif defined(__VXWORKS__) +# define PLATFORM_ID "VxWorks" + +# else /* unknown platform */ +# define PLATFORM_ID +# endif + +#elif defined(__INTEGRITY) +# if defined(INT_178B) +# define PLATFORM_ID "Integrity178" + +# else /* regular Integrity */ +# define PLATFORM_ID "Integrity" +# endif + +# elif defined(_ADI_COMPILER) +# define PLATFORM_ID "ADSP" + +#else /* unknown platform */ +# define PLATFORM_ID + +#endif + +/* For windows compilers MSVC and Intel we can determine + the architecture of the compiler being used. This is because + the compilers do not have flags that can change the architecture, + but rather depend on which compiler is being used +*/ +#if defined(_WIN32) && defined(_MSC_VER) +# if defined(_M_IA64) +# define ARCHITECTURE_ID "IA64" + +# elif defined(_M_ARM64EC) +# define ARCHITECTURE_ID "ARM64EC" + +# elif defined(_M_X64) || defined(_M_AMD64) +# define ARCHITECTURE_ID "x64" + +# elif defined(_M_IX86) +# define ARCHITECTURE_ID "X86" + +# elif defined(_M_ARM64) +# define ARCHITECTURE_ID "ARM64" + +# elif defined(_M_ARM) +# if _M_ARM == 4 +# define ARCHITECTURE_ID "ARMV4I" +# elif _M_ARM == 5 +# define ARCHITECTURE_ID "ARMV5I" +# else +# define ARCHITECTURE_ID "ARMV" STRINGIFY(_M_ARM) +# endif + +# elif defined(_M_MIPS) +# define ARCHITECTURE_ID "MIPS" + +# elif defined(_M_SH) +# define ARCHITECTURE_ID "SHx" + +# else /* unknown architecture */ +# define ARCHITECTURE_ID "" +# endif + +#elif defined(__WATCOMC__) +# if defined(_M_I86) +# define ARCHITECTURE_ID "I86" + +# elif defined(_M_IX86) +# define ARCHITECTURE_ID "X86" + +# else /* unknown architecture */ +# define ARCHITECTURE_ID "" +# endif + +#elif defined(__IAR_SYSTEMS_ICC__) || defined(__IAR_SYSTEMS_ICC) +# if defined(__ICCARM__) +# define ARCHITECTURE_ID "ARM" + +# elif defined(__ICCRX__) +# define ARCHITECTURE_ID "RX" + +# elif defined(__ICCRH850__) +# define ARCHITECTURE_ID "RH850" + +# elif defined(__ICCRL78__) +# define ARCHITECTURE_ID "RL78" + +# elif defined(__ICCRISCV__) +# define ARCHITECTURE_ID "RISCV" + +# elif defined(__ICCAVR__) +# define ARCHITECTURE_ID "AVR" + +# elif defined(__ICC430__) +# define ARCHITECTURE_ID "MSP430" + +# elif defined(__ICCV850__) +# define ARCHITECTURE_ID "V850" + +# elif defined(__ICC8051__) +# define ARCHITECTURE_ID "8051" + +# elif defined(__ICCSTM8__) +# define ARCHITECTURE_ID "STM8" + +# else /* unknown architecture */ +# define ARCHITECTURE_ID "" +# endif + +#elif defined(__ghs__) +# if defined(__PPC64__) +# define ARCHITECTURE_ID "PPC64" + +# elif defined(__ppc__) +# define ARCHITECTURE_ID "PPC" + +# elif defined(__ARM__) +# define ARCHITECTURE_ID "ARM" + +# elif defined(__x86_64__) +# define ARCHITECTURE_ID "x64" + +# elif defined(__i386__) +# define ARCHITECTURE_ID "X86" + +# else /* unknown architecture */ +# define ARCHITECTURE_ID "" +# endif + +#elif defined(__clang__) && defined(__ti__) +# if defined(__ARM_ARCH) +# define ARCHITECTURE_ID "Arm" + +# else /* unknown architecture */ +# define ARCHITECTURE_ID "" +# endif + +#elif defined(__TI_COMPILER_VERSION__) +# if defined(__TI_ARM__) +# define ARCHITECTURE_ID "ARM" + +# elif defined(__MSP430__) +# define ARCHITECTURE_ID "MSP430" + +# elif defined(__TMS320C28XX__) +# define ARCHITECTURE_ID "TMS320C28x" + +# elif defined(__TMS320C6X__) || defined(_TMS320C6X) +# define ARCHITECTURE_ID "TMS320C6x" + +# else /* unknown architecture */ +# define ARCHITECTURE_ID "" +# endif + +# elif defined(__ADSPSHARC__) +# define ARCHITECTURE_ID "SHARC" + +# elif defined(__ADSPBLACKFIN__) +# define ARCHITECTURE_ID "Blackfin" + +#elif defined(__TASKING__) + +# if defined(__CTC__) || defined(__CPTC__) +# define ARCHITECTURE_ID "TriCore" + +# elif defined(__CMCS__) +# define ARCHITECTURE_ID "MCS" + +# elif defined(__CARM__) +# define ARCHITECTURE_ID "ARM" + +# elif defined(__CARC__) +# define ARCHITECTURE_ID "ARC" + +# elif defined(__C51__) +# define ARCHITECTURE_ID "8051" + +# elif defined(__CPCP__) +# define ARCHITECTURE_ID "PCP" + +# else +# define ARCHITECTURE_ID "" +# endif + +#else +# define ARCHITECTURE_ID +#endif + +/* Convert integer to decimal digit literals. */ +#define DEC(n) \ + ('0' + (((n) / 10000000)%10)), \ + ('0' + (((n) / 1000000)%10)), \ + ('0' + (((n) / 100000)%10)), \ + ('0' + (((n) / 10000)%10)), \ + ('0' + (((n) / 1000)%10)), \ + ('0' + (((n) / 100)%10)), \ + ('0' + (((n) / 10)%10)), \ + ('0' + ((n) % 10)) + +/* Convert integer to hex digit literals. */ +#define HEX(n) \ + ('0' + ((n)>>28 & 0xF)), \ + ('0' + ((n)>>24 & 0xF)), \ + ('0' + ((n)>>20 & 0xF)), \ + ('0' + ((n)>>16 & 0xF)), \ + ('0' + ((n)>>12 & 0xF)), \ + ('0' + ((n)>>8 & 0xF)), \ + ('0' + ((n)>>4 & 0xF)), \ + ('0' + ((n) & 0xF)) + +/* Construct a string literal encoding the version number. */ +#ifdef COMPILER_VERSION +char const* info_version = "INFO" ":" "compiler_version[" COMPILER_VERSION "]"; + +/* Construct a string literal encoding the version number components. */ +#elif defined(COMPILER_VERSION_MAJOR) +char const info_version[] = { + 'I', 'N', 'F', 'O', ':', + 'c','o','m','p','i','l','e','r','_','v','e','r','s','i','o','n','[', + COMPILER_VERSION_MAJOR, +# ifdef COMPILER_VERSION_MINOR + '.', COMPILER_VERSION_MINOR, +# ifdef COMPILER_VERSION_PATCH + '.', COMPILER_VERSION_PATCH, +# ifdef COMPILER_VERSION_TWEAK + '.', COMPILER_VERSION_TWEAK, +# endif +# endif +# endif + ']','\0'}; +#endif + +/* Construct a string literal encoding the internal version number. */ +#ifdef COMPILER_VERSION_INTERNAL +char const info_version_internal[] = { + 'I', 'N', 'F', 'O', ':', + 'c','o','m','p','i','l','e','r','_','v','e','r','s','i','o','n','_', + 'i','n','t','e','r','n','a','l','[', + COMPILER_VERSION_INTERNAL,']','\0'}; +#elif defined(COMPILER_VERSION_INTERNAL_STR) +char const* info_version_internal = "INFO" ":" "compiler_version_internal[" COMPILER_VERSION_INTERNAL_STR "]"; +#endif + +/* Construct a string literal encoding the version number components. */ +#ifdef SIMULATE_VERSION_MAJOR +char const info_simulate_version[] = { + 'I', 'N', 'F', 'O', ':', + 's','i','m','u','l','a','t','e','_','v','e','r','s','i','o','n','[', + SIMULATE_VERSION_MAJOR, +# ifdef SIMULATE_VERSION_MINOR + '.', SIMULATE_VERSION_MINOR, +# ifdef SIMULATE_VERSION_PATCH + '.', SIMULATE_VERSION_PATCH, +# ifdef SIMULATE_VERSION_TWEAK + '.', SIMULATE_VERSION_TWEAK, +# endif +# endif +# endif + ']','\0'}; +#endif + +/* Construct the string literal in pieces to prevent the source from + getting matched. Store it in a pointer rather than an array + because some compilers will just produce instructions to fill the + array rather than assigning a pointer to a static array. */ +char const* info_platform = "INFO" ":" "platform[" PLATFORM_ID "]"; +char const* info_arch = "INFO" ":" "arch[" ARCHITECTURE_ID "]"; + + + +#define CXX_STD_98 199711L +#define CXX_STD_11 201103L +#define CXX_STD_14 201402L +#define CXX_STD_17 201703L +#define CXX_STD_20 202002L +#define CXX_STD_23 202302L + +#if defined(__INTEL_COMPILER) && defined(_MSVC_LANG) +# if _MSVC_LANG > CXX_STD_17 +# define CXX_STD _MSVC_LANG +# elif _MSVC_LANG == CXX_STD_17 && defined(__cpp_aggregate_paren_init) +# define CXX_STD CXX_STD_20 +# elif _MSVC_LANG > CXX_STD_14 && __cplusplus > CXX_STD_17 +# define CXX_STD CXX_STD_20 +# elif _MSVC_LANG > CXX_STD_14 +# define CXX_STD CXX_STD_17 +# elif defined(__INTEL_CXX11_MODE__) && defined(__cpp_aggregate_nsdmi) +# define CXX_STD CXX_STD_14 +# elif defined(__INTEL_CXX11_MODE__) +# define CXX_STD CXX_STD_11 +# else +# define CXX_STD CXX_STD_98 +# endif +#elif defined(_MSC_VER) && defined(_MSVC_LANG) +# if _MSVC_LANG > __cplusplus +# define CXX_STD _MSVC_LANG +# else +# define CXX_STD __cplusplus +# endif +#elif defined(__NVCOMPILER) +# if __cplusplus == CXX_STD_17 && defined(__cpp_aggregate_paren_init) +# define CXX_STD CXX_STD_20 +# else +# define CXX_STD __cplusplus +# endif +#elif defined(__INTEL_COMPILER) || defined(__PGI) +# if __cplusplus == CXX_STD_11 && defined(__cpp_namespace_attributes) +# define CXX_STD CXX_STD_17 +# elif __cplusplus == CXX_STD_11 && defined(__cpp_aggregate_nsdmi) +# define CXX_STD CXX_STD_14 +# else +# define CXX_STD __cplusplus +# endif +#elif (defined(__IBMCPP__) || defined(__ibmxl__)) && defined(__linux__) +# if __cplusplus == CXX_STD_11 && defined(__cpp_aggregate_nsdmi) +# define CXX_STD CXX_STD_14 +# else +# define CXX_STD __cplusplus +# endif +#elif __cplusplus == 1 && defined(__GXX_EXPERIMENTAL_CXX0X__) +# define CXX_STD CXX_STD_11 +#else +# define CXX_STD __cplusplus +#endif + +const char* info_language_standard_default = "INFO" ":" "standard_default[" +#if CXX_STD > CXX_STD_23 + "26" +#elif CXX_STD > CXX_STD_20 + "23" +#elif CXX_STD > CXX_STD_17 + "20" +#elif CXX_STD > CXX_STD_14 + "17" +#elif CXX_STD > CXX_STD_11 + "14" +#elif CXX_STD >= CXX_STD_11 + "11" +#else + "98" +#endif +"]"; + +const char* info_language_extensions_default = "INFO" ":" "extensions_default[" +#if (defined(__clang__) || defined(__GNUC__) || defined(__xlC__) || \ + defined(__TI_COMPILER_VERSION__)) && \ + !defined(__STRICT_ANSI__) + "ON" +#else + "OFF" +#endif +"]"; + +/*--------------------------------------------------------------------------*/ + +int main(int argc, char* argv[]) +{ + int require = 0; + require += info_compiler[argc]; + require += info_platform[argc]; + require += info_arch[argc]; +#ifdef COMPILER_VERSION_MAJOR + require += info_version[argc]; +#endif +#ifdef COMPILER_VERSION_INTERNAL + require += info_version_internal[argc]; +#endif +#ifdef SIMULATE_ID + require += info_simulate[argc]; +#endif +#ifdef SIMULATE_VERSION_MAJOR + require += info_simulate_version[argc]; +#endif +#if defined(__CRAYXT_COMPUTE_LINUX_TARGET) + require += info_cray[argc]; +#endif + require += info_language_standard_default[argc]; + require += info_language_extensions_default[argc]; + (void)argv; + return require; +} diff --git a/siro_rider/android/app/.cxx/Debug/3p4b322x/armeabi-v7a/CMakeFiles/3.31.5-g6cf5163/CompilerIdCXX/CMakeCXXCompilerId.o b/siro_rider/android/app/.cxx/Debug/3p4b322x/armeabi-v7a/CMakeFiles/3.31.5-g6cf5163/CompilerIdCXX/CMakeCXXCompilerId.o new file mode 100644 index 0000000..a762c3c Binary files /dev/null and b/siro_rider/android/app/.cxx/Debug/3p4b322x/armeabi-v7a/CMakeFiles/3.31.5-g6cf5163/CompilerIdCXX/CMakeCXXCompilerId.o differ diff --git a/siro_rider/android/app/.cxx/Debug/3p4b322x/armeabi-v7a/CMakeFiles/CMakeConfigureLog.yaml b/siro_rider/android/app/.cxx/Debug/3p4b322x/armeabi-v7a/CMakeFiles/CMakeConfigureLog.yaml new file mode 100644 index 0000000..6748d72 --- /dev/null +++ b/siro_rider/android/app/.cxx/Debug/3p4b322x/armeabi-v7a/CMakeFiles/CMakeConfigureLog.yaml @@ -0,0 +1,411 @@ + +--- +events: + - + kind: "message-v1" + backtrace: + - "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeDetermineSystem.cmake:200 (message)" + - "CMakeLists.txt:2 (project)" + message: | + The target system is: Android - 1 - armv7-a + The host system is: Darwin - 24.5.0 - arm64 + - + kind: "message-v1" + backtrace: + - "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeDetermineCompilerId.cmake:17 (message)" + - "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeDetermineCompilerId.cmake:64 (__determine_compiler_id_test)" + - "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeDetermineCCompiler.cmake:123 (CMAKE_DETERMINE_COMPILER_ID)" + - "CMakeLists.txt:2 (project)" + message: | + Compiling the C compiler identification source file "CMakeCCompilerId.c" succeeded. + Compiler: /Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/bin/clang + Build flags: -g;-DANDROID;-fdata-sections;-ffunction-sections;-funwind-tables;-fstack-protector-strong;-no-canonical-prefixes;-D_FORTIFY_SOURCE=2;-march=armv7-a;-mthumb;-Wformat;-Werror=format-security + Id flags: -c;--target=armv7-none-linux-androideabi23 + + The output was: + 0 + + + Compilation of the C compiler identification source "CMakeCCompilerId.c" produced "CMakeCCompilerId.o" + + The C compiler identification is Clang, found in: + /Users/hamzaaleghwairyeen/development/App/Intaleq/android/app/.cxx/Debug/3p4b322x/armeabi-v7a/CMakeFiles/3.31.5-g6cf5163/CompilerIdC/CMakeCCompilerId.o + + - + kind: "message-v1" + backtrace: + - "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeDetermineCompilerId.cmake:17 (message)" + - "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeDetermineCompilerId.cmake:64 (__determine_compiler_id_test)" + - "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeDetermineCXXCompiler.cmake:126 (CMAKE_DETERMINE_COMPILER_ID)" + - "CMakeLists.txt:2 (project)" + message: | + Compiling the CXX compiler identification source file "CMakeCXXCompilerId.cpp" succeeded. + Compiler: /Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/bin/clang++ + Build flags: -g;-DANDROID;-fdata-sections;-ffunction-sections;-funwind-tables;-fstack-protector-strong;-no-canonical-prefixes;-D_FORTIFY_SOURCE=2;-march=armv7-a;-mthumb;-Wformat;-Werror=format-security + Id flags: -c;--target=armv7-none-linux-androideabi23 + + The output was: + 0 + + + Compilation of the CXX compiler identification source "CMakeCXXCompilerId.cpp" produced "CMakeCXXCompilerId.o" + + The CXX compiler identification is Clang, found in: + /Users/hamzaaleghwairyeen/development/App/Intaleq/android/app/.cxx/Debug/3p4b322x/armeabi-v7a/CMakeFiles/3.31.5-g6cf5163/CompilerIdCXX/CMakeCXXCompilerId.o + + - + kind: "try_compile-v1" + backtrace: + - "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeDetermineCompilerABI.cmake:74 (try_compile)" + - "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeTestCCompiler.cmake:26 (CMAKE_DETERMINE_COMPILER_ABI)" + - "CMakeLists.txt:2 (project)" + checks: + - "Detecting C compiler ABI info" + directories: + source: "/Users/hamzaaleghwairyeen/development/App/Intaleq/android/app/.cxx/Debug/3p4b322x/armeabi-v7a/CMakeFiles/CMakeScratch/TryCompile-NVWubC" + binary: "/Users/hamzaaleghwairyeen/development/App/Intaleq/android/app/.cxx/Debug/3p4b322x/armeabi-v7a/CMakeFiles/CMakeScratch/TryCompile-NVWubC" + cmakeVariables: + ANDROID_ABI: "armeabi-v7a" + ANDROID_ARM_MODE: "thumb" + ANDROID_ARM_NEON: "TRUE" + ANDROID_PIE: "TRUE" + ANDROID_PLATFORM: "android-23" + ANDROID_STL: "c++_static" + ANDROID_TOOLCHAIN: "clang" + CMAKE_CXX_COMPILER_CLANG_SCAN_DEPS: "/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/bin/clang-scan-deps" + CMAKE_CXX_COMPILER_TARGET: "armv7-none-linux-androideabi23" + CMAKE_C_COMPILER_TARGET: "armv7-none-linux-androideabi23" + CMAKE_C_FLAGS: "-g -DANDROID -fdata-sections -ffunction-sections -funwind-tables -fstack-protector-strong -no-canonical-prefixes -D_FORTIFY_SOURCE=2 -march=armv7-a -mthumb -Wformat " + CMAKE_C_FLAGS_DEBUG: "-fno-limit-debug-info " + CMAKE_EXE_LINKER_FLAGS: "-static-libstdc++ -Wl,--build-id=sha1 -Wl,--no-rosegment -Wl,--no-undefined-version -Wl,--fatal-warnings -Wl,--no-undefined -Qunused-arguments " + CMAKE_POSITION_INDEPENDENT_CODE: "TRUE" + CMAKE_SYSROOT: "/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot" + buildResult: + variable: "CMAKE_C_ABI_COMPILED" + cached: true + stdout: | + Change Dir: '/Users/hamzaaleghwairyeen/development/App/Intaleq/android/app/.cxx/Debug/3p4b322x/armeabi-v7a/CMakeFiles/CMakeScratch/TryCompile-NVWubC' + + Run Build Command(s): /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/bin/ninja -v cmTC_0bd87 + [1/2] /Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/bin/clang --target=armv7-none-linux-androideabi23 --sysroot=/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot -g -DANDROID -fdata-sections -ffunction-sections -funwind-tables -fstack-protector-strong -no-canonical-prefixes -D_FORTIFY_SOURCE=2 -march=armv7-a -mthumb -Wformat -fPIE -v -MD -MT CMakeFiles/cmTC_0bd87.dir/CMakeCCompilerABI.c.o -MF CMakeFiles/cmTC_0bd87.dir/CMakeCCompilerABI.c.o.d -o CMakeFiles/cmTC_0bd87.dir/CMakeCCompilerABI.c.o -c /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeCCompilerABI.c + Android (12027248, +pgo, -bolt, +lto, -mlgo, based on r522817) clang version 18.0.1 (https://android.googlesource.com/toolchain/llvm-project d8003a456d14a3deb8054cdaa529ffbf02d9b262) + Target: armv7-none-linux-android23 + Thread model: posix + InstalledDir: /Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/bin + (in-process) + "/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/bin/clang" -cc1 -triple thumbv7-none-linux-android23 -emit-obj -mrelax-all -disable-free -clear-ast-before-backend -disable-llvm-verifier -discard-value-names -main-file-name CMakeCCompilerABI.c -mrelocation-model pic -pic-level 2 -pic-is-pie -mframe-pointer=all -ffp-contract=on -fno-rounding-math -mconstructor-aliases -funwind-tables=1 -target-cpu generic -target-feature +soft-float-abi -target-feature +vfp2 -target-feature +vfp2sp -target-feature +vfp3 -target-feature +vfp3d16 -target-feature +vfp3d16sp -target-feature +vfp3sp -target-feature -fp16 -target-feature -vfp4 -target-feature -vfp4d16 -target-feature -vfp4d16sp -target-feature -vfp4sp -target-feature -fp-armv8 -target-feature -fp-armv8d16 -target-feature -fp-armv8d16sp -target-feature -fp-armv8sp -target-feature -fullfp16 -target-feature +fp64 -target-feature +d32 -target-feature +neon -target-feature -sha2 -target-feature -aes -target-feature -fp16fml -target-abi aapcs-linux -mfloat-abi soft -debug-info-kind=constructor -dwarf-version=4 -debugger-tuning=gdb -fdebug-compilation-dir=/Users/hamzaaleghwairyeen/development/App/Intaleq/android/app/.cxx/Debug/3p4b322x/armeabi-v7a/CMakeFiles/CMakeScratch/TryCompile-NVWubC -v -ffunction-sections -fdata-sections -fcoverage-compilation-dir=/Users/hamzaaleghwairyeen/development/App/Intaleq/android/app/.cxx/Debug/3p4b322x/armeabi-v7a/CMakeFiles/CMakeScratch/TryCompile-NVWubC -resource-dir /Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/lib/clang/18 -dependency-file CMakeFiles/cmTC_0bd87.dir/CMakeCCompilerABI.c.o.d -MT CMakeFiles/cmTC_0bd87.dir/CMakeCCompilerABI.c.o -sys-header-deps -D ANDROID -D _FORTIFY_SOURCE=2 -isysroot /Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot -internal-isystem /Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/lib/clang/18/include -internal-isystem /Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/local/include -internal-externc-isystem /Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/include/arm-linux-androideabi -internal-externc-isystem /Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/include -internal-externc-isystem /Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/include -Wformat -ferror-limit 19 -femulated-tls -stack-protector 2 -fno-signed-char -fgnuc-version=4.2.1 -D__GCC_HAVE_DWARF2_CFI_ASM=1 -o CMakeFiles/cmTC_0bd87.dir/CMakeCCompilerABI.c.o -x c /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeCCompilerABI.c + clang -cc1 version 18.0.1 based upon LLVM 18.0.1 default target x86_64-apple-darwin24.5.0 + ignoring nonexistent directory "/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/local/include" + ignoring nonexistent directory "/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/include" + #include "..." search starts here: + #include <...> search starts here: + /Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/lib/clang/18/include + /Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/include/arm-linux-androideabi + /Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/include + End of search list. + [2/2] : && /Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/bin/clang --target=armv7-none-linux-androideabi23 --sysroot=/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot -g -DANDROID -fdata-sections -ffunction-sections -funwind-tables -fstack-protector-strong -no-canonical-prefixes -D_FORTIFY_SOURCE=2 -march=armv7-a -mthumb -Wformat -static-libstdc++ -Wl,--build-id=sha1 -Wl,--no-rosegment -Wl,--no-undefined-version -Wl,--fatal-warnings -Wl,--no-undefined -Qunused-arguments -v CMakeFiles/cmTC_0bd87.dir/CMakeCCompilerABI.c.o -o cmTC_0bd87 && : + Android (12027248, +pgo, -bolt, +lto, -mlgo, based on r522817) clang version 18.0.1 (https://android.googlesource.com/toolchain/llvm-project d8003a456d14a3deb8054cdaa529ffbf02d9b262) + Target: armv7-none-linux-android23 + Thread model: posix + InstalledDir: /Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/bin + "/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/bin/ld.lld" --sysroot=/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot -EL -z now -z relro -z max-page-size=4096 -X --hash-style=gnu --eh-frame-hdr -m armelf_linux_eabi -pie -dynamic-linker /system/bin/linker -o cmTC_0bd87 /Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/lib/arm-linux-androideabi/23/crtbegin_dynamic.o -L/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/lib/clang/18/lib/linux/arm -L/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/lib/arm-linux-androideabi/23 -L/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/lib/arm-linux-androideabi -L/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/lib/../lib -L/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/lib --build-id=sha1 --no-rosegment --no-undefined-version --fatal-warnings --no-undefined CMakeFiles/cmTC_0bd87.dir/CMakeCCompilerABI.c.o /Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/lib/clang/18/lib/linux/libclang_rt.builtins-arm-android.a -l:libunwind.a -ldl -lc /Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/lib/clang/18/lib/linux/libclang_rt.builtins-arm-android.a -l:libunwind.a -ldl /Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/lib/arm-linux-androideabi/23/crtend_android.o + + exitCode: 0 + - + kind: "message-v1" + backtrace: + - "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeDetermineCompilerABI.cmake:182 (message)" + - "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeTestCCompiler.cmake:26 (CMAKE_DETERMINE_COMPILER_ABI)" + - "CMakeLists.txt:2 (project)" + message: | + Parsed C implicit include dir info: rv=done + found start of include info + found start of implicit include info + add: [/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/lib/clang/18/include] + add: [/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/include/arm-linux-androideabi] + add: [/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/include] + end of search list found + collapse include dir [/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/lib/clang/18/include] ==> [/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/lib/clang/18/include] + collapse include dir [/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/include/arm-linux-androideabi] ==> [/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/include/arm-linux-androideabi] + collapse include dir [/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/include] ==> [/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/include] + implicit include dirs: [/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/lib/clang/18/include;/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/include/arm-linux-androideabi;/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/include] + + + - + kind: "message-v1" + backtrace: + - "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeDetermineCompilerABI.cmake:218 (message)" + - "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeTestCCompiler.cmake:26 (CMAKE_DETERMINE_COMPILER_ABI)" + - "CMakeLists.txt:2 (project)" + message: | + Parsed C implicit link information: + link line regex: [^( *|.*[/\\])(ld[0-9]*(\\.[a-z]+)?|CMAKE_LINK_STARTFILE-NOTFOUND|([^/\\]+-)?ld|collect2)[^/\\]*( |$)] + linker tool regex: [^[ ]*(->|")?[ ]*(([^"]*[/\\])?(ld[0-9]*(\\.[a-z]+)?))("|,| |$)] + ignore line: [Change Dir: '/Users/hamzaaleghwairyeen/development/App/Intaleq/android/app/.cxx/Debug/3p4b322x/armeabi-v7a/CMakeFiles/CMakeScratch/TryCompile-NVWubC'] + ignore line: [] + ignore line: [Run Build Command(s): /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/bin/ninja -v cmTC_0bd87] + ignore line: [[1/2] /Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/bin/clang --target=armv7-none-linux-androideabi23 --sysroot=/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot -g -DANDROID -fdata-sections -ffunction-sections -funwind-tables -fstack-protector-strong -no-canonical-prefixes -D_FORTIFY_SOURCE=2 -march=armv7-a -mthumb -Wformat -fPIE -v -MD -MT CMakeFiles/cmTC_0bd87.dir/CMakeCCompilerABI.c.o -MF CMakeFiles/cmTC_0bd87.dir/CMakeCCompilerABI.c.o.d -o CMakeFiles/cmTC_0bd87.dir/CMakeCCompilerABI.c.o -c /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeCCompilerABI.c] + ignore line: [Android (12027248 +pgo -bolt +lto -mlgo based on r522817) clang version 18.0.1 (https://android.googlesource.com/toolchain/llvm-project d8003a456d14a3deb8054cdaa529ffbf02d9b262)] + ignore line: [Target: armv7-none-linux-android23] + ignore line: [Thread model: posix] + ignore line: [InstalledDir: /Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/bin] + ignore line: [ (in-process)] + ignore line: [ "/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/bin/clang" -cc1 -triple thumbv7-none-linux-android23 -emit-obj -mrelax-all -disable-free -clear-ast-before-backend -disable-llvm-verifier -discard-value-names -main-file-name CMakeCCompilerABI.c -mrelocation-model pic -pic-level 2 -pic-is-pie -mframe-pointer=all -ffp-contract=on -fno-rounding-math -mconstructor-aliases -funwind-tables=1 -target-cpu generic -target-feature +soft-float-abi -target-feature +vfp2 -target-feature +vfp2sp -target-feature +vfp3 -target-feature +vfp3d16 -target-feature +vfp3d16sp -target-feature +vfp3sp -target-feature -fp16 -target-feature -vfp4 -target-feature -vfp4d16 -target-feature -vfp4d16sp -target-feature -vfp4sp -target-feature -fp-armv8 -target-feature -fp-armv8d16 -target-feature -fp-armv8d16sp -target-feature -fp-armv8sp -target-feature -fullfp16 -target-feature +fp64 -target-feature +d32 -target-feature +neon -target-feature -sha2 -target-feature -aes -target-feature -fp16fml -target-abi aapcs-linux -mfloat-abi soft -debug-info-kind=constructor -dwarf-version=4 -debugger-tuning=gdb -fdebug-compilation-dir=/Users/hamzaaleghwairyeen/development/App/Intaleq/android/app/.cxx/Debug/3p4b322x/armeabi-v7a/CMakeFiles/CMakeScratch/TryCompile-NVWubC -v -ffunction-sections -fdata-sections -fcoverage-compilation-dir=/Users/hamzaaleghwairyeen/development/App/Intaleq/android/app/.cxx/Debug/3p4b322x/armeabi-v7a/CMakeFiles/CMakeScratch/TryCompile-NVWubC -resource-dir /Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/lib/clang/18 -dependency-file CMakeFiles/cmTC_0bd87.dir/CMakeCCompilerABI.c.o.d -MT CMakeFiles/cmTC_0bd87.dir/CMakeCCompilerABI.c.o -sys-header-deps -D ANDROID -D _FORTIFY_SOURCE=2 -isysroot /Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot -internal-isystem /Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/lib/clang/18/include -internal-isystem /Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/local/include -internal-externc-isystem /Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/include/arm-linux-androideabi -internal-externc-isystem /Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/include -internal-externc-isystem /Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/include -Wformat -ferror-limit 19 -femulated-tls -stack-protector 2 -fno-signed-char -fgnuc-version=4.2.1 -D__GCC_HAVE_DWARF2_CFI_ASM=1 -o CMakeFiles/cmTC_0bd87.dir/CMakeCCompilerABI.c.o -x c /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeCCompilerABI.c] + ignore line: [clang -cc1 version 18.0.1 based upon LLVM 18.0.1 default target x86_64-apple-darwin24.5.0] + ignore line: [ignoring nonexistent directory "/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/local/include"] + ignore line: [ignoring nonexistent directory "/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/include"] + ignore line: [#include "..." search starts here:] + ignore line: [#include <...> search starts here:] + ignore line: [ /Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/lib/clang/18/include] + ignore line: [ /Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/include/arm-linux-androideabi] + ignore line: [ /Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/include] + ignore line: [End of search list.] + ignore line: [[2/2] : && /Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/bin/clang --target=armv7-none-linux-androideabi23 --sysroot=/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot -g -DANDROID -fdata-sections -ffunction-sections -funwind-tables -fstack-protector-strong -no-canonical-prefixes -D_FORTIFY_SOURCE=2 -march=armv7-a -mthumb -Wformat -static-libstdc++ -Wl --build-id=sha1 -Wl --no-rosegment -Wl --no-undefined-version -Wl --fatal-warnings -Wl --no-undefined -Qunused-arguments -v CMakeFiles/cmTC_0bd87.dir/CMakeCCompilerABI.c.o -o cmTC_0bd87 && :] + ignore line: [Android (12027248 +pgo -bolt +lto -mlgo based on r522817) clang version 18.0.1 (https://android.googlesource.com/toolchain/llvm-project d8003a456d14a3deb8054cdaa529ffbf02d9b262)] + ignore line: [Target: armv7-none-linux-android23] + ignore line: [Thread model: posix] + ignore line: [InstalledDir: /Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/bin] + link line: [ "/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/bin/ld.lld" --sysroot=/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot -EL -z now -z relro -z max-page-size=4096 -X --hash-style=gnu --eh-frame-hdr -m armelf_linux_eabi -pie -dynamic-linker /system/bin/linker -o cmTC_0bd87 /Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/lib/arm-linux-androideabi/23/crtbegin_dynamic.o -L/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/lib/clang/18/lib/linux/arm -L/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/lib/arm-linux-androideabi/23 -L/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/lib/arm-linux-androideabi -L/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/lib/../lib -L/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/lib --build-id=sha1 --no-rosegment --no-undefined-version --fatal-warnings --no-undefined CMakeFiles/cmTC_0bd87.dir/CMakeCCompilerABI.c.o /Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/lib/clang/18/lib/linux/libclang_rt.builtins-arm-android.a -l:libunwind.a -ldl -lc /Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/lib/clang/18/lib/linux/libclang_rt.builtins-arm-android.a -l:libunwind.a -ldl /Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/lib/arm-linux-androideabi/23/crtend_android.o] + arg [/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/bin/ld.lld] ==> ignore + arg [--sysroot=/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot] ==> ignore + arg [-EL] ==> ignore + arg [-znow] ==> ignore + arg [-zrelro] ==> ignore + arg [-zmax-page-size=4096] ==> ignore + arg [-X] ==> ignore + arg [--hash-style=gnu] ==> ignore + arg [--eh-frame-hdr] ==> ignore + arg [-m] ==> ignore + arg [armelf_linux_eabi] ==> ignore + arg [-pie] ==> ignore + arg [-dynamic-linker] ==> ignore + arg [/system/bin/linker] ==> ignore + arg [-o] ==> ignore + arg [cmTC_0bd87] ==> ignore + arg [/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/lib/arm-linux-androideabi/23/crtbegin_dynamic.o] ==> obj [/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/lib/arm-linux-androideabi/23/crtbegin_dynamic.o] + arg [-L/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/lib/clang/18/lib/linux/arm] ==> dir [/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/lib/clang/18/lib/linux/arm] + arg [-L/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/lib/arm-linux-androideabi/23] ==> dir [/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/lib/arm-linux-androideabi/23] + arg [-L/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/lib/arm-linux-androideabi] ==> dir [/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/lib/arm-linux-androideabi] + arg [-L/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/lib/../lib] ==> dir [/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/lib/../lib] + arg [-L/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/lib] ==> dir [/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/lib] + arg [--build-id=sha1] ==> ignore + arg [--no-rosegment] ==> ignore + arg [--no-undefined-version] ==> ignore + arg [--fatal-warnings] ==> ignore + arg [--no-undefined] ==> ignore + arg [CMakeFiles/cmTC_0bd87.dir/CMakeCCompilerABI.c.o] ==> ignore + arg [/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/lib/clang/18/lib/linux/libclang_rt.builtins-arm-android.a] ==> lib [/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/lib/clang/18/lib/linux/libclang_rt.builtins-arm-android.a] + arg [-l:libunwind.a] ==> lib [-l:libunwind.a] + arg [-ldl] ==> lib [dl] + arg [-lc] ==> lib [c] + arg [/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/lib/clang/18/lib/linux/libclang_rt.builtins-arm-android.a] ==> lib [/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/lib/clang/18/lib/linux/libclang_rt.builtins-arm-android.a] + arg [-l:libunwind.a] ==> lib [-l:libunwind.a] + arg [-ldl] ==> lib [dl] + arg [/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/lib/arm-linux-androideabi/23/crtend_android.o] ==> obj [/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/lib/arm-linux-androideabi/23/crtend_android.o] + linker tool for 'C': /Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/bin/ld.lld + remove lib [/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/lib/clang/18/lib/linux/libclang_rt.builtins-arm-android.a] + remove lib [/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/lib/clang/18/lib/linux/libclang_rt.builtins-arm-android.a] + collapse library dir [/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/lib/clang/18/lib/linux/arm] ==> [/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/lib/clang/18/lib/linux/arm] + collapse library dir [/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/lib/arm-linux-androideabi/23] ==> [/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/lib/arm-linux-androideabi/23] + collapse library dir [/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/lib/arm-linux-androideabi] ==> [/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/lib/arm-linux-androideabi] + collapse library dir [/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/lib/../lib] ==> [/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/lib] + collapse library dir [/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/lib] ==> [/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/lib] + implicit libs: [-l:libunwind.a;dl;c;-l:libunwind.a;dl] + implicit objs: [/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/lib/arm-linux-androideabi/23/crtbegin_dynamic.o;/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/lib/arm-linux-androideabi/23/crtend_android.o] + implicit dirs: [/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/lib/clang/18/lib/linux/arm;/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/lib/arm-linux-androideabi/23;/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/lib/arm-linux-androideabi;/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/lib] + implicit fwks: [] + + + - + kind: "message-v1" + backtrace: + - "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Internal/CMakeDetermineLinkerId.cmake:40 (message)" + - "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeDetermineCompilerABI.cmake:255 (cmake_determine_linker_id)" + - "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeTestCCompiler.cmake:26 (CMAKE_DETERMINE_COMPILER_ABI)" + - "CMakeLists.txt:2 (project)" + message: | + Running the C compiler's linker: "/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/bin/ld.lld" "-v" + LLD 18.0.1 (compatible with GNU linkers) + - + kind: "try_compile-v1" + backtrace: + - "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeDetermineCompilerABI.cmake:74 (try_compile)" + - "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeTestCXXCompiler.cmake:26 (CMAKE_DETERMINE_COMPILER_ABI)" + - "CMakeLists.txt:2 (project)" + checks: + - "Detecting CXX compiler ABI info" + directories: + source: "/Users/hamzaaleghwairyeen/development/App/Intaleq/android/app/.cxx/Debug/3p4b322x/armeabi-v7a/CMakeFiles/CMakeScratch/TryCompile-0vPiLx" + binary: "/Users/hamzaaleghwairyeen/development/App/Intaleq/android/app/.cxx/Debug/3p4b322x/armeabi-v7a/CMakeFiles/CMakeScratch/TryCompile-0vPiLx" + cmakeVariables: + ANDROID_ABI: "armeabi-v7a" + ANDROID_ARM_MODE: "thumb" + ANDROID_ARM_NEON: "TRUE" + ANDROID_PIE: "TRUE" + ANDROID_PLATFORM: "android-23" + ANDROID_STL: "c++_static" + ANDROID_TOOLCHAIN: "clang" + CMAKE_CXX_COMPILER_CLANG_SCAN_DEPS: "/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/bin/clang-scan-deps" + CMAKE_CXX_COMPILER_TARGET: "armv7-none-linux-androideabi23" + CMAKE_CXX_FLAGS: "-g -DANDROID -fdata-sections -ffunction-sections -funwind-tables -fstack-protector-strong -no-canonical-prefixes -D_FORTIFY_SOURCE=2 -march=armv7-a -mthumb -Wformat " + CMAKE_CXX_FLAGS_DEBUG: "-fno-limit-debug-info " + CMAKE_CXX_SCAN_FOR_MODULES: "OFF" + CMAKE_C_COMPILER_TARGET: "armv7-none-linux-androideabi23" + CMAKE_EXE_LINKER_FLAGS: "-static-libstdc++ -Wl,--build-id=sha1 -Wl,--no-rosegment -Wl,--no-undefined-version -Wl,--fatal-warnings -Wl,--no-undefined -Qunused-arguments " + CMAKE_POSITION_INDEPENDENT_CODE: "TRUE" + CMAKE_SYSROOT: "/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot" + buildResult: + variable: "CMAKE_CXX_ABI_COMPILED" + cached: true + stdout: | + Change Dir: '/Users/hamzaaleghwairyeen/development/App/Intaleq/android/app/.cxx/Debug/3p4b322x/armeabi-v7a/CMakeFiles/CMakeScratch/TryCompile-0vPiLx' + + Run Build Command(s): /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/bin/ninja -v cmTC_30f7a + [1/2] /Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/bin/clang++ --target=armv7-none-linux-androideabi23 --sysroot=/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot -g -DANDROID -fdata-sections -ffunction-sections -funwind-tables -fstack-protector-strong -no-canonical-prefixes -D_FORTIFY_SOURCE=2 -march=armv7-a -mthumb -Wformat -fPIE -v -MD -MT CMakeFiles/cmTC_30f7a.dir/CMakeCXXCompilerABI.cpp.o -MF CMakeFiles/cmTC_30f7a.dir/CMakeCXXCompilerABI.cpp.o.d -o CMakeFiles/cmTC_30f7a.dir/CMakeCXXCompilerABI.cpp.o -c /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeCXXCompilerABI.cpp + Android (12027248, +pgo, -bolt, +lto, -mlgo, based on r522817) clang version 18.0.1 (https://android.googlesource.com/toolchain/llvm-project d8003a456d14a3deb8054cdaa529ffbf02d9b262) + Target: armv7-none-linux-android23 + Thread model: posix + InstalledDir: /Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/bin + (in-process) + "/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/bin/clang++" -cc1 -triple thumbv7-none-linux-android23 -emit-obj -mrelax-all -disable-free -clear-ast-before-backend -disable-llvm-verifier -discard-value-names -main-file-name CMakeCXXCompilerABI.cpp -mrelocation-model pic -pic-level 2 -pic-is-pie -mframe-pointer=all -ffp-contract=on -fno-rounding-math -mconstructor-aliases -funwind-tables=1 -target-cpu generic -target-feature +soft-float-abi -target-feature +vfp2 -target-feature +vfp2sp -target-feature +vfp3 -target-feature +vfp3d16 -target-feature +vfp3d16sp -target-feature +vfp3sp -target-feature -fp16 -target-feature -vfp4 -target-feature -vfp4d16 -target-feature -vfp4d16sp -target-feature -vfp4sp -target-feature -fp-armv8 -target-feature -fp-armv8d16 -target-feature -fp-armv8d16sp -target-feature -fp-armv8sp -target-feature -fullfp16 -target-feature +fp64 -target-feature +d32 -target-feature +neon -target-feature -sha2 -target-feature -aes -target-feature -fp16fml -target-abi aapcs-linux -mfloat-abi soft -debug-info-kind=constructor -dwarf-version=4 -debugger-tuning=gdb -fdebug-compilation-dir=/Users/hamzaaleghwairyeen/development/App/Intaleq/android/app/.cxx/Debug/3p4b322x/armeabi-v7a/CMakeFiles/CMakeScratch/TryCompile-0vPiLx -v -ffunction-sections -fdata-sections -fcoverage-compilation-dir=/Users/hamzaaleghwairyeen/development/App/Intaleq/android/app/.cxx/Debug/3p4b322x/armeabi-v7a/CMakeFiles/CMakeScratch/TryCompile-0vPiLx -resource-dir /Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/lib/clang/18 -dependency-file CMakeFiles/cmTC_30f7a.dir/CMakeCXXCompilerABI.cpp.o.d -MT CMakeFiles/cmTC_30f7a.dir/CMakeCXXCompilerABI.cpp.o -sys-header-deps -D ANDROID -D _FORTIFY_SOURCE=2 -isysroot /Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot -internal-isystem /Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/include/c++/v1 -internal-isystem /Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/lib/clang/18/include -internal-isystem /Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/local/include -internal-externc-isystem /Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/include/arm-linux-androideabi -internal-externc-isystem /Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/include -internal-externc-isystem /Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/include -Wformat -fdeprecated-macro -ferror-limit 19 -femulated-tls -stack-protector 2 -fno-signed-char -fgnuc-version=4.2.1 -fcxx-exceptions -fexceptions -D__GCC_HAVE_DWARF2_CFI_ASM=1 -o CMakeFiles/cmTC_30f7a.dir/CMakeCXXCompilerABI.cpp.o -x c++ /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeCXXCompilerABI.cpp + clang -cc1 version 18.0.1 based upon LLVM 18.0.1 default target x86_64-apple-darwin24.5.0 + ignoring nonexistent directory "/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/local/include" + ignoring nonexistent directory "/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/include" + #include "..." search starts here: + #include <...> search starts here: + /Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/include/c++/v1 + /Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/lib/clang/18/include + /Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/include/arm-linux-androideabi + /Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/include + End of search list. + [2/2] : && /Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/bin/clang++ --target=armv7-none-linux-androideabi23 --sysroot=/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot -g -DANDROID -fdata-sections -ffunction-sections -funwind-tables -fstack-protector-strong -no-canonical-prefixes -D_FORTIFY_SOURCE=2 -march=armv7-a -mthumb -Wformat -static-libstdc++ -Wl,--build-id=sha1 -Wl,--no-rosegment -Wl,--no-undefined-version -Wl,--fatal-warnings -Wl,--no-undefined -Qunused-arguments -v CMakeFiles/cmTC_30f7a.dir/CMakeCXXCompilerABI.cpp.o -o cmTC_30f7a && : + Android (12027248, +pgo, -bolt, +lto, -mlgo, based on r522817) clang version 18.0.1 (https://android.googlesource.com/toolchain/llvm-project d8003a456d14a3deb8054cdaa529ffbf02d9b262) + Target: armv7-none-linux-android23 + Thread model: posix + InstalledDir: /Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/bin + "/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/bin/ld.lld" --sysroot=/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot -EL -z now -z relro -z max-page-size=4096 -X --hash-style=gnu --eh-frame-hdr -m armelf_linux_eabi -pie -dynamic-linker /system/bin/linker -o cmTC_30f7a /Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/lib/arm-linux-androideabi/23/crtbegin_dynamic.o -L/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/lib/clang/18/lib/linux/arm -L/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/lib/arm-linux-androideabi/23 -L/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/lib/arm-linux-androideabi -L/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/lib/../lib -L/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/lib --build-id=sha1 --no-rosegment --no-undefined-version --fatal-warnings --no-undefined CMakeFiles/cmTC_30f7a.dir/CMakeCXXCompilerABI.cpp.o -Bstatic -lc++ -Bdynamic -lm /Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/lib/clang/18/lib/linux/libclang_rt.builtins-arm-android.a -l:libunwind.a -ldl -lc /Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/lib/clang/18/lib/linux/libclang_rt.builtins-arm-android.a -l:libunwind.a -ldl /Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/lib/arm-linux-androideabi/23/crtend_android.o + + exitCode: 0 + - + kind: "message-v1" + backtrace: + - "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeDetermineCompilerABI.cmake:182 (message)" + - "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeTestCXXCompiler.cmake:26 (CMAKE_DETERMINE_COMPILER_ABI)" + - "CMakeLists.txt:2 (project)" + message: | + Parsed CXX implicit include dir info: rv=done + found start of include info + found start of implicit include info + add: [/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/include/c++/v1] + add: [/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/lib/clang/18/include] + add: [/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/include/arm-linux-androideabi] + add: [/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/include] + end of search list found + collapse include dir [/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/include/c++/v1] ==> [/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/include/c++/v1] + collapse include dir [/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/lib/clang/18/include] ==> [/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/lib/clang/18/include] + collapse include dir [/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/include/arm-linux-androideabi] ==> [/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/include/arm-linux-androideabi] + collapse include dir [/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/include] ==> [/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/include] + implicit include dirs: [/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/include/c++/v1;/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/lib/clang/18/include;/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/include/arm-linux-androideabi;/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/include] + + + - + kind: "message-v1" + backtrace: + - "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeDetermineCompilerABI.cmake:218 (message)" + - "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeTestCXXCompiler.cmake:26 (CMAKE_DETERMINE_COMPILER_ABI)" + - "CMakeLists.txt:2 (project)" + message: | + Parsed CXX implicit link information: + link line regex: [^( *|.*[/\\])(ld[0-9]*(\\.[a-z]+)?|CMAKE_LINK_STARTFILE-NOTFOUND|([^/\\]+-)?ld|collect2)[^/\\]*( |$)] + linker tool regex: [^[ ]*(->|")?[ ]*(([^"]*[/\\])?(ld[0-9]*(\\.[a-z]+)?))("|,| |$)] + ignore line: [Change Dir: '/Users/hamzaaleghwairyeen/development/App/Intaleq/android/app/.cxx/Debug/3p4b322x/armeabi-v7a/CMakeFiles/CMakeScratch/TryCompile-0vPiLx'] + ignore line: [] + ignore line: [Run Build Command(s): /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/bin/ninja -v cmTC_30f7a] + ignore line: [[1/2] /Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/bin/clang++ --target=armv7-none-linux-androideabi23 --sysroot=/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot -g -DANDROID -fdata-sections -ffunction-sections -funwind-tables -fstack-protector-strong -no-canonical-prefixes -D_FORTIFY_SOURCE=2 -march=armv7-a -mthumb -Wformat -fPIE -v -MD -MT CMakeFiles/cmTC_30f7a.dir/CMakeCXXCompilerABI.cpp.o -MF CMakeFiles/cmTC_30f7a.dir/CMakeCXXCompilerABI.cpp.o.d -o CMakeFiles/cmTC_30f7a.dir/CMakeCXXCompilerABI.cpp.o -c /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeCXXCompilerABI.cpp] + ignore line: [Android (12027248 +pgo -bolt +lto -mlgo based on r522817) clang version 18.0.1 (https://android.googlesource.com/toolchain/llvm-project d8003a456d14a3deb8054cdaa529ffbf02d9b262)] + ignore line: [Target: armv7-none-linux-android23] + ignore line: [Thread model: posix] + ignore line: [InstalledDir: /Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/bin] + ignore line: [ (in-process)] + ignore line: [ "/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/bin/clang++" -cc1 -triple thumbv7-none-linux-android23 -emit-obj -mrelax-all -disable-free -clear-ast-before-backend -disable-llvm-verifier -discard-value-names -main-file-name CMakeCXXCompilerABI.cpp -mrelocation-model pic -pic-level 2 -pic-is-pie -mframe-pointer=all -ffp-contract=on -fno-rounding-math -mconstructor-aliases -funwind-tables=1 -target-cpu generic -target-feature +soft-float-abi -target-feature +vfp2 -target-feature +vfp2sp -target-feature +vfp3 -target-feature +vfp3d16 -target-feature +vfp3d16sp -target-feature +vfp3sp -target-feature -fp16 -target-feature -vfp4 -target-feature -vfp4d16 -target-feature -vfp4d16sp -target-feature -vfp4sp -target-feature -fp-armv8 -target-feature -fp-armv8d16 -target-feature -fp-armv8d16sp -target-feature -fp-armv8sp -target-feature -fullfp16 -target-feature +fp64 -target-feature +d32 -target-feature +neon -target-feature -sha2 -target-feature -aes -target-feature -fp16fml -target-abi aapcs-linux -mfloat-abi soft -debug-info-kind=constructor -dwarf-version=4 -debugger-tuning=gdb -fdebug-compilation-dir=/Users/hamzaaleghwairyeen/development/App/Intaleq/android/app/.cxx/Debug/3p4b322x/armeabi-v7a/CMakeFiles/CMakeScratch/TryCompile-0vPiLx -v -ffunction-sections -fdata-sections -fcoverage-compilation-dir=/Users/hamzaaleghwairyeen/development/App/Intaleq/android/app/.cxx/Debug/3p4b322x/armeabi-v7a/CMakeFiles/CMakeScratch/TryCompile-0vPiLx -resource-dir /Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/lib/clang/18 -dependency-file CMakeFiles/cmTC_30f7a.dir/CMakeCXXCompilerABI.cpp.o.d -MT CMakeFiles/cmTC_30f7a.dir/CMakeCXXCompilerABI.cpp.o -sys-header-deps -D ANDROID -D _FORTIFY_SOURCE=2 -isysroot /Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot -internal-isystem /Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/include/c++/v1 -internal-isystem /Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/lib/clang/18/include -internal-isystem /Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/local/include -internal-externc-isystem /Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/include/arm-linux-androideabi -internal-externc-isystem /Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/include -internal-externc-isystem /Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/include -Wformat -fdeprecated-macro -ferror-limit 19 -femulated-tls -stack-protector 2 -fno-signed-char -fgnuc-version=4.2.1 -fcxx-exceptions -fexceptions -D__GCC_HAVE_DWARF2_CFI_ASM=1 -o CMakeFiles/cmTC_30f7a.dir/CMakeCXXCompilerABI.cpp.o -x c++ /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeCXXCompilerABI.cpp] + ignore line: [clang -cc1 version 18.0.1 based upon LLVM 18.0.1 default target x86_64-apple-darwin24.5.0] + ignore line: [ignoring nonexistent directory "/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/local/include"] + ignore line: [ignoring nonexistent directory "/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/include"] + ignore line: [#include "..." search starts here:] + ignore line: [#include <...> search starts here:] + ignore line: [ /Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/include/c++/v1] + ignore line: [ /Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/lib/clang/18/include] + ignore line: [ /Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/include/arm-linux-androideabi] + ignore line: [ /Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/include] + ignore line: [End of search list.] + ignore line: [[2/2] : && /Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/bin/clang++ --target=armv7-none-linux-androideabi23 --sysroot=/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot -g -DANDROID -fdata-sections -ffunction-sections -funwind-tables -fstack-protector-strong -no-canonical-prefixes -D_FORTIFY_SOURCE=2 -march=armv7-a -mthumb -Wformat -static-libstdc++ -Wl --build-id=sha1 -Wl --no-rosegment -Wl --no-undefined-version -Wl --fatal-warnings -Wl --no-undefined -Qunused-arguments -v CMakeFiles/cmTC_30f7a.dir/CMakeCXXCompilerABI.cpp.o -o cmTC_30f7a && :] + ignore line: [Android (12027248 +pgo -bolt +lto -mlgo based on r522817) clang version 18.0.1 (https://android.googlesource.com/toolchain/llvm-project d8003a456d14a3deb8054cdaa529ffbf02d9b262)] + ignore line: [Target: armv7-none-linux-android23] + ignore line: [Thread model: posix] + ignore line: [InstalledDir: /Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/bin] + link line: [ "/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/bin/ld.lld" --sysroot=/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot -EL -z now -z relro -z max-page-size=4096 -X --hash-style=gnu --eh-frame-hdr -m armelf_linux_eabi -pie -dynamic-linker /system/bin/linker -o cmTC_30f7a /Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/lib/arm-linux-androideabi/23/crtbegin_dynamic.o -L/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/lib/clang/18/lib/linux/arm -L/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/lib/arm-linux-androideabi/23 -L/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/lib/arm-linux-androideabi -L/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/lib/../lib -L/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/lib --build-id=sha1 --no-rosegment --no-undefined-version --fatal-warnings --no-undefined CMakeFiles/cmTC_30f7a.dir/CMakeCXXCompilerABI.cpp.o -Bstatic -lc++ -Bdynamic -lm /Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/lib/clang/18/lib/linux/libclang_rt.builtins-arm-android.a -l:libunwind.a -ldl -lc /Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/lib/clang/18/lib/linux/libclang_rt.builtins-arm-android.a -l:libunwind.a -ldl /Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/lib/arm-linux-androideabi/23/crtend_android.o] + arg [/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/bin/ld.lld] ==> ignore + arg [--sysroot=/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot] ==> ignore + arg [-EL] ==> ignore + arg [-znow] ==> ignore + arg [-zrelro] ==> ignore + arg [-zmax-page-size=4096] ==> ignore + arg [-X] ==> ignore + arg [--hash-style=gnu] ==> ignore + arg [--eh-frame-hdr] ==> ignore + arg [-m] ==> ignore + arg [armelf_linux_eabi] ==> ignore + arg [-pie] ==> ignore + arg [-dynamic-linker] ==> ignore + arg [/system/bin/linker] ==> ignore + arg [-o] ==> ignore + arg [cmTC_30f7a] ==> ignore + arg [/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/lib/arm-linux-androideabi/23/crtbegin_dynamic.o] ==> obj [/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/lib/arm-linux-androideabi/23/crtbegin_dynamic.o] + arg [-L/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/lib/clang/18/lib/linux/arm] ==> dir [/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/lib/clang/18/lib/linux/arm] + arg [-L/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/lib/arm-linux-androideabi/23] ==> dir [/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/lib/arm-linux-androideabi/23] + arg [-L/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/lib/arm-linux-androideabi] ==> dir [/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/lib/arm-linux-androideabi] + arg [-L/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/lib/../lib] ==> dir [/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/lib/../lib] + arg [-L/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/lib] ==> dir [/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/lib] + arg [--build-id=sha1] ==> ignore + arg [--no-rosegment] ==> ignore + arg [--no-undefined-version] ==> ignore + arg [--fatal-warnings] ==> ignore + arg [--no-undefined] ==> ignore + arg [CMakeFiles/cmTC_30f7a.dir/CMakeCXXCompilerABI.cpp.o] ==> ignore + arg [-Bstatic] ==> search static + arg [-lc++] ==> lib [c++] + arg [-Bdynamic] ==> search dynamic + arg [-lm] ==> lib [m] + arg [/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/lib/clang/18/lib/linux/libclang_rt.builtins-arm-android.a] ==> lib [/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/lib/clang/18/lib/linux/libclang_rt.builtins-arm-android.a] + arg [-l:libunwind.a] ==> lib [-l:libunwind.a] + arg [-ldl] ==> lib [dl] + arg [-lc] ==> lib [c] + arg [/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/lib/clang/18/lib/linux/libclang_rt.builtins-arm-android.a] ==> lib [/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/lib/clang/18/lib/linux/libclang_rt.builtins-arm-android.a] + arg [-l:libunwind.a] ==> lib [-l:libunwind.a] + arg [-ldl] ==> lib [dl] + arg [/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/lib/arm-linux-androideabi/23/crtend_android.o] ==> obj [/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/lib/arm-linux-androideabi/23/crtend_android.o] + linker tool for 'CXX': /Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/bin/ld.lld + remove lib [/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/lib/clang/18/lib/linux/libclang_rt.builtins-arm-android.a] + remove lib [/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/lib/clang/18/lib/linux/libclang_rt.builtins-arm-android.a] + collapse library dir [/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/lib/clang/18/lib/linux/arm] ==> [/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/lib/clang/18/lib/linux/arm] + collapse library dir [/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/lib/arm-linux-androideabi/23] ==> [/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/lib/arm-linux-androideabi/23] + collapse library dir [/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/lib/arm-linux-androideabi] ==> [/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/lib/arm-linux-androideabi] + collapse library dir [/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/lib/../lib] ==> [/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/lib] + collapse library dir [/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/lib] ==> [/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/lib] + implicit libs: [c++;m;-l:libunwind.a;dl;c;-l:libunwind.a;dl] + implicit objs: [/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/lib/arm-linux-androideabi/23/crtbegin_dynamic.o;/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/lib/arm-linux-androideabi/23/crtend_android.o] + implicit dirs: [/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/lib/clang/18/lib/linux/arm;/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/lib/arm-linux-androideabi/23;/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/lib/arm-linux-androideabi;/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/lib] + implicit fwks: [] + + + - + kind: "message-v1" + backtrace: + - "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Internal/CMakeDetermineLinkerId.cmake:40 (message)" + - "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeDetermineCompilerABI.cmake:255 (cmake_determine_linker_id)" + - "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeTestCXXCompiler.cmake:26 (CMAKE_DETERMINE_COMPILER_ABI)" + - "CMakeLists.txt:2 (project)" + message: | + Running the CXX compiler's linker: "/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/bin/ld.lld" "-v" + LLD 18.0.1 (compatible with GNU linkers) +... diff --git a/siro_rider/android/app/.cxx/Debug/3p4b322x/armeabi-v7a/CMakeFiles/TargetDirectories.txt b/siro_rider/android/app/.cxx/Debug/3p4b322x/armeabi-v7a/CMakeFiles/TargetDirectories.txt new file mode 100644 index 0000000..ab235ea --- /dev/null +++ b/siro_rider/android/app/.cxx/Debug/3p4b322x/armeabi-v7a/CMakeFiles/TargetDirectories.txt @@ -0,0 +1,3 @@ +/Users/hamzaaleghwairyeen/development/App/Intaleq/android/app/.cxx/Debug/3p4b322x/armeabi-v7a/CMakeFiles/native-lib.dir +/Users/hamzaaleghwairyeen/development/App/Intaleq/android/app/.cxx/Debug/3p4b322x/armeabi-v7a/CMakeFiles/edit_cache.dir +/Users/hamzaaleghwairyeen/development/App/Intaleq/android/app/.cxx/Debug/3p4b322x/armeabi-v7a/CMakeFiles/rebuild_cache.dir diff --git a/siro_rider/android/app/.cxx/Debug/3p4b322x/armeabi-v7a/CMakeFiles/cmake.check_cache b/siro_rider/android/app/.cxx/Debug/3p4b322x/armeabi-v7a/CMakeFiles/cmake.check_cache new file mode 100644 index 0000000..3dccd73 --- /dev/null +++ b/siro_rider/android/app/.cxx/Debug/3p4b322x/armeabi-v7a/CMakeFiles/cmake.check_cache @@ -0,0 +1 @@ +# This file is generated by cmake for dependency checking of the CMakeCache.txt file diff --git a/siro_rider/android/app/.cxx/Debug/3p4b322x/armeabi-v7a/CMakeFiles/native-lib.dir/native-lib.cpp.o b/siro_rider/android/app/.cxx/Debug/3p4b322x/armeabi-v7a/CMakeFiles/native-lib.dir/native-lib.cpp.o new file mode 100644 index 0000000..447b263 Binary files /dev/null and b/siro_rider/android/app/.cxx/Debug/3p4b322x/armeabi-v7a/CMakeFiles/native-lib.dir/native-lib.cpp.o differ diff --git a/siro_rider/android/app/.cxx/Debug/3p4b322x/armeabi-v7a/CMakeFiles/rules.ninja b/siro_rider/android/app/.cxx/Debug/3p4b322x/armeabi-v7a/CMakeFiles/rules.ninja new file mode 100644 index 0000000..26e232c --- /dev/null +++ b/siro_rider/android/app/.cxx/Debug/3p4b322x/armeabi-v7a/CMakeFiles/rules.ninja @@ -0,0 +1,66 @@ +# CMAKE generated file: DO NOT EDIT! +# Generated by "Ninja" Generator, CMake Version 3.31 + +# This file contains all the rules used to get the outputs files +# built from the input files. +# It is included in the main 'build.ninja'. + +# ============================================================================= +# Project: intaleq +# Configurations: Debug +# ============================================================================= +# ============================================================================= + +############################################# +# Rule for compiling CXX files. + +rule CXX_COMPILER__native-lib_unscanned_Debug + depfile = $DEP_FILE + deps = gcc + command = ${LAUNCHER}${CODE_CHECK}/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/bin/clang++ --target=armv7-none-linux-androideabi23 --sysroot=/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot $DEFINES $INCLUDES $FLAGS -MD -MT $out -MF $DEP_FILE -o $out -c $in + description = Building CXX object $out + + +############################################# +# Rule for linking CXX shared library. + +rule CXX_SHARED_LIBRARY_LINKER__native-lib_Debug + depfile = $DEP_FILE + deps = gcc + command = $PRE_LINK && /Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/bin/clang++ --target=armv7-none-linux-androideabi23 --sysroot=/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot -fPIC $LANGUAGE_COMPILE_FLAGS $ARCH_FLAGS $LINK_FLAGS -shared $SONAME_FLAG$SONAME -o $TARGET_FILE $in $LINK_PATH $LINK_LIBRARIES && $POST_BUILD + description = Linking CXX shared library $TARGET_FILE + restat = $RESTAT + + +############################################# +# Rule for running custom commands. + +rule CUSTOM_COMMAND + command = $COMMAND + description = $DESC + + +############################################# +# Rule for re-running cmake. + +rule RERUN_CMAKE + command = /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/bin/cmake --regenerate-during-build -S/Users/hamzaaleghwairyeen/development/App/Intaleq/android/app/src/main/cpp -B/Users/hamzaaleghwairyeen/development/App/Intaleq/android/app/.cxx/Debug/3p4b322x/armeabi-v7a + description = Re-running CMake... + generator = 1 + + +############################################# +# Rule for cleaning all built files. + +rule CLEAN + command = /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/bin/ninja $FILE_ARG -t clean $TARGETS + description = Cleaning all built files... + + +############################################# +# Rule for printing all primary targets available. + +rule HELP + command = /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/bin/ninja -t targets + description = All primary targets available: + diff --git a/siro_rider/android/app/.cxx/Debug/3p4b322x/armeabi-v7a/additional_project_files.txt b/siro_rider/android/app/.cxx/Debug/3p4b322x/armeabi-v7a/additional_project_files.txt new file mode 100644 index 0000000..e69de29 diff --git a/siro_rider/android/app/.cxx/Debug/3p4b322x/armeabi-v7a/android_gradle_build.json b/siro_rider/android/app/.cxx/Debug/3p4b322x/armeabi-v7a/android_gradle_build.json new file mode 100644 index 0000000..bfbbc76 --- /dev/null +++ b/siro_rider/android/app/.cxx/Debug/3p4b322x/armeabi-v7a/android_gradle_build.json @@ -0,0 +1,38 @@ +{ + "buildFiles": [ + "/Users/hamzaaleghwairyeen/development/App/Intaleq/android/app/src/main/cpp/CMakeLists.txt" + ], + "cleanCommandsComponents": [ + [ + "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/bin/ninja", + "-C", + "/Users/hamzaaleghwairyeen/development/App/Intaleq/android/app/.cxx/Debug/3p4b322x/armeabi-v7a", + "clean" + ] + ], + "buildTargetsCommandComponents": [ + "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/bin/ninja", + "-C", + "/Users/hamzaaleghwairyeen/development/App/Intaleq/android/app/.cxx/Debug/3p4b322x/armeabi-v7a", + "{LIST_OF_TARGETS_TO_BUILD}" + ], + "libraries": { + "native-lib::@6890427a1f51a3e7e1df": { + "toolchain": "toolchain", + "abi": "armeabi-v7a", + "artifactName": "native-lib", + "output": "/Users/hamzaaleghwairyeen/development/App/Intaleq/build/app/intermediates/cxx/Debug/3p4b322x/obj/armeabi-v7a/libnative-lib.so", + "runtimeFiles": [] + } + }, + "toolchains": { + "toolchain": { + "cCompilerExecutable": "/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/bin/clang.lld", + "cppCompilerExecutable": "/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/bin/clang++.lld" + } + }, + "cFileExtensions": [], + "cppFileExtensions": [ + "cpp" + ] +} \ No newline at end of file diff --git a/siro_rider/android/app/.cxx/Debug/3p4b322x/armeabi-v7a/android_gradle_build_mini.json b/siro_rider/android/app/.cxx/Debug/3p4b322x/armeabi-v7a/android_gradle_build_mini.json new file mode 100644 index 0000000..2327815 --- /dev/null +++ b/siro_rider/android/app/.cxx/Debug/3p4b322x/armeabi-v7a/android_gradle_build_mini.json @@ -0,0 +1,27 @@ +{ + "buildFiles": [ + "/Users/hamzaaleghwairyeen/development/App/Intaleq/android/app/src/main/cpp/CMakeLists.txt" + ], + "cleanCommandsComponents": [ + [ + "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/bin/ninja", + "-C", + "/Users/hamzaaleghwairyeen/development/App/Intaleq/android/app/.cxx/Debug/3p4b322x/armeabi-v7a", + "clean" + ] + ], + "buildTargetsCommandComponents": [ + "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/bin/ninja", + "-C", + "/Users/hamzaaleghwairyeen/development/App/Intaleq/android/app/.cxx/Debug/3p4b322x/armeabi-v7a", + "{LIST_OF_TARGETS_TO_BUILD}" + ], + "libraries": { + "native-lib::@6890427a1f51a3e7e1df": { + "artifactName": "native-lib", + "abi": "armeabi-v7a", + "output": "/Users/hamzaaleghwairyeen/development/App/Intaleq/build/app/intermediates/cxx/Debug/3p4b322x/obj/armeabi-v7a/libnative-lib.so", + "runtimeFiles": [] + } + } +} \ No newline at end of file diff --git a/siro_rider/android/app/.cxx/Debug/3p4b322x/armeabi-v7a/build.ninja b/siro_rider/android/app/.cxx/Debug/3p4b322x/armeabi-v7a/build.ninja new file mode 100644 index 0000000..7e65bad --- /dev/null +++ b/siro_rider/android/app/.cxx/Debug/3p4b322x/armeabi-v7a/build.ninja @@ -0,0 +1,156 @@ +# CMAKE generated file: DO NOT EDIT! +# Generated by "Ninja" Generator, CMake Version 3.31 + +# This file contains all the build statements describing the +# compilation DAG. + +# ============================================================================= +# Write statements declared in CMakeLists.txt: +# +# Which is the root file. +# ============================================================================= + +# ============================================================================= +# Project: intaleq +# Configurations: Debug +# ============================================================================= + +############################################# +# Minimal version of Ninja required by this file + +ninja_required_version = 1.5 + + +############################################# +# Set configuration variable for custom commands. + +CONFIGURATION = Debug +# ============================================================================= +# Include auxiliary files. + + +############################################# +# Include rules file. + +include CMakeFiles/rules.ninja + +# ============================================================================= + +############################################# +# Logical path to working directory; prefix for absolute paths. + +cmake_ninja_workdir = /Users/hamzaaleghwairyeen/development/App/Intaleq/android/app/.cxx/Debug/3p4b322x/armeabi-v7a/ +# ============================================================================= +# Object build statements for SHARED_LIBRARY target native-lib + + +############################################# +# Order-only phony target for native-lib + +build cmake_object_order_depends_target_native-lib: phony || . + +build CMakeFiles/native-lib.dir/native-lib.cpp.o: CXX_COMPILER__native-lib_unscanned_Debug /Users/hamzaaleghwairyeen/development/App/Intaleq/android/app/src/main/cpp/native-lib.cpp || cmake_object_order_depends_target_native-lib + DEFINES = -Dnative_lib_EXPORTS + DEP_FILE = CMakeFiles/native-lib.dir/native-lib.cpp.o.d + FLAGS = -g -DANDROID -fdata-sections -ffunction-sections -funwind-tables -fstack-protector-strong -no-canonical-prefixes -D_FORTIFY_SOURCE=2 -march=armv7-a -mthumb -Wformat -Werror=format-security -fno-limit-debug-info -fPIC + OBJECT_DIR = CMakeFiles/native-lib.dir + OBJECT_FILE_DIR = CMakeFiles/native-lib.dir + TARGET_COMPILE_PDB = CMakeFiles/native-lib.dir/ + TARGET_PDB = /Users/hamzaaleghwairyeen/development/App/Intaleq/build/app/intermediates/cxx/Debug/3p4b322x/obj/armeabi-v7a/libnative-lib.pdb + + +# ============================================================================= +# Link build statements for SHARED_LIBRARY target native-lib + + +############################################# +# Link the shared library /Users/hamzaaleghwairyeen/development/App/Intaleq/build/app/intermediates/cxx/Debug/3p4b322x/obj/armeabi-v7a/libnative-lib.so + +build /Users/hamzaaleghwairyeen/development/App/Intaleq/build/app/intermediates/cxx/Debug/3p4b322x/obj/armeabi-v7a/libnative-lib.so: CXX_SHARED_LIBRARY_LINKER__native-lib_Debug CMakeFiles/native-lib.dir/native-lib.cpp.o | /Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/lib/arm-linux-androideabi/23/liblog.so + DEP_FILE = CMakeFiles/native-lib.dir/link.d + LANGUAGE_COMPILE_FLAGS = -g -DANDROID -fdata-sections -ffunction-sections -funwind-tables -fstack-protector-strong -no-canonical-prefixes -D_FORTIFY_SOURCE=2 -march=armv7-a -mthumb -Wformat -Werror=format-security -fno-limit-debug-info + LINK_FLAGS = -static-libstdc++ -Wl,--build-id=sha1 -Wl,--no-rosegment -Wl,--no-undefined-version -Wl,--fatal-warnings -Wl,--no-undefined -Qunused-arguments -Xlinker --dependency-file=CMakeFiles/native-lib.dir/link.d + LINK_LIBRARIES = /Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/lib/arm-linux-androideabi/23/liblog.so -latomic -lm + OBJECT_DIR = CMakeFiles/native-lib.dir + POST_BUILD = : + PRE_LINK = : + SONAME = libnative-lib.so + SONAME_FLAG = -Wl,-soname, + TARGET_COMPILE_PDB = CMakeFiles/native-lib.dir/ + TARGET_FILE = /Users/hamzaaleghwairyeen/development/App/Intaleq/build/app/intermediates/cxx/Debug/3p4b322x/obj/armeabi-v7a/libnative-lib.so + TARGET_PDB = /Users/hamzaaleghwairyeen/development/App/Intaleq/build/app/intermediates/cxx/Debug/3p4b322x/obj/armeabi-v7a/libnative-lib.pdb + + +############################################# +# Utility command for edit_cache + +build CMakeFiles/edit_cache.util: CUSTOM_COMMAND + COMMAND = cd /Users/hamzaaleghwairyeen/development/App/Intaleq/android/app/.cxx/Debug/3p4b322x/armeabi-v7a && /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/bin/ccmake -S/Users/hamzaaleghwairyeen/development/App/Intaleq/android/app/src/main/cpp -B/Users/hamzaaleghwairyeen/development/App/Intaleq/android/app/.cxx/Debug/3p4b322x/armeabi-v7a + DESC = Running CMake cache editor... + pool = console + restat = 1 + +build edit_cache: phony CMakeFiles/edit_cache.util + + +############################################# +# Utility command for rebuild_cache + +build CMakeFiles/rebuild_cache.util: CUSTOM_COMMAND + COMMAND = cd /Users/hamzaaleghwairyeen/development/App/Intaleq/android/app/.cxx/Debug/3p4b322x/armeabi-v7a && /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/bin/cmake --regenerate-during-build -S/Users/hamzaaleghwairyeen/development/App/Intaleq/android/app/src/main/cpp -B/Users/hamzaaleghwairyeen/development/App/Intaleq/android/app/.cxx/Debug/3p4b322x/armeabi-v7a + DESC = Running CMake to regenerate build system... + pool = console + restat = 1 + +build rebuild_cache: phony CMakeFiles/rebuild_cache.util + +# ============================================================================= +# Target aliases. + +build libnative-lib.so: phony /Users/hamzaaleghwairyeen/development/App/Intaleq/build/app/intermediates/cxx/Debug/3p4b322x/obj/armeabi-v7a/libnative-lib.so + +build native-lib: phony /Users/hamzaaleghwairyeen/development/App/Intaleq/build/app/intermediates/cxx/Debug/3p4b322x/obj/armeabi-v7a/libnative-lib.so + +# ============================================================================= +# Folder targets. + +# ============================================================================= + +############################################# +# Folder: /Users/hamzaaleghwairyeen/development/App/Intaleq/android/app/.cxx/Debug/3p4b322x/armeabi-v7a + +build all: phony /Users/hamzaaleghwairyeen/development/App/Intaleq/build/app/intermediates/cxx/Debug/3p4b322x/obj/armeabi-v7a/libnative-lib.so + +# ============================================================================= +# Built-in targets + + +############################################# +# Re-run CMake if any of its inputs changed. + +build build.ninja: RERUN_CMAKE | /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeCCompiler.cmake.in /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeCCompilerABI.c /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeCInformation.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeCXXCompiler.cmake.in /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeCXXCompilerABI.cpp /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeCXXInformation.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeCommonLanguageInclude.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeCompilerIdDetection.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeDetermineCCompiler.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeDetermineCXXCompiler.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeDetermineCompiler.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeDetermineCompilerABI.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeDetermineCompilerId.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeDetermineCompilerSupport.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeDetermineSystem.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeFindBinUtils.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeGenericSystem.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeInitializeConfigs.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeLanguageInformation.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeParseImplicitIncludeInfo.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeParseImplicitLinkInfo.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeParseLibraryArchitecture.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeSystem.cmake.in /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeSystemSpecificInformation.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeSystemSpecificInitialize.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeTestCCompiler.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeTestCXXCompiler.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeTestCompilerCommon.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/ADSP-DetermineCompiler.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/ARMCC-DetermineCompiler.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/ARMClang-DetermineCompiler.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/AppleClang-DetermineCompiler.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/Borland-DetermineCompiler.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/Bruce-C-DetermineCompiler.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/CMakeCommonCompilerMacros.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/Clang-C.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/Clang-CXX-CXXImportStd.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/Clang-CXX.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/Clang-DetermineCompiler.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/Clang-DetermineCompilerInternal.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/Clang-FindBinUtils.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/Clang.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/Compaq-C-DetermineCompiler.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/Compaq-CXX-DetermineCompiler.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/Cray-DetermineCompiler.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/CrayClang-DetermineCompiler.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/Embarcadero-DetermineCompiler.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/Fujitsu-DetermineCompiler.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/FujitsuClang-DetermineCompiler.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/GHS-DetermineCompiler.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/GNU-C-DetermineCompiler.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/GNU-CXX-DetermineCompiler.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/GNU.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/HP-C-DetermineCompiler.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/HP-CXX-DetermineCompiler.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/IAR-DetermineCompiler.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/IBMCPP-C-DetermineVersionInternal.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/IBMCPP-CXX-DetermineVersionInternal.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/IBMClang-C-DetermineCompiler.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/IBMClang-CXX-DetermineCompiler.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/Intel-DetermineCompiler.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/IntelLLVM-DetermineCompiler.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/LCC-C-DetermineCompiler.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/LCC-CXX-DetermineCompiler.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/MSVC-DetermineCompiler.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/NVHPC-DetermineCompiler.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/NVIDIA-DetermineCompiler.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/OpenWatcom-DetermineCompiler.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/OrangeC-DetermineCompiler.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/PGI-DetermineCompiler.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/PathScale-DetermineCompiler.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/SCO-DetermineCompiler.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/SDCC-C-DetermineCompiler.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/SunPro-C-DetermineCompiler.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/SunPro-CXX-DetermineCompiler.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/TI-DetermineCompiler.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/TIClang-DetermineCompiler.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/Tasking-DetermineCompiler.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/TinyCC-C-DetermineCompiler.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/VisualAge-C-DetermineCompiler.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/VisualAge-CXX-DetermineCompiler.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/Watcom-DetermineCompiler.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/XL-C-DetermineCompiler.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/XL-CXX-DetermineCompiler.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/XLClang-C-DetermineCompiler.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/XLClang-CXX-DetermineCompiler.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/zOS-C-DetermineCompiler.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/zOS-CXX-DetermineCompiler.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Internal/CMakeCLinkerInformation.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Internal/CMakeCXXLinkerInformation.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Internal/CMakeCommonLinkerInformation.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Internal/CMakeDetermineLinkerId.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Internal/FeatureTesting.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Linker/GNU.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Linker/LLD-C.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Linker/LLD-CXX.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Linker/LLD.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Platform/Android-Clang-C.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Platform/Android-Clang-CXX.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Platform/Android-Clang.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Platform/Android-Determine-C.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Platform/Android-Determine-CXX.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Platform/Android-Determine.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Platform/Android-Initialize.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Platform/Android.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Platform/Android/Determine-Compiler.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Platform/Linker/Android-LLD-C.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Platform/Linker/Android-LLD-CXX.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Platform/Linker/GNU.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Platform/Linker/Linux-GNU.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Platform/Linker/Linux-LLD-C.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Platform/Linker/Linux-LLD-CXX.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Platform/Linker/Linux-LLD.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Platform/Linux-Initialize.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Platform/Linux.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Platform/UnixPaths.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/build/cmake/abis.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/build/cmake/android-legacy.toolchain.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/build/cmake/android.toolchain.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/build/cmake/flags.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/build/cmake/hooks/pre/Android-Clang.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/build/cmake/hooks/pre/Android-Determine.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/build/cmake/hooks/pre/Android-Initialize.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/build/cmake/hooks/pre/Android.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/build/cmake/hooks/pre/Determine-Compiler.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/build/cmake/platforms.cmake /Users/hamzaaleghwairyeen/development/App/Intaleq/android/app/src/main/cpp/CMakeLists.txt CMakeCache.txt CMakeFiles/3.31.5-g6cf5163/CMakeCCompiler.cmake CMakeFiles/3.31.5-g6cf5163/CMakeCXXCompiler.cmake CMakeFiles/3.31.5-g6cf5163/CMakeSystem.cmake + pool = console + + +############################################# +# A missing CMake input file is not an error. + +build /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeCCompiler.cmake.in /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeCCompilerABI.c /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeCInformation.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeCXXCompiler.cmake.in /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeCXXCompilerABI.cpp /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeCXXInformation.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeCommonLanguageInclude.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeCompilerIdDetection.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeDetermineCCompiler.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeDetermineCXXCompiler.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeDetermineCompiler.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeDetermineCompilerABI.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeDetermineCompilerId.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeDetermineCompilerSupport.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeDetermineSystem.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeFindBinUtils.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeGenericSystem.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeInitializeConfigs.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeLanguageInformation.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeParseImplicitIncludeInfo.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeParseImplicitLinkInfo.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeParseLibraryArchitecture.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeSystem.cmake.in /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeSystemSpecificInformation.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeSystemSpecificInitialize.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeTestCCompiler.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeTestCXXCompiler.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeTestCompilerCommon.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/ADSP-DetermineCompiler.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/ARMCC-DetermineCompiler.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/ARMClang-DetermineCompiler.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/AppleClang-DetermineCompiler.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/Borland-DetermineCompiler.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/Bruce-C-DetermineCompiler.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/CMakeCommonCompilerMacros.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/Clang-C.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/Clang-CXX-CXXImportStd.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/Clang-CXX.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/Clang-DetermineCompiler.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/Clang-DetermineCompilerInternal.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/Clang-FindBinUtils.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/Clang.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/Compaq-C-DetermineCompiler.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/Compaq-CXX-DetermineCompiler.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/Cray-DetermineCompiler.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/CrayClang-DetermineCompiler.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/Embarcadero-DetermineCompiler.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/Fujitsu-DetermineCompiler.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/FujitsuClang-DetermineCompiler.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/GHS-DetermineCompiler.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/GNU-C-DetermineCompiler.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/GNU-CXX-DetermineCompiler.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/GNU.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/HP-C-DetermineCompiler.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/HP-CXX-DetermineCompiler.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/IAR-DetermineCompiler.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/IBMCPP-C-DetermineVersionInternal.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/IBMCPP-CXX-DetermineVersionInternal.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/IBMClang-C-DetermineCompiler.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/IBMClang-CXX-DetermineCompiler.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/Intel-DetermineCompiler.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/IntelLLVM-DetermineCompiler.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/LCC-C-DetermineCompiler.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/LCC-CXX-DetermineCompiler.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/MSVC-DetermineCompiler.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/NVHPC-DetermineCompiler.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/NVIDIA-DetermineCompiler.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/OpenWatcom-DetermineCompiler.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/OrangeC-DetermineCompiler.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/PGI-DetermineCompiler.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/PathScale-DetermineCompiler.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/SCO-DetermineCompiler.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/SDCC-C-DetermineCompiler.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/SunPro-C-DetermineCompiler.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/SunPro-CXX-DetermineCompiler.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/TI-DetermineCompiler.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/TIClang-DetermineCompiler.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/Tasking-DetermineCompiler.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/TinyCC-C-DetermineCompiler.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/VisualAge-C-DetermineCompiler.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/VisualAge-CXX-DetermineCompiler.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/Watcom-DetermineCompiler.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/XL-C-DetermineCompiler.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/XL-CXX-DetermineCompiler.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/XLClang-C-DetermineCompiler.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/XLClang-CXX-DetermineCompiler.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/zOS-C-DetermineCompiler.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/zOS-CXX-DetermineCompiler.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Internal/CMakeCLinkerInformation.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Internal/CMakeCXXLinkerInformation.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Internal/CMakeCommonLinkerInformation.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Internal/CMakeDetermineLinkerId.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Internal/FeatureTesting.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Linker/GNU.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Linker/LLD-C.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Linker/LLD-CXX.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Linker/LLD.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Platform/Android-Clang-C.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Platform/Android-Clang-CXX.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Platform/Android-Clang.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Platform/Android-Determine-C.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Platform/Android-Determine-CXX.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Platform/Android-Determine.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Platform/Android-Initialize.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Platform/Android.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Platform/Android/Determine-Compiler.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Platform/Linker/Android-LLD-C.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Platform/Linker/Android-LLD-CXX.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Platform/Linker/GNU.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Platform/Linker/Linux-GNU.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Platform/Linker/Linux-LLD-C.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Platform/Linker/Linux-LLD-CXX.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Platform/Linker/Linux-LLD.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Platform/Linux-Initialize.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Platform/Linux.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Platform/UnixPaths.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/build/cmake/abis.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/build/cmake/android-legacy.toolchain.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/build/cmake/android.toolchain.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/build/cmake/flags.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/build/cmake/hooks/pre/Android-Clang.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/build/cmake/hooks/pre/Android-Determine.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/build/cmake/hooks/pre/Android-Initialize.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/build/cmake/hooks/pre/Android.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/build/cmake/hooks/pre/Determine-Compiler.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/build/cmake/platforms.cmake /Users/hamzaaleghwairyeen/development/App/Intaleq/android/app/src/main/cpp/CMakeLists.txt CMakeCache.txt CMakeFiles/3.31.5-g6cf5163/CMakeCCompiler.cmake CMakeFiles/3.31.5-g6cf5163/CMakeCXXCompiler.cmake CMakeFiles/3.31.5-g6cf5163/CMakeSystem.cmake: phony + + +############################################# +# Clean all the built files. + +build clean: CLEAN + + +############################################# +# Print all primary targets available. + +build help: HELP + + +############################################# +# Make the all target the default. + +default all diff --git a/siro_rider/android/app/.cxx/Debug/3p4b322x/armeabi-v7a/build_file_index.txt b/siro_rider/android/app/.cxx/Debug/3p4b322x/armeabi-v7a/build_file_index.txt new file mode 100644 index 0000000..661f7ae --- /dev/null +++ b/siro_rider/android/app/.cxx/Debug/3p4b322x/armeabi-v7a/build_file_index.txt @@ -0,0 +1 @@ +/Users/hamzaaleghwairyeen/development/App/Intaleq/android/app/src/main/cpp/CMakeLists.txt \ No newline at end of file diff --git a/siro_rider/android/app/.cxx/Debug/3p4b322x/armeabi-v7a/cmake_install.cmake b/siro_rider/android/app/.cxx/Debug/3p4b322x/armeabi-v7a/cmake_install.cmake new file mode 100644 index 0000000..e20b811 --- /dev/null +++ b/siro_rider/android/app/.cxx/Debug/3p4b322x/armeabi-v7a/cmake_install.cmake @@ -0,0 +1,66 @@ +# Install script for directory: /Users/hamzaaleghwairyeen/development/App/Intaleq/android/app/src/main/cpp + +# Set the install prefix +if(NOT DEFINED CMAKE_INSTALL_PREFIX) + set(CMAKE_INSTALL_PREFIX "/usr/local") +endif() +string(REGEX REPLACE "/$" "" CMAKE_INSTALL_PREFIX "${CMAKE_INSTALL_PREFIX}") + +# Set the install configuration name. +if(NOT DEFINED CMAKE_INSTALL_CONFIG_NAME) + if(BUILD_TYPE) + string(REGEX REPLACE "^[^A-Za-z0-9_]+" "" + CMAKE_INSTALL_CONFIG_NAME "${BUILD_TYPE}") + else() + set(CMAKE_INSTALL_CONFIG_NAME "Debug") + endif() + message(STATUS "Install configuration: \"${CMAKE_INSTALL_CONFIG_NAME}\"") +endif() + +# Set the component getting installed. +if(NOT CMAKE_INSTALL_COMPONENT) + if(COMPONENT) + message(STATUS "Install component: \"${COMPONENT}\"") + set(CMAKE_INSTALL_COMPONENT "${COMPONENT}") + else() + set(CMAKE_INSTALL_COMPONENT) + endif() +endif() + +# Install shared libraries without execute permission? +if(NOT DEFINED CMAKE_INSTALL_SO_NO_EXE) + set(CMAKE_INSTALL_SO_NO_EXE "0") +endif() + +# Is this installation the result of a crosscompile? +if(NOT DEFINED CMAKE_CROSSCOMPILING) + set(CMAKE_CROSSCOMPILING "TRUE") +endif() + +# Set path to fallback-tool for dependency-resolution. +if(NOT DEFINED CMAKE_OBJDUMP) + set(CMAKE_OBJDUMP "/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/bin/llvm-objdump") +endif() + +string(REPLACE ";" "\n" CMAKE_INSTALL_MANIFEST_CONTENT + "${CMAKE_INSTALL_MANIFEST_FILES}") +if(CMAKE_INSTALL_LOCAL_ONLY) + file(WRITE "/Users/hamzaaleghwairyeen/development/App/Intaleq/android/app/.cxx/Debug/3p4b322x/armeabi-v7a/install_local_manifest.txt" + "${CMAKE_INSTALL_MANIFEST_CONTENT}") +endif() +if(CMAKE_INSTALL_COMPONENT) + if(CMAKE_INSTALL_COMPONENT MATCHES "^[a-zA-Z0-9_.+-]+$") + set(CMAKE_INSTALL_MANIFEST "install_manifest_${CMAKE_INSTALL_COMPONENT}.txt") + else() + string(MD5 CMAKE_INST_COMP_HASH "${CMAKE_INSTALL_COMPONENT}") + set(CMAKE_INSTALL_MANIFEST "install_manifest_${CMAKE_INST_COMP_HASH}.txt") + unset(CMAKE_INST_COMP_HASH) + endif() +else() + set(CMAKE_INSTALL_MANIFEST "install_manifest.txt") +endif() + +if(NOT CMAKE_INSTALL_LOCAL_ONLY) + file(WRITE "/Users/hamzaaleghwairyeen/development/App/Intaleq/android/app/.cxx/Debug/3p4b322x/armeabi-v7a/${CMAKE_INSTALL_MANIFEST}" + "${CMAKE_INSTALL_MANIFEST_CONTENT}") +endif() diff --git a/siro_rider/android/app/.cxx/Debug/3p4b322x/armeabi-v7a/compile_commands.json b/siro_rider/android/app/.cxx/Debug/3p4b322x/armeabi-v7a/compile_commands.json new file mode 100644 index 0000000..078c0a3 --- /dev/null +++ b/siro_rider/android/app/.cxx/Debug/3p4b322x/armeabi-v7a/compile_commands.json @@ -0,0 +1,8 @@ +[ +{ + "directory": "/Users/hamzaaleghwairyeen/development/App/Intaleq/android/app/.cxx/Debug/3p4b322x/armeabi-v7a", + "command": "/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/bin/clang++ --target=armv7-none-linux-androideabi23 --sysroot=/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot -Dnative_lib_EXPORTS -g -DANDROID -fdata-sections -ffunction-sections -funwind-tables -fstack-protector-strong -no-canonical-prefixes -D_FORTIFY_SOURCE=2 -march=armv7-a -mthumb -Wformat -Werror=format-security -fno-limit-debug-info -fPIC -o CMakeFiles/native-lib.dir/native-lib.cpp.o -c /Users/hamzaaleghwairyeen/development/App/Intaleq/android/app/src/main/cpp/native-lib.cpp", + "file": "/Users/hamzaaleghwairyeen/development/App/Intaleq/android/app/src/main/cpp/native-lib.cpp", + "output": "CMakeFiles/native-lib.dir/native-lib.cpp.o" +} +] \ No newline at end of file diff --git a/siro_rider/android/app/.cxx/Debug/3p4b322x/armeabi-v7a/compile_commands.json.bin b/siro_rider/android/app/.cxx/Debug/3p4b322x/armeabi-v7a/compile_commands.json.bin new file mode 100644 index 0000000..93b16d8 Binary files /dev/null and b/siro_rider/android/app/.cxx/Debug/3p4b322x/armeabi-v7a/compile_commands.json.bin differ diff --git a/siro_rider/android/app/.cxx/Debug/3p4b322x/armeabi-v7a/configure_fingerprint.bin b/siro_rider/android/app/.cxx/Debug/3p4b322x/armeabi-v7a/configure_fingerprint.bin new file mode 100644 index 0000000..e07fc5f --- /dev/null +++ b/siro_rider/android/app/.cxx/Debug/3p4b322x/armeabi-v7a/configure_fingerprint.bin @@ -0,0 +1,29 @@ +C/C++ Structured Log~ +| +z/Users/hamzaaleghwairyeen/development/App/Intaleq/android/app/.cxx/Debug/3p4b322x/armeabi-v7a/additional_project_files.txtC +A +?com.android.build.gradle.internal.cxx.io.EncodedFileFingerPrint  3  2{ +y +w/Users/hamzaaleghwairyeen/development/App/Intaleq/android/app/.cxx/Debug/3p4b322x/armeabi-v7a/android_gradle_build.json  3 + 2 +~ +|/Users/hamzaaleghwairyeen/development/App/Intaleq/android/app/.cxx/Debug/3p4b322x/armeabi-v7a/android_gradle_build_mini.json  3 ĝ2m +k +i/Users/hamzaaleghwairyeen/development/App/Intaleq/android/app/.cxx/Debug/3p4b322x/armeabi-v7a/build.ninja  3 2q +o +m/Users/hamzaaleghwairyeen/development/App/Intaleq/android/app/.cxx/Debug/3p4b322x/armeabi-v7a/build.ninja.txt  3v +t +r/Users/hamzaaleghwairyeen/development/App/Intaleq/android/app/.cxx/Debug/3p4b322x/armeabi-v7a/build_file_index.txt  3 Y Н2w +u +s/Users/hamzaaleghwairyeen/development/App/Intaleq/android/app/.cxx/Debug/3p4b322x/armeabi-v7a/compile_commands.json  3 2{ +y +w/Users/hamzaaleghwairyeen/development/App/Intaleq/android/app/.cxx/Debug/3p4b322x/armeabi-v7a/compile_commands.json.bin  3  2 + +}/Users/hamzaaleghwairyeen/development/App/Intaleq/android/app/.cxx/Debug/3p4b322x/armeabi-v7a/metadata_generation_command.txt  3 + Ν2t +r +p/Users/hamzaaleghwairyeen/development/App/Intaleq/android/app/.cxx/Debug/3p4b322x/armeabi-v7a/prefab_config.json  3  ( Н2y +w +u/Users/hamzaaleghwairyeen/development/App/Intaleq/android/app/.cxx/Debug/3p4b322x/armeabi-v7a/symbol_folder_index.txt  3  l Н2] +[ +Y/Users/hamzaaleghwairyeen/development/App/Intaleq/android/app/src/main/cpp/CMakeLists.txt  3  ޮ2 \ No newline at end of file diff --git a/siro_rider/android/app/.cxx/Debug/3p4b322x/armeabi-v7a/metadata_generation_command.txt b/siro_rider/android/app/.cxx/Debug/3p4b322x/armeabi-v7a/metadata_generation_command.txt new file mode 100644 index 0000000..e66443a --- /dev/null +++ b/siro_rider/android/app/.cxx/Debug/3p4b322x/armeabi-v7a/metadata_generation_command.txt @@ -0,0 +1,18 @@ + -H/Users/hamzaaleghwairyeen/development/App/Intaleq/android/app/src/main/cpp +-DCMAKE_SYSTEM_NAME=Android +-DCMAKE_EXPORT_COMPILE_COMMANDS=ON +-DCMAKE_SYSTEM_VERSION=23 +-DANDROID_PLATFORM=android-23 +-DANDROID_ABI=armeabi-v7a +-DCMAKE_ANDROID_ARCH_ABI=armeabi-v7a +-DANDROID_NDK=/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973 +-DCMAKE_ANDROID_NDK=/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973 +-DCMAKE_TOOLCHAIN_FILE=/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/build/cmake/android.toolchain.cmake +-DCMAKE_MAKE_PROGRAM=/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/bin/ninja +-DCMAKE_LIBRARY_OUTPUT_DIRECTORY=/Users/hamzaaleghwairyeen/development/App/Intaleq/build/app/intermediates/cxx/Debug/3p4b322x/obj/armeabi-v7a +-DCMAKE_RUNTIME_OUTPUT_DIRECTORY=/Users/hamzaaleghwairyeen/development/App/Intaleq/build/app/intermediates/cxx/Debug/3p4b322x/obj/armeabi-v7a +-DCMAKE_BUILD_TYPE=Debug +-B/Users/hamzaaleghwairyeen/development/App/Intaleq/android/app/.cxx/Debug/3p4b322x/armeabi-v7a +-GNinja + Build command args: [] + Version: 2 \ No newline at end of file diff --git a/siro_rider/android/app/.cxx/Debug/3p4b322x/armeabi-v7a/prefab_config.json b/siro_rider/android/app/.cxx/Debug/3p4b322x/armeabi-v7a/prefab_config.json new file mode 100644 index 0000000..e799de8 --- /dev/null +++ b/siro_rider/android/app/.cxx/Debug/3p4b322x/armeabi-v7a/prefab_config.json @@ -0,0 +1,4 @@ +{ + "enabled": false, + "packages": [] +} \ No newline at end of file diff --git a/siro_rider/android/app/.cxx/Debug/3p4b322x/armeabi-v7a/symbol_folder_index.txt b/siro_rider/android/app/.cxx/Debug/3p4b322x/armeabi-v7a/symbol_folder_index.txt new file mode 100644 index 0000000..48ff81a --- /dev/null +++ b/siro_rider/android/app/.cxx/Debug/3p4b322x/armeabi-v7a/symbol_folder_index.txt @@ -0,0 +1 @@ +/Users/hamzaaleghwairyeen/development/App/Intaleq/build/app/intermediates/cxx/Debug/3p4b322x/obj/armeabi-v7a \ No newline at end of file diff --git a/siro_rider/android/app/.cxx/Debug/3p4b322x/hash_key.txt b/siro_rider/android/app/.cxx/Debug/3p4b322x/hash_key.txt new file mode 100644 index 0000000..3c192b9 --- /dev/null +++ b/siro_rider/android/app/.cxx/Debug/3p4b322x/hash_key.txt @@ -0,0 +1,25 @@ +# Values used to calculate the hash in this folder name. +# Should not depend on the absolute path of the project itself. +# - AGP: 8.11.0. +# - $NDK is the path to NDK 27.0.12077973. +# - $PROJECT is the path to the parent folder of the root Gradle build file. +# - $ABI is the ABI to be built with. The specific value doesn't contribute to the value of the hash. +# - $HASH is the hash value computed from this text. +# - $CMAKE is the path to CMake 3.31.5. +# - $NINJA is the path to Ninja. +-H$PROJECT/app/src/main/cpp +-DCMAKE_SYSTEM_NAME=Android +-DCMAKE_EXPORT_COMPILE_COMMANDS=ON +-DCMAKE_SYSTEM_VERSION=23 +-DANDROID_PLATFORM=android-23 +-DANDROID_ABI=$ABI +-DCMAKE_ANDROID_ARCH_ABI=$ABI +-DANDROID_NDK=$NDK +-DCMAKE_ANDROID_NDK=$NDK +-DCMAKE_TOOLCHAIN_FILE=$NDK/build/cmake/android.toolchain.cmake +-DCMAKE_MAKE_PROGRAM=$NINJA +-DCMAKE_LIBRARY_OUTPUT_DIRECTORY=/Users/hamzaaleghwairyeen/development/App/Intaleq/build/app/intermediates/cxx/Debug/$HASH/obj/$ABI +-DCMAKE_RUNTIME_OUTPUT_DIRECTORY=/Users/hamzaaleghwairyeen/development/App/Intaleq/build/app/intermediates/cxx/Debug/$HASH/obj/$ABI +-DCMAKE_BUILD_TYPE=Debug +-B$PROJECT/app/.cxx/Debug/$HASH/$ABI +-GNinja \ No newline at end of file diff --git a/siro_rider/android/app/.cxx/Debug/3p4b322x/x86/.cmake/api/v1/query/client-agp/cache-v2 b/siro_rider/android/app/.cxx/Debug/3p4b322x/x86/.cmake/api/v1/query/client-agp/cache-v2 new file mode 100644 index 0000000..e69de29 diff --git a/siro_rider/android/app/.cxx/Debug/3p4b322x/x86/.cmake/api/v1/query/client-agp/cmakeFiles-v1 b/siro_rider/android/app/.cxx/Debug/3p4b322x/x86/.cmake/api/v1/query/client-agp/cmakeFiles-v1 new file mode 100644 index 0000000..e69de29 diff --git a/siro_rider/android/app/.cxx/Debug/3p4b322x/x86/.cmake/api/v1/query/client-agp/codemodel-v2 b/siro_rider/android/app/.cxx/Debug/3p4b322x/x86/.cmake/api/v1/query/client-agp/codemodel-v2 new file mode 100644 index 0000000..e69de29 diff --git a/siro_rider/android/app/.cxx/Debug/3p4b322x/x86/.cmake/api/v1/reply/cache-v2-22adc30e24d1cde66655.json b/siro_rider/android/app/.cxx/Debug/3p4b322x/x86/.cmake/api/v1/reply/cache-v2-22adc30e24d1cde66655.json new file mode 100644 index 0000000..21e0b56 --- /dev/null +++ b/siro_rider/android/app/.cxx/Debug/3p4b322x/x86/.cmake/api/v1/reply/cache-v2-22adc30e24d1cde66655.json @@ -0,0 +1,1479 @@ +{ + "entries" : + [ + { + "name" : "ANDROID_ABI", + "properties" : + [ + { + "name" : "HELPSTRING", + "value" : "No help, variable specified on the command line." + } + ], + "type" : "UNINITIALIZED", + "value" : "x86" + }, + { + "name" : "ANDROID_NDK", + "properties" : + [ + { + "name" : "HELPSTRING", + "value" : "No help, variable specified on the command line." + } + ], + "type" : "UNINITIALIZED", + "value" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973" + }, + { + "name" : "ANDROID_PLATFORM", + "properties" : + [ + { + "name" : "HELPSTRING", + "value" : "No help, variable specified on the command line." + } + ], + "type" : "UNINITIALIZED", + "value" : "android-23" + }, + { + "name" : "CMAKE_ADDR2LINE", + "properties" : + [ + { + "name" : "ADVANCED", + "value" : "1" + }, + { + "name" : "HELPSTRING", + "value" : "Path to a program." + } + ], + "type" : "FILEPATH", + "value" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/bin/llvm-addr2line" + }, + { + "name" : "CMAKE_ANDROID_ARCH_ABI", + "properties" : + [ + { + "name" : "HELPSTRING", + "value" : "No help, variable specified on the command line." + } + ], + "type" : "UNINITIALIZED", + "value" : "x86" + }, + { + "name" : "CMAKE_ANDROID_NDK", + "properties" : + [ + { + "name" : "HELPSTRING", + "value" : "No help, variable specified on the command line." + } + ], + "type" : "UNINITIALIZED", + "value" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973" + }, + { + "name" : "CMAKE_AR", + "properties" : + [ + { + "name" : "ADVANCED", + "value" : "1" + }, + { + "name" : "HELPSTRING", + "value" : "Archiver" + } + ], + "type" : "FILEPATH", + "value" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/bin/llvm-ar" + }, + { + "name" : "CMAKE_ASM_FLAGS", + "properties" : + [ + { + "name" : "HELPSTRING", + "value" : "Flags used by the compiler during all build types." + } + ], + "type" : "STRING", + "value" : "" + }, + { + "name" : "CMAKE_ASM_FLAGS_DEBUG", + "properties" : + [ + { + "name" : "HELPSTRING", + "value" : "Flags used by the compiler during debug builds." + } + ], + "type" : "STRING", + "value" : "" + }, + { + "name" : "CMAKE_ASM_FLAGS_RELEASE", + "properties" : + [ + { + "name" : "HELPSTRING", + "value" : "Flags used by the compiler during release builds." + } + ], + "type" : "STRING", + "value" : "" + }, + { + "name" : "CMAKE_BUILD_TYPE", + "properties" : + [ + { + "name" : "HELPSTRING", + "value" : "Choose the type of build, options are: None Debug Release RelWithDebInfo MinSizeRel ..." + } + ], + "type" : "STRING", + "value" : "Debug" + }, + { + "name" : "CMAKE_CACHEFILE_DIR", + "properties" : + [ + { + "name" : "HELPSTRING", + "value" : "This is the directory where this CMakeCache.txt was created" + } + ], + "type" : "INTERNAL", + "value" : "/Users/hamzaaleghwairyeen/development/App/Intaleq/android/app/.cxx/Debug/3p4b322x/x86" + }, + { + "name" : "CMAKE_CACHE_MAJOR_VERSION", + "properties" : + [ + { + "name" : "HELPSTRING", + "value" : "Major version of cmake used to create the current loaded cache" + } + ], + "type" : "INTERNAL", + "value" : "3" + }, + { + "name" : "CMAKE_CACHE_MINOR_VERSION", + "properties" : + [ + { + "name" : "HELPSTRING", + "value" : "Minor version of cmake used to create the current loaded cache" + } + ], + "type" : "INTERNAL", + "value" : "31" + }, + { + "name" : "CMAKE_CACHE_PATCH_VERSION", + "properties" : + [ + { + "name" : "HELPSTRING", + "value" : "Patch version of cmake used to create the current loaded cache" + } + ], + "type" : "INTERNAL", + "value" : "5" + }, + { + "name" : "CMAKE_COMMAND", + "properties" : + [ + { + "name" : "HELPSTRING", + "value" : "Path to CMake executable." + } + ], + "type" : "INTERNAL", + "value" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/bin/cmake" + }, + { + "name" : "CMAKE_CPACK_COMMAND", + "properties" : + [ + { + "name" : "HELPSTRING", + "value" : "Path to cpack program executable." + } + ], + "type" : "INTERNAL", + "value" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/bin/cpack" + }, + { + "name" : "CMAKE_CTEST_COMMAND", + "properties" : + [ + { + "name" : "HELPSTRING", + "value" : "Path to ctest program executable." + } + ], + "type" : "INTERNAL", + "value" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/bin/ctest" + }, + { + "name" : "CMAKE_CXX_COMPILER", + "properties" : + [ + { + "name" : "ADVANCED", + "value" : "1" + }, + { + "name" : "HELPSTRING", + "value" : "" + } + ], + "type" : "UNINITIALIZED", + "value" : "" + }, + { + "name" : "CMAKE_CXX_COMPILER_AR", + "properties" : + [ + { + "name" : "ADVANCED", + "value" : "1" + }, + { + "name" : "HELPSTRING", + "value" : "LLVM archiver" + } + ], + "type" : "FILEPATH", + "value" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/bin/llvm-ar" + }, + { + "name" : "CMAKE_CXX_COMPILER_CLANG_SCAN_DEPS", + "properties" : + [ + { + "name" : "ADVANCED", + "value" : "1" + }, + { + "name" : "HELPSTRING", + "value" : "`clang-scan-deps` dependency scanner" + } + ], + "type" : "FILEPATH", + "value" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/bin/clang-scan-deps" + }, + { + "name" : "CMAKE_CXX_COMPILER_RANLIB", + "properties" : + [ + { + "name" : "ADVANCED", + "value" : "1" + }, + { + "name" : "HELPSTRING", + "value" : "Generate index for LLVM archive" + } + ], + "type" : "FILEPATH", + "value" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/bin/llvm-ranlib" + }, + { + "name" : "CMAKE_CXX_FLAGS", + "properties" : + [ + { + "name" : "ADVANCED", + "value" : "1" + }, + { + "name" : "HELPSTRING", + "value" : "Flags used by the compiler during all build types." + } + ], + "type" : "STRING", + "value" : "" + }, + { + "name" : "CMAKE_CXX_FLAGS_DEBUG", + "properties" : + [ + { + "name" : "ADVANCED", + "value" : "1" + }, + { + "name" : "HELPSTRING", + "value" : "Flags used by the compiler during debug builds." + } + ], + "type" : "STRING", + "value" : "" + }, + { + "name" : "CMAKE_CXX_FLAGS_MINSIZEREL", + "properties" : + [ + { + "name" : "ADVANCED", + "value" : "1" + }, + { + "name" : "HELPSTRING", + "value" : "Flags used by the CXX compiler during MINSIZEREL builds." + } + ], + "type" : "STRING", + "value" : "-Os -DNDEBUG" + }, + { + "name" : "CMAKE_CXX_FLAGS_RELEASE", + "properties" : + [ + { + "name" : "ADVANCED", + "value" : "1" + }, + { + "name" : "HELPSTRING", + "value" : "Flags used by the compiler during release builds." + } + ], + "type" : "STRING", + "value" : "" + }, + { + "name" : "CMAKE_CXX_FLAGS_RELWITHDEBINFO", + "properties" : + [ + { + "name" : "ADVANCED", + "value" : "1" + }, + { + "name" : "HELPSTRING", + "value" : "Flags used by the CXX compiler during RELWITHDEBINFO builds." + } + ], + "type" : "STRING", + "value" : "-O2 -g -DNDEBUG" + }, + { + "name" : "CMAKE_CXX_STANDARD_LIBRARIES", + "properties" : + [ + { + "name" : "ADVANCED", + "value" : "1" + }, + { + "name" : "HELPSTRING", + "value" : "Libraries linked by default with all C++ applications." + } + ], + "type" : "STRING", + "value" : "-latomic -lm" + }, + { + "name" : "CMAKE_C_COMPILER", + "properties" : + [ + { + "name" : "ADVANCED", + "value" : "1" + }, + { + "name" : "HELPSTRING", + "value" : "" + } + ], + "type" : "UNINITIALIZED", + "value" : "" + }, + { + "name" : "CMAKE_C_COMPILER_AR", + "properties" : + [ + { + "name" : "ADVANCED", + "value" : "1" + }, + { + "name" : "HELPSTRING", + "value" : "LLVM archiver" + } + ], + "type" : "FILEPATH", + "value" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/bin/llvm-ar" + }, + { + "name" : "CMAKE_C_COMPILER_CLANG_SCAN_DEPS", + "properties" : + [ + { + "name" : "ADVANCED", + "value" : "1" + }, + { + "name" : "HELPSTRING", + "value" : "`clang-scan-deps` dependency scanner" + } + ], + "type" : "FILEPATH", + "value" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/bin/clang-scan-deps" + }, + { + "name" : "CMAKE_C_COMPILER_RANLIB", + "properties" : + [ + { + "name" : "ADVANCED", + "value" : "1" + }, + { + "name" : "HELPSTRING", + "value" : "Generate index for LLVM archive" + } + ], + "type" : "FILEPATH", + "value" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/bin/llvm-ranlib" + }, + { + "name" : "CMAKE_C_FLAGS", + "properties" : + [ + { + "name" : "ADVANCED", + "value" : "1" + }, + { + "name" : "HELPSTRING", + "value" : "Flags used by the compiler during all build types." + } + ], + "type" : "STRING", + "value" : "" + }, + { + "name" : "CMAKE_C_FLAGS_DEBUG", + "properties" : + [ + { + "name" : "ADVANCED", + "value" : "1" + }, + { + "name" : "HELPSTRING", + "value" : "Flags used by the compiler during debug builds." + } + ], + "type" : "STRING", + "value" : "" + }, + { + "name" : "CMAKE_C_FLAGS_MINSIZEREL", + "properties" : + [ + { + "name" : "ADVANCED", + "value" : "1" + }, + { + "name" : "HELPSTRING", + "value" : "Flags used by the C compiler during MINSIZEREL builds." + } + ], + "type" : "STRING", + "value" : "-Os -DNDEBUG" + }, + { + "name" : "CMAKE_C_FLAGS_RELEASE", + "properties" : + [ + { + "name" : "ADVANCED", + "value" : "1" + }, + { + "name" : "HELPSTRING", + "value" : "Flags used by the compiler during release builds." + } + ], + "type" : "STRING", + "value" : "" + }, + { + "name" : "CMAKE_C_FLAGS_RELWITHDEBINFO", + "properties" : + [ + { + "name" : "ADVANCED", + "value" : "1" + }, + { + "name" : "HELPSTRING", + "value" : "Flags used by the C compiler during RELWITHDEBINFO builds." + } + ], + "type" : "STRING", + "value" : "-O2 -g -DNDEBUG" + }, + { + "name" : "CMAKE_C_STANDARD_LIBRARIES", + "properties" : + [ + { + "name" : "ADVANCED", + "value" : "1" + }, + { + "name" : "HELPSTRING", + "value" : "Libraries linked by default with all C applications." + } + ], + "type" : "STRING", + "value" : "-latomic -lm" + }, + { + "name" : "CMAKE_DLLTOOL", + "properties" : + [ + { + "name" : "ADVANCED", + "value" : "1" + }, + { + "name" : "HELPSTRING", + "value" : "Path to a program." + } + ], + "type" : "FILEPATH", + "value" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/bin/llvm-dlltool" + }, + { + "name" : "CMAKE_EDIT_COMMAND", + "properties" : + [ + { + "name" : "HELPSTRING", + "value" : "Path to cache edit program executable." + } + ], + "type" : "INTERNAL", + "value" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/bin/ccmake" + }, + { + "name" : "CMAKE_EXECUTABLE_FORMAT", + "properties" : + [ + { + "name" : "HELPSTRING", + "value" : "Executable file format" + } + ], + "type" : "INTERNAL", + "value" : "ELF" + }, + { + "name" : "CMAKE_EXE_LINKER_FLAGS", + "properties" : + [ + { + "name" : "ADVANCED", + "value" : "1" + }, + { + "name" : "HELPSTRING", + "value" : "Flags used by the linker." + } + ], + "type" : "STRING", + "value" : "" + }, + { + "name" : "CMAKE_EXE_LINKER_FLAGS_DEBUG", + "properties" : + [ + { + "name" : "ADVANCED", + "value" : "1" + }, + { + "name" : "HELPSTRING", + "value" : "Flags used by the linker during DEBUG builds." + } + ], + "type" : "STRING", + "value" : "" + }, + { + "name" : "CMAKE_EXE_LINKER_FLAGS_MINSIZEREL", + "properties" : + [ + { + "name" : "ADVANCED", + "value" : "1" + }, + { + "name" : "HELPSTRING", + "value" : "Flags used by the linker during MINSIZEREL builds." + } + ], + "type" : "STRING", + "value" : "" + }, + { + "name" : "CMAKE_EXE_LINKER_FLAGS_RELEASE", + "properties" : + [ + { + "name" : "ADVANCED", + "value" : "1" + }, + { + "name" : "HELPSTRING", + "value" : "Flags used by the linker during RELEASE builds." + } + ], + "type" : "STRING", + "value" : "" + }, + { + "name" : "CMAKE_EXE_LINKER_FLAGS_RELWITHDEBINFO", + "properties" : + [ + { + "name" : "ADVANCED", + "value" : "1" + }, + { + "name" : "HELPSTRING", + "value" : "Flags used by the linker during RELWITHDEBINFO builds." + } + ], + "type" : "STRING", + "value" : "" + }, + { + "name" : "CMAKE_EXPORT_BUILD_DATABASE", + "properties" : + [ + { + "name" : "ADVANCED", + "value" : "1" + }, + { + "name" : "HELPSTRING", + "value" : "Enable/Disable output of build database during the build." + } + ], + "type" : "BOOL", + "value" : "" + }, + { + "name" : "CMAKE_EXPORT_COMPILE_COMMANDS", + "properties" : + [ + { + "name" : "HELPSTRING", + "value" : "No help, variable specified on the command line." + } + ], + "type" : "UNINITIALIZED", + "value" : "ON" + }, + { + "name" : "CMAKE_EXTRA_GENERATOR", + "properties" : + [ + { + "name" : "HELPSTRING", + "value" : "Name of external makefile project generator." + } + ], + "type" : "INTERNAL", + "value" : "" + }, + { + "name" : "CMAKE_FIND_PACKAGE_REDIRECTS_DIR", + "properties" : + [ + { + "name" : "HELPSTRING", + "value" : "Value Computed by CMake." + } + ], + "type" : "STATIC", + "value" : "/Users/hamzaaleghwairyeen/development/App/Intaleq/android/app/.cxx/Debug/3p4b322x/x86/CMakeFiles/pkgRedirects" + }, + { + "name" : "CMAKE_GENERATOR", + "properties" : + [ + { + "name" : "HELPSTRING", + "value" : "Name of generator." + } + ], + "type" : "INTERNAL", + "value" : "Ninja" + }, + { + "name" : "CMAKE_GENERATOR_INSTANCE", + "properties" : + [ + { + "name" : "HELPSTRING", + "value" : "Generator instance identifier." + } + ], + "type" : "INTERNAL", + "value" : "" + }, + { + "name" : "CMAKE_GENERATOR_PLATFORM", + "properties" : + [ + { + "name" : "HELPSTRING", + "value" : "Name of generator platform." + } + ], + "type" : "INTERNAL", + "value" : "" + }, + { + "name" : "CMAKE_GENERATOR_TOOLSET", + "properties" : + [ + { + "name" : "HELPSTRING", + "value" : "Name of generator toolset." + } + ], + "type" : "INTERNAL", + "value" : "" + }, + { + "name" : "CMAKE_HOME_DIRECTORY", + "properties" : + [ + { + "name" : "HELPSTRING", + "value" : "Source directory with the top level CMakeLists.txt file for this project" + } + ], + "type" : "INTERNAL", + "value" : "/Users/hamzaaleghwairyeen/development/App/Intaleq/android/app/src/main/cpp" + }, + { + "name" : "CMAKE_INSTALL_PREFIX", + "properties" : + [ + { + "name" : "HELPSTRING", + "value" : "Install path prefix, prepended onto install directories." + } + ], + "type" : "PATH", + "value" : "/usr/local" + }, + { + "name" : "CMAKE_INSTALL_SO_NO_EXE", + "properties" : + [ + { + "name" : "HELPSTRING", + "value" : "Install .so files without execute permission." + } + ], + "type" : "INTERNAL", + "value" : "0" + }, + { + "name" : "CMAKE_LIBRARY_OUTPUT_DIRECTORY", + "properties" : + [ + { + "name" : "HELPSTRING", + "value" : "No help, variable specified on the command line." + } + ], + "type" : "UNINITIALIZED", + "value" : "/Users/hamzaaleghwairyeen/development/App/Intaleq/build/app/intermediates/cxx/Debug/3p4b322x/obj/x86" + }, + { + "name" : "CMAKE_LINKER", + "properties" : + [ + { + "name" : "ADVANCED", + "value" : "1" + }, + { + "name" : "HELPSTRING", + "value" : "Path to a program." + } + ], + "type" : "FILEPATH", + "value" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/bin/ld.lld" + }, + { + "name" : "CMAKE_MAKE_PROGRAM", + "properties" : + [ + { + "name" : "HELPSTRING", + "value" : "No help, variable specified on the command line." + } + ], + "type" : "UNINITIALIZED", + "value" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/bin/ninja" + }, + { + "name" : "CMAKE_MODULE_LINKER_FLAGS", + "properties" : + [ + { + "name" : "ADVANCED", + "value" : "1" + }, + { + "name" : "HELPSTRING", + "value" : "Flags used by the linker during the creation of modules." + } + ], + "type" : "STRING", + "value" : "" + }, + { + "name" : "CMAKE_MODULE_LINKER_FLAGS_DEBUG", + "properties" : + [ + { + "name" : "ADVANCED", + "value" : "1" + }, + { + "name" : "HELPSTRING", + "value" : "Flags used by the linker during the creation of modules during DEBUG builds." + } + ], + "type" : "STRING", + "value" : "" + }, + { + "name" : "CMAKE_MODULE_LINKER_FLAGS_MINSIZEREL", + "properties" : + [ + { + "name" : "ADVANCED", + "value" : "1" + }, + { + "name" : "HELPSTRING", + "value" : "Flags used by the linker during the creation of modules during MINSIZEREL builds." + } + ], + "type" : "STRING", + "value" : "" + }, + { + "name" : "CMAKE_MODULE_LINKER_FLAGS_RELEASE", + "properties" : + [ + { + "name" : "ADVANCED", + "value" : "1" + }, + { + "name" : "HELPSTRING", + "value" : "Flags used by the linker during the creation of modules during RELEASE builds." + } + ], + "type" : "STRING", + "value" : "" + }, + { + "name" : "CMAKE_MODULE_LINKER_FLAGS_RELWITHDEBINFO", + "properties" : + [ + { + "name" : "ADVANCED", + "value" : "1" + }, + { + "name" : "HELPSTRING", + "value" : "Flags used by the linker during the creation of modules during RELWITHDEBINFO builds." + } + ], + "type" : "STRING", + "value" : "" + }, + { + "name" : "CMAKE_NM", + "properties" : + [ + { + "name" : "ADVANCED", + "value" : "1" + }, + { + "name" : "HELPSTRING", + "value" : "Path to a program." + } + ], + "type" : "FILEPATH", + "value" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/bin/llvm-nm" + }, + { + "name" : "CMAKE_NUMBER_OF_MAKEFILES", + "properties" : + [ + { + "name" : "HELPSTRING", + "value" : "number of local generators" + } + ], + "type" : "INTERNAL", + "value" : "1" + }, + { + "name" : "CMAKE_OBJCOPY", + "properties" : + [ + { + "name" : "ADVANCED", + "value" : "1" + }, + { + "name" : "HELPSTRING", + "value" : "Path to a program." + } + ], + "type" : "FILEPATH", + "value" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/bin/llvm-objcopy" + }, + { + "name" : "CMAKE_OBJDUMP", + "properties" : + [ + { + "name" : "ADVANCED", + "value" : "1" + }, + { + "name" : "HELPSTRING", + "value" : "Path to a program." + } + ], + "type" : "FILEPATH", + "value" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/bin/llvm-objdump" + }, + { + "name" : "CMAKE_PLATFORM_INFO_INITIALIZED", + "properties" : + [ + { + "name" : "HELPSTRING", + "value" : "Platform information initialized" + } + ], + "type" : "INTERNAL", + "value" : "1" + }, + { + "name" : "CMAKE_PROJECT_DESCRIPTION", + "properties" : + [ + { + "name" : "HELPSTRING", + "value" : "Value Computed by CMake" + } + ], + "type" : "STATIC", + "value" : "" + }, + { + "name" : "CMAKE_PROJECT_HOMEPAGE_URL", + "properties" : + [ + { + "name" : "HELPSTRING", + "value" : "Value Computed by CMake" + } + ], + "type" : "STATIC", + "value" : "" + }, + { + "name" : "CMAKE_PROJECT_NAME", + "properties" : + [ + { + "name" : "HELPSTRING", + "value" : "Value Computed by CMake" + } + ], + "type" : "STATIC", + "value" : "intaleq" + }, + { + "name" : "CMAKE_RANLIB", + "properties" : + [ + { + "name" : "ADVANCED", + "value" : "1" + }, + { + "name" : "HELPSTRING", + "value" : "Ranlib" + } + ], + "type" : "FILEPATH", + "value" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/bin/llvm-ranlib" + }, + { + "name" : "CMAKE_READELF", + "properties" : + [ + { + "name" : "ADVANCED", + "value" : "1" + }, + { + "name" : "HELPSTRING", + "value" : "Path to a program." + } + ], + "type" : "FILEPATH", + "value" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/bin/llvm-readelf" + }, + { + "name" : "CMAKE_ROOT", + "properties" : + [ + { + "name" : "HELPSTRING", + "value" : "Path to CMake installation." + } + ], + "type" : "INTERNAL", + "value" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31" + }, + { + "name" : "CMAKE_RUNTIME_OUTPUT_DIRECTORY", + "properties" : + [ + { + "name" : "HELPSTRING", + "value" : "No help, variable specified on the command line." + } + ], + "type" : "UNINITIALIZED", + "value" : "/Users/hamzaaleghwairyeen/development/App/Intaleq/build/app/intermediates/cxx/Debug/3p4b322x/obj/x86" + }, + { + "name" : "CMAKE_SHARED_LINKER_FLAGS", + "properties" : + [ + { + "name" : "ADVANCED", + "value" : "1" + }, + { + "name" : "HELPSTRING", + "value" : "Flags used by the linker during the creation of dll's." + } + ], + "type" : "STRING", + "value" : "" + }, + { + "name" : "CMAKE_SHARED_LINKER_FLAGS_DEBUG", + "properties" : + [ + { + "name" : "ADVANCED", + "value" : "1" + }, + { + "name" : "HELPSTRING", + "value" : "Flags used by the linker during the creation of shared libraries during DEBUG builds." + } + ], + "type" : "STRING", + "value" : "" + }, + { + "name" : "CMAKE_SHARED_LINKER_FLAGS_MINSIZEREL", + "properties" : + [ + { + "name" : "ADVANCED", + "value" : "1" + }, + { + "name" : "HELPSTRING", + "value" : "Flags used by the linker during the creation of shared libraries during MINSIZEREL builds." + } + ], + "type" : "STRING", + "value" : "" + }, + { + "name" : "CMAKE_SHARED_LINKER_FLAGS_RELEASE", + "properties" : + [ + { + "name" : "ADVANCED", + "value" : "1" + }, + { + "name" : "HELPSTRING", + "value" : "Flags used by the linker during the creation of shared libraries during RELEASE builds." + } + ], + "type" : "STRING", + "value" : "" + }, + { + "name" : "CMAKE_SHARED_LINKER_FLAGS_RELWITHDEBINFO", + "properties" : + [ + { + "name" : "ADVANCED", + "value" : "1" + }, + { + "name" : "HELPSTRING", + "value" : "Flags used by the linker during the creation of shared libraries during RELWITHDEBINFO builds." + } + ], + "type" : "STRING", + "value" : "" + }, + { + "name" : "CMAKE_SKIP_INSTALL_RPATH", + "properties" : + [ + { + "name" : "ADVANCED", + "value" : "1" + }, + { + "name" : "HELPSTRING", + "value" : "If set, runtime paths are not added when installing shared libraries, but are added when building." + } + ], + "type" : "BOOL", + "value" : "NO" + }, + { + "name" : "CMAKE_SKIP_RPATH", + "properties" : + [ + { + "name" : "ADVANCED", + "value" : "1" + }, + { + "name" : "HELPSTRING", + "value" : "If set, runtime paths are not added when using shared libraries." + } + ], + "type" : "BOOL", + "value" : "NO" + }, + { + "name" : "CMAKE_STATIC_LINKER_FLAGS", + "properties" : + [ + { + "name" : "ADVANCED", + "value" : "1" + }, + { + "name" : "HELPSTRING", + "value" : "Flags used by the linker during the creation of static libraries during all build types." + } + ], + "type" : "STRING", + "value" : "" + }, + { + "name" : "CMAKE_STATIC_LINKER_FLAGS_DEBUG", + "properties" : + [ + { + "name" : "ADVANCED", + "value" : "1" + }, + { + "name" : "HELPSTRING", + "value" : "Flags used by the linker during the creation of static libraries during DEBUG builds." + } + ], + "type" : "STRING", + "value" : "" + }, + { + "name" : "CMAKE_STATIC_LINKER_FLAGS_MINSIZEREL", + "properties" : + [ + { + "name" : "ADVANCED", + "value" : "1" + }, + { + "name" : "HELPSTRING", + "value" : "Flags used by the linker during the creation of static libraries during MINSIZEREL builds." + } + ], + "type" : "STRING", + "value" : "" + }, + { + "name" : "CMAKE_STATIC_LINKER_FLAGS_RELEASE", + "properties" : + [ + { + "name" : "ADVANCED", + "value" : "1" + }, + { + "name" : "HELPSTRING", + "value" : "Flags used by the linker during the creation of static libraries during RELEASE builds." + } + ], + "type" : "STRING", + "value" : "" + }, + { + "name" : "CMAKE_STATIC_LINKER_FLAGS_RELWITHDEBINFO", + "properties" : + [ + { + "name" : "ADVANCED", + "value" : "1" + }, + { + "name" : "HELPSTRING", + "value" : "Flags used by the linker during the creation of static libraries during RELWITHDEBINFO builds." + } + ], + "type" : "STRING", + "value" : "" + }, + { + "name" : "CMAKE_STRIP", + "properties" : + [ + { + "name" : "ADVANCED", + "value" : "1" + }, + { + "name" : "HELPSTRING", + "value" : "Strip" + } + ], + "type" : "FILEPATH", + "value" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/bin/llvm-strip" + }, + { + "name" : "CMAKE_SYSTEM_NAME", + "properties" : + [ + { + "name" : "HELPSTRING", + "value" : "No help, variable specified on the command line." + } + ], + "type" : "UNINITIALIZED", + "value" : "Android" + }, + { + "name" : "CMAKE_SYSTEM_VERSION", + "properties" : + [ + { + "name" : "HELPSTRING", + "value" : "No help, variable specified on the command line." + } + ], + "type" : "UNINITIALIZED", + "value" : "23" + }, + { + "name" : "CMAKE_TAPI", + "properties" : + [ + { + "name" : "ADVANCED", + "value" : "1" + }, + { + "name" : "HELPSTRING", + "value" : "Path to a program." + } + ], + "type" : "FILEPATH", + "value" : "CMAKE_TAPI-NOTFOUND" + }, + { + "name" : "CMAKE_TOOLCHAIN_FILE", + "properties" : + [ + { + "name" : "HELPSTRING", + "value" : "The CMake toolchain file" + } + ], + "type" : "FILEPATH", + "value" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/build/cmake/android.toolchain.cmake" + }, + { + "name" : "CMAKE_UNAME", + "properties" : + [ + { + "name" : "HELPSTRING", + "value" : "uname command" + } + ], + "type" : "INTERNAL", + "value" : "/usr/bin/uname" + }, + { + "name" : "CMAKE_VERBOSE_MAKEFILE", + "properties" : + [ + { + "name" : "ADVANCED", + "value" : "1" + }, + { + "name" : "HELPSTRING", + "value" : "If this value is on, makefiles will be generated without the .SILENT directive, and all commands will be echoed to the console during the make. This is useful for debugging only. With Visual Studio IDE projects all commands are done without /nologo." + } + ], + "type" : "BOOL", + "value" : "FALSE" + }, + { + "name" : "_CMAKE_CXX_LINKER_PUSHPOP_STATE_SUPPORTED", + "properties" : + [ + { + "name" : "HELPSTRING", + "value" : "linker supports push/pop state" + } + ], + "type" : "INTERNAL", + "value" : "TRUE" + }, + { + "name" : "_CMAKE_C_LINKER_PUSHPOP_STATE_SUPPORTED", + "properties" : + [ + { + "name" : "HELPSTRING", + "value" : "linker supports push/pop state" + } + ], + "type" : "INTERNAL", + "value" : "TRUE" + }, + { + "name" : "_CMAKE_LINKER_PUSHPOP_STATE_SUPPORTED", + "properties" : + [ + { + "name" : "HELPSTRING", + "value" : "linker supports push/pop state" + } + ], + "type" : "INTERNAL", + "value" : "TRUE" + }, + { + "name" : "intaleq_BINARY_DIR", + "properties" : + [ + { + "name" : "HELPSTRING", + "value" : "Value Computed by CMake" + } + ], + "type" : "STATIC", + "value" : "/Users/hamzaaleghwairyeen/development/App/Intaleq/android/app/.cxx/Debug/3p4b322x/x86" + }, + { + "name" : "intaleq_IS_TOP_LEVEL", + "properties" : + [ + { + "name" : "HELPSTRING", + "value" : "Value Computed by CMake" + } + ], + "type" : "STATIC", + "value" : "ON" + }, + { + "name" : "intaleq_SOURCE_DIR", + "properties" : + [ + { + "name" : "HELPSTRING", + "value" : "Value Computed by CMake" + } + ], + "type" : "STATIC", + "value" : "/Users/hamzaaleghwairyeen/development/App/Intaleq/android/app/src/main/cpp" + }, + { + "name" : "log-lib", + "properties" : + [ + { + "name" : "HELPSTRING", + "value" : "Path to a library." + } + ], + "type" : "FILEPATH", + "value" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/lib/i686-linux-android/23/liblog.so" + }, + { + "name" : "native-lib_LIB_DEPENDS", + "properties" : + [ + { + "name" : "HELPSTRING", + "value" : "Dependencies for the target" + } + ], + "type" : "STATIC", + "value" : "general;/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/lib/i686-linux-android/23/liblog.so;" + } + ], + "kind" : "cache", + "version" : + { + "major" : 2, + "minor" : 0 + } +} diff --git a/siro_rider/android/app/.cxx/Debug/3p4b322x/x86/.cmake/api/v1/reply/cmakeFiles-v1-35d31ba9bf56409b7a67.json b/siro_rider/android/app/.cxx/Debug/3p4b322x/x86/.cmake/api/v1/reply/cmakeFiles-v1-35d31ba9bf56409b7a67.json new file mode 100644 index 0000000..e00c27d --- /dev/null +++ b/siro_rider/android/app/.cxx/Debug/3p4b322x/x86/.cmake/api/v1/reply/cmakeFiles-v1-35d31ba9bf56409b7a67.json @@ -0,0 +1,968 @@ +{ + "inputs" : + [ + { + "path" : "CMakeLists.txt" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeDetermineSystem.cmake" + }, + { + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/build/cmake/android.toolchain.cmake" + }, + { + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/build/cmake/android-legacy.toolchain.cmake" + }, + { + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/build/cmake/abis.cmake" + }, + { + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/build/cmake/platforms.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Platform/Android-Determine.cmake" + }, + { + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/build/cmake/hooks/pre/Android-Determine.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeSystem.cmake.in" + }, + { + "isGenerated" : true, + "path" : "/Users/hamzaaleghwairyeen/development/App/Intaleq/android/app/.cxx/Debug/3p4b322x/x86/CMakeFiles/3.31.5-g6cf5163/CMakeSystem.cmake" + }, + { + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/build/cmake/android.toolchain.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeSystemSpecificInitialize.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Platform/Android-Initialize.cmake" + }, + { + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/build/cmake/hooks/pre/Android-Initialize.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Platform/Linux-Initialize.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeDetermineCCompiler.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeDetermineCompiler.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Platform/Android-Determine-C.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Platform/Android/Determine-Compiler.cmake" + }, + { + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/build/cmake/hooks/pre/Determine-Compiler.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeDetermineCompilerId.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeCompilerIdDetection.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/ADSP-DetermineCompiler.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/ARMCC-DetermineCompiler.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/ARMClang-DetermineCompiler.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/AppleClang-DetermineCompiler.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/Clang-DetermineCompilerInternal.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/Borland-DetermineCompiler.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/Bruce-C-DetermineCompiler.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/Clang-DetermineCompiler.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/Clang-DetermineCompilerInternal.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/Compaq-C-DetermineCompiler.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/Cray-DetermineCompiler.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/CrayClang-DetermineCompiler.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/Embarcadero-DetermineCompiler.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/Fujitsu-DetermineCompiler.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/FujitsuClang-DetermineCompiler.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/GHS-DetermineCompiler.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/GNU-C-DetermineCompiler.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/HP-C-DetermineCompiler.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/IAR-DetermineCompiler.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/IBMClang-C-DetermineCompiler.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/Intel-DetermineCompiler.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/IntelLLVM-DetermineCompiler.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/LCC-C-DetermineCompiler.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/MSVC-DetermineCompiler.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/NVHPC-DetermineCompiler.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/NVIDIA-DetermineCompiler.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/OpenWatcom-DetermineCompiler.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/OrangeC-DetermineCompiler.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/PGI-DetermineCompiler.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/PathScale-DetermineCompiler.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/SCO-DetermineCompiler.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/SDCC-C-DetermineCompiler.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/SunPro-C-DetermineCompiler.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/TI-DetermineCompiler.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/TIClang-DetermineCompiler.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/Tasking-DetermineCompiler.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/TinyCC-C-DetermineCompiler.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/VisualAge-C-DetermineCompiler.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/IBMCPP-C-DetermineVersionInternal.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/Watcom-DetermineCompiler.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/XL-C-DetermineCompiler.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/IBMCPP-C-DetermineVersionInternal.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/XLClang-C-DetermineCompiler.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/zOS-C-DetermineCompiler.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/IBMCPP-C-DetermineVersionInternal.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeFindBinUtils.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/Clang-FindBinUtils.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeCCompiler.cmake.in" + }, + { + "isGenerated" : true, + "path" : "/Users/hamzaaleghwairyeen/development/App/Intaleq/android/app/.cxx/Debug/3p4b322x/x86/CMakeFiles/3.31.5-g6cf5163/CMakeCCompiler.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeDetermineCXXCompiler.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeDetermineCompiler.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Platform/Android-Determine-CXX.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Platform/Android/Determine-Compiler.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeDetermineCompilerId.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeCompilerIdDetection.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/ADSP-DetermineCompiler.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/ARMCC-DetermineCompiler.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/ARMClang-DetermineCompiler.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/AppleClang-DetermineCompiler.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/Clang-DetermineCompilerInternal.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/Borland-DetermineCompiler.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/Clang-DetermineCompiler.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/Clang-DetermineCompilerInternal.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/Compaq-CXX-DetermineCompiler.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/Cray-DetermineCompiler.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/CrayClang-DetermineCompiler.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/Embarcadero-DetermineCompiler.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/Fujitsu-DetermineCompiler.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/FujitsuClang-DetermineCompiler.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/GHS-DetermineCompiler.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/GNU-CXX-DetermineCompiler.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/HP-CXX-DetermineCompiler.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/IAR-DetermineCompiler.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/IBMClang-CXX-DetermineCompiler.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/Intel-DetermineCompiler.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/IntelLLVM-DetermineCompiler.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/LCC-CXX-DetermineCompiler.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/MSVC-DetermineCompiler.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/NVHPC-DetermineCompiler.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/NVIDIA-DetermineCompiler.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/OpenWatcom-DetermineCompiler.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/OrangeC-DetermineCompiler.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/PGI-DetermineCompiler.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/PathScale-DetermineCompiler.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/SCO-DetermineCompiler.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/SunPro-CXX-DetermineCompiler.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/TI-DetermineCompiler.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/TIClang-DetermineCompiler.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/Tasking-DetermineCompiler.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/VisualAge-CXX-DetermineCompiler.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/IBMCPP-CXX-DetermineVersionInternal.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/Watcom-DetermineCompiler.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/XL-CXX-DetermineCompiler.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/IBMCPP-CXX-DetermineVersionInternal.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/XLClang-CXX-DetermineCompiler.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/zOS-CXX-DetermineCompiler.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/IBMCPP-CXX-DetermineVersionInternal.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeFindBinUtils.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/Clang-FindBinUtils.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeCXXCompiler.cmake.in" + }, + { + "isGenerated" : true, + "path" : "/Users/hamzaaleghwairyeen/development/App/Intaleq/android/app/.cxx/Debug/3p4b322x/x86/CMakeFiles/3.31.5-g6cf5163/CMakeCXXCompiler.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeSystemSpecificInformation.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeGenericSystem.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeInitializeConfigs.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Platform/Android.cmake" + }, + { + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/build/cmake/hooks/pre/Android.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Platform/Linux.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Platform/UnixPaths.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeCInformation.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeLanguageInformation.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/Clang-C.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/Clang.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/CMakeCommonCompilerMacros.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/GNU.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/CMakeCommonCompilerMacros.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Platform/Android-Clang-C.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Platform/Android-Clang.cmake" + }, + { + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/build/cmake/hooks/pre/Android-Clang.cmake" + }, + { + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/build/cmake/flags.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeCommonLanguageInclude.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeTestCCompiler.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeTestCompilerCommon.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeDetermineCompilerABI.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Internal/CMakeDetermineLinkerId.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeParseImplicitIncludeInfo.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeParseImplicitLinkInfo.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeParseLibraryArchitecture.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeTestCompilerCommon.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeCCompilerABI.c" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeDetermineCompilerSupport.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Internal/FeatureTesting.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeCCompiler.cmake.in" + }, + { + "isGenerated" : true, + "path" : "/Users/hamzaaleghwairyeen/development/App/Intaleq/android/app/.cxx/Debug/3p4b322x/x86/CMakeFiles/3.31.5-g6cf5163/CMakeCCompiler.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Internal/CMakeCLinkerInformation.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Internal/CMakeCommonLinkerInformation.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Linker/LLD-C.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Linker/LLD.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Linker/GNU.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Platform/Linker/Android-LLD-C.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Platform/Linker/Linux-LLD-C.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Platform/Linker/Linux-LLD.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Platform/Linker/Linux-GNU.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Platform/Linker/GNU.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeCXXInformation.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeLanguageInformation.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/Clang-CXX.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/Clang.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Platform/Android-Clang-CXX.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Platform/Android-Clang.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeCommonLanguageInclude.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeTestCXXCompiler.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeTestCompilerCommon.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeDetermineCompilerABI.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Internal/CMakeDetermineLinkerId.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeParseImplicitIncludeInfo.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeParseImplicitLinkInfo.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeParseLibraryArchitecture.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeTestCompilerCommon.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeCXXCompilerABI.cpp" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeDetermineCompilerSupport.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Internal/FeatureTesting.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/Clang-CXX-CXXImportStd.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/Clang-CXX-CXXImportStd.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeCXXCompiler.cmake.in" + }, + { + "isGenerated" : true, + "path" : "/Users/hamzaaleghwairyeen/development/App/Intaleq/android/app/.cxx/Debug/3p4b322x/x86/CMakeFiles/3.31.5-g6cf5163/CMakeCXXCompiler.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Internal/CMakeCXXLinkerInformation.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Internal/CMakeCommonLinkerInformation.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Linker/LLD-CXX.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Linker/LLD.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Platform/Linker/Android-LLD-CXX.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Platform/Linker/Linux-LLD-CXX.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Platform/Linker/Linux-LLD.cmake" + } + ], + "kind" : "cmakeFiles", + "paths" : + { + "build" : "/Users/hamzaaleghwairyeen/development/App/Intaleq/android/app/.cxx/Debug/3p4b322x/x86", + "source" : "/Users/hamzaaleghwairyeen/development/App/Intaleq/android/app/src/main/cpp" + }, + "version" : + { + "major" : 1, + "minor" : 1 + } +} diff --git a/siro_rider/android/app/.cxx/Debug/3p4b322x/x86/.cmake/api/v1/reply/codemodel-v2-be0711a4c4315a985e60.json b/siro_rider/android/app/.cxx/Debug/3p4b322x/x86/.cmake/api/v1/reply/codemodel-v2-be0711a4c4315a985e60.json new file mode 100644 index 0000000..f537089 --- /dev/null +++ b/siro_rider/android/app/.cxx/Debug/3p4b322x/x86/.cmake/api/v1/reply/codemodel-v2-be0711a4c4315a985e60.json @@ -0,0 +1,60 @@ +{ + "configurations" : + [ + { + "directories" : + [ + { + "build" : ".", + "jsonFile" : "directory-.-Debug-f5ebdc15457944623624.json", + "minimumCMakeVersion" : + { + "string" : "3.6.0" + }, + "projectIndex" : 0, + "source" : ".", + "targetIndexes" : + [ + 0 + ] + } + ], + "name" : "Debug", + "projects" : + [ + { + "directoryIndexes" : + [ + 0 + ], + "name" : "intaleq", + "targetIndexes" : + [ + 0 + ] + } + ], + "targets" : + [ + { + "directoryIndex" : 0, + "id" : "native-lib::@6890427a1f51a3e7e1df", + "jsonFile" : "target-native-lib-Debug-0e0bb6a93a67c046adcd.json", + "name" : "native-lib", + "projectIndex" : 0 + } + ] + } + ], + "kind" : "codemodel", + "paths" : + { + "build" : "/Users/hamzaaleghwairyeen/development/App/Intaleq/android/app/.cxx/Debug/3p4b322x/x86", + "source" : "/Users/hamzaaleghwairyeen/development/App/Intaleq/android/app/src/main/cpp" + }, + "version" : + { + "major" : 2, + "minor" : 7 + } +} diff --git a/siro_rider/android/app/.cxx/Debug/3p4b322x/x86/.cmake/api/v1/reply/directory-.-Debug-f5ebdc15457944623624.json b/siro_rider/android/app/.cxx/Debug/3p4b322x/x86/.cmake/api/v1/reply/directory-.-Debug-f5ebdc15457944623624.json new file mode 100644 index 0000000..3a67af9 --- /dev/null +++ b/siro_rider/android/app/.cxx/Debug/3p4b322x/x86/.cmake/api/v1/reply/directory-.-Debug-f5ebdc15457944623624.json @@ -0,0 +1,14 @@ +{ + "backtraceGraph" : + { + "commands" : [], + "files" : [], + "nodes" : [] + }, + "installers" : [], + "paths" : + { + "build" : ".", + "source" : "." + } +} diff --git a/siro_rider/android/app/.cxx/Debug/3p4b322x/x86/.cmake/api/v1/reply/index-2025-07-02T19-25-23-0479.json b/siro_rider/android/app/.cxx/Debug/3p4b322x/x86/.cmake/api/v1/reply/index-2025-07-02T19-25-23-0479.json new file mode 100644 index 0000000..0518dc8 --- /dev/null +++ b/siro_rider/android/app/.cxx/Debug/3p4b322x/x86/.cmake/api/v1/reply/index-2025-07-02T19-25-23-0479.json @@ -0,0 +1,92 @@ +{ + "cmake" : + { + "generator" : + { + "multiConfig" : false, + "name" : "Ninja" + }, + "paths" : + { + "cmake" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/bin/cmake", + "cpack" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/bin/cpack", + "ctest" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/bin/ctest", + "root" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31" + }, + "version" : + { + "isDirty" : false, + "major" : 3, + "minor" : 31, + "patch" : 5, + "string" : "3.31.5-g6cf5163", + "suffix" : "g6cf5163" + } + }, + "objects" : + [ + { + "jsonFile" : "codemodel-v2-be0711a4c4315a985e60.json", + "kind" : "codemodel", + "version" : + { + "major" : 2, + "minor" : 7 + } + }, + { + "jsonFile" : "cache-v2-22adc30e24d1cde66655.json", + "kind" : "cache", + "version" : + { + "major" : 2, + "minor" : 0 + } + }, + { + "jsonFile" : "cmakeFiles-v1-35d31ba9bf56409b7a67.json", + "kind" : "cmakeFiles", + "version" : + { + "major" : 1, + "minor" : 1 + } + } + ], + "reply" : + { + "client-agp" : + { + "cache-v2" : + { + "jsonFile" : "cache-v2-22adc30e24d1cde66655.json", + "kind" : "cache", + "version" : + { + "major" : 2, + "minor" : 0 + } + }, + "cmakeFiles-v1" : + { + "jsonFile" : "cmakeFiles-v1-35d31ba9bf56409b7a67.json", + "kind" : "cmakeFiles", + "version" : + { + "major" : 1, + "minor" : 1 + } + }, + "codemodel-v2" : + { + "jsonFile" : "codemodel-v2-be0711a4c4315a985e60.json", + "kind" : "codemodel", + "version" : + { + "major" : 2, + "minor" : 7 + } + } + } + } +} diff --git a/siro_rider/android/app/.cxx/Debug/3p4b322x/x86/.cmake/api/v1/reply/target-native-lib-Debug-0e0bb6a93a67c046adcd.json b/siro_rider/android/app/.cxx/Debug/3p4b322x/x86/.cmake/api/v1/reply/target-native-lib-Debug-0e0bb6a93a67c046adcd.json new file mode 100644 index 0000000..f3decdc --- /dev/null +++ b/siro_rider/android/app/.cxx/Debug/3p4b322x/x86/.cmake/api/v1/reply/target-native-lib-Debug-0e0bb6a93a67c046adcd.json @@ -0,0 +1,117 @@ +{ + "artifacts" : + [ + { + "path" : "/Users/hamzaaleghwairyeen/development/App/Intaleq/build/app/intermediates/cxx/Debug/3p4b322x/obj/x86/libnative-lib.so" + } + ], + "backtrace" : 1, + "backtraceGraph" : + { + "commands" : + [ + "add_library", + "target_link_libraries" + ], + "files" : + [ + "CMakeLists.txt" + ], + "nodes" : + [ + { + "file" : 0 + }, + { + "command" : 0, + "file" : 0, + "line" : 4, + "parent" : 0 + }, + { + "command" : 1, + "file" : 0, + "line" : 8, + "parent" : 0 + } + ] + }, + "compileGroups" : + [ + { + "compileCommandFragments" : + [ + { + "fragment" : "-g -DANDROID -fdata-sections -ffunction-sections -funwind-tables -fstack-protector-strong -no-canonical-prefixes -mstackrealign -D_FORTIFY_SOURCE=2 -Wformat -Werror=format-security -fno-limit-debug-info -fPIC" + } + ], + "defines" : + [ + { + "define" : "native_lib_EXPORTS" + } + ], + "language" : "CXX", + "sourceIndexes" : + [ + 0 + ], + "sysroot" : + { + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot" + } + } + ], + "id" : "native-lib::@6890427a1f51a3e7e1df", + "link" : + { + "commandFragments" : + [ + { + "fragment" : "-static-libstdc++ -Wl,--build-id=sha1 -Wl,--no-rosegment -Wl,--no-undefined-version -Wl,--fatal-warnings -Wl,--no-undefined -Qunused-arguments", + "role" : "flags" + }, + { + "backtrace" : 2, + "fragment" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/lib/i686-linux-android/23/liblog.so", + "role" : "libraries" + }, + { + "fragment" : "-latomic -lm", + "role" : "libraries" + } + ], + "language" : "CXX", + "sysroot" : + { + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot" + } + }, + "name" : "native-lib", + "nameOnDisk" : "libnative-lib.so", + "paths" : + { + "build" : ".", + "source" : "." + }, + "sourceGroups" : + [ + { + "name" : "Source Files", + "sourceIndexes" : + [ + 0 + ] + } + ], + "sources" : + [ + { + "backtrace" : 1, + "compileGroupIndex" : 0, + "path" : "native-lib.cpp", + "sourceGroupIndex" : 0 + } + ], + "type" : "SHARED_LIBRARY" +} diff --git a/siro_rider/android/app/.cxx/Debug/3p4b322x/x86/.ninja_deps b/siro_rider/android/app/.cxx/Debug/3p4b322x/x86/.ninja_deps new file mode 100644 index 0000000..c011cd7 Binary files /dev/null and b/siro_rider/android/app/.cxx/Debug/3p4b322x/x86/.ninja_deps differ diff --git a/siro_rider/android/app/.cxx/Debug/3p4b322x/x86/.ninja_log b/siro_rider/android/app/.cxx/Debug/3p4b322x/x86/.ninja_log new file mode 100644 index 0000000..b177375 --- /dev/null +++ b/siro_rider/android/app/.cxx/Debug/3p4b322x/x86/.ninja_log @@ -0,0 +1,7 @@ +# ninja log v5 +0 493 1751484324115185971 CMakeFiles/native-lib.dir/native-lib.cpp.o cd66dae3bd4376f8 +494 550 1751484324172612995 /Users/hamzaaleghwairyeen/development/App/Intaleq/build/app/intermediates/cxx/Debug/3p4b322x/obj/x86/libnative-lib.so 8ee03c458991a6bc +6 302 1751485309486277070 CMakeFiles/native-lib.dir/native-lib.cpp.o cd66dae3bd4376f8 +302 347 1751485309533915723 /Users/hamzaaleghwairyeen/development/App/Intaleq/build/app/intermediates/cxx/Debug/3p4b322x/obj/x86/libnative-lib.so 8ee03c458991a6bc +18 1078 1751490331048371910 /Users/hamzaaleghwairyeen/development/App/Intaleq/build/app/intermediates/cxx/Debug/3p4b322x/obj/x86/libnative-lib.so 8ee03c458991a6bc +12 195 1752227574238917966 /Users/hamzaaleghwairyeen/development/App/Intaleq/build/app/intermediates/cxx/Debug/3p4b322x/obj/x86/libnative-lib.so 8ee03c458991a6bc diff --git a/siro_rider/android/app/.cxx/Debug/3p4b322x/x86/CMakeCache.txt b/siro_rider/android/app/.cxx/Debug/3p4b322x/x86/CMakeCache.txt new file mode 100644 index 0000000..bc40534 --- /dev/null +++ b/siro_rider/android/app/.cxx/Debug/3p4b322x/x86/CMakeCache.txt @@ -0,0 +1,430 @@ +# This is the CMakeCache file. +# For build in directory: /Users/hamzaaleghwairyeen/development/App/Intaleq/android/app/.cxx/Debug/3p4b322x/x86 +# It was generated by CMake: /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/bin/cmake +# You can edit this file to change values found and used by cmake. +# If you do not want to change any of the values, simply exit the editor. +# If you do want to change a value, simply edit, save, and exit the editor. +# The syntax for the file is as follows: +# KEY:TYPE=VALUE +# KEY is the name of a variable in the cache. +# TYPE is a hint to GUIs for the type of VALUE, DO NOT EDIT TYPE!. +# VALUE is the current value for the KEY. + +######################## +# EXTERNAL cache entries +######################## + +//No help, variable specified on the command line. +ANDROID_ABI:UNINITIALIZED=x86 + +//No help, variable specified on the command line. +ANDROID_NDK:UNINITIALIZED=/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973 + +//No help, variable specified on the command line. +ANDROID_PLATFORM:UNINITIALIZED=android-23 + +//Path to a program. +CMAKE_ADDR2LINE:FILEPATH=/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/bin/llvm-addr2line + +//No help, variable specified on the command line. +CMAKE_ANDROID_ARCH_ABI:UNINITIALIZED=x86 + +//No help, variable specified on the command line. +CMAKE_ANDROID_NDK:UNINITIALIZED=/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973 + +//Archiver +CMAKE_AR:FILEPATH=/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/bin/llvm-ar + +//Flags used by the compiler during all build types. +CMAKE_ASM_FLAGS:STRING= + +//Flags used by the compiler during debug builds. +CMAKE_ASM_FLAGS_DEBUG:STRING= + +//Flags used by the compiler during release builds. +CMAKE_ASM_FLAGS_RELEASE:STRING= + +//Choose the type of build, options are: None Debug Release RelWithDebInfo +// MinSizeRel ... +CMAKE_BUILD_TYPE:STRING=Debug + +//LLVM archiver +CMAKE_CXX_COMPILER_AR:FILEPATH=/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/bin/llvm-ar + +//`clang-scan-deps` dependency scanner +CMAKE_CXX_COMPILER_CLANG_SCAN_DEPS:FILEPATH=/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/bin/clang-scan-deps + +//Generate index for LLVM archive +CMAKE_CXX_COMPILER_RANLIB:FILEPATH=/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/bin/llvm-ranlib + +//Flags used by the compiler during all build types. +CMAKE_CXX_FLAGS:STRING= + +//Flags used by the compiler during debug builds. +CMAKE_CXX_FLAGS_DEBUG:STRING= + +//Flags used by the CXX compiler during MINSIZEREL builds. +CMAKE_CXX_FLAGS_MINSIZEREL:STRING=-Os -DNDEBUG + +//Flags used by the compiler during release builds. +CMAKE_CXX_FLAGS_RELEASE:STRING= + +//Flags used by the CXX compiler during RELWITHDEBINFO builds. +CMAKE_CXX_FLAGS_RELWITHDEBINFO:STRING=-O2 -g -DNDEBUG + +//Libraries linked by default with all C++ applications. +CMAKE_CXX_STANDARD_LIBRARIES:STRING=-latomic -lm + +//LLVM archiver +CMAKE_C_COMPILER_AR:FILEPATH=/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/bin/llvm-ar + +//`clang-scan-deps` dependency scanner +CMAKE_C_COMPILER_CLANG_SCAN_DEPS:FILEPATH=/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/bin/clang-scan-deps + +//Generate index for LLVM archive +CMAKE_C_COMPILER_RANLIB:FILEPATH=/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/bin/llvm-ranlib + +//Flags used by the compiler during all build types. +CMAKE_C_FLAGS:STRING= + +//Flags used by the compiler during debug builds. +CMAKE_C_FLAGS_DEBUG:STRING= + +//Flags used by the C compiler during MINSIZEREL builds. +CMAKE_C_FLAGS_MINSIZEREL:STRING=-Os -DNDEBUG + +//Flags used by the compiler during release builds. +CMAKE_C_FLAGS_RELEASE:STRING= + +//Flags used by the C compiler during RELWITHDEBINFO builds. +CMAKE_C_FLAGS_RELWITHDEBINFO:STRING=-O2 -g -DNDEBUG + +//Libraries linked by default with all C applications. +CMAKE_C_STANDARD_LIBRARIES:STRING=-latomic -lm + +//Path to a program. +CMAKE_DLLTOOL:FILEPATH=/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/bin/llvm-dlltool + +//Flags used by the linker. +CMAKE_EXE_LINKER_FLAGS:STRING= + +//Flags used by the linker during DEBUG builds. +CMAKE_EXE_LINKER_FLAGS_DEBUG:STRING= + +//Flags used by the linker during MINSIZEREL builds. +CMAKE_EXE_LINKER_FLAGS_MINSIZEREL:STRING= + +//Flags used by the linker during RELEASE builds. +CMAKE_EXE_LINKER_FLAGS_RELEASE:STRING= + +//Flags used by the linker during RELWITHDEBINFO builds. +CMAKE_EXE_LINKER_FLAGS_RELWITHDEBINFO:STRING= + +//Enable/Disable output of build database during the build. +CMAKE_EXPORT_BUILD_DATABASE:BOOL= + +//No help, variable specified on the command line. +CMAKE_EXPORT_COMPILE_COMMANDS:UNINITIALIZED=ON + +//Value Computed by CMake. +CMAKE_FIND_PACKAGE_REDIRECTS_DIR:STATIC=/Users/hamzaaleghwairyeen/development/App/Intaleq/android/app/.cxx/Debug/3p4b322x/x86/CMakeFiles/pkgRedirects + +//Install path prefix, prepended onto install directories. +CMAKE_INSTALL_PREFIX:PATH=/usr/local + +//No help, variable specified on the command line. +CMAKE_LIBRARY_OUTPUT_DIRECTORY:UNINITIALIZED=/Users/hamzaaleghwairyeen/development/App/Intaleq/build/app/intermediates/cxx/Debug/3p4b322x/obj/x86 + +//Path to a program. +CMAKE_LINKER:FILEPATH=/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/bin/ld.lld + +//No help, variable specified on the command line. +CMAKE_MAKE_PROGRAM:UNINITIALIZED=/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/bin/ninja + +//Flags used by the linker during the creation of modules. +CMAKE_MODULE_LINKER_FLAGS:STRING= + +//Flags used by the linker during the creation of modules during +// DEBUG builds. +CMAKE_MODULE_LINKER_FLAGS_DEBUG:STRING= + +//Flags used by the linker during the creation of modules during +// MINSIZEREL builds. +CMAKE_MODULE_LINKER_FLAGS_MINSIZEREL:STRING= + +//Flags used by the linker during the creation of modules during +// RELEASE builds. +CMAKE_MODULE_LINKER_FLAGS_RELEASE:STRING= + +//Flags used by the linker during the creation of modules during +// RELWITHDEBINFO builds. +CMAKE_MODULE_LINKER_FLAGS_RELWITHDEBINFO:STRING= + +//Path to a program. +CMAKE_NM:FILEPATH=/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/bin/llvm-nm + +//Path to a program. +CMAKE_OBJCOPY:FILEPATH=/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/bin/llvm-objcopy + +//Path to a program. +CMAKE_OBJDUMP:FILEPATH=/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/bin/llvm-objdump + +//Value Computed by CMake +CMAKE_PROJECT_DESCRIPTION:STATIC= + +//Value Computed by CMake +CMAKE_PROJECT_HOMEPAGE_URL:STATIC= + +//Value Computed by CMake +CMAKE_PROJECT_NAME:STATIC=intaleq + +//Ranlib +CMAKE_RANLIB:FILEPATH=/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/bin/llvm-ranlib + +//Path to a program. +CMAKE_READELF:FILEPATH=/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/bin/llvm-readelf + +//No help, variable specified on the command line. +CMAKE_RUNTIME_OUTPUT_DIRECTORY:UNINITIALIZED=/Users/hamzaaleghwairyeen/development/App/Intaleq/build/app/intermediates/cxx/Debug/3p4b322x/obj/x86 + +//Flags used by the linker during the creation of dll's. +CMAKE_SHARED_LINKER_FLAGS:STRING= + +//Flags used by the linker during the creation of shared libraries +// during DEBUG builds. +CMAKE_SHARED_LINKER_FLAGS_DEBUG:STRING= + +//Flags used by the linker during the creation of shared libraries +// during MINSIZEREL builds. +CMAKE_SHARED_LINKER_FLAGS_MINSIZEREL:STRING= + +//Flags used by the linker during the creation of shared libraries +// during RELEASE builds. +CMAKE_SHARED_LINKER_FLAGS_RELEASE:STRING= + +//Flags used by the linker during the creation of shared libraries +// during RELWITHDEBINFO builds. +CMAKE_SHARED_LINKER_FLAGS_RELWITHDEBINFO:STRING= + +//If set, runtime paths are not added when installing shared libraries, +// but are added when building. +CMAKE_SKIP_INSTALL_RPATH:BOOL=NO + +//If set, runtime paths are not added when using shared libraries. +CMAKE_SKIP_RPATH:BOOL=NO + +//Flags used by the linker during the creation of static libraries +// during all build types. +CMAKE_STATIC_LINKER_FLAGS:STRING= + +//Flags used by the linker during the creation of static libraries +// during DEBUG builds. +CMAKE_STATIC_LINKER_FLAGS_DEBUG:STRING= + +//Flags used by the linker during the creation of static libraries +// during MINSIZEREL builds. +CMAKE_STATIC_LINKER_FLAGS_MINSIZEREL:STRING= + +//Flags used by the linker during the creation of static libraries +// during RELEASE builds. +CMAKE_STATIC_LINKER_FLAGS_RELEASE:STRING= + +//Flags used by the linker during the creation of static libraries +// during RELWITHDEBINFO builds. +CMAKE_STATIC_LINKER_FLAGS_RELWITHDEBINFO:STRING= + +//Strip +CMAKE_STRIP:FILEPATH=/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/bin/llvm-strip + +//No help, variable specified on the command line. +CMAKE_SYSTEM_NAME:UNINITIALIZED=Android + +//No help, variable specified on the command line. +CMAKE_SYSTEM_VERSION:UNINITIALIZED=23 + +//Path to a program. +CMAKE_TAPI:FILEPATH=CMAKE_TAPI-NOTFOUND + +//The CMake toolchain file +CMAKE_TOOLCHAIN_FILE:FILEPATH=/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/build/cmake/android.toolchain.cmake + +//If this value is on, makefiles will be generated without the +// .SILENT directive, and all commands will be echoed to the console +// during the make. This is useful for debugging only. With Visual +// Studio IDE projects all commands are done without /nologo. +CMAKE_VERBOSE_MAKEFILE:BOOL=FALSE + +//Value Computed by CMake +intaleq_BINARY_DIR:STATIC=/Users/hamzaaleghwairyeen/development/App/Intaleq/android/app/.cxx/Debug/3p4b322x/x86 + +//Value Computed by CMake +intaleq_IS_TOP_LEVEL:STATIC=ON + +//Value Computed by CMake +intaleq_SOURCE_DIR:STATIC=/Users/hamzaaleghwairyeen/development/App/Intaleq/android/app/src/main/cpp + +//Path to a library. +log-lib:FILEPATH=/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/lib/i686-linux-android/23/liblog.so + +//Dependencies for the target +native-lib_LIB_DEPENDS:STATIC=general;/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/lib/i686-linux-android/23/liblog.so; + + +######################## +# INTERNAL cache entries +######################## + +//ADVANCED property for variable: CMAKE_ADDR2LINE +CMAKE_ADDR2LINE-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_AR +CMAKE_AR-ADVANCED:INTERNAL=1 +//This is the directory where this CMakeCache.txt was created +CMAKE_CACHEFILE_DIR:INTERNAL=/Users/hamzaaleghwairyeen/development/App/Intaleq/android/app/.cxx/Debug/3p4b322x/x86 +//Major version of cmake used to create the current loaded cache +CMAKE_CACHE_MAJOR_VERSION:INTERNAL=3 +//Minor version of cmake used to create the current loaded cache +CMAKE_CACHE_MINOR_VERSION:INTERNAL=31 +//Patch version of cmake used to create the current loaded cache +CMAKE_CACHE_PATCH_VERSION:INTERNAL=5 +//Path to CMake executable. +CMAKE_COMMAND:INTERNAL=/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/bin/cmake +//Path to cpack program executable. +CMAKE_CPACK_COMMAND:INTERNAL=/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/bin/cpack +//Path to ctest program executable. +CMAKE_CTEST_COMMAND:INTERNAL=/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/bin/ctest +//ADVANCED property for variable: CMAKE_CXX_COMPILER_AR +CMAKE_CXX_COMPILER_AR-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_CXX_COMPILER_CLANG_SCAN_DEPS +CMAKE_CXX_COMPILER_CLANG_SCAN_DEPS-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_CXX_COMPILER_RANLIB +CMAKE_CXX_COMPILER_RANLIB-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_CXX_FLAGS +CMAKE_CXX_FLAGS-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_CXX_FLAGS_DEBUG +CMAKE_CXX_FLAGS_DEBUG-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_CXX_FLAGS_MINSIZEREL +CMAKE_CXX_FLAGS_MINSIZEREL-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_CXX_FLAGS_RELEASE +CMAKE_CXX_FLAGS_RELEASE-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_CXX_FLAGS_RELWITHDEBINFO +CMAKE_CXX_FLAGS_RELWITHDEBINFO-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_CXX_STANDARD_LIBRARIES +CMAKE_CXX_STANDARD_LIBRARIES-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_C_COMPILER_AR +CMAKE_C_COMPILER_AR-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_C_COMPILER_CLANG_SCAN_DEPS +CMAKE_C_COMPILER_CLANG_SCAN_DEPS-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_C_COMPILER_RANLIB +CMAKE_C_COMPILER_RANLIB-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_C_FLAGS +CMAKE_C_FLAGS-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_C_FLAGS_DEBUG +CMAKE_C_FLAGS_DEBUG-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_C_FLAGS_MINSIZEREL +CMAKE_C_FLAGS_MINSIZEREL-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_C_FLAGS_RELEASE +CMAKE_C_FLAGS_RELEASE-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_C_FLAGS_RELWITHDEBINFO +CMAKE_C_FLAGS_RELWITHDEBINFO-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_C_STANDARD_LIBRARIES +CMAKE_C_STANDARD_LIBRARIES-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_DLLTOOL +CMAKE_DLLTOOL-ADVANCED:INTERNAL=1 +//Path to cache edit program executable. +CMAKE_EDIT_COMMAND:INTERNAL=/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/bin/ccmake +//Executable file format +CMAKE_EXECUTABLE_FORMAT:INTERNAL=ELF +//ADVANCED property for variable: CMAKE_EXE_LINKER_FLAGS +CMAKE_EXE_LINKER_FLAGS-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_EXE_LINKER_FLAGS_DEBUG +CMAKE_EXE_LINKER_FLAGS_DEBUG-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_EXE_LINKER_FLAGS_MINSIZEREL +CMAKE_EXE_LINKER_FLAGS_MINSIZEREL-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_EXE_LINKER_FLAGS_RELEASE +CMAKE_EXE_LINKER_FLAGS_RELEASE-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_EXE_LINKER_FLAGS_RELWITHDEBINFO +CMAKE_EXE_LINKER_FLAGS_RELWITHDEBINFO-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_EXPORT_BUILD_DATABASE +CMAKE_EXPORT_BUILD_DATABASE-ADVANCED:INTERNAL=1 +//Name of external makefile project generator. +CMAKE_EXTRA_GENERATOR:INTERNAL= +//Name of generator. +CMAKE_GENERATOR:INTERNAL=Ninja +//Generator instance identifier. +CMAKE_GENERATOR_INSTANCE:INTERNAL= +//Name of generator platform. +CMAKE_GENERATOR_PLATFORM:INTERNAL= +//Name of generator toolset. +CMAKE_GENERATOR_TOOLSET:INTERNAL= +//Source directory with the top level CMakeLists.txt file for this +// project +CMAKE_HOME_DIRECTORY:INTERNAL=/Users/hamzaaleghwairyeen/development/App/Intaleq/android/app/src/main/cpp +//Install .so files without execute permission. +CMAKE_INSTALL_SO_NO_EXE:INTERNAL=0 +//ADVANCED property for variable: CMAKE_LINKER +CMAKE_LINKER-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_MODULE_LINKER_FLAGS +CMAKE_MODULE_LINKER_FLAGS-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_MODULE_LINKER_FLAGS_DEBUG +CMAKE_MODULE_LINKER_FLAGS_DEBUG-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_MODULE_LINKER_FLAGS_MINSIZEREL +CMAKE_MODULE_LINKER_FLAGS_MINSIZEREL-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_MODULE_LINKER_FLAGS_RELEASE +CMAKE_MODULE_LINKER_FLAGS_RELEASE-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_MODULE_LINKER_FLAGS_RELWITHDEBINFO +CMAKE_MODULE_LINKER_FLAGS_RELWITHDEBINFO-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_NM +CMAKE_NM-ADVANCED:INTERNAL=1 +//number of local generators +CMAKE_NUMBER_OF_MAKEFILES:INTERNAL=1 +//ADVANCED property for variable: CMAKE_OBJCOPY +CMAKE_OBJCOPY-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_OBJDUMP +CMAKE_OBJDUMP-ADVANCED:INTERNAL=1 +//Platform information initialized +CMAKE_PLATFORM_INFO_INITIALIZED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_RANLIB +CMAKE_RANLIB-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_READELF +CMAKE_READELF-ADVANCED:INTERNAL=1 +//Path to CMake installation. +CMAKE_ROOT:INTERNAL=/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31 +//ADVANCED property for variable: CMAKE_SHARED_LINKER_FLAGS +CMAKE_SHARED_LINKER_FLAGS-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_SHARED_LINKER_FLAGS_DEBUG +CMAKE_SHARED_LINKER_FLAGS_DEBUG-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_SHARED_LINKER_FLAGS_MINSIZEREL +CMAKE_SHARED_LINKER_FLAGS_MINSIZEREL-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_SHARED_LINKER_FLAGS_RELEASE +CMAKE_SHARED_LINKER_FLAGS_RELEASE-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_SHARED_LINKER_FLAGS_RELWITHDEBINFO +CMAKE_SHARED_LINKER_FLAGS_RELWITHDEBINFO-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_SKIP_INSTALL_RPATH +CMAKE_SKIP_INSTALL_RPATH-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_SKIP_RPATH +CMAKE_SKIP_RPATH-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_STATIC_LINKER_FLAGS +CMAKE_STATIC_LINKER_FLAGS-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_STATIC_LINKER_FLAGS_DEBUG +CMAKE_STATIC_LINKER_FLAGS_DEBUG-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_STATIC_LINKER_FLAGS_MINSIZEREL +CMAKE_STATIC_LINKER_FLAGS_MINSIZEREL-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_STATIC_LINKER_FLAGS_RELEASE +CMAKE_STATIC_LINKER_FLAGS_RELEASE-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_STATIC_LINKER_FLAGS_RELWITHDEBINFO +CMAKE_STATIC_LINKER_FLAGS_RELWITHDEBINFO-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_STRIP +CMAKE_STRIP-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_TAPI +CMAKE_TAPI-ADVANCED:INTERNAL=1 +//uname command +CMAKE_UNAME:INTERNAL=/usr/bin/uname +//ADVANCED property for variable: CMAKE_VERBOSE_MAKEFILE +CMAKE_VERBOSE_MAKEFILE-ADVANCED:INTERNAL=1 +//linker supports push/pop state +_CMAKE_CXX_LINKER_PUSHPOP_STATE_SUPPORTED:INTERNAL=TRUE +//linker supports push/pop state +_CMAKE_C_LINKER_PUSHPOP_STATE_SUPPORTED:INTERNAL=TRUE +//linker supports push/pop state +_CMAKE_LINKER_PUSHPOP_STATE_SUPPORTED:INTERNAL=TRUE + diff --git a/siro_rider/android/app/.cxx/Debug/3p4b322x/x86/CMakeFiles/3.31.5-g6cf5163/CMakeCCompiler.cmake b/siro_rider/android/app/.cxx/Debug/3p4b322x/x86/CMakeFiles/3.31.5-g6cf5163/CMakeCCompiler.cmake new file mode 100644 index 0000000..6f7fec1 --- /dev/null +++ b/siro_rider/android/app/.cxx/Debug/3p4b322x/x86/CMakeFiles/3.31.5-g6cf5163/CMakeCCompiler.cmake @@ -0,0 +1,81 @@ +set(CMAKE_C_COMPILER "/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/bin/clang") +set(CMAKE_C_COMPILER_ARG1 "") +set(CMAKE_C_COMPILER_ID "Clang") +set(CMAKE_C_COMPILER_VERSION "18.0.1") +set(CMAKE_C_COMPILER_VERSION_INTERNAL "") +set(CMAKE_C_COMPILER_WRAPPER "") +set(CMAKE_C_STANDARD_COMPUTED_DEFAULT "17") +set(CMAKE_C_EXTENSIONS_COMPUTED_DEFAULT "ON") +set(CMAKE_C_STANDARD_LATEST "23") +set(CMAKE_C_COMPILE_FEATURES "c_std_90;c_function_prototypes;c_std_99;c_restrict;c_variadic_macros;c_std_11;c_static_assert;c_std_17;c_std_23") +set(CMAKE_C90_COMPILE_FEATURES "c_std_90;c_function_prototypes") +set(CMAKE_C99_COMPILE_FEATURES "c_std_99;c_restrict;c_variadic_macros") +set(CMAKE_C11_COMPILE_FEATURES "c_std_11;c_static_assert") +set(CMAKE_C17_COMPILE_FEATURES "c_std_17") +set(CMAKE_C23_COMPILE_FEATURES "c_std_23") + +set(CMAKE_C_PLATFORM_ID "Linux") +set(CMAKE_C_SIMULATE_ID "") +set(CMAKE_C_COMPILER_FRONTEND_VARIANT "GNU") +set(CMAKE_C_SIMULATE_VERSION "") + + + + +set(CMAKE_AR "/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/bin/llvm-ar") +set(CMAKE_C_COMPILER_AR "/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/bin/llvm-ar") +set(CMAKE_RANLIB "/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/bin/llvm-ranlib") +set(CMAKE_C_COMPILER_RANLIB "/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/bin/llvm-ranlib") +set(CMAKE_LINKER "/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/bin/ld.lld") +set(CMAKE_LINKER_LINK "") +set(CMAKE_LINKER_LLD "") +set(CMAKE_C_COMPILER_LINKER "/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/bin/ld.lld") +set(CMAKE_C_COMPILER_LINKER_ID "LLD") +set(CMAKE_C_COMPILER_LINKER_VERSION 18.0.1) +set(CMAKE_C_COMPILER_LINKER_FRONTEND_VARIANT GNU) +set(CMAKE_MT "") +set(CMAKE_TAPI "CMAKE_TAPI-NOTFOUND") +set(CMAKE_COMPILER_IS_GNUCC ) +set(CMAKE_C_COMPILER_LOADED 1) +set(CMAKE_C_COMPILER_WORKS TRUE) +set(CMAKE_C_ABI_COMPILED TRUE) + +set(CMAKE_C_COMPILER_ENV_VAR "CC") + +set(CMAKE_C_COMPILER_ID_RUN 1) +set(CMAKE_C_SOURCE_FILE_EXTENSIONS c;m) +set(CMAKE_C_IGNORE_EXTENSIONS h;H;o;O;obj;OBJ;def;DEF;rc;RC) +set(CMAKE_C_LINKER_PREFERENCE 10) +set(CMAKE_C_LINKER_DEPFILE_SUPPORTED ) + +# Save compiler ABI information. +set(CMAKE_C_SIZEOF_DATA_PTR "4") +set(CMAKE_C_COMPILER_ABI "ELF") +set(CMAKE_C_BYTE_ORDER "LITTLE_ENDIAN") +set(CMAKE_C_LIBRARY_ARCHITECTURE "i686-linux-android") + +if(CMAKE_C_SIZEOF_DATA_PTR) + set(CMAKE_SIZEOF_VOID_P "${CMAKE_C_SIZEOF_DATA_PTR}") +endif() + +if(CMAKE_C_COMPILER_ABI) + set(CMAKE_INTERNAL_PLATFORM_ABI "${CMAKE_C_COMPILER_ABI}") +endif() + +if(CMAKE_C_LIBRARY_ARCHITECTURE) + set(CMAKE_LIBRARY_ARCHITECTURE "i686-linux-android") +endif() + +set(CMAKE_C_CL_SHOWINCLUDES_PREFIX "") +if(CMAKE_C_CL_SHOWINCLUDES_PREFIX) + set(CMAKE_CL_SHOWINCLUDES_PREFIX "${CMAKE_C_CL_SHOWINCLUDES_PREFIX}") +endif() + + + + + +set(CMAKE_C_IMPLICIT_INCLUDE_DIRECTORIES "/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/lib/clang/18/include;/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/include/i686-linux-android;/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/include") +set(CMAKE_C_IMPLICIT_LINK_LIBRARIES "-l:libunwind.a;dl;c;-l:libunwind.a;dl") +set(CMAKE_C_IMPLICIT_LINK_DIRECTORIES "/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/lib/clang/18/lib/linux/i386;/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/lib/i686-linux-android/23;/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/lib/i686-linux-android;/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/lib") +set(CMAKE_C_IMPLICIT_LINK_FRAMEWORK_DIRECTORIES "") diff --git a/siro_rider/android/app/.cxx/Debug/3p4b322x/x86/CMakeFiles/3.31.5-g6cf5163/CMakeCXXCompiler.cmake b/siro_rider/android/app/.cxx/Debug/3p4b322x/x86/CMakeFiles/3.31.5-g6cf5163/CMakeCXXCompiler.cmake new file mode 100644 index 0000000..3536164 --- /dev/null +++ b/siro_rider/android/app/.cxx/Debug/3p4b322x/x86/CMakeFiles/3.31.5-g6cf5163/CMakeCXXCompiler.cmake @@ -0,0 +1,105 @@ +set(CMAKE_CXX_COMPILER "/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/bin/clang++") +set(CMAKE_CXX_COMPILER_ARG1 "") +set(CMAKE_CXX_COMPILER_ID "Clang") +set(CMAKE_CXX_COMPILER_VERSION "18.0.1") +set(CMAKE_CXX_COMPILER_VERSION_INTERNAL "") +set(CMAKE_CXX_COMPILER_WRAPPER "") +set(CMAKE_CXX_STANDARD_COMPUTED_DEFAULT "17") +set(CMAKE_CXX_EXTENSIONS_COMPUTED_DEFAULT "ON") +set(CMAKE_CXX_STANDARD_LATEST "26") +set(CMAKE_CXX_COMPILE_FEATURES "cxx_std_98;cxx_template_template_parameters;cxx_std_11;cxx_alias_templates;cxx_alignas;cxx_alignof;cxx_attributes;cxx_auto_type;cxx_constexpr;cxx_decltype;cxx_decltype_incomplete_return_types;cxx_default_function_template_args;cxx_defaulted_functions;cxx_defaulted_move_initializers;cxx_delegating_constructors;cxx_deleted_functions;cxx_enum_forward_declarations;cxx_explicit_conversions;cxx_extended_friend_declarations;cxx_extern_templates;cxx_final;cxx_func_identifier;cxx_generalized_initializers;cxx_inheriting_constructors;cxx_inline_namespaces;cxx_lambdas;cxx_local_type_template_args;cxx_long_long_type;cxx_noexcept;cxx_nonstatic_member_init;cxx_nullptr;cxx_override;cxx_range_for;cxx_raw_string_literals;cxx_reference_qualified_functions;cxx_right_angle_brackets;cxx_rvalue_references;cxx_sizeof_member;cxx_static_assert;cxx_strong_enums;cxx_thread_local;cxx_trailing_return_types;cxx_unicode_literals;cxx_uniform_initialization;cxx_unrestricted_unions;cxx_user_literals;cxx_variadic_macros;cxx_variadic_templates;cxx_std_14;cxx_aggregate_default_initializers;cxx_attribute_deprecated;cxx_binary_literals;cxx_contextual_conversions;cxx_decltype_auto;cxx_digit_separators;cxx_generic_lambdas;cxx_lambda_init_captures;cxx_relaxed_constexpr;cxx_return_type_deduction;cxx_variable_templates;cxx_std_17;cxx_std_20;cxx_std_23;cxx_std_26") +set(CMAKE_CXX98_COMPILE_FEATURES "cxx_std_98;cxx_template_template_parameters") +set(CMAKE_CXX11_COMPILE_FEATURES "cxx_std_11;cxx_alias_templates;cxx_alignas;cxx_alignof;cxx_attributes;cxx_auto_type;cxx_constexpr;cxx_decltype;cxx_decltype_incomplete_return_types;cxx_default_function_template_args;cxx_defaulted_functions;cxx_defaulted_move_initializers;cxx_delegating_constructors;cxx_deleted_functions;cxx_enum_forward_declarations;cxx_explicit_conversions;cxx_extended_friend_declarations;cxx_extern_templates;cxx_final;cxx_func_identifier;cxx_generalized_initializers;cxx_inheriting_constructors;cxx_inline_namespaces;cxx_lambdas;cxx_local_type_template_args;cxx_long_long_type;cxx_noexcept;cxx_nonstatic_member_init;cxx_nullptr;cxx_override;cxx_range_for;cxx_raw_string_literals;cxx_reference_qualified_functions;cxx_right_angle_brackets;cxx_rvalue_references;cxx_sizeof_member;cxx_static_assert;cxx_strong_enums;cxx_thread_local;cxx_trailing_return_types;cxx_unicode_literals;cxx_uniform_initialization;cxx_unrestricted_unions;cxx_user_literals;cxx_variadic_macros;cxx_variadic_templates") +set(CMAKE_CXX14_COMPILE_FEATURES "cxx_std_14;cxx_aggregate_default_initializers;cxx_attribute_deprecated;cxx_binary_literals;cxx_contextual_conversions;cxx_decltype_auto;cxx_digit_separators;cxx_generic_lambdas;cxx_lambda_init_captures;cxx_relaxed_constexpr;cxx_return_type_deduction;cxx_variable_templates") +set(CMAKE_CXX17_COMPILE_FEATURES "cxx_std_17") +set(CMAKE_CXX20_COMPILE_FEATURES "cxx_std_20") +set(CMAKE_CXX23_COMPILE_FEATURES "cxx_std_23") +set(CMAKE_CXX26_COMPILE_FEATURES "cxx_std_26") + +set(CMAKE_CXX_PLATFORM_ID "Linux") +set(CMAKE_CXX_SIMULATE_ID "") +set(CMAKE_CXX_COMPILER_FRONTEND_VARIANT "GNU") +set(CMAKE_CXX_SIMULATE_VERSION "") + + + + +set(CMAKE_AR "/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/bin/llvm-ar") +set(CMAKE_CXX_COMPILER_AR "/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/bin/llvm-ar") +set(CMAKE_RANLIB "/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/bin/llvm-ranlib") +set(CMAKE_CXX_COMPILER_RANLIB "/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/bin/llvm-ranlib") +set(CMAKE_LINKER "/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/bin/ld.lld") +set(CMAKE_LINKER_LINK "") +set(CMAKE_LINKER_LLD "") +set(CMAKE_CXX_COMPILER_LINKER "/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/bin/ld.lld") +set(CMAKE_CXX_COMPILER_LINKER_ID "LLD") +set(CMAKE_CXX_COMPILER_LINKER_VERSION 18.0.1) +set(CMAKE_CXX_COMPILER_LINKER_FRONTEND_VARIANT GNU) +set(CMAKE_MT "") +set(CMAKE_TAPI "CMAKE_TAPI-NOTFOUND") +set(CMAKE_COMPILER_IS_GNUCXX ) +set(CMAKE_CXX_COMPILER_LOADED 1) +set(CMAKE_CXX_COMPILER_WORKS TRUE) +set(CMAKE_CXX_ABI_COMPILED TRUE) + +set(CMAKE_CXX_COMPILER_ENV_VAR "CXX") + +set(CMAKE_CXX_COMPILER_ID_RUN 1) +set(CMAKE_CXX_SOURCE_FILE_EXTENSIONS C;M;c++;cc;cpp;cxx;m;mm;mpp;CPP;ixx;cppm;ccm;cxxm;c++m) +set(CMAKE_CXX_IGNORE_EXTENSIONS inl;h;hpp;HPP;H;o;O;obj;OBJ;def;DEF;rc;RC) + +foreach (lang IN ITEMS C OBJC OBJCXX) + if (CMAKE_${lang}_COMPILER_ID_RUN) + foreach(extension IN LISTS CMAKE_${lang}_SOURCE_FILE_EXTENSIONS) + list(REMOVE_ITEM CMAKE_CXX_SOURCE_FILE_EXTENSIONS ${extension}) + endforeach() + endif() +endforeach() + +set(CMAKE_CXX_LINKER_PREFERENCE 30) +set(CMAKE_CXX_LINKER_PREFERENCE_PROPAGATES 1) +set(CMAKE_CXX_LINKER_DEPFILE_SUPPORTED ) + +# Save compiler ABI information. +set(CMAKE_CXX_SIZEOF_DATA_PTR "4") +set(CMAKE_CXX_COMPILER_ABI "ELF") +set(CMAKE_CXX_BYTE_ORDER "LITTLE_ENDIAN") +set(CMAKE_CXX_LIBRARY_ARCHITECTURE "i686-linux-android") + +if(CMAKE_CXX_SIZEOF_DATA_PTR) + set(CMAKE_SIZEOF_VOID_P "${CMAKE_CXX_SIZEOF_DATA_PTR}") +endif() + +if(CMAKE_CXX_COMPILER_ABI) + set(CMAKE_INTERNAL_PLATFORM_ABI "${CMAKE_CXX_COMPILER_ABI}") +endif() + +if(CMAKE_CXX_LIBRARY_ARCHITECTURE) + set(CMAKE_LIBRARY_ARCHITECTURE "i686-linux-android") +endif() + +set(CMAKE_CXX_CL_SHOWINCLUDES_PREFIX "") +if(CMAKE_CXX_CL_SHOWINCLUDES_PREFIX) + set(CMAKE_CL_SHOWINCLUDES_PREFIX "${CMAKE_CXX_CL_SHOWINCLUDES_PREFIX}") +endif() + + + + + +set(CMAKE_CXX_IMPLICIT_INCLUDE_DIRECTORIES "/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/include/c++/v1;/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/lib/clang/18/include;/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/include/i686-linux-android;/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/include") +set(CMAKE_CXX_IMPLICIT_LINK_LIBRARIES "c++;m;-l:libunwind.a;dl;c;-l:libunwind.a;dl") +set(CMAKE_CXX_IMPLICIT_LINK_DIRECTORIES "/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/lib/clang/18/lib/linux/i386;/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/lib/i686-linux-android/23;/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/lib/i686-linux-android;/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/lib") +set(CMAKE_CXX_IMPLICIT_LINK_FRAMEWORK_DIRECTORIES "") +set(CMAKE_CXX_COMPILER_CLANG_RESOURCE_DIR "/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/lib/clang/18") + +set(CMAKE_CXX_COMPILER_IMPORT_STD "") +### Imported target for C++23 standard library +set(CMAKE_CXX23_COMPILER_IMPORT_STD_NOT_FOUND_MESSAGE "Experimental `import std` support not enabled when detecting toolchain; it must be set before `CXX` is enabled (usually a `project()` call)") + + +### Imported target for C++26 standard library +set(CMAKE_CXX26_COMPILER_IMPORT_STD_NOT_FOUND_MESSAGE "Experimental `import std` support not enabled when detecting toolchain; it must be set before `CXX` is enabled (usually a `project()` call)") + + + diff --git a/siro_rider/android/app/.cxx/Debug/3p4b322x/x86/CMakeFiles/3.31.5-g6cf5163/CMakeDetermineCompilerABI_C.bin b/siro_rider/android/app/.cxx/Debug/3p4b322x/x86/CMakeFiles/3.31.5-g6cf5163/CMakeDetermineCompilerABI_C.bin new file mode 100755 index 0000000..4ef9c72 Binary files /dev/null and b/siro_rider/android/app/.cxx/Debug/3p4b322x/x86/CMakeFiles/3.31.5-g6cf5163/CMakeDetermineCompilerABI_C.bin differ diff --git a/siro_rider/android/app/.cxx/Debug/3p4b322x/x86/CMakeFiles/3.31.5-g6cf5163/CMakeDetermineCompilerABI_CXX.bin b/siro_rider/android/app/.cxx/Debug/3p4b322x/x86/CMakeFiles/3.31.5-g6cf5163/CMakeDetermineCompilerABI_CXX.bin new file mode 100755 index 0000000..53018ca Binary files /dev/null and b/siro_rider/android/app/.cxx/Debug/3p4b322x/x86/CMakeFiles/3.31.5-g6cf5163/CMakeDetermineCompilerABI_CXX.bin differ diff --git a/siro_rider/android/app/.cxx/Debug/3p4b322x/x86/CMakeFiles/3.31.5-g6cf5163/CMakeSystem.cmake b/siro_rider/android/app/.cxx/Debug/3p4b322x/x86/CMakeFiles/3.31.5-g6cf5163/CMakeSystem.cmake new file mode 100644 index 0000000..4828e9f --- /dev/null +++ b/siro_rider/android/app/.cxx/Debug/3p4b322x/x86/CMakeFiles/3.31.5-g6cf5163/CMakeSystem.cmake @@ -0,0 +1,15 @@ +set(CMAKE_HOST_SYSTEM "Darwin-24.5.0") +set(CMAKE_HOST_SYSTEM_NAME "Darwin") +set(CMAKE_HOST_SYSTEM_VERSION "24.5.0") +set(CMAKE_HOST_SYSTEM_PROCESSOR "arm64") + +include("/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/build/cmake/android.toolchain.cmake") + +set(CMAKE_SYSTEM "Android-1") +set(CMAKE_SYSTEM_NAME "Android") +set(CMAKE_SYSTEM_VERSION "1") +set(CMAKE_SYSTEM_PROCESSOR "i686") + +set(CMAKE_CROSSCOMPILING "TRUE") + +set(CMAKE_SYSTEM_LOADED 1) diff --git a/siro_rider/android/app/.cxx/Debug/3p4b322x/x86/CMakeFiles/3.31.5-g6cf5163/CompilerIdC/CMakeCCompilerId.c b/siro_rider/android/app/.cxx/Debug/3p4b322x/x86/CMakeFiles/3.31.5-g6cf5163/CompilerIdC/CMakeCCompilerId.c new file mode 100644 index 0000000..8d8bb03 --- /dev/null +++ b/siro_rider/android/app/.cxx/Debug/3p4b322x/x86/CMakeFiles/3.31.5-g6cf5163/CompilerIdC/CMakeCCompilerId.c @@ -0,0 +1,904 @@ +#ifdef __cplusplus +# error "A C++ compiler has been selected for C." +#endif + +#if defined(__18CXX) +# define ID_VOID_MAIN +#endif +#if defined(__CLASSIC_C__) +/* cv-qualifiers did not exist in K&R C */ +# define const +# define volatile +#endif + +#if !defined(__has_include) +/* If the compiler does not have __has_include, pretend the answer is + always no. */ +# define __has_include(x) 0 +#endif + + +/* Version number components: V=Version, R=Revision, P=Patch + Version date components: YYYY=Year, MM=Month, DD=Day */ + +#if defined(__INTEL_COMPILER) || defined(__ICC) +# define COMPILER_ID "Intel" +# if defined(_MSC_VER) +# define SIMULATE_ID "MSVC" +# endif +# if defined(__GNUC__) +# define SIMULATE_ID "GNU" +# endif + /* __INTEL_COMPILER = VRP prior to 2021, and then VVVV for 2021 and later, + except that a few beta releases use the old format with V=2021. */ +# if __INTEL_COMPILER < 2021 || __INTEL_COMPILER == 202110 || __INTEL_COMPILER == 202111 +# define COMPILER_VERSION_MAJOR DEC(__INTEL_COMPILER/100) +# define COMPILER_VERSION_MINOR DEC(__INTEL_COMPILER/10 % 10) +# if defined(__INTEL_COMPILER_UPDATE) +# define COMPILER_VERSION_PATCH DEC(__INTEL_COMPILER_UPDATE) +# else +# define COMPILER_VERSION_PATCH DEC(__INTEL_COMPILER % 10) +# endif +# else +# define COMPILER_VERSION_MAJOR DEC(__INTEL_COMPILER) +# define COMPILER_VERSION_MINOR DEC(__INTEL_COMPILER_UPDATE) + /* The third version component from --version is an update index, + but no macro is provided for it. */ +# define COMPILER_VERSION_PATCH DEC(0) +# endif +# if defined(__INTEL_COMPILER_BUILD_DATE) + /* __INTEL_COMPILER_BUILD_DATE = YYYYMMDD */ +# define COMPILER_VERSION_TWEAK DEC(__INTEL_COMPILER_BUILD_DATE) +# endif +# if defined(_MSC_VER) + /* _MSC_VER = VVRR */ +# define SIMULATE_VERSION_MAJOR DEC(_MSC_VER / 100) +# define SIMULATE_VERSION_MINOR DEC(_MSC_VER % 100) +# endif +# if defined(__GNUC__) +# define SIMULATE_VERSION_MAJOR DEC(__GNUC__) +# elif defined(__GNUG__) +# define SIMULATE_VERSION_MAJOR DEC(__GNUG__) +# endif +# if defined(__GNUC_MINOR__) +# define SIMULATE_VERSION_MINOR DEC(__GNUC_MINOR__) +# endif +# if defined(__GNUC_PATCHLEVEL__) +# define SIMULATE_VERSION_PATCH DEC(__GNUC_PATCHLEVEL__) +# endif + +#elif (defined(__clang__) && defined(__INTEL_CLANG_COMPILER)) || defined(__INTEL_LLVM_COMPILER) +# define COMPILER_ID "IntelLLVM" +#if defined(_MSC_VER) +# define SIMULATE_ID "MSVC" +#endif +#if defined(__GNUC__) +# define SIMULATE_ID "GNU" +#endif +/* __INTEL_LLVM_COMPILER = VVVVRP prior to 2021.2.0, VVVVRRPP for 2021.2.0 and + * later. Look for 6 digit vs. 8 digit version number to decide encoding. + * VVVV is no smaller than the current year when a version is released. + */ +#if __INTEL_LLVM_COMPILER < 1000000L +# define COMPILER_VERSION_MAJOR DEC(__INTEL_LLVM_COMPILER/100) +# define COMPILER_VERSION_MINOR DEC(__INTEL_LLVM_COMPILER/10 % 10) +# define COMPILER_VERSION_PATCH DEC(__INTEL_LLVM_COMPILER % 10) +#else +# define COMPILER_VERSION_MAJOR DEC(__INTEL_LLVM_COMPILER/10000) +# define COMPILER_VERSION_MINOR DEC(__INTEL_LLVM_COMPILER/100 % 100) +# define COMPILER_VERSION_PATCH DEC(__INTEL_LLVM_COMPILER % 100) +#endif +#if defined(_MSC_VER) + /* _MSC_VER = VVRR */ +# define SIMULATE_VERSION_MAJOR DEC(_MSC_VER / 100) +# define SIMULATE_VERSION_MINOR DEC(_MSC_VER % 100) +#endif +#if defined(__GNUC__) +# define SIMULATE_VERSION_MAJOR DEC(__GNUC__) +#elif defined(__GNUG__) +# define SIMULATE_VERSION_MAJOR DEC(__GNUG__) +#endif +#if defined(__GNUC_MINOR__) +# define SIMULATE_VERSION_MINOR DEC(__GNUC_MINOR__) +#endif +#if defined(__GNUC_PATCHLEVEL__) +# define SIMULATE_VERSION_PATCH DEC(__GNUC_PATCHLEVEL__) +#endif + +#elif defined(__PATHCC__) +# define COMPILER_ID "PathScale" +# define COMPILER_VERSION_MAJOR DEC(__PATHCC__) +# define COMPILER_VERSION_MINOR DEC(__PATHCC_MINOR__) +# if defined(__PATHCC_PATCHLEVEL__) +# define COMPILER_VERSION_PATCH DEC(__PATHCC_PATCHLEVEL__) +# endif + +#elif defined(__BORLANDC__) && defined(__CODEGEARC_VERSION__) +# define COMPILER_ID "Embarcadero" +# define COMPILER_VERSION_MAJOR HEX(__CODEGEARC_VERSION__>>24 & 0x00FF) +# define COMPILER_VERSION_MINOR HEX(__CODEGEARC_VERSION__>>16 & 0x00FF) +# define COMPILER_VERSION_PATCH DEC(__CODEGEARC_VERSION__ & 0xFFFF) + +#elif defined(__BORLANDC__) +# define COMPILER_ID "Borland" + /* __BORLANDC__ = 0xVRR */ +# define COMPILER_VERSION_MAJOR HEX(__BORLANDC__>>8) +# define COMPILER_VERSION_MINOR HEX(__BORLANDC__ & 0xFF) + +#elif defined(__WATCOMC__) && __WATCOMC__ < 1200 +# define COMPILER_ID "Watcom" + /* __WATCOMC__ = VVRR */ +# define COMPILER_VERSION_MAJOR DEC(__WATCOMC__ / 100) +# define COMPILER_VERSION_MINOR DEC((__WATCOMC__ / 10) % 10) +# if (__WATCOMC__ % 10) > 0 +# define COMPILER_VERSION_PATCH DEC(__WATCOMC__ % 10) +# endif + +#elif defined(__WATCOMC__) +# define COMPILER_ID "OpenWatcom" + /* __WATCOMC__ = VVRP + 1100 */ +# define COMPILER_VERSION_MAJOR DEC((__WATCOMC__ - 1100) / 100) +# define COMPILER_VERSION_MINOR DEC((__WATCOMC__ / 10) % 10) +# if (__WATCOMC__ % 10) > 0 +# define COMPILER_VERSION_PATCH DEC(__WATCOMC__ % 10) +# endif + +#elif defined(__SUNPRO_C) +# define COMPILER_ID "SunPro" +# if __SUNPRO_C >= 0x5100 + /* __SUNPRO_C = 0xVRRP */ +# define COMPILER_VERSION_MAJOR HEX(__SUNPRO_C>>12) +# define COMPILER_VERSION_MINOR HEX(__SUNPRO_C>>4 & 0xFF) +# define COMPILER_VERSION_PATCH HEX(__SUNPRO_C & 0xF) +# else + /* __SUNPRO_CC = 0xVRP */ +# define COMPILER_VERSION_MAJOR HEX(__SUNPRO_C>>8) +# define COMPILER_VERSION_MINOR HEX(__SUNPRO_C>>4 & 0xF) +# define COMPILER_VERSION_PATCH HEX(__SUNPRO_C & 0xF) +# endif + +#elif defined(__HP_cc) +# define COMPILER_ID "HP" + /* __HP_cc = VVRRPP */ +# define COMPILER_VERSION_MAJOR DEC(__HP_cc/10000) +# define COMPILER_VERSION_MINOR DEC(__HP_cc/100 % 100) +# define COMPILER_VERSION_PATCH DEC(__HP_cc % 100) + +#elif defined(__DECC) +# define COMPILER_ID "Compaq" + /* __DECC_VER = VVRRTPPPP */ +# define COMPILER_VERSION_MAJOR DEC(__DECC_VER/10000000) +# define COMPILER_VERSION_MINOR DEC(__DECC_VER/100000 % 100) +# define COMPILER_VERSION_PATCH DEC(__DECC_VER % 10000) + +#elif defined(__IBMC__) && defined(__COMPILER_VER__) +# define COMPILER_ID "zOS" + /* __IBMC__ = VRP */ +# define COMPILER_VERSION_MAJOR DEC(__IBMC__/100) +# define COMPILER_VERSION_MINOR DEC(__IBMC__/10 % 10) +# define COMPILER_VERSION_PATCH DEC(__IBMC__ % 10) + +#elif defined(__open_xl__) && defined(__clang__) +# define COMPILER_ID "IBMClang" +# define COMPILER_VERSION_MAJOR DEC(__open_xl_version__) +# define COMPILER_VERSION_MINOR DEC(__open_xl_release__) +# define COMPILER_VERSION_PATCH DEC(__open_xl_modification__) +# define COMPILER_VERSION_TWEAK DEC(__open_xl_ptf_fix_level__) + + +#elif defined(__ibmxl__) && defined(__clang__) +# define COMPILER_ID "XLClang" +# define COMPILER_VERSION_MAJOR DEC(__ibmxl_version__) +# define COMPILER_VERSION_MINOR DEC(__ibmxl_release__) +# define COMPILER_VERSION_PATCH DEC(__ibmxl_modification__) +# define COMPILER_VERSION_TWEAK DEC(__ibmxl_ptf_fix_level__) + + +#elif defined(__IBMC__) && !defined(__COMPILER_VER__) && __IBMC__ >= 800 +# define COMPILER_ID "XL" + /* __IBMC__ = VRP */ +# define COMPILER_VERSION_MAJOR DEC(__IBMC__/100) +# define COMPILER_VERSION_MINOR DEC(__IBMC__/10 % 10) +# define COMPILER_VERSION_PATCH DEC(__IBMC__ % 10) + +#elif defined(__IBMC__) && !defined(__COMPILER_VER__) && __IBMC__ < 800 +# define COMPILER_ID "VisualAge" + /* __IBMC__ = VRP */ +# define COMPILER_VERSION_MAJOR DEC(__IBMC__/100) +# define COMPILER_VERSION_MINOR DEC(__IBMC__/10 % 10) +# define COMPILER_VERSION_PATCH DEC(__IBMC__ % 10) + +#elif defined(__NVCOMPILER) +# define COMPILER_ID "NVHPC" +# define COMPILER_VERSION_MAJOR DEC(__NVCOMPILER_MAJOR__) +# define COMPILER_VERSION_MINOR DEC(__NVCOMPILER_MINOR__) +# if defined(__NVCOMPILER_PATCHLEVEL__) +# define COMPILER_VERSION_PATCH DEC(__NVCOMPILER_PATCHLEVEL__) +# endif + +#elif defined(__PGI) +# define COMPILER_ID "PGI" +# define COMPILER_VERSION_MAJOR DEC(__PGIC__) +# define COMPILER_VERSION_MINOR DEC(__PGIC_MINOR__) +# if defined(__PGIC_PATCHLEVEL__) +# define COMPILER_VERSION_PATCH DEC(__PGIC_PATCHLEVEL__) +# endif + +#elif defined(__clang__) && defined(__cray__) +# define COMPILER_ID "CrayClang" +# define COMPILER_VERSION_MAJOR DEC(__cray_major__) +# define COMPILER_VERSION_MINOR DEC(__cray_minor__) +# define COMPILER_VERSION_PATCH DEC(__cray_patchlevel__) +# define COMPILER_VERSION_INTERNAL_STR __clang_version__ + + +#elif defined(_CRAYC) +# define COMPILER_ID "Cray" +# define COMPILER_VERSION_MAJOR DEC(_RELEASE_MAJOR) +# define COMPILER_VERSION_MINOR DEC(_RELEASE_MINOR) + +#elif defined(__TI_COMPILER_VERSION__) +# define COMPILER_ID "TI" + /* __TI_COMPILER_VERSION__ = VVVRRRPPP */ +# define COMPILER_VERSION_MAJOR DEC(__TI_COMPILER_VERSION__/1000000) +# define COMPILER_VERSION_MINOR DEC(__TI_COMPILER_VERSION__/1000 % 1000) +# define COMPILER_VERSION_PATCH DEC(__TI_COMPILER_VERSION__ % 1000) + +#elif defined(__CLANG_FUJITSU) +# define COMPILER_ID "FujitsuClang" +# define COMPILER_VERSION_MAJOR DEC(__FCC_major__) +# define COMPILER_VERSION_MINOR DEC(__FCC_minor__) +# define COMPILER_VERSION_PATCH DEC(__FCC_patchlevel__) +# define COMPILER_VERSION_INTERNAL_STR __clang_version__ + + +#elif defined(__FUJITSU) +# define COMPILER_ID "Fujitsu" +# if defined(__FCC_version__) +# define COMPILER_VERSION __FCC_version__ +# elif defined(__FCC_major__) +# define COMPILER_VERSION_MAJOR DEC(__FCC_major__) +# define COMPILER_VERSION_MINOR DEC(__FCC_minor__) +# define COMPILER_VERSION_PATCH DEC(__FCC_patchlevel__) +# endif +# if defined(__fcc_version) +# define COMPILER_VERSION_INTERNAL DEC(__fcc_version) +# elif defined(__FCC_VERSION) +# define COMPILER_VERSION_INTERNAL DEC(__FCC_VERSION) +# endif + + +#elif defined(__ghs__) +# define COMPILER_ID "GHS" +/* __GHS_VERSION_NUMBER = VVVVRP */ +# ifdef __GHS_VERSION_NUMBER +# define COMPILER_VERSION_MAJOR DEC(__GHS_VERSION_NUMBER / 100) +# define COMPILER_VERSION_MINOR DEC(__GHS_VERSION_NUMBER / 10 % 10) +# define COMPILER_VERSION_PATCH DEC(__GHS_VERSION_NUMBER % 10) +# endif + +#elif defined(__TASKING__) +# define COMPILER_ID "Tasking" + # define COMPILER_VERSION_MAJOR DEC(__VERSION__/1000) + # define COMPILER_VERSION_MINOR DEC(__VERSION__ % 100) +# define COMPILER_VERSION_INTERNAL DEC(__VERSION__) + +#elif defined(__ORANGEC__) +# define COMPILER_ID "OrangeC" +# define COMPILER_VERSION_MAJOR DEC(__ORANGEC_MAJOR__) +# define COMPILER_VERSION_MINOR DEC(__ORANGEC_MINOR__) +# define COMPILER_VERSION_PATCH DEC(__ORANGEC_PATCHLEVEL__) + +#elif defined(__TINYC__) +# define COMPILER_ID "TinyCC" + +#elif defined(__BCC__) +# define COMPILER_ID "Bruce" + +#elif defined(__SCO_VERSION__) +# define COMPILER_ID "SCO" + +#elif defined(__ARMCC_VERSION) && !defined(__clang__) +# define COMPILER_ID "ARMCC" +#if __ARMCC_VERSION >= 1000000 + /* __ARMCC_VERSION = VRRPPPP */ + # define COMPILER_VERSION_MAJOR DEC(__ARMCC_VERSION/1000000) + # define COMPILER_VERSION_MINOR DEC(__ARMCC_VERSION/10000 % 100) + # define COMPILER_VERSION_PATCH DEC(__ARMCC_VERSION % 10000) +#else + /* __ARMCC_VERSION = VRPPPP */ + # define COMPILER_VERSION_MAJOR DEC(__ARMCC_VERSION/100000) + # define COMPILER_VERSION_MINOR DEC(__ARMCC_VERSION/10000 % 10) + # define COMPILER_VERSION_PATCH DEC(__ARMCC_VERSION % 10000) +#endif + + +#elif defined(__clang__) && defined(__apple_build_version__) +# define COMPILER_ID "AppleClang" +# if defined(_MSC_VER) +# define SIMULATE_ID "MSVC" +# endif +# define COMPILER_VERSION_MAJOR DEC(__clang_major__) +# define COMPILER_VERSION_MINOR DEC(__clang_minor__) +# define COMPILER_VERSION_PATCH DEC(__clang_patchlevel__) +# if defined(_MSC_VER) + /* _MSC_VER = VVRR */ +# define SIMULATE_VERSION_MAJOR DEC(_MSC_VER / 100) +# define SIMULATE_VERSION_MINOR DEC(_MSC_VER % 100) +# endif +# define COMPILER_VERSION_TWEAK DEC(__apple_build_version__) + +#elif defined(__clang__) && defined(__ARMCOMPILER_VERSION) +# define COMPILER_ID "ARMClang" + # define COMPILER_VERSION_MAJOR DEC(__ARMCOMPILER_VERSION/1000000) + # define COMPILER_VERSION_MINOR DEC(__ARMCOMPILER_VERSION/10000 % 100) + # define COMPILER_VERSION_PATCH DEC(__ARMCOMPILER_VERSION/100 % 100) +# define COMPILER_VERSION_INTERNAL DEC(__ARMCOMPILER_VERSION) + +#elif defined(__clang__) && defined(__ti__) +# define COMPILER_ID "TIClang" + # define COMPILER_VERSION_MAJOR DEC(__ti_major__) + # define COMPILER_VERSION_MINOR DEC(__ti_minor__) + # define COMPILER_VERSION_PATCH DEC(__ti_patchlevel__) +# define COMPILER_VERSION_INTERNAL DEC(__ti_version__) + +#elif defined(__clang__) +# define COMPILER_ID "Clang" +# if defined(_MSC_VER) +# define SIMULATE_ID "MSVC" +# endif +# define COMPILER_VERSION_MAJOR DEC(__clang_major__) +# define COMPILER_VERSION_MINOR DEC(__clang_minor__) +# define COMPILER_VERSION_PATCH DEC(__clang_patchlevel__) +# if defined(_MSC_VER) + /* _MSC_VER = VVRR */ +# define SIMULATE_VERSION_MAJOR DEC(_MSC_VER / 100) +# define SIMULATE_VERSION_MINOR DEC(_MSC_VER % 100) +# endif + +#elif defined(__LCC__) && (defined(__GNUC__) || defined(__GNUG__) || defined(__MCST__)) +# define COMPILER_ID "LCC" +# define COMPILER_VERSION_MAJOR DEC(__LCC__ / 100) +# define COMPILER_VERSION_MINOR DEC(__LCC__ % 100) +# if defined(__LCC_MINOR__) +# define COMPILER_VERSION_PATCH DEC(__LCC_MINOR__) +# endif +# if defined(__GNUC__) && defined(__GNUC_MINOR__) +# define SIMULATE_ID "GNU" +# define SIMULATE_VERSION_MAJOR DEC(__GNUC__) +# define SIMULATE_VERSION_MINOR DEC(__GNUC_MINOR__) +# if defined(__GNUC_PATCHLEVEL__) +# define SIMULATE_VERSION_PATCH DEC(__GNUC_PATCHLEVEL__) +# endif +# endif + +#elif defined(__GNUC__) +# define COMPILER_ID "GNU" +# define COMPILER_VERSION_MAJOR DEC(__GNUC__) +# if defined(__GNUC_MINOR__) +# define COMPILER_VERSION_MINOR DEC(__GNUC_MINOR__) +# endif +# if defined(__GNUC_PATCHLEVEL__) +# define COMPILER_VERSION_PATCH DEC(__GNUC_PATCHLEVEL__) +# endif + +#elif defined(_MSC_VER) +# define COMPILER_ID "MSVC" + /* _MSC_VER = VVRR */ +# define COMPILER_VERSION_MAJOR DEC(_MSC_VER / 100) +# define COMPILER_VERSION_MINOR DEC(_MSC_VER % 100) +# if defined(_MSC_FULL_VER) +# if _MSC_VER >= 1400 + /* _MSC_FULL_VER = VVRRPPPPP */ +# define COMPILER_VERSION_PATCH DEC(_MSC_FULL_VER % 100000) +# else + /* _MSC_FULL_VER = VVRRPPPP */ +# define COMPILER_VERSION_PATCH DEC(_MSC_FULL_VER % 10000) +# endif +# endif +# if defined(_MSC_BUILD) +# define COMPILER_VERSION_TWEAK DEC(_MSC_BUILD) +# endif + +#elif defined(_ADI_COMPILER) +# define COMPILER_ID "ADSP" +#if defined(__VERSIONNUM__) + /* __VERSIONNUM__ = 0xVVRRPPTT */ +# define COMPILER_VERSION_MAJOR DEC(__VERSIONNUM__ >> 24 & 0xFF) +# define COMPILER_VERSION_MINOR DEC(__VERSIONNUM__ >> 16 & 0xFF) +# define COMPILER_VERSION_PATCH DEC(__VERSIONNUM__ >> 8 & 0xFF) +# define COMPILER_VERSION_TWEAK DEC(__VERSIONNUM__ & 0xFF) +#endif + +#elif defined(__IAR_SYSTEMS_ICC__) || defined(__IAR_SYSTEMS_ICC) +# define COMPILER_ID "IAR" +# if defined(__VER__) && defined(__ICCARM__) +# define COMPILER_VERSION_MAJOR DEC((__VER__) / 1000000) +# define COMPILER_VERSION_MINOR DEC(((__VER__) / 1000) % 1000) +# define COMPILER_VERSION_PATCH DEC((__VER__) % 1000) +# define COMPILER_VERSION_INTERNAL DEC(__IAR_SYSTEMS_ICC__) +# elif defined(__VER__) && (defined(__ICCAVR__) || defined(__ICCRX__) || defined(__ICCRH850__) || defined(__ICCRL78__) || defined(__ICC430__) || defined(__ICCRISCV__) || defined(__ICCV850__) || defined(__ICC8051__) || defined(__ICCSTM8__)) +# define COMPILER_VERSION_MAJOR DEC((__VER__) / 100) +# define COMPILER_VERSION_MINOR DEC((__VER__) - (((__VER__) / 100)*100)) +# define COMPILER_VERSION_PATCH DEC(__SUBVERSION__) +# define COMPILER_VERSION_INTERNAL DEC(__IAR_SYSTEMS_ICC__) +# endif + +#elif defined(__SDCC_VERSION_MAJOR) || defined(SDCC) +# define COMPILER_ID "SDCC" +# if defined(__SDCC_VERSION_MAJOR) +# define COMPILER_VERSION_MAJOR DEC(__SDCC_VERSION_MAJOR) +# define COMPILER_VERSION_MINOR DEC(__SDCC_VERSION_MINOR) +# define COMPILER_VERSION_PATCH DEC(__SDCC_VERSION_PATCH) +# else + /* SDCC = VRP */ +# define COMPILER_VERSION_MAJOR DEC(SDCC/100) +# define COMPILER_VERSION_MINOR DEC(SDCC/10 % 10) +# define COMPILER_VERSION_PATCH DEC(SDCC % 10) +# endif + + +/* These compilers are either not known or too old to define an + identification macro. Try to identify the platform and guess that + it is the native compiler. */ +#elif defined(__hpux) || defined(__hpua) +# define COMPILER_ID "HP" + +#else /* unknown compiler */ +# define COMPILER_ID "" +#endif + +/* Construct the string literal in pieces to prevent the source from + getting matched. Store it in a pointer rather than an array + because some compilers will just produce instructions to fill the + array rather than assigning a pointer to a static array. */ +char const* info_compiler = "INFO" ":" "compiler[" COMPILER_ID "]"; +#ifdef SIMULATE_ID +char const* info_simulate = "INFO" ":" "simulate[" SIMULATE_ID "]"; +#endif + +#ifdef __QNXNTO__ +char const* qnxnto = "INFO" ":" "qnxnto[]"; +#endif + +#if defined(__CRAYXT_COMPUTE_LINUX_TARGET) +char const *info_cray = "INFO" ":" "compiler_wrapper[CrayPrgEnv]"; +#endif + +#define STRINGIFY_HELPER(X) #X +#define STRINGIFY(X) STRINGIFY_HELPER(X) + +/* Identify known platforms by name. */ +#if defined(__linux) || defined(__linux__) || defined(linux) +# define PLATFORM_ID "Linux" + +#elif defined(__MSYS__) +# define PLATFORM_ID "MSYS" + +#elif defined(__CYGWIN__) +# define PLATFORM_ID "Cygwin" + +#elif defined(__MINGW32__) +# define PLATFORM_ID "MinGW" + +#elif defined(__APPLE__) +# define PLATFORM_ID "Darwin" + +#elif defined(_WIN32) || defined(__WIN32__) || defined(WIN32) +# define PLATFORM_ID "Windows" + +#elif defined(__FreeBSD__) || defined(__FreeBSD) +# define PLATFORM_ID "FreeBSD" + +#elif defined(__NetBSD__) || defined(__NetBSD) +# define PLATFORM_ID "NetBSD" + +#elif defined(__OpenBSD__) || defined(__OPENBSD) +# define PLATFORM_ID "OpenBSD" + +#elif defined(__sun) || defined(sun) +# define PLATFORM_ID "SunOS" + +#elif defined(_AIX) || defined(__AIX) || defined(__AIX__) || defined(__aix) || defined(__aix__) +# define PLATFORM_ID "AIX" + +#elif defined(__hpux) || defined(__hpux__) +# define PLATFORM_ID "HP-UX" + +#elif defined(__HAIKU__) +# define PLATFORM_ID "Haiku" + +#elif defined(__BeOS) || defined(__BEOS__) || defined(_BEOS) +# define PLATFORM_ID "BeOS" + +#elif defined(__QNX__) || defined(__QNXNTO__) +# define PLATFORM_ID "QNX" + +#elif defined(__tru64) || defined(_tru64) || defined(__TRU64__) +# define PLATFORM_ID "Tru64" + +#elif defined(__riscos) || defined(__riscos__) +# define PLATFORM_ID "RISCos" + +#elif defined(__sinix) || defined(__sinix__) || defined(__SINIX__) +# define PLATFORM_ID "SINIX" + +#elif defined(__UNIX_SV__) +# define PLATFORM_ID "UNIX_SV" + +#elif defined(__bsdos__) +# define PLATFORM_ID "BSDOS" + +#elif defined(_MPRAS) || defined(MPRAS) +# define PLATFORM_ID "MP-RAS" + +#elif defined(__osf) || defined(__osf__) +# define PLATFORM_ID "OSF1" + +#elif defined(_SCO_SV) || defined(SCO_SV) || defined(sco_sv) +# define PLATFORM_ID "SCO_SV" + +#elif defined(__ultrix) || defined(__ultrix__) || defined(_ULTRIX) +# define PLATFORM_ID "ULTRIX" + +#elif defined(__XENIX__) || defined(_XENIX) || defined(XENIX) +# define PLATFORM_ID "Xenix" + +#elif defined(__WATCOMC__) +# if defined(__LINUX__) +# define PLATFORM_ID "Linux" + +# elif defined(__DOS__) +# define PLATFORM_ID "DOS" + +# elif defined(__OS2__) +# define PLATFORM_ID "OS2" + +# elif defined(__WINDOWS__) +# define PLATFORM_ID "Windows3x" + +# elif defined(__VXWORKS__) +# define PLATFORM_ID "VxWorks" + +# else /* unknown platform */ +# define PLATFORM_ID +# endif + +#elif defined(__INTEGRITY) +# if defined(INT_178B) +# define PLATFORM_ID "Integrity178" + +# else /* regular Integrity */ +# define PLATFORM_ID "Integrity" +# endif + +# elif defined(_ADI_COMPILER) +# define PLATFORM_ID "ADSP" + +#else /* unknown platform */ +# define PLATFORM_ID + +#endif + +/* For windows compilers MSVC and Intel we can determine + the architecture of the compiler being used. This is because + the compilers do not have flags that can change the architecture, + but rather depend on which compiler is being used +*/ +#if defined(_WIN32) && defined(_MSC_VER) +# if defined(_M_IA64) +# define ARCHITECTURE_ID "IA64" + +# elif defined(_M_ARM64EC) +# define ARCHITECTURE_ID "ARM64EC" + +# elif defined(_M_X64) || defined(_M_AMD64) +# define ARCHITECTURE_ID "x64" + +# elif defined(_M_IX86) +# define ARCHITECTURE_ID "X86" + +# elif defined(_M_ARM64) +# define ARCHITECTURE_ID "ARM64" + +# elif defined(_M_ARM) +# if _M_ARM == 4 +# define ARCHITECTURE_ID "ARMV4I" +# elif _M_ARM == 5 +# define ARCHITECTURE_ID "ARMV5I" +# else +# define ARCHITECTURE_ID "ARMV" STRINGIFY(_M_ARM) +# endif + +# elif defined(_M_MIPS) +# define ARCHITECTURE_ID "MIPS" + +# elif defined(_M_SH) +# define ARCHITECTURE_ID "SHx" + +# else /* unknown architecture */ +# define ARCHITECTURE_ID "" +# endif + +#elif defined(__WATCOMC__) +# if defined(_M_I86) +# define ARCHITECTURE_ID "I86" + +# elif defined(_M_IX86) +# define ARCHITECTURE_ID "X86" + +# else /* unknown architecture */ +# define ARCHITECTURE_ID "" +# endif + +#elif defined(__IAR_SYSTEMS_ICC__) || defined(__IAR_SYSTEMS_ICC) +# if defined(__ICCARM__) +# define ARCHITECTURE_ID "ARM" + +# elif defined(__ICCRX__) +# define ARCHITECTURE_ID "RX" + +# elif defined(__ICCRH850__) +# define ARCHITECTURE_ID "RH850" + +# elif defined(__ICCRL78__) +# define ARCHITECTURE_ID "RL78" + +# elif defined(__ICCRISCV__) +# define ARCHITECTURE_ID "RISCV" + +# elif defined(__ICCAVR__) +# define ARCHITECTURE_ID "AVR" + +# elif defined(__ICC430__) +# define ARCHITECTURE_ID "MSP430" + +# elif defined(__ICCV850__) +# define ARCHITECTURE_ID "V850" + +# elif defined(__ICC8051__) +# define ARCHITECTURE_ID "8051" + +# elif defined(__ICCSTM8__) +# define ARCHITECTURE_ID "STM8" + +# else /* unknown architecture */ +# define ARCHITECTURE_ID "" +# endif + +#elif defined(__ghs__) +# if defined(__PPC64__) +# define ARCHITECTURE_ID "PPC64" + +# elif defined(__ppc__) +# define ARCHITECTURE_ID "PPC" + +# elif defined(__ARM__) +# define ARCHITECTURE_ID "ARM" + +# elif defined(__x86_64__) +# define ARCHITECTURE_ID "x64" + +# elif defined(__i386__) +# define ARCHITECTURE_ID "X86" + +# else /* unknown architecture */ +# define ARCHITECTURE_ID "" +# endif + +#elif defined(__clang__) && defined(__ti__) +# if defined(__ARM_ARCH) +# define ARCHITECTURE_ID "Arm" + +# else /* unknown architecture */ +# define ARCHITECTURE_ID "" +# endif + +#elif defined(__TI_COMPILER_VERSION__) +# if defined(__TI_ARM__) +# define ARCHITECTURE_ID "ARM" + +# elif defined(__MSP430__) +# define ARCHITECTURE_ID "MSP430" + +# elif defined(__TMS320C28XX__) +# define ARCHITECTURE_ID "TMS320C28x" + +# elif defined(__TMS320C6X__) || defined(_TMS320C6X) +# define ARCHITECTURE_ID "TMS320C6x" + +# else /* unknown architecture */ +# define ARCHITECTURE_ID "" +# endif + +# elif defined(__ADSPSHARC__) +# define ARCHITECTURE_ID "SHARC" + +# elif defined(__ADSPBLACKFIN__) +# define ARCHITECTURE_ID "Blackfin" + +#elif defined(__TASKING__) + +# if defined(__CTC__) || defined(__CPTC__) +# define ARCHITECTURE_ID "TriCore" + +# elif defined(__CMCS__) +# define ARCHITECTURE_ID "MCS" + +# elif defined(__CARM__) +# define ARCHITECTURE_ID "ARM" + +# elif defined(__CARC__) +# define ARCHITECTURE_ID "ARC" + +# elif defined(__C51__) +# define ARCHITECTURE_ID "8051" + +# elif defined(__CPCP__) +# define ARCHITECTURE_ID "PCP" + +# else +# define ARCHITECTURE_ID "" +# endif + +#else +# define ARCHITECTURE_ID +#endif + +/* Convert integer to decimal digit literals. */ +#define DEC(n) \ + ('0' + (((n) / 10000000)%10)), \ + ('0' + (((n) / 1000000)%10)), \ + ('0' + (((n) / 100000)%10)), \ + ('0' + (((n) / 10000)%10)), \ + ('0' + (((n) / 1000)%10)), \ + ('0' + (((n) / 100)%10)), \ + ('0' + (((n) / 10)%10)), \ + ('0' + ((n) % 10)) + +/* Convert integer to hex digit literals. */ +#define HEX(n) \ + ('0' + ((n)>>28 & 0xF)), \ + ('0' + ((n)>>24 & 0xF)), \ + ('0' + ((n)>>20 & 0xF)), \ + ('0' + ((n)>>16 & 0xF)), \ + ('0' + ((n)>>12 & 0xF)), \ + ('0' + ((n)>>8 & 0xF)), \ + ('0' + ((n)>>4 & 0xF)), \ + ('0' + ((n) & 0xF)) + +/* Construct a string literal encoding the version number. */ +#ifdef COMPILER_VERSION +char const* info_version = "INFO" ":" "compiler_version[" COMPILER_VERSION "]"; + +/* Construct a string literal encoding the version number components. */ +#elif defined(COMPILER_VERSION_MAJOR) +char const info_version[] = { + 'I', 'N', 'F', 'O', ':', + 'c','o','m','p','i','l','e','r','_','v','e','r','s','i','o','n','[', + COMPILER_VERSION_MAJOR, +# ifdef COMPILER_VERSION_MINOR + '.', COMPILER_VERSION_MINOR, +# ifdef COMPILER_VERSION_PATCH + '.', COMPILER_VERSION_PATCH, +# ifdef COMPILER_VERSION_TWEAK + '.', COMPILER_VERSION_TWEAK, +# endif +# endif +# endif + ']','\0'}; +#endif + +/* Construct a string literal encoding the internal version number. */ +#ifdef COMPILER_VERSION_INTERNAL +char const info_version_internal[] = { + 'I', 'N', 'F', 'O', ':', + 'c','o','m','p','i','l','e','r','_','v','e','r','s','i','o','n','_', + 'i','n','t','e','r','n','a','l','[', + COMPILER_VERSION_INTERNAL,']','\0'}; +#elif defined(COMPILER_VERSION_INTERNAL_STR) +char const* info_version_internal = "INFO" ":" "compiler_version_internal[" COMPILER_VERSION_INTERNAL_STR "]"; +#endif + +/* Construct a string literal encoding the version number components. */ +#ifdef SIMULATE_VERSION_MAJOR +char const info_simulate_version[] = { + 'I', 'N', 'F', 'O', ':', + 's','i','m','u','l','a','t','e','_','v','e','r','s','i','o','n','[', + SIMULATE_VERSION_MAJOR, +# ifdef SIMULATE_VERSION_MINOR + '.', SIMULATE_VERSION_MINOR, +# ifdef SIMULATE_VERSION_PATCH + '.', SIMULATE_VERSION_PATCH, +# ifdef SIMULATE_VERSION_TWEAK + '.', SIMULATE_VERSION_TWEAK, +# endif +# endif +# endif + ']','\0'}; +#endif + +/* Construct the string literal in pieces to prevent the source from + getting matched. Store it in a pointer rather than an array + because some compilers will just produce instructions to fill the + array rather than assigning a pointer to a static array. */ +char const* info_platform = "INFO" ":" "platform[" PLATFORM_ID "]"; +char const* info_arch = "INFO" ":" "arch[" ARCHITECTURE_ID "]"; + + + +#define C_STD_99 199901L +#define C_STD_11 201112L +#define C_STD_17 201710L +#define C_STD_23 202311L + +#ifdef __STDC_VERSION__ +# define C_STD __STDC_VERSION__ +#endif + +#if !defined(__STDC__) && !defined(__clang__) +# if defined(_MSC_VER) || defined(__ibmxl__) || defined(__IBMC__) +# define C_VERSION "90" +# else +# define C_VERSION +# endif +#elif C_STD > C_STD_17 +# define C_VERSION "23" +#elif C_STD > C_STD_11 +# define C_VERSION "17" +#elif C_STD > C_STD_99 +# define C_VERSION "11" +#elif C_STD >= C_STD_99 +# define C_VERSION "99" +#else +# define C_VERSION "90" +#endif +const char* info_language_standard_default = + "INFO" ":" "standard_default[" C_VERSION "]"; + +const char* info_language_extensions_default = "INFO" ":" "extensions_default[" +#if (defined(__clang__) || defined(__GNUC__) || defined(__xlC__) || \ + defined(__TI_COMPILER_VERSION__)) && \ + !defined(__STRICT_ANSI__) + "ON" +#else + "OFF" +#endif +"]"; + +/*--------------------------------------------------------------------------*/ + +#ifdef ID_VOID_MAIN +void main() {} +#else +# if defined(__CLASSIC_C__) +int main(argc, argv) int argc; char *argv[]; +# else +int main(int argc, char* argv[]) +# endif +{ + int require = 0; + require += info_compiler[argc]; + require += info_platform[argc]; + require += info_arch[argc]; +#ifdef COMPILER_VERSION_MAJOR + require += info_version[argc]; +#endif +#ifdef COMPILER_VERSION_INTERNAL + require += info_version_internal[argc]; +#endif +#ifdef SIMULATE_ID + require += info_simulate[argc]; +#endif +#ifdef SIMULATE_VERSION_MAJOR + require += info_simulate_version[argc]; +#endif +#if defined(__CRAYXT_COMPUTE_LINUX_TARGET) + require += info_cray[argc]; +#endif + require += info_language_standard_default[argc]; + require += info_language_extensions_default[argc]; + (void)argv; + return require; +} +#endif diff --git a/siro_rider/android/app/.cxx/Debug/3p4b322x/x86/CMakeFiles/3.31.5-g6cf5163/CompilerIdC/CMakeCCompilerId.o b/siro_rider/android/app/.cxx/Debug/3p4b322x/x86/CMakeFiles/3.31.5-g6cf5163/CompilerIdC/CMakeCCompilerId.o new file mode 100644 index 0000000..9cfa064 Binary files /dev/null and b/siro_rider/android/app/.cxx/Debug/3p4b322x/x86/CMakeFiles/3.31.5-g6cf5163/CompilerIdC/CMakeCCompilerId.o differ diff --git a/siro_rider/android/app/.cxx/Debug/3p4b322x/x86/CMakeFiles/3.31.5-g6cf5163/CompilerIdCXX/CMakeCXXCompilerId.cpp b/siro_rider/android/app/.cxx/Debug/3p4b322x/x86/CMakeFiles/3.31.5-g6cf5163/CompilerIdCXX/CMakeCXXCompilerId.cpp new file mode 100644 index 0000000..da6c824 --- /dev/null +++ b/siro_rider/android/app/.cxx/Debug/3p4b322x/x86/CMakeFiles/3.31.5-g6cf5163/CompilerIdCXX/CMakeCXXCompilerId.cpp @@ -0,0 +1,919 @@ +/* This source file must have a .cpp extension so that all C++ compilers + recognize the extension without flags. Borland does not know .cxx for + example. */ +#ifndef __cplusplus +# error "A C compiler has been selected for C++." +#endif + +#if !defined(__has_include) +/* If the compiler does not have __has_include, pretend the answer is + always no. */ +# define __has_include(x) 0 +#endif + + +/* Version number components: V=Version, R=Revision, P=Patch + Version date components: YYYY=Year, MM=Month, DD=Day */ + +#if defined(__INTEL_COMPILER) || defined(__ICC) +# define COMPILER_ID "Intel" +# if defined(_MSC_VER) +# define SIMULATE_ID "MSVC" +# endif +# if defined(__GNUC__) +# define SIMULATE_ID "GNU" +# endif + /* __INTEL_COMPILER = VRP prior to 2021, and then VVVV for 2021 and later, + except that a few beta releases use the old format with V=2021. */ +# if __INTEL_COMPILER < 2021 || __INTEL_COMPILER == 202110 || __INTEL_COMPILER == 202111 +# define COMPILER_VERSION_MAJOR DEC(__INTEL_COMPILER/100) +# define COMPILER_VERSION_MINOR DEC(__INTEL_COMPILER/10 % 10) +# if defined(__INTEL_COMPILER_UPDATE) +# define COMPILER_VERSION_PATCH DEC(__INTEL_COMPILER_UPDATE) +# else +# define COMPILER_VERSION_PATCH DEC(__INTEL_COMPILER % 10) +# endif +# else +# define COMPILER_VERSION_MAJOR DEC(__INTEL_COMPILER) +# define COMPILER_VERSION_MINOR DEC(__INTEL_COMPILER_UPDATE) + /* The third version component from --version is an update index, + but no macro is provided for it. */ +# define COMPILER_VERSION_PATCH DEC(0) +# endif +# if defined(__INTEL_COMPILER_BUILD_DATE) + /* __INTEL_COMPILER_BUILD_DATE = YYYYMMDD */ +# define COMPILER_VERSION_TWEAK DEC(__INTEL_COMPILER_BUILD_DATE) +# endif +# if defined(_MSC_VER) + /* _MSC_VER = VVRR */ +# define SIMULATE_VERSION_MAJOR DEC(_MSC_VER / 100) +# define SIMULATE_VERSION_MINOR DEC(_MSC_VER % 100) +# endif +# if defined(__GNUC__) +# define SIMULATE_VERSION_MAJOR DEC(__GNUC__) +# elif defined(__GNUG__) +# define SIMULATE_VERSION_MAJOR DEC(__GNUG__) +# endif +# if defined(__GNUC_MINOR__) +# define SIMULATE_VERSION_MINOR DEC(__GNUC_MINOR__) +# endif +# if defined(__GNUC_PATCHLEVEL__) +# define SIMULATE_VERSION_PATCH DEC(__GNUC_PATCHLEVEL__) +# endif + +#elif (defined(__clang__) && defined(__INTEL_CLANG_COMPILER)) || defined(__INTEL_LLVM_COMPILER) +# define COMPILER_ID "IntelLLVM" +#if defined(_MSC_VER) +# define SIMULATE_ID "MSVC" +#endif +#if defined(__GNUC__) +# define SIMULATE_ID "GNU" +#endif +/* __INTEL_LLVM_COMPILER = VVVVRP prior to 2021.2.0, VVVVRRPP for 2021.2.0 and + * later. Look for 6 digit vs. 8 digit version number to decide encoding. + * VVVV is no smaller than the current year when a version is released. + */ +#if __INTEL_LLVM_COMPILER < 1000000L +# define COMPILER_VERSION_MAJOR DEC(__INTEL_LLVM_COMPILER/100) +# define COMPILER_VERSION_MINOR DEC(__INTEL_LLVM_COMPILER/10 % 10) +# define COMPILER_VERSION_PATCH DEC(__INTEL_LLVM_COMPILER % 10) +#else +# define COMPILER_VERSION_MAJOR DEC(__INTEL_LLVM_COMPILER/10000) +# define COMPILER_VERSION_MINOR DEC(__INTEL_LLVM_COMPILER/100 % 100) +# define COMPILER_VERSION_PATCH DEC(__INTEL_LLVM_COMPILER % 100) +#endif +#if defined(_MSC_VER) + /* _MSC_VER = VVRR */ +# define SIMULATE_VERSION_MAJOR DEC(_MSC_VER / 100) +# define SIMULATE_VERSION_MINOR DEC(_MSC_VER % 100) +#endif +#if defined(__GNUC__) +# define SIMULATE_VERSION_MAJOR DEC(__GNUC__) +#elif defined(__GNUG__) +# define SIMULATE_VERSION_MAJOR DEC(__GNUG__) +#endif +#if defined(__GNUC_MINOR__) +# define SIMULATE_VERSION_MINOR DEC(__GNUC_MINOR__) +#endif +#if defined(__GNUC_PATCHLEVEL__) +# define SIMULATE_VERSION_PATCH DEC(__GNUC_PATCHLEVEL__) +#endif + +#elif defined(__PATHCC__) +# define COMPILER_ID "PathScale" +# define COMPILER_VERSION_MAJOR DEC(__PATHCC__) +# define COMPILER_VERSION_MINOR DEC(__PATHCC_MINOR__) +# if defined(__PATHCC_PATCHLEVEL__) +# define COMPILER_VERSION_PATCH DEC(__PATHCC_PATCHLEVEL__) +# endif + +#elif defined(__BORLANDC__) && defined(__CODEGEARC_VERSION__) +# define COMPILER_ID "Embarcadero" +# define COMPILER_VERSION_MAJOR HEX(__CODEGEARC_VERSION__>>24 & 0x00FF) +# define COMPILER_VERSION_MINOR HEX(__CODEGEARC_VERSION__>>16 & 0x00FF) +# define COMPILER_VERSION_PATCH DEC(__CODEGEARC_VERSION__ & 0xFFFF) + +#elif defined(__BORLANDC__) +# define COMPILER_ID "Borland" + /* __BORLANDC__ = 0xVRR */ +# define COMPILER_VERSION_MAJOR HEX(__BORLANDC__>>8) +# define COMPILER_VERSION_MINOR HEX(__BORLANDC__ & 0xFF) + +#elif defined(__WATCOMC__) && __WATCOMC__ < 1200 +# define COMPILER_ID "Watcom" + /* __WATCOMC__ = VVRR */ +# define COMPILER_VERSION_MAJOR DEC(__WATCOMC__ / 100) +# define COMPILER_VERSION_MINOR DEC((__WATCOMC__ / 10) % 10) +# if (__WATCOMC__ % 10) > 0 +# define COMPILER_VERSION_PATCH DEC(__WATCOMC__ % 10) +# endif + +#elif defined(__WATCOMC__) +# define COMPILER_ID "OpenWatcom" + /* __WATCOMC__ = VVRP + 1100 */ +# define COMPILER_VERSION_MAJOR DEC((__WATCOMC__ - 1100) / 100) +# define COMPILER_VERSION_MINOR DEC((__WATCOMC__ / 10) % 10) +# if (__WATCOMC__ % 10) > 0 +# define COMPILER_VERSION_PATCH DEC(__WATCOMC__ % 10) +# endif + +#elif defined(__SUNPRO_CC) +# define COMPILER_ID "SunPro" +# if __SUNPRO_CC >= 0x5100 + /* __SUNPRO_CC = 0xVRRP */ +# define COMPILER_VERSION_MAJOR HEX(__SUNPRO_CC>>12) +# define COMPILER_VERSION_MINOR HEX(__SUNPRO_CC>>4 & 0xFF) +# define COMPILER_VERSION_PATCH HEX(__SUNPRO_CC & 0xF) +# else + /* __SUNPRO_CC = 0xVRP */ +# define COMPILER_VERSION_MAJOR HEX(__SUNPRO_CC>>8) +# define COMPILER_VERSION_MINOR HEX(__SUNPRO_CC>>4 & 0xF) +# define COMPILER_VERSION_PATCH HEX(__SUNPRO_CC & 0xF) +# endif + +#elif defined(__HP_aCC) +# define COMPILER_ID "HP" + /* __HP_aCC = VVRRPP */ +# define COMPILER_VERSION_MAJOR DEC(__HP_aCC/10000) +# define COMPILER_VERSION_MINOR DEC(__HP_aCC/100 % 100) +# define COMPILER_VERSION_PATCH DEC(__HP_aCC % 100) + +#elif defined(__DECCXX) +# define COMPILER_ID "Compaq" + /* __DECCXX_VER = VVRRTPPPP */ +# define COMPILER_VERSION_MAJOR DEC(__DECCXX_VER/10000000) +# define COMPILER_VERSION_MINOR DEC(__DECCXX_VER/100000 % 100) +# define COMPILER_VERSION_PATCH DEC(__DECCXX_VER % 10000) + +#elif defined(__IBMCPP__) && defined(__COMPILER_VER__) +# define COMPILER_ID "zOS" + /* __IBMCPP__ = VRP */ +# define COMPILER_VERSION_MAJOR DEC(__IBMCPP__/100) +# define COMPILER_VERSION_MINOR DEC(__IBMCPP__/10 % 10) +# define COMPILER_VERSION_PATCH DEC(__IBMCPP__ % 10) + +#elif defined(__open_xl__) && defined(__clang__) +# define COMPILER_ID "IBMClang" +# define COMPILER_VERSION_MAJOR DEC(__open_xl_version__) +# define COMPILER_VERSION_MINOR DEC(__open_xl_release__) +# define COMPILER_VERSION_PATCH DEC(__open_xl_modification__) +# define COMPILER_VERSION_TWEAK DEC(__open_xl_ptf_fix_level__) + + +#elif defined(__ibmxl__) && defined(__clang__) +# define COMPILER_ID "XLClang" +# define COMPILER_VERSION_MAJOR DEC(__ibmxl_version__) +# define COMPILER_VERSION_MINOR DEC(__ibmxl_release__) +# define COMPILER_VERSION_PATCH DEC(__ibmxl_modification__) +# define COMPILER_VERSION_TWEAK DEC(__ibmxl_ptf_fix_level__) + + +#elif defined(__IBMCPP__) && !defined(__COMPILER_VER__) && __IBMCPP__ >= 800 +# define COMPILER_ID "XL" + /* __IBMCPP__ = VRP */ +# define COMPILER_VERSION_MAJOR DEC(__IBMCPP__/100) +# define COMPILER_VERSION_MINOR DEC(__IBMCPP__/10 % 10) +# define COMPILER_VERSION_PATCH DEC(__IBMCPP__ % 10) + +#elif defined(__IBMCPP__) && !defined(__COMPILER_VER__) && __IBMCPP__ < 800 +# define COMPILER_ID "VisualAge" + /* __IBMCPP__ = VRP */ +# define COMPILER_VERSION_MAJOR DEC(__IBMCPP__/100) +# define COMPILER_VERSION_MINOR DEC(__IBMCPP__/10 % 10) +# define COMPILER_VERSION_PATCH DEC(__IBMCPP__ % 10) + +#elif defined(__NVCOMPILER) +# define COMPILER_ID "NVHPC" +# define COMPILER_VERSION_MAJOR DEC(__NVCOMPILER_MAJOR__) +# define COMPILER_VERSION_MINOR DEC(__NVCOMPILER_MINOR__) +# if defined(__NVCOMPILER_PATCHLEVEL__) +# define COMPILER_VERSION_PATCH DEC(__NVCOMPILER_PATCHLEVEL__) +# endif + +#elif defined(__PGI) +# define COMPILER_ID "PGI" +# define COMPILER_VERSION_MAJOR DEC(__PGIC__) +# define COMPILER_VERSION_MINOR DEC(__PGIC_MINOR__) +# if defined(__PGIC_PATCHLEVEL__) +# define COMPILER_VERSION_PATCH DEC(__PGIC_PATCHLEVEL__) +# endif + +#elif defined(__clang__) && defined(__cray__) +# define COMPILER_ID "CrayClang" +# define COMPILER_VERSION_MAJOR DEC(__cray_major__) +# define COMPILER_VERSION_MINOR DEC(__cray_minor__) +# define COMPILER_VERSION_PATCH DEC(__cray_patchlevel__) +# define COMPILER_VERSION_INTERNAL_STR __clang_version__ + + +#elif defined(_CRAYC) +# define COMPILER_ID "Cray" +# define COMPILER_VERSION_MAJOR DEC(_RELEASE_MAJOR) +# define COMPILER_VERSION_MINOR DEC(_RELEASE_MINOR) + +#elif defined(__TI_COMPILER_VERSION__) +# define COMPILER_ID "TI" + /* __TI_COMPILER_VERSION__ = VVVRRRPPP */ +# define COMPILER_VERSION_MAJOR DEC(__TI_COMPILER_VERSION__/1000000) +# define COMPILER_VERSION_MINOR DEC(__TI_COMPILER_VERSION__/1000 % 1000) +# define COMPILER_VERSION_PATCH DEC(__TI_COMPILER_VERSION__ % 1000) + +#elif defined(__CLANG_FUJITSU) +# define COMPILER_ID "FujitsuClang" +# define COMPILER_VERSION_MAJOR DEC(__FCC_major__) +# define COMPILER_VERSION_MINOR DEC(__FCC_minor__) +# define COMPILER_VERSION_PATCH DEC(__FCC_patchlevel__) +# define COMPILER_VERSION_INTERNAL_STR __clang_version__ + + +#elif defined(__FUJITSU) +# define COMPILER_ID "Fujitsu" +# if defined(__FCC_version__) +# define COMPILER_VERSION __FCC_version__ +# elif defined(__FCC_major__) +# define COMPILER_VERSION_MAJOR DEC(__FCC_major__) +# define COMPILER_VERSION_MINOR DEC(__FCC_minor__) +# define COMPILER_VERSION_PATCH DEC(__FCC_patchlevel__) +# endif +# if defined(__fcc_version) +# define COMPILER_VERSION_INTERNAL DEC(__fcc_version) +# elif defined(__FCC_VERSION) +# define COMPILER_VERSION_INTERNAL DEC(__FCC_VERSION) +# endif + + +#elif defined(__ghs__) +# define COMPILER_ID "GHS" +/* __GHS_VERSION_NUMBER = VVVVRP */ +# ifdef __GHS_VERSION_NUMBER +# define COMPILER_VERSION_MAJOR DEC(__GHS_VERSION_NUMBER / 100) +# define COMPILER_VERSION_MINOR DEC(__GHS_VERSION_NUMBER / 10 % 10) +# define COMPILER_VERSION_PATCH DEC(__GHS_VERSION_NUMBER % 10) +# endif + +#elif defined(__TASKING__) +# define COMPILER_ID "Tasking" + # define COMPILER_VERSION_MAJOR DEC(__VERSION__/1000) + # define COMPILER_VERSION_MINOR DEC(__VERSION__ % 100) +# define COMPILER_VERSION_INTERNAL DEC(__VERSION__) + +#elif defined(__ORANGEC__) +# define COMPILER_ID "OrangeC" +# define COMPILER_VERSION_MAJOR DEC(__ORANGEC_MAJOR__) +# define COMPILER_VERSION_MINOR DEC(__ORANGEC_MINOR__) +# define COMPILER_VERSION_PATCH DEC(__ORANGEC_PATCHLEVEL__) + +#elif defined(__SCO_VERSION__) +# define COMPILER_ID "SCO" + +#elif defined(__ARMCC_VERSION) && !defined(__clang__) +# define COMPILER_ID "ARMCC" +#if __ARMCC_VERSION >= 1000000 + /* __ARMCC_VERSION = VRRPPPP */ + # define COMPILER_VERSION_MAJOR DEC(__ARMCC_VERSION/1000000) + # define COMPILER_VERSION_MINOR DEC(__ARMCC_VERSION/10000 % 100) + # define COMPILER_VERSION_PATCH DEC(__ARMCC_VERSION % 10000) +#else + /* __ARMCC_VERSION = VRPPPP */ + # define COMPILER_VERSION_MAJOR DEC(__ARMCC_VERSION/100000) + # define COMPILER_VERSION_MINOR DEC(__ARMCC_VERSION/10000 % 10) + # define COMPILER_VERSION_PATCH DEC(__ARMCC_VERSION % 10000) +#endif + + +#elif defined(__clang__) && defined(__apple_build_version__) +# define COMPILER_ID "AppleClang" +# if defined(_MSC_VER) +# define SIMULATE_ID "MSVC" +# endif +# define COMPILER_VERSION_MAJOR DEC(__clang_major__) +# define COMPILER_VERSION_MINOR DEC(__clang_minor__) +# define COMPILER_VERSION_PATCH DEC(__clang_patchlevel__) +# if defined(_MSC_VER) + /* _MSC_VER = VVRR */ +# define SIMULATE_VERSION_MAJOR DEC(_MSC_VER / 100) +# define SIMULATE_VERSION_MINOR DEC(_MSC_VER % 100) +# endif +# define COMPILER_VERSION_TWEAK DEC(__apple_build_version__) + +#elif defined(__clang__) && defined(__ARMCOMPILER_VERSION) +# define COMPILER_ID "ARMClang" + # define COMPILER_VERSION_MAJOR DEC(__ARMCOMPILER_VERSION/1000000) + # define COMPILER_VERSION_MINOR DEC(__ARMCOMPILER_VERSION/10000 % 100) + # define COMPILER_VERSION_PATCH DEC(__ARMCOMPILER_VERSION/100 % 100) +# define COMPILER_VERSION_INTERNAL DEC(__ARMCOMPILER_VERSION) + +#elif defined(__clang__) && defined(__ti__) +# define COMPILER_ID "TIClang" + # define COMPILER_VERSION_MAJOR DEC(__ti_major__) + # define COMPILER_VERSION_MINOR DEC(__ti_minor__) + # define COMPILER_VERSION_PATCH DEC(__ti_patchlevel__) +# define COMPILER_VERSION_INTERNAL DEC(__ti_version__) + +#elif defined(__clang__) +# define COMPILER_ID "Clang" +# if defined(_MSC_VER) +# define SIMULATE_ID "MSVC" +# endif +# define COMPILER_VERSION_MAJOR DEC(__clang_major__) +# define COMPILER_VERSION_MINOR DEC(__clang_minor__) +# define COMPILER_VERSION_PATCH DEC(__clang_patchlevel__) +# if defined(_MSC_VER) + /* _MSC_VER = VVRR */ +# define SIMULATE_VERSION_MAJOR DEC(_MSC_VER / 100) +# define SIMULATE_VERSION_MINOR DEC(_MSC_VER % 100) +# endif + +#elif defined(__LCC__) && (defined(__GNUC__) || defined(__GNUG__) || defined(__MCST__)) +# define COMPILER_ID "LCC" +# define COMPILER_VERSION_MAJOR DEC(__LCC__ / 100) +# define COMPILER_VERSION_MINOR DEC(__LCC__ % 100) +# if defined(__LCC_MINOR__) +# define COMPILER_VERSION_PATCH DEC(__LCC_MINOR__) +# endif +# if defined(__GNUC__) && defined(__GNUC_MINOR__) +# define SIMULATE_ID "GNU" +# define SIMULATE_VERSION_MAJOR DEC(__GNUC__) +# define SIMULATE_VERSION_MINOR DEC(__GNUC_MINOR__) +# if defined(__GNUC_PATCHLEVEL__) +# define SIMULATE_VERSION_PATCH DEC(__GNUC_PATCHLEVEL__) +# endif +# endif + +#elif defined(__GNUC__) || defined(__GNUG__) +# define COMPILER_ID "GNU" +# if defined(__GNUC__) +# define COMPILER_VERSION_MAJOR DEC(__GNUC__) +# else +# define COMPILER_VERSION_MAJOR DEC(__GNUG__) +# endif +# if defined(__GNUC_MINOR__) +# define COMPILER_VERSION_MINOR DEC(__GNUC_MINOR__) +# endif +# if defined(__GNUC_PATCHLEVEL__) +# define COMPILER_VERSION_PATCH DEC(__GNUC_PATCHLEVEL__) +# endif + +#elif defined(_MSC_VER) +# define COMPILER_ID "MSVC" + /* _MSC_VER = VVRR */ +# define COMPILER_VERSION_MAJOR DEC(_MSC_VER / 100) +# define COMPILER_VERSION_MINOR DEC(_MSC_VER % 100) +# if defined(_MSC_FULL_VER) +# if _MSC_VER >= 1400 + /* _MSC_FULL_VER = VVRRPPPPP */ +# define COMPILER_VERSION_PATCH DEC(_MSC_FULL_VER % 100000) +# else + /* _MSC_FULL_VER = VVRRPPPP */ +# define COMPILER_VERSION_PATCH DEC(_MSC_FULL_VER % 10000) +# endif +# endif +# if defined(_MSC_BUILD) +# define COMPILER_VERSION_TWEAK DEC(_MSC_BUILD) +# endif + +#elif defined(_ADI_COMPILER) +# define COMPILER_ID "ADSP" +#if defined(__VERSIONNUM__) + /* __VERSIONNUM__ = 0xVVRRPPTT */ +# define COMPILER_VERSION_MAJOR DEC(__VERSIONNUM__ >> 24 & 0xFF) +# define COMPILER_VERSION_MINOR DEC(__VERSIONNUM__ >> 16 & 0xFF) +# define COMPILER_VERSION_PATCH DEC(__VERSIONNUM__ >> 8 & 0xFF) +# define COMPILER_VERSION_TWEAK DEC(__VERSIONNUM__ & 0xFF) +#endif + +#elif defined(__IAR_SYSTEMS_ICC__) || defined(__IAR_SYSTEMS_ICC) +# define COMPILER_ID "IAR" +# if defined(__VER__) && defined(__ICCARM__) +# define COMPILER_VERSION_MAJOR DEC((__VER__) / 1000000) +# define COMPILER_VERSION_MINOR DEC(((__VER__) / 1000) % 1000) +# define COMPILER_VERSION_PATCH DEC((__VER__) % 1000) +# define COMPILER_VERSION_INTERNAL DEC(__IAR_SYSTEMS_ICC__) +# elif defined(__VER__) && (defined(__ICCAVR__) || defined(__ICCRX__) || defined(__ICCRH850__) || defined(__ICCRL78__) || defined(__ICC430__) || defined(__ICCRISCV__) || defined(__ICCV850__) || defined(__ICC8051__) || defined(__ICCSTM8__)) +# define COMPILER_VERSION_MAJOR DEC((__VER__) / 100) +# define COMPILER_VERSION_MINOR DEC((__VER__) - (((__VER__) / 100)*100)) +# define COMPILER_VERSION_PATCH DEC(__SUBVERSION__) +# define COMPILER_VERSION_INTERNAL DEC(__IAR_SYSTEMS_ICC__) +# endif + + +/* These compilers are either not known or too old to define an + identification macro. Try to identify the platform and guess that + it is the native compiler. */ +#elif defined(__hpux) || defined(__hpua) +# define COMPILER_ID "HP" + +#else /* unknown compiler */ +# define COMPILER_ID "" +#endif + +/* Construct the string literal in pieces to prevent the source from + getting matched. Store it in a pointer rather than an array + because some compilers will just produce instructions to fill the + array rather than assigning a pointer to a static array. */ +char const* info_compiler = "INFO" ":" "compiler[" COMPILER_ID "]"; +#ifdef SIMULATE_ID +char const* info_simulate = "INFO" ":" "simulate[" SIMULATE_ID "]"; +#endif + +#ifdef __QNXNTO__ +char const* qnxnto = "INFO" ":" "qnxnto[]"; +#endif + +#if defined(__CRAYXT_COMPUTE_LINUX_TARGET) +char const *info_cray = "INFO" ":" "compiler_wrapper[CrayPrgEnv]"; +#endif + +#define STRINGIFY_HELPER(X) #X +#define STRINGIFY(X) STRINGIFY_HELPER(X) + +/* Identify known platforms by name. */ +#if defined(__linux) || defined(__linux__) || defined(linux) +# define PLATFORM_ID "Linux" + +#elif defined(__MSYS__) +# define PLATFORM_ID "MSYS" + +#elif defined(__CYGWIN__) +# define PLATFORM_ID "Cygwin" + +#elif defined(__MINGW32__) +# define PLATFORM_ID "MinGW" + +#elif defined(__APPLE__) +# define PLATFORM_ID "Darwin" + +#elif defined(_WIN32) || defined(__WIN32__) || defined(WIN32) +# define PLATFORM_ID "Windows" + +#elif defined(__FreeBSD__) || defined(__FreeBSD) +# define PLATFORM_ID "FreeBSD" + +#elif defined(__NetBSD__) || defined(__NetBSD) +# define PLATFORM_ID "NetBSD" + +#elif defined(__OpenBSD__) || defined(__OPENBSD) +# define PLATFORM_ID "OpenBSD" + +#elif defined(__sun) || defined(sun) +# define PLATFORM_ID "SunOS" + +#elif defined(_AIX) || defined(__AIX) || defined(__AIX__) || defined(__aix) || defined(__aix__) +# define PLATFORM_ID "AIX" + +#elif defined(__hpux) || defined(__hpux__) +# define PLATFORM_ID "HP-UX" + +#elif defined(__HAIKU__) +# define PLATFORM_ID "Haiku" + +#elif defined(__BeOS) || defined(__BEOS__) || defined(_BEOS) +# define PLATFORM_ID "BeOS" + +#elif defined(__QNX__) || defined(__QNXNTO__) +# define PLATFORM_ID "QNX" + +#elif defined(__tru64) || defined(_tru64) || defined(__TRU64__) +# define PLATFORM_ID "Tru64" + +#elif defined(__riscos) || defined(__riscos__) +# define PLATFORM_ID "RISCos" + +#elif defined(__sinix) || defined(__sinix__) || defined(__SINIX__) +# define PLATFORM_ID "SINIX" + +#elif defined(__UNIX_SV__) +# define PLATFORM_ID "UNIX_SV" + +#elif defined(__bsdos__) +# define PLATFORM_ID "BSDOS" + +#elif defined(_MPRAS) || defined(MPRAS) +# define PLATFORM_ID "MP-RAS" + +#elif defined(__osf) || defined(__osf__) +# define PLATFORM_ID "OSF1" + +#elif defined(_SCO_SV) || defined(SCO_SV) || defined(sco_sv) +# define PLATFORM_ID "SCO_SV" + +#elif defined(__ultrix) || defined(__ultrix__) || defined(_ULTRIX) +# define PLATFORM_ID "ULTRIX" + +#elif defined(__XENIX__) || defined(_XENIX) || defined(XENIX) +# define PLATFORM_ID "Xenix" + +#elif defined(__WATCOMC__) +# if defined(__LINUX__) +# define PLATFORM_ID "Linux" + +# elif defined(__DOS__) +# define PLATFORM_ID "DOS" + +# elif defined(__OS2__) +# define PLATFORM_ID "OS2" + +# elif defined(__WINDOWS__) +# define PLATFORM_ID "Windows3x" + +# elif defined(__VXWORKS__) +# define PLATFORM_ID "VxWorks" + +# else /* unknown platform */ +# define PLATFORM_ID +# endif + +#elif defined(__INTEGRITY) +# if defined(INT_178B) +# define PLATFORM_ID "Integrity178" + +# else /* regular Integrity */ +# define PLATFORM_ID "Integrity" +# endif + +# elif defined(_ADI_COMPILER) +# define PLATFORM_ID "ADSP" + +#else /* unknown platform */ +# define PLATFORM_ID + +#endif + +/* For windows compilers MSVC and Intel we can determine + the architecture of the compiler being used. This is because + the compilers do not have flags that can change the architecture, + but rather depend on which compiler is being used +*/ +#if defined(_WIN32) && defined(_MSC_VER) +# if defined(_M_IA64) +# define ARCHITECTURE_ID "IA64" + +# elif defined(_M_ARM64EC) +# define ARCHITECTURE_ID "ARM64EC" + +# elif defined(_M_X64) || defined(_M_AMD64) +# define ARCHITECTURE_ID "x64" + +# elif defined(_M_IX86) +# define ARCHITECTURE_ID "X86" + +# elif defined(_M_ARM64) +# define ARCHITECTURE_ID "ARM64" + +# elif defined(_M_ARM) +# if _M_ARM == 4 +# define ARCHITECTURE_ID "ARMV4I" +# elif _M_ARM == 5 +# define ARCHITECTURE_ID "ARMV5I" +# else +# define ARCHITECTURE_ID "ARMV" STRINGIFY(_M_ARM) +# endif + +# elif defined(_M_MIPS) +# define ARCHITECTURE_ID "MIPS" + +# elif defined(_M_SH) +# define ARCHITECTURE_ID "SHx" + +# else /* unknown architecture */ +# define ARCHITECTURE_ID "" +# endif + +#elif defined(__WATCOMC__) +# if defined(_M_I86) +# define ARCHITECTURE_ID "I86" + +# elif defined(_M_IX86) +# define ARCHITECTURE_ID "X86" + +# else /* unknown architecture */ +# define ARCHITECTURE_ID "" +# endif + +#elif defined(__IAR_SYSTEMS_ICC__) || defined(__IAR_SYSTEMS_ICC) +# if defined(__ICCARM__) +# define ARCHITECTURE_ID "ARM" + +# elif defined(__ICCRX__) +# define ARCHITECTURE_ID "RX" + +# elif defined(__ICCRH850__) +# define ARCHITECTURE_ID "RH850" + +# elif defined(__ICCRL78__) +# define ARCHITECTURE_ID "RL78" + +# elif defined(__ICCRISCV__) +# define ARCHITECTURE_ID "RISCV" + +# elif defined(__ICCAVR__) +# define ARCHITECTURE_ID "AVR" + +# elif defined(__ICC430__) +# define ARCHITECTURE_ID "MSP430" + +# elif defined(__ICCV850__) +# define ARCHITECTURE_ID "V850" + +# elif defined(__ICC8051__) +# define ARCHITECTURE_ID "8051" + +# elif defined(__ICCSTM8__) +# define ARCHITECTURE_ID "STM8" + +# else /* unknown architecture */ +# define ARCHITECTURE_ID "" +# endif + +#elif defined(__ghs__) +# if defined(__PPC64__) +# define ARCHITECTURE_ID "PPC64" + +# elif defined(__ppc__) +# define ARCHITECTURE_ID "PPC" + +# elif defined(__ARM__) +# define ARCHITECTURE_ID "ARM" + +# elif defined(__x86_64__) +# define ARCHITECTURE_ID "x64" + +# elif defined(__i386__) +# define ARCHITECTURE_ID "X86" + +# else /* unknown architecture */ +# define ARCHITECTURE_ID "" +# endif + +#elif defined(__clang__) && defined(__ti__) +# if defined(__ARM_ARCH) +# define ARCHITECTURE_ID "Arm" + +# else /* unknown architecture */ +# define ARCHITECTURE_ID "" +# endif + +#elif defined(__TI_COMPILER_VERSION__) +# if defined(__TI_ARM__) +# define ARCHITECTURE_ID "ARM" + +# elif defined(__MSP430__) +# define ARCHITECTURE_ID "MSP430" + +# elif defined(__TMS320C28XX__) +# define ARCHITECTURE_ID "TMS320C28x" + +# elif defined(__TMS320C6X__) || defined(_TMS320C6X) +# define ARCHITECTURE_ID "TMS320C6x" + +# else /* unknown architecture */ +# define ARCHITECTURE_ID "" +# endif + +# elif defined(__ADSPSHARC__) +# define ARCHITECTURE_ID "SHARC" + +# elif defined(__ADSPBLACKFIN__) +# define ARCHITECTURE_ID "Blackfin" + +#elif defined(__TASKING__) + +# if defined(__CTC__) || defined(__CPTC__) +# define ARCHITECTURE_ID "TriCore" + +# elif defined(__CMCS__) +# define ARCHITECTURE_ID "MCS" + +# elif defined(__CARM__) +# define ARCHITECTURE_ID "ARM" + +# elif defined(__CARC__) +# define ARCHITECTURE_ID "ARC" + +# elif defined(__C51__) +# define ARCHITECTURE_ID "8051" + +# elif defined(__CPCP__) +# define ARCHITECTURE_ID "PCP" + +# else +# define ARCHITECTURE_ID "" +# endif + +#else +# define ARCHITECTURE_ID +#endif + +/* Convert integer to decimal digit literals. */ +#define DEC(n) \ + ('0' + (((n) / 10000000)%10)), \ + ('0' + (((n) / 1000000)%10)), \ + ('0' + (((n) / 100000)%10)), \ + ('0' + (((n) / 10000)%10)), \ + ('0' + (((n) / 1000)%10)), \ + ('0' + (((n) / 100)%10)), \ + ('0' + (((n) / 10)%10)), \ + ('0' + ((n) % 10)) + +/* Convert integer to hex digit literals. */ +#define HEX(n) \ + ('0' + ((n)>>28 & 0xF)), \ + ('0' + ((n)>>24 & 0xF)), \ + ('0' + ((n)>>20 & 0xF)), \ + ('0' + ((n)>>16 & 0xF)), \ + ('0' + ((n)>>12 & 0xF)), \ + ('0' + ((n)>>8 & 0xF)), \ + ('0' + ((n)>>4 & 0xF)), \ + ('0' + ((n) & 0xF)) + +/* Construct a string literal encoding the version number. */ +#ifdef COMPILER_VERSION +char const* info_version = "INFO" ":" "compiler_version[" COMPILER_VERSION "]"; + +/* Construct a string literal encoding the version number components. */ +#elif defined(COMPILER_VERSION_MAJOR) +char const info_version[] = { + 'I', 'N', 'F', 'O', ':', + 'c','o','m','p','i','l','e','r','_','v','e','r','s','i','o','n','[', + COMPILER_VERSION_MAJOR, +# ifdef COMPILER_VERSION_MINOR + '.', COMPILER_VERSION_MINOR, +# ifdef COMPILER_VERSION_PATCH + '.', COMPILER_VERSION_PATCH, +# ifdef COMPILER_VERSION_TWEAK + '.', COMPILER_VERSION_TWEAK, +# endif +# endif +# endif + ']','\0'}; +#endif + +/* Construct a string literal encoding the internal version number. */ +#ifdef COMPILER_VERSION_INTERNAL +char const info_version_internal[] = { + 'I', 'N', 'F', 'O', ':', + 'c','o','m','p','i','l','e','r','_','v','e','r','s','i','o','n','_', + 'i','n','t','e','r','n','a','l','[', + COMPILER_VERSION_INTERNAL,']','\0'}; +#elif defined(COMPILER_VERSION_INTERNAL_STR) +char const* info_version_internal = "INFO" ":" "compiler_version_internal[" COMPILER_VERSION_INTERNAL_STR "]"; +#endif + +/* Construct a string literal encoding the version number components. */ +#ifdef SIMULATE_VERSION_MAJOR +char const info_simulate_version[] = { + 'I', 'N', 'F', 'O', ':', + 's','i','m','u','l','a','t','e','_','v','e','r','s','i','o','n','[', + SIMULATE_VERSION_MAJOR, +# ifdef SIMULATE_VERSION_MINOR + '.', SIMULATE_VERSION_MINOR, +# ifdef SIMULATE_VERSION_PATCH + '.', SIMULATE_VERSION_PATCH, +# ifdef SIMULATE_VERSION_TWEAK + '.', SIMULATE_VERSION_TWEAK, +# endif +# endif +# endif + ']','\0'}; +#endif + +/* Construct the string literal in pieces to prevent the source from + getting matched. Store it in a pointer rather than an array + because some compilers will just produce instructions to fill the + array rather than assigning a pointer to a static array. */ +char const* info_platform = "INFO" ":" "platform[" PLATFORM_ID "]"; +char const* info_arch = "INFO" ":" "arch[" ARCHITECTURE_ID "]"; + + + +#define CXX_STD_98 199711L +#define CXX_STD_11 201103L +#define CXX_STD_14 201402L +#define CXX_STD_17 201703L +#define CXX_STD_20 202002L +#define CXX_STD_23 202302L + +#if defined(__INTEL_COMPILER) && defined(_MSVC_LANG) +# if _MSVC_LANG > CXX_STD_17 +# define CXX_STD _MSVC_LANG +# elif _MSVC_LANG == CXX_STD_17 && defined(__cpp_aggregate_paren_init) +# define CXX_STD CXX_STD_20 +# elif _MSVC_LANG > CXX_STD_14 && __cplusplus > CXX_STD_17 +# define CXX_STD CXX_STD_20 +# elif _MSVC_LANG > CXX_STD_14 +# define CXX_STD CXX_STD_17 +# elif defined(__INTEL_CXX11_MODE__) && defined(__cpp_aggregate_nsdmi) +# define CXX_STD CXX_STD_14 +# elif defined(__INTEL_CXX11_MODE__) +# define CXX_STD CXX_STD_11 +# else +# define CXX_STD CXX_STD_98 +# endif +#elif defined(_MSC_VER) && defined(_MSVC_LANG) +# if _MSVC_LANG > __cplusplus +# define CXX_STD _MSVC_LANG +# else +# define CXX_STD __cplusplus +# endif +#elif defined(__NVCOMPILER) +# if __cplusplus == CXX_STD_17 && defined(__cpp_aggregate_paren_init) +# define CXX_STD CXX_STD_20 +# else +# define CXX_STD __cplusplus +# endif +#elif defined(__INTEL_COMPILER) || defined(__PGI) +# if __cplusplus == CXX_STD_11 && defined(__cpp_namespace_attributes) +# define CXX_STD CXX_STD_17 +# elif __cplusplus == CXX_STD_11 && defined(__cpp_aggregate_nsdmi) +# define CXX_STD CXX_STD_14 +# else +# define CXX_STD __cplusplus +# endif +#elif (defined(__IBMCPP__) || defined(__ibmxl__)) && defined(__linux__) +# if __cplusplus == CXX_STD_11 && defined(__cpp_aggregate_nsdmi) +# define CXX_STD CXX_STD_14 +# else +# define CXX_STD __cplusplus +# endif +#elif __cplusplus == 1 && defined(__GXX_EXPERIMENTAL_CXX0X__) +# define CXX_STD CXX_STD_11 +#else +# define CXX_STD __cplusplus +#endif + +const char* info_language_standard_default = "INFO" ":" "standard_default[" +#if CXX_STD > CXX_STD_23 + "26" +#elif CXX_STD > CXX_STD_20 + "23" +#elif CXX_STD > CXX_STD_17 + "20" +#elif CXX_STD > CXX_STD_14 + "17" +#elif CXX_STD > CXX_STD_11 + "14" +#elif CXX_STD >= CXX_STD_11 + "11" +#else + "98" +#endif +"]"; + +const char* info_language_extensions_default = "INFO" ":" "extensions_default[" +#if (defined(__clang__) || defined(__GNUC__) || defined(__xlC__) || \ + defined(__TI_COMPILER_VERSION__)) && \ + !defined(__STRICT_ANSI__) + "ON" +#else + "OFF" +#endif +"]"; + +/*--------------------------------------------------------------------------*/ + +int main(int argc, char* argv[]) +{ + int require = 0; + require += info_compiler[argc]; + require += info_platform[argc]; + require += info_arch[argc]; +#ifdef COMPILER_VERSION_MAJOR + require += info_version[argc]; +#endif +#ifdef COMPILER_VERSION_INTERNAL + require += info_version_internal[argc]; +#endif +#ifdef SIMULATE_ID + require += info_simulate[argc]; +#endif +#ifdef SIMULATE_VERSION_MAJOR + require += info_simulate_version[argc]; +#endif +#if defined(__CRAYXT_COMPUTE_LINUX_TARGET) + require += info_cray[argc]; +#endif + require += info_language_standard_default[argc]; + require += info_language_extensions_default[argc]; + (void)argv; + return require; +} diff --git a/siro_rider/android/app/.cxx/Debug/3p4b322x/x86/CMakeFiles/3.31.5-g6cf5163/CompilerIdCXX/CMakeCXXCompilerId.o b/siro_rider/android/app/.cxx/Debug/3p4b322x/x86/CMakeFiles/3.31.5-g6cf5163/CompilerIdCXX/CMakeCXXCompilerId.o new file mode 100644 index 0000000..f3ced2c Binary files /dev/null and b/siro_rider/android/app/.cxx/Debug/3p4b322x/x86/CMakeFiles/3.31.5-g6cf5163/CompilerIdCXX/CMakeCXXCompilerId.o differ diff --git a/siro_rider/android/app/.cxx/Debug/3p4b322x/x86/CMakeFiles/CMakeConfigureLog.yaml b/siro_rider/android/app/.cxx/Debug/3p4b322x/x86/CMakeFiles/CMakeConfigureLog.yaml new file mode 100644 index 0000000..658e6ed --- /dev/null +++ b/siro_rider/android/app/.cxx/Debug/3p4b322x/x86/CMakeFiles/CMakeConfigureLog.yaml @@ -0,0 +1,399 @@ + +--- +events: + - + kind: "message-v1" + backtrace: + - "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeDetermineSystem.cmake:200 (message)" + - "CMakeLists.txt:2 (project)" + message: | + The target system is: Android - 1 - i686 + The host system is: Darwin - 24.5.0 - arm64 + - + kind: "message-v1" + backtrace: + - "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeDetermineCompilerId.cmake:17 (message)" + - "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeDetermineCompilerId.cmake:64 (__determine_compiler_id_test)" + - "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeDetermineCCompiler.cmake:123 (CMAKE_DETERMINE_COMPILER_ID)" + - "CMakeLists.txt:2 (project)" + message: | + Compiling the C compiler identification source file "CMakeCCompilerId.c" succeeded. + Compiler: /Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/bin/clang + Build flags: -g;-DANDROID;-fdata-sections;-ffunction-sections;-funwind-tables;-fstack-protector-strong;-no-canonical-prefixes;-mstackrealign;-D_FORTIFY_SOURCE=2;-Wformat;-Werror=format-security + Id flags: -c;--target=i686-none-linux-android23 + + The output was: + 0 + + + Compilation of the C compiler identification source "CMakeCCompilerId.c" produced "CMakeCCompilerId.o" + + The C compiler identification is Clang, found in: + /Users/hamzaaleghwairyeen/development/App/Intaleq/android/app/.cxx/Debug/3p4b322x/x86/CMakeFiles/3.31.5-g6cf5163/CompilerIdC/CMakeCCompilerId.o + + - + kind: "message-v1" + backtrace: + - "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeDetermineCompilerId.cmake:17 (message)" + - "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeDetermineCompilerId.cmake:64 (__determine_compiler_id_test)" + - "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeDetermineCXXCompiler.cmake:126 (CMAKE_DETERMINE_COMPILER_ID)" + - "CMakeLists.txt:2 (project)" + message: | + Compiling the CXX compiler identification source file "CMakeCXXCompilerId.cpp" succeeded. + Compiler: /Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/bin/clang++ + Build flags: -g;-DANDROID;-fdata-sections;-ffunction-sections;-funwind-tables;-fstack-protector-strong;-no-canonical-prefixes;-mstackrealign;-D_FORTIFY_SOURCE=2;-Wformat;-Werror=format-security + Id flags: -c;--target=i686-none-linux-android23 + + The output was: + 0 + + + Compilation of the CXX compiler identification source "CMakeCXXCompilerId.cpp" produced "CMakeCXXCompilerId.o" + + The CXX compiler identification is Clang, found in: + /Users/hamzaaleghwairyeen/development/App/Intaleq/android/app/.cxx/Debug/3p4b322x/x86/CMakeFiles/3.31.5-g6cf5163/CompilerIdCXX/CMakeCXXCompilerId.o + + - + kind: "try_compile-v1" + backtrace: + - "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeDetermineCompilerABI.cmake:74 (try_compile)" + - "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeTestCCompiler.cmake:26 (CMAKE_DETERMINE_COMPILER_ABI)" + - "CMakeLists.txt:2 (project)" + checks: + - "Detecting C compiler ABI info" + directories: + source: "/Users/hamzaaleghwairyeen/development/App/Intaleq/android/app/.cxx/Debug/3p4b322x/x86/CMakeFiles/CMakeScratch/TryCompile-gErgGk" + binary: "/Users/hamzaaleghwairyeen/development/App/Intaleq/android/app/.cxx/Debug/3p4b322x/x86/CMakeFiles/CMakeScratch/TryCompile-gErgGk" + cmakeVariables: + ANDROID_ABI: "x86" + ANDROID_ARM_MODE: "thumb" + ANDROID_PIE: "TRUE" + ANDROID_PLATFORM: "android-23" + ANDROID_STL: "c++_static" + ANDROID_TOOLCHAIN: "clang" + CMAKE_CXX_COMPILER_CLANG_SCAN_DEPS: "/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/bin/clang-scan-deps" + CMAKE_CXX_COMPILER_TARGET: "i686-none-linux-android23" + CMAKE_C_COMPILER_TARGET: "i686-none-linux-android23" + CMAKE_C_FLAGS: "-g -DANDROID -fdata-sections -ffunction-sections -funwind-tables -fstack-protector-strong -no-canonical-prefixes -mstackrealign -D_FORTIFY_SOURCE=2 -Wformat " + CMAKE_C_FLAGS_DEBUG: "-fno-limit-debug-info " + CMAKE_EXE_LINKER_FLAGS: "-static-libstdc++ -Wl,--build-id=sha1 -Wl,--no-rosegment -Wl,--no-undefined-version -Wl,--fatal-warnings -Wl,--no-undefined -Qunused-arguments " + CMAKE_POSITION_INDEPENDENT_CODE: "TRUE" + CMAKE_SYSROOT: "/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot" + buildResult: + variable: "CMAKE_C_ABI_COMPILED" + cached: true + stdout: | + Change Dir: '/Users/hamzaaleghwairyeen/development/App/Intaleq/android/app/.cxx/Debug/3p4b322x/x86/CMakeFiles/CMakeScratch/TryCompile-gErgGk' + + Run Build Command(s): /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/bin/ninja -v cmTC_f1115 + [1/2] /Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/bin/clang --target=i686-none-linux-android23 --sysroot=/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot -g -DANDROID -fdata-sections -ffunction-sections -funwind-tables -fstack-protector-strong -no-canonical-prefixes -mstackrealign -D_FORTIFY_SOURCE=2 -Wformat -fPIE -v -MD -MT CMakeFiles/cmTC_f1115.dir/CMakeCCompilerABI.c.o -MF CMakeFiles/cmTC_f1115.dir/CMakeCCompilerABI.c.o.d -o CMakeFiles/cmTC_f1115.dir/CMakeCCompilerABI.c.o -c /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeCCompilerABI.c + Android (12027248, +pgo, -bolt, +lto, -mlgo, based on r522817) clang version 18.0.1 (https://android.googlesource.com/toolchain/llvm-project d8003a456d14a3deb8054cdaa529ffbf02d9b262) + Target: i686-none-linux-android23 + Thread model: posix + InstalledDir: /Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/bin + (in-process) + "/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/bin/clang" -cc1 -triple i686-none-linux-android23 -emit-obj -mrelax-all -disable-free -clear-ast-before-backend -disable-llvm-verifier -discard-value-names -main-file-name CMakeCCompilerABI.c -mrelocation-model pic -pic-level 2 -pic-is-pie -mframe-pointer=all -ffp-contract=on -fno-rounding-math -mconstructor-aliases -funwind-tables=2 -target-cpu i686 -target-feature +ssse3 -tune-cpu generic -debug-info-kind=constructor -dwarf-version=4 -debugger-tuning=gdb -fdebug-compilation-dir=/Users/hamzaaleghwairyeen/development/App/Intaleq/android/app/.cxx/Debug/3p4b322x/x86/CMakeFiles/CMakeScratch/TryCompile-gErgGk -v -ffunction-sections -fdata-sections -fcoverage-compilation-dir=/Users/hamzaaleghwairyeen/development/App/Intaleq/android/app/.cxx/Debug/3p4b322x/x86/CMakeFiles/CMakeScratch/TryCompile-gErgGk -resource-dir /Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/lib/clang/18 -dependency-file CMakeFiles/cmTC_f1115.dir/CMakeCCompilerABI.c.o.d -MT CMakeFiles/cmTC_f1115.dir/CMakeCCompilerABI.c.o -sys-header-deps -D ANDROID -D _FORTIFY_SOURCE=2 -isysroot /Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot -internal-isystem /Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/lib/clang/18/include -internal-isystem /Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/local/include -internal-externc-isystem /Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/include/i686-linux-android -internal-externc-isystem /Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/include -internal-externc-isystem /Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/include -Wformat -ferror-limit 19 -femulated-tls -stack-protector 2 -mstackrealign -fgnuc-version=4.2.1 -D__GCC_HAVE_DWARF2_CFI_ASM=1 -o CMakeFiles/cmTC_f1115.dir/CMakeCCompilerABI.c.o -x c /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeCCompilerABI.c + clang -cc1 version 18.0.1 based upon LLVM 18.0.1 default target x86_64-apple-darwin24.5.0 + ignoring nonexistent directory "/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/local/include" + ignoring nonexistent directory "/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/include" + #include "..." search starts here: + #include <...> search starts here: + /Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/lib/clang/18/include + /Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/include/i686-linux-android + /Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/include + End of search list. + [2/2] : && /Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/bin/clang --target=i686-none-linux-android23 --sysroot=/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot -g -DANDROID -fdata-sections -ffunction-sections -funwind-tables -fstack-protector-strong -no-canonical-prefixes -mstackrealign -D_FORTIFY_SOURCE=2 -Wformat -static-libstdc++ -Wl,--build-id=sha1 -Wl,--no-rosegment -Wl,--no-undefined-version -Wl,--fatal-warnings -Wl,--no-undefined -Qunused-arguments -v CMakeFiles/cmTC_f1115.dir/CMakeCCompilerABI.c.o -o cmTC_f1115 && : + Android (12027248, +pgo, -bolt, +lto, -mlgo, based on r522817) clang version 18.0.1 (https://android.googlesource.com/toolchain/llvm-project d8003a456d14a3deb8054cdaa529ffbf02d9b262) + Target: i686-none-linux-android23 + Thread model: posix + InstalledDir: /Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/bin + "/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/bin/ld.lld" --sysroot=/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot -z now -z relro --hash-style=gnu --eh-frame-hdr -m elf_i386 -pie -dynamic-linker /system/bin/linker -o cmTC_f1115 /Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/lib/i686-linux-android/23/crtbegin_dynamic.o -L/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/lib/clang/18/lib/linux/i386 -L/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/lib/i686-linux-android/23 -L/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/lib/i686-linux-android -L/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/lib --build-id=sha1 --no-rosegment --no-undefined-version --fatal-warnings --no-undefined CMakeFiles/cmTC_f1115.dir/CMakeCCompilerABI.c.o /Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/lib/clang/18/lib/linux/libclang_rt.builtins-i686-android.a -l:libunwind.a -ldl -lc /Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/lib/clang/18/lib/linux/libclang_rt.builtins-i686-android.a -l:libunwind.a -ldl /Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/lib/i686-linux-android/23/crtend_android.o + + exitCode: 0 + - + kind: "message-v1" + backtrace: + - "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeDetermineCompilerABI.cmake:182 (message)" + - "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeTestCCompiler.cmake:26 (CMAKE_DETERMINE_COMPILER_ABI)" + - "CMakeLists.txt:2 (project)" + message: | + Parsed C implicit include dir info: rv=done + found start of include info + found start of implicit include info + add: [/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/lib/clang/18/include] + add: [/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/include/i686-linux-android] + add: [/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/include] + end of search list found + collapse include dir [/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/lib/clang/18/include] ==> [/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/lib/clang/18/include] + collapse include dir [/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/include/i686-linux-android] ==> [/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/include/i686-linux-android] + collapse include dir [/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/include] ==> [/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/include] + implicit include dirs: [/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/lib/clang/18/include;/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/include/i686-linux-android;/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/include] + + + - + kind: "message-v1" + backtrace: + - "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeDetermineCompilerABI.cmake:218 (message)" + - "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeTestCCompiler.cmake:26 (CMAKE_DETERMINE_COMPILER_ABI)" + - "CMakeLists.txt:2 (project)" + message: | + Parsed C implicit link information: + link line regex: [^( *|.*[/\\])(ld[0-9]*(\\.[a-z]+)?|CMAKE_LINK_STARTFILE-NOTFOUND|([^/\\]+-)?ld|collect2)[^/\\]*( |$)] + linker tool regex: [^[ ]*(->|")?[ ]*(([^"]*[/\\])?(ld[0-9]*(\\.[a-z]+)?))("|,| |$)] + ignore line: [Change Dir: '/Users/hamzaaleghwairyeen/development/App/Intaleq/android/app/.cxx/Debug/3p4b322x/x86/CMakeFiles/CMakeScratch/TryCompile-gErgGk'] + ignore line: [] + ignore line: [Run Build Command(s): /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/bin/ninja -v cmTC_f1115] + ignore line: [[1/2] /Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/bin/clang --target=i686-none-linux-android23 --sysroot=/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot -g -DANDROID -fdata-sections -ffunction-sections -funwind-tables -fstack-protector-strong -no-canonical-prefixes -mstackrealign -D_FORTIFY_SOURCE=2 -Wformat -fPIE -v -MD -MT CMakeFiles/cmTC_f1115.dir/CMakeCCompilerABI.c.o -MF CMakeFiles/cmTC_f1115.dir/CMakeCCompilerABI.c.o.d -o CMakeFiles/cmTC_f1115.dir/CMakeCCompilerABI.c.o -c /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeCCompilerABI.c] + ignore line: [Android (12027248 +pgo -bolt +lto -mlgo based on r522817) clang version 18.0.1 (https://android.googlesource.com/toolchain/llvm-project d8003a456d14a3deb8054cdaa529ffbf02d9b262)] + ignore line: [Target: i686-none-linux-android23] + ignore line: [Thread model: posix] + ignore line: [InstalledDir: /Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/bin] + ignore line: [ (in-process)] + ignore line: [ "/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/bin/clang" -cc1 -triple i686-none-linux-android23 -emit-obj -mrelax-all -disable-free -clear-ast-before-backend -disable-llvm-verifier -discard-value-names -main-file-name CMakeCCompilerABI.c -mrelocation-model pic -pic-level 2 -pic-is-pie -mframe-pointer=all -ffp-contract=on -fno-rounding-math -mconstructor-aliases -funwind-tables=2 -target-cpu i686 -target-feature +ssse3 -tune-cpu generic -debug-info-kind=constructor -dwarf-version=4 -debugger-tuning=gdb -fdebug-compilation-dir=/Users/hamzaaleghwairyeen/development/App/Intaleq/android/app/.cxx/Debug/3p4b322x/x86/CMakeFiles/CMakeScratch/TryCompile-gErgGk -v -ffunction-sections -fdata-sections -fcoverage-compilation-dir=/Users/hamzaaleghwairyeen/development/App/Intaleq/android/app/.cxx/Debug/3p4b322x/x86/CMakeFiles/CMakeScratch/TryCompile-gErgGk -resource-dir /Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/lib/clang/18 -dependency-file CMakeFiles/cmTC_f1115.dir/CMakeCCompilerABI.c.o.d -MT CMakeFiles/cmTC_f1115.dir/CMakeCCompilerABI.c.o -sys-header-deps -D ANDROID -D _FORTIFY_SOURCE=2 -isysroot /Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot -internal-isystem /Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/lib/clang/18/include -internal-isystem /Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/local/include -internal-externc-isystem /Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/include/i686-linux-android -internal-externc-isystem /Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/include -internal-externc-isystem /Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/include -Wformat -ferror-limit 19 -femulated-tls -stack-protector 2 -mstackrealign -fgnuc-version=4.2.1 -D__GCC_HAVE_DWARF2_CFI_ASM=1 -o CMakeFiles/cmTC_f1115.dir/CMakeCCompilerABI.c.o -x c /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeCCompilerABI.c] + ignore line: [clang -cc1 version 18.0.1 based upon LLVM 18.0.1 default target x86_64-apple-darwin24.5.0] + ignore line: [ignoring nonexistent directory "/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/local/include"] + ignore line: [ignoring nonexistent directory "/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/include"] + ignore line: [#include "..." search starts here:] + ignore line: [#include <...> search starts here:] + ignore line: [ /Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/lib/clang/18/include] + ignore line: [ /Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/include/i686-linux-android] + ignore line: [ /Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/include] + ignore line: [End of search list.] + ignore line: [[2/2] : && /Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/bin/clang --target=i686-none-linux-android23 --sysroot=/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot -g -DANDROID -fdata-sections -ffunction-sections -funwind-tables -fstack-protector-strong -no-canonical-prefixes -mstackrealign -D_FORTIFY_SOURCE=2 -Wformat -static-libstdc++ -Wl --build-id=sha1 -Wl --no-rosegment -Wl --no-undefined-version -Wl --fatal-warnings -Wl --no-undefined -Qunused-arguments -v CMakeFiles/cmTC_f1115.dir/CMakeCCompilerABI.c.o -o cmTC_f1115 && :] + ignore line: [Android (12027248 +pgo -bolt +lto -mlgo based on r522817) clang version 18.0.1 (https://android.googlesource.com/toolchain/llvm-project d8003a456d14a3deb8054cdaa529ffbf02d9b262)] + ignore line: [Target: i686-none-linux-android23] + ignore line: [Thread model: posix] + ignore line: [InstalledDir: /Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/bin] + link line: [ "/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/bin/ld.lld" --sysroot=/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot -z now -z relro --hash-style=gnu --eh-frame-hdr -m elf_i386 -pie -dynamic-linker /system/bin/linker -o cmTC_f1115 /Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/lib/i686-linux-android/23/crtbegin_dynamic.o -L/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/lib/clang/18/lib/linux/i386 -L/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/lib/i686-linux-android/23 -L/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/lib/i686-linux-android -L/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/lib --build-id=sha1 --no-rosegment --no-undefined-version --fatal-warnings --no-undefined CMakeFiles/cmTC_f1115.dir/CMakeCCompilerABI.c.o /Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/lib/clang/18/lib/linux/libclang_rt.builtins-i686-android.a -l:libunwind.a -ldl -lc /Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/lib/clang/18/lib/linux/libclang_rt.builtins-i686-android.a -l:libunwind.a -ldl /Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/lib/i686-linux-android/23/crtend_android.o] + arg [/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/bin/ld.lld] ==> ignore + arg [--sysroot=/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot] ==> ignore + arg [-znow] ==> ignore + arg [-zrelro] ==> ignore + arg [--hash-style=gnu] ==> ignore + arg [--eh-frame-hdr] ==> ignore + arg [-m] ==> ignore + arg [elf_i386] ==> ignore + arg [-pie] ==> ignore + arg [-dynamic-linker] ==> ignore + arg [/system/bin/linker] ==> ignore + arg [-o] ==> ignore + arg [cmTC_f1115] ==> ignore + arg [/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/lib/i686-linux-android/23/crtbegin_dynamic.o] ==> obj [/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/lib/i686-linux-android/23/crtbegin_dynamic.o] + arg [-L/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/lib/clang/18/lib/linux/i386] ==> dir [/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/lib/clang/18/lib/linux/i386] + arg [-L/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/lib/i686-linux-android/23] ==> dir [/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/lib/i686-linux-android/23] + arg [-L/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/lib/i686-linux-android] ==> dir [/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/lib/i686-linux-android] + arg [-L/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/lib] ==> dir [/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/lib] + arg [--build-id=sha1] ==> ignore + arg [--no-rosegment] ==> ignore + arg [--no-undefined-version] ==> ignore + arg [--fatal-warnings] ==> ignore + arg [--no-undefined] ==> ignore + arg [CMakeFiles/cmTC_f1115.dir/CMakeCCompilerABI.c.o] ==> ignore + arg [/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/lib/clang/18/lib/linux/libclang_rt.builtins-i686-android.a] ==> lib [/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/lib/clang/18/lib/linux/libclang_rt.builtins-i686-android.a] + arg [-l:libunwind.a] ==> lib [-l:libunwind.a] + arg [-ldl] ==> lib [dl] + arg [-lc] ==> lib [c] + arg [/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/lib/clang/18/lib/linux/libclang_rt.builtins-i686-android.a] ==> lib [/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/lib/clang/18/lib/linux/libclang_rt.builtins-i686-android.a] + arg [-l:libunwind.a] ==> lib [-l:libunwind.a] + arg [-ldl] ==> lib [dl] + arg [/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/lib/i686-linux-android/23/crtend_android.o] ==> obj [/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/lib/i686-linux-android/23/crtend_android.o] + linker tool for 'C': /Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/bin/ld.lld + remove lib [/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/lib/clang/18/lib/linux/libclang_rt.builtins-i686-android.a] + remove lib [/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/lib/clang/18/lib/linux/libclang_rt.builtins-i686-android.a] + collapse library dir [/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/lib/clang/18/lib/linux/i386] ==> [/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/lib/clang/18/lib/linux/i386] + collapse library dir [/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/lib/i686-linux-android/23] ==> [/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/lib/i686-linux-android/23] + collapse library dir [/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/lib/i686-linux-android] ==> [/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/lib/i686-linux-android] + collapse library dir [/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/lib] ==> [/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/lib] + implicit libs: [-l:libunwind.a;dl;c;-l:libunwind.a;dl] + implicit objs: [/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/lib/i686-linux-android/23/crtbegin_dynamic.o;/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/lib/i686-linux-android/23/crtend_android.o] + implicit dirs: [/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/lib/clang/18/lib/linux/i386;/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/lib/i686-linux-android/23;/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/lib/i686-linux-android;/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/lib] + implicit fwks: [] + + + - + kind: "message-v1" + backtrace: + - "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Internal/CMakeDetermineLinkerId.cmake:40 (message)" + - "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeDetermineCompilerABI.cmake:255 (cmake_determine_linker_id)" + - "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeTestCCompiler.cmake:26 (CMAKE_DETERMINE_COMPILER_ABI)" + - "CMakeLists.txt:2 (project)" + message: | + Running the C compiler's linker: "/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/bin/ld.lld" "-v" + LLD 18.0.1 (compatible with GNU linkers) + - + kind: "try_compile-v1" + backtrace: + - "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeDetermineCompilerABI.cmake:74 (try_compile)" + - "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeTestCXXCompiler.cmake:26 (CMAKE_DETERMINE_COMPILER_ABI)" + - "CMakeLists.txt:2 (project)" + checks: + - "Detecting CXX compiler ABI info" + directories: + source: "/Users/hamzaaleghwairyeen/development/App/Intaleq/android/app/.cxx/Debug/3p4b322x/x86/CMakeFiles/CMakeScratch/TryCompile-9BXFQ5" + binary: "/Users/hamzaaleghwairyeen/development/App/Intaleq/android/app/.cxx/Debug/3p4b322x/x86/CMakeFiles/CMakeScratch/TryCompile-9BXFQ5" + cmakeVariables: + ANDROID_ABI: "x86" + ANDROID_ARM_MODE: "thumb" + ANDROID_PIE: "TRUE" + ANDROID_PLATFORM: "android-23" + ANDROID_STL: "c++_static" + ANDROID_TOOLCHAIN: "clang" + CMAKE_CXX_COMPILER_CLANG_SCAN_DEPS: "/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/bin/clang-scan-deps" + CMAKE_CXX_COMPILER_TARGET: "i686-none-linux-android23" + CMAKE_CXX_FLAGS: "-g -DANDROID -fdata-sections -ffunction-sections -funwind-tables -fstack-protector-strong -no-canonical-prefixes -mstackrealign -D_FORTIFY_SOURCE=2 -Wformat " + CMAKE_CXX_FLAGS_DEBUG: "-fno-limit-debug-info " + CMAKE_CXX_SCAN_FOR_MODULES: "OFF" + CMAKE_C_COMPILER_TARGET: "i686-none-linux-android23" + CMAKE_EXE_LINKER_FLAGS: "-static-libstdc++ -Wl,--build-id=sha1 -Wl,--no-rosegment -Wl,--no-undefined-version -Wl,--fatal-warnings -Wl,--no-undefined -Qunused-arguments " + CMAKE_POSITION_INDEPENDENT_CODE: "TRUE" + CMAKE_SYSROOT: "/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot" + buildResult: + variable: "CMAKE_CXX_ABI_COMPILED" + cached: true + stdout: | + Change Dir: '/Users/hamzaaleghwairyeen/development/App/Intaleq/android/app/.cxx/Debug/3p4b322x/x86/CMakeFiles/CMakeScratch/TryCompile-9BXFQ5' + + Run Build Command(s): /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/bin/ninja -v cmTC_6c139 + [1/2] /Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/bin/clang++ --target=i686-none-linux-android23 --sysroot=/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot -g -DANDROID -fdata-sections -ffunction-sections -funwind-tables -fstack-protector-strong -no-canonical-prefixes -mstackrealign -D_FORTIFY_SOURCE=2 -Wformat -fPIE -v -MD -MT CMakeFiles/cmTC_6c139.dir/CMakeCXXCompilerABI.cpp.o -MF CMakeFiles/cmTC_6c139.dir/CMakeCXXCompilerABI.cpp.o.d -o CMakeFiles/cmTC_6c139.dir/CMakeCXXCompilerABI.cpp.o -c /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeCXXCompilerABI.cpp + Android (12027248, +pgo, -bolt, +lto, -mlgo, based on r522817) clang version 18.0.1 (https://android.googlesource.com/toolchain/llvm-project d8003a456d14a3deb8054cdaa529ffbf02d9b262) + Target: i686-none-linux-android23 + Thread model: posix + InstalledDir: /Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/bin + (in-process) + "/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/bin/clang++" -cc1 -triple i686-none-linux-android23 -emit-obj -mrelax-all -disable-free -clear-ast-before-backend -disable-llvm-verifier -discard-value-names -main-file-name CMakeCXXCompilerABI.cpp -mrelocation-model pic -pic-level 2 -pic-is-pie -mframe-pointer=all -ffp-contract=on -fno-rounding-math -mconstructor-aliases -funwind-tables=2 -target-cpu i686 -target-feature +ssse3 -tune-cpu generic -debug-info-kind=constructor -dwarf-version=4 -debugger-tuning=gdb -fdebug-compilation-dir=/Users/hamzaaleghwairyeen/development/App/Intaleq/android/app/.cxx/Debug/3p4b322x/x86/CMakeFiles/CMakeScratch/TryCompile-9BXFQ5 -v -ffunction-sections -fdata-sections -fcoverage-compilation-dir=/Users/hamzaaleghwairyeen/development/App/Intaleq/android/app/.cxx/Debug/3p4b322x/x86/CMakeFiles/CMakeScratch/TryCompile-9BXFQ5 -resource-dir /Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/lib/clang/18 -dependency-file CMakeFiles/cmTC_6c139.dir/CMakeCXXCompilerABI.cpp.o.d -MT CMakeFiles/cmTC_6c139.dir/CMakeCXXCompilerABI.cpp.o -sys-header-deps -D ANDROID -D _FORTIFY_SOURCE=2 -isysroot /Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot -internal-isystem /Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/include/c++/v1 -internal-isystem /Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/lib/clang/18/include -internal-isystem /Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/local/include -internal-externc-isystem /Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/include/i686-linux-android -internal-externc-isystem /Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/include -internal-externc-isystem /Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/include -Wformat -fdeprecated-macro -ferror-limit 19 -femulated-tls -stack-protector 2 -mstackrealign -fgnuc-version=4.2.1 -fcxx-exceptions -fexceptions -D__GCC_HAVE_DWARF2_CFI_ASM=1 -o CMakeFiles/cmTC_6c139.dir/CMakeCXXCompilerABI.cpp.o -x c++ /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeCXXCompilerABI.cpp + clang -cc1 version 18.0.1 based upon LLVM 18.0.1 default target x86_64-apple-darwin24.5.0 + ignoring nonexistent directory "/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/local/include" + ignoring nonexistent directory "/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/include" + #include "..." search starts here: + #include <...> search starts here: + /Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/include/c++/v1 + /Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/lib/clang/18/include + /Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/include/i686-linux-android + /Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/include + End of search list. + [2/2] : && /Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/bin/clang++ --target=i686-none-linux-android23 --sysroot=/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot -g -DANDROID -fdata-sections -ffunction-sections -funwind-tables -fstack-protector-strong -no-canonical-prefixes -mstackrealign -D_FORTIFY_SOURCE=2 -Wformat -static-libstdc++ -Wl,--build-id=sha1 -Wl,--no-rosegment -Wl,--no-undefined-version -Wl,--fatal-warnings -Wl,--no-undefined -Qunused-arguments -v CMakeFiles/cmTC_6c139.dir/CMakeCXXCompilerABI.cpp.o -o cmTC_6c139 && : + Android (12027248, +pgo, -bolt, +lto, -mlgo, based on r522817) clang version 18.0.1 (https://android.googlesource.com/toolchain/llvm-project d8003a456d14a3deb8054cdaa529ffbf02d9b262) + Target: i686-none-linux-android23 + Thread model: posix + InstalledDir: /Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/bin + "/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/bin/ld.lld" --sysroot=/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot -z now -z relro --hash-style=gnu --eh-frame-hdr -m elf_i386 -pie -dynamic-linker /system/bin/linker -o cmTC_6c139 /Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/lib/i686-linux-android/23/crtbegin_dynamic.o -L/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/lib/clang/18/lib/linux/i386 -L/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/lib/i686-linux-android/23 -L/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/lib/i686-linux-android -L/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/lib --build-id=sha1 --no-rosegment --no-undefined-version --fatal-warnings --no-undefined CMakeFiles/cmTC_6c139.dir/CMakeCXXCompilerABI.cpp.o -Bstatic -lc++ -Bdynamic -lm /Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/lib/clang/18/lib/linux/libclang_rt.builtins-i686-android.a -l:libunwind.a -ldl -lc /Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/lib/clang/18/lib/linux/libclang_rt.builtins-i686-android.a -l:libunwind.a -ldl /Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/lib/i686-linux-android/23/crtend_android.o + + exitCode: 0 + - + kind: "message-v1" + backtrace: + - "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeDetermineCompilerABI.cmake:182 (message)" + - "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeTestCXXCompiler.cmake:26 (CMAKE_DETERMINE_COMPILER_ABI)" + - "CMakeLists.txt:2 (project)" + message: | + Parsed CXX implicit include dir info: rv=done + found start of include info + found start of implicit include info + add: [/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/include/c++/v1] + add: [/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/lib/clang/18/include] + add: [/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/include/i686-linux-android] + add: [/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/include] + end of search list found + collapse include dir [/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/include/c++/v1] ==> [/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/include/c++/v1] + collapse include dir [/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/lib/clang/18/include] ==> [/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/lib/clang/18/include] + collapse include dir [/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/include/i686-linux-android] ==> [/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/include/i686-linux-android] + collapse include dir [/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/include] ==> [/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/include] + implicit include dirs: [/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/include/c++/v1;/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/lib/clang/18/include;/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/include/i686-linux-android;/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/include] + + + - + kind: "message-v1" + backtrace: + - "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeDetermineCompilerABI.cmake:218 (message)" + - "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeTestCXXCompiler.cmake:26 (CMAKE_DETERMINE_COMPILER_ABI)" + - "CMakeLists.txt:2 (project)" + message: | + Parsed CXX implicit link information: + link line regex: [^( *|.*[/\\])(ld[0-9]*(\\.[a-z]+)?|CMAKE_LINK_STARTFILE-NOTFOUND|([^/\\]+-)?ld|collect2)[^/\\]*( |$)] + linker tool regex: [^[ ]*(->|")?[ ]*(([^"]*[/\\])?(ld[0-9]*(\\.[a-z]+)?))("|,| |$)] + ignore line: [Change Dir: '/Users/hamzaaleghwairyeen/development/App/Intaleq/android/app/.cxx/Debug/3p4b322x/x86/CMakeFiles/CMakeScratch/TryCompile-9BXFQ5'] + ignore line: [] + ignore line: [Run Build Command(s): /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/bin/ninja -v cmTC_6c139] + ignore line: [[1/2] /Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/bin/clang++ --target=i686-none-linux-android23 --sysroot=/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot -g -DANDROID -fdata-sections -ffunction-sections -funwind-tables -fstack-protector-strong -no-canonical-prefixes -mstackrealign -D_FORTIFY_SOURCE=2 -Wformat -fPIE -v -MD -MT CMakeFiles/cmTC_6c139.dir/CMakeCXXCompilerABI.cpp.o -MF CMakeFiles/cmTC_6c139.dir/CMakeCXXCompilerABI.cpp.o.d -o CMakeFiles/cmTC_6c139.dir/CMakeCXXCompilerABI.cpp.o -c /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeCXXCompilerABI.cpp] + ignore line: [Android (12027248 +pgo -bolt +lto -mlgo based on r522817) clang version 18.0.1 (https://android.googlesource.com/toolchain/llvm-project d8003a456d14a3deb8054cdaa529ffbf02d9b262)] + ignore line: [Target: i686-none-linux-android23] + ignore line: [Thread model: posix] + ignore line: [InstalledDir: /Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/bin] + ignore line: [ (in-process)] + ignore line: [ "/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/bin/clang++" -cc1 -triple i686-none-linux-android23 -emit-obj -mrelax-all -disable-free -clear-ast-before-backend -disable-llvm-verifier -discard-value-names -main-file-name CMakeCXXCompilerABI.cpp -mrelocation-model pic -pic-level 2 -pic-is-pie -mframe-pointer=all -ffp-contract=on -fno-rounding-math -mconstructor-aliases -funwind-tables=2 -target-cpu i686 -target-feature +ssse3 -tune-cpu generic -debug-info-kind=constructor -dwarf-version=4 -debugger-tuning=gdb -fdebug-compilation-dir=/Users/hamzaaleghwairyeen/development/App/Intaleq/android/app/.cxx/Debug/3p4b322x/x86/CMakeFiles/CMakeScratch/TryCompile-9BXFQ5 -v -ffunction-sections -fdata-sections -fcoverage-compilation-dir=/Users/hamzaaleghwairyeen/development/App/Intaleq/android/app/.cxx/Debug/3p4b322x/x86/CMakeFiles/CMakeScratch/TryCompile-9BXFQ5 -resource-dir /Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/lib/clang/18 -dependency-file CMakeFiles/cmTC_6c139.dir/CMakeCXXCompilerABI.cpp.o.d -MT CMakeFiles/cmTC_6c139.dir/CMakeCXXCompilerABI.cpp.o -sys-header-deps -D ANDROID -D _FORTIFY_SOURCE=2 -isysroot /Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot -internal-isystem /Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/include/c++/v1 -internal-isystem /Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/lib/clang/18/include -internal-isystem /Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/local/include -internal-externc-isystem /Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/include/i686-linux-android -internal-externc-isystem /Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/include -internal-externc-isystem /Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/include -Wformat -fdeprecated-macro -ferror-limit 19 -femulated-tls -stack-protector 2 -mstackrealign -fgnuc-version=4.2.1 -fcxx-exceptions -fexceptions -D__GCC_HAVE_DWARF2_CFI_ASM=1 -o CMakeFiles/cmTC_6c139.dir/CMakeCXXCompilerABI.cpp.o -x c++ /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeCXXCompilerABI.cpp] + ignore line: [clang -cc1 version 18.0.1 based upon LLVM 18.0.1 default target x86_64-apple-darwin24.5.0] + ignore line: [ignoring nonexistent directory "/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/local/include"] + ignore line: [ignoring nonexistent directory "/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/include"] + ignore line: [#include "..." search starts here:] + ignore line: [#include <...> search starts here:] + ignore line: [ /Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/include/c++/v1] + ignore line: [ /Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/lib/clang/18/include] + ignore line: [ /Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/include/i686-linux-android] + ignore line: [ /Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/include] + ignore line: [End of search list.] + ignore line: [[2/2] : && /Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/bin/clang++ --target=i686-none-linux-android23 --sysroot=/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot -g -DANDROID -fdata-sections -ffunction-sections -funwind-tables -fstack-protector-strong -no-canonical-prefixes -mstackrealign -D_FORTIFY_SOURCE=2 -Wformat -static-libstdc++ -Wl --build-id=sha1 -Wl --no-rosegment -Wl --no-undefined-version -Wl --fatal-warnings -Wl --no-undefined -Qunused-arguments -v CMakeFiles/cmTC_6c139.dir/CMakeCXXCompilerABI.cpp.o -o cmTC_6c139 && :] + ignore line: [Android (12027248 +pgo -bolt +lto -mlgo based on r522817) clang version 18.0.1 (https://android.googlesource.com/toolchain/llvm-project d8003a456d14a3deb8054cdaa529ffbf02d9b262)] + ignore line: [Target: i686-none-linux-android23] + ignore line: [Thread model: posix] + ignore line: [InstalledDir: /Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/bin] + link line: [ "/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/bin/ld.lld" --sysroot=/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot -z now -z relro --hash-style=gnu --eh-frame-hdr -m elf_i386 -pie -dynamic-linker /system/bin/linker -o cmTC_6c139 /Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/lib/i686-linux-android/23/crtbegin_dynamic.o -L/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/lib/clang/18/lib/linux/i386 -L/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/lib/i686-linux-android/23 -L/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/lib/i686-linux-android -L/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/lib --build-id=sha1 --no-rosegment --no-undefined-version --fatal-warnings --no-undefined CMakeFiles/cmTC_6c139.dir/CMakeCXXCompilerABI.cpp.o -Bstatic -lc++ -Bdynamic -lm /Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/lib/clang/18/lib/linux/libclang_rt.builtins-i686-android.a -l:libunwind.a -ldl -lc /Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/lib/clang/18/lib/linux/libclang_rt.builtins-i686-android.a -l:libunwind.a -ldl /Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/lib/i686-linux-android/23/crtend_android.o] + arg [/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/bin/ld.lld] ==> ignore + arg [--sysroot=/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot] ==> ignore + arg [-znow] ==> ignore + arg [-zrelro] ==> ignore + arg [--hash-style=gnu] ==> ignore + arg [--eh-frame-hdr] ==> ignore + arg [-m] ==> ignore + arg [elf_i386] ==> ignore + arg [-pie] ==> ignore + arg [-dynamic-linker] ==> ignore + arg [/system/bin/linker] ==> ignore + arg [-o] ==> ignore + arg [cmTC_6c139] ==> ignore + arg [/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/lib/i686-linux-android/23/crtbegin_dynamic.o] ==> obj [/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/lib/i686-linux-android/23/crtbegin_dynamic.o] + arg [-L/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/lib/clang/18/lib/linux/i386] ==> dir [/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/lib/clang/18/lib/linux/i386] + arg [-L/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/lib/i686-linux-android/23] ==> dir [/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/lib/i686-linux-android/23] + arg [-L/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/lib/i686-linux-android] ==> dir [/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/lib/i686-linux-android] + arg [-L/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/lib] ==> dir [/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/lib] + arg [--build-id=sha1] ==> ignore + arg [--no-rosegment] ==> ignore + arg [--no-undefined-version] ==> ignore + arg [--fatal-warnings] ==> ignore + arg [--no-undefined] ==> ignore + arg [CMakeFiles/cmTC_6c139.dir/CMakeCXXCompilerABI.cpp.o] ==> ignore + arg [-Bstatic] ==> search static + arg [-lc++] ==> lib [c++] + arg [-Bdynamic] ==> search dynamic + arg [-lm] ==> lib [m] + arg [/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/lib/clang/18/lib/linux/libclang_rt.builtins-i686-android.a] ==> lib [/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/lib/clang/18/lib/linux/libclang_rt.builtins-i686-android.a] + arg [-l:libunwind.a] ==> lib [-l:libunwind.a] + arg [-ldl] ==> lib [dl] + arg [-lc] ==> lib [c] + arg [/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/lib/clang/18/lib/linux/libclang_rt.builtins-i686-android.a] ==> lib [/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/lib/clang/18/lib/linux/libclang_rt.builtins-i686-android.a] + arg [-l:libunwind.a] ==> lib [-l:libunwind.a] + arg [-ldl] ==> lib [dl] + arg [/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/lib/i686-linux-android/23/crtend_android.o] ==> obj [/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/lib/i686-linux-android/23/crtend_android.o] + linker tool for 'CXX': /Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/bin/ld.lld + remove lib [/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/lib/clang/18/lib/linux/libclang_rt.builtins-i686-android.a] + remove lib [/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/lib/clang/18/lib/linux/libclang_rt.builtins-i686-android.a] + collapse library dir [/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/lib/clang/18/lib/linux/i386] ==> [/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/lib/clang/18/lib/linux/i386] + collapse library dir [/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/lib/i686-linux-android/23] ==> [/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/lib/i686-linux-android/23] + collapse library dir [/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/lib/i686-linux-android] ==> [/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/lib/i686-linux-android] + collapse library dir [/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/lib] ==> [/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/lib] + implicit libs: [c++;m;-l:libunwind.a;dl;c;-l:libunwind.a;dl] + implicit objs: [/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/lib/i686-linux-android/23/crtbegin_dynamic.o;/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/lib/i686-linux-android/23/crtend_android.o] + implicit dirs: [/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/lib/clang/18/lib/linux/i386;/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/lib/i686-linux-android/23;/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/lib/i686-linux-android;/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/lib] + implicit fwks: [] + + + - + kind: "message-v1" + backtrace: + - "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Internal/CMakeDetermineLinkerId.cmake:40 (message)" + - "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeDetermineCompilerABI.cmake:255 (cmake_determine_linker_id)" + - "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeTestCXXCompiler.cmake:26 (CMAKE_DETERMINE_COMPILER_ABI)" + - "CMakeLists.txt:2 (project)" + message: | + Running the CXX compiler's linker: "/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/bin/ld.lld" "-v" + LLD 18.0.1 (compatible with GNU linkers) +... diff --git a/siro_rider/android/app/.cxx/Debug/3p4b322x/x86/CMakeFiles/TargetDirectories.txt b/siro_rider/android/app/.cxx/Debug/3p4b322x/x86/CMakeFiles/TargetDirectories.txt new file mode 100644 index 0000000..bca4c5c --- /dev/null +++ b/siro_rider/android/app/.cxx/Debug/3p4b322x/x86/CMakeFiles/TargetDirectories.txt @@ -0,0 +1,3 @@ +/Users/hamzaaleghwairyeen/development/App/Intaleq/android/app/.cxx/Debug/3p4b322x/x86/CMakeFiles/native-lib.dir +/Users/hamzaaleghwairyeen/development/App/Intaleq/android/app/.cxx/Debug/3p4b322x/x86/CMakeFiles/edit_cache.dir +/Users/hamzaaleghwairyeen/development/App/Intaleq/android/app/.cxx/Debug/3p4b322x/x86/CMakeFiles/rebuild_cache.dir diff --git a/siro_rider/android/app/.cxx/Debug/3p4b322x/x86/CMakeFiles/cmake.check_cache b/siro_rider/android/app/.cxx/Debug/3p4b322x/x86/CMakeFiles/cmake.check_cache new file mode 100644 index 0000000..3dccd73 --- /dev/null +++ b/siro_rider/android/app/.cxx/Debug/3p4b322x/x86/CMakeFiles/cmake.check_cache @@ -0,0 +1 @@ +# This file is generated by cmake for dependency checking of the CMakeCache.txt file diff --git a/siro_rider/android/app/.cxx/Debug/3p4b322x/x86/CMakeFiles/native-lib.dir/native-lib.cpp.o b/siro_rider/android/app/.cxx/Debug/3p4b322x/x86/CMakeFiles/native-lib.dir/native-lib.cpp.o new file mode 100644 index 0000000..44d02a3 Binary files /dev/null and b/siro_rider/android/app/.cxx/Debug/3p4b322x/x86/CMakeFiles/native-lib.dir/native-lib.cpp.o differ diff --git a/siro_rider/android/app/.cxx/Debug/3p4b322x/x86/CMakeFiles/rules.ninja b/siro_rider/android/app/.cxx/Debug/3p4b322x/x86/CMakeFiles/rules.ninja new file mode 100644 index 0000000..7b82596 --- /dev/null +++ b/siro_rider/android/app/.cxx/Debug/3p4b322x/x86/CMakeFiles/rules.ninja @@ -0,0 +1,66 @@ +# CMAKE generated file: DO NOT EDIT! +# Generated by "Ninja" Generator, CMake Version 3.31 + +# This file contains all the rules used to get the outputs files +# built from the input files. +# It is included in the main 'build.ninja'. + +# ============================================================================= +# Project: intaleq +# Configurations: Debug +# ============================================================================= +# ============================================================================= + +############################################# +# Rule for compiling CXX files. + +rule CXX_COMPILER__native-lib_unscanned_Debug + depfile = $DEP_FILE + deps = gcc + command = ${LAUNCHER}${CODE_CHECK}/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/bin/clang++ --target=i686-none-linux-android23 --sysroot=/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot $DEFINES $INCLUDES $FLAGS -MD -MT $out -MF $DEP_FILE -o $out -c $in + description = Building CXX object $out + + +############################################# +# Rule for linking CXX shared library. + +rule CXX_SHARED_LIBRARY_LINKER__native-lib_Debug + depfile = $DEP_FILE + deps = gcc + command = $PRE_LINK && /Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/bin/clang++ --target=i686-none-linux-android23 --sysroot=/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot -fPIC $LANGUAGE_COMPILE_FLAGS $ARCH_FLAGS $LINK_FLAGS -shared $SONAME_FLAG$SONAME -o $TARGET_FILE $in $LINK_PATH $LINK_LIBRARIES && $POST_BUILD + description = Linking CXX shared library $TARGET_FILE + restat = $RESTAT + + +############################################# +# Rule for running custom commands. + +rule CUSTOM_COMMAND + command = $COMMAND + description = $DESC + + +############################################# +# Rule for re-running cmake. + +rule RERUN_CMAKE + command = /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/bin/cmake --regenerate-during-build -S/Users/hamzaaleghwairyeen/development/App/Intaleq/android/app/src/main/cpp -B/Users/hamzaaleghwairyeen/development/App/Intaleq/android/app/.cxx/Debug/3p4b322x/x86 + description = Re-running CMake... + generator = 1 + + +############################################# +# Rule for cleaning all built files. + +rule CLEAN + command = /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/bin/ninja $FILE_ARG -t clean $TARGETS + description = Cleaning all built files... + + +############################################# +# Rule for printing all primary targets available. + +rule HELP + command = /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/bin/ninja -t targets + description = All primary targets available: + diff --git a/siro_rider/android/app/.cxx/Debug/3p4b322x/x86/additional_project_files.txt b/siro_rider/android/app/.cxx/Debug/3p4b322x/x86/additional_project_files.txt new file mode 100644 index 0000000..e69de29 diff --git a/siro_rider/android/app/.cxx/Debug/3p4b322x/x86/android_gradle_build.json b/siro_rider/android/app/.cxx/Debug/3p4b322x/x86/android_gradle_build.json new file mode 100644 index 0000000..b2b3bd0 --- /dev/null +++ b/siro_rider/android/app/.cxx/Debug/3p4b322x/x86/android_gradle_build.json @@ -0,0 +1,38 @@ +{ + "buildFiles": [ + "/Users/hamzaaleghwairyeen/development/App/Intaleq/android/app/src/main/cpp/CMakeLists.txt" + ], + "cleanCommandsComponents": [ + [ + "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/bin/ninja", + "-C", + "/Users/hamzaaleghwairyeen/development/App/Intaleq/android/app/.cxx/Debug/3p4b322x/x86", + "clean" + ] + ], + "buildTargetsCommandComponents": [ + "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/bin/ninja", + "-C", + "/Users/hamzaaleghwairyeen/development/App/Intaleq/android/app/.cxx/Debug/3p4b322x/x86", + "{LIST_OF_TARGETS_TO_BUILD}" + ], + "libraries": { + "native-lib::@6890427a1f51a3e7e1df": { + "toolchain": "toolchain", + "abi": "x86", + "artifactName": "native-lib", + "output": "/Users/hamzaaleghwairyeen/development/App/Intaleq/build/app/intermediates/cxx/Debug/3p4b322x/obj/x86/libnative-lib.so", + "runtimeFiles": [] + } + }, + "toolchains": { + "toolchain": { + "cCompilerExecutable": "/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/bin/clang.lld", + "cppCompilerExecutable": "/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/bin/clang++.lld" + } + }, + "cFileExtensions": [], + "cppFileExtensions": [ + "cpp" + ] +} \ No newline at end of file diff --git a/siro_rider/android/app/.cxx/Debug/3p4b322x/x86/android_gradle_build_mini.json b/siro_rider/android/app/.cxx/Debug/3p4b322x/x86/android_gradle_build_mini.json new file mode 100644 index 0000000..1be877a --- /dev/null +++ b/siro_rider/android/app/.cxx/Debug/3p4b322x/x86/android_gradle_build_mini.json @@ -0,0 +1,27 @@ +{ + "buildFiles": [ + "/Users/hamzaaleghwairyeen/development/App/Intaleq/android/app/src/main/cpp/CMakeLists.txt" + ], + "cleanCommandsComponents": [ + [ + "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/bin/ninja", + "-C", + "/Users/hamzaaleghwairyeen/development/App/Intaleq/android/app/.cxx/Debug/3p4b322x/x86", + "clean" + ] + ], + "buildTargetsCommandComponents": [ + "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/bin/ninja", + "-C", + "/Users/hamzaaleghwairyeen/development/App/Intaleq/android/app/.cxx/Debug/3p4b322x/x86", + "{LIST_OF_TARGETS_TO_BUILD}" + ], + "libraries": { + "native-lib::@6890427a1f51a3e7e1df": { + "artifactName": "native-lib", + "abi": "x86", + "output": "/Users/hamzaaleghwairyeen/development/App/Intaleq/build/app/intermediates/cxx/Debug/3p4b322x/obj/x86/libnative-lib.so", + "runtimeFiles": [] + } + } +} \ No newline at end of file diff --git a/siro_rider/android/app/.cxx/Debug/3p4b322x/x86/build.ninja b/siro_rider/android/app/.cxx/Debug/3p4b322x/x86/build.ninja new file mode 100644 index 0000000..c6548b0 --- /dev/null +++ b/siro_rider/android/app/.cxx/Debug/3p4b322x/x86/build.ninja @@ -0,0 +1,156 @@ +# CMAKE generated file: DO NOT EDIT! +# Generated by "Ninja" Generator, CMake Version 3.31 + +# This file contains all the build statements describing the +# compilation DAG. + +# ============================================================================= +# Write statements declared in CMakeLists.txt: +# +# Which is the root file. +# ============================================================================= + +# ============================================================================= +# Project: intaleq +# Configurations: Debug +# ============================================================================= + +############################################# +# Minimal version of Ninja required by this file + +ninja_required_version = 1.5 + + +############################################# +# Set configuration variable for custom commands. + +CONFIGURATION = Debug +# ============================================================================= +# Include auxiliary files. + + +############################################# +# Include rules file. + +include CMakeFiles/rules.ninja + +# ============================================================================= + +############################################# +# Logical path to working directory; prefix for absolute paths. + +cmake_ninja_workdir = /Users/hamzaaleghwairyeen/development/App/Intaleq/android/app/.cxx/Debug/3p4b322x/x86/ +# ============================================================================= +# Object build statements for SHARED_LIBRARY target native-lib + + +############################################# +# Order-only phony target for native-lib + +build cmake_object_order_depends_target_native-lib: phony || . + +build CMakeFiles/native-lib.dir/native-lib.cpp.o: CXX_COMPILER__native-lib_unscanned_Debug /Users/hamzaaleghwairyeen/development/App/Intaleq/android/app/src/main/cpp/native-lib.cpp || cmake_object_order_depends_target_native-lib + DEFINES = -Dnative_lib_EXPORTS + DEP_FILE = CMakeFiles/native-lib.dir/native-lib.cpp.o.d + FLAGS = -g -DANDROID -fdata-sections -ffunction-sections -funwind-tables -fstack-protector-strong -no-canonical-prefixes -mstackrealign -D_FORTIFY_SOURCE=2 -Wformat -Werror=format-security -fno-limit-debug-info -fPIC + OBJECT_DIR = CMakeFiles/native-lib.dir + OBJECT_FILE_DIR = CMakeFiles/native-lib.dir + TARGET_COMPILE_PDB = CMakeFiles/native-lib.dir/ + TARGET_PDB = /Users/hamzaaleghwairyeen/development/App/Intaleq/build/app/intermediates/cxx/Debug/3p4b322x/obj/x86/libnative-lib.pdb + + +# ============================================================================= +# Link build statements for SHARED_LIBRARY target native-lib + + +############################################# +# Link the shared library /Users/hamzaaleghwairyeen/development/App/Intaleq/build/app/intermediates/cxx/Debug/3p4b322x/obj/x86/libnative-lib.so + +build /Users/hamzaaleghwairyeen/development/App/Intaleq/build/app/intermediates/cxx/Debug/3p4b322x/obj/x86/libnative-lib.so: CXX_SHARED_LIBRARY_LINKER__native-lib_Debug CMakeFiles/native-lib.dir/native-lib.cpp.o | /Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/lib/i686-linux-android/23/liblog.so + DEP_FILE = CMakeFiles/native-lib.dir/link.d + LANGUAGE_COMPILE_FLAGS = -g -DANDROID -fdata-sections -ffunction-sections -funwind-tables -fstack-protector-strong -no-canonical-prefixes -mstackrealign -D_FORTIFY_SOURCE=2 -Wformat -Werror=format-security -fno-limit-debug-info + LINK_FLAGS = -static-libstdc++ -Wl,--build-id=sha1 -Wl,--no-rosegment -Wl,--no-undefined-version -Wl,--fatal-warnings -Wl,--no-undefined -Qunused-arguments -Xlinker --dependency-file=CMakeFiles/native-lib.dir/link.d + LINK_LIBRARIES = /Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/lib/i686-linux-android/23/liblog.so -latomic -lm + OBJECT_DIR = CMakeFiles/native-lib.dir + POST_BUILD = : + PRE_LINK = : + SONAME = libnative-lib.so + SONAME_FLAG = -Wl,-soname, + TARGET_COMPILE_PDB = CMakeFiles/native-lib.dir/ + TARGET_FILE = /Users/hamzaaleghwairyeen/development/App/Intaleq/build/app/intermediates/cxx/Debug/3p4b322x/obj/x86/libnative-lib.so + TARGET_PDB = /Users/hamzaaleghwairyeen/development/App/Intaleq/build/app/intermediates/cxx/Debug/3p4b322x/obj/x86/libnative-lib.pdb + + +############################################# +# Utility command for edit_cache + +build CMakeFiles/edit_cache.util: CUSTOM_COMMAND + COMMAND = cd /Users/hamzaaleghwairyeen/development/App/Intaleq/android/app/.cxx/Debug/3p4b322x/x86 && /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/bin/ccmake -S/Users/hamzaaleghwairyeen/development/App/Intaleq/android/app/src/main/cpp -B/Users/hamzaaleghwairyeen/development/App/Intaleq/android/app/.cxx/Debug/3p4b322x/x86 + DESC = Running CMake cache editor... + pool = console + restat = 1 + +build edit_cache: phony CMakeFiles/edit_cache.util + + +############################################# +# Utility command for rebuild_cache + +build CMakeFiles/rebuild_cache.util: CUSTOM_COMMAND + COMMAND = cd /Users/hamzaaleghwairyeen/development/App/Intaleq/android/app/.cxx/Debug/3p4b322x/x86 && /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/bin/cmake --regenerate-during-build -S/Users/hamzaaleghwairyeen/development/App/Intaleq/android/app/src/main/cpp -B/Users/hamzaaleghwairyeen/development/App/Intaleq/android/app/.cxx/Debug/3p4b322x/x86 + DESC = Running CMake to regenerate build system... + pool = console + restat = 1 + +build rebuild_cache: phony CMakeFiles/rebuild_cache.util + +# ============================================================================= +# Target aliases. + +build libnative-lib.so: phony /Users/hamzaaleghwairyeen/development/App/Intaleq/build/app/intermediates/cxx/Debug/3p4b322x/obj/x86/libnative-lib.so + +build native-lib: phony /Users/hamzaaleghwairyeen/development/App/Intaleq/build/app/intermediates/cxx/Debug/3p4b322x/obj/x86/libnative-lib.so + +# ============================================================================= +# Folder targets. + +# ============================================================================= + +############################################# +# Folder: /Users/hamzaaleghwairyeen/development/App/Intaleq/android/app/.cxx/Debug/3p4b322x/x86 + +build all: phony /Users/hamzaaleghwairyeen/development/App/Intaleq/build/app/intermediates/cxx/Debug/3p4b322x/obj/x86/libnative-lib.so + +# ============================================================================= +# Built-in targets + + +############################################# +# Re-run CMake if any of its inputs changed. + +build build.ninja: RERUN_CMAKE | /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeCCompiler.cmake.in /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeCCompilerABI.c /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeCInformation.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeCXXCompiler.cmake.in /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeCXXCompilerABI.cpp /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeCXXInformation.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeCommonLanguageInclude.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeCompilerIdDetection.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeDetermineCCompiler.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeDetermineCXXCompiler.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeDetermineCompiler.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeDetermineCompilerABI.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeDetermineCompilerId.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeDetermineCompilerSupport.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeDetermineSystem.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeFindBinUtils.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeGenericSystem.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeInitializeConfigs.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeLanguageInformation.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeParseImplicitIncludeInfo.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeParseImplicitLinkInfo.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeParseLibraryArchitecture.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeSystem.cmake.in /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeSystemSpecificInformation.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeSystemSpecificInitialize.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeTestCCompiler.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeTestCXXCompiler.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeTestCompilerCommon.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/ADSP-DetermineCompiler.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/ARMCC-DetermineCompiler.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/ARMClang-DetermineCompiler.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/AppleClang-DetermineCompiler.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/Borland-DetermineCompiler.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/Bruce-C-DetermineCompiler.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/CMakeCommonCompilerMacros.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/Clang-C.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/Clang-CXX-CXXImportStd.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/Clang-CXX.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/Clang-DetermineCompiler.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/Clang-DetermineCompilerInternal.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/Clang-FindBinUtils.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/Clang.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/Compaq-C-DetermineCompiler.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/Compaq-CXX-DetermineCompiler.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/Cray-DetermineCompiler.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/CrayClang-DetermineCompiler.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/Embarcadero-DetermineCompiler.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/Fujitsu-DetermineCompiler.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/FujitsuClang-DetermineCompiler.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/GHS-DetermineCompiler.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/GNU-C-DetermineCompiler.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/GNU-CXX-DetermineCompiler.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/GNU.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/HP-C-DetermineCompiler.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/HP-CXX-DetermineCompiler.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/IAR-DetermineCompiler.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/IBMCPP-C-DetermineVersionInternal.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/IBMCPP-CXX-DetermineVersionInternal.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/IBMClang-C-DetermineCompiler.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/IBMClang-CXX-DetermineCompiler.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/Intel-DetermineCompiler.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/IntelLLVM-DetermineCompiler.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/LCC-C-DetermineCompiler.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/LCC-CXX-DetermineCompiler.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/MSVC-DetermineCompiler.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/NVHPC-DetermineCompiler.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/NVIDIA-DetermineCompiler.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/OpenWatcom-DetermineCompiler.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/OrangeC-DetermineCompiler.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/PGI-DetermineCompiler.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/PathScale-DetermineCompiler.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/SCO-DetermineCompiler.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/SDCC-C-DetermineCompiler.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/SunPro-C-DetermineCompiler.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/SunPro-CXX-DetermineCompiler.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/TI-DetermineCompiler.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/TIClang-DetermineCompiler.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/Tasking-DetermineCompiler.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/TinyCC-C-DetermineCompiler.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/VisualAge-C-DetermineCompiler.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/VisualAge-CXX-DetermineCompiler.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/Watcom-DetermineCompiler.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/XL-C-DetermineCompiler.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/XL-CXX-DetermineCompiler.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/XLClang-C-DetermineCompiler.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/XLClang-CXX-DetermineCompiler.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/zOS-C-DetermineCompiler.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/zOS-CXX-DetermineCompiler.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Internal/CMakeCLinkerInformation.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Internal/CMakeCXXLinkerInformation.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Internal/CMakeCommonLinkerInformation.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Internal/CMakeDetermineLinkerId.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Internal/FeatureTesting.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Linker/GNU.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Linker/LLD-C.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Linker/LLD-CXX.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Linker/LLD.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Platform/Android-Clang-C.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Platform/Android-Clang-CXX.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Platform/Android-Clang.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Platform/Android-Determine-C.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Platform/Android-Determine-CXX.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Platform/Android-Determine.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Platform/Android-Initialize.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Platform/Android.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Platform/Android/Determine-Compiler.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Platform/Linker/Android-LLD-C.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Platform/Linker/Android-LLD-CXX.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Platform/Linker/GNU.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Platform/Linker/Linux-GNU.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Platform/Linker/Linux-LLD-C.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Platform/Linker/Linux-LLD-CXX.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Platform/Linker/Linux-LLD.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Platform/Linux-Initialize.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Platform/Linux.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Platform/UnixPaths.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/build/cmake/abis.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/build/cmake/android-legacy.toolchain.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/build/cmake/android.toolchain.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/build/cmake/flags.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/build/cmake/hooks/pre/Android-Clang.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/build/cmake/hooks/pre/Android-Determine.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/build/cmake/hooks/pre/Android-Initialize.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/build/cmake/hooks/pre/Android.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/build/cmake/hooks/pre/Determine-Compiler.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/build/cmake/platforms.cmake /Users/hamzaaleghwairyeen/development/App/Intaleq/android/app/src/main/cpp/CMakeLists.txt CMakeCache.txt CMakeFiles/3.31.5-g6cf5163/CMakeCCompiler.cmake CMakeFiles/3.31.5-g6cf5163/CMakeCXXCompiler.cmake CMakeFiles/3.31.5-g6cf5163/CMakeSystem.cmake + pool = console + + +############################################# +# A missing CMake input file is not an error. + +build /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeCCompiler.cmake.in /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeCCompilerABI.c /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeCInformation.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeCXXCompiler.cmake.in /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeCXXCompilerABI.cpp /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeCXXInformation.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeCommonLanguageInclude.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeCompilerIdDetection.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeDetermineCCompiler.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeDetermineCXXCompiler.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeDetermineCompiler.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeDetermineCompilerABI.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeDetermineCompilerId.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeDetermineCompilerSupport.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeDetermineSystem.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeFindBinUtils.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeGenericSystem.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeInitializeConfigs.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeLanguageInformation.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeParseImplicitIncludeInfo.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeParseImplicitLinkInfo.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeParseLibraryArchitecture.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeSystem.cmake.in /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeSystemSpecificInformation.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeSystemSpecificInitialize.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeTestCCompiler.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeTestCXXCompiler.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeTestCompilerCommon.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/ADSP-DetermineCompiler.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/ARMCC-DetermineCompiler.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/ARMClang-DetermineCompiler.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/AppleClang-DetermineCompiler.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/Borland-DetermineCompiler.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/Bruce-C-DetermineCompiler.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/CMakeCommonCompilerMacros.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/Clang-C.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/Clang-CXX-CXXImportStd.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/Clang-CXX.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/Clang-DetermineCompiler.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/Clang-DetermineCompilerInternal.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/Clang-FindBinUtils.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/Clang.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/Compaq-C-DetermineCompiler.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/Compaq-CXX-DetermineCompiler.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/Cray-DetermineCompiler.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/CrayClang-DetermineCompiler.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/Embarcadero-DetermineCompiler.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/Fujitsu-DetermineCompiler.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/FujitsuClang-DetermineCompiler.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/GHS-DetermineCompiler.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/GNU-C-DetermineCompiler.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/GNU-CXX-DetermineCompiler.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/GNU.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/HP-C-DetermineCompiler.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/HP-CXX-DetermineCompiler.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/IAR-DetermineCompiler.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/IBMCPP-C-DetermineVersionInternal.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/IBMCPP-CXX-DetermineVersionInternal.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/IBMClang-C-DetermineCompiler.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/IBMClang-CXX-DetermineCompiler.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/Intel-DetermineCompiler.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/IntelLLVM-DetermineCompiler.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/LCC-C-DetermineCompiler.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/LCC-CXX-DetermineCompiler.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/MSVC-DetermineCompiler.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/NVHPC-DetermineCompiler.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/NVIDIA-DetermineCompiler.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/OpenWatcom-DetermineCompiler.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/OrangeC-DetermineCompiler.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/PGI-DetermineCompiler.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/PathScale-DetermineCompiler.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/SCO-DetermineCompiler.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/SDCC-C-DetermineCompiler.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/SunPro-C-DetermineCompiler.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/SunPro-CXX-DetermineCompiler.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/TI-DetermineCompiler.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/TIClang-DetermineCompiler.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/Tasking-DetermineCompiler.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/TinyCC-C-DetermineCompiler.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/VisualAge-C-DetermineCompiler.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/VisualAge-CXX-DetermineCompiler.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/Watcom-DetermineCompiler.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/XL-C-DetermineCompiler.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/XL-CXX-DetermineCompiler.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/XLClang-C-DetermineCompiler.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/XLClang-CXX-DetermineCompiler.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/zOS-C-DetermineCompiler.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/zOS-CXX-DetermineCompiler.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Internal/CMakeCLinkerInformation.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Internal/CMakeCXXLinkerInformation.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Internal/CMakeCommonLinkerInformation.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Internal/CMakeDetermineLinkerId.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Internal/FeatureTesting.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Linker/GNU.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Linker/LLD-C.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Linker/LLD-CXX.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Linker/LLD.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Platform/Android-Clang-C.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Platform/Android-Clang-CXX.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Platform/Android-Clang.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Platform/Android-Determine-C.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Platform/Android-Determine-CXX.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Platform/Android-Determine.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Platform/Android-Initialize.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Platform/Android.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Platform/Android/Determine-Compiler.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Platform/Linker/Android-LLD-C.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Platform/Linker/Android-LLD-CXX.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Platform/Linker/GNU.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Platform/Linker/Linux-GNU.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Platform/Linker/Linux-LLD-C.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Platform/Linker/Linux-LLD-CXX.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Platform/Linker/Linux-LLD.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Platform/Linux-Initialize.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Platform/Linux.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Platform/UnixPaths.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/build/cmake/abis.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/build/cmake/android-legacy.toolchain.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/build/cmake/android.toolchain.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/build/cmake/flags.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/build/cmake/hooks/pre/Android-Clang.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/build/cmake/hooks/pre/Android-Determine.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/build/cmake/hooks/pre/Android-Initialize.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/build/cmake/hooks/pre/Android.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/build/cmake/hooks/pre/Determine-Compiler.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/build/cmake/platforms.cmake /Users/hamzaaleghwairyeen/development/App/Intaleq/android/app/src/main/cpp/CMakeLists.txt CMakeCache.txt CMakeFiles/3.31.5-g6cf5163/CMakeCCompiler.cmake CMakeFiles/3.31.5-g6cf5163/CMakeCXXCompiler.cmake CMakeFiles/3.31.5-g6cf5163/CMakeSystem.cmake: phony + + +############################################# +# Clean all the built files. + +build clean: CLEAN + + +############################################# +# Print all primary targets available. + +build help: HELP + + +############################################# +# Make the all target the default. + +default all diff --git a/siro_rider/android/app/.cxx/Debug/3p4b322x/x86/build_file_index.txt b/siro_rider/android/app/.cxx/Debug/3p4b322x/x86/build_file_index.txt new file mode 100644 index 0000000..661f7ae --- /dev/null +++ b/siro_rider/android/app/.cxx/Debug/3p4b322x/x86/build_file_index.txt @@ -0,0 +1 @@ +/Users/hamzaaleghwairyeen/development/App/Intaleq/android/app/src/main/cpp/CMakeLists.txt \ No newline at end of file diff --git a/siro_rider/android/app/.cxx/Debug/3p4b322x/x86/cmake_install.cmake b/siro_rider/android/app/.cxx/Debug/3p4b322x/x86/cmake_install.cmake new file mode 100644 index 0000000..9763188 --- /dev/null +++ b/siro_rider/android/app/.cxx/Debug/3p4b322x/x86/cmake_install.cmake @@ -0,0 +1,66 @@ +# Install script for directory: /Users/hamzaaleghwairyeen/development/App/Intaleq/android/app/src/main/cpp + +# Set the install prefix +if(NOT DEFINED CMAKE_INSTALL_PREFIX) + set(CMAKE_INSTALL_PREFIX "/usr/local") +endif() +string(REGEX REPLACE "/$" "" CMAKE_INSTALL_PREFIX "${CMAKE_INSTALL_PREFIX}") + +# Set the install configuration name. +if(NOT DEFINED CMAKE_INSTALL_CONFIG_NAME) + if(BUILD_TYPE) + string(REGEX REPLACE "^[^A-Za-z0-9_]+" "" + CMAKE_INSTALL_CONFIG_NAME "${BUILD_TYPE}") + else() + set(CMAKE_INSTALL_CONFIG_NAME "Debug") + endif() + message(STATUS "Install configuration: \"${CMAKE_INSTALL_CONFIG_NAME}\"") +endif() + +# Set the component getting installed. +if(NOT CMAKE_INSTALL_COMPONENT) + if(COMPONENT) + message(STATUS "Install component: \"${COMPONENT}\"") + set(CMAKE_INSTALL_COMPONENT "${COMPONENT}") + else() + set(CMAKE_INSTALL_COMPONENT) + endif() +endif() + +# Install shared libraries without execute permission? +if(NOT DEFINED CMAKE_INSTALL_SO_NO_EXE) + set(CMAKE_INSTALL_SO_NO_EXE "0") +endif() + +# Is this installation the result of a crosscompile? +if(NOT DEFINED CMAKE_CROSSCOMPILING) + set(CMAKE_CROSSCOMPILING "TRUE") +endif() + +# Set path to fallback-tool for dependency-resolution. +if(NOT DEFINED CMAKE_OBJDUMP) + set(CMAKE_OBJDUMP "/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/bin/llvm-objdump") +endif() + +string(REPLACE ";" "\n" CMAKE_INSTALL_MANIFEST_CONTENT + "${CMAKE_INSTALL_MANIFEST_FILES}") +if(CMAKE_INSTALL_LOCAL_ONLY) + file(WRITE "/Users/hamzaaleghwairyeen/development/App/Intaleq/android/app/.cxx/Debug/3p4b322x/x86/install_local_manifest.txt" + "${CMAKE_INSTALL_MANIFEST_CONTENT}") +endif() +if(CMAKE_INSTALL_COMPONENT) + if(CMAKE_INSTALL_COMPONENT MATCHES "^[a-zA-Z0-9_.+-]+$") + set(CMAKE_INSTALL_MANIFEST "install_manifest_${CMAKE_INSTALL_COMPONENT}.txt") + else() + string(MD5 CMAKE_INST_COMP_HASH "${CMAKE_INSTALL_COMPONENT}") + set(CMAKE_INSTALL_MANIFEST "install_manifest_${CMAKE_INST_COMP_HASH}.txt") + unset(CMAKE_INST_COMP_HASH) + endif() +else() + set(CMAKE_INSTALL_MANIFEST "install_manifest.txt") +endif() + +if(NOT CMAKE_INSTALL_LOCAL_ONLY) + file(WRITE "/Users/hamzaaleghwairyeen/development/App/Intaleq/android/app/.cxx/Debug/3p4b322x/x86/${CMAKE_INSTALL_MANIFEST}" + "${CMAKE_INSTALL_MANIFEST_CONTENT}") +endif() diff --git a/siro_rider/android/app/.cxx/Debug/3p4b322x/x86/compile_commands.json b/siro_rider/android/app/.cxx/Debug/3p4b322x/x86/compile_commands.json new file mode 100644 index 0000000..a379b2d --- /dev/null +++ b/siro_rider/android/app/.cxx/Debug/3p4b322x/x86/compile_commands.json @@ -0,0 +1,8 @@ +[ +{ + "directory": "/Users/hamzaaleghwairyeen/development/App/Intaleq/android/app/.cxx/Debug/3p4b322x/x86", + "command": "/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/bin/clang++ --target=i686-none-linux-android23 --sysroot=/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot -Dnative_lib_EXPORTS -g -DANDROID -fdata-sections -ffunction-sections -funwind-tables -fstack-protector-strong -no-canonical-prefixes -mstackrealign -D_FORTIFY_SOURCE=2 -Wformat -Werror=format-security -fno-limit-debug-info -fPIC -o CMakeFiles/native-lib.dir/native-lib.cpp.o -c /Users/hamzaaleghwairyeen/development/App/Intaleq/android/app/src/main/cpp/native-lib.cpp", + "file": "/Users/hamzaaleghwairyeen/development/App/Intaleq/android/app/src/main/cpp/native-lib.cpp", + "output": "CMakeFiles/native-lib.dir/native-lib.cpp.o" +} +] \ No newline at end of file diff --git a/siro_rider/android/app/.cxx/Debug/3p4b322x/x86/compile_commands.json.bin b/siro_rider/android/app/.cxx/Debug/3p4b322x/x86/compile_commands.json.bin new file mode 100644 index 0000000..422f9a4 Binary files /dev/null and b/siro_rider/android/app/.cxx/Debug/3p4b322x/x86/compile_commands.json.bin differ diff --git a/siro_rider/android/app/.cxx/Debug/3p4b322x/x86/configure_fingerprint.bin b/siro_rider/android/app/.cxx/Debug/3p4b322x/x86/configure_fingerprint.bin new file mode 100644 index 0000000..952018a --- /dev/null +++ b/siro_rider/android/app/.cxx/Debug/3p4b322x/x86/configure_fingerprint.bin @@ -0,0 +1,29 @@ +C/C++ Structured Logv +t +r/Users/hamzaaleghwairyeen/development/App/Intaleq/android/app/.cxx/Debug/3p4b322x/x86/additional_project_files.txtC +A +?com.android.build.gradle.internal.cxx.io.EncodedFileFingerPrint  3  2s +q +o/Users/hamzaaleghwairyeen/development/App/Intaleq/android/app/.cxx/Debug/3p4b322x/x86/android_gradle_build.json  3 + 2x +v +t/Users/hamzaaleghwairyeen/development/App/Intaleq/android/app/.cxx/Debug/3p4b322x/x86/android_gradle_build_mini.json  3 ˭2e +c +a/Users/hamzaaleghwairyeen/development/App/Intaleq/android/app/.cxx/Debug/3p4b322x/x86/build.ninja  3 2i +g +e/Users/hamzaaleghwairyeen/development/App/Intaleq/android/app/.cxx/Debug/3p4b322x/x86/build.ninja.txt  3n +l +j/Users/hamzaaleghwairyeen/development/App/Intaleq/android/app/.cxx/Debug/3p4b322x/x86/build_file_index.txt  3 Y ͭ2o +m +k/Users/hamzaaleghwairyeen/development/App/Intaleq/android/app/.cxx/Debug/3p4b322x/x86/compile_commands.json  3 2s +q +o/Users/hamzaaleghwairyeen/development/App/Intaleq/android/app/.cxx/Debug/3p4b322x/x86/compile_commands.json.bin  3  2y +w +u/Users/hamzaaleghwairyeen/development/App/Intaleq/android/app/.cxx/Debug/3p4b322x/x86/metadata_generation_command.txt  3 + ̭2l +j +h/Users/hamzaaleghwairyeen/development/App/Intaleq/android/app/.cxx/Debug/3p4b322x/x86/prefab_config.json  3  ( ̭2q +o +m/Users/hamzaaleghwairyeen/development/App/Intaleq/android/app/.cxx/Debug/3p4b322x/x86/symbol_folder_index.txt  3  d ͭ2] +[ +Y/Users/hamzaaleghwairyeen/development/App/Intaleq/android/app/src/main/cpp/CMakeLists.txt  3  ޮ2 \ No newline at end of file diff --git a/siro_rider/android/app/.cxx/Debug/3p4b322x/x86/metadata_generation_command.txt b/siro_rider/android/app/.cxx/Debug/3p4b322x/x86/metadata_generation_command.txt new file mode 100644 index 0000000..3a8abeb --- /dev/null +++ b/siro_rider/android/app/.cxx/Debug/3p4b322x/x86/metadata_generation_command.txt @@ -0,0 +1,18 @@ + -H/Users/hamzaaleghwairyeen/development/App/Intaleq/android/app/src/main/cpp +-DCMAKE_SYSTEM_NAME=Android +-DCMAKE_EXPORT_COMPILE_COMMANDS=ON +-DCMAKE_SYSTEM_VERSION=23 +-DANDROID_PLATFORM=android-23 +-DANDROID_ABI=x86 +-DCMAKE_ANDROID_ARCH_ABI=x86 +-DANDROID_NDK=/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973 +-DCMAKE_ANDROID_NDK=/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973 +-DCMAKE_TOOLCHAIN_FILE=/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/build/cmake/android.toolchain.cmake +-DCMAKE_MAKE_PROGRAM=/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/bin/ninja +-DCMAKE_LIBRARY_OUTPUT_DIRECTORY=/Users/hamzaaleghwairyeen/development/App/Intaleq/build/app/intermediates/cxx/Debug/3p4b322x/obj/x86 +-DCMAKE_RUNTIME_OUTPUT_DIRECTORY=/Users/hamzaaleghwairyeen/development/App/Intaleq/build/app/intermediates/cxx/Debug/3p4b322x/obj/x86 +-DCMAKE_BUILD_TYPE=Debug +-B/Users/hamzaaleghwairyeen/development/App/Intaleq/android/app/.cxx/Debug/3p4b322x/x86 +-GNinja + Build command args: [] + Version: 2 \ No newline at end of file diff --git a/siro_rider/android/app/.cxx/Debug/3p4b322x/x86/prefab_config.json b/siro_rider/android/app/.cxx/Debug/3p4b322x/x86/prefab_config.json new file mode 100644 index 0000000..e799de8 --- /dev/null +++ b/siro_rider/android/app/.cxx/Debug/3p4b322x/x86/prefab_config.json @@ -0,0 +1,4 @@ +{ + "enabled": false, + "packages": [] +} \ No newline at end of file diff --git a/siro_rider/android/app/.cxx/Debug/3p4b322x/x86/symbol_folder_index.txt b/siro_rider/android/app/.cxx/Debug/3p4b322x/x86/symbol_folder_index.txt new file mode 100644 index 0000000..ae833f8 --- /dev/null +++ b/siro_rider/android/app/.cxx/Debug/3p4b322x/x86/symbol_folder_index.txt @@ -0,0 +1 @@ +/Users/hamzaaleghwairyeen/development/App/Intaleq/build/app/intermediates/cxx/Debug/3p4b322x/obj/x86 \ No newline at end of file diff --git a/siro_rider/android/app/.cxx/Debug/3p4b322x/x86_64/.cmake/api/v1/query/client-agp/cache-v2 b/siro_rider/android/app/.cxx/Debug/3p4b322x/x86_64/.cmake/api/v1/query/client-agp/cache-v2 new file mode 100644 index 0000000..e69de29 diff --git a/siro_rider/android/app/.cxx/Debug/3p4b322x/x86_64/.cmake/api/v1/query/client-agp/cmakeFiles-v1 b/siro_rider/android/app/.cxx/Debug/3p4b322x/x86_64/.cmake/api/v1/query/client-agp/cmakeFiles-v1 new file mode 100644 index 0000000..e69de29 diff --git a/siro_rider/android/app/.cxx/Debug/3p4b322x/x86_64/.cmake/api/v1/query/client-agp/codemodel-v2 b/siro_rider/android/app/.cxx/Debug/3p4b322x/x86_64/.cmake/api/v1/query/client-agp/codemodel-v2 new file mode 100644 index 0000000..e69de29 diff --git a/siro_rider/android/app/.cxx/Debug/3p4b322x/x86_64/.cmake/api/v1/reply/cache-v2-86edb7da5139c6e94813.json b/siro_rider/android/app/.cxx/Debug/3p4b322x/x86_64/.cmake/api/v1/reply/cache-v2-86edb7da5139c6e94813.json new file mode 100644 index 0000000..052b479 --- /dev/null +++ b/siro_rider/android/app/.cxx/Debug/3p4b322x/x86_64/.cmake/api/v1/reply/cache-v2-86edb7da5139c6e94813.json @@ -0,0 +1,1479 @@ +{ + "entries" : + [ + { + "name" : "ANDROID_ABI", + "properties" : + [ + { + "name" : "HELPSTRING", + "value" : "No help, variable specified on the command line." + } + ], + "type" : "UNINITIALIZED", + "value" : "x86_64" + }, + { + "name" : "ANDROID_NDK", + "properties" : + [ + { + "name" : "HELPSTRING", + "value" : "No help, variable specified on the command line." + } + ], + "type" : "UNINITIALIZED", + "value" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973" + }, + { + "name" : "ANDROID_PLATFORM", + "properties" : + [ + { + "name" : "HELPSTRING", + "value" : "No help, variable specified on the command line." + } + ], + "type" : "UNINITIALIZED", + "value" : "android-23" + }, + { + "name" : "CMAKE_ADDR2LINE", + "properties" : + [ + { + "name" : "ADVANCED", + "value" : "1" + }, + { + "name" : "HELPSTRING", + "value" : "Path to a program." + } + ], + "type" : "FILEPATH", + "value" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/bin/llvm-addr2line" + }, + { + "name" : "CMAKE_ANDROID_ARCH_ABI", + "properties" : + [ + { + "name" : "HELPSTRING", + "value" : "No help, variable specified on the command line." + } + ], + "type" : "UNINITIALIZED", + "value" : "x86_64" + }, + { + "name" : "CMAKE_ANDROID_NDK", + "properties" : + [ + { + "name" : "HELPSTRING", + "value" : "No help, variable specified on the command line." + } + ], + "type" : "UNINITIALIZED", + "value" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973" + }, + { + "name" : "CMAKE_AR", + "properties" : + [ + { + "name" : "ADVANCED", + "value" : "1" + }, + { + "name" : "HELPSTRING", + "value" : "Archiver" + } + ], + "type" : "FILEPATH", + "value" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/bin/llvm-ar" + }, + { + "name" : "CMAKE_ASM_FLAGS", + "properties" : + [ + { + "name" : "HELPSTRING", + "value" : "Flags used by the compiler during all build types." + } + ], + "type" : "STRING", + "value" : "" + }, + { + "name" : "CMAKE_ASM_FLAGS_DEBUG", + "properties" : + [ + { + "name" : "HELPSTRING", + "value" : "Flags used by the compiler during debug builds." + } + ], + "type" : "STRING", + "value" : "" + }, + { + "name" : "CMAKE_ASM_FLAGS_RELEASE", + "properties" : + [ + { + "name" : "HELPSTRING", + "value" : "Flags used by the compiler during release builds." + } + ], + "type" : "STRING", + "value" : "" + }, + { + "name" : "CMAKE_BUILD_TYPE", + "properties" : + [ + { + "name" : "HELPSTRING", + "value" : "Choose the type of build, options are: None Debug Release RelWithDebInfo MinSizeRel ..." + } + ], + "type" : "STRING", + "value" : "Debug" + }, + { + "name" : "CMAKE_CACHEFILE_DIR", + "properties" : + [ + { + "name" : "HELPSTRING", + "value" : "This is the directory where this CMakeCache.txt was created" + } + ], + "type" : "INTERNAL", + "value" : "/Users/hamzaaleghwairyeen/development/App/Intaleq/android/app/.cxx/Debug/3p4b322x/x86_64" + }, + { + "name" : "CMAKE_CACHE_MAJOR_VERSION", + "properties" : + [ + { + "name" : "HELPSTRING", + "value" : "Major version of cmake used to create the current loaded cache" + } + ], + "type" : "INTERNAL", + "value" : "3" + }, + { + "name" : "CMAKE_CACHE_MINOR_VERSION", + "properties" : + [ + { + "name" : "HELPSTRING", + "value" : "Minor version of cmake used to create the current loaded cache" + } + ], + "type" : "INTERNAL", + "value" : "31" + }, + { + "name" : "CMAKE_CACHE_PATCH_VERSION", + "properties" : + [ + { + "name" : "HELPSTRING", + "value" : "Patch version of cmake used to create the current loaded cache" + } + ], + "type" : "INTERNAL", + "value" : "5" + }, + { + "name" : "CMAKE_COMMAND", + "properties" : + [ + { + "name" : "HELPSTRING", + "value" : "Path to CMake executable." + } + ], + "type" : "INTERNAL", + "value" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/bin/cmake" + }, + { + "name" : "CMAKE_CPACK_COMMAND", + "properties" : + [ + { + "name" : "HELPSTRING", + "value" : "Path to cpack program executable." + } + ], + "type" : "INTERNAL", + "value" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/bin/cpack" + }, + { + "name" : "CMAKE_CTEST_COMMAND", + "properties" : + [ + { + "name" : "HELPSTRING", + "value" : "Path to ctest program executable." + } + ], + "type" : "INTERNAL", + "value" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/bin/ctest" + }, + { + "name" : "CMAKE_CXX_COMPILER", + "properties" : + [ + { + "name" : "ADVANCED", + "value" : "1" + }, + { + "name" : "HELPSTRING", + "value" : "" + } + ], + "type" : "UNINITIALIZED", + "value" : "" + }, + { + "name" : "CMAKE_CXX_COMPILER_AR", + "properties" : + [ + { + "name" : "ADVANCED", + "value" : "1" + }, + { + "name" : "HELPSTRING", + "value" : "LLVM archiver" + } + ], + "type" : "FILEPATH", + "value" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/bin/llvm-ar" + }, + { + "name" : "CMAKE_CXX_COMPILER_CLANG_SCAN_DEPS", + "properties" : + [ + { + "name" : "ADVANCED", + "value" : "1" + }, + { + "name" : "HELPSTRING", + "value" : "`clang-scan-deps` dependency scanner" + } + ], + "type" : "FILEPATH", + "value" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/bin/clang-scan-deps" + }, + { + "name" : "CMAKE_CXX_COMPILER_RANLIB", + "properties" : + [ + { + "name" : "ADVANCED", + "value" : "1" + }, + { + "name" : "HELPSTRING", + "value" : "Generate index for LLVM archive" + } + ], + "type" : "FILEPATH", + "value" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/bin/llvm-ranlib" + }, + { + "name" : "CMAKE_CXX_FLAGS", + "properties" : + [ + { + "name" : "ADVANCED", + "value" : "1" + }, + { + "name" : "HELPSTRING", + "value" : "Flags used by the compiler during all build types." + } + ], + "type" : "STRING", + "value" : "" + }, + { + "name" : "CMAKE_CXX_FLAGS_DEBUG", + "properties" : + [ + { + "name" : "ADVANCED", + "value" : "1" + }, + { + "name" : "HELPSTRING", + "value" : "Flags used by the compiler during debug builds." + } + ], + "type" : "STRING", + "value" : "" + }, + { + "name" : "CMAKE_CXX_FLAGS_MINSIZEREL", + "properties" : + [ + { + "name" : "ADVANCED", + "value" : "1" + }, + { + "name" : "HELPSTRING", + "value" : "Flags used by the CXX compiler during MINSIZEREL builds." + } + ], + "type" : "STRING", + "value" : "-Os -DNDEBUG" + }, + { + "name" : "CMAKE_CXX_FLAGS_RELEASE", + "properties" : + [ + { + "name" : "ADVANCED", + "value" : "1" + }, + { + "name" : "HELPSTRING", + "value" : "Flags used by the compiler during release builds." + } + ], + "type" : "STRING", + "value" : "" + }, + { + "name" : "CMAKE_CXX_FLAGS_RELWITHDEBINFO", + "properties" : + [ + { + "name" : "ADVANCED", + "value" : "1" + }, + { + "name" : "HELPSTRING", + "value" : "Flags used by the CXX compiler during RELWITHDEBINFO builds." + } + ], + "type" : "STRING", + "value" : "-O2 -g -DNDEBUG" + }, + { + "name" : "CMAKE_CXX_STANDARD_LIBRARIES", + "properties" : + [ + { + "name" : "ADVANCED", + "value" : "1" + }, + { + "name" : "HELPSTRING", + "value" : "Libraries linked by default with all C++ applications." + } + ], + "type" : "STRING", + "value" : "-latomic -lm" + }, + { + "name" : "CMAKE_C_COMPILER", + "properties" : + [ + { + "name" : "ADVANCED", + "value" : "1" + }, + { + "name" : "HELPSTRING", + "value" : "" + } + ], + "type" : "UNINITIALIZED", + "value" : "" + }, + { + "name" : "CMAKE_C_COMPILER_AR", + "properties" : + [ + { + "name" : "ADVANCED", + "value" : "1" + }, + { + "name" : "HELPSTRING", + "value" : "LLVM archiver" + } + ], + "type" : "FILEPATH", + "value" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/bin/llvm-ar" + }, + { + "name" : "CMAKE_C_COMPILER_CLANG_SCAN_DEPS", + "properties" : + [ + { + "name" : "ADVANCED", + "value" : "1" + }, + { + "name" : "HELPSTRING", + "value" : "`clang-scan-deps` dependency scanner" + } + ], + "type" : "FILEPATH", + "value" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/bin/clang-scan-deps" + }, + { + "name" : "CMAKE_C_COMPILER_RANLIB", + "properties" : + [ + { + "name" : "ADVANCED", + "value" : "1" + }, + { + "name" : "HELPSTRING", + "value" : "Generate index for LLVM archive" + } + ], + "type" : "FILEPATH", + "value" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/bin/llvm-ranlib" + }, + { + "name" : "CMAKE_C_FLAGS", + "properties" : + [ + { + "name" : "ADVANCED", + "value" : "1" + }, + { + "name" : "HELPSTRING", + "value" : "Flags used by the compiler during all build types." + } + ], + "type" : "STRING", + "value" : "" + }, + { + "name" : "CMAKE_C_FLAGS_DEBUG", + "properties" : + [ + { + "name" : "ADVANCED", + "value" : "1" + }, + { + "name" : "HELPSTRING", + "value" : "Flags used by the compiler during debug builds." + } + ], + "type" : "STRING", + "value" : "" + }, + { + "name" : "CMAKE_C_FLAGS_MINSIZEREL", + "properties" : + [ + { + "name" : "ADVANCED", + "value" : "1" + }, + { + "name" : "HELPSTRING", + "value" : "Flags used by the C compiler during MINSIZEREL builds." + } + ], + "type" : "STRING", + "value" : "-Os -DNDEBUG" + }, + { + "name" : "CMAKE_C_FLAGS_RELEASE", + "properties" : + [ + { + "name" : "ADVANCED", + "value" : "1" + }, + { + "name" : "HELPSTRING", + "value" : "Flags used by the compiler during release builds." + } + ], + "type" : "STRING", + "value" : "" + }, + { + "name" : "CMAKE_C_FLAGS_RELWITHDEBINFO", + "properties" : + [ + { + "name" : "ADVANCED", + "value" : "1" + }, + { + "name" : "HELPSTRING", + "value" : "Flags used by the C compiler during RELWITHDEBINFO builds." + } + ], + "type" : "STRING", + "value" : "-O2 -g -DNDEBUG" + }, + { + "name" : "CMAKE_C_STANDARD_LIBRARIES", + "properties" : + [ + { + "name" : "ADVANCED", + "value" : "1" + }, + { + "name" : "HELPSTRING", + "value" : "Libraries linked by default with all C applications." + } + ], + "type" : "STRING", + "value" : "-latomic -lm" + }, + { + "name" : "CMAKE_DLLTOOL", + "properties" : + [ + { + "name" : "ADVANCED", + "value" : "1" + }, + { + "name" : "HELPSTRING", + "value" : "Path to a program." + } + ], + "type" : "FILEPATH", + "value" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/bin/llvm-dlltool" + }, + { + "name" : "CMAKE_EDIT_COMMAND", + "properties" : + [ + { + "name" : "HELPSTRING", + "value" : "Path to cache edit program executable." + } + ], + "type" : "INTERNAL", + "value" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/bin/ccmake" + }, + { + "name" : "CMAKE_EXECUTABLE_FORMAT", + "properties" : + [ + { + "name" : "HELPSTRING", + "value" : "Executable file format" + } + ], + "type" : "INTERNAL", + "value" : "ELF" + }, + { + "name" : "CMAKE_EXE_LINKER_FLAGS", + "properties" : + [ + { + "name" : "ADVANCED", + "value" : "1" + }, + { + "name" : "HELPSTRING", + "value" : "Flags used by the linker." + } + ], + "type" : "STRING", + "value" : "" + }, + { + "name" : "CMAKE_EXE_LINKER_FLAGS_DEBUG", + "properties" : + [ + { + "name" : "ADVANCED", + "value" : "1" + }, + { + "name" : "HELPSTRING", + "value" : "Flags used by the linker during DEBUG builds." + } + ], + "type" : "STRING", + "value" : "" + }, + { + "name" : "CMAKE_EXE_LINKER_FLAGS_MINSIZEREL", + "properties" : + [ + { + "name" : "ADVANCED", + "value" : "1" + }, + { + "name" : "HELPSTRING", + "value" : "Flags used by the linker during MINSIZEREL builds." + } + ], + "type" : "STRING", + "value" : "" + }, + { + "name" : "CMAKE_EXE_LINKER_FLAGS_RELEASE", + "properties" : + [ + { + "name" : "ADVANCED", + "value" : "1" + }, + { + "name" : "HELPSTRING", + "value" : "Flags used by the linker during RELEASE builds." + } + ], + "type" : "STRING", + "value" : "" + }, + { + "name" : "CMAKE_EXE_LINKER_FLAGS_RELWITHDEBINFO", + "properties" : + [ + { + "name" : "ADVANCED", + "value" : "1" + }, + { + "name" : "HELPSTRING", + "value" : "Flags used by the linker during RELWITHDEBINFO builds." + } + ], + "type" : "STRING", + "value" : "" + }, + { + "name" : "CMAKE_EXPORT_BUILD_DATABASE", + "properties" : + [ + { + "name" : "ADVANCED", + "value" : "1" + }, + { + "name" : "HELPSTRING", + "value" : "Enable/Disable output of build database during the build." + } + ], + "type" : "BOOL", + "value" : "" + }, + { + "name" : "CMAKE_EXPORT_COMPILE_COMMANDS", + "properties" : + [ + { + "name" : "HELPSTRING", + "value" : "No help, variable specified on the command line." + } + ], + "type" : "UNINITIALIZED", + "value" : "ON" + }, + { + "name" : "CMAKE_EXTRA_GENERATOR", + "properties" : + [ + { + "name" : "HELPSTRING", + "value" : "Name of external makefile project generator." + } + ], + "type" : "INTERNAL", + "value" : "" + }, + { + "name" : "CMAKE_FIND_PACKAGE_REDIRECTS_DIR", + "properties" : + [ + { + "name" : "HELPSTRING", + "value" : "Value Computed by CMake." + } + ], + "type" : "STATIC", + "value" : "/Users/hamzaaleghwairyeen/development/App/Intaleq/android/app/.cxx/Debug/3p4b322x/x86_64/CMakeFiles/pkgRedirects" + }, + { + "name" : "CMAKE_GENERATOR", + "properties" : + [ + { + "name" : "HELPSTRING", + "value" : "Name of generator." + } + ], + "type" : "INTERNAL", + "value" : "Ninja" + }, + { + "name" : "CMAKE_GENERATOR_INSTANCE", + "properties" : + [ + { + "name" : "HELPSTRING", + "value" : "Generator instance identifier." + } + ], + "type" : "INTERNAL", + "value" : "" + }, + { + "name" : "CMAKE_GENERATOR_PLATFORM", + "properties" : + [ + { + "name" : "HELPSTRING", + "value" : "Name of generator platform." + } + ], + "type" : "INTERNAL", + "value" : "" + }, + { + "name" : "CMAKE_GENERATOR_TOOLSET", + "properties" : + [ + { + "name" : "HELPSTRING", + "value" : "Name of generator toolset." + } + ], + "type" : "INTERNAL", + "value" : "" + }, + { + "name" : "CMAKE_HOME_DIRECTORY", + "properties" : + [ + { + "name" : "HELPSTRING", + "value" : "Source directory with the top level CMakeLists.txt file for this project" + } + ], + "type" : "INTERNAL", + "value" : "/Users/hamzaaleghwairyeen/development/App/Intaleq/android/app/src/main/cpp" + }, + { + "name" : "CMAKE_INSTALL_PREFIX", + "properties" : + [ + { + "name" : "HELPSTRING", + "value" : "Install path prefix, prepended onto install directories." + } + ], + "type" : "PATH", + "value" : "/usr/local" + }, + { + "name" : "CMAKE_INSTALL_SO_NO_EXE", + "properties" : + [ + { + "name" : "HELPSTRING", + "value" : "Install .so files without execute permission." + } + ], + "type" : "INTERNAL", + "value" : "0" + }, + { + "name" : "CMAKE_LIBRARY_OUTPUT_DIRECTORY", + "properties" : + [ + { + "name" : "HELPSTRING", + "value" : "No help, variable specified on the command line." + } + ], + "type" : "UNINITIALIZED", + "value" : "/Users/hamzaaleghwairyeen/development/App/Intaleq/build/app/intermediates/cxx/Debug/3p4b322x/obj/x86_64" + }, + { + "name" : "CMAKE_LINKER", + "properties" : + [ + { + "name" : "ADVANCED", + "value" : "1" + }, + { + "name" : "HELPSTRING", + "value" : "Path to a program." + } + ], + "type" : "FILEPATH", + "value" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/bin/ld.lld" + }, + { + "name" : "CMAKE_MAKE_PROGRAM", + "properties" : + [ + { + "name" : "HELPSTRING", + "value" : "No help, variable specified on the command line." + } + ], + "type" : "UNINITIALIZED", + "value" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/bin/ninja" + }, + { + "name" : "CMAKE_MODULE_LINKER_FLAGS", + "properties" : + [ + { + "name" : "ADVANCED", + "value" : "1" + }, + { + "name" : "HELPSTRING", + "value" : "Flags used by the linker during the creation of modules." + } + ], + "type" : "STRING", + "value" : "" + }, + { + "name" : "CMAKE_MODULE_LINKER_FLAGS_DEBUG", + "properties" : + [ + { + "name" : "ADVANCED", + "value" : "1" + }, + { + "name" : "HELPSTRING", + "value" : "Flags used by the linker during the creation of modules during DEBUG builds." + } + ], + "type" : "STRING", + "value" : "" + }, + { + "name" : "CMAKE_MODULE_LINKER_FLAGS_MINSIZEREL", + "properties" : + [ + { + "name" : "ADVANCED", + "value" : "1" + }, + { + "name" : "HELPSTRING", + "value" : "Flags used by the linker during the creation of modules during MINSIZEREL builds." + } + ], + "type" : "STRING", + "value" : "" + }, + { + "name" : "CMAKE_MODULE_LINKER_FLAGS_RELEASE", + "properties" : + [ + { + "name" : "ADVANCED", + "value" : "1" + }, + { + "name" : "HELPSTRING", + "value" : "Flags used by the linker during the creation of modules during RELEASE builds." + } + ], + "type" : "STRING", + "value" : "" + }, + { + "name" : "CMAKE_MODULE_LINKER_FLAGS_RELWITHDEBINFO", + "properties" : + [ + { + "name" : "ADVANCED", + "value" : "1" + }, + { + "name" : "HELPSTRING", + "value" : "Flags used by the linker during the creation of modules during RELWITHDEBINFO builds." + } + ], + "type" : "STRING", + "value" : "" + }, + { + "name" : "CMAKE_NM", + "properties" : + [ + { + "name" : "ADVANCED", + "value" : "1" + }, + { + "name" : "HELPSTRING", + "value" : "Path to a program." + } + ], + "type" : "FILEPATH", + "value" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/bin/llvm-nm" + }, + { + "name" : "CMAKE_NUMBER_OF_MAKEFILES", + "properties" : + [ + { + "name" : "HELPSTRING", + "value" : "number of local generators" + } + ], + "type" : "INTERNAL", + "value" : "1" + }, + { + "name" : "CMAKE_OBJCOPY", + "properties" : + [ + { + "name" : "ADVANCED", + "value" : "1" + }, + { + "name" : "HELPSTRING", + "value" : "Path to a program." + } + ], + "type" : "FILEPATH", + "value" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/bin/llvm-objcopy" + }, + { + "name" : "CMAKE_OBJDUMP", + "properties" : + [ + { + "name" : "ADVANCED", + "value" : "1" + }, + { + "name" : "HELPSTRING", + "value" : "Path to a program." + } + ], + "type" : "FILEPATH", + "value" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/bin/llvm-objdump" + }, + { + "name" : "CMAKE_PLATFORM_INFO_INITIALIZED", + "properties" : + [ + { + "name" : "HELPSTRING", + "value" : "Platform information initialized" + } + ], + "type" : "INTERNAL", + "value" : "1" + }, + { + "name" : "CMAKE_PROJECT_DESCRIPTION", + "properties" : + [ + { + "name" : "HELPSTRING", + "value" : "Value Computed by CMake" + } + ], + "type" : "STATIC", + "value" : "" + }, + { + "name" : "CMAKE_PROJECT_HOMEPAGE_URL", + "properties" : + [ + { + "name" : "HELPSTRING", + "value" : "Value Computed by CMake" + } + ], + "type" : "STATIC", + "value" : "" + }, + { + "name" : "CMAKE_PROJECT_NAME", + "properties" : + [ + { + "name" : "HELPSTRING", + "value" : "Value Computed by CMake" + } + ], + "type" : "STATIC", + "value" : "intaleq" + }, + { + "name" : "CMAKE_RANLIB", + "properties" : + [ + { + "name" : "ADVANCED", + "value" : "1" + }, + { + "name" : "HELPSTRING", + "value" : "Ranlib" + } + ], + "type" : "FILEPATH", + "value" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/bin/llvm-ranlib" + }, + { + "name" : "CMAKE_READELF", + "properties" : + [ + { + "name" : "ADVANCED", + "value" : "1" + }, + { + "name" : "HELPSTRING", + "value" : "Path to a program." + } + ], + "type" : "FILEPATH", + "value" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/bin/llvm-readelf" + }, + { + "name" : "CMAKE_ROOT", + "properties" : + [ + { + "name" : "HELPSTRING", + "value" : "Path to CMake installation." + } + ], + "type" : "INTERNAL", + "value" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31" + }, + { + "name" : "CMAKE_RUNTIME_OUTPUT_DIRECTORY", + "properties" : + [ + { + "name" : "HELPSTRING", + "value" : "No help, variable specified on the command line." + } + ], + "type" : "UNINITIALIZED", + "value" : "/Users/hamzaaleghwairyeen/development/App/Intaleq/build/app/intermediates/cxx/Debug/3p4b322x/obj/x86_64" + }, + { + "name" : "CMAKE_SHARED_LINKER_FLAGS", + "properties" : + [ + { + "name" : "ADVANCED", + "value" : "1" + }, + { + "name" : "HELPSTRING", + "value" : "Flags used by the linker during the creation of dll's." + } + ], + "type" : "STRING", + "value" : "" + }, + { + "name" : "CMAKE_SHARED_LINKER_FLAGS_DEBUG", + "properties" : + [ + { + "name" : "ADVANCED", + "value" : "1" + }, + { + "name" : "HELPSTRING", + "value" : "Flags used by the linker during the creation of shared libraries during DEBUG builds." + } + ], + "type" : "STRING", + "value" : "" + }, + { + "name" : "CMAKE_SHARED_LINKER_FLAGS_MINSIZEREL", + "properties" : + [ + { + "name" : "ADVANCED", + "value" : "1" + }, + { + "name" : "HELPSTRING", + "value" : "Flags used by the linker during the creation of shared libraries during MINSIZEREL builds." + } + ], + "type" : "STRING", + "value" : "" + }, + { + "name" : "CMAKE_SHARED_LINKER_FLAGS_RELEASE", + "properties" : + [ + { + "name" : "ADVANCED", + "value" : "1" + }, + { + "name" : "HELPSTRING", + "value" : "Flags used by the linker during the creation of shared libraries during RELEASE builds." + } + ], + "type" : "STRING", + "value" : "" + }, + { + "name" : "CMAKE_SHARED_LINKER_FLAGS_RELWITHDEBINFO", + "properties" : + [ + { + "name" : "ADVANCED", + "value" : "1" + }, + { + "name" : "HELPSTRING", + "value" : "Flags used by the linker during the creation of shared libraries during RELWITHDEBINFO builds." + } + ], + "type" : "STRING", + "value" : "" + }, + { + "name" : "CMAKE_SKIP_INSTALL_RPATH", + "properties" : + [ + { + "name" : "ADVANCED", + "value" : "1" + }, + { + "name" : "HELPSTRING", + "value" : "If set, runtime paths are not added when installing shared libraries, but are added when building." + } + ], + "type" : "BOOL", + "value" : "NO" + }, + { + "name" : "CMAKE_SKIP_RPATH", + "properties" : + [ + { + "name" : "ADVANCED", + "value" : "1" + }, + { + "name" : "HELPSTRING", + "value" : "If set, runtime paths are not added when using shared libraries." + } + ], + "type" : "BOOL", + "value" : "NO" + }, + { + "name" : "CMAKE_STATIC_LINKER_FLAGS", + "properties" : + [ + { + "name" : "ADVANCED", + "value" : "1" + }, + { + "name" : "HELPSTRING", + "value" : "Flags used by the linker during the creation of static libraries during all build types." + } + ], + "type" : "STRING", + "value" : "" + }, + { + "name" : "CMAKE_STATIC_LINKER_FLAGS_DEBUG", + "properties" : + [ + { + "name" : "ADVANCED", + "value" : "1" + }, + { + "name" : "HELPSTRING", + "value" : "Flags used by the linker during the creation of static libraries during DEBUG builds." + } + ], + "type" : "STRING", + "value" : "" + }, + { + "name" : "CMAKE_STATIC_LINKER_FLAGS_MINSIZEREL", + "properties" : + [ + { + "name" : "ADVANCED", + "value" : "1" + }, + { + "name" : "HELPSTRING", + "value" : "Flags used by the linker during the creation of static libraries during MINSIZEREL builds." + } + ], + "type" : "STRING", + "value" : "" + }, + { + "name" : "CMAKE_STATIC_LINKER_FLAGS_RELEASE", + "properties" : + [ + { + "name" : "ADVANCED", + "value" : "1" + }, + { + "name" : "HELPSTRING", + "value" : "Flags used by the linker during the creation of static libraries during RELEASE builds." + } + ], + "type" : "STRING", + "value" : "" + }, + { + "name" : "CMAKE_STATIC_LINKER_FLAGS_RELWITHDEBINFO", + "properties" : + [ + { + "name" : "ADVANCED", + "value" : "1" + }, + { + "name" : "HELPSTRING", + "value" : "Flags used by the linker during the creation of static libraries during RELWITHDEBINFO builds." + } + ], + "type" : "STRING", + "value" : "" + }, + { + "name" : "CMAKE_STRIP", + "properties" : + [ + { + "name" : "ADVANCED", + "value" : "1" + }, + { + "name" : "HELPSTRING", + "value" : "Strip" + } + ], + "type" : "FILEPATH", + "value" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/bin/llvm-strip" + }, + { + "name" : "CMAKE_SYSTEM_NAME", + "properties" : + [ + { + "name" : "HELPSTRING", + "value" : "No help, variable specified on the command line." + } + ], + "type" : "UNINITIALIZED", + "value" : "Android" + }, + { + "name" : "CMAKE_SYSTEM_VERSION", + "properties" : + [ + { + "name" : "HELPSTRING", + "value" : "No help, variable specified on the command line." + } + ], + "type" : "UNINITIALIZED", + "value" : "23" + }, + { + "name" : "CMAKE_TAPI", + "properties" : + [ + { + "name" : "ADVANCED", + "value" : "1" + }, + { + "name" : "HELPSTRING", + "value" : "Path to a program." + } + ], + "type" : "FILEPATH", + "value" : "CMAKE_TAPI-NOTFOUND" + }, + { + "name" : "CMAKE_TOOLCHAIN_FILE", + "properties" : + [ + { + "name" : "HELPSTRING", + "value" : "The CMake toolchain file" + } + ], + "type" : "FILEPATH", + "value" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/build/cmake/android.toolchain.cmake" + }, + { + "name" : "CMAKE_UNAME", + "properties" : + [ + { + "name" : "HELPSTRING", + "value" : "uname command" + } + ], + "type" : "INTERNAL", + "value" : "/usr/bin/uname" + }, + { + "name" : "CMAKE_VERBOSE_MAKEFILE", + "properties" : + [ + { + "name" : "ADVANCED", + "value" : "1" + }, + { + "name" : "HELPSTRING", + "value" : "If this value is on, makefiles will be generated without the .SILENT directive, and all commands will be echoed to the console during the make. This is useful for debugging only. With Visual Studio IDE projects all commands are done without /nologo." + } + ], + "type" : "BOOL", + "value" : "FALSE" + }, + { + "name" : "_CMAKE_CXX_LINKER_PUSHPOP_STATE_SUPPORTED", + "properties" : + [ + { + "name" : "HELPSTRING", + "value" : "linker supports push/pop state" + } + ], + "type" : "INTERNAL", + "value" : "TRUE" + }, + { + "name" : "_CMAKE_C_LINKER_PUSHPOP_STATE_SUPPORTED", + "properties" : + [ + { + "name" : "HELPSTRING", + "value" : "linker supports push/pop state" + } + ], + "type" : "INTERNAL", + "value" : "TRUE" + }, + { + "name" : "_CMAKE_LINKER_PUSHPOP_STATE_SUPPORTED", + "properties" : + [ + { + "name" : "HELPSTRING", + "value" : "linker supports push/pop state" + } + ], + "type" : "INTERNAL", + "value" : "TRUE" + }, + { + "name" : "intaleq_BINARY_DIR", + "properties" : + [ + { + "name" : "HELPSTRING", + "value" : "Value Computed by CMake" + } + ], + "type" : "STATIC", + "value" : "/Users/hamzaaleghwairyeen/development/App/Intaleq/android/app/.cxx/Debug/3p4b322x/x86_64" + }, + { + "name" : "intaleq_IS_TOP_LEVEL", + "properties" : + [ + { + "name" : "HELPSTRING", + "value" : "Value Computed by CMake" + } + ], + "type" : "STATIC", + "value" : "ON" + }, + { + "name" : "intaleq_SOURCE_DIR", + "properties" : + [ + { + "name" : "HELPSTRING", + "value" : "Value Computed by CMake" + } + ], + "type" : "STATIC", + "value" : "/Users/hamzaaleghwairyeen/development/App/Intaleq/android/app/src/main/cpp" + }, + { + "name" : "log-lib", + "properties" : + [ + { + "name" : "HELPSTRING", + "value" : "Path to a library." + } + ], + "type" : "FILEPATH", + "value" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/lib/x86_64-linux-android/23/liblog.so" + }, + { + "name" : "native-lib_LIB_DEPENDS", + "properties" : + [ + { + "name" : "HELPSTRING", + "value" : "Dependencies for the target" + } + ], + "type" : "STATIC", + "value" : "general;/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/lib/x86_64-linux-android/23/liblog.so;" + } + ], + "kind" : "cache", + "version" : + { + "major" : 2, + "minor" : 0 + } +} diff --git a/siro_rider/android/app/.cxx/Debug/3p4b322x/x86_64/.cmake/api/v1/reply/cmakeFiles-v1-ef5580e7a2680dcbf06e.json b/siro_rider/android/app/.cxx/Debug/3p4b322x/x86_64/.cmake/api/v1/reply/cmakeFiles-v1-ef5580e7a2680dcbf06e.json new file mode 100644 index 0000000..f2bbeae --- /dev/null +++ b/siro_rider/android/app/.cxx/Debug/3p4b322x/x86_64/.cmake/api/v1/reply/cmakeFiles-v1-ef5580e7a2680dcbf06e.json @@ -0,0 +1,968 @@ +{ + "inputs" : + [ + { + "path" : "CMakeLists.txt" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeDetermineSystem.cmake" + }, + { + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/build/cmake/android.toolchain.cmake" + }, + { + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/build/cmake/android-legacy.toolchain.cmake" + }, + { + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/build/cmake/abis.cmake" + }, + { + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/build/cmake/platforms.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Platform/Android-Determine.cmake" + }, + { + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/build/cmake/hooks/pre/Android-Determine.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeSystem.cmake.in" + }, + { + "isGenerated" : true, + "path" : "/Users/hamzaaleghwairyeen/development/App/Intaleq/android/app/.cxx/Debug/3p4b322x/x86_64/CMakeFiles/3.31.5-g6cf5163/CMakeSystem.cmake" + }, + { + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/build/cmake/android.toolchain.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeSystemSpecificInitialize.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Platform/Android-Initialize.cmake" + }, + { + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/build/cmake/hooks/pre/Android-Initialize.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Platform/Linux-Initialize.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeDetermineCCompiler.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeDetermineCompiler.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Platform/Android-Determine-C.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Platform/Android/Determine-Compiler.cmake" + }, + { + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/build/cmake/hooks/pre/Determine-Compiler.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeDetermineCompilerId.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeCompilerIdDetection.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/ADSP-DetermineCompiler.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/ARMCC-DetermineCompiler.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/ARMClang-DetermineCompiler.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/AppleClang-DetermineCompiler.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/Clang-DetermineCompilerInternal.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/Borland-DetermineCompiler.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/Bruce-C-DetermineCompiler.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/Clang-DetermineCompiler.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/Clang-DetermineCompilerInternal.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/Compaq-C-DetermineCompiler.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/Cray-DetermineCompiler.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/CrayClang-DetermineCompiler.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/Embarcadero-DetermineCompiler.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/Fujitsu-DetermineCompiler.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/FujitsuClang-DetermineCompiler.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/GHS-DetermineCompiler.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/GNU-C-DetermineCompiler.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/HP-C-DetermineCompiler.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/IAR-DetermineCompiler.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/IBMClang-C-DetermineCompiler.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/Intel-DetermineCompiler.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/IntelLLVM-DetermineCompiler.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/LCC-C-DetermineCompiler.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/MSVC-DetermineCompiler.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/NVHPC-DetermineCompiler.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/NVIDIA-DetermineCompiler.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/OpenWatcom-DetermineCompiler.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/OrangeC-DetermineCompiler.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/PGI-DetermineCompiler.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/PathScale-DetermineCompiler.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/SCO-DetermineCompiler.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/SDCC-C-DetermineCompiler.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/SunPro-C-DetermineCompiler.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/TI-DetermineCompiler.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/TIClang-DetermineCompiler.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/Tasking-DetermineCompiler.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/TinyCC-C-DetermineCompiler.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/VisualAge-C-DetermineCompiler.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/IBMCPP-C-DetermineVersionInternal.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/Watcom-DetermineCompiler.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/XL-C-DetermineCompiler.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/IBMCPP-C-DetermineVersionInternal.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/XLClang-C-DetermineCompiler.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/zOS-C-DetermineCompiler.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/IBMCPP-C-DetermineVersionInternal.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeFindBinUtils.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/Clang-FindBinUtils.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeCCompiler.cmake.in" + }, + { + "isGenerated" : true, + "path" : "/Users/hamzaaleghwairyeen/development/App/Intaleq/android/app/.cxx/Debug/3p4b322x/x86_64/CMakeFiles/3.31.5-g6cf5163/CMakeCCompiler.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeDetermineCXXCompiler.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeDetermineCompiler.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Platform/Android-Determine-CXX.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Platform/Android/Determine-Compiler.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeDetermineCompilerId.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeCompilerIdDetection.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/ADSP-DetermineCompiler.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/ARMCC-DetermineCompiler.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/ARMClang-DetermineCompiler.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/AppleClang-DetermineCompiler.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/Clang-DetermineCompilerInternal.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/Borland-DetermineCompiler.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/Clang-DetermineCompiler.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/Clang-DetermineCompilerInternal.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/Compaq-CXX-DetermineCompiler.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/Cray-DetermineCompiler.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/CrayClang-DetermineCompiler.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/Embarcadero-DetermineCompiler.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/Fujitsu-DetermineCompiler.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/FujitsuClang-DetermineCompiler.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/GHS-DetermineCompiler.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/GNU-CXX-DetermineCompiler.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/HP-CXX-DetermineCompiler.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/IAR-DetermineCompiler.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/IBMClang-CXX-DetermineCompiler.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/Intel-DetermineCompiler.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/IntelLLVM-DetermineCompiler.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/LCC-CXX-DetermineCompiler.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/MSVC-DetermineCompiler.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/NVHPC-DetermineCompiler.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/NVIDIA-DetermineCompiler.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/OpenWatcom-DetermineCompiler.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/OrangeC-DetermineCompiler.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/PGI-DetermineCompiler.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/PathScale-DetermineCompiler.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/SCO-DetermineCompiler.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/SunPro-CXX-DetermineCompiler.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/TI-DetermineCompiler.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/TIClang-DetermineCompiler.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/Tasking-DetermineCompiler.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/VisualAge-CXX-DetermineCompiler.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/IBMCPP-CXX-DetermineVersionInternal.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/Watcom-DetermineCompiler.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/XL-CXX-DetermineCompiler.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/IBMCPP-CXX-DetermineVersionInternal.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/XLClang-CXX-DetermineCompiler.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/zOS-CXX-DetermineCompiler.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/IBMCPP-CXX-DetermineVersionInternal.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeFindBinUtils.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/Clang-FindBinUtils.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeCXXCompiler.cmake.in" + }, + { + "isGenerated" : true, + "path" : "/Users/hamzaaleghwairyeen/development/App/Intaleq/android/app/.cxx/Debug/3p4b322x/x86_64/CMakeFiles/3.31.5-g6cf5163/CMakeCXXCompiler.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeSystemSpecificInformation.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeGenericSystem.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeInitializeConfigs.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Platform/Android.cmake" + }, + { + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/build/cmake/hooks/pre/Android.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Platform/Linux.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Platform/UnixPaths.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeCInformation.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeLanguageInformation.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/Clang-C.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/Clang.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/CMakeCommonCompilerMacros.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/GNU.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/CMakeCommonCompilerMacros.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Platform/Android-Clang-C.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Platform/Android-Clang.cmake" + }, + { + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/build/cmake/hooks/pre/Android-Clang.cmake" + }, + { + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/build/cmake/flags.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeCommonLanguageInclude.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeTestCCompiler.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeTestCompilerCommon.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeDetermineCompilerABI.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Internal/CMakeDetermineLinkerId.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeParseImplicitIncludeInfo.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeParseImplicitLinkInfo.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeParseLibraryArchitecture.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeTestCompilerCommon.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeCCompilerABI.c" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeDetermineCompilerSupport.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Internal/FeatureTesting.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeCCompiler.cmake.in" + }, + { + "isGenerated" : true, + "path" : "/Users/hamzaaleghwairyeen/development/App/Intaleq/android/app/.cxx/Debug/3p4b322x/x86_64/CMakeFiles/3.31.5-g6cf5163/CMakeCCompiler.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Internal/CMakeCLinkerInformation.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Internal/CMakeCommonLinkerInformation.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Linker/LLD-C.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Linker/LLD.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Linker/GNU.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Platform/Linker/Android-LLD-C.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Platform/Linker/Linux-LLD-C.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Platform/Linker/Linux-LLD.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Platform/Linker/Linux-GNU.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Platform/Linker/GNU.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeCXXInformation.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeLanguageInformation.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/Clang-CXX.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/Clang.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Platform/Android-Clang-CXX.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Platform/Android-Clang.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeCommonLanguageInclude.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeTestCXXCompiler.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeTestCompilerCommon.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeDetermineCompilerABI.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Internal/CMakeDetermineLinkerId.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeParseImplicitIncludeInfo.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeParseImplicitLinkInfo.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeParseLibraryArchitecture.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeTestCompilerCommon.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeCXXCompilerABI.cpp" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeDetermineCompilerSupport.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Internal/FeatureTesting.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/Clang-CXX-CXXImportStd.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/Clang-CXX-CXXImportStd.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeCXXCompiler.cmake.in" + }, + { + "isGenerated" : true, + "path" : "/Users/hamzaaleghwairyeen/development/App/Intaleq/android/app/.cxx/Debug/3p4b322x/x86_64/CMakeFiles/3.31.5-g6cf5163/CMakeCXXCompiler.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Internal/CMakeCXXLinkerInformation.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Internal/CMakeCommonLinkerInformation.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Linker/LLD-CXX.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Linker/LLD.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Platform/Linker/Android-LLD-CXX.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Platform/Linker/Linux-LLD-CXX.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Platform/Linker/Linux-LLD.cmake" + } + ], + "kind" : "cmakeFiles", + "paths" : + { + "build" : "/Users/hamzaaleghwairyeen/development/App/Intaleq/android/app/.cxx/Debug/3p4b322x/x86_64", + "source" : "/Users/hamzaaleghwairyeen/development/App/Intaleq/android/app/src/main/cpp" + }, + "version" : + { + "major" : 1, + "minor" : 1 + } +} diff --git a/siro_rider/android/app/.cxx/Debug/3p4b322x/x86_64/.cmake/api/v1/reply/codemodel-v2-a4bfdef084a4abc0750a.json b/siro_rider/android/app/.cxx/Debug/3p4b322x/x86_64/.cmake/api/v1/reply/codemodel-v2-a4bfdef084a4abc0750a.json new file mode 100644 index 0000000..6458ac8 --- /dev/null +++ b/siro_rider/android/app/.cxx/Debug/3p4b322x/x86_64/.cmake/api/v1/reply/codemodel-v2-a4bfdef084a4abc0750a.json @@ -0,0 +1,60 @@ +{ + "configurations" : + [ + { + "directories" : + [ + { + "build" : ".", + "jsonFile" : "directory-.-Debug-f5ebdc15457944623624.json", + "minimumCMakeVersion" : + { + "string" : "3.6.0" + }, + "projectIndex" : 0, + "source" : ".", + "targetIndexes" : + [ + 0 + ] + } + ], + "name" : "Debug", + "projects" : + [ + { + "directoryIndexes" : + [ + 0 + ], + "name" : "intaleq", + "targetIndexes" : + [ + 0 + ] + } + ], + "targets" : + [ + { + "directoryIndex" : 0, + "id" : "native-lib::@6890427a1f51a3e7e1df", + "jsonFile" : "target-native-lib-Debug-d7ee57911fde8f30f4c7.json", + "name" : "native-lib", + "projectIndex" : 0 + } + ] + } + ], + "kind" : "codemodel", + "paths" : + { + "build" : "/Users/hamzaaleghwairyeen/development/App/Intaleq/android/app/.cxx/Debug/3p4b322x/x86_64", + "source" : "/Users/hamzaaleghwairyeen/development/App/Intaleq/android/app/src/main/cpp" + }, + "version" : + { + "major" : 2, + "minor" : 7 + } +} diff --git a/siro_rider/android/app/.cxx/Debug/3p4b322x/x86_64/.cmake/api/v1/reply/directory-.-Debug-f5ebdc15457944623624.json b/siro_rider/android/app/.cxx/Debug/3p4b322x/x86_64/.cmake/api/v1/reply/directory-.-Debug-f5ebdc15457944623624.json new file mode 100644 index 0000000..3a67af9 --- /dev/null +++ b/siro_rider/android/app/.cxx/Debug/3p4b322x/x86_64/.cmake/api/v1/reply/directory-.-Debug-f5ebdc15457944623624.json @@ -0,0 +1,14 @@ +{ + "backtraceGraph" : + { + "commands" : [], + "files" : [], + "nodes" : [] + }, + "installers" : [], + "paths" : + { + "build" : ".", + "source" : "." + } +} diff --git a/siro_rider/android/app/.cxx/Debug/3p4b322x/x86_64/.cmake/api/v1/reply/index-2025-07-02T19-25-25-0289.json b/siro_rider/android/app/.cxx/Debug/3p4b322x/x86_64/.cmake/api/v1/reply/index-2025-07-02T19-25-25-0289.json new file mode 100644 index 0000000..6300342 --- /dev/null +++ b/siro_rider/android/app/.cxx/Debug/3p4b322x/x86_64/.cmake/api/v1/reply/index-2025-07-02T19-25-25-0289.json @@ -0,0 +1,92 @@ +{ + "cmake" : + { + "generator" : + { + "multiConfig" : false, + "name" : "Ninja" + }, + "paths" : + { + "cmake" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/bin/cmake", + "cpack" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/bin/cpack", + "ctest" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/bin/ctest", + "root" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31" + }, + "version" : + { + "isDirty" : false, + "major" : 3, + "minor" : 31, + "patch" : 5, + "string" : "3.31.5-g6cf5163", + "suffix" : "g6cf5163" + } + }, + "objects" : + [ + { + "jsonFile" : "codemodel-v2-a4bfdef084a4abc0750a.json", + "kind" : "codemodel", + "version" : + { + "major" : 2, + "minor" : 7 + } + }, + { + "jsonFile" : "cache-v2-86edb7da5139c6e94813.json", + "kind" : "cache", + "version" : + { + "major" : 2, + "minor" : 0 + } + }, + { + "jsonFile" : "cmakeFiles-v1-ef5580e7a2680dcbf06e.json", + "kind" : "cmakeFiles", + "version" : + { + "major" : 1, + "minor" : 1 + } + } + ], + "reply" : + { + "client-agp" : + { + "cache-v2" : + { + "jsonFile" : "cache-v2-86edb7da5139c6e94813.json", + "kind" : "cache", + "version" : + { + "major" : 2, + "minor" : 0 + } + }, + "cmakeFiles-v1" : + { + "jsonFile" : "cmakeFiles-v1-ef5580e7a2680dcbf06e.json", + "kind" : "cmakeFiles", + "version" : + { + "major" : 1, + "minor" : 1 + } + }, + "codemodel-v2" : + { + "jsonFile" : "codemodel-v2-a4bfdef084a4abc0750a.json", + "kind" : "codemodel", + "version" : + { + "major" : 2, + "minor" : 7 + } + } + } + } +} diff --git a/siro_rider/android/app/.cxx/Debug/3p4b322x/x86_64/.cmake/api/v1/reply/target-native-lib-Debug-d7ee57911fde8f30f4c7.json b/siro_rider/android/app/.cxx/Debug/3p4b322x/x86_64/.cmake/api/v1/reply/target-native-lib-Debug-d7ee57911fde8f30f4c7.json new file mode 100644 index 0000000..1ad616c --- /dev/null +++ b/siro_rider/android/app/.cxx/Debug/3p4b322x/x86_64/.cmake/api/v1/reply/target-native-lib-Debug-d7ee57911fde8f30f4c7.json @@ -0,0 +1,117 @@ +{ + "artifacts" : + [ + { + "path" : "/Users/hamzaaleghwairyeen/development/App/Intaleq/build/app/intermediates/cxx/Debug/3p4b322x/obj/x86_64/libnative-lib.so" + } + ], + "backtrace" : 1, + "backtraceGraph" : + { + "commands" : + [ + "add_library", + "target_link_libraries" + ], + "files" : + [ + "CMakeLists.txt" + ], + "nodes" : + [ + { + "file" : 0 + }, + { + "command" : 0, + "file" : 0, + "line" : 4, + "parent" : 0 + }, + { + "command" : 1, + "file" : 0, + "line" : 8, + "parent" : 0 + } + ] + }, + "compileGroups" : + [ + { + "compileCommandFragments" : + [ + { + "fragment" : "-g -DANDROID -fdata-sections -ffunction-sections -funwind-tables -fstack-protector-strong -no-canonical-prefixes -D_FORTIFY_SOURCE=2 -Wformat -Werror=format-security -fno-limit-debug-info -fPIC" + } + ], + "defines" : + [ + { + "define" : "native_lib_EXPORTS" + } + ], + "language" : "CXX", + "sourceIndexes" : + [ + 0 + ], + "sysroot" : + { + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot" + } + } + ], + "id" : "native-lib::@6890427a1f51a3e7e1df", + "link" : + { + "commandFragments" : + [ + { + "fragment" : "-static-libstdc++ -Wl,--build-id=sha1 -Wl,--no-rosegment -Wl,--no-undefined-version -Wl,--fatal-warnings -Wl,--no-undefined -Qunused-arguments", + "role" : "flags" + }, + { + "backtrace" : 2, + "fragment" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/lib/x86_64-linux-android/23/liblog.so", + "role" : "libraries" + }, + { + "fragment" : "-latomic -lm", + "role" : "libraries" + } + ], + "language" : "CXX", + "sysroot" : + { + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot" + } + }, + "name" : "native-lib", + "nameOnDisk" : "libnative-lib.so", + "paths" : + { + "build" : ".", + "source" : "." + }, + "sourceGroups" : + [ + { + "name" : "Source Files", + "sourceIndexes" : + [ + 0 + ] + } + ], + "sources" : + [ + { + "backtrace" : 1, + "compileGroupIndex" : 0, + "path" : "native-lib.cpp", + "sourceGroupIndex" : 0 + } + ], + "type" : "SHARED_LIBRARY" +} diff --git a/siro_rider/android/app/.cxx/Debug/3p4b322x/x86_64/.ninja_deps b/siro_rider/android/app/.cxx/Debug/3p4b322x/x86_64/.ninja_deps new file mode 100644 index 0000000..215f82b Binary files /dev/null and b/siro_rider/android/app/.cxx/Debug/3p4b322x/x86_64/.ninja_deps differ diff --git a/siro_rider/android/app/.cxx/Debug/3p4b322x/x86_64/.ninja_log b/siro_rider/android/app/.cxx/Debug/3p4b322x/x86_64/.ninja_log new file mode 100644 index 0000000..7cd65c2 --- /dev/null +++ b/siro_rider/android/app/.cxx/Debug/3p4b322x/x86_64/.ninja_log @@ -0,0 +1,7 @@ +# ninja log v5 +0 830 1751484326243236517 CMakeFiles/native-lib.dir/native-lib.cpp.o 80d82b6dade3fbbf +832 892 1751484326300497081 /Users/hamzaaleghwairyeen/development/App/Intaleq/build/app/intermediates/cxx/Debug/3p4b322x/obj/x86_64/libnative-lib.so 1827e4887a13825b +4 327 1751485309875662526 CMakeFiles/native-lib.dir/native-lib.cpp.o 80d82b6dade3fbbf +327 401 1751485309949525670 /Users/hamzaaleghwairyeen/development/App/Intaleq/build/app/intermediates/cxx/Debug/3p4b322x/obj/x86_64/libnative-lib.so 1827e4887a13825b +21 205 1751490331363979763 /Users/hamzaaleghwairyeen/development/App/Intaleq/build/app/intermediates/cxx/Debug/3p4b322x/obj/x86_64/libnative-lib.so 1827e4887a13825b +22 904 1752227575194183579 /Users/hamzaaleghwairyeen/development/App/Intaleq/build/app/intermediates/cxx/Debug/3p4b322x/obj/x86_64/libnative-lib.so 1827e4887a13825b diff --git a/siro_rider/android/app/.cxx/Debug/3p4b322x/x86_64/CMakeCache.txt b/siro_rider/android/app/.cxx/Debug/3p4b322x/x86_64/CMakeCache.txt new file mode 100644 index 0000000..5a9d7a5 --- /dev/null +++ b/siro_rider/android/app/.cxx/Debug/3p4b322x/x86_64/CMakeCache.txt @@ -0,0 +1,430 @@ +# This is the CMakeCache file. +# For build in directory: /Users/hamzaaleghwairyeen/development/App/Intaleq/android/app/.cxx/Debug/3p4b322x/x86_64 +# It was generated by CMake: /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/bin/cmake +# You can edit this file to change values found and used by cmake. +# If you do not want to change any of the values, simply exit the editor. +# If you do want to change a value, simply edit, save, and exit the editor. +# The syntax for the file is as follows: +# KEY:TYPE=VALUE +# KEY is the name of a variable in the cache. +# TYPE is a hint to GUIs for the type of VALUE, DO NOT EDIT TYPE!. +# VALUE is the current value for the KEY. + +######################## +# EXTERNAL cache entries +######################## + +//No help, variable specified on the command line. +ANDROID_ABI:UNINITIALIZED=x86_64 + +//No help, variable specified on the command line. +ANDROID_NDK:UNINITIALIZED=/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973 + +//No help, variable specified on the command line. +ANDROID_PLATFORM:UNINITIALIZED=android-23 + +//Path to a program. +CMAKE_ADDR2LINE:FILEPATH=/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/bin/llvm-addr2line + +//No help, variable specified on the command line. +CMAKE_ANDROID_ARCH_ABI:UNINITIALIZED=x86_64 + +//No help, variable specified on the command line. +CMAKE_ANDROID_NDK:UNINITIALIZED=/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973 + +//Archiver +CMAKE_AR:FILEPATH=/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/bin/llvm-ar + +//Flags used by the compiler during all build types. +CMAKE_ASM_FLAGS:STRING= + +//Flags used by the compiler during debug builds. +CMAKE_ASM_FLAGS_DEBUG:STRING= + +//Flags used by the compiler during release builds. +CMAKE_ASM_FLAGS_RELEASE:STRING= + +//Choose the type of build, options are: None Debug Release RelWithDebInfo +// MinSizeRel ... +CMAKE_BUILD_TYPE:STRING=Debug + +//LLVM archiver +CMAKE_CXX_COMPILER_AR:FILEPATH=/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/bin/llvm-ar + +//`clang-scan-deps` dependency scanner +CMAKE_CXX_COMPILER_CLANG_SCAN_DEPS:FILEPATH=/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/bin/clang-scan-deps + +//Generate index for LLVM archive +CMAKE_CXX_COMPILER_RANLIB:FILEPATH=/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/bin/llvm-ranlib + +//Flags used by the compiler during all build types. +CMAKE_CXX_FLAGS:STRING= + +//Flags used by the compiler during debug builds. +CMAKE_CXX_FLAGS_DEBUG:STRING= + +//Flags used by the CXX compiler during MINSIZEREL builds. +CMAKE_CXX_FLAGS_MINSIZEREL:STRING=-Os -DNDEBUG + +//Flags used by the compiler during release builds. +CMAKE_CXX_FLAGS_RELEASE:STRING= + +//Flags used by the CXX compiler during RELWITHDEBINFO builds. +CMAKE_CXX_FLAGS_RELWITHDEBINFO:STRING=-O2 -g -DNDEBUG + +//Libraries linked by default with all C++ applications. +CMAKE_CXX_STANDARD_LIBRARIES:STRING=-latomic -lm + +//LLVM archiver +CMAKE_C_COMPILER_AR:FILEPATH=/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/bin/llvm-ar + +//`clang-scan-deps` dependency scanner +CMAKE_C_COMPILER_CLANG_SCAN_DEPS:FILEPATH=/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/bin/clang-scan-deps + +//Generate index for LLVM archive +CMAKE_C_COMPILER_RANLIB:FILEPATH=/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/bin/llvm-ranlib + +//Flags used by the compiler during all build types. +CMAKE_C_FLAGS:STRING= + +//Flags used by the compiler during debug builds. +CMAKE_C_FLAGS_DEBUG:STRING= + +//Flags used by the C compiler during MINSIZEREL builds. +CMAKE_C_FLAGS_MINSIZEREL:STRING=-Os -DNDEBUG + +//Flags used by the compiler during release builds. +CMAKE_C_FLAGS_RELEASE:STRING= + +//Flags used by the C compiler during RELWITHDEBINFO builds. +CMAKE_C_FLAGS_RELWITHDEBINFO:STRING=-O2 -g -DNDEBUG + +//Libraries linked by default with all C applications. +CMAKE_C_STANDARD_LIBRARIES:STRING=-latomic -lm + +//Path to a program. +CMAKE_DLLTOOL:FILEPATH=/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/bin/llvm-dlltool + +//Flags used by the linker. +CMAKE_EXE_LINKER_FLAGS:STRING= + +//Flags used by the linker during DEBUG builds. +CMAKE_EXE_LINKER_FLAGS_DEBUG:STRING= + +//Flags used by the linker during MINSIZEREL builds. +CMAKE_EXE_LINKER_FLAGS_MINSIZEREL:STRING= + +//Flags used by the linker during RELEASE builds. +CMAKE_EXE_LINKER_FLAGS_RELEASE:STRING= + +//Flags used by the linker during RELWITHDEBINFO builds. +CMAKE_EXE_LINKER_FLAGS_RELWITHDEBINFO:STRING= + +//Enable/Disable output of build database during the build. +CMAKE_EXPORT_BUILD_DATABASE:BOOL= + +//No help, variable specified on the command line. +CMAKE_EXPORT_COMPILE_COMMANDS:UNINITIALIZED=ON + +//Value Computed by CMake. +CMAKE_FIND_PACKAGE_REDIRECTS_DIR:STATIC=/Users/hamzaaleghwairyeen/development/App/Intaleq/android/app/.cxx/Debug/3p4b322x/x86_64/CMakeFiles/pkgRedirects + +//Install path prefix, prepended onto install directories. +CMAKE_INSTALL_PREFIX:PATH=/usr/local + +//No help, variable specified on the command line. +CMAKE_LIBRARY_OUTPUT_DIRECTORY:UNINITIALIZED=/Users/hamzaaleghwairyeen/development/App/Intaleq/build/app/intermediates/cxx/Debug/3p4b322x/obj/x86_64 + +//Path to a program. +CMAKE_LINKER:FILEPATH=/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/bin/ld.lld + +//No help, variable specified on the command line. +CMAKE_MAKE_PROGRAM:UNINITIALIZED=/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/bin/ninja + +//Flags used by the linker during the creation of modules. +CMAKE_MODULE_LINKER_FLAGS:STRING= + +//Flags used by the linker during the creation of modules during +// DEBUG builds. +CMAKE_MODULE_LINKER_FLAGS_DEBUG:STRING= + +//Flags used by the linker during the creation of modules during +// MINSIZEREL builds. +CMAKE_MODULE_LINKER_FLAGS_MINSIZEREL:STRING= + +//Flags used by the linker during the creation of modules during +// RELEASE builds. +CMAKE_MODULE_LINKER_FLAGS_RELEASE:STRING= + +//Flags used by the linker during the creation of modules during +// RELWITHDEBINFO builds. +CMAKE_MODULE_LINKER_FLAGS_RELWITHDEBINFO:STRING= + +//Path to a program. +CMAKE_NM:FILEPATH=/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/bin/llvm-nm + +//Path to a program. +CMAKE_OBJCOPY:FILEPATH=/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/bin/llvm-objcopy + +//Path to a program. +CMAKE_OBJDUMP:FILEPATH=/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/bin/llvm-objdump + +//Value Computed by CMake +CMAKE_PROJECT_DESCRIPTION:STATIC= + +//Value Computed by CMake +CMAKE_PROJECT_HOMEPAGE_URL:STATIC= + +//Value Computed by CMake +CMAKE_PROJECT_NAME:STATIC=intaleq + +//Ranlib +CMAKE_RANLIB:FILEPATH=/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/bin/llvm-ranlib + +//Path to a program. +CMAKE_READELF:FILEPATH=/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/bin/llvm-readelf + +//No help, variable specified on the command line. +CMAKE_RUNTIME_OUTPUT_DIRECTORY:UNINITIALIZED=/Users/hamzaaleghwairyeen/development/App/Intaleq/build/app/intermediates/cxx/Debug/3p4b322x/obj/x86_64 + +//Flags used by the linker during the creation of dll's. +CMAKE_SHARED_LINKER_FLAGS:STRING= + +//Flags used by the linker during the creation of shared libraries +// during DEBUG builds. +CMAKE_SHARED_LINKER_FLAGS_DEBUG:STRING= + +//Flags used by the linker during the creation of shared libraries +// during MINSIZEREL builds. +CMAKE_SHARED_LINKER_FLAGS_MINSIZEREL:STRING= + +//Flags used by the linker during the creation of shared libraries +// during RELEASE builds. +CMAKE_SHARED_LINKER_FLAGS_RELEASE:STRING= + +//Flags used by the linker during the creation of shared libraries +// during RELWITHDEBINFO builds. +CMAKE_SHARED_LINKER_FLAGS_RELWITHDEBINFO:STRING= + +//If set, runtime paths are not added when installing shared libraries, +// but are added when building. +CMAKE_SKIP_INSTALL_RPATH:BOOL=NO + +//If set, runtime paths are not added when using shared libraries. +CMAKE_SKIP_RPATH:BOOL=NO + +//Flags used by the linker during the creation of static libraries +// during all build types. +CMAKE_STATIC_LINKER_FLAGS:STRING= + +//Flags used by the linker during the creation of static libraries +// during DEBUG builds. +CMAKE_STATIC_LINKER_FLAGS_DEBUG:STRING= + +//Flags used by the linker during the creation of static libraries +// during MINSIZEREL builds. +CMAKE_STATIC_LINKER_FLAGS_MINSIZEREL:STRING= + +//Flags used by the linker during the creation of static libraries +// during RELEASE builds. +CMAKE_STATIC_LINKER_FLAGS_RELEASE:STRING= + +//Flags used by the linker during the creation of static libraries +// during RELWITHDEBINFO builds. +CMAKE_STATIC_LINKER_FLAGS_RELWITHDEBINFO:STRING= + +//Strip +CMAKE_STRIP:FILEPATH=/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/bin/llvm-strip + +//No help, variable specified on the command line. +CMAKE_SYSTEM_NAME:UNINITIALIZED=Android + +//No help, variable specified on the command line. +CMAKE_SYSTEM_VERSION:UNINITIALIZED=23 + +//Path to a program. +CMAKE_TAPI:FILEPATH=CMAKE_TAPI-NOTFOUND + +//The CMake toolchain file +CMAKE_TOOLCHAIN_FILE:FILEPATH=/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/build/cmake/android.toolchain.cmake + +//If this value is on, makefiles will be generated without the +// .SILENT directive, and all commands will be echoed to the console +// during the make. This is useful for debugging only. With Visual +// Studio IDE projects all commands are done without /nologo. +CMAKE_VERBOSE_MAKEFILE:BOOL=FALSE + +//Value Computed by CMake +intaleq_BINARY_DIR:STATIC=/Users/hamzaaleghwairyeen/development/App/Intaleq/android/app/.cxx/Debug/3p4b322x/x86_64 + +//Value Computed by CMake +intaleq_IS_TOP_LEVEL:STATIC=ON + +//Value Computed by CMake +intaleq_SOURCE_DIR:STATIC=/Users/hamzaaleghwairyeen/development/App/Intaleq/android/app/src/main/cpp + +//Path to a library. +log-lib:FILEPATH=/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/lib/x86_64-linux-android/23/liblog.so + +//Dependencies for the target +native-lib_LIB_DEPENDS:STATIC=general;/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/lib/x86_64-linux-android/23/liblog.so; + + +######################## +# INTERNAL cache entries +######################## + +//ADVANCED property for variable: CMAKE_ADDR2LINE +CMAKE_ADDR2LINE-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_AR +CMAKE_AR-ADVANCED:INTERNAL=1 +//This is the directory where this CMakeCache.txt was created +CMAKE_CACHEFILE_DIR:INTERNAL=/Users/hamzaaleghwairyeen/development/App/Intaleq/android/app/.cxx/Debug/3p4b322x/x86_64 +//Major version of cmake used to create the current loaded cache +CMAKE_CACHE_MAJOR_VERSION:INTERNAL=3 +//Minor version of cmake used to create the current loaded cache +CMAKE_CACHE_MINOR_VERSION:INTERNAL=31 +//Patch version of cmake used to create the current loaded cache +CMAKE_CACHE_PATCH_VERSION:INTERNAL=5 +//Path to CMake executable. +CMAKE_COMMAND:INTERNAL=/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/bin/cmake +//Path to cpack program executable. +CMAKE_CPACK_COMMAND:INTERNAL=/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/bin/cpack +//Path to ctest program executable. +CMAKE_CTEST_COMMAND:INTERNAL=/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/bin/ctest +//ADVANCED property for variable: CMAKE_CXX_COMPILER_AR +CMAKE_CXX_COMPILER_AR-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_CXX_COMPILER_CLANG_SCAN_DEPS +CMAKE_CXX_COMPILER_CLANG_SCAN_DEPS-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_CXX_COMPILER_RANLIB +CMAKE_CXX_COMPILER_RANLIB-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_CXX_FLAGS +CMAKE_CXX_FLAGS-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_CXX_FLAGS_DEBUG +CMAKE_CXX_FLAGS_DEBUG-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_CXX_FLAGS_MINSIZEREL +CMAKE_CXX_FLAGS_MINSIZEREL-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_CXX_FLAGS_RELEASE +CMAKE_CXX_FLAGS_RELEASE-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_CXX_FLAGS_RELWITHDEBINFO +CMAKE_CXX_FLAGS_RELWITHDEBINFO-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_CXX_STANDARD_LIBRARIES +CMAKE_CXX_STANDARD_LIBRARIES-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_C_COMPILER_AR +CMAKE_C_COMPILER_AR-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_C_COMPILER_CLANG_SCAN_DEPS +CMAKE_C_COMPILER_CLANG_SCAN_DEPS-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_C_COMPILER_RANLIB +CMAKE_C_COMPILER_RANLIB-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_C_FLAGS +CMAKE_C_FLAGS-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_C_FLAGS_DEBUG +CMAKE_C_FLAGS_DEBUG-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_C_FLAGS_MINSIZEREL +CMAKE_C_FLAGS_MINSIZEREL-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_C_FLAGS_RELEASE +CMAKE_C_FLAGS_RELEASE-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_C_FLAGS_RELWITHDEBINFO +CMAKE_C_FLAGS_RELWITHDEBINFO-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_C_STANDARD_LIBRARIES +CMAKE_C_STANDARD_LIBRARIES-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_DLLTOOL +CMAKE_DLLTOOL-ADVANCED:INTERNAL=1 +//Path to cache edit program executable. +CMAKE_EDIT_COMMAND:INTERNAL=/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/bin/ccmake +//Executable file format +CMAKE_EXECUTABLE_FORMAT:INTERNAL=ELF +//ADVANCED property for variable: CMAKE_EXE_LINKER_FLAGS +CMAKE_EXE_LINKER_FLAGS-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_EXE_LINKER_FLAGS_DEBUG +CMAKE_EXE_LINKER_FLAGS_DEBUG-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_EXE_LINKER_FLAGS_MINSIZEREL +CMAKE_EXE_LINKER_FLAGS_MINSIZEREL-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_EXE_LINKER_FLAGS_RELEASE +CMAKE_EXE_LINKER_FLAGS_RELEASE-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_EXE_LINKER_FLAGS_RELWITHDEBINFO +CMAKE_EXE_LINKER_FLAGS_RELWITHDEBINFO-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_EXPORT_BUILD_DATABASE +CMAKE_EXPORT_BUILD_DATABASE-ADVANCED:INTERNAL=1 +//Name of external makefile project generator. +CMAKE_EXTRA_GENERATOR:INTERNAL= +//Name of generator. +CMAKE_GENERATOR:INTERNAL=Ninja +//Generator instance identifier. +CMAKE_GENERATOR_INSTANCE:INTERNAL= +//Name of generator platform. +CMAKE_GENERATOR_PLATFORM:INTERNAL= +//Name of generator toolset. +CMAKE_GENERATOR_TOOLSET:INTERNAL= +//Source directory with the top level CMakeLists.txt file for this +// project +CMAKE_HOME_DIRECTORY:INTERNAL=/Users/hamzaaleghwairyeen/development/App/Intaleq/android/app/src/main/cpp +//Install .so files without execute permission. +CMAKE_INSTALL_SO_NO_EXE:INTERNAL=0 +//ADVANCED property for variable: CMAKE_LINKER +CMAKE_LINKER-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_MODULE_LINKER_FLAGS +CMAKE_MODULE_LINKER_FLAGS-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_MODULE_LINKER_FLAGS_DEBUG +CMAKE_MODULE_LINKER_FLAGS_DEBUG-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_MODULE_LINKER_FLAGS_MINSIZEREL +CMAKE_MODULE_LINKER_FLAGS_MINSIZEREL-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_MODULE_LINKER_FLAGS_RELEASE +CMAKE_MODULE_LINKER_FLAGS_RELEASE-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_MODULE_LINKER_FLAGS_RELWITHDEBINFO +CMAKE_MODULE_LINKER_FLAGS_RELWITHDEBINFO-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_NM +CMAKE_NM-ADVANCED:INTERNAL=1 +//number of local generators +CMAKE_NUMBER_OF_MAKEFILES:INTERNAL=1 +//ADVANCED property for variable: CMAKE_OBJCOPY +CMAKE_OBJCOPY-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_OBJDUMP +CMAKE_OBJDUMP-ADVANCED:INTERNAL=1 +//Platform information initialized +CMAKE_PLATFORM_INFO_INITIALIZED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_RANLIB +CMAKE_RANLIB-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_READELF +CMAKE_READELF-ADVANCED:INTERNAL=1 +//Path to CMake installation. +CMAKE_ROOT:INTERNAL=/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31 +//ADVANCED property for variable: CMAKE_SHARED_LINKER_FLAGS +CMAKE_SHARED_LINKER_FLAGS-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_SHARED_LINKER_FLAGS_DEBUG +CMAKE_SHARED_LINKER_FLAGS_DEBUG-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_SHARED_LINKER_FLAGS_MINSIZEREL +CMAKE_SHARED_LINKER_FLAGS_MINSIZEREL-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_SHARED_LINKER_FLAGS_RELEASE +CMAKE_SHARED_LINKER_FLAGS_RELEASE-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_SHARED_LINKER_FLAGS_RELWITHDEBINFO +CMAKE_SHARED_LINKER_FLAGS_RELWITHDEBINFO-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_SKIP_INSTALL_RPATH +CMAKE_SKIP_INSTALL_RPATH-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_SKIP_RPATH +CMAKE_SKIP_RPATH-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_STATIC_LINKER_FLAGS +CMAKE_STATIC_LINKER_FLAGS-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_STATIC_LINKER_FLAGS_DEBUG +CMAKE_STATIC_LINKER_FLAGS_DEBUG-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_STATIC_LINKER_FLAGS_MINSIZEREL +CMAKE_STATIC_LINKER_FLAGS_MINSIZEREL-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_STATIC_LINKER_FLAGS_RELEASE +CMAKE_STATIC_LINKER_FLAGS_RELEASE-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_STATIC_LINKER_FLAGS_RELWITHDEBINFO +CMAKE_STATIC_LINKER_FLAGS_RELWITHDEBINFO-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_STRIP +CMAKE_STRIP-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_TAPI +CMAKE_TAPI-ADVANCED:INTERNAL=1 +//uname command +CMAKE_UNAME:INTERNAL=/usr/bin/uname +//ADVANCED property for variable: CMAKE_VERBOSE_MAKEFILE +CMAKE_VERBOSE_MAKEFILE-ADVANCED:INTERNAL=1 +//linker supports push/pop state +_CMAKE_CXX_LINKER_PUSHPOP_STATE_SUPPORTED:INTERNAL=TRUE +//linker supports push/pop state +_CMAKE_C_LINKER_PUSHPOP_STATE_SUPPORTED:INTERNAL=TRUE +//linker supports push/pop state +_CMAKE_LINKER_PUSHPOP_STATE_SUPPORTED:INTERNAL=TRUE + diff --git a/siro_rider/android/app/.cxx/Debug/3p4b322x/x86_64/CMakeFiles/3.31.5-g6cf5163/CMakeCCompiler.cmake b/siro_rider/android/app/.cxx/Debug/3p4b322x/x86_64/CMakeFiles/3.31.5-g6cf5163/CMakeCCompiler.cmake new file mode 100644 index 0000000..a598563 --- /dev/null +++ b/siro_rider/android/app/.cxx/Debug/3p4b322x/x86_64/CMakeFiles/3.31.5-g6cf5163/CMakeCCompiler.cmake @@ -0,0 +1,81 @@ +set(CMAKE_C_COMPILER "/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/bin/clang") +set(CMAKE_C_COMPILER_ARG1 "") +set(CMAKE_C_COMPILER_ID "Clang") +set(CMAKE_C_COMPILER_VERSION "18.0.1") +set(CMAKE_C_COMPILER_VERSION_INTERNAL "") +set(CMAKE_C_COMPILER_WRAPPER "") +set(CMAKE_C_STANDARD_COMPUTED_DEFAULT "17") +set(CMAKE_C_EXTENSIONS_COMPUTED_DEFAULT "ON") +set(CMAKE_C_STANDARD_LATEST "23") +set(CMAKE_C_COMPILE_FEATURES "c_std_90;c_function_prototypes;c_std_99;c_restrict;c_variadic_macros;c_std_11;c_static_assert;c_std_17;c_std_23") +set(CMAKE_C90_COMPILE_FEATURES "c_std_90;c_function_prototypes") +set(CMAKE_C99_COMPILE_FEATURES "c_std_99;c_restrict;c_variadic_macros") +set(CMAKE_C11_COMPILE_FEATURES "c_std_11;c_static_assert") +set(CMAKE_C17_COMPILE_FEATURES "c_std_17") +set(CMAKE_C23_COMPILE_FEATURES "c_std_23") + +set(CMAKE_C_PLATFORM_ID "Linux") +set(CMAKE_C_SIMULATE_ID "") +set(CMAKE_C_COMPILER_FRONTEND_VARIANT "GNU") +set(CMAKE_C_SIMULATE_VERSION "") + + + + +set(CMAKE_AR "/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/bin/llvm-ar") +set(CMAKE_C_COMPILER_AR "/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/bin/llvm-ar") +set(CMAKE_RANLIB "/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/bin/llvm-ranlib") +set(CMAKE_C_COMPILER_RANLIB "/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/bin/llvm-ranlib") +set(CMAKE_LINKER "/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/bin/ld.lld") +set(CMAKE_LINKER_LINK "") +set(CMAKE_LINKER_LLD "") +set(CMAKE_C_COMPILER_LINKER "/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/bin/ld.lld") +set(CMAKE_C_COMPILER_LINKER_ID "LLD") +set(CMAKE_C_COMPILER_LINKER_VERSION 18.0.1) +set(CMAKE_C_COMPILER_LINKER_FRONTEND_VARIANT GNU) +set(CMAKE_MT "") +set(CMAKE_TAPI "CMAKE_TAPI-NOTFOUND") +set(CMAKE_COMPILER_IS_GNUCC ) +set(CMAKE_C_COMPILER_LOADED 1) +set(CMAKE_C_COMPILER_WORKS TRUE) +set(CMAKE_C_ABI_COMPILED TRUE) + +set(CMAKE_C_COMPILER_ENV_VAR "CC") + +set(CMAKE_C_COMPILER_ID_RUN 1) +set(CMAKE_C_SOURCE_FILE_EXTENSIONS c;m) +set(CMAKE_C_IGNORE_EXTENSIONS h;H;o;O;obj;OBJ;def;DEF;rc;RC) +set(CMAKE_C_LINKER_PREFERENCE 10) +set(CMAKE_C_LINKER_DEPFILE_SUPPORTED ) + +# Save compiler ABI information. +set(CMAKE_C_SIZEOF_DATA_PTR "8") +set(CMAKE_C_COMPILER_ABI "ELF") +set(CMAKE_C_BYTE_ORDER "LITTLE_ENDIAN") +set(CMAKE_C_LIBRARY_ARCHITECTURE "x86_64-linux-android") + +if(CMAKE_C_SIZEOF_DATA_PTR) + set(CMAKE_SIZEOF_VOID_P "${CMAKE_C_SIZEOF_DATA_PTR}") +endif() + +if(CMAKE_C_COMPILER_ABI) + set(CMAKE_INTERNAL_PLATFORM_ABI "${CMAKE_C_COMPILER_ABI}") +endif() + +if(CMAKE_C_LIBRARY_ARCHITECTURE) + set(CMAKE_LIBRARY_ARCHITECTURE "x86_64-linux-android") +endif() + +set(CMAKE_C_CL_SHOWINCLUDES_PREFIX "") +if(CMAKE_C_CL_SHOWINCLUDES_PREFIX) + set(CMAKE_CL_SHOWINCLUDES_PREFIX "${CMAKE_C_CL_SHOWINCLUDES_PREFIX}") +endif() + + + + + +set(CMAKE_C_IMPLICIT_INCLUDE_DIRECTORIES "/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/lib/clang/18/include;/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/include/x86_64-linux-android;/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/include") +set(CMAKE_C_IMPLICIT_LINK_LIBRARIES "-l:libunwind.a;dl;c;-l:libunwind.a;dl") +set(CMAKE_C_IMPLICIT_LINK_DIRECTORIES "/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/lib/clang/18/lib/linux/x86_64;/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/lib/x86_64-linux-android/23;/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/lib/x86_64-linux-android;/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/lib") +set(CMAKE_C_IMPLICIT_LINK_FRAMEWORK_DIRECTORIES "") diff --git a/siro_rider/android/app/.cxx/Debug/3p4b322x/x86_64/CMakeFiles/3.31.5-g6cf5163/CMakeCXXCompiler.cmake b/siro_rider/android/app/.cxx/Debug/3p4b322x/x86_64/CMakeFiles/3.31.5-g6cf5163/CMakeCXXCompiler.cmake new file mode 100644 index 0000000..84c10ac --- /dev/null +++ b/siro_rider/android/app/.cxx/Debug/3p4b322x/x86_64/CMakeFiles/3.31.5-g6cf5163/CMakeCXXCompiler.cmake @@ -0,0 +1,105 @@ +set(CMAKE_CXX_COMPILER "/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/bin/clang++") +set(CMAKE_CXX_COMPILER_ARG1 "") +set(CMAKE_CXX_COMPILER_ID "Clang") +set(CMAKE_CXX_COMPILER_VERSION "18.0.1") +set(CMAKE_CXX_COMPILER_VERSION_INTERNAL "") +set(CMAKE_CXX_COMPILER_WRAPPER "") +set(CMAKE_CXX_STANDARD_COMPUTED_DEFAULT "17") +set(CMAKE_CXX_EXTENSIONS_COMPUTED_DEFAULT "ON") +set(CMAKE_CXX_STANDARD_LATEST "26") +set(CMAKE_CXX_COMPILE_FEATURES "cxx_std_98;cxx_template_template_parameters;cxx_std_11;cxx_alias_templates;cxx_alignas;cxx_alignof;cxx_attributes;cxx_auto_type;cxx_constexpr;cxx_decltype;cxx_decltype_incomplete_return_types;cxx_default_function_template_args;cxx_defaulted_functions;cxx_defaulted_move_initializers;cxx_delegating_constructors;cxx_deleted_functions;cxx_enum_forward_declarations;cxx_explicit_conversions;cxx_extended_friend_declarations;cxx_extern_templates;cxx_final;cxx_func_identifier;cxx_generalized_initializers;cxx_inheriting_constructors;cxx_inline_namespaces;cxx_lambdas;cxx_local_type_template_args;cxx_long_long_type;cxx_noexcept;cxx_nonstatic_member_init;cxx_nullptr;cxx_override;cxx_range_for;cxx_raw_string_literals;cxx_reference_qualified_functions;cxx_right_angle_brackets;cxx_rvalue_references;cxx_sizeof_member;cxx_static_assert;cxx_strong_enums;cxx_thread_local;cxx_trailing_return_types;cxx_unicode_literals;cxx_uniform_initialization;cxx_unrestricted_unions;cxx_user_literals;cxx_variadic_macros;cxx_variadic_templates;cxx_std_14;cxx_aggregate_default_initializers;cxx_attribute_deprecated;cxx_binary_literals;cxx_contextual_conversions;cxx_decltype_auto;cxx_digit_separators;cxx_generic_lambdas;cxx_lambda_init_captures;cxx_relaxed_constexpr;cxx_return_type_deduction;cxx_variable_templates;cxx_std_17;cxx_std_20;cxx_std_23;cxx_std_26") +set(CMAKE_CXX98_COMPILE_FEATURES "cxx_std_98;cxx_template_template_parameters") +set(CMAKE_CXX11_COMPILE_FEATURES "cxx_std_11;cxx_alias_templates;cxx_alignas;cxx_alignof;cxx_attributes;cxx_auto_type;cxx_constexpr;cxx_decltype;cxx_decltype_incomplete_return_types;cxx_default_function_template_args;cxx_defaulted_functions;cxx_defaulted_move_initializers;cxx_delegating_constructors;cxx_deleted_functions;cxx_enum_forward_declarations;cxx_explicit_conversions;cxx_extended_friend_declarations;cxx_extern_templates;cxx_final;cxx_func_identifier;cxx_generalized_initializers;cxx_inheriting_constructors;cxx_inline_namespaces;cxx_lambdas;cxx_local_type_template_args;cxx_long_long_type;cxx_noexcept;cxx_nonstatic_member_init;cxx_nullptr;cxx_override;cxx_range_for;cxx_raw_string_literals;cxx_reference_qualified_functions;cxx_right_angle_brackets;cxx_rvalue_references;cxx_sizeof_member;cxx_static_assert;cxx_strong_enums;cxx_thread_local;cxx_trailing_return_types;cxx_unicode_literals;cxx_uniform_initialization;cxx_unrestricted_unions;cxx_user_literals;cxx_variadic_macros;cxx_variadic_templates") +set(CMAKE_CXX14_COMPILE_FEATURES "cxx_std_14;cxx_aggregate_default_initializers;cxx_attribute_deprecated;cxx_binary_literals;cxx_contextual_conversions;cxx_decltype_auto;cxx_digit_separators;cxx_generic_lambdas;cxx_lambda_init_captures;cxx_relaxed_constexpr;cxx_return_type_deduction;cxx_variable_templates") +set(CMAKE_CXX17_COMPILE_FEATURES "cxx_std_17") +set(CMAKE_CXX20_COMPILE_FEATURES "cxx_std_20") +set(CMAKE_CXX23_COMPILE_FEATURES "cxx_std_23") +set(CMAKE_CXX26_COMPILE_FEATURES "cxx_std_26") + +set(CMAKE_CXX_PLATFORM_ID "Linux") +set(CMAKE_CXX_SIMULATE_ID "") +set(CMAKE_CXX_COMPILER_FRONTEND_VARIANT "GNU") +set(CMAKE_CXX_SIMULATE_VERSION "") + + + + +set(CMAKE_AR "/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/bin/llvm-ar") +set(CMAKE_CXX_COMPILER_AR "/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/bin/llvm-ar") +set(CMAKE_RANLIB "/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/bin/llvm-ranlib") +set(CMAKE_CXX_COMPILER_RANLIB "/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/bin/llvm-ranlib") +set(CMAKE_LINKER "/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/bin/ld.lld") +set(CMAKE_LINKER_LINK "") +set(CMAKE_LINKER_LLD "") +set(CMAKE_CXX_COMPILER_LINKER "/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/bin/ld.lld") +set(CMAKE_CXX_COMPILER_LINKER_ID "LLD") +set(CMAKE_CXX_COMPILER_LINKER_VERSION 18.0.1) +set(CMAKE_CXX_COMPILER_LINKER_FRONTEND_VARIANT GNU) +set(CMAKE_MT "") +set(CMAKE_TAPI "CMAKE_TAPI-NOTFOUND") +set(CMAKE_COMPILER_IS_GNUCXX ) +set(CMAKE_CXX_COMPILER_LOADED 1) +set(CMAKE_CXX_COMPILER_WORKS TRUE) +set(CMAKE_CXX_ABI_COMPILED TRUE) + +set(CMAKE_CXX_COMPILER_ENV_VAR "CXX") + +set(CMAKE_CXX_COMPILER_ID_RUN 1) +set(CMAKE_CXX_SOURCE_FILE_EXTENSIONS C;M;c++;cc;cpp;cxx;m;mm;mpp;CPP;ixx;cppm;ccm;cxxm;c++m) +set(CMAKE_CXX_IGNORE_EXTENSIONS inl;h;hpp;HPP;H;o;O;obj;OBJ;def;DEF;rc;RC) + +foreach (lang IN ITEMS C OBJC OBJCXX) + if (CMAKE_${lang}_COMPILER_ID_RUN) + foreach(extension IN LISTS CMAKE_${lang}_SOURCE_FILE_EXTENSIONS) + list(REMOVE_ITEM CMAKE_CXX_SOURCE_FILE_EXTENSIONS ${extension}) + endforeach() + endif() +endforeach() + +set(CMAKE_CXX_LINKER_PREFERENCE 30) +set(CMAKE_CXX_LINKER_PREFERENCE_PROPAGATES 1) +set(CMAKE_CXX_LINKER_DEPFILE_SUPPORTED ) + +# Save compiler ABI information. +set(CMAKE_CXX_SIZEOF_DATA_PTR "8") +set(CMAKE_CXX_COMPILER_ABI "ELF") +set(CMAKE_CXX_BYTE_ORDER "LITTLE_ENDIAN") +set(CMAKE_CXX_LIBRARY_ARCHITECTURE "x86_64-linux-android") + +if(CMAKE_CXX_SIZEOF_DATA_PTR) + set(CMAKE_SIZEOF_VOID_P "${CMAKE_CXX_SIZEOF_DATA_PTR}") +endif() + +if(CMAKE_CXX_COMPILER_ABI) + set(CMAKE_INTERNAL_PLATFORM_ABI "${CMAKE_CXX_COMPILER_ABI}") +endif() + +if(CMAKE_CXX_LIBRARY_ARCHITECTURE) + set(CMAKE_LIBRARY_ARCHITECTURE "x86_64-linux-android") +endif() + +set(CMAKE_CXX_CL_SHOWINCLUDES_PREFIX "") +if(CMAKE_CXX_CL_SHOWINCLUDES_PREFIX) + set(CMAKE_CL_SHOWINCLUDES_PREFIX "${CMAKE_CXX_CL_SHOWINCLUDES_PREFIX}") +endif() + + + + + +set(CMAKE_CXX_IMPLICIT_INCLUDE_DIRECTORIES "/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/include/c++/v1;/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/lib/clang/18/include;/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/include/x86_64-linux-android;/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/include") +set(CMAKE_CXX_IMPLICIT_LINK_LIBRARIES "c++;m;-l:libunwind.a;dl;c;-l:libunwind.a;dl") +set(CMAKE_CXX_IMPLICIT_LINK_DIRECTORIES "/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/lib/clang/18/lib/linux/x86_64;/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/lib/x86_64-linux-android/23;/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/lib/x86_64-linux-android;/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/lib") +set(CMAKE_CXX_IMPLICIT_LINK_FRAMEWORK_DIRECTORIES "") +set(CMAKE_CXX_COMPILER_CLANG_RESOURCE_DIR "/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/lib/clang/18") + +set(CMAKE_CXX_COMPILER_IMPORT_STD "") +### Imported target for C++23 standard library +set(CMAKE_CXX23_COMPILER_IMPORT_STD_NOT_FOUND_MESSAGE "Experimental `import std` support not enabled when detecting toolchain; it must be set before `CXX` is enabled (usually a `project()` call)") + + +### Imported target for C++26 standard library +set(CMAKE_CXX26_COMPILER_IMPORT_STD_NOT_FOUND_MESSAGE "Experimental `import std` support not enabled when detecting toolchain; it must be set before `CXX` is enabled (usually a `project()` call)") + + + diff --git a/siro_rider/android/app/.cxx/Debug/3p4b322x/x86_64/CMakeFiles/3.31.5-g6cf5163/CMakeDetermineCompilerABI_C.bin b/siro_rider/android/app/.cxx/Debug/3p4b322x/x86_64/CMakeFiles/3.31.5-g6cf5163/CMakeDetermineCompilerABI_C.bin new file mode 100755 index 0000000..eaded65 Binary files /dev/null and b/siro_rider/android/app/.cxx/Debug/3p4b322x/x86_64/CMakeFiles/3.31.5-g6cf5163/CMakeDetermineCompilerABI_C.bin differ diff --git a/siro_rider/android/app/.cxx/Debug/3p4b322x/x86_64/CMakeFiles/3.31.5-g6cf5163/CMakeDetermineCompilerABI_CXX.bin b/siro_rider/android/app/.cxx/Debug/3p4b322x/x86_64/CMakeFiles/3.31.5-g6cf5163/CMakeDetermineCompilerABI_CXX.bin new file mode 100755 index 0000000..7def2ec Binary files /dev/null and b/siro_rider/android/app/.cxx/Debug/3p4b322x/x86_64/CMakeFiles/3.31.5-g6cf5163/CMakeDetermineCompilerABI_CXX.bin differ diff --git a/siro_rider/android/app/.cxx/Debug/3p4b322x/x86_64/CMakeFiles/3.31.5-g6cf5163/CMakeSystem.cmake b/siro_rider/android/app/.cxx/Debug/3p4b322x/x86_64/CMakeFiles/3.31.5-g6cf5163/CMakeSystem.cmake new file mode 100644 index 0000000..1f3c05c --- /dev/null +++ b/siro_rider/android/app/.cxx/Debug/3p4b322x/x86_64/CMakeFiles/3.31.5-g6cf5163/CMakeSystem.cmake @@ -0,0 +1,15 @@ +set(CMAKE_HOST_SYSTEM "Darwin-24.5.0") +set(CMAKE_HOST_SYSTEM_NAME "Darwin") +set(CMAKE_HOST_SYSTEM_VERSION "24.5.0") +set(CMAKE_HOST_SYSTEM_PROCESSOR "arm64") + +include("/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/build/cmake/android.toolchain.cmake") + +set(CMAKE_SYSTEM "Android-1") +set(CMAKE_SYSTEM_NAME "Android") +set(CMAKE_SYSTEM_VERSION "1") +set(CMAKE_SYSTEM_PROCESSOR "x86_64") + +set(CMAKE_CROSSCOMPILING "TRUE") + +set(CMAKE_SYSTEM_LOADED 1) diff --git a/siro_rider/android/app/.cxx/Debug/3p4b322x/x86_64/CMakeFiles/3.31.5-g6cf5163/CompilerIdC/CMakeCCompilerId.c b/siro_rider/android/app/.cxx/Debug/3p4b322x/x86_64/CMakeFiles/3.31.5-g6cf5163/CompilerIdC/CMakeCCompilerId.c new file mode 100644 index 0000000..8d8bb03 --- /dev/null +++ b/siro_rider/android/app/.cxx/Debug/3p4b322x/x86_64/CMakeFiles/3.31.5-g6cf5163/CompilerIdC/CMakeCCompilerId.c @@ -0,0 +1,904 @@ +#ifdef __cplusplus +# error "A C++ compiler has been selected for C." +#endif + +#if defined(__18CXX) +# define ID_VOID_MAIN +#endif +#if defined(__CLASSIC_C__) +/* cv-qualifiers did not exist in K&R C */ +# define const +# define volatile +#endif + +#if !defined(__has_include) +/* If the compiler does not have __has_include, pretend the answer is + always no. */ +# define __has_include(x) 0 +#endif + + +/* Version number components: V=Version, R=Revision, P=Patch + Version date components: YYYY=Year, MM=Month, DD=Day */ + +#if defined(__INTEL_COMPILER) || defined(__ICC) +# define COMPILER_ID "Intel" +# if defined(_MSC_VER) +# define SIMULATE_ID "MSVC" +# endif +# if defined(__GNUC__) +# define SIMULATE_ID "GNU" +# endif + /* __INTEL_COMPILER = VRP prior to 2021, and then VVVV for 2021 and later, + except that a few beta releases use the old format with V=2021. */ +# if __INTEL_COMPILER < 2021 || __INTEL_COMPILER == 202110 || __INTEL_COMPILER == 202111 +# define COMPILER_VERSION_MAJOR DEC(__INTEL_COMPILER/100) +# define COMPILER_VERSION_MINOR DEC(__INTEL_COMPILER/10 % 10) +# if defined(__INTEL_COMPILER_UPDATE) +# define COMPILER_VERSION_PATCH DEC(__INTEL_COMPILER_UPDATE) +# else +# define COMPILER_VERSION_PATCH DEC(__INTEL_COMPILER % 10) +# endif +# else +# define COMPILER_VERSION_MAJOR DEC(__INTEL_COMPILER) +# define COMPILER_VERSION_MINOR DEC(__INTEL_COMPILER_UPDATE) + /* The third version component from --version is an update index, + but no macro is provided for it. */ +# define COMPILER_VERSION_PATCH DEC(0) +# endif +# if defined(__INTEL_COMPILER_BUILD_DATE) + /* __INTEL_COMPILER_BUILD_DATE = YYYYMMDD */ +# define COMPILER_VERSION_TWEAK DEC(__INTEL_COMPILER_BUILD_DATE) +# endif +# if defined(_MSC_VER) + /* _MSC_VER = VVRR */ +# define SIMULATE_VERSION_MAJOR DEC(_MSC_VER / 100) +# define SIMULATE_VERSION_MINOR DEC(_MSC_VER % 100) +# endif +# if defined(__GNUC__) +# define SIMULATE_VERSION_MAJOR DEC(__GNUC__) +# elif defined(__GNUG__) +# define SIMULATE_VERSION_MAJOR DEC(__GNUG__) +# endif +# if defined(__GNUC_MINOR__) +# define SIMULATE_VERSION_MINOR DEC(__GNUC_MINOR__) +# endif +# if defined(__GNUC_PATCHLEVEL__) +# define SIMULATE_VERSION_PATCH DEC(__GNUC_PATCHLEVEL__) +# endif + +#elif (defined(__clang__) && defined(__INTEL_CLANG_COMPILER)) || defined(__INTEL_LLVM_COMPILER) +# define COMPILER_ID "IntelLLVM" +#if defined(_MSC_VER) +# define SIMULATE_ID "MSVC" +#endif +#if defined(__GNUC__) +# define SIMULATE_ID "GNU" +#endif +/* __INTEL_LLVM_COMPILER = VVVVRP prior to 2021.2.0, VVVVRRPP for 2021.2.0 and + * later. Look for 6 digit vs. 8 digit version number to decide encoding. + * VVVV is no smaller than the current year when a version is released. + */ +#if __INTEL_LLVM_COMPILER < 1000000L +# define COMPILER_VERSION_MAJOR DEC(__INTEL_LLVM_COMPILER/100) +# define COMPILER_VERSION_MINOR DEC(__INTEL_LLVM_COMPILER/10 % 10) +# define COMPILER_VERSION_PATCH DEC(__INTEL_LLVM_COMPILER % 10) +#else +# define COMPILER_VERSION_MAJOR DEC(__INTEL_LLVM_COMPILER/10000) +# define COMPILER_VERSION_MINOR DEC(__INTEL_LLVM_COMPILER/100 % 100) +# define COMPILER_VERSION_PATCH DEC(__INTEL_LLVM_COMPILER % 100) +#endif +#if defined(_MSC_VER) + /* _MSC_VER = VVRR */ +# define SIMULATE_VERSION_MAJOR DEC(_MSC_VER / 100) +# define SIMULATE_VERSION_MINOR DEC(_MSC_VER % 100) +#endif +#if defined(__GNUC__) +# define SIMULATE_VERSION_MAJOR DEC(__GNUC__) +#elif defined(__GNUG__) +# define SIMULATE_VERSION_MAJOR DEC(__GNUG__) +#endif +#if defined(__GNUC_MINOR__) +# define SIMULATE_VERSION_MINOR DEC(__GNUC_MINOR__) +#endif +#if defined(__GNUC_PATCHLEVEL__) +# define SIMULATE_VERSION_PATCH DEC(__GNUC_PATCHLEVEL__) +#endif + +#elif defined(__PATHCC__) +# define COMPILER_ID "PathScale" +# define COMPILER_VERSION_MAJOR DEC(__PATHCC__) +# define COMPILER_VERSION_MINOR DEC(__PATHCC_MINOR__) +# if defined(__PATHCC_PATCHLEVEL__) +# define COMPILER_VERSION_PATCH DEC(__PATHCC_PATCHLEVEL__) +# endif + +#elif defined(__BORLANDC__) && defined(__CODEGEARC_VERSION__) +# define COMPILER_ID "Embarcadero" +# define COMPILER_VERSION_MAJOR HEX(__CODEGEARC_VERSION__>>24 & 0x00FF) +# define COMPILER_VERSION_MINOR HEX(__CODEGEARC_VERSION__>>16 & 0x00FF) +# define COMPILER_VERSION_PATCH DEC(__CODEGEARC_VERSION__ & 0xFFFF) + +#elif defined(__BORLANDC__) +# define COMPILER_ID "Borland" + /* __BORLANDC__ = 0xVRR */ +# define COMPILER_VERSION_MAJOR HEX(__BORLANDC__>>8) +# define COMPILER_VERSION_MINOR HEX(__BORLANDC__ & 0xFF) + +#elif defined(__WATCOMC__) && __WATCOMC__ < 1200 +# define COMPILER_ID "Watcom" + /* __WATCOMC__ = VVRR */ +# define COMPILER_VERSION_MAJOR DEC(__WATCOMC__ / 100) +# define COMPILER_VERSION_MINOR DEC((__WATCOMC__ / 10) % 10) +# if (__WATCOMC__ % 10) > 0 +# define COMPILER_VERSION_PATCH DEC(__WATCOMC__ % 10) +# endif + +#elif defined(__WATCOMC__) +# define COMPILER_ID "OpenWatcom" + /* __WATCOMC__ = VVRP + 1100 */ +# define COMPILER_VERSION_MAJOR DEC((__WATCOMC__ - 1100) / 100) +# define COMPILER_VERSION_MINOR DEC((__WATCOMC__ / 10) % 10) +# if (__WATCOMC__ % 10) > 0 +# define COMPILER_VERSION_PATCH DEC(__WATCOMC__ % 10) +# endif + +#elif defined(__SUNPRO_C) +# define COMPILER_ID "SunPro" +# if __SUNPRO_C >= 0x5100 + /* __SUNPRO_C = 0xVRRP */ +# define COMPILER_VERSION_MAJOR HEX(__SUNPRO_C>>12) +# define COMPILER_VERSION_MINOR HEX(__SUNPRO_C>>4 & 0xFF) +# define COMPILER_VERSION_PATCH HEX(__SUNPRO_C & 0xF) +# else + /* __SUNPRO_CC = 0xVRP */ +# define COMPILER_VERSION_MAJOR HEX(__SUNPRO_C>>8) +# define COMPILER_VERSION_MINOR HEX(__SUNPRO_C>>4 & 0xF) +# define COMPILER_VERSION_PATCH HEX(__SUNPRO_C & 0xF) +# endif + +#elif defined(__HP_cc) +# define COMPILER_ID "HP" + /* __HP_cc = VVRRPP */ +# define COMPILER_VERSION_MAJOR DEC(__HP_cc/10000) +# define COMPILER_VERSION_MINOR DEC(__HP_cc/100 % 100) +# define COMPILER_VERSION_PATCH DEC(__HP_cc % 100) + +#elif defined(__DECC) +# define COMPILER_ID "Compaq" + /* __DECC_VER = VVRRTPPPP */ +# define COMPILER_VERSION_MAJOR DEC(__DECC_VER/10000000) +# define COMPILER_VERSION_MINOR DEC(__DECC_VER/100000 % 100) +# define COMPILER_VERSION_PATCH DEC(__DECC_VER % 10000) + +#elif defined(__IBMC__) && defined(__COMPILER_VER__) +# define COMPILER_ID "zOS" + /* __IBMC__ = VRP */ +# define COMPILER_VERSION_MAJOR DEC(__IBMC__/100) +# define COMPILER_VERSION_MINOR DEC(__IBMC__/10 % 10) +# define COMPILER_VERSION_PATCH DEC(__IBMC__ % 10) + +#elif defined(__open_xl__) && defined(__clang__) +# define COMPILER_ID "IBMClang" +# define COMPILER_VERSION_MAJOR DEC(__open_xl_version__) +# define COMPILER_VERSION_MINOR DEC(__open_xl_release__) +# define COMPILER_VERSION_PATCH DEC(__open_xl_modification__) +# define COMPILER_VERSION_TWEAK DEC(__open_xl_ptf_fix_level__) + + +#elif defined(__ibmxl__) && defined(__clang__) +# define COMPILER_ID "XLClang" +# define COMPILER_VERSION_MAJOR DEC(__ibmxl_version__) +# define COMPILER_VERSION_MINOR DEC(__ibmxl_release__) +# define COMPILER_VERSION_PATCH DEC(__ibmxl_modification__) +# define COMPILER_VERSION_TWEAK DEC(__ibmxl_ptf_fix_level__) + + +#elif defined(__IBMC__) && !defined(__COMPILER_VER__) && __IBMC__ >= 800 +# define COMPILER_ID "XL" + /* __IBMC__ = VRP */ +# define COMPILER_VERSION_MAJOR DEC(__IBMC__/100) +# define COMPILER_VERSION_MINOR DEC(__IBMC__/10 % 10) +# define COMPILER_VERSION_PATCH DEC(__IBMC__ % 10) + +#elif defined(__IBMC__) && !defined(__COMPILER_VER__) && __IBMC__ < 800 +# define COMPILER_ID "VisualAge" + /* __IBMC__ = VRP */ +# define COMPILER_VERSION_MAJOR DEC(__IBMC__/100) +# define COMPILER_VERSION_MINOR DEC(__IBMC__/10 % 10) +# define COMPILER_VERSION_PATCH DEC(__IBMC__ % 10) + +#elif defined(__NVCOMPILER) +# define COMPILER_ID "NVHPC" +# define COMPILER_VERSION_MAJOR DEC(__NVCOMPILER_MAJOR__) +# define COMPILER_VERSION_MINOR DEC(__NVCOMPILER_MINOR__) +# if defined(__NVCOMPILER_PATCHLEVEL__) +# define COMPILER_VERSION_PATCH DEC(__NVCOMPILER_PATCHLEVEL__) +# endif + +#elif defined(__PGI) +# define COMPILER_ID "PGI" +# define COMPILER_VERSION_MAJOR DEC(__PGIC__) +# define COMPILER_VERSION_MINOR DEC(__PGIC_MINOR__) +# if defined(__PGIC_PATCHLEVEL__) +# define COMPILER_VERSION_PATCH DEC(__PGIC_PATCHLEVEL__) +# endif + +#elif defined(__clang__) && defined(__cray__) +# define COMPILER_ID "CrayClang" +# define COMPILER_VERSION_MAJOR DEC(__cray_major__) +# define COMPILER_VERSION_MINOR DEC(__cray_minor__) +# define COMPILER_VERSION_PATCH DEC(__cray_patchlevel__) +# define COMPILER_VERSION_INTERNAL_STR __clang_version__ + + +#elif defined(_CRAYC) +# define COMPILER_ID "Cray" +# define COMPILER_VERSION_MAJOR DEC(_RELEASE_MAJOR) +# define COMPILER_VERSION_MINOR DEC(_RELEASE_MINOR) + +#elif defined(__TI_COMPILER_VERSION__) +# define COMPILER_ID "TI" + /* __TI_COMPILER_VERSION__ = VVVRRRPPP */ +# define COMPILER_VERSION_MAJOR DEC(__TI_COMPILER_VERSION__/1000000) +# define COMPILER_VERSION_MINOR DEC(__TI_COMPILER_VERSION__/1000 % 1000) +# define COMPILER_VERSION_PATCH DEC(__TI_COMPILER_VERSION__ % 1000) + +#elif defined(__CLANG_FUJITSU) +# define COMPILER_ID "FujitsuClang" +# define COMPILER_VERSION_MAJOR DEC(__FCC_major__) +# define COMPILER_VERSION_MINOR DEC(__FCC_minor__) +# define COMPILER_VERSION_PATCH DEC(__FCC_patchlevel__) +# define COMPILER_VERSION_INTERNAL_STR __clang_version__ + + +#elif defined(__FUJITSU) +# define COMPILER_ID "Fujitsu" +# if defined(__FCC_version__) +# define COMPILER_VERSION __FCC_version__ +# elif defined(__FCC_major__) +# define COMPILER_VERSION_MAJOR DEC(__FCC_major__) +# define COMPILER_VERSION_MINOR DEC(__FCC_minor__) +# define COMPILER_VERSION_PATCH DEC(__FCC_patchlevel__) +# endif +# if defined(__fcc_version) +# define COMPILER_VERSION_INTERNAL DEC(__fcc_version) +# elif defined(__FCC_VERSION) +# define COMPILER_VERSION_INTERNAL DEC(__FCC_VERSION) +# endif + + +#elif defined(__ghs__) +# define COMPILER_ID "GHS" +/* __GHS_VERSION_NUMBER = VVVVRP */ +# ifdef __GHS_VERSION_NUMBER +# define COMPILER_VERSION_MAJOR DEC(__GHS_VERSION_NUMBER / 100) +# define COMPILER_VERSION_MINOR DEC(__GHS_VERSION_NUMBER / 10 % 10) +# define COMPILER_VERSION_PATCH DEC(__GHS_VERSION_NUMBER % 10) +# endif + +#elif defined(__TASKING__) +# define COMPILER_ID "Tasking" + # define COMPILER_VERSION_MAJOR DEC(__VERSION__/1000) + # define COMPILER_VERSION_MINOR DEC(__VERSION__ % 100) +# define COMPILER_VERSION_INTERNAL DEC(__VERSION__) + +#elif defined(__ORANGEC__) +# define COMPILER_ID "OrangeC" +# define COMPILER_VERSION_MAJOR DEC(__ORANGEC_MAJOR__) +# define COMPILER_VERSION_MINOR DEC(__ORANGEC_MINOR__) +# define COMPILER_VERSION_PATCH DEC(__ORANGEC_PATCHLEVEL__) + +#elif defined(__TINYC__) +# define COMPILER_ID "TinyCC" + +#elif defined(__BCC__) +# define COMPILER_ID "Bruce" + +#elif defined(__SCO_VERSION__) +# define COMPILER_ID "SCO" + +#elif defined(__ARMCC_VERSION) && !defined(__clang__) +# define COMPILER_ID "ARMCC" +#if __ARMCC_VERSION >= 1000000 + /* __ARMCC_VERSION = VRRPPPP */ + # define COMPILER_VERSION_MAJOR DEC(__ARMCC_VERSION/1000000) + # define COMPILER_VERSION_MINOR DEC(__ARMCC_VERSION/10000 % 100) + # define COMPILER_VERSION_PATCH DEC(__ARMCC_VERSION % 10000) +#else + /* __ARMCC_VERSION = VRPPPP */ + # define COMPILER_VERSION_MAJOR DEC(__ARMCC_VERSION/100000) + # define COMPILER_VERSION_MINOR DEC(__ARMCC_VERSION/10000 % 10) + # define COMPILER_VERSION_PATCH DEC(__ARMCC_VERSION % 10000) +#endif + + +#elif defined(__clang__) && defined(__apple_build_version__) +# define COMPILER_ID "AppleClang" +# if defined(_MSC_VER) +# define SIMULATE_ID "MSVC" +# endif +# define COMPILER_VERSION_MAJOR DEC(__clang_major__) +# define COMPILER_VERSION_MINOR DEC(__clang_minor__) +# define COMPILER_VERSION_PATCH DEC(__clang_patchlevel__) +# if defined(_MSC_VER) + /* _MSC_VER = VVRR */ +# define SIMULATE_VERSION_MAJOR DEC(_MSC_VER / 100) +# define SIMULATE_VERSION_MINOR DEC(_MSC_VER % 100) +# endif +# define COMPILER_VERSION_TWEAK DEC(__apple_build_version__) + +#elif defined(__clang__) && defined(__ARMCOMPILER_VERSION) +# define COMPILER_ID "ARMClang" + # define COMPILER_VERSION_MAJOR DEC(__ARMCOMPILER_VERSION/1000000) + # define COMPILER_VERSION_MINOR DEC(__ARMCOMPILER_VERSION/10000 % 100) + # define COMPILER_VERSION_PATCH DEC(__ARMCOMPILER_VERSION/100 % 100) +# define COMPILER_VERSION_INTERNAL DEC(__ARMCOMPILER_VERSION) + +#elif defined(__clang__) && defined(__ti__) +# define COMPILER_ID "TIClang" + # define COMPILER_VERSION_MAJOR DEC(__ti_major__) + # define COMPILER_VERSION_MINOR DEC(__ti_minor__) + # define COMPILER_VERSION_PATCH DEC(__ti_patchlevel__) +# define COMPILER_VERSION_INTERNAL DEC(__ti_version__) + +#elif defined(__clang__) +# define COMPILER_ID "Clang" +# if defined(_MSC_VER) +# define SIMULATE_ID "MSVC" +# endif +# define COMPILER_VERSION_MAJOR DEC(__clang_major__) +# define COMPILER_VERSION_MINOR DEC(__clang_minor__) +# define COMPILER_VERSION_PATCH DEC(__clang_patchlevel__) +# if defined(_MSC_VER) + /* _MSC_VER = VVRR */ +# define SIMULATE_VERSION_MAJOR DEC(_MSC_VER / 100) +# define SIMULATE_VERSION_MINOR DEC(_MSC_VER % 100) +# endif + +#elif defined(__LCC__) && (defined(__GNUC__) || defined(__GNUG__) || defined(__MCST__)) +# define COMPILER_ID "LCC" +# define COMPILER_VERSION_MAJOR DEC(__LCC__ / 100) +# define COMPILER_VERSION_MINOR DEC(__LCC__ % 100) +# if defined(__LCC_MINOR__) +# define COMPILER_VERSION_PATCH DEC(__LCC_MINOR__) +# endif +# if defined(__GNUC__) && defined(__GNUC_MINOR__) +# define SIMULATE_ID "GNU" +# define SIMULATE_VERSION_MAJOR DEC(__GNUC__) +# define SIMULATE_VERSION_MINOR DEC(__GNUC_MINOR__) +# if defined(__GNUC_PATCHLEVEL__) +# define SIMULATE_VERSION_PATCH DEC(__GNUC_PATCHLEVEL__) +# endif +# endif + +#elif defined(__GNUC__) +# define COMPILER_ID "GNU" +# define COMPILER_VERSION_MAJOR DEC(__GNUC__) +# if defined(__GNUC_MINOR__) +# define COMPILER_VERSION_MINOR DEC(__GNUC_MINOR__) +# endif +# if defined(__GNUC_PATCHLEVEL__) +# define COMPILER_VERSION_PATCH DEC(__GNUC_PATCHLEVEL__) +# endif + +#elif defined(_MSC_VER) +# define COMPILER_ID "MSVC" + /* _MSC_VER = VVRR */ +# define COMPILER_VERSION_MAJOR DEC(_MSC_VER / 100) +# define COMPILER_VERSION_MINOR DEC(_MSC_VER % 100) +# if defined(_MSC_FULL_VER) +# if _MSC_VER >= 1400 + /* _MSC_FULL_VER = VVRRPPPPP */ +# define COMPILER_VERSION_PATCH DEC(_MSC_FULL_VER % 100000) +# else + /* _MSC_FULL_VER = VVRRPPPP */ +# define COMPILER_VERSION_PATCH DEC(_MSC_FULL_VER % 10000) +# endif +# endif +# if defined(_MSC_BUILD) +# define COMPILER_VERSION_TWEAK DEC(_MSC_BUILD) +# endif + +#elif defined(_ADI_COMPILER) +# define COMPILER_ID "ADSP" +#if defined(__VERSIONNUM__) + /* __VERSIONNUM__ = 0xVVRRPPTT */ +# define COMPILER_VERSION_MAJOR DEC(__VERSIONNUM__ >> 24 & 0xFF) +# define COMPILER_VERSION_MINOR DEC(__VERSIONNUM__ >> 16 & 0xFF) +# define COMPILER_VERSION_PATCH DEC(__VERSIONNUM__ >> 8 & 0xFF) +# define COMPILER_VERSION_TWEAK DEC(__VERSIONNUM__ & 0xFF) +#endif + +#elif defined(__IAR_SYSTEMS_ICC__) || defined(__IAR_SYSTEMS_ICC) +# define COMPILER_ID "IAR" +# if defined(__VER__) && defined(__ICCARM__) +# define COMPILER_VERSION_MAJOR DEC((__VER__) / 1000000) +# define COMPILER_VERSION_MINOR DEC(((__VER__) / 1000) % 1000) +# define COMPILER_VERSION_PATCH DEC((__VER__) % 1000) +# define COMPILER_VERSION_INTERNAL DEC(__IAR_SYSTEMS_ICC__) +# elif defined(__VER__) && (defined(__ICCAVR__) || defined(__ICCRX__) || defined(__ICCRH850__) || defined(__ICCRL78__) || defined(__ICC430__) || defined(__ICCRISCV__) || defined(__ICCV850__) || defined(__ICC8051__) || defined(__ICCSTM8__)) +# define COMPILER_VERSION_MAJOR DEC((__VER__) / 100) +# define COMPILER_VERSION_MINOR DEC((__VER__) - (((__VER__) / 100)*100)) +# define COMPILER_VERSION_PATCH DEC(__SUBVERSION__) +# define COMPILER_VERSION_INTERNAL DEC(__IAR_SYSTEMS_ICC__) +# endif + +#elif defined(__SDCC_VERSION_MAJOR) || defined(SDCC) +# define COMPILER_ID "SDCC" +# if defined(__SDCC_VERSION_MAJOR) +# define COMPILER_VERSION_MAJOR DEC(__SDCC_VERSION_MAJOR) +# define COMPILER_VERSION_MINOR DEC(__SDCC_VERSION_MINOR) +# define COMPILER_VERSION_PATCH DEC(__SDCC_VERSION_PATCH) +# else + /* SDCC = VRP */ +# define COMPILER_VERSION_MAJOR DEC(SDCC/100) +# define COMPILER_VERSION_MINOR DEC(SDCC/10 % 10) +# define COMPILER_VERSION_PATCH DEC(SDCC % 10) +# endif + + +/* These compilers are either not known or too old to define an + identification macro. Try to identify the platform and guess that + it is the native compiler. */ +#elif defined(__hpux) || defined(__hpua) +# define COMPILER_ID "HP" + +#else /* unknown compiler */ +# define COMPILER_ID "" +#endif + +/* Construct the string literal in pieces to prevent the source from + getting matched. Store it in a pointer rather than an array + because some compilers will just produce instructions to fill the + array rather than assigning a pointer to a static array. */ +char const* info_compiler = "INFO" ":" "compiler[" COMPILER_ID "]"; +#ifdef SIMULATE_ID +char const* info_simulate = "INFO" ":" "simulate[" SIMULATE_ID "]"; +#endif + +#ifdef __QNXNTO__ +char const* qnxnto = "INFO" ":" "qnxnto[]"; +#endif + +#if defined(__CRAYXT_COMPUTE_LINUX_TARGET) +char const *info_cray = "INFO" ":" "compiler_wrapper[CrayPrgEnv]"; +#endif + +#define STRINGIFY_HELPER(X) #X +#define STRINGIFY(X) STRINGIFY_HELPER(X) + +/* Identify known platforms by name. */ +#if defined(__linux) || defined(__linux__) || defined(linux) +# define PLATFORM_ID "Linux" + +#elif defined(__MSYS__) +# define PLATFORM_ID "MSYS" + +#elif defined(__CYGWIN__) +# define PLATFORM_ID "Cygwin" + +#elif defined(__MINGW32__) +# define PLATFORM_ID "MinGW" + +#elif defined(__APPLE__) +# define PLATFORM_ID "Darwin" + +#elif defined(_WIN32) || defined(__WIN32__) || defined(WIN32) +# define PLATFORM_ID "Windows" + +#elif defined(__FreeBSD__) || defined(__FreeBSD) +# define PLATFORM_ID "FreeBSD" + +#elif defined(__NetBSD__) || defined(__NetBSD) +# define PLATFORM_ID "NetBSD" + +#elif defined(__OpenBSD__) || defined(__OPENBSD) +# define PLATFORM_ID "OpenBSD" + +#elif defined(__sun) || defined(sun) +# define PLATFORM_ID "SunOS" + +#elif defined(_AIX) || defined(__AIX) || defined(__AIX__) || defined(__aix) || defined(__aix__) +# define PLATFORM_ID "AIX" + +#elif defined(__hpux) || defined(__hpux__) +# define PLATFORM_ID "HP-UX" + +#elif defined(__HAIKU__) +# define PLATFORM_ID "Haiku" + +#elif defined(__BeOS) || defined(__BEOS__) || defined(_BEOS) +# define PLATFORM_ID "BeOS" + +#elif defined(__QNX__) || defined(__QNXNTO__) +# define PLATFORM_ID "QNX" + +#elif defined(__tru64) || defined(_tru64) || defined(__TRU64__) +# define PLATFORM_ID "Tru64" + +#elif defined(__riscos) || defined(__riscos__) +# define PLATFORM_ID "RISCos" + +#elif defined(__sinix) || defined(__sinix__) || defined(__SINIX__) +# define PLATFORM_ID "SINIX" + +#elif defined(__UNIX_SV__) +# define PLATFORM_ID "UNIX_SV" + +#elif defined(__bsdos__) +# define PLATFORM_ID "BSDOS" + +#elif defined(_MPRAS) || defined(MPRAS) +# define PLATFORM_ID "MP-RAS" + +#elif defined(__osf) || defined(__osf__) +# define PLATFORM_ID "OSF1" + +#elif defined(_SCO_SV) || defined(SCO_SV) || defined(sco_sv) +# define PLATFORM_ID "SCO_SV" + +#elif defined(__ultrix) || defined(__ultrix__) || defined(_ULTRIX) +# define PLATFORM_ID "ULTRIX" + +#elif defined(__XENIX__) || defined(_XENIX) || defined(XENIX) +# define PLATFORM_ID "Xenix" + +#elif defined(__WATCOMC__) +# if defined(__LINUX__) +# define PLATFORM_ID "Linux" + +# elif defined(__DOS__) +# define PLATFORM_ID "DOS" + +# elif defined(__OS2__) +# define PLATFORM_ID "OS2" + +# elif defined(__WINDOWS__) +# define PLATFORM_ID "Windows3x" + +# elif defined(__VXWORKS__) +# define PLATFORM_ID "VxWorks" + +# else /* unknown platform */ +# define PLATFORM_ID +# endif + +#elif defined(__INTEGRITY) +# if defined(INT_178B) +# define PLATFORM_ID "Integrity178" + +# else /* regular Integrity */ +# define PLATFORM_ID "Integrity" +# endif + +# elif defined(_ADI_COMPILER) +# define PLATFORM_ID "ADSP" + +#else /* unknown platform */ +# define PLATFORM_ID + +#endif + +/* For windows compilers MSVC and Intel we can determine + the architecture of the compiler being used. This is because + the compilers do not have flags that can change the architecture, + but rather depend on which compiler is being used +*/ +#if defined(_WIN32) && defined(_MSC_VER) +# if defined(_M_IA64) +# define ARCHITECTURE_ID "IA64" + +# elif defined(_M_ARM64EC) +# define ARCHITECTURE_ID "ARM64EC" + +# elif defined(_M_X64) || defined(_M_AMD64) +# define ARCHITECTURE_ID "x64" + +# elif defined(_M_IX86) +# define ARCHITECTURE_ID "X86" + +# elif defined(_M_ARM64) +# define ARCHITECTURE_ID "ARM64" + +# elif defined(_M_ARM) +# if _M_ARM == 4 +# define ARCHITECTURE_ID "ARMV4I" +# elif _M_ARM == 5 +# define ARCHITECTURE_ID "ARMV5I" +# else +# define ARCHITECTURE_ID "ARMV" STRINGIFY(_M_ARM) +# endif + +# elif defined(_M_MIPS) +# define ARCHITECTURE_ID "MIPS" + +# elif defined(_M_SH) +# define ARCHITECTURE_ID "SHx" + +# else /* unknown architecture */ +# define ARCHITECTURE_ID "" +# endif + +#elif defined(__WATCOMC__) +# if defined(_M_I86) +# define ARCHITECTURE_ID "I86" + +# elif defined(_M_IX86) +# define ARCHITECTURE_ID "X86" + +# else /* unknown architecture */ +# define ARCHITECTURE_ID "" +# endif + +#elif defined(__IAR_SYSTEMS_ICC__) || defined(__IAR_SYSTEMS_ICC) +# if defined(__ICCARM__) +# define ARCHITECTURE_ID "ARM" + +# elif defined(__ICCRX__) +# define ARCHITECTURE_ID "RX" + +# elif defined(__ICCRH850__) +# define ARCHITECTURE_ID "RH850" + +# elif defined(__ICCRL78__) +# define ARCHITECTURE_ID "RL78" + +# elif defined(__ICCRISCV__) +# define ARCHITECTURE_ID "RISCV" + +# elif defined(__ICCAVR__) +# define ARCHITECTURE_ID "AVR" + +# elif defined(__ICC430__) +# define ARCHITECTURE_ID "MSP430" + +# elif defined(__ICCV850__) +# define ARCHITECTURE_ID "V850" + +# elif defined(__ICC8051__) +# define ARCHITECTURE_ID "8051" + +# elif defined(__ICCSTM8__) +# define ARCHITECTURE_ID "STM8" + +# else /* unknown architecture */ +# define ARCHITECTURE_ID "" +# endif + +#elif defined(__ghs__) +# if defined(__PPC64__) +# define ARCHITECTURE_ID "PPC64" + +# elif defined(__ppc__) +# define ARCHITECTURE_ID "PPC" + +# elif defined(__ARM__) +# define ARCHITECTURE_ID "ARM" + +# elif defined(__x86_64__) +# define ARCHITECTURE_ID "x64" + +# elif defined(__i386__) +# define ARCHITECTURE_ID "X86" + +# else /* unknown architecture */ +# define ARCHITECTURE_ID "" +# endif + +#elif defined(__clang__) && defined(__ti__) +# if defined(__ARM_ARCH) +# define ARCHITECTURE_ID "Arm" + +# else /* unknown architecture */ +# define ARCHITECTURE_ID "" +# endif + +#elif defined(__TI_COMPILER_VERSION__) +# if defined(__TI_ARM__) +# define ARCHITECTURE_ID "ARM" + +# elif defined(__MSP430__) +# define ARCHITECTURE_ID "MSP430" + +# elif defined(__TMS320C28XX__) +# define ARCHITECTURE_ID "TMS320C28x" + +# elif defined(__TMS320C6X__) || defined(_TMS320C6X) +# define ARCHITECTURE_ID "TMS320C6x" + +# else /* unknown architecture */ +# define ARCHITECTURE_ID "" +# endif + +# elif defined(__ADSPSHARC__) +# define ARCHITECTURE_ID "SHARC" + +# elif defined(__ADSPBLACKFIN__) +# define ARCHITECTURE_ID "Blackfin" + +#elif defined(__TASKING__) + +# if defined(__CTC__) || defined(__CPTC__) +# define ARCHITECTURE_ID "TriCore" + +# elif defined(__CMCS__) +# define ARCHITECTURE_ID "MCS" + +# elif defined(__CARM__) +# define ARCHITECTURE_ID "ARM" + +# elif defined(__CARC__) +# define ARCHITECTURE_ID "ARC" + +# elif defined(__C51__) +# define ARCHITECTURE_ID "8051" + +# elif defined(__CPCP__) +# define ARCHITECTURE_ID "PCP" + +# else +# define ARCHITECTURE_ID "" +# endif + +#else +# define ARCHITECTURE_ID +#endif + +/* Convert integer to decimal digit literals. */ +#define DEC(n) \ + ('0' + (((n) / 10000000)%10)), \ + ('0' + (((n) / 1000000)%10)), \ + ('0' + (((n) / 100000)%10)), \ + ('0' + (((n) / 10000)%10)), \ + ('0' + (((n) / 1000)%10)), \ + ('0' + (((n) / 100)%10)), \ + ('0' + (((n) / 10)%10)), \ + ('0' + ((n) % 10)) + +/* Convert integer to hex digit literals. */ +#define HEX(n) \ + ('0' + ((n)>>28 & 0xF)), \ + ('0' + ((n)>>24 & 0xF)), \ + ('0' + ((n)>>20 & 0xF)), \ + ('0' + ((n)>>16 & 0xF)), \ + ('0' + ((n)>>12 & 0xF)), \ + ('0' + ((n)>>8 & 0xF)), \ + ('0' + ((n)>>4 & 0xF)), \ + ('0' + ((n) & 0xF)) + +/* Construct a string literal encoding the version number. */ +#ifdef COMPILER_VERSION +char const* info_version = "INFO" ":" "compiler_version[" COMPILER_VERSION "]"; + +/* Construct a string literal encoding the version number components. */ +#elif defined(COMPILER_VERSION_MAJOR) +char const info_version[] = { + 'I', 'N', 'F', 'O', ':', + 'c','o','m','p','i','l','e','r','_','v','e','r','s','i','o','n','[', + COMPILER_VERSION_MAJOR, +# ifdef COMPILER_VERSION_MINOR + '.', COMPILER_VERSION_MINOR, +# ifdef COMPILER_VERSION_PATCH + '.', COMPILER_VERSION_PATCH, +# ifdef COMPILER_VERSION_TWEAK + '.', COMPILER_VERSION_TWEAK, +# endif +# endif +# endif + ']','\0'}; +#endif + +/* Construct a string literal encoding the internal version number. */ +#ifdef COMPILER_VERSION_INTERNAL +char const info_version_internal[] = { + 'I', 'N', 'F', 'O', ':', + 'c','o','m','p','i','l','e','r','_','v','e','r','s','i','o','n','_', + 'i','n','t','e','r','n','a','l','[', + COMPILER_VERSION_INTERNAL,']','\0'}; +#elif defined(COMPILER_VERSION_INTERNAL_STR) +char const* info_version_internal = "INFO" ":" "compiler_version_internal[" COMPILER_VERSION_INTERNAL_STR "]"; +#endif + +/* Construct a string literal encoding the version number components. */ +#ifdef SIMULATE_VERSION_MAJOR +char const info_simulate_version[] = { + 'I', 'N', 'F', 'O', ':', + 's','i','m','u','l','a','t','e','_','v','e','r','s','i','o','n','[', + SIMULATE_VERSION_MAJOR, +# ifdef SIMULATE_VERSION_MINOR + '.', SIMULATE_VERSION_MINOR, +# ifdef SIMULATE_VERSION_PATCH + '.', SIMULATE_VERSION_PATCH, +# ifdef SIMULATE_VERSION_TWEAK + '.', SIMULATE_VERSION_TWEAK, +# endif +# endif +# endif + ']','\0'}; +#endif + +/* Construct the string literal in pieces to prevent the source from + getting matched. Store it in a pointer rather than an array + because some compilers will just produce instructions to fill the + array rather than assigning a pointer to a static array. */ +char const* info_platform = "INFO" ":" "platform[" PLATFORM_ID "]"; +char const* info_arch = "INFO" ":" "arch[" ARCHITECTURE_ID "]"; + + + +#define C_STD_99 199901L +#define C_STD_11 201112L +#define C_STD_17 201710L +#define C_STD_23 202311L + +#ifdef __STDC_VERSION__ +# define C_STD __STDC_VERSION__ +#endif + +#if !defined(__STDC__) && !defined(__clang__) +# if defined(_MSC_VER) || defined(__ibmxl__) || defined(__IBMC__) +# define C_VERSION "90" +# else +# define C_VERSION +# endif +#elif C_STD > C_STD_17 +# define C_VERSION "23" +#elif C_STD > C_STD_11 +# define C_VERSION "17" +#elif C_STD > C_STD_99 +# define C_VERSION "11" +#elif C_STD >= C_STD_99 +# define C_VERSION "99" +#else +# define C_VERSION "90" +#endif +const char* info_language_standard_default = + "INFO" ":" "standard_default[" C_VERSION "]"; + +const char* info_language_extensions_default = "INFO" ":" "extensions_default[" +#if (defined(__clang__) || defined(__GNUC__) || defined(__xlC__) || \ + defined(__TI_COMPILER_VERSION__)) && \ + !defined(__STRICT_ANSI__) + "ON" +#else + "OFF" +#endif +"]"; + +/*--------------------------------------------------------------------------*/ + +#ifdef ID_VOID_MAIN +void main() {} +#else +# if defined(__CLASSIC_C__) +int main(argc, argv) int argc; char *argv[]; +# else +int main(int argc, char* argv[]) +# endif +{ + int require = 0; + require += info_compiler[argc]; + require += info_platform[argc]; + require += info_arch[argc]; +#ifdef COMPILER_VERSION_MAJOR + require += info_version[argc]; +#endif +#ifdef COMPILER_VERSION_INTERNAL + require += info_version_internal[argc]; +#endif +#ifdef SIMULATE_ID + require += info_simulate[argc]; +#endif +#ifdef SIMULATE_VERSION_MAJOR + require += info_simulate_version[argc]; +#endif +#if defined(__CRAYXT_COMPUTE_LINUX_TARGET) + require += info_cray[argc]; +#endif + require += info_language_standard_default[argc]; + require += info_language_extensions_default[argc]; + (void)argv; + return require; +} +#endif diff --git a/siro_rider/android/app/.cxx/Debug/3p4b322x/x86_64/CMakeFiles/3.31.5-g6cf5163/CompilerIdC/CMakeCCompilerId.o b/siro_rider/android/app/.cxx/Debug/3p4b322x/x86_64/CMakeFiles/3.31.5-g6cf5163/CompilerIdC/CMakeCCompilerId.o new file mode 100644 index 0000000..bc20296 Binary files /dev/null and b/siro_rider/android/app/.cxx/Debug/3p4b322x/x86_64/CMakeFiles/3.31.5-g6cf5163/CompilerIdC/CMakeCCompilerId.o differ diff --git a/siro_rider/android/app/.cxx/Debug/3p4b322x/x86_64/CMakeFiles/3.31.5-g6cf5163/CompilerIdCXX/CMakeCXXCompilerId.cpp b/siro_rider/android/app/.cxx/Debug/3p4b322x/x86_64/CMakeFiles/3.31.5-g6cf5163/CompilerIdCXX/CMakeCXXCompilerId.cpp new file mode 100644 index 0000000..da6c824 --- /dev/null +++ b/siro_rider/android/app/.cxx/Debug/3p4b322x/x86_64/CMakeFiles/3.31.5-g6cf5163/CompilerIdCXX/CMakeCXXCompilerId.cpp @@ -0,0 +1,919 @@ +/* This source file must have a .cpp extension so that all C++ compilers + recognize the extension without flags. Borland does not know .cxx for + example. */ +#ifndef __cplusplus +# error "A C compiler has been selected for C++." +#endif + +#if !defined(__has_include) +/* If the compiler does not have __has_include, pretend the answer is + always no. */ +# define __has_include(x) 0 +#endif + + +/* Version number components: V=Version, R=Revision, P=Patch + Version date components: YYYY=Year, MM=Month, DD=Day */ + +#if defined(__INTEL_COMPILER) || defined(__ICC) +# define COMPILER_ID "Intel" +# if defined(_MSC_VER) +# define SIMULATE_ID "MSVC" +# endif +# if defined(__GNUC__) +# define SIMULATE_ID "GNU" +# endif + /* __INTEL_COMPILER = VRP prior to 2021, and then VVVV for 2021 and later, + except that a few beta releases use the old format with V=2021. */ +# if __INTEL_COMPILER < 2021 || __INTEL_COMPILER == 202110 || __INTEL_COMPILER == 202111 +# define COMPILER_VERSION_MAJOR DEC(__INTEL_COMPILER/100) +# define COMPILER_VERSION_MINOR DEC(__INTEL_COMPILER/10 % 10) +# if defined(__INTEL_COMPILER_UPDATE) +# define COMPILER_VERSION_PATCH DEC(__INTEL_COMPILER_UPDATE) +# else +# define COMPILER_VERSION_PATCH DEC(__INTEL_COMPILER % 10) +# endif +# else +# define COMPILER_VERSION_MAJOR DEC(__INTEL_COMPILER) +# define COMPILER_VERSION_MINOR DEC(__INTEL_COMPILER_UPDATE) + /* The third version component from --version is an update index, + but no macro is provided for it. */ +# define COMPILER_VERSION_PATCH DEC(0) +# endif +# if defined(__INTEL_COMPILER_BUILD_DATE) + /* __INTEL_COMPILER_BUILD_DATE = YYYYMMDD */ +# define COMPILER_VERSION_TWEAK DEC(__INTEL_COMPILER_BUILD_DATE) +# endif +# if defined(_MSC_VER) + /* _MSC_VER = VVRR */ +# define SIMULATE_VERSION_MAJOR DEC(_MSC_VER / 100) +# define SIMULATE_VERSION_MINOR DEC(_MSC_VER % 100) +# endif +# if defined(__GNUC__) +# define SIMULATE_VERSION_MAJOR DEC(__GNUC__) +# elif defined(__GNUG__) +# define SIMULATE_VERSION_MAJOR DEC(__GNUG__) +# endif +# if defined(__GNUC_MINOR__) +# define SIMULATE_VERSION_MINOR DEC(__GNUC_MINOR__) +# endif +# if defined(__GNUC_PATCHLEVEL__) +# define SIMULATE_VERSION_PATCH DEC(__GNUC_PATCHLEVEL__) +# endif + +#elif (defined(__clang__) && defined(__INTEL_CLANG_COMPILER)) || defined(__INTEL_LLVM_COMPILER) +# define COMPILER_ID "IntelLLVM" +#if defined(_MSC_VER) +# define SIMULATE_ID "MSVC" +#endif +#if defined(__GNUC__) +# define SIMULATE_ID "GNU" +#endif +/* __INTEL_LLVM_COMPILER = VVVVRP prior to 2021.2.0, VVVVRRPP for 2021.2.0 and + * later. Look for 6 digit vs. 8 digit version number to decide encoding. + * VVVV is no smaller than the current year when a version is released. + */ +#if __INTEL_LLVM_COMPILER < 1000000L +# define COMPILER_VERSION_MAJOR DEC(__INTEL_LLVM_COMPILER/100) +# define COMPILER_VERSION_MINOR DEC(__INTEL_LLVM_COMPILER/10 % 10) +# define COMPILER_VERSION_PATCH DEC(__INTEL_LLVM_COMPILER % 10) +#else +# define COMPILER_VERSION_MAJOR DEC(__INTEL_LLVM_COMPILER/10000) +# define COMPILER_VERSION_MINOR DEC(__INTEL_LLVM_COMPILER/100 % 100) +# define COMPILER_VERSION_PATCH DEC(__INTEL_LLVM_COMPILER % 100) +#endif +#if defined(_MSC_VER) + /* _MSC_VER = VVRR */ +# define SIMULATE_VERSION_MAJOR DEC(_MSC_VER / 100) +# define SIMULATE_VERSION_MINOR DEC(_MSC_VER % 100) +#endif +#if defined(__GNUC__) +# define SIMULATE_VERSION_MAJOR DEC(__GNUC__) +#elif defined(__GNUG__) +# define SIMULATE_VERSION_MAJOR DEC(__GNUG__) +#endif +#if defined(__GNUC_MINOR__) +# define SIMULATE_VERSION_MINOR DEC(__GNUC_MINOR__) +#endif +#if defined(__GNUC_PATCHLEVEL__) +# define SIMULATE_VERSION_PATCH DEC(__GNUC_PATCHLEVEL__) +#endif + +#elif defined(__PATHCC__) +# define COMPILER_ID "PathScale" +# define COMPILER_VERSION_MAJOR DEC(__PATHCC__) +# define COMPILER_VERSION_MINOR DEC(__PATHCC_MINOR__) +# if defined(__PATHCC_PATCHLEVEL__) +# define COMPILER_VERSION_PATCH DEC(__PATHCC_PATCHLEVEL__) +# endif + +#elif defined(__BORLANDC__) && defined(__CODEGEARC_VERSION__) +# define COMPILER_ID "Embarcadero" +# define COMPILER_VERSION_MAJOR HEX(__CODEGEARC_VERSION__>>24 & 0x00FF) +# define COMPILER_VERSION_MINOR HEX(__CODEGEARC_VERSION__>>16 & 0x00FF) +# define COMPILER_VERSION_PATCH DEC(__CODEGEARC_VERSION__ & 0xFFFF) + +#elif defined(__BORLANDC__) +# define COMPILER_ID "Borland" + /* __BORLANDC__ = 0xVRR */ +# define COMPILER_VERSION_MAJOR HEX(__BORLANDC__>>8) +# define COMPILER_VERSION_MINOR HEX(__BORLANDC__ & 0xFF) + +#elif defined(__WATCOMC__) && __WATCOMC__ < 1200 +# define COMPILER_ID "Watcom" + /* __WATCOMC__ = VVRR */ +# define COMPILER_VERSION_MAJOR DEC(__WATCOMC__ / 100) +# define COMPILER_VERSION_MINOR DEC((__WATCOMC__ / 10) % 10) +# if (__WATCOMC__ % 10) > 0 +# define COMPILER_VERSION_PATCH DEC(__WATCOMC__ % 10) +# endif + +#elif defined(__WATCOMC__) +# define COMPILER_ID "OpenWatcom" + /* __WATCOMC__ = VVRP + 1100 */ +# define COMPILER_VERSION_MAJOR DEC((__WATCOMC__ - 1100) / 100) +# define COMPILER_VERSION_MINOR DEC((__WATCOMC__ / 10) % 10) +# if (__WATCOMC__ % 10) > 0 +# define COMPILER_VERSION_PATCH DEC(__WATCOMC__ % 10) +# endif + +#elif defined(__SUNPRO_CC) +# define COMPILER_ID "SunPro" +# if __SUNPRO_CC >= 0x5100 + /* __SUNPRO_CC = 0xVRRP */ +# define COMPILER_VERSION_MAJOR HEX(__SUNPRO_CC>>12) +# define COMPILER_VERSION_MINOR HEX(__SUNPRO_CC>>4 & 0xFF) +# define COMPILER_VERSION_PATCH HEX(__SUNPRO_CC & 0xF) +# else + /* __SUNPRO_CC = 0xVRP */ +# define COMPILER_VERSION_MAJOR HEX(__SUNPRO_CC>>8) +# define COMPILER_VERSION_MINOR HEX(__SUNPRO_CC>>4 & 0xF) +# define COMPILER_VERSION_PATCH HEX(__SUNPRO_CC & 0xF) +# endif + +#elif defined(__HP_aCC) +# define COMPILER_ID "HP" + /* __HP_aCC = VVRRPP */ +# define COMPILER_VERSION_MAJOR DEC(__HP_aCC/10000) +# define COMPILER_VERSION_MINOR DEC(__HP_aCC/100 % 100) +# define COMPILER_VERSION_PATCH DEC(__HP_aCC % 100) + +#elif defined(__DECCXX) +# define COMPILER_ID "Compaq" + /* __DECCXX_VER = VVRRTPPPP */ +# define COMPILER_VERSION_MAJOR DEC(__DECCXX_VER/10000000) +# define COMPILER_VERSION_MINOR DEC(__DECCXX_VER/100000 % 100) +# define COMPILER_VERSION_PATCH DEC(__DECCXX_VER % 10000) + +#elif defined(__IBMCPP__) && defined(__COMPILER_VER__) +# define COMPILER_ID "zOS" + /* __IBMCPP__ = VRP */ +# define COMPILER_VERSION_MAJOR DEC(__IBMCPP__/100) +# define COMPILER_VERSION_MINOR DEC(__IBMCPP__/10 % 10) +# define COMPILER_VERSION_PATCH DEC(__IBMCPP__ % 10) + +#elif defined(__open_xl__) && defined(__clang__) +# define COMPILER_ID "IBMClang" +# define COMPILER_VERSION_MAJOR DEC(__open_xl_version__) +# define COMPILER_VERSION_MINOR DEC(__open_xl_release__) +# define COMPILER_VERSION_PATCH DEC(__open_xl_modification__) +# define COMPILER_VERSION_TWEAK DEC(__open_xl_ptf_fix_level__) + + +#elif defined(__ibmxl__) && defined(__clang__) +# define COMPILER_ID "XLClang" +# define COMPILER_VERSION_MAJOR DEC(__ibmxl_version__) +# define COMPILER_VERSION_MINOR DEC(__ibmxl_release__) +# define COMPILER_VERSION_PATCH DEC(__ibmxl_modification__) +# define COMPILER_VERSION_TWEAK DEC(__ibmxl_ptf_fix_level__) + + +#elif defined(__IBMCPP__) && !defined(__COMPILER_VER__) && __IBMCPP__ >= 800 +# define COMPILER_ID "XL" + /* __IBMCPP__ = VRP */ +# define COMPILER_VERSION_MAJOR DEC(__IBMCPP__/100) +# define COMPILER_VERSION_MINOR DEC(__IBMCPP__/10 % 10) +# define COMPILER_VERSION_PATCH DEC(__IBMCPP__ % 10) + +#elif defined(__IBMCPP__) && !defined(__COMPILER_VER__) && __IBMCPP__ < 800 +# define COMPILER_ID "VisualAge" + /* __IBMCPP__ = VRP */ +# define COMPILER_VERSION_MAJOR DEC(__IBMCPP__/100) +# define COMPILER_VERSION_MINOR DEC(__IBMCPP__/10 % 10) +# define COMPILER_VERSION_PATCH DEC(__IBMCPP__ % 10) + +#elif defined(__NVCOMPILER) +# define COMPILER_ID "NVHPC" +# define COMPILER_VERSION_MAJOR DEC(__NVCOMPILER_MAJOR__) +# define COMPILER_VERSION_MINOR DEC(__NVCOMPILER_MINOR__) +# if defined(__NVCOMPILER_PATCHLEVEL__) +# define COMPILER_VERSION_PATCH DEC(__NVCOMPILER_PATCHLEVEL__) +# endif + +#elif defined(__PGI) +# define COMPILER_ID "PGI" +# define COMPILER_VERSION_MAJOR DEC(__PGIC__) +# define COMPILER_VERSION_MINOR DEC(__PGIC_MINOR__) +# if defined(__PGIC_PATCHLEVEL__) +# define COMPILER_VERSION_PATCH DEC(__PGIC_PATCHLEVEL__) +# endif + +#elif defined(__clang__) && defined(__cray__) +# define COMPILER_ID "CrayClang" +# define COMPILER_VERSION_MAJOR DEC(__cray_major__) +# define COMPILER_VERSION_MINOR DEC(__cray_minor__) +# define COMPILER_VERSION_PATCH DEC(__cray_patchlevel__) +# define COMPILER_VERSION_INTERNAL_STR __clang_version__ + + +#elif defined(_CRAYC) +# define COMPILER_ID "Cray" +# define COMPILER_VERSION_MAJOR DEC(_RELEASE_MAJOR) +# define COMPILER_VERSION_MINOR DEC(_RELEASE_MINOR) + +#elif defined(__TI_COMPILER_VERSION__) +# define COMPILER_ID "TI" + /* __TI_COMPILER_VERSION__ = VVVRRRPPP */ +# define COMPILER_VERSION_MAJOR DEC(__TI_COMPILER_VERSION__/1000000) +# define COMPILER_VERSION_MINOR DEC(__TI_COMPILER_VERSION__/1000 % 1000) +# define COMPILER_VERSION_PATCH DEC(__TI_COMPILER_VERSION__ % 1000) + +#elif defined(__CLANG_FUJITSU) +# define COMPILER_ID "FujitsuClang" +# define COMPILER_VERSION_MAJOR DEC(__FCC_major__) +# define COMPILER_VERSION_MINOR DEC(__FCC_minor__) +# define COMPILER_VERSION_PATCH DEC(__FCC_patchlevel__) +# define COMPILER_VERSION_INTERNAL_STR __clang_version__ + + +#elif defined(__FUJITSU) +# define COMPILER_ID "Fujitsu" +# if defined(__FCC_version__) +# define COMPILER_VERSION __FCC_version__ +# elif defined(__FCC_major__) +# define COMPILER_VERSION_MAJOR DEC(__FCC_major__) +# define COMPILER_VERSION_MINOR DEC(__FCC_minor__) +# define COMPILER_VERSION_PATCH DEC(__FCC_patchlevel__) +# endif +# if defined(__fcc_version) +# define COMPILER_VERSION_INTERNAL DEC(__fcc_version) +# elif defined(__FCC_VERSION) +# define COMPILER_VERSION_INTERNAL DEC(__FCC_VERSION) +# endif + + +#elif defined(__ghs__) +# define COMPILER_ID "GHS" +/* __GHS_VERSION_NUMBER = VVVVRP */ +# ifdef __GHS_VERSION_NUMBER +# define COMPILER_VERSION_MAJOR DEC(__GHS_VERSION_NUMBER / 100) +# define COMPILER_VERSION_MINOR DEC(__GHS_VERSION_NUMBER / 10 % 10) +# define COMPILER_VERSION_PATCH DEC(__GHS_VERSION_NUMBER % 10) +# endif + +#elif defined(__TASKING__) +# define COMPILER_ID "Tasking" + # define COMPILER_VERSION_MAJOR DEC(__VERSION__/1000) + # define COMPILER_VERSION_MINOR DEC(__VERSION__ % 100) +# define COMPILER_VERSION_INTERNAL DEC(__VERSION__) + +#elif defined(__ORANGEC__) +# define COMPILER_ID "OrangeC" +# define COMPILER_VERSION_MAJOR DEC(__ORANGEC_MAJOR__) +# define COMPILER_VERSION_MINOR DEC(__ORANGEC_MINOR__) +# define COMPILER_VERSION_PATCH DEC(__ORANGEC_PATCHLEVEL__) + +#elif defined(__SCO_VERSION__) +# define COMPILER_ID "SCO" + +#elif defined(__ARMCC_VERSION) && !defined(__clang__) +# define COMPILER_ID "ARMCC" +#if __ARMCC_VERSION >= 1000000 + /* __ARMCC_VERSION = VRRPPPP */ + # define COMPILER_VERSION_MAJOR DEC(__ARMCC_VERSION/1000000) + # define COMPILER_VERSION_MINOR DEC(__ARMCC_VERSION/10000 % 100) + # define COMPILER_VERSION_PATCH DEC(__ARMCC_VERSION % 10000) +#else + /* __ARMCC_VERSION = VRPPPP */ + # define COMPILER_VERSION_MAJOR DEC(__ARMCC_VERSION/100000) + # define COMPILER_VERSION_MINOR DEC(__ARMCC_VERSION/10000 % 10) + # define COMPILER_VERSION_PATCH DEC(__ARMCC_VERSION % 10000) +#endif + + +#elif defined(__clang__) && defined(__apple_build_version__) +# define COMPILER_ID "AppleClang" +# if defined(_MSC_VER) +# define SIMULATE_ID "MSVC" +# endif +# define COMPILER_VERSION_MAJOR DEC(__clang_major__) +# define COMPILER_VERSION_MINOR DEC(__clang_minor__) +# define COMPILER_VERSION_PATCH DEC(__clang_patchlevel__) +# if defined(_MSC_VER) + /* _MSC_VER = VVRR */ +# define SIMULATE_VERSION_MAJOR DEC(_MSC_VER / 100) +# define SIMULATE_VERSION_MINOR DEC(_MSC_VER % 100) +# endif +# define COMPILER_VERSION_TWEAK DEC(__apple_build_version__) + +#elif defined(__clang__) && defined(__ARMCOMPILER_VERSION) +# define COMPILER_ID "ARMClang" + # define COMPILER_VERSION_MAJOR DEC(__ARMCOMPILER_VERSION/1000000) + # define COMPILER_VERSION_MINOR DEC(__ARMCOMPILER_VERSION/10000 % 100) + # define COMPILER_VERSION_PATCH DEC(__ARMCOMPILER_VERSION/100 % 100) +# define COMPILER_VERSION_INTERNAL DEC(__ARMCOMPILER_VERSION) + +#elif defined(__clang__) && defined(__ti__) +# define COMPILER_ID "TIClang" + # define COMPILER_VERSION_MAJOR DEC(__ti_major__) + # define COMPILER_VERSION_MINOR DEC(__ti_minor__) + # define COMPILER_VERSION_PATCH DEC(__ti_patchlevel__) +# define COMPILER_VERSION_INTERNAL DEC(__ti_version__) + +#elif defined(__clang__) +# define COMPILER_ID "Clang" +# if defined(_MSC_VER) +# define SIMULATE_ID "MSVC" +# endif +# define COMPILER_VERSION_MAJOR DEC(__clang_major__) +# define COMPILER_VERSION_MINOR DEC(__clang_minor__) +# define COMPILER_VERSION_PATCH DEC(__clang_patchlevel__) +# if defined(_MSC_VER) + /* _MSC_VER = VVRR */ +# define SIMULATE_VERSION_MAJOR DEC(_MSC_VER / 100) +# define SIMULATE_VERSION_MINOR DEC(_MSC_VER % 100) +# endif + +#elif defined(__LCC__) && (defined(__GNUC__) || defined(__GNUG__) || defined(__MCST__)) +# define COMPILER_ID "LCC" +# define COMPILER_VERSION_MAJOR DEC(__LCC__ / 100) +# define COMPILER_VERSION_MINOR DEC(__LCC__ % 100) +# if defined(__LCC_MINOR__) +# define COMPILER_VERSION_PATCH DEC(__LCC_MINOR__) +# endif +# if defined(__GNUC__) && defined(__GNUC_MINOR__) +# define SIMULATE_ID "GNU" +# define SIMULATE_VERSION_MAJOR DEC(__GNUC__) +# define SIMULATE_VERSION_MINOR DEC(__GNUC_MINOR__) +# if defined(__GNUC_PATCHLEVEL__) +# define SIMULATE_VERSION_PATCH DEC(__GNUC_PATCHLEVEL__) +# endif +# endif + +#elif defined(__GNUC__) || defined(__GNUG__) +# define COMPILER_ID "GNU" +# if defined(__GNUC__) +# define COMPILER_VERSION_MAJOR DEC(__GNUC__) +# else +# define COMPILER_VERSION_MAJOR DEC(__GNUG__) +# endif +# if defined(__GNUC_MINOR__) +# define COMPILER_VERSION_MINOR DEC(__GNUC_MINOR__) +# endif +# if defined(__GNUC_PATCHLEVEL__) +# define COMPILER_VERSION_PATCH DEC(__GNUC_PATCHLEVEL__) +# endif + +#elif defined(_MSC_VER) +# define COMPILER_ID "MSVC" + /* _MSC_VER = VVRR */ +# define COMPILER_VERSION_MAJOR DEC(_MSC_VER / 100) +# define COMPILER_VERSION_MINOR DEC(_MSC_VER % 100) +# if defined(_MSC_FULL_VER) +# if _MSC_VER >= 1400 + /* _MSC_FULL_VER = VVRRPPPPP */ +# define COMPILER_VERSION_PATCH DEC(_MSC_FULL_VER % 100000) +# else + /* _MSC_FULL_VER = VVRRPPPP */ +# define COMPILER_VERSION_PATCH DEC(_MSC_FULL_VER % 10000) +# endif +# endif +# if defined(_MSC_BUILD) +# define COMPILER_VERSION_TWEAK DEC(_MSC_BUILD) +# endif + +#elif defined(_ADI_COMPILER) +# define COMPILER_ID "ADSP" +#if defined(__VERSIONNUM__) + /* __VERSIONNUM__ = 0xVVRRPPTT */ +# define COMPILER_VERSION_MAJOR DEC(__VERSIONNUM__ >> 24 & 0xFF) +# define COMPILER_VERSION_MINOR DEC(__VERSIONNUM__ >> 16 & 0xFF) +# define COMPILER_VERSION_PATCH DEC(__VERSIONNUM__ >> 8 & 0xFF) +# define COMPILER_VERSION_TWEAK DEC(__VERSIONNUM__ & 0xFF) +#endif + +#elif defined(__IAR_SYSTEMS_ICC__) || defined(__IAR_SYSTEMS_ICC) +# define COMPILER_ID "IAR" +# if defined(__VER__) && defined(__ICCARM__) +# define COMPILER_VERSION_MAJOR DEC((__VER__) / 1000000) +# define COMPILER_VERSION_MINOR DEC(((__VER__) / 1000) % 1000) +# define COMPILER_VERSION_PATCH DEC((__VER__) % 1000) +# define COMPILER_VERSION_INTERNAL DEC(__IAR_SYSTEMS_ICC__) +# elif defined(__VER__) && (defined(__ICCAVR__) || defined(__ICCRX__) || defined(__ICCRH850__) || defined(__ICCRL78__) || defined(__ICC430__) || defined(__ICCRISCV__) || defined(__ICCV850__) || defined(__ICC8051__) || defined(__ICCSTM8__)) +# define COMPILER_VERSION_MAJOR DEC((__VER__) / 100) +# define COMPILER_VERSION_MINOR DEC((__VER__) - (((__VER__) / 100)*100)) +# define COMPILER_VERSION_PATCH DEC(__SUBVERSION__) +# define COMPILER_VERSION_INTERNAL DEC(__IAR_SYSTEMS_ICC__) +# endif + + +/* These compilers are either not known or too old to define an + identification macro. Try to identify the platform and guess that + it is the native compiler. */ +#elif defined(__hpux) || defined(__hpua) +# define COMPILER_ID "HP" + +#else /* unknown compiler */ +# define COMPILER_ID "" +#endif + +/* Construct the string literal in pieces to prevent the source from + getting matched. Store it in a pointer rather than an array + because some compilers will just produce instructions to fill the + array rather than assigning a pointer to a static array. */ +char const* info_compiler = "INFO" ":" "compiler[" COMPILER_ID "]"; +#ifdef SIMULATE_ID +char const* info_simulate = "INFO" ":" "simulate[" SIMULATE_ID "]"; +#endif + +#ifdef __QNXNTO__ +char const* qnxnto = "INFO" ":" "qnxnto[]"; +#endif + +#if defined(__CRAYXT_COMPUTE_LINUX_TARGET) +char const *info_cray = "INFO" ":" "compiler_wrapper[CrayPrgEnv]"; +#endif + +#define STRINGIFY_HELPER(X) #X +#define STRINGIFY(X) STRINGIFY_HELPER(X) + +/* Identify known platforms by name. */ +#if defined(__linux) || defined(__linux__) || defined(linux) +# define PLATFORM_ID "Linux" + +#elif defined(__MSYS__) +# define PLATFORM_ID "MSYS" + +#elif defined(__CYGWIN__) +# define PLATFORM_ID "Cygwin" + +#elif defined(__MINGW32__) +# define PLATFORM_ID "MinGW" + +#elif defined(__APPLE__) +# define PLATFORM_ID "Darwin" + +#elif defined(_WIN32) || defined(__WIN32__) || defined(WIN32) +# define PLATFORM_ID "Windows" + +#elif defined(__FreeBSD__) || defined(__FreeBSD) +# define PLATFORM_ID "FreeBSD" + +#elif defined(__NetBSD__) || defined(__NetBSD) +# define PLATFORM_ID "NetBSD" + +#elif defined(__OpenBSD__) || defined(__OPENBSD) +# define PLATFORM_ID "OpenBSD" + +#elif defined(__sun) || defined(sun) +# define PLATFORM_ID "SunOS" + +#elif defined(_AIX) || defined(__AIX) || defined(__AIX__) || defined(__aix) || defined(__aix__) +# define PLATFORM_ID "AIX" + +#elif defined(__hpux) || defined(__hpux__) +# define PLATFORM_ID "HP-UX" + +#elif defined(__HAIKU__) +# define PLATFORM_ID "Haiku" + +#elif defined(__BeOS) || defined(__BEOS__) || defined(_BEOS) +# define PLATFORM_ID "BeOS" + +#elif defined(__QNX__) || defined(__QNXNTO__) +# define PLATFORM_ID "QNX" + +#elif defined(__tru64) || defined(_tru64) || defined(__TRU64__) +# define PLATFORM_ID "Tru64" + +#elif defined(__riscos) || defined(__riscos__) +# define PLATFORM_ID "RISCos" + +#elif defined(__sinix) || defined(__sinix__) || defined(__SINIX__) +# define PLATFORM_ID "SINIX" + +#elif defined(__UNIX_SV__) +# define PLATFORM_ID "UNIX_SV" + +#elif defined(__bsdos__) +# define PLATFORM_ID "BSDOS" + +#elif defined(_MPRAS) || defined(MPRAS) +# define PLATFORM_ID "MP-RAS" + +#elif defined(__osf) || defined(__osf__) +# define PLATFORM_ID "OSF1" + +#elif defined(_SCO_SV) || defined(SCO_SV) || defined(sco_sv) +# define PLATFORM_ID "SCO_SV" + +#elif defined(__ultrix) || defined(__ultrix__) || defined(_ULTRIX) +# define PLATFORM_ID "ULTRIX" + +#elif defined(__XENIX__) || defined(_XENIX) || defined(XENIX) +# define PLATFORM_ID "Xenix" + +#elif defined(__WATCOMC__) +# if defined(__LINUX__) +# define PLATFORM_ID "Linux" + +# elif defined(__DOS__) +# define PLATFORM_ID "DOS" + +# elif defined(__OS2__) +# define PLATFORM_ID "OS2" + +# elif defined(__WINDOWS__) +# define PLATFORM_ID "Windows3x" + +# elif defined(__VXWORKS__) +# define PLATFORM_ID "VxWorks" + +# else /* unknown platform */ +# define PLATFORM_ID +# endif + +#elif defined(__INTEGRITY) +# if defined(INT_178B) +# define PLATFORM_ID "Integrity178" + +# else /* regular Integrity */ +# define PLATFORM_ID "Integrity" +# endif + +# elif defined(_ADI_COMPILER) +# define PLATFORM_ID "ADSP" + +#else /* unknown platform */ +# define PLATFORM_ID + +#endif + +/* For windows compilers MSVC and Intel we can determine + the architecture of the compiler being used. This is because + the compilers do not have flags that can change the architecture, + but rather depend on which compiler is being used +*/ +#if defined(_WIN32) && defined(_MSC_VER) +# if defined(_M_IA64) +# define ARCHITECTURE_ID "IA64" + +# elif defined(_M_ARM64EC) +# define ARCHITECTURE_ID "ARM64EC" + +# elif defined(_M_X64) || defined(_M_AMD64) +# define ARCHITECTURE_ID "x64" + +# elif defined(_M_IX86) +# define ARCHITECTURE_ID "X86" + +# elif defined(_M_ARM64) +# define ARCHITECTURE_ID "ARM64" + +# elif defined(_M_ARM) +# if _M_ARM == 4 +# define ARCHITECTURE_ID "ARMV4I" +# elif _M_ARM == 5 +# define ARCHITECTURE_ID "ARMV5I" +# else +# define ARCHITECTURE_ID "ARMV" STRINGIFY(_M_ARM) +# endif + +# elif defined(_M_MIPS) +# define ARCHITECTURE_ID "MIPS" + +# elif defined(_M_SH) +# define ARCHITECTURE_ID "SHx" + +# else /* unknown architecture */ +# define ARCHITECTURE_ID "" +# endif + +#elif defined(__WATCOMC__) +# if defined(_M_I86) +# define ARCHITECTURE_ID "I86" + +# elif defined(_M_IX86) +# define ARCHITECTURE_ID "X86" + +# else /* unknown architecture */ +# define ARCHITECTURE_ID "" +# endif + +#elif defined(__IAR_SYSTEMS_ICC__) || defined(__IAR_SYSTEMS_ICC) +# if defined(__ICCARM__) +# define ARCHITECTURE_ID "ARM" + +# elif defined(__ICCRX__) +# define ARCHITECTURE_ID "RX" + +# elif defined(__ICCRH850__) +# define ARCHITECTURE_ID "RH850" + +# elif defined(__ICCRL78__) +# define ARCHITECTURE_ID "RL78" + +# elif defined(__ICCRISCV__) +# define ARCHITECTURE_ID "RISCV" + +# elif defined(__ICCAVR__) +# define ARCHITECTURE_ID "AVR" + +# elif defined(__ICC430__) +# define ARCHITECTURE_ID "MSP430" + +# elif defined(__ICCV850__) +# define ARCHITECTURE_ID "V850" + +# elif defined(__ICC8051__) +# define ARCHITECTURE_ID "8051" + +# elif defined(__ICCSTM8__) +# define ARCHITECTURE_ID "STM8" + +# else /* unknown architecture */ +# define ARCHITECTURE_ID "" +# endif + +#elif defined(__ghs__) +# if defined(__PPC64__) +# define ARCHITECTURE_ID "PPC64" + +# elif defined(__ppc__) +# define ARCHITECTURE_ID "PPC" + +# elif defined(__ARM__) +# define ARCHITECTURE_ID "ARM" + +# elif defined(__x86_64__) +# define ARCHITECTURE_ID "x64" + +# elif defined(__i386__) +# define ARCHITECTURE_ID "X86" + +# else /* unknown architecture */ +# define ARCHITECTURE_ID "" +# endif + +#elif defined(__clang__) && defined(__ti__) +# if defined(__ARM_ARCH) +# define ARCHITECTURE_ID "Arm" + +# else /* unknown architecture */ +# define ARCHITECTURE_ID "" +# endif + +#elif defined(__TI_COMPILER_VERSION__) +# if defined(__TI_ARM__) +# define ARCHITECTURE_ID "ARM" + +# elif defined(__MSP430__) +# define ARCHITECTURE_ID "MSP430" + +# elif defined(__TMS320C28XX__) +# define ARCHITECTURE_ID "TMS320C28x" + +# elif defined(__TMS320C6X__) || defined(_TMS320C6X) +# define ARCHITECTURE_ID "TMS320C6x" + +# else /* unknown architecture */ +# define ARCHITECTURE_ID "" +# endif + +# elif defined(__ADSPSHARC__) +# define ARCHITECTURE_ID "SHARC" + +# elif defined(__ADSPBLACKFIN__) +# define ARCHITECTURE_ID "Blackfin" + +#elif defined(__TASKING__) + +# if defined(__CTC__) || defined(__CPTC__) +# define ARCHITECTURE_ID "TriCore" + +# elif defined(__CMCS__) +# define ARCHITECTURE_ID "MCS" + +# elif defined(__CARM__) +# define ARCHITECTURE_ID "ARM" + +# elif defined(__CARC__) +# define ARCHITECTURE_ID "ARC" + +# elif defined(__C51__) +# define ARCHITECTURE_ID "8051" + +# elif defined(__CPCP__) +# define ARCHITECTURE_ID "PCP" + +# else +# define ARCHITECTURE_ID "" +# endif + +#else +# define ARCHITECTURE_ID +#endif + +/* Convert integer to decimal digit literals. */ +#define DEC(n) \ + ('0' + (((n) / 10000000)%10)), \ + ('0' + (((n) / 1000000)%10)), \ + ('0' + (((n) / 100000)%10)), \ + ('0' + (((n) / 10000)%10)), \ + ('0' + (((n) / 1000)%10)), \ + ('0' + (((n) / 100)%10)), \ + ('0' + (((n) / 10)%10)), \ + ('0' + ((n) % 10)) + +/* Convert integer to hex digit literals. */ +#define HEX(n) \ + ('0' + ((n)>>28 & 0xF)), \ + ('0' + ((n)>>24 & 0xF)), \ + ('0' + ((n)>>20 & 0xF)), \ + ('0' + ((n)>>16 & 0xF)), \ + ('0' + ((n)>>12 & 0xF)), \ + ('0' + ((n)>>8 & 0xF)), \ + ('0' + ((n)>>4 & 0xF)), \ + ('0' + ((n) & 0xF)) + +/* Construct a string literal encoding the version number. */ +#ifdef COMPILER_VERSION +char const* info_version = "INFO" ":" "compiler_version[" COMPILER_VERSION "]"; + +/* Construct a string literal encoding the version number components. */ +#elif defined(COMPILER_VERSION_MAJOR) +char const info_version[] = { + 'I', 'N', 'F', 'O', ':', + 'c','o','m','p','i','l','e','r','_','v','e','r','s','i','o','n','[', + COMPILER_VERSION_MAJOR, +# ifdef COMPILER_VERSION_MINOR + '.', COMPILER_VERSION_MINOR, +# ifdef COMPILER_VERSION_PATCH + '.', COMPILER_VERSION_PATCH, +# ifdef COMPILER_VERSION_TWEAK + '.', COMPILER_VERSION_TWEAK, +# endif +# endif +# endif + ']','\0'}; +#endif + +/* Construct a string literal encoding the internal version number. */ +#ifdef COMPILER_VERSION_INTERNAL +char const info_version_internal[] = { + 'I', 'N', 'F', 'O', ':', + 'c','o','m','p','i','l','e','r','_','v','e','r','s','i','o','n','_', + 'i','n','t','e','r','n','a','l','[', + COMPILER_VERSION_INTERNAL,']','\0'}; +#elif defined(COMPILER_VERSION_INTERNAL_STR) +char const* info_version_internal = "INFO" ":" "compiler_version_internal[" COMPILER_VERSION_INTERNAL_STR "]"; +#endif + +/* Construct a string literal encoding the version number components. */ +#ifdef SIMULATE_VERSION_MAJOR +char const info_simulate_version[] = { + 'I', 'N', 'F', 'O', ':', + 's','i','m','u','l','a','t','e','_','v','e','r','s','i','o','n','[', + SIMULATE_VERSION_MAJOR, +# ifdef SIMULATE_VERSION_MINOR + '.', SIMULATE_VERSION_MINOR, +# ifdef SIMULATE_VERSION_PATCH + '.', SIMULATE_VERSION_PATCH, +# ifdef SIMULATE_VERSION_TWEAK + '.', SIMULATE_VERSION_TWEAK, +# endif +# endif +# endif + ']','\0'}; +#endif + +/* Construct the string literal in pieces to prevent the source from + getting matched. Store it in a pointer rather than an array + because some compilers will just produce instructions to fill the + array rather than assigning a pointer to a static array. */ +char const* info_platform = "INFO" ":" "platform[" PLATFORM_ID "]"; +char const* info_arch = "INFO" ":" "arch[" ARCHITECTURE_ID "]"; + + + +#define CXX_STD_98 199711L +#define CXX_STD_11 201103L +#define CXX_STD_14 201402L +#define CXX_STD_17 201703L +#define CXX_STD_20 202002L +#define CXX_STD_23 202302L + +#if defined(__INTEL_COMPILER) && defined(_MSVC_LANG) +# if _MSVC_LANG > CXX_STD_17 +# define CXX_STD _MSVC_LANG +# elif _MSVC_LANG == CXX_STD_17 && defined(__cpp_aggregate_paren_init) +# define CXX_STD CXX_STD_20 +# elif _MSVC_LANG > CXX_STD_14 && __cplusplus > CXX_STD_17 +# define CXX_STD CXX_STD_20 +# elif _MSVC_LANG > CXX_STD_14 +# define CXX_STD CXX_STD_17 +# elif defined(__INTEL_CXX11_MODE__) && defined(__cpp_aggregate_nsdmi) +# define CXX_STD CXX_STD_14 +# elif defined(__INTEL_CXX11_MODE__) +# define CXX_STD CXX_STD_11 +# else +# define CXX_STD CXX_STD_98 +# endif +#elif defined(_MSC_VER) && defined(_MSVC_LANG) +# if _MSVC_LANG > __cplusplus +# define CXX_STD _MSVC_LANG +# else +# define CXX_STD __cplusplus +# endif +#elif defined(__NVCOMPILER) +# if __cplusplus == CXX_STD_17 && defined(__cpp_aggregate_paren_init) +# define CXX_STD CXX_STD_20 +# else +# define CXX_STD __cplusplus +# endif +#elif defined(__INTEL_COMPILER) || defined(__PGI) +# if __cplusplus == CXX_STD_11 && defined(__cpp_namespace_attributes) +# define CXX_STD CXX_STD_17 +# elif __cplusplus == CXX_STD_11 && defined(__cpp_aggregate_nsdmi) +# define CXX_STD CXX_STD_14 +# else +# define CXX_STD __cplusplus +# endif +#elif (defined(__IBMCPP__) || defined(__ibmxl__)) && defined(__linux__) +# if __cplusplus == CXX_STD_11 && defined(__cpp_aggregate_nsdmi) +# define CXX_STD CXX_STD_14 +# else +# define CXX_STD __cplusplus +# endif +#elif __cplusplus == 1 && defined(__GXX_EXPERIMENTAL_CXX0X__) +# define CXX_STD CXX_STD_11 +#else +# define CXX_STD __cplusplus +#endif + +const char* info_language_standard_default = "INFO" ":" "standard_default[" +#if CXX_STD > CXX_STD_23 + "26" +#elif CXX_STD > CXX_STD_20 + "23" +#elif CXX_STD > CXX_STD_17 + "20" +#elif CXX_STD > CXX_STD_14 + "17" +#elif CXX_STD > CXX_STD_11 + "14" +#elif CXX_STD >= CXX_STD_11 + "11" +#else + "98" +#endif +"]"; + +const char* info_language_extensions_default = "INFO" ":" "extensions_default[" +#if (defined(__clang__) || defined(__GNUC__) || defined(__xlC__) || \ + defined(__TI_COMPILER_VERSION__)) && \ + !defined(__STRICT_ANSI__) + "ON" +#else + "OFF" +#endif +"]"; + +/*--------------------------------------------------------------------------*/ + +int main(int argc, char* argv[]) +{ + int require = 0; + require += info_compiler[argc]; + require += info_platform[argc]; + require += info_arch[argc]; +#ifdef COMPILER_VERSION_MAJOR + require += info_version[argc]; +#endif +#ifdef COMPILER_VERSION_INTERNAL + require += info_version_internal[argc]; +#endif +#ifdef SIMULATE_ID + require += info_simulate[argc]; +#endif +#ifdef SIMULATE_VERSION_MAJOR + require += info_simulate_version[argc]; +#endif +#if defined(__CRAYXT_COMPUTE_LINUX_TARGET) + require += info_cray[argc]; +#endif + require += info_language_standard_default[argc]; + require += info_language_extensions_default[argc]; + (void)argv; + return require; +} diff --git a/siro_rider/android/app/.cxx/Debug/3p4b322x/x86_64/CMakeFiles/3.31.5-g6cf5163/CompilerIdCXX/CMakeCXXCompilerId.o b/siro_rider/android/app/.cxx/Debug/3p4b322x/x86_64/CMakeFiles/3.31.5-g6cf5163/CompilerIdCXX/CMakeCXXCompilerId.o new file mode 100644 index 0000000..506d032 Binary files /dev/null and b/siro_rider/android/app/.cxx/Debug/3p4b322x/x86_64/CMakeFiles/3.31.5-g6cf5163/CompilerIdCXX/CMakeCXXCompilerId.o differ diff --git a/siro_rider/android/app/.cxx/Debug/3p4b322x/x86_64/CMakeFiles/CMakeConfigureLog.yaml b/siro_rider/android/app/.cxx/Debug/3p4b322x/x86_64/CMakeFiles/CMakeConfigureLog.yaml new file mode 100644 index 0000000..2f7641c --- /dev/null +++ b/siro_rider/android/app/.cxx/Debug/3p4b322x/x86_64/CMakeFiles/CMakeConfigureLog.yaml @@ -0,0 +1,399 @@ + +--- +events: + - + kind: "message-v1" + backtrace: + - "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeDetermineSystem.cmake:200 (message)" + - "CMakeLists.txt:2 (project)" + message: | + The target system is: Android - 1 - x86_64 + The host system is: Darwin - 24.5.0 - arm64 + - + kind: "message-v1" + backtrace: + - "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeDetermineCompilerId.cmake:17 (message)" + - "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeDetermineCompilerId.cmake:64 (__determine_compiler_id_test)" + - "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeDetermineCCompiler.cmake:123 (CMAKE_DETERMINE_COMPILER_ID)" + - "CMakeLists.txt:2 (project)" + message: | + Compiling the C compiler identification source file "CMakeCCompilerId.c" succeeded. + Compiler: /Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/bin/clang + Build flags: -g;-DANDROID;-fdata-sections;-ffunction-sections;-funwind-tables;-fstack-protector-strong;-no-canonical-prefixes;-D_FORTIFY_SOURCE=2;-Wformat;-Werror=format-security + Id flags: -c;--target=x86_64-none-linux-android23 + + The output was: + 0 + + + Compilation of the C compiler identification source "CMakeCCompilerId.c" produced "CMakeCCompilerId.o" + + The C compiler identification is Clang, found in: + /Users/hamzaaleghwairyeen/development/App/Intaleq/android/app/.cxx/Debug/3p4b322x/x86_64/CMakeFiles/3.31.5-g6cf5163/CompilerIdC/CMakeCCompilerId.o + + - + kind: "message-v1" + backtrace: + - "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeDetermineCompilerId.cmake:17 (message)" + - "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeDetermineCompilerId.cmake:64 (__determine_compiler_id_test)" + - "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeDetermineCXXCompiler.cmake:126 (CMAKE_DETERMINE_COMPILER_ID)" + - "CMakeLists.txt:2 (project)" + message: | + Compiling the CXX compiler identification source file "CMakeCXXCompilerId.cpp" succeeded. + Compiler: /Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/bin/clang++ + Build flags: -g;-DANDROID;-fdata-sections;-ffunction-sections;-funwind-tables;-fstack-protector-strong;-no-canonical-prefixes;-D_FORTIFY_SOURCE=2;-Wformat;-Werror=format-security + Id flags: -c;--target=x86_64-none-linux-android23 + + The output was: + 0 + + + Compilation of the CXX compiler identification source "CMakeCXXCompilerId.cpp" produced "CMakeCXXCompilerId.o" + + The CXX compiler identification is Clang, found in: + /Users/hamzaaleghwairyeen/development/App/Intaleq/android/app/.cxx/Debug/3p4b322x/x86_64/CMakeFiles/3.31.5-g6cf5163/CompilerIdCXX/CMakeCXXCompilerId.o + + - + kind: "try_compile-v1" + backtrace: + - "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeDetermineCompilerABI.cmake:74 (try_compile)" + - "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeTestCCompiler.cmake:26 (CMAKE_DETERMINE_COMPILER_ABI)" + - "CMakeLists.txt:2 (project)" + checks: + - "Detecting C compiler ABI info" + directories: + source: "/Users/hamzaaleghwairyeen/development/App/Intaleq/android/app/.cxx/Debug/3p4b322x/x86_64/CMakeFiles/CMakeScratch/TryCompile-YKjDo7" + binary: "/Users/hamzaaleghwairyeen/development/App/Intaleq/android/app/.cxx/Debug/3p4b322x/x86_64/CMakeFiles/CMakeScratch/TryCompile-YKjDo7" + cmakeVariables: + ANDROID_ABI: "x86_64" + ANDROID_ARM_MODE: "thumb" + ANDROID_PIE: "TRUE" + ANDROID_PLATFORM: "android-23" + ANDROID_STL: "c++_static" + ANDROID_TOOLCHAIN: "clang" + CMAKE_CXX_COMPILER_CLANG_SCAN_DEPS: "/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/bin/clang-scan-deps" + CMAKE_CXX_COMPILER_TARGET: "x86_64-none-linux-android23" + CMAKE_C_COMPILER_TARGET: "x86_64-none-linux-android23" + CMAKE_C_FLAGS: "-g -DANDROID -fdata-sections -ffunction-sections -funwind-tables -fstack-protector-strong -no-canonical-prefixes -D_FORTIFY_SOURCE=2 -Wformat " + CMAKE_C_FLAGS_DEBUG: "-fno-limit-debug-info " + CMAKE_EXE_LINKER_FLAGS: "-static-libstdc++ -Wl,--build-id=sha1 -Wl,--no-rosegment -Wl,--no-undefined-version -Wl,--fatal-warnings -Wl,--no-undefined -Qunused-arguments " + CMAKE_POSITION_INDEPENDENT_CODE: "TRUE" + CMAKE_SYSROOT: "/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot" + buildResult: + variable: "CMAKE_C_ABI_COMPILED" + cached: true + stdout: | + Change Dir: '/Users/hamzaaleghwairyeen/development/App/Intaleq/android/app/.cxx/Debug/3p4b322x/x86_64/CMakeFiles/CMakeScratch/TryCompile-YKjDo7' + + Run Build Command(s): /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/bin/ninja -v cmTC_25997 + [1/2] /Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/bin/clang --target=x86_64-none-linux-android23 --sysroot=/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot -g -DANDROID -fdata-sections -ffunction-sections -funwind-tables -fstack-protector-strong -no-canonical-prefixes -D_FORTIFY_SOURCE=2 -Wformat -fPIE -v -MD -MT CMakeFiles/cmTC_25997.dir/CMakeCCompilerABI.c.o -MF CMakeFiles/cmTC_25997.dir/CMakeCCompilerABI.c.o.d -o CMakeFiles/cmTC_25997.dir/CMakeCCompilerABI.c.o -c /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeCCompilerABI.c + Android (12027248, +pgo, -bolt, +lto, -mlgo, based on r522817) clang version 18.0.1 (https://android.googlesource.com/toolchain/llvm-project d8003a456d14a3deb8054cdaa529ffbf02d9b262) + Target: x86_64-none-linux-android23 + Thread model: posix + InstalledDir: /Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/bin + (in-process) + "/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/bin/clang" -cc1 -triple x86_64-none-linux-android23 -emit-obj -mrelax-all -disable-free -clear-ast-before-backend -disable-llvm-verifier -discard-value-names -main-file-name CMakeCCompilerABI.c -mrelocation-model pic -pic-level 2 -pic-is-pie -mframe-pointer=all -ffp-contract=on -fno-rounding-math -mconstructor-aliases -funwind-tables=2 -target-cpu x86-64 -target-feature +sse4.2 -target-feature +popcnt -target-feature +cx16 -tune-cpu generic -debug-info-kind=constructor -dwarf-version=4 -debugger-tuning=gdb -fdebug-compilation-dir=/Users/hamzaaleghwairyeen/development/App/Intaleq/android/app/.cxx/Debug/3p4b322x/x86_64/CMakeFiles/CMakeScratch/TryCompile-YKjDo7 -v -ffunction-sections -fdata-sections -fcoverage-compilation-dir=/Users/hamzaaleghwairyeen/development/App/Intaleq/android/app/.cxx/Debug/3p4b322x/x86_64/CMakeFiles/CMakeScratch/TryCompile-YKjDo7 -resource-dir /Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/lib/clang/18 -dependency-file CMakeFiles/cmTC_25997.dir/CMakeCCompilerABI.c.o.d -MT CMakeFiles/cmTC_25997.dir/CMakeCCompilerABI.c.o -sys-header-deps -D ANDROID -D _FORTIFY_SOURCE=2 -isysroot /Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot -internal-isystem /Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/lib/clang/18/include -internal-isystem /Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/local/include -internal-externc-isystem /Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/include/x86_64-linux-android -internal-externc-isystem /Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/include -internal-externc-isystem /Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/include -Wformat -ferror-limit 19 -femulated-tls -stack-protector 2 -fgnuc-version=4.2.1 -D__GCC_HAVE_DWARF2_CFI_ASM=1 -o CMakeFiles/cmTC_25997.dir/CMakeCCompilerABI.c.o -x c /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeCCompilerABI.c + clang -cc1 version 18.0.1 based upon LLVM 18.0.1 default target x86_64-apple-darwin24.5.0 + ignoring nonexistent directory "/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/local/include" + ignoring nonexistent directory "/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/include" + #include "..." search starts here: + #include <...> search starts here: + /Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/lib/clang/18/include + /Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/include/x86_64-linux-android + /Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/include + End of search list. + [2/2] : && /Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/bin/clang --target=x86_64-none-linux-android23 --sysroot=/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot -g -DANDROID -fdata-sections -ffunction-sections -funwind-tables -fstack-protector-strong -no-canonical-prefixes -D_FORTIFY_SOURCE=2 -Wformat -static-libstdc++ -Wl,--build-id=sha1 -Wl,--no-rosegment -Wl,--no-undefined-version -Wl,--fatal-warnings -Wl,--no-undefined -Qunused-arguments -v CMakeFiles/cmTC_25997.dir/CMakeCCompilerABI.c.o -o cmTC_25997 && : + Android (12027248, +pgo, -bolt, +lto, -mlgo, based on r522817) clang version 18.0.1 (https://android.googlesource.com/toolchain/llvm-project d8003a456d14a3deb8054cdaa529ffbf02d9b262) + Target: x86_64-none-linux-android23 + Thread model: posix + InstalledDir: /Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/bin + "/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/bin/ld.lld" --sysroot=/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot -z now -z relro --hash-style=gnu --eh-frame-hdr -m elf_x86_64 -pie -dynamic-linker /system/bin/linker64 -o cmTC_25997 /Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/lib/x86_64-linux-android/23/crtbegin_dynamic.o -L/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/lib/clang/18/lib/linux/x86_64 -L/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/lib/x86_64-linux-android/23 -L/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/lib/x86_64-linux-android -L/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/lib --build-id=sha1 --no-rosegment --no-undefined-version --fatal-warnings --no-undefined CMakeFiles/cmTC_25997.dir/CMakeCCompilerABI.c.o /Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/lib/clang/18/lib/linux/libclang_rt.builtins-x86_64-android.a -l:libunwind.a -ldl -lc /Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/lib/clang/18/lib/linux/libclang_rt.builtins-x86_64-android.a -l:libunwind.a -ldl /Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/lib/x86_64-linux-android/23/crtend_android.o + + exitCode: 0 + - + kind: "message-v1" + backtrace: + - "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeDetermineCompilerABI.cmake:182 (message)" + - "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeTestCCompiler.cmake:26 (CMAKE_DETERMINE_COMPILER_ABI)" + - "CMakeLists.txt:2 (project)" + message: | + Parsed C implicit include dir info: rv=done + found start of include info + found start of implicit include info + add: [/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/lib/clang/18/include] + add: [/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/include/x86_64-linux-android] + add: [/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/include] + end of search list found + collapse include dir [/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/lib/clang/18/include] ==> [/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/lib/clang/18/include] + collapse include dir [/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/include/x86_64-linux-android] ==> [/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/include/x86_64-linux-android] + collapse include dir [/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/include] ==> [/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/include] + implicit include dirs: [/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/lib/clang/18/include;/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/include/x86_64-linux-android;/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/include] + + + - + kind: "message-v1" + backtrace: + - "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeDetermineCompilerABI.cmake:218 (message)" + - "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeTestCCompiler.cmake:26 (CMAKE_DETERMINE_COMPILER_ABI)" + - "CMakeLists.txt:2 (project)" + message: | + Parsed C implicit link information: + link line regex: [^( *|.*[/\\])(ld[0-9]*(\\.[a-z]+)?|CMAKE_LINK_STARTFILE-NOTFOUND|([^/\\]+-)?ld|collect2)[^/\\]*( |$)] + linker tool regex: [^[ ]*(->|")?[ ]*(([^"]*[/\\])?(ld[0-9]*(\\.[a-z]+)?))("|,| |$)] + ignore line: [Change Dir: '/Users/hamzaaleghwairyeen/development/App/Intaleq/android/app/.cxx/Debug/3p4b322x/x86_64/CMakeFiles/CMakeScratch/TryCompile-YKjDo7'] + ignore line: [] + ignore line: [Run Build Command(s): /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/bin/ninja -v cmTC_25997] + ignore line: [[1/2] /Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/bin/clang --target=x86_64-none-linux-android23 --sysroot=/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot -g -DANDROID -fdata-sections -ffunction-sections -funwind-tables -fstack-protector-strong -no-canonical-prefixes -D_FORTIFY_SOURCE=2 -Wformat -fPIE -v -MD -MT CMakeFiles/cmTC_25997.dir/CMakeCCompilerABI.c.o -MF CMakeFiles/cmTC_25997.dir/CMakeCCompilerABI.c.o.d -o CMakeFiles/cmTC_25997.dir/CMakeCCompilerABI.c.o -c /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeCCompilerABI.c] + ignore line: [Android (12027248 +pgo -bolt +lto -mlgo based on r522817) clang version 18.0.1 (https://android.googlesource.com/toolchain/llvm-project d8003a456d14a3deb8054cdaa529ffbf02d9b262)] + ignore line: [Target: x86_64-none-linux-android23] + ignore line: [Thread model: posix] + ignore line: [InstalledDir: /Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/bin] + ignore line: [ (in-process)] + ignore line: [ "/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/bin/clang" -cc1 -triple x86_64-none-linux-android23 -emit-obj -mrelax-all -disable-free -clear-ast-before-backend -disable-llvm-verifier -discard-value-names -main-file-name CMakeCCompilerABI.c -mrelocation-model pic -pic-level 2 -pic-is-pie -mframe-pointer=all -ffp-contract=on -fno-rounding-math -mconstructor-aliases -funwind-tables=2 -target-cpu x86-64 -target-feature +sse4.2 -target-feature +popcnt -target-feature +cx16 -tune-cpu generic -debug-info-kind=constructor -dwarf-version=4 -debugger-tuning=gdb -fdebug-compilation-dir=/Users/hamzaaleghwairyeen/development/App/Intaleq/android/app/.cxx/Debug/3p4b322x/x86_64/CMakeFiles/CMakeScratch/TryCompile-YKjDo7 -v -ffunction-sections -fdata-sections -fcoverage-compilation-dir=/Users/hamzaaleghwairyeen/development/App/Intaleq/android/app/.cxx/Debug/3p4b322x/x86_64/CMakeFiles/CMakeScratch/TryCompile-YKjDo7 -resource-dir /Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/lib/clang/18 -dependency-file CMakeFiles/cmTC_25997.dir/CMakeCCompilerABI.c.o.d -MT CMakeFiles/cmTC_25997.dir/CMakeCCompilerABI.c.o -sys-header-deps -D ANDROID -D _FORTIFY_SOURCE=2 -isysroot /Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot -internal-isystem /Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/lib/clang/18/include -internal-isystem /Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/local/include -internal-externc-isystem /Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/include/x86_64-linux-android -internal-externc-isystem /Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/include -internal-externc-isystem /Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/include -Wformat -ferror-limit 19 -femulated-tls -stack-protector 2 -fgnuc-version=4.2.1 -D__GCC_HAVE_DWARF2_CFI_ASM=1 -o CMakeFiles/cmTC_25997.dir/CMakeCCompilerABI.c.o -x c /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeCCompilerABI.c] + ignore line: [clang -cc1 version 18.0.1 based upon LLVM 18.0.1 default target x86_64-apple-darwin24.5.0] + ignore line: [ignoring nonexistent directory "/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/local/include"] + ignore line: [ignoring nonexistent directory "/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/include"] + ignore line: [#include "..." search starts here:] + ignore line: [#include <...> search starts here:] + ignore line: [ /Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/lib/clang/18/include] + ignore line: [ /Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/include/x86_64-linux-android] + ignore line: [ /Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/include] + ignore line: [End of search list.] + ignore line: [[2/2] : && /Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/bin/clang --target=x86_64-none-linux-android23 --sysroot=/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot -g -DANDROID -fdata-sections -ffunction-sections -funwind-tables -fstack-protector-strong -no-canonical-prefixes -D_FORTIFY_SOURCE=2 -Wformat -static-libstdc++ -Wl --build-id=sha1 -Wl --no-rosegment -Wl --no-undefined-version -Wl --fatal-warnings -Wl --no-undefined -Qunused-arguments -v CMakeFiles/cmTC_25997.dir/CMakeCCompilerABI.c.o -o cmTC_25997 && :] + ignore line: [Android (12027248 +pgo -bolt +lto -mlgo based on r522817) clang version 18.0.1 (https://android.googlesource.com/toolchain/llvm-project d8003a456d14a3deb8054cdaa529ffbf02d9b262)] + ignore line: [Target: x86_64-none-linux-android23] + ignore line: [Thread model: posix] + ignore line: [InstalledDir: /Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/bin] + link line: [ "/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/bin/ld.lld" --sysroot=/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot -z now -z relro --hash-style=gnu --eh-frame-hdr -m elf_x86_64 -pie -dynamic-linker /system/bin/linker64 -o cmTC_25997 /Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/lib/x86_64-linux-android/23/crtbegin_dynamic.o -L/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/lib/clang/18/lib/linux/x86_64 -L/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/lib/x86_64-linux-android/23 -L/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/lib/x86_64-linux-android -L/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/lib --build-id=sha1 --no-rosegment --no-undefined-version --fatal-warnings --no-undefined CMakeFiles/cmTC_25997.dir/CMakeCCompilerABI.c.o /Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/lib/clang/18/lib/linux/libclang_rt.builtins-x86_64-android.a -l:libunwind.a -ldl -lc /Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/lib/clang/18/lib/linux/libclang_rt.builtins-x86_64-android.a -l:libunwind.a -ldl /Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/lib/x86_64-linux-android/23/crtend_android.o] + arg [/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/bin/ld.lld] ==> ignore + arg [--sysroot=/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot] ==> ignore + arg [-znow] ==> ignore + arg [-zrelro] ==> ignore + arg [--hash-style=gnu] ==> ignore + arg [--eh-frame-hdr] ==> ignore + arg [-m] ==> ignore + arg [elf_x86_64] ==> ignore + arg [-pie] ==> ignore + arg [-dynamic-linker] ==> ignore + arg [/system/bin/linker64] ==> ignore + arg [-o] ==> ignore + arg [cmTC_25997] ==> ignore + arg [/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/lib/x86_64-linux-android/23/crtbegin_dynamic.o] ==> obj [/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/lib/x86_64-linux-android/23/crtbegin_dynamic.o] + arg [-L/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/lib/clang/18/lib/linux/x86_64] ==> dir [/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/lib/clang/18/lib/linux/x86_64] + arg [-L/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/lib/x86_64-linux-android/23] ==> dir [/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/lib/x86_64-linux-android/23] + arg [-L/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/lib/x86_64-linux-android] ==> dir [/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/lib/x86_64-linux-android] + arg [-L/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/lib] ==> dir [/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/lib] + arg [--build-id=sha1] ==> ignore + arg [--no-rosegment] ==> ignore + arg [--no-undefined-version] ==> ignore + arg [--fatal-warnings] ==> ignore + arg [--no-undefined] ==> ignore + arg [CMakeFiles/cmTC_25997.dir/CMakeCCompilerABI.c.o] ==> ignore + arg [/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/lib/clang/18/lib/linux/libclang_rt.builtins-x86_64-android.a] ==> lib [/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/lib/clang/18/lib/linux/libclang_rt.builtins-x86_64-android.a] + arg [-l:libunwind.a] ==> lib [-l:libunwind.a] + arg [-ldl] ==> lib [dl] + arg [-lc] ==> lib [c] + arg [/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/lib/clang/18/lib/linux/libclang_rt.builtins-x86_64-android.a] ==> lib [/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/lib/clang/18/lib/linux/libclang_rt.builtins-x86_64-android.a] + arg [-l:libunwind.a] ==> lib [-l:libunwind.a] + arg [-ldl] ==> lib [dl] + arg [/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/lib/x86_64-linux-android/23/crtend_android.o] ==> obj [/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/lib/x86_64-linux-android/23/crtend_android.o] + linker tool for 'C': /Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/bin/ld.lld + remove lib [/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/lib/clang/18/lib/linux/libclang_rt.builtins-x86_64-android.a] + remove lib [/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/lib/clang/18/lib/linux/libclang_rt.builtins-x86_64-android.a] + collapse library dir [/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/lib/clang/18/lib/linux/x86_64] ==> [/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/lib/clang/18/lib/linux/x86_64] + collapse library dir [/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/lib/x86_64-linux-android/23] ==> [/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/lib/x86_64-linux-android/23] + collapse library dir [/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/lib/x86_64-linux-android] ==> [/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/lib/x86_64-linux-android] + collapse library dir [/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/lib] ==> [/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/lib] + implicit libs: [-l:libunwind.a;dl;c;-l:libunwind.a;dl] + implicit objs: [/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/lib/x86_64-linux-android/23/crtbegin_dynamic.o;/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/lib/x86_64-linux-android/23/crtend_android.o] + implicit dirs: [/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/lib/clang/18/lib/linux/x86_64;/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/lib/x86_64-linux-android/23;/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/lib/x86_64-linux-android;/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/lib] + implicit fwks: [] + + + - + kind: "message-v1" + backtrace: + - "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Internal/CMakeDetermineLinkerId.cmake:40 (message)" + - "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeDetermineCompilerABI.cmake:255 (cmake_determine_linker_id)" + - "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeTestCCompiler.cmake:26 (CMAKE_DETERMINE_COMPILER_ABI)" + - "CMakeLists.txt:2 (project)" + message: | + Running the C compiler's linker: "/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/bin/ld.lld" "-v" + LLD 18.0.1 (compatible with GNU linkers) + - + kind: "try_compile-v1" + backtrace: + - "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeDetermineCompilerABI.cmake:74 (try_compile)" + - "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeTestCXXCompiler.cmake:26 (CMAKE_DETERMINE_COMPILER_ABI)" + - "CMakeLists.txt:2 (project)" + checks: + - "Detecting CXX compiler ABI info" + directories: + source: "/Users/hamzaaleghwairyeen/development/App/Intaleq/android/app/.cxx/Debug/3p4b322x/x86_64/CMakeFiles/CMakeScratch/TryCompile-u68p6j" + binary: "/Users/hamzaaleghwairyeen/development/App/Intaleq/android/app/.cxx/Debug/3p4b322x/x86_64/CMakeFiles/CMakeScratch/TryCompile-u68p6j" + cmakeVariables: + ANDROID_ABI: "x86_64" + ANDROID_ARM_MODE: "thumb" + ANDROID_PIE: "TRUE" + ANDROID_PLATFORM: "android-23" + ANDROID_STL: "c++_static" + ANDROID_TOOLCHAIN: "clang" + CMAKE_CXX_COMPILER_CLANG_SCAN_DEPS: "/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/bin/clang-scan-deps" + CMAKE_CXX_COMPILER_TARGET: "x86_64-none-linux-android23" + CMAKE_CXX_FLAGS: "-g -DANDROID -fdata-sections -ffunction-sections -funwind-tables -fstack-protector-strong -no-canonical-prefixes -D_FORTIFY_SOURCE=2 -Wformat " + CMAKE_CXX_FLAGS_DEBUG: "-fno-limit-debug-info " + CMAKE_CXX_SCAN_FOR_MODULES: "OFF" + CMAKE_C_COMPILER_TARGET: "x86_64-none-linux-android23" + CMAKE_EXE_LINKER_FLAGS: "-static-libstdc++ -Wl,--build-id=sha1 -Wl,--no-rosegment -Wl,--no-undefined-version -Wl,--fatal-warnings -Wl,--no-undefined -Qunused-arguments " + CMAKE_POSITION_INDEPENDENT_CODE: "TRUE" + CMAKE_SYSROOT: "/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot" + buildResult: + variable: "CMAKE_CXX_ABI_COMPILED" + cached: true + stdout: | + Change Dir: '/Users/hamzaaleghwairyeen/development/App/Intaleq/android/app/.cxx/Debug/3p4b322x/x86_64/CMakeFiles/CMakeScratch/TryCompile-u68p6j' + + Run Build Command(s): /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/bin/ninja -v cmTC_1c78e + [1/2] /Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/bin/clang++ --target=x86_64-none-linux-android23 --sysroot=/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot -g -DANDROID -fdata-sections -ffunction-sections -funwind-tables -fstack-protector-strong -no-canonical-prefixes -D_FORTIFY_SOURCE=2 -Wformat -fPIE -v -MD -MT CMakeFiles/cmTC_1c78e.dir/CMakeCXXCompilerABI.cpp.o -MF CMakeFiles/cmTC_1c78e.dir/CMakeCXXCompilerABI.cpp.o.d -o CMakeFiles/cmTC_1c78e.dir/CMakeCXXCompilerABI.cpp.o -c /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeCXXCompilerABI.cpp + Android (12027248, +pgo, -bolt, +lto, -mlgo, based on r522817) clang version 18.0.1 (https://android.googlesource.com/toolchain/llvm-project d8003a456d14a3deb8054cdaa529ffbf02d9b262) + Target: x86_64-none-linux-android23 + Thread model: posix + InstalledDir: /Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/bin + (in-process) + "/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/bin/clang++" -cc1 -triple x86_64-none-linux-android23 -emit-obj -mrelax-all -disable-free -clear-ast-before-backend -disable-llvm-verifier -discard-value-names -main-file-name CMakeCXXCompilerABI.cpp -mrelocation-model pic -pic-level 2 -pic-is-pie -mframe-pointer=all -ffp-contract=on -fno-rounding-math -mconstructor-aliases -funwind-tables=2 -target-cpu x86-64 -target-feature +sse4.2 -target-feature +popcnt -target-feature +cx16 -tune-cpu generic -debug-info-kind=constructor -dwarf-version=4 -debugger-tuning=gdb -fdebug-compilation-dir=/Users/hamzaaleghwairyeen/development/App/Intaleq/android/app/.cxx/Debug/3p4b322x/x86_64/CMakeFiles/CMakeScratch/TryCompile-u68p6j -v -ffunction-sections -fdata-sections -fcoverage-compilation-dir=/Users/hamzaaleghwairyeen/development/App/Intaleq/android/app/.cxx/Debug/3p4b322x/x86_64/CMakeFiles/CMakeScratch/TryCompile-u68p6j -resource-dir /Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/lib/clang/18 -dependency-file CMakeFiles/cmTC_1c78e.dir/CMakeCXXCompilerABI.cpp.o.d -MT CMakeFiles/cmTC_1c78e.dir/CMakeCXXCompilerABI.cpp.o -sys-header-deps -D ANDROID -D _FORTIFY_SOURCE=2 -isysroot /Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot -internal-isystem /Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/include/c++/v1 -internal-isystem /Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/lib/clang/18/include -internal-isystem /Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/local/include -internal-externc-isystem /Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/include/x86_64-linux-android -internal-externc-isystem /Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/include -internal-externc-isystem /Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/include -Wformat -fdeprecated-macro -ferror-limit 19 -femulated-tls -stack-protector 2 -fgnuc-version=4.2.1 -fcxx-exceptions -fexceptions -D__GCC_HAVE_DWARF2_CFI_ASM=1 -o CMakeFiles/cmTC_1c78e.dir/CMakeCXXCompilerABI.cpp.o -x c++ /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeCXXCompilerABI.cpp + clang -cc1 version 18.0.1 based upon LLVM 18.0.1 default target x86_64-apple-darwin24.5.0 + ignoring nonexistent directory "/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/local/include" + ignoring nonexistent directory "/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/include" + #include "..." search starts here: + #include <...> search starts here: + /Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/include/c++/v1 + /Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/lib/clang/18/include + /Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/include/x86_64-linux-android + /Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/include + End of search list. + [2/2] : && /Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/bin/clang++ --target=x86_64-none-linux-android23 --sysroot=/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot -g -DANDROID -fdata-sections -ffunction-sections -funwind-tables -fstack-protector-strong -no-canonical-prefixes -D_FORTIFY_SOURCE=2 -Wformat -static-libstdc++ -Wl,--build-id=sha1 -Wl,--no-rosegment -Wl,--no-undefined-version -Wl,--fatal-warnings -Wl,--no-undefined -Qunused-arguments -v CMakeFiles/cmTC_1c78e.dir/CMakeCXXCompilerABI.cpp.o -o cmTC_1c78e && : + Android (12027248, +pgo, -bolt, +lto, -mlgo, based on r522817) clang version 18.0.1 (https://android.googlesource.com/toolchain/llvm-project d8003a456d14a3deb8054cdaa529ffbf02d9b262) + Target: x86_64-none-linux-android23 + Thread model: posix + InstalledDir: /Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/bin + "/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/bin/ld.lld" --sysroot=/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot -z now -z relro --hash-style=gnu --eh-frame-hdr -m elf_x86_64 -pie -dynamic-linker /system/bin/linker64 -o cmTC_1c78e /Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/lib/x86_64-linux-android/23/crtbegin_dynamic.o -L/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/lib/clang/18/lib/linux/x86_64 -L/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/lib/x86_64-linux-android/23 -L/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/lib/x86_64-linux-android -L/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/lib --build-id=sha1 --no-rosegment --no-undefined-version --fatal-warnings --no-undefined CMakeFiles/cmTC_1c78e.dir/CMakeCXXCompilerABI.cpp.o -Bstatic -lc++ -Bdynamic -lm /Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/lib/clang/18/lib/linux/libclang_rt.builtins-x86_64-android.a -l:libunwind.a -ldl -lc /Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/lib/clang/18/lib/linux/libclang_rt.builtins-x86_64-android.a -l:libunwind.a -ldl /Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/lib/x86_64-linux-android/23/crtend_android.o + + exitCode: 0 + - + kind: "message-v1" + backtrace: + - "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeDetermineCompilerABI.cmake:182 (message)" + - "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeTestCXXCompiler.cmake:26 (CMAKE_DETERMINE_COMPILER_ABI)" + - "CMakeLists.txt:2 (project)" + message: | + Parsed CXX implicit include dir info: rv=done + found start of include info + found start of implicit include info + add: [/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/include/c++/v1] + add: [/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/lib/clang/18/include] + add: [/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/include/x86_64-linux-android] + add: [/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/include] + end of search list found + collapse include dir [/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/include/c++/v1] ==> [/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/include/c++/v1] + collapse include dir [/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/lib/clang/18/include] ==> [/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/lib/clang/18/include] + collapse include dir [/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/include/x86_64-linux-android] ==> [/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/include/x86_64-linux-android] + collapse include dir [/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/include] ==> [/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/include] + implicit include dirs: [/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/include/c++/v1;/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/lib/clang/18/include;/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/include/x86_64-linux-android;/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/include] + + + - + kind: "message-v1" + backtrace: + - "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeDetermineCompilerABI.cmake:218 (message)" + - "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeTestCXXCompiler.cmake:26 (CMAKE_DETERMINE_COMPILER_ABI)" + - "CMakeLists.txt:2 (project)" + message: | + Parsed CXX implicit link information: + link line regex: [^( *|.*[/\\])(ld[0-9]*(\\.[a-z]+)?|CMAKE_LINK_STARTFILE-NOTFOUND|([^/\\]+-)?ld|collect2)[^/\\]*( |$)] + linker tool regex: [^[ ]*(->|")?[ ]*(([^"]*[/\\])?(ld[0-9]*(\\.[a-z]+)?))("|,| |$)] + ignore line: [Change Dir: '/Users/hamzaaleghwairyeen/development/App/Intaleq/android/app/.cxx/Debug/3p4b322x/x86_64/CMakeFiles/CMakeScratch/TryCompile-u68p6j'] + ignore line: [] + ignore line: [Run Build Command(s): /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/bin/ninja -v cmTC_1c78e] + ignore line: [[1/2] /Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/bin/clang++ --target=x86_64-none-linux-android23 --sysroot=/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot -g -DANDROID -fdata-sections -ffunction-sections -funwind-tables -fstack-protector-strong -no-canonical-prefixes -D_FORTIFY_SOURCE=2 -Wformat -fPIE -v -MD -MT CMakeFiles/cmTC_1c78e.dir/CMakeCXXCompilerABI.cpp.o -MF CMakeFiles/cmTC_1c78e.dir/CMakeCXXCompilerABI.cpp.o.d -o CMakeFiles/cmTC_1c78e.dir/CMakeCXXCompilerABI.cpp.o -c /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeCXXCompilerABI.cpp] + ignore line: [Android (12027248 +pgo -bolt +lto -mlgo based on r522817) clang version 18.0.1 (https://android.googlesource.com/toolchain/llvm-project d8003a456d14a3deb8054cdaa529ffbf02d9b262)] + ignore line: [Target: x86_64-none-linux-android23] + ignore line: [Thread model: posix] + ignore line: [InstalledDir: /Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/bin] + ignore line: [ (in-process)] + ignore line: [ "/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/bin/clang++" -cc1 -triple x86_64-none-linux-android23 -emit-obj -mrelax-all -disable-free -clear-ast-before-backend -disable-llvm-verifier -discard-value-names -main-file-name CMakeCXXCompilerABI.cpp -mrelocation-model pic -pic-level 2 -pic-is-pie -mframe-pointer=all -ffp-contract=on -fno-rounding-math -mconstructor-aliases -funwind-tables=2 -target-cpu x86-64 -target-feature +sse4.2 -target-feature +popcnt -target-feature +cx16 -tune-cpu generic -debug-info-kind=constructor -dwarf-version=4 -debugger-tuning=gdb -fdebug-compilation-dir=/Users/hamzaaleghwairyeen/development/App/Intaleq/android/app/.cxx/Debug/3p4b322x/x86_64/CMakeFiles/CMakeScratch/TryCompile-u68p6j -v -ffunction-sections -fdata-sections -fcoverage-compilation-dir=/Users/hamzaaleghwairyeen/development/App/Intaleq/android/app/.cxx/Debug/3p4b322x/x86_64/CMakeFiles/CMakeScratch/TryCompile-u68p6j -resource-dir /Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/lib/clang/18 -dependency-file CMakeFiles/cmTC_1c78e.dir/CMakeCXXCompilerABI.cpp.o.d -MT CMakeFiles/cmTC_1c78e.dir/CMakeCXXCompilerABI.cpp.o -sys-header-deps -D ANDROID -D _FORTIFY_SOURCE=2 -isysroot /Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot -internal-isystem /Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/include/c++/v1 -internal-isystem /Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/lib/clang/18/include -internal-isystem /Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/local/include -internal-externc-isystem /Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/include/x86_64-linux-android -internal-externc-isystem /Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/include -internal-externc-isystem /Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/include -Wformat -fdeprecated-macro -ferror-limit 19 -femulated-tls -stack-protector 2 -fgnuc-version=4.2.1 -fcxx-exceptions -fexceptions -D__GCC_HAVE_DWARF2_CFI_ASM=1 -o CMakeFiles/cmTC_1c78e.dir/CMakeCXXCompilerABI.cpp.o -x c++ /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeCXXCompilerABI.cpp] + ignore line: [clang -cc1 version 18.0.1 based upon LLVM 18.0.1 default target x86_64-apple-darwin24.5.0] + ignore line: [ignoring nonexistent directory "/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/local/include"] + ignore line: [ignoring nonexistent directory "/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/include"] + ignore line: [#include "..." search starts here:] + ignore line: [#include <...> search starts here:] + ignore line: [ /Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/include/c++/v1] + ignore line: [ /Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/lib/clang/18/include] + ignore line: [ /Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/include/x86_64-linux-android] + ignore line: [ /Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/include] + ignore line: [End of search list.] + ignore line: [[2/2] : && /Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/bin/clang++ --target=x86_64-none-linux-android23 --sysroot=/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot -g -DANDROID -fdata-sections -ffunction-sections -funwind-tables -fstack-protector-strong -no-canonical-prefixes -D_FORTIFY_SOURCE=2 -Wformat -static-libstdc++ -Wl --build-id=sha1 -Wl --no-rosegment -Wl --no-undefined-version -Wl --fatal-warnings -Wl --no-undefined -Qunused-arguments -v CMakeFiles/cmTC_1c78e.dir/CMakeCXXCompilerABI.cpp.o -o cmTC_1c78e && :] + ignore line: [Android (12027248 +pgo -bolt +lto -mlgo based on r522817) clang version 18.0.1 (https://android.googlesource.com/toolchain/llvm-project d8003a456d14a3deb8054cdaa529ffbf02d9b262)] + ignore line: [Target: x86_64-none-linux-android23] + ignore line: [Thread model: posix] + ignore line: [InstalledDir: /Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/bin] + link line: [ "/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/bin/ld.lld" --sysroot=/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot -z now -z relro --hash-style=gnu --eh-frame-hdr -m elf_x86_64 -pie -dynamic-linker /system/bin/linker64 -o cmTC_1c78e /Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/lib/x86_64-linux-android/23/crtbegin_dynamic.o -L/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/lib/clang/18/lib/linux/x86_64 -L/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/lib/x86_64-linux-android/23 -L/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/lib/x86_64-linux-android -L/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/lib --build-id=sha1 --no-rosegment --no-undefined-version --fatal-warnings --no-undefined CMakeFiles/cmTC_1c78e.dir/CMakeCXXCompilerABI.cpp.o -Bstatic -lc++ -Bdynamic -lm /Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/lib/clang/18/lib/linux/libclang_rt.builtins-x86_64-android.a -l:libunwind.a -ldl -lc /Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/lib/clang/18/lib/linux/libclang_rt.builtins-x86_64-android.a -l:libunwind.a -ldl /Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/lib/x86_64-linux-android/23/crtend_android.o] + arg [/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/bin/ld.lld] ==> ignore + arg [--sysroot=/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot] ==> ignore + arg [-znow] ==> ignore + arg [-zrelro] ==> ignore + arg [--hash-style=gnu] ==> ignore + arg [--eh-frame-hdr] ==> ignore + arg [-m] ==> ignore + arg [elf_x86_64] ==> ignore + arg [-pie] ==> ignore + arg [-dynamic-linker] ==> ignore + arg [/system/bin/linker64] ==> ignore + arg [-o] ==> ignore + arg [cmTC_1c78e] ==> ignore + arg [/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/lib/x86_64-linux-android/23/crtbegin_dynamic.o] ==> obj [/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/lib/x86_64-linux-android/23/crtbegin_dynamic.o] + arg [-L/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/lib/clang/18/lib/linux/x86_64] ==> dir [/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/lib/clang/18/lib/linux/x86_64] + arg [-L/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/lib/x86_64-linux-android/23] ==> dir [/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/lib/x86_64-linux-android/23] + arg [-L/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/lib/x86_64-linux-android] ==> dir [/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/lib/x86_64-linux-android] + arg [-L/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/lib] ==> dir [/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/lib] + arg [--build-id=sha1] ==> ignore + arg [--no-rosegment] ==> ignore + arg [--no-undefined-version] ==> ignore + arg [--fatal-warnings] ==> ignore + arg [--no-undefined] ==> ignore + arg [CMakeFiles/cmTC_1c78e.dir/CMakeCXXCompilerABI.cpp.o] ==> ignore + arg [-Bstatic] ==> search static + arg [-lc++] ==> lib [c++] + arg [-Bdynamic] ==> search dynamic + arg [-lm] ==> lib [m] + arg [/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/lib/clang/18/lib/linux/libclang_rt.builtins-x86_64-android.a] ==> lib [/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/lib/clang/18/lib/linux/libclang_rt.builtins-x86_64-android.a] + arg [-l:libunwind.a] ==> lib [-l:libunwind.a] + arg [-ldl] ==> lib [dl] + arg [-lc] ==> lib [c] + arg [/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/lib/clang/18/lib/linux/libclang_rt.builtins-x86_64-android.a] ==> lib [/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/lib/clang/18/lib/linux/libclang_rt.builtins-x86_64-android.a] + arg [-l:libunwind.a] ==> lib [-l:libunwind.a] + arg [-ldl] ==> lib [dl] + arg [/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/lib/x86_64-linux-android/23/crtend_android.o] ==> obj [/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/lib/x86_64-linux-android/23/crtend_android.o] + linker tool for 'CXX': /Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/bin/ld.lld + remove lib [/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/lib/clang/18/lib/linux/libclang_rt.builtins-x86_64-android.a] + remove lib [/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/lib/clang/18/lib/linux/libclang_rt.builtins-x86_64-android.a] + collapse library dir [/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/lib/clang/18/lib/linux/x86_64] ==> [/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/lib/clang/18/lib/linux/x86_64] + collapse library dir [/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/lib/x86_64-linux-android/23] ==> [/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/lib/x86_64-linux-android/23] + collapse library dir [/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/lib/x86_64-linux-android] ==> [/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/lib/x86_64-linux-android] + collapse library dir [/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/lib] ==> [/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/lib] + implicit libs: [c++;m;-l:libunwind.a;dl;c;-l:libunwind.a;dl] + implicit objs: [/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/lib/x86_64-linux-android/23/crtbegin_dynamic.o;/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/lib/x86_64-linux-android/23/crtend_android.o] + implicit dirs: [/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/lib/clang/18/lib/linux/x86_64;/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/lib/x86_64-linux-android/23;/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/lib/x86_64-linux-android;/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/lib] + implicit fwks: [] + + + - + kind: "message-v1" + backtrace: + - "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Internal/CMakeDetermineLinkerId.cmake:40 (message)" + - "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeDetermineCompilerABI.cmake:255 (cmake_determine_linker_id)" + - "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeTestCXXCompiler.cmake:26 (CMAKE_DETERMINE_COMPILER_ABI)" + - "CMakeLists.txt:2 (project)" + message: | + Running the CXX compiler's linker: "/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/bin/ld.lld" "-v" + LLD 18.0.1 (compatible with GNU linkers) +... diff --git a/siro_rider/android/app/.cxx/Debug/3p4b322x/x86_64/CMakeFiles/TargetDirectories.txt b/siro_rider/android/app/.cxx/Debug/3p4b322x/x86_64/CMakeFiles/TargetDirectories.txt new file mode 100644 index 0000000..4b4d236 --- /dev/null +++ b/siro_rider/android/app/.cxx/Debug/3p4b322x/x86_64/CMakeFiles/TargetDirectories.txt @@ -0,0 +1,3 @@ +/Users/hamzaaleghwairyeen/development/App/Intaleq/android/app/.cxx/Debug/3p4b322x/x86_64/CMakeFiles/native-lib.dir +/Users/hamzaaleghwairyeen/development/App/Intaleq/android/app/.cxx/Debug/3p4b322x/x86_64/CMakeFiles/edit_cache.dir +/Users/hamzaaleghwairyeen/development/App/Intaleq/android/app/.cxx/Debug/3p4b322x/x86_64/CMakeFiles/rebuild_cache.dir diff --git a/siro_rider/android/app/.cxx/Debug/3p4b322x/x86_64/CMakeFiles/cmake.check_cache b/siro_rider/android/app/.cxx/Debug/3p4b322x/x86_64/CMakeFiles/cmake.check_cache new file mode 100644 index 0000000..3dccd73 --- /dev/null +++ b/siro_rider/android/app/.cxx/Debug/3p4b322x/x86_64/CMakeFiles/cmake.check_cache @@ -0,0 +1 @@ +# This file is generated by cmake for dependency checking of the CMakeCache.txt file diff --git a/siro_rider/android/app/.cxx/Debug/3p4b322x/x86_64/CMakeFiles/native-lib.dir/native-lib.cpp.o b/siro_rider/android/app/.cxx/Debug/3p4b322x/x86_64/CMakeFiles/native-lib.dir/native-lib.cpp.o new file mode 100644 index 0000000..3054933 Binary files /dev/null and b/siro_rider/android/app/.cxx/Debug/3p4b322x/x86_64/CMakeFiles/native-lib.dir/native-lib.cpp.o differ diff --git a/siro_rider/android/app/.cxx/Debug/3p4b322x/x86_64/CMakeFiles/rules.ninja b/siro_rider/android/app/.cxx/Debug/3p4b322x/x86_64/CMakeFiles/rules.ninja new file mode 100644 index 0000000..4b1d1a4 --- /dev/null +++ b/siro_rider/android/app/.cxx/Debug/3p4b322x/x86_64/CMakeFiles/rules.ninja @@ -0,0 +1,66 @@ +# CMAKE generated file: DO NOT EDIT! +# Generated by "Ninja" Generator, CMake Version 3.31 + +# This file contains all the rules used to get the outputs files +# built from the input files. +# It is included in the main 'build.ninja'. + +# ============================================================================= +# Project: intaleq +# Configurations: Debug +# ============================================================================= +# ============================================================================= + +############################################# +# Rule for compiling CXX files. + +rule CXX_COMPILER__native-lib_unscanned_Debug + depfile = $DEP_FILE + deps = gcc + command = ${LAUNCHER}${CODE_CHECK}/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/bin/clang++ --target=x86_64-none-linux-android23 --sysroot=/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot $DEFINES $INCLUDES $FLAGS -MD -MT $out -MF $DEP_FILE -o $out -c $in + description = Building CXX object $out + + +############################################# +# Rule for linking CXX shared library. + +rule CXX_SHARED_LIBRARY_LINKER__native-lib_Debug + depfile = $DEP_FILE + deps = gcc + command = $PRE_LINK && /Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/bin/clang++ --target=x86_64-none-linux-android23 --sysroot=/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot -fPIC $LANGUAGE_COMPILE_FLAGS $ARCH_FLAGS $LINK_FLAGS -shared $SONAME_FLAG$SONAME -o $TARGET_FILE $in $LINK_PATH $LINK_LIBRARIES && $POST_BUILD + description = Linking CXX shared library $TARGET_FILE + restat = $RESTAT + + +############################################# +# Rule for running custom commands. + +rule CUSTOM_COMMAND + command = $COMMAND + description = $DESC + + +############################################# +# Rule for re-running cmake. + +rule RERUN_CMAKE + command = /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/bin/cmake --regenerate-during-build -S/Users/hamzaaleghwairyeen/development/App/Intaleq/android/app/src/main/cpp -B/Users/hamzaaleghwairyeen/development/App/Intaleq/android/app/.cxx/Debug/3p4b322x/x86_64 + description = Re-running CMake... + generator = 1 + + +############################################# +# Rule for cleaning all built files. + +rule CLEAN + command = /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/bin/ninja $FILE_ARG -t clean $TARGETS + description = Cleaning all built files... + + +############################################# +# Rule for printing all primary targets available. + +rule HELP + command = /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/bin/ninja -t targets + description = All primary targets available: + diff --git a/siro_rider/android/app/.cxx/Debug/3p4b322x/x86_64/additional_project_files.txt b/siro_rider/android/app/.cxx/Debug/3p4b322x/x86_64/additional_project_files.txt new file mode 100644 index 0000000..e69de29 diff --git a/siro_rider/android/app/.cxx/Debug/3p4b322x/x86_64/android_gradle_build.json b/siro_rider/android/app/.cxx/Debug/3p4b322x/x86_64/android_gradle_build.json new file mode 100644 index 0000000..16f47ba --- /dev/null +++ b/siro_rider/android/app/.cxx/Debug/3p4b322x/x86_64/android_gradle_build.json @@ -0,0 +1,38 @@ +{ + "buildFiles": [ + "/Users/hamzaaleghwairyeen/development/App/Intaleq/android/app/src/main/cpp/CMakeLists.txt" + ], + "cleanCommandsComponents": [ + [ + "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/bin/ninja", + "-C", + "/Users/hamzaaleghwairyeen/development/App/Intaleq/android/app/.cxx/Debug/3p4b322x/x86_64", + "clean" + ] + ], + "buildTargetsCommandComponents": [ + "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/bin/ninja", + "-C", + "/Users/hamzaaleghwairyeen/development/App/Intaleq/android/app/.cxx/Debug/3p4b322x/x86_64", + "{LIST_OF_TARGETS_TO_BUILD}" + ], + "libraries": { + "native-lib::@6890427a1f51a3e7e1df": { + "toolchain": "toolchain", + "abi": "x86_64", + "artifactName": "native-lib", + "output": "/Users/hamzaaleghwairyeen/development/App/Intaleq/build/app/intermediates/cxx/Debug/3p4b322x/obj/x86_64/libnative-lib.so", + "runtimeFiles": [] + } + }, + "toolchains": { + "toolchain": { + "cCompilerExecutable": "/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/bin/clang.lld", + "cppCompilerExecutable": "/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/bin/clang++.lld" + } + }, + "cFileExtensions": [], + "cppFileExtensions": [ + "cpp" + ] +} \ No newline at end of file diff --git a/siro_rider/android/app/.cxx/Debug/3p4b322x/x86_64/android_gradle_build_mini.json b/siro_rider/android/app/.cxx/Debug/3p4b322x/x86_64/android_gradle_build_mini.json new file mode 100644 index 0000000..973f14d --- /dev/null +++ b/siro_rider/android/app/.cxx/Debug/3p4b322x/x86_64/android_gradle_build_mini.json @@ -0,0 +1,27 @@ +{ + "buildFiles": [ + "/Users/hamzaaleghwairyeen/development/App/Intaleq/android/app/src/main/cpp/CMakeLists.txt" + ], + "cleanCommandsComponents": [ + [ + "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/bin/ninja", + "-C", + "/Users/hamzaaleghwairyeen/development/App/Intaleq/android/app/.cxx/Debug/3p4b322x/x86_64", + "clean" + ] + ], + "buildTargetsCommandComponents": [ + "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/bin/ninja", + "-C", + "/Users/hamzaaleghwairyeen/development/App/Intaleq/android/app/.cxx/Debug/3p4b322x/x86_64", + "{LIST_OF_TARGETS_TO_BUILD}" + ], + "libraries": { + "native-lib::@6890427a1f51a3e7e1df": { + "artifactName": "native-lib", + "abi": "x86_64", + "output": "/Users/hamzaaleghwairyeen/development/App/Intaleq/build/app/intermediates/cxx/Debug/3p4b322x/obj/x86_64/libnative-lib.so", + "runtimeFiles": [] + } + } +} \ No newline at end of file diff --git a/siro_rider/android/app/.cxx/Debug/3p4b322x/x86_64/build.ninja b/siro_rider/android/app/.cxx/Debug/3p4b322x/x86_64/build.ninja new file mode 100644 index 0000000..a422178 --- /dev/null +++ b/siro_rider/android/app/.cxx/Debug/3p4b322x/x86_64/build.ninja @@ -0,0 +1,156 @@ +# CMAKE generated file: DO NOT EDIT! +# Generated by "Ninja" Generator, CMake Version 3.31 + +# This file contains all the build statements describing the +# compilation DAG. + +# ============================================================================= +# Write statements declared in CMakeLists.txt: +# +# Which is the root file. +# ============================================================================= + +# ============================================================================= +# Project: intaleq +# Configurations: Debug +# ============================================================================= + +############################################# +# Minimal version of Ninja required by this file + +ninja_required_version = 1.5 + + +############################################# +# Set configuration variable for custom commands. + +CONFIGURATION = Debug +# ============================================================================= +# Include auxiliary files. + + +############################################# +# Include rules file. + +include CMakeFiles/rules.ninja + +# ============================================================================= + +############################################# +# Logical path to working directory; prefix for absolute paths. + +cmake_ninja_workdir = /Users/hamzaaleghwairyeen/development/App/Intaleq/android/app/.cxx/Debug/3p4b322x/x86_64/ +# ============================================================================= +# Object build statements for SHARED_LIBRARY target native-lib + + +############################################# +# Order-only phony target for native-lib + +build cmake_object_order_depends_target_native-lib: phony || . + +build CMakeFiles/native-lib.dir/native-lib.cpp.o: CXX_COMPILER__native-lib_unscanned_Debug /Users/hamzaaleghwairyeen/development/App/Intaleq/android/app/src/main/cpp/native-lib.cpp || cmake_object_order_depends_target_native-lib + DEFINES = -Dnative_lib_EXPORTS + DEP_FILE = CMakeFiles/native-lib.dir/native-lib.cpp.o.d + FLAGS = -g -DANDROID -fdata-sections -ffunction-sections -funwind-tables -fstack-protector-strong -no-canonical-prefixes -D_FORTIFY_SOURCE=2 -Wformat -Werror=format-security -fno-limit-debug-info -fPIC + OBJECT_DIR = CMakeFiles/native-lib.dir + OBJECT_FILE_DIR = CMakeFiles/native-lib.dir + TARGET_COMPILE_PDB = CMakeFiles/native-lib.dir/ + TARGET_PDB = /Users/hamzaaleghwairyeen/development/App/Intaleq/build/app/intermediates/cxx/Debug/3p4b322x/obj/x86_64/libnative-lib.pdb + + +# ============================================================================= +# Link build statements for SHARED_LIBRARY target native-lib + + +############################################# +# Link the shared library /Users/hamzaaleghwairyeen/development/App/Intaleq/build/app/intermediates/cxx/Debug/3p4b322x/obj/x86_64/libnative-lib.so + +build /Users/hamzaaleghwairyeen/development/App/Intaleq/build/app/intermediates/cxx/Debug/3p4b322x/obj/x86_64/libnative-lib.so: CXX_SHARED_LIBRARY_LINKER__native-lib_Debug CMakeFiles/native-lib.dir/native-lib.cpp.o | /Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/lib/x86_64-linux-android/23/liblog.so + DEP_FILE = CMakeFiles/native-lib.dir/link.d + LANGUAGE_COMPILE_FLAGS = -g -DANDROID -fdata-sections -ffunction-sections -funwind-tables -fstack-protector-strong -no-canonical-prefixes -D_FORTIFY_SOURCE=2 -Wformat -Werror=format-security -fno-limit-debug-info + LINK_FLAGS = -static-libstdc++ -Wl,--build-id=sha1 -Wl,--no-rosegment -Wl,--no-undefined-version -Wl,--fatal-warnings -Wl,--no-undefined -Qunused-arguments -Xlinker --dependency-file=CMakeFiles/native-lib.dir/link.d + LINK_LIBRARIES = /Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/lib/x86_64-linux-android/23/liblog.so -latomic -lm + OBJECT_DIR = CMakeFiles/native-lib.dir + POST_BUILD = : + PRE_LINK = : + SONAME = libnative-lib.so + SONAME_FLAG = -Wl,-soname, + TARGET_COMPILE_PDB = CMakeFiles/native-lib.dir/ + TARGET_FILE = /Users/hamzaaleghwairyeen/development/App/Intaleq/build/app/intermediates/cxx/Debug/3p4b322x/obj/x86_64/libnative-lib.so + TARGET_PDB = /Users/hamzaaleghwairyeen/development/App/Intaleq/build/app/intermediates/cxx/Debug/3p4b322x/obj/x86_64/libnative-lib.pdb + + +############################################# +# Utility command for edit_cache + +build CMakeFiles/edit_cache.util: CUSTOM_COMMAND + COMMAND = cd /Users/hamzaaleghwairyeen/development/App/Intaleq/android/app/.cxx/Debug/3p4b322x/x86_64 && /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/bin/ccmake -S/Users/hamzaaleghwairyeen/development/App/Intaleq/android/app/src/main/cpp -B/Users/hamzaaleghwairyeen/development/App/Intaleq/android/app/.cxx/Debug/3p4b322x/x86_64 + DESC = Running CMake cache editor... + pool = console + restat = 1 + +build edit_cache: phony CMakeFiles/edit_cache.util + + +############################################# +# Utility command for rebuild_cache + +build CMakeFiles/rebuild_cache.util: CUSTOM_COMMAND + COMMAND = cd /Users/hamzaaleghwairyeen/development/App/Intaleq/android/app/.cxx/Debug/3p4b322x/x86_64 && /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/bin/cmake --regenerate-during-build -S/Users/hamzaaleghwairyeen/development/App/Intaleq/android/app/src/main/cpp -B/Users/hamzaaleghwairyeen/development/App/Intaleq/android/app/.cxx/Debug/3p4b322x/x86_64 + DESC = Running CMake to regenerate build system... + pool = console + restat = 1 + +build rebuild_cache: phony CMakeFiles/rebuild_cache.util + +# ============================================================================= +# Target aliases. + +build libnative-lib.so: phony /Users/hamzaaleghwairyeen/development/App/Intaleq/build/app/intermediates/cxx/Debug/3p4b322x/obj/x86_64/libnative-lib.so + +build native-lib: phony /Users/hamzaaleghwairyeen/development/App/Intaleq/build/app/intermediates/cxx/Debug/3p4b322x/obj/x86_64/libnative-lib.so + +# ============================================================================= +# Folder targets. + +# ============================================================================= + +############################################# +# Folder: /Users/hamzaaleghwairyeen/development/App/Intaleq/android/app/.cxx/Debug/3p4b322x/x86_64 + +build all: phony /Users/hamzaaleghwairyeen/development/App/Intaleq/build/app/intermediates/cxx/Debug/3p4b322x/obj/x86_64/libnative-lib.so + +# ============================================================================= +# Built-in targets + + +############################################# +# Re-run CMake if any of its inputs changed. + +build build.ninja: RERUN_CMAKE | /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeCCompiler.cmake.in /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeCCompilerABI.c /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeCInformation.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeCXXCompiler.cmake.in /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeCXXCompilerABI.cpp /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeCXXInformation.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeCommonLanguageInclude.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeCompilerIdDetection.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeDetermineCCompiler.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeDetermineCXXCompiler.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeDetermineCompiler.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeDetermineCompilerABI.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeDetermineCompilerId.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeDetermineCompilerSupport.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeDetermineSystem.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeFindBinUtils.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeGenericSystem.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeInitializeConfigs.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeLanguageInformation.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeParseImplicitIncludeInfo.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeParseImplicitLinkInfo.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeParseLibraryArchitecture.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeSystem.cmake.in /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeSystemSpecificInformation.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeSystemSpecificInitialize.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeTestCCompiler.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeTestCXXCompiler.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeTestCompilerCommon.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/ADSP-DetermineCompiler.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/ARMCC-DetermineCompiler.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/ARMClang-DetermineCompiler.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/AppleClang-DetermineCompiler.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/Borland-DetermineCompiler.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/Bruce-C-DetermineCompiler.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/CMakeCommonCompilerMacros.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/Clang-C.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/Clang-CXX-CXXImportStd.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/Clang-CXX.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/Clang-DetermineCompiler.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/Clang-DetermineCompilerInternal.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/Clang-FindBinUtils.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/Clang.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/Compaq-C-DetermineCompiler.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/Compaq-CXX-DetermineCompiler.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/Cray-DetermineCompiler.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/CrayClang-DetermineCompiler.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/Embarcadero-DetermineCompiler.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/Fujitsu-DetermineCompiler.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/FujitsuClang-DetermineCompiler.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/GHS-DetermineCompiler.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/GNU-C-DetermineCompiler.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/GNU-CXX-DetermineCompiler.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/GNU.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/HP-C-DetermineCompiler.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/HP-CXX-DetermineCompiler.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/IAR-DetermineCompiler.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/IBMCPP-C-DetermineVersionInternal.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/IBMCPP-CXX-DetermineVersionInternal.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/IBMClang-C-DetermineCompiler.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/IBMClang-CXX-DetermineCompiler.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/Intel-DetermineCompiler.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/IntelLLVM-DetermineCompiler.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/LCC-C-DetermineCompiler.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/LCC-CXX-DetermineCompiler.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/MSVC-DetermineCompiler.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/NVHPC-DetermineCompiler.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/NVIDIA-DetermineCompiler.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/OpenWatcom-DetermineCompiler.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/OrangeC-DetermineCompiler.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/PGI-DetermineCompiler.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/PathScale-DetermineCompiler.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/SCO-DetermineCompiler.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/SDCC-C-DetermineCompiler.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/SunPro-C-DetermineCompiler.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/SunPro-CXX-DetermineCompiler.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/TI-DetermineCompiler.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/TIClang-DetermineCompiler.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/Tasking-DetermineCompiler.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/TinyCC-C-DetermineCompiler.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/VisualAge-C-DetermineCompiler.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/VisualAge-CXX-DetermineCompiler.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/Watcom-DetermineCompiler.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/XL-C-DetermineCompiler.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/XL-CXX-DetermineCompiler.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/XLClang-C-DetermineCompiler.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/XLClang-CXX-DetermineCompiler.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/zOS-C-DetermineCompiler.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/zOS-CXX-DetermineCompiler.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Internal/CMakeCLinkerInformation.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Internal/CMakeCXXLinkerInformation.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Internal/CMakeCommonLinkerInformation.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Internal/CMakeDetermineLinkerId.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Internal/FeatureTesting.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Linker/GNU.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Linker/LLD-C.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Linker/LLD-CXX.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Linker/LLD.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Platform/Android-Clang-C.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Platform/Android-Clang-CXX.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Platform/Android-Clang.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Platform/Android-Determine-C.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Platform/Android-Determine-CXX.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Platform/Android-Determine.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Platform/Android-Initialize.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Platform/Android.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Platform/Android/Determine-Compiler.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Platform/Linker/Android-LLD-C.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Platform/Linker/Android-LLD-CXX.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Platform/Linker/GNU.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Platform/Linker/Linux-GNU.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Platform/Linker/Linux-LLD-C.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Platform/Linker/Linux-LLD-CXX.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Platform/Linker/Linux-LLD.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Platform/Linux-Initialize.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Platform/Linux.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Platform/UnixPaths.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/build/cmake/abis.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/build/cmake/android-legacy.toolchain.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/build/cmake/android.toolchain.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/build/cmake/flags.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/build/cmake/hooks/pre/Android-Clang.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/build/cmake/hooks/pre/Android-Determine.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/build/cmake/hooks/pre/Android-Initialize.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/build/cmake/hooks/pre/Android.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/build/cmake/hooks/pre/Determine-Compiler.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/build/cmake/platforms.cmake /Users/hamzaaleghwairyeen/development/App/Intaleq/android/app/src/main/cpp/CMakeLists.txt CMakeCache.txt CMakeFiles/3.31.5-g6cf5163/CMakeCCompiler.cmake CMakeFiles/3.31.5-g6cf5163/CMakeCXXCompiler.cmake CMakeFiles/3.31.5-g6cf5163/CMakeSystem.cmake + pool = console + + +############################################# +# A missing CMake input file is not an error. + +build /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeCCompiler.cmake.in /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeCCompilerABI.c /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeCInformation.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeCXXCompiler.cmake.in /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeCXXCompilerABI.cpp /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeCXXInformation.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeCommonLanguageInclude.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeCompilerIdDetection.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeDetermineCCompiler.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeDetermineCXXCompiler.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeDetermineCompiler.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeDetermineCompilerABI.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeDetermineCompilerId.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeDetermineCompilerSupport.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeDetermineSystem.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeFindBinUtils.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeGenericSystem.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeInitializeConfigs.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeLanguageInformation.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeParseImplicitIncludeInfo.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeParseImplicitLinkInfo.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeParseLibraryArchitecture.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeSystem.cmake.in /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeSystemSpecificInformation.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeSystemSpecificInitialize.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeTestCCompiler.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeTestCXXCompiler.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeTestCompilerCommon.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/ADSP-DetermineCompiler.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/ARMCC-DetermineCompiler.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/ARMClang-DetermineCompiler.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/AppleClang-DetermineCompiler.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/Borland-DetermineCompiler.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/Bruce-C-DetermineCompiler.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/CMakeCommonCompilerMacros.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/Clang-C.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/Clang-CXX-CXXImportStd.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/Clang-CXX.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/Clang-DetermineCompiler.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/Clang-DetermineCompilerInternal.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/Clang-FindBinUtils.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/Clang.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/Compaq-C-DetermineCompiler.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/Compaq-CXX-DetermineCompiler.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/Cray-DetermineCompiler.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/CrayClang-DetermineCompiler.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/Embarcadero-DetermineCompiler.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/Fujitsu-DetermineCompiler.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/FujitsuClang-DetermineCompiler.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/GHS-DetermineCompiler.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/GNU-C-DetermineCompiler.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/GNU-CXX-DetermineCompiler.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/GNU.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/HP-C-DetermineCompiler.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/HP-CXX-DetermineCompiler.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/IAR-DetermineCompiler.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/IBMCPP-C-DetermineVersionInternal.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/IBMCPP-CXX-DetermineVersionInternal.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/IBMClang-C-DetermineCompiler.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/IBMClang-CXX-DetermineCompiler.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/Intel-DetermineCompiler.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/IntelLLVM-DetermineCompiler.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/LCC-C-DetermineCompiler.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/LCC-CXX-DetermineCompiler.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/MSVC-DetermineCompiler.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/NVHPC-DetermineCompiler.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/NVIDIA-DetermineCompiler.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/OpenWatcom-DetermineCompiler.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/OrangeC-DetermineCompiler.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/PGI-DetermineCompiler.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/PathScale-DetermineCompiler.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/SCO-DetermineCompiler.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/SDCC-C-DetermineCompiler.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/SunPro-C-DetermineCompiler.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/SunPro-CXX-DetermineCompiler.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/TI-DetermineCompiler.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/TIClang-DetermineCompiler.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/Tasking-DetermineCompiler.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/TinyCC-C-DetermineCompiler.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/VisualAge-C-DetermineCompiler.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/VisualAge-CXX-DetermineCompiler.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/Watcom-DetermineCompiler.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/XL-C-DetermineCompiler.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/XL-CXX-DetermineCompiler.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/XLClang-C-DetermineCompiler.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/XLClang-CXX-DetermineCompiler.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/zOS-C-DetermineCompiler.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/zOS-CXX-DetermineCompiler.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Internal/CMakeCLinkerInformation.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Internal/CMakeCXXLinkerInformation.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Internal/CMakeCommonLinkerInformation.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Internal/CMakeDetermineLinkerId.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Internal/FeatureTesting.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Linker/GNU.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Linker/LLD-C.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Linker/LLD-CXX.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Linker/LLD.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Platform/Android-Clang-C.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Platform/Android-Clang-CXX.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Platform/Android-Clang.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Platform/Android-Determine-C.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Platform/Android-Determine-CXX.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Platform/Android-Determine.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Platform/Android-Initialize.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Platform/Android.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Platform/Android/Determine-Compiler.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Platform/Linker/Android-LLD-C.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Platform/Linker/Android-LLD-CXX.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Platform/Linker/GNU.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Platform/Linker/Linux-GNU.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Platform/Linker/Linux-LLD-C.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Platform/Linker/Linux-LLD-CXX.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Platform/Linker/Linux-LLD.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Platform/Linux-Initialize.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Platform/Linux.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Platform/UnixPaths.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/build/cmake/abis.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/build/cmake/android-legacy.toolchain.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/build/cmake/android.toolchain.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/build/cmake/flags.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/build/cmake/hooks/pre/Android-Clang.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/build/cmake/hooks/pre/Android-Determine.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/build/cmake/hooks/pre/Android-Initialize.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/build/cmake/hooks/pre/Android.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/build/cmake/hooks/pre/Determine-Compiler.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/build/cmake/platforms.cmake /Users/hamzaaleghwairyeen/development/App/Intaleq/android/app/src/main/cpp/CMakeLists.txt CMakeCache.txt CMakeFiles/3.31.5-g6cf5163/CMakeCCompiler.cmake CMakeFiles/3.31.5-g6cf5163/CMakeCXXCompiler.cmake CMakeFiles/3.31.5-g6cf5163/CMakeSystem.cmake: phony + + +############################################# +# Clean all the built files. + +build clean: CLEAN + + +############################################# +# Print all primary targets available. + +build help: HELP + + +############################################# +# Make the all target the default. + +default all diff --git a/siro_rider/android/app/.cxx/Debug/3p4b322x/x86_64/build_file_index.txt b/siro_rider/android/app/.cxx/Debug/3p4b322x/x86_64/build_file_index.txt new file mode 100644 index 0000000..661f7ae --- /dev/null +++ b/siro_rider/android/app/.cxx/Debug/3p4b322x/x86_64/build_file_index.txt @@ -0,0 +1 @@ +/Users/hamzaaleghwairyeen/development/App/Intaleq/android/app/src/main/cpp/CMakeLists.txt \ No newline at end of file diff --git a/siro_rider/android/app/.cxx/Debug/3p4b322x/x86_64/cmake_install.cmake b/siro_rider/android/app/.cxx/Debug/3p4b322x/x86_64/cmake_install.cmake new file mode 100644 index 0000000..e8b9e14 --- /dev/null +++ b/siro_rider/android/app/.cxx/Debug/3p4b322x/x86_64/cmake_install.cmake @@ -0,0 +1,66 @@ +# Install script for directory: /Users/hamzaaleghwairyeen/development/App/Intaleq/android/app/src/main/cpp + +# Set the install prefix +if(NOT DEFINED CMAKE_INSTALL_PREFIX) + set(CMAKE_INSTALL_PREFIX "/usr/local") +endif() +string(REGEX REPLACE "/$" "" CMAKE_INSTALL_PREFIX "${CMAKE_INSTALL_PREFIX}") + +# Set the install configuration name. +if(NOT DEFINED CMAKE_INSTALL_CONFIG_NAME) + if(BUILD_TYPE) + string(REGEX REPLACE "^[^A-Za-z0-9_]+" "" + CMAKE_INSTALL_CONFIG_NAME "${BUILD_TYPE}") + else() + set(CMAKE_INSTALL_CONFIG_NAME "Debug") + endif() + message(STATUS "Install configuration: \"${CMAKE_INSTALL_CONFIG_NAME}\"") +endif() + +# Set the component getting installed. +if(NOT CMAKE_INSTALL_COMPONENT) + if(COMPONENT) + message(STATUS "Install component: \"${COMPONENT}\"") + set(CMAKE_INSTALL_COMPONENT "${COMPONENT}") + else() + set(CMAKE_INSTALL_COMPONENT) + endif() +endif() + +# Install shared libraries without execute permission? +if(NOT DEFINED CMAKE_INSTALL_SO_NO_EXE) + set(CMAKE_INSTALL_SO_NO_EXE "0") +endif() + +# Is this installation the result of a crosscompile? +if(NOT DEFINED CMAKE_CROSSCOMPILING) + set(CMAKE_CROSSCOMPILING "TRUE") +endif() + +# Set path to fallback-tool for dependency-resolution. +if(NOT DEFINED CMAKE_OBJDUMP) + set(CMAKE_OBJDUMP "/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/bin/llvm-objdump") +endif() + +string(REPLACE ";" "\n" CMAKE_INSTALL_MANIFEST_CONTENT + "${CMAKE_INSTALL_MANIFEST_FILES}") +if(CMAKE_INSTALL_LOCAL_ONLY) + file(WRITE "/Users/hamzaaleghwairyeen/development/App/Intaleq/android/app/.cxx/Debug/3p4b322x/x86_64/install_local_manifest.txt" + "${CMAKE_INSTALL_MANIFEST_CONTENT}") +endif() +if(CMAKE_INSTALL_COMPONENT) + if(CMAKE_INSTALL_COMPONENT MATCHES "^[a-zA-Z0-9_.+-]+$") + set(CMAKE_INSTALL_MANIFEST "install_manifest_${CMAKE_INSTALL_COMPONENT}.txt") + else() + string(MD5 CMAKE_INST_COMP_HASH "${CMAKE_INSTALL_COMPONENT}") + set(CMAKE_INSTALL_MANIFEST "install_manifest_${CMAKE_INST_COMP_HASH}.txt") + unset(CMAKE_INST_COMP_HASH) + endif() +else() + set(CMAKE_INSTALL_MANIFEST "install_manifest.txt") +endif() + +if(NOT CMAKE_INSTALL_LOCAL_ONLY) + file(WRITE "/Users/hamzaaleghwairyeen/development/App/Intaleq/android/app/.cxx/Debug/3p4b322x/x86_64/${CMAKE_INSTALL_MANIFEST}" + "${CMAKE_INSTALL_MANIFEST_CONTENT}") +endif() diff --git a/siro_rider/android/app/.cxx/Debug/3p4b322x/x86_64/compile_commands.json b/siro_rider/android/app/.cxx/Debug/3p4b322x/x86_64/compile_commands.json new file mode 100644 index 0000000..2a999ce --- /dev/null +++ b/siro_rider/android/app/.cxx/Debug/3p4b322x/x86_64/compile_commands.json @@ -0,0 +1,8 @@ +[ +{ + "directory": "/Users/hamzaaleghwairyeen/development/App/Intaleq/android/app/.cxx/Debug/3p4b322x/x86_64", + "command": "/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/bin/clang++ --target=x86_64-none-linux-android23 --sysroot=/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot -Dnative_lib_EXPORTS -g -DANDROID -fdata-sections -ffunction-sections -funwind-tables -fstack-protector-strong -no-canonical-prefixes -D_FORTIFY_SOURCE=2 -Wformat -Werror=format-security -fno-limit-debug-info -fPIC -o CMakeFiles/native-lib.dir/native-lib.cpp.o -c /Users/hamzaaleghwairyeen/development/App/Intaleq/android/app/src/main/cpp/native-lib.cpp", + "file": "/Users/hamzaaleghwairyeen/development/App/Intaleq/android/app/src/main/cpp/native-lib.cpp", + "output": "CMakeFiles/native-lib.dir/native-lib.cpp.o" +} +] \ No newline at end of file diff --git a/siro_rider/android/app/.cxx/Debug/3p4b322x/x86_64/compile_commands.json.bin b/siro_rider/android/app/.cxx/Debug/3p4b322x/x86_64/compile_commands.json.bin new file mode 100644 index 0000000..c80b7fd Binary files /dev/null and b/siro_rider/android/app/.cxx/Debug/3p4b322x/x86_64/compile_commands.json.bin differ diff --git a/siro_rider/android/app/.cxx/Debug/3p4b322x/x86_64/configure_fingerprint.bin b/siro_rider/android/app/.cxx/Debug/3p4b322x/x86_64/configure_fingerprint.bin new file mode 100644 index 0000000..e289343 --- /dev/null +++ b/siro_rider/android/app/.cxx/Debug/3p4b322x/x86_64/configure_fingerprint.bin @@ -0,0 +1,29 @@ +C/C++ Structured Logy +w +u/Users/hamzaaleghwairyeen/development/App/Intaleq/android/app/.cxx/Debug/3p4b322x/x86_64/additional_project_files.txtC +A +?com.android.build.gradle.internal.cxx.io.EncodedFileFingerPrint  3  Ż2v +t +r/Users/hamzaaleghwairyeen/development/App/Intaleq/android/app/.cxx/Debug/3p4b322x/x86_64/android_gradle_build.json  3 + ˻2{ +y +w/Users/hamzaaleghwairyeen/development/App/Intaleq/android/app/.cxx/Debug/3p4b322x/x86_64/android_gradle_build_mini.json  3 ػ2h +f +d/Users/hamzaaleghwairyeen/development/App/Intaleq/android/app/.cxx/Debug/3p4b322x/x86_64/build.ninja  3 2l +j +h/Users/hamzaaleghwairyeen/development/App/Intaleq/android/app/.cxx/Debug/3p4b322x/x86_64/build.ninja.txt  3q +o +m/Users/hamzaaleghwairyeen/development/App/Intaleq/android/app/.cxx/Debug/3p4b322x/x86_64/build_file_index.txt  3 Y ٻ2r +p +n/Users/hamzaaleghwairyeen/development/App/Intaleq/android/app/.cxx/Debug/3p4b322x/x86_64/compile_commands.json  3 2v +t +r/Users/hamzaaleghwairyeen/development/App/Intaleq/android/app/.cxx/Debug/3p4b322x/x86_64/compile_commands.json.bin  3  2| +z +x/Users/hamzaaleghwairyeen/development/App/Intaleq/android/app/.cxx/Debug/3p4b322x/x86_64/metadata_generation_command.txt  3 + ٻ2o +m +k/Users/hamzaaleghwairyeen/development/App/Intaleq/android/app/.cxx/Debug/3p4b322x/x86_64/prefab_config.json  3  ( ٻ2t +r +p/Users/hamzaaleghwairyeen/development/App/Intaleq/android/app/.cxx/Debug/3p4b322x/x86_64/symbol_folder_index.txt  3  g ٻ2] +[ +Y/Users/hamzaaleghwairyeen/development/App/Intaleq/android/app/src/main/cpp/CMakeLists.txt  3  ޮ2 \ No newline at end of file diff --git a/siro_rider/android/app/.cxx/Debug/3p4b322x/x86_64/metadata_generation_command.txt b/siro_rider/android/app/.cxx/Debug/3p4b322x/x86_64/metadata_generation_command.txt new file mode 100644 index 0000000..c3aec52 --- /dev/null +++ b/siro_rider/android/app/.cxx/Debug/3p4b322x/x86_64/metadata_generation_command.txt @@ -0,0 +1,18 @@ + -H/Users/hamzaaleghwairyeen/development/App/Intaleq/android/app/src/main/cpp +-DCMAKE_SYSTEM_NAME=Android +-DCMAKE_EXPORT_COMPILE_COMMANDS=ON +-DCMAKE_SYSTEM_VERSION=23 +-DANDROID_PLATFORM=android-23 +-DANDROID_ABI=x86_64 +-DCMAKE_ANDROID_ARCH_ABI=x86_64 +-DANDROID_NDK=/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973 +-DCMAKE_ANDROID_NDK=/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973 +-DCMAKE_TOOLCHAIN_FILE=/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/build/cmake/android.toolchain.cmake +-DCMAKE_MAKE_PROGRAM=/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/bin/ninja +-DCMAKE_LIBRARY_OUTPUT_DIRECTORY=/Users/hamzaaleghwairyeen/development/App/Intaleq/build/app/intermediates/cxx/Debug/3p4b322x/obj/x86_64 +-DCMAKE_RUNTIME_OUTPUT_DIRECTORY=/Users/hamzaaleghwairyeen/development/App/Intaleq/build/app/intermediates/cxx/Debug/3p4b322x/obj/x86_64 +-DCMAKE_BUILD_TYPE=Debug +-B/Users/hamzaaleghwairyeen/development/App/Intaleq/android/app/.cxx/Debug/3p4b322x/x86_64 +-GNinja + Build command args: [] + Version: 2 \ No newline at end of file diff --git a/siro_rider/android/app/.cxx/Debug/3p4b322x/x86_64/prefab_config.json b/siro_rider/android/app/.cxx/Debug/3p4b322x/x86_64/prefab_config.json new file mode 100644 index 0000000..e799de8 --- /dev/null +++ b/siro_rider/android/app/.cxx/Debug/3p4b322x/x86_64/prefab_config.json @@ -0,0 +1,4 @@ +{ + "enabled": false, + "packages": [] +} \ No newline at end of file diff --git a/siro_rider/android/app/.cxx/Debug/3p4b322x/x86_64/symbol_folder_index.txt b/siro_rider/android/app/.cxx/Debug/3p4b322x/x86_64/symbol_folder_index.txt new file mode 100644 index 0000000..239d057 --- /dev/null +++ b/siro_rider/android/app/.cxx/Debug/3p4b322x/x86_64/symbol_folder_index.txt @@ -0,0 +1 @@ +/Users/hamzaaleghwairyeen/development/App/Intaleq/build/app/intermediates/cxx/Debug/3p4b322x/obj/x86_64 \ No newline at end of file diff --git a/siro_rider/android/app/.cxx/RelWithDebInfo/6t1m4b5v/arm64-v8a/.cmake/api/v1/query/client-agp/cache-v2 b/siro_rider/android/app/.cxx/RelWithDebInfo/6t1m4b5v/arm64-v8a/.cmake/api/v1/query/client-agp/cache-v2 new file mode 100644 index 0000000..e69de29 diff --git a/siro_rider/android/app/.cxx/RelWithDebInfo/6t1m4b5v/arm64-v8a/.cmake/api/v1/query/client-agp/cmakeFiles-v1 b/siro_rider/android/app/.cxx/RelWithDebInfo/6t1m4b5v/arm64-v8a/.cmake/api/v1/query/client-agp/cmakeFiles-v1 new file mode 100644 index 0000000..e69de29 diff --git a/siro_rider/android/app/.cxx/RelWithDebInfo/6t1m4b5v/arm64-v8a/.cmake/api/v1/query/client-agp/codemodel-v2 b/siro_rider/android/app/.cxx/RelWithDebInfo/6t1m4b5v/arm64-v8a/.cmake/api/v1/query/client-agp/codemodel-v2 new file mode 100644 index 0000000..e69de29 diff --git a/siro_rider/android/app/.cxx/RelWithDebInfo/6t1m4b5v/arm64-v8a/.cmake/api/v1/reply/cache-v2-728e9c47ecb3b5b175ac.json b/siro_rider/android/app/.cxx/RelWithDebInfo/6t1m4b5v/arm64-v8a/.cmake/api/v1/reply/cache-v2-728e9c47ecb3b5b175ac.json new file mode 100644 index 0000000..5cfe99b --- /dev/null +++ b/siro_rider/android/app/.cxx/RelWithDebInfo/6t1m4b5v/arm64-v8a/.cmake/api/v1/reply/cache-v2-728e9c47ecb3b5b175ac.json @@ -0,0 +1,1479 @@ +{ + "entries" : + [ + { + "name" : "ANDROID_ABI", + "properties" : + [ + { + "name" : "HELPSTRING", + "value" : "No help, variable specified on the command line." + } + ], + "type" : "UNINITIALIZED", + "value" : "arm64-v8a" + }, + { + "name" : "ANDROID_NDK", + "properties" : + [ + { + "name" : "HELPSTRING", + "value" : "No help, variable specified on the command line." + } + ], + "type" : "UNINITIALIZED", + "value" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973" + }, + { + "name" : "ANDROID_PLATFORM", + "properties" : + [ + { + "name" : "HELPSTRING", + "value" : "No help, variable specified on the command line." + } + ], + "type" : "UNINITIALIZED", + "value" : "android-23" + }, + { + "name" : "CMAKE_ADDR2LINE", + "properties" : + [ + { + "name" : "ADVANCED", + "value" : "1" + }, + { + "name" : "HELPSTRING", + "value" : "Path to a program." + } + ], + "type" : "FILEPATH", + "value" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/bin/llvm-addr2line" + }, + { + "name" : "CMAKE_ANDROID_ARCH_ABI", + "properties" : + [ + { + "name" : "HELPSTRING", + "value" : "No help, variable specified on the command line." + } + ], + "type" : "UNINITIALIZED", + "value" : "arm64-v8a" + }, + { + "name" : "CMAKE_ANDROID_NDK", + "properties" : + [ + { + "name" : "HELPSTRING", + "value" : "No help, variable specified on the command line." + } + ], + "type" : "UNINITIALIZED", + "value" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973" + }, + { + "name" : "CMAKE_AR", + "properties" : + [ + { + "name" : "ADVANCED", + "value" : "1" + }, + { + "name" : "HELPSTRING", + "value" : "Archiver" + } + ], + "type" : "FILEPATH", + "value" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/bin/llvm-ar" + }, + { + "name" : "CMAKE_ASM_FLAGS", + "properties" : + [ + { + "name" : "HELPSTRING", + "value" : "Flags used by the compiler during all build types." + } + ], + "type" : "STRING", + "value" : "" + }, + { + "name" : "CMAKE_ASM_FLAGS_DEBUG", + "properties" : + [ + { + "name" : "HELPSTRING", + "value" : "Flags used by the compiler during debug builds." + } + ], + "type" : "STRING", + "value" : "" + }, + { + "name" : "CMAKE_ASM_FLAGS_RELEASE", + "properties" : + [ + { + "name" : "HELPSTRING", + "value" : "Flags used by the compiler during release builds." + } + ], + "type" : "STRING", + "value" : "" + }, + { + "name" : "CMAKE_BUILD_TYPE", + "properties" : + [ + { + "name" : "HELPSTRING", + "value" : "Choose the type of build, options are: None Debug Release RelWithDebInfo MinSizeRel ..." + } + ], + "type" : "STRING", + "value" : "RelWithDebInfo" + }, + { + "name" : "CMAKE_CACHEFILE_DIR", + "properties" : + [ + { + "name" : "HELPSTRING", + "value" : "This is the directory where this CMakeCache.txt was created" + } + ], + "type" : "INTERNAL", + "value" : "/Users/hamzaaleghwairyeen/development/App/Intaleq/android/app/.cxx/RelWithDebInfo/6t1m4b5v/arm64-v8a" + }, + { + "name" : "CMAKE_CACHE_MAJOR_VERSION", + "properties" : + [ + { + "name" : "HELPSTRING", + "value" : "Major version of cmake used to create the current loaded cache" + } + ], + "type" : "INTERNAL", + "value" : "3" + }, + { + "name" : "CMAKE_CACHE_MINOR_VERSION", + "properties" : + [ + { + "name" : "HELPSTRING", + "value" : "Minor version of cmake used to create the current loaded cache" + } + ], + "type" : "INTERNAL", + "value" : "31" + }, + { + "name" : "CMAKE_CACHE_PATCH_VERSION", + "properties" : + [ + { + "name" : "HELPSTRING", + "value" : "Patch version of cmake used to create the current loaded cache" + } + ], + "type" : "INTERNAL", + "value" : "5" + }, + { + "name" : "CMAKE_COMMAND", + "properties" : + [ + { + "name" : "HELPSTRING", + "value" : "Path to CMake executable." + } + ], + "type" : "INTERNAL", + "value" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/bin/cmake" + }, + { + "name" : "CMAKE_CPACK_COMMAND", + "properties" : + [ + { + "name" : "HELPSTRING", + "value" : "Path to cpack program executable." + } + ], + "type" : "INTERNAL", + "value" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/bin/cpack" + }, + { + "name" : "CMAKE_CTEST_COMMAND", + "properties" : + [ + { + "name" : "HELPSTRING", + "value" : "Path to ctest program executable." + } + ], + "type" : "INTERNAL", + "value" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/bin/ctest" + }, + { + "name" : "CMAKE_CXX_COMPILER", + "properties" : + [ + { + "name" : "ADVANCED", + "value" : "1" + }, + { + "name" : "HELPSTRING", + "value" : "" + } + ], + "type" : "UNINITIALIZED", + "value" : "" + }, + { + "name" : "CMAKE_CXX_COMPILER_AR", + "properties" : + [ + { + "name" : "ADVANCED", + "value" : "1" + }, + { + "name" : "HELPSTRING", + "value" : "LLVM archiver" + } + ], + "type" : "FILEPATH", + "value" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/bin/llvm-ar" + }, + { + "name" : "CMAKE_CXX_COMPILER_CLANG_SCAN_DEPS", + "properties" : + [ + { + "name" : "ADVANCED", + "value" : "1" + }, + { + "name" : "HELPSTRING", + "value" : "`clang-scan-deps` dependency scanner" + } + ], + "type" : "FILEPATH", + "value" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/bin/clang-scan-deps" + }, + { + "name" : "CMAKE_CXX_COMPILER_RANLIB", + "properties" : + [ + { + "name" : "ADVANCED", + "value" : "1" + }, + { + "name" : "HELPSTRING", + "value" : "Generate index for LLVM archive" + } + ], + "type" : "FILEPATH", + "value" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/bin/llvm-ranlib" + }, + { + "name" : "CMAKE_CXX_FLAGS", + "properties" : + [ + { + "name" : "ADVANCED", + "value" : "1" + }, + { + "name" : "HELPSTRING", + "value" : "Flags used by the compiler during all build types." + } + ], + "type" : "STRING", + "value" : "" + }, + { + "name" : "CMAKE_CXX_FLAGS_DEBUG", + "properties" : + [ + { + "name" : "ADVANCED", + "value" : "1" + }, + { + "name" : "HELPSTRING", + "value" : "Flags used by the compiler during debug builds." + } + ], + "type" : "STRING", + "value" : "" + }, + { + "name" : "CMAKE_CXX_FLAGS_MINSIZEREL", + "properties" : + [ + { + "name" : "ADVANCED", + "value" : "1" + }, + { + "name" : "HELPSTRING", + "value" : "Flags used by the CXX compiler during MINSIZEREL builds." + } + ], + "type" : "STRING", + "value" : "-Os -DNDEBUG" + }, + { + "name" : "CMAKE_CXX_FLAGS_RELEASE", + "properties" : + [ + { + "name" : "ADVANCED", + "value" : "1" + }, + { + "name" : "HELPSTRING", + "value" : "Flags used by the compiler during release builds." + } + ], + "type" : "STRING", + "value" : "" + }, + { + "name" : "CMAKE_CXX_FLAGS_RELWITHDEBINFO", + "properties" : + [ + { + "name" : "ADVANCED", + "value" : "1" + }, + { + "name" : "HELPSTRING", + "value" : "Flags used by the CXX compiler during RELWITHDEBINFO builds." + } + ], + "type" : "STRING", + "value" : "-O2 -g -DNDEBUG" + }, + { + "name" : "CMAKE_CXX_STANDARD_LIBRARIES", + "properties" : + [ + { + "name" : "ADVANCED", + "value" : "1" + }, + { + "name" : "HELPSTRING", + "value" : "Libraries linked by default with all C++ applications." + } + ], + "type" : "STRING", + "value" : "-latomic -lm" + }, + { + "name" : "CMAKE_C_COMPILER", + "properties" : + [ + { + "name" : "ADVANCED", + "value" : "1" + }, + { + "name" : "HELPSTRING", + "value" : "" + } + ], + "type" : "UNINITIALIZED", + "value" : "" + }, + { + "name" : "CMAKE_C_COMPILER_AR", + "properties" : + [ + { + "name" : "ADVANCED", + "value" : "1" + }, + { + "name" : "HELPSTRING", + "value" : "LLVM archiver" + } + ], + "type" : "FILEPATH", + "value" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/bin/llvm-ar" + }, + { + "name" : "CMAKE_C_COMPILER_CLANG_SCAN_DEPS", + "properties" : + [ + { + "name" : "ADVANCED", + "value" : "1" + }, + { + "name" : "HELPSTRING", + "value" : "`clang-scan-deps` dependency scanner" + } + ], + "type" : "FILEPATH", + "value" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/bin/clang-scan-deps" + }, + { + "name" : "CMAKE_C_COMPILER_RANLIB", + "properties" : + [ + { + "name" : "ADVANCED", + "value" : "1" + }, + { + "name" : "HELPSTRING", + "value" : "Generate index for LLVM archive" + } + ], + "type" : "FILEPATH", + "value" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/bin/llvm-ranlib" + }, + { + "name" : "CMAKE_C_FLAGS", + "properties" : + [ + { + "name" : "ADVANCED", + "value" : "1" + }, + { + "name" : "HELPSTRING", + "value" : "Flags used by the compiler during all build types." + } + ], + "type" : "STRING", + "value" : "" + }, + { + "name" : "CMAKE_C_FLAGS_DEBUG", + "properties" : + [ + { + "name" : "ADVANCED", + "value" : "1" + }, + { + "name" : "HELPSTRING", + "value" : "Flags used by the compiler during debug builds." + } + ], + "type" : "STRING", + "value" : "" + }, + { + "name" : "CMAKE_C_FLAGS_MINSIZEREL", + "properties" : + [ + { + "name" : "ADVANCED", + "value" : "1" + }, + { + "name" : "HELPSTRING", + "value" : "Flags used by the C compiler during MINSIZEREL builds." + } + ], + "type" : "STRING", + "value" : "-Os -DNDEBUG" + }, + { + "name" : "CMAKE_C_FLAGS_RELEASE", + "properties" : + [ + { + "name" : "ADVANCED", + "value" : "1" + }, + { + "name" : "HELPSTRING", + "value" : "Flags used by the compiler during release builds." + } + ], + "type" : "STRING", + "value" : "" + }, + { + "name" : "CMAKE_C_FLAGS_RELWITHDEBINFO", + "properties" : + [ + { + "name" : "ADVANCED", + "value" : "1" + }, + { + "name" : "HELPSTRING", + "value" : "Flags used by the C compiler during RELWITHDEBINFO builds." + } + ], + "type" : "STRING", + "value" : "-O2 -g -DNDEBUG" + }, + { + "name" : "CMAKE_C_STANDARD_LIBRARIES", + "properties" : + [ + { + "name" : "ADVANCED", + "value" : "1" + }, + { + "name" : "HELPSTRING", + "value" : "Libraries linked by default with all C applications." + } + ], + "type" : "STRING", + "value" : "-latomic -lm" + }, + { + "name" : "CMAKE_DLLTOOL", + "properties" : + [ + { + "name" : "ADVANCED", + "value" : "1" + }, + { + "name" : "HELPSTRING", + "value" : "Path to a program." + } + ], + "type" : "FILEPATH", + "value" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/bin/llvm-dlltool" + }, + { + "name" : "CMAKE_EDIT_COMMAND", + "properties" : + [ + { + "name" : "HELPSTRING", + "value" : "Path to cache edit program executable." + } + ], + "type" : "INTERNAL", + "value" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/bin/ccmake" + }, + { + "name" : "CMAKE_EXECUTABLE_FORMAT", + "properties" : + [ + { + "name" : "HELPSTRING", + "value" : "Executable file format" + } + ], + "type" : "INTERNAL", + "value" : "ELF" + }, + { + "name" : "CMAKE_EXE_LINKER_FLAGS", + "properties" : + [ + { + "name" : "ADVANCED", + "value" : "1" + }, + { + "name" : "HELPSTRING", + "value" : "Flags used by the linker." + } + ], + "type" : "STRING", + "value" : "" + }, + { + "name" : "CMAKE_EXE_LINKER_FLAGS_DEBUG", + "properties" : + [ + { + "name" : "ADVANCED", + "value" : "1" + }, + { + "name" : "HELPSTRING", + "value" : "Flags used by the linker during DEBUG builds." + } + ], + "type" : "STRING", + "value" : "" + }, + { + "name" : "CMAKE_EXE_LINKER_FLAGS_MINSIZEREL", + "properties" : + [ + { + "name" : "ADVANCED", + "value" : "1" + }, + { + "name" : "HELPSTRING", + "value" : "Flags used by the linker during MINSIZEREL builds." + } + ], + "type" : "STRING", + "value" : "" + }, + { + "name" : "CMAKE_EXE_LINKER_FLAGS_RELEASE", + "properties" : + [ + { + "name" : "ADVANCED", + "value" : "1" + }, + { + "name" : "HELPSTRING", + "value" : "Flags used by the linker during RELEASE builds." + } + ], + "type" : "STRING", + "value" : "" + }, + { + "name" : "CMAKE_EXE_LINKER_FLAGS_RELWITHDEBINFO", + "properties" : + [ + { + "name" : "ADVANCED", + "value" : "1" + }, + { + "name" : "HELPSTRING", + "value" : "Flags used by the linker during RELWITHDEBINFO builds." + } + ], + "type" : "STRING", + "value" : "" + }, + { + "name" : "CMAKE_EXPORT_BUILD_DATABASE", + "properties" : + [ + { + "name" : "ADVANCED", + "value" : "1" + }, + { + "name" : "HELPSTRING", + "value" : "Enable/Disable output of build database during the build." + } + ], + "type" : "BOOL", + "value" : "" + }, + { + "name" : "CMAKE_EXPORT_COMPILE_COMMANDS", + "properties" : + [ + { + "name" : "HELPSTRING", + "value" : "No help, variable specified on the command line." + } + ], + "type" : "UNINITIALIZED", + "value" : "ON" + }, + { + "name" : "CMAKE_EXTRA_GENERATOR", + "properties" : + [ + { + "name" : "HELPSTRING", + "value" : "Name of external makefile project generator." + } + ], + "type" : "INTERNAL", + "value" : "" + }, + { + "name" : "CMAKE_FIND_PACKAGE_REDIRECTS_DIR", + "properties" : + [ + { + "name" : "HELPSTRING", + "value" : "Value Computed by CMake." + } + ], + "type" : "STATIC", + "value" : "/Users/hamzaaleghwairyeen/development/App/Intaleq/android/app/.cxx/RelWithDebInfo/6t1m4b5v/arm64-v8a/CMakeFiles/pkgRedirects" + }, + { + "name" : "CMAKE_GENERATOR", + "properties" : + [ + { + "name" : "HELPSTRING", + "value" : "Name of generator." + } + ], + "type" : "INTERNAL", + "value" : "Ninja" + }, + { + "name" : "CMAKE_GENERATOR_INSTANCE", + "properties" : + [ + { + "name" : "HELPSTRING", + "value" : "Generator instance identifier." + } + ], + "type" : "INTERNAL", + "value" : "" + }, + { + "name" : "CMAKE_GENERATOR_PLATFORM", + "properties" : + [ + { + "name" : "HELPSTRING", + "value" : "Name of generator platform." + } + ], + "type" : "INTERNAL", + "value" : "" + }, + { + "name" : "CMAKE_GENERATOR_TOOLSET", + "properties" : + [ + { + "name" : "HELPSTRING", + "value" : "Name of generator toolset." + } + ], + "type" : "INTERNAL", + "value" : "" + }, + { + "name" : "CMAKE_HOME_DIRECTORY", + "properties" : + [ + { + "name" : "HELPSTRING", + "value" : "Source directory with the top level CMakeLists.txt file for this project" + } + ], + "type" : "INTERNAL", + "value" : "/Users/hamzaaleghwairyeen/development/App/Intaleq/android/app/src/main/cpp" + }, + { + "name" : "CMAKE_INSTALL_PREFIX", + "properties" : + [ + { + "name" : "HELPSTRING", + "value" : "Install path prefix, prepended onto install directories." + } + ], + "type" : "PATH", + "value" : "/usr/local" + }, + { + "name" : "CMAKE_INSTALL_SO_NO_EXE", + "properties" : + [ + { + "name" : "HELPSTRING", + "value" : "Install .so files without execute permission." + } + ], + "type" : "INTERNAL", + "value" : "0" + }, + { + "name" : "CMAKE_LIBRARY_OUTPUT_DIRECTORY", + "properties" : + [ + { + "name" : "HELPSTRING", + "value" : "No help, variable specified on the command line." + } + ], + "type" : "UNINITIALIZED", + "value" : "/Users/hamzaaleghwairyeen/development/App/Intaleq/build/app/intermediates/cxx/RelWithDebInfo/6t1m4b5v/obj/arm64-v8a" + }, + { + "name" : "CMAKE_LINKER", + "properties" : + [ + { + "name" : "ADVANCED", + "value" : "1" + }, + { + "name" : "HELPSTRING", + "value" : "Path to a program." + } + ], + "type" : "FILEPATH", + "value" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/bin/ld.lld" + }, + { + "name" : "CMAKE_MAKE_PROGRAM", + "properties" : + [ + { + "name" : "HELPSTRING", + "value" : "No help, variable specified on the command line." + } + ], + "type" : "UNINITIALIZED", + "value" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/bin/ninja" + }, + { + "name" : "CMAKE_MODULE_LINKER_FLAGS", + "properties" : + [ + { + "name" : "ADVANCED", + "value" : "1" + }, + { + "name" : "HELPSTRING", + "value" : "Flags used by the linker during the creation of modules." + } + ], + "type" : "STRING", + "value" : "" + }, + { + "name" : "CMAKE_MODULE_LINKER_FLAGS_DEBUG", + "properties" : + [ + { + "name" : "ADVANCED", + "value" : "1" + }, + { + "name" : "HELPSTRING", + "value" : "Flags used by the linker during the creation of modules during DEBUG builds." + } + ], + "type" : "STRING", + "value" : "" + }, + { + "name" : "CMAKE_MODULE_LINKER_FLAGS_MINSIZEREL", + "properties" : + [ + { + "name" : "ADVANCED", + "value" : "1" + }, + { + "name" : "HELPSTRING", + "value" : "Flags used by the linker during the creation of modules during MINSIZEREL builds." + } + ], + "type" : "STRING", + "value" : "" + }, + { + "name" : "CMAKE_MODULE_LINKER_FLAGS_RELEASE", + "properties" : + [ + { + "name" : "ADVANCED", + "value" : "1" + }, + { + "name" : "HELPSTRING", + "value" : "Flags used by the linker during the creation of modules during RELEASE builds." + } + ], + "type" : "STRING", + "value" : "" + }, + { + "name" : "CMAKE_MODULE_LINKER_FLAGS_RELWITHDEBINFO", + "properties" : + [ + { + "name" : "ADVANCED", + "value" : "1" + }, + { + "name" : "HELPSTRING", + "value" : "Flags used by the linker during the creation of modules during RELWITHDEBINFO builds." + } + ], + "type" : "STRING", + "value" : "" + }, + { + "name" : "CMAKE_NM", + "properties" : + [ + { + "name" : "ADVANCED", + "value" : "1" + }, + { + "name" : "HELPSTRING", + "value" : "Path to a program." + } + ], + "type" : "FILEPATH", + "value" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/bin/llvm-nm" + }, + { + "name" : "CMAKE_NUMBER_OF_MAKEFILES", + "properties" : + [ + { + "name" : "HELPSTRING", + "value" : "number of local generators" + } + ], + "type" : "INTERNAL", + "value" : "1" + }, + { + "name" : "CMAKE_OBJCOPY", + "properties" : + [ + { + "name" : "ADVANCED", + "value" : "1" + }, + { + "name" : "HELPSTRING", + "value" : "Path to a program." + } + ], + "type" : "FILEPATH", + "value" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/bin/llvm-objcopy" + }, + { + "name" : "CMAKE_OBJDUMP", + "properties" : + [ + { + "name" : "ADVANCED", + "value" : "1" + }, + { + "name" : "HELPSTRING", + "value" : "Path to a program." + } + ], + "type" : "FILEPATH", + "value" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/bin/llvm-objdump" + }, + { + "name" : "CMAKE_PLATFORM_INFO_INITIALIZED", + "properties" : + [ + { + "name" : "HELPSTRING", + "value" : "Platform information initialized" + } + ], + "type" : "INTERNAL", + "value" : "1" + }, + { + "name" : "CMAKE_PROJECT_DESCRIPTION", + "properties" : + [ + { + "name" : "HELPSTRING", + "value" : "Value Computed by CMake" + } + ], + "type" : "STATIC", + "value" : "" + }, + { + "name" : "CMAKE_PROJECT_HOMEPAGE_URL", + "properties" : + [ + { + "name" : "HELPSTRING", + "value" : "Value Computed by CMake" + } + ], + "type" : "STATIC", + "value" : "" + }, + { + "name" : "CMAKE_PROJECT_NAME", + "properties" : + [ + { + "name" : "HELPSTRING", + "value" : "Value Computed by CMake" + } + ], + "type" : "STATIC", + "value" : "intaleq" + }, + { + "name" : "CMAKE_RANLIB", + "properties" : + [ + { + "name" : "ADVANCED", + "value" : "1" + }, + { + "name" : "HELPSTRING", + "value" : "Ranlib" + } + ], + "type" : "FILEPATH", + "value" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/bin/llvm-ranlib" + }, + { + "name" : "CMAKE_READELF", + "properties" : + [ + { + "name" : "ADVANCED", + "value" : "1" + }, + { + "name" : "HELPSTRING", + "value" : "Path to a program." + } + ], + "type" : "FILEPATH", + "value" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/bin/llvm-readelf" + }, + { + "name" : "CMAKE_ROOT", + "properties" : + [ + { + "name" : "HELPSTRING", + "value" : "Path to CMake installation." + } + ], + "type" : "INTERNAL", + "value" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31" + }, + { + "name" : "CMAKE_RUNTIME_OUTPUT_DIRECTORY", + "properties" : + [ + { + "name" : "HELPSTRING", + "value" : "No help, variable specified on the command line." + } + ], + "type" : "UNINITIALIZED", + "value" : "/Users/hamzaaleghwairyeen/development/App/Intaleq/build/app/intermediates/cxx/RelWithDebInfo/6t1m4b5v/obj/arm64-v8a" + }, + { + "name" : "CMAKE_SHARED_LINKER_FLAGS", + "properties" : + [ + { + "name" : "ADVANCED", + "value" : "1" + }, + { + "name" : "HELPSTRING", + "value" : "Flags used by the linker during the creation of dll's." + } + ], + "type" : "STRING", + "value" : "" + }, + { + "name" : "CMAKE_SHARED_LINKER_FLAGS_DEBUG", + "properties" : + [ + { + "name" : "ADVANCED", + "value" : "1" + }, + { + "name" : "HELPSTRING", + "value" : "Flags used by the linker during the creation of shared libraries during DEBUG builds." + } + ], + "type" : "STRING", + "value" : "" + }, + { + "name" : "CMAKE_SHARED_LINKER_FLAGS_MINSIZEREL", + "properties" : + [ + { + "name" : "ADVANCED", + "value" : "1" + }, + { + "name" : "HELPSTRING", + "value" : "Flags used by the linker during the creation of shared libraries during MINSIZEREL builds." + } + ], + "type" : "STRING", + "value" : "" + }, + { + "name" : "CMAKE_SHARED_LINKER_FLAGS_RELEASE", + "properties" : + [ + { + "name" : "ADVANCED", + "value" : "1" + }, + { + "name" : "HELPSTRING", + "value" : "Flags used by the linker during the creation of shared libraries during RELEASE builds." + } + ], + "type" : "STRING", + "value" : "" + }, + { + "name" : "CMAKE_SHARED_LINKER_FLAGS_RELWITHDEBINFO", + "properties" : + [ + { + "name" : "ADVANCED", + "value" : "1" + }, + { + "name" : "HELPSTRING", + "value" : "Flags used by the linker during the creation of shared libraries during RELWITHDEBINFO builds." + } + ], + "type" : "STRING", + "value" : "" + }, + { + "name" : "CMAKE_SKIP_INSTALL_RPATH", + "properties" : + [ + { + "name" : "ADVANCED", + "value" : "1" + }, + { + "name" : "HELPSTRING", + "value" : "If set, runtime paths are not added when installing shared libraries, but are added when building." + } + ], + "type" : "BOOL", + "value" : "NO" + }, + { + "name" : "CMAKE_SKIP_RPATH", + "properties" : + [ + { + "name" : "ADVANCED", + "value" : "1" + }, + { + "name" : "HELPSTRING", + "value" : "If set, runtime paths are not added when using shared libraries." + } + ], + "type" : "BOOL", + "value" : "NO" + }, + { + "name" : "CMAKE_STATIC_LINKER_FLAGS", + "properties" : + [ + { + "name" : "ADVANCED", + "value" : "1" + }, + { + "name" : "HELPSTRING", + "value" : "Flags used by the linker during the creation of static libraries during all build types." + } + ], + "type" : "STRING", + "value" : "" + }, + { + "name" : "CMAKE_STATIC_LINKER_FLAGS_DEBUG", + "properties" : + [ + { + "name" : "ADVANCED", + "value" : "1" + }, + { + "name" : "HELPSTRING", + "value" : "Flags used by the linker during the creation of static libraries during DEBUG builds." + } + ], + "type" : "STRING", + "value" : "" + }, + { + "name" : "CMAKE_STATIC_LINKER_FLAGS_MINSIZEREL", + "properties" : + [ + { + "name" : "ADVANCED", + "value" : "1" + }, + { + "name" : "HELPSTRING", + "value" : "Flags used by the linker during the creation of static libraries during MINSIZEREL builds." + } + ], + "type" : "STRING", + "value" : "" + }, + { + "name" : "CMAKE_STATIC_LINKER_FLAGS_RELEASE", + "properties" : + [ + { + "name" : "ADVANCED", + "value" : "1" + }, + { + "name" : "HELPSTRING", + "value" : "Flags used by the linker during the creation of static libraries during RELEASE builds." + } + ], + "type" : "STRING", + "value" : "" + }, + { + "name" : "CMAKE_STATIC_LINKER_FLAGS_RELWITHDEBINFO", + "properties" : + [ + { + "name" : "ADVANCED", + "value" : "1" + }, + { + "name" : "HELPSTRING", + "value" : "Flags used by the linker during the creation of static libraries during RELWITHDEBINFO builds." + } + ], + "type" : "STRING", + "value" : "" + }, + { + "name" : "CMAKE_STRIP", + "properties" : + [ + { + "name" : "ADVANCED", + "value" : "1" + }, + { + "name" : "HELPSTRING", + "value" : "Strip" + } + ], + "type" : "FILEPATH", + "value" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/bin/llvm-strip" + }, + { + "name" : "CMAKE_SYSTEM_NAME", + "properties" : + [ + { + "name" : "HELPSTRING", + "value" : "No help, variable specified on the command line." + } + ], + "type" : "UNINITIALIZED", + "value" : "Android" + }, + { + "name" : "CMAKE_SYSTEM_VERSION", + "properties" : + [ + { + "name" : "HELPSTRING", + "value" : "No help, variable specified on the command line." + } + ], + "type" : "UNINITIALIZED", + "value" : "23" + }, + { + "name" : "CMAKE_TAPI", + "properties" : + [ + { + "name" : "ADVANCED", + "value" : "1" + }, + { + "name" : "HELPSTRING", + "value" : "Path to a program." + } + ], + "type" : "FILEPATH", + "value" : "CMAKE_TAPI-NOTFOUND" + }, + { + "name" : "CMAKE_TOOLCHAIN_FILE", + "properties" : + [ + { + "name" : "HELPSTRING", + "value" : "The CMake toolchain file" + } + ], + "type" : "FILEPATH", + "value" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/build/cmake/android.toolchain.cmake" + }, + { + "name" : "CMAKE_UNAME", + "properties" : + [ + { + "name" : "HELPSTRING", + "value" : "uname command" + } + ], + "type" : "INTERNAL", + "value" : "/usr/bin/uname" + }, + { + "name" : "CMAKE_VERBOSE_MAKEFILE", + "properties" : + [ + { + "name" : "ADVANCED", + "value" : "1" + }, + { + "name" : "HELPSTRING", + "value" : "If this value is on, makefiles will be generated without the .SILENT directive, and all commands will be echoed to the console during the make. This is useful for debugging only. With Visual Studio IDE projects all commands are done without /nologo." + } + ], + "type" : "BOOL", + "value" : "FALSE" + }, + { + "name" : "_CMAKE_CXX_LINKER_PUSHPOP_STATE_SUPPORTED", + "properties" : + [ + { + "name" : "HELPSTRING", + "value" : "linker supports push/pop state" + } + ], + "type" : "INTERNAL", + "value" : "TRUE" + }, + { + "name" : "_CMAKE_C_LINKER_PUSHPOP_STATE_SUPPORTED", + "properties" : + [ + { + "name" : "HELPSTRING", + "value" : "linker supports push/pop state" + } + ], + "type" : "INTERNAL", + "value" : "TRUE" + }, + { + "name" : "_CMAKE_LINKER_PUSHPOP_STATE_SUPPORTED", + "properties" : + [ + { + "name" : "HELPSTRING", + "value" : "linker supports push/pop state" + } + ], + "type" : "INTERNAL", + "value" : "TRUE" + }, + { + "name" : "intaleq_BINARY_DIR", + "properties" : + [ + { + "name" : "HELPSTRING", + "value" : "Value Computed by CMake" + } + ], + "type" : "STATIC", + "value" : "/Users/hamzaaleghwairyeen/development/App/Intaleq/android/app/.cxx/RelWithDebInfo/6t1m4b5v/arm64-v8a" + }, + { + "name" : "intaleq_IS_TOP_LEVEL", + "properties" : + [ + { + "name" : "HELPSTRING", + "value" : "Value Computed by CMake" + } + ], + "type" : "STATIC", + "value" : "ON" + }, + { + "name" : "intaleq_SOURCE_DIR", + "properties" : + [ + { + "name" : "HELPSTRING", + "value" : "Value Computed by CMake" + } + ], + "type" : "STATIC", + "value" : "/Users/hamzaaleghwairyeen/development/App/Intaleq/android/app/src/main/cpp" + }, + { + "name" : "log-lib", + "properties" : + [ + { + "name" : "HELPSTRING", + "value" : "Path to a library." + } + ], + "type" : "FILEPATH", + "value" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/lib/aarch64-linux-android/23/liblog.so" + }, + { + "name" : "native-lib_LIB_DEPENDS", + "properties" : + [ + { + "name" : "HELPSTRING", + "value" : "Dependencies for the target" + } + ], + "type" : "STATIC", + "value" : "general;/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/lib/aarch64-linux-android/23/liblog.so;" + } + ], + "kind" : "cache", + "version" : + { + "major" : 2, + "minor" : 0 + } +} diff --git a/siro_rider/android/app/.cxx/RelWithDebInfo/6t1m4b5v/arm64-v8a/.cmake/api/v1/reply/cmakeFiles-v1-77dbeabcd99acbc02a06.json b/siro_rider/android/app/.cxx/RelWithDebInfo/6t1m4b5v/arm64-v8a/.cmake/api/v1/reply/cmakeFiles-v1-77dbeabcd99acbc02a06.json new file mode 100644 index 0000000..084a5e8 --- /dev/null +++ b/siro_rider/android/app/.cxx/RelWithDebInfo/6t1m4b5v/arm64-v8a/.cmake/api/v1/reply/cmakeFiles-v1-77dbeabcd99acbc02a06.json @@ -0,0 +1,968 @@ +{ + "inputs" : + [ + { + "path" : "CMakeLists.txt" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeDetermineSystem.cmake" + }, + { + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/build/cmake/android.toolchain.cmake" + }, + { + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/build/cmake/android-legacy.toolchain.cmake" + }, + { + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/build/cmake/abis.cmake" + }, + { + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/build/cmake/platforms.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Platform/Android-Determine.cmake" + }, + { + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/build/cmake/hooks/pre/Android-Determine.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeSystem.cmake.in" + }, + { + "isGenerated" : true, + "path" : "/Users/hamzaaleghwairyeen/development/App/Intaleq/android/app/.cxx/RelWithDebInfo/6t1m4b5v/arm64-v8a/CMakeFiles/3.31.5-g6cf5163/CMakeSystem.cmake" + }, + { + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/build/cmake/android.toolchain.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeSystemSpecificInitialize.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Platform/Android-Initialize.cmake" + }, + { + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/build/cmake/hooks/pre/Android-Initialize.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Platform/Linux-Initialize.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeDetermineCCompiler.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeDetermineCompiler.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Platform/Android-Determine-C.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Platform/Android/Determine-Compiler.cmake" + }, + { + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/build/cmake/hooks/pre/Determine-Compiler.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeDetermineCompilerId.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeCompilerIdDetection.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/ADSP-DetermineCompiler.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/ARMCC-DetermineCompiler.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/ARMClang-DetermineCompiler.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/AppleClang-DetermineCompiler.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/Clang-DetermineCompilerInternal.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/Borland-DetermineCompiler.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/Bruce-C-DetermineCompiler.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/Clang-DetermineCompiler.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/Clang-DetermineCompilerInternal.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/Compaq-C-DetermineCompiler.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/Cray-DetermineCompiler.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/CrayClang-DetermineCompiler.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/Embarcadero-DetermineCompiler.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/Fujitsu-DetermineCompiler.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/FujitsuClang-DetermineCompiler.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/GHS-DetermineCompiler.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/GNU-C-DetermineCompiler.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/HP-C-DetermineCompiler.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/IAR-DetermineCompiler.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/IBMClang-C-DetermineCompiler.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/Intel-DetermineCompiler.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/IntelLLVM-DetermineCompiler.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/LCC-C-DetermineCompiler.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/MSVC-DetermineCompiler.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/NVHPC-DetermineCompiler.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/NVIDIA-DetermineCompiler.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/OpenWatcom-DetermineCompiler.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/OrangeC-DetermineCompiler.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/PGI-DetermineCompiler.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/PathScale-DetermineCompiler.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/SCO-DetermineCompiler.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/SDCC-C-DetermineCompiler.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/SunPro-C-DetermineCompiler.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/TI-DetermineCompiler.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/TIClang-DetermineCompiler.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/Tasking-DetermineCompiler.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/TinyCC-C-DetermineCompiler.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/VisualAge-C-DetermineCompiler.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/IBMCPP-C-DetermineVersionInternal.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/Watcom-DetermineCompiler.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/XL-C-DetermineCompiler.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/IBMCPP-C-DetermineVersionInternal.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/XLClang-C-DetermineCompiler.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/zOS-C-DetermineCompiler.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/IBMCPP-C-DetermineVersionInternal.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeFindBinUtils.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/Clang-FindBinUtils.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeCCompiler.cmake.in" + }, + { + "isGenerated" : true, + "path" : "/Users/hamzaaleghwairyeen/development/App/Intaleq/android/app/.cxx/RelWithDebInfo/6t1m4b5v/arm64-v8a/CMakeFiles/3.31.5-g6cf5163/CMakeCCompiler.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeDetermineCXXCompiler.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeDetermineCompiler.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Platform/Android-Determine-CXX.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Platform/Android/Determine-Compiler.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeDetermineCompilerId.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeCompilerIdDetection.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/ADSP-DetermineCompiler.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/ARMCC-DetermineCompiler.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/ARMClang-DetermineCompiler.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/AppleClang-DetermineCompiler.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/Clang-DetermineCompilerInternal.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/Borland-DetermineCompiler.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/Clang-DetermineCompiler.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/Clang-DetermineCompilerInternal.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/Compaq-CXX-DetermineCompiler.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/Cray-DetermineCompiler.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/CrayClang-DetermineCompiler.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/Embarcadero-DetermineCompiler.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/Fujitsu-DetermineCompiler.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/FujitsuClang-DetermineCompiler.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/GHS-DetermineCompiler.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/GNU-CXX-DetermineCompiler.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/HP-CXX-DetermineCompiler.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/IAR-DetermineCompiler.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/IBMClang-CXX-DetermineCompiler.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/Intel-DetermineCompiler.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/IntelLLVM-DetermineCompiler.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/LCC-CXX-DetermineCompiler.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/MSVC-DetermineCompiler.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/NVHPC-DetermineCompiler.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/NVIDIA-DetermineCompiler.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/OpenWatcom-DetermineCompiler.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/OrangeC-DetermineCompiler.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/PGI-DetermineCompiler.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/PathScale-DetermineCompiler.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/SCO-DetermineCompiler.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/SunPro-CXX-DetermineCompiler.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/TI-DetermineCompiler.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/TIClang-DetermineCompiler.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/Tasking-DetermineCompiler.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/VisualAge-CXX-DetermineCompiler.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/IBMCPP-CXX-DetermineVersionInternal.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/Watcom-DetermineCompiler.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/XL-CXX-DetermineCompiler.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/IBMCPP-CXX-DetermineVersionInternal.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/XLClang-CXX-DetermineCompiler.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/zOS-CXX-DetermineCompiler.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/IBMCPP-CXX-DetermineVersionInternal.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeFindBinUtils.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/Clang-FindBinUtils.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeCXXCompiler.cmake.in" + }, + { + "isGenerated" : true, + "path" : "/Users/hamzaaleghwairyeen/development/App/Intaleq/android/app/.cxx/RelWithDebInfo/6t1m4b5v/arm64-v8a/CMakeFiles/3.31.5-g6cf5163/CMakeCXXCompiler.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeSystemSpecificInformation.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeGenericSystem.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeInitializeConfigs.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Platform/Android.cmake" + }, + { + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/build/cmake/hooks/pre/Android.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Platform/Linux.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Platform/UnixPaths.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeCInformation.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeLanguageInformation.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/Clang-C.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/Clang.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/CMakeCommonCompilerMacros.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/GNU.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/CMakeCommonCompilerMacros.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Platform/Android-Clang-C.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Platform/Android-Clang.cmake" + }, + { + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/build/cmake/hooks/pre/Android-Clang.cmake" + }, + { + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/build/cmake/flags.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeCommonLanguageInclude.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeTestCCompiler.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeTestCompilerCommon.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeDetermineCompilerABI.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Internal/CMakeDetermineLinkerId.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeParseImplicitIncludeInfo.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeParseImplicitLinkInfo.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeParseLibraryArchitecture.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeTestCompilerCommon.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeCCompilerABI.c" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeDetermineCompilerSupport.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Internal/FeatureTesting.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeCCompiler.cmake.in" + }, + { + "isGenerated" : true, + "path" : "/Users/hamzaaleghwairyeen/development/App/Intaleq/android/app/.cxx/RelWithDebInfo/6t1m4b5v/arm64-v8a/CMakeFiles/3.31.5-g6cf5163/CMakeCCompiler.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Internal/CMakeCLinkerInformation.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Internal/CMakeCommonLinkerInformation.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Linker/LLD-C.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Linker/LLD.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Linker/GNU.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Platform/Linker/Android-LLD-C.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Platform/Linker/Linux-LLD-C.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Platform/Linker/Linux-LLD.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Platform/Linker/Linux-GNU.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Platform/Linker/GNU.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeCXXInformation.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeLanguageInformation.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/Clang-CXX.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/Clang.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Platform/Android-Clang-CXX.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Platform/Android-Clang.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeCommonLanguageInclude.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeTestCXXCompiler.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeTestCompilerCommon.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeDetermineCompilerABI.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Internal/CMakeDetermineLinkerId.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeParseImplicitIncludeInfo.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeParseImplicitLinkInfo.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeParseLibraryArchitecture.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeTestCompilerCommon.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeCXXCompilerABI.cpp" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeDetermineCompilerSupport.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Internal/FeatureTesting.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/Clang-CXX-CXXImportStd.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/Clang-CXX-CXXImportStd.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeCXXCompiler.cmake.in" + }, + { + "isGenerated" : true, + "path" : "/Users/hamzaaleghwairyeen/development/App/Intaleq/android/app/.cxx/RelWithDebInfo/6t1m4b5v/arm64-v8a/CMakeFiles/3.31.5-g6cf5163/CMakeCXXCompiler.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Internal/CMakeCXXLinkerInformation.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Internal/CMakeCommonLinkerInformation.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Linker/LLD-CXX.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Linker/LLD.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Platform/Linker/Android-LLD-CXX.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Platform/Linker/Linux-LLD-CXX.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Platform/Linker/Linux-LLD.cmake" + } + ], + "kind" : "cmakeFiles", + "paths" : + { + "build" : "/Users/hamzaaleghwairyeen/development/App/Intaleq/android/app/.cxx/RelWithDebInfo/6t1m4b5v/arm64-v8a", + "source" : "/Users/hamzaaleghwairyeen/development/App/Intaleq/android/app/src/main/cpp" + }, + "version" : + { + "major" : 1, + "minor" : 1 + } +} diff --git a/siro_rider/android/app/.cxx/RelWithDebInfo/6t1m4b5v/arm64-v8a/.cmake/api/v1/reply/codemodel-v2-178b1e5f97202b0195cd.json b/siro_rider/android/app/.cxx/RelWithDebInfo/6t1m4b5v/arm64-v8a/.cmake/api/v1/reply/codemodel-v2-178b1e5f97202b0195cd.json new file mode 100644 index 0000000..c5d814f --- /dev/null +++ b/siro_rider/android/app/.cxx/RelWithDebInfo/6t1m4b5v/arm64-v8a/.cmake/api/v1/reply/codemodel-v2-178b1e5f97202b0195cd.json @@ -0,0 +1,60 @@ +{ + "configurations" : + [ + { + "directories" : + [ + { + "build" : ".", + "jsonFile" : "directory-.-RelWithDebInfo-f5ebdc15457944623624.json", + "minimumCMakeVersion" : + { + "string" : "3.6.0" + }, + "projectIndex" : 0, + "source" : ".", + "targetIndexes" : + [ + 0 + ] + } + ], + "name" : "RelWithDebInfo", + "projects" : + [ + { + "directoryIndexes" : + [ + 0 + ], + "name" : "intaleq", + "targetIndexes" : + [ + 0 + ] + } + ], + "targets" : + [ + { + "directoryIndex" : 0, + "id" : "native-lib::@6890427a1f51a3e7e1df", + "jsonFile" : "target-native-lib-RelWithDebInfo-3114bc1da836e855ba35.json", + "name" : "native-lib", + "projectIndex" : 0 + } + ] + } + ], + "kind" : "codemodel", + "paths" : + { + "build" : "/Users/hamzaaleghwairyeen/development/App/Intaleq/android/app/.cxx/RelWithDebInfo/6t1m4b5v/arm64-v8a", + "source" : "/Users/hamzaaleghwairyeen/development/App/Intaleq/android/app/src/main/cpp" + }, + "version" : + { + "major" : 2, + "minor" : 7 + } +} diff --git a/siro_rider/android/app/.cxx/RelWithDebInfo/6t1m4b5v/arm64-v8a/.cmake/api/v1/reply/directory-.-RelWithDebInfo-f5ebdc15457944623624.json b/siro_rider/android/app/.cxx/RelWithDebInfo/6t1m4b5v/arm64-v8a/.cmake/api/v1/reply/directory-.-RelWithDebInfo-f5ebdc15457944623624.json new file mode 100644 index 0000000..3a67af9 --- /dev/null +++ b/siro_rider/android/app/.cxx/RelWithDebInfo/6t1m4b5v/arm64-v8a/.cmake/api/v1/reply/directory-.-RelWithDebInfo-f5ebdc15457944623624.json @@ -0,0 +1,14 @@ +{ + "backtraceGraph" : + { + "commands" : [], + "files" : [], + "nodes" : [] + }, + "installers" : [], + "paths" : + { + "build" : ".", + "source" : "." + } +} diff --git a/siro_rider/android/app/.cxx/RelWithDebInfo/6t1m4b5v/arm64-v8a/.cmake/api/v1/reply/index-2025-07-02T20-13-58-0764.json b/siro_rider/android/app/.cxx/RelWithDebInfo/6t1m4b5v/arm64-v8a/.cmake/api/v1/reply/index-2025-07-02T20-13-58-0764.json new file mode 100644 index 0000000..7e01f3a --- /dev/null +++ b/siro_rider/android/app/.cxx/RelWithDebInfo/6t1m4b5v/arm64-v8a/.cmake/api/v1/reply/index-2025-07-02T20-13-58-0764.json @@ -0,0 +1,92 @@ +{ + "cmake" : + { + "generator" : + { + "multiConfig" : false, + "name" : "Ninja" + }, + "paths" : + { + "cmake" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/bin/cmake", + "cpack" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/bin/cpack", + "ctest" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/bin/ctest", + "root" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31" + }, + "version" : + { + "isDirty" : false, + "major" : 3, + "minor" : 31, + "patch" : 5, + "string" : "3.31.5-g6cf5163", + "suffix" : "g6cf5163" + } + }, + "objects" : + [ + { + "jsonFile" : "codemodel-v2-178b1e5f97202b0195cd.json", + "kind" : "codemodel", + "version" : + { + "major" : 2, + "minor" : 7 + } + }, + { + "jsonFile" : "cache-v2-728e9c47ecb3b5b175ac.json", + "kind" : "cache", + "version" : + { + "major" : 2, + "minor" : 0 + } + }, + { + "jsonFile" : "cmakeFiles-v1-77dbeabcd99acbc02a06.json", + "kind" : "cmakeFiles", + "version" : + { + "major" : 1, + "minor" : 1 + } + } + ], + "reply" : + { + "client-agp" : + { + "cache-v2" : + { + "jsonFile" : "cache-v2-728e9c47ecb3b5b175ac.json", + "kind" : "cache", + "version" : + { + "major" : 2, + "minor" : 0 + } + }, + "cmakeFiles-v1" : + { + "jsonFile" : "cmakeFiles-v1-77dbeabcd99acbc02a06.json", + "kind" : "cmakeFiles", + "version" : + { + "major" : 1, + "minor" : 1 + } + }, + "codemodel-v2" : + { + "jsonFile" : "codemodel-v2-178b1e5f97202b0195cd.json", + "kind" : "codemodel", + "version" : + { + "major" : 2, + "minor" : 7 + } + } + } + } +} diff --git a/siro_rider/android/app/.cxx/RelWithDebInfo/6t1m4b5v/arm64-v8a/.cmake/api/v1/reply/target-native-lib-RelWithDebInfo-3114bc1da836e855ba35.json b/siro_rider/android/app/.cxx/RelWithDebInfo/6t1m4b5v/arm64-v8a/.cmake/api/v1/reply/target-native-lib-RelWithDebInfo-3114bc1da836e855ba35.json new file mode 100644 index 0000000..20f0a4f --- /dev/null +++ b/siro_rider/android/app/.cxx/RelWithDebInfo/6t1m4b5v/arm64-v8a/.cmake/api/v1/reply/target-native-lib-RelWithDebInfo-3114bc1da836e855ba35.json @@ -0,0 +1,117 @@ +{ + "artifacts" : + [ + { + "path" : "/Users/hamzaaleghwairyeen/development/App/Intaleq/build/app/intermediates/cxx/RelWithDebInfo/6t1m4b5v/obj/arm64-v8a/libnative-lib.so" + } + ], + "backtrace" : 1, + "backtraceGraph" : + { + "commands" : + [ + "add_library", + "target_link_libraries" + ], + "files" : + [ + "CMakeLists.txt" + ], + "nodes" : + [ + { + "file" : 0 + }, + { + "command" : 0, + "file" : 0, + "line" : 4, + "parent" : 0 + }, + { + "command" : 1, + "file" : 0, + "line" : 8, + "parent" : 0 + } + ] + }, + "compileGroups" : + [ + { + "compileCommandFragments" : + [ + { + "fragment" : "-g -DANDROID -fdata-sections -ffunction-sections -funwind-tables -fstack-protector-strong -no-canonical-prefixes -D_FORTIFY_SOURCE=2 -Wformat -Werror=format-security -O2 -g -DNDEBUG -fPIC" + } + ], + "defines" : + [ + { + "define" : "native_lib_EXPORTS" + } + ], + "language" : "CXX", + "sourceIndexes" : + [ + 0 + ], + "sysroot" : + { + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot" + } + } + ], + "id" : "native-lib::@6890427a1f51a3e7e1df", + "link" : + { + "commandFragments" : + [ + { + "fragment" : "-static-libstdc++ -Wl,--build-id=sha1 -Wl,--no-rosegment -Wl,--no-undefined-version -Wl,--fatal-warnings -Wl,--no-undefined -Qunused-arguments -Wl,--gc-sections", + "role" : "flags" + }, + { + "backtrace" : 2, + "fragment" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/lib/aarch64-linux-android/23/liblog.so", + "role" : "libraries" + }, + { + "fragment" : "-latomic -lm", + "role" : "libraries" + } + ], + "language" : "CXX", + "sysroot" : + { + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot" + } + }, + "name" : "native-lib", + "nameOnDisk" : "libnative-lib.so", + "paths" : + { + "build" : ".", + "source" : "." + }, + "sourceGroups" : + [ + { + "name" : "Source Files", + "sourceIndexes" : + [ + 0 + ] + } + ], + "sources" : + [ + { + "backtrace" : 1, + "compileGroupIndex" : 0, + "path" : "native-lib.cpp", + "sourceGroupIndex" : 0 + } + ], + "type" : "SHARED_LIBRARY" +} diff --git a/siro_rider/android/app/.cxx/RelWithDebInfo/6t1m4b5v/arm64-v8a/.ninja_deps b/siro_rider/android/app/.cxx/RelWithDebInfo/6t1m4b5v/arm64-v8a/.ninja_deps new file mode 100644 index 0000000..9b242c1 Binary files /dev/null and b/siro_rider/android/app/.cxx/RelWithDebInfo/6t1m4b5v/arm64-v8a/.ninja_deps differ diff --git a/siro_rider/android/app/.cxx/RelWithDebInfo/6t1m4b5v/arm64-v8a/.ninja_log b/siro_rider/android/app/.cxx/RelWithDebInfo/6t1m4b5v/arm64-v8a/.ninja_log new file mode 100644 index 0000000..3f252b3 --- /dev/null +++ b/siro_rider/android/app/.cxx/RelWithDebInfo/6t1m4b5v/arm64-v8a/.ninja_log @@ -0,0 +1,5 @@ +# ninja log v5 +1 1289 1751487240427836679 CMakeFiles/native-lib.dir/native-lib.cpp.o 9fa6ae4c3d1af9f7 +1290 1585 1751487240723618063 /Users/hamzaaleghwairyeen/development/App/Intaleq/build/app/intermediates/cxx/RelWithDebInfo/6t1m4b5v/obj/arm64-v8a/libnative-lib.so 5d27b71b6fd57d89 +201 2477 1751488086614790213 /Users/hamzaaleghwairyeen/development/App/Intaleq/build/app/intermediates/cxx/RelWithDebInfo/6t1m4b5v/obj/arm64-v8a/libnative-lib.so 5d27b71b6fd57d89 +66 1166 1753054204152382841 /Users/hamzaaleghwairyeen/development/App/Intaleq/build/app/intermediates/cxx/RelWithDebInfo/6t1m4b5v/obj/arm64-v8a/libnative-lib.so 5d27b71b6fd57d89 diff --git a/siro_rider/android/app/.cxx/RelWithDebInfo/6t1m4b5v/arm64-v8a/CMakeCache.txt b/siro_rider/android/app/.cxx/RelWithDebInfo/6t1m4b5v/arm64-v8a/CMakeCache.txt new file mode 100644 index 0000000..d462cfb --- /dev/null +++ b/siro_rider/android/app/.cxx/RelWithDebInfo/6t1m4b5v/arm64-v8a/CMakeCache.txt @@ -0,0 +1,430 @@ +# This is the CMakeCache file. +# For build in directory: /Users/hamzaaleghwairyeen/development/App/Intaleq/android/app/.cxx/RelWithDebInfo/6t1m4b5v/arm64-v8a +# It was generated by CMake: /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/bin/cmake +# You can edit this file to change values found and used by cmake. +# If you do not want to change any of the values, simply exit the editor. +# If you do want to change a value, simply edit, save, and exit the editor. +# The syntax for the file is as follows: +# KEY:TYPE=VALUE +# KEY is the name of a variable in the cache. +# TYPE is a hint to GUIs for the type of VALUE, DO NOT EDIT TYPE!. +# VALUE is the current value for the KEY. + +######################## +# EXTERNAL cache entries +######################## + +//No help, variable specified on the command line. +ANDROID_ABI:UNINITIALIZED=arm64-v8a + +//No help, variable specified on the command line. +ANDROID_NDK:UNINITIALIZED=/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973 + +//No help, variable specified on the command line. +ANDROID_PLATFORM:UNINITIALIZED=android-23 + +//Path to a program. +CMAKE_ADDR2LINE:FILEPATH=/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/bin/llvm-addr2line + +//No help, variable specified on the command line. +CMAKE_ANDROID_ARCH_ABI:UNINITIALIZED=arm64-v8a + +//No help, variable specified on the command line. +CMAKE_ANDROID_NDK:UNINITIALIZED=/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973 + +//Archiver +CMAKE_AR:FILEPATH=/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/bin/llvm-ar + +//Flags used by the compiler during all build types. +CMAKE_ASM_FLAGS:STRING= + +//Flags used by the compiler during debug builds. +CMAKE_ASM_FLAGS_DEBUG:STRING= + +//Flags used by the compiler during release builds. +CMAKE_ASM_FLAGS_RELEASE:STRING= + +//Choose the type of build, options are: None Debug Release RelWithDebInfo +// MinSizeRel ... +CMAKE_BUILD_TYPE:STRING=RelWithDebInfo + +//LLVM archiver +CMAKE_CXX_COMPILER_AR:FILEPATH=/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/bin/llvm-ar + +//`clang-scan-deps` dependency scanner +CMAKE_CXX_COMPILER_CLANG_SCAN_DEPS:FILEPATH=/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/bin/clang-scan-deps + +//Generate index for LLVM archive +CMAKE_CXX_COMPILER_RANLIB:FILEPATH=/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/bin/llvm-ranlib + +//Flags used by the compiler during all build types. +CMAKE_CXX_FLAGS:STRING= + +//Flags used by the compiler during debug builds. +CMAKE_CXX_FLAGS_DEBUG:STRING= + +//Flags used by the CXX compiler during MINSIZEREL builds. +CMAKE_CXX_FLAGS_MINSIZEREL:STRING=-Os -DNDEBUG + +//Flags used by the compiler during release builds. +CMAKE_CXX_FLAGS_RELEASE:STRING= + +//Flags used by the CXX compiler during RELWITHDEBINFO builds. +CMAKE_CXX_FLAGS_RELWITHDEBINFO:STRING=-O2 -g -DNDEBUG + +//Libraries linked by default with all C++ applications. +CMAKE_CXX_STANDARD_LIBRARIES:STRING=-latomic -lm + +//LLVM archiver +CMAKE_C_COMPILER_AR:FILEPATH=/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/bin/llvm-ar + +//`clang-scan-deps` dependency scanner +CMAKE_C_COMPILER_CLANG_SCAN_DEPS:FILEPATH=/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/bin/clang-scan-deps + +//Generate index for LLVM archive +CMAKE_C_COMPILER_RANLIB:FILEPATH=/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/bin/llvm-ranlib + +//Flags used by the compiler during all build types. +CMAKE_C_FLAGS:STRING= + +//Flags used by the compiler during debug builds. +CMAKE_C_FLAGS_DEBUG:STRING= + +//Flags used by the C compiler during MINSIZEREL builds. +CMAKE_C_FLAGS_MINSIZEREL:STRING=-Os -DNDEBUG + +//Flags used by the compiler during release builds. +CMAKE_C_FLAGS_RELEASE:STRING= + +//Flags used by the C compiler during RELWITHDEBINFO builds. +CMAKE_C_FLAGS_RELWITHDEBINFO:STRING=-O2 -g -DNDEBUG + +//Libraries linked by default with all C applications. +CMAKE_C_STANDARD_LIBRARIES:STRING=-latomic -lm + +//Path to a program. +CMAKE_DLLTOOL:FILEPATH=/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/bin/llvm-dlltool + +//Flags used by the linker. +CMAKE_EXE_LINKER_FLAGS:STRING= + +//Flags used by the linker during DEBUG builds. +CMAKE_EXE_LINKER_FLAGS_DEBUG:STRING= + +//Flags used by the linker during MINSIZEREL builds. +CMAKE_EXE_LINKER_FLAGS_MINSIZEREL:STRING= + +//Flags used by the linker during RELEASE builds. +CMAKE_EXE_LINKER_FLAGS_RELEASE:STRING= + +//Flags used by the linker during RELWITHDEBINFO builds. +CMAKE_EXE_LINKER_FLAGS_RELWITHDEBINFO:STRING= + +//Enable/Disable output of build database during the build. +CMAKE_EXPORT_BUILD_DATABASE:BOOL= + +//No help, variable specified on the command line. +CMAKE_EXPORT_COMPILE_COMMANDS:UNINITIALIZED=ON + +//Value Computed by CMake. +CMAKE_FIND_PACKAGE_REDIRECTS_DIR:STATIC=/Users/hamzaaleghwairyeen/development/App/Intaleq/android/app/.cxx/RelWithDebInfo/6t1m4b5v/arm64-v8a/CMakeFiles/pkgRedirects + +//Install path prefix, prepended onto install directories. +CMAKE_INSTALL_PREFIX:PATH=/usr/local + +//No help, variable specified on the command line. +CMAKE_LIBRARY_OUTPUT_DIRECTORY:UNINITIALIZED=/Users/hamzaaleghwairyeen/development/App/Intaleq/build/app/intermediates/cxx/RelWithDebInfo/6t1m4b5v/obj/arm64-v8a + +//Path to a program. +CMAKE_LINKER:FILEPATH=/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/bin/ld.lld + +//No help, variable specified on the command line. +CMAKE_MAKE_PROGRAM:UNINITIALIZED=/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/bin/ninja + +//Flags used by the linker during the creation of modules. +CMAKE_MODULE_LINKER_FLAGS:STRING= + +//Flags used by the linker during the creation of modules during +// DEBUG builds. +CMAKE_MODULE_LINKER_FLAGS_DEBUG:STRING= + +//Flags used by the linker during the creation of modules during +// MINSIZEREL builds. +CMAKE_MODULE_LINKER_FLAGS_MINSIZEREL:STRING= + +//Flags used by the linker during the creation of modules during +// RELEASE builds. +CMAKE_MODULE_LINKER_FLAGS_RELEASE:STRING= + +//Flags used by the linker during the creation of modules during +// RELWITHDEBINFO builds. +CMAKE_MODULE_LINKER_FLAGS_RELWITHDEBINFO:STRING= + +//Path to a program. +CMAKE_NM:FILEPATH=/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/bin/llvm-nm + +//Path to a program. +CMAKE_OBJCOPY:FILEPATH=/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/bin/llvm-objcopy + +//Path to a program. +CMAKE_OBJDUMP:FILEPATH=/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/bin/llvm-objdump + +//Value Computed by CMake +CMAKE_PROJECT_DESCRIPTION:STATIC= + +//Value Computed by CMake +CMAKE_PROJECT_HOMEPAGE_URL:STATIC= + +//Value Computed by CMake +CMAKE_PROJECT_NAME:STATIC=intaleq + +//Ranlib +CMAKE_RANLIB:FILEPATH=/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/bin/llvm-ranlib + +//Path to a program. +CMAKE_READELF:FILEPATH=/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/bin/llvm-readelf + +//No help, variable specified on the command line. +CMAKE_RUNTIME_OUTPUT_DIRECTORY:UNINITIALIZED=/Users/hamzaaleghwairyeen/development/App/Intaleq/build/app/intermediates/cxx/RelWithDebInfo/6t1m4b5v/obj/arm64-v8a + +//Flags used by the linker during the creation of dll's. +CMAKE_SHARED_LINKER_FLAGS:STRING= + +//Flags used by the linker during the creation of shared libraries +// during DEBUG builds. +CMAKE_SHARED_LINKER_FLAGS_DEBUG:STRING= + +//Flags used by the linker during the creation of shared libraries +// during MINSIZEREL builds. +CMAKE_SHARED_LINKER_FLAGS_MINSIZEREL:STRING= + +//Flags used by the linker during the creation of shared libraries +// during RELEASE builds. +CMAKE_SHARED_LINKER_FLAGS_RELEASE:STRING= + +//Flags used by the linker during the creation of shared libraries +// during RELWITHDEBINFO builds. +CMAKE_SHARED_LINKER_FLAGS_RELWITHDEBINFO:STRING= + +//If set, runtime paths are not added when installing shared libraries, +// but are added when building. +CMAKE_SKIP_INSTALL_RPATH:BOOL=NO + +//If set, runtime paths are not added when using shared libraries. +CMAKE_SKIP_RPATH:BOOL=NO + +//Flags used by the linker during the creation of static libraries +// during all build types. +CMAKE_STATIC_LINKER_FLAGS:STRING= + +//Flags used by the linker during the creation of static libraries +// during DEBUG builds. +CMAKE_STATIC_LINKER_FLAGS_DEBUG:STRING= + +//Flags used by the linker during the creation of static libraries +// during MINSIZEREL builds. +CMAKE_STATIC_LINKER_FLAGS_MINSIZEREL:STRING= + +//Flags used by the linker during the creation of static libraries +// during RELEASE builds. +CMAKE_STATIC_LINKER_FLAGS_RELEASE:STRING= + +//Flags used by the linker during the creation of static libraries +// during RELWITHDEBINFO builds. +CMAKE_STATIC_LINKER_FLAGS_RELWITHDEBINFO:STRING= + +//Strip +CMAKE_STRIP:FILEPATH=/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/bin/llvm-strip + +//No help, variable specified on the command line. +CMAKE_SYSTEM_NAME:UNINITIALIZED=Android + +//No help, variable specified on the command line. +CMAKE_SYSTEM_VERSION:UNINITIALIZED=23 + +//Path to a program. +CMAKE_TAPI:FILEPATH=CMAKE_TAPI-NOTFOUND + +//The CMake toolchain file +CMAKE_TOOLCHAIN_FILE:FILEPATH=/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/build/cmake/android.toolchain.cmake + +//If this value is on, makefiles will be generated without the +// .SILENT directive, and all commands will be echoed to the console +// during the make. This is useful for debugging only. With Visual +// Studio IDE projects all commands are done without /nologo. +CMAKE_VERBOSE_MAKEFILE:BOOL=FALSE + +//Value Computed by CMake +intaleq_BINARY_DIR:STATIC=/Users/hamzaaleghwairyeen/development/App/Intaleq/android/app/.cxx/RelWithDebInfo/6t1m4b5v/arm64-v8a + +//Value Computed by CMake +intaleq_IS_TOP_LEVEL:STATIC=ON + +//Value Computed by CMake +intaleq_SOURCE_DIR:STATIC=/Users/hamzaaleghwairyeen/development/App/Intaleq/android/app/src/main/cpp + +//Path to a library. +log-lib:FILEPATH=/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/lib/aarch64-linux-android/23/liblog.so + +//Dependencies for the target +native-lib_LIB_DEPENDS:STATIC=general;/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/lib/aarch64-linux-android/23/liblog.so; + + +######################## +# INTERNAL cache entries +######################## + +//ADVANCED property for variable: CMAKE_ADDR2LINE +CMAKE_ADDR2LINE-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_AR +CMAKE_AR-ADVANCED:INTERNAL=1 +//This is the directory where this CMakeCache.txt was created +CMAKE_CACHEFILE_DIR:INTERNAL=/Users/hamzaaleghwairyeen/development/App/Intaleq/android/app/.cxx/RelWithDebInfo/6t1m4b5v/arm64-v8a +//Major version of cmake used to create the current loaded cache +CMAKE_CACHE_MAJOR_VERSION:INTERNAL=3 +//Minor version of cmake used to create the current loaded cache +CMAKE_CACHE_MINOR_VERSION:INTERNAL=31 +//Patch version of cmake used to create the current loaded cache +CMAKE_CACHE_PATCH_VERSION:INTERNAL=5 +//Path to CMake executable. +CMAKE_COMMAND:INTERNAL=/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/bin/cmake +//Path to cpack program executable. +CMAKE_CPACK_COMMAND:INTERNAL=/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/bin/cpack +//Path to ctest program executable. +CMAKE_CTEST_COMMAND:INTERNAL=/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/bin/ctest +//ADVANCED property for variable: CMAKE_CXX_COMPILER_AR +CMAKE_CXX_COMPILER_AR-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_CXX_COMPILER_CLANG_SCAN_DEPS +CMAKE_CXX_COMPILER_CLANG_SCAN_DEPS-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_CXX_COMPILER_RANLIB +CMAKE_CXX_COMPILER_RANLIB-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_CXX_FLAGS +CMAKE_CXX_FLAGS-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_CXX_FLAGS_DEBUG +CMAKE_CXX_FLAGS_DEBUG-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_CXX_FLAGS_MINSIZEREL +CMAKE_CXX_FLAGS_MINSIZEREL-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_CXX_FLAGS_RELEASE +CMAKE_CXX_FLAGS_RELEASE-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_CXX_FLAGS_RELWITHDEBINFO +CMAKE_CXX_FLAGS_RELWITHDEBINFO-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_CXX_STANDARD_LIBRARIES +CMAKE_CXX_STANDARD_LIBRARIES-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_C_COMPILER_AR +CMAKE_C_COMPILER_AR-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_C_COMPILER_CLANG_SCAN_DEPS +CMAKE_C_COMPILER_CLANG_SCAN_DEPS-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_C_COMPILER_RANLIB +CMAKE_C_COMPILER_RANLIB-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_C_FLAGS +CMAKE_C_FLAGS-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_C_FLAGS_DEBUG +CMAKE_C_FLAGS_DEBUG-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_C_FLAGS_MINSIZEREL +CMAKE_C_FLAGS_MINSIZEREL-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_C_FLAGS_RELEASE +CMAKE_C_FLAGS_RELEASE-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_C_FLAGS_RELWITHDEBINFO +CMAKE_C_FLAGS_RELWITHDEBINFO-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_C_STANDARD_LIBRARIES +CMAKE_C_STANDARD_LIBRARIES-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_DLLTOOL +CMAKE_DLLTOOL-ADVANCED:INTERNAL=1 +//Path to cache edit program executable. +CMAKE_EDIT_COMMAND:INTERNAL=/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/bin/ccmake +//Executable file format +CMAKE_EXECUTABLE_FORMAT:INTERNAL=ELF +//ADVANCED property for variable: CMAKE_EXE_LINKER_FLAGS +CMAKE_EXE_LINKER_FLAGS-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_EXE_LINKER_FLAGS_DEBUG +CMAKE_EXE_LINKER_FLAGS_DEBUG-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_EXE_LINKER_FLAGS_MINSIZEREL +CMAKE_EXE_LINKER_FLAGS_MINSIZEREL-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_EXE_LINKER_FLAGS_RELEASE +CMAKE_EXE_LINKER_FLAGS_RELEASE-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_EXE_LINKER_FLAGS_RELWITHDEBINFO +CMAKE_EXE_LINKER_FLAGS_RELWITHDEBINFO-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_EXPORT_BUILD_DATABASE +CMAKE_EXPORT_BUILD_DATABASE-ADVANCED:INTERNAL=1 +//Name of external makefile project generator. +CMAKE_EXTRA_GENERATOR:INTERNAL= +//Name of generator. +CMAKE_GENERATOR:INTERNAL=Ninja +//Generator instance identifier. +CMAKE_GENERATOR_INSTANCE:INTERNAL= +//Name of generator platform. +CMAKE_GENERATOR_PLATFORM:INTERNAL= +//Name of generator toolset. +CMAKE_GENERATOR_TOOLSET:INTERNAL= +//Source directory with the top level CMakeLists.txt file for this +// project +CMAKE_HOME_DIRECTORY:INTERNAL=/Users/hamzaaleghwairyeen/development/App/Intaleq/android/app/src/main/cpp +//Install .so files without execute permission. +CMAKE_INSTALL_SO_NO_EXE:INTERNAL=0 +//ADVANCED property for variable: CMAKE_LINKER +CMAKE_LINKER-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_MODULE_LINKER_FLAGS +CMAKE_MODULE_LINKER_FLAGS-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_MODULE_LINKER_FLAGS_DEBUG +CMAKE_MODULE_LINKER_FLAGS_DEBUG-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_MODULE_LINKER_FLAGS_MINSIZEREL +CMAKE_MODULE_LINKER_FLAGS_MINSIZEREL-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_MODULE_LINKER_FLAGS_RELEASE +CMAKE_MODULE_LINKER_FLAGS_RELEASE-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_MODULE_LINKER_FLAGS_RELWITHDEBINFO +CMAKE_MODULE_LINKER_FLAGS_RELWITHDEBINFO-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_NM +CMAKE_NM-ADVANCED:INTERNAL=1 +//number of local generators +CMAKE_NUMBER_OF_MAKEFILES:INTERNAL=1 +//ADVANCED property for variable: CMAKE_OBJCOPY +CMAKE_OBJCOPY-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_OBJDUMP +CMAKE_OBJDUMP-ADVANCED:INTERNAL=1 +//Platform information initialized +CMAKE_PLATFORM_INFO_INITIALIZED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_RANLIB +CMAKE_RANLIB-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_READELF +CMAKE_READELF-ADVANCED:INTERNAL=1 +//Path to CMake installation. +CMAKE_ROOT:INTERNAL=/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31 +//ADVANCED property for variable: CMAKE_SHARED_LINKER_FLAGS +CMAKE_SHARED_LINKER_FLAGS-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_SHARED_LINKER_FLAGS_DEBUG +CMAKE_SHARED_LINKER_FLAGS_DEBUG-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_SHARED_LINKER_FLAGS_MINSIZEREL +CMAKE_SHARED_LINKER_FLAGS_MINSIZEREL-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_SHARED_LINKER_FLAGS_RELEASE +CMAKE_SHARED_LINKER_FLAGS_RELEASE-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_SHARED_LINKER_FLAGS_RELWITHDEBINFO +CMAKE_SHARED_LINKER_FLAGS_RELWITHDEBINFO-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_SKIP_INSTALL_RPATH +CMAKE_SKIP_INSTALL_RPATH-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_SKIP_RPATH +CMAKE_SKIP_RPATH-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_STATIC_LINKER_FLAGS +CMAKE_STATIC_LINKER_FLAGS-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_STATIC_LINKER_FLAGS_DEBUG +CMAKE_STATIC_LINKER_FLAGS_DEBUG-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_STATIC_LINKER_FLAGS_MINSIZEREL +CMAKE_STATIC_LINKER_FLAGS_MINSIZEREL-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_STATIC_LINKER_FLAGS_RELEASE +CMAKE_STATIC_LINKER_FLAGS_RELEASE-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_STATIC_LINKER_FLAGS_RELWITHDEBINFO +CMAKE_STATIC_LINKER_FLAGS_RELWITHDEBINFO-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_STRIP +CMAKE_STRIP-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_TAPI +CMAKE_TAPI-ADVANCED:INTERNAL=1 +//uname command +CMAKE_UNAME:INTERNAL=/usr/bin/uname +//ADVANCED property for variable: CMAKE_VERBOSE_MAKEFILE +CMAKE_VERBOSE_MAKEFILE-ADVANCED:INTERNAL=1 +//linker supports push/pop state +_CMAKE_CXX_LINKER_PUSHPOP_STATE_SUPPORTED:INTERNAL=TRUE +//linker supports push/pop state +_CMAKE_C_LINKER_PUSHPOP_STATE_SUPPORTED:INTERNAL=TRUE +//linker supports push/pop state +_CMAKE_LINKER_PUSHPOP_STATE_SUPPORTED:INTERNAL=TRUE + diff --git a/siro_rider/android/app/.cxx/RelWithDebInfo/6t1m4b5v/arm64-v8a/CMakeFiles/3.31.5-g6cf5163/CMakeCCompiler.cmake b/siro_rider/android/app/.cxx/RelWithDebInfo/6t1m4b5v/arm64-v8a/CMakeFiles/3.31.5-g6cf5163/CMakeCCompiler.cmake new file mode 100644 index 0000000..980aa60 --- /dev/null +++ b/siro_rider/android/app/.cxx/RelWithDebInfo/6t1m4b5v/arm64-v8a/CMakeFiles/3.31.5-g6cf5163/CMakeCCompiler.cmake @@ -0,0 +1,81 @@ +set(CMAKE_C_COMPILER "/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/bin/clang") +set(CMAKE_C_COMPILER_ARG1 "") +set(CMAKE_C_COMPILER_ID "Clang") +set(CMAKE_C_COMPILER_VERSION "18.0.1") +set(CMAKE_C_COMPILER_VERSION_INTERNAL "") +set(CMAKE_C_COMPILER_WRAPPER "") +set(CMAKE_C_STANDARD_COMPUTED_DEFAULT "17") +set(CMAKE_C_EXTENSIONS_COMPUTED_DEFAULT "ON") +set(CMAKE_C_STANDARD_LATEST "23") +set(CMAKE_C_COMPILE_FEATURES "c_std_90;c_function_prototypes;c_std_99;c_restrict;c_variadic_macros;c_std_11;c_static_assert;c_std_17;c_std_23") +set(CMAKE_C90_COMPILE_FEATURES "c_std_90;c_function_prototypes") +set(CMAKE_C99_COMPILE_FEATURES "c_std_99;c_restrict;c_variadic_macros") +set(CMAKE_C11_COMPILE_FEATURES "c_std_11;c_static_assert") +set(CMAKE_C17_COMPILE_FEATURES "c_std_17") +set(CMAKE_C23_COMPILE_FEATURES "c_std_23") + +set(CMAKE_C_PLATFORM_ID "Linux") +set(CMAKE_C_SIMULATE_ID "") +set(CMAKE_C_COMPILER_FRONTEND_VARIANT "GNU") +set(CMAKE_C_SIMULATE_VERSION "") + + + + +set(CMAKE_AR "/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/bin/llvm-ar") +set(CMAKE_C_COMPILER_AR "/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/bin/llvm-ar") +set(CMAKE_RANLIB "/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/bin/llvm-ranlib") +set(CMAKE_C_COMPILER_RANLIB "/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/bin/llvm-ranlib") +set(CMAKE_LINKER "/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/bin/ld.lld") +set(CMAKE_LINKER_LINK "") +set(CMAKE_LINKER_LLD "") +set(CMAKE_C_COMPILER_LINKER "/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/bin/ld.lld") +set(CMAKE_C_COMPILER_LINKER_ID "LLD") +set(CMAKE_C_COMPILER_LINKER_VERSION 18.0.1) +set(CMAKE_C_COMPILER_LINKER_FRONTEND_VARIANT GNU) +set(CMAKE_MT "") +set(CMAKE_TAPI "CMAKE_TAPI-NOTFOUND") +set(CMAKE_COMPILER_IS_GNUCC ) +set(CMAKE_C_COMPILER_LOADED 1) +set(CMAKE_C_COMPILER_WORKS TRUE) +set(CMAKE_C_ABI_COMPILED TRUE) + +set(CMAKE_C_COMPILER_ENV_VAR "CC") + +set(CMAKE_C_COMPILER_ID_RUN 1) +set(CMAKE_C_SOURCE_FILE_EXTENSIONS c;m) +set(CMAKE_C_IGNORE_EXTENSIONS h;H;o;O;obj;OBJ;def;DEF;rc;RC) +set(CMAKE_C_LINKER_PREFERENCE 10) +set(CMAKE_C_LINKER_DEPFILE_SUPPORTED ) + +# Save compiler ABI information. +set(CMAKE_C_SIZEOF_DATA_PTR "8") +set(CMAKE_C_COMPILER_ABI "ELF") +set(CMAKE_C_BYTE_ORDER "LITTLE_ENDIAN") +set(CMAKE_C_LIBRARY_ARCHITECTURE "aarch64-linux-android") + +if(CMAKE_C_SIZEOF_DATA_PTR) + set(CMAKE_SIZEOF_VOID_P "${CMAKE_C_SIZEOF_DATA_PTR}") +endif() + +if(CMAKE_C_COMPILER_ABI) + set(CMAKE_INTERNAL_PLATFORM_ABI "${CMAKE_C_COMPILER_ABI}") +endif() + +if(CMAKE_C_LIBRARY_ARCHITECTURE) + set(CMAKE_LIBRARY_ARCHITECTURE "aarch64-linux-android") +endif() + +set(CMAKE_C_CL_SHOWINCLUDES_PREFIX "") +if(CMAKE_C_CL_SHOWINCLUDES_PREFIX) + set(CMAKE_CL_SHOWINCLUDES_PREFIX "${CMAKE_C_CL_SHOWINCLUDES_PREFIX}") +endif() + + + + + +set(CMAKE_C_IMPLICIT_INCLUDE_DIRECTORIES "/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/lib/clang/18/include;/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/include/aarch64-linux-android;/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/include") +set(CMAKE_C_IMPLICIT_LINK_LIBRARIES "-l:libunwind.a;dl;c;-l:libunwind.a;dl") +set(CMAKE_C_IMPLICIT_LINK_DIRECTORIES "/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/lib/clang/18/lib/linux/aarch64;/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/lib/aarch64-linux-android/23;/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/lib/aarch64-linux-android;/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/lib") +set(CMAKE_C_IMPLICIT_LINK_FRAMEWORK_DIRECTORIES "") diff --git a/siro_rider/android/app/.cxx/RelWithDebInfo/6t1m4b5v/arm64-v8a/CMakeFiles/3.31.5-g6cf5163/CMakeCXXCompiler.cmake b/siro_rider/android/app/.cxx/RelWithDebInfo/6t1m4b5v/arm64-v8a/CMakeFiles/3.31.5-g6cf5163/CMakeCXXCompiler.cmake new file mode 100644 index 0000000..aa4a1e4 --- /dev/null +++ b/siro_rider/android/app/.cxx/RelWithDebInfo/6t1m4b5v/arm64-v8a/CMakeFiles/3.31.5-g6cf5163/CMakeCXXCompiler.cmake @@ -0,0 +1,105 @@ +set(CMAKE_CXX_COMPILER "/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/bin/clang++") +set(CMAKE_CXX_COMPILER_ARG1 "") +set(CMAKE_CXX_COMPILER_ID "Clang") +set(CMAKE_CXX_COMPILER_VERSION "18.0.1") +set(CMAKE_CXX_COMPILER_VERSION_INTERNAL "") +set(CMAKE_CXX_COMPILER_WRAPPER "") +set(CMAKE_CXX_STANDARD_COMPUTED_DEFAULT "17") +set(CMAKE_CXX_EXTENSIONS_COMPUTED_DEFAULT "ON") +set(CMAKE_CXX_STANDARD_LATEST "26") +set(CMAKE_CXX_COMPILE_FEATURES "cxx_std_98;cxx_template_template_parameters;cxx_std_11;cxx_alias_templates;cxx_alignas;cxx_alignof;cxx_attributes;cxx_auto_type;cxx_constexpr;cxx_decltype;cxx_decltype_incomplete_return_types;cxx_default_function_template_args;cxx_defaulted_functions;cxx_defaulted_move_initializers;cxx_delegating_constructors;cxx_deleted_functions;cxx_enum_forward_declarations;cxx_explicit_conversions;cxx_extended_friend_declarations;cxx_extern_templates;cxx_final;cxx_func_identifier;cxx_generalized_initializers;cxx_inheriting_constructors;cxx_inline_namespaces;cxx_lambdas;cxx_local_type_template_args;cxx_long_long_type;cxx_noexcept;cxx_nonstatic_member_init;cxx_nullptr;cxx_override;cxx_range_for;cxx_raw_string_literals;cxx_reference_qualified_functions;cxx_right_angle_brackets;cxx_rvalue_references;cxx_sizeof_member;cxx_static_assert;cxx_strong_enums;cxx_thread_local;cxx_trailing_return_types;cxx_unicode_literals;cxx_uniform_initialization;cxx_unrestricted_unions;cxx_user_literals;cxx_variadic_macros;cxx_variadic_templates;cxx_std_14;cxx_aggregate_default_initializers;cxx_attribute_deprecated;cxx_binary_literals;cxx_contextual_conversions;cxx_decltype_auto;cxx_digit_separators;cxx_generic_lambdas;cxx_lambda_init_captures;cxx_relaxed_constexpr;cxx_return_type_deduction;cxx_variable_templates;cxx_std_17;cxx_std_20;cxx_std_23;cxx_std_26") +set(CMAKE_CXX98_COMPILE_FEATURES "cxx_std_98;cxx_template_template_parameters") +set(CMAKE_CXX11_COMPILE_FEATURES "cxx_std_11;cxx_alias_templates;cxx_alignas;cxx_alignof;cxx_attributes;cxx_auto_type;cxx_constexpr;cxx_decltype;cxx_decltype_incomplete_return_types;cxx_default_function_template_args;cxx_defaulted_functions;cxx_defaulted_move_initializers;cxx_delegating_constructors;cxx_deleted_functions;cxx_enum_forward_declarations;cxx_explicit_conversions;cxx_extended_friend_declarations;cxx_extern_templates;cxx_final;cxx_func_identifier;cxx_generalized_initializers;cxx_inheriting_constructors;cxx_inline_namespaces;cxx_lambdas;cxx_local_type_template_args;cxx_long_long_type;cxx_noexcept;cxx_nonstatic_member_init;cxx_nullptr;cxx_override;cxx_range_for;cxx_raw_string_literals;cxx_reference_qualified_functions;cxx_right_angle_brackets;cxx_rvalue_references;cxx_sizeof_member;cxx_static_assert;cxx_strong_enums;cxx_thread_local;cxx_trailing_return_types;cxx_unicode_literals;cxx_uniform_initialization;cxx_unrestricted_unions;cxx_user_literals;cxx_variadic_macros;cxx_variadic_templates") +set(CMAKE_CXX14_COMPILE_FEATURES "cxx_std_14;cxx_aggregate_default_initializers;cxx_attribute_deprecated;cxx_binary_literals;cxx_contextual_conversions;cxx_decltype_auto;cxx_digit_separators;cxx_generic_lambdas;cxx_lambda_init_captures;cxx_relaxed_constexpr;cxx_return_type_deduction;cxx_variable_templates") +set(CMAKE_CXX17_COMPILE_FEATURES "cxx_std_17") +set(CMAKE_CXX20_COMPILE_FEATURES "cxx_std_20") +set(CMAKE_CXX23_COMPILE_FEATURES "cxx_std_23") +set(CMAKE_CXX26_COMPILE_FEATURES "cxx_std_26") + +set(CMAKE_CXX_PLATFORM_ID "Linux") +set(CMAKE_CXX_SIMULATE_ID "") +set(CMAKE_CXX_COMPILER_FRONTEND_VARIANT "GNU") +set(CMAKE_CXX_SIMULATE_VERSION "") + + + + +set(CMAKE_AR "/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/bin/llvm-ar") +set(CMAKE_CXX_COMPILER_AR "/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/bin/llvm-ar") +set(CMAKE_RANLIB "/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/bin/llvm-ranlib") +set(CMAKE_CXX_COMPILER_RANLIB "/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/bin/llvm-ranlib") +set(CMAKE_LINKER "/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/bin/ld.lld") +set(CMAKE_LINKER_LINK "") +set(CMAKE_LINKER_LLD "") +set(CMAKE_CXX_COMPILER_LINKER "/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/bin/ld.lld") +set(CMAKE_CXX_COMPILER_LINKER_ID "LLD") +set(CMAKE_CXX_COMPILER_LINKER_VERSION 18.0.1) +set(CMAKE_CXX_COMPILER_LINKER_FRONTEND_VARIANT GNU) +set(CMAKE_MT "") +set(CMAKE_TAPI "CMAKE_TAPI-NOTFOUND") +set(CMAKE_COMPILER_IS_GNUCXX ) +set(CMAKE_CXX_COMPILER_LOADED 1) +set(CMAKE_CXX_COMPILER_WORKS TRUE) +set(CMAKE_CXX_ABI_COMPILED TRUE) + +set(CMAKE_CXX_COMPILER_ENV_VAR "CXX") + +set(CMAKE_CXX_COMPILER_ID_RUN 1) +set(CMAKE_CXX_SOURCE_FILE_EXTENSIONS C;M;c++;cc;cpp;cxx;m;mm;mpp;CPP;ixx;cppm;ccm;cxxm;c++m) +set(CMAKE_CXX_IGNORE_EXTENSIONS inl;h;hpp;HPP;H;o;O;obj;OBJ;def;DEF;rc;RC) + +foreach (lang IN ITEMS C OBJC OBJCXX) + if (CMAKE_${lang}_COMPILER_ID_RUN) + foreach(extension IN LISTS CMAKE_${lang}_SOURCE_FILE_EXTENSIONS) + list(REMOVE_ITEM CMAKE_CXX_SOURCE_FILE_EXTENSIONS ${extension}) + endforeach() + endif() +endforeach() + +set(CMAKE_CXX_LINKER_PREFERENCE 30) +set(CMAKE_CXX_LINKER_PREFERENCE_PROPAGATES 1) +set(CMAKE_CXX_LINKER_DEPFILE_SUPPORTED ) + +# Save compiler ABI information. +set(CMAKE_CXX_SIZEOF_DATA_PTR "8") +set(CMAKE_CXX_COMPILER_ABI "ELF") +set(CMAKE_CXX_BYTE_ORDER "LITTLE_ENDIAN") +set(CMAKE_CXX_LIBRARY_ARCHITECTURE "aarch64-linux-android") + +if(CMAKE_CXX_SIZEOF_DATA_PTR) + set(CMAKE_SIZEOF_VOID_P "${CMAKE_CXX_SIZEOF_DATA_PTR}") +endif() + +if(CMAKE_CXX_COMPILER_ABI) + set(CMAKE_INTERNAL_PLATFORM_ABI "${CMAKE_CXX_COMPILER_ABI}") +endif() + +if(CMAKE_CXX_LIBRARY_ARCHITECTURE) + set(CMAKE_LIBRARY_ARCHITECTURE "aarch64-linux-android") +endif() + +set(CMAKE_CXX_CL_SHOWINCLUDES_PREFIX "") +if(CMAKE_CXX_CL_SHOWINCLUDES_PREFIX) + set(CMAKE_CL_SHOWINCLUDES_PREFIX "${CMAKE_CXX_CL_SHOWINCLUDES_PREFIX}") +endif() + + + + + +set(CMAKE_CXX_IMPLICIT_INCLUDE_DIRECTORIES "/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/include/c++/v1;/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/lib/clang/18/include;/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/include/aarch64-linux-android;/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/include") +set(CMAKE_CXX_IMPLICIT_LINK_LIBRARIES "c++;m;-l:libunwind.a;dl;c;-l:libunwind.a;dl") +set(CMAKE_CXX_IMPLICIT_LINK_DIRECTORIES "/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/lib/clang/18/lib/linux/aarch64;/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/lib/aarch64-linux-android/23;/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/lib/aarch64-linux-android;/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/lib") +set(CMAKE_CXX_IMPLICIT_LINK_FRAMEWORK_DIRECTORIES "") +set(CMAKE_CXX_COMPILER_CLANG_RESOURCE_DIR "/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/lib/clang/18") + +set(CMAKE_CXX_COMPILER_IMPORT_STD "") +### Imported target for C++23 standard library +set(CMAKE_CXX23_COMPILER_IMPORT_STD_NOT_FOUND_MESSAGE "Experimental `import std` support not enabled when detecting toolchain; it must be set before `CXX` is enabled (usually a `project()` call)") + + +### Imported target for C++26 standard library +set(CMAKE_CXX26_COMPILER_IMPORT_STD_NOT_FOUND_MESSAGE "Experimental `import std` support not enabled when detecting toolchain; it must be set before `CXX` is enabled (usually a `project()` call)") + + + diff --git a/siro_rider/android/app/.cxx/RelWithDebInfo/6t1m4b5v/arm64-v8a/CMakeFiles/3.31.5-g6cf5163/CMakeDetermineCompilerABI_C.bin b/siro_rider/android/app/.cxx/RelWithDebInfo/6t1m4b5v/arm64-v8a/CMakeFiles/3.31.5-g6cf5163/CMakeDetermineCompilerABI_C.bin new file mode 100755 index 0000000..58cb377 Binary files /dev/null and b/siro_rider/android/app/.cxx/RelWithDebInfo/6t1m4b5v/arm64-v8a/CMakeFiles/3.31.5-g6cf5163/CMakeDetermineCompilerABI_C.bin differ diff --git a/siro_rider/android/app/.cxx/RelWithDebInfo/6t1m4b5v/arm64-v8a/CMakeFiles/3.31.5-g6cf5163/CMakeDetermineCompilerABI_CXX.bin b/siro_rider/android/app/.cxx/RelWithDebInfo/6t1m4b5v/arm64-v8a/CMakeFiles/3.31.5-g6cf5163/CMakeDetermineCompilerABI_CXX.bin new file mode 100755 index 0000000..29437d8 Binary files /dev/null and b/siro_rider/android/app/.cxx/RelWithDebInfo/6t1m4b5v/arm64-v8a/CMakeFiles/3.31.5-g6cf5163/CMakeDetermineCompilerABI_CXX.bin differ diff --git a/siro_rider/android/app/.cxx/RelWithDebInfo/6t1m4b5v/arm64-v8a/CMakeFiles/3.31.5-g6cf5163/CMakeSystem.cmake b/siro_rider/android/app/.cxx/RelWithDebInfo/6t1m4b5v/arm64-v8a/CMakeFiles/3.31.5-g6cf5163/CMakeSystem.cmake new file mode 100644 index 0000000..3a104b8 --- /dev/null +++ b/siro_rider/android/app/.cxx/RelWithDebInfo/6t1m4b5v/arm64-v8a/CMakeFiles/3.31.5-g6cf5163/CMakeSystem.cmake @@ -0,0 +1,15 @@ +set(CMAKE_HOST_SYSTEM "Darwin-24.5.0") +set(CMAKE_HOST_SYSTEM_NAME "Darwin") +set(CMAKE_HOST_SYSTEM_VERSION "24.5.0") +set(CMAKE_HOST_SYSTEM_PROCESSOR "arm64") + +include("/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/build/cmake/android.toolchain.cmake") + +set(CMAKE_SYSTEM "Android-1") +set(CMAKE_SYSTEM_NAME "Android") +set(CMAKE_SYSTEM_VERSION "1") +set(CMAKE_SYSTEM_PROCESSOR "aarch64") + +set(CMAKE_CROSSCOMPILING "TRUE") + +set(CMAKE_SYSTEM_LOADED 1) diff --git a/siro_rider/android/app/.cxx/RelWithDebInfo/6t1m4b5v/arm64-v8a/CMakeFiles/3.31.5-g6cf5163/CompilerIdC/CMakeCCompilerId.c b/siro_rider/android/app/.cxx/RelWithDebInfo/6t1m4b5v/arm64-v8a/CMakeFiles/3.31.5-g6cf5163/CompilerIdC/CMakeCCompilerId.c new file mode 100644 index 0000000..8d8bb03 --- /dev/null +++ b/siro_rider/android/app/.cxx/RelWithDebInfo/6t1m4b5v/arm64-v8a/CMakeFiles/3.31.5-g6cf5163/CompilerIdC/CMakeCCompilerId.c @@ -0,0 +1,904 @@ +#ifdef __cplusplus +# error "A C++ compiler has been selected for C." +#endif + +#if defined(__18CXX) +# define ID_VOID_MAIN +#endif +#if defined(__CLASSIC_C__) +/* cv-qualifiers did not exist in K&R C */ +# define const +# define volatile +#endif + +#if !defined(__has_include) +/* If the compiler does not have __has_include, pretend the answer is + always no. */ +# define __has_include(x) 0 +#endif + + +/* Version number components: V=Version, R=Revision, P=Patch + Version date components: YYYY=Year, MM=Month, DD=Day */ + +#if defined(__INTEL_COMPILER) || defined(__ICC) +# define COMPILER_ID "Intel" +# if defined(_MSC_VER) +# define SIMULATE_ID "MSVC" +# endif +# if defined(__GNUC__) +# define SIMULATE_ID "GNU" +# endif + /* __INTEL_COMPILER = VRP prior to 2021, and then VVVV for 2021 and later, + except that a few beta releases use the old format with V=2021. */ +# if __INTEL_COMPILER < 2021 || __INTEL_COMPILER == 202110 || __INTEL_COMPILER == 202111 +# define COMPILER_VERSION_MAJOR DEC(__INTEL_COMPILER/100) +# define COMPILER_VERSION_MINOR DEC(__INTEL_COMPILER/10 % 10) +# if defined(__INTEL_COMPILER_UPDATE) +# define COMPILER_VERSION_PATCH DEC(__INTEL_COMPILER_UPDATE) +# else +# define COMPILER_VERSION_PATCH DEC(__INTEL_COMPILER % 10) +# endif +# else +# define COMPILER_VERSION_MAJOR DEC(__INTEL_COMPILER) +# define COMPILER_VERSION_MINOR DEC(__INTEL_COMPILER_UPDATE) + /* The third version component from --version is an update index, + but no macro is provided for it. */ +# define COMPILER_VERSION_PATCH DEC(0) +# endif +# if defined(__INTEL_COMPILER_BUILD_DATE) + /* __INTEL_COMPILER_BUILD_DATE = YYYYMMDD */ +# define COMPILER_VERSION_TWEAK DEC(__INTEL_COMPILER_BUILD_DATE) +# endif +# if defined(_MSC_VER) + /* _MSC_VER = VVRR */ +# define SIMULATE_VERSION_MAJOR DEC(_MSC_VER / 100) +# define SIMULATE_VERSION_MINOR DEC(_MSC_VER % 100) +# endif +# if defined(__GNUC__) +# define SIMULATE_VERSION_MAJOR DEC(__GNUC__) +# elif defined(__GNUG__) +# define SIMULATE_VERSION_MAJOR DEC(__GNUG__) +# endif +# if defined(__GNUC_MINOR__) +# define SIMULATE_VERSION_MINOR DEC(__GNUC_MINOR__) +# endif +# if defined(__GNUC_PATCHLEVEL__) +# define SIMULATE_VERSION_PATCH DEC(__GNUC_PATCHLEVEL__) +# endif + +#elif (defined(__clang__) && defined(__INTEL_CLANG_COMPILER)) || defined(__INTEL_LLVM_COMPILER) +# define COMPILER_ID "IntelLLVM" +#if defined(_MSC_VER) +# define SIMULATE_ID "MSVC" +#endif +#if defined(__GNUC__) +# define SIMULATE_ID "GNU" +#endif +/* __INTEL_LLVM_COMPILER = VVVVRP prior to 2021.2.0, VVVVRRPP for 2021.2.0 and + * later. Look for 6 digit vs. 8 digit version number to decide encoding. + * VVVV is no smaller than the current year when a version is released. + */ +#if __INTEL_LLVM_COMPILER < 1000000L +# define COMPILER_VERSION_MAJOR DEC(__INTEL_LLVM_COMPILER/100) +# define COMPILER_VERSION_MINOR DEC(__INTEL_LLVM_COMPILER/10 % 10) +# define COMPILER_VERSION_PATCH DEC(__INTEL_LLVM_COMPILER % 10) +#else +# define COMPILER_VERSION_MAJOR DEC(__INTEL_LLVM_COMPILER/10000) +# define COMPILER_VERSION_MINOR DEC(__INTEL_LLVM_COMPILER/100 % 100) +# define COMPILER_VERSION_PATCH DEC(__INTEL_LLVM_COMPILER % 100) +#endif +#if defined(_MSC_VER) + /* _MSC_VER = VVRR */ +# define SIMULATE_VERSION_MAJOR DEC(_MSC_VER / 100) +# define SIMULATE_VERSION_MINOR DEC(_MSC_VER % 100) +#endif +#if defined(__GNUC__) +# define SIMULATE_VERSION_MAJOR DEC(__GNUC__) +#elif defined(__GNUG__) +# define SIMULATE_VERSION_MAJOR DEC(__GNUG__) +#endif +#if defined(__GNUC_MINOR__) +# define SIMULATE_VERSION_MINOR DEC(__GNUC_MINOR__) +#endif +#if defined(__GNUC_PATCHLEVEL__) +# define SIMULATE_VERSION_PATCH DEC(__GNUC_PATCHLEVEL__) +#endif + +#elif defined(__PATHCC__) +# define COMPILER_ID "PathScale" +# define COMPILER_VERSION_MAJOR DEC(__PATHCC__) +# define COMPILER_VERSION_MINOR DEC(__PATHCC_MINOR__) +# if defined(__PATHCC_PATCHLEVEL__) +# define COMPILER_VERSION_PATCH DEC(__PATHCC_PATCHLEVEL__) +# endif + +#elif defined(__BORLANDC__) && defined(__CODEGEARC_VERSION__) +# define COMPILER_ID "Embarcadero" +# define COMPILER_VERSION_MAJOR HEX(__CODEGEARC_VERSION__>>24 & 0x00FF) +# define COMPILER_VERSION_MINOR HEX(__CODEGEARC_VERSION__>>16 & 0x00FF) +# define COMPILER_VERSION_PATCH DEC(__CODEGEARC_VERSION__ & 0xFFFF) + +#elif defined(__BORLANDC__) +# define COMPILER_ID "Borland" + /* __BORLANDC__ = 0xVRR */ +# define COMPILER_VERSION_MAJOR HEX(__BORLANDC__>>8) +# define COMPILER_VERSION_MINOR HEX(__BORLANDC__ & 0xFF) + +#elif defined(__WATCOMC__) && __WATCOMC__ < 1200 +# define COMPILER_ID "Watcom" + /* __WATCOMC__ = VVRR */ +# define COMPILER_VERSION_MAJOR DEC(__WATCOMC__ / 100) +# define COMPILER_VERSION_MINOR DEC((__WATCOMC__ / 10) % 10) +# if (__WATCOMC__ % 10) > 0 +# define COMPILER_VERSION_PATCH DEC(__WATCOMC__ % 10) +# endif + +#elif defined(__WATCOMC__) +# define COMPILER_ID "OpenWatcom" + /* __WATCOMC__ = VVRP + 1100 */ +# define COMPILER_VERSION_MAJOR DEC((__WATCOMC__ - 1100) / 100) +# define COMPILER_VERSION_MINOR DEC((__WATCOMC__ / 10) % 10) +# if (__WATCOMC__ % 10) > 0 +# define COMPILER_VERSION_PATCH DEC(__WATCOMC__ % 10) +# endif + +#elif defined(__SUNPRO_C) +# define COMPILER_ID "SunPro" +# if __SUNPRO_C >= 0x5100 + /* __SUNPRO_C = 0xVRRP */ +# define COMPILER_VERSION_MAJOR HEX(__SUNPRO_C>>12) +# define COMPILER_VERSION_MINOR HEX(__SUNPRO_C>>4 & 0xFF) +# define COMPILER_VERSION_PATCH HEX(__SUNPRO_C & 0xF) +# else + /* __SUNPRO_CC = 0xVRP */ +# define COMPILER_VERSION_MAJOR HEX(__SUNPRO_C>>8) +# define COMPILER_VERSION_MINOR HEX(__SUNPRO_C>>4 & 0xF) +# define COMPILER_VERSION_PATCH HEX(__SUNPRO_C & 0xF) +# endif + +#elif defined(__HP_cc) +# define COMPILER_ID "HP" + /* __HP_cc = VVRRPP */ +# define COMPILER_VERSION_MAJOR DEC(__HP_cc/10000) +# define COMPILER_VERSION_MINOR DEC(__HP_cc/100 % 100) +# define COMPILER_VERSION_PATCH DEC(__HP_cc % 100) + +#elif defined(__DECC) +# define COMPILER_ID "Compaq" + /* __DECC_VER = VVRRTPPPP */ +# define COMPILER_VERSION_MAJOR DEC(__DECC_VER/10000000) +# define COMPILER_VERSION_MINOR DEC(__DECC_VER/100000 % 100) +# define COMPILER_VERSION_PATCH DEC(__DECC_VER % 10000) + +#elif defined(__IBMC__) && defined(__COMPILER_VER__) +# define COMPILER_ID "zOS" + /* __IBMC__ = VRP */ +# define COMPILER_VERSION_MAJOR DEC(__IBMC__/100) +# define COMPILER_VERSION_MINOR DEC(__IBMC__/10 % 10) +# define COMPILER_VERSION_PATCH DEC(__IBMC__ % 10) + +#elif defined(__open_xl__) && defined(__clang__) +# define COMPILER_ID "IBMClang" +# define COMPILER_VERSION_MAJOR DEC(__open_xl_version__) +# define COMPILER_VERSION_MINOR DEC(__open_xl_release__) +# define COMPILER_VERSION_PATCH DEC(__open_xl_modification__) +# define COMPILER_VERSION_TWEAK DEC(__open_xl_ptf_fix_level__) + + +#elif defined(__ibmxl__) && defined(__clang__) +# define COMPILER_ID "XLClang" +# define COMPILER_VERSION_MAJOR DEC(__ibmxl_version__) +# define COMPILER_VERSION_MINOR DEC(__ibmxl_release__) +# define COMPILER_VERSION_PATCH DEC(__ibmxl_modification__) +# define COMPILER_VERSION_TWEAK DEC(__ibmxl_ptf_fix_level__) + + +#elif defined(__IBMC__) && !defined(__COMPILER_VER__) && __IBMC__ >= 800 +# define COMPILER_ID "XL" + /* __IBMC__ = VRP */ +# define COMPILER_VERSION_MAJOR DEC(__IBMC__/100) +# define COMPILER_VERSION_MINOR DEC(__IBMC__/10 % 10) +# define COMPILER_VERSION_PATCH DEC(__IBMC__ % 10) + +#elif defined(__IBMC__) && !defined(__COMPILER_VER__) && __IBMC__ < 800 +# define COMPILER_ID "VisualAge" + /* __IBMC__ = VRP */ +# define COMPILER_VERSION_MAJOR DEC(__IBMC__/100) +# define COMPILER_VERSION_MINOR DEC(__IBMC__/10 % 10) +# define COMPILER_VERSION_PATCH DEC(__IBMC__ % 10) + +#elif defined(__NVCOMPILER) +# define COMPILER_ID "NVHPC" +# define COMPILER_VERSION_MAJOR DEC(__NVCOMPILER_MAJOR__) +# define COMPILER_VERSION_MINOR DEC(__NVCOMPILER_MINOR__) +# if defined(__NVCOMPILER_PATCHLEVEL__) +# define COMPILER_VERSION_PATCH DEC(__NVCOMPILER_PATCHLEVEL__) +# endif + +#elif defined(__PGI) +# define COMPILER_ID "PGI" +# define COMPILER_VERSION_MAJOR DEC(__PGIC__) +# define COMPILER_VERSION_MINOR DEC(__PGIC_MINOR__) +# if defined(__PGIC_PATCHLEVEL__) +# define COMPILER_VERSION_PATCH DEC(__PGIC_PATCHLEVEL__) +# endif + +#elif defined(__clang__) && defined(__cray__) +# define COMPILER_ID "CrayClang" +# define COMPILER_VERSION_MAJOR DEC(__cray_major__) +# define COMPILER_VERSION_MINOR DEC(__cray_minor__) +# define COMPILER_VERSION_PATCH DEC(__cray_patchlevel__) +# define COMPILER_VERSION_INTERNAL_STR __clang_version__ + + +#elif defined(_CRAYC) +# define COMPILER_ID "Cray" +# define COMPILER_VERSION_MAJOR DEC(_RELEASE_MAJOR) +# define COMPILER_VERSION_MINOR DEC(_RELEASE_MINOR) + +#elif defined(__TI_COMPILER_VERSION__) +# define COMPILER_ID "TI" + /* __TI_COMPILER_VERSION__ = VVVRRRPPP */ +# define COMPILER_VERSION_MAJOR DEC(__TI_COMPILER_VERSION__/1000000) +# define COMPILER_VERSION_MINOR DEC(__TI_COMPILER_VERSION__/1000 % 1000) +# define COMPILER_VERSION_PATCH DEC(__TI_COMPILER_VERSION__ % 1000) + +#elif defined(__CLANG_FUJITSU) +# define COMPILER_ID "FujitsuClang" +# define COMPILER_VERSION_MAJOR DEC(__FCC_major__) +# define COMPILER_VERSION_MINOR DEC(__FCC_minor__) +# define COMPILER_VERSION_PATCH DEC(__FCC_patchlevel__) +# define COMPILER_VERSION_INTERNAL_STR __clang_version__ + + +#elif defined(__FUJITSU) +# define COMPILER_ID "Fujitsu" +# if defined(__FCC_version__) +# define COMPILER_VERSION __FCC_version__ +# elif defined(__FCC_major__) +# define COMPILER_VERSION_MAJOR DEC(__FCC_major__) +# define COMPILER_VERSION_MINOR DEC(__FCC_minor__) +# define COMPILER_VERSION_PATCH DEC(__FCC_patchlevel__) +# endif +# if defined(__fcc_version) +# define COMPILER_VERSION_INTERNAL DEC(__fcc_version) +# elif defined(__FCC_VERSION) +# define COMPILER_VERSION_INTERNAL DEC(__FCC_VERSION) +# endif + + +#elif defined(__ghs__) +# define COMPILER_ID "GHS" +/* __GHS_VERSION_NUMBER = VVVVRP */ +# ifdef __GHS_VERSION_NUMBER +# define COMPILER_VERSION_MAJOR DEC(__GHS_VERSION_NUMBER / 100) +# define COMPILER_VERSION_MINOR DEC(__GHS_VERSION_NUMBER / 10 % 10) +# define COMPILER_VERSION_PATCH DEC(__GHS_VERSION_NUMBER % 10) +# endif + +#elif defined(__TASKING__) +# define COMPILER_ID "Tasking" + # define COMPILER_VERSION_MAJOR DEC(__VERSION__/1000) + # define COMPILER_VERSION_MINOR DEC(__VERSION__ % 100) +# define COMPILER_VERSION_INTERNAL DEC(__VERSION__) + +#elif defined(__ORANGEC__) +# define COMPILER_ID "OrangeC" +# define COMPILER_VERSION_MAJOR DEC(__ORANGEC_MAJOR__) +# define COMPILER_VERSION_MINOR DEC(__ORANGEC_MINOR__) +# define COMPILER_VERSION_PATCH DEC(__ORANGEC_PATCHLEVEL__) + +#elif defined(__TINYC__) +# define COMPILER_ID "TinyCC" + +#elif defined(__BCC__) +# define COMPILER_ID "Bruce" + +#elif defined(__SCO_VERSION__) +# define COMPILER_ID "SCO" + +#elif defined(__ARMCC_VERSION) && !defined(__clang__) +# define COMPILER_ID "ARMCC" +#if __ARMCC_VERSION >= 1000000 + /* __ARMCC_VERSION = VRRPPPP */ + # define COMPILER_VERSION_MAJOR DEC(__ARMCC_VERSION/1000000) + # define COMPILER_VERSION_MINOR DEC(__ARMCC_VERSION/10000 % 100) + # define COMPILER_VERSION_PATCH DEC(__ARMCC_VERSION % 10000) +#else + /* __ARMCC_VERSION = VRPPPP */ + # define COMPILER_VERSION_MAJOR DEC(__ARMCC_VERSION/100000) + # define COMPILER_VERSION_MINOR DEC(__ARMCC_VERSION/10000 % 10) + # define COMPILER_VERSION_PATCH DEC(__ARMCC_VERSION % 10000) +#endif + + +#elif defined(__clang__) && defined(__apple_build_version__) +# define COMPILER_ID "AppleClang" +# if defined(_MSC_VER) +# define SIMULATE_ID "MSVC" +# endif +# define COMPILER_VERSION_MAJOR DEC(__clang_major__) +# define COMPILER_VERSION_MINOR DEC(__clang_minor__) +# define COMPILER_VERSION_PATCH DEC(__clang_patchlevel__) +# if defined(_MSC_VER) + /* _MSC_VER = VVRR */ +# define SIMULATE_VERSION_MAJOR DEC(_MSC_VER / 100) +# define SIMULATE_VERSION_MINOR DEC(_MSC_VER % 100) +# endif +# define COMPILER_VERSION_TWEAK DEC(__apple_build_version__) + +#elif defined(__clang__) && defined(__ARMCOMPILER_VERSION) +# define COMPILER_ID "ARMClang" + # define COMPILER_VERSION_MAJOR DEC(__ARMCOMPILER_VERSION/1000000) + # define COMPILER_VERSION_MINOR DEC(__ARMCOMPILER_VERSION/10000 % 100) + # define COMPILER_VERSION_PATCH DEC(__ARMCOMPILER_VERSION/100 % 100) +# define COMPILER_VERSION_INTERNAL DEC(__ARMCOMPILER_VERSION) + +#elif defined(__clang__) && defined(__ti__) +# define COMPILER_ID "TIClang" + # define COMPILER_VERSION_MAJOR DEC(__ti_major__) + # define COMPILER_VERSION_MINOR DEC(__ti_minor__) + # define COMPILER_VERSION_PATCH DEC(__ti_patchlevel__) +# define COMPILER_VERSION_INTERNAL DEC(__ti_version__) + +#elif defined(__clang__) +# define COMPILER_ID "Clang" +# if defined(_MSC_VER) +# define SIMULATE_ID "MSVC" +# endif +# define COMPILER_VERSION_MAJOR DEC(__clang_major__) +# define COMPILER_VERSION_MINOR DEC(__clang_minor__) +# define COMPILER_VERSION_PATCH DEC(__clang_patchlevel__) +# if defined(_MSC_VER) + /* _MSC_VER = VVRR */ +# define SIMULATE_VERSION_MAJOR DEC(_MSC_VER / 100) +# define SIMULATE_VERSION_MINOR DEC(_MSC_VER % 100) +# endif + +#elif defined(__LCC__) && (defined(__GNUC__) || defined(__GNUG__) || defined(__MCST__)) +# define COMPILER_ID "LCC" +# define COMPILER_VERSION_MAJOR DEC(__LCC__ / 100) +# define COMPILER_VERSION_MINOR DEC(__LCC__ % 100) +# if defined(__LCC_MINOR__) +# define COMPILER_VERSION_PATCH DEC(__LCC_MINOR__) +# endif +# if defined(__GNUC__) && defined(__GNUC_MINOR__) +# define SIMULATE_ID "GNU" +# define SIMULATE_VERSION_MAJOR DEC(__GNUC__) +# define SIMULATE_VERSION_MINOR DEC(__GNUC_MINOR__) +# if defined(__GNUC_PATCHLEVEL__) +# define SIMULATE_VERSION_PATCH DEC(__GNUC_PATCHLEVEL__) +# endif +# endif + +#elif defined(__GNUC__) +# define COMPILER_ID "GNU" +# define COMPILER_VERSION_MAJOR DEC(__GNUC__) +# if defined(__GNUC_MINOR__) +# define COMPILER_VERSION_MINOR DEC(__GNUC_MINOR__) +# endif +# if defined(__GNUC_PATCHLEVEL__) +# define COMPILER_VERSION_PATCH DEC(__GNUC_PATCHLEVEL__) +# endif + +#elif defined(_MSC_VER) +# define COMPILER_ID "MSVC" + /* _MSC_VER = VVRR */ +# define COMPILER_VERSION_MAJOR DEC(_MSC_VER / 100) +# define COMPILER_VERSION_MINOR DEC(_MSC_VER % 100) +# if defined(_MSC_FULL_VER) +# if _MSC_VER >= 1400 + /* _MSC_FULL_VER = VVRRPPPPP */ +# define COMPILER_VERSION_PATCH DEC(_MSC_FULL_VER % 100000) +# else + /* _MSC_FULL_VER = VVRRPPPP */ +# define COMPILER_VERSION_PATCH DEC(_MSC_FULL_VER % 10000) +# endif +# endif +# if defined(_MSC_BUILD) +# define COMPILER_VERSION_TWEAK DEC(_MSC_BUILD) +# endif + +#elif defined(_ADI_COMPILER) +# define COMPILER_ID "ADSP" +#if defined(__VERSIONNUM__) + /* __VERSIONNUM__ = 0xVVRRPPTT */ +# define COMPILER_VERSION_MAJOR DEC(__VERSIONNUM__ >> 24 & 0xFF) +# define COMPILER_VERSION_MINOR DEC(__VERSIONNUM__ >> 16 & 0xFF) +# define COMPILER_VERSION_PATCH DEC(__VERSIONNUM__ >> 8 & 0xFF) +# define COMPILER_VERSION_TWEAK DEC(__VERSIONNUM__ & 0xFF) +#endif + +#elif defined(__IAR_SYSTEMS_ICC__) || defined(__IAR_SYSTEMS_ICC) +# define COMPILER_ID "IAR" +# if defined(__VER__) && defined(__ICCARM__) +# define COMPILER_VERSION_MAJOR DEC((__VER__) / 1000000) +# define COMPILER_VERSION_MINOR DEC(((__VER__) / 1000) % 1000) +# define COMPILER_VERSION_PATCH DEC((__VER__) % 1000) +# define COMPILER_VERSION_INTERNAL DEC(__IAR_SYSTEMS_ICC__) +# elif defined(__VER__) && (defined(__ICCAVR__) || defined(__ICCRX__) || defined(__ICCRH850__) || defined(__ICCRL78__) || defined(__ICC430__) || defined(__ICCRISCV__) || defined(__ICCV850__) || defined(__ICC8051__) || defined(__ICCSTM8__)) +# define COMPILER_VERSION_MAJOR DEC((__VER__) / 100) +# define COMPILER_VERSION_MINOR DEC((__VER__) - (((__VER__) / 100)*100)) +# define COMPILER_VERSION_PATCH DEC(__SUBVERSION__) +# define COMPILER_VERSION_INTERNAL DEC(__IAR_SYSTEMS_ICC__) +# endif + +#elif defined(__SDCC_VERSION_MAJOR) || defined(SDCC) +# define COMPILER_ID "SDCC" +# if defined(__SDCC_VERSION_MAJOR) +# define COMPILER_VERSION_MAJOR DEC(__SDCC_VERSION_MAJOR) +# define COMPILER_VERSION_MINOR DEC(__SDCC_VERSION_MINOR) +# define COMPILER_VERSION_PATCH DEC(__SDCC_VERSION_PATCH) +# else + /* SDCC = VRP */ +# define COMPILER_VERSION_MAJOR DEC(SDCC/100) +# define COMPILER_VERSION_MINOR DEC(SDCC/10 % 10) +# define COMPILER_VERSION_PATCH DEC(SDCC % 10) +# endif + + +/* These compilers are either not known or too old to define an + identification macro. Try to identify the platform and guess that + it is the native compiler. */ +#elif defined(__hpux) || defined(__hpua) +# define COMPILER_ID "HP" + +#else /* unknown compiler */ +# define COMPILER_ID "" +#endif + +/* Construct the string literal in pieces to prevent the source from + getting matched. Store it in a pointer rather than an array + because some compilers will just produce instructions to fill the + array rather than assigning a pointer to a static array. */ +char const* info_compiler = "INFO" ":" "compiler[" COMPILER_ID "]"; +#ifdef SIMULATE_ID +char const* info_simulate = "INFO" ":" "simulate[" SIMULATE_ID "]"; +#endif + +#ifdef __QNXNTO__ +char const* qnxnto = "INFO" ":" "qnxnto[]"; +#endif + +#if defined(__CRAYXT_COMPUTE_LINUX_TARGET) +char const *info_cray = "INFO" ":" "compiler_wrapper[CrayPrgEnv]"; +#endif + +#define STRINGIFY_HELPER(X) #X +#define STRINGIFY(X) STRINGIFY_HELPER(X) + +/* Identify known platforms by name. */ +#if defined(__linux) || defined(__linux__) || defined(linux) +# define PLATFORM_ID "Linux" + +#elif defined(__MSYS__) +# define PLATFORM_ID "MSYS" + +#elif defined(__CYGWIN__) +# define PLATFORM_ID "Cygwin" + +#elif defined(__MINGW32__) +# define PLATFORM_ID "MinGW" + +#elif defined(__APPLE__) +# define PLATFORM_ID "Darwin" + +#elif defined(_WIN32) || defined(__WIN32__) || defined(WIN32) +# define PLATFORM_ID "Windows" + +#elif defined(__FreeBSD__) || defined(__FreeBSD) +# define PLATFORM_ID "FreeBSD" + +#elif defined(__NetBSD__) || defined(__NetBSD) +# define PLATFORM_ID "NetBSD" + +#elif defined(__OpenBSD__) || defined(__OPENBSD) +# define PLATFORM_ID "OpenBSD" + +#elif defined(__sun) || defined(sun) +# define PLATFORM_ID "SunOS" + +#elif defined(_AIX) || defined(__AIX) || defined(__AIX__) || defined(__aix) || defined(__aix__) +# define PLATFORM_ID "AIX" + +#elif defined(__hpux) || defined(__hpux__) +# define PLATFORM_ID "HP-UX" + +#elif defined(__HAIKU__) +# define PLATFORM_ID "Haiku" + +#elif defined(__BeOS) || defined(__BEOS__) || defined(_BEOS) +# define PLATFORM_ID "BeOS" + +#elif defined(__QNX__) || defined(__QNXNTO__) +# define PLATFORM_ID "QNX" + +#elif defined(__tru64) || defined(_tru64) || defined(__TRU64__) +# define PLATFORM_ID "Tru64" + +#elif defined(__riscos) || defined(__riscos__) +# define PLATFORM_ID "RISCos" + +#elif defined(__sinix) || defined(__sinix__) || defined(__SINIX__) +# define PLATFORM_ID "SINIX" + +#elif defined(__UNIX_SV__) +# define PLATFORM_ID "UNIX_SV" + +#elif defined(__bsdos__) +# define PLATFORM_ID "BSDOS" + +#elif defined(_MPRAS) || defined(MPRAS) +# define PLATFORM_ID "MP-RAS" + +#elif defined(__osf) || defined(__osf__) +# define PLATFORM_ID "OSF1" + +#elif defined(_SCO_SV) || defined(SCO_SV) || defined(sco_sv) +# define PLATFORM_ID "SCO_SV" + +#elif defined(__ultrix) || defined(__ultrix__) || defined(_ULTRIX) +# define PLATFORM_ID "ULTRIX" + +#elif defined(__XENIX__) || defined(_XENIX) || defined(XENIX) +# define PLATFORM_ID "Xenix" + +#elif defined(__WATCOMC__) +# if defined(__LINUX__) +# define PLATFORM_ID "Linux" + +# elif defined(__DOS__) +# define PLATFORM_ID "DOS" + +# elif defined(__OS2__) +# define PLATFORM_ID "OS2" + +# elif defined(__WINDOWS__) +# define PLATFORM_ID "Windows3x" + +# elif defined(__VXWORKS__) +# define PLATFORM_ID "VxWorks" + +# else /* unknown platform */ +# define PLATFORM_ID +# endif + +#elif defined(__INTEGRITY) +# if defined(INT_178B) +# define PLATFORM_ID "Integrity178" + +# else /* regular Integrity */ +# define PLATFORM_ID "Integrity" +# endif + +# elif defined(_ADI_COMPILER) +# define PLATFORM_ID "ADSP" + +#else /* unknown platform */ +# define PLATFORM_ID + +#endif + +/* For windows compilers MSVC and Intel we can determine + the architecture of the compiler being used. This is because + the compilers do not have flags that can change the architecture, + but rather depend on which compiler is being used +*/ +#if defined(_WIN32) && defined(_MSC_VER) +# if defined(_M_IA64) +# define ARCHITECTURE_ID "IA64" + +# elif defined(_M_ARM64EC) +# define ARCHITECTURE_ID "ARM64EC" + +# elif defined(_M_X64) || defined(_M_AMD64) +# define ARCHITECTURE_ID "x64" + +# elif defined(_M_IX86) +# define ARCHITECTURE_ID "X86" + +# elif defined(_M_ARM64) +# define ARCHITECTURE_ID "ARM64" + +# elif defined(_M_ARM) +# if _M_ARM == 4 +# define ARCHITECTURE_ID "ARMV4I" +# elif _M_ARM == 5 +# define ARCHITECTURE_ID "ARMV5I" +# else +# define ARCHITECTURE_ID "ARMV" STRINGIFY(_M_ARM) +# endif + +# elif defined(_M_MIPS) +# define ARCHITECTURE_ID "MIPS" + +# elif defined(_M_SH) +# define ARCHITECTURE_ID "SHx" + +# else /* unknown architecture */ +# define ARCHITECTURE_ID "" +# endif + +#elif defined(__WATCOMC__) +# if defined(_M_I86) +# define ARCHITECTURE_ID "I86" + +# elif defined(_M_IX86) +# define ARCHITECTURE_ID "X86" + +# else /* unknown architecture */ +# define ARCHITECTURE_ID "" +# endif + +#elif defined(__IAR_SYSTEMS_ICC__) || defined(__IAR_SYSTEMS_ICC) +# if defined(__ICCARM__) +# define ARCHITECTURE_ID "ARM" + +# elif defined(__ICCRX__) +# define ARCHITECTURE_ID "RX" + +# elif defined(__ICCRH850__) +# define ARCHITECTURE_ID "RH850" + +# elif defined(__ICCRL78__) +# define ARCHITECTURE_ID "RL78" + +# elif defined(__ICCRISCV__) +# define ARCHITECTURE_ID "RISCV" + +# elif defined(__ICCAVR__) +# define ARCHITECTURE_ID "AVR" + +# elif defined(__ICC430__) +# define ARCHITECTURE_ID "MSP430" + +# elif defined(__ICCV850__) +# define ARCHITECTURE_ID "V850" + +# elif defined(__ICC8051__) +# define ARCHITECTURE_ID "8051" + +# elif defined(__ICCSTM8__) +# define ARCHITECTURE_ID "STM8" + +# else /* unknown architecture */ +# define ARCHITECTURE_ID "" +# endif + +#elif defined(__ghs__) +# if defined(__PPC64__) +# define ARCHITECTURE_ID "PPC64" + +# elif defined(__ppc__) +# define ARCHITECTURE_ID "PPC" + +# elif defined(__ARM__) +# define ARCHITECTURE_ID "ARM" + +# elif defined(__x86_64__) +# define ARCHITECTURE_ID "x64" + +# elif defined(__i386__) +# define ARCHITECTURE_ID "X86" + +# else /* unknown architecture */ +# define ARCHITECTURE_ID "" +# endif + +#elif defined(__clang__) && defined(__ti__) +# if defined(__ARM_ARCH) +# define ARCHITECTURE_ID "Arm" + +# else /* unknown architecture */ +# define ARCHITECTURE_ID "" +# endif + +#elif defined(__TI_COMPILER_VERSION__) +# if defined(__TI_ARM__) +# define ARCHITECTURE_ID "ARM" + +# elif defined(__MSP430__) +# define ARCHITECTURE_ID "MSP430" + +# elif defined(__TMS320C28XX__) +# define ARCHITECTURE_ID "TMS320C28x" + +# elif defined(__TMS320C6X__) || defined(_TMS320C6X) +# define ARCHITECTURE_ID "TMS320C6x" + +# else /* unknown architecture */ +# define ARCHITECTURE_ID "" +# endif + +# elif defined(__ADSPSHARC__) +# define ARCHITECTURE_ID "SHARC" + +# elif defined(__ADSPBLACKFIN__) +# define ARCHITECTURE_ID "Blackfin" + +#elif defined(__TASKING__) + +# if defined(__CTC__) || defined(__CPTC__) +# define ARCHITECTURE_ID "TriCore" + +# elif defined(__CMCS__) +# define ARCHITECTURE_ID "MCS" + +# elif defined(__CARM__) +# define ARCHITECTURE_ID "ARM" + +# elif defined(__CARC__) +# define ARCHITECTURE_ID "ARC" + +# elif defined(__C51__) +# define ARCHITECTURE_ID "8051" + +# elif defined(__CPCP__) +# define ARCHITECTURE_ID "PCP" + +# else +# define ARCHITECTURE_ID "" +# endif + +#else +# define ARCHITECTURE_ID +#endif + +/* Convert integer to decimal digit literals. */ +#define DEC(n) \ + ('0' + (((n) / 10000000)%10)), \ + ('0' + (((n) / 1000000)%10)), \ + ('0' + (((n) / 100000)%10)), \ + ('0' + (((n) / 10000)%10)), \ + ('0' + (((n) / 1000)%10)), \ + ('0' + (((n) / 100)%10)), \ + ('0' + (((n) / 10)%10)), \ + ('0' + ((n) % 10)) + +/* Convert integer to hex digit literals. */ +#define HEX(n) \ + ('0' + ((n)>>28 & 0xF)), \ + ('0' + ((n)>>24 & 0xF)), \ + ('0' + ((n)>>20 & 0xF)), \ + ('0' + ((n)>>16 & 0xF)), \ + ('0' + ((n)>>12 & 0xF)), \ + ('0' + ((n)>>8 & 0xF)), \ + ('0' + ((n)>>4 & 0xF)), \ + ('0' + ((n) & 0xF)) + +/* Construct a string literal encoding the version number. */ +#ifdef COMPILER_VERSION +char const* info_version = "INFO" ":" "compiler_version[" COMPILER_VERSION "]"; + +/* Construct a string literal encoding the version number components. */ +#elif defined(COMPILER_VERSION_MAJOR) +char const info_version[] = { + 'I', 'N', 'F', 'O', ':', + 'c','o','m','p','i','l','e','r','_','v','e','r','s','i','o','n','[', + COMPILER_VERSION_MAJOR, +# ifdef COMPILER_VERSION_MINOR + '.', COMPILER_VERSION_MINOR, +# ifdef COMPILER_VERSION_PATCH + '.', COMPILER_VERSION_PATCH, +# ifdef COMPILER_VERSION_TWEAK + '.', COMPILER_VERSION_TWEAK, +# endif +# endif +# endif + ']','\0'}; +#endif + +/* Construct a string literal encoding the internal version number. */ +#ifdef COMPILER_VERSION_INTERNAL +char const info_version_internal[] = { + 'I', 'N', 'F', 'O', ':', + 'c','o','m','p','i','l','e','r','_','v','e','r','s','i','o','n','_', + 'i','n','t','e','r','n','a','l','[', + COMPILER_VERSION_INTERNAL,']','\0'}; +#elif defined(COMPILER_VERSION_INTERNAL_STR) +char const* info_version_internal = "INFO" ":" "compiler_version_internal[" COMPILER_VERSION_INTERNAL_STR "]"; +#endif + +/* Construct a string literal encoding the version number components. */ +#ifdef SIMULATE_VERSION_MAJOR +char const info_simulate_version[] = { + 'I', 'N', 'F', 'O', ':', + 's','i','m','u','l','a','t','e','_','v','e','r','s','i','o','n','[', + SIMULATE_VERSION_MAJOR, +# ifdef SIMULATE_VERSION_MINOR + '.', SIMULATE_VERSION_MINOR, +# ifdef SIMULATE_VERSION_PATCH + '.', SIMULATE_VERSION_PATCH, +# ifdef SIMULATE_VERSION_TWEAK + '.', SIMULATE_VERSION_TWEAK, +# endif +# endif +# endif + ']','\0'}; +#endif + +/* Construct the string literal in pieces to prevent the source from + getting matched. Store it in a pointer rather than an array + because some compilers will just produce instructions to fill the + array rather than assigning a pointer to a static array. */ +char const* info_platform = "INFO" ":" "platform[" PLATFORM_ID "]"; +char const* info_arch = "INFO" ":" "arch[" ARCHITECTURE_ID "]"; + + + +#define C_STD_99 199901L +#define C_STD_11 201112L +#define C_STD_17 201710L +#define C_STD_23 202311L + +#ifdef __STDC_VERSION__ +# define C_STD __STDC_VERSION__ +#endif + +#if !defined(__STDC__) && !defined(__clang__) +# if defined(_MSC_VER) || defined(__ibmxl__) || defined(__IBMC__) +# define C_VERSION "90" +# else +# define C_VERSION +# endif +#elif C_STD > C_STD_17 +# define C_VERSION "23" +#elif C_STD > C_STD_11 +# define C_VERSION "17" +#elif C_STD > C_STD_99 +# define C_VERSION "11" +#elif C_STD >= C_STD_99 +# define C_VERSION "99" +#else +# define C_VERSION "90" +#endif +const char* info_language_standard_default = + "INFO" ":" "standard_default[" C_VERSION "]"; + +const char* info_language_extensions_default = "INFO" ":" "extensions_default[" +#if (defined(__clang__) || defined(__GNUC__) || defined(__xlC__) || \ + defined(__TI_COMPILER_VERSION__)) && \ + !defined(__STRICT_ANSI__) + "ON" +#else + "OFF" +#endif +"]"; + +/*--------------------------------------------------------------------------*/ + +#ifdef ID_VOID_MAIN +void main() {} +#else +# if defined(__CLASSIC_C__) +int main(argc, argv) int argc; char *argv[]; +# else +int main(int argc, char* argv[]) +# endif +{ + int require = 0; + require += info_compiler[argc]; + require += info_platform[argc]; + require += info_arch[argc]; +#ifdef COMPILER_VERSION_MAJOR + require += info_version[argc]; +#endif +#ifdef COMPILER_VERSION_INTERNAL + require += info_version_internal[argc]; +#endif +#ifdef SIMULATE_ID + require += info_simulate[argc]; +#endif +#ifdef SIMULATE_VERSION_MAJOR + require += info_simulate_version[argc]; +#endif +#if defined(__CRAYXT_COMPUTE_LINUX_TARGET) + require += info_cray[argc]; +#endif + require += info_language_standard_default[argc]; + require += info_language_extensions_default[argc]; + (void)argv; + return require; +} +#endif diff --git a/siro_rider/android/app/.cxx/RelWithDebInfo/6t1m4b5v/arm64-v8a/CMakeFiles/3.31.5-g6cf5163/CompilerIdC/CMakeCCompilerId.o b/siro_rider/android/app/.cxx/RelWithDebInfo/6t1m4b5v/arm64-v8a/CMakeFiles/3.31.5-g6cf5163/CompilerIdC/CMakeCCompilerId.o new file mode 100644 index 0000000..89c4c61 Binary files /dev/null and b/siro_rider/android/app/.cxx/RelWithDebInfo/6t1m4b5v/arm64-v8a/CMakeFiles/3.31.5-g6cf5163/CompilerIdC/CMakeCCompilerId.o differ diff --git a/siro_rider/android/app/.cxx/RelWithDebInfo/6t1m4b5v/arm64-v8a/CMakeFiles/3.31.5-g6cf5163/CompilerIdCXX/CMakeCXXCompilerId.cpp b/siro_rider/android/app/.cxx/RelWithDebInfo/6t1m4b5v/arm64-v8a/CMakeFiles/3.31.5-g6cf5163/CompilerIdCXX/CMakeCXXCompilerId.cpp new file mode 100644 index 0000000..da6c824 --- /dev/null +++ b/siro_rider/android/app/.cxx/RelWithDebInfo/6t1m4b5v/arm64-v8a/CMakeFiles/3.31.5-g6cf5163/CompilerIdCXX/CMakeCXXCompilerId.cpp @@ -0,0 +1,919 @@ +/* This source file must have a .cpp extension so that all C++ compilers + recognize the extension without flags. Borland does not know .cxx for + example. */ +#ifndef __cplusplus +# error "A C compiler has been selected for C++." +#endif + +#if !defined(__has_include) +/* If the compiler does not have __has_include, pretend the answer is + always no. */ +# define __has_include(x) 0 +#endif + + +/* Version number components: V=Version, R=Revision, P=Patch + Version date components: YYYY=Year, MM=Month, DD=Day */ + +#if defined(__INTEL_COMPILER) || defined(__ICC) +# define COMPILER_ID "Intel" +# if defined(_MSC_VER) +# define SIMULATE_ID "MSVC" +# endif +# if defined(__GNUC__) +# define SIMULATE_ID "GNU" +# endif + /* __INTEL_COMPILER = VRP prior to 2021, and then VVVV for 2021 and later, + except that a few beta releases use the old format with V=2021. */ +# if __INTEL_COMPILER < 2021 || __INTEL_COMPILER == 202110 || __INTEL_COMPILER == 202111 +# define COMPILER_VERSION_MAJOR DEC(__INTEL_COMPILER/100) +# define COMPILER_VERSION_MINOR DEC(__INTEL_COMPILER/10 % 10) +# if defined(__INTEL_COMPILER_UPDATE) +# define COMPILER_VERSION_PATCH DEC(__INTEL_COMPILER_UPDATE) +# else +# define COMPILER_VERSION_PATCH DEC(__INTEL_COMPILER % 10) +# endif +# else +# define COMPILER_VERSION_MAJOR DEC(__INTEL_COMPILER) +# define COMPILER_VERSION_MINOR DEC(__INTEL_COMPILER_UPDATE) + /* The third version component from --version is an update index, + but no macro is provided for it. */ +# define COMPILER_VERSION_PATCH DEC(0) +# endif +# if defined(__INTEL_COMPILER_BUILD_DATE) + /* __INTEL_COMPILER_BUILD_DATE = YYYYMMDD */ +# define COMPILER_VERSION_TWEAK DEC(__INTEL_COMPILER_BUILD_DATE) +# endif +# if defined(_MSC_VER) + /* _MSC_VER = VVRR */ +# define SIMULATE_VERSION_MAJOR DEC(_MSC_VER / 100) +# define SIMULATE_VERSION_MINOR DEC(_MSC_VER % 100) +# endif +# if defined(__GNUC__) +# define SIMULATE_VERSION_MAJOR DEC(__GNUC__) +# elif defined(__GNUG__) +# define SIMULATE_VERSION_MAJOR DEC(__GNUG__) +# endif +# if defined(__GNUC_MINOR__) +# define SIMULATE_VERSION_MINOR DEC(__GNUC_MINOR__) +# endif +# if defined(__GNUC_PATCHLEVEL__) +# define SIMULATE_VERSION_PATCH DEC(__GNUC_PATCHLEVEL__) +# endif + +#elif (defined(__clang__) && defined(__INTEL_CLANG_COMPILER)) || defined(__INTEL_LLVM_COMPILER) +# define COMPILER_ID "IntelLLVM" +#if defined(_MSC_VER) +# define SIMULATE_ID "MSVC" +#endif +#if defined(__GNUC__) +# define SIMULATE_ID "GNU" +#endif +/* __INTEL_LLVM_COMPILER = VVVVRP prior to 2021.2.0, VVVVRRPP for 2021.2.0 and + * later. Look for 6 digit vs. 8 digit version number to decide encoding. + * VVVV is no smaller than the current year when a version is released. + */ +#if __INTEL_LLVM_COMPILER < 1000000L +# define COMPILER_VERSION_MAJOR DEC(__INTEL_LLVM_COMPILER/100) +# define COMPILER_VERSION_MINOR DEC(__INTEL_LLVM_COMPILER/10 % 10) +# define COMPILER_VERSION_PATCH DEC(__INTEL_LLVM_COMPILER % 10) +#else +# define COMPILER_VERSION_MAJOR DEC(__INTEL_LLVM_COMPILER/10000) +# define COMPILER_VERSION_MINOR DEC(__INTEL_LLVM_COMPILER/100 % 100) +# define COMPILER_VERSION_PATCH DEC(__INTEL_LLVM_COMPILER % 100) +#endif +#if defined(_MSC_VER) + /* _MSC_VER = VVRR */ +# define SIMULATE_VERSION_MAJOR DEC(_MSC_VER / 100) +# define SIMULATE_VERSION_MINOR DEC(_MSC_VER % 100) +#endif +#if defined(__GNUC__) +# define SIMULATE_VERSION_MAJOR DEC(__GNUC__) +#elif defined(__GNUG__) +# define SIMULATE_VERSION_MAJOR DEC(__GNUG__) +#endif +#if defined(__GNUC_MINOR__) +# define SIMULATE_VERSION_MINOR DEC(__GNUC_MINOR__) +#endif +#if defined(__GNUC_PATCHLEVEL__) +# define SIMULATE_VERSION_PATCH DEC(__GNUC_PATCHLEVEL__) +#endif + +#elif defined(__PATHCC__) +# define COMPILER_ID "PathScale" +# define COMPILER_VERSION_MAJOR DEC(__PATHCC__) +# define COMPILER_VERSION_MINOR DEC(__PATHCC_MINOR__) +# if defined(__PATHCC_PATCHLEVEL__) +# define COMPILER_VERSION_PATCH DEC(__PATHCC_PATCHLEVEL__) +# endif + +#elif defined(__BORLANDC__) && defined(__CODEGEARC_VERSION__) +# define COMPILER_ID "Embarcadero" +# define COMPILER_VERSION_MAJOR HEX(__CODEGEARC_VERSION__>>24 & 0x00FF) +# define COMPILER_VERSION_MINOR HEX(__CODEGEARC_VERSION__>>16 & 0x00FF) +# define COMPILER_VERSION_PATCH DEC(__CODEGEARC_VERSION__ & 0xFFFF) + +#elif defined(__BORLANDC__) +# define COMPILER_ID "Borland" + /* __BORLANDC__ = 0xVRR */ +# define COMPILER_VERSION_MAJOR HEX(__BORLANDC__>>8) +# define COMPILER_VERSION_MINOR HEX(__BORLANDC__ & 0xFF) + +#elif defined(__WATCOMC__) && __WATCOMC__ < 1200 +# define COMPILER_ID "Watcom" + /* __WATCOMC__ = VVRR */ +# define COMPILER_VERSION_MAJOR DEC(__WATCOMC__ / 100) +# define COMPILER_VERSION_MINOR DEC((__WATCOMC__ / 10) % 10) +# if (__WATCOMC__ % 10) > 0 +# define COMPILER_VERSION_PATCH DEC(__WATCOMC__ % 10) +# endif + +#elif defined(__WATCOMC__) +# define COMPILER_ID "OpenWatcom" + /* __WATCOMC__ = VVRP + 1100 */ +# define COMPILER_VERSION_MAJOR DEC((__WATCOMC__ - 1100) / 100) +# define COMPILER_VERSION_MINOR DEC((__WATCOMC__ / 10) % 10) +# if (__WATCOMC__ % 10) > 0 +# define COMPILER_VERSION_PATCH DEC(__WATCOMC__ % 10) +# endif + +#elif defined(__SUNPRO_CC) +# define COMPILER_ID "SunPro" +# if __SUNPRO_CC >= 0x5100 + /* __SUNPRO_CC = 0xVRRP */ +# define COMPILER_VERSION_MAJOR HEX(__SUNPRO_CC>>12) +# define COMPILER_VERSION_MINOR HEX(__SUNPRO_CC>>4 & 0xFF) +# define COMPILER_VERSION_PATCH HEX(__SUNPRO_CC & 0xF) +# else + /* __SUNPRO_CC = 0xVRP */ +# define COMPILER_VERSION_MAJOR HEX(__SUNPRO_CC>>8) +# define COMPILER_VERSION_MINOR HEX(__SUNPRO_CC>>4 & 0xF) +# define COMPILER_VERSION_PATCH HEX(__SUNPRO_CC & 0xF) +# endif + +#elif defined(__HP_aCC) +# define COMPILER_ID "HP" + /* __HP_aCC = VVRRPP */ +# define COMPILER_VERSION_MAJOR DEC(__HP_aCC/10000) +# define COMPILER_VERSION_MINOR DEC(__HP_aCC/100 % 100) +# define COMPILER_VERSION_PATCH DEC(__HP_aCC % 100) + +#elif defined(__DECCXX) +# define COMPILER_ID "Compaq" + /* __DECCXX_VER = VVRRTPPPP */ +# define COMPILER_VERSION_MAJOR DEC(__DECCXX_VER/10000000) +# define COMPILER_VERSION_MINOR DEC(__DECCXX_VER/100000 % 100) +# define COMPILER_VERSION_PATCH DEC(__DECCXX_VER % 10000) + +#elif defined(__IBMCPP__) && defined(__COMPILER_VER__) +# define COMPILER_ID "zOS" + /* __IBMCPP__ = VRP */ +# define COMPILER_VERSION_MAJOR DEC(__IBMCPP__/100) +# define COMPILER_VERSION_MINOR DEC(__IBMCPP__/10 % 10) +# define COMPILER_VERSION_PATCH DEC(__IBMCPP__ % 10) + +#elif defined(__open_xl__) && defined(__clang__) +# define COMPILER_ID "IBMClang" +# define COMPILER_VERSION_MAJOR DEC(__open_xl_version__) +# define COMPILER_VERSION_MINOR DEC(__open_xl_release__) +# define COMPILER_VERSION_PATCH DEC(__open_xl_modification__) +# define COMPILER_VERSION_TWEAK DEC(__open_xl_ptf_fix_level__) + + +#elif defined(__ibmxl__) && defined(__clang__) +# define COMPILER_ID "XLClang" +# define COMPILER_VERSION_MAJOR DEC(__ibmxl_version__) +# define COMPILER_VERSION_MINOR DEC(__ibmxl_release__) +# define COMPILER_VERSION_PATCH DEC(__ibmxl_modification__) +# define COMPILER_VERSION_TWEAK DEC(__ibmxl_ptf_fix_level__) + + +#elif defined(__IBMCPP__) && !defined(__COMPILER_VER__) && __IBMCPP__ >= 800 +# define COMPILER_ID "XL" + /* __IBMCPP__ = VRP */ +# define COMPILER_VERSION_MAJOR DEC(__IBMCPP__/100) +# define COMPILER_VERSION_MINOR DEC(__IBMCPP__/10 % 10) +# define COMPILER_VERSION_PATCH DEC(__IBMCPP__ % 10) + +#elif defined(__IBMCPP__) && !defined(__COMPILER_VER__) && __IBMCPP__ < 800 +# define COMPILER_ID "VisualAge" + /* __IBMCPP__ = VRP */ +# define COMPILER_VERSION_MAJOR DEC(__IBMCPP__/100) +# define COMPILER_VERSION_MINOR DEC(__IBMCPP__/10 % 10) +# define COMPILER_VERSION_PATCH DEC(__IBMCPP__ % 10) + +#elif defined(__NVCOMPILER) +# define COMPILER_ID "NVHPC" +# define COMPILER_VERSION_MAJOR DEC(__NVCOMPILER_MAJOR__) +# define COMPILER_VERSION_MINOR DEC(__NVCOMPILER_MINOR__) +# if defined(__NVCOMPILER_PATCHLEVEL__) +# define COMPILER_VERSION_PATCH DEC(__NVCOMPILER_PATCHLEVEL__) +# endif + +#elif defined(__PGI) +# define COMPILER_ID "PGI" +# define COMPILER_VERSION_MAJOR DEC(__PGIC__) +# define COMPILER_VERSION_MINOR DEC(__PGIC_MINOR__) +# if defined(__PGIC_PATCHLEVEL__) +# define COMPILER_VERSION_PATCH DEC(__PGIC_PATCHLEVEL__) +# endif + +#elif defined(__clang__) && defined(__cray__) +# define COMPILER_ID "CrayClang" +# define COMPILER_VERSION_MAJOR DEC(__cray_major__) +# define COMPILER_VERSION_MINOR DEC(__cray_minor__) +# define COMPILER_VERSION_PATCH DEC(__cray_patchlevel__) +# define COMPILER_VERSION_INTERNAL_STR __clang_version__ + + +#elif defined(_CRAYC) +# define COMPILER_ID "Cray" +# define COMPILER_VERSION_MAJOR DEC(_RELEASE_MAJOR) +# define COMPILER_VERSION_MINOR DEC(_RELEASE_MINOR) + +#elif defined(__TI_COMPILER_VERSION__) +# define COMPILER_ID "TI" + /* __TI_COMPILER_VERSION__ = VVVRRRPPP */ +# define COMPILER_VERSION_MAJOR DEC(__TI_COMPILER_VERSION__/1000000) +# define COMPILER_VERSION_MINOR DEC(__TI_COMPILER_VERSION__/1000 % 1000) +# define COMPILER_VERSION_PATCH DEC(__TI_COMPILER_VERSION__ % 1000) + +#elif defined(__CLANG_FUJITSU) +# define COMPILER_ID "FujitsuClang" +# define COMPILER_VERSION_MAJOR DEC(__FCC_major__) +# define COMPILER_VERSION_MINOR DEC(__FCC_minor__) +# define COMPILER_VERSION_PATCH DEC(__FCC_patchlevel__) +# define COMPILER_VERSION_INTERNAL_STR __clang_version__ + + +#elif defined(__FUJITSU) +# define COMPILER_ID "Fujitsu" +# if defined(__FCC_version__) +# define COMPILER_VERSION __FCC_version__ +# elif defined(__FCC_major__) +# define COMPILER_VERSION_MAJOR DEC(__FCC_major__) +# define COMPILER_VERSION_MINOR DEC(__FCC_minor__) +# define COMPILER_VERSION_PATCH DEC(__FCC_patchlevel__) +# endif +# if defined(__fcc_version) +# define COMPILER_VERSION_INTERNAL DEC(__fcc_version) +# elif defined(__FCC_VERSION) +# define COMPILER_VERSION_INTERNAL DEC(__FCC_VERSION) +# endif + + +#elif defined(__ghs__) +# define COMPILER_ID "GHS" +/* __GHS_VERSION_NUMBER = VVVVRP */ +# ifdef __GHS_VERSION_NUMBER +# define COMPILER_VERSION_MAJOR DEC(__GHS_VERSION_NUMBER / 100) +# define COMPILER_VERSION_MINOR DEC(__GHS_VERSION_NUMBER / 10 % 10) +# define COMPILER_VERSION_PATCH DEC(__GHS_VERSION_NUMBER % 10) +# endif + +#elif defined(__TASKING__) +# define COMPILER_ID "Tasking" + # define COMPILER_VERSION_MAJOR DEC(__VERSION__/1000) + # define COMPILER_VERSION_MINOR DEC(__VERSION__ % 100) +# define COMPILER_VERSION_INTERNAL DEC(__VERSION__) + +#elif defined(__ORANGEC__) +# define COMPILER_ID "OrangeC" +# define COMPILER_VERSION_MAJOR DEC(__ORANGEC_MAJOR__) +# define COMPILER_VERSION_MINOR DEC(__ORANGEC_MINOR__) +# define COMPILER_VERSION_PATCH DEC(__ORANGEC_PATCHLEVEL__) + +#elif defined(__SCO_VERSION__) +# define COMPILER_ID "SCO" + +#elif defined(__ARMCC_VERSION) && !defined(__clang__) +# define COMPILER_ID "ARMCC" +#if __ARMCC_VERSION >= 1000000 + /* __ARMCC_VERSION = VRRPPPP */ + # define COMPILER_VERSION_MAJOR DEC(__ARMCC_VERSION/1000000) + # define COMPILER_VERSION_MINOR DEC(__ARMCC_VERSION/10000 % 100) + # define COMPILER_VERSION_PATCH DEC(__ARMCC_VERSION % 10000) +#else + /* __ARMCC_VERSION = VRPPPP */ + # define COMPILER_VERSION_MAJOR DEC(__ARMCC_VERSION/100000) + # define COMPILER_VERSION_MINOR DEC(__ARMCC_VERSION/10000 % 10) + # define COMPILER_VERSION_PATCH DEC(__ARMCC_VERSION % 10000) +#endif + + +#elif defined(__clang__) && defined(__apple_build_version__) +# define COMPILER_ID "AppleClang" +# if defined(_MSC_VER) +# define SIMULATE_ID "MSVC" +# endif +# define COMPILER_VERSION_MAJOR DEC(__clang_major__) +# define COMPILER_VERSION_MINOR DEC(__clang_minor__) +# define COMPILER_VERSION_PATCH DEC(__clang_patchlevel__) +# if defined(_MSC_VER) + /* _MSC_VER = VVRR */ +# define SIMULATE_VERSION_MAJOR DEC(_MSC_VER / 100) +# define SIMULATE_VERSION_MINOR DEC(_MSC_VER % 100) +# endif +# define COMPILER_VERSION_TWEAK DEC(__apple_build_version__) + +#elif defined(__clang__) && defined(__ARMCOMPILER_VERSION) +# define COMPILER_ID "ARMClang" + # define COMPILER_VERSION_MAJOR DEC(__ARMCOMPILER_VERSION/1000000) + # define COMPILER_VERSION_MINOR DEC(__ARMCOMPILER_VERSION/10000 % 100) + # define COMPILER_VERSION_PATCH DEC(__ARMCOMPILER_VERSION/100 % 100) +# define COMPILER_VERSION_INTERNAL DEC(__ARMCOMPILER_VERSION) + +#elif defined(__clang__) && defined(__ti__) +# define COMPILER_ID "TIClang" + # define COMPILER_VERSION_MAJOR DEC(__ti_major__) + # define COMPILER_VERSION_MINOR DEC(__ti_minor__) + # define COMPILER_VERSION_PATCH DEC(__ti_patchlevel__) +# define COMPILER_VERSION_INTERNAL DEC(__ti_version__) + +#elif defined(__clang__) +# define COMPILER_ID "Clang" +# if defined(_MSC_VER) +# define SIMULATE_ID "MSVC" +# endif +# define COMPILER_VERSION_MAJOR DEC(__clang_major__) +# define COMPILER_VERSION_MINOR DEC(__clang_minor__) +# define COMPILER_VERSION_PATCH DEC(__clang_patchlevel__) +# if defined(_MSC_VER) + /* _MSC_VER = VVRR */ +# define SIMULATE_VERSION_MAJOR DEC(_MSC_VER / 100) +# define SIMULATE_VERSION_MINOR DEC(_MSC_VER % 100) +# endif + +#elif defined(__LCC__) && (defined(__GNUC__) || defined(__GNUG__) || defined(__MCST__)) +# define COMPILER_ID "LCC" +# define COMPILER_VERSION_MAJOR DEC(__LCC__ / 100) +# define COMPILER_VERSION_MINOR DEC(__LCC__ % 100) +# if defined(__LCC_MINOR__) +# define COMPILER_VERSION_PATCH DEC(__LCC_MINOR__) +# endif +# if defined(__GNUC__) && defined(__GNUC_MINOR__) +# define SIMULATE_ID "GNU" +# define SIMULATE_VERSION_MAJOR DEC(__GNUC__) +# define SIMULATE_VERSION_MINOR DEC(__GNUC_MINOR__) +# if defined(__GNUC_PATCHLEVEL__) +# define SIMULATE_VERSION_PATCH DEC(__GNUC_PATCHLEVEL__) +# endif +# endif + +#elif defined(__GNUC__) || defined(__GNUG__) +# define COMPILER_ID "GNU" +# if defined(__GNUC__) +# define COMPILER_VERSION_MAJOR DEC(__GNUC__) +# else +# define COMPILER_VERSION_MAJOR DEC(__GNUG__) +# endif +# if defined(__GNUC_MINOR__) +# define COMPILER_VERSION_MINOR DEC(__GNUC_MINOR__) +# endif +# if defined(__GNUC_PATCHLEVEL__) +# define COMPILER_VERSION_PATCH DEC(__GNUC_PATCHLEVEL__) +# endif + +#elif defined(_MSC_VER) +# define COMPILER_ID "MSVC" + /* _MSC_VER = VVRR */ +# define COMPILER_VERSION_MAJOR DEC(_MSC_VER / 100) +# define COMPILER_VERSION_MINOR DEC(_MSC_VER % 100) +# if defined(_MSC_FULL_VER) +# if _MSC_VER >= 1400 + /* _MSC_FULL_VER = VVRRPPPPP */ +# define COMPILER_VERSION_PATCH DEC(_MSC_FULL_VER % 100000) +# else + /* _MSC_FULL_VER = VVRRPPPP */ +# define COMPILER_VERSION_PATCH DEC(_MSC_FULL_VER % 10000) +# endif +# endif +# if defined(_MSC_BUILD) +# define COMPILER_VERSION_TWEAK DEC(_MSC_BUILD) +# endif + +#elif defined(_ADI_COMPILER) +# define COMPILER_ID "ADSP" +#if defined(__VERSIONNUM__) + /* __VERSIONNUM__ = 0xVVRRPPTT */ +# define COMPILER_VERSION_MAJOR DEC(__VERSIONNUM__ >> 24 & 0xFF) +# define COMPILER_VERSION_MINOR DEC(__VERSIONNUM__ >> 16 & 0xFF) +# define COMPILER_VERSION_PATCH DEC(__VERSIONNUM__ >> 8 & 0xFF) +# define COMPILER_VERSION_TWEAK DEC(__VERSIONNUM__ & 0xFF) +#endif + +#elif defined(__IAR_SYSTEMS_ICC__) || defined(__IAR_SYSTEMS_ICC) +# define COMPILER_ID "IAR" +# if defined(__VER__) && defined(__ICCARM__) +# define COMPILER_VERSION_MAJOR DEC((__VER__) / 1000000) +# define COMPILER_VERSION_MINOR DEC(((__VER__) / 1000) % 1000) +# define COMPILER_VERSION_PATCH DEC((__VER__) % 1000) +# define COMPILER_VERSION_INTERNAL DEC(__IAR_SYSTEMS_ICC__) +# elif defined(__VER__) && (defined(__ICCAVR__) || defined(__ICCRX__) || defined(__ICCRH850__) || defined(__ICCRL78__) || defined(__ICC430__) || defined(__ICCRISCV__) || defined(__ICCV850__) || defined(__ICC8051__) || defined(__ICCSTM8__)) +# define COMPILER_VERSION_MAJOR DEC((__VER__) / 100) +# define COMPILER_VERSION_MINOR DEC((__VER__) - (((__VER__) / 100)*100)) +# define COMPILER_VERSION_PATCH DEC(__SUBVERSION__) +# define COMPILER_VERSION_INTERNAL DEC(__IAR_SYSTEMS_ICC__) +# endif + + +/* These compilers are either not known or too old to define an + identification macro. Try to identify the platform and guess that + it is the native compiler. */ +#elif defined(__hpux) || defined(__hpua) +# define COMPILER_ID "HP" + +#else /* unknown compiler */ +# define COMPILER_ID "" +#endif + +/* Construct the string literal in pieces to prevent the source from + getting matched. Store it in a pointer rather than an array + because some compilers will just produce instructions to fill the + array rather than assigning a pointer to a static array. */ +char const* info_compiler = "INFO" ":" "compiler[" COMPILER_ID "]"; +#ifdef SIMULATE_ID +char const* info_simulate = "INFO" ":" "simulate[" SIMULATE_ID "]"; +#endif + +#ifdef __QNXNTO__ +char const* qnxnto = "INFO" ":" "qnxnto[]"; +#endif + +#if defined(__CRAYXT_COMPUTE_LINUX_TARGET) +char const *info_cray = "INFO" ":" "compiler_wrapper[CrayPrgEnv]"; +#endif + +#define STRINGIFY_HELPER(X) #X +#define STRINGIFY(X) STRINGIFY_HELPER(X) + +/* Identify known platforms by name. */ +#if defined(__linux) || defined(__linux__) || defined(linux) +# define PLATFORM_ID "Linux" + +#elif defined(__MSYS__) +# define PLATFORM_ID "MSYS" + +#elif defined(__CYGWIN__) +# define PLATFORM_ID "Cygwin" + +#elif defined(__MINGW32__) +# define PLATFORM_ID "MinGW" + +#elif defined(__APPLE__) +# define PLATFORM_ID "Darwin" + +#elif defined(_WIN32) || defined(__WIN32__) || defined(WIN32) +# define PLATFORM_ID "Windows" + +#elif defined(__FreeBSD__) || defined(__FreeBSD) +# define PLATFORM_ID "FreeBSD" + +#elif defined(__NetBSD__) || defined(__NetBSD) +# define PLATFORM_ID "NetBSD" + +#elif defined(__OpenBSD__) || defined(__OPENBSD) +# define PLATFORM_ID "OpenBSD" + +#elif defined(__sun) || defined(sun) +# define PLATFORM_ID "SunOS" + +#elif defined(_AIX) || defined(__AIX) || defined(__AIX__) || defined(__aix) || defined(__aix__) +# define PLATFORM_ID "AIX" + +#elif defined(__hpux) || defined(__hpux__) +# define PLATFORM_ID "HP-UX" + +#elif defined(__HAIKU__) +# define PLATFORM_ID "Haiku" + +#elif defined(__BeOS) || defined(__BEOS__) || defined(_BEOS) +# define PLATFORM_ID "BeOS" + +#elif defined(__QNX__) || defined(__QNXNTO__) +# define PLATFORM_ID "QNX" + +#elif defined(__tru64) || defined(_tru64) || defined(__TRU64__) +# define PLATFORM_ID "Tru64" + +#elif defined(__riscos) || defined(__riscos__) +# define PLATFORM_ID "RISCos" + +#elif defined(__sinix) || defined(__sinix__) || defined(__SINIX__) +# define PLATFORM_ID "SINIX" + +#elif defined(__UNIX_SV__) +# define PLATFORM_ID "UNIX_SV" + +#elif defined(__bsdos__) +# define PLATFORM_ID "BSDOS" + +#elif defined(_MPRAS) || defined(MPRAS) +# define PLATFORM_ID "MP-RAS" + +#elif defined(__osf) || defined(__osf__) +# define PLATFORM_ID "OSF1" + +#elif defined(_SCO_SV) || defined(SCO_SV) || defined(sco_sv) +# define PLATFORM_ID "SCO_SV" + +#elif defined(__ultrix) || defined(__ultrix__) || defined(_ULTRIX) +# define PLATFORM_ID "ULTRIX" + +#elif defined(__XENIX__) || defined(_XENIX) || defined(XENIX) +# define PLATFORM_ID "Xenix" + +#elif defined(__WATCOMC__) +# if defined(__LINUX__) +# define PLATFORM_ID "Linux" + +# elif defined(__DOS__) +# define PLATFORM_ID "DOS" + +# elif defined(__OS2__) +# define PLATFORM_ID "OS2" + +# elif defined(__WINDOWS__) +# define PLATFORM_ID "Windows3x" + +# elif defined(__VXWORKS__) +# define PLATFORM_ID "VxWorks" + +# else /* unknown platform */ +# define PLATFORM_ID +# endif + +#elif defined(__INTEGRITY) +# if defined(INT_178B) +# define PLATFORM_ID "Integrity178" + +# else /* regular Integrity */ +# define PLATFORM_ID "Integrity" +# endif + +# elif defined(_ADI_COMPILER) +# define PLATFORM_ID "ADSP" + +#else /* unknown platform */ +# define PLATFORM_ID + +#endif + +/* For windows compilers MSVC and Intel we can determine + the architecture of the compiler being used. This is because + the compilers do not have flags that can change the architecture, + but rather depend on which compiler is being used +*/ +#if defined(_WIN32) && defined(_MSC_VER) +# if defined(_M_IA64) +# define ARCHITECTURE_ID "IA64" + +# elif defined(_M_ARM64EC) +# define ARCHITECTURE_ID "ARM64EC" + +# elif defined(_M_X64) || defined(_M_AMD64) +# define ARCHITECTURE_ID "x64" + +# elif defined(_M_IX86) +# define ARCHITECTURE_ID "X86" + +# elif defined(_M_ARM64) +# define ARCHITECTURE_ID "ARM64" + +# elif defined(_M_ARM) +# if _M_ARM == 4 +# define ARCHITECTURE_ID "ARMV4I" +# elif _M_ARM == 5 +# define ARCHITECTURE_ID "ARMV5I" +# else +# define ARCHITECTURE_ID "ARMV" STRINGIFY(_M_ARM) +# endif + +# elif defined(_M_MIPS) +# define ARCHITECTURE_ID "MIPS" + +# elif defined(_M_SH) +# define ARCHITECTURE_ID "SHx" + +# else /* unknown architecture */ +# define ARCHITECTURE_ID "" +# endif + +#elif defined(__WATCOMC__) +# if defined(_M_I86) +# define ARCHITECTURE_ID "I86" + +# elif defined(_M_IX86) +# define ARCHITECTURE_ID "X86" + +# else /* unknown architecture */ +# define ARCHITECTURE_ID "" +# endif + +#elif defined(__IAR_SYSTEMS_ICC__) || defined(__IAR_SYSTEMS_ICC) +# if defined(__ICCARM__) +# define ARCHITECTURE_ID "ARM" + +# elif defined(__ICCRX__) +# define ARCHITECTURE_ID "RX" + +# elif defined(__ICCRH850__) +# define ARCHITECTURE_ID "RH850" + +# elif defined(__ICCRL78__) +# define ARCHITECTURE_ID "RL78" + +# elif defined(__ICCRISCV__) +# define ARCHITECTURE_ID "RISCV" + +# elif defined(__ICCAVR__) +# define ARCHITECTURE_ID "AVR" + +# elif defined(__ICC430__) +# define ARCHITECTURE_ID "MSP430" + +# elif defined(__ICCV850__) +# define ARCHITECTURE_ID "V850" + +# elif defined(__ICC8051__) +# define ARCHITECTURE_ID "8051" + +# elif defined(__ICCSTM8__) +# define ARCHITECTURE_ID "STM8" + +# else /* unknown architecture */ +# define ARCHITECTURE_ID "" +# endif + +#elif defined(__ghs__) +# if defined(__PPC64__) +# define ARCHITECTURE_ID "PPC64" + +# elif defined(__ppc__) +# define ARCHITECTURE_ID "PPC" + +# elif defined(__ARM__) +# define ARCHITECTURE_ID "ARM" + +# elif defined(__x86_64__) +# define ARCHITECTURE_ID "x64" + +# elif defined(__i386__) +# define ARCHITECTURE_ID "X86" + +# else /* unknown architecture */ +# define ARCHITECTURE_ID "" +# endif + +#elif defined(__clang__) && defined(__ti__) +# if defined(__ARM_ARCH) +# define ARCHITECTURE_ID "Arm" + +# else /* unknown architecture */ +# define ARCHITECTURE_ID "" +# endif + +#elif defined(__TI_COMPILER_VERSION__) +# if defined(__TI_ARM__) +# define ARCHITECTURE_ID "ARM" + +# elif defined(__MSP430__) +# define ARCHITECTURE_ID "MSP430" + +# elif defined(__TMS320C28XX__) +# define ARCHITECTURE_ID "TMS320C28x" + +# elif defined(__TMS320C6X__) || defined(_TMS320C6X) +# define ARCHITECTURE_ID "TMS320C6x" + +# else /* unknown architecture */ +# define ARCHITECTURE_ID "" +# endif + +# elif defined(__ADSPSHARC__) +# define ARCHITECTURE_ID "SHARC" + +# elif defined(__ADSPBLACKFIN__) +# define ARCHITECTURE_ID "Blackfin" + +#elif defined(__TASKING__) + +# if defined(__CTC__) || defined(__CPTC__) +# define ARCHITECTURE_ID "TriCore" + +# elif defined(__CMCS__) +# define ARCHITECTURE_ID "MCS" + +# elif defined(__CARM__) +# define ARCHITECTURE_ID "ARM" + +# elif defined(__CARC__) +# define ARCHITECTURE_ID "ARC" + +# elif defined(__C51__) +# define ARCHITECTURE_ID "8051" + +# elif defined(__CPCP__) +# define ARCHITECTURE_ID "PCP" + +# else +# define ARCHITECTURE_ID "" +# endif + +#else +# define ARCHITECTURE_ID +#endif + +/* Convert integer to decimal digit literals. */ +#define DEC(n) \ + ('0' + (((n) / 10000000)%10)), \ + ('0' + (((n) / 1000000)%10)), \ + ('0' + (((n) / 100000)%10)), \ + ('0' + (((n) / 10000)%10)), \ + ('0' + (((n) / 1000)%10)), \ + ('0' + (((n) / 100)%10)), \ + ('0' + (((n) / 10)%10)), \ + ('0' + ((n) % 10)) + +/* Convert integer to hex digit literals. */ +#define HEX(n) \ + ('0' + ((n)>>28 & 0xF)), \ + ('0' + ((n)>>24 & 0xF)), \ + ('0' + ((n)>>20 & 0xF)), \ + ('0' + ((n)>>16 & 0xF)), \ + ('0' + ((n)>>12 & 0xF)), \ + ('0' + ((n)>>8 & 0xF)), \ + ('0' + ((n)>>4 & 0xF)), \ + ('0' + ((n) & 0xF)) + +/* Construct a string literal encoding the version number. */ +#ifdef COMPILER_VERSION +char const* info_version = "INFO" ":" "compiler_version[" COMPILER_VERSION "]"; + +/* Construct a string literal encoding the version number components. */ +#elif defined(COMPILER_VERSION_MAJOR) +char const info_version[] = { + 'I', 'N', 'F', 'O', ':', + 'c','o','m','p','i','l','e','r','_','v','e','r','s','i','o','n','[', + COMPILER_VERSION_MAJOR, +# ifdef COMPILER_VERSION_MINOR + '.', COMPILER_VERSION_MINOR, +# ifdef COMPILER_VERSION_PATCH + '.', COMPILER_VERSION_PATCH, +# ifdef COMPILER_VERSION_TWEAK + '.', COMPILER_VERSION_TWEAK, +# endif +# endif +# endif + ']','\0'}; +#endif + +/* Construct a string literal encoding the internal version number. */ +#ifdef COMPILER_VERSION_INTERNAL +char const info_version_internal[] = { + 'I', 'N', 'F', 'O', ':', + 'c','o','m','p','i','l','e','r','_','v','e','r','s','i','o','n','_', + 'i','n','t','e','r','n','a','l','[', + COMPILER_VERSION_INTERNAL,']','\0'}; +#elif defined(COMPILER_VERSION_INTERNAL_STR) +char const* info_version_internal = "INFO" ":" "compiler_version_internal[" COMPILER_VERSION_INTERNAL_STR "]"; +#endif + +/* Construct a string literal encoding the version number components. */ +#ifdef SIMULATE_VERSION_MAJOR +char const info_simulate_version[] = { + 'I', 'N', 'F', 'O', ':', + 's','i','m','u','l','a','t','e','_','v','e','r','s','i','o','n','[', + SIMULATE_VERSION_MAJOR, +# ifdef SIMULATE_VERSION_MINOR + '.', SIMULATE_VERSION_MINOR, +# ifdef SIMULATE_VERSION_PATCH + '.', SIMULATE_VERSION_PATCH, +# ifdef SIMULATE_VERSION_TWEAK + '.', SIMULATE_VERSION_TWEAK, +# endif +# endif +# endif + ']','\0'}; +#endif + +/* Construct the string literal in pieces to prevent the source from + getting matched. Store it in a pointer rather than an array + because some compilers will just produce instructions to fill the + array rather than assigning a pointer to a static array. */ +char const* info_platform = "INFO" ":" "platform[" PLATFORM_ID "]"; +char const* info_arch = "INFO" ":" "arch[" ARCHITECTURE_ID "]"; + + + +#define CXX_STD_98 199711L +#define CXX_STD_11 201103L +#define CXX_STD_14 201402L +#define CXX_STD_17 201703L +#define CXX_STD_20 202002L +#define CXX_STD_23 202302L + +#if defined(__INTEL_COMPILER) && defined(_MSVC_LANG) +# if _MSVC_LANG > CXX_STD_17 +# define CXX_STD _MSVC_LANG +# elif _MSVC_LANG == CXX_STD_17 && defined(__cpp_aggregate_paren_init) +# define CXX_STD CXX_STD_20 +# elif _MSVC_LANG > CXX_STD_14 && __cplusplus > CXX_STD_17 +# define CXX_STD CXX_STD_20 +# elif _MSVC_LANG > CXX_STD_14 +# define CXX_STD CXX_STD_17 +# elif defined(__INTEL_CXX11_MODE__) && defined(__cpp_aggregate_nsdmi) +# define CXX_STD CXX_STD_14 +# elif defined(__INTEL_CXX11_MODE__) +# define CXX_STD CXX_STD_11 +# else +# define CXX_STD CXX_STD_98 +# endif +#elif defined(_MSC_VER) && defined(_MSVC_LANG) +# if _MSVC_LANG > __cplusplus +# define CXX_STD _MSVC_LANG +# else +# define CXX_STD __cplusplus +# endif +#elif defined(__NVCOMPILER) +# if __cplusplus == CXX_STD_17 && defined(__cpp_aggregate_paren_init) +# define CXX_STD CXX_STD_20 +# else +# define CXX_STD __cplusplus +# endif +#elif defined(__INTEL_COMPILER) || defined(__PGI) +# if __cplusplus == CXX_STD_11 && defined(__cpp_namespace_attributes) +# define CXX_STD CXX_STD_17 +# elif __cplusplus == CXX_STD_11 && defined(__cpp_aggregate_nsdmi) +# define CXX_STD CXX_STD_14 +# else +# define CXX_STD __cplusplus +# endif +#elif (defined(__IBMCPP__) || defined(__ibmxl__)) && defined(__linux__) +# if __cplusplus == CXX_STD_11 && defined(__cpp_aggregate_nsdmi) +# define CXX_STD CXX_STD_14 +# else +# define CXX_STD __cplusplus +# endif +#elif __cplusplus == 1 && defined(__GXX_EXPERIMENTAL_CXX0X__) +# define CXX_STD CXX_STD_11 +#else +# define CXX_STD __cplusplus +#endif + +const char* info_language_standard_default = "INFO" ":" "standard_default[" +#if CXX_STD > CXX_STD_23 + "26" +#elif CXX_STD > CXX_STD_20 + "23" +#elif CXX_STD > CXX_STD_17 + "20" +#elif CXX_STD > CXX_STD_14 + "17" +#elif CXX_STD > CXX_STD_11 + "14" +#elif CXX_STD >= CXX_STD_11 + "11" +#else + "98" +#endif +"]"; + +const char* info_language_extensions_default = "INFO" ":" "extensions_default[" +#if (defined(__clang__) || defined(__GNUC__) || defined(__xlC__) || \ + defined(__TI_COMPILER_VERSION__)) && \ + !defined(__STRICT_ANSI__) + "ON" +#else + "OFF" +#endif +"]"; + +/*--------------------------------------------------------------------------*/ + +int main(int argc, char* argv[]) +{ + int require = 0; + require += info_compiler[argc]; + require += info_platform[argc]; + require += info_arch[argc]; +#ifdef COMPILER_VERSION_MAJOR + require += info_version[argc]; +#endif +#ifdef COMPILER_VERSION_INTERNAL + require += info_version_internal[argc]; +#endif +#ifdef SIMULATE_ID + require += info_simulate[argc]; +#endif +#ifdef SIMULATE_VERSION_MAJOR + require += info_simulate_version[argc]; +#endif +#if defined(__CRAYXT_COMPUTE_LINUX_TARGET) + require += info_cray[argc]; +#endif + require += info_language_standard_default[argc]; + require += info_language_extensions_default[argc]; + (void)argv; + return require; +} diff --git a/siro_rider/android/app/.cxx/RelWithDebInfo/6t1m4b5v/arm64-v8a/CMakeFiles/3.31.5-g6cf5163/CompilerIdCXX/CMakeCXXCompilerId.o b/siro_rider/android/app/.cxx/RelWithDebInfo/6t1m4b5v/arm64-v8a/CMakeFiles/3.31.5-g6cf5163/CompilerIdCXX/CMakeCXXCompilerId.o new file mode 100644 index 0000000..5bce2c1 Binary files /dev/null and b/siro_rider/android/app/.cxx/RelWithDebInfo/6t1m4b5v/arm64-v8a/CMakeFiles/3.31.5-g6cf5163/CompilerIdCXX/CMakeCXXCompilerId.o differ diff --git a/siro_rider/android/app/.cxx/RelWithDebInfo/6t1m4b5v/arm64-v8a/CMakeFiles/CMakeConfigureLog.yaml b/siro_rider/android/app/.cxx/RelWithDebInfo/6t1m4b5v/arm64-v8a/CMakeFiles/CMakeConfigureLog.yaml new file mode 100644 index 0000000..e8bd976 --- /dev/null +++ b/siro_rider/android/app/.cxx/RelWithDebInfo/6t1m4b5v/arm64-v8a/CMakeFiles/CMakeConfigureLog.yaml @@ -0,0 +1,405 @@ + +--- +events: + - + kind: "message-v1" + backtrace: + - "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeDetermineSystem.cmake:200 (message)" + - "CMakeLists.txt:2 (project)" + message: | + The target system is: Android - 1 - aarch64 + The host system is: Darwin - 24.5.0 - arm64 + - + kind: "message-v1" + backtrace: + - "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeDetermineCompilerId.cmake:17 (message)" + - "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeDetermineCompilerId.cmake:64 (__determine_compiler_id_test)" + - "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeDetermineCCompiler.cmake:123 (CMAKE_DETERMINE_COMPILER_ID)" + - "CMakeLists.txt:2 (project)" + message: | + Compiling the C compiler identification source file "CMakeCCompilerId.c" succeeded. + Compiler: /Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/bin/clang + Build flags: -g;-DANDROID;-fdata-sections;-ffunction-sections;-funwind-tables;-fstack-protector-strong;-no-canonical-prefixes;-D_FORTIFY_SOURCE=2;-Wformat;-Werror=format-security + Id flags: -c;--target=aarch64-none-linux-android23 + + The output was: + 0 + + + Compilation of the C compiler identification source "CMakeCCompilerId.c" produced "CMakeCCompilerId.o" + + The C compiler identification is Clang, found in: + /Users/hamzaaleghwairyeen/development/App/Intaleq/android/app/.cxx/RelWithDebInfo/6t1m4b5v/arm64-v8a/CMakeFiles/3.31.5-g6cf5163/CompilerIdC/CMakeCCompilerId.o + + - + kind: "message-v1" + backtrace: + - "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeDetermineCompilerId.cmake:17 (message)" + - "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeDetermineCompilerId.cmake:64 (__determine_compiler_id_test)" + - "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeDetermineCXXCompiler.cmake:126 (CMAKE_DETERMINE_COMPILER_ID)" + - "CMakeLists.txt:2 (project)" + message: | + Compiling the CXX compiler identification source file "CMakeCXXCompilerId.cpp" succeeded. + Compiler: /Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/bin/clang++ + Build flags: -g;-DANDROID;-fdata-sections;-ffunction-sections;-funwind-tables;-fstack-protector-strong;-no-canonical-prefixes;-D_FORTIFY_SOURCE=2;-Wformat;-Werror=format-security + Id flags: -c;--target=aarch64-none-linux-android23 + + The output was: + 0 + + + Compilation of the CXX compiler identification source "CMakeCXXCompilerId.cpp" produced "CMakeCXXCompilerId.o" + + The CXX compiler identification is Clang, found in: + /Users/hamzaaleghwairyeen/development/App/Intaleq/android/app/.cxx/RelWithDebInfo/6t1m4b5v/arm64-v8a/CMakeFiles/3.31.5-g6cf5163/CompilerIdCXX/CMakeCXXCompilerId.o + + - + kind: "try_compile-v1" + backtrace: + - "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeDetermineCompilerABI.cmake:74 (try_compile)" + - "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeTestCCompiler.cmake:26 (CMAKE_DETERMINE_COMPILER_ABI)" + - "CMakeLists.txt:2 (project)" + checks: + - "Detecting C compiler ABI info" + directories: + source: "/Users/hamzaaleghwairyeen/development/App/Intaleq/android/app/.cxx/RelWithDebInfo/6t1m4b5v/arm64-v8a/CMakeFiles/CMakeScratch/TryCompile-Vkat2v" + binary: "/Users/hamzaaleghwairyeen/development/App/Intaleq/android/app/.cxx/RelWithDebInfo/6t1m4b5v/arm64-v8a/CMakeFiles/CMakeScratch/TryCompile-Vkat2v" + cmakeVariables: + ANDROID_ABI: "arm64-v8a" + ANDROID_ARM_MODE: "thumb" + ANDROID_PIE: "TRUE" + ANDROID_PLATFORM: "android-23" + ANDROID_STL: "c++_static" + ANDROID_TOOLCHAIN: "clang" + CMAKE_CXX_COMPILER_CLANG_SCAN_DEPS: "/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/bin/clang-scan-deps" + CMAKE_CXX_COMPILER_TARGET: "aarch64-none-linux-android23" + CMAKE_C_COMPILER_TARGET: "aarch64-none-linux-android23" + CMAKE_C_FLAGS: "-g -DANDROID -fdata-sections -ffunction-sections -funwind-tables -fstack-protector-strong -no-canonical-prefixes -D_FORTIFY_SOURCE=2 -Wformat " + CMAKE_C_FLAGS_DEBUG: "-fno-limit-debug-info " + CMAKE_EXE_LINKER_FLAGS: "-static-libstdc++ -Wl,--build-id=sha1 -Wl,--no-rosegment -Wl,--no-undefined-version -Wl,--fatal-warnings -Wl,--no-undefined -Qunused-arguments " + CMAKE_POSITION_INDEPENDENT_CODE: "TRUE" + CMAKE_SYSROOT: "/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot" + buildResult: + variable: "CMAKE_C_ABI_COMPILED" + cached: true + stdout: | + Change Dir: '/Users/hamzaaleghwairyeen/development/App/Intaleq/android/app/.cxx/RelWithDebInfo/6t1m4b5v/arm64-v8a/CMakeFiles/CMakeScratch/TryCompile-Vkat2v' + + Run Build Command(s): /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/bin/ninja -v cmTC_ab1da + [1/2] /Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/bin/clang --target=aarch64-none-linux-android23 --sysroot=/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot -g -DANDROID -fdata-sections -ffunction-sections -funwind-tables -fstack-protector-strong -no-canonical-prefixes -D_FORTIFY_SOURCE=2 -Wformat -fPIE -v -MD -MT CMakeFiles/cmTC_ab1da.dir/CMakeCCompilerABI.c.o -MF CMakeFiles/cmTC_ab1da.dir/CMakeCCompilerABI.c.o.d -o CMakeFiles/cmTC_ab1da.dir/CMakeCCompilerABI.c.o -c /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeCCompilerABI.c + Android (12027248, +pgo, -bolt, +lto, -mlgo, based on r522817) clang version 18.0.1 (https://android.googlesource.com/toolchain/llvm-project d8003a456d14a3deb8054cdaa529ffbf02d9b262) + Target: aarch64-none-linux-android23 + Thread model: posix + InstalledDir: /Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/bin + (in-process) + "/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/bin/clang" -cc1 -triple aarch64-none-linux-android23 -emit-obj -mrelax-all -disable-free -clear-ast-before-backend -disable-llvm-verifier -discard-value-names -main-file-name CMakeCCompilerABI.c -mrelocation-model pic -pic-level 2 -pic-is-pie -mframe-pointer=non-leaf -ffp-contract=on -fno-rounding-math -mconstructor-aliases -funwind-tables=2 -target-cpu generic -target-feature +neon -target-feature +v8a -target-feature +fix-cortex-a53-835769 -target-abi aapcs -debug-info-kind=constructor -dwarf-version=4 -debugger-tuning=gdb -fdebug-compilation-dir=/Users/hamzaaleghwairyeen/development/App/Intaleq/android/app/.cxx/RelWithDebInfo/6t1m4b5v/arm64-v8a/CMakeFiles/CMakeScratch/TryCompile-Vkat2v -v -ffunction-sections -fdata-sections -fcoverage-compilation-dir=/Users/hamzaaleghwairyeen/development/App/Intaleq/android/app/.cxx/RelWithDebInfo/6t1m4b5v/arm64-v8a/CMakeFiles/CMakeScratch/TryCompile-Vkat2v -resource-dir /Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/lib/clang/18 -dependency-file CMakeFiles/cmTC_ab1da.dir/CMakeCCompilerABI.c.o.d -MT CMakeFiles/cmTC_ab1da.dir/CMakeCCompilerABI.c.o -sys-header-deps -D ANDROID -D _FORTIFY_SOURCE=2 -isysroot /Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot -internal-isystem /Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/lib/clang/18/include -internal-isystem /Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/local/include -internal-externc-isystem /Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/include/aarch64-linux-android -internal-externc-isystem /Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/include -internal-externc-isystem /Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/include -Wformat -ferror-limit 19 -femulated-tls -stack-protector 2 -fno-signed-char -fgnuc-version=4.2.1 -target-feature +outline-atomics -D__GCC_HAVE_DWARF2_CFI_ASM=1 -o CMakeFiles/cmTC_ab1da.dir/CMakeCCompilerABI.c.o -x c /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeCCompilerABI.c + clang -cc1 version 18.0.1 based upon LLVM 18.0.1 default target x86_64-apple-darwin24.5.0 + ignoring nonexistent directory "/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/local/include" + ignoring nonexistent directory "/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/include" + #include "..." search starts here: + #include <...> search starts here: + /Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/lib/clang/18/include + /Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/include/aarch64-linux-android + /Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/include + End of search list. + [2/2] : && /Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/bin/clang --target=aarch64-none-linux-android23 --sysroot=/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot -g -DANDROID -fdata-sections -ffunction-sections -funwind-tables -fstack-protector-strong -no-canonical-prefixes -D_FORTIFY_SOURCE=2 -Wformat -static-libstdc++ -Wl,--build-id=sha1 -Wl,--no-rosegment -Wl,--no-undefined-version -Wl,--fatal-warnings -Wl,--no-undefined -Qunused-arguments -v CMakeFiles/cmTC_ab1da.dir/CMakeCCompilerABI.c.o -o cmTC_ab1da && : + Android (12027248, +pgo, -bolt, +lto, -mlgo, based on r522817) clang version 18.0.1 (https://android.googlesource.com/toolchain/llvm-project d8003a456d14a3deb8054cdaa529ffbf02d9b262) + Target: aarch64-none-linux-android23 + Thread model: posix + InstalledDir: /Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/bin + "/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/bin/ld.lld" --sysroot=/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot -EL --fix-cortex-a53-843419 -z now -z relro -z max-page-size=4096 --hash-style=gnu --eh-frame-hdr -m aarch64linux -pie -dynamic-linker /system/bin/linker64 -o cmTC_ab1da /Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/lib/aarch64-linux-android/23/crtbegin_dynamic.o -L/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/lib/clang/18/lib/linux/aarch64 -L/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/lib/aarch64-linux-android/23 -L/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/lib/aarch64-linux-android -L/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/lib --build-id=sha1 --no-rosegment --no-undefined-version --fatal-warnings --no-undefined CMakeFiles/cmTC_ab1da.dir/CMakeCCompilerABI.c.o /Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/lib/clang/18/lib/linux/libclang_rt.builtins-aarch64-android.a -l:libunwind.a -ldl -lc /Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/lib/clang/18/lib/linux/libclang_rt.builtins-aarch64-android.a -l:libunwind.a -ldl /Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/lib/aarch64-linux-android/23/crtend_android.o + + exitCode: 0 + - + kind: "message-v1" + backtrace: + - "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeDetermineCompilerABI.cmake:182 (message)" + - "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeTestCCompiler.cmake:26 (CMAKE_DETERMINE_COMPILER_ABI)" + - "CMakeLists.txt:2 (project)" + message: | + Parsed C implicit include dir info: rv=done + found start of include info + found start of implicit include info + add: [/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/lib/clang/18/include] + add: [/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/include/aarch64-linux-android] + add: [/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/include] + end of search list found + collapse include dir [/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/lib/clang/18/include] ==> [/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/lib/clang/18/include] + collapse include dir [/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/include/aarch64-linux-android] ==> [/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/include/aarch64-linux-android] + collapse include dir [/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/include] ==> [/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/include] + implicit include dirs: [/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/lib/clang/18/include;/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/include/aarch64-linux-android;/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/include] + + + - + kind: "message-v1" + backtrace: + - "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeDetermineCompilerABI.cmake:218 (message)" + - "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeTestCCompiler.cmake:26 (CMAKE_DETERMINE_COMPILER_ABI)" + - "CMakeLists.txt:2 (project)" + message: | + Parsed C implicit link information: + link line regex: [^( *|.*[/\\])(ld[0-9]*(\\.[a-z]+)?|CMAKE_LINK_STARTFILE-NOTFOUND|([^/\\]+-)?ld|collect2)[^/\\]*( |$)] + linker tool regex: [^[ ]*(->|")?[ ]*(([^"]*[/\\])?(ld[0-9]*(\\.[a-z]+)?))("|,| |$)] + ignore line: [Change Dir: '/Users/hamzaaleghwairyeen/development/App/Intaleq/android/app/.cxx/RelWithDebInfo/6t1m4b5v/arm64-v8a/CMakeFiles/CMakeScratch/TryCompile-Vkat2v'] + ignore line: [] + ignore line: [Run Build Command(s): /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/bin/ninja -v cmTC_ab1da] + ignore line: [[1/2] /Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/bin/clang --target=aarch64-none-linux-android23 --sysroot=/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot -g -DANDROID -fdata-sections -ffunction-sections -funwind-tables -fstack-protector-strong -no-canonical-prefixes -D_FORTIFY_SOURCE=2 -Wformat -fPIE -v -MD -MT CMakeFiles/cmTC_ab1da.dir/CMakeCCompilerABI.c.o -MF CMakeFiles/cmTC_ab1da.dir/CMakeCCompilerABI.c.o.d -o CMakeFiles/cmTC_ab1da.dir/CMakeCCompilerABI.c.o -c /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeCCompilerABI.c] + ignore line: [Android (12027248 +pgo -bolt +lto -mlgo based on r522817) clang version 18.0.1 (https://android.googlesource.com/toolchain/llvm-project d8003a456d14a3deb8054cdaa529ffbf02d9b262)] + ignore line: [Target: aarch64-none-linux-android23] + ignore line: [Thread model: posix] + ignore line: [InstalledDir: /Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/bin] + ignore line: [ (in-process)] + ignore line: [ "/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/bin/clang" -cc1 -triple aarch64-none-linux-android23 -emit-obj -mrelax-all -disable-free -clear-ast-before-backend -disable-llvm-verifier -discard-value-names -main-file-name CMakeCCompilerABI.c -mrelocation-model pic -pic-level 2 -pic-is-pie -mframe-pointer=non-leaf -ffp-contract=on -fno-rounding-math -mconstructor-aliases -funwind-tables=2 -target-cpu generic -target-feature +neon -target-feature +v8a -target-feature +fix-cortex-a53-835769 -target-abi aapcs -debug-info-kind=constructor -dwarf-version=4 -debugger-tuning=gdb -fdebug-compilation-dir=/Users/hamzaaleghwairyeen/development/App/Intaleq/android/app/.cxx/RelWithDebInfo/6t1m4b5v/arm64-v8a/CMakeFiles/CMakeScratch/TryCompile-Vkat2v -v -ffunction-sections -fdata-sections -fcoverage-compilation-dir=/Users/hamzaaleghwairyeen/development/App/Intaleq/android/app/.cxx/RelWithDebInfo/6t1m4b5v/arm64-v8a/CMakeFiles/CMakeScratch/TryCompile-Vkat2v -resource-dir /Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/lib/clang/18 -dependency-file CMakeFiles/cmTC_ab1da.dir/CMakeCCompilerABI.c.o.d -MT CMakeFiles/cmTC_ab1da.dir/CMakeCCompilerABI.c.o -sys-header-deps -D ANDROID -D _FORTIFY_SOURCE=2 -isysroot /Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot -internal-isystem /Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/lib/clang/18/include -internal-isystem /Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/local/include -internal-externc-isystem /Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/include/aarch64-linux-android -internal-externc-isystem /Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/include -internal-externc-isystem /Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/include -Wformat -ferror-limit 19 -femulated-tls -stack-protector 2 -fno-signed-char -fgnuc-version=4.2.1 -target-feature +outline-atomics -D__GCC_HAVE_DWARF2_CFI_ASM=1 -o CMakeFiles/cmTC_ab1da.dir/CMakeCCompilerABI.c.o -x c /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeCCompilerABI.c] + ignore line: [clang -cc1 version 18.0.1 based upon LLVM 18.0.1 default target x86_64-apple-darwin24.5.0] + ignore line: [ignoring nonexistent directory "/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/local/include"] + ignore line: [ignoring nonexistent directory "/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/include"] + ignore line: [#include "..." search starts here:] + ignore line: [#include <...> search starts here:] + ignore line: [ /Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/lib/clang/18/include] + ignore line: [ /Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/include/aarch64-linux-android] + ignore line: [ /Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/include] + ignore line: [End of search list.] + ignore line: [[2/2] : && /Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/bin/clang --target=aarch64-none-linux-android23 --sysroot=/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot -g -DANDROID -fdata-sections -ffunction-sections -funwind-tables -fstack-protector-strong -no-canonical-prefixes -D_FORTIFY_SOURCE=2 -Wformat -static-libstdc++ -Wl --build-id=sha1 -Wl --no-rosegment -Wl --no-undefined-version -Wl --fatal-warnings -Wl --no-undefined -Qunused-arguments -v CMakeFiles/cmTC_ab1da.dir/CMakeCCompilerABI.c.o -o cmTC_ab1da && :] + ignore line: [Android (12027248 +pgo -bolt +lto -mlgo based on r522817) clang version 18.0.1 (https://android.googlesource.com/toolchain/llvm-project d8003a456d14a3deb8054cdaa529ffbf02d9b262)] + ignore line: [Target: aarch64-none-linux-android23] + ignore line: [Thread model: posix] + ignore line: [InstalledDir: /Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/bin] + link line: [ "/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/bin/ld.lld" --sysroot=/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot -EL --fix-cortex-a53-843419 -z now -z relro -z max-page-size=4096 --hash-style=gnu --eh-frame-hdr -m aarch64linux -pie -dynamic-linker /system/bin/linker64 -o cmTC_ab1da /Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/lib/aarch64-linux-android/23/crtbegin_dynamic.o -L/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/lib/clang/18/lib/linux/aarch64 -L/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/lib/aarch64-linux-android/23 -L/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/lib/aarch64-linux-android -L/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/lib --build-id=sha1 --no-rosegment --no-undefined-version --fatal-warnings --no-undefined CMakeFiles/cmTC_ab1da.dir/CMakeCCompilerABI.c.o /Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/lib/clang/18/lib/linux/libclang_rt.builtins-aarch64-android.a -l:libunwind.a -ldl -lc /Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/lib/clang/18/lib/linux/libclang_rt.builtins-aarch64-android.a -l:libunwind.a -ldl /Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/lib/aarch64-linux-android/23/crtend_android.o] + arg [/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/bin/ld.lld] ==> ignore + arg [--sysroot=/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot] ==> ignore + arg [-EL] ==> ignore + arg [--fix-cortex-a53-843419] ==> ignore + arg [-znow] ==> ignore + arg [-zrelro] ==> ignore + arg [-zmax-page-size=4096] ==> ignore + arg [--hash-style=gnu] ==> ignore + arg [--eh-frame-hdr] ==> ignore + arg [-m] ==> ignore + arg [aarch64linux] ==> ignore + arg [-pie] ==> ignore + arg [-dynamic-linker] ==> ignore + arg [/system/bin/linker64] ==> ignore + arg [-o] ==> ignore + arg [cmTC_ab1da] ==> ignore + arg [/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/lib/aarch64-linux-android/23/crtbegin_dynamic.o] ==> obj [/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/lib/aarch64-linux-android/23/crtbegin_dynamic.o] + arg [-L/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/lib/clang/18/lib/linux/aarch64] ==> dir [/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/lib/clang/18/lib/linux/aarch64] + arg [-L/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/lib/aarch64-linux-android/23] ==> dir [/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/lib/aarch64-linux-android/23] + arg [-L/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/lib/aarch64-linux-android] ==> dir [/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/lib/aarch64-linux-android] + arg [-L/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/lib] ==> dir [/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/lib] + arg [--build-id=sha1] ==> ignore + arg [--no-rosegment] ==> ignore + arg [--no-undefined-version] ==> ignore + arg [--fatal-warnings] ==> ignore + arg [--no-undefined] ==> ignore + arg [CMakeFiles/cmTC_ab1da.dir/CMakeCCompilerABI.c.o] ==> ignore + arg [/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/lib/clang/18/lib/linux/libclang_rt.builtins-aarch64-android.a] ==> lib [/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/lib/clang/18/lib/linux/libclang_rt.builtins-aarch64-android.a] + arg [-l:libunwind.a] ==> lib [-l:libunwind.a] + arg [-ldl] ==> lib [dl] + arg [-lc] ==> lib [c] + arg [/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/lib/clang/18/lib/linux/libclang_rt.builtins-aarch64-android.a] ==> lib [/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/lib/clang/18/lib/linux/libclang_rt.builtins-aarch64-android.a] + arg [-l:libunwind.a] ==> lib [-l:libunwind.a] + arg [-ldl] ==> lib [dl] + arg [/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/lib/aarch64-linux-android/23/crtend_android.o] ==> obj [/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/lib/aarch64-linux-android/23/crtend_android.o] + linker tool for 'C': /Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/bin/ld.lld + remove lib [/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/lib/clang/18/lib/linux/libclang_rt.builtins-aarch64-android.a] + remove lib [/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/lib/clang/18/lib/linux/libclang_rt.builtins-aarch64-android.a] + collapse library dir [/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/lib/clang/18/lib/linux/aarch64] ==> [/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/lib/clang/18/lib/linux/aarch64] + collapse library dir [/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/lib/aarch64-linux-android/23] ==> [/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/lib/aarch64-linux-android/23] + collapse library dir [/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/lib/aarch64-linux-android] ==> [/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/lib/aarch64-linux-android] + collapse library dir [/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/lib] ==> [/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/lib] + implicit libs: [-l:libunwind.a;dl;c;-l:libunwind.a;dl] + implicit objs: [/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/lib/aarch64-linux-android/23/crtbegin_dynamic.o;/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/lib/aarch64-linux-android/23/crtend_android.o] + implicit dirs: [/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/lib/clang/18/lib/linux/aarch64;/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/lib/aarch64-linux-android/23;/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/lib/aarch64-linux-android;/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/lib] + implicit fwks: [] + + + - + kind: "message-v1" + backtrace: + - "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Internal/CMakeDetermineLinkerId.cmake:40 (message)" + - "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeDetermineCompilerABI.cmake:255 (cmake_determine_linker_id)" + - "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeTestCCompiler.cmake:26 (CMAKE_DETERMINE_COMPILER_ABI)" + - "CMakeLists.txt:2 (project)" + message: | + Running the C compiler's linker: "/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/bin/ld.lld" "-v" + LLD 18.0.1 (compatible with GNU linkers) + - + kind: "try_compile-v1" + backtrace: + - "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeDetermineCompilerABI.cmake:74 (try_compile)" + - "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeTestCXXCompiler.cmake:26 (CMAKE_DETERMINE_COMPILER_ABI)" + - "CMakeLists.txt:2 (project)" + checks: + - "Detecting CXX compiler ABI info" + directories: + source: "/Users/hamzaaleghwairyeen/development/App/Intaleq/android/app/.cxx/RelWithDebInfo/6t1m4b5v/arm64-v8a/CMakeFiles/CMakeScratch/TryCompile-f8Fqtm" + binary: "/Users/hamzaaleghwairyeen/development/App/Intaleq/android/app/.cxx/RelWithDebInfo/6t1m4b5v/arm64-v8a/CMakeFiles/CMakeScratch/TryCompile-f8Fqtm" + cmakeVariables: + ANDROID_ABI: "arm64-v8a" + ANDROID_ARM_MODE: "thumb" + ANDROID_PIE: "TRUE" + ANDROID_PLATFORM: "android-23" + ANDROID_STL: "c++_static" + ANDROID_TOOLCHAIN: "clang" + CMAKE_CXX_COMPILER_CLANG_SCAN_DEPS: "/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/bin/clang-scan-deps" + CMAKE_CXX_COMPILER_TARGET: "aarch64-none-linux-android23" + CMAKE_CXX_FLAGS: "-g -DANDROID -fdata-sections -ffunction-sections -funwind-tables -fstack-protector-strong -no-canonical-prefixes -D_FORTIFY_SOURCE=2 -Wformat " + CMAKE_CXX_FLAGS_DEBUG: "-fno-limit-debug-info " + CMAKE_CXX_SCAN_FOR_MODULES: "OFF" + CMAKE_C_COMPILER_TARGET: "aarch64-none-linux-android23" + CMAKE_EXE_LINKER_FLAGS: "-static-libstdc++ -Wl,--build-id=sha1 -Wl,--no-rosegment -Wl,--no-undefined-version -Wl,--fatal-warnings -Wl,--no-undefined -Qunused-arguments " + CMAKE_POSITION_INDEPENDENT_CODE: "TRUE" + CMAKE_SYSROOT: "/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot" + buildResult: + variable: "CMAKE_CXX_ABI_COMPILED" + cached: true + stdout: | + Change Dir: '/Users/hamzaaleghwairyeen/development/App/Intaleq/android/app/.cxx/RelWithDebInfo/6t1m4b5v/arm64-v8a/CMakeFiles/CMakeScratch/TryCompile-f8Fqtm' + + Run Build Command(s): /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/bin/ninja -v cmTC_3ecff + [1/2] /Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/bin/clang++ --target=aarch64-none-linux-android23 --sysroot=/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot -g -DANDROID -fdata-sections -ffunction-sections -funwind-tables -fstack-protector-strong -no-canonical-prefixes -D_FORTIFY_SOURCE=2 -Wformat -fPIE -v -MD -MT CMakeFiles/cmTC_3ecff.dir/CMakeCXXCompilerABI.cpp.o -MF CMakeFiles/cmTC_3ecff.dir/CMakeCXXCompilerABI.cpp.o.d -o CMakeFiles/cmTC_3ecff.dir/CMakeCXXCompilerABI.cpp.o -c /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeCXXCompilerABI.cpp + Android (12027248, +pgo, -bolt, +lto, -mlgo, based on r522817) clang version 18.0.1 (https://android.googlesource.com/toolchain/llvm-project d8003a456d14a3deb8054cdaa529ffbf02d9b262) + Target: aarch64-none-linux-android23 + Thread model: posix + InstalledDir: /Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/bin + (in-process) + "/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/bin/clang++" -cc1 -triple aarch64-none-linux-android23 -emit-obj -mrelax-all -disable-free -clear-ast-before-backend -disable-llvm-verifier -discard-value-names -main-file-name CMakeCXXCompilerABI.cpp -mrelocation-model pic -pic-level 2 -pic-is-pie -mframe-pointer=non-leaf -ffp-contract=on -fno-rounding-math -mconstructor-aliases -funwind-tables=2 -target-cpu generic -target-feature +neon -target-feature +v8a -target-feature +fix-cortex-a53-835769 -target-abi aapcs -debug-info-kind=constructor -dwarf-version=4 -debugger-tuning=gdb -fdebug-compilation-dir=/Users/hamzaaleghwairyeen/development/App/Intaleq/android/app/.cxx/RelWithDebInfo/6t1m4b5v/arm64-v8a/CMakeFiles/CMakeScratch/TryCompile-f8Fqtm -v -ffunction-sections -fdata-sections -fcoverage-compilation-dir=/Users/hamzaaleghwairyeen/development/App/Intaleq/android/app/.cxx/RelWithDebInfo/6t1m4b5v/arm64-v8a/CMakeFiles/CMakeScratch/TryCompile-f8Fqtm -resource-dir /Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/lib/clang/18 -dependency-file CMakeFiles/cmTC_3ecff.dir/CMakeCXXCompilerABI.cpp.o.d -MT CMakeFiles/cmTC_3ecff.dir/CMakeCXXCompilerABI.cpp.o -sys-header-deps -D ANDROID -D _FORTIFY_SOURCE=2 -isysroot /Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot -internal-isystem /Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/include/c++/v1 -internal-isystem /Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/lib/clang/18/include -internal-isystem /Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/local/include -internal-externc-isystem /Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/include/aarch64-linux-android -internal-externc-isystem /Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/include -internal-externc-isystem /Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/include -Wformat -fdeprecated-macro -ferror-limit 19 -femulated-tls -stack-protector 2 -fno-signed-char -fgnuc-version=4.2.1 -fcxx-exceptions -fexceptions -target-feature +outline-atomics -D__GCC_HAVE_DWARF2_CFI_ASM=1 -o CMakeFiles/cmTC_3ecff.dir/CMakeCXXCompilerABI.cpp.o -x c++ /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeCXXCompilerABI.cpp + clang -cc1 version 18.0.1 based upon LLVM 18.0.1 default target x86_64-apple-darwin24.5.0 + ignoring nonexistent directory "/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/local/include" + ignoring nonexistent directory "/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/include" + #include "..." search starts here: + #include <...> search starts here: + /Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/include/c++/v1 + /Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/lib/clang/18/include + /Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/include/aarch64-linux-android + /Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/include + End of search list. + [2/2] : && /Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/bin/clang++ --target=aarch64-none-linux-android23 --sysroot=/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot -g -DANDROID -fdata-sections -ffunction-sections -funwind-tables -fstack-protector-strong -no-canonical-prefixes -D_FORTIFY_SOURCE=2 -Wformat -static-libstdc++ -Wl,--build-id=sha1 -Wl,--no-rosegment -Wl,--no-undefined-version -Wl,--fatal-warnings -Wl,--no-undefined -Qunused-arguments -v CMakeFiles/cmTC_3ecff.dir/CMakeCXXCompilerABI.cpp.o -o cmTC_3ecff && : + Android (12027248, +pgo, -bolt, +lto, -mlgo, based on r522817) clang version 18.0.1 (https://android.googlesource.com/toolchain/llvm-project d8003a456d14a3deb8054cdaa529ffbf02d9b262) + Target: aarch64-none-linux-android23 + Thread model: posix + InstalledDir: /Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/bin + "/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/bin/ld.lld" --sysroot=/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot -EL --fix-cortex-a53-843419 -z now -z relro -z max-page-size=4096 --hash-style=gnu --eh-frame-hdr -m aarch64linux -pie -dynamic-linker /system/bin/linker64 -o cmTC_3ecff /Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/lib/aarch64-linux-android/23/crtbegin_dynamic.o -L/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/lib/clang/18/lib/linux/aarch64 -L/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/lib/aarch64-linux-android/23 -L/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/lib/aarch64-linux-android -L/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/lib --build-id=sha1 --no-rosegment --no-undefined-version --fatal-warnings --no-undefined CMakeFiles/cmTC_3ecff.dir/CMakeCXXCompilerABI.cpp.o -Bstatic -lc++ -Bdynamic -lm /Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/lib/clang/18/lib/linux/libclang_rt.builtins-aarch64-android.a -l:libunwind.a -ldl -lc /Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/lib/clang/18/lib/linux/libclang_rt.builtins-aarch64-android.a -l:libunwind.a -ldl /Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/lib/aarch64-linux-android/23/crtend_android.o + + exitCode: 0 + - + kind: "message-v1" + backtrace: + - "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeDetermineCompilerABI.cmake:182 (message)" + - "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeTestCXXCompiler.cmake:26 (CMAKE_DETERMINE_COMPILER_ABI)" + - "CMakeLists.txt:2 (project)" + message: | + Parsed CXX implicit include dir info: rv=done + found start of include info + found start of implicit include info + add: [/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/include/c++/v1] + add: [/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/lib/clang/18/include] + add: [/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/include/aarch64-linux-android] + add: [/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/include] + end of search list found + collapse include dir [/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/include/c++/v1] ==> [/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/include/c++/v1] + collapse include dir [/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/lib/clang/18/include] ==> [/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/lib/clang/18/include] + collapse include dir [/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/include/aarch64-linux-android] ==> [/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/include/aarch64-linux-android] + collapse include dir [/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/include] ==> [/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/include] + implicit include dirs: [/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/include/c++/v1;/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/lib/clang/18/include;/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/include/aarch64-linux-android;/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/include] + + + - + kind: "message-v1" + backtrace: + - "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeDetermineCompilerABI.cmake:218 (message)" + - "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeTestCXXCompiler.cmake:26 (CMAKE_DETERMINE_COMPILER_ABI)" + - "CMakeLists.txt:2 (project)" + message: | + Parsed CXX implicit link information: + link line regex: [^( *|.*[/\\])(ld[0-9]*(\\.[a-z]+)?|CMAKE_LINK_STARTFILE-NOTFOUND|([^/\\]+-)?ld|collect2)[^/\\]*( |$)] + linker tool regex: [^[ ]*(->|")?[ ]*(([^"]*[/\\])?(ld[0-9]*(\\.[a-z]+)?))("|,| |$)] + ignore line: [Change Dir: '/Users/hamzaaleghwairyeen/development/App/Intaleq/android/app/.cxx/RelWithDebInfo/6t1m4b5v/arm64-v8a/CMakeFiles/CMakeScratch/TryCompile-f8Fqtm'] + ignore line: [] + ignore line: [Run Build Command(s): /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/bin/ninja -v cmTC_3ecff] + ignore line: [[1/2] /Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/bin/clang++ --target=aarch64-none-linux-android23 --sysroot=/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot -g -DANDROID -fdata-sections -ffunction-sections -funwind-tables -fstack-protector-strong -no-canonical-prefixes -D_FORTIFY_SOURCE=2 -Wformat -fPIE -v -MD -MT CMakeFiles/cmTC_3ecff.dir/CMakeCXXCompilerABI.cpp.o -MF CMakeFiles/cmTC_3ecff.dir/CMakeCXXCompilerABI.cpp.o.d -o CMakeFiles/cmTC_3ecff.dir/CMakeCXXCompilerABI.cpp.o -c /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeCXXCompilerABI.cpp] + ignore line: [Android (12027248 +pgo -bolt +lto -mlgo based on r522817) clang version 18.0.1 (https://android.googlesource.com/toolchain/llvm-project d8003a456d14a3deb8054cdaa529ffbf02d9b262)] + ignore line: [Target: aarch64-none-linux-android23] + ignore line: [Thread model: posix] + ignore line: [InstalledDir: /Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/bin] + ignore line: [ (in-process)] + ignore line: [ "/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/bin/clang++" -cc1 -triple aarch64-none-linux-android23 -emit-obj -mrelax-all -disable-free -clear-ast-before-backend -disable-llvm-verifier -discard-value-names -main-file-name CMakeCXXCompilerABI.cpp -mrelocation-model pic -pic-level 2 -pic-is-pie -mframe-pointer=non-leaf -ffp-contract=on -fno-rounding-math -mconstructor-aliases -funwind-tables=2 -target-cpu generic -target-feature +neon -target-feature +v8a -target-feature +fix-cortex-a53-835769 -target-abi aapcs -debug-info-kind=constructor -dwarf-version=4 -debugger-tuning=gdb -fdebug-compilation-dir=/Users/hamzaaleghwairyeen/development/App/Intaleq/android/app/.cxx/RelWithDebInfo/6t1m4b5v/arm64-v8a/CMakeFiles/CMakeScratch/TryCompile-f8Fqtm -v -ffunction-sections -fdata-sections -fcoverage-compilation-dir=/Users/hamzaaleghwairyeen/development/App/Intaleq/android/app/.cxx/RelWithDebInfo/6t1m4b5v/arm64-v8a/CMakeFiles/CMakeScratch/TryCompile-f8Fqtm -resource-dir /Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/lib/clang/18 -dependency-file CMakeFiles/cmTC_3ecff.dir/CMakeCXXCompilerABI.cpp.o.d -MT CMakeFiles/cmTC_3ecff.dir/CMakeCXXCompilerABI.cpp.o -sys-header-deps -D ANDROID -D _FORTIFY_SOURCE=2 -isysroot /Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot -internal-isystem /Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/include/c++/v1 -internal-isystem /Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/lib/clang/18/include -internal-isystem /Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/local/include -internal-externc-isystem /Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/include/aarch64-linux-android -internal-externc-isystem /Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/include -internal-externc-isystem /Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/include -Wformat -fdeprecated-macro -ferror-limit 19 -femulated-tls -stack-protector 2 -fno-signed-char -fgnuc-version=4.2.1 -fcxx-exceptions -fexceptions -target-feature +outline-atomics -D__GCC_HAVE_DWARF2_CFI_ASM=1 -o CMakeFiles/cmTC_3ecff.dir/CMakeCXXCompilerABI.cpp.o -x c++ /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeCXXCompilerABI.cpp] + ignore line: [clang -cc1 version 18.0.1 based upon LLVM 18.0.1 default target x86_64-apple-darwin24.5.0] + ignore line: [ignoring nonexistent directory "/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/local/include"] + ignore line: [ignoring nonexistent directory "/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/include"] + ignore line: [#include "..." search starts here:] + ignore line: [#include <...> search starts here:] + ignore line: [ /Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/include/c++/v1] + ignore line: [ /Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/lib/clang/18/include] + ignore line: [ /Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/include/aarch64-linux-android] + ignore line: [ /Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/include] + ignore line: [End of search list.] + ignore line: [[2/2] : && /Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/bin/clang++ --target=aarch64-none-linux-android23 --sysroot=/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot -g -DANDROID -fdata-sections -ffunction-sections -funwind-tables -fstack-protector-strong -no-canonical-prefixes -D_FORTIFY_SOURCE=2 -Wformat -static-libstdc++ -Wl --build-id=sha1 -Wl --no-rosegment -Wl --no-undefined-version -Wl --fatal-warnings -Wl --no-undefined -Qunused-arguments -v CMakeFiles/cmTC_3ecff.dir/CMakeCXXCompilerABI.cpp.o -o cmTC_3ecff && :] + ignore line: [Android (12027248 +pgo -bolt +lto -mlgo based on r522817) clang version 18.0.1 (https://android.googlesource.com/toolchain/llvm-project d8003a456d14a3deb8054cdaa529ffbf02d9b262)] + ignore line: [Target: aarch64-none-linux-android23] + ignore line: [Thread model: posix] + ignore line: [InstalledDir: /Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/bin] + link line: [ "/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/bin/ld.lld" --sysroot=/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot -EL --fix-cortex-a53-843419 -z now -z relro -z max-page-size=4096 --hash-style=gnu --eh-frame-hdr -m aarch64linux -pie -dynamic-linker /system/bin/linker64 -o cmTC_3ecff /Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/lib/aarch64-linux-android/23/crtbegin_dynamic.o -L/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/lib/clang/18/lib/linux/aarch64 -L/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/lib/aarch64-linux-android/23 -L/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/lib/aarch64-linux-android -L/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/lib --build-id=sha1 --no-rosegment --no-undefined-version --fatal-warnings --no-undefined CMakeFiles/cmTC_3ecff.dir/CMakeCXXCompilerABI.cpp.o -Bstatic -lc++ -Bdynamic -lm /Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/lib/clang/18/lib/linux/libclang_rt.builtins-aarch64-android.a -l:libunwind.a -ldl -lc /Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/lib/clang/18/lib/linux/libclang_rt.builtins-aarch64-android.a -l:libunwind.a -ldl /Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/lib/aarch64-linux-android/23/crtend_android.o] + arg [/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/bin/ld.lld] ==> ignore + arg [--sysroot=/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot] ==> ignore + arg [-EL] ==> ignore + arg [--fix-cortex-a53-843419] ==> ignore + arg [-znow] ==> ignore + arg [-zrelro] ==> ignore + arg [-zmax-page-size=4096] ==> ignore + arg [--hash-style=gnu] ==> ignore + arg [--eh-frame-hdr] ==> ignore + arg [-m] ==> ignore + arg [aarch64linux] ==> ignore + arg [-pie] ==> ignore + arg [-dynamic-linker] ==> ignore + arg [/system/bin/linker64] ==> ignore + arg [-o] ==> ignore + arg [cmTC_3ecff] ==> ignore + arg [/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/lib/aarch64-linux-android/23/crtbegin_dynamic.o] ==> obj [/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/lib/aarch64-linux-android/23/crtbegin_dynamic.o] + arg [-L/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/lib/clang/18/lib/linux/aarch64] ==> dir [/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/lib/clang/18/lib/linux/aarch64] + arg [-L/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/lib/aarch64-linux-android/23] ==> dir [/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/lib/aarch64-linux-android/23] + arg [-L/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/lib/aarch64-linux-android] ==> dir [/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/lib/aarch64-linux-android] + arg [-L/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/lib] ==> dir [/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/lib] + arg [--build-id=sha1] ==> ignore + arg [--no-rosegment] ==> ignore + arg [--no-undefined-version] ==> ignore + arg [--fatal-warnings] ==> ignore + arg [--no-undefined] ==> ignore + arg [CMakeFiles/cmTC_3ecff.dir/CMakeCXXCompilerABI.cpp.o] ==> ignore + arg [-Bstatic] ==> search static + arg [-lc++] ==> lib [c++] + arg [-Bdynamic] ==> search dynamic + arg [-lm] ==> lib [m] + arg [/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/lib/clang/18/lib/linux/libclang_rt.builtins-aarch64-android.a] ==> lib [/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/lib/clang/18/lib/linux/libclang_rt.builtins-aarch64-android.a] + arg [-l:libunwind.a] ==> lib [-l:libunwind.a] + arg [-ldl] ==> lib [dl] + arg [-lc] ==> lib [c] + arg [/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/lib/clang/18/lib/linux/libclang_rt.builtins-aarch64-android.a] ==> lib [/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/lib/clang/18/lib/linux/libclang_rt.builtins-aarch64-android.a] + arg [-l:libunwind.a] ==> lib [-l:libunwind.a] + arg [-ldl] ==> lib [dl] + arg [/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/lib/aarch64-linux-android/23/crtend_android.o] ==> obj [/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/lib/aarch64-linux-android/23/crtend_android.o] + linker tool for 'CXX': /Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/bin/ld.lld + remove lib [/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/lib/clang/18/lib/linux/libclang_rt.builtins-aarch64-android.a] + remove lib [/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/lib/clang/18/lib/linux/libclang_rt.builtins-aarch64-android.a] + collapse library dir [/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/lib/clang/18/lib/linux/aarch64] ==> [/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/lib/clang/18/lib/linux/aarch64] + collapse library dir [/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/lib/aarch64-linux-android/23] ==> [/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/lib/aarch64-linux-android/23] + collapse library dir [/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/lib/aarch64-linux-android] ==> [/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/lib/aarch64-linux-android] + collapse library dir [/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/lib] ==> [/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/lib] + implicit libs: [c++;m;-l:libunwind.a;dl;c;-l:libunwind.a;dl] + implicit objs: [/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/lib/aarch64-linux-android/23/crtbegin_dynamic.o;/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/lib/aarch64-linux-android/23/crtend_android.o] + implicit dirs: [/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/lib/clang/18/lib/linux/aarch64;/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/lib/aarch64-linux-android/23;/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/lib/aarch64-linux-android;/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/lib] + implicit fwks: [] + + + - + kind: "message-v1" + backtrace: + - "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Internal/CMakeDetermineLinkerId.cmake:40 (message)" + - "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeDetermineCompilerABI.cmake:255 (cmake_determine_linker_id)" + - "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeTestCXXCompiler.cmake:26 (CMAKE_DETERMINE_COMPILER_ABI)" + - "CMakeLists.txt:2 (project)" + message: | + Running the CXX compiler's linker: "/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/bin/ld.lld" "-v" + LLD 18.0.1 (compatible with GNU linkers) +... diff --git a/siro_rider/android/app/.cxx/RelWithDebInfo/6t1m4b5v/arm64-v8a/CMakeFiles/TargetDirectories.txt b/siro_rider/android/app/.cxx/RelWithDebInfo/6t1m4b5v/arm64-v8a/CMakeFiles/TargetDirectories.txt new file mode 100644 index 0000000..f8d1a91 --- /dev/null +++ b/siro_rider/android/app/.cxx/RelWithDebInfo/6t1m4b5v/arm64-v8a/CMakeFiles/TargetDirectories.txt @@ -0,0 +1,3 @@ +/Users/hamzaaleghwairyeen/development/App/Intaleq/android/app/.cxx/RelWithDebInfo/6t1m4b5v/arm64-v8a/CMakeFiles/native-lib.dir +/Users/hamzaaleghwairyeen/development/App/Intaleq/android/app/.cxx/RelWithDebInfo/6t1m4b5v/arm64-v8a/CMakeFiles/edit_cache.dir +/Users/hamzaaleghwairyeen/development/App/Intaleq/android/app/.cxx/RelWithDebInfo/6t1m4b5v/arm64-v8a/CMakeFiles/rebuild_cache.dir diff --git a/siro_rider/android/app/.cxx/RelWithDebInfo/6t1m4b5v/arm64-v8a/CMakeFiles/cmake.check_cache b/siro_rider/android/app/.cxx/RelWithDebInfo/6t1m4b5v/arm64-v8a/CMakeFiles/cmake.check_cache new file mode 100644 index 0000000..3dccd73 --- /dev/null +++ b/siro_rider/android/app/.cxx/RelWithDebInfo/6t1m4b5v/arm64-v8a/CMakeFiles/cmake.check_cache @@ -0,0 +1 @@ +# This file is generated by cmake for dependency checking of the CMakeCache.txt file diff --git a/siro_rider/android/app/.cxx/RelWithDebInfo/6t1m4b5v/arm64-v8a/CMakeFiles/native-lib.dir/native-lib.cpp.o b/siro_rider/android/app/.cxx/RelWithDebInfo/6t1m4b5v/arm64-v8a/CMakeFiles/native-lib.dir/native-lib.cpp.o new file mode 100644 index 0000000..a4f0f31 Binary files /dev/null and b/siro_rider/android/app/.cxx/RelWithDebInfo/6t1m4b5v/arm64-v8a/CMakeFiles/native-lib.dir/native-lib.cpp.o differ diff --git a/siro_rider/android/app/.cxx/RelWithDebInfo/6t1m4b5v/arm64-v8a/CMakeFiles/rules.ninja b/siro_rider/android/app/.cxx/RelWithDebInfo/6t1m4b5v/arm64-v8a/CMakeFiles/rules.ninja new file mode 100644 index 0000000..aabecd4 --- /dev/null +++ b/siro_rider/android/app/.cxx/RelWithDebInfo/6t1m4b5v/arm64-v8a/CMakeFiles/rules.ninja @@ -0,0 +1,66 @@ +# CMAKE generated file: DO NOT EDIT! +# Generated by "Ninja" Generator, CMake Version 3.31 + +# This file contains all the rules used to get the outputs files +# built from the input files. +# It is included in the main 'build.ninja'. + +# ============================================================================= +# Project: intaleq +# Configurations: RelWithDebInfo +# ============================================================================= +# ============================================================================= + +############################################# +# Rule for compiling CXX files. + +rule CXX_COMPILER__native-lib_unscanned_RelWithDebInfo + depfile = $DEP_FILE + deps = gcc + command = ${LAUNCHER}${CODE_CHECK}/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/bin/clang++ --target=aarch64-none-linux-android23 --sysroot=/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot $DEFINES $INCLUDES $FLAGS -MD -MT $out -MF $DEP_FILE -o $out -c $in + description = Building CXX object $out + + +############################################# +# Rule for linking CXX shared library. + +rule CXX_SHARED_LIBRARY_LINKER__native-lib_RelWithDebInfo + depfile = $DEP_FILE + deps = gcc + command = $PRE_LINK && /Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/bin/clang++ --target=aarch64-none-linux-android23 --sysroot=/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot -fPIC $LANGUAGE_COMPILE_FLAGS $ARCH_FLAGS $LINK_FLAGS -shared $SONAME_FLAG$SONAME -o $TARGET_FILE $in $LINK_PATH $LINK_LIBRARIES && $POST_BUILD + description = Linking CXX shared library $TARGET_FILE + restat = $RESTAT + + +############################################# +# Rule for running custom commands. + +rule CUSTOM_COMMAND + command = $COMMAND + description = $DESC + + +############################################# +# Rule for re-running cmake. + +rule RERUN_CMAKE + command = /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/bin/cmake --regenerate-during-build -S/Users/hamzaaleghwairyeen/development/App/Intaleq/android/app/src/main/cpp -B/Users/hamzaaleghwairyeen/development/App/Intaleq/android/app/.cxx/RelWithDebInfo/6t1m4b5v/arm64-v8a + description = Re-running CMake... + generator = 1 + + +############################################# +# Rule for cleaning all built files. + +rule CLEAN + command = /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/bin/ninja $FILE_ARG -t clean $TARGETS + description = Cleaning all built files... + + +############################################# +# Rule for printing all primary targets available. + +rule HELP + command = /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/bin/ninja -t targets + description = All primary targets available: + diff --git a/siro_rider/android/app/.cxx/RelWithDebInfo/6t1m4b5v/arm64-v8a/additional_project_files.txt b/siro_rider/android/app/.cxx/RelWithDebInfo/6t1m4b5v/arm64-v8a/additional_project_files.txt new file mode 100644 index 0000000..e69de29 diff --git a/siro_rider/android/app/.cxx/RelWithDebInfo/6t1m4b5v/arm64-v8a/android_gradle_build.json b/siro_rider/android/app/.cxx/RelWithDebInfo/6t1m4b5v/arm64-v8a/android_gradle_build.json new file mode 100644 index 0000000..a23331a --- /dev/null +++ b/siro_rider/android/app/.cxx/RelWithDebInfo/6t1m4b5v/arm64-v8a/android_gradle_build.json @@ -0,0 +1,38 @@ +{ + "buildFiles": [ + "/Users/hamzaaleghwairyeen/development/App/Intaleq/android/app/src/main/cpp/CMakeLists.txt" + ], + "cleanCommandsComponents": [ + [ + "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/bin/ninja", + "-C", + "/Users/hamzaaleghwairyeen/development/App/Intaleq/android/app/.cxx/RelWithDebInfo/6t1m4b5v/arm64-v8a", + "clean" + ] + ], + "buildTargetsCommandComponents": [ + "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/bin/ninja", + "-C", + "/Users/hamzaaleghwairyeen/development/App/Intaleq/android/app/.cxx/RelWithDebInfo/6t1m4b5v/arm64-v8a", + "{LIST_OF_TARGETS_TO_BUILD}" + ], + "libraries": { + "native-lib::@6890427a1f51a3e7e1df": { + "toolchain": "toolchain", + "abi": "arm64-v8a", + "artifactName": "native-lib", + "output": "/Users/hamzaaleghwairyeen/development/App/Intaleq/build/app/intermediates/cxx/RelWithDebInfo/6t1m4b5v/obj/arm64-v8a/libnative-lib.so", + "runtimeFiles": [] + } + }, + "toolchains": { + "toolchain": { + "cCompilerExecutable": "/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/bin/clang.lld", + "cppCompilerExecutable": "/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/bin/clang++.lld" + } + }, + "cFileExtensions": [], + "cppFileExtensions": [ + "cpp" + ] +} \ No newline at end of file diff --git a/siro_rider/android/app/.cxx/RelWithDebInfo/6t1m4b5v/arm64-v8a/android_gradle_build_mini.json b/siro_rider/android/app/.cxx/RelWithDebInfo/6t1m4b5v/arm64-v8a/android_gradle_build_mini.json new file mode 100644 index 0000000..e4ac82d --- /dev/null +++ b/siro_rider/android/app/.cxx/RelWithDebInfo/6t1m4b5v/arm64-v8a/android_gradle_build_mini.json @@ -0,0 +1,27 @@ +{ + "buildFiles": [ + "/Users/hamzaaleghwairyeen/development/App/Intaleq/android/app/src/main/cpp/CMakeLists.txt" + ], + "cleanCommandsComponents": [ + [ + "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/bin/ninja", + "-C", + "/Users/hamzaaleghwairyeen/development/App/Intaleq/android/app/.cxx/RelWithDebInfo/6t1m4b5v/arm64-v8a", + "clean" + ] + ], + "buildTargetsCommandComponents": [ + "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/bin/ninja", + "-C", + "/Users/hamzaaleghwairyeen/development/App/Intaleq/android/app/.cxx/RelWithDebInfo/6t1m4b5v/arm64-v8a", + "{LIST_OF_TARGETS_TO_BUILD}" + ], + "libraries": { + "native-lib::@6890427a1f51a3e7e1df": { + "artifactName": "native-lib", + "abi": "arm64-v8a", + "output": "/Users/hamzaaleghwairyeen/development/App/Intaleq/build/app/intermediates/cxx/RelWithDebInfo/6t1m4b5v/obj/arm64-v8a/libnative-lib.so", + "runtimeFiles": [] + } + } +} \ No newline at end of file diff --git a/siro_rider/android/app/.cxx/RelWithDebInfo/6t1m4b5v/arm64-v8a/build.ninja b/siro_rider/android/app/.cxx/RelWithDebInfo/6t1m4b5v/arm64-v8a/build.ninja new file mode 100644 index 0000000..eeb98c3 --- /dev/null +++ b/siro_rider/android/app/.cxx/RelWithDebInfo/6t1m4b5v/arm64-v8a/build.ninja @@ -0,0 +1,156 @@ +# CMAKE generated file: DO NOT EDIT! +# Generated by "Ninja" Generator, CMake Version 3.31 + +# This file contains all the build statements describing the +# compilation DAG. + +# ============================================================================= +# Write statements declared in CMakeLists.txt: +# +# Which is the root file. +# ============================================================================= + +# ============================================================================= +# Project: intaleq +# Configurations: RelWithDebInfo +# ============================================================================= + +############################################# +# Minimal version of Ninja required by this file + +ninja_required_version = 1.5 + + +############################################# +# Set configuration variable for custom commands. + +CONFIGURATION = RelWithDebInfo +# ============================================================================= +# Include auxiliary files. + + +############################################# +# Include rules file. + +include CMakeFiles/rules.ninja + +# ============================================================================= + +############################################# +# Logical path to working directory; prefix for absolute paths. + +cmake_ninja_workdir = /Users/hamzaaleghwairyeen/development/App/Intaleq/android/app/.cxx/RelWithDebInfo/6t1m4b5v/arm64-v8a/ +# ============================================================================= +# Object build statements for SHARED_LIBRARY target native-lib + + +############################################# +# Order-only phony target for native-lib + +build cmake_object_order_depends_target_native-lib: phony || . + +build CMakeFiles/native-lib.dir/native-lib.cpp.o: CXX_COMPILER__native-lib_unscanned_RelWithDebInfo /Users/hamzaaleghwairyeen/development/App/Intaleq/android/app/src/main/cpp/native-lib.cpp || cmake_object_order_depends_target_native-lib + DEFINES = -Dnative_lib_EXPORTS + DEP_FILE = CMakeFiles/native-lib.dir/native-lib.cpp.o.d + FLAGS = -g -DANDROID -fdata-sections -ffunction-sections -funwind-tables -fstack-protector-strong -no-canonical-prefixes -D_FORTIFY_SOURCE=2 -Wformat -Werror=format-security -O2 -g -DNDEBUG -fPIC + OBJECT_DIR = CMakeFiles/native-lib.dir + OBJECT_FILE_DIR = CMakeFiles/native-lib.dir + TARGET_COMPILE_PDB = CMakeFiles/native-lib.dir/ + TARGET_PDB = /Users/hamzaaleghwairyeen/development/App/Intaleq/build/app/intermediates/cxx/RelWithDebInfo/6t1m4b5v/obj/arm64-v8a/libnative-lib.pdb + + +# ============================================================================= +# Link build statements for SHARED_LIBRARY target native-lib + + +############################################# +# Link the shared library /Users/hamzaaleghwairyeen/development/App/Intaleq/build/app/intermediates/cxx/RelWithDebInfo/6t1m4b5v/obj/arm64-v8a/libnative-lib.so + +build /Users/hamzaaleghwairyeen/development/App/Intaleq/build/app/intermediates/cxx/RelWithDebInfo/6t1m4b5v/obj/arm64-v8a/libnative-lib.so: CXX_SHARED_LIBRARY_LINKER__native-lib_RelWithDebInfo CMakeFiles/native-lib.dir/native-lib.cpp.o | /Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/lib/aarch64-linux-android/23/liblog.so + DEP_FILE = CMakeFiles/native-lib.dir/link.d + LANGUAGE_COMPILE_FLAGS = -g -DANDROID -fdata-sections -ffunction-sections -funwind-tables -fstack-protector-strong -no-canonical-prefixes -D_FORTIFY_SOURCE=2 -Wformat -Werror=format-security -O2 -g -DNDEBUG + LINK_FLAGS = -static-libstdc++ -Wl,--build-id=sha1 -Wl,--no-rosegment -Wl,--no-undefined-version -Wl,--fatal-warnings -Wl,--no-undefined -Qunused-arguments -Wl,--gc-sections -Xlinker --dependency-file=CMakeFiles/native-lib.dir/link.d + LINK_LIBRARIES = /Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/lib/aarch64-linux-android/23/liblog.so -latomic -lm + OBJECT_DIR = CMakeFiles/native-lib.dir + POST_BUILD = : + PRE_LINK = : + SONAME = libnative-lib.so + SONAME_FLAG = -Wl,-soname, + TARGET_COMPILE_PDB = CMakeFiles/native-lib.dir/ + TARGET_FILE = /Users/hamzaaleghwairyeen/development/App/Intaleq/build/app/intermediates/cxx/RelWithDebInfo/6t1m4b5v/obj/arm64-v8a/libnative-lib.so + TARGET_PDB = /Users/hamzaaleghwairyeen/development/App/Intaleq/build/app/intermediates/cxx/RelWithDebInfo/6t1m4b5v/obj/arm64-v8a/libnative-lib.pdb + + +############################################# +# Utility command for edit_cache + +build CMakeFiles/edit_cache.util: CUSTOM_COMMAND + COMMAND = cd /Users/hamzaaleghwairyeen/development/App/Intaleq/android/app/.cxx/RelWithDebInfo/6t1m4b5v/arm64-v8a && /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/bin/ccmake -S/Users/hamzaaleghwairyeen/development/App/Intaleq/android/app/src/main/cpp -B/Users/hamzaaleghwairyeen/development/App/Intaleq/android/app/.cxx/RelWithDebInfo/6t1m4b5v/arm64-v8a + DESC = Running CMake cache editor... + pool = console + restat = 1 + +build edit_cache: phony CMakeFiles/edit_cache.util + + +############################################# +# Utility command for rebuild_cache + +build CMakeFiles/rebuild_cache.util: CUSTOM_COMMAND + COMMAND = cd /Users/hamzaaleghwairyeen/development/App/Intaleq/android/app/.cxx/RelWithDebInfo/6t1m4b5v/arm64-v8a && /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/bin/cmake --regenerate-during-build -S/Users/hamzaaleghwairyeen/development/App/Intaleq/android/app/src/main/cpp -B/Users/hamzaaleghwairyeen/development/App/Intaleq/android/app/.cxx/RelWithDebInfo/6t1m4b5v/arm64-v8a + DESC = Running CMake to regenerate build system... + pool = console + restat = 1 + +build rebuild_cache: phony CMakeFiles/rebuild_cache.util + +# ============================================================================= +# Target aliases. + +build libnative-lib.so: phony /Users/hamzaaleghwairyeen/development/App/Intaleq/build/app/intermediates/cxx/RelWithDebInfo/6t1m4b5v/obj/arm64-v8a/libnative-lib.so + +build native-lib: phony /Users/hamzaaleghwairyeen/development/App/Intaleq/build/app/intermediates/cxx/RelWithDebInfo/6t1m4b5v/obj/arm64-v8a/libnative-lib.so + +# ============================================================================= +# Folder targets. + +# ============================================================================= + +############################################# +# Folder: /Users/hamzaaleghwairyeen/development/App/Intaleq/android/app/.cxx/RelWithDebInfo/6t1m4b5v/arm64-v8a + +build all: phony /Users/hamzaaleghwairyeen/development/App/Intaleq/build/app/intermediates/cxx/RelWithDebInfo/6t1m4b5v/obj/arm64-v8a/libnative-lib.so + +# ============================================================================= +# Built-in targets + + +############################################# +# Re-run CMake if any of its inputs changed. + +build build.ninja: RERUN_CMAKE | /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeCCompiler.cmake.in /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeCCompilerABI.c /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeCInformation.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeCXXCompiler.cmake.in /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeCXXCompilerABI.cpp /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeCXXInformation.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeCommonLanguageInclude.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeCompilerIdDetection.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeDetermineCCompiler.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeDetermineCXXCompiler.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeDetermineCompiler.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeDetermineCompilerABI.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeDetermineCompilerId.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeDetermineCompilerSupport.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeDetermineSystem.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeFindBinUtils.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeGenericSystem.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeInitializeConfigs.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeLanguageInformation.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeParseImplicitIncludeInfo.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeParseImplicitLinkInfo.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeParseLibraryArchitecture.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeSystem.cmake.in /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeSystemSpecificInformation.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeSystemSpecificInitialize.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeTestCCompiler.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeTestCXXCompiler.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeTestCompilerCommon.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/ADSP-DetermineCompiler.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/ARMCC-DetermineCompiler.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/ARMClang-DetermineCompiler.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/AppleClang-DetermineCompiler.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/Borland-DetermineCompiler.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/Bruce-C-DetermineCompiler.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/CMakeCommonCompilerMacros.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/Clang-C.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/Clang-CXX-CXXImportStd.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/Clang-CXX.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/Clang-DetermineCompiler.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/Clang-DetermineCompilerInternal.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/Clang-FindBinUtils.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/Clang.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/Compaq-C-DetermineCompiler.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/Compaq-CXX-DetermineCompiler.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/Cray-DetermineCompiler.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/CrayClang-DetermineCompiler.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/Embarcadero-DetermineCompiler.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/Fujitsu-DetermineCompiler.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/FujitsuClang-DetermineCompiler.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/GHS-DetermineCompiler.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/GNU-C-DetermineCompiler.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/GNU-CXX-DetermineCompiler.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/GNU.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/HP-C-DetermineCompiler.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/HP-CXX-DetermineCompiler.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/IAR-DetermineCompiler.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/IBMCPP-C-DetermineVersionInternal.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/IBMCPP-CXX-DetermineVersionInternal.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/IBMClang-C-DetermineCompiler.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/IBMClang-CXX-DetermineCompiler.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/Intel-DetermineCompiler.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/IntelLLVM-DetermineCompiler.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/LCC-C-DetermineCompiler.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/LCC-CXX-DetermineCompiler.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/MSVC-DetermineCompiler.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/NVHPC-DetermineCompiler.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/NVIDIA-DetermineCompiler.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/OpenWatcom-DetermineCompiler.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/OrangeC-DetermineCompiler.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/PGI-DetermineCompiler.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/PathScale-DetermineCompiler.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/SCO-DetermineCompiler.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/SDCC-C-DetermineCompiler.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/SunPro-C-DetermineCompiler.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/SunPro-CXX-DetermineCompiler.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/TI-DetermineCompiler.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/TIClang-DetermineCompiler.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/Tasking-DetermineCompiler.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/TinyCC-C-DetermineCompiler.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/VisualAge-C-DetermineCompiler.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/VisualAge-CXX-DetermineCompiler.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/Watcom-DetermineCompiler.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/XL-C-DetermineCompiler.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/XL-CXX-DetermineCompiler.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/XLClang-C-DetermineCompiler.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/XLClang-CXX-DetermineCompiler.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/zOS-C-DetermineCompiler.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/zOS-CXX-DetermineCompiler.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Internal/CMakeCLinkerInformation.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Internal/CMakeCXXLinkerInformation.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Internal/CMakeCommonLinkerInformation.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Internal/CMakeDetermineLinkerId.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Internal/FeatureTesting.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Linker/GNU.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Linker/LLD-C.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Linker/LLD-CXX.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Linker/LLD.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Platform/Android-Clang-C.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Platform/Android-Clang-CXX.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Platform/Android-Clang.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Platform/Android-Determine-C.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Platform/Android-Determine-CXX.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Platform/Android-Determine.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Platform/Android-Initialize.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Platform/Android.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Platform/Android/Determine-Compiler.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Platform/Linker/Android-LLD-C.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Platform/Linker/Android-LLD-CXX.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Platform/Linker/GNU.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Platform/Linker/Linux-GNU.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Platform/Linker/Linux-LLD-C.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Platform/Linker/Linux-LLD-CXX.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Platform/Linker/Linux-LLD.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Platform/Linux-Initialize.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Platform/Linux.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Platform/UnixPaths.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/build/cmake/abis.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/build/cmake/android-legacy.toolchain.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/build/cmake/android.toolchain.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/build/cmake/flags.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/build/cmake/hooks/pre/Android-Clang.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/build/cmake/hooks/pre/Android-Determine.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/build/cmake/hooks/pre/Android-Initialize.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/build/cmake/hooks/pre/Android.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/build/cmake/hooks/pre/Determine-Compiler.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/build/cmake/platforms.cmake /Users/hamzaaleghwairyeen/development/App/Intaleq/android/app/src/main/cpp/CMakeLists.txt CMakeCache.txt CMakeFiles/3.31.5-g6cf5163/CMakeCCompiler.cmake CMakeFiles/3.31.5-g6cf5163/CMakeCXXCompiler.cmake CMakeFiles/3.31.5-g6cf5163/CMakeSystem.cmake + pool = console + + +############################################# +# A missing CMake input file is not an error. + +build /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeCCompiler.cmake.in /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeCCompilerABI.c /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeCInformation.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeCXXCompiler.cmake.in /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeCXXCompilerABI.cpp /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeCXXInformation.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeCommonLanguageInclude.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeCompilerIdDetection.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeDetermineCCompiler.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeDetermineCXXCompiler.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeDetermineCompiler.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeDetermineCompilerABI.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeDetermineCompilerId.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeDetermineCompilerSupport.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeDetermineSystem.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeFindBinUtils.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeGenericSystem.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeInitializeConfigs.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeLanguageInformation.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeParseImplicitIncludeInfo.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeParseImplicitLinkInfo.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeParseLibraryArchitecture.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeSystem.cmake.in /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeSystemSpecificInformation.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeSystemSpecificInitialize.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeTestCCompiler.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeTestCXXCompiler.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeTestCompilerCommon.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/ADSP-DetermineCompiler.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/ARMCC-DetermineCompiler.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/ARMClang-DetermineCompiler.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/AppleClang-DetermineCompiler.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/Borland-DetermineCompiler.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/Bruce-C-DetermineCompiler.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/CMakeCommonCompilerMacros.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/Clang-C.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/Clang-CXX-CXXImportStd.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/Clang-CXX.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/Clang-DetermineCompiler.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/Clang-DetermineCompilerInternal.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/Clang-FindBinUtils.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/Clang.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/Compaq-C-DetermineCompiler.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/Compaq-CXX-DetermineCompiler.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/Cray-DetermineCompiler.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/CrayClang-DetermineCompiler.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/Embarcadero-DetermineCompiler.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/Fujitsu-DetermineCompiler.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/FujitsuClang-DetermineCompiler.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/GHS-DetermineCompiler.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/GNU-C-DetermineCompiler.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/GNU-CXX-DetermineCompiler.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/GNU.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/HP-C-DetermineCompiler.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/HP-CXX-DetermineCompiler.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/IAR-DetermineCompiler.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/IBMCPP-C-DetermineVersionInternal.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/IBMCPP-CXX-DetermineVersionInternal.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/IBMClang-C-DetermineCompiler.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/IBMClang-CXX-DetermineCompiler.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/Intel-DetermineCompiler.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/IntelLLVM-DetermineCompiler.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/LCC-C-DetermineCompiler.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/LCC-CXX-DetermineCompiler.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/MSVC-DetermineCompiler.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/NVHPC-DetermineCompiler.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/NVIDIA-DetermineCompiler.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/OpenWatcom-DetermineCompiler.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/OrangeC-DetermineCompiler.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/PGI-DetermineCompiler.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/PathScale-DetermineCompiler.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/SCO-DetermineCompiler.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/SDCC-C-DetermineCompiler.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/SunPro-C-DetermineCompiler.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/SunPro-CXX-DetermineCompiler.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/TI-DetermineCompiler.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/TIClang-DetermineCompiler.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/Tasking-DetermineCompiler.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/TinyCC-C-DetermineCompiler.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/VisualAge-C-DetermineCompiler.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/VisualAge-CXX-DetermineCompiler.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/Watcom-DetermineCompiler.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/XL-C-DetermineCompiler.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/XL-CXX-DetermineCompiler.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/XLClang-C-DetermineCompiler.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/XLClang-CXX-DetermineCompiler.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/zOS-C-DetermineCompiler.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/zOS-CXX-DetermineCompiler.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Internal/CMakeCLinkerInformation.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Internal/CMakeCXXLinkerInformation.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Internal/CMakeCommonLinkerInformation.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Internal/CMakeDetermineLinkerId.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Internal/FeatureTesting.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Linker/GNU.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Linker/LLD-C.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Linker/LLD-CXX.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Linker/LLD.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Platform/Android-Clang-C.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Platform/Android-Clang-CXX.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Platform/Android-Clang.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Platform/Android-Determine-C.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Platform/Android-Determine-CXX.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Platform/Android-Determine.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Platform/Android-Initialize.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Platform/Android.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Platform/Android/Determine-Compiler.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Platform/Linker/Android-LLD-C.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Platform/Linker/Android-LLD-CXX.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Platform/Linker/GNU.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Platform/Linker/Linux-GNU.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Platform/Linker/Linux-LLD-C.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Platform/Linker/Linux-LLD-CXX.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Platform/Linker/Linux-LLD.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Platform/Linux-Initialize.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Platform/Linux.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Platform/UnixPaths.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/build/cmake/abis.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/build/cmake/android-legacy.toolchain.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/build/cmake/android.toolchain.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/build/cmake/flags.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/build/cmake/hooks/pre/Android-Clang.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/build/cmake/hooks/pre/Android-Determine.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/build/cmake/hooks/pre/Android-Initialize.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/build/cmake/hooks/pre/Android.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/build/cmake/hooks/pre/Determine-Compiler.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/build/cmake/platforms.cmake /Users/hamzaaleghwairyeen/development/App/Intaleq/android/app/src/main/cpp/CMakeLists.txt CMakeCache.txt CMakeFiles/3.31.5-g6cf5163/CMakeCCompiler.cmake CMakeFiles/3.31.5-g6cf5163/CMakeCXXCompiler.cmake CMakeFiles/3.31.5-g6cf5163/CMakeSystem.cmake: phony + + +############################################# +# Clean all the built files. + +build clean: CLEAN + + +############################################# +# Print all primary targets available. + +build help: HELP + + +############################################# +# Make the all target the default. + +default all diff --git a/siro_rider/android/app/.cxx/RelWithDebInfo/6t1m4b5v/arm64-v8a/build_file_index.txt b/siro_rider/android/app/.cxx/RelWithDebInfo/6t1m4b5v/arm64-v8a/build_file_index.txt new file mode 100644 index 0000000..661f7ae --- /dev/null +++ b/siro_rider/android/app/.cxx/RelWithDebInfo/6t1m4b5v/arm64-v8a/build_file_index.txt @@ -0,0 +1 @@ +/Users/hamzaaleghwairyeen/development/App/Intaleq/android/app/src/main/cpp/CMakeLists.txt \ No newline at end of file diff --git a/siro_rider/android/app/.cxx/RelWithDebInfo/6t1m4b5v/arm64-v8a/cmake_install.cmake b/siro_rider/android/app/.cxx/RelWithDebInfo/6t1m4b5v/arm64-v8a/cmake_install.cmake new file mode 100644 index 0000000..921d9e3 --- /dev/null +++ b/siro_rider/android/app/.cxx/RelWithDebInfo/6t1m4b5v/arm64-v8a/cmake_install.cmake @@ -0,0 +1,66 @@ +# Install script for directory: /Users/hamzaaleghwairyeen/development/App/Intaleq/android/app/src/main/cpp + +# Set the install prefix +if(NOT DEFINED CMAKE_INSTALL_PREFIX) + set(CMAKE_INSTALL_PREFIX "/usr/local") +endif() +string(REGEX REPLACE "/$" "" CMAKE_INSTALL_PREFIX "${CMAKE_INSTALL_PREFIX}") + +# Set the install configuration name. +if(NOT DEFINED CMAKE_INSTALL_CONFIG_NAME) + if(BUILD_TYPE) + string(REGEX REPLACE "^[^A-Za-z0-9_]+" "" + CMAKE_INSTALL_CONFIG_NAME "${BUILD_TYPE}") + else() + set(CMAKE_INSTALL_CONFIG_NAME "RelWithDebInfo") + endif() + message(STATUS "Install configuration: \"${CMAKE_INSTALL_CONFIG_NAME}\"") +endif() + +# Set the component getting installed. +if(NOT CMAKE_INSTALL_COMPONENT) + if(COMPONENT) + message(STATUS "Install component: \"${COMPONENT}\"") + set(CMAKE_INSTALL_COMPONENT "${COMPONENT}") + else() + set(CMAKE_INSTALL_COMPONENT) + endif() +endif() + +# Install shared libraries without execute permission? +if(NOT DEFINED CMAKE_INSTALL_SO_NO_EXE) + set(CMAKE_INSTALL_SO_NO_EXE "0") +endif() + +# Is this installation the result of a crosscompile? +if(NOT DEFINED CMAKE_CROSSCOMPILING) + set(CMAKE_CROSSCOMPILING "TRUE") +endif() + +# Set path to fallback-tool for dependency-resolution. +if(NOT DEFINED CMAKE_OBJDUMP) + set(CMAKE_OBJDUMP "/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/bin/llvm-objdump") +endif() + +string(REPLACE ";" "\n" CMAKE_INSTALL_MANIFEST_CONTENT + "${CMAKE_INSTALL_MANIFEST_FILES}") +if(CMAKE_INSTALL_LOCAL_ONLY) + file(WRITE "/Users/hamzaaleghwairyeen/development/App/Intaleq/android/app/.cxx/RelWithDebInfo/6t1m4b5v/arm64-v8a/install_local_manifest.txt" + "${CMAKE_INSTALL_MANIFEST_CONTENT}") +endif() +if(CMAKE_INSTALL_COMPONENT) + if(CMAKE_INSTALL_COMPONENT MATCHES "^[a-zA-Z0-9_.+-]+$") + set(CMAKE_INSTALL_MANIFEST "install_manifest_${CMAKE_INSTALL_COMPONENT}.txt") + else() + string(MD5 CMAKE_INST_COMP_HASH "${CMAKE_INSTALL_COMPONENT}") + set(CMAKE_INSTALL_MANIFEST "install_manifest_${CMAKE_INST_COMP_HASH}.txt") + unset(CMAKE_INST_COMP_HASH) + endif() +else() + set(CMAKE_INSTALL_MANIFEST "install_manifest.txt") +endif() + +if(NOT CMAKE_INSTALL_LOCAL_ONLY) + file(WRITE "/Users/hamzaaleghwairyeen/development/App/Intaleq/android/app/.cxx/RelWithDebInfo/6t1m4b5v/arm64-v8a/${CMAKE_INSTALL_MANIFEST}" + "${CMAKE_INSTALL_MANIFEST_CONTENT}") +endif() diff --git a/siro_rider/android/app/.cxx/RelWithDebInfo/6t1m4b5v/arm64-v8a/compile_commands.json b/siro_rider/android/app/.cxx/RelWithDebInfo/6t1m4b5v/arm64-v8a/compile_commands.json new file mode 100644 index 0000000..908220b --- /dev/null +++ b/siro_rider/android/app/.cxx/RelWithDebInfo/6t1m4b5v/arm64-v8a/compile_commands.json @@ -0,0 +1,8 @@ +[ +{ + "directory": "/Users/hamzaaleghwairyeen/development/App/Intaleq/android/app/.cxx/RelWithDebInfo/6t1m4b5v/arm64-v8a", + "command": "/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/bin/clang++ --target=aarch64-none-linux-android23 --sysroot=/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot -Dnative_lib_EXPORTS -g -DANDROID -fdata-sections -ffunction-sections -funwind-tables -fstack-protector-strong -no-canonical-prefixes -D_FORTIFY_SOURCE=2 -Wformat -Werror=format-security -O2 -g -DNDEBUG -fPIC -o CMakeFiles/native-lib.dir/native-lib.cpp.o -c /Users/hamzaaleghwairyeen/development/App/Intaleq/android/app/src/main/cpp/native-lib.cpp", + "file": "/Users/hamzaaleghwairyeen/development/App/Intaleq/android/app/src/main/cpp/native-lib.cpp", + "output": "CMakeFiles/native-lib.dir/native-lib.cpp.o" +} +] \ No newline at end of file diff --git a/siro_rider/android/app/.cxx/RelWithDebInfo/6t1m4b5v/arm64-v8a/compile_commands.json.bin b/siro_rider/android/app/.cxx/RelWithDebInfo/6t1m4b5v/arm64-v8a/compile_commands.json.bin new file mode 100644 index 0000000..d0dbcc9 Binary files /dev/null and b/siro_rider/android/app/.cxx/RelWithDebInfo/6t1m4b5v/arm64-v8a/compile_commands.json.bin differ diff --git a/siro_rider/android/app/.cxx/RelWithDebInfo/6t1m4b5v/arm64-v8a/configure_fingerprint.bin b/siro_rider/android/app/.cxx/RelWithDebInfo/6t1m4b5v/arm64-v8a/configure_fingerprint.bin new file mode 100644 index 0000000..f428f84 --- /dev/null +++ b/siro_rider/android/app/.cxx/RelWithDebInfo/6t1m4b5v/arm64-v8a/configure_fingerprint.bin @@ -0,0 +1,28 @@ +C/C++ Structured Log + +/Users/hamzaaleghwairyeen/development/App/Intaleq/android/app/.cxx/RelWithDebInfo/6t1m4b5v/arm64-v8a/additional_project_files.txtC +A +?com.android.build.gradle.internal.cxx.io.EncodedFileFingerPrint  3  쥙2 + +~/Users/hamzaaleghwairyeen/development/App/Intaleq/android/app/.cxx/RelWithDebInfo/6t1m4b5v/arm64-v8a/android_gradle_build.json  3 Ħ2 + +/Users/hamzaaleghwairyeen/development/App/Intaleq/android/app/.cxx/RelWithDebInfo/6t1m4b5v/arm64-v8a/android_gradle_build_mini.json  3 ٦2t +r +p/Users/hamzaaleghwairyeen/development/App/Intaleq/android/app/.cxx/RelWithDebInfo/6t1m4b5v/arm64-v8a/build.ninja  3Ф 夙2x +v +t/Users/hamzaaleghwairyeen/development/App/Intaleq/android/app/.cxx/RelWithDebInfo/6t1m4b5v/arm64-v8a/build.ninja.txt  3} +{ +y/Users/hamzaaleghwairyeen/development/App/Intaleq/android/app/.cxx/RelWithDebInfo/6t1m4b5v/arm64-v8a/build_file_index.txt  3 Y ݦ2~ +| +z/Users/hamzaaleghwairyeen/development/App/Intaleq/android/app/.cxx/RelWithDebInfo/6t1m4b5v/arm64-v8a/compile_commands.json  3 夙2 + +~/Users/hamzaaleghwairyeen/development/App/Intaleq/android/app/.cxx/RelWithDebInfo/6t1m4b5v/arm64-v8a/compile_commands.json.bin  3  夙2 + +/Users/hamzaaleghwairyeen/development/App/Intaleq/android/app/.cxx/RelWithDebInfo/6t1m4b5v/arm64-v8a/metadata_generation_command.txt  3 + ݦ2{ +y +w/Users/hamzaaleghwairyeen/development/App/Intaleq/android/app/.cxx/RelWithDebInfo/6t1m4b5v/arm64-v8a/prefab_config.json  3  ( ݦ2 +~ +|/Users/hamzaaleghwairyeen/development/App/Intaleq/android/app/.cxx/RelWithDebInfo/6t1m4b5v/arm64-v8a/symbol_folder_index.txt  3  s ݦ2] +[ +Y/Users/hamzaaleghwairyeen/development/App/Intaleq/android/app/src/main/cpp/CMakeLists.txt  3  ޮ2 \ No newline at end of file diff --git a/siro_rider/android/app/.cxx/RelWithDebInfo/6t1m4b5v/arm64-v8a/metadata_generation_command.txt b/siro_rider/android/app/.cxx/RelWithDebInfo/6t1m4b5v/arm64-v8a/metadata_generation_command.txt new file mode 100644 index 0000000..9aac541 --- /dev/null +++ b/siro_rider/android/app/.cxx/RelWithDebInfo/6t1m4b5v/arm64-v8a/metadata_generation_command.txt @@ -0,0 +1,18 @@ + -H/Users/hamzaaleghwairyeen/development/App/Intaleq/android/app/src/main/cpp +-DCMAKE_SYSTEM_NAME=Android +-DCMAKE_EXPORT_COMPILE_COMMANDS=ON +-DCMAKE_SYSTEM_VERSION=23 +-DANDROID_PLATFORM=android-23 +-DANDROID_ABI=arm64-v8a +-DCMAKE_ANDROID_ARCH_ABI=arm64-v8a +-DANDROID_NDK=/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973 +-DCMAKE_ANDROID_NDK=/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973 +-DCMAKE_TOOLCHAIN_FILE=/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/build/cmake/android.toolchain.cmake +-DCMAKE_MAKE_PROGRAM=/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/bin/ninja +-DCMAKE_LIBRARY_OUTPUT_DIRECTORY=/Users/hamzaaleghwairyeen/development/App/Intaleq/build/app/intermediates/cxx/RelWithDebInfo/6t1m4b5v/obj/arm64-v8a +-DCMAKE_RUNTIME_OUTPUT_DIRECTORY=/Users/hamzaaleghwairyeen/development/App/Intaleq/build/app/intermediates/cxx/RelWithDebInfo/6t1m4b5v/obj/arm64-v8a +-DCMAKE_BUILD_TYPE=RelWithDebInfo +-B/Users/hamzaaleghwairyeen/development/App/Intaleq/android/app/.cxx/RelWithDebInfo/6t1m4b5v/arm64-v8a +-GNinja + Build command args: [] + Version: 2 \ No newline at end of file diff --git a/siro_rider/android/app/.cxx/RelWithDebInfo/6t1m4b5v/arm64-v8a/prefab_config.json b/siro_rider/android/app/.cxx/RelWithDebInfo/6t1m4b5v/arm64-v8a/prefab_config.json new file mode 100644 index 0000000..e799de8 --- /dev/null +++ b/siro_rider/android/app/.cxx/RelWithDebInfo/6t1m4b5v/arm64-v8a/prefab_config.json @@ -0,0 +1,4 @@ +{ + "enabled": false, + "packages": [] +} \ No newline at end of file diff --git a/siro_rider/android/app/.cxx/RelWithDebInfo/6t1m4b5v/arm64-v8a/symbol_folder_index.txt b/siro_rider/android/app/.cxx/RelWithDebInfo/6t1m4b5v/arm64-v8a/symbol_folder_index.txt new file mode 100644 index 0000000..c7f5a38 --- /dev/null +++ b/siro_rider/android/app/.cxx/RelWithDebInfo/6t1m4b5v/arm64-v8a/symbol_folder_index.txt @@ -0,0 +1 @@ +/Users/hamzaaleghwairyeen/development/App/Intaleq/build/app/intermediates/cxx/RelWithDebInfo/6t1m4b5v/obj/arm64-v8a \ No newline at end of file diff --git a/siro_rider/android/app/.cxx/RelWithDebInfo/6t1m4b5v/armeabi-v7a/.cmake/api/v1/query/client-agp/cache-v2 b/siro_rider/android/app/.cxx/RelWithDebInfo/6t1m4b5v/armeabi-v7a/.cmake/api/v1/query/client-agp/cache-v2 new file mode 100644 index 0000000..e69de29 diff --git a/siro_rider/android/app/.cxx/RelWithDebInfo/6t1m4b5v/armeabi-v7a/.cmake/api/v1/query/client-agp/cmakeFiles-v1 b/siro_rider/android/app/.cxx/RelWithDebInfo/6t1m4b5v/armeabi-v7a/.cmake/api/v1/query/client-agp/cmakeFiles-v1 new file mode 100644 index 0000000..e69de29 diff --git a/siro_rider/android/app/.cxx/RelWithDebInfo/6t1m4b5v/armeabi-v7a/.cmake/api/v1/query/client-agp/codemodel-v2 b/siro_rider/android/app/.cxx/RelWithDebInfo/6t1m4b5v/armeabi-v7a/.cmake/api/v1/query/client-agp/codemodel-v2 new file mode 100644 index 0000000..e69de29 diff --git a/siro_rider/android/app/.cxx/RelWithDebInfo/6t1m4b5v/armeabi-v7a/.cmake/api/v1/reply/cache-v2-d96be89e561ddbdb427b.json b/siro_rider/android/app/.cxx/RelWithDebInfo/6t1m4b5v/armeabi-v7a/.cmake/api/v1/reply/cache-v2-d96be89e561ddbdb427b.json new file mode 100644 index 0000000..79021c7 --- /dev/null +++ b/siro_rider/android/app/.cxx/RelWithDebInfo/6t1m4b5v/armeabi-v7a/.cmake/api/v1/reply/cache-v2-d96be89e561ddbdb427b.json @@ -0,0 +1,1479 @@ +{ + "entries" : + [ + { + "name" : "ANDROID_ABI", + "properties" : + [ + { + "name" : "HELPSTRING", + "value" : "No help, variable specified on the command line." + } + ], + "type" : "UNINITIALIZED", + "value" : "armeabi-v7a" + }, + { + "name" : "ANDROID_NDK", + "properties" : + [ + { + "name" : "HELPSTRING", + "value" : "No help, variable specified on the command line." + } + ], + "type" : "UNINITIALIZED", + "value" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973" + }, + { + "name" : "ANDROID_PLATFORM", + "properties" : + [ + { + "name" : "HELPSTRING", + "value" : "No help, variable specified on the command line." + } + ], + "type" : "UNINITIALIZED", + "value" : "android-23" + }, + { + "name" : "CMAKE_ADDR2LINE", + "properties" : + [ + { + "name" : "ADVANCED", + "value" : "1" + }, + { + "name" : "HELPSTRING", + "value" : "Path to a program." + } + ], + "type" : "FILEPATH", + "value" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/bin/llvm-addr2line" + }, + { + "name" : "CMAKE_ANDROID_ARCH_ABI", + "properties" : + [ + { + "name" : "HELPSTRING", + "value" : "No help, variable specified on the command line." + } + ], + "type" : "UNINITIALIZED", + "value" : "armeabi-v7a" + }, + { + "name" : "CMAKE_ANDROID_NDK", + "properties" : + [ + { + "name" : "HELPSTRING", + "value" : "No help, variable specified on the command line." + } + ], + "type" : "UNINITIALIZED", + "value" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973" + }, + { + "name" : "CMAKE_AR", + "properties" : + [ + { + "name" : "ADVANCED", + "value" : "1" + }, + { + "name" : "HELPSTRING", + "value" : "Archiver" + } + ], + "type" : "FILEPATH", + "value" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/bin/llvm-ar" + }, + { + "name" : "CMAKE_ASM_FLAGS", + "properties" : + [ + { + "name" : "HELPSTRING", + "value" : "Flags used by the compiler during all build types." + } + ], + "type" : "STRING", + "value" : "" + }, + { + "name" : "CMAKE_ASM_FLAGS_DEBUG", + "properties" : + [ + { + "name" : "HELPSTRING", + "value" : "Flags used by the compiler during debug builds." + } + ], + "type" : "STRING", + "value" : "" + }, + { + "name" : "CMAKE_ASM_FLAGS_RELEASE", + "properties" : + [ + { + "name" : "HELPSTRING", + "value" : "Flags used by the compiler during release builds." + } + ], + "type" : "STRING", + "value" : "" + }, + { + "name" : "CMAKE_BUILD_TYPE", + "properties" : + [ + { + "name" : "HELPSTRING", + "value" : "Choose the type of build, options are: None Debug Release RelWithDebInfo MinSizeRel ..." + } + ], + "type" : "STRING", + "value" : "RelWithDebInfo" + }, + { + "name" : "CMAKE_CACHEFILE_DIR", + "properties" : + [ + { + "name" : "HELPSTRING", + "value" : "This is the directory where this CMakeCache.txt was created" + } + ], + "type" : "INTERNAL", + "value" : "/Users/hamzaaleghwairyeen/development/App/Intaleq/android/app/.cxx/RelWithDebInfo/6t1m4b5v/armeabi-v7a" + }, + { + "name" : "CMAKE_CACHE_MAJOR_VERSION", + "properties" : + [ + { + "name" : "HELPSTRING", + "value" : "Major version of cmake used to create the current loaded cache" + } + ], + "type" : "INTERNAL", + "value" : "3" + }, + { + "name" : "CMAKE_CACHE_MINOR_VERSION", + "properties" : + [ + { + "name" : "HELPSTRING", + "value" : "Minor version of cmake used to create the current loaded cache" + } + ], + "type" : "INTERNAL", + "value" : "31" + }, + { + "name" : "CMAKE_CACHE_PATCH_VERSION", + "properties" : + [ + { + "name" : "HELPSTRING", + "value" : "Patch version of cmake used to create the current loaded cache" + } + ], + "type" : "INTERNAL", + "value" : "5" + }, + { + "name" : "CMAKE_COMMAND", + "properties" : + [ + { + "name" : "HELPSTRING", + "value" : "Path to CMake executable." + } + ], + "type" : "INTERNAL", + "value" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/bin/cmake" + }, + { + "name" : "CMAKE_CPACK_COMMAND", + "properties" : + [ + { + "name" : "HELPSTRING", + "value" : "Path to cpack program executable." + } + ], + "type" : "INTERNAL", + "value" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/bin/cpack" + }, + { + "name" : "CMAKE_CTEST_COMMAND", + "properties" : + [ + { + "name" : "HELPSTRING", + "value" : "Path to ctest program executable." + } + ], + "type" : "INTERNAL", + "value" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/bin/ctest" + }, + { + "name" : "CMAKE_CXX_COMPILER", + "properties" : + [ + { + "name" : "ADVANCED", + "value" : "1" + }, + { + "name" : "HELPSTRING", + "value" : "" + } + ], + "type" : "UNINITIALIZED", + "value" : "" + }, + { + "name" : "CMAKE_CXX_COMPILER_AR", + "properties" : + [ + { + "name" : "ADVANCED", + "value" : "1" + }, + { + "name" : "HELPSTRING", + "value" : "LLVM archiver" + } + ], + "type" : "FILEPATH", + "value" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/bin/llvm-ar" + }, + { + "name" : "CMAKE_CXX_COMPILER_CLANG_SCAN_DEPS", + "properties" : + [ + { + "name" : "ADVANCED", + "value" : "1" + }, + { + "name" : "HELPSTRING", + "value" : "`clang-scan-deps` dependency scanner" + } + ], + "type" : "FILEPATH", + "value" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/bin/clang-scan-deps" + }, + { + "name" : "CMAKE_CXX_COMPILER_RANLIB", + "properties" : + [ + { + "name" : "ADVANCED", + "value" : "1" + }, + { + "name" : "HELPSTRING", + "value" : "Generate index for LLVM archive" + } + ], + "type" : "FILEPATH", + "value" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/bin/llvm-ranlib" + }, + { + "name" : "CMAKE_CXX_FLAGS", + "properties" : + [ + { + "name" : "ADVANCED", + "value" : "1" + }, + { + "name" : "HELPSTRING", + "value" : "Flags used by the compiler during all build types." + } + ], + "type" : "STRING", + "value" : "" + }, + { + "name" : "CMAKE_CXX_FLAGS_DEBUG", + "properties" : + [ + { + "name" : "ADVANCED", + "value" : "1" + }, + { + "name" : "HELPSTRING", + "value" : "Flags used by the compiler during debug builds." + } + ], + "type" : "STRING", + "value" : "" + }, + { + "name" : "CMAKE_CXX_FLAGS_MINSIZEREL", + "properties" : + [ + { + "name" : "ADVANCED", + "value" : "1" + }, + { + "name" : "HELPSTRING", + "value" : "Flags used by the CXX compiler during MINSIZEREL builds." + } + ], + "type" : "STRING", + "value" : "-Os -DNDEBUG" + }, + { + "name" : "CMAKE_CXX_FLAGS_RELEASE", + "properties" : + [ + { + "name" : "ADVANCED", + "value" : "1" + }, + { + "name" : "HELPSTRING", + "value" : "Flags used by the compiler during release builds." + } + ], + "type" : "STRING", + "value" : "" + }, + { + "name" : "CMAKE_CXX_FLAGS_RELWITHDEBINFO", + "properties" : + [ + { + "name" : "ADVANCED", + "value" : "1" + }, + { + "name" : "HELPSTRING", + "value" : "Flags used by the CXX compiler during RELWITHDEBINFO builds." + } + ], + "type" : "STRING", + "value" : "-O2 -g -DNDEBUG" + }, + { + "name" : "CMAKE_CXX_STANDARD_LIBRARIES", + "properties" : + [ + { + "name" : "ADVANCED", + "value" : "1" + }, + { + "name" : "HELPSTRING", + "value" : "Libraries linked by default with all C++ applications." + } + ], + "type" : "STRING", + "value" : "-latomic -lm" + }, + { + "name" : "CMAKE_C_COMPILER", + "properties" : + [ + { + "name" : "ADVANCED", + "value" : "1" + }, + { + "name" : "HELPSTRING", + "value" : "" + } + ], + "type" : "UNINITIALIZED", + "value" : "" + }, + { + "name" : "CMAKE_C_COMPILER_AR", + "properties" : + [ + { + "name" : "ADVANCED", + "value" : "1" + }, + { + "name" : "HELPSTRING", + "value" : "LLVM archiver" + } + ], + "type" : "FILEPATH", + "value" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/bin/llvm-ar" + }, + { + "name" : "CMAKE_C_COMPILER_CLANG_SCAN_DEPS", + "properties" : + [ + { + "name" : "ADVANCED", + "value" : "1" + }, + { + "name" : "HELPSTRING", + "value" : "`clang-scan-deps` dependency scanner" + } + ], + "type" : "FILEPATH", + "value" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/bin/clang-scan-deps" + }, + { + "name" : "CMAKE_C_COMPILER_RANLIB", + "properties" : + [ + { + "name" : "ADVANCED", + "value" : "1" + }, + { + "name" : "HELPSTRING", + "value" : "Generate index for LLVM archive" + } + ], + "type" : "FILEPATH", + "value" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/bin/llvm-ranlib" + }, + { + "name" : "CMAKE_C_FLAGS", + "properties" : + [ + { + "name" : "ADVANCED", + "value" : "1" + }, + { + "name" : "HELPSTRING", + "value" : "Flags used by the compiler during all build types." + } + ], + "type" : "STRING", + "value" : "" + }, + { + "name" : "CMAKE_C_FLAGS_DEBUG", + "properties" : + [ + { + "name" : "ADVANCED", + "value" : "1" + }, + { + "name" : "HELPSTRING", + "value" : "Flags used by the compiler during debug builds." + } + ], + "type" : "STRING", + "value" : "" + }, + { + "name" : "CMAKE_C_FLAGS_MINSIZEREL", + "properties" : + [ + { + "name" : "ADVANCED", + "value" : "1" + }, + { + "name" : "HELPSTRING", + "value" : "Flags used by the C compiler during MINSIZEREL builds." + } + ], + "type" : "STRING", + "value" : "-Os -DNDEBUG" + }, + { + "name" : "CMAKE_C_FLAGS_RELEASE", + "properties" : + [ + { + "name" : "ADVANCED", + "value" : "1" + }, + { + "name" : "HELPSTRING", + "value" : "Flags used by the compiler during release builds." + } + ], + "type" : "STRING", + "value" : "" + }, + { + "name" : "CMAKE_C_FLAGS_RELWITHDEBINFO", + "properties" : + [ + { + "name" : "ADVANCED", + "value" : "1" + }, + { + "name" : "HELPSTRING", + "value" : "Flags used by the C compiler during RELWITHDEBINFO builds." + } + ], + "type" : "STRING", + "value" : "-O2 -g -DNDEBUG" + }, + { + "name" : "CMAKE_C_STANDARD_LIBRARIES", + "properties" : + [ + { + "name" : "ADVANCED", + "value" : "1" + }, + { + "name" : "HELPSTRING", + "value" : "Libraries linked by default with all C applications." + } + ], + "type" : "STRING", + "value" : "-latomic -lm" + }, + { + "name" : "CMAKE_DLLTOOL", + "properties" : + [ + { + "name" : "ADVANCED", + "value" : "1" + }, + { + "name" : "HELPSTRING", + "value" : "Path to a program." + } + ], + "type" : "FILEPATH", + "value" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/bin/llvm-dlltool" + }, + { + "name" : "CMAKE_EDIT_COMMAND", + "properties" : + [ + { + "name" : "HELPSTRING", + "value" : "Path to cache edit program executable." + } + ], + "type" : "INTERNAL", + "value" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/bin/ccmake" + }, + { + "name" : "CMAKE_EXECUTABLE_FORMAT", + "properties" : + [ + { + "name" : "HELPSTRING", + "value" : "Executable file format" + } + ], + "type" : "INTERNAL", + "value" : "ELF" + }, + { + "name" : "CMAKE_EXE_LINKER_FLAGS", + "properties" : + [ + { + "name" : "ADVANCED", + "value" : "1" + }, + { + "name" : "HELPSTRING", + "value" : "Flags used by the linker." + } + ], + "type" : "STRING", + "value" : "" + }, + { + "name" : "CMAKE_EXE_LINKER_FLAGS_DEBUG", + "properties" : + [ + { + "name" : "ADVANCED", + "value" : "1" + }, + { + "name" : "HELPSTRING", + "value" : "Flags used by the linker during DEBUG builds." + } + ], + "type" : "STRING", + "value" : "" + }, + { + "name" : "CMAKE_EXE_LINKER_FLAGS_MINSIZEREL", + "properties" : + [ + { + "name" : "ADVANCED", + "value" : "1" + }, + { + "name" : "HELPSTRING", + "value" : "Flags used by the linker during MINSIZEREL builds." + } + ], + "type" : "STRING", + "value" : "" + }, + { + "name" : "CMAKE_EXE_LINKER_FLAGS_RELEASE", + "properties" : + [ + { + "name" : "ADVANCED", + "value" : "1" + }, + { + "name" : "HELPSTRING", + "value" : "Flags used by the linker during RELEASE builds." + } + ], + "type" : "STRING", + "value" : "" + }, + { + "name" : "CMAKE_EXE_LINKER_FLAGS_RELWITHDEBINFO", + "properties" : + [ + { + "name" : "ADVANCED", + "value" : "1" + }, + { + "name" : "HELPSTRING", + "value" : "Flags used by the linker during RELWITHDEBINFO builds." + } + ], + "type" : "STRING", + "value" : "" + }, + { + "name" : "CMAKE_EXPORT_BUILD_DATABASE", + "properties" : + [ + { + "name" : "ADVANCED", + "value" : "1" + }, + { + "name" : "HELPSTRING", + "value" : "Enable/Disable output of build database during the build." + } + ], + "type" : "BOOL", + "value" : "" + }, + { + "name" : "CMAKE_EXPORT_COMPILE_COMMANDS", + "properties" : + [ + { + "name" : "HELPSTRING", + "value" : "No help, variable specified on the command line." + } + ], + "type" : "UNINITIALIZED", + "value" : "ON" + }, + { + "name" : "CMAKE_EXTRA_GENERATOR", + "properties" : + [ + { + "name" : "HELPSTRING", + "value" : "Name of external makefile project generator." + } + ], + "type" : "INTERNAL", + "value" : "" + }, + { + "name" : "CMAKE_FIND_PACKAGE_REDIRECTS_DIR", + "properties" : + [ + { + "name" : "HELPSTRING", + "value" : "Value Computed by CMake." + } + ], + "type" : "STATIC", + "value" : "/Users/hamzaaleghwairyeen/development/App/Intaleq/android/app/.cxx/RelWithDebInfo/6t1m4b5v/armeabi-v7a/CMakeFiles/pkgRedirects" + }, + { + "name" : "CMAKE_GENERATOR", + "properties" : + [ + { + "name" : "HELPSTRING", + "value" : "Name of generator." + } + ], + "type" : "INTERNAL", + "value" : "Ninja" + }, + { + "name" : "CMAKE_GENERATOR_INSTANCE", + "properties" : + [ + { + "name" : "HELPSTRING", + "value" : "Generator instance identifier." + } + ], + "type" : "INTERNAL", + "value" : "" + }, + { + "name" : "CMAKE_GENERATOR_PLATFORM", + "properties" : + [ + { + "name" : "HELPSTRING", + "value" : "Name of generator platform." + } + ], + "type" : "INTERNAL", + "value" : "" + }, + { + "name" : "CMAKE_GENERATOR_TOOLSET", + "properties" : + [ + { + "name" : "HELPSTRING", + "value" : "Name of generator toolset." + } + ], + "type" : "INTERNAL", + "value" : "" + }, + { + "name" : "CMAKE_HOME_DIRECTORY", + "properties" : + [ + { + "name" : "HELPSTRING", + "value" : "Source directory with the top level CMakeLists.txt file for this project" + } + ], + "type" : "INTERNAL", + "value" : "/Users/hamzaaleghwairyeen/development/App/Intaleq/android/app/src/main/cpp" + }, + { + "name" : "CMAKE_INSTALL_PREFIX", + "properties" : + [ + { + "name" : "HELPSTRING", + "value" : "Install path prefix, prepended onto install directories." + } + ], + "type" : "PATH", + "value" : "/usr/local" + }, + { + "name" : "CMAKE_INSTALL_SO_NO_EXE", + "properties" : + [ + { + "name" : "HELPSTRING", + "value" : "Install .so files without execute permission." + } + ], + "type" : "INTERNAL", + "value" : "0" + }, + { + "name" : "CMAKE_LIBRARY_OUTPUT_DIRECTORY", + "properties" : + [ + { + "name" : "HELPSTRING", + "value" : "No help, variable specified on the command line." + } + ], + "type" : "UNINITIALIZED", + "value" : "/Users/hamzaaleghwairyeen/development/App/Intaleq/build/app/intermediates/cxx/RelWithDebInfo/6t1m4b5v/obj/armeabi-v7a" + }, + { + "name" : "CMAKE_LINKER", + "properties" : + [ + { + "name" : "ADVANCED", + "value" : "1" + }, + { + "name" : "HELPSTRING", + "value" : "Path to a program." + } + ], + "type" : "FILEPATH", + "value" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/bin/ld.lld" + }, + { + "name" : "CMAKE_MAKE_PROGRAM", + "properties" : + [ + { + "name" : "HELPSTRING", + "value" : "No help, variable specified on the command line." + } + ], + "type" : "UNINITIALIZED", + "value" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/bin/ninja" + }, + { + "name" : "CMAKE_MODULE_LINKER_FLAGS", + "properties" : + [ + { + "name" : "ADVANCED", + "value" : "1" + }, + { + "name" : "HELPSTRING", + "value" : "Flags used by the linker during the creation of modules." + } + ], + "type" : "STRING", + "value" : "" + }, + { + "name" : "CMAKE_MODULE_LINKER_FLAGS_DEBUG", + "properties" : + [ + { + "name" : "ADVANCED", + "value" : "1" + }, + { + "name" : "HELPSTRING", + "value" : "Flags used by the linker during the creation of modules during DEBUG builds." + } + ], + "type" : "STRING", + "value" : "" + }, + { + "name" : "CMAKE_MODULE_LINKER_FLAGS_MINSIZEREL", + "properties" : + [ + { + "name" : "ADVANCED", + "value" : "1" + }, + { + "name" : "HELPSTRING", + "value" : "Flags used by the linker during the creation of modules during MINSIZEREL builds." + } + ], + "type" : "STRING", + "value" : "" + }, + { + "name" : "CMAKE_MODULE_LINKER_FLAGS_RELEASE", + "properties" : + [ + { + "name" : "ADVANCED", + "value" : "1" + }, + { + "name" : "HELPSTRING", + "value" : "Flags used by the linker during the creation of modules during RELEASE builds." + } + ], + "type" : "STRING", + "value" : "" + }, + { + "name" : "CMAKE_MODULE_LINKER_FLAGS_RELWITHDEBINFO", + "properties" : + [ + { + "name" : "ADVANCED", + "value" : "1" + }, + { + "name" : "HELPSTRING", + "value" : "Flags used by the linker during the creation of modules during RELWITHDEBINFO builds." + } + ], + "type" : "STRING", + "value" : "" + }, + { + "name" : "CMAKE_NM", + "properties" : + [ + { + "name" : "ADVANCED", + "value" : "1" + }, + { + "name" : "HELPSTRING", + "value" : "Path to a program." + } + ], + "type" : "FILEPATH", + "value" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/bin/llvm-nm" + }, + { + "name" : "CMAKE_NUMBER_OF_MAKEFILES", + "properties" : + [ + { + "name" : "HELPSTRING", + "value" : "number of local generators" + } + ], + "type" : "INTERNAL", + "value" : "1" + }, + { + "name" : "CMAKE_OBJCOPY", + "properties" : + [ + { + "name" : "ADVANCED", + "value" : "1" + }, + { + "name" : "HELPSTRING", + "value" : "Path to a program." + } + ], + "type" : "FILEPATH", + "value" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/bin/llvm-objcopy" + }, + { + "name" : "CMAKE_OBJDUMP", + "properties" : + [ + { + "name" : "ADVANCED", + "value" : "1" + }, + { + "name" : "HELPSTRING", + "value" : "Path to a program." + } + ], + "type" : "FILEPATH", + "value" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/bin/llvm-objdump" + }, + { + "name" : "CMAKE_PLATFORM_INFO_INITIALIZED", + "properties" : + [ + { + "name" : "HELPSTRING", + "value" : "Platform information initialized" + } + ], + "type" : "INTERNAL", + "value" : "1" + }, + { + "name" : "CMAKE_PROJECT_DESCRIPTION", + "properties" : + [ + { + "name" : "HELPSTRING", + "value" : "Value Computed by CMake" + } + ], + "type" : "STATIC", + "value" : "" + }, + { + "name" : "CMAKE_PROJECT_HOMEPAGE_URL", + "properties" : + [ + { + "name" : "HELPSTRING", + "value" : "Value Computed by CMake" + } + ], + "type" : "STATIC", + "value" : "" + }, + { + "name" : "CMAKE_PROJECT_NAME", + "properties" : + [ + { + "name" : "HELPSTRING", + "value" : "Value Computed by CMake" + } + ], + "type" : "STATIC", + "value" : "intaleq" + }, + { + "name" : "CMAKE_RANLIB", + "properties" : + [ + { + "name" : "ADVANCED", + "value" : "1" + }, + { + "name" : "HELPSTRING", + "value" : "Ranlib" + } + ], + "type" : "FILEPATH", + "value" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/bin/llvm-ranlib" + }, + { + "name" : "CMAKE_READELF", + "properties" : + [ + { + "name" : "ADVANCED", + "value" : "1" + }, + { + "name" : "HELPSTRING", + "value" : "Path to a program." + } + ], + "type" : "FILEPATH", + "value" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/bin/llvm-readelf" + }, + { + "name" : "CMAKE_ROOT", + "properties" : + [ + { + "name" : "HELPSTRING", + "value" : "Path to CMake installation." + } + ], + "type" : "INTERNAL", + "value" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31" + }, + { + "name" : "CMAKE_RUNTIME_OUTPUT_DIRECTORY", + "properties" : + [ + { + "name" : "HELPSTRING", + "value" : "No help, variable specified on the command line." + } + ], + "type" : "UNINITIALIZED", + "value" : "/Users/hamzaaleghwairyeen/development/App/Intaleq/build/app/intermediates/cxx/RelWithDebInfo/6t1m4b5v/obj/armeabi-v7a" + }, + { + "name" : "CMAKE_SHARED_LINKER_FLAGS", + "properties" : + [ + { + "name" : "ADVANCED", + "value" : "1" + }, + { + "name" : "HELPSTRING", + "value" : "Flags used by the linker during the creation of dll's." + } + ], + "type" : "STRING", + "value" : "" + }, + { + "name" : "CMAKE_SHARED_LINKER_FLAGS_DEBUG", + "properties" : + [ + { + "name" : "ADVANCED", + "value" : "1" + }, + { + "name" : "HELPSTRING", + "value" : "Flags used by the linker during the creation of shared libraries during DEBUG builds." + } + ], + "type" : "STRING", + "value" : "" + }, + { + "name" : "CMAKE_SHARED_LINKER_FLAGS_MINSIZEREL", + "properties" : + [ + { + "name" : "ADVANCED", + "value" : "1" + }, + { + "name" : "HELPSTRING", + "value" : "Flags used by the linker during the creation of shared libraries during MINSIZEREL builds." + } + ], + "type" : "STRING", + "value" : "" + }, + { + "name" : "CMAKE_SHARED_LINKER_FLAGS_RELEASE", + "properties" : + [ + { + "name" : "ADVANCED", + "value" : "1" + }, + { + "name" : "HELPSTRING", + "value" : "Flags used by the linker during the creation of shared libraries during RELEASE builds." + } + ], + "type" : "STRING", + "value" : "" + }, + { + "name" : "CMAKE_SHARED_LINKER_FLAGS_RELWITHDEBINFO", + "properties" : + [ + { + "name" : "ADVANCED", + "value" : "1" + }, + { + "name" : "HELPSTRING", + "value" : "Flags used by the linker during the creation of shared libraries during RELWITHDEBINFO builds." + } + ], + "type" : "STRING", + "value" : "" + }, + { + "name" : "CMAKE_SKIP_INSTALL_RPATH", + "properties" : + [ + { + "name" : "ADVANCED", + "value" : "1" + }, + { + "name" : "HELPSTRING", + "value" : "If set, runtime paths are not added when installing shared libraries, but are added when building." + } + ], + "type" : "BOOL", + "value" : "NO" + }, + { + "name" : "CMAKE_SKIP_RPATH", + "properties" : + [ + { + "name" : "ADVANCED", + "value" : "1" + }, + { + "name" : "HELPSTRING", + "value" : "If set, runtime paths are not added when using shared libraries." + } + ], + "type" : "BOOL", + "value" : "NO" + }, + { + "name" : "CMAKE_STATIC_LINKER_FLAGS", + "properties" : + [ + { + "name" : "ADVANCED", + "value" : "1" + }, + { + "name" : "HELPSTRING", + "value" : "Flags used by the linker during the creation of static libraries during all build types." + } + ], + "type" : "STRING", + "value" : "" + }, + { + "name" : "CMAKE_STATIC_LINKER_FLAGS_DEBUG", + "properties" : + [ + { + "name" : "ADVANCED", + "value" : "1" + }, + { + "name" : "HELPSTRING", + "value" : "Flags used by the linker during the creation of static libraries during DEBUG builds." + } + ], + "type" : "STRING", + "value" : "" + }, + { + "name" : "CMAKE_STATIC_LINKER_FLAGS_MINSIZEREL", + "properties" : + [ + { + "name" : "ADVANCED", + "value" : "1" + }, + { + "name" : "HELPSTRING", + "value" : "Flags used by the linker during the creation of static libraries during MINSIZEREL builds." + } + ], + "type" : "STRING", + "value" : "" + }, + { + "name" : "CMAKE_STATIC_LINKER_FLAGS_RELEASE", + "properties" : + [ + { + "name" : "ADVANCED", + "value" : "1" + }, + { + "name" : "HELPSTRING", + "value" : "Flags used by the linker during the creation of static libraries during RELEASE builds." + } + ], + "type" : "STRING", + "value" : "" + }, + { + "name" : "CMAKE_STATIC_LINKER_FLAGS_RELWITHDEBINFO", + "properties" : + [ + { + "name" : "ADVANCED", + "value" : "1" + }, + { + "name" : "HELPSTRING", + "value" : "Flags used by the linker during the creation of static libraries during RELWITHDEBINFO builds." + } + ], + "type" : "STRING", + "value" : "" + }, + { + "name" : "CMAKE_STRIP", + "properties" : + [ + { + "name" : "ADVANCED", + "value" : "1" + }, + { + "name" : "HELPSTRING", + "value" : "Strip" + } + ], + "type" : "FILEPATH", + "value" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/bin/llvm-strip" + }, + { + "name" : "CMAKE_SYSTEM_NAME", + "properties" : + [ + { + "name" : "HELPSTRING", + "value" : "No help, variable specified on the command line." + } + ], + "type" : "UNINITIALIZED", + "value" : "Android" + }, + { + "name" : "CMAKE_SYSTEM_VERSION", + "properties" : + [ + { + "name" : "HELPSTRING", + "value" : "No help, variable specified on the command line." + } + ], + "type" : "UNINITIALIZED", + "value" : "23" + }, + { + "name" : "CMAKE_TAPI", + "properties" : + [ + { + "name" : "ADVANCED", + "value" : "1" + }, + { + "name" : "HELPSTRING", + "value" : "Path to a program." + } + ], + "type" : "FILEPATH", + "value" : "CMAKE_TAPI-NOTFOUND" + }, + { + "name" : "CMAKE_TOOLCHAIN_FILE", + "properties" : + [ + { + "name" : "HELPSTRING", + "value" : "The CMake toolchain file" + } + ], + "type" : "FILEPATH", + "value" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/build/cmake/android.toolchain.cmake" + }, + { + "name" : "CMAKE_UNAME", + "properties" : + [ + { + "name" : "HELPSTRING", + "value" : "uname command" + } + ], + "type" : "INTERNAL", + "value" : "/usr/bin/uname" + }, + { + "name" : "CMAKE_VERBOSE_MAKEFILE", + "properties" : + [ + { + "name" : "ADVANCED", + "value" : "1" + }, + { + "name" : "HELPSTRING", + "value" : "If this value is on, makefiles will be generated without the .SILENT directive, and all commands will be echoed to the console during the make. This is useful for debugging only. With Visual Studio IDE projects all commands are done without /nologo." + } + ], + "type" : "BOOL", + "value" : "FALSE" + }, + { + "name" : "_CMAKE_CXX_LINKER_PUSHPOP_STATE_SUPPORTED", + "properties" : + [ + { + "name" : "HELPSTRING", + "value" : "linker supports push/pop state" + } + ], + "type" : "INTERNAL", + "value" : "TRUE" + }, + { + "name" : "_CMAKE_C_LINKER_PUSHPOP_STATE_SUPPORTED", + "properties" : + [ + { + "name" : "HELPSTRING", + "value" : "linker supports push/pop state" + } + ], + "type" : "INTERNAL", + "value" : "TRUE" + }, + { + "name" : "_CMAKE_LINKER_PUSHPOP_STATE_SUPPORTED", + "properties" : + [ + { + "name" : "HELPSTRING", + "value" : "linker supports push/pop state" + } + ], + "type" : "INTERNAL", + "value" : "TRUE" + }, + { + "name" : "intaleq_BINARY_DIR", + "properties" : + [ + { + "name" : "HELPSTRING", + "value" : "Value Computed by CMake" + } + ], + "type" : "STATIC", + "value" : "/Users/hamzaaleghwairyeen/development/App/Intaleq/android/app/.cxx/RelWithDebInfo/6t1m4b5v/armeabi-v7a" + }, + { + "name" : "intaleq_IS_TOP_LEVEL", + "properties" : + [ + { + "name" : "HELPSTRING", + "value" : "Value Computed by CMake" + } + ], + "type" : "STATIC", + "value" : "ON" + }, + { + "name" : "intaleq_SOURCE_DIR", + "properties" : + [ + { + "name" : "HELPSTRING", + "value" : "Value Computed by CMake" + } + ], + "type" : "STATIC", + "value" : "/Users/hamzaaleghwairyeen/development/App/Intaleq/android/app/src/main/cpp" + }, + { + "name" : "log-lib", + "properties" : + [ + { + "name" : "HELPSTRING", + "value" : "Path to a library." + } + ], + "type" : "FILEPATH", + "value" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/lib/arm-linux-androideabi/23/liblog.so" + }, + { + "name" : "native-lib_LIB_DEPENDS", + "properties" : + [ + { + "name" : "HELPSTRING", + "value" : "Dependencies for the target" + } + ], + "type" : "STATIC", + "value" : "general;/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/lib/arm-linux-androideabi/23/liblog.so;" + } + ], + "kind" : "cache", + "version" : + { + "major" : 2, + "minor" : 0 + } +} diff --git a/siro_rider/android/app/.cxx/RelWithDebInfo/6t1m4b5v/armeabi-v7a/.cmake/api/v1/reply/cmakeFiles-v1-d97ff819bedc1f668e78.json b/siro_rider/android/app/.cxx/RelWithDebInfo/6t1m4b5v/armeabi-v7a/.cmake/api/v1/reply/cmakeFiles-v1-d97ff819bedc1f668e78.json new file mode 100644 index 0000000..9db3dc0 --- /dev/null +++ b/siro_rider/android/app/.cxx/RelWithDebInfo/6t1m4b5v/armeabi-v7a/.cmake/api/v1/reply/cmakeFiles-v1-d97ff819bedc1f668e78.json @@ -0,0 +1,968 @@ +{ + "inputs" : + [ + { + "path" : "CMakeLists.txt" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeDetermineSystem.cmake" + }, + { + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/build/cmake/android.toolchain.cmake" + }, + { + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/build/cmake/android-legacy.toolchain.cmake" + }, + { + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/build/cmake/abis.cmake" + }, + { + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/build/cmake/platforms.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Platform/Android-Determine.cmake" + }, + { + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/build/cmake/hooks/pre/Android-Determine.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeSystem.cmake.in" + }, + { + "isGenerated" : true, + "path" : "/Users/hamzaaleghwairyeen/development/App/Intaleq/android/app/.cxx/RelWithDebInfo/6t1m4b5v/armeabi-v7a/CMakeFiles/3.31.5-g6cf5163/CMakeSystem.cmake" + }, + { + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/build/cmake/android.toolchain.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeSystemSpecificInitialize.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Platform/Android-Initialize.cmake" + }, + { + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/build/cmake/hooks/pre/Android-Initialize.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Platform/Linux-Initialize.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeDetermineCCompiler.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeDetermineCompiler.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Platform/Android-Determine-C.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Platform/Android/Determine-Compiler.cmake" + }, + { + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/build/cmake/hooks/pre/Determine-Compiler.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeDetermineCompilerId.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeCompilerIdDetection.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/ADSP-DetermineCompiler.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/ARMCC-DetermineCompiler.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/ARMClang-DetermineCompiler.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/AppleClang-DetermineCompiler.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/Clang-DetermineCompilerInternal.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/Borland-DetermineCompiler.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/Bruce-C-DetermineCompiler.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/Clang-DetermineCompiler.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/Clang-DetermineCompilerInternal.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/Compaq-C-DetermineCompiler.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/Cray-DetermineCompiler.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/CrayClang-DetermineCompiler.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/Embarcadero-DetermineCompiler.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/Fujitsu-DetermineCompiler.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/FujitsuClang-DetermineCompiler.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/GHS-DetermineCompiler.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/GNU-C-DetermineCompiler.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/HP-C-DetermineCompiler.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/IAR-DetermineCompiler.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/IBMClang-C-DetermineCompiler.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/Intel-DetermineCompiler.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/IntelLLVM-DetermineCompiler.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/LCC-C-DetermineCompiler.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/MSVC-DetermineCompiler.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/NVHPC-DetermineCompiler.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/NVIDIA-DetermineCompiler.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/OpenWatcom-DetermineCompiler.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/OrangeC-DetermineCompiler.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/PGI-DetermineCompiler.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/PathScale-DetermineCompiler.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/SCO-DetermineCompiler.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/SDCC-C-DetermineCompiler.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/SunPro-C-DetermineCompiler.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/TI-DetermineCompiler.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/TIClang-DetermineCompiler.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/Tasking-DetermineCompiler.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/TinyCC-C-DetermineCompiler.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/VisualAge-C-DetermineCompiler.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/IBMCPP-C-DetermineVersionInternal.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/Watcom-DetermineCompiler.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/XL-C-DetermineCompiler.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/IBMCPP-C-DetermineVersionInternal.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/XLClang-C-DetermineCompiler.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/zOS-C-DetermineCompiler.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/IBMCPP-C-DetermineVersionInternal.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeFindBinUtils.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/Clang-FindBinUtils.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeCCompiler.cmake.in" + }, + { + "isGenerated" : true, + "path" : "/Users/hamzaaleghwairyeen/development/App/Intaleq/android/app/.cxx/RelWithDebInfo/6t1m4b5v/armeabi-v7a/CMakeFiles/3.31.5-g6cf5163/CMakeCCompiler.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeDetermineCXXCompiler.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeDetermineCompiler.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Platform/Android-Determine-CXX.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Platform/Android/Determine-Compiler.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeDetermineCompilerId.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeCompilerIdDetection.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/ADSP-DetermineCompiler.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/ARMCC-DetermineCompiler.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/ARMClang-DetermineCompiler.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/AppleClang-DetermineCompiler.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/Clang-DetermineCompilerInternal.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/Borland-DetermineCompiler.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/Clang-DetermineCompiler.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/Clang-DetermineCompilerInternal.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/Compaq-CXX-DetermineCompiler.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/Cray-DetermineCompiler.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/CrayClang-DetermineCompiler.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/Embarcadero-DetermineCompiler.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/Fujitsu-DetermineCompiler.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/FujitsuClang-DetermineCompiler.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/GHS-DetermineCompiler.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/GNU-CXX-DetermineCompiler.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/HP-CXX-DetermineCompiler.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/IAR-DetermineCompiler.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/IBMClang-CXX-DetermineCompiler.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/Intel-DetermineCompiler.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/IntelLLVM-DetermineCompiler.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/LCC-CXX-DetermineCompiler.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/MSVC-DetermineCompiler.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/NVHPC-DetermineCompiler.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/NVIDIA-DetermineCompiler.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/OpenWatcom-DetermineCompiler.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/OrangeC-DetermineCompiler.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/PGI-DetermineCompiler.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/PathScale-DetermineCompiler.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/SCO-DetermineCompiler.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/SunPro-CXX-DetermineCompiler.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/TI-DetermineCompiler.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/TIClang-DetermineCompiler.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/Tasking-DetermineCompiler.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/VisualAge-CXX-DetermineCompiler.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/IBMCPP-CXX-DetermineVersionInternal.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/Watcom-DetermineCompiler.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/XL-CXX-DetermineCompiler.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/IBMCPP-CXX-DetermineVersionInternal.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/XLClang-CXX-DetermineCompiler.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/zOS-CXX-DetermineCompiler.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/IBMCPP-CXX-DetermineVersionInternal.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeFindBinUtils.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/Clang-FindBinUtils.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeCXXCompiler.cmake.in" + }, + { + "isGenerated" : true, + "path" : "/Users/hamzaaleghwairyeen/development/App/Intaleq/android/app/.cxx/RelWithDebInfo/6t1m4b5v/armeabi-v7a/CMakeFiles/3.31.5-g6cf5163/CMakeCXXCompiler.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeSystemSpecificInformation.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeGenericSystem.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeInitializeConfigs.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Platform/Android.cmake" + }, + { + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/build/cmake/hooks/pre/Android.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Platform/Linux.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Platform/UnixPaths.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeCInformation.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeLanguageInformation.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/Clang-C.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/Clang.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/CMakeCommonCompilerMacros.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/GNU.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/CMakeCommonCompilerMacros.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Platform/Android-Clang-C.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Platform/Android-Clang.cmake" + }, + { + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/build/cmake/hooks/pre/Android-Clang.cmake" + }, + { + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/build/cmake/flags.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeCommonLanguageInclude.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeTestCCompiler.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeTestCompilerCommon.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeDetermineCompilerABI.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Internal/CMakeDetermineLinkerId.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeParseImplicitIncludeInfo.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeParseImplicitLinkInfo.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeParseLibraryArchitecture.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeTestCompilerCommon.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeCCompilerABI.c" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeDetermineCompilerSupport.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Internal/FeatureTesting.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeCCompiler.cmake.in" + }, + { + "isGenerated" : true, + "path" : "/Users/hamzaaleghwairyeen/development/App/Intaleq/android/app/.cxx/RelWithDebInfo/6t1m4b5v/armeabi-v7a/CMakeFiles/3.31.5-g6cf5163/CMakeCCompiler.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Internal/CMakeCLinkerInformation.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Internal/CMakeCommonLinkerInformation.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Linker/LLD-C.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Linker/LLD.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Linker/GNU.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Platform/Linker/Android-LLD-C.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Platform/Linker/Linux-LLD-C.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Platform/Linker/Linux-LLD.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Platform/Linker/Linux-GNU.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Platform/Linker/GNU.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeCXXInformation.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeLanguageInformation.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/Clang-CXX.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/Clang.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Platform/Android-Clang-CXX.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Platform/Android-Clang.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeCommonLanguageInclude.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeTestCXXCompiler.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeTestCompilerCommon.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeDetermineCompilerABI.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Internal/CMakeDetermineLinkerId.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeParseImplicitIncludeInfo.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeParseImplicitLinkInfo.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeParseLibraryArchitecture.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeTestCompilerCommon.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeCXXCompilerABI.cpp" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeDetermineCompilerSupport.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Internal/FeatureTesting.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/Clang-CXX-CXXImportStd.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/Clang-CXX-CXXImportStd.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeCXXCompiler.cmake.in" + }, + { + "isGenerated" : true, + "path" : "/Users/hamzaaleghwairyeen/development/App/Intaleq/android/app/.cxx/RelWithDebInfo/6t1m4b5v/armeabi-v7a/CMakeFiles/3.31.5-g6cf5163/CMakeCXXCompiler.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Internal/CMakeCXXLinkerInformation.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Internal/CMakeCommonLinkerInformation.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Linker/LLD-CXX.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Linker/LLD.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Platform/Linker/Android-LLD-CXX.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Platform/Linker/Linux-LLD-CXX.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Platform/Linker/Linux-LLD.cmake" + } + ], + "kind" : "cmakeFiles", + "paths" : + { + "build" : "/Users/hamzaaleghwairyeen/development/App/Intaleq/android/app/.cxx/RelWithDebInfo/6t1m4b5v/armeabi-v7a", + "source" : "/Users/hamzaaleghwairyeen/development/App/Intaleq/android/app/src/main/cpp" + }, + "version" : + { + "major" : 1, + "minor" : 1 + } +} diff --git a/siro_rider/android/app/.cxx/RelWithDebInfo/6t1m4b5v/armeabi-v7a/.cmake/api/v1/reply/codemodel-v2-2cd405323bccec3049e3.json b/siro_rider/android/app/.cxx/RelWithDebInfo/6t1m4b5v/armeabi-v7a/.cmake/api/v1/reply/codemodel-v2-2cd405323bccec3049e3.json new file mode 100644 index 0000000..300ad39 --- /dev/null +++ b/siro_rider/android/app/.cxx/RelWithDebInfo/6t1m4b5v/armeabi-v7a/.cmake/api/v1/reply/codemodel-v2-2cd405323bccec3049e3.json @@ -0,0 +1,60 @@ +{ + "configurations" : + [ + { + "directories" : + [ + { + "build" : ".", + "jsonFile" : "directory-.-RelWithDebInfo-f5ebdc15457944623624.json", + "minimumCMakeVersion" : + { + "string" : "3.6.0" + }, + "projectIndex" : 0, + "source" : ".", + "targetIndexes" : + [ + 0 + ] + } + ], + "name" : "RelWithDebInfo", + "projects" : + [ + { + "directoryIndexes" : + [ + 0 + ], + "name" : "intaleq", + "targetIndexes" : + [ + 0 + ] + } + ], + "targets" : + [ + { + "directoryIndex" : 0, + "id" : "native-lib::@6890427a1f51a3e7e1df", + "jsonFile" : "target-native-lib-RelWithDebInfo-bcf9e1b402252f2dca93.json", + "name" : "native-lib", + "projectIndex" : 0 + } + ] + } + ], + "kind" : "codemodel", + "paths" : + { + "build" : "/Users/hamzaaleghwairyeen/development/App/Intaleq/android/app/.cxx/RelWithDebInfo/6t1m4b5v/armeabi-v7a", + "source" : "/Users/hamzaaleghwairyeen/development/App/Intaleq/android/app/src/main/cpp" + }, + "version" : + { + "major" : 2, + "minor" : 7 + } +} diff --git a/siro_rider/android/app/.cxx/RelWithDebInfo/6t1m4b5v/armeabi-v7a/.cmake/api/v1/reply/directory-.-RelWithDebInfo-f5ebdc15457944623624.json b/siro_rider/android/app/.cxx/RelWithDebInfo/6t1m4b5v/armeabi-v7a/.cmake/api/v1/reply/directory-.-RelWithDebInfo-f5ebdc15457944623624.json new file mode 100644 index 0000000..3a67af9 --- /dev/null +++ b/siro_rider/android/app/.cxx/RelWithDebInfo/6t1m4b5v/armeabi-v7a/.cmake/api/v1/reply/directory-.-RelWithDebInfo-f5ebdc15457944623624.json @@ -0,0 +1,14 @@ +{ + "backtraceGraph" : + { + "commands" : [], + "files" : [], + "nodes" : [] + }, + "installers" : [], + "paths" : + { + "build" : ".", + "source" : "." + } +} diff --git a/siro_rider/android/app/.cxx/RelWithDebInfo/6t1m4b5v/armeabi-v7a/.cmake/api/v1/reply/index-2025-07-02T20-14-01-0683.json b/siro_rider/android/app/.cxx/RelWithDebInfo/6t1m4b5v/armeabi-v7a/.cmake/api/v1/reply/index-2025-07-02T20-14-01-0683.json new file mode 100644 index 0000000..c6c7789 --- /dev/null +++ b/siro_rider/android/app/.cxx/RelWithDebInfo/6t1m4b5v/armeabi-v7a/.cmake/api/v1/reply/index-2025-07-02T20-14-01-0683.json @@ -0,0 +1,92 @@ +{ + "cmake" : + { + "generator" : + { + "multiConfig" : false, + "name" : "Ninja" + }, + "paths" : + { + "cmake" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/bin/cmake", + "cpack" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/bin/cpack", + "ctest" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/bin/ctest", + "root" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31" + }, + "version" : + { + "isDirty" : false, + "major" : 3, + "minor" : 31, + "patch" : 5, + "string" : "3.31.5-g6cf5163", + "suffix" : "g6cf5163" + } + }, + "objects" : + [ + { + "jsonFile" : "codemodel-v2-2cd405323bccec3049e3.json", + "kind" : "codemodel", + "version" : + { + "major" : 2, + "minor" : 7 + } + }, + { + "jsonFile" : "cache-v2-d96be89e561ddbdb427b.json", + "kind" : "cache", + "version" : + { + "major" : 2, + "minor" : 0 + } + }, + { + "jsonFile" : "cmakeFiles-v1-d97ff819bedc1f668e78.json", + "kind" : "cmakeFiles", + "version" : + { + "major" : 1, + "minor" : 1 + } + } + ], + "reply" : + { + "client-agp" : + { + "cache-v2" : + { + "jsonFile" : "cache-v2-d96be89e561ddbdb427b.json", + "kind" : "cache", + "version" : + { + "major" : 2, + "minor" : 0 + } + }, + "cmakeFiles-v1" : + { + "jsonFile" : "cmakeFiles-v1-d97ff819bedc1f668e78.json", + "kind" : "cmakeFiles", + "version" : + { + "major" : 1, + "minor" : 1 + } + }, + "codemodel-v2" : + { + "jsonFile" : "codemodel-v2-2cd405323bccec3049e3.json", + "kind" : "codemodel", + "version" : + { + "major" : 2, + "minor" : 7 + } + } + } + } +} diff --git a/siro_rider/android/app/.cxx/RelWithDebInfo/6t1m4b5v/armeabi-v7a/.cmake/api/v1/reply/target-native-lib-RelWithDebInfo-bcf9e1b402252f2dca93.json b/siro_rider/android/app/.cxx/RelWithDebInfo/6t1m4b5v/armeabi-v7a/.cmake/api/v1/reply/target-native-lib-RelWithDebInfo-bcf9e1b402252f2dca93.json new file mode 100644 index 0000000..a0fe202 --- /dev/null +++ b/siro_rider/android/app/.cxx/RelWithDebInfo/6t1m4b5v/armeabi-v7a/.cmake/api/v1/reply/target-native-lib-RelWithDebInfo-bcf9e1b402252f2dca93.json @@ -0,0 +1,117 @@ +{ + "artifacts" : + [ + { + "path" : "/Users/hamzaaleghwairyeen/development/App/Intaleq/build/app/intermediates/cxx/RelWithDebInfo/6t1m4b5v/obj/armeabi-v7a/libnative-lib.so" + } + ], + "backtrace" : 1, + "backtraceGraph" : + { + "commands" : + [ + "add_library", + "target_link_libraries" + ], + "files" : + [ + "CMakeLists.txt" + ], + "nodes" : + [ + { + "file" : 0 + }, + { + "command" : 0, + "file" : 0, + "line" : 4, + "parent" : 0 + }, + { + "command" : 1, + "file" : 0, + "line" : 8, + "parent" : 0 + } + ] + }, + "compileGroups" : + [ + { + "compileCommandFragments" : + [ + { + "fragment" : "-g -DANDROID -fdata-sections -ffunction-sections -funwind-tables -fstack-protector-strong -no-canonical-prefixes -D_FORTIFY_SOURCE=2 -march=armv7-a -mthumb -Wformat -Werror=format-security -O2 -g -DNDEBUG -fPIC" + } + ], + "defines" : + [ + { + "define" : "native_lib_EXPORTS" + } + ], + "language" : "CXX", + "sourceIndexes" : + [ + 0 + ], + "sysroot" : + { + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot" + } + } + ], + "id" : "native-lib::@6890427a1f51a3e7e1df", + "link" : + { + "commandFragments" : + [ + { + "fragment" : "-static-libstdc++ -Wl,--build-id=sha1 -Wl,--no-rosegment -Wl,--no-undefined-version -Wl,--fatal-warnings -Wl,--no-undefined -Qunused-arguments -Wl,--gc-sections", + "role" : "flags" + }, + { + "backtrace" : 2, + "fragment" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/lib/arm-linux-androideabi/23/liblog.so", + "role" : "libraries" + }, + { + "fragment" : "-latomic -lm", + "role" : "libraries" + } + ], + "language" : "CXX", + "sysroot" : + { + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot" + } + }, + "name" : "native-lib", + "nameOnDisk" : "libnative-lib.so", + "paths" : + { + "build" : ".", + "source" : "." + }, + "sourceGroups" : + [ + { + "name" : "Source Files", + "sourceIndexes" : + [ + 0 + ] + } + ], + "sources" : + [ + { + "backtrace" : 1, + "compileGroupIndex" : 0, + "path" : "native-lib.cpp", + "sourceGroupIndex" : 0 + } + ], + "type" : "SHARED_LIBRARY" +} diff --git a/siro_rider/android/app/.cxx/RelWithDebInfo/6t1m4b5v/armeabi-v7a/.ninja_deps b/siro_rider/android/app/.cxx/RelWithDebInfo/6t1m4b5v/armeabi-v7a/.ninja_deps new file mode 100644 index 0000000..57f235a Binary files /dev/null and b/siro_rider/android/app/.cxx/RelWithDebInfo/6t1m4b5v/armeabi-v7a/.ninja_deps differ diff --git a/siro_rider/android/app/.cxx/RelWithDebInfo/6t1m4b5v/armeabi-v7a/.ninja_log b/siro_rider/android/app/.cxx/RelWithDebInfo/6t1m4b5v/armeabi-v7a/.ninja_log new file mode 100644 index 0000000..6fc0a94 --- /dev/null +++ b/siro_rider/android/app/.cxx/RelWithDebInfo/6t1m4b5v/armeabi-v7a/.ninja_log @@ -0,0 +1,5 @@ +# ninja log v5 +0 551 1751487242318633952 CMakeFiles/native-lib.dir/native-lib.cpp.o 943a9cffba2330e0 +553 594 1751487242362188347 /Users/hamzaaleghwairyeen/development/App/Intaleq/build/app/intermediates/cxx/RelWithDebInfo/6t1m4b5v/obj/armeabi-v7a/libnative-lib.so d9a4c1cc51cf777b +16 367 1751488088167594626 /Users/hamzaaleghwairyeen/development/App/Intaleq/build/app/intermediates/cxx/RelWithDebInfo/6t1m4b5v/obj/armeabi-v7a/libnative-lib.so d9a4c1cc51cf777b +6 507 1753054205297762776 /Users/hamzaaleghwairyeen/development/App/Intaleq/build/app/intermediates/cxx/RelWithDebInfo/6t1m4b5v/obj/armeabi-v7a/libnative-lib.so d9a4c1cc51cf777b diff --git a/siro_rider/android/app/.cxx/RelWithDebInfo/6t1m4b5v/armeabi-v7a/CMakeCache.txt b/siro_rider/android/app/.cxx/RelWithDebInfo/6t1m4b5v/armeabi-v7a/CMakeCache.txt new file mode 100644 index 0000000..86aeae8 --- /dev/null +++ b/siro_rider/android/app/.cxx/RelWithDebInfo/6t1m4b5v/armeabi-v7a/CMakeCache.txt @@ -0,0 +1,430 @@ +# This is the CMakeCache file. +# For build in directory: /Users/hamzaaleghwairyeen/development/App/Intaleq/android/app/.cxx/RelWithDebInfo/6t1m4b5v/armeabi-v7a +# It was generated by CMake: /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/bin/cmake +# You can edit this file to change values found and used by cmake. +# If you do not want to change any of the values, simply exit the editor. +# If you do want to change a value, simply edit, save, and exit the editor. +# The syntax for the file is as follows: +# KEY:TYPE=VALUE +# KEY is the name of a variable in the cache. +# TYPE is a hint to GUIs for the type of VALUE, DO NOT EDIT TYPE!. +# VALUE is the current value for the KEY. + +######################## +# EXTERNAL cache entries +######################## + +//No help, variable specified on the command line. +ANDROID_ABI:UNINITIALIZED=armeabi-v7a + +//No help, variable specified on the command line. +ANDROID_NDK:UNINITIALIZED=/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973 + +//No help, variable specified on the command line. +ANDROID_PLATFORM:UNINITIALIZED=android-23 + +//Path to a program. +CMAKE_ADDR2LINE:FILEPATH=/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/bin/llvm-addr2line + +//No help, variable specified on the command line. +CMAKE_ANDROID_ARCH_ABI:UNINITIALIZED=armeabi-v7a + +//No help, variable specified on the command line. +CMAKE_ANDROID_NDK:UNINITIALIZED=/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973 + +//Archiver +CMAKE_AR:FILEPATH=/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/bin/llvm-ar + +//Flags used by the compiler during all build types. +CMAKE_ASM_FLAGS:STRING= + +//Flags used by the compiler during debug builds. +CMAKE_ASM_FLAGS_DEBUG:STRING= + +//Flags used by the compiler during release builds. +CMAKE_ASM_FLAGS_RELEASE:STRING= + +//Choose the type of build, options are: None Debug Release RelWithDebInfo +// MinSizeRel ... +CMAKE_BUILD_TYPE:STRING=RelWithDebInfo + +//LLVM archiver +CMAKE_CXX_COMPILER_AR:FILEPATH=/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/bin/llvm-ar + +//`clang-scan-deps` dependency scanner +CMAKE_CXX_COMPILER_CLANG_SCAN_DEPS:FILEPATH=/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/bin/clang-scan-deps + +//Generate index for LLVM archive +CMAKE_CXX_COMPILER_RANLIB:FILEPATH=/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/bin/llvm-ranlib + +//Flags used by the compiler during all build types. +CMAKE_CXX_FLAGS:STRING= + +//Flags used by the compiler during debug builds. +CMAKE_CXX_FLAGS_DEBUG:STRING= + +//Flags used by the CXX compiler during MINSIZEREL builds. +CMAKE_CXX_FLAGS_MINSIZEREL:STRING=-Os -DNDEBUG + +//Flags used by the compiler during release builds. +CMAKE_CXX_FLAGS_RELEASE:STRING= + +//Flags used by the CXX compiler during RELWITHDEBINFO builds. +CMAKE_CXX_FLAGS_RELWITHDEBINFO:STRING=-O2 -g -DNDEBUG + +//Libraries linked by default with all C++ applications. +CMAKE_CXX_STANDARD_LIBRARIES:STRING=-latomic -lm + +//LLVM archiver +CMAKE_C_COMPILER_AR:FILEPATH=/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/bin/llvm-ar + +//`clang-scan-deps` dependency scanner +CMAKE_C_COMPILER_CLANG_SCAN_DEPS:FILEPATH=/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/bin/clang-scan-deps + +//Generate index for LLVM archive +CMAKE_C_COMPILER_RANLIB:FILEPATH=/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/bin/llvm-ranlib + +//Flags used by the compiler during all build types. +CMAKE_C_FLAGS:STRING= + +//Flags used by the compiler during debug builds. +CMAKE_C_FLAGS_DEBUG:STRING= + +//Flags used by the C compiler during MINSIZEREL builds. +CMAKE_C_FLAGS_MINSIZEREL:STRING=-Os -DNDEBUG + +//Flags used by the compiler during release builds. +CMAKE_C_FLAGS_RELEASE:STRING= + +//Flags used by the C compiler during RELWITHDEBINFO builds. +CMAKE_C_FLAGS_RELWITHDEBINFO:STRING=-O2 -g -DNDEBUG + +//Libraries linked by default with all C applications. +CMAKE_C_STANDARD_LIBRARIES:STRING=-latomic -lm + +//Path to a program. +CMAKE_DLLTOOL:FILEPATH=/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/bin/llvm-dlltool + +//Flags used by the linker. +CMAKE_EXE_LINKER_FLAGS:STRING= + +//Flags used by the linker during DEBUG builds. +CMAKE_EXE_LINKER_FLAGS_DEBUG:STRING= + +//Flags used by the linker during MINSIZEREL builds. +CMAKE_EXE_LINKER_FLAGS_MINSIZEREL:STRING= + +//Flags used by the linker during RELEASE builds. +CMAKE_EXE_LINKER_FLAGS_RELEASE:STRING= + +//Flags used by the linker during RELWITHDEBINFO builds. +CMAKE_EXE_LINKER_FLAGS_RELWITHDEBINFO:STRING= + +//Enable/Disable output of build database during the build. +CMAKE_EXPORT_BUILD_DATABASE:BOOL= + +//No help, variable specified on the command line. +CMAKE_EXPORT_COMPILE_COMMANDS:UNINITIALIZED=ON + +//Value Computed by CMake. +CMAKE_FIND_PACKAGE_REDIRECTS_DIR:STATIC=/Users/hamzaaleghwairyeen/development/App/Intaleq/android/app/.cxx/RelWithDebInfo/6t1m4b5v/armeabi-v7a/CMakeFiles/pkgRedirects + +//Install path prefix, prepended onto install directories. +CMAKE_INSTALL_PREFIX:PATH=/usr/local + +//No help, variable specified on the command line. +CMAKE_LIBRARY_OUTPUT_DIRECTORY:UNINITIALIZED=/Users/hamzaaleghwairyeen/development/App/Intaleq/build/app/intermediates/cxx/RelWithDebInfo/6t1m4b5v/obj/armeabi-v7a + +//Path to a program. +CMAKE_LINKER:FILEPATH=/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/bin/ld.lld + +//No help, variable specified on the command line. +CMAKE_MAKE_PROGRAM:UNINITIALIZED=/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/bin/ninja + +//Flags used by the linker during the creation of modules. +CMAKE_MODULE_LINKER_FLAGS:STRING= + +//Flags used by the linker during the creation of modules during +// DEBUG builds. +CMAKE_MODULE_LINKER_FLAGS_DEBUG:STRING= + +//Flags used by the linker during the creation of modules during +// MINSIZEREL builds. +CMAKE_MODULE_LINKER_FLAGS_MINSIZEREL:STRING= + +//Flags used by the linker during the creation of modules during +// RELEASE builds. +CMAKE_MODULE_LINKER_FLAGS_RELEASE:STRING= + +//Flags used by the linker during the creation of modules during +// RELWITHDEBINFO builds. +CMAKE_MODULE_LINKER_FLAGS_RELWITHDEBINFO:STRING= + +//Path to a program. +CMAKE_NM:FILEPATH=/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/bin/llvm-nm + +//Path to a program. +CMAKE_OBJCOPY:FILEPATH=/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/bin/llvm-objcopy + +//Path to a program. +CMAKE_OBJDUMP:FILEPATH=/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/bin/llvm-objdump + +//Value Computed by CMake +CMAKE_PROJECT_DESCRIPTION:STATIC= + +//Value Computed by CMake +CMAKE_PROJECT_HOMEPAGE_URL:STATIC= + +//Value Computed by CMake +CMAKE_PROJECT_NAME:STATIC=intaleq + +//Ranlib +CMAKE_RANLIB:FILEPATH=/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/bin/llvm-ranlib + +//Path to a program. +CMAKE_READELF:FILEPATH=/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/bin/llvm-readelf + +//No help, variable specified on the command line. +CMAKE_RUNTIME_OUTPUT_DIRECTORY:UNINITIALIZED=/Users/hamzaaleghwairyeen/development/App/Intaleq/build/app/intermediates/cxx/RelWithDebInfo/6t1m4b5v/obj/armeabi-v7a + +//Flags used by the linker during the creation of dll's. +CMAKE_SHARED_LINKER_FLAGS:STRING= + +//Flags used by the linker during the creation of shared libraries +// during DEBUG builds. +CMAKE_SHARED_LINKER_FLAGS_DEBUG:STRING= + +//Flags used by the linker during the creation of shared libraries +// during MINSIZEREL builds. +CMAKE_SHARED_LINKER_FLAGS_MINSIZEREL:STRING= + +//Flags used by the linker during the creation of shared libraries +// during RELEASE builds. +CMAKE_SHARED_LINKER_FLAGS_RELEASE:STRING= + +//Flags used by the linker during the creation of shared libraries +// during RELWITHDEBINFO builds. +CMAKE_SHARED_LINKER_FLAGS_RELWITHDEBINFO:STRING= + +//If set, runtime paths are not added when installing shared libraries, +// but are added when building. +CMAKE_SKIP_INSTALL_RPATH:BOOL=NO + +//If set, runtime paths are not added when using shared libraries. +CMAKE_SKIP_RPATH:BOOL=NO + +//Flags used by the linker during the creation of static libraries +// during all build types. +CMAKE_STATIC_LINKER_FLAGS:STRING= + +//Flags used by the linker during the creation of static libraries +// during DEBUG builds. +CMAKE_STATIC_LINKER_FLAGS_DEBUG:STRING= + +//Flags used by the linker during the creation of static libraries +// during MINSIZEREL builds. +CMAKE_STATIC_LINKER_FLAGS_MINSIZEREL:STRING= + +//Flags used by the linker during the creation of static libraries +// during RELEASE builds. +CMAKE_STATIC_LINKER_FLAGS_RELEASE:STRING= + +//Flags used by the linker during the creation of static libraries +// during RELWITHDEBINFO builds. +CMAKE_STATIC_LINKER_FLAGS_RELWITHDEBINFO:STRING= + +//Strip +CMAKE_STRIP:FILEPATH=/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/bin/llvm-strip + +//No help, variable specified on the command line. +CMAKE_SYSTEM_NAME:UNINITIALIZED=Android + +//No help, variable specified on the command line. +CMAKE_SYSTEM_VERSION:UNINITIALIZED=23 + +//Path to a program. +CMAKE_TAPI:FILEPATH=CMAKE_TAPI-NOTFOUND + +//The CMake toolchain file +CMAKE_TOOLCHAIN_FILE:FILEPATH=/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/build/cmake/android.toolchain.cmake + +//If this value is on, makefiles will be generated without the +// .SILENT directive, and all commands will be echoed to the console +// during the make. This is useful for debugging only. With Visual +// Studio IDE projects all commands are done without /nologo. +CMAKE_VERBOSE_MAKEFILE:BOOL=FALSE + +//Value Computed by CMake +intaleq_BINARY_DIR:STATIC=/Users/hamzaaleghwairyeen/development/App/Intaleq/android/app/.cxx/RelWithDebInfo/6t1m4b5v/armeabi-v7a + +//Value Computed by CMake +intaleq_IS_TOP_LEVEL:STATIC=ON + +//Value Computed by CMake +intaleq_SOURCE_DIR:STATIC=/Users/hamzaaleghwairyeen/development/App/Intaleq/android/app/src/main/cpp + +//Path to a library. +log-lib:FILEPATH=/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/lib/arm-linux-androideabi/23/liblog.so + +//Dependencies for the target +native-lib_LIB_DEPENDS:STATIC=general;/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/lib/arm-linux-androideabi/23/liblog.so; + + +######################## +# INTERNAL cache entries +######################## + +//ADVANCED property for variable: CMAKE_ADDR2LINE +CMAKE_ADDR2LINE-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_AR +CMAKE_AR-ADVANCED:INTERNAL=1 +//This is the directory where this CMakeCache.txt was created +CMAKE_CACHEFILE_DIR:INTERNAL=/Users/hamzaaleghwairyeen/development/App/Intaleq/android/app/.cxx/RelWithDebInfo/6t1m4b5v/armeabi-v7a +//Major version of cmake used to create the current loaded cache +CMAKE_CACHE_MAJOR_VERSION:INTERNAL=3 +//Minor version of cmake used to create the current loaded cache +CMAKE_CACHE_MINOR_VERSION:INTERNAL=31 +//Patch version of cmake used to create the current loaded cache +CMAKE_CACHE_PATCH_VERSION:INTERNAL=5 +//Path to CMake executable. +CMAKE_COMMAND:INTERNAL=/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/bin/cmake +//Path to cpack program executable. +CMAKE_CPACK_COMMAND:INTERNAL=/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/bin/cpack +//Path to ctest program executable. +CMAKE_CTEST_COMMAND:INTERNAL=/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/bin/ctest +//ADVANCED property for variable: CMAKE_CXX_COMPILER_AR +CMAKE_CXX_COMPILER_AR-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_CXX_COMPILER_CLANG_SCAN_DEPS +CMAKE_CXX_COMPILER_CLANG_SCAN_DEPS-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_CXX_COMPILER_RANLIB +CMAKE_CXX_COMPILER_RANLIB-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_CXX_FLAGS +CMAKE_CXX_FLAGS-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_CXX_FLAGS_DEBUG +CMAKE_CXX_FLAGS_DEBUG-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_CXX_FLAGS_MINSIZEREL +CMAKE_CXX_FLAGS_MINSIZEREL-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_CXX_FLAGS_RELEASE +CMAKE_CXX_FLAGS_RELEASE-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_CXX_FLAGS_RELWITHDEBINFO +CMAKE_CXX_FLAGS_RELWITHDEBINFO-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_CXX_STANDARD_LIBRARIES +CMAKE_CXX_STANDARD_LIBRARIES-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_C_COMPILER_AR +CMAKE_C_COMPILER_AR-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_C_COMPILER_CLANG_SCAN_DEPS +CMAKE_C_COMPILER_CLANG_SCAN_DEPS-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_C_COMPILER_RANLIB +CMAKE_C_COMPILER_RANLIB-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_C_FLAGS +CMAKE_C_FLAGS-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_C_FLAGS_DEBUG +CMAKE_C_FLAGS_DEBUG-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_C_FLAGS_MINSIZEREL +CMAKE_C_FLAGS_MINSIZEREL-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_C_FLAGS_RELEASE +CMAKE_C_FLAGS_RELEASE-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_C_FLAGS_RELWITHDEBINFO +CMAKE_C_FLAGS_RELWITHDEBINFO-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_C_STANDARD_LIBRARIES +CMAKE_C_STANDARD_LIBRARIES-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_DLLTOOL +CMAKE_DLLTOOL-ADVANCED:INTERNAL=1 +//Path to cache edit program executable. +CMAKE_EDIT_COMMAND:INTERNAL=/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/bin/ccmake +//Executable file format +CMAKE_EXECUTABLE_FORMAT:INTERNAL=ELF +//ADVANCED property for variable: CMAKE_EXE_LINKER_FLAGS +CMAKE_EXE_LINKER_FLAGS-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_EXE_LINKER_FLAGS_DEBUG +CMAKE_EXE_LINKER_FLAGS_DEBUG-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_EXE_LINKER_FLAGS_MINSIZEREL +CMAKE_EXE_LINKER_FLAGS_MINSIZEREL-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_EXE_LINKER_FLAGS_RELEASE +CMAKE_EXE_LINKER_FLAGS_RELEASE-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_EXE_LINKER_FLAGS_RELWITHDEBINFO +CMAKE_EXE_LINKER_FLAGS_RELWITHDEBINFO-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_EXPORT_BUILD_DATABASE +CMAKE_EXPORT_BUILD_DATABASE-ADVANCED:INTERNAL=1 +//Name of external makefile project generator. +CMAKE_EXTRA_GENERATOR:INTERNAL= +//Name of generator. +CMAKE_GENERATOR:INTERNAL=Ninja +//Generator instance identifier. +CMAKE_GENERATOR_INSTANCE:INTERNAL= +//Name of generator platform. +CMAKE_GENERATOR_PLATFORM:INTERNAL= +//Name of generator toolset. +CMAKE_GENERATOR_TOOLSET:INTERNAL= +//Source directory with the top level CMakeLists.txt file for this +// project +CMAKE_HOME_DIRECTORY:INTERNAL=/Users/hamzaaleghwairyeen/development/App/Intaleq/android/app/src/main/cpp +//Install .so files without execute permission. +CMAKE_INSTALL_SO_NO_EXE:INTERNAL=0 +//ADVANCED property for variable: CMAKE_LINKER +CMAKE_LINKER-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_MODULE_LINKER_FLAGS +CMAKE_MODULE_LINKER_FLAGS-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_MODULE_LINKER_FLAGS_DEBUG +CMAKE_MODULE_LINKER_FLAGS_DEBUG-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_MODULE_LINKER_FLAGS_MINSIZEREL +CMAKE_MODULE_LINKER_FLAGS_MINSIZEREL-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_MODULE_LINKER_FLAGS_RELEASE +CMAKE_MODULE_LINKER_FLAGS_RELEASE-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_MODULE_LINKER_FLAGS_RELWITHDEBINFO +CMAKE_MODULE_LINKER_FLAGS_RELWITHDEBINFO-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_NM +CMAKE_NM-ADVANCED:INTERNAL=1 +//number of local generators +CMAKE_NUMBER_OF_MAKEFILES:INTERNAL=1 +//ADVANCED property for variable: CMAKE_OBJCOPY +CMAKE_OBJCOPY-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_OBJDUMP +CMAKE_OBJDUMP-ADVANCED:INTERNAL=1 +//Platform information initialized +CMAKE_PLATFORM_INFO_INITIALIZED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_RANLIB +CMAKE_RANLIB-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_READELF +CMAKE_READELF-ADVANCED:INTERNAL=1 +//Path to CMake installation. +CMAKE_ROOT:INTERNAL=/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31 +//ADVANCED property for variable: CMAKE_SHARED_LINKER_FLAGS +CMAKE_SHARED_LINKER_FLAGS-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_SHARED_LINKER_FLAGS_DEBUG +CMAKE_SHARED_LINKER_FLAGS_DEBUG-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_SHARED_LINKER_FLAGS_MINSIZEREL +CMAKE_SHARED_LINKER_FLAGS_MINSIZEREL-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_SHARED_LINKER_FLAGS_RELEASE +CMAKE_SHARED_LINKER_FLAGS_RELEASE-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_SHARED_LINKER_FLAGS_RELWITHDEBINFO +CMAKE_SHARED_LINKER_FLAGS_RELWITHDEBINFO-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_SKIP_INSTALL_RPATH +CMAKE_SKIP_INSTALL_RPATH-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_SKIP_RPATH +CMAKE_SKIP_RPATH-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_STATIC_LINKER_FLAGS +CMAKE_STATIC_LINKER_FLAGS-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_STATIC_LINKER_FLAGS_DEBUG +CMAKE_STATIC_LINKER_FLAGS_DEBUG-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_STATIC_LINKER_FLAGS_MINSIZEREL +CMAKE_STATIC_LINKER_FLAGS_MINSIZEREL-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_STATIC_LINKER_FLAGS_RELEASE +CMAKE_STATIC_LINKER_FLAGS_RELEASE-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_STATIC_LINKER_FLAGS_RELWITHDEBINFO +CMAKE_STATIC_LINKER_FLAGS_RELWITHDEBINFO-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_STRIP +CMAKE_STRIP-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_TAPI +CMAKE_TAPI-ADVANCED:INTERNAL=1 +//uname command +CMAKE_UNAME:INTERNAL=/usr/bin/uname +//ADVANCED property for variable: CMAKE_VERBOSE_MAKEFILE +CMAKE_VERBOSE_MAKEFILE-ADVANCED:INTERNAL=1 +//linker supports push/pop state +_CMAKE_CXX_LINKER_PUSHPOP_STATE_SUPPORTED:INTERNAL=TRUE +//linker supports push/pop state +_CMAKE_C_LINKER_PUSHPOP_STATE_SUPPORTED:INTERNAL=TRUE +//linker supports push/pop state +_CMAKE_LINKER_PUSHPOP_STATE_SUPPORTED:INTERNAL=TRUE + diff --git a/siro_rider/android/app/.cxx/RelWithDebInfo/6t1m4b5v/armeabi-v7a/CMakeFiles/3.31.5-g6cf5163/CMakeCCompiler.cmake b/siro_rider/android/app/.cxx/RelWithDebInfo/6t1m4b5v/armeabi-v7a/CMakeFiles/3.31.5-g6cf5163/CMakeCCompiler.cmake new file mode 100644 index 0000000..48d6a82 --- /dev/null +++ b/siro_rider/android/app/.cxx/RelWithDebInfo/6t1m4b5v/armeabi-v7a/CMakeFiles/3.31.5-g6cf5163/CMakeCCompiler.cmake @@ -0,0 +1,81 @@ +set(CMAKE_C_COMPILER "/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/bin/clang") +set(CMAKE_C_COMPILER_ARG1 "") +set(CMAKE_C_COMPILER_ID "Clang") +set(CMAKE_C_COMPILER_VERSION "18.0.1") +set(CMAKE_C_COMPILER_VERSION_INTERNAL "") +set(CMAKE_C_COMPILER_WRAPPER "") +set(CMAKE_C_STANDARD_COMPUTED_DEFAULT "17") +set(CMAKE_C_EXTENSIONS_COMPUTED_DEFAULT "ON") +set(CMAKE_C_STANDARD_LATEST "23") +set(CMAKE_C_COMPILE_FEATURES "c_std_90;c_function_prototypes;c_std_99;c_restrict;c_variadic_macros;c_std_11;c_static_assert;c_std_17;c_std_23") +set(CMAKE_C90_COMPILE_FEATURES "c_std_90;c_function_prototypes") +set(CMAKE_C99_COMPILE_FEATURES "c_std_99;c_restrict;c_variadic_macros") +set(CMAKE_C11_COMPILE_FEATURES "c_std_11;c_static_assert") +set(CMAKE_C17_COMPILE_FEATURES "c_std_17") +set(CMAKE_C23_COMPILE_FEATURES "c_std_23") + +set(CMAKE_C_PLATFORM_ID "Linux") +set(CMAKE_C_SIMULATE_ID "") +set(CMAKE_C_COMPILER_FRONTEND_VARIANT "GNU") +set(CMAKE_C_SIMULATE_VERSION "") + + + + +set(CMAKE_AR "/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/bin/llvm-ar") +set(CMAKE_C_COMPILER_AR "/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/bin/llvm-ar") +set(CMAKE_RANLIB "/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/bin/llvm-ranlib") +set(CMAKE_C_COMPILER_RANLIB "/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/bin/llvm-ranlib") +set(CMAKE_LINKER "/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/bin/ld.lld") +set(CMAKE_LINKER_LINK "") +set(CMAKE_LINKER_LLD "") +set(CMAKE_C_COMPILER_LINKER "/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/bin/ld.lld") +set(CMAKE_C_COMPILER_LINKER_ID "LLD") +set(CMAKE_C_COMPILER_LINKER_VERSION 18.0.1) +set(CMAKE_C_COMPILER_LINKER_FRONTEND_VARIANT GNU) +set(CMAKE_MT "") +set(CMAKE_TAPI "CMAKE_TAPI-NOTFOUND") +set(CMAKE_COMPILER_IS_GNUCC ) +set(CMAKE_C_COMPILER_LOADED 1) +set(CMAKE_C_COMPILER_WORKS TRUE) +set(CMAKE_C_ABI_COMPILED TRUE) + +set(CMAKE_C_COMPILER_ENV_VAR "CC") + +set(CMAKE_C_COMPILER_ID_RUN 1) +set(CMAKE_C_SOURCE_FILE_EXTENSIONS c;m) +set(CMAKE_C_IGNORE_EXTENSIONS h;H;o;O;obj;OBJ;def;DEF;rc;RC) +set(CMAKE_C_LINKER_PREFERENCE 10) +set(CMAKE_C_LINKER_DEPFILE_SUPPORTED ) + +# Save compiler ABI information. +set(CMAKE_C_SIZEOF_DATA_PTR "4") +set(CMAKE_C_COMPILER_ABI "ELF") +set(CMAKE_C_BYTE_ORDER "LITTLE_ENDIAN") +set(CMAKE_C_LIBRARY_ARCHITECTURE "arm-linux-androideabi") + +if(CMAKE_C_SIZEOF_DATA_PTR) + set(CMAKE_SIZEOF_VOID_P "${CMAKE_C_SIZEOF_DATA_PTR}") +endif() + +if(CMAKE_C_COMPILER_ABI) + set(CMAKE_INTERNAL_PLATFORM_ABI "${CMAKE_C_COMPILER_ABI}") +endif() + +if(CMAKE_C_LIBRARY_ARCHITECTURE) + set(CMAKE_LIBRARY_ARCHITECTURE "arm-linux-androideabi") +endif() + +set(CMAKE_C_CL_SHOWINCLUDES_PREFIX "") +if(CMAKE_C_CL_SHOWINCLUDES_PREFIX) + set(CMAKE_CL_SHOWINCLUDES_PREFIX "${CMAKE_C_CL_SHOWINCLUDES_PREFIX}") +endif() + + + + + +set(CMAKE_C_IMPLICIT_INCLUDE_DIRECTORIES "/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/lib/clang/18/include;/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/include/arm-linux-androideabi;/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/include") +set(CMAKE_C_IMPLICIT_LINK_LIBRARIES "-l:libunwind.a;dl;c;-l:libunwind.a;dl") +set(CMAKE_C_IMPLICIT_LINK_DIRECTORIES "/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/lib/clang/18/lib/linux/arm;/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/lib/arm-linux-androideabi/23;/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/lib/arm-linux-androideabi;/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/lib") +set(CMAKE_C_IMPLICIT_LINK_FRAMEWORK_DIRECTORIES "") diff --git a/siro_rider/android/app/.cxx/RelWithDebInfo/6t1m4b5v/armeabi-v7a/CMakeFiles/3.31.5-g6cf5163/CMakeCXXCompiler.cmake b/siro_rider/android/app/.cxx/RelWithDebInfo/6t1m4b5v/armeabi-v7a/CMakeFiles/3.31.5-g6cf5163/CMakeCXXCompiler.cmake new file mode 100644 index 0000000..36605bb --- /dev/null +++ b/siro_rider/android/app/.cxx/RelWithDebInfo/6t1m4b5v/armeabi-v7a/CMakeFiles/3.31.5-g6cf5163/CMakeCXXCompiler.cmake @@ -0,0 +1,105 @@ +set(CMAKE_CXX_COMPILER "/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/bin/clang++") +set(CMAKE_CXX_COMPILER_ARG1 "") +set(CMAKE_CXX_COMPILER_ID "Clang") +set(CMAKE_CXX_COMPILER_VERSION "18.0.1") +set(CMAKE_CXX_COMPILER_VERSION_INTERNAL "") +set(CMAKE_CXX_COMPILER_WRAPPER "") +set(CMAKE_CXX_STANDARD_COMPUTED_DEFAULT "17") +set(CMAKE_CXX_EXTENSIONS_COMPUTED_DEFAULT "ON") +set(CMAKE_CXX_STANDARD_LATEST "26") +set(CMAKE_CXX_COMPILE_FEATURES "cxx_std_98;cxx_template_template_parameters;cxx_std_11;cxx_alias_templates;cxx_alignas;cxx_alignof;cxx_attributes;cxx_auto_type;cxx_constexpr;cxx_decltype;cxx_decltype_incomplete_return_types;cxx_default_function_template_args;cxx_defaulted_functions;cxx_defaulted_move_initializers;cxx_delegating_constructors;cxx_deleted_functions;cxx_enum_forward_declarations;cxx_explicit_conversions;cxx_extended_friend_declarations;cxx_extern_templates;cxx_final;cxx_func_identifier;cxx_generalized_initializers;cxx_inheriting_constructors;cxx_inline_namespaces;cxx_lambdas;cxx_local_type_template_args;cxx_long_long_type;cxx_noexcept;cxx_nonstatic_member_init;cxx_nullptr;cxx_override;cxx_range_for;cxx_raw_string_literals;cxx_reference_qualified_functions;cxx_right_angle_brackets;cxx_rvalue_references;cxx_sizeof_member;cxx_static_assert;cxx_strong_enums;cxx_thread_local;cxx_trailing_return_types;cxx_unicode_literals;cxx_uniform_initialization;cxx_unrestricted_unions;cxx_user_literals;cxx_variadic_macros;cxx_variadic_templates;cxx_std_14;cxx_aggregate_default_initializers;cxx_attribute_deprecated;cxx_binary_literals;cxx_contextual_conversions;cxx_decltype_auto;cxx_digit_separators;cxx_generic_lambdas;cxx_lambda_init_captures;cxx_relaxed_constexpr;cxx_return_type_deduction;cxx_variable_templates;cxx_std_17;cxx_std_20;cxx_std_23;cxx_std_26") +set(CMAKE_CXX98_COMPILE_FEATURES "cxx_std_98;cxx_template_template_parameters") +set(CMAKE_CXX11_COMPILE_FEATURES "cxx_std_11;cxx_alias_templates;cxx_alignas;cxx_alignof;cxx_attributes;cxx_auto_type;cxx_constexpr;cxx_decltype;cxx_decltype_incomplete_return_types;cxx_default_function_template_args;cxx_defaulted_functions;cxx_defaulted_move_initializers;cxx_delegating_constructors;cxx_deleted_functions;cxx_enum_forward_declarations;cxx_explicit_conversions;cxx_extended_friend_declarations;cxx_extern_templates;cxx_final;cxx_func_identifier;cxx_generalized_initializers;cxx_inheriting_constructors;cxx_inline_namespaces;cxx_lambdas;cxx_local_type_template_args;cxx_long_long_type;cxx_noexcept;cxx_nonstatic_member_init;cxx_nullptr;cxx_override;cxx_range_for;cxx_raw_string_literals;cxx_reference_qualified_functions;cxx_right_angle_brackets;cxx_rvalue_references;cxx_sizeof_member;cxx_static_assert;cxx_strong_enums;cxx_thread_local;cxx_trailing_return_types;cxx_unicode_literals;cxx_uniform_initialization;cxx_unrestricted_unions;cxx_user_literals;cxx_variadic_macros;cxx_variadic_templates") +set(CMAKE_CXX14_COMPILE_FEATURES "cxx_std_14;cxx_aggregate_default_initializers;cxx_attribute_deprecated;cxx_binary_literals;cxx_contextual_conversions;cxx_decltype_auto;cxx_digit_separators;cxx_generic_lambdas;cxx_lambda_init_captures;cxx_relaxed_constexpr;cxx_return_type_deduction;cxx_variable_templates") +set(CMAKE_CXX17_COMPILE_FEATURES "cxx_std_17") +set(CMAKE_CXX20_COMPILE_FEATURES "cxx_std_20") +set(CMAKE_CXX23_COMPILE_FEATURES "cxx_std_23") +set(CMAKE_CXX26_COMPILE_FEATURES "cxx_std_26") + +set(CMAKE_CXX_PLATFORM_ID "Linux") +set(CMAKE_CXX_SIMULATE_ID "") +set(CMAKE_CXX_COMPILER_FRONTEND_VARIANT "GNU") +set(CMAKE_CXX_SIMULATE_VERSION "") + + + + +set(CMAKE_AR "/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/bin/llvm-ar") +set(CMAKE_CXX_COMPILER_AR "/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/bin/llvm-ar") +set(CMAKE_RANLIB "/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/bin/llvm-ranlib") +set(CMAKE_CXX_COMPILER_RANLIB "/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/bin/llvm-ranlib") +set(CMAKE_LINKER "/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/bin/ld.lld") +set(CMAKE_LINKER_LINK "") +set(CMAKE_LINKER_LLD "") +set(CMAKE_CXX_COMPILER_LINKER "/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/bin/ld.lld") +set(CMAKE_CXX_COMPILER_LINKER_ID "LLD") +set(CMAKE_CXX_COMPILER_LINKER_VERSION 18.0.1) +set(CMAKE_CXX_COMPILER_LINKER_FRONTEND_VARIANT GNU) +set(CMAKE_MT "") +set(CMAKE_TAPI "CMAKE_TAPI-NOTFOUND") +set(CMAKE_COMPILER_IS_GNUCXX ) +set(CMAKE_CXX_COMPILER_LOADED 1) +set(CMAKE_CXX_COMPILER_WORKS TRUE) +set(CMAKE_CXX_ABI_COMPILED TRUE) + +set(CMAKE_CXX_COMPILER_ENV_VAR "CXX") + +set(CMAKE_CXX_COMPILER_ID_RUN 1) +set(CMAKE_CXX_SOURCE_FILE_EXTENSIONS C;M;c++;cc;cpp;cxx;m;mm;mpp;CPP;ixx;cppm;ccm;cxxm;c++m) +set(CMAKE_CXX_IGNORE_EXTENSIONS inl;h;hpp;HPP;H;o;O;obj;OBJ;def;DEF;rc;RC) + +foreach (lang IN ITEMS C OBJC OBJCXX) + if (CMAKE_${lang}_COMPILER_ID_RUN) + foreach(extension IN LISTS CMAKE_${lang}_SOURCE_FILE_EXTENSIONS) + list(REMOVE_ITEM CMAKE_CXX_SOURCE_FILE_EXTENSIONS ${extension}) + endforeach() + endif() +endforeach() + +set(CMAKE_CXX_LINKER_PREFERENCE 30) +set(CMAKE_CXX_LINKER_PREFERENCE_PROPAGATES 1) +set(CMAKE_CXX_LINKER_DEPFILE_SUPPORTED ) + +# Save compiler ABI information. +set(CMAKE_CXX_SIZEOF_DATA_PTR "4") +set(CMAKE_CXX_COMPILER_ABI "ELF") +set(CMAKE_CXX_BYTE_ORDER "LITTLE_ENDIAN") +set(CMAKE_CXX_LIBRARY_ARCHITECTURE "arm-linux-androideabi") + +if(CMAKE_CXX_SIZEOF_DATA_PTR) + set(CMAKE_SIZEOF_VOID_P "${CMAKE_CXX_SIZEOF_DATA_PTR}") +endif() + +if(CMAKE_CXX_COMPILER_ABI) + set(CMAKE_INTERNAL_PLATFORM_ABI "${CMAKE_CXX_COMPILER_ABI}") +endif() + +if(CMAKE_CXX_LIBRARY_ARCHITECTURE) + set(CMAKE_LIBRARY_ARCHITECTURE "arm-linux-androideabi") +endif() + +set(CMAKE_CXX_CL_SHOWINCLUDES_PREFIX "") +if(CMAKE_CXX_CL_SHOWINCLUDES_PREFIX) + set(CMAKE_CL_SHOWINCLUDES_PREFIX "${CMAKE_CXX_CL_SHOWINCLUDES_PREFIX}") +endif() + + + + + +set(CMAKE_CXX_IMPLICIT_INCLUDE_DIRECTORIES "/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/include/c++/v1;/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/lib/clang/18/include;/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/include/arm-linux-androideabi;/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/include") +set(CMAKE_CXX_IMPLICIT_LINK_LIBRARIES "c++;m;-l:libunwind.a;dl;c;-l:libunwind.a;dl") +set(CMAKE_CXX_IMPLICIT_LINK_DIRECTORIES "/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/lib/clang/18/lib/linux/arm;/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/lib/arm-linux-androideabi/23;/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/lib/arm-linux-androideabi;/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/lib") +set(CMAKE_CXX_IMPLICIT_LINK_FRAMEWORK_DIRECTORIES "") +set(CMAKE_CXX_COMPILER_CLANG_RESOURCE_DIR "/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/lib/clang/18") + +set(CMAKE_CXX_COMPILER_IMPORT_STD "") +### Imported target for C++23 standard library +set(CMAKE_CXX23_COMPILER_IMPORT_STD_NOT_FOUND_MESSAGE "Experimental `import std` support not enabled when detecting toolchain; it must be set before `CXX` is enabled (usually a `project()` call)") + + +### Imported target for C++26 standard library +set(CMAKE_CXX26_COMPILER_IMPORT_STD_NOT_FOUND_MESSAGE "Experimental `import std` support not enabled when detecting toolchain; it must be set before `CXX` is enabled (usually a `project()` call)") + + + diff --git a/siro_rider/android/app/.cxx/RelWithDebInfo/6t1m4b5v/armeabi-v7a/CMakeFiles/3.31.5-g6cf5163/CMakeDetermineCompilerABI_C.bin b/siro_rider/android/app/.cxx/RelWithDebInfo/6t1m4b5v/armeabi-v7a/CMakeFiles/3.31.5-g6cf5163/CMakeDetermineCompilerABI_C.bin new file mode 100755 index 0000000..90786f7 Binary files /dev/null and b/siro_rider/android/app/.cxx/RelWithDebInfo/6t1m4b5v/armeabi-v7a/CMakeFiles/3.31.5-g6cf5163/CMakeDetermineCompilerABI_C.bin differ diff --git a/siro_rider/android/app/.cxx/RelWithDebInfo/6t1m4b5v/armeabi-v7a/CMakeFiles/3.31.5-g6cf5163/CMakeDetermineCompilerABI_CXX.bin b/siro_rider/android/app/.cxx/RelWithDebInfo/6t1m4b5v/armeabi-v7a/CMakeFiles/3.31.5-g6cf5163/CMakeDetermineCompilerABI_CXX.bin new file mode 100755 index 0000000..1077a03 Binary files /dev/null and b/siro_rider/android/app/.cxx/RelWithDebInfo/6t1m4b5v/armeabi-v7a/CMakeFiles/3.31.5-g6cf5163/CMakeDetermineCompilerABI_CXX.bin differ diff --git a/siro_rider/android/app/.cxx/RelWithDebInfo/6t1m4b5v/armeabi-v7a/CMakeFiles/3.31.5-g6cf5163/CMakeSystem.cmake b/siro_rider/android/app/.cxx/RelWithDebInfo/6t1m4b5v/armeabi-v7a/CMakeFiles/3.31.5-g6cf5163/CMakeSystem.cmake new file mode 100644 index 0000000..dada03e --- /dev/null +++ b/siro_rider/android/app/.cxx/RelWithDebInfo/6t1m4b5v/armeabi-v7a/CMakeFiles/3.31.5-g6cf5163/CMakeSystem.cmake @@ -0,0 +1,15 @@ +set(CMAKE_HOST_SYSTEM "Darwin-24.5.0") +set(CMAKE_HOST_SYSTEM_NAME "Darwin") +set(CMAKE_HOST_SYSTEM_VERSION "24.5.0") +set(CMAKE_HOST_SYSTEM_PROCESSOR "arm64") + +include("/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/build/cmake/android.toolchain.cmake") + +set(CMAKE_SYSTEM "Android-1") +set(CMAKE_SYSTEM_NAME "Android") +set(CMAKE_SYSTEM_VERSION "1") +set(CMAKE_SYSTEM_PROCESSOR "armv7-a") + +set(CMAKE_CROSSCOMPILING "TRUE") + +set(CMAKE_SYSTEM_LOADED 1) diff --git a/siro_rider/android/app/.cxx/RelWithDebInfo/6t1m4b5v/armeabi-v7a/CMakeFiles/3.31.5-g6cf5163/CompilerIdC/CMakeCCompilerId.c b/siro_rider/android/app/.cxx/RelWithDebInfo/6t1m4b5v/armeabi-v7a/CMakeFiles/3.31.5-g6cf5163/CompilerIdC/CMakeCCompilerId.c new file mode 100644 index 0000000..8d8bb03 --- /dev/null +++ b/siro_rider/android/app/.cxx/RelWithDebInfo/6t1m4b5v/armeabi-v7a/CMakeFiles/3.31.5-g6cf5163/CompilerIdC/CMakeCCompilerId.c @@ -0,0 +1,904 @@ +#ifdef __cplusplus +# error "A C++ compiler has been selected for C." +#endif + +#if defined(__18CXX) +# define ID_VOID_MAIN +#endif +#if defined(__CLASSIC_C__) +/* cv-qualifiers did not exist in K&R C */ +# define const +# define volatile +#endif + +#if !defined(__has_include) +/* If the compiler does not have __has_include, pretend the answer is + always no. */ +# define __has_include(x) 0 +#endif + + +/* Version number components: V=Version, R=Revision, P=Patch + Version date components: YYYY=Year, MM=Month, DD=Day */ + +#if defined(__INTEL_COMPILER) || defined(__ICC) +# define COMPILER_ID "Intel" +# if defined(_MSC_VER) +# define SIMULATE_ID "MSVC" +# endif +# if defined(__GNUC__) +# define SIMULATE_ID "GNU" +# endif + /* __INTEL_COMPILER = VRP prior to 2021, and then VVVV for 2021 and later, + except that a few beta releases use the old format with V=2021. */ +# if __INTEL_COMPILER < 2021 || __INTEL_COMPILER == 202110 || __INTEL_COMPILER == 202111 +# define COMPILER_VERSION_MAJOR DEC(__INTEL_COMPILER/100) +# define COMPILER_VERSION_MINOR DEC(__INTEL_COMPILER/10 % 10) +# if defined(__INTEL_COMPILER_UPDATE) +# define COMPILER_VERSION_PATCH DEC(__INTEL_COMPILER_UPDATE) +# else +# define COMPILER_VERSION_PATCH DEC(__INTEL_COMPILER % 10) +# endif +# else +# define COMPILER_VERSION_MAJOR DEC(__INTEL_COMPILER) +# define COMPILER_VERSION_MINOR DEC(__INTEL_COMPILER_UPDATE) + /* The third version component from --version is an update index, + but no macro is provided for it. */ +# define COMPILER_VERSION_PATCH DEC(0) +# endif +# if defined(__INTEL_COMPILER_BUILD_DATE) + /* __INTEL_COMPILER_BUILD_DATE = YYYYMMDD */ +# define COMPILER_VERSION_TWEAK DEC(__INTEL_COMPILER_BUILD_DATE) +# endif +# if defined(_MSC_VER) + /* _MSC_VER = VVRR */ +# define SIMULATE_VERSION_MAJOR DEC(_MSC_VER / 100) +# define SIMULATE_VERSION_MINOR DEC(_MSC_VER % 100) +# endif +# if defined(__GNUC__) +# define SIMULATE_VERSION_MAJOR DEC(__GNUC__) +# elif defined(__GNUG__) +# define SIMULATE_VERSION_MAJOR DEC(__GNUG__) +# endif +# if defined(__GNUC_MINOR__) +# define SIMULATE_VERSION_MINOR DEC(__GNUC_MINOR__) +# endif +# if defined(__GNUC_PATCHLEVEL__) +# define SIMULATE_VERSION_PATCH DEC(__GNUC_PATCHLEVEL__) +# endif + +#elif (defined(__clang__) && defined(__INTEL_CLANG_COMPILER)) || defined(__INTEL_LLVM_COMPILER) +# define COMPILER_ID "IntelLLVM" +#if defined(_MSC_VER) +# define SIMULATE_ID "MSVC" +#endif +#if defined(__GNUC__) +# define SIMULATE_ID "GNU" +#endif +/* __INTEL_LLVM_COMPILER = VVVVRP prior to 2021.2.0, VVVVRRPP for 2021.2.0 and + * later. Look for 6 digit vs. 8 digit version number to decide encoding. + * VVVV is no smaller than the current year when a version is released. + */ +#if __INTEL_LLVM_COMPILER < 1000000L +# define COMPILER_VERSION_MAJOR DEC(__INTEL_LLVM_COMPILER/100) +# define COMPILER_VERSION_MINOR DEC(__INTEL_LLVM_COMPILER/10 % 10) +# define COMPILER_VERSION_PATCH DEC(__INTEL_LLVM_COMPILER % 10) +#else +# define COMPILER_VERSION_MAJOR DEC(__INTEL_LLVM_COMPILER/10000) +# define COMPILER_VERSION_MINOR DEC(__INTEL_LLVM_COMPILER/100 % 100) +# define COMPILER_VERSION_PATCH DEC(__INTEL_LLVM_COMPILER % 100) +#endif +#if defined(_MSC_VER) + /* _MSC_VER = VVRR */ +# define SIMULATE_VERSION_MAJOR DEC(_MSC_VER / 100) +# define SIMULATE_VERSION_MINOR DEC(_MSC_VER % 100) +#endif +#if defined(__GNUC__) +# define SIMULATE_VERSION_MAJOR DEC(__GNUC__) +#elif defined(__GNUG__) +# define SIMULATE_VERSION_MAJOR DEC(__GNUG__) +#endif +#if defined(__GNUC_MINOR__) +# define SIMULATE_VERSION_MINOR DEC(__GNUC_MINOR__) +#endif +#if defined(__GNUC_PATCHLEVEL__) +# define SIMULATE_VERSION_PATCH DEC(__GNUC_PATCHLEVEL__) +#endif + +#elif defined(__PATHCC__) +# define COMPILER_ID "PathScale" +# define COMPILER_VERSION_MAJOR DEC(__PATHCC__) +# define COMPILER_VERSION_MINOR DEC(__PATHCC_MINOR__) +# if defined(__PATHCC_PATCHLEVEL__) +# define COMPILER_VERSION_PATCH DEC(__PATHCC_PATCHLEVEL__) +# endif + +#elif defined(__BORLANDC__) && defined(__CODEGEARC_VERSION__) +# define COMPILER_ID "Embarcadero" +# define COMPILER_VERSION_MAJOR HEX(__CODEGEARC_VERSION__>>24 & 0x00FF) +# define COMPILER_VERSION_MINOR HEX(__CODEGEARC_VERSION__>>16 & 0x00FF) +# define COMPILER_VERSION_PATCH DEC(__CODEGEARC_VERSION__ & 0xFFFF) + +#elif defined(__BORLANDC__) +# define COMPILER_ID "Borland" + /* __BORLANDC__ = 0xVRR */ +# define COMPILER_VERSION_MAJOR HEX(__BORLANDC__>>8) +# define COMPILER_VERSION_MINOR HEX(__BORLANDC__ & 0xFF) + +#elif defined(__WATCOMC__) && __WATCOMC__ < 1200 +# define COMPILER_ID "Watcom" + /* __WATCOMC__ = VVRR */ +# define COMPILER_VERSION_MAJOR DEC(__WATCOMC__ / 100) +# define COMPILER_VERSION_MINOR DEC((__WATCOMC__ / 10) % 10) +# if (__WATCOMC__ % 10) > 0 +# define COMPILER_VERSION_PATCH DEC(__WATCOMC__ % 10) +# endif + +#elif defined(__WATCOMC__) +# define COMPILER_ID "OpenWatcom" + /* __WATCOMC__ = VVRP + 1100 */ +# define COMPILER_VERSION_MAJOR DEC((__WATCOMC__ - 1100) / 100) +# define COMPILER_VERSION_MINOR DEC((__WATCOMC__ / 10) % 10) +# if (__WATCOMC__ % 10) > 0 +# define COMPILER_VERSION_PATCH DEC(__WATCOMC__ % 10) +# endif + +#elif defined(__SUNPRO_C) +# define COMPILER_ID "SunPro" +# if __SUNPRO_C >= 0x5100 + /* __SUNPRO_C = 0xVRRP */ +# define COMPILER_VERSION_MAJOR HEX(__SUNPRO_C>>12) +# define COMPILER_VERSION_MINOR HEX(__SUNPRO_C>>4 & 0xFF) +# define COMPILER_VERSION_PATCH HEX(__SUNPRO_C & 0xF) +# else + /* __SUNPRO_CC = 0xVRP */ +# define COMPILER_VERSION_MAJOR HEX(__SUNPRO_C>>8) +# define COMPILER_VERSION_MINOR HEX(__SUNPRO_C>>4 & 0xF) +# define COMPILER_VERSION_PATCH HEX(__SUNPRO_C & 0xF) +# endif + +#elif defined(__HP_cc) +# define COMPILER_ID "HP" + /* __HP_cc = VVRRPP */ +# define COMPILER_VERSION_MAJOR DEC(__HP_cc/10000) +# define COMPILER_VERSION_MINOR DEC(__HP_cc/100 % 100) +# define COMPILER_VERSION_PATCH DEC(__HP_cc % 100) + +#elif defined(__DECC) +# define COMPILER_ID "Compaq" + /* __DECC_VER = VVRRTPPPP */ +# define COMPILER_VERSION_MAJOR DEC(__DECC_VER/10000000) +# define COMPILER_VERSION_MINOR DEC(__DECC_VER/100000 % 100) +# define COMPILER_VERSION_PATCH DEC(__DECC_VER % 10000) + +#elif defined(__IBMC__) && defined(__COMPILER_VER__) +# define COMPILER_ID "zOS" + /* __IBMC__ = VRP */ +# define COMPILER_VERSION_MAJOR DEC(__IBMC__/100) +# define COMPILER_VERSION_MINOR DEC(__IBMC__/10 % 10) +# define COMPILER_VERSION_PATCH DEC(__IBMC__ % 10) + +#elif defined(__open_xl__) && defined(__clang__) +# define COMPILER_ID "IBMClang" +# define COMPILER_VERSION_MAJOR DEC(__open_xl_version__) +# define COMPILER_VERSION_MINOR DEC(__open_xl_release__) +# define COMPILER_VERSION_PATCH DEC(__open_xl_modification__) +# define COMPILER_VERSION_TWEAK DEC(__open_xl_ptf_fix_level__) + + +#elif defined(__ibmxl__) && defined(__clang__) +# define COMPILER_ID "XLClang" +# define COMPILER_VERSION_MAJOR DEC(__ibmxl_version__) +# define COMPILER_VERSION_MINOR DEC(__ibmxl_release__) +# define COMPILER_VERSION_PATCH DEC(__ibmxl_modification__) +# define COMPILER_VERSION_TWEAK DEC(__ibmxl_ptf_fix_level__) + + +#elif defined(__IBMC__) && !defined(__COMPILER_VER__) && __IBMC__ >= 800 +# define COMPILER_ID "XL" + /* __IBMC__ = VRP */ +# define COMPILER_VERSION_MAJOR DEC(__IBMC__/100) +# define COMPILER_VERSION_MINOR DEC(__IBMC__/10 % 10) +# define COMPILER_VERSION_PATCH DEC(__IBMC__ % 10) + +#elif defined(__IBMC__) && !defined(__COMPILER_VER__) && __IBMC__ < 800 +# define COMPILER_ID "VisualAge" + /* __IBMC__ = VRP */ +# define COMPILER_VERSION_MAJOR DEC(__IBMC__/100) +# define COMPILER_VERSION_MINOR DEC(__IBMC__/10 % 10) +# define COMPILER_VERSION_PATCH DEC(__IBMC__ % 10) + +#elif defined(__NVCOMPILER) +# define COMPILER_ID "NVHPC" +# define COMPILER_VERSION_MAJOR DEC(__NVCOMPILER_MAJOR__) +# define COMPILER_VERSION_MINOR DEC(__NVCOMPILER_MINOR__) +# if defined(__NVCOMPILER_PATCHLEVEL__) +# define COMPILER_VERSION_PATCH DEC(__NVCOMPILER_PATCHLEVEL__) +# endif + +#elif defined(__PGI) +# define COMPILER_ID "PGI" +# define COMPILER_VERSION_MAJOR DEC(__PGIC__) +# define COMPILER_VERSION_MINOR DEC(__PGIC_MINOR__) +# if defined(__PGIC_PATCHLEVEL__) +# define COMPILER_VERSION_PATCH DEC(__PGIC_PATCHLEVEL__) +# endif + +#elif defined(__clang__) && defined(__cray__) +# define COMPILER_ID "CrayClang" +# define COMPILER_VERSION_MAJOR DEC(__cray_major__) +# define COMPILER_VERSION_MINOR DEC(__cray_minor__) +# define COMPILER_VERSION_PATCH DEC(__cray_patchlevel__) +# define COMPILER_VERSION_INTERNAL_STR __clang_version__ + + +#elif defined(_CRAYC) +# define COMPILER_ID "Cray" +# define COMPILER_VERSION_MAJOR DEC(_RELEASE_MAJOR) +# define COMPILER_VERSION_MINOR DEC(_RELEASE_MINOR) + +#elif defined(__TI_COMPILER_VERSION__) +# define COMPILER_ID "TI" + /* __TI_COMPILER_VERSION__ = VVVRRRPPP */ +# define COMPILER_VERSION_MAJOR DEC(__TI_COMPILER_VERSION__/1000000) +# define COMPILER_VERSION_MINOR DEC(__TI_COMPILER_VERSION__/1000 % 1000) +# define COMPILER_VERSION_PATCH DEC(__TI_COMPILER_VERSION__ % 1000) + +#elif defined(__CLANG_FUJITSU) +# define COMPILER_ID "FujitsuClang" +# define COMPILER_VERSION_MAJOR DEC(__FCC_major__) +# define COMPILER_VERSION_MINOR DEC(__FCC_minor__) +# define COMPILER_VERSION_PATCH DEC(__FCC_patchlevel__) +# define COMPILER_VERSION_INTERNAL_STR __clang_version__ + + +#elif defined(__FUJITSU) +# define COMPILER_ID "Fujitsu" +# if defined(__FCC_version__) +# define COMPILER_VERSION __FCC_version__ +# elif defined(__FCC_major__) +# define COMPILER_VERSION_MAJOR DEC(__FCC_major__) +# define COMPILER_VERSION_MINOR DEC(__FCC_minor__) +# define COMPILER_VERSION_PATCH DEC(__FCC_patchlevel__) +# endif +# if defined(__fcc_version) +# define COMPILER_VERSION_INTERNAL DEC(__fcc_version) +# elif defined(__FCC_VERSION) +# define COMPILER_VERSION_INTERNAL DEC(__FCC_VERSION) +# endif + + +#elif defined(__ghs__) +# define COMPILER_ID "GHS" +/* __GHS_VERSION_NUMBER = VVVVRP */ +# ifdef __GHS_VERSION_NUMBER +# define COMPILER_VERSION_MAJOR DEC(__GHS_VERSION_NUMBER / 100) +# define COMPILER_VERSION_MINOR DEC(__GHS_VERSION_NUMBER / 10 % 10) +# define COMPILER_VERSION_PATCH DEC(__GHS_VERSION_NUMBER % 10) +# endif + +#elif defined(__TASKING__) +# define COMPILER_ID "Tasking" + # define COMPILER_VERSION_MAJOR DEC(__VERSION__/1000) + # define COMPILER_VERSION_MINOR DEC(__VERSION__ % 100) +# define COMPILER_VERSION_INTERNAL DEC(__VERSION__) + +#elif defined(__ORANGEC__) +# define COMPILER_ID "OrangeC" +# define COMPILER_VERSION_MAJOR DEC(__ORANGEC_MAJOR__) +# define COMPILER_VERSION_MINOR DEC(__ORANGEC_MINOR__) +# define COMPILER_VERSION_PATCH DEC(__ORANGEC_PATCHLEVEL__) + +#elif defined(__TINYC__) +# define COMPILER_ID "TinyCC" + +#elif defined(__BCC__) +# define COMPILER_ID "Bruce" + +#elif defined(__SCO_VERSION__) +# define COMPILER_ID "SCO" + +#elif defined(__ARMCC_VERSION) && !defined(__clang__) +# define COMPILER_ID "ARMCC" +#if __ARMCC_VERSION >= 1000000 + /* __ARMCC_VERSION = VRRPPPP */ + # define COMPILER_VERSION_MAJOR DEC(__ARMCC_VERSION/1000000) + # define COMPILER_VERSION_MINOR DEC(__ARMCC_VERSION/10000 % 100) + # define COMPILER_VERSION_PATCH DEC(__ARMCC_VERSION % 10000) +#else + /* __ARMCC_VERSION = VRPPPP */ + # define COMPILER_VERSION_MAJOR DEC(__ARMCC_VERSION/100000) + # define COMPILER_VERSION_MINOR DEC(__ARMCC_VERSION/10000 % 10) + # define COMPILER_VERSION_PATCH DEC(__ARMCC_VERSION % 10000) +#endif + + +#elif defined(__clang__) && defined(__apple_build_version__) +# define COMPILER_ID "AppleClang" +# if defined(_MSC_VER) +# define SIMULATE_ID "MSVC" +# endif +# define COMPILER_VERSION_MAJOR DEC(__clang_major__) +# define COMPILER_VERSION_MINOR DEC(__clang_minor__) +# define COMPILER_VERSION_PATCH DEC(__clang_patchlevel__) +# if defined(_MSC_VER) + /* _MSC_VER = VVRR */ +# define SIMULATE_VERSION_MAJOR DEC(_MSC_VER / 100) +# define SIMULATE_VERSION_MINOR DEC(_MSC_VER % 100) +# endif +# define COMPILER_VERSION_TWEAK DEC(__apple_build_version__) + +#elif defined(__clang__) && defined(__ARMCOMPILER_VERSION) +# define COMPILER_ID "ARMClang" + # define COMPILER_VERSION_MAJOR DEC(__ARMCOMPILER_VERSION/1000000) + # define COMPILER_VERSION_MINOR DEC(__ARMCOMPILER_VERSION/10000 % 100) + # define COMPILER_VERSION_PATCH DEC(__ARMCOMPILER_VERSION/100 % 100) +# define COMPILER_VERSION_INTERNAL DEC(__ARMCOMPILER_VERSION) + +#elif defined(__clang__) && defined(__ti__) +# define COMPILER_ID "TIClang" + # define COMPILER_VERSION_MAJOR DEC(__ti_major__) + # define COMPILER_VERSION_MINOR DEC(__ti_minor__) + # define COMPILER_VERSION_PATCH DEC(__ti_patchlevel__) +# define COMPILER_VERSION_INTERNAL DEC(__ti_version__) + +#elif defined(__clang__) +# define COMPILER_ID "Clang" +# if defined(_MSC_VER) +# define SIMULATE_ID "MSVC" +# endif +# define COMPILER_VERSION_MAJOR DEC(__clang_major__) +# define COMPILER_VERSION_MINOR DEC(__clang_minor__) +# define COMPILER_VERSION_PATCH DEC(__clang_patchlevel__) +# if defined(_MSC_VER) + /* _MSC_VER = VVRR */ +# define SIMULATE_VERSION_MAJOR DEC(_MSC_VER / 100) +# define SIMULATE_VERSION_MINOR DEC(_MSC_VER % 100) +# endif + +#elif defined(__LCC__) && (defined(__GNUC__) || defined(__GNUG__) || defined(__MCST__)) +# define COMPILER_ID "LCC" +# define COMPILER_VERSION_MAJOR DEC(__LCC__ / 100) +# define COMPILER_VERSION_MINOR DEC(__LCC__ % 100) +# if defined(__LCC_MINOR__) +# define COMPILER_VERSION_PATCH DEC(__LCC_MINOR__) +# endif +# if defined(__GNUC__) && defined(__GNUC_MINOR__) +# define SIMULATE_ID "GNU" +# define SIMULATE_VERSION_MAJOR DEC(__GNUC__) +# define SIMULATE_VERSION_MINOR DEC(__GNUC_MINOR__) +# if defined(__GNUC_PATCHLEVEL__) +# define SIMULATE_VERSION_PATCH DEC(__GNUC_PATCHLEVEL__) +# endif +# endif + +#elif defined(__GNUC__) +# define COMPILER_ID "GNU" +# define COMPILER_VERSION_MAJOR DEC(__GNUC__) +# if defined(__GNUC_MINOR__) +# define COMPILER_VERSION_MINOR DEC(__GNUC_MINOR__) +# endif +# if defined(__GNUC_PATCHLEVEL__) +# define COMPILER_VERSION_PATCH DEC(__GNUC_PATCHLEVEL__) +# endif + +#elif defined(_MSC_VER) +# define COMPILER_ID "MSVC" + /* _MSC_VER = VVRR */ +# define COMPILER_VERSION_MAJOR DEC(_MSC_VER / 100) +# define COMPILER_VERSION_MINOR DEC(_MSC_VER % 100) +# if defined(_MSC_FULL_VER) +# if _MSC_VER >= 1400 + /* _MSC_FULL_VER = VVRRPPPPP */ +# define COMPILER_VERSION_PATCH DEC(_MSC_FULL_VER % 100000) +# else + /* _MSC_FULL_VER = VVRRPPPP */ +# define COMPILER_VERSION_PATCH DEC(_MSC_FULL_VER % 10000) +# endif +# endif +# if defined(_MSC_BUILD) +# define COMPILER_VERSION_TWEAK DEC(_MSC_BUILD) +# endif + +#elif defined(_ADI_COMPILER) +# define COMPILER_ID "ADSP" +#if defined(__VERSIONNUM__) + /* __VERSIONNUM__ = 0xVVRRPPTT */ +# define COMPILER_VERSION_MAJOR DEC(__VERSIONNUM__ >> 24 & 0xFF) +# define COMPILER_VERSION_MINOR DEC(__VERSIONNUM__ >> 16 & 0xFF) +# define COMPILER_VERSION_PATCH DEC(__VERSIONNUM__ >> 8 & 0xFF) +# define COMPILER_VERSION_TWEAK DEC(__VERSIONNUM__ & 0xFF) +#endif + +#elif defined(__IAR_SYSTEMS_ICC__) || defined(__IAR_SYSTEMS_ICC) +# define COMPILER_ID "IAR" +# if defined(__VER__) && defined(__ICCARM__) +# define COMPILER_VERSION_MAJOR DEC((__VER__) / 1000000) +# define COMPILER_VERSION_MINOR DEC(((__VER__) / 1000) % 1000) +# define COMPILER_VERSION_PATCH DEC((__VER__) % 1000) +# define COMPILER_VERSION_INTERNAL DEC(__IAR_SYSTEMS_ICC__) +# elif defined(__VER__) && (defined(__ICCAVR__) || defined(__ICCRX__) || defined(__ICCRH850__) || defined(__ICCRL78__) || defined(__ICC430__) || defined(__ICCRISCV__) || defined(__ICCV850__) || defined(__ICC8051__) || defined(__ICCSTM8__)) +# define COMPILER_VERSION_MAJOR DEC((__VER__) / 100) +# define COMPILER_VERSION_MINOR DEC((__VER__) - (((__VER__) / 100)*100)) +# define COMPILER_VERSION_PATCH DEC(__SUBVERSION__) +# define COMPILER_VERSION_INTERNAL DEC(__IAR_SYSTEMS_ICC__) +# endif + +#elif defined(__SDCC_VERSION_MAJOR) || defined(SDCC) +# define COMPILER_ID "SDCC" +# if defined(__SDCC_VERSION_MAJOR) +# define COMPILER_VERSION_MAJOR DEC(__SDCC_VERSION_MAJOR) +# define COMPILER_VERSION_MINOR DEC(__SDCC_VERSION_MINOR) +# define COMPILER_VERSION_PATCH DEC(__SDCC_VERSION_PATCH) +# else + /* SDCC = VRP */ +# define COMPILER_VERSION_MAJOR DEC(SDCC/100) +# define COMPILER_VERSION_MINOR DEC(SDCC/10 % 10) +# define COMPILER_VERSION_PATCH DEC(SDCC % 10) +# endif + + +/* These compilers are either not known or too old to define an + identification macro. Try to identify the platform and guess that + it is the native compiler. */ +#elif defined(__hpux) || defined(__hpua) +# define COMPILER_ID "HP" + +#else /* unknown compiler */ +# define COMPILER_ID "" +#endif + +/* Construct the string literal in pieces to prevent the source from + getting matched. Store it in a pointer rather than an array + because some compilers will just produce instructions to fill the + array rather than assigning a pointer to a static array. */ +char const* info_compiler = "INFO" ":" "compiler[" COMPILER_ID "]"; +#ifdef SIMULATE_ID +char const* info_simulate = "INFO" ":" "simulate[" SIMULATE_ID "]"; +#endif + +#ifdef __QNXNTO__ +char const* qnxnto = "INFO" ":" "qnxnto[]"; +#endif + +#if defined(__CRAYXT_COMPUTE_LINUX_TARGET) +char const *info_cray = "INFO" ":" "compiler_wrapper[CrayPrgEnv]"; +#endif + +#define STRINGIFY_HELPER(X) #X +#define STRINGIFY(X) STRINGIFY_HELPER(X) + +/* Identify known platforms by name. */ +#if defined(__linux) || defined(__linux__) || defined(linux) +# define PLATFORM_ID "Linux" + +#elif defined(__MSYS__) +# define PLATFORM_ID "MSYS" + +#elif defined(__CYGWIN__) +# define PLATFORM_ID "Cygwin" + +#elif defined(__MINGW32__) +# define PLATFORM_ID "MinGW" + +#elif defined(__APPLE__) +# define PLATFORM_ID "Darwin" + +#elif defined(_WIN32) || defined(__WIN32__) || defined(WIN32) +# define PLATFORM_ID "Windows" + +#elif defined(__FreeBSD__) || defined(__FreeBSD) +# define PLATFORM_ID "FreeBSD" + +#elif defined(__NetBSD__) || defined(__NetBSD) +# define PLATFORM_ID "NetBSD" + +#elif defined(__OpenBSD__) || defined(__OPENBSD) +# define PLATFORM_ID "OpenBSD" + +#elif defined(__sun) || defined(sun) +# define PLATFORM_ID "SunOS" + +#elif defined(_AIX) || defined(__AIX) || defined(__AIX__) || defined(__aix) || defined(__aix__) +# define PLATFORM_ID "AIX" + +#elif defined(__hpux) || defined(__hpux__) +# define PLATFORM_ID "HP-UX" + +#elif defined(__HAIKU__) +# define PLATFORM_ID "Haiku" + +#elif defined(__BeOS) || defined(__BEOS__) || defined(_BEOS) +# define PLATFORM_ID "BeOS" + +#elif defined(__QNX__) || defined(__QNXNTO__) +# define PLATFORM_ID "QNX" + +#elif defined(__tru64) || defined(_tru64) || defined(__TRU64__) +# define PLATFORM_ID "Tru64" + +#elif defined(__riscos) || defined(__riscos__) +# define PLATFORM_ID "RISCos" + +#elif defined(__sinix) || defined(__sinix__) || defined(__SINIX__) +# define PLATFORM_ID "SINIX" + +#elif defined(__UNIX_SV__) +# define PLATFORM_ID "UNIX_SV" + +#elif defined(__bsdos__) +# define PLATFORM_ID "BSDOS" + +#elif defined(_MPRAS) || defined(MPRAS) +# define PLATFORM_ID "MP-RAS" + +#elif defined(__osf) || defined(__osf__) +# define PLATFORM_ID "OSF1" + +#elif defined(_SCO_SV) || defined(SCO_SV) || defined(sco_sv) +# define PLATFORM_ID "SCO_SV" + +#elif defined(__ultrix) || defined(__ultrix__) || defined(_ULTRIX) +# define PLATFORM_ID "ULTRIX" + +#elif defined(__XENIX__) || defined(_XENIX) || defined(XENIX) +# define PLATFORM_ID "Xenix" + +#elif defined(__WATCOMC__) +# if defined(__LINUX__) +# define PLATFORM_ID "Linux" + +# elif defined(__DOS__) +# define PLATFORM_ID "DOS" + +# elif defined(__OS2__) +# define PLATFORM_ID "OS2" + +# elif defined(__WINDOWS__) +# define PLATFORM_ID "Windows3x" + +# elif defined(__VXWORKS__) +# define PLATFORM_ID "VxWorks" + +# else /* unknown platform */ +# define PLATFORM_ID +# endif + +#elif defined(__INTEGRITY) +# if defined(INT_178B) +# define PLATFORM_ID "Integrity178" + +# else /* regular Integrity */ +# define PLATFORM_ID "Integrity" +# endif + +# elif defined(_ADI_COMPILER) +# define PLATFORM_ID "ADSP" + +#else /* unknown platform */ +# define PLATFORM_ID + +#endif + +/* For windows compilers MSVC and Intel we can determine + the architecture of the compiler being used. This is because + the compilers do not have flags that can change the architecture, + but rather depend on which compiler is being used +*/ +#if defined(_WIN32) && defined(_MSC_VER) +# if defined(_M_IA64) +# define ARCHITECTURE_ID "IA64" + +# elif defined(_M_ARM64EC) +# define ARCHITECTURE_ID "ARM64EC" + +# elif defined(_M_X64) || defined(_M_AMD64) +# define ARCHITECTURE_ID "x64" + +# elif defined(_M_IX86) +# define ARCHITECTURE_ID "X86" + +# elif defined(_M_ARM64) +# define ARCHITECTURE_ID "ARM64" + +# elif defined(_M_ARM) +# if _M_ARM == 4 +# define ARCHITECTURE_ID "ARMV4I" +# elif _M_ARM == 5 +# define ARCHITECTURE_ID "ARMV5I" +# else +# define ARCHITECTURE_ID "ARMV" STRINGIFY(_M_ARM) +# endif + +# elif defined(_M_MIPS) +# define ARCHITECTURE_ID "MIPS" + +# elif defined(_M_SH) +# define ARCHITECTURE_ID "SHx" + +# else /* unknown architecture */ +# define ARCHITECTURE_ID "" +# endif + +#elif defined(__WATCOMC__) +# if defined(_M_I86) +# define ARCHITECTURE_ID "I86" + +# elif defined(_M_IX86) +# define ARCHITECTURE_ID "X86" + +# else /* unknown architecture */ +# define ARCHITECTURE_ID "" +# endif + +#elif defined(__IAR_SYSTEMS_ICC__) || defined(__IAR_SYSTEMS_ICC) +# if defined(__ICCARM__) +# define ARCHITECTURE_ID "ARM" + +# elif defined(__ICCRX__) +# define ARCHITECTURE_ID "RX" + +# elif defined(__ICCRH850__) +# define ARCHITECTURE_ID "RH850" + +# elif defined(__ICCRL78__) +# define ARCHITECTURE_ID "RL78" + +# elif defined(__ICCRISCV__) +# define ARCHITECTURE_ID "RISCV" + +# elif defined(__ICCAVR__) +# define ARCHITECTURE_ID "AVR" + +# elif defined(__ICC430__) +# define ARCHITECTURE_ID "MSP430" + +# elif defined(__ICCV850__) +# define ARCHITECTURE_ID "V850" + +# elif defined(__ICC8051__) +# define ARCHITECTURE_ID "8051" + +# elif defined(__ICCSTM8__) +# define ARCHITECTURE_ID "STM8" + +# else /* unknown architecture */ +# define ARCHITECTURE_ID "" +# endif + +#elif defined(__ghs__) +# if defined(__PPC64__) +# define ARCHITECTURE_ID "PPC64" + +# elif defined(__ppc__) +# define ARCHITECTURE_ID "PPC" + +# elif defined(__ARM__) +# define ARCHITECTURE_ID "ARM" + +# elif defined(__x86_64__) +# define ARCHITECTURE_ID "x64" + +# elif defined(__i386__) +# define ARCHITECTURE_ID "X86" + +# else /* unknown architecture */ +# define ARCHITECTURE_ID "" +# endif + +#elif defined(__clang__) && defined(__ti__) +# if defined(__ARM_ARCH) +# define ARCHITECTURE_ID "Arm" + +# else /* unknown architecture */ +# define ARCHITECTURE_ID "" +# endif + +#elif defined(__TI_COMPILER_VERSION__) +# if defined(__TI_ARM__) +# define ARCHITECTURE_ID "ARM" + +# elif defined(__MSP430__) +# define ARCHITECTURE_ID "MSP430" + +# elif defined(__TMS320C28XX__) +# define ARCHITECTURE_ID "TMS320C28x" + +# elif defined(__TMS320C6X__) || defined(_TMS320C6X) +# define ARCHITECTURE_ID "TMS320C6x" + +# else /* unknown architecture */ +# define ARCHITECTURE_ID "" +# endif + +# elif defined(__ADSPSHARC__) +# define ARCHITECTURE_ID "SHARC" + +# elif defined(__ADSPBLACKFIN__) +# define ARCHITECTURE_ID "Blackfin" + +#elif defined(__TASKING__) + +# if defined(__CTC__) || defined(__CPTC__) +# define ARCHITECTURE_ID "TriCore" + +# elif defined(__CMCS__) +# define ARCHITECTURE_ID "MCS" + +# elif defined(__CARM__) +# define ARCHITECTURE_ID "ARM" + +# elif defined(__CARC__) +# define ARCHITECTURE_ID "ARC" + +# elif defined(__C51__) +# define ARCHITECTURE_ID "8051" + +# elif defined(__CPCP__) +# define ARCHITECTURE_ID "PCP" + +# else +# define ARCHITECTURE_ID "" +# endif + +#else +# define ARCHITECTURE_ID +#endif + +/* Convert integer to decimal digit literals. */ +#define DEC(n) \ + ('0' + (((n) / 10000000)%10)), \ + ('0' + (((n) / 1000000)%10)), \ + ('0' + (((n) / 100000)%10)), \ + ('0' + (((n) / 10000)%10)), \ + ('0' + (((n) / 1000)%10)), \ + ('0' + (((n) / 100)%10)), \ + ('0' + (((n) / 10)%10)), \ + ('0' + ((n) % 10)) + +/* Convert integer to hex digit literals. */ +#define HEX(n) \ + ('0' + ((n)>>28 & 0xF)), \ + ('0' + ((n)>>24 & 0xF)), \ + ('0' + ((n)>>20 & 0xF)), \ + ('0' + ((n)>>16 & 0xF)), \ + ('0' + ((n)>>12 & 0xF)), \ + ('0' + ((n)>>8 & 0xF)), \ + ('0' + ((n)>>4 & 0xF)), \ + ('0' + ((n) & 0xF)) + +/* Construct a string literal encoding the version number. */ +#ifdef COMPILER_VERSION +char const* info_version = "INFO" ":" "compiler_version[" COMPILER_VERSION "]"; + +/* Construct a string literal encoding the version number components. */ +#elif defined(COMPILER_VERSION_MAJOR) +char const info_version[] = { + 'I', 'N', 'F', 'O', ':', + 'c','o','m','p','i','l','e','r','_','v','e','r','s','i','o','n','[', + COMPILER_VERSION_MAJOR, +# ifdef COMPILER_VERSION_MINOR + '.', COMPILER_VERSION_MINOR, +# ifdef COMPILER_VERSION_PATCH + '.', COMPILER_VERSION_PATCH, +# ifdef COMPILER_VERSION_TWEAK + '.', COMPILER_VERSION_TWEAK, +# endif +# endif +# endif + ']','\0'}; +#endif + +/* Construct a string literal encoding the internal version number. */ +#ifdef COMPILER_VERSION_INTERNAL +char const info_version_internal[] = { + 'I', 'N', 'F', 'O', ':', + 'c','o','m','p','i','l','e','r','_','v','e','r','s','i','o','n','_', + 'i','n','t','e','r','n','a','l','[', + COMPILER_VERSION_INTERNAL,']','\0'}; +#elif defined(COMPILER_VERSION_INTERNAL_STR) +char const* info_version_internal = "INFO" ":" "compiler_version_internal[" COMPILER_VERSION_INTERNAL_STR "]"; +#endif + +/* Construct a string literal encoding the version number components. */ +#ifdef SIMULATE_VERSION_MAJOR +char const info_simulate_version[] = { + 'I', 'N', 'F', 'O', ':', + 's','i','m','u','l','a','t','e','_','v','e','r','s','i','o','n','[', + SIMULATE_VERSION_MAJOR, +# ifdef SIMULATE_VERSION_MINOR + '.', SIMULATE_VERSION_MINOR, +# ifdef SIMULATE_VERSION_PATCH + '.', SIMULATE_VERSION_PATCH, +# ifdef SIMULATE_VERSION_TWEAK + '.', SIMULATE_VERSION_TWEAK, +# endif +# endif +# endif + ']','\0'}; +#endif + +/* Construct the string literal in pieces to prevent the source from + getting matched. Store it in a pointer rather than an array + because some compilers will just produce instructions to fill the + array rather than assigning a pointer to a static array. */ +char const* info_platform = "INFO" ":" "platform[" PLATFORM_ID "]"; +char const* info_arch = "INFO" ":" "arch[" ARCHITECTURE_ID "]"; + + + +#define C_STD_99 199901L +#define C_STD_11 201112L +#define C_STD_17 201710L +#define C_STD_23 202311L + +#ifdef __STDC_VERSION__ +# define C_STD __STDC_VERSION__ +#endif + +#if !defined(__STDC__) && !defined(__clang__) +# if defined(_MSC_VER) || defined(__ibmxl__) || defined(__IBMC__) +# define C_VERSION "90" +# else +# define C_VERSION +# endif +#elif C_STD > C_STD_17 +# define C_VERSION "23" +#elif C_STD > C_STD_11 +# define C_VERSION "17" +#elif C_STD > C_STD_99 +# define C_VERSION "11" +#elif C_STD >= C_STD_99 +# define C_VERSION "99" +#else +# define C_VERSION "90" +#endif +const char* info_language_standard_default = + "INFO" ":" "standard_default[" C_VERSION "]"; + +const char* info_language_extensions_default = "INFO" ":" "extensions_default[" +#if (defined(__clang__) || defined(__GNUC__) || defined(__xlC__) || \ + defined(__TI_COMPILER_VERSION__)) && \ + !defined(__STRICT_ANSI__) + "ON" +#else + "OFF" +#endif +"]"; + +/*--------------------------------------------------------------------------*/ + +#ifdef ID_VOID_MAIN +void main() {} +#else +# if defined(__CLASSIC_C__) +int main(argc, argv) int argc; char *argv[]; +# else +int main(int argc, char* argv[]) +# endif +{ + int require = 0; + require += info_compiler[argc]; + require += info_platform[argc]; + require += info_arch[argc]; +#ifdef COMPILER_VERSION_MAJOR + require += info_version[argc]; +#endif +#ifdef COMPILER_VERSION_INTERNAL + require += info_version_internal[argc]; +#endif +#ifdef SIMULATE_ID + require += info_simulate[argc]; +#endif +#ifdef SIMULATE_VERSION_MAJOR + require += info_simulate_version[argc]; +#endif +#if defined(__CRAYXT_COMPUTE_LINUX_TARGET) + require += info_cray[argc]; +#endif + require += info_language_standard_default[argc]; + require += info_language_extensions_default[argc]; + (void)argv; + return require; +} +#endif diff --git a/siro_rider/android/app/.cxx/RelWithDebInfo/6t1m4b5v/armeabi-v7a/CMakeFiles/3.31.5-g6cf5163/CompilerIdC/CMakeCCompilerId.o b/siro_rider/android/app/.cxx/RelWithDebInfo/6t1m4b5v/armeabi-v7a/CMakeFiles/3.31.5-g6cf5163/CompilerIdC/CMakeCCompilerId.o new file mode 100644 index 0000000..0f2fc29 Binary files /dev/null and b/siro_rider/android/app/.cxx/RelWithDebInfo/6t1m4b5v/armeabi-v7a/CMakeFiles/3.31.5-g6cf5163/CompilerIdC/CMakeCCompilerId.o differ diff --git a/siro_rider/android/app/.cxx/RelWithDebInfo/6t1m4b5v/armeabi-v7a/CMakeFiles/3.31.5-g6cf5163/CompilerIdCXX/CMakeCXXCompilerId.cpp b/siro_rider/android/app/.cxx/RelWithDebInfo/6t1m4b5v/armeabi-v7a/CMakeFiles/3.31.5-g6cf5163/CompilerIdCXX/CMakeCXXCompilerId.cpp new file mode 100644 index 0000000..da6c824 --- /dev/null +++ b/siro_rider/android/app/.cxx/RelWithDebInfo/6t1m4b5v/armeabi-v7a/CMakeFiles/3.31.5-g6cf5163/CompilerIdCXX/CMakeCXXCompilerId.cpp @@ -0,0 +1,919 @@ +/* This source file must have a .cpp extension so that all C++ compilers + recognize the extension without flags. Borland does not know .cxx for + example. */ +#ifndef __cplusplus +# error "A C compiler has been selected for C++." +#endif + +#if !defined(__has_include) +/* If the compiler does not have __has_include, pretend the answer is + always no. */ +# define __has_include(x) 0 +#endif + + +/* Version number components: V=Version, R=Revision, P=Patch + Version date components: YYYY=Year, MM=Month, DD=Day */ + +#if defined(__INTEL_COMPILER) || defined(__ICC) +# define COMPILER_ID "Intel" +# if defined(_MSC_VER) +# define SIMULATE_ID "MSVC" +# endif +# if defined(__GNUC__) +# define SIMULATE_ID "GNU" +# endif + /* __INTEL_COMPILER = VRP prior to 2021, and then VVVV for 2021 and later, + except that a few beta releases use the old format with V=2021. */ +# if __INTEL_COMPILER < 2021 || __INTEL_COMPILER == 202110 || __INTEL_COMPILER == 202111 +# define COMPILER_VERSION_MAJOR DEC(__INTEL_COMPILER/100) +# define COMPILER_VERSION_MINOR DEC(__INTEL_COMPILER/10 % 10) +# if defined(__INTEL_COMPILER_UPDATE) +# define COMPILER_VERSION_PATCH DEC(__INTEL_COMPILER_UPDATE) +# else +# define COMPILER_VERSION_PATCH DEC(__INTEL_COMPILER % 10) +# endif +# else +# define COMPILER_VERSION_MAJOR DEC(__INTEL_COMPILER) +# define COMPILER_VERSION_MINOR DEC(__INTEL_COMPILER_UPDATE) + /* The third version component from --version is an update index, + but no macro is provided for it. */ +# define COMPILER_VERSION_PATCH DEC(0) +# endif +# if defined(__INTEL_COMPILER_BUILD_DATE) + /* __INTEL_COMPILER_BUILD_DATE = YYYYMMDD */ +# define COMPILER_VERSION_TWEAK DEC(__INTEL_COMPILER_BUILD_DATE) +# endif +# if defined(_MSC_VER) + /* _MSC_VER = VVRR */ +# define SIMULATE_VERSION_MAJOR DEC(_MSC_VER / 100) +# define SIMULATE_VERSION_MINOR DEC(_MSC_VER % 100) +# endif +# if defined(__GNUC__) +# define SIMULATE_VERSION_MAJOR DEC(__GNUC__) +# elif defined(__GNUG__) +# define SIMULATE_VERSION_MAJOR DEC(__GNUG__) +# endif +# if defined(__GNUC_MINOR__) +# define SIMULATE_VERSION_MINOR DEC(__GNUC_MINOR__) +# endif +# if defined(__GNUC_PATCHLEVEL__) +# define SIMULATE_VERSION_PATCH DEC(__GNUC_PATCHLEVEL__) +# endif + +#elif (defined(__clang__) && defined(__INTEL_CLANG_COMPILER)) || defined(__INTEL_LLVM_COMPILER) +# define COMPILER_ID "IntelLLVM" +#if defined(_MSC_VER) +# define SIMULATE_ID "MSVC" +#endif +#if defined(__GNUC__) +# define SIMULATE_ID "GNU" +#endif +/* __INTEL_LLVM_COMPILER = VVVVRP prior to 2021.2.0, VVVVRRPP for 2021.2.0 and + * later. Look for 6 digit vs. 8 digit version number to decide encoding. + * VVVV is no smaller than the current year when a version is released. + */ +#if __INTEL_LLVM_COMPILER < 1000000L +# define COMPILER_VERSION_MAJOR DEC(__INTEL_LLVM_COMPILER/100) +# define COMPILER_VERSION_MINOR DEC(__INTEL_LLVM_COMPILER/10 % 10) +# define COMPILER_VERSION_PATCH DEC(__INTEL_LLVM_COMPILER % 10) +#else +# define COMPILER_VERSION_MAJOR DEC(__INTEL_LLVM_COMPILER/10000) +# define COMPILER_VERSION_MINOR DEC(__INTEL_LLVM_COMPILER/100 % 100) +# define COMPILER_VERSION_PATCH DEC(__INTEL_LLVM_COMPILER % 100) +#endif +#if defined(_MSC_VER) + /* _MSC_VER = VVRR */ +# define SIMULATE_VERSION_MAJOR DEC(_MSC_VER / 100) +# define SIMULATE_VERSION_MINOR DEC(_MSC_VER % 100) +#endif +#if defined(__GNUC__) +# define SIMULATE_VERSION_MAJOR DEC(__GNUC__) +#elif defined(__GNUG__) +# define SIMULATE_VERSION_MAJOR DEC(__GNUG__) +#endif +#if defined(__GNUC_MINOR__) +# define SIMULATE_VERSION_MINOR DEC(__GNUC_MINOR__) +#endif +#if defined(__GNUC_PATCHLEVEL__) +# define SIMULATE_VERSION_PATCH DEC(__GNUC_PATCHLEVEL__) +#endif + +#elif defined(__PATHCC__) +# define COMPILER_ID "PathScale" +# define COMPILER_VERSION_MAJOR DEC(__PATHCC__) +# define COMPILER_VERSION_MINOR DEC(__PATHCC_MINOR__) +# if defined(__PATHCC_PATCHLEVEL__) +# define COMPILER_VERSION_PATCH DEC(__PATHCC_PATCHLEVEL__) +# endif + +#elif defined(__BORLANDC__) && defined(__CODEGEARC_VERSION__) +# define COMPILER_ID "Embarcadero" +# define COMPILER_VERSION_MAJOR HEX(__CODEGEARC_VERSION__>>24 & 0x00FF) +# define COMPILER_VERSION_MINOR HEX(__CODEGEARC_VERSION__>>16 & 0x00FF) +# define COMPILER_VERSION_PATCH DEC(__CODEGEARC_VERSION__ & 0xFFFF) + +#elif defined(__BORLANDC__) +# define COMPILER_ID "Borland" + /* __BORLANDC__ = 0xVRR */ +# define COMPILER_VERSION_MAJOR HEX(__BORLANDC__>>8) +# define COMPILER_VERSION_MINOR HEX(__BORLANDC__ & 0xFF) + +#elif defined(__WATCOMC__) && __WATCOMC__ < 1200 +# define COMPILER_ID "Watcom" + /* __WATCOMC__ = VVRR */ +# define COMPILER_VERSION_MAJOR DEC(__WATCOMC__ / 100) +# define COMPILER_VERSION_MINOR DEC((__WATCOMC__ / 10) % 10) +# if (__WATCOMC__ % 10) > 0 +# define COMPILER_VERSION_PATCH DEC(__WATCOMC__ % 10) +# endif + +#elif defined(__WATCOMC__) +# define COMPILER_ID "OpenWatcom" + /* __WATCOMC__ = VVRP + 1100 */ +# define COMPILER_VERSION_MAJOR DEC((__WATCOMC__ - 1100) / 100) +# define COMPILER_VERSION_MINOR DEC((__WATCOMC__ / 10) % 10) +# if (__WATCOMC__ % 10) > 0 +# define COMPILER_VERSION_PATCH DEC(__WATCOMC__ % 10) +# endif + +#elif defined(__SUNPRO_CC) +# define COMPILER_ID "SunPro" +# if __SUNPRO_CC >= 0x5100 + /* __SUNPRO_CC = 0xVRRP */ +# define COMPILER_VERSION_MAJOR HEX(__SUNPRO_CC>>12) +# define COMPILER_VERSION_MINOR HEX(__SUNPRO_CC>>4 & 0xFF) +# define COMPILER_VERSION_PATCH HEX(__SUNPRO_CC & 0xF) +# else + /* __SUNPRO_CC = 0xVRP */ +# define COMPILER_VERSION_MAJOR HEX(__SUNPRO_CC>>8) +# define COMPILER_VERSION_MINOR HEX(__SUNPRO_CC>>4 & 0xF) +# define COMPILER_VERSION_PATCH HEX(__SUNPRO_CC & 0xF) +# endif + +#elif defined(__HP_aCC) +# define COMPILER_ID "HP" + /* __HP_aCC = VVRRPP */ +# define COMPILER_VERSION_MAJOR DEC(__HP_aCC/10000) +# define COMPILER_VERSION_MINOR DEC(__HP_aCC/100 % 100) +# define COMPILER_VERSION_PATCH DEC(__HP_aCC % 100) + +#elif defined(__DECCXX) +# define COMPILER_ID "Compaq" + /* __DECCXX_VER = VVRRTPPPP */ +# define COMPILER_VERSION_MAJOR DEC(__DECCXX_VER/10000000) +# define COMPILER_VERSION_MINOR DEC(__DECCXX_VER/100000 % 100) +# define COMPILER_VERSION_PATCH DEC(__DECCXX_VER % 10000) + +#elif defined(__IBMCPP__) && defined(__COMPILER_VER__) +# define COMPILER_ID "zOS" + /* __IBMCPP__ = VRP */ +# define COMPILER_VERSION_MAJOR DEC(__IBMCPP__/100) +# define COMPILER_VERSION_MINOR DEC(__IBMCPP__/10 % 10) +# define COMPILER_VERSION_PATCH DEC(__IBMCPP__ % 10) + +#elif defined(__open_xl__) && defined(__clang__) +# define COMPILER_ID "IBMClang" +# define COMPILER_VERSION_MAJOR DEC(__open_xl_version__) +# define COMPILER_VERSION_MINOR DEC(__open_xl_release__) +# define COMPILER_VERSION_PATCH DEC(__open_xl_modification__) +# define COMPILER_VERSION_TWEAK DEC(__open_xl_ptf_fix_level__) + + +#elif defined(__ibmxl__) && defined(__clang__) +# define COMPILER_ID "XLClang" +# define COMPILER_VERSION_MAJOR DEC(__ibmxl_version__) +# define COMPILER_VERSION_MINOR DEC(__ibmxl_release__) +# define COMPILER_VERSION_PATCH DEC(__ibmxl_modification__) +# define COMPILER_VERSION_TWEAK DEC(__ibmxl_ptf_fix_level__) + + +#elif defined(__IBMCPP__) && !defined(__COMPILER_VER__) && __IBMCPP__ >= 800 +# define COMPILER_ID "XL" + /* __IBMCPP__ = VRP */ +# define COMPILER_VERSION_MAJOR DEC(__IBMCPP__/100) +# define COMPILER_VERSION_MINOR DEC(__IBMCPP__/10 % 10) +# define COMPILER_VERSION_PATCH DEC(__IBMCPP__ % 10) + +#elif defined(__IBMCPP__) && !defined(__COMPILER_VER__) && __IBMCPP__ < 800 +# define COMPILER_ID "VisualAge" + /* __IBMCPP__ = VRP */ +# define COMPILER_VERSION_MAJOR DEC(__IBMCPP__/100) +# define COMPILER_VERSION_MINOR DEC(__IBMCPP__/10 % 10) +# define COMPILER_VERSION_PATCH DEC(__IBMCPP__ % 10) + +#elif defined(__NVCOMPILER) +# define COMPILER_ID "NVHPC" +# define COMPILER_VERSION_MAJOR DEC(__NVCOMPILER_MAJOR__) +# define COMPILER_VERSION_MINOR DEC(__NVCOMPILER_MINOR__) +# if defined(__NVCOMPILER_PATCHLEVEL__) +# define COMPILER_VERSION_PATCH DEC(__NVCOMPILER_PATCHLEVEL__) +# endif + +#elif defined(__PGI) +# define COMPILER_ID "PGI" +# define COMPILER_VERSION_MAJOR DEC(__PGIC__) +# define COMPILER_VERSION_MINOR DEC(__PGIC_MINOR__) +# if defined(__PGIC_PATCHLEVEL__) +# define COMPILER_VERSION_PATCH DEC(__PGIC_PATCHLEVEL__) +# endif + +#elif defined(__clang__) && defined(__cray__) +# define COMPILER_ID "CrayClang" +# define COMPILER_VERSION_MAJOR DEC(__cray_major__) +# define COMPILER_VERSION_MINOR DEC(__cray_minor__) +# define COMPILER_VERSION_PATCH DEC(__cray_patchlevel__) +# define COMPILER_VERSION_INTERNAL_STR __clang_version__ + + +#elif defined(_CRAYC) +# define COMPILER_ID "Cray" +# define COMPILER_VERSION_MAJOR DEC(_RELEASE_MAJOR) +# define COMPILER_VERSION_MINOR DEC(_RELEASE_MINOR) + +#elif defined(__TI_COMPILER_VERSION__) +# define COMPILER_ID "TI" + /* __TI_COMPILER_VERSION__ = VVVRRRPPP */ +# define COMPILER_VERSION_MAJOR DEC(__TI_COMPILER_VERSION__/1000000) +# define COMPILER_VERSION_MINOR DEC(__TI_COMPILER_VERSION__/1000 % 1000) +# define COMPILER_VERSION_PATCH DEC(__TI_COMPILER_VERSION__ % 1000) + +#elif defined(__CLANG_FUJITSU) +# define COMPILER_ID "FujitsuClang" +# define COMPILER_VERSION_MAJOR DEC(__FCC_major__) +# define COMPILER_VERSION_MINOR DEC(__FCC_minor__) +# define COMPILER_VERSION_PATCH DEC(__FCC_patchlevel__) +# define COMPILER_VERSION_INTERNAL_STR __clang_version__ + + +#elif defined(__FUJITSU) +# define COMPILER_ID "Fujitsu" +# if defined(__FCC_version__) +# define COMPILER_VERSION __FCC_version__ +# elif defined(__FCC_major__) +# define COMPILER_VERSION_MAJOR DEC(__FCC_major__) +# define COMPILER_VERSION_MINOR DEC(__FCC_minor__) +# define COMPILER_VERSION_PATCH DEC(__FCC_patchlevel__) +# endif +# if defined(__fcc_version) +# define COMPILER_VERSION_INTERNAL DEC(__fcc_version) +# elif defined(__FCC_VERSION) +# define COMPILER_VERSION_INTERNAL DEC(__FCC_VERSION) +# endif + + +#elif defined(__ghs__) +# define COMPILER_ID "GHS" +/* __GHS_VERSION_NUMBER = VVVVRP */ +# ifdef __GHS_VERSION_NUMBER +# define COMPILER_VERSION_MAJOR DEC(__GHS_VERSION_NUMBER / 100) +# define COMPILER_VERSION_MINOR DEC(__GHS_VERSION_NUMBER / 10 % 10) +# define COMPILER_VERSION_PATCH DEC(__GHS_VERSION_NUMBER % 10) +# endif + +#elif defined(__TASKING__) +# define COMPILER_ID "Tasking" + # define COMPILER_VERSION_MAJOR DEC(__VERSION__/1000) + # define COMPILER_VERSION_MINOR DEC(__VERSION__ % 100) +# define COMPILER_VERSION_INTERNAL DEC(__VERSION__) + +#elif defined(__ORANGEC__) +# define COMPILER_ID "OrangeC" +# define COMPILER_VERSION_MAJOR DEC(__ORANGEC_MAJOR__) +# define COMPILER_VERSION_MINOR DEC(__ORANGEC_MINOR__) +# define COMPILER_VERSION_PATCH DEC(__ORANGEC_PATCHLEVEL__) + +#elif defined(__SCO_VERSION__) +# define COMPILER_ID "SCO" + +#elif defined(__ARMCC_VERSION) && !defined(__clang__) +# define COMPILER_ID "ARMCC" +#if __ARMCC_VERSION >= 1000000 + /* __ARMCC_VERSION = VRRPPPP */ + # define COMPILER_VERSION_MAJOR DEC(__ARMCC_VERSION/1000000) + # define COMPILER_VERSION_MINOR DEC(__ARMCC_VERSION/10000 % 100) + # define COMPILER_VERSION_PATCH DEC(__ARMCC_VERSION % 10000) +#else + /* __ARMCC_VERSION = VRPPPP */ + # define COMPILER_VERSION_MAJOR DEC(__ARMCC_VERSION/100000) + # define COMPILER_VERSION_MINOR DEC(__ARMCC_VERSION/10000 % 10) + # define COMPILER_VERSION_PATCH DEC(__ARMCC_VERSION % 10000) +#endif + + +#elif defined(__clang__) && defined(__apple_build_version__) +# define COMPILER_ID "AppleClang" +# if defined(_MSC_VER) +# define SIMULATE_ID "MSVC" +# endif +# define COMPILER_VERSION_MAJOR DEC(__clang_major__) +# define COMPILER_VERSION_MINOR DEC(__clang_minor__) +# define COMPILER_VERSION_PATCH DEC(__clang_patchlevel__) +# if defined(_MSC_VER) + /* _MSC_VER = VVRR */ +# define SIMULATE_VERSION_MAJOR DEC(_MSC_VER / 100) +# define SIMULATE_VERSION_MINOR DEC(_MSC_VER % 100) +# endif +# define COMPILER_VERSION_TWEAK DEC(__apple_build_version__) + +#elif defined(__clang__) && defined(__ARMCOMPILER_VERSION) +# define COMPILER_ID "ARMClang" + # define COMPILER_VERSION_MAJOR DEC(__ARMCOMPILER_VERSION/1000000) + # define COMPILER_VERSION_MINOR DEC(__ARMCOMPILER_VERSION/10000 % 100) + # define COMPILER_VERSION_PATCH DEC(__ARMCOMPILER_VERSION/100 % 100) +# define COMPILER_VERSION_INTERNAL DEC(__ARMCOMPILER_VERSION) + +#elif defined(__clang__) && defined(__ti__) +# define COMPILER_ID "TIClang" + # define COMPILER_VERSION_MAJOR DEC(__ti_major__) + # define COMPILER_VERSION_MINOR DEC(__ti_minor__) + # define COMPILER_VERSION_PATCH DEC(__ti_patchlevel__) +# define COMPILER_VERSION_INTERNAL DEC(__ti_version__) + +#elif defined(__clang__) +# define COMPILER_ID "Clang" +# if defined(_MSC_VER) +# define SIMULATE_ID "MSVC" +# endif +# define COMPILER_VERSION_MAJOR DEC(__clang_major__) +# define COMPILER_VERSION_MINOR DEC(__clang_minor__) +# define COMPILER_VERSION_PATCH DEC(__clang_patchlevel__) +# if defined(_MSC_VER) + /* _MSC_VER = VVRR */ +# define SIMULATE_VERSION_MAJOR DEC(_MSC_VER / 100) +# define SIMULATE_VERSION_MINOR DEC(_MSC_VER % 100) +# endif + +#elif defined(__LCC__) && (defined(__GNUC__) || defined(__GNUG__) || defined(__MCST__)) +# define COMPILER_ID "LCC" +# define COMPILER_VERSION_MAJOR DEC(__LCC__ / 100) +# define COMPILER_VERSION_MINOR DEC(__LCC__ % 100) +# if defined(__LCC_MINOR__) +# define COMPILER_VERSION_PATCH DEC(__LCC_MINOR__) +# endif +# if defined(__GNUC__) && defined(__GNUC_MINOR__) +# define SIMULATE_ID "GNU" +# define SIMULATE_VERSION_MAJOR DEC(__GNUC__) +# define SIMULATE_VERSION_MINOR DEC(__GNUC_MINOR__) +# if defined(__GNUC_PATCHLEVEL__) +# define SIMULATE_VERSION_PATCH DEC(__GNUC_PATCHLEVEL__) +# endif +# endif + +#elif defined(__GNUC__) || defined(__GNUG__) +# define COMPILER_ID "GNU" +# if defined(__GNUC__) +# define COMPILER_VERSION_MAJOR DEC(__GNUC__) +# else +# define COMPILER_VERSION_MAJOR DEC(__GNUG__) +# endif +# if defined(__GNUC_MINOR__) +# define COMPILER_VERSION_MINOR DEC(__GNUC_MINOR__) +# endif +# if defined(__GNUC_PATCHLEVEL__) +# define COMPILER_VERSION_PATCH DEC(__GNUC_PATCHLEVEL__) +# endif + +#elif defined(_MSC_VER) +# define COMPILER_ID "MSVC" + /* _MSC_VER = VVRR */ +# define COMPILER_VERSION_MAJOR DEC(_MSC_VER / 100) +# define COMPILER_VERSION_MINOR DEC(_MSC_VER % 100) +# if defined(_MSC_FULL_VER) +# if _MSC_VER >= 1400 + /* _MSC_FULL_VER = VVRRPPPPP */ +# define COMPILER_VERSION_PATCH DEC(_MSC_FULL_VER % 100000) +# else + /* _MSC_FULL_VER = VVRRPPPP */ +# define COMPILER_VERSION_PATCH DEC(_MSC_FULL_VER % 10000) +# endif +# endif +# if defined(_MSC_BUILD) +# define COMPILER_VERSION_TWEAK DEC(_MSC_BUILD) +# endif + +#elif defined(_ADI_COMPILER) +# define COMPILER_ID "ADSP" +#if defined(__VERSIONNUM__) + /* __VERSIONNUM__ = 0xVVRRPPTT */ +# define COMPILER_VERSION_MAJOR DEC(__VERSIONNUM__ >> 24 & 0xFF) +# define COMPILER_VERSION_MINOR DEC(__VERSIONNUM__ >> 16 & 0xFF) +# define COMPILER_VERSION_PATCH DEC(__VERSIONNUM__ >> 8 & 0xFF) +# define COMPILER_VERSION_TWEAK DEC(__VERSIONNUM__ & 0xFF) +#endif + +#elif defined(__IAR_SYSTEMS_ICC__) || defined(__IAR_SYSTEMS_ICC) +# define COMPILER_ID "IAR" +# if defined(__VER__) && defined(__ICCARM__) +# define COMPILER_VERSION_MAJOR DEC((__VER__) / 1000000) +# define COMPILER_VERSION_MINOR DEC(((__VER__) / 1000) % 1000) +# define COMPILER_VERSION_PATCH DEC((__VER__) % 1000) +# define COMPILER_VERSION_INTERNAL DEC(__IAR_SYSTEMS_ICC__) +# elif defined(__VER__) && (defined(__ICCAVR__) || defined(__ICCRX__) || defined(__ICCRH850__) || defined(__ICCRL78__) || defined(__ICC430__) || defined(__ICCRISCV__) || defined(__ICCV850__) || defined(__ICC8051__) || defined(__ICCSTM8__)) +# define COMPILER_VERSION_MAJOR DEC((__VER__) / 100) +# define COMPILER_VERSION_MINOR DEC((__VER__) - (((__VER__) / 100)*100)) +# define COMPILER_VERSION_PATCH DEC(__SUBVERSION__) +# define COMPILER_VERSION_INTERNAL DEC(__IAR_SYSTEMS_ICC__) +# endif + + +/* These compilers are either not known or too old to define an + identification macro. Try to identify the platform and guess that + it is the native compiler. */ +#elif defined(__hpux) || defined(__hpua) +# define COMPILER_ID "HP" + +#else /* unknown compiler */ +# define COMPILER_ID "" +#endif + +/* Construct the string literal in pieces to prevent the source from + getting matched. Store it in a pointer rather than an array + because some compilers will just produce instructions to fill the + array rather than assigning a pointer to a static array. */ +char const* info_compiler = "INFO" ":" "compiler[" COMPILER_ID "]"; +#ifdef SIMULATE_ID +char const* info_simulate = "INFO" ":" "simulate[" SIMULATE_ID "]"; +#endif + +#ifdef __QNXNTO__ +char const* qnxnto = "INFO" ":" "qnxnto[]"; +#endif + +#if defined(__CRAYXT_COMPUTE_LINUX_TARGET) +char const *info_cray = "INFO" ":" "compiler_wrapper[CrayPrgEnv]"; +#endif + +#define STRINGIFY_HELPER(X) #X +#define STRINGIFY(X) STRINGIFY_HELPER(X) + +/* Identify known platforms by name. */ +#if defined(__linux) || defined(__linux__) || defined(linux) +# define PLATFORM_ID "Linux" + +#elif defined(__MSYS__) +# define PLATFORM_ID "MSYS" + +#elif defined(__CYGWIN__) +# define PLATFORM_ID "Cygwin" + +#elif defined(__MINGW32__) +# define PLATFORM_ID "MinGW" + +#elif defined(__APPLE__) +# define PLATFORM_ID "Darwin" + +#elif defined(_WIN32) || defined(__WIN32__) || defined(WIN32) +# define PLATFORM_ID "Windows" + +#elif defined(__FreeBSD__) || defined(__FreeBSD) +# define PLATFORM_ID "FreeBSD" + +#elif defined(__NetBSD__) || defined(__NetBSD) +# define PLATFORM_ID "NetBSD" + +#elif defined(__OpenBSD__) || defined(__OPENBSD) +# define PLATFORM_ID "OpenBSD" + +#elif defined(__sun) || defined(sun) +# define PLATFORM_ID "SunOS" + +#elif defined(_AIX) || defined(__AIX) || defined(__AIX__) || defined(__aix) || defined(__aix__) +# define PLATFORM_ID "AIX" + +#elif defined(__hpux) || defined(__hpux__) +# define PLATFORM_ID "HP-UX" + +#elif defined(__HAIKU__) +# define PLATFORM_ID "Haiku" + +#elif defined(__BeOS) || defined(__BEOS__) || defined(_BEOS) +# define PLATFORM_ID "BeOS" + +#elif defined(__QNX__) || defined(__QNXNTO__) +# define PLATFORM_ID "QNX" + +#elif defined(__tru64) || defined(_tru64) || defined(__TRU64__) +# define PLATFORM_ID "Tru64" + +#elif defined(__riscos) || defined(__riscos__) +# define PLATFORM_ID "RISCos" + +#elif defined(__sinix) || defined(__sinix__) || defined(__SINIX__) +# define PLATFORM_ID "SINIX" + +#elif defined(__UNIX_SV__) +# define PLATFORM_ID "UNIX_SV" + +#elif defined(__bsdos__) +# define PLATFORM_ID "BSDOS" + +#elif defined(_MPRAS) || defined(MPRAS) +# define PLATFORM_ID "MP-RAS" + +#elif defined(__osf) || defined(__osf__) +# define PLATFORM_ID "OSF1" + +#elif defined(_SCO_SV) || defined(SCO_SV) || defined(sco_sv) +# define PLATFORM_ID "SCO_SV" + +#elif defined(__ultrix) || defined(__ultrix__) || defined(_ULTRIX) +# define PLATFORM_ID "ULTRIX" + +#elif defined(__XENIX__) || defined(_XENIX) || defined(XENIX) +# define PLATFORM_ID "Xenix" + +#elif defined(__WATCOMC__) +# if defined(__LINUX__) +# define PLATFORM_ID "Linux" + +# elif defined(__DOS__) +# define PLATFORM_ID "DOS" + +# elif defined(__OS2__) +# define PLATFORM_ID "OS2" + +# elif defined(__WINDOWS__) +# define PLATFORM_ID "Windows3x" + +# elif defined(__VXWORKS__) +# define PLATFORM_ID "VxWorks" + +# else /* unknown platform */ +# define PLATFORM_ID +# endif + +#elif defined(__INTEGRITY) +# if defined(INT_178B) +# define PLATFORM_ID "Integrity178" + +# else /* regular Integrity */ +# define PLATFORM_ID "Integrity" +# endif + +# elif defined(_ADI_COMPILER) +# define PLATFORM_ID "ADSP" + +#else /* unknown platform */ +# define PLATFORM_ID + +#endif + +/* For windows compilers MSVC and Intel we can determine + the architecture of the compiler being used. This is because + the compilers do not have flags that can change the architecture, + but rather depend on which compiler is being used +*/ +#if defined(_WIN32) && defined(_MSC_VER) +# if defined(_M_IA64) +# define ARCHITECTURE_ID "IA64" + +# elif defined(_M_ARM64EC) +# define ARCHITECTURE_ID "ARM64EC" + +# elif defined(_M_X64) || defined(_M_AMD64) +# define ARCHITECTURE_ID "x64" + +# elif defined(_M_IX86) +# define ARCHITECTURE_ID "X86" + +# elif defined(_M_ARM64) +# define ARCHITECTURE_ID "ARM64" + +# elif defined(_M_ARM) +# if _M_ARM == 4 +# define ARCHITECTURE_ID "ARMV4I" +# elif _M_ARM == 5 +# define ARCHITECTURE_ID "ARMV5I" +# else +# define ARCHITECTURE_ID "ARMV" STRINGIFY(_M_ARM) +# endif + +# elif defined(_M_MIPS) +# define ARCHITECTURE_ID "MIPS" + +# elif defined(_M_SH) +# define ARCHITECTURE_ID "SHx" + +# else /* unknown architecture */ +# define ARCHITECTURE_ID "" +# endif + +#elif defined(__WATCOMC__) +# if defined(_M_I86) +# define ARCHITECTURE_ID "I86" + +# elif defined(_M_IX86) +# define ARCHITECTURE_ID "X86" + +# else /* unknown architecture */ +# define ARCHITECTURE_ID "" +# endif + +#elif defined(__IAR_SYSTEMS_ICC__) || defined(__IAR_SYSTEMS_ICC) +# if defined(__ICCARM__) +# define ARCHITECTURE_ID "ARM" + +# elif defined(__ICCRX__) +# define ARCHITECTURE_ID "RX" + +# elif defined(__ICCRH850__) +# define ARCHITECTURE_ID "RH850" + +# elif defined(__ICCRL78__) +# define ARCHITECTURE_ID "RL78" + +# elif defined(__ICCRISCV__) +# define ARCHITECTURE_ID "RISCV" + +# elif defined(__ICCAVR__) +# define ARCHITECTURE_ID "AVR" + +# elif defined(__ICC430__) +# define ARCHITECTURE_ID "MSP430" + +# elif defined(__ICCV850__) +# define ARCHITECTURE_ID "V850" + +# elif defined(__ICC8051__) +# define ARCHITECTURE_ID "8051" + +# elif defined(__ICCSTM8__) +# define ARCHITECTURE_ID "STM8" + +# else /* unknown architecture */ +# define ARCHITECTURE_ID "" +# endif + +#elif defined(__ghs__) +# if defined(__PPC64__) +# define ARCHITECTURE_ID "PPC64" + +# elif defined(__ppc__) +# define ARCHITECTURE_ID "PPC" + +# elif defined(__ARM__) +# define ARCHITECTURE_ID "ARM" + +# elif defined(__x86_64__) +# define ARCHITECTURE_ID "x64" + +# elif defined(__i386__) +# define ARCHITECTURE_ID "X86" + +# else /* unknown architecture */ +# define ARCHITECTURE_ID "" +# endif + +#elif defined(__clang__) && defined(__ti__) +# if defined(__ARM_ARCH) +# define ARCHITECTURE_ID "Arm" + +# else /* unknown architecture */ +# define ARCHITECTURE_ID "" +# endif + +#elif defined(__TI_COMPILER_VERSION__) +# if defined(__TI_ARM__) +# define ARCHITECTURE_ID "ARM" + +# elif defined(__MSP430__) +# define ARCHITECTURE_ID "MSP430" + +# elif defined(__TMS320C28XX__) +# define ARCHITECTURE_ID "TMS320C28x" + +# elif defined(__TMS320C6X__) || defined(_TMS320C6X) +# define ARCHITECTURE_ID "TMS320C6x" + +# else /* unknown architecture */ +# define ARCHITECTURE_ID "" +# endif + +# elif defined(__ADSPSHARC__) +# define ARCHITECTURE_ID "SHARC" + +# elif defined(__ADSPBLACKFIN__) +# define ARCHITECTURE_ID "Blackfin" + +#elif defined(__TASKING__) + +# if defined(__CTC__) || defined(__CPTC__) +# define ARCHITECTURE_ID "TriCore" + +# elif defined(__CMCS__) +# define ARCHITECTURE_ID "MCS" + +# elif defined(__CARM__) +# define ARCHITECTURE_ID "ARM" + +# elif defined(__CARC__) +# define ARCHITECTURE_ID "ARC" + +# elif defined(__C51__) +# define ARCHITECTURE_ID "8051" + +# elif defined(__CPCP__) +# define ARCHITECTURE_ID "PCP" + +# else +# define ARCHITECTURE_ID "" +# endif + +#else +# define ARCHITECTURE_ID +#endif + +/* Convert integer to decimal digit literals. */ +#define DEC(n) \ + ('0' + (((n) / 10000000)%10)), \ + ('0' + (((n) / 1000000)%10)), \ + ('0' + (((n) / 100000)%10)), \ + ('0' + (((n) / 10000)%10)), \ + ('0' + (((n) / 1000)%10)), \ + ('0' + (((n) / 100)%10)), \ + ('0' + (((n) / 10)%10)), \ + ('0' + ((n) % 10)) + +/* Convert integer to hex digit literals. */ +#define HEX(n) \ + ('0' + ((n)>>28 & 0xF)), \ + ('0' + ((n)>>24 & 0xF)), \ + ('0' + ((n)>>20 & 0xF)), \ + ('0' + ((n)>>16 & 0xF)), \ + ('0' + ((n)>>12 & 0xF)), \ + ('0' + ((n)>>8 & 0xF)), \ + ('0' + ((n)>>4 & 0xF)), \ + ('0' + ((n) & 0xF)) + +/* Construct a string literal encoding the version number. */ +#ifdef COMPILER_VERSION +char const* info_version = "INFO" ":" "compiler_version[" COMPILER_VERSION "]"; + +/* Construct a string literal encoding the version number components. */ +#elif defined(COMPILER_VERSION_MAJOR) +char const info_version[] = { + 'I', 'N', 'F', 'O', ':', + 'c','o','m','p','i','l','e','r','_','v','e','r','s','i','o','n','[', + COMPILER_VERSION_MAJOR, +# ifdef COMPILER_VERSION_MINOR + '.', COMPILER_VERSION_MINOR, +# ifdef COMPILER_VERSION_PATCH + '.', COMPILER_VERSION_PATCH, +# ifdef COMPILER_VERSION_TWEAK + '.', COMPILER_VERSION_TWEAK, +# endif +# endif +# endif + ']','\0'}; +#endif + +/* Construct a string literal encoding the internal version number. */ +#ifdef COMPILER_VERSION_INTERNAL +char const info_version_internal[] = { + 'I', 'N', 'F', 'O', ':', + 'c','o','m','p','i','l','e','r','_','v','e','r','s','i','o','n','_', + 'i','n','t','e','r','n','a','l','[', + COMPILER_VERSION_INTERNAL,']','\0'}; +#elif defined(COMPILER_VERSION_INTERNAL_STR) +char const* info_version_internal = "INFO" ":" "compiler_version_internal[" COMPILER_VERSION_INTERNAL_STR "]"; +#endif + +/* Construct a string literal encoding the version number components. */ +#ifdef SIMULATE_VERSION_MAJOR +char const info_simulate_version[] = { + 'I', 'N', 'F', 'O', ':', + 's','i','m','u','l','a','t','e','_','v','e','r','s','i','o','n','[', + SIMULATE_VERSION_MAJOR, +# ifdef SIMULATE_VERSION_MINOR + '.', SIMULATE_VERSION_MINOR, +# ifdef SIMULATE_VERSION_PATCH + '.', SIMULATE_VERSION_PATCH, +# ifdef SIMULATE_VERSION_TWEAK + '.', SIMULATE_VERSION_TWEAK, +# endif +# endif +# endif + ']','\0'}; +#endif + +/* Construct the string literal in pieces to prevent the source from + getting matched. Store it in a pointer rather than an array + because some compilers will just produce instructions to fill the + array rather than assigning a pointer to a static array. */ +char const* info_platform = "INFO" ":" "platform[" PLATFORM_ID "]"; +char const* info_arch = "INFO" ":" "arch[" ARCHITECTURE_ID "]"; + + + +#define CXX_STD_98 199711L +#define CXX_STD_11 201103L +#define CXX_STD_14 201402L +#define CXX_STD_17 201703L +#define CXX_STD_20 202002L +#define CXX_STD_23 202302L + +#if defined(__INTEL_COMPILER) && defined(_MSVC_LANG) +# if _MSVC_LANG > CXX_STD_17 +# define CXX_STD _MSVC_LANG +# elif _MSVC_LANG == CXX_STD_17 && defined(__cpp_aggregate_paren_init) +# define CXX_STD CXX_STD_20 +# elif _MSVC_LANG > CXX_STD_14 && __cplusplus > CXX_STD_17 +# define CXX_STD CXX_STD_20 +# elif _MSVC_LANG > CXX_STD_14 +# define CXX_STD CXX_STD_17 +# elif defined(__INTEL_CXX11_MODE__) && defined(__cpp_aggregate_nsdmi) +# define CXX_STD CXX_STD_14 +# elif defined(__INTEL_CXX11_MODE__) +# define CXX_STD CXX_STD_11 +# else +# define CXX_STD CXX_STD_98 +# endif +#elif defined(_MSC_VER) && defined(_MSVC_LANG) +# if _MSVC_LANG > __cplusplus +# define CXX_STD _MSVC_LANG +# else +# define CXX_STD __cplusplus +# endif +#elif defined(__NVCOMPILER) +# if __cplusplus == CXX_STD_17 && defined(__cpp_aggregate_paren_init) +# define CXX_STD CXX_STD_20 +# else +# define CXX_STD __cplusplus +# endif +#elif defined(__INTEL_COMPILER) || defined(__PGI) +# if __cplusplus == CXX_STD_11 && defined(__cpp_namespace_attributes) +# define CXX_STD CXX_STD_17 +# elif __cplusplus == CXX_STD_11 && defined(__cpp_aggregate_nsdmi) +# define CXX_STD CXX_STD_14 +# else +# define CXX_STD __cplusplus +# endif +#elif (defined(__IBMCPP__) || defined(__ibmxl__)) && defined(__linux__) +# if __cplusplus == CXX_STD_11 && defined(__cpp_aggregate_nsdmi) +# define CXX_STD CXX_STD_14 +# else +# define CXX_STD __cplusplus +# endif +#elif __cplusplus == 1 && defined(__GXX_EXPERIMENTAL_CXX0X__) +# define CXX_STD CXX_STD_11 +#else +# define CXX_STD __cplusplus +#endif + +const char* info_language_standard_default = "INFO" ":" "standard_default[" +#if CXX_STD > CXX_STD_23 + "26" +#elif CXX_STD > CXX_STD_20 + "23" +#elif CXX_STD > CXX_STD_17 + "20" +#elif CXX_STD > CXX_STD_14 + "17" +#elif CXX_STD > CXX_STD_11 + "14" +#elif CXX_STD >= CXX_STD_11 + "11" +#else + "98" +#endif +"]"; + +const char* info_language_extensions_default = "INFO" ":" "extensions_default[" +#if (defined(__clang__) || defined(__GNUC__) || defined(__xlC__) || \ + defined(__TI_COMPILER_VERSION__)) && \ + !defined(__STRICT_ANSI__) + "ON" +#else + "OFF" +#endif +"]"; + +/*--------------------------------------------------------------------------*/ + +int main(int argc, char* argv[]) +{ + int require = 0; + require += info_compiler[argc]; + require += info_platform[argc]; + require += info_arch[argc]; +#ifdef COMPILER_VERSION_MAJOR + require += info_version[argc]; +#endif +#ifdef COMPILER_VERSION_INTERNAL + require += info_version_internal[argc]; +#endif +#ifdef SIMULATE_ID + require += info_simulate[argc]; +#endif +#ifdef SIMULATE_VERSION_MAJOR + require += info_simulate_version[argc]; +#endif +#if defined(__CRAYXT_COMPUTE_LINUX_TARGET) + require += info_cray[argc]; +#endif + require += info_language_standard_default[argc]; + require += info_language_extensions_default[argc]; + (void)argv; + return require; +} diff --git a/siro_rider/android/app/.cxx/RelWithDebInfo/6t1m4b5v/armeabi-v7a/CMakeFiles/3.31.5-g6cf5163/CompilerIdCXX/CMakeCXXCompilerId.o b/siro_rider/android/app/.cxx/RelWithDebInfo/6t1m4b5v/armeabi-v7a/CMakeFiles/3.31.5-g6cf5163/CompilerIdCXX/CMakeCXXCompilerId.o new file mode 100644 index 0000000..b3a936a Binary files /dev/null and b/siro_rider/android/app/.cxx/RelWithDebInfo/6t1m4b5v/armeabi-v7a/CMakeFiles/3.31.5-g6cf5163/CompilerIdCXX/CMakeCXXCompilerId.o differ diff --git a/siro_rider/android/app/.cxx/RelWithDebInfo/6t1m4b5v/armeabi-v7a/CMakeFiles/CMakeConfigureLog.yaml b/siro_rider/android/app/.cxx/RelWithDebInfo/6t1m4b5v/armeabi-v7a/CMakeFiles/CMakeConfigureLog.yaml new file mode 100644 index 0000000..f9cae81 --- /dev/null +++ b/siro_rider/android/app/.cxx/RelWithDebInfo/6t1m4b5v/armeabi-v7a/CMakeFiles/CMakeConfigureLog.yaml @@ -0,0 +1,411 @@ + +--- +events: + - + kind: "message-v1" + backtrace: + - "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeDetermineSystem.cmake:200 (message)" + - "CMakeLists.txt:2 (project)" + message: | + The target system is: Android - 1 - armv7-a + The host system is: Darwin - 24.5.0 - arm64 + - + kind: "message-v1" + backtrace: + - "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeDetermineCompilerId.cmake:17 (message)" + - "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeDetermineCompilerId.cmake:64 (__determine_compiler_id_test)" + - "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeDetermineCCompiler.cmake:123 (CMAKE_DETERMINE_COMPILER_ID)" + - "CMakeLists.txt:2 (project)" + message: | + Compiling the C compiler identification source file "CMakeCCompilerId.c" succeeded. + Compiler: /Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/bin/clang + Build flags: -g;-DANDROID;-fdata-sections;-ffunction-sections;-funwind-tables;-fstack-protector-strong;-no-canonical-prefixes;-D_FORTIFY_SOURCE=2;-march=armv7-a;-mthumb;-Wformat;-Werror=format-security + Id flags: -c;--target=armv7-none-linux-androideabi23 + + The output was: + 0 + + + Compilation of the C compiler identification source "CMakeCCompilerId.c" produced "CMakeCCompilerId.o" + + The C compiler identification is Clang, found in: + /Users/hamzaaleghwairyeen/development/App/Intaleq/android/app/.cxx/RelWithDebInfo/6t1m4b5v/armeabi-v7a/CMakeFiles/3.31.5-g6cf5163/CompilerIdC/CMakeCCompilerId.o + + - + kind: "message-v1" + backtrace: + - "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeDetermineCompilerId.cmake:17 (message)" + - "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeDetermineCompilerId.cmake:64 (__determine_compiler_id_test)" + - "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeDetermineCXXCompiler.cmake:126 (CMAKE_DETERMINE_COMPILER_ID)" + - "CMakeLists.txt:2 (project)" + message: | + Compiling the CXX compiler identification source file "CMakeCXXCompilerId.cpp" succeeded. + Compiler: /Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/bin/clang++ + Build flags: -g;-DANDROID;-fdata-sections;-ffunction-sections;-funwind-tables;-fstack-protector-strong;-no-canonical-prefixes;-D_FORTIFY_SOURCE=2;-march=armv7-a;-mthumb;-Wformat;-Werror=format-security + Id flags: -c;--target=armv7-none-linux-androideabi23 + + The output was: + 0 + + + Compilation of the CXX compiler identification source "CMakeCXXCompilerId.cpp" produced "CMakeCXXCompilerId.o" + + The CXX compiler identification is Clang, found in: + /Users/hamzaaleghwairyeen/development/App/Intaleq/android/app/.cxx/RelWithDebInfo/6t1m4b5v/armeabi-v7a/CMakeFiles/3.31.5-g6cf5163/CompilerIdCXX/CMakeCXXCompilerId.o + + - + kind: "try_compile-v1" + backtrace: + - "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeDetermineCompilerABI.cmake:74 (try_compile)" + - "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeTestCCompiler.cmake:26 (CMAKE_DETERMINE_COMPILER_ABI)" + - "CMakeLists.txt:2 (project)" + checks: + - "Detecting C compiler ABI info" + directories: + source: "/Users/hamzaaleghwairyeen/development/App/Intaleq/android/app/.cxx/RelWithDebInfo/6t1m4b5v/armeabi-v7a/CMakeFiles/CMakeScratch/TryCompile-l9oUbK" + binary: "/Users/hamzaaleghwairyeen/development/App/Intaleq/android/app/.cxx/RelWithDebInfo/6t1m4b5v/armeabi-v7a/CMakeFiles/CMakeScratch/TryCompile-l9oUbK" + cmakeVariables: + ANDROID_ABI: "armeabi-v7a" + ANDROID_ARM_MODE: "thumb" + ANDROID_ARM_NEON: "TRUE" + ANDROID_PIE: "TRUE" + ANDROID_PLATFORM: "android-23" + ANDROID_STL: "c++_static" + ANDROID_TOOLCHAIN: "clang" + CMAKE_CXX_COMPILER_CLANG_SCAN_DEPS: "/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/bin/clang-scan-deps" + CMAKE_CXX_COMPILER_TARGET: "armv7-none-linux-androideabi23" + CMAKE_C_COMPILER_TARGET: "armv7-none-linux-androideabi23" + CMAKE_C_FLAGS: "-g -DANDROID -fdata-sections -ffunction-sections -funwind-tables -fstack-protector-strong -no-canonical-prefixes -D_FORTIFY_SOURCE=2 -march=armv7-a -mthumb -Wformat " + CMAKE_C_FLAGS_DEBUG: "-fno-limit-debug-info " + CMAKE_EXE_LINKER_FLAGS: "-static-libstdc++ -Wl,--build-id=sha1 -Wl,--no-rosegment -Wl,--no-undefined-version -Wl,--fatal-warnings -Wl,--no-undefined -Qunused-arguments " + CMAKE_POSITION_INDEPENDENT_CODE: "TRUE" + CMAKE_SYSROOT: "/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot" + buildResult: + variable: "CMAKE_C_ABI_COMPILED" + cached: true + stdout: | + Change Dir: '/Users/hamzaaleghwairyeen/development/App/Intaleq/android/app/.cxx/RelWithDebInfo/6t1m4b5v/armeabi-v7a/CMakeFiles/CMakeScratch/TryCompile-l9oUbK' + + Run Build Command(s): /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/bin/ninja -v cmTC_b63cf + [1/2] /Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/bin/clang --target=armv7-none-linux-androideabi23 --sysroot=/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot -g -DANDROID -fdata-sections -ffunction-sections -funwind-tables -fstack-protector-strong -no-canonical-prefixes -D_FORTIFY_SOURCE=2 -march=armv7-a -mthumb -Wformat -fPIE -v -MD -MT CMakeFiles/cmTC_b63cf.dir/CMakeCCompilerABI.c.o -MF CMakeFiles/cmTC_b63cf.dir/CMakeCCompilerABI.c.o.d -o CMakeFiles/cmTC_b63cf.dir/CMakeCCompilerABI.c.o -c /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeCCompilerABI.c + Android (12027248, +pgo, -bolt, +lto, -mlgo, based on r522817) clang version 18.0.1 (https://android.googlesource.com/toolchain/llvm-project d8003a456d14a3deb8054cdaa529ffbf02d9b262) + Target: armv7-none-linux-android23 + Thread model: posix + InstalledDir: /Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/bin + (in-process) + "/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/bin/clang" -cc1 -triple thumbv7-none-linux-android23 -emit-obj -mrelax-all -disable-free -clear-ast-before-backend -disable-llvm-verifier -discard-value-names -main-file-name CMakeCCompilerABI.c -mrelocation-model pic -pic-level 2 -pic-is-pie -mframe-pointer=all -ffp-contract=on -fno-rounding-math -mconstructor-aliases -funwind-tables=1 -target-cpu generic -target-feature +soft-float-abi -target-feature +vfp2 -target-feature +vfp2sp -target-feature +vfp3 -target-feature +vfp3d16 -target-feature +vfp3d16sp -target-feature +vfp3sp -target-feature -fp16 -target-feature -vfp4 -target-feature -vfp4d16 -target-feature -vfp4d16sp -target-feature -vfp4sp -target-feature -fp-armv8 -target-feature -fp-armv8d16 -target-feature -fp-armv8d16sp -target-feature -fp-armv8sp -target-feature -fullfp16 -target-feature +fp64 -target-feature +d32 -target-feature +neon -target-feature -sha2 -target-feature -aes -target-feature -fp16fml -target-abi aapcs-linux -mfloat-abi soft -debug-info-kind=constructor -dwarf-version=4 -debugger-tuning=gdb -fdebug-compilation-dir=/Users/hamzaaleghwairyeen/development/App/Intaleq/android/app/.cxx/RelWithDebInfo/6t1m4b5v/armeabi-v7a/CMakeFiles/CMakeScratch/TryCompile-l9oUbK -v -ffunction-sections -fdata-sections -fcoverage-compilation-dir=/Users/hamzaaleghwairyeen/development/App/Intaleq/android/app/.cxx/RelWithDebInfo/6t1m4b5v/armeabi-v7a/CMakeFiles/CMakeScratch/TryCompile-l9oUbK -resource-dir /Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/lib/clang/18 -dependency-file CMakeFiles/cmTC_b63cf.dir/CMakeCCompilerABI.c.o.d -MT CMakeFiles/cmTC_b63cf.dir/CMakeCCompilerABI.c.o -sys-header-deps -D ANDROID -D _FORTIFY_SOURCE=2 -isysroot /Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot -internal-isystem /Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/lib/clang/18/include -internal-isystem /Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/local/include -internal-externc-isystem /Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/include/arm-linux-androideabi -internal-externc-isystem /Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/include -internal-externc-isystem /Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/include -Wformat -ferror-limit 19 -femulated-tls -stack-protector 2 -fno-signed-char -fgnuc-version=4.2.1 -D__GCC_HAVE_DWARF2_CFI_ASM=1 -o CMakeFiles/cmTC_b63cf.dir/CMakeCCompilerABI.c.o -x c /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeCCompilerABI.c + clang -cc1 version 18.0.1 based upon LLVM 18.0.1 default target x86_64-apple-darwin24.5.0 + ignoring nonexistent directory "/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/local/include" + ignoring nonexistent directory "/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/include" + #include "..." search starts here: + #include <...> search starts here: + /Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/lib/clang/18/include + /Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/include/arm-linux-androideabi + /Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/include + End of search list. + [2/2] : && /Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/bin/clang --target=armv7-none-linux-androideabi23 --sysroot=/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot -g -DANDROID -fdata-sections -ffunction-sections -funwind-tables -fstack-protector-strong -no-canonical-prefixes -D_FORTIFY_SOURCE=2 -march=armv7-a -mthumb -Wformat -static-libstdc++ -Wl,--build-id=sha1 -Wl,--no-rosegment -Wl,--no-undefined-version -Wl,--fatal-warnings -Wl,--no-undefined -Qunused-arguments -v CMakeFiles/cmTC_b63cf.dir/CMakeCCompilerABI.c.o -o cmTC_b63cf && : + Android (12027248, +pgo, -bolt, +lto, -mlgo, based on r522817) clang version 18.0.1 (https://android.googlesource.com/toolchain/llvm-project d8003a456d14a3deb8054cdaa529ffbf02d9b262) + Target: armv7-none-linux-android23 + Thread model: posix + InstalledDir: /Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/bin + "/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/bin/ld.lld" --sysroot=/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot -EL -z now -z relro -z max-page-size=4096 -X --hash-style=gnu --eh-frame-hdr -m armelf_linux_eabi -pie -dynamic-linker /system/bin/linker -o cmTC_b63cf /Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/lib/arm-linux-androideabi/23/crtbegin_dynamic.o -L/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/lib/clang/18/lib/linux/arm -L/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/lib/arm-linux-androideabi/23 -L/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/lib/arm-linux-androideabi -L/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/lib/../lib -L/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/lib --build-id=sha1 --no-rosegment --no-undefined-version --fatal-warnings --no-undefined CMakeFiles/cmTC_b63cf.dir/CMakeCCompilerABI.c.o /Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/lib/clang/18/lib/linux/libclang_rt.builtins-arm-android.a -l:libunwind.a -ldl -lc /Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/lib/clang/18/lib/linux/libclang_rt.builtins-arm-android.a -l:libunwind.a -ldl /Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/lib/arm-linux-androideabi/23/crtend_android.o + + exitCode: 0 + - + kind: "message-v1" + backtrace: + - "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeDetermineCompilerABI.cmake:182 (message)" + - "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeTestCCompiler.cmake:26 (CMAKE_DETERMINE_COMPILER_ABI)" + - "CMakeLists.txt:2 (project)" + message: | + Parsed C implicit include dir info: rv=done + found start of include info + found start of implicit include info + add: [/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/lib/clang/18/include] + add: [/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/include/arm-linux-androideabi] + add: [/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/include] + end of search list found + collapse include dir [/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/lib/clang/18/include] ==> [/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/lib/clang/18/include] + collapse include dir [/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/include/arm-linux-androideabi] ==> [/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/include/arm-linux-androideabi] + collapse include dir [/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/include] ==> [/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/include] + implicit include dirs: [/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/lib/clang/18/include;/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/include/arm-linux-androideabi;/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/include] + + + - + kind: "message-v1" + backtrace: + - "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeDetermineCompilerABI.cmake:218 (message)" + - "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeTestCCompiler.cmake:26 (CMAKE_DETERMINE_COMPILER_ABI)" + - "CMakeLists.txt:2 (project)" + message: | + Parsed C implicit link information: + link line regex: [^( *|.*[/\\])(ld[0-9]*(\\.[a-z]+)?|CMAKE_LINK_STARTFILE-NOTFOUND|([^/\\]+-)?ld|collect2)[^/\\]*( |$)] + linker tool regex: [^[ ]*(->|")?[ ]*(([^"]*[/\\])?(ld[0-9]*(\\.[a-z]+)?))("|,| |$)] + ignore line: [Change Dir: '/Users/hamzaaleghwairyeen/development/App/Intaleq/android/app/.cxx/RelWithDebInfo/6t1m4b5v/armeabi-v7a/CMakeFiles/CMakeScratch/TryCompile-l9oUbK'] + ignore line: [] + ignore line: [Run Build Command(s): /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/bin/ninja -v cmTC_b63cf] + ignore line: [[1/2] /Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/bin/clang --target=armv7-none-linux-androideabi23 --sysroot=/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot -g -DANDROID -fdata-sections -ffunction-sections -funwind-tables -fstack-protector-strong -no-canonical-prefixes -D_FORTIFY_SOURCE=2 -march=armv7-a -mthumb -Wformat -fPIE -v -MD -MT CMakeFiles/cmTC_b63cf.dir/CMakeCCompilerABI.c.o -MF CMakeFiles/cmTC_b63cf.dir/CMakeCCompilerABI.c.o.d -o CMakeFiles/cmTC_b63cf.dir/CMakeCCompilerABI.c.o -c /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeCCompilerABI.c] + ignore line: [Android (12027248 +pgo -bolt +lto -mlgo based on r522817) clang version 18.0.1 (https://android.googlesource.com/toolchain/llvm-project d8003a456d14a3deb8054cdaa529ffbf02d9b262)] + ignore line: [Target: armv7-none-linux-android23] + ignore line: [Thread model: posix] + ignore line: [InstalledDir: /Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/bin] + ignore line: [ (in-process)] + ignore line: [ "/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/bin/clang" -cc1 -triple thumbv7-none-linux-android23 -emit-obj -mrelax-all -disable-free -clear-ast-before-backend -disable-llvm-verifier -discard-value-names -main-file-name CMakeCCompilerABI.c -mrelocation-model pic -pic-level 2 -pic-is-pie -mframe-pointer=all -ffp-contract=on -fno-rounding-math -mconstructor-aliases -funwind-tables=1 -target-cpu generic -target-feature +soft-float-abi -target-feature +vfp2 -target-feature +vfp2sp -target-feature +vfp3 -target-feature +vfp3d16 -target-feature +vfp3d16sp -target-feature +vfp3sp -target-feature -fp16 -target-feature -vfp4 -target-feature -vfp4d16 -target-feature -vfp4d16sp -target-feature -vfp4sp -target-feature -fp-armv8 -target-feature -fp-armv8d16 -target-feature -fp-armv8d16sp -target-feature -fp-armv8sp -target-feature -fullfp16 -target-feature +fp64 -target-feature +d32 -target-feature +neon -target-feature -sha2 -target-feature -aes -target-feature -fp16fml -target-abi aapcs-linux -mfloat-abi soft -debug-info-kind=constructor -dwarf-version=4 -debugger-tuning=gdb -fdebug-compilation-dir=/Users/hamzaaleghwairyeen/development/App/Intaleq/android/app/.cxx/RelWithDebInfo/6t1m4b5v/armeabi-v7a/CMakeFiles/CMakeScratch/TryCompile-l9oUbK -v -ffunction-sections -fdata-sections -fcoverage-compilation-dir=/Users/hamzaaleghwairyeen/development/App/Intaleq/android/app/.cxx/RelWithDebInfo/6t1m4b5v/armeabi-v7a/CMakeFiles/CMakeScratch/TryCompile-l9oUbK -resource-dir /Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/lib/clang/18 -dependency-file CMakeFiles/cmTC_b63cf.dir/CMakeCCompilerABI.c.o.d -MT CMakeFiles/cmTC_b63cf.dir/CMakeCCompilerABI.c.o -sys-header-deps -D ANDROID -D _FORTIFY_SOURCE=2 -isysroot /Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot -internal-isystem /Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/lib/clang/18/include -internal-isystem /Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/local/include -internal-externc-isystem /Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/include/arm-linux-androideabi -internal-externc-isystem /Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/include -internal-externc-isystem /Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/include -Wformat -ferror-limit 19 -femulated-tls -stack-protector 2 -fno-signed-char -fgnuc-version=4.2.1 -D__GCC_HAVE_DWARF2_CFI_ASM=1 -o CMakeFiles/cmTC_b63cf.dir/CMakeCCompilerABI.c.o -x c /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeCCompilerABI.c] + ignore line: [clang -cc1 version 18.0.1 based upon LLVM 18.0.1 default target x86_64-apple-darwin24.5.0] + ignore line: [ignoring nonexistent directory "/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/local/include"] + ignore line: [ignoring nonexistent directory "/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/include"] + ignore line: [#include "..." search starts here:] + ignore line: [#include <...> search starts here:] + ignore line: [ /Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/lib/clang/18/include] + ignore line: [ /Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/include/arm-linux-androideabi] + ignore line: [ /Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/include] + ignore line: [End of search list.] + ignore line: [[2/2] : && /Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/bin/clang --target=armv7-none-linux-androideabi23 --sysroot=/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot -g -DANDROID -fdata-sections -ffunction-sections -funwind-tables -fstack-protector-strong -no-canonical-prefixes -D_FORTIFY_SOURCE=2 -march=armv7-a -mthumb -Wformat -static-libstdc++ -Wl --build-id=sha1 -Wl --no-rosegment -Wl --no-undefined-version -Wl --fatal-warnings -Wl --no-undefined -Qunused-arguments -v CMakeFiles/cmTC_b63cf.dir/CMakeCCompilerABI.c.o -o cmTC_b63cf && :] + ignore line: [Android (12027248 +pgo -bolt +lto -mlgo based on r522817) clang version 18.0.1 (https://android.googlesource.com/toolchain/llvm-project d8003a456d14a3deb8054cdaa529ffbf02d9b262)] + ignore line: [Target: armv7-none-linux-android23] + ignore line: [Thread model: posix] + ignore line: [InstalledDir: /Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/bin] + link line: [ "/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/bin/ld.lld" --sysroot=/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot -EL -z now -z relro -z max-page-size=4096 -X --hash-style=gnu --eh-frame-hdr -m armelf_linux_eabi -pie -dynamic-linker /system/bin/linker -o cmTC_b63cf /Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/lib/arm-linux-androideabi/23/crtbegin_dynamic.o -L/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/lib/clang/18/lib/linux/arm -L/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/lib/arm-linux-androideabi/23 -L/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/lib/arm-linux-androideabi -L/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/lib/../lib -L/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/lib --build-id=sha1 --no-rosegment --no-undefined-version --fatal-warnings --no-undefined CMakeFiles/cmTC_b63cf.dir/CMakeCCompilerABI.c.o /Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/lib/clang/18/lib/linux/libclang_rt.builtins-arm-android.a -l:libunwind.a -ldl -lc /Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/lib/clang/18/lib/linux/libclang_rt.builtins-arm-android.a -l:libunwind.a -ldl /Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/lib/arm-linux-androideabi/23/crtend_android.o] + arg [/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/bin/ld.lld] ==> ignore + arg [--sysroot=/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot] ==> ignore + arg [-EL] ==> ignore + arg [-znow] ==> ignore + arg [-zrelro] ==> ignore + arg [-zmax-page-size=4096] ==> ignore + arg [-X] ==> ignore + arg [--hash-style=gnu] ==> ignore + arg [--eh-frame-hdr] ==> ignore + arg [-m] ==> ignore + arg [armelf_linux_eabi] ==> ignore + arg [-pie] ==> ignore + arg [-dynamic-linker] ==> ignore + arg [/system/bin/linker] ==> ignore + arg [-o] ==> ignore + arg [cmTC_b63cf] ==> ignore + arg [/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/lib/arm-linux-androideabi/23/crtbegin_dynamic.o] ==> obj [/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/lib/arm-linux-androideabi/23/crtbegin_dynamic.o] + arg [-L/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/lib/clang/18/lib/linux/arm] ==> dir [/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/lib/clang/18/lib/linux/arm] + arg [-L/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/lib/arm-linux-androideabi/23] ==> dir [/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/lib/arm-linux-androideabi/23] + arg [-L/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/lib/arm-linux-androideabi] ==> dir [/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/lib/arm-linux-androideabi] + arg [-L/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/lib/../lib] ==> dir [/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/lib/../lib] + arg [-L/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/lib] ==> dir [/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/lib] + arg [--build-id=sha1] ==> ignore + arg [--no-rosegment] ==> ignore + arg [--no-undefined-version] ==> ignore + arg [--fatal-warnings] ==> ignore + arg [--no-undefined] ==> ignore + arg [CMakeFiles/cmTC_b63cf.dir/CMakeCCompilerABI.c.o] ==> ignore + arg [/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/lib/clang/18/lib/linux/libclang_rt.builtins-arm-android.a] ==> lib [/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/lib/clang/18/lib/linux/libclang_rt.builtins-arm-android.a] + arg [-l:libunwind.a] ==> lib [-l:libunwind.a] + arg [-ldl] ==> lib [dl] + arg [-lc] ==> lib [c] + arg [/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/lib/clang/18/lib/linux/libclang_rt.builtins-arm-android.a] ==> lib [/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/lib/clang/18/lib/linux/libclang_rt.builtins-arm-android.a] + arg [-l:libunwind.a] ==> lib [-l:libunwind.a] + arg [-ldl] ==> lib [dl] + arg [/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/lib/arm-linux-androideabi/23/crtend_android.o] ==> obj [/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/lib/arm-linux-androideabi/23/crtend_android.o] + linker tool for 'C': /Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/bin/ld.lld + remove lib [/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/lib/clang/18/lib/linux/libclang_rt.builtins-arm-android.a] + remove lib [/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/lib/clang/18/lib/linux/libclang_rt.builtins-arm-android.a] + collapse library dir [/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/lib/clang/18/lib/linux/arm] ==> [/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/lib/clang/18/lib/linux/arm] + collapse library dir [/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/lib/arm-linux-androideabi/23] ==> [/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/lib/arm-linux-androideabi/23] + collapse library dir [/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/lib/arm-linux-androideabi] ==> [/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/lib/arm-linux-androideabi] + collapse library dir [/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/lib/../lib] ==> [/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/lib] + collapse library dir [/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/lib] ==> [/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/lib] + implicit libs: [-l:libunwind.a;dl;c;-l:libunwind.a;dl] + implicit objs: [/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/lib/arm-linux-androideabi/23/crtbegin_dynamic.o;/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/lib/arm-linux-androideabi/23/crtend_android.o] + implicit dirs: [/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/lib/clang/18/lib/linux/arm;/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/lib/arm-linux-androideabi/23;/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/lib/arm-linux-androideabi;/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/lib] + implicit fwks: [] + + + - + kind: "message-v1" + backtrace: + - "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Internal/CMakeDetermineLinkerId.cmake:40 (message)" + - "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeDetermineCompilerABI.cmake:255 (cmake_determine_linker_id)" + - "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeTestCCompiler.cmake:26 (CMAKE_DETERMINE_COMPILER_ABI)" + - "CMakeLists.txt:2 (project)" + message: | + Running the C compiler's linker: "/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/bin/ld.lld" "-v" + LLD 18.0.1 (compatible with GNU linkers) + - + kind: "try_compile-v1" + backtrace: + - "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeDetermineCompilerABI.cmake:74 (try_compile)" + - "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeTestCXXCompiler.cmake:26 (CMAKE_DETERMINE_COMPILER_ABI)" + - "CMakeLists.txt:2 (project)" + checks: + - "Detecting CXX compiler ABI info" + directories: + source: "/Users/hamzaaleghwairyeen/development/App/Intaleq/android/app/.cxx/RelWithDebInfo/6t1m4b5v/armeabi-v7a/CMakeFiles/CMakeScratch/TryCompile-Ezl3Z0" + binary: "/Users/hamzaaleghwairyeen/development/App/Intaleq/android/app/.cxx/RelWithDebInfo/6t1m4b5v/armeabi-v7a/CMakeFiles/CMakeScratch/TryCompile-Ezl3Z0" + cmakeVariables: + ANDROID_ABI: "armeabi-v7a" + ANDROID_ARM_MODE: "thumb" + ANDROID_ARM_NEON: "TRUE" + ANDROID_PIE: "TRUE" + ANDROID_PLATFORM: "android-23" + ANDROID_STL: "c++_static" + ANDROID_TOOLCHAIN: "clang" + CMAKE_CXX_COMPILER_CLANG_SCAN_DEPS: "/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/bin/clang-scan-deps" + CMAKE_CXX_COMPILER_TARGET: "armv7-none-linux-androideabi23" + CMAKE_CXX_FLAGS: "-g -DANDROID -fdata-sections -ffunction-sections -funwind-tables -fstack-protector-strong -no-canonical-prefixes -D_FORTIFY_SOURCE=2 -march=armv7-a -mthumb -Wformat " + CMAKE_CXX_FLAGS_DEBUG: "-fno-limit-debug-info " + CMAKE_CXX_SCAN_FOR_MODULES: "OFF" + CMAKE_C_COMPILER_TARGET: "armv7-none-linux-androideabi23" + CMAKE_EXE_LINKER_FLAGS: "-static-libstdc++ -Wl,--build-id=sha1 -Wl,--no-rosegment -Wl,--no-undefined-version -Wl,--fatal-warnings -Wl,--no-undefined -Qunused-arguments " + CMAKE_POSITION_INDEPENDENT_CODE: "TRUE" + CMAKE_SYSROOT: "/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot" + buildResult: + variable: "CMAKE_CXX_ABI_COMPILED" + cached: true + stdout: | + Change Dir: '/Users/hamzaaleghwairyeen/development/App/Intaleq/android/app/.cxx/RelWithDebInfo/6t1m4b5v/armeabi-v7a/CMakeFiles/CMakeScratch/TryCompile-Ezl3Z0' + + Run Build Command(s): /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/bin/ninja -v cmTC_b577a + [1/2] /Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/bin/clang++ --target=armv7-none-linux-androideabi23 --sysroot=/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot -g -DANDROID -fdata-sections -ffunction-sections -funwind-tables -fstack-protector-strong -no-canonical-prefixes -D_FORTIFY_SOURCE=2 -march=armv7-a -mthumb -Wformat -fPIE -v -MD -MT CMakeFiles/cmTC_b577a.dir/CMakeCXXCompilerABI.cpp.o -MF CMakeFiles/cmTC_b577a.dir/CMakeCXXCompilerABI.cpp.o.d -o CMakeFiles/cmTC_b577a.dir/CMakeCXXCompilerABI.cpp.o -c /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeCXXCompilerABI.cpp + Android (12027248, +pgo, -bolt, +lto, -mlgo, based on r522817) clang version 18.0.1 (https://android.googlesource.com/toolchain/llvm-project d8003a456d14a3deb8054cdaa529ffbf02d9b262) + Target: armv7-none-linux-android23 + Thread model: posix + InstalledDir: /Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/bin + (in-process) + "/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/bin/clang++" -cc1 -triple thumbv7-none-linux-android23 -emit-obj -mrelax-all -disable-free -clear-ast-before-backend -disable-llvm-verifier -discard-value-names -main-file-name CMakeCXXCompilerABI.cpp -mrelocation-model pic -pic-level 2 -pic-is-pie -mframe-pointer=all -ffp-contract=on -fno-rounding-math -mconstructor-aliases -funwind-tables=1 -target-cpu generic -target-feature +soft-float-abi -target-feature +vfp2 -target-feature +vfp2sp -target-feature +vfp3 -target-feature +vfp3d16 -target-feature +vfp3d16sp -target-feature +vfp3sp -target-feature -fp16 -target-feature -vfp4 -target-feature -vfp4d16 -target-feature -vfp4d16sp -target-feature -vfp4sp -target-feature -fp-armv8 -target-feature -fp-armv8d16 -target-feature -fp-armv8d16sp -target-feature -fp-armv8sp -target-feature -fullfp16 -target-feature +fp64 -target-feature +d32 -target-feature +neon -target-feature -sha2 -target-feature -aes -target-feature -fp16fml -target-abi aapcs-linux -mfloat-abi soft -debug-info-kind=constructor -dwarf-version=4 -debugger-tuning=gdb -fdebug-compilation-dir=/Users/hamzaaleghwairyeen/development/App/Intaleq/android/app/.cxx/RelWithDebInfo/6t1m4b5v/armeabi-v7a/CMakeFiles/CMakeScratch/TryCompile-Ezl3Z0 -v -ffunction-sections -fdata-sections -fcoverage-compilation-dir=/Users/hamzaaleghwairyeen/development/App/Intaleq/android/app/.cxx/RelWithDebInfo/6t1m4b5v/armeabi-v7a/CMakeFiles/CMakeScratch/TryCompile-Ezl3Z0 -resource-dir /Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/lib/clang/18 -dependency-file CMakeFiles/cmTC_b577a.dir/CMakeCXXCompilerABI.cpp.o.d -MT CMakeFiles/cmTC_b577a.dir/CMakeCXXCompilerABI.cpp.o -sys-header-deps -D ANDROID -D _FORTIFY_SOURCE=2 -isysroot /Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot -internal-isystem /Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/include/c++/v1 -internal-isystem /Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/lib/clang/18/include -internal-isystem /Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/local/include -internal-externc-isystem /Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/include/arm-linux-androideabi -internal-externc-isystem /Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/include -internal-externc-isystem /Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/include -Wformat -fdeprecated-macro -ferror-limit 19 -femulated-tls -stack-protector 2 -fno-signed-char -fgnuc-version=4.2.1 -fcxx-exceptions -fexceptions -D__GCC_HAVE_DWARF2_CFI_ASM=1 -o CMakeFiles/cmTC_b577a.dir/CMakeCXXCompilerABI.cpp.o -x c++ /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeCXXCompilerABI.cpp + clang -cc1 version 18.0.1 based upon LLVM 18.0.1 default target x86_64-apple-darwin24.5.0 + ignoring nonexistent directory "/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/local/include" + ignoring nonexistent directory "/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/include" + #include "..." search starts here: + #include <...> search starts here: + /Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/include/c++/v1 + /Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/lib/clang/18/include + /Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/include/arm-linux-androideabi + /Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/include + End of search list. + [2/2] : && /Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/bin/clang++ --target=armv7-none-linux-androideabi23 --sysroot=/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot -g -DANDROID -fdata-sections -ffunction-sections -funwind-tables -fstack-protector-strong -no-canonical-prefixes -D_FORTIFY_SOURCE=2 -march=armv7-a -mthumb -Wformat -static-libstdc++ -Wl,--build-id=sha1 -Wl,--no-rosegment -Wl,--no-undefined-version -Wl,--fatal-warnings -Wl,--no-undefined -Qunused-arguments -v CMakeFiles/cmTC_b577a.dir/CMakeCXXCompilerABI.cpp.o -o cmTC_b577a && : + Android (12027248, +pgo, -bolt, +lto, -mlgo, based on r522817) clang version 18.0.1 (https://android.googlesource.com/toolchain/llvm-project d8003a456d14a3deb8054cdaa529ffbf02d9b262) + Target: armv7-none-linux-android23 + Thread model: posix + InstalledDir: /Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/bin + "/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/bin/ld.lld" --sysroot=/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot -EL -z now -z relro -z max-page-size=4096 -X --hash-style=gnu --eh-frame-hdr -m armelf_linux_eabi -pie -dynamic-linker /system/bin/linker -o cmTC_b577a /Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/lib/arm-linux-androideabi/23/crtbegin_dynamic.o -L/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/lib/clang/18/lib/linux/arm -L/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/lib/arm-linux-androideabi/23 -L/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/lib/arm-linux-androideabi -L/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/lib/../lib -L/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/lib --build-id=sha1 --no-rosegment --no-undefined-version --fatal-warnings --no-undefined CMakeFiles/cmTC_b577a.dir/CMakeCXXCompilerABI.cpp.o -Bstatic -lc++ -Bdynamic -lm /Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/lib/clang/18/lib/linux/libclang_rt.builtins-arm-android.a -l:libunwind.a -ldl -lc /Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/lib/clang/18/lib/linux/libclang_rt.builtins-arm-android.a -l:libunwind.a -ldl /Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/lib/arm-linux-androideabi/23/crtend_android.o + + exitCode: 0 + - + kind: "message-v1" + backtrace: + - "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeDetermineCompilerABI.cmake:182 (message)" + - "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeTestCXXCompiler.cmake:26 (CMAKE_DETERMINE_COMPILER_ABI)" + - "CMakeLists.txt:2 (project)" + message: | + Parsed CXX implicit include dir info: rv=done + found start of include info + found start of implicit include info + add: [/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/include/c++/v1] + add: [/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/lib/clang/18/include] + add: [/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/include/arm-linux-androideabi] + add: [/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/include] + end of search list found + collapse include dir [/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/include/c++/v1] ==> [/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/include/c++/v1] + collapse include dir [/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/lib/clang/18/include] ==> [/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/lib/clang/18/include] + collapse include dir [/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/include/arm-linux-androideabi] ==> [/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/include/arm-linux-androideabi] + collapse include dir [/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/include] ==> [/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/include] + implicit include dirs: [/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/include/c++/v1;/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/lib/clang/18/include;/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/include/arm-linux-androideabi;/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/include] + + + - + kind: "message-v1" + backtrace: + - "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeDetermineCompilerABI.cmake:218 (message)" + - "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeTestCXXCompiler.cmake:26 (CMAKE_DETERMINE_COMPILER_ABI)" + - "CMakeLists.txt:2 (project)" + message: | + Parsed CXX implicit link information: + link line regex: [^( *|.*[/\\])(ld[0-9]*(\\.[a-z]+)?|CMAKE_LINK_STARTFILE-NOTFOUND|([^/\\]+-)?ld|collect2)[^/\\]*( |$)] + linker tool regex: [^[ ]*(->|")?[ ]*(([^"]*[/\\])?(ld[0-9]*(\\.[a-z]+)?))("|,| |$)] + ignore line: [Change Dir: '/Users/hamzaaleghwairyeen/development/App/Intaleq/android/app/.cxx/RelWithDebInfo/6t1m4b5v/armeabi-v7a/CMakeFiles/CMakeScratch/TryCompile-Ezl3Z0'] + ignore line: [] + ignore line: [Run Build Command(s): /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/bin/ninja -v cmTC_b577a] + ignore line: [[1/2] /Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/bin/clang++ --target=armv7-none-linux-androideabi23 --sysroot=/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot -g -DANDROID -fdata-sections -ffunction-sections -funwind-tables -fstack-protector-strong -no-canonical-prefixes -D_FORTIFY_SOURCE=2 -march=armv7-a -mthumb -Wformat -fPIE -v -MD -MT CMakeFiles/cmTC_b577a.dir/CMakeCXXCompilerABI.cpp.o -MF CMakeFiles/cmTC_b577a.dir/CMakeCXXCompilerABI.cpp.o.d -o CMakeFiles/cmTC_b577a.dir/CMakeCXXCompilerABI.cpp.o -c /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeCXXCompilerABI.cpp] + ignore line: [Android (12027248 +pgo -bolt +lto -mlgo based on r522817) clang version 18.0.1 (https://android.googlesource.com/toolchain/llvm-project d8003a456d14a3deb8054cdaa529ffbf02d9b262)] + ignore line: [Target: armv7-none-linux-android23] + ignore line: [Thread model: posix] + ignore line: [InstalledDir: /Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/bin] + ignore line: [ (in-process)] + ignore line: [ "/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/bin/clang++" -cc1 -triple thumbv7-none-linux-android23 -emit-obj -mrelax-all -disable-free -clear-ast-before-backend -disable-llvm-verifier -discard-value-names -main-file-name CMakeCXXCompilerABI.cpp -mrelocation-model pic -pic-level 2 -pic-is-pie -mframe-pointer=all -ffp-contract=on -fno-rounding-math -mconstructor-aliases -funwind-tables=1 -target-cpu generic -target-feature +soft-float-abi -target-feature +vfp2 -target-feature +vfp2sp -target-feature +vfp3 -target-feature +vfp3d16 -target-feature +vfp3d16sp -target-feature +vfp3sp -target-feature -fp16 -target-feature -vfp4 -target-feature -vfp4d16 -target-feature -vfp4d16sp -target-feature -vfp4sp -target-feature -fp-armv8 -target-feature -fp-armv8d16 -target-feature -fp-armv8d16sp -target-feature -fp-armv8sp -target-feature -fullfp16 -target-feature +fp64 -target-feature +d32 -target-feature +neon -target-feature -sha2 -target-feature -aes -target-feature -fp16fml -target-abi aapcs-linux -mfloat-abi soft -debug-info-kind=constructor -dwarf-version=4 -debugger-tuning=gdb -fdebug-compilation-dir=/Users/hamzaaleghwairyeen/development/App/Intaleq/android/app/.cxx/RelWithDebInfo/6t1m4b5v/armeabi-v7a/CMakeFiles/CMakeScratch/TryCompile-Ezl3Z0 -v -ffunction-sections -fdata-sections -fcoverage-compilation-dir=/Users/hamzaaleghwairyeen/development/App/Intaleq/android/app/.cxx/RelWithDebInfo/6t1m4b5v/armeabi-v7a/CMakeFiles/CMakeScratch/TryCompile-Ezl3Z0 -resource-dir /Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/lib/clang/18 -dependency-file CMakeFiles/cmTC_b577a.dir/CMakeCXXCompilerABI.cpp.o.d -MT CMakeFiles/cmTC_b577a.dir/CMakeCXXCompilerABI.cpp.o -sys-header-deps -D ANDROID -D _FORTIFY_SOURCE=2 -isysroot /Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot -internal-isystem /Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/include/c++/v1 -internal-isystem /Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/lib/clang/18/include -internal-isystem /Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/local/include -internal-externc-isystem /Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/include/arm-linux-androideabi -internal-externc-isystem /Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/include -internal-externc-isystem /Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/include -Wformat -fdeprecated-macro -ferror-limit 19 -femulated-tls -stack-protector 2 -fno-signed-char -fgnuc-version=4.2.1 -fcxx-exceptions -fexceptions -D__GCC_HAVE_DWARF2_CFI_ASM=1 -o CMakeFiles/cmTC_b577a.dir/CMakeCXXCompilerABI.cpp.o -x c++ /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeCXXCompilerABI.cpp] + ignore line: [clang -cc1 version 18.0.1 based upon LLVM 18.0.1 default target x86_64-apple-darwin24.5.0] + ignore line: [ignoring nonexistent directory "/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/local/include"] + ignore line: [ignoring nonexistent directory "/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/include"] + ignore line: [#include "..." search starts here:] + ignore line: [#include <...> search starts here:] + ignore line: [ /Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/include/c++/v1] + ignore line: [ /Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/lib/clang/18/include] + ignore line: [ /Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/include/arm-linux-androideabi] + ignore line: [ /Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/include] + ignore line: [End of search list.] + ignore line: [[2/2] : && /Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/bin/clang++ --target=armv7-none-linux-androideabi23 --sysroot=/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot -g -DANDROID -fdata-sections -ffunction-sections -funwind-tables -fstack-protector-strong -no-canonical-prefixes -D_FORTIFY_SOURCE=2 -march=armv7-a -mthumb -Wformat -static-libstdc++ -Wl --build-id=sha1 -Wl --no-rosegment -Wl --no-undefined-version -Wl --fatal-warnings -Wl --no-undefined -Qunused-arguments -v CMakeFiles/cmTC_b577a.dir/CMakeCXXCompilerABI.cpp.o -o cmTC_b577a && :] + ignore line: [Android (12027248 +pgo -bolt +lto -mlgo based on r522817) clang version 18.0.1 (https://android.googlesource.com/toolchain/llvm-project d8003a456d14a3deb8054cdaa529ffbf02d9b262)] + ignore line: [Target: armv7-none-linux-android23] + ignore line: [Thread model: posix] + ignore line: [InstalledDir: /Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/bin] + link line: [ "/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/bin/ld.lld" --sysroot=/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot -EL -z now -z relro -z max-page-size=4096 -X --hash-style=gnu --eh-frame-hdr -m armelf_linux_eabi -pie -dynamic-linker /system/bin/linker -o cmTC_b577a /Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/lib/arm-linux-androideabi/23/crtbegin_dynamic.o -L/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/lib/clang/18/lib/linux/arm -L/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/lib/arm-linux-androideabi/23 -L/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/lib/arm-linux-androideabi -L/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/lib/../lib -L/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/lib --build-id=sha1 --no-rosegment --no-undefined-version --fatal-warnings --no-undefined CMakeFiles/cmTC_b577a.dir/CMakeCXXCompilerABI.cpp.o -Bstatic -lc++ -Bdynamic -lm /Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/lib/clang/18/lib/linux/libclang_rt.builtins-arm-android.a -l:libunwind.a -ldl -lc /Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/lib/clang/18/lib/linux/libclang_rt.builtins-arm-android.a -l:libunwind.a -ldl /Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/lib/arm-linux-androideabi/23/crtend_android.o] + arg [/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/bin/ld.lld] ==> ignore + arg [--sysroot=/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot] ==> ignore + arg [-EL] ==> ignore + arg [-znow] ==> ignore + arg [-zrelro] ==> ignore + arg [-zmax-page-size=4096] ==> ignore + arg [-X] ==> ignore + arg [--hash-style=gnu] ==> ignore + arg [--eh-frame-hdr] ==> ignore + arg [-m] ==> ignore + arg [armelf_linux_eabi] ==> ignore + arg [-pie] ==> ignore + arg [-dynamic-linker] ==> ignore + arg [/system/bin/linker] ==> ignore + arg [-o] ==> ignore + arg [cmTC_b577a] ==> ignore + arg [/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/lib/arm-linux-androideabi/23/crtbegin_dynamic.o] ==> obj [/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/lib/arm-linux-androideabi/23/crtbegin_dynamic.o] + arg [-L/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/lib/clang/18/lib/linux/arm] ==> dir [/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/lib/clang/18/lib/linux/arm] + arg [-L/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/lib/arm-linux-androideabi/23] ==> dir [/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/lib/arm-linux-androideabi/23] + arg [-L/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/lib/arm-linux-androideabi] ==> dir [/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/lib/arm-linux-androideabi] + arg [-L/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/lib/../lib] ==> dir [/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/lib/../lib] + arg [-L/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/lib] ==> dir [/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/lib] + arg [--build-id=sha1] ==> ignore + arg [--no-rosegment] ==> ignore + arg [--no-undefined-version] ==> ignore + arg [--fatal-warnings] ==> ignore + arg [--no-undefined] ==> ignore + arg [CMakeFiles/cmTC_b577a.dir/CMakeCXXCompilerABI.cpp.o] ==> ignore + arg [-Bstatic] ==> search static + arg [-lc++] ==> lib [c++] + arg [-Bdynamic] ==> search dynamic + arg [-lm] ==> lib [m] + arg [/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/lib/clang/18/lib/linux/libclang_rt.builtins-arm-android.a] ==> lib [/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/lib/clang/18/lib/linux/libclang_rt.builtins-arm-android.a] + arg [-l:libunwind.a] ==> lib [-l:libunwind.a] + arg [-ldl] ==> lib [dl] + arg [-lc] ==> lib [c] + arg [/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/lib/clang/18/lib/linux/libclang_rt.builtins-arm-android.a] ==> lib [/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/lib/clang/18/lib/linux/libclang_rt.builtins-arm-android.a] + arg [-l:libunwind.a] ==> lib [-l:libunwind.a] + arg [-ldl] ==> lib [dl] + arg [/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/lib/arm-linux-androideabi/23/crtend_android.o] ==> obj [/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/lib/arm-linux-androideabi/23/crtend_android.o] + linker tool for 'CXX': /Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/bin/ld.lld + remove lib [/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/lib/clang/18/lib/linux/libclang_rt.builtins-arm-android.a] + remove lib [/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/lib/clang/18/lib/linux/libclang_rt.builtins-arm-android.a] + collapse library dir [/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/lib/clang/18/lib/linux/arm] ==> [/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/lib/clang/18/lib/linux/arm] + collapse library dir [/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/lib/arm-linux-androideabi/23] ==> [/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/lib/arm-linux-androideabi/23] + collapse library dir [/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/lib/arm-linux-androideabi] ==> [/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/lib/arm-linux-androideabi] + collapse library dir [/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/lib/../lib] ==> [/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/lib] + collapse library dir [/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/lib] ==> [/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/lib] + implicit libs: [c++;m;-l:libunwind.a;dl;c;-l:libunwind.a;dl] + implicit objs: [/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/lib/arm-linux-androideabi/23/crtbegin_dynamic.o;/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/lib/arm-linux-androideabi/23/crtend_android.o] + implicit dirs: [/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/lib/clang/18/lib/linux/arm;/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/lib/arm-linux-androideabi/23;/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/lib/arm-linux-androideabi;/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/lib] + implicit fwks: [] + + + - + kind: "message-v1" + backtrace: + - "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Internal/CMakeDetermineLinkerId.cmake:40 (message)" + - "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeDetermineCompilerABI.cmake:255 (cmake_determine_linker_id)" + - "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeTestCXXCompiler.cmake:26 (CMAKE_DETERMINE_COMPILER_ABI)" + - "CMakeLists.txt:2 (project)" + message: | + Running the CXX compiler's linker: "/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/bin/ld.lld" "-v" + LLD 18.0.1 (compatible with GNU linkers) +... diff --git a/siro_rider/android/app/.cxx/RelWithDebInfo/6t1m4b5v/armeabi-v7a/CMakeFiles/TargetDirectories.txt b/siro_rider/android/app/.cxx/RelWithDebInfo/6t1m4b5v/armeabi-v7a/CMakeFiles/TargetDirectories.txt new file mode 100644 index 0000000..3aea582 --- /dev/null +++ b/siro_rider/android/app/.cxx/RelWithDebInfo/6t1m4b5v/armeabi-v7a/CMakeFiles/TargetDirectories.txt @@ -0,0 +1,3 @@ +/Users/hamzaaleghwairyeen/development/App/Intaleq/android/app/.cxx/RelWithDebInfo/6t1m4b5v/armeabi-v7a/CMakeFiles/native-lib.dir +/Users/hamzaaleghwairyeen/development/App/Intaleq/android/app/.cxx/RelWithDebInfo/6t1m4b5v/armeabi-v7a/CMakeFiles/edit_cache.dir +/Users/hamzaaleghwairyeen/development/App/Intaleq/android/app/.cxx/RelWithDebInfo/6t1m4b5v/armeabi-v7a/CMakeFiles/rebuild_cache.dir diff --git a/siro_rider/android/app/.cxx/RelWithDebInfo/6t1m4b5v/armeabi-v7a/CMakeFiles/cmake.check_cache b/siro_rider/android/app/.cxx/RelWithDebInfo/6t1m4b5v/armeabi-v7a/CMakeFiles/cmake.check_cache new file mode 100644 index 0000000..3dccd73 --- /dev/null +++ b/siro_rider/android/app/.cxx/RelWithDebInfo/6t1m4b5v/armeabi-v7a/CMakeFiles/cmake.check_cache @@ -0,0 +1 @@ +# This file is generated by cmake for dependency checking of the CMakeCache.txt file diff --git a/siro_rider/android/app/.cxx/RelWithDebInfo/6t1m4b5v/armeabi-v7a/CMakeFiles/native-lib.dir/native-lib.cpp.o b/siro_rider/android/app/.cxx/RelWithDebInfo/6t1m4b5v/armeabi-v7a/CMakeFiles/native-lib.dir/native-lib.cpp.o new file mode 100644 index 0000000..bb73c5a Binary files /dev/null and b/siro_rider/android/app/.cxx/RelWithDebInfo/6t1m4b5v/armeabi-v7a/CMakeFiles/native-lib.dir/native-lib.cpp.o differ diff --git a/siro_rider/android/app/.cxx/RelWithDebInfo/6t1m4b5v/armeabi-v7a/CMakeFiles/rules.ninja b/siro_rider/android/app/.cxx/RelWithDebInfo/6t1m4b5v/armeabi-v7a/CMakeFiles/rules.ninja new file mode 100644 index 0000000..717d6ac --- /dev/null +++ b/siro_rider/android/app/.cxx/RelWithDebInfo/6t1m4b5v/armeabi-v7a/CMakeFiles/rules.ninja @@ -0,0 +1,66 @@ +# CMAKE generated file: DO NOT EDIT! +# Generated by "Ninja" Generator, CMake Version 3.31 + +# This file contains all the rules used to get the outputs files +# built from the input files. +# It is included in the main 'build.ninja'. + +# ============================================================================= +# Project: intaleq +# Configurations: RelWithDebInfo +# ============================================================================= +# ============================================================================= + +############################################# +# Rule for compiling CXX files. + +rule CXX_COMPILER__native-lib_unscanned_RelWithDebInfo + depfile = $DEP_FILE + deps = gcc + command = ${LAUNCHER}${CODE_CHECK}/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/bin/clang++ --target=armv7-none-linux-androideabi23 --sysroot=/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot $DEFINES $INCLUDES $FLAGS -MD -MT $out -MF $DEP_FILE -o $out -c $in + description = Building CXX object $out + + +############################################# +# Rule for linking CXX shared library. + +rule CXX_SHARED_LIBRARY_LINKER__native-lib_RelWithDebInfo + depfile = $DEP_FILE + deps = gcc + command = $PRE_LINK && /Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/bin/clang++ --target=armv7-none-linux-androideabi23 --sysroot=/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot -fPIC $LANGUAGE_COMPILE_FLAGS $ARCH_FLAGS $LINK_FLAGS -shared $SONAME_FLAG$SONAME -o $TARGET_FILE $in $LINK_PATH $LINK_LIBRARIES && $POST_BUILD + description = Linking CXX shared library $TARGET_FILE + restat = $RESTAT + + +############################################# +# Rule for running custom commands. + +rule CUSTOM_COMMAND + command = $COMMAND + description = $DESC + + +############################################# +# Rule for re-running cmake. + +rule RERUN_CMAKE + command = /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/bin/cmake --regenerate-during-build -S/Users/hamzaaleghwairyeen/development/App/Intaleq/android/app/src/main/cpp -B/Users/hamzaaleghwairyeen/development/App/Intaleq/android/app/.cxx/RelWithDebInfo/6t1m4b5v/armeabi-v7a + description = Re-running CMake... + generator = 1 + + +############################################# +# Rule for cleaning all built files. + +rule CLEAN + command = /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/bin/ninja $FILE_ARG -t clean $TARGETS + description = Cleaning all built files... + + +############################################# +# Rule for printing all primary targets available. + +rule HELP + command = /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/bin/ninja -t targets + description = All primary targets available: + diff --git a/siro_rider/android/app/.cxx/RelWithDebInfo/6t1m4b5v/armeabi-v7a/additional_project_files.txt b/siro_rider/android/app/.cxx/RelWithDebInfo/6t1m4b5v/armeabi-v7a/additional_project_files.txt new file mode 100644 index 0000000..e69de29 diff --git a/siro_rider/android/app/.cxx/RelWithDebInfo/6t1m4b5v/armeabi-v7a/android_gradle_build.json b/siro_rider/android/app/.cxx/RelWithDebInfo/6t1m4b5v/armeabi-v7a/android_gradle_build.json new file mode 100644 index 0000000..95b9b1f --- /dev/null +++ b/siro_rider/android/app/.cxx/RelWithDebInfo/6t1m4b5v/armeabi-v7a/android_gradle_build.json @@ -0,0 +1,38 @@ +{ + "buildFiles": [ + "/Users/hamzaaleghwairyeen/development/App/Intaleq/android/app/src/main/cpp/CMakeLists.txt" + ], + "cleanCommandsComponents": [ + [ + "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/bin/ninja", + "-C", + "/Users/hamzaaleghwairyeen/development/App/Intaleq/android/app/.cxx/RelWithDebInfo/6t1m4b5v/armeabi-v7a", + "clean" + ] + ], + "buildTargetsCommandComponents": [ + "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/bin/ninja", + "-C", + "/Users/hamzaaleghwairyeen/development/App/Intaleq/android/app/.cxx/RelWithDebInfo/6t1m4b5v/armeabi-v7a", + "{LIST_OF_TARGETS_TO_BUILD}" + ], + "libraries": { + "native-lib::@6890427a1f51a3e7e1df": { + "toolchain": "toolchain", + "abi": "armeabi-v7a", + "artifactName": "native-lib", + "output": "/Users/hamzaaleghwairyeen/development/App/Intaleq/build/app/intermediates/cxx/RelWithDebInfo/6t1m4b5v/obj/armeabi-v7a/libnative-lib.so", + "runtimeFiles": [] + } + }, + "toolchains": { + "toolchain": { + "cCompilerExecutable": "/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/bin/clang.lld", + "cppCompilerExecutable": "/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/bin/clang++.lld" + } + }, + "cFileExtensions": [], + "cppFileExtensions": [ + "cpp" + ] +} \ No newline at end of file diff --git a/siro_rider/android/app/.cxx/RelWithDebInfo/6t1m4b5v/armeabi-v7a/android_gradle_build_mini.json b/siro_rider/android/app/.cxx/RelWithDebInfo/6t1m4b5v/armeabi-v7a/android_gradle_build_mini.json new file mode 100644 index 0000000..68a6155 --- /dev/null +++ b/siro_rider/android/app/.cxx/RelWithDebInfo/6t1m4b5v/armeabi-v7a/android_gradle_build_mini.json @@ -0,0 +1,27 @@ +{ + "buildFiles": [ + "/Users/hamzaaleghwairyeen/development/App/Intaleq/android/app/src/main/cpp/CMakeLists.txt" + ], + "cleanCommandsComponents": [ + [ + "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/bin/ninja", + "-C", + "/Users/hamzaaleghwairyeen/development/App/Intaleq/android/app/.cxx/RelWithDebInfo/6t1m4b5v/armeabi-v7a", + "clean" + ] + ], + "buildTargetsCommandComponents": [ + "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/bin/ninja", + "-C", + "/Users/hamzaaleghwairyeen/development/App/Intaleq/android/app/.cxx/RelWithDebInfo/6t1m4b5v/armeabi-v7a", + "{LIST_OF_TARGETS_TO_BUILD}" + ], + "libraries": { + "native-lib::@6890427a1f51a3e7e1df": { + "artifactName": "native-lib", + "abi": "armeabi-v7a", + "output": "/Users/hamzaaleghwairyeen/development/App/Intaleq/build/app/intermediates/cxx/RelWithDebInfo/6t1m4b5v/obj/armeabi-v7a/libnative-lib.so", + "runtimeFiles": [] + } + } +} \ No newline at end of file diff --git a/siro_rider/android/app/.cxx/RelWithDebInfo/6t1m4b5v/armeabi-v7a/build.ninja b/siro_rider/android/app/.cxx/RelWithDebInfo/6t1m4b5v/armeabi-v7a/build.ninja new file mode 100644 index 0000000..b05846a --- /dev/null +++ b/siro_rider/android/app/.cxx/RelWithDebInfo/6t1m4b5v/armeabi-v7a/build.ninja @@ -0,0 +1,156 @@ +# CMAKE generated file: DO NOT EDIT! +# Generated by "Ninja" Generator, CMake Version 3.31 + +# This file contains all the build statements describing the +# compilation DAG. + +# ============================================================================= +# Write statements declared in CMakeLists.txt: +# +# Which is the root file. +# ============================================================================= + +# ============================================================================= +# Project: intaleq +# Configurations: RelWithDebInfo +# ============================================================================= + +############################################# +# Minimal version of Ninja required by this file + +ninja_required_version = 1.5 + + +############################################# +# Set configuration variable for custom commands. + +CONFIGURATION = RelWithDebInfo +# ============================================================================= +# Include auxiliary files. + + +############################################# +# Include rules file. + +include CMakeFiles/rules.ninja + +# ============================================================================= + +############################################# +# Logical path to working directory; prefix for absolute paths. + +cmake_ninja_workdir = /Users/hamzaaleghwairyeen/development/App/Intaleq/android/app/.cxx/RelWithDebInfo/6t1m4b5v/armeabi-v7a/ +# ============================================================================= +# Object build statements for SHARED_LIBRARY target native-lib + + +############################################# +# Order-only phony target for native-lib + +build cmake_object_order_depends_target_native-lib: phony || . + +build CMakeFiles/native-lib.dir/native-lib.cpp.o: CXX_COMPILER__native-lib_unscanned_RelWithDebInfo /Users/hamzaaleghwairyeen/development/App/Intaleq/android/app/src/main/cpp/native-lib.cpp || cmake_object_order_depends_target_native-lib + DEFINES = -Dnative_lib_EXPORTS + DEP_FILE = CMakeFiles/native-lib.dir/native-lib.cpp.o.d + FLAGS = -g -DANDROID -fdata-sections -ffunction-sections -funwind-tables -fstack-protector-strong -no-canonical-prefixes -D_FORTIFY_SOURCE=2 -march=armv7-a -mthumb -Wformat -Werror=format-security -O2 -g -DNDEBUG -fPIC + OBJECT_DIR = CMakeFiles/native-lib.dir + OBJECT_FILE_DIR = CMakeFiles/native-lib.dir + TARGET_COMPILE_PDB = CMakeFiles/native-lib.dir/ + TARGET_PDB = /Users/hamzaaleghwairyeen/development/App/Intaleq/build/app/intermediates/cxx/RelWithDebInfo/6t1m4b5v/obj/armeabi-v7a/libnative-lib.pdb + + +# ============================================================================= +# Link build statements for SHARED_LIBRARY target native-lib + + +############################################# +# Link the shared library /Users/hamzaaleghwairyeen/development/App/Intaleq/build/app/intermediates/cxx/RelWithDebInfo/6t1m4b5v/obj/armeabi-v7a/libnative-lib.so + +build /Users/hamzaaleghwairyeen/development/App/Intaleq/build/app/intermediates/cxx/RelWithDebInfo/6t1m4b5v/obj/armeabi-v7a/libnative-lib.so: CXX_SHARED_LIBRARY_LINKER__native-lib_RelWithDebInfo CMakeFiles/native-lib.dir/native-lib.cpp.o | /Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/lib/arm-linux-androideabi/23/liblog.so + DEP_FILE = CMakeFiles/native-lib.dir/link.d + LANGUAGE_COMPILE_FLAGS = -g -DANDROID -fdata-sections -ffunction-sections -funwind-tables -fstack-protector-strong -no-canonical-prefixes -D_FORTIFY_SOURCE=2 -march=armv7-a -mthumb -Wformat -Werror=format-security -O2 -g -DNDEBUG + LINK_FLAGS = -static-libstdc++ -Wl,--build-id=sha1 -Wl,--no-rosegment -Wl,--no-undefined-version -Wl,--fatal-warnings -Wl,--no-undefined -Qunused-arguments -Wl,--gc-sections -Xlinker --dependency-file=CMakeFiles/native-lib.dir/link.d + LINK_LIBRARIES = /Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/lib/arm-linux-androideabi/23/liblog.so -latomic -lm + OBJECT_DIR = CMakeFiles/native-lib.dir + POST_BUILD = : + PRE_LINK = : + SONAME = libnative-lib.so + SONAME_FLAG = -Wl,-soname, + TARGET_COMPILE_PDB = CMakeFiles/native-lib.dir/ + TARGET_FILE = /Users/hamzaaleghwairyeen/development/App/Intaleq/build/app/intermediates/cxx/RelWithDebInfo/6t1m4b5v/obj/armeabi-v7a/libnative-lib.so + TARGET_PDB = /Users/hamzaaleghwairyeen/development/App/Intaleq/build/app/intermediates/cxx/RelWithDebInfo/6t1m4b5v/obj/armeabi-v7a/libnative-lib.pdb + + +############################################# +# Utility command for edit_cache + +build CMakeFiles/edit_cache.util: CUSTOM_COMMAND + COMMAND = cd /Users/hamzaaleghwairyeen/development/App/Intaleq/android/app/.cxx/RelWithDebInfo/6t1m4b5v/armeabi-v7a && /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/bin/ccmake -S/Users/hamzaaleghwairyeen/development/App/Intaleq/android/app/src/main/cpp -B/Users/hamzaaleghwairyeen/development/App/Intaleq/android/app/.cxx/RelWithDebInfo/6t1m4b5v/armeabi-v7a + DESC = Running CMake cache editor... + pool = console + restat = 1 + +build edit_cache: phony CMakeFiles/edit_cache.util + + +############################################# +# Utility command for rebuild_cache + +build CMakeFiles/rebuild_cache.util: CUSTOM_COMMAND + COMMAND = cd /Users/hamzaaleghwairyeen/development/App/Intaleq/android/app/.cxx/RelWithDebInfo/6t1m4b5v/armeabi-v7a && /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/bin/cmake --regenerate-during-build -S/Users/hamzaaleghwairyeen/development/App/Intaleq/android/app/src/main/cpp -B/Users/hamzaaleghwairyeen/development/App/Intaleq/android/app/.cxx/RelWithDebInfo/6t1m4b5v/armeabi-v7a + DESC = Running CMake to regenerate build system... + pool = console + restat = 1 + +build rebuild_cache: phony CMakeFiles/rebuild_cache.util + +# ============================================================================= +# Target aliases. + +build libnative-lib.so: phony /Users/hamzaaleghwairyeen/development/App/Intaleq/build/app/intermediates/cxx/RelWithDebInfo/6t1m4b5v/obj/armeabi-v7a/libnative-lib.so + +build native-lib: phony /Users/hamzaaleghwairyeen/development/App/Intaleq/build/app/intermediates/cxx/RelWithDebInfo/6t1m4b5v/obj/armeabi-v7a/libnative-lib.so + +# ============================================================================= +# Folder targets. + +# ============================================================================= + +############################################# +# Folder: /Users/hamzaaleghwairyeen/development/App/Intaleq/android/app/.cxx/RelWithDebInfo/6t1m4b5v/armeabi-v7a + +build all: phony /Users/hamzaaleghwairyeen/development/App/Intaleq/build/app/intermediates/cxx/RelWithDebInfo/6t1m4b5v/obj/armeabi-v7a/libnative-lib.so + +# ============================================================================= +# Built-in targets + + +############################################# +# Re-run CMake if any of its inputs changed. + +build build.ninja: RERUN_CMAKE | /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeCCompiler.cmake.in /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeCCompilerABI.c /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeCInformation.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeCXXCompiler.cmake.in /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeCXXCompilerABI.cpp /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeCXXInformation.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeCommonLanguageInclude.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeCompilerIdDetection.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeDetermineCCompiler.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeDetermineCXXCompiler.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeDetermineCompiler.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeDetermineCompilerABI.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeDetermineCompilerId.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeDetermineCompilerSupport.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeDetermineSystem.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeFindBinUtils.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeGenericSystem.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeInitializeConfigs.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeLanguageInformation.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeParseImplicitIncludeInfo.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeParseImplicitLinkInfo.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeParseLibraryArchitecture.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeSystem.cmake.in /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeSystemSpecificInformation.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeSystemSpecificInitialize.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeTestCCompiler.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeTestCXXCompiler.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeTestCompilerCommon.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/ADSP-DetermineCompiler.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/ARMCC-DetermineCompiler.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/ARMClang-DetermineCompiler.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/AppleClang-DetermineCompiler.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/Borland-DetermineCompiler.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/Bruce-C-DetermineCompiler.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/CMakeCommonCompilerMacros.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/Clang-C.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/Clang-CXX-CXXImportStd.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/Clang-CXX.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/Clang-DetermineCompiler.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/Clang-DetermineCompilerInternal.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/Clang-FindBinUtils.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/Clang.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/Compaq-C-DetermineCompiler.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/Compaq-CXX-DetermineCompiler.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/Cray-DetermineCompiler.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/CrayClang-DetermineCompiler.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/Embarcadero-DetermineCompiler.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/Fujitsu-DetermineCompiler.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/FujitsuClang-DetermineCompiler.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/GHS-DetermineCompiler.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/GNU-C-DetermineCompiler.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/GNU-CXX-DetermineCompiler.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/GNU.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/HP-C-DetermineCompiler.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/HP-CXX-DetermineCompiler.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/IAR-DetermineCompiler.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/IBMCPP-C-DetermineVersionInternal.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/IBMCPP-CXX-DetermineVersionInternal.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/IBMClang-C-DetermineCompiler.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/IBMClang-CXX-DetermineCompiler.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/Intel-DetermineCompiler.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/IntelLLVM-DetermineCompiler.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/LCC-C-DetermineCompiler.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/LCC-CXX-DetermineCompiler.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/MSVC-DetermineCompiler.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/NVHPC-DetermineCompiler.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/NVIDIA-DetermineCompiler.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/OpenWatcom-DetermineCompiler.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/OrangeC-DetermineCompiler.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/PGI-DetermineCompiler.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/PathScale-DetermineCompiler.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/SCO-DetermineCompiler.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/SDCC-C-DetermineCompiler.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/SunPro-C-DetermineCompiler.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/SunPro-CXX-DetermineCompiler.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/TI-DetermineCompiler.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/TIClang-DetermineCompiler.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/Tasking-DetermineCompiler.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/TinyCC-C-DetermineCompiler.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/VisualAge-C-DetermineCompiler.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/VisualAge-CXX-DetermineCompiler.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/Watcom-DetermineCompiler.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/XL-C-DetermineCompiler.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/XL-CXX-DetermineCompiler.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/XLClang-C-DetermineCompiler.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/XLClang-CXX-DetermineCompiler.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/zOS-C-DetermineCompiler.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/zOS-CXX-DetermineCompiler.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Internal/CMakeCLinkerInformation.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Internal/CMakeCXXLinkerInformation.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Internal/CMakeCommonLinkerInformation.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Internal/CMakeDetermineLinkerId.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Internal/FeatureTesting.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Linker/GNU.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Linker/LLD-C.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Linker/LLD-CXX.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Linker/LLD.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Platform/Android-Clang-C.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Platform/Android-Clang-CXX.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Platform/Android-Clang.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Platform/Android-Determine-C.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Platform/Android-Determine-CXX.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Platform/Android-Determine.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Platform/Android-Initialize.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Platform/Android.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Platform/Android/Determine-Compiler.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Platform/Linker/Android-LLD-C.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Platform/Linker/Android-LLD-CXX.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Platform/Linker/GNU.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Platform/Linker/Linux-GNU.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Platform/Linker/Linux-LLD-C.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Platform/Linker/Linux-LLD-CXX.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Platform/Linker/Linux-LLD.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Platform/Linux-Initialize.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Platform/Linux.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Platform/UnixPaths.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/build/cmake/abis.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/build/cmake/android-legacy.toolchain.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/build/cmake/android.toolchain.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/build/cmake/flags.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/build/cmake/hooks/pre/Android-Clang.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/build/cmake/hooks/pre/Android-Determine.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/build/cmake/hooks/pre/Android-Initialize.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/build/cmake/hooks/pre/Android.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/build/cmake/hooks/pre/Determine-Compiler.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/build/cmake/platforms.cmake /Users/hamzaaleghwairyeen/development/App/Intaleq/android/app/src/main/cpp/CMakeLists.txt CMakeCache.txt CMakeFiles/3.31.5-g6cf5163/CMakeCCompiler.cmake CMakeFiles/3.31.5-g6cf5163/CMakeCXXCompiler.cmake CMakeFiles/3.31.5-g6cf5163/CMakeSystem.cmake + pool = console + + +############################################# +# A missing CMake input file is not an error. + +build /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeCCompiler.cmake.in /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeCCompilerABI.c /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeCInformation.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeCXXCompiler.cmake.in /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeCXXCompilerABI.cpp /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeCXXInformation.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeCommonLanguageInclude.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeCompilerIdDetection.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeDetermineCCompiler.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeDetermineCXXCompiler.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeDetermineCompiler.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeDetermineCompilerABI.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeDetermineCompilerId.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeDetermineCompilerSupport.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeDetermineSystem.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeFindBinUtils.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeGenericSystem.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeInitializeConfigs.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeLanguageInformation.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeParseImplicitIncludeInfo.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeParseImplicitLinkInfo.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeParseLibraryArchitecture.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeSystem.cmake.in /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeSystemSpecificInformation.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeSystemSpecificInitialize.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeTestCCompiler.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeTestCXXCompiler.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeTestCompilerCommon.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/ADSP-DetermineCompiler.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/ARMCC-DetermineCompiler.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/ARMClang-DetermineCompiler.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/AppleClang-DetermineCompiler.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/Borland-DetermineCompiler.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/Bruce-C-DetermineCompiler.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/CMakeCommonCompilerMacros.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/Clang-C.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/Clang-CXX-CXXImportStd.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/Clang-CXX.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/Clang-DetermineCompiler.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/Clang-DetermineCompilerInternal.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/Clang-FindBinUtils.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/Clang.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/Compaq-C-DetermineCompiler.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/Compaq-CXX-DetermineCompiler.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/Cray-DetermineCompiler.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/CrayClang-DetermineCompiler.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/Embarcadero-DetermineCompiler.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/Fujitsu-DetermineCompiler.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/FujitsuClang-DetermineCompiler.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/GHS-DetermineCompiler.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/GNU-C-DetermineCompiler.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/GNU-CXX-DetermineCompiler.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/GNU.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/HP-C-DetermineCompiler.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/HP-CXX-DetermineCompiler.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/IAR-DetermineCompiler.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/IBMCPP-C-DetermineVersionInternal.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/IBMCPP-CXX-DetermineVersionInternal.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/IBMClang-C-DetermineCompiler.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/IBMClang-CXX-DetermineCompiler.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/Intel-DetermineCompiler.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/IntelLLVM-DetermineCompiler.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/LCC-C-DetermineCompiler.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/LCC-CXX-DetermineCompiler.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/MSVC-DetermineCompiler.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/NVHPC-DetermineCompiler.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/NVIDIA-DetermineCompiler.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/OpenWatcom-DetermineCompiler.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/OrangeC-DetermineCompiler.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/PGI-DetermineCompiler.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/PathScale-DetermineCompiler.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/SCO-DetermineCompiler.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/SDCC-C-DetermineCompiler.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/SunPro-C-DetermineCompiler.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/SunPro-CXX-DetermineCompiler.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/TI-DetermineCompiler.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/TIClang-DetermineCompiler.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/Tasking-DetermineCompiler.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/TinyCC-C-DetermineCompiler.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/VisualAge-C-DetermineCompiler.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/VisualAge-CXX-DetermineCompiler.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/Watcom-DetermineCompiler.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/XL-C-DetermineCompiler.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/XL-CXX-DetermineCompiler.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/XLClang-C-DetermineCompiler.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/XLClang-CXX-DetermineCompiler.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/zOS-C-DetermineCompiler.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/zOS-CXX-DetermineCompiler.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Internal/CMakeCLinkerInformation.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Internal/CMakeCXXLinkerInformation.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Internal/CMakeCommonLinkerInformation.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Internal/CMakeDetermineLinkerId.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Internal/FeatureTesting.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Linker/GNU.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Linker/LLD-C.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Linker/LLD-CXX.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Linker/LLD.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Platform/Android-Clang-C.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Platform/Android-Clang-CXX.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Platform/Android-Clang.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Platform/Android-Determine-C.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Platform/Android-Determine-CXX.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Platform/Android-Determine.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Platform/Android-Initialize.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Platform/Android.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Platform/Android/Determine-Compiler.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Platform/Linker/Android-LLD-C.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Platform/Linker/Android-LLD-CXX.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Platform/Linker/GNU.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Platform/Linker/Linux-GNU.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Platform/Linker/Linux-LLD-C.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Platform/Linker/Linux-LLD-CXX.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Platform/Linker/Linux-LLD.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Platform/Linux-Initialize.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Platform/Linux.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Platform/UnixPaths.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/build/cmake/abis.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/build/cmake/android-legacy.toolchain.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/build/cmake/android.toolchain.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/build/cmake/flags.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/build/cmake/hooks/pre/Android-Clang.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/build/cmake/hooks/pre/Android-Determine.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/build/cmake/hooks/pre/Android-Initialize.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/build/cmake/hooks/pre/Android.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/build/cmake/hooks/pre/Determine-Compiler.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/build/cmake/platforms.cmake /Users/hamzaaleghwairyeen/development/App/Intaleq/android/app/src/main/cpp/CMakeLists.txt CMakeCache.txt CMakeFiles/3.31.5-g6cf5163/CMakeCCompiler.cmake CMakeFiles/3.31.5-g6cf5163/CMakeCXXCompiler.cmake CMakeFiles/3.31.5-g6cf5163/CMakeSystem.cmake: phony + + +############################################# +# Clean all the built files. + +build clean: CLEAN + + +############################################# +# Print all primary targets available. + +build help: HELP + + +############################################# +# Make the all target the default. + +default all diff --git a/siro_rider/android/app/.cxx/RelWithDebInfo/6t1m4b5v/armeabi-v7a/build_file_index.txt b/siro_rider/android/app/.cxx/RelWithDebInfo/6t1m4b5v/armeabi-v7a/build_file_index.txt new file mode 100644 index 0000000..661f7ae --- /dev/null +++ b/siro_rider/android/app/.cxx/RelWithDebInfo/6t1m4b5v/armeabi-v7a/build_file_index.txt @@ -0,0 +1 @@ +/Users/hamzaaleghwairyeen/development/App/Intaleq/android/app/src/main/cpp/CMakeLists.txt \ No newline at end of file diff --git a/siro_rider/android/app/.cxx/RelWithDebInfo/6t1m4b5v/armeabi-v7a/cmake_install.cmake b/siro_rider/android/app/.cxx/RelWithDebInfo/6t1m4b5v/armeabi-v7a/cmake_install.cmake new file mode 100644 index 0000000..de2a3e0 --- /dev/null +++ b/siro_rider/android/app/.cxx/RelWithDebInfo/6t1m4b5v/armeabi-v7a/cmake_install.cmake @@ -0,0 +1,66 @@ +# Install script for directory: /Users/hamzaaleghwairyeen/development/App/Intaleq/android/app/src/main/cpp + +# Set the install prefix +if(NOT DEFINED CMAKE_INSTALL_PREFIX) + set(CMAKE_INSTALL_PREFIX "/usr/local") +endif() +string(REGEX REPLACE "/$" "" CMAKE_INSTALL_PREFIX "${CMAKE_INSTALL_PREFIX}") + +# Set the install configuration name. +if(NOT DEFINED CMAKE_INSTALL_CONFIG_NAME) + if(BUILD_TYPE) + string(REGEX REPLACE "^[^A-Za-z0-9_]+" "" + CMAKE_INSTALL_CONFIG_NAME "${BUILD_TYPE}") + else() + set(CMAKE_INSTALL_CONFIG_NAME "RelWithDebInfo") + endif() + message(STATUS "Install configuration: \"${CMAKE_INSTALL_CONFIG_NAME}\"") +endif() + +# Set the component getting installed. +if(NOT CMAKE_INSTALL_COMPONENT) + if(COMPONENT) + message(STATUS "Install component: \"${COMPONENT}\"") + set(CMAKE_INSTALL_COMPONENT "${COMPONENT}") + else() + set(CMAKE_INSTALL_COMPONENT) + endif() +endif() + +# Install shared libraries without execute permission? +if(NOT DEFINED CMAKE_INSTALL_SO_NO_EXE) + set(CMAKE_INSTALL_SO_NO_EXE "0") +endif() + +# Is this installation the result of a crosscompile? +if(NOT DEFINED CMAKE_CROSSCOMPILING) + set(CMAKE_CROSSCOMPILING "TRUE") +endif() + +# Set path to fallback-tool for dependency-resolution. +if(NOT DEFINED CMAKE_OBJDUMP) + set(CMAKE_OBJDUMP "/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/bin/llvm-objdump") +endif() + +string(REPLACE ";" "\n" CMAKE_INSTALL_MANIFEST_CONTENT + "${CMAKE_INSTALL_MANIFEST_FILES}") +if(CMAKE_INSTALL_LOCAL_ONLY) + file(WRITE "/Users/hamzaaleghwairyeen/development/App/Intaleq/android/app/.cxx/RelWithDebInfo/6t1m4b5v/armeabi-v7a/install_local_manifest.txt" + "${CMAKE_INSTALL_MANIFEST_CONTENT}") +endif() +if(CMAKE_INSTALL_COMPONENT) + if(CMAKE_INSTALL_COMPONENT MATCHES "^[a-zA-Z0-9_.+-]+$") + set(CMAKE_INSTALL_MANIFEST "install_manifest_${CMAKE_INSTALL_COMPONENT}.txt") + else() + string(MD5 CMAKE_INST_COMP_HASH "${CMAKE_INSTALL_COMPONENT}") + set(CMAKE_INSTALL_MANIFEST "install_manifest_${CMAKE_INST_COMP_HASH}.txt") + unset(CMAKE_INST_COMP_HASH) + endif() +else() + set(CMAKE_INSTALL_MANIFEST "install_manifest.txt") +endif() + +if(NOT CMAKE_INSTALL_LOCAL_ONLY) + file(WRITE "/Users/hamzaaleghwairyeen/development/App/Intaleq/android/app/.cxx/RelWithDebInfo/6t1m4b5v/armeabi-v7a/${CMAKE_INSTALL_MANIFEST}" + "${CMAKE_INSTALL_MANIFEST_CONTENT}") +endif() diff --git a/siro_rider/android/app/.cxx/RelWithDebInfo/6t1m4b5v/armeabi-v7a/compile_commands.json b/siro_rider/android/app/.cxx/RelWithDebInfo/6t1m4b5v/armeabi-v7a/compile_commands.json new file mode 100644 index 0000000..442145a --- /dev/null +++ b/siro_rider/android/app/.cxx/RelWithDebInfo/6t1m4b5v/armeabi-v7a/compile_commands.json @@ -0,0 +1,8 @@ +[ +{ + "directory": "/Users/hamzaaleghwairyeen/development/App/Intaleq/android/app/.cxx/RelWithDebInfo/6t1m4b5v/armeabi-v7a", + "command": "/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/bin/clang++ --target=armv7-none-linux-androideabi23 --sysroot=/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot -Dnative_lib_EXPORTS -g -DANDROID -fdata-sections -ffunction-sections -funwind-tables -fstack-protector-strong -no-canonical-prefixes -D_FORTIFY_SOURCE=2 -march=armv7-a -mthumb -Wformat -Werror=format-security -O2 -g -DNDEBUG -fPIC -o CMakeFiles/native-lib.dir/native-lib.cpp.o -c /Users/hamzaaleghwairyeen/development/App/Intaleq/android/app/src/main/cpp/native-lib.cpp", + "file": "/Users/hamzaaleghwairyeen/development/App/Intaleq/android/app/src/main/cpp/native-lib.cpp", + "output": "CMakeFiles/native-lib.dir/native-lib.cpp.o" +} +] \ No newline at end of file diff --git a/siro_rider/android/app/.cxx/RelWithDebInfo/6t1m4b5v/armeabi-v7a/compile_commands.json.bin b/siro_rider/android/app/.cxx/RelWithDebInfo/6t1m4b5v/armeabi-v7a/compile_commands.json.bin new file mode 100644 index 0000000..5dd46c1 Binary files /dev/null and b/siro_rider/android/app/.cxx/RelWithDebInfo/6t1m4b5v/armeabi-v7a/compile_commands.json.bin differ diff --git a/siro_rider/android/app/.cxx/RelWithDebInfo/6t1m4b5v/armeabi-v7a/configure_fingerprint.bin b/siro_rider/android/app/.cxx/RelWithDebInfo/6t1m4b5v/armeabi-v7a/configure_fingerprint.bin new file mode 100644 index 0000000..1d443fa --- /dev/null +++ b/siro_rider/android/app/.cxx/RelWithDebInfo/6t1m4b5v/armeabi-v7a/configure_fingerprint.bin @@ -0,0 +1,28 @@ +C/C++ Structured Log + +/Users/hamzaaleghwairyeen/development/App/Intaleq/android/app/.cxx/RelWithDebInfo/6t1m4b5v/armeabi-v7a/additional_project_files.txtC +A +?com.android.build.gradle.internal.cxx.io.EncodedFileFingerPrint  3  ݻ2 + +/Users/hamzaaleghwairyeen/development/App/Intaleq/android/app/.cxx/RelWithDebInfo/6t1m4b5v/armeabi-v7a/android_gradle_build.json  3 给2 + +/Users/hamzaaleghwairyeen/development/App/Intaleq/android/app/.cxx/RelWithDebInfo/6t1m4b5v/armeabi-v7a/android_gradle_build_mini.json  3 컙2v +t +r/Users/hamzaaleghwairyeen/development/App/Intaleq/android/app/.cxx/RelWithDebInfo/6t1m4b5v/armeabi-v7a/build.ninja  3 ͻ2z +x +v/Users/hamzaaleghwairyeen/development/App/Intaleq/android/app/.cxx/RelWithDebInfo/6t1m4b5v/armeabi-v7a/build.ninja.txt  3 +} +{/Users/hamzaaleghwairyeen/development/App/Intaleq/android/app/.cxx/RelWithDebInfo/6t1m4b5v/armeabi-v7a/build_file_index.txt  3 Y 2 +~ +|/Users/hamzaaleghwairyeen/development/App/Intaleq/android/app/.cxx/RelWithDebInfo/6t1m4b5v/armeabi-v7a/compile_commands.json  3 ͻ2 + +/Users/hamzaaleghwairyeen/development/App/Intaleq/android/app/.cxx/RelWithDebInfo/6t1m4b5v/armeabi-v7a/compile_commands.json.bin  3  ͻ2 + +/Users/hamzaaleghwairyeen/development/App/Intaleq/android/app/.cxx/RelWithDebInfo/6t1m4b5v/armeabi-v7a/metadata_generation_command.txt  3 + 2} +{ +y/Users/hamzaaleghwairyeen/development/App/Intaleq/android/app/.cxx/RelWithDebInfo/6t1m4b5v/armeabi-v7a/prefab_config.json  3  ( 2 + +~/Users/hamzaaleghwairyeen/development/App/Intaleq/android/app/.cxx/RelWithDebInfo/6t1m4b5v/armeabi-v7a/symbol_folder_index.txt  3  u 2] +[ +Y/Users/hamzaaleghwairyeen/development/App/Intaleq/android/app/src/main/cpp/CMakeLists.txt  3  ޮ2 \ No newline at end of file diff --git a/siro_rider/android/app/.cxx/RelWithDebInfo/6t1m4b5v/armeabi-v7a/metadata_generation_command.txt b/siro_rider/android/app/.cxx/RelWithDebInfo/6t1m4b5v/armeabi-v7a/metadata_generation_command.txt new file mode 100644 index 0000000..ed65412 --- /dev/null +++ b/siro_rider/android/app/.cxx/RelWithDebInfo/6t1m4b5v/armeabi-v7a/metadata_generation_command.txt @@ -0,0 +1,18 @@ + -H/Users/hamzaaleghwairyeen/development/App/Intaleq/android/app/src/main/cpp +-DCMAKE_SYSTEM_NAME=Android +-DCMAKE_EXPORT_COMPILE_COMMANDS=ON +-DCMAKE_SYSTEM_VERSION=23 +-DANDROID_PLATFORM=android-23 +-DANDROID_ABI=armeabi-v7a +-DCMAKE_ANDROID_ARCH_ABI=armeabi-v7a +-DANDROID_NDK=/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973 +-DCMAKE_ANDROID_NDK=/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973 +-DCMAKE_TOOLCHAIN_FILE=/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/build/cmake/android.toolchain.cmake +-DCMAKE_MAKE_PROGRAM=/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/bin/ninja +-DCMAKE_LIBRARY_OUTPUT_DIRECTORY=/Users/hamzaaleghwairyeen/development/App/Intaleq/build/app/intermediates/cxx/RelWithDebInfo/6t1m4b5v/obj/armeabi-v7a +-DCMAKE_RUNTIME_OUTPUT_DIRECTORY=/Users/hamzaaleghwairyeen/development/App/Intaleq/build/app/intermediates/cxx/RelWithDebInfo/6t1m4b5v/obj/armeabi-v7a +-DCMAKE_BUILD_TYPE=RelWithDebInfo +-B/Users/hamzaaleghwairyeen/development/App/Intaleq/android/app/.cxx/RelWithDebInfo/6t1m4b5v/armeabi-v7a +-GNinja + Build command args: [] + Version: 2 \ No newline at end of file diff --git a/siro_rider/android/app/.cxx/RelWithDebInfo/6t1m4b5v/armeabi-v7a/prefab_config.json b/siro_rider/android/app/.cxx/RelWithDebInfo/6t1m4b5v/armeabi-v7a/prefab_config.json new file mode 100644 index 0000000..e799de8 --- /dev/null +++ b/siro_rider/android/app/.cxx/RelWithDebInfo/6t1m4b5v/armeabi-v7a/prefab_config.json @@ -0,0 +1,4 @@ +{ + "enabled": false, + "packages": [] +} \ No newline at end of file diff --git a/siro_rider/android/app/.cxx/RelWithDebInfo/6t1m4b5v/armeabi-v7a/symbol_folder_index.txt b/siro_rider/android/app/.cxx/RelWithDebInfo/6t1m4b5v/armeabi-v7a/symbol_folder_index.txt new file mode 100644 index 0000000..1e873c1 --- /dev/null +++ b/siro_rider/android/app/.cxx/RelWithDebInfo/6t1m4b5v/armeabi-v7a/symbol_folder_index.txt @@ -0,0 +1 @@ +/Users/hamzaaleghwairyeen/development/App/Intaleq/build/app/intermediates/cxx/RelWithDebInfo/6t1m4b5v/obj/armeabi-v7a \ No newline at end of file diff --git a/siro_rider/android/app/.cxx/RelWithDebInfo/6t1m4b5v/hash_key.txt b/siro_rider/android/app/.cxx/RelWithDebInfo/6t1m4b5v/hash_key.txt new file mode 100644 index 0000000..96d8200 --- /dev/null +++ b/siro_rider/android/app/.cxx/RelWithDebInfo/6t1m4b5v/hash_key.txt @@ -0,0 +1,25 @@ +# Values used to calculate the hash in this folder name. +# Should not depend on the absolute path of the project itself. +# - AGP: 8.11.0. +# - $NDK is the path to NDK 27.0.12077973. +# - $PROJECT is the path to the parent folder of the root Gradle build file. +# - $ABI is the ABI to be built with. The specific value doesn't contribute to the value of the hash. +# - $HASH is the hash value computed from this text. +# - $CMAKE is the path to CMake 3.31.5. +# - $NINJA is the path to Ninja. +-H$PROJECT/app/src/main/cpp +-DCMAKE_SYSTEM_NAME=Android +-DCMAKE_EXPORT_COMPILE_COMMANDS=ON +-DCMAKE_SYSTEM_VERSION=23 +-DANDROID_PLATFORM=android-23 +-DANDROID_ABI=$ABI +-DCMAKE_ANDROID_ARCH_ABI=$ABI +-DANDROID_NDK=$NDK +-DCMAKE_ANDROID_NDK=$NDK +-DCMAKE_TOOLCHAIN_FILE=$NDK/build/cmake/android.toolchain.cmake +-DCMAKE_MAKE_PROGRAM=$NINJA +-DCMAKE_LIBRARY_OUTPUT_DIRECTORY=/Users/hamzaaleghwairyeen/development/App/Intaleq/build/app/intermediates/cxx/RelWithDebInfo/$HASH/obj/$ABI +-DCMAKE_RUNTIME_OUTPUT_DIRECTORY=/Users/hamzaaleghwairyeen/development/App/Intaleq/build/app/intermediates/cxx/RelWithDebInfo/$HASH/obj/$ABI +-DCMAKE_BUILD_TYPE=RelWithDebInfo +-B$PROJECT/app/.cxx/RelWithDebInfo/$HASH/$ABI +-GNinja \ No newline at end of file diff --git a/siro_rider/android/app/.cxx/RelWithDebInfo/6t1m4b5v/x86/.cmake/api/v1/query/client-agp/cache-v2 b/siro_rider/android/app/.cxx/RelWithDebInfo/6t1m4b5v/x86/.cmake/api/v1/query/client-agp/cache-v2 new file mode 100644 index 0000000..e69de29 diff --git a/siro_rider/android/app/.cxx/RelWithDebInfo/6t1m4b5v/x86/.cmake/api/v1/query/client-agp/cmakeFiles-v1 b/siro_rider/android/app/.cxx/RelWithDebInfo/6t1m4b5v/x86/.cmake/api/v1/query/client-agp/cmakeFiles-v1 new file mode 100644 index 0000000..e69de29 diff --git a/siro_rider/android/app/.cxx/RelWithDebInfo/6t1m4b5v/x86/.cmake/api/v1/query/client-agp/codemodel-v2 b/siro_rider/android/app/.cxx/RelWithDebInfo/6t1m4b5v/x86/.cmake/api/v1/query/client-agp/codemodel-v2 new file mode 100644 index 0000000..e69de29 diff --git a/siro_rider/android/app/.cxx/RelWithDebInfo/6t1m4b5v/x86/.cmake/api/v1/reply/cache-v2-877b4b6e02b454b55c99.json b/siro_rider/android/app/.cxx/RelWithDebInfo/6t1m4b5v/x86/.cmake/api/v1/reply/cache-v2-877b4b6e02b454b55c99.json new file mode 100644 index 0000000..f8aab55 --- /dev/null +++ b/siro_rider/android/app/.cxx/RelWithDebInfo/6t1m4b5v/x86/.cmake/api/v1/reply/cache-v2-877b4b6e02b454b55c99.json @@ -0,0 +1,1479 @@ +{ + "entries" : + [ + { + "name" : "ANDROID_ABI", + "properties" : + [ + { + "name" : "HELPSTRING", + "value" : "No help, variable specified on the command line." + } + ], + "type" : "UNINITIALIZED", + "value" : "x86" + }, + { + "name" : "ANDROID_NDK", + "properties" : + [ + { + "name" : "HELPSTRING", + "value" : "No help, variable specified on the command line." + } + ], + "type" : "UNINITIALIZED", + "value" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973" + }, + { + "name" : "ANDROID_PLATFORM", + "properties" : + [ + { + "name" : "HELPSTRING", + "value" : "No help, variable specified on the command line." + } + ], + "type" : "UNINITIALIZED", + "value" : "android-23" + }, + { + "name" : "CMAKE_ADDR2LINE", + "properties" : + [ + { + "name" : "ADVANCED", + "value" : "1" + }, + { + "name" : "HELPSTRING", + "value" : "Path to a program." + } + ], + "type" : "FILEPATH", + "value" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/bin/llvm-addr2line" + }, + { + "name" : "CMAKE_ANDROID_ARCH_ABI", + "properties" : + [ + { + "name" : "HELPSTRING", + "value" : "No help, variable specified on the command line." + } + ], + "type" : "UNINITIALIZED", + "value" : "x86" + }, + { + "name" : "CMAKE_ANDROID_NDK", + "properties" : + [ + { + "name" : "HELPSTRING", + "value" : "No help, variable specified on the command line." + } + ], + "type" : "UNINITIALIZED", + "value" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973" + }, + { + "name" : "CMAKE_AR", + "properties" : + [ + { + "name" : "ADVANCED", + "value" : "1" + }, + { + "name" : "HELPSTRING", + "value" : "Archiver" + } + ], + "type" : "FILEPATH", + "value" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/bin/llvm-ar" + }, + { + "name" : "CMAKE_ASM_FLAGS", + "properties" : + [ + { + "name" : "HELPSTRING", + "value" : "Flags used by the compiler during all build types." + } + ], + "type" : "STRING", + "value" : "" + }, + { + "name" : "CMAKE_ASM_FLAGS_DEBUG", + "properties" : + [ + { + "name" : "HELPSTRING", + "value" : "Flags used by the compiler during debug builds." + } + ], + "type" : "STRING", + "value" : "" + }, + { + "name" : "CMAKE_ASM_FLAGS_RELEASE", + "properties" : + [ + { + "name" : "HELPSTRING", + "value" : "Flags used by the compiler during release builds." + } + ], + "type" : "STRING", + "value" : "" + }, + { + "name" : "CMAKE_BUILD_TYPE", + "properties" : + [ + { + "name" : "HELPSTRING", + "value" : "Choose the type of build, options are: None Debug Release RelWithDebInfo MinSizeRel ..." + } + ], + "type" : "STRING", + "value" : "RelWithDebInfo" + }, + { + "name" : "CMAKE_CACHEFILE_DIR", + "properties" : + [ + { + "name" : "HELPSTRING", + "value" : "This is the directory where this CMakeCache.txt was created" + } + ], + "type" : "INTERNAL", + "value" : "/Users/hamzaaleghwairyeen/development/App/Intaleq/android/app/.cxx/RelWithDebInfo/6t1m4b5v/x86" + }, + { + "name" : "CMAKE_CACHE_MAJOR_VERSION", + "properties" : + [ + { + "name" : "HELPSTRING", + "value" : "Major version of cmake used to create the current loaded cache" + } + ], + "type" : "INTERNAL", + "value" : "3" + }, + { + "name" : "CMAKE_CACHE_MINOR_VERSION", + "properties" : + [ + { + "name" : "HELPSTRING", + "value" : "Minor version of cmake used to create the current loaded cache" + } + ], + "type" : "INTERNAL", + "value" : "31" + }, + { + "name" : "CMAKE_CACHE_PATCH_VERSION", + "properties" : + [ + { + "name" : "HELPSTRING", + "value" : "Patch version of cmake used to create the current loaded cache" + } + ], + "type" : "INTERNAL", + "value" : "5" + }, + { + "name" : "CMAKE_COMMAND", + "properties" : + [ + { + "name" : "HELPSTRING", + "value" : "Path to CMake executable." + } + ], + "type" : "INTERNAL", + "value" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/bin/cmake" + }, + { + "name" : "CMAKE_CPACK_COMMAND", + "properties" : + [ + { + "name" : "HELPSTRING", + "value" : "Path to cpack program executable." + } + ], + "type" : "INTERNAL", + "value" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/bin/cpack" + }, + { + "name" : "CMAKE_CTEST_COMMAND", + "properties" : + [ + { + "name" : "HELPSTRING", + "value" : "Path to ctest program executable." + } + ], + "type" : "INTERNAL", + "value" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/bin/ctest" + }, + { + "name" : "CMAKE_CXX_COMPILER", + "properties" : + [ + { + "name" : "ADVANCED", + "value" : "1" + }, + { + "name" : "HELPSTRING", + "value" : "" + } + ], + "type" : "UNINITIALIZED", + "value" : "" + }, + { + "name" : "CMAKE_CXX_COMPILER_AR", + "properties" : + [ + { + "name" : "ADVANCED", + "value" : "1" + }, + { + "name" : "HELPSTRING", + "value" : "LLVM archiver" + } + ], + "type" : "FILEPATH", + "value" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/bin/llvm-ar" + }, + { + "name" : "CMAKE_CXX_COMPILER_CLANG_SCAN_DEPS", + "properties" : + [ + { + "name" : "ADVANCED", + "value" : "1" + }, + { + "name" : "HELPSTRING", + "value" : "`clang-scan-deps` dependency scanner" + } + ], + "type" : "FILEPATH", + "value" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/bin/clang-scan-deps" + }, + { + "name" : "CMAKE_CXX_COMPILER_RANLIB", + "properties" : + [ + { + "name" : "ADVANCED", + "value" : "1" + }, + { + "name" : "HELPSTRING", + "value" : "Generate index for LLVM archive" + } + ], + "type" : "FILEPATH", + "value" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/bin/llvm-ranlib" + }, + { + "name" : "CMAKE_CXX_FLAGS", + "properties" : + [ + { + "name" : "ADVANCED", + "value" : "1" + }, + { + "name" : "HELPSTRING", + "value" : "Flags used by the compiler during all build types." + } + ], + "type" : "STRING", + "value" : "" + }, + { + "name" : "CMAKE_CXX_FLAGS_DEBUG", + "properties" : + [ + { + "name" : "ADVANCED", + "value" : "1" + }, + { + "name" : "HELPSTRING", + "value" : "Flags used by the compiler during debug builds." + } + ], + "type" : "STRING", + "value" : "" + }, + { + "name" : "CMAKE_CXX_FLAGS_MINSIZEREL", + "properties" : + [ + { + "name" : "ADVANCED", + "value" : "1" + }, + { + "name" : "HELPSTRING", + "value" : "Flags used by the CXX compiler during MINSIZEREL builds." + } + ], + "type" : "STRING", + "value" : "-Os -DNDEBUG" + }, + { + "name" : "CMAKE_CXX_FLAGS_RELEASE", + "properties" : + [ + { + "name" : "ADVANCED", + "value" : "1" + }, + { + "name" : "HELPSTRING", + "value" : "Flags used by the compiler during release builds." + } + ], + "type" : "STRING", + "value" : "" + }, + { + "name" : "CMAKE_CXX_FLAGS_RELWITHDEBINFO", + "properties" : + [ + { + "name" : "ADVANCED", + "value" : "1" + }, + { + "name" : "HELPSTRING", + "value" : "Flags used by the CXX compiler during RELWITHDEBINFO builds." + } + ], + "type" : "STRING", + "value" : "-O2 -g -DNDEBUG" + }, + { + "name" : "CMAKE_CXX_STANDARD_LIBRARIES", + "properties" : + [ + { + "name" : "ADVANCED", + "value" : "1" + }, + { + "name" : "HELPSTRING", + "value" : "Libraries linked by default with all C++ applications." + } + ], + "type" : "STRING", + "value" : "-latomic -lm" + }, + { + "name" : "CMAKE_C_COMPILER", + "properties" : + [ + { + "name" : "ADVANCED", + "value" : "1" + }, + { + "name" : "HELPSTRING", + "value" : "" + } + ], + "type" : "UNINITIALIZED", + "value" : "" + }, + { + "name" : "CMAKE_C_COMPILER_AR", + "properties" : + [ + { + "name" : "ADVANCED", + "value" : "1" + }, + { + "name" : "HELPSTRING", + "value" : "LLVM archiver" + } + ], + "type" : "FILEPATH", + "value" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/bin/llvm-ar" + }, + { + "name" : "CMAKE_C_COMPILER_CLANG_SCAN_DEPS", + "properties" : + [ + { + "name" : "ADVANCED", + "value" : "1" + }, + { + "name" : "HELPSTRING", + "value" : "`clang-scan-deps` dependency scanner" + } + ], + "type" : "FILEPATH", + "value" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/bin/clang-scan-deps" + }, + { + "name" : "CMAKE_C_COMPILER_RANLIB", + "properties" : + [ + { + "name" : "ADVANCED", + "value" : "1" + }, + { + "name" : "HELPSTRING", + "value" : "Generate index for LLVM archive" + } + ], + "type" : "FILEPATH", + "value" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/bin/llvm-ranlib" + }, + { + "name" : "CMAKE_C_FLAGS", + "properties" : + [ + { + "name" : "ADVANCED", + "value" : "1" + }, + { + "name" : "HELPSTRING", + "value" : "Flags used by the compiler during all build types." + } + ], + "type" : "STRING", + "value" : "" + }, + { + "name" : "CMAKE_C_FLAGS_DEBUG", + "properties" : + [ + { + "name" : "ADVANCED", + "value" : "1" + }, + { + "name" : "HELPSTRING", + "value" : "Flags used by the compiler during debug builds." + } + ], + "type" : "STRING", + "value" : "" + }, + { + "name" : "CMAKE_C_FLAGS_MINSIZEREL", + "properties" : + [ + { + "name" : "ADVANCED", + "value" : "1" + }, + { + "name" : "HELPSTRING", + "value" : "Flags used by the C compiler during MINSIZEREL builds." + } + ], + "type" : "STRING", + "value" : "-Os -DNDEBUG" + }, + { + "name" : "CMAKE_C_FLAGS_RELEASE", + "properties" : + [ + { + "name" : "ADVANCED", + "value" : "1" + }, + { + "name" : "HELPSTRING", + "value" : "Flags used by the compiler during release builds." + } + ], + "type" : "STRING", + "value" : "" + }, + { + "name" : "CMAKE_C_FLAGS_RELWITHDEBINFO", + "properties" : + [ + { + "name" : "ADVANCED", + "value" : "1" + }, + { + "name" : "HELPSTRING", + "value" : "Flags used by the C compiler during RELWITHDEBINFO builds." + } + ], + "type" : "STRING", + "value" : "-O2 -g -DNDEBUG" + }, + { + "name" : "CMAKE_C_STANDARD_LIBRARIES", + "properties" : + [ + { + "name" : "ADVANCED", + "value" : "1" + }, + { + "name" : "HELPSTRING", + "value" : "Libraries linked by default with all C applications." + } + ], + "type" : "STRING", + "value" : "-latomic -lm" + }, + { + "name" : "CMAKE_DLLTOOL", + "properties" : + [ + { + "name" : "ADVANCED", + "value" : "1" + }, + { + "name" : "HELPSTRING", + "value" : "Path to a program." + } + ], + "type" : "FILEPATH", + "value" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/bin/llvm-dlltool" + }, + { + "name" : "CMAKE_EDIT_COMMAND", + "properties" : + [ + { + "name" : "HELPSTRING", + "value" : "Path to cache edit program executable." + } + ], + "type" : "INTERNAL", + "value" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/bin/ccmake" + }, + { + "name" : "CMAKE_EXECUTABLE_FORMAT", + "properties" : + [ + { + "name" : "HELPSTRING", + "value" : "Executable file format" + } + ], + "type" : "INTERNAL", + "value" : "ELF" + }, + { + "name" : "CMAKE_EXE_LINKER_FLAGS", + "properties" : + [ + { + "name" : "ADVANCED", + "value" : "1" + }, + { + "name" : "HELPSTRING", + "value" : "Flags used by the linker." + } + ], + "type" : "STRING", + "value" : "" + }, + { + "name" : "CMAKE_EXE_LINKER_FLAGS_DEBUG", + "properties" : + [ + { + "name" : "ADVANCED", + "value" : "1" + }, + { + "name" : "HELPSTRING", + "value" : "Flags used by the linker during DEBUG builds." + } + ], + "type" : "STRING", + "value" : "" + }, + { + "name" : "CMAKE_EXE_LINKER_FLAGS_MINSIZEREL", + "properties" : + [ + { + "name" : "ADVANCED", + "value" : "1" + }, + { + "name" : "HELPSTRING", + "value" : "Flags used by the linker during MINSIZEREL builds." + } + ], + "type" : "STRING", + "value" : "" + }, + { + "name" : "CMAKE_EXE_LINKER_FLAGS_RELEASE", + "properties" : + [ + { + "name" : "ADVANCED", + "value" : "1" + }, + { + "name" : "HELPSTRING", + "value" : "Flags used by the linker during RELEASE builds." + } + ], + "type" : "STRING", + "value" : "" + }, + { + "name" : "CMAKE_EXE_LINKER_FLAGS_RELWITHDEBINFO", + "properties" : + [ + { + "name" : "ADVANCED", + "value" : "1" + }, + { + "name" : "HELPSTRING", + "value" : "Flags used by the linker during RELWITHDEBINFO builds." + } + ], + "type" : "STRING", + "value" : "" + }, + { + "name" : "CMAKE_EXPORT_BUILD_DATABASE", + "properties" : + [ + { + "name" : "ADVANCED", + "value" : "1" + }, + { + "name" : "HELPSTRING", + "value" : "Enable/Disable output of build database during the build." + } + ], + "type" : "BOOL", + "value" : "" + }, + { + "name" : "CMAKE_EXPORT_COMPILE_COMMANDS", + "properties" : + [ + { + "name" : "HELPSTRING", + "value" : "No help, variable specified on the command line." + } + ], + "type" : "UNINITIALIZED", + "value" : "ON" + }, + { + "name" : "CMAKE_EXTRA_GENERATOR", + "properties" : + [ + { + "name" : "HELPSTRING", + "value" : "Name of external makefile project generator." + } + ], + "type" : "INTERNAL", + "value" : "" + }, + { + "name" : "CMAKE_FIND_PACKAGE_REDIRECTS_DIR", + "properties" : + [ + { + "name" : "HELPSTRING", + "value" : "Value Computed by CMake." + } + ], + "type" : "STATIC", + "value" : "/Users/hamzaaleghwairyeen/development/App/Intaleq/android/app/.cxx/RelWithDebInfo/6t1m4b5v/x86/CMakeFiles/pkgRedirects" + }, + { + "name" : "CMAKE_GENERATOR", + "properties" : + [ + { + "name" : "HELPSTRING", + "value" : "Name of generator." + } + ], + "type" : "INTERNAL", + "value" : "Ninja" + }, + { + "name" : "CMAKE_GENERATOR_INSTANCE", + "properties" : + [ + { + "name" : "HELPSTRING", + "value" : "Generator instance identifier." + } + ], + "type" : "INTERNAL", + "value" : "" + }, + { + "name" : "CMAKE_GENERATOR_PLATFORM", + "properties" : + [ + { + "name" : "HELPSTRING", + "value" : "Name of generator platform." + } + ], + "type" : "INTERNAL", + "value" : "" + }, + { + "name" : "CMAKE_GENERATOR_TOOLSET", + "properties" : + [ + { + "name" : "HELPSTRING", + "value" : "Name of generator toolset." + } + ], + "type" : "INTERNAL", + "value" : "" + }, + { + "name" : "CMAKE_HOME_DIRECTORY", + "properties" : + [ + { + "name" : "HELPSTRING", + "value" : "Source directory with the top level CMakeLists.txt file for this project" + } + ], + "type" : "INTERNAL", + "value" : "/Users/hamzaaleghwairyeen/development/App/Intaleq/android/app/src/main/cpp" + }, + { + "name" : "CMAKE_INSTALL_PREFIX", + "properties" : + [ + { + "name" : "HELPSTRING", + "value" : "Install path prefix, prepended onto install directories." + } + ], + "type" : "PATH", + "value" : "/usr/local" + }, + { + "name" : "CMAKE_INSTALL_SO_NO_EXE", + "properties" : + [ + { + "name" : "HELPSTRING", + "value" : "Install .so files without execute permission." + } + ], + "type" : "INTERNAL", + "value" : "0" + }, + { + "name" : "CMAKE_LIBRARY_OUTPUT_DIRECTORY", + "properties" : + [ + { + "name" : "HELPSTRING", + "value" : "No help, variable specified on the command line." + } + ], + "type" : "UNINITIALIZED", + "value" : "/Users/hamzaaleghwairyeen/development/App/Intaleq/build/app/intermediates/cxx/RelWithDebInfo/6t1m4b5v/obj/x86" + }, + { + "name" : "CMAKE_LINKER", + "properties" : + [ + { + "name" : "ADVANCED", + "value" : "1" + }, + { + "name" : "HELPSTRING", + "value" : "Path to a program." + } + ], + "type" : "FILEPATH", + "value" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/bin/ld.lld" + }, + { + "name" : "CMAKE_MAKE_PROGRAM", + "properties" : + [ + { + "name" : "HELPSTRING", + "value" : "No help, variable specified on the command line." + } + ], + "type" : "UNINITIALIZED", + "value" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/bin/ninja" + }, + { + "name" : "CMAKE_MODULE_LINKER_FLAGS", + "properties" : + [ + { + "name" : "ADVANCED", + "value" : "1" + }, + { + "name" : "HELPSTRING", + "value" : "Flags used by the linker during the creation of modules." + } + ], + "type" : "STRING", + "value" : "" + }, + { + "name" : "CMAKE_MODULE_LINKER_FLAGS_DEBUG", + "properties" : + [ + { + "name" : "ADVANCED", + "value" : "1" + }, + { + "name" : "HELPSTRING", + "value" : "Flags used by the linker during the creation of modules during DEBUG builds." + } + ], + "type" : "STRING", + "value" : "" + }, + { + "name" : "CMAKE_MODULE_LINKER_FLAGS_MINSIZEREL", + "properties" : + [ + { + "name" : "ADVANCED", + "value" : "1" + }, + { + "name" : "HELPSTRING", + "value" : "Flags used by the linker during the creation of modules during MINSIZEREL builds." + } + ], + "type" : "STRING", + "value" : "" + }, + { + "name" : "CMAKE_MODULE_LINKER_FLAGS_RELEASE", + "properties" : + [ + { + "name" : "ADVANCED", + "value" : "1" + }, + { + "name" : "HELPSTRING", + "value" : "Flags used by the linker during the creation of modules during RELEASE builds." + } + ], + "type" : "STRING", + "value" : "" + }, + { + "name" : "CMAKE_MODULE_LINKER_FLAGS_RELWITHDEBINFO", + "properties" : + [ + { + "name" : "ADVANCED", + "value" : "1" + }, + { + "name" : "HELPSTRING", + "value" : "Flags used by the linker during the creation of modules during RELWITHDEBINFO builds." + } + ], + "type" : "STRING", + "value" : "" + }, + { + "name" : "CMAKE_NM", + "properties" : + [ + { + "name" : "ADVANCED", + "value" : "1" + }, + { + "name" : "HELPSTRING", + "value" : "Path to a program." + } + ], + "type" : "FILEPATH", + "value" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/bin/llvm-nm" + }, + { + "name" : "CMAKE_NUMBER_OF_MAKEFILES", + "properties" : + [ + { + "name" : "HELPSTRING", + "value" : "number of local generators" + } + ], + "type" : "INTERNAL", + "value" : "1" + }, + { + "name" : "CMAKE_OBJCOPY", + "properties" : + [ + { + "name" : "ADVANCED", + "value" : "1" + }, + { + "name" : "HELPSTRING", + "value" : "Path to a program." + } + ], + "type" : "FILEPATH", + "value" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/bin/llvm-objcopy" + }, + { + "name" : "CMAKE_OBJDUMP", + "properties" : + [ + { + "name" : "ADVANCED", + "value" : "1" + }, + { + "name" : "HELPSTRING", + "value" : "Path to a program." + } + ], + "type" : "FILEPATH", + "value" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/bin/llvm-objdump" + }, + { + "name" : "CMAKE_PLATFORM_INFO_INITIALIZED", + "properties" : + [ + { + "name" : "HELPSTRING", + "value" : "Platform information initialized" + } + ], + "type" : "INTERNAL", + "value" : "1" + }, + { + "name" : "CMAKE_PROJECT_DESCRIPTION", + "properties" : + [ + { + "name" : "HELPSTRING", + "value" : "Value Computed by CMake" + } + ], + "type" : "STATIC", + "value" : "" + }, + { + "name" : "CMAKE_PROJECT_HOMEPAGE_URL", + "properties" : + [ + { + "name" : "HELPSTRING", + "value" : "Value Computed by CMake" + } + ], + "type" : "STATIC", + "value" : "" + }, + { + "name" : "CMAKE_PROJECT_NAME", + "properties" : + [ + { + "name" : "HELPSTRING", + "value" : "Value Computed by CMake" + } + ], + "type" : "STATIC", + "value" : "intaleq" + }, + { + "name" : "CMAKE_RANLIB", + "properties" : + [ + { + "name" : "ADVANCED", + "value" : "1" + }, + { + "name" : "HELPSTRING", + "value" : "Ranlib" + } + ], + "type" : "FILEPATH", + "value" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/bin/llvm-ranlib" + }, + { + "name" : "CMAKE_READELF", + "properties" : + [ + { + "name" : "ADVANCED", + "value" : "1" + }, + { + "name" : "HELPSTRING", + "value" : "Path to a program." + } + ], + "type" : "FILEPATH", + "value" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/bin/llvm-readelf" + }, + { + "name" : "CMAKE_ROOT", + "properties" : + [ + { + "name" : "HELPSTRING", + "value" : "Path to CMake installation." + } + ], + "type" : "INTERNAL", + "value" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31" + }, + { + "name" : "CMAKE_RUNTIME_OUTPUT_DIRECTORY", + "properties" : + [ + { + "name" : "HELPSTRING", + "value" : "No help, variable specified on the command line." + } + ], + "type" : "UNINITIALIZED", + "value" : "/Users/hamzaaleghwairyeen/development/App/Intaleq/build/app/intermediates/cxx/RelWithDebInfo/6t1m4b5v/obj/x86" + }, + { + "name" : "CMAKE_SHARED_LINKER_FLAGS", + "properties" : + [ + { + "name" : "ADVANCED", + "value" : "1" + }, + { + "name" : "HELPSTRING", + "value" : "Flags used by the linker during the creation of dll's." + } + ], + "type" : "STRING", + "value" : "" + }, + { + "name" : "CMAKE_SHARED_LINKER_FLAGS_DEBUG", + "properties" : + [ + { + "name" : "ADVANCED", + "value" : "1" + }, + { + "name" : "HELPSTRING", + "value" : "Flags used by the linker during the creation of shared libraries during DEBUG builds." + } + ], + "type" : "STRING", + "value" : "" + }, + { + "name" : "CMAKE_SHARED_LINKER_FLAGS_MINSIZEREL", + "properties" : + [ + { + "name" : "ADVANCED", + "value" : "1" + }, + { + "name" : "HELPSTRING", + "value" : "Flags used by the linker during the creation of shared libraries during MINSIZEREL builds." + } + ], + "type" : "STRING", + "value" : "" + }, + { + "name" : "CMAKE_SHARED_LINKER_FLAGS_RELEASE", + "properties" : + [ + { + "name" : "ADVANCED", + "value" : "1" + }, + { + "name" : "HELPSTRING", + "value" : "Flags used by the linker during the creation of shared libraries during RELEASE builds." + } + ], + "type" : "STRING", + "value" : "" + }, + { + "name" : "CMAKE_SHARED_LINKER_FLAGS_RELWITHDEBINFO", + "properties" : + [ + { + "name" : "ADVANCED", + "value" : "1" + }, + { + "name" : "HELPSTRING", + "value" : "Flags used by the linker during the creation of shared libraries during RELWITHDEBINFO builds." + } + ], + "type" : "STRING", + "value" : "" + }, + { + "name" : "CMAKE_SKIP_INSTALL_RPATH", + "properties" : + [ + { + "name" : "ADVANCED", + "value" : "1" + }, + { + "name" : "HELPSTRING", + "value" : "If set, runtime paths are not added when installing shared libraries, but are added when building." + } + ], + "type" : "BOOL", + "value" : "NO" + }, + { + "name" : "CMAKE_SKIP_RPATH", + "properties" : + [ + { + "name" : "ADVANCED", + "value" : "1" + }, + { + "name" : "HELPSTRING", + "value" : "If set, runtime paths are not added when using shared libraries." + } + ], + "type" : "BOOL", + "value" : "NO" + }, + { + "name" : "CMAKE_STATIC_LINKER_FLAGS", + "properties" : + [ + { + "name" : "ADVANCED", + "value" : "1" + }, + { + "name" : "HELPSTRING", + "value" : "Flags used by the linker during the creation of static libraries during all build types." + } + ], + "type" : "STRING", + "value" : "" + }, + { + "name" : "CMAKE_STATIC_LINKER_FLAGS_DEBUG", + "properties" : + [ + { + "name" : "ADVANCED", + "value" : "1" + }, + { + "name" : "HELPSTRING", + "value" : "Flags used by the linker during the creation of static libraries during DEBUG builds." + } + ], + "type" : "STRING", + "value" : "" + }, + { + "name" : "CMAKE_STATIC_LINKER_FLAGS_MINSIZEREL", + "properties" : + [ + { + "name" : "ADVANCED", + "value" : "1" + }, + { + "name" : "HELPSTRING", + "value" : "Flags used by the linker during the creation of static libraries during MINSIZEREL builds." + } + ], + "type" : "STRING", + "value" : "" + }, + { + "name" : "CMAKE_STATIC_LINKER_FLAGS_RELEASE", + "properties" : + [ + { + "name" : "ADVANCED", + "value" : "1" + }, + { + "name" : "HELPSTRING", + "value" : "Flags used by the linker during the creation of static libraries during RELEASE builds." + } + ], + "type" : "STRING", + "value" : "" + }, + { + "name" : "CMAKE_STATIC_LINKER_FLAGS_RELWITHDEBINFO", + "properties" : + [ + { + "name" : "ADVANCED", + "value" : "1" + }, + { + "name" : "HELPSTRING", + "value" : "Flags used by the linker during the creation of static libraries during RELWITHDEBINFO builds." + } + ], + "type" : "STRING", + "value" : "" + }, + { + "name" : "CMAKE_STRIP", + "properties" : + [ + { + "name" : "ADVANCED", + "value" : "1" + }, + { + "name" : "HELPSTRING", + "value" : "Strip" + } + ], + "type" : "FILEPATH", + "value" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/bin/llvm-strip" + }, + { + "name" : "CMAKE_SYSTEM_NAME", + "properties" : + [ + { + "name" : "HELPSTRING", + "value" : "No help, variable specified on the command line." + } + ], + "type" : "UNINITIALIZED", + "value" : "Android" + }, + { + "name" : "CMAKE_SYSTEM_VERSION", + "properties" : + [ + { + "name" : "HELPSTRING", + "value" : "No help, variable specified on the command line." + } + ], + "type" : "UNINITIALIZED", + "value" : "23" + }, + { + "name" : "CMAKE_TAPI", + "properties" : + [ + { + "name" : "ADVANCED", + "value" : "1" + }, + { + "name" : "HELPSTRING", + "value" : "Path to a program." + } + ], + "type" : "FILEPATH", + "value" : "CMAKE_TAPI-NOTFOUND" + }, + { + "name" : "CMAKE_TOOLCHAIN_FILE", + "properties" : + [ + { + "name" : "HELPSTRING", + "value" : "The CMake toolchain file" + } + ], + "type" : "FILEPATH", + "value" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/build/cmake/android.toolchain.cmake" + }, + { + "name" : "CMAKE_UNAME", + "properties" : + [ + { + "name" : "HELPSTRING", + "value" : "uname command" + } + ], + "type" : "INTERNAL", + "value" : "/usr/bin/uname" + }, + { + "name" : "CMAKE_VERBOSE_MAKEFILE", + "properties" : + [ + { + "name" : "ADVANCED", + "value" : "1" + }, + { + "name" : "HELPSTRING", + "value" : "If this value is on, makefiles will be generated without the .SILENT directive, and all commands will be echoed to the console during the make. This is useful for debugging only. With Visual Studio IDE projects all commands are done without /nologo." + } + ], + "type" : "BOOL", + "value" : "FALSE" + }, + { + "name" : "_CMAKE_CXX_LINKER_PUSHPOP_STATE_SUPPORTED", + "properties" : + [ + { + "name" : "HELPSTRING", + "value" : "linker supports push/pop state" + } + ], + "type" : "INTERNAL", + "value" : "TRUE" + }, + { + "name" : "_CMAKE_C_LINKER_PUSHPOP_STATE_SUPPORTED", + "properties" : + [ + { + "name" : "HELPSTRING", + "value" : "linker supports push/pop state" + } + ], + "type" : "INTERNAL", + "value" : "TRUE" + }, + { + "name" : "_CMAKE_LINKER_PUSHPOP_STATE_SUPPORTED", + "properties" : + [ + { + "name" : "HELPSTRING", + "value" : "linker supports push/pop state" + } + ], + "type" : "INTERNAL", + "value" : "TRUE" + }, + { + "name" : "intaleq_BINARY_DIR", + "properties" : + [ + { + "name" : "HELPSTRING", + "value" : "Value Computed by CMake" + } + ], + "type" : "STATIC", + "value" : "/Users/hamzaaleghwairyeen/development/App/Intaleq/android/app/.cxx/RelWithDebInfo/6t1m4b5v/x86" + }, + { + "name" : "intaleq_IS_TOP_LEVEL", + "properties" : + [ + { + "name" : "HELPSTRING", + "value" : "Value Computed by CMake" + } + ], + "type" : "STATIC", + "value" : "ON" + }, + { + "name" : "intaleq_SOURCE_DIR", + "properties" : + [ + { + "name" : "HELPSTRING", + "value" : "Value Computed by CMake" + } + ], + "type" : "STATIC", + "value" : "/Users/hamzaaleghwairyeen/development/App/Intaleq/android/app/src/main/cpp" + }, + { + "name" : "log-lib", + "properties" : + [ + { + "name" : "HELPSTRING", + "value" : "Path to a library." + } + ], + "type" : "FILEPATH", + "value" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/lib/i686-linux-android/23/liblog.so" + }, + { + "name" : "native-lib_LIB_DEPENDS", + "properties" : + [ + { + "name" : "HELPSTRING", + "value" : "Dependencies for the target" + } + ], + "type" : "STATIC", + "value" : "general;/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/lib/i686-linux-android/23/liblog.so;" + } + ], + "kind" : "cache", + "version" : + { + "major" : 2, + "minor" : 0 + } +} diff --git a/siro_rider/android/app/.cxx/RelWithDebInfo/6t1m4b5v/x86/.cmake/api/v1/reply/cmakeFiles-v1-21d49c7f3fdae7d7b78c.json b/siro_rider/android/app/.cxx/RelWithDebInfo/6t1m4b5v/x86/.cmake/api/v1/reply/cmakeFiles-v1-21d49c7f3fdae7d7b78c.json new file mode 100644 index 0000000..d96895e --- /dev/null +++ b/siro_rider/android/app/.cxx/RelWithDebInfo/6t1m4b5v/x86/.cmake/api/v1/reply/cmakeFiles-v1-21d49c7f3fdae7d7b78c.json @@ -0,0 +1,968 @@ +{ + "inputs" : + [ + { + "path" : "CMakeLists.txt" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeDetermineSystem.cmake" + }, + { + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/build/cmake/android.toolchain.cmake" + }, + { + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/build/cmake/android-legacy.toolchain.cmake" + }, + { + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/build/cmake/abis.cmake" + }, + { + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/build/cmake/platforms.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Platform/Android-Determine.cmake" + }, + { + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/build/cmake/hooks/pre/Android-Determine.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeSystem.cmake.in" + }, + { + "isGenerated" : true, + "path" : "/Users/hamzaaleghwairyeen/development/App/Intaleq/android/app/.cxx/RelWithDebInfo/6t1m4b5v/x86/CMakeFiles/3.31.5-g6cf5163/CMakeSystem.cmake" + }, + { + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/build/cmake/android.toolchain.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeSystemSpecificInitialize.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Platform/Android-Initialize.cmake" + }, + { + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/build/cmake/hooks/pre/Android-Initialize.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Platform/Linux-Initialize.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeDetermineCCompiler.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeDetermineCompiler.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Platform/Android-Determine-C.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Platform/Android/Determine-Compiler.cmake" + }, + { + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/build/cmake/hooks/pre/Determine-Compiler.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeDetermineCompilerId.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeCompilerIdDetection.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/ADSP-DetermineCompiler.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/ARMCC-DetermineCompiler.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/ARMClang-DetermineCompiler.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/AppleClang-DetermineCompiler.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/Clang-DetermineCompilerInternal.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/Borland-DetermineCompiler.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/Bruce-C-DetermineCompiler.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/Clang-DetermineCompiler.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/Clang-DetermineCompilerInternal.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/Compaq-C-DetermineCompiler.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/Cray-DetermineCompiler.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/CrayClang-DetermineCompiler.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/Embarcadero-DetermineCompiler.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/Fujitsu-DetermineCompiler.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/FujitsuClang-DetermineCompiler.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/GHS-DetermineCompiler.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/GNU-C-DetermineCompiler.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/HP-C-DetermineCompiler.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/IAR-DetermineCompiler.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/IBMClang-C-DetermineCompiler.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/Intel-DetermineCompiler.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/IntelLLVM-DetermineCompiler.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/LCC-C-DetermineCompiler.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/MSVC-DetermineCompiler.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/NVHPC-DetermineCompiler.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/NVIDIA-DetermineCompiler.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/OpenWatcom-DetermineCompiler.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/OrangeC-DetermineCompiler.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/PGI-DetermineCompiler.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/PathScale-DetermineCompiler.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/SCO-DetermineCompiler.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/SDCC-C-DetermineCompiler.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/SunPro-C-DetermineCompiler.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/TI-DetermineCompiler.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/TIClang-DetermineCompiler.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/Tasking-DetermineCompiler.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/TinyCC-C-DetermineCompiler.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/VisualAge-C-DetermineCompiler.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/IBMCPP-C-DetermineVersionInternal.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/Watcom-DetermineCompiler.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/XL-C-DetermineCompiler.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/IBMCPP-C-DetermineVersionInternal.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/XLClang-C-DetermineCompiler.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/zOS-C-DetermineCompiler.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/IBMCPP-C-DetermineVersionInternal.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeFindBinUtils.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/Clang-FindBinUtils.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeCCompiler.cmake.in" + }, + { + "isGenerated" : true, + "path" : "/Users/hamzaaleghwairyeen/development/App/Intaleq/android/app/.cxx/RelWithDebInfo/6t1m4b5v/x86/CMakeFiles/3.31.5-g6cf5163/CMakeCCompiler.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeDetermineCXXCompiler.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeDetermineCompiler.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Platform/Android-Determine-CXX.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Platform/Android/Determine-Compiler.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeDetermineCompilerId.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeCompilerIdDetection.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/ADSP-DetermineCompiler.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/ARMCC-DetermineCompiler.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/ARMClang-DetermineCompiler.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/AppleClang-DetermineCompiler.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/Clang-DetermineCompilerInternal.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/Borland-DetermineCompiler.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/Clang-DetermineCompiler.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/Clang-DetermineCompilerInternal.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/Compaq-CXX-DetermineCompiler.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/Cray-DetermineCompiler.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/CrayClang-DetermineCompiler.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/Embarcadero-DetermineCompiler.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/Fujitsu-DetermineCompiler.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/FujitsuClang-DetermineCompiler.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/GHS-DetermineCompiler.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/GNU-CXX-DetermineCompiler.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/HP-CXX-DetermineCompiler.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/IAR-DetermineCompiler.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/IBMClang-CXX-DetermineCompiler.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/Intel-DetermineCompiler.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/IntelLLVM-DetermineCompiler.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/LCC-CXX-DetermineCompiler.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/MSVC-DetermineCompiler.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/NVHPC-DetermineCompiler.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/NVIDIA-DetermineCompiler.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/OpenWatcom-DetermineCompiler.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/OrangeC-DetermineCompiler.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/PGI-DetermineCompiler.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/PathScale-DetermineCompiler.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/SCO-DetermineCompiler.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/SunPro-CXX-DetermineCompiler.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/TI-DetermineCompiler.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/TIClang-DetermineCompiler.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/Tasking-DetermineCompiler.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/VisualAge-CXX-DetermineCompiler.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/IBMCPP-CXX-DetermineVersionInternal.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/Watcom-DetermineCompiler.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/XL-CXX-DetermineCompiler.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/IBMCPP-CXX-DetermineVersionInternal.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/XLClang-CXX-DetermineCompiler.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/zOS-CXX-DetermineCompiler.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/IBMCPP-CXX-DetermineVersionInternal.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeFindBinUtils.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/Clang-FindBinUtils.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeCXXCompiler.cmake.in" + }, + { + "isGenerated" : true, + "path" : "/Users/hamzaaleghwairyeen/development/App/Intaleq/android/app/.cxx/RelWithDebInfo/6t1m4b5v/x86/CMakeFiles/3.31.5-g6cf5163/CMakeCXXCompiler.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeSystemSpecificInformation.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeGenericSystem.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeInitializeConfigs.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Platform/Android.cmake" + }, + { + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/build/cmake/hooks/pre/Android.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Platform/Linux.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Platform/UnixPaths.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeCInformation.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeLanguageInformation.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/Clang-C.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/Clang.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/CMakeCommonCompilerMacros.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/GNU.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/CMakeCommonCompilerMacros.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Platform/Android-Clang-C.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Platform/Android-Clang.cmake" + }, + { + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/build/cmake/hooks/pre/Android-Clang.cmake" + }, + { + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/build/cmake/flags.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeCommonLanguageInclude.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeTestCCompiler.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeTestCompilerCommon.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeDetermineCompilerABI.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Internal/CMakeDetermineLinkerId.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeParseImplicitIncludeInfo.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeParseImplicitLinkInfo.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeParseLibraryArchitecture.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeTestCompilerCommon.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeCCompilerABI.c" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeDetermineCompilerSupport.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Internal/FeatureTesting.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeCCompiler.cmake.in" + }, + { + "isGenerated" : true, + "path" : "/Users/hamzaaleghwairyeen/development/App/Intaleq/android/app/.cxx/RelWithDebInfo/6t1m4b5v/x86/CMakeFiles/3.31.5-g6cf5163/CMakeCCompiler.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Internal/CMakeCLinkerInformation.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Internal/CMakeCommonLinkerInformation.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Linker/LLD-C.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Linker/LLD.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Linker/GNU.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Platform/Linker/Android-LLD-C.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Platform/Linker/Linux-LLD-C.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Platform/Linker/Linux-LLD.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Platform/Linker/Linux-GNU.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Platform/Linker/GNU.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeCXXInformation.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeLanguageInformation.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/Clang-CXX.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/Clang.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Platform/Android-Clang-CXX.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Platform/Android-Clang.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeCommonLanguageInclude.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeTestCXXCompiler.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeTestCompilerCommon.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeDetermineCompilerABI.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Internal/CMakeDetermineLinkerId.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeParseImplicitIncludeInfo.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeParseImplicitLinkInfo.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeParseLibraryArchitecture.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeTestCompilerCommon.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeCXXCompilerABI.cpp" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeDetermineCompilerSupport.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Internal/FeatureTesting.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/Clang-CXX-CXXImportStd.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/Clang-CXX-CXXImportStd.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeCXXCompiler.cmake.in" + }, + { + "isGenerated" : true, + "path" : "/Users/hamzaaleghwairyeen/development/App/Intaleq/android/app/.cxx/RelWithDebInfo/6t1m4b5v/x86/CMakeFiles/3.31.5-g6cf5163/CMakeCXXCompiler.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Internal/CMakeCXXLinkerInformation.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Internal/CMakeCommonLinkerInformation.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Linker/LLD-CXX.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Linker/LLD.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Platform/Linker/Android-LLD-CXX.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Platform/Linker/Linux-LLD-CXX.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Platform/Linker/Linux-LLD.cmake" + } + ], + "kind" : "cmakeFiles", + "paths" : + { + "build" : "/Users/hamzaaleghwairyeen/development/App/Intaleq/android/app/.cxx/RelWithDebInfo/6t1m4b5v/x86", + "source" : "/Users/hamzaaleghwairyeen/development/App/Intaleq/android/app/src/main/cpp" + }, + "version" : + { + "major" : 1, + "minor" : 1 + } +} diff --git a/siro_rider/android/app/.cxx/RelWithDebInfo/6t1m4b5v/x86/.cmake/api/v1/reply/codemodel-v2-b3bd8a6f356ff1998ee7.json b/siro_rider/android/app/.cxx/RelWithDebInfo/6t1m4b5v/x86/.cmake/api/v1/reply/codemodel-v2-b3bd8a6f356ff1998ee7.json new file mode 100644 index 0000000..c713ad6 --- /dev/null +++ b/siro_rider/android/app/.cxx/RelWithDebInfo/6t1m4b5v/x86/.cmake/api/v1/reply/codemodel-v2-b3bd8a6f356ff1998ee7.json @@ -0,0 +1,60 @@ +{ + "configurations" : + [ + { + "directories" : + [ + { + "build" : ".", + "jsonFile" : "directory-.-RelWithDebInfo-f5ebdc15457944623624.json", + "minimumCMakeVersion" : + { + "string" : "3.6.0" + }, + "projectIndex" : 0, + "source" : ".", + "targetIndexes" : + [ + 0 + ] + } + ], + "name" : "RelWithDebInfo", + "projects" : + [ + { + "directoryIndexes" : + [ + 0 + ], + "name" : "intaleq", + "targetIndexes" : + [ + 0 + ] + } + ], + "targets" : + [ + { + "directoryIndex" : 0, + "id" : "native-lib::@6890427a1f51a3e7e1df", + "jsonFile" : "target-native-lib-RelWithDebInfo-b7e704f3d8692e1145e6.json", + "name" : "native-lib", + "projectIndex" : 0 + } + ] + } + ], + "kind" : "codemodel", + "paths" : + { + "build" : "/Users/hamzaaleghwairyeen/development/App/Intaleq/android/app/.cxx/RelWithDebInfo/6t1m4b5v/x86", + "source" : "/Users/hamzaaleghwairyeen/development/App/Intaleq/android/app/src/main/cpp" + }, + "version" : + { + "major" : 2, + "minor" : 7 + } +} diff --git a/siro_rider/android/app/.cxx/RelWithDebInfo/6t1m4b5v/x86/.cmake/api/v1/reply/directory-.-RelWithDebInfo-f5ebdc15457944623624.json b/siro_rider/android/app/.cxx/RelWithDebInfo/6t1m4b5v/x86/.cmake/api/v1/reply/directory-.-RelWithDebInfo-f5ebdc15457944623624.json new file mode 100644 index 0000000..3a67af9 --- /dev/null +++ b/siro_rider/android/app/.cxx/RelWithDebInfo/6t1m4b5v/x86/.cmake/api/v1/reply/directory-.-RelWithDebInfo-f5ebdc15457944623624.json @@ -0,0 +1,14 @@ +{ + "backtraceGraph" : + { + "commands" : [], + "files" : [], + "nodes" : [] + }, + "installers" : [], + "paths" : + { + "build" : ".", + "source" : "." + } +} diff --git a/siro_rider/android/app/.cxx/RelWithDebInfo/6t1m4b5v/x86/.cmake/api/v1/reply/index-2025-07-02T20-14-02-0826.json b/siro_rider/android/app/.cxx/RelWithDebInfo/6t1m4b5v/x86/.cmake/api/v1/reply/index-2025-07-02T20-14-02-0826.json new file mode 100644 index 0000000..7e4f9e6 --- /dev/null +++ b/siro_rider/android/app/.cxx/RelWithDebInfo/6t1m4b5v/x86/.cmake/api/v1/reply/index-2025-07-02T20-14-02-0826.json @@ -0,0 +1,92 @@ +{ + "cmake" : + { + "generator" : + { + "multiConfig" : false, + "name" : "Ninja" + }, + "paths" : + { + "cmake" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/bin/cmake", + "cpack" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/bin/cpack", + "ctest" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/bin/ctest", + "root" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31" + }, + "version" : + { + "isDirty" : false, + "major" : 3, + "minor" : 31, + "patch" : 5, + "string" : "3.31.5-g6cf5163", + "suffix" : "g6cf5163" + } + }, + "objects" : + [ + { + "jsonFile" : "codemodel-v2-b3bd8a6f356ff1998ee7.json", + "kind" : "codemodel", + "version" : + { + "major" : 2, + "minor" : 7 + } + }, + { + "jsonFile" : "cache-v2-877b4b6e02b454b55c99.json", + "kind" : "cache", + "version" : + { + "major" : 2, + "minor" : 0 + } + }, + { + "jsonFile" : "cmakeFiles-v1-21d49c7f3fdae7d7b78c.json", + "kind" : "cmakeFiles", + "version" : + { + "major" : 1, + "minor" : 1 + } + } + ], + "reply" : + { + "client-agp" : + { + "cache-v2" : + { + "jsonFile" : "cache-v2-877b4b6e02b454b55c99.json", + "kind" : "cache", + "version" : + { + "major" : 2, + "minor" : 0 + } + }, + "cmakeFiles-v1" : + { + "jsonFile" : "cmakeFiles-v1-21d49c7f3fdae7d7b78c.json", + "kind" : "cmakeFiles", + "version" : + { + "major" : 1, + "minor" : 1 + } + }, + "codemodel-v2" : + { + "jsonFile" : "codemodel-v2-b3bd8a6f356ff1998ee7.json", + "kind" : "codemodel", + "version" : + { + "major" : 2, + "minor" : 7 + } + } + } + } +} diff --git a/siro_rider/android/app/.cxx/RelWithDebInfo/6t1m4b5v/x86/.cmake/api/v1/reply/target-native-lib-RelWithDebInfo-b7e704f3d8692e1145e6.json b/siro_rider/android/app/.cxx/RelWithDebInfo/6t1m4b5v/x86/.cmake/api/v1/reply/target-native-lib-RelWithDebInfo-b7e704f3d8692e1145e6.json new file mode 100644 index 0000000..8782f80 --- /dev/null +++ b/siro_rider/android/app/.cxx/RelWithDebInfo/6t1m4b5v/x86/.cmake/api/v1/reply/target-native-lib-RelWithDebInfo-b7e704f3d8692e1145e6.json @@ -0,0 +1,117 @@ +{ + "artifacts" : + [ + { + "path" : "/Users/hamzaaleghwairyeen/development/App/Intaleq/build/app/intermediates/cxx/RelWithDebInfo/6t1m4b5v/obj/x86/libnative-lib.so" + } + ], + "backtrace" : 1, + "backtraceGraph" : + { + "commands" : + [ + "add_library", + "target_link_libraries" + ], + "files" : + [ + "CMakeLists.txt" + ], + "nodes" : + [ + { + "file" : 0 + }, + { + "command" : 0, + "file" : 0, + "line" : 4, + "parent" : 0 + }, + { + "command" : 1, + "file" : 0, + "line" : 8, + "parent" : 0 + } + ] + }, + "compileGroups" : + [ + { + "compileCommandFragments" : + [ + { + "fragment" : "-g -DANDROID -fdata-sections -ffunction-sections -funwind-tables -fstack-protector-strong -no-canonical-prefixes -mstackrealign -D_FORTIFY_SOURCE=2 -Wformat -Werror=format-security -O2 -g -DNDEBUG -fPIC" + } + ], + "defines" : + [ + { + "define" : "native_lib_EXPORTS" + } + ], + "language" : "CXX", + "sourceIndexes" : + [ + 0 + ], + "sysroot" : + { + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot" + } + } + ], + "id" : "native-lib::@6890427a1f51a3e7e1df", + "link" : + { + "commandFragments" : + [ + { + "fragment" : "-static-libstdc++ -Wl,--build-id=sha1 -Wl,--no-rosegment -Wl,--no-undefined-version -Wl,--fatal-warnings -Wl,--no-undefined -Qunused-arguments -Wl,--gc-sections", + "role" : "flags" + }, + { + "backtrace" : 2, + "fragment" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/lib/i686-linux-android/23/liblog.so", + "role" : "libraries" + }, + { + "fragment" : "-latomic -lm", + "role" : "libraries" + } + ], + "language" : "CXX", + "sysroot" : + { + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot" + } + }, + "name" : "native-lib", + "nameOnDisk" : "libnative-lib.so", + "paths" : + { + "build" : ".", + "source" : "." + }, + "sourceGroups" : + [ + { + "name" : "Source Files", + "sourceIndexes" : + [ + 0 + ] + } + ], + "sources" : + [ + { + "backtrace" : 1, + "compileGroupIndex" : 0, + "path" : "native-lib.cpp", + "sourceGroupIndex" : 0 + } + ], + "type" : "SHARED_LIBRARY" +} diff --git a/siro_rider/android/app/.cxx/RelWithDebInfo/6t1m4b5v/x86/.ninja_deps b/siro_rider/android/app/.cxx/RelWithDebInfo/6t1m4b5v/x86/.ninja_deps new file mode 100644 index 0000000..847b4ea Binary files /dev/null and b/siro_rider/android/app/.cxx/RelWithDebInfo/6t1m4b5v/x86/.ninja_deps differ diff --git a/siro_rider/android/app/.cxx/RelWithDebInfo/6t1m4b5v/x86/.ninja_log b/siro_rider/android/app/.cxx/RelWithDebInfo/6t1m4b5v/x86/.ninja_log new file mode 100644 index 0000000..ae63d86 --- /dev/null +++ b/siro_rider/android/app/.cxx/RelWithDebInfo/6t1m4b5v/x86/.ninja_log @@ -0,0 +1,5 @@ +# ninja log v5 +0 348 1751487243210396355 CMakeFiles/native-lib.dir/native-lib.cpp.o 768890d5492edf1d +350 389 1751487243251442791 /Users/hamzaaleghwairyeen/development/App/Intaleq/build/app/intermediates/cxx/RelWithDebInfo/6t1m4b5v/obj/x86/libnative-lib.so 55026af72a2831c1 +26 200 1751488088487592020 /Users/hamzaaleghwairyeen/development/App/Intaleq/build/app/intermediates/cxx/RelWithDebInfo/6t1m4b5v/obj/x86/libnative-lib.so 55026af72a2831c1 +17 100 1753054205559080295 /Users/hamzaaleghwairyeen/development/App/Intaleq/build/app/intermediates/cxx/RelWithDebInfo/6t1m4b5v/obj/x86/libnative-lib.so 55026af72a2831c1 diff --git a/siro_rider/android/app/.cxx/RelWithDebInfo/6t1m4b5v/x86/CMakeCache.txt b/siro_rider/android/app/.cxx/RelWithDebInfo/6t1m4b5v/x86/CMakeCache.txt new file mode 100644 index 0000000..e7218c5 --- /dev/null +++ b/siro_rider/android/app/.cxx/RelWithDebInfo/6t1m4b5v/x86/CMakeCache.txt @@ -0,0 +1,430 @@ +# This is the CMakeCache file. +# For build in directory: /Users/hamzaaleghwairyeen/development/App/Intaleq/android/app/.cxx/RelWithDebInfo/6t1m4b5v/x86 +# It was generated by CMake: /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/bin/cmake +# You can edit this file to change values found and used by cmake. +# If you do not want to change any of the values, simply exit the editor. +# If you do want to change a value, simply edit, save, and exit the editor. +# The syntax for the file is as follows: +# KEY:TYPE=VALUE +# KEY is the name of a variable in the cache. +# TYPE is a hint to GUIs for the type of VALUE, DO NOT EDIT TYPE!. +# VALUE is the current value for the KEY. + +######################## +# EXTERNAL cache entries +######################## + +//No help, variable specified on the command line. +ANDROID_ABI:UNINITIALIZED=x86 + +//No help, variable specified on the command line. +ANDROID_NDK:UNINITIALIZED=/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973 + +//No help, variable specified on the command line. +ANDROID_PLATFORM:UNINITIALIZED=android-23 + +//Path to a program. +CMAKE_ADDR2LINE:FILEPATH=/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/bin/llvm-addr2line + +//No help, variable specified on the command line. +CMAKE_ANDROID_ARCH_ABI:UNINITIALIZED=x86 + +//No help, variable specified on the command line. +CMAKE_ANDROID_NDK:UNINITIALIZED=/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973 + +//Archiver +CMAKE_AR:FILEPATH=/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/bin/llvm-ar + +//Flags used by the compiler during all build types. +CMAKE_ASM_FLAGS:STRING= + +//Flags used by the compiler during debug builds. +CMAKE_ASM_FLAGS_DEBUG:STRING= + +//Flags used by the compiler during release builds. +CMAKE_ASM_FLAGS_RELEASE:STRING= + +//Choose the type of build, options are: None Debug Release RelWithDebInfo +// MinSizeRel ... +CMAKE_BUILD_TYPE:STRING=RelWithDebInfo + +//LLVM archiver +CMAKE_CXX_COMPILER_AR:FILEPATH=/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/bin/llvm-ar + +//`clang-scan-deps` dependency scanner +CMAKE_CXX_COMPILER_CLANG_SCAN_DEPS:FILEPATH=/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/bin/clang-scan-deps + +//Generate index for LLVM archive +CMAKE_CXX_COMPILER_RANLIB:FILEPATH=/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/bin/llvm-ranlib + +//Flags used by the compiler during all build types. +CMAKE_CXX_FLAGS:STRING= + +//Flags used by the compiler during debug builds. +CMAKE_CXX_FLAGS_DEBUG:STRING= + +//Flags used by the CXX compiler during MINSIZEREL builds. +CMAKE_CXX_FLAGS_MINSIZEREL:STRING=-Os -DNDEBUG + +//Flags used by the compiler during release builds. +CMAKE_CXX_FLAGS_RELEASE:STRING= + +//Flags used by the CXX compiler during RELWITHDEBINFO builds. +CMAKE_CXX_FLAGS_RELWITHDEBINFO:STRING=-O2 -g -DNDEBUG + +//Libraries linked by default with all C++ applications. +CMAKE_CXX_STANDARD_LIBRARIES:STRING=-latomic -lm + +//LLVM archiver +CMAKE_C_COMPILER_AR:FILEPATH=/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/bin/llvm-ar + +//`clang-scan-deps` dependency scanner +CMAKE_C_COMPILER_CLANG_SCAN_DEPS:FILEPATH=/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/bin/clang-scan-deps + +//Generate index for LLVM archive +CMAKE_C_COMPILER_RANLIB:FILEPATH=/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/bin/llvm-ranlib + +//Flags used by the compiler during all build types. +CMAKE_C_FLAGS:STRING= + +//Flags used by the compiler during debug builds. +CMAKE_C_FLAGS_DEBUG:STRING= + +//Flags used by the C compiler during MINSIZEREL builds. +CMAKE_C_FLAGS_MINSIZEREL:STRING=-Os -DNDEBUG + +//Flags used by the compiler during release builds. +CMAKE_C_FLAGS_RELEASE:STRING= + +//Flags used by the C compiler during RELWITHDEBINFO builds. +CMAKE_C_FLAGS_RELWITHDEBINFO:STRING=-O2 -g -DNDEBUG + +//Libraries linked by default with all C applications. +CMAKE_C_STANDARD_LIBRARIES:STRING=-latomic -lm + +//Path to a program. +CMAKE_DLLTOOL:FILEPATH=/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/bin/llvm-dlltool + +//Flags used by the linker. +CMAKE_EXE_LINKER_FLAGS:STRING= + +//Flags used by the linker during DEBUG builds. +CMAKE_EXE_LINKER_FLAGS_DEBUG:STRING= + +//Flags used by the linker during MINSIZEREL builds. +CMAKE_EXE_LINKER_FLAGS_MINSIZEREL:STRING= + +//Flags used by the linker during RELEASE builds. +CMAKE_EXE_LINKER_FLAGS_RELEASE:STRING= + +//Flags used by the linker during RELWITHDEBINFO builds. +CMAKE_EXE_LINKER_FLAGS_RELWITHDEBINFO:STRING= + +//Enable/Disable output of build database during the build. +CMAKE_EXPORT_BUILD_DATABASE:BOOL= + +//No help, variable specified on the command line. +CMAKE_EXPORT_COMPILE_COMMANDS:UNINITIALIZED=ON + +//Value Computed by CMake. +CMAKE_FIND_PACKAGE_REDIRECTS_DIR:STATIC=/Users/hamzaaleghwairyeen/development/App/Intaleq/android/app/.cxx/RelWithDebInfo/6t1m4b5v/x86/CMakeFiles/pkgRedirects + +//Install path prefix, prepended onto install directories. +CMAKE_INSTALL_PREFIX:PATH=/usr/local + +//No help, variable specified on the command line. +CMAKE_LIBRARY_OUTPUT_DIRECTORY:UNINITIALIZED=/Users/hamzaaleghwairyeen/development/App/Intaleq/build/app/intermediates/cxx/RelWithDebInfo/6t1m4b5v/obj/x86 + +//Path to a program. +CMAKE_LINKER:FILEPATH=/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/bin/ld.lld + +//No help, variable specified on the command line. +CMAKE_MAKE_PROGRAM:UNINITIALIZED=/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/bin/ninja + +//Flags used by the linker during the creation of modules. +CMAKE_MODULE_LINKER_FLAGS:STRING= + +//Flags used by the linker during the creation of modules during +// DEBUG builds. +CMAKE_MODULE_LINKER_FLAGS_DEBUG:STRING= + +//Flags used by the linker during the creation of modules during +// MINSIZEREL builds. +CMAKE_MODULE_LINKER_FLAGS_MINSIZEREL:STRING= + +//Flags used by the linker during the creation of modules during +// RELEASE builds. +CMAKE_MODULE_LINKER_FLAGS_RELEASE:STRING= + +//Flags used by the linker during the creation of modules during +// RELWITHDEBINFO builds. +CMAKE_MODULE_LINKER_FLAGS_RELWITHDEBINFO:STRING= + +//Path to a program. +CMAKE_NM:FILEPATH=/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/bin/llvm-nm + +//Path to a program. +CMAKE_OBJCOPY:FILEPATH=/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/bin/llvm-objcopy + +//Path to a program. +CMAKE_OBJDUMP:FILEPATH=/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/bin/llvm-objdump + +//Value Computed by CMake +CMAKE_PROJECT_DESCRIPTION:STATIC= + +//Value Computed by CMake +CMAKE_PROJECT_HOMEPAGE_URL:STATIC= + +//Value Computed by CMake +CMAKE_PROJECT_NAME:STATIC=intaleq + +//Ranlib +CMAKE_RANLIB:FILEPATH=/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/bin/llvm-ranlib + +//Path to a program. +CMAKE_READELF:FILEPATH=/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/bin/llvm-readelf + +//No help, variable specified on the command line. +CMAKE_RUNTIME_OUTPUT_DIRECTORY:UNINITIALIZED=/Users/hamzaaleghwairyeen/development/App/Intaleq/build/app/intermediates/cxx/RelWithDebInfo/6t1m4b5v/obj/x86 + +//Flags used by the linker during the creation of dll's. +CMAKE_SHARED_LINKER_FLAGS:STRING= + +//Flags used by the linker during the creation of shared libraries +// during DEBUG builds. +CMAKE_SHARED_LINKER_FLAGS_DEBUG:STRING= + +//Flags used by the linker during the creation of shared libraries +// during MINSIZEREL builds. +CMAKE_SHARED_LINKER_FLAGS_MINSIZEREL:STRING= + +//Flags used by the linker during the creation of shared libraries +// during RELEASE builds. +CMAKE_SHARED_LINKER_FLAGS_RELEASE:STRING= + +//Flags used by the linker during the creation of shared libraries +// during RELWITHDEBINFO builds. +CMAKE_SHARED_LINKER_FLAGS_RELWITHDEBINFO:STRING= + +//If set, runtime paths are not added when installing shared libraries, +// but are added when building. +CMAKE_SKIP_INSTALL_RPATH:BOOL=NO + +//If set, runtime paths are not added when using shared libraries. +CMAKE_SKIP_RPATH:BOOL=NO + +//Flags used by the linker during the creation of static libraries +// during all build types. +CMAKE_STATIC_LINKER_FLAGS:STRING= + +//Flags used by the linker during the creation of static libraries +// during DEBUG builds. +CMAKE_STATIC_LINKER_FLAGS_DEBUG:STRING= + +//Flags used by the linker during the creation of static libraries +// during MINSIZEREL builds. +CMAKE_STATIC_LINKER_FLAGS_MINSIZEREL:STRING= + +//Flags used by the linker during the creation of static libraries +// during RELEASE builds. +CMAKE_STATIC_LINKER_FLAGS_RELEASE:STRING= + +//Flags used by the linker during the creation of static libraries +// during RELWITHDEBINFO builds. +CMAKE_STATIC_LINKER_FLAGS_RELWITHDEBINFO:STRING= + +//Strip +CMAKE_STRIP:FILEPATH=/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/bin/llvm-strip + +//No help, variable specified on the command line. +CMAKE_SYSTEM_NAME:UNINITIALIZED=Android + +//No help, variable specified on the command line. +CMAKE_SYSTEM_VERSION:UNINITIALIZED=23 + +//Path to a program. +CMAKE_TAPI:FILEPATH=CMAKE_TAPI-NOTFOUND + +//The CMake toolchain file +CMAKE_TOOLCHAIN_FILE:FILEPATH=/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/build/cmake/android.toolchain.cmake + +//If this value is on, makefiles will be generated without the +// .SILENT directive, and all commands will be echoed to the console +// during the make. This is useful for debugging only. With Visual +// Studio IDE projects all commands are done without /nologo. +CMAKE_VERBOSE_MAKEFILE:BOOL=FALSE + +//Value Computed by CMake +intaleq_BINARY_DIR:STATIC=/Users/hamzaaleghwairyeen/development/App/Intaleq/android/app/.cxx/RelWithDebInfo/6t1m4b5v/x86 + +//Value Computed by CMake +intaleq_IS_TOP_LEVEL:STATIC=ON + +//Value Computed by CMake +intaleq_SOURCE_DIR:STATIC=/Users/hamzaaleghwairyeen/development/App/Intaleq/android/app/src/main/cpp + +//Path to a library. +log-lib:FILEPATH=/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/lib/i686-linux-android/23/liblog.so + +//Dependencies for the target +native-lib_LIB_DEPENDS:STATIC=general;/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/lib/i686-linux-android/23/liblog.so; + + +######################## +# INTERNAL cache entries +######################## + +//ADVANCED property for variable: CMAKE_ADDR2LINE +CMAKE_ADDR2LINE-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_AR +CMAKE_AR-ADVANCED:INTERNAL=1 +//This is the directory where this CMakeCache.txt was created +CMAKE_CACHEFILE_DIR:INTERNAL=/Users/hamzaaleghwairyeen/development/App/Intaleq/android/app/.cxx/RelWithDebInfo/6t1m4b5v/x86 +//Major version of cmake used to create the current loaded cache +CMAKE_CACHE_MAJOR_VERSION:INTERNAL=3 +//Minor version of cmake used to create the current loaded cache +CMAKE_CACHE_MINOR_VERSION:INTERNAL=31 +//Patch version of cmake used to create the current loaded cache +CMAKE_CACHE_PATCH_VERSION:INTERNAL=5 +//Path to CMake executable. +CMAKE_COMMAND:INTERNAL=/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/bin/cmake +//Path to cpack program executable. +CMAKE_CPACK_COMMAND:INTERNAL=/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/bin/cpack +//Path to ctest program executable. +CMAKE_CTEST_COMMAND:INTERNAL=/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/bin/ctest +//ADVANCED property for variable: CMAKE_CXX_COMPILER_AR +CMAKE_CXX_COMPILER_AR-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_CXX_COMPILER_CLANG_SCAN_DEPS +CMAKE_CXX_COMPILER_CLANG_SCAN_DEPS-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_CXX_COMPILER_RANLIB +CMAKE_CXX_COMPILER_RANLIB-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_CXX_FLAGS +CMAKE_CXX_FLAGS-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_CXX_FLAGS_DEBUG +CMAKE_CXX_FLAGS_DEBUG-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_CXX_FLAGS_MINSIZEREL +CMAKE_CXX_FLAGS_MINSIZEREL-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_CXX_FLAGS_RELEASE +CMAKE_CXX_FLAGS_RELEASE-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_CXX_FLAGS_RELWITHDEBINFO +CMAKE_CXX_FLAGS_RELWITHDEBINFO-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_CXX_STANDARD_LIBRARIES +CMAKE_CXX_STANDARD_LIBRARIES-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_C_COMPILER_AR +CMAKE_C_COMPILER_AR-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_C_COMPILER_CLANG_SCAN_DEPS +CMAKE_C_COMPILER_CLANG_SCAN_DEPS-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_C_COMPILER_RANLIB +CMAKE_C_COMPILER_RANLIB-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_C_FLAGS +CMAKE_C_FLAGS-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_C_FLAGS_DEBUG +CMAKE_C_FLAGS_DEBUG-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_C_FLAGS_MINSIZEREL +CMAKE_C_FLAGS_MINSIZEREL-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_C_FLAGS_RELEASE +CMAKE_C_FLAGS_RELEASE-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_C_FLAGS_RELWITHDEBINFO +CMAKE_C_FLAGS_RELWITHDEBINFO-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_C_STANDARD_LIBRARIES +CMAKE_C_STANDARD_LIBRARIES-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_DLLTOOL +CMAKE_DLLTOOL-ADVANCED:INTERNAL=1 +//Path to cache edit program executable. +CMAKE_EDIT_COMMAND:INTERNAL=/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/bin/ccmake +//Executable file format +CMAKE_EXECUTABLE_FORMAT:INTERNAL=ELF +//ADVANCED property for variable: CMAKE_EXE_LINKER_FLAGS +CMAKE_EXE_LINKER_FLAGS-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_EXE_LINKER_FLAGS_DEBUG +CMAKE_EXE_LINKER_FLAGS_DEBUG-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_EXE_LINKER_FLAGS_MINSIZEREL +CMAKE_EXE_LINKER_FLAGS_MINSIZEREL-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_EXE_LINKER_FLAGS_RELEASE +CMAKE_EXE_LINKER_FLAGS_RELEASE-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_EXE_LINKER_FLAGS_RELWITHDEBINFO +CMAKE_EXE_LINKER_FLAGS_RELWITHDEBINFO-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_EXPORT_BUILD_DATABASE +CMAKE_EXPORT_BUILD_DATABASE-ADVANCED:INTERNAL=1 +//Name of external makefile project generator. +CMAKE_EXTRA_GENERATOR:INTERNAL= +//Name of generator. +CMAKE_GENERATOR:INTERNAL=Ninja +//Generator instance identifier. +CMAKE_GENERATOR_INSTANCE:INTERNAL= +//Name of generator platform. +CMAKE_GENERATOR_PLATFORM:INTERNAL= +//Name of generator toolset. +CMAKE_GENERATOR_TOOLSET:INTERNAL= +//Source directory with the top level CMakeLists.txt file for this +// project +CMAKE_HOME_DIRECTORY:INTERNAL=/Users/hamzaaleghwairyeen/development/App/Intaleq/android/app/src/main/cpp +//Install .so files without execute permission. +CMAKE_INSTALL_SO_NO_EXE:INTERNAL=0 +//ADVANCED property for variable: CMAKE_LINKER +CMAKE_LINKER-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_MODULE_LINKER_FLAGS +CMAKE_MODULE_LINKER_FLAGS-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_MODULE_LINKER_FLAGS_DEBUG +CMAKE_MODULE_LINKER_FLAGS_DEBUG-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_MODULE_LINKER_FLAGS_MINSIZEREL +CMAKE_MODULE_LINKER_FLAGS_MINSIZEREL-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_MODULE_LINKER_FLAGS_RELEASE +CMAKE_MODULE_LINKER_FLAGS_RELEASE-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_MODULE_LINKER_FLAGS_RELWITHDEBINFO +CMAKE_MODULE_LINKER_FLAGS_RELWITHDEBINFO-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_NM +CMAKE_NM-ADVANCED:INTERNAL=1 +//number of local generators +CMAKE_NUMBER_OF_MAKEFILES:INTERNAL=1 +//ADVANCED property for variable: CMAKE_OBJCOPY +CMAKE_OBJCOPY-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_OBJDUMP +CMAKE_OBJDUMP-ADVANCED:INTERNAL=1 +//Platform information initialized +CMAKE_PLATFORM_INFO_INITIALIZED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_RANLIB +CMAKE_RANLIB-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_READELF +CMAKE_READELF-ADVANCED:INTERNAL=1 +//Path to CMake installation. +CMAKE_ROOT:INTERNAL=/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31 +//ADVANCED property for variable: CMAKE_SHARED_LINKER_FLAGS +CMAKE_SHARED_LINKER_FLAGS-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_SHARED_LINKER_FLAGS_DEBUG +CMAKE_SHARED_LINKER_FLAGS_DEBUG-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_SHARED_LINKER_FLAGS_MINSIZEREL +CMAKE_SHARED_LINKER_FLAGS_MINSIZEREL-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_SHARED_LINKER_FLAGS_RELEASE +CMAKE_SHARED_LINKER_FLAGS_RELEASE-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_SHARED_LINKER_FLAGS_RELWITHDEBINFO +CMAKE_SHARED_LINKER_FLAGS_RELWITHDEBINFO-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_SKIP_INSTALL_RPATH +CMAKE_SKIP_INSTALL_RPATH-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_SKIP_RPATH +CMAKE_SKIP_RPATH-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_STATIC_LINKER_FLAGS +CMAKE_STATIC_LINKER_FLAGS-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_STATIC_LINKER_FLAGS_DEBUG +CMAKE_STATIC_LINKER_FLAGS_DEBUG-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_STATIC_LINKER_FLAGS_MINSIZEREL +CMAKE_STATIC_LINKER_FLAGS_MINSIZEREL-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_STATIC_LINKER_FLAGS_RELEASE +CMAKE_STATIC_LINKER_FLAGS_RELEASE-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_STATIC_LINKER_FLAGS_RELWITHDEBINFO +CMAKE_STATIC_LINKER_FLAGS_RELWITHDEBINFO-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_STRIP +CMAKE_STRIP-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_TAPI +CMAKE_TAPI-ADVANCED:INTERNAL=1 +//uname command +CMAKE_UNAME:INTERNAL=/usr/bin/uname +//ADVANCED property for variable: CMAKE_VERBOSE_MAKEFILE +CMAKE_VERBOSE_MAKEFILE-ADVANCED:INTERNAL=1 +//linker supports push/pop state +_CMAKE_CXX_LINKER_PUSHPOP_STATE_SUPPORTED:INTERNAL=TRUE +//linker supports push/pop state +_CMAKE_C_LINKER_PUSHPOP_STATE_SUPPORTED:INTERNAL=TRUE +//linker supports push/pop state +_CMAKE_LINKER_PUSHPOP_STATE_SUPPORTED:INTERNAL=TRUE + diff --git a/siro_rider/android/app/.cxx/RelWithDebInfo/6t1m4b5v/x86/CMakeFiles/3.31.5-g6cf5163/CMakeCCompiler.cmake b/siro_rider/android/app/.cxx/RelWithDebInfo/6t1m4b5v/x86/CMakeFiles/3.31.5-g6cf5163/CMakeCCompiler.cmake new file mode 100644 index 0000000..6f7fec1 --- /dev/null +++ b/siro_rider/android/app/.cxx/RelWithDebInfo/6t1m4b5v/x86/CMakeFiles/3.31.5-g6cf5163/CMakeCCompiler.cmake @@ -0,0 +1,81 @@ +set(CMAKE_C_COMPILER "/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/bin/clang") +set(CMAKE_C_COMPILER_ARG1 "") +set(CMAKE_C_COMPILER_ID "Clang") +set(CMAKE_C_COMPILER_VERSION "18.0.1") +set(CMAKE_C_COMPILER_VERSION_INTERNAL "") +set(CMAKE_C_COMPILER_WRAPPER "") +set(CMAKE_C_STANDARD_COMPUTED_DEFAULT "17") +set(CMAKE_C_EXTENSIONS_COMPUTED_DEFAULT "ON") +set(CMAKE_C_STANDARD_LATEST "23") +set(CMAKE_C_COMPILE_FEATURES "c_std_90;c_function_prototypes;c_std_99;c_restrict;c_variadic_macros;c_std_11;c_static_assert;c_std_17;c_std_23") +set(CMAKE_C90_COMPILE_FEATURES "c_std_90;c_function_prototypes") +set(CMAKE_C99_COMPILE_FEATURES "c_std_99;c_restrict;c_variadic_macros") +set(CMAKE_C11_COMPILE_FEATURES "c_std_11;c_static_assert") +set(CMAKE_C17_COMPILE_FEATURES "c_std_17") +set(CMAKE_C23_COMPILE_FEATURES "c_std_23") + +set(CMAKE_C_PLATFORM_ID "Linux") +set(CMAKE_C_SIMULATE_ID "") +set(CMAKE_C_COMPILER_FRONTEND_VARIANT "GNU") +set(CMAKE_C_SIMULATE_VERSION "") + + + + +set(CMAKE_AR "/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/bin/llvm-ar") +set(CMAKE_C_COMPILER_AR "/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/bin/llvm-ar") +set(CMAKE_RANLIB "/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/bin/llvm-ranlib") +set(CMAKE_C_COMPILER_RANLIB "/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/bin/llvm-ranlib") +set(CMAKE_LINKER "/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/bin/ld.lld") +set(CMAKE_LINKER_LINK "") +set(CMAKE_LINKER_LLD "") +set(CMAKE_C_COMPILER_LINKER "/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/bin/ld.lld") +set(CMAKE_C_COMPILER_LINKER_ID "LLD") +set(CMAKE_C_COMPILER_LINKER_VERSION 18.0.1) +set(CMAKE_C_COMPILER_LINKER_FRONTEND_VARIANT GNU) +set(CMAKE_MT "") +set(CMAKE_TAPI "CMAKE_TAPI-NOTFOUND") +set(CMAKE_COMPILER_IS_GNUCC ) +set(CMAKE_C_COMPILER_LOADED 1) +set(CMAKE_C_COMPILER_WORKS TRUE) +set(CMAKE_C_ABI_COMPILED TRUE) + +set(CMAKE_C_COMPILER_ENV_VAR "CC") + +set(CMAKE_C_COMPILER_ID_RUN 1) +set(CMAKE_C_SOURCE_FILE_EXTENSIONS c;m) +set(CMAKE_C_IGNORE_EXTENSIONS h;H;o;O;obj;OBJ;def;DEF;rc;RC) +set(CMAKE_C_LINKER_PREFERENCE 10) +set(CMAKE_C_LINKER_DEPFILE_SUPPORTED ) + +# Save compiler ABI information. +set(CMAKE_C_SIZEOF_DATA_PTR "4") +set(CMAKE_C_COMPILER_ABI "ELF") +set(CMAKE_C_BYTE_ORDER "LITTLE_ENDIAN") +set(CMAKE_C_LIBRARY_ARCHITECTURE "i686-linux-android") + +if(CMAKE_C_SIZEOF_DATA_PTR) + set(CMAKE_SIZEOF_VOID_P "${CMAKE_C_SIZEOF_DATA_PTR}") +endif() + +if(CMAKE_C_COMPILER_ABI) + set(CMAKE_INTERNAL_PLATFORM_ABI "${CMAKE_C_COMPILER_ABI}") +endif() + +if(CMAKE_C_LIBRARY_ARCHITECTURE) + set(CMAKE_LIBRARY_ARCHITECTURE "i686-linux-android") +endif() + +set(CMAKE_C_CL_SHOWINCLUDES_PREFIX "") +if(CMAKE_C_CL_SHOWINCLUDES_PREFIX) + set(CMAKE_CL_SHOWINCLUDES_PREFIX "${CMAKE_C_CL_SHOWINCLUDES_PREFIX}") +endif() + + + + + +set(CMAKE_C_IMPLICIT_INCLUDE_DIRECTORIES "/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/lib/clang/18/include;/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/include/i686-linux-android;/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/include") +set(CMAKE_C_IMPLICIT_LINK_LIBRARIES "-l:libunwind.a;dl;c;-l:libunwind.a;dl") +set(CMAKE_C_IMPLICIT_LINK_DIRECTORIES "/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/lib/clang/18/lib/linux/i386;/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/lib/i686-linux-android/23;/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/lib/i686-linux-android;/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/lib") +set(CMAKE_C_IMPLICIT_LINK_FRAMEWORK_DIRECTORIES "") diff --git a/siro_rider/android/app/.cxx/RelWithDebInfo/6t1m4b5v/x86/CMakeFiles/3.31.5-g6cf5163/CMakeCXXCompiler.cmake b/siro_rider/android/app/.cxx/RelWithDebInfo/6t1m4b5v/x86/CMakeFiles/3.31.5-g6cf5163/CMakeCXXCompiler.cmake new file mode 100644 index 0000000..3536164 --- /dev/null +++ b/siro_rider/android/app/.cxx/RelWithDebInfo/6t1m4b5v/x86/CMakeFiles/3.31.5-g6cf5163/CMakeCXXCompiler.cmake @@ -0,0 +1,105 @@ +set(CMAKE_CXX_COMPILER "/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/bin/clang++") +set(CMAKE_CXX_COMPILER_ARG1 "") +set(CMAKE_CXX_COMPILER_ID "Clang") +set(CMAKE_CXX_COMPILER_VERSION "18.0.1") +set(CMAKE_CXX_COMPILER_VERSION_INTERNAL "") +set(CMAKE_CXX_COMPILER_WRAPPER "") +set(CMAKE_CXX_STANDARD_COMPUTED_DEFAULT "17") +set(CMAKE_CXX_EXTENSIONS_COMPUTED_DEFAULT "ON") +set(CMAKE_CXX_STANDARD_LATEST "26") +set(CMAKE_CXX_COMPILE_FEATURES "cxx_std_98;cxx_template_template_parameters;cxx_std_11;cxx_alias_templates;cxx_alignas;cxx_alignof;cxx_attributes;cxx_auto_type;cxx_constexpr;cxx_decltype;cxx_decltype_incomplete_return_types;cxx_default_function_template_args;cxx_defaulted_functions;cxx_defaulted_move_initializers;cxx_delegating_constructors;cxx_deleted_functions;cxx_enum_forward_declarations;cxx_explicit_conversions;cxx_extended_friend_declarations;cxx_extern_templates;cxx_final;cxx_func_identifier;cxx_generalized_initializers;cxx_inheriting_constructors;cxx_inline_namespaces;cxx_lambdas;cxx_local_type_template_args;cxx_long_long_type;cxx_noexcept;cxx_nonstatic_member_init;cxx_nullptr;cxx_override;cxx_range_for;cxx_raw_string_literals;cxx_reference_qualified_functions;cxx_right_angle_brackets;cxx_rvalue_references;cxx_sizeof_member;cxx_static_assert;cxx_strong_enums;cxx_thread_local;cxx_trailing_return_types;cxx_unicode_literals;cxx_uniform_initialization;cxx_unrestricted_unions;cxx_user_literals;cxx_variadic_macros;cxx_variadic_templates;cxx_std_14;cxx_aggregate_default_initializers;cxx_attribute_deprecated;cxx_binary_literals;cxx_contextual_conversions;cxx_decltype_auto;cxx_digit_separators;cxx_generic_lambdas;cxx_lambda_init_captures;cxx_relaxed_constexpr;cxx_return_type_deduction;cxx_variable_templates;cxx_std_17;cxx_std_20;cxx_std_23;cxx_std_26") +set(CMAKE_CXX98_COMPILE_FEATURES "cxx_std_98;cxx_template_template_parameters") +set(CMAKE_CXX11_COMPILE_FEATURES "cxx_std_11;cxx_alias_templates;cxx_alignas;cxx_alignof;cxx_attributes;cxx_auto_type;cxx_constexpr;cxx_decltype;cxx_decltype_incomplete_return_types;cxx_default_function_template_args;cxx_defaulted_functions;cxx_defaulted_move_initializers;cxx_delegating_constructors;cxx_deleted_functions;cxx_enum_forward_declarations;cxx_explicit_conversions;cxx_extended_friend_declarations;cxx_extern_templates;cxx_final;cxx_func_identifier;cxx_generalized_initializers;cxx_inheriting_constructors;cxx_inline_namespaces;cxx_lambdas;cxx_local_type_template_args;cxx_long_long_type;cxx_noexcept;cxx_nonstatic_member_init;cxx_nullptr;cxx_override;cxx_range_for;cxx_raw_string_literals;cxx_reference_qualified_functions;cxx_right_angle_brackets;cxx_rvalue_references;cxx_sizeof_member;cxx_static_assert;cxx_strong_enums;cxx_thread_local;cxx_trailing_return_types;cxx_unicode_literals;cxx_uniform_initialization;cxx_unrestricted_unions;cxx_user_literals;cxx_variadic_macros;cxx_variadic_templates") +set(CMAKE_CXX14_COMPILE_FEATURES "cxx_std_14;cxx_aggregate_default_initializers;cxx_attribute_deprecated;cxx_binary_literals;cxx_contextual_conversions;cxx_decltype_auto;cxx_digit_separators;cxx_generic_lambdas;cxx_lambda_init_captures;cxx_relaxed_constexpr;cxx_return_type_deduction;cxx_variable_templates") +set(CMAKE_CXX17_COMPILE_FEATURES "cxx_std_17") +set(CMAKE_CXX20_COMPILE_FEATURES "cxx_std_20") +set(CMAKE_CXX23_COMPILE_FEATURES "cxx_std_23") +set(CMAKE_CXX26_COMPILE_FEATURES "cxx_std_26") + +set(CMAKE_CXX_PLATFORM_ID "Linux") +set(CMAKE_CXX_SIMULATE_ID "") +set(CMAKE_CXX_COMPILER_FRONTEND_VARIANT "GNU") +set(CMAKE_CXX_SIMULATE_VERSION "") + + + + +set(CMAKE_AR "/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/bin/llvm-ar") +set(CMAKE_CXX_COMPILER_AR "/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/bin/llvm-ar") +set(CMAKE_RANLIB "/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/bin/llvm-ranlib") +set(CMAKE_CXX_COMPILER_RANLIB "/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/bin/llvm-ranlib") +set(CMAKE_LINKER "/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/bin/ld.lld") +set(CMAKE_LINKER_LINK "") +set(CMAKE_LINKER_LLD "") +set(CMAKE_CXX_COMPILER_LINKER "/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/bin/ld.lld") +set(CMAKE_CXX_COMPILER_LINKER_ID "LLD") +set(CMAKE_CXX_COMPILER_LINKER_VERSION 18.0.1) +set(CMAKE_CXX_COMPILER_LINKER_FRONTEND_VARIANT GNU) +set(CMAKE_MT "") +set(CMAKE_TAPI "CMAKE_TAPI-NOTFOUND") +set(CMAKE_COMPILER_IS_GNUCXX ) +set(CMAKE_CXX_COMPILER_LOADED 1) +set(CMAKE_CXX_COMPILER_WORKS TRUE) +set(CMAKE_CXX_ABI_COMPILED TRUE) + +set(CMAKE_CXX_COMPILER_ENV_VAR "CXX") + +set(CMAKE_CXX_COMPILER_ID_RUN 1) +set(CMAKE_CXX_SOURCE_FILE_EXTENSIONS C;M;c++;cc;cpp;cxx;m;mm;mpp;CPP;ixx;cppm;ccm;cxxm;c++m) +set(CMAKE_CXX_IGNORE_EXTENSIONS inl;h;hpp;HPP;H;o;O;obj;OBJ;def;DEF;rc;RC) + +foreach (lang IN ITEMS C OBJC OBJCXX) + if (CMAKE_${lang}_COMPILER_ID_RUN) + foreach(extension IN LISTS CMAKE_${lang}_SOURCE_FILE_EXTENSIONS) + list(REMOVE_ITEM CMAKE_CXX_SOURCE_FILE_EXTENSIONS ${extension}) + endforeach() + endif() +endforeach() + +set(CMAKE_CXX_LINKER_PREFERENCE 30) +set(CMAKE_CXX_LINKER_PREFERENCE_PROPAGATES 1) +set(CMAKE_CXX_LINKER_DEPFILE_SUPPORTED ) + +# Save compiler ABI information. +set(CMAKE_CXX_SIZEOF_DATA_PTR "4") +set(CMAKE_CXX_COMPILER_ABI "ELF") +set(CMAKE_CXX_BYTE_ORDER "LITTLE_ENDIAN") +set(CMAKE_CXX_LIBRARY_ARCHITECTURE "i686-linux-android") + +if(CMAKE_CXX_SIZEOF_DATA_PTR) + set(CMAKE_SIZEOF_VOID_P "${CMAKE_CXX_SIZEOF_DATA_PTR}") +endif() + +if(CMAKE_CXX_COMPILER_ABI) + set(CMAKE_INTERNAL_PLATFORM_ABI "${CMAKE_CXX_COMPILER_ABI}") +endif() + +if(CMAKE_CXX_LIBRARY_ARCHITECTURE) + set(CMAKE_LIBRARY_ARCHITECTURE "i686-linux-android") +endif() + +set(CMAKE_CXX_CL_SHOWINCLUDES_PREFIX "") +if(CMAKE_CXX_CL_SHOWINCLUDES_PREFIX) + set(CMAKE_CL_SHOWINCLUDES_PREFIX "${CMAKE_CXX_CL_SHOWINCLUDES_PREFIX}") +endif() + + + + + +set(CMAKE_CXX_IMPLICIT_INCLUDE_DIRECTORIES "/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/include/c++/v1;/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/lib/clang/18/include;/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/include/i686-linux-android;/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/include") +set(CMAKE_CXX_IMPLICIT_LINK_LIBRARIES "c++;m;-l:libunwind.a;dl;c;-l:libunwind.a;dl") +set(CMAKE_CXX_IMPLICIT_LINK_DIRECTORIES "/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/lib/clang/18/lib/linux/i386;/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/lib/i686-linux-android/23;/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/lib/i686-linux-android;/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/lib") +set(CMAKE_CXX_IMPLICIT_LINK_FRAMEWORK_DIRECTORIES "") +set(CMAKE_CXX_COMPILER_CLANG_RESOURCE_DIR "/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/lib/clang/18") + +set(CMAKE_CXX_COMPILER_IMPORT_STD "") +### Imported target for C++23 standard library +set(CMAKE_CXX23_COMPILER_IMPORT_STD_NOT_FOUND_MESSAGE "Experimental `import std` support not enabled when detecting toolchain; it must be set before `CXX` is enabled (usually a `project()` call)") + + +### Imported target for C++26 standard library +set(CMAKE_CXX26_COMPILER_IMPORT_STD_NOT_FOUND_MESSAGE "Experimental `import std` support not enabled when detecting toolchain; it must be set before `CXX` is enabled (usually a `project()` call)") + + + diff --git a/siro_rider/android/app/.cxx/RelWithDebInfo/6t1m4b5v/x86/CMakeFiles/3.31.5-g6cf5163/CMakeDetermineCompilerABI_C.bin b/siro_rider/android/app/.cxx/RelWithDebInfo/6t1m4b5v/x86/CMakeFiles/3.31.5-g6cf5163/CMakeDetermineCompilerABI_C.bin new file mode 100755 index 0000000..18a887f Binary files /dev/null and b/siro_rider/android/app/.cxx/RelWithDebInfo/6t1m4b5v/x86/CMakeFiles/3.31.5-g6cf5163/CMakeDetermineCompilerABI_C.bin differ diff --git a/siro_rider/android/app/.cxx/RelWithDebInfo/6t1m4b5v/x86/CMakeFiles/3.31.5-g6cf5163/CMakeDetermineCompilerABI_CXX.bin b/siro_rider/android/app/.cxx/RelWithDebInfo/6t1m4b5v/x86/CMakeFiles/3.31.5-g6cf5163/CMakeDetermineCompilerABI_CXX.bin new file mode 100755 index 0000000..af7b100 Binary files /dev/null and b/siro_rider/android/app/.cxx/RelWithDebInfo/6t1m4b5v/x86/CMakeFiles/3.31.5-g6cf5163/CMakeDetermineCompilerABI_CXX.bin differ diff --git a/siro_rider/android/app/.cxx/RelWithDebInfo/6t1m4b5v/x86/CMakeFiles/3.31.5-g6cf5163/CMakeSystem.cmake b/siro_rider/android/app/.cxx/RelWithDebInfo/6t1m4b5v/x86/CMakeFiles/3.31.5-g6cf5163/CMakeSystem.cmake new file mode 100644 index 0000000..4828e9f --- /dev/null +++ b/siro_rider/android/app/.cxx/RelWithDebInfo/6t1m4b5v/x86/CMakeFiles/3.31.5-g6cf5163/CMakeSystem.cmake @@ -0,0 +1,15 @@ +set(CMAKE_HOST_SYSTEM "Darwin-24.5.0") +set(CMAKE_HOST_SYSTEM_NAME "Darwin") +set(CMAKE_HOST_SYSTEM_VERSION "24.5.0") +set(CMAKE_HOST_SYSTEM_PROCESSOR "arm64") + +include("/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/build/cmake/android.toolchain.cmake") + +set(CMAKE_SYSTEM "Android-1") +set(CMAKE_SYSTEM_NAME "Android") +set(CMAKE_SYSTEM_VERSION "1") +set(CMAKE_SYSTEM_PROCESSOR "i686") + +set(CMAKE_CROSSCOMPILING "TRUE") + +set(CMAKE_SYSTEM_LOADED 1) diff --git a/siro_rider/android/app/.cxx/RelWithDebInfo/6t1m4b5v/x86/CMakeFiles/3.31.5-g6cf5163/CompilerIdC/CMakeCCompilerId.c b/siro_rider/android/app/.cxx/RelWithDebInfo/6t1m4b5v/x86/CMakeFiles/3.31.5-g6cf5163/CompilerIdC/CMakeCCompilerId.c new file mode 100644 index 0000000..8d8bb03 --- /dev/null +++ b/siro_rider/android/app/.cxx/RelWithDebInfo/6t1m4b5v/x86/CMakeFiles/3.31.5-g6cf5163/CompilerIdC/CMakeCCompilerId.c @@ -0,0 +1,904 @@ +#ifdef __cplusplus +# error "A C++ compiler has been selected for C." +#endif + +#if defined(__18CXX) +# define ID_VOID_MAIN +#endif +#if defined(__CLASSIC_C__) +/* cv-qualifiers did not exist in K&R C */ +# define const +# define volatile +#endif + +#if !defined(__has_include) +/* If the compiler does not have __has_include, pretend the answer is + always no. */ +# define __has_include(x) 0 +#endif + + +/* Version number components: V=Version, R=Revision, P=Patch + Version date components: YYYY=Year, MM=Month, DD=Day */ + +#if defined(__INTEL_COMPILER) || defined(__ICC) +# define COMPILER_ID "Intel" +# if defined(_MSC_VER) +# define SIMULATE_ID "MSVC" +# endif +# if defined(__GNUC__) +# define SIMULATE_ID "GNU" +# endif + /* __INTEL_COMPILER = VRP prior to 2021, and then VVVV for 2021 and later, + except that a few beta releases use the old format with V=2021. */ +# if __INTEL_COMPILER < 2021 || __INTEL_COMPILER == 202110 || __INTEL_COMPILER == 202111 +# define COMPILER_VERSION_MAJOR DEC(__INTEL_COMPILER/100) +# define COMPILER_VERSION_MINOR DEC(__INTEL_COMPILER/10 % 10) +# if defined(__INTEL_COMPILER_UPDATE) +# define COMPILER_VERSION_PATCH DEC(__INTEL_COMPILER_UPDATE) +# else +# define COMPILER_VERSION_PATCH DEC(__INTEL_COMPILER % 10) +# endif +# else +# define COMPILER_VERSION_MAJOR DEC(__INTEL_COMPILER) +# define COMPILER_VERSION_MINOR DEC(__INTEL_COMPILER_UPDATE) + /* The third version component from --version is an update index, + but no macro is provided for it. */ +# define COMPILER_VERSION_PATCH DEC(0) +# endif +# if defined(__INTEL_COMPILER_BUILD_DATE) + /* __INTEL_COMPILER_BUILD_DATE = YYYYMMDD */ +# define COMPILER_VERSION_TWEAK DEC(__INTEL_COMPILER_BUILD_DATE) +# endif +# if defined(_MSC_VER) + /* _MSC_VER = VVRR */ +# define SIMULATE_VERSION_MAJOR DEC(_MSC_VER / 100) +# define SIMULATE_VERSION_MINOR DEC(_MSC_VER % 100) +# endif +# if defined(__GNUC__) +# define SIMULATE_VERSION_MAJOR DEC(__GNUC__) +# elif defined(__GNUG__) +# define SIMULATE_VERSION_MAJOR DEC(__GNUG__) +# endif +# if defined(__GNUC_MINOR__) +# define SIMULATE_VERSION_MINOR DEC(__GNUC_MINOR__) +# endif +# if defined(__GNUC_PATCHLEVEL__) +# define SIMULATE_VERSION_PATCH DEC(__GNUC_PATCHLEVEL__) +# endif + +#elif (defined(__clang__) && defined(__INTEL_CLANG_COMPILER)) || defined(__INTEL_LLVM_COMPILER) +# define COMPILER_ID "IntelLLVM" +#if defined(_MSC_VER) +# define SIMULATE_ID "MSVC" +#endif +#if defined(__GNUC__) +# define SIMULATE_ID "GNU" +#endif +/* __INTEL_LLVM_COMPILER = VVVVRP prior to 2021.2.0, VVVVRRPP for 2021.2.0 and + * later. Look for 6 digit vs. 8 digit version number to decide encoding. + * VVVV is no smaller than the current year when a version is released. + */ +#if __INTEL_LLVM_COMPILER < 1000000L +# define COMPILER_VERSION_MAJOR DEC(__INTEL_LLVM_COMPILER/100) +# define COMPILER_VERSION_MINOR DEC(__INTEL_LLVM_COMPILER/10 % 10) +# define COMPILER_VERSION_PATCH DEC(__INTEL_LLVM_COMPILER % 10) +#else +# define COMPILER_VERSION_MAJOR DEC(__INTEL_LLVM_COMPILER/10000) +# define COMPILER_VERSION_MINOR DEC(__INTEL_LLVM_COMPILER/100 % 100) +# define COMPILER_VERSION_PATCH DEC(__INTEL_LLVM_COMPILER % 100) +#endif +#if defined(_MSC_VER) + /* _MSC_VER = VVRR */ +# define SIMULATE_VERSION_MAJOR DEC(_MSC_VER / 100) +# define SIMULATE_VERSION_MINOR DEC(_MSC_VER % 100) +#endif +#if defined(__GNUC__) +# define SIMULATE_VERSION_MAJOR DEC(__GNUC__) +#elif defined(__GNUG__) +# define SIMULATE_VERSION_MAJOR DEC(__GNUG__) +#endif +#if defined(__GNUC_MINOR__) +# define SIMULATE_VERSION_MINOR DEC(__GNUC_MINOR__) +#endif +#if defined(__GNUC_PATCHLEVEL__) +# define SIMULATE_VERSION_PATCH DEC(__GNUC_PATCHLEVEL__) +#endif + +#elif defined(__PATHCC__) +# define COMPILER_ID "PathScale" +# define COMPILER_VERSION_MAJOR DEC(__PATHCC__) +# define COMPILER_VERSION_MINOR DEC(__PATHCC_MINOR__) +# if defined(__PATHCC_PATCHLEVEL__) +# define COMPILER_VERSION_PATCH DEC(__PATHCC_PATCHLEVEL__) +# endif + +#elif defined(__BORLANDC__) && defined(__CODEGEARC_VERSION__) +# define COMPILER_ID "Embarcadero" +# define COMPILER_VERSION_MAJOR HEX(__CODEGEARC_VERSION__>>24 & 0x00FF) +# define COMPILER_VERSION_MINOR HEX(__CODEGEARC_VERSION__>>16 & 0x00FF) +# define COMPILER_VERSION_PATCH DEC(__CODEGEARC_VERSION__ & 0xFFFF) + +#elif defined(__BORLANDC__) +# define COMPILER_ID "Borland" + /* __BORLANDC__ = 0xVRR */ +# define COMPILER_VERSION_MAJOR HEX(__BORLANDC__>>8) +# define COMPILER_VERSION_MINOR HEX(__BORLANDC__ & 0xFF) + +#elif defined(__WATCOMC__) && __WATCOMC__ < 1200 +# define COMPILER_ID "Watcom" + /* __WATCOMC__ = VVRR */ +# define COMPILER_VERSION_MAJOR DEC(__WATCOMC__ / 100) +# define COMPILER_VERSION_MINOR DEC((__WATCOMC__ / 10) % 10) +# if (__WATCOMC__ % 10) > 0 +# define COMPILER_VERSION_PATCH DEC(__WATCOMC__ % 10) +# endif + +#elif defined(__WATCOMC__) +# define COMPILER_ID "OpenWatcom" + /* __WATCOMC__ = VVRP + 1100 */ +# define COMPILER_VERSION_MAJOR DEC((__WATCOMC__ - 1100) / 100) +# define COMPILER_VERSION_MINOR DEC((__WATCOMC__ / 10) % 10) +# if (__WATCOMC__ % 10) > 0 +# define COMPILER_VERSION_PATCH DEC(__WATCOMC__ % 10) +# endif + +#elif defined(__SUNPRO_C) +# define COMPILER_ID "SunPro" +# if __SUNPRO_C >= 0x5100 + /* __SUNPRO_C = 0xVRRP */ +# define COMPILER_VERSION_MAJOR HEX(__SUNPRO_C>>12) +# define COMPILER_VERSION_MINOR HEX(__SUNPRO_C>>4 & 0xFF) +# define COMPILER_VERSION_PATCH HEX(__SUNPRO_C & 0xF) +# else + /* __SUNPRO_CC = 0xVRP */ +# define COMPILER_VERSION_MAJOR HEX(__SUNPRO_C>>8) +# define COMPILER_VERSION_MINOR HEX(__SUNPRO_C>>4 & 0xF) +# define COMPILER_VERSION_PATCH HEX(__SUNPRO_C & 0xF) +# endif + +#elif defined(__HP_cc) +# define COMPILER_ID "HP" + /* __HP_cc = VVRRPP */ +# define COMPILER_VERSION_MAJOR DEC(__HP_cc/10000) +# define COMPILER_VERSION_MINOR DEC(__HP_cc/100 % 100) +# define COMPILER_VERSION_PATCH DEC(__HP_cc % 100) + +#elif defined(__DECC) +# define COMPILER_ID "Compaq" + /* __DECC_VER = VVRRTPPPP */ +# define COMPILER_VERSION_MAJOR DEC(__DECC_VER/10000000) +# define COMPILER_VERSION_MINOR DEC(__DECC_VER/100000 % 100) +# define COMPILER_VERSION_PATCH DEC(__DECC_VER % 10000) + +#elif defined(__IBMC__) && defined(__COMPILER_VER__) +# define COMPILER_ID "zOS" + /* __IBMC__ = VRP */ +# define COMPILER_VERSION_MAJOR DEC(__IBMC__/100) +# define COMPILER_VERSION_MINOR DEC(__IBMC__/10 % 10) +# define COMPILER_VERSION_PATCH DEC(__IBMC__ % 10) + +#elif defined(__open_xl__) && defined(__clang__) +# define COMPILER_ID "IBMClang" +# define COMPILER_VERSION_MAJOR DEC(__open_xl_version__) +# define COMPILER_VERSION_MINOR DEC(__open_xl_release__) +# define COMPILER_VERSION_PATCH DEC(__open_xl_modification__) +# define COMPILER_VERSION_TWEAK DEC(__open_xl_ptf_fix_level__) + + +#elif defined(__ibmxl__) && defined(__clang__) +# define COMPILER_ID "XLClang" +# define COMPILER_VERSION_MAJOR DEC(__ibmxl_version__) +# define COMPILER_VERSION_MINOR DEC(__ibmxl_release__) +# define COMPILER_VERSION_PATCH DEC(__ibmxl_modification__) +# define COMPILER_VERSION_TWEAK DEC(__ibmxl_ptf_fix_level__) + + +#elif defined(__IBMC__) && !defined(__COMPILER_VER__) && __IBMC__ >= 800 +# define COMPILER_ID "XL" + /* __IBMC__ = VRP */ +# define COMPILER_VERSION_MAJOR DEC(__IBMC__/100) +# define COMPILER_VERSION_MINOR DEC(__IBMC__/10 % 10) +# define COMPILER_VERSION_PATCH DEC(__IBMC__ % 10) + +#elif defined(__IBMC__) && !defined(__COMPILER_VER__) && __IBMC__ < 800 +# define COMPILER_ID "VisualAge" + /* __IBMC__ = VRP */ +# define COMPILER_VERSION_MAJOR DEC(__IBMC__/100) +# define COMPILER_VERSION_MINOR DEC(__IBMC__/10 % 10) +# define COMPILER_VERSION_PATCH DEC(__IBMC__ % 10) + +#elif defined(__NVCOMPILER) +# define COMPILER_ID "NVHPC" +# define COMPILER_VERSION_MAJOR DEC(__NVCOMPILER_MAJOR__) +# define COMPILER_VERSION_MINOR DEC(__NVCOMPILER_MINOR__) +# if defined(__NVCOMPILER_PATCHLEVEL__) +# define COMPILER_VERSION_PATCH DEC(__NVCOMPILER_PATCHLEVEL__) +# endif + +#elif defined(__PGI) +# define COMPILER_ID "PGI" +# define COMPILER_VERSION_MAJOR DEC(__PGIC__) +# define COMPILER_VERSION_MINOR DEC(__PGIC_MINOR__) +# if defined(__PGIC_PATCHLEVEL__) +# define COMPILER_VERSION_PATCH DEC(__PGIC_PATCHLEVEL__) +# endif + +#elif defined(__clang__) && defined(__cray__) +# define COMPILER_ID "CrayClang" +# define COMPILER_VERSION_MAJOR DEC(__cray_major__) +# define COMPILER_VERSION_MINOR DEC(__cray_minor__) +# define COMPILER_VERSION_PATCH DEC(__cray_patchlevel__) +# define COMPILER_VERSION_INTERNAL_STR __clang_version__ + + +#elif defined(_CRAYC) +# define COMPILER_ID "Cray" +# define COMPILER_VERSION_MAJOR DEC(_RELEASE_MAJOR) +# define COMPILER_VERSION_MINOR DEC(_RELEASE_MINOR) + +#elif defined(__TI_COMPILER_VERSION__) +# define COMPILER_ID "TI" + /* __TI_COMPILER_VERSION__ = VVVRRRPPP */ +# define COMPILER_VERSION_MAJOR DEC(__TI_COMPILER_VERSION__/1000000) +# define COMPILER_VERSION_MINOR DEC(__TI_COMPILER_VERSION__/1000 % 1000) +# define COMPILER_VERSION_PATCH DEC(__TI_COMPILER_VERSION__ % 1000) + +#elif defined(__CLANG_FUJITSU) +# define COMPILER_ID "FujitsuClang" +# define COMPILER_VERSION_MAJOR DEC(__FCC_major__) +# define COMPILER_VERSION_MINOR DEC(__FCC_minor__) +# define COMPILER_VERSION_PATCH DEC(__FCC_patchlevel__) +# define COMPILER_VERSION_INTERNAL_STR __clang_version__ + + +#elif defined(__FUJITSU) +# define COMPILER_ID "Fujitsu" +# if defined(__FCC_version__) +# define COMPILER_VERSION __FCC_version__ +# elif defined(__FCC_major__) +# define COMPILER_VERSION_MAJOR DEC(__FCC_major__) +# define COMPILER_VERSION_MINOR DEC(__FCC_minor__) +# define COMPILER_VERSION_PATCH DEC(__FCC_patchlevel__) +# endif +# if defined(__fcc_version) +# define COMPILER_VERSION_INTERNAL DEC(__fcc_version) +# elif defined(__FCC_VERSION) +# define COMPILER_VERSION_INTERNAL DEC(__FCC_VERSION) +# endif + + +#elif defined(__ghs__) +# define COMPILER_ID "GHS" +/* __GHS_VERSION_NUMBER = VVVVRP */ +# ifdef __GHS_VERSION_NUMBER +# define COMPILER_VERSION_MAJOR DEC(__GHS_VERSION_NUMBER / 100) +# define COMPILER_VERSION_MINOR DEC(__GHS_VERSION_NUMBER / 10 % 10) +# define COMPILER_VERSION_PATCH DEC(__GHS_VERSION_NUMBER % 10) +# endif + +#elif defined(__TASKING__) +# define COMPILER_ID "Tasking" + # define COMPILER_VERSION_MAJOR DEC(__VERSION__/1000) + # define COMPILER_VERSION_MINOR DEC(__VERSION__ % 100) +# define COMPILER_VERSION_INTERNAL DEC(__VERSION__) + +#elif defined(__ORANGEC__) +# define COMPILER_ID "OrangeC" +# define COMPILER_VERSION_MAJOR DEC(__ORANGEC_MAJOR__) +# define COMPILER_VERSION_MINOR DEC(__ORANGEC_MINOR__) +# define COMPILER_VERSION_PATCH DEC(__ORANGEC_PATCHLEVEL__) + +#elif defined(__TINYC__) +# define COMPILER_ID "TinyCC" + +#elif defined(__BCC__) +# define COMPILER_ID "Bruce" + +#elif defined(__SCO_VERSION__) +# define COMPILER_ID "SCO" + +#elif defined(__ARMCC_VERSION) && !defined(__clang__) +# define COMPILER_ID "ARMCC" +#if __ARMCC_VERSION >= 1000000 + /* __ARMCC_VERSION = VRRPPPP */ + # define COMPILER_VERSION_MAJOR DEC(__ARMCC_VERSION/1000000) + # define COMPILER_VERSION_MINOR DEC(__ARMCC_VERSION/10000 % 100) + # define COMPILER_VERSION_PATCH DEC(__ARMCC_VERSION % 10000) +#else + /* __ARMCC_VERSION = VRPPPP */ + # define COMPILER_VERSION_MAJOR DEC(__ARMCC_VERSION/100000) + # define COMPILER_VERSION_MINOR DEC(__ARMCC_VERSION/10000 % 10) + # define COMPILER_VERSION_PATCH DEC(__ARMCC_VERSION % 10000) +#endif + + +#elif defined(__clang__) && defined(__apple_build_version__) +# define COMPILER_ID "AppleClang" +# if defined(_MSC_VER) +# define SIMULATE_ID "MSVC" +# endif +# define COMPILER_VERSION_MAJOR DEC(__clang_major__) +# define COMPILER_VERSION_MINOR DEC(__clang_minor__) +# define COMPILER_VERSION_PATCH DEC(__clang_patchlevel__) +# if defined(_MSC_VER) + /* _MSC_VER = VVRR */ +# define SIMULATE_VERSION_MAJOR DEC(_MSC_VER / 100) +# define SIMULATE_VERSION_MINOR DEC(_MSC_VER % 100) +# endif +# define COMPILER_VERSION_TWEAK DEC(__apple_build_version__) + +#elif defined(__clang__) && defined(__ARMCOMPILER_VERSION) +# define COMPILER_ID "ARMClang" + # define COMPILER_VERSION_MAJOR DEC(__ARMCOMPILER_VERSION/1000000) + # define COMPILER_VERSION_MINOR DEC(__ARMCOMPILER_VERSION/10000 % 100) + # define COMPILER_VERSION_PATCH DEC(__ARMCOMPILER_VERSION/100 % 100) +# define COMPILER_VERSION_INTERNAL DEC(__ARMCOMPILER_VERSION) + +#elif defined(__clang__) && defined(__ti__) +# define COMPILER_ID "TIClang" + # define COMPILER_VERSION_MAJOR DEC(__ti_major__) + # define COMPILER_VERSION_MINOR DEC(__ti_minor__) + # define COMPILER_VERSION_PATCH DEC(__ti_patchlevel__) +# define COMPILER_VERSION_INTERNAL DEC(__ti_version__) + +#elif defined(__clang__) +# define COMPILER_ID "Clang" +# if defined(_MSC_VER) +# define SIMULATE_ID "MSVC" +# endif +# define COMPILER_VERSION_MAJOR DEC(__clang_major__) +# define COMPILER_VERSION_MINOR DEC(__clang_minor__) +# define COMPILER_VERSION_PATCH DEC(__clang_patchlevel__) +# if defined(_MSC_VER) + /* _MSC_VER = VVRR */ +# define SIMULATE_VERSION_MAJOR DEC(_MSC_VER / 100) +# define SIMULATE_VERSION_MINOR DEC(_MSC_VER % 100) +# endif + +#elif defined(__LCC__) && (defined(__GNUC__) || defined(__GNUG__) || defined(__MCST__)) +# define COMPILER_ID "LCC" +# define COMPILER_VERSION_MAJOR DEC(__LCC__ / 100) +# define COMPILER_VERSION_MINOR DEC(__LCC__ % 100) +# if defined(__LCC_MINOR__) +# define COMPILER_VERSION_PATCH DEC(__LCC_MINOR__) +# endif +# if defined(__GNUC__) && defined(__GNUC_MINOR__) +# define SIMULATE_ID "GNU" +# define SIMULATE_VERSION_MAJOR DEC(__GNUC__) +# define SIMULATE_VERSION_MINOR DEC(__GNUC_MINOR__) +# if defined(__GNUC_PATCHLEVEL__) +# define SIMULATE_VERSION_PATCH DEC(__GNUC_PATCHLEVEL__) +# endif +# endif + +#elif defined(__GNUC__) +# define COMPILER_ID "GNU" +# define COMPILER_VERSION_MAJOR DEC(__GNUC__) +# if defined(__GNUC_MINOR__) +# define COMPILER_VERSION_MINOR DEC(__GNUC_MINOR__) +# endif +# if defined(__GNUC_PATCHLEVEL__) +# define COMPILER_VERSION_PATCH DEC(__GNUC_PATCHLEVEL__) +# endif + +#elif defined(_MSC_VER) +# define COMPILER_ID "MSVC" + /* _MSC_VER = VVRR */ +# define COMPILER_VERSION_MAJOR DEC(_MSC_VER / 100) +# define COMPILER_VERSION_MINOR DEC(_MSC_VER % 100) +# if defined(_MSC_FULL_VER) +# if _MSC_VER >= 1400 + /* _MSC_FULL_VER = VVRRPPPPP */ +# define COMPILER_VERSION_PATCH DEC(_MSC_FULL_VER % 100000) +# else + /* _MSC_FULL_VER = VVRRPPPP */ +# define COMPILER_VERSION_PATCH DEC(_MSC_FULL_VER % 10000) +# endif +# endif +# if defined(_MSC_BUILD) +# define COMPILER_VERSION_TWEAK DEC(_MSC_BUILD) +# endif + +#elif defined(_ADI_COMPILER) +# define COMPILER_ID "ADSP" +#if defined(__VERSIONNUM__) + /* __VERSIONNUM__ = 0xVVRRPPTT */ +# define COMPILER_VERSION_MAJOR DEC(__VERSIONNUM__ >> 24 & 0xFF) +# define COMPILER_VERSION_MINOR DEC(__VERSIONNUM__ >> 16 & 0xFF) +# define COMPILER_VERSION_PATCH DEC(__VERSIONNUM__ >> 8 & 0xFF) +# define COMPILER_VERSION_TWEAK DEC(__VERSIONNUM__ & 0xFF) +#endif + +#elif defined(__IAR_SYSTEMS_ICC__) || defined(__IAR_SYSTEMS_ICC) +# define COMPILER_ID "IAR" +# if defined(__VER__) && defined(__ICCARM__) +# define COMPILER_VERSION_MAJOR DEC((__VER__) / 1000000) +# define COMPILER_VERSION_MINOR DEC(((__VER__) / 1000) % 1000) +# define COMPILER_VERSION_PATCH DEC((__VER__) % 1000) +# define COMPILER_VERSION_INTERNAL DEC(__IAR_SYSTEMS_ICC__) +# elif defined(__VER__) && (defined(__ICCAVR__) || defined(__ICCRX__) || defined(__ICCRH850__) || defined(__ICCRL78__) || defined(__ICC430__) || defined(__ICCRISCV__) || defined(__ICCV850__) || defined(__ICC8051__) || defined(__ICCSTM8__)) +# define COMPILER_VERSION_MAJOR DEC((__VER__) / 100) +# define COMPILER_VERSION_MINOR DEC((__VER__) - (((__VER__) / 100)*100)) +# define COMPILER_VERSION_PATCH DEC(__SUBVERSION__) +# define COMPILER_VERSION_INTERNAL DEC(__IAR_SYSTEMS_ICC__) +# endif + +#elif defined(__SDCC_VERSION_MAJOR) || defined(SDCC) +# define COMPILER_ID "SDCC" +# if defined(__SDCC_VERSION_MAJOR) +# define COMPILER_VERSION_MAJOR DEC(__SDCC_VERSION_MAJOR) +# define COMPILER_VERSION_MINOR DEC(__SDCC_VERSION_MINOR) +# define COMPILER_VERSION_PATCH DEC(__SDCC_VERSION_PATCH) +# else + /* SDCC = VRP */ +# define COMPILER_VERSION_MAJOR DEC(SDCC/100) +# define COMPILER_VERSION_MINOR DEC(SDCC/10 % 10) +# define COMPILER_VERSION_PATCH DEC(SDCC % 10) +# endif + + +/* These compilers are either not known or too old to define an + identification macro. Try to identify the platform and guess that + it is the native compiler. */ +#elif defined(__hpux) || defined(__hpua) +# define COMPILER_ID "HP" + +#else /* unknown compiler */ +# define COMPILER_ID "" +#endif + +/* Construct the string literal in pieces to prevent the source from + getting matched. Store it in a pointer rather than an array + because some compilers will just produce instructions to fill the + array rather than assigning a pointer to a static array. */ +char const* info_compiler = "INFO" ":" "compiler[" COMPILER_ID "]"; +#ifdef SIMULATE_ID +char const* info_simulate = "INFO" ":" "simulate[" SIMULATE_ID "]"; +#endif + +#ifdef __QNXNTO__ +char const* qnxnto = "INFO" ":" "qnxnto[]"; +#endif + +#if defined(__CRAYXT_COMPUTE_LINUX_TARGET) +char const *info_cray = "INFO" ":" "compiler_wrapper[CrayPrgEnv]"; +#endif + +#define STRINGIFY_HELPER(X) #X +#define STRINGIFY(X) STRINGIFY_HELPER(X) + +/* Identify known platforms by name. */ +#if defined(__linux) || defined(__linux__) || defined(linux) +# define PLATFORM_ID "Linux" + +#elif defined(__MSYS__) +# define PLATFORM_ID "MSYS" + +#elif defined(__CYGWIN__) +# define PLATFORM_ID "Cygwin" + +#elif defined(__MINGW32__) +# define PLATFORM_ID "MinGW" + +#elif defined(__APPLE__) +# define PLATFORM_ID "Darwin" + +#elif defined(_WIN32) || defined(__WIN32__) || defined(WIN32) +# define PLATFORM_ID "Windows" + +#elif defined(__FreeBSD__) || defined(__FreeBSD) +# define PLATFORM_ID "FreeBSD" + +#elif defined(__NetBSD__) || defined(__NetBSD) +# define PLATFORM_ID "NetBSD" + +#elif defined(__OpenBSD__) || defined(__OPENBSD) +# define PLATFORM_ID "OpenBSD" + +#elif defined(__sun) || defined(sun) +# define PLATFORM_ID "SunOS" + +#elif defined(_AIX) || defined(__AIX) || defined(__AIX__) || defined(__aix) || defined(__aix__) +# define PLATFORM_ID "AIX" + +#elif defined(__hpux) || defined(__hpux__) +# define PLATFORM_ID "HP-UX" + +#elif defined(__HAIKU__) +# define PLATFORM_ID "Haiku" + +#elif defined(__BeOS) || defined(__BEOS__) || defined(_BEOS) +# define PLATFORM_ID "BeOS" + +#elif defined(__QNX__) || defined(__QNXNTO__) +# define PLATFORM_ID "QNX" + +#elif defined(__tru64) || defined(_tru64) || defined(__TRU64__) +# define PLATFORM_ID "Tru64" + +#elif defined(__riscos) || defined(__riscos__) +# define PLATFORM_ID "RISCos" + +#elif defined(__sinix) || defined(__sinix__) || defined(__SINIX__) +# define PLATFORM_ID "SINIX" + +#elif defined(__UNIX_SV__) +# define PLATFORM_ID "UNIX_SV" + +#elif defined(__bsdos__) +# define PLATFORM_ID "BSDOS" + +#elif defined(_MPRAS) || defined(MPRAS) +# define PLATFORM_ID "MP-RAS" + +#elif defined(__osf) || defined(__osf__) +# define PLATFORM_ID "OSF1" + +#elif defined(_SCO_SV) || defined(SCO_SV) || defined(sco_sv) +# define PLATFORM_ID "SCO_SV" + +#elif defined(__ultrix) || defined(__ultrix__) || defined(_ULTRIX) +# define PLATFORM_ID "ULTRIX" + +#elif defined(__XENIX__) || defined(_XENIX) || defined(XENIX) +# define PLATFORM_ID "Xenix" + +#elif defined(__WATCOMC__) +# if defined(__LINUX__) +# define PLATFORM_ID "Linux" + +# elif defined(__DOS__) +# define PLATFORM_ID "DOS" + +# elif defined(__OS2__) +# define PLATFORM_ID "OS2" + +# elif defined(__WINDOWS__) +# define PLATFORM_ID "Windows3x" + +# elif defined(__VXWORKS__) +# define PLATFORM_ID "VxWorks" + +# else /* unknown platform */ +# define PLATFORM_ID +# endif + +#elif defined(__INTEGRITY) +# if defined(INT_178B) +# define PLATFORM_ID "Integrity178" + +# else /* regular Integrity */ +# define PLATFORM_ID "Integrity" +# endif + +# elif defined(_ADI_COMPILER) +# define PLATFORM_ID "ADSP" + +#else /* unknown platform */ +# define PLATFORM_ID + +#endif + +/* For windows compilers MSVC and Intel we can determine + the architecture of the compiler being used. This is because + the compilers do not have flags that can change the architecture, + but rather depend on which compiler is being used +*/ +#if defined(_WIN32) && defined(_MSC_VER) +# if defined(_M_IA64) +# define ARCHITECTURE_ID "IA64" + +# elif defined(_M_ARM64EC) +# define ARCHITECTURE_ID "ARM64EC" + +# elif defined(_M_X64) || defined(_M_AMD64) +# define ARCHITECTURE_ID "x64" + +# elif defined(_M_IX86) +# define ARCHITECTURE_ID "X86" + +# elif defined(_M_ARM64) +# define ARCHITECTURE_ID "ARM64" + +# elif defined(_M_ARM) +# if _M_ARM == 4 +# define ARCHITECTURE_ID "ARMV4I" +# elif _M_ARM == 5 +# define ARCHITECTURE_ID "ARMV5I" +# else +# define ARCHITECTURE_ID "ARMV" STRINGIFY(_M_ARM) +# endif + +# elif defined(_M_MIPS) +# define ARCHITECTURE_ID "MIPS" + +# elif defined(_M_SH) +# define ARCHITECTURE_ID "SHx" + +# else /* unknown architecture */ +# define ARCHITECTURE_ID "" +# endif + +#elif defined(__WATCOMC__) +# if defined(_M_I86) +# define ARCHITECTURE_ID "I86" + +# elif defined(_M_IX86) +# define ARCHITECTURE_ID "X86" + +# else /* unknown architecture */ +# define ARCHITECTURE_ID "" +# endif + +#elif defined(__IAR_SYSTEMS_ICC__) || defined(__IAR_SYSTEMS_ICC) +# if defined(__ICCARM__) +# define ARCHITECTURE_ID "ARM" + +# elif defined(__ICCRX__) +# define ARCHITECTURE_ID "RX" + +# elif defined(__ICCRH850__) +# define ARCHITECTURE_ID "RH850" + +# elif defined(__ICCRL78__) +# define ARCHITECTURE_ID "RL78" + +# elif defined(__ICCRISCV__) +# define ARCHITECTURE_ID "RISCV" + +# elif defined(__ICCAVR__) +# define ARCHITECTURE_ID "AVR" + +# elif defined(__ICC430__) +# define ARCHITECTURE_ID "MSP430" + +# elif defined(__ICCV850__) +# define ARCHITECTURE_ID "V850" + +# elif defined(__ICC8051__) +# define ARCHITECTURE_ID "8051" + +# elif defined(__ICCSTM8__) +# define ARCHITECTURE_ID "STM8" + +# else /* unknown architecture */ +# define ARCHITECTURE_ID "" +# endif + +#elif defined(__ghs__) +# if defined(__PPC64__) +# define ARCHITECTURE_ID "PPC64" + +# elif defined(__ppc__) +# define ARCHITECTURE_ID "PPC" + +# elif defined(__ARM__) +# define ARCHITECTURE_ID "ARM" + +# elif defined(__x86_64__) +# define ARCHITECTURE_ID "x64" + +# elif defined(__i386__) +# define ARCHITECTURE_ID "X86" + +# else /* unknown architecture */ +# define ARCHITECTURE_ID "" +# endif + +#elif defined(__clang__) && defined(__ti__) +# if defined(__ARM_ARCH) +# define ARCHITECTURE_ID "Arm" + +# else /* unknown architecture */ +# define ARCHITECTURE_ID "" +# endif + +#elif defined(__TI_COMPILER_VERSION__) +# if defined(__TI_ARM__) +# define ARCHITECTURE_ID "ARM" + +# elif defined(__MSP430__) +# define ARCHITECTURE_ID "MSP430" + +# elif defined(__TMS320C28XX__) +# define ARCHITECTURE_ID "TMS320C28x" + +# elif defined(__TMS320C6X__) || defined(_TMS320C6X) +# define ARCHITECTURE_ID "TMS320C6x" + +# else /* unknown architecture */ +# define ARCHITECTURE_ID "" +# endif + +# elif defined(__ADSPSHARC__) +# define ARCHITECTURE_ID "SHARC" + +# elif defined(__ADSPBLACKFIN__) +# define ARCHITECTURE_ID "Blackfin" + +#elif defined(__TASKING__) + +# if defined(__CTC__) || defined(__CPTC__) +# define ARCHITECTURE_ID "TriCore" + +# elif defined(__CMCS__) +# define ARCHITECTURE_ID "MCS" + +# elif defined(__CARM__) +# define ARCHITECTURE_ID "ARM" + +# elif defined(__CARC__) +# define ARCHITECTURE_ID "ARC" + +# elif defined(__C51__) +# define ARCHITECTURE_ID "8051" + +# elif defined(__CPCP__) +# define ARCHITECTURE_ID "PCP" + +# else +# define ARCHITECTURE_ID "" +# endif + +#else +# define ARCHITECTURE_ID +#endif + +/* Convert integer to decimal digit literals. */ +#define DEC(n) \ + ('0' + (((n) / 10000000)%10)), \ + ('0' + (((n) / 1000000)%10)), \ + ('0' + (((n) / 100000)%10)), \ + ('0' + (((n) / 10000)%10)), \ + ('0' + (((n) / 1000)%10)), \ + ('0' + (((n) / 100)%10)), \ + ('0' + (((n) / 10)%10)), \ + ('0' + ((n) % 10)) + +/* Convert integer to hex digit literals. */ +#define HEX(n) \ + ('0' + ((n)>>28 & 0xF)), \ + ('0' + ((n)>>24 & 0xF)), \ + ('0' + ((n)>>20 & 0xF)), \ + ('0' + ((n)>>16 & 0xF)), \ + ('0' + ((n)>>12 & 0xF)), \ + ('0' + ((n)>>8 & 0xF)), \ + ('0' + ((n)>>4 & 0xF)), \ + ('0' + ((n) & 0xF)) + +/* Construct a string literal encoding the version number. */ +#ifdef COMPILER_VERSION +char const* info_version = "INFO" ":" "compiler_version[" COMPILER_VERSION "]"; + +/* Construct a string literal encoding the version number components. */ +#elif defined(COMPILER_VERSION_MAJOR) +char const info_version[] = { + 'I', 'N', 'F', 'O', ':', + 'c','o','m','p','i','l','e','r','_','v','e','r','s','i','o','n','[', + COMPILER_VERSION_MAJOR, +# ifdef COMPILER_VERSION_MINOR + '.', COMPILER_VERSION_MINOR, +# ifdef COMPILER_VERSION_PATCH + '.', COMPILER_VERSION_PATCH, +# ifdef COMPILER_VERSION_TWEAK + '.', COMPILER_VERSION_TWEAK, +# endif +# endif +# endif + ']','\0'}; +#endif + +/* Construct a string literal encoding the internal version number. */ +#ifdef COMPILER_VERSION_INTERNAL +char const info_version_internal[] = { + 'I', 'N', 'F', 'O', ':', + 'c','o','m','p','i','l','e','r','_','v','e','r','s','i','o','n','_', + 'i','n','t','e','r','n','a','l','[', + COMPILER_VERSION_INTERNAL,']','\0'}; +#elif defined(COMPILER_VERSION_INTERNAL_STR) +char const* info_version_internal = "INFO" ":" "compiler_version_internal[" COMPILER_VERSION_INTERNAL_STR "]"; +#endif + +/* Construct a string literal encoding the version number components. */ +#ifdef SIMULATE_VERSION_MAJOR +char const info_simulate_version[] = { + 'I', 'N', 'F', 'O', ':', + 's','i','m','u','l','a','t','e','_','v','e','r','s','i','o','n','[', + SIMULATE_VERSION_MAJOR, +# ifdef SIMULATE_VERSION_MINOR + '.', SIMULATE_VERSION_MINOR, +# ifdef SIMULATE_VERSION_PATCH + '.', SIMULATE_VERSION_PATCH, +# ifdef SIMULATE_VERSION_TWEAK + '.', SIMULATE_VERSION_TWEAK, +# endif +# endif +# endif + ']','\0'}; +#endif + +/* Construct the string literal in pieces to prevent the source from + getting matched. Store it in a pointer rather than an array + because some compilers will just produce instructions to fill the + array rather than assigning a pointer to a static array. */ +char const* info_platform = "INFO" ":" "platform[" PLATFORM_ID "]"; +char const* info_arch = "INFO" ":" "arch[" ARCHITECTURE_ID "]"; + + + +#define C_STD_99 199901L +#define C_STD_11 201112L +#define C_STD_17 201710L +#define C_STD_23 202311L + +#ifdef __STDC_VERSION__ +# define C_STD __STDC_VERSION__ +#endif + +#if !defined(__STDC__) && !defined(__clang__) +# if defined(_MSC_VER) || defined(__ibmxl__) || defined(__IBMC__) +# define C_VERSION "90" +# else +# define C_VERSION +# endif +#elif C_STD > C_STD_17 +# define C_VERSION "23" +#elif C_STD > C_STD_11 +# define C_VERSION "17" +#elif C_STD > C_STD_99 +# define C_VERSION "11" +#elif C_STD >= C_STD_99 +# define C_VERSION "99" +#else +# define C_VERSION "90" +#endif +const char* info_language_standard_default = + "INFO" ":" "standard_default[" C_VERSION "]"; + +const char* info_language_extensions_default = "INFO" ":" "extensions_default[" +#if (defined(__clang__) || defined(__GNUC__) || defined(__xlC__) || \ + defined(__TI_COMPILER_VERSION__)) && \ + !defined(__STRICT_ANSI__) + "ON" +#else + "OFF" +#endif +"]"; + +/*--------------------------------------------------------------------------*/ + +#ifdef ID_VOID_MAIN +void main() {} +#else +# if defined(__CLASSIC_C__) +int main(argc, argv) int argc; char *argv[]; +# else +int main(int argc, char* argv[]) +# endif +{ + int require = 0; + require += info_compiler[argc]; + require += info_platform[argc]; + require += info_arch[argc]; +#ifdef COMPILER_VERSION_MAJOR + require += info_version[argc]; +#endif +#ifdef COMPILER_VERSION_INTERNAL + require += info_version_internal[argc]; +#endif +#ifdef SIMULATE_ID + require += info_simulate[argc]; +#endif +#ifdef SIMULATE_VERSION_MAJOR + require += info_simulate_version[argc]; +#endif +#if defined(__CRAYXT_COMPUTE_LINUX_TARGET) + require += info_cray[argc]; +#endif + require += info_language_standard_default[argc]; + require += info_language_extensions_default[argc]; + (void)argv; + return require; +} +#endif diff --git a/siro_rider/android/app/.cxx/RelWithDebInfo/6t1m4b5v/x86/CMakeFiles/3.31.5-g6cf5163/CompilerIdC/CMakeCCompilerId.o b/siro_rider/android/app/.cxx/RelWithDebInfo/6t1m4b5v/x86/CMakeFiles/3.31.5-g6cf5163/CompilerIdC/CMakeCCompilerId.o new file mode 100644 index 0000000..a37e7bf Binary files /dev/null and b/siro_rider/android/app/.cxx/RelWithDebInfo/6t1m4b5v/x86/CMakeFiles/3.31.5-g6cf5163/CompilerIdC/CMakeCCompilerId.o differ diff --git a/siro_rider/android/app/.cxx/RelWithDebInfo/6t1m4b5v/x86/CMakeFiles/3.31.5-g6cf5163/CompilerIdCXX/CMakeCXXCompilerId.cpp b/siro_rider/android/app/.cxx/RelWithDebInfo/6t1m4b5v/x86/CMakeFiles/3.31.5-g6cf5163/CompilerIdCXX/CMakeCXXCompilerId.cpp new file mode 100644 index 0000000..da6c824 --- /dev/null +++ b/siro_rider/android/app/.cxx/RelWithDebInfo/6t1m4b5v/x86/CMakeFiles/3.31.5-g6cf5163/CompilerIdCXX/CMakeCXXCompilerId.cpp @@ -0,0 +1,919 @@ +/* This source file must have a .cpp extension so that all C++ compilers + recognize the extension without flags. Borland does not know .cxx for + example. */ +#ifndef __cplusplus +# error "A C compiler has been selected for C++." +#endif + +#if !defined(__has_include) +/* If the compiler does not have __has_include, pretend the answer is + always no. */ +# define __has_include(x) 0 +#endif + + +/* Version number components: V=Version, R=Revision, P=Patch + Version date components: YYYY=Year, MM=Month, DD=Day */ + +#if defined(__INTEL_COMPILER) || defined(__ICC) +# define COMPILER_ID "Intel" +# if defined(_MSC_VER) +# define SIMULATE_ID "MSVC" +# endif +# if defined(__GNUC__) +# define SIMULATE_ID "GNU" +# endif + /* __INTEL_COMPILER = VRP prior to 2021, and then VVVV for 2021 and later, + except that a few beta releases use the old format with V=2021. */ +# if __INTEL_COMPILER < 2021 || __INTEL_COMPILER == 202110 || __INTEL_COMPILER == 202111 +# define COMPILER_VERSION_MAJOR DEC(__INTEL_COMPILER/100) +# define COMPILER_VERSION_MINOR DEC(__INTEL_COMPILER/10 % 10) +# if defined(__INTEL_COMPILER_UPDATE) +# define COMPILER_VERSION_PATCH DEC(__INTEL_COMPILER_UPDATE) +# else +# define COMPILER_VERSION_PATCH DEC(__INTEL_COMPILER % 10) +# endif +# else +# define COMPILER_VERSION_MAJOR DEC(__INTEL_COMPILER) +# define COMPILER_VERSION_MINOR DEC(__INTEL_COMPILER_UPDATE) + /* The third version component from --version is an update index, + but no macro is provided for it. */ +# define COMPILER_VERSION_PATCH DEC(0) +# endif +# if defined(__INTEL_COMPILER_BUILD_DATE) + /* __INTEL_COMPILER_BUILD_DATE = YYYYMMDD */ +# define COMPILER_VERSION_TWEAK DEC(__INTEL_COMPILER_BUILD_DATE) +# endif +# if defined(_MSC_VER) + /* _MSC_VER = VVRR */ +# define SIMULATE_VERSION_MAJOR DEC(_MSC_VER / 100) +# define SIMULATE_VERSION_MINOR DEC(_MSC_VER % 100) +# endif +# if defined(__GNUC__) +# define SIMULATE_VERSION_MAJOR DEC(__GNUC__) +# elif defined(__GNUG__) +# define SIMULATE_VERSION_MAJOR DEC(__GNUG__) +# endif +# if defined(__GNUC_MINOR__) +# define SIMULATE_VERSION_MINOR DEC(__GNUC_MINOR__) +# endif +# if defined(__GNUC_PATCHLEVEL__) +# define SIMULATE_VERSION_PATCH DEC(__GNUC_PATCHLEVEL__) +# endif + +#elif (defined(__clang__) && defined(__INTEL_CLANG_COMPILER)) || defined(__INTEL_LLVM_COMPILER) +# define COMPILER_ID "IntelLLVM" +#if defined(_MSC_VER) +# define SIMULATE_ID "MSVC" +#endif +#if defined(__GNUC__) +# define SIMULATE_ID "GNU" +#endif +/* __INTEL_LLVM_COMPILER = VVVVRP prior to 2021.2.0, VVVVRRPP for 2021.2.0 and + * later. Look for 6 digit vs. 8 digit version number to decide encoding. + * VVVV is no smaller than the current year when a version is released. + */ +#if __INTEL_LLVM_COMPILER < 1000000L +# define COMPILER_VERSION_MAJOR DEC(__INTEL_LLVM_COMPILER/100) +# define COMPILER_VERSION_MINOR DEC(__INTEL_LLVM_COMPILER/10 % 10) +# define COMPILER_VERSION_PATCH DEC(__INTEL_LLVM_COMPILER % 10) +#else +# define COMPILER_VERSION_MAJOR DEC(__INTEL_LLVM_COMPILER/10000) +# define COMPILER_VERSION_MINOR DEC(__INTEL_LLVM_COMPILER/100 % 100) +# define COMPILER_VERSION_PATCH DEC(__INTEL_LLVM_COMPILER % 100) +#endif +#if defined(_MSC_VER) + /* _MSC_VER = VVRR */ +# define SIMULATE_VERSION_MAJOR DEC(_MSC_VER / 100) +# define SIMULATE_VERSION_MINOR DEC(_MSC_VER % 100) +#endif +#if defined(__GNUC__) +# define SIMULATE_VERSION_MAJOR DEC(__GNUC__) +#elif defined(__GNUG__) +# define SIMULATE_VERSION_MAJOR DEC(__GNUG__) +#endif +#if defined(__GNUC_MINOR__) +# define SIMULATE_VERSION_MINOR DEC(__GNUC_MINOR__) +#endif +#if defined(__GNUC_PATCHLEVEL__) +# define SIMULATE_VERSION_PATCH DEC(__GNUC_PATCHLEVEL__) +#endif + +#elif defined(__PATHCC__) +# define COMPILER_ID "PathScale" +# define COMPILER_VERSION_MAJOR DEC(__PATHCC__) +# define COMPILER_VERSION_MINOR DEC(__PATHCC_MINOR__) +# if defined(__PATHCC_PATCHLEVEL__) +# define COMPILER_VERSION_PATCH DEC(__PATHCC_PATCHLEVEL__) +# endif + +#elif defined(__BORLANDC__) && defined(__CODEGEARC_VERSION__) +# define COMPILER_ID "Embarcadero" +# define COMPILER_VERSION_MAJOR HEX(__CODEGEARC_VERSION__>>24 & 0x00FF) +# define COMPILER_VERSION_MINOR HEX(__CODEGEARC_VERSION__>>16 & 0x00FF) +# define COMPILER_VERSION_PATCH DEC(__CODEGEARC_VERSION__ & 0xFFFF) + +#elif defined(__BORLANDC__) +# define COMPILER_ID "Borland" + /* __BORLANDC__ = 0xVRR */ +# define COMPILER_VERSION_MAJOR HEX(__BORLANDC__>>8) +# define COMPILER_VERSION_MINOR HEX(__BORLANDC__ & 0xFF) + +#elif defined(__WATCOMC__) && __WATCOMC__ < 1200 +# define COMPILER_ID "Watcom" + /* __WATCOMC__ = VVRR */ +# define COMPILER_VERSION_MAJOR DEC(__WATCOMC__ / 100) +# define COMPILER_VERSION_MINOR DEC((__WATCOMC__ / 10) % 10) +# if (__WATCOMC__ % 10) > 0 +# define COMPILER_VERSION_PATCH DEC(__WATCOMC__ % 10) +# endif + +#elif defined(__WATCOMC__) +# define COMPILER_ID "OpenWatcom" + /* __WATCOMC__ = VVRP + 1100 */ +# define COMPILER_VERSION_MAJOR DEC((__WATCOMC__ - 1100) / 100) +# define COMPILER_VERSION_MINOR DEC((__WATCOMC__ / 10) % 10) +# if (__WATCOMC__ % 10) > 0 +# define COMPILER_VERSION_PATCH DEC(__WATCOMC__ % 10) +# endif + +#elif defined(__SUNPRO_CC) +# define COMPILER_ID "SunPro" +# if __SUNPRO_CC >= 0x5100 + /* __SUNPRO_CC = 0xVRRP */ +# define COMPILER_VERSION_MAJOR HEX(__SUNPRO_CC>>12) +# define COMPILER_VERSION_MINOR HEX(__SUNPRO_CC>>4 & 0xFF) +# define COMPILER_VERSION_PATCH HEX(__SUNPRO_CC & 0xF) +# else + /* __SUNPRO_CC = 0xVRP */ +# define COMPILER_VERSION_MAJOR HEX(__SUNPRO_CC>>8) +# define COMPILER_VERSION_MINOR HEX(__SUNPRO_CC>>4 & 0xF) +# define COMPILER_VERSION_PATCH HEX(__SUNPRO_CC & 0xF) +# endif + +#elif defined(__HP_aCC) +# define COMPILER_ID "HP" + /* __HP_aCC = VVRRPP */ +# define COMPILER_VERSION_MAJOR DEC(__HP_aCC/10000) +# define COMPILER_VERSION_MINOR DEC(__HP_aCC/100 % 100) +# define COMPILER_VERSION_PATCH DEC(__HP_aCC % 100) + +#elif defined(__DECCXX) +# define COMPILER_ID "Compaq" + /* __DECCXX_VER = VVRRTPPPP */ +# define COMPILER_VERSION_MAJOR DEC(__DECCXX_VER/10000000) +# define COMPILER_VERSION_MINOR DEC(__DECCXX_VER/100000 % 100) +# define COMPILER_VERSION_PATCH DEC(__DECCXX_VER % 10000) + +#elif defined(__IBMCPP__) && defined(__COMPILER_VER__) +# define COMPILER_ID "zOS" + /* __IBMCPP__ = VRP */ +# define COMPILER_VERSION_MAJOR DEC(__IBMCPP__/100) +# define COMPILER_VERSION_MINOR DEC(__IBMCPP__/10 % 10) +# define COMPILER_VERSION_PATCH DEC(__IBMCPP__ % 10) + +#elif defined(__open_xl__) && defined(__clang__) +# define COMPILER_ID "IBMClang" +# define COMPILER_VERSION_MAJOR DEC(__open_xl_version__) +# define COMPILER_VERSION_MINOR DEC(__open_xl_release__) +# define COMPILER_VERSION_PATCH DEC(__open_xl_modification__) +# define COMPILER_VERSION_TWEAK DEC(__open_xl_ptf_fix_level__) + + +#elif defined(__ibmxl__) && defined(__clang__) +# define COMPILER_ID "XLClang" +# define COMPILER_VERSION_MAJOR DEC(__ibmxl_version__) +# define COMPILER_VERSION_MINOR DEC(__ibmxl_release__) +# define COMPILER_VERSION_PATCH DEC(__ibmxl_modification__) +# define COMPILER_VERSION_TWEAK DEC(__ibmxl_ptf_fix_level__) + + +#elif defined(__IBMCPP__) && !defined(__COMPILER_VER__) && __IBMCPP__ >= 800 +# define COMPILER_ID "XL" + /* __IBMCPP__ = VRP */ +# define COMPILER_VERSION_MAJOR DEC(__IBMCPP__/100) +# define COMPILER_VERSION_MINOR DEC(__IBMCPP__/10 % 10) +# define COMPILER_VERSION_PATCH DEC(__IBMCPP__ % 10) + +#elif defined(__IBMCPP__) && !defined(__COMPILER_VER__) && __IBMCPP__ < 800 +# define COMPILER_ID "VisualAge" + /* __IBMCPP__ = VRP */ +# define COMPILER_VERSION_MAJOR DEC(__IBMCPP__/100) +# define COMPILER_VERSION_MINOR DEC(__IBMCPP__/10 % 10) +# define COMPILER_VERSION_PATCH DEC(__IBMCPP__ % 10) + +#elif defined(__NVCOMPILER) +# define COMPILER_ID "NVHPC" +# define COMPILER_VERSION_MAJOR DEC(__NVCOMPILER_MAJOR__) +# define COMPILER_VERSION_MINOR DEC(__NVCOMPILER_MINOR__) +# if defined(__NVCOMPILER_PATCHLEVEL__) +# define COMPILER_VERSION_PATCH DEC(__NVCOMPILER_PATCHLEVEL__) +# endif + +#elif defined(__PGI) +# define COMPILER_ID "PGI" +# define COMPILER_VERSION_MAJOR DEC(__PGIC__) +# define COMPILER_VERSION_MINOR DEC(__PGIC_MINOR__) +# if defined(__PGIC_PATCHLEVEL__) +# define COMPILER_VERSION_PATCH DEC(__PGIC_PATCHLEVEL__) +# endif + +#elif defined(__clang__) && defined(__cray__) +# define COMPILER_ID "CrayClang" +# define COMPILER_VERSION_MAJOR DEC(__cray_major__) +# define COMPILER_VERSION_MINOR DEC(__cray_minor__) +# define COMPILER_VERSION_PATCH DEC(__cray_patchlevel__) +# define COMPILER_VERSION_INTERNAL_STR __clang_version__ + + +#elif defined(_CRAYC) +# define COMPILER_ID "Cray" +# define COMPILER_VERSION_MAJOR DEC(_RELEASE_MAJOR) +# define COMPILER_VERSION_MINOR DEC(_RELEASE_MINOR) + +#elif defined(__TI_COMPILER_VERSION__) +# define COMPILER_ID "TI" + /* __TI_COMPILER_VERSION__ = VVVRRRPPP */ +# define COMPILER_VERSION_MAJOR DEC(__TI_COMPILER_VERSION__/1000000) +# define COMPILER_VERSION_MINOR DEC(__TI_COMPILER_VERSION__/1000 % 1000) +# define COMPILER_VERSION_PATCH DEC(__TI_COMPILER_VERSION__ % 1000) + +#elif defined(__CLANG_FUJITSU) +# define COMPILER_ID "FujitsuClang" +# define COMPILER_VERSION_MAJOR DEC(__FCC_major__) +# define COMPILER_VERSION_MINOR DEC(__FCC_minor__) +# define COMPILER_VERSION_PATCH DEC(__FCC_patchlevel__) +# define COMPILER_VERSION_INTERNAL_STR __clang_version__ + + +#elif defined(__FUJITSU) +# define COMPILER_ID "Fujitsu" +# if defined(__FCC_version__) +# define COMPILER_VERSION __FCC_version__ +# elif defined(__FCC_major__) +# define COMPILER_VERSION_MAJOR DEC(__FCC_major__) +# define COMPILER_VERSION_MINOR DEC(__FCC_minor__) +# define COMPILER_VERSION_PATCH DEC(__FCC_patchlevel__) +# endif +# if defined(__fcc_version) +# define COMPILER_VERSION_INTERNAL DEC(__fcc_version) +# elif defined(__FCC_VERSION) +# define COMPILER_VERSION_INTERNAL DEC(__FCC_VERSION) +# endif + + +#elif defined(__ghs__) +# define COMPILER_ID "GHS" +/* __GHS_VERSION_NUMBER = VVVVRP */ +# ifdef __GHS_VERSION_NUMBER +# define COMPILER_VERSION_MAJOR DEC(__GHS_VERSION_NUMBER / 100) +# define COMPILER_VERSION_MINOR DEC(__GHS_VERSION_NUMBER / 10 % 10) +# define COMPILER_VERSION_PATCH DEC(__GHS_VERSION_NUMBER % 10) +# endif + +#elif defined(__TASKING__) +# define COMPILER_ID "Tasking" + # define COMPILER_VERSION_MAJOR DEC(__VERSION__/1000) + # define COMPILER_VERSION_MINOR DEC(__VERSION__ % 100) +# define COMPILER_VERSION_INTERNAL DEC(__VERSION__) + +#elif defined(__ORANGEC__) +# define COMPILER_ID "OrangeC" +# define COMPILER_VERSION_MAJOR DEC(__ORANGEC_MAJOR__) +# define COMPILER_VERSION_MINOR DEC(__ORANGEC_MINOR__) +# define COMPILER_VERSION_PATCH DEC(__ORANGEC_PATCHLEVEL__) + +#elif defined(__SCO_VERSION__) +# define COMPILER_ID "SCO" + +#elif defined(__ARMCC_VERSION) && !defined(__clang__) +# define COMPILER_ID "ARMCC" +#if __ARMCC_VERSION >= 1000000 + /* __ARMCC_VERSION = VRRPPPP */ + # define COMPILER_VERSION_MAJOR DEC(__ARMCC_VERSION/1000000) + # define COMPILER_VERSION_MINOR DEC(__ARMCC_VERSION/10000 % 100) + # define COMPILER_VERSION_PATCH DEC(__ARMCC_VERSION % 10000) +#else + /* __ARMCC_VERSION = VRPPPP */ + # define COMPILER_VERSION_MAJOR DEC(__ARMCC_VERSION/100000) + # define COMPILER_VERSION_MINOR DEC(__ARMCC_VERSION/10000 % 10) + # define COMPILER_VERSION_PATCH DEC(__ARMCC_VERSION % 10000) +#endif + + +#elif defined(__clang__) && defined(__apple_build_version__) +# define COMPILER_ID "AppleClang" +# if defined(_MSC_VER) +# define SIMULATE_ID "MSVC" +# endif +# define COMPILER_VERSION_MAJOR DEC(__clang_major__) +# define COMPILER_VERSION_MINOR DEC(__clang_minor__) +# define COMPILER_VERSION_PATCH DEC(__clang_patchlevel__) +# if defined(_MSC_VER) + /* _MSC_VER = VVRR */ +# define SIMULATE_VERSION_MAJOR DEC(_MSC_VER / 100) +# define SIMULATE_VERSION_MINOR DEC(_MSC_VER % 100) +# endif +# define COMPILER_VERSION_TWEAK DEC(__apple_build_version__) + +#elif defined(__clang__) && defined(__ARMCOMPILER_VERSION) +# define COMPILER_ID "ARMClang" + # define COMPILER_VERSION_MAJOR DEC(__ARMCOMPILER_VERSION/1000000) + # define COMPILER_VERSION_MINOR DEC(__ARMCOMPILER_VERSION/10000 % 100) + # define COMPILER_VERSION_PATCH DEC(__ARMCOMPILER_VERSION/100 % 100) +# define COMPILER_VERSION_INTERNAL DEC(__ARMCOMPILER_VERSION) + +#elif defined(__clang__) && defined(__ti__) +# define COMPILER_ID "TIClang" + # define COMPILER_VERSION_MAJOR DEC(__ti_major__) + # define COMPILER_VERSION_MINOR DEC(__ti_minor__) + # define COMPILER_VERSION_PATCH DEC(__ti_patchlevel__) +# define COMPILER_VERSION_INTERNAL DEC(__ti_version__) + +#elif defined(__clang__) +# define COMPILER_ID "Clang" +# if defined(_MSC_VER) +# define SIMULATE_ID "MSVC" +# endif +# define COMPILER_VERSION_MAJOR DEC(__clang_major__) +# define COMPILER_VERSION_MINOR DEC(__clang_minor__) +# define COMPILER_VERSION_PATCH DEC(__clang_patchlevel__) +# if defined(_MSC_VER) + /* _MSC_VER = VVRR */ +# define SIMULATE_VERSION_MAJOR DEC(_MSC_VER / 100) +# define SIMULATE_VERSION_MINOR DEC(_MSC_VER % 100) +# endif + +#elif defined(__LCC__) && (defined(__GNUC__) || defined(__GNUG__) || defined(__MCST__)) +# define COMPILER_ID "LCC" +# define COMPILER_VERSION_MAJOR DEC(__LCC__ / 100) +# define COMPILER_VERSION_MINOR DEC(__LCC__ % 100) +# if defined(__LCC_MINOR__) +# define COMPILER_VERSION_PATCH DEC(__LCC_MINOR__) +# endif +# if defined(__GNUC__) && defined(__GNUC_MINOR__) +# define SIMULATE_ID "GNU" +# define SIMULATE_VERSION_MAJOR DEC(__GNUC__) +# define SIMULATE_VERSION_MINOR DEC(__GNUC_MINOR__) +# if defined(__GNUC_PATCHLEVEL__) +# define SIMULATE_VERSION_PATCH DEC(__GNUC_PATCHLEVEL__) +# endif +# endif + +#elif defined(__GNUC__) || defined(__GNUG__) +# define COMPILER_ID "GNU" +# if defined(__GNUC__) +# define COMPILER_VERSION_MAJOR DEC(__GNUC__) +# else +# define COMPILER_VERSION_MAJOR DEC(__GNUG__) +# endif +# if defined(__GNUC_MINOR__) +# define COMPILER_VERSION_MINOR DEC(__GNUC_MINOR__) +# endif +# if defined(__GNUC_PATCHLEVEL__) +# define COMPILER_VERSION_PATCH DEC(__GNUC_PATCHLEVEL__) +# endif + +#elif defined(_MSC_VER) +# define COMPILER_ID "MSVC" + /* _MSC_VER = VVRR */ +# define COMPILER_VERSION_MAJOR DEC(_MSC_VER / 100) +# define COMPILER_VERSION_MINOR DEC(_MSC_VER % 100) +# if defined(_MSC_FULL_VER) +# if _MSC_VER >= 1400 + /* _MSC_FULL_VER = VVRRPPPPP */ +# define COMPILER_VERSION_PATCH DEC(_MSC_FULL_VER % 100000) +# else + /* _MSC_FULL_VER = VVRRPPPP */ +# define COMPILER_VERSION_PATCH DEC(_MSC_FULL_VER % 10000) +# endif +# endif +# if defined(_MSC_BUILD) +# define COMPILER_VERSION_TWEAK DEC(_MSC_BUILD) +# endif + +#elif defined(_ADI_COMPILER) +# define COMPILER_ID "ADSP" +#if defined(__VERSIONNUM__) + /* __VERSIONNUM__ = 0xVVRRPPTT */ +# define COMPILER_VERSION_MAJOR DEC(__VERSIONNUM__ >> 24 & 0xFF) +# define COMPILER_VERSION_MINOR DEC(__VERSIONNUM__ >> 16 & 0xFF) +# define COMPILER_VERSION_PATCH DEC(__VERSIONNUM__ >> 8 & 0xFF) +# define COMPILER_VERSION_TWEAK DEC(__VERSIONNUM__ & 0xFF) +#endif + +#elif defined(__IAR_SYSTEMS_ICC__) || defined(__IAR_SYSTEMS_ICC) +# define COMPILER_ID "IAR" +# if defined(__VER__) && defined(__ICCARM__) +# define COMPILER_VERSION_MAJOR DEC((__VER__) / 1000000) +# define COMPILER_VERSION_MINOR DEC(((__VER__) / 1000) % 1000) +# define COMPILER_VERSION_PATCH DEC((__VER__) % 1000) +# define COMPILER_VERSION_INTERNAL DEC(__IAR_SYSTEMS_ICC__) +# elif defined(__VER__) && (defined(__ICCAVR__) || defined(__ICCRX__) || defined(__ICCRH850__) || defined(__ICCRL78__) || defined(__ICC430__) || defined(__ICCRISCV__) || defined(__ICCV850__) || defined(__ICC8051__) || defined(__ICCSTM8__)) +# define COMPILER_VERSION_MAJOR DEC((__VER__) / 100) +# define COMPILER_VERSION_MINOR DEC((__VER__) - (((__VER__) / 100)*100)) +# define COMPILER_VERSION_PATCH DEC(__SUBVERSION__) +# define COMPILER_VERSION_INTERNAL DEC(__IAR_SYSTEMS_ICC__) +# endif + + +/* These compilers are either not known or too old to define an + identification macro. Try to identify the platform and guess that + it is the native compiler. */ +#elif defined(__hpux) || defined(__hpua) +# define COMPILER_ID "HP" + +#else /* unknown compiler */ +# define COMPILER_ID "" +#endif + +/* Construct the string literal in pieces to prevent the source from + getting matched. Store it in a pointer rather than an array + because some compilers will just produce instructions to fill the + array rather than assigning a pointer to a static array. */ +char const* info_compiler = "INFO" ":" "compiler[" COMPILER_ID "]"; +#ifdef SIMULATE_ID +char const* info_simulate = "INFO" ":" "simulate[" SIMULATE_ID "]"; +#endif + +#ifdef __QNXNTO__ +char const* qnxnto = "INFO" ":" "qnxnto[]"; +#endif + +#if defined(__CRAYXT_COMPUTE_LINUX_TARGET) +char const *info_cray = "INFO" ":" "compiler_wrapper[CrayPrgEnv]"; +#endif + +#define STRINGIFY_HELPER(X) #X +#define STRINGIFY(X) STRINGIFY_HELPER(X) + +/* Identify known platforms by name. */ +#if defined(__linux) || defined(__linux__) || defined(linux) +# define PLATFORM_ID "Linux" + +#elif defined(__MSYS__) +# define PLATFORM_ID "MSYS" + +#elif defined(__CYGWIN__) +# define PLATFORM_ID "Cygwin" + +#elif defined(__MINGW32__) +# define PLATFORM_ID "MinGW" + +#elif defined(__APPLE__) +# define PLATFORM_ID "Darwin" + +#elif defined(_WIN32) || defined(__WIN32__) || defined(WIN32) +# define PLATFORM_ID "Windows" + +#elif defined(__FreeBSD__) || defined(__FreeBSD) +# define PLATFORM_ID "FreeBSD" + +#elif defined(__NetBSD__) || defined(__NetBSD) +# define PLATFORM_ID "NetBSD" + +#elif defined(__OpenBSD__) || defined(__OPENBSD) +# define PLATFORM_ID "OpenBSD" + +#elif defined(__sun) || defined(sun) +# define PLATFORM_ID "SunOS" + +#elif defined(_AIX) || defined(__AIX) || defined(__AIX__) || defined(__aix) || defined(__aix__) +# define PLATFORM_ID "AIX" + +#elif defined(__hpux) || defined(__hpux__) +# define PLATFORM_ID "HP-UX" + +#elif defined(__HAIKU__) +# define PLATFORM_ID "Haiku" + +#elif defined(__BeOS) || defined(__BEOS__) || defined(_BEOS) +# define PLATFORM_ID "BeOS" + +#elif defined(__QNX__) || defined(__QNXNTO__) +# define PLATFORM_ID "QNX" + +#elif defined(__tru64) || defined(_tru64) || defined(__TRU64__) +# define PLATFORM_ID "Tru64" + +#elif defined(__riscos) || defined(__riscos__) +# define PLATFORM_ID "RISCos" + +#elif defined(__sinix) || defined(__sinix__) || defined(__SINIX__) +# define PLATFORM_ID "SINIX" + +#elif defined(__UNIX_SV__) +# define PLATFORM_ID "UNIX_SV" + +#elif defined(__bsdos__) +# define PLATFORM_ID "BSDOS" + +#elif defined(_MPRAS) || defined(MPRAS) +# define PLATFORM_ID "MP-RAS" + +#elif defined(__osf) || defined(__osf__) +# define PLATFORM_ID "OSF1" + +#elif defined(_SCO_SV) || defined(SCO_SV) || defined(sco_sv) +# define PLATFORM_ID "SCO_SV" + +#elif defined(__ultrix) || defined(__ultrix__) || defined(_ULTRIX) +# define PLATFORM_ID "ULTRIX" + +#elif defined(__XENIX__) || defined(_XENIX) || defined(XENIX) +# define PLATFORM_ID "Xenix" + +#elif defined(__WATCOMC__) +# if defined(__LINUX__) +# define PLATFORM_ID "Linux" + +# elif defined(__DOS__) +# define PLATFORM_ID "DOS" + +# elif defined(__OS2__) +# define PLATFORM_ID "OS2" + +# elif defined(__WINDOWS__) +# define PLATFORM_ID "Windows3x" + +# elif defined(__VXWORKS__) +# define PLATFORM_ID "VxWorks" + +# else /* unknown platform */ +# define PLATFORM_ID +# endif + +#elif defined(__INTEGRITY) +# if defined(INT_178B) +# define PLATFORM_ID "Integrity178" + +# else /* regular Integrity */ +# define PLATFORM_ID "Integrity" +# endif + +# elif defined(_ADI_COMPILER) +# define PLATFORM_ID "ADSP" + +#else /* unknown platform */ +# define PLATFORM_ID + +#endif + +/* For windows compilers MSVC and Intel we can determine + the architecture of the compiler being used. This is because + the compilers do not have flags that can change the architecture, + but rather depend on which compiler is being used +*/ +#if defined(_WIN32) && defined(_MSC_VER) +# if defined(_M_IA64) +# define ARCHITECTURE_ID "IA64" + +# elif defined(_M_ARM64EC) +# define ARCHITECTURE_ID "ARM64EC" + +# elif defined(_M_X64) || defined(_M_AMD64) +# define ARCHITECTURE_ID "x64" + +# elif defined(_M_IX86) +# define ARCHITECTURE_ID "X86" + +# elif defined(_M_ARM64) +# define ARCHITECTURE_ID "ARM64" + +# elif defined(_M_ARM) +# if _M_ARM == 4 +# define ARCHITECTURE_ID "ARMV4I" +# elif _M_ARM == 5 +# define ARCHITECTURE_ID "ARMV5I" +# else +# define ARCHITECTURE_ID "ARMV" STRINGIFY(_M_ARM) +# endif + +# elif defined(_M_MIPS) +# define ARCHITECTURE_ID "MIPS" + +# elif defined(_M_SH) +# define ARCHITECTURE_ID "SHx" + +# else /* unknown architecture */ +# define ARCHITECTURE_ID "" +# endif + +#elif defined(__WATCOMC__) +# if defined(_M_I86) +# define ARCHITECTURE_ID "I86" + +# elif defined(_M_IX86) +# define ARCHITECTURE_ID "X86" + +# else /* unknown architecture */ +# define ARCHITECTURE_ID "" +# endif + +#elif defined(__IAR_SYSTEMS_ICC__) || defined(__IAR_SYSTEMS_ICC) +# if defined(__ICCARM__) +# define ARCHITECTURE_ID "ARM" + +# elif defined(__ICCRX__) +# define ARCHITECTURE_ID "RX" + +# elif defined(__ICCRH850__) +# define ARCHITECTURE_ID "RH850" + +# elif defined(__ICCRL78__) +# define ARCHITECTURE_ID "RL78" + +# elif defined(__ICCRISCV__) +# define ARCHITECTURE_ID "RISCV" + +# elif defined(__ICCAVR__) +# define ARCHITECTURE_ID "AVR" + +# elif defined(__ICC430__) +# define ARCHITECTURE_ID "MSP430" + +# elif defined(__ICCV850__) +# define ARCHITECTURE_ID "V850" + +# elif defined(__ICC8051__) +# define ARCHITECTURE_ID "8051" + +# elif defined(__ICCSTM8__) +# define ARCHITECTURE_ID "STM8" + +# else /* unknown architecture */ +# define ARCHITECTURE_ID "" +# endif + +#elif defined(__ghs__) +# if defined(__PPC64__) +# define ARCHITECTURE_ID "PPC64" + +# elif defined(__ppc__) +# define ARCHITECTURE_ID "PPC" + +# elif defined(__ARM__) +# define ARCHITECTURE_ID "ARM" + +# elif defined(__x86_64__) +# define ARCHITECTURE_ID "x64" + +# elif defined(__i386__) +# define ARCHITECTURE_ID "X86" + +# else /* unknown architecture */ +# define ARCHITECTURE_ID "" +# endif + +#elif defined(__clang__) && defined(__ti__) +# if defined(__ARM_ARCH) +# define ARCHITECTURE_ID "Arm" + +# else /* unknown architecture */ +# define ARCHITECTURE_ID "" +# endif + +#elif defined(__TI_COMPILER_VERSION__) +# if defined(__TI_ARM__) +# define ARCHITECTURE_ID "ARM" + +# elif defined(__MSP430__) +# define ARCHITECTURE_ID "MSP430" + +# elif defined(__TMS320C28XX__) +# define ARCHITECTURE_ID "TMS320C28x" + +# elif defined(__TMS320C6X__) || defined(_TMS320C6X) +# define ARCHITECTURE_ID "TMS320C6x" + +# else /* unknown architecture */ +# define ARCHITECTURE_ID "" +# endif + +# elif defined(__ADSPSHARC__) +# define ARCHITECTURE_ID "SHARC" + +# elif defined(__ADSPBLACKFIN__) +# define ARCHITECTURE_ID "Blackfin" + +#elif defined(__TASKING__) + +# if defined(__CTC__) || defined(__CPTC__) +# define ARCHITECTURE_ID "TriCore" + +# elif defined(__CMCS__) +# define ARCHITECTURE_ID "MCS" + +# elif defined(__CARM__) +# define ARCHITECTURE_ID "ARM" + +# elif defined(__CARC__) +# define ARCHITECTURE_ID "ARC" + +# elif defined(__C51__) +# define ARCHITECTURE_ID "8051" + +# elif defined(__CPCP__) +# define ARCHITECTURE_ID "PCP" + +# else +# define ARCHITECTURE_ID "" +# endif + +#else +# define ARCHITECTURE_ID +#endif + +/* Convert integer to decimal digit literals. */ +#define DEC(n) \ + ('0' + (((n) / 10000000)%10)), \ + ('0' + (((n) / 1000000)%10)), \ + ('0' + (((n) / 100000)%10)), \ + ('0' + (((n) / 10000)%10)), \ + ('0' + (((n) / 1000)%10)), \ + ('0' + (((n) / 100)%10)), \ + ('0' + (((n) / 10)%10)), \ + ('0' + ((n) % 10)) + +/* Convert integer to hex digit literals. */ +#define HEX(n) \ + ('0' + ((n)>>28 & 0xF)), \ + ('0' + ((n)>>24 & 0xF)), \ + ('0' + ((n)>>20 & 0xF)), \ + ('0' + ((n)>>16 & 0xF)), \ + ('0' + ((n)>>12 & 0xF)), \ + ('0' + ((n)>>8 & 0xF)), \ + ('0' + ((n)>>4 & 0xF)), \ + ('0' + ((n) & 0xF)) + +/* Construct a string literal encoding the version number. */ +#ifdef COMPILER_VERSION +char const* info_version = "INFO" ":" "compiler_version[" COMPILER_VERSION "]"; + +/* Construct a string literal encoding the version number components. */ +#elif defined(COMPILER_VERSION_MAJOR) +char const info_version[] = { + 'I', 'N', 'F', 'O', ':', + 'c','o','m','p','i','l','e','r','_','v','e','r','s','i','o','n','[', + COMPILER_VERSION_MAJOR, +# ifdef COMPILER_VERSION_MINOR + '.', COMPILER_VERSION_MINOR, +# ifdef COMPILER_VERSION_PATCH + '.', COMPILER_VERSION_PATCH, +# ifdef COMPILER_VERSION_TWEAK + '.', COMPILER_VERSION_TWEAK, +# endif +# endif +# endif + ']','\0'}; +#endif + +/* Construct a string literal encoding the internal version number. */ +#ifdef COMPILER_VERSION_INTERNAL +char const info_version_internal[] = { + 'I', 'N', 'F', 'O', ':', + 'c','o','m','p','i','l','e','r','_','v','e','r','s','i','o','n','_', + 'i','n','t','e','r','n','a','l','[', + COMPILER_VERSION_INTERNAL,']','\0'}; +#elif defined(COMPILER_VERSION_INTERNAL_STR) +char const* info_version_internal = "INFO" ":" "compiler_version_internal[" COMPILER_VERSION_INTERNAL_STR "]"; +#endif + +/* Construct a string literal encoding the version number components. */ +#ifdef SIMULATE_VERSION_MAJOR +char const info_simulate_version[] = { + 'I', 'N', 'F', 'O', ':', + 's','i','m','u','l','a','t','e','_','v','e','r','s','i','o','n','[', + SIMULATE_VERSION_MAJOR, +# ifdef SIMULATE_VERSION_MINOR + '.', SIMULATE_VERSION_MINOR, +# ifdef SIMULATE_VERSION_PATCH + '.', SIMULATE_VERSION_PATCH, +# ifdef SIMULATE_VERSION_TWEAK + '.', SIMULATE_VERSION_TWEAK, +# endif +# endif +# endif + ']','\0'}; +#endif + +/* Construct the string literal in pieces to prevent the source from + getting matched. Store it in a pointer rather than an array + because some compilers will just produce instructions to fill the + array rather than assigning a pointer to a static array. */ +char const* info_platform = "INFO" ":" "platform[" PLATFORM_ID "]"; +char const* info_arch = "INFO" ":" "arch[" ARCHITECTURE_ID "]"; + + + +#define CXX_STD_98 199711L +#define CXX_STD_11 201103L +#define CXX_STD_14 201402L +#define CXX_STD_17 201703L +#define CXX_STD_20 202002L +#define CXX_STD_23 202302L + +#if defined(__INTEL_COMPILER) && defined(_MSVC_LANG) +# if _MSVC_LANG > CXX_STD_17 +# define CXX_STD _MSVC_LANG +# elif _MSVC_LANG == CXX_STD_17 && defined(__cpp_aggregate_paren_init) +# define CXX_STD CXX_STD_20 +# elif _MSVC_LANG > CXX_STD_14 && __cplusplus > CXX_STD_17 +# define CXX_STD CXX_STD_20 +# elif _MSVC_LANG > CXX_STD_14 +# define CXX_STD CXX_STD_17 +# elif defined(__INTEL_CXX11_MODE__) && defined(__cpp_aggregate_nsdmi) +# define CXX_STD CXX_STD_14 +# elif defined(__INTEL_CXX11_MODE__) +# define CXX_STD CXX_STD_11 +# else +# define CXX_STD CXX_STD_98 +# endif +#elif defined(_MSC_VER) && defined(_MSVC_LANG) +# if _MSVC_LANG > __cplusplus +# define CXX_STD _MSVC_LANG +# else +# define CXX_STD __cplusplus +# endif +#elif defined(__NVCOMPILER) +# if __cplusplus == CXX_STD_17 && defined(__cpp_aggregate_paren_init) +# define CXX_STD CXX_STD_20 +# else +# define CXX_STD __cplusplus +# endif +#elif defined(__INTEL_COMPILER) || defined(__PGI) +# if __cplusplus == CXX_STD_11 && defined(__cpp_namespace_attributes) +# define CXX_STD CXX_STD_17 +# elif __cplusplus == CXX_STD_11 && defined(__cpp_aggregate_nsdmi) +# define CXX_STD CXX_STD_14 +# else +# define CXX_STD __cplusplus +# endif +#elif (defined(__IBMCPP__) || defined(__ibmxl__)) && defined(__linux__) +# if __cplusplus == CXX_STD_11 && defined(__cpp_aggregate_nsdmi) +# define CXX_STD CXX_STD_14 +# else +# define CXX_STD __cplusplus +# endif +#elif __cplusplus == 1 && defined(__GXX_EXPERIMENTAL_CXX0X__) +# define CXX_STD CXX_STD_11 +#else +# define CXX_STD __cplusplus +#endif + +const char* info_language_standard_default = "INFO" ":" "standard_default[" +#if CXX_STD > CXX_STD_23 + "26" +#elif CXX_STD > CXX_STD_20 + "23" +#elif CXX_STD > CXX_STD_17 + "20" +#elif CXX_STD > CXX_STD_14 + "17" +#elif CXX_STD > CXX_STD_11 + "14" +#elif CXX_STD >= CXX_STD_11 + "11" +#else + "98" +#endif +"]"; + +const char* info_language_extensions_default = "INFO" ":" "extensions_default[" +#if (defined(__clang__) || defined(__GNUC__) || defined(__xlC__) || \ + defined(__TI_COMPILER_VERSION__)) && \ + !defined(__STRICT_ANSI__) + "ON" +#else + "OFF" +#endif +"]"; + +/*--------------------------------------------------------------------------*/ + +int main(int argc, char* argv[]) +{ + int require = 0; + require += info_compiler[argc]; + require += info_platform[argc]; + require += info_arch[argc]; +#ifdef COMPILER_VERSION_MAJOR + require += info_version[argc]; +#endif +#ifdef COMPILER_VERSION_INTERNAL + require += info_version_internal[argc]; +#endif +#ifdef SIMULATE_ID + require += info_simulate[argc]; +#endif +#ifdef SIMULATE_VERSION_MAJOR + require += info_simulate_version[argc]; +#endif +#if defined(__CRAYXT_COMPUTE_LINUX_TARGET) + require += info_cray[argc]; +#endif + require += info_language_standard_default[argc]; + require += info_language_extensions_default[argc]; + (void)argv; + return require; +} diff --git a/siro_rider/android/app/.cxx/RelWithDebInfo/6t1m4b5v/x86/CMakeFiles/3.31.5-g6cf5163/CompilerIdCXX/CMakeCXXCompilerId.o b/siro_rider/android/app/.cxx/RelWithDebInfo/6t1m4b5v/x86/CMakeFiles/3.31.5-g6cf5163/CompilerIdCXX/CMakeCXXCompilerId.o new file mode 100644 index 0000000..1b7cf21 Binary files /dev/null and b/siro_rider/android/app/.cxx/RelWithDebInfo/6t1m4b5v/x86/CMakeFiles/3.31.5-g6cf5163/CompilerIdCXX/CMakeCXXCompilerId.o differ diff --git a/siro_rider/android/app/.cxx/RelWithDebInfo/6t1m4b5v/x86/CMakeFiles/CMakeConfigureLog.yaml b/siro_rider/android/app/.cxx/RelWithDebInfo/6t1m4b5v/x86/CMakeFiles/CMakeConfigureLog.yaml new file mode 100644 index 0000000..579be6c --- /dev/null +++ b/siro_rider/android/app/.cxx/RelWithDebInfo/6t1m4b5v/x86/CMakeFiles/CMakeConfigureLog.yaml @@ -0,0 +1,399 @@ + +--- +events: + - + kind: "message-v1" + backtrace: + - "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeDetermineSystem.cmake:200 (message)" + - "CMakeLists.txt:2 (project)" + message: | + The target system is: Android - 1 - i686 + The host system is: Darwin - 24.5.0 - arm64 + - + kind: "message-v1" + backtrace: + - "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeDetermineCompilerId.cmake:17 (message)" + - "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeDetermineCompilerId.cmake:64 (__determine_compiler_id_test)" + - "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeDetermineCCompiler.cmake:123 (CMAKE_DETERMINE_COMPILER_ID)" + - "CMakeLists.txt:2 (project)" + message: | + Compiling the C compiler identification source file "CMakeCCompilerId.c" succeeded. + Compiler: /Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/bin/clang + Build flags: -g;-DANDROID;-fdata-sections;-ffunction-sections;-funwind-tables;-fstack-protector-strong;-no-canonical-prefixes;-mstackrealign;-D_FORTIFY_SOURCE=2;-Wformat;-Werror=format-security + Id flags: -c;--target=i686-none-linux-android23 + + The output was: + 0 + + + Compilation of the C compiler identification source "CMakeCCompilerId.c" produced "CMakeCCompilerId.o" + + The C compiler identification is Clang, found in: + /Users/hamzaaleghwairyeen/development/App/Intaleq/android/app/.cxx/RelWithDebInfo/6t1m4b5v/x86/CMakeFiles/3.31.5-g6cf5163/CompilerIdC/CMakeCCompilerId.o + + - + kind: "message-v1" + backtrace: + - "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeDetermineCompilerId.cmake:17 (message)" + - "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeDetermineCompilerId.cmake:64 (__determine_compiler_id_test)" + - "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeDetermineCXXCompiler.cmake:126 (CMAKE_DETERMINE_COMPILER_ID)" + - "CMakeLists.txt:2 (project)" + message: | + Compiling the CXX compiler identification source file "CMakeCXXCompilerId.cpp" succeeded. + Compiler: /Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/bin/clang++ + Build flags: -g;-DANDROID;-fdata-sections;-ffunction-sections;-funwind-tables;-fstack-protector-strong;-no-canonical-prefixes;-mstackrealign;-D_FORTIFY_SOURCE=2;-Wformat;-Werror=format-security + Id flags: -c;--target=i686-none-linux-android23 + + The output was: + 0 + + + Compilation of the CXX compiler identification source "CMakeCXXCompilerId.cpp" produced "CMakeCXXCompilerId.o" + + The CXX compiler identification is Clang, found in: + /Users/hamzaaleghwairyeen/development/App/Intaleq/android/app/.cxx/RelWithDebInfo/6t1m4b5v/x86/CMakeFiles/3.31.5-g6cf5163/CompilerIdCXX/CMakeCXXCompilerId.o + + - + kind: "try_compile-v1" + backtrace: + - "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeDetermineCompilerABI.cmake:74 (try_compile)" + - "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeTestCCompiler.cmake:26 (CMAKE_DETERMINE_COMPILER_ABI)" + - "CMakeLists.txt:2 (project)" + checks: + - "Detecting C compiler ABI info" + directories: + source: "/Users/hamzaaleghwairyeen/development/App/Intaleq/android/app/.cxx/RelWithDebInfo/6t1m4b5v/x86/CMakeFiles/CMakeScratch/TryCompile-nBOHPZ" + binary: "/Users/hamzaaleghwairyeen/development/App/Intaleq/android/app/.cxx/RelWithDebInfo/6t1m4b5v/x86/CMakeFiles/CMakeScratch/TryCompile-nBOHPZ" + cmakeVariables: + ANDROID_ABI: "x86" + ANDROID_ARM_MODE: "thumb" + ANDROID_PIE: "TRUE" + ANDROID_PLATFORM: "android-23" + ANDROID_STL: "c++_static" + ANDROID_TOOLCHAIN: "clang" + CMAKE_CXX_COMPILER_CLANG_SCAN_DEPS: "/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/bin/clang-scan-deps" + CMAKE_CXX_COMPILER_TARGET: "i686-none-linux-android23" + CMAKE_C_COMPILER_TARGET: "i686-none-linux-android23" + CMAKE_C_FLAGS: "-g -DANDROID -fdata-sections -ffunction-sections -funwind-tables -fstack-protector-strong -no-canonical-prefixes -mstackrealign -D_FORTIFY_SOURCE=2 -Wformat " + CMAKE_C_FLAGS_DEBUG: "-fno-limit-debug-info " + CMAKE_EXE_LINKER_FLAGS: "-static-libstdc++ -Wl,--build-id=sha1 -Wl,--no-rosegment -Wl,--no-undefined-version -Wl,--fatal-warnings -Wl,--no-undefined -Qunused-arguments " + CMAKE_POSITION_INDEPENDENT_CODE: "TRUE" + CMAKE_SYSROOT: "/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot" + buildResult: + variable: "CMAKE_C_ABI_COMPILED" + cached: true + stdout: | + Change Dir: '/Users/hamzaaleghwairyeen/development/App/Intaleq/android/app/.cxx/RelWithDebInfo/6t1m4b5v/x86/CMakeFiles/CMakeScratch/TryCompile-nBOHPZ' + + Run Build Command(s): /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/bin/ninja -v cmTC_72fe3 + [1/2] /Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/bin/clang --target=i686-none-linux-android23 --sysroot=/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot -g -DANDROID -fdata-sections -ffunction-sections -funwind-tables -fstack-protector-strong -no-canonical-prefixes -mstackrealign -D_FORTIFY_SOURCE=2 -Wformat -fPIE -v -MD -MT CMakeFiles/cmTC_72fe3.dir/CMakeCCompilerABI.c.o -MF CMakeFiles/cmTC_72fe3.dir/CMakeCCompilerABI.c.o.d -o CMakeFiles/cmTC_72fe3.dir/CMakeCCompilerABI.c.o -c /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeCCompilerABI.c + Android (12027248, +pgo, -bolt, +lto, -mlgo, based on r522817) clang version 18.0.1 (https://android.googlesource.com/toolchain/llvm-project d8003a456d14a3deb8054cdaa529ffbf02d9b262) + Target: i686-none-linux-android23 + Thread model: posix + InstalledDir: /Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/bin + (in-process) + "/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/bin/clang" -cc1 -triple i686-none-linux-android23 -emit-obj -mrelax-all -disable-free -clear-ast-before-backend -disable-llvm-verifier -discard-value-names -main-file-name CMakeCCompilerABI.c -mrelocation-model pic -pic-level 2 -pic-is-pie -mframe-pointer=all -ffp-contract=on -fno-rounding-math -mconstructor-aliases -funwind-tables=2 -target-cpu i686 -target-feature +ssse3 -tune-cpu generic -debug-info-kind=constructor -dwarf-version=4 -debugger-tuning=gdb -fdebug-compilation-dir=/Users/hamzaaleghwairyeen/development/App/Intaleq/android/app/.cxx/RelWithDebInfo/6t1m4b5v/x86/CMakeFiles/CMakeScratch/TryCompile-nBOHPZ -v -ffunction-sections -fdata-sections -fcoverage-compilation-dir=/Users/hamzaaleghwairyeen/development/App/Intaleq/android/app/.cxx/RelWithDebInfo/6t1m4b5v/x86/CMakeFiles/CMakeScratch/TryCompile-nBOHPZ -resource-dir /Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/lib/clang/18 -dependency-file CMakeFiles/cmTC_72fe3.dir/CMakeCCompilerABI.c.o.d -MT CMakeFiles/cmTC_72fe3.dir/CMakeCCompilerABI.c.o -sys-header-deps -D ANDROID -D _FORTIFY_SOURCE=2 -isysroot /Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot -internal-isystem /Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/lib/clang/18/include -internal-isystem /Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/local/include -internal-externc-isystem /Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/include/i686-linux-android -internal-externc-isystem /Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/include -internal-externc-isystem /Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/include -Wformat -ferror-limit 19 -femulated-tls -stack-protector 2 -mstackrealign -fgnuc-version=4.2.1 -D__GCC_HAVE_DWARF2_CFI_ASM=1 -o CMakeFiles/cmTC_72fe3.dir/CMakeCCompilerABI.c.o -x c /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeCCompilerABI.c + clang -cc1 version 18.0.1 based upon LLVM 18.0.1 default target x86_64-apple-darwin24.5.0 + ignoring nonexistent directory "/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/local/include" + ignoring nonexistent directory "/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/include" + #include "..." search starts here: + #include <...> search starts here: + /Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/lib/clang/18/include + /Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/include/i686-linux-android + /Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/include + End of search list. + [2/2] : && /Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/bin/clang --target=i686-none-linux-android23 --sysroot=/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot -g -DANDROID -fdata-sections -ffunction-sections -funwind-tables -fstack-protector-strong -no-canonical-prefixes -mstackrealign -D_FORTIFY_SOURCE=2 -Wformat -static-libstdc++ -Wl,--build-id=sha1 -Wl,--no-rosegment -Wl,--no-undefined-version -Wl,--fatal-warnings -Wl,--no-undefined -Qunused-arguments -v CMakeFiles/cmTC_72fe3.dir/CMakeCCompilerABI.c.o -o cmTC_72fe3 && : + Android (12027248, +pgo, -bolt, +lto, -mlgo, based on r522817) clang version 18.0.1 (https://android.googlesource.com/toolchain/llvm-project d8003a456d14a3deb8054cdaa529ffbf02d9b262) + Target: i686-none-linux-android23 + Thread model: posix + InstalledDir: /Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/bin + "/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/bin/ld.lld" --sysroot=/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot -z now -z relro --hash-style=gnu --eh-frame-hdr -m elf_i386 -pie -dynamic-linker /system/bin/linker -o cmTC_72fe3 /Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/lib/i686-linux-android/23/crtbegin_dynamic.o -L/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/lib/clang/18/lib/linux/i386 -L/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/lib/i686-linux-android/23 -L/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/lib/i686-linux-android -L/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/lib --build-id=sha1 --no-rosegment --no-undefined-version --fatal-warnings --no-undefined CMakeFiles/cmTC_72fe3.dir/CMakeCCompilerABI.c.o /Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/lib/clang/18/lib/linux/libclang_rt.builtins-i686-android.a -l:libunwind.a -ldl -lc /Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/lib/clang/18/lib/linux/libclang_rt.builtins-i686-android.a -l:libunwind.a -ldl /Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/lib/i686-linux-android/23/crtend_android.o + + exitCode: 0 + - + kind: "message-v1" + backtrace: + - "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeDetermineCompilerABI.cmake:182 (message)" + - "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeTestCCompiler.cmake:26 (CMAKE_DETERMINE_COMPILER_ABI)" + - "CMakeLists.txt:2 (project)" + message: | + Parsed C implicit include dir info: rv=done + found start of include info + found start of implicit include info + add: [/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/lib/clang/18/include] + add: [/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/include/i686-linux-android] + add: [/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/include] + end of search list found + collapse include dir [/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/lib/clang/18/include] ==> [/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/lib/clang/18/include] + collapse include dir [/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/include/i686-linux-android] ==> [/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/include/i686-linux-android] + collapse include dir [/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/include] ==> [/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/include] + implicit include dirs: [/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/lib/clang/18/include;/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/include/i686-linux-android;/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/include] + + + - + kind: "message-v1" + backtrace: + - "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeDetermineCompilerABI.cmake:218 (message)" + - "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeTestCCompiler.cmake:26 (CMAKE_DETERMINE_COMPILER_ABI)" + - "CMakeLists.txt:2 (project)" + message: | + Parsed C implicit link information: + link line regex: [^( *|.*[/\\])(ld[0-9]*(\\.[a-z]+)?|CMAKE_LINK_STARTFILE-NOTFOUND|([^/\\]+-)?ld|collect2)[^/\\]*( |$)] + linker tool regex: [^[ ]*(->|")?[ ]*(([^"]*[/\\])?(ld[0-9]*(\\.[a-z]+)?))("|,| |$)] + ignore line: [Change Dir: '/Users/hamzaaleghwairyeen/development/App/Intaleq/android/app/.cxx/RelWithDebInfo/6t1m4b5v/x86/CMakeFiles/CMakeScratch/TryCompile-nBOHPZ'] + ignore line: [] + ignore line: [Run Build Command(s): /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/bin/ninja -v cmTC_72fe3] + ignore line: [[1/2] /Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/bin/clang --target=i686-none-linux-android23 --sysroot=/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot -g -DANDROID -fdata-sections -ffunction-sections -funwind-tables -fstack-protector-strong -no-canonical-prefixes -mstackrealign -D_FORTIFY_SOURCE=2 -Wformat -fPIE -v -MD -MT CMakeFiles/cmTC_72fe3.dir/CMakeCCompilerABI.c.o -MF CMakeFiles/cmTC_72fe3.dir/CMakeCCompilerABI.c.o.d -o CMakeFiles/cmTC_72fe3.dir/CMakeCCompilerABI.c.o -c /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeCCompilerABI.c] + ignore line: [Android (12027248 +pgo -bolt +lto -mlgo based on r522817) clang version 18.0.1 (https://android.googlesource.com/toolchain/llvm-project d8003a456d14a3deb8054cdaa529ffbf02d9b262)] + ignore line: [Target: i686-none-linux-android23] + ignore line: [Thread model: posix] + ignore line: [InstalledDir: /Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/bin] + ignore line: [ (in-process)] + ignore line: [ "/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/bin/clang" -cc1 -triple i686-none-linux-android23 -emit-obj -mrelax-all -disable-free -clear-ast-before-backend -disable-llvm-verifier -discard-value-names -main-file-name CMakeCCompilerABI.c -mrelocation-model pic -pic-level 2 -pic-is-pie -mframe-pointer=all -ffp-contract=on -fno-rounding-math -mconstructor-aliases -funwind-tables=2 -target-cpu i686 -target-feature +ssse3 -tune-cpu generic -debug-info-kind=constructor -dwarf-version=4 -debugger-tuning=gdb -fdebug-compilation-dir=/Users/hamzaaleghwairyeen/development/App/Intaleq/android/app/.cxx/RelWithDebInfo/6t1m4b5v/x86/CMakeFiles/CMakeScratch/TryCompile-nBOHPZ -v -ffunction-sections -fdata-sections -fcoverage-compilation-dir=/Users/hamzaaleghwairyeen/development/App/Intaleq/android/app/.cxx/RelWithDebInfo/6t1m4b5v/x86/CMakeFiles/CMakeScratch/TryCompile-nBOHPZ -resource-dir /Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/lib/clang/18 -dependency-file CMakeFiles/cmTC_72fe3.dir/CMakeCCompilerABI.c.o.d -MT CMakeFiles/cmTC_72fe3.dir/CMakeCCompilerABI.c.o -sys-header-deps -D ANDROID -D _FORTIFY_SOURCE=2 -isysroot /Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot -internal-isystem /Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/lib/clang/18/include -internal-isystem /Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/local/include -internal-externc-isystem /Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/include/i686-linux-android -internal-externc-isystem /Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/include -internal-externc-isystem /Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/include -Wformat -ferror-limit 19 -femulated-tls -stack-protector 2 -mstackrealign -fgnuc-version=4.2.1 -D__GCC_HAVE_DWARF2_CFI_ASM=1 -o CMakeFiles/cmTC_72fe3.dir/CMakeCCompilerABI.c.o -x c /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeCCompilerABI.c] + ignore line: [clang -cc1 version 18.0.1 based upon LLVM 18.0.1 default target x86_64-apple-darwin24.5.0] + ignore line: [ignoring nonexistent directory "/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/local/include"] + ignore line: [ignoring nonexistent directory "/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/include"] + ignore line: [#include "..." search starts here:] + ignore line: [#include <...> search starts here:] + ignore line: [ /Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/lib/clang/18/include] + ignore line: [ /Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/include/i686-linux-android] + ignore line: [ /Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/include] + ignore line: [End of search list.] + ignore line: [[2/2] : && /Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/bin/clang --target=i686-none-linux-android23 --sysroot=/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot -g -DANDROID -fdata-sections -ffunction-sections -funwind-tables -fstack-protector-strong -no-canonical-prefixes -mstackrealign -D_FORTIFY_SOURCE=2 -Wformat -static-libstdc++ -Wl --build-id=sha1 -Wl --no-rosegment -Wl --no-undefined-version -Wl --fatal-warnings -Wl --no-undefined -Qunused-arguments -v CMakeFiles/cmTC_72fe3.dir/CMakeCCompilerABI.c.o -o cmTC_72fe3 && :] + ignore line: [Android (12027248 +pgo -bolt +lto -mlgo based on r522817) clang version 18.0.1 (https://android.googlesource.com/toolchain/llvm-project d8003a456d14a3deb8054cdaa529ffbf02d9b262)] + ignore line: [Target: i686-none-linux-android23] + ignore line: [Thread model: posix] + ignore line: [InstalledDir: /Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/bin] + link line: [ "/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/bin/ld.lld" --sysroot=/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot -z now -z relro --hash-style=gnu --eh-frame-hdr -m elf_i386 -pie -dynamic-linker /system/bin/linker -o cmTC_72fe3 /Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/lib/i686-linux-android/23/crtbegin_dynamic.o -L/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/lib/clang/18/lib/linux/i386 -L/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/lib/i686-linux-android/23 -L/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/lib/i686-linux-android -L/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/lib --build-id=sha1 --no-rosegment --no-undefined-version --fatal-warnings --no-undefined CMakeFiles/cmTC_72fe3.dir/CMakeCCompilerABI.c.o /Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/lib/clang/18/lib/linux/libclang_rt.builtins-i686-android.a -l:libunwind.a -ldl -lc /Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/lib/clang/18/lib/linux/libclang_rt.builtins-i686-android.a -l:libunwind.a -ldl /Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/lib/i686-linux-android/23/crtend_android.o] + arg [/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/bin/ld.lld] ==> ignore + arg [--sysroot=/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot] ==> ignore + arg [-znow] ==> ignore + arg [-zrelro] ==> ignore + arg [--hash-style=gnu] ==> ignore + arg [--eh-frame-hdr] ==> ignore + arg [-m] ==> ignore + arg [elf_i386] ==> ignore + arg [-pie] ==> ignore + arg [-dynamic-linker] ==> ignore + arg [/system/bin/linker] ==> ignore + arg [-o] ==> ignore + arg [cmTC_72fe3] ==> ignore + arg [/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/lib/i686-linux-android/23/crtbegin_dynamic.o] ==> obj [/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/lib/i686-linux-android/23/crtbegin_dynamic.o] + arg [-L/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/lib/clang/18/lib/linux/i386] ==> dir [/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/lib/clang/18/lib/linux/i386] + arg [-L/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/lib/i686-linux-android/23] ==> dir [/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/lib/i686-linux-android/23] + arg [-L/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/lib/i686-linux-android] ==> dir [/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/lib/i686-linux-android] + arg [-L/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/lib] ==> dir [/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/lib] + arg [--build-id=sha1] ==> ignore + arg [--no-rosegment] ==> ignore + arg [--no-undefined-version] ==> ignore + arg [--fatal-warnings] ==> ignore + arg [--no-undefined] ==> ignore + arg [CMakeFiles/cmTC_72fe3.dir/CMakeCCompilerABI.c.o] ==> ignore + arg [/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/lib/clang/18/lib/linux/libclang_rt.builtins-i686-android.a] ==> lib [/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/lib/clang/18/lib/linux/libclang_rt.builtins-i686-android.a] + arg [-l:libunwind.a] ==> lib [-l:libunwind.a] + arg [-ldl] ==> lib [dl] + arg [-lc] ==> lib [c] + arg [/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/lib/clang/18/lib/linux/libclang_rt.builtins-i686-android.a] ==> lib [/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/lib/clang/18/lib/linux/libclang_rt.builtins-i686-android.a] + arg [-l:libunwind.a] ==> lib [-l:libunwind.a] + arg [-ldl] ==> lib [dl] + arg [/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/lib/i686-linux-android/23/crtend_android.o] ==> obj [/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/lib/i686-linux-android/23/crtend_android.o] + linker tool for 'C': /Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/bin/ld.lld + remove lib [/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/lib/clang/18/lib/linux/libclang_rt.builtins-i686-android.a] + remove lib [/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/lib/clang/18/lib/linux/libclang_rt.builtins-i686-android.a] + collapse library dir [/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/lib/clang/18/lib/linux/i386] ==> [/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/lib/clang/18/lib/linux/i386] + collapse library dir [/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/lib/i686-linux-android/23] ==> [/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/lib/i686-linux-android/23] + collapse library dir [/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/lib/i686-linux-android] ==> [/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/lib/i686-linux-android] + collapse library dir [/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/lib] ==> [/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/lib] + implicit libs: [-l:libunwind.a;dl;c;-l:libunwind.a;dl] + implicit objs: [/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/lib/i686-linux-android/23/crtbegin_dynamic.o;/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/lib/i686-linux-android/23/crtend_android.o] + implicit dirs: [/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/lib/clang/18/lib/linux/i386;/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/lib/i686-linux-android/23;/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/lib/i686-linux-android;/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/lib] + implicit fwks: [] + + + - + kind: "message-v1" + backtrace: + - "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Internal/CMakeDetermineLinkerId.cmake:40 (message)" + - "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeDetermineCompilerABI.cmake:255 (cmake_determine_linker_id)" + - "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeTestCCompiler.cmake:26 (CMAKE_DETERMINE_COMPILER_ABI)" + - "CMakeLists.txt:2 (project)" + message: | + Running the C compiler's linker: "/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/bin/ld.lld" "-v" + LLD 18.0.1 (compatible with GNU linkers) + - + kind: "try_compile-v1" + backtrace: + - "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeDetermineCompilerABI.cmake:74 (try_compile)" + - "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeTestCXXCompiler.cmake:26 (CMAKE_DETERMINE_COMPILER_ABI)" + - "CMakeLists.txt:2 (project)" + checks: + - "Detecting CXX compiler ABI info" + directories: + source: "/Users/hamzaaleghwairyeen/development/App/Intaleq/android/app/.cxx/RelWithDebInfo/6t1m4b5v/x86/CMakeFiles/CMakeScratch/TryCompile-1KZUy2" + binary: "/Users/hamzaaleghwairyeen/development/App/Intaleq/android/app/.cxx/RelWithDebInfo/6t1m4b5v/x86/CMakeFiles/CMakeScratch/TryCompile-1KZUy2" + cmakeVariables: + ANDROID_ABI: "x86" + ANDROID_ARM_MODE: "thumb" + ANDROID_PIE: "TRUE" + ANDROID_PLATFORM: "android-23" + ANDROID_STL: "c++_static" + ANDROID_TOOLCHAIN: "clang" + CMAKE_CXX_COMPILER_CLANG_SCAN_DEPS: "/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/bin/clang-scan-deps" + CMAKE_CXX_COMPILER_TARGET: "i686-none-linux-android23" + CMAKE_CXX_FLAGS: "-g -DANDROID -fdata-sections -ffunction-sections -funwind-tables -fstack-protector-strong -no-canonical-prefixes -mstackrealign -D_FORTIFY_SOURCE=2 -Wformat " + CMAKE_CXX_FLAGS_DEBUG: "-fno-limit-debug-info " + CMAKE_CXX_SCAN_FOR_MODULES: "OFF" + CMAKE_C_COMPILER_TARGET: "i686-none-linux-android23" + CMAKE_EXE_LINKER_FLAGS: "-static-libstdc++ -Wl,--build-id=sha1 -Wl,--no-rosegment -Wl,--no-undefined-version -Wl,--fatal-warnings -Wl,--no-undefined -Qunused-arguments " + CMAKE_POSITION_INDEPENDENT_CODE: "TRUE" + CMAKE_SYSROOT: "/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot" + buildResult: + variable: "CMAKE_CXX_ABI_COMPILED" + cached: true + stdout: | + Change Dir: '/Users/hamzaaleghwairyeen/development/App/Intaleq/android/app/.cxx/RelWithDebInfo/6t1m4b5v/x86/CMakeFiles/CMakeScratch/TryCompile-1KZUy2' + + Run Build Command(s): /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/bin/ninja -v cmTC_8f22f + [1/2] /Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/bin/clang++ --target=i686-none-linux-android23 --sysroot=/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot -g -DANDROID -fdata-sections -ffunction-sections -funwind-tables -fstack-protector-strong -no-canonical-prefixes -mstackrealign -D_FORTIFY_SOURCE=2 -Wformat -fPIE -v -MD -MT CMakeFiles/cmTC_8f22f.dir/CMakeCXXCompilerABI.cpp.o -MF CMakeFiles/cmTC_8f22f.dir/CMakeCXXCompilerABI.cpp.o.d -o CMakeFiles/cmTC_8f22f.dir/CMakeCXXCompilerABI.cpp.o -c /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeCXXCompilerABI.cpp + Android (12027248, +pgo, -bolt, +lto, -mlgo, based on r522817) clang version 18.0.1 (https://android.googlesource.com/toolchain/llvm-project d8003a456d14a3deb8054cdaa529ffbf02d9b262) + Target: i686-none-linux-android23 + Thread model: posix + InstalledDir: /Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/bin + (in-process) + "/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/bin/clang++" -cc1 -triple i686-none-linux-android23 -emit-obj -mrelax-all -disable-free -clear-ast-before-backend -disable-llvm-verifier -discard-value-names -main-file-name CMakeCXXCompilerABI.cpp -mrelocation-model pic -pic-level 2 -pic-is-pie -mframe-pointer=all -ffp-contract=on -fno-rounding-math -mconstructor-aliases -funwind-tables=2 -target-cpu i686 -target-feature +ssse3 -tune-cpu generic -debug-info-kind=constructor -dwarf-version=4 -debugger-tuning=gdb -fdebug-compilation-dir=/Users/hamzaaleghwairyeen/development/App/Intaleq/android/app/.cxx/RelWithDebInfo/6t1m4b5v/x86/CMakeFiles/CMakeScratch/TryCompile-1KZUy2 -v -ffunction-sections -fdata-sections -fcoverage-compilation-dir=/Users/hamzaaleghwairyeen/development/App/Intaleq/android/app/.cxx/RelWithDebInfo/6t1m4b5v/x86/CMakeFiles/CMakeScratch/TryCompile-1KZUy2 -resource-dir /Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/lib/clang/18 -dependency-file CMakeFiles/cmTC_8f22f.dir/CMakeCXXCompilerABI.cpp.o.d -MT CMakeFiles/cmTC_8f22f.dir/CMakeCXXCompilerABI.cpp.o -sys-header-deps -D ANDROID -D _FORTIFY_SOURCE=2 -isysroot /Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot -internal-isystem /Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/include/c++/v1 -internal-isystem /Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/lib/clang/18/include -internal-isystem /Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/local/include -internal-externc-isystem /Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/include/i686-linux-android -internal-externc-isystem /Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/include -internal-externc-isystem /Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/include -Wformat -fdeprecated-macro -ferror-limit 19 -femulated-tls -stack-protector 2 -mstackrealign -fgnuc-version=4.2.1 -fcxx-exceptions -fexceptions -D__GCC_HAVE_DWARF2_CFI_ASM=1 -o CMakeFiles/cmTC_8f22f.dir/CMakeCXXCompilerABI.cpp.o -x c++ /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeCXXCompilerABI.cpp + clang -cc1 version 18.0.1 based upon LLVM 18.0.1 default target x86_64-apple-darwin24.5.0 + ignoring nonexistent directory "/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/local/include" + ignoring nonexistent directory "/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/include" + #include "..." search starts here: + #include <...> search starts here: + /Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/include/c++/v1 + /Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/lib/clang/18/include + /Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/include/i686-linux-android + /Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/include + End of search list. + [2/2] : && /Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/bin/clang++ --target=i686-none-linux-android23 --sysroot=/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot -g -DANDROID -fdata-sections -ffunction-sections -funwind-tables -fstack-protector-strong -no-canonical-prefixes -mstackrealign -D_FORTIFY_SOURCE=2 -Wformat -static-libstdc++ -Wl,--build-id=sha1 -Wl,--no-rosegment -Wl,--no-undefined-version -Wl,--fatal-warnings -Wl,--no-undefined -Qunused-arguments -v CMakeFiles/cmTC_8f22f.dir/CMakeCXXCompilerABI.cpp.o -o cmTC_8f22f && : + Android (12027248, +pgo, -bolt, +lto, -mlgo, based on r522817) clang version 18.0.1 (https://android.googlesource.com/toolchain/llvm-project d8003a456d14a3deb8054cdaa529ffbf02d9b262) + Target: i686-none-linux-android23 + Thread model: posix + InstalledDir: /Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/bin + "/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/bin/ld.lld" --sysroot=/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot -z now -z relro --hash-style=gnu --eh-frame-hdr -m elf_i386 -pie -dynamic-linker /system/bin/linker -o cmTC_8f22f /Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/lib/i686-linux-android/23/crtbegin_dynamic.o -L/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/lib/clang/18/lib/linux/i386 -L/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/lib/i686-linux-android/23 -L/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/lib/i686-linux-android -L/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/lib --build-id=sha1 --no-rosegment --no-undefined-version --fatal-warnings --no-undefined CMakeFiles/cmTC_8f22f.dir/CMakeCXXCompilerABI.cpp.o -Bstatic -lc++ -Bdynamic -lm /Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/lib/clang/18/lib/linux/libclang_rt.builtins-i686-android.a -l:libunwind.a -ldl -lc /Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/lib/clang/18/lib/linux/libclang_rt.builtins-i686-android.a -l:libunwind.a -ldl /Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/lib/i686-linux-android/23/crtend_android.o + + exitCode: 0 + - + kind: "message-v1" + backtrace: + - "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeDetermineCompilerABI.cmake:182 (message)" + - "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeTestCXXCompiler.cmake:26 (CMAKE_DETERMINE_COMPILER_ABI)" + - "CMakeLists.txt:2 (project)" + message: | + Parsed CXX implicit include dir info: rv=done + found start of include info + found start of implicit include info + add: [/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/include/c++/v1] + add: [/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/lib/clang/18/include] + add: [/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/include/i686-linux-android] + add: [/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/include] + end of search list found + collapse include dir [/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/include/c++/v1] ==> [/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/include/c++/v1] + collapse include dir [/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/lib/clang/18/include] ==> [/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/lib/clang/18/include] + collapse include dir [/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/include/i686-linux-android] ==> [/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/include/i686-linux-android] + collapse include dir [/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/include] ==> [/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/include] + implicit include dirs: [/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/include/c++/v1;/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/lib/clang/18/include;/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/include/i686-linux-android;/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/include] + + + - + kind: "message-v1" + backtrace: + - "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeDetermineCompilerABI.cmake:218 (message)" + - "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeTestCXXCompiler.cmake:26 (CMAKE_DETERMINE_COMPILER_ABI)" + - "CMakeLists.txt:2 (project)" + message: | + Parsed CXX implicit link information: + link line regex: [^( *|.*[/\\])(ld[0-9]*(\\.[a-z]+)?|CMAKE_LINK_STARTFILE-NOTFOUND|([^/\\]+-)?ld|collect2)[^/\\]*( |$)] + linker tool regex: [^[ ]*(->|")?[ ]*(([^"]*[/\\])?(ld[0-9]*(\\.[a-z]+)?))("|,| |$)] + ignore line: [Change Dir: '/Users/hamzaaleghwairyeen/development/App/Intaleq/android/app/.cxx/RelWithDebInfo/6t1m4b5v/x86/CMakeFiles/CMakeScratch/TryCompile-1KZUy2'] + ignore line: [] + ignore line: [Run Build Command(s): /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/bin/ninja -v cmTC_8f22f] + ignore line: [[1/2] /Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/bin/clang++ --target=i686-none-linux-android23 --sysroot=/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot -g -DANDROID -fdata-sections -ffunction-sections -funwind-tables -fstack-protector-strong -no-canonical-prefixes -mstackrealign -D_FORTIFY_SOURCE=2 -Wformat -fPIE -v -MD -MT CMakeFiles/cmTC_8f22f.dir/CMakeCXXCompilerABI.cpp.o -MF CMakeFiles/cmTC_8f22f.dir/CMakeCXXCompilerABI.cpp.o.d -o CMakeFiles/cmTC_8f22f.dir/CMakeCXXCompilerABI.cpp.o -c /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeCXXCompilerABI.cpp] + ignore line: [Android (12027248 +pgo -bolt +lto -mlgo based on r522817) clang version 18.0.1 (https://android.googlesource.com/toolchain/llvm-project d8003a456d14a3deb8054cdaa529ffbf02d9b262)] + ignore line: [Target: i686-none-linux-android23] + ignore line: [Thread model: posix] + ignore line: [InstalledDir: /Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/bin] + ignore line: [ (in-process)] + ignore line: [ "/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/bin/clang++" -cc1 -triple i686-none-linux-android23 -emit-obj -mrelax-all -disable-free -clear-ast-before-backend -disable-llvm-verifier -discard-value-names -main-file-name CMakeCXXCompilerABI.cpp -mrelocation-model pic -pic-level 2 -pic-is-pie -mframe-pointer=all -ffp-contract=on -fno-rounding-math -mconstructor-aliases -funwind-tables=2 -target-cpu i686 -target-feature +ssse3 -tune-cpu generic -debug-info-kind=constructor -dwarf-version=4 -debugger-tuning=gdb -fdebug-compilation-dir=/Users/hamzaaleghwairyeen/development/App/Intaleq/android/app/.cxx/RelWithDebInfo/6t1m4b5v/x86/CMakeFiles/CMakeScratch/TryCompile-1KZUy2 -v -ffunction-sections -fdata-sections -fcoverage-compilation-dir=/Users/hamzaaleghwairyeen/development/App/Intaleq/android/app/.cxx/RelWithDebInfo/6t1m4b5v/x86/CMakeFiles/CMakeScratch/TryCompile-1KZUy2 -resource-dir /Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/lib/clang/18 -dependency-file CMakeFiles/cmTC_8f22f.dir/CMakeCXXCompilerABI.cpp.o.d -MT CMakeFiles/cmTC_8f22f.dir/CMakeCXXCompilerABI.cpp.o -sys-header-deps -D ANDROID -D _FORTIFY_SOURCE=2 -isysroot /Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot -internal-isystem /Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/include/c++/v1 -internal-isystem /Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/lib/clang/18/include -internal-isystem /Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/local/include -internal-externc-isystem /Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/include/i686-linux-android -internal-externc-isystem /Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/include -internal-externc-isystem /Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/include -Wformat -fdeprecated-macro -ferror-limit 19 -femulated-tls -stack-protector 2 -mstackrealign -fgnuc-version=4.2.1 -fcxx-exceptions -fexceptions -D__GCC_HAVE_DWARF2_CFI_ASM=1 -o CMakeFiles/cmTC_8f22f.dir/CMakeCXXCompilerABI.cpp.o -x c++ /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeCXXCompilerABI.cpp] + ignore line: [clang -cc1 version 18.0.1 based upon LLVM 18.0.1 default target x86_64-apple-darwin24.5.0] + ignore line: [ignoring nonexistent directory "/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/local/include"] + ignore line: [ignoring nonexistent directory "/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/include"] + ignore line: [#include "..." search starts here:] + ignore line: [#include <...> search starts here:] + ignore line: [ /Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/include/c++/v1] + ignore line: [ /Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/lib/clang/18/include] + ignore line: [ /Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/include/i686-linux-android] + ignore line: [ /Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/include] + ignore line: [End of search list.] + ignore line: [[2/2] : && /Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/bin/clang++ --target=i686-none-linux-android23 --sysroot=/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot -g -DANDROID -fdata-sections -ffunction-sections -funwind-tables -fstack-protector-strong -no-canonical-prefixes -mstackrealign -D_FORTIFY_SOURCE=2 -Wformat -static-libstdc++ -Wl --build-id=sha1 -Wl --no-rosegment -Wl --no-undefined-version -Wl --fatal-warnings -Wl --no-undefined -Qunused-arguments -v CMakeFiles/cmTC_8f22f.dir/CMakeCXXCompilerABI.cpp.o -o cmTC_8f22f && :] + ignore line: [Android (12027248 +pgo -bolt +lto -mlgo based on r522817) clang version 18.0.1 (https://android.googlesource.com/toolchain/llvm-project d8003a456d14a3deb8054cdaa529ffbf02d9b262)] + ignore line: [Target: i686-none-linux-android23] + ignore line: [Thread model: posix] + ignore line: [InstalledDir: /Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/bin] + link line: [ "/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/bin/ld.lld" --sysroot=/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot -z now -z relro --hash-style=gnu --eh-frame-hdr -m elf_i386 -pie -dynamic-linker /system/bin/linker -o cmTC_8f22f /Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/lib/i686-linux-android/23/crtbegin_dynamic.o -L/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/lib/clang/18/lib/linux/i386 -L/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/lib/i686-linux-android/23 -L/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/lib/i686-linux-android -L/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/lib --build-id=sha1 --no-rosegment --no-undefined-version --fatal-warnings --no-undefined CMakeFiles/cmTC_8f22f.dir/CMakeCXXCompilerABI.cpp.o -Bstatic -lc++ -Bdynamic -lm /Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/lib/clang/18/lib/linux/libclang_rt.builtins-i686-android.a -l:libunwind.a -ldl -lc /Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/lib/clang/18/lib/linux/libclang_rt.builtins-i686-android.a -l:libunwind.a -ldl /Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/lib/i686-linux-android/23/crtend_android.o] + arg [/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/bin/ld.lld] ==> ignore + arg [--sysroot=/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot] ==> ignore + arg [-znow] ==> ignore + arg [-zrelro] ==> ignore + arg [--hash-style=gnu] ==> ignore + arg [--eh-frame-hdr] ==> ignore + arg [-m] ==> ignore + arg [elf_i386] ==> ignore + arg [-pie] ==> ignore + arg [-dynamic-linker] ==> ignore + arg [/system/bin/linker] ==> ignore + arg [-o] ==> ignore + arg [cmTC_8f22f] ==> ignore + arg [/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/lib/i686-linux-android/23/crtbegin_dynamic.o] ==> obj [/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/lib/i686-linux-android/23/crtbegin_dynamic.o] + arg [-L/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/lib/clang/18/lib/linux/i386] ==> dir [/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/lib/clang/18/lib/linux/i386] + arg [-L/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/lib/i686-linux-android/23] ==> dir [/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/lib/i686-linux-android/23] + arg [-L/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/lib/i686-linux-android] ==> dir [/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/lib/i686-linux-android] + arg [-L/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/lib] ==> dir [/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/lib] + arg [--build-id=sha1] ==> ignore + arg [--no-rosegment] ==> ignore + arg [--no-undefined-version] ==> ignore + arg [--fatal-warnings] ==> ignore + arg [--no-undefined] ==> ignore + arg [CMakeFiles/cmTC_8f22f.dir/CMakeCXXCompilerABI.cpp.o] ==> ignore + arg [-Bstatic] ==> search static + arg [-lc++] ==> lib [c++] + arg [-Bdynamic] ==> search dynamic + arg [-lm] ==> lib [m] + arg [/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/lib/clang/18/lib/linux/libclang_rt.builtins-i686-android.a] ==> lib [/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/lib/clang/18/lib/linux/libclang_rt.builtins-i686-android.a] + arg [-l:libunwind.a] ==> lib [-l:libunwind.a] + arg [-ldl] ==> lib [dl] + arg [-lc] ==> lib [c] + arg [/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/lib/clang/18/lib/linux/libclang_rt.builtins-i686-android.a] ==> lib [/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/lib/clang/18/lib/linux/libclang_rt.builtins-i686-android.a] + arg [-l:libunwind.a] ==> lib [-l:libunwind.a] + arg [-ldl] ==> lib [dl] + arg [/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/lib/i686-linux-android/23/crtend_android.o] ==> obj [/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/lib/i686-linux-android/23/crtend_android.o] + linker tool for 'CXX': /Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/bin/ld.lld + remove lib [/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/lib/clang/18/lib/linux/libclang_rt.builtins-i686-android.a] + remove lib [/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/lib/clang/18/lib/linux/libclang_rt.builtins-i686-android.a] + collapse library dir [/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/lib/clang/18/lib/linux/i386] ==> [/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/lib/clang/18/lib/linux/i386] + collapse library dir [/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/lib/i686-linux-android/23] ==> [/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/lib/i686-linux-android/23] + collapse library dir [/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/lib/i686-linux-android] ==> [/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/lib/i686-linux-android] + collapse library dir [/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/lib] ==> [/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/lib] + implicit libs: [c++;m;-l:libunwind.a;dl;c;-l:libunwind.a;dl] + implicit objs: [/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/lib/i686-linux-android/23/crtbegin_dynamic.o;/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/lib/i686-linux-android/23/crtend_android.o] + implicit dirs: [/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/lib/clang/18/lib/linux/i386;/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/lib/i686-linux-android/23;/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/lib/i686-linux-android;/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/lib] + implicit fwks: [] + + + - + kind: "message-v1" + backtrace: + - "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Internal/CMakeDetermineLinkerId.cmake:40 (message)" + - "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeDetermineCompilerABI.cmake:255 (cmake_determine_linker_id)" + - "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeTestCXXCompiler.cmake:26 (CMAKE_DETERMINE_COMPILER_ABI)" + - "CMakeLists.txt:2 (project)" + message: | + Running the CXX compiler's linker: "/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/bin/ld.lld" "-v" + LLD 18.0.1 (compatible with GNU linkers) +... diff --git a/siro_rider/android/app/.cxx/RelWithDebInfo/6t1m4b5v/x86/CMakeFiles/TargetDirectories.txt b/siro_rider/android/app/.cxx/RelWithDebInfo/6t1m4b5v/x86/CMakeFiles/TargetDirectories.txt new file mode 100644 index 0000000..6c6b6b7 --- /dev/null +++ b/siro_rider/android/app/.cxx/RelWithDebInfo/6t1m4b5v/x86/CMakeFiles/TargetDirectories.txt @@ -0,0 +1,3 @@ +/Users/hamzaaleghwairyeen/development/App/Intaleq/android/app/.cxx/RelWithDebInfo/6t1m4b5v/x86/CMakeFiles/native-lib.dir +/Users/hamzaaleghwairyeen/development/App/Intaleq/android/app/.cxx/RelWithDebInfo/6t1m4b5v/x86/CMakeFiles/edit_cache.dir +/Users/hamzaaleghwairyeen/development/App/Intaleq/android/app/.cxx/RelWithDebInfo/6t1m4b5v/x86/CMakeFiles/rebuild_cache.dir diff --git a/siro_rider/android/app/.cxx/RelWithDebInfo/6t1m4b5v/x86/CMakeFiles/cmake.check_cache b/siro_rider/android/app/.cxx/RelWithDebInfo/6t1m4b5v/x86/CMakeFiles/cmake.check_cache new file mode 100644 index 0000000..3dccd73 --- /dev/null +++ b/siro_rider/android/app/.cxx/RelWithDebInfo/6t1m4b5v/x86/CMakeFiles/cmake.check_cache @@ -0,0 +1 @@ +# This file is generated by cmake for dependency checking of the CMakeCache.txt file diff --git a/siro_rider/android/app/.cxx/RelWithDebInfo/6t1m4b5v/x86/CMakeFiles/native-lib.dir/native-lib.cpp.o b/siro_rider/android/app/.cxx/RelWithDebInfo/6t1m4b5v/x86/CMakeFiles/native-lib.dir/native-lib.cpp.o new file mode 100644 index 0000000..58dc9c3 Binary files /dev/null and b/siro_rider/android/app/.cxx/RelWithDebInfo/6t1m4b5v/x86/CMakeFiles/native-lib.dir/native-lib.cpp.o differ diff --git a/siro_rider/android/app/.cxx/RelWithDebInfo/6t1m4b5v/x86/CMakeFiles/rules.ninja b/siro_rider/android/app/.cxx/RelWithDebInfo/6t1m4b5v/x86/CMakeFiles/rules.ninja new file mode 100644 index 0000000..1b6f517 --- /dev/null +++ b/siro_rider/android/app/.cxx/RelWithDebInfo/6t1m4b5v/x86/CMakeFiles/rules.ninja @@ -0,0 +1,66 @@ +# CMAKE generated file: DO NOT EDIT! +# Generated by "Ninja" Generator, CMake Version 3.31 + +# This file contains all the rules used to get the outputs files +# built from the input files. +# It is included in the main 'build.ninja'. + +# ============================================================================= +# Project: intaleq +# Configurations: RelWithDebInfo +# ============================================================================= +# ============================================================================= + +############################################# +# Rule for compiling CXX files. + +rule CXX_COMPILER__native-lib_unscanned_RelWithDebInfo + depfile = $DEP_FILE + deps = gcc + command = ${LAUNCHER}${CODE_CHECK}/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/bin/clang++ --target=i686-none-linux-android23 --sysroot=/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot $DEFINES $INCLUDES $FLAGS -MD -MT $out -MF $DEP_FILE -o $out -c $in + description = Building CXX object $out + + +############################################# +# Rule for linking CXX shared library. + +rule CXX_SHARED_LIBRARY_LINKER__native-lib_RelWithDebInfo + depfile = $DEP_FILE + deps = gcc + command = $PRE_LINK && /Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/bin/clang++ --target=i686-none-linux-android23 --sysroot=/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot -fPIC $LANGUAGE_COMPILE_FLAGS $ARCH_FLAGS $LINK_FLAGS -shared $SONAME_FLAG$SONAME -o $TARGET_FILE $in $LINK_PATH $LINK_LIBRARIES && $POST_BUILD + description = Linking CXX shared library $TARGET_FILE + restat = $RESTAT + + +############################################# +# Rule for running custom commands. + +rule CUSTOM_COMMAND + command = $COMMAND + description = $DESC + + +############################################# +# Rule for re-running cmake. + +rule RERUN_CMAKE + command = /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/bin/cmake --regenerate-during-build -S/Users/hamzaaleghwairyeen/development/App/Intaleq/android/app/src/main/cpp -B/Users/hamzaaleghwairyeen/development/App/Intaleq/android/app/.cxx/RelWithDebInfo/6t1m4b5v/x86 + description = Re-running CMake... + generator = 1 + + +############################################# +# Rule for cleaning all built files. + +rule CLEAN + command = /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/bin/ninja $FILE_ARG -t clean $TARGETS + description = Cleaning all built files... + + +############################################# +# Rule for printing all primary targets available. + +rule HELP + command = /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/bin/ninja -t targets + description = All primary targets available: + diff --git a/siro_rider/android/app/.cxx/RelWithDebInfo/6t1m4b5v/x86/additional_project_files.txt b/siro_rider/android/app/.cxx/RelWithDebInfo/6t1m4b5v/x86/additional_project_files.txt new file mode 100644 index 0000000..e69de29 diff --git a/siro_rider/android/app/.cxx/RelWithDebInfo/6t1m4b5v/x86/android_gradle_build.json b/siro_rider/android/app/.cxx/RelWithDebInfo/6t1m4b5v/x86/android_gradle_build.json new file mode 100644 index 0000000..66a3a33 --- /dev/null +++ b/siro_rider/android/app/.cxx/RelWithDebInfo/6t1m4b5v/x86/android_gradle_build.json @@ -0,0 +1,38 @@ +{ + "buildFiles": [ + "/Users/hamzaaleghwairyeen/development/App/Intaleq/android/app/src/main/cpp/CMakeLists.txt" + ], + "cleanCommandsComponents": [ + [ + "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/bin/ninja", + "-C", + "/Users/hamzaaleghwairyeen/development/App/Intaleq/android/app/.cxx/RelWithDebInfo/6t1m4b5v/x86", + "clean" + ] + ], + "buildTargetsCommandComponents": [ + "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/bin/ninja", + "-C", + "/Users/hamzaaleghwairyeen/development/App/Intaleq/android/app/.cxx/RelWithDebInfo/6t1m4b5v/x86", + "{LIST_OF_TARGETS_TO_BUILD}" + ], + "libraries": { + "native-lib::@6890427a1f51a3e7e1df": { + "toolchain": "toolchain", + "abi": "x86", + "artifactName": "native-lib", + "output": "/Users/hamzaaleghwairyeen/development/App/Intaleq/build/app/intermediates/cxx/RelWithDebInfo/6t1m4b5v/obj/x86/libnative-lib.so", + "runtimeFiles": [] + } + }, + "toolchains": { + "toolchain": { + "cCompilerExecutable": "/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/bin/clang.lld", + "cppCompilerExecutable": "/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/bin/clang++.lld" + } + }, + "cFileExtensions": [], + "cppFileExtensions": [ + "cpp" + ] +} \ No newline at end of file diff --git a/siro_rider/android/app/.cxx/RelWithDebInfo/6t1m4b5v/x86/android_gradle_build_mini.json b/siro_rider/android/app/.cxx/RelWithDebInfo/6t1m4b5v/x86/android_gradle_build_mini.json new file mode 100644 index 0000000..ea999a7 --- /dev/null +++ b/siro_rider/android/app/.cxx/RelWithDebInfo/6t1m4b5v/x86/android_gradle_build_mini.json @@ -0,0 +1,27 @@ +{ + "buildFiles": [ + "/Users/hamzaaleghwairyeen/development/App/Intaleq/android/app/src/main/cpp/CMakeLists.txt" + ], + "cleanCommandsComponents": [ + [ + "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/bin/ninja", + "-C", + "/Users/hamzaaleghwairyeen/development/App/Intaleq/android/app/.cxx/RelWithDebInfo/6t1m4b5v/x86", + "clean" + ] + ], + "buildTargetsCommandComponents": [ + "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/bin/ninja", + "-C", + "/Users/hamzaaleghwairyeen/development/App/Intaleq/android/app/.cxx/RelWithDebInfo/6t1m4b5v/x86", + "{LIST_OF_TARGETS_TO_BUILD}" + ], + "libraries": { + "native-lib::@6890427a1f51a3e7e1df": { + "artifactName": "native-lib", + "abi": "x86", + "output": "/Users/hamzaaleghwairyeen/development/App/Intaleq/build/app/intermediates/cxx/RelWithDebInfo/6t1m4b5v/obj/x86/libnative-lib.so", + "runtimeFiles": [] + } + } +} \ No newline at end of file diff --git a/siro_rider/android/app/.cxx/RelWithDebInfo/6t1m4b5v/x86/build.ninja b/siro_rider/android/app/.cxx/RelWithDebInfo/6t1m4b5v/x86/build.ninja new file mode 100644 index 0000000..043f82d --- /dev/null +++ b/siro_rider/android/app/.cxx/RelWithDebInfo/6t1m4b5v/x86/build.ninja @@ -0,0 +1,156 @@ +# CMAKE generated file: DO NOT EDIT! +# Generated by "Ninja" Generator, CMake Version 3.31 + +# This file contains all the build statements describing the +# compilation DAG. + +# ============================================================================= +# Write statements declared in CMakeLists.txt: +# +# Which is the root file. +# ============================================================================= + +# ============================================================================= +# Project: intaleq +# Configurations: RelWithDebInfo +# ============================================================================= + +############################################# +# Minimal version of Ninja required by this file + +ninja_required_version = 1.5 + + +############################################# +# Set configuration variable for custom commands. + +CONFIGURATION = RelWithDebInfo +# ============================================================================= +# Include auxiliary files. + + +############################################# +# Include rules file. + +include CMakeFiles/rules.ninja + +# ============================================================================= + +############################################# +# Logical path to working directory; prefix for absolute paths. + +cmake_ninja_workdir = /Users/hamzaaleghwairyeen/development/App/Intaleq/android/app/.cxx/RelWithDebInfo/6t1m4b5v/x86/ +# ============================================================================= +# Object build statements for SHARED_LIBRARY target native-lib + + +############################################# +# Order-only phony target for native-lib + +build cmake_object_order_depends_target_native-lib: phony || . + +build CMakeFiles/native-lib.dir/native-lib.cpp.o: CXX_COMPILER__native-lib_unscanned_RelWithDebInfo /Users/hamzaaleghwairyeen/development/App/Intaleq/android/app/src/main/cpp/native-lib.cpp || cmake_object_order_depends_target_native-lib + DEFINES = -Dnative_lib_EXPORTS + DEP_FILE = CMakeFiles/native-lib.dir/native-lib.cpp.o.d + FLAGS = -g -DANDROID -fdata-sections -ffunction-sections -funwind-tables -fstack-protector-strong -no-canonical-prefixes -mstackrealign -D_FORTIFY_SOURCE=2 -Wformat -Werror=format-security -O2 -g -DNDEBUG -fPIC + OBJECT_DIR = CMakeFiles/native-lib.dir + OBJECT_FILE_DIR = CMakeFiles/native-lib.dir + TARGET_COMPILE_PDB = CMakeFiles/native-lib.dir/ + TARGET_PDB = /Users/hamzaaleghwairyeen/development/App/Intaleq/build/app/intermediates/cxx/RelWithDebInfo/6t1m4b5v/obj/x86/libnative-lib.pdb + + +# ============================================================================= +# Link build statements for SHARED_LIBRARY target native-lib + + +############################################# +# Link the shared library /Users/hamzaaleghwairyeen/development/App/Intaleq/build/app/intermediates/cxx/RelWithDebInfo/6t1m4b5v/obj/x86/libnative-lib.so + +build /Users/hamzaaleghwairyeen/development/App/Intaleq/build/app/intermediates/cxx/RelWithDebInfo/6t1m4b5v/obj/x86/libnative-lib.so: CXX_SHARED_LIBRARY_LINKER__native-lib_RelWithDebInfo CMakeFiles/native-lib.dir/native-lib.cpp.o | /Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/lib/i686-linux-android/23/liblog.so + DEP_FILE = CMakeFiles/native-lib.dir/link.d + LANGUAGE_COMPILE_FLAGS = -g -DANDROID -fdata-sections -ffunction-sections -funwind-tables -fstack-protector-strong -no-canonical-prefixes -mstackrealign -D_FORTIFY_SOURCE=2 -Wformat -Werror=format-security -O2 -g -DNDEBUG + LINK_FLAGS = -static-libstdc++ -Wl,--build-id=sha1 -Wl,--no-rosegment -Wl,--no-undefined-version -Wl,--fatal-warnings -Wl,--no-undefined -Qunused-arguments -Wl,--gc-sections -Xlinker --dependency-file=CMakeFiles/native-lib.dir/link.d + LINK_LIBRARIES = /Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/lib/i686-linux-android/23/liblog.so -latomic -lm + OBJECT_DIR = CMakeFiles/native-lib.dir + POST_BUILD = : + PRE_LINK = : + SONAME = libnative-lib.so + SONAME_FLAG = -Wl,-soname, + TARGET_COMPILE_PDB = CMakeFiles/native-lib.dir/ + TARGET_FILE = /Users/hamzaaleghwairyeen/development/App/Intaleq/build/app/intermediates/cxx/RelWithDebInfo/6t1m4b5v/obj/x86/libnative-lib.so + TARGET_PDB = /Users/hamzaaleghwairyeen/development/App/Intaleq/build/app/intermediates/cxx/RelWithDebInfo/6t1m4b5v/obj/x86/libnative-lib.pdb + + +############################################# +# Utility command for edit_cache + +build CMakeFiles/edit_cache.util: CUSTOM_COMMAND + COMMAND = cd /Users/hamzaaleghwairyeen/development/App/Intaleq/android/app/.cxx/RelWithDebInfo/6t1m4b5v/x86 && /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/bin/ccmake -S/Users/hamzaaleghwairyeen/development/App/Intaleq/android/app/src/main/cpp -B/Users/hamzaaleghwairyeen/development/App/Intaleq/android/app/.cxx/RelWithDebInfo/6t1m4b5v/x86 + DESC = Running CMake cache editor... + pool = console + restat = 1 + +build edit_cache: phony CMakeFiles/edit_cache.util + + +############################################# +# Utility command for rebuild_cache + +build CMakeFiles/rebuild_cache.util: CUSTOM_COMMAND + COMMAND = cd /Users/hamzaaleghwairyeen/development/App/Intaleq/android/app/.cxx/RelWithDebInfo/6t1m4b5v/x86 && /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/bin/cmake --regenerate-during-build -S/Users/hamzaaleghwairyeen/development/App/Intaleq/android/app/src/main/cpp -B/Users/hamzaaleghwairyeen/development/App/Intaleq/android/app/.cxx/RelWithDebInfo/6t1m4b5v/x86 + DESC = Running CMake to regenerate build system... + pool = console + restat = 1 + +build rebuild_cache: phony CMakeFiles/rebuild_cache.util + +# ============================================================================= +# Target aliases. + +build libnative-lib.so: phony /Users/hamzaaleghwairyeen/development/App/Intaleq/build/app/intermediates/cxx/RelWithDebInfo/6t1m4b5v/obj/x86/libnative-lib.so + +build native-lib: phony /Users/hamzaaleghwairyeen/development/App/Intaleq/build/app/intermediates/cxx/RelWithDebInfo/6t1m4b5v/obj/x86/libnative-lib.so + +# ============================================================================= +# Folder targets. + +# ============================================================================= + +############################################# +# Folder: /Users/hamzaaleghwairyeen/development/App/Intaleq/android/app/.cxx/RelWithDebInfo/6t1m4b5v/x86 + +build all: phony /Users/hamzaaleghwairyeen/development/App/Intaleq/build/app/intermediates/cxx/RelWithDebInfo/6t1m4b5v/obj/x86/libnative-lib.so + +# ============================================================================= +# Built-in targets + + +############################################# +# Re-run CMake if any of its inputs changed. + +build build.ninja: RERUN_CMAKE | /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeCCompiler.cmake.in /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeCCompilerABI.c /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeCInformation.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeCXXCompiler.cmake.in /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeCXXCompilerABI.cpp /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeCXXInformation.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeCommonLanguageInclude.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeCompilerIdDetection.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeDetermineCCompiler.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeDetermineCXXCompiler.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeDetermineCompiler.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeDetermineCompilerABI.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeDetermineCompilerId.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeDetermineCompilerSupport.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeDetermineSystem.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeFindBinUtils.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeGenericSystem.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeInitializeConfigs.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeLanguageInformation.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeParseImplicitIncludeInfo.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeParseImplicitLinkInfo.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeParseLibraryArchitecture.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeSystem.cmake.in /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeSystemSpecificInformation.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeSystemSpecificInitialize.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeTestCCompiler.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeTestCXXCompiler.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeTestCompilerCommon.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/ADSP-DetermineCompiler.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/ARMCC-DetermineCompiler.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/ARMClang-DetermineCompiler.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/AppleClang-DetermineCompiler.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/Borland-DetermineCompiler.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/Bruce-C-DetermineCompiler.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/CMakeCommonCompilerMacros.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/Clang-C.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/Clang-CXX-CXXImportStd.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/Clang-CXX.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/Clang-DetermineCompiler.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/Clang-DetermineCompilerInternal.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/Clang-FindBinUtils.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/Clang.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/Compaq-C-DetermineCompiler.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/Compaq-CXX-DetermineCompiler.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/Cray-DetermineCompiler.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/CrayClang-DetermineCompiler.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/Embarcadero-DetermineCompiler.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/Fujitsu-DetermineCompiler.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/FujitsuClang-DetermineCompiler.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/GHS-DetermineCompiler.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/GNU-C-DetermineCompiler.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/GNU-CXX-DetermineCompiler.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/GNU.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/HP-C-DetermineCompiler.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/HP-CXX-DetermineCompiler.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/IAR-DetermineCompiler.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/IBMCPP-C-DetermineVersionInternal.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/IBMCPP-CXX-DetermineVersionInternal.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/IBMClang-C-DetermineCompiler.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/IBMClang-CXX-DetermineCompiler.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/Intel-DetermineCompiler.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/IntelLLVM-DetermineCompiler.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/LCC-C-DetermineCompiler.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/LCC-CXX-DetermineCompiler.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/MSVC-DetermineCompiler.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/NVHPC-DetermineCompiler.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/NVIDIA-DetermineCompiler.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/OpenWatcom-DetermineCompiler.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/OrangeC-DetermineCompiler.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/PGI-DetermineCompiler.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/PathScale-DetermineCompiler.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/SCO-DetermineCompiler.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/SDCC-C-DetermineCompiler.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/SunPro-C-DetermineCompiler.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/SunPro-CXX-DetermineCompiler.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/TI-DetermineCompiler.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/TIClang-DetermineCompiler.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/Tasking-DetermineCompiler.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/TinyCC-C-DetermineCompiler.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/VisualAge-C-DetermineCompiler.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/VisualAge-CXX-DetermineCompiler.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/Watcom-DetermineCompiler.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/XL-C-DetermineCompiler.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/XL-CXX-DetermineCompiler.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/XLClang-C-DetermineCompiler.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/XLClang-CXX-DetermineCompiler.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/zOS-C-DetermineCompiler.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/zOS-CXX-DetermineCompiler.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Internal/CMakeCLinkerInformation.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Internal/CMakeCXXLinkerInformation.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Internal/CMakeCommonLinkerInformation.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Internal/CMakeDetermineLinkerId.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Internal/FeatureTesting.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Linker/GNU.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Linker/LLD-C.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Linker/LLD-CXX.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Linker/LLD.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Platform/Android-Clang-C.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Platform/Android-Clang-CXX.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Platform/Android-Clang.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Platform/Android-Determine-C.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Platform/Android-Determine-CXX.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Platform/Android-Determine.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Platform/Android-Initialize.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Platform/Android.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Platform/Android/Determine-Compiler.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Platform/Linker/Android-LLD-C.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Platform/Linker/Android-LLD-CXX.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Platform/Linker/GNU.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Platform/Linker/Linux-GNU.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Platform/Linker/Linux-LLD-C.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Platform/Linker/Linux-LLD-CXX.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Platform/Linker/Linux-LLD.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Platform/Linux-Initialize.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Platform/Linux.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Platform/UnixPaths.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/build/cmake/abis.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/build/cmake/android-legacy.toolchain.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/build/cmake/android.toolchain.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/build/cmake/flags.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/build/cmake/hooks/pre/Android-Clang.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/build/cmake/hooks/pre/Android-Determine.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/build/cmake/hooks/pre/Android-Initialize.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/build/cmake/hooks/pre/Android.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/build/cmake/hooks/pre/Determine-Compiler.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/build/cmake/platforms.cmake /Users/hamzaaleghwairyeen/development/App/Intaleq/android/app/src/main/cpp/CMakeLists.txt CMakeCache.txt CMakeFiles/3.31.5-g6cf5163/CMakeCCompiler.cmake CMakeFiles/3.31.5-g6cf5163/CMakeCXXCompiler.cmake CMakeFiles/3.31.5-g6cf5163/CMakeSystem.cmake + pool = console + + +############################################# +# A missing CMake input file is not an error. + +build /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeCCompiler.cmake.in /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeCCompilerABI.c /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeCInformation.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeCXXCompiler.cmake.in /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeCXXCompilerABI.cpp /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeCXXInformation.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeCommonLanguageInclude.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeCompilerIdDetection.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeDetermineCCompiler.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeDetermineCXXCompiler.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeDetermineCompiler.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeDetermineCompilerABI.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeDetermineCompilerId.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeDetermineCompilerSupport.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeDetermineSystem.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeFindBinUtils.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeGenericSystem.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeInitializeConfigs.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeLanguageInformation.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeParseImplicitIncludeInfo.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeParseImplicitLinkInfo.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeParseLibraryArchitecture.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeSystem.cmake.in /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeSystemSpecificInformation.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeSystemSpecificInitialize.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeTestCCompiler.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeTestCXXCompiler.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeTestCompilerCommon.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/ADSP-DetermineCompiler.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/ARMCC-DetermineCompiler.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/ARMClang-DetermineCompiler.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/AppleClang-DetermineCompiler.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/Borland-DetermineCompiler.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/Bruce-C-DetermineCompiler.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/CMakeCommonCompilerMacros.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/Clang-C.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/Clang-CXX-CXXImportStd.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/Clang-CXX.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/Clang-DetermineCompiler.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/Clang-DetermineCompilerInternal.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/Clang-FindBinUtils.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/Clang.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/Compaq-C-DetermineCompiler.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/Compaq-CXX-DetermineCompiler.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/Cray-DetermineCompiler.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/CrayClang-DetermineCompiler.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/Embarcadero-DetermineCompiler.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/Fujitsu-DetermineCompiler.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/FujitsuClang-DetermineCompiler.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/GHS-DetermineCompiler.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/GNU-C-DetermineCompiler.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/GNU-CXX-DetermineCompiler.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/GNU.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/HP-C-DetermineCompiler.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/HP-CXX-DetermineCompiler.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/IAR-DetermineCompiler.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/IBMCPP-C-DetermineVersionInternal.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/IBMCPP-CXX-DetermineVersionInternal.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/IBMClang-C-DetermineCompiler.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/IBMClang-CXX-DetermineCompiler.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/Intel-DetermineCompiler.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/IntelLLVM-DetermineCompiler.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/LCC-C-DetermineCompiler.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/LCC-CXX-DetermineCompiler.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/MSVC-DetermineCompiler.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/NVHPC-DetermineCompiler.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/NVIDIA-DetermineCompiler.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/OpenWatcom-DetermineCompiler.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/OrangeC-DetermineCompiler.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/PGI-DetermineCompiler.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/PathScale-DetermineCompiler.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/SCO-DetermineCompiler.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/SDCC-C-DetermineCompiler.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/SunPro-C-DetermineCompiler.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/SunPro-CXX-DetermineCompiler.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/TI-DetermineCompiler.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/TIClang-DetermineCompiler.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/Tasking-DetermineCompiler.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/TinyCC-C-DetermineCompiler.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/VisualAge-C-DetermineCompiler.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/VisualAge-CXX-DetermineCompiler.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/Watcom-DetermineCompiler.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/XL-C-DetermineCompiler.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/XL-CXX-DetermineCompiler.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/XLClang-C-DetermineCompiler.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/XLClang-CXX-DetermineCompiler.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/zOS-C-DetermineCompiler.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/zOS-CXX-DetermineCompiler.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Internal/CMakeCLinkerInformation.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Internal/CMakeCXXLinkerInformation.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Internal/CMakeCommonLinkerInformation.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Internal/CMakeDetermineLinkerId.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Internal/FeatureTesting.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Linker/GNU.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Linker/LLD-C.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Linker/LLD-CXX.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Linker/LLD.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Platform/Android-Clang-C.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Platform/Android-Clang-CXX.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Platform/Android-Clang.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Platform/Android-Determine-C.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Platform/Android-Determine-CXX.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Platform/Android-Determine.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Platform/Android-Initialize.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Platform/Android.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Platform/Android/Determine-Compiler.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Platform/Linker/Android-LLD-C.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Platform/Linker/Android-LLD-CXX.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Platform/Linker/GNU.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Platform/Linker/Linux-GNU.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Platform/Linker/Linux-LLD-C.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Platform/Linker/Linux-LLD-CXX.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Platform/Linker/Linux-LLD.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Platform/Linux-Initialize.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Platform/Linux.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Platform/UnixPaths.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/build/cmake/abis.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/build/cmake/android-legacy.toolchain.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/build/cmake/android.toolchain.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/build/cmake/flags.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/build/cmake/hooks/pre/Android-Clang.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/build/cmake/hooks/pre/Android-Determine.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/build/cmake/hooks/pre/Android-Initialize.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/build/cmake/hooks/pre/Android.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/build/cmake/hooks/pre/Determine-Compiler.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/build/cmake/platforms.cmake /Users/hamzaaleghwairyeen/development/App/Intaleq/android/app/src/main/cpp/CMakeLists.txt CMakeCache.txt CMakeFiles/3.31.5-g6cf5163/CMakeCCompiler.cmake CMakeFiles/3.31.5-g6cf5163/CMakeCXXCompiler.cmake CMakeFiles/3.31.5-g6cf5163/CMakeSystem.cmake: phony + + +############################################# +# Clean all the built files. + +build clean: CLEAN + + +############################################# +# Print all primary targets available. + +build help: HELP + + +############################################# +# Make the all target the default. + +default all diff --git a/siro_rider/android/app/.cxx/RelWithDebInfo/6t1m4b5v/x86/build_file_index.txt b/siro_rider/android/app/.cxx/RelWithDebInfo/6t1m4b5v/x86/build_file_index.txt new file mode 100644 index 0000000..661f7ae --- /dev/null +++ b/siro_rider/android/app/.cxx/RelWithDebInfo/6t1m4b5v/x86/build_file_index.txt @@ -0,0 +1 @@ +/Users/hamzaaleghwairyeen/development/App/Intaleq/android/app/src/main/cpp/CMakeLists.txt \ No newline at end of file diff --git a/siro_rider/android/app/.cxx/RelWithDebInfo/6t1m4b5v/x86/cmake_install.cmake b/siro_rider/android/app/.cxx/RelWithDebInfo/6t1m4b5v/x86/cmake_install.cmake new file mode 100644 index 0000000..4c6114a --- /dev/null +++ b/siro_rider/android/app/.cxx/RelWithDebInfo/6t1m4b5v/x86/cmake_install.cmake @@ -0,0 +1,66 @@ +# Install script for directory: /Users/hamzaaleghwairyeen/development/App/Intaleq/android/app/src/main/cpp + +# Set the install prefix +if(NOT DEFINED CMAKE_INSTALL_PREFIX) + set(CMAKE_INSTALL_PREFIX "/usr/local") +endif() +string(REGEX REPLACE "/$" "" CMAKE_INSTALL_PREFIX "${CMAKE_INSTALL_PREFIX}") + +# Set the install configuration name. +if(NOT DEFINED CMAKE_INSTALL_CONFIG_NAME) + if(BUILD_TYPE) + string(REGEX REPLACE "^[^A-Za-z0-9_]+" "" + CMAKE_INSTALL_CONFIG_NAME "${BUILD_TYPE}") + else() + set(CMAKE_INSTALL_CONFIG_NAME "RelWithDebInfo") + endif() + message(STATUS "Install configuration: \"${CMAKE_INSTALL_CONFIG_NAME}\"") +endif() + +# Set the component getting installed. +if(NOT CMAKE_INSTALL_COMPONENT) + if(COMPONENT) + message(STATUS "Install component: \"${COMPONENT}\"") + set(CMAKE_INSTALL_COMPONENT "${COMPONENT}") + else() + set(CMAKE_INSTALL_COMPONENT) + endif() +endif() + +# Install shared libraries without execute permission? +if(NOT DEFINED CMAKE_INSTALL_SO_NO_EXE) + set(CMAKE_INSTALL_SO_NO_EXE "0") +endif() + +# Is this installation the result of a crosscompile? +if(NOT DEFINED CMAKE_CROSSCOMPILING) + set(CMAKE_CROSSCOMPILING "TRUE") +endif() + +# Set path to fallback-tool for dependency-resolution. +if(NOT DEFINED CMAKE_OBJDUMP) + set(CMAKE_OBJDUMP "/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/bin/llvm-objdump") +endif() + +string(REPLACE ";" "\n" CMAKE_INSTALL_MANIFEST_CONTENT + "${CMAKE_INSTALL_MANIFEST_FILES}") +if(CMAKE_INSTALL_LOCAL_ONLY) + file(WRITE "/Users/hamzaaleghwairyeen/development/App/Intaleq/android/app/.cxx/RelWithDebInfo/6t1m4b5v/x86/install_local_manifest.txt" + "${CMAKE_INSTALL_MANIFEST_CONTENT}") +endif() +if(CMAKE_INSTALL_COMPONENT) + if(CMAKE_INSTALL_COMPONENT MATCHES "^[a-zA-Z0-9_.+-]+$") + set(CMAKE_INSTALL_MANIFEST "install_manifest_${CMAKE_INSTALL_COMPONENT}.txt") + else() + string(MD5 CMAKE_INST_COMP_HASH "${CMAKE_INSTALL_COMPONENT}") + set(CMAKE_INSTALL_MANIFEST "install_manifest_${CMAKE_INST_COMP_HASH}.txt") + unset(CMAKE_INST_COMP_HASH) + endif() +else() + set(CMAKE_INSTALL_MANIFEST "install_manifest.txt") +endif() + +if(NOT CMAKE_INSTALL_LOCAL_ONLY) + file(WRITE "/Users/hamzaaleghwairyeen/development/App/Intaleq/android/app/.cxx/RelWithDebInfo/6t1m4b5v/x86/${CMAKE_INSTALL_MANIFEST}" + "${CMAKE_INSTALL_MANIFEST_CONTENT}") +endif() diff --git a/siro_rider/android/app/.cxx/RelWithDebInfo/6t1m4b5v/x86/compile_commands.json b/siro_rider/android/app/.cxx/RelWithDebInfo/6t1m4b5v/x86/compile_commands.json new file mode 100644 index 0000000..346cb3a --- /dev/null +++ b/siro_rider/android/app/.cxx/RelWithDebInfo/6t1m4b5v/x86/compile_commands.json @@ -0,0 +1,8 @@ +[ +{ + "directory": "/Users/hamzaaleghwairyeen/development/App/Intaleq/android/app/.cxx/RelWithDebInfo/6t1m4b5v/x86", + "command": "/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/bin/clang++ --target=i686-none-linux-android23 --sysroot=/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot -Dnative_lib_EXPORTS -g -DANDROID -fdata-sections -ffunction-sections -funwind-tables -fstack-protector-strong -no-canonical-prefixes -mstackrealign -D_FORTIFY_SOURCE=2 -Wformat -Werror=format-security -O2 -g -DNDEBUG -fPIC -o CMakeFiles/native-lib.dir/native-lib.cpp.o -c /Users/hamzaaleghwairyeen/development/App/Intaleq/android/app/src/main/cpp/native-lib.cpp", + "file": "/Users/hamzaaleghwairyeen/development/App/Intaleq/android/app/src/main/cpp/native-lib.cpp", + "output": "CMakeFiles/native-lib.dir/native-lib.cpp.o" +} +] \ No newline at end of file diff --git a/siro_rider/android/app/.cxx/RelWithDebInfo/6t1m4b5v/x86/compile_commands.json.bin b/siro_rider/android/app/.cxx/RelWithDebInfo/6t1m4b5v/x86/compile_commands.json.bin new file mode 100644 index 0000000..0346dc2 Binary files /dev/null and b/siro_rider/android/app/.cxx/RelWithDebInfo/6t1m4b5v/x86/compile_commands.json.bin differ diff --git a/siro_rider/android/app/.cxx/RelWithDebInfo/6t1m4b5v/x86/configure_fingerprint.bin b/siro_rider/android/app/.cxx/RelWithDebInfo/6t1m4b5v/x86/configure_fingerprint.bin new file mode 100644 index 0000000..a3b6477 --- /dev/null +++ b/siro_rider/android/app/.cxx/RelWithDebInfo/6t1m4b5v/x86/configure_fingerprint.bin @@ -0,0 +1,29 @@ +C/C++ Structured Log +} +{/Users/hamzaaleghwairyeen/development/App/Intaleq/android/app/.cxx/RelWithDebInfo/6t1m4b5v/x86/additional_project_files.txtC +A +?com.android.build.gradle.internal.cxx.io.EncodedFileFingerPrint  Њ3  ę2| +z +x/Users/hamzaaleghwairyeen/development/App/Intaleq/android/app/.cxx/RelWithDebInfo/6t1m4b5v/x86/android_gradle_build.json  Њ3 + ę2 + +}/Users/hamzaaleghwairyeen/development/App/Intaleq/android/app/.cxx/RelWithDebInfo/6t1m4b5v/x86/android_gradle_build_mini.json  Њ3 ę2n +l +j/Users/hamzaaleghwairyeen/development/App/Intaleq/android/app/.cxx/RelWithDebInfo/6t1m4b5v/x86/build.ninja  Њ3 ę2r +p +n/Users/hamzaaleghwairyeen/development/App/Intaleq/android/app/.cxx/RelWithDebInfo/6t1m4b5v/x86/build.ninja.txt  Њ3w +u +s/Users/hamzaaleghwairyeen/development/App/Intaleq/android/app/.cxx/RelWithDebInfo/6t1m4b5v/x86/build_file_index.txt  Њ3 Y ę2x +v +t/Users/hamzaaleghwairyeen/development/App/Intaleq/android/app/.cxx/RelWithDebInfo/6t1m4b5v/x86/compile_commands.json  Њ3 ę2| +z +x/Users/hamzaaleghwairyeen/development/App/Intaleq/android/app/.cxx/RelWithDebInfo/6t1m4b5v/x86/compile_commands.json.bin  Њ3  ę2 + +~/Users/hamzaaleghwairyeen/development/App/Intaleq/android/app/.cxx/RelWithDebInfo/6t1m4b5v/x86/metadata_generation_command.txt  Њ3 + ę2u +s +q/Users/hamzaaleghwairyeen/development/App/Intaleq/android/app/.cxx/RelWithDebInfo/6t1m4b5v/x86/prefab_config.json  Њ3  ( ę2z +x +v/Users/hamzaaleghwairyeen/development/App/Intaleq/android/app/.cxx/RelWithDebInfo/6t1m4b5v/x86/symbol_folder_index.txt  Њ3  m ę2] +[ +Y/Users/hamzaaleghwairyeen/development/App/Intaleq/android/app/src/main/cpp/CMakeLists.txt  Њ3  ޮ2 \ No newline at end of file diff --git a/siro_rider/android/app/.cxx/RelWithDebInfo/6t1m4b5v/x86/metadata_generation_command.txt b/siro_rider/android/app/.cxx/RelWithDebInfo/6t1m4b5v/x86/metadata_generation_command.txt new file mode 100644 index 0000000..a87eab6 --- /dev/null +++ b/siro_rider/android/app/.cxx/RelWithDebInfo/6t1m4b5v/x86/metadata_generation_command.txt @@ -0,0 +1,18 @@ + -H/Users/hamzaaleghwairyeen/development/App/Intaleq/android/app/src/main/cpp +-DCMAKE_SYSTEM_NAME=Android +-DCMAKE_EXPORT_COMPILE_COMMANDS=ON +-DCMAKE_SYSTEM_VERSION=23 +-DANDROID_PLATFORM=android-23 +-DANDROID_ABI=x86 +-DCMAKE_ANDROID_ARCH_ABI=x86 +-DANDROID_NDK=/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973 +-DCMAKE_ANDROID_NDK=/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973 +-DCMAKE_TOOLCHAIN_FILE=/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/build/cmake/android.toolchain.cmake +-DCMAKE_MAKE_PROGRAM=/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/bin/ninja +-DCMAKE_LIBRARY_OUTPUT_DIRECTORY=/Users/hamzaaleghwairyeen/development/App/Intaleq/build/app/intermediates/cxx/RelWithDebInfo/6t1m4b5v/obj/x86 +-DCMAKE_RUNTIME_OUTPUT_DIRECTORY=/Users/hamzaaleghwairyeen/development/App/Intaleq/build/app/intermediates/cxx/RelWithDebInfo/6t1m4b5v/obj/x86 +-DCMAKE_BUILD_TYPE=RelWithDebInfo +-B/Users/hamzaaleghwairyeen/development/App/Intaleq/android/app/.cxx/RelWithDebInfo/6t1m4b5v/x86 +-GNinja + Build command args: [] + Version: 2 \ No newline at end of file diff --git a/siro_rider/android/app/.cxx/RelWithDebInfo/6t1m4b5v/x86/prefab_config.json b/siro_rider/android/app/.cxx/RelWithDebInfo/6t1m4b5v/x86/prefab_config.json new file mode 100644 index 0000000..e799de8 --- /dev/null +++ b/siro_rider/android/app/.cxx/RelWithDebInfo/6t1m4b5v/x86/prefab_config.json @@ -0,0 +1,4 @@ +{ + "enabled": false, + "packages": [] +} \ No newline at end of file diff --git a/siro_rider/android/app/.cxx/RelWithDebInfo/6t1m4b5v/x86/symbol_folder_index.txt b/siro_rider/android/app/.cxx/RelWithDebInfo/6t1m4b5v/x86/symbol_folder_index.txt new file mode 100644 index 0000000..ace767f --- /dev/null +++ b/siro_rider/android/app/.cxx/RelWithDebInfo/6t1m4b5v/x86/symbol_folder_index.txt @@ -0,0 +1 @@ +/Users/hamzaaleghwairyeen/development/App/Intaleq/build/app/intermediates/cxx/RelWithDebInfo/6t1m4b5v/obj/x86 \ No newline at end of file diff --git a/siro_rider/android/app/.cxx/RelWithDebInfo/6t1m4b5v/x86_64/.cmake/api/v1/query/client-agp/cache-v2 b/siro_rider/android/app/.cxx/RelWithDebInfo/6t1m4b5v/x86_64/.cmake/api/v1/query/client-agp/cache-v2 new file mode 100644 index 0000000..e69de29 diff --git a/siro_rider/android/app/.cxx/RelWithDebInfo/6t1m4b5v/x86_64/.cmake/api/v1/query/client-agp/cmakeFiles-v1 b/siro_rider/android/app/.cxx/RelWithDebInfo/6t1m4b5v/x86_64/.cmake/api/v1/query/client-agp/cmakeFiles-v1 new file mode 100644 index 0000000..e69de29 diff --git a/siro_rider/android/app/.cxx/RelWithDebInfo/6t1m4b5v/x86_64/.cmake/api/v1/query/client-agp/codemodel-v2 b/siro_rider/android/app/.cxx/RelWithDebInfo/6t1m4b5v/x86_64/.cmake/api/v1/query/client-agp/codemodel-v2 new file mode 100644 index 0000000..e69de29 diff --git a/siro_rider/android/app/.cxx/RelWithDebInfo/6t1m4b5v/x86_64/.cmake/api/v1/reply/cache-v2-85ff97705f04cc8292b7.json b/siro_rider/android/app/.cxx/RelWithDebInfo/6t1m4b5v/x86_64/.cmake/api/v1/reply/cache-v2-85ff97705f04cc8292b7.json new file mode 100644 index 0000000..720cb4e --- /dev/null +++ b/siro_rider/android/app/.cxx/RelWithDebInfo/6t1m4b5v/x86_64/.cmake/api/v1/reply/cache-v2-85ff97705f04cc8292b7.json @@ -0,0 +1,1479 @@ +{ + "entries" : + [ + { + "name" : "ANDROID_ABI", + "properties" : + [ + { + "name" : "HELPSTRING", + "value" : "No help, variable specified on the command line." + } + ], + "type" : "UNINITIALIZED", + "value" : "x86_64" + }, + { + "name" : "ANDROID_NDK", + "properties" : + [ + { + "name" : "HELPSTRING", + "value" : "No help, variable specified on the command line." + } + ], + "type" : "UNINITIALIZED", + "value" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973" + }, + { + "name" : "ANDROID_PLATFORM", + "properties" : + [ + { + "name" : "HELPSTRING", + "value" : "No help, variable specified on the command line." + } + ], + "type" : "UNINITIALIZED", + "value" : "android-23" + }, + { + "name" : "CMAKE_ADDR2LINE", + "properties" : + [ + { + "name" : "ADVANCED", + "value" : "1" + }, + { + "name" : "HELPSTRING", + "value" : "Path to a program." + } + ], + "type" : "FILEPATH", + "value" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/bin/llvm-addr2line" + }, + { + "name" : "CMAKE_ANDROID_ARCH_ABI", + "properties" : + [ + { + "name" : "HELPSTRING", + "value" : "No help, variable specified on the command line." + } + ], + "type" : "UNINITIALIZED", + "value" : "x86_64" + }, + { + "name" : "CMAKE_ANDROID_NDK", + "properties" : + [ + { + "name" : "HELPSTRING", + "value" : "No help, variable specified on the command line." + } + ], + "type" : "UNINITIALIZED", + "value" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973" + }, + { + "name" : "CMAKE_AR", + "properties" : + [ + { + "name" : "ADVANCED", + "value" : "1" + }, + { + "name" : "HELPSTRING", + "value" : "Archiver" + } + ], + "type" : "FILEPATH", + "value" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/bin/llvm-ar" + }, + { + "name" : "CMAKE_ASM_FLAGS", + "properties" : + [ + { + "name" : "HELPSTRING", + "value" : "Flags used by the compiler during all build types." + } + ], + "type" : "STRING", + "value" : "" + }, + { + "name" : "CMAKE_ASM_FLAGS_DEBUG", + "properties" : + [ + { + "name" : "HELPSTRING", + "value" : "Flags used by the compiler during debug builds." + } + ], + "type" : "STRING", + "value" : "" + }, + { + "name" : "CMAKE_ASM_FLAGS_RELEASE", + "properties" : + [ + { + "name" : "HELPSTRING", + "value" : "Flags used by the compiler during release builds." + } + ], + "type" : "STRING", + "value" : "" + }, + { + "name" : "CMAKE_BUILD_TYPE", + "properties" : + [ + { + "name" : "HELPSTRING", + "value" : "Choose the type of build, options are: None Debug Release RelWithDebInfo MinSizeRel ..." + } + ], + "type" : "STRING", + "value" : "RelWithDebInfo" + }, + { + "name" : "CMAKE_CACHEFILE_DIR", + "properties" : + [ + { + "name" : "HELPSTRING", + "value" : "This is the directory where this CMakeCache.txt was created" + } + ], + "type" : "INTERNAL", + "value" : "/Users/hamzaaleghwairyeen/development/App/Intaleq/android/app/.cxx/RelWithDebInfo/6t1m4b5v/x86_64" + }, + { + "name" : "CMAKE_CACHE_MAJOR_VERSION", + "properties" : + [ + { + "name" : "HELPSTRING", + "value" : "Major version of cmake used to create the current loaded cache" + } + ], + "type" : "INTERNAL", + "value" : "3" + }, + { + "name" : "CMAKE_CACHE_MINOR_VERSION", + "properties" : + [ + { + "name" : "HELPSTRING", + "value" : "Minor version of cmake used to create the current loaded cache" + } + ], + "type" : "INTERNAL", + "value" : "31" + }, + { + "name" : "CMAKE_CACHE_PATCH_VERSION", + "properties" : + [ + { + "name" : "HELPSTRING", + "value" : "Patch version of cmake used to create the current loaded cache" + } + ], + "type" : "INTERNAL", + "value" : "5" + }, + { + "name" : "CMAKE_COMMAND", + "properties" : + [ + { + "name" : "HELPSTRING", + "value" : "Path to CMake executable." + } + ], + "type" : "INTERNAL", + "value" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/bin/cmake" + }, + { + "name" : "CMAKE_CPACK_COMMAND", + "properties" : + [ + { + "name" : "HELPSTRING", + "value" : "Path to cpack program executable." + } + ], + "type" : "INTERNAL", + "value" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/bin/cpack" + }, + { + "name" : "CMAKE_CTEST_COMMAND", + "properties" : + [ + { + "name" : "HELPSTRING", + "value" : "Path to ctest program executable." + } + ], + "type" : "INTERNAL", + "value" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/bin/ctest" + }, + { + "name" : "CMAKE_CXX_COMPILER", + "properties" : + [ + { + "name" : "ADVANCED", + "value" : "1" + }, + { + "name" : "HELPSTRING", + "value" : "" + } + ], + "type" : "UNINITIALIZED", + "value" : "" + }, + { + "name" : "CMAKE_CXX_COMPILER_AR", + "properties" : + [ + { + "name" : "ADVANCED", + "value" : "1" + }, + { + "name" : "HELPSTRING", + "value" : "LLVM archiver" + } + ], + "type" : "FILEPATH", + "value" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/bin/llvm-ar" + }, + { + "name" : "CMAKE_CXX_COMPILER_CLANG_SCAN_DEPS", + "properties" : + [ + { + "name" : "ADVANCED", + "value" : "1" + }, + { + "name" : "HELPSTRING", + "value" : "`clang-scan-deps` dependency scanner" + } + ], + "type" : "FILEPATH", + "value" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/bin/clang-scan-deps" + }, + { + "name" : "CMAKE_CXX_COMPILER_RANLIB", + "properties" : + [ + { + "name" : "ADVANCED", + "value" : "1" + }, + { + "name" : "HELPSTRING", + "value" : "Generate index for LLVM archive" + } + ], + "type" : "FILEPATH", + "value" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/bin/llvm-ranlib" + }, + { + "name" : "CMAKE_CXX_FLAGS", + "properties" : + [ + { + "name" : "ADVANCED", + "value" : "1" + }, + { + "name" : "HELPSTRING", + "value" : "Flags used by the compiler during all build types." + } + ], + "type" : "STRING", + "value" : "" + }, + { + "name" : "CMAKE_CXX_FLAGS_DEBUG", + "properties" : + [ + { + "name" : "ADVANCED", + "value" : "1" + }, + { + "name" : "HELPSTRING", + "value" : "Flags used by the compiler during debug builds." + } + ], + "type" : "STRING", + "value" : "" + }, + { + "name" : "CMAKE_CXX_FLAGS_MINSIZEREL", + "properties" : + [ + { + "name" : "ADVANCED", + "value" : "1" + }, + { + "name" : "HELPSTRING", + "value" : "Flags used by the CXX compiler during MINSIZEREL builds." + } + ], + "type" : "STRING", + "value" : "-Os -DNDEBUG" + }, + { + "name" : "CMAKE_CXX_FLAGS_RELEASE", + "properties" : + [ + { + "name" : "ADVANCED", + "value" : "1" + }, + { + "name" : "HELPSTRING", + "value" : "Flags used by the compiler during release builds." + } + ], + "type" : "STRING", + "value" : "" + }, + { + "name" : "CMAKE_CXX_FLAGS_RELWITHDEBINFO", + "properties" : + [ + { + "name" : "ADVANCED", + "value" : "1" + }, + { + "name" : "HELPSTRING", + "value" : "Flags used by the CXX compiler during RELWITHDEBINFO builds." + } + ], + "type" : "STRING", + "value" : "-O2 -g -DNDEBUG" + }, + { + "name" : "CMAKE_CXX_STANDARD_LIBRARIES", + "properties" : + [ + { + "name" : "ADVANCED", + "value" : "1" + }, + { + "name" : "HELPSTRING", + "value" : "Libraries linked by default with all C++ applications." + } + ], + "type" : "STRING", + "value" : "-latomic -lm" + }, + { + "name" : "CMAKE_C_COMPILER", + "properties" : + [ + { + "name" : "ADVANCED", + "value" : "1" + }, + { + "name" : "HELPSTRING", + "value" : "" + } + ], + "type" : "UNINITIALIZED", + "value" : "" + }, + { + "name" : "CMAKE_C_COMPILER_AR", + "properties" : + [ + { + "name" : "ADVANCED", + "value" : "1" + }, + { + "name" : "HELPSTRING", + "value" : "LLVM archiver" + } + ], + "type" : "FILEPATH", + "value" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/bin/llvm-ar" + }, + { + "name" : "CMAKE_C_COMPILER_CLANG_SCAN_DEPS", + "properties" : + [ + { + "name" : "ADVANCED", + "value" : "1" + }, + { + "name" : "HELPSTRING", + "value" : "`clang-scan-deps` dependency scanner" + } + ], + "type" : "FILEPATH", + "value" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/bin/clang-scan-deps" + }, + { + "name" : "CMAKE_C_COMPILER_RANLIB", + "properties" : + [ + { + "name" : "ADVANCED", + "value" : "1" + }, + { + "name" : "HELPSTRING", + "value" : "Generate index for LLVM archive" + } + ], + "type" : "FILEPATH", + "value" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/bin/llvm-ranlib" + }, + { + "name" : "CMAKE_C_FLAGS", + "properties" : + [ + { + "name" : "ADVANCED", + "value" : "1" + }, + { + "name" : "HELPSTRING", + "value" : "Flags used by the compiler during all build types." + } + ], + "type" : "STRING", + "value" : "" + }, + { + "name" : "CMAKE_C_FLAGS_DEBUG", + "properties" : + [ + { + "name" : "ADVANCED", + "value" : "1" + }, + { + "name" : "HELPSTRING", + "value" : "Flags used by the compiler during debug builds." + } + ], + "type" : "STRING", + "value" : "" + }, + { + "name" : "CMAKE_C_FLAGS_MINSIZEREL", + "properties" : + [ + { + "name" : "ADVANCED", + "value" : "1" + }, + { + "name" : "HELPSTRING", + "value" : "Flags used by the C compiler during MINSIZEREL builds." + } + ], + "type" : "STRING", + "value" : "-Os -DNDEBUG" + }, + { + "name" : "CMAKE_C_FLAGS_RELEASE", + "properties" : + [ + { + "name" : "ADVANCED", + "value" : "1" + }, + { + "name" : "HELPSTRING", + "value" : "Flags used by the compiler during release builds." + } + ], + "type" : "STRING", + "value" : "" + }, + { + "name" : "CMAKE_C_FLAGS_RELWITHDEBINFO", + "properties" : + [ + { + "name" : "ADVANCED", + "value" : "1" + }, + { + "name" : "HELPSTRING", + "value" : "Flags used by the C compiler during RELWITHDEBINFO builds." + } + ], + "type" : "STRING", + "value" : "-O2 -g -DNDEBUG" + }, + { + "name" : "CMAKE_C_STANDARD_LIBRARIES", + "properties" : + [ + { + "name" : "ADVANCED", + "value" : "1" + }, + { + "name" : "HELPSTRING", + "value" : "Libraries linked by default with all C applications." + } + ], + "type" : "STRING", + "value" : "-latomic -lm" + }, + { + "name" : "CMAKE_DLLTOOL", + "properties" : + [ + { + "name" : "ADVANCED", + "value" : "1" + }, + { + "name" : "HELPSTRING", + "value" : "Path to a program." + } + ], + "type" : "FILEPATH", + "value" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/bin/llvm-dlltool" + }, + { + "name" : "CMAKE_EDIT_COMMAND", + "properties" : + [ + { + "name" : "HELPSTRING", + "value" : "Path to cache edit program executable." + } + ], + "type" : "INTERNAL", + "value" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/bin/ccmake" + }, + { + "name" : "CMAKE_EXECUTABLE_FORMAT", + "properties" : + [ + { + "name" : "HELPSTRING", + "value" : "Executable file format" + } + ], + "type" : "INTERNAL", + "value" : "ELF" + }, + { + "name" : "CMAKE_EXE_LINKER_FLAGS", + "properties" : + [ + { + "name" : "ADVANCED", + "value" : "1" + }, + { + "name" : "HELPSTRING", + "value" : "Flags used by the linker." + } + ], + "type" : "STRING", + "value" : "" + }, + { + "name" : "CMAKE_EXE_LINKER_FLAGS_DEBUG", + "properties" : + [ + { + "name" : "ADVANCED", + "value" : "1" + }, + { + "name" : "HELPSTRING", + "value" : "Flags used by the linker during DEBUG builds." + } + ], + "type" : "STRING", + "value" : "" + }, + { + "name" : "CMAKE_EXE_LINKER_FLAGS_MINSIZEREL", + "properties" : + [ + { + "name" : "ADVANCED", + "value" : "1" + }, + { + "name" : "HELPSTRING", + "value" : "Flags used by the linker during MINSIZEREL builds." + } + ], + "type" : "STRING", + "value" : "" + }, + { + "name" : "CMAKE_EXE_LINKER_FLAGS_RELEASE", + "properties" : + [ + { + "name" : "ADVANCED", + "value" : "1" + }, + { + "name" : "HELPSTRING", + "value" : "Flags used by the linker during RELEASE builds." + } + ], + "type" : "STRING", + "value" : "" + }, + { + "name" : "CMAKE_EXE_LINKER_FLAGS_RELWITHDEBINFO", + "properties" : + [ + { + "name" : "ADVANCED", + "value" : "1" + }, + { + "name" : "HELPSTRING", + "value" : "Flags used by the linker during RELWITHDEBINFO builds." + } + ], + "type" : "STRING", + "value" : "" + }, + { + "name" : "CMAKE_EXPORT_BUILD_DATABASE", + "properties" : + [ + { + "name" : "ADVANCED", + "value" : "1" + }, + { + "name" : "HELPSTRING", + "value" : "Enable/Disable output of build database during the build." + } + ], + "type" : "BOOL", + "value" : "" + }, + { + "name" : "CMAKE_EXPORT_COMPILE_COMMANDS", + "properties" : + [ + { + "name" : "HELPSTRING", + "value" : "No help, variable specified on the command line." + } + ], + "type" : "UNINITIALIZED", + "value" : "ON" + }, + { + "name" : "CMAKE_EXTRA_GENERATOR", + "properties" : + [ + { + "name" : "HELPSTRING", + "value" : "Name of external makefile project generator." + } + ], + "type" : "INTERNAL", + "value" : "" + }, + { + "name" : "CMAKE_FIND_PACKAGE_REDIRECTS_DIR", + "properties" : + [ + { + "name" : "HELPSTRING", + "value" : "Value Computed by CMake." + } + ], + "type" : "STATIC", + "value" : "/Users/hamzaaleghwairyeen/development/App/Intaleq/android/app/.cxx/RelWithDebInfo/6t1m4b5v/x86_64/CMakeFiles/pkgRedirects" + }, + { + "name" : "CMAKE_GENERATOR", + "properties" : + [ + { + "name" : "HELPSTRING", + "value" : "Name of generator." + } + ], + "type" : "INTERNAL", + "value" : "Ninja" + }, + { + "name" : "CMAKE_GENERATOR_INSTANCE", + "properties" : + [ + { + "name" : "HELPSTRING", + "value" : "Generator instance identifier." + } + ], + "type" : "INTERNAL", + "value" : "" + }, + { + "name" : "CMAKE_GENERATOR_PLATFORM", + "properties" : + [ + { + "name" : "HELPSTRING", + "value" : "Name of generator platform." + } + ], + "type" : "INTERNAL", + "value" : "" + }, + { + "name" : "CMAKE_GENERATOR_TOOLSET", + "properties" : + [ + { + "name" : "HELPSTRING", + "value" : "Name of generator toolset." + } + ], + "type" : "INTERNAL", + "value" : "" + }, + { + "name" : "CMAKE_HOME_DIRECTORY", + "properties" : + [ + { + "name" : "HELPSTRING", + "value" : "Source directory with the top level CMakeLists.txt file for this project" + } + ], + "type" : "INTERNAL", + "value" : "/Users/hamzaaleghwairyeen/development/App/Intaleq/android/app/src/main/cpp" + }, + { + "name" : "CMAKE_INSTALL_PREFIX", + "properties" : + [ + { + "name" : "HELPSTRING", + "value" : "Install path prefix, prepended onto install directories." + } + ], + "type" : "PATH", + "value" : "/usr/local" + }, + { + "name" : "CMAKE_INSTALL_SO_NO_EXE", + "properties" : + [ + { + "name" : "HELPSTRING", + "value" : "Install .so files without execute permission." + } + ], + "type" : "INTERNAL", + "value" : "0" + }, + { + "name" : "CMAKE_LIBRARY_OUTPUT_DIRECTORY", + "properties" : + [ + { + "name" : "HELPSTRING", + "value" : "No help, variable specified on the command line." + } + ], + "type" : "UNINITIALIZED", + "value" : "/Users/hamzaaleghwairyeen/development/App/Intaleq/build/app/intermediates/cxx/RelWithDebInfo/6t1m4b5v/obj/x86_64" + }, + { + "name" : "CMAKE_LINKER", + "properties" : + [ + { + "name" : "ADVANCED", + "value" : "1" + }, + { + "name" : "HELPSTRING", + "value" : "Path to a program." + } + ], + "type" : "FILEPATH", + "value" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/bin/ld.lld" + }, + { + "name" : "CMAKE_MAKE_PROGRAM", + "properties" : + [ + { + "name" : "HELPSTRING", + "value" : "No help, variable specified on the command line." + } + ], + "type" : "UNINITIALIZED", + "value" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/bin/ninja" + }, + { + "name" : "CMAKE_MODULE_LINKER_FLAGS", + "properties" : + [ + { + "name" : "ADVANCED", + "value" : "1" + }, + { + "name" : "HELPSTRING", + "value" : "Flags used by the linker during the creation of modules." + } + ], + "type" : "STRING", + "value" : "" + }, + { + "name" : "CMAKE_MODULE_LINKER_FLAGS_DEBUG", + "properties" : + [ + { + "name" : "ADVANCED", + "value" : "1" + }, + { + "name" : "HELPSTRING", + "value" : "Flags used by the linker during the creation of modules during DEBUG builds." + } + ], + "type" : "STRING", + "value" : "" + }, + { + "name" : "CMAKE_MODULE_LINKER_FLAGS_MINSIZEREL", + "properties" : + [ + { + "name" : "ADVANCED", + "value" : "1" + }, + { + "name" : "HELPSTRING", + "value" : "Flags used by the linker during the creation of modules during MINSIZEREL builds." + } + ], + "type" : "STRING", + "value" : "" + }, + { + "name" : "CMAKE_MODULE_LINKER_FLAGS_RELEASE", + "properties" : + [ + { + "name" : "ADVANCED", + "value" : "1" + }, + { + "name" : "HELPSTRING", + "value" : "Flags used by the linker during the creation of modules during RELEASE builds." + } + ], + "type" : "STRING", + "value" : "" + }, + { + "name" : "CMAKE_MODULE_LINKER_FLAGS_RELWITHDEBINFO", + "properties" : + [ + { + "name" : "ADVANCED", + "value" : "1" + }, + { + "name" : "HELPSTRING", + "value" : "Flags used by the linker during the creation of modules during RELWITHDEBINFO builds." + } + ], + "type" : "STRING", + "value" : "" + }, + { + "name" : "CMAKE_NM", + "properties" : + [ + { + "name" : "ADVANCED", + "value" : "1" + }, + { + "name" : "HELPSTRING", + "value" : "Path to a program." + } + ], + "type" : "FILEPATH", + "value" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/bin/llvm-nm" + }, + { + "name" : "CMAKE_NUMBER_OF_MAKEFILES", + "properties" : + [ + { + "name" : "HELPSTRING", + "value" : "number of local generators" + } + ], + "type" : "INTERNAL", + "value" : "1" + }, + { + "name" : "CMAKE_OBJCOPY", + "properties" : + [ + { + "name" : "ADVANCED", + "value" : "1" + }, + { + "name" : "HELPSTRING", + "value" : "Path to a program." + } + ], + "type" : "FILEPATH", + "value" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/bin/llvm-objcopy" + }, + { + "name" : "CMAKE_OBJDUMP", + "properties" : + [ + { + "name" : "ADVANCED", + "value" : "1" + }, + { + "name" : "HELPSTRING", + "value" : "Path to a program." + } + ], + "type" : "FILEPATH", + "value" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/bin/llvm-objdump" + }, + { + "name" : "CMAKE_PLATFORM_INFO_INITIALIZED", + "properties" : + [ + { + "name" : "HELPSTRING", + "value" : "Platform information initialized" + } + ], + "type" : "INTERNAL", + "value" : "1" + }, + { + "name" : "CMAKE_PROJECT_DESCRIPTION", + "properties" : + [ + { + "name" : "HELPSTRING", + "value" : "Value Computed by CMake" + } + ], + "type" : "STATIC", + "value" : "" + }, + { + "name" : "CMAKE_PROJECT_HOMEPAGE_URL", + "properties" : + [ + { + "name" : "HELPSTRING", + "value" : "Value Computed by CMake" + } + ], + "type" : "STATIC", + "value" : "" + }, + { + "name" : "CMAKE_PROJECT_NAME", + "properties" : + [ + { + "name" : "HELPSTRING", + "value" : "Value Computed by CMake" + } + ], + "type" : "STATIC", + "value" : "intaleq" + }, + { + "name" : "CMAKE_RANLIB", + "properties" : + [ + { + "name" : "ADVANCED", + "value" : "1" + }, + { + "name" : "HELPSTRING", + "value" : "Ranlib" + } + ], + "type" : "FILEPATH", + "value" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/bin/llvm-ranlib" + }, + { + "name" : "CMAKE_READELF", + "properties" : + [ + { + "name" : "ADVANCED", + "value" : "1" + }, + { + "name" : "HELPSTRING", + "value" : "Path to a program." + } + ], + "type" : "FILEPATH", + "value" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/bin/llvm-readelf" + }, + { + "name" : "CMAKE_ROOT", + "properties" : + [ + { + "name" : "HELPSTRING", + "value" : "Path to CMake installation." + } + ], + "type" : "INTERNAL", + "value" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31" + }, + { + "name" : "CMAKE_RUNTIME_OUTPUT_DIRECTORY", + "properties" : + [ + { + "name" : "HELPSTRING", + "value" : "No help, variable specified on the command line." + } + ], + "type" : "UNINITIALIZED", + "value" : "/Users/hamzaaleghwairyeen/development/App/Intaleq/build/app/intermediates/cxx/RelWithDebInfo/6t1m4b5v/obj/x86_64" + }, + { + "name" : "CMAKE_SHARED_LINKER_FLAGS", + "properties" : + [ + { + "name" : "ADVANCED", + "value" : "1" + }, + { + "name" : "HELPSTRING", + "value" : "Flags used by the linker during the creation of dll's." + } + ], + "type" : "STRING", + "value" : "" + }, + { + "name" : "CMAKE_SHARED_LINKER_FLAGS_DEBUG", + "properties" : + [ + { + "name" : "ADVANCED", + "value" : "1" + }, + { + "name" : "HELPSTRING", + "value" : "Flags used by the linker during the creation of shared libraries during DEBUG builds." + } + ], + "type" : "STRING", + "value" : "" + }, + { + "name" : "CMAKE_SHARED_LINKER_FLAGS_MINSIZEREL", + "properties" : + [ + { + "name" : "ADVANCED", + "value" : "1" + }, + { + "name" : "HELPSTRING", + "value" : "Flags used by the linker during the creation of shared libraries during MINSIZEREL builds." + } + ], + "type" : "STRING", + "value" : "" + }, + { + "name" : "CMAKE_SHARED_LINKER_FLAGS_RELEASE", + "properties" : + [ + { + "name" : "ADVANCED", + "value" : "1" + }, + { + "name" : "HELPSTRING", + "value" : "Flags used by the linker during the creation of shared libraries during RELEASE builds." + } + ], + "type" : "STRING", + "value" : "" + }, + { + "name" : "CMAKE_SHARED_LINKER_FLAGS_RELWITHDEBINFO", + "properties" : + [ + { + "name" : "ADVANCED", + "value" : "1" + }, + { + "name" : "HELPSTRING", + "value" : "Flags used by the linker during the creation of shared libraries during RELWITHDEBINFO builds." + } + ], + "type" : "STRING", + "value" : "" + }, + { + "name" : "CMAKE_SKIP_INSTALL_RPATH", + "properties" : + [ + { + "name" : "ADVANCED", + "value" : "1" + }, + { + "name" : "HELPSTRING", + "value" : "If set, runtime paths are not added when installing shared libraries, but are added when building." + } + ], + "type" : "BOOL", + "value" : "NO" + }, + { + "name" : "CMAKE_SKIP_RPATH", + "properties" : + [ + { + "name" : "ADVANCED", + "value" : "1" + }, + { + "name" : "HELPSTRING", + "value" : "If set, runtime paths are not added when using shared libraries." + } + ], + "type" : "BOOL", + "value" : "NO" + }, + { + "name" : "CMAKE_STATIC_LINKER_FLAGS", + "properties" : + [ + { + "name" : "ADVANCED", + "value" : "1" + }, + { + "name" : "HELPSTRING", + "value" : "Flags used by the linker during the creation of static libraries during all build types." + } + ], + "type" : "STRING", + "value" : "" + }, + { + "name" : "CMAKE_STATIC_LINKER_FLAGS_DEBUG", + "properties" : + [ + { + "name" : "ADVANCED", + "value" : "1" + }, + { + "name" : "HELPSTRING", + "value" : "Flags used by the linker during the creation of static libraries during DEBUG builds." + } + ], + "type" : "STRING", + "value" : "" + }, + { + "name" : "CMAKE_STATIC_LINKER_FLAGS_MINSIZEREL", + "properties" : + [ + { + "name" : "ADVANCED", + "value" : "1" + }, + { + "name" : "HELPSTRING", + "value" : "Flags used by the linker during the creation of static libraries during MINSIZEREL builds." + } + ], + "type" : "STRING", + "value" : "" + }, + { + "name" : "CMAKE_STATIC_LINKER_FLAGS_RELEASE", + "properties" : + [ + { + "name" : "ADVANCED", + "value" : "1" + }, + { + "name" : "HELPSTRING", + "value" : "Flags used by the linker during the creation of static libraries during RELEASE builds." + } + ], + "type" : "STRING", + "value" : "" + }, + { + "name" : "CMAKE_STATIC_LINKER_FLAGS_RELWITHDEBINFO", + "properties" : + [ + { + "name" : "ADVANCED", + "value" : "1" + }, + { + "name" : "HELPSTRING", + "value" : "Flags used by the linker during the creation of static libraries during RELWITHDEBINFO builds." + } + ], + "type" : "STRING", + "value" : "" + }, + { + "name" : "CMAKE_STRIP", + "properties" : + [ + { + "name" : "ADVANCED", + "value" : "1" + }, + { + "name" : "HELPSTRING", + "value" : "Strip" + } + ], + "type" : "FILEPATH", + "value" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/bin/llvm-strip" + }, + { + "name" : "CMAKE_SYSTEM_NAME", + "properties" : + [ + { + "name" : "HELPSTRING", + "value" : "No help, variable specified on the command line." + } + ], + "type" : "UNINITIALIZED", + "value" : "Android" + }, + { + "name" : "CMAKE_SYSTEM_VERSION", + "properties" : + [ + { + "name" : "HELPSTRING", + "value" : "No help, variable specified on the command line." + } + ], + "type" : "UNINITIALIZED", + "value" : "23" + }, + { + "name" : "CMAKE_TAPI", + "properties" : + [ + { + "name" : "ADVANCED", + "value" : "1" + }, + { + "name" : "HELPSTRING", + "value" : "Path to a program." + } + ], + "type" : "FILEPATH", + "value" : "CMAKE_TAPI-NOTFOUND" + }, + { + "name" : "CMAKE_TOOLCHAIN_FILE", + "properties" : + [ + { + "name" : "HELPSTRING", + "value" : "The CMake toolchain file" + } + ], + "type" : "FILEPATH", + "value" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/build/cmake/android.toolchain.cmake" + }, + { + "name" : "CMAKE_UNAME", + "properties" : + [ + { + "name" : "HELPSTRING", + "value" : "uname command" + } + ], + "type" : "INTERNAL", + "value" : "/usr/bin/uname" + }, + { + "name" : "CMAKE_VERBOSE_MAKEFILE", + "properties" : + [ + { + "name" : "ADVANCED", + "value" : "1" + }, + { + "name" : "HELPSTRING", + "value" : "If this value is on, makefiles will be generated without the .SILENT directive, and all commands will be echoed to the console during the make. This is useful for debugging only. With Visual Studio IDE projects all commands are done without /nologo." + } + ], + "type" : "BOOL", + "value" : "FALSE" + }, + { + "name" : "_CMAKE_CXX_LINKER_PUSHPOP_STATE_SUPPORTED", + "properties" : + [ + { + "name" : "HELPSTRING", + "value" : "linker supports push/pop state" + } + ], + "type" : "INTERNAL", + "value" : "TRUE" + }, + { + "name" : "_CMAKE_C_LINKER_PUSHPOP_STATE_SUPPORTED", + "properties" : + [ + { + "name" : "HELPSTRING", + "value" : "linker supports push/pop state" + } + ], + "type" : "INTERNAL", + "value" : "TRUE" + }, + { + "name" : "_CMAKE_LINKER_PUSHPOP_STATE_SUPPORTED", + "properties" : + [ + { + "name" : "HELPSTRING", + "value" : "linker supports push/pop state" + } + ], + "type" : "INTERNAL", + "value" : "TRUE" + }, + { + "name" : "intaleq_BINARY_DIR", + "properties" : + [ + { + "name" : "HELPSTRING", + "value" : "Value Computed by CMake" + } + ], + "type" : "STATIC", + "value" : "/Users/hamzaaleghwairyeen/development/App/Intaleq/android/app/.cxx/RelWithDebInfo/6t1m4b5v/x86_64" + }, + { + "name" : "intaleq_IS_TOP_LEVEL", + "properties" : + [ + { + "name" : "HELPSTRING", + "value" : "Value Computed by CMake" + } + ], + "type" : "STATIC", + "value" : "ON" + }, + { + "name" : "intaleq_SOURCE_DIR", + "properties" : + [ + { + "name" : "HELPSTRING", + "value" : "Value Computed by CMake" + } + ], + "type" : "STATIC", + "value" : "/Users/hamzaaleghwairyeen/development/App/Intaleq/android/app/src/main/cpp" + }, + { + "name" : "log-lib", + "properties" : + [ + { + "name" : "HELPSTRING", + "value" : "Path to a library." + } + ], + "type" : "FILEPATH", + "value" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/lib/x86_64-linux-android/23/liblog.so" + }, + { + "name" : "native-lib_LIB_DEPENDS", + "properties" : + [ + { + "name" : "HELPSTRING", + "value" : "Dependencies for the target" + } + ], + "type" : "STATIC", + "value" : "general;/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/lib/x86_64-linux-android/23/liblog.so;" + } + ], + "kind" : "cache", + "version" : + { + "major" : 2, + "minor" : 0 + } +} diff --git a/siro_rider/android/app/.cxx/RelWithDebInfo/6t1m4b5v/x86_64/.cmake/api/v1/reply/cmakeFiles-v1-69d1109946a66019ce62.json b/siro_rider/android/app/.cxx/RelWithDebInfo/6t1m4b5v/x86_64/.cmake/api/v1/reply/cmakeFiles-v1-69d1109946a66019ce62.json new file mode 100644 index 0000000..20dec75 --- /dev/null +++ b/siro_rider/android/app/.cxx/RelWithDebInfo/6t1m4b5v/x86_64/.cmake/api/v1/reply/cmakeFiles-v1-69d1109946a66019ce62.json @@ -0,0 +1,968 @@ +{ + "inputs" : + [ + { + "path" : "CMakeLists.txt" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeDetermineSystem.cmake" + }, + { + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/build/cmake/android.toolchain.cmake" + }, + { + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/build/cmake/android-legacy.toolchain.cmake" + }, + { + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/build/cmake/abis.cmake" + }, + { + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/build/cmake/platforms.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Platform/Android-Determine.cmake" + }, + { + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/build/cmake/hooks/pre/Android-Determine.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeSystem.cmake.in" + }, + { + "isGenerated" : true, + "path" : "/Users/hamzaaleghwairyeen/development/App/Intaleq/android/app/.cxx/RelWithDebInfo/6t1m4b5v/x86_64/CMakeFiles/3.31.5-g6cf5163/CMakeSystem.cmake" + }, + { + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/build/cmake/android.toolchain.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeSystemSpecificInitialize.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Platform/Android-Initialize.cmake" + }, + { + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/build/cmake/hooks/pre/Android-Initialize.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Platform/Linux-Initialize.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeDetermineCCompiler.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeDetermineCompiler.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Platform/Android-Determine-C.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Platform/Android/Determine-Compiler.cmake" + }, + { + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/build/cmake/hooks/pre/Determine-Compiler.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeDetermineCompilerId.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeCompilerIdDetection.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/ADSP-DetermineCompiler.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/ARMCC-DetermineCompiler.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/ARMClang-DetermineCompiler.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/AppleClang-DetermineCompiler.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/Clang-DetermineCompilerInternal.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/Borland-DetermineCompiler.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/Bruce-C-DetermineCompiler.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/Clang-DetermineCompiler.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/Clang-DetermineCompilerInternal.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/Compaq-C-DetermineCompiler.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/Cray-DetermineCompiler.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/CrayClang-DetermineCompiler.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/Embarcadero-DetermineCompiler.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/Fujitsu-DetermineCompiler.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/FujitsuClang-DetermineCompiler.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/GHS-DetermineCompiler.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/GNU-C-DetermineCompiler.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/HP-C-DetermineCompiler.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/IAR-DetermineCompiler.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/IBMClang-C-DetermineCompiler.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/Intel-DetermineCompiler.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/IntelLLVM-DetermineCompiler.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/LCC-C-DetermineCompiler.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/MSVC-DetermineCompiler.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/NVHPC-DetermineCompiler.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/NVIDIA-DetermineCompiler.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/OpenWatcom-DetermineCompiler.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/OrangeC-DetermineCompiler.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/PGI-DetermineCompiler.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/PathScale-DetermineCompiler.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/SCO-DetermineCompiler.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/SDCC-C-DetermineCompiler.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/SunPro-C-DetermineCompiler.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/TI-DetermineCompiler.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/TIClang-DetermineCompiler.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/Tasking-DetermineCompiler.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/TinyCC-C-DetermineCompiler.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/VisualAge-C-DetermineCompiler.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/IBMCPP-C-DetermineVersionInternal.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/Watcom-DetermineCompiler.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/XL-C-DetermineCompiler.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/IBMCPP-C-DetermineVersionInternal.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/XLClang-C-DetermineCompiler.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/zOS-C-DetermineCompiler.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/IBMCPP-C-DetermineVersionInternal.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeFindBinUtils.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/Clang-FindBinUtils.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeCCompiler.cmake.in" + }, + { + "isGenerated" : true, + "path" : "/Users/hamzaaleghwairyeen/development/App/Intaleq/android/app/.cxx/RelWithDebInfo/6t1m4b5v/x86_64/CMakeFiles/3.31.5-g6cf5163/CMakeCCompiler.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeDetermineCXXCompiler.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeDetermineCompiler.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Platform/Android-Determine-CXX.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Platform/Android/Determine-Compiler.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeDetermineCompilerId.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeCompilerIdDetection.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/ADSP-DetermineCompiler.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/ARMCC-DetermineCompiler.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/ARMClang-DetermineCompiler.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/AppleClang-DetermineCompiler.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/Clang-DetermineCompilerInternal.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/Borland-DetermineCompiler.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/Clang-DetermineCompiler.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/Clang-DetermineCompilerInternal.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/Compaq-CXX-DetermineCompiler.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/Cray-DetermineCompiler.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/CrayClang-DetermineCompiler.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/Embarcadero-DetermineCompiler.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/Fujitsu-DetermineCompiler.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/FujitsuClang-DetermineCompiler.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/GHS-DetermineCompiler.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/GNU-CXX-DetermineCompiler.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/HP-CXX-DetermineCompiler.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/IAR-DetermineCompiler.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/IBMClang-CXX-DetermineCompiler.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/Intel-DetermineCompiler.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/IntelLLVM-DetermineCompiler.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/LCC-CXX-DetermineCompiler.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/MSVC-DetermineCompiler.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/NVHPC-DetermineCompiler.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/NVIDIA-DetermineCompiler.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/OpenWatcom-DetermineCompiler.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/OrangeC-DetermineCompiler.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/PGI-DetermineCompiler.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/PathScale-DetermineCompiler.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/SCO-DetermineCompiler.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/SunPro-CXX-DetermineCompiler.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/TI-DetermineCompiler.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/TIClang-DetermineCompiler.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/Tasking-DetermineCompiler.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/VisualAge-CXX-DetermineCompiler.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/IBMCPP-CXX-DetermineVersionInternal.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/Watcom-DetermineCompiler.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/XL-CXX-DetermineCompiler.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/IBMCPP-CXX-DetermineVersionInternal.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/XLClang-CXX-DetermineCompiler.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/zOS-CXX-DetermineCompiler.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/IBMCPP-CXX-DetermineVersionInternal.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeFindBinUtils.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/Clang-FindBinUtils.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeCXXCompiler.cmake.in" + }, + { + "isGenerated" : true, + "path" : "/Users/hamzaaleghwairyeen/development/App/Intaleq/android/app/.cxx/RelWithDebInfo/6t1m4b5v/x86_64/CMakeFiles/3.31.5-g6cf5163/CMakeCXXCompiler.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeSystemSpecificInformation.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeGenericSystem.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeInitializeConfigs.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Platform/Android.cmake" + }, + { + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/build/cmake/hooks/pre/Android.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Platform/Linux.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Platform/UnixPaths.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeCInformation.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeLanguageInformation.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/Clang-C.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/Clang.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/CMakeCommonCompilerMacros.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/GNU.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/CMakeCommonCompilerMacros.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Platform/Android-Clang-C.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Platform/Android-Clang.cmake" + }, + { + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/build/cmake/hooks/pre/Android-Clang.cmake" + }, + { + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/build/cmake/flags.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeCommonLanguageInclude.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeTestCCompiler.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeTestCompilerCommon.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeDetermineCompilerABI.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Internal/CMakeDetermineLinkerId.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeParseImplicitIncludeInfo.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeParseImplicitLinkInfo.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeParseLibraryArchitecture.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeTestCompilerCommon.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeCCompilerABI.c" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeDetermineCompilerSupport.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Internal/FeatureTesting.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeCCompiler.cmake.in" + }, + { + "isGenerated" : true, + "path" : "/Users/hamzaaleghwairyeen/development/App/Intaleq/android/app/.cxx/RelWithDebInfo/6t1m4b5v/x86_64/CMakeFiles/3.31.5-g6cf5163/CMakeCCompiler.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Internal/CMakeCLinkerInformation.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Internal/CMakeCommonLinkerInformation.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Linker/LLD-C.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Linker/LLD.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Linker/GNU.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Platform/Linker/Android-LLD-C.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Platform/Linker/Linux-LLD-C.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Platform/Linker/Linux-LLD.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Platform/Linker/Linux-GNU.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Platform/Linker/GNU.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeCXXInformation.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeLanguageInformation.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/Clang-CXX.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/Clang.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Platform/Android-Clang-CXX.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Platform/Android-Clang.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeCommonLanguageInclude.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeTestCXXCompiler.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeTestCompilerCommon.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeDetermineCompilerABI.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Internal/CMakeDetermineLinkerId.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeParseImplicitIncludeInfo.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeParseImplicitLinkInfo.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeParseLibraryArchitecture.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeTestCompilerCommon.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeCXXCompilerABI.cpp" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeDetermineCompilerSupport.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Internal/FeatureTesting.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/Clang-CXX-CXXImportStd.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/Clang-CXX-CXXImportStd.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeCXXCompiler.cmake.in" + }, + { + "isGenerated" : true, + "path" : "/Users/hamzaaleghwairyeen/development/App/Intaleq/android/app/.cxx/RelWithDebInfo/6t1m4b5v/x86_64/CMakeFiles/3.31.5-g6cf5163/CMakeCXXCompiler.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Internal/CMakeCXXLinkerInformation.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Internal/CMakeCommonLinkerInformation.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Linker/LLD-CXX.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Linker/LLD.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Platform/Linker/Android-LLD-CXX.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Platform/Linker/Linux-LLD-CXX.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Platform/Linker/Linux-LLD.cmake" + } + ], + "kind" : "cmakeFiles", + "paths" : + { + "build" : "/Users/hamzaaleghwairyeen/development/App/Intaleq/android/app/.cxx/RelWithDebInfo/6t1m4b5v/x86_64", + "source" : "/Users/hamzaaleghwairyeen/development/App/Intaleq/android/app/src/main/cpp" + }, + "version" : + { + "major" : 1, + "minor" : 1 + } +} diff --git a/siro_rider/android/app/.cxx/RelWithDebInfo/6t1m4b5v/x86_64/.cmake/api/v1/reply/codemodel-v2-da3349587414bdce9aac.json b/siro_rider/android/app/.cxx/RelWithDebInfo/6t1m4b5v/x86_64/.cmake/api/v1/reply/codemodel-v2-da3349587414bdce9aac.json new file mode 100644 index 0000000..0a5330a --- /dev/null +++ b/siro_rider/android/app/.cxx/RelWithDebInfo/6t1m4b5v/x86_64/.cmake/api/v1/reply/codemodel-v2-da3349587414bdce9aac.json @@ -0,0 +1,60 @@ +{ + "configurations" : + [ + { + "directories" : + [ + { + "build" : ".", + "jsonFile" : "directory-.-RelWithDebInfo-f5ebdc15457944623624.json", + "minimumCMakeVersion" : + { + "string" : "3.6.0" + }, + "projectIndex" : 0, + "source" : ".", + "targetIndexes" : + [ + 0 + ] + } + ], + "name" : "RelWithDebInfo", + "projects" : + [ + { + "directoryIndexes" : + [ + 0 + ], + "name" : "intaleq", + "targetIndexes" : + [ + 0 + ] + } + ], + "targets" : + [ + { + "directoryIndex" : 0, + "id" : "native-lib::@6890427a1f51a3e7e1df", + "jsonFile" : "target-native-lib-RelWithDebInfo-29a34f6bd1f7a930d882.json", + "name" : "native-lib", + "projectIndex" : 0 + } + ] + } + ], + "kind" : "codemodel", + "paths" : + { + "build" : "/Users/hamzaaleghwairyeen/development/App/Intaleq/android/app/.cxx/RelWithDebInfo/6t1m4b5v/x86_64", + "source" : "/Users/hamzaaleghwairyeen/development/App/Intaleq/android/app/src/main/cpp" + }, + "version" : + { + "major" : 2, + "minor" : 7 + } +} diff --git a/siro_rider/android/app/.cxx/RelWithDebInfo/6t1m4b5v/x86_64/.cmake/api/v1/reply/directory-.-RelWithDebInfo-f5ebdc15457944623624.json b/siro_rider/android/app/.cxx/RelWithDebInfo/6t1m4b5v/x86_64/.cmake/api/v1/reply/directory-.-RelWithDebInfo-f5ebdc15457944623624.json new file mode 100644 index 0000000..3a67af9 --- /dev/null +++ b/siro_rider/android/app/.cxx/RelWithDebInfo/6t1m4b5v/x86_64/.cmake/api/v1/reply/directory-.-RelWithDebInfo-f5ebdc15457944623624.json @@ -0,0 +1,14 @@ +{ + "backtraceGraph" : + { + "commands" : [], + "files" : [], + "nodes" : [] + }, + "installers" : [], + "paths" : + { + "build" : ".", + "source" : "." + } +} diff --git a/siro_rider/android/app/.cxx/RelWithDebInfo/6t1m4b5v/x86_64/.cmake/api/v1/reply/index-2025-07-02T20-14-03-0774.json b/siro_rider/android/app/.cxx/RelWithDebInfo/6t1m4b5v/x86_64/.cmake/api/v1/reply/index-2025-07-02T20-14-03-0774.json new file mode 100644 index 0000000..f747f7f --- /dev/null +++ b/siro_rider/android/app/.cxx/RelWithDebInfo/6t1m4b5v/x86_64/.cmake/api/v1/reply/index-2025-07-02T20-14-03-0774.json @@ -0,0 +1,92 @@ +{ + "cmake" : + { + "generator" : + { + "multiConfig" : false, + "name" : "Ninja" + }, + "paths" : + { + "cmake" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/bin/cmake", + "cpack" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/bin/cpack", + "ctest" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/bin/ctest", + "root" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31" + }, + "version" : + { + "isDirty" : false, + "major" : 3, + "minor" : 31, + "patch" : 5, + "string" : "3.31.5-g6cf5163", + "suffix" : "g6cf5163" + } + }, + "objects" : + [ + { + "jsonFile" : "codemodel-v2-da3349587414bdce9aac.json", + "kind" : "codemodel", + "version" : + { + "major" : 2, + "minor" : 7 + } + }, + { + "jsonFile" : "cache-v2-85ff97705f04cc8292b7.json", + "kind" : "cache", + "version" : + { + "major" : 2, + "minor" : 0 + } + }, + { + "jsonFile" : "cmakeFiles-v1-69d1109946a66019ce62.json", + "kind" : "cmakeFiles", + "version" : + { + "major" : 1, + "minor" : 1 + } + } + ], + "reply" : + { + "client-agp" : + { + "cache-v2" : + { + "jsonFile" : "cache-v2-85ff97705f04cc8292b7.json", + "kind" : "cache", + "version" : + { + "major" : 2, + "minor" : 0 + } + }, + "cmakeFiles-v1" : + { + "jsonFile" : "cmakeFiles-v1-69d1109946a66019ce62.json", + "kind" : "cmakeFiles", + "version" : + { + "major" : 1, + "minor" : 1 + } + }, + "codemodel-v2" : + { + "jsonFile" : "codemodel-v2-da3349587414bdce9aac.json", + "kind" : "codemodel", + "version" : + { + "major" : 2, + "minor" : 7 + } + } + } + } +} diff --git a/siro_rider/android/app/.cxx/RelWithDebInfo/6t1m4b5v/x86_64/.cmake/api/v1/reply/target-native-lib-RelWithDebInfo-29a34f6bd1f7a930d882.json b/siro_rider/android/app/.cxx/RelWithDebInfo/6t1m4b5v/x86_64/.cmake/api/v1/reply/target-native-lib-RelWithDebInfo-29a34f6bd1f7a930d882.json new file mode 100644 index 0000000..9ec47ae --- /dev/null +++ b/siro_rider/android/app/.cxx/RelWithDebInfo/6t1m4b5v/x86_64/.cmake/api/v1/reply/target-native-lib-RelWithDebInfo-29a34f6bd1f7a930d882.json @@ -0,0 +1,117 @@ +{ + "artifacts" : + [ + { + "path" : "/Users/hamzaaleghwairyeen/development/App/Intaleq/build/app/intermediates/cxx/RelWithDebInfo/6t1m4b5v/obj/x86_64/libnative-lib.so" + } + ], + "backtrace" : 1, + "backtraceGraph" : + { + "commands" : + [ + "add_library", + "target_link_libraries" + ], + "files" : + [ + "CMakeLists.txt" + ], + "nodes" : + [ + { + "file" : 0 + }, + { + "command" : 0, + "file" : 0, + "line" : 4, + "parent" : 0 + }, + { + "command" : 1, + "file" : 0, + "line" : 8, + "parent" : 0 + } + ] + }, + "compileGroups" : + [ + { + "compileCommandFragments" : + [ + { + "fragment" : "-g -DANDROID -fdata-sections -ffunction-sections -funwind-tables -fstack-protector-strong -no-canonical-prefixes -D_FORTIFY_SOURCE=2 -Wformat -Werror=format-security -O2 -g -DNDEBUG -fPIC" + } + ], + "defines" : + [ + { + "define" : "native_lib_EXPORTS" + } + ], + "language" : "CXX", + "sourceIndexes" : + [ + 0 + ], + "sysroot" : + { + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot" + } + } + ], + "id" : "native-lib::@6890427a1f51a3e7e1df", + "link" : + { + "commandFragments" : + [ + { + "fragment" : "-static-libstdc++ -Wl,--build-id=sha1 -Wl,--no-rosegment -Wl,--no-undefined-version -Wl,--fatal-warnings -Wl,--no-undefined -Qunused-arguments -Wl,--gc-sections", + "role" : "flags" + }, + { + "backtrace" : 2, + "fragment" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/lib/x86_64-linux-android/23/liblog.so", + "role" : "libraries" + }, + { + "fragment" : "-latomic -lm", + "role" : "libraries" + } + ], + "language" : "CXX", + "sysroot" : + { + "path" : "/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot" + } + }, + "name" : "native-lib", + "nameOnDisk" : "libnative-lib.so", + "paths" : + { + "build" : ".", + "source" : "." + }, + "sourceGroups" : + [ + { + "name" : "Source Files", + "sourceIndexes" : + [ + 0 + ] + } + ], + "sources" : + [ + { + "backtrace" : 1, + "compileGroupIndex" : 0, + "path" : "native-lib.cpp", + "sourceGroupIndex" : 0 + } + ], + "type" : "SHARED_LIBRARY" +} diff --git a/siro_rider/android/app/.cxx/RelWithDebInfo/6t1m4b5v/x86_64/.ninja_deps b/siro_rider/android/app/.cxx/RelWithDebInfo/6t1m4b5v/x86_64/.ninja_deps new file mode 100644 index 0000000..7862b81 Binary files /dev/null and b/siro_rider/android/app/.cxx/RelWithDebInfo/6t1m4b5v/x86_64/.ninja_deps differ diff --git a/siro_rider/android/app/.cxx/RelWithDebInfo/6t1m4b5v/x86_64/.ninja_log b/siro_rider/android/app/.cxx/RelWithDebInfo/6t1m4b5v/x86_64/.ninja_log new file mode 100644 index 0000000..1740fbd --- /dev/null +++ b/siro_rider/android/app/.cxx/RelWithDebInfo/6t1m4b5v/x86_64/.ninja_log @@ -0,0 +1,5 @@ +# ninja log v5 +0 404 1751487244471463302 CMakeFiles/native-lib.dir/native-lib.cpp.o c73d9e6f58895e34 +406 459 1751487244521217366 /Users/hamzaaleghwairyeen/development/App/Intaleq/build/app/intermediates/cxx/RelWithDebInfo/6t1m4b5v/obj/x86_64/libnative-lib.so 1c81393151f8a8de +20 238 1751488088832887426 /Users/hamzaaleghwairyeen/development/App/Intaleq/build/app/intermediates/cxx/RelWithDebInfo/6t1m4b5v/obj/x86_64/libnative-lib.so 1c81393151f8a8de +5 296 1753054205886843996 /Users/hamzaaleghwairyeen/development/App/Intaleq/build/app/intermediates/cxx/RelWithDebInfo/6t1m4b5v/obj/x86_64/libnative-lib.so 1c81393151f8a8de diff --git a/siro_rider/android/app/.cxx/RelWithDebInfo/6t1m4b5v/x86_64/CMakeCache.txt b/siro_rider/android/app/.cxx/RelWithDebInfo/6t1m4b5v/x86_64/CMakeCache.txt new file mode 100644 index 0000000..1ec900e --- /dev/null +++ b/siro_rider/android/app/.cxx/RelWithDebInfo/6t1m4b5v/x86_64/CMakeCache.txt @@ -0,0 +1,430 @@ +# This is the CMakeCache file. +# For build in directory: /Users/hamzaaleghwairyeen/development/App/Intaleq/android/app/.cxx/RelWithDebInfo/6t1m4b5v/x86_64 +# It was generated by CMake: /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/bin/cmake +# You can edit this file to change values found and used by cmake. +# If you do not want to change any of the values, simply exit the editor. +# If you do want to change a value, simply edit, save, and exit the editor. +# The syntax for the file is as follows: +# KEY:TYPE=VALUE +# KEY is the name of a variable in the cache. +# TYPE is a hint to GUIs for the type of VALUE, DO NOT EDIT TYPE!. +# VALUE is the current value for the KEY. + +######################## +# EXTERNAL cache entries +######################## + +//No help, variable specified on the command line. +ANDROID_ABI:UNINITIALIZED=x86_64 + +//No help, variable specified on the command line. +ANDROID_NDK:UNINITIALIZED=/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973 + +//No help, variable specified on the command line. +ANDROID_PLATFORM:UNINITIALIZED=android-23 + +//Path to a program. +CMAKE_ADDR2LINE:FILEPATH=/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/bin/llvm-addr2line + +//No help, variable specified on the command line. +CMAKE_ANDROID_ARCH_ABI:UNINITIALIZED=x86_64 + +//No help, variable specified on the command line. +CMAKE_ANDROID_NDK:UNINITIALIZED=/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973 + +//Archiver +CMAKE_AR:FILEPATH=/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/bin/llvm-ar + +//Flags used by the compiler during all build types. +CMAKE_ASM_FLAGS:STRING= + +//Flags used by the compiler during debug builds. +CMAKE_ASM_FLAGS_DEBUG:STRING= + +//Flags used by the compiler during release builds. +CMAKE_ASM_FLAGS_RELEASE:STRING= + +//Choose the type of build, options are: None Debug Release RelWithDebInfo +// MinSizeRel ... +CMAKE_BUILD_TYPE:STRING=RelWithDebInfo + +//LLVM archiver +CMAKE_CXX_COMPILER_AR:FILEPATH=/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/bin/llvm-ar + +//`clang-scan-deps` dependency scanner +CMAKE_CXX_COMPILER_CLANG_SCAN_DEPS:FILEPATH=/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/bin/clang-scan-deps + +//Generate index for LLVM archive +CMAKE_CXX_COMPILER_RANLIB:FILEPATH=/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/bin/llvm-ranlib + +//Flags used by the compiler during all build types. +CMAKE_CXX_FLAGS:STRING= + +//Flags used by the compiler during debug builds. +CMAKE_CXX_FLAGS_DEBUG:STRING= + +//Flags used by the CXX compiler during MINSIZEREL builds. +CMAKE_CXX_FLAGS_MINSIZEREL:STRING=-Os -DNDEBUG + +//Flags used by the compiler during release builds. +CMAKE_CXX_FLAGS_RELEASE:STRING= + +//Flags used by the CXX compiler during RELWITHDEBINFO builds. +CMAKE_CXX_FLAGS_RELWITHDEBINFO:STRING=-O2 -g -DNDEBUG + +//Libraries linked by default with all C++ applications. +CMAKE_CXX_STANDARD_LIBRARIES:STRING=-latomic -lm + +//LLVM archiver +CMAKE_C_COMPILER_AR:FILEPATH=/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/bin/llvm-ar + +//`clang-scan-deps` dependency scanner +CMAKE_C_COMPILER_CLANG_SCAN_DEPS:FILEPATH=/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/bin/clang-scan-deps + +//Generate index for LLVM archive +CMAKE_C_COMPILER_RANLIB:FILEPATH=/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/bin/llvm-ranlib + +//Flags used by the compiler during all build types. +CMAKE_C_FLAGS:STRING= + +//Flags used by the compiler during debug builds. +CMAKE_C_FLAGS_DEBUG:STRING= + +//Flags used by the C compiler during MINSIZEREL builds. +CMAKE_C_FLAGS_MINSIZEREL:STRING=-Os -DNDEBUG + +//Flags used by the compiler during release builds. +CMAKE_C_FLAGS_RELEASE:STRING= + +//Flags used by the C compiler during RELWITHDEBINFO builds. +CMAKE_C_FLAGS_RELWITHDEBINFO:STRING=-O2 -g -DNDEBUG + +//Libraries linked by default with all C applications. +CMAKE_C_STANDARD_LIBRARIES:STRING=-latomic -lm + +//Path to a program. +CMAKE_DLLTOOL:FILEPATH=/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/bin/llvm-dlltool + +//Flags used by the linker. +CMAKE_EXE_LINKER_FLAGS:STRING= + +//Flags used by the linker during DEBUG builds. +CMAKE_EXE_LINKER_FLAGS_DEBUG:STRING= + +//Flags used by the linker during MINSIZEREL builds. +CMAKE_EXE_LINKER_FLAGS_MINSIZEREL:STRING= + +//Flags used by the linker during RELEASE builds. +CMAKE_EXE_LINKER_FLAGS_RELEASE:STRING= + +//Flags used by the linker during RELWITHDEBINFO builds. +CMAKE_EXE_LINKER_FLAGS_RELWITHDEBINFO:STRING= + +//Enable/Disable output of build database during the build. +CMAKE_EXPORT_BUILD_DATABASE:BOOL= + +//No help, variable specified on the command line. +CMAKE_EXPORT_COMPILE_COMMANDS:UNINITIALIZED=ON + +//Value Computed by CMake. +CMAKE_FIND_PACKAGE_REDIRECTS_DIR:STATIC=/Users/hamzaaleghwairyeen/development/App/Intaleq/android/app/.cxx/RelWithDebInfo/6t1m4b5v/x86_64/CMakeFiles/pkgRedirects + +//Install path prefix, prepended onto install directories. +CMAKE_INSTALL_PREFIX:PATH=/usr/local + +//No help, variable specified on the command line. +CMAKE_LIBRARY_OUTPUT_DIRECTORY:UNINITIALIZED=/Users/hamzaaleghwairyeen/development/App/Intaleq/build/app/intermediates/cxx/RelWithDebInfo/6t1m4b5v/obj/x86_64 + +//Path to a program. +CMAKE_LINKER:FILEPATH=/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/bin/ld.lld + +//No help, variable specified on the command line. +CMAKE_MAKE_PROGRAM:UNINITIALIZED=/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/bin/ninja + +//Flags used by the linker during the creation of modules. +CMAKE_MODULE_LINKER_FLAGS:STRING= + +//Flags used by the linker during the creation of modules during +// DEBUG builds. +CMAKE_MODULE_LINKER_FLAGS_DEBUG:STRING= + +//Flags used by the linker during the creation of modules during +// MINSIZEREL builds. +CMAKE_MODULE_LINKER_FLAGS_MINSIZEREL:STRING= + +//Flags used by the linker during the creation of modules during +// RELEASE builds. +CMAKE_MODULE_LINKER_FLAGS_RELEASE:STRING= + +//Flags used by the linker during the creation of modules during +// RELWITHDEBINFO builds. +CMAKE_MODULE_LINKER_FLAGS_RELWITHDEBINFO:STRING= + +//Path to a program. +CMAKE_NM:FILEPATH=/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/bin/llvm-nm + +//Path to a program. +CMAKE_OBJCOPY:FILEPATH=/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/bin/llvm-objcopy + +//Path to a program. +CMAKE_OBJDUMP:FILEPATH=/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/bin/llvm-objdump + +//Value Computed by CMake +CMAKE_PROJECT_DESCRIPTION:STATIC= + +//Value Computed by CMake +CMAKE_PROJECT_HOMEPAGE_URL:STATIC= + +//Value Computed by CMake +CMAKE_PROJECT_NAME:STATIC=intaleq + +//Ranlib +CMAKE_RANLIB:FILEPATH=/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/bin/llvm-ranlib + +//Path to a program. +CMAKE_READELF:FILEPATH=/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/bin/llvm-readelf + +//No help, variable specified on the command line. +CMAKE_RUNTIME_OUTPUT_DIRECTORY:UNINITIALIZED=/Users/hamzaaleghwairyeen/development/App/Intaleq/build/app/intermediates/cxx/RelWithDebInfo/6t1m4b5v/obj/x86_64 + +//Flags used by the linker during the creation of dll's. +CMAKE_SHARED_LINKER_FLAGS:STRING= + +//Flags used by the linker during the creation of shared libraries +// during DEBUG builds. +CMAKE_SHARED_LINKER_FLAGS_DEBUG:STRING= + +//Flags used by the linker during the creation of shared libraries +// during MINSIZEREL builds. +CMAKE_SHARED_LINKER_FLAGS_MINSIZEREL:STRING= + +//Flags used by the linker during the creation of shared libraries +// during RELEASE builds. +CMAKE_SHARED_LINKER_FLAGS_RELEASE:STRING= + +//Flags used by the linker during the creation of shared libraries +// during RELWITHDEBINFO builds. +CMAKE_SHARED_LINKER_FLAGS_RELWITHDEBINFO:STRING= + +//If set, runtime paths are not added when installing shared libraries, +// but are added when building. +CMAKE_SKIP_INSTALL_RPATH:BOOL=NO + +//If set, runtime paths are not added when using shared libraries. +CMAKE_SKIP_RPATH:BOOL=NO + +//Flags used by the linker during the creation of static libraries +// during all build types. +CMAKE_STATIC_LINKER_FLAGS:STRING= + +//Flags used by the linker during the creation of static libraries +// during DEBUG builds. +CMAKE_STATIC_LINKER_FLAGS_DEBUG:STRING= + +//Flags used by the linker during the creation of static libraries +// during MINSIZEREL builds. +CMAKE_STATIC_LINKER_FLAGS_MINSIZEREL:STRING= + +//Flags used by the linker during the creation of static libraries +// during RELEASE builds. +CMAKE_STATIC_LINKER_FLAGS_RELEASE:STRING= + +//Flags used by the linker during the creation of static libraries +// during RELWITHDEBINFO builds. +CMAKE_STATIC_LINKER_FLAGS_RELWITHDEBINFO:STRING= + +//Strip +CMAKE_STRIP:FILEPATH=/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/bin/llvm-strip + +//No help, variable specified on the command line. +CMAKE_SYSTEM_NAME:UNINITIALIZED=Android + +//No help, variable specified on the command line. +CMAKE_SYSTEM_VERSION:UNINITIALIZED=23 + +//Path to a program. +CMAKE_TAPI:FILEPATH=CMAKE_TAPI-NOTFOUND + +//The CMake toolchain file +CMAKE_TOOLCHAIN_FILE:FILEPATH=/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/build/cmake/android.toolchain.cmake + +//If this value is on, makefiles will be generated without the +// .SILENT directive, and all commands will be echoed to the console +// during the make. This is useful for debugging only. With Visual +// Studio IDE projects all commands are done without /nologo. +CMAKE_VERBOSE_MAKEFILE:BOOL=FALSE + +//Value Computed by CMake +intaleq_BINARY_DIR:STATIC=/Users/hamzaaleghwairyeen/development/App/Intaleq/android/app/.cxx/RelWithDebInfo/6t1m4b5v/x86_64 + +//Value Computed by CMake +intaleq_IS_TOP_LEVEL:STATIC=ON + +//Value Computed by CMake +intaleq_SOURCE_DIR:STATIC=/Users/hamzaaleghwairyeen/development/App/Intaleq/android/app/src/main/cpp + +//Path to a library. +log-lib:FILEPATH=/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/lib/x86_64-linux-android/23/liblog.so + +//Dependencies for the target +native-lib_LIB_DEPENDS:STATIC=general;/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/lib/x86_64-linux-android/23/liblog.so; + + +######################## +# INTERNAL cache entries +######################## + +//ADVANCED property for variable: CMAKE_ADDR2LINE +CMAKE_ADDR2LINE-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_AR +CMAKE_AR-ADVANCED:INTERNAL=1 +//This is the directory where this CMakeCache.txt was created +CMAKE_CACHEFILE_DIR:INTERNAL=/Users/hamzaaleghwairyeen/development/App/Intaleq/android/app/.cxx/RelWithDebInfo/6t1m4b5v/x86_64 +//Major version of cmake used to create the current loaded cache +CMAKE_CACHE_MAJOR_VERSION:INTERNAL=3 +//Minor version of cmake used to create the current loaded cache +CMAKE_CACHE_MINOR_VERSION:INTERNAL=31 +//Patch version of cmake used to create the current loaded cache +CMAKE_CACHE_PATCH_VERSION:INTERNAL=5 +//Path to CMake executable. +CMAKE_COMMAND:INTERNAL=/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/bin/cmake +//Path to cpack program executable. +CMAKE_CPACK_COMMAND:INTERNAL=/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/bin/cpack +//Path to ctest program executable. +CMAKE_CTEST_COMMAND:INTERNAL=/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/bin/ctest +//ADVANCED property for variable: CMAKE_CXX_COMPILER_AR +CMAKE_CXX_COMPILER_AR-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_CXX_COMPILER_CLANG_SCAN_DEPS +CMAKE_CXX_COMPILER_CLANG_SCAN_DEPS-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_CXX_COMPILER_RANLIB +CMAKE_CXX_COMPILER_RANLIB-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_CXX_FLAGS +CMAKE_CXX_FLAGS-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_CXX_FLAGS_DEBUG +CMAKE_CXX_FLAGS_DEBUG-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_CXX_FLAGS_MINSIZEREL +CMAKE_CXX_FLAGS_MINSIZEREL-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_CXX_FLAGS_RELEASE +CMAKE_CXX_FLAGS_RELEASE-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_CXX_FLAGS_RELWITHDEBINFO +CMAKE_CXX_FLAGS_RELWITHDEBINFO-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_CXX_STANDARD_LIBRARIES +CMAKE_CXX_STANDARD_LIBRARIES-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_C_COMPILER_AR +CMAKE_C_COMPILER_AR-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_C_COMPILER_CLANG_SCAN_DEPS +CMAKE_C_COMPILER_CLANG_SCAN_DEPS-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_C_COMPILER_RANLIB +CMAKE_C_COMPILER_RANLIB-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_C_FLAGS +CMAKE_C_FLAGS-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_C_FLAGS_DEBUG +CMAKE_C_FLAGS_DEBUG-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_C_FLAGS_MINSIZEREL +CMAKE_C_FLAGS_MINSIZEREL-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_C_FLAGS_RELEASE +CMAKE_C_FLAGS_RELEASE-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_C_FLAGS_RELWITHDEBINFO +CMAKE_C_FLAGS_RELWITHDEBINFO-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_C_STANDARD_LIBRARIES +CMAKE_C_STANDARD_LIBRARIES-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_DLLTOOL +CMAKE_DLLTOOL-ADVANCED:INTERNAL=1 +//Path to cache edit program executable. +CMAKE_EDIT_COMMAND:INTERNAL=/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/bin/ccmake +//Executable file format +CMAKE_EXECUTABLE_FORMAT:INTERNAL=ELF +//ADVANCED property for variable: CMAKE_EXE_LINKER_FLAGS +CMAKE_EXE_LINKER_FLAGS-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_EXE_LINKER_FLAGS_DEBUG +CMAKE_EXE_LINKER_FLAGS_DEBUG-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_EXE_LINKER_FLAGS_MINSIZEREL +CMAKE_EXE_LINKER_FLAGS_MINSIZEREL-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_EXE_LINKER_FLAGS_RELEASE +CMAKE_EXE_LINKER_FLAGS_RELEASE-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_EXE_LINKER_FLAGS_RELWITHDEBINFO +CMAKE_EXE_LINKER_FLAGS_RELWITHDEBINFO-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_EXPORT_BUILD_DATABASE +CMAKE_EXPORT_BUILD_DATABASE-ADVANCED:INTERNAL=1 +//Name of external makefile project generator. +CMAKE_EXTRA_GENERATOR:INTERNAL= +//Name of generator. +CMAKE_GENERATOR:INTERNAL=Ninja +//Generator instance identifier. +CMAKE_GENERATOR_INSTANCE:INTERNAL= +//Name of generator platform. +CMAKE_GENERATOR_PLATFORM:INTERNAL= +//Name of generator toolset. +CMAKE_GENERATOR_TOOLSET:INTERNAL= +//Source directory with the top level CMakeLists.txt file for this +// project +CMAKE_HOME_DIRECTORY:INTERNAL=/Users/hamzaaleghwairyeen/development/App/Intaleq/android/app/src/main/cpp +//Install .so files without execute permission. +CMAKE_INSTALL_SO_NO_EXE:INTERNAL=0 +//ADVANCED property for variable: CMAKE_LINKER +CMAKE_LINKER-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_MODULE_LINKER_FLAGS +CMAKE_MODULE_LINKER_FLAGS-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_MODULE_LINKER_FLAGS_DEBUG +CMAKE_MODULE_LINKER_FLAGS_DEBUG-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_MODULE_LINKER_FLAGS_MINSIZEREL +CMAKE_MODULE_LINKER_FLAGS_MINSIZEREL-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_MODULE_LINKER_FLAGS_RELEASE +CMAKE_MODULE_LINKER_FLAGS_RELEASE-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_MODULE_LINKER_FLAGS_RELWITHDEBINFO +CMAKE_MODULE_LINKER_FLAGS_RELWITHDEBINFO-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_NM +CMAKE_NM-ADVANCED:INTERNAL=1 +//number of local generators +CMAKE_NUMBER_OF_MAKEFILES:INTERNAL=1 +//ADVANCED property for variable: CMAKE_OBJCOPY +CMAKE_OBJCOPY-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_OBJDUMP +CMAKE_OBJDUMP-ADVANCED:INTERNAL=1 +//Platform information initialized +CMAKE_PLATFORM_INFO_INITIALIZED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_RANLIB +CMAKE_RANLIB-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_READELF +CMAKE_READELF-ADVANCED:INTERNAL=1 +//Path to CMake installation. +CMAKE_ROOT:INTERNAL=/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31 +//ADVANCED property for variable: CMAKE_SHARED_LINKER_FLAGS +CMAKE_SHARED_LINKER_FLAGS-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_SHARED_LINKER_FLAGS_DEBUG +CMAKE_SHARED_LINKER_FLAGS_DEBUG-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_SHARED_LINKER_FLAGS_MINSIZEREL +CMAKE_SHARED_LINKER_FLAGS_MINSIZEREL-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_SHARED_LINKER_FLAGS_RELEASE +CMAKE_SHARED_LINKER_FLAGS_RELEASE-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_SHARED_LINKER_FLAGS_RELWITHDEBINFO +CMAKE_SHARED_LINKER_FLAGS_RELWITHDEBINFO-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_SKIP_INSTALL_RPATH +CMAKE_SKIP_INSTALL_RPATH-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_SKIP_RPATH +CMAKE_SKIP_RPATH-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_STATIC_LINKER_FLAGS +CMAKE_STATIC_LINKER_FLAGS-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_STATIC_LINKER_FLAGS_DEBUG +CMAKE_STATIC_LINKER_FLAGS_DEBUG-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_STATIC_LINKER_FLAGS_MINSIZEREL +CMAKE_STATIC_LINKER_FLAGS_MINSIZEREL-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_STATIC_LINKER_FLAGS_RELEASE +CMAKE_STATIC_LINKER_FLAGS_RELEASE-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_STATIC_LINKER_FLAGS_RELWITHDEBINFO +CMAKE_STATIC_LINKER_FLAGS_RELWITHDEBINFO-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_STRIP +CMAKE_STRIP-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_TAPI +CMAKE_TAPI-ADVANCED:INTERNAL=1 +//uname command +CMAKE_UNAME:INTERNAL=/usr/bin/uname +//ADVANCED property for variable: CMAKE_VERBOSE_MAKEFILE +CMAKE_VERBOSE_MAKEFILE-ADVANCED:INTERNAL=1 +//linker supports push/pop state +_CMAKE_CXX_LINKER_PUSHPOP_STATE_SUPPORTED:INTERNAL=TRUE +//linker supports push/pop state +_CMAKE_C_LINKER_PUSHPOP_STATE_SUPPORTED:INTERNAL=TRUE +//linker supports push/pop state +_CMAKE_LINKER_PUSHPOP_STATE_SUPPORTED:INTERNAL=TRUE + diff --git a/siro_rider/android/app/.cxx/RelWithDebInfo/6t1m4b5v/x86_64/CMakeFiles/3.31.5-g6cf5163/CMakeCCompiler.cmake b/siro_rider/android/app/.cxx/RelWithDebInfo/6t1m4b5v/x86_64/CMakeFiles/3.31.5-g6cf5163/CMakeCCompiler.cmake new file mode 100644 index 0000000..a598563 --- /dev/null +++ b/siro_rider/android/app/.cxx/RelWithDebInfo/6t1m4b5v/x86_64/CMakeFiles/3.31.5-g6cf5163/CMakeCCompiler.cmake @@ -0,0 +1,81 @@ +set(CMAKE_C_COMPILER "/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/bin/clang") +set(CMAKE_C_COMPILER_ARG1 "") +set(CMAKE_C_COMPILER_ID "Clang") +set(CMAKE_C_COMPILER_VERSION "18.0.1") +set(CMAKE_C_COMPILER_VERSION_INTERNAL "") +set(CMAKE_C_COMPILER_WRAPPER "") +set(CMAKE_C_STANDARD_COMPUTED_DEFAULT "17") +set(CMAKE_C_EXTENSIONS_COMPUTED_DEFAULT "ON") +set(CMAKE_C_STANDARD_LATEST "23") +set(CMAKE_C_COMPILE_FEATURES "c_std_90;c_function_prototypes;c_std_99;c_restrict;c_variadic_macros;c_std_11;c_static_assert;c_std_17;c_std_23") +set(CMAKE_C90_COMPILE_FEATURES "c_std_90;c_function_prototypes") +set(CMAKE_C99_COMPILE_FEATURES "c_std_99;c_restrict;c_variadic_macros") +set(CMAKE_C11_COMPILE_FEATURES "c_std_11;c_static_assert") +set(CMAKE_C17_COMPILE_FEATURES "c_std_17") +set(CMAKE_C23_COMPILE_FEATURES "c_std_23") + +set(CMAKE_C_PLATFORM_ID "Linux") +set(CMAKE_C_SIMULATE_ID "") +set(CMAKE_C_COMPILER_FRONTEND_VARIANT "GNU") +set(CMAKE_C_SIMULATE_VERSION "") + + + + +set(CMAKE_AR "/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/bin/llvm-ar") +set(CMAKE_C_COMPILER_AR "/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/bin/llvm-ar") +set(CMAKE_RANLIB "/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/bin/llvm-ranlib") +set(CMAKE_C_COMPILER_RANLIB "/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/bin/llvm-ranlib") +set(CMAKE_LINKER "/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/bin/ld.lld") +set(CMAKE_LINKER_LINK "") +set(CMAKE_LINKER_LLD "") +set(CMAKE_C_COMPILER_LINKER "/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/bin/ld.lld") +set(CMAKE_C_COMPILER_LINKER_ID "LLD") +set(CMAKE_C_COMPILER_LINKER_VERSION 18.0.1) +set(CMAKE_C_COMPILER_LINKER_FRONTEND_VARIANT GNU) +set(CMAKE_MT "") +set(CMAKE_TAPI "CMAKE_TAPI-NOTFOUND") +set(CMAKE_COMPILER_IS_GNUCC ) +set(CMAKE_C_COMPILER_LOADED 1) +set(CMAKE_C_COMPILER_WORKS TRUE) +set(CMAKE_C_ABI_COMPILED TRUE) + +set(CMAKE_C_COMPILER_ENV_VAR "CC") + +set(CMAKE_C_COMPILER_ID_RUN 1) +set(CMAKE_C_SOURCE_FILE_EXTENSIONS c;m) +set(CMAKE_C_IGNORE_EXTENSIONS h;H;o;O;obj;OBJ;def;DEF;rc;RC) +set(CMAKE_C_LINKER_PREFERENCE 10) +set(CMAKE_C_LINKER_DEPFILE_SUPPORTED ) + +# Save compiler ABI information. +set(CMAKE_C_SIZEOF_DATA_PTR "8") +set(CMAKE_C_COMPILER_ABI "ELF") +set(CMAKE_C_BYTE_ORDER "LITTLE_ENDIAN") +set(CMAKE_C_LIBRARY_ARCHITECTURE "x86_64-linux-android") + +if(CMAKE_C_SIZEOF_DATA_PTR) + set(CMAKE_SIZEOF_VOID_P "${CMAKE_C_SIZEOF_DATA_PTR}") +endif() + +if(CMAKE_C_COMPILER_ABI) + set(CMAKE_INTERNAL_PLATFORM_ABI "${CMAKE_C_COMPILER_ABI}") +endif() + +if(CMAKE_C_LIBRARY_ARCHITECTURE) + set(CMAKE_LIBRARY_ARCHITECTURE "x86_64-linux-android") +endif() + +set(CMAKE_C_CL_SHOWINCLUDES_PREFIX "") +if(CMAKE_C_CL_SHOWINCLUDES_PREFIX) + set(CMAKE_CL_SHOWINCLUDES_PREFIX "${CMAKE_C_CL_SHOWINCLUDES_PREFIX}") +endif() + + + + + +set(CMAKE_C_IMPLICIT_INCLUDE_DIRECTORIES "/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/lib/clang/18/include;/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/include/x86_64-linux-android;/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/include") +set(CMAKE_C_IMPLICIT_LINK_LIBRARIES "-l:libunwind.a;dl;c;-l:libunwind.a;dl") +set(CMAKE_C_IMPLICIT_LINK_DIRECTORIES "/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/lib/clang/18/lib/linux/x86_64;/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/lib/x86_64-linux-android/23;/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/lib/x86_64-linux-android;/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/lib") +set(CMAKE_C_IMPLICIT_LINK_FRAMEWORK_DIRECTORIES "") diff --git a/siro_rider/android/app/.cxx/RelWithDebInfo/6t1m4b5v/x86_64/CMakeFiles/3.31.5-g6cf5163/CMakeCXXCompiler.cmake b/siro_rider/android/app/.cxx/RelWithDebInfo/6t1m4b5v/x86_64/CMakeFiles/3.31.5-g6cf5163/CMakeCXXCompiler.cmake new file mode 100644 index 0000000..84c10ac --- /dev/null +++ b/siro_rider/android/app/.cxx/RelWithDebInfo/6t1m4b5v/x86_64/CMakeFiles/3.31.5-g6cf5163/CMakeCXXCompiler.cmake @@ -0,0 +1,105 @@ +set(CMAKE_CXX_COMPILER "/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/bin/clang++") +set(CMAKE_CXX_COMPILER_ARG1 "") +set(CMAKE_CXX_COMPILER_ID "Clang") +set(CMAKE_CXX_COMPILER_VERSION "18.0.1") +set(CMAKE_CXX_COMPILER_VERSION_INTERNAL "") +set(CMAKE_CXX_COMPILER_WRAPPER "") +set(CMAKE_CXX_STANDARD_COMPUTED_DEFAULT "17") +set(CMAKE_CXX_EXTENSIONS_COMPUTED_DEFAULT "ON") +set(CMAKE_CXX_STANDARD_LATEST "26") +set(CMAKE_CXX_COMPILE_FEATURES "cxx_std_98;cxx_template_template_parameters;cxx_std_11;cxx_alias_templates;cxx_alignas;cxx_alignof;cxx_attributes;cxx_auto_type;cxx_constexpr;cxx_decltype;cxx_decltype_incomplete_return_types;cxx_default_function_template_args;cxx_defaulted_functions;cxx_defaulted_move_initializers;cxx_delegating_constructors;cxx_deleted_functions;cxx_enum_forward_declarations;cxx_explicit_conversions;cxx_extended_friend_declarations;cxx_extern_templates;cxx_final;cxx_func_identifier;cxx_generalized_initializers;cxx_inheriting_constructors;cxx_inline_namespaces;cxx_lambdas;cxx_local_type_template_args;cxx_long_long_type;cxx_noexcept;cxx_nonstatic_member_init;cxx_nullptr;cxx_override;cxx_range_for;cxx_raw_string_literals;cxx_reference_qualified_functions;cxx_right_angle_brackets;cxx_rvalue_references;cxx_sizeof_member;cxx_static_assert;cxx_strong_enums;cxx_thread_local;cxx_trailing_return_types;cxx_unicode_literals;cxx_uniform_initialization;cxx_unrestricted_unions;cxx_user_literals;cxx_variadic_macros;cxx_variadic_templates;cxx_std_14;cxx_aggregate_default_initializers;cxx_attribute_deprecated;cxx_binary_literals;cxx_contextual_conversions;cxx_decltype_auto;cxx_digit_separators;cxx_generic_lambdas;cxx_lambda_init_captures;cxx_relaxed_constexpr;cxx_return_type_deduction;cxx_variable_templates;cxx_std_17;cxx_std_20;cxx_std_23;cxx_std_26") +set(CMAKE_CXX98_COMPILE_FEATURES "cxx_std_98;cxx_template_template_parameters") +set(CMAKE_CXX11_COMPILE_FEATURES "cxx_std_11;cxx_alias_templates;cxx_alignas;cxx_alignof;cxx_attributes;cxx_auto_type;cxx_constexpr;cxx_decltype;cxx_decltype_incomplete_return_types;cxx_default_function_template_args;cxx_defaulted_functions;cxx_defaulted_move_initializers;cxx_delegating_constructors;cxx_deleted_functions;cxx_enum_forward_declarations;cxx_explicit_conversions;cxx_extended_friend_declarations;cxx_extern_templates;cxx_final;cxx_func_identifier;cxx_generalized_initializers;cxx_inheriting_constructors;cxx_inline_namespaces;cxx_lambdas;cxx_local_type_template_args;cxx_long_long_type;cxx_noexcept;cxx_nonstatic_member_init;cxx_nullptr;cxx_override;cxx_range_for;cxx_raw_string_literals;cxx_reference_qualified_functions;cxx_right_angle_brackets;cxx_rvalue_references;cxx_sizeof_member;cxx_static_assert;cxx_strong_enums;cxx_thread_local;cxx_trailing_return_types;cxx_unicode_literals;cxx_uniform_initialization;cxx_unrestricted_unions;cxx_user_literals;cxx_variadic_macros;cxx_variadic_templates") +set(CMAKE_CXX14_COMPILE_FEATURES "cxx_std_14;cxx_aggregate_default_initializers;cxx_attribute_deprecated;cxx_binary_literals;cxx_contextual_conversions;cxx_decltype_auto;cxx_digit_separators;cxx_generic_lambdas;cxx_lambda_init_captures;cxx_relaxed_constexpr;cxx_return_type_deduction;cxx_variable_templates") +set(CMAKE_CXX17_COMPILE_FEATURES "cxx_std_17") +set(CMAKE_CXX20_COMPILE_FEATURES "cxx_std_20") +set(CMAKE_CXX23_COMPILE_FEATURES "cxx_std_23") +set(CMAKE_CXX26_COMPILE_FEATURES "cxx_std_26") + +set(CMAKE_CXX_PLATFORM_ID "Linux") +set(CMAKE_CXX_SIMULATE_ID "") +set(CMAKE_CXX_COMPILER_FRONTEND_VARIANT "GNU") +set(CMAKE_CXX_SIMULATE_VERSION "") + + + + +set(CMAKE_AR "/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/bin/llvm-ar") +set(CMAKE_CXX_COMPILER_AR "/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/bin/llvm-ar") +set(CMAKE_RANLIB "/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/bin/llvm-ranlib") +set(CMAKE_CXX_COMPILER_RANLIB "/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/bin/llvm-ranlib") +set(CMAKE_LINKER "/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/bin/ld.lld") +set(CMAKE_LINKER_LINK "") +set(CMAKE_LINKER_LLD "") +set(CMAKE_CXX_COMPILER_LINKER "/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/bin/ld.lld") +set(CMAKE_CXX_COMPILER_LINKER_ID "LLD") +set(CMAKE_CXX_COMPILER_LINKER_VERSION 18.0.1) +set(CMAKE_CXX_COMPILER_LINKER_FRONTEND_VARIANT GNU) +set(CMAKE_MT "") +set(CMAKE_TAPI "CMAKE_TAPI-NOTFOUND") +set(CMAKE_COMPILER_IS_GNUCXX ) +set(CMAKE_CXX_COMPILER_LOADED 1) +set(CMAKE_CXX_COMPILER_WORKS TRUE) +set(CMAKE_CXX_ABI_COMPILED TRUE) + +set(CMAKE_CXX_COMPILER_ENV_VAR "CXX") + +set(CMAKE_CXX_COMPILER_ID_RUN 1) +set(CMAKE_CXX_SOURCE_FILE_EXTENSIONS C;M;c++;cc;cpp;cxx;m;mm;mpp;CPP;ixx;cppm;ccm;cxxm;c++m) +set(CMAKE_CXX_IGNORE_EXTENSIONS inl;h;hpp;HPP;H;o;O;obj;OBJ;def;DEF;rc;RC) + +foreach (lang IN ITEMS C OBJC OBJCXX) + if (CMAKE_${lang}_COMPILER_ID_RUN) + foreach(extension IN LISTS CMAKE_${lang}_SOURCE_FILE_EXTENSIONS) + list(REMOVE_ITEM CMAKE_CXX_SOURCE_FILE_EXTENSIONS ${extension}) + endforeach() + endif() +endforeach() + +set(CMAKE_CXX_LINKER_PREFERENCE 30) +set(CMAKE_CXX_LINKER_PREFERENCE_PROPAGATES 1) +set(CMAKE_CXX_LINKER_DEPFILE_SUPPORTED ) + +# Save compiler ABI information. +set(CMAKE_CXX_SIZEOF_DATA_PTR "8") +set(CMAKE_CXX_COMPILER_ABI "ELF") +set(CMAKE_CXX_BYTE_ORDER "LITTLE_ENDIAN") +set(CMAKE_CXX_LIBRARY_ARCHITECTURE "x86_64-linux-android") + +if(CMAKE_CXX_SIZEOF_DATA_PTR) + set(CMAKE_SIZEOF_VOID_P "${CMAKE_CXX_SIZEOF_DATA_PTR}") +endif() + +if(CMAKE_CXX_COMPILER_ABI) + set(CMAKE_INTERNAL_PLATFORM_ABI "${CMAKE_CXX_COMPILER_ABI}") +endif() + +if(CMAKE_CXX_LIBRARY_ARCHITECTURE) + set(CMAKE_LIBRARY_ARCHITECTURE "x86_64-linux-android") +endif() + +set(CMAKE_CXX_CL_SHOWINCLUDES_PREFIX "") +if(CMAKE_CXX_CL_SHOWINCLUDES_PREFIX) + set(CMAKE_CL_SHOWINCLUDES_PREFIX "${CMAKE_CXX_CL_SHOWINCLUDES_PREFIX}") +endif() + + + + + +set(CMAKE_CXX_IMPLICIT_INCLUDE_DIRECTORIES "/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/include/c++/v1;/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/lib/clang/18/include;/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/include/x86_64-linux-android;/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/include") +set(CMAKE_CXX_IMPLICIT_LINK_LIBRARIES "c++;m;-l:libunwind.a;dl;c;-l:libunwind.a;dl") +set(CMAKE_CXX_IMPLICIT_LINK_DIRECTORIES "/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/lib/clang/18/lib/linux/x86_64;/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/lib/x86_64-linux-android/23;/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/lib/x86_64-linux-android;/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/lib") +set(CMAKE_CXX_IMPLICIT_LINK_FRAMEWORK_DIRECTORIES "") +set(CMAKE_CXX_COMPILER_CLANG_RESOURCE_DIR "/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/lib/clang/18") + +set(CMAKE_CXX_COMPILER_IMPORT_STD "") +### Imported target for C++23 standard library +set(CMAKE_CXX23_COMPILER_IMPORT_STD_NOT_FOUND_MESSAGE "Experimental `import std` support not enabled when detecting toolchain; it must be set before `CXX` is enabled (usually a `project()` call)") + + +### Imported target for C++26 standard library +set(CMAKE_CXX26_COMPILER_IMPORT_STD_NOT_FOUND_MESSAGE "Experimental `import std` support not enabled when detecting toolchain; it must be set before `CXX` is enabled (usually a `project()` call)") + + + diff --git a/siro_rider/android/app/.cxx/RelWithDebInfo/6t1m4b5v/x86_64/CMakeFiles/3.31.5-g6cf5163/CMakeDetermineCompilerABI_C.bin b/siro_rider/android/app/.cxx/RelWithDebInfo/6t1m4b5v/x86_64/CMakeFiles/3.31.5-g6cf5163/CMakeDetermineCompilerABI_C.bin new file mode 100755 index 0000000..1954633 Binary files /dev/null and b/siro_rider/android/app/.cxx/RelWithDebInfo/6t1m4b5v/x86_64/CMakeFiles/3.31.5-g6cf5163/CMakeDetermineCompilerABI_C.bin differ diff --git a/siro_rider/android/app/.cxx/RelWithDebInfo/6t1m4b5v/x86_64/CMakeFiles/3.31.5-g6cf5163/CMakeDetermineCompilerABI_CXX.bin b/siro_rider/android/app/.cxx/RelWithDebInfo/6t1m4b5v/x86_64/CMakeFiles/3.31.5-g6cf5163/CMakeDetermineCompilerABI_CXX.bin new file mode 100755 index 0000000..fff3006 Binary files /dev/null and b/siro_rider/android/app/.cxx/RelWithDebInfo/6t1m4b5v/x86_64/CMakeFiles/3.31.5-g6cf5163/CMakeDetermineCompilerABI_CXX.bin differ diff --git a/siro_rider/android/app/.cxx/RelWithDebInfo/6t1m4b5v/x86_64/CMakeFiles/3.31.5-g6cf5163/CMakeSystem.cmake b/siro_rider/android/app/.cxx/RelWithDebInfo/6t1m4b5v/x86_64/CMakeFiles/3.31.5-g6cf5163/CMakeSystem.cmake new file mode 100644 index 0000000..1f3c05c --- /dev/null +++ b/siro_rider/android/app/.cxx/RelWithDebInfo/6t1m4b5v/x86_64/CMakeFiles/3.31.5-g6cf5163/CMakeSystem.cmake @@ -0,0 +1,15 @@ +set(CMAKE_HOST_SYSTEM "Darwin-24.5.0") +set(CMAKE_HOST_SYSTEM_NAME "Darwin") +set(CMAKE_HOST_SYSTEM_VERSION "24.5.0") +set(CMAKE_HOST_SYSTEM_PROCESSOR "arm64") + +include("/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/build/cmake/android.toolchain.cmake") + +set(CMAKE_SYSTEM "Android-1") +set(CMAKE_SYSTEM_NAME "Android") +set(CMAKE_SYSTEM_VERSION "1") +set(CMAKE_SYSTEM_PROCESSOR "x86_64") + +set(CMAKE_CROSSCOMPILING "TRUE") + +set(CMAKE_SYSTEM_LOADED 1) diff --git a/siro_rider/android/app/.cxx/RelWithDebInfo/6t1m4b5v/x86_64/CMakeFiles/3.31.5-g6cf5163/CompilerIdC/CMakeCCompilerId.c b/siro_rider/android/app/.cxx/RelWithDebInfo/6t1m4b5v/x86_64/CMakeFiles/3.31.5-g6cf5163/CompilerIdC/CMakeCCompilerId.c new file mode 100644 index 0000000..8d8bb03 --- /dev/null +++ b/siro_rider/android/app/.cxx/RelWithDebInfo/6t1m4b5v/x86_64/CMakeFiles/3.31.5-g6cf5163/CompilerIdC/CMakeCCompilerId.c @@ -0,0 +1,904 @@ +#ifdef __cplusplus +# error "A C++ compiler has been selected for C." +#endif + +#if defined(__18CXX) +# define ID_VOID_MAIN +#endif +#if defined(__CLASSIC_C__) +/* cv-qualifiers did not exist in K&R C */ +# define const +# define volatile +#endif + +#if !defined(__has_include) +/* If the compiler does not have __has_include, pretend the answer is + always no. */ +# define __has_include(x) 0 +#endif + + +/* Version number components: V=Version, R=Revision, P=Patch + Version date components: YYYY=Year, MM=Month, DD=Day */ + +#if defined(__INTEL_COMPILER) || defined(__ICC) +# define COMPILER_ID "Intel" +# if defined(_MSC_VER) +# define SIMULATE_ID "MSVC" +# endif +# if defined(__GNUC__) +# define SIMULATE_ID "GNU" +# endif + /* __INTEL_COMPILER = VRP prior to 2021, and then VVVV for 2021 and later, + except that a few beta releases use the old format with V=2021. */ +# if __INTEL_COMPILER < 2021 || __INTEL_COMPILER == 202110 || __INTEL_COMPILER == 202111 +# define COMPILER_VERSION_MAJOR DEC(__INTEL_COMPILER/100) +# define COMPILER_VERSION_MINOR DEC(__INTEL_COMPILER/10 % 10) +# if defined(__INTEL_COMPILER_UPDATE) +# define COMPILER_VERSION_PATCH DEC(__INTEL_COMPILER_UPDATE) +# else +# define COMPILER_VERSION_PATCH DEC(__INTEL_COMPILER % 10) +# endif +# else +# define COMPILER_VERSION_MAJOR DEC(__INTEL_COMPILER) +# define COMPILER_VERSION_MINOR DEC(__INTEL_COMPILER_UPDATE) + /* The third version component from --version is an update index, + but no macro is provided for it. */ +# define COMPILER_VERSION_PATCH DEC(0) +# endif +# if defined(__INTEL_COMPILER_BUILD_DATE) + /* __INTEL_COMPILER_BUILD_DATE = YYYYMMDD */ +# define COMPILER_VERSION_TWEAK DEC(__INTEL_COMPILER_BUILD_DATE) +# endif +# if defined(_MSC_VER) + /* _MSC_VER = VVRR */ +# define SIMULATE_VERSION_MAJOR DEC(_MSC_VER / 100) +# define SIMULATE_VERSION_MINOR DEC(_MSC_VER % 100) +# endif +# if defined(__GNUC__) +# define SIMULATE_VERSION_MAJOR DEC(__GNUC__) +# elif defined(__GNUG__) +# define SIMULATE_VERSION_MAJOR DEC(__GNUG__) +# endif +# if defined(__GNUC_MINOR__) +# define SIMULATE_VERSION_MINOR DEC(__GNUC_MINOR__) +# endif +# if defined(__GNUC_PATCHLEVEL__) +# define SIMULATE_VERSION_PATCH DEC(__GNUC_PATCHLEVEL__) +# endif + +#elif (defined(__clang__) && defined(__INTEL_CLANG_COMPILER)) || defined(__INTEL_LLVM_COMPILER) +# define COMPILER_ID "IntelLLVM" +#if defined(_MSC_VER) +# define SIMULATE_ID "MSVC" +#endif +#if defined(__GNUC__) +# define SIMULATE_ID "GNU" +#endif +/* __INTEL_LLVM_COMPILER = VVVVRP prior to 2021.2.0, VVVVRRPP for 2021.2.0 and + * later. Look for 6 digit vs. 8 digit version number to decide encoding. + * VVVV is no smaller than the current year when a version is released. + */ +#if __INTEL_LLVM_COMPILER < 1000000L +# define COMPILER_VERSION_MAJOR DEC(__INTEL_LLVM_COMPILER/100) +# define COMPILER_VERSION_MINOR DEC(__INTEL_LLVM_COMPILER/10 % 10) +# define COMPILER_VERSION_PATCH DEC(__INTEL_LLVM_COMPILER % 10) +#else +# define COMPILER_VERSION_MAJOR DEC(__INTEL_LLVM_COMPILER/10000) +# define COMPILER_VERSION_MINOR DEC(__INTEL_LLVM_COMPILER/100 % 100) +# define COMPILER_VERSION_PATCH DEC(__INTEL_LLVM_COMPILER % 100) +#endif +#if defined(_MSC_VER) + /* _MSC_VER = VVRR */ +# define SIMULATE_VERSION_MAJOR DEC(_MSC_VER / 100) +# define SIMULATE_VERSION_MINOR DEC(_MSC_VER % 100) +#endif +#if defined(__GNUC__) +# define SIMULATE_VERSION_MAJOR DEC(__GNUC__) +#elif defined(__GNUG__) +# define SIMULATE_VERSION_MAJOR DEC(__GNUG__) +#endif +#if defined(__GNUC_MINOR__) +# define SIMULATE_VERSION_MINOR DEC(__GNUC_MINOR__) +#endif +#if defined(__GNUC_PATCHLEVEL__) +# define SIMULATE_VERSION_PATCH DEC(__GNUC_PATCHLEVEL__) +#endif + +#elif defined(__PATHCC__) +# define COMPILER_ID "PathScale" +# define COMPILER_VERSION_MAJOR DEC(__PATHCC__) +# define COMPILER_VERSION_MINOR DEC(__PATHCC_MINOR__) +# if defined(__PATHCC_PATCHLEVEL__) +# define COMPILER_VERSION_PATCH DEC(__PATHCC_PATCHLEVEL__) +# endif + +#elif defined(__BORLANDC__) && defined(__CODEGEARC_VERSION__) +# define COMPILER_ID "Embarcadero" +# define COMPILER_VERSION_MAJOR HEX(__CODEGEARC_VERSION__>>24 & 0x00FF) +# define COMPILER_VERSION_MINOR HEX(__CODEGEARC_VERSION__>>16 & 0x00FF) +# define COMPILER_VERSION_PATCH DEC(__CODEGEARC_VERSION__ & 0xFFFF) + +#elif defined(__BORLANDC__) +# define COMPILER_ID "Borland" + /* __BORLANDC__ = 0xVRR */ +# define COMPILER_VERSION_MAJOR HEX(__BORLANDC__>>8) +# define COMPILER_VERSION_MINOR HEX(__BORLANDC__ & 0xFF) + +#elif defined(__WATCOMC__) && __WATCOMC__ < 1200 +# define COMPILER_ID "Watcom" + /* __WATCOMC__ = VVRR */ +# define COMPILER_VERSION_MAJOR DEC(__WATCOMC__ / 100) +# define COMPILER_VERSION_MINOR DEC((__WATCOMC__ / 10) % 10) +# if (__WATCOMC__ % 10) > 0 +# define COMPILER_VERSION_PATCH DEC(__WATCOMC__ % 10) +# endif + +#elif defined(__WATCOMC__) +# define COMPILER_ID "OpenWatcom" + /* __WATCOMC__ = VVRP + 1100 */ +# define COMPILER_VERSION_MAJOR DEC((__WATCOMC__ - 1100) / 100) +# define COMPILER_VERSION_MINOR DEC((__WATCOMC__ / 10) % 10) +# if (__WATCOMC__ % 10) > 0 +# define COMPILER_VERSION_PATCH DEC(__WATCOMC__ % 10) +# endif + +#elif defined(__SUNPRO_C) +# define COMPILER_ID "SunPro" +# if __SUNPRO_C >= 0x5100 + /* __SUNPRO_C = 0xVRRP */ +# define COMPILER_VERSION_MAJOR HEX(__SUNPRO_C>>12) +# define COMPILER_VERSION_MINOR HEX(__SUNPRO_C>>4 & 0xFF) +# define COMPILER_VERSION_PATCH HEX(__SUNPRO_C & 0xF) +# else + /* __SUNPRO_CC = 0xVRP */ +# define COMPILER_VERSION_MAJOR HEX(__SUNPRO_C>>8) +# define COMPILER_VERSION_MINOR HEX(__SUNPRO_C>>4 & 0xF) +# define COMPILER_VERSION_PATCH HEX(__SUNPRO_C & 0xF) +# endif + +#elif defined(__HP_cc) +# define COMPILER_ID "HP" + /* __HP_cc = VVRRPP */ +# define COMPILER_VERSION_MAJOR DEC(__HP_cc/10000) +# define COMPILER_VERSION_MINOR DEC(__HP_cc/100 % 100) +# define COMPILER_VERSION_PATCH DEC(__HP_cc % 100) + +#elif defined(__DECC) +# define COMPILER_ID "Compaq" + /* __DECC_VER = VVRRTPPPP */ +# define COMPILER_VERSION_MAJOR DEC(__DECC_VER/10000000) +# define COMPILER_VERSION_MINOR DEC(__DECC_VER/100000 % 100) +# define COMPILER_VERSION_PATCH DEC(__DECC_VER % 10000) + +#elif defined(__IBMC__) && defined(__COMPILER_VER__) +# define COMPILER_ID "zOS" + /* __IBMC__ = VRP */ +# define COMPILER_VERSION_MAJOR DEC(__IBMC__/100) +# define COMPILER_VERSION_MINOR DEC(__IBMC__/10 % 10) +# define COMPILER_VERSION_PATCH DEC(__IBMC__ % 10) + +#elif defined(__open_xl__) && defined(__clang__) +# define COMPILER_ID "IBMClang" +# define COMPILER_VERSION_MAJOR DEC(__open_xl_version__) +# define COMPILER_VERSION_MINOR DEC(__open_xl_release__) +# define COMPILER_VERSION_PATCH DEC(__open_xl_modification__) +# define COMPILER_VERSION_TWEAK DEC(__open_xl_ptf_fix_level__) + + +#elif defined(__ibmxl__) && defined(__clang__) +# define COMPILER_ID "XLClang" +# define COMPILER_VERSION_MAJOR DEC(__ibmxl_version__) +# define COMPILER_VERSION_MINOR DEC(__ibmxl_release__) +# define COMPILER_VERSION_PATCH DEC(__ibmxl_modification__) +# define COMPILER_VERSION_TWEAK DEC(__ibmxl_ptf_fix_level__) + + +#elif defined(__IBMC__) && !defined(__COMPILER_VER__) && __IBMC__ >= 800 +# define COMPILER_ID "XL" + /* __IBMC__ = VRP */ +# define COMPILER_VERSION_MAJOR DEC(__IBMC__/100) +# define COMPILER_VERSION_MINOR DEC(__IBMC__/10 % 10) +# define COMPILER_VERSION_PATCH DEC(__IBMC__ % 10) + +#elif defined(__IBMC__) && !defined(__COMPILER_VER__) && __IBMC__ < 800 +# define COMPILER_ID "VisualAge" + /* __IBMC__ = VRP */ +# define COMPILER_VERSION_MAJOR DEC(__IBMC__/100) +# define COMPILER_VERSION_MINOR DEC(__IBMC__/10 % 10) +# define COMPILER_VERSION_PATCH DEC(__IBMC__ % 10) + +#elif defined(__NVCOMPILER) +# define COMPILER_ID "NVHPC" +# define COMPILER_VERSION_MAJOR DEC(__NVCOMPILER_MAJOR__) +# define COMPILER_VERSION_MINOR DEC(__NVCOMPILER_MINOR__) +# if defined(__NVCOMPILER_PATCHLEVEL__) +# define COMPILER_VERSION_PATCH DEC(__NVCOMPILER_PATCHLEVEL__) +# endif + +#elif defined(__PGI) +# define COMPILER_ID "PGI" +# define COMPILER_VERSION_MAJOR DEC(__PGIC__) +# define COMPILER_VERSION_MINOR DEC(__PGIC_MINOR__) +# if defined(__PGIC_PATCHLEVEL__) +# define COMPILER_VERSION_PATCH DEC(__PGIC_PATCHLEVEL__) +# endif + +#elif defined(__clang__) && defined(__cray__) +# define COMPILER_ID "CrayClang" +# define COMPILER_VERSION_MAJOR DEC(__cray_major__) +# define COMPILER_VERSION_MINOR DEC(__cray_minor__) +# define COMPILER_VERSION_PATCH DEC(__cray_patchlevel__) +# define COMPILER_VERSION_INTERNAL_STR __clang_version__ + + +#elif defined(_CRAYC) +# define COMPILER_ID "Cray" +# define COMPILER_VERSION_MAJOR DEC(_RELEASE_MAJOR) +# define COMPILER_VERSION_MINOR DEC(_RELEASE_MINOR) + +#elif defined(__TI_COMPILER_VERSION__) +# define COMPILER_ID "TI" + /* __TI_COMPILER_VERSION__ = VVVRRRPPP */ +# define COMPILER_VERSION_MAJOR DEC(__TI_COMPILER_VERSION__/1000000) +# define COMPILER_VERSION_MINOR DEC(__TI_COMPILER_VERSION__/1000 % 1000) +# define COMPILER_VERSION_PATCH DEC(__TI_COMPILER_VERSION__ % 1000) + +#elif defined(__CLANG_FUJITSU) +# define COMPILER_ID "FujitsuClang" +# define COMPILER_VERSION_MAJOR DEC(__FCC_major__) +# define COMPILER_VERSION_MINOR DEC(__FCC_minor__) +# define COMPILER_VERSION_PATCH DEC(__FCC_patchlevel__) +# define COMPILER_VERSION_INTERNAL_STR __clang_version__ + + +#elif defined(__FUJITSU) +# define COMPILER_ID "Fujitsu" +# if defined(__FCC_version__) +# define COMPILER_VERSION __FCC_version__ +# elif defined(__FCC_major__) +# define COMPILER_VERSION_MAJOR DEC(__FCC_major__) +# define COMPILER_VERSION_MINOR DEC(__FCC_minor__) +# define COMPILER_VERSION_PATCH DEC(__FCC_patchlevel__) +# endif +# if defined(__fcc_version) +# define COMPILER_VERSION_INTERNAL DEC(__fcc_version) +# elif defined(__FCC_VERSION) +# define COMPILER_VERSION_INTERNAL DEC(__FCC_VERSION) +# endif + + +#elif defined(__ghs__) +# define COMPILER_ID "GHS" +/* __GHS_VERSION_NUMBER = VVVVRP */ +# ifdef __GHS_VERSION_NUMBER +# define COMPILER_VERSION_MAJOR DEC(__GHS_VERSION_NUMBER / 100) +# define COMPILER_VERSION_MINOR DEC(__GHS_VERSION_NUMBER / 10 % 10) +# define COMPILER_VERSION_PATCH DEC(__GHS_VERSION_NUMBER % 10) +# endif + +#elif defined(__TASKING__) +# define COMPILER_ID "Tasking" + # define COMPILER_VERSION_MAJOR DEC(__VERSION__/1000) + # define COMPILER_VERSION_MINOR DEC(__VERSION__ % 100) +# define COMPILER_VERSION_INTERNAL DEC(__VERSION__) + +#elif defined(__ORANGEC__) +# define COMPILER_ID "OrangeC" +# define COMPILER_VERSION_MAJOR DEC(__ORANGEC_MAJOR__) +# define COMPILER_VERSION_MINOR DEC(__ORANGEC_MINOR__) +# define COMPILER_VERSION_PATCH DEC(__ORANGEC_PATCHLEVEL__) + +#elif defined(__TINYC__) +# define COMPILER_ID "TinyCC" + +#elif defined(__BCC__) +# define COMPILER_ID "Bruce" + +#elif defined(__SCO_VERSION__) +# define COMPILER_ID "SCO" + +#elif defined(__ARMCC_VERSION) && !defined(__clang__) +# define COMPILER_ID "ARMCC" +#if __ARMCC_VERSION >= 1000000 + /* __ARMCC_VERSION = VRRPPPP */ + # define COMPILER_VERSION_MAJOR DEC(__ARMCC_VERSION/1000000) + # define COMPILER_VERSION_MINOR DEC(__ARMCC_VERSION/10000 % 100) + # define COMPILER_VERSION_PATCH DEC(__ARMCC_VERSION % 10000) +#else + /* __ARMCC_VERSION = VRPPPP */ + # define COMPILER_VERSION_MAJOR DEC(__ARMCC_VERSION/100000) + # define COMPILER_VERSION_MINOR DEC(__ARMCC_VERSION/10000 % 10) + # define COMPILER_VERSION_PATCH DEC(__ARMCC_VERSION % 10000) +#endif + + +#elif defined(__clang__) && defined(__apple_build_version__) +# define COMPILER_ID "AppleClang" +# if defined(_MSC_VER) +# define SIMULATE_ID "MSVC" +# endif +# define COMPILER_VERSION_MAJOR DEC(__clang_major__) +# define COMPILER_VERSION_MINOR DEC(__clang_minor__) +# define COMPILER_VERSION_PATCH DEC(__clang_patchlevel__) +# if defined(_MSC_VER) + /* _MSC_VER = VVRR */ +# define SIMULATE_VERSION_MAJOR DEC(_MSC_VER / 100) +# define SIMULATE_VERSION_MINOR DEC(_MSC_VER % 100) +# endif +# define COMPILER_VERSION_TWEAK DEC(__apple_build_version__) + +#elif defined(__clang__) && defined(__ARMCOMPILER_VERSION) +# define COMPILER_ID "ARMClang" + # define COMPILER_VERSION_MAJOR DEC(__ARMCOMPILER_VERSION/1000000) + # define COMPILER_VERSION_MINOR DEC(__ARMCOMPILER_VERSION/10000 % 100) + # define COMPILER_VERSION_PATCH DEC(__ARMCOMPILER_VERSION/100 % 100) +# define COMPILER_VERSION_INTERNAL DEC(__ARMCOMPILER_VERSION) + +#elif defined(__clang__) && defined(__ti__) +# define COMPILER_ID "TIClang" + # define COMPILER_VERSION_MAJOR DEC(__ti_major__) + # define COMPILER_VERSION_MINOR DEC(__ti_minor__) + # define COMPILER_VERSION_PATCH DEC(__ti_patchlevel__) +# define COMPILER_VERSION_INTERNAL DEC(__ti_version__) + +#elif defined(__clang__) +# define COMPILER_ID "Clang" +# if defined(_MSC_VER) +# define SIMULATE_ID "MSVC" +# endif +# define COMPILER_VERSION_MAJOR DEC(__clang_major__) +# define COMPILER_VERSION_MINOR DEC(__clang_minor__) +# define COMPILER_VERSION_PATCH DEC(__clang_patchlevel__) +# if defined(_MSC_VER) + /* _MSC_VER = VVRR */ +# define SIMULATE_VERSION_MAJOR DEC(_MSC_VER / 100) +# define SIMULATE_VERSION_MINOR DEC(_MSC_VER % 100) +# endif + +#elif defined(__LCC__) && (defined(__GNUC__) || defined(__GNUG__) || defined(__MCST__)) +# define COMPILER_ID "LCC" +# define COMPILER_VERSION_MAJOR DEC(__LCC__ / 100) +# define COMPILER_VERSION_MINOR DEC(__LCC__ % 100) +# if defined(__LCC_MINOR__) +# define COMPILER_VERSION_PATCH DEC(__LCC_MINOR__) +# endif +# if defined(__GNUC__) && defined(__GNUC_MINOR__) +# define SIMULATE_ID "GNU" +# define SIMULATE_VERSION_MAJOR DEC(__GNUC__) +# define SIMULATE_VERSION_MINOR DEC(__GNUC_MINOR__) +# if defined(__GNUC_PATCHLEVEL__) +# define SIMULATE_VERSION_PATCH DEC(__GNUC_PATCHLEVEL__) +# endif +# endif + +#elif defined(__GNUC__) +# define COMPILER_ID "GNU" +# define COMPILER_VERSION_MAJOR DEC(__GNUC__) +# if defined(__GNUC_MINOR__) +# define COMPILER_VERSION_MINOR DEC(__GNUC_MINOR__) +# endif +# if defined(__GNUC_PATCHLEVEL__) +# define COMPILER_VERSION_PATCH DEC(__GNUC_PATCHLEVEL__) +# endif + +#elif defined(_MSC_VER) +# define COMPILER_ID "MSVC" + /* _MSC_VER = VVRR */ +# define COMPILER_VERSION_MAJOR DEC(_MSC_VER / 100) +# define COMPILER_VERSION_MINOR DEC(_MSC_VER % 100) +# if defined(_MSC_FULL_VER) +# if _MSC_VER >= 1400 + /* _MSC_FULL_VER = VVRRPPPPP */ +# define COMPILER_VERSION_PATCH DEC(_MSC_FULL_VER % 100000) +# else + /* _MSC_FULL_VER = VVRRPPPP */ +# define COMPILER_VERSION_PATCH DEC(_MSC_FULL_VER % 10000) +# endif +# endif +# if defined(_MSC_BUILD) +# define COMPILER_VERSION_TWEAK DEC(_MSC_BUILD) +# endif + +#elif defined(_ADI_COMPILER) +# define COMPILER_ID "ADSP" +#if defined(__VERSIONNUM__) + /* __VERSIONNUM__ = 0xVVRRPPTT */ +# define COMPILER_VERSION_MAJOR DEC(__VERSIONNUM__ >> 24 & 0xFF) +# define COMPILER_VERSION_MINOR DEC(__VERSIONNUM__ >> 16 & 0xFF) +# define COMPILER_VERSION_PATCH DEC(__VERSIONNUM__ >> 8 & 0xFF) +# define COMPILER_VERSION_TWEAK DEC(__VERSIONNUM__ & 0xFF) +#endif + +#elif defined(__IAR_SYSTEMS_ICC__) || defined(__IAR_SYSTEMS_ICC) +# define COMPILER_ID "IAR" +# if defined(__VER__) && defined(__ICCARM__) +# define COMPILER_VERSION_MAJOR DEC((__VER__) / 1000000) +# define COMPILER_VERSION_MINOR DEC(((__VER__) / 1000) % 1000) +# define COMPILER_VERSION_PATCH DEC((__VER__) % 1000) +# define COMPILER_VERSION_INTERNAL DEC(__IAR_SYSTEMS_ICC__) +# elif defined(__VER__) && (defined(__ICCAVR__) || defined(__ICCRX__) || defined(__ICCRH850__) || defined(__ICCRL78__) || defined(__ICC430__) || defined(__ICCRISCV__) || defined(__ICCV850__) || defined(__ICC8051__) || defined(__ICCSTM8__)) +# define COMPILER_VERSION_MAJOR DEC((__VER__) / 100) +# define COMPILER_VERSION_MINOR DEC((__VER__) - (((__VER__) / 100)*100)) +# define COMPILER_VERSION_PATCH DEC(__SUBVERSION__) +# define COMPILER_VERSION_INTERNAL DEC(__IAR_SYSTEMS_ICC__) +# endif + +#elif defined(__SDCC_VERSION_MAJOR) || defined(SDCC) +# define COMPILER_ID "SDCC" +# if defined(__SDCC_VERSION_MAJOR) +# define COMPILER_VERSION_MAJOR DEC(__SDCC_VERSION_MAJOR) +# define COMPILER_VERSION_MINOR DEC(__SDCC_VERSION_MINOR) +# define COMPILER_VERSION_PATCH DEC(__SDCC_VERSION_PATCH) +# else + /* SDCC = VRP */ +# define COMPILER_VERSION_MAJOR DEC(SDCC/100) +# define COMPILER_VERSION_MINOR DEC(SDCC/10 % 10) +# define COMPILER_VERSION_PATCH DEC(SDCC % 10) +# endif + + +/* These compilers are either not known or too old to define an + identification macro. Try to identify the platform and guess that + it is the native compiler. */ +#elif defined(__hpux) || defined(__hpua) +# define COMPILER_ID "HP" + +#else /* unknown compiler */ +# define COMPILER_ID "" +#endif + +/* Construct the string literal in pieces to prevent the source from + getting matched. Store it in a pointer rather than an array + because some compilers will just produce instructions to fill the + array rather than assigning a pointer to a static array. */ +char const* info_compiler = "INFO" ":" "compiler[" COMPILER_ID "]"; +#ifdef SIMULATE_ID +char const* info_simulate = "INFO" ":" "simulate[" SIMULATE_ID "]"; +#endif + +#ifdef __QNXNTO__ +char const* qnxnto = "INFO" ":" "qnxnto[]"; +#endif + +#if defined(__CRAYXT_COMPUTE_LINUX_TARGET) +char const *info_cray = "INFO" ":" "compiler_wrapper[CrayPrgEnv]"; +#endif + +#define STRINGIFY_HELPER(X) #X +#define STRINGIFY(X) STRINGIFY_HELPER(X) + +/* Identify known platforms by name. */ +#if defined(__linux) || defined(__linux__) || defined(linux) +# define PLATFORM_ID "Linux" + +#elif defined(__MSYS__) +# define PLATFORM_ID "MSYS" + +#elif defined(__CYGWIN__) +# define PLATFORM_ID "Cygwin" + +#elif defined(__MINGW32__) +# define PLATFORM_ID "MinGW" + +#elif defined(__APPLE__) +# define PLATFORM_ID "Darwin" + +#elif defined(_WIN32) || defined(__WIN32__) || defined(WIN32) +# define PLATFORM_ID "Windows" + +#elif defined(__FreeBSD__) || defined(__FreeBSD) +# define PLATFORM_ID "FreeBSD" + +#elif defined(__NetBSD__) || defined(__NetBSD) +# define PLATFORM_ID "NetBSD" + +#elif defined(__OpenBSD__) || defined(__OPENBSD) +# define PLATFORM_ID "OpenBSD" + +#elif defined(__sun) || defined(sun) +# define PLATFORM_ID "SunOS" + +#elif defined(_AIX) || defined(__AIX) || defined(__AIX__) || defined(__aix) || defined(__aix__) +# define PLATFORM_ID "AIX" + +#elif defined(__hpux) || defined(__hpux__) +# define PLATFORM_ID "HP-UX" + +#elif defined(__HAIKU__) +# define PLATFORM_ID "Haiku" + +#elif defined(__BeOS) || defined(__BEOS__) || defined(_BEOS) +# define PLATFORM_ID "BeOS" + +#elif defined(__QNX__) || defined(__QNXNTO__) +# define PLATFORM_ID "QNX" + +#elif defined(__tru64) || defined(_tru64) || defined(__TRU64__) +# define PLATFORM_ID "Tru64" + +#elif defined(__riscos) || defined(__riscos__) +# define PLATFORM_ID "RISCos" + +#elif defined(__sinix) || defined(__sinix__) || defined(__SINIX__) +# define PLATFORM_ID "SINIX" + +#elif defined(__UNIX_SV__) +# define PLATFORM_ID "UNIX_SV" + +#elif defined(__bsdos__) +# define PLATFORM_ID "BSDOS" + +#elif defined(_MPRAS) || defined(MPRAS) +# define PLATFORM_ID "MP-RAS" + +#elif defined(__osf) || defined(__osf__) +# define PLATFORM_ID "OSF1" + +#elif defined(_SCO_SV) || defined(SCO_SV) || defined(sco_sv) +# define PLATFORM_ID "SCO_SV" + +#elif defined(__ultrix) || defined(__ultrix__) || defined(_ULTRIX) +# define PLATFORM_ID "ULTRIX" + +#elif defined(__XENIX__) || defined(_XENIX) || defined(XENIX) +# define PLATFORM_ID "Xenix" + +#elif defined(__WATCOMC__) +# if defined(__LINUX__) +# define PLATFORM_ID "Linux" + +# elif defined(__DOS__) +# define PLATFORM_ID "DOS" + +# elif defined(__OS2__) +# define PLATFORM_ID "OS2" + +# elif defined(__WINDOWS__) +# define PLATFORM_ID "Windows3x" + +# elif defined(__VXWORKS__) +# define PLATFORM_ID "VxWorks" + +# else /* unknown platform */ +# define PLATFORM_ID +# endif + +#elif defined(__INTEGRITY) +# if defined(INT_178B) +# define PLATFORM_ID "Integrity178" + +# else /* regular Integrity */ +# define PLATFORM_ID "Integrity" +# endif + +# elif defined(_ADI_COMPILER) +# define PLATFORM_ID "ADSP" + +#else /* unknown platform */ +# define PLATFORM_ID + +#endif + +/* For windows compilers MSVC and Intel we can determine + the architecture of the compiler being used. This is because + the compilers do not have flags that can change the architecture, + but rather depend on which compiler is being used +*/ +#if defined(_WIN32) && defined(_MSC_VER) +# if defined(_M_IA64) +# define ARCHITECTURE_ID "IA64" + +# elif defined(_M_ARM64EC) +# define ARCHITECTURE_ID "ARM64EC" + +# elif defined(_M_X64) || defined(_M_AMD64) +# define ARCHITECTURE_ID "x64" + +# elif defined(_M_IX86) +# define ARCHITECTURE_ID "X86" + +# elif defined(_M_ARM64) +# define ARCHITECTURE_ID "ARM64" + +# elif defined(_M_ARM) +# if _M_ARM == 4 +# define ARCHITECTURE_ID "ARMV4I" +# elif _M_ARM == 5 +# define ARCHITECTURE_ID "ARMV5I" +# else +# define ARCHITECTURE_ID "ARMV" STRINGIFY(_M_ARM) +# endif + +# elif defined(_M_MIPS) +# define ARCHITECTURE_ID "MIPS" + +# elif defined(_M_SH) +# define ARCHITECTURE_ID "SHx" + +# else /* unknown architecture */ +# define ARCHITECTURE_ID "" +# endif + +#elif defined(__WATCOMC__) +# if defined(_M_I86) +# define ARCHITECTURE_ID "I86" + +# elif defined(_M_IX86) +# define ARCHITECTURE_ID "X86" + +# else /* unknown architecture */ +# define ARCHITECTURE_ID "" +# endif + +#elif defined(__IAR_SYSTEMS_ICC__) || defined(__IAR_SYSTEMS_ICC) +# if defined(__ICCARM__) +# define ARCHITECTURE_ID "ARM" + +# elif defined(__ICCRX__) +# define ARCHITECTURE_ID "RX" + +# elif defined(__ICCRH850__) +# define ARCHITECTURE_ID "RH850" + +# elif defined(__ICCRL78__) +# define ARCHITECTURE_ID "RL78" + +# elif defined(__ICCRISCV__) +# define ARCHITECTURE_ID "RISCV" + +# elif defined(__ICCAVR__) +# define ARCHITECTURE_ID "AVR" + +# elif defined(__ICC430__) +# define ARCHITECTURE_ID "MSP430" + +# elif defined(__ICCV850__) +# define ARCHITECTURE_ID "V850" + +# elif defined(__ICC8051__) +# define ARCHITECTURE_ID "8051" + +# elif defined(__ICCSTM8__) +# define ARCHITECTURE_ID "STM8" + +# else /* unknown architecture */ +# define ARCHITECTURE_ID "" +# endif + +#elif defined(__ghs__) +# if defined(__PPC64__) +# define ARCHITECTURE_ID "PPC64" + +# elif defined(__ppc__) +# define ARCHITECTURE_ID "PPC" + +# elif defined(__ARM__) +# define ARCHITECTURE_ID "ARM" + +# elif defined(__x86_64__) +# define ARCHITECTURE_ID "x64" + +# elif defined(__i386__) +# define ARCHITECTURE_ID "X86" + +# else /* unknown architecture */ +# define ARCHITECTURE_ID "" +# endif + +#elif defined(__clang__) && defined(__ti__) +# if defined(__ARM_ARCH) +# define ARCHITECTURE_ID "Arm" + +# else /* unknown architecture */ +# define ARCHITECTURE_ID "" +# endif + +#elif defined(__TI_COMPILER_VERSION__) +# if defined(__TI_ARM__) +# define ARCHITECTURE_ID "ARM" + +# elif defined(__MSP430__) +# define ARCHITECTURE_ID "MSP430" + +# elif defined(__TMS320C28XX__) +# define ARCHITECTURE_ID "TMS320C28x" + +# elif defined(__TMS320C6X__) || defined(_TMS320C6X) +# define ARCHITECTURE_ID "TMS320C6x" + +# else /* unknown architecture */ +# define ARCHITECTURE_ID "" +# endif + +# elif defined(__ADSPSHARC__) +# define ARCHITECTURE_ID "SHARC" + +# elif defined(__ADSPBLACKFIN__) +# define ARCHITECTURE_ID "Blackfin" + +#elif defined(__TASKING__) + +# if defined(__CTC__) || defined(__CPTC__) +# define ARCHITECTURE_ID "TriCore" + +# elif defined(__CMCS__) +# define ARCHITECTURE_ID "MCS" + +# elif defined(__CARM__) +# define ARCHITECTURE_ID "ARM" + +# elif defined(__CARC__) +# define ARCHITECTURE_ID "ARC" + +# elif defined(__C51__) +# define ARCHITECTURE_ID "8051" + +# elif defined(__CPCP__) +# define ARCHITECTURE_ID "PCP" + +# else +# define ARCHITECTURE_ID "" +# endif + +#else +# define ARCHITECTURE_ID +#endif + +/* Convert integer to decimal digit literals. */ +#define DEC(n) \ + ('0' + (((n) / 10000000)%10)), \ + ('0' + (((n) / 1000000)%10)), \ + ('0' + (((n) / 100000)%10)), \ + ('0' + (((n) / 10000)%10)), \ + ('0' + (((n) / 1000)%10)), \ + ('0' + (((n) / 100)%10)), \ + ('0' + (((n) / 10)%10)), \ + ('0' + ((n) % 10)) + +/* Convert integer to hex digit literals. */ +#define HEX(n) \ + ('0' + ((n)>>28 & 0xF)), \ + ('0' + ((n)>>24 & 0xF)), \ + ('0' + ((n)>>20 & 0xF)), \ + ('0' + ((n)>>16 & 0xF)), \ + ('0' + ((n)>>12 & 0xF)), \ + ('0' + ((n)>>8 & 0xF)), \ + ('0' + ((n)>>4 & 0xF)), \ + ('0' + ((n) & 0xF)) + +/* Construct a string literal encoding the version number. */ +#ifdef COMPILER_VERSION +char const* info_version = "INFO" ":" "compiler_version[" COMPILER_VERSION "]"; + +/* Construct a string literal encoding the version number components. */ +#elif defined(COMPILER_VERSION_MAJOR) +char const info_version[] = { + 'I', 'N', 'F', 'O', ':', + 'c','o','m','p','i','l','e','r','_','v','e','r','s','i','o','n','[', + COMPILER_VERSION_MAJOR, +# ifdef COMPILER_VERSION_MINOR + '.', COMPILER_VERSION_MINOR, +# ifdef COMPILER_VERSION_PATCH + '.', COMPILER_VERSION_PATCH, +# ifdef COMPILER_VERSION_TWEAK + '.', COMPILER_VERSION_TWEAK, +# endif +# endif +# endif + ']','\0'}; +#endif + +/* Construct a string literal encoding the internal version number. */ +#ifdef COMPILER_VERSION_INTERNAL +char const info_version_internal[] = { + 'I', 'N', 'F', 'O', ':', + 'c','o','m','p','i','l','e','r','_','v','e','r','s','i','o','n','_', + 'i','n','t','e','r','n','a','l','[', + COMPILER_VERSION_INTERNAL,']','\0'}; +#elif defined(COMPILER_VERSION_INTERNAL_STR) +char const* info_version_internal = "INFO" ":" "compiler_version_internal[" COMPILER_VERSION_INTERNAL_STR "]"; +#endif + +/* Construct a string literal encoding the version number components. */ +#ifdef SIMULATE_VERSION_MAJOR +char const info_simulate_version[] = { + 'I', 'N', 'F', 'O', ':', + 's','i','m','u','l','a','t','e','_','v','e','r','s','i','o','n','[', + SIMULATE_VERSION_MAJOR, +# ifdef SIMULATE_VERSION_MINOR + '.', SIMULATE_VERSION_MINOR, +# ifdef SIMULATE_VERSION_PATCH + '.', SIMULATE_VERSION_PATCH, +# ifdef SIMULATE_VERSION_TWEAK + '.', SIMULATE_VERSION_TWEAK, +# endif +# endif +# endif + ']','\0'}; +#endif + +/* Construct the string literal in pieces to prevent the source from + getting matched. Store it in a pointer rather than an array + because some compilers will just produce instructions to fill the + array rather than assigning a pointer to a static array. */ +char const* info_platform = "INFO" ":" "platform[" PLATFORM_ID "]"; +char const* info_arch = "INFO" ":" "arch[" ARCHITECTURE_ID "]"; + + + +#define C_STD_99 199901L +#define C_STD_11 201112L +#define C_STD_17 201710L +#define C_STD_23 202311L + +#ifdef __STDC_VERSION__ +# define C_STD __STDC_VERSION__ +#endif + +#if !defined(__STDC__) && !defined(__clang__) +# if defined(_MSC_VER) || defined(__ibmxl__) || defined(__IBMC__) +# define C_VERSION "90" +# else +# define C_VERSION +# endif +#elif C_STD > C_STD_17 +# define C_VERSION "23" +#elif C_STD > C_STD_11 +# define C_VERSION "17" +#elif C_STD > C_STD_99 +# define C_VERSION "11" +#elif C_STD >= C_STD_99 +# define C_VERSION "99" +#else +# define C_VERSION "90" +#endif +const char* info_language_standard_default = + "INFO" ":" "standard_default[" C_VERSION "]"; + +const char* info_language_extensions_default = "INFO" ":" "extensions_default[" +#if (defined(__clang__) || defined(__GNUC__) || defined(__xlC__) || \ + defined(__TI_COMPILER_VERSION__)) && \ + !defined(__STRICT_ANSI__) + "ON" +#else + "OFF" +#endif +"]"; + +/*--------------------------------------------------------------------------*/ + +#ifdef ID_VOID_MAIN +void main() {} +#else +# if defined(__CLASSIC_C__) +int main(argc, argv) int argc; char *argv[]; +# else +int main(int argc, char* argv[]) +# endif +{ + int require = 0; + require += info_compiler[argc]; + require += info_platform[argc]; + require += info_arch[argc]; +#ifdef COMPILER_VERSION_MAJOR + require += info_version[argc]; +#endif +#ifdef COMPILER_VERSION_INTERNAL + require += info_version_internal[argc]; +#endif +#ifdef SIMULATE_ID + require += info_simulate[argc]; +#endif +#ifdef SIMULATE_VERSION_MAJOR + require += info_simulate_version[argc]; +#endif +#if defined(__CRAYXT_COMPUTE_LINUX_TARGET) + require += info_cray[argc]; +#endif + require += info_language_standard_default[argc]; + require += info_language_extensions_default[argc]; + (void)argv; + return require; +} +#endif diff --git a/siro_rider/android/app/.cxx/RelWithDebInfo/6t1m4b5v/x86_64/CMakeFiles/3.31.5-g6cf5163/CompilerIdC/CMakeCCompilerId.o b/siro_rider/android/app/.cxx/RelWithDebInfo/6t1m4b5v/x86_64/CMakeFiles/3.31.5-g6cf5163/CompilerIdC/CMakeCCompilerId.o new file mode 100644 index 0000000..0dd9ddf Binary files /dev/null and b/siro_rider/android/app/.cxx/RelWithDebInfo/6t1m4b5v/x86_64/CMakeFiles/3.31.5-g6cf5163/CompilerIdC/CMakeCCompilerId.o differ diff --git a/siro_rider/android/app/.cxx/RelWithDebInfo/6t1m4b5v/x86_64/CMakeFiles/3.31.5-g6cf5163/CompilerIdCXX/CMakeCXXCompilerId.cpp b/siro_rider/android/app/.cxx/RelWithDebInfo/6t1m4b5v/x86_64/CMakeFiles/3.31.5-g6cf5163/CompilerIdCXX/CMakeCXXCompilerId.cpp new file mode 100644 index 0000000..da6c824 --- /dev/null +++ b/siro_rider/android/app/.cxx/RelWithDebInfo/6t1m4b5v/x86_64/CMakeFiles/3.31.5-g6cf5163/CompilerIdCXX/CMakeCXXCompilerId.cpp @@ -0,0 +1,919 @@ +/* This source file must have a .cpp extension so that all C++ compilers + recognize the extension without flags. Borland does not know .cxx for + example. */ +#ifndef __cplusplus +# error "A C compiler has been selected for C++." +#endif + +#if !defined(__has_include) +/* If the compiler does not have __has_include, pretend the answer is + always no. */ +# define __has_include(x) 0 +#endif + + +/* Version number components: V=Version, R=Revision, P=Patch + Version date components: YYYY=Year, MM=Month, DD=Day */ + +#if defined(__INTEL_COMPILER) || defined(__ICC) +# define COMPILER_ID "Intel" +# if defined(_MSC_VER) +# define SIMULATE_ID "MSVC" +# endif +# if defined(__GNUC__) +# define SIMULATE_ID "GNU" +# endif + /* __INTEL_COMPILER = VRP prior to 2021, and then VVVV for 2021 and later, + except that a few beta releases use the old format with V=2021. */ +# if __INTEL_COMPILER < 2021 || __INTEL_COMPILER == 202110 || __INTEL_COMPILER == 202111 +# define COMPILER_VERSION_MAJOR DEC(__INTEL_COMPILER/100) +# define COMPILER_VERSION_MINOR DEC(__INTEL_COMPILER/10 % 10) +# if defined(__INTEL_COMPILER_UPDATE) +# define COMPILER_VERSION_PATCH DEC(__INTEL_COMPILER_UPDATE) +# else +# define COMPILER_VERSION_PATCH DEC(__INTEL_COMPILER % 10) +# endif +# else +# define COMPILER_VERSION_MAJOR DEC(__INTEL_COMPILER) +# define COMPILER_VERSION_MINOR DEC(__INTEL_COMPILER_UPDATE) + /* The third version component from --version is an update index, + but no macro is provided for it. */ +# define COMPILER_VERSION_PATCH DEC(0) +# endif +# if defined(__INTEL_COMPILER_BUILD_DATE) + /* __INTEL_COMPILER_BUILD_DATE = YYYYMMDD */ +# define COMPILER_VERSION_TWEAK DEC(__INTEL_COMPILER_BUILD_DATE) +# endif +# if defined(_MSC_VER) + /* _MSC_VER = VVRR */ +# define SIMULATE_VERSION_MAJOR DEC(_MSC_VER / 100) +# define SIMULATE_VERSION_MINOR DEC(_MSC_VER % 100) +# endif +# if defined(__GNUC__) +# define SIMULATE_VERSION_MAJOR DEC(__GNUC__) +# elif defined(__GNUG__) +# define SIMULATE_VERSION_MAJOR DEC(__GNUG__) +# endif +# if defined(__GNUC_MINOR__) +# define SIMULATE_VERSION_MINOR DEC(__GNUC_MINOR__) +# endif +# if defined(__GNUC_PATCHLEVEL__) +# define SIMULATE_VERSION_PATCH DEC(__GNUC_PATCHLEVEL__) +# endif + +#elif (defined(__clang__) && defined(__INTEL_CLANG_COMPILER)) || defined(__INTEL_LLVM_COMPILER) +# define COMPILER_ID "IntelLLVM" +#if defined(_MSC_VER) +# define SIMULATE_ID "MSVC" +#endif +#if defined(__GNUC__) +# define SIMULATE_ID "GNU" +#endif +/* __INTEL_LLVM_COMPILER = VVVVRP prior to 2021.2.0, VVVVRRPP for 2021.2.0 and + * later. Look for 6 digit vs. 8 digit version number to decide encoding. + * VVVV is no smaller than the current year when a version is released. + */ +#if __INTEL_LLVM_COMPILER < 1000000L +# define COMPILER_VERSION_MAJOR DEC(__INTEL_LLVM_COMPILER/100) +# define COMPILER_VERSION_MINOR DEC(__INTEL_LLVM_COMPILER/10 % 10) +# define COMPILER_VERSION_PATCH DEC(__INTEL_LLVM_COMPILER % 10) +#else +# define COMPILER_VERSION_MAJOR DEC(__INTEL_LLVM_COMPILER/10000) +# define COMPILER_VERSION_MINOR DEC(__INTEL_LLVM_COMPILER/100 % 100) +# define COMPILER_VERSION_PATCH DEC(__INTEL_LLVM_COMPILER % 100) +#endif +#if defined(_MSC_VER) + /* _MSC_VER = VVRR */ +# define SIMULATE_VERSION_MAJOR DEC(_MSC_VER / 100) +# define SIMULATE_VERSION_MINOR DEC(_MSC_VER % 100) +#endif +#if defined(__GNUC__) +# define SIMULATE_VERSION_MAJOR DEC(__GNUC__) +#elif defined(__GNUG__) +# define SIMULATE_VERSION_MAJOR DEC(__GNUG__) +#endif +#if defined(__GNUC_MINOR__) +# define SIMULATE_VERSION_MINOR DEC(__GNUC_MINOR__) +#endif +#if defined(__GNUC_PATCHLEVEL__) +# define SIMULATE_VERSION_PATCH DEC(__GNUC_PATCHLEVEL__) +#endif + +#elif defined(__PATHCC__) +# define COMPILER_ID "PathScale" +# define COMPILER_VERSION_MAJOR DEC(__PATHCC__) +# define COMPILER_VERSION_MINOR DEC(__PATHCC_MINOR__) +# if defined(__PATHCC_PATCHLEVEL__) +# define COMPILER_VERSION_PATCH DEC(__PATHCC_PATCHLEVEL__) +# endif + +#elif defined(__BORLANDC__) && defined(__CODEGEARC_VERSION__) +# define COMPILER_ID "Embarcadero" +# define COMPILER_VERSION_MAJOR HEX(__CODEGEARC_VERSION__>>24 & 0x00FF) +# define COMPILER_VERSION_MINOR HEX(__CODEGEARC_VERSION__>>16 & 0x00FF) +# define COMPILER_VERSION_PATCH DEC(__CODEGEARC_VERSION__ & 0xFFFF) + +#elif defined(__BORLANDC__) +# define COMPILER_ID "Borland" + /* __BORLANDC__ = 0xVRR */ +# define COMPILER_VERSION_MAJOR HEX(__BORLANDC__>>8) +# define COMPILER_VERSION_MINOR HEX(__BORLANDC__ & 0xFF) + +#elif defined(__WATCOMC__) && __WATCOMC__ < 1200 +# define COMPILER_ID "Watcom" + /* __WATCOMC__ = VVRR */ +# define COMPILER_VERSION_MAJOR DEC(__WATCOMC__ / 100) +# define COMPILER_VERSION_MINOR DEC((__WATCOMC__ / 10) % 10) +# if (__WATCOMC__ % 10) > 0 +# define COMPILER_VERSION_PATCH DEC(__WATCOMC__ % 10) +# endif + +#elif defined(__WATCOMC__) +# define COMPILER_ID "OpenWatcom" + /* __WATCOMC__ = VVRP + 1100 */ +# define COMPILER_VERSION_MAJOR DEC((__WATCOMC__ - 1100) / 100) +# define COMPILER_VERSION_MINOR DEC((__WATCOMC__ / 10) % 10) +# if (__WATCOMC__ % 10) > 0 +# define COMPILER_VERSION_PATCH DEC(__WATCOMC__ % 10) +# endif + +#elif defined(__SUNPRO_CC) +# define COMPILER_ID "SunPro" +# if __SUNPRO_CC >= 0x5100 + /* __SUNPRO_CC = 0xVRRP */ +# define COMPILER_VERSION_MAJOR HEX(__SUNPRO_CC>>12) +# define COMPILER_VERSION_MINOR HEX(__SUNPRO_CC>>4 & 0xFF) +# define COMPILER_VERSION_PATCH HEX(__SUNPRO_CC & 0xF) +# else + /* __SUNPRO_CC = 0xVRP */ +# define COMPILER_VERSION_MAJOR HEX(__SUNPRO_CC>>8) +# define COMPILER_VERSION_MINOR HEX(__SUNPRO_CC>>4 & 0xF) +# define COMPILER_VERSION_PATCH HEX(__SUNPRO_CC & 0xF) +# endif + +#elif defined(__HP_aCC) +# define COMPILER_ID "HP" + /* __HP_aCC = VVRRPP */ +# define COMPILER_VERSION_MAJOR DEC(__HP_aCC/10000) +# define COMPILER_VERSION_MINOR DEC(__HP_aCC/100 % 100) +# define COMPILER_VERSION_PATCH DEC(__HP_aCC % 100) + +#elif defined(__DECCXX) +# define COMPILER_ID "Compaq" + /* __DECCXX_VER = VVRRTPPPP */ +# define COMPILER_VERSION_MAJOR DEC(__DECCXX_VER/10000000) +# define COMPILER_VERSION_MINOR DEC(__DECCXX_VER/100000 % 100) +# define COMPILER_VERSION_PATCH DEC(__DECCXX_VER % 10000) + +#elif defined(__IBMCPP__) && defined(__COMPILER_VER__) +# define COMPILER_ID "zOS" + /* __IBMCPP__ = VRP */ +# define COMPILER_VERSION_MAJOR DEC(__IBMCPP__/100) +# define COMPILER_VERSION_MINOR DEC(__IBMCPP__/10 % 10) +# define COMPILER_VERSION_PATCH DEC(__IBMCPP__ % 10) + +#elif defined(__open_xl__) && defined(__clang__) +# define COMPILER_ID "IBMClang" +# define COMPILER_VERSION_MAJOR DEC(__open_xl_version__) +# define COMPILER_VERSION_MINOR DEC(__open_xl_release__) +# define COMPILER_VERSION_PATCH DEC(__open_xl_modification__) +# define COMPILER_VERSION_TWEAK DEC(__open_xl_ptf_fix_level__) + + +#elif defined(__ibmxl__) && defined(__clang__) +# define COMPILER_ID "XLClang" +# define COMPILER_VERSION_MAJOR DEC(__ibmxl_version__) +# define COMPILER_VERSION_MINOR DEC(__ibmxl_release__) +# define COMPILER_VERSION_PATCH DEC(__ibmxl_modification__) +# define COMPILER_VERSION_TWEAK DEC(__ibmxl_ptf_fix_level__) + + +#elif defined(__IBMCPP__) && !defined(__COMPILER_VER__) && __IBMCPP__ >= 800 +# define COMPILER_ID "XL" + /* __IBMCPP__ = VRP */ +# define COMPILER_VERSION_MAJOR DEC(__IBMCPP__/100) +# define COMPILER_VERSION_MINOR DEC(__IBMCPP__/10 % 10) +# define COMPILER_VERSION_PATCH DEC(__IBMCPP__ % 10) + +#elif defined(__IBMCPP__) && !defined(__COMPILER_VER__) && __IBMCPP__ < 800 +# define COMPILER_ID "VisualAge" + /* __IBMCPP__ = VRP */ +# define COMPILER_VERSION_MAJOR DEC(__IBMCPP__/100) +# define COMPILER_VERSION_MINOR DEC(__IBMCPP__/10 % 10) +# define COMPILER_VERSION_PATCH DEC(__IBMCPP__ % 10) + +#elif defined(__NVCOMPILER) +# define COMPILER_ID "NVHPC" +# define COMPILER_VERSION_MAJOR DEC(__NVCOMPILER_MAJOR__) +# define COMPILER_VERSION_MINOR DEC(__NVCOMPILER_MINOR__) +# if defined(__NVCOMPILER_PATCHLEVEL__) +# define COMPILER_VERSION_PATCH DEC(__NVCOMPILER_PATCHLEVEL__) +# endif + +#elif defined(__PGI) +# define COMPILER_ID "PGI" +# define COMPILER_VERSION_MAJOR DEC(__PGIC__) +# define COMPILER_VERSION_MINOR DEC(__PGIC_MINOR__) +# if defined(__PGIC_PATCHLEVEL__) +# define COMPILER_VERSION_PATCH DEC(__PGIC_PATCHLEVEL__) +# endif + +#elif defined(__clang__) && defined(__cray__) +# define COMPILER_ID "CrayClang" +# define COMPILER_VERSION_MAJOR DEC(__cray_major__) +# define COMPILER_VERSION_MINOR DEC(__cray_minor__) +# define COMPILER_VERSION_PATCH DEC(__cray_patchlevel__) +# define COMPILER_VERSION_INTERNAL_STR __clang_version__ + + +#elif defined(_CRAYC) +# define COMPILER_ID "Cray" +# define COMPILER_VERSION_MAJOR DEC(_RELEASE_MAJOR) +# define COMPILER_VERSION_MINOR DEC(_RELEASE_MINOR) + +#elif defined(__TI_COMPILER_VERSION__) +# define COMPILER_ID "TI" + /* __TI_COMPILER_VERSION__ = VVVRRRPPP */ +# define COMPILER_VERSION_MAJOR DEC(__TI_COMPILER_VERSION__/1000000) +# define COMPILER_VERSION_MINOR DEC(__TI_COMPILER_VERSION__/1000 % 1000) +# define COMPILER_VERSION_PATCH DEC(__TI_COMPILER_VERSION__ % 1000) + +#elif defined(__CLANG_FUJITSU) +# define COMPILER_ID "FujitsuClang" +# define COMPILER_VERSION_MAJOR DEC(__FCC_major__) +# define COMPILER_VERSION_MINOR DEC(__FCC_minor__) +# define COMPILER_VERSION_PATCH DEC(__FCC_patchlevel__) +# define COMPILER_VERSION_INTERNAL_STR __clang_version__ + + +#elif defined(__FUJITSU) +# define COMPILER_ID "Fujitsu" +# if defined(__FCC_version__) +# define COMPILER_VERSION __FCC_version__ +# elif defined(__FCC_major__) +# define COMPILER_VERSION_MAJOR DEC(__FCC_major__) +# define COMPILER_VERSION_MINOR DEC(__FCC_minor__) +# define COMPILER_VERSION_PATCH DEC(__FCC_patchlevel__) +# endif +# if defined(__fcc_version) +# define COMPILER_VERSION_INTERNAL DEC(__fcc_version) +# elif defined(__FCC_VERSION) +# define COMPILER_VERSION_INTERNAL DEC(__FCC_VERSION) +# endif + + +#elif defined(__ghs__) +# define COMPILER_ID "GHS" +/* __GHS_VERSION_NUMBER = VVVVRP */ +# ifdef __GHS_VERSION_NUMBER +# define COMPILER_VERSION_MAJOR DEC(__GHS_VERSION_NUMBER / 100) +# define COMPILER_VERSION_MINOR DEC(__GHS_VERSION_NUMBER / 10 % 10) +# define COMPILER_VERSION_PATCH DEC(__GHS_VERSION_NUMBER % 10) +# endif + +#elif defined(__TASKING__) +# define COMPILER_ID "Tasking" + # define COMPILER_VERSION_MAJOR DEC(__VERSION__/1000) + # define COMPILER_VERSION_MINOR DEC(__VERSION__ % 100) +# define COMPILER_VERSION_INTERNAL DEC(__VERSION__) + +#elif defined(__ORANGEC__) +# define COMPILER_ID "OrangeC" +# define COMPILER_VERSION_MAJOR DEC(__ORANGEC_MAJOR__) +# define COMPILER_VERSION_MINOR DEC(__ORANGEC_MINOR__) +# define COMPILER_VERSION_PATCH DEC(__ORANGEC_PATCHLEVEL__) + +#elif defined(__SCO_VERSION__) +# define COMPILER_ID "SCO" + +#elif defined(__ARMCC_VERSION) && !defined(__clang__) +# define COMPILER_ID "ARMCC" +#if __ARMCC_VERSION >= 1000000 + /* __ARMCC_VERSION = VRRPPPP */ + # define COMPILER_VERSION_MAJOR DEC(__ARMCC_VERSION/1000000) + # define COMPILER_VERSION_MINOR DEC(__ARMCC_VERSION/10000 % 100) + # define COMPILER_VERSION_PATCH DEC(__ARMCC_VERSION % 10000) +#else + /* __ARMCC_VERSION = VRPPPP */ + # define COMPILER_VERSION_MAJOR DEC(__ARMCC_VERSION/100000) + # define COMPILER_VERSION_MINOR DEC(__ARMCC_VERSION/10000 % 10) + # define COMPILER_VERSION_PATCH DEC(__ARMCC_VERSION % 10000) +#endif + + +#elif defined(__clang__) && defined(__apple_build_version__) +# define COMPILER_ID "AppleClang" +# if defined(_MSC_VER) +# define SIMULATE_ID "MSVC" +# endif +# define COMPILER_VERSION_MAJOR DEC(__clang_major__) +# define COMPILER_VERSION_MINOR DEC(__clang_minor__) +# define COMPILER_VERSION_PATCH DEC(__clang_patchlevel__) +# if defined(_MSC_VER) + /* _MSC_VER = VVRR */ +# define SIMULATE_VERSION_MAJOR DEC(_MSC_VER / 100) +# define SIMULATE_VERSION_MINOR DEC(_MSC_VER % 100) +# endif +# define COMPILER_VERSION_TWEAK DEC(__apple_build_version__) + +#elif defined(__clang__) && defined(__ARMCOMPILER_VERSION) +# define COMPILER_ID "ARMClang" + # define COMPILER_VERSION_MAJOR DEC(__ARMCOMPILER_VERSION/1000000) + # define COMPILER_VERSION_MINOR DEC(__ARMCOMPILER_VERSION/10000 % 100) + # define COMPILER_VERSION_PATCH DEC(__ARMCOMPILER_VERSION/100 % 100) +# define COMPILER_VERSION_INTERNAL DEC(__ARMCOMPILER_VERSION) + +#elif defined(__clang__) && defined(__ti__) +# define COMPILER_ID "TIClang" + # define COMPILER_VERSION_MAJOR DEC(__ti_major__) + # define COMPILER_VERSION_MINOR DEC(__ti_minor__) + # define COMPILER_VERSION_PATCH DEC(__ti_patchlevel__) +# define COMPILER_VERSION_INTERNAL DEC(__ti_version__) + +#elif defined(__clang__) +# define COMPILER_ID "Clang" +# if defined(_MSC_VER) +# define SIMULATE_ID "MSVC" +# endif +# define COMPILER_VERSION_MAJOR DEC(__clang_major__) +# define COMPILER_VERSION_MINOR DEC(__clang_minor__) +# define COMPILER_VERSION_PATCH DEC(__clang_patchlevel__) +# if defined(_MSC_VER) + /* _MSC_VER = VVRR */ +# define SIMULATE_VERSION_MAJOR DEC(_MSC_VER / 100) +# define SIMULATE_VERSION_MINOR DEC(_MSC_VER % 100) +# endif + +#elif defined(__LCC__) && (defined(__GNUC__) || defined(__GNUG__) || defined(__MCST__)) +# define COMPILER_ID "LCC" +# define COMPILER_VERSION_MAJOR DEC(__LCC__ / 100) +# define COMPILER_VERSION_MINOR DEC(__LCC__ % 100) +# if defined(__LCC_MINOR__) +# define COMPILER_VERSION_PATCH DEC(__LCC_MINOR__) +# endif +# if defined(__GNUC__) && defined(__GNUC_MINOR__) +# define SIMULATE_ID "GNU" +# define SIMULATE_VERSION_MAJOR DEC(__GNUC__) +# define SIMULATE_VERSION_MINOR DEC(__GNUC_MINOR__) +# if defined(__GNUC_PATCHLEVEL__) +# define SIMULATE_VERSION_PATCH DEC(__GNUC_PATCHLEVEL__) +# endif +# endif + +#elif defined(__GNUC__) || defined(__GNUG__) +# define COMPILER_ID "GNU" +# if defined(__GNUC__) +# define COMPILER_VERSION_MAJOR DEC(__GNUC__) +# else +# define COMPILER_VERSION_MAJOR DEC(__GNUG__) +# endif +# if defined(__GNUC_MINOR__) +# define COMPILER_VERSION_MINOR DEC(__GNUC_MINOR__) +# endif +# if defined(__GNUC_PATCHLEVEL__) +# define COMPILER_VERSION_PATCH DEC(__GNUC_PATCHLEVEL__) +# endif + +#elif defined(_MSC_VER) +# define COMPILER_ID "MSVC" + /* _MSC_VER = VVRR */ +# define COMPILER_VERSION_MAJOR DEC(_MSC_VER / 100) +# define COMPILER_VERSION_MINOR DEC(_MSC_VER % 100) +# if defined(_MSC_FULL_VER) +# if _MSC_VER >= 1400 + /* _MSC_FULL_VER = VVRRPPPPP */ +# define COMPILER_VERSION_PATCH DEC(_MSC_FULL_VER % 100000) +# else + /* _MSC_FULL_VER = VVRRPPPP */ +# define COMPILER_VERSION_PATCH DEC(_MSC_FULL_VER % 10000) +# endif +# endif +# if defined(_MSC_BUILD) +# define COMPILER_VERSION_TWEAK DEC(_MSC_BUILD) +# endif + +#elif defined(_ADI_COMPILER) +# define COMPILER_ID "ADSP" +#if defined(__VERSIONNUM__) + /* __VERSIONNUM__ = 0xVVRRPPTT */ +# define COMPILER_VERSION_MAJOR DEC(__VERSIONNUM__ >> 24 & 0xFF) +# define COMPILER_VERSION_MINOR DEC(__VERSIONNUM__ >> 16 & 0xFF) +# define COMPILER_VERSION_PATCH DEC(__VERSIONNUM__ >> 8 & 0xFF) +# define COMPILER_VERSION_TWEAK DEC(__VERSIONNUM__ & 0xFF) +#endif + +#elif defined(__IAR_SYSTEMS_ICC__) || defined(__IAR_SYSTEMS_ICC) +# define COMPILER_ID "IAR" +# if defined(__VER__) && defined(__ICCARM__) +# define COMPILER_VERSION_MAJOR DEC((__VER__) / 1000000) +# define COMPILER_VERSION_MINOR DEC(((__VER__) / 1000) % 1000) +# define COMPILER_VERSION_PATCH DEC((__VER__) % 1000) +# define COMPILER_VERSION_INTERNAL DEC(__IAR_SYSTEMS_ICC__) +# elif defined(__VER__) && (defined(__ICCAVR__) || defined(__ICCRX__) || defined(__ICCRH850__) || defined(__ICCRL78__) || defined(__ICC430__) || defined(__ICCRISCV__) || defined(__ICCV850__) || defined(__ICC8051__) || defined(__ICCSTM8__)) +# define COMPILER_VERSION_MAJOR DEC((__VER__) / 100) +# define COMPILER_VERSION_MINOR DEC((__VER__) - (((__VER__) / 100)*100)) +# define COMPILER_VERSION_PATCH DEC(__SUBVERSION__) +# define COMPILER_VERSION_INTERNAL DEC(__IAR_SYSTEMS_ICC__) +# endif + + +/* These compilers are either not known or too old to define an + identification macro. Try to identify the platform and guess that + it is the native compiler. */ +#elif defined(__hpux) || defined(__hpua) +# define COMPILER_ID "HP" + +#else /* unknown compiler */ +# define COMPILER_ID "" +#endif + +/* Construct the string literal in pieces to prevent the source from + getting matched. Store it in a pointer rather than an array + because some compilers will just produce instructions to fill the + array rather than assigning a pointer to a static array. */ +char const* info_compiler = "INFO" ":" "compiler[" COMPILER_ID "]"; +#ifdef SIMULATE_ID +char const* info_simulate = "INFO" ":" "simulate[" SIMULATE_ID "]"; +#endif + +#ifdef __QNXNTO__ +char const* qnxnto = "INFO" ":" "qnxnto[]"; +#endif + +#if defined(__CRAYXT_COMPUTE_LINUX_TARGET) +char const *info_cray = "INFO" ":" "compiler_wrapper[CrayPrgEnv]"; +#endif + +#define STRINGIFY_HELPER(X) #X +#define STRINGIFY(X) STRINGIFY_HELPER(X) + +/* Identify known platforms by name. */ +#if defined(__linux) || defined(__linux__) || defined(linux) +# define PLATFORM_ID "Linux" + +#elif defined(__MSYS__) +# define PLATFORM_ID "MSYS" + +#elif defined(__CYGWIN__) +# define PLATFORM_ID "Cygwin" + +#elif defined(__MINGW32__) +# define PLATFORM_ID "MinGW" + +#elif defined(__APPLE__) +# define PLATFORM_ID "Darwin" + +#elif defined(_WIN32) || defined(__WIN32__) || defined(WIN32) +# define PLATFORM_ID "Windows" + +#elif defined(__FreeBSD__) || defined(__FreeBSD) +# define PLATFORM_ID "FreeBSD" + +#elif defined(__NetBSD__) || defined(__NetBSD) +# define PLATFORM_ID "NetBSD" + +#elif defined(__OpenBSD__) || defined(__OPENBSD) +# define PLATFORM_ID "OpenBSD" + +#elif defined(__sun) || defined(sun) +# define PLATFORM_ID "SunOS" + +#elif defined(_AIX) || defined(__AIX) || defined(__AIX__) || defined(__aix) || defined(__aix__) +# define PLATFORM_ID "AIX" + +#elif defined(__hpux) || defined(__hpux__) +# define PLATFORM_ID "HP-UX" + +#elif defined(__HAIKU__) +# define PLATFORM_ID "Haiku" + +#elif defined(__BeOS) || defined(__BEOS__) || defined(_BEOS) +# define PLATFORM_ID "BeOS" + +#elif defined(__QNX__) || defined(__QNXNTO__) +# define PLATFORM_ID "QNX" + +#elif defined(__tru64) || defined(_tru64) || defined(__TRU64__) +# define PLATFORM_ID "Tru64" + +#elif defined(__riscos) || defined(__riscos__) +# define PLATFORM_ID "RISCos" + +#elif defined(__sinix) || defined(__sinix__) || defined(__SINIX__) +# define PLATFORM_ID "SINIX" + +#elif defined(__UNIX_SV__) +# define PLATFORM_ID "UNIX_SV" + +#elif defined(__bsdos__) +# define PLATFORM_ID "BSDOS" + +#elif defined(_MPRAS) || defined(MPRAS) +# define PLATFORM_ID "MP-RAS" + +#elif defined(__osf) || defined(__osf__) +# define PLATFORM_ID "OSF1" + +#elif defined(_SCO_SV) || defined(SCO_SV) || defined(sco_sv) +# define PLATFORM_ID "SCO_SV" + +#elif defined(__ultrix) || defined(__ultrix__) || defined(_ULTRIX) +# define PLATFORM_ID "ULTRIX" + +#elif defined(__XENIX__) || defined(_XENIX) || defined(XENIX) +# define PLATFORM_ID "Xenix" + +#elif defined(__WATCOMC__) +# if defined(__LINUX__) +# define PLATFORM_ID "Linux" + +# elif defined(__DOS__) +# define PLATFORM_ID "DOS" + +# elif defined(__OS2__) +# define PLATFORM_ID "OS2" + +# elif defined(__WINDOWS__) +# define PLATFORM_ID "Windows3x" + +# elif defined(__VXWORKS__) +# define PLATFORM_ID "VxWorks" + +# else /* unknown platform */ +# define PLATFORM_ID +# endif + +#elif defined(__INTEGRITY) +# if defined(INT_178B) +# define PLATFORM_ID "Integrity178" + +# else /* regular Integrity */ +# define PLATFORM_ID "Integrity" +# endif + +# elif defined(_ADI_COMPILER) +# define PLATFORM_ID "ADSP" + +#else /* unknown platform */ +# define PLATFORM_ID + +#endif + +/* For windows compilers MSVC and Intel we can determine + the architecture of the compiler being used. This is because + the compilers do not have flags that can change the architecture, + but rather depend on which compiler is being used +*/ +#if defined(_WIN32) && defined(_MSC_VER) +# if defined(_M_IA64) +# define ARCHITECTURE_ID "IA64" + +# elif defined(_M_ARM64EC) +# define ARCHITECTURE_ID "ARM64EC" + +# elif defined(_M_X64) || defined(_M_AMD64) +# define ARCHITECTURE_ID "x64" + +# elif defined(_M_IX86) +# define ARCHITECTURE_ID "X86" + +# elif defined(_M_ARM64) +# define ARCHITECTURE_ID "ARM64" + +# elif defined(_M_ARM) +# if _M_ARM == 4 +# define ARCHITECTURE_ID "ARMV4I" +# elif _M_ARM == 5 +# define ARCHITECTURE_ID "ARMV5I" +# else +# define ARCHITECTURE_ID "ARMV" STRINGIFY(_M_ARM) +# endif + +# elif defined(_M_MIPS) +# define ARCHITECTURE_ID "MIPS" + +# elif defined(_M_SH) +# define ARCHITECTURE_ID "SHx" + +# else /* unknown architecture */ +# define ARCHITECTURE_ID "" +# endif + +#elif defined(__WATCOMC__) +# if defined(_M_I86) +# define ARCHITECTURE_ID "I86" + +# elif defined(_M_IX86) +# define ARCHITECTURE_ID "X86" + +# else /* unknown architecture */ +# define ARCHITECTURE_ID "" +# endif + +#elif defined(__IAR_SYSTEMS_ICC__) || defined(__IAR_SYSTEMS_ICC) +# if defined(__ICCARM__) +# define ARCHITECTURE_ID "ARM" + +# elif defined(__ICCRX__) +# define ARCHITECTURE_ID "RX" + +# elif defined(__ICCRH850__) +# define ARCHITECTURE_ID "RH850" + +# elif defined(__ICCRL78__) +# define ARCHITECTURE_ID "RL78" + +# elif defined(__ICCRISCV__) +# define ARCHITECTURE_ID "RISCV" + +# elif defined(__ICCAVR__) +# define ARCHITECTURE_ID "AVR" + +# elif defined(__ICC430__) +# define ARCHITECTURE_ID "MSP430" + +# elif defined(__ICCV850__) +# define ARCHITECTURE_ID "V850" + +# elif defined(__ICC8051__) +# define ARCHITECTURE_ID "8051" + +# elif defined(__ICCSTM8__) +# define ARCHITECTURE_ID "STM8" + +# else /* unknown architecture */ +# define ARCHITECTURE_ID "" +# endif + +#elif defined(__ghs__) +# if defined(__PPC64__) +# define ARCHITECTURE_ID "PPC64" + +# elif defined(__ppc__) +# define ARCHITECTURE_ID "PPC" + +# elif defined(__ARM__) +# define ARCHITECTURE_ID "ARM" + +# elif defined(__x86_64__) +# define ARCHITECTURE_ID "x64" + +# elif defined(__i386__) +# define ARCHITECTURE_ID "X86" + +# else /* unknown architecture */ +# define ARCHITECTURE_ID "" +# endif + +#elif defined(__clang__) && defined(__ti__) +# if defined(__ARM_ARCH) +# define ARCHITECTURE_ID "Arm" + +# else /* unknown architecture */ +# define ARCHITECTURE_ID "" +# endif + +#elif defined(__TI_COMPILER_VERSION__) +# if defined(__TI_ARM__) +# define ARCHITECTURE_ID "ARM" + +# elif defined(__MSP430__) +# define ARCHITECTURE_ID "MSP430" + +# elif defined(__TMS320C28XX__) +# define ARCHITECTURE_ID "TMS320C28x" + +# elif defined(__TMS320C6X__) || defined(_TMS320C6X) +# define ARCHITECTURE_ID "TMS320C6x" + +# else /* unknown architecture */ +# define ARCHITECTURE_ID "" +# endif + +# elif defined(__ADSPSHARC__) +# define ARCHITECTURE_ID "SHARC" + +# elif defined(__ADSPBLACKFIN__) +# define ARCHITECTURE_ID "Blackfin" + +#elif defined(__TASKING__) + +# if defined(__CTC__) || defined(__CPTC__) +# define ARCHITECTURE_ID "TriCore" + +# elif defined(__CMCS__) +# define ARCHITECTURE_ID "MCS" + +# elif defined(__CARM__) +# define ARCHITECTURE_ID "ARM" + +# elif defined(__CARC__) +# define ARCHITECTURE_ID "ARC" + +# elif defined(__C51__) +# define ARCHITECTURE_ID "8051" + +# elif defined(__CPCP__) +# define ARCHITECTURE_ID "PCP" + +# else +# define ARCHITECTURE_ID "" +# endif + +#else +# define ARCHITECTURE_ID +#endif + +/* Convert integer to decimal digit literals. */ +#define DEC(n) \ + ('0' + (((n) / 10000000)%10)), \ + ('0' + (((n) / 1000000)%10)), \ + ('0' + (((n) / 100000)%10)), \ + ('0' + (((n) / 10000)%10)), \ + ('0' + (((n) / 1000)%10)), \ + ('0' + (((n) / 100)%10)), \ + ('0' + (((n) / 10)%10)), \ + ('0' + ((n) % 10)) + +/* Convert integer to hex digit literals. */ +#define HEX(n) \ + ('0' + ((n)>>28 & 0xF)), \ + ('0' + ((n)>>24 & 0xF)), \ + ('0' + ((n)>>20 & 0xF)), \ + ('0' + ((n)>>16 & 0xF)), \ + ('0' + ((n)>>12 & 0xF)), \ + ('0' + ((n)>>8 & 0xF)), \ + ('0' + ((n)>>4 & 0xF)), \ + ('0' + ((n) & 0xF)) + +/* Construct a string literal encoding the version number. */ +#ifdef COMPILER_VERSION +char const* info_version = "INFO" ":" "compiler_version[" COMPILER_VERSION "]"; + +/* Construct a string literal encoding the version number components. */ +#elif defined(COMPILER_VERSION_MAJOR) +char const info_version[] = { + 'I', 'N', 'F', 'O', ':', + 'c','o','m','p','i','l','e','r','_','v','e','r','s','i','o','n','[', + COMPILER_VERSION_MAJOR, +# ifdef COMPILER_VERSION_MINOR + '.', COMPILER_VERSION_MINOR, +# ifdef COMPILER_VERSION_PATCH + '.', COMPILER_VERSION_PATCH, +# ifdef COMPILER_VERSION_TWEAK + '.', COMPILER_VERSION_TWEAK, +# endif +# endif +# endif + ']','\0'}; +#endif + +/* Construct a string literal encoding the internal version number. */ +#ifdef COMPILER_VERSION_INTERNAL +char const info_version_internal[] = { + 'I', 'N', 'F', 'O', ':', + 'c','o','m','p','i','l','e','r','_','v','e','r','s','i','o','n','_', + 'i','n','t','e','r','n','a','l','[', + COMPILER_VERSION_INTERNAL,']','\0'}; +#elif defined(COMPILER_VERSION_INTERNAL_STR) +char const* info_version_internal = "INFO" ":" "compiler_version_internal[" COMPILER_VERSION_INTERNAL_STR "]"; +#endif + +/* Construct a string literal encoding the version number components. */ +#ifdef SIMULATE_VERSION_MAJOR +char const info_simulate_version[] = { + 'I', 'N', 'F', 'O', ':', + 's','i','m','u','l','a','t','e','_','v','e','r','s','i','o','n','[', + SIMULATE_VERSION_MAJOR, +# ifdef SIMULATE_VERSION_MINOR + '.', SIMULATE_VERSION_MINOR, +# ifdef SIMULATE_VERSION_PATCH + '.', SIMULATE_VERSION_PATCH, +# ifdef SIMULATE_VERSION_TWEAK + '.', SIMULATE_VERSION_TWEAK, +# endif +# endif +# endif + ']','\0'}; +#endif + +/* Construct the string literal in pieces to prevent the source from + getting matched. Store it in a pointer rather than an array + because some compilers will just produce instructions to fill the + array rather than assigning a pointer to a static array. */ +char const* info_platform = "INFO" ":" "platform[" PLATFORM_ID "]"; +char const* info_arch = "INFO" ":" "arch[" ARCHITECTURE_ID "]"; + + + +#define CXX_STD_98 199711L +#define CXX_STD_11 201103L +#define CXX_STD_14 201402L +#define CXX_STD_17 201703L +#define CXX_STD_20 202002L +#define CXX_STD_23 202302L + +#if defined(__INTEL_COMPILER) && defined(_MSVC_LANG) +# if _MSVC_LANG > CXX_STD_17 +# define CXX_STD _MSVC_LANG +# elif _MSVC_LANG == CXX_STD_17 && defined(__cpp_aggregate_paren_init) +# define CXX_STD CXX_STD_20 +# elif _MSVC_LANG > CXX_STD_14 && __cplusplus > CXX_STD_17 +# define CXX_STD CXX_STD_20 +# elif _MSVC_LANG > CXX_STD_14 +# define CXX_STD CXX_STD_17 +# elif defined(__INTEL_CXX11_MODE__) && defined(__cpp_aggregate_nsdmi) +# define CXX_STD CXX_STD_14 +# elif defined(__INTEL_CXX11_MODE__) +# define CXX_STD CXX_STD_11 +# else +# define CXX_STD CXX_STD_98 +# endif +#elif defined(_MSC_VER) && defined(_MSVC_LANG) +# if _MSVC_LANG > __cplusplus +# define CXX_STD _MSVC_LANG +# else +# define CXX_STD __cplusplus +# endif +#elif defined(__NVCOMPILER) +# if __cplusplus == CXX_STD_17 && defined(__cpp_aggregate_paren_init) +# define CXX_STD CXX_STD_20 +# else +# define CXX_STD __cplusplus +# endif +#elif defined(__INTEL_COMPILER) || defined(__PGI) +# if __cplusplus == CXX_STD_11 && defined(__cpp_namespace_attributes) +# define CXX_STD CXX_STD_17 +# elif __cplusplus == CXX_STD_11 && defined(__cpp_aggregate_nsdmi) +# define CXX_STD CXX_STD_14 +# else +# define CXX_STD __cplusplus +# endif +#elif (defined(__IBMCPP__) || defined(__ibmxl__)) && defined(__linux__) +# if __cplusplus == CXX_STD_11 && defined(__cpp_aggregate_nsdmi) +# define CXX_STD CXX_STD_14 +# else +# define CXX_STD __cplusplus +# endif +#elif __cplusplus == 1 && defined(__GXX_EXPERIMENTAL_CXX0X__) +# define CXX_STD CXX_STD_11 +#else +# define CXX_STD __cplusplus +#endif + +const char* info_language_standard_default = "INFO" ":" "standard_default[" +#if CXX_STD > CXX_STD_23 + "26" +#elif CXX_STD > CXX_STD_20 + "23" +#elif CXX_STD > CXX_STD_17 + "20" +#elif CXX_STD > CXX_STD_14 + "17" +#elif CXX_STD > CXX_STD_11 + "14" +#elif CXX_STD >= CXX_STD_11 + "11" +#else + "98" +#endif +"]"; + +const char* info_language_extensions_default = "INFO" ":" "extensions_default[" +#if (defined(__clang__) || defined(__GNUC__) || defined(__xlC__) || \ + defined(__TI_COMPILER_VERSION__)) && \ + !defined(__STRICT_ANSI__) + "ON" +#else + "OFF" +#endif +"]"; + +/*--------------------------------------------------------------------------*/ + +int main(int argc, char* argv[]) +{ + int require = 0; + require += info_compiler[argc]; + require += info_platform[argc]; + require += info_arch[argc]; +#ifdef COMPILER_VERSION_MAJOR + require += info_version[argc]; +#endif +#ifdef COMPILER_VERSION_INTERNAL + require += info_version_internal[argc]; +#endif +#ifdef SIMULATE_ID + require += info_simulate[argc]; +#endif +#ifdef SIMULATE_VERSION_MAJOR + require += info_simulate_version[argc]; +#endif +#if defined(__CRAYXT_COMPUTE_LINUX_TARGET) + require += info_cray[argc]; +#endif + require += info_language_standard_default[argc]; + require += info_language_extensions_default[argc]; + (void)argv; + return require; +} diff --git a/siro_rider/android/app/.cxx/RelWithDebInfo/6t1m4b5v/x86_64/CMakeFiles/3.31.5-g6cf5163/CompilerIdCXX/CMakeCXXCompilerId.o b/siro_rider/android/app/.cxx/RelWithDebInfo/6t1m4b5v/x86_64/CMakeFiles/3.31.5-g6cf5163/CompilerIdCXX/CMakeCXXCompilerId.o new file mode 100644 index 0000000..60dee1b Binary files /dev/null and b/siro_rider/android/app/.cxx/RelWithDebInfo/6t1m4b5v/x86_64/CMakeFiles/3.31.5-g6cf5163/CompilerIdCXX/CMakeCXXCompilerId.o differ diff --git a/siro_rider/android/app/.cxx/RelWithDebInfo/6t1m4b5v/x86_64/CMakeFiles/CMakeConfigureLog.yaml b/siro_rider/android/app/.cxx/RelWithDebInfo/6t1m4b5v/x86_64/CMakeFiles/CMakeConfigureLog.yaml new file mode 100644 index 0000000..dc26474 --- /dev/null +++ b/siro_rider/android/app/.cxx/RelWithDebInfo/6t1m4b5v/x86_64/CMakeFiles/CMakeConfigureLog.yaml @@ -0,0 +1,399 @@ + +--- +events: + - + kind: "message-v1" + backtrace: + - "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeDetermineSystem.cmake:200 (message)" + - "CMakeLists.txt:2 (project)" + message: | + The target system is: Android - 1 - x86_64 + The host system is: Darwin - 24.5.0 - arm64 + - + kind: "message-v1" + backtrace: + - "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeDetermineCompilerId.cmake:17 (message)" + - "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeDetermineCompilerId.cmake:64 (__determine_compiler_id_test)" + - "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeDetermineCCompiler.cmake:123 (CMAKE_DETERMINE_COMPILER_ID)" + - "CMakeLists.txt:2 (project)" + message: | + Compiling the C compiler identification source file "CMakeCCompilerId.c" succeeded. + Compiler: /Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/bin/clang + Build flags: -g;-DANDROID;-fdata-sections;-ffunction-sections;-funwind-tables;-fstack-protector-strong;-no-canonical-prefixes;-D_FORTIFY_SOURCE=2;-Wformat;-Werror=format-security + Id flags: -c;--target=x86_64-none-linux-android23 + + The output was: + 0 + + + Compilation of the C compiler identification source "CMakeCCompilerId.c" produced "CMakeCCompilerId.o" + + The C compiler identification is Clang, found in: + /Users/hamzaaleghwairyeen/development/App/Intaleq/android/app/.cxx/RelWithDebInfo/6t1m4b5v/x86_64/CMakeFiles/3.31.5-g6cf5163/CompilerIdC/CMakeCCompilerId.o + + - + kind: "message-v1" + backtrace: + - "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeDetermineCompilerId.cmake:17 (message)" + - "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeDetermineCompilerId.cmake:64 (__determine_compiler_id_test)" + - "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeDetermineCXXCompiler.cmake:126 (CMAKE_DETERMINE_COMPILER_ID)" + - "CMakeLists.txt:2 (project)" + message: | + Compiling the CXX compiler identification source file "CMakeCXXCompilerId.cpp" succeeded. + Compiler: /Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/bin/clang++ + Build flags: -g;-DANDROID;-fdata-sections;-ffunction-sections;-funwind-tables;-fstack-protector-strong;-no-canonical-prefixes;-D_FORTIFY_SOURCE=2;-Wformat;-Werror=format-security + Id flags: -c;--target=x86_64-none-linux-android23 + + The output was: + 0 + + + Compilation of the CXX compiler identification source "CMakeCXXCompilerId.cpp" produced "CMakeCXXCompilerId.o" + + The CXX compiler identification is Clang, found in: + /Users/hamzaaleghwairyeen/development/App/Intaleq/android/app/.cxx/RelWithDebInfo/6t1m4b5v/x86_64/CMakeFiles/3.31.5-g6cf5163/CompilerIdCXX/CMakeCXXCompilerId.o + + - + kind: "try_compile-v1" + backtrace: + - "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeDetermineCompilerABI.cmake:74 (try_compile)" + - "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeTestCCompiler.cmake:26 (CMAKE_DETERMINE_COMPILER_ABI)" + - "CMakeLists.txt:2 (project)" + checks: + - "Detecting C compiler ABI info" + directories: + source: "/Users/hamzaaleghwairyeen/development/App/Intaleq/android/app/.cxx/RelWithDebInfo/6t1m4b5v/x86_64/CMakeFiles/CMakeScratch/TryCompile-7jBrQK" + binary: "/Users/hamzaaleghwairyeen/development/App/Intaleq/android/app/.cxx/RelWithDebInfo/6t1m4b5v/x86_64/CMakeFiles/CMakeScratch/TryCompile-7jBrQK" + cmakeVariables: + ANDROID_ABI: "x86_64" + ANDROID_ARM_MODE: "thumb" + ANDROID_PIE: "TRUE" + ANDROID_PLATFORM: "android-23" + ANDROID_STL: "c++_static" + ANDROID_TOOLCHAIN: "clang" + CMAKE_CXX_COMPILER_CLANG_SCAN_DEPS: "/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/bin/clang-scan-deps" + CMAKE_CXX_COMPILER_TARGET: "x86_64-none-linux-android23" + CMAKE_C_COMPILER_TARGET: "x86_64-none-linux-android23" + CMAKE_C_FLAGS: "-g -DANDROID -fdata-sections -ffunction-sections -funwind-tables -fstack-protector-strong -no-canonical-prefixes -D_FORTIFY_SOURCE=2 -Wformat " + CMAKE_C_FLAGS_DEBUG: "-fno-limit-debug-info " + CMAKE_EXE_LINKER_FLAGS: "-static-libstdc++ -Wl,--build-id=sha1 -Wl,--no-rosegment -Wl,--no-undefined-version -Wl,--fatal-warnings -Wl,--no-undefined -Qunused-arguments " + CMAKE_POSITION_INDEPENDENT_CODE: "TRUE" + CMAKE_SYSROOT: "/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot" + buildResult: + variable: "CMAKE_C_ABI_COMPILED" + cached: true + stdout: | + Change Dir: '/Users/hamzaaleghwairyeen/development/App/Intaleq/android/app/.cxx/RelWithDebInfo/6t1m4b5v/x86_64/CMakeFiles/CMakeScratch/TryCompile-7jBrQK' + + Run Build Command(s): /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/bin/ninja -v cmTC_8c97b + [1/2] /Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/bin/clang --target=x86_64-none-linux-android23 --sysroot=/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot -g -DANDROID -fdata-sections -ffunction-sections -funwind-tables -fstack-protector-strong -no-canonical-prefixes -D_FORTIFY_SOURCE=2 -Wformat -fPIE -v -MD -MT CMakeFiles/cmTC_8c97b.dir/CMakeCCompilerABI.c.o -MF CMakeFiles/cmTC_8c97b.dir/CMakeCCompilerABI.c.o.d -o CMakeFiles/cmTC_8c97b.dir/CMakeCCompilerABI.c.o -c /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeCCompilerABI.c + Android (12027248, +pgo, -bolt, +lto, -mlgo, based on r522817) clang version 18.0.1 (https://android.googlesource.com/toolchain/llvm-project d8003a456d14a3deb8054cdaa529ffbf02d9b262) + Target: x86_64-none-linux-android23 + Thread model: posix + InstalledDir: /Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/bin + (in-process) + "/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/bin/clang" -cc1 -triple x86_64-none-linux-android23 -emit-obj -mrelax-all -disable-free -clear-ast-before-backend -disable-llvm-verifier -discard-value-names -main-file-name CMakeCCompilerABI.c -mrelocation-model pic -pic-level 2 -pic-is-pie -mframe-pointer=all -ffp-contract=on -fno-rounding-math -mconstructor-aliases -funwind-tables=2 -target-cpu x86-64 -target-feature +sse4.2 -target-feature +popcnt -target-feature +cx16 -tune-cpu generic -debug-info-kind=constructor -dwarf-version=4 -debugger-tuning=gdb -fdebug-compilation-dir=/Users/hamzaaleghwairyeen/development/App/Intaleq/android/app/.cxx/RelWithDebInfo/6t1m4b5v/x86_64/CMakeFiles/CMakeScratch/TryCompile-7jBrQK -v -ffunction-sections -fdata-sections -fcoverage-compilation-dir=/Users/hamzaaleghwairyeen/development/App/Intaleq/android/app/.cxx/RelWithDebInfo/6t1m4b5v/x86_64/CMakeFiles/CMakeScratch/TryCompile-7jBrQK -resource-dir /Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/lib/clang/18 -dependency-file CMakeFiles/cmTC_8c97b.dir/CMakeCCompilerABI.c.o.d -MT CMakeFiles/cmTC_8c97b.dir/CMakeCCompilerABI.c.o -sys-header-deps -D ANDROID -D _FORTIFY_SOURCE=2 -isysroot /Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot -internal-isystem /Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/lib/clang/18/include -internal-isystem /Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/local/include -internal-externc-isystem /Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/include/x86_64-linux-android -internal-externc-isystem /Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/include -internal-externc-isystem /Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/include -Wformat -ferror-limit 19 -femulated-tls -stack-protector 2 -fgnuc-version=4.2.1 -D__GCC_HAVE_DWARF2_CFI_ASM=1 -o CMakeFiles/cmTC_8c97b.dir/CMakeCCompilerABI.c.o -x c /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeCCompilerABI.c + clang -cc1 version 18.0.1 based upon LLVM 18.0.1 default target x86_64-apple-darwin24.5.0 + ignoring nonexistent directory "/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/local/include" + ignoring nonexistent directory "/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/include" + #include "..." search starts here: + #include <...> search starts here: + /Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/lib/clang/18/include + /Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/include/x86_64-linux-android + /Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/include + End of search list. + [2/2] : && /Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/bin/clang --target=x86_64-none-linux-android23 --sysroot=/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot -g -DANDROID -fdata-sections -ffunction-sections -funwind-tables -fstack-protector-strong -no-canonical-prefixes -D_FORTIFY_SOURCE=2 -Wformat -static-libstdc++ -Wl,--build-id=sha1 -Wl,--no-rosegment -Wl,--no-undefined-version -Wl,--fatal-warnings -Wl,--no-undefined -Qunused-arguments -v CMakeFiles/cmTC_8c97b.dir/CMakeCCompilerABI.c.o -o cmTC_8c97b && : + Android (12027248, +pgo, -bolt, +lto, -mlgo, based on r522817) clang version 18.0.1 (https://android.googlesource.com/toolchain/llvm-project d8003a456d14a3deb8054cdaa529ffbf02d9b262) + Target: x86_64-none-linux-android23 + Thread model: posix + InstalledDir: /Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/bin + "/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/bin/ld.lld" --sysroot=/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot -z now -z relro --hash-style=gnu --eh-frame-hdr -m elf_x86_64 -pie -dynamic-linker /system/bin/linker64 -o cmTC_8c97b /Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/lib/x86_64-linux-android/23/crtbegin_dynamic.o -L/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/lib/clang/18/lib/linux/x86_64 -L/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/lib/x86_64-linux-android/23 -L/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/lib/x86_64-linux-android -L/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/lib --build-id=sha1 --no-rosegment --no-undefined-version --fatal-warnings --no-undefined CMakeFiles/cmTC_8c97b.dir/CMakeCCompilerABI.c.o /Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/lib/clang/18/lib/linux/libclang_rt.builtins-x86_64-android.a -l:libunwind.a -ldl -lc /Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/lib/clang/18/lib/linux/libclang_rt.builtins-x86_64-android.a -l:libunwind.a -ldl /Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/lib/x86_64-linux-android/23/crtend_android.o + + exitCode: 0 + - + kind: "message-v1" + backtrace: + - "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeDetermineCompilerABI.cmake:182 (message)" + - "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeTestCCompiler.cmake:26 (CMAKE_DETERMINE_COMPILER_ABI)" + - "CMakeLists.txt:2 (project)" + message: | + Parsed C implicit include dir info: rv=done + found start of include info + found start of implicit include info + add: [/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/lib/clang/18/include] + add: [/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/include/x86_64-linux-android] + add: [/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/include] + end of search list found + collapse include dir [/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/lib/clang/18/include] ==> [/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/lib/clang/18/include] + collapse include dir [/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/include/x86_64-linux-android] ==> [/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/include/x86_64-linux-android] + collapse include dir [/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/include] ==> [/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/include] + implicit include dirs: [/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/lib/clang/18/include;/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/include/x86_64-linux-android;/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/include] + + + - + kind: "message-v1" + backtrace: + - "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeDetermineCompilerABI.cmake:218 (message)" + - "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeTestCCompiler.cmake:26 (CMAKE_DETERMINE_COMPILER_ABI)" + - "CMakeLists.txt:2 (project)" + message: | + Parsed C implicit link information: + link line regex: [^( *|.*[/\\])(ld[0-9]*(\\.[a-z]+)?|CMAKE_LINK_STARTFILE-NOTFOUND|([^/\\]+-)?ld|collect2)[^/\\]*( |$)] + linker tool regex: [^[ ]*(->|")?[ ]*(([^"]*[/\\])?(ld[0-9]*(\\.[a-z]+)?))("|,| |$)] + ignore line: [Change Dir: '/Users/hamzaaleghwairyeen/development/App/Intaleq/android/app/.cxx/RelWithDebInfo/6t1m4b5v/x86_64/CMakeFiles/CMakeScratch/TryCompile-7jBrQK'] + ignore line: [] + ignore line: [Run Build Command(s): /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/bin/ninja -v cmTC_8c97b] + ignore line: [[1/2] /Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/bin/clang --target=x86_64-none-linux-android23 --sysroot=/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot -g -DANDROID -fdata-sections -ffunction-sections -funwind-tables -fstack-protector-strong -no-canonical-prefixes -D_FORTIFY_SOURCE=2 -Wformat -fPIE -v -MD -MT CMakeFiles/cmTC_8c97b.dir/CMakeCCompilerABI.c.o -MF CMakeFiles/cmTC_8c97b.dir/CMakeCCompilerABI.c.o.d -o CMakeFiles/cmTC_8c97b.dir/CMakeCCompilerABI.c.o -c /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeCCompilerABI.c] + ignore line: [Android (12027248 +pgo -bolt +lto -mlgo based on r522817) clang version 18.0.1 (https://android.googlesource.com/toolchain/llvm-project d8003a456d14a3deb8054cdaa529ffbf02d9b262)] + ignore line: [Target: x86_64-none-linux-android23] + ignore line: [Thread model: posix] + ignore line: [InstalledDir: /Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/bin] + ignore line: [ (in-process)] + ignore line: [ "/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/bin/clang" -cc1 -triple x86_64-none-linux-android23 -emit-obj -mrelax-all -disable-free -clear-ast-before-backend -disable-llvm-verifier -discard-value-names -main-file-name CMakeCCompilerABI.c -mrelocation-model pic -pic-level 2 -pic-is-pie -mframe-pointer=all -ffp-contract=on -fno-rounding-math -mconstructor-aliases -funwind-tables=2 -target-cpu x86-64 -target-feature +sse4.2 -target-feature +popcnt -target-feature +cx16 -tune-cpu generic -debug-info-kind=constructor -dwarf-version=4 -debugger-tuning=gdb -fdebug-compilation-dir=/Users/hamzaaleghwairyeen/development/App/Intaleq/android/app/.cxx/RelWithDebInfo/6t1m4b5v/x86_64/CMakeFiles/CMakeScratch/TryCompile-7jBrQK -v -ffunction-sections -fdata-sections -fcoverage-compilation-dir=/Users/hamzaaleghwairyeen/development/App/Intaleq/android/app/.cxx/RelWithDebInfo/6t1m4b5v/x86_64/CMakeFiles/CMakeScratch/TryCompile-7jBrQK -resource-dir /Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/lib/clang/18 -dependency-file CMakeFiles/cmTC_8c97b.dir/CMakeCCompilerABI.c.o.d -MT CMakeFiles/cmTC_8c97b.dir/CMakeCCompilerABI.c.o -sys-header-deps -D ANDROID -D _FORTIFY_SOURCE=2 -isysroot /Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot -internal-isystem /Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/lib/clang/18/include -internal-isystem /Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/local/include -internal-externc-isystem /Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/include/x86_64-linux-android -internal-externc-isystem /Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/include -internal-externc-isystem /Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/include -Wformat -ferror-limit 19 -femulated-tls -stack-protector 2 -fgnuc-version=4.2.1 -D__GCC_HAVE_DWARF2_CFI_ASM=1 -o CMakeFiles/cmTC_8c97b.dir/CMakeCCompilerABI.c.o -x c /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeCCompilerABI.c] + ignore line: [clang -cc1 version 18.0.1 based upon LLVM 18.0.1 default target x86_64-apple-darwin24.5.0] + ignore line: [ignoring nonexistent directory "/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/local/include"] + ignore line: [ignoring nonexistent directory "/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/include"] + ignore line: [#include "..." search starts here:] + ignore line: [#include <...> search starts here:] + ignore line: [ /Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/lib/clang/18/include] + ignore line: [ /Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/include/x86_64-linux-android] + ignore line: [ /Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/include] + ignore line: [End of search list.] + ignore line: [[2/2] : && /Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/bin/clang --target=x86_64-none-linux-android23 --sysroot=/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot -g -DANDROID -fdata-sections -ffunction-sections -funwind-tables -fstack-protector-strong -no-canonical-prefixes -D_FORTIFY_SOURCE=2 -Wformat -static-libstdc++ -Wl --build-id=sha1 -Wl --no-rosegment -Wl --no-undefined-version -Wl --fatal-warnings -Wl --no-undefined -Qunused-arguments -v CMakeFiles/cmTC_8c97b.dir/CMakeCCompilerABI.c.o -o cmTC_8c97b && :] + ignore line: [Android (12027248 +pgo -bolt +lto -mlgo based on r522817) clang version 18.0.1 (https://android.googlesource.com/toolchain/llvm-project d8003a456d14a3deb8054cdaa529ffbf02d9b262)] + ignore line: [Target: x86_64-none-linux-android23] + ignore line: [Thread model: posix] + ignore line: [InstalledDir: /Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/bin] + link line: [ "/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/bin/ld.lld" --sysroot=/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot -z now -z relro --hash-style=gnu --eh-frame-hdr -m elf_x86_64 -pie -dynamic-linker /system/bin/linker64 -o cmTC_8c97b /Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/lib/x86_64-linux-android/23/crtbegin_dynamic.o -L/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/lib/clang/18/lib/linux/x86_64 -L/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/lib/x86_64-linux-android/23 -L/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/lib/x86_64-linux-android -L/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/lib --build-id=sha1 --no-rosegment --no-undefined-version --fatal-warnings --no-undefined CMakeFiles/cmTC_8c97b.dir/CMakeCCompilerABI.c.o /Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/lib/clang/18/lib/linux/libclang_rt.builtins-x86_64-android.a -l:libunwind.a -ldl -lc /Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/lib/clang/18/lib/linux/libclang_rt.builtins-x86_64-android.a -l:libunwind.a -ldl /Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/lib/x86_64-linux-android/23/crtend_android.o] + arg [/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/bin/ld.lld] ==> ignore + arg [--sysroot=/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot] ==> ignore + arg [-znow] ==> ignore + arg [-zrelro] ==> ignore + arg [--hash-style=gnu] ==> ignore + arg [--eh-frame-hdr] ==> ignore + arg [-m] ==> ignore + arg [elf_x86_64] ==> ignore + arg [-pie] ==> ignore + arg [-dynamic-linker] ==> ignore + arg [/system/bin/linker64] ==> ignore + arg [-o] ==> ignore + arg [cmTC_8c97b] ==> ignore + arg [/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/lib/x86_64-linux-android/23/crtbegin_dynamic.o] ==> obj [/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/lib/x86_64-linux-android/23/crtbegin_dynamic.o] + arg [-L/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/lib/clang/18/lib/linux/x86_64] ==> dir [/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/lib/clang/18/lib/linux/x86_64] + arg [-L/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/lib/x86_64-linux-android/23] ==> dir [/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/lib/x86_64-linux-android/23] + arg [-L/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/lib/x86_64-linux-android] ==> dir [/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/lib/x86_64-linux-android] + arg [-L/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/lib] ==> dir [/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/lib] + arg [--build-id=sha1] ==> ignore + arg [--no-rosegment] ==> ignore + arg [--no-undefined-version] ==> ignore + arg [--fatal-warnings] ==> ignore + arg [--no-undefined] ==> ignore + arg [CMakeFiles/cmTC_8c97b.dir/CMakeCCompilerABI.c.o] ==> ignore + arg [/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/lib/clang/18/lib/linux/libclang_rt.builtins-x86_64-android.a] ==> lib [/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/lib/clang/18/lib/linux/libclang_rt.builtins-x86_64-android.a] + arg [-l:libunwind.a] ==> lib [-l:libunwind.a] + arg [-ldl] ==> lib [dl] + arg [-lc] ==> lib [c] + arg [/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/lib/clang/18/lib/linux/libclang_rt.builtins-x86_64-android.a] ==> lib [/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/lib/clang/18/lib/linux/libclang_rt.builtins-x86_64-android.a] + arg [-l:libunwind.a] ==> lib [-l:libunwind.a] + arg [-ldl] ==> lib [dl] + arg [/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/lib/x86_64-linux-android/23/crtend_android.o] ==> obj [/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/lib/x86_64-linux-android/23/crtend_android.o] + linker tool for 'C': /Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/bin/ld.lld + remove lib [/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/lib/clang/18/lib/linux/libclang_rt.builtins-x86_64-android.a] + remove lib [/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/lib/clang/18/lib/linux/libclang_rt.builtins-x86_64-android.a] + collapse library dir [/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/lib/clang/18/lib/linux/x86_64] ==> [/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/lib/clang/18/lib/linux/x86_64] + collapse library dir [/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/lib/x86_64-linux-android/23] ==> [/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/lib/x86_64-linux-android/23] + collapse library dir [/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/lib/x86_64-linux-android] ==> [/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/lib/x86_64-linux-android] + collapse library dir [/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/lib] ==> [/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/lib] + implicit libs: [-l:libunwind.a;dl;c;-l:libunwind.a;dl] + implicit objs: [/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/lib/x86_64-linux-android/23/crtbegin_dynamic.o;/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/lib/x86_64-linux-android/23/crtend_android.o] + implicit dirs: [/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/lib/clang/18/lib/linux/x86_64;/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/lib/x86_64-linux-android/23;/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/lib/x86_64-linux-android;/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/lib] + implicit fwks: [] + + + - + kind: "message-v1" + backtrace: + - "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Internal/CMakeDetermineLinkerId.cmake:40 (message)" + - "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeDetermineCompilerABI.cmake:255 (cmake_determine_linker_id)" + - "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeTestCCompiler.cmake:26 (CMAKE_DETERMINE_COMPILER_ABI)" + - "CMakeLists.txt:2 (project)" + message: | + Running the C compiler's linker: "/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/bin/ld.lld" "-v" + LLD 18.0.1 (compatible with GNU linkers) + - + kind: "try_compile-v1" + backtrace: + - "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeDetermineCompilerABI.cmake:74 (try_compile)" + - "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeTestCXXCompiler.cmake:26 (CMAKE_DETERMINE_COMPILER_ABI)" + - "CMakeLists.txt:2 (project)" + checks: + - "Detecting CXX compiler ABI info" + directories: + source: "/Users/hamzaaleghwairyeen/development/App/Intaleq/android/app/.cxx/RelWithDebInfo/6t1m4b5v/x86_64/CMakeFiles/CMakeScratch/TryCompile-Qg6bQ0" + binary: "/Users/hamzaaleghwairyeen/development/App/Intaleq/android/app/.cxx/RelWithDebInfo/6t1m4b5v/x86_64/CMakeFiles/CMakeScratch/TryCompile-Qg6bQ0" + cmakeVariables: + ANDROID_ABI: "x86_64" + ANDROID_ARM_MODE: "thumb" + ANDROID_PIE: "TRUE" + ANDROID_PLATFORM: "android-23" + ANDROID_STL: "c++_static" + ANDROID_TOOLCHAIN: "clang" + CMAKE_CXX_COMPILER_CLANG_SCAN_DEPS: "/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/bin/clang-scan-deps" + CMAKE_CXX_COMPILER_TARGET: "x86_64-none-linux-android23" + CMAKE_CXX_FLAGS: "-g -DANDROID -fdata-sections -ffunction-sections -funwind-tables -fstack-protector-strong -no-canonical-prefixes -D_FORTIFY_SOURCE=2 -Wformat " + CMAKE_CXX_FLAGS_DEBUG: "-fno-limit-debug-info " + CMAKE_CXX_SCAN_FOR_MODULES: "OFF" + CMAKE_C_COMPILER_TARGET: "x86_64-none-linux-android23" + CMAKE_EXE_LINKER_FLAGS: "-static-libstdc++ -Wl,--build-id=sha1 -Wl,--no-rosegment -Wl,--no-undefined-version -Wl,--fatal-warnings -Wl,--no-undefined -Qunused-arguments " + CMAKE_POSITION_INDEPENDENT_CODE: "TRUE" + CMAKE_SYSROOT: "/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot" + buildResult: + variable: "CMAKE_CXX_ABI_COMPILED" + cached: true + stdout: | + Change Dir: '/Users/hamzaaleghwairyeen/development/App/Intaleq/android/app/.cxx/RelWithDebInfo/6t1m4b5v/x86_64/CMakeFiles/CMakeScratch/TryCompile-Qg6bQ0' + + Run Build Command(s): /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/bin/ninja -v cmTC_81dbc + [1/2] /Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/bin/clang++ --target=x86_64-none-linux-android23 --sysroot=/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot -g -DANDROID -fdata-sections -ffunction-sections -funwind-tables -fstack-protector-strong -no-canonical-prefixes -D_FORTIFY_SOURCE=2 -Wformat -fPIE -v -MD -MT CMakeFiles/cmTC_81dbc.dir/CMakeCXXCompilerABI.cpp.o -MF CMakeFiles/cmTC_81dbc.dir/CMakeCXXCompilerABI.cpp.o.d -o CMakeFiles/cmTC_81dbc.dir/CMakeCXXCompilerABI.cpp.o -c /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeCXXCompilerABI.cpp + Android (12027248, +pgo, -bolt, +lto, -mlgo, based on r522817) clang version 18.0.1 (https://android.googlesource.com/toolchain/llvm-project d8003a456d14a3deb8054cdaa529ffbf02d9b262) + Target: x86_64-none-linux-android23 + Thread model: posix + InstalledDir: /Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/bin + (in-process) + "/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/bin/clang++" -cc1 -triple x86_64-none-linux-android23 -emit-obj -mrelax-all -disable-free -clear-ast-before-backend -disable-llvm-verifier -discard-value-names -main-file-name CMakeCXXCompilerABI.cpp -mrelocation-model pic -pic-level 2 -pic-is-pie -mframe-pointer=all -ffp-contract=on -fno-rounding-math -mconstructor-aliases -funwind-tables=2 -target-cpu x86-64 -target-feature +sse4.2 -target-feature +popcnt -target-feature +cx16 -tune-cpu generic -debug-info-kind=constructor -dwarf-version=4 -debugger-tuning=gdb -fdebug-compilation-dir=/Users/hamzaaleghwairyeen/development/App/Intaleq/android/app/.cxx/RelWithDebInfo/6t1m4b5v/x86_64/CMakeFiles/CMakeScratch/TryCompile-Qg6bQ0 -v -ffunction-sections -fdata-sections -fcoverage-compilation-dir=/Users/hamzaaleghwairyeen/development/App/Intaleq/android/app/.cxx/RelWithDebInfo/6t1m4b5v/x86_64/CMakeFiles/CMakeScratch/TryCompile-Qg6bQ0 -resource-dir /Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/lib/clang/18 -dependency-file CMakeFiles/cmTC_81dbc.dir/CMakeCXXCompilerABI.cpp.o.d -MT CMakeFiles/cmTC_81dbc.dir/CMakeCXXCompilerABI.cpp.o -sys-header-deps -D ANDROID -D _FORTIFY_SOURCE=2 -isysroot /Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot -internal-isystem /Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/include/c++/v1 -internal-isystem /Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/lib/clang/18/include -internal-isystem /Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/local/include -internal-externc-isystem /Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/include/x86_64-linux-android -internal-externc-isystem /Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/include -internal-externc-isystem /Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/include -Wformat -fdeprecated-macro -ferror-limit 19 -femulated-tls -stack-protector 2 -fgnuc-version=4.2.1 -fcxx-exceptions -fexceptions -D__GCC_HAVE_DWARF2_CFI_ASM=1 -o CMakeFiles/cmTC_81dbc.dir/CMakeCXXCompilerABI.cpp.o -x c++ /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeCXXCompilerABI.cpp + clang -cc1 version 18.0.1 based upon LLVM 18.0.1 default target x86_64-apple-darwin24.5.0 + ignoring nonexistent directory "/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/local/include" + ignoring nonexistent directory "/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/include" + #include "..." search starts here: + #include <...> search starts here: + /Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/include/c++/v1 + /Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/lib/clang/18/include + /Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/include/x86_64-linux-android + /Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/include + End of search list. + [2/2] : && /Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/bin/clang++ --target=x86_64-none-linux-android23 --sysroot=/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot -g -DANDROID -fdata-sections -ffunction-sections -funwind-tables -fstack-protector-strong -no-canonical-prefixes -D_FORTIFY_SOURCE=2 -Wformat -static-libstdc++ -Wl,--build-id=sha1 -Wl,--no-rosegment -Wl,--no-undefined-version -Wl,--fatal-warnings -Wl,--no-undefined -Qunused-arguments -v CMakeFiles/cmTC_81dbc.dir/CMakeCXXCompilerABI.cpp.o -o cmTC_81dbc && : + Android (12027248, +pgo, -bolt, +lto, -mlgo, based on r522817) clang version 18.0.1 (https://android.googlesource.com/toolchain/llvm-project d8003a456d14a3deb8054cdaa529ffbf02d9b262) + Target: x86_64-none-linux-android23 + Thread model: posix + InstalledDir: /Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/bin + "/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/bin/ld.lld" --sysroot=/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot -z now -z relro --hash-style=gnu --eh-frame-hdr -m elf_x86_64 -pie -dynamic-linker /system/bin/linker64 -o cmTC_81dbc /Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/lib/x86_64-linux-android/23/crtbegin_dynamic.o -L/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/lib/clang/18/lib/linux/x86_64 -L/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/lib/x86_64-linux-android/23 -L/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/lib/x86_64-linux-android -L/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/lib --build-id=sha1 --no-rosegment --no-undefined-version --fatal-warnings --no-undefined CMakeFiles/cmTC_81dbc.dir/CMakeCXXCompilerABI.cpp.o -Bstatic -lc++ -Bdynamic -lm /Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/lib/clang/18/lib/linux/libclang_rt.builtins-x86_64-android.a -l:libunwind.a -ldl -lc /Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/lib/clang/18/lib/linux/libclang_rt.builtins-x86_64-android.a -l:libunwind.a -ldl /Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/lib/x86_64-linux-android/23/crtend_android.o + + exitCode: 0 + - + kind: "message-v1" + backtrace: + - "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeDetermineCompilerABI.cmake:182 (message)" + - "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeTestCXXCompiler.cmake:26 (CMAKE_DETERMINE_COMPILER_ABI)" + - "CMakeLists.txt:2 (project)" + message: | + Parsed CXX implicit include dir info: rv=done + found start of include info + found start of implicit include info + add: [/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/include/c++/v1] + add: [/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/lib/clang/18/include] + add: [/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/include/x86_64-linux-android] + add: [/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/include] + end of search list found + collapse include dir [/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/include/c++/v1] ==> [/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/include/c++/v1] + collapse include dir [/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/lib/clang/18/include] ==> [/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/lib/clang/18/include] + collapse include dir [/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/include/x86_64-linux-android] ==> [/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/include/x86_64-linux-android] + collapse include dir [/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/include] ==> [/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/include] + implicit include dirs: [/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/include/c++/v1;/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/lib/clang/18/include;/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/include/x86_64-linux-android;/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/include] + + + - + kind: "message-v1" + backtrace: + - "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeDetermineCompilerABI.cmake:218 (message)" + - "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeTestCXXCompiler.cmake:26 (CMAKE_DETERMINE_COMPILER_ABI)" + - "CMakeLists.txt:2 (project)" + message: | + Parsed CXX implicit link information: + link line regex: [^( *|.*[/\\])(ld[0-9]*(\\.[a-z]+)?|CMAKE_LINK_STARTFILE-NOTFOUND|([^/\\]+-)?ld|collect2)[^/\\]*( |$)] + linker tool regex: [^[ ]*(->|")?[ ]*(([^"]*[/\\])?(ld[0-9]*(\\.[a-z]+)?))("|,| |$)] + ignore line: [Change Dir: '/Users/hamzaaleghwairyeen/development/App/Intaleq/android/app/.cxx/RelWithDebInfo/6t1m4b5v/x86_64/CMakeFiles/CMakeScratch/TryCompile-Qg6bQ0'] + ignore line: [] + ignore line: [Run Build Command(s): /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/bin/ninja -v cmTC_81dbc] + ignore line: [[1/2] /Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/bin/clang++ --target=x86_64-none-linux-android23 --sysroot=/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot -g -DANDROID -fdata-sections -ffunction-sections -funwind-tables -fstack-protector-strong -no-canonical-prefixes -D_FORTIFY_SOURCE=2 -Wformat -fPIE -v -MD -MT CMakeFiles/cmTC_81dbc.dir/CMakeCXXCompilerABI.cpp.o -MF CMakeFiles/cmTC_81dbc.dir/CMakeCXXCompilerABI.cpp.o.d -o CMakeFiles/cmTC_81dbc.dir/CMakeCXXCompilerABI.cpp.o -c /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeCXXCompilerABI.cpp] + ignore line: [Android (12027248 +pgo -bolt +lto -mlgo based on r522817) clang version 18.0.1 (https://android.googlesource.com/toolchain/llvm-project d8003a456d14a3deb8054cdaa529ffbf02d9b262)] + ignore line: [Target: x86_64-none-linux-android23] + ignore line: [Thread model: posix] + ignore line: [InstalledDir: /Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/bin] + ignore line: [ (in-process)] + ignore line: [ "/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/bin/clang++" -cc1 -triple x86_64-none-linux-android23 -emit-obj -mrelax-all -disable-free -clear-ast-before-backend -disable-llvm-verifier -discard-value-names -main-file-name CMakeCXXCompilerABI.cpp -mrelocation-model pic -pic-level 2 -pic-is-pie -mframe-pointer=all -ffp-contract=on -fno-rounding-math -mconstructor-aliases -funwind-tables=2 -target-cpu x86-64 -target-feature +sse4.2 -target-feature +popcnt -target-feature +cx16 -tune-cpu generic -debug-info-kind=constructor -dwarf-version=4 -debugger-tuning=gdb -fdebug-compilation-dir=/Users/hamzaaleghwairyeen/development/App/Intaleq/android/app/.cxx/RelWithDebInfo/6t1m4b5v/x86_64/CMakeFiles/CMakeScratch/TryCompile-Qg6bQ0 -v -ffunction-sections -fdata-sections -fcoverage-compilation-dir=/Users/hamzaaleghwairyeen/development/App/Intaleq/android/app/.cxx/RelWithDebInfo/6t1m4b5v/x86_64/CMakeFiles/CMakeScratch/TryCompile-Qg6bQ0 -resource-dir /Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/lib/clang/18 -dependency-file CMakeFiles/cmTC_81dbc.dir/CMakeCXXCompilerABI.cpp.o.d -MT CMakeFiles/cmTC_81dbc.dir/CMakeCXXCompilerABI.cpp.o -sys-header-deps -D ANDROID -D _FORTIFY_SOURCE=2 -isysroot /Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot -internal-isystem /Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/include/c++/v1 -internal-isystem /Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/lib/clang/18/include -internal-isystem /Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/local/include -internal-externc-isystem /Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/include/x86_64-linux-android -internal-externc-isystem /Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/include -internal-externc-isystem /Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/include -Wformat -fdeprecated-macro -ferror-limit 19 -femulated-tls -stack-protector 2 -fgnuc-version=4.2.1 -fcxx-exceptions -fexceptions -D__GCC_HAVE_DWARF2_CFI_ASM=1 -o CMakeFiles/cmTC_81dbc.dir/CMakeCXXCompilerABI.cpp.o -x c++ /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeCXXCompilerABI.cpp] + ignore line: [clang -cc1 version 18.0.1 based upon LLVM 18.0.1 default target x86_64-apple-darwin24.5.0] + ignore line: [ignoring nonexistent directory "/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/local/include"] + ignore line: [ignoring nonexistent directory "/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/include"] + ignore line: [#include "..." search starts here:] + ignore line: [#include <...> search starts here:] + ignore line: [ /Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/include/c++/v1] + ignore line: [ /Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/lib/clang/18/include] + ignore line: [ /Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/include/x86_64-linux-android] + ignore line: [ /Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/include] + ignore line: [End of search list.] + ignore line: [[2/2] : && /Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/bin/clang++ --target=x86_64-none-linux-android23 --sysroot=/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot -g -DANDROID -fdata-sections -ffunction-sections -funwind-tables -fstack-protector-strong -no-canonical-prefixes -D_FORTIFY_SOURCE=2 -Wformat -static-libstdc++ -Wl --build-id=sha1 -Wl --no-rosegment -Wl --no-undefined-version -Wl --fatal-warnings -Wl --no-undefined -Qunused-arguments -v CMakeFiles/cmTC_81dbc.dir/CMakeCXXCompilerABI.cpp.o -o cmTC_81dbc && :] + ignore line: [Android (12027248 +pgo -bolt +lto -mlgo based on r522817) clang version 18.0.1 (https://android.googlesource.com/toolchain/llvm-project d8003a456d14a3deb8054cdaa529ffbf02d9b262)] + ignore line: [Target: x86_64-none-linux-android23] + ignore line: [Thread model: posix] + ignore line: [InstalledDir: /Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/bin] + link line: [ "/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/bin/ld.lld" --sysroot=/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot -z now -z relro --hash-style=gnu --eh-frame-hdr -m elf_x86_64 -pie -dynamic-linker /system/bin/linker64 -o cmTC_81dbc /Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/lib/x86_64-linux-android/23/crtbegin_dynamic.o -L/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/lib/clang/18/lib/linux/x86_64 -L/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/lib/x86_64-linux-android/23 -L/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/lib/x86_64-linux-android -L/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/lib --build-id=sha1 --no-rosegment --no-undefined-version --fatal-warnings --no-undefined CMakeFiles/cmTC_81dbc.dir/CMakeCXXCompilerABI.cpp.o -Bstatic -lc++ -Bdynamic -lm /Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/lib/clang/18/lib/linux/libclang_rt.builtins-x86_64-android.a -l:libunwind.a -ldl -lc /Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/lib/clang/18/lib/linux/libclang_rt.builtins-x86_64-android.a -l:libunwind.a -ldl /Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/lib/x86_64-linux-android/23/crtend_android.o] + arg [/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/bin/ld.lld] ==> ignore + arg [--sysroot=/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot] ==> ignore + arg [-znow] ==> ignore + arg [-zrelro] ==> ignore + arg [--hash-style=gnu] ==> ignore + arg [--eh-frame-hdr] ==> ignore + arg [-m] ==> ignore + arg [elf_x86_64] ==> ignore + arg [-pie] ==> ignore + arg [-dynamic-linker] ==> ignore + arg [/system/bin/linker64] ==> ignore + arg [-o] ==> ignore + arg [cmTC_81dbc] ==> ignore + arg [/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/lib/x86_64-linux-android/23/crtbegin_dynamic.o] ==> obj [/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/lib/x86_64-linux-android/23/crtbegin_dynamic.o] + arg [-L/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/lib/clang/18/lib/linux/x86_64] ==> dir [/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/lib/clang/18/lib/linux/x86_64] + arg [-L/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/lib/x86_64-linux-android/23] ==> dir [/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/lib/x86_64-linux-android/23] + arg [-L/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/lib/x86_64-linux-android] ==> dir [/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/lib/x86_64-linux-android] + arg [-L/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/lib] ==> dir [/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/lib] + arg [--build-id=sha1] ==> ignore + arg [--no-rosegment] ==> ignore + arg [--no-undefined-version] ==> ignore + arg [--fatal-warnings] ==> ignore + arg [--no-undefined] ==> ignore + arg [CMakeFiles/cmTC_81dbc.dir/CMakeCXXCompilerABI.cpp.o] ==> ignore + arg [-Bstatic] ==> search static + arg [-lc++] ==> lib [c++] + arg [-Bdynamic] ==> search dynamic + arg [-lm] ==> lib [m] + arg [/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/lib/clang/18/lib/linux/libclang_rt.builtins-x86_64-android.a] ==> lib [/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/lib/clang/18/lib/linux/libclang_rt.builtins-x86_64-android.a] + arg [-l:libunwind.a] ==> lib [-l:libunwind.a] + arg [-ldl] ==> lib [dl] + arg [-lc] ==> lib [c] + arg [/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/lib/clang/18/lib/linux/libclang_rt.builtins-x86_64-android.a] ==> lib [/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/lib/clang/18/lib/linux/libclang_rt.builtins-x86_64-android.a] + arg [-l:libunwind.a] ==> lib [-l:libunwind.a] + arg [-ldl] ==> lib [dl] + arg [/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/lib/x86_64-linux-android/23/crtend_android.o] ==> obj [/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/lib/x86_64-linux-android/23/crtend_android.o] + linker tool for 'CXX': /Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/bin/ld.lld + remove lib [/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/lib/clang/18/lib/linux/libclang_rt.builtins-x86_64-android.a] + remove lib [/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/lib/clang/18/lib/linux/libclang_rt.builtins-x86_64-android.a] + collapse library dir [/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/lib/clang/18/lib/linux/x86_64] ==> [/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/lib/clang/18/lib/linux/x86_64] + collapse library dir [/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/lib/x86_64-linux-android/23] ==> [/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/lib/x86_64-linux-android/23] + collapse library dir [/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/lib/x86_64-linux-android] ==> [/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/lib/x86_64-linux-android] + collapse library dir [/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/lib] ==> [/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/lib] + implicit libs: [c++;m;-l:libunwind.a;dl;c;-l:libunwind.a;dl] + implicit objs: [/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/lib/x86_64-linux-android/23/crtbegin_dynamic.o;/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/lib/x86_64-linux-android/23/crtend_android.o] + implicit dirs: [/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/lib/clang/18/lib/linux/x86_64;/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/lib/x86_64-linux-android/23;/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/lib/x86_64-linux-android;/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/lib] + implicit fwks: [] + + + - + kind: "message-v1" + backtrace: + - "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Internal/CMakeDetermineLinkerId.cmake:40 (message)" + - "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeDetermineCompilerABI.cmake:255 (cmake_determine_linker_id)" + - "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeTestCXXCompiler.cmake:26 (CMAKE_DETERMINE_COMPILER_ABI)" + - "CMakeLists.txt:2 (project)" + message: | + Running the CXX compiler's linker: "/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/bin/ld.lld" "-v" + LLD 18.0.1 (compatible with GNU linkers) +... diff --git a/siro_rider/android/app/.cxx/RelWithDebInfo/6t1m4b5v/x86_64/CMakeFiles/TargetDirectories.txt b/siro_rider/android/app/.cxx/RelWithDebInfo/6t1m4b5v/x86_64/CMakeFiles/TargetDirectories.txt new file mode 100644 index 0000000..4e3542f --- /dev/null +++ b/siro_rider/android/app/.cxx/RelWithDebInfo/6t1m4b5v/x86_64/CMakeFiles/TargetDirectories.txt @@ -0,0 +1,3 @@ +/Users/hamzaaleghwairyeen/development/App/Intaleq/android/app/.cxx/RelWithDebInfo/6t1m4b5v/x86_64/CMakeFiles/native-lib.dir +/Users/hamzaaleghwairyeen/development/App/Intaleq/android/app/.cxx/RelWithDebInfo/6t1m4b5v/x86_64/CMakeFiles/edit_cache.dir +/Users/hamzaaleghwairyeen/development/App/Intaleq/android/app/.cxx/RelWithDebInfo/6t1m4b5v/x86_64/CMakeFiles/rebuild_cache.dir diff --git a/siro_rider/android/app/.cxx/RelWithDebInfo/6t1m4b5v/x86_64/CMakeFiles/cmake.check_cache b/siro_rider/android/app/.cxx/RelWithDebInfo/6t1m4b5v/x86_64/CMakeFiles/cmake.check_cache new file mode 100644 index 0000000..3dccd73 --- /dev/null +++ b/siro_rider/android/app/.cxx/RelWithDebInfo/6t1m4b5v/x86_64/CMakeFiles/cmake.check_cache @@ -0,0 +1 @@ +# This file is generated by cmake for dependency checking of the CMakeCache.txt file diff --git a/siro_rider/android/app/.cxx/RelWithDebInfo/6t1m4b5v/x86_64/CMakeFiles/native-lib.dir/native-lib.cpp.o b/siro_rider/android/app/.cxx/RelWithDebInfo/6t1m4b5v/x86_64/CMakeFiles/native-lib.dir/native-lib.cpp.o new file mode 100644 index 0000000..7796940 Binary files /dev/null and b/siro_rider/android/app/.cxx/RelWithDebInfo/6t1m4b5v/x86_64/CMakeFiles/native-lib.dir/native-lib.cpp.o differ diff --git a/siro_rider/android/app/.cxx/RelWithDebInfo/6t1m4b5v/x86_64/CMakeFiles/rules.ninja b/siro_rider/android/app/.cxx/RelWithDebInfo/6t1m4b5v/x86_64/CMakeFiles/rules.ninja new file mode 100644 index 0000000..21b3ea8 --- /dev/null +++ b/siro_rider/android/app/.cxx/RelWithDebInfo/6t1m4b5v/x86_64/CMakeFiles/rules.ninja @@ -0,0 +1,66 @@ +# CMAKE generated file: DO NOT EDIT! +# Generated by "Ninja" Generator, CMake Version 3.31 + +# This file contains all the rules used to get the outputs files +# built from the input files. +# It is included in the main 'build.ninja'. + +# ============================================================================= +# Project: intaleq +# Configurations: RelWithDebInfo +# ============================================================================= +# ============================================================================= + +############################################# +# Rule for compiling CXX files. + +rule CXX_COMPILER__native-lib_unscanned_RelWithDebInfo + depfile = $DEP_FILE + deps = gcc + command = ${LAUNCHER}${CODE_CHECK}/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/bin/clang++ --target=x86_64-none-linux-android23 --sysroot=/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot $DEFINES $INCLUDES $FLAGS -MD -MT $out -MF $DEP_FILE -o $out -c $in + description = Building CXX object $out + + +############################################# +# Rule for linking CXX shared library. + +rule CXX_SHARED_LIBRARY_LINKER__native-lib_RelWithDebInfo + depfile = $DEP_FILE + deps = gcc + command = $PRE_LINK && /Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/bin/clang++ --target=x86_64-none-linux-android23 --sysroot=/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot -fPIC $LANGUAGE_COMPILE_FLAGS $ARCH_FLAGS $LINK_FLAGS -shared $SONAME_FLAG$SONAME -o $TARGET_FILE $in $LINK_PATH $LINK_LIBRARIES && $POST_BUILD + description = Linking CXX shared library $TARGET_FILE + restat = $RESTAT + + +############################################# +# Rule for running custom commands. + +rule CUSTOM_COMMAND + command = $COMMAND + description = $DESC + + +############################################# +# Rule for re-running cmake. + +rule RERUN_CMAKE + command = /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/bin/cmake --regenerate-during-build -S/Users/hamzaaleghwairyeen/development/App/Intaleq/android/app/src/main/cpp -B/Users/hamzaaleghwairyeen/development/App/Intaleq/android/app/.cxx/RelWithDebInfo/6t1m4b5v/x86_64 + description = Re-running CMake... + generator = 1 + + +############################################# +# Rule for cleaning all built files. + +rule CLEAN + command = /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/bin/ninja $FILE_ARG -t clean $TARGETS + description = Cleaning all built files... + + +############################################# +# Rule for printing all primary targets available. + +rule HELP + command = /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/bin/ninja -t targets + description = All primary targets available: + diff --git a/siro_rider/android/app/.cxx/RelWithDebInfo/6t1m4b5v/x86_64/additional_project_files.txt b/siro_rider/android/app/.cxx/RelWithDebInfo/6t1m4b5v/x86_64/additional_project_files.txt new file mode 100644 index 0000000..e69de29 diff --git a/siro_rider/android/app/.cxx/RelWithDebInfo/6t1m4b5v/x86_64/android_gradle_build.json b/siro_rider/android/app/.cxx/RelWithDebInfo/6t1m4b5v/x86_64/android_gradle_build.json new file mode 100644 index 0000000..b87c68e --- /dev/null +++ b/siro_rider/android/app/.cxx/RelWithDebInfo/6t1m4b5v/x86_64/android_gradle_build.json @@ -0,0 +1,38 @@ +{ + "buildFiles": [ + "/Users/hamzaaleghwairyeen/development/App/Intaleq/android/app/src/main/cpp/CMakeLists.txt" + ], + "cleanCommandsComponents": [ + [ + "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/bin/ninja", + "-C", + "/Users/hamzaaleghwairyeen/development/App/Intaleq/android/app/.cxx/RelWithDebInfo/6t1m4b5v/x86_64", + "clean" + ] + ], + "buildTargetsCommandComponents": [ + "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/bin/ninja", + "-C", + "/Users/hamzaaleghwairyeen/development/App/Intaleq/android/app/.cxx/RelWithDebInfo/6t1m4b5v/x86_64", + "{LIST_OF_TARGETS_TO_BUILD}" + ], + "libraries": { + "native-lib::@6890427a1f51a3e7e1df": { + "toolchain": "toolchain", + "abi": "x86_64", + "artifactName": "native-lib", + "output": "/Users/hamzaaleghwairyeen/development/App/Intaleq/build/app/intermediates/cxx/RelWithDebInfo/6t1m4b5v/obj/x86_64/libnative-lib.so", + "runtimeFiles": [] + } + }, + "toolchains": { + "toolchain": { + "cCompilerExecutable": "/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/bin/clang.lld", + "cppCompilerExecutable": "/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/bin/clang++.lld" + } + }, + "cFileExtensions": [], + "cppFileExtensions": [ + "cpp" + ] +} \ No newline at end of file diff --git a/siro_rider/android/app/.cxx/RelWithDebInfo/6t1m4b5v/x86_64/android_gradle_build_mini.json b/siro_rider/android/app/.cxx/RelWithDebInfo/6t1m4b5v/x86_64/android_gradle_build_mini.json new file mode 100644 index 0000000..3c68afc --- /dev/null +++ b/siro_rider/android/app/.cxx/RelWithDebInfo/6t1m4b5v/x86_64/android_gradle_build_mini.json @@ -0,0 +1,27 @@ +{ + "buildFiles": [ + "/Users/hamzaaleghwairyeen/development/App/Intaleq/android/app/src/main/cpp/CMakeLists.txt" + ], + "cleanCommandsComponents": [ + [ + "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/bin/ninja", + "-C", + "/Users/hamzaaleghwairyeen/development/App/Intaleq/android/app/.cxx/RelWithDebInfo/6t1m4b5v/x86_64", + "clean" + ] + ], + "buildTargetsCommandComponents": [ + "/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/bin/ninja", + "-C", + "/Users/hamzaaleghwairyeen/development/App/Intaleq/android/app/.cxx/RelWithDebInfo/6t1m4b5v/x86_64", + "{LIST_OF_TARGETS_TO_BUILD}" + ], + "libraries": { + "native-lib::@6890427a1f51a3e7e1df": { + "artifactName": "native-lib", + "abi": "x86_64", + "output": "/Users/hamzaaleghwairyeen/development/App/Intaleq/build/app/intermediates/cxx/RelWithDebInfo/6t1m4b5v/obj/x86_64/libnative-lib.so", + "runtimeFiles": [] + } + } +} \ No newline at end of file diff --git a/siro_rider/android/app/.cxx/RelWithDebInfo/6t1m4b5v/x86_64/build.ninja b/siro_rider/android/app/.cxx/RelWithDebInfo/6t1m4b5v/x86_64/build.ninja new file mode 100644 index 0000000..7b5cb00 --- /dev/null +++ b/siro_rider/android/app/.cxx/RelWithDebInfo/6t1m4b5v/x86_64/build.ninja @@ -0,0 +1,156 @@ +# CMAKE generated file: DO NOT EDIT! +# Generated by "Ninja" Generator, CMake Version 3.31 + +# This file contains all the build statements describing the +# compilation DAG. + +# ============================================================================= +# Write statements declared in CMakeLists.txt: +# +# Which is the root file. +# ============================================================================= + +# ============================================================================= +# Project: intaleq +# Configurations: RelWithDebInfo +# ============================================================================= + +############################################# +# Minimal version of Ninja required by this file + +ninja_required_version = 1.5 + + +############################################# +# Set configuration variable for custom commands. + +CONFIGURATION = RelWithDebInfo +# ============================================================================= +# Include auxiliary files. + + +############################################# +# Include rules file. + +include CMakeFiles/rules.ninja + +# ============================================================================= + +############################################# +# Logical path to working directory; prefix for absolute paths. + +cmake_ninja_workdir = /Users/hamzaaleghwairyeen/development/App/Intaleq/android/app/.cxx/RelWithDebInfo/6t1m4b5v/x86_64/ +# ============================================================================= +# Object build statements for SHARED_LIBRARY target native-lib + + +############################################# +# Order-only phony target for native-lib + +build cmake_object_order_depends_target_native-lib: phony || . + +build CMakeFiles/native-lib.dir/native-lib.cpp.o: CXX_COMPILER__native-lib_unscanned_RelWithDebInfo /Users/hamzaaleghwairyeen/development/App/Intaleq/android/app/src/main/cpp/native-lib.cpp || cmake_object_order_depends_target_native-lib + DEFINES = -Dnative_lib_EXPORTS + DEP_FILE = CMakeFiles/native-lib.dir/native-lib.cpp.o.d + FLAGS = -g -DANDROID -fdata-sections -ffunction-sections -funwind-tables -fstack-protector-strong -no-canonical-prefixes -D_FORTIFY_SOURCE=2 -Wformat -Werror=format-security -O2 -g -DNDEBUG -fPIC + OBJECT_DIR = CMakeFiles/native-lib.dir + OBJECT_FILE_DIR = CMakeFiles/native-lib.dir + TARGET_COMPILE_PDB = CMakeFiles/native-lib.dir/ + TARGET_PDB = /Users/hamzaaleghwairyeen/development/App/Intaleq/build/app/intermediates/cxx/RelWithDebInfo/6t1m4b5v/obj/x86_64/libnative-lib.pdb + + +# ============================================================================= +# Link build statements for SHARED_LIBRARY target native-lib + + +############################################# +# Link the shared library /Users/hamzaaleghwairyeen/development/App/Intaleq/build/app/intermediates/cxx/RelWithDebInfo/6t1m4b5v/obj/x86_64/libnative-lib.so + +build /Users/hamzaaleghwairyeen/development/App/Intaleq/build/app/intermediates/cxx/RelWithDebInfo/6t1m4b5v/obj/x86_64/libnative-lib.so: CXX_SHARED_LIBRARY_LINKER__native-lib_RelWithDebInfo CMakeFiles/native-lib.dir/native-lib.cpp.o | /Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/lib/x86_64-linux-android/23/liblog.so + DEP_FILE = CMakeFiles/native-lib.dir/link.d + LANGUAGE_COMPILE_FLAGS = -g -DANDROID -fdata-sections -ffunction-sections -funwind-tables -fstack-protector-strong -no-canonical-prefixes -D_FORTIFY_SOURCE=2 -Wformat -Werror=format-security -O2 -g -DNDEBUG + LINK_FLAGS = -static-libstdc++ -Wl,--build-id=sha1 -Wl,--no-rosegment -Wl,--no-undefined-version -Wl,--fatal-warnings -Wl,--no-undefined -Qunused-arguments -Wl,--gc-sections -Xlinker --dependency-file=CMakeFiles/native-lib.dir/link.d + LINK_LIBRARIES = /Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/lib/x86_64-linux-android/23/liblog.so -latomic -lm + OBJECT_DIR = CMakeFiles/native-lib.dir + POST_BUILD = : + PRE_LINK = : + SONAME = libnative-lib.so + SONAME_FLAG = -Wl,-soname, + TARGET_COMPILE_PDB = CMakeFiles/native-lib.dir/ + TARGET_FILE = /Users/hamzaaleghwairyeen/development/App/Intaleq/build/app/intermediates/cxx/RelWithDebInfo/6t1m4b5v/obj/x86_64/libnative-lib.so + TARGET_PDB = /Users/hamzaaleghwairyeen/development/App/Intaleq/build/app/intermediates/cxx/RelWithDebInfo/6t1m4b5v/obj/x86_64/libnative-lib.pdb + + +############################################# +# Utility command for edit_cache + +build CMakeFiles/edit_cache.util: CUSTOM_COMMAND + COMMAND = cd /Users/hamzaaleghwairyeen/development/App/Intaleq/android/app/.cxx/RelWithDebInfo/6t1m4b5v/x86_64 && /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/bin/ccmake -S/Users/hamzaaleghwairyeen/development/App/Intaleq/android/app/src/main/cpp -B/Users/hamzaaleghwairyeen/development/App/Intaleq/android/app/.cxx/RelWithDebInfo/6t1m4b5v/x86_64 + DESC = Running CMake cache editor... + pool = console + restat = 1 + +build edit_cache: phony CMakeFiles/edit_cache.util + + +############################################# +# Utility command for rebuild_cache + +build CMakeFiles/rebuild_cache.util: CUSTOM_COMMAND + COMMAND = cd /Users/hamzaaleghwairyeen/development/App/Intaleq/android/app/.cxx/RelWithDebInfo/6t1m4b5v/x86_64 && /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/bin/cmake --regenerate-during-build -S/Users/hamzaaleghwairyeen/development/App/Intaleq/android/app/src/main/cpp -B/Users/hamzaaleghwairyeen/development/App/Intaleq/android/app/.cxx/RelWithDebInfo/6t1m4b5v/x86_64 + DESC = Running CMake to regenerate build system... + pool = console + restat = 1 + +build rebuild_cache: phony CMakeFiles/rebuild_cache.util + +# ============================================================================= +# Target aliases. + +build libnative-lib.so: phony /Users/hamzaaleghwairyeen/development/App/Intaleq/build/app/intermediates/cxx/RelWithDebInfo/6t1m4b5v/obj/x86_64/libnative-lib.so + +build native-lib: phony /Users/hamzaaleghwairyeen/development/App/Intaleq/build/app/intermediates/cxx/RelWithDebInfo/6t1m4b5v/obj/x86_64/libnative-lib.so + +# ============================================================================= +# Folder targets. + +# ============================================================================= + +############################################# +# Folder: /Users/hamzaaleghwairyeen/development/App/Intaleq/android/app/.cxx/RelWithDebInfo/6t1m4b5v/x86_64 + +build all: phony /Users/hamzaaleghwairyeen/development/App/Intaleq/build/app/intermediates/cxx/RelWithDebInfo/6t1m4b5v/obj/x86_64/libnative-lib.so + +# ============================================================================= +# Built-in targets + + +############################################# +# Re-run CMake if any of its inputs changed. + +build build.ninja: RERUN_CMAKE | /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeCCompiler.cmake.in /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeCCompilerABI.c /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeCInformation.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeCXXCompiler.cmake.in /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeCXXCompilerABI.cpp /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeCXXInformation.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeCommonLanguageInclude.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeCompilerIdDetection.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeDetermineCCompiler.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeDetermineCXXCompiler.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeDetermineCompiler.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeDetermineCompilerABI.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeDetermineCompilerId.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeDetermineCompilerSupport.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeDetermineSystem.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeFindBinUtils.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeGenericSystem.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeInitializeConfigs.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeLanguageInformation.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeParseImplicitIncludeInfo.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeParseImplicitLinkInfo.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeParseLibraryArchitecture.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeSystem.cmake.in /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeSystemSpecificInformation.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeSystemSpecificInitialize.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeTestCCompiler.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeTestCXXCompiler.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeTestCompilerCommon.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/ADSP-DetermineCompiler.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/ARMCC-DetermineCompiler.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/ARMClang-DetermineCompiler.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/AppleClang-DetermineCompiler.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/Borland-DetermineCompiler.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/Bruce-C-DetermineCompiler.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/CMakeCommonCompilerMacros.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/Clang-C.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/Clang-CXX-CXXImportStd.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/Clang-CXX.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/Clang-DetermineCompiler.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/Clang-DetermineCompilerInternal.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/Clang-FindBinUtils.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/Clang.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/Compaq-C-DetermineCompiler.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/Compaq-CXX-DetermineCompiler.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/Cray-DetermineCompiler.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/CrayClang-DetermineCompiler.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/Embarcadero-DetermineCompiler.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/Fujitsu-DetermineCompiler.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/FujitsuClang-DetermineCompiler.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/GHS-DetermineCompiler.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/GNU-C-DetermineCompiler.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/GNU-CXX-DetermineCompiler.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/GNU.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/HP-C-DetermineCompiler.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/HP-CXX-DetermineCompiler.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/IAR-DetermineCompiler.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/IBMCPP-C-DetermineVersionInternal.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/IBMCPP-CXX-DetermineVersionInternal.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/IBMClang-C-DetermineCompiler.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/IBMClang-CXX-DetermineCompiler.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/Intel-DetermineCompiler.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/IntelLLVM-DetermineCompiler.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/LCC-C-DetermineCompiler.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/LCC-CXX-DetermineCompiler.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/MSVC-DetermineCompiler.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/NVHPC-DetermineCompiler.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/NVIDIA-DetermineCompiler.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/OpenWatcom-DetermineCompiler.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/OrangeC-DetermineCompiler.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/PGI-DetermineCompiler.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/PathScale-DetermineCompiler.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/SCO-DetermineCompiler.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/SDCC-C-DetermineCompiler.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/SunPro-C-DetermineCompiler.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/SunPro-CXX-DetermineCompiler.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/TI-DetermineCompiler.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/TIClang-DetermineCompiler.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/Tasking-DetermineCompiler.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/TinyCC-C-DetermineCompiler.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/VisualAge-C-DetermineCompiler.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/VisualAge-CXX-DetermineCompiler.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/Watcom-DetermineCompiler.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/XL-C-DetermineCompiler.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/XL-CXX-DetermineCompiler.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/XLClang-C-DetermineCompiler.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/XLClang-CXX-DetermineCompiler.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/zOS-C-DetermineCompiler.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/zOS-CXX-DetermineCompiler.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Internal/CMakeCLinkerInformation.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Internal/CMakeCXXLinkerInformation.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Internal/CMakeCommonLinkerInformation.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Internal/CMakeDetermineLinkerId.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Internal/FeatureTesting.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Linker/GNU.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Linker/LLD-C.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Linker/LLD-CXX.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Linker/LLD.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Platform/Android-Clang-C.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Platform/Android-Clang-CXX.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Platform/Android-Clang.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Platform/Android-Determine-C.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Platform/Android-Determine-CXX.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Platform/Android-Determine.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Platform/Android-Initialize.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Platform/Android.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Platform/Android/Determine-Compiler.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Platform/Linker/Android-LLD-C.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Platform/Linker/Android-LLD-CXX.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Platform/Linker/GNU.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Platform/Linker/Linux-GNU.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Platform/Linker/Linux-LLD-C.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Platform/Linker/Linux-LLD-CXX.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Platform/Linker/Linux-LLD.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Platform/Linux-Initialize.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Platform/Linux.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Platform/UnixPaths.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/build/cmake/abis.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/build/cmake/android-legacy.toolchain.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/build/cmake/android.toolchain.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/build/cmake/flags.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/build/cmake/hooks/pre/Android-Clang.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/build/cmake/hooks/pre/Android-Determine.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/build/cmake/hooks/pre/Android-Initialize.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/build/cmake/hooks/pre/Android.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/build/cmake/hooks/pre/Determine-Compiler.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/build/cmake/platforms.cmake /Users/hamzaaleghwairyeen/development/App/Intaleq/android/app/src/main/cpp/CMakeLists.txt CMakeCache.txt CMakeFiles/3.31.5-g6cf5163/CMakeCCompiler.cmake CMakeFiles/3.31.5-g6cf5163/CMakeCXXCompiler.cmake CMakeFiles/3.31.5-g6cf5163/CMakeSystem.cmake + pool = console + + +############################################# +# A missing CMake input file is not an error. + +build /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeCCompiler.cmake.in /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeCCompilerABI.c /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeCInformation.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeCXXCompiler.cmake.in /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeCXXCompilerABI.cpp /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeCXXInformation.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeCommonLanguageInclude.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeCompilerIdDetection.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeDetermineCCompiler.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeDetermineCXXCompiler.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeDetermineCompiler.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeDetermineCompilerABI.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeDetermineCompilerId.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeDetermineCompilerSupport.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeDetermineSystem.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeFindBinUtils.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeGenericSystem.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeInitializeConfigs.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeLanguageInformation.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeParseImplicitIncludeInfo.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeParseImplicitLinkInfo.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeParseLibraryArchitecture.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeSystem.cmake.in /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeSystemSpecificInformation.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeSystemSpecificInitialize.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeTestCCompiler.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeTestCXXCompiler.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/CMakeTestCompilerCommon.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/ADSP-DetermineCompiler.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/ARMCC-DetermineCompiler.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/ARMClang-DetermineCompiler.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/AppleClang-DetermineCompiler.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/Borland-DetermineCompiler.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/Bruce-C-DetermineCompiler.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/CMakeCommonCompilerMacros.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/Clang-C.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/Clang-CXX-CXXImportStd.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/Clang-CXX.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/Clang-DetermineCompiler.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/Clang-DetermineCompilerInternal.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/Clang-FindBinUtils.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/Clang.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/Compaq-C-DetermineCompiler.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/Compaq-CXX-DetermineCompiler.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/Cray-DetermineCompiler.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/CrayClang-DetermineCompiler.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/Embarcadero-DetermineCompiler.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/Fujitsu-DetermineCompiler.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/FujitsuClang-DetermineCompiler.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/GHS-DetermineCompiler.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/GNU-C-DetermineCompiler.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/GNU-CXX-DetermineCompiler.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/GNU.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/HP-C-DetermineCompiler.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/HP-CXX-DetermineCompiler.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/IAR-DetermineCompiler.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/IBMCPP-C-DetermineVersionInternal.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/IBMCPP-CXX-DetermineVersionInternal.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/IBMClang-C-DetermineCompiler.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/IBMClang-CXX-DetermineCompiler.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/Intel-DetermineCompiler.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/IntelLLVM-DetermineCompiler.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/LCC-C-DetermineCompiler.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/LCC-CXX-DetermineCompiler.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/MSVC-DetermineCompiler.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/NVHPC-DetermineCompiler.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/NVIDIA-DetermineCompiler.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/OpenWatcom-DetermineCompiler.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/OrangeC-DetermineCompiler.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/PGI-DetermineCompiler.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/PathScale-DetermineCompiler.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/SCO-DetermineCompiler.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/SDCC-C-DetermineCompiler.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/SunPro-C-DetermineCompiler.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/SunPro-CXX-DetermineCompiler.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/TI-DetermineCompiler.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/TIClang-DetermineCompiler.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/Tasking-DetermineCompiler.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/TinyCC-C-DetermineCompiler.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/VisualAge-C-DetermineCompiler.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/VisualAge-CXX-DetermineCompiler.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/Watcom-DetermineCompiler.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/XL-C-DetermineCompiler.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/XL-CXX-DetermineCompiler.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/XLClang-C-DetermineCompiler.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/XLClang-CXX-DetermineCompiler.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/zOS-C-DetermineCompiler.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Compiler/zOS-CXX-DetermineCompiler.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Internal/CMakeCLinkerInformation.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Internal/CMakeCXXLinkerInformation.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Internal/CMakeCommonLinkerInformation.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Internal/CMakeDetermineLinkerId.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Internal/FeatureTesting.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Linker/GNU.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Linker/LLD-C.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Linker/LLD-CXX.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Linker/LLD.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Platform/Android-Clang-C.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Platform/Android-Clang-CXX.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Platform/Android-Clang.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Platform/Android-Determine-C.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Platform/Android-Determine-CXX.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Platform/Android-Determine.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Platform/Android-Initialize.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Platform/Android.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Platform/Android/Determine-Compiler.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Platform/Linker/Android-LLD-C.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Platform/Linker/Android-LLD-CXX.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Platform/Linker/GNU.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Platform/Linker/Linux-GNU.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Platform/Linker/Linux-LLD-C.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Platform/Linker/Linux-LLD-CXX.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Platform/Linker/Linux-LLD.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Platform/Linux-Initialize.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Platform/Linux.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/share/cmake-3.31/Modules/Platform/UnixPaths.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/build/cmake/abis.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/build/cmake/android-legacy.toolchain.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/build/cmake/android.toolchain.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/build/cmake/flags.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/build/cmake/hooks/pre/Android-Clang.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/build/cmake/hooks/pre/Android-Determine.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/build/cmake/hooks/pre/Android-Initialize.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/build/cmake/hooks/pre/Android.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/build/cmake/hooks/pre/Determine-Compiler.cmake /Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/build/cmake/platforms.cmake /Users/hamzaaleghwairyeen/development/App/Intaleq/android/app/src/main/cpp/CMakeLists.txt CMakeCache.txt CMakeFiles/3.31.5-g6cf5163/CMakeCCompiler.cmake CMakeFiles/3.31.5-g6cf5163/CMakeCXXCompiler.cmake CMakeFiles/3.31.5-g6cf5163/CMakeSystem.cmake: phony + + +############################################# +# Clean all the built files. + +build clean: CLEAN + + +############################################# +# Print all primary targets available. + +build help: HELP + + +############################################# +# Make the all target the default. + +default all diff --git a/siro_rider/android/app/.cxx/RelWithDebInfo/6t1m4b5v/x86_64/build_file_index.txt b/siro_rider/android/app/.cxx/RelWithDebInfo/6t1m4b5v/x86_64/build_file_index.txt new file mode 100644 index 0000000..661f7ae --- /dev/null +++ b/siro_rider/android/app/.cxx/RelWithDebInfo/6t1m4b5v/x86_64/build_file_index.txt @@ -0,0 +1 @@ +/Users/hamzaaleghwairyeen/development/App/Intaleq/android/app/src/main/cpp/CMakeLists.txt \ No newline at end of file diff --git a/siro_rider/android/app/.cxx/RelWithDebInfo/6t1m4b5v/x86_64/cmake_install.cmake b/siro_rider/android/app/.cxx/RelWithDebInfo/6t1m4b5v/x86_64/cmake_install.cmake new file mode 100644 index 0000000..84e2abc --- /dev/null +++ b/siro_rider/android/app/.cxx/RelWithDebInfo/6t1m4b5v/x86_64/cmake_install.cmake @@ -0,0 +1,66 @@ +# Install script for directory: /Users/hamzaaleghwairyeen/development/App/Intaleq/android/app/src/main/cpp + +# Set the install prefix +if(NOT DEFINED CMAKE_INSTALL_PREFIX) + set(CMAKE_INSTALL_PREFIX "/usr/local") +endif() +string(REGEX REPLACE "/$" "" CMAKE_INSTALL_PREFIX "${CMAKE_INSTALL_PREFIX}") + +# Set the install configuration name. +if(NOT DEFINED CMAKE_INSTALL_CONFIG_NAME) + if(BUILD_TYPE) + string(REGEX REPLACE "^[^A-Za-z0-9_]+" "" + CMAKE_INSTALL_CONFIG_NAME "${BUILD_TYPE}") + else() + set(CMAKE_INSTALL_CONFIG_NAME "RelWithDebInfo") + endif() + message(STATUS "Install configuration: \"${CMAKE_INSTALL_CONFIG_NAME}\"") +endif() + +# Set the component getting installed. +if(NOT CMAKE_INSTALL_COMPONENT) + if(COMPONENT) + message(STATUS "Install component: \"${COMPONENT}\"") + set(CMAKE_INSTALL_COMPONENT "${COMPONENT}") + else() + set(CMAKE_INSTALL_COMPONENT) + endif() +endif() + +# Install shared libraries without execute permission? +if(NOT DEFINED CMAKE_INSTALL_SO_NO_EXE) + set(CMAKE_INSTALL_SO_NO_EXE "0") +endif() + +# Is this installation the result of a crosscompile? +if(NOT DEFINED CMAKE_CROSSCOMPILING) + set(CMAKE_CROSSCOMPILING "TRUE") +endif() + +# Set path to fallback-tool for dependency-resolution. +if(NOT DEFINED CMAKE_OBJDUMP) + set(CMAKE_OBJDUMP "/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/bin/llvm-objdump") +endif() + +string(REPLACE ";" "\n" CMAKE_INSTALL_MANIFEST_CONTENT + "${CMAKE_INSTALL_MANIFEST_FILES}") +if(CMAKE_INSTALL_LOCAL_ONLY) + file(WRITE "/Users/hamzaaleghwairyeen/development/App/Intaleq/android/app/.cxx/RelWithDebInfo/6t1m4b5v/x86_64/install_local_manifest.txt" + "${CMAKE_INSTALL_MANIFEST_CONTENT}") +endif() +if(CMAKE_INSTALL_COMPONENT) + if(CMAKE_INSTALL_COMPONENT MATCHES "^[a-zA-Z0-9_.+-]+$") + set(CMAKE_INSTALL_MANIFEST "install_manifest_${CMAKE_INSTALL_COMPONENT}.txt") + else() + string(MD5 CMAKE_INST_COMP_HASH "${CMAKE_INSTALL_COMPONENT}") + set(CMAKE_INSTALL_MANIFEST "install_manifest_${CMAKE_INST_COMP_HASH}.txt") + unset(CMAKE_INST_COMP_HASH) + endif() +else() + set(CMAKE_INSTALL_MANIFEST "install_manifest.txt") +endif() + +if(NOT CMAKE_INSTALL_LOCAL_ONLY) + file(WRITE "/Users/hamzaaleghwairyeen/development/App/Intaleq/android/app/.cxx/RelWithDebInfo/6t1m4b5v/x86_64/${CMAKE_INSTALL_MANIFEST}" + "${CMAKE_INSTALL_MANIFEST_CONTENT}") +endif() diff --git a/siro_rider/android/app/.cxx/RelWithDebInfo/6t1m4b5v/x86_64/compile_commands.json b/siro_rider/android/app/.cxx/RelWithDebInfo/6t1m4b5v/x86_64/compile_commands.json new file mode 100644 index 0000000..ed11bf2 --- /dev/null +++ b/siro_rider/android/app/.cxx/RelWithDebInfo/6t1m4b5v/x86_64/compile_commands.json @@ -0,0 +1,8 @@ +[ +{ + "directory": "/Users/hamzaaleghwairyeen/development/App/Intaleq/android/app/.cxx/RelWithDebInfo/6t1m4b5v/x86_64", + "command": "/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/bin/clang++ --target=x86_64-none-linux-android23 --sysroot=/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot -Dnative_lib_EXPORTS -g -DANDROID -fdata-sections -ffunction-sections -funwind-tables -fstack-protector-strong -no-canonical-prefixes -D_FORTIFY_SOURCE=2 -Wformat -Werror=format-security -O2 -g -DNDEBUG -fPIC -o CMakeFiles/native-lib.dir/native-lib.cpp.o -c /Users/hamzaaleghwairyeen/development/App/Intaleq/android/app/src/main/cpp/native-lib.cpp", + "file": "/Users/hamzaaleghwairyeen/development/App/Intaleq/android/app/src/main/cpp/native-lib.cpp", + "output": "CMakeFiles/native-lib.dir/native-lib.cpp.o" +} +] \ No newline at end of file diff --git a/siro_rider/android/app/.cxx/RelWithDebInfo/6t1m4b5v/x86_64/compile_commands.json.bin b/siro_rider/android/app/.cxx/RelWithDebInfo/6t1m4b5v/x86_64/compile_commands.json.bin new file mode 100644 index 0000000..d05ebc1 Binary files /dev/null and b/siro_rider/android/app/.cxx/RelWithDebInfo/6t1m4b5v/x86_64/compile_commands.json.bin differ diff --git a/siro_rider/android/app/.cxx/RelWithDebInfo/6t1m4b5v/x86_64/configure_fingerprint.bin b/siro_rider/android/app/.cxx/RelWithDebInfo/6t1m4b5v/x86_64/configure_fingerprint.bin new file mode 100644 index 0000000..be2189f --- /dev/null +++ b/siro_rider/android/app/.cxx/RelWithDebInfo/6t1m4b5v/x86_64/configure_fingerprint.bin @@ -0,0 +1,29 @@ +C/C++ Structured Log + +~/Users/hamzaaleghwairyeen/development/App/Intaleq/android/app/.cxx/RelWithDebInfo/6t1m4b5v/x86_64/additional_project_files.txtC +A +?com.android.build.gradle.internal.cxx.io.EncodedFileFingerPrint  3  ̙2 +} +{/Users/hamzaaleghwairyeen/development/App/Intaleq/android/app/.cxx/RelWithDebInfo/6t1m4b5v/x86_64/android_gradle_build.json  3 + ̙2 + +/Users/hamzaaleghwairyeen/development/App/Intaleq/android/app/.cxx/RelWithDebInfo/6t1m4b5v/x86_64/android_gradle_build_mini.json  3 ̙2q +o +m/Users/hamzaaleghwairyeen/development/App/Intaleq/android/app/.cxx/RelWithDebInfo/6t1m4b5v/x86_64/build.ninja  3 ˙2u +s +q/Users/hamzaaleghwairyeen/development/App/Intaleq/android/app/.cxx/RelWithDebInfo/6t1m4b5v/x86_64/build.ninja.txt  3z +x +v/Users/hamzaaleghwairyeen/development/App/Intaleq/android/app/.cxx/RelWithDebInfo/6t1m4b5v/x86_64/build_file_index.txt  3 Y ̙2{ +y +w/Users/hamzaaleghwairyeen/development/App/Intaleq/android/app/.cxx/RelWithDebInfo/6t1m4b5v/x86_64/compile_commands.json  3 ˙2 +} +{/Users/hamzaaleghwairyeen/development/App/Intaleq/android/app/.cxx/RelWithDebInfo/6t1m4b5v/x86_64/compile_commands.json.bin  3  ˙2 + +/Users/hamzaaleghwairyeen/development/App/Intaleq/android/app/.cxx/RelWithDebInfo/6t1m4b5v/x86_64/metadata_generation_command.txt  3 + ̙2x +v +t/Users/hamzaaleghwairyeen/development/App/Intaleq/android/app/.cxx/RelWithDebInfo/6t1m4b5v/x86_64/prefab_config.json  3  ( ̙2} +{ +y/Users/hamzaaleghwairyeen/development/App/Intaleq/android/app/.cxx/RelWithDebInfo/6t1m4b5v/x86_64/symbol_folder_index.txt  3  p ̙2] +[ +Y/Users/hamzaaleghwairyeen/development/App/Intaleq/android/app/src/main/cpp/CMakeLists.txt  3  ޮ2 \ No newline at end of file diff --git a/siro_rider/android/app/.cxx/RelWithDebInfo/6t1m4b5v/x86_64/metadata_generation_command.txt b/siro_rider/android/app/.cxx/RelWithDebInfo/6t1m4b5v/x86_64/metadata_generation_command.txt new file mode 100644 index 0000000..3ee3343 --- /dev/null +++ b/siro_rider/android/app/.cxx/RelWithDebInfo/6t1m4b5v/x86_64/metadata_generation_command.txt @@ -0,0 +1,18 @@ + -H/Users/hamzaaleghwairyeen/development/App/Intaleq/android/app/src/main/cpp +-DCMAKE_SYSTEM_NAME=Android +-DCMAKE_EXPORT_COMPILE_COMMANDS=ON +-DCMAKE_SYSTEM_VERSION=23 +-DANDROID_PLATFORM=android-23 +-DANDROID_ABI=x86_64 +-DCMAKE_ANDROID_ARCH_ABI=x86_64 +-DANDROID_NDK=/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973 +-DCMAKE_ANDROID_NDK=/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973 +-DCMAKE_TOOLCHAIN_FILE=/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/build/cmake/android.toolchain.cmake +-DCMAKE_MAKE_PROGRAM=/Users/hamzaaleghwairyeen/Library/Android/sdk/cmake/3.31.5/bin/ninja +-DCMAKE_LIBRARY_OUTPUT_DIRECTORY=/Users/hamzaaleghwairyeen/development/App/Intaleq/build/app/intermediates/cxx/RelWithDebInfo/6t1m4b5v/obj/x86_64 +-DCMAKE_RUNTIME_OUTPUT_DIRECTORY=/Users/hamzaaleghwairyeen/development/App/Intaleq/build/app/intermediates/cxx/RelWithDebInfo/6t1m4b5v/obj/x86_64 +-DCMAKE_BUILD_TYPE=RelWithDebInfo +-B/Users/hamzaaleghwairyeen/development/App/Intaleq/android/app/.cxx/RelWithDebInfo/6t1m4b5v/x86_64 +-GNinja + Build command args: [] + Version: 2 \ No newline at end of file diff --git a/siro_rider/android/app/.cxx/RelWithDebInfo/6t1m4b5v/x86_64/prefab_config.json b/siro_rider/android/app/.cxx/RelWithDebInfo/6t1m4b5v/x86_64/prefab_config.json new file mode 100644 index 0000000..e799de8 --- /dev/null +++ b/siro_rider/android/app/.cxx/RelWithDebInfo/6t1m4b5v/x86_64/prefab_config.json @@ -0,0 +1,4 @@ +{ + "enabled": false, + "packages": [] +} \ No newline at end of file diff --git a/siro_rider/android/app/.cxx/RelWithDebInfo/6t1m4b5v/x86_64/symbol_folder_index.txt b/siro_rider/android/app/.cxx/RelWithDebInfo/6t1m4b5v/x86_64/symbol_folder_index.txt new file mode 100644 index 0000000..e28a967 --- /dev/null +++ b/siro_rider/android/app/.cxx/RelWithDebInfo/6t1m4b5v/x86_64/symbol_folder_index.txt @@ -0,0 +1 @@ +/Users/hamzaaleghwairyeen/development/App/Intaleq/build/app/intermediates/cxx/RelWithDebInfo/6t1m4b5v/obj/x86_64 \ No newline at end of file diff --git a/siro_rider/android/app/.cxx/tools/profile/arm64-v8a/compile_commands.json b/siro_rider/android/app/.cxx/tools/profile/arm64-v8a/compile_commands.json new file mode 100644 index 0000000..5b16e99 --- /dev/null +++ b/siro_rider/android/app/.cxx/tools/profile/arm64-v8a/compile_commands.json @@ -0,0 +1,8 @@ +[ +{ + "directory": "/Users/hamzaaleghwairyeen/development/App/Intaleq/android/app/.cxx/Debug/3p4b322x/arm64-v8a", + "command": "/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/bin/clang++ --target=aarch64-none-linux-android23 --sysroot=/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot -Dnative_lib_EXPORTS -g -DANDROID -fdata-sections -ffunction-sections -funwind-tables -fstack-protector-strong -no-canonical-prefixes -D_FORTIFY_SOURCE=2 -Wformat -Werror=format-security -fno-limit-debug-info -fPIC -o CMakeFiles/native-lib.dir/native-lib.cpp.o -c /Users/hamzaaleghwairyeen/development/App/Intaleq/android/app/src/main/cpp/native-lib.cpp", + "file": "/Users/hamzaaleghwairyeen/development/App/Intaleq/android/app/src/main/cpp/native-lib.cpp", + "output": "CMakeFiles/native-lib.dir/native-lib.cpp.o" +} +] \ No newline at end of file diff --git a/siro_rider/android/app/.cxx/tools/profile/armeabi-v7a/compile_commands.json b/siro_rider/android/app/.cxx/tools/profile/armeabi-v7a/compile_commands.json new file mode 100644 index 0000000..078c0a3 --- /dev/null +++ b/siro_rider/android/app/.cxx/tools/profile/armeabi-v7a/compile_commands.json @@ -0,0 +1,8 @@ +[ +{ + "directory": "/Users/hamzaaleghwairyeen/development/App/Intaleq/android/app/.cxx/Debug/3p4b322x/armeabi-v7a", + "command": "/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/bin/clang++ --target=armv7-none-linux-androideabi23 --sysroot=/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot -Dnative_lib_EXPORTS -g -DANDROID -fdata-sections -ffunction-sections -funwind-tables -fstack-protector-strong -no-canonical-prefixes -D_FORTIFY_SOURCE=2 -march=armv7-a -mthumb -Wformat -Werror=format-security -fno-limit-debug-info -fPIC -o CMakeFiles/native-lib.dir/native-lib.cpp.o -c /Users/hamzaaleghwairyeen/development/App/Intaleq/android/app/src/main/cpp/native-lib.cpp", + "file": "/Users/hamzaaleghwairyeen/development/App/Intaleq/android/app/src/main/cpp/native-lib.cpp", + "output": "CMakeFiles/native-lib.dir/native-lib.cpp.o" +} +] \ No newline at end of file diff --git a/siro_rider/android/app/.cxx/tools/profile/x86/compile_commands.json b/siro_rider/android/app/.cxx/tools/profile/x86/compile_commands.json new file mode 100644 index 0000000..a379b2d --- /dev/null +++ b/siro_rider/android/app/.cxx/tools/profile/x86/compile_commands.json @@ -0,0 +1,8 @@ +[ +{ + "directory": "/Users/hamzaaleghwairyeen/development/App/Intaleq/android/app/.cxx/Debug/3p4b322x/x86", + "command": "/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/bin/clang++ --target=i686-none-linux-android23 --sysroot=/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot -Dnative_lib_EXPORTS -g -DANDROID -fdata-sections -ffunction-sections -funwind-tables -fstack-protector-strong -no-canonical-prefixes -mstackrealign -D_FORTIFY_SOURCE=2 -Wformat -Werror=format-security -fno-limit-debug-info -fPIC -o CMakeFiles/native-lib.dir/native-lib.cpp.o -c /Users/hamzaaleghwairyeen/development/App/Intaleq/android/app/src/main/cpp/native-lib.cpp", + "file": "/Users/hamzaaleghwairyeen/development/App/Intaleq/android/app/src/main/cpp/native-lib.cpp", + "output": "CMakeFiles/native-lib.dir/native-lib.cpp.o" +} +] \ No newline at end of file diff --git a/siro_rider/android/app/.cxx/tools/profile/x86_64/compile_commands.json b/siro_rider/android/app/.cxx/tools/profile/x86_64/compile_commands.json new file mode 100644 index 0000000..2a999ce --- /dev/null +++ b/siro_rider/android/app/.cxx/tools/profile/x86_64/compile_commands.json @@ -0,0 +1,8 @@ +[ +{ + "directory": "/Users/hamzaaleghwairyeen/development/App/Intaleq/android/app/.cxx/Debug/3p4b322x/x86_64", + "command": "/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/bin/clang++ --target=x86_64-none-linux-android23 --sysroot=/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot -Dnative_lib_EXPORTS -g -DANDROID -fdata-sections -ffunction-sections -funwind-tables -fstack-protector-strong -no-canonical-prefixes -D_FORTIFY_SOURCE=2 -Wformat -Werror=format-security -fno-limit-debug-info -fPIC -o CMakeFiles/native-lib.dir/native-lib.cpp.o -c /Users/hamzaaleghwairyeen/development/App/Intaleq/android/app/src/main/cpp/native-lib.cpp", + "file": "/Users/hamzaaleghwairyeen/development/App/Intaleq/android/app/src/main/cpp/native-lib.cpp", + "output": "CMakeFiles/native-lib.dir/native-lib.cpp.o" +} +] \ No newline at end of file diff --git a/siro_rider/android/app/.cxx/tools/release/arm64-v8a/compile_commands.json b/siro_rider/android/app/.cxx/tools/release/arm64-v8a/compile_commands.json new file mode 100644 index 0000000..908220b --- /dev/null +++ b/siro_rider/android/app/.cxx/tools/release/arm64-v8a/compile_commands.json @@ -0,0 +1,8 @@ +[ +{ + "directory": "/Users/hamzaaleghwairyeen/development/App/Intaleq/android/app/.cxx/RelWithDebInfo/6t1m4b5v/arm64-v8a", + "command": "/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/bin/clang++ --target=aarch64-none-linux-android23 --sysroot=/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot -Dnative_lib_EXPORTS -g -DANDROID -fdata-sections -ffunction-sections -funwind-tables -fstack-protector-strong -no-canonical-prefixes -D_FORTIFY_SOURCE=2 -Wformat -Werror=format-security -O2 -g -DNDEBUG -fPIC -o CMakeFiles/native-lib.dir/native-lib.cpp.o -c /Users/hamzaaleghwairyeen/development/App/Intaleq/android/app/src/main/cpp/native-lib.cpp", + "file": "/Users/hamzaaleghwairyeen/development/App/Intaleq/android/app/src/main/cpp/native-lib.cpp", + "output": "CMakeFiles/native-lib.dir/native-lib.cpp.o" +} +] \ No newline at end of file diff --git a/siro_rider/android/app/.cxx/tools/release/armeabi-v7a/compile_commands.json b/siro_rider/android/app/.cxx/tools/release/armeabi-v7a/compile_commands.json new file mode 100644 index 0000000..442145a --- /dev/null +++ b/siro_rider/android/app/.cxx/tools/release/armeabi-v7a/compile_commands.json @@ -0,0 +1,8 @@ +[ +{ + "directory": "/Users/hamzaaleghwairyeen/development/App/Intaleq/android/app/.cxx/RelWithDebInfo/6t1m4b5v/armeabi-v7a", + "command": "/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/bin/clang++ --target=armv7-none-linux-androideabi23 --sysroot=/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot -Dnative_lib_EXPORTS -g -DANDROID -fdata-sections -ffunction-sections -funwind-tables -fstack-protector-strong -no-canonical-prefixes -D_FORTIFY_SOURCE=2 -march=armv7-a -mthumb -Wformat -Werror=format-security -O2 -g -DNDEBUG -fPIC -o CMakeFiles/native-lib.dir/native-lib.cpp.o -c /Users/hamzaaleghwairyeen/development/App/Intaleq/android/app/src/main/cpp/native-lib.cpp", + "file": "/Users/hamzaaleghwairyeen/development/App/Intaleq/android/app/src/main/cpp/native-lib.cpp", + "output": "CMakeFiles/native-lib.dir/native-lib.cpp.o" +} +] \ No newline at end of file diff --git a/siro_rider/android/app/.cxx/tools/release/x86/compile_commands.json b/siro_rider/android/app/.cxx/tools/release/x86/compile_commands.json new file mode 100644 index 0000000..346cb3a --- /dev/null +++ b/siro_rider/android/app/.cxx/tools/release/x86/compile_commands.json @@ -0,0 +1,8 @@ +[ +{ + "directory": "/Users/hamzaaleghwairyeen/development/App/Intaleq/android/app/.cxx/RelWithDebInfo/6t1m4b5v/x86", + "command": "/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/bin/clang++ --target=i686-none-linux-android23 --sysroot=/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot -Dnative_lib_EXPORTS -g -DANDROID -fdata-sections -ffunction-sections -funwind-tables -fstack-protector-strong -no-canonical-prefixes -mstackrealign -D_FORTIFY_SOURCE=2 -Wformat -Werror=format-security -O2 -g -DNDEBUG -fPIC -o CMakeFiles/native-lib.dir/native-lib.cpp.o -c /Users/hamzaaleghwairyeen/development/App/Intaleq/android/app/src/main/cpp/native-lib.cpp", + "file": "/Users/hamzaaleghwairyeen/development/App/Intaleq/android/app/src/main/cpp/native-lib.cpp", + "output": "CMakeFiles/native-lib.dir/native-lib.cpp.o" +} +] \ No newline at end of file diff --git a/siro_rider/android/app/.cxx/tools/release/x86_64/compile_commands.json b/siro_rider/android/app/.cxx/tools/release/x86_64/compile_commands.json new file mode 100644 index 0000000..ed11bf2 --- /dev/null +++ b/siro_rider/android/app/.cxx/tools/release/x86_64/compile_commands.json @@ -0,0 +1,8 @@ +[ +{ + "directory": "/Users/hamzaaleghwairyeen/development/App/Intaleq/android/app/.cxx/RelWithDebInfo/6t1m4b5v/x86_64", + "command": "/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/bin/clang++ --target=x86_64-none-linux-android23 --sysroot=/Users/hamzaaleghwairyeen/Library/Android/sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/darwin-x86_64/sysroot -Dnative_lib_EXPORTS -g -DANDROID -fdata-sections -ffunction-sections -funwind-tables -fstack-protector-strong -no-canonical-prefixes -D_FORTIFY_SOURCE=2 -Wformat -Werror=format-security -O2 -g -DNDEBUG -fPIC -o CMakeFiles/native-lib.dir/native-lib.cpp.o -c /Users/hamzaaleghwairyeen/development/App/Intaleq/android/app/src/main/cpp/native-lib.cpp", + "file": "/Users/hamzaaleghwairyeen/development/App/Intaleq/android/app/src/main/cpp/native-lib.cpp", + "output": "CMakeFiles/native-lib.dir/native-lib.cpp.o" +} +] \ No newline at end of file diff --git a/siro_rider/android/app/build.gradle b/siro_rider/android/app/build.gradle new file mode 100644 index 0000000..07b4045 --- /dev/null +++ b/siro_rider/android/app/build.gradle @@ -0,0 +1,103 @@ +plugins { + id "com.android.application" + // START: FlutterFire Configuration + id 'com.google.gms.google-services' + // END: FlutterFire Configuration + id "kotlin-android" + // The Flutter Gradle Plugin must be applied after the Android and Kotlin Gradle plugins. + id "dev.flutter.flutter-gradle-plugin" +} + +def keystoreProperties = new Properties() +def keystorePropertiesFile = rootProject.file('key.properties') +// Load keystore properties if the file exists +if (keystorePropertiesFile.exists()) { + keystoreProperties.load(new FileInputStream(keystorePropertiesFile)) +} +android { + namespace = "com.siro.siro_rider" + compileSdk = 36 + ndkVersion "29.0.14033849" + + compileOptions { + sourceCompatibility = JavaVersion.VERSION_17 + targetCompatibility = JavaVersion.VERSION_17 + coreLibraryDesugaringEnabled true + } + externalNativeBuild { + cmake { + path "src/main/cpp/CMakeLists.txt" + version "3.22.1" + } + } + + + kotlinOptions { + jvmTarget = "17" + } + sourceSets { + main { + jniLibs.srcDirs = ['src/main/jniLibs'] + } + } + + defaultConfig { + // TODO: Specify your own unique Application ID (https://developer.android.com/studio/build/application-id.html). + applicationId = "com.siro.siro_rider" + // You can update the following values to match your application needs. + // For more information, see: https://flutter.dev/to/review-gradle-config. + minSdkVersion = 24 + targetSdk = 36 + versionCode = 65 + versionName = '1.1.65' + multiDexEnabled = true + ndk { + abiFilters "armeabi-v7a", "arm64-v8a" + } + // استدعاء المفتاح من ملف key.properties + manifestPlaceholders += [mapsApiKey: keystoreProperties['mapsApiKey'] ?: ""] + + } + + signingConfigs { + release { + // Defensively check if properties exist to avoid NullPointerException in BundleTool + if (keystoreProperties.isEmpty()) { + println "BUILD_LOG: ERROR - No properties found in key.properties. Release build will fail." + } else { + storeFile = keystoreProperties['storeFile'] ? file(keystoreProperties['storeFile']) : null + storePassword = keystoreProperties['storePassword'] + keyAlias = keystoreProperties['keyAlias'] + keyPassword = keystoreProperties['keyPassword'] + + // Final check to ensure no crucial signing variable is null + if (!storeFile || !storePassword || !keyAlias || !keyPassword) { + println "BUILD_LOG: ERROR - One or more signing properties are NULL. Check key.properties." + } + } + } + } + + buildTypes { + release { + // Only assign signingConfig if the release config is valid + signingConfig signingConfigs.release + + minifyEnabled true + shrinkResources true + proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro' + } + } +} + +flutter { + source = "../.." +} + +dependencies { + implementation "org.jetbrains.kotlin:kotlin-stdlib-jdk7:$kotlin_version" + coreLibraryDesugaring 'com.android.tools:desugar_jdk_libs:2.1.5' + implementation 'com.scottyab:rootbeer-lib:0.1.0' + implementation 'com.google.android.gms:play-services-safetynet:18.1.0' + implementation 'com.google.android.gms:play-services-location:21.3.0' +} diff --git a/siro_rider/android/app/google-services.json b/siro_rider/android/app/google-services.json new file mode 100644 index 0000000..8a9269e --- /dev/null +++ b/siro_rider/android/app/google-services.json @@ -0,0 +1,29 @@ +{ + "project_info": { + "project_number": "825988584191", + "project_id": "siro-a6957", + "storage_bucket": "siro-a6957.firebasestorage.app" + }, + "client": [ + { + "client_info": { + "mobilesdk_app_id": "1:825988584191:android:06782b540c7681ad1632ca", + "android_client_info": { + "package_name": "com.siro.rider" + } + }, + "oauth_client": [], + "api_key": [ + { + "current_key": "AIzaSyAEoply_UcEP6KaCu_ziCy_ZDIjAKvi7b8" + } + ], + "services": { + "appinvite_service": { + "other_platform_oauth_client": [] + } + } + } + ], + "configuration_version": "1" +} \ No newline at end of file diff --git a/siro_rider/android/app/proguard-rules.pro b/siro_rider/android/app/proguard-rules.pro new file mode 100644 index 0000000..11db829 --- /dev/null +++ b/siro_rider/android/app/proguard-rules.pro @@ -0,0 +1,33 @@ +# Suppress warnings for specific Google ML Kit classes +-dontwarn com.google.mlkit.vision.text.chinese.ChineseTextRecognizerOptions$Builder +-dontwarn com.google.mlkit.vision.text.chinese.ChineseTextRecognizerOptions +-dontwarn com.google.mlkit.vision.text.devanagari.DevanagariTextRecognizerOptions$Builder +-dontwarn com.google.mlkit.vision.text.devanagari.DevanagariTextRecognizerOptions +-dontwarn com.google.mlkit.vision.text.japanese.JapaneseTextRecognizerOptions$Builder +-dontwarn com.google.mlkit.vision.text.japanese.JapaneseTextRecognizerOptions +-dontwarn com.google.mlkit.vision.text.korean.KoreanTextRecognizerOptions$Builder +-dontwarn com.google.mlkit.vision.text.korean.KoreanTextRecognizerOptions + +# Keep rules for Google ML Kit +-keep class com.google.mlkit.vision.** { *; } +-keep class com.google.mlkit.vision.text.** { *; } +-keep class com.google.mlkit.vision.text.chinese.ChineseTextRecognizerOptions { *; } +-keep class com.google.mlkit.vision.text.chinese.ChineseTextRecognizerOptions$Builder { *; } +-keep class com.google.mlkit.vision.text.devanagari.DevanagariTextRecognizerOptions { *; } +-keep class com.google.mlkit.vision.text.devanagari.DevanagariTextRecognizerOptions$Builder { *; } +-keep class com.google.mlkit.vision.text.japanese.JapaneseTextRecognizerOptions { *; } +-keep class com.google.mlkit.vision.text.japanese.JapaneseTextRecognizerOptions$Builder { *; } +-keep class com.google.mlkit.vision.text.korean.KoreanTextRecognizerOptions { *; } +-keep class com.google.mlkit.vision.text.korean.KoreanTextRecognizerOptions$Builder { *; } + + +# Keep rule for RootDetection +-keep class com.mobileapp.store.ride.RootDetection { + native ; +} + +-assumenosideeffects class android.util.Log { + public static *** v(...); + public static *** d(...); + public static *** i(...); +} \ No newline at end of file diff --git a/siro_rider/android/app/src/debug/AndroidManifest.xml b/siro_rider/android/app/src/debug/AndroidManifest.xml new file mode 100644 index 0000000..399f698 --- /dev/null +++ b/siro_rider/android/app/src/debug/AndroidManifest.xml @@ -0,0 +1,7 @@ + + + + diff --git a/siro_rider/android/app/src/main/AndroidManifest.xml b/siro_rider/android/app/src/main/AndroidManifest.xml new file mode 100644 index 0000000..231a777 --- /dev/null +++ b/siro_rider/android/app/src/main/AndroidManifest.xml @@ -0,0 +1,120 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/siro_rider/android/app/src/main/cpp/CMakeLists.txt b/siro_rider/android/app/src/main/cpp/CMakeLists.txt new file mode 100644 index 0000000..f3e5a78 --- /dev/null +++ b/siro_rider/android/app/src/main/cpp/CMakeLists.txt @@ -0,0 +1,8 @@ +cmake_minimum_required(VERSION 3.10.2) # Use 3.10.2 for consistency. +project(intaleq) + +add_library(native-lib SHARED native-lib.cpp) + +find_library(log-lib log) + +target_link_libraries(native-lib ${log-lib}) \ No newline at end of file diff --git a/siro_rider/android/app/src/main/cpp/native-lib.cpp b/siro_rider/android/app/src/main/cpp/native-lib.cpp new file mode 100644 index 0000000..750d8ae --- /dev/null +++ b/siro_rider/android/app/src/main/cpp/native-lib.cpp @@ -0,0 +1,186 @@ +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include // Add this line + +#define LOG_TAG "NativeLib" +#define LOGD(...) __android_log_print(ANDROID_LOG_DEBUG, LOG_TAG, __VA_ARGS__) +#define LOGE(...) __android_log_print(ANDROID_LOG_ERROR, LOG_TAG, __VA_ARGS__) + +// Function to check for common root binaries +bool isRooted() +{ + std::string paths[] = { + "/system/app/Superuser.apk", + "/system/xbin/su", + "/system/bin/su", + "/system/bin/magisk", + "/system/xbin/magisk", + "/sbin/magisk"}; + + for (const auto &path : paths) + { + std::ifstream file(path); + if (file.good()) + { + return true; + } + } + return false; +} + +// Function to check for the presence of files or directories commonly associated with Frida. +bool checkFridaFiles() +{ + std::string fridaFiles[] = { + "/data/local/tmp/re.frida.server", // Common Frida server path + "/data/local/tmp/frida-server", + "/usr/lib/libfrida-gadget.so", // Frida gadget (injected library) + "/usr/lib64/libfrida-gadget.so", + "/data/local/re.frida.server", + + }; + + for (const auto &path : fridaFiles) + { + if (access(path.c_str(), F_OK) != -1) + { + LOGE("Frida file detected: %s", path.c_str()); + return true; + } + } + return false; +} + +// Checks for open ports commonly used by Frida. This is less reliable, as ports can be changed. +bool checkFridaPorts() +{ + int sock = socket(AF_INET, SOCK_STREAM, 0); + if (sock == -1) + { + return false; // Couldn't create socket, not a strong indicator. + } + + sockaddr_in sa; + memset(&sa, 0, sizeof(sa)); + sa.sin_family = AF_INET; + sa.sin_port = htons(27042); // Default Frida port + inet_pton(AF_INET, "127.0.0.1", &sa.sin_addr); + + if (connect(sock, (struct sockaddr *)&sa, sizeof(sa)) != -1) + { + LOGE("Frida default port (27042) is open."); + close(sock); + return true; + } + + close(sock); + return false; +} + +// Check the maps file of the current process for any suspicious entries. +bool checkMaps() +{ + std::ifstream mapsFile("/proc/self/maps"); + std::string line; + + if (mapsFile.is_open()) + { + while (std::getline(mapsFile, line)) + { + // Look for lines that indicate injected libraries, especially Frida. + if (line.find("frida") != std::string::npos || + line.find("gum-js-") != std::string::npos) + { // Gum is Frida's JavaScript engine + LOGE("Suspicious entry in /proc/self/maps: %s", line.c_str()); + return true; + } + } + mapsFile.close(); + } + else + { + LOGE("Could not open /proc/self/maps"); + return false; + } + return false; +} + +// Check loaded modules. +bool checkLoadedModules() +{ + bool found = false; + dl_iterate_phdr([](struct dl_phdr_info *info, size_t size, void *data) + { + bool *found_ptr = static_cast(data); + if (std::string(info->dlpi_name).find("frida") != std::string::npos) + { + LOGE("Frida module detected: %s", info->dlpi_name); + *found_ptr = true; + return 1; // Stop iterating + } + return 0; // Continue iterating + }, + &found); + + return found; +} + +// This is a simple ptrace check. More sophisticated checks are possible (and necessary for robust detection). +// bool checkPtrace() { +// // Attempt to ptrace ourselves. If another process is already tracing us, this will fail. +// if (ptrace(PTRACE_TRACEME, 0, 1, 0) < 0) { +// LOGE("ptrace failed. Debugger or tracer detected."); +// return true; // Likely being traced +// } +// // Detach. If attached, need to detach to not interfere. +// ptrace(PTRACE_DETACH, 0, 0, 0); +// return false; +//} + +extern "C" JNIEXPORT jboolean JNICALL +Java_com_siro_siro_1rider_RootDetection_isNativeRooted(JNIEnv *env, jobject /* this */) +{ + + if (isRooted()) + { + return JNI_TRUE; + } + + if (checkFridaFiles()) + { + return JNI_TRUE; + } + + if (checkFridaPorts()) + { + return JNI_TRUE; + } + if (checkMaps()) + { + return JNI_TRUE; + } + + if (checkLoadedModules()) + { + return JNI_TRUE; + } + + // if (checkPtrace()) { + // return JNI_TRUE; + // } + + return JNI_FALSE; +} \ No newline at end of file diff --git a/siro_rider/android/app/src/main/kotlin/com/siro/siro_rider/MainActivity.kt b/siro_rider/android/app/src/main/kotlin/com/siro/siro_rider/MainActivity.kt new file mode 100644 index 0000000..a71ff57 --- /dev/null +++ b/siro_rider/android/app/src/main/kotlin/com/siro/siro_rider/MainActivity.kt @@ -0,0 +1,254 @@ +package com.siro.siro_rider + +import android.app.AlertDialog +import android.app.PictureInPictureParams +import android.content.res.Configuration +import android.os.Build +import android.os.Bundle +import android.util.Log +import android.util.Rational +import android.widget.LinearLayout +import android.widget.ProgressBar +import android.widget.TextView +import androidx.core.view.setPadding +import com.scottyab.rootbeer.RootBeer +import io.flutter.embedding.android.FlutterFragmentActivity +import io.flutter.embedding.engine.FlutterEngine +import io.flutter.plugin.common.MethodChannel +import java.io.File +import java.util.Timer +import kotlin.concurrent.schedule + +class MainActivity : FlutterFragmentActivity() { + + // قناة الأمان (كما هي) + private val SECURITY_CHANNEL_NAME = "com.siro.siro_rider/security" + private lateinit var securityChannel: MethodChannel + + // قناة PiP الجديدة + private val PIP_CHANNEL = "intaleq/pip" + private var pipEnabled = false // هل الرحلة نشطة ويجب تفعيل PiP عند الخروج؟ + + override fun configureFlutterEngine(flutterEngine: FlutterEngine) { + super.configureFlutterEngine(flutterEngine) + + // -------- 1) قناة الأمان -------- + securityChannel = + MethodChannel(flutterEngine.dartExecutor.binaryMessenger, SECURITY_CHANNEL_NAME) + + securityChannel.setMethodCallHandler { call, result -> + when (call.method) { + "isNativeRooted" -> { + val isCompromised = isDeviceCompromised() + result.success(isCompromised) + } + else -> { + result.notImplemented() + } + } + } + + // -------- 2) قناة PiP (Picture-in-Picture) -------- + MethodChannel(flutterEngine.dartExecutor.binaryMessenger, PIP_CHANNEL) + .setMethodCallHandler { call, result -> + when (call.method) { + "enablePip" -> { + pipEnabled = true + result.success(true) + } + "disablePip" -> { + pipEnabled = false + result.success(true) + } + "enterPip" -> { + val success = enterPipMode() + result.success(success) + } + "isPipSupported" -> { + result.success(Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) + } + else -> { + result.notImplemented() + } + } + } + } + + // -------- PiP Helper Methods -------- + + private fun enterPipMode(): Boolean { + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) { + val params = PictureInPictureParams.Builder() + .setAspectRatio(Rational(9, 16)) // نسبة عمودية مناسبة لعرض الخريطة + .build() + return enterPictureInPictureMode(params) + } + return false + } + + // عند ضغط المستخدم على زر الرجوع للشاشة الرئيسية أثناء رحلة نشطة + override fun onUserLeaveHint() { + super.onUserLeaveHint() + if (pipEnabled) { + enterPipMode() + } + } + + // إعلام Flutter بتغيير وضع PiP + override fun onPictureInPictureModeChanged( + isInPipMode: Boolean, + newConfig: Configuration + ) { + super.onPictureInPictureModeChanged(isInPipMode, newConfig) + // يمكن لاحقاً إرسال حدث لـ Flutter لإخفاء/إظهار عناصر الواجهة + flutterEngine?.dartExecutor?.binaryMessenger?.let { messenger -> + MethodChannel(messenger, PIP_CHANNEL) + .invokeMethod("onPipChanged", isInPipMode) + } + } + + // ---------------- أمن الجهاز (كما عندك تقريباً) ---------------- + + override fun onCreate(savedInstanceState: Bundle?) { + super.onCreate(savedInstanceState) + + if (isDeviceCompromised()) { + showSecurityWarningDialog() + } + } + + private fun isDeviceCompromised(): Boolean { + return try { + nativeRootCheck() || rootBeerCheck() // || !safetyNetCheck() + } catch (e: Exception) { + Log.e("SecurityCheck", "Error during security checks: ${e.message}", e) + true + } + } + + private fun nativeRootCheck(): Boolean { + Log.d("SecurityCheck", "Starting native root detection...") + return try { + val isNativeRooted = RootDetection.isNativeRooted() + Log.d("SecurityCheck", "Native root detection result: $isNativeRooted") + isNativeRooted + } catch (e: Exception) { + Log.e("SecurityCheck", "Error in native root detection: ${e.message}", e) + true + } + } + + private fun rootBeerCheck(): Boolean { + Log.d("SecurityCheck", "Starting RootBeer root detection...") + val rootBeer = RootBeer(this) + val isRooted = rootBeer.isRooted + Log.d("SecurityCheck", "RootBeer detection result: $isRooted") + return isRooted + } + + // SafetyNet (معلّق كما هو) + private fun safetyNetCheck(): Boolean { + Log.d("SecurityCheck", "Starting SafetyNet check...") + var isSafe = false + val semaphore = java.util.concurrent.Semaphore(0) + + SafetyNetCheck.checkSafetyNet(this, getString(R.string.api_key_safety)) { result -> + isSafe = result + Log.d("SecurityCheck", "SafetyNet check result: $isSafe") + semaphore.release() + } + + try { + semaphore.acquire() + } catch (e: InterruptedException) { + Log.e("SecurityCheck", "Interrupted while waiting for SafetyNet check", e) + return false + } + return isSafe + } + + private fun showSecurityWarningDialog() { + var secondsRemaining = 10 + + val progressBar = ProgressBar(this, null, android.R.attr.progressBarStyleHorizontal) + progressBar.max = 10 + progressBar.progress = 10 + + val textView = TextView(this) + textView.text = getString(R.string.security_warning_message) + textView.textAlignment = TextView.TEXT_ALIGNMENT_CENTER + + val layout = LinearLayout(this) + layout.orientation = LinearLayout.VERTICAL + layout.setPadding(48) + layout.addView(textView) + layout.addView(progressBar) + + val dialog = + AlertDialog.Builder(this) + .setTitle(getString(R.string.security_warning_title)) + .setView(layout) + .setCancelable(false) + .create() + + dialog.show() + + val timer = Timer() + timer.schedule(0, 1000) { + secondsRemaining-- + runOnUiThread { + progressBar.progress = secondsRemaining + if (secondsRemaining <= 0) { + timer.cancel() + dialog.dismiss() + clearAppDataAndExit() + } + } + } + } + + private fun clearAppDataAndExit() { + try { + val packageName = applicationContext.packageName + val runtime = Runtime.getRuntime() + runtime.exec("pm clear $packageName") + } catch (e: Exception) { + clearCache() + clearAppData() + } + + finishAffinity() + System.exit(0) + } + + private fun clearCache() { + try { + deleteDir(cacheDir) + deleteDir(externalCacheDir) + } catch (e: Exception) { + Log.e("SecurityCheck", "Error clearing cache: ${e.message}", e) + } + } + + private fun clearAppData() { + try { + deleteDir(applicationContext.dataDir) + } catch (e: Exception) { + Log.e("SecurityCheck", "Error clearing app data: ${e.message}", e) + } + } + + private fun deleteDir(dir: File?): Boolean { + if (dir != null && dir.isDirectory) { + val children = dir.list() + if (children != null) { + for (child in children) { + if (!deleteDir(File(dir, child))) { + return false + } + } + } + } + return dir?.delete() ?: false + } +} diff --git a/siro_rider/android/app/src/main/kotlin/com/siro/siro_rider/RootDetection.kt b/siro_rider/android/app/src/main/kotlin/com/siro/siro_rider/RootDetection.kt new file mode 100644 index 0000000..45db2de --- /dev/null +++ b/siro_rider/android/app/src/main/kotlin/com/siro/siro_rider/RootDetection.kt @@ -0,0 +1,9 @@ +package com.siro.siro_rider + +object RootDetection { + init { + System.loadLibrary("native-lib") // Load the native library + } + + external fun isNativeRooted(): Boolean // Declare the external function +} diff --git a/siro_rider/android/app/src/main/kotlin/com/siro/siro_rider/SafetyNetCheck.kt b/siro_rider/android/app/src/main/kotlin/com/siro/siro_rider/SafetyNetCheck.kt new file mode 100644 index 0000000..1b8593b --- /dev/null +++ b/siro_rider/android/app/src/main/kotlin/com/siro/siro_rider/SafetyNetCheck.kt @@ -0,0 +1,109 @@ +import android.content.Context +import android.util.Base64 +import android.util.Log +import com.google.android.gms.safetynet.SafetyNet +import com.google.android.gms.safetynet.SafetyNetApi +import com.google.android.gms.tasks.OnFailureListener +import com.google.android.gms.tasks.OnSuccessListener +import org.json.JSONObject +import java.io.IOException +import java.security.GeneralSecurityException +import java.security.SecureRandom +import java.util.Arrays + +object SafetyNetCheck { + + private const val TAG = "SafetyNetCheck" + + fun checkSafetyNet(context: Context, apiKey: String, callback: (Boolean) -> Unit) { + // Generate a nonce. A good nonce is large, random, and used only once. + val nonce = generateNonce() + + SafetyNet.getClient(context).attest(nonce, apiKey) + .addOnSuccessListener { response -> + // Success! Now, *verify* the response. + val jwsResult = response.jwsResult + if (jwsResult != null) { + try { + val isSafe = SafetyNetResponseVerifier.verify(jwsResult) + Log.d(TAG, "SafetyNet verification result: $isSafe") + callback(isSafe) // Now passing a *verified* result. + } catch (e: Exception) { + Log.e(TAG, "Error verifying SafetyNet response: ${e.message}", e) + callback(false) // Treat verification errors as failures. + } + } else { + Log.e(TAG, "SafetyNet jwsResult is null") + callback(false) // Null result is a failure. + } + } + .addOnFailureListener { e -> + Log.e(TAG, "SafetyNet attest API call failed: ${e.message}", e) + callback(false) // API call failure. + } + } + + + // Helper function to generate a nonce. + private fun generateNonce(): ByteArray { + val byteGenerator = SecureRandom() + val nonce = ByteArray(32) + byteGenerator.nextBytes(nonce) + return nonce + } +} + + + +// Helper class to verify the SafetyNet response. +object SafetyNetResponseVerifier { + + private const val TAG = "SafetyNetVerifier" + + // This method *must* be implemented on a *backend server* for real security. + // This is just a *simplified example* for demonstration purposes and is + // *not* suitable for production without a backend check. + @Throws(GeneralSecurityException::class, IOException::class) + fun verify(jwsResult: String): Boolean { + // 1. Parse the JWS: Split into header, payload, and signature. + val parts = jwsResult.split(".") + if (parts.size != 3) { + Log.e(TAG, "Invalid JWS format") + return false // Invalid JWS format + } + + val header = parts[0] + val payload = parts[1] + val signature = parts[2] + + // 2. Decode the payload (it's Base64 encoded). + val decodedPayload = Base64.decode(payload, Base64.DEFAULT) + val payloadJson = JSONObject(String(decodedPayload)) + + // 3. Check the ctsProfileMatch and basicIntegrity. + val ctsProfileMatch = payloadJson.optBoolean("ctsProfileMatch", false) + val basicIntegrity = payloadJson.optBoolean("basicIntegrity", false) + + Log.d(TAG, "ctsProfileMatch: $ctsProfileMatch, basicIntegrity: $basicIntegrity") + + // 4. **CRITICAL: In a real application, you *must* send the JWS to your + // backend server for verification. The server should use the + // Google SafetyNet API (or a library that wraps it) to verify + // the signature and check the fields. This prevents attackers + // from tampering with the response on the device.** + // + // // Example (pseudo-code) of what the backend check would do: + // // GoogleCredential credential = ...; + // // SafetyNet safetyNet = new SafetyNet.Builder(httpTransport, jsonFactory) + // // .setApplicationName("YourAppName") + // // .setHttpRequestInitializer(credential) + // // .build(); + // // SafetyNetApi.VerifyJwsRequest request = safetyNet.safetynet().verifyJws(jwsResult); + // // SafetyNetApi.VerifyJwsResponse response = request.execute(); + // // return response.isValidSignature() && response.getCtsProfileMatch() && response.getBasicIntegrity(); + + // 5. For this *example* (without a backend), we'll just check the fields. + // This is *NOT SECURE* for production! + return ctsProfileMatch && basicIntegrity + } +} \ No newline at end of file diff --git a/siro_rider/android/app/src/main/res/drawable/app_icon.png b/siro_rider/android/app/src/main/res/drawable/app_icon.png new file mode 100644 index 0000000..76fb953 Binary files /dev/null and b/siro_rider/android/app/src/main/res/drawable/app_icon.png differ diff --git a/siro_rider/android/app/src/main/res/drawable/car_icon.png b/siro_rider/android/app/src/main/res/drawable/car_icon.png new file mode 100644 index 0000000..5bc1180 Binary files /dev/null and b/siro_rider/android/app/src/main/res/drawable/car_icon.png differ diff --git a/siro_rider/android/app/src/main/res/drawable/icon_share.png b/siro_rider/android/app/src/main/res/drawable/icon_share.png new file mode 100644 index 0000000..ae92be6 Binary files /dev/null and b/siro_rider/android/app/src/main/res/drawable/icon_share.png differ diff --git a/siro_rider/android/app/src/main/res/drawable/icon_support.png b/siro_rider/android/app/src/main/res/drawable/icon_support.png new file mode 100644 index 0000000..5a9fef9 Binary files /dev/null and b/siro_rider/android/app/src/main/res/drawable/icon_support.png differ diff --git a/siro_rider/android/app/src/main/res/drawable/icon_user.png b/siro_rider/android/app/src/main/res/drawable/icon_user.png new file mode 100644 index 0000000..c8802f2 Binary files /dev/null and b/siro_rider/android/app/src/main/res/drawable/icon_user.png differ diff --git a/siro_rider/android/app/src/main/res/drawable/icon_wallet.png b/siro_rider/android/app/src/main/res/drawable/icon_wallet.png new file mode 100644 index 0000000..551f8a4 Binary files /dev/null and b/siro_rider/android/app/src/main/res/drawable/icon_wallet.png differ diff --git a/siro_rider/android/app/src/main/res/drawable/launch_background.xml b/siro_rider/android/app/src/main/res/drawable/launch_background.xml new file mode 100644 index 0000000..ce28990 --- /dev/null +++ b/siro_rider/android/app/src/main/res/drawable/launch_background.xml @@ -0,0 +1,12 @@ + + + + + + + + + + \ No newline at end of file diff --git a/siro_rider/android/app/src/main/res/drawable/road_bg.xml b/siro_rider/android/app/src/main/res/drawable/road_bg.xml new file mode 100644 index 0000000..e35f394 --- /dev/null +++ b/siro_rider/android/app/src/main/res/drawable/road_bg.xml @@ -0,0 +1,18 @@ + + + + + + + + + + + + + + \ No newline at end of file diff --git a/siro_rider/android/app/src/main/res/mipmap-hdpi/ic_launcher.png b/siro_rider/android/app/src/main/res/mipmap-hdpi/ic_launcher.png new file mode 100644 index 0000000..7f5a487 Binary files /dev/null and b/siro_rider/android/app/src/main/res/mipmap-hdpi/ic_launcher.png differ diff --git a/siro_rider/android/app/src/main/res/mipmap-hdpi/launcher_icon.png b/siro_rider/android/app/src/main/res/mipmap-hdpi/launcher_icon.png new file mode 100644 index 0000000..ca52519 Binary files /dev/null and b/siro_rider/android/app/src/main/res/mipmap-hdpi/launcher_icon.png differ diff --git a/siro_rider/android/app/src/main/res/mipmap-mdpi/ic_launcher.png b/siro_rider/android/app/src/main/res/mipmap-mdpi/ic_launcher.png new file mode 100644 index 0000000..e777c4e Binary files /dev/null and b/siro_rider/android/app/src/main/res/mipmap-mdpi/ic_launcher.png differ diff --git a/siro_rider/android/app/src/main/res/mipmap-mdpi/launcher_icon.png b/siro_rider/android/app/src/main/res/mipmap-mdpi/launcher_icon.png new file mode 100644 index 0000000..a00e563 Binary files /dev/null and b/siro_rider/android/app/src/main/res/mipmap-mdpi/launcher_icon.png differ diff --git a/siro_rider/android/app/src/main/res/mipmap-xhdpi/ic_launcher.png b/siro_rider/android/app/src/main/res/mipmap-xhdpi/ic_launcher.png new file mode 100644 index 0000000..a011dbc Binary files /dev/null and b/siro_rider/android/app/src/main/res/mipmap-xhdpi/ic_launcher.png differ diff --git a/siro_rider/android/app/src/main/res/mipmap-xhdpi/launcher_icon.png b/siro_rider/android/app/src/main/res/mipmap-xhdpi/launcher_icon.png new file mode 100644 index 0000000..3873177 Binary files /dev/null and b/siro_rider/android/app/src/main/res/mipmap-xhdpi/launcher_icon.png differ diff --git a/siro_rider/android/app/src/main/res/mipmap-xxhdpi/ic_launcher.png b/siro_rider/android/app/src/main/res/mipmap-xxhdpi/ic_launcher.png new file mode 100644 index 0000000..6229e8c Binary files /dev/null and b/siro_rider/android/app/src/main/res/mipmap-xxhdpi/ic_launcher.png differ diff --git a/siro_rider/android/app/src/main/res/mipmap-xxhdpi/launcher_icon.png b/siro_rider/android/app/src/main/res/mipmap-xxhdpi/launcher_icon.png new file mode 100644 index 0000000..19320e3 Binary files /dev/null and b/siro_rider/android/app/src/main/res/mipmap-xxhdpi/launcher_icon.png differ diff --git a/siro_rider/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png b/siro_rider/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png new file mode 100644 index 0000000..d2a7677 Binary files /dev/null and b/siro_rider/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png differ diff --git a/siro_rider/android/app/src/main/res/mipmap-xxxhdpi/launcher_icon.png b/siro_rider/android/app/src/main/res/mipmap-xxxhdpi/launcher_icon.png new file mode 100644 index 0000000..2e3238e Binary files /dev/null and b/siro_rider/android/app/src/main/res/mipmap-xxxhdpi/launcher_icon.png differ diff --git a/siro_rider/android/app/src/main/res/raw/app_icon.png b/siro_rider/android/app/src/main/res/raw/app_icon.png new file mode 100644 index 0000000..96cc55a Binary files /dev/null and b/siro_rider/android/app/src/main/res/raw/app_icon.png differ diff --git a/siro_rider/android/app/src/main/res/raw/cancel.wav b/siro_rider/android/app/src/main/res/raw/cancel.wav new file mode 100644 index 0000000..dbe6e7c Binary files /dev/null and b/siro_rider/android/app/src/main/res/raw/cancel.wav differ diff --git a/siro_rider/android/app/src/main/res/raw/ding.wav b/siro_rider/android/app/src/main/res/raw/ding.wav new file mode 100644 index 0000000..c53cd50 Binary files /dev/null and b/siro_rider/android/app/src/main/res/raw/ding.wav differ diff --git a/siro_rider/android/app/src/main/res/raw/promo.wav b/siro_rider/android/app/src/main/res/raw/promo.wav new file mode 100644 index 0000000..3bb2d03 Binary files /dev/null and b/siro_rider/android/app/src/main/res/raw/promo.wav differ diff --git a/siro_rider/android/app/src/main/res/raw/start.wav b/siro_rider/android/app/src/main/res/raw/start.wav new file mode 100644 index 0000000..0655506 Binary files /dev/null and b/siro_rider/android/app/src/main/res/raw/start.wav differ diff --git a/siro_rider/android/app/src/main/res/raw/tone1.mp3 b/siro_rider/android/app/src/main/res/raw/tone1.mp3 new file mode 100644 index 0000000..e32e61b Binary files /dev/null and b/siro_rider/android/app/src/main/res/raw/tone1.mp3 differ diff --git a/siro_rider/android/app/src/main/res/raw/tone2.wav b/siro_rider/android/app/src/main/res/raw/tone2.wav new file mode 100644 index 0000000..0582d47 Binary files /dev/null and b/siro_rider/android/app/src/main/res/raw/tone2.wav differ diff --git a/siro_rider/android/app/src/main/res/values-ar/strings.xml b/siro_rider/android/app/src/main/res/values-ar/strings.xml new file mode 100644 index 0000000..6268edf --- /dev/null +++ b/siro_rider/android/app/src/main/res/values-ar/strings.xml @@ -0,0 +1,8 @@ + + تحذير أمني + تم اكتشاف مشكلة أمنية أو تعديل على هذا الجهاز. لا يمكن + تشغيل التطبيق على هذا الجهاز. + إغلاق التطبيق + الجهاز آمن. الاستمرار بشكل طبيعي. + انطلق + \ No newline at end of file diff --git a/siro_rider/android/app/src/main/res/values-night/styles.xml b/siro_rider/android/app/src/main/res/values-night/styles.xml new file mode 100644 index 0000000..60a2b7e --- /dev/null +++ b/siro_rider/android/app/src/main/res/values-night/styles.xml @@ -0,0 +1,20 @@ + + + + + + + + + diff --git a/siro_rider/android/app/src/main/res/values/strings.xml b/siro_rider/android/app/src/main/res/values/strings.xml new file mode 100644 index 0000000..5b277cc --- /dev/null +++ b/siro_rider/android/app/src/main/res/values/strings.xml @@ -0,0 +1,16 @@ + + My App + + + high_importance_channel + k + + Security Warning + AIzaSyB04YNW3LbvmQ5lX1t2bOwEU18-KUoovzw + + A security issue or modification has been detected on + this device. The app cannot run on this device. + Exit App + Device is secure. Proceeding normally. + Siro Rider + \ No newline at end of file diff --git a/siro_rider/android/app/src/main/res/values/styles.xml b/siro_rider/android/app/src/main/res/values/styles.xml new file mode 100644 index 0000000..80796a9 --- /dev/null +++ b/siro_rider/android/app/src/main/res/values/styles.xml @@ -0,0 +1,20 @@ + + + + + + + + + diff --git a/siro_rider/android/app/src/main/res/xml/network_security_config.xml b/siro_rider/android/app/src/main/res/xml/network_security_config.xml new file mode 100644 index 0000000..629161f --- /dev/null +++ b/siro_rider/android/app/src/main/res/xml/network_security_config.xml @@ -0,0 +1,27 @@ + + + + + + + + + + + intaleq.xyz + + + pXmP2hTQLxDEvlTVmP5N7xpiA32sycBsxB6hBFT2uL4= + + C5+lpZ7tcVwmwQIMcRtPbsQtWLABXhQzejna0wHESsl= + + + + + + + + + + + \ No newline at end of file diff --git a/siro_rider/android/app/src/profile/AndroidManifest.xml b/siro_rider/android/app/src/profile/AndroidManifest.xml new file mode 100644 index 0000000..399f698 --- /dev/null +++ b/siro_rider/android/app/src/profile/AndroidManifest.xml @@ -0,0 +1,7 @@ + + + + diff --git a/siro_rider/android/build.gradle b/siro_rider/android/build.gradle new file mode 100644 index 0000000..8aca6b2 --- /dev/null +++ b/siro_rider/android/build.gradle @@ -0,0 +1,62 @@ + +buildscript { + ext.kotlin_version = '2.1.0' + repositories { + google() + mavenCentral() + } + + dependencies { + // START: FlutterFire Configuration +// classpath 'com.google.gms:google-services:4.4.2' +// // END: FlutterFire Configuration +// classpath 'com.android.tools.build:gradle:7.3.1' + classpath 'com.google.gms:google-services:4.3.15' + // END: FlutterFire Configuration + classpath 'com.android.tools.build:gradle:8.11.1' + classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version" + } +} + +allprojects { + repositories { + google() + mavenCentral() + } +} + +rootProject.buildDir = '../build' +subprojects { + project.buildDir = "${rootProject.buildDir}/${project.name}" +} +subprojects { + project.evaluationDependsOn(':app') + + // Sync Kotlin JVM Target for ALL subprojects (works at task-config time) + tasks.withType(org.jetbrains.kotlin.gradle.tasks.KotlinCompile).configureEach { + kotlinOptions { + jvmTarget = "17" + } + } +} + +// Force Java 17 on plugin subprojects AFTER they set their own defaults. +// Skip :app because it's already evaluated (via evaluationDependsOn) and already configured. +subprojects { sub -> + if (sub.name != 'app') { + sub.afterEvaluate { + if (sub.hasProperty('android')) { + sub.android { + compileOptions { + sourceCompatibility JavaVersion.VERSION_17 + targetCompatibility JavaVersion.VERSION_17 + } + } + } + } + } +} + +tasks.register("clean", Delete) { + delete rootProject.buildDir +} diff --git a/siro_rider/android/gradle.properties b/siro_rider/android/gradle.properties new file mode 100644 index 0000000..67660bc --- /dev/null +++ b/siro_rider/android/gradle.properties @@ -0,0 +1,9 @@ +org.gradle.jvmargs=-Xmx4096M +android.useAndroidX=true +android.enableJetifier=true +android.defaults.buildfeatures.buildconfig=true +android.nonTransitiveRClass=true +android.nonFinalResIds=true +dart.obfuscation=true +android.enableR8.fullMode=true +org.gradle.java.home=/Library/Java/JavaVirtualMachines/temurin-17.jdk/Contents/Home diff --git a/siro_rider/android/gradle/wrapper/gradle-wrapper.properties b/siro_rider/android/gradle/wrapper/gradle-wrapper.properties new file mode 100644 index 0000000..37f853b --- /dev/null +++ b/siro_rider/android/gradle/wrapper/gradle-wrapper.properties @@ -0,0 +1,7 @@ +distributionBase=GRADLE_USER_HOME +distributionPath=wrapper/dists +distributionUrl=https\://services.gradle.org/distributions/gradle-8.13-bin.zip +networkTimeout=10000 +validateDistributionUrl=true +zipStoreBase=GRADLE_USER_HOME +zipStorePath=wrapper/dists diff --git a/siro_rider/android/settings.gradle b/siro_rider/android/settings.gradle new file mode 100644 index 0000000..05abf8b --- /dev/null +++ b/siro_rider/android/settings.gradle @@ -0,0 +1,28 @@ +pluginManagement { + def flutterSdkPath = { + def properties = new Properties() + file("local.properties").withInputStream { properties.load(it) } + def flutterSdkPath = properties.getProperty("flutter.sdk") + assert flutterSdkPath != null, "flutter.sdk not set in local.properties" + return flutterSdkPath + }() + + includeBuild("$flutterSdkPath/packages/flutter_tools/gradle") + + repositories { + google() + mavenCentral() + gradlePluginPortal() + } +} + +plugins { + id "dev.flutter.flutter-plugin-loader" version "1.0.0" + id "com.android.application" version '8.13.0' apply false + // START: FlutterFire Configuration + id "com.google.gms.google-services" version "4.3.10" apply false + // END: FlutterFire Configuration + id "org.jetbrains.kotlin.android" version "2.2.20" apply false +} + +include ":app" diff --git a/siro_rider/assets/fonts/digit.ttf b/siro_rider/assets/fonts/digit.ttf new file mode 100644 index 0000000..5dbe6f9 Binary files /dev/null and b/siro_rider/assets/fonts/digit.ttf differ diff --git a/siro_rider/assets/fonts/josefin.ttf b/siro_rider/assets/fonts/josefin.ttf new file mode 100644 index 0000000..98deb67 Binary files /dev/null and b/siro_rider/assets/fonts/josefin.ttf differ diff --git a/siro_rider/assets/fonts/mohanad.ttf b/siro_rider/assets/fonts/mohanad.ttf new file mode 100644 index 0000000..854341c Binary files /dev/null and b/siro_rider/assets/fonts/mohanad.ttf differ diff --git a/siro_rider/assets/images/2.png b/siro_rider/assets/images/2.png new file mode 100644 index 0000000..7567e84 Binary files /dev/null and b/siro_rider/assets/images/2.png differ diff --git a/siro_rider/assets/images/A.png b/siro_rider/assets/images/A.png new file mode 100644 index 0000000..246b9d2 Binary files /dev/null and b/siro_rider/assets/images/A.png differ diff --git a/siro_rider/assets/images/b.png b/siro_rider/assets/images/b.png new file mode 100644 index 0000000..b22f96c Binary files /dev/null and b/siro_rider/assets/images/b.png differ diff --git a/siro_rider/assets/images/balash.png b/siro_rider/assets/images/balash.png new file mode 100644 index 0000000..84977a2 Binary files /dev/null and b/siro_rider/assets/images/balash.png differ diff --git a/siro_rider/assets/images/blob.png b/siro_rider/assets/images/blob.png new file mode 100644 index 0000000..e45e42c Binary files /dev/null and b/siro_rider/assets/images/blob.png differ diff --git a/siro_rider/assets/images/brand.png b/siro_rider/assets/images/brand.png new file mode 100644 index 0000000..9282720 Binary files /dev/null and b/siro_rider/assets/images/brand.png differ diff --git a/siro_rider/assets/images/bus.png b/siro_rider/assets/images/bus.png new file mode 100644 index 0000000..a1e3958 Binary files /dev/null and b/siro_rider/assets/images/bus.png differ diff --git a/siro_rider/assets/images/car.png b/siro_rider/assets/images/car.png new file mode 100644 index 0000000..b078ecc Binary files /dev/null and b/siro_rider/assets/images/car.png differ diff --git a/siro_rider/assets/images/car3.png b/siro_rider/assets/images/car3.png new file mode 100644 index 0000000..41627ae Binary files /dev/null and b/siro_rider/assets/images/car3.png differ diff --git a/siro_rider/assets/images/carspeed.png b/siro_rider/assets/images/carspeed.png new file mode 100644 index 0000000..b8b2d37 Binary files /dev/null and b/siro_rider/assets/images/carspeed.png differ diff --git a/siro_rider/assets/images/cashMTN.png b/siro_rider/assets/images/cashMTN.png new file mode 100644 index 0000000..bae958b Binary files /dev/null and b/siro_rider/assets/images/cashMTN.png differ diff --git a/siro_rider/assets/images/education.png b/siro_rider/assets/images/education.png new file mode 100644 index 0000000..fcadd1b Binary files /dev/null and b/siro_rider/assets/images/education.png differ diff --git a/siro_rider/assets/images/electric.png b/siro_rider/assets/images/electric.png new file mode 100644 index 0000000..b2889b8 Binary files /dev/null and b/siro_rider/assets/images/electric.png differ diff --git a/siro_rider/assets/images/electric_car.jpg b/siro_rider/assets/images/electric_car.jpg new file mode 100644 index 0000000..b57b770 Binary files /dev/null and b/siro_rider/assets/images/electric_car.jpg differ diff --git a/siro_rider/assets/images/employmentType.png b/siro_rider/assets/images/employmentType.png new file mode 100644 index 0000000..8fdcf14 Binary files /dev/null and b/siro_rider/assets/images/employmentType.png differ diff --git a/siro_rider/assets/images/freeRide.png b/siro_rider/assets/images/freeRide.png new file mode 100644 index 0000000..0667d42 Binary files /dev/null and b/siro_rider/assets/images/freeRide.png differ diff --git a/siro_rider/assets/images/gender.png b/siro_rider/assets/images/gender.png new file mode 100644 index 0000000..134dccb Binary files /dev/null and b/siro_rider/assets/images/gender.png differ diff --git a/siro_rider/assets/images/jeep.png b/siro_rider/assets/images/jeep.png new file mode 100644 index 0000000..8f1cbf3 Binary files /dev/null and b/siro_rider/assets/images/jeep.png differ diff --git a/siro_rider/assets/images/lady.png b/siro_rider/assets/images/lady.png new file mode 100644 index 0000000..76277fe Binary files /dev/null and b/siro_rider/assets/images/lady.png differ diff --git a/siro_rider/assets/images/lady1.png b/siro_rider/assets/images/lady1.png new file mode 100644 index 0000000..2797b75 Binary files /dev/null and b/siro_rider/assets/images/lady1.png differ diff --git a/siro_rider/assets/images/logo.gif b/siro_rider/assets/images/logo.gif new file mode 100644 index 0000000..6bb621e Binary files /dev/null and b/siro_rider/assets/images/logo.gif differ diff --git a/siro_rider/assets/images/logo.png b/siro_rider/assets/images/logo.png new file mode 100644 index 0000000..e9e88cf Binary files /dev/null and b/siro_rider/assets/images/logo.png differ diff --git a/siro_rider/assets/images/maritalStatus.png b/siro_rider/assets/images/maritalStatus.png new file mode 100644 index 0000000..121d555 Binary files /dev/null and b/siro_rider/assets/images/maritalStatus.png differ diff --git a/siro_rider/assets/images/moto.png b/siro_rider/assets/images/moto.png new file mode 100644 index 0000000..8257812 Binary files /dev/null and b/siro_rider/assets/images/moto.png differ diff --git a/siro_rider/assets/images/moto1.png b/siro_rider/assets/images/moto1.png new file mode 100644 index 0000000..80322db Binary files /dev/null and b/siro_rider/assets/images/moto1.png differ diff --git a/siro_rider/assets/images/mtn.png b/siro_rider/assets/images/mtn.png new file mode 100644 index 0000000..6aa6618 Binary files /dev/null and b/siro_rider/assets/images/mtn.png differ diff --git a/siro_rider/assets/images/notepad.png b/siro_rider/assets/images/notepad.png new file mode 100644 index 0000000..9536a4d Binary files /dev/null and b/siro_rider/assets/images/notepad.png differ diff --git a/siro_rider/assets/images/on1.png b/siro_rider/assets/images/on1.png new file mode 100644 index 0000000..4f75853 Binary files /dev/null and b/siro_rider/assets/images/on1.png differ diff --git a/siro_rider/assets/images/on2.png b/siro_rider/assets/images/on2.png new file mode 100644 index 0000000..83b4e38 Binary files /dev/null and b/siro_rider/assets/images/on2.png differ diff --git a/siro_rider/assets/images/on3.png b/siro_rider/assets/images/on3.png new file mode 100644 index 0000000..3fe9574 Binary files /dev/null and b/siro_rider/assets/images/on3.png differ diff --git a/siro_rider/assets/images/picker.png b/siro_rider/assets/images/picker.png new file mode 100644 index 0000000..6a35bf3 Binary files /dev/null and b/siro_rider/assets/images/picker.png differ diff --git a/siro_rider/assets/images/pinkBike.png b/siro_rider/assets/images/pinkBike.png new file mode 100644 index 0000000..0ed4ec5 Binary files /dev/null and b/siro_rider/assets/images/pinkBike.png differ diff --git a/siro_rider/assets/images/roundtrip.png b/siro_rider/assets/images/roundtrip.png new file mode 100644 index 0000000..c6088ba Binary files /dev/null and b/siro_rider/assets/images/roundtrip.png differ diff --git a/siro_rider/assets/images/sedan.png b/siro_rider/assets/images/sedan.png new file mode 100644 index 0000000..c69e86d Binary files /dev/null and b/siro_rider/assets/images/sedan.png differ diff --git a/siro_rider/assets/images/shamCash.png b/siro_rider/assets/images/shamCash.png new file mode 100644 index 0000000..ab13ac0 Binary files /dev/null and b/siro_rider/assets/images/shamCash.png differ diff --git a/siro_rider/assets/images/shamcashsend.png b/siro_rider/assets/images/shamcashsend.png new file mode 100644 index 0000000..0814517 Binary files /dev/null and b/siro_rider/assets/images/shamcashsend.png differ diff --git a/siro_rider/assets/images/syriatel.png b/siro_rider/assets/images/syriatel.png new file mode 100644 index 0000000..2facd27 Binary files /dev/null and b/siro_rider/assets/images/syriatel.png differ diff --git a/siro_rider/assets/start.wav b/siro_rider/assets/start.wav new file mode 100644 index 0000000..0655506 Binary files /dev/null and b/siro_rider/assets/start.wav differ diff --git a/siro_rider/assets/style.json b/siro_rider/assets/style.json new file mode 100644 index 0000000..644d44d --- /dev/null +++ b/siro_rider/assets/style.json @@ -0,0 +1,2178 @@ +{ + "version": 8, + "name": "Intaleq Premium — Light v2.9", + "metadata": { + "brand": "Intaleq", + "version": "2.10.0-light", + "description": "Intaleq light theme — buildings at close zoom only, on-road labels, improved arrows" + }, + "center": [ + 36.276008, + 33.513685 + ], + "zoom": 15, + "glyphs": "https://cdn.protomaps.com/fonts/pbf/{fontstack}/{range}.pbf", + "sprite": "https://demotiles.maplibre.org/styles/osm-bright-gl-style/sprite", + "sources": { + "local-osm-polygons": { + "type": "vector", + "tiles": [ + "https://tiles.intaleqapp.com/planet_osm_polygon/{z}/{x}/{y}" + ], + "maxzoom": 14, + "attribution": "© Intaleq | © OpenStreetMap contributors" + }, + "local-osm-lines": { + "type": "vector", + "tiles": [ + "https://tiles.intaleqapp.com/planet_osm_line/{z}/{x}/{y}" + ], + "maxzoom": 14 + }, + "local-osm-points": { + "type": "vector", + "tiles": [ + "https://tiles.intaleqapp.com/planet_osm_point/{z}/{x}/{y}" + ], + "maxzoom": 14 + }, + "places_egypt": { + "type": "vector", + "tiles": [ + "https://tiles.intaleqapp.com/places_egypt/{z}/{x}/{y}" + ], + "maxzoom": 14 + }, + "places_syria": { + "type": "vector", + "tiles": [ + "https://tiles.intaleqapp.com/places_syria/{z}/{x}/{y}" + ], + "maxzoom": 14 + }, + "places_jordan": { + "type": "vector", + "tiles": [ + "https://tiles.intaleqapp.com/places_jordan/{z}/{x}/{y}" + ], + "maxzoom": 14 + }, + "overture_buildings": { + "type": "vector", + "tiles": [ + "https://tiles.intaleqapp.com/overture_building/{z}/{x}/{y}" + ], + "maxzoom": 14 + }, + "overture_segments": { + "type": "vector", + "tiles": [ + "https://tiles.intaleqapp.com/overture_segment/{z}/{x}/{y}" + ], + "maxzoom": 14 + } + }, + "layers": [ + { + "id": "background", + "type": "background", + "paint": { + "background-color": "#EEF2F7" + } + }, + { + "id": "landuse-residential", + "type": "fill", + "source": "local-osm-polygons", + "source-layer": "planet_osm_polygon", + "filter": [ + "==", + "landuse", + "residential" + ], + "paint": { + "fill-color": "#F0F4F8", + "fill-opacity": 1.0 + } + }, + { + "id": "landuse-commercial", + "type": "fill", + "source": "local-osm-polygons", + "source-layer": "planet_osm_polygon", + "filter": [ + "==", + "landuse", + "commercial" + ], + "paint": { + "fill-color": "#FAF5EE", + "fill-opacity": 1.0 + } + }, + { + "id": "landuse-cemetery", + "type": "fill", + "source": "local-osm-polygons", + "source-layer": "planet_osm_polygon", + "filter": [ + "==", + "landuse", + "cemetery" + ], + "paint": { + "fill-color": "#B8D4BA", + "fill-opacity": 1.0 + } + }, + { + "id": "landuse-military", + "type": "fill", + "source": "local-osm-polygons", + "source-layer": "planet_osm_polygon", + "filter": [ + "==", + "landuse", + "military" + ], + "paint": { + "fill-color": "#E2D9CC", + "fill-opacity": 1.0 + } + }, + { + "id": "landuse-industrial", + "type": "fill", + "source": "local-osm-polygons", + "source-layer": "planet_osm_polygon", + "filter": [ + "in", + "landuse", + "industrial", + "railway" + ], + "paint": { + "fill-color": "#E4E8EE", + "fill-opacity": 1 + } + }, + { + "id": "park-layer", + "type": "fill", + "source": "local-osm-polygons", + "source-layer": "planet_osm_polygon", + "filter": [ + "any", + [ + "in", + "leisure", + "park", + "garden", + "nature_reserve", + "pitch", + "playground" + ], + [ + "in", + "landuse", + "grass", + "meadow", + "forest" + ], + [ + "in", + "natural", + "wood", + "scrub", + "heath" + ] + ], + "paint": { + "fill-color": [ + "match", + [ + "get", + "leisure" + ], + "pitch", + "#9ED4A0", + "playground", + "#B8E6B8", + "#C5E8C5" + ], + "fill-opacity": 0.85 + } + }, + { + "id": "park-outline", + "type": "line", + "source": "local-osm-polygons", + "source-layer": "planet_osm_polygon", + "filter": [ + "in", + "leisure", + "park", + "garden", + "nature_reserve" + ], + "paint": { + "line-color": "#9ED4A0", + "line-width": 0.8, + "line-opacity": 0.6 + } + }, + { + "id": "water-polygon", + "type": "fill", + "source": "local-osm-polygons", + "source-layer": "planet_osm_polygon", + "filter": [ + "any", + [ + "in", + "natural", + "water", + "lake", + "bay" + ], + [ + "==", + "waterway", + "riverbank" + ], + [ + "in", + "landuse", + "basin", + "reservoir" + ], + [ + "==", + "amenity", + "fountain" + ] + ], + "paint": { + "fill-color": "#9ECFE8", + "fill-opacity": 0.95 + } + }, + { + "id": "water-polygon-outline", + "type": "line", + "source": "local-osm-polygons", + "source-layer": "planet_osm_polygon", + "filter": [ + "any", + [ + "in", + "natural", + "water", + "lake", + "bay" + ], + [ + "==", + "waterway", + "riverbank" + ], + [ + "in", + "landuse", + "basin", + "reservoir" + ] + ], + "paint": { + "line-color": "#6BB8D8", + "line-width": 0.8, + "line-opacity": 0.8 + } + }, + { + "id": "waterway-river", + "type": "line", + "source": "local-osm-lines", + "source-layer": "planet_osm_line", + "filter": [ + "all", + [ + "in", + "waterway", + "river", + "canal" + ], + [ + "!=", + "intermittent", + "yes" + ], + [ + "!=", + "seasonal", + "yes" + ], + [ + "!=", + "tunnel", + "yes" + ] + ], + "paint": { + "line-color": "#6BB8D8", + "line-width": [ + "interpolate", + [ + "linear" + ], + [ + "zoom" + ], + 10, + 1.5, + 14, + 4, + 16, + 7 + ], + "line-opacity": 0.95 + } + }, + { + "id": "waterway-stream-drain", + "type": "line", + "source": "local-osm-lines", + "source-layer": "planet_osm_line", + "filter": [ + "all", + [ + "in", + "waterway", + "stream", + "drain", + "ditch" + ], + [ + "!=", + "intermittent", + "yes" + ], + [ + "!=", + "seasonal", + "yes" + ], + [ + "!=", + "tunnel", + "yes" + ] + ], + "minzoom": 13, + "paint": { + "line-color": "#7FBFD8", + "line-width": [ + "interpolate", + [ + "linear" + ], + [ + "zoom" + ], + 13, + 0.8, + 16, + 2.5 + ], + "line-opacity": 0.85 + } + }, + { + "id": "railway-area", + "type": "fill", + "source": "local-osm-polygons", + "source-layer": "planet_osm_polygon", + "filter": [ + "==", + "landuse", + "railway" + ], + "paint": { + "fill-color": "#DDE2EA", + "fill-opacity": 0.9 + } + }, + { + "id": "railway-rail-casing", + "type": "line", + "source": "local-osm-lines", + "source-layer": "planet_osm_line", + "filter": [ + "all", + [ + "in", + "railway", + "rail", + "narrow_gauge", + "preserved" + ], + [ + "!=", + "service", + "yard" + ], + [ + "!=", + "service", + "siding" + ] + ], + "minzoom": 8, + "paint": { + "line-color": "#B0B8C5", + "line-width": [ + "interpolate", + [ + "linear" + ], + [ + "zoom" + ], + 8, + 2, + 12, + 4, + 16, + 8 + ] + } + }, + { + "id": "railway-rail-core", + "type": "line", + "source": "local-osm-lines", + "source-layer": "planet_osm_line", + "filter": [ + "all", + [ + "in", + "railway", + "rail", + "narrow_gauge", + "preserved" + ], + [ + "!=", + "service", + "yard" + ], + [ + "!=", + "service", + "siding" + ] + ], + "minzoom": 8, + "paint": { + "line-color": "#6B7A8E", + "line-width": [ + "interpolate", + [ + "linear" + ], + [ + "zoom" + ], + 8, + 1, + 12, + 2.5, + 16, + 5 + ], + "line-dasharray": [ + 6, + 4 + ] + } + }, + { + "id": "railway-subway-casing", + "type": "line", + "source": "local-osm-lines", + "source-layer": "planet_osm_line", + "filter": [ + "in", + "railway", + "subway", + "light_rail", + "tram", + "monorail" + ], + "minzoom": 10, + "paint": { + "line-color": [ + "match", + [ + "get", + "railway" + ], + "subway", + "#CC2233", + "light_rail", + "#0066CC", + "tram", + "#8833BB", + "monorail", + "#008855", + "#BB3344" + ], + "line-width": [ + "interpolate", + [ + "linear" + ], + [ + "zoom" + ], + 10, + 3, + 14, + 6, + 16, + 10 + ] + } + }, + { + "id": "railway-subway-core", + "type": "line", + "source": "local-osm-lines", + "source-layer": "planet_osm_line", + "filter": [ + "in", + "railway", + "subway", + "light_rail", + "tram", + "monorail" + ], + "minzoom": 10, + "paint": { + "line-color": [ + "match", + [ + "get", + "railway" + ], + "subway", + "#FF3347", + "light_rail", + "#2288FF", + "tram", + "#AA44EE", + "monorail", + "#00BB66", + "#FF4455" + ], + "line-width": [ + "interpolate", + [ + "linear" + ], + [ + "zoom" + ], + 10, + 1.5, + 14, + 3.5, + 16, + 6 + ] + } + }, + { + "id": "road-casing-track-path", + "type": "line", + "source": "local-osm-lines", + "source-layer": "planet_osm_line", + "filter": [ + "in", + "highway", + "track", + "path", + "footway", + "cycleway", + "steps" + ], + "minzoom": 14, + "paint": { + "line-color": "#D4D8DF", + "line-width": [ + "interpolate", + [ + "linear" + ], + [ + "zoom" + ], + 14, + 1, + 16, + 4 + ], + "line-dasharray": [ + 4, + 3 + ] + } + }, + { + "id": "road-casing-minor", + "type": "line", + "source": "local-osm-lines", + "source-layer": "planet_osm_line", + "filter": [ + "in", + "highway", + "residential", + "service", + "unclassified", + "living_street", + "pedestrian" + ], + "paint": { + "line-color": "#D4D8DF", + "line-width": [ + "interpolate", + [ + "linear" + ], + [ + "zoom" + ], + 12, + 1.5, + 16, + 10 + ], + "line-opacity": 0.7 + } + }, + { + "id": "road-core-minor", + "type": "line", + "source": "local-osm-lines", + "source-layer": "planet_osm_line", + "filter": [ + "in", + "highway", + "residential", + "service", + "unclassified", + "living_street", + "pedestrian" + ], + "paint": { + "line-color": "#FFFFFF", + "line-width": [ + "interpolate", + [ + "linear" + ], + [ + "zoom" + ], + 12, + 0.8, + 16, + 8 + ] + } + }, + { + "id": "road-casing-tertiary", + "type": "line", + "source": "local-osm-lines", + "source-layer": "planet_osm_line", + "filter": [ + "in", + "highway", + "tertiary", + "tertiary_link" + ], + "paint": { + "line-color": "#C9CED8", + "line-width": [ + "interpolate", + [ + "linear" + ], + [ + "zoom" + ], + 11, + 2, + 16, + 14 + ], + "line-opacity": 0.75 + } + }, + { + "id": "road-core-tertiary", + "type": "line", + "source": "local-osm-lines", + "source-layer": "planet_osm_line", + "filter": [ + "in", + "highway", + "tertiary", + "tertiary_link" + ], + "paint": { + "line-color": "#FFFFFF", + "line-width": [ + "interpolate", + [ + "linear" + ], + [ + "zoom" + ], + 11, + 1.2, + 16, + 11 + ] + } + }, + { + "id": "road-casing-secondary", + "type": "line", + "source": "local-osm-lines", + "source-layer": "planet_osm_line", + "filter": [ + "in", + "highway", + "secondary", + "secondary_link" + ], + "paint": { + "line-color": "#C4CFDE", + "line-width": [ + "interpolate", + [ + "linear" + ], + [ + "zoom" + ], + 11, + 2.5, + 16, + 16 + ], + "line-opacity": 0.8 + } + }, + { + "id": "road-core-secondary", + "type": "line", + "source": "local-osm-lines", + "source-layer": "planet_osm_line", + "filter": [ + "in", + "highway", + "secondary", + "secondary_link" + ], + "paint": { + "line-color": "#F8FBFF", + "line-width": [ + "interpolate", + [ + "linear" + ], + [ + "zoom" + ], + 11, + 1.8, + 16, + 13 + ] + } + }, + { + "id": "road-casing-primary", + "type": "line", + "source": "local-osm-lines", + "source-layer": "planet_osm_line", + "filter": [ + "in", + "highway", + "primary", + "primary_link" + ], + "paint": { + "line-color": "#C8B868", + "line-width": [ + "interpolate", + [ + "linear" + ], + [ + "zoom" + ], + 10, + 3, + 16, + 18 + ], + "line-opacity": 0.7 + } + }, + { + "id": "road-core-primary", + "type": "line", + "source": "local-osm-lines", + "source-layer": "planet_osm_line", + "filter": [ + "in", + "highway", + "primary", + "primary_link" + ], + "paint": { + "line-color": "#EDD870", + "line-width": [ + "interpolate", + [ + "linear" + ], + [ + "zoom" + ], + 10, + 2, + 16, + 14 + ] + } + }, + { + "id": "road-casing-motorway", + "type": "line", + "source": "local-osm-lines", + "source-layer": "planet_osm_line", + "filter": [ + "in", + "highway", + "motorway", + "motorway_link", + "trunk", + "trunk_link" + ], + "paint": { + "line-color": "#C8A84B", + "line-width": [ + "interpolate", + [ + "linear" + ], + [ + "zoom" + ], + 9, + 4, + 16, + 20 + ], + "line-opacity": 0.75 + } + }, + { + "id": "road-core-motorway", + "type": "line", + "source": "local-osm-lines", + "source-layer": "planet_osm_line", + "filter": [ + "in", + "highway", + "motorway", + "motorway_link", + "trunk", + "trunk_link" + ], + "paint": { + "line-color": "#F0C040", + "line-width": [ + "interpolate", + [ + "linear" + ], + [ + "zoom" + ], + 9, + 2.5, + 16, + 16 + ] + } + }, + { + "id": "road-direction-arrows", + "type": "symbol", + "source": "local-osm-lines", + "source-layer": "planet_osm_line", + "minzoom": 15, + "filter": [ + "all", + [ + "in", + "highway", + "motorway", + "trunk", + "primary", + "secondary", + "tertiary", + "residential", + "unclassified", + "living_street" + ], + [ + "==", + "oneway", + "yes" + ] + ], + "layout": { + "symbol-placement": "line", + "symbol-spacing": 120, + "text-field": "→", + "text-font": [ + "Noto Sans Regular" + ], + "text-size": [ + "interpolate", + [ + "linear" + ], + [ + "zoom" + ], + 15, + 16, + 17, + 22, + 19, + 28 + ], + "text-keep-upright": false, + "text-rotation-alignment": "map", + "text-pitch-alignment": "viewport", + "text-allow-overlap": true, + "text-ignore-placement": true, + "text-padding": 0, + "text-letter-spacing": -0.1 + }, + "paint": { + "text-color": "rgba(80,96,120,0.55)", + "text-halo-color": "rgba(255,255,255,0.25)", + "text-halo-width": 1 + } + }, + { + "id": "building-fill-flat", + "type": "fill", + "source": "local-osm-polygons", + "source-layer": "planet_osm_polygon", + "filter": [ + "has", + "building" + ], + "minzoom": 15, + "maxzoom": 16, + "paint": { + "fill-color": "#DDD8D0", + "fill-opacity": 0.85, + "fill-outline-color": "#C4BEB4" + } + }, + { + "id": "building-3d", + "type": "fill-extrusion", + "source": "local-osm-polygons", + "source-layer": "planet_osm_polygon", + "minzoom": 16, + "filter": [ + "has", + "building" + ], + "paint": { + "fill-extrusion-color": "#DDD8D0", + "fill-extrusion-height": [ + "coalesce", + [ + "to-number", + [ + "get", + "height" + ] + ], + [ + "*", + [ + "to-number", + [ + "get", + "building:levels" + ], + 2 + ], + 3.5 + ], + 7 + ], + "fill-extrusion-base": [ + "coalesce", + [ + "to-number", + [ + "get", + "min_height" + ] + ], + 0 + ], + "fill-extrusion-opacity": 0.8, + "fill-extrusion-vertical-gradient": true + } + }, + { + "id": "building-3d-overture", + "type": "fill-extrusion", + "source": "overture_buildings", + "source-layer": "overture_building", + "minzoom": 16, + "paint": { + "fill-extrusion-color": [ + "match", + [ + "get", + "subtype" + ], + "commercial", + "#D8D0C0", + "retail", + "#E0D0B8", + "industrial", + "#C8D0DC", + "religious", + "#C8D4EC", + "education", + "#D4E0C4", + "medical", + "#E8D4D4", + "#DDD8D0" + ], + "fill-extrusion-height": [ + "interpolate", + [ + "linear" + ], + [ + "zoom" + ], + 16, + [ + "coalesce", + [ + "to-number", + [ + "get", + "height" + ] + ], + [ + "*", + [ + "coalesce", + [ + "to-number", + [ + "get", + "num_floors" + ] + ], + 3 + ], + 3.5 + ], + 9 + ], + 18, + [ + "coalesce", + [ + "to-number", + [ + "get", + "height" + ] + ], + [ + "*", + [ + "coalesce", + [ + "to-number", + [ + "get", + "num_floors" + ] + ], + 3 + ], + 3.5 + ], + 12 + ] + ], + "fill-extrusion-base": [ + "coalesce", + [ + "to-number", + [ + "get", + "min_height" + ] + ], + 0 + ], + "fill-extrusion-opacity": [ + "interpolate", + [ + "linear" + ], + [ + "zoom" + ], + 15, + 0, + 16, + 0.6, + 17, + 0.88 + ], + "fill-extrusion-vertical-gradient": true + } + }, + { + "id": "overture-building-footprint", + "type": "fill", + "source": "overture_buildings", + "source-layer": "overture_building", + "minzoom": 15, + "maxzoom": 16, + "paint": { + "fill-color": "#DDD8D0", + "fill-opacity": 0.82, + "fill-outline-color": "#C4BEB4" + } + }, + { + "id": "railway-label", + "type": "symbol", + "source": "local-osm-lines", + "source-layer": "planet_osm_line", + "filter": [ + "in", + "railway", + "rail", + "subway", + "light_rail", + "tram" + ], + "minzoom": 13, + "layout": { + "text-field": [ + "coalesce", + [ + "get", + "name:ar" + ], + [ + "get", + "name" + ], + "" + ], + "text-font": [ + "Noto Sans Regular" + ], + "text-size": 10, + "symbol-placement": "line", + "text-padding": 6, + "text-allow-overlap": false + }, + "paint": { + "text-color": [ + "match", + [ + "get", + "railway" + ], + "subway", + "#CC2233", + "light_rail", + "#0055BB", + "tram", + "#7722AA", + "#4A5568" + ], + "text-halo-color": "rgba(255,255,255,0.93)", + "text-halo-width": 2 + } + }, + { + "id": "waterway-label", + "type": "symbol", + "source": "local-osm-lines", + "source-layer": "planet_osm_line", + "filter": [ + "all", + [ + "in", + "waterway", + "river", + "canal" + ], + [ + "!=", + "intermittent", + "yes" + ], + [ + "has", + "name" + ] + ], + "minzoom": 12, + "layout": { + "text-field": [ + "coalesce", + [ + "get", + "name:ar" + ], + [ + "get", + "name" + ], + "" + ], + "text-font": [ + "Noto Sans Regular" + ], + "text-size": 11, + "symbol-placement": "line", + "text-letter-spacing": 0.1 + }, + "paint": { + "text-color": "#2E86AB", + "text-halo-color": "rgba(255,255,255,0.93)", + "text-halo-width": 2 + } + }, + { + "id": "building-number-polygon", + "type": "symbol", + "source": "local-osm-polygons", + "source-layer": "planet_osm_polygon", + "minzoom": 17, + "filter": [ + "has", + "addr:housenumber" + ], + "layout": { + "text-field": "{addr:housenumber}", + "text-font": [ + "Noto Sans Regular" + ], + "text-size": 10, + "text-allow-overlap": false + }, + "paint": { + "text-color": "#5A5048", + "text-halo-color": "rgba(255,255,255,0.93)", + "text-halo-width": 1.5 + } + }, + { + "id": "building-number-point", + "type": "symbol", + "source": "local-osm-points", + "source-layer": "planet_osm_point", + "minzoom": 17, + "filter": [ + "has", + "addr:housenumber" + ], + "layout": { + "text-field": "{addr:housenumber}", + "text-font": [ + "Noto Sans Regular" + ], + "text-size": 10, + "text-allow-overlap": false + }, + "paint": { + "text-color": "#5A5048", + "text-halo-color": "rgba(255,255,255,0.93)", + "text-halo-width": 1.5 + } + }, + { + "id": "overture-building-names", + "type": "symbol", + "source": "overture_buildings", + "source-layer": "overture_building", + "minzoom": 17, + "filter": [ + "has", + "names" + ], + "layout": { + "text-field": [ + "coalesce", + [ + "get", + "names" + ], + "" + ], + "text-font": [ + "Noto Sans Regular" + ], + "text-size": 10, + "text-anchor": "center", + "text-allow-overlap": false, + "text-max-width": 8 + }, + "paint": { + "text-color": "#5A5048", + "text-halo-color": "rgba(255,255,255,0.93)", + "text-halo-width": 1.5 + } + }, + { + "id": "road-labels-minor", + "type": "symbol", + "source": "local-osm-lines", + "source-layer": "planet_osm_line", + "filter": [ + "in", + "highway", + "residential", + "service", + "unclassified", + "living_street" + ], + "minzoom": 16, + "layout": { + "text-field": [ + "coalesce", + [ + "get", + "name:ar" + ], + [ + "get", + "name" + ], + "" + ], + "text-font": [ + "Noto Sans Regular" + ], + "text-size": [ + "interpolate", + [ + "linear" + ], + [ + "zoom" + ], + 16, + 10, + 18, + 13 + ], + "symbol-placement": "line", + "text-rotation-alignment": "map", + "text-pitch-alignment": "viewport", + "text-keep-upright": true, + "text-max-angle": 25, + "symbol-spacing": 300, + "text-letter-spacing": 0.04, + "text-padding": 8, + "text-allow-overlap": false + }, + "paint": { + "text-color": "#4A5568", + "text-halo-color": "rgba(255,255,255,0.93)", + "text-halo-width": 1.8 + } + }, + { + "id": "road-labels-major", + "type": "symbol", + "source": "local-osm-lines", + "source-layer": "planet_osm_line", + "filter": [ + "in", + "highway", + "primary", + "secondary", + "tertiary", + "motorway", + "trunk" + ], + "minzoom": 12, + "layout": { + "text-field": [ + "coalesce", + [ + "get", + "name:ar" + ], + [ + "get", + "name" + ], + "" + ], + "text-font": [ + "Noto Sans Bold" + ], + "text-size": [ + "interpolate", + [ + "linear" + ], + [ + "zoom" + ], + 12, + 10, + 14, + 13, + 18, + 16 + ], + "symbol-placement": "line", + "text-rotation-alignment": "map", + "text-pitch-alignment": "viewport", + "text-keep-upright": true, + "text-max-angle": 22, + "symbol-spacing": 350, + "text-letter-spacing": 0.05, + "text-padding": 12, + "text-allow-overlap": false + }, + "paint": { + "text-color": "#1A2332", + "text-halo-color": "rgba(255,255,255,0.93)", + "text-halo-width": 2.5 + } + }, + { + "id": "overture-street-names", + "type": "symbol", + "source": "overture_segments", + "source-layer": "overture_segment", + "minzoom": 14, + "filter": [ + "has", + "names" + ], + "layout": { + "text-field": [ + "coalesce", + [ + "get", + "names" + ], + "" + ], + "text-font": [ + "Noto Sans Regular" + ], + "text-size": [ + "interpolate", + [ + "linear" + ], + [ + "zoom" + ], + 14, + 9, + 16, + 12, + 18, + 14 + ], + "symbol-placement": "line", + "text-rotation-alignment": "map", + "text-pitch-alignment": "viewport", + "text-keep-upright": true, + "text-max-angle": 28, + "symbol-spacing": 280, + "text-letter-spacing": 0.04, + "text-padding": 15, + "text-allow-overlap": false + }, + "paint": { + "text-color": "#4A5568", + "text-halo-color": "rgba(255,255,255,0.93)", + "text-halo-width": 2 + } + }, + { + "id": "poi-hospital", + "type": "symbol", + "source": "local-osm-points", + "source-layer": "planet_osm_point", + "minzoom": 13, + "filter": [ + "==", + "amenity", + "hospital" + ], + "layout": { + "icon-image": "hospital", + "icon-size": 1.0, + "text-field": [ + "coalesce", + [ + "get", + "name:ar" + ], + [ + "get", + "name" + ], + "" + ], + "text-font": [ + "Noto Sans Regular" + ], + "text-size": 11, + "text-offset": [ + 0, + 1.2 + ], + "text-anchor": "top", + "text-allow-overlap": false + }, + "paint": { + "text-color": "#C0392B", + "text-halo-color": "rgba(255,255,255,0.93)", + "text-halo-width": 2 + } + }, + { + "id": "poi-pharmacy", + "type": "symbol", + "source": "local-osm-points", + "source-layer": "planet_osm_point", + "minzoom": 15, + "filter": [ + "==", + "amenity", + "pharmacy" + ], + "layout": { + "icon-image": "pharmacy", + "icon-size": 0.8, + "text-field": [ + "coalesce", + [ + "get", + "name:ar" + ], + [ + "get", + "name" + ], + "" + ], + "text-font": [ + "Noto Sans Regular" + ], + "text-size": 11, + "text-offset": [ + 0, + 1.2 + ], + "text-anchor": "top", + "text-allow-overlap": false + }, + "paint": { + "text-color": "#1A7A3C", + "text-halo-color": "rgba(255,255,255,0.93)", + "text-halo-width": 2 + } + }, + { + "id": "poi-place-of-worship", + "type": "symbol", + "source": "local-osm-points", + "source-layer": "planet_osm_point", + "minzoom": 14, + "filter": [ + "==", + "amenity", + "place_of_worship" + ], + "layout": { + "icon-image": "tourist", + "icon-size": 0.8, + "text-field": [ + "coalesce", + [ + "get", + "name:ar" + ], + [ + "get", + "name" + ], + "" + ], + "text-font": [ + "Noto Sans Regular" + ], + "text-size": 11, + "text-offset": [ + 0, + 1.2 + ], + "text-anchor": "top", + "text-allow-overlap": false + }, + "paint": { + "text-color": "#1A6B3A", + "text-halo-color": "rgba(255,255,255,0.93)", + "text-halo-width": 2 + } + }, + { + "id": "poi-school", + "type": "symbol", + "source": "local-osm-points", + "source-layer": "planet_osm_point", + "minzoom": 14, + "filter": [ + "in", + "amenity", + "school", + "university", + "college" + ], + "layout": { + "icon-image": "college", + "icon-size": 0.8, + "text-field": [ + "coalesce", + [ + "get", + "name:ar" + ], + [ + "get", + "name" + ], + "" + ], + "text-font": [ + "Noto Sans Regular" + ], + "text-size": 11, + "text-offset": [ + 0, + 1.2 + ], + "text-anchor": "top", + "text-allow-overlap": false + }, + "paint": { + "text-color": "#5A4A8A", + "text-halo-color": "rgba(255,255,255,0.93)", + "text-halo-width": 2 + } + }, + { + "id": "poi-restaurant-cafe", + "type": "symbol", + "source": "local-osm-points", + "source-layer": "planet_osm_point", + "minzoom": 16, + "filter": [ + "in", + "amenity", + "restaurant", + "cafe", + "fast_food" + ], + "layout": { + "icon-image": [ + "match", + [ + "get", + "amenity" + ], + "cafe", + "cafe", + "restaurant" + ], + "icon-size": 0.8, + "text-field": [ + "coalesce", + [ + "get", + "name:ar" + ], + [ + "get", + "name" + ], + "" + ], + "text-font": [ + "Noto Sans Regular" + ], + "text-size": 10, + "text-offset": [ + 0, + 1.2 + ], + "text-anchor": "top" + }, + "paint": { + "text-color": "#3D4A5C", + "text-halo-color": "rgba(255,255,255,0.93)", + "text-halo-width": 1.5 + } + }, + { + "id": "poi-transit-station", + "type": "symbol", + "source": "local-osm-points", + "source-layer": "planet_osm_point", + "minzoom": 12, + "filter": [ + "any", + [ + "==", + "railway", + "station" + ], + [ + "==", + "railway", + "halt" + ], + [ + "==", + "railway", + "tram_stop" + ], + [ + "==", + "station", + "subway" + ], + [ + "==", + "amenity", + "bus_station" + ] + ], + "layout": { + "icon-image": "rail", + "icon-size": 1, + "text-field": [ + "coalesce", + [ + "get", + "name:ar" + ], + [ + "get", + "name" + ], + "" + ], + "text-font": [ + "Noto Sans Regular" + ], + "text-size": 11, + "text-offset": [ + 0, + 1.4 + ], + "text-anchor": "top", + "text-allow-overlap": false + }, + "paint": { + "text-color": "#CC2233", + "text-halo-color": "rgba(255,255,255,0.93)", + "text-halo-width": 2 + } + }, + { + "id": "place-labels-area", + "type": "symbol", + "source": "local-osm-polygons", + "source-layer": "planet_osm_polygon", + "minzoom": 10, + "filter": [ + "has", + "name" + ], + "layout": { + "text-field": [ + "coalesce", + [ + "get", + "name:ar" + ], + [ + "get", + "name" + ], + "" + ], + "text-font": [ + "Noto Sans Regular" + ], + "text-size": [ + "interpolate", + [ + "linear" + ], + [ + "zoom" + ], + 10, + 10, + 14, + 13 + ], + "text-padding": 8, + "text-allow-overlap": false + }, + "paint": { + "text-color": "#34495E", + "text-halo-color": "rgba(255,255,255,0.93)", + "text-halo-width": 2 + } + }, + { + "id": "place-labels-point", + "type": "symbol", + "source": "local-osm-points", + "source-layer": "planet_osm_point", + "minzoom": 10, + "filter": [ + "any", + [ + "in", + "place", + "city", + "town", + "village", + "suburb", + "neighbourhood", + "hamlet", + "locality", + "quarter" + ], + [ + "in", + "natural", + "peak", + "spring" + ] + ], + "layout": { + "text-field": [ + "coalesce", + [ + "get", + "name:ar" + ], + [ + "get", + "name" + ], + "" + ], + "text-font": [ + "Noto Sans Regular" + ], + "text-size": [ + "interpolate", + [ + "linear" + ], + [ + "zoom" + ], + 10, + [ + "match", + [ + "get", + "place" + ], + "city", + 16, + "town", + 14, + 11 + ], + 14, + [ + "match", + [ + "get", + "place" + ], + "city", + 20, + "town", + 16, + 13 + ], + 17, + 14 + ], + "text-letter-spacing": [ + "match", + [ + "get", + "place" + ], + "city", + 0.08, + "town", + 0.05, + 0.02 + ], + "text-anchor": "center", + "text-padding": 10, + "text-allow-overlap": false + }, + "paint": { + "text-color": [ + "match", + [ + "get", + "place" + ], + "city", + "#1A2740", + "town", + "#2C3E50", + "suburb", + "#34495E", + "neighbourhood", + "#34495E", + "#34495E" + ], + "text-halo-color": "rgba(255,255,255,0.93)", + "text-halo-width": [ + "match", + [ + "get", + "place" + ], + "city", + 3, + "town", + 2.5, + 2 + ] + } + }, + { + "id": "places-egypt-labels", + "type": "symbol", + "source": "places_egypt", + "source-layer": "places_egypt", + "minzoom": 12, + "filter": [ + "!in", + "category", + "street" + ], + "layout": { + "text-field": [ + "coalesce", + [ + "get", + "name_ar" + ], + [ + "get", + "name" + ], + "" + ], + "text-font": [ + "Noto Sans Bold" + ], + "text-size": [ + "interpolate", + [ + "linear" + ], + [ + "zoom" + ], + 12, + 9, + 16, + 13 + ], + "text-offset": [ + 0, + 1.5 + ], + "text-anchor": "top", + "text-padding": 8, + "text-allow-overlap": false + }, + "paint": { + "text-color": "#2D3748", + "text-halo-color": "rgba(255,255,255,0.93)", + "text-halo-width": 2 + } + }, + { + "id": "places-syria-labels", + "type": "symbol", + "source": "places_syria", + "source-layer": "places_syria", + "minzoom": 10, + "filter": [ + "!in", + "category", + "street" + ], + "layout": { + "text-field": [ + "coalesce", + [ + "get", + "name_ar" + ], + [ + "get", + "name" + ], + "" + ], + "text-font": [ + "Noto Sans Bold" + ], + "text-size": [ + "interpolate", + [ + "linear" + ], + [ + "zoom" + ], + 12, + 9, + 16, + 13 + ], + "text-offset": [ + 0, + 1.5 + ], + "text-anchor": "top", + "text-padding": 8, + "text-allow-overlap": false + }, + "paint": { + "text-color": "#2D3748", + "text-halo-color": "rgba(255,255,255,0.93)", + "text-halo-width": 2 + } + }, + { + "id": "places-jordan-labels", + "type": "symbol", + "source": "places_jordan", + "source-layer": "places_jordan", + "minzoom": 10, + "filter": [ + "!in", + "category", + "street" + ], + "layout": { + "text-field": [ + "coalesce", + [ + "get", + "name_ar" + ], + [ + "get", + "name" + ], + "" + ], + "text-font": [ + "Noto Sans Bold" + ], + "text-size": [ + "interpolate", + [ + "linear" + ], + [ + "zoom" + ], + 12, + 9, + 16, + 13 + ], + "text-offset": [ + 0, + 1.5 + ], + "text-anchor": "top", + "text-padding": 8, + "text-allow-overlap": false + }, + "paint": { + "text-color": "#2D3748", + "text-halo-color": "rgba(255,255,255,0.93)", + "text-halo-width": 2 + } + } + ] +} \ No newline at end of file diff --git a/siro_rider/assets/style_dark.json b/siro_rider/assets/style_dark.json new file mode 100644 index 0000000..86ac3d6 --- /dev/null +++ b/siro_rider/assets/style_dark.json @@ -0,0 +1,2178 @@ +{ + "version": 8, + "name": "Intaleq Premium — Dark v2.9", + "metadata": { + "brand": "Intaleq", + "version": "2.10.0-dark", + "description": "Intaleq dark theme — buildings at close zoom only, on-road labels, improved arrows" + }, + "center": [ + 36.276008, + 33.513685 + ], + "zoom": 15, + "glyphs": "https://cdn.protomaps.com/fonts/pbf/{fontstack}/{range}.pbf", + "sprite": "https://demotiles.maplibre.org/styles/osm-bright-gl-style/sprite", + "sources": { + "local-osm-polygons": { + "type": "vector", + "tiles": [ + "https://tiles.intaleqapp.com/planet_osm_polygon/{z}/{x}/{y}" + ], + "maxzoom": 14, + "attribution": "© Intaleq | © OpenStreetMap contributors" + }, + "local-osm-lines": { + "type": "vector", + "tiles": [ + "https://tiles.intaleqapp.com/planet_osm_line/{z}/{x}/{y}" + ], + "maxzoom": 14 + }, + "local-osm-points": { + "type": "vector", + "tiles": [ + "https://tiles.intaleqapp.com/planet_osm_point/{z}/{x}/{y}" + ], + "maxzoom": 14 + }, + "places_egypt": { + "type": "vector", + "tiles": [ + "https://tiles.intaleqapp.com/places_egypt/{z}/{x}/{y}" + ], + "maxzoom": 14 + }, + "places_syria": { + "type": "vector", + "tiles": [ + "https://tiles.intaleqapp.com/places_syria/{z}/{x}/{y}" + ], + "maxzoom": 14 + }, + "places_jordan": { + "type": "vector", + "tiles": [ + "https://tiles.intaleqapp.com/places_jordan/{z}/{x}/{y}" + ], + "maxzoom": 14 + }, + "overture_buildings": { + "type": "vector", + "tiles": [ + "https://tiles.intaleqapp.com/overture_building/{z}/{x}/{y}" + ], + "maxzoom": 14 + }, + "overture_segments": { + "type": "vector", + "tiles": [ + "https://tiles.intaleqapp.com/overture_segment/{z}/{x}/{y}" + ], + "maxzoom": 14 + } + }, + "layers": [ + { + "id": "background", + "type": "background", + "paint": { + "background-color": "#141920" + } + }, + { + "id": "landuse-residential", + "type": "fill", + "source": "local-osm-polygons", + "source-layer": "planet_osm_polygon", + "filter": [ + "==", + "landuse", + "residential" + ], + "paint": { + "fill-color": "#1A2130", + "fill-opacity": 0.9 + } + }, + { + "id": "landuse-commercial", + "type": "fill", + "source": "local-osm-polygons", + "source-layer": "planet_osm_polygon", + "filter": [ + "==", + "landuse", + "commercial" + ], + "paint": { + "fill-color": "#1E1C18", + "fill-opacity": 0.9 + } + }, + { + "id": "landuse-cemetery", + "type": "fill", + "source": "local-osm-polygons", + "source-layer": "planet_osm_polygon", + "filter": [ + "==", + "landuse", + "cemetery" + ], + "paint": { + "fill-color": "#1A2E1A", + "fill-opacity": 0.9 + } + }, + { + "id": "landuse-military", + "type": "fill", + "source": "local-osm-polygons", + "source-layer": "planet_osm_polygon", + "filter": [ + "==", + "landuse", + "military" + ], + "paint": { + "fill-color": "#28241C", + "fill-opacity": 0.9 + } + }, + { + "id": "landuse-industrial", + "type": "fill", + "source": "local-osm-polygons", + "source-layer": "planet_osm_polygon", + "filter": [ + "in", + "landuse", + "industrial", + "railway" + ], + "paint": { + "fill-color": "#1C2028", + "fill-opacity": 1 + } + }, + { + "id": "park-layer", + "type": "fill", + "source": "local-osm-polygons", + "source-layer": "planet_osm_polygon", + "filter": [ + "any", + [ + "in", + "leisure", + "park", + "garden", + "nature_reserve", + "pitch", + "playground" + ], + [ + "in", + "landuse", + "grass", + "meadow", + "forest" + ], + [ + "in", + "natural", + "wood", + "scrub", + "heath" + ] + ], + "paint": { + "fill-color": [ + "match", + [ + "get", + "leisure" + ], + "pitch", + "#1A3020", + "playground", + "#1C2A1C", + "#172217" + ], + "fill-opacity": 0.85 + } + }, + { + "id": "park-outline", + "type": "line", + "source": "local-osm-polygons", + "source-layer": "planet_osm_polygon", + "filter": [ + "in", + "leisure", + "park", + "garden", + "nature_reserve" + ], + "paint": { + "line-color": "#1A3020", + "line-width": 0.8, + "line-opacity": 0.6 + } + }, + { + "id": "water-polygon", + "type": "fill", + "source": "local-osm-polygons", + "source-layer": "planet_osm_polygon", + "filter": [ + "any", + [ + "in", + "natural", + "water", + "lake", + "bay" + ], + [ + "==", + "waterway", + "riverbank" + ], + [ + "in", + "landuse", + "basin", + "reservoir" + ], + [ + "==", + "amenity", + "fountain" + ] + ], + "paint": { + "fill-color": "#0D2A40", + "fill-opacity": 0.95 + } + }, + { + "id": "water-polygon-outline", + "type": "line", + "source": "local-osm-polygons", + "source-layer": "planet_osm_polygon", + "filter": [ + "any", + [ + "in", + "natural", + "water", + "lake", + "bay" + ], + [ + "==", + "waterway", + "riverbank" + ], + [ + "in", + "landuse", + "basin", + "reservoir" + ] + ], + "paint": { + "line-color": "#1A4A6A", + "line-width": 0.8, + "line-opacity": 0.8 + } + }, + { + "id": "waterway-river", + "type": "line", + "source": "local-osm-lines", + "source-layer": "planet_osm_line", + "filter": [ + "all", + [ + "in", + "waterway", + "river", + "canal" + ], + [ + "!=", + "intermittent", + "yes" + ], + [ + "!=", + "seasonal", + "yes" + ], + [ + "!=", + "tunnel", + "yes" + ] + ], + "paint": { + "line-color": "#1A4A6A", + "line-width": [ + "interpolate", + [ + "linear" + ], + [ + "zoom" + ], + 10, + 1.5, + 14, + 4, + 16, + 7 + ], + "line-opacity": 0.95 + } + }, + { + "id": "waterway-stream-drain", + "type": "line", + "source": "local-osm-lines", + "source-layer": "planet_osm_line", + "filter": [ + "all", + [ + "in", + "waterway", + "stream", + "drain", + "ditch" + ], + [ + "!=", + "intermittent", + "yes" + ], + [ + "!=", + "seasonal", + "yes" + ], + [ + "!=", + "tunnel", + "yes" + ] + ], + "minzoom": 13, + "paint": { + "line-color": "#153A52", + "line-width": [ + "interpolate", + [ + "linear" + ], + [ + "zoom" + ], + 13, + 0.8, + 16, + 2.5 + ], + "line-opacity": 0.85 + } + }, + { + "id": "railway-area", + "type": "fill", + "source": "local-osm-polygons", + "source-layer": "planet_osm_polygon", + "filter": [ + "==", + "landuse", + "railway" + ], + "paint": { + "fill-color": "#202830", + "fill-opacity": 0.9 + } + }, + { + "id": "railway-rail-casing", + "type": "line", + "source": "local-osm-lines", + "source-layer": "planet_osm_line", + "filter": [ + "all", + [ + "in", + "railway", + "rail", + "narrow_gauge", + "preserved" + ], + [ + "!=", + "service", + "yard" + ], + [ + "!=", + "service", + "siding" + ] + ], + "minzoom": 8, + "paint": { + "line-color": "#3A4050", + "line-width": [ + "interpolate", + [ + "linear" + ], + [ + "zoom" + ], + 8, + 2, + 12, + 4, + 16, + 8 + ] + } + }, + { + "id": "railway-rail-core", + "type": "line", + "source": "local-osm-lines", + "source-layer": "planet_osm_line", + "filter": [ + "all", + [ + "in", + "railway", + "rail", + "narrow_gauge", + "preserved" + ], + [ + "!=", + "service", + "yard" + ], + [ + "!=", + "service", + "siding" + ] + ], + "minzoom": 8, + "paint": { + "line-color": "#4A5568", + "line-width": [ + "interpolate", + [ + "linear" + ], + [ + "zoom" + ], + 8, + 1, + 12, + 2.5, + 16, + 5 + ], + "line-dasharray": [ + 6, + 4 + ] + } + }, + { + "id": "railway-subway-casing", + "type": "line", + "source": "local-osm-lines", + "source-layer": "planet_osm_line", + "filter": [ + "in", + "railway", + "subway", + "light_rail", + "tram", + "monorail" + ], + "minzoom": 10, + "paint": { + "line-color": [ + "match", + [ + "get", + "railway" + ], + "subway", + "#AA1122", + "light_rail", + "#0055AA", + "tram", + "#7722AA", + "monorail", + "#007744", + "#BB3344" + ], + "line-width": [ + "interpolate", + [ + "linear" + ], + [ + "zoom" + ], + 10, + 3, + 14, + 6, + 16, + 10 + ] + } + }, + { + "id": "railway-subway-core", + "type": "line", + "source": "local-osm-lines", + "source-layer": "planet_osm_line", + "filter": [ + "in", + "railway", + "subway", + "light_rail", + "tram", + "monorail" + ], + "minzoom": 10, + "paint": { + "line-color": [ + "match", + [ + "get", + "railway" + ], + "subway", + "#FF4455", + "light_rail", + "#33AAFF", + "tram", + "#CC55FF", + "monorail", + "#00DD88", + "#FF4455" + ], + "line-width": [ + "interpolate", + [ + "linear" + ], + [ + "zoom" + ], + 10, + 1.5, + 14, + 3.5, + 16, + 6 + ] + } + }, + { + "id": "road-casing-track-path", + "type": "line", + "source": "local-osm-lines", + "source-layer": "planet_osm_line", + "filter": [ + "in", + "highway", + "track", + "path", + "footway", + "cycleway", + "steps" + ], + "minzoom": 14, + "paint": { + "line-color": "#252C38", + "line-width": [ + "interpolate", + [ + "linear" + ], + [ + "zoom" + ], + 14, + 1, + 16, + 4 + ], + "line-dasharray": [ + 4, + 3 + ] + } + }, + { + "id": "road-casing-minor", + "type": "line", + "source": "local-osm-lines", + "source-layer": "planet_osm_line", + "filter": [ + "in", + "highway", + "residential", + "service", + "unclassified", + "living_street", + "pedestrian" + ], + "paint": { + "line-color": "#252C38", + "line-width": [ + "interpolate", + [ + "linear" + ], + [ + "zoom" + ], + 12, + 1.5, + 16, + 10 + ], + "line-opacity": 0.7 + } + }, + { + "id": "road-core-minor", + "type": "line", + "source": "local-osm-lines", + "source-layer": "planet_osm_line", + "filter": [ + "in", + "highway", + "residential", + "service", + "unclassified", + "living_street", + "pedestrian" + ], + "paint": { + "line-color": "#2E3848", + "line-width": [ + "interpolate", + [ + "linear" + ], + [ + "zoom" + ], + 12, + 0.8, + 16, + 8 + ] + } + }, + { + "id": "road-casing-tertiary", + "type": "line", + "source": "local-osm-lines", + "source-layer": "planet_osm_line", + "filter": [ + "in", + "highway", + "tertiary", + "tertiary_link" + ], + "paint": { + "line-color": "#2A3040", + "line-width": [ + "interpolate", + [ + "linear" + ], + [ + "zoom" + ], + 11, + 2, + 16, + 14 + ], + "line-opacity": 0.75 + } + }, + { + "id": "road-core-tertiary", + "type": "line", + "source": "local-osm-lines", + "source-layer": "planet_osm_line", + "filter": [ + "in", + "highway", + "tertiary", + "tertiary_link" + ], + "paint": { + "line-color": "#38465A", + "line-width": [ + "interpolate", + [ + "linear" + ], + [ + "zoom" + ], + 11, + 1.2, + 16, + 11 + ] + } + }, + { + "id": "road-casing-secondary", + "type": "line", + "source": "local-osm-lines", + "source-layer": "planet_osm_line", + "filter": [ + "in", + "highway", + "secondary", + "secondary_link" + ], + "paint": { + "line-color": "#3A3010", + "line-width": [ + "interpolate", + [ + "linear" + ], + [ + "zoom" + ], + 11, + 2.5, + 16, + 16 + ], + "line-opacity": 0.8 + } + }, + { + "id": "road-core-secondary", + "type": "line", + "source": "local-osm-lines", + "source-layer": "planet_osm_line", + "filter": [ + "in", + "highway", + "secondary", + "secondary_link" + ], + "paint": { + "line-color": "#4A3E18", + "line-width": [ + "interpolate", + [ + "linear" + ], + [ + "zoom" + ], + 11, + 1.8, + 16, + 13 + ] + } + }, + { + "id": "road-casing-primary", + "type": "line", + "source": "local-osm-lines", + "source-layer": "planet_osm_line", + "filter": [ + "in", + "highway", + "primary", + "primary_link" + ], + "paint": { + "line-color": "#5A4A10", + "line-width": [ + "interpolate", + [ + "linear" + ], + [ + "zoom" + ], + 10, + 3, + 16, + 18 + ], + "line-opacity": 0.7 + } + }, + { + "id": "road-core-primary", + "type": "line", + "source": "local-osm-lines", + "source-layer": "planet_osm_line", + "filter": [ + "in", + "highway", + "primary", + "primary_link" + ], + "paint": { + "line-color": "#7A6418", + "line-width": [ + "interpolate", + [ + "linear" + ], + [ + "zoom" + ], + 10, + 2, + 16, + 14 + ] + } + }, + { + "id": "road-casing-motorway", + "type": "line", + "source": "local-osm-lines", + "source-layer": "planet_osm_line", + "filter": [ + "in", + "highway", + "motorway", + "motorway_link", + "trunk", + "trunk_link" + ], + "paint": { + "line-color": "#6A5010", + "line-width": [ + "interpolate", + [ + "linear" + ], + [ + "zoom" + ], + 9, + 4, + 16, + 20 + ], + "line-opacity": 0.75 + } + }, + { + "id": "road-core-motorway", + "type": "line", + "source": "local-osm-lines", + "source-layer": "planet_osm_line", + "filter": [ + "in", + "highway", + "motorway", + "motorway_link", + "trunk", + "trunk_link" + ], + "paint": { + "line-color": "#8A6A18", + "line-width": [ + "interpolate", + [ + "linear" + ], + [ + "zoom" + ], + 9, + 2.5, + 16, + 16 + ] + } + }, + { + "id": "road-direction-arrows", + "type": "symbol", + "source": "local-osm-lines", + "source-layer": "planet_osm_line", + "minzoom": 15, + "filter": [ + "all", + [ + "in", + "highway", + "motorway", + "trunk", + "primary", + "secondary", + "tertiary", + "residential", + "unclassified", + "living_street" + ], + [ + "==", + "oneway", + "yes" + ] + ], + "layout": { + "symbol-placement": "line", + "symbol-spacing": 120, + "text-field": "→", + "text-font": [ + "Noto Sans Regular" + ], + "text-size": [ + "interpolate", + [ + "linear" + ], + [ + "zoom" + ], + 15, + 16, + 17, + 22, + 19, + 28 + ], + "text-keep-upright": false, + "text-rotation-alignment": "map", + "text-pitch-alignment": "viewport", + "text-allow-overlap": true, + "text-ignore-placement": true, + "text-padding": 0, + "text-letter-spacing": -0.1 + }, + "paint": { + "text-color": "rgba(160,180,210,0.5)", + "text-halo-color": "rgba(0,0,0,0.3)", + "text-halo-width": 1 + } + }, + { + "id": "building-fill-flat", + "type": "fill", + "source": "local-osm-polygons", + "source-layer": "planet_osm_polygon", + "filter": [ + "has", + "building" + ], + "minzoom": 15, + "maxzoom": 16, + "paint": { + "fill-color": "#252C38", + "fill-opacity": 0.85, + "fill-outline-color": "#1E2530" + } + }, + { + "id": "building-3d", + "type": "fill-extrusion", + "source": "local-osm-polygons", + "source-layer": "planet_osm_polygon", + "minzoom": 16, + "filter": [ + "has", + "building" + ], + "paint": { + "fill-extrusion-color": "#252C38", + "fill-extrusion-height": [ + "coalesce", + [ + "to-number", + [ + "get", + "height" + ] + ], + [ + "*", + [ + "to-number", + [ + "get", + "building:levels" + ], + 2 + ], + 3.5 + ], + 7 + ], + "fill-extrusion-base": [ + "coalesce", + [ + "to-number", + [ + "get", + "min_height" + ] + ], + 0 + ], + "fill-extrusion-opacity": 0.8, + "fill-extrusion-vertical-gradient": true + } + }, + { + "id": "building-3d-overture", + "type": "fill-extrusion", + "source": "overture_buildings", + "source-layer": "overture_building", + "minzoom": 16, + "paint": { + "fill-extrusion-color": [ + "match", + [ + "get", + "subtype" + ], + "commercial", + "#2A3A50", + "retail", + "#2E3A4A", + "industrial", + "#1E2A38", + "religious", + "#24203A", + "education", + "#1E3024", + "medical", + "#3A2020", + "#2A3245" + ], + "fill-extrusion-height": [ + "interpolate", + [ + "linear" + ], + [ + "zoom" + ], + 16, + [ + "coalesce", + [ + "to-number", + [ + "get", + "height" + ] + ], + [ + "*", + [ + "coalesce", + [ + "to-number", + [ + "get", + "num_floors" + ] + ], + 3 + ], + 3.5 + ], + 9 + ], + 18, + [ + "coalesce", + [ + "to-number", + [ + "get", + "height" + ] + ], + [ + "*", + [ + "coalesce", + [ + "to-number", + [ + "get", + "num_floors" + ] + ], + 3 + ], + 3.5 + ], + 12 + ] + ], + "fill-extrusion-base": [ + "coalesce", + [ + "to-number", + [ + "get", + "min_height" + ] + ], + 0 + ], + "fill-extrusion-opacity": [ + "interpolate", + [ + "linear" + ], + [ + "zoom" + ], + 15, + 0, + 16, + 0.6, + 17, + 0.88 + ], + "fill-extrusion-vertical-gradient": true + } + }, + { + "id": "overture-building-footprint", + "type": "fill", + "source": "overture_buildings", + "source-layer": "overture_building", + "minzoom": 15, + "maxzoom": 16, + "paint": { + "fill-color": "#252C38", + "fill-opacity": 0.82, + "fill-outline-color": "#1E2530" + } + }, + { + "id": "railway-label", + "type": "symbol", + "source": "local-osm-lines", + "source-layer": "planet_osm_line", + "filter": [ + "in", + "railway", + "rail", + "subway", + "light_rail", + "tram" + ], + "minzoom": 13, + "layout": { + "text-field": [ + "coalesce", + [ + "get", + "name:ar" + ], + [ + "get", + "name" + ], + "" + ], + "text-font": [ + "Noto Sans Regular" + ], + "text-size": 10, + "symbol-placement": "line", + "text-padding": 6, + "text-allow-overlap": false + }, + "paint": { + "text-color": [ + "match", + [ + "get", + "railway" + ], + "subway", + "#FF5566", + "light_rail", + "#0055BB", + "tram", + "#7722AA", + "#4A5568" + ], + "text-halo-color": "rgba(20,25,32,0.92)", + "text-halo-width": 2 + } + }, + { + "id": "waterway-label", + "type": "symbol", + "source": "local-osm-lines", + "source-layer": "planet_osm_line", + "filter": [ + "all", + [ + "in", + "waterway", + "river", + "canal" + ], + [ + "!=", + "intermittent", + "yes" + ], + [ + "has", + "name" + ] + ], + "minzoom": 12, + "layout": { + "text-field": [ + "coalesce", + [ + "get", + "name:ar" + ], + [ + "get", + "name" + ], + "" + ], + "text-font": [ + "Noto Sans Regular" + ], + "text-size": 11, + "symbol-placement": "line", + "text-letter-spacing": 0.1 + }, + "paint": { + "text-color": "#4AA8D8", + "text-halo-color": "rgba(20,25,32,0.92)", + "text-halo-width": 2 + } + }, + { + "id": "building-number-polygon", + "type": "symbol", + "source": "local-osm-polygons", + "source-layer": "planet_osm_polygon", + "minzoom": 17, + "filter": [ + "has", + "addr:housenumber" + ], + "layout": { + "text-field": "{addr:housenumber}", + "text-font": [ + "Noto Sans Regular" + ], + "text-size": 10, + "text-allow-overlap": false + }, + "paint": { + "text-color": "#8898A8", + "text-halo-color": "rgba(20,25,32,0.92)", + "text-halo-width": 1.5 + } + }, + { + "id": "building-number-point", + "type": "symbol", + "source": "local-osm-points", + "source-layer": "planet_osm_point", + "minzoom": 17, + "filter": [ + "has", + "addr:housenumber" + ], + "layout": { + "text-field": "{addr:housenumber}", + "text-font": [ + "Noto Sans Regular" + ], + "text-size": 10, + "text-allow-overlap": false + }, + "paint": { + "text-color": "#8898A8", + "text-halo-color": "rgba(20,25,32,0.92)", + "text-halo-width": 1.5 + } + }, + { + "id": "overture-building-names", + "type": "symbol", + "source": "overture_buildings", + "source-layer": "overture_building", + "minzoom": 17, + "filter": [ + "has", + "names" + ], + "layout": { + "text-field": [ + "coalesce", + [ + "get", + "names" + ], + "" + ], + "text-font": [ + "Noto Sans Regular" + ], + "text-size": 10, + "text-anchor": "center", + "text-allow-overlap": false, + "text-max-width": 8 + }, + "paint": { + "text-color": "#8898A8", + "text-halo-color": "rgba(20,25,32,0.92)", + "text-halo-width": 1.5 + } + }, + { + "id": "road-labels-minor", + "type": "symbol", + "source": "local-osm-lines", + "source-layer": "planet_osm_line", + "filter": [ + "in", + "highway", + "residential", + "service", + "unclassified", + "living_street" + ], + "minzoom": 16, + "layout": { + "text-field": [ + "coalesce", + [ + "get", + "name:ar" + ], + [ + "get", + "name" + ], + "" + ], + "text-font": [ + "Noto Sans Regular" + ], + "text-size": [ + "interpolate", + [ + "linear" + ], + [ + "zoom" + ], + 16, + 10, + 18, + 13 + ], + "symbol-placement": "line", + "text-rotation-alignment": "map", + "text-pitch-alignment": "viewport", + "text-keep-upright": true, + "text-max-angle": 25, + "symbol-spacing": 300, + "text-letter-spacing": 0.04, + "text-padding": 8, + "text-allow-overlap": false + }, + "paint": { + "text-color": "#8BA0B8", + "text-halo-color": "rgba(20,25,32,0.92)", + "text-halo-width": 1.8 + } + }, + { + "id": "road-labels-major", + "type": "symbol", + "source": "local-osm-lines", + "source-layer": "planet_osm_line", + "filter": [ + "in", + "highway", + "primary", + "secondary", + "tertiary", + "motorway", + "trunk" + ], + "minzoom": 12, + "layout": { + "text-field": [ + "coalesce", + [ + "get", + "name:ar" + ], + [ + "get", + "name" + ], + "" + ], + "text-font": [ + "Noto Sans Bold" + ], + "text-size": [ + "interpolate", + [ + "linear" + ], + [ + "zoom" + ], + 12, + 10, + 14, + 13, + 18, + 16 + ], + "symbol-placement": "line", + "text-rotation-alignment": "map", + "text-pitch-alignment": "viewport", + "text-keep-upright": true, + "text-max-angle": 22, + "symbol-spacing": 350, + "text-letter-spacing": 0.05, + "text-padding": 12, + "text-allow-overlap": false + }, + "paint": { + "text-color": "#C8D8E8", + "text-halo-color": "rgba(20,25,32,0.92)", + "text-halo-width": 2.5 + } + }, + { + "id": "overture-street-names", + "type": "symbol", + "source": "overture_segments", + "source-layer": "overture_segment", + "minzoom": 14, + "filter": [ + "has", + "names" + ], + "layout": { + "text-field": [ + "coalesce", + [ + "get", + "names" + ], + "" + ], + "text-font": [ + "Noto Sans Regular" + ], + "text-size": [ + "interpolate", + [ + "linear" + ], + [ + "zoom" + ], + 14, + 9, + 16, + 12, + 18, + 14 + ], + "symbol-placement": "line", + "text-rotation-alignment": "map", + "text-pitch-alignment": "viewport", + "text-keep-upright": true, + "text-max-angle": 28, + "symbol-spacing": 280, + "text-letter-spacing": 0.04, + "text-padding": 15, + "text-allow-overlap": false + }, + "paint": { + "text-color": "#8BA0B8", + "text-halo-color": "rgba(20,25,32,0.92)", + "text-halo-width": 2 + } + }, + { + "id": "poi-hospital", + "type": "symbol", + "source": "local-osm-points", + "source-layer": "planet_osm_point", + "minzoom": 13, + "filter": [ + "==", + "amenity", + "hospital" + ], + "layout": { + "icon-image": "hospital", + "icon-size": 1.0, + "text-field": [ + "coalesce", + [ + "get", + "name:ar" + ], + [ + "get", + "name" + ], + "" + ], + "text-font": [ + "Noto Sans Regular" + ], + "text-size": 11, + "text-offset": [ + 0, + 1.2 + ], + "text-anchor": "top", + "text-allow-overlap": false + }, + "paint": { + "text-color": "#FF6B6B", + "text-halo-color": "rgba(20,25,32,0.92)", + "text-halo-width": 2 + } + }, + { + "id": "poi-pharmacy", + "type": "symbol", + "source": "local-osm-points", + "source-layer": "planet_osm_point", + "minzoom": 15, + "filter": [ + "==", + "amenity", + "pharmacy" + ], + "layout": { + "icon-image": "pharmacy", + "icon-size": 0.8, + "text-field": [ + "coalesce", + [ + "get", + "name:ar" + ], + [ + "get", + "name" + ], + "" + ], + "text-font": [ + "Noto Sans Regular" + ], + "text-size": 11, + "text-offset": [ + 0, + 1.2 + ], + "text-anchor": "top", + "text-allow-overlap": false + }, + "paint": { + "text-color": "#4ADB80", + "text-halo-color": "rgba(20,25,32,0.92)", + "text-halo-width": 2 + } + }, + { + "id": "poi-place-of-worship", + "type": "symbol", + "source": "local-osm-points", + "source-layer": "planet_osm_point", + "minzoom": 14, + "filter": [ + "==", + "amenity", + "place_of_worship" + ], + "layout": { + "icon-image": "tourist", + "icon-size": 0.8, + "text-field": [ + "coalesce", + [ + "get", + "name:ar" + ], + [ + "get", + "name" + ], + "" + ], + "text-font": [ + "Noto Sans Regular" + ], + "text-size": 11, + "text-offset": [ + 0, + 1.2 + ], + "text-anchor": "top", + "text-allow-overlap": false + }, + "paint": { + "text-color": "#4ACA78", + "text-halo-color": "rgba(20,25,32,0.92)", + "text-halo-width": 2 + } + }, + { + "id": "poi-school", + "type": "symbol", + "source": "local-osm-points", + "source-layer": "planet_osm_point", + "minzoom": 14, + "filter": [ + "in", + "amenity", + "school", + "university", + "college" + ], + "layout": { + "icon-image": "college", + "icon-size": 0.8, + "text-field": [ + "coalesce", + [ + "get", + "name:ar" + ], + [ + "get", + "name" + ], + "" + ], + "text-font": [ + "Noto Sans Regular" + ], + "text-size": 11, + "text-offset": [ + 0, + 1.2 + ], + "text-anchor": "top", + "text-allow-overlap": false + }, + "paint": { + "text-color": "#A888E8", + "text-halo-color": "rgba(20,25,32,0.92)", + "text-halo-width": 2 + } + }, + { + "id": "poi-restaurant-cafe", + "type": "symbol", + "source": "local-osm-points", + "source-layer": "planet_osm_point", + "minzoom": 16, + "filter": [ + "in", + "amenity", + "restaurant", + "cafe", + "fast_food" + ], + "layout": { + "icon-image": [ + "match", + [ + "get", + "amenity" + ], + "cafe", + "cafe", + "restaurant" + ], + "icon-size": 0.8, + "text-field": [ + "coalesce", + [ + "get", + "name:ar" + ], + [ + "get", + "name" + ], + "" + ], + "text-font": [ + "Noto Sans Regular" + ], + "text-size": 10, + "text-offset": [ + 0, + 1.2 + ], + "text-anchor": "top" + }, + "paint": { + "text-color": "#A0B8D0", + "text-halo-color": "rgba(20,25,32,0.92)", + "text-halo-width": 1.5 + } + }, + { + "id": "poi-transit-station", + "type": "symbol", + "source": "local-osm-points", + "source-layer": "planet_osm_point", + "minzoom": 12, + "filter": [ + "any", + [ + "==", + "railway", + "station" + ], + [ + "==", + "railway", + "halt" + ], + [ + "==", + "railway", + "tram_stop" + ], + [ + "==", + "station", + "subway" + ], + [ + "==", + "amenity", + "bus_station" + ] + ], + "layout": { + "icon-image": "rail", + "icon-size": 1, + "text-field": [ + "coalesce", + [ + "get", + "name:ar" + ], + [ + "get", + "name" + ], + "" + ], + "text-font": [ + "Noto Sans Regular" + ], + "text-size": 11, + "text-offset": [ + 0, + 1.4 + ], + "text-anchor": "top", + "text-allow-overlap": false + }, + "paint": { + "text-color": "#FF5566", + "text-halo-color": "rgba(20,25,32,0.92)", + "text-halo-width": 2 + } + }, + { + "id": "place-labels-area", + "type": "symbol", + "source": "local-osm-polygons", + "source-layer": "planet_osm_polygon", + "minzoom": 10, + "filter": [ + "has", + "name" + ], + "layout": { + "text-field": [ + "coalesce", + [ + "get", + "name:ar" + ], + [ + "get", + "name" + ], + "" + ], + "text-font": [ + "Noto Sans Regular" + ], + "text-size": [ + "interpolate", + [ + "linear" + ], + [ + "zoom" + ], + 10, + 10, + 14, + 13 + ], + "text-padding": 8, + "text-allow-overlap": false + }, + "paint": { + "text-color": "#8AA0B8", + "text-halo-color": "rgba(20,25,32,0.92)", + "text-halo-width": 2 + } + }, + { + "id": "place-labels-point", + "type": "symbol", + "source": "local-osm-points", + "source-layer": "planet_osm_point", + "minzoom": 10, + "filter": [ + "any", + [ + "in", + "place", + "city", + "town", + "village", + "suburb", + "neighbourhood", + "hamlet", + "locality", + "quarter" + ], + [ + "in", + "natural", + "peak", + "spring" + ] + ], + "layout": { + "text-field": [ + "coalesce", + [ + "get", + "name:ar" + ], + [ + "get", + "name" + ], + "" + ], + "text-font": [ + "Noto Sans Regular" + ], + "text-size": [ + "interpolate", + [ + "linear" + ], + [ + "zoom" + ], + 10, + [ + "match", + [ + "get", + "place" + ], + "city", + 16, + "town", + 14, + 11 + ], + 14, + [ + "match", + [ + "get", + "place" + ], + "city", + 20, + "town", + 16, + 13 + ], + 17, + 14 + ], + "text-letter-spacing": [ + "match", + [ + "get", + "place" + ], + "city", + 0.08, + "town", + 0.05, + 0.02 + ], + "text-anchor": "center", + "text-padding": 10, + "text-allow-overlap": false + }, + "paint": { + "text-color": [ + "match", + [ + "get", + "place" + ], + "city", + "#D0E0F0", + "town", + "#B8CDE0", + "suburb", + "#8AA0B8", + "neighbourhood", + "#8AA0B8", + "#8AA0B8" + ], + "text-halo-color": "rgba(20,25,32,0.92)", + "text-halo-width": [ + "match", + [ + "get", + "place" + ], + "city", + 3, + "town", + 2.5, + 2 + ] + } + }, + { + "id": "places-egypt-labels", + "type": "symbol", + "source": "places_egypt", + "source-layer": "places_egypt", + "minzoom": 12, + "filter": [ + "!in", + "category", + "street" + ], + "layout": { + "text-field": [ + "coalesce", + [ + "get", + "name_ar" + ], + [ + "get", + "name" + ], + "" + ], + "text-font": [ + "Noto Sans Bold" + ], + "text-size": [ + "interpolate", + [ + "linear" + ], + [ + "zoom" + ], + 12, + 9, + 16, + 13 + ], + "text-offset": [ + 0, + 1.5 + ], + "text-anchor": "top", + "text-padding": 8, + "text-allow-overlap": false + }, + "paint": { + "text-color": "#A8C0D8", + "text-halo-color": "rgba(20,25,32,0.92)", + "text-halo-width": 2 + } + }, + { + "id": "places-syria-labels", + "type": "symbol", + "source": "places_syria", + "source-layer": "places_syria", + "minzoom": 10, + "filter": [ + "!in", + "category", + "street" + ], + "layout": { + "text-field": [ + "coalesce", + [ + "get", + "name_ar" + ], + [ + "get", + "name" + ], + "" + ], + "text-font": [ + "Noto Sans Bold" + ], + "text-size": [ + "interpolate", + [ + "linear" + ], + [ + "zoom" + ], + 12, + 9, + 16, + 13 + ], + "text-offset": [ + 0, + 1.5 + ], + "text-anchor": "top", + "text-padding": 8, + "text-allow-overlap": false + }, + "paint": { + "text-color": "#A8C0D8", + "text-halo-color": "rgba(20,25,32,0.92)", + "text-halo-width": 2 + } + }, + { + "id": "places-jordan-labels", + "type": "symbol", + "source": "places_jordan", + "source-layer": "places_jordan", + "minzoom": 10, + "filter": [ + "!in", + "category", + "street" + ], + "layout": { + "text-field": [ + "coalesce", + [ + "get", + "name_ar" + ], + [ + "get", + "name" + ], + "" + ], + "text-font": [ + "Noto Sans Bold" + ], + "text-size": [ + "interpolate", + [ + "linear" + ], + [ + "zoom" + ], + 12, + 9, + 16, + 13 + ], + "text-offset": [ + 0, + 1.5 + ], + "text-anchor": "top", + "text-padding": 8, + "text-allow-overlap": false + }, + "paint": { + "text-color": "#A8C0D8", + "text-halo-color": "rgba(20,25,32,0.92)", + "text-halo-width": 2 + } + } + ] +} \ No newline at end of file diff --git a/siro_rider/firebase.json b/siro_rider/firebase.json new file mode 100644 index 0000000..4d402a7 --- /dev/null +++ b/siro_rider/firebase.json @@ -0,0 +1 @@ +{"flutter":{"platforms":{"android":{"default":{"projectId":"siro-a6957","appId":"1:825988584191:android:06782b540c7681ad1632ca","fileOutput":"android/app/google-services.json"}},"ios":{"default":{"projectId":"siro-a6957","appId":"1:825988584191:ios:1d880fc7fc98b7671632ca","uploadDebugSymbols":false,"fileOutput":"ios/Runner/GoogleService-Info.plist"}},"dart":{"lib/firebase_options.dart":{"projectId":"siro-a6957","configurations":{"android":"1:825988584191:android:06782b540c7681ad1632ca","ios":"1:825988584191:ios:1d880fc7fc98b7671632ca"}}}}}} \ No newline at end of file diff --git a/siro_rider/ios/.gitignore b/siro_rider/ios/.gitignore new file mode 100644 index 0000000..7a7f987 --- /dev/null +++ b/siro_rider/ios/.gitignore @@ -0,0 +1,34 @@ +**/dgph +*.mode1v3 +*.mode2v3 +*.moved-aside +*.pbxuser +*.perspectivev3 +**/*sync/ +.sconsign.dblite +.tags* +**/.vagrant/ +**/DerivedData/ +Icon? +**/Pods/ +**/.symlinks/ +profile +xcuserdata +**/.generated/ +Flutter/App.framework +Flutter/Flutter.framework +Flutter/Flutter.podspec +Flutter/Generated.xcconfig +Flutter/ephemeral/ +Flutter/app.flx +Flutter/app.zip +Flutter/flutter_assets/ +Flutter/flutter_export_environment.sh +ServiceDefinitions.json +Runner/GeneratedPluginRegistrant.* + +# Exceptions to above rules. +!default.mode1v3 +!default.mode2v3 +!default.pbxuser +!default.perspectivev3 diff --git a/siro_rider/ios/Flutter/AppFrameworkInfo.plist b/siro_rider/ios/Flutter/AppFrameworkInfo.plist new file mode 100644 index 0000000..4aaa3e0 --- /dev/null +++ b/siro_rider/ios/Flutter/AppFrameworkInfo.plist @@ -0,0 +1,26 @@ + + + + + CFBundleDevelopmentRegion + en + CFBundleExecutable + App + CFBundleIdentifier + io.flutter.flutter.app + CFBundleInfoDictionaryVersion + 6.0 + CFBundleName + App + CFBundlePackageType + FMWK + CFBundleShortVersionString + 1.0 + CFBundleSignature + ???? + CFBundleVersion + 1.0 + MinimumOSVersion + 16.1 + + \ No newline at end of file diff --git a/siro_rider/ios/Flutter/Debug.xcconfig b/siro_rider/ios/Flutter/Debug.xcconfig new file mode 100644 index 0000000..ec97fc6 --- /dev/null +++ b/siro_rider/ios/Flutter/Debug.xcconfig @@ -0,0 +1,2 @@ +#include? "Pods/Target Support Files/Pods-Runner/Pods-Runner.debug.xcconfig" +#include "Generated.xcconfig" diff --git a/siro_rider/ios/Flutter/Release.xcconfig b/siro_rider/ios/Flutter/Release.xcconfig new file mode 100644 index 0000000..c4855bf --- /dev/null +++ b/siro_rider/ios/Flutter/Release.xcconfig @@ -0,0 +1,2 @@ +#include? "Pods/Target Support Files/Pods-Runner/Pods-Runner.release.xcconfig" +#include "Generated.xcconfig" diff --git a/siro_rider/ios/Podfile b/siro_rider/ios/Podfile new file mode 100644 index 0000000..f61c2cb --- /dev/null +++ b/siro_rider/ios/Podfile @@ -0,0 +1,57 @@ +platform :ios, '16.1' # This is often set in the generated Podfile section + +ENV['COCOAPODS_DISABLE_STATS'] = 'true' + +project 'Runner', { + 'Debug' => :debug, + 'Profile' => :release, + 'Release' => :release, +} + +def flutter_root + generated_xcode_build_settings_path = File.expand_path(File.join('..', 'Flutter', 'Generated.xcconfig'), __FILE__) + unless File.exist?(generated_xcode_build_settings_path) + raise "#{generated_xcode_build_settings_path} must exist. If you're running pod install manually, make sure flutter pub get is executed first" + end + + File.foreach(generated_xcode_build_settings_path) do |line| + matches = line.match(/FLUTTER_ROOT\=(.*)/) + return matches[1].strip if matches + end + raise "FLUTTER_ROOT not found in #{generated_xcode_build_settings_path}. Try deleting Generated.xcconfig, then run flutter pub get" +end + +require File.expand_path(File.join('packages', 'flutter_tools', 'bin', 'podhelper'), flutter_root) + +flutter_ios_podfile_setup + +target 'Runner' do + use_frameworks! :linkage => :static + flutter_install_all_ios_pods File.dirname(File.realpath(__FILE__)) + + target 'RunnerTests' do + inherit! :search_paths + end +end + +post_install do |installer| + installer.pods_project.targets.each do |target| + flutter_additional_ios_build_settings(target) + target.build_configurations.each do |config| + # Set your project's deployment target. + config.build_settings['IPHONEOS_DEPLOYMENT_TARGET'] = '16.1' + # Fix for "non-modular header" issues with some pods. + config.build_settings['CLANG_ALLOW_NON_MODULAR_INCLUDES_IN_FRAMEWORK_MODULES'] = 'YES' + + config.build_settings['GCC_PREPROCESSOR_DEFINITIONS'] ||= [ + '$(inherited)', + 'PERMISSION_CONTACTS=1', + 'PERMISSION_LOCATION=1', + 'PERMISSION_MICROPHONE=1', + 'PERMISSION_NOTIFICATIONS=1', + 'PERMISSION_CAMERA=1', + 'PERMISSION_PHOTOS=1', + ] + end + end +end diff --git a/siro_rider/ios/Podfile.lock b/siro_rider/ios/Podfile.lock new file mode 100644 index 0000000..2b95974 --- /dev/null +++ b/siro_rider/ios/Podfile.lock @@ -0,0 +1,484 @@ +PODS: + - app_links (7.0.0): + - Flutter + - AppAuth (2.0.0): + - AppAuth/Core (= 2.0.0) + - AppAuth/ExternalUserAgent (= 2.0.0) + - AppAuth/Core (2.0.0) + - AppAuth/ExternalUserAgent (2.0.0): + - AppAuth/Core + - AppCheckCore (11.2.0): + - GoogleUtilities/Environment (~> 8.0) + - GoogleUtilities/UserDefaults (~> 8.0) + - PromisesObjC (~> 2.4) + - audio_session (0.0.1): + - Flutter + - connectivity_plus (0.0.1): + - Flutter + - device_info_plus (0.0.1): + - Flutter + - Firebase/Auth (12.8.0): + - Firebase/CoreOnly + - FirebaseAuth (~> 12.8.0) + - Firebase/CoreOnly (12.8.0): + - FirebaseCore (~> 12.8.0) + - Firebase/Messaging (12.8.0): + - Firebase/CoreOnly + - FirebaseMessaging (~> 12.8.0) + - firebase_auth (6.1.4): + - Firebase/Auth (= 12.8.0) + - firebase_core + - Flutter + - firebase_core (4.4.0): + - Firebase/CoreOnly (= 12.8.0) + - Flutter + - firebase_messaging (16.1.1): + - Firebase/Messaging (= 12.8.0) + - firebase_core + - Flutter + - FirebaseAppCheckInterop (12.8.0) + - FirebaseAuth (12.8.0): + - FirebaseAppCheckInterop (~> 12.8.0) + - FirebaseAuthInterop (~> 12.8.0) + - FirebaseCore (~> 12.8.0) + - FirebaseCoreExtension (~> 12.8.0) + - GoogleUtilities/AppDelegateSwizzler (~> 8.1) + - GoogleUtilities/Environment (~> 8.1) + - GTMSessionFetcher/Core (< 6.0, >= 3.4) + - RecaptchaInterop (~> 101.0) + - FirebaseAuthInterop (12.8.0) + - FirebaseCore (12.8.0): + - FirebaseCoreInternal (~> 12.8.0) + - GoogleUtilities/Environment (~> 8.1) + - GoogleUtilities/Logger (~> 8.1) + - FirebaseCoreExtension (12.8.0): + - FirebaseCore (~> 12.8.0) + - FirebaseCoreInternal (12.8.0): + - "GoogleUtilities/NSData+zlib (~> 8.1)" + - FirebaseInstallations (12.8.0): + - FirebaseCore (~> 12.8.0) + - GoogleUtilities/Environment (~> 8.1) + - GoogleUtilities/UserDefaults (~> 8.1) + - PromisesObjC (~> 2.4) + - FirebaseMessaging (12.8.0): + - FirebaseCore (~> 12.8.0) + - FirebaseInstallations (~> 12.8.0) + - GoogleDataTransport (~> 10.1) + - GoogleUtilities/AppDelegateSwizzler (~> 8.1) + - GoogleUtilities/Environment (~> 8.1) + - GoogleUtilities/Reachability (~> 8.1) + - GoogleUtilities/UserDefaults (~> 8.1) + - nanopb (~> 3.30910.0) + - Flutter (1.0.0) + - flutter_app_group_directory (0.0.1): + - Flutter + - flutter_contacts (0.0.1): + - Flutter + - flutter_local_notifications (0.0.1): + - Flutter + - flutter_secure_storage_darwin (10.0.0): + - Flutter + - FlutterMacOS + - flutter_tts (0.0.1): + - Flutter + - flutter_webrtc (1.4.0): + - Flutter + - WebRTC-SDK (= 144.7559.01) + - geolocator_apple (1.2.0): + - Flutter + - FlutterMacOS + - google_sign_in_ios (0.0.1): + - Flutter + - FlutterMacOS + - GoogleSignIn (~> 9.0) + - GTMSessionFetcher (>= 3.4.0) + - GoogleDataTransport (10.1.0): + - nanopb (~> 3.30910.0) + - PromisesObjC (~> 2.4) + - GoogleSignIn (9.1.0): + - AppAuth (~> 2.0) + - AppCheckCore (~> 11.0) + - GTMAppAuth (~> 5.0) + - GTMSessionFetcher/Core (~> 3.3) + - GoogleUtilities/AppDelegateSwizzler (8.1.0): + - GoogleUtilities/Environment + - GoogleUtilities/Logger + - GoogleUtilities/Network + - GoogleUtilities/Privacy + - GoogleUtilities/Environment (8.1.0): + - GoogleUtilities/Privacy + - GoogleUtilities/Logger (8.1.0): + - GoogleUtilities/Environment + - GoogleUtilities/Privacy + - GoogleUtilities/Network (8.1.0): + - GoogleUtilities/Logger + - "GoogleUtilities/NSData+zlib" + - GoogleUtilities/Privacy + - GoogleUtilities/Reachability + - "GoogleUtilities/NSData+zlib (8.1.0)": + - GoogleUtilities/Privacy + - GoogleUtilities/Privacy (8.1.0) + - GoogleUtilities/Reachability (8.1.0): + - GoogleUtilities/Logger + - GoogleUtilities/Privacy + - GoogleUtilities/UserDefaults (8.1.0): + - GoogleUtilities/Logger + - GoogleUtilities/Privacy + - GTMAppAuth (5.0.0): + - AppAuth/Core (~> 2.0) + - GTMSessionFetcher/Core (< 4.0, >= 3.3) + - GTMSessionFetcher (3.5.0): + - GTMSessionFetcher/Full (= 3.5.0) + - GTMSessionFetcher/Core (3.5.0) + - GTMSessionFetcher/Full (3.5.0): + - GTMSessionFetcher/Core + - image_cropper (0.0.4): + - Flutter + - TOCropViewController (~> 2.8.0) + - image_picker_ios (0.0.1): + - Flutter + - IOSSecuritySuite (1.9.11) + - jailbreak_root_detection (1.0.1): + - Flutter + - IOSSecuritySuite (~> 1.9.10) + - just_audio (0.0.1): + - Flutter + - FlutterMacOS + - live_activities (0.0.1): + - Flutter + - local_auth_darwin (0.0.1): + - Flutter + - FlutterMacOS + - location (0.0.1): + - Flutter + - MapLibre (6.19.1) + - maplibre_gl (0.25.0): + - Flutter + - MapLibre (= 6.19.1) + - nanopb (3.30910.0): + - nanopb/decode (= 3.30910.0) + - nanopb/encode (= 3.30910.0) + - nanopb/decode (3.30910.0) + - nanopb/encode (3.30910.0) + - package_info_plus (0.4.5): + - Flutter + - permission_handler_apple (9.3.0): + - Flutter + - PromisesObjC (2.4.0) + - quick_actions_ios (0.0.1): + - Flutter + - RecaptchaInterop (101.0.0) + - record_ios (1.2.0): + - Flutter + - sensors_plus (0.0.1): + - Flutter + - share_plus (0.0.1): + - Flutter + - sign_in_with_apple (0.0.1): + - Flutter + - sqflite_darwin (0.0.4): + - Flutter + - FlutterMacOS + - Stripe (25.6.4): + - StripeApplePay (= 25.6.4) + - StripeCore (= 25.6.4) + - StripeIssuing (= 25.6.4) + - StripePayments (= 25.6.4) + - StripePaymentsUI (= 25.6.4) + - StripeUICore (= 25.6.4) + - stripe_ios (0.0.1): + - Flutter + - Stripe (~> 25.6.0) + - stripe_ios/stripe_ios (= 0.0.1) + - stripe_ios/stripe_objc (= 0.0.1) + - StripeApplePay (~> 25.6.0) + - StripeFinancialConnections (~> 25.6.0) + - StripePayments (~> 25.6.0) + - StripePaymentSheet (~> 25.6.0) + - StripePaymentsUI (~> 25.6.0) + - stripe_ios/stripe_ios (0.0.1): + - Flutter + - Stripe (~> 25.6.0) + - stripe_ios/stripe_objc + - StripeApplePay (~> 25.6.0) + - StripeFinancialConnections (~> 25.6.0) + - StripePayments (~> 25.6.0) + - StripePaymentSheet (~> 25.6.0) + - StripePaymentsUI (~> 25.6.0) + - stripe_ios/stripe_objc (0.0.1): + - Flutter + - Stripe (~> 25.6.0) + - StripeApplePay (~> 25.6.0) + - StripeFinancialConnections (~> 25.6.0) + - StripePayments (~> 25.6.0) + - StripePaymentSheet (~> 25.6.0) + - StripePaymentsUI (~> 25.6.0) + - StripeApplePay (25.6.4): + - StripeCore (= 25.6.4) + - StripeCore (25.6.4) + - StripeFinancialConnections (25.6.4): + - StripeCore (= 25.6.4) + - StripeUICore (= 25.6.4) + - StripeIssuing (25.6.4): + - StripeCore (= 25.6.4) + - StripePayments (= 25.6.4) + - StripePaymentsUI (= 25.6.4) + - StripePayments (25.6.4): + - StripeCore (= 25.6.4) + - StripePayments/Stripe3DS2 (= 25.6.4) + - StripePayments/Stripe3DS2 (25.6.4): + - StripeCore (= 25.6.4) + - StripePaymentSheet (25.6.4): + - StripeApplePay (= 25.6.4) + - StripeCore (= 25.6.4) + - StripePayments (= 25.6.4) + - StripePaymentsUI (= 25.6.4) + - StripePaymentsUI (25.6.4): + - StripeCore (= 25.6.4) + - StripePayments (= 25.6.4) + - StripeUICore (= 25.6.4) + - StripeUICore (25.6.4): + - StripeCore (= 25.6.4) + - TOCropViewController (2.8.0) + - url_launcher_ios (0.0.1): + - Flutter + - vibration (3.0.0): + - Flutter + - video_player_avfoundation (0.0.1): + - Flutter + - FlutterMacOS + - wakelock_plus (0.0.1): + - Flutter + - WebRTC-SDK (144.7559.01) + - webview_flutter_wkwebview (0.0.1): + - Flutter + - FlutterMacOS + +DEPENDENCIES: + - app_links (from `.symlinks/plugins/app_links/ios`) + - audio_session (from `.symlinks/plugins/audio_session/ios`) + - connectivity_plus (from `.symlinks/plugins/connectivity_plus/ios`) + - device_info_plus (from `.symlinks/plugins/device_info_plus/ios`) + - firebase_auth (from `.symlinks/plugins/firebase_auth/ios`) + - firebase_core (from `.symlinks/plugins/firebase_core/ios`) + - firebase_messaging (from `.symlinks/plugins/firebase_messaging/ios`) + - Flutter (from `Flutter`) + - flutter_app_group_directory (from `.symlinks/plugins/flutter_app_group_directory/ios`) + - flutter_contacts (from `.symlinks/plugins/flutter_contacts/ios`) + - flutter_local_notifications (from `.symlinks/plugins/flutter_local_notifications/ios`) + - flutter_secure_storage_darwin (from `.symlinks/plugins/flutter_secure_storage_darwin/darwin`) + - flutter_tts (from `.symlinks/plugins/flutter_tts/ios`) + - flutter_webrtc (from `.symlinks/plugins/flutter_webrtc/ios`) + - geolocator_apple (from `.symlinks/plugins/geolocator_apple/darwin`) + - google_sign_in_ios (from `.symlinks/plugins/google_sign_in_ios/darwin`) + - image_cropper (from `.symlinks/plugins/image_cropper/ios`) + - image_picker_ios (from `.symlinks/plugins/image_picker_ios/ios`) + - jailbreak_root_detection (from `.symlinks/plugins/jailbreak_root_detection/ios`) + - just_audio (from `.symlinks/plugins/just_audio/darwin`) + - live_activities (from `.symlinks/plugins/live_activities/ios`) + - local_auth_darwin (from `.symlinks/plugins/local_auth_darwin/darwin`) + - location (from `.symlinks/plugins/location/ios`) + - maplibre_gl (from `.symlinks/plugins/maplibre_gl/ios`) + - package_info_plus (from `.symlinks/plugins/package_info_plus/ios`) + - permission_handler_apple (from `.symlinks/plugins/permission_handler_apple/ios`) + - quick_actions_ios (from `.symlinks/plugins/quick_actions_ios/ios`) + - record_ios (from `.symlinks/plugins/record_ios/ios`) + - sensors_plus (from `.symlinks/plugins/sensors_plus/ios`) + - share_plus (from `.symlinks/plugins/share_plus/ios`) + - sign_in_with_apple (from `.symlinks/plugins/sign_in_with_apple/ios`) + - sqflite_darwin (from `.symlinks/plugins/sqflite_darwin/darwin`) + - stripe_ios (from `.symlinks/plugins/stripe_ios/ios`) + - url_launcher_ios (from `.symlinks/plugins/url_launcher_ios/ios`) + - vibration (from `.symlinks/plugins/vibration/ios`) + - video_player_avfoundation (from `.symlinks/plugins/video_player_avfoundation/darwin`) + - wakelock_plus (from `.symlinks/plugins/wakelock_plus/ios`) + - webview_flutter_wkwebview (from `.symlinks/plugins/webview_flutter_wkwebview/darwin`) + +SPEC REPOS: + trunk: + - AppAuth + - AppCheckCore + - Firebase + - FirebaseAppCheckInterop + - FirebaseAuth + - FirebaseAuthInterop + - FirebaseCore + - FirebaseCoreExtension + - FirebaseCoreInternal + - FirebaseInstallations + - FirebaseMessaging + - GoogleDataTransport + - GoogleSignIn + - GoogleUtilities + - GTMAppAuth + - GTMSessionFetcher + - IOSSecuritySuite + - MapLibre + - nanopb + - PromisesObjC + - RecaptchaInterop + - Stripe + - StripeApplePay + - StripeCore + - StripeFinancialConnections + - StripeIssuing + - StripePayments + - StripePaymentSheet + - StripePaymentsUI + - StripeUICore + - TOCropViewController + - WebRTC-SDK + +EXTERNAL SOURCES: + app_links: + :path: ".symlinks/plugins/app_links/ios" + audio_session: + :path: ".symlinks/plugins/audio_session/ios" + connectivity_plus: + :path: ".symlinks/plugins/connectivity_plus/ios" + device_info_plus: + :path: ".symlinks/plugins/device_info_plus/ios" + firebase_auth: + :path: ".symlinks/plugins/firebase_auth/ios" + firebase_core: + :path: ".symlinks/plugins/firebase_core/ios" + firebase_messaging: + :path: ".symlinks/plugins/firebase_messaging/ios" + Flutter: + :path: Flutter + flutter_app_group_directory: + :path: ".symlinks/plugins/flutter_app_group_directory/ios" + flutter_contacts: + :path: ".symlinks/plugins/flutter_contacts/ios" + flutter_local_notifications: + :path: ".symlinks/plugins/flutter_local_notifications/ios" + flutter_secure_storage_darwin: + :path: ".symlinks/plugins/flutter_secure_storage_darwin/darwin" + flutter_tts: + :path: ".symlinks/plugins/flutter_tts/ios" + flutter_webrtc: + :path: ".symlinks/plugins/flutter_webrtc/ios" + geolocator_apple: + :path: ".symlinks/plugins/geolocator_apple/darwin" + google_sign_in_ios: + :path: ".symlinks/plugins/google_sign_in_ios/darwin" + image_cropper: + :path: ".symlinks/plugins/image_cropper/ios" + image_picker_ios: + :path: ".symlinks/plugins/image_picker_ios/ios" + jailbreak_root_detection: + :path: ".symlinks/plugins/jailbreak_root_detection/ios" + just_audio: + :path: ".symlinks/plugins/just_audio/darwin" + live_activities: + :path: ".symlinks/plugins/live_activities/ios" + local_auth_darwin: + :path: ".symlinks/plugins/local_auth_darwin/darwin" + location: + :path: ".symlinks/plugins/location/ios" + maplibre_gl: + :path: ".symlinks/plugins/maplibre_gl/ios" + package_info_plus: + :path: ".symlinks/plugins/package_info_plus/ios" + permission_handler_apple: + :path: ".symlinks/plugins/permission_handler_apple/ios" + quick_actions_ios: + :path: ".symlinks/plugins/quick_actions_ios/ios" + record_ios: + :path: ".symlinks/plugins/record_ios/ios" + sensors_plus: + :path: ".symlinks/plugins/sensors_plus/ios" + share_plus: + :path: ".symlinks/plugins/share_plus/ios" + sign_in_with_apple: + :path: ".symlinks/plugins/sign_in_with_apple/ios" + sqflite_darwin: + :path: ".symlinks/plugins/sqflite_darwin/darwin" + stripe_ios: + :path: ".symlinks/plugins/stripe_ios/ios" + url_launcher_ios: + :path: ".symlinks/plugins/url_launcher_ios/ios" + vibration: + :path: ".symlinks/plugins/vibration/ios" + video_player_avfoundation: + :path: ".symlinks/plugins/video_player_avfoundation/darwin" + wakelock_plus: + :path: ".symlinks/plugins/wakelock_plus/ios" + webview_flutter_wkwebview: + :path: ".symlinks/plugins/webview_flutter_wkwebview/darwin" + +SPEC CHECKSUMS: + app_links: a754cbec3c255bd4bbb4d236ecc06f28cd9a7ce8 + AppAuth: 1c1a8afa7e12f2ec3a294d9882dfa5ab7d3cb063 + AppCheckCore: cc8fd0a3a230ddd401f326489c99990b013f0c4f + audio_session: 9bb7f6c970f21241b19f5a3658097ae459681ba0 + connectivity_plus: cb623214f4e1f6ef8fe7403d580fdad517d2f7dd + device_info_plus: 21fcca2080fbcd348be798aa36c3e5ed849eefbe + Firebase: 9a58fdbc9d8655ed7b79a19cf9690bb007d3d46d + firebase_auth: e9031a1dbe04a90d98e8d11ff2302352a1c6d9e8 + firebase_core: ee30637e6744af8e0c12a6a1e8a9718506ec2398 + firebase_messaging: 343de01a8d3e18b60df0c6d37f7174c44ae38e02 + FirebaseAppCheckInterop: ba3dc604a89815379e61ec2365101608d365cf7d + FirebaseAuth: 4c289b1a43f5955283244a55cf6bd616de344be5 + FirebaseAuthInterop: 95363fe96493cb4f106656666a0768b420cba090 + FirebaseCore: 0dbad74bda10b8fb9ca34ad8f375fb9dd3ebef7c + FirebaseCoreExtension: 6605938d51f765d8b18bfcafd2085276a252bee2 + FirebaseCoreInternal: fe5fa466aeb314787093a7dce9f0beeaad5a2a21 + FirebaseInstallations: 6a14ab3d694ebd9f839c48d330da5547e9ca9dc0 + FirebaseMessaging: 7f42cfd10ec64181db4e01b305a613791c8e782c + Flutter: cabc95a1d2626b1b06e7179b784ebcf0c0cde467 + flutter_app_group_directory: 55b5362007d1c0cb45dc1dd1e94f67d615f45a6b + flutter_contacts: 5383945387e7ca37cf963d4be57c21f2fc15ca9f + flutter_local_notifications: a5a732f069baa862e728d839dd2ebb904737effb + flutter_secure_storage_darwin: acdb3f316ed05a3e68f856e0353b133eec373a23 + flutter_tts: 35ac3c7d42412733e795ea96ad2d7e05d0a75113 + flutter_webrtc: ec91d94b484ad49cf191ef93413f64a40ffd3b4c + geolocator_apple: ab36aa0e8b7d7a2d7639b3b4e48308394e8cef5e + google_sign_in_ios: 000870aa06da9b28d1d0bf7ef70ff0213059dd28 + GoogleDataTransport: aae35b7ea0c09004c3797d53c8c41f66f219d6a7 + GoogleSignIn: fcee2257188d5eda57a5e2b6a715550ffff9206d + GoogleUtilities: 00c88b9a86066ef77f0da2fab05f65d7768ed8e1 + GTMAppAuth: 217a876b249c3c585a54fd6f73e6b58c4f5c4238 + GTMSessionFetcher: 5aea5ba6bd522a239e236100971f10cb71b96ab6 + image_cropper: 64567491beea6cd1bc4b11948e2babb590de5826 + image_picker_ios: e0ece4aa2a75771a7de3fa735d26d90817041326 + IOSSecuritySuite: b51056d5411aee567153ca86ce7f6edfdc5d2654 + jailbreak_root_detection: 9201e1dfd51dc23069cbfb8d4f4a2d18305170bf + just_audio: 4e391f57b79cad2b0674030a00453ca5ce817eed + live_activities: 4dfa736d0736e1c77866a2f9c056a76513cc9e7b + local_auth_darwin: c3ee6cce0a8d56be34c8ccb66ba31f7f180aaebb + location: 155caecf9da4f280ab5fe4a55f94ceccfab838f8 + MapLibre: 7f24faba45439f80ccb0f83393c29fa32cb81952 + maplibre_gl: a2114567cbd1065866614fbd34dfb75ab782aaa2 + nanopb: fad817b59e0457d11a5dfbde799381cd727c1275 + package_info_plus: af8e2ca6888548050f16fa2f1938db7b5a5df499 + permission_handler_apple: 4ed2196e43d0651e8ff7ca3483a069d469701f2d + PromisesObjC: f5707f49cb48b9636751c5b2e7d227e43fba9f47 + quick_actions_ios: 500fcc11711d9f646739093395c4ae8eec25f779 + RecaptchaInterop: 11e0b637842dfb48308d242afc3f448062325aba + record_ios: 412daca2350b228e698fffcd08f1f94ceb1e3844 + sensors_plus: 3c3bac724a2128c895623e03efd82cf0e94fd8e8 + share_plus: 50da8cb520a8f0f65671c6c6a99b3617ed10a58a + sign_in_with_apple: c5dcc141574c8c54d5ac99dd2163c0c72ad22418 + sqflite_darwin: 20b2a3a3b70e43edae938624ce550a3cbf66a3d0 + Stripe: 7cb1009980324c6c16b6a4af5843b8ef54549065 + stripe_ios: eebee52319de946cc0da2d6ddc98a89b04cec95e + StripeApplePay: 91000b0927f53c58a2a1f829a4ee246d508bd1c4 + StripeCore: f6ca805768a7807ec014c0523cd99a3d16d21d6b + StripeFinancialConnections: 2cb9bc81468599d1b4b41178f49879a65c8ac52e + StripeIssuing: 7ffde774af77d713aff204858fcf765eeb3677d3 + StripePayments: 4de3976a0d5f626cfc8ad4e010aff1cbda8dc1e5 + StripePaymentSheet: 29443db7e8635e2d3a00758f1ecebbb17a24ff19 + StripePaymentsUI: 37551e684263db449368ccac27438947e1b45f84 + StripeUICore: f1e43a68ab1e1428f8738df821eb64efac1d871a + TOCropViewController: 797deaf39c90e6e9ddd848d88817f6b9a8a09888 + url_launcher_ios: 7a95fa5b60cc718a708b8f2966718e93db0cef1b + vibration: ca8104a8875b9c493e15b21b04e456befd0ff6eb + video_player_avfoundation: dd410b52df6d2466a42d28550e33e4146928280a + wakelock_plus: e29112ab3ef0b318e58cfa5c32326458be66b556 + WebRTC-SDK: ab9b5319e458c2bfebdc92b3600740da35d5630d + webview_flutter_wkwebview: 8ebf4fded22593026f7dbff1fbff31ea98573c8d + +PODFILE CHECKSUM: 2ba2e4898a3d9a1615dafa81db0705bd67da92c3 + +COCOAPODS: 1.16.2 diff --git a/siro_rider/ios/RideWidget/Assets.xcassets/AccentColor.colorset/Contents.json b/siro_rider/ios/RideWidget/Assets.xcassets/AccentColor.colorset/Contents.json new file mode 100644 index 0000000..eb87897 --- /dev/null +++ b/siro_rider/ios/RideWidget/Assets.xcassets/AccentColor.colorset/Contents.json @@ -0,0 +1,11 @@ +{ + "colors" : [ + { + "idiom" : "universal" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/siro_rider/ios/RideWidget/Assets.xcassets/AppIcon.appiconset/Contents.json b/siro_rider/ios/RideWidget/Assets.xcassets/AppIcon.appiconset/Contents.json new file mode 100644 index 0000000..2305880 --- /dev/null +++ b/siro_rider/ios/RideWidget/Assets.xcassets/AppIcon.appiconset/Contents.json @@ -0,0 +1,35 @@ +{ + "images" : [ + { + "idiom" : "universal", + "platform" : "ios", + "size" : "1024x1024" + }, + { + "appearances" : [ + { + "appearance" : "luminosity", + "value" : "dark" + } + ], + "idiom" : "universal", + "platform" : "ios", + "size" : "1024x1024" + }, + { + "appearances" : [ + { + "appearance" : "luminosity", + "value" : "tinted" + } + ], + "idiom" : "universal", + "platform" : "ios", + "size" : "1024x1024" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/siro_rider/ios/RideWidget/Assets.xcassets/Contents.json b/siro_rider/ios/RideWidget/Assets.xcassets/Contents.json new file mode 100644 index 0000000..73c0059 --- /dev/null +++ b/siro_rider/ios/RideWidget/Assets.xcassets/Contents.json @@ -0,0 +1,6 @@ +{ + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/siro_rider/ios/RideWidget/Assets.xcassets/IntaleqIcon.imageset/152 1.png b/siro_rider/ios/RideWidget/Assets.xcassets/IntaleqIcon.imageset/152 1.png new file mode 100644 index 0000000..9393ec5 Binary files /dev/null and b/siro_rider/ios/RideWidget/Assets.xcassets/IntaleqIcon.imageset/152 1.png differ diff --git a/siro_rider/ios/RideWidget/Assets.xcassets/IntaleqIcon.imageset/152 2.png b/siro_rider/ios/RideWidget/Assets.xcassets/IntaleqIcon.imageset/152 2.png new file mode 100644 index 0000000..9393ec5 Binary files /dev/null and b/siro_rider/ios/RideWidget/Assets.xcassets/IntaleqIcon.imageset/152 2.png differ diff --git a/siro_rider/ios/RideWidget/Assets.xcassets/IntaleqIcon.imageset/152.png b/siro_rider/ios/RideWidget/Assets.xcassets/IntaleqIcon.imageset/152.png new file mode 100644 index 0000000..9393ec5 Binary files /dev/null and b/siro_rider/ios/RideWidget/Assets.xcassets/IntaleqIcon.imageset/152.png differ diff --git a/siro_rider/ios/RideWidget/Assets.xcassets/IntaleqIcon.imageset/Contents.json b/siro_rider/ios/RideWidget/Assets.xcassets/IntaleqIcon.imageset/Contents.json new file mode 100644 index 0000000..a626b3d --- /dev/null +++ b/siro_rider/ios/RideWidget/Assets.xcassets/IntaleqIcon.imageset/Contents.json @@ -0,0 +1,23 @@ +{ + "images" : [ + { + "filename" : "152.png", + "idiom" : "universal", + "scale" : "1x" + }, + { + "filename" : "152 1.png", + "idiom" : "universal", + "scale" : "2x" + }, + { + "filename" : "152 2.png", + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/siro_rider/ios/RideWidget/Assets.xcassets/WidgetBackground.colorset/Contents.json b/siro_rider/ios/RideWidget/Assets.xcassets/WidgetBackground.colorset/Contents.json new file mode 100644 index 0000000..eb87897 --- /dev/null +++ b/siro_rider/ios/RideWidget/Assets.xcassets/WidgetBackground.colorset/Contents.json @@ -0,0 +1,11 @@ +{ + "colors" : [ + { + "idiom" : "universal" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/siro_rider/ios/RideWidget/Info.plist b/siro_rider/ios/RideWidget/Info.plist new file mode 100644 index 0000000..0f118fb --- /dev/null +++ b/siro_rider/ios/RideWidget/Info.plist @@ -0,0 +1,11 @@ + + + + + NSExtension + + NSExtensionPointIdentifier + com.apple.widgetkit-extension + + + diff --git a/siro_rider/ios/RideWidget/RideWidget.swift b/siro_rider/ios/RideWidget/RideWidget.swift new file mode 100644 index 0000000..417fe3f --- /dev/null +++ b/siro_rider/ios/RideWidget/RideWidget.swift @@ -0,0 +1,84 @@ +// +// RideWidget.swift +// RideWidget +// +// Created by Hamza Aleghwairyeen on 26/02/2026. +// + +import WidgetKit +import SwiftUI + +struct Provider: TimelineProvider { + func placeholder(in context: Context) -> SimpleEntry { + SimpleEntry(date: Date(), emoji: "😀") + } + + func getSnapshot(in context: Context, completion: @escaping (SimpleEntry) -> ()) { + let entry = SimpleEntry(date: Date(), emoji: "😀") + completion(entry) + } + + func getTimeline(in context: Context, completion: @escaping (Timeline) -> ()) { + var entries: [SimpleEntry] = [] + + // Generate a timeline consisting of five entries an hour apart, starting from the current date. + let currentDate = Date() + for hourOffset in 0 ..< 5 { + let entryDate = Calendar.current.date(byAdding: .hour, value: hourOffset, to: currentDate)! + let entry = SimpleEntry(date: entryDate, emoji: "😀") + entries.append(entry) + } + + let timeline = Timeline(entries: entries, policy: .atEnd) + completion(timeline) + } + +// func relevances() async -> WidgetRelevances { +// // Generate a list containing the contexts this widget is relevant in. +// } +} + +struct SimpleEntry: TimelineEntry { + let date: Date + let emoji: String +} + +struct RideWidgetEntryView : View { + var entry: Provider.Entry + + var body: some View { + VStack { + Text("Time:") + Text(entry.date, style: .time) + + Text("Emoji:") + Text(entry.emoji) + } + } +} + +struct RideWidget: Widget { + let kind: String = "RideWidget" + + var body: some WidgetConfiguration { + StaticConfiguration(kind: kind, provider: Provider()) { entry in + if #available(iOS 17.0, *) { + RideWidgetEntryView(entry: entry) + .containerBackground(.fill.tertiary, for: .widget) + } else { + RideWidgetEntryView(entry: entry) + .padding() + .background() + } + } + .configurationDisplayName("My Widget") + .description("This is an example widget.") + } +} + +#Preview(as: .systemSmall) { + RideWidget() +} timeline: { + SimpleEntry(date: .now, emoji: "😀") + SimpleEntry(date: .now, emoji: "🤩") +} diff --git a/siro_rider/ios/RideWidget/RideWidgetBundle.swift b/siro_rider/ios/RideWidget/RideWidgetBundle.swift new file mode 100644 index 0000000..d45780e --- /dev/null +++ b/siro_rider/ios/RideWidget/RideWidgetBundle.swift @@ -0,0 +1,20 @@ +// +// RideWidgetBundle.swift +// RideWidget +// +// Created by Hamza Aleghwairyeen on 26/02/2026. +// + + + + +import WidgetKit +import SwiftUI + +@main +struct RideWidgetBundle: WidgetBundle { + var body: some Widget { + RideWidget() // الويدجت العادية + RideWidgetLiveActivity() // ← هذا السطر ضروري وغالبًا ناقص! + } +} diff --git a/siro_rider/ios/RideWidget/RideWidgetControl.swift b/siro_rider/ios/RideWidget/RideWidgetControl.swift new file mode 100644 index 0000000..39ac870 --- /dev/null +++ b/siro_rider/ios/RideWidget/RideWidgetControl.swift @@ -0,0 +1,54 @@ +// +// RideWidgetControl.swift +// RideWidget +// +// Created by Hamza Aleghwairyeen on 26/02/2026. +// + +import AppIntents +import SwiftUI +import WidgetKit + +struct RideWidgetControl: ControlWidget { + var body: some ControlWidgetConfiguration { + StaticControlConfiguration( + kind: "com.siro.siro_rider.RideWidget", + provider: Provider() + ) { value in + ControlWidgetToggle( + "Start Timer", + isOn: value, + action: StartTimerIntent() + ) { isRunning in + Label(isRunning ? "On" : "Off", systemImage: "timer") + } + } + .displayName("Timer") + .description("A an example control that runs a timer.") + } +} + +extension RideWidgetControl { + struct Provider: ControlValueProvider { + var previewValue: Bool { + false + } + + func currentValue() async throws -> Bool { + let isRunning = true // Check if the timer is running + return isRunning + } + } +} + +struct StartTimerIntent: SetValueIntent { + static let title: LocalizedStringResource = "Start a timer" + + @Parameter(title: "Timer is running") + var value: Bool + + func perform() async throws -> some IntentResult { + // Start / stop the timer based on `value`. + return .result() + } +} diff --git a/siro_rider/ios/RideWidget/RideWidgetLiveActivity.swift b/siro_rider/ios/RideWidget/RideWidgetLiveActivity.swift new file mode 100644 index 0000000..d1f3cfc --- /dev/null +++ b/siro_rider/ios/RideWidget/RideWidgetLiveActivity.swift @@ -0,0 +1,200 @@ +import ActivityKit +import WidgetKit +import SwiftUI + +// 1️⃣ Attributes (كما هو مع Plugin: ContentState فارغ والقراءة من AppGroup) +struct LiveActivitiesAppAttributes: ActivityAttributes, Identifiable { + public typealias LiveDeliveryData = ContentState + public struct ContentState: Codable, Hashable { } + var id = UUID() +} + +// 2️⃣ Prefix helper +extension LiveActivitiesAppAttributes { + func prefixedKey(_ key: String) -> String { + return "\(id)_\(key)" + } +} + +// 3️⃣ Shared App Group +let sharedDefault = UserDefaults(suiteName: "group.com.siro.siro_rider")! + +@available(iOS 16.1, *) +struct RideWidgetLiveActivity: Widget { + var body: some WidgetConfiguration { + ActivityConfiguration(for: LiveActivitiesAppAttributes.self) { context in + + // ===== Read from shared defaults ===== + let status = sharedDefault.string(forKey: context.attributes.prefixedKey("status")) ?? "waiting" + let driverName = sharedDefault.string(forKey: context.attributes.prefixedKey("driverName")) ?? "السائق" + let carDetails = sharedDefault.string(forKey: context.attributes.prefixedKey("carDetails")) ?? "" + let etaText = sharedDefault.string(forKey: context.attributes.prefixedKey("etaText")) ?? "--" + let progressRaw = sharedDefault.double(forKey: context.attributes.prefixedKey("progress")) + + // Clamp progress (0..1) + let progress = min(max(progressRaw, 0.0), 1.0) + + // ===== Production Lock Screen UI (White background) ===== + ZStack { + RoundedRectangle(cornerRadius: 18) + .fill(Color.white) + + VStack(alignment: .leading, spacing: 12) { + // Header + HStack(alignment: .center, spacing: 10) { + + // App icon badge (clean) + ZStack { + RoundedRectangle(cornerRadius: 10) + .fill(Color.black.opacity(0.04)) + .frame(width: 38, height: 38) + + Image("IntaleqIcon") + .resizable() + .aspectRatio(contentMode: .fit) + .frame(width: 26, height: 26) + } + + VStack(alignment: .leading, spacing: 3) { + Text(status == "waiting" ? "السائق في الطريق إليك" : "الرحلة جارية") + .font(.headline) + .foregroundColor(.black) + + Text("\(driverName) • \(carDetails)") + .font(.subheadline) + .foregroundColor(.gray) + .lineLimit(1) + } + + Spacer() + + Text(etaText) + .font(.title2) + .bold() + .foregroundColor(.green) + .minimumScaleFactor(0.7) + } + + // Progress bar with big car + GeometryReader { geometry in + let barHeight: CGFloat = 10 + let carSize: CGFloat = 26 + let usableWidth = max(0, geometry.size.width - carSize) + let x = min(max(0, usableWidth * CGFloat(progress)), usableWidth) + + ZStack(alignment: .leading) { + RoundedRectangle(cornerRadius: 6) + .fill(Color.black.opacity(0.08)) + .frame(height: barHeight) + + RoundedRectangle(cornerRadius: 6) + .fill(Color.green) + .frame(width: max(0, geometry.size.width * CGFloat(progress)), + height: barHeight) + + // Car marker (bigger + slightly above the bar) + Image(systemName: "car.side.fill") + .resizable() + .aspectRatio(contentMode: .fit) + .frame(width: carSize, height: carSize) + .foregroundColor(.black) + .background( + Circle() + .fill(Color.white) + .frame(width: carSize + 8, height: carSize + 8) + .shadow(color: Color.black.opacity(0.12), radius: 4, x: 0, y: 2) + ) + .offset(x: x, y: -10) + } + } + .frame(height: 34) + + // Footer micro status (optional but production-ish) + HStack(spacing: 6) { + Circle() + .fill(status == "waiting" ? Color.orange : Color.green) + .frame(width: 8, height: 8) + + Text(status == "waiting" ? "بانتظار وصول السائق" : "أنت الآن في الرحلة") + .font(.caption) + .foregroundColor(.gray) + + Spacer() + } + } + .padding(.horizontal, 14) + .padding(.vertical, 14) + } + .padding(.horizontal, 8) + + } dynamicIsland: { context in + // ===== Read again for dynamic island ===== + let status = sharedDefault.string(forKey: context.attributes.prefixedKey("status")) ?? "waiting" + let driverName = sharedDefault.string(forKey: context.attributes.prefixedKey("driverName")) ?? "السائق" + let carDetails = sharedDefault.string(forKey: context.attributes.prefixedKey("carDetails")) ?? "" + let etaText = sharedDefault.string(forKey: context.attributes.prefixedKey("etaText")) ?? "--" + let progressRaw = sharedDefault.double(forKey: context.attributes.prefixedKey("progress")) + let progress = min(max(progressRaw, 0.0), 1.0) + + return DynamicIsland { + DynamicIslandExpandedRegion(.leading) { + HStack(spacing: 6) { + Image("IntaleqIcon") + .resizable() + .aspectRatio(contentMode: .fit) + .frame(width: 20, height: 20) + .clipShape(RoundedRectangle(cornerRadius: 5)) + + Image(systemName: "car.side.fill") + .foregroundColor(.green) + } + } + + DynamicIslandExpandedRegion(.trailing) { + VStack(alignment: .trailing, spacing: 2) { + Text(etaText) + .font(.headline) + .foregroundColor(.green) + + Text(status == "waiting" ? "قادم إليك" : "جاري") + .font(.caption) + .foregroundColor(.gray) + } + } + + DynamicIslandExpandedRegion(.center) { + VStack(spacing: 4) { + Text(status == "waiting" ? "السائق في الطريق" : "الرحلة جارية") + .font(.subheadline) + + ProgressView(value: progress) + .progressViewStyle(.linear) + } + } + + DynamicIslandExpandedRegion(.bottom) { + Text("\(driverName) • \(carDetails)") + .font(.caption) + .foregroundColor(.gray) + .lineLimit(1) + } + + } compactLeading: { + Image("IntaleqIcon") + .resizable() + .aspectRatio(contentMode: .fit) + .frame(width: 18, height: 18) + .clipShape(RoundedRectangle(cornerRadius: 4)) + + } compactTrailing: { + Text(etaText) + .font(.caption2) + .minimumScaleFactor(0.7) + + } minimal: { + Image(systemName: "car.side.fill") + .foregroundColor(.green) + } + } + } +} diff --git a/siro_rider/ios/RideWidgetExtension.entitlements b/siro_rider/ios/RideWidgetExtension.entitlements new file mode 100644 index 0000000..e2a2336 --- /dev/null +++ b/siro_rider/ios/RideWidgetExtension.entitlements @@ -0,0 +1,10 @@ + + + + + com.apple.security.application-groups + + group.com.Intaleq.intaleq + + + diff --git a/siro_rider/ios/Runner.xcodeproj/project.pbxproj b/siro_rider/ios/Runner.xcodeproj/project.pbxproj new file mode 100644 index 0000000..46e6e58 --- /dev/null +++ b/siro_rider/ios/Runner.xcodeproj/project.pbxproj @@ -0,0 +1,1076 @@ +// !$*UTF8*$! +{ + archiveVersion = 1; + classes = { + }; + objectVersion = 54; + objects = { + +/* Begin PBXBuildFile section */ + 1498D2341E8E89220040F4C2 /* GeneratedPluginRegistrant.m in Sources */ = {isa = PBXBuildFile; fileRef = 1498D2331E8E89220040F4C2 /* GeneratedPluginRegistrant.m */; }; + 331C808B294A63AB00263BE5 /* RunnerTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 331C807B294A618700263BE5 /* RunnerTests.swift */; }; + 3B3967161E833CAA004F5970 /* AppFrameworkInfo.plist in Resources */ = {isa = PBXBuildFile; fileRef = 3B3967151E833CAA004F5970 /* AppFrameworkInfo.plist */; }; + 58553B2A940E5388FFA7BDA2 /* GoogleService-Info.plist in Resources */ = {isa = PBXBuildFile; fileRef = 3587E9A1B526EDE196854DB8 /* GoogleService-Info.plist */; }; + 74858FAF1ED2DC5600515810 /* AppDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 74858FAE1ED2DC5600515810 /* AppDelegate.swift */; }; + 97C146FC1CF9000F007C117D /* Main.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 97C146FA1CF9000F007C117D /* Main.storyboard */; }; + 97C146FE1CF9000F007C117D /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 97C146FD1CF9000F007C117D /* Assets.xcassets */; }; + 97C147011CF9000F007C117D /* LaunchScreen.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 97C146FF1CF9000F007C117D /* LaunchScreen.storyboard */; }; + C62456532E928D5900873892 /* tone2.wav in Resources */ = {isa = PBXBuildFile; fileRef = C62456522E928D5900873892 /* tone2.wav */; }; + C62456542E928D5900873892 /* ding.wav in Resources */ = {isa = PBXBuildFile; fileRef = C624564E2E928D5900873892 /* ding.wav */; }; + C62456552E928D5900873892 /* promo.wav in Resources */ = {isa = PBXBuildFile; fileRef = C624564F2E928D5900873892 /* promo.wav */; }; + C62456562E928D5900873892 /* tone1.mp3 in Resources */ = {isa = PBXBuildFile; fileRef = C62456512E928D5900873892 /* tone1.mp3 */; }; + C62456572E928D5900873892 /* cancel.wav in Resources */ = {isa = PBXBuildFile; fileRef = C624564D2E928D5900873892 /* cancel.wav */; }; + C62456582E928D5900873892 /* start.wav in Resources */ = {isa = PBXBuildFile; fileRef = C62456502E928D5900873892 /* start.wav */; }; + C63F78F72E17536F003A6E1F /* Config.plist in Resources */ = {isa = PBXBuildFile; fileRef = C63F78F62E17536F003A6E1F /* Config.plist */; }; + C63F78FB2E17553F003A6E1F /* KeychainHelper.swift in Sources */ = {isa = PBXBuildFile; fileRef = C63F78FA2E17553F003A6E1F /* KeychainHelper.swift */; }; + C63F78FE2E175599003A6E1F /* Localizable.strings in Resources */ = {isa = PBXBuildFile; fileRef = C63F78FC2E175599003A6E1F /* Localizable.strings */; }; + C63F79002E1755B9003A6E1F /* JailbreakDetection.swift in Sources */ = {isa = PBXBuildFile; fileRef = C63F78FF2E1755B9003A6E1F /* JailbreakDetection.swift */; }; + C63F79032E175621003A6E1F /* SecurityChecks.m in Sources */ = {isa = PBXBuildFile; fileRef = C63F79022E175621003A6E1F /* SecurityChecks.m */; }; + C63F79052E1756CD003A6E1F /* Constants1.swift in Sources */ = {isa = PBXBuildFile; fileRef = C63F79042E1756CD003A6E1F /* Constants1.swift */; }; + C663DBD52F50907000D79908 /* WidgetKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = C663DBD42F50907000D79908 /* WidgetKit.framework */; }; + C663DBD72F50907000D79908 /* SwiftUI.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = C663DBD62F50907000D79908 /* SwiftUI.framework */; }; + C663DBE62F50907200D79908 /* RideWidgetExtension.appex in Embed Foundation Extensions */ = {isa = PBXBuildFile; fileRef = C663DBD32F50907000D79908 /* RideWidgetExtension.appex */; settings = {ATTRIBUTES = (RemoveHeadersOnCopy, ); }; }; + D6641616E7A846A193E9C404 /* Pods_Runner.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = C9B3C266D7F7E62AD0BFDC43 /* Pods_Runner.framework */; }; + E1C7AC57120BE57399EAD917 /* Pods_RunnerTests.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 3EC034A9709465A57FF48561 /* Pods_RunnerTests.framework */; }; +/* End PBXBuildFile section */ + +/* Begin PBXContainerItemProxy section */ + 331C8085294A63A400263BE5 /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = 97C146E61CF9000F007C117D /* Project object */; + proxyType = 1; + remoteGlobalIDString = 97C146ED1CF9000F007C117D; + remoteInfo = Runner; + }; + C663DBE42F50907200D79908 /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = 97C146E61CF9000F007C117D /* Project object */; + proxyType = 1; + remoteGlobalIDString = C663DBD22F50907000D79908; + remoteInfo = RideWidgetExtension; + }; +/* End PBXContainerItemProxy section */ + +/* Begin PBXCopyFilesBuildPhase section */ + 9705A1C41CF9048500538489 /* Embed Frameworks */ = { + isa = PBXCopyFilesBuildPhase; + buildActionMask = 2147483647; + dstPath = ""; + dstSubfolderSpec = 10; + files = ( + ); + name = "Embed Frameworks"; + runOnlyForDeploymentPostprocessing = 0; + }; + C663DBE72F50907200D79908 /* Embed Foundation Extensions */ = { + isa = PBXCopyFilesBuildPhase; + buildActionMask = 2147483647; + dstPath = ""; + dstSubfolderSpec = 13; + files = ( + C663DBE62F50907200D79908 /* RideWidgetExtension.appex in Embed Foundation Extensions */, + ); + name = "Embed Foundation Extensions"; + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXCopyFilesBuildPhase section */ + +/* Begin PBXFileReference section */ + 1498D2321E8E86230040F4C2 /* GeneratedPluginRegistrant.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = GeneratedPluginRegistrant.h; sourceTree = ""; }; + 1498D2331E8E89220040F4C2 /* GeneratedPluginRegistrant.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = GeneratedPluginRegistrant.m; sourceTree = ""; }; + 1D7071657929F2FC24DFA5B6 /* Pods-RunnerTests.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-RunnerTests.debug.xcconfig"; path = "Target Support Files/Pods-RunnerTests/Pods-RunnerTests.debug.xcconfig"; sourceTree = ""; }; + 2EF430BD3979899C7676768C /* Pods-RunnerTests.profile.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-RunnerTests.profile.xcconfig"; path = "Target Support Files/Pods-RunnerTests/Pods-RunnerTests.profile.xcconfig"; sourceTree = ""; }; + 331C807B294A618700263BE5 /* RunnerTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = RunnerTests.swift; sourceTree = ""; }; + 331C8081294A63A400263BE5 /* RunnerTests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = RunnerTests.xctest; sourceTree = BUILT_PRODUCTS_DIR; }; + 3587E9A1B526EDE196854DB8 /* GoogleService-Info.plist */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.plist.xml; name = "GoogleService-Info.plist"; path = "Runner/GoogleService-Info.plist"; sourceTree = ""; }; + 3B3967151E833CAA004F5970 /* AppFrameworkInfo.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; name = AppFrameworkInfo.plist; path = Flutter/AppFrameworkInfo.plist; sourceTree = ""; }; + 3EC034A9709465A57FF48561 /* Pods_RunnerTests.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_RunnerTests.framework; sourceTree = BUILT_PRODUCTS_DIR; }; + 55EA1358F470C87F826E7534 /* Pods-Runner.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.release.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.release.xcconfig"; sourceTree = ""; }; + 580D2D00BBDBCF333EAB7958 /* Pods-RunnerTests.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-RunnerTests.release.xcconfig"; path = "Target Support Files/Pods-RunnerTests/Pods-RunnerTests.release.xcconfig"; sourceTree = ""; }; + 5971FD05B971128BF7DBD1AC /* Pods-Runner.profile.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.profile.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.profile.xcconfig"; sourceTree = ""; }; + 74858FAD1ED2DC5600515810 /* Runner-Bridging-Header.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = "Runner-Bridging-Header.h"; sourceTree = ""; }; + 74858FAE1ED2DC5600515810 /* AppDelegate.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = AppDelegate.swift; sourceTree = ""; }; + 7AFA3C8E1D35360C0083082E /* Release.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; name = Release.xcconfig; path = Flutter/Release.xcconfig; sourceTree = ""; }; + 9740EEB21CF90195004384FC /* Debug.xcconfig */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xcconfig; name = Debug.xcconfig; path = Flutter/Debug.xcconfig; sourceTree = ""; }; + 9740EEB31CF90195004384FC /* Generated.xcconfig */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xcconfig; name = Generated.xcconfig; path = Flutter/Generated.xcconfig; sourceTree = ""; }; + 97C146EE1CF9000F007C117D /* Runner.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = Runner.app; sourceTree = BUILT_PRODUCTS_DIR; }; + 97C146FB1CF9000F007C117D /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/Main.storyboard; sourceTree = ""; }; + 97C146FD1CF9000F007C117D /* Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Assets.xcassets; sourceTree = ""; }; + 97C147001CF9000F007C117D /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/LaunchScreen.storyboard; sourceTree = ""; }; + 97C147021CF9000F007C117D /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; + 9F1AF43B93EE9BD9C9CD9601 /* Pods-Runner.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.debug.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.debug.xcconfig"; sourceTree = ""; }; + C624564D2E928D5900873892 /* cancel.wav */ = {isa = PBXFileReference; lastKnownFileType = audio.wav; path = cancel.wav; sourceTree = ""; }; + C624564E2E928D5900873892 /* ding.wav */ = {isa = PBXFileReference; lastKnownFileType = audio.wav; path = ding.wav; sourceTree = ""; }; + C624564F2E928D5900873892 /* promo.wav */ = {isa = PBXFileReference; lastKnownFileType = audio.wav; path = promo.wav; sourceTree = ""; }; + C62456502E928D5900873892 /* start.wav */ = {isa = PBXFileReference; lastKnownFileType = audio.wav; path = start.wav; sourceTree = ""; }; + C62456512E928D5900873892 /* tone1.mp3 */ = {isa = PBXFileReference; lastKnownFileType = audio.mp3; path = tone1.mp3; sourceTree = ""; }; + C62456522E928D5900873892 /* tone2.wav */ = {isa = PBXFileReference; lastKnownFileType = audio.wav; path = tone2.wav; sourceTree = ""; }; + C63F78F62E17536F003A6E1F /* Config.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Config.plist; sourceTree = ""; }; + C63F78FA2E17553F003A6E1F /* KeychainHelper.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = KeychainHelper.swift; sourceTree = ""; }; + C63F78FD2E175599003A6E1F /* en */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = en; path = en.lproj/Localizable.strings; sourceTree = ""; }; + C63F78FF2E1755B9003A6E1F /* JailbreakDetection.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = JailbreakDetection.swift; sourceTree = ""; }; + C63F79012E1755DC003A6E1F /* SecurityChecks.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = SecurityChecks.h; sourceTree = ""; }; + C63F79022E175621003A6E1F /* SecurityChecks.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; name = SecurityChecks.m; path = " / SecurityChecks.h / Runner / / Created by Hamza Aleghwairyeen on 12/03/2025. / /#ifndef SecurityChecks_h /#define SecurityChecks_h / / /#endif /* SecurityChecks_h */ / SecurityChecks.h #import #import / Import UIKit @interface SecurityChecks : NSObject + (BOOL)isDeviceCompromised; /SecurityChecks.m"; sourceTree = ""; }; + C63F79042E1756CD003A6E1F /* Constants1.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Constants1.swift; sourceTree = ""; }; + C663DBD32F50907000D79908 /* RideWidgetExtension.appex */ = {isa = PBXFileReference; explicitFileType = "wrapper.app-extension"; includeInIndex = 0; path = RideWidgetExtension.appex; sourceTree = BUILT_PRODUCTS_DIR; }; + C663DBD42F50907000D79908 /* WidgetKit.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = WidgetKit.framework; path = System/Library/Frameworks/WidgetKit.framework; sourceTree = SDKROOT; }; + C663DBD62F50907000D79908 /* SwiftUI.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = SwiftUI.framework; path = System/Library/Frameworks/SwiftUI.framework; sourceTree = SDKROOT; }; + C663DE152F5106E300D79908 /* RideWidgetExtension.entitlements */ = {isa = PBXFileReference; lastKnownFileType = text.plist.entitlements; path = RideWidgetExtension.entitlements; sourceTree = ""; }; + C6AE8FF82E15611B002019C2 /* Runner.entitlements */ = {isa = PBXFileReference; lastKnownFileType = text.plist.entitlements; path = Runner.entitlements; sourceTree = ""; }; + C9B3C266D7F7E62AD0BFDC43 /* Pods_Runner.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_Runner.framework; sourceTree = BUILT_PRODUCTS_DIR; }; +/* End PBXFileReference section */ + +/* Begin PBXFileSystemSynchronizedBuildFileExceptionSet section */ + C663DBEB2F50907200D79908 /* Exceptions for "RideWidget" folder in "RideWidgetExtension" target */ = { + isa = PBXFileSystemSynchronizedBuildFileExceptionSet; + membershipExceptions = ( + Info.plist, + ); + target = C663DBD22F50907000D79908 /* RideWidgetExtension */; + }; +/* End PBXFileSystemSynchronizedBuildFileExceptionSet section */ + +/* Begin PBXFileSystemSynchronizedRootGroup section */ + C663DBD82F50907000D79908 /* RideWidget */ = { + isa = PBXFileSystemSynchronizedRootGroup; + exceptions = ( + C663DBEB2F50907200D79908 /* Exceptions for "RideWidget" folder in "RideWidgetExtension" target */, + ); + explicitFileTypes = { + }; + explicitFolders = ( + ); + path = RideWidget; + sourceTree = ""; + }; +/* End PBXFileSystemSynchronizedRootGroup section */ + +/* Begin PBXFrameworksBuildPhase section */ + 389944235E2C646E1A653573 /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( + E1C7AC57120BE57399EAD917 /* Pods_RunnerTests.framework in Frameworks */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + 97C146EB1CF9000F007C117D /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( + D6641616E7A846A193E9C404 /* Pods_Runner.framework in Frameworks */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + C663DBD02F50907000D79908 /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( + C663DBD72F50907000D79908 /* SwiftUI.framework in Frameworks */, + C663DBD52F50907000D79908 /* WidgetKit.framework in Frameworks */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXFrameworksBuildPhase section */ + +/* Begin PBXGroup section */ + 251E297B23F91ABC2B01AACB /* Frameworks */ = { + isa = PBXGroup; + children = ( + C663DBD42F50907000D79908 /* WidgetKit.framework */, + C663DBD62F50907000D79908 /* SwiftUI.framework */, + C9B3C266D7F7E62AD0BFDC43 /* Pods_Runner.framework */, + 3EC034A9709465A57FF48561 /* Pods_RunnerTests.framework */, + ); + name = Frameworks; + sourceTree = ""; + }; + 331C8082294A63A400263BE5 /* RunnerTests */ = { + isa = PBXGroup; + children = ( + 331C807B294A618700263BE5 /* RunnerTests.swift */, + ); + path = RunnerTests; + sourceTree = ""; + }; + 37605ABEAFD8E1B69F13F469 /* Pods */ = { + isa = PBXGroup; + children = ( + 9F1AF43B93EE9BD9C9CD9601 /* Pods-Runner.debug.xcconfig */, + 55EA1358F470C87F826E7534 /* Pods-Runner.release.xcconfig */, + 5971FD05B971128BF7DBD1AC /* Pods-Runner.profile.xcconfig */, + 1D7071657929F2FC24DFA5B6 /* Pods-RunnerTests.debug.xcconfig */, + 580D2D00BBDBCF333EAB7958 /* Pods-RunnerTests.release.xcconfig */, + 2EF430BD3979899C7676768C /* Pods-RunnerTests.profile.xcconfig */, + ); + path = Pods; + sourceTree = ""; + }; + 9740EEB11CF90186004384FC /* Flutter */ = { + isa = PBXGroup; + children = ( + 3B3967151E833CAA004F5970 /* AppFrameworkInfo.plist */, + 9740EEB21CF90195004384FC /* Debug.xcconfig */, + 7AFA3C8E1D35360C0083082E /* Release.xcconfig */, + 9740EEB31CF90195004384FC /* Generated.xcconfig */, + ); + name = Flutter; + sourceTree = ""; + }; + 97C146E51CF9000F007C117D = { + isa = PBXGroup; + children = ( + C663DE152F5106E300D79908 /* RideWidgetExtension.entitlements */, + 9740EEB11CF90186004384FC /* Flutter */, + 97C146F01CF9000F007C117D /* Runner */, + C663DBD82F50907000D79908 /* RideWidget */, + 97C146EF1CF9000F007C117D /* Products */, + 331C8082294A63A400263BE5 /* RunnerTests */, + 37605ABEAFD8E1B69F13F469 /* Pods */, + 251E297B23F91ABC2B01AACB /* Frameworks */, + 3587E9A1B526EDE196854DB8 /* GoogleService-Info.plist */, + ); + sourceTree = ""; + }; + 97C146EF1CF9000F007C117D /* Products */ = { + isa = PBXGroup; + children = ( + 97C146EE1CF9000F007C117D /* Runner.app */, + 331C8081294A63A400263BE5 /* RunnerTests.xctest */, + C663DBD32F50907000D79908 /* RideWidgetExtension.appex */, + ); + name = Products; + sourceTree = ""; + }; + 97C146F01CF9000F007C117D /* Runner */ = { + isa = PBXGroup; + children = ( + C6AE8FF82E15611B002019C2 /* Runner.entitlements */, + C63F78F62E17536F003A6E1F /* Config.plist */, + 97C146FA1CF9000F007C117D /* Main.storyboard */, + 97C146FD1CF9000F007C117D /* Assets.xcassets */, + C624564D2E928D5900873892 /* cancel.wav */, + C624564E2E928D5900873892 /* ding.wav */, + C624564F2E928D5900873892 /* promo.wav */, + C62456502E928D5900873892 /* start.wav */, + C62456512E928D5900873892 /* tone1.mp3 */, + C62456522E928D5900873892 /* tone2.wav */, + 97C146FF1CF9000F007C117D /* LaunchScreen.storyboard */, + 97C147021CF9000F007C117D /* Info.plist */, + 1498D2321E8E86230040F4C2 /* GeneratedPluginRegistrant.h */, + 1498D2331E8E89220040F4C2 /* GeneratedPluginRegistrant.m */, + 74858FAE1ED2DC5600515810 /* AppDelegate.swift */, + 74858FAD1ED2DC5600515810 /* Runner-Bridging-Header.h */, + C63F78FA2E17553F003A6E1F /* KeychainHelper.swift */, + C63F78FC2E175599003A6E1F /* Localizable.strings */, + C63F78FF2E1755B9003A6E1F /* JailbreakDetection.swift */, + C63F79012E1755DC003A6E1F /* SecurityChecks.h */, + C63F79022E175621003A6E1F /* SecurityChecks.m */, + C63F79042E1756CD003A6E1F /* Constants1.swift */, + ); + path = Runner; + sourceTree = ""; + }; +/* End PBXGroup section */ + +/* Begin PBXNativeTarget section */ + 331C8080294A63A400263BE5 /* RunnerTests */ = { + isa = PBXNativeTarget; + buildConfigurationList = 331C8087294A63A400263BE5 /* Build configuration list for PBXNativeTarget "RunnerTests" */; + buildPhases = ( + C6C3FB403E5DB104310DE9A1 /* [CP] Check Pods Manifest.lock */, + 331C807D294A63A400263BE5 /* Sources */, + 331C807F294A63A400263BE5 /* Resources */, + 389944235E2C646E1A653573 /* Frameworks */, + ); + buildRules = ( + ); + dependencies = ( + 331C8086294A63A400263BE5 /* PBXTargetDependency */, + ); + name = RunnerTests; + productName = RunnerTests; + productReference = 331C8081294A63A400263BE5 /* RunnerTests.xctest */; + productType = "com.apple.product-type.bundle.unit-test"; + }; + 97C146ED1CF9000F007C117D /* Runner */ = { + isa = PBXNativeTarget; + buildConfigurationList = 97C147051CF9000F007C117D /* Build configuration list for PBXNativeTarget "Runner" */; + buildPhases = ( + 452CB5F4C1DAFD8264FDA955 /* [CP] Check Pods Manifest.lock */, + 9740EEB61CF901F6004384FC /* Run Script */, + 97C146EA1CF9000F007C117D /* Sources */, + 97C146EB1CF9000F007C117D /* Frameworks */, + 97C146EC1CF9000F007C117D /* Resources */, + 9705A1C41CF9048500538489 /* Embed Frameworks */, + C663DBE72F50907200D79908 /* Embed Foundation Extensions */, + 3B06AD1E1E4923F5004D2608 /* Thin Binary */, + 9DE0D475D98797EEBEE003BD /* [CP] Copy Pods Resources */, + B77A6F719CDC97DC7270EA70 /* [CP] Embed Pods Frameworks */, + ); + buildRules = ( + ); + dependencies = ( + C663DBE52F50907200D79908 /* PBXTargetDependency */, + ); + name = Runner; + productName = Runner; + productReference = 97C146EE1CF9000F007C117D /* Runner.app */; + productType = "com.apple.product-type.application"; + }; + C663DBD22F50907000D79908 /* RideWidgetExtension */ = { + isa = PBXNativeTarget; + buildConfigurationList = C663DBEC2F50907200D79908 /* Build configuration list for PBXNativeTarget "RideWidgetExtension" */; + buildPhases = ( + C663DBCF2F50907000D79908 /* Sources */, + C663DBD02F50907000D79908 /* Frameworks */, + C663DBD12F50907000D79908 /* Resources */, + ); + buildRules = ( + ); + dependencies = ( + ); + fileSystemSynchronizedGroups = ( + C663DBD82F50907000D79908 /* RideWidget */, + ); + name = RideWidgetExtension; + productName = RideWidgetExtension; + productReference = C663DBD32F50907000D79908 /* RideWidgetExtension.appex */; + productType = "com.apple.product-type.app-extension"; + }; +/* End PBXNativeTarget section */ + +/* Begin PBXProject section */ + 97C146E61CF9000F007C117D /* Project object */ = { + isa = PBXProject; + attributes = { + BuildIndependentTargetsInParallel = YES; + LastSwiftUpdateCheck = 2600; + LastUpgradeCheck = 1510; + ORGANIZATIONNAME = ""; + TargetAttributes = { + 331C8080294A63A400263BE5 = { + CreatedOnToolsVersion = 14.0; + TestTargetID = 97C146ED1CF9000F007C117D; + }; + 97C146ED1CF9000F007C117D = { + CreatedOnToolsVersion = 7.3.1; + LastSwiftMigration = 1100; + }; + C663DBD22F50907000D79908 = { + CreatedOnToolsVersion = 26.0; + }; + }; + }; + buildConfigurationList = 97C146E91CF9000F007C117D /* Build configuration list for PBXProject "Runner" */; + compatibilityVersion = "Xcode 9.3"; + developmentRegion = en; + hasScannedForEncodings = 0; + knownRegions = ( + en, + Base, + ); + mainGroup = 97C146E51CF9000F007C117D; + productRefGroup = 97C146EF1CF9000F007C117D /* Products */; + projectDirPath = ""; + projectRoot = ""; + targets = ( + 97C146ED1CF9000F007C117D /* Runner */, + 331C8080294A63A400263BE5 /* RunnerTests */, + C663DBD22F50907000D79908 /* RideWidgetExtension */, + ); + }; +/* End PBXProject section */ + +/* Begin PBXResourcesBuildPhase section */ + 331C807F294A63A400263BE5 /* Resources */ = { + isa = PBXResourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + runOnlyForDeploymentPostprocessing = 0; + }; + 97C146EC1CF9000F007C117D /* Resources */ = { + isa = PBXResourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + 97C147011CF9000F007C117D /* LaunchScreen.storyboard in Resources */, + 3B3967161E833CAA004F5970 /* AppFrameworkInfo.plist in Resources */, + C62456532E928D5900873892 /* tone2.wav in Resources */, + C62456542E928D5900873892 /* ding.wav in Resources */, + C62456552E928D5900873892 /* promo.wav in Resources */, + C62456562E928D5900873892 /* tone1.mp3 in Resources */, + C62456572E928D5900873892 /* cancel.wav in Resources */, + C62456582E928D5900873892 /* start.wav in Resources */, + 97C146FE1CF9000F007C117D /* Assets.xcassets in Resources */, + C63F78FE2E175599003A6E1F /* Localizable.strings in Resources */, + 97C146FC1CF9000F007C117D /* Main.storyboard in Resources */, + C63F78F72E17536F003A6E1F /* Config.plist in Resources */, + 58553B2A940E5388FFA7BDA2 /* GoogleService-Info.plist in Resources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + C663DBD12F50907000D79908 /* Resources */ = { + isa = PBXResourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXResourcesBuildPhase section */ + +/* Begin PBXShellScriptBuildPhase section */ + 3B06AD1E1E4923F5004D2608 /* Thin Binary */ = { + isa = PBXShellScriptBuildPhase; + alwaysOutOfDate = 1; + buildActionMask = 2147483647; + files = ( + ); + inputPaths = ( + "${TARGET_BUILD_DIR}/${INFOPLIST_PATH}", + ); + name = "Thin Binary"; + outputPaths = ( + ); + runOnlyForDeploymentPostprocessing = 0; + shellPath = /bin/sh; + shellScript = "/bin/sh \"$FLUTTER_ROOT/packages/flutter_tools/bin/xcode_backend.sh\" embed_and_thin"; + }; + 452CB5F4C1DAFD8264FDA955 /* [CP] Check Pods Manifest.lock */ = { + isa = PBXShellScriptBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + inputFileListPaths = ( + ); + inputPaths = ( + "${PODS_PODFILE_DIR_PATH}/Podfile.lock", + "${PODS_ROOT}/Manifest.lock", + ); + name = "[CP] Check Pods Manifest.lock"; + outputFileListPaths = ( + ); + outputPaths = ( + "$(DERIVED_FILE_DIR)/Pods-Runner-checkManifestLockResult.txt", + ); + runOnlyForDeploymentPostprocessing = 0; + shellPath = /bin/sh; + shellScript = "diff \"${PODS_PODFILE_DIR_PATH}/Podfile.lock\" \"${PODS_ROOT}/Manifest.lock\" > /dev/null\nif [ $? != 0 ] ; then\n # print error to STDERR\n echo \"error: The sandbox is not in sync with the Podfile.lock. Run 'pod install' or update your CocoaPods installation.\" >&2\n exit 1\nfi\n# This output is used by Xcode 'outputs' to avoid re-running this script phase.\necho \"SUCCESS\" > \"${SCRIPT_OUTPUT_FILE_0}\"\n"; + showEnvVarsInLog = 0; + }; + 9740EEB61CF901F6004384FC /* Run Script */ = { + isa = PBXShellScriptBuildPhase; + alwaysOutOfDate = 1; + buildActionMask = 2147483647; + files = ( + ); + inputPaths = ( + ); + name = "Run Script"; + outputPaths = ( + ); + runOnlyForDeploymentPostprocessing = 0; + shellPath = /bin/sh; + shellScript = "/bin/sh \"$FLUTTER_ROOT/packages/flutter_tools/bin/xcode_backend.sh\" build"; + }; + 9DE0D475D98797EEBEE003BD /* [CP] Copy Pods Resources */ = { + isa = PBXShellScriptBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + inputFileListPaths = ( + "${PODS_ROOT}/Target Support Files/Pods-Runner/Pods-Runner-resources-${CONFIGURATION}-input-files.xcfilelist", + ); + name = "[CP] Copy Pods Resources"; + outputFileListPaths = ( + "${PODS_ROOT}/Target Support Files/Pods-Runner/Pods-Runner-resources-${CONFIGURATION}-output-files.xcfilelist", + ); + runOnlyForDeploymentPostprocessing = 0; + shellPath = /bin/sh; + shellScript = "\"${PODS_ROOT}/Target Support Files/Pods-Runner/Pods-Runner-resources.sh\"\n"; + showEnvVarsInLog = 0; + }; + B77A6F719CDC97DC7270EA70 /* [CP] Embed Pods Frameworks */ = { + isa = PBXShellScriptBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + inputFileListPaths = ( + "${PODS_ROOT}/Target Support Files/Pods-Runner/Pods-Runner-frameworks-${CONFIGURATION}-input-files.xcfilelist", + ); + name = "[CP] Embed Pods Frameworks"; + outputFileListPaths = ( + "${PODS_ROOT}/Target Support Files/Pods-Runner/Pods-Runner-frameworks-${CONFIGURATION}-output-files.xcfilelist", + ); + runOnlyForDeploymentPostprocessing = 0; + shellPath = /bin/sh; + shellScript = "\"${PODS_ROOT}/Target Support Files/Pods-Runner/Pods-Runner-frameworks.sh\"\n"; + showEnvVarsInLog = 0; + }; + C6C3FB403E5DB104310DE9A1 /* [CP] Check Pods Manifest.lock */ = { + isa = PBXShellScriptBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + inputFileListPaths = ( + ); + inputPaths = ( + "${PODS_PODFILE_DIR_PATH}/Podfile.lock", + "${PODS_ROOT}/Manifest.lock", + ); + name = "[CP] Check Pods Manifest.lock"; + outputFileListPaths = ( + ); + outputPaths = ( + "$(DERIVED_FILE_DIR)/Pods-RunnerTests-checkManifestLockResult.txt", + ); + runOnlyForDeploymentPostprocessing = 0; + shellPath = /bin/sh; + shellScript = "diff \"${PODS_PODFILE_DIR_PATH}/Podfile.lock\" \"${PODS_ROOT}/Manifest.lock\" > /dev/null\nif [ $? != 0 ] ; then\n # print error to STDERR\n echo \"error: The sandbox is not in sync with the Podfile.lock. Run 'pod install' or update your CocoaPods installation.\" >&2\n exit 1\nfi\n# This output is used by Xcode 'outputs' to avoid re-running this script phase.\necho \"SUCCESS\" > \"${SCRIPT_OUTPUT_FILE_0}\"\n"; + showEnvVarsInLog = 0; + }; +/* End PBXShellScriptBuildPhase section */ + +/* Begin PBXSourcesBuildPhase section */ + 331C807D294A63A400263BE5 /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + 331C808B294A63AB00263BE5 /* RunnerTests.swift in Sources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + 97C146EA1CF9000F007C117D /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + 74858FAF1ED2DC5600515810 /* AppDelegate.swift in Sources */, + C63F78FB2E17553F003A6E1F /* KeychainHelper.swift in Sources */, + 1498D2341E8E89220040F4C2 /* GeneratedPluginRegistrant.m in Sources */, + C63F79052E1756CD003A6E1F /* Constants1.swift in Sources */, + C63F79002E1755B9003A6E1F /* JailbreakDetection.swift in Sources */, + C63F79032E175621003A6E1F /* SecurityChecks.m in Sources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + C663DBCF2F50907000D79908 /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXSourcesBuildPhase section */ + +/* Begin PBXTargetDependency section */ + 331C8086294A63A400263BE5 /* PBXTargetDependency */ = { + isa = PBXTargetDependency; + target = 97C146ED1CF9000F007C117D /* Runner */; + targetProxy = 331C8085294A63A400263BE5 /* PBXContainerItemProxy */; + }; + C663DBE52F50907200D79908 /* PBXTargetDependency */ = { + isa = PBXTargetDependency; + target = C663DBD22F50907000D79908 /* RideWidgetExtension */; + targetProxy = C663DBE42F50907200D79908 /* PBXContainerItemProxy */; + }; +/* End PBXTargetDependency section */ + +/* Begin PBXVariantGroup section */ + 97C146FA1CF9000F007C117D /* Main.storyboard */ = { + isa = PBXVariantGroup; + children = ( + 97C146FB1CF9000F007C117D /* Base */, + ); + name = Main.storyboard; + sourceTree = ""; + }; + 97C146FF1CF9000F007C117D /* LaunchScreen.storyboard */ = { + isa = PBXVariantGroup; + children = ( + 97C147001CF9000F007C117D /* Base */, + ); + name = LaunchScreen.storyboard; + sourceTree = ""; + }; + C63F78FC2E175599003A6E1F /* Localizable.strings */ = { + isa = PBXVariantGroup; + children = ( + C63F78FD2E175599003A6E1F /* en */, + ); + name = Localizable.strings; + sourceTree = ""; + }; +/* End PBXVariantGroup section */ + +/* Begin XCBuildConfiguration section */ + 249021D3217E4FDB00AE95B9 /* Profile */ = { + isa = XCBuildConfiguration; + buildSettings = { + ALWAYS_SEARCH_USER_PATHS = NO; + ASSETCATALOG_COMPILER_GENERATE_SWIFT_ASSET_SYMBOL_EXTENSIONS = YES; + CLANG_ANALYZER_NONNULL = YES; + CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; + CLANG_CXX_LIBRARY = "libc++"; + CLANG_ENABLE_MODULES = YES; + CLANG_ENABLE_OBJC_ARC = YES; + CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; + CLANG_WARN_BOOL_CONVERSION = YES; + CLANG_WARN_COMMA = YES; + CLANG_WARN_CONSTANT_CONVERSION = YES; + CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; + CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; + CLANG_WARN_EMPTY_BODY = YES; + CLANG_WARN_ENUM_CONVERSION = YES; + CLANG_WARN_INFINITE_RECURSION = YES; + CLANG_WARN_INT_CONVERSION = YES; + CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; + CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; + CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; + CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; + CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; + CLANG_WARN_STRICT_PROTOTYPES = YES; + CLANG_WARN_SUSPICIOUS_MOVE = YES; + CLANG_WARN_UNREACHABLE_CODE = YES; + CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; + "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; + COPY_PHASE_STRIP = NO; + DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; + ENABLE_NS_ASSERTIONS = NO; + ENABLE_STRICT_OBJC_MSGSEND = YES; + ENABLE_USER_SCRIPT_SANDBOXING = NO; + GCC_C_LANGUAGE_STANDARD = gnu99; + GCC_NO_COMMON_BLOCKS = YES; + GCC_WARN_64_TO_32_BIT_CONVERSION = YES; + GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; + GCC_WARN_UNDECLARED_SELECTOR = YES; + GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; + GCC_WARN_UNUSED_FUNCTION = YES; + GCC_WARN_UNUSED_VARIABLE = YES; + IPHONEOS_DEPLOYMENT_TARGET = 13.0; + MTL_ENABLE_DEBUG_INFO = NO; + SDKROOT = iphoneos; + SUPPORTED_PLATFORMS = iphoneos; + TARGETED_DEVICE_FAMILY = "1,2"; + VALIDATE_PRODUCT = YES; + }; + name = Profile; + }; + 249021D4217E4FDB00AE95B9 /* Profile */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = 7AFA3C8E1D35360C0083082E /* Release.xcconfig */; + buildSettings = { + ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; + CLANG_ENABLE_MODULES = YES; + CODE_SIGN_ENTITLEMENTS = Runner/Runner.entitlements; + CURRENT_PROJECT_VERSION = "$(FLUTTER_BUILD_NUMBER)"; + DEVELOPMENT_TEAM = 63CVT8G5P8; + ENABLE_BITCODE = NO; + INFOPLIST_FILE = Runner/Info.plist; + INFOPLIST_KEY_CFBundleDisplayName = Intaleq; + IPHONEOS_DEPLOYMENT_TARGET = 15.6; + LD_RUNPATH_SEARCH_PATHS = ( + "$(inherited)", + "@executable_path/Frameworks", + ); + PRODUCT_BUNDLE_IDENTIFIER = com.siro.siro_rider; + PRODUCT_NAME = "$(TARGET_NAME)"; + SWIFT_OBJC_BRIDGING_HEADER = "Runner/Runner-Bridging-Header.h"; + SWIFT_VERSION = 5.0; + VERSIONING_SYSTEM = "apple-generic"; + }; + name = Profile; + }; + 331C8088294A63A400263BE5 /* Debug */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = 1D7071657929F2FC24DFA5B6 /* Pods-RunnerTests.debug.xcconfig */; + buildSettings = { + BUNDLE_LOADER = "$(TEST_HOST)"; + CODE_SIGN_STYLE = Automatic; + CURRENT_PROJECT_VERSION = 1; + DEVELOPMENT_TEAM = 63CVT8G5P8; + GENERATE_INFOPLIST_FILE = YES; + MARKETING_VERSION = 1.0; + PRODUCT_BUNDLE_IDENTIFIER = com.siro.siro_rider.RunnerTests; + PRODUCT_NAME = "$(TARGET_NAME)"; + SWIFT_ACTIVE_COMPILATION_CONDITIONS = DEBUG; + SWIFT_OPTIMIZATION_LEVEL = "-Onone"; + SWIFT_VERSION = 5.0; + TEST_HOST = "$(BUILT_PRODUCTS_DIR)/Runner.app/$(BUNDLE_EXECUTABLE_FOLDER_PATH)/Runner"; + }; + name = Debug; + }; + 331C8089294A63A400263BE5 /* Release */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = 580D2D00BBDBCF333EAB7958 /* Pods-RunnerTests.release.xcconfig */; + buildSettings = { + BUNDLE_LOADER = "$(TEST_HOST)"; + CODE_SIGN_STYLE = Automatic; + CURRENT_PROJECT_VERSION = 1; + DEVELOPMENT_TEAM = 63CVT8G5P8; + GENERATE_INFOPLIST_FILE = YES; + MARKETING_VERSION = 1.0; + PRODUCT_BUNDLE_IDENTIFIER = com.siro.siro_rider.RunnerTests; + PRODUCT_NAME = "$(TARGET_NAME)"; + SWIFT_VERSION = 5.0; + TEST_HOST = "$(BUILT_PRODUCTS_DIR)/Runner.app/$(BUNDLE_EXECUTABLE_FOLDER_PATH)/Runner"; + }; + name = Release; + }; + 331C808A294A63A400263BE5 /* Profile */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = 2EF430BD3979899C7676768C /* Pods-RunnerTests.profile.xcconfig */; + buildSettings = { + BUNDLE_LOADER = "$(TEST_HOST)"; + CODE_SIGN_STYLE = Automatic; + CURRENT_PROJECT_VERSION = 1; + DEVELOPMENT_TEAM = 63CVT8G5P8; + GENERATE_INFOPLIST_FILE = YES; + MARKETING_VERSION = 1.0; + PRODUCT_BUNDLE_IDENTIFIER = com.siro.siro_rider.RunnerTests; + PRODUCT_NAME = "$(TARGET_NAME)"; + SWIFT_VERSION = 5.0; + TEST_HOST = "$(BUILT_PRODUCTS_DIR)/Runner.app/$(BUNDLE_EXECUTABLE_FOLDER_PATH)/Runner"; + }; + name = Profile; + }; + 97C147031CF9000F007C117D /* Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + ALWAYS_SEARCH_USER_PATHS = NO; + ASSETCATALOG_COMPILER_GENERATE_SWIFT_ASSET_SYMBOL_EXTENSIONS = AppIcon; + CLANG_ANALYZER_NONNULL = YES; + CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; + CLANG_CXX_LIBRARY = "libc++"; + CLANG_ENABLE_MODULES = YES; + CLANG_ENABLE_OBJC_ARC = YES; + CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; + CLANG_WARN_BOOL_CONVERSION = YES; + CLANG_WARN_COMMA = YES; + CLANG_WARN_CONSTANT_CONVERSION = YES; + CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; + CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; + CLANG_WARN_EMPTY_BODY = YES; + CLANG_WARN_ENUM_CONVERSION = YES; + CLANG_WARN_INFINITE_RECURSION = YES; + CLANG_WARN_INT_CONVERSION = YES; + CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; + CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; + CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; + CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; + CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; + CLANG_WARN_STRICT_PROTOTYPES = YES; + CLANG_WARN_SUSPICIOUS_MOVE = YES; + CLANG_WARN_UNREACHABLE_CODE = YES; + CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; + "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; + COPY_PHASE_STRIP = NO; + DEBUG_INFORMATION_FORMAT = dwarf; + ENABLE_STRICT_OBJC_MSGSEND = YES; + ENABLE_TESTABILITY = YES; + ENABLE_USER_SCRIPT_SANDBOXING = NO; + GCC_C_LANGUAGE_STANDARD = gnu99; + GCC_DYNAMIC_NO_PIC = NO; + GCC_NO_COMMON_BLOCKS = YES; + GCC_OPTIMIZATION_LEVEL = 0; + GCC_PREPROCESSOR_DEFINITIONS = ( + "DEBUG=1", + "$(inherited)", + ); + GCC_WARN_64_TO_32_BIT_CONVERSION = YES; + GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; + GCC_WARN_UNDECLARED_SELECTOR = YES; + GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; + GCC_WARN_UNUSED_FUNCTION = YES; + GCC_WARN_UNUSED_VARIABLE = YES; + IPHONEOS_DEPLOYMENT_TARGET = 13.0; + MTL_ENABLE_DEBUG_INFO = YES; + ONLY_ACTIVE_ARCH = YES; + SDKROOT = iphoneos; + TARGETED_DEVICE_FAMILY = "1,2"; + }; + name = Debug; + }; + 97C147041CF9000F007C117D /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + ALWAYS_SEARCH_USER_PATHS = NO; + ASSETCATALOG_COMPILER_GENERATE_SWIFT_ASSET_SYMBOL_EXTENSIONS = AppIcon; + CLANG_ANALYZER_NONNULL = YES; + CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; + CLANG_CXX_LIBRARY = "libc++"; + CLANG_ENABLE_MODULES = YES; + CLANG_ENABLE_OBJC_ARC = YES; + CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; + CLANG_WARN_BOOL_CONVERSION = YES; + CLANG_WARN_COMMA = YES; + CLANG_WARN_CONSTANT_CONVERSION = YES; + CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; + CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; + CLANG_WARN_EMPTY_BODY = YES; + CLANG_WARN_ENUM_CONVERSION = YES; + CLANG_WARN_INFINITE_RECURSION = YES; + CLANG_WARN_INT_CONVERSION = YES; + CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; + CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; + CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; + CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; + CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; + CLANG_WARN_STRICT_PROTOTYPES = YES; + CLANG_WARN_SUSPICIOUS_MOVE = YES; + CLANG_WARN_UNREACHABLE_CODE = YES; + CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; + "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; + COPY_PHASE_STRIP = NO; + DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; + ENABLE_NS_ASSERTIONS = NO; + ENABLE_STRICT_OBJC_MSGSEND = YES; + ENABLE_USER_SCRIPT_SANDBOXING = NO; + GCC_C_LANGUAGE_STANDARD = gnu99; + GCC_NO_COMMON_BLOCKS = YES; + GCC_WARN_64_TO_32_BIT_CONVERSION = YES; + GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; + GCC_WARN_UNDECLARED_SELECTOR = YES; + GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; + GCC_WARN_UNUSED_FUNCTION = YES; + GCC_WARN_UNUSED_VARIABLE = YES; + IPHONEOS_DEPLOYMENT_TARGET = 13.0; + MTL_ENABLE_DEBUG_INFO = NO; + SDKROOT = iphoneos; + SUPPORTED_PLATFORMS = iphoneos; + SWIFT_COMPILATION_MODE = wholemodule; + SWIFT_OPTIMIZATION_LEVEL = "-O"; + TARGETED_DEVICE_FAMILY = "1,2"; + VALIDATE_PRODUCT = YES; + }; + name = Release; + }; + 97C147061CF9000F007C117D /* Debug */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = 9740EEB21CF90195004384FC /* Debug.xcconfig */; + buildSettings = { + ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; + CLANG_ENABLE_MODULES = YES; + CODE_SIGN_ENTITLEMENTS = Runner/Runner.entitlements; + CURRENT_PROJECT_VERSION = "$(FLUTTER_BUILD_NUMBER)"; + DEVELOPMENT_TEAM = 63CVT8G5P8; + ENABLE_BITCODE = NO; + INFOPLIST_FILE = Runner/Info.plist; + INFOPLIST_KEY_CFBundleDisplayName = Intaleq; + IPHONEOS_DEPLOYMENT_TARGET = 15.6; + LD_RUNPATH_SEARCH_PATHS = ( + "$(inherited)", + "@executable_path/Frameworks", + ); + PRODUCT_BUNDLE_IDENTIFIER = com.siro.siro_rider; + PRODUCT_NAME = "$(TARGET_NAME)"; + SWIFT_OBJC_BRIDGING_HEADER = "Runner/Runner-Bridging-Header.h"; + SWIFT_OPTIMIZATION_LEVEL = "-Onone"; + SWIFT_VERSION = 5.0; + VERSIONING_SYSTEM = "apple-generic"; + }; + name = Debug; + }; + 97C147071CF9000F007C117D /* Release */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = 7AFA3C8E1D35360C0083082E /* Release.xcconfig */; + buildSettings = { + ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; + CLANG_ENABLE_MODULES = YES; + CODE_SIGN_ENTITLEMENTS = Runner/Runner.entitlements; + CURRENT_PROJECT_VERSION = "$(FLUTTER_BUILD_NUMBER)"; + DEVELOPMENT_TEAM = 63CVT8G5P8; + ENABLE_BITCODE = NO; + INFOPLIST_FILE = Runner/Info.plist; + INFOPLIST_KEY_CFBundleDisplayName = Intaleq; + IPHONEOS_DEPLOYMENT_TARGET = 15.6; + LD_RUNPATH_SEARCH_PATHS = ( + "$(inherited)", + "@executable_path/Frameworks", + ); + PRODUCT_BUNDLE_IDENTIFIER = com.siro.siro_rider; + PRODUCT_NAME = "$(TARGET_NAME)"; + SWIFT_OBJC_BRIDGING_HEADER = "Runner/Runner-Bridging-Header.h"; + SWIFT_VERSION = 5.0; + VERSIONING_SYSTEM = "apple-generic"; + }; + name = Release; + }; + C663DBE82F50907200D79908 /* Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + ASSETCATALOG_COMPILER_GENERATE_SWIFT_ASSET_SYMBOL_EXTENSIONS = YES; + ASSETCATALOG_COMPILER_GLOBAL_ACCENT_COLOR_NAME = AccentColor; + ASSETCATALOG_COMPILER_WIDGET_BACKGROUND_COLOR_NAME = WidgetBackground; + CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE; + CLANG_CXX_LANGUAGE_STANDARD = "gnu++20"; + CLANG_ENABLE_OBJC_WEAK = YES; + CLANG_WARN_DOCUMENTATION_COMMENTS = YES; + CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = YES; + CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE; + CODE_SIGN_ENTITLEMENTS = RideWidgetExtension.entitlements; + CODE_SIGN_STYLE = Automatic; + CURRENT_PROJECT_VERSION = 1; + DEVELOPMENT_TEAM = 63CVT8G5P8; + ENABLE_USER_SCRIPT_SANDBOXING = YES; + GCC_C_LANGUAGE_STANDARD = gnu17; + GENERATE_INFOPLIST_FILE = YES; + INFOPLIST_FILE = RideWidget/Info.plist; + INFOPLIST_KEY_CFBundleDisplayName = RideWidget; + INFOPLIST_KEY_NSHumanReadableCopyright = ""; + IPHONEOS_DEPLOYMENT_TARGET = 26.0; + LD_RUNPATH_SEARCH_PATHS = ( + "$(inherited)", + "@executable_path/Frameworks", + "@executable_path/../../Frameworks", + ); + LOCALIZATION_PREFERS_STRING_CATALOGS = YES; + MARKETING_VERSION = 1.0; + MTL_ENABLE_DEBUG_INFO = INCLUDE_SOURCE; + MTL_FAST_MATH = YES; + PRODUCT_BUNDLE_IDENTIFIER = com.siro.siro_rider.RideWidget; + PRODUCT_NAME = "$(TARGET_NAME)"; + SKIP_INSTALL = YES; + STRING_CATALOG_GENERATE_SYMBOLS = YES; + SWIFT_ACTIVE_COMPILATION_CONDITIONS = "DEBUG $(inherited)"; + SWIFT_APPROACHABLE_CONCURRENCY = YES; + SWIFT_EMIT_LOC_STRINGS = YES; + SWIFT_OPTIMIZATION_LEVEL = "-Onone"; + SWIFT_UPCOMING_FEATURE_MEMBER_IMPORT_VISIBILITY = YES; + SWIFT_VERSION = 5.0; + TARGETED_DEVICE_FAMILY = "1,2"; + }; + name = Debug; + }; + C663DBE92F50907200D79908 /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + ASSETCATALOG_COMPILER_GENERATE_SWIFT_ASSET_SYMBOL_EXTENSIONS = YES; + ASSETCATALOG_COMPILER_GLOBAL_ACCENT_COLOR_NAME = AccentColor; + ASSETCATALOG_COMPILER_WIDGET_BACKGROUND_COLOR_NAME = WidgetBackground; + CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE; + CLANG_CXX_LANGUAGE_STANDARD = "gnu++20"; + CLANG_ENABLE_OBJC_WEAK = YES; + CLANG_WARN_DOCUMENTATION_COMMENTS = YES; + CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = YES; + CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE; + CODE_SIGN_ENTITLEMENTS = RideWidgetExtension.entitlements; + CODE_SIGN_STYLE = Automatic; + CURRENT_PROJECT_VERSION = 1; + DEVELOPMENT_TEAM = 63CVT8G5P8; + ENABLE_USER_SCRIPT_SANDBOXING = YES; + GCC_C_LANGUAGE_STANDARD = gnu17; + GENERATE_INFOPLIST_FILE = YES; + INFOPLIST_FILE = RideWidget/Info.plist; + INFOPLIST_KEY_CFBundleDisplayName = RideWidget; + INFOPLIST_KEY_NSHumanReadableCopyright = ""; + IPHONEOS_DEPLOYMENT_TARGET = 26.0; + LD_RUNPATH_SEARCH_PATHS = ( + "$(inherited)", + "@executable_path/Frameworks", + "@executable_path/../../Frameworks", + ); + LOCALIZATION_PREFERS_STRING_CATALOGS = YES; + MARKETING_VERSION = 1.0; + MTL_FAST_MATH = YES; + PRODUCT_BUNDLE_IDENTIFIER = com.siro.siro_rider.RideWidget; + PRODUCT_NAME = "$(TARGET_NAME)"; + SKIP_INSTALL = YES; + STRING_CATALOG_GENERATE_SYMBOLS = YES; + SWIFT_APPROACHABLE_CONCURRENCY = YES; + SWIFT_EMIT_LOC_STRINGS = YES; + SWIFT_UPCOMING_FEATURE_MEMBER_IMPORT_VISIBILITY = YES; + SWIFT_VERSION = 5.0; + TARGETED_DEVICE_FAMILY = "1,2"; + }; + name = Release; + }; + C663DBEA2F50907200D79908 /* Profile */ = { + isa = XCBuildConfiguration; + buildSettings = { + ASSETCATALOG_COMPILER_GENERATE_SWIFT_ASSET_SYMBOL_EXTENSIONS = YES; + ASSETCATALOG_COMPILER_GLOBAL_ACCENT_COLOR_NAME = AccentColor; + ASSETCATALOG_COMPILER_WIDGET_BACKGROUND_COLOR_NAME = WidgetBackground; + CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE; + CLANG_CXX_LANGUAGE_STANDARD = "gnu++20"; + CLANG_ENABLE_OBJC_WEAK = YES; + CLANG_WARN_DOCUMENTATION_COMMENTS = YES; + CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = YES; + CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE; + CODE_SIGN_ENTITLEMENTS = RideWidgetExtension.entitlements; + CODE_SIGN_STYLE = Automatic; + CURRENT_PROJECT_VERSION = 1; + DEVELOPMENT_TEAM = 63CVT8G5P8; + ENABLE_USER_SCRIPT_SANDBOXING = YES; + GCC_C_LANGUAGE_STANDARD = gnu17; + GENERATE_INFOPLIST_FILE = YES; + INFOPLIST_FILE = RideWidget/Info.plist; + INFOPLIST_KEY_CFBundleDisplayName = RideWidget; + INFOPLIST_KEY_NSHumanReadableCopyright = ""; + IPHONEOS_DEPLOYMENT_TARGET = 26.0; + LD_RUNPATH_SEARCH_PATHS = ( + "$(inherited)", + "@executable_path/Frameworks", + "@executable_path/../../Frameworks", + ); + LOCALIZATION_PREFERS_STRING_CATALOGS = YES; + MARKETING_VERSION = 1.0; + MTL_FAST_MATH = YES; + PRODUCT_BUNDLE_IDENTIFIER = com.siro.siro_rider.RideWidget; + PRODUCT_NAME = "$(TARGET_NAME)"; + SKIP_INSTALL = YES; + STRING_CATALOG_GENERATE_SYMBOLS = YES; + SWIFT_APPROACHABLE_CONCURRENCY = YES; + SWIFT_EMIT_LOC_STRINGS = YES; + SWIFT_UPCOMING_FEATURE_MEMBER_IMPORT_VISIBILITY = YES; + SWIFT_VERSION = 5.0; + TARGETED_DEVICE_FAMILY = "1,2"; + }; + name = Profile; + }; +/* End XCBuildConfiguration section */ + +/* Begin XCConfigurationList section */ + 331C8087294A63A400263BE5 /* Build configuration list for PBXNativeTarget "RunnerTests" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 331C8088294A63A400263BE5 /* Debug */, + 331C8089294A63A400263BE5 /* Release */, + 331C808A294A63A400263BE5 /* Profile */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; + 97C146E91CF9000F007C117D /* Build configuration list for PBXProject "Runner" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 97C147031CF9000F007C117D /* Debug */, + 97C147041CF9000F007C117D /* Release */, + 249021D3217E4FDB00AE95B9 /* Profile */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; + 97C147051CF9000F007C117D /* Build configuration list for PBXNativeTarget "Runner" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 97C147061CF9000F007C117D /* Debug */, + 97C147071CF9000F007C117D /* Release */, + 249021D4217E4FDB00AE95B9 /* Profile */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; + C663DBEC2F50907200D79908 /* Build configuration list for PBXNativeTarget "RideWidgetExtension" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + C663DBE82F50907200D79908 /* Debug */, + C663DBE92F50907200D79908 /* Release */, + C663DBEA2F50907200D79908 /* Profile */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; +/* End XCConfigurationList section */ + }; + rootObject = 97C146E61CF9000F007C117D /* Project object */; +} diff --git a/siro_rider/ios/Runner.xcodeproj/project.xcworkspace/contents.xcworkspacedata b/siro_rider/ios/Runner.xcodeproj/project.xcworkspace/contents.xcworkspacedata new file mode 100644 index 0000000..919434a --- /dev/null +++ b/siro_rider/ios/Runner.xcodeproj/project.xcworkspace/contents.xcworkspacedata @@ -0,0 +1,7 @@ + + + + + diff --git a/siro_rider/ios/Runner.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist b/siro_rider/ios/Runner.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist new file mode 100644 index 0000000..18d9810 --- /dev/null +++ b/siro_rider/ios/Runner.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist @@ -0,0 +1,8 @@ + + + + + IDEDidComputeMac32BitWarning + + + diff --git a/siro_rider/ios/Runner.xcodeproj/project.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings b/siro_rider/ios/Runner.xcodeproj/project.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings new file mode 100644 index 0000000..f9b0d7c --- /dev/null +++ b/siro_rider/ios/Runner.xcodeproj/project.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings @@ -0,0 +1,8 @@ + + + + + PreviewsEnabled + + + diff --git a/siro_rider/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme b/siro_rider/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme new file mode 100644 index 0000000..e3773d4 --- /dev/null +++ b/siro_rider/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme @@ -0,0 +1,101 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/siro_rider/ios/Runner.xcworkspace/contents.xcworkspacedata b/siro_rider/ios/Runner.xcworkspace/contents.xcworkspacedata new file mode 100644 index 0000000..21a3cc1 --- /dev/null +++ b/siro_rider/ios/Runner.xcworkspace/contents.xcworkspacedata @@ -0,0 +1,10 @@ + + + + + + + diff --git a/siro_rider/ios/Runner/ / SecurityChecks.h / Runner / / Created by Hamza Aleghwairyeen on 12/03/2025. / /#ifndef SecurityChecks_h /#define SecurityChecks_h / / /#endif /* SecurityChecks_h */ / SecurityChecks.h #import #import / Import UIKit @interface SecurityChecks : NSObject + (BOOL)isDeviceCompromised; / Combined check @end SecurityChecks.m b/siro_rider/ios/Runner/ / SecurityChecks.h / Runner / / Created by Hamza Aleghwairyeen on 12/03/2025. / /#ifndef SecurityChecks_h /#define SecurityChecks_h / / /#endif /* SecurityChecks_h */ / SecurityChecks.h #import #import / Import UIKit @interface SecurityChecks : NSObject + (BOOL)isDeviceCompromised; / Combined check @end SecurityChecks.m new file mode 100644 index 0000000..752d891 --- /dev/null +++ b/siro_rider/ios/Runner/ / SecurityChecks.h / Runner / / Created by Hamza Aleghwairyeen on 12/03/2025. / /#ifndef SecurityChecks_h /#define SecurityChecks_h / / /#endif /* SecurityChecks_h */ / SecurityChecks.h #import #import / Import UIKit @interface SecurityChecks : NSObject + (BOOL)isDeviceCompromised; / Combined check @end SecurityChecks.m @@ -0,0 +1,197 @@ +// +// SecurityChecks.m +// Runner +// +// Created by Hamza Aleghwairyeen on 12/03/2025. +// + +#import + + + +#import "SecurityChecks.h" +#import +#include +#import +#include // For _dyld_image_count and _dyld_get_image_name +#include // for fork() +#include //for socket, connect +#include // for sockaddr_in +#include // for inet_pton + +@implementation SecurityChecks + ++ (BOOL)isDeviceJailbroken { + // (Same jailbreak checks as before - from previous responses) + // 1. Check for common jailbreak files + NSArray *jailbreakPaths = @[ + @"/Applications/Cydia.app", +// #if !TARGET_IPHONE_SIMULATOR +// @"/bin/bash", +// #endif + @"/Library/MobileSubstrate/MobileSubstrate.dylib", + @"/bin/bash", + @"/usr/sbin/sshd", + @"/etc/apt", + @"/private/var/lib/apt/", + @"/private/var/tmp/cydia.log", + ]; + + for (NSString *path in jailbreakPaths) { + if ([[NSFileManager defaultManager] fileExistsAtPath:path]) { + NSLog(@"Jailbreak file detected: %@", path); + return YES; + } + } + + // 2. Check if we can write outside the sandbox (a strong indicator) + NSError *error = nil; + NSString *testPath = @"/private/jailbreaktest.txt"; + [@"test" writeToFile:testPath atomically:YES encoding:NSUTF8StringEncoding error:&error]; + + if (!error) { + // If we can write, it's jailbroken. Remove the file immediately. + [[NSFileManager defaultManager] removeItemAtPath:testPath error:nil]; + NSLog(@"Sandbox write test indicates jailbreak."); + return YES; + } + //3: Check for existence of the symbolic link /Applications. + struct stat s; + if (lstat("/Applications", &s) == 0) { + if (S_ISLNK(s.st_mode)) { + NSLog(@"Symbolic link /Applications exists, jailbroken"); + return YES; + } + } + + //4:Check for dyld Libraries + uint32_t count = _dyld_image_count(); + for (uint32_t i = 0 ; i < count ; ++i) { + const char *dyld = _dyld_get_image_name(i); + if (strstr(dyld, "MobileSubstrate") != NULL || strstr(dyld, "libcycript") != NULL) { + NSLog(@"Suspicious dyld library found: %s", dyld); + return YES; + } + } + + //5 Check if fork() is available. Sandboxed apps should not be able to call fork(). + #if !TARGET_IPHONE_SIMULATOR // Don't run this on the simulator + int pid = fork(); + if (pid == 0) + { + //in child, exit immediately to avoid crashing. + exit(0); + } else if (pid > 0) + { + NSLog(@"Fork available. Likely jailbroken."); + return YES; // Fork succeeded; likely jailbroken + } + #endif + + return NO; // No jailbreak indicators found +} ++ (BOOL)isDebuggerAttached { + int mib[4]; + struct kinfo_proc info; + size_t size = sizeof(info); + + mib[0] = CTL_KERN; + mib[1] = KERN_PROC; + mib[2] = KERN_PROC_PID; + mib[3] = getpid(); + + sysctl(mib, 4, &info, &size, NULL, 0); + + return (info.kp_proc.p_flag & P_TRACED) != 0; +} + +// Check for Frida's default port ++ (BOOL)isFridaListeningOnDefaultPort { + int sock = socket(AF_INET, SOCK_STREAM, 0); + if (sock == -1) { + return NO; // Couldn't create socket + } + + struct sockaddr_in sa; + memset(&sa, 0, sizeof(sa)); + sa.sin_family = AF_INET; + sa.sin_port = htons(27042); // Default Frida port + inet_pton(AF_INET, "127.0.0.1", &sa.sin_addr); + + if (connect(sock, (struct sockaddr *)&sa, sizeof(sa)) != -1) { + NSLog(@"Frida default port (27042) is open."); + close(sock); + return YES; + } + + close(sock); + return NO; +} + + ++ (BOOL)isFridaDetected { + int name[] = { CTL_KERN, KERN_PROC, KERN_PROC_ALL, 0 }; + size_t length; + struct kinfo_proc *procs, *proc; + + sysctl(name, 3, NULL, &length, NULL, 0); + procs = malloc(length); + sysctl(name, 3, procs, &length, NULL, 0); + + for (proc = procs; (char *)proc < (char *)procs + length; proc++) { + if (strstr(proc->kp_proc.p_comm, "frida") != NULL) { + free(procs); + return YES; + } + } + + free(procs); + return NO; +} +// Check for loaded dylibs that indicate Frida ++(BOOL) checkForFridaDylib{ + uint32_t count = _dyld_image_count(); + for (uint32_t i = 0 ; i < count ; ++i) { + const char *dyld = _dyld_get_image_name(i); + if (strstr(dyld, "FridaGadget") != NULL) { // Look for FridaGadget + NSLog(@"FridaGadget dylib found: %s", dyld); + return YES; + } + } + return NO; +} + +// Check process name ++ (BOOL)checkProcessName { + NSString* processName = [[NSProcessInfo processInfo] processName]; + if ([processName containsString:@"Frida"]) { + return YES; + } + return NO; +} + +// A combined check for jailbreak and Frida ++ (BOOL)isDeviceCompromised { + if ([SecurityChecks isDeviceJailbroken]) { + return YES; + } + if ([SecurityChecks isFridaListeningOnDefaultPort]) { + return YES; + } + if ([SecurityChecks checkForFridaDylib]) { + return YES; + } + if([SecurityChecks checkProcessName]){ + return YES; + } +// if ([SecurityChecks isDebuggerAttached]) { +// return YES; +// } +// if ([SecurityChecks isFridaDetected]) { +// return YES; +// } + + return NO; +} + +@end diff --git a/siro_rider/ios/Runner/ / SecurityChecks.h / Runner / / Created by Hamza Aleghwairyeen on 12/03/2025. / /#ifndef SecurityChecks_h /#define SecurityChecks_h / / /#endif /* SecurityChecks_h */ / SecurityChecks.h #import #import / Import UIKit @interface SecurityChecks : NSObject + (BOOL)isDeviceCompromised; /SecurityChecks.m b/siro_rider/ios/Runner/ / SecurityChecks.h / Runner / / Created by Hamza Aleghwairyeen on 12/03/2025. / /#ifndef SecurityChecks_h /#define SecurityChecks_h / / /#endif /* SecurityChecks_h */ / SecurityChecks.h #import #import / Import UIKit @interface SecurityChecks : NSObject + (BOOL)isDeviceCompromised; /SecurityChecks.m new file mode 100644 index 0000000..752d891 --- /dev/null +++ b/siro_rider/ios/Runner/ / SecurityChecks.h / Runner / / Created by Hamza Aleghwairyeen on 12/03/2025. / /#ifndef SecurityChecks_h /#define SecurityChecks_h / / /#endif /* SecurityChecks_h */ / SecurityChecks.h #import #import / Import UIKit @interface SecurityChecks : NSObject + (BOOL)isDeviceCompromised; /SecurityChecks.m @@ -0,0 +1,197 @@ +// +// SecurityChecks.m +// Runner +// +// Created by Hamza Aleghwairyeen on 12/03/2025. +// + +#import + + + +#import "SecurityChecks.h" +#import +#include +#import +#include // For _dyld_image_count and _dyld_get_image_name +#include // for fork() +#include //for socket, connect +#include // for sockaddr_in +#include // for inet_pton + +@implementation SecurityChecks + ++ (BOOL)isDeviceJailbroken { + // (Same jailbreak checks as before - from previous responses) + // 1. Check for common jailbreak files + NSArray *jailbreakPaths = @[ + @"/Applications/Cydia.app", +// #if !TARGET_IPHONE_SIMULATOR +// @"/bin/bash", +// #endif + @"/Library/MobileSubstrate/MobileSubstrate.dylib", + @"/bin/bash", + @"/usr/sbin/sshd", + @"/etc/apt", + @"/private/var/lib/apt/", + @"/private/var/tmp/cydia.log", + ]; + + for (NSString *path in jailbreakPaths) { + if ([[NSFileManager defaultManager] fileExistsAtPath:path]) { + NSLog(@"Jailbreak file detected: %@", path); + return YES; + } + } + + // 2. Check if we can write outside the sandbox (a strong indicator) + NSError *error = nil; + NSString *testPath = @"/private/jailbreaktest.txt"; + [@"test" writeToFile:testPath atomically:YES encoding:NSUTF8StringEncoding error:&error]; + + if (!error) { + // If we can write, it's jailbroken. Remove the file immediately. + [[NSFileManager defaultManager] removeItemAtPath:testPath error:nil]; + NSLog(@"Sandbox write test indicates jailbreak."); + return YES; + } + //3: Check for existence of the symbolic link /Applications. + struct stat s; + if (lstat("/Applications", &s) == 0) { + if (S_ISLNK(s.st_mode)) { + NSLog(@"Symbolic link /Applications exists, jailbroken"); + return YES; + } + } + + //4:Check for dyld Libraries + uint32_t count = _dyld_image_count(); + for (uint32_t i = 0 ; i < count ; ++i) { + const char *dyld = _dyld_get_image_name(i); + if (strstr(dyld, "MobileSubstrate") != NULL || strstr(dyld, "libcycript") != NULL) { + NSLog(@"Suspicious dyld library found: %s", dyld); + return YES; + } + } + + //5 Check if fork() is available. Sandboxed apps should not be able to call fork(). + #if !TARGET_IPHONE_SIMULATOR // Don't run this on the simulator + int pid = fork(); + if (pid == 0) + { + //in child, exit immediately to avoid crashing. + exit(0); + } else if (pid > 0) + { + NSLog(@"Fork available. Likely jailbroken."); + return YES; // Fork succeeded; likely jailbroken + } + #endif + + return NO; // No jailbreak indicators found +} ++ (BOOL)isDebuggerAttached { + int mib[4]; + struct kinfo_proc info; + size_t size = sizeof(info); + + mib[0] = CTL_KERN; + mib[1] = KERN_PROC; + mib[2] = KERN_PROC_PID; + mib[3] = getpid(); + + sysctl(mib, 4, &info, &size, NULL, 0); + + return (info.kp_proc.p_flag & P_TRACED) != 0; +} + +// Check for Frida's default port ++ (BOOL)isFridaListeningOnDefaultPort { + int sock = socket(AF_INET, SOCK_STREAM, 0); + if (sock == -1) { + return NO; // Couldn't create socket + } + + struct sockaddr_in sa; + memset(&sa, 0, sizeof(sa)); + sa.sin_family = AF_INET; + sa.sin_port = htons(27042); // Default Frida port + inet_pton(AF_INET, "127.0.0.1", &sa.sin_addr); + + if (connect(sock, (struct sockaddr *)&sa, sizeof(sa)) != -1) { + NSLog(@"Frida default port (27042) is open."); + close(sock); + return YES; + } + + close(sock); + return NO; +} + + ++ (BOOL)isFridaDetected { + int name[] = { CTL_KERN, KERN_PROC, KERN_PROC_ALL, 0 }; + size_t length; + struct kinfo_proc *procs, *proc; + + sysctl(name, 3, NULL, &length, NULL, 0); + procs = malloc(length); + sysctl(name, 3, procs, &length, NULL, 0); + + for (proc = procs; (char *)proc < (char *)procs + length; proc++) { + if (strstr(proc->kp_proc.p_comm, "frida") != NULL) { + free(procs); + return YES; + } + } + + free(procs); + return NO; +} +// Check for loaded dylibs that indicate Frida ++(BOOL) checkForFridaDylib{ + uint32_t count = _dyld_image_count(); + for (uint32_t i = 0 ; i < count ; ++i) { + const char *dyld = _dyld_get_image_name(i); + if (strstr(dyld, "FridaGadget") != NULL) { // Look for FridaGadget + NSLog(@"FridaGadget dylib found: %s", dyld); + return YES; + } + } + return NO; +} + +// Check process name ++ (BOOL)checkProcessName { + NSString* processName = [[NSProcessInfo processInfo] processName]; + if ([processName containsString:@"Frida"]) { + return YES; + } + return NO; +} + +// A combined check for jailbreak and Frida ++ (BOOL)isDeviceCompromised { + if ([SecurityChecks isDeviceJailbroken]) { + return YES; + } + if ([SecurityChecks isFridaListeningOnDefaultPort]) { + return YES; + } + if ([SecurityChecks checkForFridaDylib]) { + return YES; + } + if([SecurityChecks checkProcessName]){ + return YES; + } +// if ([SecurityChecks isDebuggerAttached]) { +// return YES; +// } +// if ([SecurityChecks isFridaDetected]) { +// return YES; +// } + + return NO; +} + +@end diff --git a/siro_rider/ios/Runner/AppDelegate.swift b/siro_rider/ios/Runner/AppDelegate.swift new file mode 100644 index 0000000..7d3e383 --- /dev/null +++ b/siro_rider/ios/Runner/AppDelegate.swift @@ -0,0 +1,106 @@ +import UIKit +import Flutter +import FirebaseCore + +@main +@objc class AppDelegate: FlutterAppDelegate { + + override func application( + _ application: UIApplication, + didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]? + ) -> Bool { + + + + // --- 2. تهيئة Firebase --- + FirebaseApp.configure() + + // --- 3. فحص الأمان قبل تشغيل الواجهة الرئيسية --- + // ملاحظة: هذا يعتمد على وجود ملفات SecurityChecks في مشروعك + if SecurityChecks.isDeviceCompromised() { + showSecurityAlert() + return false // يمنع إكمال تشغيل التطبيق + } + + // --- 4. إعداد قناة الاتصال مع فلاتر --- + setupMethodChannel() + + GeneratedPluginRegistrant.register(with: self) + return super.application(application, didFinishLaunchingWithOptions: launchOptions) + } + + // --- دالة إعداد قناة الاتصال مع تعديل الاسم --- + func setupMethodChannel() { + guard let controller = window?.rootViewController as? FlutterViewController else { + return + } + + // !! تعديل مهم جداً: تم تغيير اسم القناة ليتوافق مع اسم تطبيقك الجديد + let channel = FlutterMethodChannel(name: "com.siro.siro_rider/security", + binaryMessenger: controller.binaryMessenger) + + channel.setMethodCallHandler { call, result in + switch call.method { + case "isNativeRooted": + // يتم إرجاع نتيجة فحص الأمان مباشرة + result(SecurityChecks.isDeviceCompromised()) + default: + result(FlutterMethodNotImplemented) + } + } + } + + // --- كل الدوال المساعدة من الكود القديم تم نسخها كما هي --- + + func showSecurityAlert() { + guard let rootVC = UIApplication.shared.keyWindow?.rootViewController else { + exit(0) + } + + let alert = UIAlertController( + title: "Security Warning".localized, + message: "Compromised device detected. Exiting.".localized, + preferredStyle: .alert + ) + + alert.addAction(UIAlertAction(title: "OK".localized, style: .destructive) { _ in + self.obfuscatedExit() + }) + + // لمنع إغلاق التنبيه + if #available(iOS 15.0, *) { + alert.presentationController?.delegate = self + } + + rootVC.present(alert, animated: true, completion: nil) + } + + func obfuscatedExit() { + let selector = NSSelectorFromString(String(format: "%@%@", "ex", "it:")) + if responds(to: selector) { + perform(selector, with: 0) + } + } + + +} + +// --- الامتدادات (Extensions) من الكود القديم --- + +// لمنع إغلاق نافذة التنبيه +extension AppDelegate: UIAdaptivePresentationControllerDelegate { + func presentationControllerShouldDismiss(_ presentationController: UIPresentationController) -> Bool { + return false + } + + func presentationControllerDidAttemptToDismiss(_ presentationController: UIPresentationController) { + // لا تفعل شيئاً عند محاولة الإغلاق + } +} + +// لسهولة الترجمة +extension String { + var localized: String { + return NSLocalizedString(self, tableName: nil, bundle: Bundle.main, value: "", comment: "") + } +} diff --git a/siro_rider/ios/Runner/Assets.xcassets/AppIcon.appiconset/100.png b/siro_rider/ios/Runner/Assets.xcassets/AppIcon.appiconset/100.png new file mode 100644 index 0000000..c0a8eb7 Binary files /dev/null and b/siro_rider/ios/Runner/Assets.xcassets/AppIcon.appiconset/100.png differ diff --git a/siro_rider/ios/Runner/Assets.xcassets/AppIcon.appiconset/1024.png b/siro_rider/ios/Runner/Assets.xcassets/AppIcon.appiconset/1024.png new file mode 100644 index 0000000..cd9a8c1 Binary files /dev/null and b/siro_rider/ios/Runner/Assets.xcassets/AppIcon.appiconset/1024.png differ diff --git a/siro_rider/ios/Runner/Assets.xcassets/AppIcon.appiconset/114.png b/siro_rider/ios/Runner/Assets.xcassets/AppIcon.appiconset/114.png new file mode 100644 index 0000000..5aee621 Binary files /dev/null and b/siro_rider/ios/Runner/Assets.xcassets/AppIcon.appiconset/114.png differ diff --git a/siro_rider/ios/Runner/Assets.xcassets/AppIcon.appiconset/120.png b/siro_rider/ios/Runner/Assets.xcassets/AppIcon.appiconset/120.png new file mode 100644 index 0000000..eb36ac3 Binary files /dev/null and b/siro_rider/ios/Runner/Assets.xcassets/AppIcon.appiconset/120.png differ diff --git a/siro_rider/ios/Runner/Assets.xcassets/AppIcon.appiconset/128.png b/siro_rider/ios/Runner/Assets.xcassets/AppIcon.appiconset/128.png new file mode 100644 index 0000000..9df0e26 Binary files /dev/null and b/siro_rider/ios/Runner/Assets.xcassets/AppIcon.appiconset/128.png differ diff --git a/siro_rider/ios/Runner/Assets.xcassets/AppIcon.appiconset/144.png b/siro_rider/ios/Runner/Assets.xcassets/AppIcon.appiconset/144.png new file mode 100644 index 0000000..905e7a0 Binary files /dev/null and b/siro_rider/ios/Runner/Assets.xcassets/AppIcon.appiconset/144.png differ diff --git a/siro_rider/ios/Runner/Assets.xcassets/AppIcon.appiconset/152.png b/siro_rider/ios/Runner/Assets.xcassets/AppIcon.appiconset/152.png new file mode 100644 index 0000000..9393ec5 Binary files /dev/null and b/siro_rider/ios/Runner/Assets.xcassets/AppIcon.appiconset/152.png differ diff --git a/siro_rider/ios/Runner/Assets.xcassets/AppIcon.appiconset/16.png b/siro_rider/ios/Runner/Assets.xcassets/AppIcon.appiconset/16.png new file mode 100644 index 0000000..b98920f Binary files /dev/null and b/siro_rider/ios/Runner/Assets.xcassets/AppIcon.appiconset/16.png differ diff --git a/siro_rider/ios/Runner/Assets.xcassets/AppIcon.appiconset/167.png b/siro_rider/ios/Runner/Assets.xcassets/AppIcon.appiconset/167.png new file mode 100644 index 0000000..223d91b Binary files /dev/null and b/siro_rider/ios/Runner/Assets.xcassets/AppIcon.appiconset/167.png differ diff --git a/siro_rider/ios/Runner/Assets.xcassets/AppIcon.appiconset/180.png b/siro_rider/ios/Runner/Assets.xcassets/AppIcon.appiconset/180.png new file mode 100644 index 0000000..ca9cb7c Binary files /dev/null and b/siro_rider/ios/Runner/Assets.xcassets/AppIcon.appiconset/180.png differ diff --git a/siro_rider/ios/Runner/Assets.xcassets/AppIcon.appiconset/20.png b/siro_rider/ios/Runner/Assets.xcassets/AppIcon.appiconset/20.png new file mode 100644 index 0000000..f511ce6 Binary files /dev/null and b/siro_rider/ios/Runner/Assets.xcassets/AppIcon.appiconset/20.png differ diff --git a/siro_rider/ios/Runner/Assets.xcassets/AppIcon.appiconset/256.png b/siro_rider/ios/Runner/Assets.xcassets/AppIcon.appiconset/256.png new file mode 100644 index 0000000..ab84a8f Binary files /dev/null and b/siro_rider/ios/Runner/Assets.xcassets/AppIcon.appiconset/256.png differ diff --git a/siro_rider/ios/Runner/Assets.xcassets/AppIcon.appiconset/29.png b/siro_rider/ios/Runner/Assets.xcassets/AppIcon.appiconset/29.png new file mode 100644 index 0000000..00756e2 Binary files /dev/null and b/siro_rider/ios/Runner/Assets.xcassets/AppIcon.appiconset/29.png differ diff --git a/siro_rider/ios/Runner/Assets.xcassets/AppIcon.appiconset/32.png b/siro_rider/ios/Runner/Assets.xcassets/AppIcon.appiconset/32.png new file mode 100644 index 0000000..274174d Binary files /dev/null and b/siro_rider/ios/Runner/Assets.xcassets/AppIcon.appiconset/32.png differ diff --git a/siro_rider/ios/Runner/Assets.xcassets/AppIcon.appiconset/40.png b/siro_rider/ios/Runner/Assets.xcassets/AppIcon.appiconset/40.png new file mode 100644 index 0000000..7dc9475 Binary files /dev/null and b/siro_rider/ios/Runner/Assets.xcassets/AppIcon.appiconset/40.png differ diff --git a/siro_rider/ios/Runner/Assets.xcassets/AppIcon.appiconset/50.png b/siro_rider/ios/Runner/Assets.xcassets/AppIcon.appiconset/50.png new file mode 100644 index 0000000..c77388d Binary files /dev/null and b/siro_rider/ios/Runner/Assets.xcassets/AppIcon.appiconset/50.png differ diff --git a/siro_rider/ios/Runner/Assets.xcassets/AppIcon.appiconset/512.png b/siro_rider/ios/Runner/Assets.xcassets/AppIcon.appiconset/512.png new file mode 100644 index 0000000..11869c3 Binary files /dev/null and b/siro_rider/ios/Runner/Assets.xcassets/AppIcon.appiconset/512.png differ diff --git a/siro_rider/ios/Runner/Assets.xcassets/AppIcon.appiconset/57.png b/siro_rider/ios/Runner/Assets.xcassets/AppIcon.appiconset/57.png new file mode 100644 index 0000000..74ef5da Binary files /dev/null and b/siro_rider/ios/Runner/Assets.xcassets/AppIcon.appiconset/57.png differ diff --git a/siro_rider/ios/Runner/Assets.xcassets/AppIcon.appiconset/58.png b/siro_rider/ios/Runner/Assets.xcassets/AppIcon.appiconset/58.png new file mode 100644 index 0000000..172bae1 Binary files /dev/null and b/siro_rider/ios/Runner/Assets.xcassets/AppIcon.appiconset/58.png differ diff --git a/siro_rider/ios/Runner/Assets.xcassets/AppIcon.appiconset/60.png b/siro_rider/ios/Runner/Assets.xcassets/AppIcon.appiconset/60.png new file mode 100644 index 0000000..2334d1f Binary files /dev/null and b/siro_rider/ios/Runner/Assets.xcassets/AppIcon.appiconset/60.png differ diff --git a/siro_rider/ios/Runner/Assets.xcassets/AppIcon.appiconset/64.png b/siro_rider/ios/Runner/Assets.xcassets/AppIcon.appiconset/64.png new file mode 100644 index 0000000..5d4756c Binary files /dev/null and b/siro_rider/ios/Runner/Assets.xcassets/AppIcon.appiconset/64.png differ diff --git a/siro_rider/ios/Runner/Assets.xcassets/AppIcon.appiconset/72.png b/siro_rider/ios/Runner/Assets.xcassets/AppIcon.appiconset/72.png new file mode 100644 index 0000000..4cfbfb5 Binary files /dev/null and b/siro_rider/ios/Runner/Assets.xcassets/AppIcon.appiconset/72.png differ diff --git a/siro_rider/ios/Runner/Assets.xcassets/AppIcon.appiconset/76.png b/siro_rider/ios/Runner/Assets.xcassets/AppIcon.appiconset/76.png new file mode 100644 index 0000000..2a8ace1 Binary files /dev/null and b/siro_rider/ios/Runner/Assets.xcassets/AppIcon.appiconset/76.png differ diff --git a/siro_rider/ios/Runner/Assets.xcassets/AppIcon.appiconset/80.png b/siro_rider/ios/Runner/Assets.xcassets/AppIcon.appiconset/80.png new file mode 100644 index 0000000..aa91053 Binary files /dev/null and b/siro_rider/ios/Runner/Assets.xcassets/AppIcon.appiconset/80.png differ diff --git a/siro_rider/ios/Runner/Assets.xcassets/AppIcon.appiconset/87.png b/siro_rider/ios/Runner/Assets.xcassets/AppIcon.appiconset/87.png new file mode 100644 index 0000000..b35f465 Binary files /dev/null and b/siro_rider/ios/Runner/Assets.xcassets/AppIcon.appiconset/87.png differ diff --git a/siro_rider/ios/Runner/Assets.xcassets/AppIcon.appiconset/Contents.json b/siro_rider/ios/Runner/Assets.xcassets/AppIcon.appiconset/Contents.json new file mode 100644 index 0000000..5c82812 --- /dev/null +++ b/siro_rider/ios/Runner/Assets.xcassets/AppIcon.appiconset/Contents.json @@ -0,0 +1 @@ +{"images":[{"size":"60x60","expected-size":"180","filename":"180.png","folder":"Assets.xcassets/AppIcon.appiconset/","idiom":"iphone","scale":"3x"},{"size":"40x40","expected-size":"80","filename":"80.png","folder":"Assets.xcassets/AppIcon.appiconset/","idiom":"iphone","scale":"2x"},{"size":"40x40","expected-size":"120","filename":"120.png","folder":"Assets.xcassets/AppIcon.appiconset/","idiom":"iphone","scale":"3x"},{"size":"60x60","expected-size":"120","filename":"120.png","folder":"Assets.xcassets/AppIcon.appiconset/","idiom":"iphone","scale":"2x"},{"size":"57x57","expected-size":"57","filename":"57.png","folder":"Assets.xcassets/AppIcon.appiconset/","idiom":"iphone","scale":"1x"},{"size":"29x29","expected-size":"58","filename":"58.png","folder":"Assets.xcassets/AppIcon.appiconset/","idiom":"iphone","scale":"2x"},{"size":"29x29","expected-size":"29","filename":"29.png","folder":"Assets.xcassets/AppIcon.appiconset/","idiom":"iphone","scale":"1x"},{"size":"29x29","expected-size":"87","filename":"87.png","folder":"Assets.xcassets/AppIcon.appiconset/","idiom":"iphone","scale":"3x"},{"size":"57x57","expected-size":"114","filename":"114.png","folder":"Assets.xcassets/AppIcon.appiconset/","idiom":"iphone","scale":"2x"},{"size":"20x20","expected-size":"40","filename":"40.png","folder":"Assets.xcassets/AppIcon.appiconset/","idiom":"iphone","scale":"2x"},{"size":"20x20","expected-size":"60","filename":"60.png","folder":"Assets.xcassets/AppIcon.appiconset/","idiom":"iphone","scale":"3x"},{"size":"1024x1024","filename":"1024.png","expected-size":"1024","idiom":"ios-marketing","folder":"Assets.xcassets/AppIcon.appiconset/","scale":"1x"},{"size":"40x40","expected-size":"80","filename":"80.png","folder":"Assets.xcassets/AppIcon.appiconset/","idiom":"ipad","scale":"2x"},{"size":"72x72","expected-size":"72","filename":"72.png","folder":"Assets.xcassets/AppIcon.appiconset/","idiom":"ipad","scale":"1x"},{"size":"76x76","expected-size":"152","filename":"152.png","folder":"Assets.xcassets/AppIcon.appiconset/","idiom":"ipad","scale":"2x"},{"size":"50x50","expected-size":"100","filename":"100.png","folder":"Assets.xcassets/AppIcon.appiconset/","idiom":"ipad","scale":"2x"},{"size":"29x29","expected-size":"58","filename":"58.png","folder":"Assets.xcassets/AppIcon.appiconset/","idiom":"ipad","scale":"2x"},{"size":"76x76","expected-size":"76","filename":"76.png","folder":"Assets.xcassets/AppIcon.appiconset/","idiom":"ipad","scale":"1x"},{"size":"29x29","expected-size":"29","filename":"29.png","folder":"Assets.xcassets/AppIcon.appiconset/","idiom":"ipad","scale":"1x"},{"size":"50x50","expected-size":"50","filename":"50.png","folder":"Assets.xcassets/AppIcon.appiconset/","idiom":"ipad","scale":"1x"},{"size":"72x72","expected-size":"144","filename":"144.png","folder":"Assets.xcassets/AppIcon.appiconset/","idiom":"ipad","scale":"2x"},{"size":"40x40","expected-size":"40","filename":"40.png","folder":"Assets.xcassets/AppIcon.appiconset/","idiom":"ipad","scale":"1x"},{"size":"83.5x83.5","expected-size":"167","filename":"167.png","folder":"Assets.xcassets/AppIcon.appiconset/","idiom":"ipad","scale":"2x"},{"size":"20x20","expected-size":"20","filename":"20.png","folder":"Assets.xcassets/AppIcon.appiconset/","idiom":"ipad","scale":"1x"},{"size":"20x20","expected-size":"40","filename":"40.png","folder":"Assets.xcassets/AppIcon.appiconset/","idiom":"ipad","scale":"2x"},{"size":"128x128","expected-size":"128","filename":"128.png","folder":"Assets.xcassets/AppIcon.appiconset/","idiom":"mac","scale":"1x"},{"size":"256x256","expected-size":"256","filename":"256.png","folder":"Assets.xcassets/AppIcon.appiconset/","idiom":"mac","scale":"1x"},{"size":"128x128","expected-size":"256","filename":"256.png","folder":"Assets.xcassets/AppIcon.appiconset/","idiom":"mac","scale":"2x"},{"size":"256x256","expected-size":"512","filename":"512.png","folder":"Assets.xcassets/AppIcon.appiconset/","idiom":"mac","scale":"2x"},{"size":"32x32","expected-size":"32","filename":"32.png","folder":"Assets.xcassets/AppIcon.appiconset/","idiom":"mac","scale":"1x"},{"size":"512x512","expected-size":"512","filename":"512.png","folder":"Assets.xcassets/AppIcon.appiconset/","idiom":"mac","scale":"1x"},{"size":"16x16","expected-size":"16","filename":"16.png","folder":"Assets.xcassets/AppIcon.appiconset/","idiom":"mac","scale":"1x"},{"size":"16x16","expected-size":"32","filename":"32.png","folder":"Assets.xcassets/AppIcon.appiconset/","idiom":"mac","scale":"2x"},{"size":"32x32","expected-size":"64","filename":"64.png","folder":"Assets.xcassets/AppIcon.appiconset/","idiom":"mac","scale":"2x"},{"size":"512x512","expected-size":"1024","filename":"1024.png","folder":"Assets.xcassets/AppIcon.appiconset/","idiom":"mac","scale":"2x"}]} \ No newline at end of file diff --git a/siro_rider/ios/Runner/Assets.xcassets/Contents.json b/siro_rider/ios/Runner/Assets.xcassets/Contents.json new file mode 100644 index 0000000..73c0059 --- /dev/null +++ b/siro_rider/ios/Runner/Assets.xcassets/Contents.json @@ -0,0 +1,6 @@ +{ + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/siro_rider/ios/Runner/Assets.xcassets/LaunchImage.imageset/Contents.json b/siro_rider/ios/Runner/Assets.xcassets/LaunchImage.imageset/Contents.json new file mode 100644 index 0000000..0bedcf2 --- /dev/null +++ b/siro_rider/ios/Runner/Assets.xcassets/LaunchImage.imageset/Contents.json @@ -0,0 +1,23 @@ +{ + "images" : [ + { + "idiom" : "universal", + "filename" : "LaunchImage.png", + "scale" : "1x" + }, + { + "idiom" : "universal", + "filename" : "LaunchImage@2x.png", + "scale" : "2x" + }, + { + "idiom" : "universal", + "filename" : "LaunchImage@3x.png", + "scale" : "3x" + } + ], + "info" : { + "version" : 1, + "author" : "xcode" + } +} diff --git a/siro_rider/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage.png b/siro_rider/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage.png new file mode 100644 index 0000000..9da19ea Binary files /dev/null and b/siro_rider/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage.png differ diff --git a/siro_rider/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage@2x.png b/siro_rider/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage@2x.png new file mode 100644 index 0000000..9da19ea Binary files /dev/null and b/siro_rider/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage@2x.png differ diff --git a/siro_rider/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage@3x.png b/siro_rider/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage@3x.png new file mode 100644 index 0000000..9da19ea Binary files /dev/null and b/siro_rider/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage@3x.png differ diff --git a/siro_rider/ios/Runner/Assets.xcassets/LaunchImage.imageset/README.md b/siro_rider/ios/Runner/Assets.xcassets/LaunchImage.imageset/README.md new file mode 100644 index 0000000..89c2725 --- /dev/null +++ b/siro_rider/ios/Runner/Assets.xcassets/LaunchImage.imageset/README.md @@ -0,0 +1,5 @@ +# Launch Screen Assets + +You can customize the launch screen with your own desired assets by replacing the image files in this directory. + +You can also do it by opening your Flutter project's Xcode project with `open ios/Runner.xcworkspace`, selecting `Runner/Assets.xcassets` in the Project Navigator and dropping in the desired images. \ No newline at end of file diff --git a/siro_rider/ios/Runner/Assets.xcassets/icon_share.imageset/Contents.json b/siro_rider/ios/Runner/Assets.xcassets/icon_share.imageset/Contents.json new file mode 100644 index 0000000..028dbdf --- /dev/null +++ b/siro_rider/ios/Runner/Assets.xcassets/icon_share.imageset/Contents.json @@ -0,0 +1,21 @@ +{ + "images" : [ + { + "filename" : "icon_share.png", + "idiom" : "universal", + "scale" : "1x" + }, + { + "idiom" : "universal", + "scale" : "2x" + }, + { + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/siro_rider/ios/Runner/Assets.xcassets/icon_share.imageset/icon_share.png b/siro_rider/ios/Runner/Assets.xcassets/icon_share.imageset/icon_share.png new file mode 100644 index 0000000..ae92be6 Binary files /dev/null and b/siro_rider/ios/Runner/Assets.xcassets/icon_share.imageset/icon_share.png differ diff --git a/siro_rider/ios/Runner/Assets.xcassets/icon_support.imageset/Contents.json b/siro_rider/ios/Runner/Assets.xcassets/icon_support.imageset/Contents.json new file mode 100644 index 0000000..cc0fc26 --- /dev/null +++ b/siro_rider/ios/Runner/Assets.xcassets/icon_support.imageset/Contents.json @@ -0,0 +1,21 @@ +{ + "images" : [ + { + "filename" : "icon_support.png", + "idiom" : "universal", + "scale" : "1x" + }, + { + "idiom" : "universal", + "scale" : "2x" + }, + { + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/siro_rider/ios/Runner/Assets.xcassets/icon_support.imageset/icon_support.png b/siro_rider/ios/Runner/Assets.xcassets/icon_support.imageset/icon_support.png new file mode 100644 index 0000000..5a9fef9 Binary files /dev/null and b/siro_rider/ios/Runner/Assets.xcassets/icon_support.imageset/icon_support.png differ diff --git a/siro_rider/ios/Runner/Assets.xcassets/icon_user.imageset/Contents.json b/siro_rider/ios/Runner/Assets.xcassets/icon_user.imageset/Contents.json new file mode 100644 index 0000000..32ae8f7 --- /dev/null +++ b/siro_rider/ios/Runner/Assets.xcassets/icon_user.imageset/Contents.json @@ -0,0 +1,21 @@ +{ + "images" : [ + { + "filename" : "icon_user.png", + "idiom" : "universal", + "scale" : "1x" + }, + { + "idiom" : "universal", + "scale" : "2x" + }, + { + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/siro_rider/ios/Runner/Assets.xcassets/icon_user.imageset/icon_user.png b/siro_rider/ios/Runner/Assets.xcassets/icon_user.imageset/icon_user.png new file mode 100644 index 0000000..c8802f2 Binary files /dev/null and b/siro_rider/ios/Runner/Assets.xcassets/icon_user.imageset/icon_user.png differ diff --git a/siro_rider/ios/Runner/Assets.xcassets/icon_wallet.imageset/Contents.json b/siro_rider/ios/Runner/Assets.xcassets/icon_wallet.imageset/Contents.json new file mode 100644 index 0000000..3800eed --- /dev/null +++ b/siro_rider/ios/Runner/Assets.xcassets/icon_wallet.imageset/Contents.json @@ -0,0 +1,21 @@ +{ + "images" : [ + { + "filename" : "icon_wallet.png", + "idiom" : "universal", + "scale" : "1x" + }, + { + "idiom" : "universal", + "scale" : "2x" + }, + { + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/siro_rider/ios/Runner/Assets.xcassets/icon_wallet.imageset/icon_wallet.png b/siro_rider/ios/Runner/Assets.xcassets/icon_wallet.imageset/icon_wallet.png new file mode 100644 index 0000000..551f8a4 Binary files /dev/null and b/siro_rider/ios/Runner/Assets.xcassets/icon_wallet.imageset/icon_wallet.png differ diff --git a/siro_rider/ios/Runner/Base.lproj/LaunchScreen.storyboard b/siro_rider/ios/Runner/Base.lproj/LaunchScreen.storyboard new file mode 100644 index 0000000..f2e259c --- /dev/null +++ b/siro_rider/ios/Runner/Base.lproj/LaunchScreen.storyboard @@ -0,0 +1,37 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/siro_rider/ios/Runner/Base.lproj/Main.storyboard b/siro_rider/ios/Runner/Base.lproj/Main.storyboard new file mode 100644 index 0000000..f3c2851 --- /dev/null +++ b/siro_rider/ios/Runner/Base.lproj/Main.storyboard @@ -0,0 +1,26 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/siro_rider/ios/Runner/Config.plist b/siro_rider/ios/Runner/Config.plist new file mode 100644 index 0000000..3998c77 --- /dev/null +++ b/siro_rider/ios/Runner/Config.plist @@ -0,0 +1,8 @@ + + + + + APIKey + AIzaSyDdqkLMCrqjVrn7XmadIqynyoBa7P27OeM + + diff --git a/siro_rider/ios/Runner/Constants1.swift b/siro_rider/ios/Runner/Constants1.swift new file mode 100644 index 0000000..e240caa --- /dev/null +++ b/siro_rider/ios/Runner/Constants1.swift @@ -0,0 +1,12 @@ +// +// Constants1.swift +// Runner +// +// Created by Hamza Aleghwairyeen on 20/02/2025. +// + +import Foundation + +struct Constants { + static let googleMapsAPIKey = "AIzaSyD0a1b2c3d4e5f6g7h8i9j0k1l2m3n4o5p6q" +} diff --git a/siro_rider/ios/Runner/GoogleService-Info.plist b/siro_rider/ios/Runner/GoogleService-Info.plist new file mode 100644 index 0000000..aec30c3 --- /dev/null +++ b/siro_rider/ios/Runner/GoogleService-Info.plist @@ -0,0 +1,30 @@ + + + + + API_KEY + AIzaSyDk6x6KZUY0IQtxoCMXX0F7N_yik8O19eA + GCM_SENDER_ID + 825988584191 + PLIST_VERSION + 1 + BUNDLE_ID + com.siro.rider + PROJECT_ID + siro-a6957 + STORAGE_BUCKET + siro-a6957.firebasestorage.app + IS_ADS_ENABLED + + IS_ANALYTICS_ENABLED + + IS_APPINVITE_ENABLED + + IS_GCM_ENABLED + + IS_SIGNIN_ENABLED + + GOOGLE_APP_ID + 1:825988584191:ios:1d880fc7fc98b7671632ca + + \ No newline at end of file diff --git a/siro_rider/ios/Runner/Info.plist b/siro_rider/ios/Runner/Info.plist new file mode 100644 index 0000000..267204f --- /dev/null +++ b/siro_rider/ios/Runner/Info.plist @@ -0,0 +1,106 @@ + + + + + CADisableMinimumFrameDurationOnPhone + + CFBundleDevelopmentRegion + $(DEVELOPMENT_LANGUAGE) + CFBundleDisplayName + Siro Rider + CFBundleExecutable + $(EXECUTABLE_NAME) + CFBundleIdentifier + $(PRODUCT_BUNDLE_IDENTIFIER) + CFBundleInfoDictionaryVersion + 6.0 + CFBundleName + Siro Rider + CFBundlePackageType + APPL + CFBundleShortVersionString + 33 + CFBundleSignature + ???? + CFBundleURLTypes + + + CFBundleTypeRole + Editor + CFBundleURLName + siroapp.com + CFBundleURLSchemes + + com.googleusercontent.apps.1086900987150-9jv4oa8l3t23d54lrf27c1d22tbt9i6d + siroapp + + + + CFBundleVersion + 1.1.33 + FirebaseAppDelegateProxyEnabled + NO + FlutterDeepLinkingEnabled + + GMSApiKey + YOUR_API_KEY + LSApplicationQueriesSchemes + + googlechromes + comgooglemaps + + LSRequiresIPhoneOS + + NSCameraUsageDescription + This app requires access to your camera in order to scan QR codes and capture images + for uploading and access to connect to a call. + NSContactsUsageDescription + This app requires contacts access to function properly. + NSFaceIDUsageDescription + Use Face ID to securely authenticate payment accounts. + NSLocationAlwaysAndWhenInUseUsageDescription + This app needs access to your location to provide you with the best ride experience. + Your location data will be used to find the nearest available cars and connect you with + the closest captain for efficient and convenient rides. + NSLocationAlwaysUsageDescription + This app needs access to location. + NSLocationWhenInUseUsageDescription + This app needs access to your location to provide you with the best ride experience. + Your location data will be used to find the nearest available cars and connect you with + the closest captain for efficient and convenient rides. + NSMicrophoneUsageDescription + This app requires access to your microphone to record audio, allowing you to add + voice recordings to your photos and videos and access to connect to a call. + NSPhotoLibraryUsageDescription + This app requires access to the photo library to upload pictures. + NSSupportsLiveActivities + + UIApplicationSupportsIndirectInputEvents + + UIBackgroundModes + + fetch + location + remote-notification + + UILaunchStoryboardName + LaunchScreen + UIMainStoryboardFile + Main + UISupportedInterfaceOrientations + + UIInterfaceOrientationPortrait + UIInterfaceOrientationLandscapeLeft + UIInterfaceOrientationLandscapeRight + + UISupportedInterfaceOrientations~ipad + + UIInterfaceOrientationPortrait + UIInterfaceOrientationPortraitUpsideDown + UIInterfaceOrientationLandscapeLeft + UIInterfaceOrientationLandscapeRight + + UIViewControllerBasedStatusBarAppearance + + + diff --git a/siro_rider/ios/Runner/JailbreakDetection.swift b/siro_rider/ios/Runner/JailbreakDetection.swift new file mode 100644 index 0000000..504e30e --- /dev/null +++ b/siro_rider/ios/Runner/JailbreakDetection.swift @@ -0,0 +1,25 @@ +// +// JailbreakDetection.swift +// Runner +// +// Created by Hamza Aleghwairyeen on 15/02/2025. +// + +import Foundation + +class JailbreakDetection { + static func isJailbroken() -> Bool { + let paths = [ + "/Applications/Cydia.app", + "/Library/MobileSubstrate/MobileSubstrate.dylib", + "/usr/sbin/sshd", + "/etc/apt" + ] + for path in paths { + if FileManager.default.fileExists(atPath: path) { + return true + } + } + return false + } +} diff --git a/siro_rider/ios/Runner/KeychainHelper.swift b/siro_rider/ios/Runner/KeychainHelper.swift new file mode 100644 index 0000000..8e62bc2 --- /dev/null +++ b/siro_rider/ios/Runner/KeychainHelper.swift @@ -0,0 +1,59 @@ +// +// KeychainHelper.swift +// Runner +// +// Created by Hamza Aleghwairyeen on 12/03/2025. +// + +import Foundation +import Security + +class KeychainHelper { + static let shared = KeychainHelper() + + private init() {} + + // حفظ البيانات في Keychain + func save(key: String, value: String) { + let data = value.data(using: .utf8)! + + let query: [String: Any] = [ + kSecClass as String: kSecClassGenericPassword, + kSecAttrAccount as String: key, + kSecValueData as String: data, + kSecAttrAccessible as String: kSecAttrAccessibleWhenUnlockedThisDeviceOnly + ] + + SecItemDelete(query as CFDictionary) // حذف أي قيمة قديمة بنفس المفتاح + SecItemAdd(query as CFDictionary, nil) // إضافة القيمة الجديدة + } + + // استرجاع البيانات من Keychain + func get(key: String) -> String? { + let query: [String: Any] = [ + kSecClass as String: kSecClassGenericPassword, + kSecAttrAccount as String: key, + kSecReturnData as String: kCFBooleanTrue!, + kSecMatchLimit as String: kSecMatchLimitOne + ] + + var dataTypeRef: AnyObject? + let status = SecItemCopyMatching(query as CFDictionary, &dataTypeRef) + + guard status == errSecSuccess, let data = dataTypeRef as? Data else { + return nil + } + + return String(data: data, encoding: .utf8) + } + + // حذف البيانات من Keychain + func delete(key: String) { + let query: [String: Any] = [ + kSecClass as String: kSecClassGenericPassword, + kSecAttrAccount as String: key + ] + + SecItemDelete(query as CFDictionary) + } +} diff --git a/siro_rider/ios/Runner/Runner-Bridging-Header.h b/siro_rider/ios/Runner/Runner-Bridging-Header.h new file mode 100644 index 0000000..2dd4564 --- /dev/null +++ b/siro_rider/ios/Runner/Runner-Bridging-Header.h @@ -0,0 +1,2 @@ +#import "GeneratedPluginRegistrant.h" +#import "SecurityChecks.h" diff --git a/siro_rider/ios/Runner/Runner.entitlements b/siro_rider/ios/Runner/Runner.entitlements new file mode 100644 index 0000000..12a3ed5 --- /dev/null +++ b/siro_rider/ios/Runner/Runner.entitlements @@ -0,0 +1,20 @@ + + + + + aps-environment + development + com.apple.developer.applesignin + + Default + + com.apple.developer.associated-domains + + applinks:intaleqapp.com + + com.apple.security.application-groups + + group.com.Intaleq.intaleq + + + diff --git a/siro_rider/ios/Runner/SecurityChecks.h b/siro_rider/ios/Runner/SecurityChecks.h new file mode 100644 index 0000000..b41f391 --- /dev/null +++ b/siro_rider/ios/Runner/SecurityChecks.h @@ -0,0 +1,24 @@ +// +// SecurityChecks.h +// Runner +// +// Created by Hamza Aleghwairyeen on 12/03/2025. +// + +//#ifndef SecurityChecks_h +//#define SecurityChecks_h +// +// +//#endif /* SecurityChecks_h */ + + + +// SecurityChecks.h +#import +#import // Import UIKit + +@interface SecurityChecks : NSObject + ++ (BOOL)isDeviceCompromised; // Combined check + +@end diff --git a/siro_rider/ios/Runner/cancel.wav b/siro_rider/ios/Runner/cancel.wav new file mode 100644 index 0000000..dbe6e7c Binary files /dev/null and b/siro_rider/ios/Runner/cancel.wav differ diff --git a/siro_rider/ios/Runner/ding.wav b/siro_rider/ios/Runner/ding.wav new file mode 100644 index 0000000..c53cd50 Binary files /dev/null and b/siro_rider/ios/Runner/ding.wav differ diff --git a/siro_rider/ios/Runner/en.lproj/Localizable.strings b/siro_rider/ios/Runner/en.lproj/Localizable.strings new file mode 100644 index 0000000..dd8ea57 --- /dev/null +++ b/siro_rider/ios/Runner/en.lproj/Localizable.strings @@ -0,0 +1,10 @@ +// +// Localizable.strings +// Runner +// +// Created by Hamza Aleghwairyeen on 12/03/2025. +// + +"Security Warning" = "تحذير أمني"; +"Compromised device detected. Exiting." = "تم اكتشاف جهاز مُخترق. جارٍ الخروج."; +"OK" = "موافق"; diff --git a/siro_rider/ios/Runner/promo.wav b/siro_rider/ios/Runner/promo.wav new file mode 100644 index 0000000..3bb2d03 Binary files /dev/null and b/siro_rider/ios/Runner/promo.wav differ diff --git a/siro_rider/ios/Runner/start.wav b/siro_rider/ios/Runner/start.wav new file mode 100644 index 0000000..0655506 Binary files /dev/null and b/siro_rider/ios/Runner/start.wav differ diff --git a/siro_rider/ios/Runner/tone1.mp3 b/siro_rider/ios/Runner/tone1.mp3 new file mode 100644 index 0000000..e32e61b Binary files /dev/null and b/siro_rider/ios/Runner/tone1.mp3 differ diff --git a/siro_rider/ios/Runner/tone2.wav b/siro_rider/ios/Runner/tone2.wav new file mode 100644 index 0000000..0582d47 Binary files /dev/null and b/siro_rider/ios/Runner/tone2.wav differ diff --git a/siro_rider/ios/RunnerTests/RunnerTests.swift b/siro_rider/ios/RunnerTests/RunnerTests.swift new file mode 100644 index 0000000..86a7c3b --- /dev/null +++ b/siro_rider/ios/RunnerTests/RunnerTests.swift @@ -0,0 +1,12 @@ +import Flutter +import UIKit +import XCTest + +class RunnerTests: XCTestCase { + + func testExample() { + // If you add code to the Runner application, consider adding tests here. + // See https://developer.apple.com/documentation/xctest for more information about using XCTest. + } + +} diff --git a/siro_rider/lib/README.md b/siro_rider/lib/README.md new file mode 100644 index 0000000..2aa43f8 --- /dev/null +++ b/siro_rider/lib/README.md @@ -0,0 +1,194 @@ +إليك التقرير الفني الشامل لمشروع **Intaleq Passenger App**، مكتوباً بصيغة توثيق تقني (Technical Documentation) موجهة لفريق التطوير، بناءً على تحليل الكود المصدري. + +--- + +# 📘 Intaleq Passenger App - Technical Documentation Report + +**Prepared by:** CTO Office +**Target Audience:** Mobile Engineering Team +**Version:** 1.0 + +--- + +## 1. 🚀 بداية التشغيل (Initialization & Startup) + +تعتمد مرحلة الإقلاع على تهيئة الخدمات الأساسية قبل عرض واجهة المستخدم لضمان استقرار التطبيق. + +### أ. نقطة الدخول (`main.dart`) + +- **المسار:** `lib/main.dart` +- **الوظيفة:** + - يستخدم `runZonedGuarded` لالتقاط الأخطاء العامة (Global Error Handling) وإرسالها للسيرفر عبر `CRUD.addError`. + - **تهيئة الخدمات:** يتم تهيئة `GetStorage` (للتخزين المحلي)، `WakelockPlus` (لمنع انطفاء الشاشة)، و `Firebase` (للإشعارات) قبل استدعاء `runApp`. + - **إعدادات التوجيه:** يتم تحديد الاتجاه العمودي فقط (`portraitUp`) للجهاز. + - **حقن التبعيات (DI):** يتم استدعاء `AppBindings` كـ `initialBinding` لتهيئة المتحكمات الأساسية. + +### ب. إدارة التبعيات (`AppBindings`) + +- **المسار:** `lib/app_bindings.dart` +- **الآلية:** + - يتم حقن `LocaleController` و `DeepLinkController` بشكل دائم (`permanent: true`) لضمان تواجدهم طوال دورة حياة التطبيق. + - يتم استخدام `Get.lazyPut` مع `fenix: true` للمتحكمات الأخرى (مثل `LoginController`) ليتم إنشاؤها عند الحاجة وإعادة إنشائها إذا تم التخلص منها. + +### ج. شاشة البداية (`Splash Screen`) + +- **المسار:** `lib/splash_screen_page.dart` و `lib/controller/home/splash_screen_controlle.dart` +- **المنطق:** + - يتم عرض انيميشن باستخدام `AnimatedTextKit` و `FadeTransition`. + - **العمليات الخلفية:** يقوم `SplashScreenController` بتنفيذ `_initializeBackgroundServices` لتهيئة خدمات التشفير (`EncryptionHelper`) والإشعارات. + - **التوجيه الذكي:** تتحقق الدالة `_performNavigationLogic` من وجود بيانات المستخدم في `BoxName`. إذا كان المستخدم مسجلاً ومفعلاً (`isVerified == '1'`)، يتم توجيهه تلقائياً للصفحة الرئيسية، وإلا يتم توجيهه لصفحة الدخول أو الترحيب (`OnBoarding`). + +--- + +## 2. 🔐 دورة المصادقة (Authentication Cycle) + +يعتمد النظام على مصادقة هجينة (Token-based + Social Auth) مع تخزين آمن. + +### أ. التسجيل والدخول (`Sign Up & Login`) + +- **المسار:** `lib/controller/auth/login_controller.dart` و `register_controller.dart` +- **الآلية:** + - **Social Login:** يتم استخدام `GoogleSignInHelper` أو `AuthController` (Apple). عند النجاح، يتم إرسال التوكن للسيرفر للتحقق. + - **Credentials:** في حالة الدخول التقليدي، يتم استدعاء `loginUsingCredentials` التي تتحقق من البيانات عبر API. + - **التحقق (Verification):** إذا رد السيرفر بأن الحساب غير مفعل، يتم تحويل المستخدم لصفحة `PhoneNumberScreen` للتحقق عبر OTP. + +### ب. التحقق عبر الهاتف (OTP) + +- **المسار:** `lib/controller/auth/otp_controller.dart` +- **المنطق:** يستخدم كلاس `PhoneAuthHelper` لإرسال OTP (غالباً عبر WhatsApp أو SMS حسب الدولة) ثم التحقق منه عبر الـ Endpoint `verifyOtp.php`. + +### ج. إدارة الجلسة والتوكن + +- **المخزن:** يتم تخزين الـ JWT في `GetStorage` تحت مفتاح `BoxName.jwt`. +- **التشفير:** يتم استخدام `EncryptionHelper` لتشفير البيانات الحساسة محلياً. +- **التجديد التلقائي:** في كلاس `CRUD`، إذا رد السيرفر بـ `401 Token expired`، يتم استدعاء `getJWT` تلقائياً لتجديد التوكن دون تسجيل خروج المستخدم. + +--- + +## 3. 🗺️ الشاشة الرئيسية والخريطة (Home & Map Logic) + +تعتبر `MapPagePassenger` هي الواجهة المركزية التي تديرها `MapPassengerController`. + +### أ. تحميل الخريطة والموقع + +- **المسار:** `lib/controller/home/map_passenger_controller.dart` +- **المتحكم:** `MapPassengerController` +- **المنطق:** + - يتم استخدام `location.getLocation()` لجلب موقع الراكب الحالي عند البدء. + - يتم تحديد المنطقة الجغرافية (سوريا، مصر، الأردن) عبر دالة `getLocationArea` التي تفحص وقوع الإحداثيات داخل مضلعات (Polygons) محددة مسبقاً. + +### ب. السيارات القريبة (Real-time Updates) + +- **الدالة:** `getCarsLocationByPassengerAndReloadMarker`. +- **الآلية:** تقوم بطلب API (مثل `getSpeed.php`) بناءً على نوع السيارة المختار (Speed, Comfort, Lady). يتم تحديث الـ `markers` على الخريطة، ويتم استخدام دالة `_smoothlyUpdateMarker` لتحريك أيقونة السيارة بسلاسة بدلاً من القفز المفاجئ. + +### ج. القائمة الجانبية (Drawer) + +- **المسار:** `lib/views/home/map_widget.dart/map_menu_widget.dart` +- **المتحكم:** `MyMenuController` +- **الوظيفة:** تدير حالة القائمة (مفتوحة/مغلقة) وتوفر روابط لصفحات الملف الشخصي، المحفظة، والسجل. + +--- + +## 4. 🚕 دورة طلب الرحلة (Ride Request Flow) + +هذا هو الجزء الأكثر تعقيداً في التطبيق، حيث يدار عبر آلة حالة (State Machine). + +### أ. اختيار الوجهة ورسم المسار + +- **المسار:** `lib/controller/home/map_passenger_controller.dart` +- **الوظيفة:** `getDirectionMap`. +- **المنطق:** + - يتم إرسال نقطة البداية والنهاية إلى خدمة التوجيه (OSRM/Google). + - يتم استلام نقاط المسار (Polyline Points) وفك تشفيرها في `Isolate` منفصل (`decodePolylineIsolate`) لتحسين الأداء. + - يتم رسم المسار على الخريطة وضبط الكاميرا لتشمل النقطتين. + +### ب. اختيار نوع السيارة والسعر + +- **المسار:** `lib/views/home/map_widget.dart/car_details_widget_to_go.dart` +- **الآلية:** يتم عرض قائمة أنواع السيارات (Fixed Price, Comfort, etc.). عند الاختيار، يتم حساب السعر المتوقع بناءً على المسافة والوقت والتعرفة الخاصة بكل نوع والمخزنة في المتحكم (`totalPassengerSpeed`, `totalPassengerComfort`). + +### ج. إرسال الطلب (البحث عن سائق) + +- **الدالة:** `startSearchingForDriver`. +- **العمليات:** + 1. تغيير الحالة إلى `RideState.searching`. + 2. استدعاء `postRideDetailsToServer` لإنشاء سجل الرحلة في قاعدة البيانات. + 3. تشغيل المؤقت `_startMasterTimer` الذي يدير دورة البحث. + 4. يتم توسيع نطاق البحث (Radius) تدريجياً (مراحل: 2400م -> 3000م -> 3100م) عبر `_findAndNotifyNearestDrivers`. + +### د. انتظار السائق + +- **الواجهة:** `SearchingCaptainWindow`. +- **المنطق:** يظهر رادار بحث. يتم التحقق دورياً (`Polling`) من حالة الرحلة في السيرفر. إذا مر الوقت المحدد (90 ثانية) دون قبول، يظهر خيار "زيادة السعر" (`_showIncreaseFeeDialog`). + +--- + +## 5. 🚘 أثناء الرحلة (Active Ride) + +يتم إدارة هذه المرحلة عبر تحديثات الحالة في `_handleRideState`. + +### أ. قبول السائق + +- **الحدث:** وصول إشعار FCM أو تغيير الحالة في السيرفر إلى `Apply`. +- **الإجراء:** يتم استدعاء `processRideAcceptance`. + - يتم جلب بيانات السائق وموقعه. + - يتم تفعيل تتبع السائق `startTimerFromDriverToPassengerAfterApplied`. + - تتغير الواجهة لعرض معلومات السائق والوقت المقدر للوصول. + +### ب. بدء الرحلة وميزات الأمان + +- **بدء الرحلة:** عند وصول حالة `Begin`، يتم استدعاء `processRideBegin`. +- **SOS:** زر الاستغاثة يستدعي `makePhoneCall` مع رقم الشرطة أو جهة اتصال الطوارئ المخزنة. +- **مشاركة الرحلة:** الدالة `shareTripWithFamily` تولد رابط تتبع مشفر وترسله عبر واتساب. +- **تسجيل الصوت:** يتم استخدام `AudioRecorderController` لتسجيل ما يدور في الرحلة لأغراض الأمان. + +### ج. إلغاء الرحلة + +- **الدالة:** `cancelRide`. +- **المنطق:** + - يتم إرسال طلب `cancel` للسيرفر لتحديث حالة الرحلة. + - يتم إرسال إشعار للسائق بالإلغاء. + - يتم تصفير الواجهة والعودة للخريطة. + +--- + +## 6. 🏁 ما بعد الرحلة (Post-Ride) + +### أ. شاشة الدفع + +- **المسار:** `lib/controller/payment/payment_controller.dart` +- **المنطق:** + - يتم الخصم من المحفظة (`addPassengerWallet`) أو الدفع النقدي. + - يتم التعامل مع بوابات الدفع الخارجية (مثل Paymob, Stripe) إذا اختار العميل الدفع الإلكتروني. + +### ب. التقييم + +- **المسار:** `lib/views/Rate/rate_captain.dart` و `RateController`. +- **الآلية:** يقوم الراكب باختيار عدد النجوم وإضافة تعليق. يتم إرسال البيانات عبر `addRateToDriver`. + +### ج. تقديم الشكاوى + +- **المسار:** `lib/views/home/profile/complaint_page.dart` +- **المتحكم:** `ComplaintController`. +- **الميزة:** يمكن للراكب تسجيل رسالة صوتية وإرفاقها مع الشكوى، ثم يتم إرسالها للسيرفر عبر `submitComplaintToServer`. + +--- + +## 7. ⚙️ الإعدادات والملف الشخصي + +### أ. تعديل البيانات + +- **المسار:** `lib/views/home/profile/passenger_profile_page.dart`. +- **المتحكم:** `ProfileController`. +- يسمح بتعديل الاسم، الجنس، ورقم الطوارئ. + +### ب. المحفظة + +- **المسار:** `lib/views/home/my_wallet/passenger_wallet.dart`. +- يعرض الرصيد الحالي وسجل المعاملات (`PassengerWalletHistoryController`). + +### ج. اللغة + +- **المتحكم:** `LocaleController`. +- يقوم بتغيير لغة التطبيق وتحديث `Get.updateLocale` وحفظ التفضيل في التخزين المحلي. diff --git a/siro_rider/lib/app_bindings.dart b/siro_rider/lib/app_bindings.dart new file mode 100644 index 0000000..c2d348e --- /dev/null +++ b/siro_rider/lib/app_bindings.dart @@ -0,0 +1,68 @@ +import 'package:get/get.dart'; +import 'package:siro_rider/controller/auth/login_controller.dart'; +import 'package:siro_rider/controller/firebase/firbase_messge.dart'; +import 'package:siro_rider/controller/firebase/local_notification.dart'; +import 'package:siro_rider/controller/home/deep_link_controller.dart'; +import 'package:siro_rider/controller/local/local_controller.dart'; +import 'package:siro_rider/controller/functions/tts.dart'; +import 'package:siro_rider/controller/voice_call_controller.dart'; + +import 'package:siro_rider/controller/home/map/map_socket_controller.dart'; +import 'package:siro_rider/controller/home/map/map_engine_controller.dart'; +import 'package:siro_rider/controller/home/map/location_search_controller.dart'; +import 'package:siro_rider/controller/home/map/nearby_drivers_controller.dart'; +import 'package:siro_rider/controller/home/map/ride_lifecycle_controller.dart'; +import 'package:siro_rider/controller/home/map/ui_interactions_controller.dart'; +import 'package:siro_rider/controller/home/menu_controller.dart'; +import 'package:siro_rider/controller/functions/crud.dart'; +import 'package:siro_rider/controller/home/points_for_rider_controller.dart'; + +/// This is the central dependency injection file for the app. +/// It uses GetX Bindings to make the app start faster and manage memory better. +class AppBindings extends Bindings { + @override + void dependencies() { + // --- [Type 1: Permanent Controllers] --- + // Use Get.put() for controllers that need to be available immediately and ALWAYS. + // They are created right away and never destroyed. + + // LocaleController is needed instantly to set the app's theme and language. + Get.put(LocaleController()); + + // DeepLinkController must always be listening for incoming links. + // `permanent: true` ensures it survives `Get.offAll()`. + Get.put(DeepLinkController(), permanent: true); + + // --- [Type 2: Lazy Loaded "Phoenix" Controllers] --- + // Use Get.lazyPut() for controllers that are heavy or not needed immediately. + // They are only created in memory the first time `Get.find()` is called. + // `fenix: true` is the key: it allows the controller to be "reborn" after being + // destroyed (e.g., by Get.offAll), preserving its state and functionality. + + // LoginController is only needed during the login process on the splash screen. + Get.lazyPut(() => LoginController(), fenix: true); + + // NotificationController is initialized on the splash screen, but might be needed later. + Get.lazyPut(() => NotificationController(), fenix: true); + + // FirebaseMessagesController is also initialized on splash, but must persist its token and listeners. + Get.lazyPut(() => FirebaseMessagesController(), fenix: true); + + // TextToSpeechController for global accessibility + Get.lazyPut(() => TextToSpeechController(), fenix: true); + + // VoiceCallController for WebRTC calls + Get.lazyPut(() => VoiceCallController(), fenix: true); + + // Map & Ride controllers registered globally to prevent route-disposal race conditions. + Get.put(MapSocketController(), permanent: true); + Get.put(MapEngineController(), permanent: true); + Get.put(LocationSearchController(), permanent: true); + Get.put(NearbyDriversController(), permanent: true); + Get.put(RideLifecycleController(), permanent: true); + Get.put(UiInteractionsController(), permanent: true); + Get.put(MyMenuController(), permanent: true); + Get.put(CRUD(), permanent: true); + Get.put(WayPointController(), permanent: true); + } +} diff --git a/siro_rider/lib/constant/api_key.dart b/siro_rider/lib/constant/api_key.dart new file mode 100644 index 0000000..ae78851 --- /dev/null +++ b/siro_rider/lib/constant/api_key.dart @@ -0,0 +1,76 @@ +// import 'package:siro_rider/main.dart'; +import 'package:secure_string_operations/secure_string_operations.dart'; + +import '../env/env.dart'; +import 'char_map.dart'; + +class AK { + static final String sss_pass = X.r(X.r(X.r(Env.sss_pass, cn), cC), cs); + static final String allowed = Env.allowed; + static final String allowedWallet = Env.allowedWallet; + static final String passnpassenger = X + .r(X.r(X.r(Env.passnpassenger, cn), cC), cs) + .toString() + .split(Env.addd)[0]; + static final String newId = Env.newId; + static final String sss_encryptionSalt = + X.r(X.r(X.r(Env.sss_encryptionSalt, cn), cC), cs); + static final String secretKey = X.r(X.r(X.r(Env.secretKey, cn), cC), cs); + static final String basicAuthCredentials = + X.r(X.r(X.r(Env.basicAuthCredentials, cn), cC), cs); + static final String accountSIDTwillo = + X.r(X.r(X.r(Env.accountSIDTwillo, cn), cC), cs); + static final String serverAPI = X.r(X.r(X.r(Env.serverAPI, cn), cC), cs); + static final String mapAPIKEY = Env.mapAPIKEY; + static final String mapAPIKEYIOS = Env.mapAPIKEYIOS; + static final String twilloRecoveryCode = + X.r(X.r(X.r(Env.twilloRecoveryCode, cn), cC), cs); + static final String authTokenTwillo = + X.r(X.r(X.r(Env.authTokenTwillo, cn), cC), cs); + static final String chatGPTkey = X.r(X.r(X.r(Env.chatGPTkey, cn), cC), cs); + static final String transactionCloude = + X.r(X.r(X.r(Env.transactionCloude, cn), cC), cs); + static final String visionApi = X.r(X.r(X.r(Env.visionApi, cn), cC), cs); + static final String chatGPTkeySefer = + X.r(X.r(X.r(Env.chatGPTkeySefer, cn), cC), cs); + static final String chatGPTkeySeferNew = + X.r(X.r(X.r(Env.chatGPTkeySeferNew, cn), cC), cs); + static final String serverPHP = Env.serverPHP; + static final String llamaKey = X.r(X.r(X.r(Env.llamaKey, cn), cC), cs); + static final String cohere = X.r(X.r(X.r(Env.cohere, cn), cC), cs); + static final String claudeAiAPI = X.r(X.r(X.r(Env.claudeAiAPI, cn), cC), cs); + static final String geminiApi = X.r(X.r(X.r(Env.geminiApi, cn), cC), cs); + static final String agoraAppId = X.r(X.r(X.r(Env.agoraAppId, cn), cC), cs); + static final String agoraAppCertificate = + X.r(X.r(X.r(Env.agoraAppCertificate, cn), cC), cs); + static final String integrationIdPayMob = + X.r(X.r(X.r(Env.integrationIdPayMob, cn), cC), cs); + static final String passwordPayMob = + X.r(X.r(X.r(Env.passwordPayMob, cn), cC), cs); + static final String usernamePayMob = + X.r(X.r(X.r(Env.usernamePayMob, cn), cC), cs); + static final String payMobApikey = + X.r(X.r(X.r(Env.payMobApikey, cn), cC), cs); + static final String integrationIdPayMobWallet = + X.r(X.r(X.r(Env.integrationIdPayMobWallet, cn), cC), cs); + static final String apiKeyHere = Env.apiKeyHere; + static final String smsPasswordEgypt = + X.r(X.r(X.r(Env.smsPasswordEgypt, cn), cC), cs); + static final String ocpApimSubscriptionKey = Env.ocpApimSubscriptionKey; + static final String chatGPTkeySeferNew4 = + X.r(X.r(X.r(Env.chatGPTkeySeferNew4, cn), cC), cs); + static final String anthropicAIkeySeferNew = + X.r(X.r(X.r(Env.anthropicAIkeySeferNew, cn), cC), cs); + static final String llama3Key = X.r(X.r(X.r(Env.llama3Key, cn), cC), cs); + static final String payMobOutClientSecrret = + X.r(X.r(X.r(Env.payMobOutClientSecrret, cn), cC), cs); + static final String payMobOutClient_id = + X.r(X.r(X.r(Env.payMobOutClient_id, cn), cC), cs); + static final String payMobOutPassword = + X.r(X.r(X.r(Env.payMobOutPassword, cn), cC), cs); + static final String payMobOutUserName = + X.r(X.r(X.r(Env.payMobOutUserName, cn), cC), cs); + +/////////// + static final String keyOfApp = X.r(X.r(X.r(Env.keyOfApp, cn), cC), cs); +} diff --git a/siro_rider/lib/constant/box_name.dart b/siro_rider/lib/constant/box_name.dart new file mode 100644 index 0000000..a7115ac --- /dev/null +++ b/siro_rider/lib/constant/box_name.dart @@ -0,0 +1,111 @@ +class BoxName { + static const String driverID = "driverID"; + static const String countryCode = "countryCode"; + static const String googlaMapApp = "googlaMapApp"; + + static const String tokenParent = "tokenParent"; + static const String lang = "lang"; + static const String serverChosen = "serverChosen"; + static const String security_check = "security_check"; + static const String gender = "gender"; + static const String themeMode = "themeMode"; + static const String jwt = "jwt"; + static const String lowEndMode = "lowEndMode"; + static const String deviceFpEncrypted = "deviceFpEncrypted"; + static const String appVersionChecked = "appVersionChecked"; + static const String lastName = "lastName"; + static const String fingerPrint = "fingerPrint"; + static const String payMobApikey = "payMobApikey"; + static const String refreshToken = "refreshToken"; + static const String serverLocations = "serverLocations"; + static const String carType = "carType"; + static const String carPlate = "carPlate"; + static const String basicLink = "basicLink"; + static const String packagInfo = "packagInfo"; + static const String paymentLink = "paymentLink"; + static const String locationName = "locationName"; + static const String isVerified = 'isVerified'; + static const String isFirstTime = 'isFirstTime'; + static const String firstTimeLoadKey = 'firstTimeLoadKey'; + static const String isSavedPhones = 'isSavedPhones'; + static const String statusDriverLocation = "statusDriverLocation"; + static const String isTest = "isTest"; + static const String hmac = "hmac"; + static const String password = "password"; + static const String validity = "validity"; + static const String promo = "promo"; + static const String discount = "discount"; + static const String arrivalTime = "arrivalTime"; + static const String passwordDriver = "passwordDriver"; + static const String agreeTerms = "agreeTerms"; + static const String addWork = 'addWork'; + static const String addHome = 'addHome'; + static const String placesDestination = 'placesDestination'; + static const String tipPercentage = 'tipPercentage'; + + static const String faceDetectTimes = "faceDetectTimes"; + static const String sosPhonePassenger = "sosPhonePassenger"; + static const String sosPhoneDriver = "sosPhoneDriver"; + static const String passengerID = "pasengerID"; + static const String phone = "phone"; + static const String package = "package"; + static const String isInstall = "isInstall"; + static const String isGiftToken = "isGiftToken"; + static const String inviteCode = "inviteCode"; + static const String phoneWallet = "phoneWallet"; + static const String phoneDriver = "phoneDriver"; + static const String dobDriver = "dobDriver"; + static const String sexDriver = "sexDriver"; + static const String lastNameDriver = "lastNameDriver"; + static const String name = "name"; + static const String locationPermission = "locationPermission"; + static const String nameDriver = "nameDriver"; + static const String driverPhotoUrl = "driverPhotoUrl"; + static const String passengerPhotoUrl = "passengerPhotoUrl"; + static const String email = "email"; + static const String emailDriver = "emailDriver"; + static const String tokens = "tokens"; + static const String tokenFCM = "tokenFCM"; + static const String tokenDriver = "tokenDriver"; + static const String cardNumber = "cardNumber"; + static const String cardNumberDriver = "cardNumberDriver"; + static const String cardHolderName = "cardHolderName"; + static const String cardHolderNameDriver = "cardHolderNameDriver"; + static const String expiryDate = "expiryDate"; + static const String expiryDateDriver = "expiryDateDriver"; + static const String cvvCode = "cvvCode"; + static const String cvvCodeDriver = "cvvCodeDriver"; + static const String passengerWalletDetails = "passengerWalletDetails"; + static const String passengerWalletTotal = "passengerWalletTotal"; + static const String passengerWalletFound = "passengerWalletFound"; + static const String periods = 'periods'; + static const String onBoarding = 'onBoarding'; + + static const String apiKeyRun = 'apiKeyRun'; + static const String keyOfApp = 'keyOfApp'; + static const String initializationVector = 'initializationVector'; + static const String serverAPI = 'serverAPI'; + static const String secretKey = 'secretKey'; + static const String basicAuthCredentials = 'basicAuthCredentials'; + static const String mapAPIKEY = 'mapAPIKEY'; + static const String twilloRecoveryCode = 'twilloRecoveryCode'; + static const String accountSIDTwillo = 'accountSIDTwillo'; + static const String authTokenTwillo = 'authTokenTwillo'; + static const String chatGPTkey = 'chatGPTkey'; + static const String chatGPTkeySefer = 'chatGPTkeySefer'; + static const String transactionCloude = 'transactionCloude'; + static const String visionApi = 'visionApi'; + static const String vin = "vin"; + static const String isvibrate = "isvibrate"; + static const String make = "make"; + static const String model = "model"; + static const String year = "year"; + static const String expirationDate = "expirationDate"; + static const String color = "color"; + static const String owner = "owner"; + static const String registrationDate = "registrationDate"; + static const String recentLocations = 'recentLocations'; + static const String tripData = 'tripData'; + static const String parentTripSelected = 'parentTripSelected'; + static const String styleVersion = 'styleVersion'; +} diff --git a/siro_rider/lib/constant/char_map.dart b/siro_rider/lib/constant/char_map.dart new file mode 100644 index 0000000..ca5ee37 --- /dev/null +++ b/siro_rider/lib/constant/char_map.dart @@ -0,0 +1,75 @@ +import '../env/env.dart'; + +Map cs = { + "a": Env.a, + "b": Env.b, + "c": Env.c, + "d": Env.d, + "e": Env.e, + "f": Env.f, + "g": Env.g, + "h": Env.h, + "i": Env.i, + "j": Env.j, + "k": Env.k, + "l": Env.l, + "m": Env.m, + "n": Env.n, + "o": Env.o, + "p": Env.p, + "q": Env.q, + "r": Env.r, + "s": Env.s, + "t": Env.t, + "u": Env.u, + "v": Env.v, + "w": Env.w, + "x": Env.x, + "y": Env.y, + "z": Env.z, +}; +Map cC = { + "A": Env.A, + "B": Env.B, + "C": Env.C, + "D": Env.D, + "E": Env.E, + "F": Env.F, + "G": Env.G, + "H": Env.H, + "I": Env.I, + "J": Env.J, + "K": Env.K, + "L": Env.L, + "M": Env.M, + "N": Env.N, + "O": Env.O, + "P": Env.P, + "Q": Env.Q, + "R": Env.R, + "S": Env.S, + "T": Env.T, + "U": Env.U, + "V": Env.V, + "W": Env.W, + "X": Env.X, + "Y": Env.Y, + "Z": Env.Z +}; + +// + +// + +Map cn = { + "0": "3", + "1": "7", + "2": "1", + "3": "9", + "4": "0", + "5": "5", + "6": "2", + "7": "6", + "8": "4", + "9": "8" +}; diff --git a/siro_rider/lib/constant/colors.dart b/siro_rider/lib/constant/colors.dart new file mode 100644 index 0000000..fbd0c36 --- /dev/null +++ b/siro_rider/lib/constant/colors.dart @@ -0,0 +1,66 @@ +import 'package:flutter/material.dart'; +import 'package:get/get.dart'; +/// A class that holds the color palette for the 'Intaleq' app. +/// The palette is professionally designed to be modern, cohesive, and culturally +/// relevant, inspired by the Syrian flag and the app's brand identity. +class AppColor { + // --- Core Brand Colors (Inspired by the Syrian Flag) --- + + /// **Primary Color:** The brand's signature Twitter Blue representing trust and modern communication. + /// Ideal for app bars, primary buttons, and major UI elements. + static const Color primaryColor = Color(0xFF1DA1F2); + + /// **Text/Write Color:** A very dark, near-black color for main text. + /// It's softer on the eyes than pure black, improving readability. + /// The variable name `writeColor` is kept as requested. + static Color get writeColor => Get.isDarkMode ? Colors.white : const Color(0xFF1A1A1A); + + /// **Secondary Color:** Pure white, used for backgrounds to create a clean + /// and spacious look, ensuring content stands out. + static Color get secondaryColor => Get.isDarkMode ? const Color(0xFF1E1E1E) : Colors.white; + + /// **Accent Color:** A vibrant, energetic red from the Syrian flag. + /// Perfect for calls-to-action, highlights, icons, and notifications. + static const Color accentColor = Color.fromARGB(255, 148, 140, 141); + + // --- Neutral & Status Colors --- + + /// **Grey Color:** A neutral grey for secondary text, borders, dividers, + /// and disabled states. + static Color get grayColor => Get.isDarkMode ? Colors.grey[400]! : const Color(0xFF8E8E93); + + /// **Red Color (Error):** A clear, attention-grabbing red for error messages and alerts. + static const Color redColor = Color(0xFFD32F2F); + + /// **Green Color (Success):** A positive green for success messages and confirmations. + static const Color greenColor = Color(0xFF388E3C); + + /// **Blue Color (Info):** A standard blue for informational text, links, or icons. + static const Color blueColor = Color(0xFF108942); + + /// **Yellow Color (Warning):** A warm yellow for warning messages or important highlights. + static const Color yellowColor = Color(0xFFFFA000); + + // --- Tier & Social Colors --- + + /// **Gold Tier:** A bright gold for premium features, user ranks, or rewards. + static const Color gold = Color(0xFFFFD700); + + /// **Bronze Tiers:** Classic bronze colors for other user tiers or levels. + static const Color bronze = Color(0xFFCD7F32); + static const Color goldenBronze = Color(0xFFB87333); // Kept from original + + /// **Twitter/X Color:** The official brand color for social login buttons. + + /// **Twitter Blue:** The brand's signature blue color used for the drawer, + /// menu icons, and secondary actions (formerly Cyan Blue). + static Color get cyanBlue => const Color(0xFF1DA1F2); + + /// **Blue Accent:** A softer, translucent version of the brand blue. + static Color get cyanAccent => const Color(0xFF1DA1F2).withOpacity(0.12); + + // --- Utility Colors --- + + /// **Accent Tint:** A transparent version of the red accent color. + static Color get deepPurpleAccent => const Color(0xFFCE1126).withOpacity(0.1); +} diff --git a/siro_rider/lib/constant/country_polygons.dart b/siro_rider/lib/constant/country_polygons.dart new file mode 100644 index 0000000..ec72272 --- /dev/null +++ b/siro_rider/lib/constant/country_polygons.dart @@ -0,0 +1,137 @@ +// في ملف: constant/country_polygons.dart + +import 'package:intaleq_maps/intaleq_maps.dart'; + +class CountryPolygons { + // ========================================================== + // 1. الأردن: تغطية الممر الحضري الرئيسي (من إربد شمالاً حتى العقبة جنوباً) + // حوالي 12 نقطة + // ========================================================== + static final List jordanBoundary = [ + // شمال إربد (قرب الحدود) + const LatLng(32.65, 35.80), + // شمال شرق المفرق + const LatLng(32.35, 37.00), + // شرق الزرقاء / الأزرق + const LatLng(31.85, 36.80), + // جنوب شرق (نهاية الزحف السكاني) + const LatLng(31.00, 36.50), + // جنوب / معان + const LatLng(30.30, 35.75), + // العقبة + const LatLng(29.50, 35.00), + // البحر الأحمر / الحدود الغربية + const LatLng(29.50, 34.85), + // غرب وادي عربة + const LatLng(30.80, 35.25), + // منطقة البحر الميت / السلط + const LatLng(32.00, 35.50), + // العودة عبر وادي الأردن إلى الشمال + const LatLng(32.45, 35.60), + // العودة لنقطة إربد + const LatLng(32.65, 35.80), + ]; + + // ========================================================== + // 2. سوريا: تغطية الممر الغربي والساحلي (درعا، دمشق، حمص، حماة، حلب، الساحل) + // حوالي 14 نقطة + // ========================================================== + static final List syriaBoundary = [ + // درعا / الجنوب + const LatLng(32.65, 35.95), + // شرق السويداء (حدود المنطقة المأهولة) + const LatLng(32.85, 37.10), + // أطراف دمشق الشرقية + const LatLng(33.50, 36.65), + // تدمر (أقصى امتداد شرقي للمضلع) + const LatLng(34.50, 38.30), + // الرقة (شمال شرق) + const LatLng(35.95, 38.80), + // حلب (الشمال) + const LatLng(36.45, 37.15), + // الحدود الشمالية الغربية (إدلب / تركيا) + const LatLng(36.50, 36.50), + // اللاذقية (الساحل) + const LatLng(35.50, 35.75), + // طرطوس (الساحل) + const LatLng(34.80, 35.85), + // حمص + const LatLng(34.70, 36.70), + // حماة + const LatLng(35.10, 36.70), + // العودة إلى منطقة دمشق + const LatLng(33.40, 36.30), + // العودة إلى درعا + const LatLng(32.65, 35.95), + ]; + + // ========================================================== + // 3. مصر: تغطية القاهرة الكبرى، الدلتا، والإسكندرية والإسماعيلية + // حوالي 10 نقاط + // ========================================================== + static final List egyptBoundary = [ + // جنوب الفيوم (أقصى امتداد جنوبي غربي) + const LatLng(29.20, 30.60), + // جنوب القاهرة (العياط) + const LatLng(29.80, 31.30), + // شرق السويس + const LatLng(29.95, 32.70), + // الإسماعيلية / القناة + const LatLng(30.60, 32.25), + // بورسعيد / أطراف الدلتا الشمالية الشرقية + const LatLng(31.30, 31.80), + // دمياط / ساحل الدلتا + const LatLng(31.50, 31.25), + // الإسكندرية (أقصى الشمال الغربي) + const LatLng(31.20, 29.80), + // غرب الدلتا + const LatLng(30.50, 30.20), + // العودة لنقطة البداية + const LatLng(29.20, 30.60), + ]; + + // دالة تُرجع رابط API بناءً على اسم الدولة + // static String getRoutingApiUrl(String countryName) { + // switch (countryName) { + // case 'Jordan': + // return 'https://routec.intaleq.xyz/route-jo'; + // case 'Syria': + // return 'https://routec.intaleq.xyz/route'; + // case 'Egypt': + // return 'https://routec.intaleq.xyz/route-eg'; + // default: + // // الافتراضي في حالة لم يقع الموقع ضمن أي من المضلعات + // return 'https://routec.intaleq.xyz/route'; + // } + // } + + /// دالة تحدد اسم الدولة (باللغة الإنجليزية للـ API) بناءً على الإحداثيات + static String getCountryName(LatLng? point) { + if (point == null) return "jordan"; + + if (_isPointInPolygon(point, jordanBoundary)) return "jordan"; + if (_isPointInPolygon(point, syriaBoundary)) return "syria"; + if (_isPointInPolygon(point, egyptBoundary)) return "egypt"; + + return "jordan"; // الافتراضي + } + + /// خوارزمية Ray Casting للتحقق من وقوع نقطة داخل مضلع + static bool _isPointInPolygon(LatLng p, List polygon) { + bool isInside = false; + int j = polygon.length - 1; + for (int i = 0; i < polygon.length; i++) { + if (((polygon[i].latitude > p.latitude) != + (polygon[j].latitude > p.latitude)) && + (p.longitude < + (polygon[j].longitude - polygon[i].longitude) * + (p.latitude - polygon[i].latitude) / + (polygon[j].latitude - polygon[i].latitude) + + polygon[i].longitude)) { + isInside = !isInside; + } + j = i; + } + return isInside; + } +} diff --git a/siro_rider/lib/constant/credential.dart b/siro_rider/lib/constant/credential.dart new file mode 100644 index 0000000..00789a7 --- /dev/null +++ b/siro_rider/lib/constant/credential.dart @@ -0,0 +1,145 @@ +import 'package:siro_rider/print.dart'; +import 'dart:convert'; +import 'package:crypto/crypto.dart'; + +import '../controller/functions/crud.dart'; +import '../main.dart'; +import 'box_name.dart'; +import 'char_map.dart'; +import 'links.dart'; + +class AC { + gAK() async { + if (box.read(BoxName.apiKeyRun).toString() != 'run') { + var res = await CRUD().get(link: AppLink.getApiKey, payload: {}); + var decod = jsonDecode(res); + Log.print(decod); + Map jsonData = {}; + for (var i = 0; i < decod['message'].length; i++) { + String h = decod['message'][i]['hashed_key'].toString(); + String retrievedString = r(r(r(h, cn), cC), cs); + + await storage.write( + key: decod['message'][i]['name'].toString(), + value: retrievedString.toString(), + ); + // + String name = decod['message'][i]['name'].toString(); + String value = decod['message'][i]['hashed_key'].toString(); + + jsonData[name] = value; + } + String jsonString = json.encode(jsonData); + Log.print(jsonString); + box.write(BoxName.apiKeyRun, 'run'); + } + } + + String q(String b, String c) { + final d = utf8.encode(c); + final e = utf8.encode(b); + + final f = Hmac(sha256, d); + final g = f.convert(e); + + final h = g.bytes; + final i = base64Url.encode(h); + return i; + } + + String j(String k, String l) { + final m = utf8.encode(l); + final n = base64Url.decode(k); + + final o = Hmac(sha256, m); + final p = o.convert(n); + + final q = utf8.decode(p.bytes); + return q; + } + + String a(String b, String c) { + int d = b.length; + int e = d ~/ 4; + + List f = []; + for (int g = 0; g < d; g += e) { + int h = g + e; + if (h > d) { + h = d; + } + String i = b.substring(g, h); + f.add(i); + } + + // print(f); + Map j = {}; + j['birinci'] = f[4]; + j['ikinci'] = f[2]; + j['üçüncü'] = c + f[1]; + j['dördüncü'] = f[0]; + j['beş'] = f[3]; + + String k = ''; + j.forEach((l, m) { + k += m; + }); + + return k; + } + + Map n(String o, String c) { + String p = o.replaceAll(c, ''); + + Map q = {}; + q['birinci'] = p[p.length - 5] + p[p.length - 3]; + q['ikinci'] = p[p.length - 1] + p[p.length - 15]; + q['üçüncü'] = p[p.length - 9] + p[p.length - 12]; + q['dördüncü'] = p[p.length - 11] + p[p.length - 6]; + q['beş'] = p[p.length - 2] + p[p.length - 8]; + + return q; + } + + String c(String a, Map b) { + StringBuffer c = StringBuffer(); + c.write(a); + + String d = "Bl"; + c.write(b[d] ?? d); + + StringBuffer e = StringBuffer(); + String f = c.toString(); + + for (int g = 0; g < f.length; g++) { + String h = f[g]; + e.write(b[h] ?? h); + } + + return e.toString(); + } + + String r(String a, Map b) { + StringBuffer c = StringBuffer(); + String d = "Bl"; + int e = d.length; + + for (int f = 0; f < a.length; f++) { + String g = a[f]; + String h = b.keys.firstWhere( + (i) => b[i] == g, + orElse: () => g, + ); + + c.write(h); + } + + String j = c.toString(); + + if (j.endsWith(d)) { + j = j.substring(0, j.length - e); + } + + return j; + } +} diff --git a/siro_rider/lib/constant/info.dart b/siro_rider/lib/constant/info.dart new file mode 100644 index 0000000..63f35f1 --- /dev/null +++ b/siro_rider/lib/constant/info.dart @@ -0,0 +1,288 @@ +class AppInformation { + static const String companyName = 'Intaleq llc'; + static const String appName = 'Intaleq'; + static const String phoneNumber = '962798583052'; + static const String linkedInProfile = + 'https://www.linkedin.com/in/hamza-ayed/'; + static const String website = 'https://intaleqapp.com'; + static const String email = 'hamzaayed@intaleqapp.com'; + static const String addd = 'BlBlNl'; + static const String privacyPolicy = ''' + + + + + + Intaleq - Privacy Policy & Terms of Use + + + +

Privacy Policy & Terms of Use

+ +
+

Effective Date: August 9, 2025

+

Last Updated: August 9, 2025

+
+ +

1. Introduction and Acceptance

+

By downloading, registering, or using the Intaleq application ("App"), you agree to be bound by this Privacy Policy and our Terms of Use. If you do not agree, you must stop using the App immediately. Your continued use constitutes acceptance of these terms and any future updates.

+ +

2. Definitions

+
    +
  • "Intaleq", "we", "us": Refers to the Intaleq for Ride Hailing company, Damascus – Syria (Owner & operator), which provides the technology platform.
  • +
  • "Driver": An independent service provider who uses the App to offer transportation services.
  • +
  • "Passenger", "you": An individual who uses the App to request transportation services.
  • +
  • "Services": The connection between Passengers and Drivers facilitated by our App.
  • +
+ +

3. Privacy Policy

+ +

3.1 Information We Collect

+

We collect information necessary to provide and improve our Services.

+ +

A. Information You Provide:

+
    +
  • For Drivers: To ensure safety and compliance, we collect identity information, including your full name, phone number, personal photo, and official documents (e.g., driver's license, vehicle registration).
  • +
  • For Passengers: We only require a phone number for registration and communication. We are not authorized to request or view official identity documents for passengers.
  • +
+ +

B. Information Collected Automatically:

+
    +
  • Location Data: We collect precise location data when the App is in use to facilitate ride matching, navigation, and for safety purposes.
  • +
  • Device Data: We collect information about your device, such as model, operating system, and unique identifiers, to ensure App functionality and for security verification.
  • +
  • Usage Data: We log how you interact with our App, including trip history and features used, to improve our services.
  • +
+ +

3.2 Payment Information

+

We do not collect, process, or store any sensitive payment information like credit/debit card numbers. We facilitate payments by connecting you to licensed, local third-party providers:

+
    +
  • Mobile Carrier Billing: Payments via MTN and Syriatel are processed directly by them based on your registered phone number. A one-time password (OTP) sent by the carrier is required to confirm the transaction.
  • +
  • Bank Card Payments: We connect you with the Syrian company "eCash" to process card payments. They handle the transaction, and your bank will send an OTP to your phone to authorize it.
  • +
+ +

3.3 How We Use Your Information

+
    +
  • To operate and maintain the Services (e.g., connect Drivers and Passengers).
  • +
  • To verify Driver identity and eligibility.
  • +
  • To improve App security and prevent fraud.
  • +
  • To provide customer support.
  • +
  • To comply with legal obligations.
  • +
+ +

3.4 Data Sharing

+

We do not sell your personal data. We only share it in the following limited circumstances:

+
    +
  • Between Passenger and Driver: To facilitate a ride, we share necessary information like name, photo, and real-time location.
  • +
  • With Service Providers: For services like payment processing and mapping. These providers are contractually obligated to protect your data.
  • +
  • For Legal Reasons: If required by law or a valid legal order.
  • +
+ +

3.5 Policy for Minors

+

Our services are intended for individuals over the age of 18. + For Drivers: We strictly verify the identity and age of all drivers to ensure no minors are operating on our platform. + For Passengers: While we do not verify passenger identity, the service is not directed at children under 18. If a parent or guardian becomes aware that their child has provided us with information without their consent, they should contact us immediately.

+ +

4. User Obligations & Conduct

+
    +
  • You must provide accurate and current information during registration.
  • +
  • You are responsible for maintaining the security of your account.
  • +
  • You agree not to use the App for any illegal activities, to harass others, or to cause damage to a Driver's vehicle.
  • +
+ +

5. Disclaimer of Liability

+

The App is provided "as is". Intaleq is an intermediary platform and is not liable for the actions of Drivers or Passengers, accidents, delays, or any disputes between users. Our liability is limited to the fullest extent permitted by law.

+ +

6. Policy Updates

+

We may update these terms. If we make significant changes, we will notify you within the App. You will be required to review and accept the new terms to continue using the Services, ensuring your consent is active and informed.

+ +

7. Account Deletion & Contact

+

You have the right to request the deletion of your account and personal data. To do so, or for any other questions, please contact us. We will respond to deletion requests within 30 days.

+

Email: support@intaleqapp.com

+ + + +'''; + + static const String privacyPolicyArabic = ''' + + + + + + انطلق - سياسة الخصوصية وشروط الاستخدام + + + +

سياسة الخصوصية وشروط الاستخدام

+ +
+

تاريخ النفاذ: 9 أغسطس 2025

+

آخر تحديث: 9 أغسطس 2025

+
+ +

1. المقدمة والقبول

+

عبر تحميل أو تسجيل أو استخدام تطبيق "انطلق" ("التطبيق")، فإنك توافق على الالتزام بسياسة الخصوصية وشروط الاستخدام هذه. إذا كنت لا توافق، يجب عليك التوقف فورًا عن استخدام التطبيق. استمرارك في الاستخدام يُعد قبولاً لهذه الشروط وأي تحديثات مستقبلية لها.

+ +

2. التعريفات

+
    +
  • "انطلق"، "نحن": تشير إلى شركة انطلق لنقل الركاب، دمشق – سوريا (مالك ومشغل التطبيق)، التي توفر المنصة التقنية.
  • +
  • "السائق": مقدم خدمة مستقل يستخدم التطبيق لتقديم خدمات النقل.
  • +
  • "الراكب"، "أنت": الفرد الذي يستخدم التطبيق لطلب خدمات النقل.
  • +
  • "الخدمات": عملية الربط بين الركاب والسائقين التي يسهلها تطبيقنا.
  • +
+ +

3. سياسة الخصوصية

+ +

3.1 المعلومات التي نجمعها

+

نحن نجمع المعلومات الضرورية لتقديم خدماتنا وتحسينها.

+ +

أ. المعلومات التي تقدمها بنفسك:

+
    +
  • بالنسبة للسائقين: لضمان السلامة والامتثال للقوانين، نجمع بيانات الهوية الشخصية، بما في ذلك الاسم الكامل، رقم الهاتف، صورة شخصية، والوثائق الرسمية (مثل رخصة القيادة وتسجيل المركبة).
  • +
  • بالنسبة للركاب: نطلب فقط رقم هاتف للتسجيل والتواصل. نحن غير مخولين بطلب أو الاطلاع على وثائق الهوية الرسمية للركاب.
  • +
+ +

ب. المعلومات التي تُجمع تلقائيًا:

+
    +
  • بيانات الموقع: نجمع بيانات الموقع الجغرافي الدقيقة عند استخدام التطبيق لتسهيل تحديد أماكن الانطلاق والوصول، الملاحة، ولأغراض السلامة.
  • +
  • بيانات الجهاز: نجمع معلومات عن جهازك (طراز، نظام تشغيل، معرفات فريدة) لضمان عمل التطبيق وللتحقق الأمني.
  • +
  • بيانات الاستخدام: نسجل كيفية تفاعلك مع التطبيق، بما في ذلك سجل الرحلات والميزات المستخدمة، بهدف تحسين خدماتنا.
  • +
+ +

3.2 معلومات الدفع

+

نحن لا نجمع أو نعالج أو نخزن أي معلومات دفع حساسة مثل أرقام بطاقات الائتمان/الخصم. نحن نسهل عمليات الدفع عبر ربطك بمزودي خدمات محليين مرخصين:

+
    +
  • الدفع عبر رصيد الهاتف المحمول: تتم معالجة الدفعات عبر شركتي MTN و Syriatel مباشرة من خلالهما بناءً على رقم هاتفك المسجل لديهم. يتطلب تأكيد العملية إدخال رمز تحقق (OTP) يُرسل من قبل شركة الاتصالات.
  • +
  • الدفع عبر البطاقات البنكية: نربطك بشركة "eCash" السورية لمعالجة الدفعات بالبطاقات. هي التي تتولى المعاملة، وسيقوم البنك الذي تتعامل معه بإرسال رمز تحقق (OTP) إلى هاتفك لتفويض العملية.
  • +
+ +

3.3 كيف نستخدم معلوماتك

+
    +
  • لتشغيل وصيانة الخدمات (مثل الربط بين السائقين والركاب).
  • +
  • للتحقق من هوية السائقين وأهليتهم.
  • +
  • لتحسين أمان التطبيق ومنع الاحتيال.
  • +
  • لتقديم الدعم الفني للعملاء.
  • +
  • للامتثال للالتزامات القانونية.
  • +
+ +

3.4 مشاركة البيانات

+

نحن لا نبيع بياناتك الشخصية. نشاركها فقط في الحالات المحدودة التالية:

+
    +
  • بين الراكب والسائق: لتسهيل الرحلة، نشارك المعلومات الضرورية مثل الاسم، الصورة، والموقع المباشر.
  • +
  • مع مزودي الخدمات: مثل معالجي الدفع وخدمات الخرائط. هؤلاء المزودون ملزمون تعاقديًا بحماية بياناتك.
  • +
  • لأسباب قانونية: إذا طُلب ذلك بموجب القانون أو أمر قضائي ساري المفعول.
  • +
+ +

3.5 سياسة القاصرين

+

خدماتنا موجهة للأفراد الذين تزيد أعمارهم عن 18 عامًا. + بالنسبة للسائقين: نحن نتحقق بدقة من هوية وعمر جميع السائقين لضمان عدم وجود قاصرين يعملون على منصتنا. + بالنسبة للركاب: على الرغم من أننا لا نتحقق من هوية الركاب، فإن الخدمة غير موجهة للأطفال دون سن 18. إذا علم ولي الأمر أن طفله قد زودنا بمعلومات دون موافقته، فيجب عليه الاتصال بنا على الفور.

+ +

4. التزامات المستخدم وسلوكه

+
    +
  • يجب عليك تقديم معلومات دقيقة وحديثة عند التسجيل.
  • +
  • أنت مسؤول عن الحفاظ على أمان حسابك.
  • +
  • أنت توافق على عدم استخدام التطبيق لأي أنشطة غير قانونية، أو لمضايقة الآخرين، أو التسبب في ضرر لمركبة السائق.
  • +
+ +

5. إخلاء المسؤولية

+

يتم تقديم التطبيق "كما هو". "انطلق" هي منصة وسيطة وليست مسؤولة عن تصرفات السائقين أو الركاب، أو الحوادث، أو التأخير، أو أي نزاعات بين المستخدمين. مسؤوليتنا محدودة إلى أقصى حد يسمح به القانون.

+ +

6. تحديثات السياسة

+

قد نقوم بتحديث هذه الشروط. في حال إجراء تغييرات جوهرية، سنقوم بإعلامك داخل التطبيق. سيُطلب منك مراجعة الشروط الجديدة وقبولها لمواصلة استخدام الخدمات، لضمان أن موافقتك فعالة ومبنية على معرفة.

+ +

7. حذف الحساب والتواصل

+

لديك الحق في طلب حذف حسابك وبياناتك الشخصية. للقيام بذلك، أو لأي استفسارات أخرى، يرجى التواصل معنا. سنرد على طلبات الحذف في غضون 30 يومًا.

+

البريد الإلكتروني: support@intaleqapp.com

+ + + +'''; +} diff --git a/siro_rider/lib/constant/links.dart b/siro_rider/lib/constant/links.dart new file mode 100644 index 0000000..cd91185 --- /dev/null +++ b/siro_rider/lib/constant/links.dart @@ -0,0 +1,372 @@ +import 'package:siro_rider/constant/box_name.dart'; +import 'package:siro_rider/main.dart'; + +class AppLink { + ///https://walletintaleq.intaleq.xyz/v1/main + static String paymentServer = 'https://walletintaleq.intaleq.xyz/v2/main'; + + ///https://api.intaleq.xyz/intaleq/ride/location + static String location = 'https://api.intaleq.xyz/intaleq_v3/ride/location'; + + /// هذا الرابط خاص برحلات الركاب، ويستخدمه السيرفر الجانبي للرحلات (Ride Server Side) للتعامل مع عمليات إلغاء الرحلات وتحديث حالة الرحلات وغيرها من العمليات المتعلقة بالرحلات. + /// https://routesy.intaleq.xyz for syria + /// for jordan https://routesjo.intaleq.xyz + static String routesOsm = 'https://routesy.intaleq.xyz'; + static String mapSaasRoute = 'https://map-saas.intaleqapp.com/api/maps/route'; + static String reverseGeocoding = + 'https://map-saas.intaleqapp.com/api/geocoding/reverse'; + static String searchGeocoding = + 'https://map-saas.intaleqapp.com/api/geocoding/search'; + static String mapSaasPlaces = + 'https://map-saas.intaleqapp.com/api/geocoding/places'; + + ///https://location.intaleq.xyz/intaleq/ride/location + ///locationServerSide هو السيرفر الجانبي الخاص بموقع السائقين، حيث يتم إرسال تحديثات الموقع من التطبيق إلى هذا السيرفر، ومن ثم يقوم هذا السيرفر بتوزيع هذه التحديثات إلى الركاب المتصلين الذين يتابعون السائق في الوقت الحقيقي. + static String locationServerSide = + 'https://location.intaleq.xyz/intaleq/ride/location'; + + ///https://api.intaleq.xyz/intaleq + static final String endPoint = 'https://api.intaleq.xyz/intaleq_v3'; + + /// هذا الرابط خاص برحلات الركاب، ويستخدمه السيرفر الجانبي للرحلات (Ride Server Side) للتعامل مع عمليات إلغاء الرحلات وتحديث حالة الرحلات وغيرها من العمليات المتعلقة بالرحلات. + /// https://rides.intaleq.xyz/intaleq + static final String rideServerSide = 'https://rides.intaleq.xyz/intaleq'; + + ///https://api.intaleq.xyz/intaleq + /// main api link for all api calls except rides and location + static final String server = 'https://api.intaleq.xyz/intaleq_v3'; + + ///https://rides.intaleq.xyz + /// هذا الرابط خاص برحلات الركاب، ويستخدمه السيرفر الجانبي للرحلات (Ride Server Side) للتعامل مع عمليات إلغاء الرحلات وتحديث حالة الرحلات وغيرها من العمليات المتعلقة بالرحلات. + static final String serverSocket = 'https://rides.intaleq.xyz'; + + /// + static String googleMapsLink = 'https://maps.googleapis.com/maps/api/'; + + /// here map link for searching for places + static String searcMaps = + 'https://autosuggest.search.hereapi.com/v1/autosuggest'; + + static String test = "$server/test.php"; + //===============firebase========================== + static String getTokens = "$server/ride/firebase/getTokensPassenger.php"; + static String getTokenParent = "$server/ride/firebase/getTokenParent.php"; + static String addTokens = "$server/ride/firebase/add.php"; + static String addFingerPrint = "$paymentServer/ride/firebase/add.php"; + static String addTokensDriver = "$server/ride/firebase/addDriver.php"; + static String packageInfo = "$server/auth/packageInfo.php"; + + //=======================Wallet=================== + static String wallet = '$paymentServer/ride/passengerWallet'; + static String walletDriver = '$paymentServer/ride/driverWallet'; + static String getAllPassengerTransaction = + "$wallet/getAllPassengerTransaction.php"; + static String getWalletByPassenger = "$wallet/getWalletByPassenger.php"; + static String getPassengersWallet = "$wallet/get.php"; + static String payWithPayMobWalletPasenger = + '$paymentServer/ride/payMob/wallet/payWithPayMob.php'; + static String payWithPayMobCardPassenger = + '$paymentServer/ride/payMob/payWithPayMob.php'; + static String payWithEcash = "$paymentServer/ecash/payWithEcash.php"; + + static String paymetVerifyPassenger = + "$paymentServer/ride/payMob/paymet_verfy.php"; + static String getPassengerWalletArchive = + "$wallet/getPassengerWalletArchive.php"; + + static String addDrivePayment = "$paymentServer/ride/payment/add.php"; + static String addSeferWallet = "$paymentServer/ride/seferWallet/add.php"; + static String addPassengersWallet = "$wallet/add.php"; + static String deletePassengersWallet = "$wallet/delete.php"; + static String updatePassengersWallet = "$wallet/update.php"; + + static String getWalletByDriver = "$walletDriver/getWalletByDriver.php"; + static String getDriversWallet = "$walletDriver/get.php"; + static String addDriversWalletPoints = "$walletDriver/add.php"; + static String deleteDriversWallet = "$walletDriver/delete.php"; + static String updateDriversWallet = "$walletDriver/update.php"; + + //=======================promo===================ride.mobile-app.store/ride/promo/get.php + static String promo = '$server/ride/promo'; + static String getPassengersPromo = "$promo/get.php"; + static String getPromoFirst = "$promo/getPromoFirst.php"; + static String getPromoBytody = "$promo/getPromoBytody.php"; + static String addPassengersPromo = "$promo/add.php"; + static String deletePassengersPromo = "$promo/delete.php"; + static String updatePassengersPromo = "$promo/update.php"; + + //===============contact========================== + static String savePhones = "$server/ride/egyptPhones/add.php"; + static String getPhones = "$server/ride/egyptPhones/get.php"; + + ////=======================cancelRide=================== + // static String ride = '$server/ride'; + static String addCancelRideFromPassenger = + "$rideServerSide/cancelRide/add.php"; + static String cancelRide = "$rideServerSide/cancelRide/get.php"; +//-----------------ridessss------------------ + static String addRides = "$rideServerSide/ride/rides/add.php"; + static String getRides = "$rideServerSide/ride/rides/get.php"; + static String getRideOrderID = + "$rideServerSide/ride/rides/getRideOrderID.php"; + static String getRideStatus = "$rideServerSide/ride/rides/getRideStatus.php"; + static String getRideStatusBegin = + "$rideServerSide/ride/rides/getRideStatusBegin.php"; + static String getRideStatusFromStartApp = + "$server/ride/rides/getRideStatusFromStartApp.php"; + static String updateRides = "$rideServerSide/ride/rides/update.php"; + static String updateStausFromSpeed = + "$rideServerSide/ride/rides/updateStausFromSpeed.php"; + static String deleteRides = "$rideServerSide/ride/rides/delete.php"; + +//-----------------DriverPayment------------------ + static String adddriverScam = "$server/driver_scam/add.php"; + static String getdriverScam = "$server/ride/driver_scam/get.php"; + +/////////---getKazanPercent===//////////// + static String getKazanPercent = "$server/ride/kazan/get.php"; + static String addKazanPercent = "$server/ride/kazan/add.php"; + +////-----------------DriverPayment------------------ + static String addDriverpayment = "$paymentServer/ride/payment/add.php"; + static String addDriverPaymentPoints = + "$paymentServer/ride/driverPayment/add.php"; + static String addPaymentTokenPassenger = + "$paymentServer/ride/passengerWallet/addPaymentTokenPassenger.php"; + static String addPaymentTokenDriver = + "$paymentServer/ride/driverWallet/addPaymentToken.php"; + static String getDriverPaymentPoints = + "$paymentServer/ride/driverWallet/get.php"; + static String payWithEcashPassenger = + "$paymentServer/ride/ecash/passenger/payWithEcash.php"; + static String payWithMTNConfirm = + "$paymentServer/ride/mtn/passenger/mtn_confirm.php"; + static String payWithMTNStart = + "$paymentServer/ride/mtn/passenger/mtn_start.php"; + static String payWithSyriatelConfirm = + "$paymentServer/ride/syriatel/passenger/confirm_payment.php"; + static String payWithSyriatelStart = + "$paymentServer/ride/syriatel/passenger/start_payment.php"; + static String getDriverpaymentToday = "$paymentServer/ride/payment/get.php"; + static String getCountRide = "$paymentServer/ride/payment/getCountRide.php"; + static String getAllPaymentFromRide = + "$paymentServer/ride/payment/getAllPayment.php"; + static String getAllPaymentVisa = + "$paymentServer/ride/payment/getAllPaymentVisa.php"; + +//-----------------Passenger NotificationCaptain------------------ + static String addNotificationPassenger = + "$server/ride/notificationPassenger/add.php"; + static String getNotificationPassenger = + "$server/ride/notificationPassenger/get.php"; + static String updateNotificationPassenger = + "$server/ride/notificationPassenger/update.php"; +//-----------------Driver NotificationCaptain------------------ + static String addNotificationCaptain = + "$server/ride/notificationCaptain/add.php"; + static String addWaitingRide = + "$server/ride/notificationCaptain/addWaitingRide.php"; + static String updateWaitingTrip = + "$server/ride/notificationCaptain/updateWaitingTrip.php"; + static String getRideWaiting = + "$endPoint/ride/notificationCaptain/getRideWaiting.php"; + static String getNotificationCaptain = + "$server/ride/notificationCaptain/get.php"; + static String updateNotificationCaptain = + "$server/ride/notificationCaptain/update.php"; + static String deleteNotificationCaptain = + "$server/ride/notificationCaptain/delete.php"; + //-----------------invitor------------------ + + static String addInviteDriver = "$server/ride/invitor/add.php"; + static String addInvitationPassenger = + "$server/ride/invitor/addInvitationPassenger.php"; + static String getInviteDriver = "$server/ride/invitor/get.php"; + static String getDriverInvitationToPassengers = + "$server/ride/invitor/getDriverInvitationToPassengers.php"; + static String updateInviteDriver = "$server/ride/invitor/update.php"; + static String updatePassengerGift = + "$server/ride/invitor/updatePassengerGift.php"; + //-----------------Api Key------------------ + static String addApiKey = "$server/ride/apiKey/add.php"; + static String getApiKey = "$server/ride/apiKey/get.php"; + static String getCnMap = "$server/auth/cnMap.php"; + static String updateApiKey = "$server/ride/apiKey/update.php"; + static String deleteApiKey = "$server/ride/apiKey/delete.php"; + static String getPlacesSyria = "$server/ride/places_syria/get.php"; + +//-----------------Feed Back------------------ + static String addFeedBack = "$server/ride/feedBack/add.php"; + static String add_solve_all = "$server/ride/feedBack/add_solve_all.php"; + static String uploadAudio = "$server/ride/feedBack/upload_audio.php"; + static String getFeedBack = "$server/ride/feedBack/get.php"; + static String updateFeedBack = "$server/ride/feedBack/updateFeedBack.php"; + + //-----------------Tips------------------ + static String addTips = "$server/ride/tips/add.php"; + static String getTips = "$server/ride/tips/get.php"; + static String updateTips = "$server/ride/tips/update.php"; + +//-----------------Help Center------------------ + static String addhelpCenter = "$server/ride/helpCenter/add.php"; + static String gethelpCenter = "$server/ride/helpCenter/get.php"; + static String getByIdhelpCenter = "$server/ride/helpCenter/getById.php"; + static String updatehelpCenter = "$server/ride/helpCenter/update.php"; + static String deletehelpCenter = "$server/ride/helpCenter/delete.php"; + + //-----------------license------------------ + static String addLicense = "$server/ride/license/add.php"; + static String getLicense = "$server/ride/license/get.php"; + static String updateLicense = "$server/ride/license/updateFeedBack.php"; +//-----------------RegisrationCar------------------ + static String addRegisrationCar = "$server/ride/RegisrationCar/add.php"; + static String getRegisrationCar = + "${box.read(BoxName.serverChosen)}/server/ride/RegisrationCar/get.php"; + static String selectDriverAndCarForMishwariTrip = + "$server/ride/RegisrationCar/selectDriverAndCarForMishwariTrip.php"; + static String updateRegisrationCar = "$server/ride/RegisrationCar/update.php"; + +//-----------------mishwari------------------ + + static String addMishwari = "$server/ride/mishwari/add.php"; + static String cancelMishwari = "$server/ride/mishwari/cancel.php"; + static String getMishwari = "$server/ride/mishwari/get.php"; + static String sendChatMessage = "$server/ride/chat/send_message.php"; + +//-----------------DriverOrder------------------ + + static String addDriverOrder = "$server/ride/driver_order/add.php"; + static String getDriverOrder = "$server/ride/driver_order/get.php"; + static String getOrderCancelStatus = + "$server/ride/driver_order/getOrderCancelStatus.php"; + static String updateDriverOrder = "$server/ride/driver_order/update.php"; + static String deleteDriverOrder = "$server/ride/driver_order/delete.php"; + + // ===================================== + static String addRateToPassenger = "$server/ride/rate/add.php"; + static String savePlacesServer = "$server/ride/places/add.php"; + static String getapiKey = "$server/ride/apiKey/get.php"; + static String addRateToDriver = "$server/ride/rate/addRateToDriver.php"; + static String getDriverRate = "$server/ride/rate/getDriverRate.php"; + static String getPassengerRate = "$server/ride/rate/getPassengerRate.php"; + + ////////////////emails ============// + static String sendEmailToPassengerForTripDetails = + "$server/ride/rides/emailToPassengerTripDetail.php"; + +// =========================================== + static String pathImage = "$server/upload/types/"; + static String uploadImage = "$server/uploadImage.php"; + static String uploadImage1 = "$server/uploadImage1.php"; + static String uploadImagePortrate = "$server/uploadImagePortrate.php"; + static String uploadImageType = "$server/uploadImageType.php"; +//=============egypt documents ============== + static String uploadEgyptidFront = + "$server/EgyptDocuments/uploadEgyptidFront.php"; + static String uploadEgypt = "$server/uploadEgypt.php"; + + //==================certifcate========== + // static String location = '${box.read(BoxName.serverChosen)}/ride/location'; + static String getCarsLocationByPassenger = "$location/get.php"; + + static String getLocationAreaLinks = + '$server/ride/location/get_location_area_links.php'; + static String addpassengerLocation = + "$locationServerSide/addpassengerLocation.php"; + static String getCarsLocationByPassengerSpeed = "$location/getSpeed.php"; + static String getCarsLocationByPassengerComfort = "$location/getComfort.php"; + static String getCarsLocationByPassengerBalash = "$location/getBalash.php"; + static String getCarsLocationByPassengerElectric = + "$location/getElectric.php"; + static String getCarsLocationByPassengerPinkBike = + "$location/getPinkBike.php"; + static String getCarsLocationByPassengerVan = + "$location/getCarsLocationByPassengerVan.php"; + static String getCarsLocationByPassengerDelivery = + "$location/getDelivery.php"; + static String getLocationParents = "$location/getLocationParents.php"; + static String getFemalDriverLocationByPassenger = + "$location/getFemalDriver.php"; + static String getDriverCarsLocationToPassengerAfterApplied = + "$location/getDriverCarsLocationToPassengerAfterApplied.php"; +// static String addCarsLocationByPassenger = "$location/add.php"; +// static String deleteCarsLocationByPassenger = "$location/delete.php"; +// static String updateCarsLocationByPassenger = "$location/update.php"; +// static String getTotalDriverDuration = "$location/getTotalDriverDuration.php"; +// static String getTotalDriverDurationToday = + // "$location/getTotalDriverDurationToday.php"; + + //==================Blog============= + static String profile = '$server/ride/profile'; + static String getprofile = "$profile/get.php"; + static String getCaptainProfile = "$profile/getCaptainProfile.php"; + static String addprofile = "$profile/add.php"; + static String deleteprofile = "$profile/delete.php"; + static String updateprofile = "$profile/update.php"; + + //===================Auth============ + + static String auth = '$server/auth'; + static String login = "$auth/login.php"; + static String loginJwtRider = "$server/login.php"; + static String loginJwtWalletRider = "$server/loginWallet.php"; + static String loginFirstTime = "$server/loginFirstTime.php"; + static String getTesterApp = "$auth/Tester/getTesterApp.php"; + static String updateTesterApp = "$auth/Tester/updateTesterApp.php"; + static String signUp = "$auth/signup.php"; + static String sendVerifyEmail = "$auth/sendVerifyEmail.php"; + static String loginFromGooglePassenger = "$auth/loginFromGooglePassenger.php"; + static String checkPhoneNumberISVerfiedPassenger = + "$auth/checkPhoneNumberISVerfiedPassenger.php"; + + static String passengerRemovedAccountEmail = + "$auth/passengerRemovedAccountEmail.php"; + static String verifyEmail = "$auth/verifyEmail.php"; +//===================Auth Captin============ + static String authCaptin = '$server/auth/captin'; + static String loginCaptin = "$authCaptin/login.php"; + static String loginFromGoogleCaptin = "$authCaptin/loginFromGoogle.php"; + static String signUpCaptin = "$authCaptin/register.php"; + static String sendVerifyEmailCaptin = "$authCaptin/sendVerifyEmail.php"; + static String sendVerifyOtpMessage = "$server/auth/otpmessage.php"; + static String verifyOtpMessage = "$server/auth/verifyOtpMessage.php"; + static String verifyEmailCaptin = "$authCaptin/verifyEmail.php"; + static String removeUser = "$authCaptin/removeAccount.php"; + static String deletecaptainAccounr = "$authCaptin/deletecaptainAccounr.php"; + static String updateAccountBank = "$authCaptin/updateAccountBank.php"; + static String getAccount = "$authCaptin/getAccount.php"; + static String updatePassengersInvitation = + "$server/ride/invitor/updatePassengersInvitation.php"; + static String updateDriverInvitationDirectly = + "$server/ride/invitor/updateDriverInvitationDirectly.php"; + //===================Admin Captin============ + + static String getPassengerDetailsByPassengerID = + "$server/Admin/getPassengerDetailsByPassengerID.php"; + static String getPassengerDetails = "$server/Admin/getPassengerDetails.php"; + static String getPassengerbyEmail = "$server/Admin/getPassengerbyEmail.php"; + static String addAdminUser = "$server/Admin/adminUser/add.php"; + static String getAdminUser = "$server/Admin/adminUser/get.php"; + static String addError = "$server/Admin/errorApp.php"; + static String getCaptainDetailsByEmailOrIDOrPhone = + "$server/Admin/AdminCaptain/getCaptainDetailsByEmailOrIDOrPhone.php"; + static String getCaptainDetails = "$server/Admin/AdminCaptain/get.php"; + static String getRidesPerMonth = + "$server/Admin/AdminRide/getRidesPerMonth.php"; + static String getRidesDetails = "$server/Admin/AdminRide/get.php"; + +//////////Sms egypt/////////// + static String sendSms = "https://sms.kazumi.me/api/sms/send-sms"; + static String sendSmsFromPHP = + '$server/auth/sms_new_backend/sendOtpPassenger.php'; + static String verifyOtpPassenger = + '$server/auth/passengerOTP/verifyOtpPassenger.php'; + static String senddlr = "https://sms.kazumi.me/api/sms/send-dlr"; + static String sendvalidity = "https://sms.kazumi.me/api/sms/send-validity"; + static String sendmany = "https://sms.kazumi.me/api/sms/send-many"; + static String checkCredit = "https://sms.kazumi.me/api/sms/check-credit"; + static String getSender = "$server/auth/sms/getSender.php"; + static String checkStatus = "https://sms.kazumi.me/api/sms/check-status"; + static String updatePhoneInvalidSMSPassenger = + "$server/auth/sms/updatePhoneInvalidSMSPassenger.php"; +} diff --git a/siro_rider/lib/constant/notification.dart b/siro_rider/lib/constant/notification.dart new file mode 100644 index 0000000..5da2bf8 --- /dev/null +++ b/siro_rider/lib/constant/notification.dart @@ -0,0 +1,31 @@ +List passengerMessages = [ + // --- رسائل العروض والتوفير --- + "وفر على حالك: 🚗 أسعار انطلق نازلة كتير! شوف العروض الجديدة وفوت هلأ قبل ما تخلص. 🌟", + "خصم اليوم: 🤔 لا تفوّت الفرصة! افتح تطبيق انطلق وشوف الأسعار يلي ما بتنعاد.", + "عروض نارية: 🎁 اليوم خصم خاص إلك، احجز مشوارك الجاي بسعر ولا أروع!", + "مشاوير اقتصادية: 💸 مع انطلق بتتحرك براحتك وبتدفع أقل، جرب وشوف الفرق!", + + // --- رسائل السهولة والراحة --- + "مشوار بكبسة زر: 📲 افتح تطبيق انطلق، وخلِّي السيارة توصلك لعندك بثواني.", + "ارتاح من المواصلات: 🤔 خلّي انطلق يريحك من الانتظار والزحمة، وانطلق وين ما بدك.", + "سيارتك جاهزة: 🚕 الكابتن ناطر طلبك، حدد وجهتك وخلّي الطريق علينا.", + "رحلة مريحة: 🛣️ ارتاح بالكرسي، نحنا منهتم بكل التفاصيل من الباب للباب.", + + // --- رسائل الأمان والثقة --- + "رحلتك بأمان: 🙏 كل كباتنّا مدرّبين وملتزمين، وسلامتك أولويتنا.", + "سافر وانت مطمّن: 🔒 مع انطلق كل شي موثوق ومسجّل لتكون مرتاح البال.", + "شارك رحلتك: ❤️ فيك تبعت تفاصيل المشوار لأهلك أو رفقاتك بخطوة وحدة.", + "انطلق بثقة: ✅ كل الرحلات مراقبة لتضمن تجربة آمنة ومريحة 100%.", + + // --- رسائل تفاعلية ومناسبات --- + "الويكند بلّش: 🥳 خلي مشاويرك مع الأصحاب علينا، وفر وقتك وفلوسك مع انطلق.", + "رايح عالشغل: 💼 لا تتأخر، افتح التطبيق وخلي الكابتن يوصلك بلا تعب.", + "الشمس مولّعة: ☀️ لا تمشي تحت الحر، خلي السيارة تجي لعندك.", + "مستعجل: 🏃‍♂️ لا تقلق، انطلق أسرع طريق لتوصل عموعدك.", + + // --- رسائل تشجيعية عامة --- + "وين رايح اليوم؟ 🗺️ وين ما كانت وجهتك، انطلق بيخدمك بكل مكان وبأي وقت.", + "جرب شي جديد: 🚘 شوف فئات السيارات الجديدة وخلي رحلتك أريح وأجمل.", + "شكراً لاختيارك: ⭐ وجودك معنا بيفرحنا، ونتمنى دايماً تكون رحلتك مريحة وسعيدة.", + "كل يوم جديد: ✨ فوت عالتطبيق وتابع آخر التحديثات والعروض يلي نازلة خصيصاً إلك." +]; diff --git a/siro_rider/lib/constant/sefer cairo server.php b/siro_rider/lib/constant/sefer cairo server.php new file mode 100644 index 0000000..a5368af --- /dev/null +++ b/siro_rider/lib/constant/sefer cairo server.php @@ -0,0 +1,198 @@ +sefer cairo server + + +server { + listen 80; + listen [::]:80; + listen 443 ssl http2; + listen [::]:443 ssl http2; + {{ssl_certificate_key}} + {{ssl_certificate}} + server_name www.sefer.click; + return 301 https://sefer.click$request_uri; +} +server { + listen 80; + listen [::]:80; + listen 443 ssl http2; + listen [::]:443 ssl http2; + {{ssl_certificate_key}} + {{ssl_certificate}} + server_name sefer.click www1.sefer.click; + {{root}} + {{nginx_access_log}} + {{nginx_error_log}} + # Set the maximum request body size + client_max_body_size 10m; + if ($scheme != "https") { + rewrite ^ https://$host$uri permanent; + } + location ~ /.well-known { + auth_basic off; + allow all; + } + # Security headers + add_header Strict-Transport-Security "max-age=31536000; includeSubDomains" always; + add_header Content-Security-Policy "default-src 'self'; script-src 'self' 'unsafe-inline';" always; + add_header Referrer-Policy "no-referrer-when-downgrade" always; + add_header Permissions-Policy "geolocation=(), microphone=()" always; + add_header X-Frame-Options "SAMEORIGIN" always; + add_header X-Content-Type-Options "nosniff" always; + + {{settings}} + location / { + {{varnish_proxy_pass}} + proxy_set_header Host $http_host; + proxy_set_header X-Forwarded-Host $http_host; + proxy_set_header X-Real-IP $remote_addr; + proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; + proxy_hide_header X-Varnish; + proxy_redirect off; + proxy_max_temp_file_size 0; + proxy_connect_timeout 720; + proxy_send_timeout 720; + proxy_read_timeout 720; + proxy_buffer_size 128k; + proxy_buffers 4 256k; + proxy_busy_buffers_size 256k; + proxy_temp_file_write_size 256k; + } + location ~* ^.+\.(css|js|jpg|jpeg|gif|png|ico|gz|svg|svgz|ttf|otf|woff|woff2|eot|mp4|ogg|ogv|webm|webp|zip|swf|map|mjs)$ { + add_header Access-Control-Allow-Origin "*"; + expires max; + access_log off; + } + location ~ /\.(ht|svn|git) { + deny all; + } + if (-f $request_filename) { + break; + } +} +server { + listen 8080; + listen [::]:8080; + server_name sefer.click www1.sefer.click; + {{root}} + try_files $uri $uri/ /index.php?$args; + index index.php index.html; + location ~ \.php$ { + include fastcgi_params; + fastcgi_intercept_errors on; + fastcgi_index index.php; + fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name; + try_files $uri =404; + fastcgi_read_timeout 3600; + fastcgi_send_timeout 3600; + proxy_read_timeout 3600; + proxy_send_timeout 3600; + fastcgi_param HTTPS "on"; + fastcgi_param SERVER_PORT 443; + fastcgi_pass 127.0.0.1:{{php_fpm_port}}; + fastcgi_param PHP_VALUE "{{php_settings}}"; + } + if (-f $request_filename) { + break; + } +} + + +wallet server + + +server { + listen 80; + listen [::]:80; + listen 443 ssl http2; + listen [::]:443 ssl http2; + {{ssl_certificate_key}} + {{ssl_certificate}} + server_name www.seferpw.shop; + return 301 https://seferpw.shop$request_uri; +} + +server { + listen 80; + listen [::]:80; + listen 443 ssl http2; + listen [::]:443 ssl http2; + {{ssl_certificate_key}} + {{ssl_certificate}} + server_name seferpw.shop www1.seferpw.shop 156.67.82.188; + {{root}} + {{nginx_access_log}} + {{nginx_error_log}} + # Set the maximum request body size + client_max_body_size 10m; + if ($scheme != "https") { + rewrite ^ https://$host$uri permanent; + } + location ~ /.well-known { + auth_basic off; + allow all; + } + # Security headers + add_header Strict-Transport-Security "max-age=31536000; includeSubDomains" always; + add_header Content-Security-Policy "default-src 'self'; script-src 'self' 'unsafe-inline';" always; + add_header Referrer-Policy "no-referrer-when-downgrade" always; + add_header Permissions-Policy "geolocation=(), microphone=()" always; + add_header X-Frame-Options "SAMEORIGIN" always; + add_header X-Content-Type-Options "nosniff" always; + + {{settings}} + location / { + {{varnish_proxy_pass}} + proxy_set_header Host $http_host; + proxy_set_header X-Forwarded-Host $http_host; + proxy_set_header X-Real-IP $remote_addr; + proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; + proxy_hide_header X-Varnish; + proxy_redirect off; + proxy_max_temp_file_size 0; + proxy_connect_timeout 720; + proxy_send_timeout 720; + proxy_read_timeout 720; + proxy_buffer_size 128k; + proxy_buffers 4 256k; + proxy_busy_buffers_size 256k; + proxy_temp_file_write_size 256k; + } + location ~* ^.+\.(css|js|jpg|jpeg|gif|png|ico|gz|svg|svgz|ttf|otf|woff|woff2|eot|mp4|ogg|ogv|webm|webp|zip|swf|map|mjs)$ { + add_header Access-Control-Allow-Origin "*"; + expires max; + access_log off; + } + location ~ /\.(ht|svn|git) { + deny all; + } + if (-f $request_filename) { + break; + } +} + +server { + listen 8080; + listen [::]:8080; + server_name seferpw.shop www1.seferpw.shop 156.67.82.188; + {{root}} + try_files $uri $uri/ /index.php?$args; + index index.php index.html; + location ~ \.php$ { + include fastcgi_params; + fastcgi_intercept_errors on; + fastcgi_index index.php; + fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name; + try_files $uri =404; + fastcgi_read_timeout 3600; + fastcgi_send_timeout 3600; + proxy_read_timeout 3600; + proxy_send_timeout 3600; + fastcgi_param HTTPS "on"; + fastcgi_param SERVER_PORT 443; + fastcgi_pass 127.0.0.1:{{php_fpm_port}}; + fastcgi_param PHP_VALUE "{{php_settings}}"; + } + if (-f $request_filename) { + break; + } +} \ No newline at end of file diff --git a/siro_rider/lib/constant/style.dart b/siro_rider/lib/constant/style.dart new file mode 100644 index 0000000..12d89b2 --- /dev/null +++ b/siro_rider/lib/constant/style.dart @@ -0,0 +1,74 @@ +import 'package:flutter/material.dart'; +import 'package:google_fonts/google_fonts.dart'; +import '../main.dart'; +import 'box_name.dart'; +import 'colors.dart'; + +class AppStyle { + static TextStyle get headTitle => TextStyle( + fontWeight: FontWeight.bold, + fontSize: 36, + color: AppColor.accentColor, + fontFamily: box.read(BoxName.lang) == 'ar' + // ?GoogleFonts.markaziText().fontFamily + ? GoogleFonts.markaziText().fontFamily + : GoogleFonts.inter().fontFamily); + static TextStyle get headTitle2 => TextStyle( + fontWeight: FontWeight.bold, + fontSize: 24, + color: AppColor.writeColor, + fontFamily: box.read(BoxName.lang) == 'ar' + ? GoogleFonts.markaziText().fontFamily + : GoogleFonts.inter().fontFamily); + static TextStyle get title => TextStyle( + fontWeight: FontWeight.normal, + fontSize: 16, + color: AppColor.writeColor, + fontFamily: box.read(BoxName.lang) == 'ar' + ? GoogleFonts.markaziText().fontFamily + : GoogleFonts.inter().fontFamily); + static TextStyle get subtitle => TextStyle( + fontWeight: FontWeight.bold, + fontSize: 12, + color: AppColor.writeColor, + fontFamily: box.read(BoxName.lang) == 'ar' + ? GoogleFonts.markaziText().fontFamily + : GoogleFonts.inter().fontFamily); + static TextStyle get number => TextStyle( + fontWeight: FontWeight.bold, + fontSize: 14, + color: AppColor.writeColor, + fontFamily: 'digit'); + + static BoxDecoration get boxDecoration => BoxDecoration( + boxShadow: [ + BoxShadow( + color: AppColor.accentColor.withOpacity(0.3), + blurRadius: 5, + offset: const Offset(2, 4)), + BoxShadow( + color: AppColor.accentColor.withOpacity(0.1), + blurRadius: 5, + offset: const Offset(-2, -2)) + ], + color: AppColor.secondaryColor, + borderRadius: const BorderRadius.all( + Radius.elliptical(15, 30), + )); + static BoxDecoration get boxDecoration1 => BoxDecoration( + boxShadow: [ + BoxShadow( + color: Colors.black.withOpacity(0.05), + blurRadius: 10, + offset: const Offset(0, 4)), + BoxShadow( + color: AppColor.primaryColor.withOpacity(0.02), + blurRadius: 5, + offset: const Offset(-2, -2)) + ], + color: AppColor.secondaryColor, + borderRadius: const BorderRadius.all( + Radius.elliptical(15, 30), + ), + ); +} diff --git a/siro_rider/lib/constant/table_names.dart b/siro_rider/lib/constant/table_names.dart new file mode 100644 index 0000000..c3251f9 --- /dev/null +++ b/siro_rider/lib/constant/table_names.dart @@ -0,0 +1,19 @@ +// import 'package:siro_rider/env/env.dart'; + +class TableName { + static const String placesFavorite = "placesFavorite"; + static const String recentLocations = "recentLocations"; + static const String carLocations = "carLocations"; + static const String driverOrdersRefuse = "driverOrdersRefuse"; + static const String rideLocation = "rideLocation"; + static const String faceDetectTimes = "faceDetectTimes"; + static const String captainNotification = "captainNotification"; +} + +class Pasenger { + static const String pasengerpas = 'MG6DEJZSczBT6Rx0jOlehQ=='; + static const String payMobApikey = 'payMobApikey'; + static const String initializationVector = 'initializationVector'; + static const String keyOfApp = 'keyOfApp'; + static const String FCM_PRIVATE_KEY_INTALEQ = 'FCM_PRIVATE_KEY_INTALEQ'; +} diff --git a/siro_rider/lib/constant/univeries_polygon.dart b/siro_rider/lib/constant/univeries_polygon.dart new file mode 100644 index 0000000..3b54ab4 --- /dev/null +++ b/siro_rider/lib/constant/univeries_polygon.dart @@ -0,0 +1,83 @@ +import 'package:intaleq_maps/intaleq_maps.dart'; + +class UniversitiesPolygons { + // AUC polygon points + static const List> universityPolygons = [ + // AUC Polygon + [ + LatLng(30.013431, 31.502572), + LatLng(30.018469, 31.497478), + LatLng(30.023158, 31.495870), + LatLng(30.025084, 31.496781), + LatLng(30.018701, 31.511393), + LatLng(30.015312, 31.508310), + ], + // Example polygon for University 'German University in Cairo (GUC)' + [ + LatLng(29.984554, 31.437829), + LatLng(29.990363, 31.438390), + LatLng(29.990560, 31.445643), + LatLng(29.984436, 31.445825), + ], + //Future University in Egypt (FUE) + [ + LatLng(30.025794, 31.490946), + LatLng(30.028341, 31.491014), + LatLng(30.028341, 31.492586), + LatLng(30.025844, 31.492491), + ], + //'British University in Egypt (BUE)' + [ + LatLng(30.117423, 31.605834), + LatLng(30.118224, 31.605543), + LatLng(30.118649, 31.607361), + LatLng(30.118932, 31.608033), + LatLng(30.119592, 31.612159), + LatLng(30.119372, 31.612958), + LatLng(30.120017, 31.617102), + LatLng(30.119435, 31.617193), + ], + //Misr International University (MIU) + [ + LatLng(30.166498, 31.491663), + LatLng(30.171956, 31.491060), + LatLng(30.172212, 31.495754), + LatLng(30.167112, 31.496108), + ], + // Canadian International College (CIC) + [ + LatLng(30.034312, 31.428963), + LatLng(30.035661, 31.429037), + LatLng(30.036074, 31.430522), + LatLng(30.036017, 31.431146), + LatLng(30.034580, 31.431117), + ], + // October 6 University (O6U) + [ + LatLng(29.974102, 30.946934), + LatLng(29.976620, 30.944925), + LatLng(29.979848, 30.949832), + LatLng(29.977372, 30.951950), + ], + [ + LatLng(30.029312, 31.210046), + LatLng(30.027124, 31.201393), + LatLng(30.014523, 31.205087), + LatLng(30.015416, 31.212218), + LatLng(30.027325, 31.210661), + ], + // Add polygons for 8 more universities... + ]; + + static const List universityNames = [ + "American University in Cairo (AUC)", + 'German University in Cairo (GUC)', + 'Future University in Egypt (FUE)', + 'British University in Egypt (BUE)', + 'Misr International University (MIU)', + 'Canadian International College (CIC)', + 'October 6 University (O6U)', + "Cairo University", + // Add names for 8 more universities... + ]; +} diff --git a/siro_rider/lib/controller/Widget/home_widget_provider.dart b/siro_rider/lib/controller/Widget/home_widget_provider.dart new file mode 100644 index 0000000..26c2980 --- /dev/null +++ b/siro_rider/lib/controller/Widget/home_widget_provider.dart @@ -0,0 +1,57 @@ +// import 'package:home_widget/home_widget.dart'; + +// class TripzHomeWidgetProvider { +// static const String widgetName = 'TripzHomeWidget'; + +// // Initialize Home Widget +// static Future initHomeWidget() async { +// await HomeWidget.registerInteractivityCallback(backgroundCallback); +// } + +// // Background Callback for Widget Updates +// static Future backgroundCallback(Uri? uri) async { +// if (uri?.host == 'updateWidget') { +// // Logic to update widget data +// await updateWidgetData(); +// } +// } + +// // Update Widget Data Method +// static Future updateWidgetData() async { +// // Fetch current ride details +// final rideData = await _fetchCurrentRideDetails(); + +// // Update Widget with Ride Information +// await HomeWidget.saveWidgetData( +// 'ride_destination', rideData.destination); +// await HomeWidget.saveWidgetData( +// 'ride_estimated_time', rideData.estimatedTime); +// await HomeWidget.saveWidgetData('ride_fare', rideData.fare); + +// // Trigger Widget Update +// await HomeWidget.updateWidget( +// name: widgetName, +// iOSName: 'TripzWidgetProvider', +// androidName: 'com.mobileapp.store.ride.HomeWidgetProvider', +// ); +// } + +// // Mock method to fetch ride details (replace with actual implementation) +// static Future _fetchCurrentRideDetails() async { +// // Implement actual data fetching logic +// return RideData( +// destination: 'Downtown Office', estimatedTime: '25 mins', fare: 15.50); +// } +// } + +// // Ride Data Model +// class RideData { +// final String destination; +// final String estimatedTime; +// final double fare; + +// RideData( +// {required this.destination, +// required this.estimatedTime, +// required this.fare}); +// } diff --git a/siro_rider/lib/controller/auth/apple_signin_controller.dart b/siro_rider/lib/controller/auth/apple_signin_controller.dart new file mode 100644 index 0000000..615b097 --- /dev/null +++ b/siro_rider/lib/controller/auth/apple_signin_controller.dart @@ -0,0 +1,37 @@ +import 'package:firebase_auth/firebase_auth.dart'; +import 'package:get/get.dart'; +import 'package:sign_in_with_apple/sign_in_with_apple.dart'; + +class AuthController extends GetxController { + final FirebaseAuth _auth = FirebaseAuth.instance; + + Future signInWithApple() async { + try { + final appleCredential = await SignInWithApple.getAppleIDCredential( + scopes: [ + AppleIDAuthorizationScopes.email, + AppleIDAuthorizationScopes.fullName, + ], + ); + + final oAuthProvider = OAuthProvider('apple.com'); + final credential = oAuthProvider.credential( + idToken: appleCredential.identityToken, + accessToken: appleCredential.authorizationCode, + ); + + UserCredential userCredential = + await _auth.signInWithCredential(credential); + + return userCredential.user; + } catch (error) { + return null; + } + } + + Future signOut() async { + try { + await _auth.signOut(); + } catch (error) {} + } +} diff --git a/siro_rider/lib/controller/auth/certificate.dart b/siro_rider/lib/controller/auth/certificate.dart new file mode 100644 index 0000000..411b932 --- /dev/null +++ b/siro_rider/lib/controller/auth/certificate.dart @@ -0,0 +1,41 @@ +import 'package:siro_rider/print.dart'; +import 'dart:convert'; +import 'dart:io'; +import 'dart:typed_data'; +import 'package:crypto/crypto.dart'; + +Future verifyCertificateManually( + String host, int port, String expectedPin) async { + try { + final socket = await SecureSocket.connect(host, port, + timeout: const Duration(seconds: 5)); + + final certificate = socket.peerCertificate; + if (certificate == null) { + Log.print("❌ لا يوجد شهادة."); + return false; + } + + final der = certificate.der; + final actualPin = base64.encode(sha256.convert(der).bytes); + + Log.print("📛 HOST: $host"); + Log.print("📜 Subject: ${certificate.subject}"); + Log.print("📜 Issuer: ${certificate.issuer}"); + Log.print("📅 Valid From: ${certificate.startValidity}"); + Log.print("📅 Valid To: ${certificate.endValidity}"); + Log.print( + "🔐 Server Pin: $actualPin → ${actualPin == expectedPin ? '✅ MATCH' : '❌ MISMATCH'}"); + + socket.destroy(); + return actualPin == expectedPin; + } catch (e) { + Log.print("❌ خطأ أثناء الاتصال أو الفحص: $e"); + return false; + } +} + +/// تحويل المفتاح العام إلى بصمة SHA-256 +List sha256Convert(Uint8List der) { + return sha256.convert(der).bytes; +} \ No newline at end of file diff --git a/siro_rider/lib/controller/auth/google_sign.dart b/siro_rider/lib/controller/auth/google_sign.dart new file mode 100644 index 0000000..72d058d --- /dev/null +++ b/siro_rider/lib/controller/auth/google_sign.dart @@ -0,0 +1,149 @@ +import 'package:flutter/material.dart'; +import 'package:flutter/services.dart'; +import 'package:get/get.dart'; +import 'package:google_sign_in/google_sign_in.dart'; +import 'package:url_launcher/url_launcher.dart'; + +import '../../constant/box_name.dart'; +import '../../constant/links.dart'; +import '../../main.dart'; +import '../../print.dart'; +import '../functions/crud.dart'; +import '../../onbording_page.dart'; +import 'login_controller.dart'; + +class GoogleSignInHelper { + // ✅ GoogleSignIn singleton + static final GoogleSignIn _signIn = GoogleSignIn.instance; + + static GoogleSignInAccount? _lastUser; + + /// 👇 استدعها في main() مرة واحدة + static Future init() async { + await _signIn.initialize( + serverClientId: + '594687661098-2u640akrb3k7sak5t0nqki6f4v6hq1bq.apps.googleusercontent.com', + ); + + // Events listener + _signIn.authenticationEvents.listen((event) async { + if (event is GoogleSignInAuthenticationEventSignIn) { + _lastUser = event.user; + await _handleSignUp(event.user); + } else if (event is GoogleSignInAuthenticationEventSignOut) { + _lastUser = null; + } + }); + + // silent login if possible + try { + await _signIn.attemptLightweightAuthentication(); + } catch (e) { + Log.print("Error: $e"); + } + } + + /// ✅ تسجيل دخول عادي + static Future signIn() async { + try { + final user = + await _signIn.authenticate(scopeHint: const ['email', 'profile']); + _lastUser = user; + await _handleSignUp(user); + + // اطبع القيم (للتأكد) + Log.print("Google ID: ${user.id}"); + Log.print("Email: ${user.email}"); + Log.print("Name: ${user.displayName}"); + Log.print("Photo: ${user.photoUrl}"); + return user; + } on PlatformException catch (e) { + if (e.code == 'sign_in_required') { + await showGooglePlayServicesError(); + } + return null; + } catch (e) { + await addError("Google Sign-In error: $e", "signIn()"); + return null; + } + } + + /// ✅ تسجيل دخول مخصص لشاشة Login (مع استدعاء الكنترولر) + static Future signInFromLogin() async { + await init(); + final user = await signIn(); + if (user != null) { + await Get.put(LoginController()).loginUsingCredentials( + box.read(BoxName.passengerID).toString(), + box.read(BoxName.email).toString(), + ); + } + return user; + } + + /// ✅ طلب سكوبات إضافية (بديل withScopes القديم) + static Future requestExtraScopes(List scopes) async { + final user = _lastUser; + if (user == null) return; + await user.authorizationClient.authorizeScopes(scopes); + } + + /// ✅ تسجيل خروج + static Future signOut() async { + await _signIn.signOut(); + await _handleSignOut(); + } + + static GoogleSignInAccount? getCurrentUser() => _lastUser; + + // ================= Helpers ================== + + static Future _handleSignUp(GoogleSignInAccount user) async { + box.write(BoxName.passengerID, user.id); + box.write(BoxName.email, user.email); + box.write(BoxName.name, user.displayName ?? ''); + box.write(BoxName.passengerPhotoUrl, user.photoUrl ?? ''); + } + + static Future _handleSignOut() async { + box.erase(); + + Get.offAll(OnBoardingPage()); + } + + static Future addError(String error, String where) async { + await CRUD().post(link: AppLink.addError, payload: { + 'error': error, + 'userId': box.read(BoxName.driverID) ?? box.read(BoxName.passengerID), + 'userType': box.read(BoxName.driverID) != null ? 'Driver' : 'Passenger', + 'phone': box.read(BoxName.phone) ?? box.read(BoxName.phoneDriver), + 'device': where, + }); + } + + static Future showGooglePlayServicesError() async { + const playStoreUrl = + 'https://play.google.com/store/apps/details?id=com.google.android.gms&hl=en_US'; + final uri = Uri.parse(playStoreUrl); + if (await canLaunchUrl(uri)) { + await launchUrl(uri); + } else { + showDialog( + context: Get.context!, + builder: (context) => AlertDialog( + title: Text('Error'.tr), + content: Text( + 'Could not open the Google Play Store. Please update Google Play Services manually.' + .tr, + ), + actions: [ + TextButton( + onPressed: () => Navigator.pop(context), + child: Text('Close'.tr), + ), + ], + ), + ); + } + } +} diff --git a/siro_rider/lib/controller/auth/login_controller.dart b/siro_rider/lib/controller/auth/login_controller.dart new file mode 100644 index 0000000..5c073a7 --- /dev/null +++ b/siro_rider/lib/controller/auth/login_controller.dart @@ -0,0 +1,526 @@ +import 'dart:async'; +import 'dart:convert'; +import 'dart:io'; + +import 'package:siro_rider/constant/api_key.dart'; +import 'package:siro_rider/controller/firebase/firbase_messge.dart'; +import 'package:siro_rider/views/auth/otp_page.dart'; +import 'package:siro_rider/views/widgets/error_snakbar.dart'; +import 'package:http/http.dart' as http; + +import 'package:siro_rider/constant/info.dart'; +import 'package:siro_rider/controller/functions/add_error.dart'; +import 'package:siro_rider/views/auth/login_page.dart'; + +import 'package:flutter/material.dart'; +import 'package:get/get.dart'; +import 'package:siro_rider/constant/box_name.dart'; +import 'package:siro_rider/constant/links.dart'; +import 'package:siro_rider/controller/functions/crud.dart'; +import 'package:siro_rider/main.dart'; +import 'package:siro_rider/views/home/map_page_passenger.dart'; + +import 'package:location/location.dart'; + +import '../../env/env.dart'; +import '../../print.dart'; +import '../../views/auth/otp_token_page.dart'; +import '../functions/encrypt_decrypt.dart'; +import '../functions/package_info.dart'; + +class LoginController extends GetxController { + final formKey = GlobalKey(); + final formKeyAdmin = GlobalKey(); + TextEditingController emailController = TextEditingController(); + TextEditingController phoneController = TextEditingController(); + TextEditingController passwordController = TextEditingController(); + TextEditingController adminPasswordController = TextEditingController(); + TextEditingController adminNameController = TextEditingController(); + bool isAgreeTerms = false; + bool isloading = false; + late int isTest = 1; + void changeAgreeTerm() { + isAgreeTerms = !isAgreeTerms; + update(); + } + + var dev = ''; + @override + void onInit() async { + // Log.print('box.read(BoxName.isTest): ${box.read(BoxName.isTest)}'); + box.write(BoxName.countryCode, 'Syria'); + FirebaseMessagesController().getToken(); + super.onInit(); + } + + void saveAgreementTerms() { + box.write(BoxName.agreeTerms, 'agreed'); + update(); + } + + void saveCountryCode(String countryCode) { + box.write(BoxName.countryCode, countryCode); + update(); + } + + // ═══════════════════════════════════════════════════════════════ +// LoginController — دوال إدارة الـ JWT +// ─────────────────────────────────────────────────────────────── +// لا تغيير على اسم الكلاس أو أسماء الدوال +// ═══════════════════════════════════════════════════════════════ + +// داخل class LoginController + + // ───────────────────────────────────────────────────────────── + // getJWT: الحصول على توكن للراكب + // ───────────────────────────────────────────────────────────── + // المنطق: + // • firstTimeLoadKey != false ← أول مرة يفتح التطبيق → loginFirstTime + // • firstTimeLoadKey == false ← مستخدم موجود → loginJwtRider + // ───────────────────────────────────────────────────────────── + Future getJWT() async { + // إذا كان التوكن الحالي لا يزال صالحاً، لا داعي لطلب واحد جديد + if (isTokenValid()) { + Log.print("JWT is still valid. Skipping request."); + return; + } + + try { + dev = Platform.isAndroid ? 'android' : 'ios'; + + // تأكد إن البصمة محدّثة قبل أي طلب + await DeviceHelper.getDeviceFingerprint(); + final String fp = box.read(BoxName.deviceFpEncrypted) ?? ''; + + if (box.read(BoxName.firstTimeLoadKey).toString() != 'false') { + // ── أول تسجيل ───────────────────────────────────────── + // نرسل البصمة المشفرة مع باقي البيانات + // السيرفر سيعمل hash لها ويخزنها في JWT payload + var payload = { + 'id': box.read(BoxName.passengerID) ?? AK.newId, + 'password': AK.passnpassenger, + 'aud': '${AK.allowed}$dev', + 'fingerPrint': fp, + }; + + var response = await http.post( + Uri.parse(AppLink.loginFirstTime), + body: payload, + ); + Log.print('AppLink.loginFirstTime: ${AppLink.loginFirstTime}'); + + Log.print('payload: $payload'); + Log.print('response: $response'); + + if (response.statusCode == 200) { + final decoded = jsonDecode(response.body); + final String? jwt = decoded['data'] != null + ? decoded['data']['jwt'] + : (decoded['message'] != null + ? decoded['message']['jwt'] + : decoded['jwt']); + + if (jwt != null) { + // نشفر الـ JWT بالتشفير الثلاثي قبل التخزين في GetStorage + box.write(BoxName.jwt, c(jwt)); + } + + await EncryptionHelper.initialize(); + } + } else { + // ── مستخدم موجود: تجديد التوكن ──────────────────────── + await EncryptionHelper.initialize(); + + var payload = { + 'id': box.read(BoxName.passengerID), + 'fingerPrint': fp, + 'aud': '${AK.allowed}$dev', + }; + + var response = await http.post( + Uri.parse(AppLink.loginJwtRider), + body: payload, + ); + Log.print('AppLink.loginJwtRider: ${AppLink.loginJwtRider}'); + + Log.print('payload: $payload'); + Log.print('response: ${response.body}'); + if (response.statusCode == 200) { + final decoded = jsonDecode(response.body); + final String? jwt = decoded['data'] != null + ? decoded['data']['jwt'] + : (decoded['message'] != null + ? decoded['message']['jwt'] + : decoded['jwt']); + + if (jwt != null) { + box.write(BoxName.jwt, c(jwt)); + } + } + } + } catch (e) { + Log.print('Error in getJWT: $e'); + } + } + + // ───────────────────────────────────────────────────────────── + // التحقق من صلاحية التوكن يدوياً (بدون مكاتب خارجية) + // ───────────────────────────────────────────────────────────── + bool isTokenValid() { + try { + final String? encryptedJwt = box.read(BoxName.jwt); + if (encryptedJwt == null || encryptedJwt.isEmpty) { + Log.print("isTokenValid: No token found in storage."); + return false; + } + + // 1. فك تشفير التوكن المخزن + final String jwtFull = r(encryptedJwt).toString(); + final String jwt = jwtFull.split(Env.addd)[0]; + + final parts = jwt.split('.'); + if (parts.length != 3) { + Log.print("isTokenValid: Invalid JWT format (parts: ${parts.length})"); + return false; + } + + // 2. فك Base64 للجزء الأوسط (Payload) + String payloadPart = parts[1]; + while (payloadPart.length % 4 != 0) { + payloadPart += '='; + } + + final String decodedPayload = utf8.decode(base64Url.decode(payloadPart)); + final Map payload = jsonDecode(decodedPayload); + + if (!payload.containsKey('exp')) { + Log.print("isTokenValid: No 'exp' claim in token."); + return false; + } + + final int exp = payload['exp']; + final int now = DateTime.now().millisecondsSinceEpoch ~/ 1000; + + Log.print("isTokenValid: Now=$now, Exp=$exp, Diff=${exp - now}s"); + + // اعتبار التوكن منتهي قبل دقيقة للأمان + final bool valid = exp > (now + 60); + Log.print("isTokenValid: Result=$valid"); + return valid; + } catch (e) { + Log.print("isTokenValid Error: $e"); + return false; + } + } + + // ───────────────────────────────────────────────────────────── + // الفرق عن getJWT: + // • يستخدم endpoint مختلف (loginWallet) + // • يرجع hmac مع الـ jwt ويخزنه في GetStorage + // • الـ JWT لا يُشفَّر ثلاثياً (يُستخدم مباشرة في الـ header) + // ───────────────────────────────────────────────────────────── + Future getJwtWallet() async { + dev = Platform.isAndroid ? 'android' : 'ios'; + + final String fp = box.read(BoxName.deviceFpEncrypted) ?? ''; + + var payload = { + 'id': box.read(BoxName.passengerID), + 'password': AK.passnpassenger, + 'aud': '${AK.allowedWallet}$dev', + 'fingerPrint': fp, + }; + + var response = await http.post( + Uri.parse(AppLink.loginJwtWalletRider), + body: payload, + ); + + Log.print('AppLink.loginJwtWalletRider: ${AppLink.loginJwtWalletRider}'); + Log.print('response wallet: ${response.body}'); + + if (response.statusCode == 200) { + final decoded = jsonDecode(response.body); + + // ← الإصلاح: نقرأ من message أو data أو root + final inner = decoded['data'] ?? decoded['message'] ?? decoded; + + final String? jwt = inner['jwt']; + final String? hmac = inner['hmac']; + + Log.print('jwt extracted: $jwt'); + Log.print('hmac extracted: $hmac'); + + if (hmac != null) { + box.write(BoxName.hmac, hmac); + } + + return jwt; + } + + return null; + } + + Future loginUsingCredentials(String passengerID, String email) async { + isloading = true; + update(); + // await getJWT(); + Log.print("LoginController.loginUsingCredentials: "); + try { + // 1) استعلام تسجيل الدخول + final res = await CRUD().get( + link: AppLink.loginFromGooglePassenger, + payload: { + 'email': email, + 'id': passengerID, // استخدم المعامل مباشرة + 'platform': Platform.isAndroid ? 'android' : 'ios', + 'appName': AppInformation.appName, + }, + ); + + // 2) فك JSON مرة واحدة والتحقق من النجاح + final decoded = jsonDecode(res); + if (decoded is! Map || decoded.isEmpty) return; + + if (decoded['status'] == 'failure' || decoded['status'] == 'Failure') { + Get.snackbar("User does not exist.".tr, '', + backgroundColor: Colors.red); + return; + } + + final status = (decoded['status'] ?? '').toString(); + final data = (decoded['data'] as List?)?.firstOrNull as Map? ?? {}; + if (status != 'success' || data['verified'].toString() != '1') { + // غير مُفعل -> أذهب للتسجيل بالـ SMS + Get.offAll(() => PhoneNumberScreen()); + return; + } + + // 3) كتابة القيم (خفيفة) + box.write(BoxName.isVerified, '1'); + box.write(BoxName.email, data['email']); + box.write(BoxName.phone, data['phone']); + box.write(BoxName.name, data['first_name']); + box.write(BoxName.isTest, '1'); + box.write(BoxName.package, data['package']); + box.write(BoxName.promo, data['promo']); + box.write(BoxName.discount, data['discount']); + box.write(BoxName.validity, data['validity']); + box.write(BoxName.isInstall, data['isInstall'] ?? 'none'); + box.write(BoxName.isGiftToken, data['isGiftToken'] ?? 'none'); + if (data['inviteCode'] != null) { + box.write(BoxName.inviteCode, data['inviteCode'].toString()); + } + // مهم: تأكد من passengerID في الـ box + box.write(BoxName.passengerID, passengerID); + + // 4) فحص ما إذا كان التوكن موجوداً في رد الـ Login المدمج (V3 Optimization) + String? serverFCM; + String? serverFP; + + var userData = decoded['data'] is List + ? (decoded['data'] as List).firstOrNull + : decoded['data']; + if (userData is Map && userData['fcm_token'] != null) { + serverFCM = userData['fcm_token'].toString(); + serverFP = userData['fcm_fingerprint']?.toString() ?? ''; + Log.print( + "✅ FCM Token found in Login response. Skipping separate getTokens call."); + } + + // إذا لم يكن موجوداً (توافقية قديمة)، نقوم بطلبه + String? tokenResp; + if (serverFCM == null) { + tokenResp = await CRUD().get( + link: AppLink.getTokens, payload: {'passengerID': passengerID}); + } + + final localFP = (await DeviceHelper.getDeviceFingerprint()).toString(); + await storage.write(key: BoxName.fingerPrint, value: localFP); + await box.write(BoxName.firstTimeLoadKey, 'false'); + + // ── 5. المقارنة: FCM token + fingerprint ────────────────────── + if (email != '962798583052@intaleqapp.com') { + if (serverFCM == null && + tokenResp != null && + tokenResp != 'failure' && + tokenResp != 'error') { + final tokenJson = jsonDecode(tokenResp); + final serverData = tokenJson['data'] ?? tokenJson['message']; + if (serverData is Map) { + serverFCM = serverData['token']?.toString() ?? ''; + serverFP = serverData['fingerPrint']?.toString() ?? ''; + } + } + + if (serverFCM != null && serverFCM.isNotEmpty) { + final localFCM = (box.read(BoxName.tokenFCM) ?? '').toString(); + + // ── اختلاف أي منهما = جهاز مختلف أو تثبيت جديد ───────── + final fcmChanged = serverFCM != localFCM; + final fpChanged = + serverFP != null && serverFP.isNotEmpty && serverFP != localFP; + + if (fcmChanged || fpChanged) { + mySnackbarInfo('Device Change Detected'.tr); + await Get.to(() => OtpVerificationPage( + phone: data['phone'].toString(), + deviceToken: localFP, + token: tokenResp ?? '', + ptoken: serverFCM ?? '', // نمرر FCM القديم للـ OTP controller + )); + return; + } + } + } + + // 6) منطق الدعوة (إن وُجد) ثم الانتقال + final invite = box.read(BoxName.inviteCode)?.toString() ?? 'none'; + final isInstall = box.read(BoxName.isInstall)?.toString() ?? '0'; + + if (invite != 'none' && isInstall != '1') { + try { + await CRUD().post(link: AppLink.updatePassengersInvitation, payload: { + "inviteCode": invite, + "passengerID": passengerID, + }); + await Get.defaultDialog( + title: 'Invitation Used'.tr, + middleText: "Your invite code was successfully applied!".tr, + textConfirm: "OK".tr, + confirmTextColor: Colors.white, + onConfirm: () async { + try { + await CRUD().post(link: AppLink.addPassengersPromo, payload: { + "promoCode": + 'I-${(box.read(BoxName.name)).toString().split(' ').first}', + "amount": '25', + "passengerID": passengerID, + "description": 'promo first' + }); + } catch (e) { + addError( + e.toString(), 'promo on invitation in login_controller'); + } finally { + Get.offAll(() => const MapPagePassenger()); + } + }, + ); + return; + } catch (_) { + // حتى لو فشل، كمل للصفحة الرئيسية + } + } + + Get.offAll(() => const MapPagePassenger()); + } catch (e) { + addError('$e', 'loginUsingCredentials'); + Get.snackbar('Error', e.toString(), backgroundColor: Colors.redAccent); + } finally { + isloading = false; + update(); + } + } + + // Future _confirmDeviceChangeDialog() { + // return Get.defaultDialog( + // barrierDismissible: false, + // title: 'Device Change Detected'.tr, + // middleText: 'Please verify your identity'.tr, + // textConfirm: 'Verify'.tr, + // confirmTextColor: Colors.white, + // onConfirm: () => Get.back(result: true), + // textCancel: 'Cancel'.tr, + // onCancel: () => Get.back(result: false), + // ); + // } + + void login() async { + isloading = true; + update(); + var res = + await CRUD().get(link: AppLink.loginFromGooglePassenger, payload: { + 'email': (emailController.text), + 'id': passwordController.text, + "platform": Platform.isAndroid ? 'android' : 'ios', + "appName": AppInformation.appName, + }); + + isloading = false; + update(); + if (res == 'Failure') { + //Failure + Get.offAll(() => LoginPage()); + isloading = false; + update(); + // Get.snackbar("User does not exist.".tr, '', backgroundColor: Colors.red); + } else { + var jsonDecoeded = jsonDecode(res); + if (jsonDecoeded.isNotEmpty) { + if (jsonDecoeded['status'] == 'success' && + jsonDecoeded['data'][0]['verified'].toString() == '1') { + // + box.write(BoxName.isVerified, '1'); + box.write(BoxName.email, jsonDecoeded['data'][0]['email']); + box.write(BoxName.name, jsonDecoeded['data'][0]['first_name']); + box.write(BoxName.phone, jsonDecoeded['data'][0]['phone']); + box.write(BoxName.passengerID, passwordController.text); + // var token = await CRUD().get(link: AppLink.getTokens, payload: { + // 'passengerID': box.read(BoxName.passengerID).toString() + // }); + // await updateAppTester(AppInformation.appName); + + Get.offAll(() => const MapPagePassenger()); + } else { + // Get.offAll(() => SmsSignupEgypt()); + // Get.snackbar(jsonDecoeded['status'], jsonDecoeded['data'], + // backgroundColor: Colors.redAccent); + isloading = false; + update(); + } + } else { + isloading = false; + update(); + } + } + } + + void goToMapPage() { + if (box.read(BoxName.email) != null) { + Get.offAll(() => const MapPagePassenger()); + } + } + + final location = Location(); + + // late PermissionStatus permissionGranted = PermissionStatus.denied; + Future getLocationPermission() async { + bool serviceEnabled; + PermissionStatus permissionGranted; + + // Check if location services are enabled + serviceEnabled = await location.serviceEnabled(); + if (!serviceEnabled) { + serviceEnabled = await location.requestService(); + if (!serviceEnabled) { + // Location services are still not enabled, handle the error + return; + } + } + + // Check if the app has permission to access location + permissionGranted = await location.hasPermission(); + if (permissionGranted == PermissionStatus.denied) { + permissionGranted = await location.requestPermission(); + if (permissionGranted != PermissionStatus.granted) { + // Location permission is still not granted, handle the error + permissionGranted = await location.requestPermission(); + return; + } + } + if (permissionGranted.toString() == 'PermissionStatus.granted') { + box.write(BoxName.locationPermission, 'true'); + } + update(); + } +} diff --git a/siro_rider/lib/controller/auth/onboarding_controller.dart b/siro_rider/lib/controller/auth/onboarding_controller.dart new file mode 100644 index 0000000..7b08cd9 --- /dev/null +++ b/siro_rider/lib/controller/auth/onboarding_controller.dart @@ -0,0 +1,43 @@ +import 'package:flutter/material.dart'; +import 'package:get/get.dart'; +import 'package:siro_rider/constant/box_name.dart'; +import 'package:siro_rider/main.dart'; +import 'package:siro_rider/views/auth/login_page.dart'; + +import '../../models/model/onboarding_model.dart'; + +abstract class OnBoardingController extends GetxController { + next(); + onPageChanged(int index); +} + +class OnBoardingControllerImp extends OnBoardingController { + late PageController pageController; + + int currentPage = 0; + + @override + next() { + currentPage++; + + if (currentPage > onBoardingList.length - 1) { + box.write(BoxName.onBoarding, 'yes'); + Get.offAll(() => LoginPage()); + } else { + pageController.animateToPage(currentPage, + duration: const Duration(milliseconds: 900), curve: Curves.easeInOut); + } + } + + @override + onPageChanged(int index) { + currentPage = index; + update(); + } + + @override + void onInit() { + pageController = PageController(); + super.onInit(); + } +} diff --git a/siro_rider/lib/controller/auth/otp_controller.dart b/siro_rider/lib/controller/auth/otp_controller.dart new file mode 100644 index 0000000..ee15547 --- /dev/null +++ b/siro_rider/lib/controller/auth/otp_controller.dart @@ -0,0 +1,210 @@ +import 'package:siro_rider/constant/links.dart'; +import 'package:siro_rider/views/home/map_page_passenger.dart'; +import 'package:get/get.dart'; +import '../../../constant/box_name.dart'; +import '../../../main.dart'; +import '../../../print.dart'; +import '../../views/auth/otp_page.dart'; +import '../../views/widgets/error_snakbar.dart'; +import '../functions/crud.dart'; +import '../functions/package_info.dart'; +import 'login_controller.dart'; + +// --- Helper Class for Phone Authentication --- + +class PhoneAuthHelper { + // Define your server URLs + static final String _baseUrl = '${AppLink.server}/auth/syria/'; + static final String _sendOtpUrl = '${_baseUrl}sendWhatsOpt.php'; + static final String _verifyOtpUrl = '${_baseUrl}verifyOtp.php'; + static final String _registerUrl = '${_baseUrl}register_passenger.php'; + + static String formatSyrianPhone(String phone) { + // Remove spaces, symbols, +, -, () + phone = phone.replaceAll(RegExp(r'[ \-\(\)\+]'), '').trim(); + + // Normalize 00963 → 963 + if (phone.startsWith('00963')) { + phone = phone.replaceFirst('00963', '963'); + } + + // Normalize 0963 → 963 + if (phone.startsWith('0963')) { + phone = phone.replaceFirst('0963', '963'); + } + + // NEW: Fix 96309xxxx → 9639xxxx + if (phone.startsWith('96309')) { + phone = '9639' + phone.substring(5); // remove the "0" after 963 + } + + // If starts with 9630 → correct to 9639 + if (phone.startsWith('9630')) { + phone = '9639' + phone.substring(4); + } + + // If already in correct format: 9639xxxxxxxx + if (phone.startsWith('9639') && phone.length == 12) { + return phone; + } + + // If starts with 963 but missing the 9 + if (phone.startsWith('963') && phone.length > 3) { + // Ensure it begins with 9639 + if (!phone.startsWith('9639')) { + phone = '9639' + phone.substring(3); + } + return phone; + } + + // If starts with 09xxxxxxxx → 9639xxxxxxxx + if (phone.startsWith('09')) { + return '963' + phone.substring(1); + } + + // If 9xxxxxxxx (9 digits) + if (phone.startsWith('9') && phone.length == 9) { + return '963' + phone; + } + + // If starts with incorrect 0xxxxxxx → assume Syrian and fix + if (phone.startsWith('0') && phone.length == 10) { + return '963' + phone.substring(1); + } + + return phone; + } + + /// Sends an OTP to the provided phone number. + static Future sendOtp(String phoneNumber) async { + try { + // إصلاح الرقم قبل الإرسال + final fixedPhone = formatSyrianPhone(phoneNumber); + + final response = await CRUD().post( + link: _sendOtpUrl, + payload: {'receiver': fixedPhone}, // ← ← استخدام الرقم المُعدّل + ); + + if (response != 'failure') { + final data = response; + + if (data['status'] == 'success') { + mySnackbarSuccess('An OTP has been sent to your number.'.tr); + return true; + } else { + mySnackeBarError(data['message'] ?? 'Failed to send OTP.'); + return false; + } + } else { + mySnackeBarError('Server error. Please try again.'.tr); + return false; + } + } catch (e) { + return false; + } + } + + /// Verifies the OTP and logs the user in. + + static Future verifyOtp(String phoneNumber, String otpCode) async { + try { + final fixedPhone = formatSyrianPhone(phoneNumber); + final response = await CRUD().post( + link: _verifyOtpUrl, + payload: { + 'phone_number': fixedPhone, + 'otp': otpCode, + }, + ); + + if (response != 'failure') { + final data = (response); + Log.print('data: ${data}'); + + if (data['status'] == 'success') { + final isRegistered = data['message']['isRegistered'] ?? false; + Log.print('isRegistered: ${isRegistered}'); + + if (isRegistered) { + // ✅ المستخدم موجود مسبقاً -> تسجيل دخول مباشر + await _handleSuccessfulLogin(data['message']['passenger']); + } else { + // ✅ مستخدم جديد -> الذهاب لصفحة التسجيل + mySnackbarSuccess( + 'Phone verified. Please complete registration.'.tr); + Get.to(() => RegistrationScreen(phoneNumber: phoneNumber)); + } + } else { + mySnackeBarError(data['message']); + } + } else { + mySnackeBarError('Server error. Please try again.'.tr); + } + } catch (e) { + mySnackeBarError('An error occurred: $e'); + } + } + + static Future _addTokens() async { + String fingerPrint = await DeviceHelper.getDeviceFingerprint(); + + var res = await CRUD() + // this for register and login // + .post(link: "${AppLink.server}/ride/firebase/addToken.php", payload: { + 'token': (box.read(BoxName.tokenFCM.toString())), + 'passengerID': box.read(BoxName.passengerID).toString(), + "fingerPrint": fingerPrint + }); + Log.print('res token: ${res}'); + } + + static Future registerUser({ + required String phoneNumber, + required String firstName, + required String lastName, + String? email, + }) async { + try { + final response = await CRUD().post( + link: _registerUrl, + payload: { + 'phone_number': phoneNumber, + 'first_name': firstName, + 'last_name': lastName, + 'email': email ?? '', // Send empty string if null + }, + ); + final data = (response); + if (data != 'failure') { + // Registration successful, log user in + + await _handleSuccessfulLogin(data['message']['data']); + } else { + mySnackeBarError( + "User with this phone number or email already exists.".tr); + } + } catch (e) { + Log.print('e: ${e}'); + mySnackeBarError('An error occurred: $e'); + } + } + + static Future _handleSuccessfulLogin( + Map userData) async { + mySnackbarSuccess('Welcome, ${userData['first_name']}!'); + + // Save user data to local storage (Hive box) using new keys + box.write(BoxName.passengerID, userData['id']); + box.write(BoxName.name, userData['first_name']); + box.write(BoxName.lastName, userData['last_name']); + box.write(BoxName.email, userData['email']); + box.write(BoxName.phone, userData['phone']); + box.write(BoxName.isVerified, '1'); + await _addTokens(); + await Get.put(LoginController()).loginUsingCredentials( + box.read(BoxName.passengerID).toString(), + box.read(BoxName.email).toString(), + ); // Navigate to home + } +} diff --git a/siro_rider/lib/controller/auth/register_controller.dart b/siro_rider/lib/controller/auth/register_controller.dart new file mode 100644 index 0000000..a6626ce --- /dev/null +++ b/siro_rider/lib/controller/auth/register_controller.dart @@ -0,0 +1,367 @@ +import 'dart:async'; +import 'dart:convert'; +import 'dart:math'; + +import 'package:siro_rider/constant/colors.dart'; +import 'package:siro_rider/controller/auth/login_controller.dart'; +import 'package:siro_rider/controller/functions/add_error.dart'; +import 'package:siro_rider/controller/functions/encrypt_decrypt.dart'; +import 'package:siro_rider/views/home/map_page_passenger.dart'; +import 'package:flutter/material.dart'; +import 'package:get/get.dart'; +import 'package:siro_rider/constant/links.dart'; +import 'package:siro_rider/constant/style.dart'; +import 'package:siro_rider/controller/functions/crud.dart'; +import 'package:siro_rider/views/auth/login_page.dart'; +import 'package:siro_rider/views/widgets/elevated_btn.dart'; + +import '../../constant/box_name.dart'; +import '../../main.dart'; +import '../../print.dart'; +import '../../views/auth/verify_email_page.dart'; +import '../../views/widgets/mydialoug.dart'; +import '../functions/sms_controller.dart'; + +class RegisterController extends GetxController { + final formKey = GlobalKey(); + final formKey3 = GlobalKey(); + + TextEditingController firstNameController = TextEditingController(); + TextEditingController lastNameController = TextEditingController(); + TextEditingController emailController = TextEditingController(); + TextEditingController phoneController = TextEditingController(); + TextEditingController passwordController = TextEditingController(); + TextEditingController siteController = TextEditingController(); + // TextEditingController verfyCode = TextEditingController(); + TextEditingController verifyCode = TextEditingController(); + int remainingTime = 300; // 5 minutes in seconds + bool isSent = false; + bool isLoading = false; + Timer? _timer; + String birthDate = 'Birth Date'.tr; + String gender = 'Male'.tr; + @override + void onInit() { + super.onInit(); + } + + void startTimer() { + _timer?.cancel(); // Cancel any existing timer + _timer = Timer.periodic(const Duration(seconds: 1), (timer) { + if (remainingTime > 0) { + remainingTime--; + } else { + timer.cancel(); + } + }); + } + + getBirthDate() { + Get.defaultDialog( + title: 'Select Date'.tr, + titleStyle: AppStyle.title, + content: SizedBox( + width: 300, + child: CalendarDatePicker( + initialDate: + DateTime.now().subtract(const Duration(days: 14 * 365)), + firstDate: DateTime.parse('1940-06-01'), + lastDate: DateTime.now().subtract(const Duration(days: 14 * 365)), + onDateChanged: (date) { + // Get the selected date and convert it to a DateTime object + DateTime dateTime = date; + // Call the getOrders() function from the controller + birthDate = dateTime.toString().split(' ')[0]; + update(); + }, + + // onDateChanged: (DateTime value) {}, + ), + ), + confirm: MyElevatedButton(title: 'Ok'.tr, onPressed: () => Get.back())); + } + + void changeGender(String value) { + gender = value; + update(); + } + + bool isValidEgyptianPhoneNumber(String phoneNumber) { + // Remove any whitespace from the phone number + phoneNumber = phoneNumber.replaceAll(RegExp(r'\s+'), ''); + + // Check if the phone number has exactly 11 digits + if (phoneNumber.length != 11) { + return false; + } + + // Check if the phone number starts with 010, 011, 012, or 015 + RegExp validPrefixes = RegExp(r'^01[0125]\d{8}$'); + + return validPrefixes.hasMatch(phoneNumber); + } + + bool isValidPhoneNumber(String phoneNumber) { + // Remove any whitespace from the phone number + phoneNumber = phoneNumber.replaceAll(RegExp(r'\s+'), ''); + + // Check if the phone number has at least 10 digits + if (phoneNumber.length < 10) { + return false; + } + + // Check for valid prefixes (modify this to match your use case) + RegExp validPrefixes = RegExp(r'^[0-9]+$'); + + // Check if the phone number contains only digits + return validPrefixes.hasMatch(phoneNumber); + } + + sendOtpMessage() async { + SmsEgyptController smsEgyptController; + isLoading = true; + update(); + try { + // Initialize SmsEgyptController + smsEgyptController = Get.put(SmsEgyptController()); + + isLoading = true; + update(); + + // Get phone number from controller + String phoneNumber = phoneController.text; + + // Check if the phone number is from Egypt (Assuming Egyptian numbers start with +20) + + if (phoneController.text.isNotEmpty) { + bool isEgyptianNumber = phoneNumber.startsWith('+20'); + if (isEgyptianNumber && phoneNumber.length == 13) { + // Check if the phone number is already verified + var responseChecker = await CRUD().post( + link: AppLink.checkPhoneNumberISVerfiedPassenger, + payload: { + 'phone_number': (phoneNumber), + 'email': box.read(BoxName.email), + }, + ); + + if (responseChecker != 'failure') { + var data = jsonDecode(responseChecker); + + // If the phone number is already verified + if (data['message'][0]['verified'].toString() == '1') { + Get.snackbar('Phone number is verified before'.tr, '', + backgroundColor: AppColor.greenColor); + box.write(BoxName.isVerified, '1'); + box.write(BoxName.phone, (phoneNumber)); + Get.offAll(const MapPagePassenger()); + } else { + await sendOtp(phoneNumber, isEgyptianNumber, smsEgyptController); + } + } else { + await sendOtp(phoneNumber, isEgyptianNumber, smsEgyptController); + } + } else if (phoneNumber.length > 9) { + sendOtp(phoneNumber, isEgyptianNumber, smsEgyptController); + } + } else { + MyDialog().getDialog( + 'Error'.tr, 'Phone number must be exactly 11 digits long'.tr, () { + Get.back(); + }); + // sendOtp( + // phoneNumber, randomNumber, isEgyptianNumber, smsEgyptController); + } + } catch (e) { + // Handle error + } finally { + isLoading = false; + update(); + } + } + +// Helper function to send OTP or WhatsApp message based on phone number location + Future sendOtp(String phoneNumber, bool isEgyptian, + SmsEgyptController controller) async { + // Trim any leading or trailing whitespace from the phone number + phoneNumber = phoneNumber.trim(); + var dd = await CRUD().post(link: AppLink.sendVerifyOtpMessage, payload: { + 'phone_number': (phoneNumber), + }); + Log.print('dd: ${dd}'); + + // Common Registration Logic (extracted for reuse) + Future registerUser() async { + await CRUD().post(link: AppLink.updatePhoneInvalidSMSPassenger, payload: { + "phone_number": (Get.find().phoneController.text) + }); + + box.write(BoxName.phone, (phoneController.text)); + + var nameParts = (box.read(BoxName.name)).toString().split(' '); + var firstName = nameParts.isNotEmpty ? nameParts[0] : 'unknown'; + var lastName = nameParts.length > 1 ? nameParts[1] : 'unknown'; + + var payload = { + 'id': box.read(BoxName.passengerID), + 'phone': (phoneController.text), + 'email': box.read(BoxName.email), + 'password': + ('unknown'), //Consider if you *really* want to store 'unknown' passwords + 'gender': ('unknown'), + 'birthdate': ('2002-01-01'), + 'site': box.read(BoxName.passengerPhotoUrl) ?? 'unknown', + 'first_name': (firstName), + 'last_name': (lastName), + }; + + var res1 = await CRUD().post( + link: AppLink.signUp, + payload: payload, + ); + + if (res1 != 'failure') { + //Multi-server signup (moved inside the successful registration check) + // if (AppLink.IntaleqAlexandriaServer != AppLink.IntaleqSyriaServer) { + // List signUp = [ + // CRUD().post( + // link: '${AppLink.IntaleqAlexandriaServer}/auth/signup.php', + // payload: payload, + // ), + // CRUD().post( + // link: '${AppLink.IntaleqGizaServer}/auth/signup.php', + // payload: payload, + // ) + // ]; + // await Future.wait(signUp); // Wait for both sign-ups to complete. + // } + + box.write(BoxName.isVerified, '1'); + box.write( + BoxName.isFirstTime, '0'); //Double-check the logic for isFirstTime + box.write(BoxName.phone, (phoneController.text)); + + Get.put(LoginController()).loginUsingCredentials( + box.read(BoxName.passengerID).toString(), + box.read(BoxName.email).toString(), + ); + } + } + + if (isEgyptian) { + // verifySMSCode(); + // await registerUser(); // Use the common registration logic + // await controller.sendSmsEgypt(phoneNumber, otp.toString()); // Optional: Send SMS if Egyptian + } else if (phoneController.text.toString().length >= 10) { + await registerUser(); // Use the common registration logic for non-Egyptian users as well. + // this for whatsapp messsage // Optional: Send WhatsApp message + // await CRUD().sendWhatsAppAuth(phoneNumber, otp.toString()); + } + + isLoading = false; + isSent = true; + remainingTime = 300; + update(); // Reset to 5 minutes + // startTimer(); // Consider whether you need a timer here, or if it's handled elsewhere. + } + + verifySMSCode() async { + try { + if (formKey3.currentState!.validate()) { + var res = await CRUD().post(link: AppLink.verifyOtpPassenger, payload: { + 'phone_number': phoneController.text, + 'token': verifyCode.text, + }); + + if (res != 'failure') { + box.write(BoxName.phone, (phoneController.text)); + var nameParts = (box.read(BoxName.name)).toString().split(' '); + var firstName = nameParts.isNotEmpty ? nameParts[0] : 'unknown'; + var lastName = nameParts.length > 1 ? nameParts[1] : 'unknown'; + + var payload = { + 'id': box.read(BoxName.passengerID), + 'phone': (phoneController.text), + 'email': box.read(BoxName.email), + 'password': 'unknown', + 'gender': 'unknown', + 'birthdate': '2002-01-01', + 'site': box.read(BoxName.passengerPhotoUrl) ?? 'unknown', + 'first_name': firstName, + 'last_name': lastName, + }; + + var res1 = await CRUD().post( + link: AppLink.signUp, + payload: payload, + ); + + if (res1 != 'failure') { + box.write(BoxName.isVerified, '1'); + box.write(BoxName.isFirstTime, '0'); + box.write(BoxName.phone, (phoneController.text)); + + Get.put(LoginController()).loginUsingCredentials( + box.read(BoxName.passengerID).toString(), + box.read(BoxName.email).toString(), + ); + } else { + Get.snackbar('Error'.tr, + "The email or phone number is already registered.".tr, + backgroundColor: Colors.redAccent); + } + } else { + Get.snackbar('Error'.tr, "phone not verified".tr, + backgroundColor: Colors.redAccent); + } + } else { + Get.snackbar('Error'.tr, "you must insert token code".tr, + backgroundColor: AppColor.redColor); + } + } catch (e) { + addError(e.toString(), 'passenger sign up '); + Get.snackbar('Error'.tr, "Something went wrong. Please try again.".tr, + backgroundColor: Colors.redAccent); + } + } + + sendVerifications() async { + var res = await CRUD().post(link: AppLink.verifyEmail, payload: { + 'email': emailController.text, + 'token': verifyCode.text, + }); + var dec = jsonDecode(res); + if (dec['status'] == 'success') { + Get.offAll(() => LoginPage()); + } + } + + void register() async { + if (formKey.currentState!.validate()) { + var res = await CRUD().post(link: AppLink.signUp, payload: { + 'first_name': firstNameController.text.toString(), + 'last_name': lastNameController.text.toString(), + 'email': emailController.text.toString(), + 'phone': phoneController.text.toString(), + 'password': passwordController.text.toString(), + 'gender': 'yet', + 'site': siteController.text, + 'birthdate': birthDate, + }); + if (jsonDecode(res)['status'] == 'success') { + int randomNumber = Random().nextInt(100000) + 1; + await CRUD().post(link: AppLink.sendVerifyEmail, payload: { + 'email': emailController.text, + 'token': randomNumber.toString(), + }); + Get.to(() => const VerifyEmailPage()); + } + } + } + + @override + void onClose() { + _timer?.cancel(); + super.onClose(); + } +} diff --git a/siro_rider/lib/controller/auth/token_otp_change_controller.dart b/siro_rider/lib/controller/auth/token_otp_change_controller.dart new file mode 100644 index 0000000..58f8584 --- /dev/null +++ b/siro_rider/lib/controller/auth/token_otp_change_controller.dart @@ -0,0 +1,114 @@ +import 'dart:async'; + +import 'package:siro_rider/constant/box_name.dart'; +import 'package:siro_rider/constant/links.dart'; +import 'package:siro_rider/controller/functions/crud.dart'; +import 'package:siro_rider/main.dart'; +import 'package:get/get.dart'; + +import '../../print.dart'; +import '../../views/home/map_page_passenger.dart'; +import '../firebase/firbase_messge.dart'; +import '../firebase/notification_service.dart'; +import '../functions/package_info.dart'; + +class OtpVerificationController extends GetxController { + final String phone; + final String deviceToken; + final String token; + final otpCode = ''.obs; + final isLoading = false.obs; + final isVerifying = false.obs; + var canResend = false.obs; + var countdown = 120.obs; + Timer? _timer; + + OtpVerificationController({ + required this.phone, + required this.deviceToken, + required this.token, + }); + + @override + void onInit() { + super.onInit(); + sendOtp(); // ترسل تلقائيًا عند فتح الصفحة + startCountdown(); + } + + void startCountdown() { + canResend.value = false; + countdown.value = 120; + _timer?.cancel(); + _timer = Timer.periodic(const Duration(seconds: 1), (timer) { + if (countdown.value > 0) { + countdown.value--; + } else { + canResend.value = true; + timer.cancel(); + } + }); + } + + Future sendOtp() async { + if (isLoading.value) return; + isLoading.value = true; + try { + final response = await CRUD().post( + link: '${AppLink.server}/auth/token_passenger/send_otp.php', + payload: { + 'receiver': phone, + // 'device_token': deviceToken, + }, + ); + + if (response != 'failure') { + isLoading.value = true; + // بإمكانك عرض رسالة نجاح هنا + } else { + Get.snackbar('Error'.tr, 'Failed to send OTP'.tr); + } + } catch (e) { + Get.snackbar('Error', e.toString()); + } finally { + // isLoading.value = false; + } + } + + Future verifyOtp(String ptoken) async { + isVerifying.value = true; + + try { + String fingerPrint = await DeviceHelper.getDeviceFingerprint(); + final response = await CRUD().post( + link: '${AppLink.server}/auth/token_passenger/verify_otp.php', + payload: { + 'phone_number': phone, + 'otp': otpCode.value, + 'token': box.read(BoxName.tokenFCM).toString(), + 'fingerPrint': fingerPrint.toString(), + }, + ); + + if (response != 'failure' && response['status'] == 'success') { + await NotificationService.sendNotification( + category: 'token change', + target: ptoken.toString(), + title: 'token change'.tr, + body: 'change device'.tr, + isTopic: false, // Important: this is a token + tone: 'cancel', + driverList: [], + ); + + Get.offAll(() => const MapPagePassenger()); + } else { + Get.snackbar('Verification Failed', 'OTP is incorrect or expired'); + } + } catch (e) { + Get.snackbar('Error', e.toString()); + } finally { + isVerifying.value = false; + } + } +} diff --git a/siro_rider/lib/controller/auth/tokens_controller.dart b/siro_rider/lib/controller/auth/tokens_controller.dart new file mode 100644 index 0000000..930359b --- /dev/null +++ b/siro_rider/lib/controller/auth/tokens_controller.dart @@ -0,0 +1,38 @@ +import 'dart:convert'; + +import 'package:get/get.dart'; +import 'package:http/http.dart' as http; + +import '../../constant/box_name.dart'; +import '../../constant/links.dart'; +import '../../main.dart'; +import '../functions/encrypt_decrypt.dart'; + +class TokenController extends GetxController { + bool isloading = false; + + Future addToken() async { + String? basicAuthCredentials = + await storage.read(key: BoxName.basicAuthCredentials); + isloading = true; + update(); + var res = await http.post( + Uri.parse(AppLink.addTokens), + headers: { + 'Authorization': + 'Basic ${base64Encode(utf8.encode(basicAuthCredentials.toString()))}', + }, + body: { + 'token': (box.read(BoxName.tokenFCM.toString())), + 'passengerID': box.read(BoxName.passengerID).toString() + }, + ); + + isloading = false; + update(); + var jsonToken = jsonDecode(res.body); + if (jsonToken['status'] == 'The token has been updated successfully.') { + Get.snackbar('token updated'.tr, ''); + } + } +} diff --git a/siro_rider/lib/controller/auth/verify_email_controller.dart b/siro_rider/lib/controller/auth/verify_email_controller.dart new file mode 100644 index 0000000..e6f73f1 --- /dev/null +++ b/siro_rider/lib/controller/auth/verify_email_controller.dart @@ -0,0 +1,16 @@ +import 'package:flutter/material.dart'; +import 'package:get/get.dart'; +import 'package:siro_rider/constant/links.dart'; +import 'package:siro_rider/controller/functions/crud.dart'; + +class VerifyEmailController extends GetxController { + TextEditingController verfyCode = TextEditingController(); + @override + void onInit() async { + super.onInit(); + } + + sendverfications() async { + await CRUD().post(link: AppLink.sendVerifyEmail); + } +} diff --git a/siro_rider/lib/controller/firebase/access_token.dart b/siro_rider/lib/controller/firebase/access_token.dart new file mode 100644 index 0000000..93c6898 --- /dev/null +++ b/siro_rider/lib/controller/firebase/access_token.dart @@ -0,0 +1,50 @@ +import 'dart:convert'; +import 'package:googleapis_auth/auth_io.dart'; + +class AccessTokenManager { + static final AccessTokenManager _instance = AccessTokenManager._internal(); + late final String serviceAccountJsonKey; + AccessToken? _accessToken; + DateTime? _expiryDate; + + AccessTokenManager._internal(); + + factory AccessTokenManager(String jsonKey) { + if (_instance._isServiceAccountKeyInitialized()) { + // Prevent re-initialization + return _instance; + } + _instance.serviceAccountJsonKey = jsonKey; + return _instance; + } + + bool _isServiceAccountKeyInitialized() { + try { + serviceAccountJsonKey; // Access to check if initialized + return true; + } catch (e) { + return false; + } + } + + Future getAccessToken() async { + if (_accessToken != null && DateTime.now().isBefore(_expiryDate!)) { + return _accessToken!.data; + } + try { + final serviceAccountCredentials = ServiceAccountCredentials.fromJson( + json.decode(serviceAccountJsonKey)); + final client = await clientViaServiceAccount( + serviceAccountCredentials, + ['https://www.googleapis.com/auth/firebase.messaging'], + ); + + _accessToken = client.credentials.accessToken; + _expiryDate = client.credentials.accessToken.expiry; + client.close(); + return _accessToken!.data; + } catch (e) { + throw Exception('Failed to obtain access token'); + } + } +} diff --git a/siro_rider/lib/controller/firebase/firbase_messge.dart b/siro_rider/lib/controller/firebase/firbase_messge.dart new file mode 100644 index 0000000..e24c3c8 --- /dev/null +++ b/siro_rider/lib/controller/firebase/firbase_messge.dart @@ -0,0 +1,774 @@ +import 'dart:convert'; +import 'dart:io'; +import 'package:siro_rider/views/home/HomePage/trip_monitor/trip_link_monitor.dart'; +import 'package:firebase_messaging/firebase_messaging.dart'; +import 'package:flutter/material.dart'; +import 'package:get/get.dart'; +import 'package:siro_rider/controller/functions/toast.dart'; +import 'package:siro_rider/views/widgets/elevated_btn.dart'; + +import '../../constant/box_name.dart'; +import '../../constant/colors.dart'; +import '../../constant/style.dart'; +import '../../main.dart'; +import '../../print.dart'; +import '../../views/Rate/rate_captain.dart'; +import '../../views/home/map_page_passenger.dart'; +import '../../views/home/profile/promos_passenger_page.dart'; +import '../auth/google_sign.dart'; +import 'package:siro_rider/controller/voice_call_controller.dart'; +import '../home/map/ride_lifecycle_controller.dart'; +import '../home/map/ride_state.dart'; +import 'local_notification.dart'; + +class FirebaseMessagesController extends GetxController { + final fcmToken = FirebaseMessaging.instance; + + List tokens = []; + List dataTokens = []; + late String driverID; + late String driverToken; + NotificationSettings? notificationSettings; + + Future getNotificationSettings() async { + // Get the current notification settings + NotificationSettings? notificationSettings = + await FirebaseMessaging.instance.getNotificationSettings(); + 'Notification authorization status: ${notificationSettings.authorizationStatus}'; + + // Call the update function if needed + update(); + } + + Future requestFirebaseMessagingPermission() async { + FirebaseMessaging messaging = FirebaseMessaging.instance; + + // Check if the platform is Android + if (Platform.isAndroid) { + // Request permission for Android + await messaging.requestPermission(); + } else if (Platform.isIOS) { + // Request permission for iOS + NotificationSettings settings = await messaging.requestPermission( + alert: true, + announcement: true, + badge: true, + carPlay: true, + criticalAlert: true, + provisional: false, + sound: true, + ); + messaging.setForegroundNotificationPresentationOptions( + alert: true, badge: true, sound: true); + } + } + + NotificationController notificationController = + Get.isRegistered() + ? Get.find() + : Get.put(NotificationController()); + + Future getToken() async { + fcmToken.getToken().then((token) { + // Log.print('fcmToken: ${token}'); + box.write(BoxName.tokenFCM, (token.toString())); + }); + // 🔹 الاشتراك في topic + await fcmToken + .subscribeToTopic("passengers"); // أو "users" حسب نوع المستخدم + Log.print("Subscribed to 'passengers' topic ✅"); + + FirebaseMessaging.onMessage.listen((RemoteMessage message) { + // If the app is in the background or terminated, show a system tray message + RemoteNotification? notification = message.notification; + AndroidNotification? android = notification?.android; + // if (notification != null && android != null) { + if (message.data.isNotEmpty) { + fireBaseTitles(message); + } + }); + FirebaseMessaging.onBackgroundMessage((RemoteMessage message) async { + // Handle background message + if (message.data.isNotEmpty) { + fireBaseTitles(message); + } + }); + + FirebaseMessaging.onMessageOpenedApp.listen((RemoteMessage message) { + if (message.data.isNotEmpty && message.notification != null) { + fireBaseTitles(message); + } + }); + } + + Future fireBaseTitles(RemoteMessage message) async { + // [!! تعديل !!] + // اقرأ "النوع" من حمولة البيانات، وليس من العنوان + String category = message.data['category'] ?? ''; + + final mapCtrl = Get.isRegistered() + ? Get.find() + : null; + // اقرأ العنوان (للعرض) + String title = message.data['title'] ?? message.notification?.title ?? ''; + String body = message.data['body'] ?? message.notification?.body ?? ''; + + if (category == 'ORDER') { + // <-- مثال: كان 'Order'.tr + Log.print('message: ${message}'); + if (Platform.isAndroid) { + notificationController.showNotification(title, body, 'Order'); + } + } + + // ... داخل معالج الإشعارات في تطبيق الراكب ... + else if (category == 'Accepted Ride') { + if (mapCtrl != null) { + Map? driverInfoMap; + + // 2. معالجة driver_info (تأتي كـ String JSON من PHP) + if (message.data['driver_info'] != null) { + try { + String rawJson = message.data['driver_info']; + // 🔥 فك التشفير: تحويل الـ String إلى Map + driverInfoMap = jsonDecode(rawJson); + } catch (e) { + Log.print("❌ Error decoding FCM driver_info: $e"); + } + } + + // 3. تمرير البيانات الجاهزة للكنترولر + await mapCtrl.processRideAcceptance( + driverData: driverInfoMap, + source: "FCM", + ); + } + } else if (category == 'Promo') { + // <-- كان 'Promo'.tr + if (Platform.isAndroid) { + notificationController.showNotification(title, body, 'promo'); + } + Get.to(const PromosPassengerPage()); + } else if (category == 'Trip Monitoring') { + // <-- كان 'Trip Monitoring'.tr + if (Platform.isAndroid) { + notificationController.showNotification(title, body, 'iphone_ringtone'); + } + var myListString = message.data['passengerList']; + var myList = jsonDecode(myListString) as List; + Get.to(() => TripMonitor(), arguments: { + 'rideId': myList[0].toString(), + 'driverId': myList[1].toString(), + }); + } else if (category == 'token change') { + // <-- كان 'token change'.tr + if (Platform.isAndroid) { + notificationController.showNotification(title, body, 'cancel'); + } + GoogleSignInHelper.signOut(); + } else if (category == 'Driver Is Going To Passenger') { + // <-- كان 'Driver Is Going To Passenger' + Get.find().isDriverInPassengerWay = true; + Get.find().update(); + if (Platform.isAndroid) { + notificationController.showNotification(title, body, 'tone1'); + } + } else if (category == 'MSG_FROM_PASSENGER') { + // <-- كان 'message From passenger' + if (Platform.isAndroid) { + notificationController.showNotification(title, body, 'ding'); + } + passengerDialog(body); + update(); + } else if (category == 'message From Driver') { + // <-- كان 'message From Driver' + if (Platform.isAndroid) { + notificationController.showNotification(title, body, 'ding'); + } + passengerDialog(body); + update(); + } else if (category == 'Trip is Begin') { + // <-- كان 'Trip is Begin' + Log.print('[FCM] استقبل إشعار "TRIP_BEGUN".'); + // استدعاء الحارس + mapCtrl!.processRideBegin(source: "FCM"); + } else if (category == 'Hi ,I will go now') { + // <-- كان 'Hi ,I will go now'.tr + if (Platform.isAndroid) { + notificationController.showNotification(title, body, 'ding'); + } + update(); + } else if (category == "Arrive Ride") { + // استدعاء الحارس + mapCtrl!.processDriverArrival("FCM"); + } else if (category == 'Driver Finish Trip') { + List driverList = []; + + // ✅ معالجة آمنة للبيانات + var rawData = message.data['DriverList']; + if (rawData != null && rawData.isNotEmpty) { + try { + driverList = jsonDecode(rawData) as List; + } catch (e) { + Log.print("❌ Error decoding DriverList: $e"); + } + } + + if (driverList.isNotEmpty) { + Get.find() + .processRideFinished(driverList, source: "FCM"); + } + } else if (category == 'Finish Monitor') { + // <-- كان "Finish Monitor".tr + Get.defaultDialog( + titleStyle: AppStyle.title, + title: 'Trip finished '.tr, + middleText: '', + confirm: MyElevatedButton( + title: 'Ok'.tr, + onPressed: () { + Get.offAll(() => const MapPagePassenger()); + })); + } else if (category == 'Cancel Trip from driver') { + Log.print("🔔 FCM: Ride Cancelled by Driver received."); + + // لا داعي لكتابة منطق التنظيف هنا، الكنترولر يتكفل بكل شيء + if (Get.isRegistered()) { + // استدعاء الحارس (سيتجاهل الأمر إذا كان السوكيت قد سبقه) + Get.find() + .processRideCancelledByDriver(message.data, source: "FCM"); + } + + // إشعار محلي (اختياري، لأن الديالوج سيظهر) + if (Platform.isAndroid) { + notificationController.showNotification( + 'Trip Cancelled'.tr, 'The driver cancelled the trip.'.tr, 'cancel'); + } + } + // ... (باقي الحالات مثل Call Income, Call End, إلخ) ... + // ... بنفس الطريقة ... + + else if (category == 'incoming_call') { + final sessionId = message.data['session_id']; + final callerName = message.data['caller_name']; + final rideId = message.data['ride_id']; + if (sessionId != null && callerName != null && rideId != null) { + Get.find().receiveCall( + sessionIdVal: sessionId.toString(), + remoteNameVal: callerName.toString(), + rideIdVal: rideId.toString(), + ); + } + } + + else if (category == 'Order Applied') { + if (Platform.isAndroid) { + notificationController.showNotification( + 'The order Accepted by another Driver'.tr, + 'We regret to inform you that another driver has accepted this order.' + .tr, + 'order'); + } + } + } + // Future fireBaseTitles(RemoteMessage message) async { + // if (message.notification!.title! == 'Order'.tr) { + // Log.print('message: ${message}'); + // if (Platform.isAndroid) { + // notificationController.showNotification( + // 'Order'.tr, message.notification!.body!, 'Order'); + // } + // } else // ... داخل معالج الإشعارات في تطبيق الراكب ... + + // if (message.notification!.title! == 'Accepted Ride') { + // // ... + + // // انظر هنا: قمنا بتغيير "passengerList" إلى "driverList" + // var driverListJson = message.data['driverList']; + + // // تأكد من أن البيانات ليست null قبل المتابعة + // if (driverListJson != null) { + // var myList = jsonDecode(driverListJson) as List; + // Log.print('myList: ${myList}'); + + // final controller = Get.find(); + + // // استدعاء الدالة الموحدة الجديدة التي أنشأناها + // await controller.processRideAcceptance( + // driverIdFromFCM: myList[0].toString(), + // rideIdFromFCM: myList[3].toString()); + // } else { + // Log.print( + // '❌ خطأ فادح: إشعار "Accepted Ride" وصل بدون بيانات (driverList is null)'); + // } + // } else if (message.notification!.title! == 'Promo'.tr) { + // if (Platform.isAndroid) { + // notificationController.showNotification( + // 'Promo', 'Show latest promo'.tr, 'promo'); + // } + // Get.to(const PromosPassengerPage()); + // } else if (message.notification!.title! == 'Trip Monitoring'.tr) { + // if (Platform.isAndroid) { + // notificationController.showNotification( + // 'Trip Monitoring'.tr, '', 'iphone_ringtone'); + // } + // var myListString = message.data['DriverList']; + // var myList = jsonDecode(myListString) as List; + // Get.toNamed('/tripmonitor', arguments: { + // 'rideId': myList[0].toString(), + // 'driverId': myList[1].toString(), + // }); + // } else if (message.notification!.title! == 'token change'.tr) { + // if (Platform.isAndroid) { + // notificationController.showNotification( + // 'token change'.tr, 'token change'.tr, 'cancel'); + // } + // GoogleSignInHelper.signOut(); + // } else if (message.notification!.title! == 'Driver Is Going To Passenger') { + // Get.find().isDriverInPassengerWay = true; + // Get.find().update(); + // if (Platform.isAndroid) { + // notificationController.showNotification('Driver is Going To You'.tr, + // 'Please stay on the picked point.'.tr, 'tone1'); + // } + // // Get.snackbar('Driver is Going To Passenger', '', + // // backgroundColor: AppColor.greenColor); + // } else if (message.notification!.title! == 'message From passenger') { + // if (Platform.isAndroid) { + // notificationController.showNotification( + // 'message From passenger'.tr, ''.tr, 'ding'); + // } + // passengerDialog(message.notification!.body!); + + // update(); + // } else if (message.notification!.title! == 'message From Driver') { + // if (Platform.isAndroid) { + // notificationController.showNotification( + // 'message From Driver'.tr, ''.tr, 'ding'); + // } + // passengerDialog(message.notification!.body!); + + // update(); + // } else // (هذا الكود في معالج الإشعارات لديك) + // if (message.notification!.title! == 'Trip is Begin') { + // Log.print('[FCM] استقبل إشعار "Trip is Begin".'); + + // // (تم حذف الإشعار المحلي من هنا، نُقل إلى الدالة الموحدة) + + // final controller = Get.find(); + + // // استدعاء حارس البوابة الجديد والآمن + // controller.processRideBegin(); + + // // (تم حذف كل الأوامر التالية من هنا) + // // Get.find().getBeginRideFromDriver(); + // // box.write(BoxName.passengerWalletTotal, '0'); + // // update(); + // } else if (message.notification!.title! == 'Hi ,I will go now'.tr) { + // // Get.snackbar('Hi ,I will go now', '', + // // backgroundColor: AppColor.greenColor); + // if (Platform.isAndroid) { + // notificationController.showNotification( + // 'Passenger come to you'.tr, 'Hi ,I will go now'.tr, 'ding'); + // } + // update(); + // } // ... داخل معالج الإشعارات (FCM Handler) ... + // if (message.notification!.title! == 'Hi ,I Arrive your site'.tr) { + // final controller = Get.find(); + + // // 1. التأكد أننا في الحالة الصحيحة (السائق كان في الطريق) + // if (controller.currentRideState.value == RideState.driverApplied) { + // Log.print('[FCM] السائق وصل. تغيير الحالة إلى driverArrived'); + + // // 2. تغيير الحالة فقط! + // controller.currentRideState.value = RideState.driverArrived; + // } + // } else if (message.notification!.title! == "Cancel Trip from driver") { + // Get.back(); + // if (Platform.isAndroid) { + // notificationController.showNotification("Cancel Trip from driver".tr, + // "We will look for a new driver.\nPlease wait.".tr, 'cancel'); + // } + // Get.defaultDialog( + // title: "The driver canceled your ride.".tr, + // middleText: "We will look for a new driver.\nPlease wait.".tr, + // confirm: MyElevatedButton( + // kolor: AppColor.greenColor, + // title: 'Ok'.tr, + // onPressed: () async { + // Get.back(); + // await Get.find() + // .reSearchAfterCanceledFromDriver(); + // }, + // ), + // cancel: MyElevatedButton( + // title: 'Cancel'.tr, + // kolor: AppColor.redColor, + // onPressed: () { + // Get.offAll(() => const MapPagePassenger()); + // }, + // ) + // // Get.find() + // // .searchNewDriverAfterRejectingFromDriver(); + // ); + // } else if (message.notification!.title! == 'Driver Finish Trip'.tr) { + // // الخطوة 1: استقبل البيانات وتحقق من وجودها + // final rawData = message.data['DriverList']; + // List driverList = []; // ابدأ بقائمة فارغة كإجراء وقائي + + // // الخطوة 2: قم بفك تشفير البيانات بأمان + // if (rawData != null && rawData is String) { + // try { + // driverList = jsonDecode(rawData); + // Log.print('Successfully decoded DriverList: $driverList'); + // } catch (e) { + // Log.print('Error decoding DriverList JSON: $e'); + // // اترك القائمة فارغة في حالة حدوث خطأ + // } + // } else { + // Log.print('Error: DriverList data is null or not a String.'); + // } + + // // الخطوة 3: استخدم البيانات فقط إذا كانت القائمة تحتوي على العناصر المطلوبة + // // هذا يمنع خطأ "RangeError" إذا كانت القائمة أقصر من المتوقع + // if (driverList.length >= 4) { + // if (Platform.isAndroid) { + // notificationController.showNotification( + // "Driver Finish Trip".tr, + // '${'you will pay to Driver'.tr} ${driverList[3].toString()} \$', // تم تحسين طريقة عرض النص + // 'tone1'); + // } + + // Get.find().stopRecording(); + + // if ((double.tryParse( + // box.read(BoxName.passengerWalletTotal).toString()) ?? + // 0) < + // 0) { + // box.write(BoxName.passengerWalletTotal, 0); + // } + + // Get.find().tripFinishedFromDriver(); + + // NotificationController().showNotification( + // 'Don’t forget your personal belongings.'.tr, + // 'Please make sure you have all your personal belongings and that any remaining fare, if applicable, has been added to your wallet before leaving. Thank you for choosing the Intaleq app' + // .tr, + // 'ding'); + + // Get.to(() => RateDriverFromPassenger(), arguments: { + // 'driverId': driverList[0].toString(), + // 'rideId': driverList[1].toString(), + // 'price': driverList[3].toString() + // }); + // } else { + // Log.print( + // 'Error: Decoded driverList does not have enough elements. Received: $driverList'); + // // هنا يمكنك عرض رسالة خطأ للمستخدم إذا لزم الأمر + // } + // } else if (message.notification!.title! == "Finish Monitor".tr) { + // Get.defaultDialog( + // titleStyle: AppStyle.title, + // title: 'Trip finished '.tr, + // middleText: '', + // confirm: MyElevatedButton( + // title: 'Ok'.tr, + // onPressed: () { + // Get.offAll(() => const MapPagePassenger()); + // })); + // } + // // else if (message.notification!.title! == "Trip Monitoring".tr) { + // // Get.to(() => const TripMonitor()); + // // } + // else if (message.notification!.title! == 'Call Income') { + // try { + // var myListString = message.data['DriverList']; + // var driverList = jsonDecode(myListString) as List; + // // if (Platform.isAndroid) { + // if (Platform.isAndroid) { + // notificationController.showNotification( + // 'Call Income'.tr, + // message.notification!.body!, + // 'iphone_ringtone', + // ); + // } + // // } + // // Assuming GetMaterialApp is initialized and context is valid for navigation + // // Get.to(() => PassengerCallPage( + // // channelName: driverList[1].toString(), + // // token: driverList[0].toString(), + // // remoteID: driverList[2].toString(), + // // )); + // } catch (e) { Log.print("Error occurred: $e"); } + // } else if (message.notification!.title! == 'Call Income from Driver'.tr) { + // try { + // var myListString = message.data['DriverList']; + // var driverList = jsonDecode(myListString) as List; + // // if (Platform.isAndroid) { + // if (Platform.isAndroid) { + // notificationController.showNotification( + // 'Call Income'.tr, + // message.notification!.body!, + // 'iphone_ringtone', + // ); + // } + // // Assuming GetMaterialApp is initialized and context is valid for navigation + // // Get.to(() => PassengerCallPage( + // // channelName: driverList[1].toString(), + // // token: driverList[0].toString(), + // // remoteID: driverList[2].toString(), + // // )); + // } catch (e) { Log.print("Error occurred: $e"); } + // } else if (message.notification!.title! == 'Call End'.tr) { + // try { + // var myListString = message.data['DriverList']; + // var driverList = jsonDecode(myListString) as List; + // if (Platform.isAndroid) { + // notificationController.showNotification( + // 'Call End'.tr, + // message.notification!.body!, + // 'ding', + // ); + // } + // // Assuming GetMaterialApp is initialized and context is valid for navigation + // // Get.off(const CallPage()); + // } catch (e) { Log.print("Error occurred: $e"); } + // } else if (message.notification!.title! == 'Driver Cancelled Your Trip') { + // // Get.snackbar( + // // 'You will be pay the cost to driver or we will get it from you on next trip' + // // .tr, + // // 'message', + // // backgroundColor: AppColor.redColor); + // if (Platform.isAndroid) { + // notificationController.showNotification( + // 'Driver Cancelled Your Trip'.tr, + // 'you will pay to Driver you will be pay the cost of driver time look to your Intaleq Wallet' + // .tr, + // 'cancel'); + // } + // box.write(BoxName.parentTripSelected, false); + // box.remove(BoxName.tokenParent); + + // Get.find().restCounter(); + // Get.offAll(() => const MapPagePassenger()); + // } + // // else if (message.notification!.title! == 'Order Applied') { + // // Get.snackbar( + // // "The order has been accepted by another driver." + // // .tr, // Corrected grammar + // // "Be more mindful next time to avoid dropping orders." + // // .tr, // Improved sentence structure + // // backgroundColor: AppColor.yellowColor, + // // snackPosition: SnackPosition.BOTTOM, + // // ); + // // } + + // else if (message.notification!.title! == 'Order Applied'.tr) { + // if (Platform.isAndroid) { + // notificationController.showNotification( + // 'The order Accepted by another Driver'.tr, + // 'We regret to inform you that another driver has accepted this order.' + // .tr, + // 'order'); + // } + // } + // } + + SnackbarController driverAppliedTripSnakBar() { + return Get.snackbar( + 'Driver Applied the Ride for You'.tr, + '', + colorText: AppColor.greenColor, + duration: const Duration(seconds: 3), + snackPosition: SnackPosition.TOP, + titleText: Text( + 'Applied'.tr, + style: TextStyle(color: AppColor.redColor), + ), + messageText: Text( + 'Driver Applied the Ride for You'.tr, + style: AppStyle.title, + ), + icon: Icon(Icons.approval, color: AppColor.primaryColor), + shouldIconPulse: true, + margin: const EdgeInsets.all(16), + padding: const EdgeInsets.all(16), + ); + } + + Future passengerDialog(String message) { + return Get.defaultDialog( + barrierDismissible: false, + title: message.tr, + titleStyle: AppStyle.title, + middleTextStyle: AppStyle.title, + middleText: message.tr, + confirm: MyElevatedButton( + title: 'Ok'.tr, + onPressed: () { + // Get.find().sendNotificationToPassengerToken( + // 'Hi ,I will go now'.tr, + // 'I will go now'.tr, + // Get.find().driverToken, []); + // Get.find() + // .startTimerDriverWaitPassenger5Minute(); + + Get.back(); + })); + } + + Future driverFinishTripDialoge(List driverList) { + return Get.defaultDialog( + title: 'Driver Finish Trip'.tr, + content: const DriverTipWidget(), + confirm: MyElevatedButton( + title: 'Yes'.tr, + onPressed: () async { + Get.to(() => RateDriverFromPassenger(), arguments: { + 'driverId': driverList[0].toString(), + 'rideId': driverList[1].toString(), + 'price': driverList[3].toString() + }); + }, + kolor: AppColor.greenColor, + ), + cancel: MyElevatedButton( + title: 'No,I want'.tr, + onPressed: () { + Get.to(() => RateDriverFromPassenger(), arguments: { + 'driverId': driverList[0].toString(), + 'rideId': driverList[1].toString(), + 'price': driverList[3].toString() + }); + }, + kolor: AppColor.redColor, + )); + } +} + +class DriverTipWidget extends StatelessWidget { + const DriverTipWidget({ + super.key, + }); + + @override + Widget build(BuildContext context) { + return GetBuilder(builder: (controller) { + return Column( + mainAxisAlignment: MainAxisAlignment.spaceEvenly, + children: [ + // Text( + // '${'Your fee is '.tr}${Get.find().totalPassenger.toStringAsFixed(2)}'), + Text( + 'Do you want to pay Tips for this Driver'.tr, + textAlign: TextAlign.center, + ), + Row( + mainAxisAlignment: MainAxisAlignment.spaceAround, + children: [ + InkWell( + onTap: () { + box.write(BoxName.tipPercentage, '0.05'); + + Toast.show( + context, + '${'Tip is '.tr}${(controller.totalPassenger) * (double.parse(box.read(BoxName.tipPercentage.toString())))}', + AppColor.cyanBlue); + controller.update(); + }, + child: Container( + decoration: BoxDecoration(border: Border.all()), + child: const Padding( + padding: EdgeInsets.all(4), + child: Center( + child: Text('5%'), + ), + ), + ), + ), + InkWell( + onTap: () { + box.write(BoxName.tipPercentage, '0.10'); + Toast.show( + context, + '${'Tip is'.tr} ${(controller.totalPassenger) * (double.parse(box.read(BoxName.tipPercentage.toString())))}', + AppColor.cyanBlue); + controller.update(); + }, + child: Container( + decoration: BoxDecoration(border: Border.all()), + child: const Center( + child: Padding( + padding: EdgeInsets.all(5), + child: Text('10%'), + ), + ), + ), + ), + InkWell( + onTap: () { + box.write(BoxName.tipPercentage, '0.15'); + Toast.show( + context, + '${'Tip is'.tr} ${(controller.totalPassenger) * (double.parse(box.read(BoxName.tipPercentage.toString())))}', + AppColor.cyanBlue); + controller.update(); + }, + child: Container( + decoration: BoxDecoration(border: Border.all()), + child: const Center( + child: Padding( + padding: EdgeInsets.all(5), + child: Text('15%'), + ), + ), + ), + ), + InkWell( + onTap: () { + box.write(BoxName.tipPercentage, '0.20'); + Toast.show( + context, + '${'Tip is'.tr} ${(controller.totalPassenger) * (double.parse(box.read(BoxName.tipPercentage.toString())))}', + AppColor.cyanBlue); + controller.update(); + }, + child: Container( + decoration: BoxDecoration(border: Border.all()), + child: const Center( + child: Padding( + padding: EdgeInsets.all(5), + child: Text('20%'), + ), + ), + ), + ), + ], + ), + Row( + mainAxisAlignment: MainAxisAlignment.spaceAround, + children: [ + MyElevatedButton( + kolor: AppColor.redColor, + title: 'No i want'.tr, + onPressed: () { + box.write(BoxName.tipPercentage, '0'); + controller.update(); + }), + Container( + decoration: AppStyle.boxDecoration1, + child: Padding( + padding: const EdgeInsets.all(6), + child: Text( + '${(controller.totalPassenger) * (double.parse(box.read(BoxName.tipPercentage.toString())))} ${box.read(BoxName.countryCode) == 'Egypt' ? 'LE'.tr : 'JOD'.tr}', + style: AppStyle.title, + ), + ), + ), + ], + ) + ], + ); + }); + } +} diff --git a/siro_rider/lib/controller/firebase/live_activity.dart b/siro_rider/lib/controller/firebase/live_activity.dart new file mode 100644 index 0000000..1c6b847 --- /dev/null +++ b/siro_rider/lib/controller/firebase/live_activity.dart @@ -0,0 +1,60 @@ +import 'package:siro_rider/print.dart'; +import 'package:flutter/material.dart'; +import 'package:flutter/services.dart'; + +class LiveActivityScreen extends StatefulWidget { + @override + _LiveActivityScreenState createState() => _LiveActivityScreenState(); +} + +class _LiveActivityScreenState extends State { + static const platform = MethodChannel('live_activity_channel'); + + Future _startLiveActivity() async { + try { + await platform.invokeMethod('startLiveActivity'); + } on PlatformException catch (e) { + Log.print("Failed to start Live Activity: '${e.message}'."); + } + } + + Future _updateLiveActivity(double progress) async { + try { + await platform.invokeMethod('updateLiveActivity', {"progress": progress}); + } on PlatformException catch (e) { + Log.print("Failed to update Live Activity: '${e.message}'."); + } + } + + Future _endLiveActivity() async { + try { + await platform.invokeMethod('endLiveActivity'); + } on PlatformException catch (e) { + Log.print("Failed to end Live Activity: '${e.message}'."); + } + } + + @override + Widget build(BuildContext context) { + return Scaffold( + appBar: AppBar(title: Text("Live Activity Test")), + body: Column( + mainAxisAlignment: MainAxisAlignment.center, + children: [ + ElevatedButton( + onPressed: _startLiveActivity, + child: Text("Start Live Activity"), + ), + ElevatedButton( + onPressed: () => _updateLiveActivity(0.5), + child: Text("Update Progress to 50%"), + ), + ElevatedButton( + onPressed: _endLiveActivity, + child: Text("End Live Activity"), + ), + ], + ), + ); + } +} \ No newline at end of file diff --git a/siro_rider/lib/controller/firebase/local_notification.dart b/siro_rider/lib/controller/firebase/local_notification.dart new file mode 100644 index 0000000..be123e2 --- /dev/null +++ b/siro_rider/lib/controller/firebase/local_notification.dart @@ -0,0 +1,336 @@ +import 'package:siro_rider/print.dart'; +import 'dart:async'; +import 'dart:io'; + +import 'package:flutter_local_notifications/flutter_local_notifications.dart'; +import 'package:get/get.dart'; +import 'package:permission_handler/permission_handler.dart'; +import 'package:timezone/data/latest.dart' as tz; +import 'package:timezone/timezone.dart' as tz; + +import '../../main.dart'; + +class NotificationController extends GetxController { + final FlutterLocalNotificationsPlugin _flutterLocalNotificationsPlugin = + FlutterLocalNotificationsPlugin(); + FlutterLocalNotificationsPlugin get plugin => + _flutterLocalNotificationsPlugin; + + @override + void onInit() { + super.onInit(); + initNotifications(); + } + + // Initializes the local notifications plugin + Future initNotifications() async { + const AndroidInitializationSettings android = + AndroidInitializationSettings('@mipmap/launcher_icon'); + DarwinInitializationSettings ios = DarwinInitializationSettings( + requestAlertPermission: true, + requestBadgePermission: true, + requestSoundPermission: true, + // onDidReceiveLocalNotification: + // (int id, String? title, String? body, String? payload) async {}, + ); + InitializationSettings initializationSettings = + InitializationSettings(android: android, iOS: ios); + await _flutterLocalNotificationsPlugin.initialize( + settings: initializationSettings); + + tz.initializeTimeZones(); + Log.print('Notifications initialized'); + } + + // Displays a notification with the given title and message + void showNotification(String title, String message, String tone) async { + final AndroidNotificationDetails android = AndroidNotificationDetails( + 'high_importance_channel', + 'High Importance Notifications', + importance: Importance.max, + priority: Priority.high, + showWhen: false, + sound: RawResourceAndroidNotificationSound(tone), + ); + + const DarwinNotificationDetails ios = DarwinNotificationDetails( + sound: 'default', + presentAlert: true, + presentBadge: true, + presentSound: true, + ); + + final NotificationDetails details = + NotificationDetails(android: android, iOS: ios); + await _flutterLocalNotificationsPlugin.show( + id: 0, title: title, body: message, notificationDetails: details); + Log.print('Notification shown: $title - $message'); + } +// /Users/hamzaaleghwairyeen/development/App/ride 2/lib/controller/firebase/local_notification.dart + +// Assume _flutterLocalNotificationsPlugin is initialized somewhere in your code + + // void scheduleNotificationsForSevenDays( + // String title, String message, String tone) async { + // final AndroidNotificationDetails android = AndroidNotificationDetails( + // 'high_importance_channel', + // 'High Importance Notifications', + // importance: Importance.max, + // priority: Priority.high, + // sound: RawResourceAndroidNotificationSound(tone), + // ); + + // const DarwinNotificationDetails ios = DarwinNotificationDetails( + // sound: 'default', + // presentAlert: true, + // presentBadge: true, + // presentSound: true, + // ); + + // final NotificationDetails details = + // NotificationDetails(android: android, iOS: ios); + + // // Check for the exact alarm permission on Android 12 and above + // if (Platform.isAndroid) { + // if (await Permission.scheduleExactAlarm.isDenied) { + // if (await Permission.scheduleExactAlarm.request().isGranted) { + // Log.print('SCHEDULE_EXACT_ALARM permission granted'); + // } else { + // Log.print('SCHEDULE_EXACT_ALARM permission denied'); + // return; + // } + // } + // } + + // // Schedule notifications for the next 7 days + // for (int day = 0; day < 7; day++) { + // // Schedule for 8:00 AM + // await _scheduleNotificationForTime( + // day, 8, 0, title, message, details, day * 1000 + 1); + + // // Schedule for 3:00 PM + // await _scheduleNotificationForTime( + // day, 15, 0, title, message, details, day * 1000 + 2); // Unique ID + + // // Schedule for 8:00 PM + // await _scheduleNotificationForTime( + // day, 20, 0, title, message, details, day * 1000 + 3); // Unique ID + // } + + // Log.print('Notifications scheduled successfully for the next 7 days'); + // } + void scheduleNotificationsForSevenDays( + String title, String message, String tone) async { + final AndroidNotificationDetails android = AndroidNotificationDetails( + 'high_importance_channel', + 'High Importance Notifications', + importance: Importance.max, + priority: Priority.high, + sound: RawResourceAndroidNotificationSound(tone), + ); + + const DarwinNotificationDetails ios = DarwinNotificationDetails( + sound: 'default', + presentAlert: true, + presentBadge: true, + presentSound: true, + ); + + final NotificationDetails details = + NotificationDetails(android: android, iOS: ios); + + // Check for the exact alarm permission on Android 12 and above + if (Platform.isAndroid) { + if (await Permission.scheduleExactAlarm.isDenied) { + if (await Permission.scheduleExactAlarm.request().isGranted) { + Log.print('SCHEDULE_EXACT_ALARM permission granted'); + } else { + Log.print('SCHEDULE_EXACT_ALARM permission denied'); + return; + } + } + } + + // Schedule notifications for the next 7 days + for (int day = 0; day < 7; day++) { + // List of notification times + final notificationTimes = [ + {'hour': 8, 'minute': 0, 'id': day * 1000 + 1}, // 8:00 AM + {'hour': 15, 'minute': 0, 'id': day * 1000 + 2}, // 3:00 PM + {'hour': 20, 'minute': 0, 'id': day * 1000 + 3}, // 8:00 PM + ]; + + for (var time in notificationTimes) { + final notificationId = time['id'] as int; + + // Check if this notification ID is already stored + bool isScheduled = box.read('notification_$notificationId') ?? false; + + if (!isScheduled) { + // Schedule the notification if not already scheduled + await _scheduleNotificationForTime( + day, + time['hour'] as int, + time['minute'] as int, + title, + message, + details, + notificationId, + ); + + // Mark this notification ID as scheduled in GetStorage + box.write('notification_$notificationId', true); + } else { + Log.print('Notification with ID $notificationId is already scheduled.'); + } + } + } + + Log.print('Notifications scheduled successfully for the next 7 days'); + } + + void scheduleNotificationsForTimeSelected( + String title, String message, String tone, DateTime timeSelected) async { + final AndroidNotificationDetails android = AndroidNotificationDetails( + 'high_importance_channel', + 'High Importance Notifications', + importance: Importance.max, + priority: Priority.high, + sound: RawResourceAndroidNotificationSound(tone), + ); + + const DarwinNotificationDetails ios = DarwinNotificationDetails( + sound: 'default', + presentAlert: true, + presentBadge: true, + presentSound: true, + ); + + final NotificationDetails details = + NotificationDetails(android: android, iOS: ios); + + // Check for the exact alarm permission on Android 12 and above + if (Platform.isAndroid) { + if (await Permission.scheduleExactAlarm.isDenied) { + if (await Permission.scheduleExactAlarm.request().isGranted) { + Log.print('SCHEDULE_EXACT_ALARM permission granted'); + } else { + Log.print('SCHEDULE_EXACT_ALARM permission denied'); + return; + } + } + } + + // Schedule notifications for 10 and 30 minutes before the timeSelected + await _scheduleNotificationForTimeVIP( + timeSelected.subtract(const Duration(minutes: 10)), // 10 minutes before + title, + message, + details, + 1, // Unique ID for 10-minute before notification + ); + + await _scheduleNotificationForTimeVIP( + timeSelected.subtract(const Duration(minutes: 30)), // 30 minutes before + title, + message, + details, + 2, // Unique ID for 30-minute before notification + ); + + Log.print('Notifications scheduled successfully for the time selected'); + } + + Future _scheduleNotificationForTimeVIP( + DateTime scheduledDate, + String title, + String message, + NotificationDetails details, + int notificationId, + ) async { + // Initialize and set Cairo timezone + tz.initializeTimeZones(); + var cairoLocation = tz.getLocation('Africa/Cairo'); + + final now = tz.TZDateTime.now(cairoLocation); + + // Convert to Cairo time + tz.TZDateTime scheduledTZDateTime = + tz.TZDateTime.from(scheduledDate, cairoLocation); + + // Check if 10 minutes before the scheduled time is in the past + if (scheduledTZDateTime + .subtract(const Duration(minutes: 10)) + .isBefore(now)) { + // If the 10 minutes before the scheduled time is in the past, don't schedule + Log.print( + 'Scheduled time minus 10 minutes is in the past. Skipping notification.'); + return; // Skip this notification + } + + Log.print('Current time (Cairo): $now'); + Log.print('Scheduling notification for: $scheduledTZDateTime'); + + await _flutterLocalNotificationsPlugin.zonedSchedule( + id: notificationId, // Unique ID for each notification + title: title, + body: message, + scheduledDate: scheduledTZDateTime, + notificationDetails: details, + androidScheduleMode: AndroidScheduleMode.exact, + // uiLocalNotificationDateInterpretation: + // UILocalNotificationDateInterpretation.absoluteTime, + matchDateTimeComponents: + null, // Don't repeat automatically; we handle manually + ); + + Log.print('Notification scheduled successfully for: $scheduledTZDateTime'); + } + + Future _scheduleNotificationForTime( + int dayOffset, + int hour, + int minute, + String title, + String message, + NotificationDetails details, + int notificationId, + ) async { + // Initialize and set Cairo timezone + tz.initializeTimeZones(); + var cairoLocation = tz.getLocation('Africa/Cairo'); + + final now = tz.TZDateTime.now(cairoLocation); + tz.TZDateTime scheduledDate = tz.TZDateTime( + cairoLocation, + now.year, + now.month, + now.day + dayOffset, // Add offset to schedule for the next days + hour, + minute, + ); + + // If the scheduled time is in the past, move it to the next day + if (scheduledDate.isBefore(now)) { + scheduledDate = scheduledDate.add(const Duration(days: 1)); + } + + Log.print('Current time (Cairo): $now'); + Log.print('Scheduling notification for: $scheduledDate'); + + await _flutterLocalNotificationsPlugin.zonedSchedule( + id: notificationId, // Unique ID for each notification + title: title, + body: message, + scheduledDate: scheduledDate, + notificationDetails: details, + androidScheduleMode: AndroidScheduleMode.exact, + // uiLocalNotificationDateInterpretation: + // UILocalNotificationDateInterpretation.absoluteTime, + matchDateTimeComponents: + null, // Don't repeat automatically; we handle 7 days manually + ); + + Log.print('Notification scheduled successfully for: $scheduledDate'); + } +} \ No newline at end of file diff --git a/siro_rider/lib/controller/firebase/notification_service.dart b/siro_rider/lib/controller/firebase/notification_service.dart new file mode 100644 index 0000000..d04b558 --- /dev/null +++ b/siro_rider/lib/controller/firebase/notification_service.dart @@ -0,0 +1,66 @@ +import 'dart:convert'; +import 'package:http/http.dart' as http; +import 'package:get/get.dart'; + +import '../../print.dart'; // للترجمة .tr + +class NotificationService { + static const String _serverUrl = + 'https://api.intaleq.xyz/intaleq/ride/firebase/send_fcm.php'; + + static Future sendNotification({ + required String target, + required String title, + required String body, + required String category, // إلزامي للتصنيف + String? tone, + List? driverList, + bool isTopic = false, + }) async { + try { + // 1. تجهيز البيانات المخصصة (Data Payload) + Map customData = {}; + + customData['category'] = category; + + // إذا كان هناك قائمة سائقين/ركاب، نضعها هنا + if (driverList != null && driverList.isNotEmpty) { + // نرسلها كـ JSON String لأن FCM v1 يدعم String Values فقط في الـ data + customData['driverList'] = jsonEncode(driverList); + } + + // 2. تجهيز الطلب الرئيسي للسيرفر + final Map requestPayload = { + 'target': target, + 'title': title, + 'body': body, + 'isTopic': isTopic, + 'data': + customData, // 🔥🔥 التغيير الجوهري: وضعنا البيانات داخل "data" 🔥🔥 + }; + + if (tone != null) { + requestPayload['tone'] = tone; + } + + final response = await http.post( + Uri.parse(_serverUrl), + headers: { + 'Content-Type': 'application/json; charset=UTF-8', + }, + body: jsonEncode(requestPayload), + ); + + if (response.statusCode == 200) { + Log.print('✅ Notification sent successfully.'); + // Log.print('Response: ${response.body}'); + } else { + Log.print( + '❌ Failed to send notification. Code: ${response.statusCode}'); + Log.print('Error Body: ${response.body}'); + } + } catch (e) { + Log.print('❌ Error sending notification: $e'); + } + } +} diff --git a/siro_rider/lib/controller/functions/add_error.dart b/siro_rider/lib/controller/functions/add_error.dart new file mode 100644 index 0000000..320a996 --- /dev/null +++ b/siro_rider/lib/controller/functions/add_error.dart @@ -0,0 +1,19 @@ +import '../../constant/box_name.dart'; +import '../../constant/links.dart'; +import '../../main.dart'; +import 'crud.dart'; + +addError(String error, where) async { + CRUD().post(link: AppLink.addError, payload: { + 'error': error.toString(), // Example error description + 'userId': box.read(BoxName.driverID) ?? + box.read(BoxName.passengerID), // Example user ID + 'userType': box.read(BoxName.driverID) != null + ? 'Driver' + : 'passenger', // Example user type + 'phone': box.read(BoxName.phone) ?? + box.read(BoxName.phoneDriver), // Example phone number + + 'device': where + }); +} diff --git a/siro_rider/lib/controller/functions/audio_record1.dart b/siro_rider/lib/controller/functions/audio_record1.dart new file mode 100644 index 0000000..059c8df --- /dev/null +++ b/siro_rider/lib/controller/functions/audio_record1.dart @@ -0,0 +1,169 @@ +import 'package:siro_rider/print.dart'; +import 'dart:io'; + +// import 'package:flutter_sound/flutter_sound.dart'; +import 'package:path_provider/path_provider.dart'; + +import 'package:get/get.dart'; +import 'package:just_audio/just_audio.dart'; +import 'package:record/record.dart'; + +class AudioRecorderController extends GetxController { + AudioPlayer audioPlayer = AudioPlayer(); + AudioRecorder recorder = AudioRecorder(); + + bool isRecording = false; + bool isPlaying = false; + bool isPaused = false; + String filePath = ''; + String? selectedFilePath; + double currentPosition = 0; + double totalDuration = 0; + + Future playSoundFromAssets(String sound) async { + try { + await audioPlayer.setAsset(sound); + audioPlayer.play(); + } catch (e) { + Log.print("Error playing sound: $e"); + } + } + + // Start recording + Future startRecording({String? rideId}) async { + final bool isPermissionGranted = await recorder.hasPermission(); + if (!isPermissionGranted) { + // RecordingPermissionException('l'); + return; + } + + final directory = await getApplicationDocumentsDirectory(); + final String dateStr = + '${DateTime.now().year}-${DateTime.now().month.toString().padLeft(2, '0')}-${DateTime.now().day.toString().padLeft(2, '0')}'; + // Generate a unique file name using the current timestamp + String fileName = (rideId != null && rideId.isNotEmpty && rideId != 'yet' && rideId != 'null') + ? '${dateStr}_$rideId.m4a' + : '$dateStr.m4a'; + filePath = '${directory.path}/$fileName'; + + // Define the configuration for the recording + const config = RecordConfig( + // Specify the format, encoder, sample rate, etc., as needed + encoder: AudioEncoder.aacLc, // For example, using AAC codec + sampleRate: 44100, // Sample rate + bitRate: 128000, // Bit rate + ); + + // Start recording to file with the specified configuration + await recorder.start(config, path: filePath); + + isRecording = true; + update(); + } + + // Pause recording + Future pauseRecording() async { + if (isRecording && !isPaused) { + await recorder.pause(); + isPaused = true; + update(); + } + } + + // Resume recording + Future resumeRecording() async { + if (isRecording && isPaused) { + await recorder.resume(); + isPaused = false; + update(); + } + } + + // Stop recording + Future stopRecording() async { + recorder.stop(); + isRecording = false; + isPaused = false; + update(); + } + + // Play the selected recorded file + Future playRecordedFile(String filePath) async { + await audioPlayer.setFilePath(filePath); + totalDuration = audioPlayer.duration?.inSeconds.toDouble() ?? 0; + audioPlayer.play(); + + isPlaying = true; + isPaused = false; + audioPlayer.positionStream.listen((position) { + currentPosition = position.inSeconds.toDouble(); + update(); + }); + selectedFilePath = filePath; + update(); + } + + // Pause playback + Future pausePlayback() async { + if (isPlaying && !isPaused) { + await audioPlayer.pause(); + isPaused = true; + update(); + } + } + + // Resume playback + Future resumePlayback() async { + if (isPlaying && isPaused) { + await audioPlayer.play(); + isPaused = false; + update(); + } + } + + // Stop playback + Future stopPlayback() async { + await audioPlayer.stop(); + isPlaying = false; + isPaused = false; + currentPosition = 0; + update(); + } + + // Get a list of recorded files + Future> getRecordedFiles() async { + final directory = await getApplicationDocumentsDirectory(); + final files = await directory.list().toList(); + return files + .map((file) => file.path) + .where((path) => path.endsWith('.m4a')) + .toList(); + } + + // Delete a specific recorded file + Future deleteRecordedFile(String filePath) async { + final file = File(filePath); + if (await file.exists()) { + await file.delete(); + update(); + } + } + + // Delete all recorded files + Future deleteAllRecordedFiles() async { + final directory = await getApplicationDocumentsDirectory(); + final files = await directory.list().toList(); + for (final file in files) { + if (file.path.endsWith('.m4a')) { + await deleteRecordedFile(file.path); + } + } + } + + @override + void onClose() { + audioPlayer.dispose(); + recorder.dispose(); + super.onClose(); + } +} \ No newline at end of file diff --git a/siro_rider/lib/controller/functions/call_controller.dart b/siro_rider/lib/controller/functions/call_controller.dart new file mode 100644 index 0000000..384569a --- /dev/null +++ b/siro_rider/lib/controller/functions/call_controller.dart @@ -0,0 +1,134 @@ +// import 'package:SEFER/constant/api_key.dart'; +// import 'package:SEFER/controller/functions/crud.dart'; +// import 'package:SEFER/controller/home/map_passenger_controller.dart'; +// import 'package:agora_rtc_engine/agora_rtc_engine.dart'; +// import 'package:get/get.dart'; +// import 'package:permission_handler/permission_handler.dart'; + +// import '../../constant/box_name.dart'; +// import '../firebase/firbase_messge.dart'; +// import '../../main.dart'; + +// class CallController extends GetxController { +// String channelName = ''; // Get.find().rideId; +// String token = ''; +// // int uid = int.parse(box.read(BoxName.phoneDriver)); // uid of the local user +// int uid = 0; +// int? remoteUid; // uid of the remote user +// bool _isJoined = false; // Indicates if the local user has joined the channel +// String status = ''; +// late RtcEngine agoraEngine; // Agora engine instance + +// @override +// void onInit() { +// super.onInit(); +// // if (box.read(BoxName.passengerID) != null) { +// channelName = Get.find().rideId; // 'sefer300'; // +// remoteUid = int.parse(Get.find().driverPhone); +// uid = int.parse(box.read(BoxName.phone)); +// // } else { +// // channelName = Get.find().rideId; // 'sefer300'; // +// // remoteUid = int.parse(Get.find().passengerPhone); +// // uid = int.parse(box.read(BoxName.phoneDriver)); +// // } + +// initAgoraFull(); +// } + +// initAgoraFull() async { +// await fetchToken(); +// // Set up an instance of Agora engine +// setupVoiceSDKEngine(); +// // join(); +// FirebaseMessagesController().sendNotificationToPassengerToken( +// 'Call Income from Passenger', +// '${'You have call from Passenger'.tr} ${box.read(BoxName.name)}', +// Get.find().driverToken, +// [ +// token, +// channelName, +// uid.toString(), +// remoteUid.toString(), +// ], +// 'iphone_ringtone.wav', +// ); +// join(); +// } + +// @override +// void onClose() { +// agoraEngine.leaveChannel(); +// super.onClose(); +// } + +// Future setupVoiceSDKEngine() async { +// // retrieve or request microphone permission +// await [Permission.microphone].request(); + +// //create an instance of the Agora engine +// agoraEngine = createAgoraRtcEngine(); +// await agoraEngine.initialize(RtcEngineContext(appId: AK.agoraAppId)); +// // Register the event handler +// agoraEngine.registerEventHandler( +// RtcEngineEventHandler( +// onJoinChannelSuccess: (RtcConnection connection, int elapsed) { +// // Get.snackbar( +// // "Local user uid:${connection.localUid} joined the channel", ''); +// status = 'joined'.tr; +// _isJoined = true; +// update(); +// }, +// onUserJoined: (RtcConnection connection, int remoteUid, int elapsed) { +// // Get.snackbar("Remote user uid:$remoteUid joined the channel", ''); +// status = Get.find().driverName.toString(); +// ' joined'.tr; +// remoteUid = remoteUid; +// update(); +// }, +// onUserOffline: (RtcConnection connection, int? remoteUid, +// UserOfflineReasonType reason) { +// // Get.snackbar("Remote user uid:$remoteUid left the channel", ''); +// status = 'Call left'.tr; +// remoteUid = null; +// update(); +// }, +// ), +// ); +// } + +// void join() async { +// // Set channel options including the client role and channel profile +// ChannelMediaOptions options = const ChannelMediaOptions( +// clientRoleType: ClientRoleType.clientRoleBroadcaster, +// channelProfile: ChannelProfileType.channelProfileCommunication, +// ); + +// await agoraEngine.joinChannel( +// token: token, +// channelId: channelName, +// options: options, +// uid: uid, +// ); +// } + +// void leave() { +// _isJoined = false; +// remoteUid = null; +// update(); +// agoraEngine.leaveChannel(); +// } + +// // Clean up the resources when you leave +// @override +// void dispose() async { +// await agoraEngine.leaveChannel(); +// super.dispose(); +// } + +// fetchToken() async { +// var res = await CRUD() +// .getAgoraToken(channelName: channelName, uid: uid.toString()); +// token = res; +// update(); +// } +// } diff --git a/siro_rider/lib/controller/functions/crud.dart b/siro_rider/lib/controller/functions/crud.dart new file mode 100644 index 0000000..265c761 --- /dev/null +++ b/siro_rider/lib/controller/functions/crud.dart @@ -0,0 +1,720 @@ +import 'dart:async'; +import 'dart:convert'; +import 'package:siro_rider/constant/box_name.dart'; +import 'package:siro_rider/constant/links.dart'; +import 'package:siro_rider/controller/auth/login_controller.dart'; +import 'package:siro_rider/main.dart'; +import 'package:get/get.dart'; +import 'package:http/http.dart' as http; +import 'package:siro_rider/env/env.dart'; + +import '../../constant/api_key.dart'; + +import '../../print.dart'; +import '../../views/widgets/elevated_btn.dart'; +import '../../views/widgets/error_snakbar.dart'; +import 'encrypt_decrypt.dart'; +import 'upload_image.dart'; +import 'dart:io'; + +import 'network/net_guard.dart'; + +class CRUD { + final NetGuard _netGuard = NetGuard(); + final _client = http.Client(); + + /// Stores the signature of the last logged error to prevent duplicates. + static String _lastErrorSignature = ''; + + /// Stores the timestamp of the last logged error. + static DateTime _lastErrorTimestamp = DateTime(2000); + + /// The minimum time that must pass before logging the same error again. + static const Duration _errorLogDebounceDuration = Duration(minutes: 1); + + /// Asynchronously logs an error to the server with debouncing to prevent log flooding. + static Future addError( + String error, String details, String where) async { + try { + final currentErrorSignature = '$where-$error'; + final now = DateTime.now(); + + if (currentErrorSignature == _lastErrorSignature && + now.difference(_lastErrorTimestamp) < _errorLogDebounceDuration) { + return; + } + + _lastErrorSignature = currentErrorSignature; + _lastErrorTimestamp = now; + + final userId = + box.read(BoxName.driverID) ?? box.read(BoxName.passengerID); + final userType = + box.read(BoxName.driverID) != null ? 'Driver' : 'Passenger'; + final phone = box.read(BoxName.phone) ?? box.read(BoxName.phoneDriver); + + // طباعة الخطأ في الكونسول للمطور للمتابعة الفورية + Log.print( + "🚨 [ADD_ERROR] Where: $where | Error: $error | Details: $details"); + + // Fire-and-forget call to prevent infinite loops if the logger itself fails. + CRUD().post( + link: AppLink.addError, + payload: { + 'error': error.toString(), + 'userId': userId.toString(), + 'userType': userType, + 'phone': phone.toString(), + 'device': where, + 'details': details, + }, + ); + } catch (e) { + Log.print("Error occurred: $e"); + } + } + + // ───────────────────────────────────────────────────────────── + // دالة مساعدة خاصة: يجيب البصمة المشفرة من GetStorage + // هي نفس القيمة المرسلة في login وعُملها hash في JWT payload + // السيرفر يعمل: sha256(X-Device-FP + FP_PEPPER) == JWT.fingerPrint + // ───────────────────────────────────────────────────────────── + String _getFpHeader() { + return box.read(BoxName.deviceFpEncrypted)?.toString() ?? ''; + } + + /// Centralized private method to handle all API requests. + /// Includes retry logic, network checking, and standardized error handling. + Future _makeRequest({ + required String link, + Map? payload, + required Map headers, + }) async { + const connectTimeout = Duration(seconds: 6); + const receiveTimeout = Duration(seconds: 10); + + Future doPost() { + final url = Uri.parse(link); + return _client + .post(url, body: payload, headers: headers) + .timeout(connectTimeout + receiveTimeout); + } + + http.Response response; + try { + // retry ذكي: محاولة واحدة إضافية فقط لأخطاء شبكة/5xx + try { + response = await doPost(); + } on SocketException catch (_) { + response = await doPost(); + } on TimeoutException catch (_) { + response = await doPost(); + } + + final sc = response.statusCode; + final body = response.body; + Log.print('request: ${response.request}'); + Log.print('body: $body'); + // Log.print('link: $link'); + Log.print('headers: $headers'); + Log.print('payload: $payload'); + + // 2xx + if (sc >= 200 && sc < 300) { + try { + final jsonData = jsonDecode(body); + return jsonData; + } catch (e, st) { + addError('JSON Decode Error', 'Body: $body\n$st', + 'CRUD._makeRequest $link'); + return 'failure'; + } + } + + // 401 → تجديد التوكن تلقائياً + if (sc == 401) { + await Get.put(LoginController()).getJWT(); + return 'token_expired'; + } + + // 5xx + if (sc >= 500) { + addError( + 'Server 5xx', 'SC: $sc\nBody: $body', 'CRUD._makeRequest $link'); + return 'failure'; + } + + // 4xx أخرى + return 'failure'; + } on SocketException { + _netGuard.notifyOnce((title, msg) => mySnackeBarError(msg)); + return 'no_internet'; + } on TimeoutException { + return 'failure'; + } catch (e, st) { + addError('HTTP Request Exception: $e', 'Stack: $st', + 'CRUD._makeRequest $link'); + return 'failure'; + } + } + + // ═══════════════════════════════════════════════════════════════ + // post — طلب POST عادي للراكب/السائق + // ─────────────────────────────────────────────────────────────── + // التغيير: إضافة X-Device-FP header + // القيمة: fp_encrypted من GetStorage + // السيرفر يتحقق: sha256(fp_encrypted + FP_PEPPER) == JWT.fingerPrint + // ═══════════════════════════════════════════════════════════════ + Future post({ + required String link, + Map? payload, + }) async { + String token = r(box.read(BoxName.jwt)).toString().split(Env.addd)[0]; + + final headers = { + 'Content-Type': 'application/x-www-form-urlencoded', + 'Authorization': 'Bearer $token', + 'X-Device-FP': _getFpHeader(), // ← إثبات الجهاز + }; + + return await _makeRequest( + link: link, + payload: payload, + headers: headers, + ); + } + + // ═══════════════════════════════════════════════════════════════ + // get — طلب GET للراكب/السائق (يستخدم POST method) + // ─────────────────────────────────────────────────────────────── + // التغيير: إضافة X-Device-FP header + // ═══════════════════════════════════════════════════════════════ + Future get({ + required String link, + Map? payload, + }) async { + var url = Uri.parse(link); + var response = await http.post( + url, + body: payload, + headers: { + 'Content-Type': 'application/x-www-form-urlencoded', + 'Authorization': + 'Bearer ${r(box.read(BoxName.jwt)).toString().split(Env.addd)[0]}', + 'X-Device-FP': _getFpHeader(), // ← إثبات الجهاز + }, + ); + + Log.print('request: ${response.request}'); + Log.print('body: ${response.body}'); + Log.print('payload: $payload'); + + if (response.statusCode == 200) { + return response.body; + } else if (response.statusCode == 401) { + var jsonData = jsonDecode(response.body); + if (jsonData['error'] == 'Token expired') { + print("CRUD.get: Token expired, refreshing and retrying once..."); + await Get.put(LoginController()).getJWT(); + + // إعادة المحاولة مرة واحدة فقط بتوكن جديد + var retryResponse = await http.post( + url, + body: payload, + headers: { + 'Content-Type': 'application/x-www-form-urlencoded', + 'Authorization': + 'Bearer ${r(box.read(BoxName.jwt)).toString().split(Env.addd)[0]}', + 'X-Device-FP': _getFpHeader(), + }, + ); + + if (retryResponse.statusCode == 200) { + return retryResponse.body; + } + return jsonEncode( + {'status': 'failure', 'message': 'token_expired_retry_failed'}); + } else { + return jsonEncode({'status': 'failure', 'message': '401_unauthorized'}); + } + } else { + addError('Non-200 response code: ${response.statusCode}', + 'crud().get - Other', url.toString()); + return jsonEncode({ + 'status': 'failure', + 'message': 'server_error_${response.statusCode}' + }); + } + } + + // ═══════════════════════════════════════════════════════════════ + // postWallet — طلب POST لسيرفر المدفوعات + // ─────────────────────────────────────────────────────────────── + // التغيير: إضافة X-Device-FP header + // 3 headers معاً: JWT + HMAC + FP + // ═══════════════════════════════════════════════════════════════ + Future postWallet({ + required String link, + Map? payload, + }) async { + var jwt = await LoginController().getJwtWallet(); + final hmac = box.read(BoxName.hmac); + + final headers = { + 'Content-Type': 'application/x-www-form-urlencoded', + 'Authorization': 'Bearer $jwt', + 'X-HMAC-Auth': hmac.toString(), + 'X-Device-FP': _getFpHeader(), // ← إثبات الجهاز + }; + // add print debug + Log.print('headers: $headers'); + Log.print('payload: $payload'); + Log.print('link: $link'); + + return await _makeRequest( + link: link, + payload: payload, + headers: headers, + ); + } + + // ═══════════════════════════════════════════════════════════════ + // getWallet — طلب GET لسيرفر المدفوعات (يستخدم POST method) + // ─────────────────────────────────────────────────────────────── + // التغيير: إضافة X-Device-FP header + // ═══════════════════════════════════════════════════════════════ + Future getWallet({ + required String link, + Map? payload, + }) async { + var s = await LoginController().getJwtWallet(); + final hmac = box.read(BoxName.hmac); + var url = Uri.parse(link); + + var response = await http.post( + url, + body: payload, + headers: { + 'Content-Type': 'application/x-www-form-urlencoded', + 'Authorization': 'Bearer $s', + 'X-HMAC-Auth': hmac.toString(), + 'X-Device-FP': _getFpHeader(), // ← إثبات الجهاز + }, + ); + + if (response.statusCode == 200) { + var jsonData = jsonDecode(response.body); + if (jsonData['status'] == 'success') { + return response.body; + } + return jsonData['status']; + } else if (response.statusCode == 401) { + var jsonData = jsonDecode(response.body); + if (jsonData['error'] == 'Token expired') { + await Get.put(LoginController()).getJwtWallet(); + return 'token_expired'; + } else { + addError('Unauthorized: ${jsonData['error']}', 'crud().getWallet - 401', + url.toString()); + return 'failure'; + } + } else { + addError('Non-200 response code: ${response.statusCode}', + 'crud().getWallet - Other', url.toString()); + return 'failure'; + } + } + + // ======================================================================= + // All other specialized methods remain below unchanged. + // They interact with external third-party APIs and have unique + // authentication or body structures that don't need the FP header. + // ======================================================================= + + Future postWalletMtn( + {required String link, Map? payload}) async { + final s = await LoginController().getJwtWallet(); + final hmac = box.read(BoxName.hmac); + final url = Uri.parse(link); + + try { + final response = await http.post( + url, + body: payload, + headers: { + 'Content-Type': 'application/x-www-form-urlencoded', + 'Authorization': 'Bearer $s', + 'X-HMAC-Auth': hmac.toString(), + 'X-Device-FP': _getFpHeader(), // ← إثبات الجهاز + }, + ); + + Map wrap(String status, {Object? message, int? code}) { + return { + 'status': status, + 'message': message, + 'code': code ?? response.statusCode, + }; + } + + if (response.statusCode == 200) { + try { + return jsonDecode(response.body); + } catch (e) { + return wrap('failure', + message: 'JSON decode error', code: response.statusCode); + } + } else if (response.statusCode == 401) { + try { + final jsonData = jsonDecode(response.body); + if (jsonData is Map && jsonData['error'] == 'Token expired') { + await Get.put(LoginController()).getJWT(); + return { + 'status': 'failure', + 'message': 'token_expired', + 'code': 401 + }; + } + return wrap('failure', message: jsonData); + } catch (_) { + return wrap('failure', message: response.body); + } + } else { + try { + final jsonData = jsonDecode(response.body); + return wrap('failure', message: jsonData); + } catch (_) { + return wrap('failure', message: response.body); + } + } + } catch (e) { + return { + 'status': 'failure', + 'message': 'HTTP request error: $e', + 'code': -1 + }; + } + } + + Future sendWhatsAppAuth(String to, String token) async { + var res = await CRUD() + .get(link: AppLink.getApiKey, payload: {'keyName': 'whatsapp_key'}); + var accesstoken = jsonDecode(res)['message']['whatsapp_key']; + var headers = { + 'Authorization': 'Bearer $accesstoken', + 'Content-Type': 'application/json' + }; + + var url = 'https://graph.facebook.com/v20.0/${Env.whatappID}/messages'; + var request = http.Request('POST', Uri.parse(url)); + + var body = json.encode({ + "messaging_product": "whatsapp", + "to": to, + "type": "template", + "template": { + "name": "sefer1", + "language": {"code": "en"}, + "components": [ + { + "type": "body", + "parameters": [ + {"type": "text", "text": token} + ] + } + ] + } + }); + + request.body = body; + request.headers.addAll(headers); + + try { + http.StreamedResponse response = await request.send(); + if (response.statusCode == 200) { + String responseBody = await response.stream.bytesToString(); + Get.defaultDialog( + title: 'You will receive a code in WhatsApp Messenger'.tr, + middleText: 'wait 1 minute to recive message'.tr, + confirm: MyElevatedButton( + title: 'OK'.tr, + onPressed: () => Get.back(), + ), + ); + } else { + String errorBody = await response.stream.bytesToString(); + } + } catch (e) { + Log.print("Error occurred: $e"); + } + } + + Future getAgoraToken({ + required String channelName, + required String uid, + }) async { + var uid = box.read(BoxName.phone) ?? box.read(BoxName.phoneDriver); + var res = await http.get( + Uri.parse( + 'https://orca-app-b2i85.ondigitalocean.app/token?channelName=$channelName'), + headers: {'Authorization': 'Bearer ${AK.agoraAppCertificate}'}, + ); + + if (res.statusCode == 200) { + var response = jsonDecode(res.body); + return response['token']; + } + } + + Future getLlama({ + required String link, + required String payload, + required String prompt, + }) async { + var url = Uri.parse(link); + var headers = { + 'Content-Type': 'application/json', + 'Authorization': + 'Bearer LL-X5lJ0Px9CzKK0HTuVZ3u2u4v3tGWkImLTG7okGRk4t25zrsLqJ0qNoUzZ2x4ciPy' + }; + var data = json.encode({ + "model": "Llama-3-70b-Inst-FW", + "messages": [ + { + "role": "user", + "content": + "Extract the desired information from the following passage as json decoded like $prompt just in this:\n\n$payload" + } + ], + "temperature": 0.9 + }); + var response = await http.post(url, body: data, headers: headers); + if (response.statusCode == 200) return response.body; + return response.statusCode; + } + + Future allMethodForAI(String prompt, linkPHP, imagePath) async { + await ImageController().choosImage(linkPHP, imagePath); + Future.delayed(const Duration(seconds: 2)); + String extracted = + await arabicTextExtractByVisionAndAI(imagePath: imagePath); + } + + Future arabicTextExtractByVisionAndAI({ + required String imagePath, + }) async { + var headers = { + 'Content-Type': 'application/json', + 'Ocp-Apim-Subscription-Key': '21010e54b50f41a4904708c526e102df' + }; + var url = Uri.parse( + 'https://ocrhamza.cognitiveservices.azure.com/vision/v2.1/ocr?language=ar'); + String imagePathFull = + '${AppLink.server}card_image/$imagePath-${box.read(BoxName.driverID) ?? box.read(BoxName.passengerID)}.jpg'; + + var requestBody = {"url": imagePathFull}; + var response = + await http.post(url, body: jsonEncode(requestBody), headers: headers); + + if (response.statusCode == 200) { + var responseBody = jsonDecode(response.body); + return responseBody.toString(); + } + return response.statusCode; + } + + Future getChatGPT({ + required String link, + required String payload, + }) async { + var url = Uri.parse(link); + var headers = { + 'Content-Type': 'application/json', + 'Authorization': 'Bearer ${Env.chatGPTkeySeferNew}' + }; + var data = json.encode({ + "model": "gpt-3.5-turbo", + "messages": [ + { + "role": "user", + "content": + "Extract the desired information from the following passage as json decoded like vin,make,made,year,expiration_date,color,owner,registration_date just in this:\n\n$payload" + } + ], + "temperature": 0.9 + }); + var response = await http.post(url, body: data, headers: headers); + if (response.statusCode == 200) return response.body; + return response.statusCode; + } + + + Future postPayMob({ + required String link, + Map? payload, + }) async { + var url = Uri.parse(link); + var response = await http.post(url, + body: payload, headers: {'Content-Type': 'application/json'}); + + var jsonData = jsonDecode(response.body); + if (response.statusCode == 200) { + if (jsonData['status'] == 'success') return response.body; + return jsonData['status']; + } else { + return response.statusCode; + } + } + + sendEmail(String link, Map? payload) async { + var headers = { + 'Content-Type': 'application/x-www-form-urlencoded', + 'Authorization': + 'Basic ${base64Encode(utf8.encode(AK.basicAuthCredentials))}', + }; + var request = http.Request('POST', Uri.parse(link)); + request.bodyFields = payload!; + request.headers.addAll(headers); + await request.send(); + } + + Future postFromDialogue({ + required String link, + Map? payload, + }) async { + var url = Uri.parse(link); + var response = await http.post( + url, + body: payload, + headers: { + 'Content-Type': 'application/x-www-form-urlencoded', + 'Authorization': + 'Basic ${base64Encode(utf8.encode(AK.basicAuthCredentials))}', + }, + ); + + if (response.body.isNotEmpty) { + var jsonData = jsonDecode(response.body); + if (response.statusCode == 200) { + if (jsonData['status'] == 'success') { + Get.back(); + return response.body; + } + } + return jsonData['status']; + } + } + + Future sendVerificationRequest(String phoneNumber) async { + final accountSid = AK.accountSIDTwillo; + final authToken = AK.authTokenTwillo; + final verifySid = AK.twilloRecoveryCode; + + final Uri verificationUri = Uri.parse( + 'https://verify.twilio.com/v2/Services/$verifySid/Verifications'); + + await http.post( + verificationUri, + headers: { + 'Authorization': + 'Basic ' + base64Encode(utf8.encode('$accountSid:$authToken')), + 'Content-Type': 'application/x-www-form-urlencoded', + }, + body: {'To': phoneNumber, 'Channel': 'sms'}, + ); + + final otpCode = "123456"; + + final checkUri = Uri.parse( + 'https://verify.twilio.com/v2/Services/$verifySid/VerificationCheck'); + + final checkResponse = await http.post( + checkUri, + headers: { + 'Authorization': + 'Basic ' + base64Encode(utf8.encode('$accountSid:$authToken')), + 'Content-Type': 'application/x-www-form-urlencoded', + }, + body: {'To': phoneNumber, 'Code': otpCode}, + ); + } + + Future getGoogleApi({ + required String link, + Map? payload, + }) async { + var url = Uri.parse(link); + var response = await http.post(url, body: payload); + var jsonData = jsonDecode(response.body); + if (jsonData['status'] == 'OK') return jsonData; + return jsonData['status']; + } + + Future getHereMap({required String link}) async { + var url = Uri.parse(link); + try { + var response = await http.get(url); + if (response.statusCode == 200) { + var decodedBody = utf8.decode(response.bodyBytes); + return jsonDecode(decodedBody); + } + return null; + } catch (e) { + return null; + } + } + + Future getMapSaas({ + required String link, + }) async { + var url = Uri.parse(link); + try { + var response = await http.get( + url, + headers: { + 'Content-Type': 'application/json', + 'x-api-key': Env.mapSaasKey, + }, + ); + Log.print('link -MapSaas: $link'); + Log.print('response -MapSaas: ${response.body}'); + if (response.statusCode == 200) { + return jsonDecode(response.body); + } + Log.print('MapSaas Error: ${response.statusCode} - ${response.body}'); + return null; + } catch (e) { + Log.print('MapSaas Exception: $e'); + return null; + } + } + + Future postMapSaas({ + required String link, + required Map payload, + }) async { + var url = Uri.parse(link); + try { + var response = await http.post( + url, + body: jsonEncode(payload), + headers: { + 'Content-Type': 'application/json', + 'x-api-key': Env.mapSaasKey, + }, + ); + Log.print('post -MapSaas link: $link'); + Log.print('post -MapSaas payload: $payload'); + Log.print('post -MapSaas response: ${response.body}'); + if (response.statusCode == 200 || response.statusCode == 201) { + return jsonDecode(response.body); + } + Log.print( + 'MapSaas Post Error: ${response.statusCode} - ${response.body}'); + return null; + } catch (e) { + Log.print('MapSaas Post Exception: $e'); + return null; + } + } +} diff --git a/siro_rider/lib/controller/functions/custom_pant.dart b/siro_rider/lib/controller/functions/custom_pant.dart new file mode 100644 index 0000000..8b85ce4 --- /dev/null +++ b/siro_rider/lib/controller/functions/custom_pant.dart @@ -0,0 +1,26 @@ +import 'package:flutter/material.dart'; + +class LineChartPainter extends CustomPainter { + final List data; + + LineChartPainter(this.data); + + @override + void paint(Canvas canvas, Size size) { + // Calculate the scale factor. + final scaleFactor = size.height / 240; + + // Draw the line chart. + for (var i = 0; i < data.length - 1; i++) { + final x1 = i * size.width / data.length; + final y1 = data[i] * scaleFactor; + final x2 = (i + 1) * size.width / data.length; + final y2 = data[i + 1] * scaleFactor; + + canvas.drawLine(Offset(x1, y1), Offset(x2, y2), Paint()); + } + } + + @override + bool shouldRepaint(LineChartPainter oldDelegate) => false; +} diff --git a/siro_rider/lib/controller/functions/device_info.dart b/siro_rider/lib/controller/functions/device_info.dart new file mode 100644 index 0000000..e624ecd --- /dev/null +++ b/siro_rider/lib/controller/functions/device_info.dart @@ -0,0 +1,92 @@ +import 'dart:io'; + +import 'package:device_info_plus/device_info_plus.dart'; + +import '../../print.dart'; + +class DeviceInfoPlus { + static List> deviceDataList = []; + + static Future>> getDeviceInfo() async { + final DeviceInfoPlugin deviceInfoPlugin = DeviceInfoPlugin(); + + try { + if (Platform.isAndroid) { + AndroidDeviceInfo androidInfo = await deviceInfoPlugin.androidInfo; + Map deviceData = { + 'platform': 'Android', + 'brand': androidInfo.brand, + 'model': androidInfo.model, + 'androidId': androidInfo.device, + 'versionRelease': androidInfo.version.release, + 'sdkVersion': androidInfo.version.sdkInt, + 'manufacturer': androidInfo.manufacturer, + 'isPhysicalDevice': androidInfo.isPhysicalDevice, + 'serialNumber': androidInfo.fingerprint, + 'fingerprint': androidInfo.fingerprint, + 'type': androidInfo.type, + 'data': androidInfo.data, + 'version': androidInfo.version, + 'tags': androidInfo.tags, + 'display': androidInfo.display, + }; + // Log.print('deviceData: ${deviceData}'); + deviceDataList.add(deviceData); + } else if (Platform.isIOS) { + IosDeviceInfo iosInfo = await deviceInfoPlugin.iosInfo; + Map deviceData = { + 'brand': 'Apple', + 'model': iosInfo.model, + 'systemName': iosInfo.systemName, + 'systemVersion': iosInfo.systemVersion, + 'utsname': iosInfo.utsname, + 'isPhysicalDevice': iosInfo.isPhysicalDevice, + 'identifierForVendor': iosInfo.identifierForVendor, + 'name': iosInfo.name, + 'localizedModel': iosInfo.localizedModel, + }; + deviceDataList.add(deviceData); + } else if (Platform.isMacOS) { + MacOsDeviceInfo macInfo = await deviceInfoPlugin.macOsInfo; + Map deviceData = { + 'platform': 'macOS', + 'model': macInfo.model, + 'version': macInfo.systemGUID, + }; + deviceDataList.add(deviceData); + } else if (Platform.isWindows) { + WindowsDeviceInfo windowsInfo = await deviceInfoPlugin.windowsInfo; + Map deviceData = { + 'platform': 'Windows', + 'manufacturer': windowsInfo.computerName, + 'version': windowsInfo.majorVersion, + 'deviceId': windowsInfo.deviceId, + 'userName': windowsInfo.userName, + 'productName': windowsInfo.productName, + 'installDate': windowsInfo.installDate, + 'productId': windowsInfo.productId, + 'numberOfCores': windowsInfo.numberOfCores, + 'systemMemoryInMegabytes': windowsInfo.systemMemoryInMegabytes, + }; + deviceDataList.add(deviceData); + } else if (Platform.isLinux) { + LinuxDeviceInfo linuxInfo = await deviceInfoPlugin.linuxInfo; + Map deviceData = { + 'platform': 'Linux', + 'manufacturer': linuxInfo.name, + 'version': linuxInfo.version, + }; + deviceDataList.add(deviceData); + } + } catch (e) { Log.print("Error occurred: $e"); } + + return deviceDataList; + } + + // Method to print all device data + static void printDeviceInfo() { + for (Map deviceData in deviceDataList) { + 'Version: ${deviceData['version'] ?? deviceData['versionRelease'] ?? 'N/A'}'; + } + } +} diff --git a/siro_rider/lib/controller/functions/digit_obsecur_formate.dart b/siro_rider/lib/controller/functions/digit_obsecur_formate.dart new file mode 100644 index 0000000..10e1683 --- /dev/null +++ b/siro_rider/lib/controller/functions/digit_obsecur_formate.dart @@ -0,0 +1,42 @@ +// import 'package:flutter/services.dart'; + +// class DigitObscuringFormatter extends TextInputFormatter { +// @override +// TextEditingValue formatEditUpdate( +// TextEditingValue oldValue, TextEditingValue newValue) { +// final maskedText = maskDigits(newValue.text); +// return newValue.copyWith( +// text: maskedText, +// selection: updateCursorPosition(maskedText, newValue.selection)); +// } + +// String maskDigits(String text) { +// final totalDigits = text.length; +// final visibleDigits = 4; +// final hiddenDigits = totalDigits - visibleDigits * 2; + +// final firstVisibleDigits = text.substring(0, visibleDigits); +// final lastVisibleDigits = text.substring(totalDigits - visibleDigits); + +// final maskedDigits = List.filled(hiddenDigits, '*').join(); + +// return '$firstVisibleDigits$maskedDigits$lastVisibleDigits'; +// } + +// TextSelection updateCursorPosition( +// String maskedText, TextSelection currentSelection) { +// final cursorPosition = currentSelection.baseOffset; +// final cursorOffset = +// currentSelection.extentOffset - currentSelection.baseOffset; +// final totalDigits = maskedText.length; +// const visibleDigits = 4; +// final hiddenDigits = totalDigits - visibleDigits * 2; + +// final updatedPosition = cursorPosition <= visibleDigits +// ? cursorPosition +// : hiddenDigits + visibleDigits + (cursorPosition - visibleDigits); + +// return TextSelection.collapsed( +// offset: updatedPosition, affinity: currentSelection.affinity); +// } +// } diff --git a/siro_rider/lib/controller/functions/encrypt_decrypt.dart b/siro_rider/lib/controller/functions/encrypt_decrypt.dart new file mode 100644 index 0000000..b5e4786 --- /dev/null +++ b/siro_rider/lib/controller/functions/encrypt_decrypt.dart @@ -0,0 +1,75 @@ +import 'package:siro_rider/env/env.dart'; +import 'package:encrypt/encrypt.dart' as encrypt; +import 'package:flutter/foundation.dart'; +import 'package:secure_string_operations/secure_string_operations.dart'; + +import '../../constant/char_map.dart'; + +class EncryptionHelper { + static EncryptionHelper? _instance; + + late final encrypt.Key key; + late final encrypt.IV iv; + + EncryptionHelper._(this.key, this.iv); + static EncryptionHelper get instance { + if (_instance == null) { + throw Exception( + "EncryptionHelper is not initialized. Call `await EncryptionHelper.initialize()` in main."); + } + return _instance!; + } + + /// Initializes and stores the instance globally + static Future initialize() async { + if (_instance != null) { + debugPrint("EncryptionHelper is already initialized."); + return; // Prevent re-initialization + } + debugPrint("Initializing EncryptionHelper..."); + var keyOfApp = r(Env.keyOfApp).toString().split(Env.addd)[0]; + var initializationVector = + r(Env.initializationVector).toString().split(Env.addd)[0]; + + // Set the global instance + _instance = EncryptionHelper._( + encrypt.Key.fromUtf8(keyOfApp!), + encrypt.IV.fromUtf8(initializationVector!), + ); + debugPrint("EncryptionHelper initialized successfully."); + } + + /// Encrypts a string + String encryptData(String plainText) { + try { + final encrypter = + encrypt.Encrypter(encrypt.AES(key, mode: encrypt.AESMode.cbc)); + final encrypted = encrypter.encrypt(plainText, iv: iv); + return encrypted.base64; + } catch (e) { + debugPrint('Encryption Error: $e'); + return ''; + } + } + + /// Decrypts a string + String decryptData(String encryptedText) { + try { + final encrypter = + encrypt.Encrypter(encrypt.AES(key, mode: encrypt.AESMode.cbc)); + final encrypted = encrypt.Encrypted.fromBase64(encryptedText); + return encrypter.decrypt(encrypted, iv: iv); + } catch (e) { + debugPrint('Decryption Error: $e'); + return ''; + } + } +} + +r(String string) { + return X.r(X.r(X.r(string, cn), cC), cs).toString(); +} + +c(String string) { + return X.c(X.c(X.c(string, cn), cC), cs).toString(); +} diff --git a/siro_rider/lib/controller/functions/geolocation.dart b/siro_rider/lib/controller/functions/geolocation.dart new file mode 100644 index 0000000..2e191bf --- /dev/null +++ b/siro_rider/lib/controller/functions/geolocation.dart @@ -0,0 +1,34 @@ +import 'package:geolocator/geolocator.dart'; + +class GeoLocation { + Future getCurrentLocation() async { + bool serviceEnabled; + LocationPermission permission; + + // Check if location services are enabled. + serviceEnabled = await Geolocator.isLocationServiceEnabled(); + if (!serviceEnabled) { + // Location services are not enabled, so we request the user to enable it. + return Future.error('Location services are disabled.'); + } + + permission = await Geolocator.checkPermission(); + if (permission == LocationPermission.denied) { + permission = await Geolocator.requestPermission(); + if (permission == LocationPermission.denied) { + // Permissions are denied, we cannot fetch the location. + return Future.error('Location permissions are denied'); + } + } + + if (permission == LocationPermission.deniedForever) { + // Permissions are denied forever, we cannot request permissions. + return Future.error( + 'Location permissions are permanently denied, we cannot request permissions.'); + } + + // When we reach here, permissions are granted and we can fetch the location. + return await Geolocator.getCurrentPosition( + desiredAccuracy: LocationAccuracy.high); + } +} diff --git a/siro_rider/lib/controller/functions/launch.dart b/siro_rider/lib/controller/functions/launch.dart new file mode 100644 index 0000000..156abd4 --- /dev/null +++ b/siro_rider/lib/controller/functions/launch.dart @@ -0,0 +1,108 @@ +import 'package:siro_rider/print.dart'; +import 'package:url_launcher/url_launcher.dart'; +import 'dart:io'; + +void showInBrowser(String url) async { + if (await canLaunchUrl(Uri.parse(url))) { + launchUrl(Uri.parse(url)); + } else {} +} + +Future makePhoneCall(String phoneNumber) async { + // 1. تنظيف الرقم (إزالة المسافات والفواصل) + String formattedNumber = phoneNumber.replaceAll(RegExp(r'\s+'), ''); + + // 2. منطق التنسيق (مع الحفاظ على الأرقام القصيرة مثل 112 كما هي) + if (formattedNumber.length > 6) { + if (formattedNumber.startsWith('09')) { + // إذا كان يبدأ بـ 09 (رقم موبايل سوري محلي) -> +963 + formattedNumber = '+963${formattedNumber.substring(1)}'; + } else if (!formattedNumber.startsWith('+')) { + // إذا لم يكن دولياً ولا محلياً معروفاً -> إضافة + فقط + formattedNumber = '+$formattedNumber'; + } + } + // ملاحظة: الأرقام القصيرة (مثل 112) ستتجاوز الشرط أعلاه وتبقى "112" وهو الصحيح + + // 3. التنفيذ (Launch) + final Uri launchUri = Uri( + scheme: 'tel', + path: formattedNumber, + ); + + try { + // استخدام LaunchMode.externalApplication هو الحل الجذري لمشاكل الـ Intent + // لأنه يجبر النظام على تسليم الرابط لتطبيق الهاتف بدلاً من محاولة فتحه داخل تطبيقك + if (await canLaunchUrl(launchUri)) { + await launchUrl(launchUri, mode: LaunchMode.externalApplication); + } else { + // في بعض الأجهزة canLaunchUrl تعود بـ false مع الـ tel ومع ذلك يعمل launchUrl + // لذا نجرب الإطلاق المباشر كاحتياط + await launchUrl(launchUri, mode: LaunchMode.externalApplication); + } + } catch (e) { + // طباعة الخطأ في حال الفشل التام + Log.print("Error launching call: $e"); + } +} + +void launchCommunication( + String method, String contactInfo, String message) async { + String url; + + if (Platform.isIOS) { + switch (method) { + case 'phone': + url = 'tel:$contactInfo'; + break; + case 'sms': + url = 'sms:$contactInfo?body=${Uri.encodeComponent(message)}'; + break; + case 'whatsapp': + url = + 'https://api.whatsapp.com/send?phone=$contactInfo&text=${Uri.encodeComponent(message)}'; + break; + case 'email': + url = + 'mailto:$contactInfo?subject=Subject&body=${Uri.encodeComponent(message)}'; + break; + default: + return; + } + } else if (Platform.isAndroid) { + switch (method) { + case 'phone': + url = 'tel:$contactInfo'; + break; + + case 'sms': + url = 'sms:$contactInfo?body=${Uri.encodeComponent(message)}'; + break; + case 'whatsapp': + // Check if WhatsApp is installed + final bool whatsappInstalled = + await canLaunchUrl(Uri.parse('whatsapp://')); + if (whatsappInstalled) { + url = + 'whatsapp://send?phone=$contactInfo&text=${Uri.encodeComponent(message)}'; + } else { + // Provide an alternative action, such as opening the WhatsApp Web API + url = + 'https://api.whatsapp.com/send?phone=$contactInfo&text=${Uri.encodeComponent(message)}'; + } + break; + case 'email': + url = + 'mailto:$contactInfo?subject=Subject&body=${Uri.encodeComponent(message)}'; + break; + default: + return; + } + } else { + return; + } + + if (await canLaunchUrl(Uri.parse(url))) { + await launchUrl(Uri.parse(url)); + } else {} +} \ No newline at end of file diff --git a/siro_rider/lib/controller/functions/location_controller.dart b/siro_rider/lib/controller/functions/location_controller.dart new file mode 100644 index 0000000..36fe493 --- /dev/null +++ b/siro_rider/lib/controller/functions/location_controller.dart @@ -0,0 +1,147 @@ +// import 'dart:async'; + +// import 'package:get/get.dart'; +// import 'package:location/location.dart'; +// import 'package:siro_rider/constant/box_name.dart'; +// import 'package:siro_rider/constant/links.dart'; +// import 'package:siro_rider/controller/functions/crud.dart'; +// import 'package:siro_rider/controller/home/payment/captain_wallet_controller.dart'; +// import 'package:siro_rider/main.dart'; + +// // LocationController.dart +// class LocationController extends GetxController { +// LocationData? _currentLocation; +// late Location location; +// bool isLoading = false; +// late double heading = 0; +// late double accuracy = 0; +// late double previousTime = 0; +// late double latitude; +// late double totalDistance = 0; +// late double longitude; +// late DateTime time; +// late double speed = 0; +// late double speedAccuracy = 0; +// late double headingAccuracy = 0; +// bool isActive = false; +// late LatLng myLocation; +// String totalPoints = '0'; +// LocationData? get currentLocation => _currentLocation; +// Timer? _locationTimer; + +// @override +// void onInit() async { +// super.onInit(); +// location = Location(); +// getLocation(); +// // startLocationUpdates(); + +// totalPoints = Get.put(CaptainWalletController()).totalPoints; +// } + +// Future startLocationUpdates() async { +// if (box.read(BoxName.driverID) != null) { +// _locationTimer = +// Timer.periodic(const Duration(seconds: 5), (timer) async { +// try { +// totalPoints = Get.find().totalPoints; + +// // if (isActive) { +// if (double.parse(totalPoints) > -300) { +// await getLocation(); + +// // if (box.read(BoxName.driverID) != null) { +// await CRUD() +// .post(link: AppLink.addCarsLocationByPassenger, payload: { +// 'driver_id': box.read(BoxName.driverID).toString(), +// 'latitude': myLocation.latitude.toString(), +// 'longitude': myLocation.longitude.toString(), +// 'heading': heading.toString(), +// 'speed': (speed * 3.6).toStringAsFixed(1), +// 'distance': totalDistance == 0 +// ? '0' +// : totalDistance < 1 +// ? totalDistance.toStringAsFixed(3) +// : totalDistance.toStringAsFixed(1), +// 'status': box.read(BoxName.statusDriverLocation).toString() +// }); +// } + +// // } +// } catch (e) { +// // Handle the error gracefully +// } +// }); +// } +// } + +// void stopLocationUpdates() { +// _locationTimer?.cancel(); +// } + +// Future getLocation() async { +// // isLoading = true; +// // update(); +// bool serviceEnabled; +// PermissionStatus permissionGranted; + +// // Check if location services are enabled +// serviceEnabled = await location.serviceEnabled(); +// if (!serviceEnabled) { +// serviceEnabled = await location.requestService(); +// if (!serviceEnabled) { +// // Location services are still not enabled, handle the error +// return; +// } +// } + +// // Check if the app has permission to access location +// permissionGranted = await location.hasPermission(); +// if (permissionGranted == PermissionStatus.denied) { +// permissionGranted = await location.requestPermission(); +// if (permissionGranted != PermissionStatus.granted) { +// // Location permission is still not granted, handle the error +// return; +// } +// } + +// // Configure location accuracy +// // LocationAccuracy desiredAccuracy = LocationAccuracy.high; + +// // Get the current location +// LocationData _locationData = await location.getLocation(); +// myLocation = +// (_locationData.latitude != null && _locationData.longitude != null +// ? LatLng(_locationData.latitude!, _locationData.longitude!) +// : null)!; +// speed = _locationData.speed!; +// heading = _locationData.heading!; +// // Calculate the distance between the current location and the previous location +// // if (Get.find().rideId == 'rideId') { +// // if (previousTime > 0) { +// // double distance = calculateDistanceInKmPerHour( +// // previousTime, _locationData.time, speed); +// // totalDistance += distance; +// // } + +// // previousTime = _locationData.time!; +// // } +// // Print location details +// // isLoading = false; +// update(); +// } + +// double calculateDistanceInKmPerHour( +// double? startTime, double? endTime, double speedInMetersPerSecond) { +// // Calculate the time difference in hours +// double timeDifferenceInHours = (endTime! - startTime!) / 1000 / 3600; + +// // Convert speed to kilometers per hour +// double speedInKmPerHour = speedInMetersPerSecond * 3.6; + +// // Calculate the distance in kilometers +// double distanceInKilometers = speedInKmPerHour * timeDifferenceInHours; + +// return distanceInKilometers; +// } +// } diff --git a/siro_rider/lib/controller/functions/location_permission.dart b/siro_rider/lib/controller/functions/location_permission.dart new file mode 100644 index 0000000..9bbf33c --- /dev/null +++ b/siro_rider/lib/controller/functions/location_permission.dart @@ -0,0 +1,16 @@ +import 'package:location/location.dart'; +import 'package:get/get.dart'; + +class LocationPermissions { + late Location location; + + Future locationPermissions() async { + location = Location(); + var permissionStatus = await location.requestPermission(); + if (permissionStatus == PermissionStatus.denied) { + // The user denied the location permission. + Get.defaultDialog(title: 'GPS Required Allow !.'.tr, middleText: ''); + return null; + } + } +} diff --git a/siro_rider/lib/controller/functions/log_out.dart b/siro_rider/lib/controller/functions/log_out.dart new file mode 100644 index 0000000..4d54c3b --- /dev/null +++ b/siro_rider/lib/controller/functions/log_out.dart @@ -0,0 +1,201 @@ +import 'dart:io'; + +import 'package:flutter/material.dart'; +import 'package:get/get.dart'; +import 'package:siro_rider/constant/box_name.dart'; +import 'package:siro_rider/constant/colors.dart'; +import 'package:siro_rider/constant/links.dart'; +import 'package:siro_rider/controller/functions/crud.dart'; +import 'package:siro_rider/main.dart'; +import 'package:siro_rider/onbording_page.dart'; +import 'package:siro_rider/views/widgets/elevated_btn.dart'; +import 'package:siro_rider/views/widgets/my_textField.dart'; + +import '../../constant/style.dart'; +import 'package:siro_rider/controller/home/map/map_socket_controller.dart'; +import 'package:siro_rider/controller/home/map/map_engine_controller.dart'; +import 'package:siro_rider/controller/home/map/location_search_controller.dart'; +import 'package:siro_rider/controller/home/map/nearby_drivers_controller.dart'; +import 'package:siro_rider/controller/home/map/ride_lifecycle_controller.dart'; +import 'package:siro_rider/controller/home/map/ui_interactions_controller.dart'; +import 'package:siro_rider/controller/home/menu_controller.dart'; +import 'package:siro_rider/controller/home/points_for_rider_controller.dart'; + +class LogOutController extends GetxController { + TextEditingController checkTxtController = TextEditingController(); + final formKey = GlobalKey(); + final formKey1 = GlobalKey(); + final emailTextController = TextEditingController(); + + Future deleteMyAccountDriver(String id) async { + await CRUD().post(link: AppLink.removeUser, payload: {'id': id}).then( + (value) => Get.snackbar('Deleted'.tr, 'Your Account is Deleted', + backgroundColor: AppColor.redColor)); + } + + checkBeforeDelete() async { + var res = await CRUD().post( + link: AppLink.deletecaptainAccounr, + payload: {'id': box.read(BoxName.driverID)}).then((value) => exit(0)); + } + + deletecaptainAccount() { + Get.defaultDialog( + backgroundColor: AppColor.yellowColor, + title: 'Are you sure to delete your account?'.tr, + middleText: + 'Your data will be erased after 2 weeks\nAnd you will can\'t return to use app after 1 month ', + titleStyle: AppStyle.title, + content: Column( + children: [ + Container( + width: Get.width, + decoration: AppStyle.boxDecoration, + child: Padding( + padding: const EdgeInsets.all(8.0), + child: Text( + 'Your data will be erased after 2 weeks\nAnd you will can\'t return to use app after 1 month' + .tr, + style: AppStyle.title.copyWith(color: AppColor.redColor), + ), + ), + ), + const SizedBox( + height: 20, + ), + Form( + key: formKey, + child: SizedBox( + width: Get.width, + child: MyTextForm( + controller: checkTxtController, + label: 'Enter Your First Name'.tr, + hint: 'Enter Your First Name'.tr, + type: TextInputType.name, + ), + )) + ], + ), + confirm: MyElevatedButton( + title: 'Delete'.tr, + onPressed: () { + if (checkTxtController.text == box.read(BoxName.nameDriver)) { + deletecaptainAccount(); + } + })); + } + + Future logOutPassenger() async { + Get.defaultDialog( + title: 'Are you Sure to LogOut?'.tr, + content: Row( + mainAxisAlignment: MainAxisAlignment.spaceAround, + children: [ + MyElevatedButton( + title: 'Cancel'.tr, + onPressed: () => Get.back(), + ), + ElevatedButton( + style: ButtonStyle( + backgroundColor: MaterialStateProperty.all(AppColor.redColor), + ), + onPressed: () { + // box.remove(BoxName.agreeTerms); + box.remove(BoxName.passengerPhotoUrl); + box.remove(BoxName.driverID); + box.remove(BoxName.email); + box.remove(BoxName.lang); + box.remove(BoxName.name); + box.remove(BoxName.passengerID); + box.remove(BoxName.phone); + box.remove(BoxName.tokenFCM); + box.remove(BoxName.tokens); + box.remove(BoxName.addHome); + box.remove(BoxName.addWork); + box.remove(BoxName.agreeTerms); + box.remove(BoxName.apiKeyRun); + box.remove(BoxName.countryCode); + + box.remove(BoxName.passengerWalletTotal); + box.remove(BoxName.isVerified); + Get.delete(force: true); + Get.delete(force: true); + Get.delete(force: true); + Get.delete(force: true); + Get.delete(force: true); + Get.delete(force: true); + Get.delete(force: true); + Get.delete(force: true); + Get.delete(force: true); + Get.offAll(OnBoardingPage()); + }, + child: Text( + 'Sign Out'.tr, + style: + AppStyle.title.copyWith(color: AppColor.secondaryColor), + )) + ], + )); + } + + Future logOutCaptain() async { + Get.defaultDialog( + title: 'Are you Sure to LogOut?'.tr, + titleStyle: AppStyle.title, + content: Row( + mainAxisAlignment: MainAxisAlignment.spaceAround, + children: [ + MyElevatedButton( + title: 'Cancel'.tr, + onPressed: () => Get.back(), + ), + ElevatedButton( + style: ButtonStyle( + backgroundColor: MaterialStateProperty.all(AppColor.redColor), + ), + onPressed: () { + // box.remove(BoxName.agreeTerms); + box.remove(BoxName.driverID); + box.remove(BoxName.sexDriver); + box.remove(BoxName.dobDriver); + box.remove(BoxName.nameDriver); + box.remove(BoxName.emailDriver); + box.remove(BoxName.phoneDriver); + box.remove(BoxName.statusDriverLocation); + box.remove(BoxName.cvvCodeDriver); + box.remove(BoxName.lastNameDriver); + box.remove(BoxName.passwordDriver); + box.remove(BoxName.cardNumberDriver); + box.remove(BoxName.expiryDateDriver); + box.remove(BoxName.cardHolderNameDriver); + box.remove(BoxName.vin); + box.remove(BoxName.make); + box.remove(BoxName.year); + box.remove(BoxName.owner); + box.remove(BoxName.onBoarding); + box.remove(BoxName.agreeTerms); + Get.offAll(OnBoardingPage()); + }, + child: Text( + 'Sign Out'.tr, + style: + AppStyle.title.copyWith(color: AppColor.secondaryColor), + )) + ], + )); + } + + deletePassengerAccount() async { + if (formKey1.currentState!.validate()) { + if (box.read(BoxName.email).toString() == emailTextController.text) { + await CRUD().post(link: AppLink.passengerRemovedAccountEmail, payload: { + 'email': box.read(BoxName.email), + }); + } else { + Get.snackbar('Email Wrong'.tr, 'Email you inserted is Wrong.'.tr, + snackPosition: SnackPosition.BOTTOM, + backgroundColor: AppColor.redColor); + } + } + } +} diff --git a/siro_rider/lib/controller/functions/network/connection_check.dart b/siro_rider/lib/controller/functions/network/connection_check.dart new file mode 100644 index 0000000..82bc47b --- /dev/null +++ b/siro_rider/lib/controller/functions/network/connection_check.dart @@ -0,0 +1,48 @@ +import 'dart:async'; +import 'dart:io'; +import 'package:http/http.dart' as http; + +import 'net_guard.dart'; + +typedef BodyEncoder = Future Function(); + +class HttpRetry { + /// ريتراي لـ network/transient errors فقط. + static Future sendWithRetry( + BodyEncoder send, { + int maxRetries = 3, + Duration baseDelay = const Duration(milliseconds: 400), + Duration timeout = const Duration(seconds: 12), + }) async { + // ✅ Pre-flight check for internet connection + if (!await NetGuard().hasInternet()) { + // Immediately throw a specific exception if there's no internet. + // This avoids pointless retries. + throw const SocketException("No internet connection"); + } + int attempt = 0; + while (true) { + attempt++; + try { + final res = await send().timeout(timeout); + return res; + } on TimeoutException catch (_) { + if (attempt >= maxRetries) rethrow; + } on SocketException catch (_) { + if (attempt >= maxRetries) rethrow; + } on HandshakeException catch (_) { + if (attempt >= maxRetries) rethrow; + } on http.ClientException catch (e) { + // مثال: Connection reset by peer + final msg = e.message.toLowerCase(); + final transient = msg.contains('connection reset') || + msg.contains('broken pipe') || + msg.contains('timed out'); + if (!transient || attempt >= maxRetries) rethrow; + } + // backoff: 0.4s, 0.8s, 1.6s + final delay = baseDelay * (1 << (attempt - 1)); + await Future.delayed(delay); + } + } +} diff --git a/siro_rider/lib/controller/functions/network/net_guard.dart b/siro_rider/lib/controller/functions/network/net_guard.dart new file mode 100644 index 0000000..7c4c1f1 --- /dev/null +++ b/siro_rider/lib/controller/functions/network/net_guard.dart @@ -0,0 +1,48 @@ +import 'dart:async'; +import 'dart:io'; +import 'package:connectivity_plus/connectivity_plus.dart'; +import 'package:internet_connection_checker/internet_connection_checker.dart'; + +class NetGuard { + static final NetGuard _i = NetGuard._(); + NetGuard._(); + factory NetGuard() => _i; + + bool _notified = false; + + /// فحص: (أ) فيه شبكة؟ (ب) فيه انترنت؟ (ج) السيرفر نفسه reachable؟ + Future hasInternet({Uri? mustReach}) async { + final connectivity = await Connectivity().checkConnectivity(); + if (connectivity == ConnectivityResult.none) return false; + + final hasNet = + await InternetConnectionChecker.createInstance().hasConnection; + if (!hasNet) return false; + + if (mustReach != null) { + try { + final host = mustReach.host; + final result = await InternetAddress.lookup(host); + if (result.isEmpty || result.first.rawAddress.isEmpty) return false; + + // اختباري خفيف عبر TCP (80/443) — 400ms timeout + final port = mustReach.scheme == 'http' ? 80 : 443; + final socket = await Socket.connect(host, port, + timeout: const Duration(milliseconds: 400)); + socket.destroy(); + } catch (_) { + return false; + } + } + return true; + } + + /// إظهار إشعار مرة واحدة ثم إسكات التكرارات + void notifyOnce(void Function(String title, String msg) show) { + if (_notified) return; + _notified = true; + show('لا يوجد اتصال بالإنترنت', 'تحقق من الشبكة ثم حاول مجددًا.'); + // إعادة السماح بعد 15 ثانية + Future.delayed(const Duration(seconds: 15), () => _notified = false); + } +} diff --git a/siro_rider/lib/controller/functions/package_info.dart b/siro_rider/lib/controller/functions/package_info.dart new file mode 100644 index 0000000..f6d33bf --- /dev/null +++ b/siro_rider/lib/controller/functions/package_info.dart @@ -0,0 +1,358 @@ +import 'dart:async'; +import 'dart:convert'; +import 'dart:io'; +import 'dart:math'; +import 'dart:ui'; +import 'package:device_info_plus/device_info_plus.dart'; +import 'package:flutter/cupertino.dart'; +import 'package:flutter/material.dart'; +import 'package:get/get.dart'; +import 'package:jailbreak_root_detection/jailbreak_root_detection.dart'; +import 'package:package_info_plus/package_info_plus.dart'; +import 'package:url_launcher/url_launcher.dart'; +import '../../constant/box_name.dart'; +import '../../constant/colors.dart'; +import '../../main.dart'; +import '../../print.dart'; +import 'encrypt_decrypt.dart'; + +Future checkForUpdate(BuildContext context) async { + final packageInfo = await PackageInfo.fromPlatform(); + final currentVersion = packageInfo.buildNumber; + final version = packageInfo.version; + Log.print('currentVersion is : $currentVersion'); + // Fetch the latest version from your server + String latestVersion = box.read(BoxName.package); + box.write(BoxName.packagInfo, version); + + if (latestVersion.isNotEmpty && latestVersion != currentVersion) { + showUpdateDialog(context); + } +} + +checkForBounusInvitation() { + if (box.read(BoxName.inviteCode) != null) {} +} + +// Future getPackageInfo() async { +// final response = await CRUD().get(link: AppLink.packageInfo, payload: { +// "platform": Platform.isAndroid ? 'android' : 'ios', +// "appName": AppInformation.appName, +// }); + +// if (response != 'failure') { +// return jsonDecode(response)['message'][0]['version']; +// } +// return ''; +// } +// getDeviceFingerprint() async { +// final deviceInfo = await DeviceInfoPlugin().deviceInfo; +// var deviceData; + +// if (Platform.isAndroid) { +// deviceData = deviceInfo.data; +// Log.print('deviceData: ${jsonEncode(deviceData)}'); +// } else if (Platform.isIOS) { +// deviceData = deviceInfo.data; +// } + +// final String deviceId = +// deviceData['device'] ?? deviceData['identifierForVendor']; +// final String deviceModel = deviceData['model']; +// final String osVersion = deviceData['systemVersion']; + +// Log.print('fingr: ${'${deviceId}_${deviceModel}_$osVersion'}'); +// Log.print('deviceModel: ${deviceModel}'); +// Log.print('osVersion: ${osVersion}'); +// return EncryptionHelper.instance +// .encryptData('${deviceId}_${deviceModel}_$osVersion'); +// } + +void showUpdateDialog(BuildContext context) { + final String storeUrl = Platform.isAndroid + ? 'https://play.google.com/store/apps/details?id=com.Intaleq.intaleq' + : 'https://apps.apple.com/jo/app/intaleq-rider/id6748075179'; + showGeneralDialog( + context: context, + barrierDismissible: false, + barrierColor: Colors.black.withOpacity(0.5), + pageBuilder: (_, __, ___) { + return BackdropFilter( + filter: ImageFilter.blur(sigmaX: 5, sigmaY: 5), + child: Center( + child: AlertDialog( + // Using AlertDialog for a more Material Design look + shape: RoundedRectangleBorder( + borderRadius: + BorderRadius.circular(16)), // More rounded corners + elevation: 4, // Add a bit more elevation + contentPadding: EdgeInsets.zero, // Remove default content padding + content: Column( + mainAxisSize: MainAxisSize.min, + children: [ + Padding( + padding: const EdgeInsets.only(top: 20.0), + child: Image.asset( + 'assets/images/logo.png', + height: 72, // Slightly larger logo + width: 72, + ), + ), + const SizedBox(height: 16), + Padding( + padding: const EdgeInsets.symmetric(horizontal: 24.0), + child: Text( + 'Update Available'.tr, + textAlign: TextAlign.center, + style: Theme.of(context).textTheme.titleLarge?.copyWith( + // Use theme's title style + fontWeight: FontWeight.bold, + ), + ), + ), + Padding( + padding: const EdgeInsets.all(24.0), + child: Text( + 'A new version of the app is available. Please update to the latest version.' + .tr, // More encouraging message + textAlign: TextAlign.center, + style: Theme.of(context).textTheme.bodyMedium?.copyWith( + // Use theme's body style + color: Colors.black87, + ), + ), + ), + const Divider(height: 0), + Row( + children: [ + Expanded( + child: TextButton( + // Using TextButton for "Cancel" + onPressed: () => Navigator.pop(context), + style: TextButton.styleFrom( + foregroundColor: Colors.grey, + shape: const RoundedRectangleBorder( + borderRadius: BorderRadius.only( + bottomLeft: Radius.circular(16), + ), + ), + ), + child: Text('Cancel'.tr), + ), + ), + const SizedBox( + height: 48, + child: VerticalDivider(width: 0), // Using VerticalDivider + ), + Expanded( + child: ElevatedButton( + // Using ElevatedButton for "Update" + onPressed: () async { + if (await canLaunchUrl(Uri.parse(storeUrl))) { + await launchUrl(Uri.parse(storeUrl)); + } + if (context.mounted) Navigator.pop(context); + }, + style: ElevatedButton.styleFrom( + backgroundColor: AppColor + .primaryColor, // Use theme's primary color + foregroundColor: Theme.of(context) + .colorScheme + .onPrimary, // Use theme's onPrimary color + shape: const RoundedRectangleBorder( + borderRadius: BorderRadius.only( + bottomRight: Radius.circular(16), + ), + ), + ), + child: Text('Update'.tr), + ), + ), + ], + ), + ], + ), + ), + ), + ); + }, + transitionBuilder: (_, animation, __, child) { + return ScaleTransition( + scale: CurvedAnimation( + parent: animation, + curve: Curves.easeOutCubic, // More natural curve + ), + child: child, + ); + }, + ); +} + +class SecurityHelper { + /// Performs security checks and handles potential risks + static Future performSecurityChecks() async { + bool isNotTrust = false; + bool isJailBroken = false; + bool isRealDevice = true; + bool isOnExternalStorage = false; + bool checkForIssues = false; + bool isDevMode = false; + bool isTampered = false; + String bundleId = ""; + + try { + isNotTrust = await JailbreakRootDetection.instance.isNotTrust; + isJailBroken = await JailbreakRootDetection.instance.isJailBroken; + isRealDevice = await JailbreakRootDetection.instance.isRealDevice; + isOnExternalStorage = + await JailbreakRootDetection.instance.isOnExternalStorage; + + List issues = + await JailbreakRootDetection.instance.checkForIssues; + checkForIssues = issues.isNotEmpty; + + isDevMode = await JailbreakRootDetection.instance.isDevMode; + + // Get Bundle ID + PackageInfo packageInfo = await PackageInfo.fromPlatform(); + bundleId = packageInfo.packageName; + if (bundleId.isNotEmpty) { + // Pass the CORRECT bundle ID to isTampered + isTampered = await JailbreakRootDetection.instance.isTampered(bundleId); + } + } catch (e) { + debugPrint("Error during security checks: $e"); + // Consider handling specific exceptions, not just general errors. + } + + // Save values to storage (using GetStorage) + await box.write('isNotTrust', isNotTrust); // Use await for write operations + await box.write('isTampered', isTampered); // Use await + await box.write('isJailBroken', isJailBroken); // Use await + + debugPrint("Security Check Results:"); + debugPrint("isNotTrust: $isNotTrust"); + debugPrint("isJailBroken: $isJailBroken"); + debugPrint("isRealDevice: $isRealDevice"); + debugPrint("isOnExternalStorage: $isOnExternalStorage"); + debugPrint("checkForIssues: $checkForIssues"); + debugPrint("isDevMode: $isDevMode"); + debugPrint("isTampered: $isTampered"); + debugPrint("Bundle ID: $bundleId"); //Log.print the bundle ID + + // Check for security risks and potentially show a warning + if (isJailBroken || isRealDevice == false || isTampered) { + // Log.print("security_warning".tr); //using easy_localization + // Use a more robust approach to show a warning, like a dialog: + _showSecurityWarning(); + } else { + box.write(BoxName.security_check, 'passed'); + Log.print('Security checks passed successfully.'); + } + } + + /// Deletes all app data + static void _showSecurityWarning() { + // Use an RxInt to track the remaining seconds. This is the KEY! + RxInt secondsRemaining = 10.obs; + + Get.dialog( + CupertinoAlertDialog( + title: Text("Security Warning".tr), + content: Column( + mainAxisSize: MainAxisSize.min, + children: [ + Obx(() => Text( + "Potential security risks detected. The application will close in @seconds seconds." + .trParams({ + // Use trParams for placeholders + 'seconds': secondsRemaining.value.toString(), + }), + // Wrap the Text widget in Obx + )), + SizedBox(height: 24), // More spacing before the progress bar + Obx(() => SizedBox( + width: double.infinity, // Make progress bar full width + child: CupertinoActivityIndicator( + // in case of loading + radius: 15, + animating: true, + ))), + SizedBox(height: 8), + Obx(() => ClipRRect( + borderRadius: BorderRadius.circular(8), // Rounded corners + child: LinearProgressIndicator( + value: secondsRemaining.value / 10, + backgroundColor: Colors.grey.shade300, // Lighter background + valueColor: AlwaysStoppedAnimation( + CupertinoColors.systemRed), // iOS-style red + minHeight: 8, // Slightly thicker progress bar + ), + )), + ], + ), + ), + barrierDismissible: false, + ); + + Timer.periodic(Duration(seconds: 1), (timer) { + secondsRemaining.value--; + if (secondsRemaining.value <= 0) { + timer.cancel(); + // Get.back(); + _clearDataAndExit(); + } + }); + } + + static Future _clearDataAndExit() async { + await storage.deleteAll(); + await box.erase(); + exit(0); // Exit the app + Log.print('exit'); + } +} + +class DeviceHelper { + static Future getDeviceFingerprint() async { + final DeviceInfoPlugin deviceInfoPlugin = DeviceInfoPlugin(); + var deviceData; + + try { + if (Platform.isAndroid) { + // Fetch Android-specific device information + AndroidDeviceInfo androidInfo = await deviceInfoPlugin.androidInfo; + deviceData = androidInfo.toMap(); // Convert to a map for easier access + // Log.print('deviceData: ${jsonEncode(deviceData)}'); + } else if (Platform.isIOS) { + // Fetch iOS-specific device information + IosDeviceInfo iosInfo = await deviceInfoPlugin.iosInfo; + deviceData = iosInfo.toMap(); // Convert to a map for easier access + } else { + throw UnsupportedError('Unsupported platform'); + } + + // Extract relevant device information + final String deviceId = Platform.isAndroid + ? deviceData['androidId'] ?? deviceData['fingerprint'] ?? 'unknown' + : deviceData['identifierForVendor'] ?? 'unknown'; + + final String deviceModel = deviceData['model'] ?? 'unknown'; + // final String osVersion = Platform.isAndroid + // ? deviceData['version']['release'] ?? 'unknown' + // : deviceData['systemVersion'] ?? 'unknown'; + + // Log the extracted information + + // Generate and return the encrypted fingerprint + final String fingerprint = '${deviceId}_$deviceModel'; + final String encryptedFp = + EncryptionHelper.instance.encryptData(fingerprint); + box.write(BoxName.deviceFpEncrypted, encryptedFp); + //Log.print(EncryptionHelper.instance.encryptData(fingerprint)); + return encryptedFp; + } catch (e) { + throw Exception('Failed to generate device fingerprint'); + } + } +} diff --git a/siro_rider/lib/controller/functions/remove_account.dart b/siro_rider/lib/controller/functions/remove_account.dart new file mode 100644 index 0000000..aaeeabf --- /dev/null +++ b/siro_rider/lib/controller/functions/remove_account.dart @@ -0,0 +1,8 @@ +// import 'package:ride/controller/functions/crud.dart'; + +// class RemoveAccount { + +// void removeAccount()async{ +// var res=await CRUD().post(link: link) +// } +// } \ No newline at end of file diff --git a/siro_rider/lib/controller/functions/scan_id_card.dart b/siro_rider/lib/controller/functions/scan_id_card.dart new file mode 100644 index 0000000..b0e6336 --- /dev/null +++ b/siro_rider/lib/controller/functions/scan_id_card.dart @@ -0,0 +1,25 @@ +// import 'package:credit_card_scanner/credit_card_scanner.dart'; +// import 'package:get/get.dart'; +// +// class ScanIdCard extends GetxController { +// CardDetails? _cardDetails; +// CardScanOptions scanOptions = const CardScanOptions( +// scanCardHolderName: true, +// enableDebugLogs: true, +// validCardsToScanBeforeFinishingScan: 5, +// possibleCardHolderNamePositions: [ +// CardHolderNameScanPosition.aboveCardNumber, +// ], +// ); +// +// Future scanCard() async { +// final CardDetails? cardDetails = +// await CardScanner.scanCard(scanOptions: scanOptions); +// if (cardDetails == null) { +// return; +// } +// +// _cardDetails = cardDetails; +// update(); +// } +// } diff --git a/siro_rider/lib/controller/functions/secure_storage.dart b/siro_rider/lib/controller/functions/secure_storage.dart new file mode 100644 index 0000000..baba236 --- /dev/null +++ b/siro_rider/lib/controller/functions/secure_storage.dart @@ -0,0 +1,84 @@ +import 'dart:convert'; + +import 'package:siro_rider/constant/box_name.dart'; +import 'package:siro_rider/constant/info.dart'; +import 'package:siro_rider/controller/auth/login_controller.dart'; +import 'package:jwt_decoder/jwt_decoder.dart'; +import 'package:secure_string_operations/secure_string_operations.dart'; + +import '../../constant/char_map.dart'; +import '../../constant/links.dart'; +import '../../main.dart'; +import '../../print.dart'; +import 'crud.dart'; +import 'encrypt_decrypt.dart'; + +class SecureStorage { + void saveData(String key, value) async { + await storage.write(key: key, value: value); + } + + Future readData(String boxName) async { + final String? value = await storage.read(key: boxName); + return value.toString(); + } +} + +const List keysToFetch = [ + 'serverPHP', + // 'seferAlexandriaServer', + // 'seferPaymentServer', + // 'seferCairoServer', + // 'seferGizaServer', +]; + +class AppInitializer { + List> links = []; + + Future initializeApp() async { + if (box.read(BoxName.jwt) == null) { + await LoginController().getJWT(); + } else { + bool isTokenExpired = JwtDecoder.isExpired( + r(box.read(BoxName.jwt)).toString().split(AppInformation.addd)[0]); + + if (isTokenExpired) { + await LoginController().getJWT(); + } + } + + // await getKey(); + } + + getAIKey(String key1) async { + if (box.read(BoxName.firstTimeLoadKey) == null) { + var res = + await CRUD().get(link: AppLink.getapiKey, payload: {"keyName": key1}); + if (res != 'failure') { + var d = jsonDecode(res)['message']; + storage.write(key: key1, value: d[key1].toString()); + } else {} + } + } + + Future getKey() async { + try { + var res = + await CRUD().get(link: AppLink.getLocationAreaLinks, payload: {}); + if (res != 'failure') { + links = List>.from(jsonDecode(res)['message']); + await box.remove(BoxName.locationName); + await box.remove(BoxName.basicLink); + await box.remove(links[4]['name']); + await box.remove(links[1]['name']); + await box.remove(links[2]['name']); + await box.write(BoxName.locationName, links); + await box.write(BoxName.basicLink, (links[0]['server_link'])); + await box.write(links[2]['name'], (links[2]['server_link'])); + await box.write(links[1]['name'], (links[3]['server_link'])); + await box.write(links[3]['name'], (links[1]['server_link'])); + await box.write(BoxName.paymentLink, (links[4]['server_link'])); + } + } catch (e) {} + } +} diff --git a/siro_rider/lib/controller/functions/securty_check.dart b/siro_rider/lib/controller/functions/securty_check.dart new file mode 100644 index 0000000..bf9c5ee --- /dev/null +++ b/siro_rider/lib/controller/functions/securty_check.dart @@ -0,0 +1,53 @@ +import 'package:siro_rider/print.dart'; +import 'package:flutter/material.dart'; +import 'package:flutter/services.dart'; +import 'package:get/get.dart'; + +import '../../constant/box_name.dart'; +import '../../main.dart'; + +class SecurityChecks { + static const platform = MethodChannel( + 'com.Intaleq.intaleq/security'); // Choose a unique channel name + + static Future isDeviceCompromised() async { + try { + final bool result = await platform + .invokeMethod('isNativeRooted'); // Invoke the native method + return result; + } on PlatformException catch (e) { + Log.print("Failed to check security status: ${e.message}"); + return true; // Treat platform errors as a compromised device (for safety) + } + } + + static isDeviceRootedFromNative(BuildContext context) async { + bool compromised = await isDeviceCompromised(); + if (compromised) { + showDialog( + barrierDismissible: false, + context: context, + builder: (context) => AlertDialog( + title: Text("Security Warning".tr), + content: Text( + "Your device appears to be compromised. The app will now close." + .tr), + actions: [ + TextButton( + onPressed: () { + SystemNavigator.pop(); // Close the app + }, + child: Text("OK"), + ), + ], + ), + ); + } else { + // Continue with normal app flow + + box.write(BoxName.security_check, 'passed'); + + Log.print("Device is secure."); + } + } +} \ No newline at end of file diff --git a/siro_rider/lib/controller/functions/sms_controller.dart b/siro_rider/lib/controller/functions/sms_controller.dart new file mode 100644 index 0000000..313f4be --- /dev/null +++ b/siro_rider/lib/controller/functions/sms_controller.dart @@ -0,0 +1,168 @@ +import 'dart:convert'; + +import 'package:siro_rider/constant/api_key.dart'; +import 'package:siro_rider/constant/box_name.dart'; +import 'package:siro_rider/constant/info.dart'; +import 'package:siro_rider/constant/links.dart'; +import 'package:siro_rider/controller/auth/login_controller.dart'; +import 'package:siro_rider/env/env.dart'; +import 'package:siro_rider/main.dart'; +import 'package:siro_rider/views/widgets/elevated_btn.dart'; +import 'package:get/get.dart'; +import 'package:http/http.dart' as http; + +import '../../print.dart'; +import '../auth/register_controller.dart'; +import 'crud.dart'; + +class SmsEgyptController extends GetxController { + var headers = {'Content-Type': 'application/json'}; + Future getSender() async { + var res = await CRUD().get(link: AppLink.getSender, payload: {}); + if (res != 'failure') { + var d = jsonDecode(res)['message'][0]['senderId'].toString(); + return d; + } else { + return "Sefer Egy"; + } + } + + Future sendSmsEgypt(String phone, otp) async { + // String sender = await getSender(); + // var body = jsonEncode({ + // "username": 'Sefer', + // "password": AK.smsPasswordEgypt, + // "message": "${AppInformation.appName} app code is $otp\ncopy it to app", + // "language": box.read(BoxName.lang) == 'en' ? "e" : 'r', + // "sender": sender, //"Sefer Egy", + // "receiver": phone + // }); + + var res = await CRUD().post(link: AppLink.sendSmsFromPHP, payload: { + "language": box.read(BoxName.lang) == 'en' ? "e" : 'r', + "receiver": phone, + }); + if (res != 'failure') { + // var res = await http.post( + // Uri.parse(AppLink.sendSms), + // body: body, + // headers: headers, + // ); + + // else if (jsonDecode(res)['message'].toString() == + // "Invalid Sender with Connection") { + // + // } + // else { + Get.defaultDialog( + title: 'You will receive a code in SMS message'.tr, + middleText: '', + confirm: MyElevatedButton( + title: 'OK'.tr, + onPressed: () { + Get.back(); + })); + } else { + await CRUD().post(link: AppLink.updatePhoneInvalidSMSPassenger, payload: { + "phone_number": + '+2${Get.find().phoneController.text}' + }); + box.write(BoxName.phoneDriver, + '+2${Get.find().phoneController.text}'); + box.write(BoxName.isVerified, '1'); + + await Get.put(LoginController()).loginUsingCredentials( + box.read(BoxName.driverID).toString(), + box.read(BoxName.emailDriver).toString(), + ); + } + } + + Future checkCredit(String phone, otp) async { + var res = await http.post( + Uri.parse(AppLink.checkCredit), + body: { + "username": AppInformation.appName, + "password": AK.smsPasswordEgypt, + }, + headers: headers, + ); + } + + Future sendSmsWithValidaty(String phone, otp) async { + var res = await http.post( + Uri.parse(AppLink.checkCredit), + body: { + "username": AppInformation.appName, + "password": AK.smsPasswordEgypt, + "message": "This is an example SMS message.", + "language": box.read(BoxName.lang) == 'en' ? "e" : 'r', + "sender": "Kazumi", // todo add sefer sender name + "receiver": "2$phone", + "validity": "10", + "StartTime": DateTime.now().toString() // "1/1/2024 10:00:00" + }, + headers: headers, + ); + } + + Future sendSmsStatus(String smsid) async { + var res = await http.post( + Uri.parse(AppLink.checkCredit), + body: { + "username": AppInformation.appName, + "password": AK.smsPasswordEgypt, + "smsid": smsid //"00b77dfc-5b8f-474d-9def-9f0158b70f98" + }, + headers: headers, + ); + } + + Future sendWhatsAppAuth(String to, String token) async { + var headers = { + 'Authorization': 'Bearer ${Env.whatsapp}', + 'Content-Type': 'application/json' + }; + var request = http.Request( + 'POST', + Uri.parse( + 'https://graph.facebook.com/v20.0/${Env.whatappID}/messages')); + request.body = json.encode({ + "messaging_product": "whatsapp", + "to": to, //"962798583052", + "type": "template", + "template": { + "name": "sefer1", + "language": {"code": "en"}, + "components": [ + { + "type": "body", + "parameters": [ + { + "type": "text", + "text": token, + } + ] + } + ] + } + }); + request.headers.addAll(headers); + + http.StreamedResponse response = await request.send(); + + if (response.statusCode == 200) { + print(await response.stream.bytesToString()); + Get.defaultDialog( + title: 'You will receive a code in WhatsApp Messenger'.tr, + middleText: '', + confirm: MyElevatedButton( + title: 'OK'.tr, + onPressed: () { + Get.back(); + })); + } else { + print(response.reasonPhrase); + } + } +} diff --git a/siro_rider/lib/controller/functions/sss.dart b/siro_rider/lib/controller/functions/sss.dart new file mode 100644 index 0000000..e2e1aaf --- /dev/null +++ b/siro_rider/lib/controller/functions/sss.dart @@ -0,0 +1,18 @@ +import 'package:secure_string_operations/secure_string_operations.dart'; + +import '../../constant/char_map.dart'; +import '../../main.dart'; + +class Sss { + static read(String boxname) async { + return box.read(X.r(X.r(X.r(boxname, cn), cC), cs)); + } + + static write(String boxname, value) async { + return box.write(boxname, X.c(X.c(X.c(value, cn), cC), cs)); + } + + static delete(String boxname) async { + return box.remove(boxname); + } +} diff --git a/siro_rider/lib/controller/functions/toast.dart b/siro_rider/lib/controller/functions/toast.dart new file mode 100644 index 0000000..08157da --- /dev/null +++ b/siro_rider/lib/controller/functions/toast.dart @@ -0,0 +1,35 @@ +import 'package:flutter/material.dart'; +import 'package:get/get.dart'; +import 'package:siro_rider/constant/colors.dart'; +import 'package:siro_rider/constant/style.dart'; + +class Toast { + static void show(BuildContext context, String message, Color color) { + final snackBar = SnackBar( + clipBehavior: Clip.antiAliasWithSaveLayer, + backgroundColor: color, + elevation: 3, + content: Text( + message, + style: AppStyle.title.copyWith(color: AppColor.secondaryColor), + ), + behavior: SnackBarBehavior.floating, + animation: const AlwaysStoppedAnimation(1.0), + shape: RoundedRectangleBorder( + borderRadius: BorderRadius.circular(10.0), // Custom border radius + ), + width: Get.width * .8, + // shape: const StadiumBorder( + // side: BorderSide( + // color: AppColor.secondaryColor, + // width: 1.0, + // style: BorderStyle.solid, + // )), + duration: const Duration(seconds: 2), + ); + + ScaffoldMessenger.of(context).showSnackBar( + snackBar, + ); + } +} diff --git a/siro_rider/lib/controller/functions/tts.dart b/siro_rider/lib/controller/functions/tts.dart new file mode 100644 index 0000000..da0829f --- /dev/null +++ b/siro_rider/lib/controller/functions/tts.dart @@ -0,0 +1,51 @@ +import 'package:siro_rider/constant/box_name.dart'; +import 'package:flutter/material.dart'; +import 'package:flutter_tts/flutter_tts.dart'; +import 'package:get/get.dart'; + +import '../../main.dart'; + +class TextToSpeechController extends GetxController { + final flutterTts = FlutterTts(); + + @override + void onInit() { + super.onInit(); + initTts(); + } + + @override + void onClose() { + flutterTts.stop(); // Stop any ongoing TTS + super.onClose(); + } + + // Initialize TTS engine with language check + Future initTts() async { + try { + String langCode = box.read(BoxName.lang) ?? 'en-US'; + bool isAvailable = await flutterTts.isLanguageAvailable(langCode); + + // If language is unavailable, default to 'en-US' + if (!isAvailable) { + langCode = 'en-US'; + } + + await flutterTts.setLanguage(langCode); + await flutterTts.setSpeechRate(0.5); // Adjust speech rate + await flutterTts.setVolume(1.0); // Set volume + } catch (error) { + Get.snackbar('Error', 'Failed to initialize TTS: $error'); + } + } + + // Function to speak the given text + Future speakText(String text) async { + try { + await flutterTts.awaitSpeakCompletion(true); + await flutterTts.speak(text); + } catch (error) { + Get.snackbar('Error', 'Failed to speak text: $error'); + } + } +} diff --git a/siro_rider/lib/controller/functions/twilio_service.dart b/siro_rider/lib/controller/functions/twilio_service.dart new file mode 100644 index 0000000..34259e8 --- /dev/null +++ b/siro_rider/lib/controller/functions/twilio_service.dart @@ -0,0 +1,22 @@ +// import 'package:ride/constant/credential.dart'; +// import 'package:twilio_flutter/twilio_flutter.dart'; +// +// class TwilioSMS { +// TwilioFlutter twilioFlutter = TwilioFlutter( +// accountSid: AppCredintials.accountSIDTwillo, +// authToken: AppCredintials.authTokenTwillo, +// twilioNumber: '+962 7 9858 3052'); +// +// Future sendSMS({ +// required String recipientPhoneNumber, +// required String message, +// }) async { +// try { +// await twilioFlutter.sendSMS( +// toNumber: recipientPhoneNumber, +// messageBody: message, +// ); +// } catch (e) { +// } +// } +// } diff --git a/siro_rider/lib/controller/functions/upload_image.dart b/siro_rider/lib/controller/functions/upload_image.dart new file mode 100644 index 0000000..9eeef1f --- /dev/null +++ b/siro_rider/lib/controller/functions/upload_image.dart @@ -0,0 +1,106 @@ +import 'dart:convert'; +import 'dart:io'; + +import 'package:siro_rider/constant/api_key.dart'; +import 'package:get/get.dart'; +import 'package:http/http.dart' as http; +import 'package:image_cropper/image_cropper.dart'; +import 'package:image_picker/image_picker.dart'; +import 'package:path/path.dart'; +import 'package:secure_string_operations/secure_string_operations.dart'; + +import '../../constant/box_name.dart'; +import '../../constant/char_map.dart'; +import '../../constant/colors.dart'; +import '../../constant/info.dart'; +import '../../main.dart'; + +class ImageController extends GetxController { + File? myImage; + bool isloading = false; + CroppedFile? croppedFile; + final picker = ImagePicker(); + var image; + choosImage(String link, String imageType) async { + final pickedImage = await picker.pickImage(source: ImageSource.gallery); + image = File(pickedImage!.path); + croppedFile = await ImageCropper().cropImage( + sourcePath: image!.path, + uiSettings: [ + AndroidUiSettings( + toolbarTitle: 'Cropper'.tr, + toolbarColor: AppColor.blueColor, + toolbarWidgetColor: AppColor.yellowColor, + initAspectRatio: CropAspectRatioPreset.original, + lockAspectRatio: false), + IOSUiSettings( + title: 'Cropper'.tr, + ), + ], + ); + myImage = File(pickedImage.path); + isloading = true; + update(); +// Save the cropped image + File savedCroppedImage = File(croppedFile!.path); + try { + await uploadImage( + savedCroppedImage, + { + 'driverID': + box.read(BoxName.driverID) ?? box.read(BoxName.passengerID), + 'imageType': imageType + }, + link, + ); + } catch (e) { + Get.snackbar('Image Upload Failed'.tr, e.toString(), + backgroundColor: AppColor.redColor); + } finally { + isloading = false; + update(); + } + } + + uploadImage(File file, Map data, String link) async { + var request = http.MultipartRequest( + 'POST', + Uri.parse(link), //'https://ride.mobile-app.store/uploadImage1.php' + ); + + var length = await file.length(); + var stream = http.ByteStream(file.openRead()); + var multipartFile = http.MultipartFile( + 'image', + stream, + length, + filename: basename(file.path), + ); + final String fingerPrint = box.read(BoxName.deviceFpEncrypted)?.toString() ?? ''; + request.headers.addAll({ + 'Authorization': + 'Bearer ${X.r(X.r(X.r(box.read(BoxName.jwt), cn), cC), cs).toString().split(AppInformation.addd)[0]}', + 'X-Device-FP': fingerPrint, + }); + // Set the file name to the driverID + request.files.add( + http.MultipartFile( + 'image', + stream, + length, + filename: '${box.read(BoxName.driverID)}.jpg', + ), + ); + data.forEach((key, value) { + request.fields[key] = value; + }); + var myrequest = await request.send(); + var res = await http.Response.fromStream(myrequest); + if (res.statusCode == 200) { + return jsonDecode(res.body); + } else { + throw Exception( + 'Failed to upload image: ${res.statusCode} - ${res.body}'); + } + } +} diff --git a/siro_rider/lib/controller/home/blinking_promo_controller.dart.dart b/siro_rider/lib/controller/home/blinking_promo_controller.dart.dart new file mode 100644 index 0000000..df0bc82 --- /dev/null +++ b/siro_rider/lib/controller/home/blinking_promo_controller.dart.dart @@ -0,0 +1,91 @@ +import 'dart:async'; +import 'dart:convert'; +import 'package:flutter/material.dart'; +import 'package:get/get.dart'; + +import '../../constant/links.dart'; +import '../../views/widgets/elevated_btn.dart'; +import '../functions/crud.dart'; + +class BlinkingController extends GetxController { + final promoFormKey = GlobalKey(); + + final promo = TextEditingController(); + bool promoTaken = false; + void applyPromoCodeToPassenger() async { + //TAWJIHI + if (promoFormKey.currentState!.validate()) { + CRUD().get(link: AppLink.getPassengersPromo, payload: { + 'promo_code': promo.text, + }).then((value) { + if (value == 'failure') { + Get.defaultDialog( + title: 'Promo End !'.tr, + confirm: MyElevatedButton( + title: 'Back', + onPressed: () { + Get.back(); + Get.back(); + }, + )); + } + var decode = jsonDecode(value); + + // if (decode["status"] == "success") { + // var firstElement = decode["message"][0]; + // if (double.parse(box.read(BoxName.passengerWalletTotal)) < 0) { + // totalPassenger = totalCostPassenger - + // (totalCostPassenger * int.parse(firstElement['amount']) / 100); + // update(); + // } else { + // totalPassenger = totalCostPassenger - + // (totalCostPassenger * int.parse(firstElement['amount']) / 100); + // update(); + // } + + // totalDriver = totalDriver - + // (totalDriver * int.parse(firstElement['amount']) / 100); + // promoTaken = true; + // update(); + // Get.back(); + // } + }); + } + } + + // Reactive variable for blinking (on/off) + var isLightOn = false.obs; + + // To animate the border color + var borderColor = Colors.black.obs; + + Timer? _blinkingTimer; + + // Method to start blinking for 5 seconds + void startBlinking() { + int count = 0; + + _blinkingTimer = Timer.periodic(const Duration(seconds: 1), (timer) { + // Toggle light on/off + isLightOn.value = !isLightOn.value; + borderColor.value = isLightOn.value + ? Colors.yellow + : Colors.black; // Animate border color + + count++; + + // Stop blinking after 5 seconds + if (count >= 35) { + timer.cancel(); + isLightOn.value = false; // Ensure light turns off + borderColor.value = Colors.black; // Reset the border color + } + }); + } + + @override + void onClose() { + _blinkingTimer?.cancel(); + super.onClose(); + } +} diff --git a/siro_rider/lib/controller/home/compare.sh b/siro_rider/lib/controller/home/compare.sh new file mode 100644 index 0000000..02ae383 --- /dev/null +++ b/siro_rider/lib/controller/home/compare.sh @@ -0,0 +1,89 @@ +#!/bin/bash + +ORIG_FILE="lib/controller/home/map_passenger_controller.dart" +ALL_FILES="lib/controller/home/map/location_search_controller.dart lib/controller/home/map/map_engine_controller.dart lib/controller/home/map/map_screen_binding.dart lib/controller/home/map/map_socket_controller.dart lib/controller/home/map/nearby_drivers_controller.dart lib/controller/home/map/ride_lifecycle_controller.dart lib/controller/home/map/ui_interactions_controller.dart" + +echo "Extracting methods from original controller..." +# Methods typically start with spaces and have patterns like: +# returnType methodName( or methodName( +# Let's extract words that precede ( on lines that don't start with keywords (if, for, while, switch, catch, etc.) +# We will use awk to parse. +METHODS=$(cat "$ORIG_FILE" | awk ' +# Skip single-line comments +/\/\// { next } +# Skip imports and class declarations +/import/ || /class/ { next } +# Find lines with "(" +/\(/ { + # Replace anything inside parentheses and curly braces to simplify + gsub(/\(.*\)/, "()") + # Find word before "()" + for (i = 1; i <= NF; i++) { + if ($i ~ /[a-zA-Z0-9_]+\(\)/) { + name = $i + sub(/\(\)/, "", name) + # Remove any leading modifiers like async, Future, static, etc. + # Only keep valid identifiers that are not control keywords + if (name !~ /^(if|for|while|switch|catch|super|await|print|assert|dynamic|void|return|with|override|get|set|else|try|final|const|var|late|static|factory|new|abstract|covariant|external|operator|part|required|typedef|yield)$/ && name ~ /^[a-zA-Z_][a-zA-Z0-9_]*$/) { + print name + } + } + } +}' | sort -u) + +echo "Extracting fields/variables from original controller..." +# Fields are usually declared inside the class at the beginning of lines or indented. +# e.g., RxBool isSearching = false.obs; or String? rideId; +VARS=$(cat "$ORIG_FILE" | awk ' +/\/\// { next } +/import/ || /class/ { next } +# Lines ending with ";" or containing "=" followed by ";" +/;/ { + # Extract words that look like declarations. + # We look for typical type names or var/final followed by variable name + for (i = 1; i < NF; i++) { + if ($i ~ /^(var|final|const|late|RxBool|RxInt|RxDouble|RxString|RxList|RxMap|RxSet|Rx|String|int|double|bool|List|Map|Set|Timer|LatLng|Position|IntaleqMapController)$/) { + # The next field might be the variable name, or it might have a type like String? + name = $(i+1) + # Remove trailing ?, ;, = + sub(/\?/, "", name) + sub(/;/, "", name) + sub(/=/, "", name) + if (name ~ /^[a-zA-Z_][a-zA-Z0-9_]*$/) { + print name + } + } + } +}' | sort -u) + +echo "Checking split files for methods..." +echo "--- MISSING METHODS ---" +MISSING_METHODS_COUNT=0 +# Create a temporary file with all split contents to search efficiently +cat $ALL_FILES > lib/controller/home/temp_split_combined.txt + +for method in $METHODS; do + # Search for this method name as a whole word in split controllers + FOUND=$(grep -w "$method" lib/controller/home/temp_split_combined.txt 2>/dev/null) + if [ -z "$FOUND" ]; then + echo " - $method" + MISSING_METHODS_COUNT=$((MISSING_METHODS_COUNT+1)) + fi +done +echo "Total missing methods: $MISSING_METHODS_COUNT" + +echo "" +echo "Checking split files for variables/fields..." +echo "--- MISSING VARIABLES ---" +MISSING_VARS_COUNT=0 +for var in $VARS; do + FOUND=$(grep -w "$var" lib/controller/home/temp_split_combined.txt 2>/dev/null) + if [ -z "$FOUND" ]; then + echo " - $var" + MISSING_VARS_COUNT=$((MISSING_VARS_COUNT+1)) + fi +done +echo "Total missing variables: $MISSING_VARS_COUNT" + +# Clean up temp file +rm lib/controller/home/temp_split_combined.txt diff --git a/siro_rider/lib/controller/home/compare_precise.py b/siro_rider/lib/controller/home/compare_precise.py new file mode 100644 index 0000000..57ba26c --- /dev/null +++ b/siro_rider/lib/controller/home/compare_precise.py @@ -0,0 +1,104 @@ +import sys +import re + +def parse_stream(stream_text): + # Splits the stream by our custom file delimiters + files = {} + parts = re.split(r'=== FILE: (.*?) ===\n', stream_text) + + # The first part is the original monolithic file + if parts: + files['original'] = parts[0] + + for i in range(1, len(parts), 2): + filename = parts[i] + content = parts[i+1] if i+1 < len(parts) else "" + files[filename] = content + + return files + +def strip_comments(text): + text = re.sub(r'/\*.*?\*/', '', text, flags=re.DOTALL) + text = re.sub(r'//.*', '', text) + return text + +def extract_declarations(text): + clean = strip_comments(text) + + # Matches method/function declarations inside a class in Dart + # e.g., void myMethod(..., Future myMethod(..., myMethod(..., get myProp, set myProp + # We look for word followed by ( or get/set followed by word. + method_decl_pattern = re.compile( + r'(?:[a-zA-Z0-9_<>\?\[\]]+(?:\s+[a-zA-Z0-9_<>\?\[\]]+)*\s+)?([a-zA-Z0-9_]+)\s*\([^\)]*\)\s*(?:async)?\s*(?:=>|\{)' + ) + + methods = set() + for match in method_decl_pattern.finditer(clean): + method_name = match.group(1) + if method_name not in keywords and not method_name.isdigit(): + methods.add(method_name) + + # Also extract getters and setters + getset_pattern = re.compile(r'\b(?:get|set)\s+([a-zA-Z0-9_]+)\b') + for match in getset_pattern.finditer(clean): + name = match.group(1) + if name not in keywords: + methods.add(name) + + # Extract variables/fields declarations + var_decl_pattern = re.compile( + r'\b(?:var|final|const|late|RxBool|RxInt|RxDouble|RxString|RxList|RxMap|RxSet|Rx|String|int|double|bool|List|Map|Set|Timer|LatLng|Position|IntaleqMapController)\??\s+([a-zA-Z0-9_]+)\b' + ) + + variables = set() + for match in var_decl_pattern.finditer(clean): + var_name = match.group(1) + if var_name not in keywords and not var_name.isdigit(): + variables.add(var_name) + + return methods, variables + +keywords = { + 'if', 'for', 'while', 'switch', 'catch', 'super', 'await', 'print', + 'assert', 'dynamic', 'void', 'return', 'with', 'override', 'get', 'set', + 'class', 'import', 'extends', 'implements', 'mixin', 'this', 'else', 'try', + 'final', 'const', 'var', 'late', 'static', 'factory', 'new', 'abstract', + 'covariant', 'external', 'operator', 'part', 'required', 'typedef', 'yield' +} + +def main(): + stream_text = sys.stdin.read() + files = parse_stream(stream_text) + + orig_content = files.get('original', '') + split_contents = {k: v for k, v in files.items() if k != 'original'} + + orig_methods, orig_vars = extract_declarations(orig_content) + + # Combined declarations in split files + split_methods = set() + split_vars = set() + for filename, content in split_contents.items(): + m, v = extract_declarations(content) + split_methods.update(m) + split_vars.update(v) + + missing_methods = sorted(orig_methods - split_methods) + missing_vars = sorted(orig_vars - split_vars) + + print("--- PRECISE MISSING METHODS ---") + print(f"Total original methods/getters/setters: {len(orig_methods)}") + print(f"Total defined in split controllers: {len(split_methods)}") + print(f"Total missing: {len(missing_methods)}") + for m in missing_methods: + print(f" - {m}") + + print("\n--- PRECISE MISSING VARIABLES/FIELDS ---") + print(f"Total original variables: {len(orig_vars)}") + print(f"Total defined in split controllers: {len(split_vars)}") + print(f"Total missing: {len(missing_vars)}") + for v in missing_vars: + print(f" - {v}") + +if __name__ == '__main__': + main() diff --git a/siro_rider/lib/controller/home/comparison_results.txt b/siro_rider/lib/controller/home/comparison_results.txt new file mode 100644 index 0000000..f554094 --- /dev/null +++ b/siro_rider/lib/controller/home/comparison_results.txt @@ -0,0 +1,103 @@ +Extracting methods from original controller... +Extracting fields/variables from original controller... +Checking split files for methods... +--- MISSING METHODS --- + - _applyLowEndModeIfNeeded + - _buildOsrmWaypointCoords + - _calculateDistance + - _checkAndRecalculateIfDeviated + - _fillDriverDataLocally + - _haversineKm + - _initMinimalIcons + - _initializePolygons + - _isActiveRideState + - _kmToLatDelta + - _kmToLngDelta + - _onDriverArrivedWithSocket + - _onRideCancelledWithSocket + - _onRideStartedWithSocket + - _relevanceScore + - _restorePolyline + - _stageNiceToHave + - _stagePricingAndState + - _startMasterTimer + - _startMasterTimerWithInterval + - _startPollingFallback + - _stopDriverLocationPolling + - _updateDriverMarker + - cancelRide + - detectPerfMode + - getAIKey + - getMapPointsForAllMethods + - getPassengerLocationUniversity + - handleActiveRideOnStartup + - isDriversDataValid + - onChangedPassengerCount + - onChangedPassengersChoose + - showDrawingBottomSheet + - showNoDriversDialog + - startSearchingTimer +Total missing methods: 35 + +Checking split files for variables/fields... +--- MISSING VARIABLES --- + - _isStateProcessing + - _isUsingFallback + - _maxReconnectAttempts + - apiDistanceMeters + - c + - carInfo + - carsOrder + - coordDestination + - currentCarType + - currentDriverLocation + - currentLocationOfDrivers + - currentRideId + - currentTimeSearchingCaptainWindow + - dInfo + - dLat + - datadriverCarsLocationToPassengerAfterApplied + - distanceOfTrip + - driverCarPlate + - driverLocationToPassenger + - driverOrderStatus + - durationByPassenger + - endLocation + - fName + - finalReason + - headingList + - increaseFeeFormKey + - isDriversTokensSend + - isFirstWaypoint + - isInUniversity + - isSaaSRequest + - kmInDegree + - lName + - latDest + - latestPosition + - lngDest + - lowPerf + - messagesFormKey + - originCoords + - pLower + - passengerLocationStringUnvirsity + - previousLocationOfDrivers + - progressTimerRideBeginVip + - qLower + - rLat1 + - rLat2 + - ram + - rideData + - sdk + - selectedPassengerCount + - startLng + - startLocation + - stringElapsedTimeRideBegin + - tax + - totalPassengerBalashDiscount + - totalPassengerComfortDiscount + - totalPassengerElectricDiscount + - totalPassengerLadyDiscount + - totalPassengerRaihGaiDiscount + - totalPassengerSpeedDiscount +Total missing variables: 59 diff --git a/siro_rider/lib/controller/home/contact_us_controller.dart b/siro_rider/lib/controller/home/contact_us_controller.dart new file mode 100644 index 0000000..bce50bc --- /dev/null +++ b/siro_rider/lib/controller/home/contact_us_controller.dart @@ -0,0 +1,121 @@ +import 'dart:math'; +import 'package:flutter/cupertino.dart'; +import 'package:flutter/material.dart'; +import 'package:flutter_font_icons/flutter_font_icons.dart'; +import 'package:get/get.dart'; + +import '../../../constant/colors.dart'; +import '../functions/launch.dart'; + +class ContactUsController extends GetxController { + /// WORKING HOURS (10:00 → 16:00) + final TimeOfDay workStartTime = const TimeOfDay(hour: 10, minute: 0); + final TimeOfDay workEndTime = const TimeOfDay(hour: 16, minute: 0); + + bool get isWorkTime { + final now = TimeOfDay.now(); + return (now.hour > workStartTime.hour || + (now.hour == workStartTime.hour && + now.minute >= workStartTime.minute)) && + (now.hour < workEndTime.hour || + (now.hour == workEndTime.hour && now.minute <= workEndTime.minute)); + } + + /// Helper to format working hours for UI + String get workHoursString => + '${workStartTime.hour.toString().padLeft(2, '0')}:${workStartTime.minute.toString().padLeft(2, '0')} - ' + '${workEndTime.hour.toString().padLeft(2, '0')}:${workEndTime.minute.toString().padLeft(2, '0')}'; + + /// PHONE LIST (USED FOR CALLS + WHATSAPP) + final List phoneNumbers = [ + '+963952475734', + '+963952475740', + '+963952475742' + ]; + + /// RANDOM PHONE SELECTOR + String getRandomPhone() { + final random = Random(); + return phoneNumbers[random.nextInt(phoneNumbers.length)]; + } + + /// DIRECT ACTIONS + void makeCall() { + if (isWorkTime) { + makePhoneCall(getRandomPhone()); + } + } + + void sendWhatsApp() { + launchCommunication('whatsapp', getRandomPhone(), 'Hello'.tr); + } + + void sendEmail() { + launchCommunication('email', 'support@intaleqapp.com', 'Hello'.tr); + } + + /// SHOW DIALOG (Optional legacy support) + void showContactDialog(BuildContext context) { + bool withinHours = isWorkTime; + + showCupertinoModalPopup( + context: context, + builder: (context) => CupertinoActionSheet( + title: Text('Contact Us'.tr), + message: Text('Choose a contact option'.tr), + actions: [ + if (withinHours) + CupertinoActionSheetAction( + child: Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + const Icon(CupertinoIcons.phone), + Text('Call Support'.tr), + ], + ), + onPressed: () { + Navigator.pop(context); + makeCall(); + }, + ), + if (!withinHours) + CupertinoActionSheetAction( + child: Text( + 'Work time is from 10:00 AM to 16:00 PM.\nYou can send a WhatsApp message or email.' + .tr, + textAlign: TextAlign.center, + ), + onPressed: () => Navigator.pop(context), + ), + CupertinoActionSheetAction( + child: Row( + mainAxisAlignment: MainAxisAlignment.spaceAround, + children: [ + const Icon( + FontAwesome.whatsapp, + color: AppColor.greenColor, + ), + Text('Send WhatsApp Message'.tr), + ], + ), + onPressed: () { + Navigator.pop(context); + sendWhatsApp(); + }, + ), + CupertinoActionSheetAction( + child: Text('Send Email'.tr), + onPressed: () { + Navigator.pop(context); + sendEmail(); + }, + ), + ], + cancelButton: CupertinoActionSheetAction( + child: Text('Cancel'.tr), + onPressed: () => Navigator.pop(context), + ), + ), + ); + } +} diff --git a/siro_rider/lib/controller/home/decode_polyline_isolate.dart b/siro_rider/lib/controller/home/decode_polyline_isolate.dart new file mode 100644 index 0000000..07938c0 --- /dev/null +++ b/siro_rider/lib/controller/home/decode_polyline_isolate.dart @@ -0,0 +1,62 @@ +import 'package:intaleq_maps/intaleq_maps.dart'; + +List decodePolylineIsolate(String encoded) { + List points = []; + int index = 0, len = encoded.length; + int lat = 0, lng = 0; + + while (index < len) { + int b, shift = 0, result = 0; + do { + b = encoded.codeUnitAt(index++) - 63; + result |= (b & 0x1f) << shift; + shift += 5; + } while (b >= 0x20); + int dlat = ((result & 1) != 0 ? ~(result >> 1) : (result >> 1)); + lat += dlat; + + shift = 0; + result = 0; + do { + b = encoded.codeUnitAt(index++) - 63; + result |= (b & 0x1f) << shift; + shift += 5; + } while (b >= 0x20); + int dlng = ((result & 1) != 0 ? ~(result >> 1) : (result >> 1)); + lng += dlng; + + points.add(LatLng(lat / 1E5, lng / 1E5)); + } + return points; +} +// Helper method for decoding polyline (if not already defined) +// List decodePolyline(String encoded) { +// List points = []; +// int index = 0, len = encoded.length; +// int lat = 0, lng = 0; + +// while (index < len) { +// int b, shift = 0, result = 0; +// do { +// b = encoded.codeUnitAt(index++) - 63; +// result |= (b & 0x1f) << shift; +// shift += 5; +// } while (b >= 0x20); +// int dlat = ((result & 1) != 0 ? ~(result >> 1) : (result >> 1)); +// lat += dlat; + +// shift = 0; +// result = 0; +// do { +// b = encoded.codeUnitAt(index++) - 63; +// result |= (b & 0x1f) << shift; +// shift += 5; +// } while (b >= 0x20); +// int dlng = ((result & 1) != 0 ? ~(result >> 1) : (result >> 1)); +// lng += dlng; + +// points.add(LatLng(lat / 1E5, lng / 1E5)); +// } + +// return points; +// } diff --git a/siro_rider/lib/controller/home/deep_link_controller.dart b/siro_rider/lib/controller/home/deep_link_controller.dart new file mode 100644 index 0000000..8a38c9d --- /dev/null +++ b/siro_rider/lib/controller/home/deep_link_controller.dart @@ -0,0 +1,43 @@ +import 'package:siro_rider/print.dart'; +import 'dart:async'; +import 'package:app_links/app_links.dart'; +import 'package:get/get.dart'; + +class DeepLinkController extends GetxController { + final _appLinks = AppLinks(); + StreamSubscription? _linkSubscription; + + // تخزين الرابط الخام (URL) ليتم معالجته لاحقاً في MapPassengerController + final Rx rawDeepLink = Rx(null); + + @override + void onInit() { + super.onInit(); + initDeepLinks(); + } + + Future initDeepLinks() async { + // الاستماع للروابط والتطبيق يعمل في الخلفية + _linkSubscription = _appLinks.uriLinkStream.listen((uri) { + Log.print('🔗 Received deep link (Stream): $uri'); + rawDeepLink.value = uri.toString(); + }); + + // الاستماع للروابط إذا كان التطبيق مغلقاً تماماً (Cold Start) + try { + final initialUri = await _appLinks.getInitialLink(); + if (initialUri != null) { + Log.print('🔗 Received initial deep link (Cold Start): $initialUri'); + rawDeepLink.value = initialUri.toString(); + } + } catch (e) { + Log.print('Error getting initial link: $e'); + } + } + + @override + void onClose() { + _linkSubscription?.cancel(); + super.onClose(); + } +} \ No newline at end of file diff --git a/siro_rider/lib/controller/home/device_performance.dart b/siro_rider/lib/controller/home/device_performance.dart new file mode 100644 index 0000000..9bffc4b --- /dev/null +++ b/siro_rider/lib/controller/home/device_performance.dart @@ -0,0 +1,127 @@ +import 'dart:io'; +import 'package:device_info_plus/device_info_plus.dart'; + +class DevicePerformanceManager { + /// القائمة البيضاء لموديلات الهواتف القوية (Flagships Only) + /// أي هاتف يبدأ موديله بأحد هذه الرموز سيعتبر قوياً + static const List _highEndSamsungModels = [ + 'SM-S', // سلسلة Galaxy S21, S22, S23, S24 (S901, S908, S911...) + 'SM-F', // سلسلة Fold و Flip (Z Fold, Z Flip) + 'SM-N9', // سلسلة Note 9, Note 10, Note 20 + 'SM-G9', // سلسلة S10, S20 (G970, G980...) + ]; + + static const List _highEndGoogleModels = [ + 'Pixel 6', + 'Pixel 7', + 'Pixel 8', + 'Pixel 9', + 'Pixel Fold' + ]; + + static const List _highEndHuaweiModels = [ + 'ELS-', // P40 Pro + 'ANA-', // P40 + 'HMA-', // Mate 20 + 'LYA-', // Mate 20 Pro + 'VOG-', // P30 Pro + 'ELE-', // P30 + 'NOH-', // Mate 40 Pro + 'AL00', // Mate X series (some) + ]; + + static const List _highEndXiaomiModels = [ + '2201122', // Xiaomi 12 series patterns often look like this + '2210132', // Xiaomi 13 + '2304FPN', // Xiaomi 13 Ultra + 'M2007J1', // Mi 10 series + 'M2102K1', // Mi 11 Ultra + ]; + + static const List _highEndOnePlusModels = [ + 'GM19', // OnePlus 7 + 'HD19', // OnePlus 7T + 'IN20', // OnePlus 8 + 'KB20', // OnePlus 8T + 'LE21', // OnePlus 9 + 'NE22', // OnePlus 10 + 'PHB110', // OnePlus 11 + 'CPH', // Newer OnePlus models + ]; + + /// دالة الفحص الرئيسية + static Future isHighEndDevice() async { + // 1. الآيفون دائماً قوي (نظام الرسوميات فيه متفوق حتى في الموديلات القديمة) + if (Platform.isIOS) return true; + + if (Platform.isAndroid) { + try { + final androidInfo = await DeviceInfoPlugin().androidInfo; + + String manufacturer = androidInfo.manufacturer.toLowerCase(); + String model = + androidInfo.model.toUpperCase(); // نحوله لحروف كبيرة للمقارنة + String hardware = androidInfo.hardware.toLowerCase(); // المعالج + + // --- الفحص العكسي (الحظر المباشر) --- + // إذا كان المعالج من الفئات الضعيفة جداً المشهورة في الهواتف المقلدة + // mt65xx, mt6735, sc77xx هي معالجات رخيصة جداً + if (hardware.contains('mt65') || + hardware.contains('mt6735') || + hardware.contains('sc77')) { + return false; + } + + // --- فحص القائمة البيضاء (Whitelist) --- + + // 1. Samsung Flagships + if (manufacturer.contains('samsung')) { + for (var prefix in _highEndSamsungModels) { + if (model.startsWith(prefix)) return true; + } + } + + // 2. Google Pixel (6 and above) + if (manufacturer.contains('google')) { + for (var prefix in _highEndGoogleModels) { + if (model.contains(prefix.toUpperCase())) return true; + } + } + + // 3. Huawei Flagships + if (manufacturer.contains('huawei')) { + for (var prefix in _highEndHuaweiModels) { + if (model.startsWith(prefix)) return true; + } + } + + // 4. OnePlus Flagships + if (manufacturer.contains('oneplus')) { + for (var prefix in _highEndOnePlusModels) { + if (model.startsWith(prefix)) return true; + } + } + + // 5. Xiaomi Flagships + if (manufacturer.contains('xiaomi') || + manufacturer.contains('redmi') || + manufacturer.contains('poco')) { + // شاومي تسميتها معقدة، لذا سنعتمد على فحص الرام كعامل مساعد هنا فقط + // لأن هواتف شاومي القوية عادة لا تزور الرام + // الرام يجب أن يكون أكبر من 6 جيجا (بايت) + double ramGB = (androidInfo.availableRamSize) / (1024 * 1024 * 1024); + if (ramGB > 7.5) + return true; // 8GB RAM or more is usually safe for Xiaomi high-end + } + + // إذا لم يكن من ضمن القوائم أعلاه، نعتبره جهازاً متوسطاً/ضعيفاً ونعرض الرسم البسيط + return false; + } catch (e) { + // في حال حدوث خطأ في الفحص، نعود للوضع الآمن (الرسم البسيط) + return false; + } + } + + return false; + } +} diff --git a/siro_rider/lib/controller/home/device_tier.dart b/siro_rider/lib/controller/home/device_tier.dart new file mode 100644 index 0000000..02f5f51 --- /dev/null +++ b/siro_rider/lib/controller/home/device_tier.dart @@ -0,0 +1,86 @@ +import 'dart:io'; +import 'package:device_info_plus/device_info_plus.dart'; + +import '../../main.dart'; + +// مفاتيح التخزين (بسيطة) +const _kDeviceTierKey = 'deviceTier'; // 'low' | 'mid' | 'high' +const _kDeviceTierCheckedAtKey = 'deviceTierTime'; // millisSinceEpoch + +Future detectAndCacheDeviceTier({bool force = false}) async { + // لا تعيد الفحص إذا عملناه خلال آخر 24 ساعة + if (!force) { + final last = box.read(_kDeviceTierCheckedAtKey); + if (last is int) { + final dt = DateTime.fromMillisecondsSinceEpoch(last); + if (DateTime.now().difference(dt) < const Duration(hours: 24)) { + final cached = box.read(_kDeviceTierKey); + if (cached is String && cached.isNotEmpty) + return cached; // low/mid/high + } + } + } + + final info = DeviceInfoPlugin(); + int score = 0; + + if (Platform.isAndroid) { + final a = await info.androidInfo; + final int sdk = a.version.sdkInt ?? 0; + final int cores = Platform.numberOfProcessors; + final int abisCount = a.supportedAbis.length; + final bool isEmu = !(a.isPhysicalDevice ?? true); + + // SDK (أقدم = أضعف) + if (sdk <= 26) + score += 3; // 8.0 وأقدم + else if (sdk <= 29) + score += 2; // 9-10 + else if (sdk <= 30) score += 1; // 11 + + // الأنوية + if (cores <= 4) + score += 3; + else if (cores <= 6) + score += 2; + else if (cores <= 8) score += 1; + + // ABI count (القليل غالباً أضعف) + if (abisCount <= 1) + score += 2; + else if (abisCount == 2) score += 1; + + // محاكي + if (isEmu) score += 2; + } else { + // iOS/منصات أخرى: تقدير سريع بالأنوية فقط + final int cores = Platform.numberOfProcessors; + if (cores <= 4) + score += 3; + else if (cores <= 6) + score += 2; + else if (cores <= 8) score += 1; + } + + // تحويل السكور إلى تصنيف + final String tier = (score >= 6) + ? 'low' + : (score >= 3) + ? 'mid' + : 'high'; + + box.write(_kDeviceTierKey, tier); + box.write(_kDeviceTierCheckedAtKey, DateTime.now().millisecondsSinceEpoch); + return tier; +} + +// للقراءة السريعة وقت ما تحتاج: +String getCachedDeviceTier() { + final t = box.read(_kDeviceTierKey); + if (t is String && t.isNotEmpty) return t; + return 'mid'; +} + +bool isLowEnd() => getCachedDeviceTier() == 'low'; +bool isMidEnd() => getCachedDeviceTier() == 'mid'; +bool isHighEnd() => getCachedDeviceTier() == 'high'; diff --git a/siro_rider/lib/controller/home/home_page_controller.dart b/siro_rider/lib/controller/home/home_page_controller.dart new file mode 100644 index 0000000..de2510c --- /dev/null +++ b/siro_rider/lib/controller/home/home_page_controller.dart @@ -0,0 +1,15 @@ +import 'package:get/get.dart'; + +import '../../constant/box_name.dart'; +import '../../main.dart'; + +class HomePageController extends GetxController { + late bool isVibrate = box.read(BoxName.isvibrate) ?? true; + + void changeVibrateOption(bool value) { + isVibrate = box.read(BoxName.isvibrate) ?? true; + isVibrate = value; + box.write(BoxName.isvibrate, value); + update(); + } +} diff --git a/siro_rider/lib/controller/home/ios_live_activity_service.dart b/siro_rider/lib/controller/home/ios_live_activity_service.dart new file mode 100644 index 0000000..8d93372 --- /dev/null +++ b/siro_rider/lib/controller/home/ios_live_activity_service.dart @@ -0,0 +1,74 @@ +import 'package:siro_rider/print.dart'; +import 'dart:io'; +import 'dart:convert'; +import 'package:live_activities/live_activities.dart'; + +class IosLiveActivityService { + static final _liveActivitiesPlugin = LiveActivities(); + static String? _activityId; + + static void init() { + if (Platform.isIOS) { + _liveActivitiesPlugin.init( + appGroupId: "group.com.Intaleq.intaleq", + ); + } + } + + static Future startRideActivity({ + required String rideId, + required String driverName, + required String carDetails, + required String etaText, + required double progress, + }) async { + if (!Platform.isIOS) return; + + try { + await _liveActivitiesPlugin.endAllActivities(); + + // استخدام dynamic يسمح للحزمة بحفظ النصوص والأرقام في الذاكرة المشتركة + final Map activityModel = { + 'status': 'waiting', + 'driverName': driverName, + 'carDetails': carDetails, + 'etaText': etaText, + 'progress': progress, + }; + + // الدالة هنا تأخذ المعاملات مباشرة + _activityId = await _liveActivitiesPlugin.createActivity( + rideId, + activityModel, + ); + } catch (e) { + Log.print("❌ Live Activity Start Error: $e"); + } + } + + static Future updateRideActivity({ + required String status, + required String driverName, + required String carDetails, + required String etaText, + required double progress, + }) async { + if (!Platform.isIOS || _activityId == null) return; + + final Map updatedModel = { + 'status': status, + 'driverName': driverName, + 'carDetails': carDetails, + 'etaText': etaText, + 'progress': progress, + }; + + await _liveActivitiesPlugin.updateActivity(_activityId!, updatedModel); + } + + static Future endRideActivity() async { + if (!Platform.isIOS || _activityId == null) return; + await _liveActivitiesPlugin.endActivity(_activityId!); + _activityId = null; + } +} \ No newline at end of file diff --git a/siro_rider/lib/controller/home/map/car_location.dart b/siro_rider/lib/controller/home/map/car_location.dart new file mode 100644 index 0000000..2c3ca3b --- /dev/null +++ b/siro_rider/lib/controller/home/map/car_location.dart @@ -0,0 +1,15 @@ +class CarLocation { + final String id; + final double latitude; + final double longitude; + final double distance; + final double duration; + + CarLocation({ + required this.id, + required this.latitude, + required this.longitude, + this.distance = 10000, + this.duration = 10000, + }); +} diff --git a/siro_rider/lib/controller/home/map/location_search_controller.dart b/siro_rider/lib/controller/home/map/location_search_controller.dart new file mode 100644 index 0000000..ff14928 --- /dev/null +++ b/siro_rider/lib/controller/home/map/location_search_controller.dart @@ -0,0 +1,1052 @@ +import 'dart:async'; +import 'dart:convert'; +import 'dart:io'; +import 'dart:math' show cos, pi, max, min, atan2, sin, sqrt; +import 'package:flutter/material.dart'; +import 'package:flutter/services.dart'; +import 'package:geolocator/geolocator.dart'; +import 'package:get/get.dart'; +import 'package:intaleq_maps/intaleq_maps.dart'; +import 'package:location/location.dart'; +import 'package:http/http.dart' as http; + +import '../../../constant/box_name.dart'; +import '../../../constant/links.dart'; +import '../../../constant/colors.dart'; +import '../../../constant/style.dart'; +import '../../../constant/table_names.dart'; +import '../../../main.dart'; // contains global 'box', 'sql' +import '../../../print.dart'; +import '../../../services/offline_map_service.dart'; +import '../../functions/crud.dart'; +import '../points_for_rider_controller.dart'; +import '../../../views/home/map_widget.dart/form_serch_multiy_point.dart'; +import '../../../views/widgets/error_snakbar.dart'; +import 'map_engine_controller.dart'; +import '../deep_link_controller.dart'; +import 'ride_lifecycle_controller.dart'; +import 'ride_state.dart'; +import '../../../constant/country_polygons.dart'; +import '../../../constant/univeries_polygon.dart'; + +class LocationSearchController extends GetxController { + List> waypoints = []; + String passengerLocationStringUnvirsity = 'Not in University'; + bool isInUniversity = false; + List coordinatesWithoutEmpty = []; + LatLng? latestPosition; + + List polylineCoordinates0 = []; + List polylineCoordinates1 = []; + List polylineCoordinates2 = []; + List polylineCoordinates3 = []; + List polylineCoordinates4 = []; + late List> polylineCoordinatesPointsAll = [ + polylineCoordinates0, + polylineCoordinates1, + polylineCoordinates2, + polylineCoordinates3, + polylineCoordinates4, + ]; + + bool isLoading = true; + TextEditingController placeDestinationController = TextEditingController(); + TextEditingController placeStartController = TextEditingController(); + TextEditingController wayPoint0Controller = TextEditingController(); + TextEditingController wayPoint1Controller = TextEditingController(); + TextEditingController wayPoint2Controller = TextEditingController(); + TextEditingController wayPoint3Controller = TextEditingController(); + TextEditingController wayPoint4Controller = TextEditingController(); + TextEditingController whatsAppLocationText = TextEditingController(); + final sosFormKey = GlobalKey(); + + List bounds = []; + List placesStart = []; + List allTextEditingPlaces = []; + List placesDestination = []; + List wayPoint0 = []; + List wayPoint1 = []; + List wayPoint2 = []; + List wayPoint3 = []; + List wayPoint4 = []; + List> placeListResponseAll = []; + + List placeListResponse = []; + + PermissionStatus? permissionGranted; + final location = Location(); + double speed = 0; + + late LatLng passengerLocation = const LatLng(32, 34); + late LatLng newMyLocation = const LatLng(32.115295, 36.064773); + late LatLng newStartPointLocation = const LatLng(32.115295, 36.064773); + late LatLng newPointLocation0 = const LatLng(32.115295, 36.064773); + late LatLng newPointLocation1 = const LatLng(32.115295, 36.064773); + late LatLng newPointLocation2 = const LatLng(32.115295, 36.064773); + late LatLng newPointLocation3 = const LatLng(32.115295, 36.064773); + late LatLng newPointLocation4 = const LatLng(32.115295, 36.064773); + late LatLng myDestination = const LatLng(32, 34); + + bool startLocationFromMap = false; + bool passengerStartLocationFromMap = false; + bool workLocationFromMap = false; + bool homeLocationFromMap = false; + bool isPassengerRideLocationWidget = false; + bool startLocationFromMap0 = false; + bool startLocationFromMap1 = false; + bool startLocationFromMap2 = false; + bool startLocationFromMap3 = false; + bool startLocationFromMap4 = false; + List startLocationFromMapAll = []; + + bool currentLocationToFormPlaces = false; + bool currentLocationToFormPlaces0 = false; + bool currentLocationToFormPlaces1 = false; + bool currentLocationToFormPlaces2 = false; + bool currentLocationToFormPlaces3 = false; + bool currentLocationToFormPlaces4 = false; + List currentLocationToFormPlacesAll = []; + + // Multi-Waypoint (max 2 stops) + List menuWaypoints = [null, null]; + List menuWaypointNames = ['', '']; + int activeMenuWaypointCount = 0; + bool isPickingWaypoint = false; + int pickingWaypointIndex = -1; + + int wayPointIndex = 0; + String hintTextStartPoint = 'Search for your Start point'.tr; + String hintTextwayPoint0 = 'Search for waypoint'.tr; + String hintTextwayPoint1 = 'Search for waypoint'.tr; + String hintTextwayPoint2 = 'Search for waypoint'.tr; + String hintTextwayPoint3 = 'Search for waypoint'.tr; + String hintTextwayPoint4 = 'Search for waypoint'.tr; + String currentLocationString = 'Current Location'.tr; + String currentLocationString0 = 'Current Location'.tr; + String currentLocationString1 = 'Add Location 1'.tr; + String currentLocationString2 = 'Add Location 2'.tr; + String currentLocationString3 = 'Add Location 3'.tr; + String currentLocationString4 = 'Add Location 4'.tr; + String placesCoordinate0 = ''.tr; + String placesCoordinate1 = ''.tr; + String placesCoordinate2 = ''.tr; + String placesCoordinate3 = ''.tr; + String placesCoordinate4 = ''.tr; + List currentLocationStringAll = []; + List hintTextwayPointStringAll = []; + var placesCoordinate = []; + String hintTextDestinationPoint = 'Select your destination'.tr; + + late String startNameAddress = ''; + late String endNameAddress = ''; + List> stopPoints = []; + + double latitudeWhatsApp = 0; + double longitudeWhatsApp = 0; + late List recentPlaces = []; + + Timer? _camThrottle; + + final DeepLinkController _deepLinkController = + Get.isRegistered() + ? Get.find() + : Get.put(DeepLinkController()); + + @override + void onInit() { + super.onInit(); + placeListResponse = [ + formSearchPlaces(0), + formSearchPlaces(1), + formSearchPlaces(2), + formSearchPlaces(3), + ]; + readyWayPoints(); + getLocation(); + } + + void readyWayPoints() { + hintTextwayPointStringAll = [ + hintTextwayPoint0, + hintTextwayPoint1, + hintTextwayPoint2, + hintTextwayPoint3, + hintTextwayPoint4, + ]; + allTextEditingPlaces = [ + wayPoint0Controller, + wayPoint1Controller, + wayPoint2Controller, + wayPoint3Controller, + wayPoint4Controller, + ]; + currentLocationToFormPlacesAll = [ + currentLocationToFormPlaces0, + currentLocationToFormPlaces1, + currentLocationToFormPlaces2, + currentLocationToFormPlaces3, + currentLocationToFormPlaces4, + ]; + placeListResponseAll = [ + wayPoint0, + wayPoint1, + wayPoint2, + wayPoint3, + wayPoint4 + ]; + startLocationFromMapAll = [ + startLocationFromMap0, + startLocationFromMap1, + startLocationFromMap2, + startLocationFromMap3, + startLocationFromMap4, + ]; + currentLocationStringAll = [ + currentLocationString0, + currentLocationString1, + currentLocationString2, + currentLocationString3, + currentLocationString4, + ]; + placesCoordinate = [ + placesCoordinate0, + placesCoordinate1, + placesCoordinate2, + placesCoordinate3, + placesCoordinate4, + ]; + update(); + } + + void removeStop(Map stop) { + stopPoints.remove(stop); + update(); + } + + Future savePlaceToServer( + String latitude, String longitude, String name, String rate) async { + var data = { + 'latitude': latitude, + 'longitude': longitude, + 'name': name, + 'rate': rate, + }; + try { + CRUD().post( + link: AppLink.savePlacesServer, + payload: data, + ); + } catch (e) { + Log.print('Error: $e'); + } + } + + Future getLocation() async { + Log.print('🛰️ getLocation() called'); + permissionGranted = await location.hasPermission(); + if (permissionGranted == PermissionStatus.denied) { + permissionGranted = await location.requestPermission(); + if (permissionGranted != PermissionStatus.granted) { + return; + } + } + + // Pre-populate with last known position for instant loading + try { + Position? lastPosition = await Geolocator.getLastKnownPosition(); + if (lastPosition != null) { + passengerLocation = + LatLng(lastPosition.latitude, lastPosition.longitude); + newStartPointLocation = passengerLocation; + newMyLocation = passengerLocation; + Log.print( + '📍 Pre-populated location from last known: $passengerLocation'); + } + } catch (e) { + Log.print('⚠️ Error getting last known position: $e'); + } + + LocationData? _locationData; + try { + _locationData = await location.getLocation().timeout( + const Duration(seconds: 5), + onTimeout: () { + Log.print("⚠️ Location fetch timed out after 5s."); + return LocationData.fromMap({ + "latitude": passengerLocation.latitude, + "longitude": passengerLocation.longitude, + "speed": 0.0 + }); + }, + ); + } catch (e) { + Log.print("⚠️ Error fetching location: $e"); + } + + if (_locationData == null) { + isLoading = false; + update(); + return; + } + passengerLocation = + (_locationData.latitude != null && _locationData.longitude != null + ? LatLng(_locationData.latitude!, _locationData.longitude!) + : const LatLng(32, 34)); + + newStartPointLocation = passengerLocation; + newMyLocation = passengerLocation; + + if (Get.isRegistered()) { + final rideLifecycle = Get.find(); + rideLifecycle.getLocationArea( + passengerLocation.latitude, passengerLocation.longitude); + rideLifecycle.resetNoRideSearch(); + } + + try { + getReverseGeocoding(passengerLocation).then((address) { + currentLocationString = address; + update(); + }); + } catch (e) { + Log.print('Error resolving current location: $e'); + } + + OfflineMapService.instance + .downloadRegion(passengerLocation, radiusKm: 10.0); + + try { + final mapEngine = Get.find(); + if (mapEngine.mapController != null) { + mapEngine.mapController!.animateCamera( + CameraUpdate.newLatLng(passengerLocation), + ); + } + } catch (e) { + Log.print('Error animating camera to passenger location: $e'); + } + + speed = _locationData.speed ?? 0.0; + isLoading = false; + update(); + } + + void getCurrentLocationFormString() async { + currentLocationToFormPlaces = true; + currentLocationString = 'Waiting for your location'.tr; + await getLocation(); + currentLocationString = passengerLocation.toString(); + newStartPointLocation = passengerLocation; + update(); + } + + Future getPlaces() async { + final q = placeDestinationController.text.trim(); + if (q.isEmpty || q.length < 3) { + placesDestination = []; + update(); + return; + } + + final lat = passengerLocation.latitude; + final lng = passengerLocation.longitude; + final country = CountryPolygons.getCountryName(passengerLocation); + + try { + final url = + '${AppLink.searchGeocoding}?q=${Uri.encodeComponent(q)}&lat=$lat&lng=$lng&radius=15000&country=$country'; + final response = await CRUD().getMapSaas(link: url); + + if (response != null && response['results'] is List) { + List results = List.from(response['results']); + final List filteredResults = []; + final Set seenPlaces = {}; + + for (final p in results) { + final name = p['name_ar'] ?? p['name'] ?? ''; + final district = p['district'] ?? ''; + final plat = p['latitude']?.toString() ?? '0'; + final plng = p['longitude']?.toString() ?? '0'; + + final dedupeKey = + "${name.trim().toLowerCase()}_${district.trim().toLowerCase()}"; + + if (!seenPlaces.contains(dedupeKey)) { + seenPlaces.add(dedupeKey); + + p['distanceKm'] = (p['distance'] as num).toDouble() / 1000.0; + p['latitude'] = plat; + p['longitude'] = plng; + p['name'] = name; + p['address'] = p['full_address'] ?? + (district.isNotEmpty + ? "$district، ${p['governorate'] ?? ''}" + : (p['governorate'] ?? '')); + + filteredResults.add(p); + } + } + + placesDestination = filteredResults; + update(); + } + } catch (e) { + Log.print('Exception in getPlaces: $e'); + } + } + + Future getPlacesStart() async { + final q = placeStartController.text.trim(); + if (q.isEmpty || q.length < 3) { + placesStart = []; + update(); + return; + } + + final lat = passengerLocation.latitude; + final lng = passengerLocation.longitude; + final country = CountryPolygons.getCountryName(passengerLocation); + + try { + final url = + '${AppLink.searchGeocoding}?q=${Uri.encodeComponent(q)}&lat=$lat&lng=$lng&radius=15000&country=$country'; + final response = await CRUD().getMapSaas(link: url); + + if (response != null && response['results'] is List) { + List list = List.from(response['results']); + for (final p in list) { + p['distanceKm'] = (p['distance'] as num).toDouble() / 1000.0; + p['latitude'] = p['latitude'].toString(); + p['longitude'] = p['longitude'].toString(); + p['name'] = p['name_ar'] ?? p['name'] ?? ''; + p['address'] = p['full_address'] ?? + (p['district'] != null + ? "${p['district']}، ${p['governorate'] ?? ''}" + : (p['governorate'] ?? '')); + } + placesStart = list; + update(); + } + } catch (e) { + Log.print('Exception in getPlacesStart: $e'); + } + } + + Future getPlacesListsWayPoint(int index) async { + final q = wayPoint0Controller.text.trim(); + if (q.length < 3) return; + + final lat = passengerLocation.latitude; + final lng = passengerLocation.longitude; + final country = CountryPolygons.getCountryName(passengerLocation); + + try { + final url = + '${AppLink.searchGeocoding}?q=${Uri.encodeComponent(q)}&lat=$lat&lng=$lng&radius=15000&country=$country'; + final response = await CRUD().getMapSaas(link: url); + + if (response != null && response['results'] is List) { + List list = List.from(response['results']); + for (final p in list) { + p['distanceKm'] = (p['distance'] as num).toDouble() / 1000.0; + p['latitude'] = p['latitude'].toString(); + p['longitude'] = p['longitude'].toString(); + p['name'] = p['name_ar'] ?? p['name'] ?? ''; + p['address'] = p['full_address'] ?? + (p['district'] != null + ? "${p['district']}، ${p['governorate'] ?? ''}" + : (p['governorate'] ?? '')); + } + wayPoint0 = list; + placeListResponseAll[index] = list; + update(); + } + } catch (e) { + Log.print('Error fetching places in WayPoint: $e'); + } + } + + Future getReverseGeocoding(LatLng location) async { + final lat = location.latitude; + final lng = location.longitude; + final url = '${AppLink.reverseGeocoding}?lat=$lat&lng=$lng'; + + try { + final response = await CRUD().getMapSaas(link: url); + + if (response != null && response is List && response.isNotEmpty) { + final data = response[0]; + String name = data['name_ar'] ?? data['name'] ?? 'Unknown Location'.tr; + return name; + } + return 'Unknown Location'.tr; + } catch (e) { + Log.print('ReverseGeocoding Exception: $e'); + return 'Unknown Location'.tr; + } + } + + void updateCurrentLocationFromCamera(LatLng target) { + Log.print('📍 updateCurrentLocationFromCamera: $target'); + newMyLocation = target; + + if (startLocationFromMap == true) { + Log.print('📍 Updating startLocationFromMap to $target'); + newStartPointLocation = target; + } else if (passengerStartLocationFromMap == true) { + Log.print('📍 Updating passengerStartLocationFromMap to $target'); + newStartPointLocation = target; + } + + int waypointsLength = Get.find().wayPoints.length; + if (waypointsLength > 0 && + wayPointIndex >= 0 && + wayPointIndex < placesCoordinate.length) { + Log.print('📍 Updating wayPointIndex $wayPointIndex to $target'); + placesCoordinate[wayPointIndex] = + '${target.latitude},${target.longitude}'; + } + if (Get.isRegistered()) { + final rideLifecycle = Get.find(); + rideLifecycle.getLocationArea(target.latitude, target.longitude); + rideLifecycle.resetNoRideSearch(); + } + update(); + } + + void onCameraMoveThrottled(CameraPosition pos) { + _camThrottle?.cancel(); + _camThrottle = Timer(const Duration(milliseconds: 160), () { + Log.print('📸 onCameraMoveThrottled: ${pos.target}'); + int waypointsLength = Get.find().wayPoints.length; + int index = wayPointIndex; + if (waypointsLength > 0 && index < placesCoordinate.length) { + placesCoordinate[index] = + '${pos.target.latitude},${pos.target.longitude}'; + } + newMyLocation = pos.target; + }); + } + + void convertHintTextPlaces(int index, var res) { + if (placeListResponseAll[index].isEmpty) { + placeListResponseAll[index] = res; + hintTextwayPointStringAll[index] = 'Search for your Start point'.tr; + update(); + } else { + hintTextwayPointStringAll[index] = res['name']; + currentLocationStringAll[index] = res['name']; + placesCoordinate[index] = + '${res['geometry']['location']['lat']},${res['geometry']['location']['lng']}'; + placeListResponseAll[index] = []; + allTextEditingPlaces[index].clear(); + update(); + Get.back(); + } + } + + void convertHintTextDestinationNewPlaces(int index) { + if (placesDestination.isEmpty) { + hintTextDestinationPoint = 'Search for your destination'.tr; + update(); + } else { + var res = placesDestination[index]; + hintTextDestinationPoint = res['displayName']?['text'] ?? + res['formattedAddress'] ?? + res['name'] ?? + 'Unknown Place'; + double? lat = res['location']?['latitude'] ?? + double.tryParse(res['latitude']?.toString() ?? ''); + double? lng = res['location']?['longitude'] ?? + double.tryParse(res['longitude']?.toString() ?? ''); + + if (lat != null && lng != null) { + newMyLocation = LatLng(lat, lng); + final mapEngine = Get.find(); + mapEngine.mapController + ?.animateCamera(CameraUpdate.newLatLngZoom(newMyLocation, 16)); + } + update(); + } + } + + void convertHintTextDestinationNewPlacesFromRecent( + List recentLocations, int index) { + hintTextDestinationPoint = recentLocations[index]['name']; + double lat = recentLocations[index]['latitude']; + double lng = recentLocations[index]['longitude']; + newMyLocation = LatLng(lat, lng); + + final mapEngine = Get.find(); + mapEngine.mapController + ?.animateCamera(CameraUpdate.newLatLngZoom(newMyLocation, 16)); + update(); + } + + void clearPlacesDestination() { + placesDestination = []; + hintTextDestinationPoint = 'Search for your destination'.tr; + update(); + } + + void clearPlacesStart() { + placesStart = []; + hintTextStartPoint = 'Search for your Start point'.tr; + update(); + } + + void clearPlaces(int index) { + placeListResponseAll[index] = []; + hintTextwayPointStringAll[index] = 'Search for waypoint'.tr; + update(); + } + + Future?> extractCoordinatesFromLinkAsync( + String link) async { + try { + if (link.startsWith('geo:') || link.startsWith('google.navigation:')) { + RegExp regex = RegExp(r'(-?\d+\.\d+)[,/~=](-?\d+\.\d+)'); + var match = regex.firstMatch(link); + if (match != null) { + double lat = double.parse(match.group(1)!); + double lng = double.parse(match.group(2)!); + if (lat > 40 && lat > lng) { + double temp = lat; + lat = lng; + lng = temp; + } + return {'latitude': lat, 'longitude': lng}; + } + } + + int urlStartIndex = link.indexOf(RegExp(r'https?://')); + if (urlStartIndex == -1) return null; + String cleanLink = link.substring(urlStartIndex).trim(); + + Uri uri = Uri.parse(cleanLink); + String finalUrl = cleanLink; + + if (cleanLink.contains('goo.gl') || + cleanLink.contains('maps.google.com')) { + try { + var response = + await http.get(uri).timeout(const Duration(seconds: 5)); + finalUrl = response.request?.url.toString() ?? cleanLink; + } catch (e) { + Log.print('Redirect logic failed, using original: $e'); + } + } + + RegExp regex = RegExp(r'(-?\d+\.\d+)[,/~](-?\d+\.\d+)'); + var match = regex.firstMatch(finalUrl); + + if (match != null) { + double lat = double.parse(match.group(1)!); + double lng = double.parse(match.group(2)!); + + if (lat > 40 && lat > lng) { + Log.print("⚠️ Detected Swapped Coordinates in Link. Correcting..."); + double temp = lat; + lat = lng; + lng = temp; + } + + return { + 'latitude': lat, + 'longitude': lng, + }; + } + } catch (e) { + Log.print('Error parsing location link: $e'); + } + return null; + } + + void handleWhatsAppLink(String link) async { + Map? coordinates = + await extractCoordinatesFromLinkAsync(link); + + if (coordinates != null) { + latitudeWhatsApp = coordinates['latitude']!; + longitudeWhatsApp = coordinates['longitude']!; + Log.print( + 'Extracted coordinates: Lat: $latitudeWhatsApp, Long: $longitudeWhatsApp'); + } else { + Log.print('Failed to extract coordinates from the link'); + } + } + + void goToWhatappLocation() async { + if (sosFormKey.currentState!.validate()) { + Map? coordinates = + await extractCoordinatesFromLinkAsync(whatsAppLocationText.text); + + if (coordinates != null) { + latitudeWhatsApp = coordinates['latitude']!; + longitudeWhatsApp = coordinates['longitude']!; + + Log.print( + '📍 Final Coordinates for OSM: Lat: $latitudeWhatsApp, Lng: $longitudeWhatsApp'); + + final mapEngine = Get.find(); + mapEngine.changeIsWhatsAppOrder(true); + Get.back(); + + myDestination = LatLng(latitudeWhatsApp, longitudeWhatsApp); + + if (passengerLocation != null) { + await mapEngine.mapController?.animateCamera(CameraUpdate.newLatLng( + LatLng(passengerLocation.latitude, passengerLocation.longitude))); + } + + mapEngine.changeMainBottomMenuMap(); + passengerStartLocationFromMap = true; + mapEngine.isPickerShown = true; + update(); + } else { + mySnackbarWarning('لم نتمكن من استخراج الموقع من الرابط'); + } + } + } + + void addMenuWaypoint() { + if (activeMenuWaypointCount >= 2) return; + activeMenuWaypointCount++; + final mapEngine = Get.find(); + mapEngine.mainBottomMenuMapHeight = + Get.height * .6 + (activeMenuWaypointCount * 56); + update(); + } + + void removeMenuWaypoint(int index) { + if (index < 0 || index >= 2) return; + if (index == 0 && activeMenuWaypointCount == 2) { + menuWaypoints[0] = menuWaypoints[1]; + menuWaypointNames[0] = menuWaypointNames[1]; + } + menuWaypoints[activeMenuWaypointCount - 1] = null; + menuWaypointNames[activeMenuWaypointCount - 1] = ''; + activeMenuWaypointCount--; + final mapEngine = Get.find(); + mapEngine.mainBottomMenuMapHeight = + Get.height * .6 + (activeMenuWaypointCount * 56); + update(); + } + + void clearAllMenuWaypoints() { + menuWaypoints = [null, null]; + menuWaypointNames = ['', '']; + activeMenuWaypointCount = 0; + isPickingWaypoint = false; + pickingWaypointIndex = -1; + update(); + } + + void startPickingWaypointOnMap(int index) { + pickingWaypointIndex = index; + isPickingWaypoint = true; + final mapEngine = Get.find(); + mapEngine.isPickerShown = true; + mapEngine.heightPickerContainer = 150; + mapEngine.isMainBottomMenuMap = true; + mapEngine.mainBottomMenuMapHeight = Get.height * .22; + update(); + } + + void setMenuWaypointFromMap(int index, LatLng position) { + Log.print('📍 setMenuWaypointFromMap called: index=$index, pos=$position'); + if (index < 0 || index >= 2) return; + menuWaypoints[index] = position; + menuWaypointNames[index] = + '${position.latitude.toStringAsFixed(4)}, ${position.longitude.toStringAsFixed(4)}'; + isPickingWaypoint = false; + pickingWaypointIndex = -1; + final mapEngine = Get.find(); + mapEngine.isPickerShown = false; + mapEngine.isMainBottomMenuMap = false; + mapEngine.mainBottomMenuMapHeight = + Get.height * .6 + (activeMenuWaypointCount * 56); + update(); + } + + void setMenuWaypointFromSearch(int index, LatLng pos, String name) { + if (index < 0 || index >= 2) return; + menuWaypoints[index] = pos; + menuWaypointNames[index] = name; + update(); + } + + String buildOsrmWaypointCoords() { + String coords = ''; + for (int i = 0; i < activeMenuWaypointCount; i++) { + final wp = menuWaypoints[i]; + if (wp != null) { + coords += ';${wp.longitude},${wp.latitude}'; + } + } + return coords; + } + + void changeHeightPointsPageForRider() { + final mapEngine = Get.find(); + mapEngine.isPointsPageForRider = !mapEngine.isPointsPageForRider; + mapEngine.heightPointsPageForRider = + mapEngine.isPointsPageForRider == true ? Get.height : 0; + update(); + } + + getCoordinateFromMapWayPoints(int index) { + placesCoordinate[index] = newStartPointLocation.toString(); + update(); + } + + void addWaypoint(Map placeDetails) { + waypoints.add(placeDetails); + update(); + } + + void removeWaypoint(int index) { + if (index >= 0 && index < waypoints.length) { + waypoints.removeAt(index); + update(); + } + } + + getFavioratePlaces() async { + recentPlaces = await sql.getCustomQuery( + 'SELECT * FROM ${TableName.recentLocations} ORDER BY createdAt DESC'); + update(); + } + + void _listenForDeepLink() { + ever(_deepLinkController.rawDeepLink, (String? link) async { + if (link != null && link.isNotEmpty) { + Log.print('📍 MapPassengerController processing link: $link'); + + Map? coordinates = + await extractCoordinatesFromLinkAsync(link); + + if (coordinates != null) { + double destLat = coordinates['latitude']!; + double destLng = coordinates['longitude']!; + myDestination = LatLng(destLat, destLng); + + if (passengerLocation == null || + (passengerLocation.latitude == 0 && + passengerLocation.longitude == 0)) { + Log.print('⏳ Waiting for current location to calculate route...'); + await getLocation(); + } + + if (passengerLocation != null) { + String originStr = + '${passengerLocation.latitude},${passengerLocation.longitude}'; + String destStr = '$destLat,$destLng'; + + Log.print( + '🚀 Drawing route from Deep Link: $originStr to $destStr'); + + final mapEngine = Get.find(); + mapEngine.clearPolyline(); + waypoints.clear(); + clearAllMenuWaypoints(); + + final rideLife = Get.find(); + await rideLife.getDirectionMap(originStr, destStr); + + mapEngine.isBottomSheetShown = true; + mapEngine.heightBottomSheetShown = 250; + update(); + + Get.snackbar( + 'Location Received'.tr, + 'Route and prices have been calculated successfully!'.tr, + backgroundColor: AppColor.greenColor, + colorText: Colors.white, + ); + } + } else { + Log.print('⚠️ Could not extract valid coordinates from link: $link'); + } + + _deepLinkController.rawDeepLink.value = null; + } + }); + + if (_deepLinkController.rawDeepLink.value != null && + _deepLinkController.rawDeepLink.value!.isNotEmpty) { + String link = _deepLinkController.rawDeepLink.value!; + _deepLinkController.rawDeepLink.value = null; + + Future.delayed(const Duration(milliseconds: 500), () async { + Log.print( + '📍 MapPassengerController processing link (Cold Start): $link'); + + Map? coordinates = + await extractCoordinatesFromLinkAsync(link); + + if (coordinates != null) { + double destLat = coordinates['latitude']!; + double destLng = coordinates['longitude']!; + myDestination = LatLng(destLat, destLng); + + if (passengerLocation == null || + (passengerLocation.latitude == 0 && + passengerLocation.longitude == 0)) { + await getLocation(); + } + + if (passengerLocation != null) { + String originStr = + '${passengerLocation.latitude},${passengerLocation.longitude}'; + String destStr = '$destLat,$destLng'; + + final mapEngine = Get.find(); + mapEngine.clearPolyline(); + waypoints.clear(); + clearAllMenuWaypoints(); + + final rideLife = Get.find(); + await rideLife.getDirectionMap(originStr, destStr); + + mapEngine.isBottomSheetShown = true; + mapEngine.heightBottomSheetShown = 250; + update(); + } + } + }); + } + } + + // --- Polygon Math and University Check Methods --- + bool isPointInPolygon(LatLng point, List polygon) { + int intersections = 0; + for (int i = 0; i < polygon.length; i++) { + LatLng vertex1 = polygon[i]; + LatLng vertex2 = polygon[(i + 1) % polygon.length]; + + if (_rayIntersectsSegment(point, vertex1, vertex2)) { + intersections++; + } + } + return intersections % 2 != 0; + } + + bool _rayIntersectsSegment(LatLng point, LatLng vertex1, LatLng vertex2) { + double px = point.longitude; + double py = point.latitude; + + double v1x = vertex1.longitude; + double v1y = vertex1.latitude; + double v2x = vertex2.longitude; + double v2y = vertex2.latitude; + + if ((py < v1y && py < v2y) || (py > v1y && py > v2y)) { + return false; + } + + double intersectX = v1x + (py - v1y) * (v2x - v1x) / (v2y - v1y); + return intersectX > px; + } + + String checkPassengerLocation(LatLng passengerLocation, + List> universityPolygons, List universityNames) { + for (int i = 0; i < universityPolygons.length; i++) { + if (isPointInPolygon(passengerLocation, universityPolygons[i])) { + isInUniversity = true; + return "Passenger is in ${universityNames[i]}"; + } + } + return "Passenger is not in any university"; + } + + void getPassengerLocationUniversity() { + passengerLocationStringUnvirsity = checkPassengerLocation( + passengerLocation, + UniversitiesPolygons.universityPolygons, + UniversitiesPolygons.universityNames, + ); + Log.print(passengerLocationStringUnvirsity); + } + + void getMapPointsForAllMethods() async { + final mapEngine = Get.find(); + final rideLife = Get.find(); + + mapEngine.clearPolyline(); + mapEngine.isMarkersShown = false; + mapEngine.isWayPointStopsSheetUtilGetMap = false; + mapEngine.isWayPointSheet = false; + rideLife.durationToRide = 0; + rideLife.distanceOfDestination = 0; + mapEngine.wayPointSheetHeight = 0; + rideLife.remainingTime = 25; + rideLife.haveSteps = true; + + // Filter out empty value + coordinatesWithoutEmpty = + placesCoordinate.where((coord) => coord.isNotEmpty).toList(); + latestPosition = LatLng( + double.parse(coordinatesWithoutEmpty.last.split(',')[0]), + double.parse(coordinatesWithoutEmpty.last.split(',')[1])); + for (var i = 0; i < coordinatesWithoutEmpty.length; i++) { + if ((i + 1) < coordinatesWithoutEmpty.length) { + await rideLife.getMapPoints( + coordinatesWithoutEmpty[i].toString(), + coordinatesWithoutEmpty[i + 1].toString(), + i, + ); + if (i == 0) { + startNameAddress = rideLife.data[0]['start_address']; + } + if (i == coordinatesWithoutEmpty.length - 1) { + endNameAddress = rideLife.data[0]['end_address']; + } + } + } + + if (rideLife.haveSteps) { + String latestWaypoint = + placesCoordinate.lastWhere((coord) => coord.isNotEmpty); + update(); + } + } + + double _haversineKm(double lat1, double lon1, double lat2, double lon2) { + const double r = 6371.0; + double dLat = (lat2 - lat1) * pi / 180.0; + double dLon = (lon2 - lon1) * pi / 180.0; + double a = sin(dLat / 2) * sin(dLat / 2) + + cos(lat1 * pi / 180.0) * + cos(lat2 * pi / 180.0) * + sin(dLon / 2) * + sin(dLon / 2); + double c = 2 * atan2(sqrt(a), sqrt(1 - a)); + return r * c; + } + + double _kmToLatDelta(double km) { + return km / 111.0; + } + + double _kmToLngDelta(double km, double lat) { + return km / (111.0 * cos(lat * pi / 180.0)); + } + + String _buildOsrmWaypointCoords() { + String coords = ''; + for (int i = 0; i < activeMenuWaypointCount; i++) { + final wp = menuWaypoints[i]; + if (wp != null) { + coords += ';${wp.longitude},${wp.latitude}'; + } + } + return coords; + } + + @override + void onClose() { + _camThrottle?.cancel(); + super.onClose(); + } +} diff --git a/siro_rider/lib/controller/home/map/map_engine_controller.dart b/siro_rider/lib/controller/home/map/map_engine_controller.dart new file mode 100644 index 0000000..f4361e6 --- /dev/null +++ b/siro_rider/lib/controller/home/map/map_engine_controller.dart @@ -0,0 +1,809 @@ +import 'dart:async'; +import 'dart:math' show cos, max, min, pi, pow, sqrt; +import 'dart:typed_data'; +import 'package:siro_rider/controller/home/map/ride_lifecycle_controller.dart'; +import 'package:flutter/foundation.dart'; +import 'package:flutter/material.dart'; +import 'package:flutter/services.dart'; +import 'package:geolocator/geolocator.dart'; +import 'package:get/get.dart'; +import 'package:intaleq_maps/intaleq_maps.dart'; +import 'package:image/image.dart' as img; + +import '../../../constant/colors.dart'; +// contains global 'box' +import '../../../print.dart'; +import '../../../views/home/map_widget.dart/cancel_raide_page.dart'; +import 'location_search_controller.dart'; +import 'nearby_drivers_controller.dart'; +import 'ride_lifecycle_controller.dart'; +import '../points_for_rider_controller.dart'; +import '../../../constant/univeries_polygon.dart'; + +class MapEngineController extends GetxController { + IntaleqMapController? mapController; + bool isStyleLoaded = false; + bool isIconsLoaded = false; + + Set markers = {}; + Set polyLines = {}; + List polylineCoordinates = []; + Set polygons = {}; + Set circles = {}; + + LatLngBounds? lastComputedBounds; + bool mapType = false; + bool mapTrafficON = false; + bool isMarkersShown = false; + + String markerIcon = "marker_icon"; + String tripIcon = "trip_icon"; + String startIcon = "start_icon"; + String endIcon = "end_icon"; + String carIcon = "car_icon"; + String motoIcon = "moto_icon"; + String ladyIcon = "lady_icon"; + + double height = 150; + double heightMenu = 0; + double widthMenu = 0; + double heightPickerContainer = 90; + double heightPointsPageForRider = 0; + double mainBottomMenuMapHeight = Get.height * .2; + double wayPointSheetHeight = 0; + bool heightMenuBool = false; + bool isPickerShown = false; + bool isPointsPageForRider = false; + bool isBottomSheetShown = false; + bool reloadStartApp = false; + bool isCancelRidePageShown = false; + bool isCashConfirmPageShown = false; + bool isPaymentMethodPageShown = false; + bool isRideFinished = false; + bool rideConfirm = false; + bool isMainBottomMenuMap = true; + + bool isWayPointSheet = false; + bool isWayPointStopsSheet = false; + bool isWayPointStopsSheetUtilGetMap = false; + double heightBottomSheetShown = 0; + double cashConfirmPageShown = 250; + double widthMapTypeAndTraffic = 50; + double paymentPageShown = Get.height * .6; + + bool isAnotherOreder = false; + bool isWhatsAppOrder = false; + + Map _animationTimers = {}; + final int updateIntervalMs = 100; + final double minMovementThreshold = 1.0; + + void onMapCreated(IntaleqMapController controller) { + mapController = controller; + update(); + } + + void onStyleLoaded() async { + Log.print('🗺️ Intaleq Map Style Loaded. Initializing...'); + isStyleLoaded = true; + await _loadMapIcons(); + + final locationSearch = Get.find(); + Get.find().reinit(); + + if (mapController != null) { + if (markers.isNotEmpty && lastComputedBounds != null) { + await _safeAnimateCameraBounds(lastComputedBounds); + } else { + mapController!.animateCamera( + CameraUpdate.newLatLng(locationSearch.passengerLocation), + ); + } + } + update(); + } + + Future _safeAnimateCameraBounds(LatLngBounds? bounds, + {double left = 60, + double top = 60, + double right = 60, + double bottom = 60}) async { + if (bounds == null || mapController == null) return; + + try { + if (bounds.northeast.latitude == bounds.southwest.latitude && + bounds.northeast.longitude == bounds.southwest.longitude) { + Log.print( + '⚠️ _safeAnimateCameraBounds: Bounds are a single point, zooming to point instead.'); + await mapController + ?.animateCamera(CameraUpdate.newLatLngZoom(bounds.northeast, 15)); + return; + } + + await Future.delayed(const Duration(milliseconds: 200)); + + await mapController?.animateCamera( + CameraUpdate.newLatLngBounds( + bounds, + left: left, + top: top, + right: right, + bottom: bottom, + ), + ); + } catch (e) { + Log.print('❌ _safeAnimateCameraBounds CRASH PREVENTED: $e'); + try { + await mapController + ?.animateCamera(CameraUpdate.newLatLngZoom(bounds.northeast, 14)); + } catch (_) {} + } + } + + Future _loadMapIcons() async { + isIconsLoaded = false; + for (int i = 0; i < 15; i++) { + if (mapController != null && isStyleLoaded) break; + await Future.delayed(const Duration(milliseconds: 200)); + } + + if (mapController == null || !isStyleLoaded) { + Log.print( + '⚠️ _loadMapIcons: mapController or style not ready. Icons may not load.'); + } + + await _addMapImage(startIcon, 'assets/images/A.png'); + await _addMapImage(endIcon, 'assets/images/b.png'); + await _addMapImage(carIcon, 'assets/images/car.png'); + await _addMapImage(motoIcon, 'assets/images/moto.png'); + await _addMapImage(ladyIcon, 'assets/images/lady.png'); + await _addMapImage('picker_icon', 'assets/images/picker.png'); + await _addMapImage('orange_marker', 'assets/images/moto1.png'); + await _addMapImage('violet_marker', 'assets/images/lady1.png'); + + isIconsLoaded = true; + markers = markers.map((m) => m.copyWith()).toSet(); + update(); + + if (Get.isRegistered()) { + Get.find() + .getCarsLocationByPassengerAndReloadMarker(); + } + } + + Future _addMapImage(String id, String path) async { + try { + final ByteData bytes = await rootBundle.load(path); + final size = _getImageSize(id); + if (size != null && (id == carIcon || id == motoIcon || id == ladyIcon)) { + final resized = await _resizeImage(bytes.buffer.asUint8List(), size); + await mapController?.addImage(id, resized); + Log.print( + 'delimited: successfully added resized map image: $id (${size}x${size})'); + } else { + await mapController?.addImage(id, bytes.buffer.asUint8List()); + Log.print('delimited: successfully added map image: $id'); + } + } catch (e) { + Log.print('❌ Error loading map icon $id: $e'); + } + } + + int? _getImageSize(String id) { + if (id == carIcon || id == motoIcon || id == ladyIcon) return 120; + return null; + } + + Future _resizeImage(Uint8List bytes, int size) async { + return await compute((Uint8List data) { + final image = img.decodeImage(data); + if (image == null) return data; + final resized = img.copyResize(image, width: size, height: size); + return Uint8List.fromList(img.encodePng(resized)); + }, bytes); + } + + void clearPolyline() { + polyLines.clear(); + update(); + } + + LatLngBounds calculateBounds(double lat, double lng, double radiusInMeters) { + const double earthRadius = 6378137.0; + + double latDelta = (radiusInMeters / earthRadius) * (180 / pi); + double lngDelta = + (radiusInMeters / (earthRadius * cos(pi * lat / 180))) * (180 / pi); + + double minLat = lat - latDelta; + double maxLat = lat + latDelta; + + double minLng = lng - lngDelta; + double maxLng = lng + lngDelta; + + minLat = max(-90.0, minLat); + maxLat = min(90.0, maxLat); + + minLng = (minLng + 180) % 360 - 180; + maxLng = (maxLng + 180) % 360 - 180; + + if (minLng > maxLng) { + double temp = minLng; + minLng = maxLng; + maxLng = temp; + } + + return LatLngBounds( + southwest: LatLng(minLat, minLng), + northeast: LatLng(maxLat, maxLng), + ); + } + + Future playRouteAnimation( + List coords, LatLngBounds? bounds) async { + const List segmentColors = [ + Color(0xFF109642), // Green + Color(0xFFF59E0B), // Amber + Color(0xFF7C3AED), // Purple + Color(0xFFEF4444), // Red + ]; + + Set newPolylines = {}; + final locationSearch = Get.find(); + + if (locationSearch.activeMenuWaypointCount > 0) { + List splitIndices = []; + for (int w = 0; w < locationSearch.activeMenuWaypointCount; w++) { + final wp = locationSearch.menuWaypoints[w]; + if (wp == null) continue; + int bestIdx = 0; + double bestDist = double.infinity; + for (int j = 0; j < coords.length; j++) { + final dx = coords[j].latitude - wp.latitude; + final dy = coords[j].longitude - wp.longitude; + final d = dx * dx + dy * dy; + if (d < bestDist) { + bestDist = d; + bestIdx = j; + } + } + splitIndices.add(bestIdx); + } + splitIndices.sort(); + + List boundaries = [0, ...splitIndices, coords.length - 1]; + for (int s = 0; s < boundaries.length - 1; s++) { + int from = boundaries[s]; + int to = boundaries[s + 1] + 1; + if (to > coords.length) to = coords.length; + if (from >= to - 1) continue; + final segCoords = coords.sublist(from, to); + if (segCoords.length < 2) continue; + final color = segmentColors[s % segmentColors.length]; + + newPolylines.add(Polyline( + polylineId: PolylineId('segment_$s'), + points: segCoords, + color: color, + width: 6, + )); + } + } else { + newPolylines.add(Polyline( + polylineId: const PolylineId('route_primary'), + points: coords, + color: AppColor.primaryColor, + width: 6, + )); + } + + polyLines = newPolylines; + update(); + + Log.print( + '🗺️ Drawing ${markers.length} markers + ${polyLines.length} polylines on map'); + + if (bounds != null) { + await _safeAnimateCameraBounds(bounds); + } + } + + void _fitCameraToPoints(LatLng p1, LatLng p2) async { + if (mapController == null) return; + + if (p1.latitude == p2.latitude && p1.longitude == p2.longitude) { + try { + mapController?.animateCamera(CameraUpdate.newLatLngZoom(p1, 17)); + } catch (e) { + Log.print("Error animating to single point: $e"); + } + return; + } + + double minLat = min(p1.latitude, p2.latitude); + double maxLat = max(p1.latitude, p2.latitude); + double minLng = min(p1.longitude, p2.longitude); + double maxLng = max(p1.longitude, p2.longitude); + + if ((maxLat - minLat).abs() < 0.002 && (maxLng - minLng).abs() < 0.002) { + try { + mapController?.animateCamera(CameraUpdate.newLatLngZoom(p1, 16)); + } catch (e) { + Log.print("Error animating to single point: $e"); + } + return; + } + + double padding = 50.0; + + try { + await mapController?.animateCamera( + CameraUpdate.newLatLngBounds( + LatLngBounds( + southwest: LatLng(minLat, minLng), + northeast: LatLng(maxLat, maxLng), + ), + left: padding, + top: padding, + right: padding, + bottom: padding, + ), + ); + } catch (e) { + Log.print("Error animating bounds: $e"); + try { + LatLng center = LatLng((minLat + maxLat) / 2, (minLng + maxLng) / 2); + mapController?.animateCamera(CameraUpdate.newLatLngZoom(center, 14)); + } catch (_) {} + } + } + + void fitCameraToPoints(LatLng p1, LatLng p2) { + _fitCameraToPoints(p1, p2); + } + + void clearMarkersExceptStartEndAndDriver() { + const String currentDriverMarkerId = 'assigned_driver_marker'; + markers.removeWhere((marker) { + String id = marker.markerId.value; + if (id == 'start') return false; + if (id == 'end') return false; + if (id == currentDriverMarkerId) return false; + return true; + }); + update(); + } + + void clearMarkersExceptStartEnd() { + markers.removeWhere((marker) { + String id = marker.markerId.value; + return id != 'start' && id != 'end'; + }); + update(); + } + + void _updateMarkerPosition( + LatLng newPosition, double newHeading, String icon) { + const String markerId = 'driverToPassengers'; + final mId = MarkerId(markerId); + final existingMarker = markers.cast().firstWhere( + (m) => m?.markerId == mId, + orElse: () => null, + ); + + if (existingMarker != null) { + _smoothlyUpdateMarker(existingMarker, newPosition, newHeading, icon); + } else { + markers = { + ...markers, + Marker( + markerId: mId, + position: newPosition, + rotation: newHeading, + icon: InlqBitmap.fromStyleImage(icon), + anchor: const Offset(0.5, 0.5), + ), + }; + update(); + } + mapController?.animateCamera(CameraUpdate.newLatLng(newPosition)); + } + + void updateMarkerPosition( + LatLng newPosition, double newHeading, String icon) { + _updateMarkerPosition(newPosition, newHeading, icon); + } + + void _smoothlyUpdateMarker( + Marker oldMarker, LatLng newPosition, double newHeading, String icon) { + double distance = Geolocator.distanceBetween( + oldMarker.position.latitude, + oldMarker.position.longitude, + newPosition.latitude, + newPosition.longitude); + + if (distance < 2.0) return; + + final MarkerId markerIdKey = oldMarker.markerId; + _animationTimers[markerIdKey.value]?.cancel(); + + int ticks = 0; + const int totalSteps = 20; + const int stepDuration = 50; + + double latStep = + (newPosition.latitude - oldMarker.position.latitude) / totalSteps; + double lngStep = + (newPosition.longitude - oldMarker.position.longitude) / totalSteps; + double headingStep = (newHeading - oldMarker.rotation) / totalSteps; + + LatLng currentPos = oldMarker.position; + double currentHeading = oldMarker.rotation; + + _animationTimers[markerIdKey.value] = + Timer.periodic(const Duration(milliseconds: stepDuration), (timer) { + ticks++; + + currentPos = + LatLng(currentPos.latitude + latStep, currentPos.longitude + lngStep); + currentHeading += headingStep; + + final updatedMarker = oldMarker.copyWith( + position: currentPos, + rotation: currentHeading, + icon: InlqBitmap.fromStyleImage(icon), + ); + + markers = { + ...markers.where((m) => m.markerId != markerIdKey), + updatedMarker, + }; + + if (mapController != null) { + mapController!.animateCamera(CameraUpdate.newLatLng(currentPos)); + } + + update(); + + if (ticks >= totalSteps) { + timer.cancel(); + _animationTimers.remove(markerIdKey.value); + } + }); + } + + // تحديث موقع العلامة (Marker) واتجاهها بسلاسة على الخريطة. + // تحسب الدالة المسافة بين الموقع الحالي والجديد؛ وإذا كانت أكبر من مترين، + // تقوم بتقسيم الحركة والدوران إلى 20 خطوة متباعدة بـ 50 مللي ثانية (إجمالي ثانية واحدة). + // يتم تحديث موضع العلامة وتحريك الكاميرا تدريجياً لتبدو حركة السيارة انسيابية. + void smoothlyUpdateMarker( + Marker oldMarker, LatLng newPosition, double newHeading, String icon) { + _smoothlyUpdateMarker(oldMarker, newPosition, newHeading, icon); + } + + void changeBottomSheetShown({bool? forceValue}) { + if (forceValue != null) { + isBottomSheetShown = forceValue; + } else { + isBottomSheetShown = !isBottomSheetShown; + } + heightBottomSheetShown = isBottomSheetShown == true ? 250 : 0; + update(); + } + + void changeCashConfirmPageShown() { + isCashConfirmPageShown = !isCashConfirmPageShown; + final rideLife = Get.find(); + rideLife.isCashSelectedBeforeConfirmRide = true; + cashConfirmPageShown = isCashConfirmPageShown == true ? 250 : 0; + update(); + rideLife.update(); + } + + void changePaymentMethodPageShown() { + isPaymentMethodPageShown = !isPaymentMethodPageShown; + paymentPageShown = isPaymentMethodPageShown == true ? Get.height * .6 : 0; + update(); + } + + void changeMapType() { + mapType = !mapType; + update(); + } + + void changeMapTraffic() { + mapTrafficON = !mapTrafficON; + update(); + } + + void changeisAnotherOreder(bool val) { + isAnotherOreder = val; + update(); + } + + void changeIsWhatsAppOrder(bool val) { + isWhatsAppOrder = val; + update(); + } + + void changeCancelRidePageShow() { + showCancelRideBottomSheet(); + isCancelRidePageShown = !isCancelRidePageShown; + update(); + if (Get.isRegistered()) { + Get.find().update(); + } + } + + void getDrawerMenu() { + heightMenuBool = !heightMenuBool; + widthMapTypeAndTraffic = heightMenuBool == true ? 0 : 50; + heightMenu = heightMenuBool == true ? 80 : 0; + widthMenu = heightMenuBool == true ? 110 : 0; + update(); + } + + void changeMainBottomMenuMap() { + if (isWayPointStopsSheetUtilGetMap == true) { + changeWayPointSheet(); + } else { + isMainBottomMenuMap = !isMainBottomMenuMap; + mainBottomMenuMapHeight = + isMainBottomMenuMap == true ? Get.height * .22 : Get.height * .6; + isWayPointSheet = false; + if (heightMenuBool == true) { + getDrawerMenu(); + } + Get.find().initilizeGetStorage(); + update(); + } + } + + void downPoints() { + if (Get.find().wayPoints.length < 2) { + isWayPointStopsSheetUtilGetMap = false; + isWayPointSheet = false; + wayPointSheetHeight = isWayPointStopsSheet ? Get.height * .45 : 0; + update(); + } + update(); + } + + void changeWayPointSheet() { + isWayPointSheet = !isWayPointSheet; + wayPointSheetHeight = isWayPointSheet == false ? 0 : Get.height * .45; + update(); + } + + void changeWayPointStopsSheet() { + final locationSearch = Get.find(); + if (locationSearch.wayPointIndex > -1) { + isWayPointStopsSheet = true; + isWayPointStopsSheetUtilGetMap = true; + } + isWayPointStopsSheet = !isWayPointStopsSheet; + wayPointSheetHeight = isWayPointStopsSheet ? Get.height * .45 : 0; + update(); + } + + void changeHeightPlaces() { + final locationSearch = Get.find(); + if (locationSearch.placesDestination.isEmpty) { + height = 0; + update(); + } else { + height = 150; + update(); + } + } + + void changeHeightStartPlaces() { + final locationSearch = Get.find(); + if (locationSearch.placesStart.isEmpty) { + height = 0; + update(); + } else { + height = 150; + update(); + } + } + + void changeHeightPlacesAll(int index) { + final locationSearch = Get.find(); + if (locationSearch.placeListResponseAll[index].isEmpty) { + height = 0; + update(); + } else { + height = 150; + update(); + } + } + + void changeHeightPlaces1() { + final locationSearch = Get.find(); + if (locationSearch.wayPoint1.isEmpty) { + height = 0; + update(); + } else { + height = 150; + update(); + } + } + + void changeHeightPlaces2() { + final locationSearch = Get.find(); + if (locationSearch.wayPoint2.isEmpty) { + height = 0; + update(); + } else { + height = 150; + update(); + } + } + + void changeHeightPlaces3() { + final locationSearch = Get.find(); + if (locationSearch.wayPoint3.isEmpty) { + height = 0; + update(); + } else { + height = 150; + update(); + } + } + + void changeHeightPlaces4() { + final locationSearch = Get.find(); + if (locationSearch.wayPoint4.isEmpty) { + height = 0; + update(); + } else { + height = 150; + update(); + } + } + + void hidePlaces() { + height = 0; + update(); + } + + void changePickerShown() { + isPickerShown = !isPickerShown; + heightPickerContainer = isPickerShown == true ? 150 : 90; + update(); + } + + void _initializePolygons() { + List> universityPolygons = + UniversitiesPolygons.universityPolygons; + + for (int i = 0; i < universityPolygons.length; i++) { + Polygon polygon = Polygon( + polygonId: PolygonId('univ_$i'), + points: universityPolygons[i], + fillColor: Colors.blueAccent.withOpacity(0.2), + strokeColor: Colors.blueAccent, + strokeWidth: 2, + ); + polygons.add(polygon); + } + update(); + } + + void _applyLowEndModeIfNeeded() { + // Placeholder comment from original + } + + Future _initMinimalIcons() async { + // Icons are loaded dynamically + } + + Future _playRouteAnimation( + List coords, LatLngBounds? bounds) async { + const List segmentColors = [ + Color(0xFF109642), // Green + Color(0xFFF59E0B), // Amber + Color(0xFF7C3AED), // Purple + Color(0xFFEF4444), // Red + ]; + + Set newPolylines = {}; + final locSearch = Get.find(); + + if (locSearch.activeMenuWaypointCount > 0) { + List splitIndices = []; + for (int w = 0; w < locSearch.activeMenuWaypointCount; w++) { + final wp = locSearch.menuWaypoints[w]; + if (wp == null) continue; + int bestIdx = 0; + double bestDist = double.infinity; + for (int j = 0; j < coords.length; j++) { + final dx = coords[j].latitude - wp.latitude; + final dy = coords[j].longitude - wp.longitude; + final d = dx * dx + dy * dy; + if (d < bestDist) { + bestDist = d; + bestIdx = j; + } + } + splitIndices.add(bestIdx); + } + splitIndices.sort(); + + List boundaries = [0, ...splitIndices, coords.length - 1]; + for (int s = 0; s < boundaries.length - 1; s++) { + int from = boundaries[s]; + int to = boundaries[s + 1] + 1; + if (to > coords.length) to = coords.length; + if (from >= to - 1) continue; + final segCoords = coords.sublist(from, to); + if (segCoords.length < 2) continue; + final color = segmentColors[s % segmentColors.length]; + + newPolylines.add(Polyline( + polylineId: PolylineId('segment_$s'), + points: segCoords, + color: color, + width: 6, + )); + } + } else { + newPolylines.add(Polyline( + polylineId: const PolylineId('route_primary'), + points: coords, + color: AppColor.primaryColor, + width: 6, + )); + } + + polyLines = newPolylines; + update(); + + Log.print( + '🗺️ Drawing ${markers.length} markers + ${polyLines.length} polylines on map'); + + update(); + + if (bounds != null) { + await _safeAnimateCameraBounds(bounds); + } + } + + void reset() { + isPickerShown = false; + isPointsPageForRider = false; + isBottomSheetShown = false; + isCancelRidePageShown = false; + isCashConfirmPageShown = false; + isPaymentMethodPageShown = false; + isRideFinished = false; + rideConfirm = false; + isMainBottomMenuMap = true; + + isWayPointSheet = false; + isWayPointStopsSheet = false; + isWayPointStopsSheetUtilGetMap = false; + + heightBottomSheetShown = 0; + mainBottomMenuMapHeight = Get.height * 0.22; + wayPointSheetHeight = 0; + + markers.clear(); + polyLines.clear(); + polylineCoordinates.clear(); + + _animationTimers.forEach((key, timer) => timer.cancel()); + _animationTimers.clear(); + + update(); + } + + @override + void onClose() { + _animationTimers.forEach((key, timer) => timer.cancel()); + _animationTimers.clear(); + mapController = null; + super.onClose(); + } +} diff --git a/siro_rider/lib/controller/home/map/map_screen_binding.dart b/siro_rider/lib/controller/home/map/map_screen_binding.dart new file mode 100644 index 0000000..e24f441 --- /dev/null +++ b/siro_rider/lib/controller/home/map/map_screen_binding.dart @@ -0,0 +1,25 @@ +import 'package:get/get.dart'; + +import 'map_socket_controller.dart'; +import 'map_engine_controller.dart'; +import 'location_search_controller.dart'; +import 'nearby_drivers_controller.dart'; +import 'ride_lifecycle_controller.dart'; +import 'ui_interactions_controller.dart'; + +class MapScreenBinding extends Bindings { + @override + void dependencies() { + // 1. WebSocket Controller: Permanent and immediate + Get.put(MapSocketController()); + + // 2. Core Controllers (initialized when the screen opens or on demand) + Get.lazyPut(() => MapEngineController()); + Get.lazyPut(() => LocationSearchController()); + Get.lazyPut(() => NearbyDriversController()); + + // 3. Lifecycle and UI Interaction Controllers + Get.lazyPut(() => RideLifecycleController()); + Get.lazyPut(() => UiInteractionsController(), fenix: true); + } +} diff --git a/siro_rider/lib/controller/home/map/map_socket_controller.dart b/siro_rider/lib/controller/home/map/map_socket_controller.dart new file mode 100644 index 0000000..3d73bae --- /dev/null +++ b/siro_rider/lib/controller/home/map/map_socket_controller.dart @@ -0,0 +1,326 @@ +import 'dart:async'; +import 'dart:convert'; +import 'package:get/get.dart'; +import 'package:socket_io_client/socket_io_client.dart' as io_client; +import 'package:intaleq_maps/intaleq_maps.dart'; + +import '../../../constant/box_name.dart'; +import '../../../constant/links.dart'; +import '../../../main.dart'; // contains global 'box' +import '../../../print.dart'; +import 'ride_lifecycle_controller.dart'; +import 'nearby_drivers_controller.dart'; +import 'map_engine_controller.dart'; + +class MapSocketController extends GetxController { + late io_client.Socket socket; + bool isSocketConnected = false; + bool _isSocketInitialized = false; + Timer? _heartbeatTimer; + DateTime? _lastSocketLocationTime; + int _socketLocationUpdatesCount = 0; + Timer? _watchdogTimer; + + DateTime? get lastDriverLocationTime => _lastSocketLocationTime; + int get socketLocationUpdatesCount => _socketLocationUpdatesCount; + + void initConnectionWithSocket() { + if (isSocketConnected) return; + + String passengerId = box.read(BoxName.passengerID).toString(); + Log.print("🔌 Initializing Socket for Passenger: $passengerId"); + + socket = io_client.io( + AppLink.serverSocket, + io_client.OptionBuilder() + .setTransports(['websocket']) + .disableAutoConnect() + .setQuery({'id': passengerId}) + .setReconnectionAttempts(20) + .setReconnectionDelay(2000) + .setReconnectionDelayMax(10000) + .enableReconnection() + .setTimeout(20000) + .setExtraHeaders({'Connection': 'Upgrade'}) + .build(), + ); + _isSocketInitialized = true; + + socket.connect(); + + socket.onConnect((_) { + Log.print("✅ Socket Connected Successfully"); + isSocketConnected = true; + _startHeartbeat(); + + final rideLifecycle = Get.find(); + if (rideLifecycle.rideId != 'yet' && rideLifecycle.driverId.isNotEmpty) { + socket.emit('subscribe_driver_location', { + 'ride_id': rideLifecycle.rideId, + 'driver_id': rideLifecycle.driverId, + }); + Log.print("📡 Re-subscribed to driver location after connect"); + } + update(); + }); + + socket.onDisconnect((_) { + Log.print("⚠️ Socket Disconnected — Auto-Reconnect will handle it"); + isSocketConnected = false; + + final rideLifecycle = Get.find(); + if (rideLifecycle.isActiveRideState()) { + Log.print("🔄 Enabling Fast Polling Fallback (4s) until reconnect..."); + rideLifecycle.startMasterTimerWithInterval(4); + } + update(); + }); + + socket.onReconnect((_) { + Log.print("🔁 Socket Reconnected Successfully!"); + isSocketConnected = true; + _startHeartbeat(); + + final rideLifecycle = Get.find(); + if (rideLifecycle.rideId != 'yet' && rideLifecycle.driverId.isNotEmpty) { + socket.emit('subscribe_driver_location', { + 'ride_id': rideLifecycle.rideId, + 'driver_id': rideLifecycle.driverId, + }); + Log.print("📡 Re-subscribed to driver location after reconnect"); + } + + if (rideLifecycle.isActiveRideState()) { + Log.print("✅ Socket back online — stopping Fast Polling Fallback"); + rideLifecycle.cancelMasterTimer(); + } + update(); + }); + + socket.onReconnectAttempt((attemptNumber) { + Log.print("🔄 Socket Reconnect Attempt #$attemptNumber..."); + }); + + socket.onError((error) { + Log.print("❌ Socket Error: $error"); + isSocketConnected = false; + }); + + socket.on('connect_error', (error) { + Log.print("❌ Socket Connect Error: $error"); + isSocketConnected = false; + // في الإصدار 1.0.2 أحياناً auto-reconnect لا يعمل بعد connect_error + // نتأكد يدوياً من إعادة الاتصال + Future.delayed(const Duration(seconds: 3), () { + if (!isSocketConnected && _isSocketInitialized) { + Log.print("🔄 Manual reconnect after connect_error..."); + try { + socket.connect(); + } catch (e) { + Log.print("Manual reconnect error: $e"); + } + } + }); + }); + + socket.on('ride_status_change', (data) { + Log.print("📩 Socket Event: ride_status_change -> $data"); + _handleRideStatusChangeWithSocket(data); + }); + + socket.on('driver_location_update', (data) { + handleDriverLocationUpdate(data); + }); + } + + void _startHeartbeat() { + _heartbeatTimer?.cancel(); + _heartbeatTimer = Timer.periodic(const Duration(seconds: 15), (timer) { + if (isSocketConnected && socket.connected) { + socket.emit('heartbeat', + {'passenger_id': box.read(BoxName.passengerID).toString()}); + } + }); + } + + bool isSocketHealthy() { + if (!isSocketConnected) return false; + if (_lastSocketLocationTime == null) return false; + final diff = DateTime.now().difference(_lastSocketLocationTime!).inSeconds; + return diff < 20; + } + + void _handleRideStatusChangeWithSocket(dynamic data) { + if (data == null || data['status'] == null) return; + + String newStatus = data['status'].toString().toLowerCase(); + Log.print("🔔 Socket Status Update: $newStatus"); + + final rideLifecycle = Get.find(); + + Map? driverInfo; + if (data['driver_info'] != null && data['driver_info'] is Map) { + driverInfo = Map.from(data['driver_info']); + } + + switch (newStatus) { + case 'accepted': + case 'apply': + case 'applied': + rideLifecycle.processRideAcceptance( + driverData: driverInfo, source: "Socket"); + break; + + case 'arrived': + rideLifecycle.processDriverArrival("Socket"); + break; + + case 'started': + case 'begin': + rideLifecycle.processRideBegin(source: "Socket"); + break; + + case 'finished': + case 'ended': + _onRideFinishedWithSocket(data); + break; + + case 'cancelled': + rideLifecycle.processRideCancelledByDriver(data, source: "Socket"); + break; + + case 'no_drivers_found': + rideLifecycle.showNoDriverDialog(); + break; + } + } + + void _onRideFinishedWithSocket(dynamic data) { + Log.print("🏁 Ride Finished (Socket)"); + final rideLifecycle = Get.find(); + + var rawList = data['DriverList']; + List listToSend = []; + + if (rawList != null) { + if (rawList is List) { + listToSend = rawList; + } else if (rawList is String) { + try { + listToSend = jsonDecode(rawList); + } catch (e) { + Log.print("Error decoding DriverList: $e"); + } + } + } + + if (listToSend.isEmpty && data['price'] != null) { + listToSend = [ + rideLifecycle.driverId, + rideLifecycle.rideId, + rideLifecycle.driverToken, + data['price'].toString() + ]; + } + + rideLifecycle.processRideFinished(listToSend, source: "Socket"); + } + + void handleDriverLocationUpdate(dynamic data) { + if (!isSocketConnected || data == null) return; + _lastSocketLocationTime = DateTime.now(); + _socketLocationUpdatesCount++; + + final rideLifecycle = Get.find(); + if (rideLifecycle.driverId.isEmpty && + (data['driver_id'] ?? data['driverId']) != null) { + rideLifecycle.driverId = + (data['driver_id'] ?? data['driverId']).toString(); + } + + if (_socketLocationUpdatesCount >= 3 && + rideLifecycle.locationPollingTimer != null) { + Log.print("✅ Socket delivering locations reliably. Stopping polling."); + rideLifecycle.stopDriverLocationPolling(); + } + + try { + double lat = double.tryParse( + (data['latitude'] ?? data['lat'])?.toString() ?? '0') ?? + 0; + double lng = double.tryParse( + (data['longitude'] ?? data['lng'])?.toString() ?? '0') ?? + 0; + double heading = double.tryParse(data['heading']?.toString() ?? '0') ?? 0; + + if (lat == 0 || lng == 0) return; + + LatLng newPos = LatLng(lat, lng); + + final nearbyDrivers = Get.find(); + if (nearbyDrivers.driverCarsLocationToPassengerAfterApplied.isEmpty) { + nearbyDrivers.driverCarsLocationToPassengerAfterApplied.add(newPos); + } else { + nearbyDrivers.driverCarsLocationToPassengerAfterApplied[0] = newPos; + } + + double speed = double.tryParse(data['speed']?.toString() ?? '0') ?? 0; + rideLifecycle.checkAndRecalculateIfDeviated( + newPos, + heading: heading, + speed: speed, + ); + + final mapEngine = Get.find(); + if (mapEngine.mapController != null) { + double zoom = 16.5; + if (speed > 0) { + zoom = 17.0 - ((speed - 10) / 70) * 2.5; + zoom = zoom.clamp(14.5, 17.0); + } + mapEngine.mapController! + .animateCamera(CameraUpdate.newLatLngZoom(newPos, zoom)); + } + + final dynamic distanceValue = + data['distance_m'] ?? data['distance_meters'] ?? data['distance']; + final double? distanceMeters = + double.tryParse(distanceValue?.toString() ?? ''); + final int? etaSeconds = data['eta_seconds'] == null + ? null + : int.tryParse(data['eta_seconds'].toString()); + final bool hasServerMetrics = (etaSeconds != null && etaSeconds > 0) || + (distanceMeters != null && distanceMeters > 0); + if (hasServerMetrics) { + rideLifecycle.updateDriverRouteMetrics( + etaSeconds: etaSeconds != null && etaSeconds > 0 ? etaSeconds : null, + distanceMeters: distanceMeters, + ); + } + + rideLifecycle.updateDriverMarker(newPos, heading); + rideLifecycle.updateRemainingRoute(newPos, updateEta: !hasServerMetrics); + rideLifecycle.update(); + } catch (e) { + Log.print('Error in handleDriverLocationUpdate: $e'); + } + } + + void disposeRideSocket() { + _heartbeatTimer?.cancel(); + _watchdogTimer?.cancel(); + if (_isSocketInitialized) { + socket.disconnect(); + socket.dispose(); + isSocketConnected = false; + _isSocketInitialized = false; + Log.print("🔌 Socket Disposed"); + } + } + + @override + void onClose() { + disposeRideSocket(); + super.onClose(); + } +} diff --git a/siro_rider/lib/controller/home/map/nearby_drivers_controller.dart b/siro_rider/lib/controller/home/map/nearby_drivers_controller.dart new file mode 100644 index 0000000..f989a30 --- /dev/null +++ b/siro_rider/lib/controller/home/map/nearby_drivers_controller.dart @@ -0,0 +1,475 @@ +import 'dart:async'; +import 'dart:convert'; +import 'dart:math' show Random, atan2, cos, pi, pow, sin, sqrt; +import 'package:flutter/material.dart'; +import 'package:geolocator/geolocator.dart'; +import 'package:get/get.dart'; +import 'package:intaleq_maps/intaleq_maps.dart'; + +import '../../../constant/links.dart'; +import '../../../constant/api_key.dart'; +import '../../../print.dart'; +import '../../functions/crud.dart'; +import 'map_engine_controller.dart'; +import 'location_search_controller.dart'; +import 'ride_lifecycle_controller.dart'; +import '../../../models/model/locations.dart'; +import 'car_location.dart'; +import 'package:device_info_plus/device_info_plus.dart'; + +class NearbyDriversController extends GetxController { + List carsLocationByPassenger = []; + List driverCarsLocationToPassengerAfterApplied = []; + List carLocationsModels = []; + String? currentDriverMarkerId; + bool lowPerf = false; + + dynamic dataCarsLocationByPassenger; + bool noCarString = false; + final double minMovementThreshold = 2.0; + final Map _animationTimers = {}; + + final List> fakeCarData = []; + + Future getCarsLocationByPassengerAndReloadMarker() async { + carsLocationByPassenger = []; + final locSearch = Get.find(); + + if (locSearch.passengerLocation.latitude == 0 && locSearch.passengerLocation.longitude == 0) { + return false; + } + + var res = await CRUD().get( + link: AppLink.getCarsLocationByPassenger, + payload: { + 'lat': locSearch.passengerLocation.latitude.toString(), + 'lng': locSearch.passengerLocation.longitude.toString(), + 'radius': '5', + 'limit': '50', + }, + ); + + if (res == 'failure') { + noCarString = true; + dataCarsLocationByPassenger = 'failure'; + update(); + return false; + } + + noCarString = false; + var responseData = jsonDecode(res); + dataCarsLocationByPassenger = responseData; + + List driversList = []; + if (responseData['status'] == true && responseData['data'] != null) { + driversList = responseData['data']; + } else if (responseData['message'] != null) { + driversList = responseData['message']; + } + + final mapEngine = Get.find(); + + if (driversList.isEmpty) { + carsLocationByPassenger.clear(); + mapEngine.update(); + return false; + } + + carsLocationByPassenger.clear(); + + for (var i = 0; i < driversList.length; i++) { + var carData = driversList[i]; + + double lat = double.tryParse(carData['latitude'].toString()) ?? 0.0; + double lng = double.tryParse(carData['longitude'].toString()) ?? 0.0; + double heading = double.tryParse(carData['heading'].toString()) ?? 0.0; + + if (lat == 0.0 || lng == 0.0) continue; + + String driverId = (carData['driver_id'] ?? carData['id'] ?? '').toString(); + if (driverId.isEmpty || driverId == 'null') continue; + + _updateOrCreateMarker( + driverId, + LatLng(lat, lng), + heading, + _getIconForCar(carData), + ); + } + + mapEngine.update(); + return true; + } + + void _addFakeCarMarkers(LatLng center, int count) { + if (fakeCarData.isEmpty) { + Random random = Random(); + double radiusInKm = 2.5; + + for (int i = 0; i < count; i++) { + double angle = random.nextDouble() * 2 * pi; + double distance = sqrt(random.nextDouble()) * radiusInKm; + + double latOffset = (distance / 111.32); + double lonOffset = + (distance / (111.32 * cos(center.latitude * pi / 180.0))); + + double lat = center.latitude + (latOffset * cos(angle)); + double lon = center.longitude + (lonOffset * sin(angle)); + + double heading = random.nextDouble() * 360; + + fakeCarData.add({ + 'id': 'fake_$i', + 'latitude': lat, + 'longitude': lon, + 'heading': heading, + 'gender': 'Male', + }); + } + } + + for (var carData in fakeCarData) { + _updateOrCreateMarker( + carData['id'].toString(), + LatLng(carData['latitude'], carData['longitude']), + carData['heading'], + _getIconForCar(carData), + ); + } + } + + void addFakeCarMarkers(LatLng center, int count) { + _addFakeCarMarkers(center, count); + } + + Future getNearestDriverByPassengerLocation() async { + final rideLife = Get.find(); + final locSearch = Get.find(); + + if (!rideLife.rideConfirm) { + if (dataCarsLocationByPassenger != 'failure' && + dataCarsLocationByPassenger != null && + dataCarsLocationByPassenger.containsKey('message') && + dataCarsLocationByPassenger['message'] != null && + dataCarsLocationByPassenger['message'].length > 0) { + double nearestDistance = double.infinity; + CarLocation? nearestCar; + + for (var i = 0; + i < dataCarsLocationByPassenger['message'].length; + i++) { + var carLocation = dataCarsLocationByPassenger['message'][i]; + + try { + final distance = Geolocator.distanceBetween( + locSearch.passengerLocation.latitude, + locSearch.passengerLocation.longitude, + double.parse(carLocation['latitude']), + double.parse(carLocation['longitude']), + ); + + int durationToPassenger = (distance / 1000 / 25 * 3600).round(); + update(); + + if (distance < nearestDistance) { + nearestDistance = distance; + + nearestCar = CarLocation( + distance: distance, + duration: durationToPassenger.toDouble(), + id: carLocation['driver_id'], + latitude: double.parse(carLocation['latitude']), + longitude: double.parse(carLocation['longitude']), + ); + update(); + } + } catch (e) { + Log.print('Error calculating distance/duration: $e'); + } + } + return nearestCar; + } + } + return null; + } + + Future getNearestDriverByPassengerLocationAPIGOOGLE() async { + final rideLife = Get.find(); + final mapEngine = Get.find(); + final locSearch = Get.find(); + + if (mapEngine.polyLines.isEmpty || rideLife.totalCostPassenger == 0) { + return null; + } + if (!rideLife.rideConfirm) { + double nearestDistance = double.infinity; + if (dataCarsLocationByPassenger != 'failure' && + dataCarsLocationByPassenger != null && + dataCarsLocationByPassenger.containsKey('message') && + dataCarsLocationByPassenger['message'] != null) { + if (dataCarsLocationByPassenger['message'].length > 0) { + CarLocation? nearestCar; + for (var i = 0; + i < dataCarsLocationByPassenger['message'].length; + i++) { + var carLocation = dataCarsLocationByPassenger['message'][i]; + + update(); + String apiUrl = + '${AppLink.googleMapsLink}distancematrix/json?destinations=${carLocation['latitude']},${carLocation['longitude']}&origins=${locSearch.passengerLocation.latitude},${locSearch.passengerLocation.longitude}&units=metric&key=${AK.mapAPIKEY}'; + var response = await CRUD().getGoogleApi(link: apiUrl, payload: {}); + if (response != null && response['status'] == "OK") { + var data = response; + int distance1 = + data['rows'][0]['elements'][0]['distance']['value']; + rideLife.distanceByPassenger = + data['rows'][0]['elements'][0]['distance']['text']; + rideLife.durationToPassenger = + data['rows'][0]['elements'][0]['duration']['value']; + + Duration durationFromDriverToPassenger = + Duration(seconds: rideLife.durationToPassenger.toInt()); + rideLife.stringRemainingTimeToPassenger = + data['rows'][0]['elements'][0]['duration']['text']; + update(); + if (distance1 < nearestDistance) { + nearestDistance = distance1.toDouble(); + + nearestCar = CarLocation( + distance: distance1.toDouble(), + duration: rideLife.durationToPassenger.toDouble(), + id: carLocation['driver_id'], + latitude: double.parse(carLocation['latitude']), + longitude: double.parse(carLocation['longitude']), + ); + update(); + } + } else { + Log.print('${response?['status']}: error Google distance matrix'); + } + } + return nearestCar; + } + } + } + return null; + } + + Future getCarForFirstConfirm(String carType) async { + bool foundCars = false; + int attempt = 0; + + Timer.periodic(const Duration(seconds: 4), (Timer t) async { + foundCars = await getCarsLocationByPassengerAndReloadMarker(); + Log.print('foundCars: $foundCars'); + + if (foundCars) { + t.cancel(); + } else if (attempt >= 4) { + t.cancel(); + if (!foundCars) { + noCarString = true; + dataCarsLocationByPassenger = 'failure'; + } + update(); + } + attempt++; + }); + } + + void startCarLocationSearch(String carType) { + int searchInterval = 5; + Log.print('searchInterval: $searchInterval'); + int boundIncreaseStep = 2500; + Log.print('boundIncreaseStep: $boundIncreaseStep'); + int maxAttempts = 3; + int maxBoundIncreaseStep = 6000; + int attempt = 0; + Log.print('initial attempt: $attempt'); + + Timer.periodic(Duration(seconds: searchInterval), (Timer timer) async { + Log.print('Current attempt: $attempt'); + bool foundCars = false; + final mapEngine = Get.find(); + if (attempt >= maxAttempts) { + timer.cancel(); + if (foundCars == false) { + noCarString = true; + update(); + } + } else if (mapEngine.reloadStartApp == true) { + Log.print('reloadStartApp: ${mapEngine.reloadStartApp}'); + foundCars = await getCarsLocationByPassengerAndReloadMarker(); + Log.print('foundCars: $foundCars'); + + if (foundCars) { + timer.cancel(); + } else { + attempt++; + Log.print('Incrementing attempt to: $attempt'); + + if (boundIncreaseStep < maxBoundIncreaseStep) { + boundIncreaseStep += 1500; + if (boundIncreaseStep > maxBoundIncreaseStep) { + boundIncreaseStep = maxBoundIncreaseStep; + } + Log.print('New boundIncreaseStep: $boundIncreaseStep'); + } + } + } + }); + } + + String _getIconForCar(Map carData) { + final mapEngine = Get.find(); + if (carData['model'].toString().contains('دراجة')) { + return mapEngine.motoIcon; + } else if (carData['gender'] == 'Female') { + return mapEngine.ladyIcon; + } else { + return mapEngine.carIcon; + } + } + + void _updateOrCreateMarker( + String markerId, LatLng newPosition, double newHeading, String icon) { + final mapEngine = Get.find(); + if (!mapEngine.isIconsLoaded) { + Log.print("⚠️ Skipping drawing marker $markerId because map icons are not fully loaded yet."); + return; + } + final mId = MarkerId(markerId); + final existingMarker = mapEngine.markers.cast().firstWhere( + (m) => m?.markerId == mId, + orElse: () => null, + ); + + if (existingMarker == null) { + mapEngine.markers = { + ...mapEngine.markers, + Marker( + markerId: mId, + position: newPosition, + rotation: newHeading, + icon: InlqBitmap.fromStyleImage(icon), + anchor: const Offset(0.5, 0.5), + ), + }; + mapEngine.update(); + } else { + double distance = Geolocator.distanceBetween( + existingMarker.position.latitude, + existingMarker.position.longitude, + newPosition.latitude, + newPosition.longitude); + if (distance >= minMovementThreshold) { + _smoothlyUpdateMarker(existingMarker, newPosition, newHeading, icon); + } + } + } + + void _smoothlyUpdateMarker( + Marker oldMarker, LatLng newPosition, double newHeading, String icon) { + final mapEngine = Get.find(); + final MarkerId markerIdKey = oldMarker.markerId; + + _animationTimers[markerIdKey.value]?.cancel(); + + int ticks = 0; + const int totalSteps = 20; + const int stepDuration = 50; + + double latStep = + (newPosition.latitude - oldMarker.position.latitude) / totalSteps; + double lngStep = + (newPosition.longitude - oldMarker.position.longitude) / totalSteps; + double headingStep = (newHeading - oldMarker.rotation) / totalSteps; + + LatLng currentPos = oldMarker.position; + double currentHeading = oldMarker.rotation; + + _animationTimers[markerIdKey.value] = + Timer.periodic(const Duration(milliseconds: stepDuration), (timer) { + ticks++; + + currentPos = + LatLng(currentPos.latitude + latStep, currentPos.longitude + lngStep); + currentHeading += headingStep; + + final updatedMarker = oldMarker.copyWith( + position: currentPos, + rotation: currentHeading, + icon: InlqBitmap.fromStyleImage(icon), + ); + + mapEngine.markers = { + ...mapEngine.markers.where((m) => m.markerId != markerIdKey), + updatedMarker, + }; + + if (mapEngine.mapController != null) { + mapEngine.mapController!.animateCamera(CameraUpdate.newLatLng(currentPos)); + } + + mapEngine.update(); + + if (ticks >= totalSteps) { + timer.cancel(); + _animationTimers.remove(markerIdKey.value); + } + }); + } + + double calculateBearing(double lat1, double lon1, double lat2, double lon2) { + double deltaLon = lon2 - lon1; + double y = sin(deltaLon) * cos(lat2); + double x = cos(lat1) * sin(lat2) - sin(lat1) * cos(lat2) * cos(deltaLon); + double bearing = atan2(y, x); + return (bearing * 180 / pi + 360) % 360; + } + + void analyzeBehavior(Position currentPosition, List routePoints) { + double actualBearing = currentPosition.heading; + double expectedBearing = calculateBearing( + routePoints[0].latitude, + routePoints[0].longitude, + routePoints[1].latitude, + routePoints[1].longitude, + ); + + double bearingDifference = (expectedBearing - actualBearing).abs(); + if (bearingDifference > 30) { + Log.print("⚠️ السائق انحرف عن المسار!"); + } + } + + void detectStops(Position currentPosition) { + if (currentPosition.speed < 0.5) { + Log.print("🚦 السائق توقف في موقع غير متوقع!"); + } + } + + Future detectPerfMode() async { + try { + if (GetPlatform.isAndroid) { + final info = await DeviceInfoPlugin().androidInfo; + final sdk = info.version.sdkInt; + final ram = info.availableRamSize; + lowPerf = (sdk < 28) || (ram > 0 && ram < 3 * 1024 * 1024 * 1024); + } else { + lowPerf = false; + } + } catch (_) { + lowPerf = false; + } + update(); + } + + @override + void onClose() { + _animationTimers.forEach((key, timer) => timer.cancel()); + _animationTimers.clear(); + super.onClose(); + } +} diff --git a/siro_rider/lib/controller/home/map/ride_lifecycle_controller.dart b/siro_rider/lib/controller/home/map/ride_lifecycle_controller.dart new file mode 100644 index 0000000..c229ad2 --- /dev/null +++ b/siro_rider/lib/controller/home/map/ride_lifecycle_controller.dart @@ -0,0 +1,4558 @@ +import 'dart:async'; +import 'dart:convert'; +import 'dart:ui'; +import 'dart:math' show cos, max, min, pi, pow, sin, atan2; +import 'package:flutter/foundation.dart'; +import 'package:flutter/material.dart'; +import 'package:flutter/cupertino.dart'; +import 'package:flutter/services.dart'; +import 'package:geolocator/geolocator.dart'; +import 'package:get/get.dart'; +import 'package:intaleq_maps/intaleq_maps.dart'; +import 'package:http/http.dart' as http; +import 'package:intl/intl.dart'; +import '../../../constant/api_key.dart'; +import '../../../services/offline_map_service.dart'; +import '../../../models/model/painter_copoun.dart'; +import '../../../views/widgets/mycircular.dart'; +import '../deep_link_controller.dart'; + +import '../../../constant/box_name.dart'; +import '../../../constant/links.dart'; +import '../../../constant/colors.dart'; +import '../../../constant/style.dart'; +import '../../../constant/country_polygons.dart'; +import '../../../env/env.dart'; +import '../../../main.dart'; // contains global 'box', 'sql' +import '../../../print.dart'; +import '../../../services/pip_service.dart'; +import '../../../services/ride_live_notification.dart'; +import '../../../views/home/map_page_passenger.dart'; +import '../../../views/Rate/rate_captain.dart'; +import '../../../views/Rate/rating_driver_bottom.dart'; +import '../../../views/widgets/mydialoug.dart'; +import '../../../views/widgets/elevated_btn.dart'; +import '../../../views/home/map_widget.dart/car_details_widget_to_go.dart'; +import '../../../views/home/map_widget.dart/select_driver_mishwari.dart'; +import '../../functions/crud.dart'; +import '../../functions/launch.dart'; +import '../../payment/payment_controller.dart'; +import '../points_for_rider_controller.dart'; +import 'map_engine_controller.dart'; +import 'location_search_controller.dart'; +import 'nearby_drivers_controller.dart'; +import 'ui_interactions_controller.dart'; +import 'map_socket_controller.dart'; +import '../decode_polyline_isolate.dart'; +import '../ios_live_activity_service.dart'; +import '../../firebase/local_notification.dart'; +import '../../firebase/notification_service.dart'; +import '../../functions/audio_record1.dart'; +import '../../functions/package_info.dart'; +import '../../functions/secure_storage.dart'; +import '../vip_waitting_page.dart'; +import '../device_performance.dart'; +import 'ride_state.dart'; +import '../../../views/widgets/error_snakbar.dart'; +import 'package:flutter_confetti/flutter_confetti.dart' hide Circle; +import 'package:crypto/crypto.dart'; + +class RideLifecycleController extends GetxController { + // --- Missing variables from monolithic controller --- + String currentRideId = ''; + bool isDrawingRoute = false; + bool isAnotherOreder = false; + bool isWhatsAppOrder = false; + LatLng startLocation = const LatLng(32, 35); + LatLng endLocation = const LatLng(32, 35); + String dynamicApiUrl = 'https://routec.intaleq.xyz/route'; + String? cardNumber; + bool isBeginRideFromDriverRunning = false; + bool isDriversTokensSend = false; + Map rideData = {}; + Map dInfo = {}; + List datadriverCarsLocationToPassengerAfterApplied = []; + double distanceOfTrip = 0.0; + double apiDistanceMeters = 0.0; + double tax = 0.0; + int selectedPassengerCount = 1; + final GlobalKey increaseFeeFormKey = GlobalKey(); + final GlobalKey messagesFormKey = GlobalKey(); + final GlobalKey promoFormKey = GlobalKey(); + String walletStr = '0'; + double walletVal = 0.0; + bool rideConfirm = false; + LatLng driverLocationToPassenger = const LatLng(32, 35); + final TextEditingController messageToDriver = TextEditingController(); + int carsOrder = 0; + + Rx currentRideState = RideState.noRide.obs; + String statusRide = 'wait'; + String statusRideVip = 'wait'; + bool statusRideFromStart = false; + + double distance = 0; + double duration = 0; + int durationToRide = 0; + int remainingTime = 25; + int remainingTimeToPassengerFromDriverAfterApplied = 60; + int remainingTimeDriverWaitPassenger5Minute = 60; + int timeToPassengerFromDriverAfterApplied = 0; + Timer? timerToPassengerFromDriverAfterApplied; + DateTime? _driverEtaUpdatedAt; + int _driverEtaSecondsAtUpdate = 0; + int _driverEtaCountdownTicks = 0; + + bool rideTimerBegin = false; + double progressTimerRideBegin = 0; + int remainingTimeTimerRideBegin = 60; + String stringRemainingTimeRideBegin = ''; + + late String rideId = 'yet'; + late String driverId = ''; + late String make = ''; + late String model = ''; + late String carColor = ''; + late String licensePlate = ''; + late String driverName = ''; + late String passengerName = ''; + late String driverPhone = ''; + late String colorHex = ''; + late String carYear = ''; + late String driverRate = '5.0'; + late String driverToken = ''; + + double kazan = 8; + double totalPassenger = 0; + double totalDriver = 0; + double costDistance = 0; + double costDuration = 0; + double averageDuration = 0; + double totalCostPassenger = 0; + + double totalPassengerSpeed = 0; + double totalPassengerBalash = 0; + double totalPassengerComfort = 0; + double totalPassengerElectric = 0; + double totalPassengerLady = 0; + double totalPassengerScooter = 0; + double totalPassengerVan = 0; + double totalPassengerRayehGai = 0; + double totalPassengerRayehGaiComfort = 0; + double totalPassengerRayehGaiBalash = 0; + + double latePrice = 0; + double fuelPrice = 0; + double heavyPrice = 0; + double naturePrice = 0; + + bool isRideFinished = false; + String stringRemainingTimeToPassenger = ''; + String stringRemainingTimeDriverWaitPassenger5Minute = ''; + + bool isDriverInPassengerWay = false; + bool isDriverArrivePassenger = false; + bool isSearchingWindow = false; + bool shouldFetch = true; + + double progressTimerToPassengerFromDriverAfterApplied = 0; + double progressTimerDriverWaitPassenger5Minute = 0; + bool isCashSelectedBeforeConfirmRide = false; + bool isPassengerChosen = false; + + Timer? _masterTimer; + Timer? _searchTimer; + Timer? _timer; + Timer? _uiCountdownTimer; + + bool _isArrivalProcessed = false; + bool _isFinishProcessed = false; + bool _isCancelProcessed = false; + bool _isAcceptanceProcessed = false; + bool _isRatingScreenOpen = false; + bool _isRecalculatingRoute = false; + + String _rideAcceptedViaSource = "Unknown"; + + final double kDurationScalar = 1.5348; + // مسافة الانحراف المسموح بها بالمتر قبل إعادة حساب المسار تلقائيًا للرحلة. + // إذا انحرف السائق عن المسار بأكثر من هذه المسافة، يُعاد حساب المسار. + final double _deviationThresholdMeters = 30.0; + int _routeHeadingMismatchCount = 0; + + final Map _pollingIntervals = { + RideState.noRide: 6, + RideState.searching: 8, + RideState.driverApplied: 10, + RideState.driverArrived: 15, + RideState.inProgress: 15, + RideState.cancelled: 3600, + RideState.finished: 3600, + RideState.preCheckReview: 3600, + }; + + Timer? _locationPollingTimer; + List _currentDriverRoutePoints = []; + double _currentDriverRouteDistanceMeters = 0.0; + int _currentDriverRouteDurationSeconds = 0; + + int _currentSearchPhase = 0; + bool _isFetchingDriverLocation = false; + Timer? _watchdogTimer; + + final List _searchRadii = [2400, 3000, 3100]; + final int _searchPhaseDurationSeconds = 30; + final int _totalSearchTimeoutSeconds = 90; + + int _noRideSearchCount = 0; + final int _noRideMaxTries = 3; + final int _noRideIntervalSec = 5; + DateTime? _noRideNextAllowed; + bool _noRideSearchCapped = false; + int _masterIntervalSeconds = -1; + + final StreamController _rideStatusStreamController = + StreamController.broadcast(); + Stream get rideStatusStream => _rideStatusStreamController.stream; + + final StreamController _beginRideStreamController = + StreamController.broadcast(); + Stream get beginRideStream => _beginRideStreamController.stream; + + final StreamController _timerStreamController = StreamController(); + Stream get timerStream => _timerStreamController.stream; + + bool isTimerFromDriverToPassengerAfterAppliedRunning = true; + bool isTimerRunning = false; + int beginRideInterval = 10; + + Timer? _rideProgressTimer; + bool _hasShownSpeedWarning = false; + bool rideInProgress = true; + double elapsedTimeInSeconds = 0; + String stringElapsedTimeRideBeginVip = '0:00'; + + Map rideStatusFromStartApp = {}; + bool isStartAppHasRide = false; + late Duration durationToAdd; + late DateTime newTime = DateTime.now(); + String durationByPassenger = ''; + int hours = 0; + int minutes = 0; + + int selectedReason = -1; + String? cancelNote; + double latitudeWhatsApp = 0; + double longitudeWhatsApp = 0; + + // Getters for linked controllers + LocationSearchController get locSearch => + Get.find(); + MapEngineController get mapEngine => Get.find(); + NearbyDriversController get nearbyDrivers => + Get.find(); + MapSocketController get mapSocket => Get.find(); + UiInteractionsController get uiInteractions => + Get.find(); + + // LocationSearchController pass-throughs + LatLng get passengerLocation => locSearch.passengerLocation; + set passengerLocation(LatLng val) => locSearch.passengerLocation = val; + + LatLng get newMyLocation => locSearch.newMyLocation; + set newMyLocation(LatLng val) => locSearch.newMyLocation = val; + + LatLng get newStartPointLocation => locSearch.newStartPointLocation; + set newStartPointLocation(LatLng val) => + locSearch.newStartPointLocation = val; + + LatLng get myDestination => locSearch.myDestination; + set myDestination(LatLng val) => locSearch.myDestination = val; + + String get startNameAddress => locSearch.startNameAddress; + set startNameAddress(String val) => locSearch.startNameAddress = val; + + String get endNameAddress => locSearch.endNameAddress; + set endNameAddress(String val) => locSearch.endNameAddress = val; + + List get placesCoordinate => locSearch.placesCoordinate; + set placesCoordinate(List val) => locSearch.placesCoordinate = val; + + int get activeMenuWaypointCount => locSearch.activeMenuWaypointCount; + set activeMenuWaypointCount(int val) => + locSearch.activeMenuWaypointCount = val; + + List get menuWaypoints => locSearch.menuWaypoints; + set menuWaypoints(List val) => locSearch.menuWaypoints = val; + + List get menuWaypointNames => locSearch.menuWaypointNames; + set menuWaypointNames(List val) => locSearch.menuWaypointNames = val; + + bool get passengerStartLocationFromMap => + locSearch.passengerStartLocationFromMap; + set passengerStartLocationFromMap(bool val) => + locSearch.passengerStartLocationFromMap = val; + + List get coordinatesWithoutEmpty => locSearch.coordinatesWithoutEmpty; + + // MapEngineController pass-throughs + Set get markers => mapEngine.markers; + set markers(Set val) { + mapEngine.markers = val; + mapEngine.update(); + } + + Set get polyLines => mapEngine.polyLines; + set polyLines(Set val) { + mapEngine.polyLines = val; + mapEngine.update(); + } + + IntaleqMapController? get mapController => mapEngine.mapController; + + bool get isStyleLoaded => mapEngine.isStyleLoaded; + set isStyleLoaded(bool val) => mapEngine.isStyleLoaded = val; + + bool get isBottomSheetShown => mapEngine.isBottomSheetShown; + set isBottomSheetShown(bool val) => mapEngine.isBottomSheetShown = val; + + double get heightBottomSheetShown => mapEngine.heightBottomSheetShown; + set heightBottomSheetShown(double val) => + mapEngine.heightBottomSheetShown = val; + + bool get isPickerShown => mapEngine.isPickerShown; + set isPickerShown(bool val) => mapEngine.isPickerShown = val; + + bool get isMarkersShown => mapEngine.isMarkersShown; + set isMarkersShown(bool val) => mapEngine.isMarkersShown = val; + + bool get isMainBottomMenuMap => mapEngine.isMainBottomMenuMap; + set isMainBottomMenuMap(bool val) => mapEngine.isMainBottomMenuMap = val; + + double get mainBottomMenuMapHeight => mapEngine.mainBottomMenuMapHeight; + set mainBottomMenuMapHeight(double val) => + mapEngine.mainBottomMenuMapHeight = val; + + bool get isWayPointSheet => mapEngine.isWayPointSheet; + set isWayPointSheet(bool val) => mapEngine.isWayPointSheet = val; + + bool get isWayPointStopsSheet => mapEngine.isWayPointStopsSheet; + set isWayPointStopsSheet(bool val) => mapEngine.isWayPointStopsSheet = val; + + bool get isWayPointStopsSheetUtilGetMap => + mapEngine.isWayPointStopsSheetUtilGetMap; + set isWayPointStopsSheetUtilGetMap(bool val) => + mapEngine.isWayPointStopsSheetUtilGetMap = val; + + double get wayPointSheetHeight => mapEngine.wayPointSheetHeight; + set wayPointSheetHeight(double val) => mapEngine.wayPointSheetHeight = val; + + double get cashConfirmPageShown => mapEngine.cashConfirmPageShown; + set cashConfirmPageShown(double val) => mapEngine.cashConfirmPageShown = val; + + bool get isCashConfirmPageShown => mapEngine.isCashConfirmPageShown; + set isCashConfirmPageShown(bool val) => + mapEngine.isCashConfirmPageShown = val; + + bool get isCancelRidePageShown => mapEngine.isCancelRidePageShown; + set isCancelRidePageShown(bool val) => mapEngine.isCancelRidePageShown = val; + + void changeCashConfirmPageShown() => mapEngine.changeCashConfirmPageShown(); + + void resetNoRideSearch() { + _noRideSearchCount = 0; + _noRideSearchCapped = false; + _noRideNextAllowed = null; + } + + double get paymentPageShown => mapEngine.paymentPageShown; + set paymentPageShown(double val) => mapEngine.paymentPageShown = val; + + void changeCancelRidePageShow() => mapEngine.changeCancelRidePageShow(); + + // NearbyDriversController pass-throughs + List get carsLocationByPassenger => nearbyDrivers.carsLocationByPassenger; + set carsLocationByPassenger(List val) => + nearbyDrivers.carsLocationByPassenger = val; + + List get driverCarsLocationToPassengerAfterApplied => + nearbyDrivers.driverCarsLocationToPassengerAfterApplied; + set driverCarsLocationToPassengerAfterApplied(List val) => + nearbyDrivers.driverCarsLocationToPassengerAfterApplied = val; + + bool get noCarString => nearbyDrivers.noCarString; + set noCarString(bool val) => nearbyDrivers.noCarString = val; + + double get speed => locSearch.speed; + set speed(double val) => locSearch.speed = val; + + Timer? get locationPollingTimer => _locationPollingTimer; + + bool isActiveRideState() { + return currentRideState.value == RideState.searching || + currentRideState.value == RideState.driverApplied || + currentRideState.value == RideState.driverArrived || + currentRideState.value == RideState.inProgress; + } + + void startMasterTimer() { + _masterTimer?.cancel(); + _masterTimer = Timer.periodic(const Duration(seconds: 13), (_) { + _handleRideState(currentRideState.value); + }); + } + + void cancelMasterTimer() { + _masterTimer?.cancel(); + _masterTimer = null; + } + + void startMasterTimerWithInterval(int seconds) { + if (_masterTimer != null && _masterIntervalSeconds == seconds) return; + _masterIntervalSeconds = seconds; + _masterTimer?.cancel(); + _masterTimer = Timer.periodic(Duration(seconds: seconds), (_) { + _handleRideState(currentRideState.value); + }); + } + + void stopAllTimers() { + Log.print('🛑 FORCE STOP: Stopping ALL Timers and Streams 🛑'); + _masterTimer?.cancel(); + _masterTimer = null; + timerToPassengerFromDriverAfterApplied?.cancel(); + timerToPassengerFromDriverAfterApplied = null; + _timer?.cancel(); + _timer = null; + _uiCountdownTimer?.cancel(); + _uiCountdownTimer = null; + _locationPollingTimer?.cancel(); + _locationPollingTimer = null; + _watchdogTimer?.cancel(); + _watchdogTimer = null; + _searchTimer?.cancel(); + _searchTimer = null; + _rideProgressTimer?.cancel(); + _rideProgressTimer = null; + + isTimerRunning = false; + isBeginRideFromDriverRunning = false; + _isFetchingDriverLocation = false; + update(); + } + + Future _handleRideState(RideState state) async { + if (_isRatingScreenOpen) { + Log.print('⛔ Rating Screen is Open. Skipping Logic.'); + stopAllTimers(); + return; + } + Log.print('Handling state: $state'); + + int effectivePollingInterval = _pollingIntervals[state] ?? 13; + + switch (state) { + case RideState.noRide: + final now = DateTime.now(); + if (_noRideSearchCount >= _noRideMaxTries) { + if (!_noRideSearchCapped) { + _noRideSearchCapped = true; + Log.print('[noRide] search capped at $_noRideMaxTries attempts'); + } + break; + } + if (_noRideNextAllowed != null && now.isBefore(_noRideNextAllowed!)) { + break; + } + _noRideSearchCount++; + Log.print('_noRideSearchCount: $_noRideSearchCount'); + _noRideNextAllowed = now.add(Duration(seconds: _noRideIntervalSec)); + nearbyDrivers.getCarsLocationByPassengerAndReloadMarker(); + nearbyDrivers.getNearestDriverByPassengerLocation(); + break; + + case RideState.cancelled: + stopAllTimers(); + break; + + case RideState.preCheckReview: + stopAllTimers(); + _checkLastRideForReview(); + break; + + case RideState.searching: + if (rideId == 'yet' || rideId.isEmpty) break; + try { + String statusFromServer = await getRideStatus(rideId); + if (statusFromServer == 'Apply' || statusFromServer == 'Applied') { + await processRideAcceptance(source: "Polling"); + break; + } + } catch (e) { + Log.print('Error polling getRideStatus: $e'); + } + + final now = DateTime.now(); + final int elapsedSeconds = now.difference(_searchStartTime!).inSeconds; + + if (elapsedSeconds > _totalSearchTimeoutSeconds) { + stopAllTimers(); + currentRideState.value = RideState.noRide; + isSearchingWindow = false; + update(); + _showIncreaseFeeDialog(); + break; + } + + int targetPhase = + (elapsedSeconds / _searchPhaseDurationSeconds).floor(); + if (targetPhase >= _searchRadii.length) { + targetPhase = _searchRadii.length - 1; + } + + bool isNewPhase = targetPhase > _currentSearchPhase; + bool timeToScanForNewDrivers = (elapsedSeconds % 15 == 0); + + if (isNewPhase || timeToScanForNewDrivers || elapsedSeconds < 5) { + _currentSearchPhase = targetPhase; + int currentRadius = _searchRadii[_currentSearchPhase]; + Log.print( + '[Search Logic] Scanning for drivers. Phase: $_currentSearchPhase, Radius: $currentRadius'); + } + + if (elapsedSeconds < 5) { + driversStatusForSearchWindow = 'Your order is being prepared'.tr; + } else if (elapsedSeconds < 15) { + driversStatusForSearchWindow = 'Your order sent to drivers'.tr; + } else { + driversStatusForSearchWindow = + 'The drivers are reviewing your request'.tr; + } + update(); + break; + + case RideState.driverApplied: + if (!_isDriverAppliedLogicExecuted && !_isAcceptanceProcessed) { + Log.print('[handleRideState] Execution driverApplied logic.'); + rideAppliedFromDriver(true); + _isDriverAppliedLogicExecuted = true; + } + + if (!mapSocket.isSocketConnected) { + try { + String statusFromServer = await getRideStatus(rideId); + if (statusFromServer == 'Arrived') { + currentRideState.value = RideState.driverArrived; + break; + } else if (statusFromServer == 'Begin' || + statusFromServer == 'inProgress') { + processRideBegin(); + break; + } + } catch (e) { + Log.print('Error polling for Arrived/Begin status: $e'); + } + } + if (!_isSocketHealthy()) { + getDriverCarsLocationToPassengerAfterApplied(); + } + break; + + case RideState.driverArrived: + if (!_isDriverArrivedLogicExecuted) { + _isDriverArrivedLogicExecuted = true; + startTimerDriverWaitPassenger5Minute(); + uiInteractions.driverArrivePassengerDialoge(); + } + break; + + case RideState.inProgress: + if (!mapSocket.isSocketConnected) { + try { + String statusFromServer = await getRideStatus(rideId); + if (statusFromServer == 'Finished' || + statusFromServer == 'finished') { + Log.print( + '🏁 DETECTED FINISHED: Killing processes and forcing Review.'); + stopAllTimers(); + currentRideState.value = RideState.preCheckReview; + tripFinishedFromDriver(); + _checkLastRideForReview(); + return; + } + } catch (e) { + Log.print('Error polling status: $e'); + } + } + + if (!_isRideBeginLogicExecuted) { + _isRideBeginLogicExecuted = true; + _executeBeginRideLogic(); + } + if (!_isSocketHealthy()) { + getDriverCarsLocationToPassengerAfterApplied(); + } + break; + + case RideState.finished: + tripFinishedFromDriver(); + stopAllTimers(); + effectivePollingInterval = 3600; + break; + } + startMasterTimerWithInterval(effectivePollingInterval); + } + + bool _isSocketHealthy() { + return mapSocket.isSocketHealthy(); + } + + Future _checkInitialRideStatus() async { + await getRideStatusFromStartApp(); + if (rideStatusFromStartApp['data'] == null) { + currentRideState.value = RideState.noRide; + _handleRideState(currentRideState.value); + return; + } + String _status = rideStatusFromStartApp['data']['status'] ?? ''; + String _lowerStatus = _status.toLowerCase(); + + if (_lowerStatus == 'waiting' || + _lowerStatus == 'apply' || + _lowerStatus == 'applied' || + _lowerStatus == 'accepted' || + _lowerStatus == 'arrived' || + _lowerStatus == 'begin') { + rideId = rideStatusFromStartApp['data']['rideId'].toString(); + currentRideState.value = _lowerStatus == 'waiting' + ? RideState.searching + : (_lowerStatus == 'apply' || + _lowerStatus == 'applied' || + _lowerStatus == 'accepted') + ? RideState.driverApplied + : _lowerStatus == 'arrived' + ? RideState.driverArrived + : _lowerStatus == 'begin' + ? RideState.inProgress + : _lowerStatus == 'cancel' + ? RideState.cancelled + : RideState.noRide; + } else if (_lowerStatus == 'finished') { + if (rideStatusFromStartApp['data']['needsReview'] == 1) { + currentRideState.value = RideState.preCheckReview; + } else { + currentRideState.value = RideState.noRide; + } + } else { + currentRideState.value = RideState.noRide; + } + _handleRideState(currentRideState.value); + } + + Future _checkLastRideForReview() async { + Log.print('⭐ FORCE OPEN RATING PAGE (Get.to mode)'); + await getRideStatusFromStartApp(); + + if (rideStatusFromStartApp['data'] == null) { + currentRideState.value = RideState.noRide; + startMasterTimer(); + return; + } + + String needsReview = + rideStatusFromStartApp['data']['needsReview'].toString(); + + if (needsReview == '1') { + _isRatingScreenOpen = true; + var args = { + 'driverId': rideStatusFromStartApp['data']['driver_id'].toString(), + 'rideId': rideStatusFromStartApp['data']['rideId'].toString(), + 'driverName': rideStatusFromStartApp['data']['driverName'], + 'price': rideStatusFromStartApp['data']['price'], + }; + + await Get.to( + () => RatingDriverBottomSheet(), + arguments: args, + preventDuplicates: true, + popGesture: false, + ); + + Log.print('✅ Rating Page Closed. Resetting App.'); + _isRatingScreenOpen = false; + restCounter(); + currentRideState.value = RideState.noRide; + startMasterTimer(); + } else { + currentRideState.value = RideState.noRide; + startMasterTimer(); + } + } + + DateTime? _searchStartTime; + bool _isDriverAppliedLogicExecuted = false; + bool _isDriverArrivedLogicExecuted = false; + bool _isRideBeginLogicExecuted = false; + String driversStatusForSearchWindow = ''; + + void startSearchingForDriver() async { + if (currentRideState.value == RideState.searching) return; + + isSearchingWindow = true; + currentRideState.value = RideState.searching; + driversStatusForSearchWindow = 'Searching for nearby drivers...'.tr; + _searchStartTime = DateTime.now(); + _currentSearchPhase = 0; + update(); + + bool rideCreated = await postRideDetailsToServer(); + + if (!rideCreated) { + isSearchingWindow = false; + currentRideState.value = RideState.noRide; + mySnackbarWarning("Could not create ride. Please try again.".tr); + update(); + return; + } + + _addRideToWaitingTable(); + mapSocket.initConnectionWithSocket(); + } + + void _showIncreaseFeeDialog() { + Get.dialog( + CupertinoAlertDialog( + title: Text("No drivers accepted your request yet".tr), + content: Text( + "Increasing the fare might attract more drivers. Would you like to increase the price?" + .tr), + actions: [ + CupertinoDialogAction( + child: Text("Cancel Ride".tr, + style: TextStyle(color: AppColor.redColor)), + onPressed: () { + Get.back(); + mapEngine.changeCancelRidePageShow(); + }, + ), + CupertinoDialogAction( + child: Text("Increase Fare".tr, + style: TextStyle(color: AppColor.greenColor)), + onPressed: () { + Get.back(); + double newPrice = totalPassenger * 1.10; + increasePriceAndRestartSearch(newPrice); + }, + ), + ], + ), + barrierDismissible: false, + ); + } + + Future increasePriceAndRestartSearch(double newPrice) async { + totalPassenger = newPrice; + update(); + + await CRUD() + .post(link: "${AppLink.server}/ride/rides/update.php", payload: { + "id": rideId, + "price": newPrice.toStringAsFixed(2), + }); + + Log.print( + '[increasePrice] Price changed. Clearing notified list to resend.'); + notifiedDrivers.clear(); + + _searchStartTime = DateTime.now(); + _currentSearchPhase = 0; + isSearchingWindow = true; + update(); + startMasterTimer(); + } + + void _stopWaitPassengerTimer({bool resetUI = false}) { + _waitPassengerTimer?.cancel(); + _waitPassengerTimer = null; + + if (resetUI) { + progressTimerDriverWaitPassenger5Minute = 0.0; + remainingTimeDriverWaitPassenger5Minute = 0; + stringRemainingTimeDriverWaitPassenger5Minute = '00:00'; + update(); + } + } + + void _executeBeginRideLogic() { + Log.print('[executeBeginRideLogic] execution of ride start logic...'); + _stopWaitPassengerTimer(resetUI: true); + + timeToPassengerFromDriverAfterApplied = 0; + remainingTime = 0; + remainingTimeToPassengerFromDriverAfterApplied = 0; + remainingTimeDriverWaitPassenger5Minute = 0; + + rideTimerBegin = true; + statusRide = 'Begin'; + isDriverInPassengerWay = false; + isDriverArrivePassenger = false; + + box.write(BoxName.passengerWalletTotal, '0'); + update(); + + rideIsBeginPassengerTimer(); + runWhenRideIsBegin(); + + NotificationController().showNotification( + 'Trip is Begin'.tr, + 'The trip has started! Feel free to contact emergency numbers, share your trip, or activate voice recording for the journey' + .tr, + 'start'); + } + + Future processRideBegin({String source = "Unknown"}) async { + if (currentRideState.value == RideState.inProgress || + _isRideStartedProcessed) { + return; + } + _isRideStartedProcessed = true; + currentRideState.value = RideState.inProgress; + statusRide = 'Begin'; + + remainingTimeDriverWaitPassenger5Minute = 0; + _stopWaitPassengerTimer(); + + // مسح الخطوط القديمة (pickup/direct) قبل رسم خط المرحلة الجديدة + polyLines = polyLines + .where((p) => + p.polylineId.value != 'main_route' && + p.polylineId.value != 'route_direct' && + !p.polylineId.value.startsWith('driver_route')) + .toSet(); + + // موقع السائق الحالي من آخر تحديث + LatLng driverPos = passengerLocation; + if (driverCarsLocationToPassengerAfterApplied.isNotEmpty) { + driverPos = driverCarsLocationToPassengerAfterApplied.last; + } + + // رسم المسار من موقع السائق إلى الهدف بخط أزرق مستمر + await calculateDriverToPassengerRoute(driverPos, myDestination, + isBeginPhase: true); + + rideIsBeginPassengerTimer(); + runWhenRideIsBegin(); + update(); + } + + bool _isRideStartedProcessed = false; + + void updateDriverRouteMetrics({int? etaSeconds, double? distanceMeters}) { + if (distanceMeters != null && distanceMeters > 0) { + distanceByPassenger = distanceMeters.toStringAsFixed(0); + } + + if (etaSeconds == null) return; + + final int clampedEta = max(0, etaSeconds); + timeToPassengerFromDriverAfterApplied = clampedEta; + remainingTimeToPassengerFromDriverAfterApplied = clampedEta; + durationToPassenger = clampedEta; + _driverEtaSecondsAtUpdate = clampedEta; + _driverEtaUpdatedAt = DateTime.now(); + + final int minutes = (clampedEta / 60).floor(); + final int seconds = clampedEta % 60; + stringRemainingTimeToPassenger = + '$minutes:${seconds.toString().padLeft(2, '0')}'; + } + + void startTimerFromDriverToPassengerAfterApplied() { + stopTimerFromDriverToPassengerAfterApplied(); + if (isTimerRunning) return; + isTimerRunning = true; + isTimerFromDriverToPassengerAfterAppliedRunning = true; + _driverEtaUpdatedAt ??= DateTime.now(); + _driverEtaSecondsAtUpdate = timeToPassengerFromDriverAfterApplied; + _driverEtaCountdownTicks = 0; + + timerToPassengerFromDriverAfterApplied = + Timer.periodic(const Duration(seconds: 1), (timer) { + bool isRideActive = (statusRide == 'Apply' || + statusRide == 'Arrived' || + statusRide == 'Begin' || + currentRideState.value == RideState.driverApplied || + currentRideState.value == RideState.driverArrived || + currentRideState.value == RideState.inProgress); + + if (!isRideActive || !isTimerFromDriverToPassengerAfterAppliedRunning) { + timer.cancel(); + timerToPassengerFromDriverAfterApplied = null; + isTimerRunning = false; + return; + } + + _driverEtaCountdownTicks++; + if (!_timerStreamController.isClosed) { + _timerStreamController.add(_driverEtaCountdownTicks); + } + + final int secondsElapsedSinceEta = _driverEtaUpdatedAt == null + ? 0 + : DateTime.now().difference(_driverEtaUpdatedAt!).inSeconds; + remainingTimeToPassengerFromDriverAfterApplied = + _driverEtaSecondsAtUpdate - secondsElapsedSinceEta; + + if (remainingTimeToPassengerFromDriverAfterApplied < 0) { + remainingTimeToPassengerFromDriverAfterApplied = 0; + } + + int minutes = + (remainingTimeToPassengerFromDriverAfterApplied / 60).floor(); + int seconds = remainingTimeToPassengerFromDriverAfterApplied % 60; + stringRemainingTimeToPassenger = + '$minutes:${seconds.toString().padLeft(2, '0')}'; + + if (_driverEtaCountdownTicks % 5 == 0) { + double currentProgress = 1 - + (remainingTimeToPassengerFromDriverAfterApplied / + (_driverEtaSecondsAtUpdate == 0 + ? 1 + : _driverEtaSecondsAtUpdate)); + + IosLiveActivityService.updateRideActivity( + status: 'waiting', + driverName: driverName, + carDetails: '$make • $model • $carColor', + etaText: stringRemainingTimeToPassenger, + progress: currentProgress.clamp(0.0, 1.0), + ); + } + + if (_driverEtaCountdownTicks % beginRideInterval == 0) { + uploadPassengerLocation(); + } else { + update(); + } + }); + } + + void stopTimerFromDriverToPassengerAfterApplied() { + isTimerFromDriverToPassengerAfterAppliedRunning = false; + timerToPassengerFromDriverAfterApplied?.cancel(); + timerToPassengerFromDriverAfterApplied = null; + isTimerRunning = false; + update(); + } + + Timer? _waitPassengerTimer; + static const int _waitPassengerTotalSeconds = 300; + int _waitPassengerElapsedSeconds = 0; + + void startTimerDriverWaitPassenger5Minute() { + if (currentRideState.value != RideState.driverArrived) return; + + stopTimerFromDriverToPassengerAfterApplied(); + isTimerRunning = false; + _stopWaitPassengerTimer(); + + isDriverArrivePassenger = true; + isDriverInPassengerWay = false; + timeToPassengerFromDriverAfterApplied = 0; + + _waitPassengerElapsedSeconds = 0; + remainingTimeDriverWaitPassenger5Minute = _waitPassengerTotalSeconds; + progressTimerDriverWaitPassenger5Minute = 0; + + int m = (remainingTimeDriverWaitPassenger5Minute / 60).floor(); + int s = remainingTimeDriverWaitPassenger5Minute % 60; + stringRemainingTimeDriverWaitPassenger5Minute = + '$m:${s.toString().padLeft(2, '0')}'; + + update(); + + _waitPassengerTimer = Timer.periodic(const Duration(seconds: 1), (t) { + if (currentRideState.value != RideState.driverArrived) { + _stopWaitPassengerTimer(resetUI: true); + if (currentRideState.value == RideState.inProgress) { + isDriverArrivePassenger = false; + } + update(); + return; + } + + _waitPassengerElapsedSeconds++; + int remaining = _waitPassengerTotalSeconds - _waitPassengerElapsedSeconds; + if (remaining < 0) remaining = 0; + + remainingTimeDriverWaitPassenger5Minute = remaining; + progressTimerDriverWaitPassenger5Minute = + _waitPassengerElapsedSeconds / _waitPassengerTotalSeconds; + + int minutes = (remaining / 60).floor(); + int seconds = remaining % 60; + stringRemainingTimeDriverWaitPassenger5Minute = + '$minutes:${seconds.toString().padLeft(2, '0')}'; + update(); + + if (remaining == 0) { + _stopWaitPassengerTimer(); + } + }); + } + + void beginRideTimer() { + Timer.periodic(const Duration(seconds: 1), (timer) { + if (!timerController.isClosed) { + timerController.add(timer.tick); + } + update(); + }); + } + + final timerController = StreamController(); + void stopRideTimer() { + timerController.close(); + update(); + } + + void rideIsBeginPassengerTimer() { + _rideProgressTimer?.cancel(); + _hasShownSpeedWarning = false; + + DateTime now = DateTime.now(); + DateTime expectedArrivalTime = now.add(Duration(seconds: durationToRide)); + + var arrivalTime = DateFormat('hh:mm a').format(expectedArrivalTime); + box.write(BoxName.arrivalTime, arrivalTime); + + Log.print("⏳ Ride Timer Started. Duration: $durationToRide sec"); + + _rideProgressTimer = + Timer.periodic(const Duration(seconds: 1), (timer) async { + if (currentRideState.value != RideState.inProgress) { + timer.cancel(); + return; + } + + DateTime currentNow = DateTime.now(); + int remainingSeconds = + expectedArrivalTime.difference(currentNow).inSeconds; + + if (remainingSeconds < 0) remainingSeconds = 0; + + remainingTimeTimerRideBegin = remainingSeconds; + progressTimerRideBegin = + durationToRide > 0 ? 1 - (remainingSeconds / durationToRide) : 1.0; + + int minutes = (remainingSeconds / 60).floor(); + int seconds = remainingSeconds % 60; + stringRemainingTimeRideBegin = + '$minutes:${seconds.toString().padLeft(2, '0')}'; + + final percent = (progressTimerRideBegin * 100).clamp(0, 100).toInt(); + + if (remainingSeconds % 5 == 0 || remainingSeconds == 0) { + IosLiveActivityService.updateRideActivity( + status: 'ongoing', + driverName: driverName, + carDetails: '$make • $model • $carColor', + etaText: stringRemainingTimeRideBegin, + progress: progressTimerRideBegin.clamp(0.0, 1.0), + ); + } + + if (remainingSeconds % 60 == 0 || remainingSeconds == 0) { + await RideLiveNotification.showTripInProgress( + percentage: percent, + etaText: stringRemainingTimeRideBegin, + ); + } + + if (speed > 100 && !_hasShownSpeedWarning) { + _hasShownSpeedWarning = true; + _triggerSpeedWarning(); + } + + if (speed < 80 && _hasShownSpeedWarning) { + _hasShownSpeedWarning = false; + } + + if (remainingSeconds <= 0) { + timer.cancel(); + } + update(); + }); + } + + void _triggerSpeedWarning() { + NotificationController().showNotification("Warning: Speeding detected!".tr, + 'You can call or record audio of this trip'.tr, 'tone1'); + + Get.defaultDialog( + barrierDismissible: false, + title: "Warning: Speeding detected!".tr, + titleStyle: AppStyle.title.copyWith(color: AppColor.redColor), + content: Column( + children: [ + Icon(Icons.speed, size: 50, color: AppColor.redColor), + const SizedBox(height: 10), + Text( + "We noticed the speed is exceeding 100 km/h. Please slow down for your safety..." + .tr, + textAlign: TextAlign.center, + style: AppStyle.title, + ), + ], + ), + confirm: MyElevatedButton( + title: "Share Trip Details".tr, + kolor: AppColor.redColor, + onPressed: () { + Get.back(); + uiInteractions.sosPassenger(); + }, + ), + cancel: MyElevatedButton( + title: "I'm Safe".tr, + kolor: AppColor.greenColor, + onPressed: () { + Get.back(); + }, + ), + ); + } + + void rideIsBeginPassengerTimerVIP() async { + rideInProgress = true; + bool sendSOS = false; + while (rideInProgress) { + await Future.delayed(const Duration(seconds: 1)); + elapsedTimeInSeconds++; + + int minutes = (elapsedTimeInSeconds / 60).floor(); + int seconds = (elapsedTimeInSeconds % 60).toInt(); + stringElapsedTimeRideBeginVip = + '$minutes:${seconds.toString().padLeft(2, '0')}'; + + if (speed > 100 && !sendSOS) { + Get.defaultDialog( + barrierDismissible: false, + title: "Warning: Speeding detected!".tr, + titleStyle: AppStyle.title, + content: Text( + "We noticed the speed is exceeding 100 km/h. Please slow down for your safety. If you feel unsafe, you can share your trip details with a contact or call the police using the red SOS button." + .tr, + style: AppStyle.title, + ), + confirm: MyElevatedButton( + title: "Share Trip Details".tr, + onPressed: () { + Get.back(); + String message = "**Emergency SOS from Passenger:**\n"; + message += "* ${'Origin'.tr}: $passengerLocation\n"; + message += "* ${'Destination'.tr}: $myDestination\n"; + message += "* ${'Driver Name'.tr}: $passengerName\n"; + message += "* ${'Driver Car Plate'.tr}: $licensePlate\n\n"; + message += "* ${'Driver Phone'.tr}: $driverPhone\n\n"; + message += + "${'Current Location'.tr}:https://www.google.com/maps/place/${passengerLocation.latitude},${passengerLocation.longitude} \n"; + message += "Please help! Contact me as soon as possible.".tr; + + launchCommunication( + 'whatsapp', box.read(BoxName.sosPhonePassenger), message); + sendSOS = true; + }, + kolor: AppColor.redColor, + ), + cancel: MyElevatedButton( + title: "Cancel".tr, + onPressed: () { + Get.back(); + }, + kolor: AppColor.greenColor, + ), + ); + } + update(); + } + } + + Future tripFinishedFromDriver() async { + Log.print('🧹 Cleaning UI for Finish'); + if (Get.isDialogOpen == true) Get.back(); + if (Get.isBottomSheetOpen == true) Get.back(); + + statusRide = 'Finished'; + currentRideState.value = RideState.finished; + + isSearchingWindow = false; + rideTimerBegin = false; + shouldFetch = false; + + stopAllTimers(); + resetAllMapStates(); + mapEngine.clearPolyline(); + markers = {}; + update(); + } + + void listenToBeginRideStream() { + beginRideStream.listen((status) { + Log.print("Ride status: $status"); + }, onError: (error) { + Log.print("Error in Begin Ride Stream: $error"); + }); + } + + Future begiVIPTripFromPassenger() async { + timeToPassengerFromDriverAfterApplied = 0; + remainingTime = 0; + isBottomSheetShown = false; + remainingTimeToPassengerFromDriverAfterApplied = 0; + remainingTimeDriverWaitPassenger5Minute = 0; + rideTimerBegin = true; + statusRideVip = 'Begin'; + isDriverInPassengerWay = false; + isDriverArrivePassenger = false; + update(); + rideIsBeginPassengerTimerVIP(); + runWhenRideIsBegin(); + } + + Future getRideStatusFromStartApp() async { + try { + var res = await CRUD().get( + link: AppLink.getRideStatusFromStartApp, + payload: {'passenger_id': box.read(BoxName.passengerID)}); + Log.print('rideStatusFromStartApp: $res'); + if (res == 'failure') { + rideStatusFromStartApp = { + 'data': {'status': 'NoRide', 'needsReview': false} + }; + isStartAppHasRide = false; + } else { + var decoded = jsonDecode(res); + if (decoded['status'] == 'failure') { + rideStatusFromStartApp = { + 'data': {'status': 'NoRide', 'needsReview': false} + }; + isStartAppHasRide = false; + } else { + rideStatusFromStartApp = decoded; + } + } + + String status = + (rideStatusFromStartApp['data']['status'] ?? '').toString(); + String lowerStatus = status.toLowerCase(); + + if (lowerStatus == 'begin' || + lowerStatus == 'apply' || + lowerStatus == 'applied' || + lowerStatus == 'accepted' || + lowerStatus == 'arrived') { + statusRide = status; + isStartAppHasRide = true; + final bool isBeginStatus = lowerStatus == 'begin'; + final bool isPickupStatus = lowerStatus == 'apply' || + lowerStatus == 'applied' || + lowerStatus == 'accepted' || + lowerStatus == 'arrived'; + currentRideState.value = lowerStatus == 'begin' + ? RideState.inProgress + : lowerStatus == 'arrived' + ? RideState.driverArrived + : RideState.driverApplied; + driverId = + rideStatusFromStartApp['data']['driver_id']?.toString() ?? ''; + driverName = + rideStatusFromStartApp['data']['driverName']?.toString() ?? ''; + driverRate = + rideStatusFromStartApp['data']['rateDriver']?.toString() ?? '5.0'; + final LatLng? pickupPoint = _parseLatLng( + rideStatusFromStartApp['data']['start_location']?.toString()); + final LatLng? destinationPoint = _parseLatLng( + rideStatusFromStartApp['data']['end_location']?.toString()); + if (pickupPoint != null) { + passengerLocation = pickupPoint; + } + if (destinationPoint != null) { + myDestination = destinationPoint; + } + statusRideFromStart = true; + update(); + + // Safe recovery of trip data + Map? tripData; + try { + var rawTrip = box.read(BoxName.tripData); + if (rawTrip is Map) { + tripData = Map.from(rawTrip); + } + } catch (e) { + Log.print("Error reading BoxName.tripData: $e"); + } + + String? pointsString = tripData?['polyline']; + + if (pointsString == null || pointsString.isEmpty) { + // No local polyline saved: Re-fetch the route from API + final String startLoc = + rideStatusFromStartApp['data']['start_location'] ?? ''; + final String endLoc = + rideStatusFromStartApp['data']['end_location'] ?? ''; + if (startLoc.isNotEmpty && endLoc.isNotEmpty) { + Log.print("🔄 Re-fetching route from API: $startLoc -> $endLoc"); + // Call getDirectionMap to fetch the route asynchronously + getDirectionMap(startLoc, endLoc, []); + } + } else { + List decodedPoints = + await compute(decodePolylineIsolate, pointsString); + + mapEngine.clearPolyline(); + mapEngine.polylineCoordinates.clear(); + mapEngine.polylineCoordinates.addAll(decodedPoints); + if (decodedPoints.isNotEmpty) { + passengerLocation = pickupPoint ?? decodedPoints.first; + myDestination = destinationPoint ?? decodedPoints.last; + } + var polyline = Polyline( + polylineId: const PolylineId('main_route'), + points: mapEngine.polylineCoordinates, + width: 6, + color: const Color(0xFF2196F3), + ); + + polyLines = {...polyLines, polyline}; + } + + timeToPassengerFromDriverAfterApplied = 0; + remainingTime = 0; + remainingTimeToPassengerFromDriverAfterApplied = 0; + remainingTimeDriverWaitPassenger5Minute = 0; + rideTimerBegin = isBeginStatus; + isDriverInPassengerWay = false; + isDriverArrivePassenger = false; + + // Safe durationToAdd parsing + if (tripData != null && tripData['distance_m'] != null) { + var distVal = tripData['distance_m']; + if (distVal is Duration) { + durationToAdd = distVal; + } else if (distVal is num) { + durationToAdd = Duration(seconds: distVal.toInt()); + } + } else { + durationToAdd = Duration.zero; + } + + mapSocket.initConnectionWithSocket(); + + if (isBeginStatus) { + _isRideBeginLogicExecuted = true; + _isRideStartedProcessed = true; + await getDriverCarsLocationToPassengerAfterApplied(); + if (driverCarsLocationToPassengerAfterApplied.isNotEmpty && + myDestination.latitude != 0 && + myDestination.longitude != 0) { + await calculateDriverToPassengerRoute( + driverCarsLocationToPassengerAfterApplied.last, + myDestination, + isBeginPhase: true, + ); + } + rideIsBeginPassengerTimer(); + runWhenRideIsBegin(); + } else if (isPickupStatus) { + _isAcceptanceProcessed = true; + _isDriverAppliedLogicExecuted = true; + await getDriverCarsLocationToPassengerAfterApplied(); + if (driverCarsLocationToPassengerAfterApplied.isNotEmpty) { + await calculateDriverToPassengerRoute( + driverCarsLocationToPassengerAfterApplied.last, + passengerLocation, + ); + startTimerFromDriverToPassengerAfterApplied(); + } + _startSocketWatchdog(); + } + update(); + } + } catch (e) { + Log.print("Error getRideStatusFromStartApp: $e"); + } + } + + void driverArrivePassenger() { + timeToPassengerFromDriverAfterApplied = 0; + remainingTime = 0; + update(); + rideIsBeginPassengerTimer(); + } + + void cancelTimerToPassengerFromDriverAfterApplied() { + timerToPassengerFromDriverAfterApplied?.cancel(); + } + + Future postRideDetailsToServer() async { + if (mapEngine.polylineCoordinates.isEmpty) return false; + + LatLng startLoc = mapEngine.polylineCoordinates.first; + LatLng endLoc = mapEngine.polylineCoordinates.last; + + Map payload = { + "start_location": '${startLoc.latitude},${startLoc.longitude}', + "end_location": '${endLoc.latitude},${endLoc.longitude}', + "date": DateTime.now().toString(), + "time": DateTime.now().toString(), + "endtime": "00:00:00", + "price": totalPassenger.toStringAsFixed(2), + "passenger_id": box.read(BoxName.passengerID).toString(), + "driver_id": "0", + "status": "waiting", + "carType": box.read(BoxName.carType), + "price_for_driver": totalPassenger.toString(), + "price_for_passenger": totalME.toString(), + "distance": distance.toString(), + "passenger_name": box.read(BoxName.name).toString(), + "passenger_phone": box.read(BoxName.phone).toString(), + "passenger_token": box.read(BoxName.tokenFCM).toString(), + "passenger_email": box.read(BoxName.email).toString(), + "passenger_wallet": box.read(BoxName.passengerWalletTotal).toString(), + "passenger_rating": (passengerRate ?? 5.0).toString(), + "start_name": startNameAddress, + "end_name": endNameAddress, + "duration_text": "${(durationToRide / 60).floor()}", + "distance_text": "$distance", + "is_wallet": Get.find().isWalletChecked.toString(), + "has_steps": Get.find().wayPoints.length > 1 + ? 'true' + : 'false', + "step0": placesCoordinate.length > 0 ? placesCoordinate[0] : "", + "step1": placesCoordinate.length > 1 ? placesCoordinate[1] : "", + "step2": placesCoordinate.length > 2 ? placesCoordinate[2] : "", + "step3": placesCoordinate.length > 3 ? placesCoordinate[3] : "", + "step4": placesCoordinate.length > 4 ? placesCoordinate[4] : "", + }; + + Log.print(' 📦 Payload: $payload'); + + try { + var response = await CRUD().post( + link: "${AppLink.server}/ride/rides/add_ride.php", payload: payload); + + var jsonResponse = (response is String) ? jsonDecode(response) : response; + + if (jsonResponse['status'] == 'success') { + rideId = jsonResponse['message'].toString(); + Log.print("✅ Ride Created ID: $rideId"); + return true; + } else { + Log.print("❌ Ride Creation Failed: $response"); + return false; + } + } catch (e) { + Log.print("❌ Exception in postRide: $e"); + return false; + } + } + + Future rideAppliedFromDriver(bool isApplied) async { + Log.print('[rideAppliedFromDriver] 🚀 Starting logic...'); + await getUpdatedRideForDriverApply(rideId); + + if (['Speed', 'Awfar Car'].contains(box.read(BoxName.carType))) { + NotificationController().showNotification('Fixed Price'.tr, + 'The captain is responsible for the route.'.tr, 'ding'); + } else if (['Comfort', 'Lady'].contains(box.read(BoxName.carType))) { + NotificationController().showNotification('Attention'.tr, + 'The price may increase if the route changes.'.tr, 'ding'); + } + + isApplied = true; + statusRide = 'Apply'; + rideConfirm = false; + isSearchingWindow = false; + _isDriverAppliedLogicExecuted = true; + + update(); + + // إيقاف جلب السيارات المجاورة ومسحها، باستثناء السائق الذي قبل الطلب + mapEngine.reloadStartApp = false; + mapEngine.markers.removeWhere((marker) => marker.markerId.value != driverId.toString()); + mapEngine.update(); + + await getDriverCarsLocationToPassengerAfterApplied(); + + if (driverCarsLocationToPassengerAfterApplied.isNotEmpty) { + LatLng driverPos = driverCarsLocationToPassengerAfterApplied.last; + Log.print( + '[rideAppliedFromDriver] 📍 Driver at: $driverPos, Passenger at: $passengerLocation'); + await getInitialDriverDistanceAndDuration(driverPos, passengerLocation); + await drawDriverPathOnly(driverPos, passengerLocation); + mapEngine.fitCameraToPoints(driverPos, passengerLocation); + } + + startTimerFromDriverToPassengerAfterApplied(); + } + + Future getInitialDriverDistanceAndDuration( + LatLng driverPos, LatLng passengerPos) async { + final String apiUrl = 'https://routec.intaleq.xyz/route'; + final String apiKey = Env.mapKeyOsm; + final String origin = '${driverPos.latitude},${driverPos.longitude}'; + final String dest = '${passengerPos.latitude},${passengerPos.longitude}'; + + final Uri uri = Uri.parse( + '$apiUrl?origin=$origin&destination=$dest&steps=false&overview=false'); + + try { + final response = await http.get(uri, headers: {'X-API-KEY': apiKey}); + if (response.statusCode == 200) { + final data = jsonDecode(response.body); + if (data['status'] == 'ok') { + double durationSecondsRaw = (data['duration_s'] as num).toDouble(); + int finalDurationSeconds = + (durationSecondsRaw * kDurationScalar).toInt(); + double distanceMeters = (data['distance_m'] as num).toDouble(); + + updateDriverRouteMetrics( + etaSeconds: finalDurationSeconds, + distanceMeters: distanceMeters, + ); + + update(); + } + } + } catch (e) { + Log.print('Error getInitialDriverDistanceAndDuration: $e'); + } + } + + int durationToPassenger = 0; + String distanceByPassenger = ''; + + Future drawDriverPathOnly(LatLng driverPos, LatLng passengerPos) async { + final String apiUrl = 'https://routec.intaleq.xyz/route'; + final String apiKey = Env.mapKeyOsm; + final String origin = '${driverPos.latitude},${driverPos.longitude}'; + final String dest = '${passengerPos.latitude},${passengerPos.longitude}'; + + final Uri uri = Uri.parse( + '$apiUrl?origin=$origin&destination=$dest&steps=false&overview=full'); + + try { + final response = await http.get(uri, headers: {'X-API-KEY': apiKey}); + if (response.statusCode == 200) { + final data = jsonDecode(response.body); + if (data['status'] == 'ok' && data['polyline'] != null) { + final String pointsString = data['polyline']; + List decodedPoints = + await compute(decodePolylineIsolate, pointsString); + _currentDriverRoutePoints = decodedPoints; + final double decodedDistance = _pathDistanceMeters(decodedPoints); + if (decodedDistance > 0) { + _currentDriverRouteDistanceMeters = decodedDistance; + } + + polyLines = polyLines + .where((p) => + !p.polylineId.value.startsWith('driver_route') && + p.polylineId.value != 'main_route' && + p.polylineId.value != 'route_primary' && + p.polylineId.value != 'route_direct') + .toSet(); + + // رسم خط صلب (Solid) من السائق للراكب + final Polyline driverSolidPolyline = Polyline( + polylineId: const PolylineId('driver_route_solid'), + points: decodedPoints, + color: Colors.amber, // مسار القدوم باللون الأصفر + width: 5, + ); + polyLines.add(driverSolidPolyline); + update(); + } + } + } catch (e) { + Log.print('Error drawing driver path: $e'); + } + } + + void listenToRideStatusStream() { + rideStatusStream.listen((rideStatus) { + Log.print("Ride Status: $rideStatus"); + }, onError: (error) { + Log.print("Error in Ride Status Stream: $error"); + }); + } + + void start15SecondTimer(String rideId) {} + + void startUiCountdown() { + _uiCountdownTimer?.cancel(); + progress = 0; + remainingTime = durationTimer; + + _uiCountdownTimer = Timer.periodic(const Duration(seconds: 1), (timer) { + int i = timer.tick; + progress = i / durationTimer; + remainingTime = durationTimer - i; + + if (remainingTime <= 0) { + timer.cancel(); + rideConfirm = false; + timeToPassengerFromDriverAfterApplied += durationToPassenger; + timerEnded(); + } + update(); + }); + } + + double progress = 0; + int durationTimer = 9; + + void timerEnded() async { + runEvery30SecondsUntilConditionMet(); + isCancelRidePageShown = false; + update(); + } + + late String driverCarModel = '', driverCarMake = '', driverLicensePlate = ''; + + Future getUpdatedRideForDriverApply(String rideId) async { + if (rideId == 'yet' || rideId.isEmpty) return; + + try { + final res = await CRUD().get( + link: "${AppLink.server}/ride/rides/getRideOrderID.php", + payload: {'passengerID': box.read(BoxName.passengerID).toString()}); + + if (res != 'failure') { + var response = jsonDecode(res); + Log.print('getUpdatedRideForDriverApply Response: $response'); + + if (response['status'] == 'success' && + response['data'] != null && + response['data'] is Map) { + var data = response['data']; + + driverId = data['driver_id']?.toString() ?? ''; + driverPhone = data['phone']?.toString() ?? ''; + driverCarMake = data['make']?.toString() ?? ''; + model = data['model']?.toString() ?? ''; + colorHex = data['color_hex']?.toString() ?? ''; + carColor = data['color']?.toString() ?? ''; + make = data['make']?.toString() ?? ''; + licensePlate = data['car_plate']?.toString() ?? ''; + + String firstName = data['passengerName']?.toString() ?? ''; + String lastName = data['last_name']?.toString() ?? ''; + passengerName = + lastName.isNotEmpty ? "$firstName $lastName" : firstName; + driverName = data['driverName']?.toString() ?? ''; + driverToken = data['token']?.toString() ?? ''; + carYear = data['year']?.toString() ?? ''; + driverRate = data['ratingDriver']?.toString() ?? '5.0'; + + update(); + } + } + } catch (e) { + Log.print("Error in getUpdatedRideForDriverApply: $e"); + } + } + + String getLocationArea(double latitude, double longitude) { + LatLng passengerPoint = LatLng(latitude, longitude); + String previousCountry = box.read(BoxName.countryCode)?.toString() ?? ''; + String newCountry = 'Jordan'; + + if (isPointInPolygon(passengerPoint, CountryPolygons.jordanBoundary)) { + newCountry = 'Jordan'; + } else if (isPointInPolygon( + passengerPoint, CountryPolygons.syriaBoundary)) { + newCountry = 'Syria'; + } else if (isPointInPolygon( + passengerPoint, CountryPolygons.egyptBoundary)) { + newCountry = 'Egypt'; + } else { + newCountry = 'Jordan'; + } + + box.write(BoxName.countryCode, newCountry); + box.write(BoxName.serverChosen, AppLink.server); + + if (newCountry != previousCountry) { + unawaited(getKazanPercent()); + } + + return newCountry; + } + + bool isPointInPolygon(LatLng point, List polygon) { + int intersections = 0; + for (int i = 0; i < polygon.length; i++) { + LatLng vertex1 = polygon[i]; + LatLng vertex2 = polygon[(i + 1) % polygon.length]; + + if (_rayIntersectsSegment(point, vertex1, vertex2)) { + intersections++; + } + } + return intersections % 2 != 0; + } + + bool _rayIntersectsSegment(LatLng point, LatLng vertex1, LatLng vertex2) { + double px = point.longitude; + double py = point.latitude; + double v1x = vertex1.longitude; + double v1y = vertex1.latitude; + double v2x = vertex2.longitude; + double v2y = vertex2.latitude; + + if ((py < v1y && py < v2y) || (py > v1y && py > v2y)) { + return false; + } + double intersectX = v1x + (py - v1y) * (v2x - v1x) / (v2y - v1y); + return intersectX > px; + } + + String generateTrackingLink(String rideId, String driverId) { + String cleanRideId = rideId.toString().trim(); + String cleanDriverId = driverId.toString().trim(); + const String secretSalt = "Intaleq_Secure_Track_2025"; + + String rawString = "$cleanRideId$cleanDriverId$secretSalt"; + var bytes = utf8.encode(rawString); + var digest = md5.convert(bytes); + String token = digest.toString(); + + return "https://intaleqapp.com/track/index.php?id=$cleanRideId&token=$token"; + } + + calcualateDistsanceInMetet(LatLng prev, current) async { + double distance2 = Geolocator.distanceBetween( + prev.latitude, + prev.longitude, + current.latitude, + current.longitude, + ); + return distance2; + } + + uploadPassengerLocation() async { + await CRUD().post(link: AppLink.addpassengerLocation, payload: { + "passengerId": box.read(BoxName.passengerID), + "lat": passengerLocation.latitude.toString(), + "lng": passengerLocation.longitude.toString(), + "rideId": rideId.toString() + }); + } + + void _showRideStartNotifications() { + if (['Speed', 'Awfar Car'].contains(box.read(BoxName.carType))) { + NotificationController().showNotification('Fixed Price'.tr, + 'The captain is responsible for the route.'.tr, 'ding'); + } else if (['Comfort', 'Lady'].contains(box.read(BoxName.carType))) { + NotificationController().showNotification('Attention'.tr, + 'The price may increase if the route changes.'.tr, 'ding'); + } + } + + bool promoTaken = false; + final promo = TextEditingController(); + + void applyPromoCodeToPassenger(BuildContext context) async { + if (promoTaken == true) { + MyDialog().getDialog( + 'Promo Already Used'.tr, + 'You have already used this promo code.'.tr, + () => Get.back(), + ); + return; + } + + if (!promoFormKey.currentState!.validate()) return; + + const double minPromoLowSYP = 172; + const double minPromoHighSYP = 200; + + try { + final value = await CRUD().get( + link: AppLink.getPassengersPromo, + payload: {'promo_code': promo.text}, + ); + + if (value == 'failure') { + MyDialog().getDialog( + 'Promo Ended'.tr, + 'The promotion period has ended.'.tr, + () => Get.back(), + ); + return; + } + + final bool eligibleNow = (totalPassengerSpeed >= minPromoLowSYP) || + (totalPassengerBalash >= minPromoLowSYP) || + (totalPassengerComfort >= minPromoHighSYP) || + (totalPassengerElectric >= minPromoHighSYP) || + (totalPassengerLady >= minPromoHighSYP); + + if (!eligibleNow) { + Get.snackbar( + 'Lowest Price Achieved'.tr, + 'Cannot apply further discounts.'.tr, + backgroundColor: AppColor.yellowColor, + ); + return; + } + + final decode = jsonDecode(value); + if (decode["status"] != "success") { + MyDialog().getDialog( + 'Promo Ended'.tr, + 'The promotion period has ended.'.tr, + () => Get.back(), + ); + return; + } + + Get.snackbar('Promo Code Accepted'.tr, '', + backgroundColor: AppColor.greenColor); + + final firstElement = decode["message"][0]; + final int discountPercentage = + int.tryParse(firstElement['amount'].toString()) ?? 0; + + final double walletVal = double.tryParse( + box.read(BoxName.passengerWalletTotal)?.toString() ?? '0') ?? + 0.0; + + final bool isWalletNegative = walletVal < 0; + + double _applyDiscountPerTier({ + required double fare, + required double minThreshold, + required bool isWalletNegative, + }) { + if (fare < minThreshold) return fare; + + final double discount = fare * (discountPercentage / 100.0); + double result; + + if (isWalletNegative) { + double neg = (-1) * walletVal; + result = fare + neg - discount; + } else { + result = fare - discount; + } + + if (result < minThreshold) { + result = minThreshold; + } + return result.clamp(0.0, double.infinity); + } + + totalPassengerComfort = _applyDiscountPerTier( + fare: totalPassengerComfort, + minThreshold: minPromoHighSYP, + isWalletNegative: isWalletNegative, + ); + + totalPassengerElectric = _applyDiscountPerTier( + fare: totalPassengerElectric, + minThreshold: minPromoHighSYP, + isWalletNegative: isWalletNegative, + ); + + totalPassengerLady = _applyDiscountPerTier( + fare: totalPassengerLady, + minThreshold: minPromoHighSYP, + isWalletNegative: isWalletNegative, + ); + + totalPassengerSpeed = _applyDiscountPerTier( + fare: totalPassengerSpeed, + minThreshold: minPromoLowSYP, + isWalletNegative: isWalletNegative, + ); + + totalPassengerBalash = _applyDiscountPerTier( + fare: totalPassengerBalash, + minThreshold: minPromoLowSYP, + isWalletNegative: isWalletNegative, + ); + + totalDriver = totalDriver - (totalDriver * discountPercentage / 100.0); + promoTaken = true; + update(); + + Confetti.launch( + context, + options: const ConfettiOptions(particleCount: 100, spread: 70, y: 0.6), + ); + + Get.back(); + await Future.delayed(const Duration(milliseconds: 120)); + } catch (e) { + Get.snackbar('Error'.tr, e.toString(), + backgroundColor: AppColor.redColor); + } + } + + double getDistanceFromText(String distanceText) { + String distanceValue = distanceText.replaceAll(RegExp(r'[^0-9.]+'), ''); + double distance = double.parse(distanceValue); + return distance; + } + + double costForDriver = 0; + + Future bottomSheet() async { + const double minFareSYP = 160; + const double minBillableKm = 0.3; + const double ladyFlatAddon = 20; + const double airportAddonSYP = 200; + const double damascusAirportBoundAddon = 1400; + + const double electricPerKmUplift = 4; + const double electricFlatAddon = 10; + + const double longSpeedThresholdKm = 40.0; + const double longSpeedPerKm = 26.0; + + const double mediumDistThresholdKm = 25.0; + const double longDistThresholdKm = 35.0; + const double longTripPerMin = 6.0; + const int minuteCapMedium = 60; + const int minuteCapLong = 80; + const int freeMinutesLong = 10; + + const double extraReduction100 = 0.07; + const double maxReductionCap = 0.35; + + durationToAdd = Duration(seconds: durationToRide); + hours = durationToAdd.inHours; + minutes = (durationToAdd.inMinutes % 60).round(); + final DateTime currentTime = DateTime.now(); + newTime = currentTime.add(durationToAdd); + averageDuration = (durationToRide / 60) / distance; + final int waypointSurchargeMinutes = activeMenuWaypointCount * 5; + final int totalMinutes = + (durationToRide / 60).floor() + waypointSurchargeMinutes; + + bool _isAirport(String s) { + final t = s.toLowerCase(); + return t.contains('airport') || + s.contains('مطار') || + s.contains('المطار'); + } + + bool _isClub(String s) { + final t = s.toLowerCase(); + return t.contains('club') || + t.contains('nightclub') || + t.contains('night club') || + s.contains('ديسكو') || + s.contains('ملهى ليلي'); + } + + bool _isInsideDamascusAirportBounds(double lat, double lng) { + final double northLat = 33.415313; + final double southLat = 33.400265; + final double eastLng = 36.531505; + final double westLng = 36.499687; + + bool isLatInside = (lat <= northLat) && (lat >= southLat); + bool isLngInside = (lng <= eastLng) && (lng >= westLng); + return isLatInside && isLngInside; + } + + final double naturePerMin = naturePrice; + final double latePerMin = latePrice; + final double heavyPerMin = heavyPrice; + + double _perMinuteByTime(DateTime now, bool clubCtx) { + final h = now.hour; + if (h >= 21 || h < 1) return latePerMin; + if (h >= 1 && h < 5) return clubCtx ? (latePerMin * 2) : latePerMin; + if (h >= 14 && h <= 17) return heavyPerMin; + return naturePerMin; + } + + double _applyMinFare(double fare) => + (fare < minFareSYP) ? minFareSYP : fare; + + double _withCommission(double base) => + (base * (1 + kazan / 100)).ceilToDouble(); + + final bool airportCtx = + _isAirport(startNameAddress) || _isAirport(endNameAddress); + final bool clubCtx = _isClub(startNameAddress) || _isClub(endNameAddress); + + double destLat = 0.0; + double destLng = 0.0; + try { + destLat = myDestination.latitude; + destLng = myDestination.longitude; + } catch (_) { + if (locSearch.coordinatesWithoutEmpty.isNotEmpty) { + destLat = double.tryParse( + locSearch.coordinatesWithoutEmpty.last.split(',')[0]) ?? + 0.0; + destLng = double.tryParse( + locSearch.coordinatesWithoutEmpty.last.split(',')[1]) ?? + 0.0; + } + } + + final bool damascusAirportBoundCtx = + _isInsideDamascusAirportBounds(destLat, destLng); + final bool isInDamascusAirportBoundCtx = _isInsideDamascusAirportBounds( + newMyLocation.latitude.toDouble(), + newMyLocation.longitude.toDouble(), + ); + + final double billableDistance = + (distance < minBillableKm) ? minBillableKm : distance; + + final bool isLongSpeed = billableDistance > longSpeedThresholdKm; + final double perKmSpeedBaseFromServer = speedPrice; + final double perKmSpeed = + isLongSpeed ? longSpeedPerKm : perKmSpeedBaseFromServer; + + double reductionPct40 = 0.0; + if (perKmSpeedBaseFromServer > 0) { + reductionPct40 = (1.0 - (longSpeedPerKm / perKmSpeedBaseFromServer)) + .clamp(0.0, maxReductionCap); + } + final double reductionPct100 = + (reductionPct40 + extraReduction100).clamp(0.0, maxReductionCap); + double distanceReduction = 0.0; + if (billableDistance > 100.0) { + distanceReduction = reductionPct100; + } else if (billableDistance > 40.0) { + distanceReduction = reductionPct40; + } + + double effectivePerMin = _perMinuteByTime(currentTime, clubCtx); + int billableMinutes = totalMinutes; + if (billableDistance > longDistThresholdKm) { + effectivePerMin = longTripPerMin; + final int capped = + (billableMinutes > minuteCapLong) ? minuteCapLong : billableMinutes; + billableMinutes = capped - freeMinutesLong; + if (billableMinutes < 0) billableMinutes = 0; + } else if (billableDistance > mediumDistThresholdKm) { + effectivePerMin = longTripPerMin; + billableMinutes = (billableMinutes > minuteCapMedium) + ? minuteCapMedium + : billableMinutes; + } + + final double perKmComfortRaw = comfortPrice; + final double perKmDelivery = deliveryPrice; + final double perKmVanRaw = + (familyPrice > 0 ? familyPrice : (speedPrice + 13)); + final double perKmElectricRaw = perKmComfortRaw + electricPerKmUplift; + + double perKmComfort = perKmComfortRaw * (1.0 - distanceReduction); + double perKmElectric = perKmElectricRaw * (1.0 - distanceReduction); + double perKmVan = perKmVanRaw * (1.0 - distanceReduction); + perKmComfort = perKmComfort.clamp(0, double.infinity); + perKmElectric = perKmElectric.clamp(0, double.infinity); + perKmVan = perKmVan.clamp(0, double.infinity); + final double perKmBalash = (perKmSpeed - 5).clamp(0, double.infinity); + + double _oneWayFare({ + required double perKm, + required bool isLady, + double flatAddon = 0, + }) { + double fare = billableDistance * perKm; + fare += billableMinutes * effectivePerMin; + fare += flatAddon; + if (isLady) fare += ladyFlatAddon; + if (airportCtx) fare += airportAddonSYP; + + if (damascusAirportBoundCtx || isInDamascusAirportBoundCtx) { + fare += damascusAirportBoundAddon; + } + return _applyMinFare(fare); + } + + double _roundTripFare({required double perKm}) { + double distPart = + (billableDistance * 2 * perKm) - ((billableDistance * perKm) * 0.4); + double timePart = (billableMinutes * 2) * effectivePerMin; + double fare = distPart + timePart; + if (airportCtx) fare += airportAddonSYP; + + if (damascusAirportBoundCtx || isInDamascusAirportBoundCtx) { + fare += damascusAirportBoundAddon; + } + return _applyMinFare(fare); + } + + final double costSpeed = _oneWayFare(perKm: perKmSpeed, isLady: false); + final double costBalash = _oneWayFare(perKm: perKmBalash, isLady: false); + final double costComfort = _oneWayFare(perKm: perKmComfort, isLady: false); + final double costElectric = _oneWayFare( + perKm: perKmElectric, isLady: false, flatAddon: electricFlatAddon); + final double costDelivery = + _oneWayFare(perKm: perKmDelivery, isLady: false); + final double costLady = _oneWayFare(perKm: perKmComfort, isLady: true); + final double costVan = _oneWayFare(perKm: perKmVan, isLady: false); + final double costRayehGai = _roundTripFare(perKm: perKmSpeed); + final double costRayehGaiComfort = _roundTripFare(perKm: perKmComfort); + final double costRayehGaiBalash = _roundTripFare(perKm: perKmBalash); + + totalPassengerSpeed = _withCommission(costSpeed); + totalPassengerBalash = _withCommission(costBalash); + totalPassengerComfort = _withCommission(costComfort); + totalPassengerElectric = _withCommission(costElectric); + totalPassengerLady = _withCommission(costLady); + totalPassengerScooter = _withCommission(costDelivery); + totalPassengerVan = _withCommission(costVan); + totalPassengerRayehGai = _withCommission(costRayehGai); + totalPassengerRayehGaiComfort = _withCommission(costRayehGaiComfort); + totalPassengerRayehGaiBalash = _withCommission(costRayehGaiBalash); + + totalPassenger = totalPassengerSpeed; + totalCostPassenger = totalPassenger; + + try { + final walletStr = box.read(BoxName.passengerWalletTotal).toString(); + final walletVal = double.tryParse(walletStr) ?? 0.0; + if (walletVal < 0) { + final neg = (-1) * walletVal; + totalPassenger += neg; + totalPassengerComfort += neg; + totalPassengerElectric += neg; + totalPassengerLady += neg; + totalPassengerBalash += neg; + totalPassengerScooter += neg; + totalPassengerRayehGai += neg; + totalPassengerRayehGaiComfort += neg; + totalPassengerRayehGaiBalash += neg; + totalPassengerVan += neg; + } + } catch (e) { + Log.print("Error: $e"); + } + + update(); + mapEngine.changeBottomSheetShown(forceValue: true); + } + + // حساب المسار بين السائق والراكب وعرضه على الخريطة. + // ترسل هذه الدالة طلبًا للخادم للحصول على إحداثيات المسار وتفك تشفيره. + // ثم تقوم بتحديث المسافة والوقت وعرض الخطوط المناسبة على الخريطة. + Future calculateDriverToPassengerRoute( + LatLng driverPos, LatLng passengerPos, + {bool isBeginPhase = false}) async { + final Map queryParams = { + 'fromLat': driverPos.latitude.toString(), + 'fromLng': driverPos.longitude.toString(), + 'toLat': passengerPos.latitude.toString(), + 'toLng': passengerPos.longitude.toString(), + }; + final uri = + Uri.parse(AppLink.mapSaasRoute).replace(queryParameters: queryParams); + + Log.print('📍 Calculating Driver Route: $uri'); + + try { + final response = await http.get(uri, headers: { + 'x-api-key': Env.mapSaasKey, + }).timeout(const Duration(seconds: 20)); + + if (response.statusCode == 200) { + final responseData = json.decode(response.body); + + var routeData = responseData['routes'] != null + ? responseData['routes'][0] + : responseData; + + double durationSecondsRaw = (routeData['duration'] as num).toDouble(); + int finalDurationSeconds = + (durationSecondsRaw * kDurationScalar).toInt(); + double distanceMeters = (routeData['distance'] as num).toDouble(); + + updateDriverRouteMetrics( + etaSeconds: finalDurationSeconds, + distanceMeters: distanceMeters, + ); + _currentDriverRouteDistanceMeters = distanceMeters; + _currentDriverRouteDurationSeconds = finalDurationSeconds; + + int minutes = (finalDurationSeconds / 60).floor(); + int seconds = finalDurationSeconds % 60; + stringRemainingTimeToPassenger = + '$minutes:${seconds.toString().padLeft(2, '0')}'; + + Log.print( + '✅ Driver Route Info: $minutes min, ${distanceMeters.toInt()} m'); + + String pointsString = + routeData['points'] ?? routeData['geometry'] ?? ""; + if (pointsString.isNotEmpty) { + List decodedPoints = + await compute(decodePolylineIsolate, pointsString); + _currentDriverRoutePoints = decodedPoints; + final double decodedDistance = _pathDistanceMeters(decodedPoints); + if (decodedDistance > 0) { + _currentDriverRouteDistanceMeters = decodedDistance; + } + // مسح كل السلمات السابقة (الخط المستمر والمتقطع على حد سواء) + polyLines = polyLines + .where((p) => + !p.polylineId.value.startsWith('driver_route') && + p.polylineId.value != 'main_route' && + p.polylineId.value != 'route_primary' && + p.polylineId.value != 'route_direct') + .toSet(); + + if (isBeginPhase) { + // حالة Begin: لا نرسم مسار السائق القديم إطلاقاً لأنه وصل والآن الرحلة ستبدأ + polyLines = polyLines + .where((p) => !p.polylineId.value.startsWith('driver_route')) + .toSet(); + } else { + // مسح السلمات القديمة أولاً + polyLines = polyLines + .where((p) => + !p.polylineId.value.startsWith('driver_route') && + p.polylineId.value != 'main_route' && + p.polylineId.value != 'route_primary' && + p.polylineId.value != 'route_direct') + .toSet(); + // حالة Apply/Arrived: خط متصل صلب بدل المتقطع + polyLines = { + ...polyLines, + Polyline( + polylineId: const PolylineId('driver_route_solid'), + points: decodedPoints, + color: Colors.amber, // مسار القدوم باللون الأصفر + width: 5, + ) + }; + } + } + + mapEngine.fitCameraToPoints(driverPos, passengerPos); + update(); + } + } catch (e) { + Log.print('❌ Error calculating driver route: $e'); + } + } + + Future checkAndRecalculateIfDeviated( + LatLng driverPos, { + double? heading, + double? speed, + }) async { + if (_isRecalculatingRoute || _currentDriverRoutePoints.isEmpty) return; + + double minDistance = 100000.0; + int closestIdx = 0; + for (int idx = 0; idx < _currentDriverRoutePoints.length; idx++) { + final point = _currentDriverRoutePoints[idx]; + double dist = Geolocator.distanceBetween(driverPos.latitude, + driverPos.longitude, point.latitude, point.longitude); + if (dist < minDistance) { + minDistance = dist; + closestIdx = idx; + } + } + + final bool distanceDeviation = minDistance > _deviationThresholdMeters; + final bool headingDeviation = _isHeadingAwayFromRoute( + heading: heading, + speed: speed, + closestRouteIndex: closestIdx, + distanceFromRouteMeters: minDistance, + ); + + if (!headingDeviation) { + _routeHeadingMismatchCount = 0; + } else { + _routeHeadingMismatchCount++; + } + + if (distanceDeviation || _routeHeadingMismatchCount >= 2) { + Log.print( + "⚠️ Driver deviated (${minDistance.toStringAsFixed(1)} m, heading mismatch: $_routeHeadingMismatchCount). Recalculating route..."); + _routeHeadingMismatchCount = 0; + _isRecalculatingRoute = true; + if (statusRide == 'Begin' || + currentRideState.value == RideState.inProgress) { + await calculateDriverToPassengerRoute(driverPos, myDestination, + isBeginPhase: true); + } else { + await calculateDriverToPassengerRoute(driverPos, passengerLocation); + } + _isRecalculatingRoute = false; + } + } + + // تحديث الجزء المتبقي من المسار والمسافة والوقت بشكل تفاعلي. + // تحدد الدالة أقرب نقطة للسائق على المسار الحالي وتقوم بقص النقاط السابقة. + // ثم تعيد حساب المسافة والوقت المتبقيين محلياً وتحديث الخطوط على الخريطة. + void updateRemainingRoute(LatLng driverPos, {bool updateEta = true}) { + if (_currentDriverRoutePoints.isEmpty) return; + + int closestIdx = 0; + double minDistance = double.infinity; + for (int i = 0; i < _currentDriverRoutePoints.length; i++) { + double dist = Geolocator.distanceBetween( + driverPos.latitude, + driverPos.longitude, + _currentDriverRoutePoints[i].latitude, + _currentDriverRoutePoints[i].longitude); + if (dist < minDistance) { + minDistance = dist; + closestIdx = i; + } + } + + if (minDistance < 150.0) { + List remainingPoints = + _currentDriverRoutePoints.sublist(closestIdx); + + if (updateEta) { + final double remainingDistance = _pathDistanceMeters(remainingPoints); + int remainingDuration = _currentDriverRouteDurationSeconds; + if (remainingDistance > 0 && + _currentDriverRouteDistanceMeters > 0 && + _currentDriverRouteDurationSeconds > 0) { + remainingDuration = + ((_currentDriverRouteDurationSeconds * remainingDistance) / + _currentDriverRouteDistanceMeters) + .round(); + } + + remainingDuration = max(0, remainingDuration); + updateDriverRouteMetrics( + etaSeconds: remainingDuration, + distanceMeters: remainingDistance, + ); + } + + polyLines = polyLines + .where((p) => + !p.polylineId.value.startsWith('driver_route') && + p.polylineId.value != 'main_route' && + p.polylineId.value != 'route_primary' && + p.polylineId.value != 'route_direct') + .toSet(); + + if (statusRide == 'Begin' || + currentRideState.value == RideState.inProgress) { + // لا نرسم أي شيء في حالة البدء لأنه وصل + polyLines = polyLines + .where((p) => !p.polylineId.value.startsWith('driver_route')) + .toSet(); + } else { + polyLines = { + ...polyLines, + Polyline( + polylineId: const PolylineId('driver_route_solid'), + points: remainingPoints, + color: Colors.amber, + width: 5, + ), + }; + } + update(); + } + } + + Future getDriverCarsLocationToPassengerAfterApplied() async { + bool isRideActive = (statusRide == 'Apply' || + statusRide == 'Arrived' || + statusRide == 'Begin' || + currentRideState.value == RideState.driverApplied || + currentRideState.value == RideState.driverArrived || + currentRideState.value == RideState.inProgress); + + if (!isRideActive || + statusRide == 'Finished' || + statusRide == 'Cancel' || + currentRideState.value == RideState.finished || + currentRideState.value == RideState.noRide || + currentRideState.value == RideState.preCheckReview) { + return; + } + + if (_isFetchingDriverLocation) return; + _isFetchingDriverLocation = true; + + try { + var res = await CRUD().get( + link: AppLink.getDriverCarsLocationToPassengerAfterApplied, + payload: {'driver_id': driverId}); + + if (res != 'failure') { + var datadriverLocation = jsonDecode(res); + + if (datadriverLocation['message'] != null && + datadriverLocation['message'].isNotEmpty) { + var _data = datadriverLocation['message'][0]; + + LatLng newDriverPos = LatLng( + double.parse(_data['latitude'].toString()), + double.parse(_data['longitude'].toString())); + double newHeading = + double.tryParse(_data['heading']?.toString() ?? '0') ?? 0.0; + double speed = + double.tryParse(_data['speed']?.toString() ?? '0') ?? 0; + + if (driverCarsLocationToPassengerAfterApplied.length > 10) { + driverCarsLocationToPassengerAfterApplied.removeAt(0); + } + driverCarsLocationToPassengerAfterApplied.add(newDriverPos); + checkAndRecalculateIfDeviated( + newDriverPos, + heading: newHeading, + speed: speed, + ); + updateRemainingRoute(newDriverPos); + if (statusRide == 'Begin' || + currentRideState.value == RideState.inProgress) { + double zoom = 16.5; + if (speed > 0) { + zoom = 17.0 - ((speed - 10) / 70) * 2.5; + zoom = zoom.clamp(14.5, 17.0); + } + if (mapEngine.mapController != null) { + mapEngine.mapController!.animateCamera( + CameraUpdate.newLatLngZoom(newDriverPos, zoom)); + } + } + mapEngine.clearMarkersExceptStartEndAndDriver(); + reloadMarkerDriverCarsLocationToPassengerAfterApplied( + datadriverLocation); + } + } + update(); + } catch (e) { + Log.print('Error fetching driver location: $e'); + } finally { + _isFetchingDriverLocation = false; + } + } + + void reloadMarkerDriverCarsLocationToPassengerAfterApplied( + dynamic datadriverLocation) { + if (datadriverLocation == null || + datadriverLocation['message'] == null || + datadriverLocation['message'].isEmpty) { + return; + } + + var driverData = datadriverLocation['message'][0]; + LatLng newPosition = LatLng(double.parse(driverData['latitude'].toString()), + double.parse(driverData['longitude'].toString())); + double newHeading = + double.tryParse(driverData['heading'].toString()) ?? 0.0; + + String icon; + if (driverData['model'].toString().contains('دراجة') || + driverData['make'].toString().contains('دراجة')) { + icon = mapEngine.motoIcon; + } else if (driverData['gender'] == 'Female') { + icon = mapEngine.ladyIcon; + } else { + icon = mapEngine.carIcon; + } + + final String markerId = 'assigned_driver_marker'; + final mId = MarkerId(markerId); + final existingMarker = markers.cast().firstWhere( + (m) => m?.markerId == mId, + orElse: () => null, + ); + + if (existingMarker != null) { + mapEngine.smoothlyUpdateMarker( + existingMarker, newPosition, newHeading, icon); + } else { + markers = { + ...markers, + Marker( + markerId: mId, + position: newPosition, + rotation: newHeading, + icon: InlqBitmap.fromStyleImage(icon), + anchor: const Offset(0.5, 0.5), + ), + }; + update(); + } + } + + void updateDriverMarker(LatLng position, double heading) { + const String markerId = 'assigned_driver_marker'; + const mId = MarkerId(markerId); + + // Choose icon based on vehicle type + String icon; + if (model.contains('دراجة') || make.contains('دراجة')) { + icon = mapEngine.motoIcon; + } else { + icon = mapEngine.carIcon; + } + + final existingMarker = markers.cast().firstWhere( + (m) => m?.markerId == mId, + orElse: () => null, + ); + + if (existingMarker != null) { + mapEngine.smoothlyUpdateMarker(existingMarker, position, heading, icon); + } else { + markers = { + ...markers, + Marker( + markerId: mId, + position: position, + icon: InlqBitmap.fromStyleImage(icon), + rotation: heading, + anchor: const Offset(0.5, 0.5), + ), + }; + update(); + } + } + + Future runEvery30SecondsUntilConditionMet() async { + double tripDurationInMinutes = durationToPassenger / 5; + int loopCount = tripDurationInMinutes.ceil(); + for (var i = 0; i < loopCount; i++) { + await Future.delayed(const Duration(seconds: 5)); + if (rideTimerBegin == true || statusRide == 'Apply') { + await getDriverCarsLocationToPassengerAfterApplied(); + } + } + } + + Future runWhenRideIsBegin() async { + double tripDurationInMinutes = durationToRide / 6; + int loopCount = tripDurationInMinutes.ceil(); + mapEngine.clearMarkersExceptStartEndAndDriver(); + for (var i = 0; i < loopCount; i++) { + await Future.delayed(const Duration(seconds: 4)); + await getDriverCarsLocationToPassengerAfterApplied(); + } + } + + // بدء مراقب اتصال المقبس (Socket Watchdog). + // يتحقق دورياً كل 5 ثوانٍ من آخر تحديث تم استلامه عبر المقبس. + // في حال وجود خمول لأكثر من 15 ثانية، يجلب الموقع عبر واجهة التطبيق كطلب مفرد. + // وإذا زاد الخمول عن 30 ثانية، يبدأ آلية الاقتراع الدوري كخيار احتياطي. + void _startSocketWatchdog() { + _watchdogTimer?.cancel(); + Log.print("👀 Starting Socket Watchdog (Hybrid Mode)..."); + + _watchdogTimer = Timer.periodic(const Duration(seconds: 5), (timer) async { + if (currentRideState.value != RideState.driverApplied && + currentRideState.value != RideState.driverArrived && + currentRideState.value != RideState.inProgress) { + timer.cancel(); + return; + } + + final lastTime = mapSocket.lastDriverLocationTime ?? + DateTime.now().subtract(const Duration(minutes: 1)); + final difference = DateTime.now().difference(lastTime).inSeconds; + + if (difference < 15 && mapSocket.isSocketConnected) { + if (_locationPollingTimer != null && + _rideAcceptedViaSource == "Socket") { + Log.print("✅ Socket recovered. Stopping polling fallback."); + stopDriverLocationPolling(); + } + } else if (difference >= 15 && difference < 30) { + Log.print("⚠️ Socket silent for ${difference}s. Single API Poll..."); + await getDriverCarsLocationToPassengerAfterApplied(); + try { + String statusFromServer = await getRideStatus(rideId); + _handleServerStatusTransition(statusFromServer); + } catch (e) { + Log.print("Error polling ride status in watchdog: $e"); + } + } else if (difference >= 30) { + if (_locationPollingTimer == null) { + Log.print( + "🔴 Socket dead for ${difference}s. Activating polling fallback!"); + _startDriverLocationPollingWithTimer(); + } else { + await getDriverCarsLocationToPassengerAfterApplied(); + try { + String statusFromServer = await getRideStatus(rideId); + _handleServerStatusTransition(statusFromServer); + } catch (e) { + Log.print("Error polling ride status in watchdog: $e"); + } + } + } + }); + } + + // بدء الاقتراع الدوري لموقع السائق كخيار احتياطي عند توقف أو فشل المقبس. + // يقوم هذا التوقيت دورياً كل 6 ثوانٍ بجلب موقع السائق وتحديث حالة الرحلة. + void _startDriverLocationPollingWithTimer() { + Log.print("📍 Starting Driver Location Polling (6s interval)"); + _locationPollingTimer?.cancel(); + + _locationPollingTimer = Timer.periodic(Duration(seconds: 6), (timer) async { + if (currentRideState.value == RideState.finished || + currentRideState.value == RideState.cancelled || + currentRideState.value == RideState.noRide) { + timer.cancel(); + return; + } + await getDriverCarsLocationToPassengerAfterApplied(); + try { + String statusFromServer = await getRideStatus(rideId); + _handleServerStatusTransition(statusFromServer); + } catch (e) { + Log.print("Error polling ride status in fallback timer: $e"); + } + }); + } + + void _handleServerStatusTransition(String status) { + String lowerStatus = status.toLowerCase(); + Log.print( + "🔄 _handleServerStatusTransition status: $lowerStatus | Current state: ${currentRideState.value}"); + + if (lowerStatus == 'arrived' && + currentRideState.value != RideState.driverArrived) { + processDriverArrival("Polling"); + } else if ((lowerStatus == 'begin' || + lowerStatus == 'started' || + lowerStatus == 'inprogress') && + currentRideState.value != RideState.inProgress) { + processRideBegin(source: "Polling"); + } else if ((lowerStatus == 'finished' || lowerStatus == 'ended') && + currentRideState.value != RideState.finished && + currentRideState.value != RideState.preCheckReview) { + Log.print( + "🏁 Polling detected Finished. Releasing ride and moving to rating."); + stopAllTimers(); + currentRideState.value = RideState.preCheckReview; + tripFinishedFromDriver(); + _checkLastRideForReview(); + } else if (lowerStatus == 'cancelled' || lowerStatus == 'cancel') { + processRideCancelledByDriver({'reason': 'Cancelled by driver'}, + source: "Polling"); + } + } + + void stopDriverLocationPolling() { + Log.print("🛑 Stopping Location Polling"); + _locationPollingTimer?.cancel(); + _locationPollingTimer = null; + } + + Future _addRideToWaitingTable() async { + try { + LatLng startLoc = mapEngine.polylineCoordinates.first; + LatLng endLoc = mapEngine.polylineCoordinates.last; + await CRUD().post(link: AppLink.addWaitingRide, payload: { + 'id': rideId.toString(), + "start_location": '${startLoc.latitude},${startLoc.longitude}', + "end_location": '${endLoc.latitude},${endLoc.longitude}', + "date": DateTime.now().toString(), + "time": DateTime.now().toString(), + "price": totalPassenger.toStringAsFixed(2), + 'passenger_id': box.read(BoxName.passengerID).toString(), + 'status': 'waiting', + 'carType': box.read(BoxName.carType), + 'passengerRate': passengerRate.toStringAsFixed(2), + 'price_for_passenger': totalME.toStringAsFixed(2), + 'distance': distance.toStringAsFixed(1), + 'duration': duration.toStringAsFixed(1), + 'payment_method': + Get.find().isWalletChecked ? 'wallet' : 'cash', + "passenger_wallet": box.read(BoxName.passengerWalletTotal).toString(), + }); + Log.print('[WaitingTable] Ride $rideId added to waiting_ride table.'); + } catch (e) { + Log.print('Error adding ride to waiting_ride table: $e'); + } + } + + double totalME = 0; + double passengerRate = 5; + double comfortPrice = 45; + double speedPrice = 40; + double mashwariPrice = 40; + double familyPrice = 55; + double deliveryPrice = 1.2; + + Future getKazanPercent() async { + var res = await CRUD().get( + link: AppLink.getKazanPercent, + payload: {'country': box.read(BoxName.countryCode).toString()}, + ); + if (res != 'failure') { + var json = jsonDecode(res); + var dataList = json['data'] ?? json['message']; + + if (dataList != null && dataList is List && dataList.isNotEmpty) { + var firstRow = dataList[0]; + kazan = double.parse(firstRow['kazan'].toString()); + naturePrice = double.parse(firstRow['naturePrice'].toString()); + heavyPrice = double.parse(firstRow['heavyPrice'].toString()); + latePrice = double.parse(firstRow['latePrice'].toString()); + comfortPrice = double.parse(firstRow['comfortPrice'].toString()); + speedPrice = double.parse(firstRow['speedPrice'].toString()); + deliveryPrice = double.parse(firstRow['deliveryPrice'].toString()); + mashwariPrice = double.parse(firstRow['freePrice'].toString()); + familyPrice = double.parse(firstRow['familyPrice'].toString()); + fuelPrice = double.parse(firstRow['fuelPrice'].toString()); + } + } + } + + Future getPassengerRate() async { + var res = await CRUD().get( + link: AppLink.getPassengerRate, + payload: {'passenger_id': box.read(BoxName.passengerID)}); + if (res != 'failure') { + var json = jsonDecode(res); + var message = json['data'] ?? json['message']; + if (message['rating'] == null) { + passengerRate = 5.0; + } else { + var rating = message['rating']; + if (rating is String) { + passengerRate = double.tryParse(rating) ?? 5.0; + } else if (rating is num) { + passengerRate = rating.toDouble(); + } else { + passengerRate = 5.0; + } + } + } else { + passengerRate = 5.0; + } + } + + Future addFingerPrint() async { + String fingerPrint = await DeviceHelper.getDeviceFingerprint(); + await CRUD().postWallet(link: AppLink.addFingerPrint, payload: { + 'token': (box.read(BoxName.tokenFCM.toString())), + 'passengerID': box.read(BoxName.passengerID).toString(), + "fingerPrint": fingerPrint + }); + } + + Future firstTimeRunToGetCoupon() async { + if (box.read(BoxName.isFirstTime).toString() == '0' && + box.read(BoxName.isInstall).toString() == '1' && + box.read(BoxName.isGiftToken).toString() == '0') { + var promoCode, discount, validity; + var resPromo = await CRUD().get(link: AppLink.getPromoFirst, payload: { + "passengerID": box.read(BoxName.passengerID).toString(), + }); + if (resPromo != 'failure') { + var d1 = jsonDecode(resPromo); + promoCode = d1['message']['promo_code']; + discount = d1['message']['amount']; + validity = d1['message']['validity_end_date']; + } + box.write(BoxName.isFirstTime, '1'); + + Get.dialog( + AlertDialog( + contentPadding: EdgeInsets.zero, + content: SizedBox( + width: 300, + child: PromoBanner( + promoCode: promoCode, + discountPercentage: discount, + validity: validity, + ), + ), + ), + ); + } + } + + Future detectAndCacheDeviceTier() async { + bool isHighEnd = await DevicePerformanceManager.isHighEndDevice(); + Log.print("Device Analysis - Is Flagship/HighEnd? $isHighEnd"); + box.write(BoxName.lowEndMode, !isHighEnd); + } + + Future initilizeGetStorage() async { + if (box.read(BoxName.addWork) == null) { + box.write(BoxName.addWork, 'addWork'); + } + if (box.read(BoxName.addHome) == null) { + box.write(BoxName.addHome, 'addHome'); + } + if (box.read(BoxName.lowEndMode) == null) { + detectAndCacheDeviceTier(); + } + } + + Future selectDriverAndCarForMishwariTrip() async { + double latitudeOffset = 0.1; + double longitudeOffset = 0.12; + + double southwestLat = passengerLocation.latitude - latitudeOffset; + double northeastLat = passengerLocation.latitude + latitudeOffset; + double southwestLon = passengerLocation.longitude - longitudeOffset; + double northeastLon = passengerLocation.longitude + longitudeOffset; + + var payload = { + 'southwestLat': southwestLat.toString(), + 'northeastLat': northeastLat.toString(), + 'southwestLon': southwestLon.toString(), + 'northeastLon': northeastLon.toString(), + }; + + try { + var res = await CRUD().get( + link: AppLink.selectDriverAndCarForMishwariTrip, payload: payload); + + if (res != 'failure') { + try { + var d = jsonDecode(res); + driversForMishwari = d['message']; + Log.print('driversForMishwari: $driversForMishwari'); + update(); + } catch (e) { + Log.print("Error decoding JSON: $e"); + } + } + } catch (e) { + Log.print("Error Mishwari select: $e"); + } + } + + List driversForMishwari = []; + final Rx selectedDateTime = DateTime.now().obs; + + void updateDateTime(DateTime newDateTime) { + selectedDateTime.value = newDateTime; + } + + Future mishwariOption() async { + isLoading = true; + update(); + await selectDriverAndCarForMishwariTrip(); + Future.delayed(Duration.zero); + isLoading = false; + update(); + Get.to(() => CupertinoDriverListWidget()); + } + + bool isLoading = false; + var driverIdVip = ''; + + Future saveTripData( + Map driver, DateTime tripDateTime) async { + try { + LatLng startLoc = mapEngine.polylineCoordinates.first; + Map tripData = { + 'id': driver['driver_id'].toString(), + 'phone': driver['phone'], + 'gender': driver['gender'], + 'name': driver['NAME'], + 'name_english': driver['name_english'], + 'address': driver['address'], + 'religion': driver['religion'] ?? 'UnKnown', + 'age': driver['age'].toString(), + 'education': driver['education'] ?? 'UnKnown', + 'license_type': driver['license_type'] ?? 'UnKnown', + 'national_number': driver['national_number'] ?? 'UnKnown', + 'car_plate': driver['car_plate'], + 'make': driver['make'], + 'model': driver['model'], + 'year': driver['year'].toString(), + 'color': driver['color'], + 'color_hex': driver['color_hex'], + 'displacement': driver['displacement'], + 'fuel': driver['fuel'], + 'token': driver['token'], + 'rating': driver['rating'].toString(), + 'countRide': driver['ride_count'].toString(), + 'passengerId': box.read(BoxName.passengerID), + 'timeSelected': tripDateTime.toIso8601String(), + 'status': 'pending', + 'startNameAddress': startNameAddress.toString(), + 'locationCoordinate': '${startLoc.latitude},${startLoc.longitude}', + }; + Log.print('tripData: $tripData'); + + var response = + await CRUD().post(link: AppLink.addMishwari, payload: tripData); + + if (response != 'failure') { + var id = response['message']['id'].toString(); + await CRUD() + .post(link: '${AppLink.server}/ride/rides/add.php', payload: { + "start_location": '${startLoc.latitude},${startLoc.longitude}', + "end_location": '${startLoc.latitude},${startLoc.longitude}', + "date": DateTime.now().toString(), + "time": DateTime.now().toString(), + "endtime": DateTime.now().add(const Duration(hours: 2)).toString(), + "price": '50', + "passenger_id": box.read(BoxName.passengerID).toString(), + "driver_id": driver['driver_id'].toString(), + "status": "waiting", + 'carType': 'vip', + "price_for_driver": '50', + "price_for_passenger": '50', + "distance": '20', + "paymentMethod": 'cash', + }).then((value) { + if (value is String) { + final parsedValue = jsonDecode(value); + rideId = parsedValue['message']; + } else if (value is Map) { + rideId = value['message']; + } + }); + + driverIdVip = driver['driver_id'].toString(); + driverId = driver['driver_id'].toString(); + + DateTime timeSelected = DateTime.parse(tripDateTime.toIso8601String()); + Get.find().scheduleNotificationsForTimeSelected( + "Your trip is scheduled".tr, + "Don't forget your ride!".tr, + "tone1", + timeSelected); + + await NotificationService.sendNotification( + category: 'OrderVIP', + target: driver['token'].toString(), + title: 'OrderVIP'.tr, + body: '$rideId - VIP Trip', + isTopic: false, + tone: 'tone1', + driverList: [ + id, + rideId, + driver['id'], + passengerLocation.latitude.toString(), + startNameAddress.toString(), + passengerLocation.longitude.toString(), + (box.read(BoxName.name).toString().split(' ')[0]).toString(), + box.read(BoxName.passengerID).toString(), + box.read(BoxName.phone).toString(), + box.read(BoxName.email).toString(), + box.read(BoxName.passengerPhotoUrl).toString(), + box.read(BoxName.tokenFCM).toString(), + (driver['token'].toString()), + ], + ); + if (response['message'] == "Trip updated successfully") { + mySnackbarSuccess("Trip updated successfully".tr); + await NotificationService.sendNotification( + category: 'Order VIP Canceld', + target: response['previous_driver_token'].toString(), + title: 'Order VIP Canceld'.tr, + body: 'Passenger cancel order'.tr, + isTopic: false, + tone: 'cancel', + driverList: [], + ); + } + isBottomSheetShown = false; + update(); + Get.to(() => VipWaittingPage()); + } else { + throw Exception('Failed to save trip'); + } + } catch (e) { + Get.snackbar('Error'.tr, 'Failed to book trip: $e'.tr, + backgroundColor: AppColor.redColor); + } + } + + Future cancelVip(String token, tripId) async { + var res = await CRUD() + .post(link: AppLink.cancelMishwari, payload: {'id': tripId}); + if (res != 'failure') { + Get.back(); + mySnackbarSuccess('You canceled VIP trip'.tr); + } + } + + void sendToDriverAgain(String token) { + NotificationService.sendNotification( + category: 'Order VIP Canceld', + target: token.toString(), + title: 'Order VIP Canceld'.tr, + body: 'Passenger cancel order'.tr, + isTopic: false, + tone: 'cancel', + driverList: [], + ); + } + + Set notifiedDrivers = {}; + + Future processDriverArrival(String source) async { + if (currentRideState.value == RideState.driverArrived || + _isArrivalProcessed) { + Log.print("✋ Ignored Arrival from $source. Already processed."); + return; + } + + _isArrivalProcessed = true; + Log.print("🚖 Driver Arrived via $source! Processing..."); + + currentRideState.value = RideState.driverArrived; + statusRide = 'Arrived'; + await RideLiveNotification.showDriverArrived(driverName); + + uiInteractions.driverArrivePassengerDialoge(); + startTimerDriverWaitPassenger5Minute(); + + if (mapEngine.polylineCoordinates.isNotEmpty) { + mapEngine.playRouteAnimation( + mapEngine.polylineCoordinates, mapEngine.lastComputedBounds); + } + update(); + } + + Future processRideFinished(List driverList, + {String source = "Unknown"}) async { + if (currentRideState.value == RideState.finished || _isFinishProcessed) { + Log.print("✋ Ignored Finish Request from $source. Already Finished."); + return; + } + + _isFinishProcessed = true; + Log.print("🏁 Ride Finished via $source."); + + currentRideState.value = RideState.finished; + mapSocket.disposeRideSocket(); + stopDriverLocationPolling(); + if (Get.isRegistered()) { + Get.find().stopRecording(); + } + + if (Get.isDialogOpen == true) Get.back(); + + NotificationController().showNotification( + 'Alert'.tr, + "Please make sure not to leave any personal belongings in the car.".tr, + 'tone1', + ); + IosLiveActivityService.endRideActivity(); + PipService.disablePip(); + await RideLiveNotification.cancel(); + + if (driverList.length >= 4) { + String price = driverList[3].toString(); + Get.offAll(() => RateDriverFromPassenger(), arguments: { + 'driverId': driverList[0].toString(), + 'rideId': driverList[1].toString(), + 'price': price + }); + } + } + + Future processRideCancelledByDriver(dynamic data, + {String source = "Unknown"}) async { + if (_isCancelProcessed) return; + + _isCancelProcessed = true; + stopAllTimers(); + if (Get.isDialogOpen == true) Get.back(); + await RideLiveNotification.cancel(); + IosLiveActivityService.endRideActivity(); + PipService.disablePip(); + + Get.defaultDialog( + title: "Sorry 😔".tr, + titleStyle: + const TextStyle(color: Colors.red, fontWeight: FontWeight.bold), + barrierDismissible: false, + content: Column( + children: [ + const Icon(Icons.cancel_presentation, + size: 50, color: Colors.redAccent), + const SizedBox(height: 10), + Text( + "The driver cancelled the trip for an emergency reason.\nDo you want to search for another driver immediately?" + .tr, + textAlign: TextAlign.center, + ), + ], + ), + actions: [ + TextButton( + onPressed: () { + Get.back(); + handleNoDriverFound(); + }, + child: Text("Cancel Trip".tr, + style: const TextStyle(color: Colors.grey)), + ), + ElevatedButton.icon( + style: + ElevatedButton.styleFrom(backgroundColor: AppColor.primaryColor), + icon: const Icon(Icons.refresh, color: Colors.white), + label: Text("Search for another driver".tr, + style: const TextStyle(color: Colors.white)), + onPressed: () { + Get.back(); + retrySearchForDrivers(); + }, + ), + ], + ); + } + + void showNoDriverDialog() { + Get.defaultDialog( + title: "No Drivers Found".tr, + middleText: + "Sorry, there are no cars available of this type right now.".tr, + textConfirm: "Refresh Map".tr, + textCancel: "Cancel".tr, + confirmTextColor: Colors.white, + onConfirm: () { + Get.back(); + restCounter(); + stopAllTimers(); + clearControllersAndGoHome(); + }, + ); + } + + Future + calculateDistanceBetweenPassengerAndDriverBeforeCancelRide() async { + await getDriverCarsLocationToPassengerAfterApplied(); + double dist = Geolocator.distanceBetween( + passengerLocation.latitude, + passengerLocation.longitude, + driverCarsLocationToPassengerAfterApplied.last.latitude, + driverCarsLocationToPassengerAfterApplied.last.longitude, + ); + if (dist > 500) { + isCancelRidePageShown = true; + update(); + } else { + Get.defaultDialog( + barrierDismissible: false, + title: 'The Driver Will be in your location soon .'.tr, + middleText: 'The distance less than 500 meter.'.tr, + confirm: Column( + children: [ + MyElevatedButton( + kolor: AppColor.greenColor, + title: 'Ok'.tr, + onPressed: () { + Get.back(); + }, + ), + MyElevatedButton( + kolor: AppColor.redColor, + title: 'No, I want to cancel this trip'.tr, + onPressed: () { + Get.back(); + MyDialog().getDialog( + 'Attention'.tr, + 'You will be charged for the cost of the driver coming to your location.' + .tr, + () async { + Get.back(); + Get.find() + .payToDriverForCancelAfterAppliedAndHeNearYou(rideId); + }, + ); + }, + ), + ], + ), + ); + } + } + + Future cancelRideAfterRejectFromAll() async { + locSearch.clearPlacesDestination(); + mapEngine.clearPolyline(); + data = []; + await CRUD().post( + link: "${AppLink.server}/ride/rides/cancel_ride_by_passenger.php", + payload: { + "ride_id": rideId.toString(), + "reason": 'notApplyFromAnyDriver' + }); + + rideConfirm = false; + statusRide = 'Cancel'; + isSearchingWindow = false; + shouldFetch = false; + isPassengerChosen = false; + isCashConfirmPageShown = false; + isCashSelectedBeforeConfirmRide = false; + timeToPassengerFromDriverAfterApplied = 0; + mapEngine.changeCancelRidePageShow(); + remainingTime = 0; + update(); + } + + void selectReason0(int index, String note) { + selectedReason = index; + cancelNote = note; + update(); + } + + int selectedReasonIndex = -1; + String selectedReasonText = ""; + TextEditingController otherReasonController = TextEditingController(); + + void selectReason(int index, String reason) { + selectedReasonIndex = index; + selectedReasonText = reason; + update(); + } + + List data = []; + + void restCounter() { + locSearch.clearPlacesDestination(); + mapEngine.clearPolyline(); + data = []; + rideConfirm = false; + shouldFetch = false; + timeToPassengerFromDriverAfterApplied = 0; + update(); + } + + Future _checkAndRefreshMapStyle() async { + try { + final String styleJson = await rootBundle.loadString('assets/style.json'); + final Map decoded = json.decode(styleJson); + final String? currentVersion = + decoded['metadata'] != null ? decoded['metadata']['version'] : null; + + if (currentVersion == null) return; + final String lastVersion = box.read(BoxName.styleVersion) ?? "0.0.0"; + + if (currentVersion != lastVersion) { + Log.print( + "♻️ Map Style Version mismatch ($lastVersion -> $currentVersion). Purging offline cache..."); + await OfflineMapService.instance.clearCache(); + await Future.delayed(const Duration(milliseconds: 500)); + box.write(BoxName.styleVersion, currentVersion); + Log.print("✅ Style Version updated to $currentVersion"); + } + } catch (e) { + Log.print("⚠️ Style version check failed: $e"); + } + } + + void reinit() { + if (currentRideState.value != RideState.noRide && + currentRideState.value != RideState.cancelled) { + Log.print('ℹ️ reinit() skipped: ride is active'); + return; + } + Log.print('🔄 reinit() calling resetAllMapStates and restarting timers...'); + resetAllMapStates(); + stopAllTimers(); + currentRideState.value = RideState.noRide; + + // Restart location search + locSearch.getLocation(); + + // Restart lifecycle timers & stages + getLocationArea(passengerLocation.latitude, passengerLocation.longitude); + unawaited(_stagePricingAndState()); + unawaited(_stageNiceToHave()); + startMasterTimer(); + } + + void resetAllMapStates() { + Log.print('🧹 Resetting all map states to prevent sticky location bug'); + locSearch.clearPlacesDestination(); + locSearch.clearPlacesStart(); + locSearch.waypoints.clear(); + locSearch.clearAllMenuWaypoints(); + if (Get.isRegistered()) { + Get.find().reset(); + } + + // Call reset on mapEngine which handles clearing markers, polylines, animation timers and UI states + mapEngine.reset(); + data = []; + + locSearch.passengerStartLocationFromMap = false; + locSearch.startLocationFromMap = false; + isPickerShown = false; + locSearch.workLocationFromMap = false; + locSearch.homeLocationFromMap = false; + isAnotherOreder = false; + isWhatsAppOrder = false; + + myDestination = passengerLocation; + locSearch.hintTextDestinationPoint = 'Select your destination'.tr; + + locSearch.placeDestinationController.clear(); + locSearch.placeStartController.clear(); + + rideConfirm = false; + shouldFetch = true; // reset to true by default for next ride search polling + isDrawingRoute = false; + isLoading = false; + + // Reset RideLifecycleController specific search and lifecycle states + isSearchingWindow = false; + currentRideState.value = RideState.noRide; + statusRide = 'wait'; + statusRideVip = 'wait'; + statusRideFromStart = false; + isDriverInPassengerWay = false; + isDriverArrivePassenger = false; + _isArrivalProcessed = false; + _isFinishProcessed = false; + _isCancelProcessed = false; + _isAcceptanceProcessed = false; + _isRatingScreenOpen = false; + _isRecalculatingRoute = false; + _isRideStartedProcessed = false; + _isDriverAppliedLogicExecuted = false; + _isDriverArrivedLogicExecuted = false; + _isRideBeginLogicExecuted = false; + _currentDriverRoutePoints = []; + _currentDriverRouteDistanceMeters = 0.0; + _currentDriverRouteDurationSeconds = 0; + _driverEtaUpdatedAt = null; + _driverEtaSecondsAtUpdate = 0; + _driverEtaCountdownTicks = 0; + _routeHeadingMismatchCount = 0; + distanceByPassenger = ''; + durationToPassenger = 0; + stringRemainingTimeToPassenger = ''; + + update(); + } + + void _handleFatalError(String title, String message) { + if (Get.isBottomSheetOpen == true || Get.isDialogOpen == true) { + Get.back(); + } + if (Get.isSnackbarOpen) Get.closeCurrentSnackbar(); + + isDrawingRoute = false; + isLoading = false; + update(); + + Get.defaultDialog( + title: title, + titleStyle: AppStyle.title.copyWith(color: AppColor.redColor), + middleText: message, + middleTextStyle: AppStyle.subtitle, + barrierDismissible: false, + confirm: MyElevatedButton( + title: "Close".tr, + kolor: AppColor.redColor, + onPressed: () { + Get.back(); + clearControllersAndGoHome(); + }, + ), + ); + } + + String shortenAddress(String fullAddress) { + List parts = fullAddress.split('،'); + parts = parts.map((part) => part.trim()).toList(); + parts = parts.where((part) => part.isNotEmpty).toList(); + + String shortAddress = ''; + if (parts.isNotEmpty) { + shortAddress += parts[0]; + } + if (parts.length > 2) { + shortAddress += '، ${parts[2]}'; + } else if (parts.length > 1) { + shortAddress += '، ${parts[1]}'; + } + + if (parts.length > 1) { + shortAddress += '، ${parts.last}'; + } + + shortAddress = shortAddress + .split('،') + .where((part) => !RegExp(r'^[0-9 ]+$').hasMatch(part.trim())) + .join('er'); + + bool isEnglish = + RegExp(r'^[a-zA-Z0-9 ]+$').hasMatch(shortAddress.replaceAll('،', '')); + + if (isEnglish) { + List englishParts = shortAddress.split('،'); + if (englishParts.length > 2) { + shortAddress = + '${englishParts[0]}، ${englishParts[1]}، ${englishParts.last}'; + } else if (englishParts.length > 1) { + shortAddress = '${englishParts[0]}، ${englishParts.last}'; + } + } + return shortAddress; + } + + double distanceOfDestination = 0; + bool haveSteps = false; + + Future getMapPoints( + String originSteps, String destinationSteps, int index) async { + isWayPointStopsSheetUtilGetMap = false; + await nearbyDrivers.getCarsLocationByPassengerAndReloadMarker(); + update(); + + var url = + ('${AppLink.googleMapsLink}directions/json?&language=${box.read(BoxName.lang)}&avoid=tolls|ferries&destination=$destinationSteps&origin=$originSteps&key=${AK.mapAPIKEY}'); + var response = await CRUD().getGoogleApi(link: url, payload: {}); + + data = response['routes'][0]['legs']; + + int durationToRide0 = data[0]['duration']['value']; + durationToRide = durationToRide + durationToRide0; + distance = distanceOfDestination + (data[0]['distance']['value']) / 1000; + + update(); + final String pointsString = + response['routes'][0]["overview_polyline"]["points"]; + + List decodedPoints = + await compute(decodePolylineIsolate, pointsString); + for (int i = 0; i < decodedPoints.length; i++) { + mapEngine.polylineCoordinates.add(decodedPoints[i]); + } + + if (polyLines.isEmpty) { + var polyline = Polyline( + polylineId: PolylineId('route_$index'), + points: locSearch.polylineCoordinatesPointsAll[index], + width: 6, + color: const Color(0xFF2196F3), + ); + + polyLines = {...polyLines, polyline}; + rideConfirm = false; + update(); + } + } + + void updateCameraForDistanceAfterGetMap() { + LatLng coord1 = LatLng( + double.parse(locSearch.coordinatesWithoutEmpty.first.split(',')[0]), + double.parse(locSearch.coordinatesWithoutEmpty.first.split(',')[1])); + + LatLng coord2 = LatLng( + double.parse(locSearch.coordinatesWithoutEmpty.last.split(',')[0]), + double.parse(locSearch.coordinatesWithoutEmpty.last.split(',')[1])); + + LatLng northeastBound; + LatLng southwestBound; + + if (coord1.latitude > coord2.latitude) { + northeastBound = coord1; + southwestBound = coord2; + } else { + northeastBound = coord2; + southwestBound = coord1; + } + + LatLngBounds boundsObj = + LatLngBounds(northeast: northeastBound, southwest: southwestBound); + var cameraUpdate = CameraUpdate.newLatLngBounds(boundsObj, + left: 180, top: 180, right: 180, bottom: 180); + mapController!.animateCamera(cameraUpdate); + update(); + } + + int selectedIndex = -1; + void selectCarFromList(int index) { + selectedIndex = index; + carTypes.forEach((element) => element.isSelected = false); + carTypes[index].isSelected = true; + update(); + } + + Future showBottomSheet1() async { + await bottomSheet(); + isBottomSheetShown = true; + heightBottomSheetShown = 250; + update(); + } + + double calculateAngleBetweenLocations(LatLng start, LatLng end) { + double startLat = start.latitude * pi / 180; + double startLon = start.longitude * pi / 180; + double endLat = end.latitude * pi / 180; + double endLon = end.longitude * pi / 180; + + double dLon = endLon - startLon; + + double y = sin(dLon) * cos(endLat); + double x = + cos(startLat) * sin(endLat) - sin(startLat) * cos(endLat) * cos(dLon); + + double angle = atan2(y, x); + double angleDegrees = angle * 180 / pi; + + return angleDegrees; + } + + get dataCarsLocationByPassenger { + return nearbyDrivers.carsLocationByPassenger; + } + + set dataCarsLocationByPassenger(var val) { + nearbyDrivers.carsLocationByPassenger = val; + } + + double calculateBearing(double lat1, double lon1, double lat2, double lon2) { + return nearbyDrivers.calculateBearing(lat1, lon1, lat2, lon2); + } + + void analyzeBehavior(Position currentPosition, List routePoints) { + nearbyDrivers.analyzeBehavior(currentPosition, routePoints); + } + + void detectStops(Position currentPosition) { + nearbyDrivers.detectStops(currentPosition); + } + + Future getDirectionMap(String origin, String destination, + [List waypoints = const [], int attemptCount = 0]) async { + if (attemptCount == 0) { + isDrawingRoute = true; + update(); + if (isDrawingRoute) showDrawingBottomSheet(); + + await nearbyDrivers.getCarsLocationByPassengerAndReloadMarker(); + } + + if (origin.isEmpty) { + origin = '${passengerLocation.latitude},${passengerLocation.longitude}'; + } + + var coordDestination = destination.split(','); + double latDest = double.parse(coordDestination[0]); + double lngDest = double.parse(coordDestination[1]); + myDestination = LatLng(latDest, lngDest); + + Uri uri; + + var originCoords = origin.split(','); + final Map queryParams = { + 'fromLat': originCoords[0].trim(), + 'fromLng': originCoords[1].trim(), + 'toLat': latDest.toString(), + 'toLng': lngDest.toString(), + }; + + for (int i = 0; i < activeMenuWaypointCount; i++) { + final wp = menuWaypoints[i]; + if (wp != null) { + queryParams['stop${i + 1}Lat'] = wp.latitude.toString(); + queryParams['stop${i + 1}Lng'] = wp.longitude.toString(); + } + } + + uri = Uri.parse(AppLink.mapSaasRoute).replace(queryParameters: queryParams); + + Log.print( + 'Requesting Route URI (SaaS, Attempt: ${attemptCount + 1}): $uri'); + + http.Response response; + Map responseData; + + try { + response = await http.get(uri, headers: { + 'x-api-key': Env.mapSaasKey, + }).timeout(const Duration(seconds: 20)); + + responseData = json.decode(response.body); + + bool isRequestValid = response.statusCode == 200; + + if (!isRequestValid) { + if (attemptCount < 2) { + await _retryProcess(origin, destination, waypoints, attemptCount); + return; + } + _handleFatalError( + "Server Error".tr, "Connection failed. Please try again.".tr); + return; + } + + double apiDistanceMeters; + String pointsString; + dynamic routeData; + + apiDistanceMeters = (responseData['distance'] as num).toDouble(); + pointsString = responseData['points'] ?? ""; + routeData = responseData; + + var origCoords = origin.split(','); + double startLat = double.parse(origCoords[0]); + double startLng = double.parse(origCoords[1]); + + double aerialDistance = + Geolocator.distanceBetween(startLat, startLng, latDest, lngDest); + + if (apiDistanceMeters < 50.0 && aerialDistance > 200.0) { + Log.print( + "⚠️ Suspicious Route detected! Server: $apiDistanceMeters m | Aerial: $aerialDistance m"); + + if (attemptCount < 2) { + Log.print("🔄 Retrying request (Attempt ${attemptCount + 2})..."); + await Future.delayed(const Duration(seconds: 1)); + await getDirectionMap( + origin, destination, waypoints, attemptCount + 1); + return; + } else { + Log.print("❌ All retries failed. Calculating Route is impossible."); + _handleFatalError( + "Route Not Found".tr, + "We couldn't find a valid route to this destination. Please try selecting a different point." + .tr); + return; + } + } + + box.remove(BoxName.tripData); + box.write(BoxName.tripData, routeData); + + durationToRide = + ((routeData['duration'] as num) * kDurationScalar).toInt(); + double distanceOfTrip = apiDistanceMeters / 1000.0; + distance = distanceOfTrip; + + data = routeData['legs'] != null && routeData['legs'].isNotEmpty + ? (routeData['legs'][0]['steps'] ?? []) + : []; + + List decodedPoints = []; + if (pointsString.isNotEmpty) { + decodedPoints = await compute(decodePolylineIsolate, pointsString); + } + + if (decodedPoints.isEmpty) { + _handleFatalError("Map Error".tr, "Received empty route data.".tr); + return; + } + + mapEngine.polylineCoordinates.clear(); + mapEngine.polylineCoordinates.addAll(decodedPoints); + + final LatLng startLoc = mapEngine.polylineCoordinates.first; + final LatLng endLoc = mapEngine.polylineCoordinates.last; + + startNameAddress = responseData['startName'] ?? 'Start Point'.tr; + endNameAddress = responseData['endName'] ?? 'Destination'.tr; + Log.print('📍 ROUTE START: $startNameAddress'); + Log.print('📍 ROUTE END: $endNameAddress'); + + if (responseData['bbox'] != null) { + List bbox = responseData['bbox']; + if (bbox.length == 4) { + mapEngine.lastComputedBounds = LatLngBounds( + southwest: LatLng(bbox[1], bbox[0]), + northeast: LatLng(bbox[3], bbox[2]), + ); + } + } else { + double? minLat, maxLat, minLng, maxLng; + for (LatLng point in mapEngine.polylineCoordinates) { + minLat = + minLat == null ? point.latitude : min(minLat, point.latitude); + maxLat = + maxLat == null ? point.latitude : max(maxLat, point.latitude); + minLng = + minLng == null ? point.longitude : min(minLng, point.longitude); + maxLng = + maxLng == null ? point.longitude : max(maxLng, point.longitude); + } + if (minLat != null) { + mapEngine.lastComputedBounds = LatLngBounds( + northeast: LatLng(maxLat!, maxLng!), + southwest: LatLng(minLat!, minLng!)); + } + } + + if (isDrawingRoute) { + Log.print('🔔 Finalizing route drawing state'); + isDrawingRoute = false; + isLoading = false; + update(); + } + + durationToAdd = Duration(seconds: durationToRide); + hours = durationToAdd.inHours; + minutes = (durationToAdd.inMinutes % 60).round(); + + markers = { + Marker( + markerId: const MarkerId('start'), + position: startLoc, + icon: InlqBitmap.fromStyleImage('orange_marker'), + infoWindow: const InfoWindow(title: 'A'), + anchor: const Offset(0.5, 1.0), + ), + Marker( + markerId: const MarkerId('end'), + position: endLoc, + icon: InlqBitmap.fromStyleImage('violet_marker'), + infoWindow: const InfoWindow(title: 'B'), + anchor: const Offset(0.5, 1.0), + ), + }; + + for (int i = 0; i < activeMenuWaypointCount; i++) { + final wp = menuWaypoints[i]; + if (wp != null) { + final bool isFirstWaypoint = i == 0; + markers.add(Marker( + markerId: MarkerId('waypoint_$i'), + position: wp, + icon: InlqBitmap.fromStyleImage( + isFirstWaypoint ? 'orange_marker' : 'violet_marker'), + infoWindow: + InfoWindow(title: isFirstWaypoint ? 'Stop 1' : 'Stop 2'), + anchor: const Offset(0.5, 1.0), + )); + } + } + + if (polyLines.isNotEmpty) mapEngine.clearPolyline(); + + rideConfirm = false; + isMarkersShown = true; + update(); + + await bottomSheet(); + + await mapEngine.playRouteAnimation( + mapEngine.polylineCoordinates, mapEngine.lastComputedBounds); + } catch (e, stackTrace) { + if (isDrawingRoute) { + isDrawingRoute = false; + isLoading = false; + update(); + } + + Log.print('🚨 CRITICAL ERROR IN getDirectionMap: $e'); + Log.print('🚨 STACKTRACE: $stackTrace'); + + if (attemptCount < 2) { + await _retryProcess(origin, destination, waypoints, attemptCount); + } else { + _handleFatalError("Connection Error".tr, + "Please check your internet and try again.".tr); + } + } + } + + Future _retryProcess(String origin, String dest, List waypoints, + int currentAttempt) async { + Log.print( + "🔄 Exception or Error caught. Retrying in 1s... (Attempt ${currentAttempt + 1})"); + await Future.delayed(const Duration(seconds: 1)); + getDirectionMap(origin, dest, waypoints, currentAttempt + 1); + } + + bool _isUsingFallback = false; + + void _startPollingFallback() { + if (_isUsingFallback) return; + + Log.print('🔄 Starting Polling Fallback Mode'); + _isUsingFallback = true; + + startMasterTimer(); + } + + Future _restorePolyline(String polylineString) async { + try { + List points = + await compute(decodePolylineIsolate, polylineString); + + mapEngine.polylineCoordinates.clear(); + mapEngine.polylineCoordinates.addAll(points); + + mapEngine.clearPolyline(); + mapEngine.polyLines = { + ...mapEngine.polyLines, + Polyline( + polylineId: const PolylineId('route_direct'), + points: mapEngine.polylineCoordinates, + color: const Color(0xFF2196F3), + width: 6, + ) + }; + + update(); + } catch (e) { + Log.print('Error restoring polyline: $e'); + } + } + + Future processRideAcceptance( + {Map? driverData, required String source}) async { + if (_isAcceptanceProcessed || + currentRideState.value == RideState.driverApplied || + currentRideState.value == RideState.driverArrived || + currentRideState.value == RideState.inProgress) { + Log.print("✋ Ignored Acceptance from $source. Already processed."); + return; + } + + _rideAcceptedViaSource = source; + + _isAcceptanceProcessed = true; + _isDriverAppliedLogicExecuted = true; + Log.print("🚀 Winner: $source triggered acceptance! Processing..."); + + _masterTimer?.cancel(); + + currentRideState.value = RideState.driverApplied; + statusRide = 'Apply'; + isSearchingWindow = false; + + if (driverData != null && driverData.isNotEmpty) { + Log.print("📥 Populating Data from $source payload..."); + _fillDriverDataLocally(driverData); + } else { + Log.print("⚠️ No Data in Payload. Fallback to API."); + await getUpdatedRideForDriverApply(rideId); + } + + await IosLiveActivityService.startRideActivity( + rideId: rideId, + driverName: driverName, + carDetails: '$make • $carColor', + etaText: stringRemainingTimeToPassenger, + progress: 0.0, + ); + + _showRideStartNotifications(); + final etaText = stringRemainingTimeToPassenger; + final carInfo = '$make • $model • $licensePlate'; + + await RideLiveNotification.showDriverOnWay( + driverName: driverName, + etaText: etaText, + carInfo: carInfo, + ); + + update(); + + await getDriverCarsLocationToPassengerAfterApplied(); + _startSocketWatchdog(); + + if (driverCarsLocationToPassengerAfterApplied.isNotEmpty) { + LatLng driverPos = driverCarsLocationToPassengerAfterApplied.last; + + await calculateDriverToPassengerRoute(driverPos, passengerLocation); + + startTimerFromDriverToPassengerAfterApplied(); + } + + PipService.enablePip(); + + if (source == "Socket" && mapSocket.isSocketConnected) { + Log.print( + "🧠 Smart Mode: Socket accepted ride. Skipping polling, relying on WebSocket."); + } else { + Log.print("🔄 Fallback Mode: $source accepted ride. Starting polling."); + _startDriverLocationPollingWithTimer(); + } + } + + void _fillDriverDataLocally(Map data) { + try { + driverId = data['driver_id']?.toString() ?? ''; + driverPhone = data['phone']?.toString() ?? ''; + + String fName = (data['first_name'] ?? data['driver_first_name'] ?? '') + .toString() + .trim(); + String lName = (data['last_name'] ?? data['driver_last_name'] ?? '') + .toString() + .trim(); + final socketDriverName = + (data['driverName'] ?? data['driver_name'] ?? '').toString().trim(); + driverName = socketDriverName.isNotEmpty + ? socketDriverName + : [fName, lName].where((part) => part.isNotEmpty).join(' '); + + make = data['make']?.toString() ?? ''; + model = data['model']?.toString() ?? ''; + carColor = data['color']?.toString() ?? ''; + colorHex = data['color_hex']?.toString() ?? ''; + licensePlate = data['car_plate']?.toString() ?? ''; + carYear = data['year']?.toString() ?? ''; + + driverRate = data['ratingDriver']?.toString() ?? '5.0'; + driverToken = data['token']?.toString() ?? ''; + + update(); + } catch (e) { + Log.print("Error parsing socket driver data: $e"); + } + } + + Future cancelRide() async { + if (selectedReasonIndex == -1) { + Get.snackbar( + 'Attention'.tr, + 'Please select a reason first'.tr, + snackPosition: SnackPosition.BOTTOM, + backgroundColor: Colors.orange, + colorText: Colors.white, + ); + return; + } + + String finalReason = selectedReasonText; + if (finalReason == "Other".tr) { + if (otherReasonController.text.trim().isEmpty) { + Get.snackbar("Attention".tr, "Please write the reason...".tr, + backgroundColor: Colors.red, colorText: Colors.white); + return; + } + finalReason = otherReasonController.text.trim(); + } + + Get.back(); + if (isCancelRidePageShown) { + mapEngine.changeCancelRidePageShow(); + } + + resetAllMapStates(); + + stopAllTimers(); + currentRideState.value = RideState.cancelled; + await RideLiveNotification.cancel(); + IosLiveActivityService.endRideActivity(); + PipService.disablePip(); + + if (rideId != 'yet' && rideId != null) { + Log.print( + '📡 Sending Cancel Request to Server with Reason: $finalReason'); + + try { + await CRUD().post( + link: "${AppLink.server}/ride/rides/cancel_ride_by_passenger.php", + payload: { + "ride_id": rideId.toString(), + "reason": finalReason, + "driver_token": driverToken, + }, + ); + } catch (e) { + Log.print("Error cancelling on server: $e"); + } + } + + clearControllersAndGoHome(); + } + + Future getAIKey(String key) async { + var res = + await CRUD().get(link: AppLink.getapiKey, payload: {"keyName": key}); + if (res != 'failure') { + var d = jsonDecode(res)['message']; + return d[key].toString(); + } + return null; + } + + Future getRideStatus(String rideId) async { + final response = await CRUD().get( + link: "${AppLink.rideServerSide}/ride/rides/getRideStatus.php", + payload: {'id': rideId}); + Log.print(response); + Log.print('2176'); + return jsonDecode(response)['data']; + } + + void handleActiveRideOnStartup(dynamic data) { + try { + if (data == null || data['has_active_ride'] != true) { + Log.print('[Startup] No active ride'); + currentRideState.value = RideState.noRide; + startMasterTimer(); + return; + } + + Log.print('[Startup] ✅ Active ride found!'); + + var rideData = data['ride']; + rideId = rideData['ride_id'].toString(); + currentRideId = rideId; + driverId = rideData['driver_id']?.toString() ?? ''; + + String status = rideData['status']?.toString().toLowerCase() ?? ''; + + if (status == 'waiting' || status == 'searching') { + currentRideState.value = RideState.searching; + isSearchingWindow = true; + } else if (status == 'apply' || status == 'applied') { + currentRideState.value = RideState.driverApplied; + statusRide = 'Apply'; + + mapSocket.socket.emit('subscribe_driver_location', { + 'ride_id': rideId, + 'driver_id': driverId, + }); + + if (rideData['driver_info'] != null) { + var dInfo = rideData['driver_info']; + passengerName = dInfo['first_name']?.toString() ?? ''; + driverPhone = dInfo['phone']?.toString() ?? ''; + model = dInfo['model']?.toString() ?? ''; + licensePlate = dInfo['license_plate']?.toString() ?? ''; + } + } else if (status == 'arrived') { + currentRideState.value = RideState.driverArrived; + statusRide = 'Arrived'; + isDriverArrivePassenger = true; + } else if (status == 'begin' || status == 'started') { + currentRideState.value = RideState.inProgress; + statusRide = 'Begin'; + rideTimerBegin = true; + + if (rideData['polyline'] != null) { + _restorePolyline(rideData['polyline']); + } + + rideIsBeginPassengerTimer(); + } + + update(); + startMasterTimer(); + } catch (e) { + Log.print('[Startup] Error: $e'); + currentRideState.value = RideState.noRide; + startMasterTimer(); + } + } + + Future handleNoDriverFound() async { + stopAllTimers(); + await RideLiveNotification.cancel(); + IosLiveActivityService.endRideActivity(); + PipService.disablePip(); + _isCancelProcessed = false; + currentRideState.value = RideState.noRide; + resetAllMapStates(); + clearControllersAndGoHome(); + + Get.defaultDialog( + title: "We apologize 😔".tr, + middleText: "No drivers found at the moment.\nPlease try again later.".tr, + confirm: ElevatedButton( + onPressed: () => Navigator.pop(Get.context!), + child: Text("Ok".tr), + ), + ); + } + + bool isDriversDataValid() { + return dataCarsLocationByPassenger != 'failure' && + dataCarsLocationByPassenger != null && + (dataCarsLocationByPassenger is Map) && + dataCarsLocationByPassenger.containsKey('message') && + dataCarsLocationByPassenger['message'] != null; + } + + void retrySearchForDrivers() async { + _isCancelProcessed = false; + isSearchingWindow = true; + currentRideState.value = RideState.searching; + driversStatusForSearchWindow = 'Searching for nearby drivers...'.tr; + update(); + + try { + Log.print("🔄 Retrying search for ride ID: $rideId"); + + var payload = { + "ride_id": rideId.toString(), + "passenger_id": box.read(BoxName.passengerID).toString(), + "passenger_name": box.read(BoxName.name).toString(), + "passenger_phone": box.read(BoxName.phone).toString(), + "passenger_email": box.read(BoxName.email).toString(), + "passenger_token": box.read(BoxName.tokenFCM).toString(), + "passenger_wallet": box.read(BoxName.passengerWalletTotal).toString(), + "passenger_rating": "5.0", + "start_lat": startLocation.latitude.toString(), + "start_lng": startLocation.longitude.toString(), + "end_lat": endLocation.latitude.toString(), + "end_lng": endLocation.longitude.toString(), + "start_name": startNameAddress, + "end_name": endNameAddress, + "distance": distance.toString(), + "distance_text": distanceByPassenger, + "duration_text": durationToPassenger.toString(), + "price": totalPassenger.toString(), + "price_for_driver": costForDriver.toString(), + "car_type": box.read(BoxName.carType).toString(), + "is_wallet": Get.find().isWalletChecked.toString(), + "has_steps": Get.find().wayPoints.length > 1 + ? "true" + : "false", + }; + + var response = await CRUD().post( + link: "${AppLink.rideServerSide}/rides/retry_search_drivers.php", + payload: payload, + ); + + if (response['status'] == 'success') { + Log.print("✅ Search reset successfully."); + startSearchingTimer(); + } else { + Log.print("❌ Failed to reset search: $response"); + handleNoDriverFound(); + } + } catch (e) { + Log.print("❌ Exception in retrySearchForDrivers: $e"); + handleNoDriverFound(); + } + } + + Future startSearchingTimer() async { + _searchTimer?.cancel(); + int seconds = 0; + + Log.print("⏳ Search Timer Started (90s)..."); + await RideLiveNotification.showSearching(driversStatusForSearchWindow); + + _searchTimer = Timer.periodic(const Duration(seconds: 1), (timer) { + seconds++; + + if (currentRideState.value != RideState.searching) { + timer.cancel(); + return; + } + + if (seconds >= 90) { + timer.cancel(); + handleNoDriverFound(); + } + }); + } + + void showNoDriversDialog() { + Get.dialog( + BackdropFilter( + filter: ImageFilter.blur(sigmaX: 5, sigmaY: 5), + child: CupertinoAlertDialog( + title: Text("No Car or Driver Found in your area.".tr, + style: AppStyle.title + .copyWith(fontSize: 20, fontWeight: FontWeight.bold)), + content: Text("No Car or Driver Found in your area.".tr, + style: AppStyle.title.copyWith(fontSize: 16)), + actions: [ + CupertinoDialogAction( + onPressed: () { + Get.back(); + clearControllersAndGoHome(); + }, + child: + Text('OK'.tr, style: TextStyle(color: AppColor.greenColor)), + ), + ], + ), + ), + barrierDismissible: false, + ); + } + + Future getDistanceFromDriverAfterAcceptedRide( + String origin, String destination) async { + String apiKey = Env.mapKeyOsm; + if (origin.isEmpty) { + origin = '${passengerLocation.latitude},${passengerLocation.longitude}'; + } + var uri = Uri.parse( + '$dynamicApiUrl?origin=$origin&destination=$destination&steps=false&overview=false'); + Log.print('uri: $uri'); + + http.Response response; + Map responseData; + + try { + response = await http.get( + uri, + headers: { + 'X-API-KEY': apiKey, + }, + ).timeout(const Duration(seconds: 20)); + + if (response.statusCode != 200) { + Log.print('Error from API: ${response.statusCode}'); + isLoading = false; + update(); + return; + } + if (Get.isBottomSheetOpen ?? false) { + Get.back(); + } + isDrawingRoute = false; + + responseData = json.decode(response.body); + Log.print('responseData: $responseData'); + + if (responseData['status'] != 'ok') { + Log.print('API returned an error: ${responseData['message']}'); + isLoading = false; + update(); + return; + } + } catch (e) { + Log.print('Failed to get directions: $e'); + isLoading = false; + update(); + return; + } + } + + Future _stageNiceToHave() async { + Log.print('🚀 MapPassengerController: Starting _stageNiceToHave'); + + await Future.wait([ + Future(() async { + try { + Log.print('🔍 Loading Favorites...'); + await locSearch.getFavioratePlaces(); + } catch (e) { + Log.print("Error: $e"); + } + }), + Future(() async { + try { + Log.print('🔍 Loading Waypoints...'); + locSearch.readyWayPoints(); + } catch (e) { + Log.print("Error: $e"); + } + }), + Future(() async { + try { + Log.print('🔍 Loading Rate...'); + await getPassengerRate(); + } catch (e) { + Log.print("Error: $e"); + } + }), + Future(() async { + try { + Log.print('🔍 Loading Coupons...'); + await firstTimeRunToGetCoupon(); + } catch (e) { + Log.print("Error: $e"); + } + }), + ]); + Log.print('✅ MapPassengerController: _stageNiceToHave complete'); + try { + cardNumber = await SecureStorage().readData(BoxName.cardNumber); + } catch (e) { + Log.print("Error: $e"); + } + } + + Future _stagePricingAndState() async { + try { + await getKazanPercent(); + } catch (e) { + Log.print("Error: $e"); + } + try { + await _checkInitialRideStatus(); + } catch (e) { + Log.print("Error: $e"); + } + _applyLowEndModeIfNeeded(); + } + + void _applyLowEndModeIfNeeded() { + // Placeholder comment from original + } + + void showDrawingBottomSheet() { + Log.print( + '🔔 showDrawingBottomSheet called. isDrawingRoute: $isDrawingRoute'); + + final context = Get.context; + if (context == null) return; + + WidgetsBinding.instance.addPostFrameCallback((_) { + // Close any existing open dialogs first + if (Get.isDialogOpen == true) { + Get.back(); + } + + Get.dialog( + Dialog( + backgroundColor: Colors.transparent, + elevation: 0, + child: Container( + padding: const EdgeInsets.all(24), + width: 180, + decoration: BoxDecoration( + color: Colors.white.withOpacity(0.95), + borderRadius: BorderRadius.circular(24), + boxShadow: [ + BoxShadow( + color: Colors.black.withOpacity(0.15), + blurRadius: 20, + spreadRadius: 5, + ) + ], + ), + child: Column( + mainAxisSize: MainAxisSize.min, + mainAxisAlignment: MainAxisAlignment.center, + crossAxisAlignment: CrossAxisAlignment.center, + children: [ + // App Logo + Image.asset( + 'assets/images/logo.gif', + height: 64, + errorBuilder: (context, error, stackTrace) => const Icon( + Icons.map, + size: 64, + color: AppColor.primaryColor, + ), + ), + const SizedBox(height: 16), + const SizedBox( + width: 24, + height: 24, + child: MyCircularProgressIndicator(), + ), + const SizedBox(height: 16), + Text( + 'Drawing route on map...'.tr, + style: const TextStyle( + fontWeight: FontWeight.bold, + fontSize: 14, + color: AppColor.primaryColor, + ), + textAlign: TextAlign.center, + ), + ], + ), + ), + ), + barrierDismissible: false, + ); + + // Auto-dismiss after exactly 2 seconds + Future.delayed(const Duration(seconds: 2), () { + if (Get.isDialogOpen == true) { + Get.back(); + } + }); + }); + } + + @override + void onInit() async { + super.onInit(); + await _checkAndRefreshMapStyle(); + Get.put(DeepLinkController(), permanent: true); + await initilizeGetStorage(); + getLocationArea(passengerLocation.latitude, passengerLocation.longitude); + unawaited(_stagePricingAndState()); + unawaited(_stageNiceToHave()); + startMasterTimer(); + } + + @override + void onClose() { + stopAllTimers(); + if (!_timerStreamController.isClosed) { + _timerStreamController.close(); + } + if (!_beginRideStreamController.isClosed) { + _beginRideStreamController.close(); + } + if (!_rideStatusStreamController.isClosed) { + _rideStatusStreamController.close(); + } + if (!timerController.isClosed) { + timerController.close(); + } + super.onClose(); + } + + void clearControllersAndGoHome() { + Get.offAll(() => const MapPagePassenger()); + } + + /// Builds a Set of short [Polyline] segments that simulate a dashed line. + /// intaleq_maps (MapLibre) doesn't support `patterns`, so we manually + /// split the route into dash/gap alternating segments. + Set _buildDashedPolylines({ + required List points, + required double dashLengthMeters, + required double gapLengthMeters, + required Color color, + required int width, + required String idPrefix, + }) { + final Set result = {}; + if (points.length < 2) return result; + + int segmentIndex = 0; + bool isDash = true; + double remaining = dashLengthMeters; + List currentSegment = [points[0]]; + + for (int i = 0; i < points.length - 1; i++) { + final LatLng a = points[i]; + final LatLng b = points[i + 1]; + double segLen = _haversineDistance(a, b); + double covered = 0.0; + + while (covered < segLen) { + double leftInSeg = segLen - covered; + if (remaining <= leftInSeg) { + // interpolate the endpoint of this dash/gap + double fraction = (covered + remaining) / segLen; + LatLng interp = LatLng( + a.latitude + fraction * (b.latitude - a.latitude), + a.longitude + fraction * (b.longitude - a.longitude), + ); + currentSegment.add(interp); + + if (isDash && currentSegment.length >= 2) { + result.add(Polyline( + polylineId: PolylineId('${idPrefix}_seg_$segmentIndex'), + points: List.from(currentSegment), + color: color, + width: width, + )); + } + + final double consumed = remaining; + segmentIndex++; + isDash = !isDash; + remaining = isDash ? dashLengthMeters : gapLengthMeters; + currentSegment = [interp]; + covered += consumed; + } else { + currentSegment.add(b); + covered = segLen; + remaining -= leftInSeg; + } + } + } + + // Flush last dash segment + if (isDash && currentSegment.length >= 2) { + result.add(Polyline( + polylineId: PolylineId('${idPrefix}_seg_$segmentIndex'), + points: List.from(currentSegment), + color: color, + width: width, + )); + } + + return result; + } + + /// Haversine distance in meters between two LatLng points. + LatLng? _parseLatLng(String? raw) { + if (raw == null || raw.trim().isEmpty) return null; + final parts = raw.split(','); + if (parts.length < 2) return null; + final lat = double.tryParse(parts[0].trim()); + final lng = double.tryParse(parts[1].trim()); + if (lat == null || lng == null) return null; + if (lat == 0 && lng == 0) return null; + return LatLng(lat, lng); + } + + bool _isHeadingAwayFromRoute({ + required double? heading, + required double? speed, + required int closestRouteIndex, + required double distanceFromRouteMeters, + }) { + if (heading == null || speed == null || speed < 2.5) return false; + if (_currentDriverRoutePoints.length < 2) return false; + if (distanceFromRouteMeters < 10) return false; + + int fromIndex = closestRouteIndex; + int toIndex = + min(closestRouteIndex + 1, _currentDriverRoutePoints.length - 1); + if (fromIndex == toIndex && fromIndex > 0) { + fromIndex--; + } + if (fromIndex == toIndex) return false; + + final double routeBearing = _bearingBetween( + _currentDriverRoutePoints[fromIndex], + _currentDriverRoutePoints[toIndex], + ); + final double angleDiff = _angleDifference(heading, routeBearing); + return angleDiff > 110; + } + + double _bearingBetween(LatLng a, LatLng b) { + final double lat1 = a.latitude * pi / 180; + final double lat2 = b.latitude * pi / 180; + final double dLng = (b.longitude - a.longitude) * pi / 180; + final double y = sin(dLng) * cos(lat2); + final double x = cos(lat1) * sin(lat2) - sin(lat1) * cos(lat2) * cos(dLng); + return (atan2(y, x) * 180 / pi + 360) % 360; + } + + double _angleDifference(double a, double b) { + final double diff = ((a - b + 540) % 360) - 180; + return diff.abs(); + } + + double _pathDistanceMeters(List points) { + if (points.length < 2) return 0.0; + double total = 0.0; + for (int i = 0; i < points.length - 1; i++) { + total += _haversineDistance(points[i], points[i + 1]); + } + return total; + } + + double _haversineDistance(LatLng a, LatLng b) { + const R = 6371000.0; + final dLat = (b.latitude - a.latitude) * pi / 180; + final dLng = (b.longitude - a.longitude) * pi / 180; + final sinLat = sin(dLat / 2); + final sinLng = sin(dLng / 2); + final h = sinLat * sinLat + + cos(a.latitude * pi / 180) * + cos(b.latitude * pi / 180) * + sinLng * + sinLng; + return 2 * R * atan2(pow(h, 0.5).toDouble(), pow(1 - h, 0.5).toDouble()); + } +} diff --git a/siro_rider/lib/controller/home/map/ride_state.dart b/siro_rider/lib/controller/home/map/ride_state.dart new file mode 100644 index 0000000..83ce70c --- /dev/null +++ b/siro_rider/lib/controller/home/map/ride_state.dart @@ -0,0 +1,10 @@ +enum RideState { + noRide, // لا يوجد رحلة جارية، عرض واجهة البحث + cancelled, // تم إلغاء الرحلة + preCheckReview, // يوجد رحلة منتهية، تحقق من التقييم + searching, // جاري البحث عن كابتن + driverApplied, // تم قبول الطلب + driverArrived, // وصل السائق + inProgress, // الرحلة بدأت بالفعل + finished, // انتهت الرحلة (سيتم تحويلها إلى preCheckReview) +} diff --git a/siro_rider/lib/controller/home/map/ui_interactions_controller.dart b/siro_rider/lib/controller/home/map/ui_interactions_controller.dart new file mode 100644 index 0000000..388c28e --- /dev/null +++ b/siro_rider/lib/controller/home/map/ui_interactions_controller.dart @@ -0,0 +1,436 @@ +import 'dart:async'; +import 'dart:convert'; +import 'dart:ui'; +import 'package:flutter/material.dart'; +import 'package:flutter/cupertino.dart'; +import 'package:get/get.dart'; +import 'package:intaleq_maps/intaleq_maps.dart'; + +import '../../../constant/box_name.dart'; +import '../../../constant/colors.dart'; +import '../../../constant/links.dart'; +import '../../../constant/style.dart'; +import '../../../constant/info.dart'; +import '../../../main.dart'; // contains global 'box' +import '../../../print.dart'; +import '../../../services/emergency_signal_service.dart'; +import '../../../views/widgets/elevated_btn.dart'; +import '../../../views/widgets/mydialoug.dart'; +import '../../../views/widgets/my_textField.dart'; +import '../../../views/home/map_page_passenger.dart'; +import '../../../views/widgets/error_snakbar.dart'; +import '../../../models/model/painter_copoun.dart'; +import '../../functions/launch.dart'; +import '../../firebase/local_notification.dart'; +import '../../firebase/notification_service.dart'; +import '../../functions/crud.dart'; +import '../../functions/tts.dart'; +import 'ride_lifecycle_controller.dart'; +import 'location_search_controller.dart'; +import 'map_engine_controller.dart'; + +class UiInteractionsController extends GetxController { + TextEditingController sosPhonePassengerProfile = TextEditingController(); + TextEditingController whatsAppLocationText = TextEditingController(); + final sosFormKey = GlobalKey(); + + @override + void onInit() { + super.onInit(); + EmergencySignalService.instance.startListening(() { + final rideLifecycle = Get.find(); + if (rideLifecycle.statusRide == 'Begin' || + rideLifecycle.statusRide == 'start') { + Log.print("🚨 Emergency shake verified! Prompting SOS..."); + sosPassenger(); + } + }); + } + + Future _ensureSosNumber(Function onSuccess) async { + String? storedPhone = box.read(BoxName.sosPhonePassenger); + if (storedPhone != null && storedPhone.isNotEmpty) { + onSuccess(); + return; + } + + sosPhonePassengerProfile.clear(); + Get.defaultDialog( + title: 'Add SOS Phone'.tr, + titleStyle: AppStyle.title, + content: Form( + key: sosFormKey, + child: Column( + children: [ + MyTextForm( + controller: sosPhonePassengerProfile, + label: 'insert sos phone'.tr, + hint: 'e.g. 0912345678 (Default +963)'.tr, + type: TextInputType.phone, + ), + const SizedBox(height: 10), + Text( + "Note: If no country code is entered, it will be saved as Syrian (+963).".tr, + style: TextStyle(fontSize: 12, color: Colors.grey), + textAlign: TextAlign.center, + ), + ], + ), + ), + confirm: MyElevatedButton( + title: 'Save'.tr, + onPressed: () async { + if (sosFormKey.currentState!.validate()) { + Get.back(); + var numberPhone = + formatSyrianPhoneNumber(sosPhonePassengerProfile.text); + + await CRUD().post( + link: AppLink.updateprofile, + payload: { + 'id': box.read(BoxName.passengerID), + 'sosPhone': numberPhone, + }, + ); + + box.write(BoxName.sosPhonePassenger, numberPhone); + onSuccess(); + } + }, + ), + cancel: MyElevatedButton( + title: 'Cancel'.tr, + onPressed: () => Get.back(), + kolor: AppColor.redColor, + ) + ); + } + + void sosPassenger() { + _ensureSosNumber(() { + Get.defaultDialog( + barrierDismissible: false, + title: "Emergency SOS".tr, + titleStyle: AppStyle.title.copyWith(color: AppColor.redColor), + content: Column( + children: [ + Icon(Icons.warning_amber_rounded, size: 50, color: AppColor.redColor), + const SizedBox(height: 10), + Text( + "Do you want to send an emergency message to your SOS contact?".tr, + textAlign: TextAlign.center, + style: AppStyle.title, + ), + ], + ), + confirm: MyElevatedButton( + title: "Send SOS".tr, + kolor: AppColor.redColor, + onPressed: () { + Get.back(); + _shareTripDetailsSOS(); + }, + ), + cancel: MyElevatedButton( + title: "I'm Safe".tr, + kolor: AppColor.greenColor, + onPressed: () { + Get.back(); + }, + ), + ); + }); + } + + void _shareTripDetailsSOS() { + final rideLifecycle = Get.find(); + final locSearch = Get.find(); + + String message = "**Emergency SOS from Passenger:**\n"; + String origin = locSearch.startNameAddress; + String destination = locSearch.endNameAddress; + + message += "* ${'Origin'.tr}: $origin\n"; + message += "* ${'Destination'.tr}: $destination\n"; + message += "* ${'Driver Name'.tr}: ${rideLifecycle.driverName}\n"; + message += + "* ${'Car'.tr}: ${rideLifecycle.make} - ${rideLifecycle.model} - ${rideLifecycle.licensePlate}\n"; + message += "* ${'Phone'.tr}: ${rideLifecycle.driverPhone}\n\n"; + + message += + "${'Location'.tr}: https://www.google.com/maps/search/?api=1&query=${locSearch.passengerLocation.latitude},${locSearch.passengerLocation.longitude}\n"; + message += "Please help! Contact me as soon as possible.".tr; + + launchCommunication( + 'whatsapp', box.read(BoxName.sosPhonePassenger), message); + } + + String formatSyrianPhone(String phone) { + phone = phone.replaceAll(' ', '').replaceAll('+', ''); + if (phone.startsWith('00963')) { + phone = phone.replaceFirst('00963', '963'); + } + if (phone.startsWith('0963')) { + phone = phone.replaceFirst('0963', '963'); + } + if (phone.startsWith('963')) { + return phone; + } + if (phone.startsWith('09')) { + return '963' + phone.substring(1); + } + if (phone.startsWith('9') && phone.length == 9) { + return '963' + phone; + } + return phone; + } + + String formatSyrianPhoneNumber(String phoneNumber) { + String trimmedPhone = phoneNumber.trim(); + if (trimmedPhone.startsWith('09')) { + return '963${trimmedPhone.substring(1)}'; + } + if (trimmedPhone.startsWith('963')) { + return trimmedPhone; + } + return '963$trimmedPhone'; + } + + void sendSMS(String to) async { + final rideLifecycle = Get.find(); + String formattedDriverPhone = + rideLifecycle.driverPhone.replaceAll(' ', '').replaceAll('+', ''); + + String message = + 'Hi! This is ${(box.read(BoxName.name).toString().split(' ')[0]).toString()}.\n I am using ${box.read(AppInformation.appName)} to ride with ${rideLifecycle.passengerName} as the driver. ${rideLifecycle.passengerName} \nis driving a ${rideLifecycle.model}\n with license plate ${rideLifecycle.licensePlate}.\n I am currently located at ${Get.find().passengerLocation}.\n If you need to reach me, please contact the driver directly at\n\n $formattedDriverPhone.'; + + launchCommunication('sms', to, message); + } + + void sendWhatsapp(String to) async { + final rideLifecycle = Get.find(); + final locSearch = Get.find(); + String formattedPhone = formatSyrianPhone(to); + + String message = + '${'${'Hi! This is'.tr} ${(box.read(BoxName.name).toString().split(' ')[0]).toString()}.\n${' I am using'.tr}'} ${AppInformation.appName}${' to ride with'.tr} ${rideLifecycle.passengerName}${' as the driver.'.tr} ${rideLifecycle.passengerName} \n${'is driving a '.tr}${rideLifecycle.model}\n${' with license plate '.tr}${rideLifecycle.licensePlate}.\n${' I am currently located at '.tr} https://www.google.com/maps/place/${locSearch.passengerLocation.latitude},${locSearch.passengerLocation.longitude}.\n${' If you need to reach me, please contact the driver directly at'.tr}\n\n ${rideLifecycle.driverPhone}.'; + + launchCommunication('whatsapp', formattedPhone, message); + } + + Future driverArrivePassengerDialoge() { + final rideLifecycle = Get.find(); + return Get.defaultDialog( + barrierDismissible: false, + title: 'Hi ,I Arrive your location'.tr, + titleStyle: AppStyle.title, + middleText: 'Please go to Car Driver'.tr, + middleTextStyle: AppStyle.title, + confirm: MyElevatedButton( + title: 'Ok I will go now.'.tr, + onPressed: () { + NotificationService.sendNotification( + target: rideLifecycle.driverToken.toString(), + title: 'Hi ,I will go now'.tr, + body: 'I will go now'.tr, + isTopic: false, + tone: 'ding', + driverList: [], + category: 'Hi ,I will go now', + ); + Get.back(); + rideLifecycle.remainingTime = 0; + rideLifecycle.update(); + }, + ), + ); + } + + void getDialog(String title, String? midTitle, VoidCallback onPressed) { + final textToSpeechController = Get.find(); + Get.defaultDialog( + title: title, + titleStyle: AppStyle.title, + middleTextStyle: AppStyle.title, + content: Column( + children: [ + IconButton( + onPressed: () async { + await textToSpeechController.speakText(title ?? midTitle!); + }, + icon: const Icon(Icons.headphones), + ), + Text( + midTitle!, + style: AppStyle.title, + ) + ], + ), + confirm: MyElevatedButton( + title: 'Ok'.tr, + onPressed: onPressed, + kolor: AppColor.greenColor, + ), + cancel: MyElevatedButton( + title: 'Cancel', + kolor: AppColor.redColor, + onPressed: () { + Get.back(); + }, + ), + ); + } + + Future shareTripWithFamily() async { + _ensureSosNumber(() { + final rideLifecycle = Get.find(); + String storedPhone = box.read(BoxName.sosPhonePassenger)!; + + if (rideLifecycle.rideId == 'yet' || rideLifecycle.driverId.isEmpty) { + Get.snackbar("Alert".tr, "Wait for the trip to start first".tr); + return; + } + + var numberPhone = formatSyrianPhoneNumber(storedPhone); + String trackingLink = rideLifecycle.generateTrackingLink( + rideLifecycle.rideId, rideLifecycle.driverId); + + String message = """ +مرحباً، تابع رحلتي مباشرة على تطبيق انطلق 🚗 + +يمكنك تتبع مسار الرحلة من هنا: +$trackingLink + +السائق: ${rideLifecycle.passengerName} +السيارة: ${rideLifecycle.model} - ${rideLifecycle.licensePlate} +شكراً لاستخدامك انطلق! +""" + .tr; + + String messageEn = """Hello, follow my trip live on Intaleq 🚗 + +Track my ride here: +$trackingLink + +Driver: ${rideLifecycle.passengerName} +Car: ${rideLifecycle.model} - ${rideLifecycle.licensePlate} +Thank you for using Intaleq! +"""; + + String userLanguage = box.read(BoxName.lang) ?? 'ar'; + message = (userLanguage == 'ar') ? message : messageEn; + + Log.print("Sending WhatsApp to: $numberPhone"); + launchCommunication('whatsapp', numberPhone, message); + + box.write(BoxName.parentTripSelected, true); + update(); + }); + } + + Future getTokenForParent() async { + _ensureSosNumber(() async { + String storedPhone = box.read(BoxName.sosPhonePassenger)!; + var numberPhone = formatSyrianPhoneNumber(storedPhone); + Log.print("Searching for Parent Token with Phone: $numberPhone"); + + var res = await CRUD() + .post(link: AppLink.getTokenParent, payload: {'phone': numberPhone}); + + if (res is Map) { + handleResponse(res); + } else { + try { + var decoded = jsonDecode(res); + handleResponse(decoded); + } catch (e) { + Log.print("Error parsing parent response: $res"); + } + } + }); + } + + void handleResponse(Map res) { + final rideLifecycle = Get.find(); + if (res['status'] == 'failure') { + if (Get.isDialogOpen ?? false) Get.back(); + + Get.defaultDialog( + title: "No user found".tr, + titleStyle: AppStyle.title, + content: Column( + children: [ + Text( + "No passenger found for the given phone number".tr, + style: AppStyle.title, + textAlign: TextAlign.center, + ), + const SizedBox(height: 10), + Text( + "Send Intaleq app to him".tr, + style: AppStyle.title + .copyWith(color: AppColor.greenColor, fontSize: 14), + textAlign: TextAlign.center, + ) + ], + ), + confirm: MyElevatedButton( + title: 'Send Invite'.tr, + onPressed: () { + Get.back(); + var rawPhone = box.read(BoxName.sosPhonePassenger); + if (rawPhone == null) return; + var phone = formatSyrianPhoneNumber(rawPhone); + + var message = '''Dear Friend, + +🚀 I have just started an exciting trip on Intaleq! +Download the app to track my ride: + +👉 Android: https://play.google.com/store/apps/details?id=com.Intaleq.intaleq&hl=en-US +👉 iOS: https://apps.apple.com/st/app/intaleq-rider/id6748075179 + +See you there! +Intaleq Team'''; + + launchCommunication('whatsapp', phone, message); + }, + ), + cancel: MyElevatedButton( + title: 'Cancel'.tr, + onPressed: () { + Get.back(); + }, + ), + ); + } else if (res['status'] == 'success') { + if (Get.isDialogOpen ?? false) Get.back(); + + Get.snackbar("Success".tr, "The invitation was sent successfully".tr, + backgroundColor: AppColor.greenColor, colorText: Colors.white); + + List tokensData = res['data']; + for (var device in tokensData) { + String tokenParent = device['token']; + + NotificationService.sendNotification( + category: "Trip Monitoring", + target: tokenParent, + title: "Trip Monitoring".tr, + body: "Click to track the trip".tr, + isTopic: false, + tone: 'tone1', + driverList: [rideLifecycle.rideId, rideLifecycle.driverId], + ); + box.write(BoxName.tokenParent, tokenParent); + } + box.write(BoxName.parentTripSelected, true); + } + } + + @override + void onClose() { + EmergencySignalService.instance.stopListening(); + super.onClose(); + } +} diff --git a/siro_rider/lib/controller/home/map_passenger_controller.dart b/siro_rider/lib/controller/home/map_passenger_controller.dart new file mode 100644 index 0000000..07577c2 --- /dev/null +++ b/siro_rider/lib/controller/home/map_passenger_controller.dart @@ -0,0 +1,7751 @@ +// import 'dart:async'; +// import 'package:siro_rider/services/offline_map_service.dart'; +// import 'package:siro_rider/services/emergency_signal_service.dart'; +// import 'package:siro_rider/views/widgets/mycircular.dart'; +// import 'dart:convert'; +// import 'dart:io'; +// import 'dart:math' show Random, atan2, cos, max, min, pi, pow, sin, sqrt; +// import 'dart:math' as math; +// import 'dart:ui'; +// import 'dart:typed_data'; +// import 'package:image/image.dart' as img; +// import 'package:siro_rider/services/ride_live_notification.dart'; +// import 'package:crypto/crypto.dart'; +// import 'package:siro_rider/views/Rate/rate_captain.dart'; +// import 'package:siro_rider/views/Rate/rating_driver_bottom.dart'; +// import 'package:device_info_plus/device_info_plus.dart'; +// import 'package:flutter/foundation.dart'; +// import 'package:flutter/services.dart'; +// import 'package:http/http.dart' as http; + +// import 'package:siro_rider/constant/univeries_polygon.dart'; +// import 'package:siro_rider/controller/firebase/local_notification.dart'; +// import 'package:flutter/cupertino.dart'; +// import 'package:flutter_confetti/flutter_confetti.dart' hide Circle; +// import 'package:socket_io_client/socket_io_client.dart' as IO; +// import 'package:vector_math/vector_math.dart' show radians; + +// import 'package:siro_rider/controller/functions/tts.dart'; +// import 'package:siro_rider/views/home/map_page_passenger.dart'; +// import 'package:siro_rider/views/widgets/my_textField.dart'; +// import 'package:flutter/material.dart'; +// import 'package:geolocator/geolocator.dart'; +// import 'package:get/get.dart'; +// import 'package:intaleq_maps/intaleq_maps.dart'; +// // import 'package:google_polyline_algorithm/google_polyline_algorithm.dart'; +// import 'package:intl/intl.dart'; +// import 'package:location/location.dart'; +// import 'package:siro_rider/constant/country_polygons.dart'; +// import 'package:siro_rider/constant/links.dart'; +// import 'package:siro_rider/constant/style.dart'; +// import 'package:siro_rider/controller/home/points_for_rider_controller.dart'; +// import 'package:siro_rider/views/home/map_widget.dart/form_serch_multiy_point.dart'; +// import '../../constant/api_key.dart'; +// import '../../constant/box_name.dart'; +// import '../../constant/colors.dart'; +// import '../../constant/info.dart'; +// import '../../constant/table_names.dart'; +// import '../../env/env.dart'; +// import '../../main.dart'; +// import '../../models/model/locations.dart'; +// import '../../models/model/painter_copoun.dart'; +// import '../../print.dart'; +// import '../../services/pip_service.dart'; +// import '../../views/home/map_widget.dart/cancel_raide_page.dart'; +// import '../../views/home/map_widget.dart/car_details_widget_to_go.dart'; +// import '../../views/home/map_widget.dart/select_driver_mishwari.dart'; +// import '../../views/widgets/elevated_btn.dart'; +// import '../../views/widgets/error_snakbar.dart'; +// import '../../views/widgets/mydialoug.dart'; +// import '../firebase/firbase_messge.dart'; +// import '../firebase/notification_service.dart'; +// import '../functions/audio_record1.dart'; +// import '../functions/crud.dart'; +// import '../functions/launch.dart'; +// import '../functions/package_info.dart'; +// import '../functions/secure_storage.dart'; +// import '../payment/payment_controller.dart'; +// import 'decode_polyline_isolate.dart'; +// import 'deep_link_controller.dart'; +// import 'device_performance.dart'; +// import 'ios_live_activity_service.dart'; +// import 'vip_waitting_page.dart'; + +// enum RideState { +// noRide, // لا يوجد رحلة جارية، عرض واجهة البحث +// cancelled, // تم إلغاء الرحلة +// preCheckReview, // يوجد رحلة منتهية، تحقق من التقييم +// searching, // جاري البحث عن كابتن +// driverApplied, // تم قبول الطلب +// driverArrived, // وصل السائق +// inProgress, // الرحلة بدأت بالفعل +// finished, // انتهت الرحلة (سيتم تحويلها إلى preCheckReview) +// } + +// class MapPassengerController extends GetxController { +// bool isLoading = true; +// TextEditingController placeDestinationController = TextEditingController(); +// TextEditingController increasFeeFromPassenger = TextEditingController(); +// TextEditingController placeStartController = TextEditingController(); +// TextEditingController wayPoint0Controller = TextEditingController(); +// TextEditingController wayPoint1Controller = TextEditingController(); +// TextEditingController wayPoint2Controller = TextEditingController(); +// TextEditingController wayPoint3Controller = TextEditingController(); +// TextEditingController wayPoint4Controller = TextEditingController(); +// TextEditingController sosPhonePassengerProfile = TextEditingController(); +// TextEditingController whatsAppLocationText = TextEditingController(); +// TextEditingController messageToDriver = TextEditingController(); +// final sosFormKey = GlobalKey(); +// final promoFormKey = GlobalKey(); +// final messagesFormKey = GlobalKey(); +// final increaseFeeFormKey = GlobalKey(); +// List data = []; +// List bounds = []; +// List placesStart = []; +// List driversToken = []; +// LatLng previousLocationOfDrivers = const LatLng(0, 0); +// double angleDegrees = 0; +// LatLng currentLocationOfDrivers = const LatLng(0, 0); +// List allTextEditingPlaces = []; +// List placesDestination = []; +// List wayPoint0 = []; +// List wayPoint1 = []; +// List wayPoint2 = []; +// List wayPoint3 = []; +// List wayPoint4 = []; +// final firebaseMessagesController = +// Get.isRegistered() +// ? Get.find() +// : Get.put(FirebaseMessagesController()); +// List> placeListResponseAll = []; + +// List placeListResponse = [ +// formSearchPlaces(0), +// formSearchPlaces(1), +// formSearchPlaces(2), +// formSearchPlaces(3), +// ]; + +// IntaleqMapController? mapController; +// bool isStyleLoaded = false; + +// Set markers = {}; +// Set polyLines = {}; +// Set polygons = {}; +// Set circles = {}; +// double speed = 0; +// PermissionStatus? permissionGranted; + +// LatLngBounds? lastComputedBounds; +// late LatLng passengerLocation = const LatLng(32, 34); +// late LatLng newMyLocation = const LatLng(32.115295, 36.064773); +// late LatLng newStartPointLocation = const LatLng(32.115295, 36.064773); +// late LatLng newPointLocation0 = const LatLng(32.115295, 36.064773); +// late LatLng newPointLocation1 = const LatLng(32.115295, 36.064773); +// late LatLng newPointLocation2 = const LatLng(32.115295, 36.064773); +// late LatLng newPointLocation3 = const LatLng(32.115295, 36.064773); +// late LatLng newPointLocation4 = const LatLng(32.115295, 36.064773); +// late LatLng myDestination; +// List polylineCoordinates = []; +// List polylineCoordinates0 = []; +// List polylineCoordinates1 = []; +// List polylineCoordinates2 = []; +// List polylineCoordinates3 = []; +// List polylineCoordinates4 = []; +// List> polylineCoordinatesPointsAll = []; +// List carsLocationByPassenger = []; +// List driverCarsLocationToPassengerAfterApplied = []; +// String markerIcon = "marker_icon"; +// String tripIcon = "trip_icon"; +// String startIcon = "start_icon"; +// String endIcon = "end_icon"; +// String carIcon = "car_icon"; +// String motoIcon = "moto_icon"; +// String ladyIcon = "lady_icon"; +// double height = 150; +// DateTime currentTime = DateTime.now(); +// final location = Location(); +// late LocationData currentLocation; +// double heightMenu = 0; +// double widthMenu = 0; +// double heightPickerContainer = 90; +// double heightPointsPageForRider = 0; +// double mainBottomMenuMapHeight = Get.height * .2; +// double wayPointSheetHeight = 0; +// String stringRemainingTimeToPassenger = ''; +// String stringRemainingTimeDriverWaitPassenger5Minute = ''; +// bool isDriverInPassengerWay = false; +// bool isDriverArrivePassenger = false; +// bool startLocationFromMap = false; +// bool isAnotherOreder = false; +// bool isWhatsAppOrder = false; +// bool passengerStartLocationFromMap = false; +// bool workLocationFromMap = false; +// bool homeLocationFromMap = false; +// bool isPassengerRideLocationWidget = false; +// bool startLocationFromMap0 = false; +// bool startLocationFromMap1 = false; +// bool startLocationFromMap2 = false; +// bool startLocationFromMap3 = false; +// bool startLocationFromMap4 = false; +// List startLocationFromMapAll = []; +// double latePrice = 0; +// double fuelPrice = 0; +// double heavyPrice = 0; +// double naturePrice = 0; +// bool heightMenuBool = false; +// String statusRide = 'wait'; +// String statusRideVip = 'wait'; +// bool statusRideFromStart = false; +// bool isPickerShown = false; +// bool isPointsPageForRider = false; +// bool isBottomSheetShown = false; +// bool mapType = false; +// bool reloadStartApp = false; +// bool mapTrafficON = false; +// bool isCancelRidePageShown = false; +// bool isCashConfirmPageShown = false; +// bool isPaymentMethodPageShown = false; +// bool isRideFinished = false; +// bool rideConfirm = false; +// bool isMarkersShown = false; +// bool isMainBottomMenuMap = true; + +// int durationToPassenger = 0; +// bool isWayPointSheet = false; +// bool isWayPointStopsSheet = false; +// bool isWayPointStopsSheetUtilGetMap = false; +// double heightBottomSheetShown = 0; +// double cashConfirmPageShown = 250; +// late String driverId = ''; +// late String gender = ''; +// double widthMapTypeAndTraffic = 50; +// double paymentPageShown = Get.height * .6; +// late LatLng southwest; +// late LatLng northeast; +// List carLocationsModels = []; +// var dataCarsLocationByPassenger; +// var datadriverCarsLocationToPassengerAfterApplied; +// CarLocation? nearestCar; + +// bool shouldFetch = true; // Flag to determine if fetch should be executed +// int selectedPassengerCount = 1; +// double progress = 0; +// double progressTimerToPassengerFromDriverAfterApplied = 0; +// double progressTimerDriverWaitPassenger5Minute = 0; +// int durationTimer = 9; +// int durationToRide = 0; +// int remainingTime = 25; +// int remainingTimeToPassengerFromDriverAfterApplied = 60; +// int remainingTimeDriverWaitPassenger5Minute = 60; +// int timeToPassengerFromDriverAfterApplied = 0; +// Timer? timerToPassengerFromDriverAfterApplied; +// bool rideTimerBegin = false; +// double progressTimerRideBegin = 0; +// int remainingTimeTimerRideBegin = 60; +// String stringRemainingTimeRideBegin = ''; +// String hintTextStartPoint = 'Search for your Start point'.tr; +// String hintTextwayPoint0 = 'Search for waypoint'.tr; +// String hintTextwayPoint1 = 'Search for waypoint'.tr; +// String hintTextwayPoint2 = 'Search for waypoint'.tr; +// String hintTextwayPoint3 = 'Search for waypoint'.tr; +// String hintTextwayPoint4 = 'Search for waypoint'.tr; +// String currentLocationString = 'Current Location'.tr; +// String currentLocationString0 = 'Current Location'.tr; +// String currentLocationString1 = 'Add Location 1'.tr; +// String currentLocationString2 = 'Add Location 2'.tr; +// String currentLocationString3 = 'Add Location 3'.tr; +// String currentLocationString4 = 'Add Location 4'.tr; +// String placesCoordinate0 = ''.tr; +// String placesCoordinate1 = ''.tr; +// String placesCoordinate2 = ''.tr; +// String placesCoordinate3 = ''.tr; +// String placesCoordinate4 = ''.tr; +// List currentLocationStringAll = []; +// List hintTextwayPointStringAll = []; +// var placesCoordinate = []; +// String hintTextDestinationPoint = 'Select your destination'.tr; +// late String rideId = 'yet'; +// bool noCarString = false; +// bool isCashSelectedBeforeConfirmRide = false; +// bool isPassengerChosen = false; +// bool isSearchingWindow = false; +// bool currentLocationToFormPlaces = false; +// bool currentLocationToFormPlaces0 = false; +// bool currentLocationToFormPlaces1 = false; +// bool currentLocationToFormPlaces2 = false; +// bool currentLocationToFormPlaces3 = false; +// bool currentLocationToFormPlaces4 = false; +// List currentLocationToFormPlacesAll = []; + +// // ── Multi-Waypoint (max 2 stops) ────────────────────────────────────────── +// List menuWaypoints = [null, null]; +// List menuWaypointNames = ['', '']; +// int activeMenuWaypointCount = 0; +// bool isPickingWaypoint = false; +// int pickingWaypointIndex = -1; + +// late String driverToken = ''; +// int carsOrder = 0; +// int wayPointIndex = 0; +// late double kazan = 8; +// String? mapAPIKEY; +// late double totalME = 0; +// late double tax = 0; +// late double totalPassenger = 0; +// late double totalCostPassenger = 0; +// late double totalPassengerComfort = 0; +// late double totalPassengerComfortDiscount = 0; +// late double totalPassengerElectricDiscount = 0; +// late double totalPassengerLadyDiscount = 0; +// late double totalPassengerSpeedDiscount = 0; +// late double totalPassengerBalashDiscount = 0; +// late double totalPassengerRaihGaiDiscount = 0; +// late double totalPassengerScooter = 0; +// late double totalPassengerVan = 0; +// late double totalDriver = 0; +// late double averageDuration = 0; +// late double costDuration = 0; +// late double costDistance = 0; +// late double distance = 0; +// late double duration = 0; +// bool _isDriverAppliedLogicExecuted = false; // فلاج لمنع التنفيذ المتكرر +// bool _isDriverArrivedLogicExecuted = false; +// bool _isRideBeginLogicExecuted = false; +// DateTime? _searchStartTime; // لتتبع مدة البحث +// DateTime? _lastDriversNotifyTime; // لتتبع آخر مرة تم إرسال إشعار للسائقين +// final int _masterTimerIntervalSeconds = 5; // فاصل زمني ثابت للمؤقت الرئيسي +// final int _searchTimeoutSeconds = 60; // مهلة البحث قبل عرض خيار زيادة السعر +// final int _notifyDriversIntervalSeconds = +// 25; // إرسال إشعار للسائقين كل 25 ثانية +// // متغير لمنع أي عمليات تحديث أثناء التقييم +// bool _isRatingScreenOpen = false; +// // --- إضافة جديدة: متغيرات لإدارة البحث المتوسع --- +// int _currentSearchPhase = 0; // لتتبع المرحلة الحالية للبحث +// bool _isFetchingDriverLocation = false; // متغير لمنع تكرار الطلب + +// // === استبدل initSocket بالكامل === +// late IO.Socket socket; +// bool isSocketConnected = false; +// int _reconnectAttempts = 0; +// final int _maxReconnectAttempts = 5; +// Timer? _reconnectTimer; +// var currentRideId; +// // لتخزين نقاط مسار السائق الحالية للمقارنة +// List _currentDriverRoutePoints = []; + +// // متغير لتتبع مصدر القبول — Socket أم غيره +// String _rideAcceptedViaSource = "Unknown"; +// // عدّاد تحديثات الموقع المستلمة من السوكيت (لقياس الصحة) +// int _socketLocationUpdatesCount = 0; + +// final Map _pollingIntervals = { +// RideState.noRide: 6, +// RideState.searching: 8, +// RideState.driverApplied: 10, +// RideState.driverArrived: 15, +// RideState.inProgress: 15, +// RideState.cancelled: 3600, +// RideState.finished: 3600, +// RideState.preCheckReview: 3600, +// }; +// // لمنع التكرار (عشان ما يعمل 100 طلب في نفس اللحظة) +// bool _isRecalculatingRoute = false; +// // متغير لمراقبة صحة السوكيت +// DateTime? _lastSocketLocationTime; +// // مسافة السماحية (مثلاً 150 متر) قبل اعتبار السائق "خارج المسار" +// final double _deviationThresholdMeters = 150.0; +// // ... (باقي الـ Imports) + +// // متغيرات التحكم +// Timer? _locationPollingTimer; // تايمر مخصص للموقع فقط + +// // ============================================================================== +// // 1. الدالة الرئيسية لتأسيس الاتصال (تستدعى عند بدء البحث startSearchingForDriver) +// // ============================================================================== +// Timer? _heartbeatTimer; +// void initConnectionWithSocket() { +// if (isSocketConnected && socket != null) return; + +// String passengerId = box.read(BoxName.passengerID).toString(); +// Log.print("🔌 Initializing Socket for Passenger: $passengerId"); + +// socket = IO.io( +// AppLink.serverSocket, +// IO.OptionBuilder() +// .setTransports(['websocket']) +// .disableAutoConnect() +// .setQuery({'id': passengerId}) +// // ✅ [FIX] إعادة اتصال شبه-لانهائية (999 محاولة) بدلاً من 20 +// .setReconnectionAttempts(20) +// // ✅ [FIX] تأخير أقل (1.5 ثانية) مع حد أقصى (8 ثواني) للتسريع +// .setReconnectionDelay(1500) +// .setReconnectionDelayMax(8000) +// .enableReconnection() +// .setExtraHeaders({'Connection': 'Upgrade'}) +// .build(), +// ); + +// socket.connect(); + +// // ✅ معالج الاتصال الأول +// socket.onConnect((_) { +// Log.print("✅ Socket Connected Successfully"); +// isSocketConnected = true; +// _reconnectAttempts = 0; +// _startHeartbeat(); + +// // ✅ [FIX] الاشتراك مجدداً في أحداث الرحلة عند كل اتصال +// if (rideId != null && rideId != 'yet' && driverId.isNotEmpty) { +// socket.emit('subscribe_driver_location', { +// 'ride_id': rideId, +// 'driver_id': driverId, +// }); +// Log.print("📡 Re-subscribed to driver location after connect"); +// } + +// update(); +// }); + +// // ⚠️ معالج الانقطاع +// socket.onDisconnect((_) { +// Log.print("⚠️ Socket Disconnected — Auto-Reconnect will handle it"); +// isSocketConnected = false; + +// // تفعيل Polling أسرع كـ Fallback مؤقت (سيتم إيقافه عند عودة الاتصال) +// if (_isActiveRideState()) { +// Log.print("🔄 Enabling Fast Polling Fallback (4s) until reconnect..."); +// _startMasterTimerWithInterval(4); +// } +// update(); +// }); + +// // 🔁 [FIX] معالج إعادة الاتصال الناجحة +// socket.onReconnect((_) { +// Log.print("🔁 Socket Reconnected Successfully!"); +// isSocketConnected = true; +// _reconnectAttempts = 0; + +// // استئناف النبضة فوراً +// _startHeartbeat(); + +// // إعادة الاشتراك في أحداث الرحلة +// if (rideId != null && rideId != 'yet' && driverId.isNotEmpty) { +// socket.emit('subscribe_driver_location', { +// 'ride_id': rideId, +// 'driver_id': driverId, +// }); +// Log.print("📡 Re-subscribed to driver location after reconnect"); +// } + +// // ✅ [FIX] إيقاف الـ Fast Polling لأن السوكيت عاد +// if (_isActiveRideState()) { +// Log.print("✅ Socket back online — stopping Fast Polling Fallback"); +// _masterTimer?.cancel(); +// _masterTimer = null; +// } + +// update(); +// }); + +// // 🔄 [FIX] معالج محاولات إعادة الاتصال (للتشخيص) +// socket.onReconnectAttempt((attemptNumber) { +// Log.print("🔄 Socket Reconnect Attempt #$attemptNumber..."); +// }); + +// // ❌ معالج الأخطاء +// socket.onError((error) { +// Log.print("❌ Socket Error: $error"); +// isSocketConnected = false; +// }); + +// // 📩 معالج تحديثات الحالة +// socket.on('ride_status_change', (data) { +// Log.print("📩 Socket Event: ride_status_change -> $data"); +// _handleRideStatusChangeWithSocket(data); +// }); + +// // 📍 معالج موقع السائق +// socket.on('driver_location_update', (data) { +// handleDriverLocationUpdate(data); +// }); +// } + +// void _startHeartbeat() { +// _heartbeatTimer?.cancel(); +// _heartbeatTimer = Timer.periodic(const Duration(seconds: 25), (timer) { +// if (isSocketConnected && socket.connected) { +// socket.emit('heartbeat', +// {'passenger_id': box.read(BoxName.passengerID).toString()}); +// } +// }); +// } + +// // دالة مساعدة +// bool _isActiveRideState() { +// return currentRideState.value == RideState.searching || +// currentRideState.value == RideState.driverApplied || +// currentRideState.value == RideState.driverArrived || +// currentRideState.value == RideState.inProgress; +// } + +// /// فحص سريع: هل السوكيت يعمل ويرسل بيانات؟ +// bool _isSocketHealthy() { +// if (!isSocketConnected) return false; +// if (_lastSocketLocationTime == null) return false; +// final diff = DateTime.now().difference(_lastSocketLocationTime!).inSeconds; +// return diff < 20; // إذا آخر تحديث قبل أقل من 20 ثانية +// } + +// /// 🧠 خوارزمية ذكية: حساب أقصر مسافة بين موقع السائق والـ Polyline (بدون API) +// double _calculateDistanceToPolyline(LatLng point, List polyline) { +// if (polyline.isEmpty) return 999.0; +// double minDistance = double.infinity; + +// for (int i = 0; i < polyline.length - 1; i++) { +// double d = _distToSegment(point, polyline[i], polyline[i + 1]); +// if (d < minDistance) minDistance = d; +// } +// return minDistance; +// } + +// double _distToSegment(LatLng p, LatLng v, LatLng w) { +// double l2 = _dist2(v, w); +// if (l2 == 0) return _distanceBetween(p, v); +// double t = ((p.latitude - v.latitude) * (w.latitude - v.latitude) + +// (p.longitude - v.longitude) * (w.longitude - v.longitude)) / +// l2; +// t = max(0, min(1, t)); +// return _distanceBetween( +// p, +// LatLng(v.latitude + t * (w.latitude - v.latitude), +// v.longitude + t * (w.longitude - v.longitude))); +// } + +// double _dist2(LatLng v, LatLng w) { +// return pow(v.latitude - w.latitude, 2).toDouble() + +// pow(v.longitude - w.longitude, 2).toDouble(); +// } + +// double _distanceBetween(LatLng p1, LatLng p2) { +// return Geolocator.distanceBetween( +// p1.latitude, p1.longitude, p2.latitude, p2.longitude); +// } + +// // ============================================================================== +// // 2. العقل المدبر: توجيه الحالات +// // ============================================================================== +// void _handleRideStatusChangeWithSocket(dynamic data) { +// if (data == null || data['status'] == null) return; + +// String newStatus = data['status'].toString().toLowerCase(); +// Log.print("🔔 Socket Status Update: $newStatus"); +// // استخراج بيانات السائق إذا توفرت (تأتي من acceptRide.php) +// Map? driverInfo; +// if (data['driver_info'] != null && data['driver_info'] is Map) { +// driverInfo = Map.from(data['driver_info']); +// } +// switch (newStatus) { +// case 'accepted': // أو apply/applied حسب تسمية السيرفر +// _onDriverAcceptedWithSocket(data, driverData: driverInfo); +// break; + +// case 'arrived': +// _onDriverArrivedWithSocket(); +// break; + +// case 'started': // أو begin +// _onRideStartedWithSocket(); +// break; + +// case 'finished': // أو ended +// _onRideFinishedWithSocket(data); +// break; + +// case 'cancelled': +// _onRideCancelledWithSocket(data); +// break; + +// case 'no_drivers_found': +// showNoDriverDialog(); +// break; +// } +// } + +// // ============================================================================== +// // 3. دوال المعالجة التفصيلية (Actions) +// // ============================================================================== +// void showNoDriverDialog() { +// Get.defaultDialog( +// title: "No Drivers Found".tr, +// middleText: +// "Sorry, there are no cars available of this type right now.".tr, +// textConfirm: "Refresh Map".tr, +// textCancel: "Cancel".tr, +// confirmTextColor: Colors.white, +// onConfirm: () { +// Get.back(); // إغلاق الديالوج +// restCounter(); +// stopAllTimers(); +// Get.offAll(() => MapPagePassenger()); // إعادة تحميل صفحة الخريطة +// }, +// ); +// } + +// // أ) عند قبول السائق للرحلة +// // أ) عند قبول السائق للرحلة (معدلة) +// // دالة الاستقبال من السوكيت (تصبح مجرد محول) +// void _onDriverAcceptedWithSocket(dynamic data, +// {Map? driverData}) { +// // استخراج البيانات وتمريرها للدالة الموحدة +// Map? info = driverData; + +// // دعم الهيكلية الجديدة +// if (info == null && data['driver_info'] != null) { +// info = Map.from(data['driver_info']); +// } +// // دعم الهيكلية القديمة (إن وجدت) +// else if (info == null && data['driverList'] != null) { +// // تحويل driverList إلى map إذا لزم الأمر +// } + +// processRideAcceptance(driverData: info, source: "Socket"); +// } + +// void _fillDriverDataLocally(Map data) { +// try { +// // تعبئة المتغيرات بناءً على أسماء الحقول في acceptRide.php +// driverId = data['driver_id']?.toString() ?? ''; +// driverPhone = data['phone']?.toString() ?? ''; + +// String fName = data['first_name']?.toString() ?? ''; +// String lName = data['last_name']?.toString() ?? ''; +// passengerName = lName.isNotEmpty +// ? "$fName $lName" +// : fName; // (هنا المتغير اسمه passengerName لكنه يحمل اسم السائق في الكود لديك) +// driverName = passengerName; + +// make = data['make']?.toString() ?? ''; +// model = data['model']?.toString() ?? ''; +// carColor = data['color']?.toString() ?? ''; +// colorHex = data['color_hex']?.toString() ?? ''; +// licensePlate = data['car_plate']?.toString() ?? ''; +// carYear = data['year']?.toString() ?? ''; + +// driverRate = data['ratingDriver']?.toString() ?? '5.0'; +// driverToken = data['token']?.toString() ?? ''; + +// // إذا كان هناك أي بيانات أخرى تحتاجها الواجهة +// update(); +// } catch (e) { +// Log.print("Error parsing socket driver data: $e"); +// } +// } + +// // دالة موحدة: تجلب المسار + الوقت + المسافة + ترسم الخط + تضبط الكاميرا +// Future calculateDriverToPassengerRoute( +// LatLng driverPos, LatLng passengerPos) async { +// // 1. تجهيز الرابط (نفس API الـ Direction) +// // نستخدم overview=full للحصول على الرسمة، و steps=false لتخفيف البيانات +// final Map queryParams = { +// 'fromLat': driverPos.latitude.toString(), +// 'fromLng': driverPos.longitude.toString(), +// 'toLat': passengerPos.latitude.toString(), +// 'toLng': passengerPos.longitude.toString(), +// }; +// final uri = +// Uri.parse(AppLink.mapSaasRoute).replace(queryParameters: queryParams); + +// Log.print('📍 Calculating Driver Route: $uri'); + +// try { +// final response = await http.get(uri, headers: { +// 'x-api-key': Env.mapSaasKey, +// }).timeout(const Duration(seconds: 20)); + +// if (response.statusCode == 200) { +// final responseData = json.decode(response.body); + +// // Support both old format (routes[0]) and new SaaS format (top-level) +// var routeData = responseData['routes'] != null +// ? responseData['routes'][0] +// : responseData; + +// // 2. تحديث المتغيرات (المسافة والوقت) +// double durationSecondsRaw = (routeData['duration'] as num).toDouble(); +// int finalDurationSeconds = +// (durationSecondsRaw * kDurationScalar).toInt(); +// double distanceMeters = (routeData['distance'] as num).toDouble(); + +// timeToPassengerFromDriverAfterApplied = finalDurationSeconds; +// remainingTimeToPassengerFromDriverAfterApplied = finalDurationSeconds; +// distanceByPassenger = distanceMeters.toStringAsFixed(0); + +// // تحديث نصوص الواجهة +// int minutes = (finalDurationSeconds / 60).floor(); +// int seconds = finalDurationSeconds % 60; +// stringRemainingTimeToPassenger = +// '$minutes:${seconds.toString().padLeft(2, '0')}'; + +// Log.print( +// '✅ Driver Route Info: $minutes min, ${distanceMeters.toInt()} m'); + +// // 3. معالجة الرسم (Polyline) +// // SaaS uses 'points', OSRM uses 'geometry' +// String pointsString = +// routeData['points'] ?? routeData['geometry'] ?? ""; +// if (pointsString.isNotEmpty) { +// List decodedPoints = +// await compute(decodePolylineIsolate, pointsString); +// // حفظ نسخة للمقارنة +// _currentDriverRoutePoints = decodedPoints; +// // إزالة خط مسار السائق القديم فقط +// polyLines = polyLines +// .where((p) => p.polylineId.value != 'driver_route') +// .toSet(); + +// // إضافة الخط الجديد (بستايل مميز للسائق) +// polyLines = { +// ...polyLines, +// Polyline( +// polylineId: const PolylineId('driver_route'), +// points: decodedPoints, +// color: +// const Color(0xFF333333), // لون مختلف عن مسار الرحلة الأساسي +// width: 5, +// ) +// }; +// } + +// // 4. ضبط الكاميرا لتشمل السائق والراكب +// _fitCameraToPoints(driverPos, passengerPos); + +// update(); // تحديث واحد للكل +// } +// } catch (e) { +// Log.print('❌ Error calculating driver route: $e'); +// } +// } + +// Future _checkAndRecalculateIfDeviated(LatLng driverPos) async { +// // 1. شروط الخروج السريع +// if (_isRecalculatingRoute || _currentDriverRoutePoints.isEmpty) return; + +// // 2. حساب المسافة لأقرب نقطة في المسار (خوارزمية سريعة) +// // نستخدم مكتبة Geolocator أو حساب رياضي بسيط +// double minDistance = 100000.0; + +// // لتقليل الحمل، لا نفحص كل النقاط، نفحص عينة (كل 5 نقاط مثلاً) أو الكل إذا المسار قصير +// for (var point in _currentDriverRoutePoints) { +// double dist = Geolocator.distanceBetween(driverPos.latitude, +// driverPos.longitude, point.latitude, point.longitude); +// if (dist < minDistance) minDistance = dist; +// } + +// // 3. اتخاذ القرار +// if (minDistance > _deviationThresholdMeters) { +// Log.print("⚠️ Driver deviated ($minDistance m). Recalculating route..."); + +// _isRecalculatingRoute = true; + +// // إعادة حساب المسار من موقع السائق الجديد +// await calculateDriverToPassengerRoute(driverPos, passengerLocation); + +// _isRecalculatingRoute = false; +// } +// } + +// // ب) عند وصول السائق +// void _onDriverArrivedWithSocket() { +// Log.print("🚖 Driver Arrived (Socket)"); + +// processDriverArrival("Socket"); +// } + +// // ج) عند بدء الرحلة +// void _onRideStartedWithSocket() { +// Log.print("🚀 Ride Started (Socket)"); +// processRideBegin(source: "Socket"); +// } + +// // ربط السوكيت +// // د) عند انتهاء الرحلة (Socket Listener) +// void _onRideFinishedWithSocket(dynamic data) { +// Log.print("🏁 Ride Finished (Socket)"); + +// // نحاول استخراج DriverList من البيلود القادم من PHP +// // في finish_ride_updates.php أسميناه 'DriverList' +// var rawList = data['DriverList']; + +// List listToSend = []; + +// if (rawList != null) { +// if (rawList is List) { +// listToSend = rawList; +// } else if (rawList is String) { +// // احتياطاً لو وصل كنص +// try { +// listToSend = jsonDecode(rawList); +// } catch (e) { +// Log.print("Error: $e"); +// } +// } +// } + +// // إذا كانت القائمة فارغة، نحاول بناءها من البيانات المتفرقة (Fallback) +// if (listToSend.isEmpty && data['price'] != null) { +// listToSend = [ +// driverId, // 0 +// rideId, // 1 +// driverToken, // 2 +// data['price'].toString() // 3 +// ]; +// } + +// // استدعاء المعالج الموحد +// processRideFinished(listToSend, source: "Socket"); +// } + +// // هـ) عند الإلغاء +// void _onRideCancelledWithSocket(dynamic data) { +// processRideCancelledByDriver(data, source: "Socket"); +// } + +// // ============================================================================== +// // 4. إدارة تتبع الموقع (Polling) - مفصولة عن السوكيت +// // ============================================================================== +// // متغير لمنع التكرار (Race Condition Guard) +// bool _isCancelProcessed = false; + +// /// **معالجة إلغاء الرحلة الموحدة (Gatekeeper)** +// /// +// /// تستدعى من [Socket] أو [FCM] عند قيام السائق بإلغاء الرحلة. +// /// تضمن عدم تضارب الإشعارات وتوحد تجربة المستخدم. +// Future processRideCancelledByDriver(dynamic data, +// {String source = "Unknown"}) async { +// if (_isCancelProcessed) return; + +// _isCancelProcessed = true; +// stopAllTimers(); +// if (Get.isDialogOpen == true) Get.back(); +// await RideLiveNotification.cancel(); +// IosLiveActivityService.endRideActivity(); // ✅ أضف هذا السطر +// PipService.disablePip(); // ✅ إيقاف PiP عند انتهاء الرحلة +// if (Get.isDialogOpen == true) Get.back(); +// await RideLiveNotification.cancel(); +// Get.defaultDialog( +// title: "Sorry 😔".tr, // استخدام المفتاح الإنجليزي +// titleStyle: +// const TextStyle(color: Colors.red, fontWeight: FontWeight.bold), +// barrierDismissible: false, +// content: Column( +// children: [ +// const Icon(Icons.cancel_presentation, +// size: 50, color: Colors.redAccent), +// const SizedBox(height: 10), +// Text( +// "The driver cancelled the trip for an emergency reason.\nDo you want to search for another driver immediately?" +// .tr, +// textAlign: TextAlign.center, +// ), +// ], +// ), +// actions: [ +// TextButton( +// onPressed: () { +// Get.back(); +// handleNoDriverFound(); +// }, +// child: Text("Cancel Trip".tr, +// style: const TextStyle(color: Colors.grey)), +// ), +// ElevatedButton.icon( +// style: +// ElevatedButton.styleFrom(backgroundColor: AppColor.primaryColor), +// icon: const Icon(Icons.refresh, color: Colors.white), +// label: Text("Search for another driver".tr, +// style: const TextStyle(color: Colors.white)), +// onPressed: () { +// Get.back(); +// retrySearchForDrivers(); +// }, +// ), +// ], +// ); +// } + +// Future handleNoDriverFound() async { +// stopAllTimers(); +// await RideLiveNotification.cancel(); +// IosLiveActivityService.endRideActivity(); // ✅ أضف هذا السطر +// PipService.disablePip(); // ✅ إيقاف PiP +// _isCancelProcessed = false; +// currentRideState.value = RideState.noRide; +// resetAllMapStates(); +// Get.offAll(() => const MapPagePassenger()); + +// Get.defaultDialog( +// title: "We apologize 😔".tr, +// middleText: "No drivers found at the moment.\nPlease try again later.".tr, +// confirm: ElevatedButton( +// onPressed: () => Navigator.pop(Get.context!), +// child: Text("Ok".tr), +// ), +// ); +// } + +// /// **إعادة البحث عن سائقين (Retry Search)** +// /// +// /// تقوم باستدعاء السكربت لإعادة تفعيل الرحلة وبدء عداد البحث من جديد. +// void retrySearchForDrivers() async { +// _isCancelProcessed = false; +// isSearchingWindow = true; +// currentRideState.value = RideState.searching; +// driversStatusForSearchWindow = 'Searching for nearby drivers...'.tr; +// update(); + +// try { +// Log.print("🔄 Retrying search for ride ID: $rideId"); + +// // تجهيز البيانات المخزنة للإرسال +// var payload = { +// "ride_id": rideId.toString(), +// "passenger_id": box.read(BoxName.passengerID).toString(), +// "passenger_name": box.read(BoxName.name).toString(), +// "passenger_phone": box.read(BoxName.phone).toString(), +// "passenger_email": box.read(BoxName.email).toString(), +// "passenger_token": box.read(BoxName.tokenFCM).toString(), +// "passenger_wallet": box.read(BoxName.passengerWalletTotal).toString(), +// "passenger_rating": "5.0", // أو قراءة التقييم الحقيقي إن وجد + +// // قراءة البيانات من المتغيرات المحفوظة في الكنترولر أو الـ Box +// "start_lat": startLocation.latitude.toString(), +// "start_lng": startLocation.longitude.toString(), +// "end_lat": endLocation.latitude.toString(), +// "end_lng": endLocation.longitude.toString(), +// "start_name": startNameAddress, +// "end_name": endNameAddress, +// "distance": distance.toString(), +// "distance_text": distanceByPassenger ?? "", +// "duration_text": durationToPassenger.toString(), +// "price": totalPassenger.toString(), +// "price_for_driver": costForDriver.toString(), +// "car_type": box.read(BoxName.carType).toString(), +// "is_wallet": Get.find().isWalletChecked.toString(), + +// // الخطوات (اختياري) +// "has_steps": Get.find().wayPoints.length > 1 +// ? "true" +// : "false", +// // يمكنك إضافة الخطوات إذا كانت لديك في مصفوفة +// }; + +// var response = await CRUD().post( +// link: "${AppLink.rideServerSide}/rides/retry_search_drivers.php", +// payload: payload, +// ); + +// if (response['status'] == 'success') { +// Log.print("✅ Search reset successfully."); +// startSearchingTimer(); +// } else { +// mySnackbarWarning("Failed to search, please try again later".tr); +// handleNoDriverFound(); +// } +// } catch (e) { +// Log.print("Error retrying search: $e"); +// mySnackbarWarning("Please check your internet connection".tr); +// handleNoDriverFound(); +// } +// } + +// Timer? _searchTimer; + +// /// **بدء مؤقت البحث (Search Timer)** +// /// +// /// يبدأ عداداً (مثلاً 90 ثانية). إذا لم يتم قبول الرحلة خلال هذه المدة، +// /// يتم إنهاء البحث واستدعاء [handleNoDriverFound]. +// Future startSearchingTimer() async { +// _searchTimer?.cancel(); +// int seconds = 0; + +// Log.print("⏳ Search Timer Started (90s)..."); +// await RideLiveNotification.showSearching(driversStatusForSearchWindow); + +// _searchTimer = Timer.periodic(const Duration(seconds: 1), (timer) { +// seconds++; + +// // إذا تغيرت الحالة (مثلاً سائق قبل الرحلة)، نوقف العداد +// if (currentRideState.value != RideState.searching) { +// timer.cancel(); +// return; +// } + +// // انتهاء الوقت (90 ثانية) +// if (seconds >= 90) { +// timer.cancel(); +// handleNoDriverFound(); // ⏳ انتهى الوقت ولم نجد سائقاً +// } +// }); +// } + +// // متغير لمنع التكرار (Race Condition Guard) +// bool _isArrivalProcessed = false; + +// /// **معالجة وصول السائق الموحدة (Unified Driver Arrival Handler)** +// /// +// /// تقوم هذه الدالة بإدارة حدث وصول السائق إلى موقع الراكب، وتعمل كـ "حارس بوابة" (Gatekeeper) +// /// لتوحيد المصادر سواء كانت من **WebSocket** أو **Firebase Notification**. +// /// +// /// **المهام التي تقوم بها:** +// /// 1. **منع التضارب (Race Condition Guard):** تتأكد أن الحدث لم يتم تنفيذه مسبقاً لتجنب تكرار الإشعارات أو إعادة ضبط العدادات. +// /// 2. **تحديث الحالة:** تغير حالة الرحلة فوراً إلى [RideState.driverArrived]. +// /// 3. **تفعيل الواجهة:** تظهر ديالوج "السائق وصل" وتبدأ عداد الانتظار المجاني (5 دقائق). +// /// +// /// * [source] : نص يوضح مصدر الاستدعاء (مثل "Socket" أو "FCM") لأغراض التتبع (Logging). +// Future processDriverArrival(String source) async { +// // 1. الحارس: إذا تم التنفيذ سابقاً، توقف +// if (currentRideState.value == RideState.driverArrived || +// _isArrivalProcessed) { +// Log.print("✋ Ignored Arrival from $source. Already processed."); +// return; +// } + +// _isArrivalProcessed = true; +// Log.print("🚖 Driver Arrived via $source! Processing..."); + +// // 2. تحديث الحالة +// currentRideState.value = RideState.driverArrived; +// statusRide = 'Arrived'; +// await RideLiveNotification.showDriverArrived(driverName ?? ''); + +// // 3. تشغيل واجهة الوصول والعداد +// driverArrivePassengerDialoge(); +// startTimerDriverWaitPassenger5Minute(); + +// // 4. إزالة مسار السائق واستعادة مسار الراكب للوجهة +// if (polylineCoordinates.isNotEmpty) { +// _playRouteAnimation(polylineCoordinates, lastComputedBounds); +// } + +// update(); +// } + +// // متغير لمنع التكرار +// bool _isFinishProcessed = false; + +// /// **معالجة إنهاء الرحلة الموحدة (Unified Ride Finish Handler)** +// /// +// /// تستدعى عند استلام حدث النهاية من السوكيت أو FCM. +// /// تقوم بإغلاق السوكيت، إيقاف التتبع، والانتقال لشاشة التقييم والدفع. +// /// +// /// * [driverList]: قائمة البيانات [driverId, rideId, token, price]. +// Future processRideFinished(List driverList, +// {String source = "Unknown"}) async { +// // 1. الحارس: منع التكرار +// if (currentRideState.value == RideState.finished || _isFinishProcessed) { +// Log.print("✋ Ignored Finish Request from $source. Already Finished."); +// return; +// } + +// _isFinishProcessed = true; +// Log.print( +// "🏁 Ride Finished via $source. Price: ${driverList.length > 3 ? driverList[3] : 'N/A'}"); + +// // 2. تحديث الحالة +// currentRideState.value = RideState.finished; + +// // 3. تنظيف الموارد +// disposeRideSocket(); // إغلاق السوكيت +// _stopDriverLocationPolling(); // إيقاف تتبع الموقع +// if (Get.isRegistered()) { +// Get.find().stopRecording(); +// } + +// // إغلاق أي ديالوج سابق +// if (Get.isDialogOpen == true) Get.back(); + +// // 4. إشعار "لا تنسى أغراضك" +// NotificationController().showNotification( +// 'Alert'.tr, +// "Please make sure not to leave any personal belongings in the car.".tr, +// 'tone1', +// ); +// IosLiveActivityService.endRideActivity(); +// PipService.disablePip(); // ✅ إيقاف PiP +// await RideLiveNotification.cancel(); +// // 5. استخراج البيانات والانتقال +// if (driverList.length >= 4) { +// String price = driverList[3].toString(); + +// // الانتقال لصفحة التقييم +// Get.offAll(() => RateDriverFromPassenger(), arguments: { +// 'driverId': driverList[0].toString(), +// 'rideId': driverList[1].toString(), +// 'price': price +// }); +// } +// } + +// void _startDriverLocationPollingWithTimer() { +// Log.print("📍 Starting Driver Location Polling (6s interval)"); + +// _locationPollingTimer?.cancel(); + +// // استدعاء فوري لأول مرة +// // getDriverCarsLocationToPassengerAfterApplied(); + +// _locationPollingTimer = Timer.periodic(Duration(seconds: 6), (timer) { +// // شرط التوقف: إذا انتهت الرحلة أو ألغيت +// if (currentRideState.value == RideState.finished || +// currentRideState.value == RideState.cancelled || +// currentRideState.value == RideState.noRide) { +// timer.cancel(); +// return; +// } + +// // جلب الموقع وتحديث الماركر +// getDriverCarsLocationToPassengerAfterApplied(); +// }); +// } + +// void _stopDriverLocationPolling() { +// Log.print("🛑 Stopping Location Polling"); +// _locationPollingTimer?.cancel(); +// _locationPollingTimer = null; +// } + +// // ============================================================================== +// // 5. التنظيف والإغلاق +// // ============================================================================== +// void disposeRideSocket() { +// if (socket != null) { +// socket!.disconnect(); +// socket!.dispose(); +// // socket = null; +// isSocketConnected = false; +// Log.print("🔌 Socket Disposed"); +// } +// } + +// /// ============================================================================== +// /// 6. معالجة تحديث موقع السائق من السوكيت +// /// ============================================================================== +// void handleDriverLocationUpdate(dynamic data) { +// if (!isSocketConnected || data == null) return; +// // 🔥 1. تسجيل وقت استلام البيانات (تغذية الـ Watchdog) +// _lastSocketLocationTime = DateTime.now(); +// _socketLocationUpdatesCount++; + +// // 🧠 إذا وصلتنا 3 تحديثات ناجحة من السوكيت، أوقف البولينج (إن كان يعمل) +// if (_socketLocationUpdatesCount >= 3 && _locationPollingTimer != null) { +// Log.print("✅ Socket delivering locations reliably. Stopping polling."); +// _stopDriverLocationPolling(); +// } +// try { +// double lat = double.tryParse(data['latitude']?.toString() ?? '0') ?? 0; +// double lng = double.tryParse(data['longitude']?.toString() ?? '0') ?? 0; +// double heading = double.tryParse(data['heading']?.toString() ?? '0') ?? 0; + +// if (lat == 0 || lng == 0) return; + +// LatLng newPos = LatLng(lat, lng); + +// // تحديث القائمة (نفس المنطق القديم) +// if (driverCarsLocationToPassengerAfterApplied.isEmpty) { +// driverCarsLocationToPassengerAfterApplied.add(newPos); +// } else { +// driverCarsLocationToPassengerAfterApplied[0] = newPos; +// } + +// currentLocationOfDrivers = newPos; +// // ------------------------------------------------------------------ +// // 🔥 2. Smart Rerouting Logic ( deviation > 50m ) +// // ------------------------------------------------------------------ +// if (_currentDriverRoutePoints.isNotEmpty) { +// double deviation = +// _calculateDistanceToPolyline(newPos, _currentDriverRoutePoints); +// if (deviation > 50.0) { +// Log.print( +// "⚠️ Driver deviated by ${deviation.toStringAsFixed(1)}m. Smart Rerouting triggered."); +// // إعادة رسم المسار محلياً (لا يتم استدعاؤه إلا عند الانحراف الحقيقي) +// calculateDriverToPassengerRoute(newPos, passengerLocation); +// } +// } + +// // 🔥 تحديث الكاميرا: ضمان بقاء السيارة في منتصف الخريطة +// // ------------------------------------------------------------------ +// // ملاحظة: تأكد من أن mapController قد تم تهيئته (initialized) +// if (mapController != null) { +// // نستخدم animateCamera لحركة ناعمة بدلاً من moveCamera القاسية +// mapController!.animateCamera(CameraUpdate.newLatLng(newPos)); +// } +// // ------------------------------------------------------------------ + +// // تحديث الوقت المتبقي (إذا أرسله السيرفر) +// if (data['eta_seconds'] != null) { +// int etaSeconds = int.tryParse(data['eta_seconds'].toString()) ?? 0; +// if (etaSeconds > 0) { +// remainingTimeToPassengerFromDriverAfterApplied = etaSeconds; +// int minutes = (etaSeconds / 60).floor(); +// int seconds = etaSeconds % 60; +// stringRemainingTimeToPassenger = +// '$minutes:${seconds.toString().padLeft(2, '0')}'; +// } +// } + +// // تحديث الماركر +// _updateDriverMarker(newPos, heading); +// } catch (e) { +// Log.print('Error in handleDriverLocationUpdate: $e'); +// } +// } + +// // دالة مساعدة لتحديث ماركر السائق +// void _updateDriverMarker(LatLng position, double heading) { +// const String markerId = 'driver_location'; +// final mId = MarkerId(markerId); + +// final existingMarker = markers.cast().firstWhere( +// (m) => m?.markerId == mId, +// orElse: () => null, +// ); + +// if (existingMarker != null) { +// _smoothlyUpdateMarker(existingMarker, position, heading, carIcon); +// } else { +// markers = { +// ...markers, +// Marker( +// markerId: mId, +// position: position, +// icon: InlqBitmap.fromStyleImage(carIcon), +// rotation: heading, +// anchor: const Offset(0.5, 0.5), +// ), +// }; +// update(); +// } +// } + +// // === إضافة متغير للتحكم === +// bool _isUsingFallback = false; + +// void _startPollingFallback() { +// if (_isUsingFallback) return; + +// Log.print('🔄 Starting Polling Fallback Mode'); +// _isUsingFallback = true; + +// // استخدام _handleRideState الموجود (كما كان) +// _startMasterTimer(); +// } + +// void handleActiveRideOnStartup(dynamic data) { +// try { +// if (data == null || data['has_active_ride'] != true) { +// Log.print('[Startup] No active ride'); +// currentRideState.value = RideState.noRide; +// _startMasterTimer(); +// return; +// } + +// Log.print('[Startup] ✅ Active ride found!'); + +// var rideData = data['ride']; +// rideId = rideData['ride_id'].toString(); +// currentRideId = rideId; +// driverId = rideData['driver_id']?.toString() ?? ''; + +// String status = rideData['status']?.toString().toLowerCase() ?? ''; + +// // تحديد الحالة +// if (status == 'waiting' || status == 'searching') { +// currentRideState.value = RideState.searching; +// isSearchingWindow = true; +// } else if (status == 'apply' || status == 'applied') { +// currentRideState.value = RideState.driverApplied; +// statusRide = 'Apply'; + +// // الاشتراك في موقع السائق +// socket.emit('subscribe_driver_location', { +// 'ride_id': rideId, +// 'driver_id': driverId, +// }); + +// // استعادة بيانات السائق +// if (rideData['driver_info'] != null) { +// var dInfo = rideData['driver_info']; +// passengerName = dInfo['first_name']?.toString() ?? ''; +// driverPhone = dInfo['phone']?.toString() ?? ''; +// model = dInfo['model']?.toString() ?? ''; +// licensePlate = dInfo['license_plate']?.toString() ?? ''; +// } +// } else if (status == 'arrived') { +// currentRideState.value = RideState.driverArrived; +// statusRide = 'Arrived'; +// isDriverArrivePassenger = true; +// } else if (status == 'begin' || status == 'started') { +// currentRideState.value = RideState.inProgress; +// statusRide = 'Begin'; +// rideTimerBegin = true; + +// // استعادة Polyline +// if (rideData['polyline'] != null) { +// _restorePolyline(rideData['polyline']); +// } + +// rideIsBeginPassengerTimer(); +// } + +// update(); +// _startMasterTimer(); // للـ Safety Checks +// } catch (e) { +// Log.print('[Startup] Error: $e'); +// currentRideState.value = RideState.noRide; +// _startMasterTimer(); +// } +// } + +// Future _restorePolyline(String polylineString) async { +// try { +// List points = +// await compute(decodePolylineIsolate, polylineString); + +// polylineCoordinates.clear(); +// polylineCoordinates.addAll(points); + +// polyLines.clear(); +// polyLines = { +// ...polyLines, +// Polyline( +// polylineId: const PolylineId('route_direct'), +// points: polylineCoordinates, +// color: const Color(0xFF2196F3), +// width: 6, +// ) +// }; + +// update(); +// } catch (e) { +// Log.print('Error restoring polyline: $e'); +// } +// } + +// // متغير لمنع التكرار (Race Condition Guard) +// bool _isAcceptanceProcessed = false; + +// // ============================================================================== +// // الدالة الموحدة لمعالجة القبول (من السوكيت أو FCM) +// // ============================================================================== +// Future processRideAcceptance( +// {Map? driverData, required String source}) async { +// // 1. الحماية: إذا تم المعالجة مسبقاً، تجاهل +// // نستثني حالة واحدة: إذا كنا في وضع البحث (Searching) نقبل الأمر +// // إذا كنا في driverApplied، نتجاهل الأمر +// if (currentRideState.value != RideState.searching && +// _isAcceptanceProcessed) { +// Log.print("✋ Ignored Acceptance from $source. Already processed."); +// return; +// } + +// _rideAcceptedViaSource = source; +// _socketLocationUpdatesCount = 0; + +// _isAcceptanceProcessed = true; // قفل الباب +// Log.print("🚀 Winner: $source triggered acceptance! Processing..."); + +// // 2. إيقاف جميع التايمرات القديمة فوراً +// _masterTimer?.cancel(); +// // stopSearchingTimer(); // إذا كان لديك تايمر للبحث + +// // 3. تحديث الحالة في الواجهة +// currentRideState.value = RideState.driverApplied; +// statusRide = 'Apply'; +// isSearchingWindow = false; + +// // 4. معالجة البيانات (تعبئة المتغيرات) +// if (driverData != null && driverData.isNotEmpty) { +// Log.print("📥 Populating Data from $source payload..."); +// _fillDriverDataLocally(driverData); +// } else { +// Log.print("⚠️ No Data in Payload. Fallback to API."); +// await getUpdatedRideForDriverApply(rideId); +// } +// // أضف هذا بعد السطر الذي تستدعي فيه RideTrackingNative +// await IosLiveActivityService.startRideActivity( +// rideId: rideId, +// driverName: driverName ?? 'السائق', +// carDetails: '$make • $carColor', +// etaText: stringRemainingTimeToPassenger, +// progress: 0.0, +// ); +// // إشعارات (الأسعار، الأمان...) +// _showRideStartNotifications(); +// final etaText = stringRemainingTimeToPassenger; // مثال: "8 دقائق" +// final carInfo = '$make • $model • $licensePlate'; + +// await RideLiveNotification.showDriverOnWay( +// driverName: driverName, +// etaText: etaText, +// carInfo: carInfo, +// ); + +// update(); // تحديث الواجهة لإظهار بيانات السائق + +// // 5. 🔥 العمليات الجغرافية (المسار والوقت) 🔥 + +// // أ) جلب موقع السائق الأولي +// await getDriverCarsLocationToPassengerAfterApplied(); +// _startSocketWatchdog(); +// // ب) رسم المسار وحساب الوقت +// if (driverCarsLocationToPassengerAfterApplied.isNotEmpty) { +// LatLng driverPos = driverCarsLocationToPassengerAfterApplied.last; + +// // نستخدم الدالة الموحدة الجديدة للحساب والرسم +// await calculateDriverToPassengerRoute(driverPos, passengerLocation); + +// // ج) تشغيل التايمر المحلي (للعد التنازلي فقط) +// startTimerFromDriverToPassengerAfterApplied(); +// } +// final int timeToPassengerSeconds = +// timeToPassengerFromDriverAfterApplied; // مثلاً من السيرفر +// final double distanceDriverToPassengerMeters = +// double.tryParse(distanceByPassenger.toString()) ?? 0.0; + +// // [PiP] تفعيل PiP عند بدء الرحلة (سيدخل وضع النافذة العائمة عند خروج المستخدم) +// PipService.enablePip(); + +// // 6. 🔥 القرار الذكي: هل نبدأ البولينج أم نعتمد على السوكيت؟ 🔥 +// if (source == "Socket" && isSocketConnected) { +// // ✅ السوكيت هو من أخبرنا بالقبول — نثق به ولا نشغل البولينج +// Log.print( +// "🧠 Smart Mode: Socket accepted ride. Skipping polling, relying on WebSocket."); +// // الـ watchdog وحده يكفي كشبكة أمان +// } else { +// // ⚠️ القبول من FCM أو Polling — نشغل البولينج كالمعتاد +// Log.print("🔄 Fallback Mode: $source accepted ride. Starting polling."); +// _startDriverLocationPollingWithTimer(); +// } +// } + +// Timer? _watchdogTimer; + +// void _startSocketWatchdog() { +// _watchdogTimer?.cancel(); +// Log.print("👀 Starting Socket Watchdog (Hybrid Mode)..."); + +// _watchdogTimer = Timer.periodic(const Duration(seconds: 5), (timer) async { +// if (currentRideState.value != RideState.driverApplied && +// currentRideState.value != RideState.driverArrived && +// currentRideState.value != RideState.inProgress) { +// timer.cancel(); +// return; +// } + +// final lastTime = _lastSocketLocationTime ?? +// DateTime.now().subtract(const Duration(minutes: 1)); +// final difference = DateTime.now().difference(lastTime).inSeconds; + +// if (difference < 15 && isSocketConnected) { +// // ✅ السوكيت صحي — تأكد أن البولينج متوقف إذا كنا في وضع السوكيت +// if (_locationPollingTimer != null && +// _rideAcceptedViaSource == "Socket") { +// Log.print("✅ Socket recovered. Stopping polling fallback."); +// _stopDriverLocationPolling(); +// } +// } else if (difference >= 15 && difference < 30) { +// // ⚠️ تأخر متوسط — جلب واحد فقط +// Log.print("⚠️ Socket silent for ${difference}s. Single API Poll..."); +// await getDriverCarsLocationToPassengerAfterApplied(); +// } else if (difference >= 30) { +// // 🔴 السوكيت ميت — تفعيل البولينج الكامل كـ fallback +// if (_locationPollingTimer == null) { +// Log.print( +// "🔴 Socket dead for ${difference}s. Activating polling fallback!"); +// _startDriverLocationPollingWithTimer(); +// } else { +// // البولينج يعمل بالفعل، فقط أكمل +// await getDriverCarsLocationToPassengerAfterApplied(); +// } +// } +// }); +// } + +// // قائمة بأنصاف الأقطار (بالأمتار) لكل مرحلة +// final List _searchRadii = [ +// 2400, +// 3000, +// 3100 +// ]; // 0 ثانية، 30 ثانية، 60 ثانية +// // المدة الزمنية لكل مرحلة بحث (بالثواني) +// final int _searchPhaseDurationSeconds = 30; +// // المهلة الإجمالية للبحث قبل عرض خيار زيادة السعر +// final int _totalSearchTimeoutSeconds = 90; // 90 ثانية +// // --- noRide throttling --- +// int _noRideSearchCount = 0; +// final int _noRideMaxTries = 3; // نفذ البحث 6 مرات فقط +// final int _noRideIntervalSec = 5; // بين كل محاولة وأخرى 5 ثواني +// DateTime? _noRideNextAllowed; // متى نسمح بالمحاولة التالية +// bool _noRideSearchCapped = false; // وصلنا للحد وتوقفنا +// // ============== new design to manage ride state ============== +// // === 1. حالة الرحلة والمؤقت الرئيسي (Single Source of Truth) === +// Rx currentRideState = RideState.noRide.obs; +// Timer? _masterTimer; +// final int _pollingIntervalSeconds = 13; // فاصل زمني موحد للاستعلام + +// void _startMasterTimer() { +// // نضمن أن مؤقت واحد فقط يعمل في أي وقت +// _masterTimer?.cancel(); +// _masterTimer = +// Timer.periodic(Duration(seconds: _pollingIntervalSeconds), (_) { +// _handleRideState(currentRideState.value); +// }); +// } + +// void stopAllTimers() { +// Log.print('🛑 FORCE STOP: Stopping ALL Timers and Streams 🛑'); + +// // 1. إيقاف الماكينة الرئيسية +// _masterTimer?.cancel(); +// _masterTimer = null; + +// // 2. إيقاف مؤقتات تتبع السائق +// timerToPassengerFromDriverAfterApplied?.cancel(); +// _timer?.cancel(); +// _uiCountdownTimer?.cancel(); + +// // 3. إيقاف مؤقتات الخريطة + +// _animationTimers.forEach((key, timer) => timer.cancel()); +// _animationTimers.clear(); + +// // 4. إغلاق الستريمز +// if (!_rideStatusStreamController.isClosed) +// _rideStatusStreamController.close(); +// if (!_beginRideStreamController.isClosed) +// _beginRideStreamController.close(); +// if (!timerController.isClosed) timerController.close(); + +// // 5. تصفير العدادات لمنع إعادة الدخول +// isTimerRunning = false; +// isBeginRideFromDriverRunning = false; +// _isFetchingDriverLocation = false; + +// update(); +// } + +// final int _maxNoRideSearch = 3; // عدد المرات القصوى +// final int _noRideDelaySeconds = 6; // الفاصل الزمني بين كل بحث +// // +// // +// // !!! يرجى استبدال الدالة القديمة بالكامل بهذه الدالة الجديدة !!! +// // +// // +// bool _isStateProcessing = false; + +// Future _handleRideState(RideState state) async { +// if (_isRatingScreenOpen) { +// Log.print('⛔ Rating Screen is Open. Skipping Logic.'); +// stopAllTimers(); // تأكيد إضافي للإيقاف +// return; +// } +// Log.print('Handling state: $state'); + +// // int effectivePollingInterval = _pollingIntervalSeconds; + +// // الحصول على الفاصل الزمني من الخريطة +// int effectivePollingInterval = +// _pollingIntervals[state] ?? _pollingIntervalSeconds; + +// switch (state) { +// case RideState.noRide: +// final now = DateTime.now(); +// if (_noRideSearchCount >= _noRideMaxTries) { +// if (!_noRideSearchCapped) { +// _noRideSearchCapped = true; +// Log.print('[noRide] search capped at $_noRideMaxTries attempts'); +// } +// break; +// } +// if (_noRideNextAllowed != null && now.isBefore(_noRideNextAllowed!)) { +// break; +// } +// _noRideSearchCount++; +// Log.print('_noRideSearchCount: $_noRideSearchCount'); +// _noRideNextAllowed = now.add(Duration(seconds: _noRideIntervalSec)); +// String currentCarType = box.read(BoxName.carType) ?? 'yet'; +// getCarsLocationByPassengerAndReloadMarker(); +// getNearestDriverByPassengerLocation(); +// break; + +// case RideState.cancelled: +// Log.print('[handleRideState] Ride cancelled. Stopping polling.'); +// stopAllTimers(); +// // effectivePollingInterval = 3600; +// break; + +// case RideState.preCheckReview: +// stopAllTimers(); +// _checkLastRideForReview(); +// break; + +// case RideState.searching: +// // Guard: Don't poll if ride is not registered yet +// if (rideId == 'yet' || rideId.isEmpty) break; + +// // 1. التحقق من حالة الطلب (هل قبله أحد؟) عبر البولينج كشبكة أمان +// try { +// String statusFromServer = await getRideStatus(rideId); +// if (statusFromServer == 'Apply' || statusFromServer == 'Applied') { +// await processRideAcceptance(source: "Polling"); +// break; +// } +// } catch (e) { +// Log.print('Error polling getRideStatus: $e'); +// } + +// final now = DateTime.now(); +// final int elapsedSeconds = now.difference(_searchStartTime!).inSeconds; + +// // انتهاء وقت البحث الكلي +// if (elapsedSeconds > _totalSearchTimeoutSeconds) { +// stopAllTimers(); +// currentRideState.value = RideState.noRide; +// isSearchingWindow = false; +// update(); +// _showIncreaseFeeDialog(); +// break; +// } + +// // 2. إدارة مراحل البحث (توسيع النطاق) +// // السيناريو الجديد: لا نقوم بالقصف العشوائي، نرسل بناء على المرحلة أو مرور وقت كافٍ لدخول سائقين جدد + +// int targetPhase = +// (elapsedSeconds / _searchPhaseDurationSeconds).floor(); +// if (targetPhase >= _searchRadii.length) { +// targetPhase = _searchRadii.length - 1; +// } + +// // هل تغيرت المرحلة (توسع النطاق)؟ أو هل مر 10 ثواني منذ آخر محاولة إرسال؟ +// // هذا يمنع إرسال الإشعار في كل دورة (كل 5 ثواني) ويقلل الازعاج +// bool isNewPhase = targetPhase > _currentSearchPhase; +// bool timeToScanForNewDrivers = +// (elapsedSeconds % 15 == 0); // كل 15 ثانية نفحص الدخول الجديد + +// if (isNewPhase || timeToScanForNewDrivers || elapsedSeconds < 5) { +// _currentSearchPhase = targetPhase; +// int currentRadius = _searchRadii[_currentSearchPhase]; + +// Log.print( +// '[Search Logic] Scanning for drivers. Phase: $_currentSearchPhase, Radius: $currentRadius'); +// // استدعاء دالة الإشعار الذكية +// // _findAndNotifyNearestDrivers(currentRadius); +// } + +// // تحديث نصوص الواجهة +// if (elapsedSeconds < 5) { +// driversStatusForSearchWindow = 'Your order is being prepared'.tr; +// } else if (elapsedSeconds < 15) { +// driversStatusForSearchWindow = 'Your order sent to drivers'.tr; +// } else { +// driversStatusForSearchWindow = +// 'The drivers are reviewing your request'.tr; +// } +// update(); +// break; + +// case RideState.driverApplied: +// // effectivePollingInterval = 10; +// if (!_isDriverAppliedLogicExecuted) { +// Log.print('[handleRideState] Execution driverApplied logic.'); +// rideAppliedFromDriver(true); +// _isDriverAppliedLogicExecuted = true; +// } + +// if (!isSocketConnected) { +// try { +// String statusFromServer = await getRideStatus(rideId); +// if (statusFromServer == 'Arrived') { +// currentRideState.value = RideState.driverArrived; +// break; +// } else if (statusFromServer == 'Begin' || +// statusFromServer == 'inProgress') { +// processRideBegin(); +// break; +// } +// } catch (e) { +// Log.print('Error polling for Arrived/Begin status: $e'); +// } +// } +// // 🧠 جلب الموقع فقط إذا السوكيت غير صحي +// if (!_isSocketHealthy()) { +// getDriverCarsLocationToPassengerAfterApplied(); +// } +// break; + +// case RideState.driverArrived: +// if (!_isDriverArrivedLogicExecuted) { +// _isDriverArrivedLogicExecuted = true; +// startTimerDriverWaitPassenger5Minute(); +// driverArrivePassengerDialoge(); +// } +// // effectivePollingInterval = 8; +// break; + +// case RideState.inProgress: +// // effectivePollingInterval = 6; + +// if (!isSocketConnected) { +// try { +// String statusFromServer = await getRideStatus(rideId); + +// // !!! هنا التغيير الجذري !!! +// if (statusFromServer == 'Finished' || +// statusFromServer == 'finished') { +// Log.print( +// '🏁 DETECTED FINISHED: Killing processes and forcing Review.'); + +// // 1. قتل العمليات فوراً +// stopAllTimers(); + +// // 2. تغيير الحالة الداخلية لمنع أي كود آخر من العمل +// currentRideState.value = RideState.preCheckReview; + +// // 3. تنظيف الواجهة +// tripFinishedFromDriver(); + +// // 4. استدعاء شاشة التقييم فوراً +// _checkLastRideForReview(); + +// return; // خروج نهائي من الدالة لمنع أي كود بالأسفل من التنفيذ +// } +// } catch (e) { +// Log.print('Error polling status: $e'); +// } +// } + +// // بقية كود التتبع العادي (لن يتم الوصول إليه إذا انتهت الرحلة) +// if (!_isRideBeginLogicExecuted) { +// _isRideBeginLogicExecuted = true; +// _executeBeginRideLogic(); +// } +// // 🧠 جلب الموقع فقط إذا السوكيت غير صحي +// if (!_isSocketHealthy()) { +// getDriverCarsLocationToPassengerAfterApplied(); +// } +// break; +// case RideState.finished: +// tripFinishedFromDriver(); +// stopAllTimers(); +// effectivePollingInterval = 3600; +// break; +// } +// // تحديث الماكينة الرئيسية إذا تغير الفاصل الزمني +// _startMasterTimerWithInterval(effectivePollingInterval); +// } + +// int _masterIntervalSeconds = -1; + +// void _startMasterTimerWithInterval(int seconds) { +// // نفس الانترفَل؟ لا تعمل شيء +// if (_masterTimer != null && _masterIntervalSeconds == seconds) return; + +// _masterIntervalSeconds = seconds; +// _masterTimer?.cancel(); + +// _masterTimer = Timer.periodic(Duration(seconds: seconds), (_) { +// _handleRideState(currentRideState.value); +// }); +// } + +// Future _checkInitialRideStatus() async { +// // 1. جلب الحالة من السيرفر (باستخدام getRideStatusFromStartApp) +// await getRideStatusFromStartApp(); +// String _status = rideStatusFromStartApp['data']['status']; +// // Log.print('rideStatusFromStartApp: ${rideStatusFromStartApp}'); +// // Log.print('_status: ${_status}'); + +// if (_status == 'waiting' || _status == 'Apply' || _status == 'Begin') { +// // رحلة جارية +// rideId = rideStatusFromStartApp['data']['rideId'].toString(); +// currentRideState.value = _status == 'waiting' +// ? RideState.searching +// : _status == 'Apply' +// ? RideState.driverApplied +// : _status == 'Begin' +// ? RideState.inProgress +// : _status == 'Cancel' +// ? RideState.cancelled +// : RideState.noRide; +// } else if (_status == 'Finished') { +// // رحلة منتهية/ملغاة +// if (rideStatusFromStartApp['data']['needsReview'] == 1) { +// currentRideState.value = RideState.preCheckReview; +// } else { +// currentRideState.value = RideState.noRide; +// } +// } else { +// currentRideState.value = RideState.noRide; +// } + +// // بدء المعالجة الفورية +// _handleRideState(currentRideState.value); +// } + +// Future _checkLastRideForReview() async { +// Log.print('⭐ FORCE OPEN RATING PAGE (Get.to mode)'); + +// // جلب البيانات +// await getRideStatusFromStartApp(); + +// if (rideStatusFromStartApp['data'] == null) { +// currentRideState.value = RideState.noRide; +// _startMasterTimer(); +// return; +// } + +// String needsReview = +// rideStatusFromStartApp['data']['needsReview'].toString(); + +// if (needsReview == '1') { +// _isRatingScreenOpen = true; +// // 1. تجهيز البيانات (Arguments) +// var args = { +// 'driverId': rideStatusFromStartApp['data']['driver_id'].toString(), +// 'rideId': rideStatusFromStartApp['data']['rideId'].toString(), +// 'driverName': rideStatusFromStartApp['data']['driverName'], +// 'price': rideStatusFromStartApp['data']['price'], +// }; + +// // 2. استخدام Get.to مع await (هذا هو الحل الجذري) +// // الكود سيتوقف هنا ولن يكمل التنفيذ حتى يتم إغلاق صفحة التقييم +// await Get.to( +// () => RatingDriverBottomSheet(), +// arguments: args, // تمرير البيانات بالطريقة التي تريدها +// preventDuplicates: true, // لمنع فتح الصفحة مرتين +// popGesture: false, // لمنع السحب للرجوع (في iOS) +// ); + +// // 3. هذا الكود لن يتنفذ إلا بعد أن يضغط المستخدم "تم" في التقييم ويغلق الصفحة +// Log.print('✅ Rating Page Closed. Resetting App.'); +// _isRatingScreenOpen = false; +// restCounter(); +// currentRideState.value = RideState.noRide; +// _startMasterTimer(); // إعادة تشغيل البحث الآن فقط +// } else { +// currentRideState.value = RideState.noRide; +// _startMasterTimer(); +// } +// } + +// void startSearchingForDriver() async { +// // ✅ منع الضغط المزدوج +// if (currentRideState.value == RideState.searching) { +// return; +// } +// // 1. تحديث الحالة الأولية +// isSearchingWindow = true; +// currentRideState.value = RideState.searching; +// driversStatusForSearchWindow = 'Searching for nearby drivers...'.tr; +// update(); + +// // 2. إرسال الطلب للسيرفر (add_ride.php) +// bool rideCreated = await postRideDetailsToServer(); + +// if (!rideCreated) { +// // فشل الإنشاء +// isSearchingWindow = false; +// currentRideState.value = RideState.noRide; +// mySnackbarWarning("Could not create ride. Please try again.".tr); +// update(); +// return; +// } + +// // 3. نجاح الإنشاء: إضافة لجدول الانتظار المحلي (اختياري حسب منطقك) +// _addRideToWaitingTable(); + +// // 4. 🔥 الاتصال بالسوكيت فوراً وانتظار الرد الحقيقي 🔥 +// // نغلق أي اتصال سابق ونبدأ اتصالاً جديداً مخصصاً لهذه الرحلة +// initConnectionWithSocket(); + +// // تشغيل الماكينة الرئيسية للمراقبة (كحماية إضافية) +// // _startMasterTimer(); +// } + +// /// دالة لإظهار النافذة المنبثقة لزيادة السعر +// void _showIncreaseFeeDialog() { +// Get.dialog( +// CupertinoAlertDialog( +// title: Text("No drivers accepted your request yet".tr), +// content: Text( +// "Increasing the fare might attract more drivers. Would you like to increase the price?" +// .tr), +// actions: [ +// CupertinoDialogAction( +// child: Text("Cancel Ride".tr, +// style: TextStyle(color: AppColor.redColor)), +// onPressed: () { +// Get.back(); +// changeCancelRidePageShow(); +// // cancelRide(); // دالة إلغاء الرحلة +// }, +// ), +// CupertinoDialogAction( +// child: Text("Increase Fare".tr, +// style: TextStyle(color: AppColor.greenColor)), +// onPressed: () { +// Get.back(); +// // هنا يمكنك عرض نافذة أخرى لإدخال السعر الجديد +// // وبعدها استدعاء الدالة التالية +// // كمثال، سنزيد السعر بنسبة 10% +// double newPrice = totalPassenger * 1.10; +// increasePriceAndRestartSearch(newPrice); +// }, +// ), +// ], +// ), +// barrierDismissible: false, +// ); +// } + +// /// دالة لتحديث السعر وإعادة بدء البحث +// Future increasePriceAndRestartSearch(double newPrice) async { +// totalPassenger = newPrice; +// update(); + +// // await CRUD().post(link: AppLink.updateRides, payload: { +// // "id": rideId, +// // "price": newPrice.toStringAsFixed(2), +// // }); +// CRUD().post(link: "${AppLink.server}/ride/rides/update.php", payload: { +// "id": rideId, +// "price": newPrice.toStringAsFixed(2), +// }); + +// // تصفير القائمة لأن السعر تغير، ويجب إبلاغ الجميع (حتى من وصله الإشعار سابقاً) +// Log.print( +// '[increasePrice] Price changed. Clearing notified list to resend.'); +// notifiedDrivers.clear(); + +// _searchStartTime = DateTime.now(); +// _currentSearchPhase = 0; + +// isSearchingWindow = true; +// update(); + +// _startMasterTimer(); +// } + +// /// (دالة جديدة موحدة) +// /// هذه هي الدالة الوحيدة المسؤولة عن بدء عملية قبول الرحلة. +// /// يتم استدعاؤها إما من إشعار Firebase أو من البحث الدوري (Polling). +// /// هي تحتوي على "حارس البوابة" لمنع تضارب السباق. +// /// (دالة موحدة وصارمة) +// /// تستدعى من FCM أو من Polling عند اكتشاف قبول السائق +// /// تمنع تضارب السباق وتضمن تنفيذ المنطق مرة واحدة فقط +// /// متغير لمنع التكرار (Race Condition Guard) + +// Future driverArrivePassengerDialoge() { +// return Get.defaultDialog( +// barrierDismissible: false, +// title: 'Hi ,I Arrive your site'.tr, +// titleStyle: AppStyle.title, +// middleText: 'Please go to Car Driver'.tr, +// middleTextStyle: AppStyle.title, +// confirm: MyElevatedButton( +// title: 'Ok I will go now.'.tr, +// onPressed: () { +// NotificationService.sendNotification( +// target: driverToken.toString(), +// title: 'Hi ,I will go now'.tr, +// body: 'I will go now'.tr, +// isTopic: false, // Important: this is a token +// tone: 'ding', +// driverList: [], +// category: 'Hi ,I will go now', +// ); + +// Get.back(); +// remainingTime = 0; +// update(); +// })); +// } + +// /// (دالة خاصة جديدة) +// /// تحتوي على كل المنطق الفعلي لبدء الرحلة. +// /// +// Timer? _waitPassengerTimer; +// static const int _waitPassengerTotalSeconds = 300; +// int _waitPassengerElapsedSeconds = 0; + +// /// **إيقاف عداد انتظار الراكب (Stop Wait Timer)** +// /// +// /// تقوم هذه الدالة بإلغاء التايمر النشط فوراً لتحرير الموارد ومنع تسريب الذاكرة. +// /// +// /// * [resetUI]: (اختياري) عند وضعه `true`، يتم تصفير العدادات وتحديث الواجهة لإخفاء التوقيت القديم. +// void _stopWaitPassengerTimer({bool resetUI = false}) { +// // 1. الإلغاء الآمن للتايمر (Safe Cancellation) +// _waitPassengerTimer?.cancel(); +// _waitPassengerTimer = null; + +// // 2. تصفير قيم الواجهة (Reset State) +// if (resetUI) { +// progressTimerDriverWaitPassenger5Minute = 0.0; +// remainingTimeDriverWaitPassenger5Minute = 0; +// stringRemainingTimeDriverWaitPassenger5Minute = '00:00'; + +// // ✅ تحديث الواجهة فوراً (GetX) +// update(); +// } +// } + +// void _executeBeginRideLogic() { +// Log.print('[executeBeginRideLogic] تنفيذ منطق بدء الرحلة...'); +// _stopWaitPassengerTimer(resetUI: true); // <-- إضافة + +// // 1. تصفير كل عدادات ما قبل الرحلة +// timeToPassengerFromDriverAfterApplied = 0; +// remainingTime = 0; +// remainingTimeToPassengerFromDriverAfterApplied = 0; +// remainingTimeDriverWaitPassenger5Minute = 0; + +// // 2. تحديث الحالة والواجهة +// rideTimerBegin = true; +// statusRide = 'Begin'; +// isDriverInPassengerWay = false; +// isDriverArrivePassenger = false; // لإخفاء واجهة "السائق وصل" + +// // 3. (من كود الإشعار الخاص بك) +// box.write(BoxName.passengerWalletTotal, '0'); +// update(); // تحديث الواجهة قبل بدء المؤقتات + +// // 4. بدء مؤقتات الرحلة الفعلية +// rideIsBeginPassengerTimer(); // مؤقت عداد مدة الرحلة +// // runWhenRideIsBegin(); // مؤقت تتبع موقع السائق أثناء الرحلة + +// // 5. إشعار الراكب (من كود الإشعار الخاص بك) +// NotificationController().showNotification( +// 'Trip is Begin'.tr, +// 'The trip has started! Feel free to contact emergency numbers, share your trip, or activate voice recording for the journey' +// .tr, +// 'start'); +// } + +// // متغير لمنع التكرار +// bool _isRideStartedProcessed = false; + +// /// **معالجة بدء الرحلة الموحدة (Unified Ride Start Handler)** +// /// +// /// تستدعى عند استلام حدث بدء الرحلة سواء من السوكيت أو FCM. +// /// تضمن انتقال التطبيق لحالة [RideState.inProgress] مرة واحدة فقط. +// Future processRideBegin({String source = "Unknown"}) async { +// // منطقك الحالي +// if (currentRideState.value == RideState.inProgress || +// _isRideStartedProcessed) { +// return; +// } + +// _isRideStartedProcessed = true; +// currentRideState.value = RideState.inProgress; +// statusRide = 'Begin'; + +// // إيقاف مؤقت الانتظار +// remainingTimeDriverWaitPassenger5Minute = 0; +// _stopWaitPassengerTimer(); + +// // 1) بيانات السائق والرحلة +// rideIsBeginPassengerTimer(); +// update(); +// } + +// late Duration durationToAdd; +// late DateTime newTime = DateTime.now(); +// int hours = 0; +// int minutes = 0; + +// // --- إضافة جديدة: للوصول إلى وحدة التحكم بالروابط --- +// final DeepLinkController _deepLinkController = +// Get.isRegistered() +// ? Get.find() +// : Get.put(DeepLinkController()); +// // ------------------------------------------------ + +// void onChangedPassengerCount(int newValue) { +// selectedPassengerCount = newValue; +// update(); +// } + +// void onChangedPassengersChoose() { +// isPassengerChosen = true; +// update(); +// } + +// void getCurrentLocationFormString() async { +// currentLocationToFormPlaces = true; +// currentLocationString = 'Waiting for your location'.tr; +// await getLocation(); +// currentLocationString = passengerLocation.toString(); +// newStartPointLocation = passengerLocation; +// update(); +// } + +// List coordinatesWithoutEmpty = []; +// void getMapPointsForAllMethods() async { +// clearPolyline(); +// isMarkersShown = false; +// isWayPointStopsSheetUtilGetMap = false; +// isWayPointSheet = false; +// durationToRide = 0; +// distanceOfDestination = 0; +// wayPointSheetHeight = 0; +// remainingTime = 25; +// haveSteps = true; + +// // Filter out empty value +// coordinatesWithoutEmpty = +// placesCoordinate.where((coord) => coord.isNotEmpty).toList(); +// latestPosition = LatLng( +// double.parse(coordinatesWithoutEmpty.last.split(',')[0]), +// double.parse(coordinatesWithoutEmpty.last.split(',')[1])); +// for (var i = 0; i < coordinatesWithoutEmpty.length; i++) { +// if ((i + 1) < coordinatesWithoutEmpty.length) { +// await getMapPoints( +// coordinatesWithoutEmpty[i].toString(), +// coordinatesWithoutEmpty[i + 1].toString(), +// i, +// ); +// if (i == 0) { +// startNameAddress = data[0]['start_address']; +// } +// if (i == coordinatesWithoutEmpty.length) { +// endNameAddress = data[0]['end_address']; +// } +// } +// } + +// // isWayPointStopsSheet = false; +// if (haveSteps) { +// String latestWaypoint = +// placesCoordinate.lastWhere((coord) => coord.isNotEmpty); +// latestPosition = LatLng( +// double.parse(latestWaypoint.split(',')[0]), +// double.parse(latestWaypoint.split(',')[1]), +// ); +// } +// updateCameraForDistanceAfterGetMap(); +// changeWayPointStopsSheet(); +// bottomSheet(); +// showBottomSheet1(); + +// update(); +// } + +// void convertHintTextPlaces(int index, var res) { +// if (placeListResponseAll[index].isEmpty) { +// placeListResponseAll[index] = res; +// hintTextwayPointStringAll[index] = 'Search for your Start point'.tr; +// update(); +// } else { +// hintTextwayPointStringAll[index] = res['name']; +// currentLocationStringAll[index] = res['name']; +// placesCoordinate[index] = +// '${res['geometry']['location']['lat']},${res['geometry']['location']['lng']}'; +// placeListResponseAll[index] = []; +// allTextEditingPlaces[index].clear(); +// // double lat = wayPoint0[index]['geometry']['location']['lat']; +// // double lng = wayPoint0[index]['geometry']['location']['lng']; +// // newPointLocation0 = LatLng(lat, lng); +// update(); +// Get.back(); +// } +// } + +// void convertHintTextDestinationNewPlaces(int index) { +// if (placesDestination.isEmpty) { +// hintTextDestinationPoint = 'Search for your destination'.tr; +// update(); +// } else { +// var res = placesDestination[index]; +// hintTextDestinationPoint = res['displayName']?['text'] ?? +// res['formattedAddress'] ?? +// 'Unknown Place'; +// double? lat = res['location']?['latitude']; +// double? lng = res['location']?['longitude']; + +// if (lat != null && lng != null) { +// newMyLocation = LatLng(lat, lng); +// // 🔥 الحل: تحريك الكاميرا فوراً للهدف حتى لا يتم مسحه عند إغلاق الكيبورد 🔥 +// mapController +// ?.animateCamera(CameraUpdate.newLatLngZoom(newMyLocation, 16)); +// } +// update(); +// } +// } + +// void convertHintTextDestinationNewPlacesFromRecent( +// List recentLocations, int index) { +// hintTextDestinationPoint = recentLocations[index]['name']; +// double lat = recentLocations[index]['latitude']; +// double lng = recentLocations[index]['longitude']; +// newMyLocation = LatLng(lat, lng); + +// // 🔥 تحريك الكاميرا فوراً 🔥 +// mapController?.animateCamera(CameraUpdate.newLatLngZoom(newMyLocation, 16)); +// update(); +// } + +// // final mainBottomMenuMap = GlobalKey(); +// void changeBottomSheetShown({bool? forceValue}) { +// if (forceValue != null) { +// isBottomSheetShown = forceValue; +// } else { +// isBottomSheetShown = !isBottomSheetShown; +// } + +// heightBottomSheetShown = isBottomSheetShown == true ? 250 : 0; +// update(); +// } + +// void changeCashConfirmPageShown() { +// isCashConfirmPageShown = !isCashConfirmPageShown; +// isCashSelectedBeforeConfirmRide = true; +// cashConfirmPageShown = isCashConfirmPageShown == true ? 250 : 0; +// // to get or sure picker point for origin //todo +// // isPickerShown = true; +// // clickPointPosition(); +// update(); +// } + +// void changePaymentMethodPageShown() { +// isPaymentMethodPageShown = !isPaymentMethodPageShown; +// paymentPageShown = isPaymentMethodPageShown == true ? Get.height * .6 : 0; +// update(); +// } + +// void changeMapType() { +// mapType = !mapType; +// // heightButtomSheetShown = isButtomSheetShown == true ? 240 : 0; +// update(); +// } + +// void changeMapTraffic() { +// mapTrafficON = !mapTrafficON; +// update(); +// } + +// void changeisAnotherOreder(bool val) { +// isAnotherOreder = val; +// update(); +// } + +// void changeIsWhatsAppOrder(bool val) { +// isWhatsAppOrder = val; +// update(); +// } + +// void sendSMS(String to) async { +// // Get the driver's phone number. +// String driverPhone = +// (dataCarsLocationByPassenger['message'][carsOrder]['phone'].toString()); + +// // Format the message. +// String message = +// 'Hi! This is ${(box.read(BoxName.name).toString().split(' ')[0]).toString()}.\n I am using ${box.read(AppInformation.appName)} to ride with $passengerName as the driver. $passengerName \nis driving a $model\n with license plate $licensePlate.\n I am currently located at $passengerLocation.\n If you need to reach me, please contact the driver directly at\n\n $driverPhone.'; + +// // Launch the URL to send the SMS. +// launchCommunication('sms', to, message); +// } + +// String formatSyrianPhone(String phone) { +// // Remove spaces and + +// phone = phone.replaceAll(' ', '').replaceAll('+', ''); + +// // If starts with 00963 → remove 00 → 963 +// if (phone.startsWith('00963')) { +// phone = phone.replaceFirst('00963', '963'); +// } + +// // If starts with 0963 (common mistake) → fix it +// if (phone.startsWith('0963')) { +// phone = phone.replaceFirst('0963', '963'); +// } + +// // If starts with 963 (already correct) +// if (phone.startsWith('963')) { +// return phone; // nothing to do +// } + +// // If starts with 09 → remove leading 0 → add 963 +// if (phone.startsWith('09')) { +// return '963' + phone.substring(1); // 9xxxxxxxxx +// } + +// // If starts with 9xxxxxxxxx (no country code) +// if (phone.startsWith('9') && phone.length == 9) { +// return '963' + phone; +// } + +// // Otherwise return raw phone +// return phone; +// } + +// void sendWhatsapp(String to) async { +// // Normalize phone number before sending +// String formattedPhone = formatSyrianPhone(to); + +// // Message body +// String message = +// '${'${'Hi! This is'.tr} ${(box.read(BoxName.name).toString().split(' ')[0]).toString()}.\n${' I am using'.tr}'} ${AppInformation.appName}${' to ride with'.tr} $passengerName${' as the driver.'.tr} $passengerName \n${'is driving a '.tr}$model\n${' with license plate '.tr}$licensePlate.\n${' I am currently located at '.tr} https://www.google.com/maps/place/${passengerLocation.latitude},${passengerLocation.longitude}.\n${' If you need to reach me, please contact the driver directly at'.tr}\n\n $driverPhone.'; + +// // Send WhatsApp message +// launchCommunication('whatsapp', formattedPhone, message); +// } + +// void changeCancelRidePageShow() { +// showCancelRideBottomSheet(); +// isCancelRidePageShown = !isCancelRidePageShown; +// // : cancelRide(); +// update(); +// } + +// void getDrawerMenu() { +// heightMenuBool = !heightMenuBool; +// widthMapTypeAndTraffic = heightMenuBool == true ? 0 : 50; +// heightMenu = heightMenuBool == true ? 80 : 0; +// widthMenu = heightMenuBool == true ? 110 : 0; +// update(); +// } + +// calcualateDistsanceInMetet(LatLng prev, current) async { +// double distance2 = Geolocator.distanceBetween( +// prev.latitude, +// prev.longitude, +// current.latitude, +// current.longitude, +// ); +// return distance2; +// } + +// StreamController _timerStreamController = StreamController(); +// Stream get timerStream => _timerStreamController.stream; +// bool isTimerFromDriverToPassengerAfterAppliedRunning = true; +// bool isTimerRunning = false; // Flag to track if the timer is running +// int beginRideInterval = 10; // Interval in seconds for getBeginRideFromDriver + +// void startTimerFromDriverToPassengerAfterApplied() { +// stopTimerFromDriverToPassengerAfterApplied(); +// if (isTimerRunning) return; +// isTimerRunning = true; +// isTimerFromDriverToPassengerAfterAppliedRunning = true; + +// int secondsElapsed = 0; + +// // استدعاء فوري لأول مرة +// // getDriverCarsLocationToPassengerAfterApplied(); + +// Timer.periodic(const Duration(seconds: 1), (timer) { +// // --- التغيير الجوهري هنا --- +// // شرط الإيقاف: نتوقف فقط إذا انتهت الرحلة أو ألغيت، أو تم إيقاف التايمر يدوياً +// // لم نعد نعتمد على تجاوز الوقت المقدر (timeToPassenger) كشرط للإيقاف +// bool isRideActive = (statusRide == 'Apply' || +// statusRide == 'Arrived' || +// statusRide == 'Begin' || +// currentRideState.value == RideState.driverApplied || +// currentRideState.value == RideState.driverArrived || +// currentRideState.value == RideState.inProgress); + +// if (!isRideActive || !isTimerFromDriverToPassengerAfterAppliedRunning) { +// timer.cancel(); +// isTimerRunning = false; +// if (!_timerStreamController.isClosed) { +// _timerStreamController.close(); +// } +// return; +// } + +// secondsElapsed++; +// if (!_timerStreamController.isClosed) { +// _timerStreamController.add(secondsElapsed); +// } + +// // تحديث الواجهة للوقت المتبقي (شكلياً فقط للراكب) +// // حتى لو أصبح الوقت سالباً (تأخر السائق)، سنظهره كـ 00:00 أو نتركه سالباً +// remainingTimeToPassengerFromDriverAfterApplied = +// timeToPassengerFromDriverAfterApplied - secondsElapsed; + +// if (remainingTimeToPassengerFromDriverAfterApplied < 0) { +// remainingTimeToPassengerFromDriverAfterApplied = 0; +// } + +// int minutes = +// (remainingTimeToPassengerFromDriverAfterApplied / 60).floor(); +// int seconds = remainingTimeToPassengerFromDriverAfterApplied % 60; +// stringRemainingTimeToPassenger = +// '$minutes:${seconds.toString().padLeft(2, '0')}'; +// // تحويل الوقت أو المسافة إلى نسبة من 0.0 إلى 1.0 +// double currentProgress = 1 - +// (remainingTimeToPassengerFromDriverAfterApplied / +// timeToPassengerFromDriverAfterApplied); + +// // 🔴 التعديل هنا: نحدث الآيفون كل 5 ثواني فقط للحفاظ على البطارية وتجنب حظر أبل +// if (secondsElapsed % 5 == 0) { +// double currentProgress = 1 - +// (remainingTimeToPassengerFromDriverAfterApplied / +// (timeToPassengerFromDriverAfterApplied == 0 +// ? 1 +// : timeToPassengerFromDriverAfterApplied)); + +// IosLiveActivityService.updateRideActivity( +// status: 'waiting', +// driverName: driverName ?? 'السائق', +// carDetails: +// '$make • $model • $carColor', // من الأفضل إظهار اللون أيضاً +// etaText: stringRemainingTimeToPassenger, +// progress: currentProgress.clamp(0.0, 1.0), +// ); +// } +// // جلب موقع السائق كل 4 ثواني (Polling) ما دامت الرحلة نشطة +// if (secondsElapsed % beginRideInterval == 0) { +// // 2. تحديث موقع الراكب للسائق +// uploadPassengerLocation(); +// } else { +// update(); +// } +// }); +// } + +// // Function to stop the timer +// void stopTimerFromDriverToPassengerAfterApplied() { +// isTimerFromDriverToPassengerAfterAppliedRunning = false; +// update(); +// } + +// void startTimerDriverWaitPassenger5Minute() { +// // لا تبدأ إلا إذا فعلاً وصلنا +// if (currentRideState.value != RideState.driverArrived) return; + +// // 1) أوقف أي عداد سابق (تتبع وصول السائق) +// stopTimerFromDriverToPassengerAfterApplied(); +// isTimerRunning = false; + +// // 2) أوقف عداد الانتظار إن كان شغال من قبل (منع تكرار) +// _stopWaitPassengerTimer(); + +// // 3) جهّز UI الانتظار +// isDriverArrivePassenger = true; +// isDriverInPassengerWay = false; +// timeToPassengerFromDriverAfterApplied = 0; + +// _waitPassengerElapsedSeconds = 0; +// remainingTimeDriverWaitPassenger5Minute = _waitPassengerTotalSeconds; +// progressTimerDriverWaitPassenger5Minute = 0; + +// int m = (remainingTimeDriverWaitPassenger5Minute / 60).floor(); +// int s = remainingTimeDriverWaitPassenger5Minute % 60; +// stringRemainingTimeDriverWaitPassenger5Minute = +// '$m:${s.toString().padLeft(2, '0')}'; + +// update(); + +// // 4) ابدأ Timer.periodic (يمكن إلغاؤه فوراً) +// _waitPassengerTimer = Timer.periodic(const Duration(seconds: 1), (t) { +// // أول ما تتحول إلى inProgress (أو أي حالة غير arrived) أوقف فوراً +// if (currentRideState.value != RideState.driverArrived) { +// _stopWaitPassengerTimer(resetUI: true); +// // إخفاء واجهة "السائق وصل" إذا بدأت الرحلة +// if (currentRideState.value == RideState.inProgress) { +// isDriverArrivePassenger = false; +// } +// update(); +// return; +// } + +// _waitPassengerElapsedSeconds++; +// int remaining = _waitPassengerTotalSeconds - _waitPassengerElapsedSeconds; +// if (remaining < 0) remaining = 0; + +// remainingTimeDriverWaitPassenger5Minute = remaining; +// progressTimerDriverWaitPassenger5Minute = +// _waitPassengerElapsedSeconds / _waitPassengerTotalSeconds; + +// int minutes = (remaining / 60).floor(); +// int seconds = remaining % 60; +// stringRemainingTimeDriverWaitPassenger5Minute = +// '$minutes:${seconds.toString().padLeft(2, '0')}'; + +// update(); + +// if (remaining == 0) { +// _stopWaitPassengerTimer(); +// // هنا إذا بدك: طبّق غرامة انتظار / اعرض رسالة / إلخ +// } +// }); +// } + +// // Create a StreamController to manage the timer values +// final timerController = StreamController(); + +// // Start the timer when the ride begins +// void beginRideTimer() { +// // Set up the timer to run every second +// Timer.periodic(const Duration(seconds: 1), (timer) { +// // Update the timer value and notify listeners +// timerController.add(timer.tick); +// update(); +// }); +// } + +// // Stop the timer when the ride ends +// void stopRideTimer() { +// timerController.close(); +// update(); +// } + +// Timer? _rideProgressTimer; +// bool _hasShownSpeedWarning = false; // متغير لحالة التنبيه + +// /// **بدء مؤقت الرحلة للراكب (Passenger Ride Timer)** +// /// +// /// تقوم هذه الدالة بإدارة العداد الزمني للرحلة بمجرد بدئها (حالة [RideState.inProgress]). +// /// +// /// **المهام الرئيسية:** +// /// 1. **دقة التوقيت:** تعتمد على فرق الوقت الحقيقي (`DateTime.difference`) لضمان دقة العداد حتى لو خرج المستخدم من التطبيق وعاد. +// /// 2. **مراقبة السرعة:** تفحص سرعة المركبة كل ثانية، وتطلق تحذيراً [_triggerSpeedWarning] إذا تجاوزت 100 كم/س. +// /// 3. **تحديث الواجهة:** تقوم بتحديث شريط التقدم والوقت المتبقي لحظياً. +// /// 4. **الإيقاف التلقائي:** تتوقف تلقائياً عند انتهاء الوقت أو تغير حالة الرحلة. +// void rideIsBeginPassengerTimer() { +// // 1. تنظيف أي تايمر سابق +// _rideProgressTimer?.cancel(); +// _hasShownSpeedWarning = false; // تصفير حالة التنبيه + +// // 2. تحديد وقت الوصول المتوقع بدقة +// DateTime now = DateTime.now(); +// DateTime expectedArrivalTime = now.add(Duration(seconds: durationToRide)); + +// // تنسيق وقت الوصول للعرض +// var arrivalTime = DateFormat('hh:mm a').format(expectedArrivalTime); +// box.write(BoxName.arrivalTime, arrivalTime); + +// Log.print("⏳ Ride Timer Started. Duration: $durationToRide sec"); + +// // 3. بدء التايمر الدوري +// _rideProgressTimer = +// Timer.periodic(const Duration(seconds: 1), (timer) async { +// // أ) شرط الإيقاف الحاسم: إذا انتهت الرحلة أو ألغيت +// if (currentRideState.value != RideState.inProgress) { +// timer.cancel(); +// return; +// } + +// // ب) حساب الوقت المتبقي بناءً على الساعة الحالية (أدق من العد) +// DateTime currentNow = DateTime.now(); +// int remainingSeconds = +// expectedArrivalTime.difference(currentNow).inSeconds; + +// if (remainingSeconds < 0) remainingSeconds = 0; + +// // تحديث المتغيرات +// remainingTimeTimerRideBegin = remainingSeconds; + +// // حساب النسبة المئوية (حماية من القسمة على صفر) +// progressTimerRideBegin = +// durationToRide > 0 ? 1 - (remainingSeconds / durationToRide) : 1.0; + +// // ج) تنسيق الوقت للعرض +// int minutes = (remainingSeconds / 60).floor(); +// int seconds = remainingSeconds % 60; +// stringRemainingTimeRideBegin = +// '$minutes:${seconds.toString().padLeft(2, '0')}'; + +// // نحول progressTimerRideBegin (0..1) إلى نسبة (0..100) +// final percent = (progressTimerRideBegin * 100).clamp(0, 100).toInt(); + +// // ============================================================== +// // 🔔 د) تحديث الإشعارات (هنا تم حل مشكلة الإزعاج) +// // ============================================================== + +// // 1. تحديث الآيفون (Live Activity): يمكن تحديثه كل 5 ثواني لأنه "تحديث صامت" للشاشة فقط ولا يصدر صوتاً +// if (remainingSeconds % 5 == 0 || remainingSeconds == 0) { +// IosLiveActivityService.updateRideActivity( +// status: 'ongoing', // ['waiting', 'ongoing'] +// driverName: driverName ?? '', +// carDetails: '$make • $model • $carColor', +// etaText: stringRemainingTimeRideBegin, +// progress: progressTimerRideBegin.clamp(0.0, 1.0), +// ); +// } + +// // 2. تحديث إشعار الهاتف العادي (RideLiveNotification): +// // نحدثه كل دقيقة (60 ثانية) بدلاً من 5 ثواني حتى لا يزعج الراكب بالرنين المستمر! +// if (remainingSeconds % 60 == 0 || remainingSeconds == 0) { +// await RideLiveNotification.showTripInProgress( +// percentage: percent, +// etaText: stringRemainingTimeRideBegin, +// ); +// } +// // ============================================================== + +// // هـ) منطق الإشعارات لمنتصف الرحلة (يصدر تنبيه مرة واحدة فقط) +// if (progressTimerRideBegin >= 0.25 && +// progressTimerRideBegin < 0.26 && +// !_hasShownSpeedWarning) { +// // يمكن إضافة منطق إشعار منتصف الرحلة هنا +// } + +// // و) مراقبة السرعة (Speed Check) +// if (speed > 100 && !_hasShownSpeedWarning) { +// _hasShownSpeedWarning = true; // ✅ قفل التنبيه حتى لا يتكرر +// _triggerSpeedWarning(); +// } + +// // إعادة تفعيل التنبيه إذا انخفضت السرعة (إعادة ضبط الأمان) +// if (speed < 80 && _hasShownSpeedWarning) { +// _hasShownSpeedWarning = false; +// } + +// // ز) إنهاء التايمر إذا انتهى الوقت +// if (remainingSeconds <= 0) { +// timer.cancel(); +// } + +// update(); +// }); +// } + +// /// **عرض تحذير السرعة الزائدة (Speed Warning Trigger)** +// /// +// /// تظهر نافذة منبثقة (Dialog) وإشعاراً محلياً لتحذير الراكب عند اكتشاف سرعة عالية (> 100 كم/س). +// /// +// /// **الخيارات المتاحة للمستخدم:** +// /// * **مشاركة التفاصيل:** لإرسال رسالة استغاثة عبر واتساب. +// /// * **أنا بخير:** لإغلاق التنبيه والاستمرار في الرحلة. +// void _triggerSpeedWarning() { +// NotificationController().showNotification("Warning: Speeding detected!".tr, +// 'You can call or record audio of this trip'.tr, 'tone1'); + +// Get.defaultDialog( +// barrierDismissible: false, +// title: "Warning: Speeding detected!".tr, +// titleStyle: AppStyle.title.copyWith(color: AppColor.redColor), +// content: Column( +// children: [ +// Icon(Icons.speed, size: 50, color: AppColor.redColor), +// const SizedBox(height: 10), +// Text( +// "We noticed the speed is exceeding 100 km/h. Please slow down for your safety..." +// .tr, +// textAlign: TextAlign.center, +// style: AppStyle.title, +// ), +// ], +// ), +// confirm: MyElevatedButton( +// title: "Share Trip Details".tr, +// kolor: AppColor.redColor, +// onPressed: () { +// Get.back(); +// _shareTripDetailsSOS(); +// }, +// ), +// cancel: MyElevatedButton( +// title: "I'm Safe".tr, +// kolor: AppColor.greenColor, +// onPressed: () { +// Get.back(); +// }, +// ), +// ); +// } + +// /// **تفعيل وضع الطوارئ للمركبة (sosPassenger)** +// /// +// /// تقوم بإظهار حوار تأكيدي للمستخدم لسؤاله عما إذا كان يرغب في إرسال +// /// إشارة استغاثة عبر واتساب. +// void sosPassenger() { +// Get.defaultDialog( +// barrierDismissible: false, +// title: "Emergency SOS".tr, +// titleStyle: AppStyle.title.copyWith(color: AppColor.redColor), +// content: Column( +// children: [ +// Icon(Icons.warning_amber_rounded, size: 50, color: AppColor.redColor), +// const SizedBox(height: 10), +// Text( +// "Do you want to send an emergency message to your SOS contact?".tr, +// textAlign: TextAlign.center, +// style: AppStyle.title, +// ), +// ], +// ), +// confirm: MyElevatedButton( +// title: "Send SOS".tr, +// kolor: AppColor.redColor, +// onPressed: () { +// Get.back(); +// _shareTripDetailsSOS(); +// }, +// ), +// cancel: MyElevatedButton( +// title: "I'm Safe".tr, +// kolor: AppColor.greenColor, +// onPressed: () { +// Get.back(); +// }, +// ), +// ); +// } + +// /// **مشاركة تفاصيل الرحلة للطوارئ (SOS Share)** +// /// +// /// تقوم بتجهيز رسالة نصية مفصلة تحتوي على بيانات الرحلة الحالية وإرسالها +// /// عبر تطبيق WhatsApp لرقم الطوارئ المحفوظ. +// /// +// /// **البيانات المرسلة:** +// /// * موقع الانطلاق والوصول. +// /// * اسم السائق، رقم الهاتف، ونوع السيارة. +// /// * رابط مباشر للموقع الحالي على خرائط جوجل. +// void _shareTripDetailsSOS() { +// String message = "**Emergency SOS from Passenger:**\n"; +// String origin = startNameAddress; +// String destination = endNameAddress; + +// message += "* ${'Origin'.tr}: $origin\n"; +// message += "* ${'Destination'.tr}: $destination\n"; +// message += "* ${'Driver Name'.tr}: $driverName\n"; +// message += "* ${'Car'.tr}: $make - $model - $licensePlate\n"; +// message += "* ${'Phone'.tr}: $driverPhone\n\n"; + +// // رابط جوجل مابس صحيح +// message += +// "${'Location'.tr}: https://www.google.com/maps/search/?api=1&query=${passengerLocation.latitude},${passengerLocation.longitude}\n"; +// message += "Please help! Contact me as soon as possible.".tr; + +// launchCommunication( +// 'whatsapp', box.read(BoxName.sosPhonePassenger), message); +// } + +// int progressTimerRideBeginVip = 0; +// int elapsedTimeInSeconds = 0; // Timer starts from 0 +// String stringElapsedTimeRideBegin = '0:00'; +// String stringElapsedTimeRideBeginVip = '0:00'; +// bool rideInProgress = true; // To control when to stop the timer + +// void rideIsBeginPassengerTimerVIP() async { +// rideInProgress = true; // Start the ride timer +// bool sendSOS = false; +// while (rideInProgress) { +// await Future.delayed(const Duration(seconds: 1)); + +// // Increment elapsed time +// elapsedTimeInSeconds++; + +// // Update the time display +// int minutes = (elapsedTimeInSeconds / 60).floor(); +// int seconds = elapsedTimeInSeconds % 60; +// stringElapsedTimeRideBeginVip = +// '$minutes:${seconds.toString().padLeft(2, '0')}'; + +// // Check for speed and SOS conditions +// if (speed > 100 && !sendSOS) { +// Get.defaultDialog( +// barrierDismissible: false, +// title: "Warning: Speeding detected!".tr, +// titleStyle: AppStyle.title, +// content: Text( +// "We noticed the speed is exceeding 100 km/h. Please slow down for your safety. If you feel unsafe, you can share your trip details with a contact or call the police using the red SOS button." +// .tr, +// style: AppStyle.title, +// ), +// confirm: MyElevatedButton( +// title: "Share Trip Details".tr, +// onPressed: () { +// Get.back(); +// // Implement sharing trip details logic here +// String message = "**Emergency SOS from Passenger:**\n"; + +// // Get trip details from GetX or relevant provider +// String origin = passengerLocation.toString(); +// String destination = myDestination.toString(); +// String driverName = passengerName; +// String driverCarPlate = licensePlate; + +// // Add trip details to the message +// message += "* ${'Origin'.tr}: $origin\n"; +// message += "* ${'Destination'.tr}: $destination\n"; +// message += "* ${'Driver Name'.tr}: $driverName\n"; +// message += "* ${'Driver Car Plate'.tr}: $driverCarPlate\n\n"; +// message += "* ${'Driver Phone'.tr}: $driverPhone\n\n"; + +// // Add current location +// message += +// "${'Current Location'.tr}:https://www.google.com/maps/place/${passengerLocation.latitude},${passengerLocation.longitude} \n"; + +// // Append a call to action +// message += "Please help! Contact me as soon as possible.".tr; + +// // Launch WhatsApp communication +// launchCommunication( +// 'whatsapp', box.read(BoxName.sosPhonePassenger), message); +// sendSOS = true; +// }, +// kolor: AppColor.redColor, +// ), +// cancel: MyElevatedButton( +// title: "Cancel".tr, +// onPressed: () { +// Get.back(); +// }, +// kolor: AppColor.greenColor, +// ), +// ); +// } + +// // Update the UI +// update(); +// } +// } + +// Future tripFinishedFromDriver() async { +// Log.print('🧹 Cleaning UI for Finish'); + +// // إغلاق أي ديالوج مفتوح +// if (Get.isDialogOpen == true) Get.back(); +// if (Get.isBottomSheetOpen == true) Get.back(); + +// statusRide = 'Finished'; +// currentRideState.value = RideState.finished; // تثبيت الحالة + +// // إيقاف البحث والعدادات +// isSearchingWindow = false; +// rideTimerBegin = false; +// shouldFetch = false; + +// // إيقاف التايمرات +// stopAllTimers(); +// resetAllMapStates(); +// clearPolyline(); +// clearMarkersExceptStartEnd(); +// markers.clear(); + +// update(); +// } + +// StreamController _beginRideStreamController = +// StreamController.broadcast(); +// Stream get beginRideStream => _beginRideStreamController.stream; + +// bool isBeginRideFromDriverRunning = false; + +// // Call this method to listen to the stream +// void listenToBeginRideStream() { +// beginRideStream.listen((status) { +// Log.print("Ride status: $status"); +// // Perform additional actions based on the status +// }, onError: (error) { +// Log.print("Error in Begin Ride Stream: $error"); +// }); +// } + +// begiVIPTripFromPassenger() async { +// timeToPassengerFromDriverAfterApplied = 0; +// remainingTime = 0; +// isBottomSheetShown = false; +// remainingTimeToPassengerFromDriverAfterApplied = 0; +// remainingTimeDriverWaitPassenger5Minute = 0; +// rideTimerBegin = true; +// statusRideVip = 'Begin'; +// isDriverInPassengerWay = false; +// isDriverArrivePassenger = false; +// update(); +// // isCancelRidePageShown = true; +// rideIsBeginPassengerTimerVIP(); +// runWhenRideIsBegin(); +// } + +// Map rideStatusFromStartApp = {}; +// bool isStartAppHasRide = false; +// getRideStatusFromStartApp() async { +// try { +// var res = await CRUD().get( +// link: AppLink.getRideStatusFromStartApp, +// payload: {'passenger_id': box.read(BoxName.passengerID)}); +// // Log.print(res); +// Log.print('rideStatusFromStartApp: $res'); +// // Log.print('1070'); +// if (res == 'failure') { +// rideStatusFromStartApp = { +// 'data': {'status': 'NoRide', 'needsReview': false} +// }; +// isStartAppHasRide = false; +// Log.print( +// "No rides found for the given passenger ID within the last hour."); +// } else { +// var decoded = jsonDecode(res); +// if (decoded['status'] == 'failure') { +// rideStatusFromStartApp = { +// 'data': {'status': 'NoRide', 'needsReview': false} +// }; +// isStartAppHasRide = false; +// } else { +// rideStatusFromStartApp = decoded; +// } +// } +// if (rideStatusFromStartApp['data']['status'] == 'Begin' || +// rideStatusFromStartApp['data']['status'] == 'Apply' || +// rideStatusFromStartApp['data']['status'] == 'Applied') { +// statusRide = rideStatusFromStartApp['data']['status']; +// isStartAppHasRide = true; +// RideState.inProgress; +// driverId = rideStatusFromStartApp['data']['driver_id']; +// passengerName = rideStatusFromStartApp['data']['driverName']; +// driverRate = rideStatusFromStartApp['data']['rateDriver'].toString(); +// statusRideFromStart = true; + +// update(); + +// Map tripData = +// box.read(BoxName.tripData) as Map; +// final String pointsString = tripData['polyline']; +// List decodedPoints = +// await compute(decodePolylineIsolate, pointsString); + +// // decodePolyline(response["routes"][0]["overview_polyline"]["points"]); +// for (int i = 0; i < decodedPoints.length; i++) { +// polylineCoordinates.add(decodedPoints[i]); +// } +// var polyline = Polyline( +// polylineId: const PolylineId('main_route'), +// points: polylineCoordinates, +// width: 6, +// color: const Color(0xFF2196F3), +// ); + +// polyLines = {...polyLines, polyline}; +// timeToPassengerFromDriverAfterApplied = 0; +// remainingTime = 0; +// remainingTimeToPassengerFromDriverAfterApplied = 0; +// remainingTimeDriverWaitPassenger5Minute = 0; +// rideTimerBegin = true; +// isDriverInPassengerWay = false; +// isDriverArrivePassenger = false; +// // update(); +// // isCancelRidePageShown = true; +// durationToAdd = tripData['distance_m']; +// rideIsBeginPassengerTimer(); +// runWhenRideIsBegin(); +// update(); +// } +// } catch (e) { +// // Handle the error or perform any necessary actions +// } +// } + +// void driverArrivePassenger() { +// timeToPassengerFromDriverAfterApplied = 0; +// remainingTime = 0; +// // isCancelRidePageShown = true; +// update(); +// rideIsBeginPassengerTimer(); +// // runWhenRideIsBegin(); +// } + +// void cancelTimerToPassengerFromDriverAfterApplied() { +// timerToPassengerFromDriverAfterApplied?.cancel(); +// } + +// void clearPlacesDestination() { +// placesDestination = []; +// hintTextDestinationPoint = 'Search for your destination'.tr; +// update(); +// } + +// void clearPlacesStart() { +// placesStart = []; +// hintTextStartPoint = 'Search for your Start point'.tr; +// update(); +// } + +// void clearPlaces(int index) { +// placeListResponseAll[index] = []; +// hintTextwayPointStringAll[index] = 'Search for waypoint'.tr; +// update(); +// } + +// int selectedReason = -1; +// String? cancelNote; +// void selectReason0(int index, String note) { +// selectedReason = index; +// cancelNote = note; +// update(); +// } + +// void getDialog(String title, String? midTitle, VoidCallback onPressed) { +// final textToSpeechController = Get.find(); +// Get.defaultDialog( +// title: title, +// titleStyle: AppStyle.title, +// middleTextStyle: AppStyle.title, +// content: Column( +// children: [ +// IconButton( +// onPressed: () async { +// await textToSpeechController.speakText(title ?? midTitle!); +// }, +// icon: const Icon(Icons.headphones)), +// Text( +// midTitle!, +// style: AppStyle.title, +// ) +// ], +// ), +// confirm: MyElevatedButton( +// title: 'Ok'.tr, +// onPressed: onPressed, +// kolor: AppColor.greenColor, +// ), +// cancel: MyElevatedButton( +// title: 'Cancel', +// kolor: AppColor.redColor, +// onPressed: () { +// Get.back(); +// })); +// } + +// Future?> extractCoordinatesFromLinkAsync( +// String link) async { +// try { +// // 1. معالجة روابط الخرائط المباشرة (geo: و google.navigation:) +// if (link.startsWith('geo:') || link.startsWith('google.navigation:')) { +// RegExp regex = RegExp(r'(-?\d+\.\d+)[,/~=](-?\d+\.\d+)'); +// var match = regex.firstMatch(link); +// if (match != null) { +// double lat = double.parse(match.group(1)!); +// double lng = double.parse(match.group(2)!); +// if (lat > 40 && lat > lng) { +// double temp = lat; +// lat = lng; +// lng = temp; +// } +// return {'latitude': lat, 'longitude': lng}; +// } +// } + +// // 2. معالجة الروابط العادية (http/https) +// int urlStartIndex = link.indexOf(RegExp(r'https?://')); +// if (urlStartIndex == -1) return null; +// String cleanLink = link.substring(urlStartIndex).trim(); + +// Uri uri = Uri.parse(cleanLink); +// String finalUrl = cleanLink; + +// // فك التوجيه للروابط المختصرة +// if (cleanLink.contains('goo.gl') || +// cleanLink.contains('maps.google.com')) { +// try { +// var response = +// await http.get(uri).timeout(const Duration(seconds: 5)); +// finalUrl = response.request?.url.toString() ?? cleanLink; +// } catch (e) { +// Log.print('Redirect logic failed, using original: $e'); +// } +// } + +// // الأنماط المشتركة لخرائط جوجل (تكون دائماً Lat ثم Lng) +// RegExp regex = RegExp(r'(-?\d+\.\d+)[,/~](-?\d+\.\d+)'); +// var match = regex.firstMatch(finalUrl); + +// if (match != null) { +// double lat = double.parse(match.group(1)!); +// double lng = double.parse(match.group(2)!); + +// // 🔥 منطق التصحيح الذاتي (Smart Swap) للمنطقة (سوريا/الأردن/مصر) +// // إذا كان الرقم الأول أكبر من الرقم الثاني بشكل واضح، فهذا يعني أن الرابط مقلوب أو أننا نحتاج للتأكد +// // في منطقتنا Latitude حوالي 30-35 و Longitude حوالي 36-44 +// if (lat > 40 && lat > lng) { +// Log.print("⚠️ Detected Swapped Coordinates in Link. Correcting..."); +// double temp = lat; +// lat = lng; +// lng = temp; +// } + +// return { +// 'latitude': lat, +// 'longitude': lng, +// }; +// } +// } catch (e) { +// Log.print('Error parsing location link: $e'); +// } +// return null; +// } + +// double latitudeWhatsApp = 0; +// double longitudeWhatsApp = 0; +// void handleWhatsAppLink(String link) async { +// Map? coordinates = +// await extractCoordinatesFromLinkAsync(link); + +// if (coordinates != null) { +// latitudeWhatsApp = coordinates['latitude']!; +// longitudeWhatsApp = coordinates['longitude']!; + +// Log.print( +// 'Extracted coordinates: Lat: $latitudeWhatsApp, Long: $longitudeWhatsApp'); +// // Use these coordinates in your app as needed +// } else { +// Log.print('Failed to extract coordinates from the link'); +// } +// } + +// void goToWhatappLocation() async { +// if (sosFormKey.currentState!.validate()) { +// // 1. استخراج الإحداثيات أولاً بشكل محلي لضمان عدم حدوث سباق بيانات (Race Condition) +// Map? coordinates = +// await extractCoordinatesFromLinkAsync(whatsAppLocationText.text); + +// if (coordinates != null) { +// latitudeWhatsApp = coordinates['latitude']!; +// longitudeWhatsApp = coordinates['longitude']!; + +// Log.print( +// '📍 Final Coordinates for OSM: Lat: $latitudeWhatsApp, Lng: $longitudeWhatsApp'); + +// changeIsWhatsAppOrder(true); +// Get.back(); + +// // إعداد الوجهة +// myDestination = LatLng(latitudeWhatsApp, longitudeWhatsApp); + +// // تحريك الكاميرا لموقع الراكب (البداية) وليس الوجهة فوراً لضمان تحميل الخريطة +// if (passengerLocation != null) { +// await mapController?.animateCamera(CameraUpdate.newLatLng( +// LatLng(passengerLocation.latitude, passengerLocation.longitude))); +// } + +// changeMainBottomMenuMap(); +// passengerStartLocationFromMap = true; +// isPickerShown = true; +// update(); +// } else { +// mySnackbarWarning('لم نتمكن من استخراج الموقع من الرابط'); +// } +// } +// } + +// int currentTimeSearchingCaptainWindow = 0; +// late String driverPhone = ''; +// late String driverRate = ''; +// late String passengerName = ''; +// late String carColor = ''; +// late String colorHex = ''; +// late String carYear = ''; +// late String model = ''; +// late String make = ''; +// late String licensePlate = ''; + +// String driverOrderStatus = 'yet'; +// bool isDriversTokensSend = false; + +// Set notifiedDrivers = {}; + +// /// [إضافة جديدة] +// /// دالة مخصصة لإضافة الرحلة إلى جدول الانتظار (waiting_ride) + +// Future _addRideToWaitingTable() async { +// try { +// await CRUD().post(link: AppLink.addWaitingRide, payload: { +// 'id': rideId.toString(), +// "start_location": +// '${startLocation.latitude},${startLocation.longitude}', +// "end_location": '${endLocation.latitude},${endLocation.longitude}', +// "date": DateTime.now().toString(), +// "time": DateTime.now().toString(), +// "price": totalPassenger.toStringAsFixed(2), +// 'passenger_id': box.read(BoxName.passengerID).toString(), +// 'status': 'waiting', // الحالة الرئيسية لجدول الانتظار +// 'carType': box.read(BoxName.carType), +// 'passengerRate': passengerRate.toStringAsFixed(2), +// 'price_for_passenger': totalME.toStringAsFixed(2), +// 'distance': distance.toStringAsFixed(1), +// 'duration': duration.toStringAsFixed(1), +// 'payment_method': +// Get.find().isWalletChecked ? 'wallet' : 'cash', +// "passenger_wallet": box.read(BoxName.passengerWalletTotal).toString(), +// }); +// Log.print('[WaitingTable] Ride $rideId added to waiting_ride table.'); +// } catch (e) { +// Log.print('Error adding ride to waiting_ride table: $e'); +// } +// } + +// String driversStatusForSearchWindow = ''; + +// bool isDriversDataValid() { +// return dataCarsLocationByPassenger != 'failure' && +// dataCarsLocationByPassenger != null && +// dataCarsLocationByPassenger.containsKey('message') && +// dataCarsLocationByPassenger['message'] != null; +// } + +// void showNoDriversDialog() { +// Get.dialog( +// BackdropFilter( +// filter: ImageFilter.blur(sigmaX: 5, sigmaY: 5), +// child: CupertinoAlertDialog( +// title: Text("No Car or Driver Found in your area.".tr, +// style: AppStyle.title +// .copyWith(fontSize: 20, fontWeight: FontWeight.bold)), +// content: Text("No Car or Driver Found in your area.".tr, +// style: AppStyle.title.copyWith(fontSize: 16)), +// actions: [ +// CupertinoDialogAction( +// onPressed: () { +// Get.back(); +// Get.offAll(() => const MapPagePassenger()); +// }, +// child: +// Text('OK'.tr, style: TextStyle(color: AppColor.greenColor)), +// ), +// ], +// ), +// ), +// barrierDismissible: false, +// ); +// } + +// Future postRideDetailsToServer() async { +// // التأكد من وجود مسار +// if (polylineCoordinates.isEmpty) return false; + +// startLocation = polylineCoordinates.first; +// endLocation = polylineCoordinates.last; + +// // تجهيز البيانات الكاملة (Data Enrichment) لإرسالها للـ PHP +// Map payload = { +// // 1. البيانات الأساسية +// "start_location": '${startLocation.latitude},${startLocation.longitude}', +// "end_location": '${endLocation.latitude},${endLocation.longitude}', +// "date": DateTime.now().toString(), +// "time": DateTime.now().toString(), +// "endtime": "00:00:00", // أو حسب حساباتك +// "price": totalPassenger.toStringAsFixed(2), +// "passenger_id": box.read(BoxName.passengerID).toString(), +// "driver_id": "0", // لم يحدد بعد +// "status": "waiting", +// "carType": box.read(BoxName.carType), +// "price_for_driver": totalPassenger.toString(), // أو المعادلة الخاصة بك +// "price_for_passenger": totalME.toString(), +// "distance": distance.toString(), + +// // 2. بيانات الراكب (ليستخدمها PHP لبناء الـ Payload دون استعلام) +// "passenger_name": box.read(BoxName.name).toString(), +// "passenger_phone": box.read(BoxName.phone).toString(), +// "passenger_token": box.read(BoxName.tokenFCM).toString(), +// "passenger_email": box.read(BoxName.email).toString(), +// "passenger_wallet": box.read(BoxName.passengerWalletTotal).toString(), +// "passenger_rating": (passengerRate ?? 5.0).toString(), + +// // 3. بيانات الواجهة الإضافية +// "start_name": startNameAddress, +// "end_name": endNameAddress, +// "duration_text": "${(durationToRide / 60).floor()}", // نص الوقت +// "distance_text": "$distance", // نص المسافة +// "is_wallet": Get.find().isWalletChecked.toString(), +// "has_steps": Get.find().wayPoints.length > 1 +// ? 'true' +// : 'false', + +// // نقاط التوقف (إذا وجدت) +// "step0": placesCoordinate.length > 0 ? placesCoordinate[0] : "", +// "step1": placesCoordinate.length > 1 ? placesCoordinate[1] : "", +// "step2": placesCoordinate.length > 2 ? placesCoordinate[2] : "", +// "step3": placesCoordinate.length > 3 ? placesCoordinate[3] : "", +// "step4": placesCoordinate.length > 4 ? placesCoordinate[4] : "", +// }; +// Log.print( +// '🏁 Ride Registration Detail: $startNameAddress -> $endNameAddress'); +// Log.print(' 📦 Payload: $payload'); + +// try { +// // الاتصال بـ add_ride.php +// var response = await CRUD().post( +// link: "${AppLink.server}/ride/rides/add_ride.php", // تأكد من المسار +// payload: payload); + +// var jsonResponse = (response is String) ? jsonDecode(response) : response; + +// if (jsonResponse['status'] == 'success') { +// rideId = jsonResponse['message'].toString(); // حفظ ID الرحلة +// Log.print("✅ Ride Created ID: $rideId"); +// return true; +// } else { +// Log.print("❌ Ride Creation Failed: $response"); +// return false; +// } +// } catch (e) { +// Log.print("❌ Exception in postRide: $e"); +// return false; +// } +// } + +// late LatLng endLocation; +// late LatLng startLocation; + +// StreamController _rideStatusStreamController = +// StreamController.broadcast(); +// Stream get rideStatusStream => _rideStatusStreamController.stream; + +// int maxAttempts = 28; + +// Future rideAppliedFromDriver(bool isApplied) async { +// Log.print('[rideAppliedFromDriver] 🚀 Starting logic...'); + +// // 1. جلب بيانات السائق والسيارة المحدثة من السيرفر +// await getUpdatedRideForDriverApply(rideId); + +// // تنبيهات الأسعار حسب نوع السيارة +// if (['Speed', 'Awfar Car'].contains(box.read(BoxName.carType))) { +// NotificationController().showNotification('Fixed Price'.tr, +// 'The captain is responsible for the route.'.tr, 'ding'); +// } else if (['Comfort', 'Lady'].contains(box.read(BoxName.carType))) { +// NotificationController().showNotification('Attention'.tr, +// 'The price may increase if the route changes.'.tr, 'ding'); +// } + +// isApplied = true; +// statusRide = 'Apply'; +// rideConfirm = false; +// isSearchingWindow = false; +// _isDriverAppliedLogicExecuted = true; // ضمان عدم التكرار + +// update(); // تحديث أولي + +// // 2. جلب موقع السائق الأولي فوراً (Blocking await) +// await getDriverCarsLocationToPassengerAfterApplied(); + +// // 3. إذا توفر الموقع: حساب المسافة/الزمن ورسم المسار +// if (driverCarsLocationToPassengerAfterApplied.isNotEmpty) { +// LatLng driverPos = driverCarsLocationToPassengerAfterApplied.last; + +// Log.print( +// '[rideAppliedFromDriver] 📍 Driver at: $driverPos, Passenger at: $passengerLocation'); + +// // أ) استدعاء API لحساب المسافة والزمن الدقيق (بدون رسم) +// await getInitialDriverDistanceAndDuration(driverPos, passengerLocation); + +// // ب) رسم خط المسار (Visual only) +// await drawDriverPathOnly(driverPos, passengerLocation); + +// // ج) ضبط الكاميرا لتشمل السائق والراكب +// _fitCameraToPoints(driverPos, passengerLocation); +// } else { +// Log.print( +// '[rideAppliedFromDriver] ⚠️ Warning: Driver location not found yet.'); +// } + +// // 4. تشغيل تايمر التتبع المستمر (الذي سيقوم بتناقص الوقت الذي جلبناه من API) +// startTimerFromDriverToPassengerAfterApplied(); + +// // إغلاق الستريم القديم +// if (!_rideStatusStreamController.isClosed) +// _rideStatusStreamController.close(); +// } + +// /// دالة لجلب المسافة والزمن بين السائق والراكب عند قبول الطلب +// /// تستخدم API سريع (overview=false) +// Future getInitialDriverDistanceAndDuration( +// LatLng driverPos, LatLng passengerPos) async { +// final String apiUrl = 'https://routec.intaleq.xyz/route'; +// final String apiKey = Env.mapKeyOsm; + +// final String origin = '${driverPos.latitude},${driverPos.longitude}'; +// final String dest = '${passengerPos.latitude},${passengerPos.longitude}'; + +// // الرابط المطلوب: steps=false&overview=false (سريع جداً للبيانات فقط) +// final Uri uri = Uri.parse( +// '$apiUrl?origin=$origin&destination=$dest&steps=false&overview=false'); + +// try { +// Log.print('[InitialCalc] Fetching distance/duration from: $uri'); +// final response = await http.get(uri, headers: {'X-API-KEY': apiKey}); + +// if (response.statusCode == 200) { +// final data = jsonDecode(response.body); + +// if (data['status'] == 'ok') { +// // 1. استخراج الزمن (بالثواني) +// // نستخدم المعامل 1.5348 أو 1.4 حسب منطقك السابق لتقدير الوقت الواقعي +// double durationSecondsRaw = (data['duration_s'] as num).toDouble(); +// int finalDurationSeconds = (durationSecondsRaw * kDurationScalar) +// .toInt(); // kDurationScalar = 1.5348 + +// // 2. استخراج المسافة (بالأمتار) +// double distanceMeters = (data['distance_m'] as num).toDouble(); + +// // 3. تحديث المتغيرات في الكنترولر +// timeToPassengerFromDriverAfterApplied = finalDurationSeconds; +// remainingTimeToPassengerFromDriverAfterApplied = finalDurationSeconds; + +// distanceByPassenger = +// (distanceMeters).toStringAsFixed(0); // المسافة نصاً + +// // يمكنك أيضاً تحديث durationToPassenger إذا كنت تستخدمها +// durationToPassenger = finalDurationSeconds; + +// Log.print( +// '[InitialCalc] ✅ Success: Duration=${finalDurationSeconds}s, Distance=${distanceMeters}m'); +// update(); // تحديث الواجهة لعرض الوقت الجديد فوراً +// } +// } else { +// Log.print('[InitialCalc] ❌ API Error: ${response.statusCode}'); +// } +// } catch (e) { +// Log.print('[InitialCalc] 💥 Exception: $e'); +// } +// } + +// // دالة خفيفة وسريعة لرسم خط المسار فقط (بدون أسعار أو خطوات) +// Future drawDriverPathOnly(LatLng driverPos, LatLng passengerPos) async { +// final String apiUrl = 'https://routec.intaleq.xyz/route'; +// final String apiKey = Env.mapKeyOsm; + +// final String origin = '${driverPos.latitude},${driverPos.longitude}'; +// final String dest = '${passengerPos.latitude},${passengerPos.longitude}'; + +// // استخدام overview=full للدقة، و steps=false للسرعة +// final Uri uri = Uri.parse( +// '$apiUrl?origin=$origin&destination=$dest&steps=false&overview=full'); + +// try { +// final response = await http.get(uri, headers: {'X-API-KEY': apiKey}); + +// if (response.statusCode == 200) { +// final data = jsonDecode(response.body); + +// if (data['status'] == 'ok' && data['polyline'] != null) { +// final String pointsString = data['polyline']; + +// // فك التشفير +// List decodedPoints = +// await compute(decodePolylineIsolate, pointsString); + +// // إزالة خط مسار السائق القديم فقط +// polyLines = polyLines +// .where((p) => p.polylineId.value != 'driver_route') +// .toSet(); + +// // إضافة الخط الجديد +// polyLines = { +// ...polyLines, +// Polyline( +// polylineId: const PolylineId('driver_route'), +// points: decodedPoints, +// color: const Color(0xFF333333), // لون مميز لمسار السائق +// width: 5, +// ) +// }; + +// // لا تستدعي update هنا، سيتم استدعاؤها في الدالة الأب (getDriverCars...) لتقليل عدد التحديثات +// } +// } +// } catch (e) { +// Log.print('Error drawing driver path: $e'); +// } +// } + +// // دالة مساعدة لضبط الكاميرا +// void _fitCameraToPoints(LatLng p1, LatLng p2) async { +// if (mapController == null) return; + +// // 1. معالجة حالة النقاط المتطابقة (تمنع الكراش في Android) +// if (p1.latitude == p2.latitude && p1.longitude == p2.longitude) { +// try { +// mapController?.animateCamera(CameraUpdate.newLatLngZoom(p1, 17)); +// } catch (e) { +// Log.print("Error animating to single point: $e"); +// } +// return; +// } + +// // 2. حساب الحدود +// double minLat = min(p1.latitude, p2.latitude); +// double maxLat = max(p1.latitude, p2.latitude); +// double minLng = min(p1.longitude, p2.longitude); +// double maxLng = max(p1.longitude, p2.longitude); + +// // 3. تقليل الهوامش لتجنب خطأ "View size too small" +// // نستخدم 50 بدلاً من 100 ليكون آمناً مع الخرائط الصغيرة +// double padding = 50.0; + +// try { +// await mapController?.animateCamera( +// CameraUpdate.newLatLngBounds( +// LatLngBounds( +// southwest: LatLng(minLat, minLng), +// northeast: LatLng(maxLat, maxLng), +// ), +// left: padding, +// top: padding, +// right: padding, +// bottom: padding, +// ), +// ); +// } catch (e) { +// Log.print("Error animating bounds (Map might be resizing): $e"); +// // محاولة بديلة آمنة: تحريك الكاميرا للمنتصف فقط دون Bounds +// try { +// LatLng center = LatLng((minLat + maxLat) / 2, (minLng + maxLng) / 2); +// mapController?.animateCamera(CameraUpdate.newLatLngZoom(center, 14)); +// } catch (e) { +// Log.print("Error: $e"); +// } +// } +// } + +// // Listening to the Stream +// void listenToRideStatusStream() { +// rideStatusStream.listen((rideStatus) { +// Log.print("Ride Status: $rideStatus"); +// // Handle updates based on the ride status +// }, onError: (error) { +// Log.print("Error in Ride Status Stream: $error"); +// // Handle stream errors +// }, onDone: () { +// Log.print("Ride status stream closed."); +// }); +// } + +// void start15SecondTimer(String rideId) { +// Timer(const Duration(seconds: 15), () { +// // delayAndFetchRideStatusForAllDriverAvailable(rideId); +// }); +// } + +// // Replaces void startTimer() +// Timer? +// _uiCountdownTimer; // Add this variable to your class to manage lifecycle + +// void startUiCountdown() { +// // Cancel any existing timer to avoid duplicates +// _uiCountdownTimer?.cancel(); + +// // Reset variables +// progress = 0; +// remainingTime = durationTimer; + +// _uiCountdownTimer = Timer.periodic(const Duration(seconds: 1), (timer) { +// // Logic from your loop, but non-blocking +// int i = timer.tick; // current tick + +// progress = i / durationTimer; +// remainingTime = durationTimer - i; + +// if (remainingTime <= 0) { +// timer.cancel(); // Stop this specific timer +// rideConfirm = false; + +// // Add the duration to the tracking time logic +// timeToPassengerFromDriverAfterApplied += durationToPassenger; + +// // Note: We do NOT call startTimerFromDriverToPassengerAfterApplied() here +// // because we already started it in rideAppliedFromDriver! + +// timerEnded(); // Call your existing completion logic +// } +// update(); // Update the UI progress bar +// }); +// } + +// void timerEnded() async { +// runEvery30SecondsUntilConditionMet(); +// isCancelRidePageShown = false; +// Log.print('isCancelRidePageShown: $isCancelRidePageShown'); +// update(); +// } + +// Future getRideStatus(String rideId) async { +// final response = await CRUD().get( +// link: "${AppLink.rideServerSide}/ride/rides/getRideStatus.php", +// payload: {'id': rideId}); +// Log.print(response); +// Log.print('2176'); +// return jsonDecode(response)['data']; +// } + +// late String driverCarModel, +// driverCarMake, +// driverLicensePlate, +// driverName = ''; +// Future getUpdatedRideForDriverApply(String rideId) async { +// // حماية مبدئية: إذا كان المعرف غير صالح لا تكمل +// if (rideId == 'yet' || rideId.isEmpty) return; + +// try { +// final res = await CRUD().get( +// link: "${AppLink.server}/ride/rides/getRideOrderID.php", +// payload: {'passengerID': box.read(BoxName.passengerID).toString()}); + +// if (res != 'failure') { +// var response = jsonDecode(res); +// Log.print('getUpdatedRideForDriverApply Response: $response'); + +// // [هام] التحقق من أن data عبارة عن Map وليست false أو null +// // هذا يمنع الخطأ: Class 'bool' has no instance method '[]' +// if (response['status'] == 'success' && +// response['data'] != null && +// response['data'] is Map) { +// var data = response['data']; + +// // استخدام ?.toString() ?? '' للحماية من القيم الفارغة (Null Safety) +// driverId = data['driver_id']?.toString() ?? ''; +// driverPhone = data['phone']?.toString() ?? ''; +// driverCarMake = data['make']?.toString() ?? ''; +// model = data['model']?.toString() ?? ''; +// colorHex = data['color_hex']?.toString() ?? ''; +// carColor = data['color']?.toString() ?? ''; +// make = data['make']?.toString() ?? ''; +// licensePlate = data['car_plate']?.toString() ?? ''; + +// // دمج الاسم الأول والأخير للراكب +// String firstName = data['passengerName']?.toString() ?? ''; +// String lastName = data['last_name']?.toString() ?? ''; +// passengerName = +// lastName.isNotEmpty ? "$firstName $lastName" : firstName; + +// driverName = data['driverName']?.toString() ?? ''; + +// // [هام] التوكن ضروري للإشعارات +// driverToken = data['token']?.toString() ?? ''; + +// carYear = data['year']?.toString() ?? ''; +// driverRate = data['ratingDriver']?.toString() ?? '5.0'; + +// update(); // تحديث الواجهة بالبيانات الجديدة +// } else { +// Log.print( +// "Warning: Ride data not found or invalid (data is false/null)"); +// // اختياري: يمكنك هنا التعامل مع حالة عدم العثور على السائق بعد +// } +// } +// } catch (e) { +// Log.print("Error in getUpdatedRideForDriverApply: $e"); +// } +// } + +// late LatLng currentDriverLocation; +// late double headingList; + +// Map _animationTimers = {}; +// final int updateIntervalMs = 100; // Update every 100ms +// final double minMovementThreshold = +// 10; // Minimum movement in meters to trigger update +// Future getCarForFirstConfirm(String carType) async { +// bool foundCars = false; +// int attempt = 0; + +// // Set up the periodic timer +// Timer? timer = Timer.periodic(const Duration(seconds: 4), (Timer t) async { +// // Attempt to get car location +// foundCars = await getCarsLocationByPassengerAndReloadMarker(); +// Log.print('foundCars: $foundCars'); + +// if (foundCars) { +// // If cars are found, cancel the timer and exit the search +// t.cancel(); +// } else if (attempt >= 4) { +// // After 4 attempts, stop the search +// t.cancel(); + +// if (!foundCars) { +// noCarString = true; +// dataCarsLocationByPassenger = 'failure'; +// } + +// update(); +// } + +// attempt++; // Increment attempt +// }); +// } + +// void startCarLocationSearch(String carType) { +// int searchInterval = 5; // Interval in seconds +// Log.print('searchInterval: $searchInterval'); +// int boundIncreaseStep = 2500; // Initial bounds in meters +// Log.print('boundIncreaseStep: $boundIncreaseStep'); +// int maxAttempts = 3; // Maximum attempts to increase bounds +// int maxBoundIncreaseStep = 6000; // Maximum bounds increase step +// int attempt = 0; // Current attempt +// Log.print('initial attempt: $attempt'); + +// Timer.periodic(Duration(seconds: searchInterval), (Timer timer) async { +// Log.print('Current attempt: $attempt'); // Log current attempt +// bool foundCars = false; +// if (attempt >= maxAttempts) { +// timer.cancel(); +// if (foundCars == false) { +// noCarString = true; +// // dataCarsLocationByPassenger = 'failure'; +// update(); +// } + +// // return; +// } else if (reloadStartApp == true) { +// Log.print('reloadStartApp: $reloadStartApp'); +// foundCars = await getCarsLocationByPassengerAndReloadMarker(); +// Log.print('foundCars: $foundCars'); + +// if (foundCars) { +// timer.cancel(); +// } else { +// attempt++; +// Log.print( +// 'Incrementing attempt to: $attempt'); // Log incremented attempt + +// if (boundIncreaseStep < maxBoundIncreaseStep) { +// boundIncreaseStep += 1500; // Increase bounds +// if (boundIncreaseStep > maxBoundIncreaseStep) { +// boundIncreaseStep = +// maxBoundIncreaseStep; // Ensure it does not exceed the maximum +// } +// Log.print( +// 'New boundIncreaseStep: $boundIncreaseStep'); // Log new bounds +// } +// } +// } +// }); +// } + +// String getLocationArea(double latitude, double longitude) { +// LatLng passengerPoint = LatLng(latitude, longitude); + +// // 1. فحص الأردن +// if (isPointInPolygon(passengerPoint, CountryPolygons.jordanBoundary)) { +// box.write(BoxName.countryCode, 'Jordan'); +// // يمكنك تعيين AppLink.endPoint هنا إذا كان منطقك الداخلي لا يزال يعتمد عليه +// box.write(BoxName.serverChosen, +// AppLink.server); // مثال: اختر سيرفر سوريا للبيانات +// return 'Jordan'; +// } + +// // 2. فحص سوريا +// if (isPointInPolygon(passengerPoint, CountryPolygons.syriaBoundary)) { +// box.write(BoxName.countryCode, 'Syria'); +// box.write(BoxName.serverChosen, AppLink.server); +// return 'Syria'; +// } + +// // 3. فحص مصر +// if (isPointInPolygon(passengerPoint, CountryPolygons.egyptBoundary)) { +// box.write(BoxName.countryCode, 'Egypt'); +// box.write(BoxName.serverChosen, AppLink.server); +// return 'Egypt'; +// } + +// // 4. الافتراضي (إذا كان خارج المناطق المخدومة) +// box.write(BoxName.countryCode, 'Jordan'); +// box.write(BoxName.serverChosen, AppLink.server); +// return 'Unknown Location (Defaulting to Jordan)'; +// } + +// Future getCarsLocationByPassengerAndReloadMarker() async { +// // 1. تنظيف القائمة والماركرز +// carsLocationByPassenger = []; + +// if (passengerLocation.latitude == 0 && passengerLocation.longitude == 0) { +// return false; // لا يوجد موقع للراكب +// } + +// // 2. طلب بسيط ومباشر (أنا هنا، أعطني السائقين حولي) +// var res = await CRUD().get( +// link: AppLink.getCarsLocationByPassenger, +// payload: { +// 'lat': passengerLocation.latitude.toString(), +// 'lng': passengerLocation.longitude.toString(), +// 'radius': '5', // نصف القطر ثابت (مثلاً 5 كم) أو يمكنك جعله ديناميكياً +// 'limit': '50', // أقصى عدد سيارات للعرض +// }, +// ); + +// if (res == 'failure') { +// noCarString = true; +// update(); +// return false; +// } + +// // 3. معالجة البيانات +// noCarString = false; +// var responseData = jsonDecode(res); + +// // دعم التنسيقين (data أو message) لضمان عدم حدوث كراش +// List driversList = []; +// if (responseData['status'] == true && responseData['data'] != null) { +// driversList = responseData['data']; +// } else if (responseData['message'] != null) { +// driversList = responseData['message']; // للكود القديم احتياطاً +// } + +// if (driversList.isEmpty) { +// carsLocationByPassenger.clear(); +// update(); +// return false; +// } + +// carsLocationByPassenger.clear(); // تنظيف الماركرز القديمة + +// // 4. رسم السيارات على الخريطة +// for (var i = 0; i < driversList.length; i++) { +// var carData = driversList[i]; + +// // التحقق من الإحداثيات لضمان عدم رسم سيارة في المحيط +// double lat = double.tryParse(carData['latitude'].toString()) ?? 0.0; +// double lng = double.tryParse(carData['longitude'].toString()) ?? 0.0; +// double heading = double.tryParse(carData['heading'].toString()) ?? 0.0; + +// if (lat == 0.0 || lng == 0.0) continue; + +// _updateOrCreateMarker( +// carData['id'].toString(), +// LatLng(lat, lng), +// heading, +// // الدالة هذه تقرر شكل الأيقونة بناءً على نوع السيارة القادم من السيرفر +// _getIconForCar(carData), +// ); +// } + +// update(); +// return true; +// } + +// final List> fakeCarData = []; + +// void _addFakeCarMarkers(LatLng center, int count) { +// if (fakeCarData.isEmpty) { +// Random random = Random(); +// double radiusInKm = 2.5; // 3 km diameter, so 1.5 km radius + +// for (int i = 0; i < count; i++) { +// // Generate a random angle and distance within the circle +// double angle = random.nextDouble() * 2 * pi; +// double distance = sqrt(random.nextDouble()) * radiusInKm; + +// // Convert distance to latitude and longitude offsets +// double latOffset = (distance / 111.32); // 1 degree lat ≈ 111.32 km +// double lonOffset = +// (distance / (111.32 * cos(radians(center.latitude)))); + +// // Calculate new position +// double lat = center.latitude + (latOffset * cos(angle)); +// double lon = center.longitude + (lonOffset * sin(angle)); + +// double heading = random.nextDouble() * 360; + +// fakeCarData.add({ +// 'id': 'fake_$i', +// 'latitude': lat, +// 'longitude': lon, +// 'heading': heading, +// 'gender': 'Male', // Randomize gender +// }); +// } +// } + +// for (var carData in fakeCarData) { +// _updateOrCreateMarker( +// carData['id'].toString(), +// LatLng(carData['latitude'], carData['longitude']), +// carData['heading'], +// _getIconForCar(carData), +// ); +// } +// } + +// String _getIconForCar(Map carData) { +// if (carData['model'].toString().contains('دراجة')) { +// return motoIcon; +// } else if (carData['gender'] == 'Female') { +// return ladyIcon; +// } else { +// return carIcon; +// } +// } + +// void _updateOrCreateMarker( +// String markerId, LatLng newPosition, double newHeading, String icon) { +// final mId = MarkerId(markerId); +// final existingMarker = markers.cast().firstWhere( +// (m) => m?.markerId == mId, +// orElse: () => null, +// ); + +// if (existingMarker == null) { +// markers = { +// ...markers, +// Marker( +// markerId: mId, +// position: newPosition, +// rotation: newHeading, +// icon: InlqBitmap.fromStyleImage(icon), +// anchor: const Offset(0.5, 0.5), +// ), +// }; +// update(); +// } else { +// double distance = +// _calculateDistance(existingMarker.position, newPosition); +// if (distance >= minMovementThreshold) { +// _smoothlyUpdateMarker(existingMarker, newPosition, newHeading, icon); +// } +// } +// } + +// double _calculateDistance(LatLng start, LatLng end) { +// // Implement distance calculation (e.g., Haversine formula) +// // For simplicity, this is a placeholder. Replace with actual implementation. +// return 1000 * +// sqrt(pow(start.latitude - end.latitude, 2) + +// pow(start.longitude - end.longitude, 2)); +// } + +// String formatSyrianPhoneNumber(String phoneNumber) { +// // Trim any whitespace from the input. +// String trimmedPhone = phoneNumber.trim(); + +// // If the number starts with '09', remove the leading '0' and prepend '963'. +// if (trimmedPhone.startsWith('09')) { +// return '963${trimmedPhone.substring(1)}'; +// } +// // If the number already starts with '963', return it as is to avoid duplication. +// if (trimmedPhone.startsWith('963')) { +// return trimmedPhone; +// } +// // For any other case (e.g., number starts with '9' without a '0'), +// // prepend '963' to ensure the correct format. +// return '963$trimmedPhone'; +// } + +// String generateTrackingLink(String rideId, String driverId) { +// String cleanRideId = rideId.toString().trim(); +// String cleanDriverId = driverId.toString().trim(); + +// // الكلمة السرية للمطابقة مع السيرفر +// const String secretSalt = "Intaleq_Secure_Track_2025"; + +// // الدمج والتشفير +// String rawString = "$cleanRideId$cleanDriverId$secretSalt"; +// var bytes = utf8.encode(rawString); +// var digest = md5.convert(bytes); +// String token = digest.toString(); + +// // الرابط المباشر لصفحة التتبع +// return "https://intaleqapp.com/track/index.php?id=$cleanRideId&token=$token"; +// } + +// // 2. الدالة الرئيسية (تم تعديلها لإرسال واتساب بدلاً من الإشعارات) +// Future shareTripWithFamily() async { +// // التحقق أولاً: هل الرقم موجود؟ +// String? storedPhone = box.read(BoxName.sosPhonePassenger); + +// if (storedPhone == null) { +// // --- (نفس المنطق القديم: فتح ديالوج لإضافة الرقم) --- +// Get.defaultDialog( +// title: 'Add SOS Phone'.tr, +// titleStyle: AppStyle.title, +// content: Form( +// key: sosFormKey, +// child: MyTextForm( +// controller: sosPhonePassengerProfile, +// label: 'insert sos phone'.tr, +// hint: 'e.g. 0912345678'.tr, +// type: TextInputType.phone, +// ), +// ), +// confirm: MyElevatedButton( +// title: 'Add SOS Phone'.tr, +// onPressed: () async { +// if (sosFormKey.currentState!.validate()) { +// Get.back(); +// // تنسيق الرقم +// var numberPhone = +// formatSyrianPhoneNumber(sosPhonePassengerProfile.text); + +// // حفظ في السيرفر +// await CRUD().post( +// link: AppLink.updateprofile, +// payload: { +// 'id': box.read(BoxName.passengerID), +// 'sosPhone': numberPhone, +// }, +// ); + +// // حفظ محلياً +// box.write(BoxName.sosPhonePassenger, numberPhone); + +// // استدعاء الدالة مرة أخرى للمتابعة +// shareTripWithFamily(); +// } +// })); +// return; +// } + +// // --- (المنطق الجديد: إرسال واتساب مباشرة) --- + +// // 1. التأكد من وجود بيانات للرحلة +// if (rideId == 'yet' || driverId.isEmpty) { +// Get.snackbar("Alert".tr, "Wait for the trip to start first".tr); +// return; +// } + +// // 2. تنسيق الرقم +// var numberPhone = formatSyrianPhoneNumber(storedPhone); + +// // 3. توليد الرابط +// String trackingLink = generateTrackingLink(rideId, driverId); + +// // 4. تجهيز الرسالة (بالإنجليزية وجاهزة للترجمة) +// // لاحظ: استخدمت المتغيرات الموجودة في الكنترولر (passengerName هنا عادة يحمل اسم السائق في الكنترولر الخاص بك حسب الكود السابق) +// String message = """ +// مرحباً، تابع رحلتي مباشرة على تطبيق انطلق 🚗 + +// يمكنك تتبع مسار الرحلة من هنا: +// $trackingLink + +// السائق: $passengerName +// السيارة: $model - $licensePlate +// شكراً لاستخدامك انطلق! +// """ +// .tr; + +// String messageEn = """Hello, follow my trip live on Intaleq 🚗 + +// Track my ride here: +// $trackingLink + +// Driver: $passengerName +// Car: $model - $licensePlate +// Thank you for using Intaleq! +// """; + +// // اختر الرسالة بناءً على اللغة المفضلة (مثال بسيط) +// String userLanguage = box.read(BoxName.lang) ?? 'ar'; +// message = (userLanguage == 'ar') ? message : messageEn; +// // وضعنا .tr لكي تتمكن من ترجمتها للعربية في ملفات اللغة إذا أردت، أو تركها إنجليزية + +// Log.print("Sending WhatsApp to: $numberPhone"); + +// // 5. فتح واتساب +// launchCommunication('whatsapp', numberPhone, message); + +// // (اختياري) حفظ أن التتبع مفعل لتغيير حالة الأيقونة في الواجهة +// box.write(BoxName.parentTripSelected, true); +// update(); +// } + +// Future getTokenForParent() async { +// // 1. التحقق أولاً: هل الرقم موجود؟ +// String? storedPhone = box.read(BoxName.sosPhonePassenger); + +// if (storedPhone == null) { +// // --- حالة الرقم غير موجود: نفتح الديالوج فقط --- +// Get.defaultDialog( +// title: 'Add SOS Phone'.tr, +// titleStyle: AppStyle.title, +// content: Form( +// key: sosFormKey, +// child: MyTextForm( +// controller: sosPhonePassengerProfile, +// label: 'insert sos phone'.tr, +// hint: 'e.g. 0912345678'.tr, +// type: TextInputType.phone, +// ), +// ), +// confirm: MyElevatedButton( +// title: 'Add SOS Phone'.tr, +// onPressed: () async { +// if (sosFormKey.currentState!.validate()) { +// // إغلاق الديالوج الحالي +// Get.back(); + +// // تنسيق الرقم (تأكد أن هذا التنسيق يطابق ما تم تخزينه عند تسجيل الراكب) +// var numberPhone = +// formatSyrianPhoneNumber(sosPhonePassengerProfile.text); + +// // حفظ الرقم في السيرفر (تحديث البروفايل) +// await CRUD().post( +// link: AppLink.updateprofile, +// payload: { +// 'id': box.read(BoxName.passengerID), +// 'sosPhone': numberPhone, +// }, +// ); + +// // حفظ الرقم محلياً +// box.write(BoxName.sosPhonePassenger, numberPhone); + +// // استدعاء الدالة مرة أخرى +// getTokenForParent(); +// } +// })); +// return; +// } +// generateTrackingLink(rideId, driverId); +// // --- حالة الرقم موجود: نكمل التنفيذ --- +// var numberPhone = formatSyrianPhoneNumber(storedPhone); +// Log.print("Searching for Parent Token with Phone: $numberPhone"); + +// // استدعاء السكريبت (استخدم POST بدلاً من GET) +// var res = await CRUD() +// .post(link: AppLink.getTokenParent, payload: {'phone': numberPhone}); + +// // التعامل مع الاستجابة +// if (res is Map) { +// handleResponse(res); +// } else { +// try { +// // var jsonRes = jsonDecode(res); +// handleResponse(res); +// } catch (e) { +// Log.print("Error parsing response: $res"); +// } +// } +// } + +// void handleResponse(Map res) { +// Log.print("Handle Response: $res"); // للتأكد من دخول الدالة + +// // الحالة 1: الرقم غير مسجل (Failure) +// if (res['status'] == 'failure') { +// // إذا كان هناك أي ديالوج تحميل مفتوح، نغلقه أولاً، لكن بحذر +// if (Get.isDialogOpen ?? false) Get.back(); + +// Get.defaultDialog( +// title: "No user found".tr, // اختصرت العنوان ليظهر بشكل أفضل +// titleStyle: AppStyle.title, +// content: Column( +// children: [ +// Text( +// "No passenger found for the given phone number".tr, +// style: AppStyle.title, // غيرت الستايل ليكون أصغر قليلاً +// textAlign: TextAlign.center, +// ), +// const SizedBox(height: 10), +// Text( +// "Send Intaleq app to him".tr, +// style: AppStyle.title +// .copyWith(color: AppColor.greenColor, fontSize: 14), +// textAlign: TextAlign.center, +// ) +// ], +// ), +// confirm: MyElevatedButton( +// title: 'Send Invite'.tr, +// onPressed: () { +// Get.back(); // إغلاق الديالوج + +// var rawPhone = box.read(BoxName.sosPhonePassenger); +// // تأكد أن rawPhone ليس null +// if (rawPhone == null) return; + +// var phone = formatSyrianPhoneNumber(rawPhone); + +// // تصحيح نص الرسالة +// var message = '''Dear Friend, + +// 🚀 I have just started an exciting trip on Intaleq! +// Download the app to track my ride: + +// 👉 Android: https://play.google.com/store/apps/details?id=com.Intaleq.intaleq&hl=en-US +// 👉 iOS: https://apps.apple.com/st/app/intaleq-rider/id6748075179 + +// See you there! +// Intaleq Team'''; + +// launchCommunication('whatsapp', phone, message); +// }), +// cancel: MyElevatedButton( +// title: 'Cancel'.tr, +// onPressed: () { +// Get.back(); +// })); +// } +// // الحالة 2: نجاح (Success) +// else if (res['status'] == 'success') { +// // إغلاق أي ديالوج سابق (مثل Loading) +// if (Get.isDialogOpen ?? false) Get.back(); + +// Get.snackbar("Success".tr, "The invitation was sent successfully".tr, +// backgroundColor: AppColor.greenColor, colorText: Colors.white); + +// List tokensData = res['data']; + +// for (var device in tokensData) { +// String tokenParent = device['token']; + +// NotificationService.sendNotification( +// category: "Trip Monitoring", +// target: tokenParent, +// title: "Trip Monitoring".tr, +// body: "Click to track the trip".tr, +// isTopic: false, +// tone: 'tone1', +// driverList: [rideId, driverId], +// ); +// // حفظ آخر توكن +// box.write(BoxName.tokenParent, tokenParent); +// } +// box.write(BoxName.parentTripSelected, true); +// } +// } + +// // Function to check if the point is inside the polygon +// bool isPointInPolygon(LatLng point, List polygon) { +// int intersections = 0; +// for (int i = 0; i < polygon.length; i++) { +// LatLng vertex1 = polygon[i]; +// LatLng vertex2 = +// polygon[(i + 1) % polygon.length]; // Loop back to the start + +// if (_rayIntersectsSegment(point, vertex1, vertex2)) { +// intersections++; +// } +// } + +// // If the number of intersections is odd, the point is inside +// return intersections % 2 != 0; +// } + +// // Helper function to check if a ray from the point intersects with a polygon segment +// bool _rayIntersectsSegment(LatLng point, LatLng vertex1, LatLng vertex2) { +// double px = point.longitude; +// double py = point.latitude; + +// double v1x = vertex1.longitude; +// double v1y = vertex1.latitude; +// double v2x = vertex2.longitude; +// double v2y = vertex2.latitude; + +// // Check if the point is outside the vertical bounds of the segment +// if ((py < v1y && py < v2y) || (py > v1y && py > v2y)) { +// return false; +// } + +// // Calculate the intersection of the ray and the segment +// double intersectX = v1x + (py - v1y) * (v2x - v1x) / (v2y - v1y); + +// // Check if the intersection is to the right of the point +// return intersectX > px; +// } + +// bool isInUniversity = false; +// // Function to check if the passenger is in any university polygon +// // Function to check if the passenger is in any university polygon and return the university name +// String checkPassengerLocation(LatLng passengerLocation, +// List> universityPolygons, List universityNames) { +// for (int i = 0; i < universityPolygons.length; i++) { +// if (isPointInPolygon(passengerLocation, universityPolygons[i])) { +// isInUniversity = true; +// return "Passenger is in ${universityNames[i]}"; +// } +// } +// return "Passenger is not in any university"; +// } + +// String passengerLocationStringUnvirsity = 'unKnown'; +// void getPassengerLocationUniversity() { +// // Check if the passenger is inside any of the university polygons and get the university name +// passengerLocationStringUnvirsity = checkPassengerLocation( +// passengerLocation, +// UniversitiesPolygons.universityPolygons, +// UniversitiesPolygons.universityNames, +// ); +// if (passengerLocationStringUnvirsity != 'unKnown') { +// // Get.snackbar('you are in $passengerLocationStringUnvirsity', ""); +// } +// Log.print(passengerLocationStringUnvirsity); +// } + +// // Initialize polygons from UniversitiesPolygons +// void _initializePolygons() { +// List> universityPolygons = +// UniversitiesPolygons.universityPolygons; + +// for (int i = 0; i < universityPolygons.length; i++) { +// Polygon polygon = Polygon( +// polygonId: PolygonId('univ_$i'), +// points: universityPolygons[i], +// fillColor: Colors.blueAccent.withOpacity(0.2), +// strokeColor: Colors.blueAccent, +// strokeWidth: 2, +// ); +// polygons.add(polygon); +// } +// update(); +// } + +// LatLng driverLocationToPassenger = const LatLng(32, 35); +// Future getDriverCarsLocationToPassengerAfterApplied() async { +// // driverCarsLocationToPassengerAfterApplied +// // 1. الشرط الأمني: تتبع فقط إذا كانت الرحلة نشطة +// bool isRideActive = (statusRide == 'Apply' || +// statusRide == 'Arrived' || +// statusRide == 'Begin' || +// currentRideState.value == RideState.driverApplied || +// currentRideState.value == RideState.driverArrived || +// currentRideState.value == RideState.inProgress); + +// if (!isRideActive || +// statusRide == 'Finished' || +// statusRide == 'Cancel' || +// currentRideState.value == RideState.finished || +// currentRideState.value == RideState.noRide || +// currentRideState.value == RideState.preCheckReview) { +// return; +// } + +// // 2. منع التداخل (Blocking) +// if (_isFetchingDriverLocation) return; +// _isFetchingDriverLocation = true; + +// try { +// var res = await CRUD().get( +// link: AppLink.getDriverCarsLocationToPassengerAfterApplied, +// payload: {'driver_id': driverId}); + +// if (res != 'failure') { +// datadriverCarsLocationToPassengerAfterApplied = jsonDecode(res); + +// if (datadriverCarsLocationToPassengerAfterApplied['message'] != null && +// datadriverCarsLocationToPassengerAfterApplied['message'] +// .isNotEmpty) { +// var _data = +// datadriverCarsLocationToPassengerAfterApplied['message'][0]; + +// LatLng newDriverPos = LatLng( +// double.parse(_data['latitude'].toString()), +// double.parse(_data['longitude'].toString())); +// // أضف هذا السطر لتقليل استهلاك الذاكرة +// if (driverCarsLocationToPassengerAfterApplied.length > 10) { +// driverCarsLocationToPassengerAfterApplied.removeAt(0); +// } +// driverLocationToPassenger = newDriverPos; +// driverCarsLocationToPassengerAfterApplied.add(newDriverPos); +// // 🔥 الإضافة هنا أيضاً 🔥 +// // 🔥 تحديث التوقيت حتى لو جاءت من API لكي يهدأ الحارس قليلاً +// _lastSocketLocationTime = DateTime.now(); +// _checkAndRecalculateIfDeviated(newDriverPos); +// // [تعديل هام] تنظيف آمن: لا نحذف ماركر السائق الحالي +// clearMarkersExceptStartEndAndDriver(); + +// // تحريك الماركر +// reloadMarkerDriverCarsLocationToPassengerAfterApplied(); +// } +// } +// update(); +// } catch (e) { +// Log.print('Error fetching driver location: $e'); +// } finally { +// _isFetchingDriverLocation = false; +// } +// } + +// Future runEvery30SecondsUntilConditionMet() async { +// // Calculate the duration of the trip in minutes. +// double tripDurationInMinutes = durationToPassenger / 5; +// int loopCount = tripDurationInMinutes.ceil(); +// // If the trip duration is less than or equal to 50 minutes, then break the loop. +// for (var i = 0; i < loopCount; i++) { +// // Wait for 50 seconds. +// await Future.delayed(const Duration(seconds: 5)); +// if (rideTimerBegin == true || statusRide == 'Apply') { +// await getDriverCarsLocationToPassengerAfterApplied(); +// reloadMarkerDriverCarsLocationToPassengerAfterApplied(); +// } +// } +// } + +// Future runWhenRideIsBegin() async { +// // Calculate the duration of the trip in minutes. +// double tripDurationInMinutes = durationToRide / 6; +// int loopCount = tripDurationInMinutes.ceil(); +// // If the trip duration is less than or equal to 50 minutes, then break the loop. +// clearMarkersExceptStartEnd(); +// for (var i = 0; i < loopCount; i++) { +// // Wait for 50 seconds. +// await Future.delayed(const Duration(seconds: 4)); +// // if (rideTimerBegin == true && statusRide == 'Apply') { +// await getDriverCarsLocationToPassengerAfterApplied(); +// // } +// reloadMarkerDriverCarsLocationToPassengerAfterApplied(); +// } +// } + +// Timer? _timer; +// // final int updateIntervalMs = 100; // Update every 100ms +// // final double minMovementThreshold = +// // 1.0; // Minimum movement in meters to trigger update +// void clearMarkersExceptStartEndAndDriver() { +// markers.removeWhere((marker) { +// String id = marker.markerId.value; +// // لا تحذف نقطة البداية +// if (id == 'start') return false; +// // لا تحذف نقطة النهاية +// if (id == 'end') return false; +// // لا تحذف السائق الحالي +// if (id == currentDriverMarkerId) return false; + +// // احذف أي شيء آخر (مثل السيارات التي ظهرت وقت البحث) +// return true; +// }); + +// // ملاحظة: لا نستدعي update() هنا لأننا سنستدعيها في نهاية الدالة الرئيسية +// } + +// void clearMarkersExceptStartEnd() { +// markers.removeWhere((marker) { +// String id = marker.markerId.value; +// return id != 'start' && id != 'end'; +// }); + +// update(); +// } + +// // 1. تعريف ID ثابت للسائق طوال الرحلة +// String get currentDriverMarkerId => 'driver_marker_$driverId'; + +// void reloadMarkerDriverCarsLocationToPassengerAfterApplied() { +// if (datadriverCarsLocationToPassengerAfterApplied == null || +// datadriverCarsLocationToPassengerAfterApplied['message'] == null || +// datadriverCarsLocationToPassengerAfterApplied['message'].isEmpty) { +// return; +// } + +// var driverData = +// datadriverCarsLocationToPassengerAfterApplied['message'][0]; + +// // جلب الإحداثيات الجديدة +// LatLng newPosition = LatLng(double.parse(driverData['latitude'].toString()), +// double.parse(driverData['longitude'].toString())); + +// double newHeading = +// double.tryParse(driverData['heading'].toString()) ?? 0.0; + +// // تحديد الأيقونة +// String icon; +// if (driverData['model'].toString().contains('دراجة') || +// driverData['make'].toString().contains('دراجة')) { +// icon = motoIcon; +// } else if (driverData['gender'] == 'Female') { +// icon = ladyIcon; +// } else { +// icon = carIcon; +// } + +// // 2. البحث عن الماركر الجديد وتحديثه أو إنشاء جديد +// final String markerId = currentDriverMarkerId; +// final mId = MarkerId(markerId); +// final existingMarker = markers.cast().firstWhere( +// (m) => m?.markerId == mId, +// orElse: () => null, +// ); + +// if (existingMarker != null) { +// _smoothlyUpdateMarker(existingMarker, newPosition, newHeading, icon); +// } else { +// markers = { +// ...markers, +// Marker( +// markerId: mId, +// position: newPosition, +// rotation: newHeading, +// icon: InlqBitmap.fromStyleImage(icon), +// anchor: const Offset(0.5, 0.5), +// ), +// }; +// update(); +// } +// } + +// // التأكد من دالة التحريك السلس +// void _smoothlyUpdateMarker( +// Marker oldMarker, LatLng newPosition, double newHeading, String icon) { +// double distance = Geolocator.distanceBetween( +// oldMarker.position.latitude, +// oldMarker.position.longitude, +// newPosition.latitude, +// newPosition.longitude); + +// if (distance < 2.0) return; + +// final MarkerId markerIdKey = oldMarker.markerId; + +// _animationTimers[markerIdKey.value]?.cancel(); + +// int ticks = 0; +// const int totalSteps = 20; +// const int stepDuration = 50; + +// double latStep = +// (newPosition.latitude - oldMarker.position.latitude) / totalSteps; +// double lngStep = +// (newPosition.longitude - oldMarker.position.longitude) / totalSteps; +// double headingStep = (newHeading - oldMarker.rotation) / totalSteps; + +// LatLng currentPos = oldMarker.position; +// double currentHeading = oldMarker.rotation; + +// _animationTimers[markerIdKey.value] = +// Timer.periodic(const Duration(milliseconds: stepDuration), (timer) { +// ticks++; + +// currentPos = +// LatLng(currentPos.latitude + latStep, currentPos.longitude + lngStep); +// currentHeading += headingStep; + +// // Update the marker in the set +// final updatedMarker = oldMarker.copyWith( +// position: currentPos, +// rotation: currentHeading, +// icon: InlqBitmap.fromStyleImage(icon), +// ); + +// markers = { +// ...markers.where((m) => m.markerId != markerIdKey), +// updatedMarker, +// }; + +// // Native update through controller to avoid UI rebuild +// if (mapController != null) { +// mapController!.animateCamera(CameraUpdate.newLatLng( +// currentPos)); // Optional: Follow car if needed +// // Note: IntaleqMapController doesn't expose raw symbol update yet for Marker object, +// // but declarative update via GetBuilder is fast. +// } + +// update(); + +// if (ticks >= totalSteps) { +// timer.cancel(); +// _animationTimers.remove(markerIdKey.value); +// } +// }); +// } + +// void _updateMarkerPosition( +// LatLng newPosition, double newHeading, String icon) { +// const String markerId = 'driverToPassengers'; + +// final mId = MarkerId(markerId); +// final existingMarker = markers.cast().firstWhere( +// (m) => m?.markerId == mId, +// orElse: () => null, +// ); + +// if (existingMarker != null) { +// _smoothlyUpdateMarker(existingMarker, newPosition, newHeading, icon); +// } else { +// markers = { +// ...markers, +// Marker( +// markerId: mId, +// position: newPosition, +// rotation: newHeading, +// icon: InlqBitmap.fromStyleImage(icon), +// anchor: const Offset(0.5, 0.5), +// ), +// }; +// update(); +// } + +// mapController?.animateCamera(CameraUpdate.newLatLng(newPosition)); +// } + +// @override +// void onClose() { +// Log.print( +// "--- MapPassengerController: Closing and cleaning up all resources. ---"); + +// // 1. إلغاء المؤقتات الفردية (باستخدام ?. الآمن) + +// timerToPassengerFromDriverAfterApplied?.cancel(); +// _timer?.cancel(); +// _masterTimer?.cancel(); // (أضف المؤقت الرئيسي) +// _camThrottle?.cancel(); // (أضف مؤقت الكاميرا) +// _heartbeatTimer?.cancel(); +// EmergencySignalService.instance.stopListening(); +// if (isSocketConnected) { +// socket.emit('unsubscribe_all', +// {'passenger_id': box.read(BoxName.passengerID).toString()}); +// socket.disconnect(); +// socket.dispose(); +// } + +// // 2. إلغاء جميع المؤقتات في الخريطة (للتحريكات السلسة) +// _animationTimers.forEach((key, timer) { +// timer.cancel(); +// }); +// _animationTimers.clear(); + +// // 3. إغلاق متحكمات البث (StreamControllers) لمنع تسريب الذاكرة +// if (!_timerStreamController.isClosed) { +// _timerStreamController.close(); +// } +// if (!_beginRideStreamController.isClosed) { +// _beginRideStreamController.close(); +// } +// if (!_rideStatusStreamController.isClosed) { +// _rideStatusStreamController.close(); +// } +// if (!timerController.isClosed) { +// timerController.close(); +// } + +// // 4. التخلص من متحكم الخريطة (ممارسة جيدة) +// mapController = null; + +// Log.print("--- Cleanup complete. ---"); +// super.onClose(); +// } + +// restCounter() { +// clearPlacesDestination(); +// clearPolyline(); +// data = []; +// rideConfirm = false; +// shouldFetch = false; +// timeToPassengerFromDriverAfterApplied = 0; +// update(); +// } + +// //driver behaviour +// double calculateBearing(double lat1, double lon1, double lat2, double lon2) { +// double deltaLon = lon2 - lon1; +// double y = sin(deltaLon) * cos(lat2); +// double x = cos(lat1) * sin(lat2) - sin(lat1) * cos(lat2) * cos(deltaLon); +// double bearing = atan2(y, x); +// return (bearing * 180 / pi + 360) % 360; // تحويل إلى درجات +// } + +// void analyzeBehavior(Position currentPosition, List routePoints) { +// double actualBearing = currentPosition.heading; // الاتجاه الفعلي من GPS +// double expectedBearing = calculateBearing( +// routePoints[0].latitude, +// routePoints[0].longitude, +// routePoints[1].latitude, +// routePoints[1].longitude, +// ); + +// double bearingDifference = (expectedBearing - actualBearing).abs(); +// if (bearingDifference > 30) { +// Log.print("⚠️ السائق انحرف عن المسار!"); +// } +// } + +// void detectStops(Position currentPosition) { +// if (currentPosition.speed < 0.5) { +// Log.print("🚦 السائق توقف في موقع غير متوقع!"); +// } +// } + +// Future cancelRideAfterRejectFromAll() async { +// clearPlacesDestination(); +// clearPolyline(); +// data = []; +// await CRUD().post( +// link: "${AppLink.server}/ride/rides/cancel_ride_by_passenger.php", +// payload: { +// "ride_id": rideId.toString(), // Convert to String +// "reason": 'notApplyFromAnyDriver' +// }); + +// rideConfirm = false; +// statusRide == 'Cancel'; +// isSearchingWindow = false; +// shouldFetch = false; +// isPassengerChosen = false; +// isCashConfirmPageShown = false; +// // totalStepDurations = 0; +// isCashSelectedBeforeConfirmRide = false; +// timeToPassengerFromDriverAfterApplied = 0; +// changeCancelRidePageShow(); +// remainingTime = 0; + +// update(); +// } + +// // متغيرات أسباب الإلغاء +// int selectedReasonIndex = -1; +// String selectedReasonText = ""; +// TextEditingController otherReasonController = TextEditingController(); + +// /// تحديث السبب المختار +// void selectReason(int index, String reason) { +// selectedReasonIndex = index; +// selectedReasonText = reason; +// update(); +// } + +// /// **دالة إلغاء الرحلة (النهائية)** +// Future cancelRide() async { +// // 1. التحقق من اختيار سبب +// if (selectedReasonIndex == -1) { +// Get.snackbar( +// 'Attention'.tr, +// 'Please select a reason first'.tr, +// snackPosition: SnackPosition.BOTTOM, +// backgroundColor: Colors.orange, +// colorText: Colors.white, +// ); +// return; +// } + +// // 2. تجهيز نص السبب النهائي +// String finalReason = selectedReasonText; +// if (finalReason == "Other".tr) { +// if (otherReasonController.text.trim().isEmpty) { +// Get.snackbar("Attention".tr, "Please write the reason...".tr, +// backgroundColor: Colors.red, colorText: Colors.white); +// return; +// } +// finalReason = otherReasonController.text.trim(); +// } + +// // 3. التنظيف المحلي الفوري (UX Optimization) +// Get.back(); // إغلاق الـ BottomSheet +// if (isCancelRidePageShown) +// changeCancelRidePageShow(); // إخفاء زر الإلغاء إن وجد + +// // 🔥 استدعاء دالة التنظيف الشاملة هنا 🔥 +// resetAllMapStates(); + +// // إيقاف جميع التايمرات +// // إيقاف جميع التايمرات +// stopAllTimers(); +// currentRideState.value = RideState.cancelled; +// await RideLiveNotification.cancel(); // إغلاق أندرويد +// IosLiveActivityService.endRideActivity(); // ✅ إغلاق iOS +// PipService.disablePip(); // ✅ إيقاف PiP عند الإلغاء + +// // 4. الاتصال بالسيرفر لإلغاء الرحلة وإبلاغ السائق +// if (rideId != 'yet' && rideId != null) { +// Log.print( +// '📡 Sending Cancel Request to Server with Reason: $finalReason'); + +// try { +// await CRUD().post( +// link: "${AppLink.server}/ride/rides/cancel_ride_by_passenger.php", +// payload: { +// "ride_id": rideId.toString(), +// "reason": finalReason // ✅ إرسال السبب للسيرفر +// }, +// ); +// // لا داعي لإرسال FCM أو Socket يدوياً من هنا، PHP يقوم بذلك +// } catch (e) { +// Log.print("Error cancelling on server: $e"); +// } +// } + +// // 5. العودة للصفحة الرئيسية +// Get.offAll(() => const MapPagePassenger()); +// } + +// void changePickerShown() { +// isPickerShown = !isPickerShown; +// heightPickerContainer = isPickerShown == true ? 150 : 90; +// update(); +// } + +// // ── Multi-Waypoint Methods ────────────────────────────────────────────────── +// void addMenuWaypoint() { +// if (activeMenuWaypointCount >= 2) return; +// activeMenuWaypointCount++; +// // Increase expanded bottom menu height to accommodate new waypoint row +// mainBottomMenuMapHeight = Get.height * .6 + (activeMenuWaypointCount * 56); +// update(); +// } + +// void removeMenuWaypoint(int index) { +// if (index < 0 || index >= 2) return; +// // Shift items if removing first waypoint while second exists +// if (index == 0 && activeMenuWaypointCount == 2) { +// menuWaypoints[0] = menuWaypoints[1]; +// menuWaypointNames[0] = menuWaypointNames[1]; +// } +// menuWaypoints[activeMenuWaypointCount - 1] = null; +// menuWaypointNames[activeMenuWaypointCount - 1] = ''; +// activeMenuWaypointCount--; +// mainBottomMenuMapHeight = Get.height * .6 + (activeMenuWaypointCount * 56); +// update(); +// } + +// void clearAllMenuWaypoints() { +// menuWaypoints = [null, null]; +// menuWaypointNames = ['', '']; +// activeMenuWaypointCount = 0; +// isPickingWaypoint = false; +// pickingWaypointIndex = -1; +// update(); +// } + +// void startPickingWaypointOnMap(int index) { +// pickingWaypointIndex = index; +// isPickingWaypoint = true; +// isPickerShown = true; +// heightPickerContainer = 150; +// // Close the expanded menu to show the map picker +// isMainBottomMenuMap = true; +// mainBottomMenuMapHeight = Get.height * .22; +// update(); +// } + +// void setMenuWaypointFromMap(int index, LatLng position) { +// Log.print('📍 setMenuWaypointFromMap called: index=$index, pos=$position'); +// if (index < 0 || index >= 2) return; +// menuWaypoints[index] = position; +// menuWaypointNames[index] = +// '${position.latitude.toStringAsFixed(4)}, ${position.longitude.toStringAsFixed(4)}'; +// isPickingWaypoint = false; +// pickingWaypointIndex = -1; +// isPickerShown = false; +// // Re-open expanded menu +// isMainBottomMenuMap = false; +// mainBottomMenuMapHeight = Get.height * .6 + (activeMenuWaypointCount * 56); +// update(); +// } + +// void setMenuWaypointFromSearch(int index, LatLng pos, String name) { +// if (index < 0 || index >= 2) return; +// menuWaypoints[index] = pos; +// menuWaypointNames[index] = name; +// update(); +// } + +// /// Build OSRM waypoint coordinate string for the route URL +// String _buildOsrmWaypointCoords() { +// String coords = ''; +// for (int i = 0; i < activeMenuWaypointCount; i++) { +// final wp = menuWaypoints[i]; +// if (wp != null) { +// coords += ';${wp.longitude},${wp.latitude}'; +// } +// } +// return coords; +// } + +// void changeHeightPointsPageForRider() { +// isPointsPageForRider = !isPointsPageForRider; +// heightPointsPageForRider = isPointsPageForRider == true ? Get.height : 0; +// update(); +// } + +// getCoordinateFromMapWayPoints(int index) { +// placesCoordinate[index] = newStartPointLocation.toString(); +// update(); +// } +// // --- ابدأ الإضافة هنا --- + +// // 1. قائمة لتخزين نقاط التوقف +// List> waypoints = []; + +// // 2. دالة لإضافة نقطة توقف جديدة +// void addWaypoint(Map placeDetails) { +// // يمكنك إضافة منطق للتحقق من عدد نقاط التوقف المسموح بها هنا +// waypoints.add(placeDetails); +// update(); // لتحديث الواجهة +// // TODO: أضف هنا استدعاء دالة إعادة رسم المسار مع نقاط التوقف الجديدة +// // getDirectionMapWithWaypoints(); +// } + +// // 3. دالة لحذف نقطة توقف +// void removeWaypoint(int index) { +// if (index >= 0 && index < waypoints.length) { +// waypoints.removeAt(index); +// update(); // لتحديث الواجهة +// // TODO: أضف هنا استدعاء دالة إعادة رسم المسار بعد حذف النقطة +// // getDirectionMapWithWaypoints(); +// } +// } + +// // --- انتهى --- + +// void changeMainBottomMenuMap() { +// if (isWayPointStopsSheetUtilGetMap == true) { +// changeWayPointSheet(); +// } else { +// isMainBottomMenuMap = !isMainBottomMenuMap; +// mainBottomMenuMapHeight = +// isMainBottomMenuMap == true ? Get.height * .22 : Get.height * .6; +// isWayPointSheet = false; +// if (heightMenuBool == true) { +// getDrawerMenu(); +// } +// initilizeGetStorage(); +// update(); +// } +// } + +// void downPoints() { +// if (Get.find().wayPoints.length < 2) { +// isWayPointStopsSheetUtilGetMap = false; +// isWayPointSheet = false; +// wayPointSheetHeight = isWayPointStopsSheet ? Get.height * .45 : 0; +// // changeWayPointStopsSheet(); +// update(); +// } +// // changeWayPointStopsSheet(); +// // isWayPointSheet = false; +// update(); +// } + +// void changeWayPointSheet() { +// isWayPointSheet = !isWayPointSheet; +// wayPointSheetHeight = isWayPointSheet == false ? 0 : Get.height * .45; +// // if (heightMenuBool == true) { +// // getDrawerMenu(); +// // } +// update(); +// } + +// void changeWayPointStopsSheet() { +// // int waypointsLength = Get.find().wayPoints.length; + +// if (wayPointIndex > -1) { +// isWayPointStopsSheet = true; +// isWayPointStopsSheetUtilGetMap = true; +// } +// isWayPointStopsSheet = !isWayPointStopsSheet; +// wayPointSheetHeight = isWayPointStopsSheet ? Get.height * .45 : 0; +// // if (heightMenuBool == true) { +// // getDrawerMenu(); +// // } +// update(); +// } + +// changeHeightPlaces() { +// if (placesDestination.isEmpty) { +// height = 0; +// update(); +// } +// height = 150; +// update(); +// } + +// changeHeightStartPlaces() { +// if (placesStart.isEmpty) { +// height = 0; +// update(); +// } +// height = 150; +// update(); +// } + +// changeHeightPlacesAll(int index) { +// if (placeListResponseAll[index].isEmpty) { +// height = 0; +// update(); +// } +// height = 150; +// update(); +// } + +// changeHeightPlaces1() { +// if (wayPoint1.isEmpty) { +// height = 0; +// update(); +// } +// height = 150; +// update(); +// } + +// changeHeightPlaces2() { +// if (wayPoint2.isEmpty) { +// height = 0; +// update(); +// } +// height = 150; +// update(); +// } + +// changeHeightPlaces3() { +// if (wayPoint3.isEmpty) { +// height = 0; +// update(); +// } +// height = 150; +// update(); +// } + +// changeHeightPlaces4() { +// if (wayPoint4.isEmpty) { +// height = 0; +// update(); +// } +// height = 150; +// update(); +// } + +// hidePlaces() { +// height = 0; + +// update(); +// } + +// /// تحويل نصف قطر بالكيلومتر إلى دلتا درجات عرض + +// // double _haversineKm(double lat1, double lon1, double lat2, double lon2) { +// // const R = 6371.0; // km +// // final dLat = (lat2 - lat1) * math.pi / 180.0; +// // final dLon = (lon2 - lon1) * math.pi / 180.0; +// // final a = math.sin(dLat / 2) * math.sin(dLat / 2) + +// // math.cos(lat1 * math.pi / 180.0) * +// // math.cos(lat2 * math.pi / 180.0) * +// // math.sin(dLon / 2) * +// // math.sin(dLon / 2); +// // final c = 2 * math.atan2(math.sqrt(a), math.sqrt(1 - a)); +// // return R * c; +// // } + +// /// تحويل نصف قطر بالكيلومتر إلى دلتا درجات عرض +// // double _kmToLatDelta(double km) => km / 111.0; + +// // /// تحويل نصف قطر بالكيلومتر إلى دلتا درجات طول (تعتمد على خط العرض) +// // double _kmToLngDelta(double km, double atLat) => +// // km / (111.320 * math.cos(atLat * math.pi / 180.0)).abs().clamp(1e-6, 1e9); + +// /// حساب درجة التطابق النصي (كل كلمة تبدأ بها الاسم = 2 نقاط، يحتويها = 1 نقطة) +// // double _relevanceScore(String name, String query) { +// // final n = name.toLowerCase(); +// // final parts = +// // query.toLowerCase().split(RegExp(r'\s+')).where((p) => p.length >= 2); +// // double s = 0.0; +// // for (final p in parts) { +// // if (n.startsWith(p)) { +// // s += 2.0; +// // } else if (n.contains(p)) { +// // s += 1.0; +// // } +// // } +// // return s; +// // } +// // الدالة الرئيسية لجلب الأماكن من السيرفر وترتيبها +// // انسخ هذه الدوال والصقها داخل كلاس الكنترولر الخاص بك + +// // ----------------------------------------------------------------- +// // --== الدالة الرئيسية للبحث ==-- +// // ----------------------------------------------------------------- +// /// الدالة الرئيسية لجلب الأماكن من السيرفر وترتيبها +// // انسخ هذه الدوال والصقها داخل كلاس الكنترولر الخاص بك + +// // ----------------------------------------------------------------- +// // --== الدالة الرئيسية للبحث ==-- +// // ----------------------------------------------------------------- +// /// الدالة الرئيسية لجلب الأماكن من السيرفر وترتيبها +// Future getPlaces() async { +// final q = placeDestinationController.text.trim(); +// if (q.isEmpty || q.length < 3) { +// placesDestination = []; +// update(); +// return; +// } + +// final lat = passengerLocation.latitude; +// final lng = passengerLocation.longitude; +// final country = CountryPolygons.getCountryName(passengerLocation); + +// try { +// final url = +// '${AppLink.searchGeocoding}?q=${Uri.encodeComponent(q)}&lat=$lat&lng=$lng&radius=15000&country=$country'; +// final response = await CRUD().getMapSaas(link: url); + +// if (response != null && response['results'] is List) { +// List results = List.from(response['results']); +// final List filteredResults = []; +// final Set seenPlaces = {}; + +// for (final p in results) { +// final name = p['name_ar'] ?? p['name'] ?? ''; +// final district = p['district'] ?? ''; +// final plat = p['latitude']?.toString() ?? '0'; +// final plng = p['longitude']?.toString() ?? '0'; + +// final dedupeKey = +// "${name.trim().toLowerCase()}_${district.trim().toLowerCase()}"; + +// if (!seenPlaces.contains(dedupeKey)) { +// seenPlaces.add(dedupeKey); + +// p['distanceKm'] = (p['distance'] as num).toDouble() / 1000.0; +// p['latitude'] = plat; +// p['longitude'] = plng; +// p['name'] = name; +// p['address'] = p['full_address'] ?? +// (district.isNotEmpty +// ? "$district، ${p['governorate'] ?? ''}" +// : (p['governorate'] ?? '')); + +// filteredResults.add(p); +// } +// } + +// placesDestination = filteredResults; +// update(); +// } +// } catch (e) { +// Log.print('Exception in getPlaces: $e'); +// } +// } + +// // ----------------------------------------------------------------- +// // --== دوال مساعدة ==-- +// // ----------------------------------------------------------------- + +// /// تحسب المسافة بين نقطتين بالكيلومتر (معادلة هافرساين) +// double _haversineKm(double lat1, double lon1, double lat2, double lon2) { +// const R = 6371.0; // نصف قطر الأرض بالكيلومتر +// final dLat = (lat2 - lat1) * (pi / 180.0); +// final dLon = (lon2 - lon1) * (pi / 180.0); +// final rLat1 = lat1 * (pi / 180.0); +// final rLat2 = lat2 * (pi / 180.0); + +// final a = sin(dLat / 2) * sin(dLat / 2) + +// cos(rLat1) * cos(rLat2) * sin(dLon / 2) * sin(dLon / 2); +// final c = 2 * atan2(sqrt(a), sqrt(1 - a)); +// return R * c; +// } + +// /// تحسب درجة تطابق بسيطة بين اسم المكان وكلمة البحث +// double _relevanceScore(String placeName, String query) { +// if (placeName.isEmpty || query.isEmpty) return 0.0; +// final pLower = placeName.toLowerCase(); +// final qLower = query.toLowerCase(); +// if (pLower.startsWith(qLower)) return 1.0; // تطابق كامل في البداية +// if (pLower.contains(qLower)) return 0.5; // تحتوي على الكلمة +// return 0.0; +// } + +// /// تحويل كيلومتر إلى فرق درجات لخط العرض +// double _kmToLatDelta(double km) { +// const kmInDegree = 111.32; +// return km / kmInDegree; +// } + +// /// تحويل كيلومتر إلى فرق درجات لخط الطول (يعتمد على خط العرض الحالي) +// double _kmToLngDelta(double km, double latitude) { +// const kmInDegree = 111.32; +// return km / (kmInDegree * cos(latitude * (pi / 180.0))); +// } + +// // var languageCode; + +// // // تحديد اللغة حسب الإدخال +// // if (RegExp(r'[a-zA-Z]').hasMatch(placeDestinationController.text)) { +// // languageCode = 'en'; +// // } else { +// // languageCode = 'ar'; +// // } + +// // final bool isTextEmpty = placeDestinationController.text.trim().isEmpty; +// // var key = Platform.isAndroid ? AK.mapAPIKEY : AK.mapAPIKEYIOS; +// // final Uri url = Uri.parse( +// // isTextEmpty +// // ? 'https://places.googleapis.com/v1/places:searchNearby?key=$key' +// // : 'https://places.googleapis.com/v1/places:searchText?key=$key', +// // ); +// // Log.print('url: $url'); +// // // بناء الجسم حسب نوع الطلب +// // final body = isTextEmpty +// // ? jsonEncode({ +// // "languageCode": languageCode, +// // "locationRestriction": { +// // "circle": { +// // "center": { +// // "latitude": passengerLocation.latitude, +// // "longitude": passengerLocation.longitude +// // }, +// // "radius": 40000 // 40 كم +// // } +// // }, +// // "maxResultCount": 10 +// // }) +// // : jsonEncode({ +// // "textQuery": placeDestinationController.text, +// // "languageCode": languageCode, +// // "maxResultCount": 10, +// // "locationBias": { +// // "circle": { +// // "center": { +// // "latitude": passengerLocation.latitude, +// // "longitude": passengerLocation.longitude +// // }, +// // "radius": 40000 +// // } +// // } +// // }); + +// // final headers = { +// // 'Content-Type': 'application/json', +// // 'X-Goog-Api-Key': AK.mapAPIKEY, +// // 'X-Goog-FieldMask': +// // 'places.displayName,places.formattedAddress,places.location' +// // }; + +// // try { +// // final response = await http.post(url, headers: headers, body: body); +// // Log.print('response: ${response.statusCode} - ${response.body}'); + +// // if (response.statusCode == 200) { +// // final data = jsonDecode(response.body); +// // placesDestination = data['places'] ?? []; +// // update(); +// // } else { +// // Log.print('Error: ${response.statusCode} - ${response.reasonPhrase}'); +// // } +// // } catch (e) { +// // Log.print('Exception: $e'); +// // } +// // } + +// getAIKey(String key) async { +// var res = +// await CRUD().get(link: AppLink.getapiKey, payload: {"keyName": key}); +// if (res != 'failure') { +// var d = jsonDecode(res)['message']; +// return d[key].toString(); +// } else {} +// } + +// Future getPlacesStart() async { +// final q = placeStartController.text.trim(); +// if (q.isEmpty || q.length < 3) { +// placesStart = []; +// update(); +// return; +// } + +// final lat = passengerLocation.latitude; +// final lng = passengerLocation.longitude; +// final country = CountryPolygons.getCountryName(passengerLocation); + +// try { +// final url = +// '${AppLink.searchGeocoding}?q=${Uri.encodeComponent(q)}&lat=$lat&lng=$lng&radius=15000&country=$country'; +// final response = await CRUD().getMapSaas(link: url); + +// if (response != null && response['results'] is List) { +// List list = List.from(response['results']); +// for (final p in list) { +// p['distanceKm'] = (p['distance'] as num).toDouble() / 1000.0; +// p['latitude'] = p['latitude'].toString(); +// p['longitude'] = p['longitude'].toString(); +// p['name'] = p['name_ar'] ?? p['name'] ?? ''; +// p['address'] = p['full_address'] ?? +// (p['district'] != null +// ? "${p['district']}، ${p['governorate'] ?? ''}" +// : (p['governorate'] ?? '')); +// } +// placesStart = list; +// update(); +// } +// } catch (e) { +// Log.print('Exception in getPlacesStart: $e'); +// } +// } + +// Future getPlacesListsWayPoint(int index) async { +// final q = wayPoint0Controller.text.trim(); +// if (q.length < 3) return; + +// final lat = passengerLocation.latitude; +// final lng = passengerLocation.longitude; +// final country = CountryPolygons.getCountryName(passengerLocation); + +// try { +// final url = +// '${AppLink.searchGeocoding}?q=${Uri.encodeComponent(q)}&lat=$lat&lng=$lng&radius=15000&country=$country'; +// final response = await CRUD().getMapSaas(link: url); + +// if (response != null && response['results'] is List) { +// List list = List.from(response['results']); +// for (final p in list) { +// p['distanceKm'] = (p['distance'] as num).toDouble() / 1000.0; +// p['latitude'] = p['latitude'].toString(); +// p['longitude'] = p['longitude'].toString(); +// p['name'] = p['name_ar'] ?? p['name'] ?? ''; +// p['address'] = p['full_address'] ?? +// (p['district'] != null +// ? "${p['district']}، ${p['governorate'] ?? ''}" +// : (p['governorate'] ?? '')); +// } +// wayPoint0 = list; +// placeListResponseAll[index] = list; +// update(); +// } +// } catch (e) { +// Log.print('Error fetching places in WayPoint: $e'); +// } +// } + +// // داخل MapPassengerController +// bool lowPerf = false; +// Timer? _camThrottle; +// DateTime _lastUiUpdate = DateTime.fromMillisecondsSinceEpoch(0); + +// Future detectPerfMode() async { +// try { +// if (GetPlatform.isAndroid) { +// final info = await DeviceInfoPlugin().androidInfo; +// final sdk = info.version.sdkInt ?? 0; +// final ram = info.availableRamSize ?? 0; +// lowPerf = (sdk < 28) || (ram > 0 && ram < 3 * 1024 * 1024 * 1024); +// } else { +// lowPerf = false; +// } +// } catch (_) { +// lowPerf = false; +// } +// update(); +// } + +// // تحديث الكاميرا بثروتل +// void onCameraMoveThrottled(CameraPosition pos) { +// _camThrottle?.cancel(); +// _camThrottle = Timer(const Duration(milliseconds: 160), () { +// Log.print('📸 onCameraMoveThrottled: ${pos.target}'); +// // ضع فقط المنطق الضروري هنا لتقليل الحمل +// int waypointsLength = Get.find().wayPoints.length; +// int index = wayPointIndex; +// if (waypointsLength > 0) { +// placesCoordinate[index] = +// '${pos.target.latitude},${pos.target.longitude}'; +// } +// newMyLocation = pos.target; +// }); +// } + +// // Removed legacy light polylines since MapLibre vectors handle high-point geometries natively. + +// Future savePlaceToServer( +// String latitude, String longitude, String name, String rate) async { +// var data = { +// 'latitude': latitude, +// 'longitude': longitude, +// 'name': name, +// 'rate': rate, +// }; + +// try { +// CRUD().post( +// link: AppLink.savePlacesServer, +// payload: data, +// ); +// } catch (e) { +// Log.print('Error: $e'); +// } +// } + +// Future getLocation() async { +// Log.print('🛰️ getLocation() called'); +// // Check if the app has permission to access location +// permissionGranted = await location.hasPermission(); +// if (permissionGranted == PermissionStatus.denied) { +// permissionGranted = await location.requestPermission(); +// if (permissionGranted != PermissionStatus.granted) { +// // Location permission is still not granted, handle the error +// return; +// } +// } + +// // Configure location accuracy +// // LocationAccuracy desiredAccuracy = LocationAccuracy.high; + +// // Get the current location with a timeout to prevent hanging UI +// LocationData? _locationData; +// try { +// _locationData = await location.getLocation().timeout( +// const Duration(seconds: 5), +// onTimeout: () { +// Log.print("⚠️ Location fetch timed out after 5s."); +// return LocationData.fromMap({ +// "latitude": passengerLocation.latitude, +// "longitude": passengerLocation.longitude, +// "speed": 0.0 +// }); +// }, +// ); +// } catch (e) { +// Log.print("⚠️ Error fetching location: $e"); +// } + +// if (_locationData == null) { +// isLoading = false; +// update(); +// return; +// } +// passengerLocation = +// (_locationData.latitude != null && _locationData.longitude != null +// ? LatLng(_locationData.latitude!, _locationData.longitude!) +// : null)!; +// // getLocationArea(passengerLocation.latitude, passengerLocation.longitude); +// // Log.print('AppLink.endPoint: ${AppLink.endPoint}'); +// // Log.print('BoxName.serverChosen: ${box.read(BoxName.serverChosen)}'); + +// newStartPointLocation = passengerLocation; +// newMyLocation = passengerLocation; + +// // Resolve current location address +// try { +// getReverseGeocoding(passengerLocation).then((address) { +// currentLocationString = address; +// update(); +// }); +// } catch (e) { +// Log.print('Error resolving current location: $e'); +// } + +// // Trigger offline map caching for a 10km radius +// OfflineMapService.instance +// .downloadRegion(passengerLocation, radiusKm: 10.0); + +// speed = _locationData.speed!; +// // //print location details +// isLoading = false; +// update(); +// } + +// void clearPolyline() { +// polyLines.clear(); +// update(); +// } + +// LatLngBounds calculateBounds(double lat, double lng, double radiusInMeters) { +// const double earthRadius = 6378137.0; // Earth's radius in meters + +// double latDelta = (radiusInMeters / earthRadius) * (180 / pi); +// double lngDelta = +// (radiusInMeters / (earthRadius * cos(pi * lat / 180))) * (180 / pi); + +// double minLat = lat - latDelta; +// double maxLat = lat + latDelta; + +// double minLng = lng - lngDelta; +// double maxLng = lng + lngDelta; + +// // Ensure the latitude is between -90 and 90 +// minLat = max(-90.0, minLat); +// maxLat = min(90.0, maxLat); + +// // Ensure the longitude is between -180 and 180 +// minLng = (minLng + 180) % 360 - 180; +// maxLng = (maxLng + 180) % 360 - 180; + +// // Ensure the bounds are in the correct order +// if (minLng > maxLng) { +// double temp = minLng; +// minLng = maxLng; +// maxLng = temp; +// } + +// return LatLngBounds( +// southwest: LatLng(minLat, minLng), +// northeast: LatLng(maxLat, maxLng), +// ); +// } + +// void onMapCreated(IntaleqMapController controller) { +// mapController = controller; +// update(); +// } + +// void onStyleLoaded() async { +// Log.print('🗺️ Intaleq Map Style Loaded. Initializing...'); +// isStyleLoaded = true; +// _loadMapIcons(); + +// // Smart Camera Reset logic: +// if (mapController != null) { +// if (markers.isNotEmpty && lastComputedBounds != null) { +// await _safeAnimateCameraBounds(lastComputedBounds); +// } else { +// mapController!.animateCamera( +// CameraUpdate.newLatLng(passengerLocation), +// ); +// } +// } +// update(); +// } + +// /// Safe wrapper for animateCamera Bounds to prevent native std::domain_error crash on iOS. +// Future _safeAnimateCameraBounds(LatLngBounds? bounds, +// {double left = 60, +// double top = 60, +// double right = 60, +// double bottom = 60}) async { +// if (bounds == null || mapController == null) return; + +// try { +// // Ensure the coordinates are valid +// if (bounds.northeast.latitude == bounds.southwest.latitude && +// bounds.northeast.longitude == bounds.southwest.longitude) { +// Log.print( +// '⚠️ _safeAnimateCameraBounds: Bounds are a single point, zooming to point instead.'); +// await mapController +// ?.animateCamera(CameraUpdate.newLatLngZoom(bounds.northeast, 15)); +// return; +// } + +// // Small delay to ensure iOS view layout is fully ready +// await Future.delayed(const Duration(milliseconds: 200)); + +// await mapController?.animateCamera( +// CameraUpdate.newLatLngBounds( +// bounds, +// left: left, +// top: top, +// right: right, +// bottom: bottom, +// ), +// ); +// } catch (e) { +// Log.print('❌ _safeAnimateCameraBounds CRASH PREVENTED: $e'); +// // Final fallback to prevent device freeze +// try { +// await mapController +// ?.animateCamera(CameraUpdate.newLatLngZoom(bounds.northeast, 14)); +// } catch (_) {} +// } +// } + +// Future _loadMapIcons() async { +// // Wait up to 3 seconds for the map style to finish loading +// for (int i = 0; i < 15; i++) { +// if (mapController != null && isStyleLoaded) break; +// await Future.delayed(const Duration(milliseconds: 200)); +// } + +// if (mapController == null || !isStyleLoaded) { +// Log.print( +// '⚠️ _loadMapIcons: mapController or style not ready. Icons may not load.'); +// } + +// await _addMapImage(startIcon, 'assets/images/A.png'); +// await _addMapImage(endIcon, 'assets/images/b.png'); +// await _addMapImage(carIcon, 'assets/images/car.png'); +// await _addMapImage(motoIcon, 'assets/images/moto.png'); +// await _addMapImage(ladyIcon, 'assets/images/lady.png'); +// await _addMapImage('picker_icon', 'assets/images/picker.png'); +// // Waypoint markers - use moto1 & lady1 as colored waypoint icons +// await _addMapImage('orange_marker', 'assets/images/moto1.png'); +// await _addMapImage('violet_marker', 'assets/images/lady1.png'); +// } + +// Future _addMapImage(String id, String path) async { +// try { +// final ByteData bytes = await rootBundle.load(path); +// // Resize car icons for better visibility on map (e.g. 120px) +// final size = _getImageSize(id); +// if (size != null && (id == carIcon || id == motoIcon || id == ladyIcon)) { +// final resized = await _resizeImage(bytes.buffer.asUint8List(), size); +// await mapController?.addImage(id, resized); +// Log.print( +// '✅ Successfully added resized map image: $id (${size}x${size})'); +// } else { +// await mapController?.addImage(id, bytes.buffer.asUint8List()); +// Log.print('✅ Successfully added map image: $id'); +// } +// } catch (e) { +// Log.print('❌ Error loading map icon $id: $e'); +// } +// } + +// int? _getImageSize(String id) { +// if (id == carIcon || id == motoIcon || id == ladyIcon) return 120; +// return null; +// } + +// Future _resizeImage(Uint8List bytes, int size) async { +// return await compute((Uint8List data) { +// final image = img.decodeImage(data); +// if (image == null) return data; +// final resized = img.copyResize(image, width: size, height: size); +// return Uint8List.fromList(img.encodePng(resized)); +// }, bytes); +// } + +// // Wait up to 3 seconds for the map style to finish loading + +// void updateCurrentLocationFromCamera(LatLng target) { +// Log.print('📍 updateCurrentLocationFromCamera: $target'); +// newMyLocation = target; + +// if (startLocationFromMap == true) { +// Log.print('📍 Updating startLocationFromMap to $target'); +// newStartPointLocation = target; +// } else if (passengerStartLocationFromMap == true) { +// Log.print('📍 Updating passengerStartLocationFromMap to $target'); +// newStartPointLocation = target; +// } + +// int waypointsLength = Get.find().wayPoints.length; +// if (waypointsLength > 0 && +// wayPointIndex >= 0 && +// wayPointIndex < placesCoordinate.length) { +// Log.print('📍 Updating wayPointIndex $wayPointIndex to $target'); +// placesCoordinate[wayPointIndex] = +// '${target.latitude},${target.longitude}'; +// } +// update(); +// } + +// String durationByPassenger = ''; +// late DateTime newTime1 = DateTime.now(); +// late DateTime timeFromDriverToPassenger = DateTime.now(); +// String distanceByPassenger = ''; +// late Duration durationFromDriverToPassenger; +// double nearestDistance = double.infinity; + +// Future getNearestDriverByPassengerLocation() async { +// if (!rideConfirm) { +// if (dataCarsLocationByPassenger != 'failure' && +// dataCarsLocationByPassenger != null && +// dataCarsLocationByPassenger['message'] != null && +// dataCarsLocationByPassenger['message'].length > 0) { +// double nearestDistance = double.infinity; // Initialize nearest distance +// CarLocation? nearestCar; + +// for (var i = 0; +// i < dataCarsLocationByPassenger['message'].length; +// i++) { +// var carLocation = dataCarsLocationByPassenger['message'][i]; +// // Log.print('carLocation: $carLocation'); + +// try { +// // Calculate distance between passenger's location and current driver's location +// final distance = Geolocator.distanceBetween( +// passengerLocation.latitude, +// passengerLocation.longitude, +// double.parse(carLocation['latitude']), +// double.parse(carLocation['longitude']), +// ); + +// // Calculate duration assuming an average speed of 25 km/h (adjust as needed) +// int durationToPassenger = (distance / 1000 / 25 * 3600).round(); +// // Log.print('distance: $distance'); +// // Log.print('durationToPassenger: $durationToPassenger'); +// // Log.print('passengerLocation: $passengerLocation'); +// // Log.print('carLocation: $carLocation'); +// // Log.print('distance: $distance meters'); +// // Log.print('durationToPassenger: $durationToPassenger seconds'); +// // Update the UI with the distance and duration for each car +// update(); + +// // If this distance is smaller than the nearest distance found so far, update nearestCar +// if (distance < nearestDistance) { +// nearestDistance = distance; + +// nearestCar = CarLocation( +// distance: distance, +// duration: durationToPassenger.toDouble(), +// id: carLocation['driver_id'], +// latitude: double.parse(carLocation['latitude']), +// longitude: double.parse(carLocation['longitude']), +// ); +// // Log.print('nearestCar: $nearestCar'); +// // Update the UI with the nearest driver +// update(); +// } +// } catch (e) { +// Log.print('Error calculating distance/duration: $e'); +// } +// } + +// // Return the nearest car found +// return nearestCar; +// } +// } + +// // Return null if no drivers are found or if ride is confirmed +// return null; +// } + +// getNearestDriverByPassengerLocationAPIGOOGLE() async { +// if (polyLines.isEmpty || data.isEmpty) { +// return null; // Early return if data is empty +// } +// if (!rideConfirm) { +// double nearestDistance = double.infinity; +// if (dataCarsLocationByPassenger != 'failure') { +// if (dataCarsLocationByPassenger['message'].length > 0) { +// for (var i = 0; +// i < dataCarsLocationByPassenger['message'].length; +// i++) { +// var carLocation = dataCarsLocationByPassenger['message'][i]; + +// // } +// // isloading = true; +// update(); +// // Make API request to get exact distance and duration +// String apiUrl = +// '${AppLink.googleMapsLink}distancematrix/json?destinations=${carLocation['latitude']},${carLocation['longitude']}&origins=${passengerLocation.latitude},${passengerLocation.longitude}&units=metric&key=${AK.mapAPIKEY}'; +// var response = await CRUD().getGoogleApi(link: apiUrl, payload: {}); +// if (response != null && response['status'] == "OK") { +// var data = response; +// // Extract distance and duration from the response and handle accordingly +// int distance1 = +// data['rows'][0]['elements'][0]['distance']['value']; +// distanceByPassenger = +// data['rows'][0]['elements'][0]['distance']['text']; +// durationToPassenger = +// data['rows'][0]['elements'][0]['duration']['value']; + +// durationFromDriverToPassenger = +// Duration(seconds: durationToPassenger.toInt()); +// newTime1 = currentTime.add(durationFromDriverToPassenger); +// timeFromDriverToPassenger = +// newTime1.add(Duration(minutes: 2.toInt())); +// durationByPassenger = +// data['rows'][0]['elements'][0]['duration']['text']; +// update(); +// if (distance1 < nearestDistance) { +// nearestDistance = distance1.toDouble(); + +// nearestCar = CarLocation( +// distance: distance1.toDouble(), +// duration: durationToPassenger.toDouble(), +// id: carLocation['driver_id'], +// latitude: double.parse(carLocation['latitude']), +// longitude: double.parse(carLocation['longitude']), +// ); +// // isloading = false; +// update(); +// } +// } + +// // Handle the distance and duration as needed +// else { +// // 'Failed to retrieve distance and duration: ${response['status']}'); +// Log.print('${response['status']}: ${response['status']}}'); +// // Handle the failure case +// } +// } +// } +// } +// } +// } + +// calculateDistanceBetweenPassengerAndDriverBeforeCancelRide() async { +// await getDriverCarsLocationToPassengerAfterApplied(); +// double distance = Geolocator.distanceBetween( +// passengerLocation.latitude, +// passengerLocation.longitude, +// driverCarsLocationToPassengerAfterApplied.last.latitude, +// driverCarsLocationToPassengerAfterApplied.last.longitude, +// ); +// if (distance > 500) { +// isCancelRidePageShown = true; +// update(); +// } else { +// Get.defaultDialog( +// barrierDismissible: false, +// title: 'The Driver Will be in your location soon .'.tr, +// middleText: 'The distance less than 500 meter.'.tr, +// confirm: Column( +// children: [ +// MyElevatedButton( +// kolor: AppColor.greenColor, +// title: 'Ok'.tr, +// onPressed: () { +// Get.back(); +// }, +// ), +// MyElevatedButton( +// kolor: AppColor.redColor, +// title: 'No, I want to cancel this trip'.tr, +// onPressed: () { +// Get.back(); +// MyDialog().getDialog( +// 'Attention'.tr, +// 'You will be charged for the cost of the driver coming to your location.' +// .tr, +// () async { +// Get.back(); +// Get.find() +// .payToDriverForCancelAfterAppliedAndHeNearYou(rideId); +// // isCancelRidePageShown = true; +// // update(); +// }, +// ); +// }, +// ), +// ], +// ), +// ); +// // cancel: MyElevatedButton( +// // title: 'No.Iwant Cancel Trip.'.tr, onPressed: () {})); +// } +// } + +// List headingAngles = []; +// double calculateAngleBetweenLocations(LatLng start, LatLng end) { +// double startLat = start.latitude * math.pi / 180; +// double startLon = start.longitude * math.pi / 180; +// double endLat = end.latitude * math.pi / 180; +// double endLon = end.longitude * math.pi / 180; + +// double dLon = endLon - startLon; + +// double y = math.sin(dLon) * cos(endLat); +// double x = cos(startLat) * math.sin(endLat) - +// math.sin(startLat) * cos(endLat) * cos(dLon); + +// double angle = math.atan2(y, x); +// double angleDegrees = angle * 180 / math.pi; + +// return angleDegrees; +// } + +// late LatLngBounds boundsData; +// late String startNameAddress = ''; +// late String endNameAddress = ''; +// List> stopPoints = []; +// void removeStop(Map stop) { +// stopPoints.remove(stop); +// update(); // Trigger a rebuild of the UI +// } + +// Future getReverseGeocoding(LatLng location) async { +// final lat = location.latitude; +// final lng = location.longitude; +// final url = '${AppLink.reverseGeocoding}?lat=$lat&lng=$lng'; + +// try { +// final response = await CRUD().getMapSaas(link: url); + +// if (response != null && response is List && response.isNotEmpty) { +// final data = response[0]; +// String name = data['name_ar'] ?? data['name'] ?? 'Unknown Location'.tr; +// return name; +// } +// return 'Unknown Location'.tr; +// } catch (e) { +// Log.print('ReverseGeocoding Exception: $e'); +// return 'Unknown Location'.tr; +// } +// } + +// bool isDrawingRoute = false; +// void showDrawingBottomSheet() { +// Log.print( +// '🔔 showDrawingBottomSheet called. isDrawingRoute: $isDrawingRoute'); + +// final context = Get.context; +// if (context == null) return; + +// WidgetsBinding.instance.addPostFrameCallback((_) { +// // Close any existing open dialogs first +// if (Get.isDialogOpen == true) { +// Get.back(); +// } + +// Get.dialog( +// Dialog( +// backgroundColor: Colors.transparent, +// elevation: 0, +// child: Container( +// padding: const EdgeInsets.all(24), +// width: 180, +// decoration: BoxDecoration( +// color: Colors.white.withOpacity(0.95), +// borderRadius: BorderRadius.circular(24), +// boxShadow: [ +// BoxShadow( +// color: Colors.black.withOpacity(0.15), +// blurRadius: 20, +// spreadRadius: 5, +// ) +// ], +// ), +// child: Column( +// mainAxisSize: MainAxisSize.min, +// mainAxisAlignment: MainAxisAlignment.center, +// crossAxisAlignment: CrossAxisAlignment.center, +// children: [ +// // App Logo +// Image.asset( +// 'assets/images/logo.gif', +// height: 64, +// errorBuilder: (context, error, stackTrace) => const Icon( +// Icons.map, +// size: 64, +// color: AppColor.primaryColor, +// ), +// ), +// const SizedBox(height: 16), +// const SizedBox( +// width: 24, +// height: 24, +// child: MyCircularProgressIndicator(), +// ), +// const SizedBox(height: 16), +// Text( +// 'Drawing route on map...'.tr, +// style: const TextStyle( +// fontWeight: FontWeight.bold, +// fontSize: 14, +// color: AppColor.primaryColor, +// ), +// textAlign: TextAlign.center, +// ), +// ], +// ), +// ), +// ), +// barrierDismissible: false, +// ); + +// // Auto-dismiss after exactly 2 seconds +// Future.delayed(const Duration(seconds: 2), () { +// if (Get.isDialogOpen == true) { +// Get.back(); +// } +// }); +// }); +// } + +// String dynamicApiUrl = 'https://routec.intaleq.xyz/route'; +// Future getDistanceFromDriverAfterAcceptedRide( +// String origin, String destination) async { +// String apiKey = Env.mapKeyOsm; // مفتاح API الخاص بك +// if (origin.isEmpty) { +// origin = '${passengerLocation.latitude},${passengerLocation.longitude}'; +// } +// // 2. بناء الرابط (URI) +// // Waypoints غير مدعومة حالياً في OSRM، لذلك تم تجاهلها +// var uri = Uri.parse( +// '$dynamicApiUrl?origin=$origin&destination=$destination&steps=false&overview=false'); +// Log.print('uri: $uri'); + +// // 3. إرسال الطلب مع الهيدر +// http.Response response; +// Map responseData; + +// try { +// response = await http.get( +// uri, +// headers: { +// 'X-API-KEY': apiKey, +// }, +// ).timeout(const Duration(seconds: 20)); // تايم آوت 20 ثانية + +// if (response.statusCode != 200) { +// Log.print('Error from API: ${response.statusCode}'); +// isLoading = false; +// update(); +// return; // خروج في حالة الخطأ +// } +// if (Get.isBottomSheetOpen ?? false) { +// Get.back(); // لإغلاق شاشة "جاري الرسم" +// } +// isDrawingRoute = false; // Reset state + +// responseData = json.decode(response.body); +// Log.print('responseData: $responseData'); + +// if (responseData['status'] != 'ok') { +// Log.print('API returned an error: ${responseData['message']}'); +// isLoading = false; +// update(); +// return; // خروج في حالة خطأ منطقي (مثل "no path") +// } +// } catch (e) { +// Log.print('Failed to get directions: $e'); +// isLoading = false; +// update(); +// return; // خروج عند فشل الاتصال +// } +// } + +// // (b = 1.5348) هو المعامل الذي تم حسابه من مقارنة 60 رحلة بين Google و OSRM +// double kDurationScalar = +// 1.5348; //this from colab 60 random locations from google and routec + +// // ----------------------------------------------------------------------------------------- +// // GET DIRECTION MAP (FULL) +// // ----------------------------------------------------------------------------------------- +// // ----------------------------------------------------------------------------------------- +// // GET DIRECTION MAP (With Auto-Retry Logic) +// // ----------------------------------------------------------------------------------------- +// // أضفنا attemptCount لتتبع عدد المحاولات +// // ----------------------------------------------------------------------------------------- +// // GET DIRECTION MAP (Retry or Fail Strict Logic) +// // ----------------------------------------------------------------------------------------- +// Future getDirectionMap(String origin, String destination, +// [List waypoints = const [], int attemptCount = 0]) async { +// // 1. إظهار التحميل فقط في المحاولة الأولى +// if (attemptCount == 0) { +// // NOTE: Do NOT set isLoading = true here! +// // isLoading destroys the MapLibreMap widget entirely (replaced by spinner), +// // which means markers/polylines cannot be added to the new map instance +// // until its style finishes loading asynchronously — causing a race condition. +// // The showDrawingBottomSheet() overlay provides sufficient user feedback. +// isDrawingRoute = true; +// update(); +// if (isDrawingRoute) showDrawingBottomSheet(); + +// await getCarsLocationByPassengerAndReloadMarker(); +// } + +// // تجهيز الإحداثيات +// if (origin.isEmpty) { +// origin = '${passengerLocation.latitude},${passengerLocation.longitude}'; +// } + +// var coordDestination = destination.split(','); +// double latDest = double.parse(coordDestination[0]); +// double lngDest = double.parse(coordDestination[1]); +// myDestination = LatLng(latDest, lngDest); + +// // ── 2. Unified SaaS Routing Strategy ────────────────────────── +// final bool isSaaSRequest = true; +// Uri uri; + +// var originCoords = origin.split(','); +// final Map queryParams = { +// 'fromLat': originCoords[0].trim(), +// 'fromLng': originCoords[1].trim(), +// 'toLat': latDest.toString(), +// 'toLng': lngDest.toString(), +// }; + +// // Add multi-stop waypoints to the query parameters +// for (int i = 0; i < activeMenuWaypointCount; i++) { +// final wp = menuWaypoints[i]; +// if (wp != null) { +// queryParams['stop${i + 1}Lat'] = wp.latitude.toString(); +// queryParams['stop${i + 1}Lng'] = wp.longitude.toString(); +// } +// } + +// uri = Uri.parse(AppLink.mapSaasRoute).replace(queryParameters: queryParams); + +// Log.print( +// 'Requesting Route URI (${isSaaSRequest ? "SaaS" : "OSRM"}, Attempt: ${attemptCount + 1}): $uri'); + +// http.Response response; +// Map responseData; + +// try { +// response = await http.get(uri, headers: { +// 'x-api-key': Env.mapSaasKey, +// }).timeout(const Duration(seconds: 20)); + +// responseData = json.decode(response.body); + +// // Validation: SaaS returns 200 with data, OSRM returns code: 'Ok' +// bool isRequestValid = response.statusCode == 200 && +// (isSaaSRequest || responseData['code'] == 'Ok'); + +// if (!isRequestValid) { +// if (attemptCount < 2) { +// await _retryProcess(origin, destination, waypoints, attemptCount); +// return; +// } +// _handleFatalError( +// "Server Error".tr, "Connection failed. Please try again.".tr); +// return; +// } + +// // ============================================================ +// // 🛑 الفحص الأمني (Sanity Check) +// // ============================================================ +// double apiDistanceMeters; +// String pointsString; +// dynamic routeData; + +// // SaaS parsing +// apiDistanceMeters = (responseData['distance'] as num).toDouble(); +// pointsString = responseData['points'] ?? ""; +// routeData = responseData; // For box storage + +// var originCoords = origin.split(','); +// double startLat = double.parse(originCoords[0]); +// double startLng = double.parse(originCoords[1]); + +// // المسافة الجوية +// double aerialDistance = +// Geolocator.distanceBetween(startLat, startLng, latDest, lngDest); + +// if (apiDistanceMeters < 50.0 && aerialDistance > 200.0) { +// Log.print( +// "⚠️ Suspicious Route detected! Server: $apiDistanceMeters m | Aerial: $aerialDistance m"); + +// if (attemptCount < 2) { +// Log.print("🔄 Retrying request (Attempt ${attemptCount + 2})..."); +// await Future.delayed(const Duration(seconds: 1)); +// await getDirectionMap( +// origin, destination, waypoints, attemptCount + 1); +// return; +// } else { +// Log.print("❌ All retries failed. Calculating Route is impossible."); +// _handleFatalError( +// "Route Not Found".tr, +// "We couldn't find a valid route to this destination. Please try selecting a different point." +// .tr); +// return; +// } +// } + +// // 3. معالجة البيانات +// box.remove(BoxName.tripData); +// box.write(BoxName.tripData, routeData); + +// durationToRide = +// ((routeData['duration'] as num) * kDurationScalar).toInt(); +// double distanceOfTrip = apiDistanceMeters / 1000.0; +// distance = distanceOfTrip; + +// data = routeData['legs'] != null && routeData['legs'].isNotEmpty +// ? (routeData['legs'][0]['steps'] ?? []) +// : []; + +// List decodedPoints = []; +// if (pointsString.isNotEmpty) { +// decodedPoints = await compute(decodePolylineIsolate, pointsString); +// } + +// if (decodedPoints.isEmpty) { +// _handleFatalError("Map Error".tr, "Received empty route data.".tr); +// return; +// } + +// polylineCoordinates.clear(); +// polylineCoordinates.addAll(decodedPoints); + +// final LatLng startLoc = polylineCoordinates.first; +// final LatLng endLoc = polylineCoordinates.last; + +// // ── 4. العناوين والتحديثات ────────────────────────────────── +// startNameAddress = responseData['startName'] ?? 'Start Point'.tr; +// endNameAddress = responseData['endName'] ?? 'Destination'.tr; +// Log.print('📍 ROUTE START: $startNameAddress'); +// Log.print('📍 ROUTE END: $endNameAddress'); + +// // ── 5. Bounds Calculation (SaaS bbox vs OSRM manual) ────────── +// if (isSaaSRequest && responseData['bbox'] != null) { +// List bbox = responseData['bbox']; +// if (bbox.length == 4) { +// // SaaS format: [minLng, minLat, maxLng, maxLat] +// lastComputedBounds = LatLngBounds( +// southwest: LatLng(bbox[1], bbox[0]), +// northeast: LatLng(bbox[3], bbox[2]), +// ); +// } +// } else { +// double? minLat, maxLat, minLng, maxLng; +// for (LatLng point in polylineCoordinates) { +// minLat = +// minLat == null ? point.latitude : min(minLat, point.latitude); +// maxLat = +// maxLat == null ? point.latitude : max(maxLat, point.latitude); +// minLng = +// minLng == null ? point.longitude : min(minLng, point.longitude); +// maxLng = +// maxLng == null ? point.longitude : max(maxLng, point.longitude); +// } +// if (minLat != null) { +// lastComputedBounds = LatLngBounds( +// northeast: LatLng(maxLat!, maxLng!), +// southwest: LatLng(minLat!, minLng!)); +// } +// } +// // isDrawingRoute = false; +// // 5b. Reset state when finished +// if (isDrawingRoute) { +// Log.print('🔔 Finalizing route drawing state'); +// isDrawingRoute = false; +// isLoading = false; +// update(); +// } + +// // 6. إضافة الماركرز +// durationToAdd = Duration(seconds: durationToRide); +// hours = durationToAdd.inHours; +// minutes = (durationToAdd.inMinutes % 60).round(); + +// markers = { +// Marker( +// markerId: const MarkerId('start'), +// position: startLoc, +// icon: InlqBitmap.fromStyleImage('orange_marker'), +// infoWindow: const InfoWindow(title: 'A'), +// anchor: const Offset(0.5, 1.0), +// ), +// Marker( +// markerId: const MarkerId('end'), +// position: endLoc, +// icon: InlqBitmap.fromStyleImage('violet_marker'), +// infoWindow: const InfoWindow(title: 'B'), +// anchor: const Offset(0.5, 1.0), +// ), +// }; + +// for (int i = 0; i < activeMenuWaypointCount; i++) { +// final wp = menuWaypoints[i]; +// if (wp != null) { +// final bool isFirstWaypoint = i == 0; +// markers.add(Marker( +// markerId: MarkerId('waypoint_$i'), +// position: wp, +// icon: InlqBitmap.fromStyleImage( +// isFirstWaypoint ? 'orange_marker' : 'violet_marker'), +// infoWindow: +// InfoWindow(title: isFirstWaypoint ? 'Stop 1' : 'Stop 2'), +// anchor: const Offset(0.5, 1.0), +// )); +// } +// } + +// // 7. رسم الخط +// if (polyLines.isNotEmpty) clearPolyline(); + +// rideConfirm = false; +// isMarkersShown = true; +// update(); // تحديث أولي لإظهار الخريطة والماركرز + +// // إظهار الباتم شيت للسعر +// await bottomSheet(); + +// // تشغيل الأنيميشن الخفيف لومضات المسار + fit camera after +// await _playRouteAnimation(polylineCoordinates, lastComputedBounds); +// } catch (e, stackTrace) { +// // 🚨 Cleanup on error to prevent UI freeze +// if (isDrawingRoute) { +// isDrawingRoute = false; +// isLoading = false; +// update(); +// } + +// Log.print('🚨 CRITICAL ERROR IN getDirectionMap: $e'); +// Log.print('🚨 STACKTRACE: $stackTrace'); + +// if (attemptCount < 2) { +// await _retryProcess(origin, destination, waypoints, attemptCount); +// } else { +// _handleFatalError("Connection Error".tr, +// "Please check your internet and try again.".tr); +// } +// } +// } + +// // --- رسم المسار النهائي مع تقسيم ملون حسب نقاط التوقف --- +// Future _playRouteAnimation( +// List coords, LatLngBounds? bounds) async { +// // Segment colors matching UI dots: green → amber → purple → red +// const List segmentColors = [ +// Color(0xFF109642), // Green (start → stop 1) +// Color(0xFFF59E0B), // Amber (stop 1 → stop 2) +// Color(0xFF7C3AED), // Purple (last segment → dest) +// Color(0xFFEF4444), // Red (fallback) +// ]; + +// // ── Build final polyline segments ─────────────────────────────────── +// // Build all segments in a temporary Set first, then assign once +// Set newPolylines = {}; + +// if (activeMenuWaypointCount > 0) { +// List splitIndices = []; +// for (int w = 0; w < activeMenuWaypointCount; w++) { +// final wp = menuWaypoints[w]; +// if (wp == null) continue; +// int bestIdx = 0; +// double bestDist = double.infinity; +// for (int j = 0; j < coords.length; j++) { +// final dx = coords[j].latitude - wp.latitude; +// final dy = coords[j].longitude - wp.longitude; +// final d = dx * dx + dy * dy; +// if (d < bestDist) { +// bestDist = d; +// bestIdx = j; +// } +// } +// splitIndices.add(bestIdx); +// } +// splitIndices.sort(); + +// List boundaries = [0, ...splitIndices, coords.length - 1]; +// for (int s = 0; s < boundaries.length - 1; s++) { +// int from = boundaries[s]; +// int to = boundaries[s + 1] + 1; +// if (to > coords.length) to = coords.length; +// if (from >= to - 1) continue; +// final segCoords = coords.sublist(from, to); +// if (segCoords.length < 2) continue; +// final color = segmentColors[s % segmentColors.length]; + +// newPolylines.add(Polyline( +// polylineId: PolylineId('segment_$s'), +// points: segCoords, +// color: color, +// width: 6, +// )); +// } +// } else { +// newPolylines.add(Polyline( +// polylineId: const PolylineId('route_primary'), +// points: coords, +// color: AppColor.primaryColor, +// width: 6, +// )); +// } + +// polyLines = newPolylines; +// update(); + +// Log.print( +// '🗺️ Drawing ${markers.length} markers + ${polyLines.length} polylines on map'); + +// update(); + +// // ── Fit camera to full route bounds ──────────────────────────────── +// if (bounds != null) { +// await _safeAnimateCameraBounds(bounds); +// } +// } + +// // --- دالة المساعدة لإعادة المحاولة --- +// Future _retryProcess(String origin, String dest, List waypoints, +// int currentAttempt) async { +// Log.print( +// "🔄 Exception or Error caught. Retrying in 1s... (Attempt ${currentAttempt + 1})"); +// await Future.delayed(const Duration(seconds: 1)); +// getDirectionMap(origin, dest, waypoints, currentAttempt + 1); +// } + +// // --- دالة جديدة لتنظيف الخريطة بالكامل ومنع تداخل الرحلات --- +// void resetAllMapStates() { +// Log.print('🧹 Resetting all map states to prevent sticky location bug'); + +// clearPlacesDestination(); +// clearPlacesStart(); +// clearPolyline(); +// data = []; + +// passengerStartLocationFromMap = false; +// startLocationFromMap = false; +// isPickerShown = false; +// workLocationFromMap = false; +// homeLocationFromMap = false; +// isAnotherOreder = false; +// isWhatsAppOrder = false; + +// // ✅ أضف هذا: reset الوجهة لموقع الراكب حتى لا تبقى قيمة الرحلة القديمة +// myDestination = passengerLocation; +// hintTextDestinationPoint = 'Select your destination'.tr; + +// placeDestinationController.clear(); +// placeStartController.clear(); + +// rideConfirm = false; +// shouldFetch = false; +// isDrawingRoute = false; +// isLoading = false; + +// update(); +// } + +// // ----------------------------------------------------------------------------------------- +// // 🛑 دالة الخطأ القاتل (تغلق كل شيء وتعيد المستخدم للخريطة) +// // ----------------------------------------------------------------------------------------- +// void _handleFatalError(String title, String message) { +// // 1. إغلاق شاشة التحميل (Drawing route...) +// if (Get.isBottomSheetOpen == true || Get.isDialogOpen == true) { +// Get.back(); +// } +// if (Get.isSnackbarOpen) Get.closeCurrentSnackbar(); + +// // 2. تصفير المتغيرات +// isDrawingRoute = false; +// isLoading = false; +// update(); + +// // 3. إظهار الديالوج الإجباري +// Get.defaultDialog( +// title: title, +// titleStyle: AppStyle.title.copyWith(color: AppColor.redColor), +// middleText: message, +// middleTextStyle: AppStyle.subtitle, +// barrierDismissible: false, // لا يمكن إغلاقه بالضغط خارجاً +// confirm: MyElevatedButton( +// title: "Close".tr, +// kolor: AppColor.redColor, +// onPressed: () { +// Get.back(); // إغلاق الديالوج + +// // 4. إعادة تحميل الصفحة بالكامل (تنظيف الحالة) +// // تأكد من استيراد MapPagePassenger +// Get.offAll(() => const MapPagePassenger()); +// }, +// ), +// ); +// } + +// // Legacy gradient and layered animations removed for MapLibre migration + +// String shortenAddress(String fullAddress) { +// // Split the address into parts +// List parts = fullAddress.split('،'); + +// // Remove any leading or trailing whitespace from each part +// parts = parts.map((part) => part.trim()).toList(); + +// // Remove any empty parts +// parts = parts.where((part) => part.isNotEmpty).toList(); + +// // Initialize the short address +// String shortAddress = ''; + +// if (parts.isNotEmpty) { +// // Add the first part (usually the most specific location) +// shortAddress += parts[0]; +// } + +// if (parts.length > 2) { +// // Add the district or area name (usually the third part in Arabic format) +// shortAddress += '، ${parts[2]}'; +// } else if (parts.length > 1) { +// // Add the second part for English or shorter addresses +// shortAddress += '، ${parts[1]}'; +// } + +// // Add the country (usually the last part) +// if (parts.length > 1) { +// shortAddress += '، ${parts.last}'; +// } + +// // Remove any part that's just numbers (like postal codes) +// shortAddress = shortAddress +// .split('،') +// .where((part) => !RegExp(r'^[0-9 ]+$').hasMatch(part.trim())) +// .join('،'); + +// // Check if the address is in English +// bool isEnglish = +// RegExp(r'^[a-zA-Z0-9 ]+$').hasMatch(shortAddress.replaceAll('،', '')); + +// if (isEnglish) { +// // Further processing for English addresses +// List englishParts = shortAddress.split('،'); +// if (englishParts.length > 2) { +// shortAddress = +// '${englishParts[0]}، ${englishParts[1]}، ${englishParts.last}'; +// } else if (englishParts.length > 1) { +// shortAddress = '${englishParts[0]}، ${englishParts.last}'; +// } +// } + +// return shortAddress; +// } + +// double distanceOfDestination = 0; +// bool haveSteps = false; +// late LatLng latestPosition; + +// getMapPoints(String originSteps, String destinationSteps, int index) async { +// isWayPointStopsSheetUtilGetMap = false; +// // haveSteps = true; +// // startCarLocationSearch(box.read(BoxName.carType)); +// await getCarsLocationByPassengerAndReloadMarker(); +// // await getCarsLocationByPassengerAndReloadMarker(); +// // isLoading = true; +// update(); +// var url = +// ('${AppLink.googleMapsLink}directions/json?&language=${box.read(BoxName.lang)}&avoid=tolls|ferries&destination=$destinationSteps&origin=$originSteps&key=${AK.mapAPIKEY}'); +// var response = await CRUD().getGoogleApi(link: url, payload: {}); + +// data = response['routes'][0]['legs']; +// // isLoading = false; + +// int durationToRide0 = data[0]['duration']['value']; +// durationToRide = durationToRide + durationToRide0; +// distance = distanceOfDestination + (data[0]['distance']['value']) / 1000; + +// update(); +// // final points = +// // decodePolyline(response["routes"][0]["overview_polyline"]["points"]); +// final String pointsString = +// response['routes'][0]["overview_polyline"]["points"]; + +// List decodedPoints = +// await compute(decodePolylineIsolate, pointsString); +// // decodePolyline(response["routes"][0]["overview_polyline"]["points"]); +// for (int i = 0; i < decodedPoints.length; i++) { +// polylineCoordinates.add(decodedPoints[i]); +// } +// // Define the northeast and southwest coordinates + +// if (polyLines.isEmpty) { +// var polyline = Polyline( +// polylineId: PolylineId('route_$index'), +// points: polylineCoordinatesPointsAll[index], +// width: 6, +// color: const Color(0xFF2196F3), +// ); + +// polyLines = {...polyLines, polyline}; +// rideConfirm = false; +// update(); +// } +// } + +// void updateCameraForDistanceAfterGetMap() { +// LatLng coord1 = LatLng( +// double.parse(coordinatesWithoutEmpty.first.split(',')[0]), +// double.parse(coordinatesWithoutEmpty.first.split(',')[1])); + +// LatLng coord2 = LatLng( +// double.parse(coordinatesWithoutEmpty.last.split(',')[0]), +// double.parse(coordinatesWithoutEmpty.last.split(',')[1])); + +// LatLng northeast; +// LatLng southwest; + +// if (coord1.latitude > coord2.latitude) { +// northeast = coord1; +// southwest = coord2; +// } else { +// northeast = coord2; +// southwest = coord1; +// } + +// // Create the LatLngBounds object +// LatLngBounds bounds = +// LatLngBounds(northeast: northeast, southwest: southwest); + +// // Fit the camera to the bounds +// var cameraUpdate = CameraUpdate.newLatLngBounds(bounds, +// left: 180, top: 180, right: 180, bottom: 180); +// mapController!.animateCamera(cameraUpdate); +// update(); +// } + +// int selectedIndex = -1; // Initialize with no selection +// void selectCarFromList(int index) { +// selectedIndex = index; // Update selected index +// carTypes.forEach( +// (element) => element.isSelected = false); // Reset selection flags +// carTypes[index].isSelected = true; +// update(); +// } + +// showBottomSheet1() async { +// await bottomSheet(); +// isBottomSheetShown = true; +// heightBottomSheetShown = 250; + +// update(); +// } + +// final promo = TextEditingController(); +// bool promoTaken = false; +// void applyPromoCodeToPassenger(BuildContext context) async { +// if (promoTaken == true) { +// MyDialog().getDialog( +// 'Promo Already Used'.tr, +// 'You have already used this promo code.'.tr, +// () => Get.back(), +// ); +// return; +// } + +// if (!promoFormKey.currentState!.validate()) return; + +// // العتبات بالليرة السورية +// const double minPromoLowSYP = 172; // Speed / Balash +// const double minPromoHighSYP = 200; // Comfort / Electric / Lady + +// try { +// final value = await CRUD().get( +// link: AppLink.getPassengersPromo, +// payload: {'promo_code': promo.text}, +// ); + +// if (value == 'failure') { +// MyDialog().getDialog( +// 'Promo Ended'.tr, +// 'The promotion period has ended.'.tr, +// () => Get.back(), +// ); +// return; +// } + +// // هل يوجد فئة مؤهلة أصلاً قبل الخصم؟ +// final bool eligibleNow = (totalPassengerSpeed >= minPromoLowSYP) || +// (totalPassengerBalash >= minPromoLowSYP) || +// (totalPassengerComfort >= minPromoHighSYP) || +// (totalPassengerElectric >= minPromoHighSYP) || +// (totalPassengerLady >= minPromoHighSYP); + +// if (!eligibleNow) { +// Get.snackbar( +// 'Lowest Price Achieved'.tr, +// 'Cannot apply further discounts.'.tr, +// backgroundColor: AppColor.yellowColor, +// ); +// return; +// } + +// final decode = jsonDecode(value); +// if (decode["status"] != "success") { +// MyDialog().getDialog( +// 'Promo Ended'.tr, +// 'The promotion period has ended.'.tr, +// () => Get.back(), +// ); +// return; +// } + +// Get.snackbar('Promo Code Accepted'.tr, '', +// backgroundColor: AppColor.greenColor); + +// final firstElement = decode["message"][0]; +// final int discountPercentage = +// int.tryParse(firstElement['amount'].toString()) ?? 0; + +// // قيمة المحفظة - قد تكون سالبة +// final double walletVal = double.tryParse( +// box.read(BoxName.passengerWalletTotal)?.toString() ?? '0') ?? +// 0.0; + +// final bool isWalletNegative = walletVal < 0; + +// // -------------------------- +// // دالة تُطبّق الخصم دون النزول تحت الحد الأدنى +// // -------------------------- +// double _applyDiscountPerTier({ +// required double fare, +// required double minThreshold, +// required bool isWalletNegative, +// }) { +// if (fare < minThreshold) return fare; // غير مؤهل أصلاً + +// final double discount = fare * (discountPercentage / 100.0); +// double result; + +// if (isWalletNegative) { +// double neg = (-1) * walletVal; // walletVal < 0 => neg positive +// result = fare + neg - discount; +// } else { +// result = fare - discount; +// } + +// // لا نسمح بالنزول دون الحد الأدنى +// if (result < minThreshold) { +// result = minThreshold; +// } + +// // ولا نسمح بمبلغ سالب +// return result.clamp(0.0, double.infinity); +// } + +// // Comfort +// totalPassengerComfort = _applyDiscountPerTier( +// fare: totalPassengerComfort, +// minThreshold: minPromoHighSYP, +// isWalletNegative: isWalletNegative, +// ); + +// // Electric +// totalPassengerElectric = _applyDiscountPerTier( +// fare: totalPassengerElectric, +// minThreshold: minPromoHighSYP, +// isWalletNegative: isWalletNegative, +// ); + +// // Lady +// totalPassengerLady = _applyDiscountPerTier( +// fare: totalPassengerLady, +// minThreshold: minPromoHighSYP, +// isWalletNegative: isWalletNegative, +// ); + +// // Speed +// totalPassengerSpeed = _applyDiscountPerTier( +// fare: totalPassengerSpeed, +// minThreshold: minPromoLowSYP, +// isWalletNegative: isWalletNegative, +// ); + +// // Balash +// totalPassengerBalash = _applyDiscountPerTier( +// fare: totalPassengerBalash, +// minThreshold: minPromoLowSYP, +// isWalletNegative: isWalletNegative, +// ); + +// // تعديل دخل السائق وفق نسبة الخصم +// totalDriver = totalDriver - (totalDriver * discountPercentage / 100.0); + +// promoTaken = true; +// update(); + +// // مؤثرات +// Confetti.launch( +// context, +// options: const ConfettiOptions(particleCount: 100, spread: 70, y: 0.6), +// ); + +// Get.back(); +// await Future.delayed(const Duration(milliseconds: 120)); +// } catch (e) { +// Get.snackbar('Error'.tr, e.toString(), +// backgroundColor: AppColor.redColor); +// } +// } + +// double getDistanceFromText(String distanceText) { +// // Remove any non-digit characters from the distance text +// String distanceValue = distanceText.replaceAll(RegExp(r'[^0-9.]+'), ''); + +// // Parse the extracted numerical value as a double +// double distance = double.parse(distanceValue); + +// return distance; +// } + +// double costForDriver = 0; +// double totalPassengerSpeed = 0; +// double totalPassengerBalash = 0; +// double totalPassengerElectric = 0; +// double totalPassengerLady = 0; +// double totalPassengerRayehGai = 0; +// double totalPassengerRayehGaiComfort = 0; +// double totalPassengerRayehGaiBalash = 0; +// Future bottomSheet() async { +// // if (data.isEmpty) return; + +// // === إعدادات عامة === +// const double minFareSYP = 160; // حد أدنى +// const double minBillableKm = 0.3; // حد أدنى للمسافة المفوترة +// const double ladyFlatAddon = 20; // إضافة ثابتة لـ Lady +// const double airportAddonSYP = 200; // إضافة المطار + +// // --- ⬇️ الإضافة الجديدة: إضافة حدود مطار دمشق ⬇️ --- +// const double damascusAirportBoundAddon = 1400; // إضافة المطار (حدود) +// // --- ⬆️ نهاية الإضافة ⬆️ --- + +// // كهرباء +// const double electricPerKmUplift = 4; // زيادة/كم +// const double electricFlatAddon = 10; // زيادة ثابتة + +// // Long Speed +// const double longSpeedThresholdKm = 40.0; +// const double longSpeedPerKm = 26.0; // Speed عند >40كم + +// // قواعد الرحلات البعيدة للدقائق (تعمل لكل الأوقات) +// const double mediumDistThresholdKm = 25.0; // >25كم +// const double longDistThresholdKm = 35.0; // >35كم +// const double longTripPerMin = 6.0; +// const int minuteCapMedium = 60; // سقف دقائق عند >25كم +// const int minuteCapLong = 80; // سقف دقائق عند >35كم +// const int freeMinutesLong = 10; // عفو 10 دقائق عند >35كم + +// // تخفيضات المسافات الكبيرة للفئات غير Speed +// const double extraReduction100 = 0.07; // +7% فوق تخفيض >40كم للرحلات >100كم +// const double maxReductionCap = 0.35; // سقف 35% كحد أقصى + +// // ====== زمن الرحلة ====== +// durationToAdd = Duration(seconds: durationToRide); +// hours = durationToAdd.inHours; +// minutes = (durationToAdd.inMinutes % 60).round(); +// final DateTime currentTime = DateTime.now(); +// newTime = currentTime.add(durationToAdd); +// averageDuration = (durationToRide / 60) / distance; +// // +5 minutes per waypoint stop surcharge +// final int waypointSurchargeMinutes = activeMenuWaypointCount * 5; +// final int totalMinutes = +// (durationToRide / 60).floor() + waypointSurchargeMinutes; + +// // ====== أدوات مساعدة ====== +// bool _isAirport(String s) { +// final t = s.toLowerCase(); +// return t.contains('airport') || +// s.contains('مطار') || +// s.contains('المطار'); +// } + +// bool _isClub(String s) { +// final t = s.toLowerCase(); +// return t.contains('club') || +// t.contains('nightclub') || +// t.contains('night club') || +// s.contains('ديسكو') || +// s.contains('ملهى ليلي'); +// } + +// // --- ⬇️ الإضافة الجديدة: دالة التحقق من حدود المطار ⬇️ --- +// // (P1: 33.415313, 36.499687) (P2: 33.400265, 36.531505) +// bool _isInsideDamascusAirportBounds(double lat, double lng) { +// final double northLat = 33.415313; +// final double southLat = 33.400265; +// final double eastLng = 36.531505; +// final double westLng = 36.499687; + +// // التحقق من خط العرض (بين الشمال والجنوب) +// bool isLatInside = (lat <= northLat) && (lat >= southLat); +// // التحقق من خط الطول (بين الشرق والغرب) +// bool isLngInside = (lng <= eastLng) && (lng >= westLng); + +// return isLatInside && isLngInside; +// } +// // --- ⬆️ نهاية الإضافة ⬆️ --- + +// // أسعار الدقيقة من السيرفر +// final double naturePerMin = naturePrice; // طبيعي +// final double latePerMin = latePrice; // ليل +// final double heavyPerMin = heavyPrice; // ذروة + +// // سعر الدقيقة حسب الوقت (أساس قبل قواعد المسافة) +// double _perMinuteByTime(DateTime now, bool clubCtx) { +// final h = now.hour; +// if (h >= 21 || h < 1) return latePerMin; // ليل +// if (h >= 1 && h < 5) return clubCtx ? (latePerMin * 2) : latePerMin; +// if (h >= 14 && h <= 17) return heavyPerMin; // ذروة +// return naturePerMin; // طبيعي +// } + +// // حد أدنى +// double _applyMinFare(double fare) => +// (fare < minFareSYP) ? minFareSYP : fare; + +// // عمولة الراكب (kazan من السيرفر) +// double _withCommission(double base) => +// (base * (1 + kazan / 100)).ceilToDouble(); + +// // ====== سياق ====== +// final bool airportCtx = +// _isAirport(startNameAddress) || _isAirport(endNameAddress); +// final bool clubCtx = _isClub(startNameAddress) || _isClub(endNameAddress); + +// // --- ⬇️ الإضافة الجديدة: التحقق من سياق حدود المطار ⬇️ --- +// // !! ⚠️ تأكد من أن هذه هي المتغيرات الصحيحة لإحداثيات نقطة النهاية !! +// double destLat = 0.0; +// double destLng = 0.0; +// try { +// destLat = myDestination.latitude; +// destLng = myDestination.longitude; +// } catch (_) { +// if (coordinatesWithoutEmpty.isNotEmpty) { +// destLat = +// double.tryParse(coordinatesWithoutEmpty.last.split(',')[0]) ?? 0.0; +// destLng = +// double.tryParse(coordinatesWithoutEmpty.last.split(',')[1]) ?? 0.0; +// } +// } + +// final bool damascusAirportBoundCtx = _isInsideDamascusAirportBounds( +// destLat, +// destLng, +// ); +// final bool isInDamascusAirportBoundCtx = _isInsideDamascusAirportBounds( +// newMyLocation.latitude.toDouble(), // <-- ⚠️ غيّر هذا للمتغير الصحيح +// newMyLocation.longitude.toDouble(), // <-- ⚠️ غيّر هذا للمتغير الصحيح +// ); +// // --- ⬆️ نهاية الإضافة ⬆️ --- + +// // ====== مسافة مفوترة ====== +// final double billableDistance = +// (distance < minBillableKm) ? minBillableKm : distance; + +// // ====== Speed (قصير/طويل) ====== +// final bool isLongSpeed = billableDistance > longSpeedThresholdKm; +// final double perKmSpeedBaseFromServer = +// speedPrice; // مثال: 2900 يأتي من السيرفر +// final double perKmSpeed = +// isLongSpeed ? longSpeedPerKm : perKmSpeedBaseFromServer; + +// // ====== تخفيضات الفئات الأخرى حسب بُعد الرحلة ====== +// // ... (الكود كما هو) ... +// double reductionPct40 = 0.0; +// if (perKmSpeedBaseFromServer > 0) { +// reductionPct40 = (1.0 - (longSpeedPerKm / perKmSpeedBaseFromServer)) +// .clamp(0.0, maxReductionCap); +// } +// final double reductionPct100 = +// (reductionPct40 + extraReduction100).clamp(0.0, maxReductionCap); +// double distanceReduction = 0.0; +// if (billableDistance > 100.0) { +// distanceReduction = reductionPct100; +// } else if (billableDistance > 40.0) { +// distanceReduction = reductionPct40; +// } + +// // ====== منطق الدقيقة يعمل لكل الأوقات ويتكيّف مع المسافة ====== +// // ... (الكود كما هو) ... +// double effectivePerMin = _perMinuteByTime(currentTime, clubCtx); +// int billableMinutes = totalMinutes; +// if (billableDistance > longDistThresholdKm) { +// effectivePerMin = longTripPerMin; +// final int capped = +// (billableMinutes > minuteCapLong) ? minuteCapLong : billableMinutes; +// billableMinutes = capped - freeMinutesLong; +// if (billableMinutes < 0) billableMinutes = 0; +// } else if (billableDistance > mediumDistThresholdKm) { +// effectivePerMin = longTripPerMin; +// billableMinutes = (billableMinutes > minuteCapMedium) +// ? minuteCapMedium +// : billableMinutes; +// } + +// // ====== أسعار/كم قبل التخفيض ====== +// // ... (الكود كما هو) ... +// final double perKmComfortRaw = comfortPrice; +// final double perKmDelivery = deliveryPrice; +// final double perKmVanRaw = +// (familyPrice > 0 ? familyPrice : (speedPrice + 13)); +// final double perKmElectricRaw = perKmComfortRaw + electricPerKmUplift; + +// // ====== تطبيق التخفيضات على الفئات (نفس نسبة Speed للبعيد) ====== +// // ... (الكود كما هو) ... +// double perKmComfort = perKmComfortRaw * (1.0 - distanceReduction); +// double perKmElectric = perKmElectricRaw * (1.0 - distanceReduction); +// double perKmVan = perKmVanRaw * (1.0 - distanceReduction); +// perKmComfort = perKmComfort.clamp(0, double.infinity); +// perKmElectric = perKmElectric.clamp(0, double.infinity); +// perKmVan = perKmVan.clamp(0, double.infinity); +// final double perKmBalash = (perKmSpeed - 5).clamp(0, double.infinity); + +// // ====== دوال الاحتساب ====== +// double _oneWayFare({ +// required double perKm, +// required bool isLady, +// double flatAddon = 0, +// }) { +// double fare = billableDistance * perKm; +// fare += +// billableMinutes * effectivePerMin; // دقائق بعد السقف/العفو إن وُجد +// fare += flatAddon; +// if (isLady) fare += ladyFlatAddon; +// if (airportCtx) fare += airportAddonSYP; + +// // --- ⬇️ الإضافة الجديدة: تطبيق إضافة حدود المطار ⬇️ --- +// if (damascusAirportBoundCtx || isInDamascusAirportBoundCtx) { +// fare += damascusAirportBoundAddon; +// } +// // --- ⬆️ نهاية الإضافة ⬆️ --- + +// return _applyMinFare(fare); +// } + +// double _roundTripFare({required double perKm}) { +// // خصم 40% لمسافة إياب واحدة + زمن مضاعف (بنفس قواعد الدقيقة المعدّلة) +// double distPart = +// (billableDistance * 2 * perKm) - ((billableDistance * perKm) * 0.4); +// double timePart = (billableMinutes * 2) * effectivePerMin; +// double fare = distPart + timePart; +// if (airportCtx) fare += airportAddonSYP; + +// // --- ⬇️ الإضافة الجديدة: تطبيق إضافة حدود المطار ⬇️ --- +// // تنطبق أيضاً على رحلات الذهاب والعودة لأنها "تصل" إلى الوجهة +// if (damascusAirportBoundCtx || isInDamascusAirportBoundCtx) { +// fare += damascusAirportBoundAddon; +// } +// // --- ⬆️ نهاية الإضافة ⬆️ --- + +// return _applyMinFare(fare); +// } + +// // ====== حساب كل الفئات (Base قبل العمولة) ====== +// final double costSpeed = _oneWayFare(perKm: perKmSpeed, isLady: false); +// final double costBalash = _oneWayFare(perKm: perKmBalash, isLady: false); +// final double costComfort = _oneWayFare(perKm: perKmComfort, isLady: false); +// final double costElectric = _oneWayFare( +// perKm: perKmElectric, isLady: false, flatAddon: electricFlatAddon); +// final double costDelivery = +// _oneWayFare(perKm: perKmDelivery, isLady: false); +// final double costLady = _oneWayFare( +// perKm: perKmComfort, +// isLady: true); // Lady تعتمد Comfort بعد التخفيض + إضافة ثابتة +// final double costVan = _oneWayFare(perKm: perKmVan, isLady: false); +// final double costRayehGai = _roundTripFare(perKm: perKmSpeed); +// final double costRayehGaiComfort = _roundTripFare(perKm: perKmComfort); +// final double costRayehGaiBalash = _roundTripFare(perKm: perKmBalash); + +// // ====== أسعار الراكب بعد العمولة (kazan من السيرفر) ====== +// totalPassengerSpeed = _withCommission(costSpeed); +// totalPassengerBalash = _withCommission(costBalash); +// totalPassengerComfort = _withCommission(costComfort); +// totalPassengerElectric = _withCommission(costElectric); +// totalPassengerLady = _withCommission(costLady); +// totalPassengerScooter = _withCommission(costDelivery); +// totalPassengerVan = _withCommission(costVan); +// totalPassengerRayehGai = _withCommission(costRayehGai); +// totalPassengerRayehGaiComfort = _withCommission(costRayehGaiComfort); +// totalPassengerRayehGaiBalash = _withCommission(costRayehGaiBalash); + +// // افتراضي للعرض +// totalPassenger = totalPassengerSpeed; +// totalCostPassenger = totalPassenger; + +// // ====== دعم رصيد محفظة سلبي ====== +// try { +// final walletStr = box.read(BoxName.passengerWalletTotal).toString(); +// final walletVal = double.tryParse(walletStr) ?? 0.0; +// if (walletVal < 0) { +// final neg = (-1) * walletVal; +// totalPassenger += neg; +// totalPassengerComfort += neg; +// totalPassengerElectric += neg; +// totalPassengerLady += neg; +// totalPassengerBalash += neg; +// totalPassengerScooter += neg; +// totalPassengerRayehGai += neg; +// totalPassengerRayehGaiComfort += neg; +// totalPassengerRayehGaiBalash += neg; +// totalPassengerVan += neg; +// } +// } catch (e) { +// Log.print("Error: $e"); +// } + +// update(); +// changeBottomSheetShown(forceValue: true); +// } + +// List polylineCoordinate = []; +// String? cardNumber; +// void readyWayPoints() { +// hintTextwayPointStringAll = [ +// hintTextwayPoint0, +// hintTextwayPoint1, +// hintTextwayPoint2, +// hintTextwayPoint3, +// hintTextwayPoint4, +// ]; +// polylineCoordinatesPointsAll = [ +// polylineCoordinates0, +// polylineCoordinates1, +// polylineCoordinates2, +// polylineCoordinates3, +// polylineCoordinates4, +// ]; +// allTextEditingPlaces = [ +// wayPoint0Controller, +// wayPoint1Controller, +// wayPoint2Controller, +// wayPoint3Controller, +// wayPoint4Controller, +// ]; +// currentLocationToFormPlacesAll = [ +// currentLocationToFormPlaces0, +// currentLocationToFormPlaces1, +// currentLocationToFormPlaces2, +// currentLocationToFormPlaces3, +// currentLocationToFormPlaces4, +// ]; +// placeListResponseAll = [ +// wayPoint0, +// wayPoint1, +// wayPoint2, +// wayPoint3, +// wayPoint4 +// ]; +// startLocationFromMapAll = [ +// startLocationFromMap0, +// startLocationFromMap1, +// startLocationFromMap2, +// startLocationFromMap3, +// startLocationFromMap4, +// ]; +// currentLocationStringAll = [ +// currentLocationString0, +// currentLocationString1, +// currentLocationString2, +// currentLocationString3, +// currentLocationString4, +// ]; +// placesCoordinate = [ +// placesCoordinate0, +// placesCoordinate1, +// placesCoordinate2, +// placesCoordinate3, +// placesCoordinate4, +// ]; +// update(); +// } + +// List driversForMishwari = []; + +// Future selectDriverAndCarForMishwariTrip() async { +// // Calculate the bounds for 12km range +// double latitudeOffset = 0.1; // 20km range in latitude +// double longitudeOffset = 0.12; // 20km range in longitude + +// // Calculate bounding box based on passenger's location +// double southwestLat = passengerLocation.latitude - latitudeOffset; +// double northeastLat = passengerLocation.latitude + latitudeOffset; +// double southwestLon = passengerLocation.longitude - longitudeOffset; +// double northeastLon = passengerLocation.longitude + longitudeOffset; + +// // Create the payload with calculated bounds +// var payload = { +// 'southwestLat': southwestLat.toString(), +// 'northeastLat': northeastLat.toString(), +// 'southwestLon': southwestLon.toString(), +// 'northeastLon': northeastLon.toString(), +// }; + +// try { +// // Fetch data from the API +// var res = await CRUD().get( +// link: AppLink.selectDriverAndCarForMishwariTrip, payload: payload); + +// if (res != 'failure') { +// // Check if response is valid JSON +// try { +// var d = jsonDecode(res); +// driversForMishwari = d['message']; +// Log.print('driversForMishwari: $driversForMishwari'); +// update(); +// } catch (e) { +// // Handle invalid JSON format +// Log.print("Error decoding JSON: $e"); +// return 'Server returned invalid data. Please try again later.'; +// } +// } else { +// return 'No driver available now, try again later. Thanks for using our app.' +// .tr; +// } +// } catch (e) { +// // Handle network or other exceptions +// Log.print("Error fetching data: $e"); +// return 'There was an issue connecting to the server. Please try again later.' +// .tr; +// } +// } + +// final Rx selectedDateTime = DateTime.now().obs; + +// void updateDateTime(DateTime newDateTime) { +// selectedDateTime.value = newDateTime; +// } + +// Future mishwariOption() async { +// isLoading = true; +// update(); +// // add dialoug for select driver and car +// await selectDriverAndCarForMishwariTrip(); +// Future.delayed(Duration.zero); +// isLoading = false; +// update(); +// Get.to(() => CupertinoDriverListWidget()); + +// // changeCashConfirmPageShown(); +// } + +// var driverIdVip = ''; +// Future saveTripData( +// Map driver, DateTime tripDateTime) async { +// try { +// // Prepare trip data +// Map tripData = { +// 'id': driver['driver_id'].toString(), // Ensure the id is a string +// 'phone': driver['phone'], +// 'gender': driver['gender'], +// 'name': driver['NAME'], +// 'name_english': driver['name_english'], +// 'address': driver['address'], +// 'religion': driver['religion'] ?? 'UnKnown', +// 'age': driver['age'].toString(), // Convert age to String +// 'education': driver['education'] ?? 'UnKnown', //startlocationname +// 'license_type': driver['license_type'] ?? 'UnKnown', +// 'national_number': driver['national_number'] ?? 'UnKnown', +// 'car_plate': driver['car_plate'], +// 'make': driver['make'], +// 'model': driver['model'], +// 'year': driver['year'].toString(), // Convert year to String +// 'color': driver['color'], +// 'color_hex': driver['color_hex'], +// 'displacement': driver['displacement'], +// 'fuel': driver['fuel'], +// 'token': driver['token'], +// 'rating': driver['rating'].toString(), // Convert rating to String +// 'countRide': +// driver['ride_count'].toString(), // Convert countRide to String +// 'passengerId': box.read(BoxName.passengerID), +// 'timeSelected': tripDateTime.toIso8601String(), +// 'status': 'pending', +// 'startNameAddress': startNameAddress.toString(), +// 'locationCoordinate': +// '${data[0]["start_location"]['lat']},${data[0]["start_location"]['lng']}', +// }; +// Log.print('tripData: $tripData'); + +// // Send data to server +// var response = +// await CRUD().post(link: AppLink.addMishwari, payload: tripData); +// // Log.print('response: $response'); + +// if (response != 'failure') { +// // Trip saved successfully +// // Get.snackbar('Success'.tr, 'Trip booked successfully'.tr); +// var id = response['message']['id'].toString(); +// await CRUD() +// .post(link: '${AppLink.server}/ride/rides/add.php', payload: { +// "start_location": +// '${data[0]["start_location"]['lat']},${data[0]["start_location"]['lng']}', +// "end_location": +// '${data[0]["start_location"]['lat']},${data[0]["start_location"]['lng']}', +// "date": DateTime.now().toString(), +// "time": DateTime.now().toString(), +// "endtime": DateTime.now().add(const Duration(hours: 2)).toString(), +// "price": '50', +// "passenger_id": box.read(BoxName.passengerID).toString(), +// "driver_id": driver['driver_id'].toString(), +// "status": "waiting", +// 'carType': 'vip', +// "price_for_driver": '50', +// "price_for_passenger": '50', +// "distance": '20', +// "paymentMethod": 'cash', +// }).then((value) { +// if (value is String) { +// final parsedValue = jsonDecode(value); +// rideId = parsedValue['message']; +// } else if (value is Map) { +// rideId = value['message']; +// } else { +// Log.print('Unexpected response type: ${value.runtimeType}'); +// } +// }); + +// driverIdVip = driver['driver_id'].toString(); +// driverId = driver['driver_id'].toString(); + +// DateTime timeSelected = DateTime.parse(tripDateTime.toIso8601String()); +// Get.find().scheduleNotificationsForTimeSelected( +// "Your trip is scheduled".tr, +// "Don't forget your ride!".tr, +// "tone1", +// timeSelected); + +// await NotificationService.sendNotification( +// category: 'OrderVIP', +// target: driver['token'].toString(), +// title: 'OrderVIP'.tr, +// body: '$rideId - VIP Trip', +// isTopic: false, // Important: this is a token +// tone: 'tone1', +// driverList: [ +// id, +// rideId, +// driver['id'], +// passengerLocation.latitude.toString(), +// startNameAddress.toString(), +// passengerLocation.longitude.toString(), +// (box.read(BoxName.name).toString().split(' ')[0]).toString(), +// box.read(BoxName.passengerID).toString(), +// box.read(BoxName.phone).toString(), +// box.read(BoxName.email).toString(), +// box.read(BoxName.passengerPhotoUrl).toString(), +// box.read(BoxName.tokenFCM).toString(), +// (driver['token'].toString()), +// ], +// ); +// if (response['message'] == "Trip updated successfully") { +// mySnackbarSuccess("Trip updated successfully".tr); +// Log.print( +// 'previous_driver_token: ${response['previous_driver_token']}'); + +// await NotificationService.sendNotification( +// category: 'Order VIP Canceld', +// target: response['previous_driver_token'].toString(), +// title: 'Order VIP Canceld'.tr, +// body: 'Passenger cancel order'.tr, +// isTopic: false, // Important: this is a token +// tone: 'cancel', +// driverList: [], +// ); +// } +// // data = []; +// isBottomSheetShown = false; +// update(); +// Get.to(() => VipWaittingPage()); +// } else { +// throw Exception('Failed to save trip'); +// } +// } catch (e) { +// // Show error message with more details for debugging +// Get.snackbar('Error'.tr, 'Failed to book trip: $e'.tr, +// backgroundColor: AppColor.redColor); +// Log.print('Error: $e'); +// } +// } + +// Future cancelVip(String token, tripId) async { +// var res = await CRUD() +// .post(link: AppLink.cancelMishwari, payload: {'id': tripId}); +// if (res != 'failur') { +// Get.back(); +// mySnackbarSuccess('You canceled VIP trip'.tr); +// } +// } + +// void sendToDriverAgain(String token) { +// NotificationService.sendNotification( +// category: 'Order VIP Canceld', +// target: token.toString(), +// title: 'Order VIP Canceld'.tr, +// body: 'Passenger cancel order'.tr, +// isTopic: false, // Important: this is a token +// tone: 'cancel', +// driverList: [], +// ); +// } + +// // دالة الفحص عند بدء التطبيق +// Future detectAndCacheDeviceTier() async { +// // 1. استخدام الكلاس الذي أنشأناه سابقاً للفحص +// bool isHighEnd = await DevicePerformanceManager.isHighEndDevice(); + +// // 2. طباعة النتيجة للتأكد +// Log.print("Device Analysis - Is Flagship/HighEnd? $isHighEnd"); + +// // 3. تخزين النتيجة بشكل منطقي صحيح +// // إذا كان الجهاز قوياً (true)، فإن وضع الـ LowEnd يكون (false) +// // والعكس صحيح +// box.write(BoxName.lowEndMode, !isHighEnd); +// } + +// initilizeGetStorage() async { +// if (box.read(BoxName.addWork) == null) { +// box.write(BoxName.addWork, 'addWork'); +// } +// if (box.read(BoxName.addHome) == null) { +// box.write(BoxName.addHome, 'addHome'); +// } +// if (box.read(BoxName.lowEndMode) == null) { +// detectAndCacheDeviceTier(); +// } +// } + +// late List recentPlaces = []; + +// getFavioratePlaces() async { +// recentPlaces = await sql.getCustomQuery( +// 'SELECT * FROM ${TableName.recentLocations} ORDER BY createdAt DESC'); +// // Log.print('recentPlaces: ${recentPlaces}'); +// } + +// double passengerRate = 5; +// double comfortPrice = 45; +// double speedPrice = 40; +// double mashwariPrice = 40; +// double familyPrice = 55; +// double deliveryPrice = 1.2; +// double minFareSYP = 16000; // حد أدنى للأجرة (سوريا) +// double minBillableKm = 1.0; // حد أدنى للمسافة المفوترة +// double commissionPct = 15; // عمولة التطبيق % (راكب) + +// getKazanPercent() async { +// var res = await CRUD().get( +// link: AppLink.getKazanPercent, +// payload: {'country': box.read(BoxName.countryCode).toString()}, +// ); +// if (res != 'failure') { +// var json = jsonDecode(res); +// // التحقق الديناميكي من 'data' أو 'message' +// var dataList = json['data'] ?? json['message']; + +// if (dataList != null && dataList is List && dataList.isNotEmpty) { +// var firstRow = dataList[0]; +// kazan = double.parse(firstRow['kazan'].toString()); +// naturePrice = double.parse(firstRow['naturePrice'].toString()); +// heavyPrice = double.parse(firstRow['heavyPrice'].toString()); +// latePrice = double.parse(firstRow['latePrice'].toString()); +// comfortPrice = double.parse(firstRow['comfortPrice'].toString()); +// speedPrice = double.parse(firstRow['speedPrice'].toString()); +// deliveryPrice = double.parse(firstRow['deliveryPrice'].toString()); +// mashwariPrice = double.parse(firstRow['freePrice'].toString()); +// familyPrice = double.parse(firstRow['familyPrice'].toString()); +// fuelPrice = double.parse(firstRow['fuelPrice'].toString()); +// } +// } +// } + +// getPassengerRate() async { +// var res = await CRUD().get( +// link: AppLink.getPassengerRate, +// payload: {'passenger_id': box.read(BoxName.passengerID)}); +// if (res != 'failure') { +// var json = jsonDecode(res); +// var message = json['data'] ?? json['message']; +// if (message['rating'] == null) { +// passengerRate = 5.0; // Default rating +// } else { +// // Safely parse the rating to double +// var rating = message['rating']; +// if (rating is String) { +// passengerRate = +// double.tryParse(rating) ?? 5.0; // Default if parsing fails +// } else if (rating is num) { +// passengerRate = +// rating.toDouble(); // Already a number, convert to double +// } else { +// passengerRate = 5.0; // Default for unexpected data types +// } +// } +// } else { +// passengerRate = 5.0; // Default rating for failure +// } +// } + +// addFingerPrint() async { +// String fingerPrint = await DeviceHelper.getDeviceFingerprint(); +// await CRUD().postWallet(link: AppLink.addFingerPrint, payload: { +// 'token': (box.read(BoxName.tokenFCM.toString())), +// 'passengerID': box.read(BoxName.passengerID).toString(), +// "fingerPrint": fingerPrint +// }); +// } + +// firstTimeRunToGetCoupon() async { +// // Check if it's the first time and the app is installed and gift token is available +// if (box.read(BoxName.isFirstTime).toString() == '0' && +// box.read(BoxName.isInstall).toString() == '1' && +// box.read(BoxName.isGiftToken).toString() == '0') { +// var promo, discount, validity; +// var resPromo = await CRUD().get(link: AppLink.getPromoFirst, payload: { +// "passengerID": box.read(BoxName.passengerID).toString(), +// }); +// if (resPromo != 'failure') { +// var d1 = jsonDecode(resPromo); +// promo = d1['message']['promo_code']; +// discount = d1['message']['amount']; +// validity = d1['message']['validity_end_date']; +// } +// box.write(BoxName.isFirstTime, '1'); + +// // Show a full-screen modal styled as an ad +// Get.dialog( +// AlertDialog( +// contentPadding: +// EdgeInsets.zero, // Removes the padding around the content +// content: SizedBox( +// width: 300, // Match the width of PromoBanner +// // height: 250, // Match the height of PromoBanner +// child: PromoBanner( +// promoCode: promo, +// discountPercentage: discount, +// validity: validity, +// ), +// ), +// ), +// ); +// } +// } + +// // --- دالة جديدة للاستماع ومعالجة الرابط --- +// void _listenForDeepLink() { +// ever(_deepLinkController.rawDeepLink, (String? link) async { +// if (link != null && link.isNotEmpty) { +// Log.print('📍 MapPassengerController processing link: $link'); + +// // 1. استخراج الإحداثيات باستخدام الدالة الموجودة لديك مسبقاً +// Map? coordinates = +// await extractCoordinatesFromLinkAsync(link); + +// if (coordinates != null) { +// double destLat = coordinates['latitude']!; +// double destLng = coordinates['longitude']!; +// myDestination = LatLng(destLat, destLng); + +// // 2. التحقق من موقع الراكب الحالي +// if (passengerLocation == null || +// (passengerLocation.latitude == 0 && +// passengerLocation.longitude == 0)) { +// Log.print('⏳ Waiting for current location to calculate route...'); +// await getLocation(); // جلب موقع الراكب إذا لم يكن متاحاً +// } + +// if (passengerLocation != null) { +// String originStr = +// '${passengerLocation.latitude},${passengerLocation.longitude}'; +// String destStr = '$destLat,$destLng'; + +// Log.print( +// '🚀 Drawing route from Deep Link: $originStr to $destStr'); + +// // 3. مسح أي مسارات ونقاط توقف سابقة +// clearPolyline(); +// waypoints.clear(); +// clearAllMenuWaypoints(); + +// // 4. استدعاء دالة رسم المسار وحساب التكلفة التي برمجتها +// await getDirectionMap(originStr, destStr); + +// // 5. إظهار الواجهة السفلية للرحلة ليكون الطلب جاهزاً بنقرة واحدة +// isBottomSheetShown = true; +// heightBottomSheetShown = 250; +// update(); + +// Get.snackbar( +// 'Location Received'.tr, +// 'Route and prices have been calculated successfully!'.tr, +// backgroundColor: AppColor.greenColor, +// colorText: Colors.white, +// ); +// } +// } else { +// Log.print('⚠️ Could not extract valid coordinates from link: $link'); +// } + +// // تفريغ الرابط بعد معالجته حتى لا يتم استدعاؤه مرة أخرى بالخطأ +// _deepLinkController.rawDeepLink.value = null; +// } +// }); + +// // معالجة الرابط إذا كان موجوداً مسبقاً (Cold Start) قبل تفعيل المستمع +// if (_deepLinkController.rawDeepLink.value != null && +// _deepLinkController.rawDeepLink.value!.isNotEmpty) { +// String link = _deepLinkController.rawDeepLink.value!; +// _deepLinkController.rawDeepLink.value = null; + +// // نؤجل التنفيذ قليلاً لضمان تحميل الخريطة +// Future.delayed(const Duration(milliseconds: 500), () async { +// Log.print( +// '📍 MapPassengerController processing link (Cold Start): $link'); + +// Map? coordinates = +// await extractCoordinatesFromLinkAsync(link); + +// if (coordinates != null) { +// double destLat = coordinates['latitude']!; +// double destLng = coordinates['longitude']!; +// myDestination = LatLng(destLat, destLng); + +// if (passengerLocation == null || +// (passengerLocation.latitude == 0 && +// passengerLocation.longitude == 0)) { +// await getLocation(); +// } + +// if (passengerLocation != null) { +// String originStr = +// '${passengerLocation.latitude},${passengerLocation.longitude}'; +// String destStr = '$destLat,$destLng'; + +// clearPolyline(); +// waypoints.clear(); +// clearAllMenuWaypoints(); +// await getDirectionMap(originStr, destStr); + +// isBottomSheetShown = true; +// heightBottomSheetShown = 250; +// update(); +// } +// } +// }); +// } +// } + +// @override +// void onInit() async { +// super.onInit(); +// _checkAndRefreshMapStyle(); // Verify style version and clear cache if needed +// // // --- إضافة جديدة: تهيئة وحدة التحكم في الروابط العميقة --- +// Get.put(DeepLinkController(), permanent: true); +// // // ---------------------------------------------------- +// // مرحلة 0: الضروري جداً لعرض الخريطة سريعاً +// // mapAPIKEY = await storage.read(key: BoxName.mapAPIKEY); +// await initilizeGetStorage(); // إعداد سريع +// await _initMinimalIcons(); // start/end فقط +// // await addToken(); // لو لازم للمصادقة +// _listenForDeepLink(); +// // initSocket(); +// await getLocation(); // لتحديد الكاميرا +// box.write(BoxName.carType, 'yet'); +// box.write(BoxName.tipPercentage, '0'); +// // await detectAndCacheDeviceTier(); + +// // لا تُنشئ Controllers الثقيلة الآن: +// Get.lazyPut(() => TextToSpeechController(), +// fenix: true); +// Get.lazyPut(() => FirebaseMessagesController(), +// fenix: true); +// Get.lazyPut(() => AudioRecorderController(), +// fenix: true); + +// // ابدأ الخريطة الآن (الشاشة ظهرت للمستخدم) +// Future.delayed(const Duration(seconds: 4), () { +// if (isLoading) { +// isLoading = false; +// update(); +// } +// }); + +// // مرحلة 1: مهام ضرورية للتسعير لكن غير حرجة لظهور UI +// unawaited(_stagePricingAndState()); + +// // مرحلة 2: تحسينات/كماليات بالخلفية +// unawaited(_stageNiceToHave()); + +// // ابدأ إعادة تحميل الماركر لكن بثروتل داخلي +// // startMarkerReloading(); // تأكد أنه مَخنوق التحديث (throttled) +// _startMasterTimer(); + +// // Start listening to emergency shake gestures +// EmergencySignalService.instance.startListening(() { +// if (statusRide == 'Begin' || statusRide == 'start') { +// Log.print("🚨 Emergency shake verified! Prompting SOS..."); +// if (isBottomSheetShown) { +// sosPassenger(); +// } else { +// Get.snackbar( +// 'Emergency Mode Triggered'.tr, +// 'Stay calm. We are here to help.'.tr, +// backgroundColor: AppColor.redColor, +// colorText: Colors.white, +// duration: const Duration(seconds: 4), +// ); +// sosPassenger(); +// } +// } +// }); +// } + +// // === Helpers === + +// Future _initMinimalIcons() async { +// // Icons are now loaded dynamically via MapLibre's _loadMapIcons onStyleLoaded +// } + +// Future _stagePricingAndState() async { +// try { +// await getKazanPercent(); // أسعار السيرفر +// } catch (e) { +// Log.print("Error: $e"); +// } +// try { +// _checkInitialRideStatus(); // تحقق من حالة الرحلة الحالية +// } catch (e) { +// Log.print("Error: $e"); +// } +// // لو عندك ضبط “وضع خفيف” حسب الجهاز: +// _applyLowEndModeIfNeeded(); +// } + +// Future _stageNiceToHave() async { +// Log.print('🚀 MapPassengerController: Starting _stageNiceToHave'); + +// // 🔥 Fix: Future.wait uses ONE argument (the list). +// await Future.wait([ +// Future(() async { +// try { +// Log.print('🔍 Loading Favorites...'); +// getFavioratePlaces(); +// } catch (e) { +// Log.print("Error: $e"); +// } +// }), +// Future(() async { +// try { +// Log.print('🔍 Loading Waypoints...'); +// readyWayPoints(); +// } catch (e) { +// Log.print("Error: $e"); +// } +// }), +// Future(() async { +// try { +// Log.print('🔍 Loading Rate...'); +// getPassengerRate(); +// } catch (e) { +// Log.print("Error: $e"); +// } +// }), +// Future(() async { +// try { +// Log.print('🔍 Loading Coupons...'); +// firstTimeRunToGetCoupon(); +// } catch (e) { +// Log.print("Error: $e"); +// } +// }), +// ]); +// Log.print('✅ MapPassengerController: _stageNiceToHave complete'); +// try { +// cardNumber = await SecureStorage().readData(BoxName.cardNumber); +// } catch (e) { +// Log.print("Error: $e"); +// } +// } + +// void _applyLowEndModeIfNeeded() { +// // مثال بسيط: يمكنك حفظ فلاج بنظامك (من السيرفر/الإعدادات/الكاش) لتفعيل وضع خفيف +// // لاحقاً فعّل: map.trafficEnabled=false, buildingsEnabled=false, تبسيط polylines... +// // controller.lowEndMode = true; +// } + +// uploadPassengerLocation() async { +// await CRUD().post(link: AppLink.addpassengerLocation, payload: { +// "passengerId": box.read(BoxName.passengerID), +// "lat": passengerLocation.latitude.toString(), +// "lng": passengerLocation.longitude.toString(), +// "rideId": rideId.toString() +// }); +// } + +// void _showRideStartNotifications() { +// // تنبيهات الأسعار حسب نوع السيارة +// if (['Speed', 'Awfar Car'].contains(box.read(BoxName.carType))) { +// NotificationController().showNotification('Fixed Price'.tr, +// 'The captain is responsible for the route.'.tr, 'ding'); +// } else if (['Comfort', 'Lady'].contains(box.read(BoxName.carType))) { +// NotificationController().showNotification('Attention'.tr, +// 'The price may increase if the route changes.'.tr, 'ding'); +// } +// } + +// /// Checks the current version of assets/style.json and purges the map cache if it has changed. +// Future _checkAndRefreshMapStyle() async { +// try { +// final String styleJson = await rootBundle.loadString('assets/style.json'); +// final Map decoded = json.decode(styleJson); +// final String? currentVersion = +// decoded['metadata'] != null ? decoded['metadata']['version'] : null; + +// if (currentVersion == null) return; + +// final String lastVersion = box.read(BoxName.styleVersion) ?? "0.0.0"; + +// if (currentVersion != lastVersion) { +// Log.print( +// "♻️ Map Style Version mismatch ($lastVersion -> $currentVersion). Purging offline cache..."); +// await OfflineMapService.instance.clearCache(); + +// // Final verification check: give native engine time to flush +// await Future.delayed(const Duration(milliseconds: 500)); + +// box.write(BoxName.styleVersion, currentVersion); +// Log.print("✅ Style Version updated to $currentVersion"); +// } +// } catch (e) { +// Log.print("⚠️ Style version check failed: $e"); +// } +// } +// } + +// class CarLocation { +// final String id; +// final double latitude; +// final double longitude; +// final double distance; +// final double duration; + +// CarLocation({ +// required this.id, +// required this.latitude, +// required this.longitude, +// this.distance = 10000, +// this.duration = 10000, +// }); +// } diff --git a/siro_rider/lib/controller/home/menu_controller.dart b/siro_rider/lib/controller/home/menu_controller.dart new file mode 100644 index 0000000..b5e0548 --- /dev/null +++ b/siro_rider/lib/controller/home/menu_controller.dart @@ -0,0 +1,14 @@ +import 'package:get/get.dart'; + +class MyMenuController extends GetxController { + bool isDrawerOpen = true; + + void getDrawerMenu() { + if (isDrawerOpen == true) { + isDrawerOpen = false; + } else { + isDrawerOpen = true; + } + update(); + } +} diff --git a/siro_rider/lib/controller/home/payment/captain_wallet_controller.dart b/siro_rider/lib/controller/home/payment/captain_wallet_controller.dart new file mode 100644 index 0000000..e477591 --- /dev/null +++ b/siro_rider/lib/controller/home/payment/captain_wallet_controller.dart @@ -0,0 +1,111 @@ +import 'dart:convert'; + +import 'package:flutter/material.dart'; +import 'package:get/get.dart'; +import 'package:siro_rider/constant/box_name.dart'; +import 'package:siro_rider/constant/links.dart'; +import 'package:siro_rider/controller/functions/crud.dart'; +import 'package:siro_rider/main.dart'; + +class CaptainWalletController extends GetxController { + bool isLoading = false; + Map walletDate = {}; + Map walletDateVisa = {}; + Map walletDriverPointsDate = {}; + final formKey = GlobalKey(); + String totalAmount = '0'; + String totalAmountVisa = '0'; + String totalPoints = '0'; + final amountFromBudgetController = TextEditingController(); + + payFromBudget() async { + if (formKey.currentState!.validate()) { + var pointFromBudget = box.read(BoxName.countryCode) == 'Jordan' + ? int.parse((amountFromBudgetController.text)) * 100 + : int.parse((amountFromBudgetController.text)); + + await addDriverPayment('fromBudgetToPoints', + int.parse((amountFromBudgetController.text)) * -1); + Future.delayed(const Duration(seconds: 2)); + await addDriverWallet('fromBudget', pointFromBudget.toString()); + update(); + Get.back(); + // getCaptainWalletFromRide(); + // getCaptainWalletFromBuyPoints(); + // checkAccountCaptainBank(); + } + } + + // Future getCaptainWalletFromRide() async { + // isLoading = true; + // update(); + // var res = await CRUD().get( + // link: AppLink.getAllPaymentFromRide, + // payload: {'driverID': box.read(BoxName.driverID)}, + // ); + // walletDate = jsonDecode(res); + // totalAmount = walletDate['message'][0]['total_amount'].toString() == null + // ? '0' + // : walletDate['message'][0]['total_amount']; + + // var res1 = await CRUD().get( + // link: AppLink.getAllPaymentVisa, + // payload: {'driverID': box.read(BoxName.driverID)}); + // walletDateVisa = jsonDecode(res1); + // totalAmountVisa = walletDateVisa['message'][0]['diff'].toString() == null + // ? '0' + // : walletDateVisa['message'][0]['diff']; + // isLoading = false; + // update(); + // } + + // Future getCaptainWalletFromBuyPoints() async { + // isLoading = true; + // update(); + // var res = await CRUD().get( + // link: AppLink.getDriverPaymentPoints, + // payload: {'driverID': box.read(BoxName.driverID)}, + // ); + // walletDriverPointsDate = jsonDecode(res); + // if (walletDriverPointsDate['message'][0]['driverID'].toString() == + // box.read(BoxName.driverID)) { + // double totalPointsDouble = double.parse( + // walletDriverPointsDate['message'][0]['total_amount'].toString()); + // totalPoints = totalPointsDouble.toStringAsFixed(0); + // } else { + // totalPoints = '0'; + // } + + // isLoading = false; + // update(); + // } + + late String paymentID; + Future addDriverPayment(String paymentMethod, amount) async { + var res = + await CRUD().postWallet(link: AppLink.addDriverPaymentPoints, payload: { + 'driverID': box.read(BoxName.driverID).toString(), + 'amount': amount.toString(), + 'payment_method': paymentMethod.toString(), + }); + var d = jsonDecode(res); + paymentID = d['message'].toString(); + } + + Future addDriverWallet(String paymentMethod, point) async { + await CRUD().postWallet(link: AppLink.addDriversWalletPoints, payload: { + 'driverID': box.read(BoxName.driverID).toString(), + 'paymentID': paymentID.toString(), + 'amount': point, + 'paymentMethod': paymentMethod.toString(), + }); + } + + @override + void onInit() { + // getCaptainWalletFromRide(); + // getCaptainWalletFromBuyPoints(); + // checkAccountCaptainBank(); + super.onInit(); + } +} diff --git a/siro_rider/lib/controller/home/payment/credit_card_Controller.dart b/siro_rider/lib/controller/home/payment/credit_card_Controller.dart new file mode 100644 index 0000000..eac7d3e --- /dev/null +++ b/siro_rider/lib/controller/home/payment/credit_card_Controller.dart @@ -0,0 +1,75 @@ +import 'package:flutter/material.dart'; +import 'package:get/get.dart'; + +import '../../../constant/box_name.dart'; +import '../../functions/digit_obsecur_formate.dart'; +import '../../functions/secure_storage.dart'; + +class CreditCardController extends GetxController { + final GlobalKey formKey = GlobalKey(); + final TextEditingController cardNumberController = TextEditingController(); + final TextEditingController cardHolderNameController = + TextEditingController(); + final TextEditingController expiryDateController = TextEditingController(); + final TextEditingController cvvCodeController = TextEditingController(); + openPayment() async { + String? cardNumber = await SecureStorage().readData(BoxName.cardNumber); + String? cardHolderName = + await SecureStorage().readData(BoxName.cardHolderName); + String? expiryDate = await SecureStorage().readData(BoxName.expiryDate); + String? cvvCode = await SecureStorage().readData(BoxName.cvvCode); + + // if (cvvCode != null && cvvCode.isNotEmpty) { + // final maskedCardNumber = DigitObscuringFormatter() + // .formatEditUpdate( + // TextEditingValue.empty, + // TextEditingValue(text: cardNumber ?? ''), + // ) + // .text; + + // cardNumberController.text = maskedCardNumber; + // cardHolderNameController.text = cardHolderName ?? ''; + // expiryDateController.text = expiryDate ?? ''; + // cvvCodeController.text = cvvCode; + // } + } + + @override + void onInit() async { + super.onInit(); + openPayment(); + // String? cardNumber = await SecureStorage().readData(BoxName.cardNumber); + // String? cardHolderName = + // await SecureStorage().readData(BoxName.cardHolderName); + // String? expiryDate = await SecureStorage().readData(BoxName.expiryDate); + // String? cvvCode = await SecureStorage().readData(BoxName.cvvCode); + + // if (cvvCode != null && cvvCode.isNotEmpty) { + // final maskedCardNumber = DigitObscuringFormatter() + // .formatEditUpdate( + // TextEditingValue.empty, + // TextEditingValue(text: cardNumber ?? ''), + // ) + // .text; + + // cardNumberController.text = maskedCardNumber; + // cardHolderNameController.text = cardHolderName ?? ''; + // expiryDateController.text = expiryDate ?? ''; + // cvvCodeController.text = cvvCode; + // } + } +} + +class CreditCardModel { + String cardNumber; + String cardHolderName; + String expiryDate; + String cvvCode; + + CreditCardModel({ + required this.cardNumber, + required this.cardHolderName, + required this.expiryDate, + required this.cvvCode, + }); +} diff --git a/siro_rider/lib/controller/home/points_for_rider_controller.dart b/siro_rider/lib/controller/home/points_for_rider_controller.dart new file mode 100644 index 0000000..9fa7981 --- /dev/null +++ b/siro_rider/lib/controller/home/points_for_rider_controller.dart @@ -0,0 +1,155 @@ +import 'package:flutter/material.dart'; +import 'package:get/get.dart'; +import 'package:intaleq_maps/intaleq_maps.dart'; +import 'package:siro_rider/controller/home/map/ride_lifecycle_controller.dart'; + +import '../../constant/api_key.dart'; +import '../../constant/links.dart'; +import '../../constant/style.dart'; +import '../functions/crud.dart'; +import '../functions/location_controller.dart'; + +class PointsForRiderController extends GetxController { + List locations = []; + String hintTextDestinationPoint = 'Search for your destination'.tr; + TextEditingController placeStartController = TextEditingController(); + + void addLocation(String location) { + locations.add(location); + update(); + } + + void getTextFromList(String location) { + locations.add(location); + update(); + Get.back(); + } + + void removeLocation(int index) { + locations.removeAt(index); + update(); + } + + void onReorder(int oldIndex, int newIndex) { + if (newIndex > oldIndex) { + newIndex -= 1; + update(); + } + + final item = locations.removeAt(oldIndex); + locations.insert(newIndex, item); + update(); + } +} + +class LocationModel { + String name; + double lat, lon; + + LocationModel({required this.name, required this.lat, required this.lon}); +} + +class WayPointController extends GetxController { + // A list of text editing controllers for each text field + // final textFields = [TextEditingController()].obs; + List wayPoints = []; + List> placeListResponse = []; + double wayPointHeight = 400; + String hintTextDestinationPoint = 'Search for your destination'.tr; + TextEditingController textSearchCotroller = TextEditingController(); + // A list of places corresponding to each text field + final places = []; + + final hintTextPointList = []; + late LatLng myLocation; + + void addWayPoints() { + String wayPoint = 'Add a Stop'.tr; + + if (wayPoints.length < 5) { + wayPoints.add(wayPoint); + update(); + } else { + Get.defaultDialog( + title: 'This is most WayPoints', + titleStyle: AppStyle.title, + middleText: ''); + } + update(); + } + + void removeTextField(int index) { + wayPoints.removeAt(index); + + update(); + } + + // A method to reorder the text fields and the places + void reorderTextFields(int oldIndex, int newIndex) { + if (newIndex > oldIndex) { + newIndex -= 1; + } + final wayPoint = wayPoints.removeAt(oldIndex); + wayPoints.insert(newIndex, wayPoint); + update(); + } + + void updatePlace(int index, String input) async { + var url = + '${AppLink.googleMapsLink}place/nearbysearch/json?keyword=$input&location=${myLocation.latitude},${myLocation.longitude}&radius=50000&language=en&key=${AK.mapAPIKEY.toString()}'; + var response = await CRUD().getGoogleApi(link: url, payload: {}); + // final place = input; + // if (index == 0) { + List newList = []; + placeListResponse.add(newList); + newList = response['results']; + placeListResponse[index].add(newList); + update(); + // } + + update(); + } + + @override + void onInit() { + // Get.put(LocationController()); + addWayPoints(); + myLocation = Get.find().passengerLocation; + super.onInit(); + } + + void reset() { + wayPoints.clear(); + addWayPoints(); + placeListResponse.clear(); + update(); + } +} + +class PlaceList extends StatelessWidget { + // Get the controller instance + final controller = Get.find(); + + @override + Widget build(BuildContext context) { + // Use the Obx widget to rebuild the widget when the controller changes + return Obx(() { + // Use the ListView widget to display the list of places + return ListView( + // The children of the list are the places + children: [ + // Loop through the places in the controller + for (final place in controller.places) + // Create a text widget for each place + Text( + // Use the place as the text + place, + + // Add some style and padding + style: const TextStyle(fontSize: 18.0), + ), + ], + ); + }); + } +} diff --git a/siro_rider/lib/controller/home/precise_comparison_results.txt b/siro_rider/lib/controller/home/precise_comparison_results.txt new file mode 100644 index 0000000..9b99a02 --- /dev/null +++ b/siro_rider/lib/controller/home/precise_comparison_results.txt @@ -0,0 +1,159 @@ +--- PRECISE MISSING METHODS --- +Total original methods/getters/setters: 270 +Total defined in split controllers: 270 +Total missing: 53 + - Column + - CupertinoDialogAction + - Future + - _applyLowEndModeIfNeeded + - _buildOsrmWaypointCoords + - _calculateDistance + - _checkAndRecalculateIfDeviated + - _fillDriverDataLocally + - _haversineKm + - _initMinimalIcons + - _initializePolygons + - _isActiveRideState + - _kmToLatDelta + - _kmToLngDelta + - _onDriverAcceptedWithSocket + - _onDriverArrivedWithSocket + - _onRideCancelledWithSocket + - _onRideStartedWithSocket + - _playRouteAnimation + - _relevanceScore + - _restorePolyline + - _retryProcess + - _stageNiceToHave + - _stagePricingAndState + - _startMasterTimer + - _startMasterTimerWithInterval + - _startPollingFallback + - _stopDriverLocationPolling + - _updateDriverMarker + - addPostFrameCallback + - cancelRide + - checkPassengerLocation + - currentDriverMarkerId + - detectPerfMode + - directions + - getAIKey + - getDirectionMap + - getDistanceFromDriverAfterAcceptedRide + - getMapPointsForAllMethods + - getPassengerLocationUniversity + - getRideStatus + - handleActiveRideOnStartup + - handleNoDriverFound + - isDriversDataValid + - lastWhere + - onChangedPassengerCount + - onChangedPassengersChoose + - processRideAcceptance + - retrySearchForDrivers + - showDrawingBottomSheet + - showNoDriversDialog + - startSearchingTimer + - wait + +--- PRECISE MISSING VARIABLES/FIELDS --- +Total original variables: 626 +Total defined in split controllers: 558 +Total missing: 97 + - EdgeInsets + - Error + - InfoWindow + - LatLngBounds + - LocationData + - R + - _buildOsrmWaypointCoords + - _calculateDistance + - _haversineKm + - _isActiveRideState + - _isStateProcessing + - _isUsingFallback + - _kmToLatDelta + - _kmToLngDelta + - _reconnectTimer + - _relevanceScore + - a + - aerialDistance + - apiDistanceMeters + - apiKey + - attemptCount + - c + - carInfo + - cardNumber + - carsOrder + - checkPassengerLocation + - commissionPct + - context + - coordDestination + - currentAttempt + - currentCarType + - currentLocationOfDrivers + - currentRideId + - currentTimeSearchingCaptainWindow + - dInfo + - dLat + - dataCarsLocationByPassenger + - datadriverCarsLocationToPassengerAfterApplied + - dest + - deviation + - distanceOfTrip + - driverCarPlate + - driverLocationToPassenger + - driverName + - driverOrderStatus + - driverPhone + - durationByPassenger + - dynamicApiUrl + - etaText + - fName + - finalReason + - firebaseMessagesController + - increaseFeeFormKey + - info + - isBeginRideFromDriverRunning + - isDrawingRoute + - isDriversDataValid + - isDriversTokensSend + - isInUniversity + - isRequestValid + - kDurationScalar + - key + - km + - kmInDegree + - lName + - latDest + - latestWaypoint + - lngDest + - lowPerf + - mapAPIKEY + - messagesFormKey + - might + - minBillableKm + - minFareSYP + - newValue + - northeast + - originCoords + - pLower + - passengerLocation + - passengerLocationStringUnvirsity + - placeName + - polylineString + - previousLocationOfDrivers + - progressTimerRideBeginVip + - promoFormKey + - qLower + - query + - rLat1 + - rLat2 + - ram + - rideData + - sdk + - selectedPassengerCount + - southwest + - startLng + - status + - stringElapsedTimeRideBegin diff --git a/siro_rider/lib/controller/home/profile/complaint_controller.dart b/siro_rider/lib/controller/home/profile/complaint_controller.dart new file mode 100644 index 0000000..e972267 --- /dev/null +++ b/siro_rider/lib/controller/home/profile/complaint_controller.dart @@ -0,0 +1,214 @@ +import 'dart:convert'; +import 'dart:io'; + +import 'package:flutter/material.dart'; +import 'package:get/get.dart'; +import 'package:http/http.dart' as http; +import 'package:siro_rider/constant/box_name.dart'; +import 'package:siro_rider/constant/colors.dart'; +import 'package:siro_rider/constant/links.dart'; +import 'package:siro_rider/controller/functions/crud.dart'; +import 'package:siro_rider/main.dart'; +import 'package:http_parser/http_parser.dart'; +import 'package:mime/mime.dart'; + +import '../../../env/env.dart'; +import '../../../print.dart'; +import '../../../views/widgets/mydialoug.dart'; +import '../../functions/encrypt_decrypt.dart'; + +class ComplaintController extends GetxController { + bool isLoading = false; + final formKey = GlobalKey(); + final complaintController = TextEditingController(); + + List feedBack = []; + Map? passengerReport; + Map? driverReport; + + var isUploading = false.obs; + var uploadSuccess = false.obs; + String audioLink = ''; // سيتم تخزين رابط الصوت هنا بعد الرفع + + @override + void onInit() { + super.onInit(); + getLatestRidesForPassengers(); + } + + // --- دالة مخصصة لعرض إشعارات Snackbar بشكل جميل --- + void _showCustomSnackbar(String title, String message, + {bool isError = false}) { + Get.snackbar( + '', // العنوان سيتم التعامل معه عبر titleText + '', // الرسالة سيتم التعامل معها عبر messageText + titleText: Text(title.tr, + style: const TextStyle( + color: Colors.white, fontWeight: FontWeight.bold, fontSize: 16)), + messageText: Text(message.tr, + style: const TextStyle(color: Colors.white, fontSize: 14)), + backgroundColor: isError + ? AppColor.redColor.withOpacity(0.95) + : const Color.fromARGB(255, 6, 148, 79).withOpacity(0.95), + icon: Icon(isError ? Icons.error_outline : Icons.check_circle_outline, + color: Colors.white, size: 28), + borderRadius: 12, + margin: const EdgeInsets.all(15), + padding: const EdgeInsets.symmetric(horizontal: 20, vertical: 18), + snackPosition: SnackPosition.BOTTOM, + duration: const Duration(seconds: 4), + colorText: Colors.white, + ); + } + + // --- هذه الدالة تبقى كما هي لجلب بيانات الرحلة --- + getLatestRidesForPassengers() async { + isLoading = true; + update(); + var res = await CRUD().get(link: AppLink.getFeedBack, payload: { + 'passengerId': box.read(BoxName.passengerID).toString(), + }); + if (res != 'failure') { + var d = jsonDecode(res)['message']; + feedBack = d; + } + isLoading = false; + update(); + } + + // --- تم تحديث الهيدر في هذه الدالة --- + Future uploadAudioFile(File audioFile) async { + try { + isUploading.value = true; + update(); + + var uri = Uri.parse('${AppLink.server}/upload_audio.php'); + var request = http.MultipartRequest('POST', uri); + String token = r(box.read(BoxName.jwt)).toString().split(Env.addd)[0]; + final String fingerPrint = box.read(BoxName.deviceFpEncrypted)?.toString() ?? ''; + + var mimeType = lookupMimeType(audioFile.path); + // ** التعديل: تم استخدام نفس هيدر التوثيق ** + request.headers.addAll({ + 'Authorization': 'Bearer $token', + 'X-Device-FP': fingerPrint, + }); + request.files.add( + await http.MultipartFile.fromPath( + 'audio', + audioFile.path, + contentType: mimeType != null ? MediaType.parse(mimeType) : null, + ), + ); + + var response = await request.send(); + var responseBody = await http.Response.fromStream(response); + + if (response.statusCode == 200) { + var jsonResponse = jsonDecode(responseBody.body); + if (jsonResponse['status'] == 'Audio file uploaded successfully.') { + uploadSuccess.value = true; + audioLink = jsonResponse['link']; // تخزين الرابط في المتغير + Get.back(); + // استخدام الـ Snackbar الجديد + _showCustomSnackbar('Success', 'Audio uploaded successfully.'); + } else { + uploadSuccess.value = false; + _showCustomSnackbar('Error', 'Failed to upload audio file.', + isError: true); + } + } else { + uploadSuccess.value = false; + _showCustomSnackbar('Error', 'Server error: ${response.statusCode}', + isError: true); + } + } catch (e) { + uploadSuccess.value = false; + _showCustomSnackbar( + 'Error', 'An application error occurred during upload.', + isError: true); + } finally { + isUploading.value = false; + update(); + } + } + + // --- الدالة الجديدة التي تتصل بالسكريبت الجديد --- + Future submitComplaintToServer() async { + // 1. التحقق من صحة الفورم + if (!formKey.currentState!.validate() || complaintController.text.isEmpty) { + // استخدام الـ Snackbar الجديد + _showCustomSnackbar( + 'Error', 'Please describe your issue before submitting.', + isError: true); + return; + } + + // 2. التحقق من وجود بيانات الرحلة + if (feedBack.isEmpty) { + // استخدام الـ Snackbar الجديد + _showCustomSnackbar( + 'Error', 'Ride information not found. Please refresh the page.', + isError: true); + return; + } + + isLoading = true; + update(); + + try { + // 3. استخراج البيانات المطلوبة + final rideId = feedBack[0]['id'].toString(); // ! تأكد أن اسم حقل ID صحيح + final complaint = complaintController.text; + String token = r(box.read(BoxName.jwt)).toString().split(Env.addd)[0]; + + // 4. استدعاء سكربت PHP الجديد باستخدام http.post + final response = await http.post( + Uri.parse(AppLink.add_solve_all), + headers: {'Authorization': 'Bearer $token'}, + body: { + 'ride_id': rideId, + 'complaint_text': complaint, + 'audio_link': audioLink, + }, + ); + + Log.print('Server Response: ${response.body}'); + + if (response.statusCode != 200) { + _showCustomSnackbar( + 'Error', 'Failed to connect to the server. Please try again.', + isError: true); + return; + } + + // 5. التعامل مع محتوى الرد من الخادم + final responseData = jsonDecode(response.body); + + if (responseData['status'] == 'success') { + passengerReport = responseData['data']['passenger_response']; + driverReport = responseData['data']['driver_response']; + update(); + + MyDialogContent().getDialog( + 'Success'.tr, Text('Your complaint has been submitted.'.tr), () { + Get.back(); + complaintController.clear(); + audioLink = ''; + formKey.currentState?.reset(); + }); + } else { + String errorMessage = + responseData['message'] ?? 'An unknown server error occurred'.tr; + _showCustomSnackbar('Submission Failed', errorMessage, isError: true); + } + } catch (e) { + Log.print("Submit Complaint Error: $e"); + _showCustomSnackbar('Error', 'An application error occurred.'.tr, + isError: true); + } finally { + isLoading = false; + update(); + } + } +} diff --git a/siro_rider/lib/controller/home/profile/invit_controller.dart b/siro_rider/lib/controller/home/profile/invit_controller.dart new file mode 100644 index 0000000..befd8e2 --- /dev/null +++ b/siro_rider/lib/controller/home/profile/invit_controller.dart @@ -0,0 +1,351 @@ +import 'dart:convert'; + +import 'package:siro_rider/constant/box_name.dart'; +import 'package:siro_rider/constant/colors.dart'; +import 'package:siro_rider/constant/links.dart'; +import 'package:siro_rider/controller/functions/crud.dart'; +import 'package:flutter/material.dart'; +import 'package:flutter_contacts/flutter_contacts.dart'; +import 'package:get/get.dart'; +import 'package:permission_handler/permission_handler.dart'; +import 'package:share_plus/share_plus.dart'; + +import '../../../main.dart'; +import '../../../print.dart'; +import '../../../views/widgets/error_snakbar.dart'; +import '../../../views/widgets/mydialoug.dart'; +import '../../functions/launch.dart'; +import '../../notification/notification_captain_controller.dart'; +import '../../payment/payment_controller.dart'; + +class InviteController extends GetxController { + final TextEditingController invitePhoneController = TextEditingController(); + List driverInvitationData = []; + List driverInvitationDataToPassengers = []; + String? couponCode; + String? driverCouponCode; + + int selectedTab = 0; + PassengerStats passengerStats = PassengerStats(); + + List contacts = []; + RxList> contactMaps = >[].obs; + + @override + void onInit() { + super.onInit(); + // It's good practice to fetch initial data in onInit or onReady + // fetchDriverStats(); + // fetchDriverStatsPassengers(); + } + + void updateSelectedTab(int index) { + selectedTab = index; + update(); + } + + // --- Sharing Methods --- + + Future shareDriverCode() async { + if (driverCouponCode != null) { + final String shareText = ''' +${'Join Intaleq as a driver using my referral code!'.tr} +${'Use code:'.tr} $driverCouponCode +${'Download the Intaleq Driver app now and earn rewards!'.tr} +'''; + await Share.share(shareText); + } + } + + Future sharePassengerCode() async { + if (couponCode != null) { + final String shareText = ''' +${'Get a discount on your first Intaleq ride!'.tr} +${'Use my referral code:'.tr} $couponCode +${'Download the Intaleq app now and enjoy your ride!'.tr} +'''; + await Share.share(shareText); + } + } + + // --- Data Fetching --- + + void fetchDriverStats() async { + try { + var response = await CRUD().get(link: AppLink.getInviteDriver, payload: { + "driverId": box.read(BoxName.driverID), + }); + if (response != 'failure') { + var data = jsonDecode(response); + driverInvitationData = data['message']; + update(); + } + } catch (e) { + Log.print("Error fetching driver stats: $e"); + } + } + + void fetchDriverStatsPassengers() async { + try { + var response = await CRUD() + .get(link: AppLink.getDriverInvitationToPassengers, payload: { + "driverId": box.read(BoxName.passengerID), + }); + if (response != 'failure') { + var data = jsonDecode(response); + driverInvitationDataToPassengers = data['message']; + update(); + } + } catch (e) { + Log.print("Error fetching passenger stats: $e"); + } + } + + // --- Contact Handling --- + + /// **IMPROVEMENT**: This function now filters out contacts without any phone numbers. + /// This is the fix for the `RangeError` you were seeing, which happened when the UI + /// tried to access the first phone number of a contact that had none. + Future pickContacts() async { + try { + // 1. Check current permission status using permission_handler for better control + PermissionStatus status = await Permission.contacts.status; + + // 2. If status is permanently denied, direct user to settings + if (status.isPermanentlyDenied) { + Get.defaultDialog( + title: 'Permission Required'.tr, + middleText: + 'Contact permission is permanently denied. Please enable it in settings to continue.' + .tr, + textConfirm: 'Settings'.tr, + textCancel: 'Cancel'.tr, + confirmTextColor: Colors.white, + onConfirm: () { + openAppSettings(); + Get.back(); + }, + ); + return; + } + + // 3. Request permission if not already granted + if (!status.isGranted) { + status = await Permission.contacts.request(); + } + + // 4. Proceed if granted + if (status.isGranted) { + // Also call flutter_contacts requestPermission to ensure it's synced (internal state) + await FlutterContacts.requestPermission(readonly: true); + + final List allContacts = + await FlutterContacts.getContacts(withProperties: true); + final int totalContactsOnDevice = allContacts.length; + + // **FIX**: Filter contacts to only include those with at least one phone number. + contacts = allContacts.where((c) => c.phones.isNotEmpty).toList(); + final int contactsWithPhones = contacts.length; + + if (contactsWithPhones > 0) { + Log.print('Found $contactsWithPhones contacts with phone numbers.'); + contactMaps.value = contacts.map((contact) { + return { + 'name': contact.displayName, + 'phones': contact.phones.map((p) => p.number).toList(), + 'emails': contact.emails.map((e) => e.address).toList(), + }; + }).toList(); + update(); + + // **IMPROVEMENT**: Provide feedback if some contacts were filtered out. + if (contactsWithPhones < totalContactsOnDevice) { + // Get.snackbar('Contacts Loaded'.tr, + // '${'Showing'.tr} $contactsWithPhones ${'of'.tr} $totalContactsOnDevice ${'contacts. Others were hidden because they don\'t have a phone number.'.tr}', + // snackPosition: SnackPosition.BOTTOM); + } + } else { + Get.snackbar('No contacts found'.tr, + 'No contacts with phone numbers were found on your device.'.tr); + } + } else { + Get.snackbar('Permission denied'.tr, + 'Contact permission is required to pick contacts'.tr); + } + } catch (e) { + Log.print('Error picking contacts: $e'); + Get.snackbar( + 'Error'.tr, 'An error occurred while picking contacts: $e'.tr); + } + } + + void selectPhone(String phone) { + invitePhoneController.text = phone; + update(); + Get.back(); + } + + /// **IMPROVEMENT**: A new robust function to format phone numbers specifically for Syria (+963). + /// It handles various user inputs gracefully to produce a standardized international format. + String _formatSyrianPhoneNumber(String phone) { + // 1. Remove all non-digit characters to clean the input. + String digitsOnly = phone.replaceAll(RegExp(r'\D'), ''); + + // 2. If it already starts with the country code, we assume it's correct. + if (digitsOnly.startsWith('963')) { + return '$digitsOnly'; + } + + // 3. If it starts with '09' (common local format), remove the leading '0'. + if (digitsOnly.startsWith('09')) { + digitsOnly = digitsOnly.substring(1); + } + + // 4. Prepend the Syrian country code. + return '963$digitsOnly'; + } + + /// **IMPROVEMENT**: This method now uses the new phone formatting logic and + /// sends a much-improved, user-friendly WhatsApp message. + void sendInviteToPassenger() async { + if (invitePhoneController.text.isEmpty || + invitePhoneController.text.length < 9) { + mySnackeBarError('Please enter a correct phone'.tr); + return; + } + + try { + // Use the new formatting function to ensure the number is correct. + String formattedPhoneNumber = + _formatSyrianPhoneNumber(invitePhoneController.text); + + var response = + await CRUD().post(link: AppLink.addInvitationPassenger, payload: { + "driverId": box.read(BoxName.passengerID), + "inviterPassengerPhone": formattedPhoneNumber, + }); + + if (response != 'failure') { + var d = response; + Get.snackbar('Success'.tr, 'Invite sent successfully'.tr, + backgroundColor: Colors.green, colorText: Colors.white); + + // التحقق الديناميكي من مكان البيانات (V1 vs V3) + var payload = d['data'] ?? d['message']; + + // إذا كان الـ message نصاً وليس خريطة (Map)، نأخذ البيانات من المستوى الأعلى + if (payload is String) { + payload = d; + } + + String expirationTime = (payload['expirationTime'] ?? '').toString(); + String inviteCode = (payload['inviteCode'] ?? '').toString(); + + // New and improved WhatsApp message for better user engagement. + String message = + "👋 ${'Hello! I\'m inviting you to try Intaleq.'.tr}\n\n" + "🎁 ${'Use my invitation code to get a special gift on your first ride!'.tr}\n\n" + "${'Your personal invitation code is:'.tr}\n" + "*$inviteCode*\n\n" + "⏳ ${'Be sure to use it quickly! This code expires at'.tr} *$expirationTime*.\n\n" + "📲 ${'Download the app now:'.tr}\n" + "• *Android:* https://play.google.com/store/apps/details?id=com.Intaleq.intaleq\n" + "• *iOS:* https://apps.apple.com/st/app/intaleq-rider/id6748075179\n\n" + "${'See you on the road!'.tr} 🚗"; + + launchCommunication('whatsapp', formattedPhoneNumber, message); + invitePhoneController.clear(); + update(); + } else { + Get.snackbar( + 'Error'.tr, "This phone number has already been invited.".tr, + backgroundColor: AppColor.redColor, + duration: const Duration(seconds: 4)); + } + } catch (e) { + Log.print("Error sending invite: $e"); + Get.snackbar( + 'Error'.tr, 'An unexpected error occurred. Please try again.'.tr, + backgroundColor: AppColor.redColor); + } + } + + // This function is dependent on the `pickContacts` method filtering out contacts without phones. + savePhoneToServer() async { + for (var contactMap in contactMaps) { + // The `pickContacts` function ensures the 'phones' list is not empty here. + var phones = contactMap['phones'] as List; + var res = await CRUD().post(link: AppLink.savePhones, payload: { + "name": contactMap['name'] ?? 'No Name', + "phones": phones.first, // Safely access the first phone number + "phones2": phones.join(', '), + }); + if (res == 'failure') { + Log.print('Failed to save contact: ${contactMap['name']}'); + } + } + } + + void onSelectPassengerInvitation(int index) async { + try { + final invitation = driverInvitationDataToPassengers[index]; + final tripCount = + int.tryParse(invitation['countOfInvitDriver'].toString()) ?? 0; + final passengerName = invitation['passengerName'].toString(); + final isGiftTaken = invitation['isGiftToken'].toString() == '1'; + + if (tripCount >= 2) { + // Gift can be claimed + if (!isGiftTaken) { + MyDialog().getDialog( + 'You deserve the gift'.tr, + '${'Claim your 20 LE gift for inviting'.tr} $passengerName!', + () async { + Get.back(); // Close dialog first + await Get.find().addPassengersWallet('20'); + await CRUD().post( + link: AppLink.updatePassengerGift, + payload: {'id': invitation['id']}, + ); + NotificationCaptainController().addNotificationCaptain( + invitation['passengerInviterId'].toString(), + "You have got a gift for invitation".tr, + '${"You have earned 20".tr} ${'LE'}', + false, + ); + fetchDriverStatsPassengers(); // Refresh list + }, + ); + } else { + MyDialog().getDialog( + "Gift Already Claimed".tr, + "You have already received your gift for inviting $passengerName." + .tr, + () => Get.back(), + ); + } + } else { + // Gift not yet earned + MyDialog().getDialog( + '${'Keep it up!'.tr}', + '$passengerName ${'has completed'.tr} $tripCount / 2 ${'trips'.tr}. ${"You can claim your gift once they complete 2 trips.".tr}', + () => Get.back(), + ); + } + } catch (e) { + Log.print("Error in onSelectPassengerInvitation: $e"); + } + } +} + +class PassengerStats { + final int totalInvites; + final int activeUsers; + final double totalEarnings; + + PassengerStats({ + this.totalInvites = 0, + this.activeUsers = 0, + this.totalEarnings = 0.0, + }); +} diff --git a/siro_rider/lib/controller/home/profile/order_history_controller.dart b/siro_rider/lib/controller/home/profile/order_history_controller.dart new file mode 100644 index 0000000..99c8ff5 --- /dev/null +++ b/siro_rider/lib/controller/home/profile/order_history_controller.dart @@ -0,0 +1,35 @@ +import 'dart:convert'; + +import 'package:get/get.dart'; +import 'package:siro_rider/constant/box_name.dart'; +import 'package:siro_rider/constant/links.dart'; +import 'package:siro_rider/controller/functions/crud.dart'; +import 'package:siro_rider/main.dart'; + +class OrderHistoryController extends GetxController { + List orderHistoryListPassenger = []; + bool isloading = true; + + @override + void onInit() { + getOrderHistoryByPassenger(); + super.onInit(); + } + + Future getOrderHistoryByPassenger() async { + var res = await CRUD().get(link: AppLink.getRides, payload: { + 'passenger_id': box.read(BoxName.passengerID).toString(), + }); + if (res.toString() == 'failure') { + // Get.snackbar('failure', 'message'); + isloading = false; + update(); + } else { + var jsonDecoded = jsonDecode(res); + var rawData = jsonDecoded['data'] ?? jsonDecoded['message']; + orderHistoryListPassenger = rawData is List ? rawData : []; + isloading = false; + update(); + } + } +} diff --git a/siro_rider/lib/controller/home/profile/promos_controller.dart b/siro_rider/lib/controller/home/profile/promos_controller.dart new file mode 100644 index 0000000..4f2c102 --- /dev/null +++ b/siro_rider/lib/controller/home/profile/promos_controller.dart @@ -0,0 +1,45 @@ +import 'dart:convert'; + +import 'package:siro_rider/constant/box_name.dart'; +import 'package:get/get.dart'; +import 'package:siro_rider/constant/links.dart'; +import 'package:siro_rider/controller/functions/crud.dart'; + +import '../../../main.dart'; + +class PromosController extends GetxController { + List promoList = []; + bool isLoading = true; + late String promos; + @override + void onInit() { + getPromoByToday(); + super.onInit(); + } + + Future getPromoByToday() async { + var res = await CRUD().get(link: AppLink.getPromoBytody, payload: { + 'passengerID': box.read(BoxName.passengerID).toString(), + }); + if (res.toString() == 'failure') { + // Get.defaultDialog( + // title: 'No Promo for today .'.tr, + // middleText: '', + // titleStyle: AppStyle.title, + // confirm: MyElevatedButton( + // title: 'Back'.tr, + // onPressed: () { + // Get.back(); + // Get.back(); + // })); + isLoading = false; + update(); + } else { + var jsonDecoded = jsonDecode(res); + + promoList = jsonDecoded['message']; + isLoading = false; + update(); + } + } +} diff --git a/siro_rider/lib/controller/home/splash_screen_controlle.dart b/siro_rider/lib/controller/home/splash_screen_controlle.dart new file mode 100644 index 0000000..402ff23 --- /dev/null +++ b/siro_rider/lib/controller/home/splash_screen_controlle.dart @@ -0,0 +1,233 @@ +import 'package:siro_rider/print.dart'; +import 'dart:async'; +import 'dart:math'; +import 'package:siro_rider/controller/functions/crud.dart'; +import 'package:flutter/material.dart'; +import 'package:get/get.dart'; +import 'package:package_info_plus/package_info_plus.dart'; +import 'package:siro_rider/constant/box_name.dart'; +import 'package:siro_rider/onbording_page.dart'; +import 'package:siro_rider/views/auth/login_page.dart'; +import 'package:siro_rider/controller/auth/login_controller.dart'; +import 'package:siro_rider/controller/functions/secure_storage.dart'; +import 'package:quick_actions/quick_actions.dart'; +import '../../../constant/notification.dart'; +import '../../../main.dart'; +import '../firebase/firbase_messge.dart'; +import '../firebase/local_notification.dart'; +import '../functions/encrypt_decrypt.dart'; + +class SplashScreenController extends GetxController + with GetTickerProviderStateMixin { + // ─── انيميشن الـ splash الأصلي ─────────────────────────────────────────── + late AnimationController _animationController; + late Animation titleFadeAnimation, + titleScaleAnimation, + taglineFadeAnimation, + footerFadeAnimation; + late Animation taglineSlideAnimation; + + // ─── انيميشن الحلقات المدارية ──────────────────────────────────────────── + late AnimationController _orbitController; + late Animation orbitAnimation; + + // ─── انيميشن التوهج المتنفّس ───────────────────────────────────────────── + late AnimationController _glowController; + late Animation glowAnimation; + + final progress = 0.0.obs; + Timer? _progressTimer; + + @override + void onInit() { + super.onInit(); + + // ── الكنترولر الرئيسي للـ splash ───────────────────────────────────── + _animationController = AnimationController( + vsync: this, duration: const Duration(milliseconds: 2000)); + + titleFadeAnimation = Tween(begin: 0.0, end: 1.0).animate( + CurvedAnimation( + parent: _animationController, + curve: const Interval(0.0, 0.5, curve: Curves.easeOut))); + + titleScaleAnimation = Tween(begin: 0.8, end: 1.0).animate( + CurvedAnimation( + parent: _animationController, + curve: const Interval(0.0, 0.5, curve: Curves.easeOut))); + + taglineFadeAnimation = Tween(begin: 0.0, end: 1.0).animate( + CurvedAnimation( + parent: _animationController, + curve: const Interval(0.3, 0.8, curve: Curves.easeOut))); + + taglineSlideAnimation = + Tween(begin: const Offset(0, 0.5), end: Offset.zero).animate( + CurvedAnimation( + parent: _animationController, + curve: const Interval(0.3, 0.8, curve: Curves.easeOut))); + + footerFadeAnimation = Tween(begin: 0.0, end: 1.0).animate( + CurvedAnimation( + parent: _animationController, + curve: const Interval(0.5, 1.0, curve: Curves.easeOut))); + + // ── كنترولر الدوران المداري — دورة كاملة كل 7 ثوانٍ ───────────────── + _orbitController = + AnimationController(vsync: this, duration: const Duration(seconds: 7)) + ..repeat(); + + orbitAnimation = + Tween(begin: 0.0, end: 1.0).animate(_orbitController); + + // ── كنترولر التوهج المتنفّس — نبضة كل ثانيتين ─────────────────────── + _glowController = AnimationController( + vsync: this, duration: const Duration(milliseconds: 2000)) + ..repeat(reverse: true); + + glowAnimation = Tween(begin: 0.0, end: 1.0).animate( + CurvedAnimation(parent: _glowController, curve: Curves.easeInOut)); + + _animationController.forward(); + _initializeApp(); + } + + Future _initializeApp() async { + _startProgressAnimation(); + + // Run navigation logic and background services in parallel. + final logicFuture = _performNavigationLogic(); + final backgroundServicesFuture = _initializeBackgroundServices(); + + // Ensure the splash screen is visible for a minimum duration. + final minTimeFuture = Future.delayed(const Duration(seconds: 3)); + + // Wait for all tasks to complete. + await Future.wait([logicFuture, backgroundServicesFuture, minTimeFuture]); + } + + void _startProgressAnimation() { + // Visual timer for the progress bar. + const totalTime = 2800; // ms + const interval = 50; // ms + int elapsed = 0; + + _progressTimer = + Timer.periodic(const Duration(milliseconds: interval), (timer) { + elapsed += interval; + progress.value = (elapsed / totalTime).clamp(0.0, 1.0); + if (elapsed >= totalTime) timer.cancel(); + }); + } + + /// Initializes all heavy background services while the splash animation is running. + Future _initializeBackgroundServices() async { + try { + await EncryptionHelper.initialize(); + + // --- [LAZY LOADING IN ACTION] --- + // This `Get.find()` call will create the NotificationController instance + // for the first time because it was defined with `lazyPut`. + final notificationController = Get.find(); + await notificationController.initNotifications(); + + // The same happens for FirebaseMessagesController. + final fcm = Get.find(); + await fcm.requestFirebaseMessagingPermission(); + + // _scheduleDailyNotifications(notificationController); + _initializeQuickActions(); + } catch (e, st) { + CRUD.addError('background_init_error: $e', st.toString(), 'SplashScreen'); + } + } + + /// Determines the next screen based on user's login state. + Future _performNavigationLogic() async { + await _getPackageInfo(); + SecureStorage().saveData('iss', 'mobile-app:'); + + // ── [OPTIMIZATION] جلب التوكن عند بداية تشغيل التطبيق ──────────────── + Log.print("SplashScreen: Initializing JWT..."); + await Get.find().getJWT(); + + if (box.read(BoxName.onBoarding) == null) { + Get.off(() => OnBoardingPage()); + } else if (box.read(BoxName.email) != null && + box.read(BoxName.phone) != null && + box.read(BoxName.isVerified) == '1') { + // `Get.find()` creates the LoginController instance here. + final loginController = Get.find(); + // The loginController itself will handle navigation via Get.offAll() upon success. + await loginController.loginUsingCredentials( + box.read(BoxName.passengerID).toString(), + box.read(BoxName.email).toString(), + ); + } else { + Get.off(() => LoginPage()); + } + } + + Future _getPackageInfo() async { + try { + final info = await PackageInfo.fromPlatform(); + box.write(BoxName.packagInfo, info.version); + update(); + } catch (e) { + Log.print("Could not get package info: $e"); + } + } + + void _scheduleDailyNotifications(NotificationController controller) { + try { + final List msgs = passengerMessages ?? const []; + if (msgs.isEmpty) { + controller.scheduleNotificationsForSevenDays( + 'Intaleq', 'مرحباً بك! تابع رحلاتك بأمان مع انطلق.', "tone1"); + } else { + final rnd = Random(); + final raw = msgs[rnd.nextInt(msgs.length)]; + final parts = raw.split(':'); + final title = parts.isNotEmpty ? parts.first.trim() : 'Intaleq'; + final body = parts.length > 1 + ? parts.sublist(1).join(':').trim() + : 'مرحباً بك! تابع رحلاتك بأمان مع انطلق.'; + controller.scheduleNotificationsForSevenDays( + title.isEmpty ? 'Intaleq' : title, + body.isEmpty ? 'مرحباً بك! تابع رحلاتك بأمان مع انطلق.' : body, + "tone1"); + } + } catch (e, st) { + CRUD.addError('notif_init: $e', st.toString(), 'SplashScreen'); + } + } + + void _initializeQuickActions() { + final QuickActions quickActions = QuickActions(); + quickActions.initialize((String shortcutType) { + Get.toNamed('/$shortcutType'); + }); + + quickActions.setShortcutItems([ + ShortcutItem( + type: 'shareApp', localizedTitle: 'Share App'.tr, icon: 'icon_share'), + ShortcutItem( + type: 'wallet', localizedTitle: 'Wallet'.tr, icon: 'icon_wallet'), + ShortcutItem( + type: 'profile', localizedTitle: 'Profile'.tr, icon: 'icon_user'), + ShortcutItem( + type: 'contactSupport', + localizedTitle: 'Contact Support'.tr, + icon: 'icon_support'), + ]); + } + + @override + void onClose() { + _progressTimer?.cancel(); + _animationController.dispose(); + _orbitController.dispose(); + _glowController.dispose(); + super.onClose(); + } +} \ No newline at end of file diff --git a/siro_rider/lib/controller/home/trip_monitor_controller.dart b/siro_rider/lib/controller/home/trip_monitor_controller.dart new file mode 100644 index 0000000..b70874e --- /dev/null +++ b/siro_rider/lib/controller/home/trip_monitor_controller.dart @@ -0,0 +1,107 @@ +import 'dart:async'; +import 'dart:convert'; + +import 'package:siro_rider/constant/links.dart'; +import 'package:siro_rider/controller/functions/crud.dart'; +import 'package:flutter/material.dart'; +import 'package:flutter/services.dart'; +import 'package:get/get.dart'; +import 'package:intaleq_maps/intaleq_maps.dart'; + +class TripMonitorController extends GetxController { + bool isLoading = false; + Map tripData = {}; + late String rideId; + late String driverId; + IntaleqMapController? mapController; + List myListString = []; + late Timer timer; + late LatLng parentLocation; + String carIcon = 'car'; + String motoIcon = 'moto'; + String ladyIcon = 'lady'; + double rotation = 0; + double speed = 0; + bool isStyleLoaded = false; + + Set markers = {}; + + getLocationParent() async { + var res = await CRUD().get( + link: AppLink.getLocationParents, payload: {"driver_id": driverId}); + if (res != 'failure') { + tripData = jsonDecode(res); + parentLocation = LatLng( + double.parse(tripData['message'][0]['latitude'].toString()), + double.parse(tripData['message'][0]['longitude'].toString())); + rotation = double.parse(tripData['message'][0]['heading'].toString()); + speed = double.parse(tripData['message'][0]['speed'].toString()); + + _updateMarker(); + update(); + } + } + + void onMapCreated(IntaleqMapController controller) async { + mapController = controller; + update(); + } + + void onStyleLoaded() async { + isStyleLoaded = true; + mapController?.animateCamera( + CameraUpdate.newLatLng(parentLocation), + ); + _updateMarker(); + + // Set up a timer or interval to trigger the marker update every 10 seconds. + timer = Timer.periodic(const Duration(seconds: 10), (_) async { + await getLocationParent(); + mapController?.animateCamera(CameraUpdate.newLatLng(parentLocation)); + update(); + }); + } + + void _updateMarker() { + String iconPath = 'assets/images/car.png'; + if (tripData['message'] != null && tripData['message'].isNotEmpty) { + final model = tripData['message'][0]['model'].toString(); + final gender = tripData['message'][0]['gender'].toString(); + if (model.contains('دراجة')) { + iconPath = 'assets/images/moto1.png'; + } else if (gender == 'Female') { + iconPath = 'assets/images/lady1.png'; + } + } + + markers = { + Marker( + markerId: const MarkerId('driver'), + position: parentLocation, + icon: InlqBitmap.fromAsset(iconPath), + rotation: rotation, + anchor: const Offset(0.5, 0.5), + ), + }; + update(); + } + + Future init({String? rideId, String? driverId}) async { + this.driverId = driverId!; + this.rideId = rideId!; + await getLocationParent(); + update(); + } + + @override + void onInit() { + super.onInit(); + } + + @override + void onClose() { + timer.cancel(); + mapController = null; + super.onClose(); + } +} diff --git a/siro_rider/lib/controller/home/vip_waitting_page.dart b/siro_rider/lib/controller/home/vip_waitting_page.dart new file mode 100644 index 0000000..0b437e1 --- /dev/null +++ b/siro_rider/lib/controller/home/vip_waitting_page.dart @@ -0,0 +1,324 @@ +import 'dart:async'; +import 'dart:convert'; + +import 'package:siro_rider/constant/box_name.dart'; +import 'package:siro_rider/constant/colors.dart'; +import 'package:siro_rider/constant/links.dart'; +import 'package:siro_rider/controller/home/map/ride_lifecycle_controller.dart'; +import 'package:siro_rider/main.dart'; +import 'package:siro_rider/views/widgets/elevated_btn.dart'; +import 'package:siro_rider/views/widgets/my_scafold.dart'; +import 'package:siro_rider/views/widgets/mycircular.dart'; +import 'package:flutter/material.dart'; +import 'package:flutter_font_icons/flutter_font_icons.dart'; +import 'package:get/get.dart'; +import 'package:intl/intl.dart'; + +import '../../constant/style.dart'; +import '../functions/crud.dart'; +import '../functions/encrypt_decrypt.dart'; + +class VipOrderController extends GetxController { + RxBool isLoading = false.obs; + final arguments = Get.arguments; + RxList tripData = [].obs; + RxBool isButtonVisible = false.obs; + RxInt countdown = 60.obs; + Timer? _countdownTimer; + + @override + void onInit() { + super.onInit(); + fetchOrder(); + startCountdown(); + } + + @override + void onClose() { + _countdownTimer?.cancel(); + super.onClose(); + } + + Future fetchOrder() async { + try { + isLoading.value = true; + var mapPassengerController = Get.find(); + + var res = await CRUD().get( + link: AppLink.getMishwari, + payload: { + // 'driverId': mapPassengerController.driverIdVip.toString(), + 'driverId': box.read(BoxName.passengerID).toString(), + }, + ); + + if (res != 'failure') { + var decodedResponse = jsonDecode(res); + if (decodedResponse['message'] is List) { + tripData.value = decodedResponse['message']; + } else { + tripData.clear(); // Ensure empty list if no data + // mySnackeBarError('No trip data found'); + } + } else { + tripData.clear(); + // mySnackeBarError('Failed to fetch trip data'); + } + } catch (e) { + tripData.clear(); + // mySnackeBarError('An error occurred: $e'); + } finally { + isLoading.value = false; + } + } + + void startCountdown() { + _countdownTimer?.cancel(); // Cancel any existing timer + countdown.value = 60; + + _countdownTimer = Timer.periodic(const Duration(seconds: 1), (timer) { + if (countdown.value > 0) { + countdown.value--; + } else { + timer.cancel(); + isButtonVisible.value = true; + } + }); + } + + void sendToDriverAgain() { + // Reset states + isButtonVisible.value = false; + fetchOrder(); // Refresh order + startCountdown(); // Restart countdown + } +} + +class VipWaittingPage extends StatelessWidget { + VipWaittingPage({super.key}); + final VipOrderController vipOrderController = Get.put(VipOrderController()); + + @override + Widget build(BuildContext context) { + return MyScafolld( + title: "Waiting VIP".tr, + body: [ + Obx(() { + // Loading state + if (vipOrderController.isLoading.value) { + return const Center(child: MyCircularProgressIndicator()); + } + + // No data state + if (vipOrderController.tripData.isEmpty) { + return Center( + child: Text( + 'No trip data available'.tr, + style: AppStyle.title, + ), + ); + } + + // Data available + var data = vipOrderController.tripData[0]; + + // Function to get the localized status string + String getLocalizedStatus(String status) { + switch (status) { + case 'pending': + return 'pending'.tr; + case 'accepted': + return 'accepted'.tr; + case 'begin': + return 'begin'.tr; + case 'rejected': + return 'rejected'.tr; + case 'cancelled': + return 'cancelled'.tr; + default: + return 'unknown'.tr; + } + } + + // Function to get the appropriate status color + Color getStatusColor(String status) { + switch (status) { + case 'pending': + return Colors.yellow; + case 'accepted': + return Colors.green; + case 'begin': + return Colors.green; + case 'rejected': + return Colors.red; + case 'cancelled': + return Colors.red; + default: + return Colors.grey; + } + } + + return Card( + elevation: 4, + shape: RoundedRectangleBorder( + borderRadius: BorderRadius.circular(12), + ), + margin: const EdgeInsets.all(16), + child: Padding( + padding: const EdgeInsets.all(16.0), + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Text( + "${'Driver Name:'.tr} ${data['name']}", + style: AppStyle.title, + ), + Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + Column( + mainAxisAlignment: MainAxisAlignment.start, + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Text( + "${'Car Plate:'.tr} ${data['car_plate']}", + style: AppStyle.title, + ), + Text( + "${'Car Make:'.tr} ${data['make']}", + style: AppStyle.title, + ), + Text( + "${'Car Model:'.tr} ${data['model']}", + style: AppStyle.title, + ), + Text( + "${"Car Color:".tr} ${data['color']}", + style: AppStyle.title, + ), + ], + ), + SizedBox( + width: 100, + height: 100, + child: Icon( + Fontisto.car, + size: 80, + color: Color( + int.parse( + data['color_hex'].replaceFirst('#', '0xff'), + ), + ), + ), + ), + ], + ), + const SizedBox(height: 12), + const Divider(), + const SizedBox(height: 12), + Container( + color: getStatusColor(data['status']), + child: Padding( + padding: const EdgeInsets.all(8.0), + child: Text( + "${'Trip Status:'.tr} ${getLocalizedStatus(data['status'])}", + style: const TextStyle(fontSize: 16), + ), + ), + ), + Text( + "${'Scheduled Time:'.tr} ${DateFormat('yyyy-MM-dd hh:mm a').format(DateTime.parse(data['timeSelected']))}", + style: const TextStyle(fontSize: 16), + ), + const SizedBox(height: 12), + Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + data['status'].toString() != 'begin' + ? MyElevatedButton( + title: "Cancel Trip".tr, + kolor: AppColor.redColor, + onPressed: () { + Get.find().cancelVip( + data['token'].toString(), + data['id'].toString(), + ); + }, + ) + : const SizedBox(), + Obx(() { + // If countdown is still running, show countdown + if (!vipOrderController.isButtonVisible.value) { + return Column( + children: [ + CircularProgressIndicator( + value: 1 - + (vipOrderController.countdown.value / 60), + strokeWidth: 6.0, + color: AppColor.greenColor, + backgroundColor: AppColor.accentColor, + ), + const SizedBox(height: 10), + Text( + "${vipOrderController.countdown.value}s ${'remaining'.tr}", + style: const TextStyle(fontSize: 16), + ), + ], + ); + } + + // Once countdown is complete, show "Send to Driver Again" button + return MyElevatedButton( + title: "Send to Driver Again".tr, + kolor: AppColor.greenColor, + onPressed: () { + Get.find() + .sendToDriverAgain(data['token']); + vipOrderController.fetchOrder(); + }, + ); + }), + ], + ), + const SizedBox( + height: 30, + ), + data['status'].toString() == 'begin' + ? MyElevatedButton( + title: "Click here to begin your trip\n\nGood luck, " + .tr + + (box.read(BoxName.name).toString().split(' ')[0]) + .toString(), + kolor: AppColor.greenColor, + onPressed: () { + final mapPassengerController = + Get.find(); + mapPassengerController.make = data['make']; + mapPassengerController.licensePlate = + data['car_plate']; + mapPassengerController.model = data['model']; + mapPassengerController.driverId = data['driverId']; + mapPassengerController.carColor = data['color']; + mapPassengerController.driverRate = data['rating']; + mapPassengerController.colorHex = data['color_hex']; + mapPassengerController.driverPhone = data['phone']; + mapPassengerController.driverToken = data['token']; + mapPassengerController.driverName = + data['name'].toString().split(' ')[0]; + + Get.back(); + + mapPassengerController.begiVIPTripFromPassenger(); + }, + ) + : const SizedBox() + ], + ), + ), + ); + }), + ], + isleading: true, + ); + } +} diff --git a/siro_rider/lib/controller/local/local_controller.dart b/siro_rider/lib/controller/local/local_controller.dart new file mode 100644 index 0000000..a744bcd --- /dev/null +++ b/siro_rider/lib/controller/local/local_controller.dart @@ -0,0 +1,78 @@ +import 'package:flutter/material.dart'; +import 'package:get/get.dart'; + +import '../../constant/box_name.dart'; +import '../../main.dart'; +import '../themes/themes.dart'; + +class LocaleController extends GetxController { + Locale? language; + String countryCode = ''; + + ThemeMode themeMode = ThemeMode.system; + + void changeLang(String langcode) { + Locale newLocale; + ThemeData newTheme; + bool isArabic = langcode.startsWith('ar'); + + if (isArabic) { + newLocale = const Locale("ar"); + newTheme = Get.isDarkMode ? darkThemeArabic : lightThemeArabic; + } else { + newLocale = const Locale("en"); + newTheme = Get.isDarkMode ? darkThemeEnglish : lightThemeEnglish; + } + + box.write(BoxName.lang, langcode); + language = newLocale; + Get.changeTheme(newTheme); + Get.updateLocale(newLocale); + update(); + } + + void changeThemeMode(ThemeMode mode) { + themeMode = mode; + Get.changeThemeMode(mode); + + // Explicitly update ThemeData to ensure immediate font and color changes + bool goDark = mode == ThemeMode.dark || + (mode == ThemeMode.system && Get.isPlatformDarkMode); + bool isArabic = (language?.languageCode ?? 'en').startsWith('ar'); + + ThemeData newTheme; + if (isArabic) { + newTheme = goDark ? darkThemeArabic : lightThemeArabic; + } else { + newTheme = goDark ? darkThemeEnglish : lightThemeEnglish; + } + Get.changeTheme(newTheme); + + box.write(BoxName.themeMode, mode.toString()); + update(); + } + + @override + void onInit() { + String? storedLang = box.read(BoxName.lang); + if (storedLang == null) { + // Use device language if no language is stored + storedLang = Get.deviceLocale!.languageCode; + box.write(BoxName.lang, storedLang); + } + + String? storedTheme = box.read(BoxName.themeMode); + if (storedTheme != null) { + if (storedTheme == ThemeMode.light.toString()) { + themeMode = ThemeMode.light; + } else if (storedTheme == ThemeMode.dark.toString()) { + themeMode = ThemeMode.dark; + } else { + themeMode = ThemeMode.system; + } + } + + changeLang(storedLang); + super.onInit(); + } +} diff --git a/siro_rider/lib/controller/local/phone_intel/countries.dart b/siro_rider/lib/controller/local/phone_intel/countries.dart new file mode 100644 index 0000000..528d4fa --- /dev/null +++ b/siro_rider/lib/controller/local/phone_intel/countries.dart @@ -0,0 +1,7574 @@ +// see: https://en.wikipedia.org/wiki/List_of_country_calling_codes +// for list of country/calling codes + +const List countries = [ + Country( + name: "Afghanistan", + nameTranslations: { + "sk": "Afganistan", + "se": "Afghanistan", + "pl": "Afganistan", + "no": "Afghanistan", + "ja": "アフガニスタン", + "it": "Afghanistan", + "zh": "阿富汗", + "nl": "Afghanistan", + "de": "Afghanistan", + "fr": "Afghanistan", + "es": "Afganistán", + "en": "Afghanistan", + "pt_BR": "Afeganistão", + "sr-Cyrl": "Авганистан", + "sr-Latn": "Avganistan", + "zh_TW": "阿富汗", + "tr": "Afganistan", + "ro": "Afganistan", + "ar": "أفغانستان", + "fa": "افغانستان", + "yue": "阿富汗" + }, + flag: "🇦🇫", + code: "AF", + dialCode: "93", + minLength: 9, + maxLength: 9, + ), + Country( + name: "Åland Islands", + nameTranslations: { + "sk": "Alandy", + "se": "Ålánda", + "pl": "Wyspy Alandzkie", + "no": "Åland", + "ja": "オーランド諸島", + "it": "Isole Åland", + "zh": "奥兰群岛", + "nl": "Åland", + "de": "Ålandinseln", + "fr": "Îles Åland", + "es": "Islas Åland", + "en": "Åland Islands", + "pt_BR": "Ilhas Aland", + "sr-Cyrl": "Аландска Острва", + "sr-Latn": "Alandska Ostrva", + "zh_TW": "奧蘭群島", + "tr": "Åland", + "ro": "Insulele Åland", + "ar": "جزر أولاند", + "fa": "جزیره اولاند", + "yue": "奧蘭群島" + }, + flag: "🇦🇽", + code: "AX", + dialCode: "358", + minLength: 15, + maxLength: 15, + ), + Country( + name: "Albania", + nameTranslations: { + "sk": "Albánsko", + "se": "Albánia", + "pl": "Albania", + "no": "Albania", + "ja": "アルバニア", + "it": "Albania", + "zh": "阿尔巴尼亚", + "nl": "Albanië", + "de": "Albanien", + "fr": "Albanie", + "es": "Albania", + "en": "Albania", + "pt_BR": "Albânia", + "sr-Cyrl": "Албанија", + "sr-Latn": "Albanija", + "zh_TW": "阿爾巴尼亞", + "tr": "Arnavutluk", + "ro": "Albania", + "ar": "ألبانيا", + "fa": "آلبانی", + "yue": "阿爾巴尼亞" + }, + flag: "🇦🇱", + code: "AL", + dialCode: "355", + minLength: 9, + maxLength: 9, + ), + Country( + name: "Algeria", + nameTranslations: { + "sk": "Alžírsko", + "se": "Algeria", + "pl": "Algieria", + "no": "Algerie", + "ja": "アルジェリア", + "it": "Algeria", + "zh": "阿尔及利亚", + "nl": "Algerije", + "de": "Algerien", + "fr": "Algérie", + "es": "Argelia", + "en": "Algeria", + "pt_BR": "Argélia", + "sr-Cyrl": "Аргентина", + "sr-Latn": "Argentina", + "zh_TW": "阿爾及利亞", + "tr": "Cezayir", + "ro": "Algeria", + "ar": "الجزائر", + "fa": "الجزیره", + "yue": "阿爾及利亞" + }, + flag: "🇩🇿", + code: "DZ", + dialCode: "213", + minLength: 9, + maxLength: 9, + ), + Country( + name: "American Samoa", + nameTranslations: { + "sk": "Americká Samoa", + "se": "Amerihká Samoa", + "pl": "Samoa Amerykańskie", + "no": "Amerikansk Samoa", + "ja": "米領サモア", + "it": "Samoa americane", + "zh": "美属萨摩亚", + "nl": "Amerikaans-Samoa", + "de": "Amerikanisch-Samoa", + "fr": "Samoa américaines", + "es": "Samoa Americana", + "en": "American Samoa", + "pt_BR": "Samoa Americana", + "sr-Cyrl": "Америчка Самоа", + "sr-Latn": "Američka Samoa", + "zh_TW": "美屬薩摩亞", + "tr": "Amerikan Samoası", + "ro": "Samoa Americană", + "ar": "ساموا الأمريكية", + "fa": "ساموا آمریکا", + "yue": "美屬薩摩亞" + }, + flag: "🇦🇸", + code: "AS", + dialCode: "1684", + minLength: 7, + maxLength: 7, + ), + Country( + name: "Andorra", + nameTranslations: { + "sk": "Andorra", + "se": "Andorra", + "pl": "Andora", + "no": "Andorra", + "ja": "アンドラ", + "it": "Andorra", + "zh": "安道尔", + "nl": "Andorra", + "de": "Andorra", + "fr": "Andorre", + "es": "Andorra", + "en": "Andorra", + "pt_BR": "Andorra", + "sr-Cyrl": "Андора", + "sr-Latn": "Andora", + "zh_TW": "安道爾", + "tr": "Andora", + "ro": "Andorra", + "ar": "أندورا", + "fa": "آندورا", + "yue": "安道爾" + }, + flag: "🇦🇩", + code: "AD", + dialCode: "376", + minLength: 6, + maxLength: 6, + ), + Country( + name: "Angola", + nameTranslations: { + "sk": "Angola", + "se": "Angola", + "pl": "Angola", + "no": "Angola", + "ja": "アンゴラ", + "it": "Angola", + "zh": "安哥拉", + "nl": "Angola", + "de": "Angola", + "fr": "Angola", + "es": "Angola", + "en": "Angola", + "pt_BR": "Angola", + "sr-Cyrl": "Ангола", + "sr-Latn": "Angola", + "zh_TW": "安哥拉", + "tr": "Angola", + "ro": "Angola", + "ar": "أنغولا", + "fa": "آنگولا", + "yue": "安哥拉" + }, + flag: "🇦🇴", + code: "AO", + dialCode: "244", + minLength: 9, + maxLength: 9, + ), + Country( + name: "Anguilla", + nameTranslations: { + "sk": "Anguilla", + "se": "Anguilla", + "pl": "Anguilla", + "no": "Anguilla", + "ja": "アンギラ", + "it": "Anguilla", + "zh": "安圭拉", + "nl": "Anguilla", + "de": "Anguilla", + "fr": "Anguilla", + "es": "Anguila", + "en": "Anguilla", + "pt_BR": "Anguilla", + "sr-Cyrl": "Ангвила", + "sr-Latn": "Angvila", + "zh_TW": "安圭拉", + "tr": "Anguilla", + "ro": "Anguilla", + "ar": "أنغويلا", + "fa": "آنگولیا", + "yue": "安圭拉" + }, + flag: "🇦🇮", + code: "AI", + dialCode: "1264", + minLength: 7, + maxLength: 7, + ), + Country( + name: "Antarctica", + nameTranslations: { + "sk": "Antarktída", + "se": "Antárktis", + "pl": "Antarktyda", + "no": "Antarktis", + "ja": "南極", + "it": "Antartide", + "zh": "南极洲", + "nl": "Antarctica", + "de": "Antarktis", + "fr": "Antarctique", + "es": "Antártida", + "en": "Antarctica", + "pt_BR": "Antártica", + "sr-Cyrl": "Антарктик", + "sr-Latn": "Antarktik", + "zh_TW": "南極", + "tr": "Antarktika", + "ro": "Antarctica", + "ar": "القارة القطبية الجنوبية", + "fa": "قطب جنوب", + "yue": "南极洲" + }, + flag: "🇦🇶", + code: "AQ", + dialCode: "672", + minLength: 6, + maxLength: 6, + ), + Country( + name: "Antigua and Barbuda", + nameTranslations: { + "sk": "Antigua a Barbuda", + "se": "Antigua ja Barbuda", + "pl": "Antigua i Barbuda", + "no": "Antigua og Barbuda", + "ja": "アンティグア・バーブーダ", + "it": "Antigua e Barbuda", + "zh": "安提瓜和巴布达", + "nl": "Antigua en Barbuda", + "de": "Antigua und Barbuda", + "fr": "Antigua-et-Barbuda", + "es": "Antigua y Barbuda", + "en": "Antigua & Barbuda", + "pt_BR": "Antigua e Barbuda", + "sr-Cyrl": "Антигва и Барбуда", + "sr-Latn": "Antigva i Barbuda", + "zh_TW": "安提瓜和巴布達", + "tr": "Antigua ve Barbuda", + "ro": "Antigua şi Barbuda", + "ar": "أنتيغوا وباربودا", + "fa": "آنتیگوآ و باربودا", + "yue": "安提瓜同巴布达" + }, + flag: "🇦🇬", + code: "AG", + dialCode: "1268", + minLength: 7, + maxLength: 7, + ), + Country( + name: "Argentina", + nameTranslations: { + "sk": "Argentína", + "se": "Argentina", + "pl": "Argentyna", + "no": "Argentina", + "ja": "アルゼンチン", + "it": "Argentina", + "zh": "阿根廷", + "nl": "Argentinië", + "de": "Argentinien", + "fr": "Argentine", + "es": "Argentina", + "en": "Argentina", + "pt_BR": "Argentina", + "sr-Cyrl": "Аргентина", + "sr-Latn": "Argentina", + "zh_TW": "阿根廷", + "tr": "Arjantin", + "ro": "Argentina", + "ar": "الأرجنتين", + "fa": "آرژانتین", + "yue": "阿根廷" + }, + flag: "🇦🇷", + code: "AR", + dialCode: "54", + minLength: 12, + maxLength: 12, + ), + Country( + name: "Armenia", + nameTranslations: { + "sk": "Arménsko", + "se": "Armenia", + "pl": "Armenia", + "no": "Armenia", + "ja": "アルメニア", + "it": "Armenia", + "zh": "亚美尼亚", + "nl": "Armenië", + "de": "Armenien", + "fr": "Arménie", + "es": "Armenia", + "en": "Armenia", + "pt_BR": "Armênia", + "sr-Cyrl": "Јерменија", + "sr-Latn": "Jermenija", + "zh_TW": "亞美尼亞", + "tr": "Ermenistan", + "ro": "Armenia", + "ar": "أرمينيا", + "fa": "ارمنستان", + "yue": "亞美尼亞" + }, + flag: "🇦🇲", + code: "AM", + dialCode: "374", + minLength: 8, + maxLength: 8, + ), + Country( + name: "Aruba", + nameTranslations: { + "sk": "Aruba", + "se": "Aruba", + "pl": "Aruba", + "no": "Aruba", + "ja": "アルバ", + "it": "Aruba", + "zh": "阿鲁巴", + "nl": "Aruba", + "de": "Aruba", + "fr": "Aruba", + "es": "Aruba", + "en": "Aruba", + "pt_BR": "Aruba", + "sr-Cyrl": "Аруба", + "sr-Latn": "Aruba", + "zh_TW": "阿魯巴", + "tr": "Aruba", + "ro": "Aruba", + "ar": "أروبا", + "fa": "آروبا", + "yue": "阿魯巴島" + }, + flag: "🇦🇼", + code: "AW", + dialCode: "297", + minLength: 7, + maxLength: 7, + ), + Country( + name: "Australia", + nameTranslations: { + "sk": "Austrália", + "se": "Austrália", + "pl": "Australia", + "no": "Australia", + "ja": "オーストラリア", + "it": "Australia", + "zh": "澳大利亚", + "nl": "Australië", + "de": "Australien", + "fr": "Australie", + "es": "Australia", + "en": "Australia", + "pt_BR": "Austrália", + "sr-Cyrl": "Аустралија", + "sr-Latn": "Australija", + "zh_TW": "澳州", + "tr": "Avustralya", + "ro": "Australia", + "ar": "أستراليا", + "fa": "استرالیا", + "yue": "澳洲" + }, + flag: "🇦🇺", + code: "AU", + dialCode: "61", + minLength: 9, + maxLength: 9, + ), + Country( + name: "Austria", + nameTranslations: { + "sk": "Rakúsko", + "se": "Nuortariika", + "pl": "Austria", + "no": "Østerrike", + "ja": "オーストリア", + "it": "Austria", + "zh": "奥地利", + "nl": "Oostenrijk", + "de": "Österreich", + "fr": "Autriche", + "es": "Austria", + "en": "Austria", + "pt_BR": "Áustria", + "sr-Cyrl": "Аустрија", + "sr-Latn": "Austrija", + "zh_TW": "奥地利", + "tr": "Avusturya", + "ro": "Austria", + "ar": "النمسا", + "fa": "اتریش", + "yue": "奧地利" + }, + flag: "🇦🇹", + code: "AT", + dialCode: "43", + minLength: 13, + maxLength: 13, + ), + Country( + name: "Azerbaijan", + nameTranslations: { + "sk": "Azerbajdžan", + "se": "Aserbaižan", + "pl": "Azerbejdżan", + "no": "Aserbajdsjan", + "ja": "アゼルバイジャン", + "it": "Azerbaigian", + "zh": "阿塞拜疆", + "nl": "Azerbeidzjan", + "de": "Aserbaidschan", + "fr": "Azerbaïdjan", + "es": "Azerbaiyán", + "en": "Azerbaijan", + "pt_BR": "Azerbaijão", + "sr-Cyrl": "Азербејџан", + "sr-Latn": "Azerbejdžan", + "zh_TW": "亞塞拜然", + "tr": "Azerbaycan", + "ro": "Azerbaidjan", + "ar": "أذربيجان", + "fa": "آذربایجان", + "yue": "阿塞拜疆" + }, + flag: "🇦🇿", + code: "AZ", + dialCode: "994", + minLength: 9, + maxLength: 9, + ), + Country( + name: "Bahamas", + nameTranslations: { + "sk": "Bahamy", + "se": "Bahamas", + "pl": "Bahamy", + "no": "Bahamas", + "ja": "バハマ", + "it": "Bahamas", + "zh": "巴哈马", + "nl": "Bahama's", + "de": "Bahamas", + "fr": "Bahamas", + "es": "Bahamas", + "en": "Bahamas", + "pt_BR": "Bahamas", + "sr-Cyrl": "Бахаме", + "sr-Latn": "Bahame", + "zh_TW": "巴哈馬", + "tr": "Bahama", + "ro": "Bahamas", + "ar": "باهاماس", + "fa": "باهاماس", + "yue": "巴哈馬" + }, + flag: "🇧🇸", + code: "BS", + dialCode: "1242", + minLength: 7, + maxLength: 7, + ), + Country( + name: "Bahrain", + nameTranslations: { + "sk": "Bahrajn", + "se": "Bahrain", + "pl": "Bahrajn", + "no": "Bahrain", + "ja": "バーレーン", + "it": "Bahrein", + "zh": "巴林", + "nl": "Bahrein", + "de": "Bahrain", + "fr": "Bahreïn", + "es": "Baréin", + "en": "Bahrain", + "pt_BR": "Bahrain", + "sr-Cyrl": "Бахреин", + "sr-Latn": "Bahrein", + "zh_TW": "巴林", + "tr": "Bahreyn", + "ro": "Bahrein", + "ar": "البحرين", + "fa": "بحرین", + "yue": "巴林" + }, + flag: "🇧🇭", + code: "BH", + dialCode: "973", + minLength: 8, + maxLength: 8, + ), + Country( + name: "Bangladesh", + nameTranslations: { + "sk": "Bangladéš", + "se": "Bangladesh", + "pl": "Bangladesz", + "no": "Bangladesh", + "ja": "バングラデシュ", + "it": "Bangladesh", + "zh": "孟加拉国", + "nl": "Bangladesh", + "de": "Bangladesch", + "fr": "Bangladesh", + "es": "Bangladés", + "en": "Bangladesh", + "pt_BR": "Bangladesh", + "sr-Cyrl": "Бангладеш", + "sr-Latn": "Bangladeš", + "zh_TW": "孟加拉", + "tr": "Bangladeş", + "ro": "Bangladesh", + "ar": "بنغلاديش", + "fa": "بنگلادش", + "yue": "孟加拉囯" + }, + flag: "🇧🇩", + code: "BD", + dialCode: "880", + minLength: 10, + maxLength: 10, + ), + Country( + name: "Barbados", + nameTranslations: { + "sk": "Barbados", + "se": "Barbados", + "pl": "Barbados", + "no": "Barbados", + "ja": "バルバドス", + "it": "Barbados", + "zh": "巴巴多斯", + "nl": "Barbados", + "de": "Barbados", + "fr": "Barbade", + "es": "Barbados", + "en": "Barbados", + "pt_BR": "Barbados", + "sr-Cyrl": "Барбадос", + "sr-Latn": "Barbados", + "zh_TW": "巴巴多斯", + "tr": "Barbados", + "ro": "Barbados", + "ar": "باربادوس", + "fa": "باربادوس", + "yue": "巴巴多斯" + }, + flag: "🇧🇧", + code: "BB", + dialCode: "1246", + minLength: 7, + maxLength: 7, + ), + Country( + name: "Belarus", + nameTranslations: { + "sk": "Bielorusko", + "se": "Vilges-Ruošša", + "pl": "Białoruś", + "no": "Hviterussland", + "ja": "ベラルーシ", + "it": "Bielorussia", + "zh": "白俄罗斯", + "nl": "Belarus", + "de": "Belarus", + "fr": "Biélorussie", + "es": "Bielorrusia", + "en": "Belarus", + "pt_BR": "Bielo-Rússia", + "sr-Cyrl": "Белорусија", + "sr-Latn": "Belorusija", + "zh_TW": "白俄羅斯", + "tr": "Belarus", + "ro": "Belarus", + "ar": "بيلاروس", + "fa": "بلاروس", + "yue": "白俄羅斯" + }, + flag: "🇧🇾", + code: "BY", + dialCode: "375", + minLength: 10, + maxLength: 10, + ), + Country( + name: "Belgium", + nameTranslations: { + "sk": "Belgicko", + "se": "Belgia", + "pl": "Belgia", + "no": "Belgia", + "ja": "ベルギー", + "it": "Belgio", + "zh": "比利时", + "nl": "België", + "de": "Belgien", + "fr": "Belgique", + "es": "Bélgica", + "en": "Belgium", + "pt_BR": "Bélgica", + "sr-Cyrl": "Белгија", + "sr-Latn": "Belgija", + "zh_TW": "比利時", + "tr": "Belçika", + "ro": "Belgia", + "ar": "بلجيكا", + "fa": "بلژیک", + "yue": "比利時" + }, + flag: "🇧🇪", + code: "BE", + dialCode: "32", + minLength: 9, + maxLength: 9, + ), + Country( + name: "Belize", + nameTranslations: { + "sk": "Belize", + "se": "Belize", + "pl": "Belize", + "no": "Belize", + "ja": "ベリーズ", + "it": "Belize", + "zh": "伯利兹", + "nl": "Belize", + "de": "Belize", + "fr": "Belize", + "es": "Belice", + "en": "Belize", + "pt_BR": "Belize", + "sr-Cyrl": "Белизе", + "sr-Latn": "Belize", + "zh_TW": "伯利茲", + "tr": "Belize", + "ro": "Belize", + "ar": "بليز", + "fa": "بليز", + "yue": "伯利茲" + }, + flag: "🇧🇿", + code: "BZ", + dialCode: "501", + minLength: 7, + maxLength: 7, + ), + Country( + name: "Benin", + nameTranslations: { + "sk": "Benin", + "se": "Benin", + "pl": "Benin", + "no": "Benin", + "ja": "ベナン", + "it": "Benin", + "zh": "贝宁", + "nl": "Benin", + "de": "Benin", + "fr": "Bénin", + "es": "Benín", + "en": "Benin", + "pt_BR": "Benin", + "sr-Cyrl": "Бенин", + "sr-Latn": "Benin", + "zh_TW": "貝南", + "tr": "Benin", + "ro": "Benin", + "ar": "بنين", + "fa": "بنين", + "yue": "貝寧" + }, + flag: "🇧🇯", + code: "BJ", + dialCode: "229", + minLength: 8, + maxLength: 8, + ), + Country( + name: "Bermuda", + nameTranslations: { + "sk": "Bermudy", + "se": "Bermuda", + "pl": "Bermudy", + "no": "Bermuda", + "ja": "バミューダ", + "it": "Bermuda", + "zh": "百慕大", + "nl": "Bermuda", + "de": "Bermuda", + "fr": "Bermudes", + "es": "Bermudas", + "en": "Bermuda", + "pt_BR": "Bermudas", + "sr-Cyrl": "Бермуда", + "sr-Latn": "Bermuda", + "zh_TW": "百慕達", + "tr": "Bermuda", + "ro": "Insulele Bermude", + "ar": "برمودا", + "fa": "برمودا", + "yue": "百慕大" + }, + flag: "🇧🇲", + code: "BM", + dialCode: "1441", + minLength: 7, + maxLength: 7, + ), + Country( + name: "Bhutan", + nameTranslations: { + "sk": "Bhután", + "se": "Bhutan", + "pl": "Bhutan", + "no": "Bhutan", + "ja": "ブータン", + "it": "Bhutan", + "zh": "不丹", + "nl": "Bhutan", + "de": "Bhutan", + "fr": "Bhoutan", + "es": "Bután", + "en": "Bhutan", + "pt_BR": "Butão", + "sr-Cyrl": "Бутан", + "sr-Latn": "Butan", + "zh_TW": "不丹", + "tr": "Bhutan", + "ro": "Bhutan", + "ar": "بوتان", + "fa": "بوتان", + "yue": "不丹" + }, + flag: "🇧🇹", + code: "BT", + dialCode: "975", + minLength: 8, + maxLength: 8, + ), + Country( + name: "Bolivia, Plurinational State of bolivia", + nameTranslations: { + "sk": "Bolívia", + "se": "Bolivia", + "pl": "Boliwia", + "no": "Bolivia", + "ja": "ボリビア", + "it": "Bolivia", + "zh": "玻利维亚", + "nl": "Bolivia", + "de": "Bolivien", + "fr": "Bolivie", + "es": "Bolivia", + "en": "Bolivia", + "pt_BR": "Bolívia", + "sr-Cyrl": "Боливија", + "sr-Latn": "Bolivija", + "zh_TW": "玻利維亞", + "tr": "Bolivya", + "ro": "Bolivia", + "ar": "بوليفيا", + "fa": "بولیوی", + "yue": "玻利維亞(多民族國家)" + }, + flag: "🇧🇴", + code: "BO", + dialCode: "591", + minLength: 8, + maxLength: 8, + ), + Country( + name: "Bosnia and Herzegovina", + nameTranslations: { + "sk": "Bosna a Hercegovina", + "se": "Bosnia-Hercegovina", + "pl": "Bośnia i Hercegowina", + "no": "Bosnia-Hercegovina", + "ja": "ボスニア・ヘルツェゴビナ", + "it": "Bosnia ed Erzegovina", + "zh": "波斯尼亚和黑塞哥维那", + "nl": "Bosnië en Herzegovina", + "de": "Bosnien und Herzegowina", + "fr": "Bosnie-Herzégovine", + "es": "Bosnia y Herzegovina", + "en": "Bosnia & Herzegovina", + "pt_BR": "Bósnia e Herzegovina", + "sr-Cyrl": "Босна и Херцеговина", + "sr-Latn": "Bosna i Hercegovina", + "zh_TW": "波士尼亞和黑塞哥維那", + "tr": "Bosna Hersek", + "ro": "Bosnia și Herțegovina", + "ar": "البوسنة والهرسك", + "fa": "بوسنی و هرزگوین", + "yue": "波斯尼亞黑塞哥維那" + }, + flag: "🇧🇦", + code: "BA", + dialCode: "387", + minLength: 9, + maxLength: 9, + ), + Country( + name: "Botswana", + nameTranslations: { + "sk": "Botswana", + "se": "Botswana", + "pl": "Botswana", + "no": "Botswana", + "ja": "ボツワナ", + "it": "Botswana", + "zh": "博茨瓦纳", + "nl": "Botswana", + "de": "Botsuana", + "fr": "Botswana", + "es": "Botsuana", + "en": "Botswana", + "pt_BR": "Botswana", + "sr-Cyrl": "Боцвана", + "sr-Latn": "Bocvana", + "zh_TW": "博茨瓦納", + "tr": "Botsvana", + "ro": "Botswana", + "ar": "بوتسوانا", + "fa": "بوتسوانا", + "yue": "博茨瓦納" + }, + flag: "🇧🇼", + code: "BW", + dialCode: "267", + minLength: 8, + maxLength: 8, + ), + Country( + name: "Bouvet Island", + nameTranslations: { + "sk": "Bouvetov ostrov", + "se": "Bouvet-sullot", + "pl": "Wyspa Bouveta", + "no": "Bouvetøya", + "ja": "ブーベ島", + "it": "Isola Bouvet", + "zh": "布韦岛", + "nl": "Bouveteiland", + "de": "Bouvetinsel", + "fr": "Île Bouvet", + "es": "Isla Bouvet", + "en": "Bouvet Island", + "pt_BR": "Ilha Bouvet", + "sr-Cyrl": "Острво Буве", + "sr-Latn": "Ostrvo Buve", + "zh_TW": "布維特島", + "tr": "Bouvet Adası", + "ro": "Insula Bouvet", + "ar": "جزيرة بوفيه", + "fa": "جزیره بووه", + "yue": "布维特岛" + }, + flag: "🇧🇻", + code: "BV", + dialCode: "47", + minLength: 15, + maxLength: 15, + ), + Country( + name: "Brazil", + nameTranslations: { + "sk": "Brazília", + "se": "Brasil", + "pl": "Brazylia", + "no": "Brasil", + "ja": "ブラジル", + "it": "Brasile", + "zh": "巴西", + "nl": "Brazilië", + "de": "Brasilien", + "fr": "Brésil", + "es": "Brasil", + "en": "Brazil", + "pt_BR": "Brasil", + "sr-Cyrl": "Бразил", + "sr-Latn": "Brazil", + "zh_TW": "巴西", + "tr": "Brezilya", + "ro": "Brazilia", + "ar": "البرازيل", + "fa": "برزیل", + "yue": "巴西" + }, + flag: "🇧🇷", + code: "BR", + dialCode: "55", + minLength: 11, + maxLength: 11, + ), + Country( + name: "British Indian Ocean Territory", + nameTranslations: { + "sk": "Britské indickooceánske územie", + "se": "British Indian Ocean Territory", + "pl": "Brytyjskie Terytorium Oceanu Indyjskiego", + "no": "Det britiske territoriet i Indiahavet", + "ja": "英領インド洋地域", + "it": "Territorio britannico dell'Oceano Indiano", + "zh": "英属印度洋领地", + "nl": "Brits Indische Oceaanterritorium", + "de": "Britisches Territorium im Indischen Ozean", + "fr": "Territoire britannique de l'océan Indien", + "es": "Territorio Británico del Océano Índico", + "en": "British Indian Ocean Territory", + "pt_BR": "Território Britânico do Oceano Índico", + "sr-Cyrl": "Британска територија Индијског океана", + "sr-Latn": "Britanska teritorija Indijskog okeana", + "zh_TW": "英屬印度洋領地", + "tr": "Britanya Hint Okyanusu Toprakları", + "ro": "Teritoriul Britanic din Oceanul Indian", + "ar": "إقليم المحيط الهندي البريطاني", + "fa": "سرزمین دریایی هند - بریتانیا", + "yue": "英屬印度洋領土" + }, + flag: "🇮🇴", + code: "IO", + dialCode: "246", + minLength: 7, + maxLength: 7, + ), + Country( + name: "Brunei Darussalam", + nameTranslations: { + "sk": "Brunej", + "se": "Brunei", + "pl": "Brunei", + "no": "Brunei", + "ja": "ブルネイ", + "it": "Brunei", + "zh": "文莱", + "nl": "Brunei", + "de": "Brunei Darussalam", + "fr": "Brunéi Darussalam", + "es": "Brunéi", + "en": "Brunei", + "pt_BR": "Brunei", + "sr-Cyrl": "Брунеј", + "sr-Latn": "Brunej", + "zh_TW": "汶萊", + "tr": "Bruney", + "ro": "Brunei", + "ar": "بروناي", + "fa": "برونئی", + "yue": "文萊達魯薩蘭國" + }, + flag: "🇧🇳", + code: "BN", + dialCode: "673", + minLength: 7, + maxLength: 7, + ), + Country( + name: "Bulgaria", + nameTranslations: { + "sk": "Bulharsko", + "se": "Bulgária", + "pl": "Bułgaria", + "no": "Bulgaria", + "ja": "ブルガリア", + "it": "Bulgaria", + "zh": "保加利亚", + "nl": "Bulgarije", + "de": "Bulgarien", + "fr": "Bulgarie", + "es": "Bulgaria", + "en": "Bulgaria", + "pt_BR": "Bulgária", + "sr-Cyrl": "Бугарска", + "sr-Latn": "Bugarska", + "zh_TW": "保加利亞", + "tr": "Bulgaristan", + "ro": "Bulgaria", + "ar": "بلغاريا", + "fa": "بلغارستان", + "yue": "保加利亞" + }, + flag: "🇧🇬", + code: "BG", + dialCode: "359", + minLength: 9, + maxLength: 9, + ), + Country( + name: "Burkina Faso", + nameTranslations: { + "sk": "Burkina Faso", + "se": "Burkina Faso", + "pl": "Burkina Faso", + "no": "Burkina Faso", + "ja": "ブルキナファソ", + "it": "Burkina Faso", + "zh": "布基纳法索", + "nl": "Burkina Faso", + "de": "Burkina Faso", + "fr": "Burkina Faso", + "es": "Burkina Faso", + "en": "Burkina Faso", + "pt_BR": "Burkina Faso", + "sr-Cyrl": "Буркина Фасо", + "sr-Latn": "Burkina Faso", + "zh_TW": "布吉納法索", + "tr": "Burkina Faso", + "ro": "Burkina Faso", + "ar": "بوركينا فاسو", + "fa": "بورکینافاسو", + "yue": "布基納法索" + }, + flag: "🇧🇫", + code: "BF", + dialCode: "226", + minLength: 8, + maxLength: 8, + ), + Country( + name: "Burundi", + nameTranslations: { + "sk": "Burundi", + "se": "Burundi", + "pl": "Burundi", + "no": "Burundi", + "ja": "ブルンジ", + "it": "Burundi", + "zh": "布隆迪", + "nl": "Burundi", + "de": "Burundi", + "fr": "Burundi", + "es": "Burundi", + "en": "Burundi", + "pt_BR": "Burundi", + "sr-Cyrl": "Бурунди", + "sr-Latn": "Burundi", + "zh_TW": "蒲隆地", + "tr": "Burundi", + "ro": "Burundi", + "ar": "بوروندي", + "fa": "بوروندی", + "yue": "蒲隆地" + }, + flag: "🇧🇮", + code: "BI", + dialCode: "257", + minLength: 8, + maxLength: 8, + ), + Country( + name: "Cambodia", + nameTranslations: { + "sk": "Kambodža", + "se": "Kambodža", + "pl": "Kambodża", + "no": "Kambodsja", + "ja": "カンボジア", + "it": "Cambogia", + "zh": "柬埔寨", + "nl": "Cambodja", + "de": "Kambodscha", + "fr": "Cambodge", + "es": "Camboya", + "en": "Cambodia", + "pt_BR": "Camboja", + "sr-Cyrl": "Камбоџа", + "sr-Latn": "Kambodža", + "zh_TW": "柬埔寨", + "tr": "Kamboçya", + "ro": "Cambogia", + "ar": "كمبوديا", + "fa": "کامبوج", + "yue": "柬埔寨" + }, + flag: "🇰🇭", + code: "KH", + dialCode: "855", + minLength: 9, + maxLength: 9, + ), + Country( + name: "Cameroon", + nameTranslations: { + "sk": "Kamerun", + "se": "Kamerun", + "pl": "Kamerun", + "no": "Kamerun", + "ja": "カメルーン", + "it": "Camerun", + "zh": "喀麦隆", + "nl": "Kameroen", + "de": "Kamerun", + "fr": "Cameroun", + "es": "Camerún", + "en": "Cameroon", + "pt_BR": "Camarões", + "sr-Cyrl": "Камерун", + "sr-Latn": "Kamerun", + "zh_TW": "喀麥隆", + "tr": "Kamerun", + "ro": "Camerun", + "ar": "الكاميرون", + "fa": "کامرون", + "yue": "喀 麥 隆" + }, + flag: "🇨🇲", + code: "CM", + dialCode: "237", + minLength: 9, + maxLength: 9, + ), + Country( + name: "Canada", + nameTranslations: { + "sk": "Kanada", + "se": "Kanáda", + "pl": "Kanada", + "no": "Canada", + "ja": "カナダ", + "it": "Canada", + "zh": "加拿大", + "nl": "Canada", + "de": "Kanada", + "fr": "Canada", + "es": "Canadá", + "en": "Canada", + "pt_BR": "Canadá", + "sr-Cyrl": "Канада", + "sr-Latn": "Kanada", + "zh_TW": "加拿大", + "tr": "Kanada", + "ro": "Canada", + "ar": "كندا", + "fa": "کانادا", + "yue": "加拿大" + }, + flag: "🇨🇦", + code: "CA", + dialCode: "1", + minLength: 10, + maxLength: 10, + ), + Country( + name: "Cayman Islands", + nameTranslations: { + "sk": "Kajmanie ostrovy", + "se": "Cayman-sullot", + "pl": "Kajmany", + "no": "Caymanøyene", + "ja": "ケイマン諸島", + "it": "Isole Cayman", + "zh": "开曼群岛", + "nl": "Kaaimaneilanden", + "de": "Kaimaninseln", + "fr": "Îles Caïmans", + "es": "Islas Caimán", + "en": "Cayman Islands", + "pt_BR": "Ilhas Cayman", + "sr-Cyrl": "Кајманска Острва", + "sr-Latn": "Kajmanska Ostrva", + "zh_TW": "開曼群島", + "tr": "Cayman Adaları", + "ro": "Insulele Cayman", + "ar": "جزر كايمان", + "fa": "جزایر کیمن", + "yue": "開曼群島" + }, + flag: "🇰🇾", + code: "KY", + dialCode: "345", + minLength: 7, + maxLength: 7, + ), + Country( + name: "Central African Republic", + nameTranslations: { + "sk": "Stredoafrická republika", + "se": "Gaska-Afrihká dásseváldi", + "pl": "Republika Środkowoafrykańska", + "no": "Den sentralafrikanske republikk", + "ja": "中央アフリカ共和国", + "it": "Repubblica Centrafricana", + "zh": "中非共和国", + "nl": "Centraal-Afrikaanse Republiek", + "de": "Zentralafrikanische Republik", + "fr": "République centrafricaine", + "es": "República Centroafricana", + "en": "Central African Republic", + "pt_BR": "República Centro-Africana", + "sr-Cyrl": "Централноафричка Република", + "sr-Latn": "Centralnoafrička Republika", + "zh_TW": "中非共和國", + "tr": "Orta Afrika Cumhuriyeti", + "ro": "Republica Centrafricană", + "ar": "جمهورية أفريقيا الوسطى", + "fa": "جمهوری افریقای مرکزی", + "yue": "中非共和國" + }, + flag: "🇨🇫", + code: "CF", + dialCode: "236", + minLength: 8, + maxLength: 8, + ), + Country( + name: "Chad", + nameTranslations: { + "sk": "Čad", + "se": "Tčad", + "pl": "Czad", + "no": "Tsjad", + "ja": "チャド", + "it": "Ciad", + "zh": "乍得", + "nl": "Tsjaad", + "de": "Tschad", + "fr": "Tchad", + "es": "Chad", + "en": "Chad", + "pt_BR": "Chade", + "sr-Cyrl": "Чад", + "sr-Latn": "Čad", + "zh_TW": "查德", + "tr": "Çad", + "ro": "Ciad", + "ar": "تشاد", + "fa": "چاد", + "yue": "乍得" + }, + flag: "🇹🇩", + code: "TD", + dialCode: "235", + minLength: 7, + maxLength: 7, + ), + Country( + name: "Chile", + nameTranslations: { + "sk": "Čile", + "se": "Čiile", + "pl": "Chile", + "no": "Chile", + "ja": "チリ", + "it": "Cile", + "zh": "智利", + "nl": "Chili", + "de": "Chile", + "fr": "Chili", + "es": "Chile", + "en": "Chile", + "pt_BR": "Chile", + "sr-Cyrl": "Чиле", + "sr-Latn": "Čile", + "zh_TW": "智利", + "tr": "Şili", + "ro": "Chile", + "ar": "تشيلي", + "fa": "شیلی", + "yue": "智利" + }, + flag: "🇨🇱", + code: "CL", + dialCode: "56", + minLength: 9, + maxLength: 9, + ), + Country( + name: "China", + nameTranslations: { + "sk": "Čína", + "se": "Kiinná", + "pl": "Chiny", + "no": "Kina", + "ja": "中国", + "it": "Cina", + "zh": "中国", + "nl": "China", + "de": "China", + "fr": "Chine", + "es": "China", + "en": "China", + "pt_BR": "China", + "sr-Cyrl": "Кина", + "sr-Latn": "Kina", + "zh_TW": "中國", + "tr": "Çin", + "ro": "China", + "ar": "الصين", + "fa": "چین", + "yue": "中國" + }, + flag: "🇨🇳", + code: "CN", + dialCode: "86", + minLength: 11, + maxLength: 12, + ), + Country( + name: "Christmas Island", + nameTranslations: { + "sk": "Vianočný ostrov", + "se": "Juovllat-sullot", + "pl": "Wyspa Bożego Narodzenia", + "no": "Christmasøya", + "ja": "クリスマス島", + "it": "Isola Christmas", + "zh": "圣诞岛", + "nl": "Christmaseiland", + "de": "Weihnachtsinsel", + "fr": "Île Christmas", + "es": "Isla de Navidad", + "en": "Christmas Island", + "pt_BR": "Ilha do Natal", + "sr-Cyrl": "Ускршња Острва", + "sr-Latn": "Uskršnja Ostrva", + "zh_TW": "聖誕島", + "tr": "Christmas Adası", + "ro": "Insula Crăciunului", + "ar": "جزيرة عيد الميلاد", + "fa": "جزیره کریسمس", + "yue": "聖誕島" + }, + flag: "🇨🇽", + code: "CX", + dialCode: "61", + minLength: 15, + maxLength: 15, + ), + Country( + name: "Cocos (Keeling) Islands", + nameTranslations: { + "sk": "Kokosové ostrovy", + "se": "Cocos-sullot", + "pl": "Wyspy Kokosowe", + "no": "Kokosøyene", + "ja": "ココス(キーリング)諸島", + "it": "Isole Cocos (Keeling)", + "zh": "科科斯(基林)群岛", + "nl": "Cocoseilanden", + "de": "Kokosinseln", + "fr": "Îles Cocos", + "es": "Islas Cocos", + "en": "Cocos (Keeling) Islands", + "pt_BR": "Ilhas Cocos (Keeling)", + "sr-Cyrl": "Кокосова Острва", + "sr-Latn": "Kokosova Ostrva", + "zh_TW": "科科斯(基林)群島", + "tr": "Cocos (Keyling) Adaları", + "ro": "Insulele Cocos", + "ar": "جزر كوكوس", + "fa": "جزایر کوکوس", + "yue": "可可島(基林)群島" + }, + flag: "🇨🇨", + code: "CC", + dialCode: "61", + minLength: 15, + maxLength: 15, + ), + Country( + name: "Colombia", + nameTranslations: { + "sk": "Kolumbia", + "se": "Kolombia", + "pl": "Kolumbia", + "no": "Colombia", + "ja": "コロンビア", + "it": "Colombia", + "zh": "哥伦比亚", + "nl": "Colombia", + "de": "Kolumbien", + "fr": "Colombie", + "es": "Colombia", + "en": "Colombia", + "pt_BR": "Colômbia", + "sr-Cyrl": "Колумбија", + "sr-Latn": "Kolumbija", + "zh_TW": "哥倫比亞", + "tr": "Kolombiya", + "ro": "Columbia", + "ar": "كولومبيا", + "fa": "کلمبیا", + "yue": "哥倫比亞" + }, + flag: "🇨🇴", + code: "CO", + dialCode: "57", + minLength: 10, + maxLength: 10, + ), + Country( + name: "Comoros", + nameTranslations: { + "sk": "Komory", + "se": "Komoros", + "pl": "Komory", + "no": "Komorene", + "ja": "コモロ", + "it": "Comore", + "zh": "科摩罗", + "nl": "Comoren", + "de": "Komoren", + "fr": "Comores", + "es": "Comoras", + "en": "Comoros", + "pt_BR": "Comores", + "sr-Cyrl": "Комори", + "sr-Latn": "Komori", + "zh_TW": "科摩羅", + "tr": "Komor Adaları", + "ro": "Comore", + "ar": "جزر القمر", + "fa": "جزیره کومور", + "yue": "科摩羅" + }, + flag: "🇰🇲", + code: "KM", + dialCode: "269", + minLength: 7, + maxLength: 7, + ), + Country( + name: "Congo", + nameTranslations: { + "sk": "Konžská republika", + "se": "Kongo-Brazzaville", + "pl": "Kongo", + "no": "Kongo-Brazzaville", + "ja": "コンゴ共和国(ブラザビル)", + "it": "Congo-Brazzaville", + "zh": "刚果(布)", + "nl": "Congo-Brazzaville", + "de": "Kongo-Brazzaville", + "fr": "Congo-Brazzaville", + "es": "Congo", + "en": "Congo - Brazzaville", + "pt_BR": "República do Congo", + "sr-Cyrl": "Република Конго", + "sr-Latn": "Republika Kongo", + "zh_TW": "剛果共和國(布拉柴維爾)", + "tr": "Kongo Cumhuriyeti", + "ro": "Republica Congo", + "ar": "جمهورية الكونغو", + "fa": "جمهوری کنگو", + "yue": "剛果(共和國)" + }, + flag: "🇨🇬", + code: "CG", + dialCode: "242", + minLength: 7, + maxLength: 7, + ), + Country( + name: "Congo, The Democratic Republic of the Congo", + nameTranslations: { + "sk": "Konžská demokratická republika", + "se": "Kongo-Kinshasa", + "pl": "Demokratyczna Republika Konga", + "no": "Kongo-Kinshasa", + "ja": "コンゴ民主共和国(キンシャサ)", + "it": "Congo - Kinshasa", + "zh": "刚果(金)", + "nl": "Congo-Kinshasa", + "de": "Kongo-Kinshasa", + "fr": "Congo-Kinshasa", + "es": "República Democrática del Congo", + "en": "Congo - Kinshasa", + "pt_BR": "República Democrática do Congo", + "sr-Cyrl": "Демократска Република Конго", + "sr-Latn": "Demokratska Republika Kongo", + "zh_TW": "剛果民主共和國(金沙薩)", + "tr": "Kongo Demokratik Cumhuriyeti", + "ro": "Republica Democrată Congo", + "ar": "جمهورية الكونغو الديمقراطية", + "fa": "جمهوری دموکراتیک کنگو", + "yue": "剛果(金)" + }, + flag: "🇨🇩", + code: "CD", + dialCode: "243", + minLength: 9, + maxLength: 9, + ), + Country( + name: "Cook Islands", + nameTranslations: { + "sk": "Cookove ostrovy", + "se": "Cook-sullot", + "pl": "Wyspy Cooka", + "no": "Cookøyene", + "ja": "クック諸島", + "it": "Isole Cook", + "zh": "库克群岛", + "nl": "Cookeilanden", + "de": "Cookinseln", + "fr": "Îles Cook", + "es": "Islas Cook", + "en": "Cook Islands", + "pt_BR": "Ilhas Cook", + "sr-Cyrl": "Кукова Острва", + "sr-Latn": "Kukova Ostrva", + "zh_TW": "庫克群島", + "tr": "Cook Adaları", + "ro": "Insulele Cook", + "ar": "جزر كوك", + "fa": "جزایر کوک", + "yue": "庫克群島" + }, + flag: "🇨🇰", + code: "CK", + dialCode: "682", + minLength: 5, + maxLength: 5, + ), + Country( + name: "Costa Rica", + nameTranslations: { + "sk": "Kostarika", + "se": "Costa Rica", + "pl": "Kostaryka", + "no": "Costa Rica", + "ja": "コスタリカ", + "it": "Costa Rica", + "zh": "哥斯达黎加", + "nl": "Costa Rica", + "de": "Costa Rica", + "fr": "Costa Rica", + "es": "Costa Rica", + "en": "Costa Rica", + "pt_BR": "Costa Rica", + "sr-Cyrl": "Коста Рика", + "sr-Latn": "Kosta Rika", + "zh_TW": "哥斯大黎加", + "tr": "Kosta Rika", + "ro": "Costa Rica", + "ar": "كوستاريكا", + "fa": "کاستاریکا", + "yue": "哥斯達黎加" + }, + flag: "🇨🇷", + code: "CR", + dialCode: "506", + minLength: 8, + maxLength: 8, + ), + Country( + name: "Côte d'Ivoire", + nameTranslations: { + "sk": "Pobrežie Slonoviny", + "se": "Elfenbenariddu", + "pl": "Côte d'Ivoire", + "no": "Elfenbenskysten", + "ja": "コートジボワール", + "it": "Costa d'Avorio", + "zh": "科特迪瓦", + "nl": "Ivoorkust", + "de": "Côte d'Ivoire", + "fr": "Côte d'Ivoire", + "es": "Côte d'Ivoire", + "en": "Côte d'Ivoire", + "pt_BR": "Côte d'Ivoire", + "sr-Cyrl": "Обала Слоноваче", + "sr-Latn": "Obala Slonovače", + "zh_TW": "象牙海岸", + "tr": "Fildişi Kıyısı", + "ro": "Coasta de fildeș", + "ar": "ساحل العاج", + "fa": "ساحل عاج", + "yue": "科特迪瓦" + }, + flag: "🇨🇮", + code: "CI", + dialCode: "225", + minLength: 10, + maxLength: 10, + ), + Country( + name: "Croatia", + nameTranslations: { + "sk": "Chorvátsko", + "se": "Kroátia", + "pl": "Chorwacja", + "no": "Kroatia", + "ja": "クロアチア", + "it": "Croazia", + "zh": "克罗地亚", + "nl": "Kroatië", + "de": "Kroatien", + "fr": "Croatie", + "es": "Croacia", + "en": "Croatia", + "pt_BR": "Croácia", + "sr-Cyrl": "Хрватска", + "sr-Latn": "Hrvatska", + "zh_TW": "克羅埃西亞", + "tr": "Hırvatistan", + "ro": "Croația", + "ar": "كرواتيا", + "fa": "کرواسی", + "yue": "克羅地亞" + }, + flag: "🇭🇷", + code: "HR", + dialCode: "385", + minLength: 12, + maxLength: 12, + ), + Country( + name: "Cuba", + nameTranslations: { + "sk": "Kuba", + "se": "Kuba", + "pl": "Kuba", + "no": "Cuba", + "ja": "キューバ", + "it": "Cuba", + "zh": "古巴", + "nl": "Cuba", + "de": "Kuba", + "fr": "Cuba", + "es": "Cuba", + "en": "Cuba", + "pt_BR": "Cuba", + "sr-Cyrl": "Куба", + "sr-Latn": "Kuba", + "zh_TW": "古巴", + "tr": "Küba", + "ro": "Cuba", + "ar": "كوبا", + "fa": "كوبا", + "yue": "古巴" + }, + flag: "🇨🇺", + code: "CU", + dialCode: "53", + minLength: 8, + maxLength: 8, + ), + Country( + name: "Cyprus", + nameTranslations: { + "sk": "Cyprus", + "se": "Kypros", + "pl": "Cypr", + "no": "Kypros", + "ja": "キプロス", + "it": "Cipro", + "zh": "塞浦路斯", + "nl": "Cyprus", + "de": "Zypern", + "fr": "Chypre", + "es": "Chipre", + "en": "Cyprus", + "pt_BR": "Chipre", + "sr-Cyrl": "Кипар", + "sr-Latn": "Kipar", + "zh_TW": "塞普勒斯", + "tr": "Kıbrıs", + "ro": "Cipru", + "ar": "قبرص", + "fa": "قبرس", + "yue": "塞浦路斯" + }, + flag: "🇨🇾", + code: "CY", + dialCode: "357", + minLength: 8, + maxLength: 8, + ), + Country( + name: "Czech Republic", + nameTranslations: { + "sk": "Česko", + "se": "Čeahkka", + "pl": "Czechy", + "no": "Tsjekkia", + "ja": "チェコ", + "it": "Cechia", + "zh": "捷克", + "nl": "Tsjechië", + "de": "Tschechien", + "fr": "Tchéquie", + "es": "Chequia", + "en": "Czechia", + "pt_BR": "Czechia", + "sr-Cyrl": "Чешка", + "sr-Latn": "Češka", + "zh_TW": "捷克", + "tr": "Çek Cumhuriyeti", + "ro": "Cehia", + "ar": "جمهورية التشيك", + "fa": "جمهوری چک", + "yue": "捷克共和國" + }, + flag: "🇨🇿", + code: "CZ", + dialCode: "420", + minLength: 9, + maxLength: 9, + ), + Country( + name: "Denmark", + nameTranslations: { + "sk": "Dánsko", + "se": "Dánmárku", + "pl": "Dania", + "no": "Danmark", + "ja": "デンマーク", + "it": "Danimarca", + "zh": "丹麦", + "nl": "Denemarken", + "de": "Dänemark", + "fr": "Danemark", + "es": "Dinamarca", + "en": "Denmark", + "pt_BR": "Dinamarca", + "sr-Cyrl": "Данска", + "sr-Latn": "Danska", + "zh_TW": "丹麥", + "tr": "Danimarka", + "ro": "Danemarca", + "ar": "الدنمارك", + "fa": "دانمارک", + "yue": "丹麥" + }, + flag: "🇩🇰", + code: "DK", + dialCode: "45", + minLength: 8, + maxLength: 8, + ), + Country( + name: "Djibouti", + nameTranslations: { + "sk": "Džibutsko", + "se": "Djibouti", + "pl": "Dżibuti", + "no": "Djibouti", + "ja": "ジブチ", + "it": "Gibuti", + "zh": "吉布提", + "nl": "Djibouti", + "de": "Dschibuti", + "fr": "Djibouti", + "es": "Yibuti", + "en": "Djibouti", + "pt_BR": "Djibouti", + "sr-Cyrl": "Џибути", + "sr-Latn": "Džibuti", + "zh_TW": "吉布地", + "tr": "Cibuti", + "ro": "Djibouti", + "ar": "جيبوتي", + "fa": "جیبوتی", + "yue": "吉布提" + }, + flag: "🇩🇯", + code: "DJ", + dialCode: "253", + minLength: 6, + maxLength: 6, + ), + Country( + name: "Dominica", + nameTranslations: { + "sk": "Dominika", + "se": "Dominica", + "pl": "Dominika", + "no": "Dominica", + "ja": "ドミニカ国", + "it": "Dominica", + "zh": "多米尼克", + "nl": "Dominica", + "de": "Dominica", + "fr": "Dominique", + "es": "Dominica", + "en": "Dominica", + "pt_BR": "Dominica", + "sr-Cyrl": "Доминика", + "sr-Latn": "Dominika", + "zh_TW": "多明尼加", + "tr": "Dominika", + "ro": "Dominica", + "ar": "دومينيكا", + "fa": "دومينيكا", + "yue": "多米尼加" + }, + flag: "🇩🇲", + code: "DM", + dialCode: "1767", + minLength: 7, + maxLength: 7, + ), + Country( + name: "Dominican Republic", + nameTranslations: { + "sk": "Dominikánska republika", + "se": "Dominikána dásseváldi", + "pl": "Dominikana", + "no": "Den dominikanske republikk", + "ja": "ドミニカ共和国", + "it": "Repubblica Dominicana", + "zh": "多米尼加共和国", + "nl": "Dominicaanse Republiek", + "de": "Dominikanische Republik", + "fr": "République dominicaine", + "es": "República Dominicana", + "en": "Dominican Republic", + "pt_BR": "República Dominicana", + "sr-Cyrl": "Доминиканска Република", + "sr-Latn": "Dominikanska Republika", + "zh_TW": "多明尼加共和國", + "tr": "Dominik Cumhuriyeti", + "ro": "Republica Dominicană", + "ar": "جمهورية الدومينيكان", + "fa": "جمهوری دومنیکن", + "yue": "多明尼加共和國" + }, + flag: "🇩🇴", + code: "DO", + dialCode: "1", + minLength: 10, + maxLength: 10, + ), + Country( + name: "Ecuador", + nameTranslations: { + "sk": "Ekvádor", + "se": "Ecuador", + "pl": "Ekwador", + "no": "Ecuador", + "ja": "エクアドル", + "it": "Ecuador", + "zh": "厄瓜多尔", + "nl": "Ecuador", + "de": "Ecuador", + "fr": "Équateur", + "es": "Ecuador", + "en": "Ecuador", + "pt_BR": "Equador", + "sr-Cyrl": "Еквадор", + "sr-Latn": "Ekvador", + "zh_TW": "厄瓜多", + "tr": "Ekvador", + "ro": "Ecuador", + "ar": "الإكوادور", + "fa": "اكوادور", + "yue": "厄瓜多爾" + }, + flag: "🇪🇨", + code: "EC", + dialCode: "593", + minLength: 8, + maxLength: 9, + ), + Country( + name: "Egypt", + nameTranslations: { + "sk": "Egypt", + "se": "Egypt", + "pl": "Egipt", + "no": "Egypt", + "ja": "エジプト", + "it": "Egitto", + "zh": "埃及", + "nl": "Egypt", + "de": "Ägypt", + "fr": "Égypte", + "es": "Egipt", + "en": "Egypt", + "pt_BR": "Egito", + "sr-Cyrl": "Египат", + "sr-Latn": "Egipat", + "zh_TW": "埃及", + "tr": "Mısır", + "ro": "Egipt", + "ar": "مصر", + "fa": "مصر", + "yue": "埃及" + }, + flag: "🇪🇬", + code: "EG", + dialCode: "2", + minLength: 11, + maxLength: 11, + ), + Country( + name: "El Salvador", + nameTranslations: { + "sk": "Salvádor", + "se": "El Salvador", + "pl": "Salwador", + "no": "El Salvador", + "ja": "エルサルバドル", + "it": "El Salvador", + "zh": "萨尔瓦多", + "nl": "El Salvador", + "de": "El Salvador", + "fr": "Salvador", + "es": "El Salvador", + "en": "El Salvador", + "pt_BR": "El Salvador", + "sr-Cyrl": "Салвадор", + "sr-Latn": "Salvador", + "zh_TW": "薩爾瓦多", + "tr": "El Salvador", + "ro": "Salvador", + "ar": "السلفادور", + "fa": "ال سالوادور", + "yue": "薩爾瓦多" + }, + flag: "🇸🇻", + code: "SV", + dialCode: "503", + minLength: 11, + maxLength: 11, + ), + Country( + name: "Equatorial Guinea", + nameTranslations: { + "sk": "Rovníková Guinea", + "se": "Ekvatoriála Guinea", + "pl": "Gwinea Równikowa", + "no": "Ekvatorial-Guinea", + "ja": "赤道ギニア", + "it": "Guinea Equatoriale", + "zh": "赤道几内亚", + "nl": "Equatoriaal-Guinea", + "de": "Äquatorialguinea", + "fr": "Guinée équatoriale", + "es": "Guinea Ecuatorial", + "en": "Equatorial Guinea", + "pt_BR": "Guiné Equatorial", + "sr-Cyrl": "Екваторијална Гвинеја", + "sr-Latn": "Ekvatorijalna Gvineja", + "zh_TW": "赤道幾內亞", + "tr": "Ekvator Ginesi", + "ro": "Guineea Ecuatorială", + "ar": "غينيا الاستوائية", + "fa": "گینه استوایی", + "yue": "赤道幾內亞" + }, + flag: "🇬🇶", + code: "GQ", + dialCode: "240", + minLength: 6, + maxLength: 6, + ), + Country( + name: "Eritrea", + nameTranslations: { + "sk": "Eritrea", + "se": "Eritrea", + "pl": "Erytrea", + "no": "Eritrea", + "ja": "エリトリア", + "it": "Eritrea", + "zh": "厄立特里亚", + "nl": "Eritrea", + "de": "Eritrea", + "fr": "Érythrée", + "es": "Eritrea", + "en": "Eritrea", + "pt_BR": "Eritreia", + "sr-Cyrl": "Еритреја", + "sr-Latn": "Eritreja", + "zh_TW": "厄立特裡亞", + "tr": "Eritre", + "ro": "Eritreea", + "ar": "إريتريا", + "fa": "اریتره", + "yue": "厄立特里亞" + }, + flag: "🇪🇷", + code: "ER", + dialCode: "291", + minLength: 7, + maxLength: 7, + ), + Country( + name: "Estonia", + nameTranslations: { + "sk": "Estónsko", + "se": "Estlánda", + "pl": "Estonia", + "no": "Estland", + "ja": "エストニア", + "it": "Estonia", + "zh": "爱沙尼亚", + "nl": "Estland", + "de": "Estland", + "fr": "Estonie", + "es": "Estonia", + "en": "Estonia", + "pt_BR": "Estônia", + "sr-Cyrl": "Естонија", + "sr-Latn": "Estonija", + "zh_TW": "愛沙尼亞", + "tr": "Estonya", + "ro": "Estonia", + "ar": "إستونيا", + "fa": "استونی", + "yue": "愛沙尼亞" + }, + flag: "🇪🇪", + code: "EE", + dialCode: "372", + minLength: 10, + maxLength: 10, + ), + Country( + name: "Ethiopia", + nameTranslations: { + "sk": "Etiópia", + "se": "Etiopia", + "pl": "Etiopia", + "no": "Etiopia", + "ja": "エチオピア", + "it": "Etiopia", + "zh": "埃塞俄比亚", + "nl": "Ethiopië", + "de": "Äthiopien", + "fr": "Éthiopie", + "es": "Etiopía", + "en": "Ethiopia", + "pt_BR": "Etiópia", + "sr-Cyrl": "Етиопија", + "sr-Latn": "Etiopija", + "zh_TW": "伊索比亞", + "tr": "Etiyopya", + "ro": "Etiopia", + "ar": "إثيوبيا", + "fa": "اتیوپی", + "yue": "埃塞俄比亞" + }, + flag: "🇪🇹", + code: "ET", + dialCode: "251", + minLength: 9, + maxLength: 9, + ), + Country( + name: "Falkland Islands (Malvinas)", + nameTranslations: { + "sk": "Falklandy", + "se": "Falklandsullot", + "pl": "Falklandy", + "no": "Falklandsøyene", + "ja": "フォークランド諸島", + "it": "Isole Falkland", + "zh": "福克兰群岛", + "nl": "Falklandeilanden", + "de": "Falklandinseln", + "fr": "Îles Malouines", + "es": "Islas Malvinas", + "en": "Falkland Islands", + "pt_BR": "Ilhas Falkland", + "sr-Cyrl": "Фокландска Острва", + "sr-Latn": "Foklandska Ostrva", + "zh_TW": "福克蘭群島", + "tr": "Falkland Adaları", + "ro": "Insulele Falklands", + "ar": "جزر فوكلاند", + "fa": "جزایر فالکلند", + "yue": "福克蘭群島(馬爾維納斯群島)" + }, + flag: "🇫🇰", + code: "FK", + dialCode: "500", + minLength: 5, + maxLength: 5, + ), + Country( + name: "Faroe Islands", + nameTranslations: { + "sk": "Faerské ostrovy", + "se": "Fearsullot", + "pl": "Wyspy Owcze", + "no": "Færøyene", + "ja": "フェロー諸島", + "it": "Isole Fær Øer", + "zh": "法罗群岛", + "nl": "Faeröer", + "de": "Färöer", + "fr": "Îles Féroé", + "es": "Islas Feroe", + "en": "Faroe Islands", + "pt_BR": "ilhas Faroe", + "sr-Cyrl": "Фарска Острва", + "sr-Latn": "Farska Ostrva", + "zh_TW": "法羅群島", + "tr": "Faroe Adaları", + "ro": "Insulele Feroe", + "ar": "جزر فارو", + "fa": "جزایر فارو", + "yue": "法羅群島" + }, + flag: "🇫🇴", + code: "FO", + dialCode: "298", + minLength: 6, + maxLength: 6, + ), + Country( + name: "Fiji", + nameTranslations: { + "sk": "Fidži", + "se": "Fijisullot", + "pl": "Fidżi", + "no": "Fiji", + "ja": "フィジー", + "it": "Figi", + "zh": "斐济", + "nl": "Fiji", + "de": "Fidschi", + "fr": "Fidji", + "es": "Fiyi", + "en": "Fiji", + "pt_BR": "Fiji", + "sr-Cyrl": "Фиџи", + "sr-Latn": "Fidži", + "zh_TW": "斐濟", + "tr": "Fiji", + "ro": "Fiji", + "ar": "فيجي", + "fa": "فيجي", + "yue": "斐濟" + }, + flag: "🇫🇯", + code: "FJ", + dialCode: "679", + minLength: 7, + maxLength: 7, + ), + Country( + name: "Finland", + nameTranslations: { + "sk": "Fínsko", + "se": "Suopma", + "pl": "Finlandia", + "no": "Finland", + "ja": "フィンランド", + "it": "Finlandia", + "zh": "芬兰", + "nl": "Finland", + "de": "Finnland", + "fr": "Finlande", + "es": "Finlandia", + "en": "Finland", + "pt_BR": "Finlândia", + "sr-Cyrl": "Финска", + "sr-Latn": "Finska", + "zh_TW": "芬蘭", + "tr": "Finlandiya", + "ro": "Finlanda", + "ar": "فنلندا", + "fa": "فنلاند", + "yue": "芬蘭" + }, + flag: "🇫🇮", + code: "FI", + dialCode: "358", + minLength: 12, + maxLength: 12, + ), + Country( + name: "France", + nameTranslations: { + "sk": "Francúzsko", + "se": "Frankriika", + "pl": "Francja", + "no": "Frankrike", + "ja": "フランス", + "it": "Francia", + "zh": "法国", + "nl": "Frankrijk", + "de": "Frankreich", + "fr": "France", + "es": "Francia", + "en": "France", + "pt_BR": "França", + "sr-Cyrl": "Француска", + "sr-Latn": "Francuska", + "zh_TW": "法國", + "tr": "Fransa", + "ro": "Franța", + "ar": "فرنسا", + "fa": "فرانسه", + "yue": "法國" + }, + flag: "🇫🇷", + code: "FR", + dialCode: "33", + minLength: 9, + maxLength: 9, + ), + Country( + name: "French Guiana", + nameTranslations: { + "sk": "Francúzska Guyana", + "se": "Frankriikka Guayana", + "pl": "Gujana Francuska", + "no": "Fransk Guyana", + "ja": "仏領ギアナ", + "it": "Guyana francese", + "zh": "法属圭亚那", + "nl": "Frans-Guyana", + "de": "Französisch-Guayana", + "fr": "Guyane française", + "es": "Guayana Francesa", + "en": "French Guiana", + "pt_BR": "Guiana Francesa", + "sr-Cyrl": "Француска Гвајана", + "sr-Latn": "Francuska Gvajana", + "zh_TW": "法屬蓋亞那", + "tr": "Fransız Guyanası", + "ro": "Guiana Franceză", + "ar": "غويانا الفرنسية", + "fa": "گویان فرانسه", + "yue": "法屬圭亞那" + }, + flag: "🇬🇫", + code: "GF", + dialCode: "594", + minLength: 15, + maxLength: 15, + ), + Country( + name: "French Polynesia", + nameTranslations: { + "sk": "Francúzska Polynézia", + "se": "Frankriikka Polynesia", + "pl": "Polinezja Francuska", + "no": "Fransk Polynesia", + "ja": "仏領ポリネシア", + "it": "Polinesia francese", + "zh": "法属波利尼西亚", + "nl": "Frans-Polynesië", + "de": "Französisch-Polynesien", + "fr": "Polynésie française", + "es": "Polinesia Francesa", + "en": "French Polynesia", + "pt_BR": "Polinésia Francesa", + "sr-Cyrl": "Француска Полинезија", + "sr-Latn": "Francuska Polinezija", + "zh_TW": "法屬玻里尼西亞", + "tr": "Fransız Polinezyası", + "ro": "Polinezia Franceză", + "ar": "بولينزيا الفرنسية", + "fa": "پلی‌نزی فرانسه", + "yue": "法屬波利尼西亞" + }, + flag: "🇵🇫", + code: "PF", + dialCode: "689", + minLength: 6, + maxLength: 6, + ), + Country( + name: "French Southern Territories", + nameTranslations: { + "sk": "Francúzske južné a antarktické územia", + "se": "French Southern Territories", + "pl": "Francuskie Terytoria Południowe i Antarktyczne", + "no": "De franske sørterritorier", + "ja": "仏領極南諸島", + "it": "Terre australi francesi", + "zh": "法属南部领地", + "nl": "Franse Gebieden in de zuidelijke Indische Oceaan", + "de": "Französische Süd- und Antarktisgebiete", + "fr": "Terres australes françaises", + "es": "Territorios Australes Franceses", + "en": "French Southern Territories", + "pt_BR": "Territórios Franceses do Sul", + "sr-Cyrl": "Француске јужне и антарктичке земље", + "sr-Latn": "Francuske južne i antarktičke zemlje", + "zh_TW": "法屬南部屬地", + "tr": "Fransız Güney ve Antarktika Toprakları", + "ro": "Teritoriile australe și antarctice franceze", + "ar": "أراض فرنسية جنوبية وأنتارتيكية", + "fa": "سرزمین‌های جنوبی فرانسه", + "yue": "法國南部領土" + }, + flag: "🇹🇫", + code: "TF", + dialCode: "262", + minLength: 15, + maxLength: 15, + ), + Country( + name: "Gabon", + nameTranslations: { + "sk": "Gabon", + "se": "Gabon", + "pl": "Gabon", + "no": "Gabon", + "ja": "ガボン", + "it": "Gabon", + "zh": "加蓬", + "nl": "Gabon", + "de": "Gabun", + "fr": "Gabon", + "es": "Gabón", + "en": "Gabon", + "pt_BR": "Gabão", + "sr-Cyrl": "Габон", + "sr-Latn": "Gabon", + "zh_TW": "加彭", + "tr": "Gabon", + "ro": "Gabon", + "ar": "الغابون", + "fa": "گابن", + "yue": "加蓬" + }, + flag: "🇬🇦", + code: "GA", + dialCode: "241", + minLength: 9, + maxLength: 9, + ), + Country( + name: "Gambia", + nameTranslations: { + "sk": "Gambia", + "se": "Gámbia", + "pl": "Gambia", + "no": "Gambia", + "ja": "ガンビア", + "it": "Gambia", + "zh": "冈比亚", + "nl": "Gambia", + "de": "Gambia", + "fr": "Gambie", + "es": "Gambia", + "en": "Gambia", + "pt_BR": "Gâmbia", + "sr-Cyrl": "Гамбија", + "sr-Latn": "Gambija", + "zh_TW": "岡比亞", + "tr": "Gambiya", + "ro": "Gambia", + "ar": "غامبيا", + "fa": "گامبیا", + "yue": "岡比亞" + }, + flag: "🇬🇲", + code: "GM", + dialCode: "220", + minLength: 7, + maxLength: 7, + ), + Country( + name: "Georgia", + nameTranslations: { + "sk": "Gruzínsko", + "se": "Georgia", + "pl": "Gruzja", + "no": "Georgia", + "ja": "ジョージア", + "it": "Georgia", + "zh": "格鲁吉亚", + "nl": "Georgië", + "de": "Georgien", + "fr": "Géorgie", + "es": "Georgia", + "en": "Georgia", + "pt_BR": "Georgia", + "sr-Cyrl": "Грузија", + "sr-Latn": "Gruzija", + "zh_TW": "喬治亞", + "tr": "Gürcistan", + "ro": "Georgia", + "ar": "جورجيا", + "fa": "گرجستان", + "yue": "格魯吉亞" + }, + flag: "🇬🇪", + code: "GE", + dialCode: "995", + minLength: 8, + maxLength: 9, + ), + Country( + name: "Germany", + nameTranslations: { + "sk": "Nemecko", + "se": "Duiska", + "pl": "Niemcy", + "no": "Tyskland", + "ja": "ドイツ", + "it": "Germania", + "zh": "德国", + "nl": "Duitsland", + "de": "Deutschland", + "fr": "Allemagne", + "es": "Alemania", + "en": "Germany", + "pt_BR": "Alemanha", + "sr-Cyrl": "Немачка", + "sr-Latn": "Nemačka", + "zh_TW": "德國", + "tr": "Almanya", + "ro": "Germania", + "ar": "ألمانيا", + "fa": "آلمان", + "yue": "德國" + }, + flag: "🇩🇪", + code: "DE", + dialCode: "49", + minLength: 9, + maxLength: 13, + ), + Country( + name: "Ghana", + nameTranslations: { + "sk": "Ghana", + "se": "Ghana", + "pl": "Ghana", + "no": "Ghana", + "ja": "ガーナ", + "it": "Ghana", + "zh": "加纳", + "nl": "Ghana", + "de": "Ghana", + "fr": "Ghana", + "es": "Ghana", + "en": "Ghana", + "pt_BR": "Gana", + "sr-Cyrl": "Гана", + "sr-Latn": "Gana", + "zh_TW": "迦納", + "tr": "Gana", + "ro": "Ghana", + "ar": "غانا", + "fa": "غنا", + "yue": "加納" + }, + flag: "🇬🇭", + code: "GH", + dialCode: "233", + minLength: 9, + maxLength: 9, + ), + Country( + name: "Gibraltar", + nameTranslations: { + "sk": "Gibraltár", + "se": "Gibraltar", + "pl": "Gibraltar", + "no": "Gibraltar", + "ja": "ジブラルタル", + "it": "Gibilterra", + "zh": "直布罗陀", + "nl": "Gibraltar", + "de": "Gibraltar", + "fr": "Gibraltar", + "es": "Gibraltar", + "en": "Gibraltar", + "pt_BR": "Gibraltar", + "sr-Cyrl": "Гибралтар", + "sr-Latn": "Gibraltar", + "zh_TW": "直布羅陀", + "tr": "Cebelitarık", + "ro": "Gibraltar", + "ar": "جبل طارق", + "fa": "جبل الطارق", + "yue": "直布羅陀" + }, + flag: "🇬🇮", + code: "GI", + dialCode: "350", + minLength: 8, + maxLength: 8, + ), + Country( + name: "Greece", + nameTranslations: { + "sk": "Grécko", + "se": "Greika", + "pl": "Grecja", + "no": "Hellas", + "ja": "ギリシャ", + "it": "Grecia", + "zh": "希腊", + "nl": "Griekenland", + "de": "Griechenland", + "fr": "Grèce", + "es": "Grecia", + "en": "Greece", + "pt_BR": "Grécia", + "sr-Cyrl": "Грчка", + "sr-Latn": "Grčka", + "zh_TW": "希臘", + "tr": "Yunanistan", + "ro": "Grecia", + "ar": "اليونان", + "fa": "یونان", + "yue": "希臘" + }, + flag: "🇬🇷", + code: "GR", + dialCode: "30", + minLength: 10, + maxLength: 10, + ), + Country( + name: "Greenland", + nameTranslations: { + "sk": "Grónsko", + "se": "Kalaallit Nunaat", + "pl": "Grenlandia", + "no": "Grønland", + "ja": "グリーンランド", + "it": "Groenlandia", + "zh": "格陵兰", + "nl": "Groenland", + "de": "Grönland", + "fr": "Groenland", + "es": "Groenlandia", + "en": "Greenland", + "pt_BR": "Groenlândia", + "sr-Cyrl": "Гренланд", + "sr-Latn": "Grenland", + "zh_TW": "格陵蘭", + "tr": "Grönland", + "ro": "Groenlanda", + "ar": "جرينلاند", + "fa": "گرینلند", + "yue": "格陵蘭" + }, + flag: "🇬🇱", + code: "GL", + dialCode: "299", + minLength: 6, + maxLength: 6, + ), + Country( + name: "Grenada", + nameTranslations: { + "sk": "Grenada", + "se": "Grenada", + "pl": "Grenada", + "no": "Grenada", + "ja": "グレナダ", + "it": "Grenada", + "zh": "格林纳达", + "nl": "Grenada", + "de": "Grenada", + "fr": "Grenade", + "es": "Granada", + "en": "Grenada", + "pt_BR": "Grenada", + "sr-Cyrl": "Гренада", + "sr-Latn": "Grenada", + "zh_TW": "格林納達", + "tr": "Grenada", + "ro": "Grenada", + "ar": "غرينادا", + "fa": "گرنادا", + "yue": "格林納達" + }, + flag: "🇬🇩", + code: "GD", + dialCode: "1473", + minLength: 7, + maxLength: 7, + ), + Country( + name: "Guadeloupe", + nameTranslations: { + "sk": "Guadeloupe", + "se": "Guadeloupe", + "pl": "Gwadelupa", + "no": "Guadeloupe", + "ja": "グアドループ", + "it": "Guadalupa", + "zh": "瓜德罗普", + "nl": "Guadeloupe", + "de": "Guadeloupe", + "fr": "Guadeloupe", + "es": "Guadalupe", + "en": "Guadeloupe", + "pt_BR": "Guadalupe", + "sr-Cyrl": "Гваделуп", + "sr-Latn": "Gvadelup", + "zh_TW": "瓜地洛普", + "tr": "Guadeloupe", + "ro": "Guadelupa", + "ar": "غوادلوب", + "fa": "گوادلوپ", + "yue": "瓜德罗普" + }, + flag: "🇬🇵", + code: "GP", + dialCode: "590", + minLength: 15, + maxLength: 15, + ), + Country( + name: "Guam", + nameTranslations: { + "sk": "Guam", + "se": "Guam", + "pl": "Guam", + "no": "Guam", + "ja": "グアム", + "it": "Guam", + "zh": "关岛", + "nl": "Guam", + "de": "Guam", + "fr": "Guam", + "es": "Guam", + "en": "Guam", + "pt_BR": "Guam", + "sr-Cyrl": "Гвам", + "sr-Latn": "Gvam", + "zh_TW": "關島", + "tr": "Guam", + "ro": "Guam", + "ar": "غوام", + "fa": "گوام", + "yue": "關島" + }, + flag: "🇬🇺", + code: "GU", + dialCode: "1671", + minLength: 7, + maxLength: 7, + ), + Country( + name: "Guatemala", + nameTranslations: { + "sk": "Guatemala", + "se": "Guatemala", + "pl": "Gwatemala", + "no": "Guatemala", + "ja": "グアテマラ", + "it": "Guatemala", + "zh": "危地马拉", + "nl": "Guatemala", + "de": "Guatemala", + "fr": "Guatemala", + "es": "Guatemala", + "en": "Guatemala", + "pt_BR": "Guatemala", + "sr-Cyrl": "Гватемала", + "sr-Latn": "Gvatemala", + "zh_TW": "瓜地馬拉", + "tr": "Guatemala", + "ro": "Guatemala", + "ar": "غواتيمالا", + "fa": "گواتمالا", + "yue": "危地馬拉" + }, + flag: "🇬🇹", + code: "GT", + dialCode: "502", + minLength: 8, + maxLength: 8, + ), + Country( + name: "Guernsey", + nameTranslations: { + "sk": "Guernsey", + "se": "Guernsey", + "pl": "Guernsey", + "no": "Guernsey", + "ja": "ガーンジー", + "it": "Guernsey", + "zh": "根西岛", + "nl": "Guernsey", + "de": "Guernsey", + "fr": "Guernesey", + "es": "Guernsey", + "en": "Guernsey", + "pt_BR": "Guernsey", + "sr-Cyrl": "Гернзи", + "sr-Latn": "Gernzi", + "zh_TW": "根息島", + "tr": "Guernsey", + "ro": "Guernsey", + "ar": "غيرنزي", + "fa": "گرنزی", + "yue": "格恩西島" + }, + flag: "🇬🇬", + code: "GG", + dialCode: "44", + minLength: 6, + maxLength: 6, + ), + Country( + name: "Guinea", + nameTranslations: { + "sk": "Guinea", + "se": "Guinea", + "pl": "Gwinea", + "no": "Guinea", + "ja": "ギニア", + "it": "Guinea", + "zh": "几内亚", + "nl": "Guinee", + "de": "Guinea", + "fr": "Guinée", + "es": "Guinea", + "en": "Guinea", + "pt_BR": "Guiné", + "sr-Cyrl": "Гвинеја", + "sr-Latn": "Gvineja", + "zh_TW": "幾內亞", + "tr": "Gine", + "ro": "Guinea", + "ar": "غينيا", + "fa": "گینه", + "yue": "幾內亞" + }, + flag: "🇬🇳", + code: "GN", + dialCode: "224", + minLength: 8, + maxLength: 9, + ), + Country( + name: "Guinea-Bissau", + nameTranslations: { + "sk": "Guinea-Bissau", + "se": "Guinea-Bissau", + "pl": "Gwinea Bissau", + "no": "Guinea-Bissau", + "ja": "ギニアビサウ", + "it": "Guinea-Bissau", + "zh": "几内亚比绍", + "nl": "Guinee-Bissau", + "de": "Guinea-Bissau", + "fr": "Guinée-Bissau", + "es": "Guinea-Bisáu", + "en": "Guinea-Bissau", + "pt_BR": "Guiné-bissau", + "sr-Cyrl": "Гвинеја Бисао", + "sr-Latn": "Gvineja Bisao", + "zh_TW": "幾內亞比索", + "tr": "Gine-Bissau", + "ro": "Guineea-Bissau", + "ar": "غينيا بيساو", + "fa": "گینه بیسائو", + "yue": "幾內亞比紹" + }, + flag: "🇬🇼", + code: "GW", + dialCode: "245", + minLength: 7, + maxLength: 7, + ), + Country( + name: "Guyana", + nameTranslations: { + "sk": "Guyana", + "se": "Guyana", + "pl": "Gujana", + "no": "Guyana", + "ja": "ガイアナ", + "it": "Guyana", + "zh": "圭亚那", + "nl": "Guyana", + "de": "Guyana", + "fr": "Guyana", + "es": "Guyana", + "en": "Guyana", + "pt_BR": "Guiana", + "sr-Cyrl": "Гвајана", + "sr-Latn": "Gvajana", + "zh_TW": "蓋亞那", + "tr": "Guyana", + "ro": "Guyana", + "ar": "غيانا", + "fa": "گویان", + "yue": "圭亞那" + }, + flag: "🇬🇾", + code: "GY", + dialCode: "592", + minLength: 7, + maxLength: 7, + ), + Country( + name: "Haiti", + nameTranslations: { + "sk": "Haiti", + "se": "Haiti", + "pl": "Haiti", + "no": "Haiti", + "ja": "ハイチ", + "it": "Haiti", + "zh": "海地", + "nl": "Haïti", + "de": "Haiti", + "fr": "Haïti", + "es": "Haití", + "en": "Haiti", + "pt_BR": "Haiti", + "sr-Cyrl": "Хаити", + "sr-Latn": "Haiti", + "zh_TW": "海地", + "tr": "Haiti", + "ro": "Haiti", + "ar": "هايتي", + "fa": "هائیتی", + "yue": "海地" + }, + flag: "🇭🇹", + code: "HT", + dialCode: "509", + minLength: 8, + maxLength: 8, + ), + Country( + name: "Heard Island and Mcdonald Islands", + nameTranslations: { + "sk": "Heardov ostrov a Macdonaldove ostrovy", + "se": "Heard- ja McDonald-sullot", + "pl": "Wyspy Heard i McDonalda", + "no": "Heard- og McDonaldøyene", + "ja": "ハード島・マクドナルド諸島", + "it": "Isole Heard e McDonald", + "zh": "赫德岛和麦克唐纳群岛", + "nl": "Heard en McDonaldeilanden", + "de": "Heard und McDonaldinseln", + "fr": "Îles Heard et McDonald", + "es": "Islas Heard y McDonald", + "en": "Heard & McDonald Islands", + "pt_BR": "Ilhas Heard e McDonald", + "sr-Cyrl": "Острва Херд и Макдоналд", + "sr-Latn": "Ostrva Herd i Makdonald", + "zh_TW": "赫德暨麥當勞群島", + "tr": "Heard Adası ve McDonald Adaları", + "ro": "Insula Heard și Insulele McDonald", + "ar": "جزيرة هيرد وجزر ماكدونالد", + "fa": "جزیره هرد و جزایر مک‌دونالد", + "yue": "赫德岛同麦克唐纳群岛" + }, + flag: "🇭🇲", + code: "HM", + dialCode: "672", + minLength: 15, + maxLength: 15, + ), + Country( + name: "Holy See (Vatican City State)", + nameTranslations: { + "sk": "Vatikán", + "se": "Vatikána", + "pl": "Watykan", + "no": "Vatikanstaten", + "ja": "バチカン市国", + "it": "Città del Vaticano", + "zh": "梵蒂冈", + "nl": "Vaticaanstad", + "de": "Vatikanstadt", + "fr": "État de la Cité du Vatican", + "es": "Ciudad del Vaticano", + "en": "Vatican City", + "pt_BR": "Cidade do Vaticano", + "sr-Cyrl": "Ватикан", + "sr-Latn": "Vatikan", + "zh_TW": "梵蒂岡", + "tr": "Vatikan", + "ro": "Vatican", + "ar": "الفاتيكان", + "fa": "واتیکان", + "yue": "梵蒂岡城國" + }, + flag: "🇻🇦", + code: "VA", + dialCode: "379", + minLength: 10, + maxLength: 10, + ), + Country( + name: "Honduras", + nameTranslations: { + "sk": "Honduras", + "se": "Honduras", + "pl": "Honduras", + "no": "Honduras", + "ja": "ホンジュラス", + "it": "Honduras", + "zh": "洪都拉斯", + "nl": "Honduras", + "de": "Honduras", + "fr": "Honduras", + "es": "Honduras", + "en": "Honduras", + "pt_BR": "Honduras", + "sr-Cyrl": "Хондурас", + "sr-Latn": "Honduras", + "zh_TW": "宏都拉斯", + "tr": "Honduras", + "ro": "Honduras", + "ar": "هندوراس", + "fa": "هندوراس", + "yue": "洪都拉斯" + }, + flag: "🇭🇳", + code: "HN", + dialCode: "504", + minLength: 8, + maxLength: 8, + ), + Country( + name: "Hong Kong", + nameTranslations: { + "sk": "Hongkong – OAO Číny", + "se": "Hongkong", + "pl": "SRA Hongkong (Chiny)", + "no": "Hongkong S.A.R. Kina", + "ja": "中華人民共和国香港特別行政区", + "it": "RAS di Hong Kong", + "zh": "中国香港特别行政区", + "nl": "Hongkong SAR van China", + "de": "Sonderverwaltungsregion Hongkong", + "fr": "R.A.S. chinoise de Hong Kong", + "es": "RAE de Hong Kong (China)", + "en": "Hong Kong SAR China", + "pt_BR": "RAE de Hong Kong China", + "sr-Cyrl": "Хонг Конг", + "sr-Latn": "Hong Kong", + "zh_TW": "香港", + "tr": "Hong Kong", + "ro": "Hong Kong", + "ar": "هونغ كونغ", + "fa": "هنگ کنگ", + "yue": "香港" + }, + flag: "🇭🇰", + code: "HK", + dialCode: "852", + minLength: 8, + maxLength: 8, + ), + Country( + name: "Hungary", + nameTranslations: { + "sk": "Maďarsko", + "se": "Ungár", + "pl": "Węgry", + "no": "Ungarn", + "ja": "ハンガリー", + "it": "Ungheria", + "zh": "匈牙利", + "nl": "Hongarije", + "de": "Ungarn", + "fr": "Hongrie", + "es": "Hungría", + "en": "Hungary", + "pt_BR": "Hungria", + "sr-Cyrl": "Мађарска", + "sr-Latn": "Mađarska", + "zh_TW": "匈牙利", + "tr": "Macaristan", + "ro": "Ungaria", + "ar": "المجر", + "fa": "مجارستان", + "yue": "匈牙利" + }, + flag: "🇭🇺", + code: "HU", + dialCode: "36", + minLength: 9, + maxLength: 9, + ), + Country( + name: "Iceland", + nameTranslations: { + "sk": "Island", + "se": "Islánda", + "pl": "Islandia", + "no": "Island", + "ja": "アイスランド", + "it": "Islanda", + "zh": "冰岛", + "nl": "IJsland", + "de": "Island", + "fr": "Islande", + "es": "Islandia", + "en": "Iceland", + "pt_BR": "Islândia", + "sr-Cyrl": "Исланд", + "sr-Latn": "Island", + "zh_TW": "冰島", + "tr": "İzlanda", + "ro": "Islanda", + "ar": "آيسلندا", + "fa": "ایسلند", + "yue": "冰島" + }, + flag: "🇮🇸", + code: "IS", + dialCode: "354", + minLength: 7, + maxLength: 9, + ), + Country( + name: "India", + nameTranslations: { + "sk": "India", + "se": "India", + "pl": "Indie", + "no": "India", + "ja": "インド", + "it": "India", + "zh": "印度", + "nl": "India", + "de": "Indien", + "fr": "Inde", + "es": "India", + "en": "India", + "pt_BR": "Índia", + "sr-Cyrl": "Индија", + "sr-Latn": "Indija", + "zh_TW": "印度", + "tr": "Hindistan", + "ro": "India", + "ar": "الهند", + "fa": "هند", + "yue": "印度" + }, + flag: "🇮🇳", + code: "IN", + dialCode: "91", + minLength: 10, + maxLength: 10, + ), + Country( + name: "Indonesia", + nameTranslations: { + "sk": "Indonézia", + "se": "Indonesia", + "pl": "Indonezja", + "no": "Indonesia", + "ja": "インドネシア", + "it": "Indonesia", + "zh": "印度尼西亚", + "nl": "Indonesië", + "de": "Indonesien", + "fr": "Indonésie", + "es": "Indonesia", + "en": "Indonesia", + "pt_BR": "Indonésia", + "sr-Cyrl": "Индонезија", + "sr-Latn": "Indonezija", + "zh_TW": "印尼", + "tr": "Endonezya", + "ro": "Indonezia", + "ar": "إندونيسيا", + "fa": "اندونزی", + "yue": "印尼" + }, + flag: "🇮🇩", + code: "ID", + dialCode: "62", + minLength: 10, + maxLength: 13, + ), + Country( + name: "Iran, Islamic Republic of Persian Gulf", + nameTranslations: { + "sk": "Irán", + "se": "Iran", + "pl": "Iran", + "no": "Iran", + "ja": "イラン", + "it": "Iran", + "zh": "伊朗", + "nl": "Iran", + "de": "Iran", + "fr": "Iran", + "es": "Irán", + "en": "Iran", + "pt_BR": "Irã", + "sr-Cyrl": "Иран", + "sr-Latn": "Iran", + "zh_TW": "伊朗", + "tr": "İran", + "ro": "Iran", + "ar": "إيران", + "fa": "ایران", + "yue": "伊朗" + }, + flag: "🇮🇷", + code: "IR", + dialCode: "98", + minLength: 10, + maxLength: 10, + ), + Country( + name: "Iraq", + nameTranslations: { + "sk": "Irak", + "se": "Irak", + "pl": "Irak", + "no": "Irak", + "ja": "イラク", + "it": "Iraq", + "zh": "伊拉克", + "nl": "Irak", + "de": "Irak", + "fr": "Irak", + "es": "Irak", + "en": "Iraq", + "pt_BR": "Iraque", + "sr-Cyrl": "Ирак", + "sr-Latn": "Irak", + "zh_TW": "伊拉克", + "tr": "Irak", + "ro": "Irak", + "ar": "العراق", + "fa": "عراق", + "yue": "伊拉克" + }, + flag: "🇮🇶", + code: "IQ", + dialCode: "964", + minLength: 10, + maxLength: 10, + ), + Country( + name: "Ireland", + nameTranslations: { + "sk": "Írsko", + "se": "Irlánda", + "pl": "Irlandia", + "no": "Irland", + "ja": "アイルランド", + "it": "Irlanda", + "zh": "爱尔兰", + "nl": "Ierland", + "de": "Irland", + "fr": "Irlande", + "es": "Irlanda", + "en": "Ireland", + "pt_BR": "Irlanda", + "sr-Cyrl": "Ирска", + "sr-Latn": "Irska", + "zh_TW": "愛爾蘭", + "tr": "İrlanda", + "ro": "Irlanda", + "ar": "أيرلندا", + "fa": "ایرلند", + "yue": "愛爾蘭" + }, + flag: "🇮🇪", + code: "IE", + dialCode: "353", + minLength: 7, + maxLength: 9, + ), + Country( + name: "Isle of Man", + nameTranslations: { + "sk": "Ostrov Man", + "se": "Mann-sullot", + "pl": "Wyspa Man", + "no": "Man", + "ja": "マン島", + "it": "Isola di Man", + "zh": "马恩岛", + "nl": "Isle of Man", + "de": "Isle of Man", + "fr": "Île de Man", + "es": "Isla de Man", + "en": "Isle of Man", + "pt_BR": "Ilha de Man", + "sr-Cyrl": "Острво Мен", + "sr-Latn": "Ostrvo Men", + "zh_TW": "曼島", + "tr": "Man Adası", + "ro": "Insula Man", + "ar": "جزيرة مان", + "fa": "جزیره مان", + "yue": "马伊岛" + }, + flag: "🇮🇲", + code: "IM", + dialCode: "44", + minLength: 6, + maxLength: 6, + ), + Country( + name: "Israel", + nameTranslations: { + "sk": "Izrael", + "se": "Israel", + "pl": "Izrael", + "no": "Israel", + "ja": "イスラエル", + "it": "Israele", + "zh": "以色列", + "nl": "Israël", + "de": "Israel", + "fr": "Israël", + "es": "Israel", + "en": "Israel", + "pt_BR": "Israel", + "sr-Cyrl": "Израел", + "sr-Latn": "Izrael", + "zh_TW": "以色列", + "tr": "İsrail", + "ro": "Israel", + "ar": "إسرائيل", + "fa": "إسرائيل", + "yue": "以色列" + }, + flag: "🇮🇱", + code: "IL", + dialCode: "972", + minLength: 9, + maxLength: 9, + ), + Country( + name: "Campione d'Italia", + nameTranslations: { + "sk": "Taliansko", + "se": "Itália", + "pl": "Włochy", + "no": "Italia", + "ja": "イタリア", + "it": "Italia", + "zh": "意大利", + "nl": "Italië", + "de": "Italien", + "fr": "Italie", + "es": "Italia", + "en": "Italy", + "pt_BR": "Itália", + "sr-Cyrl": "Италија", + "sr-Latn": "Italija", + "zh_TW": "義大利", + "tr": "İtalya", + "ro": "Italia", + "ar": "إيطاليا", + "fa": "ایتالیا", + "yue": "意大利" + }, + flag: "🇮🇹", + code: "IT", + dialCode: "39", + minLength: 9, + maxLength: 10, + ), + Country( + name: "Jamaica", + nameTranslations: { + "sk": "Jamajka", + "se": "Jamaica", + "pl": "Jamajka", + "no": "Jamaica", + "ja": "ジャマイカ", + "it": "Giamaica", + "zh": "牙买加", + "nl": "Jamaica", + "de": "Jamaika", + "fr": "Jamaïque", + "es": "Jamaica", + "en": "Jamaica", + "pt_BR": "Jamaica", + "sr-Cyrl": "Јамајка", + "sr-Latn": "Jamajka", + "zh_TW": "牙買加", + "tr": "Jamaika", + "ro": "Jamaica", + "ar": "جامايكا", + "fa": "جامائیکا", + "yue": "牙買加" + }, + flag: "🇯🇲", + code: "JM", + dialCode: "1876", + minLength: 7, + maxLength: 7, + ), + Country( + name: "Japan", + nameTranslations: { + "sk": "Japonsko", + "se": "Japána", + "pl": "Japonia", + "no": "Japan", + "ja": "日本", + "it": "Giappone", + "zh": "日本", + "nl": "Japan", + "de": "Japan", + "fr": "Japon", + "es": "Japón", + "en": "Japan", + "pt_BR": "Japão", + "sr-Cyrl": "Јапан", + "sr-Latn": "Japan", + "zh_TW": "日本", + "tr": "Japonya", + "ro": "Japonia", + "ar": "اليابان", + "fa": "ژاپن", + "yue": "日本" + }, + flag: "🇯🇵", + code: "JP", + dialCode: "81", + minLength: 10, + maxLength: 10, + ), + Country( + name: "Jersey", + nameTranslations: { + "sk": "Jersey", + "se": "Jersey", + "pl": "Jersey", + "no": "Jersey", + "ja": "ジャージー", + "it": "Jersey", + "zh": "泽西岛", + "nl": "Jersey", + "de": "Jersey", + "fr": "Jersey", + "es": "Jersey", + "en": "Jersey", + "pt_BR": "Jersey", + "sr-Cyrl": "Џерзи", + "sr-Latn": "Džerzi", + "zh_TW": "澤西", + "tr": "Jersey", + "ro": "Jersey", + "ar": "جيرزي", + "fa": "جرزی", + "yue": "澤西" + }, + flag: "🇯🇪", + code: "JE", + dialCode: "44", + minLength: 6, + maxLength: 6, + ), + Country( + name: "Jordan", + nameTranslations: { + "sk": "Jordánsko", + "se": "Jordánia", + "pl": "Jordania", + "no": "Jordan", + "ja": "ヨルダン", + "it": "Giordania", + "zh": "约旦", + "nl": "Jordanië", + "de": "Jordanien", + "fr": "Jordanie", + "es": "Jordania", + "en": "Jordan", + "pt_BR": "Jordânia", + "sr-Cyrl": "Јордан", + "sr-Latn": "Jordan", + "zh_TW": "約旦", + "tr": "Mavera-i Ürdün", + "ro": "Iordania", + "ar": "الأردن", + "fa": "اردن", + "yue": "約旦" + }, + flag: "🇯🇴", + code: "JO", + dialCode: "962", + minLength: 9, + maxLength: 9, + ), + Country( + name: "Kazakhstan", + nameTranslations: { + "sk": "Kazachstan", + "se": "Kasakstan", + "pl": "Kazachstan", + "no": "Kasakhstan", + "ja": "カザフスタン", + "it": "Kazakistan", + "zh": "哈萨克斯坦", + "nl": "Kazachstan", + "de": "Kasachstan", + "fr": "Kazakhstan", + "es": "Kazajistán", + "en": "Kazakhstan", + "pt_BR": "Cazaquistão", + "sr-Cyrl": "Казахстан", + "sr-Latn": "Kazahstan", + "zh_TW": "哈薩克", + "tr": "Kazakistan", + "ro": "Kazahstan", + "ar": "كازاخستان", + "fa": "قزاقستان", + "yue": "哈薩克斯坦" + }, + flag: "🇰🇿", + code: "KZ", + dialCode: "7", + minLength: 10, + maxLength: 10, + ), + Country( + name: "Kenya", + nameTranslations: { + "sk": "Keňa", + "se": "Kenia", + "pl": "Kenia", + "no": "Kenya", + "ja": "ケニア", + "it": "Kenya", + "zh": "肯尼亚", + "nl": "Kenia", + "de": "Kenia", + "fr": "Kenya", + "es": "Kenia", + "en": "Kenya", + "pt_BR": "Quênia", + "sr-Cyrl": "Кенија", + "sr-Latn": "Kenija", + "zh_TW": "肯亞", + "tr": "Kenya", + "ro": "Kenya", + "ar": "كينيا", + "fa": "كنيا", + "yue": "肯雅" + }, + flag: "🇰🇪", + code: "KE", + dialCode: "254", + minLength: 10, + maxLength: 10, + ), + Country( + name: "Kiribati", + nameTranslations: { + "sk": "Kiribati", + "se": "Kiribati", + "pl": "Kiribati", + "no": "Kiribati", + "ja": "キリバス", + "it": "Kiribati", + "zh": "基里巴斯", + "nl": "Kiribati", + "de": "Kiribati", + "fr": "Kiribati", + "es": "Kiribati", + "en": "Kiribati", + "pt_BR": "Kiribati", + "sr-Cyrl": "Кирибати", + "sr-Latn": "Kiribati", + "zh_TW": "吉里巴斯", + "tr": "Kiribati", + "ro": "Kiribati", + "ar": "كيريباتي", + "fa": "کیریباتی", + "yue": "基里巴斯" + }, + flag: "🇰🇮", + code: "KI", + dialCode: "686", + minLength: 5, + maxLength: 5, + ), + Country( + name: "Korea, Democratic People's Republic of Korea", + nameTranslations: { + "sk": "Severná Kórea", + "se": "Davvi-Korea", + "pl": "Korea Północna", + "no": "Nord-Korea", + "ja": "北朝鮮", + "it": "Corea del Nord", + "zh": "朝鲜", + "nl": "Noord-Korea", + "de": "Nordkorea", + "fr": "Corée du Nord", + "es": "Corea del Norte", + "en": "North Korea", + "pt_BR": "Coreia do Norte", + "sr-Cyrl": "Северна Кореја", + "sr-Latn": "Severna Koreja", + "zh_TW": "北韓", + "tr": "Kuzey Kore", + "ro": "Coreea de Nord", + "ar": "كوريا الشمالية", + "fa": "کره شمالی", + "yue": "朝鮮(朝鮮民主主義人民共咊囯)" + }, + flag: "🇰🇵", + code: "KP", + dialCode: "850", + minLength: 10, + maxLength: 10, + ), + Country( + name: "Korea, Republic of South Korea", + nameTranslations: { + "sk": "Južná Kórea", + "se": "Mátta-Korea", + "pl": "Korea Południowa", + "no": "Sør-Korea", + "ja": "韓国", + "it": "Corea del Sud", + "zh": "韩国", + "nl": "Zuid-Korea", + "de": "Südkorea", + "fr": "Corée du Sud", + "es": "Corea del Sur", + "en": "South Korea", + "pt_BR": "Coreia do Sul", + "sr-Cyrl": "Јужна Кореја", + "sr-Latn": "Južna Koreja", + "zh_TW": "南韓", + "tr": "Güney Kore", + "ro": "Coreea de Sud", + "ar": "كوريا الجنوبية", + "fa": "کره جنوبی", + "yue": "韓國(大韓民國)" + }, + flag: "🇰🇷", + code: "KR", + dialCode: "82", + minLength: 11, + maxLength: 11, + ), + Country( + name: "Kuwait", + nameTranslations: { + "sk": "Kuvajt", + "se": "Kuwait", + "pl": "Kuwejt", + "no": "Kuwait", + "ja": "クウェート", + "it": "Kuwait", + "zh": "科威特", + "nl": "Koeweit", + "de": "Kuwait", + "fr": "Koweït", + "es": "Kuwait", + "en": "Kuwait", + "pt_BR": "Kuwait", + "sr-Cyrl": "Кувајт", + "sr-Latn": "Kuvajt", + "zh_TW": "科威特", + "tr": "Kuveyt", + "ro": "Kuweit", + "ar": "الكويت", + "fa": "کویت", + "yue": "科威特" + }, + flag: "🇰🇼", + code: "KW", + dialCode: "965", + minLength: 8, + maxLength: 8, + ), + Country( + name: "Kyrgyzstan", + nameTranslations: { + "sk": "Kirgizsko", + "se": "Kirgisistan", + "pl": "Kirgistan", + "no": "Kirgisistan", + "ja": "キルギス", + "it": "Kirghizistan", + "zh": "吉尔吉斯斯坦", + "nl": "Kirgizië", + "de": "Kirgisistan", + "fr": "Kirghizistan", + "es": "Kirguistán", + "en": "Kyrgyzstan", + "pt_BR": "Quirguistão", + "sr-Cyrl": "Киргистан", + "sr-Latn": "Kirgistan", + "zh_TW": "吉爾吉斯", + "tr": "Kırgızistan", + "ro": "Kîrgîzstan", + "ar": "قيرغيزستان", + "fa": "قرقیزستان", + "yue": "吉爾吉斯斯坦" + }, + flag: "🇰🇬", + code: "KG", + dialCode: "996", + minLength: 9, + maxLength: 9, + ), + Country( + name: "Laos", + nameTranslations: { + "sk": "Laos", + "se": "Laos", + "pl": "Laos", + "no": "Laos", + "ja": "ラオス", + "it": "Laos", + "zh": "老挝", + "nl": "Laos", + "de": "Laos", + "fr": "Laos", + "es": "Laos", + "en": "Laos", + "pt_BR": "Laos", + "sr-Cyrl": "Лаос", + "sr-Latn": "Laos", + "zh_TW": "寮國", + "tr": "Laos", + "ro": "Laos", + "ar": "لاوس", + "fa": "لائوس", + "yue": "老撾人民民主共和國" + }, + flag: "🇱🇦", + code: "LA", + dialCode: "856", + minLength: 10, + maxLength: 10, + ), + Country( + name: "Latvia", + nameTranslations: { + "sk": "Lotyšsko", + "se": "Látvia", + "pl": "Łotwa", + "no": "Latvia", + "ja": "ラトビア", + "it": "Lettonia", + "zh": "拉脱维亚", + "nl": "Letland", + "de": "Lettland", + "fr": "Lettonie", + "es": "Letonia", + "en": "Latvia", + "pt_BR": "Letônia", + "sr-Cyrl": "Летонија", + "sr-Latn": "Letonija", + "zh_TW": "拉托維亞", + "tr": "Letonya", + "ro": "Letonia", + "ar": "لاتفيا", + "fa": "لتونی", + "yue": "拉脫維亞" + }, + flag: "🇱🇻", + code: "LV", + dialCode: "371", + minLength: 8, + maxLength: 8, + ), + Country( + name: "Lebanon", + nameTranslations: { + "sk": "Libanon", + "se": "Libanon", + "pl": "Liban", + "no": "Libanon", + "ja": "レバノン", + "it": "Libano", + "zh": "黎巴嫩", + "nl": "Libanon", + "de": "Libanon", + "fr": "Liban", + "es": "Líbano", + "en": "Lebanon", + "pt_BR": "Líbano", + "sr-Cyrl": "Либан", + "sr-Latn": "Liban", + "zh_TW": "黎巴嫩", + "tr": "Lübnan", + "ro": "Liban", + "ar": "لبنان", + "fa": "لبنان", + "yue": "黎巴嫩" + }, + flag: "🇱🇧", + code: "LB", + dialCode: "961", + minLength: 8, + maxLength: 8, + ), + Country( + name: "Lesotho", + nameTranslations: { + "sk": "Lesotho", + "se": "Lesotho", + "pl": "Lesotho", + "no": "Lesotho", + "ja": "レソト", + "it": "Lesotho", + "zh": "莱索托", + "nl": "Lesotho", + "de": "Lesotho", + "fr": "Lesotho", + "es": "Lesoto", + "en": "Lesotho", + "pt_BR": "Lesoto", + "sr-Cyrl": "Лесото", + "sr-Latn": "Lesoto", + "zh_TW": "賴索托", + "tr": "Lesotho", + "ro": "Lesotho", + "ar": "ليسوتو", + "fa": "لسوتو", + "yue": "萊索托" + }, + flag: "🇱🇸", + code: "LS", + dialCode: "266", + minLength: 8, + maxLength: 8, + ), + Country( + name: "Liberia", + nameTranslations: { + "sk": "Libéria", + "se": "Liberia", + "pl": "Liberia", + "no": "Liberia", + "ja": "リベリア", + "it": "Liberia", + "zh": "利比里亚", + "nl": "Liberia", + "de": "Liberia", + "fr": "Libéria", + "es": "Liberia", + "en": "Liberia", + "pt_BR": "Libéria", + "sr-Cyrl": "Либерија", + "sr-Latn": "Liberija", + "zh_TW": "賴比瑞亞", + "tr": "Liberya", + "ro": "Liberia", + "ar": "ليبيريا", + "fa": "لیبریا", + "yue": "利比里亞" + }, + flag: "🇱🇷", + code: "LR", + dialCode: "231", + minLength: 8, + maxLength: 8, + ), + Country( + name: "Libyan Arab Jamahiriya", + nameTranslations: { + "sk": "Líbya", + "se": "Libya", + "pl": "Libia", + "no": "Libya", + "ja": "リビア", + "it": "Libia", + "zh": "利比亚", + "nl": "Libië", + "de": "Libyen", + "fr": "Libye", + "es": "Libia", + "en": "Libya", + "pt_BR": "Líbia", + "sr-Cyrl": "Либија", + "sr-Latn": "Libija", + "zh_TW": "利比亞", + "tr": "Libya", + "ro": "Libia", + "ar": "ليبيا", + "fa": "لیبی", + "yue": "利比亞" + }, + flag: "🇱🇾", + code: "LY", + dialCode: "218", + minLength: 9, + maxLength: 9, + ), + Country( + name: "Liechtenstein", + nameTranslations: { + "sk": "Lichtenštajnsko", + "se": "Liechtenstein", + "pl": "Liechtenstein", + "no": "Liechtenstein", + "ja": "リヒテンシュタイン", + "it": "Liechtenstein", + "zh": "列支敦士登", + "nl": "Liechtenstein", + "de": "Liechtenstein", + "fr": "Liechtenstein", + "es": "Liechtenstein", + "en": "Liechtenstein", + "pt_BR": "Liechtenstein", + "sr-Cyrl": "Лихтенштајн", + "sr-Latn": "Lihtenštajn", + "zh_TW": "列支敦斯登", + "tr": "Lihtenştayn", + "ro": "Liechtenstein", + "ar": "ليختنشتاين", + "fa": "لیختن‌اشتاین", + "yue": "列支敦士登" + }, + flag: "🇱🇮", + code: "LI", + dialCode: "423", + minLength: 9, + maxLength: 9, + ), + Country( + name: "Lithuania", + nameTranslations: { + "sk": "Litva", + "se": "Lietuva", + "pl": "Litwa", + "no": "Litauen", + "ja": "リトアニア", + "it": "Lituania", + "zh": "立陶宛", + "nl": "Litouwen", + "de": "Litauen", + "fr": "Lituanie", + "es": "Lituania", + "en": "Lithuania", + "pt_BR": "Lituânia", + "sr-Cyrl": "Литванија", + "sr-Latn": "Litvanija", + "zh_TW": "立陶宛", + "tr": "Litvanya", + "ro": "Lituania", + "ar": "ليتوانيا", + "fa": "لیتوانی", + "yue": "立陶宛" + }, + flag: "🇱🇹", + code: "LT", + dialCode: "370", + minLength: 8, + maxLength: 8, + ), + Country( + name: "Luxembourg", + nameTranslations: { + "sk": "Luxembursko", + "se": "Luxembourg", + "pl": "Luksemburg", + "no": "Luxemburg", + "ja": "ルクセンブルク", + "it": "Lussemburgo", + "zh": "卢森堡", + "nl": "Luxemburg", + "de": "Luxemburg", + "fr": "Luxembourg", + "es": "Luxemburgo", + "en": "Luxembourg", + "pt_BR": "Luxemburgo", + "sr-Cyrl": "Луксенбург", + "sr-Latn": "Luksenburg", + "zh_TW": "盧森堡", + "tr": "Lüksemburg", + "ro": "Luxemburg", + "ar": "لوكسمبورغ", + "fa": "لوکزامبورگ", + "yue": "盧森堡" + }, + flag: "🇱🇺", + code: "LU", + dialCode: "352", + minLength: 11, + maxLength: 11, + ), + Country( + name: "Macao", + nameTranslations: { + "sk": "Macao – OAO Číny", + "se": "Makáo", + "pl": "SRA Makau (Chiny)", + "no": "Macao S.A.R. Kina", + "ja": "中華人民共和国マカオ特別行政区", + "it": "RAS di Macao", + "zh": "中国澳门特别行政区", + "nl": "Macau SAR van China", + "de": "Sonderverwaltungsregion Macau", + "fr": "R.A.S. chinoise de Macao", + "es": "RAE de Macao (China)", + "en": "Macao SAR China", + "pt_BR": "RAE de Macau China", + "sr-Cyrl": "Макао", + "sr-Latn": "Makao", + "zh_TW": "澳門", + "tr": "Makao", + "ro": "Macao", + "ar": "ماكاو", + "fa": "ماكائو", + "yue": "澳門" + }, + flag: "🇲🇴", + code: "MO", + dialCode: "853", + minLength: 8, + maxLength: 8, + ), + Country( + name: "Macedonia", + nameTranslations: { + "sk": "Severné Macedónsko", + "se": "North Macedonia", + "pl": "Macedonia Północna", + "no": "Nord-Makedonia", + "ja": "北マケドニア", + "it": "Macedonia del Nord", + "zh": "北马其顿", + "nl": "Noord-Macedonië", + "de": "Nordmazedonien", + "fr": "Macédoine du Nord", + "es": "Macedonia del Norte", + "en": "North Macedonia", + "pt_BR": "Macedônia do Norte", + "sr-Cyrl": "Северна Македонија", + "sr-Latn": "Severna Makedonija", + "zh_TW": "北馬其頓", + "tr": "Kuzey Makedonya", + "ro": "Macedonia de Nord", + "ar": "مقدونيا", + "fa": "مقدونیه", + "yue": "馬其頓(前南斯拉夫共和國)" + }, + flag: "🇲🇰", + code: "MK", + dialCode: "389", + minLength: 8, + maxLength: 8, + ), + Country( + name: "Madagascar", + nameTranslations: { + "sk": "Madagaskar", + "se": "Madagaskar", + "pl": "Madagaskar", + "no": "Madagaskar", + "ja": "マダガスカル", + "it": "Madagascar", + "zh": "马达加斯加", + "nl": "Madagaskar", + "de": "Madagaskar", + "fr": "Madagascar", + "es": "Madagascar", + "en": "Madagascar", + "pt_BR": "Madagáscar", + "sr-Cyrl": "Мадагаскар", + "sr-Latn": "Madagaskar", + "zh_TW": "馬達加斯加", + "tr": "Madagaskar", + "ro": "Madagascar", + "ar": "مدغشقر", + "fa": "ماداگاسکار", + "yue": "馬達加斯加" + }, + flag: "🇲🇬", + code: "MG", + dialCode: "261", + minLength: 10, + maxLength: 10, + ), + Country( + name: "Malawi", + nameTranslations: { + "sk": "Malawi", + "se": "Malawi", + "pl": "Malawi", + "no": "Malawi", + "ja": "マラウイ", + "it": "Malawi", + "zh": "马拉维", + "nl": "Malawi", + "de": "Malawi", + "fr": "Malawi", + "es": "Malaui", + "en": "Malawi", + "pt_BR": "Malawi", + "sr-Cyrl": "Малави", + "sr-Latn": "Malavi", + "zh_TW": "馬拉威", + "tr": "Malavi", + "ro": "Malawi", + "ar": "مالاوي", + "fa": "مالاوی", + "yue": "馬拉維" + }, + flag: "🇲🇼", + code: "MW", + dialCode: "265", + minLength: 7, + maxLength: 9, + ), + Country( + name: "Malaysia", + nameTranslations: { + "sk": "Malajzia", + "se": "Malesia", + "pl": "Malezja", + "no": "Malaysia", + "ja": "マレーシア", + "it": "Malaysia", + "zh": "马来西亚", + "nl": "Maleisië", + "de": "Malaysia", + "fr": "Malaisie", + "es": "Malasia", + "en": "Malaysia", + "pt_BR": "Malásia", + "sr-Cyrl": "Малезија", + "sr-Latn": "Malezija", + "zh_TW": "馬來西亞", + "tr": "Malezya", + "ro": "Malaezia", + "ar": "ماليزيا", + "fa": "مالزی", + "yue": "馬來西亞" + }, + flag: "🇲🇾", + code: "MY", + dialCode: "60", + minLength: 9, + maxLength: 10, + ), + Country( + name: "Maldives", + nameTranslations: { + "sk": "Maldivy", + "se": "Malediivvat", + "pl": "Malediwy", + "no": "Maldivene", + "ja": "モルディブ", + "it": "Maldive", + "zh": "马尔代夫", + "nl": "Maldiven", + "de": "Malediven", + "fr": "Maldives", + "es": "Maldivas", + "en": "Maldives", + "pt_BR": "Maldivas", + "sr-Cyrl": "Малдиви", + "sr-Latn": "Maldivi", + "zh_TW": "馬爾地夫", + "tr": "Maldivler", + "ro": "Maldive", + "ar": "جزر المالديف", + "fa": "مالدیو", + "yue": "馬爾代夫" + }, + flag: "🇲🇻", + code: "MV", + dialCode: "960", + minLength: 7, + maxLength: 7, + ), + Country( + name: "Mali", + nameTranslations: { + "sk": "Mali", + "se": "Mali", + "pl": "Mali", + "no": "Mali", + "ja": "マリ", + "it": "Mali", + "zh": "马里", + "nl": "Mali", + "de": "Mali", + "fr": "Mali", + "es": "Mali", + "en": "Mali", + "pt_BR": "Mali", + "sr-Cyrl": "Мали", + "sr-Latn": "Mali", + "zh_TW": "馬里", + "tr": "Mali", + "ro": "Mali", + "ar": "مالي", + "fa": "مالی", + "yue": "馬里" + }, + flag: "🇲🇱", + code: "ML", + dialCode: "223", + minLength: 8, + maxLength: 8, + ), + Country( + name: "Malta", + nameTranslations: { + "sk": "Malta", + "se": "Málta", + "pl": "Malta", + "no": "Malta", + "ja": "マルタ", + "it": "Malta", + "zh": "马耳他", + "nl": "Malta", + "de": "Malta", + "fr": "Malte", + "es": "Malta", + "en": "Malta", + "pt_BR": "Malta", + "sr-Cyrl": "Малта", + "sr-Latn": "Malta", + "zh_TW": "馬爾他", + "tr": "Malta", + "ro": "Malta", + "ar": "مالطا", + "fa": "مالت", + "yue": "馬耳他" + }, + flag: "🇲🇹", + code: "MT", + dialCode: "356", + minLength: 8, + maxLength: 8, + ), + Country( + name: "Marshall Islands", + nameTranslations: { + "sk": "Marshallove ostrovy", + "se": "Marshallsullot", + "pl": "Wyspy Marshalla", + "no": "Marshalløyene", + "ja": "マーシャル諸島", + "it": "Isole Marshall", + "zh": "马绍尔群岛", + "nl": "Marshalleilanden", + "de": "Marshallinseln", + "fr": "Îles Marshall", + "es": "Islas Marshall", + "en": "Marshall Islands", + "pt_BR": "Ilhas Marshall", + "sr-Cyrl": "Маршалска Острва", + "sr-Latn": "Maršalska Ostrva", + "zh_TW": "馬紹爾群島", + "tr": "Marshall Adaları", + "ro": "Insulele Marshall", + "ar": "جزر مارشال", + "fa": "جزایر مارشال", + "yue": "馬紹爾群島" + }, + flag: "🇲🇭", + code: "MH", + dialCode: "692", + minLength: 7, + maxLength: 7, + ), + Country( + name: "Martinique", + nameTranslations: { + "sk": "Martinik", + "se": "Martinique", + "pl": "Martynika", + "no": "Martinique", + "ja": "マルティニーク", + "it": "Martinica", + "zh": "马提尼克", + "nl": "Martinique", + "de": "Martinique", + "fr": "Martinique", + "es": "Martinica", + "en": "Martinique", + "pt_BR": "Martinica", + "sr-Cyrl": "Мартиник", + "sr-Latn": "Martinik", + "zh_TW": "馬丁尼克", + "tr": "Martinique", + "ro": "Martinica", + "ar": "مارتينيك", + "fa": "مارتینیک", + "yue": "马提尼克" + }, + flag: "🇲🇶", + code: "MQ", + dialCode: "596", + minLength: 15, + maxLength: 15, + ), + Country( + name: "Mauritania", + nameTranslations: { + "sk": "Mauritánia", + "se": "Mauretánia", + "pl": "Mauretania", + "no": "Mauritania", + "ja": "モーリタニア", + "it": "Mauritania", + "zh": "毛里塔尼亚", + "nl": "Mauritanië", + "de": "Mauretanien", + "fr": "Mauritanie", + "es": "Mauritania", + "en": "Mauritania", + "pt_BR": "Mauritânia", + "sr-Cyrl": "Мауританија", + "sr-Latn": "Mauritanija", + "zh_TW": "茅利塔尼亞", + "tr": "Moritanya", + "ro": "Mauritania", + "ar": "موريتانيا", + "fa": "موریتانی", + "yue": "毛里塔尼亞" + }, + flag: "🇲🇷", + code: "MR", + dialCode: "222", + minLength: 8, + maxLength: 8, + ), + Country( + name: "Mauritius", + nameTranslations: { + "sk": "Maurícius", + "se": "Mauritius", + "pl": "Mauritius", + "no": "Mauritius", + "ja": "モーリシャス", + "it": "Mauritius", + "zh": "毛里求斯", + "nl": "Mauritius", + "de": "Mauritius", + "fr": "Maurice", + "es": "Mauricio", + "en": "Mauritius", + "pt_BR": "Maurício", + "sr-Cyrl": "Маурицијус", + "sr-Latn": "Mauricijus", + "zh_TW": "模里西斯", + "tr": "Mauritius", + "ro": "Mauritius", + "ar": "موريشيوس", + "fa": "موریس", + "yue": "毛里求斯" + }, + flag: "🇲🇺", + code: "MU", + dialCode: "230", + minLength: 7, + maxLength: 8, + ), + Country( + name: "Mayotte", + nameTranslations: { + "sk": "Mayotte", + "se": "Mayotte", + "pl": "Majotta", + "no": "Mayotte", + "ja": "マヨット", + "it": "Mayotte", + "zh": "马约特", + "nl": "Mayotte", + "de": "Mayotte", + "fr": "Mayotte", + "es": "Mayotte", + "en": "Mayotte", + "pt_BR": "Mayotte", + "sr-Cyrl": "Мајота", + "sr-Latn": "Majota", + "zh_TW": "馬約特", + "tr": "Mayotte", + "ro": "Mayotte", + "ar": "مايوت", + "fa": "مایوت", + "yue": "馬約特" + }, + flag: "🇾🇹", + code: "YT", + dialCode: "262", + minLength: 9, + maxLength: 9, + ), + Country( + name: "Mexico", + nameTranslations: { + "sk": "Mexiko", + "se": "Meksiko", + "pl": "Meksyk", + "no": "Mexico", + "ja": "メキシコ", + "it": "Messico", + "zh": "墨西哥", + "nl": "Mexico", + "de": "Mexiko", + "fr": "Mexique", + "es": "México", + "en": "Mexico", + "pt_BR": "México", + "sr-Cyrl": "Мексико", + "sr-Latn": "Meksiko", + "zh_TW": "墨西哥", + "tr": "Meksika", + "ro": "Mexic", + "ar": "المكسيك", + "fa": "مکزیک", + "yue": "墨西哥" + }, + flag: "🇲🇽", + code: "MX", + dialCode: "52", + minLength: 10, + maxLength: 10, + ), + Country( + name: "Micronesia, Federated States of Micronesia", + nameTranslations: { + "sk": "Mikronézia", + "se": "Mikronesia", + "pl": "Mikronezja", + "no": "Mikronesiaføderasjonen", + "ja": "ミクロネシア連邦", + "it": "Micronesia", + "zh": "密克罗尼西亚", + "nl": "Micronesia", + "de": "Mikronesien", + "fr": "États fédérés de Micronésie", + "es": "Micronesia", + "en": "Micronesia", + "pt_BR": "Micronésia", + "sr-Cyrl": "Микронезија", + "sr-Latn": "Mikronezija", + "zh_TW": "密克羅尼西亞", + "tr": "Mikronezya", + "ro": "Micronezia", + "ar": "ولايات ميكرونيسيا المتحدة", + "fa": "ایالات فدرال میکرونزی", + "yue": "密克罗尼西亚(聯邦)" + }, + flag: "🇫🇲", + code: "FM", + dialCode: "691", + minLength: 7, + maxLength: 7, + ), + Country( + name: "Moldova", + nameTranslations: { + "sk": "Moldavsko", + "se": "Moldávia", + "pl": "Mołdawia", + "no": "Moldova", + "ja": "モルドバ", + "it": "Moldavia", + "zh": "摩尔多瓦", + "nl": "Moldavië", + "de": "Republik Moldau", + "fr": "Moldavie", + "es": "Moldavia", + "en": "Moldova", + "pt_BR": "Moldova", + "sr-Cyrl": "Молдавија", + "sr-Latn": "Moldavija", + "zh_TW": "摩爾多瓦", + "tr": "Moldova", + "ro": "Moldova", + "ar": "مولدوفا", + "fa": "مولداوی", + "yue": "摩爾多瓦(共和國)" + }, + flag: "🇲🇩", + code: "MD", + dialCode: "373", + minLength: 8, + maxLength: 8, + ), + Country( + name: "Monaco", + nameTranslations: { + "sk": "Monako", + "se": "Monaco", + "pl": "Monako", + "no": "Monaco", + "ja": "モナコ", + "it": "Monaco", + "zh": "摩纳哥", + "nl": "Monaco", + "de": "Monaco", + "fr": "Monaco", + "es": "Mónaco", + "en": "Monaco", + "pt_BR": "Mônaco", + "sr-Cyrl": "Монако", + "sr-Latn": "Monako", + "zh_TW": "摩納哥", + "tr": "Monako", + "ro": "Monaco", + "ar": "موناكو", + "fa": "موناكو", + "yue": "摩納哥" + }, + flag: "🇲🇨", + code: "MC", + dialCode: "377", + minLength: 9, + maxLength: 9, + ), + Country( + name: "Mongolia", + nameTranslations: { + "sk": "Mongolsko", + "se": "Mongolia", + "pl": "Mongolia", + "no": "Mongolia", + "ja": "モンゴル", + "it": "Mongolia", + "zh": "蒙古", + "nl": "Mongolië", + "de": "Mongolei", + "fr": "Mongolie", + "es": "Mongolia", + "en": "Mongolia", + "pt_BR": "Mongólia", + "sr-Cyrl": "Монголија", + "sr-Latn": "Mongolija", + "zh_TW": "蒙古", + "tr": "Moğolistan", + "ro": "Mongolia", + "ar": "منغوليا", + "fa": "مغولستان", + "yue": "蒙古" + }, + flag: "🇲🇳", + code: "MN", + dialCode: "976", + minLength: 8, + maxLength: 8, + ), + Country( + name: "Montenegro", + nameTranslations: { + "sk": "Čierna Hora", + "se": "Montenegro", + "pl": "Czarnogóra", + "no": "Montenegro", + "ja": "モンテネグロ", + "it": "Montenegro", + "zh": "黑山", + "nl": "Montenegro", + "de": "Montenegro", + "fr": "Monténégro", + "es": "Montenegro", + "en": "Montenegro", + "pt_BR": "Montenegro", + "sr-Cyrl": "Црна Гора", + "sr-Latn": "Crna Gora", + "zh_TW": "蒙特內哥羅", + "tr": "Karadağ", + "ro": "Muntenegru", + "ar": "الجبل الأسود", + "fa": "مونته‌نگرو", + "yue": "黑山" + }, + flag: "🇲🇪", + code: "ME", + dialCode: "382", + minLength: 12, + maxLength: 12, + ), + Country( + name: "Montserrat", + nameTranslations: { + "sk": "Montserrat", + "se": "Montserrat", + "pl": "Montserrat", + "no": "Montserrat", + "ja": "モントセラト", + "it": "Montserrat", + "zh": "蒙特塞拉特", + "nl": "Montserrat", + "de": "Montserrat", + "fr": "Montserrat", + "es": "Montserrat", + "en": "Montserrat", + "pt_BR": "Montserrat", + "sr-Cyrl": "Монтсерат", + "sr-Latn": "Montserat", + "zh_TW": "蒙哲臘", + "tr": "Montserrat", + "ro": "Montserrat", + "ar": "مونتسرات", + "fa": "مونتسرات", + "yue": "蒙特塞拉特" + }, + flag: "🇲🇸", + code: "MS", + dialCode: "1664", + minLength: 7, + maxLength: 7, + ), + Country( + name: "Morocco", + nameTranslations: { + "sk": "Maroko", + "se": "Marokko", + "pl": "Maroko", + "no": "Marokko", + "ja": "モロッコ", + "it": "Marocco", + "zh": "摩洛哥", + "nl": "Marokko", + "de": "Marokko", + "fr": "Maroc", + "es": "Marruecos", + "en": "Morocco", + "pt_BR": "Marrocos", + "sr-Cyrl": "Мароко", + "sr-Latn": "Maroko", + "zh_TW": "摩洛哥", + "tr": "Fas", + "ro": "Maroc", + "ar": "المغرب", + "fa": "مراکش", + "yue": "摩洛哥" + }, + flag: "🇲🇦", + code: "MA", + dialCode: "212", + minLength: 9, + maxLength: 9, + ), + Country( + name: "Mozambique", + nameTranslations: { + "sk": "Mozambik", + "se": "Mosambik", + "pl": "Mozambik", + "no": "Mosambik", + "ja": "モザンビーク", + "it": "Mozambico", + "zh": "莫桑比克", + "nl": "Mozambique", + "de": "Mosambik", + "fr": "Mozambique", + "es": "Mozambique", + "en": "Mozambique", + "pt_BR": "Moçambique", + "sr-Cyrl": "Мозамбик", + "sr-Latn": "Mozambik", + "zh_TW": "莫三比克", + "tr": "Mozambik", + "ro": "Mozambic", + "ar": "موزمبيق", + "fa": "موزامبیک", + "yue": "莫桑比克" + }, + flag: "🇲🇿", + code: "MZ", + dialCode: "258", + minLength: 9, + maxLength: 9, + ), + Country( + name: "Myanmar", + nameTranslations: { + "sk": "Mjanmarsko", + "se": "Burma", + "pl": "Mjanma (Birma)", + "no": "Myanmar (Burma)", + "ja": "ミャンマー (ビルマ)", + "it": "Myanmar (Birmania)", + "zh": "缅甸", + "nl": "Myanmar (Birma)", + "de": "Myanmar", + "fr": "Myanmar (Birmanie)", + "es": "Myanmar (Birmania)", + "en": "Myanmar (Burma)", + "pt_BR": "Mianmar (Birmânia)", + "sr-Cyrl": "Мјанмар (Бурма)", + "sr-Latn": "Mjanmar (Burma)", + "zh_TW": "緬甸", + "tr": "Myanmar", + "ro": "Myanmar", + "ar": "ميانمار", + "fa": "میانمار", + "yue": "緬甸" + }, + flag: "🇲🇲", + code: "MM", + dialCode: "95", + minLength: 9, + maxLength: 9, + ), + Country( + name: "Namibia", + nameTranslations: { + "sk": "Namíbia", + "se": "Namibia", + "pl": "Namibia", + "no": "Namibia", + "ja": "ナミビア", + "it": "Namibia", + "zh": "纳米比亚", + "nl": "Namibië", + "de": "Namibia", + "fr": "Namibie", + "es": "Namibia", + "en": "Namibia", + "pt_BR": "Namibia", + "sr-Cyrl": "Намибија", + "sr-Latn": "Namibija", + "zh_TW": "納米比亞", + "tr": "Namibya", + "ro": "Namibia", + "ar": "ناميبيا", + "fa": "نامیبیا", + "yue": "納米比亞" + }, + flag: "🇳🇦", + code: "NA", + dialCode: "264", + minLength: 10, + maxLength: 10, + ), + Country( + name: "Nauru", + nameTranslations: { + "sk": "Nauru", + "se": "Nauru", + "pl": "Nauru", + "no": "Nauru", + "ja": "ナウル", + "it": "Nauru", + "zh": "瑙鲁", + "nl": "Nauru", + "de": "Nauru", + "fr": "Nauru", + "es": "Nauru", + "en": "Nauru", + "pt_BR": "Nauru", + "sr-Cyrl": "Науру", + "sr-Latn": "Nauru", + "zh_TW": "諾魯", + "tr": "Nauru", + "ro": "Nauru", + "ar": "ناورو", + "fa": "نائورو", + "yue": "瑙魯" + }, + flag: "🇳🇷", + code: "NR", + dialCode: "674", + minLength: 7, + maxLength: 7, + ), + Country( + name: "Nepal", + nameTranslations: { + "sk": "Nepál", + "se": "Nepal", + "pl": "Nepal", + "no": "Nepal", + "ja": "ネパール", + "it": "Nepal", + "zh": "尼泊尔", + "nl": "Nepal", + "de": "Nepal", + "fr": "Népal", + "es": "Nepal", + "en": "Nepal", + "pt_BR": "Nepal", + "sr-Cyrl": "Непал", + "sr-Latn": "Nepal", + "zh_TW": "尼泊爾", + "tr": "Nepal", + "ro": "Nepal", + "ar": "نيبال", + "fa": "نپال", + "yue": "尼泊爾" + }, + flag: "🇳🇵", + code: "NP", + dialCode: "977", + minLength: 10, + maxLength: 10, + ), + Country( + name: "Netherlands", + nameTranslations: { + "sk": "Holandsko", + "se": "Vuolleeatnamat", + "pl": "Holandia", + "no": "Nederland", + "ja": "オランダ", + "it": "Paesi Bassi", + "zh": "荷兰", + "nl": "Nederland", + "de": "Niederlande", + "fr": "Pays-Bas", + "es": "Países Bajos", + "en": "Netherlands", + "pt_BR": "Países Baixos", + "sr-Cyrl": "Холандија", + "sr-Latn": "Holandija", + "zh_TW": "荷蘭", + "tr": "Hollanda", + "ro": "Olanda", + "ar": "هولندا", + "fa": "هلند", + "yue": "荷蘭" + }, + flag: "🇳🇱", + code: "NL", + dialCode: "31", + minLength: 9, + maxLength: 9, + ), + Country( + name: "New Caledonia", + nameTranslations: { + "sk": "Nová Kaledónia", + "se": "Ođđa-Kaledonia", + "pl": "Nowa Kaledonia", + "no": "Ny-Caledonia", + "ja": "ニューカレドニア", + "it": "Nuova Caledonia", + "zh": "新喀里多尼亚", + "nl": "Nieuw-Caledonië", + "de": "Neukaledonien", + "fr": "Nouvelle-Calédonie", + "es": "Nueva Caledonia", + "en": "New Caledonia", + "pt_BR": "Nova Caledônia", + "sr-Cyrl": "Нова Каледонија", + "sr-Latn": "Nova Kaledonija", + "zh_TW": "新喀里多尼亞", + "tr": "Yeni Kaledonya", + "ro": "Noua Caledonie", + "ar": "كاليدونيا الجديدة", + "fa": "کالدونیای جدید", + "yue": "新喀里多尼亚" + }, + flag: "🇳🇨", + code: "NC", + dialCode: "687", + minLength: 6, + maxLength: 6, + ), + Country( + name: "New Zealand", + nameTranslations: { + "sk": "Nový Zéland", + "se": "Ođđa-Selánda", + "pl": "Nowa Zelandia", + "no": "New Zealand", + "ja": "ニュージーランド", + "it": "Nuova Zelanda", + "zh": "新西兰", + "nl": "Nieuw-Zeeland", + "de": "Neuseeland", + "fr": "Nouvelle-Zélande", + "es": "Nueva Zelanda", + "en": "New Zealand", + "pt_BR": "Nova Zelândia", + "sr-Cyrl": "Нови Зеланд", + "sr-Latn": "Novi Zeland", + "zh_TW": "紐西蘭", + "tr": "Yeni Zelanda", + "ro": "Noua Zeelandă", + "ar": "نيوزيلندا", + "fa": "نیوزلند", + "yue": "紐西蘭" + }, + flag: "🇳🇿", + code: "NZ", + dialCode: "64", + minLength: 10, + maxLength: 10, + ), + Country( + name: "Nicaragua", + nameTranslations: { + "sk": "Nikaragua", + "se": "Nicaragua", + "pl": "Nikaragua", + "no": "Nicaragua", + "ja": "ニカラグア", + "it": "Nicaragua", + "zh": "尼加拉瓜", + "nl": "Nicaragua", + "de": "Nicaragua", + "fr": "Nicaragua", + "es": "Nicaragua", + "en": "Nicaragua", + "pt_BR": "Nicarágua", + "sr-Cyrl": "Никарагва", + "sr-Latn": "Nikaragva", + "zh_TW": "尼加拉瓜", + "tr": "Nikaragua", + "ro": "Nicaragua", + "ar": "نيكاراغوا", + "fa": "نیکاراگوئه", + "yue": "尼加拉瓜" + }, + flag: "🇳🇮", + code: "NI", + dialCode: "505", + minLength: 8, + maxLength: 8, + ), + Country( + name: "Niger", + nameTranslations: { + "sk": "Niger", + "se": "Niger", + "pl": "Niger", + "no": "Niger", + "ja": "ニジェール", + "it": "Niger", + "zh": "尼日尔", + "nl": "Niger", + "de": "Niger", + "fr": "Niger", + "es": "Níger", + "en": "Niger", + "pt_BR": "Níger", + "sr-Cyrl": "Нигер", + "sr-Latn": "Niger", + "zh_TW": "尼日爾", + "tr": "Nijer", + "ro": "Niger", + "ar": "النيجر", + "fa": "نیجر", + "yue": "尼日爾" + }, + flag: "🇳🇪", + code: "NE", + dialCode: "227", + minLength: 8, + maxLength: 8, + ), + Country( + name: "Nigeria", + nameTranslations: { + "sk": "Nigéria", + "se": "Nigeria", + "pl": "Nigeria", + "no": "Nigeria", + "ja": "ナイジェリア", + "it": "Nigeria", + "zh": "尼日利亚", + "nl": "Nigeria", + "de": "Nigeria", + "fr": "Nigéria", + "es": "Nigeria", + "en": "Nigeria", + "pt_BR": "Nigéria", + "sr-Cyrl": "Нигерија", + "sr-Latn": "Nigerija", + "zh_TW": "奈及利亞", + "tr": "Nijerya", + "ro": "Nigeria", + "ar": "نيجيريا", + "fa": "نیجریه", + "yue": "尼日利亞" + }, + flag: "🇳🇬", + code: "NG", + dialCode: "234", + minLength: 10, + maxLength: 11, + ), + Country( + name: "Niue", + nameTranslations: { + "sk": "Niue", + "se": "Niue", + "pl": "Niue", + "no": "Niue", + "ja": "ニウエ", + "it": "Niue", + "zh": "纽埃", + "nl": "Niue", + "de": "Niue", + "fr": "Niue", + "es": "Niue", + "en": "Niue", + "pt_BR": "Niue", + "sr-Cyrl": "Нијуе", + "sr-Latn": "Nijue", + "zh_TW": "紐埃", + "tr": "Niue", + "ro": "Niue", + "ar": "نييوي", + "fa": "نیووی", + "yue": "紐埃" + }, + flag: "🇳🇺", + code: "NU", + dialCode: "683", + minLength: 4, + maxLength: 4, + ), + Country( + name: "Norfolk Island", + nameTranslations: { + "sk": "Norfolk", + "se": "Norfolksullot", + "pl": "Norfolk", + "no": "Norfolkøya", + "ja": "ノーフォーク島", + "it": "Isola Norfolk", + "zh": "诺福克岛", + "nl": "Norfolk", + "de": "Norfolkinsel", + "fr": "Île Norfolk", + "es": "Isla Norfolk", + "en": "Norfolk Island", + "pt_BR": "Ilha Norfolk", + "sr-Cyrl": "Острво Норфок", + "sr-Latn": "Ostrvo Norfok", + "zh_TW": "諾福克島", + "tr": "Norfolk Adası", + "ro": "Insulele Norfolk", + "ar": "جزيرة نورفولك", + "fa": "جزیره نورفک", + "yue": "诺福克岛" + }, + flag: "🇳🇫", + code: "NF", + dialCode: "672", + minLength: 15, + maxLength: 15, + ), + Country( + name: "Northern Mariana Islands", + nameTranslations: { + "sk": "Severné Mariány", + "se": "Davvi-Mariánat", + "pl": "Mariany Północne", + "no": "Nord-Marianene", + "ja": "北マリアナ諸島", + "it": "Isole Marianne settentrionali", + "zh": "北马里亚纳群岛", + "nl": "Noordelijke Marianen", + "de": "Nördliche Marianen", + "fr": "Îles Mariannes du Nord", + "es": "Islas Marianas del Norte", + "en": "Northern Mariana Islands", + "pt_BR": "Ilhas Marianas do Norte", + "sr-Cyrl": "Северна Маријанска Острва", + "sr-Latn": "Severna Marijanska Ostrva", + "zh_TW": "北馬利安納群島", + "tr": "Kuzey Mariana Adaları", + "ro": "Insulelor Mariane de Nord", + "ar": "جزر ماريانا الشمالية", + "fa": "جزایر ماریانای شمالی", + "yue": "北馬里亞納群島" + }, + flag: "🇲🇵", + code: "MP", + dialCode: "1670", + minLength: 7, + maxLength: 7, + ), + Country( + name: "Norway", + nameTranslations: { + "sk": "Nórsko", + "se": "Norga", + "pl": "Norwegia", + "no": "Norge", + "ja": "ノルウェー", + "it": "Norvegia", + "zh": "挪威", + "nl": "Noorwegen", + "de": "Norwegen", + "fr": "Norvège", + "es": "Noruega", + "en": "Norway", + "pt_BR": "Noruega", + "sr-Cyrl": "Норвешка", + "sr-Latn": "Norveška", + "zh_TW": "挪威", + "tr": "Norveç", + "ro": "Norvegia", + "ar": "النرويج", + "fa": "نروژ", + "yue": "挪威" + }, + flag: "🇳🇴", + code: "NO", + dialCode: "47", + minLength: 8, + maxLength: 8, + ), + Country( + name: "Oman", + nameTranslations: { + "sk": "Omán", + "se": "Oman", + "pl": "Oman", + "no": "Oman", + "ja": "オマーン", + "it": "Oman", + "zh": "阿曼", + "nl": "Oman", + "de": "Oman", + "fr": "Oman", + "es": "Omán", + "en": "Oman", + "pt_BR": "Omã", + "sr-Cyrl": "Оман", + "sr-Latn": "Oman", + "zh_TW": "阿曼", + "tr": "Umman", + "ro": "Oman", + "ar": "عمان", + "fa": "عمان", + "yue": "阿曼" + }, + flag: "🇴🇲", + code: "OM", + dialCode: "968", + minLength: 8, + maxLength: 8, + ), + Country( + name: "Pakistan", + nameTranslations: { + "sk": "Pakistan", + "se": "Pakistan", + "pl": "Pakistan", + "no": "Pakistan", + "ja": "パキスタン", + "it": "Pakistan", + "zh": "巴基斯坦", + "nl": "Pakistan", + "de": "Pakistan", + "fr": "Pakistan", + "es": "Pakistán", + "en": "Pakistan", + "pt_BR": "Paquistão", + "sr-Cyrl": "Пакистан", + "sr-Latn": "Pakistan", + "zh_TW": "巴基斯坦", + "tr": "Pakistan", + "ro": "Pakistan", + "ar": "باكستان", + "fa": "پاکستان", + "yue": "巴基斯坦" + }, + flag: "🇵🇰", + code: "PK", + dialCode: "92", + minLength: 10, + maxLength: 10, + ), + Country( + name: "Palau", + nameTranslations: { + "sk": "Palau", + "se": "Palau", + "pl": "Palau", + "no": "Palau", + "ja": "パラオ", + "it": "Palau", + "zh": "帕劳", + "nl": "Palau", + "de": "Palau", + "fr": "Palaos", + "es": "Palaos", + "en": "Palau", + "pt_BR": "Palau", + "sr-Cyrl": "Палау", + "sr-Latn": "Palau", + "zh_TW": "帛琉", + "tr": "Palau", + "ro": "Palau", + "ar": "بالاو", + "fa": "پالائو", + "yue": "帕劳" + }, + flag: "🇵🇼", + code: "PW", + dialCode: "680", + minLength: 7, + maxLength: 7, + ), + Country( + name: "Palestinian Territory, Occupied", + nameTranslations: { + "sk": "Palestínske územia", + "se": "Palestina", + "pl": "Terytoria Palestyńskie", + "no": "Det palestinske området", + "ja": "パレスチナ自治区", + "it": "Territori palestinesi", + "zh": "巴勒斯坦领土", + "nl": "Palestijnse gebieden", + "de": "Palästinensische Autonomiegebiete", + "fr": "Territoires palestiniens", + "es": "Territorios Palestinos", + "en": "Palestinian Territories", + "pt_BR": "Territórios Palestinos", + "sr-Cyrl": "Палестина", + "sr-Latn": "Palestina", + "zh_TW": "巴勒斯坦", + "tr": "Filistin", + "ro": "Palestina", + "ar": "فلسطين", + "fa": "فلسطین", + "yue": "巴勒斯坦,国" + }, + flag: "🇵🇸", + code: "PS", + dialCode: "970", + minLength: 9, + maxLength: 9, + ), + Country( + name: "Panama", + nameTranslations: { + "sk": "Panama", + "se": "Panama", + "pl": "Panama", + "no": "Panama", + "ja": "パナマ", + "it": "Panamá", + "zh": "巴拿马", + "nl": "Panama", + "de": "Panama", + "fr": "Panama", + "es": "Panamá", + "en": "Panama", + "pt_BR": "Panamá", + "sr-Cyrl": "Панама", + "sr-Latn": "Panama", + "zh_TW": "巴拿馬", + "tr": "Panama", + "ro": "Panama", + "ar": "بنما", + "fa": "پاناما", + "yue": "巴拿馬" + }, + flag: "🇵🇦", + code: "PA", + dialCode: "507", + minLength: 8, + maxLength: 8, + ), + Country( + name: "Papua New Guinea", + nameTranslations: { + "sk": "Papua-Nová Guinea", + "se": "Papua-Ođđa-Guinea", + "pl": "Papua-Nowa Gwinea", + "no": "Papua Ny-Guinea", + "ja": "パプアニューギニア", + "it": "Papua Nuova Guinea", + "zh": "巴布亚新几内亚", + "nl": "Papoea-Nieuw-Guinea", + "de": "Papua-Neuguinea", + "fr": "Papouasie-Nouvelle-Guinée", + "es": "Papúa Nueva Guinea", + "en": "Papua New Guinea", + "pt_BR": "Papua Nova Guiné", + "sr-Cyrl": "Папуа Нова Гвинеја", + "sr-Latn": "Papua Nova Gvineja", + "zh_TW": "巴布亞新幾內亞", + "tr": "Papua Yeni Gine", + "ro": "Papua Noua Guinee", + "ar": "بابوا غينيا الجديدة", + "fa": "پاپوآ گینه نو", + "yue": "巴布亚新几内亚" + }, + flag: "🇵🇬", + code: "PG", + dialCode: "675", + minLength: 11, + maxLength: 11, + ), + Country( + name: "Paraguay", + nameTranslations: { + "sk": "Paraguaj", + "se": "Paraguay", + "pl": "Paragwaj", + "no": "Paraguay", + "ja": "パラグアイ", + "it": "Paraguay", + "zh": "巴拉圭", + "nl": "Paraguay", + "de": "Paraguay", + "fr": "Paraguay", + "es": "Paraguay", + "en": "Paraguay", + "pt_BR": "Paraguai", + "sr-Cyrl": "Парагвај", + "sr-Latn": "Paragvaj", + "zh_TW": "巴拉圭", + "tr": "Paraguay", + "ro": "Paraguay", + "ar": "باراغواي", + "fa": "پاراگوئه", + "yue": "巴拉圭" + }, + flag: "🇵🇾", + code: "PY", + dialCode: "595", + minLength: 10, + maxLength: 10, + ), + Country( + name: "Peru", + nameTranslations: { + "sk": "Peru", + "se": "Peru", + "pl": "Peru", + "no": "Peru", + "ja": "ペルー", + "it": "Perù", + "zh": "秘鲁", + "nl": "Peru", + "de": "Peru", + "fr": "Pérou", + "es": "Perú", + "en": "Peru", + "pt_BR": "Peru", + "sr-Cyrl": "Перу", + "sr-Latn": "Peru", + "zh_TW": "秘鲁", + "tr": "Peru", + "ro": "Peru", + "ar": "بيرو", + "fa": "پرو", + "yue": "秘魯" + }, + flag: "🇵🇪", + code: "PE", + dialCode: "51", + minLength: 9, + maxLength: 9, + ), + Country( + name: "Philippines", + nameTranslations: { + "sk": "Filipíny", + "se": "Filippiinnat", + "pl": "Filipiny", + "no": "Filippinene", + "ja": "フィリピン", + "it": "Filippine", + "zh": "菲律宾", + "nl": "Filipijnen", + "de": "Philippinen", + "fr": "Philippines", + "es": "Filipinas", + "en": "Philippines", + "pt_BR": "Filipinas", + "sr-Cyrl": "Филипини", + "sr-Latn": "Filipini", + "zh_TW": "菲律賓", + "tr": "Filipinler", + "ro": "Filipine", + "ar": "الفلبين", + "fa": "فیلیپین", + "yue": "菲律賓" + }, + flag: "🇵🇭", + code: "PH", + dialCode: "63", + minLength: 10, + maxLength: 10, + ), + Country( + name: "Pitcairn", + nameTranslations: { + "sk": "Pitcairnove ostrovy", + "se": "Pitcairn", + "pl": "Pitcairn", + "no": "Pitcairnøyene", + "ja": "ピトケアン諸島", + "it": "Isole Pitcairn", + "zh": "皮特凯恩群岛", + "nl": "Pitcairneilanden", + "de": "Pitcairninseln", + "fr": "Îles Pitcairn", + "es": "Islas Pitcairn", + "en": "Pitcairn Islands", + "pt_BR": "Ilhas Pitcairn", + "sr-Cyrl": "Острва Питкерн", + "sr-Latn": "Ostrva Pitkern", + "zh_TW": "皮特肯群島", + "tr": "Pitcairn Adaları", + "ro": "Insulele Pitcairn", + "ar": "جزر بيتكيرن", + "fa": "جزایر پیت‌کرن", + "yue": "皮特凱恩" + }, + flag: "🇵🇳", + code: "PN", + dialCode: "64", + minLength: 10, + maxLength: 10, + ), + Country( + name: "Poland", + nameTranslations: { + "sk": "Poľsko", + "se": "Polen", + "pl": "Polska", + "no": "Polen", + "ja": "ポーランド", + "it": "Polonia", + "zh": "波兰", + "nl": "Polen", + "de": "Polen", + "fr": "Pologne", + "es": "Polonia", + "en": "Poland", + "pt_BR": "Polônia", + "sr-Cyrl": "Пољска", + "sr-Latn": "Poljska", + "zh_TW": "波蘭", + "tr": "Polonya", + "ro": "Polonia", + "ar": "بولندا", + "fa": "لهستان", + "yue": "波蘭" + }, + flag: "🇵🇱", + code: "PL", + dialCode: "48", + minLength: 9, + maxLength: 9, + ), + Country( + name: "Portugal", + nameTranslations: { + "sk": "Portugalsko", + "se": "Portugála", + "pl": "Portugalia", + "no": "Portugal", + "ja": "ポルトガル", + "it": "Portogallo", + "zh": "葡萄牙", + "nl": "Portugal", + "de": "Portugal", + "fr": "Portugal", + "es": "Portugal", + "en": "Portugal", + "pt_BR": "Portugal", + "sr-Cyrl": "Португалија", + "sr-Latn": "Portugalija", + "zh_TW": "葡萄牙", + "tr": "Portekiz", + "ro": "Portugalia", + "ar": "البرتغال", + "fa": "پرتغال", + "yue": "葡萄牙" + }, + flag: "🇵🇹", + code: "PT", + dialCode: "351", + minLength: 9, + maxLength: 9, + ), + Country( + name: "Puerto Rico", + nameTranslations: { + "sk": "Portoriko", + "se": "Puerto Rico", + "pl": "Portoryko", + "no": "Puerto Rico", + "ja": "プエルトリコ", + "it": "Portorico", + "zh": "波多黎各", + "nl": "Puerto Rico", + "de": "Puerto Rico", + "fr": "Porto Rico", + "es": "Puerto Rico", + "en": "Puerto Rico", + "pt_BR": "Porto Rico", + "sr-Cyrl": "Порто Рико", + "sr-Latn": "Porto Riko", + "zh_TW": "波多黎各", + "tr": "Porto Riko", + "ro": "Puerto Rico", + "ar": "بورتوريكو", + "fa": "پورتوریکو", + "yue": "波多黎各" + }, + flag: "🇵🇷", + code: "PR", + dialCode: "1939", + minLength: 15, + maxLength: 15, + ), + Country( + name: "Qatar", + nameTranslations: { + "sk": "Katar", + "se": "Qatar", + "pl": "Katar", + "no": "Qatar", + "ja": "カタール", + "it": "Qatar", + "zh": "卡塔尔", + "nl": "Qatar", + "de": "Katar", + "fr": "Qatar", + "es": "Catar", + "en": "Qatar", + "pt_BR": "Catar", + "sr-Cyrl": "Катар", + "sr-Latn": "Katar", + "zh_TW": "卡達", + "tr": "Katar", + "ro": "Qatar", + "ar": "قطر", + "fa": "قطر", + "yue": "卡塔爾" + }, + flag: "🇶🇦", + code: "QA", + dialCode: "974", + minLength: 8, + maxLength: 8, + ), + Country( + name: "Romania", + nameTranslations: { + "sk": "Rumunsko", + "se": "Románia", + "pl": "Rumunia", + "no": "Romania", + "ja": "ルーマニア", + "it": "Romania", + "zh": "罗马尼亚", + "nl": "Roemenië", + "de": "Rumänien", + "fr": "Roumanie", + "es": "Rumanía", + "en": "Romania", + "pt_BR": "Romênia", + "sr-Cyrl": "Румунија", + "sr-Latn": "Rumunija", + "zh_TW": "羅馬尼亞", + "tr": "Romanya", + "ro": "România", + "ar": "رومانيا", + "fa": "رومانی", + "yue": "羅馬尼亞" + }, + flag: "🇷🇴", + code: "RO", + dialCode: "40", + minLength: 9, + maxLength: 9, + ), + Country( + name: "Russia", + nameTranslations: { + "sk": "Rusko", + "se": "Ruošša", + "pl": "Rosja", + "no": "Russland", + "ja": "ロシア", + "it": "Russia", + "zh": "俄罗斯", + "nl": "Rusland", + "de": "Russland", + "fr": "Russie", + "es": "Rusia", + "en": "Russia", + "pt_BR": "Rússia", + "sr-Cyrl": "Русија", + "sr-Latn": "Rusija", + "zh_TW": "俄羅斯", + "tr": "Rusya", + "ro": "Rusia", + "ar": "روسيا", + "fa": "روسیه", + "yue": "俄儸斯聯邦" + }, + flag: "🇷🇺", + code: "RU", + dialCode: "7", + minLength: 10, + maxLength: 10, + ), + Country( + name: "Rwanda", + nameTranslations: { + "sk": "Rwanda", + "se": "Rwanda", + "pl": "Rwanda", + "no": "Rwanda", + "ja": "ルワンダ", + "it": "Ruanda", + "zh": "卢旺达", + "nl": "Rwanda", + "de": "Ruanda", + "fr": "Rwanda", + "es": "Ruanda", + "en": "Rwanda", + "pt_BR": "Ruanda", + "sr-Cyrl": "Руанда", + "sr-Latn": "Ruanda", + "zh_TW": "盧安達", + "tr": "Ruanda", + "ro": "Rwanda", + "ar": "رواندا", + "fa": "رواندا", + "yue": "盧旺達" + }, + flag: "🇷🇼", + code: "RW", + dialCode: "250", + minLength: 9, + maxLength: 9, + ), + Country( + name: "Reunion", + nameTranslations: { + "sk": "Réunion", + "se": "Réunion", + "pl": "Reunion", + "no": "Réunion", + "ja": "レユニオン", + "it": "Riunione", + "zh": "留尼汪", + "nl": "Réunion", + "de": "Réunion", + "fr": "La Réunion", + "es": "Reunión", + "en": "Réunion", + "pt_BR": "Reunião", + "sr-Cyrl": "Реинион", + "sr-Latn": "Reinion", + "zh_TW": "留尼旺", + "tr": "La Réunion", + "ro": "La Réunion", + "ar": "لا ريونيون", + "fa": "رئونیون", + "yue": "留尼汪" + }, + flag: "🇷🇪", + code: "RE", + dialCode: "262", + minLength: 9, + maxLength: 9, + ), + Country( + name: "Saint Barthelemy", + nameTranslations: { + "sk": "Svätý Bartolomej", + "se": "Saint Barthélemy", + "pl": "Saint-Barthélemy", + "no": "Saint-Barthélemy", + "ja": "サン・バルテルミー", + "it": "Saint-Barthélemy", + "zh": "圣巴泰勒米", + "nl": "Saint-Barthélemy", + "de": "St. Barthélemy", + "fr": "Saint-Barthélemy", + "es": "San Bartolomé", + "en": "St. Barthélemy", + "pt_BR": "São Bartolomeu", + "sr-Cyrl": "Сент Бартелеми", + "sr-Latn": "Sent Bartelemi", + "zh_TW": "聖巴瑟米", + "tr": "Saint Barthélemy", + "ro": "Saint Barthélemy", + "ar": "سان بارتيلمي", + "fa": "سن بارتلمی", + "yue": "聖巴泰勒米" + }, + flag: "🇧🇱", + code: "BL", + dialCode: "590", + minLength: 9, + maxLength: 9, + ), + Country( + name: "Saint Helena, Ascension and Tristan Da Cunha", + nameTranslations: { + "sk": "Svätá Helena", + "se": "Saint Helena", + "pl": "Wyspa Świętej Heleny", + "no": "St. Helena", + "ja": "セントヘレナ", + "it": "Sant'Elena", + "zh": "圣赫勒拿", + "nl": "Sint-Helena", + "de": "St. Helena", + "fr": "Sainte-Hélène", + "es": "Santa Elena", + "en": "St. Helena", + "pt_BR": "Santa Helena", + "sr-Cyrl": "Света Јелена, Асенсион и Тристан да Куња", + "sr-Latn": "Sveta Jelena, Asension i Tristan de Kunja", + "zh_TW": "聖凱倫拿島", + "tr": "Saint Helena", + "ro": "Sfânta Elena", + "ar": "سانت هيلانة وأسينشين وتريستان دا كونا", + "fa": "سنت هلن", + "yue": "圣赫勒拿、阿森松同特里斯坦·达库尼亚" + }, + flag: "🇸🇭", + code: "SH", + dialCode: "290", + minLength: 4, + maxLength: 4, + ), + Country( + name: "Saint Kitts and Nevis", + nameTranslations: { + "sk": "Svätý Krištof a Nevis", + "se": "Saint Kitts ja Nevis", + "pl": "Saint Kitts i Nevis", + "no": "Saint Kitts og Nevis", + "ja": "セントクリストファー・ネーヴィス", + "it": "Saint Kitts e Nevis", + "zh": "圣基茨和尼维斯", + "nl": "Saint Kitts en Nevis", + "de": "St. Kitts und Nevis", + "fr": "Saint-Christophe-et-Niévès", + "es": "San Cristóbal y Nieves", + "en": "St. Kitts & Nevis", + "pt_BR": "São Cristóvão e Nevis", + "sr-Cyrl": "Сент Китс и Невис", + "sr-Latn": "Sent Kits i Nevis", + "zh_TW": "聖克里斯多福及尼維斯", + "tr": "Saint Kitts ve Nevis", + "ro": "Sfântul Kitts și Nevis", + "ar": "سانت كيتس ونيفيس", + "fa": "سنت کیتس و نویس", + "yue": "圣基茨同尼维斯" + }, + flag: "🇰🇳", + code: "KN", + dialCode: "1869", + minLength: 7, + maxLength: 7, + ), + Country( + name: "Saint Lucia", + nameTranslations: { + "sk": "Svätá Lucia", + "se": "Saint Lucia", + "pl": "Saint Lucia", + "no": "St. Lucia", + "ja": "セントルシア", + "it": "Saint Lucia", + "zh": "圣卢西亚", + "nl": "Saint Lucia", + "de": "St. Lucia", + "fr": "Sainte-Lucie", + "es": "Santa Lucía", + "en": "St. Lucia", + "pt_BR": "Santa Lúcia", + "sr-Cyrl": "Света Луција", + "sr-Latn": "Sveta Lucija", + "zh_TW": "聖露西亞", + "tr": "Saint Lucia", + "ro": "Sfânta Elena", + "ar": "سانت لوسيا", + "fa": "سنت لوسیا", + "yue": "聖盧西亞" + }, + flag: "🇱🇨", + code: "LC", + dialCode: "1758", + minLength: 7, + maxLength: 7, + ), + Country( + name: "Saint Martin", + nameTranslations: { + "sk": "Svätý Martin (fr.)", + "se": "Frankriikka Saint Martin", + "pl": "Saint-Martin", + "no": "Saint-Martin", + "ja": "サン・マルタン", + "it": "Saint Martin", + "zh": "法属圣马丁", + "nl": "Saint-Martin", + "de": "St. Martin", + "fr": "Saint-Martin", + "es": "San Martín", + "en": "St. Martin", + "pt_BR": "São Martinho", + "sr-Cyrl": "Свети Мартин", + "sr-Latn": "Sveti Martin", + "zh_TW": "聖馬丁", + "tr": "Saint Martin", + "ro": "Sfântul Martin", + "ar": "تجمع سان مارتين", + "fa": "سن مارتن", + "yue": "聖馬丁(法國部分)" + }, + flag: "🇲🇫", + code: "MF", + dialCode: "590", + minLength: 9, + maxLength: 9, + ), + Country( + name: "Saint Pierre and Miquelon", + nameTranslations: { + "sk": "Saint Pierre a Miquelon", + "se": "Saint Pierre ja Miquelon", + "pl": "Saint-Pierre i Miquelon", + "no": "Saint-Pierre-et-Miquelon", + "ja": "サンピエール島・ミクロン島", + "it": "Saint-Pierre e Miquelon", + "zh": "圣皮埃尔和密克隆群岛", + "nl": "Saint-Pierre en Miquelon", + "de": "St. Pierre und Miquelon", + "fr": "Saint-Pierre-et-Miquelon", + "es": "San Pedro y Miquelón", + "en": "St. Pierre & Miquelon", + "pt_BR": "São Pedro e Miquelon", + "sr-Cyrl": "Сен Пјер и Микелон", + "sr-Latn": "Sen Pjer i Mikelon", + "zh_TW": "聖皮埃與密克隆群島", + "tr": "Saint Pierre ve Miquelon", + "ro": "Saint Pierre și Miquelon", + "ar": "سان بيير وميكلون", + "fa": "سن-پیر و میکلون", + "yue": "聖皮埃尔同米克隆" + }, + flag: "🇵🇲", + code: "PM", + dialCode: "508", + minLength: 6, + maxLength: 6, + ), + Country( + name: "Saint Vincent and the Grenadines", + nameTranslations: { + "sk": "Svätý Vincent a Grenadíny", + "se": "Saint Vincent ja Grenadine", + "pl": "Saint Vincent i Grenadyny", + "no": "St. Vincent og Grenadinene", + "ja": "セントビンセント及びグレナディーン諸島", + "it": "Saint Vincent e Grenadine", + "zh": "圣文森特和格林纳丁斯", + "nl": "Saint Vincent en de Grenadines", + "de": "St. Vincent und die Grenadinen", + "fr": "Saint-Vincent-et-les-Grenadines", + "es": "San Vicente y las Granadinas", + "en": "St. Vincent & Grenadines", + "pt_BR": "São Vicente e Granadinas", + "sr-Cyrl": "Свети Винсент и Гренадини", + "sr-Latn": "Sveti Vinsent i Grenadini", + "zh_TW": "聖文森及格瑞那丁", + "tr": "Saint Vincent ve Grenadinler", + "ro": "Sfântul Vincențiu și Grenadinele", + "ar": "سانت فينسنت والغرينادين", + "fa": "سنت وینسنت و گرنادین‌ها", + "yue": "聖文森特同格林纳丁斯" + }, + flag: "🇻🇨", + code: "VC", + dialCode: "1784", + minLength: 7, + maxLength: 7, + ), + Country( + name: "Samoa", + nameTranslations: { + "sk": "Samoa", + "se": "Samoa", + "pl": "Samoa", + "no": "Samoa", + "ja": "サモア", + "it": "Samoa", + "zh": "萨摩亚", + "nl": "Samoa", + "de": "Samoa", + "fr": "Samoa", + "es": "Samoa", + "en": "Samoa", + "pt_BR": "Samoa", + "sr-Cyrl": "Самоа", + "sr-Latn": "Samoa", + "zh_TW": "薩摩亞", + "tr": "Samoa", + "ro": "Samoa", + "ar": "ساموا", + "fa": "ساموآ", + "yue": "薩摩亞" + }, + flag: "🇼🇸", + code: "WS", + dialCode: "685", + minLength: 7, + maxLength: 7, + ), + Country( + name: "San Marino", + nameTranslations: { + "sk": "San Maríno", + "se": "San Marino", + "pl": "San Marino", + "no": "San Marino", + "ja": "サンマリノ", + "it": "San Marino", + "zh": "圣马力诺", + "nl": "San Marino", + "de": "San Marino", + "fr": "Saint-Marin", + "es": "San Marino", + "en": "San Marino", + "pt_BR": "San Marino", + "sr-Cyrl": "Сан Марино", + "sr-Latn": "San Marino", + "zh_TW": "聖馬利諾", + "tr": "San Marino", + "ro": "San Marino", + "ar": "سان مارينو", + "fa": "سان مارینو", + "yue": "聖馬力諾" + }, + flag: "🇸🇲", + code: "SM", + dialCode: "378", + minLength: 10, + maxLength: 10, + ), + Country( + name: "Sao Tome and Principe", + nameTranslations: { + "sk": "Svätý Tomáš a Princov ostrov", + "se": "São Tomé ja Príncipe", + "pl": "Wyspy Świętego Tomasza i Książęca", + "no": "São Tomé og Príncipe", + "ja": "サントメ・プリンシペ", + "it": "São Tomé e Príncipe", + "zh": "圣多美和普林西比", + "nl": "Sao Tomé en Principe", + "de": "São Tomé und Príncipe", + "fr": "Sao Tomé-et-Principe", + "es": "Santo Tomé y Príncipe", + "en": "São Tomé & Príncipe", + "pt_BR": "São Tomé e Príncipe", + "sr-Cyrl": "Сао Томе и Принсипе", + "sr-Latn": "Sao Tome i Prinsipe", + "zh_TW": "聖多美普林西比", + "tr": "São Tomé ve Príncipe", + "ro": "Sao Tome şi Principe", + "ar": "ساو تومي وبرينسيب", + "fa": "سائوتومه و پرنسیپ", + "yue": "聖多美和普林西比" + }, + flag: "🇸🇹", + code: "ST", + dialCode: "239", + minLength: 7, + maxLength: 7, + ), + Country( + name: "Saudi Arabia", + nameTranslations: { + "sk": "Saudská Arábia", + "se": "Saudi-Arábia", + "pl": "Arabia Saudyjska", + "no": "Saudi-Arabia", + "ja": "サウジアラビア", + "it": "Arabia Saudita", + "zh": "沙特阿拉伯", + "nl": "Saoedi-Arabië", + "de": "Saudi-Arabien", + "fr": "Arabie saoudite", + "es": "Arabia Saudí", + "en": "Saudi Arabia", + "pt_BR": "Arábia Saudita", + "sr-Cyrl": "Саудијска Арабија", + "sr-Latn": "Saudijska Arabija", + "zh_TW": "沙烏地阿拉", + "tr": "Suudi Arabistan", + "ro": "Arabia Saudită", + "ar": "السعودية", + "fa": "عربستان سعودی", + "yue": "沙地阿拉伯" + }, + flag: "🇸🇦", + code: "SA", + dialCode: "966", + minLength: 9, + maxLength: 9, + ), + Country( + name: "Senegal", + nameTranslations: { + "sk": "Senegal", + "se": "Senegal", + "pl": "Senegal", + "no": "Senegal", + "ja": "セネガル", + "it": "Senegal", + "zh": "塞内加尔", + "nl": "Senegal", + "de": "Senegal", + "fr": "Sénégal", + "es": "Senegal", + "en": "Senegal", + "pt_BR": "Senegal", + "sr-Cyrl": "Сенегал", + "sr-Latn": "Senegal", + "zh_TW": "塞內加爾", + "tr": "Senegal", + "ro": "Senegal", + "ar": "السنغال", + "fa": "سنگال", + "yue": "塞內加爾" + }, + flag: "🇸🇳", + code: "SN", + dialCode: "221", + minLength: 9, + maxLength: 9, + ), + Country( + name: "Serbia", + nameTranslations: { + "sk": "Srbsko", + "se": "Serbia", + "pl": "Serbia", + "no": "Serbia", + "ja": "セルビア", + "it": "Serbia", + "zh": "塞尔维亚", + "nl": "Servië", + "de": "Serbien", + "fr": "Serbie", + "es": "Serbia", + "en": "Serbia", + "pt_BR": "Sérvia", + "sr-Cyrl": "Србија", + "sr-Latn": "Srbija", + "zh_TW": "塞爾維亞", + "tr": "Sırbistan", + "ro": "Serbia", + "ar": "صربيا", + "fa": "صربستان", + "yue": "塞爾維亞" + }, + flag: "🇷🇸", + code: "RS", + dialCode: "381", + minLength: 12, + maxLength: 12, + ), + Country( + name: "Seychelles", + nameTranslations: { + "sk": "Seychely", + "se": "Seychellsullot", + "pl": "Seszele", + "no": "Seychellene", + "ja": "セーシェル", + "it": "Seychelles", + "zh": "塞舌尔", + "nl": "Seychellen", + "de": "Seychellen", + "fr": "Seychelles", + "es": "Seychelles", + "en": "Seychelles", + "pt_BR": "Seychelles", + "sr-Cyrl": "Сејшели", + "sr-Latn": "Sejšeli", + "zh_TW": "塞席爾", + "tr": "Seyşeller", + "ro": "Seychelles", + "ar": "سيشل", + "fa": "سیشل", + "yue": "塞舌爾" + }, + flag: "🇸🇨", + code: "SC", + dialCode: "248", + minLength: 6, + maxLength: 6, + ), + Country( + name: "Sierra Leone", + nameTranslations: { + "sk": "Sierra Leone", + "se": "Sierra Leone", + "pl": "Sierra Leone", + "no": "Sierra Leone", + "ja": "シエラレオネ", + "it": "Sierra Leone", + "zh": "塞拉利昂", + "nl": "Sierra Leone", + "de": "Sierra Leone", + "fr": "Sierra Leone", + "es": "Sierra Leona", + "en": "Sierra Leone", + "pt_BR": "Serra Leoa", + "sr-Cyrl": "Сијера Леоне", + "sr-Latn": "Sijera Leone", + "zh_TW": "獅子山", + "tr": "Sierra Leone", + "ro": "Sierra Leone", + "ar": "سيراليون", + "fa": "سیرالئون", + "yue": "塞拉利昂" + }, + flag: "🇸🇱", + code: "SL", + dialCode: "232", + minLength: 8, + maxLength: 8, + ), + Country( + name: "Singapore", + nameTranslations: { + "sk": "Singapur", + "se": "Singapore", + "pl": "Singapur", + "no": "Singapore", + "ja": "シンガポール", + "it": "Singapore", + "zh": "新加坡", + "nl": "Singapore", + "de": "Singapur", + "fr": "Singapour", + "es": "Singapur", + "en": "Singapore", + "pt_BR": "Cingapura", + "sr-Cyrl": "Сингапур", + "sr-Latn": "Singapur", + "zh_TW": "新加坡", + "tr": "Singapur", + "ro": "Singapore", + "ar": "سنغافورة", + "fa": "سنگاپور", + "yue": "星架坡" + }, + flag: "🇸🇬", + code: "SG", + dialCode: "65", + minLength: 8, + maxLength: 8, + ), + Country( + name: "Slovakia", + nameTranslations: { + "sk": "Slovensko", + "se": "Slovákia", + "pl": "Słowacja", + "no": "Slovakia", + "ja": "スロバキア", + "it": "Slovacchia", + "zh": "斯洛伐克", + "nl": "Slowakije", + "de": "Slowakei", + "fr": "Slovaquie", + "es": "Eslovaquia", + "en": "Slovakia", + "pt_BR": "Eslováquia", + "sr-Cyrl": "Словачка", + "sr-Latn": "Slovačka", + "zh_TW": "斯洛伐克", + "tr": "Slovakya", + "ro": "Slovacia", + "ar": "سلوفاكيا", + "fa": "اسلواکی", + "yue": "斯洛伐克" + }, + flag: "🇸🇰", + code: "SK", + dialCode: "421", + minLength: 9, + maxLength: 9, + ), + Country( + name: "Slovenia", + nameTranslations: { + "sk": "Slovinsko", + "se": "Slovenia", + "pl": "Słowenia", + "no": "Slovenia", + "ja": "スロベニア", + "it": "Slovenia", + "zh": "斯洛文尼亚", + "nl": "Slovenië", + "de": "Slowenien", + "fr": "Slovénie", + "es": "Eslovenia", + "en": "Slovenia", + "pt_BR": "Eslovênia", + "sr-Cyrl": "Словеније", + "sr-Latn": "Slovenija", + "zh_TW": "斯洛維尼亞", + "tr": "Slovenya", + "ro": "Slovenia", + "ar": "سلوفينيا", + "fa": "اسلوونی", + "yue": "斯洛文尼亞" + }, + flag: "🇸🇮", + code: "SI", + dialCode: "386", + minLength: 8, + maxLength: 8, + ), + Country( + name: "Solomon Islands", + nameTranslations: { + "sk": "Šalamúnove ostrovy", + "se": "Salomon-sullot", + "pl": "Wyspy Salomona", + "no": "Salomonøyene", + "ja": "ソロモン諸島", + "it": "Isole Salomone", + "zh": "所罗门群岛", + "nl": "Salomonseilanden", + "de": "Salomonen", + "fr": "Îles Salomon", + "es": "Islas Salomón", + "en": "Solomon Islands", + "pt_BR": "Ilhas Salomão", + "sr-Cyrl": "Соломонска Острва", + "sr-Latn": "Solomonska Ostrva", + "zh_TW": "所羅門群島", + "tr": "Solomon Adaları", + "ro": "Insulele Solomon", + "ar": "جزر سليمان", + "fa": "جزایر سلیمان", + "yue": "所羅門群島" + }, + flag: "🇸🇧", + code: "SB", + dialCode: "677", + minLength: 5, + maxLength: 5, + ), + Country( + name: "Somalia", + nameTranslations: { + "sk": "Somálsko", + "se": "Somália", + "pl": "Somalia", + "no": "Somalia", + "ja": "ソマリア", + "it": "Somalia", + "zh": "索马里", + "nl": "Somalië", + "de": "Somalia", + "fr": "Somalie", + "es": "Somalia", + "en": "Somalia", + "pt_BR": "Somália", + "sr-Cyrl": "Сомалија", + "sr-Latn": "Somalija", + "zh_TW": "索馬利亞", + "tr": "Somali", + "ro": "Somalia", + "ar": "الصومال", + "fa": "سومالی", + "yue": "索馬里" + }, + flag: "🇸🇴", + code: "SO", + dialCode: "252", + minLength: 8, + maxLength: 8, + ), + Country( + name: "South Africa", + nameTranslations: { + "sk": "Južná Afrika", + "se": "Mátta-Afrihká", + "pl": "Republika Południowej Afryki", + "no": "Sør-Afrika", + "ja": "南アフリカ", + "it": "Sudafrica", + "zh": "南非", + "nl": "Zuid-Afrika", + "de": "Südafrika", + "fr": "Afrique du Sud", + "es": "Sudáfrica", + "en": "South Africa", + "pt_BR": "África do Sul", + "sr-Cyrl": "Јужноафричка Република", + "sr-Latn": "Južnoafrička Republika", + "zh_TW": "南非", + "tr": "Güney Afrika", + "ro": "Africa de Sud", + "ar": "جنوب أفريقيا", + "fa": "آفریقای جنوبی", + "yue": "南非" + }, + flag: "🇿🇦", + code: "ZA", + dialCode: "27", + minLength: 9, + maxLength: 9, + ), + Country( + name: "South Sudan", + nameTranslations: { + "sk": "Južný Sudán", + "se": "Máttasudan", + "pl": "Sudan Południowy", + "no": "Sør-Sudan", + "ja": "南スーダン", + "it": "Sud Sudan", + "zh": "南苏丹", + "nl": "Zuid-Soedan", + "de": "Südsudan", + "fr": "Soudan du Sud", + "es": "Sudán del Sur", + "en": "South Sudan", + "pt_BR": "Sudão do Sul", + "sr-Cyrl": "Јужни Судан", + "sr-Latn": "Južni Sudan", + "zh_TW": "南蘇丹", + "tr": "Güney Sudan", + "ro": "Sudanul de Sud", + "ar": "جنوب السودان", + "fa": "سودان جنوبی", + "yue": "南蘇丹" + }, + flag: "🇸🇸", + code: "SS", + dialCode: "211", + minLength: 9, + maxLength: 9, + ), + Country( + name: "South Georgia and the South Sandwich Islands", + nameTranslations: { + "sk": "Južná Georgia a Južné Sandwichove ostrovy", + "se": "Lulli Georgia ja Lulli Sandwich-sullot", + "pl": "Georgia Południowa i Sandwich Południowy", + "no": "Sør-Georgia og Sør-Sandwichøyene", + "ja": "サウスジョージア・サウスサンドウィッチ諸島", + "it": "Georgia del Sud e Sandwich australi", + "zh": "南乔治亚和南桑威奇群岛", + "nl": "Zuid-Georgia en Zuidelijke Sandwicheilanden", + "de": "Südgeorgien und die Südlichen Sandwichinseln", + "fr": "Géorgie du Sud et îles Sandwich du Sud", + "es": "Islas Georgia del Sur y Sandwich del Sur", + "en": "South Georgia & South Sandwich Islands", + "pt_BR": "Geórgia do Sul e Ilhas Sandwich do Sul", + "sr-Cyrl": "Јужна Џорџија и Јужна Сендвичка Острва", + "sr-Latn": "Južna Džordžija i Južna Sendvička Ostrva", + "zh_TW": "南喬治亞與南三明治群島 ", + "tr": "Güney Georgia ve Güney Sandwich Adaları", + "ro": "Georgia de Sud și Insulele Sandwich de Sud", + "ar": "جورجيا الجنوبية وجزر ساندويتش الجنوبية", + "fa": "جزایر جورجیای جنوبی و ساندویچ جنوبی", + "yue": "南喬治亞州同南桑威奇群島" + }, + flag: "🇬🇸", + code: "GS", + dialCode: "500", + minLength: 15, + maxLength: 15, + ), + Country( + name: "Spain", + nameTranslations: { + "sk": "Španielsko", + "se": "Spánia", + "pl": "Hiszpania", + "no": "Spania", + "ja": "スペイン", + "it": "Spagna", + "zh": "西班牙", + "nl": "Spanje", + "de": "Spanien", + "fr": "Espagne", + "es": "España", + "en": "Spain", + "pt_BR": "Espanha", + "sr-Cyrl": "Шпанија", + "sr-Latn": "Španija", + "zh_TW": "西班牙", + "tr": "İspanya", + "ro": "Spania", + "ar": "إسبانيا", + "fa": "اسپانیا", + "yue": "西班牙" + }, + flag: "🇪🇸", + code: "ES", + dialCode: "34", + minLength: 9, + maxLength: 9, + ), + Country( + name: "Sri Lanka", + nameTranslations: { + "sk": "Srí Lanka", + "se": "Sri Lanka", + "pl": "Sri Lanka", + "no": "Sri Lanka", + "ja": "スリランカ", + "it": "Sri Lanka", + "zh": "斯里兰卡", + "nl": "Sri Lanka", + "de": "Sri Lanka", + "fr": "Sri Lanka", + "es": "Sri Lanka", + "en": "Sri Lanka", + "pt_BR": "Sri Lanka", + "sr-Cyrl": "Шри Ланка", + "sr-Latn": "Šri Lanka", + "zh_TW": "斯里蘭卡", + "tr": "Sri Lanka", + "ro": "Sri Lanka", + "ar": "سريلانكا", + "fa": "سریلانکا", + "yue": "斯里蘭卡" + }, + flag: "🇱🇰", + code: "LK", + dialCode: "94", + minLength: 9, + maxLength: 9, + ), + Country( + name: "Sudan", + nameTranslations: { + "sk": "Sudán", + "se": "Davvisudan", + "pl": "Sudan", + "no": "Sudan", + "ja": "スーダン", + "it": "Sudan", + "zh": "苏丹", + "nl": "Soedan", + "de": "Sudan", + "fr": "Soudan", + "es": "Sudán", + "en": "Sudan", + "pt_BR": "Sudão", + "sr-Cyrl": "Судан", + "sr-Latn": "Sudan", + "zh_TW": "蘇丹", + "tr": "Sudan", + "ro": "Sudan", + "ar": "السودان", + "fa": "سودان", + "yue": "蘇丹" + }, + flag: "🇸🇩", + code: "SD", + dialCode: "249", + minLength: 9, + maxLength: 9, + ), + Country( + name: "Suriname", + nameTranslations: { + "sk": "Surinam", + "se": "Surinam", + "pl": "Surinam", + "no": "Surinam", + "ja": "スリナム", + "it": "Suriname", + "zh": "苏里南", + "nl": "Suriname", + "de": "Suriname", + "fr": "Suriname", + "es": "Surinam", + "en": "Suriname", + "pt_BR": "Suriname", + "sr-Cyrl": "Суринам", + "sr-Latn": "Surinam", + "zh_TW": "蘇利南", + "tr": "Surinam", + "ro": "Surinam", + "ar": "سورينام", + "fa": "سورینام", + "yue": "蘇里南" + }, + flag: "🇸🇷", + code: "SR", + dialCode: "597", + minLength: 7, + maxLength: 7, + ), + Country( + name: "Svalbard and Jan Mayen", + nameTranslations: { + "sk": "Svalbard a Jan Mayen", + "se": "Svalbárda ja Jan Mayen", + "pl": "Svalbard i Jan Mayen", + "no": "Svalbard og Jan Mayen", + "ja": "スバールバル諸島・ヤンマイエン島", + "it": "Svalbard e Jan Mayen", + "zh": "斯瓦尔巴和扬马延", + "nl": "Spitsbergen en Jan Mayen", + "de": "Spitzbergen und Jan Mayen", + "fr": "Svalbard et Jan Mayen", + "es": "Svalbard y Jan Mayen", + "en": "Svalbard & Jan Mayen", + "pt_BR": "Svalbard e Jan Mayen", + "sr-Cyrl": "Свалбард", + "sr-Latn": "Svalbard", + "zh_TW": "斯瓦巴及尖棉", + "tr": "Svalbard ve Jan Mayen", + "ro": "Svalbard și Jan Mayen", + "ar": "سفالبارد ويان ماين", + "fa": "سوالبارد و یان ماین", + "yue": "斯瓦尔巴德同扬·马延" + }, + flag: "🇸🇯", + code: "SJ", + dialCode: "47", + minLength: 8, + maxLength: 8, + ), + Country( + name: "Eswatini", + nameTranslations: { + "sk": "Eswatini", + "se": "Svazieana", + "pl": "Eswatini", + "no": "Eswatini", + "ja": "エスワティニ", + "it": "Swaziland", + "zh": "斯威士兰", + "nl": "eSwatini", + "de": "Eswatini", + "fr": "Eswatini", + "es": "Esuatini", + "en": "Eswatini", + "pt_BR": "Eswatini", + "sr-Cyrl": "Свазиланд", + "sr-Latn": "Svaziland", + "zh_TW": "史瓦帝尼", + "tr": "Esvatini", + "ro": "Eswatini", + "ar": "إسواتيني", + "fa": "اسواتینی", + "yue": "斯威士蘭" + }, + flag: "🇸🇿", + code: "SZ", + dialCode: "268", + minLength: 8, + maxLength: 8, + ), + Country( + name: "Sweden", + nameTranslations: { + "sk": "Švédsko", + "se": "Ruoŧŧa", + "pl": "Szwecja", + "no": "Sverige", + "ja": "スウェーデン", + "it": "Svezia", + "zh": "瑞典", + "nl": "Zweden", + "de": "Schweden", + "fr": "Suède", + "es": "Suecia", + "en": "Sweden", + "pt_BR": "Suécia", + "sr-Cyrl": "Шведска", + "sr-Latn": "Švedska", + "zh_TW": "瑞典", + "tr": "İsveç", + "ro": "Suedia", + "ar": "السويد", + "fa": "سوئد", + "yue": "瑞典" + }, + flag: "🇸🇪", + code: "SE", + dialCode: "46", + minLength: 7, + maxLength: 13, + ), + Country( + name: "Switzerland", + nameTranslations: { + "sk": "Švajčiarsko", + "se": "Šveica", + "pl": "Szwajcaria", + "no": "Sveits", + "ja": "スイス", + "it": "Svizzera", + "zh": "瑞士", + "nl": "Zwitserland", + "de": "Schweiz", + "fr": "Suisse", + "es": "Suiza", + "en": "Switzerland", + "pt_BR": "Suíça", + "sr-Cyrl": "Швајцарска", + "sr-Latn": "Švajcarska", + "zh_TW": "瑞士", + "tr": "İsviçre", + "ro": "Elveţia", + "ar": "سويسرا", + "fa": "سوئیس", + "yue": "瑞士" + }, + flag: "🇨🇭", + code: "CH", + dialCode: "41", + minLength: 9, + maxLength: 12, + ), + Country( + name: "Syrian Arab Republic", + nameTranslations: { + "sk": "Sýria", + "se": "Syria", + "pl": "Syria", + "no": "Syria", + "ja": "シリア", + "it": "Siria", + "zh": "叙利亚", + "nl": "Syrië", + "de": "Syrien", + "fr": "Syrie", + "es": "Siria", + "en": "Syria", + "pt_BR": "Síria", + "sr-Cyrl": "Сирија", + "sr-Latn": "Sirija", + "zh_TW": "敘利亞", + "tr": "Suriye", + "ro": "Siria", + "ar": "سوريا", + "fa": "سوریه", + "yue": "阿拉伯敘利亞共和國" + }, + flag: "🇸🇾", + code: "SY", + dialCode: "963", + minLength: 9, + maxLength: 10, + ), + Country( + name: "Taiwan", + nameTranslations: { + "sk": "Taiwan", + "se": "Taiwan", + "pl": "Tajwan", + "no": "Taiwan", + "ja": "台湾", + "it": "Taiwan", + "zh": "台湾", + "nl": "Taiwan", + "de": "Taiwan", + "fr": "Taïwan", + "es": "Taiwán", + "en": "Taiwan", + "pt_BR": "Taiwan", + "sr-Cyrl": "Тајван", + "sr-Latn": "Tajvan", + "zh_TW": "台灣", + "tr": "Tayvan", + "ro": "Taiwan", + "ar": "تايوان", + "fa": "تایوان", + "yue": "台灣" + }, + flag: "🇹🇼", + code: "TW", + dialCode: "886", + minLength: 9, + maxLength: 9, + ), + Country( + name: "Tajikistan", + nameTranslations: { + "sk": "Tadžikistan", + "se": "Tažikistan", + "pl": "Tadżykistan", + "no": "Tadsjikistan", + "ja": "タジキスタン", + "it": "Tagikistan", + "zh": "塔吉克斯坦", + "nl": "Tadzjikistan", + "de": "Tadschikistan", + "fr": "Tadjikistan", + "es": "Tayikistán", + "en": "Tajikistan", + "pt_BR": "Tajiquistão", + "sr-Cyrl": "Таџикистан", + "sr-Latn": "Tadžikistan", + "zh_TW": "塔吉克", + "tr": "Tacikistan", + "ro": "Tadiquistão", + "ar": "طاجيكستان", + "fa": "تاجیکستان", + "yue": "塔吉克斯坦" + }, + flag: "🇹🇯", + code: "TJ", + dialCode: "992", + minLength: 9, + maxLength: 9, + ), + Country( + name: "Tanzania, United Republic of Tanzania", + nameTranslations: { + "sk": "Tanzánia", + "se": "Tanzánia", + "pl": "Tanzania", + "no": "Tanzania", + "ja": "タンザニア", + "it": "Tanzania", + "zh": "坦桑尼亚", + "nl": "Tanzania", + "de": "Tansania", + "fr": "Tanzanie", + "es": "Tanzania", + "en": "Tanzania", + "pt_BR": "Tanzânia", + "sr-Cyrl": "Танзанија", + "sr-Latn": "Tanzanija", + "zh_TW": "坦尚尼亞", + "tr": "Tanzanya", + "ro": "Tanzania", + "ar": "تنزانيا", + "fa": "تانزانیا", + "yue": "坦桑尼亞,聯合共和國" + }, + flag: "🇹🇿", + code: "TZ", + dialCode: "255", + minLength: 9, + maxLength: 9, + ), + Country( + name: "Thailand", + nameTranslations: { + "sk": "Thajsko", + "se": "Thaieana", + "pl": "Tajlandia", + "no": "Thailand", + "ja": "タイ", + "it": "Thailandia", + "zh": "泰国", + "nl": "Thailand", + "de": "Thailand", + "fr": "Thaïlande", + "es": "Tailandia", + "en": "Thailand", + "pt_BR": "Tailândia", + "sr-Cyrl": "Тајланд", + "sr-Latn": "Tajland", + "zh_TW": "泰國", + "tr": "Tayland", + "ro": "Tailanda", + "ar": "تايلاند", + "fa": "تایلند", + "yue": "泰國" + }, + flag: "🇹🇭", + code: "TH", + dialCode: "66", + minLength: 9, + maxLength: 9, + ), + Country( + name: "Timor-Leste", + nameTranslations: { + "sk": "Východný Timor", + "se": "Nuorta-Timor", + "pl": "Timor Wschodni", + "no": "Øst-Timor", + "ja": "東ティモール", + "it": "Timor Est", + "zh": "东帝汶", + "nl": "Oost-Timor", + "de": "Timor-Leste", + "fr": "Timor oriental", + "es": "Timor-Leste", + "en": "Timor-Leste", + "pt_BR": "Timor-Leste", + "sr-Cyrl": "Источни Тимор", + "sr-Latn": "Istočni Timor", + "zh_TW": "東帝汶", + "tr": "Doğu Timor", + "ro": "Timorul de Est", + "ar": "تيمور الشرقية", + "fa": "تیمور شرقی", + "yue": "東帝汶" + }, + flag: "🇹🇱", + code: "TL", + dialCode: "670", + minLength: 7, + maxLength: 7, + ), + Country( + name: "Togo", + nameTranslations: { + "sk": "Togo", + "se": "Togo", + "pl": "Togo", + "no": "Togo", + "ja": "トーゴ", + "it": "Togo", + "zh": "多哥", + "nl": "Togo", + "de": "Togo", + "fr": "Togo", + "es": "Togo", + "en": "Togo", + "pt_BR": "Ir", + "sr-Cyrl": "Того", + "sr-Latn": "Togo", + "zh_TW": "多哥", + "tr": "Togo", + "ro": "Togo", + "ar": "توغو", + "fa": "توگو", + "yue": "多哥" + }, + flag: "🇹🇬", + code: "TG", + dialCode: "228", + minLength: 8, + maxLength: 8, + ), + Country( + name: "Tokelau", + nameTranslations: { + "sk": "Tokelau", + "se": "Tokelau", + "pl": "Tokelau", + "no": "Tokelau", + "ja": "トケラウ", + "it": "Tokelau", + "zh": "托克劳", + "nl": "Tokelau", + "de": "Tokelau", + "fr": "Tokelau", + "es": "Tokelau", + "en": "Tokelau", + "pt_BR": "Tokelau", + "sr-Cyrl": "Токелау", + "sr-Latn": "Tokelau", + "zh_TW": "托克勞", + "tr": "Tokelau", + "ro": "Tokelau", + "ar": "توكيلاو", + "fa": "توکلائو", + "yue": "托克劳" + }, + flag: "🇹🇰", + code: "TK", + dialCode: "690", + minLength: 4, + maxLength: 4, + ), + Country( + name: "Tonga", + nameTranslations: { + "sk": "Tonga", + "se": "Tonga", + "pl": "Tonga", + "no": "Tonga", + "ja": "トンガ", + "it": "Tonga", + "zh": "汤加", + "nl": "Tonga", + "de": "Tonga", + "fr": "Tonga", + "es": "Tonga", + "en": "Tonga", + "pt_BR": "Tonga", + "sr-Cyrl": "Тонга", + "sr-Latn": "Tonga", + "zh_TW": "東加", + "tr": "Tonga", + "ro": "Tonga", + "ar": "تونغا", + "fa": "تونگا", + "yue": "湯加" + }, + flag: "🇹🇴", + code: "TO", + dialCode: "676", + minLength: 7, + maxLength: 7, + ), + Country( + name: "Trinidad and Tobago", + nameTranslations: { + "sk": "Trinidad a Tobago", + "se": "Trinidad ja Tobago", + "pl": "Trynidad i Tobago", + "no": "Trinidad og Tobago", + "ja": "トリニダード・トバゴ", + "it": "Trinidad e Tobago", + "zh": "特立尼达和多巴哥", + "nl": "Trinidad en Tobago", + "de": "Trinidad und Tobago", + "fr": "Trinité-et-Tobago", + "es": "Trinidad y Tobago", + "en": "Trinidad & Tobago", + "pt_BR": "Trinidad e Tobago", + "sr-Cyrl": "Тринидад и Тобаго", + "sr-Latn": "Trinidad i Tobago", + "zh_TW": "千里達及托巴哥", + "tr": "Trinidad ve Tobago", + "ro": "Trinidad şi Tobago", + "ar": "ترينيداد وتوباغو", + "fa": "ترینیداد و توباگو", + "yue": "特立尼達和多巴哥" + }, + flag: "🇹🇹", + code: "TT", + dialCode: "1868", + minLength: 7, + maxLength: 7, + ), + Country( + name: "Tunisia", + nameTranslations: { + "sk": "Tunisko", + "se": "Tunisia", + "pl": "Tunezja", + "no": "Tunisia", + "ja": "チュニジア", + "it": "Tunisia", + "zh": "突尼斯", + "nl": "Tunesië", + "de": "Tunesien", + "fr": "Tunisie", + "es": "Túnez", + "en": "Tunisia", + "pt_BR": "Tunísia", + "sr-Cyrl": "Тунис", + "sr-Latn": "Tunis", + "zh_TW": "突尼西亞", + "tr": "Tunus", + "ro": "Tunisia", + "ar": "تونس", + "fa": "تونس", + "yue": "突尼斯" + }, + flag: "🇹🇳", + code: "TN", + dialCode: "216", + minLength: 8, + maxLength: 8, + ), + Country( + name: "Turkey", + nameTranslations: { + "sk": "Turecko", + "se": "Durka", + "pl": "Turcja", + "no": "Tyrkia", + "ja": "トルコ", + "it": "Turchia", + "zh": "土耳其", + "nl": "Turkije", + "de": "Türkei", + "fr": "Turquie", + "es": "Turquía", + "en": "Turkey", + "pt_BR": "Peru", + "sr-Cyrl": "Турска", + "sr-Latn": "Turska", + "zh_TW": "土耳其", + "tr": "Türkiye", + "ro": "Turcia", + "ar": "تركيا", + "fa": "ترکیه", + "yue": "土耳其" + }, + flag: "🇹🇷", + code: "TR", + dialCode: "90", + minLength: 10, + maxLength: 10, + ), + Country( + name: "Turkmenistan", + nameTranslations: { + "sk": "Turkménsko", + "se": "Turkmenistan", + "pl": "Turkmenistan", + "no": "Turkmenistan", + "ja": "トルクメニスタン", + "it": "Turkmenistan", + "zh": "土库曼斯坦", + "nl": "Turkmenistan", + "de": "Turkmenistan", + "fr": "Turkménistan", + "es": "Turkmenistán", + "en": "Turkmenistan", + "pt_BR": "Turcomenistão", + "sr-Cyrl": "Туркменистан", + "sr-Latn": "Turkmenistan", + "zh_TW": "土庫曼", + "tr": "Türkmenistan", + "ro": "Turkmenistan", + "ar": "تركمانستان", + "fa": "ترکمنستان", + "yue": "土庫曼斯坦" + }, + flag: "🇹🇲", + code: "TM", + dialCode: "993", + minLength: 8, + maxLength: 8, + ), + Country( + name: "Turks and Caicos Islands", + nameTranslations: { + "sk": "Turks a Caicos", + "se": "Turks ja Caicos-sullot", + "pl": "Turks i Caicos", + "no": "Turks- og Caicosøyene", + "ja": "タークス・カイコス諸島", + "it": "Isole Turks e Caicos", + "zh": "特克斯和凯科斯群岛", + "nl": "Turks- en Caicoseilanden", + "de": "Turks- und Caicosinseln", + "fr": "Îles Turques-et-Caïques", + "es": "Islas Turcas y Caicos", + "en": "Turks & Caicos Islands", + "pt_BR": "Ilhas Turks e Caicos", + "sr-Cyrl": "Туркс и Кајкос", + "sr-Latn": "Turks i Kajkos", + "zh_TW": "土克斯及開科斯群島", + "tr": "Turks ve Caicos Adaları", + "ro": "Insulele Turks și Caicos", + "ar": "جزر توركس وكايكوس", + "fa": "جزایر تورکس و کایکوس", + "yue": "特克斯同凯科斯群岛" + }, + flag: "🇹🇨", + code: "TC", + dialCode: "1649", + minLength: 7, + maxLength: 7, + ), + Country( + name: "Tuvalu", + nameTranslations: { + "sk": "Tuvalu", + "se": "Tuvalu", + "pl": "Tuvalu", + "no": "Tuvalu", + "ja": "ツバル", + "it": "Tuvalu", + "zh": "图瓦卢", + "nl": "Tuvalu", + "de": "Tuvalu", + "fr": "Tuvalu", + "es": "Tuvalu", + "en": "Tuvalu", + "pt_BR": "Tuvalu", + "sr-Cyrl": "Тувалу", + "sr-Latn": "Tuvalu", + "zh_TW": "圖瓦盧", + "tr": "Tuvalu", + "ro": "Tuvalu", + "ar": "توفالو", + "fa": "تووالو", + "yue": "圖瓦盧" + }, + flag: "🇹🇻", + code: "TV", + dialCode: "688", + minLength: 6, + maxLength: 6, + ), + Country( + name: "Uganda", + nameTranslations: { + "sk": "Uganda", + "se": "Uganda", + "pl": "Uganda", + "no": "Uganda", + "ja": "ウガンダ", + "it": "Uganda", + "zh": "乌干达", + "nl": "Oeganda", + "de": "Uganda", + "fr": "Ouganda", + "es": "Uganda", + "en": "Uganda", + "pt_BR": "Uganda", + "sr-Cyrl": "Уганда", + "sr-Latn": "Uganda", + "zh_TW": "烏干達", + "tr": "Uganda", + "ro": "Uganda", + "ar": "أوغندا", + "fa": "اوگاندا", + "yue": "烏干達" + }, + flag: "🇺🇬", + code: "UG", + dialCode: "256", + minLength: 9, + maxLength: 9, + ), + Country( + name: "Ukraine", + nameTranslations: { + "sk": "Ukrajina", + "se": "Ukraina", + "pl": "Ukraina", + "no": "Ukraina", + "ja": "ウクライナ", + "it": "Ucraina", + "zh": "乌克兰", + "nl": "Oekraïne", + "de": "Ukraine", + "fr": "Ukraine", + "es": "Ucrania", + "en": "Ukraine", + "pt_BR": "Ucrânia", + "sr-Cyrl": "Украјина", + "sr-Latn": "Ukrajina", + "zh_TW": "烏克蘭", + "tr": "Ukrayna", + "ro": "Ucraína", + "ar": "أوكرانيا", + "fa": "اوکراین", + "yue": "烏克蘭" + }, + flag: "🇺🇦", + code: "UA", + dialCode: "380", + minLength: 9, + maxLength: 9, + ), + Country( + name: "United Arab Emirates", + nameTranslations: { + "sk": "Spojené arabské emiráty", + "se": "Ovttastuvvan Arábaemiráhtat", + "pl": "Zjednoczone Emiraty Arabskie", + "no": "De forente arabiske emirater", + "ja": "アラブ首長国連邦", + "it": "Emirati Arabi Uniti", + "zh": "阿拉伯联合酋长国", + "nl": "Verenigde Arabische Emiraten", + "de": "Vereinigte Arabische Emirate", + "fr": "Émirats arabes unis", + "es": "Emiratos Árabes Unidos", + "en": "United Arab Emirates", + "pt_BR": "Emirados Árabes Unidos", + "sr-Cyrl": "Уједињени Арапски Емирати", + "sr-Latn": "Ujedinjeni Arapski Emirati", + "zh_TW": "阿拉伯聯合大公國", + "tr": "Birleşik Arap Emirlikleri", + "ro": "Emiratele Arabe Unite", + "ar": "الإمارات العربية المتحدة", + "fa": "امارات متحده عربی", + "yue": "阿拉伯聯合酋長國" + }, + flag: "🇦🇪", + code: "AE", + dialCode: "971", + minLength: 9, + maxLength: 9, + ), + Country( + name: "United Kingdom", + nameTranslations: { + "sk": "Spojené kráľovstvo", + "se": "Stuorra-Británnia", + "pl": "Wielka Brytania", + "no": "Storbritannia", + "ja": "イギリス", + "it": "Regno Unito", + "zh": "英国", + "nl": "Verenigd Koninkrijk", + "de": "Vereinigtes Königreich", + "fr": "Royaume-Uni", + "es": "Reino Unido", + "en": "United Kingdom", + "pt_BR": "Reino Unido", + "sr-Cyrl": "Уједињено Краљевство", + "sr-Latn": "Ujedinjeno Kraljevstvo", + "zh_TW": "英國", + "tr": "Büyük Britanya ve Kuzey İrlanda Birleşik Krallığ", + "ro": "Regatul Unit al Marii Britanii și Irlandei de Nord", + "ar": "المملكة المتحدة", + "fa": "بریتانیا", + "yue": "大不列顛及北愛爾蘭聯合王國" + }, + flag: "🇬🇧", + code: "GB", + dialCode: "44", + minLength: 10, + maxLength: 10, + ), + Country( + name: "United States", + nameTranslations: { + "sk": "Spojené štáty", + "se": "Amerihká ovttastuvvan stáhtat", + "pl": "Stany Zjednoczone", + "no": "USA", + "ja": "アメリカ合衆国", + "it": "Stati Uniti", + "zh": "美国", + "nl": "Verenigde Staten", + "de": "Vereinigte Staaten", + "fr": "États-Unis", + "es": "Estados Unidos", + "en": "United States", + "pt_BR": "Estados Unidos", + "sr-Cyrl": "Сједињене Америчке Државе", + "sr-Latn": "Sjedinjene Američke Države", + "zh_TW": "美國", + "tr": "Amerika Birleşik Devletleri", + "ro": "Statele Unite ale Americii", + "ar": "الولايات المتحدة", + "fa": "ایالات متحده آمریکا", + "yue": "美利堅郃眾囯" + }, + flag: "🇺🇸", + code: "US", + dialCode: "1", + minLength: 10, + maxLength: 10, + ), + Country( + name: "Uruguay", + nameTranslations: { + "sk": "Uruguaj", + "se": "Uruguay", + "pl": "Urugwaj", + "no": "Uruguay", + "ja": "ウルグアイ", + "it": "Uruguay", + "zh": "乌拉圭", + "nl": "Uruguay", + "de": "Uruguay", + "fr": "Uruguay", + "es": "Uruguay", + "en": "Uruguay", + "pt_BR": "Uruguai", + "sr-Cyrl": "Уругвај", + "sr-Latn": "Urugvaj", + "zh_TW": "烏拉圭", + "tr": "Uruguay", + "ro": "Uruguay", + "ar": "الأوروغواي", + "fa": "اروگوئه", + "yue": "烏拉圭" + }, + flag: "🇺🇾", + code: "UY", + dialCode: "598", + minLength: 9, + maxLength: 9, + ), + Country( + name: "Uzbekistan", + nameTranslations: { + "sk": "Uzbekistan", + "se": "Usbekistan", + "pl": "Uzbekistan", + "no": "Usbekistan", + "ja": "ウズベキスタン", + "it": "Uzbekistan", + "zh": "乌兹别克斯坦", + "nl": "Oezbekistan", + "de": "Usbekistan", + "fr": "Ouzbékistan", + "es": "Uzbekistán", + "en": "Uzbekistan", + "pt_BR": "Uzbequistão", + "sr-Cyrl": "Узбекистан", + "sr-Latn": "Uzbekistan", + "zh_TW": "烏玆別克", + "tr": "Özbekistan", + "ro": "Uzbekistan", + "ar": "أوزبكستان", + "fa": "ازبکستان", + "yue": "月即別" + }, + flag: "🇺🇿", + code: "UZ", + dialCode: "998", + minLength: 9, + maxLength: 9, + ), + Country( + name: "Vanuatu", + nameTranslations: { + "sk": "Vanuatu", + "se": "Vanuatu", + "pl": "Vanuatu", + "no": "Vanuatu", + "ja": "バヌアツ", + "it": "Vanuatu", + "zh": "瓦努阿图", + "nl": "Vanuatu", + "de": "Vanuatu", + "fr": "Vanuatu", + "es": "Vanuatu", + "en": "Vanuatu", + "pt_BR": "Vanuatu", + "sr-Cyrl": "Вануату", + "sr-Latn": "Vanuatu", + "zh_TW": "瓦努阿圖", + "tr": "Vanuatu", + "ro": "Vanuatu", + "ar": "فانواتو", + "fa": "وانواتو", + "yue": "瓦努阿圖" + }, + flag: "🇻🇺", + code: "VU", + dialCode: "678", + minLength: 7, + maxLength: 7, + ), + Country( + name: "Venezuela, Bolivarian Republic of Venezuela", + nameTranslations: { + "sk": "Venezuela", + "se": "Venezuela", + "pl": "Wenezuela", + "no": "Venezuela", + "ja": "ベネズエラ", + "it": "Venezuela", + "zh": "委内瑞拉", + "nl": "Venezuela", + "de": "Venezuela", + "fr": "Venezuela", + "es": "Venezuela", + "en": "Venezuela", + "pt_BR": "Venezuela", + "sr-Cyrl": "Венецуела", + "sr-Latn": "Venecuela", + "zh_TW": "委內瑞拉", + "tr": "Venezuela", + "ro": "Venezuela", + "ar": "فنزويلا", + "fa": "ونزوئلا", + "yue": "委內瑞拉(玻利瓦爾共和國)" + }, + flag: "🇻🇪", + code: "VE", + dialCode: "58", + minLength: 10, + maxLength: 10, + ), + Country( + name: "Vietnam", + nameTranslations: { + "sk": "Vietnam", + "se": "Vietnam", + "pl": "Wietnam", + "no": "Vietnam", + "ja": "ベトナム", + "it": "Vietnam", + "zh": "越南", + "nl": "Vietnam", + "de": "Vietnam", + "fr": "Vietnam", + "es": "Vietnam", + "en": "Vietnam", + "pt_BR": "Vietnã", + "sr-Cyrl": "Вијетнам", + "sr-Latn": "Vijetnam", + "zh_TW": "越南", + "tr": "Vietnam", + "ro": "Vietnam", + "ar": "فيتنام", + "fa": "ویتنام", + "yue": "越南" + }, + flag: "🇻🇳", + code: "VN", + dialCode: "84", + minLength: 11, + maxLength: 11, + ), + Country( + name: "Virgin Islands, British", + nameTranslations: { + "sk": "Britské Panenské ostrovy", + "se": "Brittania Virgin-sullot", + "pl": "Brytyjskie Wyspy Dziewicze", + "no": "De britiske jomfruøyene", + "ja": "英領ヴァージン諸島", + "it": "Isole Vergini Britanniche", + "zh": "英属维尔京群岛", + "nl": "Britse Maagdeneilanden", + "de": "Britische Jungferninseln", + "fr": "Îles Vierges britanniques", + "es": "Islas Vírgenes Británicas", + "en": "British Virgin Islands", + "pt_BR": "Ilhas Virgens Britânicas", + "sr-Cyrl": "Британска Девичанска Острва", + "sr-Latn": "Britanska Devičanska Ostrva", + "zh_TW": "英屬維京群島", + "tr": "Britanya Virjin Adaları", + "ro": "Insulele Virgine Britanice", + "ar": "جزر العذراء البريطانية", + "fa": "جزایر ویرجین بریتانیا", + "yue": "維爾京群島(英國)" + }, + flag: "🇻🇬", + code: "VG", + dialCode: "1284", + minLength: 7, + maxLength: 7, + ), + Country( + name: "Virgin Islands, U.S.", + nameTranslations: { + "sk": "Americké Panenské ostrovy", + "se": "AOS Virgin-sullot", + "pl": "Wyspy Dziewicze Stanów Zjednoczonych", + "no": "De amerikanske jomfruøyene", + "ja": "米領ヴァージン諸島", + "it": "Isole Vergini Americane", + "zh": "美属维尔京群岛", + "nl": "Amerikaanse Maagdeneilanden", + "de": "Amerikanische Jungferninseln", + "fr": "Îles Vierges des États-Unis", + "es": "Islas Vírgenes de EE. UU.", + "en": "U.S. Virgin Islands", + "pt_BR": "Ilhas Virgens Americanas", + "sr-Cyrl": "Амепичка Девичанска Острва", + "sr-Latn": "Američka Devičanska Ostrva", + "zh_TW": "美屬維京群島", + "tr": "Amerika Birleşik Devletleri Virjin Adaları", + "ro": "Insulele Virgine Americane", + "ar": "جزر العذراء الأمريكية", + "fa": "جزایر ویرجین ایالات متحده آمریکا", + "yue": "維爾京群島(美國)" + }, + flag: "🇻🇮", + code: "VI", + dialCode: "1340", + minLength: 7, + maxLength: 7, + ), + Country( + name: "Wallis and Futuna", + nameTranslations: { + "sk": "Wallis a Futuna", + "se": "Wallis ja Futuna", + "pl": "Wallis i Futuna", + "no": "Wallis og Futuna", + "ja": "ウォリス・フツナ", + "it": "Wallis e Futuna", + "zh": "瓦利斯和富图纳", + "nl": "Wallis en Futuna", + "de": "Wallis und Futuna", + "fr": "Wallis-et-Futuna", + "es": "Wallis y Futuna", + "en": "Wallis & Futuna", + "pt_BR": "Wallis e Futuna", + "sr-Cyrl": "Валис и Футуна", + "sr-Latn": "Valis i Futuna", + "zh_TW": "瓦利斯和富圖那", + "tr": "Wallis ve Futuna", + "ro": "Wallis și Futuna", + "ar": "والس وفوتونا", + "fa": "والیس و فوتونا", + "yue": "瓦利斯同富图纳" + }, + flag: "🇼🇫", + code: "WF", + dialCode: "681", + minLength: 6, + maxLength: 6, + ), + Country( + name: "Yemen", + nameTranslations: { + "sk": "Jemen", + "se": "Jemen", + "pl": "Jemen", + "no": "Jemen", + "ja": "イエメン", + "it": "Yemen", + "zh": "也门", + "nl": "Jemen", + "de": "Jemen", + "fr": "Yémen", + "es": "Yemen", + "en": "Yemen", + "pt_BR": "Iémen", + "sr-Cyrl": "Јемен", + "sr-Latn": "Jemen", + "zh_TW": "葉門", + "tr": "Yemen", + "ro": "Yemen", + "ar": "اليمن", + "fa": "یمن", + "yue": "也門" + }, + flag: "🇾🇪", + code: "YE", + dialCode: "967", + minLength: 9, + maxLength: 9, + ), + Country( + name: "Zambia", + nameTranslations: { + "sk": "Zambia", + "se": "Zambia", + "pl": "Zambia", + "no": "Zambia", + "ja": "ザンビア", + "it": "Zambia", + "zh": "赞比亚", + "nl": "Zambia", + "de": "Sambia", + "fr": "Zambie", + "es": "Zambia", + "en": "Zambia", + "pt_BR": "Zâmbia", + "sr-Cyrl": "Замбија", + "sr-Latn": "Zambija", + "zh_TW": "贊比亞", + "tr": "Zambiya", + "ro": "Zambia", + "ar": "زامبيا", + "fa": "زامبیا", + "yue": "贊比亞" + }, + flag: "🇿🇲", + code: "ZM", + dialCode: "260", + minLength: 9, + maxLength: 9, + ), + Country( + name: "Zimbabwe", + nameTranslations: { + "sk": "Zimbabwe", + "se": "Zimbabwe", + "pl": "Zimbabwe", + "no": "Zimbabwe", + "ja": "ジンバブエ", + "it": "Zimbabwe", + "zh": "津巴布韦", + "nl": "Zimbabwe", + "de": "Simbabwe", + "fr": "Zimbabwe", + "es": "Zimbabue", + "en": "Zimbabwe", + "pt_BR": "Zimbábue", + "sr-Cyrl": "Зимбабве", + "sr-Latn": "Zimbabve", + "zh_TW": "辛巴威", + "tr": "Zimbabve", + "ro": "Zimbabwe", + "ar": "زيمبابوي", + "fa": "زیمبابوه", + "yue": "津巴布韋" + }, + flag: "🇿🇼", + code: "ZW", + dialCode: "263", + minLength: 9, + maxLength: 9) +]; + +class Country { + final String name; + final Map nameTranslations; + final String flag; + final String code; + final String dialCode; + final String regionCode; + final int minLength; + final int maxLength; + + const Country({ + required this.name, + required this.flag, + required this.code, + required this.dialCode, + required this.nameTranslations, + required this.minLength, + required this.maxLength, + this.regionCode = "", + }); + + String get fullCountryCode { + return dialCode + regionCode; + } + + String get displayCC { + if (regionCode != "") { + return "$dialCode $regionCode"; + } + return dialCode; + } + + String localizedName(String languageCode) { + return nameTranslations[languageCode] ?? name; + } +} diff --git a/siro_rider/lib/controller/local/phone_intel/country_picker_dialog.dart b/siro_rider/lib/controller/local/phone_intel/country_picker_dialog.dart new file mode 100644 index 0000000..b12f001 --- /dev/null +++ b/siro_rider/lib/controller/local/phone_intel/country_picker_dialog.dart @@ -0,0 +1,168 @@ +import 'package:siro_rider/controller/local/phone_intel/helpers.dart'; +import 'package:flutter/foundation.dart' show kIsWeb; +import 'package:flutter/material.dart'; + +import 'countries.dart'; + +class PickerDialogStyle { + final Color? backgroundColor; + + final TextStyle? countryCodeStyle; + + final TextStyle? countryNameStyle; + + final Widget? listTileDivider; + + final EdgeInsets? listTilePadding; + + final EdgeInsets? padding; + + final Color? searchFieldCursorColor; + + final InputDecoration? searchFieldInputDecoration; + + final EdgeInsets? searchFieldPadding; + + final double? width; + + PickerDialogStyle({ + this.backgroundColor, + this.countryCodeStyle, + this.countryNameStyle, + this.listTileDivider, + this.listTilePadding, + this.padding, + this.searchFieldCursorColor, + this.searchFieldInputDecoration, + this.searchFieldPadding, + this.width, + }); +} + +class CountryPickerDialog extends StatefulWidget { + final List countryList; + final Country selectedCountry; + final ValueChanged onCountryChanged; + final String searchText; + final List filteredCountries; + final PickerDialogStyle? style; + final String languageCode; + + const CountryPickerDialog({ + Key? key, + required this.searchText, + required this.languageCode, + required this.countryList, + required this.onCountryChanged, + required this.selectedCountry, + required this.filteredCountries, + this.style, + }) : super(key: key); + + @override + State createState() => _CountryPickerDialogState(); +} + +class _CountryPickerDialogState extends State { + late List _filteredCountries; + late Country _selectedCountry; + + @override + void initState() { + _selectedCountry = widget.selectedCountry; + _filteredCountries = widget.filteredCountries.toList() + ..sort( + (a, b) => a + .localizedName(widget.languageCode) + .compareTo(b.localizedName(widget.languageCode)), + ); + + super.initState(); + } + + @override + Widget build(BuildContext context) { + final mediaWidth = MediaQuery.of(context).size.width; + final width = widget.style?.width ?? mediaWidth; + const defaultHorizontalPadding = 40.0; + const defaultVerticalPadding = 24.0; + return Dialog( + insetPadding: EdgeInsets.symmetric( + vertical: defaultVerticalPadding, + horizontal: mediaWidth > (width + defaultHorizontalPadding * 2) + ? (mediaWidth - width) / 2 + : defaultHorizontalPadding), + backgroundColor: widget.style?.backgroundColor, + child: Container( + padding: widget.style?.padding ?? const EdgeInsets.all(10), + child: Column( + children: [ + Padding( + padding: + widget.style?.searchFieldPadding ?? const EdgeInsets.all(0), + child: TextField( + cursorColor: widget.style?.searchFieldCursorColor, + decoration: widget.style?.searchFieldInputDecoration ?? + InputDecoration( + suffixIcon: const Icon(Icons.search), + labelText: widget.searchText, + ), + onChanged: (value) { + _filteredCountries = widget.countryList.stringSearch(value) + ..sort( + (a, b) => a + .localizedName(widget.languageCode) + .compareTo(b.localizedName(widget.languageCode)), + ); + if (mounted) setState(() {}); + }, + ), + ), + const SizedBox(height: 20), + Expanded( + child: ListView.builder( + shrinkWrap: true, + itemCount: _filteredCountries.length, + itemBuilder: (ctx, index) => Column( + children: [ + ListTile( + leading: kIsWeb + ? Image.asset( + 'assets/flags/${_filteredCountries[index].code.toLowerCase()}.png', + package: 'intl_phone_field', + width: 32, + ) + : Text( + _filteredCountries[index].flag, + style: const TextStyle(fontSize: 18), + ), + contentPadding: widget.style?.listTilePadding, + title: Text( + _filteredCountries[index] + .localizedName(widget.languageCode), + style: widget.style?.countryNameStyle ?? + const TextStyle(fontWeight: FontWeight.w700), + ), + trailing: Text( + '+${_filteredCountries[index].dialCode}', + style: widget.style?.countryCodeStyle ?? + const TextStyle(fontWeight: FontWeight.w700), + ), + onTap: () { + _selectedCountry = _filteredCountries[index]; + widget.onCountryChanged(_selectedCountry); + Navigator.of(context).pop(); + }, + ), + widget.style?.listTileDivider ?? + const Divider(thickness: 1), + ], + ), + ), + ), + ], + ), + ), + ); + } +} diff --git a/siro_rider/lib/controller/local/phone_intel/helpers.dart b/siro_rider/lib/controller/local/phone_intel/helpers.dart new file mode 100644 index 0000000..c2b3957 --- /dev/null +++ b/siro_rider/lib/controller/local/phone_intel/helpers.dart @@ -0,0 +1,31 @@ +import 'countries.dart'; + +bool isNumeric(String s) => + s.isNotEmpty && int.tryParse(s.replaceAll("+", "")) != null; + +String removeDiacritics(String str) { + var withDia = + 'ÀÁÂÃÄÅàáâãäåÒÓÔÕÕÖØòóôõöøÈÉÊËèéêëðÇçÐÌÍÎÏìíîïÙÚÛÜùúûüÑñŠšŸÿýŽž'; + var withoutDia = + 'AAAAAAaaaaaaOOOOOOOooooooEEEEeeeeeCcDIIIIiiiiUUUUuuuuNnSsYyyZz'; + + for (int i = 0; i < withDia.length; i++) { + str = str.replaceAll(withDia[i], withoutDia[i]); + } + + return str; +} + +extension CountryExtensions on List { + List stringSearch(String search) { + search = removeDiacritics(search.toLowerCase()); + return where( + (country) => isNumeric(search) || search.startsWith("+") + ? country.dialCode.contains(search) + : removeDiacritics(country.name.replaceAll("+", "").toLowerCase()) + .contains(search) || + country.nameTranslations.values.any((element) => + removeDiacritics(element.toLowerCase()).contains(search)), + ).toList(); + } +} diff --git a/siro_rider/lib/controller/local/phone_intel/intl_phone_field.dart b/siro_rider/lib/controller/local/phone_intel/intl_phone_field.dart new file mode 100644 index 0000000..c2b11ae --- /dev/null +++ b/siro_rider/lib/controller/local/phone_intel/intl_phone_field.dart @@ -0,0 +1,522 @@ +library intl_phone_field; + +import 'package:siro_rider/print.dart'; +import 'dart:async'; +import 'package:flutter/foundation.dart' show kIsWeb; +import 'package:flutter/material.dart'; +import 'package:flutter/services.dart'; + +import './countries.dart'; +import './phone_number.dart'; +import 'country_picker_dialog.dart'; +import 'helpers.dart'; + +class IntlPhoneField extends StatefulWidget { + /// The TextFormField key. + final GlobalKey? formFieldKey; + + /// Whether to hide the text being edited (e.g., for passwords). + final bool obscureText; + + /// How the text should be aligned horizontally. + final TextAlign textAlign; + + /// How the text should be aligned vertically. + final TextAlignVertical? textAlignVertical; + final VoidCallback? onTap; + + /// {@macro flutter.widgets.editableText.readOnly} + final bool readOnly; + final FormFieldSetter? onSaved; + + /// {@macro flutter.widgets.editableText.onChanged} + /// + /// See also: + /// + /// * [inputFormatters], which are called before [onChanged] + /// runs and can validate and change ("format") the input value. + /// * [onEditingComplete], [onSubmitted], [onSelectionChanged]: + /// which are more specialized input change notifications. + final ValueChanged? onChanged; + + final ValueChanged? onCountryChanged; + + /// An optional method that validates an input. Returns an error string to display if the input is invalid, or null otherwise. + /// + /// A [PhoneNumber] is passed to the validator as argument. + /// The validator can handle asynchronous validation when declared as a [Future]. + /// Or run synchronously when declared as a [Function]. + /// + /// By default, the validator checks whether the input number length is between selected country's phone numbers min and max length. + /// If `disableLengthCheck` is not set to `true`, your validator returned value will be overwritten by the default validator. + /// But, if `disableLengthCheck` is set to `true`, your validator will have to check phone number length itself. + final FutureOr Function(PhoneNumber?)? validator; + + /// {@macro flutter.widgets.editableText.keyboardType} + final TextInputType keyboardType; + + /// Controls the text being edited. + /// + /// If null, this widget will create its own [TextEditingController]. + final TextEditingController? controller; + + /// Defines the keyboard focus for this widget. + /// + /// The [focusNode] is a long-lived object that's typically managed by a + /// [StatefulWidget] parent. See [FocusNode] for more information. + /// + /// To give the keyboard focus to this widget, provide a [focusNode] and then + /// use the current [FocusScope] to request the focus: + /// + /// ```dart + /// FocusScope.of(context).requestFocus(myFocusNode); + /// ``` + /// + /// This happens automatically when the widget is tapped. + /// + /// To be notified when the widget gains or loses the focus, add a listener + /// to the [focusNode]: + /// + /// ```dart + /// focusNode.addListener(() { Log.print(myFocusNode.hasFocus); }); + /// ``` + /// + /// If null, this widget will create its own [FocusNode]. + /// + /// ## Keyboard + /// + /// Requesting the focus will typically cause the keyboard to be shown + /// if it's not showing already. + /// + /// On Android, the user can hide the keyboard - without changing the focus - + /// with the system back button. They can restore the keyboard's visibility + /// by tapping on a text field. The user might hide the keyboard and + /// switch to a physical keyboard, or they might just need to get it + /// out of the way for a moment, to expose something it's + /// obscuring. In this case requesting the focus again will not + /// cause the focus to change, and will not make the keyboard visible. + /// + /// This widget builds an [EditableText] and will ensure that the keyboard is + /// showing when it is tapped by calling [EditableTextState.requestKeyboard()]. + final FocusNode? focusNode; + + /// {@macro flutter.widgets.editableText.onSubmitted} + /// + /// See also: + /// + /// * [EditableText.onSubmitted] for an example of how to handle moving to + /// the next/previous field when using [TextInputAction.next] and + /// [TextInputAction.previous] for [textInputAction]. + final void Function(String)? onSubmitted; + + /// If false the widget is "disabled": it ignores taps, the [TextFormField]'s + /// [decoration] is rendered in grey, + /// [decoration]'s [InputDecoration.counterText] is set to `""`, + /// and the drop down icon is hidden no matter [showDropdownIcon] value. + /// + /// If non-null this property overrides the [decoration]'s + /// [Decoration.enabled] property. + final bool enabled; + + /// The appearance of the keyboard. + /// + /// This setting is only honored on iOS devices. + /// + /// If unset, defaults to the brightness of [ThemeData.brightness]. + final Brightness? keyboardAppearance; + + /// Initial Value for the field. + /// This property can be used to pre-fill the field. + final String? initialValue; + + final String languageCode; + + /// 2 letter ISO Code or country dial code. + /// + /// ```dart + /// initialCountryCode: 'IN', // India + /// initialCountryCode: '+225', // Côte d'Ivoire + /// ``` + final String? initialCountryCode; + + /// List of Country to display see countries.dart for format + final List? countries; + + /// The decoration to show around the text field. + /// + /// By default, draws a horizontal line under the text field but can be + /// configured to show an icon, label, hint text, and error text. + /// + /// Specify null to remove the decoration entirely (including the + /// extra padding introduced by the decoration to save space for the labels). + final InputDecoration decoration; + + /// The style to use for the text being edited. + /// + /// This text style is also used as the base style for the [decoration]. + /// + /// If null, defaults to the `subtitle1` text style from the current [Theme]. + final TextStyle? style; + + /// Disable view Min/Max Length check + final bool disableLengthCheck; + + /// Won't work if [enabled] is set to `false`. + final bool showDropdownIcon; + + final BoxDecoration dropdownDecoration; + + /// The style use for the country dial code. + final TextStyle? dropdownTextStyle; + + /// {@macro flutter.widgets.editableText.inputFormatters} + final List? inputFormatters; + + /// The text that describes the search input field. + /// + /// When the input field is empty and unfocused, the label is displayed on top of the input field (i.e., at the same location on the screen where text may be entered in the input field). + /// When the input field receives focus (or if the field is non-empty), the label moves above (i.e., vertically adjacent to) the input field. + final String searchText; + + /// Position of an icon [leading, trailing] + final IconPosition dropdownIconPosition; + + /// Icon of the drop down button. + /// + /// Default is [Icon(Icons.arrow_drop_down)] + final Icon dropdownIcon; + + /// Whether this text field should focus itself if nothing else is already focused. + final bool autofocus; + + /// Autovalidate mode for text form field. + /// + /// If [AutovalidateMode.onUserInteraction], this FormField will only auto-validate after its content changes. + /// If [AutovalidateMode.always], it will auto-validate even without user interaction. + /// If [AutovalidateMode.disabled], auto-validation will be disabled. + /// + /// Defaults to [AutovalidateMode.onUserInteraction]. + final AutovalidateMode? autovalidateMode; + + /// Whether to show or hide country flag. + /// + /// Default value is `true`. + final bool showCountryFlag; + + /// Message to be displayed on autoValidate error + /// + /// Default value is `Invalid Mobile Number`. + final String? invalidNumberMessage; + + /// The color of the cursor. + final Color? cursorColor; + + /// How tall the cursor will be. + final double? cursorHeight; + + /// How rounded the corners of the cursor should be. + final Radius? cursorRadius; + + /// How thick the cursor will be. + final double cursorWidth; + + /// Whether to show cursor. + final bool? showCursor; + + /// The padding of the Flags Button. + /// + /// The amount of insets that are applied to the Flags Button. + /// + /// If unset, defaults to [EdgeInsets.zero]. + final EdgeInsetsGeometry flagsButtonPadding; + + /// The type of action button to use for the keyboard. + final TextInputAction? textInputAction; + + /// Optional set of styles to allow for customizing the country search + /// & pick dialog + final PickerDialogStyle? pickerDialogStyle; + + /// The margin of the country selector button. + /// + /// The amount of space to surround the country selector button. + /// + /// If unset, defaults to [EdgeInsets.zero]. + final EdgeInsets flagsButtonMargin; + + /// Enable the autofill hint for phone number. + final bool disableAutoFillHints; + + /// If null, default magnification configuration will be used. + final TextMagnifierConfiguration? magnifierConfiguration; + + const IntlPhoneField({ + Key? key, + this.formFieldKey, + this.initialCountryCode, + this.languageCode = 'en', + this.disableAutoFillHints = false, + this.obscureText = false, + this.textAlign = TextAlign.left, + this.textAlignVertical, + this.onTap, + this.readOnly = false, + this.initialValue, + this.keyboardType = TextInputType.phone, + this.controller, + this.focusNode, + this.decoration = const InputDecoration(), + this.style, + this.dropdownTextStyle, + this.onSubmitted, + this.validator, + this.onChanged, + this.countries, + this.onCountryChanged, + this.onSaved, + this.showDropdownIcon = true, + this.dropdownDecoration = const BoxDecoration(), + this.inputFormatters, + this.enabled = true, + this.keyboardAppearance, + @Deprecated('Use searchFieldInputDecoration of PickerDialogStyle instead') + this.searchText = 'Search country', + this.dropdownIconPosition = IconPosition.leading, + this.dropdownIcon = const Icon(Icons.arrow_drop_down), + this.autofocus = false, + this.textInputAction, + this.autovalidateMode = AutovalidateMode.onUserInteraction, + this.showCountryFlag = true, + this.cursorColor, + this.disableLengthCheck = false, + this.flagsButtonPadding = EdgeInsets.zero, + this.invalidNumberMessage = 'Invalid Mobile Number', + this.cursorHeight, + this.cursorRadius = Radius.zero, + this.cursorWidth = 2.0, + this.showCursor = true, + this.pickerDialogStyle, + this.flagsButtonMargin = EdgeInsets.zero, + this.magnifierConfiguration, + }) : super(key: key); + + @override + State createState() => _IntlPhoneFieldState(); +} + +class _IntlPhoneFieldState extends State { + late List _countryList; + late Country _selectedCountry; + late List filteredCountries; + late String number; + + String? validatorMessage; + + @override + void initState() { + super.initState(); + _countryList = widget.countries ?? countries; + filteredCountries = _countryList; + number = widget.initialValue ?? ''; + if (widget.initialCountryCode == null && number.startsWith('+')) { + number = number.substring(1); + // parse initial value + _selectedCountry = countries.firstWhere( + (country) => number.startsWith(country.fullCountryCode), + orElse: () => _countryList.first); + + // remove country code from the initial number value + number = number.replaceFirst( + RegExp("^${_selectedCountry.fullCountryCode}"), ""); + } else { + _selectedCountry = _countryList.firstWhere( + (item) => item.code == (widget.initialCountryCode ?? 'US'), + orElse: () => _countryList.first); + + // remove country code from the initial number value + if (number.startsWith('+')) { + number = number.replaceFirst( + RegExp("^\\+${_selectedCountry.fullCountryCode}"), ""); + } else { + number = number.replaceFirst( + RegExp("^${_selectedCountry.fullCountryCode}"), ""); + } + } + + if (widget.autovalidateMode == AutovalidateMode.always) { + final initialPhoneNumber = PhoneNumber( + countryISOCode: _selectedCountry.code, + countryCode: '+${_selectedCountry.dialCode}', + number: widget.initialValue ?? '', + ); + + final value = widget.validator?.call(initialPhoneNumber); + + if (value is String) { + validatorMessage = value; + } else { + (value as Future).then((msg) { + validatorMessage = msg; + }); + } + } + } + + Future _changeCountry() async { + filteredCountries = _countryList; + await showDialog( + context: context, + useRootNavigator: false, + builder: (context) => StatefulBuilder( + builder: (ctx, setState) => CountryPickerDialog( + languageCode: widget.languageCode.toLowerCase(), + style: widget.pickerDialogStyle, + filteredCountries: filteredCountries, + searchText: widget.searchText, + countryList: _countryList, + selectedCountry: _selectedCountry, + onCountryChanged: (Country country) { + _selectedCountry = country; + widget.onCountryChanged?.call(country); + setState(() {}); + }, + ), + ), + ); + if (mounted) setState(() {}); + } + + @override + Widget build(BuildContext context) { + return TextFormField( + key: widget.formFieldKey, + initialValue: (widget.controller == null) ? number : null, + autofillHints: widget.disableAutoFillHints + ? null + : [AutofillHints.telephoneNumberNational], + readOnly: widget.readOnly, + obscureText: widget.obscureText, + textAlign: widget.textAlign, + textAlignVertical: widget.textAlignVertical, + cursorColor: widget.cursorColor, + onTap: widget.onTap, + controller: widget.controller, + focusNode: widget.focusNode, + cursorHeight: widget.cursorHeight, + cursorRadius: widget.cursorRadius, + cursorWidth: widget.cursorWidth, + showCursor: widget.showCursor, + onFieldSubmitted: widget.onSubmitted, + magnifierConfiguration: widget.magnifierConfiguration, + decoration: widget.decoration.copyWith( + prefixIcon: _buildFlagsButton(), + counterText: !widget.enabled ? '' : null, + ), + style: widget.style, + onSaved: (value) { + widget.onSaved?.call( + PhoneNumber( + countryISOCode: _selectedCountry.code, + countryCode: + '+${_selectedCountry.dialCode}${_selectedCountry.regionCode}', + number: value!, + ), + ); + }, + onChanged: (value) async { + final phoneNumber = PhoneNumber( + countryISOCode: _selectedCountry.code, + countryCode: '+${_selectedCountry.fullCountryCode}', + number: value, + ); + + if (widget.autovalidateMode != AutovalidateMode.disabled) { + validatorMessage = await widget.validator?.call(phoneNumber); + } + + widget.onChanged?.call(phoneNumber); + }, + validator: (value) { + if (value == null || !isNumeric(value)) return validatorMessage; + if (!widget.disableLengthCheck) { + return value.length >= _selectedCountry.minLength && + value.length <= _selectedCountry.maxLength + ? null + : widget.invalidNumberMessage; + } + + return validatorMessage; + }, + maxLength: widget.disableLengthCheck ? null : _selectedCountry.maxLength, + keyboardType: widget.keyboardType, + inputFormatters: widget.inputFormatters, + enabled: widget.enabled, + keyboardAppearance: widget.keyboardAppearance, + autofocus: widget.autofocus, + textInputAction: widget.textInputAction, + autovalidateMode: widget.autovalidateMode, + ); + } + + Container _buildFlagsButton() { + return Container( + margin: widget.flagsButtonMargin, + child: DecoratedBox( + decoration: widget.dropdownDecoration, + child: InkWell( + borderRadius: widget.dropdownDecoration.borderRadius as BorderRadius?, + onTap: widget.enabled ? _changeCountry : null, + child: Padding( + padding: widget.flagsButtonPadding, + child: Row( + mainAxisSize: MainAxisSize.min, + mainAxisAlignment: MainAxisAlignment.center, + children: [ + const SizedBox( + width: 4, + ), + if (widget.enabled && + widget.showDropdownIcon && + widget.dropdownIconPosition == IconPosition.leading) ...[ + widget.dropdownIcon, + const SizedBox(width: 4), + ], + if (widget.showCountryFlag) ...[ + kIsWeb + ? Image.asset( + 'assets/flags/${_selectedCountry.code.toLowerCase()}.png', + package: 'intl_phone_field', + width: 32, + ) + : Text( + _selectedCountry.flag, + style: const TextStyle(fontSize: 18), + ), + const SizedBox(width: 8), + ], + FittedBox( + child: Text( + '+${_selectedCountry.dialCode}', + style: widget.dropdownTextStyle, + ), + ), + if (widget.enabled && + widget.showDropdownIcon && + widget.dropdownIconPosition == IconPosition.trailing) ...[ + const SizedBox(width: 4), + widget.dropdownIcon, + ], + const SizedBox(width: 8), + ], + ), + ), + ), + ), + ); + } +} + +enum IconPosition { + leading, + trailing, +} \ No newline at end of file diff --git a/siro_rider/lib/controller/local/phone_intel/phone_number.dart b/siro_rider/lib/controller/local/phone_intel/phone_number.dart new file mode 100644 index 0000000..912cb07 --- /dev/null +++ b/siro_rider/lib/controller/local/phone_intel/phone_number.dart @@ -0,0 +1,79 @@ +import 'countries.dart'; + +class NumberTooLongException implements Exception {} + +class NumberTooShortException implements Exception {} + +class InvalidCharactersException implements Exception {} + +class PhoneNumber { + String countryISOCode; + String countryCode; + String number; + + PhoneNumber({ + required this.countryISOCode, + required this.countryCode, + required this.number, + }); + + factory PhoneNumber.fromCompleteNumber({required String completeNumber}) { + if (completeNumber == "") { + return PhoneNumber(countryISOCode: "", countryCode: "", number: ""); + } + + try { + Country country = getCountry(completeNumber); + String number; + if (completeNumber.startsWith('+')) { + number = completeNumber.substring(1 + country.dialCode.length + country.regionCode.length); + } else { + number = completeNumber.substring(country.dialCode.length + country.regionCode.length); + } + return PhoneNumber( + countryISOCode: country.code, countryCode: country.dialCode + country.regionCode, number: number); + } on InvalidCharactersException { + rethrow; + // ignore: unused_catch_clause + } on Exception catch (e) { + return PhoneNumber(countryISOCode: "", countryCode: "", number: ""); + } + } + + bool isValidNumber() { + Country country = getCountry(completeNumber); + if (number.length < country.minLength) { + throw NumberTooShortException(); + } + + if (number.length > country.maxLength) { + throw NumberTooLongException(); + } + return true; + } + + String get completeNumber { + return countryCode + number; + } + + static Country getCountry(String phoneNumber) { + if (phoneNumber == "") { + throw NumberTooShortException(); + } + + final validPhoneNumber = RegExp(r'^[+0-9]*[0-9]*$'); + + if (!validPhoneNumber.hasMatch(phoneNumber)) { + throw InvalidCharactersException(); + } + + if (phoneNumber.startsWith('+')) { + return countries + .firstWhere((country) => phoneNumber.substring(1).startsWith(country.dialCode + country.regionCode)); + } + return countries.firstWhere((country) => phoneNumber.startsWith(country.dialCode + country.regionCode)); + } + + @override + String toString() => 'PhoneNumber(countryISOCode: $countryISOCode, countryCode: $countryCode, number: $number)'; +} diff --git a/siro_rider/lib/controller/local/translations.dart b/siro_rider/lib/controller/local/translations.dart new file mode 100644 index 0000000..5244054 --- /dev/null +++ b/siro_rider/lib/controller/local/translations.dart @@ -0,0 +1,24414 @@ +import 'package:get/get.dart'; + +class MyTranslation extends Translations { + @override + Map> get keys => { + "ar": { + "About Intaleq": "حول انطلق", + "Chat with us anytime": "دردش معنا في أي وقت", + "Direct talk with our team": "تحدث مباشرة مع فريقنا", + "Email Support": "الدعم عبر البريد الإلكتروني", + "For official inquiries": "للاستفسارات الرسمية", + "Intaleq Support": "دعم انطلق", + 'Change Home location ?': 'تغيير موقع المنزل؟', + 'Change Work location ?': 'تغيير موقع العمل؟', + "Reach out to us via": "تواصل معنا عبر", + "Support is Away": "الدعم غير متاح حالياً", + "Support is currently Online": "الدعم متاح حالياً", + "Voice Call": "اتصال صوتي", + "We're here to help you 24/7": "نحن هنا لمساعدتكم على مدار الساعة", + "Working Hours:": "ساعات العمل:", + "1 Passenger": "راكب واحد", + "2 Passengers": "راكبين", + "3 Passengers": "٣ ركاب", + "4 Passengers": "٤ ركاب", + "2. Attach Recorded Audio (Optional)": + "٢. إرفاق تسجيل صوتي (اختياري)", + "Accept": "قبول", + "Account": "الحساب", + "Actions": "الإجراءات", + "Active Users": "المستخدمين النشطين", + "Add a Stop": "إضافة نقطة توقف", + "Add a new waypoint stop": "إضافة نقطة توقف جديدة", + "After this period\nYou can\'t cancel!": "بعد هالوقت\nما فيك تكنسل!", + "Age is": "العمر", + "Alert": "تنبيه", + "An OTP has been sent to your number.": "تم إرسال كود التأكيد لرقمك.", + "An error occurred": "حدث خطأ", + "Appearance": "المظهر", + "Are you sure you want to delete this file?": + "متأكد بدك تحذف هالملف؟", + "Are you sure you want to logout?": "متأكد بدك تسجل خروج؟", + "Arrived": "وصلنا", + "Audio Recording": "تسجيل صوتي", + "Call": "اتصال", + "Call Connected": "تم فتح الاتصال", + "Call Support": "اتصل بالدعم", + "Call left": "مكالمات متبقية", + "Calling": "عم نتصل بـ", + "Change Photo": "تغيير الصورة", + "Captain": "الكابتن", + "Choose from Gallery": "اختر من المعرض", + "Choose from contact": "اختر من جهات الاتصال", + "Click to track the trip": "اضغط لتتبع المشوار", + "Close panel": "إغلاق اللوحة", + "Coming": "جايين", + "Complete Payment": "إتمام الدفع", + "Confirm Cancellation": "تأكيد الإلغاء", + "Confirm Pickup Location": "تأكيد موقع الانطلاق", + "Connecting...": "عم يتم الاتصال...", + "Connection failed. Please try again.": "فشل الاتصال. جرب مرة تانية.", + "Could not create ride. Please try again.": + "ما قدرنا نعمل مشوار. جرب مرة تانية.", + "Crop Photo": "قص الصورة", + "Dark Mode": "الوضع الليلي", + "Decline": "رفض", + "Delete": "حذف", + "Delete Account": "حذف الحساب", + "Delete All": "حذف الكل", + "Delete All Recordings?": "حذف كل التسجيلات؟", + "Delete Recording?": "حذف التسجيل؟", + "Destination Set": "تم تحديد الوجهة", + "Distance": "المسافة", + "Double tap to open search or enter destination": + "اضغط مرتين لتفتح البحث أو تدخل الوجهة", + "Double tap to set or change this waypoint on the map": + "اضغط مرتين لتحديد أو تغيير هالنقطة عالخريطة", + "Drawing route on map...": "عم نرسم الطريق عالخريطة...", + "Driver Phone": "رقم الكابتن", + "Driver is Going To You": "الكابتن جاي لعندك", + "Emergency Mode Triggered": "تم تفعيل وضع الطوارئ", + "Emergency SOS": "طوارئ SOS", + "End": "إنهاء", + "Enter the 5-digit code": "أدخل الكود المكون من ٥ أرقام", + "Enter your City": "أدخل مدينتك", + "Enter your Password": "أدخل كلمة السر", + "Failed to book trip: \$e": "فشل حجز المشوار", + "Failed to get location": "فشل جلب الموقع", + "Failed to initiate payment. Please try again.": + "فشل بدء الدفع. جرب مرة تانية.", + "Failed to send OTP": "فشل إرسال كود التأكيد", + "Failed to upload photo": "فشل رفع الصورة", + "Finished": "انتهى", + "Fixed Price": "سعر ثابت", + "Free Call": "مكالمة مجانية", + "General": "عام", + "Grant": "منح الإذن", + "Have a Promo Code?": "معك كود خصم؟", + "Hello! I\'m inviting you to try Intaleq.": + "أهلاً! بدعيك لتجربة تطبيق انطلق.", + "Hi ,I Arrive your site": "مرحباً، وصلت لموقعك", + "Hi, Where to": "مرحباً، لوين؟", + "Home": "الرئيسية", + "I am currently located at": "أنا حالياً موجود بـ", + "I'm Safe": "أنا بأمان", + "If you need to reach me, please contact the driver directly at": + "إذا بدك تتواصل معي، حاكي الكابتن مباشرة على", + "Image Upload Failed": "فشل رفع الصورة", + "Intaleq Passenger": "راكب انطلق", + "Invite": "دعوة", + "Join a channel": "انضم للقناة", + "Last Name": "الاسم الأخير", + "Leave a detailed comment (Optional)": "اترك تعليق تفصيلي (اختياري)", + "Light Mode": "الوضع الفاتح", + "Listen": "استماع", + "Location": "الموقع", + "Location Received": "تم استلام الموقع", + "Logout": "تسجيل خروج", + "Map Error": "خطأ بالخريطة", + "Message": "رسالة", + "Mute": "كتم الصوت", + "Move map to select destination": "حرك الخريطة لتحديد الوجهة", + "Move map to set start location": "حرك الخريطة لتحديد نقطة البداية", + "Move map to set stop": "حرك الخريطة لتحديد التوقف", + "Move map to your home location": "حرك الخريطة لموقع البيت", + "Move map to your pickup point": "حرك الخريطة لموقع الانطلاق", + "Move map to your work location": "حرك الخريطة لموقع الشغل", + "N/A": "غير متاح", + "No Notifications": "ما في إشعارات", + "No Recordings Found": "ما في تسجيلات", + "No Rides now!": "ما في مشاوير حالياً!", + "No contacts available": "ما في جهات اتصال", + "No i want": "لا بدي", + "No notification data found.": "ما في بيانات للإشعار.", + "No routes available for this destination.": "ما في طرق لهالوجهة.", + "No user found": "ما في مستخدم", + "No,I want": "لا، بدي", + "No.Iwant Cancel Trip.": "لا. بدي كنسل المشوار.", + "Now move the map to your pickup point": + "الآن حرك الخريطة لمكان انطلاقك", + "Now set the pickup point for the other person": + "الآن حدد مكان الانطلاق للشخص التاني", + "On Trip": "بالمشوار", + "Open": "فتح", + "Open destination search": "فتح بحث الوجهة", + "Open in Google Maps": "فتح بخرائط جوجل", + "Order VIP Canceld": "انلغى طلب VIP", + "Passenger": "الراكب", + "Passenger cancel order": "الراكب كنسل الطلب", + "Pay by MTN Wallet": "الدفع بمحفظة سيريتل كاش", + "Pay by Sham Cash": "الدفع بشام كاش", + "Pay by Syriatel Wallet": "الدفع بمحفظة سيريتل كاش", + "Pay with PayPal": "الدفع بـ PayPal", + "Phone": "الموبايل", + "Phone Number": "رقم الموبايل", + "Phone Number Check": "فحص رقم الموبايل", + "Phone number seems too short": "رقم الموبايل قصير كتير", + "Phone verified. Please complete registration.": + "تأكد الرقم. يرجى إتمام التسجيل.", + "Pick destination on map": "اختر الوجهة عالخريطة", + "Pick location on map": "اختر الموقع عالخريطة", + "Pick on map": "اختر عالخريطة", + "Pick start point on map": "اختر نقطة البداية عالخريطة", + "Plan Your Route": "خطط مسارك", + "Please add contacts to your phone.": "يرجى إضافة أسماء لجوالك.", + "Please check your internet and try again.": + "تأكد من النت وجرب مرة تانية.", + "Please enter a valid email.": "أدخل إيميل صحيح.", + "Please enter a valid phone number.": "أدخل رقم موبايل صحيح.", + "Please enter the number without the leading 0": + "أدخل الرقم بدون 0 بالبداية", + "Please enter your phone number": "أدخل رقم موبايلك", + "Please go to Car now": "يا ريت تروح لعند السيارة هلا", + "Please select a reason first": "اختر السبب أول شي", + "Please set a valid SOS phone number.": "يا ريت تحط رقم طوارئ صح.", + "Please slow down": "يا ريت تخفف سرعة", + "Please wait while we prepare your trip.": + "انتظر شوي عم نجهز المشوار.", + "Preferences": "التفضيلات", + "Profile photo updated": "تم تحديث صورة الغلاف", + "Quick Message": "رسالة سريعة", + "Rating is": "التقييم هو", + "Received empty route data.": "تم استلام بيانات طريق فارغة.", + "Record": "تسجيل", + "Record your trips to see them here.": "سجل مشاويرك لتشوفهم هون.", + "Rejected Orders Count": "عدد الطلبات المرفوضة", + "Remove waypoint": "حذف نقطة التوقف", + "Report": "الإبلاغ", + "Route and prices have been calculated successfully!": + "تم حساب الطريق والأسعار بنجاح!", + "SOS": "نجدة SOS", + "Save": "حفظ", + "Save Changes": "حفظ التغييرات", + "Save Name": "حفظ الاسم", + "Search country": "البحث عن الدولة", + "Search for a starting point": "ابحث عن نقطة انطلاق", + "Select Appearance": "اختر المظهر", + "Select Education": "اختر مستوى التعليم", + "Select Gender": "اختر الجنس", + "Select This Ride": "اختر هالمشوار", + "Select betweeen types": "اختر بين الأنواع", + "Send Email": "إرسال إيميل", + "Send SOS": "إرسال نجدة", + "Send WhatsApp Message": "إرسال رسالة واتساب", + "Server Error": "خطأ بالسيرفر", + "Server error": "خطأ بالسيرفر", + "Server error. Please try again.": "خطأ بالسيرفر. جرب مرة تانية.", + "Set Destination": "تحديد الوجهة", + "Set Phone Number": "تعيين رقم الموبايل", + "Set as Home": "تحديد كالبيت", + "Set as Stop": "تحديد كنقطة توقف", + "Set as Work": "تحديد كالشغل", + "Share": "مشاركة", + "Share Trip": "مشاركة المشوار", + "Share your experience to help us improve...": + "شاركنا تجربتك لنحسن خدمتنا...", + "Something went wrong. Please try again.": "صار غلط. جرب مرة تانية.", + "Speaker": "مكبر الصوت", + "Speaking...": "عم يحكي...", + "Speed Over": "تجاوز السرعة", + "Start Point": "نقطة البداية", + "Stay calm. We are here to help.": "خليك هادي. نحن هون لمساعدتك.", + "Stop": "توقف", + "Submit Rating": "إرسال التقييم", + "Support & Info": "الدعم والمعلومات", + "System Default": "حسب النظام", + "Take a Photo": "التقاط صورة", + "Tap to apply your discount": "اضغط لتطبيق الخصم", + "Tap to search your destination": "اضغط للبحث عن وجهتك", + "The driver cancelled the trip.": "الكابتن كنسل المشوار.", + "This action cannot be undone.": "هالإجراء ما بيتراجع عنه.", + "This action is permanent and cannot be undone.": + "هالإجراء دائم وما بيتراجع عنه.", + "This is for delivery or a motorcycle.": + "هاد للتوصيل أو الدراجة النارية.", + "Time": "الوقت", + "To :": "إلى :", + "Top up Balance": "شحن الرصيد", + "Top up Balance to continue": "اشحن رصيدك لتكمل", + "Total Invites": "مجموع الدعوات", + "Total Price": "السعر الإجمالي", + "Trip booked successfully": "تم حجز المشوار بنجاح", + "Type your message...": "اكتب رسالتك...", + "Unknown Location": "موقع غير معروف", + "Update Name": "تحديث الاسم", + "Verified Passenger": "راكب موثق", + "View Map": "عرض الخريطة", + "Wait for the trip to start first": "استنى ليبلش المشوار أول", + "Waiting...": "بانتظار...", + "Warning": "تحذير", + "Waypoint has been set successfully": "تم تعيين نقطة التوقف بنجاح", + "We use location to get accurate and nearest driver for you": + "منستخدم لوكيشنك لنلاقي أقرب كابتن إلك بدقة", + "WhatsApp": "واتساب", + "Why do you want to cancel?": "ليش بدك تكنسل؟", + "Yes": "إي", + "You should ideintify your gender for this type of trip!": + "لازم تحدد جنسك لهالنوع من المشاوير!", + "You will choose one of above!": "لازم تختار واحد من فوق!", + "Your Rewards": "مكافآتك", + "Your complaint has been submitted.": "تم إرسال شكوتك.", + "and acknowledge our Privacy Policy.": + "وأقر بسياسة الخصوصية الخاصة بنا.", + "as the driver.": "ككابتن.", + "cancelled": "تكنسل", + "due to a previous trip.": "عن مشوار قديم.", + "insert sos phone": "دخل رقم طوارئ", + "is calling you": "عم يتصل فيك", + "is driving a": "عم يسوق", + "min added to fare": "دقيقة نضافت للأجرة", + "phone not verified": "رقم الموبايل مو متأكد", + "to arrive you.": "ليوصلك.", + "unknown": "غير معروف", + "wait 1 minute to recive message": "استنى دقيقة لتستلم الرسالة", + "with license plate": "برقم اللوحة", + "witout zero": "بدون صفر", + "you must insert token code": "لازم تدخل الكود", + "Syria": "سوريا", + "SYP": "ل.س", + "Order": "طلب", + "OrderVIP": "طلب VIP", + "Cancel Trip": "إلغاء المشوار", + "Passenger Cancel Trip": "الراكب كنسل المشوار", + "VIP Order": "طلب VIP", + "The driver accepted your trip": "الكابتن قبل مشوارك", + "message From passenger": "رسالة من الراكب", + "Cancel": "إلغاء", + "Trip Cancelled. The cost of the trip will be added to your wallet.": + "المشوار تكنسل. وتكلفته رح تنزل بمحفظتك.", + "token change": "تغيير الرمز", + "Changed my mind": "غيرت رأيي", + "Please write the reason...": "يا ريت تكتب السبب...", + "Found another transport": "لقيت وسيلة تانية", + "Driver is taking too long": "الكابتن كتير عم يتأخر", + "Driver asked me to cancel": "الكابتن طلب مني كنسل", + "Wrong pickup location": "مكان اللوكيشن غلط", + "Other": "آخر", + "Don't Cancel": "لا تلغي", + "No Drivers Found": "ما لقينا كباتن", + "Sorry, there are no cars available of this type right now.": + "منعتذر، ما في سيارات من هاد النوع هلا.", + "Refresh Map": "تحديث الخريطة", + "face detect": "كشف الوجه", + "Face Detection Result": "نتيجة كشف الوجه", + "similar": "مشابه", + "not similar": "غير مشابه", + "Searching for nearby drivers...": "عم ندورلك على كباتن قريبين...", + "Error": "غلط", + "Failed to search, please try again later": + "ما مشي حال البحث، جرب بعد شوي", + "Connection Error": "مشكلة بالاتصال", + "Please check your internet connection": "تأكد من النت عندك", + "Sorry 😔": "عذراً 😔", + "The driver cancelled the trip for an emergency reason.\nDo you want to search for another driver immediately?": + "الكابتن كنسل المشوار لسبب طارئ.\nبدك ندورلك على كابتن تاني فوراً؟", + "Search for another driver": "دور على كابتن تاني", + "We apologize 😔": "نعتذر منك 😔", + "No drivers found at the moment.\nPlease try again later.": + "ما لقينا كباتن حالياً.\\nيا ريت تجرب بعد شوي.", + "Hi ,I will go now": "مرحباً، صرت طالع", + "Passenger come to you": "الراكب جاي لعندك", + "Call Income": "مكالمة واردة", + "Call Income from Passenger": "مكالمة من الراكب", + "Criminal Document Required": "بدنا ورقة (لا حکم عليه)", + "You should have upload it .": "لازم ترفعها.", + "Call End": "انتهاء المكالمة", + "The order has been accepted by another driver.": + "في كابتن تاني أخد الطلب.", + "The order Accepted by another Driver": "في كابتن تاني أخد الطلب", + "We regret to inform you that another driver has accepted this order.": + "منعتذر، بس في كابتن تاني سبق وأخد الطلب.", + "Driver Applied the Ride for You": "الكابتن قدم الطلب إلك", + "Applied": "تم التقديم", + "Please go to Car Driver": "يا ريت تروح لعند الكابتن", + "Ok I will go now.": "تمام، صرت طالع.", + "Accepted Ride": "المشوار انقبل", + "Driver Accepted the Ride for You": "الكابتن قبل مشوارك", + "Promo": "عرض", + "Show latest promo": "فرجينا أحدث العروض", + "Trip Monitoring": "مراقبة المشوار", + "Driver Is Going To Passenger": "الكابتن جاي لعندك", + "Please stay on the picked point.": "يا ريت تضل بمكانك.", + "message From Driver": "رسالة من الكابتن", + "Trip is Begin": "بدأ المشوار", + "Cancel Trip from driver": "الكابتن كنسل المشوار", + "We will look for a new driver.\nPlease wait.": + "عم ندور على كابتن جديد.\\nيا ريت تنطر شوي.", + "The driver canceled your ride.": "الكابتن كنسل مشوارك.", + "Driver Finish Trip": "الكابتن خلص المشوار", + "you will pay to Driver": "رح تدفع للكابتن", + "Don’t forget your personal belongings.": "لا تنسَ أغراضك الشخصية.", + "Please make sure you have all your personal belongings and that any remaining fare, if applicable, has been added to your wallet before leaving. Thank you for choosing the Intaleq app": + "يا ريت تتأكد من أغراضك، وإنك أخدت الباقي بمحفظتك قبل ما تنزل. شكراً لثقتك بـ انطلق.", + "Finish Monitor": "إنهاء المراقبة", + "Trip finished": "خلص المشوار", + "Call Income from Driver": "مكالمة من الكابتن", + "Driver Cancelled Your Trip": "الكابتن كنسل مشوارك", + "you will pay to Driver you will be pay the cost of driver time look to your Intaleq Wallet": + "رح تدفع للكابتن حق وقته، شوف محفظتك بـ انطلق", + "Order Applied": "تم تقديم الطلب", + "welcome to intaleq": "أهلاً بك في انطلق", + "login or register subtitle": + "دخل رقم موبايلك لتسجل دخول أو لتفتح حساب جديد", + "Complaint cannot be filed for this ride. It may not have been completed or started.": + "ما فيك تبعت شكوى لهاد المشوار. يمكن لسا ما خلص أو ما بلّش.", + "phone number label": "رقم الموبايل", + "phone number required": "يا ريت تدخل رقم الموبايل", + "send otp button": "إرسال كود التأكيد", + "verify your number title": "تأكيد رقمك", + "otp sent subtitle": + "تم إرسال رمز تحقق مؤلف من 5 أرقام إلى\n@phoneNumber", + "verify and continue button": "تأكيد ومتابعة", + "enter otp validation": "يا ريت تدخل الكود (5 أرقام)", + "one last step title": "خطوة أخيرة", + "complete profile subtitle": "كمل بياناتك لتبلش", + "first name label": "الاسم الأول", + "first name required": "يا ريت تكتب الاسم الأول", + "last name label": "الاسم الأخير", + "Verify OTP": "تأكيد الكود", + "Verification Code": "كود التأكيد", + "We have sent a verification code to your mobile number:": + "بعتنا كود التأكيد على رقم موبايلك:", + "Verify": "تأكيد", + "Resend Code": "رجّع ابعت الكود", + "You can resend in": "فيك ترجع تبعت بعد", + "seconds": "ثانية", + "Please enter the complete 6-digit code.": + "يا ريت تدخل الكود كامل (6 أرقام).", + "last name required": "يا ريت تكتب الكنية", + "email optional label": "البريد الإلكتروني (اختياري)", + "complete registration button": "إتمام التسجيل", + "User with this phone number or email already exists.": + "هاد الرقم أو الإيميل مسجل من قبل.", + "otp sent success": "بعتنا كود التأكيد على واتساب.", + "failed to send otp": "فشل إرسال الرمز.", + "server error try again": "صار غلط بالسيرفر، جرب مرة تانية.", + "an error occurred": "صار غلط مو متوقع: @error", + "otp verification failed": "كود التأكيد غلط.", + "registration failed": "ما مشي حال التسجيل.", + "welcome user": "أهلاً بك، @firstName!", + "Don't forget your personal belongings.": "لا تنسى أغراضك.", + "Share App": "مشاركة التطبيق", + "Wallet": "المحفظة", + "Balance": "الرصيد", + "Profile": "الملف الشخصي", + "Contact Support": "التواصل مع الدعم", + "Session expired. Please log in again.": + "خلصت الجلسة. يا ريت ترجع تسجل دخول.", + "Security Warning": "⚠️ تحذير أمني", + "Potential security risks detected. The application may not function correctly.": + "في مخاطر أمنية. يمكن التطبيق ما يشتغل صح.", + "please order now": "اطلب هلا", + "Where to": "لوين؟", + "Where are you going?": "لوين رايح؟", + "Quick Actions": "إجراءات سريعة", + "My Balance": "رصيدي", + "Order History": "سجل الطلبات", + "Contact Us": "تواصل معنا", + "Driver": "كابتن", + "Complaint": "شكوى", + "Promos": "عروض", + "Recent Places": "آخر الأماكن", + "From": "من", + "WhatsApp Location Extractor": "جلب الموقع من الواتساب", + "Location Link": "رابط الموقع", + "Paste location link here": "لزق رابط الموقع هون", + "Go to this location": "روح لهاد اللوكيشن", + "Paste WhatsApp location link": "لزق رابط لوكيشن الواتساب", + "Select Order Type": "نقي نوع الطلب", + "Choose who this order is for": "هاد الطلب لمين؟", + "I want to order for myself": "بدي اطلب لإلي", + "I want to order for someone else": "بدي اطلب لغيري", + "Order for someone else": "اطلب لغيرك", + "Order for myself": "اطلب لنفسك", + "Are you want to go this site": "بدك تروح لهاد اللوكيشن؟", + "No": "لا", + "Intaleq Wallet": "محفظة انطلق", + "Have a promo code?": "معك كود خصم؟", + "Your Wallet balance is ": "رصيد محفظتك هو ", + "Cash": "كاش", + "Pay directly to the captain": "ادفع للكابتن دغري", + "Top up Wallet to continue": "اشحن محفظتك لتكمل", + "Or pay with Cash instead": "أو فيك تدفع كاش بدالها", + "Confirm & Find a Ride": "تأكيد وتدوير على مشوار", + "Balance:": "الرصيد:", + "Alerts": "الإشعارات", + "Welcome Back!": "يا مية أهلاً!", + "Current Balance": "الرصيد الحالي", + "Set Wallet Phone Number": "تعيين رقم المحفظة", + "Link a phone number for transfers": "اربط رقم الجوال للتحويلات", + "Payment History": "سجل الدفعات", + "View your past transactions": "شوف الدفعات اللي صارت", + "Top up Wallet": "شحن المحفظة", + "Add funds using our secure methods": "عبي رصيد بطرقنا المضمونة", + "Increase Fare": "رفع الأجرة", + "No drivers accepted your request yet": + "لسا ما حدا من الكباتن قبل طلبك", + "Increasing the fare might attract more drivers. Would you like to increase the price?": + "إذا زدت الأجرة ممكن الكباتن يقبلوا أسرع. بدك ترفع السعر؟", + "Please make sure not to leave any personal belongings in the car.": + "يا ريت تنتبه ما تنسى غراضك بالسيارة.", + "Cancel Ride": "إلغاء المشوار", + "Route Not Found": "الطريق مو موجود", + "We couldn't find a valid route to this destination. Please try selecting a different point.": + "ما لقينا طريق لهون. جرب تختار مكان تاني.", + "You can call or record audio during this trip.": + "فيك تدق أو تسجل صوت بهاد المشوار.", + "Warning: Speeding detected!": "انتبه: عم تسرع كتير!", + "Comfort": "مريحة", + "Intaleq Balance": "رصيد انطلق", + "Electric": "كهربائية", + "Lady": "سيدة", + "Van": "عائلية", + "Rayeh Gai": "رايح جاي", + "Join Intaleq as a driver using my referral code!": + "انضم لـ انطلق ككابتن بكود دعوتي!", + "Use code:": "استخدم الكود:", + "Download the Intaleq Driver app now and earn rewards!": + "نزل تطبيق انطلق للكباتن هلا واربح مكافآت!", + "Get a discount on your first Intaleq ride!": + "خد خصم على أول مشوار إلك مع انطلق!", + "Use my referral code:": "استخدم كود دعوتي:", + "Download the Intaleq app now and enjoy your ride!": + "نزل تطبيق انطلق هلا واستمتع بمشوارك!", + "Contacts Loaded": "تحملت الأسماء", + "Showing": "عم نعرض", + "of": "من", + "Customer not found": "الزبون مو موجود", + "Wallet is blocked": "المحفظة محظورة", + "Customer phone is not active": "جوال الزبون مو شغال", + "Balance not enough": "الرصيد مو كافي", + "Balance limit exceeded": "تخطيت حد الرصيد", + "Incorrect sms code": + "⚠️ الكود اللي دخلته غلط. يا ريت تحاول مرة تانية.", + "contacts. Others were hidden because they don't have a phone number.": + "اسم. البقية مخفيين لانو ما عندن أرقام.", + "No contacts found": "ما لقينا أسماء", + "No contacts with phone numbers were found on your device.": + "ما في أسماء عندن أرقام جوال بموبايلك.", + "Permission denied": "الطلب مرفوض", + "Contact permission is required to pick contacts": + "لازم تعطي إذن الوصول للأسماء لتختارن.", + "An error occurred while picking contacts:": + "صار غلط وقت عم ننقي الأسماء:", + "Please enter a correct phone": "يا ريت تدخل رقم صح", + "Success": "تمام", + "Invite sent successfully": "انبعتت الدعوة تمام", + "Hello! I'm inviting you to try Intaleq.": + "أهلاً! عم ادعيك تجرب تطبيق 'انطلق'.", + "Use my invitation code to get a special gift on your first ride!": + "استخدم كود دعوتي لتاخد هدية مميزة بأول مشوار إلك!", + "Your personal invitation code is:": "كود دعوتك الشخصي هو:", + "Be sure to use it quickly! This code expires at": + "استخدمه بسرعة! هاد الكود بيخلص بـ", + "Download the app now:": "نزل التطبيق هلا:", + "See you on the road!": "نشوفك ع الطريق!", + "This phone number has already been invited.": + "هاد الرقم انبعتله دعوة من قبل.", + "An unexpected error occurred. Please try again.": + "صار غلط مو متوقع. جرب مرة تانية.", + "You deserve the gift": "بتستاهل الهدية", + "Claim your 20 LE gift for inviting": "خد هديتك الـ ٢٠ ل.س دعوتك لـ", + "You have got a gift for invitation": "طلعتلك هدية مشان دعوتك", + "You have earned 20": "ربحت ٢٠", + "LE": "ل.س", + "Vibration feedback for all buttons": "تفعيل الاهتزاز لجميع الأزرار", + "Share with friends and earn rewards": + "شارك التطبيق مع أصدقائك واحصل على مكافآت", + "Gift Already Claimed": "أخدت الهدية من قبل", + "You have already received your gift for inviting": + "أنت أخدت الهدية خلاص على هي الدعوة", + "Keep it up!": "خليك هيك!", + "has completed": "خلص", + "trips": "مشاوير", + "Personal Information": "المعلومات الشخصية", + "Name": "الاسم", + "Not set": "مو محدد", + "Gender": "الجنس", + "Education": "الدراسة", + "Work & Contact": "الشغل والاتصال", + "Employment Type": "نوع الشغل", + "Marital Status": "الحالة الاجتماعية", + "SOS Phone": "رقم الطوارئ", + "Sign Out": "تسجيل خروج", + "Delete My Account": "حذف حسابي", + "Update Gender": "تعديل الجنس", + "Update": "تحديث", + "Update Education": "تعديل الدراسة", + "Are you sure? This action cannot be undone.": + "متأكد؟ هاد الإجراء ما فيه تراجع.", + "Confirm your Email": "تأكد من إيميلك", + "Type your Email": "دخل إيميلك", + "Delete Permanently": "حذف نهائي", + "Male": "ذكر", + "Female": "أنثى", + "High School Diploma": "شهادة ثانوية", + "Associate Degree": "دبلوم", + "Bachelor's Degree": "إجازة جامعية", + "Master's Degree": "ماجستير", + "Doctoral Degree": "دكتوراه", + "Select your preferred language for the app interface.": + "نقي اللغة اللي بتفضلها لواجهة التطبيق.", + "Language Options": "خيارات اللغة", + "You can claim your gift once they complete 2 trips.": + "فيك تطلب هديتك بعد ما يخلص مشوارين.", + "Closest & Cheapest": "الأقرب والأرخص", + "Comfort choice": "خيار الراحة", + "Travel in a modern, silent electric car. A premium, eco-friendly choice for a smooth ride.": + "تنقّل بسيارة كهربائية حديثة وصامتة. خيار مميز ونظيف لرحلة مريحة.", + "Spacious van service ideal for families and groups. Comfortable, safe, and cost-effective travel together.": + "خدمة فان واسعة ومثالية للعائلات والمجموعات. سفر مريح، آمن، وموفر للكل.", + "Quiet & Eco-Friendly": "هادية ونظيفة", + "Lady Captain for girls": "كابتن سيدة للبنات", + "Van for familly": "سيارة فان لعيلة", + "Are you sure to delete this location?": "متأكد بدك تمسح هاد المكان؟", + "Submit a Complaint": "بعت شكوى", + "Submit Complaint": "إرسال الشكوى", + "No trip history found": "ما في سجل مشاوير", + "Your past trips will appear here.": "مشاويرك القديمة رح تطلع هون.", + "1. Describe Your Issue": "١. اشرح شو صار معك", + "Enter your complaint here...": "اكتب شكوتك هون...", + "2. Attach Recorded Audio": "٢. إرفاق تسجيل صوتي", + "No audio files found.": "ما لقينا تسجيلات صوتية.", + "Confirm Attachment": "تأكيد الإرفاق", + "Attach this audio file?": "بدك ترفق هاد التسجيل؟", + "Uploaded": "ترفع بنجاح", + "3. Review Details & Response": "٣. مراجعة التفاصيل والرد", + "Date": "التاريخ", + "Today's Promos": "عروض اليوم", + "No promos available right now.": "ما في عروض هلا.", + "Check back later for new offers!": + "ارجع شيك بعدين لتشوف عروض جديدة!", + "Valid Until:": "صالح لغاية:", + "CODE": "الكود", + "Login": "تسجيل دخول", + "Sign in for a seamless experience": "سجل دخول لتاخد أحسن تجربة", + "Sign In with Google": "سجل دخول بجوجل", + "Sign in with Apple": "سجل دخول بآبل", + "User not found": "المستخدم مو موجود", + "Need assistance? Contact us": "بدك مساعدة؟ حاكينا", + "Email": "الإيميل", + "Your email address": "إيميلك", + "Enter a valid email": "دخل إيميل صح", + "Password": "كلمة السر", + "Your password": "كلمة سرك", + "Enter your password": "دخل كلمة السر", + "Submit": "إرسال", + "Terms of Use & Privacy Notice": "شروط الاستخدام وسياسة الخصوصية", + "By selecting \"I Agree\" below, I confirm that I have read and agree to the ": + "باختيار \"أوافق\" أدناه، أؤكد أنني قرأت ووافقت على ", + "Terms of Use": "شروط الاستخدام", + " and acknowledge the ": " وبتقر بـ ", + "Privacy Notice": "سياسة الخصوصية", + ". I am at least 18 years old.": ". وعمرك أكيد فوق الـ ١٨ سنة.", + "I Agree": "أوافق على الشروط والأحكام", + "Continue": "متابعة", + "Enable Location": "شغل اللوكيشن", + "To give you the best experience, we need to know where you are. Your location is used to find nearby captains and for pickups.": + "لنقدر نخدمك أحسن شي، لازم نعرف وينك. لوكيشنك بيلزمنا لنلاقي أقرب الكباتن ليك والمكان اللي رح تطلع منه.", + "Allow Location Access": "اسمح لنا نوصل للوكيشن", + "Welcome to Intaleq!": "يا مية أهلاً فيك بـ انطلق!", + "Before we start, please review our terms.": + "قبل ما نبلش، يا ريت تشوف شروطنا.", + "Your journey starts here": "مشوارك ببلش من هون", + "Cancel Search": "إلغاء البحث", + "Set pickup location": "تحديد مكان البداية", + "Move the map to adjust the pin": "حرك الخريطة لتزبط اللوكيشن", + "Searching for the nearest captain...": "عم ندورلك على أقرب كابتن...", + "No one accepted? Try increasing the fare.": + "ما حدا قبل؟ جرب ترفع الأجرة شوي.", + "Increase Your Trip Fee (Optional)": "ارفع أجرة مشوارك (اختياري)", + "We haven't found any drivers yet. Consider increasing your trip fee to make your offer more attractive to drivers.": + "لسا ما لقينا كباتن. فيك ترفع الأجرة شوي لتشجع الكباتن يقبلوا طلبك.", + "No, thanks": "لا، شكراً", + "Increase Fee": "زيادة الأجرة", + "Copy": "نسخ", + "Promo Copied!": "انتسخ الكود!", + "Code": "الكود", + "copied to clipboard": "انتسخ الكود", + "Price": "السعر", + "Intaleq's Response": "رد فريق انطلق", + "Awaiting response...": "ناطرين الرد...", + "Audio file not attached": "التسجيل مو مرفق", + "The audio file is not uploaded yet.\\nDo you want to submit without it?": + "لم يتم رفع الملف الصوتي بعد.\\nهل تريد الإرسال بدونه؟", + "deleted": "انمسح", + "To Work": "ع الشغل", + "Work Saved": "تم حفظ موقع العمل", + "To Home": "إلى البيت", + "Home Saved": "تم حفظ موقع البيت", + "Destination selected": "تحددت الوجهة", + "Now select start pick": "الآن حدد نقطة الانطلاق", + "OK": "موافق", + "Confirm Pick-up Location": "تأكيد موقع الانطلاق", + "Set Location on Map": "حدد الموقع على الخريطة", + "You can contact us during working hours from 10:00 - 16:00.": + "فيك تحاكينا بأوقات الشغل من ١٠ للـ ٤.", + "Intaleq is the safest and most reliable ride-sharing app designed especially for passengers in Syria. We provide a comfortable, respectful, and affordable riding experience with features that prioritize your safety and convenience. Our trusted captains are verified, insured, and supported by regular car maintenance carried out by top engineers. We also offer on-road support services to make sure every trip is smooth and worry-free. With Intaleq, you enjoy quality, safety, and peace of mind—every time you ride.": + """إنطلِق هو التطبيق الأكثر أماناً وموثوقية لمشاركة الركوب والمصمم خصيصاً للركّاب في سوريا. نوفر لك تجربة تنقّل مريحة، محترمة، وبأسعار مناسبة، مع ميزات تضع سلامتك وراحتك في المقام الأول""", + "Customer MSISDN doesn’t have customer wallet": + "رقم الزبون ما عنده محفظة", + "Nearest Car: ~": "أقرب سيارة: ~", + "Nearest Car": "أقرب سيارة", + "No cars nearby": "ما في سيارات قريبة", + "Favorite Places": "الأماكن المفضلة", + "No favorite places yet!": "لسا ما عندك أماكن مفضلة!", + "from your favorites": "من مفضلتك", + "Back": "رجوع", + "Enter your code below to apply the discount.": + "دخل الكود تحت لتاخد الخصم", + "By selecting \"I Agree\" below, I confirm that I have read and agree to the": + "باختياري \"أوافق\" أدناه، أؤكد أنني قرأت ووافقت على", + "and acknowledge the": "وبتقر بـ", + "Enable Location Access": "تفعيل الوصول للموقع", + "We need your location to find nearby drivers for pickups and drop-offs.": + "بدنا اللوكيشن تبعك لنلاقي أقرب كباتن ليك.", + "You should restart app to change language": + "لازم تسكر التطبيق وترجع تفتحه لتتغير اللغة", + "Home Page": "الصفحة الرئيسية", + "To change Language the App": "لتغيير لغة التطبيق", + "Learn more about our app and mission": + "تعرف أكتر على تطبيقنا وأهدافنا", + "Promos For Today": "عروض اليوم", + "Choose your ride": "نقي مشوارك", + "Your Journey Begins Here": "مشوارك ببلش من هون", + "Bonus gift": "هدية إضافية", + "Pay": "ادفع", + "Get": "خد", + "Send to Driver Again": "بعت للكابتن مرة تانية", + "Driver Name:": "اسم الكابتن:", + "No trip data available": "ما في بيانات للمشوار", + "Car Plate:": "رقم اللوحة:", + "remaining": "بقيان", + "Order Cancelled": "تم إلغاء الطلب", + "You canceled VIP trip": "كنسلت مشوار VIP", + "Passenger cancelled order": "الراكب كنسل الطلب", + "Your trip is scheduled": "مشوارك تجدول", + "Don't forget your ride!": "لا تنسى مشوارك!", + "Trip updated successfully": "تحدث المشوار تمام", + "Car Make:": "الماركة:", + "Car Model:": "الموديل:", + "Car Color:": "اللون:", + "Driver Phone:": "جوال الكابتن:", + "Pre-booking": "حجز مسبق", + "Waiting VIP": "بانتظار VIP", + "Driver List": "قائمة الكباتن", + "Confirm Trip": "تأكيد المشوار", + "Select date and time of trip": "نقي تاريخ ووقت المشوار", + "Date and Time Picker": "اختيار التاريخ والوقت", + "Trip Status:": "حالة المشوار:", + "pending": "عم نستنى", + "accepted": "مقبولة", + "rejected": "مرفوضة", + "Apply": "تطبيق", + "Enter your promo code": "دخل كود الخصم", + "Apply Promo Code": "تفعيل الكود", + "Scheduled Time:": "الوقت المجدول:", + "No drivers available": "ما في كباتن", + "No drivers available at the moment. Please try again later.": + "ما في كباتن متاحين هلا. يا ريت تجرب بعد شوي.", + "you have a negative balance of": "رصيدك ناقص بقيمته", + "Please try again in a few moments": "جرب مرة تانية بعد شوي", + "Unknown Driver": "كابتن مو معروف", + "in your": "بمحفظتك", + "The driver accepted your order for": "الكابتن قبل طلبك بـ", + "wallet due to a previous trip.": "بالمحفظة بسبب مشوار قديم.", + "rides": "مشاوير", + "Add Work": "إضافة الشغل", + "The reason is": "السبب هو", + "User does not have a wallet #1652": "المستخدم ليس لديه محفظة #1652", + "Price of trip": "سعر المشوار", + "From:": "من:", + "For Intaleq and Delivery trips, the price is calculated dynamically. For Comfort trips, the price is based on time and distance": + "لمشاوير انطلق والتوصيل، السعر بيتغير. وبمشاوير الراحة، السعر بيعتمد على الوقت والمسافة.", + "Phone Wallet Saved Successfully": "انحفظ رقم المحفظة تمام", + "Add wallet phone you use": "ضيف رقم المحفظة اللي بتستخدمها", + "Update Available": "في تحديث للتطبيق", + "Phone number must be exactly 11 digits long": + "رقم الجوال لازم يكون ١١ رقم", + "Insert Wallet phone number": "دخل رقم المحفظة", + "Phone number isn't an Egyptian phone number": "رقم الجوال مو صح", + "A new version of the app is available. Please update to the latest version.": + "في نسخة جديدة من التطبيق. يا ريت تحدثها.", + "We use location to get accurate and nearest passengers for you": + "منستخدم لوكيشنك لنطلعلك أقرب الركاب إلك.", + "This ride is already applied by another driver.": + "هاد المشوار أخده كابتن تاني خلاص.", + "We use your precise location to find the nearest available driver and provide accurate pickup and dropoff information. You can manage this in Settings.": + "منستخدم لوكيشنك الدقيق لنلاقي أقرب كابتن ونحدد مكان الطلب والوصول. فيك تتحكم بهاد الشي من الإعدادات.", + "Where are you, sir?": "وين صرت يا غالي؟", + "I've been trying to reach you but your phone is off.": + "عم حاول حاكيك بس موبايلك مسكر.", + "Please don't be late": "يا ريت ما تتأخر", + "Please don't be late, I'm waiting for you at the specified location.": + "يا ريت ما تتأخر، أنا ناطرك بالمكان اللي حددته.", + "My location is correct. You can search for me using the navigation app": + "موقعي صح. فيك تلاقيني من برنامج الخرائط", + "Hello, I'm at the agreed-upon location": + "مرحباً، أنا صرت بالمكان المتفق عليه", + "How much longer will you be?": "قديش بدك لتوصل؟", + "Phone number is verified before": "رقم الجوال مأكد من قبل", + "Change Ride": "تغيير المشوار", + "You can change the destination by long-pressing any point on the map": + "فيك تغير الوجهة بضغطة طويلة على أي نقطة ع الخريطة", + "Pick from map destination": "نقي الوجهة من الخريطة", + "Pick or Tap to confirm": "نقي أو اضغط للتأكيد", + "Accepted your order": "انقبل طلبك", + "Order Accepted": "تم قبول الطلب", + "with type": "من نوع", + "accepted your order at price": "وافق على طلبك بسعر", + "you canceled order": "لقد ألغيت الطلب", + "If you want order to another person": "إذا كنت تريد الطلب لشخص آخر", + "upgrade price": "زيادة السعر", + "airport": "مطار", + "Best choice for a comfortable car with a flexible route and stop points. This airport offers visa entry at this price.": + "الخيار الأفضل لسيارة مريحة مع مسار مرن ونقاط توقف. هذا المطار يوفر تأشيرة دخول بهذا السعر.", + "You can upgrade price to may driver accept your order": + "فيك تزيد السعر ليقبل الكابتن طلبك", + "Change Route": "تغيير الطريق", + "No Captain Accepted Your Order": "ما حدا من الكباتن قبل طلبك", + "We are looking for a captain but the price may increase to let a captain accept": + "عم ندور على كابتن بس ممكن يزيد السعر ليقبل حدا", + "No, I want to cancel this trip": "لا، بدي كانسل هي الرحلة", + "Attention": "انتباه", + "Trip Cancelled. The cost of the trip will be deducted from your wallet.": + "تكنسل المشوار. ورح تنخصم تكلفته من محفظتك.", + "You will be charged for the cost of the driver coming to your location.": + "رح تنحسب عليك تكلفة جية الكابتن لعندك.", + "reject your order.": "رفض طلبك.", + "Order Under Review": "الطلب عم يتراجع", + "is reviewing your order. They may need more information or a higher price.": + "يقوم بمراجعة طلبك. قد يحتاج لمعلومات إضافية أو سعر أعلى.", + "Vibration": "اهتزاز", + "Resend code": "رجع ابعت الكود", + "change device": "تغيير الجهاز", + "Device Change Detected": "تم اكتشاف تغيير بالجهاز", + "You can only use one device at a time. This device will now be set as your active device.": + "يمكنك استخدام جهاز واحد فقط في كل مرة. سيتم الآن تعيين هذا الجهاز كجهازك النشط.", + "Click here point": "اضغط هون", + "Are you want to change": "بدك تغير؟", + "by": "بواسطة", + "Enter your complaint here": "أدخل شكواك هنا", + "Please enter your complaint.": "يا ريت تكتب شكوتك.", + "Complaint data saved successfully": "بيانات الشكوى انحفظت تمام", + "Trip Monitor": "مراقبة الرحلة", + "Insert SOS Phone": "دخل رقم الطوارئ", + "Add SOS Phone": "ضيف رقم الطوارئ", + "Dear ,\n\n 🚀 I have just started an exciting trip and I would like to share the details of my journey and my current location with you in real-time! Please download the Intaleq app. It will allow you to view my trip details and my latest location.\n\n 👉 Download link: \n Android [https://play.google.com/store/apps/details?id=com.mobileapp.store.ride]\n iOS [https://getapp.cc/app/6458734951]\n\n I look forward to keeping you close during my adventure!\n\n Intaleq ,": + "عزيزي،\n\n🚀 لقد بدأت رحلة شيقة وأود أن أشاركك تفاصيلها وموقعي الحالي بشكل مباشر! حمّل تطبيق انطلق لتتمكن من متابعة تفاصيل رحلتي وآخر موقع لي.\n\n👈 رابط التحميل:\nأندرويد [https://play.google.com/store/apps/details?id=com.mobileapp.store.ride]\nآيفون [https://getapp.cc/app/6458734951]\n\nيسعدني أن تبقى على اطلاع بمغامرتي!\n\nانطلق،", + "Send Intaleq app to him": "بعتله تطبيق انطلق", + "No passenger found for the given phone number": + "ما لقينا راكب بهاد الرقم", + "No user found for the given phone number": + "ما لقينا مستخدم بهاد الرقم", + "This price is": "هذا السعر هو", + "Work": "العمل", + "Add Home": "إضافة البيت", + "Notifications": "الإشعارات", + "💳 Pay with Credit Card": "💳 الدفع بالبطاقة الائتمانية", + "⚠️ You need to choose an amount!": "⚠️ لازم تختار مبلغ!", + "💰 Pay with Wallet": "💰 الدفع بالمحفظة", + "You must restart the app to change the language.": + "لازم ترجع تشغل التطبيق لتتغير اللغة.", + "joined": "انضم", + "Driver joined the channel": "الكابتن انضم إلى القناة", + "Driver left the channel": "الكابتن غادر القناة", + "Call Page": "صفحة الاتصال", + "Call Left": "مكالمات متبقية", + " Next as Cash !": " المشوار التاني كاش!", + "To use Wallet charge it": "لتستخدم المحفظة، لازم تشحنها", + "We are searching for the nearest driver to you": + "عم ندورلك على أقرب كابتن", + "Best choice for cities": "الخيار الأفضل للمدن", + "Rayeh Gai: Round trip service for convenient travel between cities, easy and reliable.": + "رايح جاي: خدمة ذهاب وإياب مريحة بين المدن، سهلة وموثوقة.", + "This trip is for women only": "هاد المشوار للبنات بس", + "Total budgets on month": "إجمالي الميزانية الشهرية", + "You have call from driver": "عندك مكالمة من الكابتن", + "Intaleq": "انطلق", + "passenger agreement": "اتفاقية الراكب", + "To become a passenger, you must review and agree to the ": + "لتصير راكب معنا، لازم تشوف وتوافق على", + "agreement subtitle": + "لتقدر تكمل، لازم تشوف شروط الاستخدام وسياسة الخصوصية وتوافق عليهن.", + "terms of use": "شروط الاستخدام", + " and acknowledge our Privacy Policy.": + "والإقرار بسياسة الخصوصية الخاصة بنا.", + "and acknowledge our": "والإقرار بـ", + "privacy policy": "سياسة الخصوصية.", + "i agree": "أوافق على الشروط والأحكام", + "Driver already has 2 trips within the specified period.": + "لدى الكابتن رحلتان بالفعل خلال الفترة المحددة.", + "The invitation was sent successfully": "انبعتت الدعوة تمام", + "You should select your country": "لازم تنقي بلدك", + "Scooter": "سكوتر", + "A trip with a prior reservation, allowing you to choose the best captains and cars.": + "مشوار بحجز مسبق، بيخليك تنقي أحسن الكباتن والسيارات.", + "Mishwar Vip": "مشوار VIP", + "The driver waiting you in picked location .": + "الكابتن ناطرك بمكان الانطلاق.", + "About Us": "من نحن", + "You can change the vibration feedback for all buttons": + "فيك تغير اهتزاز الأزرار من هون", + "Most Secure Methods": "أكثر الطرق أماناً", + "In-App VOIP Calls": "مكالمات صوتية داخل التطبيق", + "Recorded Trips for Safety": "رحلات مسجلة للأمان", + "\nWe also prioritize affordability, offering competitive pricing to make your rides accessible.": + "\nنهتم أيضاً بأن تكون الأسعار مناسبة للجميع، حيث نقدم أسعاراً تنافسية لجعل رحلاتك في متناول اليد.", + "Intaleq is a ride-sharing app designed with your safety and affordability in mind. We connect you with reliable drivers in your area, ensuring a convenient and stress-free travel experience.\n\nHere are some of the key features that set us apart:": + "انطلق هو تطبيق لمشاركة الرحلات مصمم مع الأخذ بعين الاعتبار سلامتك وميزانيتك. نصلك بكباتن موثوقين في منطقتك، لنضمن لك تجربة تنقل مريحة وخالية من التوتر.\n\nإليك بعض الميزات الرئيسية التي تميزنا:", + "Sign In by Apple": "الدخول عبر Apple", + "Sign In by Google": "الدخول عبر Google", + "How do I request a ride?": "كيف أطلب رحلة؟", + "Step-by-step instructions on how to request a ride through the Intaleq app.": + "شرح خطوة بخطوة كيف تطلب مشوار من تطبيق انطلق.", + "What types of vehicles are available?": "شو أنواع السيارات المتاحة؟", + "Intaleq offers a variety of vehicle options to suit your needs, including economy, comfort, and luxury. Choose the option that best fits your budget and passenger count.": + "انطلق بيوفرلك أنواع سيارات بتناسبك، منها التوفير والراحة والـ VIP. نقي الخيار اللي بيناسب جيبتك وعددكم.", + "How can I pay for my ride?": "كيف فيني ادفع حق المشوار؟", + "Intaleq offers multiple payment methods for your convenience. Choose between cash payment or credit/debit card payment during ride confirmation.": + "انطلق بيوفرلك كذا طريقة دفع لتريحك. نقي بين الكاش أو كرت البنك وقت تأكيد المشوار.", + "Can I cancel my ride?": "فيني كنسل مشواري؟", + "Yes, you can cancel your ride under certain conditions (e.g., before driver is assigned). See the Intaleq cancellation policy for details.": + "إي فيك، بس بشروط معينة (مثلاً قبل ما يوافق الكابتن). شوف سياسة الإلغاء لتعرف التفاصيل.", + "Driver Registration & Requirements": "تسجيل الكباتن والمتطلبات", + "How can I register as a driver?": "كيف فيني سجل ككابتن؟", + "What are the requirements to become a driver?": + "شو الطلبات لتصير كابتن؟", + "Visit our website or contact Intaleq support for information on driver registration and requirements.": + "زور موقعنا أو حاكي الدعم لتعرف أكتر عن تسجيل الكباتن.", + "Intaleq provides in-app chat functionality to allow you to communicate with your driver or passenger during your ride.": + "انطلق فيه شات بقلب التطبيق لتدردش مع الكابتن أو الراكب بأي وقت.", + "Intaleq prioritizes your safety. We offer features like driver verification, in-app trip tracking, and emergency contact options.": + "سلامتك هي الأهم عنا. بنوفرلك ميزات مثل التأكد من الكابتن، تتبع المشوار، وأرقام الطوارئ.", + "Frequently Questions": "الأسئلة الشائعة", + "User does not exist.": "المستخدم مو موجود.", + "We need your phone number to contact you and to help you.": + "بدنا رقم موبايلك لنحاكيك ونساعدك.", + "You will recieve code in sms message": "رح يوصلك كود برسالة SMS", + "Please enter": "يا ريت تدخل", + "We need your phone number to contact you and to help you receive orders.": + "بدنا رقم موبايلك لنحاكيك ونساعدك باستلام الطلبات.", + "The full name on your criminal record does not match the one on your driver's license. Please verify and provide the correct documents.": + "الاسم بـ 'لا حكم عليه' مو نفس اللي بالرخصة. تأكد وبعتلنا الوراق الصح.", + "The national number on your driver's license does not match the one on your ID document. Please verify and provide the correct documents.": + "الرقم الوطني بالرخصة مو نفسه اللي بالهوية. تأكد وبعتلنا الوراق الصح.", + "Capture an Image of Your Criminal Record": + "صور ورقة الـ 'لا حكم عليه'", + "IssueDate": "تاريخ الإصدار", + "Capture an Image of Your car license front": "صور وش رخصة السيارة", + "Capture an Image of Your ID Document front": "صور وش هويتك", + "NationalID": "الرقم الوطني", + "You can share the Intaleq App with your friends and earn rewards for rides they take using your code": + "فيك تشارك تطبيق انطلق مع رفقاتك وتربح مكافآت ع المشارير اللي بيعملوها بكودك.", + "FullName": "الاسم الكامل", + "No invitation found yet!": "لسا ما في دعوات!", + "InspectionResult": "نتيجة الفحص", + "Criminal Record": "لا حكم عليه", + "The email or phone number is already registered.": + "الإيميل أو رقم الموبايل مسجل من قبل.", + "To become a ride-sharing driver on the Intaleq app, you need to upload your driver's license, ID document, and car registration document. Our AI system will instantly review and verify their authenticity in just 2-3 minutes. If your documents are approved, you can start working as a driver on the Intaleq app. Please note, submitting fraudulent documents is a serious offense and may result in immediate termination and legal consequences.": + "لتصير كابتن بـ انطلق، لازم ترفع رخصتك، وهويتك، ودفتر السيارة. الذكاء الاصطناعي عنا رح يشيك عليهن بخلال دقايق. إذا الوراق تمام، فيك تبلش شغل دغري. بس انتبه، تزوير الوراق مشكلة كبيرة وممكن تسكر حسابك وتلاحقك قانونياً.", + "Documents check": "تشييك الوراق", + "Driver's License": "رخصة القيادة", + "for your first registration!": "لتسجيلك الأول!", + "Get it Now!": "احصل عليه الآن!", + "before": "قبل", + "Code not approved": "الكود مو مقبول", + "3000 LE": "3000 ل.س", + "Do you have an invitation code from another driver?": + "معك كود دعوة من كابتن تاني؟", + "Paste the code here": "لزق الكود هون", + "No, I don't have a code": "لا، ما معي كود", + "Audio uploaded successfully.": "ترفع الصوت تمام.", + "Perfect for passengers seeking the latest car models with the freedom to choose any route they desire": + "مثالي للركاب اللي عم يدوروا على أحدث موديلات السيارات مع حرية نقي أي طريق بدهن ياه", + "Share this code with your friends and earn rewards when they use it!": + "شارك هاد الكود مع رفقاتك واربح مكافآت بس يستخدموه!", + "Enter phone": "دخل الرقم", + "complete, you can claim your gift": "اكتمل، فيك تطلب هديتك هلا", + "When": "عندما", + "Enter driver's phone": "دخل رقم الكابتن", + "Send Invite": "بعت دعوة", + "Show Invitations": "فرجينا الدعوات", + "License Type": "نوع الرخصة", + "National Number": "الرقم الوطني", + "Name (Arabic)": "الاسم (بالعربية)", + "Name (English)": "الاسم (بالإنكليزية)", + "Address": "العنوان", + "Issue Date": "تاريخ الإصدار", + "Expiry Date": "تاريخ الانتهاء", + "License Categories": "فئات الرخصة", + "driver_license": "رخصة القيادة", + "Capture an Image of Your Driver License": "التقط صورة لرخصة قيادتك", + "ID Documents Back": "الوجه الخلفي للهوية", + "National ID": "الرقم الوطني", + "Occupation": "المهنة", + "Religion": "الدين", + "Full Name (Marital)": "الاسم الكامل (حسب الحالة الاجتماعية)", + "Expiration Date": "تاريخ الانتهاء", + "Capture an Image of Your ID Document Back": + "التقط صورة للوجه الخلفي لهويتك", + "ID Documents Front": "الوجه الأمامي للهوية", + "First Name": "الاسم الأول", + "CardID": "رقم البطاقة", + "Vehicle Details Front": "تفاصيل السيارة (من قدام)", + "Plate Number": "رقم اللوحة", + "Owner Name": "اسم المالك", + "Vehicle Details Back": "تفاصيل السيارة (من ورا)", + "Make": "الشركة المصنعة", + "Model": "الموديل", + "Year": "سنة الصنع", + "Chassis": "رقم الشاسيه", + "Color": "اللون", + "Displacement": "سعة المحرك", + "Fuel": "نوع الوقود", + "Tax Expiry Date": "تاريخ انتهاء الضريبة", + "Inspection Date": "تاريخ الفحص", + "Capture an Image of Your car license back": + "التقط صورة للوجه الخلفي لرخصة سيارتك", + "Capture an Image of Your Driver's License": + "التقط صورة لرخصة قيادتك", + "Sign in with Google for easier email and name entry": + "سجل بجوجل لتسهل ع حالك كتابة الاسم والإيميل", + "You will choose allow all the time to be ready receive orders": + "نقي 'السماح طول الوقت' لتكون جاهز تستلم طلبات دغري", + "Get to your destination quickly and easily.": + "وصل لوجهتك بسرعة وسهولة.", + "Enjoy a safe and comfortable ride.": "استمتع بمشوار آمن ومريح.", + "Choose Language": "نقي اللغة", + "Pay with Wallet": "الدفع بالمحفظة", + "Invalid MPIN": "كود MPIN مو صح", + "Invalid OTP": "كود التأكيد مو صح", + "Enter your email address": "دخل إيميلك", + "Please enter Your Email.": "يا ريت تدخل إيميلك.", + "Enter your phone number": "دخل رقم موبايلك", + "Please enter your phone number.": "يا ريت تدخل رقم موبايلك.", + "Please enter Your Password.": "يا ريت تدخل كلمة السر.", + "if you dont have account": "إذا ما عندك حساب", + "Register": "تسجيل", + "Accept Ride's Terms & Review Privacy Notice": + "قبول شروط الرحلة ومراجعة بيان الخصوصية", + "By selecting 'I Agree' below, I have reviewed and agree to the Terms of Use and acknowledge the Privacy Notice. I am at least 18 years of age.": + "باختياري 'أوافق' تحت، بكون شفت ووافقت على شروط الاستخدام وسياسة الخصوصية. وعمري فوق الـ ١٨ سنة.", + "First name": "الاسم الأول", + "Enter your first name": "دخل اسمك الأول", + "Please enter your first name.": "يا ريت تدخل اسمك الأول.", + "Last name": "الاسم الأخير", + "Enter your last name": "دخل اسمك الأخير", + "Please enter your last name.": "يا ريت تدخل كنيتك.", + "City": "المدينة", + "Please enter your City.": "يا ريت تدخل مدينتك.", + "Verify Email": "التحقق من البريد الإلكتروني", + "We sent 5 digit to your Email provided": + "بعتنا كود من ٥ أرقام لإيميلك", + "5 digit": "5 أرقام", + "Send Verification Code": "بعت كود التأكيد", + "Your Ride Duration is ": "مدة رحلتك هي ", + "You will be thier in": "رح توصل بخلال", + "You trip distance is": "مسافة رحلتك هي", + "Fee is": "الأجرة هي", + "From : ": "من: ", + "To : ": "إلى: ", + "Add Promo": "إضافة عرض", + "Confirm Selection": "تأكيد الاختيار", + "distance is": "المسافة هي", + "Privacy Policy": "سياسة الخصوصية", + "Intaleq LLC": "شركة انطلق", + "Syria's pioneering ride-sharing service, proudly developed by Arabian and local owners. We prioritize being near you – both our valued passengers and our dedicated captains.": + "خدمة مشاركة المشاوير الأولى بسوريا، تفيدنا إنه نكون معك قريبين، سواء كنت راكب أو كابتن من كباتننا الغاليين.", + "Intaleq is the first ride-sharing app in Syria, designed to connect you with the nearest drivers for a quick and convenient travel experience.": + "انطلق هو أول تطبيق لمشاركة المشاوير بسوريا، مصمم ليوصلك بأقرب كابتن مشان توصل بسرعة وراحة.", + "Why Choose Intaleq?": "ليش تنقي انطلق؟", + "Closest to You": "أقرب شي إلك", + "We connect you with the nearest drivers for faster pickups and quicker journeys.": + "منوصلك بأقرب كابتن لتصل أسرع ومشاريرك تكون أسرع.", + "Uncompromising Security": "أمان تام", + "Lady Captains Available": "في كباتن بنات كمان", + "Recorded Trips (Voice & AI Analysis)": + "رحلات مسجلة (تحليل صوتي وذكاء اصطناعي)", + "Fastest Complaint Response": "أسرع استجابة للشكاوى", + "Our dedicated customer service team ensures swift resolution of any issues.": + "فريقنا بخدمة الزباين بضمنلك حل سريع لأي مشكلة بتواجهك.", + "Affordable for Everyone": "أسعار مناسبة للجميع", + "Frequently Asked Questions": "الأسئلة الشائعة", + "Getting Started": "البداية", + "Simply open the Intaleq app, enter your destination, and tap \"Request Ride\". The app will connect you with a nearby driver.": + "بس افتح تطبيق انطلق، دخل لوين بدك تروح، واضغط \"اطلب مشوار\". التطبيق دغري رح يوصلك بكابتن قريب.", + "Vehicle Options": "خيارات المركبات", + "Intaleq offers a variety of options including Economy, Comfort, and Luxury to suit your needs and budget.": + "انطلق بيقدم كذا خيار مثل التوفير والراحة والـ VIP لتنقي اللي بيناسب جيبتك.", + "Payments": "الدفع", + "You can pay for your ride using cash or credit/debit card. You can select your preferred payment method before confirming your ride.": + "فيك تدفع حق المشوار كاش أو بكرت البنك. نقي الطريقة اللي بتريحك قبل ما تأكد المشوار.", + "Ride Management": "إدارة الرحلات", + "Yes, you can cancel your ride, but please note that cancellation fees may apply depending on how far in advance you cancel.": + "إي فيك تكنسل المشوار، بس يمكن تنحسب عليك رسوم إلغاء حسب إيمتى كنسلت.", + "For Drivers": "للكباتن", + "Driver Registration": "تسجيل الكابتن", + "To register as a driver or learn about the requirements, please visit our website or contact Intaleq support directly.": + "لتسجل ككابتن أو لتعرف الشروط، يا ريت تزور موقعنا أو تحاكي الدعم عنا دغري.", + "Visit Website/Contact Support": "زيارة الموقع / التواصل مع الدعم", + "Close": "إغلاق", + "We are searching for the nearest driver": "عم ندور على أقرب كابتن", + "Communication": "التواصل", + "How do I communicate with the other party (passenger/driver)?": + "كيف فيني أحاكي الراكب أو الكابتن؟", + "You can communicate with your driver or passenger through the in-app chat feature once a ride is confirmed.": + "فيك تحاكي الكابتن أو الراكب من الشات اللي بقلب التطبيق بس يتأكد المشوار.", + "Safety & Security": "السلامة والأمان", + "What safety measures does Intaleq offer?": + "شو ميزات الأمان اللي بيقدمها انطلق؟", + "Intaleq offers various safety features including driver verification, in-app trip tracking, emergency contact options, and the ability to share your trip status with trusted contacts.": + "انطلق بيوفرلك ميزات أمان كتير، مثل التأكد من الكابتن، تتبع المشوار، أرقام الطوارئ، وفيك تشارك مشوارك مع رفقاتك ليتطمنوا عليك.", + "Enjoy competitive prices across all trip options, making travel accessible.": + "استمتع بأسعار تنافسية لجميع خيارات الرحلات، مما يجعل التنقل في متناول الجميع.", + "Variety of Trip Choices": "تنوع خيارات الرحلات", + "Choose the trip option that perfectly suits your needs and preferences.": + "نقي نوع المشوار اللي بيناسبك وبيريحك.", + "Your Choice, Our Priority": "اختيارك أولويتنا", + "Because we are near, you have the flexibility to choose the ride that works best for you.": + "لأننا موجودين هون وقريبين منك، فيك تنقي المشوار اللي بريحك.", + "duration is": "المدة هي", + "Setting": "الإعدادات", + "Find answers to common questions": "ابحث عن إجابات للأسئلة الشائعة", + "I don't need a ride anymore": "ما بقا بدي مشوار", + "I was just trying the application": "عم جرب التطبيق بس", + "No driver accepted my request": "ما حدا من الكباتن وافق على طلبي", + "I added the wrong pick-up/drop-off location": "دخلت لوكيشن غلط", + "I don't have a reason": "ما في سبب معين", + "Can we know why you want to cancel Ride ?": + "فيك تقلنا ليش بدك تكنسل المشوار؟", + "Add Payment Method": "إضافة طريقة دفع", + "Ride Wallet": "محفظة الرحلة", + "Payment Method": "طريقة الدفع", + "Type here Place": "اكتب المكان هون", + "Are You sure to ride to": "متأكد بدك تروح لـ", + "Confirm": "تأكيد", + "You are Delete": "أنت تحذف", + "Deleted": "تم الحذف", + "You Dont Have Any places yet !": "لسا ما عندك أماكن!", + "From : Current Location": "من: الموقع الحالي", + "My Cared": "بطاقاتي", + "Add Card": "إضافة بطاقة", + "Add Credit Card": "إضافة بطاقة ائتمانية", + "Please enter the cardholder name": "الرجاء إدخال اسم صاحب البطاقة", + "Please enter the expiry date": "الرجاء إدخال تاريخ انتهاء الصلاحية", + "Please enter the CVV code": "الرجاء إدخال رمز CVV", + "Go To Favorite Places": "الذهاب إلى الأماكن المفضلة", + "Go to this Target": "اذهب إلى هذه الوجهة", + "My Profile": "ملفي الشخصي", + "Are you want to go to this site": "بدك تروح لهاد اللوكيشن؟", + "MyLocation": "موقعي", + "my location": "موقعي", + "Target": "الوجهة", + "You Should choose rate figure": "لازم تنقي تقييم", + "Login Captin": "تسجيل دخول الكابتن", + "Register Captin": "تسجيل كابتن", + "Send Verfication Code": "بعت كود التأكيد", + "KM": "كم", + "End Ride": "إنهاء المشوار", + "Minute": "دقيقة", + "Go to passenger Location now": "روح لعند الراكب هلا", + "Duration of the Ride is ": "مدة المشوار ", + "Distance of the Ride is ": "مسافة المشوار ", + "Name of the Passenger is ": "اسم الراكب ", + "Hello this is Captain": "أهلاً، معك الكابتن", + "Start the Ride": "بلش المشوار", + "Please Wait If passenger want To Cancel!": + "يا ريت تنطر شوي لبين ما نشوف إذا الراكب رح يكنسل!", + "Total Duration:": "المدة الإجمالية:", + "Active Duration:": "المدة النشطة:", + "Waiting for Captin ...": "بانتظار الكابتن...", + "Age is ": "العمر: ", + "Rating is ": "التقييم: ", + " to arrive you.": "للوصول إليك.", + "Tariff": "التعرفة", + "Settings": "الإعدادات", + "Feed Back": "التقييمات", + "Please enter a valid 16-digit card number": + "يا ريت تدخل رقم كرت صح من ١٦ رقم", + "Add Phone": "إضافة رقم", + "Please enter a phone number": "يا ريت تدخل رقم موبايل", + "You dont Add Emergency Phone Yet!": "لسا ما ضفت رقم طوارئ!", + "You will arrive to your destination after ": "رح تصل لوجهتك بعد ", + "You can cancel Ride now": "فيك تكنسل المشوار هلا", + "You Can cancel Ride After Captain did not come in the time": + "فيك تكنسل المشوار إذا ما وصل الكابتن ع الوقت", + "If you in Car Now. Press Start The Ride": + "إذا صرت بالسيارة هلا، اضغط على 'بلش المشوار'", + "You Dont Have Any amount in": "ما عندك رصيد بـ", + "Wallet!": "المحفظة!", + "You Have": "لديك", + "Save Credit Card": "حفظ البطاقة الائتمانية", + "Show Promos": "عرض العروض", + "10 and get 4% discount": "10 واحصل على خصم 4%", + "20 and get 6% discount": "20 واحصل على خصم 6%", + "40 and get 8% discount": "40 واحصل على خصم 8%", + "100 and get 11% discount": "100 واحصل على خصم 11%", + "Pay with Your PayPal": "ادفع عبر PayPal", + "You will choose one of above !": "اختر أحد الخيارات أعلاه!", + "Edit Profile": "تعديل الملف الشخصي", + "Copy this Promo to use it in your Ride!": + "انسخ هاد العرض واستخدمه بمشوارك!", + "To change some Settings": "لتغيير بعض الإعدادات", + "Order Request Page": "صفحة طلب الرحلة", + "Rouats of Trip": "مسارات الرحلة", + "Passenger Name is ": "اسم الراكب: ", + "Total From Passenger is ": "الإجمالي من الراكب: ", + "Duration To Passenger is ": "المدة للوصول للراكب: ", + "Distance To Passenger is ": "المسافة للوصول للراكب: ", + "Total For You is ": "الإجمالي لك: ", + "Distance is ": "المسافة: ", + " KM": " كم", + "Duration of Trip is ": "مدة الرحلة: ", + " Minutes": " دقائق", + "Apply Order": "قبول الطلب", + "Refuse Order": "رفض الطلب", + "Rate Captain": "تقييم الكابتن", + "Enter your Note": "أدخل ملاحظتك", + "Type something...": "اكتب شيئاً...", + "Submit rating": "بعت التقييم", + "Rate Passenger": "تقييم الراكب", + "Ride Summary": "ملخص الرحلة", + "welcome_message": "يا مية أهلاً بك بـ انطلق!", + "app_description": + "انطلق هو تطبيق لمشاركة المشاوير، موثوق، آمن، وجيبتك بتتحمله.", + "get_to_destination": "وصل لوجهتك بسرعة وسهولة.", + "get_a_ride": "مع انطلق، رح تلاقي حدا يوصلك لوجهتك بدقايق.", + "safe_and_comfortable": "استمتع برحلة آمنة ومريحة.", + "committed_to_safety": + "انطلق بيهمها سلامتك، وكل كباتننا منشيك عليهن وبالفحص الدقيق.", + "your ride is Accepted": "انقبل مشوارك", + "Driver is waiting at pickup.": "الكابتن ناطرك بمكان الانطلاق.", + "Driver is on the way": "الكابتن ع الطريق", + "Contact Options": "خيارات التواصل", + "Send a custom message": "إرسال رسالة مخصصة", + "Type your message": "اكتب رسالتك", + "I will go now": "صرت طالع", + "You Have Tips": "لديك إكرامية", + " tips\nTotal is": " إكرامية\nالإجمالي هو", + "Your fee is ": "أجرتك هي ", + "Do you want to pay Tips for this Driver": + "بدك تدفع إكرامية لهاد الكابتن؟", + "Tip is ": "الإكرامية: ", + "Are you want to wait drivers to accept your order": + "بدك تنطر الكباتن لبين ما حدا يقبل طلبك؟", + "This price is fixed even if the route changes for the driver.": + "هذا السعر ثابت حتى لو تغير مسار الكابتن.", + "The price may increase if the route changes.": + "قد يرتفع السعر إذا تغير المسار.", + "The captain is responsible for the route.": + "الكابتن هو المسؤول عن المسار.", + "We are search for nearst driver": "عم ندور على أقرب كابتن", + "Your order is being prepared": "طلبك عم يجهز", + "The drivers are reviewing your request": "الكباتن عم يشوفوا طلبك", + "Your order sent to drivers": "انبعت طلبك للكباتن", + "You can call or record audio of this trip": + "فيك تدق أو تسجل صوت بهاد المشوار", + "The trip has started! Feel free to contact emergency numbers, share your trip, or activate voice recording for the journey": + "بلش المشوار! فيك هلا تدق للطوارئ، أو تشارك مشوارك، أو تشغل تسجيل الصوت.", + "Camera Access Denied.": "الكاميرا انرفضت.", + "Open Settings": "فتح الإعدادات", + "GPS Required Allow !.": "لازم تشغل الـ GPS!", + "Your Account is Deleted": "انمسح حسابك", + "Are you sure to delete your account?": "متأكد بدك تمسح حسابك؟", + "Your data will be erased after 2 weeks\nAnd you will can't return to use app after 1 month ": + "رح نمسح بياناتك بعد أسبوعين\nوما رح فيك ترجع تستخدم التطبيق بعد شهر واحد.", + "Enter Your First Name": "دخل اسمك الأول", + "Are you Sure to LogOut?": "متأكد بدك تسجل خروج؟", + "Email Wrong": "البريد الإلكتروني خاطئ", + "Email you inserted is Wrong.": "الإيميل اللي دخلته غلط.", + "You have finished all times ": "خلصت كل المحاولات اللي إلك", + "if you want help you can email us here": + "إذا بدك مساعدة فيك تراسلنا من هون", + "Thanks": "شكراً", + "Email Us": "راسلنا عبر البريد الإلكتروني", + "I cant register in your app in face detection ": + "ما عم بقدر سجل بالتطبيق مشان مشكلة بصورة الوش", + "Hi": "مرحباً", + "No face detected": "لم يتم التعرف على أي وجه", + "Image detecting result is ": "نتيجة فحص الصورة هي ", + "from 3 times Take Attention": "من 3 محاولات، انتبه", + "Be sure for take accurate images please\nYou have": + "يا ريت تتأكد من ووضوح الصورة\nعندك", + "image verified": "تم التحقق من الصورة", + "Next": "التالي", + "There is no help Question here": "ما في سؤال مساعدة هون", + "You dont have Points": "ما عندك نقاط", + "You Are Stopped For this Day !": "وقفت لليوم!", + "You must be charge your Account": "يجب عليك شحن حسابك", + "You Refused 3 Rides this Day that is the reason \nSee you Tomorrow!": + "رفضت ٣ مشارير اليوم، مشان هيك توقفت.\nمنشوفك بكرا!", + "Recharge my Account": "عبي رصيد حسابي", + "Ok , See you Tomorrow": "حسناً، أراك غداً", + "You are Stopped": "أنت موقوف", + "Connected": "متصل", + "Not Connected": "غير متصل", + "Your are far from passenger location": "أنت بعيد عن موقع الراكب", + "go to your passenger location before\nPassenger cancel trip": + "روح لعند الراكب قبل ما يكنسل المشوار", + "You will get cost of your work for this trip": + "رح تاخد حق تعبك بهاد المشوار", + " in your wallet": "في محفظتك", + "you gain": "لقد ربحت", + "Order Cancelled by Passenger": "الراكب كنسل الطلب", + "Feedback data saved successfully": "تم حفظ التقييم بنجاح", + "No Promo for today .": "ما في عرض لليوم.", + "Select your destination": "نقي وجهتك", + "Search for your Start point": "دور على من وين بدك تطلع", + "Search for waypoint": "دور على نقطة توقف", + "Current Location": "الموقع الحالي", + "Add Location 1": "إضافة موقع 1", + "You must Verify email !.": "لازم تتأكد من الإيميل!", + "Cropper": "قص الصورة", + "Saved Sucssefully": "تم الحفظ بنجاح", + "Select Date": "اختر التاريخ", + "Birth Date": "تاريخ الميلاد", + "Ok": "حسناً", + "the 500 points equal 30 JOD": "500 نقطة تساوي 30 ديناراً أردنياً", + "the 500 points equal 30 JOD for you \nSo go and gain your money": + "500 نقطة تساوي 30 ديناراً أردنياً لك\nاذهب الآن واكسب أموالك", + "token updated": "تم تحديث الرمز", + "Add Location 2": "إضافة موقع 2", + "Add Location 3": "إضافة موقع 3", + "Add Location 4": "إضافة موقع 4", + "Waiting for your location": "بانتظار موقعك", + "Search for your destination": "دور لوين بدك تروح", + "Hi! This is": "مرحباً! هذا", + " I am using": " أنا أستخدم", + " to ride with": " للتنقل مع", + " as the driver.": " ككابتن.", + "is driving a ": "يقود سيارة ", + " with license plate ": " رقم لوحتها ", + " I am currently located at ": " أنا حالياً في ", + "Please go to Car now ": "يا ريت تروح ع السيارة هلا", + "You will receive a code in WhatsApp Messenger": + "رح يوصلك الكود ع الواتساب", + "If you need assistance, contact us": "إذا بدك مساعدة، حاكينا", + "Promo Ended": "انتهى العرض", + "Enter the promo code and get": "دخل كود الخصم وخد", + "DISCOUNT": "خصم", + "No wallet record found": "لم يتم العثور على سجل للمحفظة", + "for": "لـ", + "Intaleq is the safest ride-sharing app that introduces many features for both captains and passengers. We offer the lowest commission rate of just 8%, ensuring you get the best value for your rides. Our app includes insurance for the best captains, regular maintenance of cars with top engineers, and on-road services to ensure a respectful and high-quality experience for all users.": + "انطلق هو تطبيق مشاركة الرحلات الأكثر أماناً، ويقدم ميزات عديدة للكباتن والركاب. نقدم أقل نسبة عمولة، 8% فقط، لنضمن لك أفضل قيمة لرحلاتك. يشمل تطبيقنا تأميناً لأفضل الكباتن، صيانة دورية للسيارات مع أفضل المهندسين، وخدمات على الطريق لتجربة محترمة وعالية الجودة لجميع المستخدمين.", + "You can contact us during working hours from 12:00 - 19:00.": + "فيك تحاكينا بأوقات الشغل من ١٠ للـ ٤.", + "Choose a contact option": "نقي كيف بدك تحاكينا", + "Work time is from 12:00 - 19:00.\nYou can send a WhatsApp message or email.": + "أوقات الشغل من ١٠ الصبح للـ ٤ المسا.\nفيك تبعت واتساب أو إيميل.", + "Promo code copied to clipboard!": "تم نسخ رمز العرض إلى الحافظة!", + "Copy Code": "نسخ الرمز", + "Your invite code was successfully applied!": + "تم تطبيق رمز دعوتك بنجاح!", + "Payment Options": "خيارات الدفع", + "wait 1 minute to receive message": + "انطر دقيقة لبين ما توصلك الرسالة", + "You have copied the promo code.": "لقد نسخت رمز العرض.", + "Select Payment Amount": "نقي شقد بدك تدفع", + "The promotion period has ended.": "لقد انتهت فترة العرض.", + "Promo Code Accepted": "تم قبول رمز العرض", + "Tap on the promo code to copy it!": "اضغط ع الكود لتنسخه!", + "Lowest Price Achieved": "تم الوصول لأقل سعر", + "Cannot apply further discounts.": + "لا يمكن تطبيق المزيد من الخصومات.", + "Promo Already Used": "تم استخدام العرض مسبقاً", + "Invitation Used": "تم استخدام الدعوة", + "You have already used this promo code.": + "لقد استخدمت هذا العرض مسبقاً.", + "Insert Your Promo Code": "أدخل رمز العرض الخاص بك", + "Enter promo code here": "دخل كود الخصم هون", + "Please enter a valid promo code": "يا ريت تدخل كود صح", + "Awfar Car": "سيارة أوفر", + "Old and affordable, perfect for budget rides.": + "قديمة وجيبتك بتتحملها، ممتازة لتوفير المصاري.", + " If you need to reach me, please contact the driver directly at": + "إذا بدك تحاكيني، دق للكابتن دغري على", + "No Car or Driver Found in your area.": + "ما لقينا سيارات أو كباتن بمنطقتك.", + "Please Try anther time ": "جرب مرة تانية بعد شوي ", + "There no Driver Aplly your order sorry for that ": + "ما حدا من الكباتن قدم ع طلبك، منعتذر منك", + "Trip Cancelled": "تكنسل المشوار", + "The Driver Will be in your location soon .": + "الكابتن رح يوصل لعندك بعد شوي.", + "The distance less than 500 meter.": "المسافة أقل من ٥٠٠ متر.", + "Promo End !": "خلص العرض!", + "There is no notification yet": "لسا ما في إشعارات", + "Use Touch ID or Face ID to confirm payment": + "استخدم البصمة أو الوش لتأكد الدفع", + "Contact us for any questions on your order.": + "حاكينا لأي سؤال مشان طلبك.", + "Pyament Cancelled .": "تكنسل الدفع.", + "type here": "اكتب هون", + "Scan Driver License": "مسح رخصة القيادة", + "Please put your licence in these border": + "يا ريت تحط رخصتك بقلب هاد المربع", + "Camera not initialized yet": "الكاميرا لسا ما اشتغلت", + "Take Image": "صور", + "AI Page": "صفحة الذكاء الاصطناعي", + "Take Picture Of ID Card": "صور الهوية", + "Take Picture Of Driver License Card": "صور رخصة القيادة", + "We are process picture please wait ": "عم نشيك ع الصورة، انطر شوي", + "There is no data yet.": "لسا ما في بيانات.", + "Name :": "الاسم:", + "Drivers License Class: ": "فئة الرخصة:", + "Document Number: ": "رقم الوثيقة:", + "Address: ": "العنوان:", + "Height: ": "الطول:", + "Expiry Date: ": "تاريخ الانتهاء:", + "Date of Birth: ": "تاريخ الميلاد:", + "You can't continue with us .\nYou should renew Driver license": + "ما فيك تكمل معنا.\nلازم تجدد الرخصة", + "Detect Your Face ": "التحقق من وجهك", + "Go to next step\nscan Car License.": + "روح ع الخطوة اللي بعدها\nصور رخصة السيارة.", + "Name in arabic": "الاسم بالعربية", + "Drivers License Class": "فئة رخصة القيادة", + "Selected Date": "التاريخ المحدد", + "Select Time": "نقي الوقت", + "Selected Time": "الوقت المحدد", + "Selected Date and Time": "التاريخ والوقت المحددان", + "Lets check Car license ": "خلونا نشيك ع رخصة السيارة", + "Car": "سيارة", + "Plate": "لوحة", + "Rides": "مشارير", + "Selected driver": "الكابتن المختار", + "Lets check License Back Face": "خلونا نشيك ع قفا الرخصة", + "Car License Card": "رخصة السيارة", + "No image selected yet": "لسا ما نقيت صورة", + "Made :": "الصنع:", + "model :": "الموديل:", + "VIN :": "رقم الهيكل:", + "year :": "السنة:", + "ُExpire Date": "تاريخ الانتهاء", + "Login Driver": "دخول الكابتن", + "Password must br at least 6 character.": + "كلمة السر لازم تكون ٦ أحرف ع الأقل.", + "if you don't have account": "إذا ما عندك حساب", + "Here recorded trips audio": "هون تسجيلات الصوت للمشارير", + "Register as Driver": "التسجيل ككابتن", + "By selecting \"I Agree\" below, I have reviewed and agree to the Terms of Use and acknowledge the ": + "بضغطة ع \"أوافق\" تحت، بكون شفت ووافقت على شروط الاستخدام وبقر بـ", + "Log Out Page": "صفحة تسجيل الخروج", + "Log Off": "تسجيل الخروج", + "Register Driver": "تسجيل كابتن", + "Verify Email For Driver": "تأكيد إيميل الكابتن", + "Admin DashBoard": "لوحة تحكم المشرف", + "Your name": "اسمك", + "your ride is applied": "تم قبول مشوارك", + "H and": "س و", + "JOD": "دينار", + "m": "د", + "We search nearst Driver to you": "عم ندورلك ع أقرب كابتن", + "please wait till driver accept your order": + "انطر شوي لبين ما كابتن يقبل طلبك", + "No accepted orders? Try raising your trip fee to attract riders.": + "ما حدا قبل؟ جرب ترفع الأجرة شوي لتشجع الكباتن.", + "You should select one": "لازم تنقي واحد", + "The driver accept your order for": "الكابتن قبل طلبك مقابل", + "The driver on your way": "الكابتن جاي لعندك", + "Total price from ": "السعر الإجمالي من ", + "Order Details Intaleq": "تفاصيل طلب انطلق", + "Selected file:": "الملف المختار:", + "Your trip cost is": "تكلفة مشوارك هي", + "this will delete all files from your device": + "هاد رح يمسح كل الملفات من موبايلك", + "Exclusive offers and discounts always with the Intaleq app": + "عروض وخصومات حصرية دايماً مع انطلق", + "Submit Question": "بعت السؤال", + "Please enter your Question.": "يا ريت تدخل سؤالك.", + "Help Details": "تفاصيل المساعدة", + "No trip yet found": "ما في مشوار لسا", + "No Response yet.": "لسا ما في رد.", + " You Earn today is ": "أرباحك اليوم هي ", + " You Have in": " عندك بـ", + "Total points is ": "إجمالي النقاط: ", + "Total Connection Duration:": "إجمالي مدة الاتصال:", + "Passenger name : ": "اسم الراكب: ", + "Cost Of Trip IS ": "تكلفة المشوار: ", + "Arrival time": "وقت الوصول", + "arrival time to reach your point": "وقت الوصول لوجهتك", + "For Intaleq and scooter trips, the price is calculated dynamically. For Comfort trips, the price is based on time and distance": + "لمشارير انطلق والسكوتر، السعر بيتغير. وبمشارير الراحة، السعر بيعتمد ع الوقت والمسافة.", + "Hello this is Driver": "أهلاً، معك الكابتن", + "Is the Passenger in your Car ?": "الراكب صر بقلب سيارتك؟", + "Please wait for the passenger to enter the car before starting the trip.": + "يا ريت تنطر الراكب ليركب بالسيارة قبل ما تبلش المشوار.", + "No ,still Waiting.": "لا، لسا عم انطر.", + "I arrive you": "صرت عندك", + "I Arrive your site": "أنا وصلت لعندك", + "You are not in near to passenger location": + "أنت مو قريب من مكان الراكب", + "please go to picker location exactly": + "يا ريت تروح ع اللوكيشن بالظبط", + "You Can Cancel Trip And get Cost of Trip From": + "فيك تكنسل المشوار وتاخد حقه من", + "Are you sure to cancel?": "متأكد بدك تكنسل؟", + "Insert Emergincy Number": "دخل رقم الطوارئ", + "Best choice for comfort car and flexible route and stops point": + "أحسن خيار لسيارة مريحة وطريق مرن ونقاط توقف", + "Insert": "إدخال", + "This is for scooter or a motorcycle.": "هاد للسكوتر أو الموتور.", + "This trip goes directly from your starting point to your destination for a fixed price. The driver must follow the planned route": + "هاد المشوار دغري من مكانك للوجهة بسعر ثابت. والكابتن لازم يلحق الطريق المحدد.", + "You can decline a request without any cost": + "فيك ترفض الطلب بلا ما تخسر شي", + "Perfect for adventure seekers who want to experience something new and exciting": + "ممتاز للي بيحبوا المغامرة وبدهن يجربوا شي جديد بياخد العقل", + "My current location is:": "موقعي الحالي هو:", + "and I have a trip on": "وعندي مشوار ع", + "App with Passenger": "التطبيق مع الراكب", + "You will be pay the cost to driver or we will get it from you on next trip": + "رح تدفع التكلفة للكابتن أو بناخدها منك المشوار الجاي", + "Trip has Steps": "المشوار إله كذا وجهة", + "Distance from Passenger to destination is ": + "المسافة من الراكب للوجهة: ", + "price is": "السعر هو", + "This ride type does not allow changes to the destination or additional stops": + "هاد النوع من المشارير ما فيه تغيير للوجهة أو نقاط توقف زيادة", + "This price may be changed": "ممكن يتغير هاد السعر", + "No SIM card, no problem! Call your driver directly through our app. We use advanced technology to ensure your privacy.": + "ما بدك سيم! حاكي الكابتن دغري من التطبيق. منستخدم تكنولوجيا متطورة لنحمي خصوصيتك.", + "This ride type allows changes, but the price may increase": + "هاد النوع فيه تغيير، بس ممكن يزيد السعر", + "Select one message": "نقي رسالة وحدة", + "I'm waiting for you": "أنا ناطرك", + "We noticed the Intaleq is exceeding 100 km/h. Please slow down for your safety. If you feel unsafe, you can share your trip details with a contact or call the police using the red SOS button.": + "السرعة زادت عن الميّة. يا ريت تمهل مشان سلامتك. إذا خفت، فيك تشارك مشوارك مع حدا أو تدق للشرطة من زر الطوارئ الأحمر.", + "Warning: Intaleqing detected!": "تحذير: تم كشف سرعة زيادة!", + "Please help! Contact me as soon as possible.": + "ساعدوني! حاكوني بأسرع وقت.", + "Share Trip Details": "مشاركة تفاصيل المشوار", + "Car Plate is ": "رقم لوحة السيارة: ", + "the 300 points equal 300 L.E for you \nSo go and gain your money": + "٣٠٠ نقطة بيسووا ٣٠٠ ليرة إلك\nروح هلا وطلع مصاري", + "the 300 points equal 300 L.E": "٣٠٠ نقطة بيسووا ٣٠٠ ليرة", + "The payment was not approved. Please try again.": + "ما انقبل الدفع. جرب مرة تانية.", + "Payment Failed": "فشل الدفع", + "This is a scheduled notification.": "هاد إشعار مجدول.", + "An error occurred during the payment process.": "صار غلط وقت الدفع.", + "The payment was approved.": "انقبل الدفع تمام.", + "Payment Successful": "تم الدفع بنجاح", + "No ride found yet": "لسا ما في مشارير", + "Accept Order": "قبول الطلب", + "Bottom Bar Example": "مثال الشريط السفلي", + "Driver phone": "رقم الكابتن", + "Statistics": "الإحصائيات", + "Origin": "نقطة الانطلاق", + "Destination": "الوجهة", + "Driver Name": "اسم الكابتن", + "Driver Car Plate": "رقم لوحة الكابتن", + "Available for rides": "متاح للمشارير", + "Scan Id": "مسح الهوية", + "Camera not initilaized yet": "الكاميرا لسا ما اشتغلت", + "Scan ID MklGoogle": "مسح الهوية MklGoogle", + "Language": "اللغة", + "Jordan": "الأردن", + "USA": "أمريكا", + "Egypt": "مصر", + "Turkey": "تركيا", + "Saudi Arabia": "السعودية", + "Qatar": "قطر", + "Bahrain": "البحرين", + "Kuwait": "الكويت", + "But you have a negative salary of": "بس عندك رصيد سالب بـ", + "Promo Code": "كود الخصم", + "Your trip distance is": "مسافة مشوارك هي", + "Enter promo code": "دخل كود الخصم", + "You have promo!": "عندك عرض!", + "Cost Duration": "تكلفة المدة", + "Duration is": "المدة هي", + "Leave": "مغادرة", + "Join": "انضمام", + "Heading your way now. Please be ready.": + "أنا ع الطريق لعندك هلا. خليك جاهز.", + "Approaching your area. Should be there in 3 minutes.": + "قربت لصل لعندك. بعد ٣ دقايق بكون عندك.", + "There's heavy traffic here. Can you suggest an alternate pickup point?": + "في عجقة سير قوية. فيك تقلي نطلع من مكان تاني؟", + "This ride is already taken by another driver.": + "هاد المشوار أخده كابتن تاني.", + "You Should be select reason.": "لازم تنقي السبب.", + "Waiting for Driver ...": "بانتظار الكابتن...", + "Latest Recent Trip": "آخر مشوار", + "from your list": "من قائمتك", + "Do you want to change Work location": "هل تريد تغيير موقع العمل؟", + "Do you want to change Home location": "هل تريد تغيير موقع المنزل؟", + "We Are Sorry That we dont have cars in your Location!": + "نأسف لعدم توفر سيارات في موقعك!", + "Choose from Map": "اختر من الخريطة", + "Pick your ride location on the map - Tap to confirm": + "اختر موقع رحلتك على الخريطة - اضغط للتأكيد", + "Intaleq is the ride-hailing app that is safe, reliable, and accessible.": + "انطلق هو تطبيق طلب السيارات الآمن، الموثوق، وفي متناول اليد.", + "With Intaleq, you can get a ride to your destination in minutes.": + "مع انطلق، يمكنك الوصول إلى وجهتك في دقائق.", + "Intaleq is committed to safety, and all of our captains are carefully screened and background checked.": + "تلتزم انطلق بالسلامة، وجميع كباتننا يتم فحصهم بعناية والتحقق من سجلاتهم.", + "Pick from map": "اختر من الخريطة", + "No Car in your site. Sorry!": "لا توجد سيارة في موقعك. نعتذر!", + "Nearest Car for you about ": "أقرب سيارة لك على بعد ", + "From :": "من:", + "Get Details of Trip": "الحصول على تفاصيل الرحلة", + "If you want add stop click here": + "إذا أردت إضافة نقطة توقف، اضغط هنا", + "Where you want go ": "إلى أين تريد الذهاب؟", + "My Card": "بطاقتي", + "Start Record": "بدء التسجيل", + "History of Trip": "سجل الرحلات", + "Helping Center": "مركز المساعدة", + "Record saved": "انحفظ التسجيل", + "Trips recorded": "المشارير المسجلة", + "Select Your Country": "نقي بلدك", + "To ensure you receive the most accurate information for your location, please select your country below. This will help tailor the app experience and content to your country.": + "مشان توصلك أدق المعلومات لمكانك، يا ريت تنقي بلدك من تحت. هاد بيساعدنا نضبطلك تجربة التطبيق والمحتوى ع كفّك.", + "Are you sure to delete recorded files": "متأكد بدك تمسح التسجيلات؟", + "Select recorded trip": "نقي مشوار مسجل", + "Card Number": "رقم البطاقة", + "Hi, Where to ": "أهلاً، لوين حابب تروح؟", + "Pick your destination from Map": "نقي وجهتك من الخريطة", + "Add Stops": "إضافة نقاط توقف", + "Get Direction": "خد الاتجاهات", + "Add Location": "إضافة موقع", + "Switch Rider": "تبديل الراكب", + "You will arrive to your destination after timer end.": + "رح توصل لوجهتك بس يخلص الوقت.", + "You can cancel trip": "فيك تكنسل المشوار", + "The driver waitting you in picked location .": + "الكابتن ناطرك بمكان الانطلاق.", + "Pay with Your": "ادفع بـ", + "Pay with Credit Card": "الدفع بالكريدت كارد", + "Show Promos to Charge": "عرض العروض لتشحن", + "Point": "نقطة", + "How many hours would you like to wait?": "كم ساعة حابب تنطر؟", + "Driver Wallet": "محفظة الكابتن", + "Choose between those Type Cars": "نقي بين أنواع السيارات هاي", + "hour": "ساعة", + "Select Waiting Hours": "نقي ساعات الانتظار", + "Total Points is": "مجموع النقاط", + "You will receive a code in SMS message": "رح يوصلك كود برسالة نصية", + "Done": "تمام", + "Total Budget from trips is ": "إجمالي الميزانية من المشارير: ", + "Total Amount:": "المبلغ الإجمالي:", + "Total Budget from trips by\nCredit card is ": + "إجمالي الميزانية من المشارير بالكريدت كارد: ", + "This amount for all trip I get from Passengers": + "هاد المبلغ لكل المشارير اللي عم آخدها من الركاب", + "Pay from my budget": "ادفع من ميزانيتي", + "This amount for all trip I get from Passengers and Collected For me in": + "هاد المبلغ لكل المشارير اللي عم آخدها من الركاب والمجمعة عندي بـ", + "You can buy points from your budget": "فيك تشتري نقاط من ميزانيتك", + "insert amount": "حط المبلغ", + "You can buy Points to let you online\nby this list below": + "فيك تشتري نقاط لتكون أونلاين\nمن القائمة اللي تحت", + "Create Wallet to receive your money": "اعمل محفظة لتاخد مصاريك", + "Enter your feedback here": "حط تقييمك هون", + "Please enter your feedback.": "يا ريت تحط تقييمك.", + "Feedback": "تقييم", + "Submit ": "بعت ", + "Click here to Show it in Map": "اضغط هون لتبين ع الخريطة", + "Canceled": "تكنسل", + "No I want": "لا بدي", + "Email is": "الإيميل:", + "Phone Number is": "رقم التلفون:", + "Date of Birth is": "تاريخ الميلاد:", + "Sex is ": "الجنس: ", + "Car Details": "تفاصيل السيارة", + "VIN is": "رقم الهيكل:", + "Color is ": "اللون: ", + "Make is ": "الماركة: ", + "Model is": "الموديل:", + "Year is": "السنة:", + "Expiration Date ": "تاريخ الانتهاء: ", + "Edit Your data": "عدل بياناتك", + "write vin for your car": "اكتب رقم هيكل سيارتك", + "VIN": "رقم الهيكل", + "Please verify your identity": "يا ريت تأكد هويتك", + "write Color for your car": "اكتب لون سيارتك", + "write Make for your car": "اكتب ماركة سيارتك", + "write Model for your car": "اكتب موديل سيارتك", + "write Year for your car": "اكتب سنة سيارتك", + "write Expiration Date for your car": "اكتب تاريخ انتهاء سيارتك", + "Tariffs": "التعرفات", + "Minimum fare": "أقل أجرة", + "Maximum fare": "أكثر أجرة", + "Flag-down fee": "فيتة العداد (البداية)", + "Including Tax": "شامل الضريبة", + "BookingFee": "رسوم الحجز", + "Morning": "صبح", + "from 07:30 till 10:30 (Thursday, Friday, Saturday, Monday)": + "من ٧:٣٠ لـ ١٠:٣٠ (خميس، جمعة، سبت، اثنين)", + "Evening": "مسا", + "from 12:00 till 15:00 (Thursday, Friday, Saturday, Monday)": + "من ١٢:٠٠ لـ ٣:٠٠ (خميس، جمعة، سبت، اثنين)", + "Night": "ليل", + "You have in account": "عندك بالحساب", + "Select Country": "نقي البلد", + "Ride Today : ": "مشوار اليوم: ", + "After this period\nYou can't cancel!": "بعد هالفترة\nما فيك تكنسل!", + "from 23:59 till 05:30": "من ١١:٥٩ لـ ٥:٣٠", + "Rate Driver": "قيم الكابتن", + "Total Cost is ": "التكلفة الكلية: ", + "Write note": "اكتب ملاحظة", + "Time to arrive": "وقت الوصول", + "Ride Summaries": "ملخصات المشارير", + "Total Cost": "التكلفة الكلية", + "Average of Hours of": "متوسط ساعات", + " is ON for this month": " شغال هاد الشهر", + "Days": "أيام", + "Total Hours on month": "إجمالي الساعات بالشهر", + "Counts of Hours on days": "عدد الساعات بالأيام", + "OrderId": "رقم الطلب", + "created time": "وقت الإنشاء", + "Intaleq Over": "خلص مشوار انطلق", + "I will slow down": "رح خفف السرعة", + "Map Passenger": "خريطة الراكب", + "Be Slowly": "تمهل", + "If you want to make Google Map App run directly when you apply order": + "إذا بدك تفتح خرائط جوجل دغري بس تقبل الطلب", + "You can change the language of the app": "فيك تغير لغة التطبيق", + "Your Budget less than needed": "رصيدك ما بيكفي", + "You can change the Country to get all features": + "فيك تغير البلد لتاخد كل الميزات", + "There is no Car or Driver in your area.": + "ما في سيارات أو كباتن بمنطقتك.", + "Change Country": "تغيير البلد", + }, + "ar-main": { + "Syria": "‏سوريا", + "SYP": "ل.س", + "Order": "طلب", + "OrderVIP": "طلب VIP", + "Cancel Trip": "إلغاء الرحلة", + "Passenger Cancel Trip": "الراكب ألغى الرحلة", + "VIP Order": "طلب VIP", + "The driver accepted your trip": "السائق قبل رحلتك", + "message From passenger": "رسالة من الراكب", + "Cancel": "إلغاء", + "Trip Cancelled. The cost of the trip will be added to your wallet.": + "تم إلغاء الرحلة. سيتم إضافة تكلفة الرحلة إلى محفظتك.", + "token change": "تغيير الرمز", + "Changed my mind": "غيرت رأيي", + "Please write the reason...": "يا ريت تكتب السبب...", + "Found another transport": "لقيت وسيلة تانية", + "Driver is taking too long": "الكابتن كتير عم يتأخر", + "Driver asked me to cancel": "الكابتن طلب مني كنسل", + "Wrong pickup location": "مكان اللوكيشن غلط", + "Other": "أخرى", + "Don't Cancel": "لا تلغي", + "No Drivers Found": "ما لقينا كباتن", + "Sorry, there are no cars available of this type right now.": + "منعتذر، ما في سيارات من هاد النوع هلا.", + "Refresh Map": "تحديث الخريطة", + "face detect": "كشف الوجه", + "Face Detection Result": "نتيجة كشف الوجه", + "similar": "مشابه", + "not similar": "غير مشابه", + "Searching for nearby drivers...": "عم ندورلك على كباتن قريبين...", + "Error": "خطأ", + "Failed to search, please try again later": + "ما مشي حال البحث، جرب بعد شوي", + "Connection Error": "مشكلة بالاتصال", + "Please check your internet connection": "تأكد من النت عندك", + "Sorry 😔": "عذراً 😔", + "The driver cancelled the trip for an emergency reason.\nDo you want to search for another driver immediately?": + "الكابتن كنسل المشوار لسبب طارئ.\nبدك ندورلك على كابتن تاني فوراً؟", + "Search for another driver": "دور على كابتن تاني", + "We apologize 😔": "نعتذر منك 😔", + "No drivers found at the moment.\nPlease try again later.": + "ما لقينا كباتن حالياً.\\nيا ريت تجرب بعد شوي.", + "Hi ,I will go now": "مرحبًا، سأذهب الآن", + "Passenger come to you": "الراكب قادم إليك", + "Call Income": "مكالمة واردة", + "Call Income from Passenger": "مكالمة واردة من الراكب", + "Criminal Document Required": "مطلوب وثيقة جنائية", + "You should have upload it .": "يجب عليك تحميلها.", + "Call End": "انتهاء المكالمة", + "The order has been accepted by another driver.": + "تم قبول الطلب من قبل سائق آخر.", + "The order Accepted by another Driver": + "تم قبول الطلب من قبل سائق آخر", + "We regret to inform you that another driver has accepted this order.": + "نأسف لإعلامك بأن سائقًا آخر قد قبل هذا الطلب.", + "Driver Applied the Ride for You": "السائق قدم الطلب لك", + "Applied": "تم التقديم", + "Please go to Car Driver": "يرجى الذهاب إلى سائق السيارة", + "Ok I will go now.": "حسنًا، سأذهب الآن.", + "Accepted Ride": "تم قبول الرحلة", + "Driver Accepted the Ride for You": "السائق قبل الرحلة لك", + "Promo": "عرض ترويجي", + "Show latest promo": "عرض أحدث عرض ترويجي", + "Trip Monitoring": "مراقبة الرحلة", + "Driver Is Going To Passenger": "السائق في طريقه إليك", + "Please stay on the picked point.": + "يرجى البقاء في نقطة الالتقاط المحددة.", + "message From Driver": "رسالة من السائق", + "Trip is Begin": "بدأت الرحلة", + "Cancel Trip from driver": "إلغاء الرحلة من السائق", + "We will look for a new driver.\nPlease wait.": + "هنبحث عن سائق جديد.\nمن فضلك انتظر.", + "The driver canceled your ride.": "السائق ألغى رحلتك.", + "Driver Finish Trip": "السائق أنهى الرحلة", + "you will pay to Driver": "هتدفع للسائق", + "Don’t forget your personal belongings.": "متنساش حاجاتك الشخصية.", + "Please make sure you have all your personal belongings and that any remaining fare, if applicable, has been added to your wallet before leaving. Thank you for choosing the Intaleq app": + "من فضلك تأكد إن معاك كل حاجاتك الشخصية وإن أي مبلغ متبقي، لو موجود، تم إضافته لمحفظتك قبل ما تمشي. شكرًا لاستخدامك تطبيق تربز", + "Finish Monitor": "إنهاء المراقبة", + "Trip finished": "الرحلة انتهت", + "Call Income from Driver": "مكالمة واردة من السائق", + "Driver Cancelled Your Trip": "السائق ألغى رحلتك", + "you will pay to Driver you will be pay the cost of driver time look to your Intaleq Wallet": + "هتدفع للسائق هتدفع تكلفة وقت السائق شوف محفظة Intaleq بتاعتك", + "Order Applied": "تم تطبيق الطلب", + "welcome to intaleq": "أهلاً بك في انطلق", + "login or register subtitle": + "دخل رقم موبايلك لتسجل دخول أو لتفتح حساب جديد", + "Complaint cannot be filed for this ride. It may not have been completed or started.": + "ما فيك تبعت شكوى لهاد المشوار. يمكن لسا ما خلص أو ما بلّش.", + "phone number label": "رقم الموبايل", + "phone number required": "يا ريت تدخل رقم الموبايل", + "send otp button": "إرسال كود التأكيد", + "verify your number title": "تأكيد رقمك", + "otp sent subtitle": + "تم إرسال رمز تحقق مؤلف من 5 أرقام إلى\n@phoneNumber", + "verify and continue button": "تأكيد ومتابعة", + "enter otp validation": "يا ريت تدخل الكود (5 أرقام)", + "one last step title": "خطوة أخيرة", + "complete profile subtitle": "كمل بياناتك لتبلش", + "first name label": "الاسم الأول", + "first name required": "يا ريت تكتب الاسم الأول", + "last name label": "الاسم الأخير", + "Verify OTP": "التحقق من الرمز", + "Verification Code": "رمز التحقق", + "We have sent a verification code to your mobile number:": + "لقد أرسلنا رمز التحقق إلى رقم هاتفك المحمول:", + "Verify": "تحقق", + "Resend Code": "إعادة إرسال الرمز", + "You can resend in": "يمكنك إعادة الإرسال خلال", + "seconds": "ثوانٍ", + "Please enter the complete 6-digit code.": + "يا ريت تدخل الكود كامل (6 أرقام).", + "last name required": "يا ريت تكتب الكنية", + "email optional label": "البريد الإلكتروني (اختياري)", + "complete registration button": "إتمام التسجيل", + "User with this phone number or email already exists.": + "هاد الرقم أو الإيميل مسجل من قبل.", + "otp sent success": "بعتنا كود التأكيد على واتساب.", + "failed to send otp": "فشل إرسال الرمز.", + "server error try again": "صار غلط بالسيرفر، جرب مرة تانية.", + "an error occurred": "صار غلط مو متوقع: @error", + "otp verification failed": "كود التأكيد غلط.", + "registration failed": "ما مشي حال التسجيل.", + "welcome user": "أهلاً بك، @firstName!", + "Don't forget your personal belongings.": "لا تنسى أغراضك.", + "Share App": "شارك التطبيق", + "Wallet": "المحفظة", + "Balance": "الرصيد", + "Profile": "الملف الشخصي", + "Contact Support": "اتصل بالدعم", + "Session expired. Please log in again.": + "خلصت الجلسة. يا ريت ترجع تسجل دخول.", + "Security Warning": "⚠️ تحذير أمني", + "Potential security risks detected. The application may not function correctly.": + "في مخاطر أمنية. يمكن التطبيق ما يشتغل صح.", + "please order now": "اطلب هلا", + "Where to": "على فين؟", + "Where are you going?": "رايح فين؟", + "Quick Actions": "إجراءات سريعة", + "My Balance": "رصيدي", + "Order History": "سجل الطلبات", + "Contact Us": "اتصل بنا", + "Driver": "السائق", + "Complaint": "شكوى", + "Promos": "العروض", + "Recent Places": "الأماكن الأخيرة", + "From": "من", + "WhatsApp Location Extractor": "مستخرج موقع واتساب", + "Location Link": "رابط الموقع", + "Paste location link here": "الصق رابط الموقع هنا", + "Go to this location": "انتقل إلى هذا الموقع", + "Paste WhatsApp location link": "الصق رابط موقع واتساب", + "Select Order Type": "اختر نوع الطلب", + "Choose who this order is for": "اختر الطلب ده لمين؟", + "I want to order for myself": "أطلب لنفسي", + "I want to order for someone else": "أطلب لحد تاني", + "Order for someone else": "اطلب لشخص آخر", + "Order for myself": "اطلب لنفسي", + "Are you want to go this site": "عايز تروح المكان ده؟", + "No": "لأ", + "Intaleq Wallet": "محفظة انطلق", + "Have a promo code?": "معك كود خصم؟", + "Your Wallet balance is ": "رصيد محفظتك هو ", + "Cash": "كاش", + "Pay directly to the captain": "ادفع للكابتن مباشرةً", + "Top up Wallet to continue": "اشحن المحفظة للمتابعة", + "Or pay with Cash instead": "أو ادفع بالكاش بدلاً من ذلك", + "Confirm & Find a Ride": "تأكيد والبحث عن مشوار", + "Balance:": "الرصيد:", + "Alerts": "الإشعارات", + "Welcome Back!": "يا مية أهلاً!", + "Current Balance": "الرصيد الحالي", + "Set Wallet Phone Number": "تعيين رقم المحفظة", + "Link a phone number for transfers": "اربط رقم الجوال للتحويلات", + "Payment History": "سجل المدفوعات", + "View your past transactions": "شوف الدفعات اللي صارت", + "Top up Wallet": "شحن المحفظة", + "Add funds using our secure methods": "عبي رصيد بطرقنا المضمونة", + "Increase Fare": "رفع الأجرة", + "No drivers accepted your request yet": + "لسا ما حدا من الكباتن قبل طلبك", + "Increasing the fare might attract more drivers. Would you like to increase the price?": + "إذا زدت الأجرة ممكن الكباتن يقبلوا أسرع. بدك ترفع السعر؟", + "Please make sure not to leave any personal belongings in the car.": + "يا ريت تنتبه ما تنسى غراضك بالسيارة.", + "Cancel Ride": "إلغاء المشوار", + "Route Not Found": "الطريق مو موجود", + "We couldn't find a valid route to this destination. Please try selecting a different point.": + "ما لقينا طريق لهون. جرب تختار مكان تاني.", + "You can call or record audio during this trip.": + "فيك تدق أو تسجل صوت بهاد المشوار.", + "Warning: Speeding detected!": "انتبه: عم تسرع كتير!", + "Comfort": "كمفورت", + "Intaleq Balance": "رصيد انطلق", + "Electric": "سيارة كهربائية", + "Lady": "ليدي", + "Van": "فان للعائلات", + "Rayeh Gai": "رايح جاي", + "Join Intaleq as a driver using my referral code!": + "انضم لـ انطلق ككابتن بكود دعوتي!", + "Use code:": "استخدم الكود:", + "Download the Intaleq Driver app now and earn rewards!": + "نزل تطبيق انطلق للكباتن هلا واربح مكافآت!", + "Get a discount on your first Intaleq ride!": + "خد خصم على أول مشوار إلك مع انطلق!", + "Use my referral code:": "استخدم كود دعوتي:", + "Download the Intaleq app now and enjoy your ride!": + "نزل تطبيق انطلق هلا واستمتع بمشوارك!", + "Contacts Loaded": "تحملت الأسماء", + "Showing": "عم نعرض", + "of": "من", + "Customer not found": "العميل غير موجود", + "Wallet is blocked": "المحفظة محظورة", + "Customer phone is not active": "هاتف العميل غير نشط", + "Balance not enough": "الرصيد غير كافٍ", + "Balance limit exceeded": "تم تجاوز حد الرصيد", + "Incorrect sms code": + "⚠️ الكود اللي دخلته غلط. يا ريت تحاول مرة تانية.", + "contacts. Others were hidden because they don't have a phone number.": + "اسم. البقية مخفيين لانو ما عندن أرقام.", + "No contacts found": "ما لقينا أسماء", + "No contacts with phone numbers were found on your device.": + "ما في أسماء عندن أرقام جوال بموبايلك.", + "Permission denied": "الطلب مرفوض", + "Contact permission is required to pick contacts": + "لازم تعطي إذن الوصول للأسماء لتختارن.", + "An error occurred while picking contacts:": + "صار غلط وقت عم ننقي الأسماء:", + "Please enter a correct phone": "يرجى إدخال رقم هاتف صحيح", + "Success": "نجاح", + "Invite sent successfully": "انبعتت الدعوة تمام", + "Hello! I'm inviting you to try Intaleq.": + "أهلاً! عم ادعيك تجرب تطبيق 'انطلق'.", + "Use my invitation code to get a special gift on your first ride!": + "استخدم كود دعوتي لتاخد هدية مميزة بأول مشوار إلك!", + "Your personal invitation code is:": "كود دعوتك الشخصي هو:", + "Be sure to use it quickly! This code expires at": + "استخدمه بسرعة! هاد الكود بيخلص بـ", + "Download the app now:": "نزل التطبيق هلا:", + "See you on the road!": "نشوفك ع الطريق!", + "This phone number has already been invited.": + "هاد الرقم انبعتله دعوة من قبل.", + "An unexpected error occurred. Please try again.": + "صار غلط مو متوقع. جرب مرة تانية.", + "You deserve the gift": "أنت تستحق الهدية", + "Claim your 20 LE gift for inviting": "خد هديتك الـ ٢٠ ل.س دعوتك لـ", + "You have got a gift for invitation": "طلعتلك هدية مشان دعوتك", + "You have earned 20": "ربحت ٢٠", + "LE": "جنيه", + "Vibration feedback for all buttons": "تفعيل الاهتزاز لجميع الأزرار", + "Share with friends and earn rewards": + "شارك التطبيق مع أصدقائك واحصل على مكافآت", + "Gift Already Claimed": "أخدت الهدية من قبل", + "You have already received your gift for inviting": + "أنت أخدت الهدية خلاص على هي الدعوة", + "Keep it up!": "خليك هيك!", + "has completed": "خلص", + "trips": "مشاوير", + "Personal Information": "المعلومات الشخصية", + "Name": "الاسم", + "Not set": "مو محدد", + "Gender": "الجنس", + "Education": "التعليم", + "Work & Contact": "الشغل والاتصال", + "Employment Type": "نوع التوظيف", + "Marital Status": "الحالة الاجتماعية", + "SOS Phone": "هاتف الطوارئ", + "Sign Out": "تسجيل الخروج", + "Delete My Account": "حذف حسابي", + "Update Gender": "تحديث الجنس", + "Update": "تحديث", + "Update Education": "تحديث التعليم", + "Are you sure? This action cannot be undone.": + "متأكد؟ هاد الإجراء ما فيه تراجع.", + "Confirm your Email": "تأكد من إيميلك", + "Type your Email": "اكتب بريدك الإلكتروني", + "Delete Permanently": "حذف نهائي", + "Male": "ذكر", + "Female": "أنثى", + "High School Diploma": "شهادة الثانوية العامة", + "Associate Degree": "درجة الدبلوم", + "Bachelor's Degree": "بكالوريوس", + "Master's Degree": "ماجستير", + "Doctoral Degree": "دكتوراه", + "Select your preferred language for the app interface.": + "نقي اللغة اللي بتفضلها لواجهة التطبيق.", + "Language Options": "خيارات اللغة", + "You can claim your gift once they complete 2 trips.": + "فيك تطلب هديتك بعد ما يخلص مشوارين.", + "Closest & Cheapest": "الأقرب والأرخص", + "Comfort choice": "خيار الراحة", + "Travel in a modern, silent electric car. A premium, eco-friendly choice for a smooth ride.": + "سافر في سيارة كهربائية حديثة وهادئة. خيار مميز وصديق للبيئة لرحلة مريحة وسلسة.", + "Spacious van service ideal for families and groups. Comfortable, safe, and cost-effective travel together.": + "خدمة فان واسعة مثالية للعائلات والمجموعات. رحلة مريحة وآمنة واقتصادية للتنقل معًا.", + "Quiet & Eco-Friendly": "هادئة وصديقة للبيئة", + "Lady Captain for girls": "سائقة خاصة للسيدات", + "Van for familly": "سيارة فان لعيلة", + "Are you sure to delete this location?": + "متأكد إنك عايز تحذف الموقع ده؟", + "Submit a Complaint": "بعت شكوى", + "Submit Complaint": "إرسال الشكوى", + "No trip history found": "ما في سجل مشاوير", + "Your past trips will appear here.": "مشاويرك القديمة رح تطلع هون.", + "1. Describe Your Issue": "١. اشرح شو صار معك", + "Enter your complaint here...": "اكتب شكوتك هون...", + "2. Attach Recorded Audio": "٢. إرفاق تسجيل صوتي", + "No audio files found.": "ما لقينا تسجيلات صوتية.", + "Confirm Attachment": "تأكيد الإرفاق", + "Attach this audio file?": "بدك ترفق هاد التسجيل؟", + "Uploaded": "ترفع بنجاح", + "3. Review Details & Response": "٣. مراجعة التفاصيل والرد", + "Date": "التاريخ", + "Today's Promos": "عروض اليوم", + "No promos available right now.": "ما في عروض هلا.", + "Check back later for new offers!": + "ارجع شيك بعدين لتشوف عروض جديدة!", + "Valid Until:": "صالح حتى:", + "CODE": "الكود", + "Login": "تسجيل الدخول", + "Sign in for a seamless experience": "سجل الدخول لتجربة أفضل", + "Sign In with Google": "تسجيل الدخول باستخدام جوجل", + "Sign in with Apple": "تسجيل الدخول باستخدام آبل", + "User not found": "المستخدم مش موجود", + "Need assistance? Contact us": "محتاج مساعدة؟ كلمنا", + "Email": "البريد الإلكتروني", + "Your email address": "عنوان بريدك الإلكتروني", + "Enter a valid email": "أدخل بريد إلكتروني صحيح", + "Password": "كلمة المرور", + "Your password": "كلمة المرور بتاعتك", + "Enter your password": "أدخل كلمة المرور", + "Submit": "إرسال", + "Terms of Use & Privacy Notice": "شروط الاستخدام وإشعار الخصوصية", + "By selecting \"I Agree\" below, I confirm that I have read and agree to the ": + "باختيار \"أوافق\" أدناه، أؤكد أنني قرأت ووافقت على ", + "Terms of Use": "شروط الاستخدام", + " and acknowledge the ": " وبتقر بـ ", + "Privacy Notice": "سياسة الخصوصية", + ". I am at least 18 years old.": ". أنا عندي 18 سنة على الأقل.", + "I Agree": "أوافق", + "Continue": "متابعة", + "Enable Location": "شغل اللوكيشن", + "To give you the best experience, we need to know where you are. Your location is used to find nearby captains and for pickups.": + "لنقدر نخدمك أحسن شي، لازم نعرف وينك. لوكيشنك بيلزمنا لنلاقي أقرب الكباتن ليك والمكان اللي رح تطلع منه.", + "Allow Location Access": "السماح بالوصول للموقع", + "Welcome to Intaleq!": "مرحبا بكم في Intaleq!", + "Before we start, please review our terms.": + "قبل ما نبلش، يا ريت تشوف شروطنا.", + "Your journey starts here": "مشوارك ببلش من هون", + "Cancel Search": "إلغاء البحث", + "Set pickup location": "تحديد مكان البداية", + "Move the map to adjust the pin": "حرك الخريطة لتزبط اللوكيشن", + "Searching for the nearest captain...": "عم ندورلك على أقرب كابتن...", + "No one accepted? Try increasing the fare.": + "ما حدا قبل؟ جرب ترفع الأجرة شوي.", + "Increase Your Trip Fee (Optional)": "زود سعر مشوارك (اختياري)", + "We haven't found any drivers yet. Consider increasing your trip fee to make your offer more attractive to drivers.": + "ملقيناش أي سواقين لسه. فكر تزود سعر المشوار عشان عرضك يكون جذاب أكتر للسواقين.", + "No, thanks": "لا، شكرًا", + "Increase Fee": "زود الأجرة", + "Copy": "نسخ", + "Promo Copied!": "تم نسخ العرض!", + "Code": "الكود", + "copied to clipboard": "انتسخ الكود", + "Price": "السعر", + "Intaleq's Response": "رد فريق انطلق", + "Awaiting response...": "ناطرين الرد...", + "Audio file not attached": "التسجيل مو مرفق", + "The audio file is not uploaded yet.\\nDo you want to submit without it?": + "لم يتم رفع الملف الصوتي بعد.\\nهل تريد الإرسال بدونه؟", + "deleted": "تم الحذف", + "To Work": "الشغل", + "Work Saved": "تم حفظ مكان العمل", + "To Home": "البيت", + "Home Saved": "تم حفظ مكان البيت", + "Destination selected": "تم اختيار الوجهة", + "Now select start pick": "دلوقتي اختار نقطة البداية", + "OK": "تمام", + "Confirm Pick-up Location": "تأكيد موقع الالتقاء", + "Set Location on Map": "حدد الموقع على الخريطة", + "You can contact us during working hours from 10:00 - 16:00.": + "فيك تحاكينا بأوقات الشغل من ١٠ للـ ٤.", + "Intaleq is the safest and most reliable ride-sharing app designed especially for passengers in Syria. We provide a comfortable, respectful, and affordable riding experience with features that prioritize your safety and convenience. Our trusted captains are verified, insured, and supported by regular car maintenance carried out by top engineers. We also offer on-road support services to make sure every trip is smooth and worry-free. With Intaleq, you enjoy quality, safety, and peace of mind—every time you ride.": + """إنطلِق هو التطبيق الأكثر أماناً وموثوقية لمشاركة الركوب والمصمم خصيصاً للركّاب في سوريا. نوفر لك تجربة تنقّل مريحة، محترمة، وبأسعار مناسبة، مع ميزات تضع سلامتك وراحتك في المقام الأول""", + "Customer MSISDN doesn’t have customer wallet": + "رقم الزبون ما عنده محفظة", + "Nearest Car: ~": "أقرب عربية: ~", + "Nearest Car": "أقرب عربية", + "No cars nearby": "مفيش عربيات قريبة", + "Favorite Places": "الأماكن المفضلة", + "No favorite places yet!": "مفيش أماكن مفضلة لسه!", + "from your favorites": "من مفضلتك", + "Back": "رجوع", + "Enter your code below to apply the discount.": + "دخل الكود تحت لتاخد الخصم", + "By selecting \"I Agree\" below, I confirm that I have read and agree to the": + "بالنقر على \"أوافق\" أدناه، أؤكد أنني قرأت ووافقت على", + "and acknowledge the": "وأقر بـ", + "Enable Location Access": "تفعيل الوصول للموقع", + "We need your location to find nearby drivers for pickups and drop-offs.": + "محتاجين موقعك عشان نلاقي سواقين قريبين للاستلام والتوصيل.", + "You should restart app to change language": + "لازم تقفل التطبيق وتفتحه تاني عشان اللغة تتغير", + "Home Page": "الرئيسية", + "To change Language the App": "لتغيير لغة التطبيق", + "Learn more about our app and mission": + "اعرف أكتر عن تطبيقنا ورسالتنا", + "Promos For Today": "عروض اليوم", + "Choose your ride": "اختار مشوارك", + "Your Journey Begins Here": "رحلتك تبدأ هنا", + "Bonus gift": "هدية إضافية", + "Pay": "ادفع", + "Get": "احصل على", + "Send to Driver Again": "إرسال للسواق مرة تانية", + "Driver Name:": "اسم السائق:", + "No trip data available": "مفيش بيانات للرحلة متاحة", + "Car Plate:": "رقم اللوحة:", + "remaining": "متبقي", + "Order Cancelled": "تم إلغاء الطلب", + "You canceled VIP trip": "ألغيت مشوار VIP", + "Passenger cancelled order": "الراكب ألغى الطلب", + "Your trip is scheduled": "رحلتك مجدولة", + "Don't forget your ride!": "متنساش مشوارك!", + "Trip updated successfully": "تم تحديث الرحلة بنجاح", + "Car Make:": "ماركة العربية:", + "Car Model:": "موديل العربية:", + "Car Color:": "لون العربية:", + "Driver Phone:": "رقم تليفون السواق:", + "Pre-booking": "حجز مسبق", + "Waiting VIP": "انتظار VIP", + "Driver List": "قائمة السائقين", + "Confirm Trip": "تأكيد المشوار", + "Select date and time of trip": "حدد تاريخ ووقت المشوار", + "Date and Time Picker": "اختيار التاريخ والوقت", + "Trip Status:": "حالة المشوار:", + "pending": "قيد الانتظار", + "accepted": "تم القبول", + "rejected": "تم الرفض", + "Apply": "تطبيق", + "Enter your promo code": "أدخل رمز الترويج الخاص بك", + "Apply Promo Code": "تطبيق رمز الترويج", + "Scheduled Time:": "الوقت المحدد:", + "No drivers available": "مفيش سواقين متاحين", + "No drivers available at the moment. Please try again later.": + "مفيش سواقين متاحين دلوقتي. حاول تاني بعدين.", + "you have a negative balance of": "لديك رصيد سلبي قدره", + "Please try again in a few moments": "حاول تاني بعد شوية", + "Unknown Driver": "سائق غير معروف", + "in your": "في محفظتك", + "The driver accepted your order for": "السائق قبل طلبك مقابل", + "wallet due to a previous trip.": "بسبب رحلة سابقة.", + "rides": "مشاوير", + "Add Work": "أضف مكان العمل", + "The reason is": "السبب هو", + "User does not have a wallet #1652": "المستخدم معندوش محفظة", + "Price of trip": "سعر المشوار", + "From:": "من:", + "For Intaleq and Delivery trips, the price is calculated dynamically. For Comfort trips, the price is based on time and distance": + "بالنسبة لمشاوير السرعة والتوصيل، السعر بيتحدد بشكل تلقائي. أما مشاوير الكمفورت، السعر بيكون على حسب الوقت والمسافة", + "Phone Wallet Saved Successfully": "تم حفظ محفظة الهاتف بنجاح", + "Add wallet phone you use": "ضيف رقم محفظة هاتفك اللي بتستخدمها", + "Update Available": "تحديث متاح", + "Phone number must be exactly 11 digits long": + "رقم التليفون لازم يكون 11 رقم بالظبط", + "Insert Wallet phone number": "أدخل رقم محفظة الهاتف", + "Phone number isn't an Egyptian phone number": + "رقم التليفون ده مش رقم مصري", + "A new version of the app is available. Please update to the latest version.": + "فيه نسخة جديدة من التطبيق متاحة. يرجى التحديث لآخر نسخة.", + "We use location to get accurate and nearest passengers for you": + "بنستخدم الموقع عشان نوصلك بأقرب ركاب وأدقهم ليك", + "This ride is already applied by another driver.": + "المشوار ده اتقبل من سواق تاني خلاص.", + "We use your precise location to find the nearest available driver and provide accurate pickup and dropoff information. You can manage this in Settings.": + "بنستخدم موقعك بالتحديد عشان نلاقي أقرب سواق متاح ونديك معلومات دقيقة عن مكان الاستلام والوصول. ممكن تتحكم في ده من الإعدادات.", + "Where are you, sir?": "أنا وصلت حضرتك فين.", + "I've been trying to reach you but your phone is off.": + "بحاول أكلمك والتليفون مقفول.", + "Please don't be late": "ياريت متتأخرش", + "Please don't be late, I'm waiting for you at the specified location.": + "ياريت متتأخرش، أنا مستنيك في المكان اللي متحدد.", + "My location is correct. You can search for me using the navigation app": + "موقعي مظبوط. ممكن تدور عليا باستخدام تطبيق الملاحة", + "Hello, I'm at the agreed-upon location": + "أهلاً، أنا في المكان المتفق عليه", + "How much longer will you be?": "قدامك قد إيه؟", + "Phone number is verified before": "تم التحقق من رقم الهاتف قبل كده", + "Change Ride": "تغيير المشوار", + "You can change the destination by long-pressing any point on the map": + "ممكن تغير الوجهة بالضغط مطولاً على أي نقطة في الخريطة", + "Pick from map destination": "اختار وجهتك من الخريطة", + "Pick or Tap to confirm": "اختار أو اضغط للتأكيد", + "Accepted your order": "تم قبول طلبك", + "Order Accepted": "تم قبول الطلب", + "with type": "مع نوع", + "accepted your order at price": "تم قبول طلبك بسعر", + "you canceled order": "أنت ألغيت الطلب", + "If you want order to another person": "لو عايز تطلب لشخص تاني", + "upgrade price": "رفع السعر", + "airport": "مطار", + "Best choice for a comfortable car with a flexible route and stop points. This airport offers visa entry at this price.": + "أفضل اختيار لعربية مريحة بمسار مرن ونقاط توقف. المطار ده بيقدم دخول فيزا بالسعر ده.", + "You can upgrade price to may driver accept your order": + "ممكن تزود السعر عشان السواق يقبل طلبك", + "Change Route": "تغيير المسار", + "No Captain Accepted Your Order": "مفيش كابتن قبل طلبك", + "We are looking for a captain but the price may increase to let a captain accept": + "بندور على كابتن بس ممكن السعر يزيد عشان كابتن يقبل", + "No, I want to cancel this trip": "لأ، أنا عايز ألغي المشوار ده", + "Attention": "تنبيه", + "Trip Cancelled. The cost of the trip will be deducted from your wallet.": + "تم إلغاء الرحلة. هيتخصم تكلفة الرحلة من محفظتك.", + "You will be charged for the cost of the driver coming to your location.": + "هتتحاسب على تكلفة مجيء السواق لموقعك.", + "reject your order.": "رفض طلبك.", + "Order Under Review": "الطلب قيد المراجعة", + "is reviewing your order. They may need more information or a higher price.": + "بيراجع طلبك. ممكن يحتاجوا معلومات أكتر أو سعر أعلى.", + "Vibration": "اهتزاز", + "Resend code": "إعادة إرسال الرمز", + "change device": "تغيير الجهاز", + "Device Change Detected": "تم اكتشاف تغيير الجهاز", + "You can only use one device at a time. This device will now be set as your active device.": + "ممكن تستخدم جهاز واحد بس في المرة الواحدة. الجهاز ده هيتعين دلوقتي كجهازك النشط.", + "Click here point": "اضغط هنا", + "Are you want to change": "عايز تغير؟", + "by": "بواسطة", + "Enter your complaint here": "اكتب شكوتك هنا", + "Please enter your complaint.": "الرجاء إدخال شكواك.", + "Complaint data saved successfully": "تم حفظ بيانات الشكوى بنجاح", + "Trip Monitor": "مراقبة الرحلة", + "Insert SOS Phone": "أدخل رقم طوارئ", + "Add SOS Phone": "أضف رقم طوارئ", + "Dear ,\n\n 🚀 I have just started an exciting trip and I would like to share the details of my journey and my current location with you in real-time! Please download the Intaleq app. It will allow you to view my trip details and my latest location.\n\n 👉 Download link: \n Android [https://play.google.com/store/apps/details?id=com.mobileapp.store.ride]\n iOS [https://getapp.cc/app/6458734951]\n\n I look forward to keeping you close during my adventure!\n\n Intaleq ,": + "عزيزي،\n\n🚀 بدأت للتو رحلة مثيرة وأود مشاركة تفاصيل رحلتي وموقعي الحالي معك في الوقت الفعلي! يرجى تنزيل تطبيق Intaleq. سيسمح لك بعرض تفاصيل رحلتي وموقعي الأخير.\n\n👈 رابط التحميل:\nAndroid [https://play.google.com/store/apps/details?id=com.mobileapp.store.ride]\niOS [https://getapp.cc/app/6458734951]\n\nأتطلع إلى إبقائك على اطلاع دائم بمغامرتي!\n\nIntaleq،", + "Send Intaleq app to him": "ابعتله تطبيق Intaleq", + "No passenger found for the given phone number": + "مفيش راكب بالرقم ده", + "No user found for the given phone number": "مفيش مستخدم بالرقم ده", + "This price is": "السعر ده", + "Work": "عمل", + "Add Home": "أضف منزل", + "Notifications": "الإشعارات", + "💳 Pay with Credit Card": "ادفع بالبطاقة الائتمانية 💳", + "⚠️ You need to choose an amount!": "⚠️ لازم تختار مبلغ!", + "💰 Pay with Wallet": "ادفع من المحفظة", + "You must restart the app to change the language.": + "لازم تقفل التطبيق وتفتحه تاني عشان اللغة تتغير.", + "joined": "انضم", + "Driver joined the channel": "السائق انضم للقناة", + "Driver left the channel": "السائق غادر القناة", + "Call Page": "صفحة الاتصال", + "Call Left": "مكالمات متبقية", + " Next as Cash !": " المشوار التاني كاش!", + "To use Wallet charge it": "عشان تستخدم المحفظة اشحنها", + "We are searching for the nearest driver to you": + "بندورلك على أقرب سواق ليك", + "Best choice for cities": "أفضل اختيار للمدن", + "Rayeh Gai: Round trip service for convenient travel between cities, easy and reliable.": + "رايح جاي: خدمة للذهاب والعودة لIntaleq مريح بين المدن، سهلة وموثوقة.", + "This trip is for women only": "المشوار ده للسيدات فقط", + "Total budgets on month": "إجمالي الميزانية الشهرية", + "You have call from driver": "عندك مكالمة من السواق", + "Intaleq": "Intaleq", + "passenger agreement": "اتفاقية الراكب", + "To become a passenger, you must review and agree to the ": + "لتصير راكب معنا، لازم تشوف وتوافق على", + "agreement subtitle": + "لتقدر تكمل، لازم تشوف شروط الاستخدام وسياسة الخصوصية وتوافق عليهن.", + "terms of use": "شروط الاستخدام", + " and acknowledge our Privacy Policy.": + "والإقرار بسياسة الخصوصية الخاصة بنا.", + "and acknowledge our": "والإقرار بـ", + "privacy policy": "سياسة الخصوصية.", + "i agree": "أوافق على الشروط والأحكام", + "Driver already has 2 trips within the specified period.": + "السائق عنده بالفعل مشوارين خلال الفترة المحددة.", + "The invitation was sent successfully": "تم إرسال الدعوة بنجاح", + "You should select your country": "يجب عليك اختيار بلدك", + "Scooter": "سكوتر", + "A trip with a prior reservation, allowing you to choose the best captains and cars.": + "مشوار بحجز مسبق، تقدر تختار فيه أفضل الكباتن والعربيات.", + "Mishwar Vip": "مشوار VIP", + "The driver waiting you in picked location .": + "السائق منتظرك في مكان الالتقاء.", + "About Us": "عن التطبيق", + "You can change the vibration feedback for all buttons": + "ممكن تغير اهتزاز الأزرار", + "Most Secure Methods": "أكثر طرق الأمان", + "In-App VOIP Calls": "مكالمات صوتية داخل التطبيق", + "Recorded Trips for Safety": "تسجيل الرحلات للأمان", + "\nWe also prioritize affordability, offering competitive pricing to make your rides accessible.": + "\nكما نولي أهمية كبيرة للأسعار المناسبة، ونقدم أسعارًا تنافسية لجعل مشاويرك في متناول الجميع.", + "Intaleq is a ride-sharing app designed with your safety and affordability in mind. We connect you with reliable drivers in your area, ensuring a convenient and stress-free travel experience.\n\nHere are some of the key features that set us apart:": + "Intaleq هو تطبيق لمشاركة المشاوير مصمم مع وضع سلامتك وتكلفة المشوار في الاعتبار. نوصلك بسائقين موثوقين في منطقتك، ونضمن لك تجربة Intaleq مريحة وبدون قلق.\n\nإليك بعض المميزات الأساسية اللي بتميزنا:", + "Sign In by Apple": "تسجيل الدخول باستخدام Apple", + "Sign In by Google": "تسجيل الدخول باستخدام Google", + "How do I request a ride?": "إزاي أطلب مشوار؟", + "Step-by-step instructions on how to request a ride through the Intaleq app.": + "تعليمات خطوة بخطوة عن كيفية طلب مشوار من خلال تطبيق Intaleq.", + "What types of vehicles are available?": + "إيه أنواع العربيات المتاحة؟", + "Intaleq offers a variety of vehicle options to suit your needs, including economy, comfort, and luxury. Choose the option that best fits your budget and passenger count.": + "Intaleq بتقدملك اختيارات متنوعة للعربيات تناسب احتياجاتك، منها اقتصادي ومريح وفاخر. اختار اللي يناسب ميزانيتك وعدد الركاب.", + "How can I pay for my ride?": "إزاي أدفع تمن المشوار؟", + "Intaleq offers multiple payment methods for your convenience. Choose between cash payment or credit/debit card payment during ride confirmation.": + "Intaleq بتقدملك طرق دفع متعددة لراحتك. اختار بين الدفع كاش أو ببطاقة الائتمان/الخصم وأنت بتأكد المشوار.", + "Can I cancel my ride?": "ممكن ألغي المشوار؟", + "Yes, you can cancel your ride under certain conditions (e.g., before driver is assigned). See the Intaleq cancellation policy for details.": + "نعم، يمكنك إلغاء رحلتك في ظل ظروف معينة (مثل قبل تعيين السائق). اطلع على سياسة الإلغاء في Intaleq للحصول على التفاصيل.", + "Driver Registration & Requirements": "تسجيل السائقين والمتطلبات", + "How can I register as a driver?": "كيف يمكنني التسجيل كسائق؟", + "What are the requirements to become a driver?": + "ما هي المتطلبات للعمل كسائق؟", + "Visit our website or contact Intaleq support for information on driver registration and requirements.": + "تفضل بزيارة موقعنا الإلكتروني أو اتصل بدعم Intaleq للحصول على معلومات حول تسجيل السائقين والمتطلبات.", + "Intaleq provides in-app chat functionality to allow you to communicate with your driver or passenger during your ride.": + "توفر Intaleq ميزة الدردشة داخل التطبيق لتتيح لك التواصل مع سائقك أو راكبك أثناء الرحلة.", + "Intaleq prioritizes your safety. We offer features like driver verification, in-app trip tracking, and emergency contact options.": + "تُولي Intaleq أهمية كبيرة لسلامتك. نحن نقدم ميزات مثل التحقق من هوية السائق ، وتتبع الرحلات داخل التطبيق ، وخيارات الاتصال في حالات الطوارئ.", + "Frequently Questions": "الأسئلة الشائعة", + "User does not exist.": "المستخدم غير موجود", + "We need your phone number to contact you and to help you.": + "نحتاج إلى رقم هاتفك للتواصل معك ولمساعدتك", + "You will recieve code in sms message": "ستتلقى رمزًا في رسالة SMS", + "Please enter": "يرجى إدخال", + "We need your phone number to contact you and to help you receive orders.": + "نحتاج إلى رقم هاتفك للتواصل معك ولمساعدتك في تلقي الطلبات.", + "The full name on your criminal record does not match the one on your driver's license. Please verify and provide the correct documents.": + "الاسم بـ 'لا حكم عليه' مو نفس اللي بالرخصة. تأكد وبعتلنا الوراق الصح.", + "The national number on your driver's license does not match the one on your ID document. Please verify and provide the correct documents.": + "الرقم الوطني بالرخصة مو نفسه اللي بالهوية. تأكد وبعتلنا الوراق الصح.", + "Capture an Image of Your Criminal Record": + "التقط صورة لسجلك الجنائي", + "IssueDate": "تاريخ الإصدار", + "Capture an Image of Your car license front": "صور وش رخصة السيارة", + "Capture an Image of Your ID Document front": + "التقط صورة للواجهة الأمامية لوثيقة هويتك", + "NationalID": "الرقم القومي", + "You can share the Intaleq App with your friends and earn rewards for rides they take using your code": + "يمكنك مشاركة تطبيق Intaleq مع أصدقائك وكسب مكافآت من الرحلات التي يقومون بها باستخدام كودك.", + "FullName": "الاسم الكامل", + "No invitation found yet!": "لم يتم العثور على دعوات حتى الآن!", + "InspectionResult": "نتيجة الفحص", + "Criminal Record": "السجل الجنائي", + "The email or phone number is already registered.": + "البريد الإلكتروني أو رقم الهاتف مسجل بالفعل.", + "To become a ride-sharing driver on the Intaleq app, you need to upload your driver's license, ID document, and car registration document. Our AI system will instantly review and verify their authenticity in just 2-3 minutes. If your documents are approved, you can start working as a driver on the Intaleq app. Please note, submitting fraudulent documents is a serious offense and may result in immediate termination and legal consequences.": + "لِتُصْبِحَ سَائِقَاً لِلرُّكوبِ المُشْتَرَكِ عَلَى تَطْبِيق سَفَر، يَجِبُ عَلَيْكَ تَحْمِيل رُخْصَةِ القِيَادَةِ، وَثِيقَةِ الهُوِيَّةِ، وَوَثِيقَةَ تَسْجِيل السَّيَّارَةِ. سَيَقُومُ نِظَامُ الذَّكَاءِ الاِصْطِنَاعِيِّ لَدَيْنَا بِمُرَاجَعَةِ وَتَحْقِيقِ صِحَّةِ الوَثَائِقِ فِي غُضُونِ ٢-٣ دَقَائِقَ فَقَطْ. إِذَا تَمَّتْ المُوَافَقَةُ عَلَى وَثَائِقِكَ، يُمْكِنُكَ البَدْءُ فِي العَمَلِ كَسَائِقٍ عَلَى تَطْبِيق سَفَر. يُرْجَى مُلَاحَظَةُ، تَقْدِيمُ وَثَائِقَ مُزَورَةٍ يُعَدُّ جَرِيمَةً خَطِيرَةً وَقَدْ يَتَرَتَّبُ عَلَيْهِ اِنهَاءُ الحِسَابِ فَوْرِيَّاً وَعَوَاقِبُ قَانُونِيَّة.", + "Documents check": "فحص الوثائق", + "Driver's License": "رخصة القيادة", + "for your first registration!": "للتسجيل الأول!", + "Get it Now!": "احصل عليه الآن!", + "before": "قبل", + "Code not approved": "الرمز غير موافق عليه", + "3000 LE": "3000 جنيه مصري", + "Do you have an invitation code from another driver?": + "هل لديك كود دعوة من سائق آخر؟", + "Paste the code here": "الصق الكود هنا", + "No, I don't have a code": "لا، لا أملك كودا", + "Audio uploaded successfully.": "تم رفع الصوت بنجاح", + "Perfect for passengers seeking the latest car models with the freedom to choose any route they desire": + "مثالي للركاب الذين يبحثون عن أحدث موديلات السيارات مع حرية اختيار أي طريق يرغبون به", + "Share this code with your friends and earn rewards when they use it!": + "شارك هذا الرمز مع أصدقائك واحصل على مكافآت عند استخدامهم له!", + "Enter phone": "أدخل رقم الهاتف", + "complete, you can claim your gift": " يمكنك المطالبة بهديتك", + "When": "‏عندما يكمل", + "Enter driver's phone": "أدخل رقم هاتف السائق", + "Send Invite": "أرسل الدعوة", + "Show Invitations": "عرض الدعوات", + "License Type": "نوع الرخصة", + "National Number": "الرقم الوطني", + "Name (Arabic)": "الاسم بالعربي", + "Name (English)": "الاسم بالإنجليزية", + "Address": "العنوان", + "Issue Date": "تاريخ الإصدار", + "Expiry Date": "تاريخ الانتهاء", + "License Categories": "فئات الرخصة", + "driver_license": "رخصة القيادة", + "Capture an Image of Your Driver License": "التقط صورة لرخصة قيادتك", + "ID Documents Back": "الوجه الخلفي لوثائق الهوية", + "National ID": "البطاقة الوطنية", + "Occupation": "المهنة", + "Religion": "الديانة", + "Full Name (Marital)": "الاسم الكامل (حسب الحالة الاجتماعية)", + "Expiration Date": "تاريخ الانتهاء", + "Capture an Image of Your ID Document Back": + "التقط صورة للوجه الخلفي لوثيقة الهوية الخاصة بك", + "ID Documents Front": "الوجه الأمامي لوثائق الهوية", + "First Name": "الاسم الأول", + "CardID": "رقم البطاقة", + "Vehicle Details Front": "تفاصيل المركبة ‏الوجه الأمامية", + "Plate Number": "رقم اللوحة", + "Owner Name": "اسم المالك", + "Vehicle Details Back": "تفاصيل المركبة ‏الوجه الخلفي", + "Make": "المصنع", + "Model": "الطراز", + "Year": "السنة", + "Chassis": "الشاسيه", + "Color": "اللون", + "Displacement": "السعة", + "Fuel": "الوقود", + "Tax Expiry Date": "تاريخ انتهاء الضريبة", + "Inspection Date": "تاريخ الفحص", + "Capture an Image of Your car license back": + "التقط صورة للوجه الخلفي لرخصة سيارتك", + "Capture an Image of Your Driver's License": + "التقط صورة لرخصة قيادتك", + "Sign in with Google for easier email and name entry": + "سجل دخولك باستخدام جوجل لتسجيل بريدك الإلكتروني واسمك بسهولة", + "You will choose allow all the time to be ready receive orders": + "ستختار السماح طوال الوقت لتكون جاهزًا لاستقبال الطلبات", + "Get to your destination quickly and easily.": + "وصول إلى وجهتك بسرعة وسهولة.", + "Enjoy a safe and comfortable ride.": "استمتع برحلة آمنة ومريحة.", + "Choose Language": "اختر اللغة", + "Pay with Wallet": "ادفع باستخدام المحفظة", + "Invalid MPIN": "رمز PIN غير صحيح", + "Invalid OTP": "كود التحقق خاطئ", + "Enter your email address": "أدخل عنوان بريدك الإلكتروني", + "Please enter Your Email.": "يرجى إدخال بريدك الإلكتروني.", + "Enter your phone number": "أدخل رقم هاتفك", + "Please enter your phone number.": "يرجى إدخال رقم هاتفك.", + "Please enter Your Password.": "يرجى إدخال كلمة المرور.", + "if you dont have account": "إذا لم يكن لديك حساب", + "Register": "تسجيل", + "Accept Ride's Terms & Review Privacy Notice": + "قبول شروط الاستخدام ومراجعة إشعار الخصوصية", + "By selecting 'I Agree' below, I have reviewed and agree to the Terms of Use and acknowledge the Privacy Notice. I am at least 18 years of age.": + "من خلال اختيار 'أوافق' أدناه، قمت بمراجعة وقبول شروط الاستخدام وأقر بإشعار الخصوصية. أنا على الأقل 18 عامًا.", + "First name": "الاسم الأول", + "Enter your first name": "أدخل اسمك الأول", + "Please enter your first name.": "يرجى إدخال اسمك الأول.", + "Last name": "اسم العائلة", + "Enter your last name": "أدخل اسمك الأخير", + "Please enter your last name.": "يرجى إدخال اسمك الأخير.", + "City": "المدينة", + "Please enter your City.": "يرجى إدخال اسم مدينتك.", + "Verify Email": "تحقق من البريد الإلكتروني", + "We sent 5 digit to your Email provided": + "لقد أرسلنا رمزًا مؤلفًا من 5 أرقام إلى بريدك الإلكتروني المدخل", + "5 digit": "5 أرقام", + "Send Verification Code": "إرسال رمز التحقق", + "Your Ride Duration is ": "مُدَّة رِحْلَتِكَ ", + "You will be thier in": "سَتَكُون هُنَاكَ فِي", + "You trip distance is": "مَسَافَة الرِّحْلَة", + "Fee is": "الرُّسُوم", + "From : ": "مِنْ: ", + "To : ": "إِلَى: ", + "Add Promo": "إضَافَة بَرُومُو", + "Confirm Selection": "تَأْكِيد الاخْتِيَار", + "distance is": "المَسَافَة", + "Privacy Policy": "سياسة الخصوصية", + "Intaleq LLC": "شركة Intaleq", + "Syria's pioneering ride-sharing service, proudly developed by Arabian and local owners. We prioritize being near you – both our valued passengers and our dedicated captains.": + "خدمة مشاركة المشاوير الأولى بسوريا، تفيدنا إنه نكون معك قريبين، سواء كنت راكب أو كابتن من كباتننا الغاليين.", + "Intaleq is the first ride-sharing app in Syria, designed to connect you with the nearest drivers for a quick and convenient travel experience.": + "انطلق هو أول تطبيق لمشاركة المشاوير بسوريا، مصمم ليوصلك بأقرب كابتن مشان توصل بسرعة وراحة.", + "Why Choose Intaleq?": "لماذا تختار Intaleq؟", + "Closest to You": "الأقرب إليك", + "We connect you with the nearest drivers for faster pickups and quicker journeys.": + "نربطك بأقرب السائقين لضمان وصول سريع ورحلات أسرع.", + "Uncompromising Security": "أعلى مستويات الأمان", + "Lady Captains Available": "قائدات سيارات متاحات", + "Recorded Trips (Voice & AI Analysis)": + "الرحلات المسجلة (تحليل صوتي بالذكاء الاصطناعي)", + "Fastest Complaint Response": "أسرع استجابة للشكاوى", + "Our dedicated customer service team ensures swift resolution of any issues.": + "فريق خدمة العملاء لدينا يضمن حل أي مشكلة بسرعة.", + "Affordable for Everyone": "في متناول الجميع", + "Frequently Asked Questions": "الأسئلة الشائعة", + "Getting Started": "البدء", + "Simply open the Intaleq app, enter your destination, and tap \"Request Ride\". The app will connect you with a nearby driver.": + "افتح تطبيق Intaleq، وأدخل وجهتك، واضغط على \"طلب رحلة\". سيقوم التطبيق بتوصيلك بأقرب سائق.", + "Vehicle Options": "خيارات المركبات", + "Intaleq offers a variety of options including Economy, Comfort, and Luxury to suit your needs and budget.": + "يوفر Intaleq مجموعة متنوعة من الخيارات بما في ذلك الاقتصادية، المريحة، والفاخرة لتلبية احتياجاتك وميزانيتك.", + "Payments": "المدفوعات", + "You can pay for your ride using cash or credit/debit card. You can select your preferred payment method before confirming your ride.": + "ممكن تدفع تمن مشوارك كاش أو ببطاقة الائتمان/الخصم. تقدر تختار طريقة الدفع اللي تفضلها قبل ما تأكد المشوار.", + "Ride Management": "إدارة الرحلات", + "Yes, you can cancel your ride, but please note that cancellation fees may apply depending on how far in advance you cancel.": + "أيوة، ممكن تلغي مشوارك، بس يرجى ملاحظة إن فيه رسوم إلغاء ممكن تتطبق حسب الوقت اللي بتلغي فيه قبلها قد إيه.", + "For Drivers": "للسواقين", + "Driver Registration": "تسجيل السواق", + "To register as a driver or learn about the requirements, please visit our website or contact Intaleq support directly.": + "علشان تسجل كسواق أو تعرف المتطلبات، يرجى زيارة موقعنا الإلكتروني أو الاتصال بدعم Intaleq مباشرةً.", + "Visit Website/Contact Support": "زيارة الموقع/الاتصال بالدعم", + "Close": "إغلاق", + "We are searching for the nearest driver": "بندور على أقرب سواق", + "Communication": "التواصل", + "How do I communicate with the other party (passenger/driver)?": + "إزاي أتواصل مع الطرف التاني (الراكب/السواق)؟", + "You can communicate with your driver or passenger through the in-app chat feature once a ride is confirmed.": + "ممكن تتواصل مع السواق أو الراكب من خلال خاصية الشات جوة التطبيق أول ما المشوار يتأكد.", + "Safety & Security": "الأمان والحماية", + "What safety measures does Intaleq offer?": + "إيه إجراءات الأمان اللي بيقدمها Intaleq؟", + "Intaleq offers various safety features including driver verification, in-app trip tracking, emergency contact options, and the ability to share your trip status with trusted contacts.": + "Intaleq بيقدم مميزات أمان متنوعة زي التحقق من السواق، تتبع الرحلة جوة التطبيق، خيارات الاتصال في حالات الطوارئ، وإمكانية مشاركة حالة رحلتك مع جهات اتصال موثوقة.", + "Enjoy competitive prices across all trip options, making travel accessible.": + "استمتع بأسعار تنافسية على كل خيارات الرحلات، وده بيخلي الIntaleq سهل الوصول ليه.", + "Variety of Trip Choices": "خيارات رحلات متنوعة", + "Choose the trip option that perfectly suits your needs and preferences.": + "اختار خيار الرحلة اللي يناسب احتياجاتك وتفضيلاتك بالظبط.", + "Your Choice, Our Priority": "اختيارك هو أولويتنا", + "Because we are near, you have the flexibility to choose the ride that works best for you.": + "علشان إحنا قريبين، عندك المرونة تختار المشوار اللي يناسبك.", + "duration is": "المدة", + "Setting": "الإعدادات", + "Find answers to common questions": "اعثر على إجابات للأسئلة الشائعة", + "I don't need a ride anymore": "أنا مش محتاج مشوار تاني", + "I was just trying the application": "كنت بجرب التطبيق بس", + "No driver accepted my request": "مفيش سواق قبل الطلب بتاعي", + "I added the wrong pick-up/drop-off location": + "أنا ضفت مكان استلام/توصيل غلط", + "I don't have a reason": "ماليش سبب", + "Can we know why you want to cancel Ride ?": + "ممكن نعرف ليه عايز تلغي المشوار؟", + "Add Payment Method": "إضافة طريقة الدفع", + "Ride Wallet": "محفظة الرحلة", + "Payment Method": "طريقة الدفع", + "Type here Place": "اكتب هنا المكان", + "Are You sure to ride to": "أنت متأكد إنك عايز تروح", + "Confirm": "تأكيد", + "You are Delete": "أنت على وشك الحذف", + "Deleted": "تم الحذف", + "You Dont Have Any places yet !": "لسا معندكش أي أماكن!", + "From : Current Location": "من: الموقع الحالي", + "My Cared": "بطاقاتي", + "Add Card": "إضافة بطاقة", + "Add Credit Card": "إضافة بطاقة ائتمان", + "Please enter the cardholder name": "يرجى إدخال اسم حامل البطاقة", + "Please enter the expiry date": "يرجى إدخال تاريخ انتهاء الصلاحية", + "Please enter the CVV code": "يرجى إدخال رمز CVV", + "Go To Favorite Places": "الذهاب إلى الأماكن المفضلة", + "Go to this Target": "الذهاب إلى هذا الهدف", + "My Profile": "ملفي الشخصي", + "Are you want to go to this site": "هل ترغب في الذهاب إلى هذا الموقع", + "MyLocation": "موقعي", + "my location": "موقعي", + "Target": "هدف", + "You Should choose rate figure": "يجب عليك اختيار تقييم", + "Login Captin": "تسجيل دخول الكابتن", + "Register Captin": "تسجيل كابتن جديد", + "Send Verfication Code": "إرسال رمز التحقق", + "KM": "كم", + "End Ride": "إنهاء الرحلة", + "Minute": "دقيقة", + "Go to passenger Location now": "اذهب إلى موقع الراكب الآن", + "Duration of the Ride is ": "مدة الرحلة هي ", + "Distance of the Ride is ": "المسافة للرحلة هي", + "Name of the Passenger is ": "اسم الراكب هو", + "Hello this is Captain": "مرحباً، أنا الكابتن", + "Start the Ride": "بدء الرحلة", + "Please Wait If passenger want To Cancel!": + "الرجاء الانتظار إذا أراد الراكب الإلغاء!", + "Total Duration:": "المدة الإجمالية:", + "Active Duration:": "المدة الفعلية:", + "Waiting for Captin ...": "في انتظار الكابتن...", + "Age is ": "العمر هو", + "Rating is ": "التقييم هو", + " to arrive you.": "للوصول إليك.", + "Tariff": "تعريفة", + "Settings": "الإعدادات", + "Feed Back": "اقتراحات", + "Please enter a valid 16-digit card number": + "يرجى إدخال رقم بطاقة صالح مكون من 16 رقم", + "Add Phone": "إضافة هاتف", + "Please enter a phone number": "يرجى إدخال رقم هاتف", + "You dont Add Emergency Phone Yet!": "لسه مضفتش رقم هاتف طوارئ!", + "You will arrive to your destination after ": "هتوصل وجهتك بعد", + "You can cancel Ride now": "ممكن تلغي المشوار دلوقتي", + "You Can cancel Ride After Captain did not come in the time": + "ممكن تلغي المشوار بعد ما الكابتن ميوصلش في الوقت المحدد", + "If you in Car Now. Press Start The Ride": + "لو أنت في العربية دلوقتي. اضغط على بدء الرحلة", + "You Dont Have Any amount in": "معندكش أي مبلغ في", + "Wallet!": "المحفظة!", + "You Have": "لديك", + "Save Credit Card": "حفظ بطاقة الائتمان", + "Show Promos": "إظهار العروض الترويجية", + "10 and get 4% discount": "10 واحصل على خصم 4%", + "20 and get 6% discount": "20 واحصل على خصم 6%", + "40 and get 8% discount": "40 واحصل على خصم 8%", + "100 and get 11% discount": "100 واحصل على خصم 11%", + "Pay with Your PayPal": "ادفع باستخدام PayPal", + "You will choose one of above !": "هتختار واحدة من اللي فوق!", + "Edit Profile": "تعديل الملف الشخصي", + "Copy this Promo to use it in your Ride!": + "انسخ العرض ده علشان تستخدمه في مشوارك!", + "To change some Settings": "لتغيير بعض الإعدادات", + "Order Request Page": "صفحة طلب الطلب", + "Rouats of Trip": "طرق الرحلة", + "Passenger Name is ": "اسم الراكب هو ", + "Total From Passenger is ": "المبلغ الإجمالي من الراكب هو ", + "Duration To Passenger is ": "المدة للوصول للراكب هي ", + "Distance To Passenger is ": "المسافة للوصول للراكب هي ", + "Total For You is ": "المبلغ الإجمالي ليك هو ", + "Distance is ": "المسافة هي ", + " KM": " كيلومتر", + "Duration of Trip is ": "مدة الرحلة هي ", + " Minutes": " دقائق", + "Apply Order": "قبول الطلب", + "Refuse Order": "رفض الطلب", + "Rate Captain": "تقييم الكابتن", + "Enter your Note": "أدخل ملاحظتك", + "Type something...": "اكتب حاجة...", + "Submit rating": "إرسال التقييم", + "Rate Passenger": "تقييم الراكب", + "Ride Summary": "ملخص الرحلة", + "welcome_message": "مرحباً بك في Intaleq!", + "app_description": + "Intaleq هو تطبيق موثوق وآمن وسهل الوصول إليه لمشاركة الركوب.", + "get_to_destination": "اذهب إلى وجهتك بسرعة وسهولة.", + "get_a_ride": "مع Intaleq، تقدر تحصل على رحلة لوجهتك في دقايق.", + "safe_and_comfortable": "استمتع برحلة آمنة ومريحة.", + "committed_to_safety": + "Intaleq ملتزمة بالسلامة، وكل الكباتن عندنا بيتفحصوا كويس ويتعملهم فحص خلفية.", + "your ride is Accepted": "تم قبول رحلتك", + "Driver is waiting at pickup.": + "السائق في انتظارك عند نقطة الاستلام.", + "Driver is on the way": "السائق في الطريق", + "Contact Options": "خيارات الاتصال", + "Send a custom message": "أرسل رسالة مخصصة", + "Type your message": "اكتب رسالتك", + "I will go now": "صرت طالع", + "You Have Tips": "عندك زيادة فلوس", + " tips\nTotal is": " زيادة مال\nالمجموع هو", + "Your fee is ": "الأجرة بتاعتك هي ", + "Do you want to pay Tips for this Driver": + "بدك تدفع إكرامية لهاد الكابتن؟", + "Tip is ": " مبلغ البقشيش هو", + "Are you want to wait drivers to accept your order": + "هل عايز تستنى لحد ما السواقين يقبلوا طلبك؟", + "This price is fixed even if the route changes for the driver.": + "السعر ده ثابت حتى لو المسار اتغير للسواق.", + "The price may increase if the route changes.": + "احتمالية زيادة السعر عند تغيير المسار", + "The captain is responsible for the route.": + "الكابتن مسؤول عن المسار", + "We are search for nearst driver": "بندور على أقرب سواق", + "Your order is being prepared": "جاري تجهيز الطلب", + "The drivers are reviewing your request": "السواقين بيدرسوا طلبك", + "Your order sent to drivers": "تم إرسال طلبك للسواقين", + "You can call or record audio of this trip": + "ممكن تتصل أو تسجل صوت للرحلة دي", + "The trip has started! Feel free to contact emergency numbers, share your trip, or activate voice recording for the journey": + "بدأت الرحلة! براحتك تتصل بأرقام الطوارئ، تشارك رحلتك، أو تفعل التسجيل الصوتي للرحلة", + "Camera Access Denied.": "تم رفض الوصول للكاميرا.", + "Open Settings": "افتح الإعدادات", + "GPS Required Allow !.": "تفعيل GPS مطلوب!", + "Your Account is Deleted": "تم حذف حسابك", + "Are you sure to delete your account?": + "أنت متأكد إنك عايز تحذف حسابك؟", + "Your data will be erased after 2 weeks\nAnd you will can't return to use app after 1 month ": + "بياناتك هتتمسح بعد أسبوعين\nومش هتقدر ترجع تستخدم التطبيق تاني بعد شهر", + "Enter Your First Name": "أدخل اسمك الأول", + "Are you Sure to LogOut?": "أنت متأكد إنك عايز تسجل الخروج؟", + "Email Wrong": "البريد الإلكتروني غلط", + "Email you inserted is Wrong.": "البريد الإلكتروني اللي أدخلته غلط.", + "You have finished all times ": "لقد استنفدت كل المحاولات", + "if you want help you can email us here": + "لو عايز مساعدة ممكن تبعتلنا إيميل هنا", + "Thanks": "شكراً", + "Email Us": "ابعت لنا إيميل", + "I cant register in your app in face detection ": + "مش عارف أسجل في تطبيقكم بسبب كشف الوجه", + "Hi": "مرحباً", + "No face detected": "لم يتم الكشف عن أي وجه", + "Image detecting result is ": "نتيجة الكشف عن الصورة هي", + "from 3 times Take Attention": "من 3 محاولات انتبه", + "Be sure for take accurate images please\nYou have": + "الرجاء التأكد من التقاط صور دقيقة\nلديك", + "image verified": "الصورة موثقة", + "Next": "التالي", + "There is no help Question here": "مفيش أسئلة مساعدة هنا", + "You dont have Points": "معندكش نقاط", + "You Are Stopped For this Day !": "تم توقيفك لهذا اليوم!", + "You must be charge your Account": "يجب إعادة شحن رصيد النقاط", + "You Refused 3 Rides this Day that is the reason \nSee you Tomorrow!": + "رفضت 3 رحلات النهاردة وده السبب\nنتقابل بكرة!", + "Recharge my Account": "ادفع رسوم من حسابي", + "Ok , See you Tomorrow": "تمام، نتقابل بكرة", + "You are Stopped": "تم توقيفك", + "Connected": "متصل", + "Not Connected": "غير متصل", + "Your are far from passenger location": "أنت بعيد عن مكان الراكب", + "go to your passenger location before\nPassenger cancel trip": + "اذهب إلى مكان الراكب قبل أن\nيلغي الراكب الرحلة", + "You will get cost of your work for this trip": + "هتحصل على تكاليف عملك لهذه الرحلة", + " in your wallet": "في محفظتك", + "you gain": "ربحت", + "Order Cancelled by Passenger": "تم إلغاء الطلب من قبل الراكب", + "Feedback data saved successfully": "تم حفظ بيانات التعليقات بنجاح", + "No Promo for today .": "مفيش عروض ترويجية النهاردة.", + "Select your destination": "اختار وجهتك", + "Search for your Start point": "ابحث عن نقطة الانطلاق", + "Search for waypoint": "ابحث عن النقطة الآلية", + "Current Location": "الموقع الحالي", + "Add Location 1": "إضافة الموقع 1", + "You must Verify email !.": "يجب التحقق من البريد الإلكتروني!", + "Cropper": "القاصة", + "Saved Sucssefully": "تم الحفظ بنجاح", + "Select Date": "اختر التاريخ", + "Birth Date": "تاريخ الميلاد", + "Ok": "موافق", + "the 500 points equal 30 JOD": "الـ 500 نقطة تساوي 30 دينار أردني", + "the 500 points equal 30 JOD for you \nSo go and gain your money": + "الـ 500 نقطة تساوي 30 دينار أردني\nفاستحق فلوسك واكسب النقاط", + "token updated": "تم تحديث الرمز", + "Add Location 2": "إضافة الموقع 2", + "Add Location 3": "إضافة الموقع 3", + "Add Location 4": "إضافة الموقع 4", + "Waiting for your location": "في انتظار موقعك", + "Search for your destination": "ابحث عن وجهتك", + "Hi! This is": "مرحباً! أنا", + " I am using": " أنا بستخدم", + " to ride with": " للركوب مع", + " as the driver.": " كسائق.", + "is driving a ": "يقود", + " with license plate ": "بلوحة ترخيص", + " I am currently located at ": "أنا حالياً في", + "Please go to Car now ": "الرجاء التحرك إلى السيارة الآن", + "You will receive a code in WhatsApp Messenger": + "سوف تتلقى رمزًا في واتساب ماسنجر", + "If you need assistance, contact us": + "إذا كنت بحاجة إلى المساعدة، تواصل معنا", + "Promo Ended": "انتهى العرض", + "Enter the promo code and get": "أدخل رمز الترويج واحصل على", + "DISCOUNT": "خصم", + "No wallet record found": "لم يتم العثور على سجل محفظة", + "for": "لمدة", + "Intaleq is the safest ride-sharing app that introduces many features for both captains and passengers. We offer the lowest commission rate of just 8%, ensuring you get the best value for your rides. Our app includes insurance for the best captains, regular maintenance of cars with top engineers, and on-road services to ensure a respectful and high-quality experience for all users.": + "Intaleq هو أكتر تطبيق آمن لمشاركة الركوب وبيقدّم مميزات كتير للكباتن والركاب. إحنا بنقدّم أقل نسبة عمولة وهي 8% بس، وده بيضمن إنك تاخد أحسن قيمة لمشاويرك. تطبيقنا فيه تأمين لأحسن الكباتن، صيانة دورية للعربيات مع أحسن المهندسين، وخدمات على الطريق لضمان تجربة محترمة وعالية الجودة لكل المستخدمين.", + "You can contact us during working hours from 12:00 - 19:00.": + "ممكن تتصل بينا في مواعيد العمل من الساعة 12:00 للساعة 7:00 مساءً.", + "Choose a contact option": "اختر طريقة الاتصال", + "Work time is from 12:00 - 19:00.\nYou can send a WhatsApp message or email.": + "مواعيد العمل من الساعة 12:00 للساعة 7:00 مساءً.\nممكن تبعت رسالة واتساب أو إيميل.", + "Promo code copied to clipboard!": "تم نسخ رمز العرض إلى الحافظة!", + "Copy Code": "نسخ الرمز", + "Your invite code was successfully applied!": + "تم تطبيق رمز الدعوة بنجاح!", + "Payment Options": "خيارات الدفع", + "wait 1 minute to receive message": + "استنى دقيقة واحدة لاستلام الرسالة", + "You have copied the promo code.": "تم نسخ رمز العرض.", + "Select Payment Amount": "اختر مبلغ الدفع", + "The promotion period has ended.": "انتهت فترة العرض.", + "Promo Code Accepted": "تم قبول كود العرض", + "Tap on the promo code to copy it!": "اضغط على رمز العرض لنسخه!", + "Lowest Price Achieved": "تم الوصول إلى أقل سعر", + "Cannot apply further discounts.": + "لا يمكن تطبيق المزيد من الخصومات.", + "Promo Already Used": "تم استخدام كود العرض بالفعل", + "Invitation Used": "تم استخدام الدعوة", + "You have already used this promo code.": + "لقد استخدمت هذا الكود بالفعل.", + "Insert Your Promo Code": "أدخل كود العرض الخاص بك", + "Enter promo code here": "أدخل كود العرض هنا", + "Please enter a valid promo code": "يرجى إدخال كود عرض صالح", + "Awfar Car": "أوفر كار", + "Old and affordable, perfect for budget rides.": + "سيارة قديمة وبسعر معقول، مثالية للمشاوير الاقتصادية.", + " If you need to reach me, please contact the driver directly at": + "لو محتاج تتواصل معايا، يرجى التواصل مع السواق مباشرة على", + "No Car or Driver Found in your area.": + "لم يتم العثور على سيارة أو سواق في منطقتك.", + "Please Try anther time ": "الرجاء المحاولة في وقت آخر", + "There no Driver Aplly your order sorry for that ": + "مفيش سواق قبل طلبك، آسفين على كده", + "Trip Cancelled": "تم إلغاء الرحلة", + "The Driver Will be in your location soon .": + "السواق هيكون في موقعك قريبًا.", + "The distance less than 500 meter.": "المسافة أقل من 500 متر.", + "Promo End !": "انتهاء العرض!", + "There is no notification yet": "لا توجد إشعارات بعد", + "Use Touch ID or Face ID to confirm payment": + "استخدم Touch ID أو Face ID لتأكيد الدفع", + "Contact us for any questions on your order.": + "تواصل معانا لو عندك أي استفسارات بخصوص طلبك.", + "Pyament Cancelled .": "تم إلغاء الدفع.", + "type here": "اكتب هنا", + "Scan Driver License": "مسح رخصة القيادة", + "Please put your licence in these border": + "الرجاء وضع رخصتك داخل هذا الإطار", + "Camera not initialized yet": "الكاميرا لم يتم تشغيلها بعد", + "Take Image": "التقاط الصورة", + "AI Page": "صفحة الذكاء الاصطناعي", + "Take Picture Of ID Card": "التقاط صورة لبطاقة الهوية", + "Take Picture Of Driver License Card": + "التقاط صورة لبطاقة رخصة القيادة", + "We are process picture please wait ": + "نقوم بمعالجة الصورة، الرجاء الانتظار", + "There is no data yet.": "لا توجد بيانات بعد.", + "Name :": "الاسم:", + "Drivers License Class: ": "فئة رخصة القيادة:", + "Document Number: ": "رقم المستند:", + "Address: ": "العنوان:", + "Height: ": "الطول:", + "Expiry Date: ": "تاريخ الانتهاء:", + "Date of Birth: ": "تاريخ الميلاد:", + "You can't continue with us .\nYou should renew Driver license": + "ما فيك تكمل معنا.\nلازم تجدد الرخصة", + "Detect Your Face ": "التعرف على وجهك", + "Go to next step\nscan Car License.": + "اذهب للخطوة اللي بعدها\nوامسح رخصة العربية.", + "Name in arabic": "الاسم باللغة العربية", + "Drivers License Class": "فئة رخصة القيادة", + "Selected Date": "التاريخ المحدد", + "Select Time": "اختر الوقت", + "Selected Time": "الوقت المحدد", + "Selected Date and Time": "التاريخ والوقت المحددين", + "Lets check Car license ": "يلا نفحص رخصة العربية", + "Car": "السيارة", + "Plate": "لوحة السيارة", + "Rides": "الرحلات", + "Selected driver": "السواق اللي اخترته", + "Lets check License Back Face": "يلا نفحص الوجه الخلفي للرخصة", + "Car License Card": "بطاقة رخصة السيارة", + "No image selected yet": "لم يتم اختيار أي صورة بعد", + "Made :": "الصنع:", + "model :": "الموديل:", + "VIN :": "رقم الشاسيه:", + "year :": "السنة:", + "ُExpire Date": "تاريخ الانتهاء", + "Login Driver": "تسجيل دخول السائق", + "Password must br at least 6 character.": + "كلمة المرور لازم تكون 6 حروف على الأقل.", + "if you don't have account": "إذا ما عندك حساب", + "Here recorded trips audio": "هنا تسجيلات صوتية للرحلات", + "Register as Driver": "التسجيل كسائق", + "By selecting \"I Agree\" below, I have reviewed and agree to the Terms of Use and acknowledge the ": + "باختياري 'أوافق' أدناه، قمت بمراجعة والموافقة على شروط الاستخدام والإقرار بـ", + "Log Out Page": "صفحة تسجيل الخروج", + "Log Off": "تسجيل الخروج", + "Register Driver": "تسجيل سائق جديد", + "Verify Email For Driver": "التحقق من البريد الإلكتروني للسائق", + "Admin DashBoard": "لوحة تحكم المدير", + "Your name": "اسمك", + "your ride is applied": "تم قبول الطلب بتاعك", + "H and": "ساعة و", + "JOD": "دينار", + "m": "دقيقة", + "We search nearst Driver to you": "بندور على أقرب سواق ليك", + "please wait till driver accept your order": + "الرجاء الانتظار لحد ما السواق يقبل طلبك", + "No accepted orders? Try raising your trip fee to attract riders.": + "مفيش طلبات مقبولة؟ حاول تزود أجرة المشوار لجذب الركاب.", + "You should select one": "لازم تختار واحد", + "The driver accept your order for": "السواق قبل طلبك بمبلغ", + "The driver on your way": "الكابتن في طريقه إليك", + "Total price from ": "السعر الإجمالي من ", + "Order Details Intaleq": "طلب سريع", + "Selected file:": "الملف المختار:", + "Your trip cost is": "تكلفة رحلتك هي", + "this will delete all files from your device": + "حذف هذا سيمسح كل الملفات من جهازك", + "Exclusive offers and discounts always with the Intaleq app": + "عروض وخصومات حصرية دائمًا مع تطبيق Intaleq", + "Submit Question": "اطرح سؤال", + "Please enter your Question.": "الرجاء إدخال سؤالك.", + "Help Details": "تفاصيل المساعدة", + "No trip yet found": "لم يتم حجز أي رحلة بعد", + "No Response yet.": "لا يوجد رد حتى الآن.", + " You Earn today is ": "اللي كسبته النهارده هو", + " You Have in": "عندك في", + "Total points is ": "إجمالي النقاط هو", + "Total Connection Duration:": "إجمالي مدة الاتصال:", + "Passenger name : ": "اسم الراكب", + "Cost Of Trip IS ": "تكلفة الرحلة هي", + "Arrival time": "وقت الوصول", + "arrival time to reach your point": "الوقت المتوقع للوصول إلى وجهتك", + "For Intaleq and scooter trips, the price is calculated dynamically. For Comfort trips, the price is based on time and distance": + "بالنسبة لمشاوير السرعة والسكوتر، السعر بيتحسب بشكل تلقائي. أما مشاوير الراحة، فالسعر بيكون حسب الوقت والمسافة.", + "Hello this is Driver": "مرحباً، أنا السواق", + "Is the Passenger in your Car ?": "هل الراكب معاك في العربية؟", + "Please wait for the passenger to enter the car before starting the trip.": + "الرجاء الانتظار لحد ما الراكب يركب العربية قبل ما تبدأ المشوار.", + "No ,still Waiting.": "لأ، لسه منتظر.", + "I arrive you": "أنا وصلت لك", + "I Arrive your site": "أنا وصلت مكانك", + "You are not in near to passenger location": + "أنت مش قريب من مكان الراكب", + "please go to picker location exactly": + "الرجاء الذهاب إلى موقع الراكب بالضبط", + "You Can Cancel Trip And get Cost of Trip From": + "ممكن تلغي المشوار وتاخد التكلفة من", + "Are you sure to cancel?": "أنت متأكد إنك عايز تلغي؟", + "Insert Emergincy Number": "أدخل رقم الطوارئ", + "Best choice for comfort car and flexible route and stops point": + "أفضل اختيار لعربية مريحة ومسار مرن ونقط وقوف", + "Insert": "إدخال", + "This is for scooter or a motorcycle.": "ده للتوصيل أو للموتوسيكل", + "This trip goes directly from your starting point to your destination for a fixed price. The driver must follow the planned route": + "المشوار ده من نقطة البداية لنقطة النهاية بسعر ثابت. والسواق لازم يلتزم بالمسار المحدد.", + "You can decline a request without any cost": + "تقدر ترفض الطلب من غير أي تكلفة", + "Perfect for adventure seekers who want to experience something new and exciting": + "مثالي لمحبي المغامرة اللي عايزين يجربوا حاجات جديدة ومثيرة", + "My current location is:": "موقعي الحالي هو:", + "and I have a trip on": "وعندي مشوار على", + "App with Passenger": "التطبيق\nمع الراكب", + "You will be pay the cost to driver or we will get it from you on next trip": + "هتدفع التكلفة للسواق أو هناخدها منك في المشوار اللي جاي", + "Trip has Steps": "الرحلة ليها خطوات", + "Distance from Passenger to destination is ": + "المسافة من الراكب للوجهة هي", + "price is": "التكلفة", + "This ride type does not allow changes to the destination or additional stops": + "نوع المشوار ده ميسمحش بتغيير الوجهة أو إضافة وقفات.", + "This price may be changed": "خلي بالك السعر ممكن يتغير", + "No SIM card, no problem! Call your driver directly through our app. We use advanced technology to ensure your privacy.": + "حتى لو مفيش خط، متقلقش! كلم السواق بتاعك من خلال التطبيق بتاعنا. بنستخدم تكنولوجيا حديثة عشان نحافظ على خصوصيتك.", + "This ride type allows changes, but the price may increase": + "نوع المشوار ده بيسمح بالتغييرات، بس السعر ممكن يزيد", + "Select one message": "اختار رسالة", + "I'm waiting for you": "أنا في انتظارك", + "We noticed the Intaleq is exceeding 100 km/h. Please slow down for your safety. If you feel unsafe, you can share your trip details with a contact or call the police using the red SOS button.": + "لاحظنا إن السرعة بتزيد عن 100 كم/ساعة. يرجى التباطؤ حفاظًا على سلامتك. لو حسيت بعدم الأمان، ممكن تشارك تفاصيل رحلتك مع حد تثق فيه أو تتصل بالشرطة عن طريق زر الطوارئ الأحمر.", + "Warning: Intaleqing detected!": "تحذير: تم رصد السرعة الزائدة!", + "Please help! Contact me as soon as possible.": + "الرجاء المساعدة! اتصل بي في أقرب وقت ممكن", + "Share Trip Details": "مشاركة تفاصيل الرحلة", + "Car Plate is ": "رقم اللوحة", + "the 300 points equal 300 L.E for you \nSo go and gain your money": + "اكسب 300 جنيه! كل 300 نقطة تساوي 300 جنيه. يلا استغل نقاطك!", + "the 300 points equal 300 L.E": "الـ 300 نقطة تساوي 300 جنيه ليك", + "The payment was not approved. Please try again.": + "لم يتم الموافقة على الدفع. يرجى المحاولة مرة أخرى.", + "Payment Failed": "فشل الدفع", + "This is a scheduled notification.": "هذا إشعار مجدول.", + "An error occurred during the payment process.": + "حدث خطأ أثناء عملية الدفع.", + "The payment was approved.": "تمت الموافقة على الدفع.", + "Payment Successful": "نجح الدفع", + "No ride found yet": "مفيش طلبات متاحة حاليًا", + "Accept Order": "اقبل الطلب", + "Bottom Bar Example": "مثال لشريط التنقل السفلي", + "Driver phone": "رقم السواق", + "Statistics": "الإحصائيات", + "Origin": "نقطة الانطلاق", + "Destination": "الوجهة", + "Driver Name": "اسم السائق", + "Driver Car Plate": "لوحة السيارة", + "Available for rides": "متاح للمشاوير", + "Scan Id": "مسح الهوية", + "Camera not initilaized yet": "الكاميرا لم يتم تشغيلها بعد", + "Scan ID MklGoogle": "مسح هوية MklGoogle", + "Language": "اللغة", + "Jordan": "الأردن", + "USA": "الولايات المتحدة الأمريكية", + "Egypt": "مصر", + "Turkey": "تركيا", + "Saudi Arabia": "المملكة العربية السعودية", + "Qatar": "قطر", + "Bahrain": "البحرين", + "Kuwait": "الكويت", + "But you have a negative salary of": "لكن عندك رصيد سالب بقيمة", + "Promo Code": "كود ترويجي", + "Your trip distance is": "مسافة رحلتك هي", + "Enter promo code": "أدخل كود ترويجي", + "You have promo!": "عندك عرض ترويجي!", + "Cost Duration": "تكلفة المدة", + "Duration is": "المدة هي", + "Leave": "مغادرة", + "Join": "انضمام", + "Heading your way now. Please be ready.": + "أنا في طريقي إليك الآن. يرجى الاستعداد.", + "Approaching your area. Should be there in 3 minutes.": + "أقترب من منطقتك. يفترض أوصل خلال 3 دقايق.", + "There's heavy traffic here. Can you suggest an alternate pickup point?": + "فيه زحمة مرور شديدة هنا. ممكن تقترح مكان تاني للاستلام؟", + "This ride is already taken by another driver.": + "المشوار ده أخده سواق تاني خلاص.", + "You Should be select reason.": "يجب أن تختار سبب.", + "Waiting for Driver ...": "في انتظار السواق...", + "Latest Recent Trip": "آخر مشوار عملته", + "from your list": "من قائمتك", + "Do you want to change Work location": "عايز تغير مكان شغلك؟", + "Do you want to change Home location": "عايز تغير مكان بيتك؟", + "We Are Sorry That we dont have cars in your Location!": + "نعتذر لعدم وجود سيارات في موقعك!", + "Choose from Map": "اختر من الخريطة", + "Pick your ride location on the map - Tap to confirm": + "حدد مكان الالتقاء على الخريطة - اضغط للتأكيد", + "Intaleq is the ride-hailing app that is safe, reliable, and accessible.": + "Intaleq هو تطبيق توصيل آمن وموثوق وسهل الاستخدام.", + "With Intaleq, you can get a ride to your destination in minutes.": + "مع Intaleq، تقدر توصل لوجهتك في دقايق.", + "Intaleq is committed to safety, and all of our captains are carefully screened and background checked.": + "Intaleq ملتزمة بالأمان، وكل الكباتن بيتم فحصهم بدقة والتحقق من خلفيتهم.", + "Pick from map": "اختيار من الخريطة", + "No Car in your site. Sorry!": "مفيش عربية في موقعك. آسف!", + "Nearest Car for you about ": "أقرب عربية ليك على بعد حوالي ", + "From :": "من:", + "Get Details of Trip": "عرض تفاصيل الرحلة", + "If you want add stop click here": "لو عايز تضيف وقفة اضغط هنا", + "Where you want go ": "رايح فين؟", + "My Card": "بطاقتي", + "Start Record": "بدء التسجيل", + "History of Trip": "سجل الرحلات", + "Helping Center": "مركز المساعدة", + "Record saved": "تم حفظ التسجيل", + "Trips recorded": "الرحلات المسجلة", + "Select Your Country": "اختر بلدك", + "To ensure you receive the most accurate information for your location, please select your country below. This will help tailor the app experience and content to your country.": + "لتلقي أدق المعلومات لموقعك، يرجى اختيار بلدك أدناه. هذا سيساعد على تخصيص تجربة التطبيق والمحتوى لبلدك.", + "Are you sure to delete recorded files": + "أكيد عايز تمسح الملفات الصوتية المسجلة؟", + "Select recorded trip": "اختر الملف الصوتي المسجل", + "Card Number": "رقم البطاقة", + "Hi, Where to ": "مرحباً، رايح فين؟", + "Pick your destination from Map": "اختار وجهتك من الخريطة", + "Add Stops": "إضافة محطات", + "Get Direction": "عرض الاتجاهات", + "Add Location": "إضافة موقع", + "Switch Rider": "تبديل الراكب", + "You will arrive to your destination after timer end.": + "هتوصل وجهتك بعد انتهاء العداد.", + "You can cancel trip": "تقدر تلغي الرحلة", + "The driver waitting you in picked location .": + "السواق منتظرك في المكان اللي اخترته.", + "Pay with Your": "ادفع بـ", + "Pay with Credit Card": "ادفع ببطاقة الائتمان", + "Show Promos to Charge": "عرض العروض للشحن", + "Point": "نقطة", + "How many hours would you like to wait?": "كم ساعة تحب تنتظر؟", + "Driver Wallet": "محفظة السائق", + "Choose between those Type Cars": "اختار من بين أنواع العربيات دي", + "hour": "ساعة", + "Select Waiting Hours": "اختر ساعات الانتظار", + "Total Points is": "إجمالي النقاط هو", + "You will receive a code in SMS message": + "سوف تتلقى رمزًا في رسالة نصية", + "Done": "تم", + "Total Budget from trips is ": "إجمالي المبلغ المستحق من الرحلات هو", + "Total Amount:": "المبلغ الإجمالي:", + "Total Budget from trips by\nCredit card is ": + "إجمالي المبلغ المستحق من الرحلات عن طريق\nبطاقة الائتمان هو", + "This amount for all trip I get from Passengers": + "ده المبلغ اللي حصلت عليه من كل الرحلات من الركاب", + "Pay from my budget": "ادفع من رصيدي", + "This amount for all trip I get from Passengers and Collected For me in": + "ده المبلغ اللي حصلت عليه من كل الرحلات من الركاب وتم تجميعه لي في", + "You can buy points from your budget": "تقدر تشتري نقاط من رصيدك", + "insert amount": "أدخل المبلغ", + "You can buy Points to let you online\nby this list below": + "تقدر تشتري نقاط عشان تبقى متصل\nمن القائمة دي تحت", + "Create Wallet to receive your money": "إنشاء محفظة لاستقبال أموالك", + "Enter your feedback here": "اكتب ملاحظاتك هنا", + "Please enter your feedback.": "الرجاء إدخال ملاحظاتك.", + "Feedback": "ملاحظات", + "Submit ": "إرسال", + "Click here to Show it in Map": "اضغط هنا لعرضه على الخريطة", + "Canceled": "تم الإلغاء", + "No I want": "لا أريد", + "Email is": "البريد الإلكتروني هو", + "Phone Number is": "رقم الهاتف هو", + "Date of Birth is": "تاريخ الميلاد هو", + "Sex is ": "النوع هو ", + "Car Details": "تفاصيل السيارة", + "VIN is": "رقم الشاسيه هو", + "Color is ": "اللون هو ", + "Make is ": "الشركة المصنعة", + "Model is": "الموديل هو", + "Year is": "السنة هي", + "Expiration Date ": "تاريخ الانتهاء ", + "Edit Your data": "تعديل بياناتك", + "write vin for your car": "اكتب رقم الشاسيه لعربيتك", + "VIN": "رقم الشاسيه", + "Please verify your identity": "يا ريت تأكد هويتك", + "write Color for your car": "اكتب لون عربيتك", + "write Make for your car": "اكتب الشركة المصنعة لعربيتك", + "write Model for your car": "اكتب موديل عربيتك", + "write Year for your car": "اكتب سنة صنع عربيتك", + "write Expiration Date for your car": "اكتب تاريخ انتهاء رخصة عربيتك", + "Tariffs": "التعريفات", + "Minimum fare": "الحد الأدنى للأجرة", + "Maximum fare": "الحد الأقصى للأجرة", + "Flag-down fee": "رسوم فتح العداد", + "Including Tax": "شامل الضريبة", + "BookingFee": "رسوم الحجز", + "Morning": "الصباح", + "from 07:30 till 10:30 (Thursday, Friday, Saturday, Monday)": + "من 07:30 حتى 10:30 (الخميس، الجمعة، السبت، الاثنين)", + "Evening": "المساء", + "from 12:00 till 15:00 (Thursday, Friday, Saturday, Monday)": + "من 12:00 حتى 15:00 (الخميس، الجمعة، السبت، الاثنين)", + "Night": "الليل", + "You have in account": "عندك في الحساب", + "Select Country": "اختر الدولة", + "Ride Today : ": "عدد رحلات اليوم: ", + "After this period\nYou can't cancel!": "بعد هالفترة\nما فيك تكنسل!", + "from 23:59 till 05:30": "من 23:59 حتى 05:30", + "Rate Driver": "تقييم السائق", + "Total Cost is ": "صافي الربح", + "Write note": "اكتب ملاحظة", + "Time to arrive": "وقت الوصول", + "Ride Summaries": "ملخصات الرحلات", + "Total Cost": "المبلغ الإجمالي", + "Average of Hours of": "متوسط ساعات", + " is ON for this month": "في هذا الشهر", + "Days": "أيام", + "Total Hours on month": "إجمالي الساعات في الشهر", + "Counts of Hours on days": "عدد ساعات الأيام", + "OrderId": "رقم الرحلة", + "created time": "وقت الرحلة", + "Intaleq Over": "سرعة عالية", + "I will slow down": "حاضر ههدي السرعة", + "Map Passenger": "خريطة الراكب", + "Be Slowly": "بالراحة شوية في السرعة", + "If you want to make Google Map App run directly when you apply order": + "لو عايز تطبيق خرائط جوجل يشتغل تلقائي لما تطلب الخدمة", + "You can change the language of the app": "تقدر تغير لغة التطبيق", + "Your Budget less than needed": "القيمة المدخلة أقل من رصيدك", + "You can change the Country to get all features": + "تقدر تغير البلد عشان تحصل على كل المميزات", + "There is no Car or Driver in your area.": + "ما في سيارات أو كباتن بمنطقتك.", + "Change Country": "تغيير الدولة", + }, + "ar-eg": { + "Syria": "سوريا", + "SYP": "ل.س", + "Order": "طلب", + "OrderVIP": "طلب VIP", + "Cancel Trip": "إلغاء المشوار", + "Passenger Cancel Trip": "الراكب كنسل المشوار", + "VIP Order": "طلب VIP", + "The driver accepted your trip": "الكابتن قبل مشوارك", + "message From passenger": "رسالة من الراكب", + "Cancel": "إلغاء", + "Trip Cancelled. The cost of the trip will be added to your wallet.": + "المشوار تكنسل. وتكلفته رح تنزل بمحفظتك.", + "token change": "تغيير الرمز", + "Changed my mind": "غيرت رأيي", + "Please write the reason...": "يا ريت تكتب السبب...", + "Found another transport": "لقيت وسيلة تانية", + "Driver is taking too long": "الكابتن كتير عم يتأخر", + "Driver asked me to cancel": "الكابتن طلب مني كنسل", + "Wrong pickup location": "مكان اللوكيشن غلط", + "Other": "آخر", + "Don't Cancel": "لا تلغي", + "No Drivers Found": "ما لقينا كباتن", + "Sorry, there are no cars available of this type right now.": + "منعتذر، ما في سيارات من هاد النوع هلا.", + "Refresh Map": "تحديث الخريطة", + "face detect": "كشف الوجه", + "Face Detection Result": "نتيجة كشف الوجه", + "similar": "مشابه", + "not similar": "غير مشابه", + "Searching for nearby drivers...": "عم ندورلك على كباتن قريبين...", + "Error": "غلط", + "Failed to search, please try again later": + "ما مشي حال البحث، جرب بعد شوي", + "Connection Error": "مشكلة بالاتصال", + "Please check your internet connection": "تأكد من النت عندك", + "Sorry 😔": "عذراً 😔", + "The driver cancelled the trip for an emergency reason.\nDo you want to search for another driver immediately?": + "الكابتن كنسل المشوار لسبب طارئ.\nبدك ندورلك على كابتن تاني فوراً؟", + "Search for another driver": "دور على كابتن تاني", + "We apologize 😔": "نعتذر منك 😔", + "No drivers found at the moment.\nPlease try again later.": + "ما لقينا كباتن حالياً.\\nيا ريت تجرب بعد شوي.", + "Hi ,I will go now": "مرحباً، صرت طالع", + "Passenger come to you": "الراكب جاي لعندك", + "Call Income": "مكالمة واردة", + "Call Income from Passenger": "مكالمة من الراكب", + "Criminal Document Required": "بدنا ورقة (لا حکم عليه)", + "You should have upload it .": "لازم ترفعها.", + "Call End": "انتهاء المكالمة", + "The order has been accepted by another driver.": + "في كابتن تاني أخد الطلب.", + "The order Accepted by another Driver": "في كابتن تاني أخد الطلب", + "We regret to inform you that another driver has accepted this order.": + "منعتذر، بس في كابتن تاني سبق وأخد الطلب.", + "Driver Applied the Ride for You": "الكابتن قدم الطلب إلك", + "Applied": "تم التقديم", + "Please go to Car Driver": "يا ريت تروح لعند الكابتن", + "Ok I will go now.": "تمام، صرت طالع.", + "Accepted Ride": "المشوار انقبل", + "Driver Accepted the Ride for You": "الكابتن قبل مشوارك", + "Promo": "عرض", + "Show latest promo": "فرجينا أحدث العروض", + "Trip Monitoring": "مراقبة المشوار", + "Driver Is Going To Passenger": "الكابتن جاي لعندك", + "Please stay on the picked point.": "يا ريت تضل بمكانك.", + "message From Driver": "رسالة من الكابتن", + "Trip is Begin": "بدأ المشوار", + "Cancel Trip from driver": "الكابتن كنسل المشوار", + "We will look for a new driver.\nPlease wait.": + "عم ندور على كابتن جديد.\\nيا ريت تنطر شوي.", + "The driver canceled your ride.": "الكابتن كنسل مشوارك.", + "Driver Finish Trip": "الكابتن خلص المشوار", + "you will pay to Driver": "رح تدفع للكابتن", + "Don’t forget your personal belongings.": "لا تنسَ أغراضك الشخصية.", + "Please make sure you have all your personal belongings and that any remaining fare, if applicable, has been added to your wallet before leaving. Thank you for choosing the Intaleq app": + "يا ريت تتأكد من أغراضك، وإنك أخدت الباقي بمحفظتك قبل ما تنزل. شكراً لثقتك بـ انطلق.", + "Finish Monitor": "إنهاء المراقبة", + "Trip finished": "خلص المشوار", + "Call Income from Driver": "مكالمة من الكابتن", + "Driver Cancelled Your Trip": "الكابتن كنسل مشوارك", + "you will pay to Driver you will be pay the cost of driver time look to your Intaleq Wallet": + "رح تدفع للكابتن حق وقته، شوف محفظتك بـ انطلق", + "Order Applied": "تم تقديم الطلب", + "welcome to intaleq": "أهلاً بك في انطلق", + "login or register subtitle": + "دخل رقم موبايلك لتسجل دخول أو لتفتح حساب جديد", + "Complaint cannot be filed for this ride. It may not have been completed or started.": + "ما فيك تبعت شكوى لهاد المشوار. يمكن لسا ما خلص أو ما بلّش.", + "phone number label": "رقم الموبايل", + "phone number required": "يا ريت تدخل رقم الموبايل", + "send otp button": "إرسال كود التأكيد", + "verify your number title": "تأكيد رقمك", + "otp sent subtitle": + "تم إرسال رمز تحقق مؤلف من 5 أرقام إلى\n@phoneNumber", + "verify and continue button": "تأكيد ومتابعة", + "enter otp validation": "يا ريت تدخل الكود (5 أرقام)", + "one last step title": "خطوة أخيرة", + "complete profile subtitle": "كمل بياناتك لتبلش", + "first name label": "الاسم الأول", + "first name required": "يا ريت تكتب الاسم الأول", + "last name label": "الاسم الأخير", + "Verify OTP": "تأكيد الكود", + "Verification Code": "كود التأكيد", + "We have sent a verification code to your mobile number:": + "بعتنا كود التأكيد على رقم موبايلك:", + "Verify": "تأكيد", + "Resend Code": "رجّع ابعت الكود", + "You can resend in": "فيك ترجع تبعت بعد", + "seconds": "ثانية", + "Please enter the complete 6-digit code.": + "يا ريت تدخل الكود كامل (6 أرقام).", + "last name required": "يا ريت تكتب الكنية", + "email optional label": "البريد الإلكتروني (اختياري)", + "complete registration button": "إتمام التسجيل", + "User with this phone number or email already exists.": + "هاد الرقم أو الإيميل مسجل من قبل.", + "otp sent success": "بعتنا كود التأكيد على واتساب.", + "failed to send otp": "فشل إرسال الرمز.", + "server error try again": "صار غلط بالسيرفر، جرب مرة تانية.", + "an error occurred": "صار غلط مو متوقع: @error", + "otp verification failed": "كود التأكيد غلط.", + "registration failed": "ما مشي حال التسجيل.", + "welcome user": "أهلاً بك، @firstName!", + "Don't forget your personal belongings.": "لا تنسى أغراضك.", + "Share App": "مشاركة التطبيق", + "Wallet": "المحفظة", + "Balance": "الرصيد", + "Profile": "الملف الشخصي", + "Contact Support": "التواصل مع الدعم", + "Session expired. Please log in again.": + "خلصت الجلسة. يا ريت ترجع تسجل دخول.", + "Security Warning": "⚠️ تحذير أمني", + "Potential security risks detected. The application may not function correctly.": + "في مخاطر أمنية. يمكن التطبيق ما يشتغل صح.", + "please order now": "اطلب هلا", + "Where to": "لوين؟", + "Where are you going?": "لوين رايح؟", + "Quick Actions": "إجراءات سريعة", + "My Balance": "رصيدي", + "Order History": "سجل الطلبات", + "Contact Us": "تواصل معنا", + "Driver": "كابتن", + "Complaint": "شكوى", + "Promos": "عروض", + "Recent Places": "آخر الأماكن", + "From": "من", + "WhatsApp Location Extractor": "جلب الموقع من الواتساب", + "Location Link": "رابط الموقع", + "Paste location link here": "لزق رابط الموقع هوني", + "Go to this location": "روح لهاد اللوكيشن", + "Paste WhatsApp location link": "لزق رابط لوكيشن الواتساب", + "Select Order Type": "نقي نوع الطلب", + "Choose who this order is for": "هاد الطلب لمين؟", + "I want to order for myself": "بدي اطلب لإلي", + "I want to order for someone else": "بدي اطلب لغيري", + "Order for someone else": "اطلب لغيرك", + "Order for myself": "اطلب لنفسك", + "Are you want to go this site": "بدك تروح لهاد اللوكيشن؟", + "No": "لا", + "Intaleq Wallet": "محفظة انطلق", + "Have a promo code?": "معك كود خصم؟", + "Your Wallet balance is ": "رصيد محفظتك هو ", + "Cash": "كاش", + "Pay directly to the captain": "ادفع للكابتن دغري", + "Top up Wallet to continue": "اشحن محفظتك لتكمل", + "Or pay with Cash instead": "أو فيك تدفع كاش بدالها", + "Confirm & Find a Ride": "تأكيد وتدوير على مشوار", + "Balance:": "الرصيد:", + "Alerts": "الإشعارات", + "Welcome Back!": "يا مية أهلاً!", + "Current Balance": "الرصيد الحالي", + "Set Wallet Phone Number": "تعيين رقم المحفظة", + "Link a phone number for transfers": "اربط رقم الجوال للتحويلات", + "Payment History": "سجل الدفعات", + "View your past transactions": "شوف الدفعات اللي صارت", + "Top up Wallet": "شحن المحفظة", + "Add funds using our secure methods": "عبي رصيد بطرقنا المضمونة", + "Increase Fare": "رفع الأجرة", + "No drivers accepted your request yet": + "لسا ما حدا من الكباتن قبل طلبك", + "Increasing the fare might attract more drivers. Would you like to increase the price?": + "إذا زدت الأجرة ممكن الكباتن يقبلوا أسرع. بدك ترفع السعر؟", + "Please make sure not to leave any personal belongings in the car.": + "يا ريت تنتبه ما تنسى غراضك بالسيارة.", + "Cancel Ride": "إلغاء المشوار", + "Route Not Found": "الطريق مو موجود", + "We couldn't find a valid route to this destination. Please try selecting a different point.": + "ما لقينا طريق لهوني. جرب تختار مكان تاني.", + "You can call or record audio during this trip.": + "فيك تدق أو تسجل صوت بهاد المشوار.", + "Warning: Speeding detected!": "انتبه: عم تسرع كتير!", + "Comfort": "مريحة", + "Intaleq Balance": "رصيد انطلق", + "Electric": "كهربائية", + "Lady": "سيدة", + "Van": "عائلية", + "Rayeh Gai": "رايح جاي", + "Join Intaleq as a driver using my referral code!": + "انضم لـ انطلق ككابتن بكود دعوتي!", + "Use code:": "استخدم الكود:", + "Download the Intaleq Driver app now and earn rewards!": + "نزل تطبيق انطلق للكباتن هلا واربح مكافآت!", + "Get a discount on your first Intaleq ride!": + "خد خصم على أول مشوار إلك مع انطلق!", + "Use my referral code:": "استخدم كود دعوتي:", + "Download the Intaleq app now and enjoy your ride!": + "نزل تطبيق انطلق هلا واستمتع بمشوارك!", + "Contacts Loaded": "تحملت الأسماء", + "Showing": "عم نعرض", + "of": "من", + "Customer not found": "الزبون مو موجود", + "Wallet is blocked": "المحفظة محظورة", + "Customer phone is not active": "جوال الزبون مو شغال", + "Balance not enough": "الرصيد مو كافي", + "Balance limit exceeded": "تخطيت حد الرصيد", + "Incorrect sms code": + "⚠️ الكود اللي دخلته غلط. يا ريت تحاول مرة تانية.", + "contacts. Others were hidden because they don't have a phone number.": + "اسم. البقية مخفيين لانو ما عندن أرقام.", + "No contacts found": "ما لقينا أسماء", + "No contacts with phone numbers were found on your device.": + "ما في أسماء عندن أرقام جوال بموبايلك.", + "Permission denied": "الطلب مرفوض", + "Contact permission is required to pick contacts": + "لازم تعطي إذن الوصول للأسماء لتختارن.", + "An error occurred while picking contacts:": + "صار غلط وقت عم ننقي الأسماء:", + "Please enter a correct phone": "يا ريت تدخل رقم صح", + "Success": "تمام", + "Invite sent successfully": "انبعتت الدعوة تمام", + "Hello! I'm inviting you to try Intaleq.": + "أهلاً! عم ادعيك تجرب تطبيق 'انطلق'.", + "Use my invitation code to get a special gift on your first ride!": + "استخدم كود دعوتي لتاخد هدية مميزة بأول مشوار إلك!", + "Your personal invitation code is:": "كود دعوتك الشخصي هو:", + "Be sure to use it quickly! This code expires at": + "استخدمه بسرعة! هاد الكود بيخلص بـ", + "Download the app now:": "نزل التطبيق هلا:", + "See you on the road!": "نشوفك ع الطريق!", + "This phone number has already been invited.": + "هاد الرقم انبعتله دعوة من قبل.", + "An unexpected error occurred. Please try again.": + "صار غلط مو متوقع. جرب مرة تانية.", + "You deserve the gift": "بتستاهل الهدية", + "Claim your 20 LE gift for inviting": "خد هديتك الـ ٢٠ ل.س دعوتك لـ", + "You have got a gift for invitation": "طلعتلك هدية مشان دعوتك", + "You have earned 20": "ربحت ٢٠", + "LE": "ل.س", + "Vibration feedback for all buttons": "تفعيل الاهتزاز لجميع الأزرار", + "Share with friends and earn rewards": + "شارك التطبيق مع أصدقائك واحصل على مكافآت", + "Gift Already Claimed": "أخدت الهدية من قبل", + "You have already received your gift for inviting": + "أنت أخدت الهدية خلاص على هي الدعوة", + "Keep it up!": "خليك هيكه!", + "has completed": "خلص", + "trips": "مشاوير", + "Personal Information": "المعلومات الشخصية", + "Name": "الاسم", + "Not set": "مو محدد", + "Gender": "الجنس", + "Education": "الدراسة", + "Work & Contact": "الشغل والاتصال", + "Employment Type": "نوع الشغل", + "Marital Status": "الحالة الاجتماعية", + "SOS Phone": "رقم الطوارئ", + "Sign Out": "تسجيل خروج", + "Delete My Account": "حذف حسابي", + "Update Gender": "تعديل الجنس", + "Update": "تحديث", + "Update Education": "تعديل الدراسة", + "Are you sure? This action cannot be undone.": + "متأكد؟ هاد الإجراء ما فيه تراجع.", + "Confirm your Email": "تأكد من إيميلك", + "Type your Email": "دخل إيميلك", + "Delete Permanently": "حذف نهائي", + "Male": "ذكر", + "Female": "أنثى", + "High School Diploma": "شهادة ثانوية", + "Associate Degree": "دبلوم", + "Bachelor's Degree": "إجازة جامعية", + "Master's Degree": "ماجستير", + "Doctoral Degree": "دكتوراه", + "Select your preferred language for the app interface.": + "نقي اللغة اللي بتفضلها لواجهة التطبيق.", + "Language Options": "خيارات اللغة", + "You can claim your gift once they complete 2 trips.": + "فيك تطلب هديتك بعد ما يخلص مشوارين.", + "Closest & Cheapest": "الأقرب والأرخص", + "Comfort choice": "خيار الراحة", + "Travel in a modern, silent electric car. A premium, eco-friendly choice for a smooth ride.": + "تنقّل بسيارة كهربائية حديثة وصامتة. خيار مميز ونظيف لرحلة مريحة.", + "Spacious van service ideal for families and groups. Comfortable, safe, and cost-effective travel together.": + "خدمة فان واسعة ومثالية للعائلات والمجموعات. سفر مريح، آمن، وموفر للكل.", + "Quiet & Eco-Friendly": "هادية ونظيفة", + "Lady Captain for girls": "كابتن سيدة للبنات", + "Van for familly": "سيارة فان لعيلة", + "Are you sure to delete this location?": "متأكد بدك تمسح هاد المكان؟", + "Submit a Complaint": "بعت شكوى", + "Submit Complaint": "إرسال الشكوى", + "No trip history found": "ما في سجل مشاوير", + "Your past trips will appear here.": "مشاويرك القديمة رح تطلع هوني.", + "1. Describe Your Issue": "١. اشرح شوه صار معك", + "Enter your complaint here...": "اكتب شكوتك هوني...", + "2. Attach Recorded Audio": "٢. إرفاق تسجيل صوتي", + "No audio files found.": "ما لقينا تسجيلات صوتية.", + "Confirm Attachment": "تأكيد الإرفاق", + "Attach this audio file?": "بدك ترفق هاد التسجيل؟", + "Uploaded": "ترفع بنجاح", + "3. Review Details & Response": "٣. مراجعة التفاصيل والرد", + "Date": "التاريخ", + "Today's Promos": "عروض اليوم", + "No promos available right now.": "ما في عروض هلا.", + "Check back later for new offers!": + "ارجع شيك بعدين لتشوف عروض جديدة!", + "Valid Until:": "صالح لغاية:", + "CODE": "الكود", + "Login": "تسجيل دخول", + "Sign in for a seamless experience": "سجل دخول لتاخد أحسن تجربة", + "Sign In with Google": "سجل دخول بجوجل", + "Sign in with Apple": "سجل دخول بآبل", + "User not found": "المستخدم مو موجود", + "Need assistance? Contact us": "بدك مساعدة؟ حاكينا", + "Email": "الإيميل", + "Your email address": "إيميلك", + "Enter a valid email": "دخل إيميل صح", + "Password": "كلمة السر", + "Your password": "كلمة سرك", + "Enter your password": "دخل كلمة السر", + "Submit": "إرسال", + "Terms of Use & Privacy Notice": "شروط الاستخدام وسياسة الخصوصية", + "By selecting \"I Agree\" below, I confirm that I have read and agree to the ": + "باختيار \"أوافق\" أدناه، أؤكد أنني قرأت ووافقت على ", + "Terms of Use": "شروط الاستخدام", + " and acknowledge the ": " وبتقر بـ ", + "Privacy Notice": "سياسة الخصوصية", + ". I am at least 18 years old.": ". وعمرك أكيد فوق الـ ١٨ سنة.", + "I Agree": "أوافق على الشروط والأحكام", + "Continue": "متابعة", + "Enable Location": "شغل اللوكيشن", + "To give you the best experience, we need to know where you are. Your location is used to find nearby captains and for pickups.": + "لنقدر نخدمك أحسن شي، لازم نعرف وينك. لوكيشنك بيلزمنا لنلاقي أقرب الكباتن ليك والمكان اللي رح تطلع منه.", + "Allow Location Access": "اسمح لنا نوصل للوكيشن", + "Welcome to Intaleq!": "يا مية أهلاً فيك بـ انطلق!", + "Before we start, please review our terms.": + "قبل ما نبلش، يا ريت تشوف شروطنا.", + "Your journey starts here": "مشوارك ببلش من هوني", + "Cancel Search": "إلغاء البحث", + "Set pickup location": "تحديد مكان البداية", + "Move the map to adjust the pin": "حرك الخريطة لتزبط اللوكيشن", + "Searching for the nearest captain...": "عم ندورلك على أقرب كابتن...", + "No one accepted? Try increasing the fare.": + "ما حدا قبل؟ جرب ترفع الأجرة شوي.", + "Increase Your Trip Fee (Optional)": "ارفع أجرة مشوارك (اختياري)", + "We haven't found any drivers yet. Consider increasing your trip fee to make your offer more attractive to drivers.": + "لسا ما لقينا كباتن. فيك ترفع الأجرة شوي لتشجع الكباتن يقبلوا طلبك.", + "No, thanks": "لا، شكراً", + "Increase Fee": "زيادة الأجرة", + "Copy": "نسخ", + "Promo Copied!": "انتسخ الكود!", + "Code": "الكود", + "copied to clipboard": "انتسخ الكود", + "Price": "السعر", + "Intaleq's Response": "رد فريق انطلق", + "Awaiting response...": "ناطرين الرد...", + "Audio file not attached": "التسجيل مو مرفق", + "The audio file is not uploaded yet.\\nDo you want to submit without it?": + "لم يتم رفع الملف الصوتي بعد.\\nهل تريد الإرسال بدونه؟", + "deleted": "انمسح", + "To Work": "ع الشغل", + "Work Saved": "تم حفظ موقع العمل", + "To Home": "إلى البيت", + "Home Saved": "تم حفظ موقع البيت", + "Destination selected": "تحددت الوجهة", + "Now select start pick": "الآن حدد نقطة الانطلاق", + "OK": "موافق", + "Confirm Pick-up Location": "تأكيد موقع الانطلاق", + "Set Location on Map": "حدد الموقع على الخريطة", + "You can contact us during working hours from 10:00 - 16:00.": + "فيك تحاكينا بأوقات الشغل من ١٠ للـ ٤.", + "Intaleq is the safest and most reliable ride-sharing app designed especially for passengers in Syria. We provide a comfortable, respectful, and affordable riding experience with features that prioritize your safety and convenience. Our trusted captains are verified, insured, and supported by regular car maintenance carried out by top engineers. We also offer on-road support services to make sure every trip is smooth and worry-free. With Intaleq, you enjoy quality, safety, and peace of mind—every time you ride.": + """إنطلِق هو التطبيق الأكثر أماناً وموثوقية لمشاركة الركوب والمصمم خصيصاً للركّاب في سوريا. نوفر لك تجربة تنقّل مريحة، محترمة، وبأسعار مناسبة، مع ميزات تضع سلامتك وراحتك في المقام الأول""", + "Customer MSISDN doesn’t have customer wallet": + "رقم الزبون ما عنده محفظة", + "Nearest Car: ~": "أقرب سيارة: ~", + "Nearest Car": "أقرب سيارة", + "No cars nearby": "ما في سيارات قريبة", + "Favorite Places": "الأماكن المفضلة", + "No favorite places yet!": "لسا ما عندك أماكن مفضلة!", + "from your favorites": "من مفضلتك", + "Back": "رجوع", + "Enter your code below to apply the discount.": + "دخل الكود تحت لتاخد الخصم", + "By selecting \"I Agree\" below, I confirm that I have read and agree to the": + "باختياري \"أوافق\" أدناه، أؤكد أنني قرأت ووافقت على", + "and acknowledge the": "وبتقر بـ", + "Enable Location Access": "تفعيل الوصول للموقع", + "We need your location to find nearby drivers for pickups and drop-offs.": + "بدنا اللوكيشن تبعك لنلاقي أقرب كباتن ليك.", + "You should restart app to change language": + "لازم تسكر التطبيق وترجع تفتحه لتتغير اللغة", + "Home Page": "الصفحة الرئيسية", + "To change Language the App": "لتغيير لغة التطبيق", + "Learn more about our app and mission": + "تعرف أكتر على تطبيقنا وأهدافنا", + "Promos For Today": "عروض اليوم", + "Choose your ride": "نقي مشوارك", + "Your Journey Begins Here": "مشوارك ببلش من هوني", + "Bonus gift": "هدية إضافية", + "Pay": "ادفع", + "Get": "خد", + "Send to Driver Again": "بعت للكابتن مرة تانية", + "Driver Name:": "اسم الكابتن:", + "No trip data available": "ما في بيانات للمشوار", + "Car Plate:": "رقم اللوحة:", + "remaining": "بقيان", + "Order Cancelled": "تم إلغاء الطلب", + "You canceled VIP trip": "كنسلت مشوار VIP", + "Passenger cancelled order": "الراكب كنسل الطلب", + "Your trip is scheduled": "مشوارك تجدول", + "Don't forget your ride!": "لا تنسى مشوارك!", + "Trip updated successfully": "تحدث المشوار تمام", + "Car Make:": "الماركة:", + "Car Model:": "الموديل:", + "Car Color:": "اللون:", + "Driver Phone:": "جوال الكابتن:", + "Pre-booking": "حجز مسبق", + "Waiting VIP": "بانتظار VIP", + "Driver List": "قائمة الكباتن", + "Confirm Trip": "تأكيد المشوار", + "Select date and time of trip": "نقي تاريخ ووقت المشوار", + "Date and Time Picker": "اختيار التاريخ والوقت", + "Trip Status:": "حالة المشوار:", + "pending": "عم نستنى", + "accepted": "مقبولة", + "rejected": "مرفوضة", + "Apply": "تطبيق", + "Enter your promo code": "دخل كود الخصم", + "Apply Promo Code": "تفعيل الكود", + "Scheduled Time:": "الوقت المجدول:", + "No drivers available": "ما في كباتن", + "No drivers available at the moment. Please try again later.": + "ما في كباتن متاحين هلا. يا ريت تجرب بعد شوي.", + "you have a negative balance of": "رصيدك ناقص بقيمته", + "Please try again in a few moments": "جرب مرة تانية بعد شوي", + "Unknown Driver": "كابتن مو معروف", + "in your": "بمحفظتك", + "The driver accepted your order for": "الكابتن قبل طلبك بـ", + "wallet due to a previous trip.": "بالمحفظة بسبب مشوار قديم.", + "rides": "مشاوير", + "Add Work": "إضافة الشغل", + "The reason is": "السبب هو", + "User does not have a wallet #1652": "المستخدم ليس لديه محفظة #1652", + "Price of trip": "سعر المشوار", + "From:": "من:", + "For Intaleq and Delivery trips, the price is calculated dynamically. For Comfort trips, the price is based on time and distance": + "لمشاوير انطلق والتوصيل، السعر بيتغير. وبمشاوير الراحة، السعر بيعتمد على الوقت والمسافة.", + "Phone Wallet Saved Successfully": "انحفظ رقم المحفظة تمام", + "Add wallet phone you use": "ضيف رقم المحفظة اللي بتستخدمها", + "Update Available": "في تحديث للتطبيق", + "Phone number must be exactly 11 digits long": + "رقم الجوال لازم يكون ١١ رقم", + "Insert Wallet phone number": "دخل رقم المحفظة", + "Phone number isn't an Egyptian phone number": "رقم الجوال مو صح", + "A new version of the app is available. Please update to the latest version.": + "في نسخة جديدة من التطبيق. يا ريت تحدثها.", + "We use location to get accurate and nearest passengers for you": + "منستخدم لوكيشنك لنطلعلك أقرب الركاب إلك.", + "This ride is already applied by another driver.": + "هاد المشوار أخده كابتن تاني خلاص.", + "We use your precise location to find the nearest available driver and provide accurate pickup and dropoff information. You can manage this in Settings.": + "منستخدم لوكيشنك الدقيق لنلاقي أقرب كابتن ونحدد مكان الطلب والوصول. فيك تتحكم بهاد الشي من الإعدادات.", + "Where are you, sir?": "وين صرت يا غالي؟", + "I've been trying to reach you but your phone is off.": + "عم حاول حاكيك بس موبايلك مسكر.", + "Please don't be late": "يا ريت ما تتأخر", + "Please don't be late, I'm waiting for you at the specified location.": + "يا ريت ما تتأخر، أنا ناطرك بالمكان اللي حددته.", + "My location is correct. You can search for me using the navigation app": + "موقعي صح. فيك تلاقيني من برنامج الخرائط", + "Hello, I'm at the agreed-upon location": + "مرحباً، أنا صرت بالمكان المتفق عليه", + "How much longer will you be?": "قديش بدك لتوصل؟", + "Phone number is verified before": "رقم الجوال مأكد من قبل", + "Change Ride": "تغيير المشوار", + "You can change the destination by long-pressing any point on the map": + "فيك تغير الوجهة بضغطة طويلة على أي نقطة ع الخريطة", + "Pick from map destination": "نقي الوجهة من الخريطة", + "Pick or Tap to confirm": "نقي أو اضغط للتأكيد", + "Accepted your order": "انقبل طلبك", + "Order Accepted": "تم قبول الطلب", + "with type": "من نوع", + "accepted your order at price": "وافق على طلبك بسعر", + "you canceled order": "لقد ألغيت الطلب", + "If you want order to another person": "إذا كنت تريد الطلب لشخص آخر", + "upgrade price": "زيادة السعر", + "airport": "مطار", + "Best choice for a comfortable car with a flexible route and stop points. This airport offers visa entry at this price.": + "الخيار الأفضل لسيارة مريحة مع مسار مرن ونقاط توقف. هذا المطار يوفر تأشيرة دخول بهذا السعر.", + "You can upgrade price to may driver accept your order": + "فيك تزيد السعر ليقبل الكابتن طلبك", + "Change Route": "تغيير الطريق", + "No Captain Accepted Your Order": "ما حدا من الكباتن قبل طلبك", + "We are looking for a captain but the price may increase to let a captain accept": + "عم ندور على كابتن بس ممكن يزيد السعر ليقبل حدا", + "No, I want to cancel this trip": "لا، بدي كانسل هي الرحلة", + "Attention": "انتباه", + "Trip Cancelled. The cost of the trip will be deducted from your wallet.": + "تكنسل المشوار. ورح تنخصم تكلفته من محفظتك.", + "You will be charged for the cost of the driver coming to your location.": + "رح تنحسب عليك تكلفة جية الكابتن لعندك.", + "reject your order.": "رفض طلبك.", + "Order Under Review": "الطلب عم يتراجع", + "is reviewing your order. They may need more information or a higher price.": + "يقوم بمراجعة طلبك. قد يحتاج لمعلومات إضافية أو سعر أعلى.", + "Vibration": "اهتزاز", + "Resend code": "رجع ابعت الكود", + "change device": "تغيير الجهاز", + "Device Change Detected": "تم اكتشاف تغيير بالجهاز", + "You can only use one device at a time. This device will now be set as your active device.": + "يمكنك استخدام جهاز واحد فقط في كل مرة. سيتم الآن تعيين هذا الجهاز كجهازك النشط.", + "Click here point": "اضغط هوني", + "Are you want to change": "بدك تغير؟", + "by": "بواسطة", + "Enter your complaint here": "أدخل شكواك هنا", + "Please enter your complaint.": "يا ريت تكتب شكوتك.", + "Complaint data saved successfully": "بيانات الشكوى انحفظت تمام", + "Trip Monitor": "مراقبة الرحلة", + "Insert SOS Phone": "دخل رقم الطوارئ", + "Add SOS Phone": "ضيف رقم الطوارئ", + "Dear ,\n\n 🚀 I have just started an exciting trip and I would like to share the details of my journey and my current location with you in real-time! Please download the Intaleq app. It will allow you to view my trip details and my latest location.\n\n 👉 Download link: \n Android [https://play.google.com/store/apps/details?id=com.mobileapp.store.ride]\n iOS [https://getapp.cc/app/6458734951]\n\n I look forward to keeping you close during my adventure!\n\n Intaleq ,": + "عزيزي،\n\n🚀 لقد بدأت رحلة شيقة وأود أن أشاركك تفاصيلها وموقعي الحالي بشكل مباشر! حمّل تطبيق انطلق لتتمكن من متابعة تفاصيل رحلتي وآخر موقع لي.\n\n👈 رابط التحميل:\nأندرويد [https://play.google.com/store/apps/details?id=com.mobileapp.store.ride]\nآيفون [https://getapp.cc/app/6458734951]\n\nيسعدني أن تبقى على اطلاع بمغامرتي!\n\nانطلق،", + "Send Intaleq app to him": "بعتله تطبيق انطلق", + "No passenger found for the given phone number": + "ما لقينا راكب بهاد الرقم", + "No user found for the given phone number": + "ما لقينا مستخدم بهاد الرقم", + "This price is": "هذا السعر هو", + "Work": "العمل", + "Add Home": "إضافة البيت", + "Notifications": "الإشعارات", + "💳 Pay with Credit Card": "💳 الدفع بالبطاقة الائتمانية", + "⚠️ You need to choose an amount!": "⚠️ لازم تختار مبلغ!", + "💰 Pay with Wallet": "💰 الدفع بالمحفظة", + "You must restart the app to change the language.": + "لازم ترجع تشغل التطبيق لتتغير اللغة.", + "joined": "انضم", + "Driver joined the channel": "الكابتن انضم إلى القناة", + "Driver left the channel": "الكابتن غادر القناة", + "Call Page": "صفحة الاتصال", + "Call Left": "مكالمات متبقية", + " Next as Cash !": " المشوار التاني كاش!", + "To use Wallet charge it": "لتستخدم المحفظة، لازم تشحنها", + "We are searching for the nearest driver to you": + "عم ندورلك على أقرب كابتن", + "Best choice for cities": "الخيار الأفضل للمدن", + "Rayeh Gai: Round trip service for convenient travel between cities, easy and reliable.": + "رايح جاي: خدمة ذهاب وإياب مريحة بين المدن، سهلة وموثوقة.", + "This trip is for women only": "هاد المشوار للبنات بس", + "Total budgets on month": "إجمالي الميزانية الشهرية", + "You have call from driver": "عندك مكالمة من الكابتن", + "Intaleq": "انطلق", + "passenger agreement": "اتفاقية الراكب", + "To become a passenger, you must review and agree to the ": + "لتصير راكب معنا، لازم تشوف وتوافق على", + "agreement subtitle": + "لتقدر تكمل، لازم تشوف شروط الاستخدام وسياسة الخصوصية وتوافق عليهن.", + "terms of use": "شروط الاستخدام", + " and acknowledge our Privacy Policy.": + "والإقرار بسياسة الخصوصية الخاصة بنا.", + "and acknowledge our": "والإقرار بـ", + "privacy policy": "سياسة الخصوصية.", + "i agree": "أوافق على الشروط والأحكام", + "Driver already has 2 trips within the specified period.": + "لدى الكابتن رحلتان بالفعل خلال الفترة المحددة.", + "The invitation was sent successfully": "انبعتت الدعوة تمام", + "You should select your country": "لازم تنقي بلدك", + "Scooter": "سكوتر", + "A trip with a prior reservation, allowing you to choose the best captains and cars.": + "مشوار بحجز مسبق، بيخليك تنقي أحسن الكباتن والسيارات.", + "Mishwar Vip": "مشوار VIP", + "The driver waiting you in picked location .": + "الكابتن ناطرك بمكان الانطلاق.", + "About Us": "من نحن", + "You can change the vibration feedback for all buttons": + "فيك تغير اهتزاز الأزرار من هوني", + "Most Secure Methods": "أكثر الطرق أماناً", + "In-App VOIP Calls": "مكالمات صوتية داخل التطبيق", + "Recorded Trips for Safety": "رحلات مسجلة للأمان", + "\nWe also prioritize affordability, offering competitive pricing to make your rides accessible.": + "\nنهتم أيضاً بأن تكون الأسعار مناسبة للجميع، حيث نقدم أسعاراً تنافسية لجعل رحلاتك في متناول اليد.", + "Intaleq is a ride-sharing app designed with your safety and affordability in mind. We connect you with reliable drivers in your area, ensuring a convenient and stress-free travel experience.\n\nHere are some of the key features that set us apart:": + "انطلق هو تطبيق لمشاركة الرحلات مصمم مع الأخذ بعين الاعتبار سلامتك وميزانيتك. نصلك بكباتن موثوقين في منطقتك، لنضمن لك تجربة تنقل مريحة وخالية من التوتر.\n\nإليك بعض الميزات الرئيسية التي تميزنا:", + "Sign In by Apple": "الدخول عبر Apple", + "Sign In by Google": "الدخول عبر Google", + "How do I request a ride?": "كيف أطلب رحلة؟", + "Step-by-step instructions on how to request a ride through the Intaleq app.": + "شرح خطوة بخطوة كيف تطلب مشوار من تطبيق انطلق.", + "What types of vehicles are available?": + "شوه أنواع السيارات المتاحة؟", + "Intaleq offers a variety of vehicle options to suit your needs, including economy, comfort, and luxury. Choose the option that best fits your budget and passenger count.": + "انطلق بيوفرلك أنواع سيارات بتناسبك، منها التوفير والراحة والـ VIP. نقي الخيار اللي بيناسب جيبتك وعددكم.", + "How can I pay for my ride?": "كيف فيني ادفع حق المشوار؟", + "Intaleq offers multiple payment methods for your convenience. Choose between cash payment or credit/debit card payment during ride confirmation.": + "انطلق بيوفرلك كذا طريقة دفع لتريحك. نقي بين الكاش أو كرت البنك وقت تأكيد المشوار.", + "Can I cancel my ride?": "فيني كنسل مشواري؟", + "Yes, you can cancel your ride under certain conditions (e.g., before driver is assigned). See the Intaleq cancellation policy for details.": + "إي فيك، بس بشروط معينة (مثلاً قبل ما يوافق الكابتن). شوف سياسة الإلغاء لتعرف التفاصيل.", + "Driver Registration & Requirements": "تسجيل الكباتن والمتطلبات", + "How can I register as a driver?": "كيف فيني سجل ككابتن؟", + "What are the requirements to become a driver?": + "شوه الطلبات لتصير كابتن؟", + "Visit our website or contact Intaleq support for information on driver registration and requirements.": + "زور موقعنا أو حاكي الدعم لتعرف أكتر عن تسجيل الكباتن.", + "Intaleq provides in-app chat functionality to allow you to communicate with your driver or passenger during your ride.": + "انطلق فيه شات بقلب التطبيق لتدردش مع الكابتن أو الراكب بأي وقت.", + "Intaleq prioritizes your safety. We offer features like driver verification, in-app trip tracking, and emergency contact options.": + "سلامتك هي الأهم عنا. بنوفرلك ميزات مثل التأكد من الكابتن، تتبع المشوار، وأرقام الطوارئ.", + "Frequently Questions": "الأسئلة الشائعة", + "User does not exist.": "المستخدم مو موجود.", + "We need your phone number to contact you and to help you.": + "بدنا رقم موبايلك لنحاكيك ونساعدك.", + "You will recieve code in sms message": "رح يوصلك كود برسالة SMS", + "Please enter": "يا ريت تدخل", + "We need your phone number to contact you and to help you receive orders.": + "بدنا رقم موبايلك لنحاكيك ونساعدك باستلام الطلبات.", + "The full name on your criminal record does not match the one on your driver's license. Please verify and provide the correct documents.": + "الاسم بـ 'لا حكم عليه' مو نفس اللي بالرخصة. تأكد وبعتلنا الوراق الصح.", + "The national number on your driver's license does not match the one on your ID document. Please verify and provide the correct documents.": + "الرقم الوطني بالرخصة مو نفسه اللي بالهوية. تأكد وبعتلنا الوراق الصح.", + "Capture an Image of Your Criminal Record": + "صور ورقة الـ 'لا حكم عليه'", + "IssueDate": "تاريخ الإصدار", + "Capture an Image of Your car license front": "صور وش رخصة السيارة", + "Capture an Image of Your ID Document front": "صور وش هويتك", + "NationalID": "الرقم الوطني", + "You can share the Intaleq App with your friends and earn rewards for rides they take using your code": + "فيك تشارك تطبيق انطلق مع رفقاتك وتربح مكافآت ع المشارير اللي بيعملوها بكودك.", + "FullName": "الاسم الكامل", + "No invitation found yet!": "لسا ما في دعوات!", + "InspectionResult": "نتيجة الفحص", + "Criminal Record": "لا حكم عليه", + "The email or phone number is already registered.": + "الإيميل أو رقم الموبايل مسجل من قبل.", + "To become a ride-sharing driver on the Intaleq app, you need to upload your driver's license, ID document, and car registration document. Our AI system will instantly review and verify their authenticity in just 2-3 minutes. If your documents are approved, you can start working as a driver on the Intaleq app. Please note, submitting fraudulent documents is a serious offense and may result in immediate termination and legal consequences.": + "لتصير كابتن بـ انطلق، لازم ترفع رخصتك، وهويتك، ودفتر السيارة. الذكاء الاصطناعي عنا رح يشيك عليهن بخلال دقايق. إذا الوراق تمام، فيك تبلش شغل دغري. بس انتبه، تزوير الوراق مشكلة كبيرة وممكن تسكر حسابك وتلاحقك قانونياً.", + "Documents check": "تشييك الوراق", + "Driver's License": "رخصة القيادة", + "for your first registration!": "لتسجيلك الأول!", + "Get it Now!": "احصل عليه الآن!", + "before": "قبل", + "Code not approved": "الكود مو مقبول", + "3000 LE": "3000 ل.س", + "Do you have an invitation code from another driver?": + "معك كود دعوة من كابتن تاني؟", + "Paste the code here": "لزق الكود هوني", + "No, I don't have a code": "لا، ما معي كود", + "Audio uploaded successfully.": "ترفع الصوت تمام.", + "Perfect for passengers seeking the latest car models with the freedom to choose any route they desire": + "مثالي للركاب اللي عم يدوروا على أحدث موديلات السيارات مع حرية نقي أي طريق بدهن ياه", + "Share this code with your friends and earn rewards when they use it!": + "شارك هاد الكود مع رفقاتك واربح مكافآت بس يستخدموه!", + "Enter phone": "دخل الرقم", + "complete, you can claim your gift": "اكتمل، فيك تطلب هديتك هلا", + "When": "عندما", + "Enter driver's phone": "دخل رقم الكابتن", + "Send Invite": "بعت دعوة", + "Show Invitations": "فرجينا الدعوات", + "License Type": "نوع الرخصة", + "National Number": "الرقم الوطني", + "Name (Arabic)": "الاسم (بالعربية)", + "Name (English)": "الاسم (بالإنكليزية)", + "Address": "العنوان", + "Issue Date": "تاريخ الإصدار", + "Expiry Date": "تاريخ الانتهاء", + "License Categories": "فئات الرخصة", + "driver_license": "رخصة القيادة", + "Capture an Image of Your Driver License": "التقط صورة لرخصة قيادتك", + "ID Documents Back": "الوجه الخلفي للهوية", + "National ID": "الرقم الوطني", + "Occupation": "المهنة", + "Religion": "الدين", + "Full Name (Marital)": "الاسم الكامل (حسب الحالة الاجتماعية)", + "Expiration Date": "تاريخ الانتهاء", + "Capture an Image of Your ID Document Back": + "التقط صورة للوجه الخلفي لهويتك", + "ID Documents Front": "الوجه الأمامي للهوية", + "First Name": "الاسم الأول", + "CardID": "رقم البطاقة", + "Vehicle Details Front": "تفاصيل السيارة (من قدام)", + "Plate Number": "رقم اللوحة", + "Owner Name": "اسم المالك", + "Vehicle Details Back": "تفاصيل السيارة (من ورا)", + "Make": "الشركة المصنعة", + "Model": "الموديل", + "Year": "سنة الصنع", + "Chassis": "رقم الشاسيه", + "Color": "اللون", + "Displacement": "سعة المحرك", + "Fuel": "نوع الوقود", + "Tax Expiry Date": "تاريخ انتهاء الضريبة", + "Inspection Date": "تاريخ الفحص", + "Capture an Image of Your car license back": + "التقط صورة للوجه الخلفي لرخصة سيارتك", + "Capture an Image of Your Driver's License": + "التقط صورة لرخصة قيادتك", + "Sign in with Google for easier email and name entry": + "سجل بجوجل لتسهل ع حالك كتابة الاسم والإيميل", + "You will choose allow all the time to be ready receive orders": + "نقي 'السماح طول الوقت' لتكون جاهز تستلم طلبات دغري", + "Get to your destination quickly and easily.": + "وصل لوجهتك بسرعة وسهولة.", + "Enjoy a safe and comfortable ride.": "استمتع بمشوار آمن ومريح.", + "Choose Language": "نقي اللغة", + "Pay with Wallet": "الدفع بالمحفظة", + "Invalid MPIN": "كود MPIN مو صح", + "Invalid OTP": "كود التأكيد مو صح", + "Enter your email address": "دخل إيميلك", + "Please enter Your Email.": "يا ريت تدخل إيميلك.", + "Enter your phone number": "دخل رقم موبايلك", + "Please enter your phone number.": "يا ريت تدخل رقم موبايلك.", + "Please enter Your Password.": "يا ريت تدخل كلمة السر.", + "if you dont have account": "إذا ما عندك حساب", + "Register": "تسجيل", + "Accept Ride's Terms & Review Privacy Notice": + "قبول شروط الرحلة ومراجعة بيان الخصوصية", + "By selecting 'I Agree' below, I have reviewed and agree to the Terms of Use and acknowledge the Privacy Notice. I am at least 18 years of age.": + "باختياري 'أوافق' تحت، بكون شفت ووافقت على شروط الاستخدام وسياسة الخصوصية. وعمري فوق الـ ١٨ سنة.", + "First name": "الاسم الأول", + "Enter your first name": "دخل اسمك الأول", + "Please enter your first name.": "يا ريت تدخل اسمك الأول.", + "Last name": "الاسم الأخير", + "Enter your last name": "دخل اسمك الأخير", + "Please enter your last name.": "يا ريت تدخل كنيتك.", + "City": "المدينة", + "Please enter your City.": "يا ريت تدخل مدينتك.", + "Verify Email": "التحقق من البريد الإلكتروني", + "We sent 5 digit to your Email provided": + "بعتنا كود من ٥ أرقام لإيميلك", + "5 digit": "5 أرقام", + "Send Verification Code": "بعت كود التأكيد", + "Your Ride Duration is ": "مدة رحلتك هي ", + "You will be thier in": "رح توصل بخلال", + "You trip distance is": "مسافة رحلتك هي", + "Fee is": "الأجرة هي", + "From : ": "من: ", + "To : ": "إلى: ", + "Add Promo": "إضافة عرض", + "Confirm Selection": "تأكيد الاختيار", + "distance is": "المسافة هي", + "Privacy Policy": "سياسة الخصوصية", + "Intaleq LLC": "شركة انطلق", + "Syria's pioneering ride-sharing service, proudly developed by Arabian and local owners. We prioritize being near you – both our valued passengers and our dedicated captains.": + "خدمة مشاركة المشاوير الأولى بسوريا، تفيدنا إنه نكون معك قريبين، سواء كنت راكب أو كابتن من كباتننا الغاليين.", + "Intaleq is the first ride-sharing app in Syria, designed to connect you with the nearest drivers for a quick and convenient travel experience.": + "انطلق هو أول تطبيق لمشاركة المشاوير بسوريا، مصمم ليوصلك بأقرب كابتن مشان توصل بسرعة وراحة.", + "Why Choose Intaleq?": "ليش تنقي انطلق؟", + "Closest to You": "أقرب شي إلك", + "We connect you with the nearest drivers for faster pickups and quicker journeys.": + "منوصلك بأقرب كابتن لتصل أسرع ومشاريرك تكون أسرع.", + "Uncompromising Security": "أمان تام", + "Lady Captains Available": "في كباتن بنات كمان", + "Recorded Trips (Voice & AI Analysis)": + "رحلات مسجلة (تحليل صوتي وذكاء اصطناعي)", + "Fastest Complaint Response": "أسرع استجابة للشكاوى", + "Our dedicated customer service team ensures swift resolution of any issues.": + "فريقنا بخدمة الزباين بضمنلك حل سريع لأي مشكلة بتواجهك.", + "Affordable for Everyone": "أسعار مناسبة للجميع", + "Frequently Asked Questions": "الأسئلة الشائعة", + "Getting Started": "البداية", + "Simply open the Intaleq app, enter your destination, and tap \"Request Ride\". The app will connect you with a nearby driver.": + "بس افتح تطبيق انطلق، دخل لوين بدك تروح، واضغط \"اطلب مشوار\". التطبيق دغري رح يوصلك بكابتن قريب.", + "Vehicle Options": "خيارات المركبات", + "Intaleq offers a variety of options including Economy, Comfort, and Luxury to suit your needs and budget.": + "انطلق بيقدم كذا خيار مثل التوفير والراحة والـ VIP لتنقي اللي بيناسب جيبتك.", + "Payments": "الدفع", + "You can pay for your ride using cash or credit/debit card. You can select your preferred payment method before confirming your ride.": + "فيك تدفع حق المشوار كاش أو بكرت البنك. نقي الطريقة اللي بتريحك قبل ما تأكد المشوار.", + "Ride Management": "إدارة الرحلات", + "Yes, you can cancel your ride, but please note that cancellation fees may apply depending on how far in advance you cancel.": + "إي فيك تكنسل المشوار، بس يمكن تنحسب عليك رسوم إلغاء حسب إيمتى كنسلت.", + "For Drivers": "للكباتن", + "Driver Registration": "تسجيل الكابتن", + "To register as a driver or learn about the requirements, please visit our website or contact Intaleq support directly.": + "لتسجل ككابتن أو لتعرف الشروط، يا ريت تزور موقعنا أو تحاكي الدعم عنا دغري.", + "Visit Website/Contact Support": "زيارة الموقع / التواصل مع الدعم", + "Close": "إغلاق", + "We are searching for the nearest driver": "عم ندور على أقرب كابتن", + "Communication": "التواصل", + "How do I communicate with the other party (passenger/driver)?": + "كيف فيني أحاكي الراكب أو الكابتن؟", + "You can communicate with your driver or passenger through the in-app chat feature once a ride is confirmed.": + "فيك تحاكي الكابتن أو الراكب من الشات اللي بقلب التطبيق بس يتأكد المشوار.", + "Safety & Security": "السلامة والأمان", + "What safety measures does Intaleq offer?": + "شوه ميزات الأمان اللي بيقدمها انطلق؟", + "Intaleq offers various safety features including driver verification, in-app trip tracking, emergency contact options, and the ability to share your trip status with trusted contacts.": + "انطلق بيوفرلك ميزات أمان كتير، مثل التأكد من الكابتن، تتبع المشوار، أرقام الطوارئ، وفيك تشارك مشوارك مع رفقاتك ليتطمنوا عليك.", + "Enjoy competitive prices across all trip options, making travel accessible.": + "استمتع بأسعار تنافسية لجميع خيارات الرحلات، مما يجعل التنقل في متناول الجميع.", + "Variety of Trip Choices": "تنوع خيارات الرحلات", + "Choose the trip option that perfectly suits your needs and preferences.": + "نقي نوع المشوار اللي بيناسبك وبيريحك.", + "Your Choice, Our Priority": "اختيارك أولويتنا", + "Because we are near, you have the flexibility to choose the ride that works best for you.": + "لأننا موجودين هوني وقريبين منك، فيك تنقي المشوار اللي بريحك.", + "duration is": "المدة هي", + "Setting": "الإعدادات", + "Find answers to common questions": "ابحث عن إجابات للأسئلة الشائعة", + "I don't need a ride anymore": "ما بقا بدي مشوار", + "I was just trying the application": "عم جرب التطبيق بس", + "No driver accepted my request": "ما حدا من الكباتن وافق على طلبي", + "I added the wrong pick-up/drop-off location": "دخلت لوكيشن غلط", + "I don't have a reason": "ما في سبب معين", + "Can we know why you want to cancel Ride ?": + "فيك تقلنا ليش بدك تكنسل المشوار؟", + "Add Payment Method": "إضافة طريقة دفع", + "Ride Wallet": "محفظة الرحلة", + "Payment Method": "طريقة الدفع", + "Type here Place": "اكتب المكان هوني", + "Are You sure to ride to": "متأكد بدك تروح لـ", + "Confirm": "تأكيد", + "You are Delete": "أنت تحذف", + "Deleted": "تم الحذف", + "You Dont Have Any places yet !": "لسا ما عندك أماكن!", + "From : Current Location": "من: الموقع الحالي", + "My Cared": "بطاقاتي", + "Add Card": "إضافة بطاقة", + "Add Credit Card": "إضافة بطاقة ائتمانية", + "Please enter the cardholder name": "الرجاء إدخال اسم صاحب البطاقة", + "Please enter the expiry date": "الرجاء إدخال تاريخ انتهاء الصلاحية", + "Please enter the CVV code": "الرجاء إدخال رمز CVV", + "Go To Favorite Places": "الذهاب إلى الأماكن المفضلة", + "Go to this Target": "اذهب إلى هذه الوجهة", + "My Profile": "ملفي الشخصي", + "Are you want to go to this site": "بدك تروح لهاد اللوكيشن؟", + "MyLocation": "موقعي", + "my location": "موقعي", + "Target": "الوجهة", + "You Should choose rate figure": "لازم تنقي تقييم", + "Login Captin": "تسجيل دخول الكابتن", + "Register Captin": "تسجيل كابتن", + "Send Verfication Code": "بعت كود التأكيد", + "KM": "كم", + "End Ride": "إنهاء المشوار", + "Minute": "دقيقة", + "Go to passenger Location now": "روح لعند الراكب هلا", + "Duration of the Ride is ": "مدة المشوار ", + "Distance of the Ride is ": "مسافة المشوار ", + "Name of the Passenger is ": "اسم الراكب ", + "Hello this is Captain": "أهلاً، معك الكابتن", + "Start the Ride": "بلش المشوار", + "Please Wait If passenger want To Cancel!": + "يا ريت تنطر شوي لبين ما نشوف إذا الراكب رح يكنسل!", + "Total Duration:": "المدة الإجمالية:", + "Active Duration:": "المدة النشطة:", + "Waiting for Captin ...": "بانتظار الكابتن...", + "Age is ": "العمر: ", + "Rating is ": "التقييم: ", + " to arrive you.": "للوصول إليك.", + "Tariff": "التعرفة", + "Settings": "الإعدادات", + "Feed Back": "التقييمات", + "Please enter a valid 16-digit card number": + "يا ريت تدخل رقم كرت صح من ١٦ رقم", + "Add Phone": "إضافة رقم", + "Please enter a phone number": "يا ريت تدخل رقم موبايل", + "You dont Add Emergency Phone Yet!": "لسا ما ضفت رقم طوارئ!", + "You will arrive to your destination after ": "رح تصل لوجهتك بعد ", + "You can cancel Ride now": "فيك تكنسل المشوار هلا", + "You Can cancel Ride After Captain did not come in the time": + "فيك تكنسل المشوار إذا ما وصل الكابتن ع الوقت", + "If you in Car Now. Press Start The Ride": + "إذا صرت بالسيارة هلا، اضغط على 'بلش المشوار'", + "You Dont Have Any amount in": "ما عندك رصيد بـ", + "Wallet!": "المحفظة!", + "You Have": "لديك", + "Save Credit Card": "حفظ البطاقة الائتمانية", + "Show Promos": "عرض العروض", + "10 and get 4% discount": "10 واحصل على خصم 4%", + "20 and get 6% discount": "20 واحصل على خصم 6%", + "40 and get 8% discount": "40 واحصل على خصم 8%", + "100 and get 11% discount": "100 واحصل على خصم 11%", + "Pay with Your PayPal": "ادفع عبر PayPal", + "You will choose one of above !": "اختر أحد الخيارات أعلاه!", + "Edit Profile": "تعديل الملف الشخصي", + "Copy this Promo to use it in your Ride!": + "انسخ هاد العرض واستخدمه بمشوارك!", + "To change some Settings": "لتغيير بعض الإعدادات", + "Order Request Page": "صفحة طلب الرحلة", + "Rouats of Trip": "مسارات الرحلة", + "Passenger Name is ": "اسم الراكب: ", + "Total From Passenger is ": "الإجمالي من الراكب: ", + "Duration To Passenger is ": "المدة للوصول للراكب: ", + "Distance To Passenger is ": "المسافة للوصول للراكب: ", + "Total For You is ": "الإجمالي لك: ", + "Distance is ": "المسافة: ", + " KM": " كم", + "Duration of Trip is ": "مدة الرحلة: ", + " Minutes": " دقائق", + "Apply Order": "قبول الطلب", + "Refuse Order": "رفض الطلب", + "Rate Captain": "تقييم الكابتن", + "Enter your Note": "أدخل ملاحظتك", + "Type something...": "اكتب شيئاً...", + "Submit rating": "بعت التقييم", + "Rate Passenger": "تقييم الراكب", + "Ride Summary": "ملخص الرحلة", + "welcome_message": "يا مية أهلاً بك بـ انطلق!", + "app_description": + "انطلق هو تطبيق لمشاركة المشاوير، موثوق، آمن، وجيبتك بتتحمله.", + "get_to_destination": "وصل لوجهتك بسرعة وسهولة.", + "get_a_ride": "مع انطلق، رح تلاقي حدا يوصلك لوجهتك بدقايق.", + "safe_and_comfortable": "استمتع برحلة آمنة ومريحة.", + "committed_to_safety": + "انطلق بيهمها سلامتك، وكل كباتننا منشيك عليهن وبالفحص الدقيق.", + "your ride is Accepted": "انقبل مشوارك", + "Driver is waiting at pickup.": "الكابتن ناطرك بمكان الانطلاق.", + "Driver is on the way": "الكابتن ع الطريق", + "Contact Options": "خيارات التواصل", + "Send a custom message": "إرسال رسالة مخصصة", + "Type your message": "اكتب رسالتك", + "I will go now": "صرت طالع", + "You Have Tips": "لديك إكرامية", + " tips\nTotal is": " إكرامية\nالإجمالي هو", + "Your fee is ": "أجرتك هي ", + "Do you want to pay Tips for this Driver": + "بدك تدفع إكرامية لهاد الكابتن؟", + "Tip is ": "الإكرامية: ", + "Are you want to wait drivers to accept your order": + "بدك تنطر الكباتن لبين ما حدا يقبل طلبك؟", + "This price is fixed even if the route changes for the driver.": + "هذا السعر ثابت حتى لو تغير مسار الكابتن.", + "The price may increase if the route changes.": + "قد يرتفع السعر إذا تغير المسار.", + "The captain is responsible for the route.": + "الكابتن هو المسؤول عن المسار.", + "We are search for nearst driver": "عم ندور على أقرب كابتن", + "Your order is being prepared": "طلبك عم يجهز", + "The drivers are reviewing your request": "الكباتن عم يشوفوا طلبك", + "Your order sent to drivers": "انبعت طلبك للكباتن", + "You can call or record audio of this trip": + "فيك تدق أو تسجل صوت بهاد المشوار", + "The trip has started! Feel free to contact emergency numbers, share your trip, or activate voice recording for the journey": + "بلش المشوار! فيك هلا تدق للطوارئ، أو تشارك مشوارك، أو تشغل تسجيل الصوت.", + "Camera Access Denied.": "الكاميرا انرفضت.", + "Open Settings": "فتح الإعدادات", + "GPS Required Allow !.": "لازم تشغل الـ GPS!", + "Your Account is Deleted": "انمسح حسابك", + "Are you sure to delete your account?": "متأكد بدك تمسح حسابك؟", + "Your data will be erased after 2 weeks\nAnd you will can't return to use app after 1 month ": + "رح نمسح بياناتك بعد أسبوعين\nوما رح فيك ترجع تستخدم التطبيق بعد شهر واحد.", + "Enter Your First Name": "دخل اسمك الأول", + "Are you Sure to LogOut?": "متأكد بدك تسجل خروج؟", + "Email Wrong": "البريد الإلكتروني خاطئ", + "Email you inserted is Wrong.": "الإيميل اللي دخلته غلط.", + "You have finished all times ": "خلصت كل المحاولات اللي إلك", + "if you want help you can email us here": + "إذا بدك مساعدة فيك تراسلنا من هوني", + "Thanks": "شكراً", + "Email Us": "راسلنا عبر البريد الإلكتروني", + "I cant register in your app in face detection ": + "ما عم بقدر سجل بالتطبيق مشان مشكلة بصورة الوش", + "Hi": "مرحباً", + "No face detected": "لم يتم التعرف على أي وجه", + "Image detecting result is ": "نتيجة فحص الصورة هي ", + "from 3 times Take Attention": "من 3 محاولات، انتبه", + "Be sure for take accurate images please\nYou have": + "يا ريت تتأكد من ووضوح الصورة\nعندك", + "image verified": "تم التحقق من الصورة", + "Next": "التالي", + "There is no help Question here": "ما في سؤال مساعدة هوني", + "You dont have Points": "ما عندك نقاط", + "You Are Stopped For this Day !": "وقفت لليوم!", + "You must be charge your Account": "يجب عليك شحن حسابك", + "You Refused 3 Rides this Day that is the reason \nSee you Tomorrow!": + "رفضت ٣ مشارير اليوم، مشان هيكه توقفت.\nمنشوفك بكرا!", + "Recharge my Account": "عبي رصيد حسابي", + "Ok , See you Tomorrow": "حسناً، أراك غداً", + "You are Stopped": "أنت موقوف", + "Connected": "متصل", + "Not Connected": "غير متصل", + "Your are far from passenger location": "أنت بعيد عن موقع الراكب", + "go to your passenger location before\nPassenger cancel trip": + "روح لعند الراكب قبل ما يكنسل المشوار", + "You will get cost of your work for this trip": + "رح تاخد حق تعبك بهاد المشوار", + " in your wallet": "في محفظتك", + "you gain": "لقد ربحت", + "Order Cancelled by Passenger": "الراكب كنسل الطلب", + "Feedback data saved successfully": "تم حفظ التقييم بنجاح", + "No Promo for today .": "ما في عرض لليوم.", + "Select your destination": "نقي وجهتك", + "Search for your Start point": "دور على من وين بدك تطلع", + "Search for waypoint": "دور على نقطة توقف", + "Current Location": "الموقع الحالي", + "Add Location 1": "إضافة موقع 1", + "You must Verify email !.": "لازم تتأكد من الإيميل!", + "Cropper": "قص الصورة", + "Saved Sucssefully": "تم الحفظ بنجاح", + "Select Date": "اختر التاريخ", + "Birth Date": "تاريخ الميلاد", + "Ok": "حسناً", + "the 500 points equal 30 JOD": "500 نقطة تساوي 30 ديناراً أردنياً", + "the 500 points equal 30 JOD for you \nSo go and gain your money": + "500 نقطة تساوي 30 ديناراً أردنياً لك\nاذهب الآن واكسب أموالك", + "token updated": "تم تحديث الرمز", + "Add Location 2": "إضافة موقع 2", + "Add Location 3": "إضافة موقع 3", + "Add Location 4": "إضافة موقع 4", + "Waiting for your location": "بانتظار موقعك", + "Search for your destination": "دور لوين بدك تروح", + "Hi! This is": "مرحباً! هذا", + " I am using": " أنا أستخدم", + " to ride with": " للتنقل مع", + " as the driver.": " ككابتن.", + "is driving a ": "يقود سيارة ", + " with license plate ": " رقم لوحتها ", + " I am currently located at ": " أنا حالياً في ", + "Please go to Car now ": "يا ريت تروح ع السيارة هلا", + "You will receive a code in WhatsApp Messenger": + "رح يوصلك الكود ع الواتساب", + "If you need assistance, contact us": "إذا بدك مساعدة، حاكينا", + "Promo Ended": "انتهى العرض", + "Enter the promo code and get": "دخل كود الخصم وخد", + "DISCOUNT": "خصم", + "No wallet record found": "لم يتم العثور على سجل للمحفظة", + "for": "لـ", + "Intaleq is the safest ride-sharing app that introduces many features for both captains and passengers. We offer the lowest commission rate of just 8%, ensuring you get the best value for your rides. Our app includes insurance for the best captains, regular maintenance of cars with top engineers, and on-road services to ensure a respectful and high-quality experience for all users.": + "انطلق هو تطبيق مشاركة الرحلات الأكثر أماناً، ويقدم ميزات عديدة للكباتن والركاب. نقدم أقل نسبة عمولة، 8% فقط، لنضمن لك أفضل قيمة لرحلاتك. يشمل تطبيقنا تأميناً لأفضل الكباتن، صيانة دورية للسيارات مع أفضل المهندسين، وخدمات على الطريق لتجربة محترمة وعالية الجودة لجميع المستخدمين.", + "You can contact us during working hours from 12:00 - 19:00.": + "فيك تحاكينا بأوقات الشغل من ١٠ للـ ٤.", + "Choose a contact option": "نقي كيف بدك تحاكينا", + "Work time is from 12:00 - 19:00.\nYou can send a WhatsApp message or email.": + "أوقات الشغل من ١٠ الصبح للـ ٤ المسا.\nفيك تبعت واتساب أو إيميل.", + "Promo code copied to clipboard!": "تم نسخ رمز العرض إلى الحافظة!", + "Copy Code": "نسخ الرمز", + "Your invite code was successfully applied!": + "تم تطبيق رمز دعوتك بنجاح!", + "Payment Options": "خيارات الدفع", + "wait 1 minute to receive message": + "انطر دقيقة لبين ما توصلك الرسالة", + "You have copied the promo code.": "لقد نسخت رمز العرض.", + "Select Payment Amount": "نقي شقد بدك تدفع", + "The promotion period has ended.": "لقد انتهت فترة العرض.", + "Promo Code Accepted": "تم قبول رمز العرض", + "Tap on the promo code to copy it!": "اضغط ع الكود لتنسخه!", + "Lowest Price Achieved": "تم الوصول لأقل سعر", + "Cannot apply further discounts.": + "لا يمكن تطبيق المزيد من الخصومات.", + "Promo Already Used": "تم استخدام العرض مسبقاً", + "Invitation Used": "تم استخدام الدعوة", + "You have already used this promo code.": + "لقد استخدمت هذا العرض مسبقاً.", + "Insert Your Promo Code": "أدخل رمز العرض الخاص بك", + "Enter promo code here": "دخل كود الخصم هوني", + "Please enter a valid promo code": "يا ريت تدخل كود صح", + "Awfar Car": "سيارة أوفر", + "Old and affordable, perfect for budget rides.": + "قديمة وجيبتك بتتحملها، ممتازة لتوفير المصاري.", + " If you need to reach me, please contact the driver directly at": + "إذا بدك تحاكيني، دق للكابتن دغري على", + "No Car or Driver Found in your area.": + "ما لقينا سيارات أو كباتن بمنطقتك.", + "Please Try anther time ": "جرب مرة تانية بعد شوي ", + "There no Driver Aplly your order sorry for that ": + "ما حدا من الكباتن قدم ع طلبك، منعتذر منك", + "Trip Cancelled": "تكنسل المشوار", + "The Driver Will be in your location soon .": + "الكابتن رح يوصل لعندك بعد شوي.", + "The distance less than 500 meter.": "المسافة أقل من ٥٠٠ متر.", + "Promo End !": "خلص العرض!", + "There is no notification yet": "لسا ما في إشعارات", + "Use Touch ID or Face ID to confirm payment": + "استخدم البصمة أو الوش لتأكد الدفع", + "Contact us for any questions on your order.": + "حاكينا لأي سؤال مشان طلبك.", + "Pyament Cancelled .": "تكنسل الدفع.", + "type here": "اكتب هوني", + "Scan Driver License": "مسح رخصة القيادة", + "Please put your licence in these border": + "يا ريت تحط رخصتك بقلب هاد المربع", + "Camera not initialized yet": "الكاميرا لسا ما اشتغلت", + "Take Image": "صور", + "AI Page": "صفحة الذكاء الاصطناعي", + "Take Picture Of ID Card": "صور الهوية", + "Take Picture Of Driver License Card": "صور رخصة القيادة", + "We are process picture please wait ": "عم نشيك ع الصورة، انطر شوي", + "There is no data yet.": "لسا ما في بيانات.", + "Name :": "الاسم:", + "Drivers License Class: ": "فئة الرخصة:", + "Document Number: ": "رقم الوثيقة:", + "Address: ": "العنوان:", + "Height: ": "الطول:", + "Expiry Date: ": "تاريخ الانتهاء:", + "Date of Birth: ": "تاريخ الميلاد:", + "You can't continue with us .\nYou should renew Driver license": + "ما فيك تكمل معنا.\nلازم تجدد الرخصة", + "Detect Your Face ": "التحقق من وجهك", + "Go to next step\nscan Car License.": + "روح ع الخطوة اللي بعدها\nصور رخصة السيارة.", + "Name in arabic": "الاسم بالعربية", + "Drivers License Class": "فئة رخصة القيادة", + "Selected Date": "التاريخ المحدد", + "Select Time": "نقي الوقت", + "Selected Time": "الوقت المحدد", + "Selected Date and Time": "التاريخ والوقت المحددان", + "Lets check Car license ": "خلونا نشيك ع رخصة السيارة", + "Car": "سيارة", + "Plate": "لوحة", + "Rides": "مشارير", + "Selected driver": "الكابتن المختار", + "Lets check License Back Face": "خلونا نشيك ع قفا الرخصة", + "Car License Card": "رخصة السيارة", + "No image selected yet": "لسا ما نقيت صورة", + "Made :": "الصنع:", + "model :": "الموديل:", + "VIN :": "رقم الهيكهل:", + "year :": "السنة:", + "ُExpire Date": "تاريخ الانتهاء", + "Login Driver": "دخول الكابتن", + "Password must br at least 6 character.": + "كلمة السر لازم تكون ٦ أحرف ع الأقل.", + "if you don't have account": "إذا ما عندك حساب", + "Here recorded trips audio": "هوني تسجيلات الصوت للمشارير", + "Register as Driver": "التسجيل ككابتن", + "By selecting \"I Agree\" below, I have reviewed and agree to the Terms of Use and acknowledge the ": + "بضغطة ع \"أوافق\" تحت، بكون شفت ووافقت على شروط الاستخدام وبقر بـ", + "Log Out Page": "صفحة تسجيل الخروج", + "Log Off": "تسجيل الخروج", + "Register Driver": "تسجيل كابتن", + "Verify Email For Driver": "تأكيد إيميل الكابتن", + "Admin DashBoard": "لوحة تحكم المشرف", + "Your name": "اسمك", + "your ride is applied": "تم قبول مشوارك", + "H and": "س و", + "JOD": "دينار", + "m": "د", + "We search nearst Driver to you": "عم ندورلك ع أقرب كابتن", + "please wait till driver accept your order": + "انطر شوي لبين ما كابتن يقبل طلبك", + "No accepted orders? Try raising your trip fee to attract riders.": + "ما حدا قبل؟ جرب ترفع الأجرة شوي لتشجع الكباتن.", + "You should select one": "لازم تنقي واحد", + "The driver accept your order for": "الكابتن قبل طلبك مقابل", + "The driver on your way": "الكابتن جاي لعندك", + "Total price from ": "السعر الإجمالي من ", + "Order Details Intaleq": "تفاصيل طلب انطلق", + "Selected file:": "الملف المختار:", + "Your trip cost is": "تكلفة مشوارك هي", + "this will delete all files from your device": + "هاد رح يمسح كل الملفات من موبايلك", + "Exclusive offers and discounts always with the Intaleq app": + "عروض وخصومات حصرية دايماً مع انطلق", + "Submit Question": "بعت السؤال", + "Please enter your Question.": "يا ريت تدخل سؤالك.", + "Help Details": "تفاصيل المساعدة", + "No trip yet found": "ما في مشوار لسا", + "No Response yet.": "لسا ما في رد.", + " You Earn today is ": "أرباحك اليوم هي ", + " You Have in": " عندك بـ", + "Total points is ": "إجمالي النقاط: ", + "Total Connection Duration:": "إجمالي مدة الاتصال:", + "Passenger name : ": "اسم الراكب: ", + "Cost Of Trip IS ": "تكلفة المشوار: ", + "Arrival time": "وقت الوصول", + "arrival time to reach your point": "وقت الوصول لوجهتك", + "For Intaleq and scooter trips, the price is calculated dynamically. For Comfort trips, the price is based on time and distance": + "لمشارير انطلق والسكوتر، السعر بيتغير. وبمشارير الراحة، السعر بيعتمد ع الوقت والمسافة.", + "Hello this is Driver": "أهلاً، معك الكابتن", + "Is the Passenger in your Car ?": "الراكب صر بقلب سيارتك؟", + "Please wait for the passenger to enter the car before starting the trip.": + "يا ريت تنطر الراكب ليركب بالسيارة قبل ما تبلش المشوار.", + "No ,still Waiting.": "لا، لسا عم انطر.", + "I arrive you": "صرت عندك", + "I Arrive your site": "أنا وصلت لعندك", + "You are not in near to passenger location": + "أنت مو قريب من مكان الراكب", + "please go to picker location exactly": + "يا ريت تروح ع اللوكيشن بالظبط", + "You Can Cancel Trip And get Cost of Trip From": + "فيك تكنسل المشوار وتاخد حقه من", + "Are you sure to cancel?": "متأكد بدك تكنسل؟", + "Insert Emergincy Number": "دخل رقم الطوارئ", + "Best choice for comfort car and flexible route and stops point": + "أحسن خيار لسيارة مريحة وطريق مرن ونقاط توقف", + "Insert": "إدخال", + "This is for scooter or a motorcycle.": "هاد للسكوتر أو الموتور.", + "This trip goes directly from your starting point to your destination for a fixed price. The driver must follow the planned route": + "هاد المشوار دغري من مكانك للوجهة بسعر ثابت. والكابتن لازم يلحق الطريق المحدد.", + "You can decline a request without any cost": + "فيك ترفض الطلب بلا ما تخسر شي", + "Perfect for adventure seekers who want to experience something new and exciting": + "ممتاز للي بيحبوا المغامرة وبدهن يجربوا شي جديد بياخد العقل", + "My current location is:": "موقعي الحالي هو:", + "and I have a trip on": "وعندي مشوار ع", + "App with Passenger": "التطبيق مع الراكب", + "You will be pay the cost to driver or we will get it from you on next trip": + "رح تدفع التكلفة للكابتن أو بناخدها منك المشوار الجاي", + "Trip has Steps": "المشوار إله كذا وجهة", + "Distance from Passenger to destination is ": + "المسافة من الراكب للوجهة: ", + "price is": "السعر هو", + "This ride type does not allow changes to the destination or additional stops": + "هاد النوع من المشارير ما فيه تغيير للوجهة أو نقاط توقف زيادة", + "This price may be changed": "ممكن يتغير هاد السعر", + "No SIM card, no problem! Call your driver directly through our app. We use advanced technology to ensure your privacy.": + "ما بدك سيم! حاكي الكابتن دغري من التطبيق. منستخدم تكنولوجيا متطورة لنحمي خصوصيتك.", + "This ride type allows changes, but the price may increase": + "هاد النوع فيه تغيير، بس ممكن يزيد السعر", + "Select one message": "نقي رسالة وحدة", + "I'm waiting for you": "أنا ناطرك", + "We noticed the Intaleq is exceeding 100 km/h. Please slow down for your safety. If you feel unsafe, you can share your trip details with a contact or call the police using the red SOS button.": + "السرعة زادت عن الميّة. يا ريت تمهل مشان سلامتك. إذا خفت، فيك تشارك مشوارك مع حدا أو تدق للشرطة من زر الطوارئ الأحمر.", + "Warning: Intaleqing detected!": "تحذير: تم كشف سرعة زيادة!", + "Please help! Contact me as soon as possible.": + "ساعدوني! حاكوني بأسرع وقت.", + "Share Trip Details": "مشاركة تفاصيل المشوار", + "Car Plate is ": "رقم لوحة السيارة: ", + "the 300 points equal 300 L.E for you \nSo go and gain your money": + "٣٠٠ نقطة بيسووا ٣٠٠ ليرة إلك\nروح هلا وطلع مصاري", + "the 300 points equal 300 L.E": "٣٠٠ نقطة بيسووا ٣٠٠ ليرة", + "The payment was not approved. Please try again.": + "ما انقبل الدفع. جرب مرة تانية.", + "Payment Failed": "فشل الدفع", + "This is a scheduled notification.": "هاد إشعار مجدول.", + "An error occurred during the payment process.": "صار غلط وقت الدفع.", + "The payment was approved.": "انقبل الدفع تمام.", + "Payment Successful": "تم الدفع بنجاح", + "No ride found yet": "لسا ما في مشارير", + "Accept Order": "قبول الطلب", + "Bottom Bar Example": "مثال الشريط السفلي", + "Driver phone": "رقم الكابتن", + "Statistics": "الإحصائيات", + "Origin": "نقطة الانطلاق", + "Destination": "الوجهة", + "Driver Name": "اسم الكابتن", + "Driver Car Plate": "رقم لوحة الكابتن", + "Available for rides": "متاح للمشارير", + "Scan Id": "مسح الهوية", + "Camera not initilaized yet": "الكاميرا لسا ما اشتغلت", + "Scan ID MklGoogle": "مسح الهوية MklGoogle", + "Language": "اللغة", + "Jordan": "الأردن", + "USA": "أمريكا", + "Egypt": "مصر", + "Turkey": "تركيا", + "Saudi Arabia": "السعودية", + "Qatar": "قطر", + "Bahrain": "البحرين", + "Kuwait": "الكويت", + "But you have a negative salary of": "بس عندك رصيد سالب بـ", + "Promo Code": "كود الخصم", + "Your trip distance is": "مسافة مشوارك هي", + "Enter promo code": "دخل كود الخصم", + "You have promo!": "عندك عرض!", + "Cost Duration": "تكلفة المدة", + "Duration is": "المدة هي", + "Leave": "مغادرة", + "Join": "انضمام", + "Heading your way now. Please be ready.": + "أنا ع الطريق لعندك هلا. خليك جاهز.", + "Approaching your area. Should be there in 3 minutes.": + "قربت لصل لعندك. بعد ٣ دقايق بكون عندك.", + "There's heavy traffic here. Can you suggest an alternate pickup point?": + "في عجقة سير قوية. فيك تقلي نطلع من مكان تاني؟", + "This ride is already taken by another driver.": + "هاد المشوار أخده كابتن تاني.", + "You Should be select reason.": "لازم تنقي السبب.", + "Waiting for Driver ...": "بانتظار الكابتن...", + "Latest Recent Trip": "آخر مشوار", + "from your list": "من قائمتك", + "Do you want to change Work location": "هل تريد تغيير موقع العمل؟", + "Do you want to change Home location": "هل تريد تغيير موقع المنزل؟", + "We Are Sorry That we dont have cars in your Location!": + "نأسف لعدم توفر سيارات في موقعك!", + "Choose from Map": "اختر من الخريطة", + "Pick your ride location on the map - Tap to confirm": + "اختر موقع رحلتك على الخريطة - اضغط للتأكيد", + "Intaleq is the ride-hailing app that is safe, reliable, and accessible.": + "انطلق هو تطبيق طلب السيارات الآمن، الموثوق، وفي متناول اليد.", + "With Intaleq, you can get a ride to your destination in minutes.": + "مع انطلق، يمكنك الوصول إلى وجهتك في دقائق.", + "Intaleq is committed to safety, and all of our captains are carefully screened and background checked.": + "تلتزم انطلق بالسلامة، وجميع كباتننا يتم فحصهم بعناية والتحقق من سجلاتهم.", + "Pick from map": "اختر من الخريطة", + "No Car in your site. Sorry!": "لا توجد سيارة في موقعك. نعتذر!", + "Nearest Car for you about ": "أقرب سيارة لك على بعد ", + "From :": "من:", + "Get Details of Trip": "الحصول على تفاصيل الرحلة", + "If you want add stop click here": + "إذا أردت إضافة نقطة توقف، اضغط هنا", + "Where you want go ": "إلى أين تريد الذهاب؟", + "My Card": "بطاقتي", + "Start Record": "بدء التسجيل", + "History of Trip": "سجل الرحلات", + "Helping Center": "مركز المساعدة", + "Record saved": "انحفظ التسجيل", + "Trips recorded": "المشارير المسجلة", + "Select Your Country": "نقي بلدك", + "To ensure you receive the most accurate information for your location, please select your country below. This will help tailor the app experience and content to your country.": + "مشان توصلك أدق المعلومات لمكانك، يا ريت تنقي بلدك من تحت. هاد بيساعدنا نضبطلك تجربة التطبيق والمحتوى ع كفّك.", + "Are you sure to delete recorded files": "متأكد بدك تمسح التسجيلات؟", + "Select recorded trip": "نقي مشوار مسجل", + "Card Number": "رقم البطاقة", + "Hi, Where to ": "أهلاً، لوين حابب تروح؟", + "Pick your destination from Map": "نقي وجهتك من الخريطة", + "Add Stops": "إضافة نقاط توقف", + "Get Direction": "خد الاتجاهات", + "Add Location": "إضافة موقع", + "Switch Rider": "تبديل الراكب", + "You will arrive to your destination after timer end.": + "رح توصل لوجهتك بس يخلص الوقت.", + "You can cancel trip": "فيك تكنسل المشوار", + "The driver waitting you in picked location .": + "الكابتن ناطرك بمكان الانطلاق.", + "Pay with Your": "ادفع بـ", + "Pay with Credit Card": "الدفع بالكريدت كارد", + "Show Promos to Charge": "عرض العروض لتشحن", + "Point": "نقطة", + "How many hours would you like to wait?": "كم ساعة حابب تنطر؟", + "Driver Wallet": "محفظة الكابتن", + "Choose between those Type Cars": "نقي بين أنواع السيارات هاي", + "hour": "ساعة", + "Select Waiting Hours": "نقي ساعات الانتظار", + "Total Points is": "مجموع النقاط", + "You will receive a code in SMS message": "رح يوصلك كود برسالة نصية", + "Done": "تمام", + "Total Budget from trips is ": "إجمالي الميزانية من المشارير: ", + "Total Amount:": "المبلغ الإجمالي:", + "Total Budget from trips by\nCredit card is ": + "إجمالي الميزانية من المشارير بالكريدت كارد: ", + "This amount for all trip I get from Passengers": + "هاد المبلغ لكل المشارير اللي عم آخدها من الركاب", + "Pay from my budget": "ادفع من ميزانيتي", + "This amount for all trip I get from Passengers and Collected For me in": + "هاد المبلغ لكل المشارير اللي عم آخدها من الركاب والمجمعة عندي بـ", + "You can buy points from your budget": "فيك تشتري نقاط من ميزانيتك", + "insert amount": "حط المبلغ", + "You can buy Points to let you online\nby this list below": + "فيك تشتري نقاط لتكون أونلاين\nمن القائمة اللي تحت", + "Create Wallet to receive your money": "اعمل محفظة لتاخد مصاريك", + "Enter your feedback here": "حط تقييمك هوني", + "Please enter your feedback.": "يا ريت تحط تقييمك.", + "Feedback": "تقييم", + "Submit ": "بعت ", + "Click here to Show it in Map": "اضغط هوني لتبين ع الخريطة", + "Canceled": "تكنسل", + "No I want": "لا بدي", + "Email is": "الإيميل:", + "Phone Number is": "رقم التلفون:", + "Date of Birth is": "تاريخ الميلاد:", + "Sex is ": "الجنس: ", + "Car Details": "تفاصيل السيارة", + "VIN is": "رقم الهيكهل:", + "Color is ": "اللون: ", + "Make is ": "الماركة: ", + "Model is": "الموديل:", + "Year is": "السنة:", + "Expiration Date ": "تاريخ الانتهاء: ", + "Edit Your data": "عدل بياناتك", + "write vin for your car": "اكتب رقم هيكهل سيارتك", + "VIN": "رقم الهيكهل", + "Please verify your identity": "يا ريت تأكد هويتك", + "write Color for your car": "اكتب لون سيارتك", + "write Make for your car": "اكتب ماركة سيارتك", + "write Model for your car": "اكتب موديل سيارتك", + "write Year for your car": "اكتب سنة سيارتك", + "write Expiration Date for your car": "اكتب تاريخ انتهاء سيارتك", + "Tariffs": "التعرفات", + "Minimum fare": "أقل أجرة", + "Maximum fare": "أكثر أجرة", + "Flag-down fee": "فيتة العداد (البداية)", + "Including Tax": "شامل الضريبة", + "BookingFee": "رسوم الحجز", + "Morning": "صبح", + "from 07:30 till 10:30 (Thursday, Friday, Saturday, Monday)": + "من ٧:٣٠ لـ ١٠:٣٠ (خميس، جمعة، سبت، اثنين)", + "Evening": "مسا", + "from 12:00 till 15:00 (Thursday, Friday, Saturday, Monday)": + "من ١٢:٠٠ لـ ٣:٠٠ (خميس، جمعة، سبت، اثنين)", + "Night": "ليل", + "You have in account": "عندك بالحساب", + "Select Country": "نقي البلد", + "Ride Today : ": "مشوار اليوم: ", + "After this period\nYou can't cancel!": "بعد هالفترة\nما فيك تكنسل!", + "from 23:59 till 05:30": "من ١١:٥٩ لـ ٥:٣٠", + "Rate Driver": "قيم الكابتن", + "Total Cost is ": "التكلفة الكلية: ", + "Write note": "اكتب ملاحظة", + "Time to arrive": "وقت الوصول", + "Ride Summaries": "ملخصات المشارير", + "Total Cost": "التكلفة الكلية", + "Average of Hours of": "متوسط ساعات", + " is ON for this month": " شغال هاد الشهر", + "Days": "أيام", + "Total Hours on month": "إجمالي الساعات بالشهر", + "Counts of Hours on days": "عدد الساعات بالأيام", + "OrderId": "رقم الطلب", + "created time": "وقت الإنشاء", + "Intaleq Over": "خلص مشوار انطلق", + "I will slow down": "رح خفف السرعة", + "Map Passenger": "خريطة الراكب", + "Be Slowly": "تمهل", + "If you want to make Google Map App run directly when you apply order": + "إذا بدك تفتح خرائط جوجل دغري بس تقبل الطلب", + "You can change the language of the app": "فيك تغير لغة التطبيق", + "Your Budget less than needed": "رصيدك ما بيكفي", + "You can change the Country to get all features": + "فيك تغير البلد لتاخد كل الميزات", + "There is no Car or Driver in your area.": + "ما في سيارات أو كباتن بمنطقتك.", + "Change Country": "تغيير البلد", + }, + "AR-Gulf": { + "Syria": "سوريا", + "SYP": "ل.س", + "Order": "طلب", + "OrderVIP": "طلب VIP", + "Cancel Trip": "إلغاء الرحلة", + "Passenger Cancel Trip": "الراكب ألغى الرحلة", + "VIP Order": "طلب VIP", + "The driver accepted your trip": "الكابتن قبل مشوارك", + "message From passenger": "رسالة من الراكب", + "Cancel": "إلغاء", + "Trip Cancelled. The cost of the trip will be added to your wallet.": + "تم إلغاء الرحلة. رح تضاف التكلفة لمحفظتك.", + "token change": "تغيير الرمز", + "Changed my mind": "غيرت رأيي", + "Please write the reason...": "الرجاء كتابة السبب...", + "Found another transport": "لقيت وسيلة ثانية", + "Driver is taking too long": "الكابتن متأخر كثير", + "Driver asked me to cancel": "الكابتن طلب مني إلغاء", + "Wrong pickup location": "مكان الانطلاق خطأ", + "Other": "شي ثاني", + "Don't Cancel": "لا تلغي", + "No Drivers Found": "ما لقينا كباتن", + "Sorry, there are no cars available of this type right now.": + "نعتذر، ما فيه سيارات من هذا النوع الحين.", + "Refresh Map": "تحديث الخريطة", + "face detect": "التعرف على الوجه", + "Face Detection Result": "نتيجة التعرف على الوجه", + "similar": "مشابه", + "not similar": "غير مشابه", + "Searching for nearby drivers...": "نبحث عن كباتن قريبين...", + "Error": "خطأ", + "Failed to search, please try again later": + "فشل البحث، حاول مرة ثانية", + "Connection Error": "مشكلة في الاتصال", + "Please check your internet connection": "تأكد من اتصال الإنترنت", + "Sorry 😔": "عذراً 😔", + "The driver cancelled the trip for an emergency reason.\nDo you want to search for another driver immediately?": + "الكابتن ألغى الرحلة لسبب طارئ.\nتبي نبحث عن كابتن ثاني فوراً؟", + "Search for another driver": "ابحث عن كابتن ثاني", + "We apologize 😔": "نعتذر 😔", + "No drivers found at the moment.\nPlease try again later.": + "ما لقينا كباتن حالياً.\nحاول مرة ثانية بعد شوي.", + "Hi ,I will go now": "مرحباً، أنا طالع الحين", + "Passenger come to you": "الراكب جاي عندك", + "Call Income": "مكالمة واردة", + "Call Income from Passenger": "مكالمة من الراكب", + "Criminal Document Required": "مطلوب وثيقة (لا حكم عليه)", + "You should have upload it .": "لازم ترفعها.", + "Call End": "انتهت المكالمة", + "The order has been accepted by another driver.": + "الطلب أخذه كابتن ثاني.", + "The order Accepted by another Driver": "الطلب مقبول من كابتن ثاني", + "We regret to inform you that another driver has accepted this order.": + "نأسف، كابتن ثاني سبق وأخذ الطلب.", + "Driver Applied the Ride for You": "الكابتن قدم الطلب لك", + "Applied": "تم التقديم", + "Please go to Car Driver": "روح للكابتن", + "Ok I will go now.": "تمام، أنا طالع الحين.", + "Accepted Ride": "تم قبول الرحلة", + "Driver Accepted the Ride for You": "الكابتن قبل مشوارك", + "Promo": "عرض", + "Show latest promo": "اعرض أحدث العروض", + "Trip Monitoring": "مراقبة الرحلة", + "Driver Is Going To Passenger": "الكابتن جاي عندك", + "Please stay on the picked point.": "لا تتحرك من مكانك.", + "message From Driver": "رسالة من الكابتن", + "Trip is Begin": "بدأت الرحلة", + "Cancel Trip from driver": "الكابتن ألغى الرحلة", + "We will look for a new driver.\nPlease wait.": + "نبحث عن كابتن جديد.\nانتظر شوي.", + "The driver canceled your ride.": "الكابتن ألغى مشوارك.", + "Driver Finish Trip": "الكابتن خلص الرحلة", + "you will pay to Driver": "رح تدفع للكابتن", + "Don’t forget your personal belongings.": "لا تنسى أغراضك الشخصية.", + "Please make sure you have all your personal belongings and that any remaining fare, if applicable, has been added to your wallet before leaving. Thank you for choosing the Intaleq app": + "تأكد من أغراضك، وأن الرصيد المتبقي تمت إضافته لمحفظتك قبل النزول. شكراً لثقتك في انطلق.", + "Finish Monitor": "إنهاء المراقبة", + "Trip finished": "خلصت الرحلة", + "Call Income from Driver": "مكالمة من الكابتن", + "Driver Cancelled Your Trip": "الكابتن ألغى مشوارك", + "you will pay to Driver you will be pay the cost of driver time look to your Intaleq Wallet": + "رح تدفع للكابتن قيمة وقته، شوف محفظتك في انطلق", + "Order Applied": "تم تقديم الطلب", + "welcome to intaleq": "أهلاً بك في انطلق", + "login or register subtitle": + "أدخل رقم جوالك لتسجيل الدخول أو فتح حساب جديد", + "Complaint cannot be filed for this ride. It may not have been completed or started.": + "ما تقدر ترفع شكوى لهذه الرحلة. يمكن ما بدأت أو خلصت.", + "phone number label": "رقم الجوال", + "phone number required": "الرجاء إدخال رقم الجوال", + "send otp button": "إرسال رمز التأكيد", + "verify your number title": "تأكيد رقمك", + "otp sent subtitle": "تم إرسال رمز مكون من 5 أرقام إلى\n@phoneNumber", + "verify and continue button": "تأكيد ومتابعة", + "enter otp validation": "الرجاء إدخال الرمز (5 أرقام)", + "one last step title": "خطوة أخيرة", + "complete profile subtitle": "أكمل بياناتك عشان تبدأ", + "first name label": "الاسم الأول", + "first name required": "الرجاء كتابة الاسم الأول", + "last name label": "الاسم الأخير", + "Verify OTP": "تأكيد الرمز", + "Verification Code": "رمز التأكيد", + "We have sent a verification code to your mobile number:": + "أرسلنا رمز التأكيد إلى رقم جوالك:", + "Verify": "تأكيد", + "Resend Code": "إعادة إرسال الرمز", + "You can resend in": "تقدر ترسل مرة ثانية بعد", + "seconds": "ثواني", + "Please enter the complete 6-digit code.": + "الرجاء إدخال الرمز كاملاً (6 أرقام).", + "last name required": "الرجاء كتابة الكنية", + "email optional label": "البريد الإلكتروني (اختياري)", + "complete registration button": "إتمام التسجيل", + "User with this phone number or email already exists.": + "هذا الرقم أو البريد الإلكتروني مسجل مسبقاً.", + "otp sent success": "تم إرسال رمز التأكيد على واتساب.", + "failed to send otp": "فشل إرسال الرمز.", + "server error try again": "خطأ في الخادم، حاول مرة ثانية.", + "an error occurred": "حدث خطأ غير متوقع: @error", + "otp verification failed": "رمز التأكيد خطأ.", + "registration failed": "فشل التسجيل.", + "welcome user": "أهلاً بك، @firstName!", + "Don't forget your personal belongings.": "لا تنسى أغراضك.", + "Share App": "مشاركة التطبيق", + "Wallet": "المحفظة", + "Balance": "الرصيد", + "Profile": "الملف الشخصي", + "Contact Support": "التواصل مع الدعم", + "Session expired. Please log in again.": + "انتهت الجلسة. الرجاء تسجيل الدخول مرة ثانية.", + "Security Warning": "⚠️ تحذير أمني", + "Potential security risks detected. The application may not function correctly.": + "تم اكتشاف مخاطر أمنية. قد لا يعمل التطبيق بشكل صحيح.", + "please order now": "اطلب الحين", + "Where to": "إلى وين؟", + "Where are you going?": "إلى وين رايح؟", + "Quick Actions": "إجراءات سريعة", + "My Balance": "رصيدي", + "Order History": "سجل الطلبات", + "Contact Us": "اتصل بنا", + "Driver": "كابتن", + "Complaint": "شكوى", + "Promos": "عروض", + "Recent Places": "الأماكن الأخيرة", + "From": "من", + "WhatsApp Location Extractor": "جلب الموقع من واتساب", + "Location Link": "رابط الموقع", + "Paste location link here": "الصق رابط الموقع هنا", + "Go to this location": "اذهب إلى هذا الموقع", + "Paste WhatsApp location link": "الصق رابط موقع الواتساب", + "Select Order Type": "اختر نوع الطلب", + "Choose who this order is for": "هذا الطلب لمين؟", + "I want to order for myself": "أبي أطلب لنفسي", + "I want to order for someone else": "أبي أطلب لشخص ثاني", + "Order for someone else": "طلب لشخص ثاني", + "Order for myself": "طلب لنفسي", + "Are you want to go this site": "تبي تروح لهذا الموقع؟", + "No": "لا", + "Intaleq Wallet": "محفظة انطلق", + "Have a promo code?": "معك كود خصم؟", + "Your Wallet balance is ": "رصيد محفظتك هو ", + "Cash": "كاش", + "Pay directly to the captain": "ادفع للكابتن مباشرة", + "Top up Wallet to continue": "اشحن محفظتك عشان تكمل", + "Or pay with Cash instead": "أو تقدر تدفع كاش بدلاً عنها", + "Confirm & Find a Ride": "تأكيد والبحث عن رحلة", + "Balance:": "الرصيد:", + "Alerts": "التنبيهات", + "Welcome Back!": "أهلاً وسهلاً!", + "Current Balance": "الرصيد الحالي", + "Set Wallet Phone Number": "تعيين رقم المحفظة", + "Link a phone number for transfers": "اربط رقم الجوال للتحويلات", + "Payment History": "سجل الدفعات", + "View your past transactions": "شوف دفعاتك السابقة", + "Top up Wallet": "شحن المحفظة", + "Add funds using our secure methods": "ضيف رصيد عبر طرقنا الآمنة", + "Increase Fare": "زيادة الأجرة", + "No drivers accepted your request yet": "لسه ما قبل طلبك أي كابتن", + "Increasing the fare might attract more drivers. Would you like to increase the price?": + "زيادة الأجرة ممكن تشجع الكباتن. تبغى ترفع السعر؟", + "Please make sure not to leave any personal belongings in the car.": + "انتبه لا تنسى أغراضك بالسيارة.", + "Cancel Ride": "إلغاء الرحلة", + "Route Not Found": "الطريق غير موجود", + "We couldn't find a valid route to this destination. Please try selecting a different point.": + "ما لقينا طريق صالح لهذه الوجهة. اختر نقطة ثانية.", + "You can call or record audio during this trip.": + "تقدر تتصل أو تسجل صوت خلال هذه الرحلة.", + "Warning: Speeding detected!": "انتبه: السرعة زايدة!", + "Comfort": "مريحة", + "Intaleq Balance": "رصيد انطلق", + "Electric": "كهربائية", + "Lady": "سيدة", + "Van": "عائلية", + "Rayeh Gai": "رايح جاي", + "Join Intaleq as a driver using my referral code!": + "انضم لانطلق ككابتن بكود دعوتي!", + "Use code:": "استخدم الكود:", + "Download the Intaleq Driver app now and earn rewards!": + "حمّل تطبيق انطلق للكباتن الحين واكسب مكافآت!", + "Get a discount on your first Intaleq ride!": + "احصل على خصم لأول مشوار لك مع انطلق!", + "Use my referral code:": "استخدم كود دعوتي:", + "Download the Intaleq app now and enjoy your ride!": + "حمّل تطبيق انطلق الحين واستمتع برحلتك!", + "Contacts Loaded": "تم تحميل جهات الاتصال", + "Showing": "نعرض", + "of": "من", + "Customer not found": "العميل غير موجود", + "Wallet is blocked": "المحفظة محظورة", + "Customer phone is not active": "جوال العميل غير نشط", + "Balance not enough": "الرصيد غير كافٍ", + "Balance limit exceeded": "تجاوزت حد الرصيد", + "Incorrect sms code": "⚠️ الكود الذي أدخلته خطأ. حاول مرة ثانية.", + "contacts. Others were hidden because they don't have a phone number.": + "جهة اتصال. البقية تم إخفاؤها لأنه ما عندها رقم.", + "No contacts found": "ما لقينا جهات اتصال", + "No contacts with phone numbers were found on your device.": + "ما فيه جهات اتصال بها أرقام على جهازك.", + "Permission denied": "تم رفض الإذن", + "Contact permission is required to pick contacts": + "مطلوب إذن الوصول لجهات الاتصال عشان تختارها.", + "An error occurred while picking contacts:": + "حدث خطأ أثناء اختيار جهات الاتصال:", + "Please enter a correct phone": "أدخل رقم صحيح", + "Success": "نجاح", + "Invite sent successfully": "تم إرسال الدعوة بنجاح", + "Hello! I'm inviting you to try Intaleq.": + "أهلاً! أدعوك لتجربة تطبيق 'انطلق'.", + "Use my invitation code to get a special gift on your first ride!": + "استخدم كود دعوتي عشان تحصل على هدية خاصة في أول مشوار لك!", + "Your personal invitation code is:": "كود دعوتك الشخصي هو:", + "Be sure to use it quickly! This code expires at": + "استخدمه بسرعة! هذا الكود ينتهي في", + "Download the app now:": "حمّل التطبيق الحين:", + "See you on the road!": "نشوفك على الطريق!", + "This phone number has already been invited.": + "هذا الرقم تمت دعوته مسبقاً.", + "An unexpected error occurred. Please try again.": + "حدث خطأ غير متوقع. حاول مرة ثانية.", + "You deserve the gift": "تستحق الهدية", + "Claim your 20 LE gift for inviting": + "استلم هديتك 20 ل.س مقابل دعوتك لـ", + "You have got a gift for invitation": "حصلت على هدية بسبب دعوتك", + "You have earned 20": "ربحت 20", + "LE": "ل.س", + "Vibration feedback for all buttons": "تفعيل الاهتزاز لجميع الأزرار", + "Share with friends and earn rewards": + "شارك التطبيق مع أصدقائك واحصل على مكافآت", + "Gift Already Claimed": "الهدية مطلوبة مسبقاً", + "You have already received your gift for inviting": + "لقد استلمت هديتك بالفعل لهذه الدعوة", + "Keep it up!": "استمر!", + "has completed": "أكمل", + "trips": "مشاوير", + "Personal Information": "المعلومات الشخصية", + "Name": "الاسم", + "Not set": "غير محدد", + "Gender": "الجنس", + "Education": "التعليم", + "Work & Contact": "العمل والتواصل", + "Employment Type": "نوع الوظيفة", + "Marital Status": "الحالة الاجتماعية", + "SOS Phone": "رقم الطوارئ", + "Sign Out": "تسجيل خروج", + "Delete My Account": "حذف حسابي", + "Update Gender": "تعديل الجنس", + "Update": "تحديث", + "Update Education": "تعديل التعليم", + "Are you sure? This action cannot be undone.": + "متأكد؟ هذا الإجراء لا يمكن التراجع عنه.", + "Confirm your Email": "تأكيد بريدك الإلكتروني", + "Type your Email": "اكتب بريدك الإلكتروني", + "Delete Permanently": "حذف نهائي", + "Male": "ذكر", + "Female": "أنثى", + "High School Diploma": "شهادة ثانوية", + "Associate Degree": "دبلوم", + "Bachelor's Degree": "بكالوريوس", + "Master's Degree": "ماجستير", + "Doctoral Degree": "دكتوراه", + "Select your preferred language for the app interface.": + "اختر اللغة المفضلة لواجهة التطبيق.", + "Language Options": "خيارات اللغة", + "You can claim your gift once they complete 2 trips.": + "تقدر تطالب بالهدية بعد ما يكمل مشوارين.", + "Closest & Cheapest": "الأقرب والأرخص", + "Comfort choice": "خيار الراحة", + "Travel in a modern, silent electric car. A premium, eco-friendly choice for a smooth ride.": + "تنقل بسيارة كهربائية حديثة وهادية. خيار مميز وصديق للبيئة لرحلة مريحة.", + "Spacious van service ideal for families and groups. Comfortable, safe, and cost-effective travel together.": + "خدمة فان واسعة مثالية للعائلات والمجموعات. سفر مريح وآمن واقتصادي.", + "Quiet & Eco-Friendly": "هادية ونظيفة", + "Lady Captain for girls": "كابتن سيدة للبنات", + "Van for familly": "سيارة فان للعائلة", + "Are you sure to delete this location?": "متأكد تريد حذف هذا الموقع؟", + "Submit a Complaint": "إرسال شكوى", + "Submit Complaint": "إرسال الشكوى", + "No trip history found": "لا يوجد سجل مشاوير", + "Your past trips will appear here.": "مشاويرك السابقة راح تظهر هنا.", + "1. Describe Your Issue": "١. اشرح مشكلتك", + "Enter your complaint here...": "اكتب شكواك هنا...", + "2. Attach Recorded Audio": "٢. إرفاق تسجيل صوتي", + "No audio files found.": "ما لقينا ملفات صوتية.", + "Confirm Attachment": "تأكيد الإرفاق", + "Attach this audio file?": "ترغب في إرفاق هذا التسجيل؟", + "Uploaded": "تم الرفع بنجاح", + "3. Review Details & Response": "٣. مراجعة التفاصيل والرد", + "Date": "التاريخ", + "Today's Promos": "عروض اليوم", + "No promos available right now.": "لا توجد عروض حالياً.", + "Check back later for new offers!": "ارجع بعدين عروض جديدة!", + "Valid Until:": "صالح حتى:", + "CODE": "الكود", + "Login": "تسجيل دخول", + "Sign in for a seamless experience": "سجل دخول لتجربة سلسة", + "Sign In with Google": "تسجيل الدخول عبر Google", + "Sign in with Apple": "تسجيل الدخول عبر Apple", + "User not found": "المستخدم غير موجود", + "Need assistance? Contact us": "تحتاج مساعدة؟ اتصل بنا", + "Email": "البريد الإلكتروني", + "Your email address": "بريدك الإلكتروني", + "Enter a valid email": "أدخل بريداً صحيحاً", + "Password": "كلمة المرور", + "Your password": "كلمة مرورك", + "Enter your password": "أدخل كلمة المرور", + "Submit": "إرسال", + "Terms of Use & Privacy Notice": "شروط الاستخدام وسياسة الخصوصية", + "By selecting \"I Agree\" below, I confirm that I have read and agree to the ": + "باختيار \"أوافق\" أدناه، أؤكد أنني قرأت ووافقت على ", + "Terms of Use": "شروط الاستخدام", + " and acknowledge the ": " وأقر بـ ", + "Privacy Notice": "سياسة الخصوصية", + ". I am at least 18 years old.": ". وعمري 18 سنة أو أكثر.", + "I Agree": "أوافق على الشروط والأحكام", + "Continue": "متابعة", + "Enable Location": "تفعيل الموقع", + "To give you the best experience, we need to know where you are. Your location is used to find nearby captains and for pickups.": + "عشان نقدم لك أفضل تجربة، نحتاج نعرف موقعك. موقعك يستخدم للعثور على كباتن قريبين ولتحديد نقطة الانطلاق.", + "Allow Location Access": "السماح بالوصول إلى الموقع", + "Welcome to Intaleq!": "أهلاً بك في انطلق!", + "Before we start, please review our terms.": + "قبل ما نبدأ، راجع شروطنا.", + "Your journey starts here": "رحلتك تبدأ من هنا", + "Cancel Search": "إلغاء البحث", + "Set pickup location": "تحديد نقطة الانطلاق", + "Move the map to adjust the pin": "حرك الخريطة لضبط الموقع", + "Searching for the nearest captain...": "نبحث عن أقرب كابتن...", + "No one accepted? Try increasing the fare.": + "ما حد قبل؟ جرب ترفع الأجرة شوي.", + "Increase Your Trip Fee (Optional)": "ارفع أجرة رحلتك (اختياري)", + "We haven't found any drivers yet. Consider increasing your trip fee to make your offer more attractive to drivers.": + "لسه ما لقينا كباتن. فكر ترفع الأجرة عشان طلبك يصير مغري أكثر للكباتن.", + "No, thanks": "لا، شكراً", + "Increase Fee": "زيادة الأجرة", + "Copy": "نسخ", + "Promo Copied!": "تم نسخ الكود!", + "Code": "الكود", + "copied to clipboard": "تم نسخ الكود إلى الحافظة", + "Price": "السعر", + "Intaleq's Response": "رد فريق انطلق", + "Awaiting response...": "بانتظار الرد...", + "Audio file not attached": "الملف الصوتي غير مرفق", + "The audio file is not uploaded yet.\\nDo you want to submit without it?": + "الملف الصوتي لم يتم رفعه بعد.\\nهل تريد الإرسال بدونه؟", + "deleted": "تم الحذف", + "To Work": "إلى العمل", + "Work Saved": "تم حفظ موقع العمل", + "To Home": "إلى المنزل", + "Home Saved": "تم حفظ موقع المنزل", + "Destination selected": "تم اختيار الوجهة", + "Now select start pick": "الآن حدد نقطة الانطلاق", + "OK": "موافق", + "Confirm Pick-up Location": "تأكيد موقع الانطلاق", + "Set Location on Map": "حدد الموقع على الخريطة", + "You can contact us during working hours from 10:00 - 16:00.": + "تقدر تتواصل معنا خلال ساعات العمل من 10 صباحاً إلى 4 مساءً.", + "Intaleq is the safest and most reliable ride-sharing app designed especially for passengers in Syria. We provide a comfortable, respectful, and affordable riding experience with features that prioritize your safety and convenience. Our trusted captains are verified, insured, and supported by regular car maintenance carried out by top engineers. We also offer on-road support services to make sure every trip is smooth and worry-free. With Intaleq, you enjoy quality, safety, and peace of mind—every time you ride.": + "انطلق هو التطبيق الأكثر أماناً وموثوقية لمشاركة الركوب والمصمم خصيصاً للركاب في سوريا. نوفر لك تجربة تنقل مريحة، محترمة، وبأسعار مناسبة، مع ميزات تضع سلامتك وراحتك في المقام الأول.", + "Customer MSISDN doesn’t have customer wallet": + "رقم العميل ليس لديه محفظة", + "Nearest Car: ~": "أقرب سيارة: ~", + "Nearest Car": "أقرب سيارة", + "No cars nearby": "لا توجد سيارات قريبة", + "Favorite Places": "الأماكن المفضلة", + "No favorite places yet!": "لسه ما عندك أماكن مفضلة!", + "from your favorites": "من مفضلتك", + "Back": "رجوع", + "Enter your code below to apply the discount.": + "أدخل كودك بالأسفل عشان تحصل على الخصم.", + "By selecting \"I Agree\" below, I confirm that I have read and agree to the": + "باختيار \"أوافق\" أدناه، أؤكد أنني قرأت ووافقت على", + "and acknowledge the": "وأقر بـ", + "Enable Location Access": "تفعيل الوصول للموقع", + "We need your location to find nearby drivers for pickups and drop-offs.": + "نحتاج موقعك عشان نلاقي كباتن قريبين لنقطة الانطلاق والوصول.", + "You should restart app to change language": + "لازم تقفل التطبيق وتفتحه عشان يتغير اللغة", + "Home Page": "الصفحة الرئيسية", + "To change Language the App": "لتغيير لغة التطبيق", + "Learn more about our app and mission": + "اعرف أكثر عن تطبيقنا ورسالتنا", + "Promos For Today": "عروض اليوم", + "Choose your ride": "اختر رحلتك", + "Your Journey Begins Here": "رحلتك تبدأ من هنا", + "Bonus gift": "هدية إضافية", + "Pay": "ادفع", + "Get": "احصل", + "Send to Driver Again": "أرسل للكابتن مرة ثانية", + "Driver Name:": "اسم الكابتن:", + "No trip data available": "لا توجد بيانات للرحلة", + "Car Plate:": "رقم اللوحة:", + "remaining": "متبقي", + "Order Cancelled": "تم إلغاء الطلب", + "You canceled VIP trip": "لقد ألغيت رحلة VIP", + "Passenger cancelled order": "الراكب ألغى الطلب", + "Your trip is scheduled": "رحلتك مجدولة", + "Don't forget your ride!": "لا تنسى رحلتك!", + "Trip updated successfully": "تم تحديث الرحلة بنجاح", + "Car Make:": "الماركة:", + "Car Model:": "الموديل:", + "Car Color:": "اللون:", + "Driver Phone:": "جوال الكابتن:", + "Pre-booking": "حجز مسبق", + "Waiting VIP": "بانتظار VIP", + "Driver List": "قائمة الكباتن", + "Confirm Trip": "تأكيد الرحلة", + "Select date and time of trip": "اختر تاريخ ووقت الرحلة", + "Date and Time Picker": "اختيار التاريخ والوقت", + "Trip Status:": "حالة الرحلة:", + "pending": "قيد الانتظار", + "accepted": "مقبولة", + "rejected": "مرفوضة", + "Apply": "تطبيق", + "Enter your promo code": "أدخل كود الخصم", + "Apply Promo Code": "تفعيل الكود", + "Scheduled Time:": "الوقت المجدول:", + "No drivers available": "لا يتوفر كباتن", + "No drivers available at the moment. Please try again later.": + "لا يتوفر كباتن حالياً. حاول مرة ثانية بعد شوي.", + "you have a negative balance of": "عليك رصيد سالب بقيمة", + "Please try again in a few moments": "حاول مرة ثانية بعد لحظات", + "Unknown Driver": "كابتن غير معروف", + "in your": "في محفظتك", + "The driver accepted your order for": "الكابتن قبل طلبك بـ", + "wallet due to a previous trip.": "بسبب رحلة سابقة.", + "rides": "مشاوير", + "Add Work": "إضافة العمل", + "The reason is": "السبب هو", + "User does not have a wallet #1652": "المستخدم ليس لديه محفظة #1652", + "Price of trip": "سعر الرحلة", + "From:": "من:", + "For Intaleq and Delivery trips, the price is calculated dynamically. For Comfort trips, the price is based on time and distance": + "لمشاوير انطلق والتوصيل، السعر يتغير. أما مشاوير الراحة فالسعر يعتمد على الوقت والمسافة.", + "Phone Wallet Saved Successfully": "تم حفظ رقم المحفظة بنجاح", + "Add wallet phone you use": "أضف رقم المحفظة الذي تستخدمه", + "Update Available": "يوجد تحديث جديد", + "Phone number must be exactly 11 digits long": + "رقم الجوال يجب أن يكون 11 رقمًا بالضبط", + "Insert Wallet phone number": "أدخل رقم المحفظة", + "Phone number isn't an Egyptian phone number": + "رقم الجوال ليس رقمًا مصريًا", + "A new version of the app is available. Please update to the latest version.": + "توجد نسخة جديدة من التطبيق. يرجى التحديث.", + "We use location to get accurate and nearest passengers for you": + "نستخدم الموقع لإظهار أقرب الركاب لك بدقة.", + "This ride is already applied by another driver.": + "هذه الرحلة مأخوذة من كابتن آخر.", + "We use your precise location to find the nearest available driver and provide accurate pickup and dropoff information. You can manage this in Settings.": + "نستخدم موقعك الدقيق للعثور على أقرب كابتن متاح وتقديم معلومات دقيقة للانطلاق والوصول. يمكنك التحكم في هذا من الإعدادات.", + "Where are you, sir?": "وينك يا غالي؟", + "I've been trying to reach you but your phone is off.": + "أحاول الاتصال بك لكن جوالك مقفل.", + "Please don't be late": "لا تتأخر", + "Please don't be late, I'm waiting for you at the specified location.": + "لا تتأخر، أنا ناطرك في المكان المحدد.", + "My location is correct. You can search for me using the navigation app": + "موقعي صحيح. تقدر تلاقيني عبر تطبيق الخرائط", + "Hello, I'm at the agreed-upon location": + "مرحباً، أنا في المكان المتفق عليه", + "How much longer will you be?": "قديش باقي وتوصل؟", + "Phone number is verified before": "رقم الجوال مؤكد مسبقاً", + "Change Ride": "تغيير الرحلة", + "You can change the destination by long-pressing any point on the map": + "تقدر تغير الوجهة بالضغط المطول على أي نقطة في الخريطة", + "Pick from map destination": "اختر الوجهة من الخريطة", + "Pick or Tap to confirm": "اختر أو اضغط للتأكيد", + "Accepted your order": "تم قبول طلبك", + "Order Accepted": "الطلب مقبول", + "with type": "من نوع", + "accepted your order at price": "قبل طلبك بسعر", + "you canceled order": "لقد ألغيت الطلب", + "If you want order to another person": "إذا تريد الطلب لشخص آخر", + "upgrade price": "زيادة السعر", + "airport": "مطار", + "Best choice for a comfortable car with a flexible route and stop points. This airport offers visa entry at this price.": + "الخيار الأفضل لسيارة مريحة مع مسار مرن ونقاط توقف. هذا المطار يوفر تأشيرة دخول بهذا السعر.", + "You can upgrade price to may driver accept your order": + "تقدر تزيد السعر عشان الكابتن يقبل طلبك", + "Change Route": "تغيير الطريق", + "No Captain Accepted Your Order": "ما حد من الكباتن قبل طلبك", + "We are looking for a captain but the price may increase to let a captain accept": + "ندور على كابتن لكن السعر ممكن يزيد عشان واحد يقبل", + "No, I want to cancel this trip": "لا، أبي ألغي هذه الرحلة", + "Attention": "تنبيه", + "Trip Cancelled. The cost of the trip will be deducted from your wallet.": + "تم إلغاء الرحلة. رح تخصم التكلفة من محفظتك.", + "You will be charged for the cost of the driver coming to your location.": + "رح تتحمل تكلفة مجيء الكابتن إلى موقعك.", + "reject your order.": "رفض طلبك.", + "Order Under Review": "الطلب قيد المراجعة", + "is reviewing your order. They may need more information or a higher price.": + "يقوم بمراجعة طلبك. قد يحتاج معلومات إضافية أو سعر أعلى.", + "Vibration": "اهتزاز", + "Resend code": "إعادة إرسال الكود", + "change device": "تغيير الجهاز", + "Device Change Detected": "تم اكتشاف تغيير في الجهاز", + "You can only use one device at a time. This device will now be set as your active device.": + "يمكنك استخدام جهاز واحد فقط في كل مرة. سيتم تعيين هذا الجهاز كجهازك النشط الآن.", + "Click here point": "اضغط هنا", + "Are you want to change": "تبغى تغير؟", + "by": "بواسطة", + "Enter your complaint here": "أدخل شكواك هنا", + "Please enter your complaint.": "الرجاء كتابة شكواك.", + "Complaint data saved successfully": "تم حفظ بيانات الشكوى بنجاح", + "Trip Monitor": "مراقبة الرحلة", + "Insert SOS Phone": "أدخل رقم الطوارئ", + "Add SOS Phone": "أضف رقم الطوارئ", + "Dear ,\n\n 🚀 I have just started an exciting trip and I would like to share the details of my journey and my current location with you in real-time! Please download the Intaleq app. It will allow you to view my trip details and my latest location.\n\n 👉 Download link: \n Android [https://play.google.com/store/apps/details?id=com.mobileapp.store.ride]\n iOS [https://getapp.cc/app/6458734951]\n\n I look forward to keeping you close during my adventure!\n\n Intaleq ,": + "عزيزي،\n\n🚀 لقد بدأت رحلة شيقة وأود مشاركتك تفاصيلها وموقعي الحالي بشكل مباشر! حمل تطبيق انطلق لتتمكن من متابعة تفاصيل رحلتي وآخر موقع لي.\n\n👈 رابط التحميل:\nأندرويد [https://play.google.com/store/apps/details?id=com.mobileapp.store.ride]\nآيفون [https://getapp.cc/app/6458734951]\n\nأتطلع لأن تبقى قريباً مني خلال مغامرتي!\n\nانطلق", + "Send Intaleq app to him": "أرسل له تطبيق انطلق", + "No passenger found for the given phone number": + "لا يوجد راكب بهذا الرقم", + "No user found for the given phone number": + "لا يوجد مستخدم بهذا الرقم", + "This price is": "هذا السعر هو", + "Work": "العمل", + "Add Home": "إضافة المنزل", + "Notifications": "الإشعارات", + "💳 Pay with Credit Card": "💳 الدفع بالبطاقة الائتمانية", + "⚠️ You need to choose an amount!": "⚠️ لازم تختار مبلغ!", + "💰 Pay with Wallet": "💰 الدفع بالمحفظة", + "You must restart the app to change the language.": + "لازم تقفل التطبيق وتفتحه عشان يتغير اللغة.", + "joined": "انضم", + "Driver joined the channel": "الكابتن انضم للقناة", + "Driver left the channel": "الكابتن غادر القناة", + "Call Page": "صفحة الاتصال", + "Call Left": "مكالمات متبقية", + " Next as Cash !": "المشوار الجاي كاش!", + "To use Wallet charge it": "عشان تستخدم المحفظة، اشحنها", + "We are searching for the nearest driver to you": + "نبحث عن أقرب كابتن لك", + "Best choice for cities": "الخيار الأفضل للمدن", + "Rayeh Gai: Round trip service for convenient travel between cities, easy and reliable.": + "رايح جاي: خدمة ذهاب وإياب مريحة بين المدن، سهلة وموثوقة.", + "This trip is for women only": "هذه الرحلة للنساء فقط", + "Total budgets on month": "إجمالي الميزانية الشهرية", + "You have call from driver": "لديك مكالمة من الكابتن", + "Intaleq": "انطلق", + "passenger agreement": "اتفاقية الراكب", + "To become a passenger, you must review and agree to the ": + "عشان تصير راكب، لازم تشوف وتوافق على", + "agreement subtitle": + "عشان تكمل، لازم تشوف شروط الاستخدام وسياسة الخصوصية وتوافق عليهم.", + "terms of use": "شروط الاستخدام", + " and acknowledge our Privacy Policy.": + " وتقر بسياسة الخصوصية الخاصة بنا.", + "and acknowledge our": "وتقر بـ", + "privacy policy": "سياسة الخصوصية.", + "i agree": "أوافق على الشروط والأحكام", + "Driver already has 2 trips within the specified period.": + "الكابتن لديه رحلتان بالفعل خلال الفترة المحددة.", + "The invitation was sent successfully": "تم إرسال الدعوة بنجاح", + "You should select your country": "يجب اختيار بلدك", + "Scooter": "سكوتر", + "A trip with a prior reservation, allowing you to choose the best captains and cars.": + "رحلة بحجز مسبق، تخليك تختار أفضل الكباتن والسيارات.", + "Mishwar Vip": "مشوار VIP", + "The driver waiting you in picked location .": + "الكابتن ناطرك في نقطة الانطلاق.", + "About Us": "من نحن", + "You can change the vibration feedback for all buttons": + "تقدر تغير اهتزاز الأزرار من هنا", + "Most Secure Methods": "أكثر الطرق أماناً", + "In-App VOIP Calls": "مكالمات صوتية داخل التطبيق", + "Recorded Trips for Safety": "رحلات مسجلة للأمان", + "\nWe also prioritize affordability, offering competitive pricing to make your rides accessible.": + "\nنحرص أيضاً على أن تكون الأسعار مناسبة للجميع، نقدم أسعاراً تنافسية عشان رحلاتك تكون في متناول اليد.", + "Intaleq is a ride-sharing app designed with your safety and affordability in mind. We connect you with reliable drivers in your area, ensuring a convenient and stress-free travel experience.\n\nHere are some of the key features that set us apart:": + "انطلق هو تطبيق لمشاركة الرحلات مصمم مع أخذ سلامتك وميزانيتك في الاعتبار. نوصلك بكباتن موثوقين في منطقتك، عشان نضمن لك تجربة تنقل مريحة وخالية من التوتر.\n\nإليك بعض الميزات الرئيسية اللي تميزنا:", + "Sign In by Apple": "الدخول عبر Apple", + "Sign In by Google": "الدخول عبر Google", + "How do I request a ride?": "كيف أطلب رحلة؟", + "Step-by-step instructions on how to request a ride through the Intaleq app.": + "شرح خطوة بخطوة لكيفية طلب رحلة عبر تطبيق انطلق.", + "What types of vehicles are available?": + "شنو أنواع السيارات المتاحة؟", + "Intaleq offers a variety of vehicle options to suit your needs, including economy, comfort, and luxury. Choose the option that best fits your budget and passenger count.": + "انطلق يقدم لك عدة خيارات سيارات تناسب احتياجاتك، منها الاقتصادي والراحة والفاخر. اختر الخيار اللي يناسب ميزانيتك وعدد الركاب.", + "How can I pay for my ride?": "كيف أدفع حق الرحلة؟", + "Intaleq offers multiple payment methods for your convenience. Choose between cash payment or credit/debit card payment during ride confirmation.": + "انطلق يقدم عدة طرق دفع لراحتك. اختر بين الدفع كاش أو ببطاقة الائتمان/الخصم المباشر عند تأكيد الرحلة.", + "Can I cancel my ride?": "هل أقدر ألغي رحلتي؟", + "Yes, you can cancel your ride under certain conditions (e.g., before driver is assigned). See the Intaleq cancellation policy for details.": + "نعم، تقدر تلغي رحلتك بشروط معينة (مثلاً قبل ما يتم تعيين كابتن). راجع سياسة الإلغاء في انطلق للمزيد.", + "Driver Registration & Requirements": "تسجيل الكباتن والمتطلبات", + "How can I register as a driver?": "كيف أسجل ككابتن؟", + "What are the requirements to become a driver?": + "شنو متطلبات أن تصبح كابتن؟", + "Visit our website or contact Intaleq support for information on driver registration and requirements.": + "زر موقعنا الإلكتروني أو اتصل بدعم انطلق للحصول على معلومات عن تسجيل الكباتن ومتطلباته.", + "Intaleq provides in-app chat functionality to allow you to communicate with your driver or passenger during your ride.": + "انطلق يوفر خاصية الدردشة داخل التطبيق عشان تتواصل مع الكابتن أو الراكب أثناء الرحلة.", + "Intaleq prioritizes your safety. We offer features like driver verification, in-app trip tracking, and emergency contact options.": + "انطلق يضع سلامتك أولاً. نوفر ميزات مثل التحقق من الكابتن، تتبع الرحلة داخل التطبيق، وخيارات الاتصال بالطوارئ.", + "Frequently Questions": "الأسئلة الشائعة", + "User does not exist.": "المستخدم غير موجود.", + "We need your phone number to contact you and to help you.": + "نحتاج رقم جوالك عشان نتواصل معك ونساعدك.", + "You will recieve code in sms message": "رح يصلك الكود عبر رسالة SMS", + "Please enter": "الرجاء إدخال", + "We need your phone number to contact you and to help you receive orders.": + "نحتاج رقم جوالك للتواصل معك ومساعدتك في استلام الطلبات.", + "The full name on your criminal record does not match the one on your driver's license. Please verify and provide the correct documents.": + "الاسم في وثيقة 'لا حكم عليه' لا يطابق الاسم في رخصة القيادة. تأكد وأرسل المستندات الصحيحة.", + "The national number on your driver's license does not match the one on your ID document. Please verify and provide the correct documents.": + "الرقم الوطني في رخصة القيادة لا يطابق الرقم في هويتك. تأكد وأرسل المستندات الصحيحة.", + "Capture an Image of Your Criminal Record": + "التقط صورة لوثيقة 'لا حكم عليه'", + "IssueDate": "تاريخ الإصدار", + "Capture an Image of Your car license front": + "التقط صورة للوجه الأمامي لرخصة السيارة", + "Capture an Image of Your ID Document front": + "التقط صورة للوجه الأمامي لهويتك", + "NationalID": "الرقم الوطني", + "You can share the Intaleq App with your friends and earn rewards for rides they take using your code": + "تقدر تشارك تطبيق انطلق مع أصدقائك وتربح مكافآت عن المشاوير اللي يسوونها باستخدام كودك.", + "FullName": "الاسم الكامل", + "No invitation found yet!": "لسه ما فيه دعوات!", + "InspectionResult": "نتيجة الفحص", + "Criminal Record": "لا حكم عليه", + "The email or phone number is already registered.": + "البريد الإلكتروني أو رقم الجوال مسجل مسبقاً.", + "To become a ride-sharing driver on the Intaleq app, you need to upload your driver's license, ID document, and car registration document. Our AI system will instantly review and verify their authenticity in just 2-3 minutes. If your documents are approved, you can start working as a driver on the Intaleq app. Please note, submitting fraudulent documents is a serious offense and may result in immediate termination and legal consequences.": + "عشان تصير كابتن في انطلق، لازم ترفع رخصة القيادة، الهوية، واستمارة السيارة. نظام الذكاء الاصطناعي حقنا راح يراجعها ويتأكد من صحتها خلال 2-3 دقائق. إذا تمت الموافقة على مستنداتك، تقدر تبدأ العمل ككابتن في انطلق. تنبيه: تقديم مستندات مزورة مخالفة خطيرة وقد تؤدي إلى الإيقاف الفوري وعقوبات قانونية.", + "Documents check": "التحقق من المستندات", + "Driver's License": "رخصة القيادة", + "for your first registration!": "لتسجيلك الأول!", + "Get it Now!": "احصل عليه الآن!", + "before": "قبل", + "Code not approved": "الكود غير مقبول", + "3000 LE": "3000 ل.س", + "Do you have an invitation code from another driver?": + "عندك كود دعوة من كابتن آخر؟", + "Paste the code here": "الصق الكود هنا", + "No, I don't have a code": "لا، ما عندي كود", + "Audio uploaded successfully.": "تم رفع الصوت بنجاح.", + "Perfect for passengers seeking the latest car models with the freedom to choose any route they desire": + "مثالي للركاب اللي يبحثون عن أحدث موديلات السيارات مع حرية اختيار أي طريق يريدونه", + "Share this code with your friends and earn rewards when they use it!": + "شارك هذا الكود مع أصدقائك واكسب مكافآت عندما يستخدمونه!", + "Enter phone": "أدخل الرقم", + "complete, you can claim your gift": "اكتمل، تقدر تطالب بهديتك الحين", + "When": "متى", + "Enter driver's phone": "أدخل رقم الكابتن", + "Send Invite": "إرسال دعوة", + "Show Invitations": "عرض الدعوات", + "License Type": "نوع الرخصة", + "National Number": "الرقم الوطني", + "Name (Arabic)": "الاسم (بالعربية)", + "Name (English)": "الاسم (بالإنجليزية)", + "Address": "العنوان", + "Issue Date": "تاريخ الإصدار", + "Expiry Date": "تاريخ الانتهاء", + "License Categories": "فئات الرخصة", + "driver_license": "رخصة القيادة", + "Capture an Image of Your Driver License": "التقط صورة لرخصة قيادتك", + "ID Documents Back": "الوجه الخلفي للهوية", + "National ID": "الرقم الوطني", + "Occupation": "المهنة", + "Religion": "الدين", + "Full Name (Marital)": "الاسم الكامل (حسب الحالة الاجتماعية)", + "Expiration Date": "تاريخ الانتهاء", + "Capture an Image of Your ID Document Back": + "التقط صورة للوجه الخلفي لهويتك", + "ID Documents Front": "الوجه الأمامي للهوية", + "First Name": "الاسم الأول", + "CardID": "رقم البطاقة", + "Vehicle Details Front": "تفاصيل السيارة (الأمامية)", + "Plate Number": "رقم اللوحة", + "Owner Name": "اسم المالك", + "Vehicle Details Back": "تفاصيل السيارة (الخلفية)", + "Make": "الصانع", + "Model": "الموديل", + "Year": "سنة الصنع", + "Chassis": "رقم الشاصي", + "Color": "اللون", + "Displacement": "سعة المحرك", + "Fuel": "نوع الوقود", + "Tax Expiry Date": "تاريخ انتهاء الضريبة", + "Inspection Date": "تاريخ الفحص", + "Capture an Image of Your car license back": + "التقط صورة للوجه الخلفي لرخصة سيارتك", + "Capture an Image of Your Driver's License": + "التقط صورة لرخصة قيادتك", + "Sign in with Google for easier email and name entry": + "سجل دخول عبر Google عشان تسهل كتابة البريد والاسم", + "You will choose allow all the time to be ready receive orders": + "اختر 'السماح طوال الوقت' عشان تكون جاهزاً لاستلام الطلبات فوراً", + "Get to your destination quickly and easily.": + "وصل لوجهتك بسرعة وسهولة.", + "Enjoy a safe and comfortable ride.": "استمتع برحلة آمنة ومريحة.", + "Choose Language": "اختر اللغة", + "Pay with Wallet": "الدفع بالمحفظة", + "Invalid MPIN": "MPIN غير صحيح", + "Invalid OTP": "رمز التحقق غير صحيح", + "Enter your email address": "أدخل بريدك الإلكتروني", + "Please enter Your Email.": "الرجاء إدخال بريدك الإلكتروني.", + "Enter your phone number": "أدخل رقم جوالك", + "Please enter your phone number.": "الرجاء إدخال رقم جوالك.", + "Please enter Your Password.": "الرجاء إدخال كلمة المرور.", + "if you dont have account": "إذا ليس لديك حساب", + "Register": "تسجيل", + "Accept Ride's Terms & Review Privacy Notice": + "قبول شروط الرحلة ومراجعة بيان الخصوصية", + "By selecting 'I Agree' below, I have reviewed and agree to the Terms of Use and acknowledge the Privacy Notice. I am at least 18 years of age.": + "باختياري 'أوافق' أدناه، أكون قد اطلعت على شروط الاستخدام ووافقت عليها، وأقر ببيان الخصوصية. عمري 18 سنة أو أكثر.", + "First name": "الاسم الأول", + "Enter your first name": "أدخل اسمك الأول", + "Please enter your first name.": "الرجاء إدخال اسمك الأول.", + "Last name": "الاسم الأخير", + "Enter your last name": "أدخل اسمك الأخير", + "Please enter your last name.": "الرجاء إدخال كنيتك.", + "City": "المدينة", + "Please enter your City.": "الرجاء إدخال مدينتك.", + "Verify Email": "التحقق من البريد الإلكتروني", + "We sent 5 digit to your Email provided": + "أرسلنا رمزاً من 5 أرقام إلى بريدك الإلكتروني", + "5 digit": "5 أرقام", + "Send Verification Code": "إرسال رمز التحقق", + "Your Ride Duration is ": "مدة رحلتك ", + "You will be thier in": "ستصل خلال", + "You trip distance is": "مسافة رحلتك", + "Fee is": "الأجرة", + "From : ": "من: ", + "To : ": "إلى: ", + "Add Promo": "إضافة عرض", + "Confirm Selection": "تأكيد الاختيار", + "distance is": "المسافة", + "Privacy Policy": "سياسة الخصوصية", + "Intaleq LLC": "شركة انطلق", + "Syria's pioneering ride-sharing service, proudly developed by Arabian and local owners. We prioritize being near you – both our valued passengers and our dedicated captains.": + "خدمة مشاركة المشاوير الرائدة في سوريا، تم تطويرها بفخر من قبل ملاك عرب ومحليين. أولويتنا أن نكون قريبين منك – سواء كنت راكباً عزيزاً أو كابتن مخلصاً.", + "Intaleq is the first ride-sharing app in Syria, designed to connect you with the nearest drivers for a quick and convenient travel experience.": + "انطلق هو أول تطبيق لمشاركة المشاوير في سوريا، صمم ليوصلك بأقرب كابتن عشان توصل بسرعة وراحة.", + "Why Choose Intaleq?": "ليش تختار انطلق؟", + "Closest to You": "الأقرب لك", + "We connect you with the nearest drivers for faster pickups and quicker journeys.": + "نوصلك بأقرب كابتن عشان تطلع أسرع وتوصل أسرع.", + "Uncompromising Security": "أمان لا مساومة فيه", + "Lady Captains Available": "كباتن سيدات متاحات", + "Recorded Trips (Voice & AI Analysis)": + "رحلات مسجلة (تحليل صوتي وذكاء اصطناعي)", + "Fastest Complaint Response": "أسرع استجابة للشكاوى", + "Our dedicated customer service team ensures swift resolution of any issues.": + "فريق خدمة العملاء المخصص لدينا يضمن حلاً سريعاً لأي مشكلة.", + "Affordable for Everyone": "أسعار تناسب الجميع", + "Frequently Asked Questions": "الأسئلة الشائعة", + "Getting Started": "بدء الاستخدام", + "Simply open the Intaleq app, enter your destination, and tap \"Request Ride\". The app will connect you with a nearby driver.": + "ببساطة افتح تطبيق انطلق، أدخل وجهتك، واضغط 'اطلب رحلة'. التطبيق رح يوصلك بكابتن قريب.", + "Vehicle Options": "خيارات المركبات", + "Intaleq offers a variety of options including Economy, Comfort, and Luxury to suit your needs and budget.": + "انطلق يقدم عدة خيارات مثل الاقتصادي والراحة والفاخر لتناسب احتياجاتك وميزانيتك.", + "Payments": "طرق الدفع", + "You can pay for your ride using cash or credit/debit card. You can select your preferred payment method before confirming your ride.": + "تقدر تدفع حق رحلتك كاش أو ببطاقة ائتمان/خصم. اختر طريقة الدفع اللي تفضلها قبل تأكيد الرحلة.", + "Ride Management": "إدارة الرحلات", + "Yes, you can cancel your ride, but please note that cancellation fees may apply depending on how far in advance you cancel.": + "نعم، يمكنك إلغاء رحلتك، لكن انتبه قد تطبق رسوم إلغاء حسب المدة المتبقية قبل الإلغاء.", + "For Drivers": "للكباتن", + "Driver Registration": "تسجيل الكابتن", + "To register as a driver or learn about the requirements, please visit our website or contact Intaleq support directly.": + "للتسجيل ككابتن أو للتعرف على المتطلبات، يرجى زيارة موقعنا الإلكتروني أو الاتصال بدعم انطلق مباشرة.", + "Visit Website/Contact Support": "زيارة الموقع / الاتصال بالدعم", + "Close": "إغلاق", + "We are searching for the nearest driver": "نبحث عن أقرب كابتن", + "Communication": "التواصل", + "How do I communicate with the other party (passenger/driver)?": + "كيف أتواصل مع الطرف الآخر (راكب/كابتن)؟", + "You can communicate with your driver or passenger through the in-app chat feature once a ride is confirmed.": + "يمكنك التواصل مع الكابتن أو الراكب عبر خاصية الدردشة داخل التطبيق بعد تأكيد الرحلة.", + "Safety & Security": "السلامة والأمان", + "What safety measures does Intaleq offer?": + "ما إجراءات الأمان التي يوفرها انطلق؟", + "Intaleq offers various safety features including driver verification, in-app trip tracking, emergency contact options, and the ability to share your trip status with trusted contacts.": + "انطلق يوفر ميزات أمان متعددة تشمل التحقق من الكابتن، تتبع الرحلة داخل التطبيق، خيارات الاتصال بالطوارئ، وإمكانية مشاركة حالة رحلتك مع جهات موثوقة.", + "Enjoy competitive prices across all trip options, making travel accessible.": + "استمتع بأسعار تنافسية لجميع خيارات الرحلات، مما يجعل التنقل في متناول الجميع.", + "Variety of Trip Choices": "تنوع خيارات الرحلات", + "Choose the trip option that perfectly suits your needs and preferences.": + "اختر نوع الرحلة اللي يناسب احتياجاتك وتفضيلاتك.", + "Your Choice, Our Priority": "اختيارك هو أولويتنا", + "Because we are near, you have the flexibility to choose the ride that works best for you.": + "لأننا قريبين منك، عندك المرونة لتختار الرحلة المناسبة لك.", + "duration is": "المدة", + "Setting": "الإعدادات", + "Find answers to common questions": "ابحث عن إجابات للأسئلة الشائعة", + "I don't need a ride anymore": "ما عاد أبغى رحلة", + "I was just trying the application": "كنت أجرب التطبيق فقط", + "No driver accepted my request": "ما حد قبل طلبي", + "I added the wrong pick-up/drop-off location": + "أضفت موقع انطلاق أو وصول خطأ", + "I don't have a reason": "ما عندي سبب", + "Can we know why you want to cancel Ride ?": + "تقدر تقولنا ليش تبي تلغي الرحلة؟", + "Add Payment Method": "إضافة طريقة دفع", + "Ride Wallet": "محفظة الرحلة", + "Payment Method": "طريقة الدفع", + "Type here Place": "اكتب المكان هنا", + "Are You sure to ride to": "متأكد تبي تروح إلى", + "Confirm": "تأكيد", + "You are Delete": "أنت تحذف", + "Deleted": "تم الحذف", + "You Dont Have Any places yet !": "ما عندك أي أماكن مسجلة بعد!", + "From : Current Location": "من: الموقع الحالي", + "My Cared": "بطاقاتي", + "Add Card": "إضافة بطاقة", + "Add Credit Card": "إضافة بطاقة ائتمانية", + "Please enter the cardholder name": "الرجاء إدخال اسم صاحب البطاقة", + "Please enter the expiry date": "الرجاء إدخال تاريخ انتهاء الصلاحية", + "Please enter the CVV code": "الرجاء إدخال رمز CVV", + "Go To Favorite Places": "الذهاب إلى الأماكن المفضلة", + "Go to this Target": "اذهب إلى هذه الوجهة", + "My Profile": "ملفي الشخصي", + "Are you want to go to this site": "هل تريد الذهاب إلى هذا الموقع؟", + "MyLocation": "موقعي", + "my location": "موقعي", + "Target": "الوجهة", + "You Should choose rate figure": "يجب اختيار التقييم", + "Login Captin": "تسجيل دخول الكابتن", + "Register Captin": "تسجيل كابتن", + "Send Verfication Code": "إرسال رمز التحقق", + "KM": "كم", + "End Ride": "إنهاء الرحلة", + "Minute": "دقيقة", + "Go to passenger Location now": "اذهب إلى موقع الراكب الآن", + "Duration of the Ride is ": "مدة الرحلة ", + "Distance of the Ride is ": "مسافة الرحلة ", + "Name of the Passenger is ": "اسم الراكب ", + "Hello this is Captain": "مرحباً، هذا الكابتن", + "Start the Ride": "ابدأ الرحلة", + "Please Wait If passenger want To Cancel!": + "انتظر إذا أراد الراكب الإلغاء!", + "Total Duration:": "المدة الإجمالية:", + "Active Duration:": "المدة النشطة:", + "Waiting for Captin ...": "بانتظار الكابتن...", + "Age is ": "العمر: ", + "Rating is ": "التقييم: ", + " to arrive you.": " للوصول إليك.", + "Tariff": "التعرفة", + "Settings": "الإعدادات", + "Feed Back": "التقييمات", + "Please enter a valid 16-digit card number": + "الرجاء إدخال رقم بطاقة صحيح مكون من 16 رقماً", + "Add Phone": "إضافة رقم", + "Please enter a phone number": "الرجاء إدخال رقم جوال", + "You dont Add Emergency Phone Yet!": "لم تقم بإضافة رقم طوارئ بعد!", + "You will arrive to your destination after ": "ستصل إلى وجهتك بعد ", + "You can cancel Ride now": "يمكنك إلغاء الرحلة الآن", + "You Can cancel Ride After Captain did not come in the time": + "يمكنك إلغاء الرحلة إذا لم يأتِ الكابتن في الوقت المحدد", + "If you in Car Now. Press Start The Ride": + "إذا كنت في السيارة الآن، اضغط 'ابدأ الرحلة'", + "You Dont Have Any amount in": "ليس لديك رصيد في", + "Wallet!": "المحفظة!", + "You Have": "لديك", + "Save Credit Card": "حفظ البطاقة الائتمانية", + "Show Promos": "عرض العروض", + "10 and get 4% discount": "10 واحصل على خصم 4%", + "20 and get 6% discount": "20 واحصل على خصم 6%", + "40 and get 8% discount": "40 واحصل على خصم 8%", + "100 and get 11% discount": "100 واحصل على خصم 11%", + "Pay with Your PayPal": "ادفع عبر PayPal", + "You will choose one of above !": "اختر أحد الخيارات أعلاه!", + "Edit Profile": "تعديل الملف الشخصي", + "Copy this Promo to use it in your Ride!": + "انسخ هذا العرض واستخدمه في رحلتك!", + "To change some Settings": "لتغيير بعض الإعدادات", + "Order Request Page": "صفحة طلب الرحلة", + "Rouats of Trip": "مسارات الرحلة", + "Passenger Name is ": "اسم الراكب: ", + "Total From Passenger is ": "الإجمالي من الراكب: ", + "Duration To Passenger is ": "المدة للوصول إلى الراكب: ", + "Distance To Passenger is ": "المسافة للوصول إلى الراكب: ", + "Total For You is ": "الإجمالي لك: ", + "Distance is ": "المسافة: ", + " KM": " كم", + "Duration of Trip is ": "مدة الرحلة: ", + " Minutes": " دقائق", + "Apply Order": "قبول الطلب", + "Refuse Order": "رفض الطلب", + "Rate Captain": "تقييم الكابتن", + "Enter your Note": "أدخل ملاحظتك", + "Type something...": "اكتب شيئاً...", + "Submit rating": "إرسال التقييم", + "Rate Passenger": "تقييم الراكب", + "Ride Summary": "ملخص الرحلة", + "welcome_message": "أهلاً بك في انطلق!", + "app_description": + "انطلق هو تطبيق مشاركة مشاوير موثوق وآمن وبأسعار مناسبة.", + "get_to_destination": "وصل إلى وجهتك بسرعة وسهولة.", + "get_a_ride": "مع انطلق، راح تلاقي من يوصلك لوجهتك خلال دقائق.", + "safe_and_comfortable": "استمتع برحلة آمنة ومريحة.", + "committed_to_safety": + "انطلق يهتم بسلامتك، وكل كباتننا يتم فحصهم بدقة.", + "your ride is Accepted": "تم قبول رحلتك", + "Driver is waiting at pickup.": "الكابتن ينتظرك في نقطة الانطلاق.", + "Driver is on the way": "الكابتن في الطريق", + "Contact Options": "خيارات التواصل", + "Send a custom message": "إرسال رسالة مخصصة", + "Type your message": "اكتب رسالتك", + "I will go now": "سأذهب الآن", + "You Have Tips": "لديك بقشيش", + " tips\nTotal is": " بقشيش\nالإجمالي", + "Your fee is ": "أجرتك ", + "Do you want to pay Tips for this Driver": + "هل تريد دفع بقشيش لهذا الكابتن؟", + "Tip is ": "البقشيش: ", + "Are you want to wait drivers to accept your order": + "هل تريد الانتظار حتى يقبل كابتن طلبك؟", + "This price is fixed even if the route changes for the driver.": + "هذا السعر ثابت حتى لو تغير مسار الكابتن.", + "The price may increase if the route changes.": + "قد يزيد السعر إذا تغير المسار.", + "The captain is responsible for the route.": + "الكابتن مسؤول عن المسار.", + "We are search for nearst driver": "نبحث عن أقرب كابتن", + "Your order is being prepared": "طلبك قيد التجهيز", + "The drivers are reviewing your request": "الكباتن يطلعون على طلبك", + "Your order sent to drivers": "تم إرسال طلبك إلى الكباتن", + "You can call or record audio of this trip": + "يمكنك الاتصال أو تسجيل صوت لهذه الرحلة", + "The trip has started! Feel free to contact emergency numbers, share your trip, or activate voice recording for the journey": + "بدأت الرحلة! يمكنك الاتصال بأرقام الطوارئ، أو مشاركة رحلتك، أو تفعيل تسجيل الصوت.", + "Camera Access Denied.": "تم رفض الوصول إلى الكاميرا.", + "Open Settings": "فتح الإعدادات", + "GPS Required Allow !.": "مطلوب تفعيل GPS!", + "Your Account is Deleted": "تم حذف حسابك", + "Are you sure to delete your account?": "متأكد من حذف حسابك؟", + "Your data will be erased after 2 weeks\nAnd you will can't return to use app after 1 month ": + "سيتم مسح بياناتك بعد أسبوعين\nولن تتمكن من العودة لاستخدام التطبيق بعد شهر واحد.", + "Enter Your First Name": "أدخل اسمك الأول", + "Are you Sure to LogOut?": "متأكد من تسجيل الخروج؟", + "Email Wrong": "البريد الإلكتروني خاطئ", + "Email you inserted is Wrong.": "البريد الإلكتروني الذي أدخلته خاطئ.", + "You have finished all times ": "لقد استنفدت كل المحاولات", + "if you want help you can email us here": + "إذا كنت بحاجة لمساعدة يمكنك مراسلتنا هنا", + "Thanks": "شكراً", + "Email Us": "راسلنا عبر البريد", + "I cant register in your app in face detection ": + "لا أستطيع التسجيل في التطبيق بسبب مشكلة في التعرف على الوجه", + "Hi": "مرحباً", + "No face detected": "لم يتم التعرف على وجه", + "Image detecting result is ": "نتيجة فحص الصورة ", + "from 3 times Take Attention": "من 3 محاولات، انتبه", + "Be sure for take accurate images please\nYou have": + "تأكد من التقاط صور واضحة\nلديك", + "image verified": "تم التحقق من الصورة", + "Next": "التالي", + "There is no help Question here": "لا يوجد سؤال مساعدة هنا", + "You dont have Points": "ليس لديك نقاط", + "You Are Stopped For this Day !": "تم إيقافك لهذا اليوم!", + "You must be charge your Account": "يجب عليك شحن حسابك", + "You Refused 3 Rides this Day that is the reason \nSee you Tomorrow!": + "لقد رفضت 3 مشاوير اليوم، لهذا السبب تم إيقافك.\nأراك غداً!", + "Recharge my Account": "شحن حسابي", + "Ok , See you Tomorrow": "حسناً، أراك غداً", + "You are Stopped": "أنت موقوف", + "Connected": "متصل", + "Not Connected": "غير متصل", + "Your are far from passenger location": "أنت بعيد عن موقع الراكب", + "go to your passenger location before\nPassenger cancel trip": + "اذهب إلى موقع الراكب قبل أن يلغي الرحلة", + "You will get cost of your work for this trip": + "ستحصل على مقابل تعبك في هذه الرحلة", + " in your wallet": " في محفظتك", + "you gain": "لقد ربحت", + "Order Cancelled by Passenger": "الراكب ألغى الطلب", + "Feedback data saved successfully": "تم حفظ التقييم بنجاح", + "No Promo for today .": "لا يوجد عرض لليوم.", + "Select your destination": "اختر وجهتك", + "Search for your Start point": "ابحث عن نقطة انطلاقك", + "Search for waypoint": "ابحث عن نقطة توقف", + "Current Location": "الموقع الحالي", + "Add Location 1": "إضافة موقع 1", + "You must Verify email !.": "يجب التحقق من البريد الإلكتروني!", + "Cropper": "قص الصورة", + "Saved Sucssefully": "تم الحفظ بنجاح", + "Select Date": "اختر التاريخ", + "Birth Date": "تاريخ الميلاد", + "Ok": "حسناً", + "the 500 points equal 30 JOD": "500 نقطة تساوي 30 ديناراً أردنياً", + "the 500 points equal 30 JOD for you \nSo go and gain your money": + "500 نقطة تساوي 30 ديناراً أردنياً لك\nاذهب الآن واكسب أموالك", + "token updated": "تم تحديث الرمز", + "Add Location 2": "إضافة موقع 2", + "Add Location 3": "إضافة موقع 3", + "Add Location 4": "إضافة موقع 4", + "Waiting for your location": "بانتظار موقعك", + "Search for your destination": "ابحث عن وجهتك", + "Hi! This is": "مرحباً! هذا", + " I am using": " أنا أستخدم", + " to ride with": " للتنقل مع", + " as the driver.": " ككابتن.", + "is driving a ": "يقود سيارة ", + " with license plate ": " رقم لوحتها ", + " I am currently located at ": " أنا حالياً في ", + "Please go to Car now ": "اذهب إلى السيارة الآن", + "You will receive a code in WhatsApp Messenger": + "سوف يصلك الكود عبر واتساب", + "If you need assistance, contact us": "إذا احتجت مساعدة، اتصل بنا", + "Promo Ended": "انتهى العرض", + "Enter the promo code and get": "أدخل كود الخصم واحصل على", + "DISCOUNT": "خصم", + "No wallet record found": "لم يتم العثور على سجل للمحفظة", + "for": "لـ", + "Intaleq is the safest ride-sharing app that introduces many features for both captains and passengers. We offer the lowest commission rate of just 8%, ensuring you get the best value for your rides. Our app includes insurance for the best captains, regular maintenance of cars with top engineers, and on-road services to ensure a respectful and high-quality experience for all users.": + "انطلق هو تطبيق مشاركة الرحلات الأكثر أماناً، ويقدم ميزات عديدة للكباتن والركاب. نقدم أقل نسبة عمولة 8% فقط، لنضمن لك أفضل قيمة لرحلاتك. تطبيقنا يشمل تأميناً لأفضل الكباتن، صيانة دورية للسيارات مع أفضل المهندسين، وخدمات على الطريق لضمان تجربة محترمة وعالية الجودة لجميع المستخدمين.", + "You can contact us during working hours from 12:00 - 19:00.": + "يمكنك الاتصال بنا خلال ساعات العمل من 12 ظهراً إلى 7 مساءً.", + "Choose a contact option": "اختر طريقة التواصل", + "Work time is from 12:00 - 19:00.\nYou can send a WhatsApp message or email.": + "أوقات العمل من 12 ظهراً إلى 7 مساءً.\nيمكنك إرسال رسالة واتساب أو بريد إلكتروني.", + "Promo code copied to clipboard!": "تم نسخ كود العرض إلى الحافظة!", + "Copy Code": "نسخ الكود", + "Your invite code was successfully applied!": + "تم تطبيق كود الدعوة الخاص بك بنجاح!", + "Payment Options": "خيارات الدفع", + "wait 1 minute to receive message": "انتظر دقيقة لاستلام الرسالة", + "You have copied the promo code.": "لقد قمت بنسخ كود العرض.", + "Select Payment Amount": "اختر المبلغ", + "The promotion period has ended.": "انتهت فترة العرض.", + "Promo Code Accepted": "تم قبول كود العرض", + "Tap on the promo code to copy it!": "اضغط على كود العرض لنسخه!", + "Lowest Price Achieved": "تم تحقيق أقل سعر", + "Cannot apply further discounts.": "لا يمكن تطبيق خصومات إضافية.", + "Promo Already Used": "تم استخدام العرض مسبقاً", + "Invitation Used": "تم استخدام الدعوة", + "You have already used this promo code.": + "لقد استخدمت كود العرض هذا مسبقاً.", + "Insert Your Promo Code": "أدخل كود العرض الخاص بك", + "Enter promo code here": "أدخل كود الخصم هنا", + "Please enter a valid promo code": "الرجاء إدخال كود صحيح", + "Awfar Car": "سيارة أوفر", + "Old and affordable, perfect for budget rides.": + "سيارة قديمة وبسعر مناسب، مثالية للميزانية المحدودة.", + " If you need to reach me, please contact the driver directly at": + "إذا كنت تريد الوصول إلي، اتصل بالكابتن مباشرة على", + "No Car or Driver Found in your area.": + "لم يتم العثور على سيارة أو كابتن في منطقتك.", + "Please Try anther time ": "حاول مرة ثانية ", + "There no Driver Aplly your order sorry for that ": + "لا يوجد كابتن تقدم لطلبك، نعتذر", + "Trip Cancelled": "تم إلغاء الرحلة", + "The Driver Will be in your location soon .": + "الكابتن سيكون عندك قريباً.", + "The distance less than 500 meter.": "المسافة أقل من 500 متر.", + "Promo End !": "انتهى العرض!", + "There is no notification yet": "لا توجد إشعارات بعد", + "Use Touch ID or Face ID to confirm payment": + "استخدم بصمة الإصبع أو التعرف على الوجه لتأكيد الدفع", + "Contact us for any questions on your order.": + "اتصل بنا لأي استفسار حول طلبك.", + "Pyament Cancelled .": "تم إلغاء الدفع.", + "type here": "اكتب هنا", + "Scan Driver License": "مسح رخصة القيادة", + "Please put your licence in these border": "ضع رخصتك داخل هذا الإطار", + "Camera not initialized yet": "الكاميرا لم تتم تهيئتها بعد", + "Take Image": "التقاط صورة", + "AI Page": "صفحة الذكاء الاصطناعي", + "Take Picture Of ID Card": "التقط صورة للهوية", + "Take Picture Of Driver License Card": "التقط صورة لرخصة القيادة", + "We are process picture please wait ": "نقوم بمعالجة الصورة، انتظر", + "There is no data yet.": "لا توجد بيانات بعد.", + "Name :": "الاسم:", + "Drivers License Class: ": "فئة الرخصة:", + "Document Number: ": "رقم الوثيقة:", + "Address: ": "العنوان:", + "Height: ": "الطول:", + "Expiry Date: ": "تاريخ الانتهاء:", + "Date of Birth: ": "تاريخ الميلاد:", + "You can't continue with us .\nYou should renew Driver license": + "لا يمكنك الاستمرار معنا.\nيجب تجديد رخصة القيادة", + "Detect Your Face ": "التعرف على وجهك", + "Go to next step\nscan Car License.": + "انتقل للخطوة التالية\nامسح رخصة السيارة.", + "Name in arabic": "الاسم بالعربية", + "Drivers License Class": "فئة رخصة القيادة", + "Selected Date": "التاريخ المحدد", + "Select Time": "اختر الوقت", + "Selected Time": "الوقت المحدد", + "Selected Date and Time": "التاريخ والوقت المحددان", + "Lets check Car license ": "دعنا نتحقق من رخصة السيارة", + "Car": "سيارة", + "Plate": "لوحة", + "Rides": "مشاوير", + "Selected driver": "الكابتن المختار", + "Lets check License Back Face": "دعنا نتحقق من الوجه الخلفي للرخصة", + "Car License Card": "رخصة السيارة", + "No image selected yet": "لم يتم اختيار صورة بعد", + "Made :": "الصنع:", + "model :": "الموديل:", + "VIN :": "رقم الهيكل:", + "year :": "السنة:", + "ُExpire Date": "تاريخ الانتهاء", + "Login Driver": "دخول الكابتن", + "Password must br at least 6 character.": + "كلمة المرور يجب أن تكون 6 أحرف على الأقل.", + "if you don't have account": "إذا لم يكن لديك حساب", + "Here recorded trips audio": "هنا تسجيلات الصوت للرحلات", + "Register as Driver": "التسجيل ككابتن", + "By selecting \"I Agree\" below, I have reviewed and agree to the Terms of Use and acknowledge the ": + "بالضغط على 'أوافق' أدناه، أكون قد اطلعت على شروط الاستخدام ووافقت عليها، وأقر بـ", + "Log Out Page": "صفحة تسجيل الخروج", + "Log Off": "تسجيل الخروج", + "Register Driver": "تسجيل كابتن", + "Verify Email For Driver": "تأكيد البريد الإلكتروني للكابتن", + "Admin DashBoard": "لوحة تحكم المشرف", + "Your name": "اسمك", + "your ride is applied": "تم قبول رحلتك", + "H and": "س و", + "JOD": "دينار", + "m": "د", + "We search nearst Driver to you": "نبحث عن أقرب كابتن لك", + "please wait till driver accept your order": + "انتظر حتى يقبل الكابتن طلبك", + "No accepted orders? Try raising your trip fee to attract riders.": + "ما حد قبل؟ جرب ترفع الأجرة عشان تجذب الكباتن.", + "You should select one": "يجب اختيار واحد", + "The driver accept your order for": "الكابتن قبل طلبك بـ", + "The driver on your way": "الكابتن في طريقه إليك", + "Total price from ": "السعر الإجمالي من ", + "Order Details Intaleq": "تفاصيل طلب انطلق", + "Selected file:": "الملف المختار:", + "Your trip cost is": "تكلفة رحلتك", + "this will delete all files from your device": + "هذا سيحذف جميع الملفات من جهازك", + "Exclusive offers and discounts always with the Intaleq app": + "عروض وخصومات حصرية دائماً مع تطبيق انطلق", + "Submit Question": "إرسال السؤال", + "Please enter your Question.": "الرجاء إدخال سؤالك.", + "Help Details": "تفاصيل المساعدة", + "No trip yet found": "لم يتم العثور على رحلة بعد", + "No Response yet.": "لا يوجد رد بعد.", + " You Earn today is ": "أرباحك اليوم ", + " You Have in": " لديك في", + "Total points is ": "إجمالي النقاط ", + "Total Connection Duration:": "إجمالي مدة الاتصال:", + "Passenger name : ": "اسم الراكب: ", + "Cost Of Trip IS ": "تكلفة الرحلة ", + "Arrival time": "وقت الوصول", + "arrival time to reach your point": "وقت الوصول إلى نقطتك", + "For Intaleq and scooter trips, the price is calculated dynamically. For Comfort trips, the price is based on time and distance": + "لمشاوير انطلق والسكوتر، السعر يتغير. أما مشاوير الراحة فالسعر يعتمد على الوقت والمسافة.", + "Hello this is Driver": "مرحباً، هذا الكابتن", + "Is the Passenger in your Car ?": "هل الراكب في سيارتك؟", + "Please wait for the passenger to enter the car before starting the trip.": + "انتظر حتى يركب الراكب قبل بدء الرحلة.", + "No ,still Waiting.": "لا، لا يزال ينتظر.", + "I arrive you": "وصلت إليك", + "I Arrive your site": "وصلت إلى موقعك", + "You are not in near to passenger location": + "أنت لست قريباً من موقع الراكب", + "please go to picker location exactly": + "اذهب إلى موقع الانطلاق بالضبط", + "You Can Cancel Trip And get Cost of Trip From": + "يمكنك إلغاء الرحلة وأخذ تكلفتها من", + "Are you sure to cancel?": "متأكد من الإلغاء؟", + "Insert Emergincy Number": "أدخل رقم الطوارئ", + "Best choice for comfort car and flexible route and stops point": + "أفضل خيار لسيارة مريحة ومسار مرن ونقاط توقف", + "Insert": "إدخال", + "This is for scooter or a motorcycle.": + "هذا للسكوتر أو الدراجة النارية.", + "This trip goes directly from your starting point to your destination for a fixed price. The driver must follow the planned route": + "هذه الرحلة تذهب مباشرة من نقطة انطلاقك إلى وجهتك بسعر ثابت. يجب على الكابتن اتباع المسار المخطط.", + "You can decline a request without any cost": + "يمكنك رفض الطلب دون أي تكلفة", + "Perfect for adventure seekers who want to experience something new and exciting": + "مثالي لمحبي المغامرة الذين يريدون تجربة شيء جديد ومثير", + "My current location is:": "موقعي الحالي هو:", + "and I have a trip on": "ولدي رحلة على", + "App with Passenger": "التطبيق مع الراكب", + "You will be pay the cost to driver or we will get it from you on next trip": + "ستدفع التكلفة للكابتن أو سنخصمها منك في الرحلة القادمة", + "Trip has Steps": "الرحلة لها نقاط متعددة", + "Distance from Passenger to destination is ": + "المسافة من الراكب إلى الوجهة ", + "price is": "السعر", + "This ride type does not allow changes to the destination or additional stops": + "نوع الرحلة هذا لا يسمح بتغيير الوجهة أو إضافة نقاط توقف", + "This price may be changed": "هذا السعر قد يتغير", + "No SIM card, no problem! Call your driver directly through our app. We use advanced technology to ensure your privacy.": + "ما تحتاج شريحة! اتصل بكابتنك مباشرة عبر تطبيقنا. نستخدم تقنية متقدمة لضمان خصوصيتك.", + "This ride type allows changes, but the price may increase": + "نوع الرحلة هذا يسمح بالتغيير، لكن السعر قد يزيد", + "Select one message": "اختر رسالة واحدة", + "I'm waiting for you": "أنا ناطرك", + "We noticed the Intaleq is exceeding 100 km/h. Please slow down for your safety. If you feel unsafe, you can share your trip details with a contact or call the police using the red SOS button.": + "لاحظنا أن السرعة تجاوزت 100 كم/س. يرجى التهدئة لسلامتك. إذا شعرت بعدم الأمان، يمكنك مشاركة تفاصيل رحلتك مع أحد جهات الاتصال أو الاتصال بالشرطة عبر زر SOS الأحمر.", + "Warning: Intaleqing detected!": "تحذير: تم اكتشاف سرعة زائدة!", + "Please help! Contact me as soon as possible.": + "الرجاء المساعدة! اتصل بي في أسرع وقت.", + "Share Trip Details": "مشاركة تفاصيل الرحلة", + "Car Plate is ": "رقم لوحة السيارة: ", + "the 300 points equal 300 L.E for you \nSo go and gain your money": + "300 نقطة تساوي 300 ليرة لك\nاذهب الآن واكسب أموالك", + "the 300 points equal 300 L.E": "300 نقطة تساوي 300 ليرة", + "The payment was not approved. Please try again.": + "لم يتم قبول الدفع. حاول مرة ثانية.", + "Payment Failed": "فشل الدفع", + "This is a scheduled notification.": "هذا إشعار مجدول.", + "An error occurred during the payment process.": + "حدث خطأ أثناء عملية الدفع.", + "The payment was approved.": "تم قبول الدفع.", + "Payment Successful": "تم الدفع بنجاح", + "No ride found yet": "لم يتم العثور على رحلة بعد", + "Accept Order": "قبول الطلب", + "Bottom Bar Example": "مثال الشريط السفلي", + "Driver phone": "رقم الكابتن", + "Statistics": "الإحصائيات", + "Origin": "نقطة الانطلاق", + "Destination": "الوجهة", + "Driver Name": "اسم الكابتن", + "Driver Car Plate": "رقم لوحة الكابتن", + "Available for rides": "متاح للرحلات", + "Scan Id": "مسح الهوية", + "Camera not initilaized yet": "الكاميرا لم تتم تهيئتها بعد", + "Scan ID MklGoogle": "مسح الهوية MklGoogle", + "Language": "اللغة", + "Jordan": "الأردن", + "USA": "أمريكا", + "Egypt": "مصر", + "Turkey": "تركيا", + "Saudi Arabia": "السعودية", + "Qatar": "قطر", + "Bahrain": "البحرين", + "Kuwait": "الكويت", + "But you have a negative salary of": "ولكن لديك رصيد سالب بـ", + "Promo Code": "كود الخصم", + "Your trip distance is": "مسافة رحلتك", + "Enter promo code": "أدخل كود الخصم", + "You have promo!": "لديك عرض!", + "Cost Duration": "تكلفة المدة", + "Duration is": "المدة", + "Leave": "مغادرة", + "Join": "انضمام", + "Heading your way now. Please be ready.": + "أتجه إليك الآن. كن مستعداً.", + "Approaching your area. Should be there in 3 minutes.": + "أقترب من منطقتك. سأكون هناك خلال 3 دقائق.", + "There's heavy traffic here. Can you suggest an alternate pickup point?": + "هناك زحمة مرور شديدة. هل تقترح نقطة انطلاق بديلة؟", + "This ride is already taken by another driver.": + "هذه الرحلة أخذها كابتن آخر.", + "You Should be select reason.": "يجب عليك اختيار سبب.", + "Waiting for Driver ...": "بانتظار الكابتن...", + "Latest Recent Trip": "آخر رحلة", + "from your list": "من قائمتك", + "Do you want to change Work location": "هل تريد تغيير موقع العمل؟", + "Do you want to change Home location": "هل تريد تغيير موقع المنزل؟", + "We Are Sorry That we dont have cars in your Location!": + "نأسف لعدم وجود سيارات في موقعك!", + "Choose from Map": "اختر من الخريطة", + "Pick your ride location on the map - Tap to confirm": + "اختر موقع رحلتك على الخريطة - اضغط للتأكيد", + "Intaleq is the ride-hailing app that is safe, reliable, and accessible.": + "انطلق هو تطبيق طلب سيارات آمن وموثوق ومتاح للجميع.", + "With Intaleq, you can get a ride to your destination in minutes.": + "مع انطلق، يمكنك الوصول إلى وجهتك في دقائق.", + "Intaleq is committed to safety, and all of our captains are carefully screened and background checked.": + "انطلق ملتزم بالسلامة، وجميع كباتننا يتم فحصهم بدقة والتحقق من خلفياتهم.", + "Pick from map": "اختر من الخريطة", + "No Car in your site. Sorry!": "لا توجد سيارة في موقعك. نأسف!", + "Nearest Car for you about ": "أقرب سيارة لك على بعد ", + "From :": "من:", + "Get Details of Trip": "الحصول على تفاصيل الرحلة", + "If you want add stop click here": + "إذا أردت إضافة نقطة توقف اضغط هنا", + "Where you want go ": "أين تريد الذهاب؟", + "My Card": "بطاقتي", + "Start Record": "بدء التسجيل", + "History of Trip": "سجل الرحلات", + "Helping Center": "مركز المساعدة", + "Record saved": "تم حفظ التسجيل", + "Trips recorded": "الرحلات المسجلة", + "Select Your Country": "اختر بلدك", + "To ensure you receive the most accurate information for your location, please select your country below. This will help tailor the app experience and content to your country.": + "للتأكد من حصولك على أدق المعلومات الخاصة بموقعك، يرجى اختيار بلدك أدناه. هذا سيساعد في تخصيص تجربة التطبيق والمحتوى حسب بلدك.", + "Are you sure to delete recorded files": + "هل أنت متأكد من حذف الملفات المسجلة؟", + "Select recorded trip": "اختر رحلة مسجلة", + "Card Number": "رقم البطاقة", + "Hi, Where to ": "مرحباً، إلى أين؟", + "Pick your destination from Map": "اختر وجهتك من الخريطة", + "Add Stops": "إضافة نقاط توقف", + "Get Direction": "احصل على الاتجاهات", + "Add Location": "إضافة موقع", + "Switch Rider": "تبديل الراكب", + "You will arrive to your destination after timer end.": + "ستصل إلى وجهتك بعد انتهاء المؤقت.", + "You can cancel trip": "يمكنك إلغاء الرحلة", + "The driver waitting you in picked location .": + "الكابتن ينتظرك في نقطة الانطلاق.", + "Pay with Your": "ادفع بـ", + "Pay with Credit Card": "الدفع بالبطاقة الائتمانية", + "Show Promos to Charge": "عرض العروض للشحن", + "Point": "نقطة", + "How many hours would you like to wait?": "كم ساعة تريد الانتظار؟", + "Driver Wallet": "محفظة الكابتن", + "Choose between those Type Cars": "اختر من بين أنواع السيارات هذه", + "hour": "ساعة", + "Select Waiting Hours": "اختر ساعات الانتظار", + "Total Points is": "مجموع النقاط", + "You will receive a code in SMS message": + "سوف يصلك رمز عبر رسالة نصية", + "Done": "تم", + "Total Budget from trips is ": "إجمالي الميزانية من الرحلات ", + "Total Amount:": "المبلغ الإجمالي:", + "Total Budget from trips by\nCredit card is ": + "إجمالي الميزانية من الرحلات عبر\nالبطاقة الائتمانية ", + "This amount for all trip I get from Passengers": + "هذا المبلغ لجميع الرحلات التي أحصل عليها من الركاب", + "Pay from my budget": "ادفع من ميزانيتي", + "This amount for all trip I get from Passengers and Collected For me in": + "هذا المبلغ لجميع الرحلات التي أحصل عليها من الركاب والمجمعة لدي في", + "You can buy points from your budget": "يمكنك شراء نقاط من ميزانيتك", + "insert amount": "أدخل المبلغ", + "You can buy Points to let you online\nby this list below": + "يمكنك شراء نقاط لتكون متاحاً عبر القائمة أدناه", + "Create Wallet to receive your money": "أنشئ محفظة لاستلام أموالك", + "Enter your feedback here": "أدخل تقييمك هنا", + "Please enter your feedback.": "الرجاء إدخال تقييمك.", + "Feedback": "تقييم", + "Submit ": "إرسال ", + "Click here to Show it in Map": "اضغط هنا لعرضه على الخريطة", + "Canceled": "ملغي", + "No I want": "لا، أريد", + "Email is": "البريد الإلكتروني:", + "Phone Number is": "رقم الجوال:", + "Date of Birth is": "تاريخ الميلاد:", + "Sex is ": "الجنس: ", + "Car Details": "تفاصيل السيارة", + "VIN is": "رقم الهيكل:", + "Color is ": "اللون: ", + "Make is ": "الصانع: ", + "Model is": "الموديل:", + "Year is": "السنة:", + "Expiration Date ": "تاريخ الانتهاء: ", + "Edit Your data": "تعديل بياناتك", + "write vin for your car": "اكتب رقم هيكل سيارتك", + "VIN": "رقم الهيكل", + "Please verify your identity": "يرجى التحقق من هويتك", + "write Color for your car": "اكتب لون سيارتك", + "write Make for your car": "اكتب ماركة سيارتك", + "write Model for your car": "اكتب موديل سيارتك", + "write Year for your car": "اكتب سنة سيارتك", + "write Expiration Date for your car": "اكتب تاريخ انتهاء سيارتك", + "Tariffs": "التعرفات", + "Minimum fare": "الحد الأدنى للأجرة", + "Maximum fare": "الحد الأقصى للأجرة", + "Flag-down fee": "رسوم بدء الرحلة", + "Including Tax": "شامل الضريبة", + "BookingFee": "رسوم الحجز", + "Morning": "صباح", + "from 07:30 till 10:30 (Thursday, Friday, Saturday, Monday)": + "من 7:30 إلى 10:30 (الخميس، الجمعة، السبت، الاثنين)", + "Evening": "مساء", + "from 12:00 till 15:00 (Thursday, Friday, Saturday, Monday)": + "من 12:00 إلى 15:00 (الخميس، الجمعة، السبت، الاثنين)", + "Night": "ليل", + "You have in account": "لديك في الحساب", + "Select Country": "اختر البلد", + "Ride Today : ": "رحلة اليوم: ", + "After this period\nYou can't cancel!": + "بعد هذه الفترة\nلا يمكنك الإلغاء!", + "from 23:59 till 05:30": "من 23:59 إلى 5:30", + "Rate Driver": "قيم الكابتن", + "Total Cost is ": "التكلفة الإجمالية ", + "Write note": "اكتب ملاحظة", + "Time to arrive": "وقت الوصول", + "Ride Summaries": "ملخصات الرحلات", + "Total Cost": "التكلفة الإجمالية", + "Average of Hours of": "متوسط الساعات", + " is ON for this month": " نشط هذا الشهر", + "Days": "أيام", + "Total Hours on month": "إجمالي الساعات في الشهر", + "Counts of Hours on days": "عدد الساعات في الأيام", + "OrderId": "رقم الطلب", + "created time": "وقت الإنشاء", + "Intaleq Over": "انتهت رحلة انطلق", + "I will slow down": "سأخفف السرعة", + "Map Passenger": "خريطة الراكب", + "Be Slowly": "تمهل", + "If you want to make Google Map App run directly when you apply order": + "إذا أردت تشغيل خرائط Google مباشرة عند قبول الطلب", + "You can change the language of the app": "يمكنك تغيير لغة التطبيق", + "Your Budget less than needed": "رصيدك أقل من المطلوب", + "You can change the Country to get all features": + "يمكنك تغيير البلد للحصول على جميع الميزات", + "There is no Car or Driver in your area.": + "لا توجد سيارة أو كابتن في منطقتك.", + "Change Country": "تغيير البلد" + }, + "ar-ma": { + "Syria": "سوريا", + "SYP": "ل.س", + "Order": "طلب", + "OrderVIP": "طلب VIP", + "Cancel Trip": "إلغي الرحلة", + "Passenger Cancel Trip": "الزبون ألغى الرحلة", + "VIP Order": "طلب VIP", + "The driver accepted your trip": "السائق قبل الرحلة ديالك", + "message From passenger": "رسالة من الزبون", + "Cancel": "إلغاء", + "Trip Cancelled. The cost of the trip will be added to your wallet.": + "الرحلة ملغية. الفلوس ديال الرحلة غادي تزاد في الجيب ديالك.", + "token change": "تبديل الرمز", + "Changed my mind": "بدلت رأيي", + "Please write the reason...": "عافاك اكتب السبب...", + "Found another transport": "لقيت طرسبور آخر", + "Driver is taking too long": "الشيفور تعطل بزاف", + "Driver asked me to cancel": "الشيفور طلب مني نلغي", + "Wrong pickup location": "لبلاصة ديال ركوب غلطة", + "Other": "آخر", + "Don't Cancel": "متلغيش", + "No Drivers Found": "مالقينا حتى شيفور", + "Sorry, there are no cars available of this type right now.": + "سمحلنا، ماكاينينش طوموبيلات من هاد النوع دابا", + "Refresh Map": "حدث الخريطة", + "face detect": "كشف الوجه", + "Face Detection Result": "نتيجة كشف الوجه", + "similar": "مشابه", + "not similar": "ماشي مشابه", + "Searching for nearby drivers...": "كنقلبو على شيفورات قراب...", + "Error": "خطأ", + "Failed to search, please try again later": + "ماتمكنناش من البحث، عاود جرب من بعد", + "Connection Error": "مشكل فالكونيكسيو", + "Please check your internet connection": + "عافاك تأكد من الكونيكسيو ديالك", + "Sorry 😔": "سمح لينا 😔", + "The driver cancelled the trip for an emergency reason.\nDo you want to search for another driver immediately?": + "الشيفور لغى الطلب لسبب مستعجل.\nتبغي نقلبو على واحد آخر دابا؟", + "Search for another driver": "قلب على شيفور آخر", + "We apologize 😔": "كنعتذرو 😔", + "No drivers found at the moment.\nPlease try again later.": + "مالقينا حتى شيفور دابا.\nعاود جرب من بعد.", + "Hi ,I will go now": "مرحبا، أنا غادي نمشي دابا", + "Passenger come to you": "الزبون جاي عندك", + "Call Income": "مكالمة واردة", + "Call Income from Passenger": "مكالمة واردة من الزبون", + "Criminal Document Required": "السجل العدلي ضروري", + "Verify": "أكد", + "Resend Code": "عاود صيفط الكود", + "You can resend in": "تقدر تعاود تصيفط من بعد", + "seconds": "ثواني", + "Please enter the complete 6-digit code.": + "عافاك دخل الكود كامل (6 د الأرقام).", + "last name required": "الكنية ضرورية", + "email optional label": "الإيميل (اختياري)", + "complete registration button": "كمل التسجيل", + "User with this phone number or email already exists.": + "كاين ديجا مستخدم بهاد النمرة ولا الإيميل.", + "otp sent success": "تصيفط الكود بنجاح", + "failed to send otp": "ماتمكنناش نصيفطو الكود", + "server error try again": "مشكل فالسيرفر، عاود جرب", + "an error occurred": "وقع مشكل", + "otp verification failed": "فشل تأكيد الكود", + "registration failed": "فشل التسجيل", + "welcome user": "مرحبا بك", + "Don't forget your personal belongings.": "متنساش حوايجك الشخصية.", + "Share App": "شارك التطبيق", + "Wallet": "الجيب", + "Balance": "الرصيد", + "Profile": "الملف الشخصي", + "Contact Support": "تواصل مع الدعم", + "Session expired. Please log in again.": + "سالات الدورة. عاود دخل من جديد عافاك.", + "Security Warning": "تحذير أمني", + "Potential security risks detected. The application may not function correctly.": + "تم رصد مخاطر أمنية محتملة. التطبيق يقدر مايخدمش مزيان.", + "please order now": "طلب دابا عافاك", + "Where to": "فين غادي؟", + "Where are you going?": "فين غادي؟", + "Quick Actions": "إجراءات سريعة", + "My Balance": "الرصيد ديالي", + "Order History": "تاريخ الطلبات", + "Contact Us": "اتصل بنا", + "Driver": "السائق", + "Complaint": "شكاية", + "Promos": "العروض", + "Recent Places": "الأماكن الأخيرة", + "From": "من", + "WhatsApp Location Extractor": "مستخرج موقع واتساب", + "Location Link": "رابط الموقع", + "Paste location link here": "لصق رابط الموقع هنا", + "Go to this location": "سير لهذا الموقع", + "Paste WhatsApp location link": "لصق رابط موقع واتساب", + "Select Order Type": "اختار نوع الطلب", + "Choose who this order is for": "اختار الطلب هذا ديال من؟", + "I want to order for myself": "بغيت نطلب ليا", + "I want to order for someone else": "بغيت نطلب لواحد آخر", + "Order for someone else": "طلب لشخص آخر", + "Order for myself": "طلب ليا", + "Are you want to go this site": "واش باغي تمشي لهذا المكان؟", + "No": "لا", + "Intaleq Wallet": "محفظة انطلق", + "Have a promo code?": "عندك كود برومو؟", + "Your Wallet balance is ": "الرصيد ديال الجيب ديالك هو ", + "Cash": "كاش", + "Pay directly to the captain": "خلص الكابتن نيشان", + "Top up Wallet to continue": "شارجي المحفظة باش تكمل", + "Or pay with Cash instead": "ولا خلص كاش فبلاصتها", + "Confirm & Find a Ride": "أكد وقلب على مشوار", + "Balance:": "الرصيد:", + "Alerts": "تنبيهات", + "Welcome Back!": "على سلامتك!", + "No contacts found": "مالقينا حتى كونطاكط", + "No contacts with phone numbers were found on your device.": + "مالقينا حتى كونطاكط برقم التيليفون فجهازك.", + "Permission denied": "الإذن ترفض", + "Contact permission is required to pick contacts": + "إذن الاتصالات ضروري باش تختار نمر", + "An error occurred while picking contacts:": + "وقع مشكل وحنا كنختارو ليكونطاكط:", + "Please enter a correct phone": + "الله يرحم الوالدين دخل نمرة تيليفون صحيحة", + "Success": "نجاح", + "Invite sent successfully": "تصيفط الدعوة بنجاح", + "Hello! I'm inviting you to try Intaleq.": + "أهلاً! كنستدعيك تجرب انطلق.", + "Use my invitation code to get a special gift on your first ride!": + "استعمل كود الدعوة ديالي باش تاخد هدية زوينة فالمشوار اللول ديالك!", + "Your personal invitation code is:": "كود الدعوة ديالك هو:", + "Be sure to use it quickly! This code expires at": + "استعملو دغيا عافاك! هاد الكود كيسالي فـ", + "Download the app now:": "نزل التطبيق دابا:", + "See you on the road!": "نشوفوك فالطريق!", + "This phone number has already been invited.": + "هاد النمرة راها مديوعة ديجا.", + "An unexpected error occurred. Please try again.": + "وقع مشكل غير متوقع. عاود جرب عافاك.", + "You deserve the gift": "أنت كتستحق الهدية", + "Claim your 20 LE gift for inviting": + "خد الهدية ديالك ديال 20 جنيه حيت استدعيتي صديق", + "You have got a gift for invitation": "جابت ليك الدعوة واحد الهدية", + "You have earned 20": "ربحتي 20", + "LE": "جنيه", + "Vibration feedback for all buttons": "تفاعل الاهتزاز لكل الأزرار", + "Share with friends and earn rewards": "بارطاجي مع صحابك وربح جوائز", + "Gift Already Claimed": "الهدية تخدات ديجا", + "You have already received your gift for inviting": + "خدتي ديجا الهدية ديالك حيت استدعيتي صديق", + "Keep it up!": "تبارك الله عليك كمل هاكا!", + "has completed": "اكتمل", + "trips": "مشاوير", + "Personal Information": "معلومات شخصية", + "Name": "الاسم", + "Not set": "مازال ماداروش", + "Gender": "الجنس", + "Education": "التعليم", + "Work & Contact": "الخدمة والتواصل", + "Employment Type": "نوع التوظيف", + "Marital Status": "الحالة الاجتماعية", + "SOS Phone": "تيليفون الطوارئ", + "Sign Out": "تسجيل الخروج", + "Delete My Account": "مسح الحساب ديالي", + "Update Gender": "تحديث الجنس", + "Update": "تحديث", + "Update Education": "تحديث التعليم", + "Are you sure? This action cannot be undone.": + "واش نتا متأكد؟ هاد الخطوة مايمكنش ترجع فيها.", + "Confirm your Email": "أكد الإيميل ديالك", + "Type your Email": "كتب البريد الإلكتروني ديالك", + "Delete Permanently": "مسح نهائيا", + "Male": "ذكر", + "Female": "أنثى", + "High School Diploma": "شهادة الباكالوريا", + "Associate Degree": "دبلوم جامعي", + "Bachelor's Degree": "إجازة جامعية", + "Master's Degree": "ماستر", + "Doctoral Degree": "دكتوراه", + "Select your preferred language for the app interface.": + "ختار اللغة اللي بغيتي للتطبيق.", + "Language Options": "خيارات اللغة", + "You can claim your gift once they complete 2 trips.": + "تقدر تاخد الهدية ديالك فاش يكملو 2 د المشاور.", + "Closest & Cheapest": "الأقرب والأرخص", + "Comfort choice": "اختيار مريح", + "Travel in a modern, silent electric car. A premium, eco-friendly choice for a smooth ride.": + "سافر فطوموبيل إلكتريك عصرية وساكتة. اختيار ممتاز وصديق للبيئة لمشوار مريح.", + "Spacious van service ideal for families and groups. Comfortable, safe, and cost-effective travel together.": + "خدمة فان واسعة مثالية للعائلات والمجموعات. سفر مريح، آمن واقتصادي مجموعين.", + "Quiet & Eco-Friendly": "هادئ وصديق للبيئة", + "Lady Captain for girls": "كابتن مرا للبنات", + "Van for familly": "فان للعائلات", + "Are you sure to delete this location?": + "متأكد باللي باغي تمسح هذا الموقع؟", + "Submit a Complaint": "قدم شكوى", + "Submit Complaint": "صيفط الشكوى", + "No trip history found": "مالقينا حتى تاريخ للمشاوير", + "Your past trips will appear here.": + "المشاور القديمة ديالك غتبان هنا.", + "1. Describe Your Issue": "1. اشرح المشكل ديالك", + "Enter your complaint here...": "دخل الشكوى ديالك هنا...", + "2. Attach Recorded Audio": "2. أرفق التسجيل الصوتي", + "No audio files found.": "مالقينا حتى أوديو.", + "Confirm Attachment": "أكد الرفق", + "Attach this audio file?": "واش نرفق هاد الأوديو؟", + "Uploaded": "تم الرفع", + "3. Review Details & Response": "3. راجع التفاصيل والرد", + "Date": "التاريخ", + "Today's Promos": "عروض اليوم", + "No promos available right now.": "ماكاين حتى عرض دابا.", + "Check back later for new offers!": + "عاود شوف من بعد باش تلقى عروض جديدة!", + "Valid Until:": "صالح حتى:", + "CODE": "كود", + "Login": "تسجيل الدخول", + "Sign in for a seamless experience": + "تسجل الدخول باش تكون تجربة أحسن", + "Sign In with Google": "تسجيل الدخول بجوجل", + "Sign in with Apple": "تسجيل الدخول بآبل", + "User not found": "المستخدم مالقيناهش", + "Need assistance? Contact us": "محتاج مساعدة؟ عيط لينا", + "Email": "البريد الإلكتروني", + "Your email address": "عنوان البريد الإلكتروني ديالك", + "Enter a valid email": "دخل بريد إلكتروني صحيح", + "Password": "كلمة السر", + "Your password": "كلمة السر ديالك", + "Enter your password": "دخل كلمة السر ديالك", + "Submit": "إرسال", + "Terms of Use & Privacy Notice": "شروط الاستخدام وإشعار الخصوصية", + "By selecting \"I Agree\" below, I confirm that I have read and agree to the ": + "بختياري لـ \"أنا موافق\" لتحت، كنأكد بلي قريت ووافقت على ", + "Terms of Use": "شروط الاستخدام", + " and acknowledge the ": " وكنوافق على ", + "Privacy Notice": "سياسة الخصوصية", + ". I am at least 18 years old.": ". أنا عندي 18 عام ولا كثر.", + "I Agree": "موافق", + "Continue": "كمل", + "Enable Location": "فعل اللوكيشن", + "To give you the best experience, we need to know where you are. Your location is used to find nearby captains and for pickups.": + "باش نعطيوك أحسن تجربة، خصنا نعرفو فين نتا كاين. اللوكيشن ديالك كيستعمل باش تلقى كباتن قراب وباش ركبوك.", + "Allow Location Access": "السماح بالوصول للموقع", + "Welcome to Intaleq!": "مرحبا بك في Intaleq!", + "Before we start, please review our terms.": + "قبل ما نبداو، عافاك طلع على الشروط ديالنا.", + "Your journey starts here": "المشوار ديالك كيبدا من هنا", + "Cancel Search": "حيد البحث", + "Set pickup location": "حدد بلاصة الركوب", + "Move the map to adjust the pin": "حرك الخريطة باش تقاد لبوينت", + "Searching for the nearest captain...": "كنقلبو على أقرب كابتن...", + "No one accepted? Try increasing the fare.": + "حتى واحد ماقبل؟ جرب تزيد فالثمن.", + "Increase Your Trip Fee (Optional)": + "زيد في ثمن المشوار ديالك (اختياري)", + "We haven't found any drivers yet. Consider increasing your trip fee to make your offer more attractive to drivers.": + "مالقيناش أي سواقين حتى دابا. فكر تزيد في ثمن المشوار باش العرض ديالك يكون جذاب كثر للسواقين.", + "No, thanks": "لا، شكرا", + "Increase Fee": "زيد في الأجرة", + "Copy": "نسخ", + "Promo Copied!": "العرض تنساخ!", + "Code": "كود", + "copied to clipboard": "تم النسخ", + "Price": "الثمن", + "Intaleq's Response": "جواب انطلق", + "Awaiting response...": "فانتظار الرد...", + "Audio file not attached": "الأوديو مارافقش", + "The audio file is not uploaded yet.\nDo you want to submit without it?": + "الأوديو مازال ماتشارجاش.\nواش تبغي تصيفط بلاه؟", + "deleted": "تمسح", + "To Work": "للخدمة", + "Work Saved": "مكان الخدمة تسجل", + "To Home": "للدار", + "Home Saved": "مكان الدار تسجل", + "Destination selected": "الوجهة مختارة", + "Now select start pick": "دابا اختار نقطة البداية", + "OK": "واخا", + "Confirm Pick-up Location": "تأكيد موقع الالتقاء", + "Set Location on Map": "حدد الموقع على الخريطة", + "You can contact us during working hours from 10:00 - 16:00.": + "تقدر تواصل معانا فوقت الخدمة من 10 للـ 4.", + "Intaleq is the safest and most reliable ride-sharing app designed especially for passengers in Syria. We provide a comfortable, respectful, and affordable riding experience with features that prioritize your safety and convenience. Our trusted captains are verified, insured, and supported by regular car maintenance carried out by top engineers. We also offer on-road support services to make sure every trip is smooth and worry-free. With Intaleq, you enjoy quality, safety, and peace of mind—every time you ride.": + "انطلق هو التطبيق الأكثر أماناً وموثوقية للنقل التشاركي، مصمم خصيصاً للمسافرين فسوريا. كنوفرو تجربة ركوب مريحة، محترمة وبثمن مناسب، مع ميزات كتعطي الأولوية لسلامتك وراحتك. الكباتن ديالنا الموثوق بهم تم التحقق منهم، مأمنين، وكيستافدو من صيانة دورية للطوموبيلات من طرف مهندسين متمكنين. كنقدمو أيضاً خدمات الدعم على الطريق باش نضمنو أن كل رحلة دوز بيخير وبلا مشاكل. مع انطلق، كتمتع بالجودة، السلامة وراحة البال - فكل مرة كتركب معانا.", + "Customer MSISDN doesn’t have customer wallet": + "رقم الكليان ماعندوش محفظة", + "Nearest Car: ~": "أقرب طوموبيل: ~", + "Nearest Car": "أقرب طوموبيل", + "No cars nearby": "ماكاينش طوموبيلات قريبة", + "Favorite Places": "الأماكن المفضلة", + "No favorite places yet!": "مازال ماكاينش أماكن مفضلة!", + "from your favorites": "من المفضلة ديالك", + "Back": "رجوع", + "Enter your code below to apply the discount.": + "دخل الكود ديالك لتحت باش تطبق التخفيض.", + "By selecting \"I Agree\" below, I confirm that I have read and agree to the": + "بالضغط على \"موافق\" لتحت، كنأكد باللي قريت ووافقت على", + "and acknowledge the": "وكنقر بـ", + "Enable Location Access": "فعل الوصول للموقع", + "We need your location to find nearby drivers for pickups and drop-offs.": + "محتاجين الموقع ديالك باش نلقاو سواقين قرابين للاستلام والتوصيل.", + "You should restart app to change language": + "خاصك تسد التطبيق وتعاود تفتحو باش اللغة تبدل", + "Home Page": "الصفحة الرئيسية", + "To change Language the App": "باش تبدل لغة التطبيق", + "Learn more about our app and mission": + "عرف كثر على التطبيق ديالنا والمهمة ديالنا", + "Promos For Today": "عروض اليوم", + "Choose your ride": "اختار مشوارك", + "Your Journey Begins Here": "الرحلة ديالك كتبدا هنا", + "Bonus gift": "هدية إضافية", + "Pay": "خلص", + "Get": "حصل على", + "Send to Driver Again": "عاود صيفط للسائق", + "Driver Name:": "اسم السائق:", + "No trip data available": "ماكاينش بيانات للرحلة متوفرة", + "Car Plate:": "نمرة الطوموبيل:", + "remaining": "باقي", + "Order Cancelled": "الطلب ملغي", + "You canceled VIP trip": "لغيتي مشوار VIP", + "Passenger cancelled order": "الزبون ألغى الطلب", + "Your trip is scheduled": "الرحلة ديالك مجدولة", + "Don't forget your ride!": "متنساش مشوارك!", + "Trip updated successfully": "الرحلة تحدتات بنجاح", + "Car Make:": "ماركة الطوموبيل:", + "Car Model:": "موديل الطوموبيل:", + "Car Color:": "لون الطوموبيل:", + "Driver Phone:": "نمرة تيليفون السائق:", + "Pre-booking": "حجز مسبق", + "Waiting VIP": "انتظار VIP", + "Driver List": "قائمة السائقين", + "Confirm Trip": "أكد المشوار", + "Select date and time of trip": "حدد التاريخ والوقت ديال المشوار", + "Date and Time Picker": "اختيار التاريخ والوقت", + "Trip Status:": "حالة المشوار:", + "pending": "قيد الانتظار", + "accepted": "مقبول", + "rejected": "مرفوض", + "Apply": "تطبيق", + "Enter your promo code": "دخل رمز الترويج الخاص بك", + "Apply Promo Code": "تطبيق رمز الترويج", + "Scheduled Time:": "الوقت المحدد:", + "No drivers available": "ماكاينش سواقين متوفرين", + "No drivers available at the moment. Please try again later.": + "ماكاينش سواقين متوفرين دابا. حاول مرة أخرى من بعد.", + "you have a negative balance of": "عندك رصيد ناقص ديال", + "Please try again in a few moments": "حاول مرة أخرى بعد لحظات قليلة", + "Unknown Driver": "سائق غير معروف", + "in your": "في الجيب ديالك", + "The driver accepted your order for": "السائق قبل الطلب ديالك بـ", + "wallet due to a previous trip.": "في الجيب ديالك بسبب رحلة سابقة.", + "rides": "مشاوير", + "Add Work": "زيد مكان الخدمة", + "The reason is": "السبب هو", + "User does not have a wallet #1652": "المستخدم معندوش جيب #1652", + "Price of trip": "ثمن المشوار", + "From:": "من:", + "For Intaleq and Delivery trips, the price is calculated dynamically. For Comfort trips, the price is based on time and distance": + "بالنسبة لمشاوير السرعة والتوصيل، الثمن كيتحسب تلقائيا. أما مشاوير الكمفورت، الثمن كيكون على حساب الوقت والمسافة", + "Phone Wallet Saved Successfully": "جيب التيليفون تسجل بنجاح", + "Add wallet phone you use": "زيد نمرة جيب التيليفون اللي كتستعمل", + "Update Available": "تحديث متوفر", + "Phone number must be exactly 11 digits long": + "نمرة التيليفون خاصها تكون 11 رقم بالضبط", + "Insert Wallet phone number": "دخل نمرة جيب التيليفون ديالك", + "Phone number isn't an Egyptian phone number": + "نمرة التيليفون هادي ماشي نمرة مصرية", + "A new version of the app is available. Please update to the latest version.": + "كاين نسخة جديدة من التطبيق متوفرة. الله يرحم الوالدين دير التحديث لآخر نسخة.", + "We use location to get accurate and nearest passengers for you": + "كنستعملو الموقع باش نوصلوك بأقرب ركاب وأدقهم ليك", + "This ride is already applied by another driver.": + "المشوار هذا تقبل من عند سائق آخر خلاص.", + "We use your precise location to find the nearest available driver and provide accurate pickup and dropoff information. You can manage this in Settings.": + "كنستعملو الموقع ديالك بالضبط باش نلقاو أقرب سائق متوفر ونديوك معلومات دقيقة على مكان الاستلام والوصول. ممكن تتحكم في هذا من الإعدادات.", + "Where are you, sir?": "فين وصلتي أسي؟", + "I've been trying to reach you but your phone is off.": + "كنحاول نعيط ليك والتيليفون مسدود.", + "Please don't be late": "الله يرحم الوالدين متأخرش", + "Please don't be late, I'm waiting for you at the specified location.": + "الله يرحم الوالدين متأخرش، أنا كنتسناك في المكان اللي محدد.", + "My location is correct. You can search for me using the navigation app": + "الموقع ديالي مزيان. ممكن تقلب عليا باستعمال تطبيق الملاحة", + "Hello, I'm at the agreed-upon location": + "أهلا، أنا في المكان المتفق عليه", + "How much longer will you be?": "شحال باقي ليك باش توصل؟", + "Phone number is verified before": "نمرة التيليفون مأكدة من قبل", + "Change Ride": "بدل المشوار", + "You can change the destination by long-pressing any point on the map": + "ممكن تبدل الوجهة بالضغط مطولاً على أي نقطة في الخريطة", + "Pick from map destination": "اختار الوجهة ديالك من الخريطة", + "Pick or Tap to confirm": "اختار أو ضغط باش تأكد", + "Accepted your order": "الطلب ديالك تقبل", + "Order Accepted": "الطلب مقبول", + "with type": "مع نوع", + "accepted your order at price": "الطلب ديالك تقبل بثمن", + "you canceled order": "أنت لغيتي الطلب", + "If you want order to another person": "إلا بغيتي تطلب لشخص آخر", + "upgrade price": "طلع الثمن", + "airport": "مطار", + "Best choice for a comfortable car with a flexible route and stop points. This airport offers visa entry at this price.": + "أحسن اختيار لطوموبيل مريحة بمسار مرن ونقط توقف. المطار هذا كيقدم دخول فيزا بهذا الثمن.", + "You can upgrade price to may driver accept your order": + "ممكن تزيد في الثمن باش السائق يقبل الطلب ديالك", + "Change Route": "بدل المسار", + "No Captain Accepted Your Order": "ماكاينش كابيتان قبل الطلب ديالك", + "We are looking for a captain but the price may increase to let a captain accept": + "كنقلبوا على كابيتان ولكن ممكن الثمن يزيد باش كابيتان يقبل", + "No, I want to cancel this trip": "لا، بغيت نلغي المشوار هذا", + "Attention": "تنبيه", + "Trip Cancelled. The cost of the trip will be deducted from your wallet.": + "الرحلة ملغية. هيتخصم الثمن ديال الرحلة من الجيب ديالك.", + "You will be charged for the cost of the driver coming to your location.": + "غادي تتحسب عليك تكلفة مجيئ السائق للموقع ديالك.", + "reject your order.": "رفض الطلب ديالك.", + "Order Under Review": "الطلب قيد المراجعة", + "is reviewing your order. They may need more information or a higher price.": + "كيراجع الطلب ديالك. ممكن يحتاجو معلومات كثر أو ثمن أعلى.", + "Vibration": "اهتزاز", + "Resend code": "عاود صيفط الرمز", + "change device": "بدل الجهاز", + "Device Change Detected": "تغير الجهاز تم الكشف عليه", + "You can only use one device at a time. This device will now be set as your active device.": + "ممكن تستعمل جهاز واحد فقط في المرة الوحدة. الجهاز هذا غادي يتعين دابا كجهازك النشط.", + "Click here point": "ضغط هنا", + "Are you want to change": "واش باغي تبدل؟", + "by": "بواسطة", + "Enter your complaint here": "كتب الشكاية ديالك هنا", + "Please enter your complaint.": + "الله يرحم الوالدين دخل الشكاية ديالك.", + "Complaint data saved successfully": "بيانات الشكاية تسجلات بنجاح", + "Trip Monitor": "مراقبة الرحلة", + "Insert SOS Phone": "دخل نمرة طوارئ", + "Add SOS Phone": "زيد نمرة طوارئ", + "Dear ,\n\n 🚀 I have just started an exciting trip and I would like to share the details of my journey and my current location with you in real-time! Please download the Intaleq app. It will allow you to view my trip details and my latest location.\n\n 👉 Download link: \n Android [https://play.google.com/store/apps/details?id=com.mobileapp.store.ride]\n iOS [https://getapp.cc/app/6458734951]\n\n I look forward to keeping you close during my adventure!\n\n Intaleq ,": + "عزيزي،\n\n🚀 يلاه بديت رحلة مشوقة وبغيت نشارك معاك تفاصيل الرحلة ديالي والموقع الحالي ديالي في الوقت الفعلي! الله يرحم الوالدين نزل تطبيق Intaleq. غادي يسمح ليك تشوف تفاصيل الرحلة ديالي والموقع الأخير ديالي.\n\n👈 رابط التحميل:\nAndroid [https://play.google.com/store/apps/details?id=com.mobileapp.store.ride]\niOS [https://getapp.cc/app/6458734951]\n\nكنتسنى نبقيك قريب مني خلال المغامرة ديالي!\n\nIntaleq،", + "Send Intaleq app to him": "صيفط ليه تطبيق Intaleq", + "No passenger found for the given phone number": + "مالقيناش زبون بالنمرة التيليفون هادي", + "No user found for the given phone number": + "مالقيناش مستخدم بالنمرة التيليفون هادي", + "This price is": "الثمن هذا", + "Work": "خدمة", + "Add Home": "زيد دار", + "Notifications": "الإشعارات", + "💳 Pay with Credit Card": "خلص بالبطاقة الائتمانية 💳", + "⚠️ You need to choose an amount!": "⚠️ خاصك تختار مبلغ!", + "💰 Pay with Wallet": "خلص من الجيب", + "You must restart the app to change the language.": + "خاصك تسد التطبيق وتعاود تفتحو باش اللغة تبدل.", + "joined": "انضم", + "Driver joined the channel": "السائق انضم للقناة", + "Driver left the channel": "السائق غادر القناة", + "Call Page": "صفحة الاتصال", + "Call Left": "مكالمات باقية", + " Next as Cash !": " المرة جاية كاش!", + "To use Wallet charge it": "باش تستعمل الجيب شحنو", + "We are searching for the nearest driver to you": + "كنقلبوا ليك على أقرب سائق ليك", + "Best choice for cities": "أحسن اختيار للمدن", + "Rayeh Gai: Round trip service for convenient travel between cities, easy and reliable.": + "رايح جاي: خدمة للذهاب والعودة لـ Intaleq مريح بين المدن، ساهلة وموثوقة.", + "This trip is for women only": "المشوار هذا خاص بالعيالات فقط", + "Total budgets on month": "إجمالي الميزانية الشهرية", + "You have call from driver": "عندك مكالمة من السائق", + "Intaleq": "Intaleq", + "passenger agreement": "اتفاقية الركاب", + "To become a passenger, you must review and agree to the ": + "باش تولي راكب، خصك تراجع وتوافق على ", + "agreement subtitle": "وافق على الشروط", + "terms of use": "شروط الاستخدام", + " and acknowledge our Privacy Policy.": + " ووافق على سياسة الخصوصية ديالنا.", + "and acknowledge our": "ووافق على", + "privacy policy": "سياسة الخصوصية", + "i agree": "أنا موافق", + "Driver already has 2 trips within the specified period.": + "السائق عندو ديجا جوج مشاوير خلال الفترة المحددة.", + "The invitation was sent successfully": "الدعوة تصيفطات بنجاح", + "You should select your country": "خاصك تختار البلد ديالك", + "Scooter": "سكوتر", + "A trip with a prior reservation, allowing you to choose the best captains and cars.": + "مشوار بحجز مسبق، تقدر تختار فيه أحسن الكباتن والطوموبيلات.", + "Mishwar Vip": "مشوار VIP", + "The driver waiting you in picked location .": + "السائق كيتسناك في مكان الالتقاء اللي اختاريتي.", + "About Us": "على التطبيق", + "You can change the vibration feedback for all buttons": + "ممكن تبدل اهتزاز الأزرار", + "Most Secure Methods": "أكثر طرق الأمان", + "In-App VOIP Calls": "مكالمات صوتية داخل التطبيق", + "Recorded Trips for Safety": "تسجيل الرحلات للأمان", + "\nWe also prioritize affordability, offering competitive pricing to make your rides accessible.": + "\nكما أننا كنعطيو الأولوية للأسعار المناسبة، وكنقدمو أسعار تنافسية باش المشاوير ديالك تكون في المتناول.", + "Intaleq is a ride-sharing app designed with your safety and affordability in mind. We connect you with reliable drivers in your area, ensuring a convenient and stress-free travel experience.\n\nHere are some of the key features that set us apart:": + "Intaleq هو تطبيق لمشاركة المشاوير مصمم مع وضع السلامة ديالك وتكلفة المشوار في الاعتبار. كنوصلوك بسواقين موثوقين في المنطقة ديالك، وكنضمنو ليك تجربة Intaleq مريحة وبلا ستريس.\n\nها بعض المميزات الأساسية اللي كتميزنا:", + "Sign In by Apple": "تسجيل الدخول بـ Apple", + "Sign In by Google": "تسجيل الدخول بـ Google", + "How do I request a ride?": "كيفاش نطلب مشوار؟", + "Step-by-step instructions on how to request a ride through the Intaleq app.": + "تعليمات خطوة بخطوة على كيفية طلب مشوار من خلال تطبيق Intaleq.", + "What types of vehicles are available?": + "شنو أنواع الطوموبيلات اللي متوفرة؟", + "Intaleq offers a variety of vehicle options to suit your needs, including economy, comfort, and luxury. Choose the option that best fits your budget and passenger count.": + "Intaleq كتقدم ليك اختيارات متنوعة ديال الطوموبيلات تناسب الاحتياجات ديالك، منها اقتصادي ومريح وفاخر. اختار اللي كيناسب الميزانية ديالك وعدد الركاب.", + "How can I pay for my ride?": "كيفاش نخلص ثمن المشوار ديالي؟", + "Intaleq offers multiple payment methods for your convenience. Choose between cash payment or credit/debit card payment during ride confirmation.": + "Intaleq كتقدم ليك طرق دفع متعددة للراحة ديالك. اختار بين الدفع كاش ولا ببطاقة الائتمان/الخصم وأنت كتأكد المشوار.", + "Can I cancel my ride?": "واش ممكن نلغي المشوار ديالي؟", + "Yes, you can cancel your ride under certain conditions (e.g., before driver is assigned). See the Intaleq cancellation policy for details.": + "أه، ممكن تلغي الرحلة ديالك في ظروف معينة (بحال قبل ما يتعين السائق). شوف سياسة الإلغاء في Intaleq باش تعرف التفاصيل.", + "Driver Registration & Requirements": "تسجيل السائقين والمتطلبات", + "How can I register as a driver?": "كيفاش ممكن نسجل كسائق؟", + "What are the requirements to become a driver?": + "شنو هما المتطلبات باش نخدم كسائق؟", + "Visit our website or contact Intaleq support for information on driver registration and requirements.": + "الله يرحم الوالدين زور الموقع الإلكتروني ديالنا ولا عيط لدعم Intaleq باش تعرف معلومات على تسجيل السائقين والمتطلبات.", + "Intaleq provides in-app chat functionality to allow you to communicate with your driver or passenger during your ride.": + "Intaleq كتوفر ميزة الدردشة داخل التطبيق باش تسمح ليك تتواصل مع السائق ديالك أو الراكب ديالك أثناء الرحلة.", + "Intaleq prioritizes your safety. We offer features like driver verification, in-app trip tracking, and emergency contact options.": + "Intaleq كتعطي الأولوية للسلامة ديالك. كنقدمو مميزات بحال التحقق من هوية السائق، وتتبع الرحلات داخل التطبيق، وخيارات الاتصال في حالات الطوارئ.", + "Frequently Questions": "الأسئلة الشائعة", + "User does not exist.": "المستخدم ما كاينش.", + "We need your phone number to contact you and to help you.": + "محتاجين نمرة التيليفون ديالك باش نتصلو بيك ونعاونوك", + "You will recieve code in sms message": "غادي توصلك رمز في رسالة SMS", + "Please enter": "الله يرحم الوالدين دخل", + "We need your phone number to contact you and to help you receive orders.": + "محتاجين نمرة التيليفون ديالك باش نتصلو بيك ونعاونوك تستقبل الطلبات.", + "The full name on your criminal record does not match the one on your driver's license. Please verify and provide the correct documents.": + "السمية اللي فالسجل العدلي ماشي هي اللي فالبيرمي. عافاك تأكد وصيفط لوريقات الصحيحة.", + "The national number on your driver's license does not match the one on your ID document. Please verify and provide the correct documents.": + "الرقم الوطني اللي فالبيرمي ماشي هو اللي فالبطاقة الوطنية. تأكد عافاك وصيفط لوريقات الصحيحة.", + "Capture an Image of Your Criminal Record": "صور السجل الجنائي ديالك", + "IssueDate": "تاريخ الإصدار", + "Capture an Image of Your car license front": + "صور الوجة ديال لاكارط كريز", + "Capture an Image of Your ID Document front": + "صور الواجهة الأمامية لوثيقة الهوية ديالك", + "NationalID": "الرقم القومي", + "You can share the Intaleq App with your friends and earn rewards for rides they take using your code": + "ممكن تشارك تطبيق Intaleq مع صحابك وتربح مكافآت على المشاوير اللي كيديرو باستعمال الكود ديالك.", + "FullName": "الاسم الكامل", + "No invitation found yet!": "مازال مالقيناش دعوات!", + "InspectionResult": "نتيجة الفحص", + "Criminal Record": "السجل الجنائي", + "The email or phone number is already registered.": + "البريد الإلكتروني أو نمرة التيليفون مسجلين ديجا.", + "To become a ride-sharing driver on the Intaleq app, you need to upload your driver's license, ID document, and car registration document. Our AI system will instantly review and verify their authenticity in just 2-3 minutes. If your documents are approved, you can start working as a driver on the Intaleq app. Please note, submitting fraudulent documents is a serious offense and may result in immediate termination and legal consequences.": + "باش تولي سائق ديال الركوب المشترك في تطبيق Intaleq، خاصك تحمل رخصة السياقة ديالك، وثيقة الهوية، ووثيقة تسجيل الطوموبيل. النظام ديال الذكاء الاصطناعي ديالنا غادي يراجع ويتحقق من صحة الوثائق ديالك في غضون 2-3 دقائق فقط. إلا الوثائق ديالك تقبلو، ممكن تبدا تخدم كسائق في تطبيق Intaleq. الله يرحم الوالدين لاحظ، تقديم وثائق مزورة كيتعتبر جريمة خطيرة وممكن يترتب عليها إنهاء الحساب فورا وعواقب قانونية.", + "Documents check": "فحص الوثائق", + "Driver's License": "رخصة السياقة", + "for your first registration!": "للتسجيل الأول ديالك!", + "Get it Now!": "حصل عليه دابا!", + "before": "قبل", + "Code not approved": "الرمز ما مقبولش", + "3000 LE": "3000 جنيه مصري", + "Do you have an invitation code from another driver?": + "واش عندك كود دعوة من سائق آخر؟", + "Paste the code here": "لصق الكود هنا", + "No, I don't have a code": "لا، معنديش كود", + "Audio uploaded successfully.": "الصوت ترفع بنجاح", + "Perfect for passengers seeking the latest car models with the freedom to choose any route they desire": + "مثالي للركاب اللي كيقلبوا على أحدث موديلات الطوموبيلات مع حرية اختيار أي طريق بغاو", + "Share this code with your friends and earn rewards when they use it!": + "شارك الكود هذا مع صحابك وربح مكافآت فاش كيستعملوه!", + "Enter phone": "دخل نمرة التيليفون", + "complete, you can claim your gift": " ممكن تطلب الهدية ديالك", + "When": "فاش يسالي", + "Enter driver's phone": "دخل نمرة تيليفون السائق", + "Send Invite": "صيفط الدعوة", + "Show Invitations": "عرض الدعوات", + "License Type": "نوع الرخصة", + "National Number": "الرقم الوطني", + "Name (Arabic)": "الاسم بالعربية", + "Name (English)": "الاسم بالإنجليزية", + "Address": "العنوان", + "Issue Date": "تاريخ الإصدار", + "Expiry Date": "تاريخ الانتهاء", + "License Categories": "فئات الرخصة", + "driver_license": "رخصة السياقة", + "Capture an Image of Your Driver License": "صور رخصة السياقة ديالك", + "ID Documents Back": "الوجه الخلفي لوثائق الهوية", + "National ID": "البطاقة الوطنية", + "Occupation": "المهنة", + "Religion": "الدين", + "Full Name (Marital)": "الاسم الكامل (حسب الحالة الاجتماعية)", + "Expiration Date": "تاريخ الانتهاء", + "Capture an Image of Your ID Document Back": + "صور الوجه الخلفي لوثيقة الهوية ديالك", + "ID Documents Front": "الوجه الأمامي لوثائق الهوية", + "First Name": "الاسم الأول", + "CardID": "رقم البطاقة", + "Vehicle Details Front": "تفاصيل المركبة ‏الوجه الأمامي", + "Plate Number": "نمرة اللوحة", + "Owner Name": "اسم المالك", + "Vehicle Details Back": "تفاصيل المركبة ‏الوجه الخلفي", + "Make": "المصنع", + "Model": "الطراز", + "Year": "السنة", + "Chassis": "الشاسي", + "Color": "اللون", + "Displacement": "السعة", + "Fuel": "الوقود", + "Tax Expiry Date": "تاريخ انتهاء الضريبة", + "Inspection Date": "تاريخ الفحص", + "Capture an Image of Your car license back": + "صور الوجه الخلفي لرخصة الطوموبيل ديالك", + "Capture an Image of Your Driver's License": "صور البيرمي ديالك", + "Sign in with Google for easier email and name entry": + "تسجل الدخول بجوجل باش تسجل البريد الإلكتروني والاسم ديالك بسهولة", + "You will choose allow all the time to be ready receive orders": + "غادي تختار السماح ديما باش تكون مستعد تستقبل الطلبات", + "Get to your destination quickly and easily.": + "وصل للوجهة ديالك بسرعة وسهولة.", + "Enjoy a safe and comfortable ride.": "استمتع برحلة آمنة ومريحة.", + "Choose Language": "اختار اللغة", + "Pay with Wallet": "خلص بالجيب", + "Invalid MPIN": "رمز PIN غير صحيح", + "Invalid OTP": "كود التحقق خاطئ", + "Enter your email address": "دخل عنوان البريد الإلكتروني ديالك", + "Please enter Your Email.": + "الله يرحم الوالدين دخل البريد الإلكتروني ديالك.", + "Enter your phone number": "دخل نمرة التيليفون ديالك", + "Please enter your phone number.": + "الله يرحم الوالدين دخل نمرة التيليفون ديالك.", + "Please enter Your Password.": + "الله يرحم الوالدين دخل كلمة السر ديالك.", + "if you dont have account": "إلا ماكانش عندك حساب", + "Register": "تسجيل", + "Accept Ride's Terms & Review Privacy Notice": + "قبل شروط الاستخدام وراجع إشعار الخصوصية", + "By selecting 'I Agree' below, I have reviewed and agree to the Terms of Use and acknowledge the Privacy Notice. I am at least 18 years of age.": + "بالاختيار ديال 'موافق' لتحت، راجعت ووافقت على شروط الاستخدام وكنقر بإشعار الخصوصية. عندي على الأقل 18 عام.", + "First name": "الاسم الشخصي", + "Enter your first name": "دخل اسمك الشخصي", + "Please enter your first name.": + "الله يرحم الوالدين دخل اسمك الشخصي.", + "Last name": "الاسم العائلي", + "Enter your last name": "دخل اسمك العائلي", + "Please enter your last name.": + "الله يرحم الوالدين دخل اسمك العائلي.", + "City": "المدينة", + "Please enter your City.": + "الله يرحم الوالدين دخل اسم المدينة ديالك.", + "Verify Email": "تأكيد البريد الإلكتروني", + "We sent 5 digit to your Email provided": + "صيفطنا رمز من 5 أرقام للبريد الإلكتروني اللي عطيتي", + "5 digit": "5 أرقام", + "Send Verification Code": "صيفط رمز التحقق", + "Your Ride Duration is ": "المدة ديال الرحلة ديالك هي ", + "You will be thier in": "غادي تكون تما في", + "You trip distance is": "المسافة ديال الرحلة ديالك هي", + "Fee is": "الرسوم هي", + "From : ": "من: ", + "To : ": "إلى: ", + "Add Promo": "زيد برومو", + "Confirm Selection": "أكد الاختيار", + "distance is": "المسافة هي", + "Privacy Policy": "سياسة الخصوصية", + "Intaleq LLC": "شركة Intaleq", + "Syria's pioneering ride-sharing service, proudly developed by Arabian and local owners. We prioritize being near you – both our valued passengers and our dedicated captains.": + "خدمة النقل التشاركي الرائدة فسوريا، تطورات بفخر من طرف ملاك عرب ومحليين. الأولوية ديالنا هي نكونو قراب منكم - ركابنا الأعزاء وكباتننا المخلصين.", + "Intaleq is the first ride-sharing app in Syria, designed to connect you with the nearest drivers for a quick and convenient travel experience.": + "انطلق هو أول تطبيق للنقل التشاركي فسوريا، مصمم باش يربطك بأقرب شيفورات لتجربة سفر سريعة ومريحة.", + "Why Choose Intaleq?": "علاش تختار Intaleq؟", + "Closest to You": "الأقرب ليك", + "We connect you with the nearest drivers for faster pickups and quicker journeys.": + "كنربطوك بأقرب السائقين باش يكون الاستلام أسرع والرحلات أقصر.", + "Uncompromising Security": "أعلى مستويات الأمان", + "Lady Captains Available": "كابتانات متوفرات", + "Recorded Trips (Voice & AI Analysis)": + "الرحلات المسجلة (تحليل صوتي بالذكاء الاصطناعي)", + "Fastest Complaint Response": "أسرع استجابة للشكايات", + "Our dedicated customer service team ensures swift resolution of any issues.": + "فريق خدمة العملاء ديالنا مكلف كيضمن حل سريع لأي مشكل.", + "Affordable for Everyone": "في المتناول ديال كلشي", + "Frequently Asked Questions": "الأسئلة الشائعة", + "Getting Started": "البدء", + "Simply open the Intaleq app, enter your destination, and tap \"Request Ride\". The app will connect you with a nearby driver.": + "حل تطبيق Intaleq، دخل الوجهة ديالك، وضغط على \"طلب رحلة\". التطبيق غادي يوصلك بأقرب سائق.", + "Vehicle Options": "خيارات المركبات", + "Intaleq offers a variety of options including Economy, Comfort, and Luxury to suit your needs and budget.": + "Intaleq كتوفر مجموعة متنوعة من الخيارات منها اقتصادي، مريح، وفاخر باش تناسب الاحتياجات والميزانية ديالك.", + "Payments": "المدفوعات", + "You can pay for your ride using cash or credit/debit card. You can select your preferred payment method before confirming your ride.": + "ممكن تخلص ثمن المشوار ديالك كاش ولا ببطاقة الائتمان/الخصم. ممكن تختار طريقة الدفع اللي كتفضل قبل ما تأكد المشوار ديالك.", + "Ride Management": "إدارة الرحلات", + "Yes, you can cancel your ride, but please note that cancellation fees may apply depending on how far in advance you cancel.": + "أه، ممكن تلغي المشوار ديالك، ولكن الله يرحم الوالدين لاحظ باللي رسوم الإلغاء ممكن تطبق على حساب شحال قبل لغيتي المشوار.", + "For Drivers": "للسواقين", + "Driver Registration": "تسجيل السائق", + "To register as a driver or learn about the requirements, please visit our website or contact Intaleq support directly.": + "باش تسجل كسائق ولا تعرف المتطلبات، الله يرحم الوالدين زور الموقع الإلكتروني ديالنا ولا اتصل بدعم Intaleq مباشرةً.", + "Visit Website/Contact Support": "زور الموقع/اتصل بالدعم", + "Close": "سد", + "We are searching for the nearest driver": "كنقلبوا على أقرب سائق", + "Communication": "التواصل", + "How do I communicate with the other party (passenger/driver)?": + "كيفاش نتواصل مع الطرف الآخر (الزبون/السائق)؟", + "You can communicate with your driver or passenger through the in-app chat feature once a ride is confirmed.": + "ممكن تتواصل مع السائق ديالك ولا الراكب ديالك من خلال ميزة الشات داخل التطبيق فاش كيتأكد المشوار.", + "Safety & Security": "الأمان والحماية", + "What safety measures does Intaleq offer?": + "شنو هما إجراءات الأمان اللي كيقدم Intaleq؟", + "Intaleq offers various safety features including driver verification, in-app trip tracking, emergency contact options, and the ability to share your trip status with trusted contacts.": + "Intaleq كيقدم مميزات أمان متنوعة منها التحقق من السائق، تتبع الرحلة داخل التطبيق، خيارات الاتصال في حالات الطوارئ، وإمكانية مشاركة حالة الرحلة ديالك مع جهات اتصال موثوقة.", + "Enjoy competitive prices across all trip options, making travel accessible.": + "استمتع بأسعار تنافسية على كل خيارات الرحلات، وهذا كيخلي Intaleq سهل الوصول ليه.", + "Variety of Trip Choices": "خيارات رحلات متنوعة", + "Choose the trip option that perfectly suits your needs and preferences.": + "اختار خيار الرحلة اللي كيناسب الاحتياجات والتفضيلات ديالك بالضبط.", + "Your Choice, Our Priority": "الاختيار ديالك هو الأولوية ديالنا", + "Because we are near, you have the flexibility to choose the ride that works best for you.": + "حيت احنا قراب، عندك المرونة تختار المشوار اللي كيناسبك.", + "duration is": "المدة هي", + "Setting": "الإعدادات", + "Find answers to common questions": "لقا أجوبة للأسئلة الشائعة", + "I don't need a ride anymore": "مابغيتش مشوار آخر", + "I was just trying the application": "كنت غير كنجرب التطبيق", + "No driver accepted my request": "ماكاينش سائق قبل الطلب ديالي", + "I added the wrong pick-up/drop-off location": + "زديت موقع الالتقاء/الوصول غالط", + "I don't have a reason": "ما عندي حتى سبب", + "Can we know why you want to cancel Ride ?": + "واش ممكن نعرفو علاش باغي تلغي المشوار؟", + "Add Payment Method": "زيد طريقة الدفع", + "Ride Wallet": "جيب الرحلة", + "Payment Method": "طريقة الدفع", + "Type here Place": "كتب هنا المكان", + "Are You sure to ride to": "متأكد باللي باغي تمشي لـ", + "Confirm": "أكد", + "You are Delete": "أنت غادي تمسح", + "Deleted": "تمسح", + "You Dont Have Any places yet !": "مازال ماعندك حتى أماكن!", + "From : Current Location": "من: الموقع الحالي", + "My Cared": "البطاقات ديالي", + "Add Card": "زيد بطاقة", + "Add Credit Card": "زيد بطاقة ائتمان", + "Please enter the cardholder name": + "الله يرحم الوالدين دخل اسم صاحب البطاقة", + "Please enter the expiry date": + "الله يرحم الوالدين دخل تاريخ الانتهاء", + "Please enter the CVV code": "الله يرحم الوالدين دخل رمز CVV", + "Go To Favorite Places": "سير للأماكن المفضلة", + "Go to this Target": "سير لهذا الهدف", + "My Profile": "الملف الشخصي ديالي", + "Are you want to go to this site": "واش باغي تمشي لهذا الموقع", + "MyLocation": "الموقع ديالي", + "my location": "الموقع ديالي", + "Target": "هدف", + "You Should choose rate figure": "خاصك تختار تقييم", + "Login Captin": "تسجيل دخول الكابتن", + "Register Captin": "تسجيل كابتن جديد", + "Send Verfication Code": "صيفط رمز التحقق", + "KM": "كم", + "End Ride": "سالي الرحلة", + "Minute": "دقيقة", + "Go to passenger Location now": "سير لموقع الزبون دابا", + "Duration of the Ride is ": "المدة ديال الرحلة هي ", + "Distance of the Ride is ": "المسافة ديال الرحلة هي", + "Name of the Passenger is ": "اسم الزبون هو", + "Hello this is Captain": "مرحبا هذا الكابتن", + "Start the Ride": "بدا الرحلة", + "Please Wait If passenger want To Cancel!": + "الله يرحم الوالدين تسنى إلا الزبون بغا يلغي!", + "Total Duration:": "المدة الإجمالية:", + "Active Duration:": "المدة الفعلية:", + "Waiting for Captin ...": "كنتسناو الكابتن...", + "Age is ": "العمر هو", + "Rating is ": "التقييم هو", + " to arrive you.": "باش يوصل عندك.", + "Tariff": "تعريفة", + "Settings": "الإعدادات", + "Feed Back": "اقتراحات", + "Please enter a valid 16-digit card number": + "الله يرحم الوالدين دخل رقم بطاقة صحيح مكون من 16 رقم", + "Add Phone": "زيد تيليفون", + "Please enter a phone number": "الله يرحم الوالدين دخل نمرة تيليفون", + "You dont Add Emergency Phone Yet!": + "مازال مازتي نمرة تيليفون طوارئ!", + "You will arrive to your destination after ": + "غادي توصل للوجهة ديالك من بعد", + "You can cancel Ride now": "ممكن تلغي المشوار دابا", + "You Can cancel Ride After Captain did not come in the time": + "ممكن تلغي المشوار من بعد ما الكابتن ما يوصلش في الوقت المحدد", + "If you in Car Now. Press Start The Ride": + "إلا كنتي في الطوموبيل دابا. ضغط على بدا الرحلة", + "You Dont Have Any amount in": "ماعندك حتى مبلغ في", + "Wallet!": "الجيب!", + "You Have": "عندك", + "Save Credit Card": "حفظ بطاقة الائتمان", + "Show Promos": "عرض العروض الترويجية", + "10 and get 4% discount": "10 وربح خصم 4%", + "20 and get 6% discount": "20 وربح خصم 6%", + "40 and get 8% discount": "40 وربح خصم 8%", + "100 and get 11% discount": "100 وربح خصم 11%", + "Pay with Your PayPal": "خلص بـ PayPal ديالك", + "You will choose one of above !": "غادي تختار وحدة من هادو لفوق!", + "Edit Profile": "تعديل الملف الشخصي", + "Copy this Promo to use it in your Ride!": + "نسخ العرض هذا باش تستعملو في المشوار ديالك!", + "To change some Settings": "باش تبدل شي إعدادات", + "Order Request Page": "صفحة طلب الطلب", + "Rouats of Trip": "طرق الرحلة", + "Passenger Name is ": "اسم الراكب هو ", + "Total From Passenger is ": "المبلغ الإجمالي من الراكب هو ", + "Duration To Passenger is ": "المدة باش توصل للراكب هي ", + "Distance To Passenger is ": "المسافة باش توصل للراكب هي ", + "Total For You is ": "المبلغ الإجمالي ليك هو ", + "Distance is ": "المسافة هي ", + " KM": " كيلومتر", + "Duration of Trip is ": "المدة ديال الرحلة هي ", + " Minutes": " دقائق", + "Apply Order": "قبل الطلب", + "Refuse Order": "رفض الطلب", + "Rate Captain": "قيم الكابتن", + "Enter your Note": "دخل الملاحظة ديالك", + "Type something...": "كتب شي حاجة...", + "Submit rating": "صيفط التقييم", + "Rate Passenger": "قيم الراكب", + "Ride Summary": "ملخص الرحلة", + "welcome_message": "مرحبا بك في Intaleq!", + "app_description": + "Intaleq هو تطبيق موثوق وآمن وسهل الوصول ليه لمشاركة الركوب.", + "get_to_destination": "سير للوجهة ديالك بسرعة وسهولة.", + "get_a_ride": "مع Intaleq، ممكن تحصل على رحلة للوجهة ديالك في دقائق.", + "safe_and_comfortable": "استمتع برحلة آمنة ومريحة.", + "committed_to_safety": + "Intaleq ملتزمة بالسلامة، وكل الكباتن عندنا كيتفحصو مزيان وكيديرو ليهم فحص الخلفية.", + "your ride is Accepted": "الرحلة ديالك مقبولة", + "Driver is waiting at pickup.": "السائق كيتسناك في نقطة الاستلام.", + "Driver is on the way": "السائق في الطريق", + "Contact Options": "خيارات الاتصال", + "Send a custom message": "صيفط رسالة مخصصة", + "Type your message": "كتب الرسالة ديالك", + "I will go now": "أنا غادي دابا", + "You Have Tips": "عندك زيادة فلوس", + " tips\nTotal is": " زيادة مال\nالمجموع هو", + "Your fee is ": "الأجرة ديالك هي ", + "Do you want to pay Tips for this Driver": + "واش تبغي تعطي تدويرة لهاد الشيفور؟", + "Tip is ": " مبلغ البقشيش هو", + "Are you want to wait drivers to accept your order": + "واش باغي تسنى حتى السائقين يقبلو الطلب ديالك؟", + "This price is fixed even if the route changes for the driver.": + "الثمن هذا ثابت حتى إلا المسار تبدل للسائق.", + "The price may increase if the route changes.": + "احتمالية زيادة الثمن إلى المسار تبدل.", + "The captain is responsible for the route.": + "الكابتن مسؤول على المسار", + "We are search for nearst driver": "كنقلبو على أقرب سائق", + "Your order is being prepared": "جاري تجهيز الطلب ديالك", + "The drivers are reviewing your request": + "السائقين كيدرسو الطلب ديالك", + "Your order sent to drivers": "الطلب ديالك تصيفط للسائقين", + "You can call or record audio of this trip": + "ممكن تعيط ولا تسجل صوت للرحلة هادي", + "The trip has started! Feel free to contact emergency numbers, share your trip, or activate voice recording for the journey": + "الرحلة بدات! براحتك تعيط لأرقام الطوارئ، شارك الرحلة ديالك، ولا فعل التسجيل الصوتي للرحلة", + "Camera Access Denied.": "الوصول للكاميرا مرفوض.", + "Open Settings": "فتح الإعدادات", + "GPS Required Allow !.": "تفعيل GPS مطلوب!", + "Your Account is Deleted": "الحساب ديالك تمسح", + "Are you sure to delete your account?": + "متأكد باللي باغي تمسح الحساب ديالك؟", + "Your data will be erased after 2 weeks\nAnd you will can't return to use app after 1 month ": + "البيانات ديالك غادي يتمسحو من بعد أسبوعين\nومغاديش تقدر ترجع تستعمل التطبيق من بعد شهر", + "Enter Your First Name": "دخل اسمك الشخصي", + "Are you Sure to LogOut?": "متأكد باللي باغي تسجل الخروج؟", + "Email Wrong": "البريد الإلكتروني غالط", + "Email you inserted is Wrong.": "البريد الإلكتروني اللي دخلتي غالط.", + "You have finished all times ": "ساليتي كل المحاولات", + "if you want help you can email us here": + "إلا بغيتي مساعدة ممكن تصيفط لينا إيميل هنا", + "Thanks": "شكرا", + "Email Us": "صيفط لينا إيميل", + "I cant register in your app in face detection ": + "ماعرفتش نسجل في التطبيق ديالكم بسبب كشف الوجه", + "Hi": "مرحبا", + "No face detected": "ماكاينش وجه مكشوف", + "Image detecting result is ": "النتيجة ديال كشف الصورة هي", + "from 3 times Take Attention": "من 3 مرات رد البال", + "Be sure for take accurate images please\nYou have": + "الله يرحم الوالدين تأكد تلتقط صور دقيقة\nعندك", + "image verified": "الصورة مأكدة", + "Next": "التالي", + "There is no help Question here": "ماكاينش أسئلة مساعدة هنا", + "You dont have Points": "ماعندكش نقاط", + "You Are Stopped For this Day !": "توقفتي هذا النهار!", + "You must be charge your Account": "خاصك تعاود تشحن رصيد النقاط", + "You Refused 3 Rides this Day that is the reason \nSee you Tomorrow!": + "رفضتي 3 رحلات اليوم هذا هو السبب\nنتلاقاو غدا!", + "Recharge my Account": "خلص رسوم من الحساب ديالي", + "Ok , See you Tomorrow": "واخا، نتلاقاو غدا", + "You are Stopped": "توقفتي", + "Connected": "متصل", + "Not Connected": "غير متصل", + "Your are far from passenger location": "أنت بعيد على مكان الراكب", + "go to your passenger location before\nPassenger cancel trip": + "سير لمكان الراكب قبل ما\nالراكب يلغي الرحلة", + "You will get cost of your work for this trip": + "غادي تاخد تكاليف الخدمة ديالك على الرحلة هادي", + " in your wallet": "في الجيب ديالك", + "you gain": "ربحتي", + "Order Cancelled by Passenger": "الطلب تلغى من عند الراكب", + "Feedback data saved successfully": "بيانات التعليقات تسجلات بنجاح", + "No Promo for today .": "ماكاينش عروض ترويجية اليوم.", + "Select your destination": "اختار الوجهة ديالك", + "Search for your Start point": "قلب على نقطة الانطلاق ديالك", + "Search for waypoint": "قلب على النقطة الآلية", + "Current Location": "الموقع الحالي", + "Add Location 1": "زيد الموقع 1", + "You must Verify email !.": "خاصك تأكد البريد الإلكتروني!", + "Cropper": "القاصة", + "Saved Sucssefully": "تسجل بنجاح", + "Select Date": "اختار التاريخ", + "Birth Date": "تاريخ الميلاد", + "Ok": "موافق", + "the 500 points equal 30 JOD": "500 نقطة كتساوي 30 دينار أردني", + "the 500 points equal 30 JOD for you \nSo go and gain your money": + "500 نقطة كتساوي 30 دينار أردني ليك\nفستاهل فلوسك وربح النقاط", + "token updated": "الرمز تحدت", + "Add Location 2": "زيد الموقع 2", + "Add Location 3": "زيد الموقع 3", + "Add Location 4": "زيد الموقع 4", + "Waiting for your location": "كنتسناو الموقع ديالك", + "Search for your destination": "قلب على الوجهة ديالك", + "Hi! This is": "مرحبا! أنا", + " I am using": " أنا كنستعمل", + " to ride with": " باش نركب مع", + " as the driver.": " كسائق.", + "is driving a ": "كيسوق", + " with license plate ": "بلوحة ترخيص", + " I am currently located at ": "أنا دابا كاين في", + "Please go to Car now ": "الله يرحم الوالدين سير للطوموبيل دابا", + "You will receive a code in WhatsApp Messenger": + "غادي توصل برمز في واتساب ماسنجر", + "If you need assistance, contact us": "إلا محتاج مساعدة، تواصل معنا", + "Promo Ended": "العرض سالا", + "Enter the promo code and get": "دخل رمز الترويج وربح", + "DISCOUNT": "خصم", + "No wallet record found": "ماكاينش سجل الجيب", + "for": "لمدة", + "Intaleq is the safest ride-sharing app that introduces many features for both captains and passengers. We offer the lowest commission rate of just 8%, ensuring you get the best value for your rides. Our app includes insurance for the best captains, regular maintenance of cars with top engineers, and on-road services to ensure a respectful and high-quality experience for all users.": + "Intaleq هو أكثر تطبيق آمن لمشاركة الركوب وكيدخل مميزات بزاف للكباتن والركاب بجوج. كنقدمو أقل نسبة عمولة وهي 8% فقط، وهذا كيضمن ليك تاخد أحسن قيمة للمشاوير ديالك. التطبيق ديالنا فيه تأمين لأحسن الكباتن، صيانة دورية للطوموبيلات مع أحسن المهندسين، وخدمات على الطريق لضمان تجربة محترمة وعالية الجودة لكل المستخدمين.", + "You can contact us during working hours from 12:00 - 19:00.": + "ممكن تعيط لينا في مواعيد العمل من 12:00 - 19:00.", + "Choose a contact option": "اختار طريقة الاتصال", + "Work time is from 12:00 - 19:00.\nYou can send a WhatsApp message or email.": + "مواعيد العمل من 12:00 - 19:00.\nممكن تصيفط رسالة واتساب ولا إيميل.", + "Promo code copied to clipboard!": "رمز العرض تنساخ للحافظة!", + "Copy Code": "نسخ الرمز", + "Your invite code was successfully applied!": + "رمز الدعوة ديالك طبق بنجاح!", + "Payment Options": "خيارات الدفع", + "wait 1 minute to receive message": + "تسنى دقيقة واحدة باش توصلك الرسالة", + "You have copied the promo code.": "نسختي رمز العرض.", + "Select Payment Amount": "اختار مبلغ الدفع", + "The promotion period has ended.": "فترة العرض سالات.", + "Promo Code Accepted": "كود العرض مقبول", + "Tap on the promo code to copy it!": "ضغط على رمز العرض باش تنسخو!", + "Lowest Price Achieved": "أقل ثمن تحقق", + "Cannot apply further discounts.": "مايمكنش نطبقو تخفيضات أخرى.", + "Promo Already Used": "كود العرض مستعمل ديجا", + "Invitation Used": "الدعوة مستعملة", + "You have already used this promo code.": "استعملتي الكود هذا ديجا.", + "Insert Your Promo Code": "دخل كود العرض ديالك", + "Enter promo code here": "دخل كود العرض هنا", + "Please enter a valid promo code": + "الله يرحم الوالدين دخل كود عرض صحيح", + "Awfar Car": "أوفر كار", + "Old and affordable, perfect for budget rides.": + "طوموبيل قديمة وبثمن معقول، مثالية للمشاوير الاقتصادية.", + " If you need to reach me, please contact the driver directly at": + "إلا كنتي محتاج توصل ليا، الله يرحم الوالدين تواصل مع السائق مباشرة على", + "No Car or Driver Found in your area.": + "مالقيناش لا طوموبيل لا سائق في المنطقة ديالك.", + "Please Try anther time ": "الله يرحم الوالدين حاول وقت آخر", + "There no Driver Aplly your order sorry for that ": + "ماكاينش سائق قبل الطلب ديالك كنتأسفوا على هذا", + "Trip Cancelled": "الرحلة ملغية", + "The Driver Will be in your location soon .": + "السائق غادي يكون في الموقع ديالك قريبًا.", + "The distance less than 500 meter.": "المسافة قل من 500 متر.", + "Promo End !": "العرض سالا!", + "There is no notification yet": "ماكاينش إشعارات حتى دابا", + "Use Touch ID or Face ID to confirm payment": + "استعمل Touch ID ولا Face ID باش تأكد الدفع", + "Contact us for any questions on your order.": + "تواصل معنا إلا عندك أي استفسارات بخصوص الطلب ديالك.", + "Pyament Cancelled .": "الدفع ملغي.", + "type here": "كتب هنا", + "Scan Driver License": "مسح رخصة السياقة", + "Please put your licence in these border": + "الله يرحم الوالدين حط الرخصة ديالك في هذا الإطار", + "Camera not initialized yet": "الكاميرا مازال ماخدماتش", + "Take Image": "صور", + "AI Page": "صفحة الذكاء الاصطناعي", + "Take Picture Of ID Card": "صور بطاقة الهوية", + "Take Picture Of Driver License Card": "صور بطاقة رخصة السياقة", + "We are process picture please wait ": + "كنعالج الصورة الله يرحم الوالدين تسنى", + "There is no data yet.": "ماكاينش بيانات حتى دابا.", + "Name :": "الاسم:", + "Drivers License Class: ": "فئة رخصة السياقة:", + "Document Number: ": "رقم الوثيقة:", + "Address: ": "العنوان:", + "Height: ": "الطول:", + "Expiry Date: ": "تاريخ الانتهاء:", + "Date of Birth: ": "تاريخ الميلاد:", + "You can't continue with us .\nYou should renew Driver license": + "مايمكنلكش تكمل معانا.\nخصك تجدد البيرمي ديالك", + "Detect Your Face ": "كشف الوجه ديالك", + "Go to next step\nscan Car License.": + "سير للخطوة اللي جاية\nومسح رخصة الطوموبيل.", + "Name in arabic": "الاسم بالعربية", + "Drivers License Class": "فئة رخصة السياقة", + "Selected Date": "التاريخ المحدد", + "Select Time": "اختار الوقت", + "Selected Time": "الوقت المحدد", + "Selected Date and Time": "التاريخ والوقت المحددين", + "Lets check Car license ": "يلا نفحصو رخصة الطوموبيل", + "Car": "الطوموبيل", + "Plate": "اللوحة ديال الطوموبيل", + "Rides": "الرحلات", + "Selected driver": "السائق اللي اختاريتي", + "Lets check License Back Face": "يلا نفحصو الوجه الخلفي للرخصة", + "Car License Card": "بطاقة رخصة الطوموبيل", + "No image selected yet": "مازال ما اختاريتي صورة", + "Made :": "الصنع:", + "model :": "الموديل:", + "VIN :": "رقم الشاسي:", + "year :": "السنة:", + "ُExpire Date": "تاريخ الانتهاء", + "Login Driver": "تسجيل دخول السائق", + "Password must br at least 6 character.": + "كلمة السر خاصها تكون 6 حروف على الأقل.", + "if you don't have account": "إلى ماعندكش حساب", + "Here recorded trips audio": "هنا تسجيلات صوتية ديال الرحلات", + "Register as Driver": "تسجيل كسائق", + "By selecting \"I Agree\" below, I have reviewed and agree to the Terms of Use and acknowledge the ": + "بالاختيار ديال 'موافق' لتحت، راجعت ووافقت على شروط الاستخدام وكنقر بـ", + "Log Out Page": "صفحة تسجيل الخروج", + "Log Off": "تسجيل الخروج", + "Register Driver": "تسجيل سائق جديد", + "Verify Email For Driver": "تأكيد البريد الإلكتروني للسائق", + "Admin DashBoard": "لوحة تحكم المدير", + "Your name": "الاسم ديالك", + "your ride is applied": "الطلب ديالك تقبل", + "H and": "ساعة و", + "JOD": "دينار", + "m": "دقيقة", + "We search nearst Driver to you": "كنقلبو على أقرب سائق ليك", + "please wait till driver accept your order": + "الله يرحم الوالدين تسنى حتى السائق يقبل الطلب ديالك", + "No accepted orders? Try raising your trip fee to attract riders.": + "ماكاينش طلبات مقبولة؟ حاول تطلع في أجرة المشوار باش تجذب الركاب.", + "You should select one": "خاصك تختار واحد", + "The driver accept your order for": "السائق قبل الطلب ديالك بـ", + "The driver on your way": "الكابتن في الطريق ليك", + "Total price from ": "الثمن الإجمالي من ", + "Order Details Intaleq": "طلب سريع", + "Selected file:": "الملف المختار:", + "Your trip cost is": "تكلفة الرحلة ديالك هي", + "this will delete all files from your device": + "المسح هذا غادي يمسح كل الملفات من الجهاز ديالك", + "Exclusive offers and discounts always with the Intaleq app": + "عروض وخصومات حصرية ديما مع تطبيق Intaleq", + "Submit Question": "طرح سؤال", + "Please enter your Question.": "الله يرحم الوالدين دخل السؤال ديالك.", + "Help Details": "تفاصيل المساعدة", + "No trip yet found": "مازال ما تحجزات حتى رحلة", + "No Response yet.": "مازال ماكاينش رد.", + " You Earn today is ": "اللي ربحتي اليوم هو", + " You Have in": "عندك في", + "Total points is ": "إجمالي النقاط هو", + "Total Connection Duration:": "إجمالي مدة الاتصال:", + "Passenger name : ": "اسم الراكب", + "Cost Of Trip IS ": "تكلفة الرحلة هي", + "Arrival time": "وقت الوصول", + "arrival time to reach your point": + "الوقت المتوقع للوصول للوجهة ديالك", + "For Intaleq and scooter trips, the price is calculated dynamically. For Comfort trips, the price is based on time and distance": + "بالنسبة لمشاوير السرعة والسكوتر، الثمن كيتحسب تلقائيا. أما مشاوير الراحة، فالثمن كيكون على حساب الوقت والمسافة.", + "Hello this is Driver": "مرحبا هذا السائق", + "Is the Passenger in your Car ?": "واش الراكب معاك في الطوموبيل؟", + "Please wait for the passenger to enter the car before starting the trip.": + "الله يرحم الوالدين تسنى حتى الراكب يركب الطوموبيل قبل ما تبدا المشوار.", + "No ,still Waiting.": "لا، مازال كنتسنى.", + "I arrive you": "أنا وصلت عندك", + "I Arrive your site": "أنا وصلت للمكان ديالك", + "You are not in near to passenger location": + "أنت ماشي قريب من مكان الراكب", + "please go to picker location exactly": + "الله يرحم الوالدين سير لموقع الراكب بالضبط", + "You Can Cancel Trip And get Cost of Trip From": + "ممكن تلغي المشوار وتاخد التكلفة من", + "Are you sure to cancel?": "متأكد باللي باغي تلغي؟", + "Insert Emergincy Number": "دخل نمرة الطوارئ", + "Best choice for comfort car and flexible route and stops point": + "أحسن اختيار لطوموبيل مريحة ومسار مرن ونقط وقوف", + "Insert": "إدخال", + "This is for scooter or a motorcycle.": + "هذا خاص بالتوصيل ولا الموطور", + "This trip goes directly from your starting point to your destination for a fixed price. The driver must follow the planned route": + "المشوار هذا كيمشي نيشان من نقطة البداية لنقطة النهاية بثمن ثابت. والسائق خاصو يتبع المسار المحدد.", + "You can decline a request without any cost": + "تقدر ترفض الطلب بلا حتى تكلفة", + "Perfect for adventure seekers who want to experience something new and exciting": + "مثالي لعشاق المغامرة اللي باغين يجربو حوايج جديدة ومثيرة", + "My current location is:": "الموقع الحالي ديالي هو:", + "and I have a trip on": "وعندي مشوار على", + "App with Passenger": "التطبيق\nمع الراكب", + "You will be pay the cost to driver or we will get it from you on next trip": + "غادي تخلص التكلفة للسائق ولا غادي ناخدوها منك في المشوار اللي جاي", + "Trip has Steps": "الرحلة فيها خطوات", + "Distance from Passenger to destination is ": + "المسافة من الراكب للوجهة هي", + "price is": "التكلفة هي", + "This ride type does not allow changes to the destination or additional stops": + "نوع المشوار هذا ما كيسمحش بتغيير الوجهة ولا زيادة وقفات.", + "This price may be changed": + "الله يرحم الوالدين البال الثمن ممكن يتبدل", + "No SIM card, no problem! Call your driver directly through our app. We use advanced technology to ensure your privacy.": + "حتى إلا ماكانش خط، ماعليش! عيط للسائق ديالك مباشرة من خلال التطبيق ديالنا. كنستعملو تكنولوجيا حديثة باش نحافظو على الخصوصية ديالك.", + "This ride type allows changes, but the price may increase": + "نوع المشوار هذا كيسمح بالتغييرات، ولكن الثمن ممكن يزيد", + "Select one message": "اختار رسالة", + "I'm waiting for you": "كنتسناك", + "We noticed the Intaleq is exceeding 100 km/h. Please slow down for your safety. If you feel unsafe, you can share your trip details with a contact or call the police using the red SOS button.": + "لاحظنا باللي السرعة كتفوت 100 كم/ساعة. الله يرحم الوالدين نقص السرعة حفاظًا على السلامة ديالك. إلا حسيتي براسك ماشي آمن، ممكن تشارك تفاصيل الرحلة ديالك مع شي حد كتثيق فيه ولا تعيط للبوليس بالزر الأحمر SOS.", + "Warning: Intaleqing detected!": "تحذير: السرعة الزائدة مرصودة!", + "Please help! Contact me as soon as possible.": + "الله يرحم الوالدين عاونوني! عيطو بيا في أقرب وقت ممكن", + "Share Trip Details": "شارك تفاصيل الرحلة", + "Car Plate is ": "نمرة الطوموبيل هي", + "the 300 points equal 300 L.E for you \nSo go and gain your money": + "ربح 300 جنيه! كل 300 نقطة كتساوي 300 جنيه. يلا استغل النقاط ديالك!", + "the 300 points equal 300 L.E": "300 نقطة كتساوي 300 جنيه ليك", + "The payment was not approved. Please try again.": + "الدفع ما تقبلش. الله يرحم الوالدين حاول مرة أخرى.", + "Payment Failed": "فشل الدفع", + "This is a scheduled notification.": "هذا إشعار مجدول.", + "An error occurred during the payment process.": + "وقع خطأ أثناء عملية الدفع.", + "The payment was approved.": "الدفع تقبل.", + "Payment Successful": "الدفع ناجح", + "No ride found yet": "ماكاينش طلبات متوفرة حاليًا", + "Accept Order": "قبل الطلب", + "Bottom Bar Example": "مثال لشريط التنقل السفلي", + "Driver phone": "نمرة تيليفون السائق", + "Statistics": "الإحصائيات", + "Origin": "نقطة الانطلاق", + "Destination": "الوجهة", + "Driver Name": "اسم السائق", + "Driver Car Plate": "لوحة الطوموبيل", + "Available for rides": "متوفر للمشاوير", + "Scan Id": "مسح الهوية", + "Camera not initilaized yet": "الكاميرا مازال ماخدماتش", + "Scan ID MklGoogle": "مسح هوية MklGoogle", + "Language": "اللغة", + "Jordan": "الأردن", + "USA": "الولايات المتحدة الأمريكية", + "Egypt": "مصر", + "Turkey": "تركيا", + "Saudi Arabia": "المملكة العربية السعودية", + "Qatar": "قطر", + "Bahrain": "البحرين", + "Kuwait": "الكويت", + "But you have a negative salary of": "ولكن عندك رصيد ناقص بقيمة", + "Promo Code": "كود ترويجي", + "Your trip distance is": "المسافة ديال الرحلة ديالك هي", + "Enter promo code": "دخل كود ترويجي", + "You have promo!": "عندك عرض ترويجي!", + "Cost Duration": "تكلفة المدة", + "Duration is": "المدة هي", + "Leave": "مغادرة", + "Join": "انضمام", + "Heading your way now. Please be ready.": + "أنا جاي في الطريق ليك دابا. الله يرحم الوالدين وجد.", + "Approaching your area. Should be there in 3 minutes.": + "كنقرب من المنطقة ديالك. خاصني نكون تما في 3 دقائق.", + "There's heavy traffic here. Can you suggest an alternate pickup point?": + "كاين زحام كثير هنا. ممكن تقترح نقطة التقاء بديلة؟", + "This ride is already taken by another driver.": + "المشوار هذا خداه سائق آخر خلاص.", + "You Should be select reason.": "خاصك تختار سبب.", + "Waiting for Driver ...": "كنتسناو السائق...", + "Latest Recent Trip": "آخر مشوار درت", + "from your list": "من اللائحة ديالك", + "Do you want to change Work location": "واش باغي تبدل مكان الخدمة؟", + "Do you want to change Home location": "واش باغي تبدل مكان الدار؟", + "We Are Sorry That we dont have cars in your Location!": + "كنتأسفوا باللي ما عندناش طوموبيلات في الموقع ديالك!", + "Choose from Map": "اختار من الخريطة", + "Pick your ride location on the map - Tap to confirm": + "حدد مكان الالتقاء ديال المشوار ديالك على الخريطة - ضغط باش تأكد", + "Intaleq is the ride-hailing app that is safe, reliable, and accessible.": + "Intaleq هو تطبيق التوصيل اللي آمن وموثوق وسهل الاستعمال.", + "With Intaleq, you can get a ride to your destination in minutes.": + "مع Intaleq، ممكن توصل للوجهة ديالك في دقائق.", + "Intaleq is committed to safety, and all of our captains are carefully screened and background checked.": + "Intaleq ملتزمة بالأمان، وكل الكباتن ديالنا كيتفحصو مزيان وكيديرو ليهم فحص الخلفية.", + "Pick from map": "اختيار من الخريطة", + "No Car in your site. Sorry!": + "ماكاينش طوموبيل في الموقع ديالك. آسف!", + "Nearest Car for you about ": "أقرب طوموبيل ليك على بعد تقريبا ", + "From :": "من:", + "Get Details of Trip": "عرض تفاصيل الرحلة", + "If you want add stop click here": "إلا بغيتي تزيد وقفة ضغط هنا", + "Where you want go ": "فين باغي تمشي؟", + "My Card": "البطاقة ديالي", + "Start Record": "بدا التسجيل", + "History of Trip": "سجل الرحلات", + "Helping Center": "مركز المساعدة", + "Record saved": "التسجيل تسجل", + "Trips recorded": "الرحلات المسجلة", + "Select Your Country": "اختار البلد ديالك", + "To ensure you receive the most accurate information for your location, please select your country below. This will help tailor the app experience and content to your country.": + "باش تضمن توصلك أدق المعلومات للموقع ديالك، الله يرحم الوالدين اختار البلد ديالك لتحت. هذا غادي يساعد نخصو تجربة التطبيق والمحتوى للبلد ديالك.", + "Are you sure to delete recorded files": + "متأكد باللي باغي تمسح الملفات الصوتية المسجلة؟", + "Select recorded trip": "اختار الملف الصوتي المسجل", + "Card Number": "رقم البطاقة", + "Hi, Where to ": "مرحبا، فين غادي؟", + "Pick your destination from Map": "اختار الوجهة ديالك من الخريطة", + "Add Stops": "زيد محطات", + "Get Direction": "عرض الاتجاهات", + "Add Location": "زيد موقع", + "Switch Rider": "بدل الراكب", + "You will arrive to your destination after timer end.": + "غادي توصل للوجهة ديالك من بعد ما يسالي العداد.", + "You can cancel trip": "تقدر تلغي الرحلة", + "The driver waitting you in picked location .": + "السائق كيتسناك في المكان اللي اختاريتي.", + "Pay with Your": "خلص بـ", + "Pay with Credit Card": "خلص ببطاقة الائتمان", + "Show Promos to Charge": "عرض العروض باش تشحن", + "Point": "نقطة", + "How many hours would you like to wait?": "شحال من ساعة باغي تسنى؟", + "Driver Wallet": "جيب السائق", + "Choose between those Type Cars": + "اختار من بين أنواع الطوموبيلات هادو", + "hour": "ساعة", + "Select Waiting Hours": "اختار ساعات الانتظار", + "Total Points is": "إجمالي النقاط هو", + "You will receive a code in SMS message": + "غادي توصل برمز في رسالة نصية", + "Done": "تم", + "Total Budget from trips is ": "إجمالي المبلغ المستحق من الرحلات هو", + "Total Amount:": "المبلغ الإجمالي:", + "Total Budget from trips by\nCredit card is ": + "إجمالي المبلغ المستحق من الرحلات عن طريق\nبطاقة الائتمان هو", + "This amount for all trip I get from Passengers": + "هذا المبلغ اللي حصلت عليه من كل الرحلات من الركاب", + "Pay from my budget": "خلص من الرصيد ديالي", + "This amount for all trip I get from Passengers and Collected For me in": + "هذا المبلغ اللي حصلت عليه من كل الرحلات من الركاب وتجمع ليا في", + "You can buy points from your budget": + "ممكن تشري نقاط من الرصيد ديالك", + "insert amount": "دخل المبلغ", + "You can buy Points to let you online\nby this list below": + "ممكن تشري نقاط باش تبقى متصل\nمن اللائحة هادي لتحت", + "Create Wallet to receive your money": + "إنشاء جيب لاستقبال الفلوس ديالك", + "Enter your feedback here": "كتب الملاحظات ديالك هنا", + "Please enter your feedback.": + "الله يرحم الوالدين دخل الملاحظات ديالك.", + "Feedback": "ملاحظات", + "Submit ": "إرسال", + "Click here to Show it in Map": "ضغط هنا باش تعرضو في الخريطة", + "Canceled": "ملغي", + "No I want": "لا مابغيتش", + "Email is": "البريد الإلكتروني هو", + "Phone Number is": "نمرة التيليفون هي", + "Date of Birth is": "تاريخ الميلاد هو", + "Sex is ": "النوع هو ", + "Car Details": "تفاصيل الطوموبيل", + "VIN is": "رقم الشاسي هو", + "Color is ": "اللون هو ", + "Make is ": "الشركة المصنعة هي", + "Model is": "الموديل هو", + "Year is": "السنة هي", + "Expiration Date ": "تاريخ الانتهاء ", + "Edit Your data": "تعديل البيانات ديالك", + "write vin for your car": "كتب رقم الشاسي ديال الطوموبيل ديالك", + "VIN": "رقم الشاسي", + "Please verify your identity": "عافاك أكد الهوية ديالك", + "write Color for your car": "كتب لون الطوموبيل ديالك", + "write Make for your car": "كتب الشركة المصنعة ديال الطوموبيل ديالك", + "write Model for your car": "كتب موديل الطوموبيل ديالك", + "write Year for your car": "كتب سنة صنع الطوموبيل ديالك", + "write Expiration Date for your car": + "كتب تاريخ انتهاء رخصة الطوموبيل ديالك", + "Tariffs": "التعريفات", + "Minimum fare": "الحد الأدنى للأجرة", + "Maximum fare": "الحد الأقصى للأجرة", + "Flag-down fee": "رسوم فتح العداد", + "Including Tax": "شامل الضريبة", + "BookingFee": "رسوم الحجز", + "Morning": "الصباح", + "from 07:30 till 10:30 (Thursday, Friday, Saturday, Monday)": + "من 07:30 حتى 10:30 (الخميس، الجمعة، السبت، الاثنين)", + "Evening": "المساء", + "from 12:00 till 15:00 (Thursday, Friday, Saturday, Monday)": + "من 12:00 حتى 15:00 (الخميس، الجمعة، السبت، الاثنين)", + "Night": "الليل", + "You have in account": "عندك في الحساب", + "Select Country": "اختار الدولة", + "Ride Today : ": "عدد رحلات اليوم: ", + "After this period\nYou can't cancel!": + "من بعد هاد الوقت\nمايمكنش تكنسلي!", + "from 23:59 till 05:30": "من 23:59 حتى 05:30", + "Rate Driver": "قيم السائق", + "Total Cost is ": "صافي الربح", + "Write note": "كتب ملاحظة", + "Time to arrive": "وقت الوصول", + "Ride Summaries": "ملخصات الرحلات", + "Total Cost": "المبلغ الإجمالي", + "Average of Hours of": "متوسط ساعات", + " is ON for this month": "في هذا الشهر", + "Days": "أيام", + "Total Hours on month": "إجمالي الساعات في الشهر", + "Counts of Hours on days": "عدد ساعات الأيام", + "OrderId": "رقم الرحلة", + "created time": "وقت الرحلة", + "Intaleq Over": "سرعة عالية", + "I will slow down": "واخا غادي نقص السرعة", + "Map Passenger": "خريطة الراكب", + "Be Slowly": "بالمهل شوية في السرعة", + "If you want to make Google Map App run directly when you apply order": + "إلا بغيتي تطبيق خرائط جوجل يخدم تلقائي فاش كتطلب الخدمة", + "You can change the language of the app": "تقدر تبدل لغة التطبيق", + "Your Budget less than needed": "القيمة المدخلة قل من الرصيد ديالك", + "You can change the Country to get all features": + "تقدر تبدل الدولة باش تحصل على كل المميزات", + "There is no Car or Driver in your area.": + "ماكاين حتى طوموبيل ولا شيفور فمنطقتك.", + "Change Country": "تبديل الدولة", + }, + "tr": { + "About Intaleq": "Intaleq Hakkında", + "Chat with us anytime": "İstediğiniz zaman bizimle sohbet edin", + "Direct talk with our team": "Ekibimizle doğrudan görüşün", + "Email Support": "E-posta Desteği", + "For official inquiries": "Resmi sorular için", + "Intaleq Support": "Intaleq Destek", + "Reach out to us via": "Bize şuradan ulaşın", + "Support is Away": "Destek şu an uzakta", + "Support is currently Online": "Destek şu an çevrimiçi", + "Voice Call": "Sesli Arama", + "We're here to help you 24/7": "7/24 size yardımcı olmaya hazırız", + "Working Hours:": "Çalışma Saatleri:", + "1 Passenger": "1 Passenger", + "2 Passengers": "2 Passengers", + "3 Passengers": "3 Passengers", + "4 Passengers": "4 Passengers", + "2. Attach Recorded Audio (Optional)": + "2. Attach Recorded Audio (Optional)", + "Account": "Account", + "Actions": "Actions", + "Active Users": "Active Users", + "Add a Stop": "Add a Stop", + "Add a new waypoint stop": "Add a new waypoint stop", + "After this period\nYou can\'t cancel!": + "After this period\nYou can\'t cancel!", + "Age is": "Age is", + "Alert": "Alert", + "An OTP has been sent to your number.": + "An OTP has been sent to your number.", + "An error occurred": "An error occurred", + "Appearance": "Appearance", + "Are you sure you want to delete this file?": + "Are you sure you want to delete this file?", + "Are you sure you want to logout?": + "Are you sure you want to logout?", + "Arrived": "Arrived", + "Audio Recording": "Audio Recording", + "Call": "Call", + "Call Support": "Call Support", + "Call left": "Call left", + "Change Photo": "Change Photo", + "Choose from Gallery": "Choose from Gallery", + "Choose from contact": "Choose from contact", + "Click to track the trip": "Click to track the trip", + "Close panel": "Close panel", + "Coming": "Coming", + "Complete Payment": "Complete Payment", + "Confirm Cancellation": "Confirm Cancellation", + "Confirm Pickup Location": "Confirm Pickup Location", + "Connection failed. Please try again.": + "Connection failed. Please try again.", + "Could not create ride. Please try again.": + "Could not create ride. Please try again.", + "Crop Photo": "Crop Photo", + "Dark Mode": "Dark Mode", + "Delete": "Delete", + "Delete Account": "Delete Account", + "Delete All": "Delete All", + "Delete All Recordings?": "Delete All Recordings?", + "Delete Recording?": "Delete Recording?", + "Destination Set": "Destination Set", + "Distance": "Distance", + "Double tap to open search or enter destination": + "Double tap to open search or enter destination", + "Double tap to set or change this waypoint on the map": + "Double tap to set or change this waypoint on the map", + "Drawing route on map...": "Drawing route on map...", + "Driver Phone": "Driver Phone", + "Driver is Going To You": "Driver is Going To You", + "Emergency Mode Triggered": "Emergency Mode Triggered", + "Emergency SOS": "Emergency SOS", + "Enter the 5-digit code": "Enter the 5-digit code", + "Enter your City": "Enter your City", + "Enter your Password": "Enter your Password", + "Failed to book trip: \$e": "Failed to book trip: \$e", + "Failed to get location": "Failed to get location", + "Failed to initiate payment. Please try again.": + "Failed to initiate payment. Please try again.", + "Failed to send OTP": "Failed to send OTP", + "Failed to upload photo": "Failed to upload photo", + "Finished": "Finished", + "Fixed Price": "Fixed Price", + "General": "General", + "Grant": "Grant", + "Have a Promo Code?": "Have a Promo Code?", + "Hello! I\'m inviting you to try Intaleq.": + "Hello! I\'m inviting you to try Intaleq.", + "Hi ,I Arrive your site": "Hi ,I Arrive your site", + "Hi, Where to": "Hi, Where to", + "Home": "Home", + "I am currently located at": "I am currently located at", + "I'm Safe": "I'm Safe", + "If you need to reach me, please contact the driver directly at": + "If you need to reach me, please contact the driver directly at", + "Image Upload Failed": "Image Upload Failed", + "Intaleq Passenger": "Intaleq Passenger", + "Invite": "Invite", + "Join a channel": "Join a channel", + "Last Name": "Last Name", + "Leave a detailed comment (Optional)": + "Leave a detailed comment (Optional)", + "Light Mode": "Light Mode", + "Listen": "Listen", + "Location": "Location", + "Location Received": "Location Received", + "Logout": "Logout", + "Map Error": "Map Error", + "Message": "Message", + "Move map to select destination": "Move map to select destination", + "Move map to set start location": "Move map to set start location", + "Move map to set stop": "Move map to set stop", + "Move map to your home location": "Move map to your home location", + "Move map to your pickup point": "Move map to your pickup point", + "Move map to your work location": "Move map to your work location", + "N/A": "N/A", + "No Notifications": "No Notifications", + "No Recordings Found": "No Recordings Found", + "No Rides now!": "No Rides now!", + "No contacts available": "No contacts available", + "No i want": "No i want", + "No notification data found.": "No notification data found.", + "No routes available for this destination.": + "No routes available for this destination.", + "No user found": "No user found", + "No,I want": "No,I want", + "No.Iwant Cancel Trip.": "No.Iwant Cancel Trip.", + "Now move the map to your pickup point": + "Now move the map to your pickup point", + "Now set the pickup point for the other person": + "Now set the pickup point for the other person", + "On Trip": "On Trip", + "Open": "Open", + "Open destination search": "Open destination search", + "Open in Google Maps": "Open in Google Maps", + "Order VIP Canceld": "Order VIP Canceld", + "Passenger": "Passenger", + "Passenger cancel order": "Passenger cancel order", + "Pay by MTN Wallet": "Pay by MTN Wallet", + "Pay by Sham Cash": "Pay by Sham Cash", + "Pay by Syriatel Wallet": "Pay by Syriatel Wallet", + "Pay with PayPal": "Pay with PayPal", + "Phone": "Phone", + "Phone Number": "Phone Number", + "Phone Number Check": "Phone Number Check", + "Phone number seems too short": "Phone number seems too short", + "Phone verified. Please complete registration.": + "Phone verified. Please complete registration.", + "Pick destination on map": "Pick destination on map", + "Pick location on map": "Pick location on map", + "Pick on map": "Pick on map", + "Pick start point on map": "Pick start point on map", + "Plan Your Route": "Plan Your Route", + "Please add contacts to your phone.": + "Please add contacts to your phone.", + "Please check your internet and try again.": + "Please check your internet and try again.", + "Please enter a valid email.": "Please enter a valid email.", + "Please enter a valid phone number.": + "Please enter a valid phone number.", + "Please enter the number without the leading 0": + "Please enter the number without the leading 0", + "Please enter your phone number": "Please enter your phone number", + "Please go to Car now": "Please go to Car now", + "Please select a reason first": "Please select a reason first", + "Please set a valid SOS phone number.": + "Please set a valid SOS phone number.", + "Please slow down": "Please slow down", + "Please wait while we prepare your trip.": + "Please wait while we prepare your trip.", + "Preferences": "Preferences", + "Profile photo updated": "Profile photo updated", + "Quick Message": "Quick Message", + "Rating is": "Rating is", + "Received empty route data.": "Received empty route data.", + "Record": "Record", + "Record your trips to see them here.": + "Record your trips to see them here.", + "Rejected Orders Count": "Rejected Orders Count", + "Remove waypoint": "Remove waypoint", + "Report": "Report", + "Route and prices have been calculated successfully!": + "Route and prices have been calculated successfully!", + "SOS": "SOS", + "Save": "Save", + "Save Changes": "Save Changes", + "Save Name": "Save Name", + "Search country": "Search country", + "Search for a starting point": "Search for a starting point", + "Select Appearance": "Select Appearance", + "Select Education": "Select Education", + "Select Gender": "Select Gender", + "Select This Ride": "Select This Ride", + "Select betweeen types": "Select betweeen types", + "Send Email": "Send Email", + "Send SOS": "Send SOS", + "Send WhatsApp Message": "Send WhatsApp Message", + "Server Error": "Server Error", + "Server error": "Server error", + "Server error. Please try again.": "Server error. Please try again.", + "Set Destination": "Set Destination", + "Set Phone Number": "Set Phone Number", + "Set as Home": "Set as Home", + "Set as Stop": "Set as Stop", + "Set as Work": "Set as Work", + "Share": "Share", + "Share Trip": "Share Trip", + "Share your experience to help us improve...": + "Share your experience to help us improve...", + "Something went wrong. Please try again.": + "Something went wrong. Please try again.", + "Speaking...": "Speaking...", + "Speed Over": "Speed Over", + "Start Point": "Start Point", + "Stay calm. We are here to help.": "Stay calm. We are here to help.", + "Stop": "Stop", + "Submit Rating": "Submit Rating", + "Support & Info": "Support & Info", + "System Default": "System Default", + "Take a Photo": "Take a Photo", + "Tap to apply your discount": "Tap to apply your discount", + "Tap to search your destination": "Tap to search your destination", + "The driver cancelled the trip.": "The driver cancelled the trip.", + "This action cannot be undone.": "This action cannot be undone.", + "This action is permanent and cannot be undone.": + "This action is permanent and cannot be undone.", + "This is for delivery or a motorcycle.": + "This is for delivery or a motorcycle.", + "Time": "Time", + "To :": "To :", + "Top up Balance": "Top up Balance", + "Top up Balance to continue": "Top up Balance to continue", + "Total Invites": "Total Invites", + "Total Price": "Total Price", + "Trip booked successfully": "Trip booked successfully", + "Type your message...": "Type your message...", + "Unknown Location": "Unknown Location", + "Update Name": "Update Name", + "Verified Passenger": "Verified Passenger", + "View Map": "View Map", + "Wait for the trip to start first": + "Wait for the trip to start first", + "Waiting...": "Waiting...", + "Warning": "Warning", + "Waypoint has been set successfully": + "Waypoint has been set successfully", + "We use location to get accurate and nearest driver for you": + "We use location to get accurate and nearest driver for you", + "WhatsApp": "WhatsApp", + "Why do you want to cancel?": "Why do you want to cancel?", + "Yes": "Yes", + "You should ideintify your gender for this type of trip!": + "You should ideintify your gender for this type of trip!", + "You will choose one of above!": "You will choose one of above!", + "Your Rewards": "Your Rewards", + "Your complaint has been submitted.": + "Your complaint has been submitted.", + "and acknowledge our Privacy Policy.": + "and acknowledge our Privacy Policy.", + "as the driver.": "as the driver.", + "cancelled": "cancelled", + "due to a previous trip.": "due to a previous trip.", + "insert sos phone": "insert sos phone", + "is driving a": "is driving a", + "min added to fare": "min added to fare", + "phone not verified": "phone not verified", + "to arrive you.": "to arrive you.", + "unknown": "unknown", + "wait 1 minute to recive message": "wait 1 minute to recive message", + "with license plate": "with license plate", + "witout zero": "witout zero", + "you must insert token code": "you must insert token code", + "Syria": "Suriye", + "SYP": "SYP", + "Order": "Sipariş", + "OrderVIP": "VIP Sipariş", + "Cancel Trip": "Yolculuğu İptal Et", + "Passenger Cancel Trip": "Yolcu Yolculuğu İptal Etti", + "VIP Order": "VIP Sipariş", + "The driver accepted your trip": "Sürücü yolculuğunu kabul etti", + "message From passenger": "Yolcumuzdan mesaj", + "Cancel": "İptal", + "Trip Cancelled. The cost of the trip will be added to your wallet.": + "Yolculuk iptal edildi. Ücret cüzdanınıza eklenecektir.", + "token change": "Token değişikliği", + "Changed my mind": "Fikrimi değiştirdim", + "Please write the reason...": "Lütfen nedeni yazın...", + "Found another transport": "Başka bir ulaşım aracı buldum", + "Driver is taking too long": "Sürücü çok uzun sürüyor", + "Driver asked me to cancel": "Sürücü iptal etmemi istedi", + "Wrong pickup location": "Yanlış alış noktası", + "Other": "Diğer", + "Don't Cancel": "İptal Etme", + "No Drivers Found": "Sürücü Bulunamadı", + "Sorry, there are no cars available of this type right now.": + "Üzgünüz, şu an bu tipte uygun araç yok.", + "Refresh Map": "Haritayı Yenile", + "face detect": "Yüz Algılama", + "Face Detection Result": "Yüz Algılama Sonucu", + "similar": "Benzer", + "not similar": "Benzer Değil", + "Searching for nearby drivers...": "Yakındaki sürücüler aranıyor...", + "Error": "Hata", + "Failed to search, please try again later": + "Arama başarısız oldu, lütfen daha sonra tekrar deneyin", + "Connection Error": "Bağlantı Hatası", + "Please check your internet connection": + "Lütfen internet bağlantınızı kontrol edin", + "Sorry 😔": "Üzgünüz 😔", + "The driver cancelled the trip for an emergency reason.\nDo you want to search for another driver immediately?": + "Sürücü yolculuğu acil bir nedenle iptal etti.\nHemen başka bir sürücü aramak ister misiniz?", + "Search for another driver": "Başka sürücü ara", + "We apologize 😔": "Özür dileriz 😔", + "No drivers found at the moment.\nPlease try again later.": + "Şu anda sürücü bulunamadı.\nLütfen daha sonra tekrar deneyin.", + "Hi ,I will go now": "Selam, şimdi yola çıkıyorum", + "Passenger come to you": "Yolcu size geliyor", + "Call Income": "Gelen Arama", + "Call Income from Passenger": "Yolcumuzdan Gelen Arama", + "Criminal Document Required": "Adli Sicil Kaydı Gerekli", + "You should have upload it .": "Bunu yüklemeniz gerekiyor.", + "Call End": "Arama Sonlandı", + "The order has been accepted by another driver.": + "Sipariş başka bir sürücü tarafından kabul edildi.", + "The order Accepted by another Driver": + "Sipariş Başka Sürücü Tarafından Kabul Edildi", + "We regret to inform you that another driver has accepted this order.": + "Üzgünüz, bu siparişi başka bir sürücü kabul etti.", + "Driver Applied the Ride for You": + "Sürücü Sizin İçin Yolculuk Başlattı", + "Applied": "Başvuruldu", + "Please go to Car Driver": "Lütfen Sürücüye Gidin", + "Ok I will go now.": "Tamam, şimdi gidiyorum.", + "Accepted Ride": "Kabul Edilen Yolculuk", + "Driver Accepted the Ride for You": + "Sürücü Sizin İçin Yolculuğu Kabul Etti", + "Promo": "Promosyon", + "Show latest promo": "Son promosyonları göster", + "Trip Monitoring": "Yolculuk Takibi", + "Driver Is Going To Passenger": "Sürücü Yolcuya Gidiyor", + "Please stay on the picked point.": + "Lütfen seçilen noktada bekleyin.", + "message From Driver": "Sürücüden Mesaj", + "Trip is Begin": "Yolculuk Başlıyor", + "Cancel Trip from driver": "Sürücü tarafından iptal", + "We will look for a new driver.\nPlease wait.": + "Yeni bir sürücü arıyoruz.\nLütfen bekleyin.", + "The driver canceled your ride.": "Sürücü yolculuğunuzu iptal etti.", + "Driver Finish Trip": "Sürücü Yolculuğu Bitirdi", + "you will pay to Driver": "Sürücüye ödeyeceksiniz", + "Don’t forget your personal belongings.": "Eşyalarınızı unutmayın.", + "Please make sure you have all your personal belongings and that any remaining fare, if applicable, has been added to your wallet before leaving. Thank you for choosing the Intaleq app": + "Lütfen eşyalarınızı kontrol edin ve kalan ücretin cüzdanınıza eklendiğinden emin olun. Teşekkürler.", + "Finish Monitor": "İzlemeyi Bitir", + "Trip finished": "Yolculuk bitti", + "Call Income from Driver": "Sürücüden Gelen Arama", + "Driver Cancelled Your Trip": "Sürücü Yolculuğunuzu İptal Etti", + "you will pay to Driver you will be pay the cost of driver time look to your Intaleq Wallet": + "Sürücünün zaman maliyetini ödeyeceksiniz, Intaleq Cüzdanınıza bakın", + "Order Applied": "Sipariş Alındı", + "welcome to intaleq": "Intaleq'e Hoş Geldiniz", + "login or register subtitle": + "Giriş yapmak veya kayıt olmak için numaranızı girin", + "Complaint cannot be filed for this ride. It may not have been completed or started.": + "Bu yolculuk için şikayet oluşturulamaz. Tamamlanmamış veya başlamamış olabilir.", + "phone number label": "Telefon Numarası", + "phone number required": "Telefon numarası gerekli", + "send otp button": "Doğrulama Kodu Gönder", + "verify your number title": "Numaranızı Doğrulayın", + "otp sent subtitle": "5 haneli kod şuraya gönderildi:\n@phoneNumber", + "verify and continue button": "Doğrula ve Devam Et", + "enter otp validation": "Lütfen 5 haneli doğrulama kodunu girin", + "one last step title": "Son bir adım", + "complete profile subtitle": "Başlamak için profilinizi tamamlayın", + "first name label": "Ad", + "first name required": "Ad gerekli", + "last name label": "Soyad", + "Verify OTP": "Kodu Doğrula", + "Verification Code": "Doğrulama Kodu", + "We have sent a verification code to your mobile number:": + "Cep telefonu numaranıza bir doğrulama kodu gönderdik:", + "Verify": "Doğrula", + "Resend Code": "Kodu Tekrar Gönder", + "You can resend in": "Tekrar gönderim süresi:", + "seconds": "saniye", + "Please enter the complete 6-digit code.": + "Lütfen 6 haneli kodu eksiksiz girin.", + "last name required": "Soyad gerekli", + "email optional label": "E-posta (İsteğe Bağlı)", + "complete registration button": "Kaydı Tamamla", + "User with this phone number or email already exists.": + "Bu telefon veya e-posta ile kayıtlı bir kullanıcı zaten var.", + "otp sent success": "Kod WhatsApp'a başarıyla gönderildi.", + "failed to send otp": "Kod gönderilemedi.", + "server error try again": "Sunucu hatası, tekrar deneyin.", + "an error occurred": "Bir hata oluştu: @error", + "otp verification failed": "Kod doğrulaması başarısız.", + "registration failed": "Kayıt başarısız.", + "welcome user": "Hoş geldin, @firstName!", + "Don't forget your personal belongings.": + "Kişisel eşyalarınızı unutmayın.", + "Share App": "Uygulamayı Paylaş", + "Wallet": "Cüzdan", + "Balance": "Bakiye", + "Profile": "Profil", + "Contact Support": "Destekle İletişime Geç", + "Session expired. Please log in again.": + "Oturum süresi doldu. Lütfen tekrar giriş yapın.", + "Security Warning": "⚠️ Güvenlik Uyarısı", + "Potential security risks detected. The application may not function correctly.": + "Potansiyel güvenlik riski algılandı. Uygulama düzgün çalışmayabilir.", + "please order now": "Şimdi sipariş ver", + "Where to": "Nereye?", + "Where are you going?": "Nereye gidiyorsunuz?", + "Quick Actions": "Hızlı İşlemler", + "My Balance": "Bakiyem", + "Order History": "Sipariş Geçmişi", + "Contact Us": "Bize Ulaşın", + "Driver": "Sürücü", + "Complaint": "Şikayet", + "Promos": "Promosyonlar", + "Recent Places": "Son Gidilen Yerler", + "From": "Nereden", + "WhatsApp Location Extractor": "WhatsApp Konum Çıkarıcı", + "Location Link": "Konum Linki", + "Paste location link here": "Konum linkini buraya yapıştırın", + "Go to this location": "Bu konuma git", + "Paste WhatsApp location link": "WhatsApp konum linkini yapıştır", + "Select Order Type": "Sipariş Türünü Seç", + "Choose who this order is for": "Bu sipariş kimin için?", + "I want to order for myself": "Kendim için", + "I want to order for someone else": "Başka biri için", + "Order for someone else": "Başkası için sipariş ver", + "Order for myself": "Kendim için sipariş ver", + "Are you want to go this site": "Bu konuma gitmek istiyor musunuz?", + "No": "Hayır", + "Intaleq Wallet": "Intaleq Cüzdan", + "Have a promo code?": "Promosyon kodunuz var mı?", + "Your Wallet balance is ": "Cüzdan bakiyeniz: ", + "Cash": "Nakit", + "Pay directly to the captain": "Doğrudan Kaptana öde", + "Top up Wallet to continue": "Devam etmek için Cüzdanı doldur", + "Or pay with Cash instead": "Veya Nakit öde", + "Confirm & Find a Ride": "Onayla & Araç Bul", + "Balance:": "Bakiye:", + "Alerts": "Uyarılar", + "Welcome Back!": "Tekrar Hoş Geldiniz!", + "Current Balance": "Güncel Bakiye", + "Set Wallet Phone Number": "Cüzdan Numarası Ayarla", + "Link a phone number for transfers": "Transferler için numara bağla", + "Payment History": "Ödeme Geçmişi", + "View your past transactions": "Geçmiş işlemleri görüntüle", + "Top up Wallet": "Cüzdanı Doldur", + "Add funds using our secure methods": + "Güvenli yöntemlerle bakiye ekle", + "Increase Fare": "Ücreti Artır", + "No drivers accepted your request yet": + "Henüz hiçbir sürücü isteğinizi kabul etmedi", + "Increasing the fare might attract more drivers. Would you like to increase the price?": + "Ücreti artırmak daha fazla sürücü çekebilir. Fiyatı artırmak ister misiniz?", + "Please make sure not to leave any personal belongings in the car.": + "Lütfen araçta kişisel eşya bırakmadığınızdan emin olun.", + "Cancel Ride": "Yolculuğu İptal Et", + "Route Not Found": "Rota Bulunamadı", + "We couldn't find a valid route to this destination. Please try selecting a different point.": + "Bu hedefe geçerli bir rota bulamadık. Lütfen farklı bir nokta seçin.", + "You can call or record audio during this trip.": + "Bu yolculuk sırasında arama yapabilir veya ses kaydedebilirsiniz.", + "Warning: Speeding detected!": "Uyarı: Hız sınırı aşıldı!", + "Comfort": "Konfor", + "Intaleq Balance": "Intaleq Bakiyesi", + "Electric": "Elektrikli", + "Lady": "Kadın", + "Van": "Geniş Araç", + "Rayeh Gai": "Gidiş-Dönüş", + "Join Intaleq as a driver using my referral code!": + "Referans kodumla Intaleq sürücüsü ol!", + "Use code:": "Kodu kullan:", + "Download the Intaleq Driver app now and earn rewards!": + "Intaleq Sürücü uygulamasını indir ve kazan!", + "Get a discount on your first Intaleq ride!": + "İlk Intaleq yolculuğunda indirim kazan!", + "Use my referral code:": "Referans kodumu kullan:", + "Download the Intaleq app now and enjoy your ride!": + "Intaleq uygulamasını indir ve yolculuğun tadını çıkar!", + "Contacts Loaded": "Kişiler Yüklendi", + "Showing": "Gösteriliyor", + "of": "/", + "Customer not found": "Müşteri bulunamadı", + "Wallet is blocked": "Cüzdan bloke edildi", + "Customer phone is not active": "Müşteri telefonu aktif değil", + "Balance not enough": "Bakiye yetersiz", + "Balance limit exceeded": "Bakiye limiti aşıldı", + "Incorrect sms code": "⚠️ Hatalı SMS kodu. Lütfen tekrar deneyin.", + "contacts. Others were hidden because they don't have a phone number.": + "kişi. Diğerleri numarası olmadığı için gizlendi.", + "No contacts found": "Kişi bulunamadı", + "No contacts with phone numbers were found on your device.": + "Cihazınızda telefon numarası olan kişi bulunamadı.", + "Permission denied": "İzin reddedildi", + "Contact permission is required to pick contacts": + "Kişileri seçmek için rehber izni gerekli.", + "An error occurred while picking contacts:": + "Kişi seçilirken hata oluştu:", + "Please enter a correct phone": "Lütfen geçerli bir telefon girin", + "Success": "Başarılı", + "Invite sent successfully": "Davet başarıyla gönderildi", + "Hello! I'm inviting you to try Intaleq.": + "Merhaba! Seni Intaleq'i denemeye davet ediyorum.", + "Use my invitation code to get a special gift on your first ride!": + "İlk yolculuğunda özel hediye için davet kodumu kullan!", + "Your personal invitation code is:": "Kişisel davet kodun:", + "Be sure to use it quickly! This code expires at": + "Hızlı kullan! Kodun son kullanma tarihi:", + "Download the app now:": "Uygulamayı hemen indir:", + "See you on the road!": "Yollarda görüşmek üzere!", + "This phone number has already been invited.": + "Bu numara zaten davet edilmiş.", + "An unexpected error occurred. Please try again.": + "Beklenmedik bir hata oluştu. Lütfen tekrar deneyin.", + "You deserve the gift": "Hediyeyi hak ettiniz", + "Claim your 20 LE gift for inviting": "Davet için 20 TL hediyeni al", + "You have got a gift for invitation": "Davet için hediye kazandınız", + "You have earned 20": "20 kazandınız", + "LE": "TL", + "Vibration feedback for all buttons": + "Tüm butonlar için titreşim geri bildirimi", + "Share with friends and earn rewards": + "Arkadaşlarınla paylaş ve ödül kazan", + "Gift Already Claimed": "Hediye Zaten Alındı", + "You have already received your gift for inviting": + "Davet hediyenizi zaten aldınız", + "Keep it up!": "Böyle devam et!", + "has completed": "tamamladı", + "trips": "yolculuk", + "Personal Information": "Kişisel Bilgiler", + "Name": "Ad", + "Not set": "Ayarlanmadı", + "Gender": "Cinsiyet", + "Education": "Eğitim", + "Work & Contact": "İş & İletişim", + "Employment Type": "İstihdam Türü", + "Marital Status": "Medeni Durum", + "SOS Phone": "Acil Durum Telefonu", + "Sign Out": "Çıkış Yap", + "Delete My Account": "Hesabımı Sil", + "Update Gender": "Cinsiyeti Güncelle", + "Update": "Güncelle", + "Update Education": "Eğitimi Güncelle", + "Are you sure? This action cannot be undone.": + "Emin misiniz? Bu işlem geri alınamaz.", + "Confirm your Email": "E-postanızı Onaylayın", + "Type your Email": "E-postanızı Yazın", + "Delete Permanently": "Kalıcı Olarak Sil", + "Male": "Erkek", + "Female": "Kadın", + "High School Diploma": "Lise Diploması", + "Associate Degree": "Önlisans", + "Bachelor's Degree": "Lisans", + "Master's Degree": "Yüksek Lisans", + "Doctoral Degree": "Doktora", + "Select your preferred language for the app interface.": + "Uygulama arayüzü için dil seçin.", + "Language Options": "Dil Seçenekleri", + "You can claim your gift once they complete 2 trips.": + "Onlar 2 yolculuk tamamlayınca hediyeni alabilirsin.", + "Closest & Cheapest": "En Yakın & En Ucuz", + "Comfort choice": "Konfor seçimi", + "Travel in a modern, silent electric car. A premium, eco-friendly choice for a smooth ride.": + "Modern, sessiz elektrikli araçla seyahat edin. Pürüzsüz bir yolculuk için premium, çevre dostu seçim.", + "Spacious van service ideal for families and groups. Comfortable, safe, and cost-effective travel together.": + "Aileler ve gruplar için ideal geniş araç hizmeti. Rahat, güvenli ve ekonomik.", + "Quiet & Eco-Friendly": "Sessiz & Çevre Dostu", + "Lady Captain for girls": "Kadınlar için Kadın Sürücü", + "Van for familly": "Aile için Geniş Araç", + "Are you sure to delete this location?": + "Bu konumu silmek istediğinize emin misiniz?", + "Submit a Complaint": "Şikayet Gönder", + "Submit Complaint": "Şikayeti Gönder", + "No trip history found": "Yolculuk geçmişi bulunamadı", + "Your past trips will appear here.": + "Geçmiş yolculuklarınız burada görünecek.", + "1. Describe Your Issue": "1. Sorununuzu Açıklayın", + "Enter your complaint here...": "Şikayetinizi buraya girin...", + "2. Attach Recorded Audio": "2. Kayıtlı Ses Dosyası Ekle", + "No audio files found.": "Ses dosyası bulunamadı.", + "Confirm Attachment": "Eki Onayla", + "Attach this audio file?": "Bu ses dosyasını ekle?", + "Uploaded": "Yüklendi", + "3. Review Details & Response": "3. Detayları ve Yanıtı İncele", + "Date": "Tarih", + "Today's Promos": "Günün Fırsatları", + "No promos available right now.": "Şu an uygun promosyon yok.", + "Check back later for new offers!": + "Yeni teklifler için sonra tekrar kontrol et!", + "Valid Until:": "Son Geçerlilik:", + "CODE": "KOD", + "I Agree": "Kabul Ediyorum", + "Continue": "Devam Et", + "Enable Location": "Konumu Etkinleştir", + "To give you the best experience, we need to know where you are. Your location is used to find nearby captains and for pickups.": + "Size en iyi deneyimi sunmak için nerede olduğunuzu bilmemiz gerek. Konumunuz yakın sürücüleri bulmak için kullanılır.", + "Allow Location Access": "Konum Erişimine İzin Ver", + "Welcome to Intaleq!": "Intaleq'e Hoş Geldiniz!", + "Before we start, please review our terms.": + "Başlamadan önce lütfen şartlarımızı inceleyin.", + "Your journey starts here": "Yolculuğunuz burada başlıyor", + "Cancel Search": "Aramayı İptal Et", + "Set pickup location": "Alım noktasını ayarla", + "Move the map to adjust the pin": + "İğneyi ayarlamak için haritayı kaydırın", + "Searching for the nearest captain...": "En yakın kaptan aranıyor...", + "No one accepted? Try increasing the fare.": + "Kimse kabul etmedi mi? Ücreti artırmayı deneyin.", + "Increase Your Trip Fee (Optional)": + "Yolculuk Ücretini Artır (İsteğe Bağlı)", + "We haven't found any drivers yet. Consider increasing your trip fee to make your offer more attractive to drivers.": + "Henüz sürücü bulunamadı. Teklifinizi daha cazip hale getirmek için ücreti artırmayı düşünün.", + "No, thanks": "Hayır, teşekkürler", + "Increase Fee": "Ücreti Artır", + "Copy": "Kopyala", + "Promo Copied!": "Promosyon Kopyalandı!", + "Code": "Kod", + "Send Intaleq app to him": "Ona Intaleq uygulamasını gönder", + "No passenger found for the given phone number": + "Verilen numara için yolcu bulunamadı", + "No user found for the given phone number": + "Verilen numara için kullanıcı bulunamadı", + "This price is": "Bu fiyat:", + "Work": "İş", + "Add Home": "Ev Ekle", + "Notifications": "Bildirimler", + "💳 Pay with Credit Card": "💳 Kredi Kartı ile Öde", + "⚠️ You need to choose an amount!": "⚠️ Bir tutar seçmelisiniz!", + "💰 Pay with Wallet": "💰 Cüzdan ile Öde", + "You must restart the app to change the language.": + "Dili değiştirmek için uygulamayı yeniden başlatmalısınız.", + "joined": "katıldı", + "Driver joined the channel": "Sürücü kanala katıldı", + "Driver left the channel": "Sürücü kanaldan ayrıldı", + "Call Page": "Arama Sayfası", + "Call Left": "Kalan Arama", + " Next as Cash !": " Sonraki Nakit!", + "To use Wallet charge it": "Cüzdanı kullanmak için yükleme yapın", + "We are searching for the nearest driver to you": + "Size en yakın sürücüyü arıyoruz", + "Best choice for cities": "Şehirler için en iyi seçim", + "Rayeh Gai: Round trip service for convenient travel between cities, easy and reliable.": + "Gidiş-Dönüş: Şehirler arası rahat seyahat için kolay ve güvenilir hizmet.", + "This trip is for women only": "Bu yolculuk sadece kadınlar içindir", + "Total budgets on month": "Aylık toplam bütçe", + "You have call from driver": "Sürücüden aramanız var", + "Intaleq": "Intaleq", + "passenger agreement": "yolcu sözleşmesi", + "To become a passenger, you must review and agree to the ": + "Yolcu olmak için şunları inceleyip kabul etmelisiniz: ", + "agreement subtitle": + "Devam etmek için Kullanım Şartları ve Gizlilik Politikasını kabul etmelisiniz.", + "terms of use": "kullanım şartları", + " and acknowledge our Privacy Policy.": + " ve Gizlilik Politikamızı kabul edin.", + "and acknowledge our": "ve şunu kabul edin:", + "privacy policy": "gizlilik politikası.", + "i agree": "kabul ediyorum", + "Driver already has 2 trips within the specified period.": + "Sürücünün belirtilen sürede zaten 2 yolculuğu var.", + "The invitation was sent successfully": "Davet başarıyla gönderildi", + "You should select your country": "Ülkenizi seçmelisiniz", + "Scooter": "Scooter", + "A trip with a prior reservation, allowing you to choose the best captains and cars.": + "Ön rezervasyonlu yolculuk, en iyi kaptanları ve araçları seçmenize olanak tanır.", + "Mishwar Vip": "Mishwar VIP", + "The driver waiting you in picked location .": + "Sürücü sizi seçilen konumda bekliyor.", + "About Us": "Hakkımızda", + "You can change the vibration feedback for all buttons": + "Tüm butonlar için titreşimi değiştirebilirsiniz", + "Most Secure Methods": "En Güvenli Yöntemler", + "In-App VOIP Calls": "Uygulama İçi VOIP Aramalar", + "Recorded Trips for Safety": "Güvenlik İçin Kaydedilen Yolculuklar", + "\nWe also prioritize affordability, offering competitive pricing to make your rides accessible.": + "\nAyrıca uygun fiyat önceliğimizdir, rekabetçi fiyatlarla yolculuğu erişilebilir kılıyoruz.", + "Intaleq is a ride-sharing app designed with your safety and affordability in mind. We connect you with reliable drivers in your area, ensuring a convenient and stress-free travel experience.\n\nHere are some of the key features that set us apart:": + "Intaleq, güvenliğiniz ve bütçeniz düşünülerek tasarlanmış bir araç paylaşım uygulamasıdır. Sizi bölgenizdeki güvenilir sürücülerle buluşturuyoruz.", + "Sign In by Apple": "Apple ile Giriş Yap", + "Sign In by Google": "Google ile Giriş Yap", + "How do I request a ride?": "Nasıl yolculuk isterim?", + "Step-by-step instructions on how to request a ride through the Intaleq app.": + "Intaleq uygulaması üzerinden yolculuk isteme adımları.", + "What types of vehicles are available?": "Hangi araç türleri mevcut?", + "Intaleq offers a variety of vehicle options to suit your needs, including economy, comfort, and luxury. Choose the option that best fits your budget and passenger count.": + "Intaleq ihtiyaçlarınıza uygun ekonomi, konfor ve lüks dahil çeşitli araç seçenekleri sunar.", + "How can I pay for my ride?": "Yolculuğumu nasıl öderim?", + "Intaleq offers multiple payment methods for your convenience. Choose between cash payment or credit/debit card payment during ride confirmation.": + "Intaleq nakit veya kredi/banka kartı ile ödeme seçenekleri sunar.", + "Can I cancel my ride?": "Yolculuğumu iptal edebilir miyim?", + "Yes, you can cancel your ride under certain conditions (e.g., before driver is assigned). See the Intaleq cancellation policy for details.": + "Evet, belirli koşullar altında (örneğin sürücü atanmadan önce) yolculuğunuzu iptal edebilirsiniz. Ayrıntılar için Intaleq iptal politikasına bakın.", + "Driver Registration & Requirements": "Sürücü Kaydı & Gereksinimler", + "How can I register as a driver?": + "Sürücü olarak nasıl kayıt olurum?", + "What are the requirements to become a driver?": + "Sürücü olma şartları nelerdir?", + "Visit our website or contact Intaleq support for information on driver registration and requirements.": + "Bilgi için web sitemizi ziyaret edin veya destek ile iletişime geçin.", + "Intaleq provides in-app chat functionality to allow you to communicate with your driver or passenger during your ride.": + "Intaleq, yolculuk sırasında iletişim kurmanız için uygulama içi sohbet sunar.", + "Intaleq prioritizes your safety. We offer features like driver verification, in-app trip tracking, and emergency contact options.": + "Intaleq güvenliğinizi önceler. Sürücü doğrulama, takip ve acil durum seçenekleri sunar.", + "Frequently Questions": "Sıkça Sorulan Sorular", + "User does not exist.": "Kullanıcı mevcut değil.", + "We need your phone number to contact you and to help you.": + "Size ulaşmak ve yardım etmek için numaranıza ihtiyacımız var.", + "You will recieve code in sms message": "Kodu SMS ile alacaksınız", + "Please enter": "Lütfen girin", + "We need your phone number to contact you and to help you receive orders.": + "Sipariş alabilmeniz ve iletişim için numaranıza ihtiyacımız var.", + "The full name on your criminal record does not match the one on your driver's license. Please verify and provide the correct documents.": + "Adli sicil kaydındaki isim ehliyetinizle eşleşmiyor. Lütfen doğrulayın.", + "The national number on your driver's license does not match the one on your ID document. Please verify and provide the correct documents.": + "Ehliyetinizdeki T.C. kimlik no kimliğinizle eşleşmiyor.", + "Capture an Image of Your Criminal Record": + "Adli Sicil Kaydınızın Fotoğrafını Çekin", + "IssueDate": "Veriliş Tarihi", + "Capture an Image of Your car license front": + "Ruhsatınızın Ön Yüzünün Fotoğrafını Çekin", + "Capture an Image of Your ID Document front": + "Kimliğinizin Ön Yüzünün Fotoğrafını Çekin", + "NationalID": "T.C. Kimlik No", + "You can share the Intaleq App with your friends and earn rewards for rides they take using your code": + "Uygulamayı paylaşın ve kodunuzla yapılan yolculuklardan ödül kazanın.", + "FullName": "Tam Ad", + "No invitation found yet!": "Henüz davet bulunamadı!", + "InspectionResult": "Muayene Sonucu", + "Criminal Record": "Adli Sicil Kaydı", + "The email or phone number is already registered.": + "E-posta veya telefon numarası zaten kayıtlı.", + "To become a ride-sharing driver on the Intaleq app, you need to upload your driver's license, ID document, and car registration document. Our AI system will instantly review and verify their authenticity in just 2-3 minutes. If your documents are approved, you can start working as a driver on the Intaleq app. Please note, submitting fraudulent documents is a serious offense and may result in immediate termination and legal consequences.": + "Sürücü olmak için ehliyet, kimlik ve ruhsatınızı yüklemelisiniz. Yapay zekamız 2-3 dakikada doğrular. Sahte belge yüklemek yasal sonuçlar doğurur.", + "Documents check": "Belge Kontrolü", + "Driver's License": "Sürücü Belgesi (Ehliyet)", + "for your first registration!": "ilk kaydınız için!", + "Get it Now!": "Hemen Al!", + "before": "önce", + "Code not approved": "Kod onaylanmadı", + "3000 LE": "3000 TL", + "Do you have an invitation code from another driver?": + "Başka bir sürücüden davet kodunuz var mı?", + "Paste the code here": "Kodu buraya yapıştır", + "No, I don't have a code": "Hayır, kodum yok", + "Audio uploaded successfully.": "Ses başarıyla yüklendi.", + "Perfect for passengers seeking the latest car models with the freedom to choose any route they desire": + "En yeni model araçlar ve rota özgürlüğü isteyen yolcular için mükemmel", + "Share this code with your friends and earn rewards when they use it!": + "Bu kodu arkadaşlarınla paylaş ve kullandıklarında ödül kazan!", + "Enter phone": "Telefon gir", + "complete, you can claim your gift": + "tamamlandı, hediyeni alabilirsin", + "When": "Ne zaman", + "Enter driver's phone": "Sürücü telefonunu gir", + "Send Invite": "Davet Gönder", + "Show Invitations": "Davetleri Göster", + "License Type": "Ehliyet Sınıfı", + "National Number": "T.C. Kimlik No", + "Name (Arabic)": "Ad (Arapça)", + "Name (English)": "Ad (İngilizce)", + "Address": "Adres", + "Issue Date": "Veriliş Tarihi", + "Expiry Date": "Geçerlilik Tarihi", + "License Categories": "Ehliyet Kategorileri", + "driver_license": "ehliyet", + "Capture an Image of Your Driver License": + "Ehliyetinizin Fotoğrafını Çekin", + "ID Documents Back": "Kimlik Arka Yüzü", + "National ID": "T.C. Kimlik", + "Occupation": "Meslek", + "Religion": "Din", + "Full Name (Marital)": "Tam Ad", + "Expiration Date": "Son Kullanma Tarihi", + "Capture an Image of Your ID Document Back": + "Kimliğinizin Arka Yüzünün Fotoğrafını Çekin", + "ID Documents Front": "Kimlik Ön Yüzü", + "First Name": "Ad", + "CardID": "Kart No", + "Vehicle Details Front": "Araç Detayları Ön", + "Plate Number": "Plaka No", + "Owner Name": "Ruhsat Sahibi", + "Vehicle Details Back": "Araç Detayları Arka", + "Make": "Marka", + "Model": "Model", + "Year": "Yıl", + "Chassis": "Şasi No", + "Color": "Renk", + "Displacement": "Motor Hacmi", + "Fuel": "Yakıt", + "Tax Expiry Date": "Vergi Bitiş Tarihi", + "Inspection Date": "Muayene Tarihi", + "Capture an Image of Your car license back": + "Ruhsatınızın Arka Yüzünün Fotoğrafını Çekin", + "Capture an Image of Your Driver's License": + "Ehliyetinizin Fotoğrafını Çekin", + "Sign in with Google for easier email and name entry": + "Daha kolay giriş için Google ile bağlanın", + "You will choose allow all the time to be ready receive orders": + "Sipariş almak için 'Her zaman izin ver'i seçmelisiniz", + "Get to your destination quickly and easily.": + "Hedefinize hızlı ve kolayca ulaşın.", + "Enjoy a safe and comfortable ride.": + "Güvenli ve konforlu bir yolculuğun tadını çıkarın.", + "Choose Language": "Dil Seçin", + "Pay with Wallet": "Cüzdan ile Öde", + "Invalid MPIN": "Geçersiz MPIN", + "Invalid OTP": "Geçersiz Kod", + "Enter your email address": "E-posta adresinizi girin", + "Please enter Your Email.": "Lütfen e-postanızı girin.", + "Enter your phone number": "Telefon numaranızı girin", + "Please enter your phone number.": "Lütfen telefon numaranızı girin.", + "Please enter Your Password.": "Lütfen şifrenizi girin.", + "if you dont have account": "hesabınız yoksa", + "Register": "Kayıt Ol", + "Accept Ride's Terms & Review Privacy Notice": + "Şartları Kabul Et & Gizliliği İncele", + "By selecting 'I Agree' below, I have reviewed and agree to the Terms of Use and acknowledge the Privacy Notice. I am at least 18 years of age.": + "Aşağıdaki 'Kabul Ediyorum' seçeneği ile şartları kabul etmiş ve 18 yaşından büyük olduğumu onaylamış olurum.", + "First name": "Ad", + "Enter your first name": "Adınızı girin", + "Please enter your first name.": "Lütfen adınızı girin.", + "Last name": "Soyad", + "Enter your last name": "Soyadınızı girin", + "Please enter your last name.": "Lütfen soyadınızı girin.", + "City": "Şehir", + "Please enter your City.": "Lütfen Şehrinizi girin.", + "Verify Email": "E-postayı Doğrula", + "We sent 5 digit to your Email provided": + "E-postanıza 5 haneli kod gönderdik", + "5 digit": "5 haneli", + "Send Verification Code": "Doğrulama Kodu Gönder", + "Your Ride Duration is ": "Yolculuk Süreniz: ", + "You will be thier in": "Şu sürede orada olacaksınız:", + "You trip distance is": "Yolculuk mesafesi:", + "Fee is": "Ücret:", + "From : ": "Nereden: ", + "To : ": "Nereye: ", + "Add Promo": "Promosyon Ekle", + "Confirm Selection": "Seçimi Onayla", + "distance is": "mesafe:", + "Privacy Policy": "Gizlilik Politikası", + "Intaleq LLC": "Intaleq Ltd. Şti.", + "Syria's pioneering ride-sharing service, proudly developed by Arabian and local owners. We prioritize being near you – both our valued passengers and our dedicated captains.": + "Türkiye'nin öncü araç paylaşım hizmeti.", + "Intaleq is the first ride-sharing app in Syria, designed to connect you with the nearest drivers for a quick and convenient travel experience.": + "Intaleq, sizi en yakın sürücülerle buluşturan ilk uygulamadır.", + "Why Choose Intaleq?": "Neden Intaleq?", + "Closest to You": "Size En Yakın", + "We connect you with the nearest drivers for faster pickups and quicker journeys.": + "Daha hızlı alım ve yolculuk için sizi en yakın sürücülere bağlıyoruz.", + "Uncompromising Security": "Tavizsiz Güvenlik", + "Lady Captains Available": "Kadın Kaptanlar Mevcut", + "Recorded Trips (Voice & AI Analysis)": + "Kaydedilen Yolculuklar (Ses & YZ Analizi)", + "Fastest Complaint Response": "En Hızlı Şikayet Yanıtı", + "Our dedicated customer service team ensures swift resolution of any issues.": + "Müşteri hizmetleri ekibimiz sorunları hızla çözer.", + "Affordable for Everyone": "Herkes İçin Uygun Fiyatlı", + "Frequently Asked Questions": "Sıkça Sorulan Sorular", + "Getting Started": "Başlarken", + "Simply open the Intaleq app, enter your destination, and tap \"Request Ride\". The app will connect you with a nearby driver.": + "Uygulamayı açın, hedefi girin ve \"Yolculuk İste\"ye dokunun.", + "Vehicle Options": "Araç Seçenekleri", + "Intaleq offers a variety of options including Economy, Comfort, and Luxury to suit your needs and budget.": + "Intaleq; Ekonomi, Konfor ve Lüks gibi çeşitli seçenekler sunar.", + "Payments": "Ödemeler", + "You can pay for your ride using cash or credit/debit card. You can select your preferred payment method before confirming your ride.": + "Nakit veya kartla ödeyebilirsiniz. Onaylamadan önce yöntemi seçin.", + "Ride Management": "Yolculuk Yönetimi", + "Yes, you can cancel your ride, but please note that cancellation fees may apply depending on how far in advance you cancel.": + "Evet, iptal edebilirsiniz ancak iptal ücreti uygulanabilir.", + "For Drivers": "Sürücüler İçin", + "Driver Registration": "Sürücü Kaydı", + "To register as a driver or learn about the requirements, please visit our website or contact Intaleq support directly.": + "Sürücü olmak için web sitemizi ziyaret edin veya destekle görüşün.", + "Visit Website/Contact Support": + "Web Sitesini Ziyaret Et/Desteğe Ulaş", + "Close": "Kapat", + "We are searching for the nearest driver": + "En yakın sürücüyü arıyoruz", + "Communication": "İletişim", + "How do I communicate with the other party (passenger/driver)?": + "Diğer taraf (yolcu/sürücü) ile nasıl iletişim kurarım?", + "You can communicate with your driver or passenger through the in-app chat feature once a ride is confirmed.": + "Yolculuk onaylandığında uygulama içi sohbeti kullanabilirsiniz.", + "Safety & Security": "Güvenlik & Emniyet", + "What safety measures does Intaleq offer?": + "Intaleq hangi güvenlik önlemlerini sunuyor?", + "Intaleq offers various safety features including driver verification, in-app trip tracking, emergency contact options, and the ability to share your trip status with trusted contacts.": + "Sürücü doğrulama, yolculuk takibi ve acil durum kişileri gibi özellikler sunuyoruz.", + "Enjoy competitive prices across all trip options, making travel accessible.": + "Tüm seçeneklerde rekabetçi fiyatların tadını çıkarın.", + "Variety of Trip Choices": "Yolculuk Seçeneği Çeşitliliği", + "Choose the trip option that perfectly suits your needs and preferences.": + "İhtiyaçlarınıza mükemmel uyan seçeneği tercih edin.", + "Your Choice, Our Priority": "Sizin Seçiminiz, Bizim Önceliğimiz", + "Because we are near, you have the flexibility to choose the ride that works best for you.": + "Size yakın olduğumuz için en uygun yolculuğu seçme esnekliğine sahipsiniz.", + "duration is": "süre:", + "Setting": "Ayar", + "Find answers to common questions": + "Sık sorulan soruların cevaplarını bul", + "I don't need a ride anymore": "Artık yolculuğa ihtiyacım yok", + "I was just trying the application": "Sadece uygulamayı deniyordum", + "No driver accepted my request": + "Hiçbir sürücü isteğimi kabul etmedi", + "I added the wrong pick-up/drop-off location": "Yanlış konum ekledim", + "I don't have a reason": "Bir sebebim yok", + "Can we know why you want to cancel Ride ?": + "Neden iptal etmek istediğinizi öğrenebilir miyiz?", + "Add Payment Method": "Ödeme Yöntemi Ekle", + "Ride Wallet": "Yolculuk Cüzdanı", + "Payment Method": "Ödeme Yöntemi", + "Type here Place": "Yeri buraya yaz", + "Are You sure to ride to": "Şuraya gitmek istediğinize emin misiniz:", + "Confirm": "Onayla", + "You are Delete": "Siliyorsunuz", + "Deleted": "Silindi", + "You Dont Have Any places yet !": "Henüz kayıtlı yeriniz yok!", + "From : Current Location": "Nereden: Mevcut Konum", + "My Cared": "Kartlarım", + "Add Card": "Kart Ekle", + "Add Credit Card": "Kredi Kartı Ekle", + "Please enter the cardholder name": "Kart sahibinin adını girin", + "Please enter the expiry date": "Son kullanma tarihini girin", + "Please enter the CVV code": "CVV kodunu girin", + "Go To Favorite Places": "Favori Yerlere Git", + "Go to this Target": "Bu Hedefe Git", + "My Profile": "Profilim", + "Are you want to go to this site": + "Bu konuma gitmek istiyor musunuz?", + "MyLocation": "Konumum", + "my location": "konumum", + "Target": "Hedef", + "You Should choose rate figure": "Puan seçmelisiniz", + "Login Captin": "Kaptan Girişi", + "Register Captin": "Kaptan Kaydı", + "Send Verfication Code": "Doğrulama Kodu Gönder", + "KM": "KM", + "End Ride": "Yolculuğu Bitir", + "Minute": "Dakika", + "Go to passenger Location now": "Yolcu Konumuna Git", + "Duration of the Ride is ": "Yolculuk Süresi: ", + "Distance of the Ride is ": "Yolculuk Mesafesi: ", + "Name of the Passenger is ": "Yolcunun Adı: ", + "Hello this is Captain": "Merhaba, ben Kaptan", + "Start the Ride": "Yolculuğu Başlat", + "Please Wait If passenger want To Cancel!": + "Lütfen Bekleyin, yolcu iptal etmek isteyebilir!", + "Total Duration:": "Toplam Süre:", + "Active Duration:": "Aktif Süre:", + "Waiting for Captin ...": "Kaptan Bekleniyor...", + "Age is ": "Yaş: ", + "Rating is ": "Puan: ", + " to arrive you.": " size ulaşmak için.", + "Tariff": "Tarife", + "Settings": "Ayarlar", + "Feed Back": "Geri Bildirim", + "Please enter a valid 16-digit card number": + "Lütfen geçerli 16 haneli kart numarasını girin", + "Add Phone": "Telefon Ekle", + "Please enter a phone number": "Lütfen bir telefon numarası girin", + "You dont Add Emergency Phone Yet!": + "Henüz Acil Durum Telefonu Eklemediniz!", + "You will arrive to your destination after ": + "Hedefe varış süreniz: ", + "You can cancel Ride now": "Yolculuğu şimdi iptal edebilirsiniz", + "You Can cancel Ride After Captain did not come in the time": + "Kaptan zamanında gelmezse iptal edebilirsiniz", + "If you in Car Now. Press Start The Ride": + "Şu an araçtaysanız, Yolculuğu Başlat'a basın", + "You Dont Have Any amount in": "Hiç bakiyeniz yok:", + "Wallet!": "Cüzdan!", + "You Have": "Bakiyeniz:", + "Save Credit Card": "Kredi Kartını Kaydet", + "Show Promos": "Promosyonları Göster", + "10 and get 4% discount": "10 ve %4 indirim al", + "20 and get 6% discount": "20 ve %6 indirim al", + "40 and get 8% discount": "40 ve %8 indirim al", + "100 and get 11% discount": "100 ve %11 indirim al", + "Pay with Your PayPal": "PayPal ile Öde", + "You will choose one of above !": + "Yukarıdakilerden birini seçmelisiniz!", + "Edit Profile": "Profili Düzenle", + "Copy this Promo to use it in your Ride!": + "Bu Promosyonu kopyalayıp kullanın!", + "To change some Settings": "Bazı Ayarları değiştirmek için", + "Order Request Page": "Sipariş İstek Sayfası", + "Rouats of Trip": "Yolculuk Rotaları", + "Passenger Name is ": "Yolcu Adı: ", + "Total From Passenger is ": "Yolcu Tutarı: ", + "Duration To Passenger is ": "Yolcuya Varış Süresi: ", + "Distance To Passenger is ": "Yolcuya Mesafe: ", + "Total For You is ": "Size Ödenecek: ", + "Distance is ": "Mesafe: ", + " KM": " KM", + "Duration of Trip is ": "Yolculuk Süresi: ", + " Minutes": " Dakika", + "Apply Order": "Siparişi Kabul Et", + "Refuse Order": "Siparişi Reddet", + "Rate Captain": "Kaptanı Puanla", + "Enter your Note": "Notunu gir", + "Type something...": "Bir şeyler yaz...", + "Submit rating": "Puanı gönder", + "Rate Passenger": "Yolcuyu Puanla", + "Ride Summary": "Yolculuk Özeti", + "welcome_message": "Intaleq'e Hoş Geldiniz!", + "app_description": + "Intaleq güvenli, güvenilir ve erişilebilir bir araç çağırma uygulamasıdır.", + "get_to_destination": "Hedefinize hızlı ve kolay ulaşın.", + "get_a_ride": "Intaleq ile dakikalar içinde araç bulun.", + "safe_and_comfortable": + "Güvenli ve konforlu yolculuğun tadını çıkarın.", + "committed_to_safety": + "Güvenliğe önem veriyoruz, tüm kaptanlarımız kontrolden geçer.", + "your ride is Accepted": "yolculuğunuz Kabul Edildi", + "Driver is waiting at pickup.": "Sürücü alım noktasında bekliyor.", + "Driver is on the way": "Sürücü yolda", + "Contact Options": "İletişim Seçenekleri", + "Send a custom message": "Özel mesaj gönder", + "Type your message": "Mesajını yaz", + "I will go now": "Şimdi gidiyorum", + "You Have Tips": "Bahşişiniz var", + " tips\nTotal is": " bahşiş\nToplam:", + "Your fee is ": "Ücretiniz: ", + "Do you want to pay Tips for this Driver": + "Bu Sürücüye Bahşiş vermek ister misiniz?", + "Tip is ": "Bahşiş: ", + "Are you want to wait drivers to accept your order": + "Sürücülerin siparişinizi kabul etmesini beklemek ister misiniz?", + "This price is fixed even if the route changes for the driver.": + "Bu fiyat rota değişse bile sabittir.", + "The price may increase if the route changes.": + "Rota değişirse fiyat artabilir.", + "The captain is responsible for the route.": + "Rota sorumluluğu kaptandadır.", + "We are search for nearst driver": "En yakın sürücüyü arıyoruz", + "Your order is being prepared": "Siparişiniz hazırlanıyor", + "The drivers are reviewing your request": + "Sürücüler isteğinizi inceliyor", + "Your order sent to drivers": "Siparişiniz sürücülere gönderildi", + "You can call or record audio of this trip": + "Arama yapabilir veya ses kaydedebilirsiniz", + "The trip has started! Feel free to contact emergency numbers, share your trip, or activate voice recording for the journey": + "Yolculuk başladı! Acil numaraları aramaktan, yolculuğu paylaşmaktan veya ses kaydı almaktan çekinmeyin.", + "Camera Access Denied.": "Kamera Erişimi Reddedildi.", + "Open Settings": "Ayarları Aç", + "GPS Required Allow !.": "GPS Gerekli, İzin Ver!", + "Your Account is Deleted": "Hesabınız Silindi", + "Are you sure to delete your account?": + "Hesabınızı silmek istediğinize emin misiniz?", + "Your data will be erased after 2 weeks\nAnd you will can't return to use app after 1 month ": + "Verileriniz 2 hafta sonra silinecek\nVe 1 ay sonra uygulamayı kullanamayacaksınız", + "Enter Your First Name": "Adınızı Girin", + "Are you Sure to LogOut?": "Çıkış Yapmak İstediğinize Emin misiniz?", + "Email Wrong": "E-posta Yanlış", + "Email you inserted is Wrong.": "Girdiğiniz e-posta yanlış.", + "You have finished all times ": "Tüm haklarınızı doldurdunuz ", + "if you want help you can email us here": + "yardım isterseniz bize e-posta atabilirsiniz", + "Thanks": "Teşekkürler", + "Email Us": "Bize E-posta Gönder", + "I cant register in your app in face detection ": + "Yüz algılamada sorun yaşıyorum, kayıt olamıyorum", + "Hi": "Selam", + "No face detected": "Yüz algılanmadı", + "Image detecting result is ": "Görüntü algılama sonucu: ", + "from 3 times Take Attention": "3 denemeden, Dikkat Edin", + "Be sure for take accurate images please\nYou have": + "Lütfen net fotoğraflar çekin\nKalan hakkınız:", + "image verified": "görüntü doğrulandı", + "Next": "İleri", + "There is no help Question here": "Burada yardım sorusu yok", + "You dont have Points": "Puanınız yok", + "You Are Stopped For this Day !": "Bugünlük durduruldunuz!", + "You must be charge your Account": "Hesabınıza yükleme yapmalısınız", + "You Refused 3 Rides this Day that is the reason \nSee you Tomorrow!": + "Bugün 3 yolculuğu reddettiniz, sebep bu \nYarın görüşürüz!", + "Recharge my Account": "Hesabımı Doldur", + "Ok , See you Tomorrow": "Tamam, Yarın Görüşürüz", + "You are Stopped": "Durduruldunuz", + "Connected": "Bağlı", + "Not Connected": "Bağlı Değil", + "Your are far from passenger location": "Yolcu konumundan uzaksınız", + "go to your passenger location before\nPassenger cancel trip": + "yolcu iptal etmeden konumuna gidin", + "You will get cost of your work for this trip": + "Bu yolculuk için emeğinizin karşılığını alacaksınız", + " in your wallet": " cüzdanınızda", + "you gain": "kazandınız", + "Order Cancelled by Passenger": + "Sipariş Yolcu Tarafından İptal Edildi", + "Feedback data saved successfully": + "Geri bildirim başarıyla kaydedildi", + "No Promo for today .": "Bugün için Promosyon yok.", + "Select your destination": "Varış noktasını seç", + "Search for your Start point": "Başlangıç noktasını ara", + "Search for waypoint": "Ara nokta ara", + "Current Location": "Mevcut Konum", + "Add Location 1": "Konum 1 Ekle", + "You must Verify email !.": "E-postayı doğrulamalısınız!", + "Cropper": "Kırpıcı", + "Saved Sucssefully": "Başarıyla Kaydedildi", + "Select Date": "Tarih Seç", + "Birth Date": "Doğum Tarihi", + "Ok": "Tamam", + "the 500 points equal 30 JOD": "500 puan 30 TL eder", + "the 500 points equal 30 JOD for you \nSo go and gain your money": + "500 puan senin için 30 TL eder \nHadi paranı kazan", + "token updated": "token güncellendi", + "Add Location 2": "Konum 2 Ekle", + "Add Location 3": "Konum 3 Ekle", + "Add Location 4": "Konum 4 Ekle", + "Waiting for your location": "Konumunuz bekleniyor", + "Search for your destination": "Varış yerini ara", + "Hi! This is": "Merhaba! Bu", + " I am using": " kullanıyorum", + " to ride with": " şununla yolculuk yapmak için:", + " as the driver.": " sürücü olarak.", + "is driving a ": "bir araç kullanıyor: ", + " with license plate ": " plaka: ", + " I am currently located at ": " Şu anki konumum: ", + "Please go to Car now ": "Lütfen şimdi Araca gidin ", + "You will receive a code in WhatsApp Messenger": + "WhatsApp üzerinden bir kod alacaksınız", + "If you need assistance, contact us": + "Yardıma ihtiyacınız varsa bize ulaşın", + "Promo Ended": "Promosyon Sona Erdi", + "Enter the promo code and get": "Promosyon kodunu gir ve kazan:", + "DISCOUNT": "İNDİRİM", + "No wallet record found": "Cüzdan kaydı bulunamadı", + "for": "için", + "Intaleq is the safest ride-sharing app that introduces many features for both captains and passengers. We offer the lowest commission rate of just 8%, ensuring you get the best value for your rides. Our app includes insurance for the best captains, regular maintenance of cars with top engineers, and on-road services to ensure a respectful and high-quality experience for all users.": + "Intaleq, kaptanlar ve yolcular için birçok özellik sunan en güvenli araç paylaşım uygulamasıdır. Sadece %8 komisyon oranıyla en iyi değeri almanızı sağlıyoruz. En iyi kaptanlar için sigorta, düzenli araç bakımı ve yol yardımı hizmetleri sunuyoruz.", + "You can contact us during working hours from 12:00 - 19:00.": + "Bize 12:00 - 19:00 saatleri arasında ulaşabilirsiniz.", + "Choose a contact option": "İletişim seçeneği belirleyin", + "Work time is from 12:00 - 19:00.\nYou can send a WhatsApp message or email.": + "Çalışma saatleri 12:00 - 19:00.\nWhatsApp mesajı veya e-posta gönderebilirsiniz.", + "Promo code copied to clipboard!": + "Promosyon kodu panoya kopyalandı!", + "Copy Code": "Kodu Kopyala", + "Your invite code was successfully applied!": + "Davet kodunuz başarıyla uygulandı!", + "Payment Options": "Ödeme Seçenekleri", + "wait 1 minute to receive message": + "mesajı almak için 1 dakika bekleyin", + "You have copied the promo code.": "Promosyon kodunu kopyaladınız.", + "Select Payment Amount": "Ödeme Tutarını Seç", + "The promotion period has ended.": "Promosyon süresi doldu.", + "Promo Code Accepted": "Promosyon Kodu Kabul Edildi", + "Tap on the promo code to copy it!": "Kopyalamak için koda dokunun!", + "Lowest Price Achieved": "En Düşük Fiyata Ulaşıldı", + "Cannot apply further discounts.": "Daha fazla indirim uygulanamaz.", + "Promo Already Used": "Promosyon Zaten Kullanıldı", + "Invitation Used": "Davet Kullanıldı", + "You have already used this promo code.": + "Bu promosyon kodunu zaten kullandınız.", + "Insert Your Promo Code": "Promosyon Kodunu Gir", + "Enter promo code here": "Promosyon kodunu buraya girin", + "Please enter a valid promo code": + "Lütfen geçerli bir promosyon kodu girin", + "Awfar Car": "Ekonomik Araç", + "Old and affordable, perfect for budget rides.": + "Eski ve uygun fiyatlı, bütçe dostu yolculuklar için mükemmel.", + " If you need to reach me, please contact the driver directly at": + " Bana ulaşmanız gerekirse, lütfen sürücüyle şu numaradan iletişime geçin:", + "No Car or Driver Found in your area.": + "Bölgenizde Araç veya Sürücü Bulunamadı.", + "Please Try anther time ": "Lütfen başka zaman deneyin ", + "There no Driver Aplly your order sorry for that ": + "Siparişinize başvuran sürücü yok, üzgünüz ", + "Trip Cancelled": "Yolculuk İptal Edildi", + "The Driver Will be in your location soon .": + "Sürücü yakında konumunuzda olacak.", + "The distance less than 500 meter.": "Mesafe 500 metreden az.", + "Promo End !": "Promosyon Bitti!", + "There is no notification yet": "Henüz bildirim yok", + "Use Touch ID or Face ID to confirm payment": + "Ödemeyi onaylamak için Touch ID veya Face ID kullanın", + "Contact us for any questions on your order.": + "Siparişinizle ilgili sorular için bize ulaşın.", + "Pyament Cancelled .": "Ödeme İptal Edildi.", + "type here": "buraya yazın", + "Scan Driver License": "Ehliyeti Tara", + "Please put your licence in these border": + "Lütfen ehliyetinizi bu çerçeveye yerleştirin", + "Camera not initialized yet": "Kamera henüz başlatılmadı", + "Take Image": "Fotoğraf Çek", + "AI Page": "YZ Sayfası", + "Take Picture Of ID Card": "Kimlik Kartı Fotoğrafı Çek", + "Take Picture Of Driver License Card": "Ehliyet Fotoğrafı Çek", + "We are process picture please wait ": + "Fotoğrafı işliyoruz lütfen bekleyin ", + "There is no data yet.": "Henüz veri yok.", + "Name :": "Ad:", + "Drivers License Class: ": "Ehliyet Sınıfı: ", + "Document Number: ": "Belge No: ", + "Address: ": "Adres: ", + "Height: ": "Boy: ", + "Expiry Date: ": "Son Kullanma Tarihi: ", + "Date of Birth: ": "Doğum Tarihi: ", + "You can't continue with us .\nYou should renew Driver license": + "Bizimle devam edemezsiniz.\nEhliyetinizi yenilemelisiniz", + "Detect Your Face ": "Yüzünüzü Algılayın ", + "Go to next step\nscan Car License.": + "Sonraki adıma git\nRuhsatı tara.", + "Name in arabic": "Arapça Ad", + "Drivers License Class": "Ehliyet Sınıfı", + "Selected Date": "Seçilen Tarih", + "Select Time": "Zaman Seç", + "Selected Time": "Seçilen Zaman", + "Selected Date and Time": "Seçilen Tarih ve Saat", + "Lets check Car license ": "Hadi Ruhsatı kontrol edelim ", + "Car": "Araç", + "Plate": "Plaka", + "Rides": "Yolculuklar", + "Selected driver": "Seçilen sürücü", + "Lets check License Back Face": + "Hadi Ehliyet Arka Yüzünü kontrol edelim", + "Car License Card": "Ruhsat Kartı", + "No image selected yet": "Henüz resim seçilmedi", + "Made :": "Marka:", + "model :": "Model:", + "VIN :": "Şasi No:", + "year :": "Yıl:", + "ُExpire Date": "Son Kullanma Tarihi", + "Login Driver": "Sürücü Girişi", + "Password must br at least 6 character.": + "Şifre en az 6 karakter olmalıdır.", + "if you don't have account": "hesabınız yoksa", + "Here recorded trips audio": "Burada kaydedilen yolculuk sesleri", + "Register as Driver": "Sürücü olarak Kayıt Ol", + "By selecting \"I Agree\" below, I have reviewed and agree to the Terms of Use and acknowledge the ": + "Aşağıdaki \"Kabul Ediyorum\" seçeneği ile Kullanım Şartlarını inceleyip kabul ettiğimi ve şunu onayladığımı beyan ederim: ", + "Log Out Page": "Çıkış Sayfası", + "Log Off": "Oturumu Kapat", + "Register Driver": "Sürücü Kaydı", + "Verify Email For Driver": "Sürücü İçin E-postayı Doğrula", + "Admin DashBoard": "Yönetici Paneli", + "Your name": "Adınız", + "your ride is applied": "yolculuğunuz başvuruldu", + "H and": "S ve", + "JOD": "TL", + "m": "dk", + "We search nearst Driver to you": "Size en yakın sürücüyü arıyoruz", + "please wait till driver accept your order": + "sürücü siparişinizi kabul edene kadar bekleyin", + "No accepted orders? Try raising your trip fee to attract riders.": + "Kabul eden yok mu? Ücreti artırmayı deneyin.", + "You should select one": "Birini seçmelisiniz", + "The driver accept your order for": + "Sürücü siparişinizi şu fiyata kabul etti:", + "The driver on your way": "Sürücü yolda", + "Total price from ": "Toplam fiyat: ", + "Order Details Intaleq": "Sipariş Detayları Intaleq", + "Selected file:": "Seçilen dosya:", + "Your trip cost is": "Yolculuk maliyetiniz:", + "this will delete all files from your device": + "bu işlem cihazınızdaki tüm dosyaları silecek", + "Exclusive offers and discounts always with the Intaleq app": + "Özel teklifler ve indirimler her zaman Intaleq uygulamasında", + "Submit Question": "Soru Gönder", + "Please enter your Question.": "Lütfen Sorunuzu girin.", + "Help Details": "Yardım Detayları", + "No trip yet found": "Henüz yolculuk bulunamadı", + "No Response yet.": "Henüz Yanıt yok.", + " You Earn today is ": " Bugün Kazandığınız: ", + " You Have in": " Hesabınızdaki:", + "Total points is ": "Toplam puan: ", + "Total Connection Duration:": "Toplam Bağlantı Süresi:", + "Passenger name : ": "Yolcu adı: ", + "Cost Of Trip IS ": "Yolculuk Maliyeti: ", + "Arrival time": "Varış zamanı", + "arrival time to reach your point": "noktanıza varış zamanı", + "For Intaleq and scooter trips, the price is calculated dynamically. For Comfort trips, the price is based on time and distance": + "Intaleq ve scooter yolculukları için fiyat dinamiktir. Konfor için zaman ve mesafeye dayalıdır.", + "Hello this is Driver": "Merhaba ben Sürücü", + "Is the Passenger in your Car ?": "Yolcu Aracınızda mı?", + "Please wait for the passenger to enter the car before starting the trip.": + "Lütfen yolculuğu başlatmadan önce yolcunun araca binmesini bekleyin.", + "No ,still Waiting.": "Hayır, hâlâ bekliyorum.", + "I arrive you": "Sana ulaştım", + "I Arrive your site": "Konumunuza ulaştım", + "You are not in near to passenger location": + "Yolcu konumuna yakın değilsiniz", + "please go to picker location exactly": + "lütfen tam olarak alım noktasına gidin", + "You Can Cancel Trip And get Cost of Trip From": + "Yolculuğu İptal Edip Ücretini Şuradan Alabilirsiniz:", + "Are you sure to cancel?": "İptal etmek istediğinize emin misiniz?", + "Insert Emergincy Number": "Acil Durum Numarası Gir", + "Best choice for comfort car and flexible route and stops point": + "Konforlu araç ve esnek rota için en iyi seçim", + "Insert": "Ekle", + "This is for scooter or a motorcycle.": + "Bu scooter veya motosiklet içindir.", + "This trip goes directly from your starting point to your destination for a fixed price. The driver must follow the planned route": + "Sabit fiyatlı doğrudan yolculuk. Sürücü planlanan rotayı izlemelidir.", + "You can decline a request without any cost": + "Bir isteği ücretsiz reddedebilirsiniz", + "Perfect for adventure seekers who want to experience something new and exciting": + "Yeni ve heyecanlı bir şey denemek isteyen maceraperestler için mükemmel", + "My current location is:": "Mevcut konumum:", + "and I have a trip on": "ve şurada bir yolculuğum var:", + "App with Passenger": "Yolcu ile Uygulama", + "You will be pay the cost to driver or we will get it from you on next trip": + "Sürücüye ödeme yapacaksınız veya bir sonraki yolculukta sizden alacağız", + "Trip has Steps": "Yolculuğun Adımları Var", + "Distance from Passenger to destination is ": + "Yolcudan hedefe mesafe: ", + "price is": "fiyat:", + "This ride type does not allow changes to the destination or additional stops": + "Bu yolculuk türü hedef değişikliğine veya ek duraklara izin vermez", + "This price may be changed": "Bu fiyat değişebilir", + "No SIM card, no problem! Call your driver directly through our app. We use advanced technology to ensure your privacy.": + "SIM kart yok mu, sorun değil! Uygulamamız üzerinden sürücünüzü doğrudan arayın.", + "This ride type allows changes, but the price may increase": + "Bu tür değişikliklere izin verir ancak fiyat artabilir", + "Select one message": "Bir mesaj seç", + "I'm waiting for you": "Sizi bekliyorum", + "We noticed the Intaleq is exceeding 100 km/h. Please slow down for your safety. If you feel unsafe, you can share your trip details with a contact or call the police using the red SOS button.": + "Intaleq aracının 100 km/s hızını aştığını fark ettik. Lütfen yavaşlayın.", + "Warning: Intaleqing detected!": "Uyarı: Hız tespit edildi!", + "Please help! Contact me as soon as possible.": + "Lütfen yardım edin! Bana hemen ulaşın.", + "Share Trip Details": "Yolculuk Detaylarını Paylaş", + "Car Plate is ": "Araç Plakası: ", + "the 300 points equal 300 L.E for you \nSo go and gain your money": + "300 puan senin için 300 TL eder \nHadi paranı kazan", + "the 300 points equal 300 L.E": "300 puan 300 TL eder", + "The payment was not approved. Please try again.": + "Ödeme onaylanmadı. Lütfen tekrar deneyin.", + "Payment Failed": "Ödeme Başarısız", + "This is a scheduled notification.": "Bu planlanmış bir bildirimdir.", + "An error occurred during the payment process.": + "Ödeme işlemi sırasında bir hata oluştu.", + "The payment was approved.": "Ödeme onaylandı.", + "Payment Successful": "Ödeme Başarılı", + "No ride found yet": "Henüz araç bulunamadı", + "Accept Order": "Siparişi Kabul Et", + "Bottom Bar Example": "Alt Çubuk Örneği", + "Driver phone": "Sürücü telefonu", + "Statistics": "İstatistikler", + "Origin": "Başlangıç", + "Destination": "Varış", + "Driver Name": "Sürücü Adı", + "Driver Car Plate": "Sürücü Plakası", + "Available for rides": "Yolculuklar için müsait", + "Scan Id": "Kimlik Tara", + "Camera not initilaized yet": "Kamera henüz başlatılmadı", + "Scan ID MklGoogle": "Kimlik Tara MklGoogle", + "Language": "Dil", + "Jordan": "Ürdün", + "USA": "ABD", + "Egypt": "Mısır", + "Turkey": "Türkiye", + "Saudi Arabia": "Suudi Arabistan", + "Qatar": "Katar", + "Bahrain": "Bahreyn", + "Kuwait": "Kuveyt", + "But you have a negative salary of": "Ancak negatif maaşınız var:", + "Promo Code": "Promosyon Kodu", + "Your trip distance is": "Yolculuk mesafeniz:", + "Enter promo code": "Promosyon kodu gir", + "You have promo!": "Promosyonun var!", + "Cost Duration": "Maliyet Süresi", + "Duration is": "Süre:", + "Leave": "Ayrıl", + "Join": "Katıl", + "Heading your way now. Please be ready.": + "Sana doğru geliyorum. Lütfen hazır ol.", + "Approaching your area. Should be there in 3 minutes.": + "Bölgene yaklaşıyorum. 3 dakika içinde orada olmalıyım.", + "There's heavy traffic here. Can you suggest an alternate pickup point?": + "Burada trafik yoğun. Alternatif bir alım noktası önerebilir misin?", + "This ride is already taken by another driver.": + "Bu yolculuk başka bir sürücü tarafından alınmış.", + "You Should be select reason.": "Bir sebep seçmelisiniz.", + "Waiting for Driver ...": "Sürücü Bekleniyor...", + "Latest Recent Trip": "En Son Yolculuk", + "from your list": "listenden", + "Do you want to change Work location": + "İş konumunu değiştirmek istiyor musunuz?", + "Do you want to change Home location": + "Ev konumunu değiştirmek istiyor musunuz?", + "We Are Sorry That we dont have cars in your Location!": + "Üzgünüz, konumunuzda aracımız yok!", + "Choose from Map": "Haritadan Seç", + "Pick your ride location on the map - Tap to confirm": + "Haritada konumunu seç - Onaylamak için dokun", + "Intaleq is the ride-hailing app that is safe, reliable, and accessible.": + "Intaleq güvenli, güvenilir ve erişilebilir araç çağırma uygulamasıdır.", + "With Intaleq, you can get a ride to your destination in minutes.": + "Intaleq ile dakikalar içinde hedefinize araç bulabilirsiniz.", + "Intaleq is committed to safety, and all of our captains are carefully screened and background checked.": + "Intaleq güvenliğe önem verir, tüm kaptanlarımız dikkatle incelenir.", + "Pick from map": "Haritadan seç", + "No Car in your site. Sorry!": "Konumunuzda araç yok. Üzgünüz!", + "Nearest Car for you about ": "Size en yakın araç yaklaşık: ", + "From :": "Nereden:", + "Get Details of Trip": "Yolculuk Detaylarını Al", + "If you want add stop click here": + "Durak eklemek istiyorsanız buraya tıklayın", + "Where you want go ": "Nereye gitmek istiyorsunuz ", + "My Card": "Kartım", + "Start Record": "Kaydı Başlat", + "History of Trip": "Yolculuk Geçmişi", + "Helping Center": "Yardım Merkezi", + "Record saved": "Kayıt kaydedildi", + "Trips recorded": "Kaydedilen Yolculuklar", + "Select Your Country": "Ülkenizi Seçin", + "To ensure you receive the most accurate information for your location, please select your country below. This will help tailor the app experience and content to your country.": + "En doğru bilgiyi almak için lütfen ülkenizi seçin.", + "Are you sure to delete recorded files": + "Kayıtlı dosyaları silmek istediğinize emin misiniz?", + "Select recorded trip": "Kaydedilen yolculuğu seç", + "Card Number": "Kart Numarası", + "Hi, Where to ": "Selam, Nereye ", + "Pick your destination from Map": "Haritadan varış yerini seç", + "Add Stops": "Durak Ekle", + "Get Direction": "Yol Tarifi Al", + "Add Location": "Konum Ekle", + "Switch Rider": "Yolcuyu Değiştir", + "You will arrive to your destination after timer end.": + "Süre bittikten sonra hedefe varacaksınız.", + "You can cancel trip": "Yolculuğu iptal edebilirsiniz", + "The driver waitting you in picked location .": + "Sürücü sizi seçilen konumda bekliyor.", + "Pay with Your": "Şununla Öde:", + "Pay with Credit Card": "Kredi Kartı ile Öde", + "Show Promos to Charge": "Yükleme için Promosyonları Göster", + "Point": "Puan", + "How many hours would you like to wait?": + "Kaç saat beklemek istersiniz?", + "Driver Wallet": "Sürücü Cüzdanı", + "Choose between those Type Cars": "Bu Araç Tipleri Arasından Seçin", + "hour": "saat", + "Select Waiting Hours": "Bekleme Süresini Seç", + "Total Points is": "Toplam Puan:", + "You will receive a code in SMS message": + "SMS ile bir kod alacaksınız", + "Done": "Bitti", + "Total Budget from trips is ": "Yolculuklardan Toplam Bütçe: ", + "Total Amount:": "Toplam Tutar:", + "Total Budget from trips by\nCredit card is ": + "Kredi kartı ile yolculuklardan\nToplam Bütçe: ", + "This amount for all trip I get from Passengers": + "Yolculardan aldığım tüm yolculuk tutarı", + "Pay from my budget": "Bütçemden öde", + "This amount for all trip I get from Passengers and Collected For me in": + "Bu tutar yolculardan aldığım ve benim için toplanan", + "You can buy points from your budget": + "Bütçenizden puan satın alabilirsiniz", + "insert amount": "tutar girin", + "You can buy Points to let you online\nby this list below": + "Çevrimiçi kalmak için Puan satın alabilirsiniz\naşağıdaki listeden", + "Create Wallet to receive your money": + "Paranızı almak için Cüzdan oluşturun", + "Enter your feedback here": "Geri bildiriminizi buraya girin", + "Please enter your feedback.": "Lütfen geri bildiriminizi girin.", + "Feedback": "Geri Bildirim", + "Submit ": "Gönder ", + "Click here to Show it in Map": "Haritada Göstermek için Tıkla", + "Canceled": "İptal Edildi", + "No I want": "Hayır istiyorum", + "Email is": "E-posta:", + "Phone Number is": "Telefon:", + "Date of Birth is": "Doğum Tarihi:", + "Sex is ": "Cinsiyet: ", + "Car Details": "Araç Detayları", + "VIN is": "Şasi No:", + "Color is ": "Renk: ", + "Make is ": "Marka: ", + "Model is": "Model:", + "Year is": "Yıl:", + "Expiration Date ": "Son Kullanma Tarihi: ", + "Edit Your data": "Verilerini Düzenle", + "write vin for your car": "aracın şasi numarasını yaz", + "VIN": "Şasi No", + "Please verify your identity": "Lütfen kimliğinizi doğrulayın", + "write Color for your car": "aracın rengini yaz", + "write Make for your car": "aracın markasını yaz", + "write Model for your car": "aracın modelini yaz", + "write Year for your car": "aracın yılını yaz", + "write Expiration Date for your car": + "aracın son kullanma tarihini yaz", + "Tariffs": "Tarifeler", + "Minimum fare": "Minimum ücret", + "Maximum fare": "Maksimum ücret", + "Flag-down fee": "Açılış ücreti", + "Including Tax": "Vergi Dahil", + "BookingFee": "Rezervasyon Ücreti", + "Morning": "Sabah", + "from 07:30 till 10:30 (Thursday, Friday, Saturday, Monday)": + "07:30'dan 10:30'a kadar", + "Evening": "Akşam", + "from 12:00 till 15:00 (Thursday, Friday, Saturday, Monday)": + "12:00'den 15:00'e kadar", + "Night": "Gece", + "You have in account": "Hesabınızda var", + "Select Country": "Ülke Seç", + "Ride Today : ": "Bugünkü Yolculuk: ", + "After this period\nYou can't cancel!": + "Bu süreden sonra\nİptal edemezsiniz!", + "from 23:59 till 05:30": "23:59'dan 05:30'a kadar", + "Rate Driver": "Sürücüyü Puanla", + "Total Cost is ": "Toplam Maliyet: ", + "Write note": "Not yaz", + "Time to arrive": "Varış zamanı", + "Ride Summaries": "Yolculuk Özetleri", + "Total Cost": "Toplam Maliyet", + "Average of Hours of": "Şu saatlerin ortalaması:", + " is ON for this month": " bu ay için AÇIK", + "Days": "Günler", + "Total Hours on month": "Aydaki Toplam Saat", + "Counts of Hours on days": "Günlerdeki Saat Sayısı", + "OrderId": "Sipariş No", + "created time": "oluşturulma zamanı", + "Intaleq Over": "Intaleq Bitti", + "I will slow down": "Yavaşlayacağım", + "Map Passenger": "Yolcu Haritası", + "Be Slowly": "Yavaş Ol", + "If you want to make Google Map App run directly when you apply order": + "Siparişi uyguladığınızda Google Haritalar'ın direkt açılmasını istiyorsanız", + "You can change the language of the app": + "Uygulamanın dilini değiştirebilirsiniz", + "Your Budget less than needed": "Bütçeniz gerekenden az", + "You can change the Country to get all features": + "Tüm özellikleri almak için Ülkeyi değiştirebilirsiniz", + "There is no Car or Driver in your area.": + "Bölgenizde araç veya sürücü bulunmamaktadır.", + "Change Country": "Ülke Değiştir", + }, + "fr": { + "1 Passenger": "1 Passenger", + "2 Passengers": "2 Passengers", + "3 Passengers": "3 Passengers", + "4 Passengers": "4 Passengers", + "2. Attach Recorded Audio (Optional)": + "2. Attach Recorded Audio (Optional)", + "Account": "Account", + "Actions": "Actions", + "Active Users": "Active Users", + "Add a Stop": "Add a Stop", + "Add a new waypoint stop": "Add a new waypoint stop", + "After this period\nYou can\'t cancel!": + "After this period\nYou can\'t cancel!", + "Age is": "Age is", + "Alert": "Alert", + "An OTP has been sent to your number.": + "An OTP has been sent to your number.", + "An error occurred": "An error occurred", + "Appearance": "Appearance", + "Are you sure you want to delete this file?": + "Are you sure you want to delete this file?", + "Are you sure you want to logout?": + "Are you sure you want to logout?", + "Arrived": "Arrived", + "Audio Recording": "Audio Recording", + "Call": "Call", + "Call Support": "Call Support", + "Call left": "Call left", + "Change Photo": "Change Photo", + "Choose from Gallery": "Choose from Gallery", + "Choose from contact": "Choose from contact", + "Click to track the trip": "Click to track the trip", + "Close panel": "Close panel", + "Coming": "Coming", + "Complete Payment": "Complete Payment", + "Confirm Cancellation": "Confirm Cancellation", + "Confirm Pickup Location": "Confirm Pickup Location", + "Connection failed. Please try again.": + "Connection failed. Please try again.", + "Could not create ride. Please try again.": + "Could not create ride. Please try again.", + "Crop Photo": "Crop Photo", + "Dark Mode": "Dark Mode", + "Delete": "Delete", + "Delete Account": "Delete Account", + "Delete All": "Delete All", + "Delete All Recordings?": "Delete All Recordings?", + "Delete Recording?": "Delete Recording?", + "Destination Set": "Destination Set", + "Distance": "Distance", + "Double tap to open search or enter destination": + "Double tap to open search or enter destination", + "Double tap to set or change this waypoint on the map": + "Double tap to set or change this waypoint on the map", + "Drawing route on map...": "Drawing route on map...", + "Driver Phone": "Driver Phone", + "Driver is Going To You": "Driver is Going To You", + "Emergency Mode Triggered": "Emergency Mode Triggered", + "Emergency SOS": "Emergency SOS", + "Enter the 5-digit code": "Enter the 5-digit code", + "Enter your City": "Enter your City", + "Enter your Password": "Enter your Password", + "Failed to book trip: \$e": "Failed to book trip: \$e", + "Failed to get location": "Failed to get location", + "Failed to initiate payment. Please try again.": + "Failed to initiate payment. Please try again.", + "Failed to send OTP": "Failed to send OTP", + "Failed to upload photo": "Failed to upload photo", + "Finished": "Finished", + "Fixed Price": "Fixed Price", + "General": "General", + "Grant": "Grant", + "Have a Promo Code?": "Have a Promo Code?", + "Hello! I\'m inviting you to try Intaleq.": + "Hello! I\'m inviting you to try Intaleq.", + "Hi ,I Arrive your site": "Hi ,I Arrive your site", + "Hi, Where to": "Hi, Where to", + "Home": "Home", + "I am currently located at": "I am currently located at", + "I'm Safe": "I'm Safe", + "If you need to reach me, please contact the driver directly at": + "If you need to reach me, please contact the driver directly at", + "Image Upload Failed": "Image Upload Failed", + "Intaleq Passenger": "Intaleq Passenger", + "Invite": "Invite", + "Join a channel": "Join a channel", + "Last Name": "Last Name", + "Leave a detailed comment (Optional)": + "Leave a detailed comment (Optional)", + "Light Mode": "Light Mode", + "Listen": "Listen", + "Location": "Location", + "Location Received": "Location Received", + "Logout": "Logout", + "Map Error": "Map Error", + "Message": "Message", + "Move map to select destination": "Move map to select destination", + "Move map to set start location": "Move map to set start location", + "Move map to set stop": "Move map to set stop", + "Move map to your home location": "Move map to your home location", + "Move map to your pickup point": "Move map to your pickup point", + "Move map to your work location": "Move map to your work location", + "N/A": "N/A", + "No Notifications": "No Notifications", + "No Recordings Found": "No Recordings Found", + "No Rides now!": "No Rides now!", + "No contacts available": "No contacts available", + "No i want": "No i want", + "No notification data found.": "No notification data found.", + "No routes available for this destination.": + "No routes available for this destination.", + "No user found": "No user found", + "No,I want": "No,I want", + "No.Iwant Cancel Trip.": "No.Iwant Cancel Trip.", + "Now move the map to your pickup point": + "Now move the map to your pickup point", + "Now set the pickup point for the other person": + "Now set the pickup point for the other person", + "On Trip": "On Trip", + "Open": "Open", + "Open destination search": "Open destination search", + "Open in Google Maps": "Open in Google Maps", + "Order VIP Canceld": "Order VIP Canceld", + "Passenger": "Passenger", + "Passenger cancel order": "Passenger cancel order", + "Pay by MTN Wallet": "Pay by MTN Wallet", + "Pay by Sham Cash": "Pay by Sham Cash", + "Pay by Syriatel Wallet": "Pay by Syriatel Wallet", + "Pay with PayPal": "Pay with PayPal", + "Phone": "Phone", + "Phone Number": "Phone Number", + "Phone Number Check": "Phone Number Check", + "Phone number seems too short": "Phone number seems too short", + "Phone verified. Please complete registration.": + "Phone verified. Please complete registration.", + "Pick destination on map": "Pick destination on map", + "Pick location on map": "Pick location on map", + "Pick on map": "Pick on map", + "Pick start point on map": "Pick start point on map", + "Plan Your Route": "Plan Your Route", + "Please add contacts to your phone.": + "Please add contacts to your phone.", + "Please check your internet and try again.": + "Please check your internet and try again.", + "Please enter a valid email.": "Please enter a valid email.", + "Please enter a valid phone number.": + "Please enter a valid phone number.", + "Please enter the number without the leading 0": + "Please enter the number without the leading 0", + "Please enter your phone number": "Please enter your phone number", + "Please go to Car now": "Please go to Car now", + "Please select a reason first": "Please select a reason first", + "Please set a valid SOS phone number.": + "Please set a valid SOS phone number.", + "Please slow down": "Please slow down", + "Please wait while we prepare your trip.": + "Please wait while we prepare your trip.", + "Preferences": "Preferences", + "Profile photo updated": "Profile photo updated", + "Quick Message": "Quick Message", + "Rating is": "Rating is", + "Received empty route data.": "Received empty route data.", + "Record": "Record", + "Record your trips to see them here.": + "Record your trips to see them here.", + "Rejected Orders Count": "Rejected Orders Count", + "Remove waypoint": "Remove waypoint", + "Report": "Report", + "Route and prices have been calculated successfully!": + "Route and prices have been calculated successfully!", + "SOS": "SOS", + "Save": "Save", + "Save Changes": "Save Changes", + "Save Name": "Save Name", + "Search country": "Search country", + "Search for a starting point": "Search for a starting point", + "Select Appearance": "Select Appearance", + "Select Education": "Select Education", + "Select Gender": "Select Gender", + "Select This Ride": "Select This Ride", + "Select betweeen types": "Select betweeen types", + "Send Email": "Send Email", + "Send SOS": "Send SOS", + "Send WhatsApp Message": "Send WhatsApp Message", + "Server Error": "Server Error", + "Server error": "Server error", + "Server error. Please try again.": "Server error. Please try again.", + "Set Destination": "Set Destination", + "Set Phone Number": "Set Phone Number", + "Set as Home": "Set as Home", + "Set as Stop": "Set as Stop", + "Set as Work": "Set as Work", + "Share": "Share", + "Share Trip": "Share Trip", + "Share your experience to help us improve...": + "Share your experience to help us improve...", + "Something went wrong. Please try again.": + "Something went wrong. Please try again.", + "Speaking...": "Speaking...", + "Speed Over": "Speed Over", + "Start Point": "Start Point", + "Stay calm. We are here to help.": "Stay calm. We are here to help.", + "Stop": "Stop", + "Submit Rating": "Submit Rating", + "Support & Info": "Support & Info", + "System Default": "System Default", + "Take a Photo": "Take a Photo", + "Tap to apply your discount": "Tap to apply your discount", + "Tap to search your destination": "Tap to search your destination", + "The driver cancelled the trip.": "The driver cancelled the trip.", + "This action cannot be undone.": "This action cannot be undone.", + "This action is permanent and cannot be undone.": + "This action is permanent and cannot be undone.", + "This is for delivery or a motorcycle.": + "This is for delivery or a motorcycle.", + "Time": "Time", + "To :": "To :", + "Top up Balance": "Top up Balance", + "Top up Balance to continue": "Top up Balance to continue", + "Total Invites": "Total Invites", + "Total Price": "Total Price", + "Trip booked successfully": "Trip booked successfully", + "Type your message...": "Type your message...", + "Unknown Location": "Unknown Location", + "Update Name": "Update Name", + "Verified Passenger": "Verified Passenger", + "View Map": "View Map", + "Wait for the trip to start first": + "Wait for the trip to start first", + "Waiting...": "Waiting...", + "Warning": "Warning", + "Waypoint has been set successfully": + "Waypoint has been set successfully", + "We use location to get accurate and nearest driver for you": + "We use location to get accurate and nearest driver for you", + "WhatsApp": "WhatsApp", + "Why do you want to cancel?": "Why do you want to cancel?", + "Yes": "Yes", + "You should ideintify your gender for this type of trip!": + "You should ideintify your gender for this type of trip!", + "You will choose one of above!": "You will choose one of above!", + "Your Rewards": "Your Rewards", + "Your complaint has been submitted.": + "Your complaint has been submitted.", + "and acknowledge our Privacy Policy.": + "and acknowledge our Privacy Policy.", + "as the driver.": "as the driver.", + "cancelled": "cancelled", + "due to a previous trip.": "due to a previous trip.", + "insert sos phone": "insert sos phone", + "is driving a": "is driving a", + "min added to fare": "min added to fare", + "phone not verified": "phone not verified", + "to arrive you.": "to arrive you.", + "unknown": "unknown", + "wait 1 minute to recive message": "wait 1 minute to recive message", + "with license plate": "with license plate", + "witout zero": "witout zero", + "you must insert token code": "you must insert token code", + "Syria": "Syrie", + "SYP": "SYP", + "Order": "Commande", + "OrderVIP": "Commande VIP", + "Cancel Trip": "Annuler le trajet", + "Passenger Cancel Trip": "Le passager a annulé le trajet", + "VIP Order": "Commande VIP", + "The driver accepted your trip": + "Le chauffeur a accepté votre trajet", + "message From passenger": "Message du passager", + "Cancel": "Annuler", + "Trip Cancelled. The cost of the trip will be added to your wallet.": + "Trajet annulé. Les frais seront crédités sur votre portefeuille.", + "token change": "Changement de jeton", + "Changed my mind": "J'ai changé d'avis", + "Please write the reason...": "Veuillez écrire la raison...", + "Found another transport": "J'ai trouvé un autre transport", + "Driver is taking too long": "Le chauffeur met trop de temps", + "Driver asked me to cancel": "Le chauffeur m'a demandé d'annuler", + "Wrong pickup location": "Mauvais lieu de prise en charge", + "Other": "Autre", + "Don't Cancel": "N'annulez pas", + "No Drivers Found": "Aucun chauffeur trouvé", + "Sorry, there are no cars available of this type right now.": + "Désolé, aucune voiture de ce type n'est disponible pour le moment.", + "Refresh Map": "Actualiser la carte", + "face detect": "Détection de visage", + "Face Detection Result": "Résultat de la détection de visage", + "similar": "Similaire", + "not similar": "Non similaire", + "Searching for nearby drivers...": + "Recherche de chauffeurs à proximité...", + "Error": "Erreur", + "Failed to search, please try again later": + "Échec de la recherche, veuillez réessayer plus tard", + "Connection Error": "Erreur de connexion", + "Please check your internet connection": + "Veuillez vérifier votre connexion Internet", + "Sorry 😔": "Désolé 😔", + "The driver cancelled the trip for an emergency reason.\nDo you want to search for another driver immediately?": + "Le chauffeur a annulé le trajet pour une raison d'urgence.\nVoulez-vous chercher un autre chauffeur immédiatement ?", + "Search for another driver": "Chercher un autre chauffeur", + "We apologize 😔": "Nous nous excusons 😔", + "No drivers found at the moment.\nPlease try again later.": + "Aucun chauffeur trouvé pour le moment.\nVeuillez réessayer plus tard.", + "Hi ,I will go now": "Bonjour, je pars maintenant", + "Passenger come to you": "Le passager vient vers vous", + "Call Income": "Appel entrant", + "Call Income from Passenger": "Appel entrant du passager", + "Criminal Document Required": "Extrait de casier judiciaire requis", + "You should have upload it .": "Vous devez le télécharger.", + "Call End": "Fin de l'appel", + "The order has been accepted by another driver.": + "La commande a été acceptée par un autre chauffeur.", + "The order Accepted by another Driver": + "Commande acceptée par un autre chauffeur", + "We regret to inform you that another driver has accepted this order.": + "Nous regrettons de vous informer qu'un autre chauffeur a accepté cette commande.", + "Driver Applied the Ride for You": + "Le chauffeur a demandé le trajet pour vous", + "Applied": "Demandé", + "Please go to Car Driver": "Veuillez rejoindre le chauffeur", + "Ok I will go now.": "D'accord, j'y vais maintenant.", + "Accepted Ride": "Trajet accepté", + "Driver Accepted the Ride for You": + "Le chauffeur a accepté le trajet pour vous", + "Promo": "Promo", + "Show latest promo": "Voir les dernières promos", + "Trip Monitoring": "Suivi du trajet", + "Driver Is Going To Passenger": + "Le chauffeur se rend vers le passager", + "Please stay on the picked point.": + "Veuillez rester au point de prise en charge.", + "message From Driver": "Message du chauffeur", + "Trip is Begin": "Le trajet commence", + "Cancel Trip from driver": "Annuler le trajet (Chauffeur)", + "We will look for a new driver.\nPlease wait.": + "Nous cherchons un nouveau chauffeur.\nVeuillez patienter.", + "The driver canceled your ride.": + "Le chauffeur a annulé votre course.", + "Driver Finish Trip": "Le chauffeur a terminé la course", + "you will pay to Driver": "Vous paierez au chauffeur", + "Don’t forget your personal belongings.": + "N'oubliez pas vos effets personnels.", + "Please make sure you have all your personal belongings and that any remaining fare, if applicable, has been added to your wallet before leaving. Thank you for choosing the Intaleq app": + "Veuillez vérifier que vous avez tous vos effets personnels et que tout solde restant a été ajouté à votre portefeuille. Merci d'avoir choisi Intaleq.", + "Finish Monitor": "Terminer la surveillance", + "Trip finished": "Trajet terminé", + "Call Income from Driver": "Appel entrant du chauffeur", + "Driver Cancelled Your Trip": "Le chauffeur a annulé votre trajet", + "you will pay to Driver you will be pay the cost of driver time look to your Intaleq Wallet": + "Vous paierez le temps du chauffeur, consultez votre portefeuille Intaleq", + "Order Applied": "Commande passée", + "welcome to intaleq": "Bienvenue chez Intaleq", + "login or register subtitle": + "Entrez votre numéro de mobile pour vous connecter ou vous inscrire", + "Complaint cannot be filed for this ride. It may not have been completed or started.": + "Impossible de déposer une plainte pour ce trajet. Il n'a peut-être pas été terminé ou commencé.", + "phone number label": "Numéro de téléphone", + "phone number required": "Numéro de téléphone requis", + "send otp button": "Envoyer le code OTP", + "verify your number title": "Vérifiez votre numéro", + "otp sent subtitle": + "Un code à 5 chiffres a été envoyé au\n@phoneNumber", + "verify and continue button": "Vérifier et continuer", + "enter otp validation": "Veuillez entrer le code OTP à 5 chiffres", + "one last step title": "Une dernière étape", + "complete profile subtitle": "Complétez votre profil pour commencer", + "first name label": "Prénom", + "first name required": "Prénom requis", + "last name label": "Nom", + "Verify OTP": "Vérifier l'OTP", + "Verification Code": "Code de vérification", + "We have sent a verification code to your mobile number:": + "Nous avons envoyé un code de vérification à votre numéro de mobile :", + "Verify": "Vérifier", + "Resend Code": "Renvoyer le code", + "You can resend in": "Vous pouvez renvoyer dans", + "seconds": "secondes", + "Please enter the complete 6-digit code.": + "Veuillez entrer le code complet à 6 chiffres.", + "last name required": "Nom requis", + "email optional label": "Email (Optionnel)", + "complete registration button": "Terminer l'inscription", + "User with this phone number or email already exists.": + "Un utilisateur avec ce numéro ou cet email existe déjà.", + "otp sent success": "Code OTP envoyé avec succès.", + "failed to send otp": "Échec de l'envoi du code OTP.", + "server error try again": "Erreur serveur, veuillez réessayer.", + "an error occurred": "Une erreur s'est produite : @error", + "otp verification failed": "Échec de la vérification OTP.", + "registration failed": "Échec de l'inscription.", + "welcome user": "Bienvenue, @firstName !", + "Don't forget your personal belongings.": + "N'oubliez pas vos effets personnels.", + "Share App": "Partager l'application", + "Wallet": "Portefeuille", + "Balance": "Solde", + "Profile": "Profil", + "Contact Support": "Contacter le support", + "Session expired. Please log in again.": + "Session expirée. Veuillez vous reconnecter.", + "Security Warning": "⚠️ Avertissement de sécurité", + "Potential security risks detected. The application may not function correctly.": + "Risques de sécurité potentiels détectés. L'application peut ne pas fonctionner correctement.", + "please order now": "Commandez maintenant", + "Where to": "Où allez-vous ?", + "Where are you going?": "Où allez-vous ?", + "Quick Actions": "Actions rapides", + "My Balance": "Mon solde", + "Order History": "Historique des commandes", + "Contact Us": "Nous contacter", + "Driver": "Chauffeur", + "Complaint": "Réclamation", + "Promos": "Promos", + "Recent Places": "Lieux récents", + "From": "De", + "WhatsApp Location Extractor": "Extracteur de localisation WhatsApp", + "Location Link": "Lien de localisation", + "Paste location link here": "Collez le lien de localisation ici", + "Go to this location": "Aller à cet endroit", + "Paste WhatsApp location link": + "Coller le lien de localisation WhatsApp", + "Select Order Type": "Sélectionner le type de commande", + "Choose who this order is for": "Pour qui est cette commande ?", + "I want to order for myself": "Je commande pour moi-même", + "I want to order for someone else": + "Je commande pour quelqu'un d'autre", + "Order for someone else": "Commander pour autrui", + "Order for myself": "Commander pour moi", + "Are you want to go this site": "Voulez-vous aller à cet endroit ?", + "No": "Non", + "Intaleq Wallet": "Portefeuille Intaleq", + "Have a promo code?": "Avez-vous un code promo ?", + "Your Wallet balance is ": "Le solde de votre portefeuille est ", + "Cash": "Espèces", + "Pay directly to the captain": "Payer directement au chauffeur", + "Top up Wallet to continue": + "Rechargez votre portefeuille pour continuer", + "Or pay with Cash instead": "Ou payez en espèces", + "Confirm & Find a Ride": "Confirmer et trouver un trajet", + "Balance:": "Solde :", + "Alerts": "Alertes", + "Welcome Back!": "Bon retour !", + "Current Balance": "Solde actuel", + "Set Wallet Phone Number": "Définir le numéro du portefeuille", + "Link a phone number for transfers": + "Lier un numéro pour les transferts", + "Payment History": "Historique des paiements", + "View your past transactions": "Voir vos transactions passées", + "Top up Wallet": "Recharger le portefeuille", + "Add funds using our secure methods": + "Ajouter des fonds via nos méthodes sécurisées", + "Increase Fare": "Augmenter le tarif", + "No drivers accepted your request yet": + "Aucun chauffeur n'a encore accepté votre demande", + "Increasing the fare might attract more drivers. Would you like to increase the price?": + "Augmenter le tarif pourrait attirer plus de chauffeurs. Voulez-vous augmenter le prix ?", + "Please make sure not to leave any personal belongings in the car.": + "Veuillez vous assurer de ne rien laisser dans la voiture.", + "Cancel Ride": "Annuler la course", + "Route Not Found": "Itinéraire introuvable", + "We couldn't find a valid route to this destination. Please try selecting a different point.": + "Impossible de trouver un itinéraire valide vers cette destination. Veuillez sélectionner un autre point.", + "You can call or record audio during this trip.": + "Vous pouvez appeler ou enregistrer l'audio pendant ce trajet.", + "Warning: Speeding detected!": + "Attention : Excès de vitesse détecté !", + "Comfort": "Confort", + "Intaleq Balance": "Solde Intaleq", + "Electric": "Électrique", + "Lady": "Dame", + "Van": "Van", + "Rayeh Gai": "Aller-Retour", + "Join Intaleq as a driver using my referral code!": + "Rejoignez Intaleq comme chauffeur avec mon code de parrainage !", + "Use code:": "Utilisez le code :", + "Download the Intaleq Driver app now and earn rewards!": + "Téléchargez l'appli Chauffeur Intaleq et gagnez des récompenses !", + "Get a discount on your first Intaleq ride!": + "Obtenez une réduction sur votre premier trajet Intaleq !", + "Use my referral code:": "Utilisez mon code de parrainage :", + "Download the Intaleq app now and enjoy your ride!": + "Téléchargez Intaleq maintenant et profitez du trajet !", + "Contacts Loaded": "Contacts chargés", + "Showing": "Affichage de", + "of": "sur", + "Customer not found": "Client introuvable", + "Wallet is blocked": "Portefeuille bloqué", + "Customer phone is not active": + "Le téléphone du client n'est pas actif", + "Balance not enough": "Solde insuffisant", + "Balance limit exceeded": "Limite de solde dépassée", + "Incorrect sms code": "⚠️ Code SMS incorrect. Veuillez réessayer.", + "contacts. Others were hidden because they don't have a phone number.": + "contacts. Les autres sont masqués car ils n'ont pas de numéro.", + "No contacts found": "Aucun contact trouvé", + "No contacts with phone numbers were found on your device.": + "Aucun contact avec numéro de téléphone trouvé sur votre appareil.", + "Permission denied": "Permission refusée", + "Contact permission is required to pick contacts": + "La permission d'accès aux contacts est requise.", + "An error occurred while picking contacts:": + "Une erreur est survenue lors de la sélection des contacts :", + "Please enter a correct phone": "Veuillez entrer un numéro valide", + "Success": "Succès", + "Invite sent successfully": "Invitation envoyée avec succès", + "Hello! I'm inviting you to try Intaleq.": + "Bonjour ! Je vous invite à essayer Intaleq.", + "Use my invitation code to get a special gift on your first ride!": + "Utilisez mon code pour un cadeau spécial lors de votre premier trajet !", + "Your personal invitation code is:": + "Votre code d'invitation personnel est :", + "Be sure to use it quickly! This code expires at": + "Utilisez-le vite ! Ce code expire le", + "Download the app now:": "Téléchargez l'application :", + "See you on the road!": "À bientôt sur la route !", + "This phone number has already been invited.": + "Ce numéro a déjà été invité.", + "An unexpected error occurred. Please try again.": + "Une erreur inattendue s'est produite. Réessayez.", + "You deserve the gift": "Vous méritez le cadeau", + "Claim your 20 LE gift for inviting": + "Réclamez votre cadeau de 20 € pour l'invitation", + "You have got a gift for invitation": + "Vous avez reçu un cadeau pour l'invitation", + "You have earned 20": "Vous avez gagné 20", + "LE": "€", + "Vibration feedback for all buttons": + "Vibration pour tous les boutons", + "Share with friends and earn rewards": + "Partagez avec des amis et gagnez des récompenses", + "Gift Already Claimed": "Cadeau déjà réclamé", + "You have already received your gift for inviting": + "Vous avez déjà reçu votre cadeau pour cette invitation", + "Keep it up!": "Continuez comme ça !", + "has completed": "a terminé", + "trips": "trajets", + "Personal Information": "Informations personnelles", + "Name": "Nom", + "Not set": "Non défini", + "Gender": "Sexe", + "Education": "Éducation", + "Work & Contact": "Travail et Contact", + "Employment Type": "Type d'emploi", + "Marital Status": "État civil", + "SOS Phone": "Téléphone SOS", + "Sign Out": "Se déconnecter", + "Delete My Account": "Supprimer mon compte", + "Update Gender": "Mettre à jour le sexe", + "Update": "Mettre à jour", + "Update Education": "Mettre à jour l'éducation", + "Are you sure? This action cannot be undone.": + "Êtes-vous sûr ? Cette action est irréversible.", + "Confirm your Email": "Confirmez votre email", + "Type your Email": "Tapez votre email", + "Delete Permanently": "Supprimer définitivement", + "Male": "Homme", + "Female": "Femme", + "High School Diploma": "Baccalauréat", + "Associate Degree": "BTS / DUT", + "Bachelor's Degree": "Licence", + "Master's Degree": "Master", + "Doctoral Degree": "Doctorat", + "Select your preferred language for the app interface.": + "Sélectionnez votre langue préférée pour l'interface.", + "Language Options": "Options de langue", + "You can claim your gift once they complete 2 trips.": + "Vous pourrez réclamer votre cadeau après qu'ils aient terminé 2 trajets.", + "Closest & Cheapest": "Le plus proche et le moins cher", + "Comfort choice": "Choix confort", + "Travel in a modern, silent electric car. A premium, eco-friendly choice for a smooth ride.": + "Voyagez dans une voiture électrique moderne et silencieuse. Un choix premium et écologique.", + "Spacious van service ideal for families and groups. Comfortable, safe, and cost-effective travel together.": + "Service de van spacieux idéal pour les familles et groupes. Confortable, sûr et économique.", + "Quiet & Eco-Friendly": "Calme et Écologique", + "Lady Captain for girls": "Chauffeur femme pour dames", + "Van for familly": "Van pour la famille", + "Are you sure to delete this location?": + "Voulez-vous vraiment supprimer ce lieu ?", + "Submit a Complaint": "Déposer une réclamation", + "Submit Complaint": "Envoyer la réclamation", + "No trip history found": "Aucun historique de trajet", + "Your past trips will appear here.": + "Vos trajets passés apparaîtront ici.", + "1. Describe Your Issue": "1. Décrivez votre problème", + "Enter your complaint here...": "Entrez votre réclamation ici...", + "2. Attach Recorded Audio": "2. Joindre l'audio enregistré", + "No audio files found.": "Aucun fichier audio trouvé.", + "Confirm Attachment": "Confirmer la pièce jointe", + "Attach this audio file?": "Joindre ce fichier audio ?", + "Uploaded": "Téléchargé", + "3. Review Details & Response": "3. Revoir les détails et la réponse", + "Date": "Date", + "Today's Promos": "Promos du jour", + "No promos available right now.": + "Aucune promo disponible pour le moment.", + "Check back later for new offers!": + "Revenez plus tard pour de nouvelles offres !", + "Valid Until:": "Valable jusqu'au :", + "CODE": "CODE", + "I Agree": "J'accepte", + "Continue": "Continuer", + "Enable Location": "Activer la localisation", + "To give you the best experience, we need to know where you are. Your location is used to find nearby captains and for pickups.": + "Pour vous offrir la meilleure expérience, nous devons savoir où vous êtes. Votre position est utilisée pour trouver des chauffeurs à proximité.", + "Allow Location Access": "Autoriser l'accès à la localisation", + "Welcome to Intaleq!": "Bienvenue sur Intaleq !", + "Before we start, please review our terms.": + "Avant de commencer, veuillez consulter nos conditions.", + "Your journey starts here": "Votre voyage commence ici", + "Cancel Search": "Annuler la recherche", + "Set pickup location": "Définir le lieu de prise en charge", + "Move the map to adjust the pin": + "Déplacez la carte pour ajuster l'épingle", + "Searching for the nearest captain...": + "Recherche du chauffeur le plus proche...", + "No one accepted? Try increasing the fare.": + "Personne n'a accepté ? Essayez d'augmenter le tarif.", + "Increase Your Trip Fee (Optional)": + "Augmentez le prix de votre trajet (Optionnel)", + "We haven't found any drivers yet. Consider increasing your trip fee to make your offer more attractive to drivers.": + "Nous n'avons pas encore trouvé de chauffeurs. Pensez à augmenter votre tarif pour rendre votre offre plus attractive.", + "No, thanks": "Non, merci", + "Increase Fee": "Augmenter le tarif", + "Copy": "Copier", + "Promo Copied!": "Promo copiée !", + "Code": "Code", + "Send Intaleq app to him": "Lui envoyer l'appli Intaleq", + "No passenger found for the given phone number": + "Aucun passager trouvé pour ce numéro", + "No user found for the given phone number": + "Aucun utilisateur trouvé pour ce numéro", + "This price is": "Ce prix est", + "Work": "Travail", + "Add Home": "Ajouter Maison", + "Notifications": "Notifications", + "💳 Pay with Credit Card": "💳 Payer par carte de crédit", + "⚠️ You need to choose an amount!": + "⚠️ Vous devez choisir un montant !", + "💰 Pay with Wallet": "💰 Payer avec le portefeuille", + "You must restart the app to change the language.": + "Vous devez redémarrer l'application pour changer la langue.", + "joined": "a rejoint", + "Driver joined the channel": "Le chauffeur a rejoint le canal", + "Driver left the channel": "Le chauffeur a quitté le canal", + "Call Page": "Page d'appel", + "Call Left": "Appels restants", + " Next as Cash !": " Suivant en espèces !", + "To use Wallet charge it": + "Pour utiliser le portefeuille, rechargez-le", + "We are searching for the nearest driver to you": + "Nous cherchons le chauffeur le plus proche", + "Best choice for cities": "Meilleur choix pour la ville", + "Rayeh Gai: Round trip service for convenient travel between cities, easy and reliable.": + "Rayeh Gai : Service aller-retour pratique pour voyager entre les villes.", + "This trip is for women only": "Ce trajet est réservé aux femmes", + "Total budgets on month": "Budgets totaux du mois", + "You have call from driver": "Vous avez un appel du chauffeur", + "Intaleq": "Intaleq", + "passenger agreement": "accord passager", + "To become a passenger, you must review and agree to the ": + "Pour devenir passager, vous devez accepter les ", + "agreement subtitle": + "Pour continuer, vous devez accepter les conditions d'utilisation et la politique de confidentialité.", + "terms of use": "conditions d'utilisation", + " and acknowledge our Privacy Policy.": + " et reconnaître notre Politique de Confidentialité.", + "and acknowledge our": "et reconnaître notre", + "privacy policy": "politique de confidentialité.", + "i agree": "j'accepte", + "Driver already has 2 trips within the specified period.": + "Le chauffeur a déjà 2 trajets dans la période spécifiée.", + "The invitation was sent successfully": + "L'invitation a été envoyée avec succès", + "You should select your country": + "Vous devez sélectionner votre pays", + "Scooter": "Scooter", + "A trip with a prior reservation, allowing you to choose the best captains and cars.": + "Un trajet avec réservation préalable, vous permettant de choisir les meilleurs chauffeurs et voitures.", + "Mishwar Vip": "Trajet VIP", + "The driver waiting you in picked location .": + "Le chauffeur vous attend au lieu de prise en charge.", + "About Us": "À propos de nous", + "You can change the vibration feedback for all buttons": + "Vous pouvez changer le retour de vibration pour tous les boutons", + "Most Secure Methods": "Méthodes les plus sécurisées", + "In-App VOIP Calls": "Appels VOIP intégrés", + "Recorded Trips for Safety": "Trajets enregistrés pour la sécurité", + "\nWe also prioritize affordability, offering competitive pricing to make your rides accessible.": + "\nNous privilégions aussi l'accessibilité, offrant des prix compétitifs.", + "Intaleq is a ride-sharing app designed with your safety and affordability in mind. We connect you with reliable drivers in your area, ensuring a convenient and stress-free travel experience.\n\nHere are some of the key features that set us apart:": + "Intaleq est une application de covoiturage conçue pour votre sécurité et votre budget. Nous vous connectons avec des chauffeurs fiables dans votre région.", + "Sign In by Apple": "Connexion via Apple", + "Sign In by Google": "Connexion via Google", + "How do I request a ride?": "Comment demander un trajet ?", + "Step-by-step instructions on how to request a ride through the Intaleq app.": + "Instructions étape par étape pour demander un trajet.", + "What types of vehicles are available?": + "Quels types de véhicules sont disponibles ?", + "Intaleq offers a variety of vehicle options to suit your needs, including economy, comfort, and luxury. Choose the option that best fits your budget and passenger count.": + "Intaleq offre diverses options de véhicules incluant éco, confort et luxe.", + "How can I pay for my ride?": "Comment payer mon trajet ?", + "Intaleq offers multiple payment methods for your convenience. Choose between cash payment or credit/debit card payment during ride confirmation.": + "Intaleq offre plusieurs méthodes de paiement. Choisissez entre espèces ou carte lors de la confirmation.", + "Can I cancel my ride?": "Puis-je annuler mon trajet ?", + "Yes, you can cancel your ride under certain conditions (e.g., before driver is assigned). See the Intaleq cancellation policy for details.": + "Oui, vous pouvez annuler votre trajet sous certaines conditions (par exemple, avant l'attribution d'un chauffeur). Consultez la politique d'annulation d'Intaleq pour plus de détails.", + "Driver Registration & Requirements": + "Inscription Chauffeur & Requis", + "How can I register as a driver?": + "Comment s'inscrire comme chauffeur ?", + "What are the requirements to become a driver?": + "Quelles sont les conditions pour devenir chauffeur ?", + "Visit our website or contact Intaleq support for information on driver registration and requirements.": + "Visitez notre site web ou contactez le support pour plus d'infos.", + "Intaleq provides in-app chat functionality to allow you to communicate with your driver or passenger during your ride.": + "Intaleq fournit une fonction de chat pour communiquer avec votre chauffeur ou passager.", + "Intaleq prioritizes your safety. We offer features like driver verification, in-app trip tracking, and emergency contact options.": + "Intaleq priorise votre sécurité avec la vérification des chauffeurs et le suivi des trajets.", + "Frequently Questions": "Questions Fréquentes", + "User does not exist.": "L'utilisateur n'existe pas.", + "We need your phone number to contact you and to help you.": + "Nous avons besoin de votre numéro pour vous contacter et vous aider.", + "You will recieve code in sms message": + "Vous recevrez un code par SMS", + "Please enter": "Veuillez entrer", + "We need your phone number to contact you and to help you receive orders.": + "Nous avons besoin de votre numéro pour vous aider à recevoir des commandes.", + "The full name on your criminal record does not match the one on your driver's license. Please verify and provide the correct documents.": + "Le nom sur le casier judiciaire ne correspond pas à celui du permis. Veuillez vérifier.", + "The national number on your driver's license does not match the one on your ID document. Please verify and provide the correct documents.": + "Le numéro national sur votre permis ne correspond pas à votre pièce d'identité.", + "Capture an Image of Your Criminal Record": + "Prendre une photo de votre casier judiciaire", + "IssueDate": "Date d'émission", + "Capture an Image of Your car license front": + "Photo recto de la carte grise", + "Capture an Image of Your ID Document front": + "Photo recto de la pièce d'identité", + "NationalID": "Numéro National / CNI", + "You can share the Intaleq App with your friends and earn rewards for rides they take using your code": + "Partagez Intaleq avec vos amis et gagnez des récompenses.", + "FullName": "Nom complet", + "No invitation found yet!": "Aucune invitation trouvée !", + "InspectionResult": "Résultat de l'inspection", + "Criminal Record": "Casier judiciaire", + "The email or phone number is already registered.": + "L'email ou le numéro de téléphone est déjà enregistré.", + "To become a ride-sharing driver on the Intaleq app, you need to upload your driver's license, ID document, and car registration document. Our AI system will instantly review and verify their authenticity in just 2-3 minutes. If your documents are approved, you can start working as a driver on the Intaleq app. Please note, submitting fraudulent documents is a serious offense and may result in immediate termination and legal consequences.": + "Pour devenir chauffeur sur Intaleq, téléchargez votre permis, pièce d'identité et carte grise. Notre IA vérifiera leur authenticité en quelques minutes. La soumission de faux documents entraînera une résiliation immédiate.", + "Documents check": "Vérification des documents", + "Driver's License": "Permis de conduire", + "for your first registration!": "pour votre première inscription !", + "Get it Now!": "Obtenez-le maintenant !", + "before": "avant", + "Code not approved": "Code non approuvé", + "3000 LE": "30 €", + "Do you have an invitation code from another driver?": + "Avez-vous un code d'invitation d'un autre chauffeur ?", + "Paste the code here": "Collez le code ici", + "No, I don't have a code": "Non, je n'ai pas de code", + "Audio uploaded successfully.": "Audio téléchargé avec succès.", + "Perfect for passengers seeking the latest car models with the freedom to choose any route they desire": + "Parfait pour les passagers cherchant des voitures récentes avec liberté d'itinéraire", + "Share this code with your friends and earn rewards when they use it!": + "Partagez ce code et gagnez des récompenses !", + "Enter phone": "Entrer téléphone", + "complete, you can claim your gift": + "terminé, vous pouvez réclamer votre cadeau", + "When": "Quand", + "Enter driver's phone": "Entrer tél. du chauffeur", + "Send Invite": "Envoyer l'invitation", + "Show Invitations": "Afficher les invitations", + "License Type": "Type de permis", + "National Number": "Numéro National", + "Name (Arabic)": "Nom (Arabe)", + "Name (English)": "Nom (Français/Anglais)", + "Address": "Adresse", + "Issue Date": "Date de délivrance", + "Expiry Date": "Date d'expiration", + "License Categories": "Catégories de permis", + "driver_license": "permis_de_conduire", + "Capture an Image of Your Driver License": + "Prendre une photo de votre permis", + "ID Documents Back": "Verso de la pièce d'identité", + "National ID": "CNI / Numéro National", + "Occupation": "Profession", + "Religion": "Religion", + "Full Name (Marital)": "Nom complet", + "Expiration Date": "Date d'expiration", + "Capture an Image of Your ID Document Back": + "Photo verso de la pièce d'identité", + "ID Documents Front": "Recto de la pièce d'identité", + "First Name": "Prénom", + "CardID": "Numéro de Carte", + "Vehicle Details Front": "Détails du véhicule (Avant)", + "Plate Number": "Numéro d'immatriculation", + "Owner Name": "Nom du propriétaire", + "Vehicle Details Back": "Détails du véhicule (Arrière)", + "Make": "Marque", + "Model": "Modèle", + "Year": "Année", + "Chassis": "Châssis", + "Color": "Couleur", + "Displacement": "Cylindrée", + "Fuel": "Carburant", + "Tax Expiry Date": "Date d'expiration de la taxe", + "Inspection Date": "Date d'inspection", + "Capture an Image of Your car license back": + "Photo verso de la carte grise", + "Capture an Image of Your Driver's License": + "Photo de votre permis de conduire", + "Sign in with Google for easier email and name entry": + "Connectez-vous avec Google pour faciliter la saisie", + "You will choose allow all the time to be ready receive orders": + "Choisissez 'Toujours autoriser' pour recevoir des commandes", + "Get to your destination quickly and easily.": + "Arrivez à destination rapidement et facilement.", + "Enjoy a safe and comfortable ride.": + "Profitez d'un trajet sûr et confortable.", + "Choose Language": "Choisir la langue", + "Pay with Wallet": "Payer avec le portefeuille", + "Invalid MPIN": "MPIN invalide", + "Invalid OTP": "OTP invalide", + "Enter your email address": "Entrez votre adresse email", + "Please enter Your Email.": "Veuillez entrer votre email.", + "Enter your phone number": "Entrez votre numéro de téléphone", + "Please enter your phone number.": + "Veuillez entrer votre numéro de téléphone.", + "Please enter Your Password.": "Veuillez entrer votre mot de passe.", + "if you dont have account": "si vous n'avez pas de compte", + "Register": "S'inscrire", + "Accept Ride's Terms & Review Privacy Notice": + "Accepter les conditions et la confidentialité", + "By selecting 'I Agree' below, I have reviewed and agree to the Terms of Use and acknowledge the Privacy Notice. I am at least 18 years of age.": + "En sélectionnant 'J'accepte', je reconnais avoir lu et accepté les conditions d'utilisation et la politique de confidentialité. J'ai au moins 18 ans.", + "First name": "Prénom", + "Enter your first name": "Entrez votre prénom", + "Please enter your first name.": "Veuillez entrer votre prénom.", + "Last name": "Nom", + "Enter your last name": "Entrez votre nom", + "Please enter your last name.": "Veuillez entrer votre nom.", + "City": "Ville", + "Please enter your City.": "Veuillez entrer votre ville.", + "Verify Email": "Vérifier l'email", + "We sent 5 digit to your Email provided": + "Nous avons envoyé 5 chiffres à votre email", + "5 digit": "5 chiffres", + "Send Verification Code": "Envoyer le code de vérification", + "Your Ride Duration is ": "La durée de votre trajet est ", + "You will be thier in": "Vous y serez dans", + "You trip distance is": "La distance de votre trajet est", + "Fee is": "Les frais sont", + "From : ": "De : ", + "To : ": "À : ", + "Add Promo": "Ajouter Promo", + "Confirm Selection": "Confirmer la sélection", + "distance is": "la distance est", + "Privacy Policy": "Politique de confidentialité", + "Intaleq LLC": "Intaleq LLC", + "Syria's pioneering ride-sharing service, proudly developed by Arabian and local owners. We prioritize being near you – both our valued passengers and our dedicated captains.": + "Service de covoiturage pionnier en France. Nous priorisons la proximité avec vous.", + "Intaleq is the first ride-sharing app in Syria, designed to connect you with the nearest drivers for a quick and convenient travel experience.": + "Intaleq est la première appli de covoiturage en France, conçue pour vous connecter aux chauffeurs les plus proches.", + "Why Choose Intaleq?": "Pourquoi choisir Intaleq ?", + "Closest to You": "Le plus proche de vous", + "We connect you with the nearest drivers for faster pickups and quicker journeys.": + "Nous vous connectons aux chauffeurs les plus proches pour des trajets plus rapides.", + "Uncompromising Security": "Sécurité sans compromis", + "Lady Captains Available": "Chauffeurs femmes disponibles", + "Recorded Trips (Voice & AI Analysis)": + "Trajets enregistrés (Analyse vocale & IA)", + "Fastest Complaint Response": "Réponse rapide aux plaintes", + "Our dedicated customer service team ensures swift resolution of any issues.": + "Notre service client assure une résolution rapide des problèmes.", + "Affordable for Everyone": "Abordable pour tous", + "Frequently Asked Questions": "Questions Fréquemment Posées", + "Getting Started": "Commencer", + "Simply open the Intaleq app, enter your destination, and tap \"Request Ride\". The app will connect you with a nearby driver.": + "Ouvrez simplement l'appli Intaleq, entrez votre destination et appuyez sur \"Commander\".", + "Vehicle Options": "Options de véhicule", + "Intaleq offers a variety of options including Economy, Comfort, and Luxury to suit your needs and budget.": + "Intaleq offre diverses options incluant Éco, Confort et Luxe pour s'adapter à vos besoins.", + "Payments": "Paiements", + "You can pay for your ride using cash or credit/debit card. You can select your preferred payment method before confirming your ride.": + "Vous pouvez payer en espèces ou par carte. Sélectionnez votre méthode préférée avant de confirmer.", + "Ride Management": "Gestion des trajets", + "Yes, you can cancel your ride, but please note that cancellation fees may apply depending on how far in advance you cancel.": + "Oui, vous pouvez annuler, mais des frais peuvent s'appliquer.", + "For Drivers": "Pour les chauffeurs", + "Driver Registration": "Inscription Chauffeur", + "To register as a driver or learn about the requirements, please visit our website or contact Intaleq support directly.": + "Pour s'inscrire comme chauffeur, visitez notre site ou contactez le support.", + "Visit Website/Contact Support": + "Visiter le site / Contacter le support", + "Close": "Fermer", + "We are searching for the nearest driver": + "Nous cherchons le chauffeur le plus proche", + "Communication": "Communication", + "How do I communicate with the other party (passenger/driver)?": + "Comment communiquer avec l'autre partie ?", + "You can communicate with your driver or passenger through the in-app chat feature once a ride is confirmed.": + "Vous pouvez communiquer via le chat intégré une fois le trajet confirmé.", + "Safety & Security": "Sûreté et Sécurité", + "What safety measures does Intaleq offer?": + "Quelles mesures de sécurité offre Intaleq ?", + "Intaleq offers various safety features including driver verification, in-app trip tracking, emergency contact options, and the ability to share your trip status with trusted contacts.": + "Intaleq offre la vérification des chauffeurs, le suivi des trajets et les contacts d'urgence.", + "Enjoy competitive prices across all trip options, making travel accessible.": + "Profitez de prix compétitifs sur tous les trajets.", + "Variety of Trip Choices": "Variété de choix de trajets", + "Choose the trip option that perfectly suits your needs and preferences.": + "Choisissez l'option de trajet qui vous convient parfaitement.", + "Your Choice, Our Priority": "Votre Choix, Notre Priorité", + "Because we are near, you have the flexibility to choose the ride that works best for you.": + "Parce que nous sommes proches, vous avez la flexibilité de choisir le meilleur trajet.", + "duration is": "la durée est", + "Setting": "Paramètre", + "Find answers to common questions": + "Trouver des réponses aux questions courantes", + "I don't need a ride anymore": "Je n'ai plus besoin de trajet", + "I was just trying the application": "J'essayais juste l'application", + "No driver accepted my request": + "Aucun chauffeur n'a accepté ma demande", + "I added the wrong pick-up/drop-off location": + "J'ai mis le mauvais lieu de prise en charge/dépose", + "I don't have a reason": "Je n'ai pas de raison", + "Can we know why you want to cancel Ride ?": + "Pouvons-nous savoir pourquoi vous voulez annuler ?", + "Add Payment Method": "Ajouter une méthode de paiement", + "Ride Wallet": "Portefeuille Trajet", + "Payment Method": "Méthode de paiement", + "Type here Place": "Tapez le lieu ici", + "Are You sure to ride to": "Êtes-vous sûr d'aller à", + "Confirm": "Confirmer", + "You are Delete": "Vous supprimez", + "Deleted": "Supprimé", + "You Dont Have Any places yet !": "Vous n'avez pas encore de lieux !", + "From : Current Location": "De : Position actuelle", + "My Cared": "Mes Cartes", + "Add Card": "Ajouter une carte", + "Add Credit Card": "Ajouter une carte de crédit", + "Please enter the cardholder name": + "Veuillez entrer le nom du titulaire", + "Please enter the expiry date": + "Veuillez entrer la date d'expiration", + "Please enter the CVV code": "Veuillez entrer le code CVV", + "Go To Favorite Places": "Aller aux lieux favoris", + "Go to this Target": "Aller à cette destination", + "My Profile": "Mon Profil", + "Are you want to go to this site": "Voulez-vous aller à ce site", + "MyLocation": "MaPosition", + "my location": "ma position", + "Target": "Destination", + "You Should choose rate figure": "Vous devez choisir une note", + "Login Captin": "Connexion Chauffeur", + "Register Captin": "Inscription Chauffeur", + "Send Verfication Code": "Envoyer le code de vérification", + "KM": "KM", + "End Ride": "Fin du trajet", + "Minute": "Minute", + "Go to passenger Location now": + "Allez à la position du passager maintenant", + "Duration of the Ride is ": "La durée du trajet est ", + "Distance of the Ride is ": "La distance du trajet est ", + "Name of the Passenger is ": "Le nom du passager est ", + "Hello this is Captain": "Bonjour c'est le Chauffeur", + "Start the Ride": "Démarrer la course", + "Please Wait If passenger want To Cancel!": + "Veuillez patienter si le passager veut annuler !", + "Total Duration:": "Durée totale :", + "Active Duration:": "Durée active :", + "Waiting for Captin ...": "En attente du chauffeur...", + "Age is ": "L'âge est ", + "Rating is ": "La note est ", + " to arrive you.": " pour arriver à vous.", + "Tariff": "Tarif", + "Settings": "Paramètres", + "Feed Back": "Avis", + "Please enter a valid 16-digit card number": + "Veuillez entrer un numéro de carte valide à 16 chiffres", + "Add Phone": "Ajouter téléphone", + "Please enter a phone number": + "Veuillez entrer un numéro de téléphone", + "You dont Add Emergency Phone Yet!": + "Vous n'avez pas encore ajouté de téléphone d'urgence !", + "You will arrive to your destination after ": + "Vous arriverez à destination après ", + "You can cancel Ride now": "Vous pouvez annuler le trajet maintenant", + "You Can cancel Ride After Captain did not come in the time": + "Vous pouvez annuler si le chauffeur ne vient pas à temps", + "If you in Car Now. Press Start The Ride": + "Si vous êtes en voiture, appuyez sur Démarrer", + "You Dont Have Any amount in": "Vous n'avez aucun montant dans", + "Wallet!": "Portefeuille !", + "You Have": "Vous avez", + "Save Credit Card": "Enregistrer la carte", + "Show Promos": "Voir les Promos", + "10 and get 4% discount": "10 et obtenez 4% de réduction", + "20 and get 6% discount": "20 et obtenez 6% de réduction", + "40 and get 8% discount": "40 et obtenez 8% de réduction", + "100 and get 11% discount": "100 et obtenez 11% de réduction", + "Pay with Your PayPal": "Payer avec PayPal", + "You will choose one of above !": + "Vous devez choisir l'un des choix ci-dessus !", + "Edit Profile": "Modifier le profil", + "Copy this Promo to use it in your Ride!": + "Copiez cette promo pour l'utiliser !", + "To change some Settings": "Pour changer certains paramètres", + "Order Request Page": "Page de demande de commande", + "Rouats of Trip": "Itinéraires du trajet", + "Passenger Name is ": "Le nom du passager est ", + "Total From Passenger is ": "Total du passager est ", + "Duration To Passenger is ": "Durée vers le passager est ", + "Distance To Passenger is ": "Distance vers le passager est ", + "Total For You is ": "Total pour vous est ", + "Distance is ": "Distance est ", + " KM": " KM", + "Duration of Trip is ": "Durée du trajet est ", + " Minutes": " Minutes", + "Apply Order": "Accepter la commande", + "Refuse Order": "Refuser la commande", + "Rate Captain": "Noter le chauffeur", + "Enter your Note": "Entrez votre note", + "Type something...": "Tapez quelque chose...", + "Submit rating": "Envoyer la note", + "Rate Passenger": "Noter le passager", + "Ride Summary": "Résumé du trajet", + "welcome_message": "Bienvenue sur Intaleq !", + "app_description": + "Intaleq est une appli de covoiturage fiable et sûre.", + "get_to_destination": "Arrivez à destination rapidement.", + "get_a_ride": "Avec Intaleq, obtenez un trajet en quelques minutes.", + "safe_and_comfortable": "Profitez d'un trajet sûr et confortable.", + "committed_to_safety": "Intaleq s'engage pour la sécurité.", + "your ride is Accepted": "votre trajet est Accepté", + "Driver is waiting at pickup.": + "Le chauffeur attend au point de rendez-vous.", + "Driver is on the way": "Le chauffeur est en route", + "Contact Options": "Options de contact", + "Send a custom message": "Envoyer un message personnalisé", + "Type your message": "Tapez votre message", + "I will go now": "J'y vais maintenant", + "You Have Tips": "Vous avez des pourboires", + " tips\nTotal is": " pourboires\nLe total est", + "Your fee is ": "Vos frais sont ", + "Do you want to pay Tips for this Driver": + "Voulez-vous donner un pourboire ?", + "Tip is ": "Le pourboire est ", + "Are you want to wait drivers to accept your order": + "Voulez-vous attendre que les chauffeurs acceptent ?", + "This price is fixed even if the route changes for the driver.": + "Ce prix est fixe même si l'itinéraire change.", + "The price may increase if the route changes.": + "Le prix peut augmenter si l'itinéraire change.", + "The captain is responsible for the route.": + "Le chauffeur est responsable de l'itinéraire.", + "We are search for nearst driver": + "Nous cherchons le chauffeur le plus proche", + "Your order is being prepared": "Votre commande est en préparation", + "The drivers are reviewing your request": + "Les chauffeurs examinent votre demande", + "Your order sent to drivers": + "Votre commande a été envoyée aux chauffeurs", + "You can call or record audio of this trip": + "Vous pouvez appeler ou enregistrer l'audio", + "The trip has started! Feel free to contact emergency numbers, share your trip, or activate voice recording for the journey": + "Le trajet a commencé ! N'hésitez pas à contacter les urgences ou partager votre trajet.", + "Camera Access Denied.": "Accès caméra refusé.", + "Open Settings": "Ouvrir les paramètres", + "GPS Required Allow !.": "GPS requis, autorisez-le !", + "Your Account is Deleted": "Votre compte est supprimé", + "Are you sure to delete your account?": + "Êtes-vous sûr de supprimer votre compte ?", + "Your data will be erased after 2 weeks\nAnd you will can't return to use app after 1 month ": + "Vos données seront effacées après 2 semaines\nVous ne pourrez plus utiliser l'appli après 1 mois ", + "Enter Your First Name": "Entrez votre prénom", + "Are you Sure to LogOut?": "Êtes-vous sûr de vous déconnecter ?", + "Email Wrong": "Email incorrect", + "Email you inserted is Wrong.": "L'email inséré est incorrect.", + "You have finished all times ": + "Vous avez épuisé toutes les tentatives ", + "if you want help you can email us here": + "si vous voulez de l'aide, écrivez-nous ici", + "Thanks": "Merci", + "Email Us": "Envoyez-nous un email", + "I cant register in your app in face detection ": + "Je ne peux pas m'inscrire à cause de la détection faciale ", + "Hi": "Bonjour", + "No face detected": "Aucun visage détecté", + "Image detecting result is ": "Le résultat de détection d'image est ", + "from 3 times Take Attention": "sur 3 fois, faites attention", + "Be sure for take accurate images please\nYou have": + "Assurez-vous de prendre des images précises svp\nVous avez", + "image verified": "image vérifiée", + "Next": "Suivant", + "There is no help Question here": + "Il n'y a pas de question d'aide ici", + "You dont have Points": "Vous n'avez pas de points", + "You Are Stopped For this Day !": + "Vous êtes arrêté pour aujourd'hui !", + "You must be charge your Account": + "Vous devez recharger votre compte", + "You Refused 3 Rides this Day that is the reason \nSee you Tomorrow!": + "Vous avez refusé 3 trajets aujourd'hui \nÀ demain !", + "Recharge my Account": "Recharger mon compte", + "Ok , See you Tomorrow": "Ok, à demain", + "You are Stopped": "Vous êtes arrêté", + "Connected": "Connecté", + "Not Connected": "Non connecté", + "Your are far from passenger location": "Vous êtes loin du passager", + "go to your passenger location before\nPassenger cancel trip": + "allez vers le passager avant qu'il n'annule", + "You will get cost of your work for this trip": + "Vous serez payé pour ce trajet", + " in your wallet": " dans votre portefeuille", + "you gain": "vous gagnez", + "Order Cancelled by Passenger": "Commande annulée par le passager", + "Feedback data saved successfully": + "Données d'avis enregistrées avec succès", + "No Promo for today .": "Pas de promo pour aujourd'hui.", + "Select your destination": "Sélectionnez votre destination", + "Search for your Start point": "Recherchez votre point de départ", + "Search for waypoint": "Recherchez un point de passage", + "Current Location": "Position actuelle", + "Add Location 1": "Ajouter Lieu 1", + "You must Verify email !.": "Vous devez vérifier l'email !", + "Cropper": "Recadrer", + "Saved Sucssefully": "Enregistré avec succès", + "Select Date": "Sélectionner la date", + "Birth Date": "Date de naissance", + "Ok": "Ok", + "the 500 points equal 30 JOD": "les 500 points égalent 30 €", + "the 500 points equal 30 JOD for you \nSo go and gain your money": + "les 500 points égalent 30 € pour vous \nAlors allez gagner votre argent", + "token updated": "jeton mis à jour", + "Add Location 2": "Ajouter Lieu 2", + "Add Location 3": "Ajouter Lieu 3", + "Add Location 4": "Ajouter Lieu 4", + "Waiting for your location": "En attente de votre position", + "Search for your destination": "Recherchez votre destination", + "Hi! This is": "Salut ! C'est", + " I am using": " J'utilise", + " to ride with": " pour rouler avec", + " as the driver.": " comme chauffeur.", + "is driving a ": "conduit une ", + " with license plate ": " immatriculée ", + " I am currently located at ": " Je suis actuellement à ", + "Please go to Car now ": "Veuillez aller à la voiture maintenant ", + "You will receive a code in WhatsApp Messenger": + "Vous recevrez un code sur WhatsApp", + "If you need assistance, contact us": + "Si vous avez besoin d'aide, contactez-nous", + "Promo Ended": "Promo terminée", + "Enter the promo code and get": "Entrez le code promo et obtenez", + "DISCOUNT": "REMISE", + "No wallet record found": + "Aucun enregistrement de portefeuille trouvé", + "for": "pour", + "Intaleq is the safest ride-sharing app that introduces many features for both captains and passengers. We offer the lowest commission rate of just 8%, ensuring you get the best value for your rides. Our app includes insurance for the best captains, regular maintenance of cars with top engineers, and on-road services to ensure a respectful and high-quality experience for all users.": + "Intaleq est l'appli de covoiturage la plus sûre avec de nombreuses fonctionnalités. Nous offrons le taux de commission le plus bas de seulement 8%.", + "You can contact us during working hours from 12:00 - 19:00.": + "Vous pouvez nous contacter de 12h00 à 19h00.", + "Choose a contact option": "Choisissez une option de contact", + "Work time is from 12:00 - 19:00.\nYou can send a WhatsApp message or email.": + "Heures de travail de 12h00 à 19h00.\nVous pouvez envoyer un WhatsApp ou email.", + "Promo code copied to clipboard!": "Code promo copié !", + "Copy Code": "Copier le code", + "Your invite code was successfully applied!": + "Votre code d'invitation a été appliqué !", + "Payment Options": "Options de paiement", + "wait 1 minute to receive message": + "attendez 1 minute pour recevoir le message", + "You have copied the promo code.": "Vous avez copié le code promo.", + "Select Payment Amount": "Sélectionner le montant du paiement", + "The promotion period has ended.": + "La période de promotion est terminée.", + "Promo Code Accepted": "Code promo accepté", + "Tap on the promo code to copy it!": + "Appuyez sur le code promo pour le copier !", + "Lowest Price Achieved": "Prix le plus bas atteint", + "Cannot apply further discounts.": + "Impossible d'appliquer plus de remises.", + "Promo Already Used": "Promo déjà utilisée", + "Invitation Used": "Invitation utilisée", + "You have already used this promo code.": + "Vous avez déjà utilisé ce code promo.", + "Insert Your Promo Code": "Insérez votre code promo", + "Enter promo code here": "Entrez le code promo ici", + "Please enter a valid promo code": + "Veuillez entrer un code promo valide", + "Awfar Car": "Voiture Éco", + "Old and affordable, perfect for budget rides.": + "Abordable, parfait pour les petits budgets.", + " If you need to reach me, please contact the driver directly at": + " Si vous devez me joindre, contactez le chauffeur au", + "No Car or Driver Found in your area.": + "Aucune voiture ou chauffeur trouvé dans votre zone.", + "Please Try anther time ": "Veuillez réessayer une autre fois ", + "There no Driver Aplly your order sorry for that ": + "Aucun chauffeur n'a pris votre commande, désolé ", + "Trip Cancelled": "Trajet annulé", + "The Driver Will be in your location soon .": + "Le chauffeur sera bientôt là.", + "The distance less than 500 meter.": + "La distance est inférieure à 500 mètres.", + "Promo End !": "Fin de la promo !", + "There is no notification yet": "Il n'y a pas encore de notification", + "Use Touch ID or Face ID to confirm payment": + "Utilisez Touch ID ou Face ID pour confirmer", + "Contact us for any questions on your order.": + "Contactez-nous pour toute question.", + "Pyament Cancelled .": "Paiement annulé.", + "type here": "tapez ici", + "Scan Driver License": "Scanner le permis", + "Please put your licence in these border": + "Veuillez mettre votre permis dans ce cadre", + "Camera not initialized yet": "Caméra non initialisée", + "Take Image": "Prendre une photo", + "AI Page": "Page IA", + "Take Picture Of ID Card": "Photo de la pièce d'identité", + "Take Picture Of Driver License Card": "Photo du permis de conduire", + "We are process picture please wait ": + "Traitement de l'image en cours, veuillez patienter ", + "There is no data yet.": "Il n'y a pas encore de données.", + "Name :": "Nom :", + "Drivers License Class: ": "Classe de permis :", + "Document Number: ": "Numéro de document :", + "Address: ": "Adresse :", + "Height: ": "Taille :", + "Expiry Date: ": "Date d'expiration :", + "Date of Birth: ": "Date de naissance :", + "You can't continue with us .\nYou should renew Driver license": + "Vous ne pouvez pas continuer.\nVous devez renouveler votre permis", + "Detect Your Face ": "Détecter votre visage ", + "Go to next step\nscan Car License.": + "Étape suivante\nscanner la carte grise.", + "Name in arabic": "Nom en arabe", + "Drivers License Class": "Classe de permis", + "Selected Date": "Date sélectionnée", + "Select Time": "Sélectionner l'heure", + "Selected Time": "Heure sélectionnée", + "Selected Date and Time": "Date et heure sélectionnées", + "Lets check Car license ": "Vérifions la carte grise ", + "Car": "Voiture", + "Plate": "Plaque", + "Rides": "Trajets", + "Selected driver": "Chauffeur sélectionné", + "Lets check License Back Face": "Vérifions le verso du permis", + "Car License Card": "Carte Grise", + "No image selected yet": "Aucune image sélectionnée", + "Made :": "Marque :", + "model :": "Modèle :", + "VIN :": "VIN :", + "year :": "Année :", + "ُExpire Date": "Date d'expiration", + "Login Driver": "Connexion Chauffeur", + "Password must br at least 6 character.": + "Le mot de passe doit avoir au moins 6 caractères.", + "if you don't have account": "si vous n'avez pas de compte", + "Here recorded trips audio": "Ici l'audio des trajets enregistrés", + "Register as Driver": "S'inscrire comme chauffeur", + "By selecting \"I Agree\" below, I have reviewed and agree to the Terms of Use and acknowledge the ": + "En sélectionnant \"J'accepte\", j'accepte les conditions d'utilisation et reconnais ", + "Log Out Page": "Page de déconnexion", + "Log Off": "Déconnexion", + "Register Driver": "Inscrire Chauffeur", + "Verify Email For Driver": "Vérifier l'email pour le chauffeur", + "Admin DashBoard": "Tableau de bord Admin", + "Your name": "Votre nom", + "your ride is applied": "votre trajet est demandé", + "H and": "H et", + "JOD": "€", + "m": "m", + "We search nearst Driver to you": + "Nous cherchons le chauffeur le plus proche", + "please wait till driver accept your order": + "veuillez attendre que le chauffeur accepte", + "No accepted orders? Try raising your trip fee to attract riders.": + "Pas de commande acceptée ? Essayez d'augmenter votre tarif.", + "You should select one": "Vous devez en sélectionner un", + "The driver accept your order for": + "Le chauffeur accepte votre commande pour", + "The driver on your way": "Le chauffeur est en route", + "Total price from ": "Prix total de ", + "Order Details Intaleq": "Détails Commande Intaleq", + "Selected file:": "Fichier sélectionné :", + "Your trip cost is": "Le coût de votre trajet est", + "this will delete all files from your device": + "cela supprimera tous les fichiers de votre appareil", + "Exclusive offers and discounts always with the Intaleq app": + "Offres exclusives et remises toujours avec l'appli Intaleq", + "Submit Question": "Soumettre une question", + "Please enter your Question.": "Veuillez entrer votre question.", + "Help Details": "Détails de l'aide", + "No trip yet found": "Aucun trajet trouvé", + "No Response yet.": "Pas encore de réponse.", + " You Earn today is ": " Vous avez gagné aujourd'hui ", + " You Have in": " Vous avez dans", + "Total points is ": "Total des points est ", + "Total Connection Duration:": "Durée totale de connexion :", + "Passenger name : ": "Nom du passager : ", + "Cost Of Trip IS ": "Le coût du trajet est ", + "Arrival time": "Heure d'arrivée", + "arrival time to reach your point": + "heure d'arrivée pour atteindre votre point", + "For Intaleq and scooter trips, the price is calculated dynamically. For Comfort trips, the price is based on time and distance": + "Pour Intaleq et scooter, le prix est dynamique. Pour Confort, basé sur le temps et la distance.", + "Hello this is Driver": "Bonjour c'est le chauffeur", + "Is the Passenger in your Car ?": + "Le passager est-il dans votre voiture ?", + "Please wait for the passenger to enter the car before starting the trip.": + "Veuillez attendre que le passager monte avant de démarrer.", + "No ,still Waiting.": "Non, j'attends toujours.", + "I arrive you": "Je suis arrivé", + "I Arrive your site": "Je suis arrivé à votre emplacement", + "You are not in near to passenger location": + "Vous n'êtes pas proche du passager", + "please go to picker location exactly": + "veuillez aller exactement au lieu de prise en charge", + "You Can Cancel Trip And get Cost of Trip From": + "Vous pouvez annuler et obtenir le coût de", + "Are you sure to cancel?": "Êtes-vous sûr d'annuler ?", + "Insert Emergincy Number": "Insérer numéro d'urgence", + "Best choice for comfort car and flexible route and stops point": + "Meilleur choix pour voiture confort et itinéraire flexible", + "Insert": "Insérer", + "This is for scooter or a motorcycle.": + "Ceci est pour un scooter ou une moto.", + "This trip goes directly from your starting point to your destination for a fixed price. The driver must follow the planned route": + "Trajet direct à prix fixe. Le chauffeur doit suivre l'itinéraire.", + "You can decline a request without any cost": + "Vous pouvez refuser une demande sans frais", + "Perfect for adventure seekers who want to experience something new and exciting": + "Parfait pour les amateurs d'aventure", + "My current location is:": "Ma position actuelle est :", + "and I have a trip on": "et j'ai un trajet sur", + "App with Passenger": "Appli avec Passager", + "You will be pay the cost to driver or we will get it from you on next trip": + "Vous paierez le chauffeur ou nous le récupérerons au prochain trajet", + "Trip has Steps": "Le trajet a des étapes", + "Distance from Passenger to destination is ": + "La distance du passager à la destination est ", + "price is": "le prix est", + "This ride type does not allow changes to the destination or additional stops": + "Ce type de trajet ne permet pas de changements", + "This price may be changed": "Ce prix peut changer", + "No SIM card, no problem! Call your driver directly through our app. We use advanced technology to ensure your privacy.": + "Pas de SIM ? Appelez votre chauffeur via l'appli.", + "This ride type allows changes, but the price may increase": + "Ce type permet des changements, mais le prix peut augmenter", + "Select one message": "Sélectionnez un message", + "I'm waiting for you": "Je vous attends", + "We noticed the Intaleq is exceeding 100 km/h. Please slow down for your safety. If you feel unsafe, you can share your trip details with a contact or call the police using the red SOS button.": + "Nous avons remarqué une vitesse excessive (>100 km/h). Ralentissez svp.", + "Warning: Intaleqing detected!": "Attention : Intaleqing détecté !", + "Please help! Contact me as soon as possible.": + "Aidez-moi ! Contactez-moi dès que possible.", + "Share Trip Details": "Partager les détails du trajet", + "Car Plate is ": "La plaque est ", + "the 300 points equal 300 L.E for you \nSo go and gain your money": + "les 300 points égalent 300 € pour vous \nAlors allez gagner votre argent", + "the 300 points equal 300 L.E": "les 300 points égalent 300 €", + "The payment was not approved. Please try again.": + "Le paiement n'a pas été approuvé. Réessayez.", + "Payment Failed": "Paiement échoué", + "This is a scheduled notification.": + "Ceci est une notification programmée.", + "An error occurred during the payment process.": + "Une erreur est survenue durant le paiement.", + "The payment was approved.": "Le paiement a été approuvé.", + "Payment Successful": "Paiement réussi", + "No ride found yet": "Aucun trajet trouvé", + "Accept Order": "Accepter la commande", + "Bottom Bar Example": "Exemple de barre inférieure", + "Driver phone": "Tél. du chauffeur", + "Statistics": "Statistiques", + "Origin": "Origine", + "Destination": "Destination", + "Driver Name": "Nom du chauffeur", + "Driver Car Plate": "Plaque du chauffeur", + "Available for rides": "Disponible pour des trajets", + "Scan Id": "Scanner ID", + "Camera not initilaized yet": "Caméra non initialisée", + "Scan ID MklGoogle": "Scan ID MklGoogle", + "Language": "Langue", + "Jordan": "Jordanie", + "USA": "USA", + "Egypt": "Égypte", + "Turkey": "Turquie", + "Saudi Arabia": "Arabie Saoudite", + "Qatar": "Qatar", + "Bahrain": "Bahreïn", + "Kuwait": "Koweït", + "But you have a negative salary of": + "Mais vous avez un salaire négatif de", + "Promo Code": "Code Promo", + "Your trip distance is": "Votre distance de trajet est", + "Enter promo code": "Entrer code promo", + "You have promo!": "Vous avez une promo !", + "Cost Duration": "Coût Durée", + "Duration is": "La durée est", + "Leave": "Quitter", + "Join": "Rejoindre", + "Heading your way now. Please be ready.": "J'arrive. Soyez prêt svp.", + "Approaching your area. Should be there in 3 minutes.": + "J'approche. Là dans 3 minutes.", + "There's heavy traffic here. Can you suggest an alternate pickup point?": + "Trafic dense ici. Pouvez-vous suggérer un autre point ?", + "This ride is already taken by another driver.": + "Ce trajet est déjà pris.", + "You Should be select reason.": "Vous devez sélectionner une raison.", + "Waiting for Driver ...": "En attente du chauffeur...", + "Latest Recent Trip": "Dernier trajet récent", + "from your list": "de votre liste", + "Do you want to change Work location": + "Voulez-vous changer le lieu de travail", + "Do you want to change Home location": + "Voulez-vous changer le domicile", + "We Are Sorry That we dont have cars in your Location!": + "Désolé, pas de voitures dans votre zone !", + "Choose from Map": "Choisir sur la carte", + "Pick your ride location on the map - Tap to confirm": + "Choisissez votre lieu sur la carte - Appuyez pour confirmer", + "Intaleq is the ride-hailing app that is safe, reliable, and accessible.": + "Intaleq est l'appli de transport sûre et fiable.", + "With Intaleq, you can get a ride to your destination in minutes.": + "Avec Intaleq, obtenez un trajet en quelques minutes.", + "Intaleq is committed to safety, and all of our captains are carefully screened and background checked.": + "Intaleq s'engage pour la sécurité, tous nos chauffeurs sont vérifiés.", + "Pick from map": "Choisir sur la carte", + "No Car in your site. Sorry!": + "Pas de voiture à votre emplacement. Désolé !", + "Nearest Car for you about ": "Voiture la plus proche à environ ", + "From :": "De :", + "Get Details of Trip": "Obtenir les détails du trajet", + "If you want add stop click here": + "Si vous voulez ajouter un arrêt cliquez ici", + "Where you want go ": "Où voulez-vous aller ", + "My Card": "Ma Carte", + "Start Record": "Démarrer l'enregistrement", + "History of Trip": "Historique du trajet", + "Helping Center": "Centre d'aide", + "Record saved": "Enregistrement sauvegardé", + "Trips recorded": "Trajets enregistrés", + "Select Your Country": "Sélectionnez votre pays", + "To ensure you receive the most accurate information for your location, please select your country below. This will help tailor the app experience and content to your country.": + "Pour assurer des infos précises, sélectionnez votre pays.", + "Are you sure to delete recorded files": + "Êtes-vous sûr de supprimer les fichiers ?", + "Select recorded trip": "Sélectionner le trajet enregistré", + "Card Number": "Numéro de carte", + "Hi, Where to ": "Salut, on va où ", + "Pick your destination from Map": + "Choisissez votre destination sur la carte", + "Add Stops": "Ajouter des arrêts", + "Get Direction": "Obtenir l'itinéraire", + "Add Location": "Ajouter un lieu", + "Switch Rider": "Changer de passager", + "You will arrive to your destination after timer end.": + "Vous arriverez après la fin du minuteur.", + "You can cancel trip": "Vous pouvez annuler le trajet", + "The driver waitting you in picked location .": + "Le chauffeur vous attend au lieu choisi.", + "Pay with Your": "Payer avec votre", + "Pay with Credit Card": "Payer par carte de crédit", + "Show Promos to Charge": "Afficher les promos pour recharger", + "Point": "Point", + "How many hours would you like to wait?": + "Combien d'heures voulez-vous attendre ?", + "Driver Wallet": "Portefeuille Chauffeur", + "Choose between those Type Cars": + "Choisissez parmi ces types de voitures", + "hour": "heure", + "Select Waiting Hours": "Sélectionner les heures d'attente", + "Total Points is": "Total des points est", + "You will receive a code in SMS message": + "Vous recevrez un code par SMS", + "Done": "Fait", + "Total Budget from trips is ": "Budget total des trajets est ", + "Total Amount:": "Montant total :", + "Total Budget from trips by\nCredit card is ": + "Budget total par\nCarte de crédit est ", + "This amount for all trip I get from Passengers": + "Ce montant pour tous les trajets des passagers", + "Pay from my budget": "Payer de mon budget", + "This amount for all trip I get from Passengers and Collected For me in": + "Ce montant collecté pour moi dans", + "You can buy points from your budget": + "Vous pouvez acheter des points de votre budget", + "insert amount": "insérer le montant", + "You can buy Points to let you online\nby this list below": + "Vous pouvez acheter des points pour rester en ligne\nvia cette liste", + "Create Wallet to receive your money": + "Créer un portefeuille pour recevoir votre argent", + "Enter your feedback here": "Entrez votre avis ici", + "Please enter your feedback.": "Veuillez entrer votre avis.", + "Feedback": "Avis", + "Submit ": "Envoyer ", + "Click here to Show it in Map": "Cliquez ici pour voir sur la carte", + "Canceled": "Annulé", + "No I want": "Non je veux", + "Email is": "L'email est :", + "Phone Number is": "Le numéro est :", + "Date of Birth is": "Date de naissance :", + "Sex is ": "Le sexe est : ", + "Car Details": "Détails de la voiture", + "VIN is": "VIN est :", + "Color is ": "La couleur est : ", + "Make is ": "La marque est : ", + "Model is": "Le modèle est :", + "Year is": "L'année est :", + "Expiration Date ": "Date d'expiration : ", + "Edit Your data": "Modifier vos données", + "write vin for your car": "écrire le VIN de votre voiture", + "VIN": "VIN", + "Please verify your identity": "Veuillez vérifier votre identité", + "write Color for your car": "écrire la couleur de votre voiture", + "write Make for your car": "écrire la marque de votre voiture", + "write Model for your car": "écrire le modèle de votre voiture", + "write Year for your car": "écrire l'année de votre voiture", + "write Expiration Date for your car": "écrire la date d'expiration", + "Tariffs": "Tarifs", + "Minimum fare": "Tarif minimum", + "Maximum fare": "Tarif maximum", + "Flag-down fee": "Prise en charge", + "Including Tax": "Taxes incluses", + "BookingFee": "Frais de réservation", + "Morning": "Matin", + "from 07:30 till 10:30 (Thursday, Friday, Saturday, Monday)": + "de 07:30 à 10:30", + "Evening": "Soir", + "from 12:00 till 15:00 (Thursday, Friday, Saturday, Monday)": + "de 12:00 à 15:00", + "Night": "Nuit", + "You have in account": "Vous avez sur le compte", + "Select Country": "Sélectionner le pays", + "Ride Today : ": "Trajet Aujourd'hui : ", + "After this period\nYou can't cancel!": + "Après cette période\nVous ne pouvez plus annuler !", + "from 23:59 till 05:30": "de 23:59 à 05:30", + "Rate Driver": "Noter le chauffeur", + "Total Cost is ": "Coût total est ", + "Write note": "Écrire une note", + "Time to arrive": "Heure d'arrivée", + "Ride Summaries": "Résumés des trajets", + "Total Cost": "Coût Total", + "Average of Hours of": "Moyenne des heures de", + " is ON for this month": " est ON pour ce mois", + "Days": "Jours", + "Total Hours on month": "Heures totales sur le mois", + "Counts of Hours on days": "Comptes des heures sur les jours", + "OrderId": "ID Commande", + "created time": "heure de création", + "Intaleq Over": "Intaleq Terminé", + "I will slow down": "Je vais ralentir", + "Map Passenger": "Carte Passager", + "Be Slowly": "Doucement", + "If you want to make Google Map App run directly when you apply order": + "Si vous voulez lancer Google Maps directement", + "You can change the language of the app": + "Vous pouvez changer la langue de l'appli", + "Your Budget less than needed": "Votre budget est insuffisant", + "You can change the Country to get all features": + "Changez de pays pour toutes les fonctionnalités", + "There is no Car or Driver in your area.": + "Il n'y a pas de voiture ou de chauffeur dans votre zone.", + "Change Country": "Changer de pays", + }, + "de": { + "1 Passenger": "1 Passenger", + "2 Passengers": "2 Passengers", + "3 Passengers": "3 Passengers", + "4 Passengers": "4 Passengers", + "2. Attach Recorded Audio (Optional)": + "2. Attach Recorded Audio (Optional)", + "Account": "Account", + "Actions": "Actions", + "Active Users": "Active Users", + "Add a Stop": "Add a Stop", + "Add a new waypoint stop": "Add a new waypoint stop", + "After this period\nYou can\'t cancel!": + "After this period\nYou can\'t cancel!", + "Age is": "Age is", + "Alert": "Alert", + "An OTP has been sent to your number.": + "An OTP has been sent to your number.", + "An error occurred": "An error occurred", + "Appearance": "Appearance", + "Are you sure you want to delete this file?": + "Are you sure you want to delete this file?", + "Are you sure you want to logout?": + "Are you sure you want to logout?", + "Arrived": "Arrived", + "Audio Recording": "Audio Recording", + "Call": "Call", + "Call Support": "Call Support", + "Call left": "Call left", + "Change Photo": "Change Photo", + "Choose from Gallery": "Choose from Gallery", + "Choose from contact": "Choose from contact", + "Click to track the trip": "Click to track the trip", + "Close panel": "Close panel", + "Coming": "Coming", + "Complete Payment": "Complete Payment", + "Confirm Cancellation": "Confirm Cancellation", + "Confirm Pickup Location": "Confirm Pickup Location", + "Connection failed. Please try again.": + "Connection failed. Please try again.", + "Could not create ride. Please try again.": + "Could not create ride. Please try again.", + "Crop Photo": "Crop Photo", + "Dark Mode": "Dark Mode", + "Delete": "Delete", + "Delete Account": "Delete Account", + "Delete All": "Delete All", + "Delete All Recordings?": "Delete All Recordings?", + "Delete Recording?": "Delete Recording?", + "Destination Set": "Destination Set", + "Distance": "Distance", + "Double tap to open search or enter destination": + "Double tap to open search or enter destination", + "Double tap to set or change this waypoint on the map": + "Double tap to set or change this waypoint on the map", + "Drawing route on map...": "Drawing route on map...", + "Driver Phone": "Driver Phone", + "Driver is Going To You": "Driver is Going To You", + "Emergency Mode Triggered": "Emergency Mode Triggered", + "Emergency SOS": "Emergency SOS", + "Enter the 5-digit code": "Enter the 5-digit code", + "Enter your City": "Enter your City", + "Enter your Password": "Enter your Password", + "Failed to book trip: \$e": "Failed to book trip: \$e", + "Failed to get location": "Failed to get location", + "Failed to initiate payment. Please try again.": + "Failed to initiate payment. Please try again.", + "Failed to send OTP": "Failed to send OTP", + "Failed to upload photo": "Failed to upload photo", + "Finished": "Finished", + "Fixed Price": "Fixed Price", + "General": "General", + "Grant": "Grant", + "Have a Promo Code?": "Have a Promo Code?", + "Hello! I\'m inviting you to try Intaleq.": + "Hello! I\'m inviting you to try Intaleq.", + "Hi ,I Arrive your site": "Hi ,I Arrive your site", + "Hi, Where to": "Hi, Where to", + "Home": "Home", + "I am currently located at": "I am currently located at", + "I'm Safe": "I'm Safe", + "If you need to reach me, please contact the driver directly at": + "If you need to reach me, please contact the driver directly at", + "Image Upload Failed": "Image Upload Failed", + "Intaleq Passenger": "Intaleq Passenger", + "Invite": "Invite", + "Join a channel": "Join a channel", + "Last Name": "Last Name", + "Leave a detailed comment (Optional)": + "Leave a detailed comment (Optional)", + "Light Mode": "Light Mode", + "Listen": "Listen", + "Location": "Location", + "Location Received": "Location Received", + "Logout": "Logout", + "Map Error": "Map Error", + "Message": "Message", + "Move map to select destination": "Move map to select destination", + "Move map to set start location": "Move map to set start location", + "Move map to set stop": "Move map to set stop", + "Move map to your home location": "Move map to your home location", + "Move map to your pickup point": "Move map to your pickup point", + "Move map to your work location": "Move map to your work location", + "N/A": "N/A", + "No Notifications": "No Notifications", + "No Recordings Found": "No Recordings Found", + "No Rides now!": "No Rides now!", + "No contacts available": "No contacts available", + "No i want": "No i want", + "No notification data found.": "No notification data found.", + "No routes available for this destination.": + "No routes available for this destination.", + "No user found": "No user found", + "No,I want": "No,I want", + "No.Iwant Cancel Trip.": "No.Iwant Cancel Trip.", + "Now move the map to your pickup point": + "Now move the map to your pickup point", + "Now set the pickup point for the other person": + "Now set the pickup point for the other person", + "On Trip": "On Trip", + "Open": "Open", + "Open destination search": "Open destination search", + "Open in Google Maps": "Open in Google Maps", + "Order VIP Canceld": "Order VIP Canceld", + "Passenger": "Passenger", + "Passenger cancel order": "Passenger cancel order", + "Pay by MTN Wallet": "Pay by MTN Wallet", + "Pay by Sham Cash": "Pay by Sham Cash", + "Pay by Syriatel Wallet": "Pay by Syriatel Wallet", + "Pay with PayPal": "Pay with PayPal", + "Phone": "Phone", + "Phone Number": "Phone Number", + "Phone Number Check": "Phone Number Check", + "Phone number seems too short": "Phone number seems too short", + "Phone verified. Please complete registration.": + "Phone verified. Please complete registration.", + "Pick destination on map": "Pick destination on map", + "Pick location on map": "Pick location on map", + "Pick on map": "Pick on map", + "Pick start point on map": "Pick start point on map", + "Plan Your Route": "Plan Your Route", + "Please add contacts to your phone.": + "Please add contacts to your phone.", + "Please check your internet and try again.": + "Please check your internet and try again.", + "Please enter a valid email.": "Please enter a valid email.", + "Please enter a valid phone number.": + "Please enter a valid phone number.", + "Please enter the number without the leading 0": + "Please enter the number without the leading 0", + "Please enter your phone number": "Please enter your phone number", + "Please go to Car now": "Please go to Car now", + "Please select a reason first": "Please select a reason first", + "Please set a valid SOS phone number.": + "Please set a valid SOS phone number.", + "Please slow down": "Please slow down", + "Please wait while we prepare your trip.": + "Please wait while we prepare your trip.", + "Preferences": "Preferences", + "Profile photo updated": "Profile photo updated", + "Quick Message": "Quick Message", + "Rating is": "Rating is", + "Received empty route data.": "Received empty route data.", + "Record": "Record", + "Record your trips to see them here.": + "Record your trips to see them here.", + "Rejected Orders Count": "Rejected Orders Count", + "Remove waypoint": "Remove waypoint", + "Report": "Report", + "Route and prices have been calculated successfully!": + "Route and prices have been calculated successfully!", + "SOS": "SOS", + "Save": "Save", + "Save Changes": "Save Changes", + "Save Name": "Save Name", + "Search country": "Search country", + "Search for a starting point": "Search for a starting point", + "Select Appearance": "Select Appearance", + "Select Education": "Select Education", + "Select Gender": "Select Gender", + "Select This Ride": "Select This Ride", + "Select betweeen types": "Select betweeen types", + "Send Email": "Send Email", + "Send SOS": "Send SOS", + "Send WhatsApp Message": "Send WhatsApp Message", + "Server Error": "Server Error", + "Server error": "Server error", + "Server error. Please try again.": "Server error. Please try again.", + "Set Destination": "Set Destination", + "Set Phone Number": "Set Phone Number", + "Set as Home": "Set as Home", + "Set as Stop": "Set as Stop", + "Set as Work": "Set as Work", + "Share": "Share", + "Share Trip": "Share Trip", + "Share your experience to help us improve...": + "Share your experience to help us improve...", + "Something went wrong. Please try again.": + "Something went wrong. Please try again.", + "Speaking...": "Speaking...", + "Speed Over": "Speed Over", + "Start Point": "Start Point", + "Stay calm. We are here to help.": "Stay calm. We are here to help.", + "Stop": "Stop", + "Submit Rating": "Submit Rating", + "Support & Info": "Support & Info", + "System Default": "System Default", + "Take a Photo": "Take a Photo", + "Tap to apply your discount": "Tap to apply your discount", + "Tap to search your destination": "Tap to search your destination", + "The driver cancelled the trip.": "The driver cancelled the trip.", + "This action cannot be undone.": "This action cannot be undone.", + "This action is permanent and cannot be undone.": + "This action is permanent and cannot be undone.", + "This is for delivery or a motorcycle.": + "This is for delivery or a motorcycle.", + "Time": "Time", + "To :": "To :", + "Top up Balance": "Top up Balance", + "Top up Balance to continue": "Top up Balance to continue", + "Total Invites": "Total Invites", + "Total Price": "Total Price", + "Trip booked successfully": "Trip booked successfully", + "Type your message...": "Type your message...", + "Unknown Location": "Unknown Location", + "Update Name": "Update Name", + "Verified Passenger": "Verified Passenger", + "View Map": "View Map", + "Wait for the trip to start first": + "Wait for the trip to start first", + "Waiting...": "Waiting...", + "Warning": "Warning", + "Waypoint has been set successfully": + "Waypoint has been set successfully", + "We use location to get accurate and nearest driver for you": + "We use location to get accurate and nearest driver for you", + "WhatsApp": "WhatsApp", + "Why do you want to cancel?": "Why do you want to cancel?", + "Yes": "Yes", + "You should ideintify your gender for this type of trip!": + "You should ideintify your gender for this type of trip!", + "You will choose one of above!": "You will choose one of above!", + "Your Rewards": "Your Rewards", + "Your complaint has been submitted.": + "Your complaint has been submitted.", + "and acknowledge our Privacy Policy.": + "and acknowledge our Privacy Policy.", + "as the driver.": "as the driver.", + "cancelled": "cancelled", + "due to a previous trip.": "due to a previous trip.", + "insert sos phone": "insert sos phone", + "is driving a": "is driving a", + "min added to fare": "min added to fare", + "phone not verified": "phone not verified", + "to arrive you.": "to arrive you.", + "unknown": "unknown", + "wait 1 minute to recive message": "wait 1 minute to recive message", + "with license plate": "with license plate", + "witout zero": "witout zero", + "you must insert token code": "you must insert token code", + "Syria": "Syrien", + "SYP": "SYP", + "Order": "Bestellung", + "OrderVIP": "VIP-Bestellung", + "Cancel Trip": "Fahrt stornieren", + "Passenger Cancel Trip": "Fahrgast hat die Fahrt storniert", + "VIP Order": "VIP-Bestellung", + "The driver accepted your trip": + "Der Fahrer hat Ihre Fahrt angenommen", + "message From passenger": "Nachricht vom Fahrgast", + "Cancel": "Abbrechen", + "Trip Cancelled. The cost of the trip will be added to your wallet.": + "Fahrt storniert. Die Kosten der Fahrt werden Ihrem Portemonnaie hinzugefügt.", + "token change": "Token-Änderung", + "Changed my mind": "Ich habe es mir anders überlegt", + "Please write the reason...": "Bitte geben Sie den Grund an...", + "Found another transport": + "Ich habe ein anderes Transportmittel gefunden", + "Driver is taking too long": "Der Fahrer braucht zu lange", + "Driver asked me to cancel": "Fahrer hat mich gebeten zu stornieren", + "Wrong pickup location": "Falscher Abholort", + "Other": "Andere", + "Don't Cancel": "Nicht abbrechen", + "No Drivers Found": "Keine Fahrer gefunden", + "Sorry, there are no cars available of this type right now.": + "Leider sind derzeit keine Fahrzeuge dieses Typs verfügbar.", + "Refresh Map": "Karte aktualisieren", + "face detect": "Gesichtserkennung", + "Face Detection Result": "Ergebnis der Gesichtserkennung", + "similar": "ähnlich", + "not similar": "nicht ähnlich", + "Searching for nearby drivers...": + "Suche nach Fahrern in der Nähe...", + "Error": "Fehler", + "Failed to search, please try again later": + "Suche fehlgeschlagen, bitte versuchen Sie es später noch einmal", + "Connection Error": "Verbindungsfehler", + "Please check your internet connection": + "Bitte überprüfen Sie Ihre Internetverbindung", + "Sorry 😔": "Entschuldigung 😔", + "The driver cancelled the trip for an emergency reason.\nDo you want to search for another driver immediately?": + "Der Fahrer hat die Fahrt aus einem Notfall abgebrochen.\nMöchten Sie sofort nach einem anderen Fahrer suchen?", + "Search for another driver": "Nach einem anderen Fahrer suchen", + "We apologize 😔": "Wir bitten um Entschuldigung 😔", + "No drivers found at the moment.\nPlease try again later.": + "Derzeit wurden keine Fahrer gefunden.\nBitte versuchen Sie es später noch einmal.", + "Hi ,I will go now": "Hallo, ich werde jetzt gehen", + "Passenger come to you": "Fahrgast kommt zu Ihnen", + "Call Income": "Eingehender Anruf", + "Call Income from Passenger": "Eingehender Anruf vom Fahrgast", + "Criminal Document Required": "Führungszeugnis erforderlich", + "You should have upload it .": "Sie hätten es hochladen sollen.", + "Call End": "Anrufende", + "The order has been accepted by another driver.": + "Die Bestellung wurde von einem anderen Fahrer angenommen.", + "The order Accepted by another Driver": + "Die Bestellung wurde von einem anderen Fahrer angenommen", + "We regret to inform you that another driver has accepted this order.": + "Wir bedauern, Ihnen mitteilen zu müssen, dass ein anderer Fahrer diese Bestellung angenommen hat.", + "Driver Applied the Ride for You": + "Der Fahrer hat die Fahrt für Sie übernommen", + "Applied": "Angewandt", + "Please go to Car Driver": "Bitte gehen Sie zum Autofahrer", + "Ok I will go now.": "Ok, ich werde jetzt gehen.", + "Accepted Ride": "Fahrt angenommen", + "Driver Accepted the Ride for You": + "Der Fahrer hat die Fahrt für Sie angenommen", + "Promo": "Promo", + "Show latest promo": "Neueste Promotion anzeigen", + "Trip Monitoring": "Fahrtüberwachung", + "Driver Is Going To Passenger": "Fahrer ist auf dem Weg zum Fahrgast", + "Please stay on the picked point.": + "Bitte bleiben Sie am ausgewählten Punkt.", + "message From Driver": "Nachricht vom Fahrer", + "Trip is Begin": "Fahrt beginnt", + "Cancel Trip from driver": "Fahrt vom Fahrer stornieren", + "We will look for a new driver.\nPlease wait.": + "Wir werden nach einem neuen Fahrer suchen.\nBitte warten Sie.", + "The driver canceled your ride.": + "Der Fahrer hat Ihre Fahrt storniert.", + "Driver Finish Trip": "Fahrer beendet die Fahrt", + "you will pay to Driver": "Sie werden den Fahrer bezahlen", + "Don’t forget your personal belongings.": + "Vergessen Sie nicht Ihre persönlichen Gegenstände.", + "Please make sure you have all your personal belongings and that any remaining fare, if applicable, has been added to your wallet before leaving. Thank you for choosing the Intaleq app": + "Bitte stellen Sie sicher, dass Sie alle Ihre persönlichen Gegenstände haben und dass etwaige verbleibende Fahrpreise, falls zutreffend, vor dem Verlassen Ihrem Portemonnaie hinzugefügt wurden. Vielen Dank, dass Sie die Intaleq-App gewählt haben", + "Finish Monitor": "Monitor beenden", + "Trip finished": "Fahrt beendet", + "Call Income from Driver": "Eingehender Anruf vom Fahrer", + "Driver Cancelled Your Trip": "Fahrer hat Ihre Fahrt storniert", + "you will pay to Driver you will be pay the cost of driver time look to your Intaleq Wallet": + "Sie werden den Fahrer bezahlen, Sie werden die Kosten für die Fahrerzeit bezahlen, sehen Sie in Ihrem Intaleq-Portemonnaie nach", + "Order Applied": "Bestellung übernommen", + "welcome to intaleq": "Willkommen bei Intaleq", + "login or register subtitle": "Anmelden oder registrieren", + "Complaint cannot be filed for this ride. It may not have been completed or started.": + "Für diese Fahrt kann keine Beschwerde eingereicht werden. Sie wurde möglicherweise noch nicht abgeschlossen oder gestartet.", + "phone number label": "Telefonnummer", + "phone number required": "Telefonnummer erforderlich", + "send otp button": "Code senden", + "verify your number title": "Nummer verifizieren", + "otp sent subtitle": "Verifizierungscode gesendet", + "verify and continue button": "Verifizieren und fortfahren", + "enter otp validation": "Bitte Code eingeben", + "one last step title": "Ein letzter Schritt", + "complete profile subtitle": "Profil vervollständigen", + "first name label": "Vorname", + "first name required": "Vorname erforderlich", + "last name label": "Nachname", + "Verify OTP": "Code verifizieren", + "Verification Code": "Verifizierungscode", + "We have sent a verification code to your mobile number:": + "Wir haben einen Verifizierungscode an Ihre Handynummer gesendet:", + "Verify": "Verifizieren", + "Resend Code": "Code erneut senden", + "You can resend in": "Erneutes Senden möglich in", + "seconds": "Sekunden", + "Please enter the complete 6-digit code.": + "Bitte geben Sie den vollständigen 6-stelligen Code ein.", + "last name required": "Nachname erforderlich", + "email optional label": "E-Mail (optional)", + "complete registration button": "Registrierung abschließen", + "User with this phone number or email already exists.": + "Benutzer mit dieser Telefonnummer oder E-Mail existiert bereits.", + "otp sent success": "Code erfolgreich gesendet", + "failed to send otp": "Code konnte nicht gesendet werden", + "server error try again": "Serverfehler, versuchen Sie es erneut", + "an error occurred": "ein Fehler ist aufgetreten", + "otp verification failed": "Code-Verifizierung fehlgeschlagen", + "registration failed": "Registrierung fehlgeschlagen", + "welcome user": "Willkommen", + "Don't forget your personal belongings.": + "Vergessen Sie Ihre persönlichen Gegenstände nicht.", + "Share App": "App teilen", + "Wallet": "Portemonnaie", + "Balance": "Guthaben", + "Profile": "Profil", + "Contact Support": "Support kontaktieren", + "Session expired. Please log in again.": + "Sitzung abgelaufen. Bitte melden Sie sich erneut an.", + "Security Warning": "Sicherheitswarnung", + "Potential security risks detected. The application may not function correctly.": + "Potenzielle Sicherheitsrisiken erkannt. Die Anwendung funktioniert möglicherweise nicht korrekt.", + "please order now": "bitte jetzt bestellen", + "Where to": "Wohin", + "Where are you going?": "Wohin gehen Sie?", + "Quick Actions": "Schnelle Aktionen", + "My Balance": "Mein Guthaben", + "Order History": "Bestellverlauf", + "Contact Us": "Kontaktieren Sie uns", + "Driver": "Fahrer", + "Complaint": "Beschwerde", + "Promos": "Promotionen", + "Recent Places": "Letzte Orte", + "From": "Von", + "WhatsApp Location Extractor": "WhatsApp-Standort-Extraktor", + "Location Link": "Standortlink", + "Paste location link here": "Fügen Sie den Standortlink hier ein", + "Go to this location": "Gehen Sie zu diesem Ort", + "Paste WhatsApp location link": + "Fügen Sie den WhatsApp-Standortlink ein", + "Select Order Type": "Bestelltyp auswählen", + "Choose who this order is for": + "Wählen Sie, für wen diese Bestellung ist", + "I want to order for myself": "Ich möchte für mich selbst bestellen", + "I want to order for someone else": + "Ich möchte für jemand anderen bestellen", + "Order for someone else": "Für jemand anderen bestellen", + "Order for myself": "Für mich selbst bestellen", + "Are you want to go this site": "Möchten Sie zu dieser Seite gehen?", + "No": "Nein", + "Intaleq Wallet": "Intaleq Geldbörse", + "Have a promo code?": "Haben Sie einen Promo-Code?", + "Your Wallet balance is ": "Ihr Portemonnaie-Guthaben beträgt ", + "Cash": "Bargeld", + "Pay directly to the captain": "Direkt beim Kapitän bezahlen", + "Top up Wallet to continue": "Geldbörse aufladen, um fortzufahren", + "Or pay with Cash instead": "Oder zahlen Sie stattdessen bar", + "Confirm & Find a Ride": "Bestätigen & Fahrt finden", + "Balance:": "Guthaben:", + "Alerts": "Benachrichtigungen", + "Welcome Back!": "Willkommen zurück!", + "No contacts found": "Keine Kontakte gefunden", + "No contacts with phone numbers were found on your device.": + "Auf Ihrem Gerät wurden keine Kontakte mit Telefonnummern gefunden.", + "Permission denied": "Berechtigung verweigert", + "Contact permission is required to pick contacts": + "Kontaktberechtigung ist erforderlich, um Kontakte auszuwählen", + "An error occurred while picking contacts:": + "Beim Auswählen von Kontakten ist ein Fehler aufgetreten:", + "Please enter a correct phone": + "Bitte geben Sie eine korrekte Telefonnummer ein", + "Success": "Erfolg", + "Invite sent successfully": "Einladung erfolgreich gesendet", + "Hello! I'm inviting you to try Intaleq.": + "Hallo! Ich lade Sie ein, Intaleq auszuprobieren.", + "Use my invitation code to get a special gift on your first ride!": + "Nutzen Sie meinen Einladungscode, um ein besonderes Geschenk bei Ihrer ersten Fahrt zu erhalten!", + "Your personal invitation code is:": + "Ihr persönlicher Einladungscode lautet:", + "Be sure to use it quickly! This code expires at": + "Nutzen Sie ihn schnell! Dieser Code läuft ab am", + "Download the app now:": "Laden Sie die App jetzt herunter:", + "See you on the road!": "Wir sehen uns auf der Straße!", + "This phone number has already been invited.": + "Diese Telefonnummer wurde bereits eingeladen.", + "An unexpected error occurred. Please try again.": + "Ein unerwarteter Fehler ist aufgetreten. Bitte versuchen Sie es erneut.", + "You deserve the gift": "Sie verdienen das Geschenk", + "Claim your 20 LE gift for inviting": + "Fordern Sie Ihr 20 LE Geschenk für die Einladung an", + "You have got a gift for invitation": + "Sie haben ein Geschenk für die Einladung erhalten", + "You have earned 20": "Sie haben 20 verdient", + "LE": "LE", + "Vibration feedback for all buttons": + "Vibrationsfeedback für alle Tasten", + "Share with friends and earn rewards": + "Mit Freunden teilen und Belohnungen verdienen", + "Gift Already Claimed": "Geschenk bereits beansprucht", + "You have already received your gift for inviting": + "Sie haben Ihr Geschenk für die Einladung bereits erhalten", + "Keep it up!": "Weiter so!", + "has completed": "hat abgeschlossen", + "trips": "Fahrten", + "Personal Information": "Persönliche Informationen", + "Name": "Name", + "Not set": "Nicht festgelegt", + "Gender": "Geschlecht", + "Education": "Bildung", + "Work & Contact": "Arbeit & Kontakt", + "Employment Type": "Beschäftigungsart", + "Marital Status": "Familienstand", + "SOS Phone": "SOS-Telefon", + "Sign Out": "Abmelden", + "Delete My Account": "Mein Konto löschen", + "Update Gender": "Geschlecht aktualisieren", + "Update": "Aktualisieren", + "Update Education": "Bildung aktualisieren", + "Are you sure? This action cannot be undone.": + "Sind Sie sicher? Diese Aktion kann nicht rückgängig gemacht werden.", + "Confirm your Email": "E-Mail bestätigen", + "Type your Email": "Geben Sie Ihre E-Mail ein", + "Delete Permanently": "Dauerhaft löschen", + "Male": "Männlich", + "Female": "Weiblich", + "High School Diploma": "Abitur", + "Associate Degree": "Associate Degree", + "Bachelor's Degree": "Bachelor-Abschluss", + "Master's Degree": "Master-Abschluss", + "Doctoral Degree": "Doktortitel", + "Select your preferred language for the app interface.": + "Wählen Sie Ihre bevorzugte Sprache für die App-Oberfläche.", + "Language Options": "Sprachoptionen", + "You can claim your gift once they complete 2 trips.": + "Sie können Ihr Geschenk anfordern, sobald zwei Fahrten abgeschlossen sind.", + "Closest & Cheapest": "Nächstgelegen & Günstigst", + "Comfort choice": "Comfort-Option", + "Travel in a modern, silent electric car. A premium, eco-friendly choice for a smooth ride.": + "Reisen Sie in einem modernen, geräuschlosen Elektroauto. Eine erstklassige, umweltfreundliche Wahl für eine reibungslose Fahrt.", + "Spacious van service ideal for families and groups. Comfortable, safe, and cost-effective travel together.": + "Geräumiger Van-Service, ideal für Familien und Gruppen. Komfortables, sicheres und kostengünstiges gemeinsames Reisen.", + "Quiet & Eco-Friendly": "Leise & Umweltfreundlich", + "Lady Captain for girls": "Fahrerin für Frauen", + "Van for familly": "Familien-Van", + "Are you sure to delete this location?": + "Sind Sie sicher, dass Sie diesen Ort löschen möchten?", + "Submit a Complaint": "Beschwerde einreichen", + "Submit Complaint": "Beschwerde einreichen", + "No trip history found": "Keine Fahrthistorie gefunden", + "Your past trips will appear here.": + "Ihre vergangenen Fahrten werden hier angezeigt.", + "1. Describe Your Issue": "1. Beschreiben Sie Ihr Problem", + "Enter your complaint here...": + "Geben Sie hier Ihre Beschwerde ein...", + "2. Attach Recorded Audio": "2. Aufgenommenes Audio anhängen", + "No audio files found.": "Keine Audiodateien gefunden.", + "Confirm Attachment": "Anhang bestätigen", + "Attach this audio file?": "Diese Audiodatei anhängen?", + "Uploaded": "Hochgeladen", + "3. Review Details & Response": "3. Details & Antwort prüfen", + "Date": "Datum", + "Today's Promos": "Heutige Promos", + "No promos available right now.": + "Derzeit sind keine Promos verfügbar.", + "Check back later for new offers!": + "Schauen Sie später für neue Angebote vorbei!", + "Valid Until:": "Gültig bis:", + "CODE": "CODE", + "Login": "Anmelden", + "Sign in for a seamless experience": + "Melden Sie sich für ein nahtloses Erlebnis an", + "Sign In with Google": "Mit Google anmelden", + "Sign in with Apple": "Mit Apple anmelden", + "User not found": "Benutzer nicht gefunden", + "Need assistance? Contact us": + "Brauchen Sie Hilfe? Kontaktieren Sie uns", + "Email": "E-Mail", + "Your email address": "Ihre E-Mail-Adresse", + "Enter a valid email": "Geben Sie eine gültige E-Mail-Adresse ein", + "Password": "Passwort", + "Your password": "Ihr Passwort", + "Enter your password": "Geben Sie Ihr Passwort ein", + "Submit": "Einreichen", + "Terms of Use & Privacy Notice": + "Nutzungsbedingungen & Datenschutzhinweis", + "By selecting \"I Agree\" below, I confirm that I have read and agree to the ": + "Durch Auswahl von „Ich stimme zu“ bestätige ich, dass ich die folgenden Bedingungen gelesen habe und ihnen zustimme: ", + "Terms of Use": "Nutzungsbedingungen", + " and acknowledge the ": " und erkenne die ", + "Privacy Notice": "Datenschutzhinweis", + ". I am at least 18 years old.": ". Ich bin mindestens 18 Jahre alt.", + "I Agree": "Ich stimme zu", + "Continue": "Weiter", + "Enable Location": "Standort aktivieren", + "To give you the best experience, we need to know where you are. Your location is used to find nearby captains and for pickups.": + "Um Ihnen das beste Erlebnis zu bieten, müssen wir wissen, wo Sie sich befinden. Ihr Standort wird verwendet, um Kapitäne in der Nähe zu finden und für die Abholung.", + "Allow Location Access": "Standortzugriff erlauben", + "Welcome to Intaleq!": "Willkommen bei Intaleq!", + "Before we start, please review our terms.": + "Bevor wir beginnen, lesen Sie bitte unsere Bedingungen.", + "Your journey starts here": "Ihre Reise beginnt hier", + "Cancel Search": "Suche abbrechen", + "Set pickup location": "Abholort festlegen", + "Move the map to adjust the pin": + "Karte bewegen, um die Nadel anzupassen", + "Searching for the nearest captain...": + "Suche nach dem nächsten Kapitän...", + "No one accepted? Try increasing the fare.": + "Niemand hat angenommen? Versuchen Sie, den Fahrpreis zu erhöhen.", + "Increase Your Trip Fee (Optional)": + "Erhöhen Sie Ihre Fahrpreise (optional)", + "We haven't found any drivers yet. Consider increasing your trip fee to make your offer more attractive to drivers.": + "Wir haben noch keine Fahrer gefunden. Erwägen Sie, Ihre Fahrpreise zu erhöhen, um Ihr Angebot für Fahrer attraktiver zu machen.", + "No, thanks": "Nein, danke", + "Increase Fee": "Preis erhöhen", + "Copy": "Kopieren", + "Promo Copied!": "Promotion kopiert!", + "Code": "Code", + "copied to clipboard": "in die Zwischenablage kopiert", + "Price": "Preis", + "Intaleq's Response": "Antwort von Intaleq", + "Awaiting response...": "Warten auf Antwort...", + "Audio file not attached": "Audiodatei nicht angehängt", + "The audio file is not uploaded yet.\nDo you want to submit without it?": + "Die Audiodatei wurde noch nicht hochgeladen.\nMöchten Sie ohne sie senden?", + "deleted": "gelöscht", + "To Work": "Zur Arbeit", + "Work Saved": "Arbeitsort gespeichert", + "To Home": "Nach Hause", + "Home Saved": "Zuhause gespeichert", + "Destination selected": "Ziel ausgewählt", + "Now select start pick": "Wählen Sie nun den Startpunkt aus", + "OK": "OK", + "Confirm Pick-up Location": "Abholort bestätigen", + "Set Location on Map": "Ort auf der Karte festlegen", + "You can contact us during working hours from 10:00 - 16:00.": + "Sie können uns während der Arbeitszeiten von 10:00 bis 16:00 Uhr kontaktieren.", + "Intaleq is the safest and most reliable ride-sharing app designed especially for passengers in Syria. We provide a comfortable, respectful, and affordable riding experience with features that prioritize your safety and convenience. Our trusted captains are verified, insured, and supported by regular car maintenance carried out by top engineers. We also offer on-road support services to make sure every trip is smooth and worry-free. With Intaleq, you enjoy quality, safety, and peace of mind—every time you ride.": + "Intaleq ist die sicherste und zuverlässigste Fahrgemeinschafts-App, die speziell für Fahrgäste in Syrien entwickelt wurde. Wir bieten ein komfortables, respektvolles und erschwingliches Fahrerlebnis mit Funktionen, die Ihre Sicherheit und Bequemlichkeit in den Vordergrund stellen. Unsere vertrauenswürdigen Kapitäne sind verifiziert, versichert und werden durch regelmäßige Fahrzeugwartung durch erstklassige Ingenieure unterstützt. Wir bieten auch Pannenhilfe an, damit jede Fahrt reibungslos und sorgenfrei verläuft. Mit Intaleq genießen Sie jedes Mal Qualität, Sicherheit und Sorgenfreiheit.", + "Customer MSISDN doesn’t have customer wallet": + "MSISDN des Kunden hat keine Geldbörse", + "Nearest Car: ~": "Nächstes Auto: ~", + "Nearest Car": "Nächstes Auto", + "No cars nearby": "Keine Autos in der Nähe", + "Favorite Places": "Lieblingsorte", + "No favorite places yet!": "Noch keine Lieblingsorte!", + "from your favorites": "aus Ihren Favoriten", + "Back": "Zurück", + "Enter your code below to apply the discount.": + "Geben Sie unten Ihren Code ein, um den Rabatt anzuwenden.", + "By selecting \"I Agree\" below, I confirm that I have read and agree to the": + "Durch die Auswahl von \"Ich stimme zu\" bestätige ich, dass ich die", + "and acknowledge the": "gelesen und akzeptiert habe und den", + "Enable Location Access": "Standortzugriff aktivieren", + "We need your location to find nearby drivers for pickups and drop-offs.": + "Wir benötigen Ihren Standort, um nahegelegene Fahrer für Abholungen und Absetzungen zu finden.", + "You should restart app to change language": + "Sie sollten die App neu starten, um die Sprache zu ändern", + "Home Page": "Startseite", + "To change Language the App": "Um die Sprache der App zu ändern", + "Learn more about our app and mission": + "Erfahren Sie mehr über unsere App und Mission", + "Promos For Today": "Promotionen für heute", + "Choose your ride": "Wählen Sie Ihre Fahrt", + "Your Journey Begins Here": "Ihre Reise beginnt hier", + "Bonus gift": "Bonusgeschenk", + "Pay": "Bezahlen", + "Get": "Erhalten", + "Send to Driver Again": "Nochmals an den Fahrer senden", + "Driver Name:": "Fahrername:", + "No trip data available": "Keine Fahrtdaten verfügbar", + "Car Plate:": "Nummernschild:", + "remaining": "verbleibend", + "Order Cancelled": "Bestellung storniert", + "You canceled VIP trip": "Sie haben die VIP-Fahrt storniert", + "Passenger cancelled order": + "Der Fahrgast hat die Bestellung storniert", + "Your trip is scheduled": "Ihre Fahrt ist geplant", + "Don't forget your ride!": "Vergessen Sie Ihre Fahrt nicht!", + "Trip updated successfully": "Fahrt erfolgreich aktualisiert", + "Car Make:": "Automarke:", + "Car Model:": "Automodell:", + "Car Color:": "Autofarbe:", + "Driver Phone:": "Fahrertelefon:", + "Pre-booking": "Vorabbuchung", + "Waiting VIP": "Warten auf VIP", + "Driver List": "Fahrerliste", + "Confirm Trip": "Fahrt bestätigen", + "Select date and time of trip": + "Datum und Uhrzeit der Fahrt auswählen", + "Date and Time Picker": "Datum- und Uhrzeitauswahl", + "Trip Status:": "Fahrtstatus:", + "pending": "ausstehend", + "accepted": "akzeptiert", + "rejected": "abgelehnt", + "Apply": "Anwenden", + "Enter your promo code": "Geben Sie Ihren Promo-Code ein", + "Apply Promo Code": "Promo-Code anwenden", + "Scheduled Time:": "Geplante Zeit:", + "No drivers available": "Keine Fahrer verfügbar", + "No drivers available at the moment. Please try again later.": + "Derzeit sind keine Fahrer verfügbar. Bitte versuchen Sie es später erneut.", + "you have a negative balance of": + "Sie haben ein negatives Guthaben von", + "Please try again in a few moments": + "Bitte versuchen Sie es in einigen Augenblicken erneut", + "Unknown Driver": "Unbekannter Fahrer", + "in your": "in Ihrem", + "The driver accepted your order for": + "Der Fahrer hat Ihre Bestellung für", + "wallet due to a previous trip.": + "Portemonnaie aufgrund einer vorherigen Fahrt.", + "rides": "Fahrten", + "Add Work": "Arbeit hinzufügen", + "The reason is": "Der Grund ist", + "User does not have a wallet #1652": + "Der Benutzer hat kein Portemonnaie #1652", + "Price of trip": "Preis der Fahrt", + "From:": "Von:", + "For Intaleq and Delivery trips, the price is calculated dynamically. For Comfort trips, the price is based on time and distance": + "Für Schnell- und Lieferfahrten wird der Preis dynamisch berechnet. Für Komfortfahrten basiert der Preis auf Zeit und Entfernung.", + "Phone Wallet Saved Successfully": + "Telefon-Portemonnaie erfolgreich gespeichert", + "Add wallet phone you use": + "Fügen Sie das Telefon-Portemonnaie hinzu, das Sie verwenden", + "Update Available": "Update verfügbar", + "Phone number must be exactly 11 digits long": + "Die Telefonnummer muss genau 11 Ziffern lang sein", + "Insert Wallet phone number": + "Geben Sie die Telefonnummer des Portemonnaies ein", + "Phone number isn't an Egyptian phone number": + "Die Telefonnummer ist keine ägyptische Telefonnummer", + "A new version of the app is available. Please update to the latest version.": + "Eine neue Version der App ist verfügbar. Bitte aktualisieren Sie auf die neueste Version.", + "We use location to get accurate and nearest passengers for you": + "Wir verwenden den Standort, um genaue und nahegelegene Fahrgäste für Sie zu finden", + "This ride is already applied by another driver.": + "Diese Fahrt wurde bereits von einem anderen Fahrer übernommen.", + "We use your precise location to find the nearest available driver and provide accurate pickup and dropoff information. You can manage this in Settings.": + "Wir verwenden Ihren genauen Standort, um den nächsten verfügbaren Fahrer zu finden und genaue Abhol- und Absetzinformationen bereitzustellen. Sie können dies in den Einstellungen verwalten.", + "Where are you, sir?": "Wo sind Sie, Sir?", + "I've been trying to reach you but your phone is off.": + "Ich habe versucht, Sie zu erreichen, aber Ihr Telefon ist ausgeschaltet.", + "Please don't be late": "Bitte seien Sie nicht zu spät", + "Please don't be late, I'm waiting for you at the specified location.": + "Bitte seien Sie nicht zu spät, ich warte an dem angegebenen Ort auf Sie.", + "My location is correct. You can search for me using the navigation app": + "Mein Standort ist korrekt. Sie können mich über die Navigations-App suchen.", + "Hello, I'm at the agreed-upon location": + "Hallo, ich bin am vereinbarten Ort", + "How much longer will you be?": + "Wie viel länger werden Sie brauchen?", + "Phone number is verified before": + "Die Telefonnummer wurde bereits verifiziert", + "Change Ride": "Fahrt ändern", + "You can change the destination by long-pressing any point on the map": + "Sie können das Ziel ändern, indem Sie einen beliebigen Punkt auf der Karte lange drücken", + "Pick from map destination": "Ziel auf der Karte auswählen", + "Pick or Tap to confirm": "Auswählen oder Tippen, um zu bestätigen", + "Accepted your order": "Ihre Bestellung wurde angenommen", + "Order Accepted": "Bestellung angenommen", + "with type": "mit Typ", + "accepted your order at price": "hat Ihre Bestellung zum Preis von", + "you canceled order": "Sie haben die Bestellung storniert", + "If you want order to another person": + "Wenn Sie für eine andere Person bestellen möchten", + "upgrade price": "Preis erhöhen", + "airport": "Flughafen", + "Best choice for a comfortable car with a flexible route and stop points. This airport offers visa entry at this price.": + "Beste Wahl für ein komfortables Auto mit einer flexiblen Route und Haltepunkten. Dieser Flughafen bietet Visa-Einreise zu diesem Preis.", + "You can upgrade price to may driver accept your order": + "Sie können den Preis erhöhen, damit der Fahrer Ihre Bestellung annimmt", + "Change Route": "Route ändern", + "No Captain Accepted Your Order": + "Kein Kapitän hat Ihre Bestellung angenommen", + "We are looking for a captain but the price may increase to let a captain accept": + "Wir suchen einen Kapitän, aber der Preis könnte steigen, damit ein Kapitän annimmt", + "No, I want to cancel this trip": + "Nein, ich möchte diese Fahrt stornieren", + "Attention": "Achtung", + "Trip Cancelled. The cost of the trip will be deducted from your wallet.": + "Fahrt storniert. Die Kosten der Fahrt werden von Ihrem Portemonnaie abgezogen.", + "You will be charged for the cost of the driver coming to your location.": + "Ihnen werden die Kosten für den Fahrer berechnet, der zu Ihrem Standort kommt.", + "reject your order.": "hat Ihre Bestellung abgelehnt.", + "Order Under Review": "Bestellung in Überprüfung", + "is reviewing your order. They may need more information or a higher price.": + "überprüft Ihre Bestellung. Möglicherweise benötigen sie mehr Informationen oder einen höheren Preis.", + "Vibration": "Vibration", + "Resend code": "Code erneut senden", + "change device": "Gerät ändern", + "Device Change Detected": "Gerätewechsel erkannt", + "You can only use one device at a time. This device will now be set as your active device.": + "Sie können nur ein Gerät gleichzeitig verwenden. Dieses Gerät wird nun als Ihr aktives Gerät festgelegt.", + "Click here point": "Klicken Sie hier", + "Are you want to change": "Möchten Sie ändern", + "by": "von", + "Enter your complaint here": "Geben Sie Ihre Beschwerde hier ein", + "Please enter your complaint.": + "Bitte geben Sie Ihre Beschwerde ein.", + "Complaint data saved successfully": + "Beschwerdedaten erfolgreich gespeichert", + "Trip Monitor": "Fahrtmonitor", + "Insert SOS Phone": "SOS-Telefon einfügen", + "Add SOS Phone": "SOS-Telefon hinzufügen", + "Dear ,\n\n 🚀 I have just started an exciting trip and I would like to share the details of my journey and my current location with you in real-time! Please download the Intaleq app. It will allow you to view my trip details and my latest location.\n\n 👉 Download link: \n Android [https://play.google.com/store/apps/details?id=com.mobileapp.store.ride]\n iOS [https://getapp.cc/app/6458734951]\n\n I look forward to keeping you close during my adventure!\n\n Intaleq ,": + "Sehr geehrte/r ,\n\n 🚀 Ich habe gerade eine aufregende Reise begonnen und möchte die Details meiner Reise und meinen aktuellen Standort in Echtzeit mit Ihnen teilen! Bitte laden Sie die Intaleq-App herunter. Sie ermöglicht Ihnen, meine Reisedetails und meinen letzten Standort einzusehen.\n\n 👉 Download-Link: \n Android [https://play.google.com/store/apps/details?id=com.mobileapp.store.ride]\n iOS [https://getapp.cc/app/6458734951]\n\n Ich freue mich darauf, Sie während meines Abenteuers nah bei mir zu haben!\n\n Intaleq ,", + "Send Intaleq app to him": "Senden Sie ihm die Intaleq-App", + "No passenger found for the given phone number": + "Kein Fahrgast für die angegebene Telefonnummer gefunden", + "No user found for the given phone number": + "Kein Benutzer für die angegebene Telefonnummer gefunden", + "This price is": "Dieser Preis ist", + "Work": "Arbeit", + "Add Home": "Zuhause hinzufügen", + "Notifications": "Benachrichtigungen", + "💳 Pay with Credit Card": "💳 Mit Kreditkarte bezahlen", + "⚠️ You need to choose an amount!": + "⚠️ Sie müssen einen Betrag auswählen!", + "💰 Pay with Wallet": "Mit Portemonnaie bezahlen", + "You must restart the app to change the language.": + "Sie müssen die App neu starten, um die Sprache zu ändern.", + "joined": "beigetreten", + "Driver joined the channel": "Der Fahrer ist dem Kanal beigetreten", + "Driver left the channel": "Der Fahrer hat den Kanal verlassen", + "Call Page": "Anrufseite", + "Call Left": "Verbleibender Anruf", + " Next as Cash !": " Weiter bar!", + "To use Wallet charge it": + "Um das Portemonnaie zu verwenden, laden Sie es auf", + "We are searching for the nearest driver to you": + "Wir suchen den nächstgelegenen Fahrer für Sie", + "Best choice for cities": "Beste Wahl für Städte", + "Rayeh Gai: Round trip service for convenient travel between cities, easy and reliable.": + "Rayeh Gai: Rundreiseservice für bequemes Reisen zwischen Städten, einfach und zuverlässig.", + "This trip is for women only": "Diese Fahrt ist nur für Frauen", + "Total budgets on month": "Gesamtbudgets des Monats", + "You have call from driver": "Sie haben einen Anruf vom Fahrer", + "Intaleq": "Geschwindigkeit", + "passenger agreement": "Fahrgastvereinbarung", + "To become a passenger, you must review and agree to the ": + "Um Fahrgast zu werden, müssen Sie die folgenden Bedingungen lesen und ihnen zustimmen: ", + "agreement subtitle": "Bedingungen akzeptieren", + "terms of use": "Nutzungsbedingungen", + " and acknowledge our Privacy Policy.": + " und erkennen unsere Datenschutzrichtlinie an.", + "and acknowledge our": "und bestätigen unsere", + "privacy policy": "Datenschutzrichtlinie", + "i agree": "Ich stimme zu", + "Driver already has 2 trips within the specified period.": + "Der Fahrer hat bereits 2 Fahrten innerhalb des angegebenen Zeitraums.", + "The invitation was sent successfully": + "Die Einladung wurde erfolgreich versendet", + "You should select your country": "Sie sollten Ihr Land auswählen", + "Scooter": "Roller", + "A trip with a prior reservation, allowing you to choose the best captains and cars.": + "Eine Fahrt mit Vorabreservierung, die es Ihnen ermöglicht, die besten Kapitäne und Autos auszuwählen.", + "Mishwar Vip": "Mishwar Vip", + "The driver waiting you in picked location .": + "Der Fahrer wartet an dem ausgewählten Ort auf Sie.", + "About Us": "Über uns", + "You can change the vibration feedback for all buttons": + "Sie können das Vibrationsfeedback für alle Schaltflächen ändern", + "Most Secure Methods": "Sicherste Methoden", + "In-App VOIP Calls": "VOIP-Anrufe in der App", + "Recorded Trips for Safety": + "Aufgezeichnete Fahrten für die Sicherheit", + "\nWe also prioritize affordability, offering competitive pricing to make your rides accessible.": + "\nWir legen auch Wert auf Erschwinglichkeit und bieten wettbewerbsfähige Preise, um Ihre Fahrten zugänglich zu machen.", + "Intaleq is a ride-sharing app designed with your safety and affordability in mind. We connect you with reliable drivers in your area, ensuring a convenient and stress-free travel experience.\n\nHere are some of the key features that set us apart:": + "Intaleq ist eine Mitfahr-App, die mit Blick auf Ihre Sicherheit und Erschwinglichkeit entwickelt wurde. Wir verbinden Sie mit zuverlässigen Fahrern in Ihrer Nähe und sorgen für eine bequeme und stressfreie Reiseerfahrung.\n\nHier sind einige der wichtigsten Funktionen, die uns auszeichnen:", + "Sign In by Apple": "Mit Apple anmelden", + "Sign In by Google": "Mit Google anmelden", + "How do I request a ride?": "Wie buche ich eine Fahrt?", + "Step-by-step instructions on how to request a ride through the Intaleq app.": + "Schritt-für-Schritt-Anleitung, wie Sie eine Fahrt über die Intaleq-App buchen können.", + "What types of vehicles are available?": + "Welche Fahrzeugtypen sind verfügbar?", + "Intaleq offers a variety of vehicle options to suit your needs, including economy, comfort, and luxury. Choose the option that best fits your budget and passenger count.": + "Intaleq bietet eine Vielzahl von Fahrzeugoptionen, die Ihren Bedürfnissen entsprechen, darunter Economy, Komfort und Luxus. Wählen Sie die Option, die am besten zu Ihrem Budget und Ihrer Passagierzahl passt.", + "How can I pay for my ride?": "Wie kann ich meine Fahrt bezahlen?", + "Intaleq offers multiple payment methods for your convenience. Choose between cash payment or credit/debit card payment during ride confirmation.": + "Intaleq bietet mehrere Zahlungsmethoden für Ihre Bequemlichkeit. Wählen Sie zwischen Barzahlung oder Kredit-/Debitkartenzahlung während der Fahrtbestätigung.", + "Can I cancel my ride?": "Kann ich meine Fahrt stornieren?", + "Yes, you can cancel your ride under certain conditions (e.g., before driver is assigned). See the Intaleq cancellation policy for details.": + "Ja, Sie können Ihre Fahrt unter bestimmten Bedingungen stornieren (z.B. bevor der Fahrer zugewiesen wird). Weitere Details finden Sie in der Stornierungsrichtlinie von Intaleq.", + "Driver Registration & Requirements": + "Fahrerregistrierung & Anforderungen", + "How can I register as a driver?": + "Wie kann ich mich als Fahrer registrieren?", + "What are the requirements to become a driver?": + "Welche Anforderungen gibt es, um Fahrer zu werden?", + "Visit our website or contact Intaleq support for information on driver registration and requirements.": + "Besuchen Sie unsere Website oder kontaktieren Sie den Intaleq-Support für Informationen zur Fahrerregistrierung und den Anforderungen.", + "Intaleq provides in-app chat functionality to allow you to communicate with your driver or passenger during your ride.": + "Intaleq bietet eine In-App-Chat-Funktion, die es Ihnen ermöglicht, während Ihrer Fahrt mit Ihrem Fahrer oder Fahrgast zu kommunizieren.", + "Intaleq prioritizes your safety. We offer features like driver verification, in-app trip tracking, and emergency contact options.": + "Intaleq priorisiert Ihre Sicherheit. Wir bieten Funktionen wie Fahrerverifizierung, In-App-Fahrtverfolgung und Notfallkontaktoptionen.", + "Frequently Questions": "Häufige Fragen", + "User does not exist.": "Benutzer existiert nicht.", + "We need your phone number to contact you and to help you.": + "Wir benötigen Ihre Telefonnummer, um Sie zu kontaktieren und Ihnen zu helfen.", + "You will recieve code in sms message": + "Sie erhalten den Code per SMS", + "Please enter": "Bitte eingeben", + "We need your phone number to contact you and to help you receive orders.": + "Wir benötigen Ihre Telefonnummer, um Sie zu kontaktieren und Ihnen zu helfen, Bestellungen zu erhalten.", + "The full name on your criminal record does not match the one on your driver's license. Please verify and provide the correct documents.": + "Der vollständige Name in Ihrem Führungszeugnis stimmt nicht mit dem in Ihrem Führerschein überein. Bitte überprüfen Sie dies und stellen Sie die korrekten Dokumente bereit.", + "The national number on your driver's license does not match the one on your ID document. Please verify and provide the correct documents.": + "Die nationale Nummer auf Ihrem Führerschein stimmt nicht mit der in Ihrem Ausweisdokument überein. Bitte überprüfen Sie dies und stellen Sie die korrekten Dokumente bereit.", + "Capture an Image of Your Criminal Record": + "Machen Sie ein Bild Ihres Strafregisters", + "IssueDate": "Ausstellungsdatum", + "Capture an Image of Your car license front": + "Foto von der Vorderseite des Fahrzeugscheins machen", + "Capture an Image of Your ID Document front": + "Machen Sie ein Bild der Vorderseite Ihres Ausweisdokuments", + "NationalID": "Nationale ID", + "You can share the Intaleq App with your friends and earn rewards for rides they take using your code": + "Sie können die Intaleq-App mit Ihren Freunden teilen und Belohnungen für Fahrten verdienen, die sie mit Ihrem Code unternehmen", + "FullName": "Vollständiger Name", + "No invitation found yet!": "Noch keine Einladung gefunden!", + "InspectionResult": "Inspektionsergebnis", + "Criminal Record": "Strafregister", + "The email or phone number is already registered.": + "Die E-Mail oder Telefonnummer ist bereits registriert.", + "To become a ride-sharing driver on the Intaleq app, you need to upload your driver's license, ID document, and car registration document. Our AI system will instantly review and verify their authenticity in just 2-3 minutes. If your documents are approved, you can start working as a driver on the Intaleq app. Please note, submitting fraudulent documents is a serious offense and may result in immediate termination and legal consequences.": + "Um ein Mitfahrfahrer in der Intaleq-App zu werden, müssen Sie Ihren Führerschein, Ihr Ausweisdokument und Ihr Fahrzeugregistrierungsdokument hochladen. Unser KI-System überprüft und verifiziert deren Authentizität in nur 2-3 Minuten. Wenn Ihre Dokumente genehmigt werden, können Sie als Fahrer in der Intaleq-App arbeiten. Bitte beachten Sie, dass die Einreichung betrügerischer Dokumente eine schwerwiegende Straftat darstellt und zu sofortiger Kündigung und rechtlichen Konsequenzen führen kann.", + "Documents check": "Dokumentenprüfung", + "Driver's License": "Führerschein", + "for your first registration!": "für Ihre erste Registrierung!", + "Get it Now!": "Holen Sie es sich jetzt!", + "before": "vor", + "Code not approved": "Code nicht genehmigt", + "3000 LE": "3000 LE", + "Do you have an invitation code from another driver?": + "Haben Sie einen Einladungscode von einem anderen Fahrer?", + "Paste the code here": "Fügen Sie den Code hier ein", + "No, I don't have a code": "Nein, ich habe keinen Code", + "Audio uploaded successfully.": "Audio erfolgreich hochgeladen.", + "Perfect for passengers seeking the latest car models with the freedom to choose any route they desire": + "Perfekt für Fahrgäste, die die neuesten Automodelle suchen und die Freiheit haben möchten, jede gewünschte Route zu wählen", + "Share this code with your friends and earn rewards when they use it!": + "Teilen Sie diesen Code mit Ihren Freunden und verdienen Sie Belohnungen, wenn sie ihn verwenden!", + "Enter phone": "Telefon eingeben", + "complete, you can claim your gift": + "abgeschlossen, Sie können Ihr Geschenk einfordern", + "When": "Wann", + "Enter driver's phone": "Fahrertelefon eingeben", + "Send Invite": "Einladung senden", + "Show Invitations": "Einladungen anzeigen", + "License Type": "Lizenztyp", + "National Number": "Nationale Nummer", + "Name (Arabic)": "Name (Arabisch)", + "Name (English)": "Name (Englisch)", + "Address": "Adresse", + "Issue Date": "Ausstellungsdatum", + "Expiry Date": "Ablaufdatum", + "License Categories": "Lizenzkategorien", + "driver_license": "Führerschein", + "Capture an Image of Your Driver License": + "Machen Sie ein Bild Ihres Führerscheins", + "ID Documents Back": "Rückseite der Ausweisdokumente", + "National ID": "Nationale ID", + "Occupation": "Beruf", + "Religion": "Religion", + "Full Name (Marital)": "Vollständiger Name (Familienstand)", + "Expiration Date": "Ablaufdatum", + "Capture an Image of Your ID Document Back": + "Machen Sie ein Bild der Rückseite Ihres Ausweisdokuments", + "ID Documents Front": "Vorderseite der Ausweisdokumente", + "First Name": "Vorname", + "CardID": "Karten-ID", + "Vehicle Details Front": "Fahrzeugdetails Vorderseite", + "Plate Number": "Nummernschild", + "Owner Name": "Name des Eigentümers", + "Vehicle Details Back": "Fahrzeugdetails Rückseite", + "Make": "Marke", + "Model": "Modell", + "Year": "Jahr", + "Chassis": "Chassis", + "Color": "Farbe", + "Displacement": "Hubraum", + "Fuel": "Kraftstoff", + "Tax Expiry Date": "Steuerablaufdatum", + "Inspection Date": "Inspektionsdatum", + "Capture an Image of Your car license back": + "Machen Sie ein Bild der Rückseite Ihrer Fahrzeuglizenz", + "Capture an Image of Your Driver's License": + "Foto vom Führerschein machen", + "Sign in with Google for easier email and name entry": + "Melden Sie sich mit Google an, um E-Mail und Namen einfacher einzugeben", + "You will choose allow all the time to be ready receive orders": + "Sie werden die Erlaubnis jederzeit erteilen, um bereit zu sein, Bestellungen zu empfangen", + "Get to your destination quickly and easily.": + "Erreichen Sie Ihr Ziel schnell und einfach.", + "Enjoy a safe and comfortable ride.": + "Genießen Sie eine sichere und komfortable Fahrt.", + "Choose Language": "Sprache auswählen", + "Pay with Wallet": "Mit Portemonnaie bezahlen", + "Invalid MPIN": "Ungültiger MPIN", + "Invalid OTP": "Ungültiger OTP", + "Enter your email address": "Geben Sie Ihre E-Mail-Adresse ein", + "Please enter Your Email.": "Bitte geben Sie Ihre E-Mail ein.", + "Enter your phone number": "Geben Sie Ihre Telefonnummer ein", + "Please enter your phone number.": + "Bitte geben Sie Ihre Telefonnummer ein.", + "Please enter Your Password.": "Bitte geben Sie Ihr Passwort ein.", + "if you dont have account": "Wenn Sie kein Konto haben", + "Register": "Registrieren", + "Accept Ride's Terms & Review Privacy Notice": + "Akzeptieren Sie die Nutzungsbedingungen und überprüfen Sie die Datenschutzerklärung", + "By selecting 'I Agree' below, I have reviewed and agree to the Terms of Use and acknowledge the Privacy Notice. I am at least 18 years of age.": + "Durch Auswahl von 'Ich stimme zu' bestätige ich, dass ich die Nutzungsbedingungen gelesen habe und ihnen zustimme sowie die Datenschutzerklärung zur Kenntnis genommen habe. Ich bin mindestens 18 Jahre alt.", + "First name": "Vorname", + "Enter your first name": "Geben Sie Ihren Vornamen ein", + "Please enter your first name.": + "Bitte geben Sie Ihren Vornamen ein.", + "Last name": "Nachname", + "Enter your last name": "Geben Sie Ihren Nachnamen ein", + "Please enter your last name.": + "Bitte geben Sie Ihren Nachnamen ein.", + "City": "Stadt", + "Please enter your City.": "Bitte geben Sie Ihre Stadt ein.", + "Verify Email": "E-Mail verifizieren", + "We sent 5 digit to your Email provided": + "Wir haben einen 5-stelligen Code an die angegebene E-Mail gesendet", + "5 digit": "5-stellig", + "Send Verification Code": "Verifizierungscode senden", + "Your Ride Duration is ": "Ihre Fahrtdauer beträgt ", + "You will be thier in": "Sie werden dort sein in", + "You trip distance is": "Ihre Fahrtstrecke beträgt", + "Fee is": "Gebühr ist", + "From : ": "Von : ", + "To : ": "Nach : ", + "Add Promo": "Promotion hinzufügen", + "Confirm Selection": "Auswahl bestätigen", + "distance is": "Entfernung ist", + "Privacy Policy": "Datenschutzrichtlinie", + "Intaleq LLC": "Intaleq LLC", + "Syria's pioneering ride-sharing service, proudly developed by Arabian and local owners. We prioritize being near you – both our valued passengers and our dedicated captains.": + "Syriens wegweisender Fahrtdienst, stolz entwickelt von arabischen und lokalen Eigentümern. Wir legen Wert darauf, nah bei Ihnen zu sein – sowohl bei unseren geschätzten Fahrgästen als auch bei unseren engagierten Kapitänen.", + "Intaleq is the first ride-sharing app in Syria, designed to connect you with the nearest drivers for a quick and convenient travel experience.": + "Intaleq ist die erste Ridesharing-App in Syrien, die Sie mit den nächsten Fahrern verbindet, um ein schnelles und bequemes Reiseerlebnis zu ermöglichen.", + "Why Choose Intaleq?": "Warum Intaleq wählen?", + "Closest to You": "Am nächsten bei Ihnen", + "We connect you with the nearest drivers for faster pickups and quicker journeys.": + "Wir verbinden Sie mit den nächstgelegenen Fahrern für schnellere Abholungen und kürzere Fahrten.", + "Uncompromising Security": "Kompromisslose Sicherheit", + "Lady Captains Available": "Kapitäninnen verfügbar", + "Recorded Trips (Voice & AI Analysis)": + "Aufgezeichnete Fahrten (Sprach- & KI-Analyse)", + "Fastest Complaint Response": "Schnellste Beschwerdeantwort", + "Our dedicated customer service team ensures swift resolution of any issues.": + "Unser engagiertes Kundenservice-Team sorgt für eine schnelle Lösung aller Probleme.", + "Affordable for Everyone": "Erschwinglich für alle", + "Frequently Asked Questions": "Häufig gestellte Fragen", + "Getting Started": "Erste Schritte", + "Simply open the Intaleq app, enter your destination, and tap \"Request Ride\". The app will connect you with a nearby driver.": + "Öffnen Sie einfach die Intaleq-App, geben Sie Ihr Ziel ein und tippen Sie auf \"Fahrt anfordern\". Die App verbindet Sie mit einem nahegelegenen Fahrer.", + "Vehicle Options": "Fahrzeugoptionen", + "Intaleq offers a variety of options including Economy, Comfort, and Luxury to suit your needs and budget.": + "Intaleq bietet eine Vielzahl von Optionen, darunter Economy, Komfort und Luxus, die Ihren Bedürfnissen und Ihrem Budget entsprechen.", + "Payments": "Zahlungen", + "You can pay for your ride using cash or credit/debit card. You can select your preferred payment method before confirming your ride.": + "Sie können Ihre Fahrt mit Bargeld oder Kredit-/Debitkarte bezahlen. Sie können Ihre bevorzugte Zahlungsmethode vor der Bestätigung Ihrer Fahrt auswählen.", + "Ride Management": "Fahrtmanagement", + "Yes, you can cancel your ride, but please note that cancellation fees may apply depending on how far in advance you cancel.": + "Ja, Sie können Ihre Fahrt stornieren, aber bitte beachten Sie, dass Stornierungsgebühren anfallen können, je nachdem, wie weit im Voraus Sie stornieren.", + "For Drivers": "Für Fahrer", + "Driver Registration": "Fahrerregistrierung", + "To register as a driver or learn about the requirements, please visit our website or contact Intaleq support directly.": + "Um sich als Fahrer zu registrieren oder mehr über die Anforderungen zu erfahren, besuchen Sie bitte unsere Website oder kontaktieren Sie den Intaleq-Support direkt.", + "Visit Website/Contact Support": + "Website besuchen/Support kontaktieren", + "Close": "Schließen", + "We are searching for the nearest driver": + "Wir suchen den nächstgelegenen Fahrer", + "Communication": "Kommunikation", + "How do I communicate with the other party (passenger/driver)?": + "Wie kommuniziere ich mit der anderen Partei (Fahrgast/Fahrer)?", + "You can communicate with your driver or passenger through the in-app chat feature once a ride is confirmed.": + "Sie können mit Ihrem Fahrer oder Fahrgast über die In-App-Chat-Funktion kommunizieren, sobald eine Fahrt bestätigt ist.", + "Safety & Security": "Sicherheit & Schutz", + "What safety measures does Intaleq offer?": + "Welche Sicherheitsmaßnahmen bietet Intaleq?", + "Intaleq offers various safety features including driver verification, in-app trip tracking, emergency contact options, and the ability to share your trip status with trusted contacts.": + "Intaleq bietet verschiedene Sicherheitsfunktionen, darunter Fahrerverifizierung, In-App-Fahrtverfolgung, Notfallkontaktoptionen und die Möglichkeit, Ihren Fahrtstatus mit vertrauenswürdigen Kontakten zu teilen.", + "Enjoy competitive prices across all trip options, making travel accessible.": + "Genießen Sie wettbewerbsfähige Preise für alle Fahrtoptionen, die Reisen zugänglich machen.", + "Variety of Trip Choices": "Vielfalt der Fahrtoptionen", + "Choose the trip option that perfectly suits your needs and preferences.": + "Wählen Sie die Fahrtoption, die perfekt zu Ihren Bedürfnissen und Vorlieben passt.", + "Your Choice, Our Priority": "Ihre Wahl, unsere Priorität", + "Because we are near, you have the flexibility to choose the ride that works best for you.": + "Weil wir in der Nähe sind, haben Sie die Flexibilität, die Fahrt zu wählen, die am besten zu Ihnen passt.", + "duration is": "Dauer ist", + "Setting": "Einstellung", + "Find answers to common questions": + "Finden Sie Antworten auf häufig gestellte Fragen", + "I don't need a ride anymore": "Ich brauche keine Fahrt mehr", + "I was just trying the application": + "Ich habe die Anwendung nur ausprobiert", + "No driver accepted my request": + "Kein Fahrer hat meine Anfrage angenommen", + "I added the wrong pick-up/drop-off location": + "Ich habe den falschen Abhol-/Absetzort hinzugefügt", + "I don't have a reason": "Ich habe keinen Grund", + "Can we know why you want to cancel Ride ?": + "Können wir erfahren, warum Sie die Fahrt stornieren möchten?", + "Add Payment Method": "Zahlungsmethode hinzufügen", + "Ride Wallet": "Fahrt-Portemonnaie", + "Payment Method": "Zahlungsmethode", + "Type here Place": "Geben Sie hier den Ort ein", + "Are You sure to ride to": + "Sind Sie sicher, dass Sie fahren möchten nach", + "Confirm": "Bestätigen", + "You are Delete": "Sie löschen", + "Deleted": "Gelöscht", + "You Dont Have Any places yet !": "Sie haben noch keine Orte!", + "From : Current Location": "Von : Aktueller Standort", + "My Cared": "Meine Karten", + "Add Card": "Karte hinzufügen", + "Add Credit Card": "Kreditkarte hinzufügen", + "Please enter the cardholder name": + "Bitte geben Sie den Namen des Karteninhabers ein", + "Please enter the expiry date": "Bitte geben Sie das Ablaufdatum ein", + "Please enter the CVV code": "Bitte geben Sie den CVV-Code ein", + "Go To Favorite Places": "Zu Lieblingsorten gehen", + "Go to this Target": "Gehen Sie zu diesem Ziel", + "My Profile": "Mein Profil", + "Are you want to go to this site": + "Möchten Sie zu dieser Seite gehen?", + "MyLocation": "Mein Standort", + "my location": "mein Standort", + "Target": "Ziel", + "You Should choose rate figure": + "Sie sollten eine Bewertungszahl auswählen", + "Login Captin": "Kapitän anmelden", + "Register Captin": "Kapitän registrieren", + "Send Verfication Code": "Verifizierungscode senden", + "KM": "KM", + "End Ride": "Fahrt beenden", + "Minute": "Minute", + "Go to passenger Location now": + "Gehen Sie jetzt zum Standort des Fahrgasts", + "Duration of the Ride is ": "Die Dauer der Fahrt beträgt ", + "Distance of the Ride is ": "Die Entfernung der Fahrt beträgt ", + "Name of the Passenger is ": "Der Name des Fahrgasts ist ", + "Hello this is Captain": "Hallo, das ist Kapitän", + "Start the Ride": "Fahrt starten", + "Please Wait If passenger want To Cancel!": + "Bitte warten Sie, wenn der Fahrgast stornieren möchte!", + "Total Duration:": "Gesamtdauer:", + "Active Duration:": "Aktive Dauer:", + "Waiting for Captin ...": "Warten auf Kapitän ...", + "Age is ": "Alter ist ", + "Rating is ": "Bewertung ist ", + " to arrive you.": "um zu Ihnen zu gelangen.", + "Tariff": "Tarif", + "Settings": "Einstellungen", + "Feed Back": "Feedback", + "Please enter a valid 16-digit card number": + "Bitte geben Sie eine gültige 16-stellige Kartennummer ein", + "Add Phone": "Telefon hinzufügen", + "Please enter a phone number": + "Bitte geben Sie eine Telefonnummer ein", + "You dont Add Emergency Phone Yet!": + "Sie haben noch kein Notfalltelefon hinzugefügt!", + "You will arrive to your destination after ": "Sie werden nach ", + "You can cancel Ride now": "Sie können die Fahrt jetzt stornieren", + "You Can cancel Ride After Captain did not come in the time": + "Sie können die Fahrt stornieren, wenn der Kapitän nicht rechtzeitig gekommen ist", + "If you in Car Now. Press Start The Ride": + "Wenn Sie jetzt im Auto sind. Drücken Sie Fahrt starten", + "You Dont Have Any amount in": "Sie haben keinen Betrag in", + "Wallet!": "Portemonnaie!", + "You Have": "Sie haben", + "Save Credit Card": "Kreditkarte speichern", + "Show Promos": "Promotionen anzeigen", + "10 and get 4% discount": "10 und erhalten Sie 4% Rabatt", + "20 and get 6% discount": "20 und erhalten Sie 6% Rabatt", + "40 and get 8% discount": "40 und erhalten Sie 8% Rabatt", + "100 and get 11% discount": "100 und erhalten Sie 11% Rabatt", + "Pay with Your PayPal": "Mit Ihrem PayPal bezahlen", + "You will choose one of above !": + "Sie werden eines der oben genannten auswählen!", + "Edit Profile": "Profil bearbeiten", + "Copy this Promo to use it in your Ride!": + "Kopieren Sie diese Promotion, um sie in Ihrer Fahrt zu verwenden!", + "To change some Settings": "Um einige Einstellungen zu ändern", + "Order Request Page": "Bestellanfrageseite", + "Rouats of Trip": "Routen der Fahrt", + "Passenger Name is ": "Fahrgastname ist ", + "Total From Passenger is ": "Gesamtbetrag vom Fahrgast ist ", + "Duration To Passenger is ": "Dauer bis zum Fahrgast ist ", + "Distance To Passenger is ": "Entfernung bis zum Fahrgast ist ", + "Total For You is ": "Gesamtbetrag für Sie ist ", + "Distance is ": "Entfernung ist ", + " KM": " KM", + "Duration of Trip is ": "Dauer der Fahrt ist ", + " Minutes": " Minuten", + "Apply Order": "Bestellung anwenden", + "Refuse Order": "Bestellung ablehnen", + "Rate Captain": "Kapitän bewerten", + "Enter your Note": "Geben Sie Ihre Notiz ein", + "Type something...": "Geben Sie etwas ein...", + "Submit rating": "Bewertung abschicken", + "Rate Passenger": "Fahrgast bewerten", + "Ride Summary": "Fahrtzusammenfassung", + "welcome_message": "Willkommen bei Intaleq!", + "app_description": + "Intaleq ist eine zuverlässige, sichere und zugängliche Mitfahr-App.", + "get_to_destination": "Erreichen Sie Ihr Ziel schnell und einfach.", + "get_a_ride": + "Mit Intaleq können Sie in wenigen Minuten an Ihr Ziel gelangen.", + "safe_and_comfortable": + "Genießen Sie eine sichere und komfortable Fahrt.", + "committed_to_safety": + "Intaleq setzt sich für Sicherheit ein, und alle unsere Kapitäne werden sorgfältig überprüft.", + "your ride is Accepted": "Ihre Fahrt wurde angenommen", + "Driver is waiting at pickup.": "Der Fahrer wartet am Abholpunkt.", + "Driver is on the way": "Der Fahrer ist unterwegs", + "Contact Options": "Kontaktoptionen", + "Send a custom message": "Benutzerdefinierte Nachricht senden", + "Type your message": "Geben Sie Ihre Nachricht ein", + "I will go now": "Ich werde jetzt gehen", + "You Have Tips": "Sie haben Trinkgeld", + " tips\nTotal is": " Trinkgeld\nGesamtbetrag ist", + "Your fee is ": "Ihre Gebühr ist ", + "Do you want to pay Tips for this Driver": + "Möchten Sie Trinkgeld für diesen Fahrer bezahlen?", + "Tip is ": "Trinkgeld ist ", + "Are you want to wait drivers to accept your order": + "Möchten Sie warten, bis Fahrer Ihre Bestellung annehmen?", + "This price is fixed even if the route changes for the driver.": + "Dieser Preis ist fest, auch wenn sich die Route für den Fahrer ändert.", + "The price may increase if the route changes.": + "Der Preis kann steigen, wenn sich die Route ändert.", + "The captain is responsible for the route.": + "Der Kapitän ist für die Route verantwortlich.", + "We are search for nearst driver": + "Wir suchen den nächstgelegenen Fahrer", + "Your order is being prepared": "Ihre Bestellung wird vorbereitet", + "The drivers are reviewing your request": + "Die Fahrer überprüfen Ihre Anfrage", + "Your order sent to drivers": + "Ihre Bestellung wurde an die Fahrer gesendet", + "You can call or record audio of this trip": + "Sie können anrufen oder das Audio dieser Fahrt aufnehmen", + "The trip has started! Feel free to contact emergency numbers, share your trip, or activate voice recording for the journey": + "Die Fahrt hat begonnen! Zögern Sie nicht, Notrufnummern zu kontaktieren, Ihre Fahrt zu teilen oder die Sprachaufzeichnung für die Reise zu aktivieren", + "Camera Access Denied.": "Kamerazugriff verweigert.", + "Open Settings": "Einstellungen öffnen", + "GPS Required Allow !.": "GPS erforderlich, erlauben!.", + "Your Account is Deleted": "Ihr Konto wurde gelöscht", + "Are you sure to delete your account?": + "Sind Sie sicher, dass Sie Ihr Konto löschen möchten?", + "Your data will be erased after 2 weeks\nAnd you will can't return to use app after 1 month ": + "Ihre Daten werden nach 2 Wochen gelöscht\nUnd Sie können die App nach 1 Monat nicht mehr verwenden ", + "Enter Your First Name": "Geben Sie Ihren Vornamen ein", + "Are you Sure to LogOut?": + "Sind Sie sicher, dass Sie sich abmelden möchten?", + "Email Wrong": "E-Mail falsch", + "Email you inserted is Wrong.": + "Die von Ihnen eingegebene E-Mail ist falsch.", + "You have finished all times ": "Sie haben alle Zeiten beendet ", + "if you want help you can email us here": + "Wenn Sie Hilfe benötigen, können Sie uns hier eine E-Mail senden", + "Thanks": "Danke", + "Email Us": "Senden Sie uns eine E-Mail", + "I cant register in your app in face detection ": + "Ich kann mich in Ihrer App nicht mit Gesichtserkennung registrieren ", + "Hi": "Hallo", + "No face detected": "Kein Gesicht erkannt", + "Image detecting result is ": "Das Ergebnis der Bilderkennung ist ", + "from 3 times Take Attention": "von 3 Malen, achten Sie darauf", + "Be sure for take accurate images please\nYou have": + "Bitte achten Sie darauf, genaue Bilder aufzunehmen\nSie haben", + "image verified": "Bild verifiziert", + "Next": "Weiter", + "There is no help Question here": "Hier gibt es keine Hilfefrage", + "You dont have Points": "Sie haben keine Punkte", + "You Are Stopped For this Day !": "Sie sind für diesen Tag gestoppt!", + "You must be charge your Account": "Sie müssen Ihr Konto aufladen", + "You Refused 3 Rides this Day that is the reason \nSee you Tomorrow!": + "Sie haben 3 Fahrten an diesem Tag abgelehnt, das ist der Grund \nBis morgen!", + "Recharge my Account": "Mein Konto aufladen", + "Ok , See you Tomorrow": "Ok, bis morgen", + "You are Stopped": "Sie sind gestoppt", + "Connected": "Verbunden", + "Not Connected": "Nicht verbunden", + "Your are far from passenger location": + "Sie sind weit vom Standort des Fahrgasts entfernt", + "go to your passenger location before\nPassenger cancel trip": + "gehen Sie zum Standort des Fahrgasts, bevor\n der Fahrgast die Fahrt storniert", + "You will get cost of your work for this trip": + "Sie erhalten die Kosten für Ihre Arbeit für diese Fahrt", + " in your wallet": "in Ihrem Portemonnaie", + "you gain": "Sie erhalten", + "Order Cancelled by Passenger": "Bestellung vom Fahrgast storniert", + "Feedback data saved successfully": + "Feedback-Daten erfolgreich gespeichert", + "No Promo for today .": "Keine Promotion für heute.", + "Select your destination": "Wählen Sie Ihr Ziel aus", + "Search for your Start point": "Suchen Sie Ihren Startpunkt", + "Search for waypoint": "Wegpunkt suchen", + "Current Location": "Aktueller Standort", + "Add Location 1": "Standort 1 hinzufügen", + "You must Verify email !.": "Sie müssen die E-Mail verifizieren!.", + "Cropper": "Zuschneider", + "Saved Sucssefully": "Erfolgreich gespeichert", + "Select Date": "Datum auswählen", + "Birth Date": "Geburtsdatum", + "Ok": "Ok", + "the 500 points equal 30 JOD": "500 Punkte entsprechen 30 JOD", + "the 500 points equal 30 JOD for you \nSo go and gain your money": + "500 Punkte entsprechen 30 JOD für Sie \nAlso los, verdienen Sie Ihr Geld", + "token updated": "Token aktualisiert", + "Add Location 2": "Standort 2 hinzufügen", + "Add Location 3": "Standort 3 hinzufügen", + "Add Location 4": "Standort 4 hinzufügen", + "Waiting for your location": "Warten auf Ihren Standort", + "Search for your destination": "Suchen Sie Ihr Ziel", + "Hi! This is": "Hallo! Das ist", + " I am using": " ich benutze", + " to ride with": " um mitzufahren", + " as the driver.": " als Fahrer.", + "is driving a ": "fährt ein ", + " with license plate ": " mit dem Nummernschild ", + " I am currently located at ": "Ich befinde mich derzeit an ", + "Please go to Car now ": "Bitte gehen Sie jetzt zum Auto ", + "You will receive a code in WhatsApp Messenger": + "Sie erhalten einen Code in WhatsApp Messenger", + "If you need assistance, contact us": + "Wenn Sie Hilfe benötigen, kontaktieren Sie uns", + "Promo Ended": "Promotion beendet", + "Enter the promo code and get": + "Geben Sie den Promo-Code ein und erhalten Sie", + "DISCOUNT": "RABATT", + "No wallet record found": "Kein Portemonnaie-Eintrag gefunden", + "for": "für", + "Intaleq is the safest ride-sharing app that introduces many features for both captains and passengers. We offer the lowest commission rate of just 8%, ensuring you get the best value for your rides. Our app includes insurance for the best captains, regular maintenance of cars with top engineers, and on-road services to ensure a respectful and high-quality experience for all users.": + "Intaleq ist die sicherste Mitfahr-App, die viele Funktionen für sowohl Kapitäne als auch Fahrgäste einführt. Wir bieten die niedrigste Kommissionsrate von nur 8%, um sicherzustellen, dass Sie den besten Wert für Ihre Fahrten erhalten. Unsere App beinhaltet Versicherungen für die besten Kapitäne, regelmäßige Wartung der Autos durch Top-Ingenieure und Dienstleistungen vor Ort, um ein respektvolles und hochwertiges Erlebnis für alle Nutzer zu gewährleisten.", + "You can contact us during working hours from 12:00 - 19:00.": + "Sie können uns während der Arbeitszeiten von 12:00 - 19:00 Uhr kontaktieren.", + "Choose a contact option": "Wählen Sie eine Kontaktoption", + "Work time is from 12:00 - 19:00.\nYou can send a WhatsApp message or email.": + "Die Arbeitszeit ist von 12:00 - 19:00 Uhr.\nSie können eine WhatsApp-Nachricht oder E-Mail senden.", + "Promo code copied to clipboard!": + "Promo-Code in die Zwischenablage kopiert!", + "Copy Code": "Code kopieren", + "Your invite code was successfully applied!": + "Ihr Einladungscode wurde erfolgreich angewendet!", + "Payment Options": "Zahlungsoptionen", + "wait 1 minute to receive message": + "Warten Sie 1 Minute, um die Nachricht zu erhalten", + "You have copied the promo code.": + "Sie haben den Promo-Code kopiert.", + "Select Payment Amount": "Zahlungsbetrag auswählen", + "The promotion period has ended.": + "Die Promotionsperiode ist beendet.", + "Promo Code Accepted": "Promo-Code akzeptiert", + "Tap on the promo code to copy it!": + "Tippen Sie auf den Promo-Code, um ihn zu kopieren!", + "Lowest Price Achieved": "Niedrigster Preis erreicht", + "Cannot apply further discounts.": + "Weitere Rabatte können nicht angewendet werden.", + "Promo Already Used": "Promotion bereits verwendet", + "Invitation Used": "Einladung verwendet", + "You have already used this promo code.": + "Sie haben diesen Promo-Code bereits verwendet.", + "Insert Your Promo Code": "Geben Sie Ihren Promo-Code ein", + "Enter promo code here": "Geben Sie den Promo-Code hier ein", + "Please enter a valid promo code": + "Bitte geben Sie einen gültigen Promo-Code ein", + "Awfar Car": "Awfar Auto", + "Old and affordable, perfect for budget rides.": + "Alt und erschwinglich, perfekt für preiswerte Fahrten.", + " If you need to reach me, please contact the driver directly at": + " Wenn Sie mich erreichen müssen, kontaktieren Sie bitte den Fahrer direkt unter", + "No Car or Driver Found in your area.": + "Kein Auto oder Fahrer in Ihrer Region gefunden.", + "Please Try anther time ": + "Bitte versuchen Sie es zu einem anderen Zeitpunkt ", + "There no Driver Aplly your order sorry for that ": + "Es hat kein Fahrer Ihre Bestellung angenommen, tut uns leid ", + "Trip Cancelled": "Fahrt storniert", + "The Driver Will be in your location soon .": + "Der Fahrer wird bald an Ihrem Standort sein .", + "The distance less than 500 meter.": + "Die Entfernung beträgt weniger als 500 Meter.", + "Promo End !": "Promotion beendet!", + "There is no notification yet": "Es gibt noch keine Benachrichtigung", + "Use Touch ID or Face ID to confirm payment": + "Verwenden Sie Touch ID oder Face ID, um die Zahlung zu bestätigen", + "Contact us for any questions on your order.": + "Kontaktieren Sie uns bei Fragen zu Ihrer Bestellung.", + "Pyament Cancelled .": "Zahlung storniert .", + "type here": "hier eingeben", + "Scan Driver License": "Führerschein scannen", + "Please put your licence in these border": + "Bitte legen Sie Ihren Führerschein in diesen Rahmen", + "Camera not initialized yet": "Kamera noch nicht initialisiert", + "Take Image": "Bild aufnehmen", + "AI Page": "KI-Seite", + "Take Picture Of ID Card": "Machen Sie ein Bild Ihres Ausweises", + "Take Picture Of Driver License Card": + "Machen Sie ein Bild Ihrer Führerscheinkarte", + "We are process picture please wait ": + "Wir verarbeiten das Bild, bitte warten Sie ", + "There is no data yet.": "Es gibt noch keine Daten.", + "Name :": "Name :", + "Drivers License Class: ": "Führerscheinklasse: ", + "Document Number: ": "Dokumentennummer: ", + "Address: ": "Adresse: ", + "Height: ": "Größe: ", + "Expiry Date: ": "Ablaufdatum: ", + "Date of Birth: ": "Geburtsdatum: ", + "You can't continue with us .\nYou should renew Driver license": + "Sie können nicht mit uns fortfahren.\nSie sollten Ihren Führerschein erneuern", + "Detect Your Face ": "Erkennen Sie Ihr Gesicht ", + "Go to next step\nscan Car License.": + "Gehen Sie zum nächsten Schritt\nscannen Sie die Fahrzeuglizenz.", + "Name in arabic": "Name auf Arabisch", + "Drivers License Class": "Führerscheinklasse", + "Selected Date": "Ausgewähltes Datum", + "Select Time": "Zeit auswählen", + "Selected Time": "Ausgewählte Zeit", + "Selected Date and Time": "Ausgewähltes Datum und Uhrzeit", + "Lets check Car license ": + "Lassen Sie uns die Fahrzeuglizenz überprüfen ", + "Car": "Auto", + "Plate": "Nummernschild", + "Rides": "Fahrten", + "Selected driver": "Ausgewählter Fahrer", + "Lets check License Back Face": + "Lassen Sie uns die Rückseite des Führerscheins überprüfen", + "Car License Card": "Fahrzeuglizenzkarte", + "No image selected yet": "Noch kein Bild ausgewählt", + "Made :": "Hergestellt :", + "model :": "Modell :", + "VIN :": "Fahrgestellnummer :", + "year :": "Jahr :", + "ُExpire Date": "Ablaufdatum", + "Login Driver": "Fahrer anmelden", + "Password must br at least 6 character.": + "Das Passwort muss mindestens 6 Zeichen lang sein.", + "if you don't have account": "wenn Sie kein Konto haben", + "Here recorded trips audio": + "Hier sind die Audioaufnahmen der Fahrten", + "Register as Driver": "Als Fahrer registrieren", + "By selecting \"I Agree\" below, I have reviewed and agree to the Terms of Use and acknowledge the ": + "Durch die Auswahl von \"Ich stimme zu\" bestätige ich, dass ich die Nutzungsbedingungen gelesen und akzeptiert habe und die ", + "Log Out Page": "Abmeldeseite", + "Log Off": "Abmelden", + "Register Driver": "Fahrer registrieren", + "Verify Email For Driver": "E-Mail für Fahrer verifizieren", + "Admin DashBoard": "Admin-Dashboard", + "Your name": "Ihr Name", + "your ride is applied": "Ihre Fahrt wurde übernommen", + "H and": "Stunden und", + "JOD": "JOD", + "m": "Minuten", + "We search nearst Driver to you": + "Wir suchen den nächstgelegenen Fahrer für Sie", + "please wait till driver accept your order": + "Bitte warten Sie, bis der Fahrer Ihre Bestellung annimmt", + "No accepted orders? Try raising your trip fee to attract riders.": + "Keine angenommenen Bestellungen? Versuchen Sie, Ihre Fahrpreise zu erhöhen, um Fahrer anzulocken.", + "You should select one": "Sie sollten eines auswählen", + "The driver accept your order for": + "Der Fahrer hat Ihre Bestellung für", + "The driver on your way": "Der Fahrer ist auf dem Weg zu Ihnen", + "Total price from ": "Gesamtpreis ab ", + "Order Details Intaleq": "Bestelldetails Geschwindigkeit", + "Selected file:": "Ausgewählte Datei:", + "Your trip cost is": "Ihre Fahrtkosten betragen", + "this will delete all files from your device": + "Dadurch werden alle Dateien von Ihrem Gerät gelöscht", + "Exclusive offers and discounts always with the Intaleq app": + "Exklusive Angebote und Rabatte immer mit der Intaleq-App", + "Submit Question": "Frage einreichen", + "Please enter your Question.": "Bitte geben Sie Ihre Frage ein.", + "Help Details": "Hilfedetails", + "No trip yet found": "Noch keine Fahrt gefunden", + "No Response yet.": "Noch keine Antwort.", + " You Earn today is ": " Sie haben heute verdient ", + " You Have in": " Sie haben in", + "Total points is ": "Die Gesamtpunktzahl beträgt ", + "Total Connection Duration:": "Gesamte Verbindungsdauer:", + "Passenger name : ": "Fahrgastname : ", + "Cost Of Trip IS ": "Die Fahrtkosten betragen ", + "Arrival time": "Ankunftszeit", + "arrival time to reach your point": + "Ankunftszeit, um Ihren Punkt zu erreichen", + "For Intaleq and scooter trips, the price is calculated dynamically. For Comfort trips, the price is based on time and distance": + "Für Schnell- und Rollerfahrten wird der Preis dynamisch berechnet. Für Komfortfahrten basiert der Preis auf Zeit und Entfernung.", + "Hello this is Driver": "Hallo, das ist der Fahrer", + "Is the Passenger in your Car ?": "Ist der Fahrgast in Ihrem Auto?", + "Please wait for the passenger to enter the car before starting the trip.": + "Bitte warten Sie, bis der Fahrgast ins Auto steigt, bevor Sie die Fahrt starten.", + "No ,still Waiting.": "Nein, noch warten.", + "I arrive you": "Ich komme zu Ihnen", + "I Arrive your site": "Ich bin an Ihrem Standort angekommen", + "You are not in near to passenger location": + "Sie sind nicht in der Nähe des Standorts des Fahrgasts", + "please go to picker location exactly": + "Bitte gehen Sie genau zum Abholort", + "You Can Cancel Trip And get Cost of Trip From": + "Sie können die Fahrt stornieren und die Fahrtkosten von", + "Are you sure to cancel?": + "Sind Sie sicher, dass Sie stornieren möchten?", + "Insert Emergincy Number": "Notrufnummer einfügen", + "Best choice for comfort car and flexible route and stops point": + "Beste Wahl für ein komfortables Auto und eine flexible Route mit Haltepunkten", + "Insert": "Einfügen", + "This is for scooter or a motorcycle.": + "Dies ist für einen Roller oder ein Motorrad.", + "This trip goes directly from your starting point to your destination for a fixed price. The driver must follow the planned route": + "Diese Fahrt geht direkt von Ihrem Startpunkt zu Ihrem Ziel für einen festen Preis. Der Fahrer muss der geplanten Route folgen.", + "You can decline a request without any cost": + "Sie können eine Anfrage ohne Kosten ablehnen", + "Perfect for adventure seekers who want to experience something new and exciting": + "Perfekt für Abenteurer, die etwas Neues und Aufregendes erleben möchten", + "My current location is:": "Mein aktueller Standort ist:", + "and I have a trip on": "und ich habe eine Fahrt am", + "App with Passenger": "App mit Fahrgast", + "You will be pay the cost to driver or we will get it from you on next trip": + "Sie werden die Kosten an den Fahrer zahlen oder wir werden sie bei der nächsten Fahrt von Ihnen einziehen", + "Trip has Steps": "Die Fahrt hat Schritte", + "Distance from Passenger to destination is ": + "Die Entfernung vom Fahrgast zum Ziel beträgt ", + "price is": "Preis ist", + "This ride type does not allow changes to the destination or additional stops": + "Dieser Fahrttyp erlaubt keine Änderungen des Ziels oder zusätzliche Stopps", + "This price may be changed": "Dieser Preis kann geändert werden", + "No SIM card, no problem! Call your driver directly through our app. We use advanced technology to ensure your privacy.": + "Keine SIM-Karte, kein Problem! Rufen Sie Ihren Fahrer direkt über unsere App an. Wir verwenden fortschrittliche Technologie, um Ihre Privatsphäre zu gewährleisten.", + "This ride type allows changes, but the price may increase": + "Dieser Fahrttyp erlaubt Änderungen, aber der Preis kann steigen", + "Select one message": "Wählen Sie eine Nachricht", + "I'm waiting for you": "Ich warte auf Sie", + "We noticed the Intaleq is exceeding 100 km/h. Please slow down for your safety. If you feel unsafe, you can share your trip details with a contact or call the police using the red SOS button.": + "Wir haben festgestellt, dass die Geschwindigkeit 100 km/h überschreitet. Bitte verlangsamen Sie für Ihre Sicherheit. Wenn Sie sich unsicher fühlen, können Sie Ihre Fahrtdetails mit einem Kontakt teilen oder die Polizei über die rote SOS-Taste anrufen.", + "Warning: Intaleqing detected!": + "Warnung: Geschwindigkeitsüberschreitung erkannt!", + "Please help! Contact me as soon as possible.": + "Bitte helfen Sie! Kontaktieren Sie mich so schnell wie möglich.", + "Share Trip Details": "Fahrtdetails teilen", + "Car Plate is ": "Das Nummernschild ist ", + "the 300 points equal 300 L.E for you \nSo go and gain your money": + "300 Punkte entsprechen 300 L.E für Sie \nAlso los, verdienen Sie Ihr Geld", + "the 300 points equal 300 L.E": "300 Punkte entsprechen 300 L.E", + "The payment was not approved. Please try again.": + "Die Zahlung wurde nicht genehmigt. Bitte versuchen Sie es erneut.", + "Payment Failed": "Zahlung fehlgeschlagen", + "This is a scheduled notification.": + "Dies ist eine geplante Benachrichtigung.", + "An error occurred during the payment process.": + "Während des Zahlungsvorgangs ist ein Fehler aufgetreten.", + "The payment was approved.": "Die Zahlung wurde genehmigt.", + "Payment Successful": "Zahlung erfolgreich", + "No ride found yet": "Noch keine Fahrt gefunden", + "Accept Order": "Bestellung annehmen", + "Bottom Bar Example": "Beispiel für die untere Leiste", + "Driver phone": "Fahrertelefon", + "Statistics": "Statistiken", + "Origin": "Ursprung", + "Destination": "Ziel", + "Driver Name": "Fahrername", + "Driver Car Plate": "Fahrer-Nummernschild", + "Available for rides": "Verfügbar für Fahrten", + "Scan Id": "ID scannen", + "Camera not initilaized yet": "Kamera noch nicht initialisiert", + "Scan ID MklGoogle": "ID MklGoogle scannen", + "Language": "Sprache", + "Jordan": "Jordanien", + "USA": "USA", + "Egypt": "Ägypten", + "Turkey": "Türkei", + "Saudi Arabia": "Saudi-Arabien", + "Qatar": "Katar", + "Bahrain": "Bahrain", + "Kuwait": "Kuwait", + "But you have a negative salary of": + "Aber Sie haben ein negatives Gehalt von", + "Promo Code": "Promo-Code", + "Your trip distance is": "Ihre Fahrtstrecke beträgt", + "Enter promo code": "Promo-Code eingeben", + "You have promo!": "Sie haben eine Promotion!", + "Cost Duration": "Kostendauer", + "Duration is": "Dauer ist", + "Leave": "Verlassen", + "Join": "Beitreten", + "Heading your way now. Please be ready.": + "Jetzt auf dem Weg zu Ihnen. Bitte seien Sie bereit.", + "Approaching your area. Should be there in 3 minutes.": + "Nähern Sie sich Ihrem Gebiet. Sollte in 3 Minuten da sein.", + "There's heavy traffic here. Can you suggest an alternate pickup point?": + "Hier herrscht starker Verkehr. Können Sie einen alternativen Abholpunkt vorschlagen?", + "This ride is already taken by another driver.": + "Diese Fahrt wurde bereits von einem anderen Fahrer übernommen.", + "You Should be select reason.": "Sie sollten einen Grund auswählen.", + "Waiting for Driver ...": "Warten auf Fahrer ...", + "Latest Recent Trip": "Letzte kürzliche Fahrt", + "from your list": "aus Ihrer Liste", + "Do you want to change Work location": + "Möchten Sie den Arbeitsort ändern?", + "Do you want to change Home location": + "Möchten Sie den Wohnort ändern?", + "We Are Sorry That we dont have cars in your Location!": + "Es tut uns leid, dass wir keine Autos in Ihrer Region haben!", + "Choose from Map": "Aus der Karte auswählen", + "Pick your ride location on the map - Tap to confirm": + "Wählen Sie Ihren Fahrtort auf der Karte aus - Tippen Sie, um zu bestätigen", + "Intaleq is the ride-hailing app that is safe, reliable, and accessible.": + "Intaleq ist die Mitfahr-App, die sicher, zuverlässig und zugänglich ist.", + "With Intaleq, you can get a ride to your destination in minutes.": + "Mit Intaleq können Sie in wenigen Minuten eine Fahrt zu Ihrem Ziel bekommen.", + "Intaleq is committed to safety, and all of our captains are carefully screened and background checked.": + "Intaleq setzt sich für Sicherheit ein, und alle unsere Kapitäne werden sorgfältig überprüft.", + "Pick from map": "Aus der Karte auswählen", + "No Car in your site. Sorry!": + "Kein Auto in Ihrer Region. Entschuldigung!", + "Nearest Car for you about ": "Nächstes Auto für Sie in etwa ", + "From :": "Von :", + "Get Details of Trip": "Fahrtdetails erhalten", + "If you want add stop click here": + "Wenn Sie einen Stopp hinzufügen möchten, klicken Sie hier", + "Where you want go ": "Wohin Sie gehen möchten ", + "My Card": "Meine Karte", + "Start Record": "Aufnahme starten", + "History of Trip": "Fahrtverlauf", + "Helping Center": "Hilfezentrum", + "Record saved": "Aufnahme gespeichert", + "Trips recorded": "Fahrten aufgezeichnet", + "Select Your Country": "Wählen Sie Ihr Land aus", + "To ensure you receive the most accurate information for your location, please select your country below. This will help tailor the app experience and content to your country.": + "Um sicherzustellen, dass Sie die genauesten Informationen für Ihren Standort erhalten, wählen Sie bitte unten Ihr Land aus. Dies hilft, das App-Erlebnis und den Inhalt auf Ihr Land zuzuschneiden.", + "Are you sure to delete recorded files": + "Sind Sie sicher, dass Sie die aufgezeichneten Dateien löschen möchten?", + "Select recorded trip": "Aufgezeichnete Fahrt auswählen", + "Card Number": "Kartennummer", + "Hi, Where to ": "Hallo, wohin ", + "Pick your destination from Map": + "Wählen Sie Ihr Ziel aus der Karte aus", + "Add Stops": "Stopps hinzufügen", + "Get Direction": "Route erhalten", + "Add Location": "Standort hinzufügen", + "Switch Rider": "Fahrgast wechseln", + "You will arrive to your destination after timer end.": + "Sie werden nach Ablauf des Timers an Ihrem Ziel ankommen.", + "You can cancel trip": "Sie können die Fahrt stornieren", + "The driver waitting you in picked location .": + "Der Fahrer wartet an dem ausgewählten Ort auf Sie .", + "Pay with Your": "Bezahlen Sie mit Ihrem", + "Pay with Credit Card": "Mit Kreditkarte bezahlen", + "Show Promos to Charge": "Promotionen zum Aufladen anzeigen", + "Point": "Punkt", + "How many hours would you like to wait?": + "Wie viele Stunden möchten Sie warten?", + "Driver Wallet": "Fahrer-Portemonnaie", + "Choose between those Type Cars": + "Wählen Sie zwischen diesen Autotypen", + "hour": "Stunde", + "Select Waiting Hours": "Wartezeit auswählen", + "Total Points is": "Die Gesamtpunktzahl beträgt", + "You will receive a code in SMS message": + "Sie erhalten einen Code per SMS", + "Done": "Fertig", + "Total Budget from trips is ": + "Das Gesamtbudget aus Fahrten beträgt ", + "Total Amount:": "Gesamtbetrag:", + "Total Budget from trips by\nCredit card is ": + "Das Gesamtbudget aus Fahrten per\nKreditkarte beträgt ", + "This amount for all trip I get from Passengers": + "Dieser Betrag für alle Fahrten, die ich von Fahrgästen erhalte", + "Pay from my budget": "Aus meinem Budget bezahlen", + "This amount for all trip I get from Passengers and Collected For me in": + "Dieser Betrag für alle Fahrten, die ich von Fahrgästen erhalte und für mich gesammelt habe in", + "You can buy points from your budget": + "Sie können Punkte aus Ihrem Budget kaufen", + "insert amount": "Betrag einfügen", + "You can buy Points to let you online\nby this list below": + "Sie können Punkte kaufen, um online zu gehen\nmit dieser Liste unten", + "Create Wallet to receive your money": + "Erstellen Sie ein Portemonnaie, um Ihr Geld zu erhalten", + "Enter your feedback here": "Geben Sie Ihr Feedback hier ein", + "Please enter your feedback.": "Bitte geben Sie Ihr Feedback ein.", + "Feedback": "Feedback", + "Submit ": "Einreichen ", + "Click here to Show it in Map": + "Klicken Sie hier, um es auf der Karte anzuzeigen", + "Canceled": "Storniert", + "No I want": "Nein, ich möchte", + "Email is": "E-Mail ist", + "Phone Number is": "Telefonnummer ist", + "Date of Birth is": "Geburtsdatum ist", + "Sex is ": "Geschlecht ist ", + "Car Details": "Autodetails", + "VIN is": "Fahrgestellnummer ist", + "Color is ": "Farbe ist ", + "Make is ": "Marke ist ", + "Model is": "Modell ist", + "Year is": "Jahr ist", + "Expiration Date ": "Ablaufdatum ", + "Edit Your data": "Bearbeiten Sie Ihre Daten", + "write vin for your car": + "Geben Sie die Fahrgestellnummer Ihres Autos ein", + "VIN": "Fahrgestellnummer", + "Please verify your identity": + "Bitte verifizieren Sie Ihre Identität", + "write Color for your car": "Geben Sie die Farbe Ihres Autos ein", + "write Make for your car": "Geben Sie die Marke Ihres Autos ein", + "write Model for your car": "Geben Sie das Modell Ihres Autos ein", + "write Year for your car": "Geben Sie das Jahr Ihres Autos ein", + "write Expiration Date for your car": + "Geben Sie das Ablaufdatum Ihres Autos ein", + "Tariffs": "Tarife", + "Minimum fare": "Mindesttarif", + "Maximum fare": "Höchsttarif", + "Flag-down fee": "Grundpreis", + "Including Tax": "Inklusive Steuer", + "BookingFee": "Buchungsgebühr", + "Morning": "Morgen", + "from 07:30 till 10:30 (Thursday, Friday, Saturday, Monday)": + "von 07:30 bis 10:30 (Donnerstag, Freitag, Samstag, Montag)", + "Evening": "Abend", + "from 12:00 till 15:00 (Thursday, Friday, Saturday, Monday)": + "von 12:00 bis 15:00 (Donnerstag, Freitag, Samstag, Montag)", + "Night": "Nacht", + "You have in account": "Sie haben auf dem Konto", + "Select Country": "Land auswählen", + "Ride Today : ": "Fahrt heute : ", + "After this period\nYou can't cancel!": + "Nach diesem Zeitraum\nkönnen Sie nicht mehr stornieren!", + "from 23:59 till 05:30": "von 23:59 bis 05:30", + "Rate Driver": "Fahrer bewerten", + "Total Cost is ": "Die Gesamtkosten betragen ", + "Write note": "Notiz schreiben", + "Time to arrive": "Ankunftszeit", + "Ride Summaries": "Fahrtzusammenfassungen", + "Total Cost": "Gesamtkosten", + "Average of Hours of": "Durchschnitt der Stunden von", + " is ON for this month": " ist diesen Monat aktiviert", + "Days": "Tage", + "Total Hours on month": "Gesamtstunden im Monat", + "Counts of Hours on days": "Anzahl der Stunden pro Tag", + "OrderId": "Bestell-ID", + "created time": "Erstellungszeit", + "Intaleq Over": "Geschwindigkeitsüberschreitung", + "I will slow down": "Ich werde langsamer fahren", + "Map Passenger": "Karte Fahrgast", + "Be Slowly": "Langsam sein", + "If you want to make Google Map App run directly when you apply order": + "Wenn Sie möchten, dass die Google Map App direkt ausgeführt wird, wenn Sie eine Bestellung aufgeben", + "You can change the language of the app": + "Sie können die Sprache der App ändern", + "Your Budget less than needed": + "Ihr Budget ist geringer als benötigt", + "You can change the Country to get all features": + "Sie können das Land ändern, um alle Funktionen zu erhalten", + "There is no Car or Driver in your area.": + "In Ihrer Region gibt es kein Auto oder Fahrer.", + "Change Country": "Land ändern", + }, + "es": { + "1 Passenger": "1 Passenger", + "2 Passengers": "2 Passengers", + "3 Passengers": "3 Passengers", + "4 Passengers": "4 Passengers", + "2. Attach Recorded Audio (Optional)": + "2. Attach Recorded Audio (Optional)", + "Account": "Account", + "Actions": "Actions", + "Active Users": "Active Users", + "Add a Stop": "Add a Stop", + "Add a new waypoint stop": "Add a new waypoint stop", + "After this period\nYou can\'t cancel!": + "After this period\nYou can\'t cancel!", + "Age is": "Age is", + "Alert": "Alert", + "An OTP has been sent to your number.": + "An OTP has been sent to your number.", + "An error occurred": "An error occurred", + "Appearance": "Appearance", + "Are you sure you want to delete this file?": + "Are you sure you want to delete this file?", + "Are you sure you want to logout?": + "Are you sure you want to logout?", + "Arrived": "Arrived", + "Audio Recording": "Audio Recording", + "Call": "Call", + "Call Support": "Call Support", + "Call left": "Call left", + "Change Photo": "Change Photo", + "Choose from Gallery": "Choose from Gallery", + "Choose from contact": "Choose from contact", + "Click to track the trip": "Click to track the trip", + "Close panel": "Close panel", + "Coming": "Coming", + "Complete Payment": "Complete Payment", + "Confirm Cancellation": "Confirm Cancellation", + "Confirm Pickup Location": "Confirm Pickup Location", + "Connection failed. Please try again.": + "Connection failed. Please try again.", + "Could not create ride. Please try again.": + "Could not create ride. Please try again.", + "Crop Photo": "Crop Photo", + "Dark Mode": "Dark Mode", + "Delete": "Delete", + "Delete Account": "Delete Account", + "Delete All": "Delete All", + "Delete All Recordings?": "Delete All Recordings?", + "Delete Recording?": "Delete Recording?", + "Destination Set": "Destination Set", + "Distance": "Distance", + "Double tap to open search or enter destination": + "Double tap to open search or enter destination", + "Double tap to set or change this waypoint on the map": + "Double tap to set or change this waypoint on the map", + "Drawing route on map...": "Drawing route on map...", + "Driver Phone": "Driver Phone", + "Driver is Going To You": "Driver is Going To You", + "Emergency Mode Triggered": "Emergency Mode Triggered", + "Emergency SOS": "Emergency SOS", + "Enter the 5-digit code": "Enter the 5-digit code", + "Enter your City": "Enter your City", + "Enter your Password": "Enter your Password", + "Failed to book trip: \$e": "Failed to book trip: \$e", + "Failed to get location": "Failed to get location", + "Failed to initiate payment. Please try again.": + "Failed to initiate payment. Please try again.", + "Failed to send OTP": "Failed to send OTP", + "Failed to upload photo": "Failed to upload photo", + "Finished": "Finished", + "Fixed Price": "Fixed Price", + "General": "General", + "Grant": "Grant", + "Have a Promo Code?": "Have a Promo Code?", + "Hello! I\'m inviting you to try Intaleq.": + "Hello! I\'m inviting you to try Intaleq.", + "Hi ,I Arrive your site": "Hi ,I Arrive your site", + "Hi, Where to": "Hi, Where to", + "Home": "Home", + "I am currently located at": "I am currently located at", + "I'm Safe": "I'm Safe", + "If you need to reach me, please contact the driver directly at": + "If you need to reach me, please contact the driver directly at", + "Image Upload Failed": "Image Upload Failed", + "Intaleq Passenger": "Intaleq Passenger", + "Invite": "Invite", + "Join a channel": "Join a channel", + "Last Name": "Last Name", + "Leave a detailed comment (Optional)": + "Leave a detailed comment (Optional)", + "Light Mode": "Light Mode", + "Listen": "Listen", + "Location": "Location", + "Location Received": "Location Received", + "Logout": "Logout", + "Map Error": "Map Error", + "Message": "Message", + "Move map to select destination": "Move map to select destination", + "Move map to set start location": "Move map to set start location", + "Move map to set stop": "Move map to set stop", + "Move map to your home location": "Move map to your home location", + "Move map to your pickup point": "Move map to your pickup point", + "Move map to your work location": "Move map to your work location", + "N/A": "N/A", + "No Notifications": "No Notifications", + "No Recordings Found": "No Recordings Found", + "No Rides now!": "No Rides now!", + "No contacts available": "No contacts available", + "No i want": "No i want", + "No notification data found.": "No notification data found.", + "No routes available for this destination.": + "No routes available for this destination.", + "No user found": "No user found", + "No,I want": "No,I want", + "No.Iwant Cancel Trip.": "No.Iwant Cancel Trip.", + "Now move the map to your pickup point": + "Now move the map to your pickup point", + "Now set the pickup point for the other person": + "Now set the pickup point for the other person", + "On Trip": "On Trip", + "Open": "Open", + "Open destination search": "Open destination search", + "Open in Google Maps": "Open in Google Maps", + "Order VIP Canceld": "Order VIP Canceld", + "Passenger": "Passenger", + "Passenger cancel order": "Passenger cancel order", + "Pay by MTN Wallet": "Pay by MTN Wallet", + "Pay by Sham Cash": "Pay by Sham Cash", + "Pay by Syriatel Wallet": "Pay by Syriatel Wallet", + "Pay with PayPal": "Pay with PayPal", + "Phone": "Phone", + "Phone Number": "Phone Number", + "Phone Number Check": "Phone Number Check", + "Phone number seems too short": "Phone number seems too short", + "Phone verified. Please complete registration.": + "Phone verified. Please complete registration.", + "Pick destination on map": "Pick destination on map", + "Pick location on map": "Pick location on map", + "Pick on map": "Pick on map", + "Pick start point on map": "Pick start point on map", + "Plan Your Route": "Plan Your Route", + "Please add contacts to your phone.": + "Please add contacts to your phone.", + "Please check your internet and try again.": + "Please check your internet and try again.", + "Please enter a valid email.": "Please enter a valid email.", + "Please enter a valid phone number.": + "Please enter a valid phone number.", + "Please enter the number without the leading 0": + "Please enter the number without the leading 0", + "Please enter your phone number": "Please enter your phone number", + "Please go to Car now": "Please go to Car now", + "Please select a reason first": "Please select a reason first", + "Please set a valid SOS phone number.": + "Please set a valid SOS phone number.", + "Please slow down": "Please slow down", + "Please wait while we prepare your trip.": + "Please wait while we prepare your trip.", + "Preferences": "Preferences", + "Profile photo updated": "Profile photo updated", + "Quick Message": "Quick Message", + "Rating is": "Rating is", + "Received empty route data.": "Received empty route data.", + "Record": "Record", + "Record your trips to see them here.": + "Record your trips to see them here.", + "Rejected Orders Count": "Rejected Orders Count", + "Remove waypoint": "Remove waypoint", + "Report": "Report", + "Route and prices have been calculated successfully!": + "Route and prices have been calculated successfully!", + "SOS": "SOS", + "Save": "Save", + "Save Changes": "Save Changes", + "Save Name": "Save Name", + "Search country": "Search country", + "Search for a starting point": "Search for a starting point", + "Select Appearance": "Select Appearance", + "Select Education": "Select Education", + "Select Gender": "Select Gender", + "Select This Ride": "Select This Ride", + "Select betweeen types": "Select betweeen types", + "Send Email": "Send Email", + "Send SOS": "Send SOS", + "Send WhatsApp Message": "Send WhatsApp Message", + "Server Error": "Server Error", + "Server error": "Server error", + "Server error. Please try again.": "Server error. Please try again.", + "Set Destination": "Set Destination", + "Set Phone Number": "Set Phone Number", + "Set as Home": "Set as Home", + "Set as Stop": "Set as Stop", + "Set as Work": "Set as Work", + "Share": "Share", + "Share Trip": "Share Trip", + "Share your experience to help us improve...": + "Share your experience to help us improve...", + "Something went wrong. Please try again.": + "Something went wrong. Please try again.", + "Speaking...": "Speaking...", + "Speed Over": "Speed Over", + "Start Point": "Start Point", + "Stay calm. We are here to help.": "Stay calm. We are here to help.", + "Stop": "Stop", + "Submit Rating": "Submit Rating", + "Support & Info": "Support & Info", + "System Default": "System Default", + "Take a Photo": "Take a Photo", + "Tap to apply your discount": "Tap to apply your discount", + "Tap to search your destination": "Tap to search your destination", + "The driver cancelled the trip.": "The driver cancelled the trip.", + "This action cannot be undone.": "This action cannot be undone.", + "This action is permanent and cannot be undone.": + "This action is permanent and cannot be undone.", + "This is for delivery or a motorcycle.": + "This is for delivery or a motorcycle.", + "Time": "Time", + "To :": "To :", + "Top up Balance": "Top up Balance", + "Top up Balance to continue": "Top up Balance to continue", + "Total Invites": "Total Invites", + "Total Price": "Total Price", + "Trip booked successfully": "Trip booked successfully", + "Type your message...": "Type your message...", + "Unknown Location": "Unknown Location", + "Update Name": "Update Name", + "Verified Passenger": "Verified Passenger", + "View Map": "View Map", + "Wait for the trip to start first": + "Wait for the trip to start first", + "Waiting...": "Waiting...", + "Warning": "Warning", + "Waypoint has been set successfully": + "Waypoint has been set successfully", + "We use location to get accurate and nearest driver for you": + "We use location to get accurate and nearest driver for you", + "WhatsApp": "WhatsApp", + "Why do you want to cancel?": "Why do you want to cancel?", + "Yes": "Yes", + "You should ideintify your gender for this type of trip!": + "You should ideintify your gender for this type of trip!", + "You will choose one of above!": "You will choose one of above!", + "Your Rewards": "Your Rewards", + "Your complaint has been submitted.": + "Your complaint has been submitted.", + "and acknowledge our Privacy Policy.": + "and acknowledge our Privacy Policy.", + "as the driver.": "as the driver.", + "cancelled": "cancelled", + "due to a previous trip.": "due to a previous trip.", + "insert sos phone": "insert sos phone", + "is driving a": "is driving a", + "min added to fare": "min added to fare", + "phone not verified": "phone not verified", + "to arrive you.": "to arrive you.", + "unknown": "unknown", + "wait 1 minute to recive message": "wait 1 minute to recive message", + "with license plate": "with license plate", + "witout zero": "witout zero", + "you must insert token code": "you must insert token code", + "Syria": "Siria", + "SYP": "SYP", + "Order": "Pedido", + "OrderVIP": "Pedido VIP", + "Cancel Trip": "Cancelar viaje", + "Passenger Cancel Trip": "El pasajero canceló el viaje", + "VIP Order": "Pedido VIP", + "The driver accepted your trip": "El conductor aceptó su viaje", + "message From passenger": "Mensaje del pasajero", + "Cancel": "Cancelar", + "Trip Cancelled. The cost of the trip will be added to your wallet.": + "Viaje cancelado. El costo del viaje se añadirá a tu billetera.", + "token change": "cambio de token", + "Changed my mind": "He cambiado de opinión", + "Please write the reason...": "Por favor escriba el motivo...", + "Found another transport": "Encontré otro transporte", + "Driver is taking too long": "El conductor tarda demasiado", + "Driver asked me to cancel": "El conductor me pidió que cancelara", + "Wrong pickup location": "Lugar de recogida incorrecto", + "Other": "Otro", + "Don't Cancel": "No cancelar", + "No Drivers Found": "No se encontraron conductores", + "Sorry, there are no cars available of this type right now.": + "Lo sentimos, no hay coches de este tipo disponibles en este momento.", + "Refresh Map": "Actualizar mapa", + "face detect": "detección facial", + "Face Detection Result": "Resultado de detección facial", + "similar": "similar", + "not similar": "no es similar", + "Searching for nearby drivers...": "Buscando conductores cercanos...", + "Error": "Error", + "Failed to search, please try again later": + "Error en la búsqueda, inténtelo de nuevo más tarde", + "Connection Error": "Error de conexión", + "Please check your internet connection": + "Por favor, verifique su conexión a internet", + "Sorry 😔": "Lo sentimos 😔", + "The driver cancelled the trip for an emergency reason.\nDo you want to search for another driver immediately?": + "El conductor canceló el viaje por un motivo de emergencia.\n¿Desea buscar otro conductor de inmediato?", + "Search for another driver": "Buscar otro conductor", + "We apologize 😔": "Pedimos disculpas 😔", + "No drivers found at the moment.\nPlease try again later.": + "No se encontraron conductores en este momento.\nInténtelo de nuevo más tarde.", + "Hi ,I will go now": "Hola, iré ahora", + "Passenger come to you": "El pasajero viene a ti", + "Call Income": "Llamada entrante", + "Call Income from Passenger": "Llamada entrante del pasajero", + "Criminal Document Required": "Se requiere antecedente penal", + "You should have upload it .": "Deberías haberlo subido.", + "Call End": "Fin de la llamada", + "The order has been accepted by another driver.": + "El pedido ha sido aceptado por otro conductor.", + "The order Accepted by another Driver": + "El pedido fue aceptado por otro conductor", + "We regret to inform you that another driver has accepted this order.": + "Lamentamos informarte que otro conductor ha aceptado este pedido.", + "Driver Applied the Ride for You": + "El conductor aplicó el viaje por ti", + "Applied": "Aplicado", + "Please go to Car Driver": "Por favor, ve al conductor del coche", + "Ok I will go now.": "Ok, iré ahora.", + "Accepted Ride": "Viaje aceptado", + "Driver Accepted the Ride for You": + "El conductor aceptó el viaje por ti", + "Promo": "Promo", + "Show latest promo": "Mostrar la última promoción", + "Trip Monitoring": "Monitoreo de viaje", + "Driver Is Going To Passenger": "El conductor va hacia el pasajero", + "Please stay on the picked point.": + "Por favor, permanece en el punto seleccionado.", + "message From Driver": "Mensaje del conductor", + "Trip is Begin": "El viaje comienza", + "Cancel Trip from driver": "Cancelar viaje por el conductor", + "We will look for a new driver.\nPlease wait.": + "Buscaremos un nuevo conductor.\nPor favor, espera.", + "The driver canceled your ride.": "El conductor canceló tu viaje.", + "Driver Finish Trip": "El conductor finalizó el viaje", + "you will pay to Driver": "pagarás al conductor", + "Don’t forget your personal belongings.": + "No olvides tus pertenencias personales.", + "Please make sure you have all your personal belongings and that any remaining fare, if applicable, has been added to your wallet before leaving. Thank you for choosing the Intaleq app": + "Por favor, asegúrate de tener todas tus pertenencias personales y que cualquier tarifa restante, si corresponde, se haya añadido a tu billetera antes de salir. Gracias por elegir la aplicación Intaleq", + "Finish Monitor": "Finalizar monitor", + "Trip finished": "Viaje finalizado", + "Call Income from Driver": "Llamada entrante del conductor", + "Driver Cancelled Your Trip": "El conductor canceló su viaje", + "you will pay to Driver you will be pay the cost of driver time look to your Intaleq Wallet": + "pagarás al conductor, pagarás el costo del tiempo del conductor, revisa tu billetera Intaleq", + "Order Applied": "Pedido aplicado", + "welcome to intaleq": "Bienvenido a Intaleq", + "login or register subtitle": "Inicia sesión o regístrate", + "Complaint cannot be filed for this ride. It may not have been completed or started.": + "No se puede presentar una queja por este viaje. Es posible que no se haya completado o iniciado.", + "phone number label": "Número de teléfono", + "phone number required": "Número de teléfono requerido", + "send otp button": "Enviar código", + "verify your number title": "Verifica tu número", + "otp sent subtitle": "Código de verificación enviado", + "verify and continue button": "Verificar y continuar", + "enter otp validation": "Por favor ingrese el código", + "one last step title": "Un último paso", + "complete profile subtitle": "Completa tu perfil", + "first name label": "Nombre", + "first name required": "Nombre requerido", + "last name label": "Apellido", + "Verify OTP": "Verificar código", + "Verification Code": "Código de verificación", + "We have sent a verification code to your mobile number:": + "Hemos enviado un código de verificación a su número de móvil:", + "Verify": "Verificar", + "Resend Code": "Reenviar código", + "You can resend in": "Puedes reenviar en", + "seconds": "segundos", + "Please enter the complete 6-digit code.": + "Por favor, ingrese el código completo de 6 dígitos.", + "last name required": "Apellido requerido", + "email optional label": "correo electrónico (opcional)", + "complete registration button": "Completar registro", + "User with this phone number or email already exists.": + "Ya existe un usuario con este número de teléfono o correo electrónico.", + "otp sent success": "Código enviado con éxito", + "failed to send otp": "Error al enviar el código", + "server error try again": "error de servidor, intente de nuevo", + "an error occurred": "ocurrió un error", + "otp verification failed": "Fallo en la verificación del código", + "registration failed": "Registro fallido", + "welcome user": "Bienvenido", + "Don't forget your personal belongings.": + "No olvide sus pertenencias personales.", + "Share App": "Compartir aplicación", + "Wallet": "Billetera", + "Balance": "Saldo", + "Profile": "Perfil", + "Contact Support": "Contactar con soporte", + "Session expired. Please log in again.": + "Sesión expirada. Por favor, inicie sesión de nuevo.", + "Security Warning": "Advertencia de seguridad", + "Potential security risks detected. The application may not function correctly.": + "Se detectaron posibles riesgos de seguridad. Es posible que la aplicación no funcione correctamente.", + "please order now": "por favor ordene ahora", + "Where to": "A dónde", + "Where are you going?": "¿A dónde vas?", + "Quick Actions": "Acciones rápidas", + "My Balance": "Mi saldo", + "Order History": "Historial de pedidos", + "Contact Us": "Contáctanos", + "Driver": "Conductor", + "Complaint": "Queja", + "Promos": "Promociones", + "Recent Places": "Lugares recientes", + "From": "Desde", + "WhatsApp Location Extractor": "Extractor de ubicación de WhatsApp", + "Location Link": "Enlace de ubicación", + "Paste location link here": "Pega el enlace de ubicación aquí", + "Go to this location": "Ir a esta ubicación", + "Paste WhatsApp location link": + "Pega el enlace de ubicación de WhatsApp", + "Select Order Type": "Seleccionar tipo de pedido", + "Choose who this order is for": "Elige para quién es este pedido", + "I want to order for myself": "Quiero pedir para mí", + "I want to order for someone else": "Quiero pedir para alguien más", + "Order for someone else": "Pedido para alguien más", + "Order for myself": "Pedido para mí", + "Are you want to go this site": "¿Quieres ir a este sitio?", + "No": "No", + "Intaleq Wallet": "Billetera Intaleq", + "Have a promo code?": "¿Tienes un código promocional?", + "Your Wallet balance is ": "El saldo de tu billetera es ", + "Cash": "Efectivo", + "Pay directly to the captain": "Pagar directamente al capitán", + "Top up Wallet to continue": "Recarga la billetera para continuar", + "Or pay with Cash instead": "O pague en efectivo en su lugar", + "Confirm & Find a Ride": "Confirmar y encontrar un viaje", + "Balance:": "Saldo:", + "Alerts": "Alertas", + "Welcome Back!": "¡Bienvenido de nuevo!", + "No contacts found": "No se encontraron contactos", + "No contacts with phone numbers were found on your device.": + "No se encontraron contactos con números de teléfono en su dispositivo.", + "Permission denied": "Permiso denegado", + "Contact permission is required to pick contacts": + "Se requiere permiso de contactos para elegir contactos", + "An error occurred while picking contacts:": + "Ocurrió un error al seleccionar los contactos:", + "Please enter a correct phone": + "Por favor, ingresa un teléfono correcto", + "Success": "Éxito", + "Invite sent successfully": "Invitación enviada con éxito", + "Hello! I'm inviting you to try Intaleq.": + "¡Hola! Te invito a probar Intaleq.", + "Use my invitation code to get a special gift on your first ride!": + "¡Usa mi código de invitación para obtener un regalo especial en tu primer viaje!", + "Your personal invitation code is:": + "Tu código de invitación personal es:", + "Be sure to use it quickly! This code expires at": + "¡Asegúrate de usarlo rápido! Este código vence a las", + "Download the app now:": "Descarga la aplicación ahora:", + "See you on the road!": "¡Nos vemos en el camino!", + "This phone number has already been invited.": + "Este número de teléfono ya ha sido invitado.", + "An unexpected error occurred. Please try again.": + "Ocurrió un error inesperado. Inténtalo de nuevo.", + "You deserve the gift": "Te mereces el regalo", + "Claim your 20 LE gift for inviting": + "Reclama tu regalo de 20 LE por invitar", + "You have got a gift for invitation": + "Has recibido un regalo por invitación", + "You have earned 20": "Has ganado 20", + "LE": "LE", + "Vibration feedback for all buttons": + "Retroalimentación de vibración para todos los botones", + "Share with friends and earn rewards": + "Comparte con amigos y gana recompensas", + "Gift Already Claimed": "Regalo ya reclamado", + "You have already received your gift for inviting": + "Ya has recibido tu regalo por invitar", + "Keep it up!": "¡Sigue así!", + "has completed": "se ha completado", + "trips": "viajes", + "Personal Information": "Información personal", + "Name": "Nombre", + "Not set": "No establecido", + "Gender": "Género", + "Education": "Educación", + "Work & Contact": "Trabajo y contacto", + "Employment Type": "Tipo de empleo", + "Marital Status": "Estado civil", + "SOS Phone": "Teléfono SOS", + "Sign Out": "Cerrar sesión", + "Delete My Account": "Eliminar mi cuenta", + "Update Gender": "Actualizar género", + "Update": "Actualizar", + "Update Education": "Actualizar educación", + "Are you sure? This action cannot be undone.": + "¿Estás seguro? Esta acción no se puede deshacer.", + "Confirm your Email": "Confirma tu correo electrónico", + "Type your Email": "Escribe tu correo electrónico", + "Delete Permanently": "Eliminar permanentemente", + "Male": "Hombre", + "Female": "Mujer", + "High School Diploma": "Diploma de bachillerato", + "Associate Degree": "Título de asociado", + "Bachelor's Degree": "Licenciatura", + "Master's Degree": "Maestría", + "Doctoral Degree": "Doctorado", + "Select your preferred language for the app interface.": + "Seleccione su idioma preferido para la interfaz de la aplicación.", + "Language Options": "Opciones de idioma", + "You can claim your gift once they complete 2 trips.": + "Puedes reclamar tu regalo una vez que completen 2 viajes.", + "Closest & Cheapest": "Más cercano y más barato", + "Comfort choice": "Opción Confort", + "Travel in a modern, silent electric car. A premium, eco-friendly choice for a smooth ride.": + "Viaja en un coche eléctrico moderno y silencioso. Una opción ecológica y de primera calidad para un viaje suave.", + "Spacious van service ideal for families and groups. Comfortable, safe, and cost-effective travel together.": + "Servicio de furgoneta espaciosa ideal para familias y grupos. Viaje juntos de forma cómoda, segura y económica.", + "Quiet & Eco-Friendly": "Silencioso y ecológico", + "Lady Captain for girls": "Conductora para chicas", + "Van for familly": "Furgoneta familiar", + "Are you sure to delete this location?": + "¿Estás seguro de eliminar esta ubicación?", + "Submit a Complaint": "Enviar una queja", + "Submit Complaint": "Enviar queja", + "No trip history found": "No se encontró historial de viajes", + "Your past trips will appear here.": + "Tus viajes pasados aparecerán aquí.", + "1. Describe Your Issue": "1. Describa su problema", + "Enter your complaint here...": "Ingrese su queja aquí...", + "2. Attach Recorded Audio": "2. Adjuntar audio grabado", + "No audio files found.": "No se encontraron archivos de audio.", + "Confirm Attachment": "Confirmar archivo adjunto", + "Attach this audio file?": "¿Adjuntar este archivo de audio?", + "Uploaded": "Subido", + "3. Review Details & Response": "3. Revisar detalles y respuesta", + "Date": "Fecha", + "Today's Promos": "Promos de hoy", + "No promos available right now.": + "No hay promociones disponibles en este momento.", + "Check back later for new offers!": + "¡Vuelve más tarde para ver nuevas ofertas!", + "Valid Until:": "Válido hasta:", + "CODE": "CÓDIGO", + "Login": "Iniciar sesión", + "Sign in for a seamless experience": + "Inicia sesión para una experiencia sin interrupciones", + "Sign In with Google": "Iniciar sesión con Google", + "Sign in with Apple": "Iniciar sesión con Apple", + "User not found": "Usuario no encontrado", + "Need assistance? Contact us": "¿Necesitas ayuda? Contáctanos", + "Email": "Correo electrónico", + "Your email address": "Tu dirección de correo electrónico", + "Enter a valid email": "Ingresa un correo electrónico válido", + "Password": "Contraseña", + "Your password": "Tu contraseña", + "Enter your password": "Ingresa tu contraseña", + "Submit": "Enviar", + "Terms of Use & Privacy Notice": + "Términos de uso y aviso de privacidad", + "By selecting \"I Agree\" below, I confirm that I have read and agree to the ": + "Al seleccionar \"Acepto\" a continuación, confirmo que he leído y acepto los ", + "Terms of Use": "Términos de uso", + " and acknowledge the ": " y reconozco los ", + "Privacy Notice": "Aviso de privacidad", + ". I am at least 18 years old.": ". Tengo al menos 18 años.", + "I Agree": "Acepto", + "Continue": "Continuar", + "Enable Location": "Habilitar ubicación", + "To give you the best experience, we need to know where you are. Your location is used to find nearby captains and for pickups.": + "Para brindarle la mejor experiencia, necesitamos saber dónde se encuentra. Su ubicación se utiliza para encontrar capitanes cercanos y para las recogidas.", + "Allow Location Access": "Permitir acceso a la ubicación", + "Welcome to Intaleq!": "¡Bienvenido a Intaleq!", + "Before we start, please review our terms.": + "Antes de comenzar, revise nuestros términos.", + "Your journey starts here": "Tu viaje comienza aquí", + "Cancel Search": "Cancelar búsqueda", + "Set pickup location": "Establecer lugar de recogida", + "Move the map to adjust the pin": "Mueve el mapa para ajustar el pin", + "Searching for the nearest captain...": + "Buscando al capitán más cercano...", + "No one accepted? Try increasing the fare.": + "¿Nadie aceptó? Intenta aumentar la tarifa.", + "Increase Your Trip Fee (Optional)": + "Aumenta la tarifa de tu viaje (Opcional)", + "We haven't found any drivers yet. Consider increasing your trip fee to make your offer more attractive to drivers.": + "Aún no hemos encontrado conductores. Considera aumentar la tarifa de tu viaje para hacer tu oferta más atractiva para los conductores.", + "No, thanks": "No, gracias", + "Increase Fee": "Aumentar tarifa", + "Copy": "Copiar", + "Promo Copied!": "¡Promoción copiada!", + "Code": "Código", + "copied to clipboard": "copiado al portapapeles", + "Price": "Precio", + "Intaleq's Response": "Respuesta de Intaleq", + "Awaiting response...": "Esperando respuesta...", + "Audio file not attached": "Archivo de audio no adjunto", + "The audio file is not uploaded yet.\nDo you want to submit without it?": + "El archivo de audio aún no se ha subido.\n¿Quiere enviarlo sin él?", + "deleted": "eliminado", + "To Work": "Al trabajo", + "Work Saved": "Trabajo guardado", + "To Home": "A casa", + "Home Saved": "Casa guardada", + "Destination selected": "Destino seleccionado", + "Now select start pick": "Ahora selecciona el punto de inicio", + "OK": "OK", + "Confirm Pick-up Location": "Confirmar ubicación de recogida", + "Set Location on Map": "Establecer ubicación en el mapa", + "You can contact us during working hours from 10:00 - 16:00.": + "Puede contactarnos durante el horario laboral de 10:00 a 16:00.", + "Intaleq is the safest and most reliable ride-sharing app designed especially for passengers in Syria. We provide a comfortable, respectful, and affordable riding experience with features that prioritize your safety and convenience. Our trusted captains are verified, insured, and supported by regular car maintenance carried out by top engineers. We also offer on-road support services to make sure every trip is smooth and worry-free. With Intaleq, you enjoy quality, safety, and peace of mind—every time you ride.": + "Intaleq es la aplicación de transporte compartido más segura y confiable diseñada especialmente para pasajeros en Siria. Brindamos una experiencia de viaje cómoda, respetuosa y asequible con características que priorizan su seguridad y conveniencia. Nuestros capitanes de confianza están verificados, asegurados y respaldados por el mantenimiento regular del automóvil realizado por los mejores ingenieros. También ofrecemos servicios de apoyo en carretera para asegurarnos de que cada viaje sea sencillo y sin preocupaciones. Con Intaleq, disfruta de calidad, seguridad y tranquilidad cada vez que viaja.", + "Customer MSISDN doesn’t have customer wallet": + "El MSISDN del cliente no tiene billetera", + "Nearest Car: ~": "Coche más cercano: ~", + "Nearest Car": "Coche más cercano", + "No cars nearby": "No hay coches cerca", + "Favorite Places": "Lugares favoritos", + "No favorite places yet!": "¡Aún no tienes lugares favoritos!", + "from your favorites": "de tus favoritos", + "Back": "Atrás", + "Enter your code below to apply the discount.": + "Ingrese su código a continuación para aplicar el descuento.", + "By selecting \"I Agree\" below, I confirm that I have read and agree to the": + "Al seleccionar \"Acepto\" a continuación, confirmo que he leído y acepto los", + "and acknowledge the": "y reconozco el", + "Enable Location Access": "Habilitar acceso a la ubicación", + "We need your location to find nearby drivers for pickups and drop-offs.": + "Necesitamos tu ubicación para encontrar conductores cercanos para recogidas y dejadas.", + "You should restart app to change language": + "Debes reiniciar la aplicación para cambiar el idioma", + "Home Page": "Página de inicio", + "To change Language the App": + "Para cambiar el idioma de la aplicación", + "Learn more about our app and mission": + "Aprende más sobre nuestra aplicación y misión", + "Promos For Today": "Promociones para hoy", + "Choose your ride": "Elige tu viaje", + "Your Journey Begins Here": "Tu viaje comienza aquí", + "Bonus gift": "Regalo de bonificación", + "Pay": "Pagar", + "Get": "Obtener", + "Send to Driver Again": "Enviar al conductor nuevamente", + "Driver Name:": "Nombre del conductor:", + "No trip data available": "No hay datos de viaje disponibles", + "Car Plate:": "Matrícula del coche:", + "remaining": "restante", + "Order Cancelled": "Pedido cancelado", + "You canceled VIP trip": "Cancelaste el viaje VIP", + "Passenger cancelled order": "El pasajero canceló el pedido", + "Your trip is scheduled": "Tu viaje está programado", + "Don't forget your ride!": "¡No olvides tu viaje!", + "Trip updated successfully": "Viaje actualizado con éxito", + "Car Make:": "Marca del coche:", + "Car Model:": "Modelo del coche:", + "Car Color:": "Color del coche:", + "Driver Phone:": "Teléfono del conductor:", + "Pre-booking": "Reserva anticipada", + "Waiting VIP": "Esperando VIP", + "Driver List": "Lista de conductores", + "Confirm Trip": "Confirmar viaje", + "Select date and time of trip": "Seleccionar fecha y hora del viaje", + "Date and Time Picker": "Selector de fecha y hora", + "Trip Status:": "Estado del viaje:", + "pending": "pendiente", + "accepted": "aceptado", + "rejected": "rechazado", + "Apply": "Aplicar", + "Enter your promo code": "Ingresa tu código de promoción", + "Apply Promo Code": "Aplicar código de promoción", + "Scheduled Time:": "Hora programada:", + "No drivers available": "No hay conductores disponibles", + "No drivers available at the moment. Please try again later.": + "No hay conductores disponibles en este momento. Por favor, inténtalo de nuevo más tarde.", + "you have a negative balance of": "tienes un saldo negativo de", + "Please try again in a few moments": + "Por favor, inténtalo de nuevo en unos momentos", + "Unknown Driver": "Conductor desconocido", + "in your": "en tu", + "The driver accepted your order for": + "El conductor aceptó tu pedido para", + "wallet due to a previous trip.": + "billetera debido a un viaje anterior.", + "rides": "viajes", + "Add Work": "Añadir trabajo", + "The reason is": "La razón es", + "User does not have a wallet #1652": + "El usuario no tiene una billetera #1652", + "Price of trip": "Precio del viaje", + "From:": "Desde:", + "For Intaleq and Delivery trips, the price is calculated dynamically. For Comfort trips, the price is based on time and distance": + "Para viajes de velocidad y entrega, el precio se calcula dinámicamente. Para viajes de confort, el precio se basa en el tiempo y la distancia.", + "Phone Wallet Saved Successfully": + "Billetera telefónica guardada con éxito", + "Add wallet phone you use": + "Añade el teléfono de la billetera que usas", + "Update Available": "Actualización disponible", + "Phone number must be exactly 11 digits long": + "El número de teléfono debe tener exactamente 11 dígitos", + "Insert Wallet phone number": + "Ingresa el número de teléfono de la billetera", + "Phone number isn't an Egyptian phone number": + "El número de teléfono no es un número egipcio", + "A new version of the app is available. Please update to the latest version.": + "Hay una nueva versión de la aplicación disponible. Por favor, actualiza a la última versión.", + "We use location to get accurate and nearest passengers for you": + "Usamos la ubicación para obtener pasajeros precisos y cercanos para ti", + "This ride is already applied by another driver.": + "Este viaje ya ha sido aplicado por otro conductor.", + "We use your precise location to find the nearest available driver and provide accurate pickup and dropoff information. You can manage this in Settings.": + "Usamos tu ubicación precisa para encontrar el conductor disponible más cercano y proporcionar información precisa de recogida y dejada. Puedes gestionar esto en Configuración.", + "Where are you, sir?": "¿Dónde estás, señor?", + "I've been trying to reach you but your phone is off.": + "He estado intentando contactarte pero tu teléfono está apagado.", + "Please don't be late": "Por favor, no llegues tarde", + "Please don't be late, I'm waiting for you at the specified location.": + "Por favor, no llegues tarde, te estoy esperando en la ubicación especificada.", + "My location is correct. You can search for me using the navigation app": + "Mi ubicación es correcta. Puedes buscarme usando la aplicación de navegación.", + "Hello, I'm at the agreed-upon location": + "Hola, estoy en la ubicación acordada", + "How much longer will you be?": "¿Cuánto tiempo más tardarás?", + "Phone number is verified before": + "El número de teléfono ya ha sido verificado", + "Change Ride": "Cambiar viaje", + "You can change the destination by long-pressing any point on the map": + "Puedes cambiar el destino manteniendo presionado cualquier punto en el mapa", + "Pick from map destination": "Elige el destino en el mapa", + "Pick or Tap to confirm": "Elige o toca para confirmar", + "Accepted your order": "Tu pedido ha sido aceptado", + "Order Accepted": "Pedido aceptado", + "with type": "con tipo", + "accepted your order at price": "aceptó tu pedido al precio de", + "you canceled order": "cancelaste el pedido", + "If you want order to another person": + "Si quieres pedir para otra persona", + "upgrade price": "aumentar el precio", + "airport": "aeropuerto", + "Best choice for a comfortable car with a flexible route and stop points. This airport offers visa entry at this price.": + "Mejor opción para un coche cómodo con una ruta flexible y puntos de parada. Este aeropuerto ofrece entrada con visa a este precio.", + "You can upgrade price to may driver accept your order": + "Puedes aumentar el precio para que el conductor acepte tu pedido", + "Change Route": "Cambiar ruta", + "No Captain Accepted Your Order": "Ningún capitán aceptó tu pedido", + "We are looking for a captain but the price may increase to let a captain accept": + "Estamos buscando un capitán, pero el precio puede aumentar para que un capitán acepte", + "No, I want to cancel this trip": "No, quiero cancelar este viaje", + "Attention": "Atención", + "Trip Cancelled. The cost of the trip will be deducted from your wallet.": + "Viaje cancelado. El costo del viaje se deducirá de tu billetera.", + "You will be charged for the cost of the driver coming to your location.": + "Se te cobrará el costo del conductor que viene a tu ubicación.", + "reject your order.": "rechazó tu pedido.", + "Order Under Review": "Pedido en revisión", + "is reviewing your order. They may need more information or a higher price.": + "está revisando tu pedido. Pueden necesitar más información o un precio más alto.", + "Vibration": "Vibración", + "Resend code": "Reenviar código", + "change device": "cambiar dispositivo", + "Device Change Detected": "Cambio de dispositivo detectado", + "You can only use one device at a time. This device will now be set as your active device.": + "Solo puedes usar un dispositivo a la vez. Este dispositivo se establecerá ahora como tu dispositivo activo.", + "Click here point": "Haz clic aquí", + "Are you want to change": "¿Quieres cambiar?", + "by": "por", + "Enter your complaint here": "Ingresa tu queja aquí", + "Please enter your complaint.": "Por favor, ingresa tu queja.", + "Complaint data saved successfully": + "Datos de la queja guardados con éxito", + "Trip Monitor": "Monitor de viaje", + "Insert SOS Phone": "Insertar teléfono SOS", + "Add SOS Phone": "Añadir teléfono SOS", + "Dear ,\n\n 🚀 I have just started an exciting trip and I would like to share the details of my journey and my current location with you in real-time! Please download the Intaleq app. It will allow you to view my trip details and my latest location.\n\n 👉 Download link: \n Android [https://play.google.com/store/apps/details?id=com.mobileapp.store.ride]\n iOS [https://getapp.cc/app/6458734951]\n\n I look forward to keeping you close during my adventure!\n\n Intaleq ,": + "Estimado ,\n\n 🚀 ¡Acabo de comenzar un viaje emocionante y me gustaría compartir los detalles de mi trayecto y mi ubicación actual contigo en tiempo real! Por favor, descarga la aplicación Intaleq. Te permitirá ver los detalles de mi viaje y mi última ubicación.\n\n 👉 Enlace de descarga: \n Android [https://play.google.com/store/apps/details?id=com.mobileapp.store.ride]\n iOS [https://getapp.cc/app/6458734951]\n\n ¡Espero mantenerte cerca durante mi aventura!\n\n Intaleq ,", + "Send Intaleq app to him": "Enviarle la aplicación Intaleq", + "No passenger found for the given phone number": + "No se encontró ningún pasajero para el número de teléfono proporcionado", + "No user found for the given phone number": + "No se encontró ningún usuario para el número de teléfono proporcionado", + "This price is": "Este precio es", + "Work": "Trabajo", + "Add Home": "Añadir casa", + "Notifications": "Notificaciones", + "💳 Pay with Credit Card": "💳 Pagar con tarjeta de crédito", + "⚠️ You need to choose an amount!": "⚠️ ¡Necesitas elegir un monto!", + "💰 Pay with Wallet": "Pagar con billetera", + "You must restart the app to change the language.": + "Debes reiniciar la aplicación para cambiar el idioma.", + "joined": "se unió", + "Driver joined the channel": "El conductor se unió al canal", + "Driver left the channel": "El conductor dejó el canal", + "Call Page": "Página de llamada", + "Call Left": "Llamada restante", + " Next as Cash !": " ¡Siguiente como efectivo!", + "To use Wallet charge it": "Para usar la billetera, cárgala", + "We are searching for the nearest driver to you": + "Estamos buscando al conductor más cercano para ti", + "Best choice for cities": "Mejor opción para ciudades", + "Rayeh Gai: Round trip service for convenient travel between cities, easy and reliable.": + "Rayeh Gai: Servicio de viaje redondo para un viaje conveniente entre ciudades, fácil y confiable.", + "This trip is for women only": "Este viaje es solo para mujeres", + "Total budgets on month": "Presupuestos totales del mes", + "You have call from driver": "Tienes una llamada del conductor", + "Intaleq": "Velocidad", + "passenger agreement": "Acuerdo de pasajero", + "To become a passenger, you must review and agree to the ": + "Para ser pasajero, debe revisar y aceptar los ", + "agreement subtitle": "Aceptar los términos", + "terms of use": "Términos de uso", + " and acknowledge our Privacy Policy.": + " y reconozca nuestra política de privacidad.", + "and acknowledge our": "y reconozca nuestro", + "privacy policy": "Política de privacidad", + "i agree": "Estoy de acuerdo", + "Driver already has 2 trips within the specified period.": + "El conductor ya tiene 2 viajes dentro del período especificado.", + "The invitation was sent successfully": + "La invitación fue enviada con éxito", + "You should select your country": "Debes seleccionar tu país", + "Scooter": "Scooter", + "A trip with a prior reservation, allowing you to choose the best captains and cars.": + "Un viaje con reserva previa, que te permite elegir a los mejores capitanes y coches.", + "Mishwar Vip": "Mishwar Vip", + "The driver waiting you in picked location .": + "El conductor te espera en la ubicación seleccionada.", + "About Us": "Sobre nosotros", + "You can change the vibration feedback for all buttons": + "Puedes cambiar la retroalimentación de vibración para todos los botones", + "Most Secure Methods": "Métodos más seguros", + "In-App VOIP Calls": "Llamadas VOIP en la aplicación", + "Recorded Trips for Safety": "Viajes grabados para seguridad", + "\nWe also prioritize affordability, offering competitive pricing to make your rides accessible.": + "\nTambién priorizamos la asequibilidad, ofreciendo precios competitivos para que tus viajes sean accesibles.", + "Intaleq is a ride-sharing app designed with your safety and affordability in mind. We connect you with reliable drivers in your area, ensuring a convenient and stress-free travel experience.\n\nHere are some of the key features that set us apart:": + "Intaleq es una aplicación de viajes compartidos diseñada pensando en tu seguridad y asequibilidad. Te conectamos con conductores confiables en tu área, asegurando una experiencia de viaje conveniente y sin estrés.\n\nAquí hay algunas de las características clave que nos diferencian:", + "Sign In by Apple": "Iniciar sesión con Apple", + "Sign In by Google": "Iniciar sesión con Google", + "How do I request a ride?": "¿Cómo solicito un viaje?", + "Step-by-step instructions on how to request a ride through the Intaleq app.": + "Instrucciones paso a paso sobre cómo solicitar un viaje a través de la aplicación Intaleq.", + "What types of vehicles are available?": + "¿Qué tipos de vehículos están disponibles?", + "Intaleq offers a variety of vehicle options to suit your needs, including economy, comfort, and luxury. Choose the option that best fits your budget and passenger count.": + "Intaleq ofrece una variedad de opciones de vehículos para adaptarse a tus necesidades, incluyendo economía, confort y lujo. Elige la opción que mejor se ajuste a tu presupuesto y número de pasajeros.", + "How can I pay for my ride?": "¿Cómo puedo pagar mi viaje?", + "Intaleq offers multiple payment methods for your convenience. Choose between cash payment or credit/debit card payment during ride confirmation.": + "Intaleq ofrece múltiples métodos de pago para tu conveniencia. Elige entre pago en efectivo o con tarjeta de crédito/débito durante la confirmación del viaje.", + "Can I cancel my ride?": "¿Puedo cancelar mi viaje?", + "Yes, you can cancel your ride under certain conditions (e.g., before driver is assigned). See the Intaleq cancellation policy for details.": + "Sí, puedes cancelar tu viaje bajo ciertas condiciones (por ejemplo, antes de que se asigne un conductor). Consulta la política de cancelación de Intaleq para más detalles.", + "Driver Registration & Requirements": + "Registro y requisitos del conductor", + "How can I register as a driver?": + "¿Cómo puedo registrarme como conductor?", + "What are the requirements to become a driver?": + "¿Cuáles son los requisitos para convertirse en conductor?", + "Visit our website or contact Intaleq support for information on driver registration and requirements.": + "Visita nuestro sitio web o contacta al soporte de Intaleq para obtener información sobre el registro y los requisitos del conductor.", + "Intaleq provides in-app chat functionality to allow you to communicate with your driver or passenger during your ride.": + "Intaleq ofrece funcionalidad de chat en la aplicación para que puedas comunicarte con tu conductor o pasajero durante tu viaje.", + "Intaleq prioritizes your safety. We offer features like driver verification, in-app trip tracking, and emergency contact options.": + "Intaleq prioriza tu seguridad. Ofrecemos funciones como verificación del conductor, seguimiento del viaje en la aplicación y opciones de contacto de emergencia.", + "Frequently Questions": "Preguntas frecuentes", + "User does not exist.": "El usuario no existe.", + "We need your phone number to contact you and to help you.": + "Necesitamos tu número de teléfono para contactarte y ayudarte.", + "You will recieve code in sms message": + "Recibirás el código en un mensaje SMS", + "Please enter": "Por favor, ingresa", + "We need your phone number to contact you and to help you receive orders.": + "Necesitamos tu número de teléfono para contactarte y ayudarte a recibir pedidos.", + "The full name on your criminal record does not match the one on your driver's license. Please verify and provide the correct documents.": + "El nombre completo en su antecedente penal no coincide con el de su licencia de conducir. Verifique y proporcione los documentos correctos.", + "The national number on your driver's license does not match the one on your ID document. Please verify and provide the correct documents.": + "El número nacional de su licencia de conducir no coincide con el de su documento de identidad. Verifique y proporcione los documentos correctos.", + "Capture an Image of Your Criminal Record": + "Captura una imagen de tu registro criminal", + "IssueDate": "Fecha de emisión", + "Capture an Image of Your car license front": + "Capturar una imagen del frente de su licencia de auto", + "Capture an Image of Your ID Document front": + "Captura una imagen de la parte frontal de tu documento de identidad", + "NationalID": "Identificación nacional", + "You can share the Intaleq App with your friends and earn rewards for rides they take using your code": + "Puedes compartir la aplicación Intaleq con tus amigos y ganar recompensas por los viajes que hagan usando tu código", + "FullName": "Nombre completo", + "No invitation found yet!": + "¡Aún no se ha encontrado ninguna invitación!", + "InspectionResult": "Resultado de la inspección", + "Criminal Record": "Registro criminal", + "The email or phone number is already registered.": + "El correo electrónico o número de teléfono ya está registrado.", + "To become a ride-sharing driver on the Intaleq app, you need to upload your driver's license, ID document, and car registration document. Our AI system will instantly review and verify their authenticity in just 2-3 minutes. If your documents are approved, you can start working as a driver on the Intaleq app. Please note, submitting fraudulent documents is a serious offense and may result in immediate termination and legal consequences.": + "Para convertirte en un conductor de viajes compartidos en la aplicación Intaleq, debes subir tu licencia de conducir, documento de identidad y documento de registro del coche. Nuestro sistema de IA revisará y verificará su autenticidad en solo 2-3 minutos. Si tus documentos son aprobados, puedes comenzar a trabajar como conductor en la aplicación Intaleq. Ten en cuenta que enviar documentos fraudulentos es un delito grave y puede resultar en la terminación inmediata y consecuencias legales.", + "Documents check": "Verificación de documentos", + "Driver's License": "Licencia de conducir", + "for your first registration!": "¡para tu primer registro!", + "Get it Now!": "¡Consíguelo ahora!", + "before": "antes", + "Code not approved": "Código no aprobado", + "3000 LE": "3000 LE", + "Do you have an invitation code from another driver?": + "¿Tienes un código de invitación de otro conductor?", + "Paste the code here": "Pega el código aquí", + "No, I don't have a code": "No, no tengo un código", + "Audio uploaded successfully.": "Audio subido con éxito.", + "Perfect for passengers seeking the latest car models with the freedom to choose any route they desire": + "Perfecto para pasajeros que buscan los últimos modelos de coches con la libertad de elegir cualquier ruta que deseen", + "Share this code with your friends and earn rewards when they use it!": + "¡Comparte este código con tus amigos y gana recompensas cuando lo usen!", + "Enter phone": "Ingresar teléfono", + "complete, you can claim your gift": + "completo, puedes reclamar tu regalo", + "When": "Cuándo", + "Enter driver's phone": "Ingresar teléfono del conductor", + "Send Invite": "Enviar invitación", + "Show Invitations": "Mostrar invitaciones", + "License Type": "Tipo de licencia", + "National Number": "Número nacional", + "Name (Arabic)": "Nombre (árabe)", + "Name (English)": "Nombre (inglés)", + "Address": "Dirección", + "Issue Date": "Fecha de emisión", + "Expiry Date": "Fecha de vencimiento", + "License Categories": "Categorías de licencia", + "driver_license": "licencia de conducir", + "Capture an Image of Your Driver License": + "Captura una imagen de tu licencia de conducir", + "ID Documents Back": "Parte trasera de los documentos de identidad", + "National ID": "Identificación nacional", + "Occupation": "Ocupación", + "Religion": "Religión", + "Full Name (Marital)": "Nombre completo (estado civil)", + "Expiration Date": "Fecha de vencimiento", + "Capture an Image of Your ID Document Back": + "Captura una imagen de la parte trasera de tu documento de identidad", + "ID Documents Front": "Parte frontal de los documentos de identidad", + "First Name": "Nombre", + "CardID": "ID de la tarjeta", + "Vehicle Details Front": "Detalles del vehículo (frente)", + "Plate Number": "Número de placa", + "Owner Name": "Nombre del propietario", + "Vehicle Details Back": "Detalles del vehículo (parte trasera)", + "Make": "Marca", + "Model": "Modelo", + "Year": "Año", + "Chassis": "Chasis", + "Color": "Color", + "Displacement": "Cilindrada", + "Fuel": "Combustible", + "Tax Expiry Date": "Fecha de vencimiento del impuesto", + "Inspection Date": "Fecha de inspección", + "Capture an Image of Your car license back": + "Captura una imagen de la parte trasera de tu licencia de coche", + "Capture an Image of Your Driver's License": + "Capturar una imagen de su licencia de conducir", + "Sign in with Google for easier email and name entry": + "Inicia sesión con Google para ingresar el correo electrónico y el nombre más fácilmente", + "You will choose allow all the time to be ready receive orders": + "Elegirás permitir todo el tiempo para estar listo para recibir pedidos", + "Get to your destination quickly and easily.": + "Llega a tu destino de manera rápida y sencilla.", + "Enjoy a safe and comfortable ride.": + "Disfruta de un viaje seguro y cómodo.", + "Choose Language": "Elegir idioma", + "Pay with Wallet": "Pagar con billetera", + "Invalid MPIN": "MPIN inválido", + "Invalid OTP": "OTP inválido", + "Enter your email address": + "Ingresa tu dirección de correo electrónico", + "Please enter Your Email.": + "Por favor, ingresa tu correo electrónico.", + "Enter your phone number": "Ingresa tu número de teléfono", + "Please enter your phone number.": + "Por favor, ingresa tu número de teléfono.", + "Please enter Your Password.": "Por favor, ingresa tu contraseña.", + "if you dont have account": "si no tienes una cuenta", + "Register": "Registrarse", + "Accept Ride's Terms & Review Privacy Notice": + "Acepta los términos del viaje y revisa el aviso de privacidad", + "By selecting 'I Agree' below, I have reviewed and agree to the Terms of Use and acknowledge the Privacy Notice. I am at least 18 years of age.": + "Al seleccionar 'Estoy de acuerdo' a continuación, declaro que he revisado y acepto los Términos de uso y reconozco el Aviso de privacidad. Tengo al menos 18 años.", + "First name": "Nombre", + "Enter your first name": "Ingresa tu nombre", + "Please enter your first name.": "Por favor, ingresa tu nombre.", + "Last name": "Apellido", + "Enter your last name": "Ingresa tu apellido", + "Please enter your last name.": "Por favor, ingresa tu apellido.", + "City": "Ciudad", + "Please enter your City.": "Por favor, ingresa tu ciudad.", + "Verify Email": "Verificar correo electrónico", + "We sent 5 digit to your Email provided": + "Enviamos un código de 5 dígitos al correo electrónico proporcionado", + "5 digit": "5 dígitos", + "Send Verification Code": "Enviar código de verificación", + "Your Ride Duration is ": "La duración de tu viaje es ", + "You will be thier in": "Estarás allí en", + "You trip distance is": "La distancia de tu viaje es", + "Fee is": "La tarifa es", + "From : ": "Desde : ", + "To : ": "Hacia : ", + "Add Promo": "Añadir promoción", + "Confirm Selection": "Confirmar selección", + "distance is": "la distancia es", + "Privacy Policy": "Política de privacidad", + "Intaleq LLC": "Intaleq LLC", + "Syria's pioneering ride-sharing service, proudly developed by Arabian and local owners. We prioritize being near you – both our valued passengers and our dedicated captains.": + "El servicio pionero de transporte compartido de Siria, desarrollado con orgullo por propietarios árabes y locales. Priorizamos estar cerca de usted, tanto de nuestros valiosos pasajeros como de nuestros dedicados capitanes.", + "Intaleq is the first ride-sharing app in Syria, designed to connect you with the nearest drivers for a quick and convenient travel experience.": + "Intaleq es la primera aplicación de transporte compartido en Siria, diseñada para conectarlo con los conductores más cercanos para una experiencia de viaje rápida y conveniente.", + "Why Choose Intaleq?": "¿Por qué elegir Intaleq?", + "Closest to You": "Más cerca de ti", + "We connect you with the nearest drivers for faster pickups and quicker journeys.": + "Te conectamos con los conductores más cercanos para recogidas más rápidas y viajes más cortos.", + "Uncompromising Security": "Seguridad sin compromisos", + "Lady Captains Available": "Capitanas disponibles", + "Recorded Trips (Voice & AI Analysis)": + "Viajes grabados (análisis de voz e IA)", + "Fastest Complaint Response": "Respuesta más rápida a las quejas", + "Our dedicated customer service team ensures swift resolution of any issues.": + "Nuestro dedicado equipo de servicio al cliente garantiza una resolución rápida de cualquier problema.", + "Affordable for Everyone": "Asequible para todos", + "Frequently Asked Questions": "Preguntas frecuentes", + "Getting Started": "Cómo empezar", + "Simply open the Intaleq app, enter your destination, and tap \"Request Ride\". The app will connect you with a nearby driver.": + "Simplemente abre la aplicación Intaleq, ingresa tu destino y toca \"Solicitar viaje\". La aplicación te conectará con un conductor cercano.", + "Vehicle Options": "Opciones de vehículos", + "Intaleq offers a variety of options including Economy, Comfort, and Luxury to suit your needs and budget.": + "Intaleq ofrece una variedad de opciones, incluyendo Economía, Confort y Lujo, para adaptarse a tus necesidades y presupuesto.", + "Payments": "Pagos", + "You can pay for your ride using cash or credit/debit card. You can select your preferred payment method before confirming your ride.": + "Puedes pagar tu viaje en efectivo o con tarjeta de crédito/débito. Puedes seleccionar tu método de pago preferido antes de confirmar tu viaje.", + "Ride Management": "Gestión de viajes", + "Yes, you can cancel your ride, but please note that cancellation fees may apply depending on how far in advance you cancel.": + "Sí, puedes cancelar tu viaje, pero ten en cuenta que pueden aplicarse tarifas de cancelación dependiendo de cuánto tiempo antes canceles.", + "For Drivers": "Para conductores", + "Driver Registration": "Registro de conductores", + "To register as a driver or learn about the requirements, please visit our website or contact Intaleq support directly.": + "Para registrarte como conductor o conocer los requisitos, visita nuestro sitio web o contacta directamente al soporte de Intaleq.", + "Visit Website/Contact Support": + "Visita el sitio web/Contacta al soporte", + "Close": "Cerrar", + "We are searching for the nearest driver": + "Estamos buscando al conductor más cercano", + "Communication": "Comunicación", + "How do I communicate with the other party (passenger/driver)?": + "¿Cómo me comunico con la otra parte (pasajero/conductor)?", + "You can communicate with your driver or passenger through the in-app chat feature once a ride is confirmed.": + "Puedes comunicarte con tu conductor o pasajero a través de la función de chat en la aplicación una vez que se confirme el viaje.", + "Safety & Security": "Seguridad y protección", + "What safety measures does Intaleq offer?": + "¿Qué medidas de seguridad ofrece Intaleq?", + "Intaleq offers various safety features including driver verification, in-app trip tracking, emergency contact options, and the ability to share your trip status with trusted contacts.": + "Intaleq ofrece varias características de seguridad, incluyendo verificación del conductor, seguimiento del viaje en la aplicación, opciones de contacto de emergencia y la capacidad de compartir el estado de tu viaje con contactos de confianza.", + "Enjoy competitive prices across all trip options, making travel accessible.": + "Disfruta de precios competitivos en todas las opciones de viaje, haciendo que los viajes sean accesibles.", + "Variety of Trip Choices": "Variedad de opciones de viaje", + "Choose the trip option that perfectly suits your needs and preferences.": + "Elige la opción de viaje que mejor se adapte a tus necesidades y preferencias.", + "Your Choice, Our Priority": "Tu elección, nuestra prioridad", + "Because we are near, you have the flexibility to choose the ride that works best for you.": + "Porque estamos cerca, tienes la flexibilidad de elegir el viaje que mejor funcione para ti.", + "duration is": "la duración es", + "Setting": "Configuración", + "Find answers to common questions": + "Encuentra respuestas a preguntas comunes", + "I don't need a ride anymore": "Ya no necesito un viaje", + "I was just trying the application": + "Solo estaba probando la aplicación", + "No driver accepted my request": + "Ningún conductor aceptó mi solicitud", + "I added the wrong pick-up/drop-off location": + "Agregué la ubicación de recogida/dejada incorrecta", + "I don't have a reason": "No tengo una razón", + "Can we know why you want to cancel Ride ?": + "¿Podemos saber por qué quieres cancelar el viaje?", + "Add Payment Method": "Añadir método de pago", + "Ride Wallet": "Billetera de viajes", + "Payment Method": "Método de pago", + "Type here Place": "Escribe aquí el lugar", + "Are You sure to ride to": "¿Estás seguro de viajar a", + "Confirm": "Confirmar", + "You are Delete": "Estás eliminando", + "Deleted": "Eliminado", + "You Dont Have Any places yet !": "¡Aún no tienes ningún lugar!", + "From : Current Location": "Desde : Ubicación actual", + "My Cared": "Mis tarjetas", + "Add Card": "Añadir tarjeta", + "Add Credit Card": "Añadir tarjeta de crédito", + "Please enter the cardholder name": + "Por favor, ingresa el nombre del titular de la tarjeta", + "Please enter the expiry date": + "Por favor, ingresa la fecha de vencimiento", + "Please enter the CVV code": "Por favor, ingresa el código CVV", + "Go To Favorite Places": "Ir a lugares favoritos", + "Go to this Target": "Ir a este objetivo", + "My Profile": "Mi perfil", + "Are you want to go to this site": "¿Quieres ir a este sitio?", + "MyLocation": "Mi ubicación", + "my location": "mi ubicación", + "Target": "Objetivo", + "You Should choose rate figure": + "Debes elegir una figura de calificación", + "Login Captin": "Iniciar sesión como capitán", + "Register Captin": "Registrar capitán", + "Send Verfication Code": "Enviar código de verificación", + "KM": "KM", + "End Ride": "Finalizar viaje", + "Minute": "Minuto", + "Go to passenger Location now": + "Ir ahora a la ubicación del pasajero", + "Duration of the Ride is ": "La duración del viaje es ", + "Distance of the Ride is ": "La distancia del viaje es ", + "Name of the Passenger is ": "El nombre del pasajero es ", + "Hello this is Captain": "Hola, este es el capitán", + "Start the Ride": "Iniciar el viaje", + "Please Wait If passenger want To Cancel!": + "¡Por favor, espera si el pasajero quiere cancelar!", + "Total Duration:": "Duración total:", + "Active Duration:": "Duración activa:", + "Waiting for Captin ...": "Esperando al capitán ...", + "Age is ": "La edad es ", + "Rating is ": "La calificación es ", + " to arrive you.": "para llegar a ti.", + "Tariff": "Tarifa", + "Settings": "Configuración", + "Feed Back": "Retroalimentación", + "Please enter a valid 16-digit card number": + "Por favor, ingresa un número de tarjeta válido de 16 dígitos", + "Add Phone": "Añadir teléfono", + "Please enter a phone number": + "Por favor, ingresa un número de teléfono", + "You dont Add Emergency Phone Yet!": + "¡Aún no has añadido un teléfono de emergencia!", + "You will arrive to your destination after ": + "Llegarás a tu destino después de ", + "You can cancel Ride now": "Puedes cancelar el viaje ahora", + "You Can cancel Ride After Captain did not come in the time": + "Puedes cancelar el viaje si el capitán no llegó a tiempo", + "If you in Car Now. Press Start The Ride": + "Si estás en el coche ahora. Presiona Iniciar el viaje", + "You Dont Have Any amount in": "No tienes ningún monto en", + "Wallet!": "¡Billetera!", + "You Have": "Tienes", + "Save Credit Card": "Guardar tarjeta de crédito", + "Show Promos": "Mostrar promociones", + "10 and get 4% discount": "10 y obtén un 4% de descuento", + "20 and get 6% discount": "20 y obtén un 6% de descuento", + "40 and get 8% discount": "40 y obtén un 8% de descuento", + "100 and get 11% discount": "100 y obtén un 11% de descuento", + "Pay with Your PayPal": "Paga con tu PayPal", + "You will choose one of above !": "¡Elegirás uno de los anteriores!", + "Edit Profile": "Editar perfil", + "Copy this Promo to use it in your Ride!": + "¡Copia esta promoción para usarla en tu viaje!", + "To change some Settings": "Para cambiar algunas configuraciones", + "Order Request Page": "Página de solicitud de pedido", + "Rouats of Trip": "Rutas del viaje", + "Passenger Name is ": "El nombre del pasajero es ", + "Total From Passenger is ": "El total del pasajero es ", + "Duration To Passenger is ": "La duración hasta el pasajero es ", + "Distance To Passenger is ": "La distancia hasta el pasajero es ", + "Total For You is ": "El total para ti es ", + "Distance is ": "La distancia es ", + " KM": " KM", + "Duration of Trip is ": "La duración del viaje es ", + " Minutes": " Minutos", + "Apply Order": "Aplicar pedido", + "Refuse Order": "Rechazar pedido", + "Rate Captain": "Calificar al capitán", + "Enter your Note": "Ingresa tu nota", + "Type something...": "Escribe algo...", + "Submit rating": "Enviar calificación", + "Rate Passenger": "Calificar al pasajero", + "Ride Summary": "Resumen del viaje", + "welcome_message": "Bienvenido a Intaleq!", + "app_description": + "Intaleq es una aplicación de viajes compartidos segura, confiable y accesible.", + "get_to_destination": + "Llega a tu destino de manera rápida y sencilla.", + "get_a_ride": "Con Intaleq, puedes llegar a tu destino en minutos.", + "safe_and_comfortable": "Disfruta de un viaje seguro y cómodo.", + "committed_to_safety": + "Intaleq se compromete con la seguridad, y todos nuestros capitanes son cuidadosamente seleccionados y verificados.", + "your ride is Accepted": "tu viaje ha sido aceptado", + "Driver is waiting at pickup.": + "El conductor está esperando en el punto de recogida.", + "Driver is on the way": "El conductor está en camino", + "Contact Options": "Opciones de contacto", + "Send a custom message": "Enviar un mensaje personalizado", + "Type your message": "Escribe tu mensaje", + "I will go now": "Iré ahora", + "You Have Tips": "Tienes propinas", + " tips\nTotal is": " propinas\nEl total es", + "Your fee is ": "Tu tarifa es ", + "Do you want to pay Tips for this Driver": + "¿Quieres pagar propinas a este conductor?", + "Tip is ": "La propina es ", + "Are you want to wait drivers to accept your order": + "¿Quieres esperar a que los conductores acepten tu pedido?", + "This price is fixed even if the route changes for the driver.": + "Este precio es fijo incluso si la ruta cambia para el conductor.", + "The price may increase if the route changes.": + "El precio puede aumentar si la ruta cambia.", + "The captain is responsible for the route.": + "El capitán es responsable de la ruta.", + "We are search for nearst driver": + "Estamos buscando al conductor más cercano", + "Your order is being prepared": "Tu pedido está siendo preparado", + "The drivers are reviewing your request": + "Los conductores están revisando tu solicitud", + "Your order sent to drivers": + "Tu pedido fue enviado a los conductores", + "You can call or record audio of this trip": + "Puedes llamar o grabar audio de este viaje", + "The trip has started! Feel free to contact emergency numbers, share your trip, or activate voice recording for the journey": + "¡El viaje ha comenzado! No dudes en contactar números de emergencia, compartir tu viaje o activar la grabación de voz para el trayecto", + "Camera Access Denied.": "Acceso a la cámara denegado.", + "Open Settings": "Abrir configuración", + "GPS Required Allow !.": "¡GPS requerido, permitir!.", + "Your Account is Deleted": "Tu cuenta ha sido eliminada", + "Are you sure to delete your account?": + "¿Estás seguro de eliminar tu cuenta?", + "Your data will be erased after 2 weeks\nAnd you will can't return to use app after 1 month ": + "Tus datos serán borrados después de 2 semanas\nY no podrás volver a usar la aplicación después de 1 mes ", + "Enter Your First Name": "Ingresa tu nombre", + "Are you Sure to LogOut?": "¿Estás seguro de cerrar sesión?", + "Email Wrong": "Correo electrónico incorrecto", + "Email you inserted is Wrong.": + "El correo electrónico que ingresaste es incorrecto.", + "You have finished all times ": "Has terminado todas las veces ", + "if you want help you can email us here": + "si necesitas ayuda, puedes enviarnos un correo electrónico aquí", + "Thanks": "Gracias", + "Email Us": "Envíanos un correo electrónico", + "I cant register in your app in face detection ": + "No puedo registrarme en tu aplicación con detección facial ", + "Hi": "Hola", + "No face detected": "No se detectó ninguna cara", + "Image detecting result is ": + "El resultado de la detección de imagen es ", + "from 3 times Take Attention": "de 3 veces, presta atención", + "Be sure for take accurate images please\nYou have": + "Por favor, asegúrate de tomar imágenes precisas\nTienes", + "image verified": "imagen verificada", + "Next": "Siguiente", + "There is no help Question here": "No hay una pregunta de ayuda aquí", + "You dont have Points": "No tienes puntos", + "You Are Stopped For this Day !": "¡Estás detenido por este día!", + "You must be charge your Account": "Debes cargar tu cuenta", + "You Refused 3 Rides this Day that is the reason \nSee you Tomorrow!": + "Rechazaste 3 viajes este día, esa es la razón \n¡Nos vemos mañana!", + "Recharge my Account": "Recargar mi cuenta", + "Ok , See you Tomorrow": "Ok, nos vemos mañana", + "You are Stopped": "Estás detenido", + "Connected": "Conectado", + "Not Connected": "No conectado", + "Your are far from passenger location": + "Estás lejos de la ubicación del pasajero", + "go to your passenger location before\nPassenger cancel trip": + "ve a la ubicación del pasajero antes de que\nel pasajero cancele el viaje", + "You will get cost of your work for this trip": + "Obtendrás el costo de tu trabajo por este viaje", + " in your wallet": "en tu billetera", + "you gain": "ganas", + "Order Cancelled by Passenger": "Pedido cancelado por el pasajero", + "Feedback data saved successfully": + "Datos de retroalimentación guardados con éxito", + "No Promo for today .": "No hay promoción para hoy.", + "Select your destination": "Selecciona tu destino", + "Search for your Start point": "Busca tu punto de inicio", + "Search for waypoint": "Buscar punto de referencia", + "Current Location": "Ubicación actual", + "Add Location 1": "Añadir ubicación 1", + "You must Verify email !.": + "¡Debes verificar el correo electrónico!.", + "Cropper": "Recortador", + "Saved Sucssefully": "Guardado exitosamente", + "Select Date": "Seleccionar fecha", + "Birth Date": "Fecha de nacimiento", + "Ok": "Ok", + "the 500 points equal 30 JOD": "500 puntos equivalen a 30 JOD", + "the 500 points equal 30 JOD for you \nSo go and gain your money": + "500 puntos equivalen a 30 JOD para ti \nAsí que ve y gana tu dinero", + "token updated": "token actualizado", + "Add Location 2": "Añadir ubicación 2", + "Add Location 3": "Añadir ubicación 3", + "Add Location 4": "Añadir ubicación 4", + "Waiting for your location": "Esperando tu ubicación", + "Search for your destination": "Busca tu destino", + "Hi! This is": "¡Hola! Este es", + " I am using": " estoy usando", + " to ride with": " para viajar con", + " as the driver.": " como el conductor.", + "is driving a ": "está conduciendo un ", + " with license plate ": " con matrícula ", + " I am currently located at ": "Actualmente estoy ubicado en ", + "Please go to Car now ": "Por favor, ve al coche ahora ", + "You will receive a code in WhatsApp Messenger": + "Recibirás un código en WhatsApp Messenger", + "If you need assistance, contact us": + "Si necesitas ayuda, contáctanos", + "Promo Ended": "Promoción terminada", + "Enter the promo code and get": + "Ingresa el código de promoción y obtén", + "DISCOUNT": "DESCUENTO", + "No wallet record found": + "No se encontró ningún registro de billetera", + "for": "para", + "Intaleq is the safest ride-sharing app that introduces many features for both captains and passengers. We offer the lowest commission rate of just 8%, ensuring you get the best value for your rides. Our app includes insurance for the best captains, regular maintenance of cars with top engineers, and on-road services to ensure a respectful and high-quality experience for all users.": + "Intaleq es la aplicación de viajes compartidos más segura que introduce muchas características tanto para capitanes como para pasajeros. Ofrecemos la tasa de comisión más baja de solo el 8%, asegurando que obtengas el mejor valor por tus viajes. Nuestra aplicación incluye seguro para los mejores capitanes, mantenimiento regular de coches con los mejores ingenieros y servicios en carretera para garantizar una experiencia respetuosa y de alta calidad para todos los usuarios.", + "You can contact us during working hours from 12:00 - 19:00.": + "Puedes contactarnos durante el horario de trabajo de 12:00 - 19:00.", + "Choose a contact option": "Elige una opción de contacto", + "Work time is from 12:00 - 19:00.\nYou can send a WhatsApp message or email.": + "El horario de trabajo es de 12:00 - 19:00.\nPuedes enviar un mensaje de WhatsApp o un correo electrónico.", + "Promo code copied to clipboard!": + "¡Código de promoción copiado al portapapeles!", + "Copy Code": "Copiar código", + "Your invite code was successfully applied!": + "¡Tu código de invitación fue aplicado con éxito!", + "Payment Options": "Opciones de pago", + "wait 1 minute to receive message": + "espera 1 minuto para recibir el mensaje", + "You have copied the promo code.": + "Has copiado el código de promoción.", + "Select Payment Amount": "Seleccionar monto de pago", + "The promotion period has ended.": + "El período de promoción ha terminado.", + "Promo Code Accepted": "Código de promoción aceptado", + "Tap on the promo code to copy it!": + "¡Toca el código de promoción para copiarlo!", + "Lowest Price Achieved": "Precio más bajo alcanzado", + "Cannot apply further discounts.": + "No se pueden aplicar más descuentos.", + "Promo Already Used": "Promoción ya utilizada", + "Invitation Used": "Invitación utilizada", + "You have already used this promo code.": + "Ya has usado este código de promoción.", + "Insert Your Promo Code": "Inserta tu código de promoción", + "Enter promo code here": "Ingresa el código de promoción aquí", + "Please enter a valid promo code": + "Por favor, ingresa un código de promoción válido", + "Awfar Car": "Coche Awfar", + "Old and affordable, perfect for budget rides.": + "Viejo y asequible, perfecto para viajes económicos.", + " If you need to reach me, please contact the driver directly at": + " Si necesitas contactarme, por favor contacta al conductor directamente al", + "No Car or Driver Found in your area.": + "No se encontró ningún coche o conductor en tu área.", + "Please Try anther time ": "Por favor, intenta otro momento ", + "There no Driver Aplly your order sorry for that ": + "Ningún conductor aplicó tu pedido, lo sentimos ", + "Trip Cancelled": "Viaje cancelado", + "The Driver Will be in your location soon .": + "El conductor estará en tu ubicación pronto .", + "The distance less than 500 meter.": + "La distancia es menor a 500 metros.", + "Promo End !": "¡Promoción terminada!", + "There is no notification yet": "Aún no hay notificaciones", + "Use Touch ID or Face ID to confirm payment": + "Usa Touch ID o Face ID para confirmar el pago", + "Contact us for any questions on your order.": + "Contáctanos si tienes preguntas sobre tu pedido.", + "Pyament Cancelled .": "Pago cancelado .", + "type here": "escribe aquí", + "Scan Driver License": "Escanear licencia de conducir", + "Please put your licence in these border": + "Por favor, coloca tu licencia en este marco", + "Camera not initialized yet": "La cámara aún no se ha inicializado", + "Take Image": "Tomar imagen", + "AI Page": "Página de IA", + "Take Picture Of ID Card": + "Tomar foto de la tarjeta de identificación", + "Take Picture Of Driver License Card": + "Tomar foto de la tarjeta de licencia de conducir", + "We are process picture please wait ": + "Estamos procesando la imagen, por favor espera ", + "There is no data yet.": "Aún no hay datos.", + "Name :": "Nombre :", + "Drivers License Class: ": "Clase de licencia de conducir: ", + "Document Number: ": "Número de documento: ", + "Address: ": "Dirección: ", + "Height: ": "Altura: ", + "Expiry Date: ": "Fecha de vencimiento: ", + "Date of Birth: ": "Fecha de nacimiento: ", + "You can't continue with us .\nYou should renew Driver license": + "No puedes continuar con nosotros.\nDeberías renovar tu licencia de conducir", + "Detect Your Face ": "Detecta tu cara ", + "Go to next step\nscan Car License.": + "Ve al siguiente paso\nescanea la licencia del coche.", + "Name in arabic": "Nombre en árabe", + "Drivers License Class": "Clase de licencia de conducir", + "Selected Date": "Fecha seleccionada", + "Select Time": "Seleccionar hora", + "Selected Time": "Hora seleccionada", + "Selected Date and Time": "Fecha y hora seleccionadas", + "Lets check Car license ": "Vamos a verificar la licencia del coche ", + "Car": "Coche", + "Plate": "Placa", + "Rides": "Viajes", + "Selected driver": "Conductor seleccionado", + "Lets check License Back Face": + "Vamos a verificar la parte trasera de la licencia", + "Car License Card": "Tarjeta de licencia de coche", + "No image selected yet": "Aún no se ha seleccionado ninguna imagen", + "Made :": "Hecho :", + "model :": "modelo :", + "VIN :": "Número de chasis :", + "year :": "año :", + "ُExpire Date": "Fecha de vencimiento", + "Login Driver": "Iniciar sesión como conductor", + "Password must br at least 6 character.": + "La contraseña debe tener al menos 6 caracteres.", + "if you don't have account": "si no tienes cuenta", + "Here recorded trips audio": + "Aquí están los audios de los viajes grabados", + "Register as Driver": "Registrarse como conductor", + "By selecting \"I Agree\" below, I have reviewed and agree to the Terms of Use and acknowledge the ": + "Al seleccionar \"Acepto\" a continuación, he revisado y acepto los Términos de uso y reconozco el ", + "Log Out Page": "Página de cierre de sesión", + "Log Off": "Cerrar sesión", + "Register Driver": "Registrar conductor", + "Verify Email For Driver": + "Verificar correo electrónico para el conductor", + "Admin DashBoard": "Panel de administración", + "Your name": "Tu nombre", + "your ride is applied": "tu viaje ha sido aplicado", + "H and": "Horas y", + "JOD": "JOD", + "m": "minutos", + "We search nearst Driver to you": + "Buscamos al conductor más cercano para ti", + "please wait till driver accept your order": + "por favor espera hasta que el conductor acepte tu pedido", + "No accepted orders? Try raising your trip fee to attract riders.": + "¿No hay pedidos aceptados? Intenta aumentar la tarifa de tu viaje para atraer a los conductores.", + "You should select one": "Debes seleccionar uno", + "The driver accept your order for": + "El conductor aceptó tu pedido para", + "The driver on your way": "El conductor está en camino", + "Total price from ": "Precio total desde ", + "Order Details Intaleq": "Detalles del pedido Velocidad", + "Selected file:": "Archivo seleccionado:", + "Your trip cost is": "El costo de tu viaje es", + "this will delete all files from your device": + "esto eliminará todos los archivos de tu dispositivo", + "Exclusive offers and discounts always with the Intaleq app": + "Ofertas exclusivas y descuentos siempre con la aplicación Intaleq", + "Submit Question": "Enviar pregunta", + "Please enter your Question.": "Por favor, ingresa tu pregunta.", + "Help Details": "Detalles de ayuda", + "No trip yet found": "Aún no se ha encontrado ningún viaje", + "No Response yet.": "Aún no hay respuesta.", + " You Earn today is ": " Lo que ganaste hoy es ", + " You Have in": " Tienes en", + "Total points is ": "El total de puntos es ", + "Total Connection Duration:": "Duración total de la conexión:", + "Passenger name : ": "Nombre del pasajero : ", + "Cost Of Trip IS ": "El costo del viaje es ", + "Arrival time": "Hora de llegada", + "arrival time to reach your point": + "hora de llegada para llegar a tu punto", + "For Intaleq and scooter trips, the price is calculated dynamically. For Comfort trips, the price is based on time and distance": + "Para viajes de velocidad y scooter, el precio se calcula dinámicamente. Para viajes de confort, el precio se basa en el tiempo y la distancia.", + "Hello this is Driver": "Hola, este es el conductor", + "Is the Passenger in your Car ?": "¿El pasajero está en tu coche?", + "Please wait for the passenger to enter the car before starting the trip.": + "Por favor, espera a que el pasajero entre al coche antes de iniciar el viaje.", + "No ,still Waiting.": "No, aún esperando.", + "I arrive you": "Llego a ti", + "I Arrive your site": "Llego a tu sitio", + "You are not in near to passenger location": + "No estás cerca de la ubicación del pasajero", + "please go to picker location exactly": + "por favor ve exactamente a la ubicación del recolector", + "You Can Cancel Trip And get Cost of Trip From": + "Puedes cancelar el viaje y obtener el costo del viaje de", + "Are you sure to cancel?": "¿Estás seguro de cancelar?", + "Insert Emergincy Number": "Insertar número de emergencia", + "Best choice for comfort car and flexible route and stops point": + "Mejor opción para un coche cómodo y una ruta flexible con puntos de parada", + "Insert": "Insertar", + "This is for scooter or a motorcycle.": + "Esto es para un scooter o una motocicleta.", + "This trip goes directly from your starting point to your destination for a fixed price. The driver must follow the planned route": + "Este viaje va directamente desde tu punto de inicio hasta tu destino por un precio fijo. El conductor debe seguir la ruta planificada.", + "You can decline a request without any cost": + "Puedes rechazar una solicitud sin ningún costo", + "Perfect for adventure seekers who want to experience something new and exciting": + "Perfecto para los buscadores de aventuras que quieren experimentar algo nuevo y emocionante", + "My current location is:": "Mi ubicación actual es:", + "and I have a trip on": "y tengo un viaje el", + "App with Passenger": "Aplicación con pasajero", + "You will be pay the cost to driver or we will get it from you on next trip": + "Pagarás el costo al conductor o lo obtendremos de ti en el próximo viaje", + "Trip has Steps": "El viaje tiene pasos", + "Distance from Passenger to destination is ": + "La distancia del pasajero al destino es ", + "price is": "el precio es", + "This ride type does not allow changes to the destination or additional stops": + "Este tipo de viaje no permite cambios en el destino o paradas adicionales", + "This price may be changed": "Este precio puede cambiar", + "No SIM card, no problem! Call your driver directly through our app. We use advanced technology to ensure your privacy.": + "¡Sin tarjeta SIM, no hay problema! Llama a tu conductor directamente a través de nuestra aplicación. Usamos tecnología avanzada para garantizar tu privacidad.", + "This ride type allows changes, but the price may increase": + "Este tipo de viaje permite cambios, pero el precio puede aumentar", + "Select one message": "Selecciona un mensaje", + "I'm waiting for you": "Te estoy esperando", + "We noticed the Intaleq is exceeding 100 km/h. Please slow down for your safety. If you feel unsafe, you can share your trip details with a contact or call the police using the red SOS button.": + "Notamos que la velocidad supera los 100 km/h. Por favor, reduce la velocidad por tu seguridad. Si te sientes inseguro, puedes compartir los detalles de tu viaje con un contacto o llamar a la policía usando el botón rojo de SOS.", + "Warning: Intaleqing detected!": + "¡Advertencia: Se detectó exceso de velocidad!", + "Please help! Contact me as soon as possible.": + "¡Por favor, ayuda! Contáctame lo antes posible.", + "Share Trip Details": "Compartir detalles del viaje", + "Car Plate is ": "La placa del coche es ", + "the 300 points equal 300 L.E for you \nSo go and gain your money": + "300 puntos equivalen a 300 L.E para ti \nAsí que ve y gana tu dinero", + "the 300 points equal 300 L.E": "300 puntos equivalen a 300 L.E", + "The payment was not approved. Please try again.": + "El pago no fue aprobado. Por favor, inténtalo de nuevo.", + "Payment Failed": "Pago fallido", + "This is a scheduled notification.": + "Esta es una notificación programada.", + "An error occurred during the payment process.": + "Ocurrió un error durante el proceso de pago.", + "The payment was approved.": "El pago fue aprobado.", + "Payment Successful": "Pago exitoso", + "No ride found yet": "Aún no se ha encontrado ningún viaje", + "Accept Order": "Aceptar pedido", + "Bottom Bar Example": "Ejemplo de barra inferior", + "Driver phone": "Teléfono del conductor", + "Statistics": "Estadísticas", + "Origin": "Origen", + "Destination": "Destino", + "Driver Name": "Nombre del conductor", + "Driver Car Plate": "Placa del coche del conductor", + "Available for rides": "Disponible para viajes", + "Scan Id": "Escanear ID", + "Camera not initilaized yet": "La cámara aún no se ha inicializado", + "Scan ID MklGoogle": "Escanear ID MklGoogle", + "Language": "Idioma", + "Jordan": "Jordania", + "USA": "EE. UU.", + "Egypt": "Egipto", + "Turkey": "Turquía", + "Saudi Arabia": "Arabia Saudita", + "Qatar": "Catar", + "Bahrain": "Baréin", + "Kuwait": "Kuwait", + "But you have a negative salary of": + "Pero tienes un salario negativo de", + "Promo Code": "Código de promoción", + "Your trip distance is": "La distancia de tu viaje es", + "Enter promo code": "Ingresar código de promoción", + "You have promo!": "¡Tienes una promoción!", + "Cost Duration": "Duración del costo", + "Duration is": "La duración es", + "Leave": "Salir", + "Join": "Unirse", + "Heading your way now. Please be ready.": + "En camino hacia ti ahora. Por favor, estate listo.", + "Approaching your area. Should be there in 3 minutes.": + "Acercándome a tu área. Debería estar allí en 3 minutos.", + "There's heavy traffic here. Can you suggest an alternate pickup point?": + "Hay mucho tráfico aquí. ¿Puedes sugerir un punto de recogida alternativo?", + "This ride is already taken by another driver.": + "Este viaje ya ha sido tomado por otro conductor.", + "You Should be select reason.": "Debes seleccionar una razón.", + "Waiting for Driver ...": "Esperando al conductor ...", + "Latest Recent Trip": "Último viaje reciente", + "from your list": "de tu lista", + "Do you want to change Work location": + "¿Quieres cambiar la ubicación del trabajo?", + "Do you want to change Home location": + "¿Quieres cambiar la ubicación del hogar?", + "We Are Sorry That we dont have cars in your Location!": + "¡Lamentamos no tener coches en tu ubicación!", + "Choose from Map": "Elegir del mapa", + "Pick your ride location on the map - Tap to confirm": + "Elige la ubicación de tu viaje en el mapa - Toca para confirmar", + "Intaleq is the ride-hailing app that is safe, reliable, and accessible.": + "Intaleq es la aplicación de viajes compartidos que es segura, confiable y accesible.", + "With Intaleq, you can get a ride to your destination in minutes.": + "Con Intaleq, puedes llegar a tu destino en minutos.", + "Intaleq is committed to safety, and all of our captains are carefully screened and background checked.": + "Intaleq se compromete con la seguridad, y todos nuestros capitanes son cuidadosamente seleccionados y verificados.", + "Pick from map": "Elegir del mapa", + "No Car in your site. Sorry!": + "No hay coche en tu sitio. ¡Lo siento!", + "Nearest Car for you about ": + "El coche más cercano para ti en aproximadamente ", + "From :": "Desde :", + "Get Details of Trip": "Obtener detalles del viaje", + "If you want add stop click here": + "Si quieres añadir una parada, haz clic aquí", + "Where you want go ": "A dónde quieres ir ", + "My Card": "Mi tarjeta", + "Start Record": "Iniciar grabación", + "History of Trip": "Historial de viajes", + "Helping Center": "Centro de ayuda", + "Record saved": "Grabación guardada", + "Trips recorded": "Viajes grabados", + "Select Your Country": "Selecciona tu país", + "To ensure you receive the most accurate information for your location, please select your country below. This will help tailor the app experience and content to your country.": + "Para asegurarte de recibir la información más precisa para tu ubicación, por favor selecciona tu país a continuación. Esto ayudará a personalizar la experiencia de la aplicación y el contenido para tu país.", + "Are you sure to delete recorded files": + "¿Estás seguro de eliminar los archivos grabados?", + "Select recorded trip": "Seleccionar viaje grabado", + "Card Number": "Número de tarjeta", + "Hi, Where to ": "Hola, a dónde ", + "Pick your destination from Map": "Elige tu destino del mapa", + "Add Stops": "Añadir paradas", + "Get Direction": "Obtener dirección", + "Add Location": "Añadir ubicación", + "Switch Rider": "Cambiar pasajero", + "You will arrive to your destination after timer end.": + "Llegarás a tu destino después de que termine el temporizador.", + "You can cancel trip": "Puedes cancelar el viaje", + "The driver waitting you in picked location .": + "El conductor te está esperando en la ubicación seleccionada .", + "Pay with Your": "Paga con tu", + "Pay with Credit Card": "Pagar con tarjeta de crédito", + "Show Promos to Charge": "Mostrar promociones para cargar", + "Point": "Punto", + "How many hours would you like to wait?": + "¿Cuántas horas te gustaría esperar?", + "Driver Wallet": "Billetera del conductor", + "Choose between those Type Cars": "Elige entre esos tipos de coches", + "hour": "hora", + "Select Waiting Hours": "Seleccionar horas de espera", + "Total Points is": "El total de puntos es", + "You will receive a code in SMS message": + "Recibirás un código en un mensaje SMS", + "Done": "Hecho", + "Total Budget from trips is ": + "El presupuesto total de los viajes es ", + "Total Amount:": "Monto total:", + "Total Budget from trips by\nCredit card is ": + "El presupuesto total de los viajes por\nTarjeta de crédito es ", + "This amount for all trip I get from Passengers": + "Este monto por todos los viajes que obtengo de los pasajeros", + "Pay from my budget": "Pagar de mi presupuesto", + "This amount for all trip I get from Passengers and Collected For me in": + "Este monto por todos los viajes que obtengo de los pasajeros y recaudado para mí en", + "You can buy points from your budget": + "Puedes comprar puntos de tu presupuesto", + "insert amount": "insertar monto", + "You can buy Points to let you online\nby this list below": + "Puedes comprar puntos para estar en línea\ncon esta lista a continuación", + "Create Wallet to receive your money": + "Crea una billetera para recibir tu dinero", + "Enter your feedback here": "Ingresa tu retroalimentación aquí", + "Please enter your feedback.": + "Por favor, ingresa tu retroalimentación.", + "Feedback": "Retroalimentación", + "Submit ": "Enviar ", + "Click here to Show it in Map": + "Haz clic aquí para mostrarlo en el mapa", + "Canceled": "Cancelado", + "No I want": "No, quiero", + "Email is": "El correo electrónico es", + "Phone Number is": "El número de teléfono es", + "Date of Birth is": "La fecha de nacimiento es", + "Sex is ": "El sexo es ", + "Car Details": "Detalles del coche", + "VIN is": "El número de chasis es", + "Color is ": "El color es ", + "Make is ": "La marca es ", + "Model is": "El modelo es", + "Year is": "El año es", + "Expiration Date ": "Fecha de vencimiento ", + "Edit Your data": "Edita tus datos", + "write vin for your car": "escribe el número de chasis de tu coche", + "VIN": "Número de chasis", + "Please verify your identity": "Por favor, verifique su identidad", + "write Color for your car": "escribe el color de tu coche", + "write Make for your car": "escribe la marca de tu coche", + "write Model for your car": "escribe el modelo de tu coche", + "write Year for your car": "escribe el año de tu coche", + "write Expiration Date for your car": + "escribe la fecha de vencimiento de tu coche", + "Tariffs": "Tarifas", + "Minimum fare": "Tarifa mínima", + "Maximum fare": "Tarifa máxima", + "Flag-down fee": "Tarifa base", + "Including Tax": "Incluyendo impuesto", + "BookingFee": "Tarifa de reserva", + "Morning": "Mañana", + "from 07:30 till 10:30 (Thursday, Friday, Saturday, Monday)": + "de 07:30 a 10:30 (jueves, viernes, sábado, lunes)", + "Evening": "Tarde", + "from 12:00 till 15:00 (Thursday, Friday, Saturday, Monday)": + "de 12:00 a 15:00 (jueves, viernes, sábado, lunes)", + "Night": "Noche", + "You have in account": "Tienes en la cuenta", + "Select Country": "Seleccionar país", + "Ride Today : ": "Viaje hoy : ", + "After this period\nYou can't cancel!": + "¡Después de este período\nno puedes cancelar!", + "from 23:59 till 05:30": "de 23:59 a 05:30", + "Rate Driver": "Calificar al conductor", + "Total Cost is ": "El costo total es ", + "Write note": "Escribir nota", + "Time to arrive": "Hora de llegada", + "Ride Summaries": "Resúmenes de viajes", + "Total Cost": "Costo total", + "Average of Hours of": "Promedio de horas de", + " is ON for this month": " está activo este mes", + "Days": "Días", + "Total Hours on month": "Horas totales en el mes", + "Counts of Hours on days": "Cantidad de horas por día", + "OrderId": "ID del pedido", + "created time": "hora de creación", + "Intaleq Over": "Exceso de velocidad", + "I will slow down": "Reduciré la velocidad", + "Map Passenger": "Mapa del pasajero", + "Be Slowly": "Ser lento", + "If you want to make Google Map App run directly when you apply order": + "Si quieres que la aplicación Google Map se ejecute directamente cuando aplicas un pedido", + "You can change the language of the app": + "Puedes cambiar el idioma de la aplicación", + "Your Budget less than needed": + "Tu presupuesto es menor que lo necesario", + "You can change the Country to get all features": + "Puedes cambiar el país para obtener todas las características", + "There is no Car or Driver in your area.": + "No hay coches ni conductores en su zona.", + "Change Country": "Cambiar país", + }, + "fa": { + "About Intaleq": "درباره انطلق", + "Chat with us anytime": "هر زمان با ما چت کنید", + "Direct talk with our team": "صحبت مستقیم با تیم ما", + "Email Support": "پشتیبانی ایمیلی", + "For official inquiries": "برای استعلام‌های رسمی", + "Intaleq Support": "پشتیبانی انطلق", + "Reach out to us via": "با ما در تماس باشید از طریق", + "Support is Away": "پشتیبانی در حال حاضر در دسترس نیست", + "Support is currently Online": "پشتیبانی در حال حاضر آنلاین است", + "Voice Call": "تماس صوتی", + "We're here to help you 24/7": "ما ۷/۲۴ برای کمک به شما آماده‌ایم", + "Working Hours:": "ساعات کاری:", + "1 Passenger": "1 Passenger", + "2 Passengers": "2 Passengers", + "3 Passengers": "3 Passengers", + "4 Passengers": "4 Passengers", + "2. Attach Recorded Audio (Optional)": + "2. Attach Recorded Audio (Optional)", + "Account": "Account", + "Actions": "Actions", + "Active Users": "Active Users", + "Add a Stop": "Add a Stop", + "Add a new waypoint stop": "Add a new waypoint stop", + "After this period\nYou can\'t cancel!": + "After this period\nYou can\'t cancel!", + "Age is": "Age is", + "Alert": "Alert", + "An OTP has been sent to your number.": + "An OTP has been sent to your number.", + "An error occurred": "An error occurred", + "Appearance": "Appearance", + "Are you sure you want to delete this file?": + "Are you sure you want to delete this file?", + "Are you sure you want to logout?": + "Are you sure you want to logout?", + "Arrived": "Arrived", + "Audio Recording": "Audio Recording", + "Call": "Call", + "Call Support": "Call Support", + "Call left": "Call left", + "Change Photo": "Change Photo", + "Choose from Gallery": "Choose from Gallery", + "Choose from contact": "Choose from contact", + "Click to track the trip": "Click to track the trip", + "Close panel": "Close panel", + "Coming": "Coming", + "Complete Payment": "Complete Payment", + "Confirm Cancellation": "Confirm Cancellation", + "Confirm Pickup Location": "Confirm Pickup Location", + "Connection failed. Please try again.": + "Connection failed. Please try again.", + "Could not create ride. Please try again.": + "Could not create ride. Please try again.", + "Crop Photo": "Crop Photo", + "Dark Mode": "Dark Mode", + "Delete": "Delete", + "Delete Account": "Delete Account", + "Delete All": "Delete All", + "Delete All Recordings?": "Delete All Recordings?", + "Delete Recording?": "Delete Recording?", + "Destination Set": "Destination Set", + "Distance": "Distance", + "Double tap to open search or enter destination": + "Double tap to open search or enter destination", + "Double tap to set or change this waypoint on the map": + "Double tap to set or change this waypoint on the map", + "Drawing route on map...": "Drawing route on map...", + "Driver Phone": "Driver Phone", + "Driver is Going To You": "Driver is Going To You", + "Emergency Mode Triggered": "Emergency Mode Triggered", + "Emergency SOS": "Emergency SOS", + "Enter the 5-digit code": "Enter the 5-digit code", + "Enter your City": "Enter your City", + "Enter your Password": "Enter your Password", + "Failed to book trip: \$e": "Failed to book trip: \$e", + "Failed to get location": "Failed to get location", + "Failed to initiate payment. Please try again.": + "Failed to initiate payment. Please try again.", + "Failed to send OTP": "Failed to send OTP", + "Failed to upload photo": "Failed to upload photo", + "Finished": "Finished", + "Fixed Price": "Fixed Price", + "General": "General", + "Grant": "Grant", + "Have a Promo Code?": "Have a Promo Code?", + "Hello! I\'m inviting you to try Intaleq.": + "Hello! I\'m inviting you to try Intaleq.", + "Hi ,I Arrive your site": "Hi ,I Arrive your site", + "Hi, Where to": "Hi, Where to", + "Home": "Home", + "I am currently located at": "I am currently located at", + "I'm Safe": "I'm Safe", + "If you need to reach me, please contact the driver directly at": + "If you need to reach me, please contact the driver directly at", + "Image Upload Failed": "Image Upload Failed", + "Intaleq Passenger": "Intaleq Passenger", + "Invite": "Invite", + "Join a channel": "Join a channel", + "Last Name": "Last Name", + "Leave a detailed comment (Optional)": + "Leave a detailed comment (Optional)", + "Light Mode": "Light Mode", + "Listen": "Listen", + "Location": "Location", + "Location Received": "Location Received", + "Logout": "Logout", + "Map Error": "Map Error", + "Message": "Message", + "Move map to select destination": "Move map to select destination", + "Move map to set start location": "Move map to set start location", + "Move map to set stop": "Move map to set stop", + "Move map to your home location": "Move map to your home location", + "Move map to your pickup point": "Move map to your pickup point", + "Move map to your work location": "Move map to your work location", + "N/A": "N/A", + "No Notifications": "No Notifications", + "No Recordings Found": "No Recordings Found", + "No Rides now!": "No Rides now!", + "No contacts available": "No contacts available", + "No i want": "No i want", + "No notification data found.": "No notification data found.", + "No routes available for this destination.": + "No routes available for this destination.", + "No user found": "No user found", + "No,I want": "No,I want", + "No.Iwant Cancel Trip.": "No.Iwant Cancel Trip.", + "Now move the map to your pickup point": + "Now move the map to your pickup point", + "Now set the pickup point for the other person": + "Now set the pickup point for the other person", + "On Trip": "On Trip", + "Open": "Open", + "Open destination search": "Open destination search", + "Open in Google Maps": "Open in Google Maps", + "Order VIP Canceld": "Order VIP Canceld", + "Passenger": "Passenger", + "Passenger cancel order": "Passenger cancel order", + "Pay by MTN Wallet": "Pay by MTN Wallet", + "Pay by Sham Cash": "Pay by Sham Cash", + "Pay by Syriatel Wallet": "Pay by Syriatel Wallet", + "Pay with PayPal": "Pay with PayPal", + "Phone": "Phone", + "Phone Number": "Phone Number", + "Phone Number Check": "Phone Number Check", + "Phone number seems too short": "Phone number seems too short", + "Phone verified. Please complete registration.": + "Phone verified. Please complete registration.", + "Pick destination on map": "Pick destination on map", + "Pick location on map": "Pick location on map", + "Pick on map": "Pick on map", + "Pick start point on map": "Pick start point on map", + "Plan Your Route": "Plan Your Route", + "Please add contacts to your phone.": + "Please add contacts to your phone.", + "Please check your internet and try again.": + "Please check your internet and try again.", + "Please enter a valid email.": "Please enter a valid email.", + "Please enter a valid phone number.": + "Please enter a valid phone number.", + "Please enter the number without the leading 0": + "Please enter the number without the leading 0", + "Please enter your phone number": "Please enter your phone number", + "Please go to Car now": "Please go to Car now", + "Please select a reason first": "Please select a reason first", + "Please set a valid SOS phone number.": + "Please set a valid SOS phone number.", + "Please slow down": "Please slow down", + "Please wait while we prepare your trip.": + "Please wait while we prepare your trip.", + "Preferences": "Preferences", + "Profile photo updated": "Profile photo updated", + "Quick Message": "Quick Message", + "Rating is": "Rating is", + "Received empty route data.": "Received empty route data.", + "Record": "Record", + "Record your trips to see them here.": + "Record your trips to see them here.", + "Rejected Orders Count": "Rejected Orders Count", + "Remove waypoint": "Remove waypoint", + "Report": "Report", + "Route and prices have been calculated successfully!": + "Route and prices have been calculated successfully!", + "SOS": "SOS", + "Save": "Save", + "Save Changes": "Save Changes", + "Save Name": "Save Name", + "Search country": "Search country", + "Search for a starting point": "Search for a starting point", + "Select Appearance": "Select Appearance", + "Select Education": "Select Education", + "Select Gender": "Select Gender", + "Select This Ride": "Select This Ride", + "Select betweeen types": "Select betweeen types", + "Send Email": "Send Email", + "Send SOS": "Send SOS", + "Send WhatsApp Message": "Send WhatsApp Message", + "Server Error": "Server Error", + "Server error": "Server error", + "Server error. Please try again.": "Server error. Please try again.", + "Set Destination": "Set Destination", + "Set Phone Number": "Set Phone Number", + "Set as Home": "Set as Home", + "Set as Stop": "Set as Stop", + "Set as Work": "Set as Work", + "Share": "Share", + "Share Trip": "Share Trip", + "Share your experience to help us improve...": + "Share your experience to help us improve...", + "Something went wrong. Please try again.": + "Something went wrong. Please try again.", + "Speaking...": "Speaking...", + "Speed Over": "Speed Over", + "Start Point": "Start Point", + "Stay calm. We are here to help.": "Stay calm. We are here to help.", + "Stop": "Stop", + "Submit Rating": "Submit Rating", + "Support & Info": "Support & Info", + "System Default": "System Default", + "Take a Photo": "Take a Photo", + "Tap to apply your discount": "Tap to apply your discount", + "Tap to search your destination": "Tap to search your destination", + "The driver cancelled the trip.": "The driver cancelled the trip.", + "This action cannot be undone.": "This action cannot be undone.", + "This action is permanent and cannot be undone.": + "This action is permanent and cannot be undone.", + "This is for delivery or a motorcycle.": + "This is for delivery or a motorcycle.", + "Time": "Time", + "To :": "To :", + "Top up Balance": "Top up Balance", + "Top up Balance to continue": "Top up Balance to continue", + "Total Invites": "Total Invites", + "Total Price": "Total Price", + "Trip booked successfully": "Trip booked successfully", + "Type your message...": "Type your message...", + "Unknown Location": "Unknown Location", + "Update Name": "Update Name", + "Verified Passenger": "Verified Passenger", + "View Map": "View Map", + "Wait for the trip to start first": + "Wait for the trip to start first", + "Waiting...": "Waiting...", + "Warning": "Warning", + "Waypoint has been set successfully": + "Waypoint has been set successfully", + "We use location to get accurate and nearest driver for you": + "We use location to get accurate and nearest driver for you", + "WhatsApp": "WhatsApp", + "Why do you want to cancel?": "Why do you want to cancel?", + "Yes": "Yes", + "You should ideintify your gender for this type of trip!": + "You should ideintify your gender for this type of trip!", + "You will choose one of above!": "You will choose one of above!", + "Your Rewards": "Your Rewards", + "Your complaint has been submitted.": + "Your complaint has been submitted.", + "and acknowledge our Privacy Policy.": + "and acknowledge our Privacy Policy.", + "as the driver.": "as the driver.", + "cancelled": "cancelled", + "due to a previous trip.": "due to a previous trip.", + "insert sos phone": "insert sos phone", + "is driving a": "is driving a", + "min added to fare": "min added to fare", + "phone not verified": "phone not verified", + "to arrive you.": "to arrive you.", + "unknown": "unknown", + "wait 1 minute to recive message": "wait 1 minute to recive message", + "with license plate": "with license plate", + "witout zero": "witout zero", + "you must insert token code": "you must insert token code", + "Syria": "سوریه", + "SYP": "لیره سوریه", + "Order": "درخواست", + "OrderVIP": "درخواست VIP", + "Cancel Trip": "لغو سفر", + "Passenger Cancel Trip": "مسافر سفر را لغو کرد", + "VIP Order": "سفارش VIP", + "The driver accepted your trip": "راننده سفر شما را پذیرفت", + "message From passenger": "پیام از مسافر", + "Cancel": "لغو", + "Trip Cancelled. The cost of the trip will be added to your wallet.": + "سفر لغو شد. هزینه سفر به کیف پول شما اضافه خواهد شد.", + "token change": "تغییر توکن", + "Changed my mind": "نظرم عوض شد", + "Please write the reason...": "لطفاً دلیل را بنویسید...", + "Found another transport": "وسیله نقلیه دیگری پیدا کردم", + "Driver is taking too long": "راننده خیلی طول می‌دهد", + "Driver asked me to cancel": "راننده از من خواست لغو کنم", + "Wrong pickup location": "محل سوار شدن اشتباه است", + "Other": "سایر", + "Don't Cancel": "لغو نکنید", + "No Drivers Found": "راننده‌ای پیدا نشد", + "Sorry, there are no cars available of this type right now.": + "متأسفیم، در حال حاضر خودرویی از این نوع در دسترس نیست.", + "Refresh Map": "به‌روزرسانی نقشه", + "face detect": "تشخیص چهره", + "Face Detection Result": "نتیجه تشخیص چهره", + "similar": "مشابه", + "not similar": "غیر مشابه", + "Searching for nearby drivers...": "در حال جستجوی رانندگان نزدیک...", + "Error": "خطا", + "Failed to search, please try again later": + "جستجو ناموفق بود، لطفاً بعداً تلاش کنید", + "Connection Error": "خطای اتصال", + "Please check your internet connection": + "لطفاً اتصال اینترنت خود را بررسی کنید", + "Sorry 😔": "متأسفیم 😔", + "The driver cancelled the trip for an emergency reason.\nDo you want to search for another driver immediately?": + "راننده سفر را به دلیل وضعیت اضطراری لغو کرد.\nآیا می‌خواهید بلافاصله به دنبال راننده دیگری بگردید؟", + "Search for another driver": "جستجو برای راننده دیگر", + "We apologize 😔": "عذرخواهی می‌کنیم 😔", + "No drivers found at the moment.\nPlease try again later.": + "در حال حاضر راننده‌ای پیدا نشد.\nلطفاً بعداً دوباره تلاش کنید.", + "Hi ,I will go now": "سلام، من الان حرکت می‌کنم", + "Passenger come to you": "مسافر به سمت شما می‌آید", + "Call Income": "تماس ورودی", + "Call Income from Passenger": "تماس ورودی از مسافر", + "Criminal Document Required": "گواهی عدم سوءپیشینه الزامی است", + "You should have upload it .": "شما باید آن را آپلود کنید.", + "Call End": "پایان تماس", + "The order has been accepted by another driver.": + "درخواست توسط راننده دیگری پذیرفته شد.", + "The order Accepted by another Driver": + "درخواست توسط راننده دیگری پذیرفته شد", + "We regret to inform you that another driver has accepted this order.": + "متاسفیم، راننده دیگری این درخواست را پذیرفته است.", + "Driver Applied the Ride for You": + "راننده درخواست سفر را برای شما ثبت کرد", + "Applied": "ثبت شد", + "Please go to Car Driver": "لطفاً به سمت خودروی راننده بروید", + "Ok I will go now.": "باشه، الان می‌روم.", + "Accepted Ride": "سفر پذیرفته شد", + "Driver Accepted the Ride for You": "راننده سفر را برای شما پذیرفت", + "Promo": "کد تخفیف", + "Show latest promo": "نمایش آخرین تخفیف‌ها", + "Trip Monitoring": "نظارت بر سفر", + "Driver Is Going To Passenger": "راننده در حال حرکت به سمت مسافر است", + "Please stay on the picked point.": + "لطفاً در نقطه انتخاب شده بمانید.", + "message From Driver": "پیام از راننده", + "Trip is Begin": "سفر آغاز شد", + "Cancel Trip from driver": "لغو سفر توسط راننده", + "We will look for a new driver.\nPlease wait.": + "ما به دنبال راننده جدید می‌گردیم.\nلطفاً صبر کنید.", + "The driver canceled your ride.": "راننده سفر شما را لغو کرد.", + "Driver Finish Trip": "راننده سفر را تمام کرد", + "you will pay to Driver": "شما به راننده پرداخت می‌کنید", + "Don’t forget your personal belongings.": + "وسایل شخصی خود را جا نگذارید.", + "Please make sure you have all your personal belongings and that any remaining fare, if applicable, has been added to your wallet before leaving. Thank you for choosing the Intaleq app": + "لطفاً مطمئن شوید که تمام وسایل شخصی خود را برداشته‌اید و باقی‌مانده کرایه به کیف پول شما اضافه شده است. از انتخاب اپلیکیشن Intaleq متشکریم.", + "Finish Monitor": "پایان نظارت", + "Trip finished": "سفر پایان یافت", + "Call Income from Driver": "تماس از راننده", + "Driver Cancelled Your Trip": "راننده سفر شما را لغو کرد", + "you will pay to Driver you will be pay the cost of driver time look to your Intaleq Wallet": + "هزینه زمان راننده را پرداخت خواهید کرد، کیف پول Intaleq را ببینید", + "Order Applied": "درخواست ثبت شد", + "welcome to intaleq": "به Intaleq خوش آمدید", + "login or register subtitle": + "برای ورود یا ثبت نام شماره موبایل خود را وارد کنید", + "Complaint cannot be filed for this ride. It may not have been completed or started.": + "برای این سفر نمی‌توان شکایت ثبت کرد. ممکن است تکمیل یا شروع نشده باشد.", + "phone number label": "شماره تلفن", + "phone number required": "شماره تلفن الزامی است", + "send otp button": "ارسال کد تأیید", + "verify your number title": "تأیید شماره", + "otp sent subtitle": "یک کد ۵ رقمی به شماره\n@phoneNumber ارسال شد", + "verify and continue button": "تأیید و ادامه", + "enter otp validation": "لطفاً کد تأیید ۵ رقمی را وارد کنید", + "one last step title": "یک قدم دیگر", + "complete profile subtitle": "برای شروع پروفایل خود را تکمیل کنید", + "first name label": "نام", + "first name required": "نام الزامی است", + "last name label": "نام خانوادگی", + "Verify OTP": "تأیید کد", + "Verification Code": "کد تأیید", + "We have sent a verification code to your mobile number:": + "ما یک کد تأیید به شماره موبایل شما ارسال کردیم:", + "Verify": "تأیید", + "Resend Code": "ارسال مجدد کد", + "You can resend in": "ارسال مجدد در", + "seconds": "ثانیه", + "Please enter the complete 6-digit code.": + "لطفاً کد کامل ۶ رقمی را وارد کنید.", + "last name required": "نام خانوادگی الزامی است", + "email optional label": "ایمیل (اختیاری)", + "complete registration button": "تکمیل ثبت نام", + "User with this phone number or email already exists.": + "کاربری با این شماره تلفن یا ایمیل قبلاً ثبت نام کرده است.", + "otp sent success": "کد تأیید به واتس‌اپ ارسال شد.", + "failed to send otp": "ارسال کد تأیید ناموفق بود.", + "server error try again": "خطای سرور، لطفاً دوباره تلاش کنید.", + "an error occurred": "خطایی رخ داد: @error", + "otp verification failed": "تأیید کد ناموفق بود.", + "registration failed": "ثبت نام ناموفق بود.", + "welcome user": "خوش آمدید، @firstName!", + "Don't forget your personal belongings.": + "وسایل شخصی خود را فراموش نکنید.", + "Share App": "اشتراک‌گذاری برنامه", + "Wallet": "کیف پول", + "Balance": "موجودی", + "Profile": "پروفایل", + "Contact Support": "تماس با پشتیبانی", + "Session expired. Please log in again.": + "نشست منقضی شد. لطفاً دوباره وارد شوید.", + "Security Warning": "⚠️ هشدار امنیتی", + "Potential security risks detected. The application may not function correctly.": + "خطرات امنیتی احتمالی شناسایی شد. ممکن است برنامه به درستی کار نکند.", + "please order now": "اکنون سفارش دهید", + "Where to": "کجا می‌روید؟", + "Where are you going?": "به کجا می‌روید؟", + "Quick Actions": "دسترسی سریع", + "My Balance": "موجودی من", + "Order History": "تاریخچه سفارش‌ها", + "Contact Us": "تماس با ما", + "Driver": "راننده", + "Complaint": "شکایت", + "Promos": "تخفیف‌ها", + "Recent Places": "مکان‌های اخیر", + "From": "از", + "WhatsApp Location Extractor": "استخراج موقعیت واتس‌اپ", + "Location Link": "لینک موقعیت", + "Paste location link here": "لینک موقعیت را اینجا پیست کنید", + "Go to this location": "برو به این موقعیت", + "Paste WhatsApp location link": "لینک موقعیت واتس‌اپ را پیست کنید", + "Select Order Type": "انتخاب نوع درخواست", + "Choose who this order is for": "این درخواست برای چه کسی است", + "I want to order for myself": "برای خودم درخواست می‌دهم", + "I want to order for someone else": "برای شخص دیگری درخواست می‌دهم", + "Order for someone else": "درخواست برای دیگری", + "Order for myself": "درخواست برای خودم", + "Are you want to go this site": "آیا می‌خواهید به این مکان بروید", + "No": "خیر", + "Intaleq Wallet": "کیف پول Intaleq", + "Have a promo code?": "کد تخفیف دارید؟", + "Your Wallet balance is ": "موجودی کیف پول شما: ", + "Cash": "نقدی", + "Pay directly to the captain": "پرداخت مستقیم به سفیر (راننده)", + "Top up Wallet to continue": "برای ادامه کیف پول را شارژ کنید", + "Or pay with Cash instead": "یا به صورت نقدی پرداخت کنید", + "Confirm & Find a Ride": "تأیید و یافتن خودرو", + "Balance:": "موجودی:", + "Alerts": "هشدارها", + "Welcome Back!": "خوش آمدید!", + "Current Balance": "موجودی فعلی", + "Set Wallet Phone Number": "تنظیم شماره تلفن کیف پول", + "Link a phone number for transfers": "اتصال شماره تلفن برای انتقال", + "Payment History": "تاریخچه پرداخت", + "View your past transactions": "مشاهده تراکنش‌های قبلی", + "Top up Wallet": "شارژ کیف پول", + "Add funds using our secure methods": "افزایش اعتبار با روش‌های امن", + "Increase Fare": "افزایش کرایه", + "No drivers accepted your request yet": + "هنوز هیچ راننده‌ای درخواست شما را نپذیرفته است", + "Increasing the fare might attract more drivers. Would you like to increase the price?": + "افزایش کرایه ممکن است رانندگان بیشتری را جذب کند. آیا مایل به افزایش قیمت هستید؟", + "Please make sure not to leave any personal belongings in the car.": + "لطفاً مطمئن شوید هیچ وسیله شخصی در خودرو جا نماند.", + "Cancel Ride": "لغو سفر", + "Route Not Found": "مسیر یافت نشد", + "We couldn't find a valid route to this destination. Please try selecting a different point.": + "مسیر معتبری به این مقصد پیدا نکردیم. لطفاً نقطه دیگری را انتخاب کنید.", + "You can call or record audio during this trip.": + "شما می‌توانید در طول این سفر تماس بگیرید یا صدا ضبط کنید.", + "Warning: Speeding detected!": "هشدار: سرعت غیرمجاز تشخیص داده شد!", + "Comfort": "آسایش (Comfort)", + "Intaleq Balance": "اعتبار Intaleq", + "Electric": "الکتریکی", + "Lady": "بانوان", + "Van": "ون", + "Rayeh Gai": "رفت و برگشت", + "Join Intaleq as a driver using my referral code!": + "با کد معرف من به عنوان راننده به Intaleq بپیوندید!", + "Use code:": "استفاده از کد:", + "Download the Intaleq Driver app now and earn rewards!": + "اپلیکیشن رانندگان Intaleq را دانلود کنید و پاداش بگیرید!", + "Get a discount on your first Intaleq ride!": + "برای اولین سفر خود در Intaleq تخفیف بگیرید!", + "Use my referral code:": "از کد معرف من استفاده کنید:", + "Download the Intaleq app now and enjoy your ride!": + "اپلیکیشن Intaleq را دانلود کنید و از سفر خود لذت ببرید!", + "Contacts Loaded": "مخاطبین بارگذاری شدند", + "Showing": "نمایش", + "of": "از", + "Customer not found": "مشتری یافت نشد", + "Wallet is blocked": "کیف پول مسدود شده است", + "Customer phone is not active": "تلفن مشتری فعال نیست", + "Balance not enough": "موجودی کافی نیست", + "Balance limit exceeded": "موجودی بیش از حد مجاز است", + "Incorrect sms code": + "⚠️ کد پیامک اشتباه است. لطفاً دوباره تلاش کنید.", + "contacts. Others were hidden because they don't have a phone number.": + "مخاطب. بقیه پنهان شدند چون شماره تلفن ندارند.", + "No contacts found": "مخاطبی یافت نشد", + "No contacts with phone numbers were found on your device.": + "هیچ مخاطبی با شماره تلفن در دستگاه شما یافت نشد.", + "Permission denied": "دسترسی رد شد", + "Contact permission is required to pick contacts": + "برای انتخاب مخاطبین دسترسی به دفترچه تلفن الزامی است.", + "An error occurred while picking contacts:": + "هنگام انتخاب مخاطبین خطایی رخ داد:", + "Please enter a correct phone": "لطفاً یک شماره تلفن صحیح وارد کنید", + "Success": "موفقیت", + "Invite sent successfully": "دعوت‌نامه با موفقیت ارسال شد", + "Hello! I'm inviting you to try Intaleq.": + "سلام! شما را به امتحان کردن Intaleq دعوت می‌کنم.", + "Use my invitation code to get a special gift on your first ride!": + "از کد دعوت من استفاده کنید تا در اولین سفر هدیه ویژه بگیرید!", + "Your personal invitation code is:": "کد دعوت شخصی شما:", + "Be sure to use it quickly! This code expires at": + "سریع استفاده کنید! این کد منقضی می‌شود در", + "Download the app now:": "اپلیکیشن را دانلود کنید:", + "See you on the road!": "به امید دیدار در جاده!", + "This phone number has already been invited.": + "این شماره قبلاً دعوت شده است.", + "An unexpected error occurred. Please try again.": + "خطای غیرمنتظره‌ای رخ داد. لطفاً دوباره تلاش کنید.", + "You deserve the gift": "شما شایسته این هدیه هستید", + "Claim your 20 LE gift for inviting": + "هدیه ۲۰ تومانی خود را برای دعوت دریافت کنید", + "You have got a gift for invitation": + "شما یک هدیه برای دعوت دریافت کردید", + "You have earned 20": "شما ۲۰ امتیاز کسب کردید", + "LE": "تومان", + "Vibration feedback for all buttons": + "بازخورد لرزشی برای همه دکمه‌ها", + "Share with friends and earn rewards": + "با دوستان به اشتراک بگذارید و پاداش بگیرید", + "Gift Already Claimed": "هدیه قبلاً دریافت شده است", + "You have already received your gift for inviting": + "شما قبلاً هدیه خود را برای این دعوت دریافت کرده‌اید", + "Keep it up!": "ادامه بده!", + "has completed": "تکمیل کرد", + "trips": "سفرها", + "Personal Information": "اطلاعات شخصی", + "Name": "نام", + "Not set": "تنظیم نشده", + "Gender": "جنسیت", + "Education": "تحصیلات", + "Work & Contact": "کار و تماس", + "Employment Type": "نوع شغل", + "Marital Status": "وضعیت تاهل", + "SOS Phone": "تلفن اضطراری", + "Sign Out": "خروج از حساب", + "Delete My Account": "حذف حساب من", + "Update Gender": "بروزرسانی جنسیت", + "Update": "بروزرسانی", + "Update Education": "بروزرسانی تحصیلات", + "Are you sure? This action cannot be undone.": + "آیا مطمئن هستید؟ این عملیات قابل بازگشت نیست.", + "Confirm your Email": "ایمیل خود را تأیید کنید", + "Type your Email": "ایمیل خود را وارد کنید", + "Delete Permanently": "حذف دائمی", + "Male": "مرد", + "Female": "زن", + "High School Diploma": "دیپلم", + "Associate Degree": "کاردانی", + "Bachelor's Degree": "کارشناسی", + "Master's Degree": "کارشناسی ارشد", + "Doctoral Degree": "دکترا", + "Select your preferred language for the app interface.": + "زبان مورد نظر خود را برای برنامه انتخاب کنید.", + "Language Options": "گزینه‌های زبان", + "You can claim your gift once they complete 2 trips.": + "پس از انجام ۲ سفر توسط آنها، می‌توانید هدیه خود را دریافت کنید.", + "Closest & Cheapest": "نزدیک‌ترین و ارزان‌ترین", + "Comfort choice": "انتخاب راحت", + "Travel in a modern, silent electric car. A premium, eco-friendly choice for a smooth ride.": + "با خودروی الکتریکی مدرن و بی‌صدا سفر کنید. انتخابی ممتاز و دوستدار محیط زیست.", + "Spacious van service ideal for families and groups. Comfortable, safe, and cost-effective travel together.": + "سرویس ون جادار، ایده‌آل برای خانواده‌ها و گروه‌ها. سفر راحت، امن و مقرون‌به‌صرفه.", + "Quiet & Eco-Friendly": "بی‌صدا و دوستدار محیط زیست", + "Lady Captain for girls": "راننده خانم برای بانوان", + "Van for familly": "ون برای خانواده", + "Are you sure to delete this location?": + "آیا از حذف این مکان مطمئن هستید؟", + "Submit a Complaint": "ثبت شکایت", + "Submit Complaint": "ارسال شکایت", + "No trip history found": "تاریخچه سفری یافت نشد", + "Your past trips will appear here.": + "سفرهای قبلی شما در اینجا نمایش داده می‌شود.", + "1. Describe Your Issue": "۱. مشکل خود را شرح دهید", + "Enter your complaint here...": "شکایت خود را اینجا بنویسید...", + "2. Attach Recorded Audio": "۲. ضمیمه کردن فایل صوتی", + "No audio files found.": "فایل صوتی یافت نشد.", + "Confirm Attachment": "تأیید پیوست", + "Attach this audio file?": "آیا این فایل صوتی پیوست شود؟", + "Uploaded": "آپلود شد", + "3. Review Details & Response": "۳. بررسی جزئیات و پاسخ", + "Date": "تاریخ", + "Today's Promos": "تخفیف‌های امروز", + "No promos available right now.": "در حال حاضر تخفیفی موجود نیست.", + "Check back later for new offers!": + "بعداً برای پیشنهادات جدید سر بزنید!", + "Valid Until:": "معتبر تا:", + "CODE": "کد", + "I Agree": "موافقم", + "Continue": "ادامه", + "Enable Location": "فعال‌سازی موقعیت", + "To give you the best experience, we need to know where you are. Your location is used to find nearby captains and for pickups.": + "برای ارائه بهترین خدمات، باید بدانیم کجا هستید. موقعیت شما برای یافتن رانندگان نزدیک استفاده می‌شود.", + "Allow Location Access": "اجازه دسترسی به موقعیت", + "Welcome to Intaleq!": "به Intaleq خوش آمدید!", + "Before we start, please review our terms.": + "قبل از شروع، لطفاً شرایط ما را مرور کنید.", + "Your journey starts here": "سفر شما از اینجا شروع می‌شود", + "Cancel Search": "لغو جستجو", + "Set pickup location": "تنظیم محل سوار شدن", + "Move the map to adjust the pin": "نقشه را برای تنظیم پین جابجا کنید", + "Searching for the nearest captain...": + "در حال جستجوی نزدیک‌ترین سفیر...", + "No one accepted? Try increasing the fare.": + "کسی قبول نکرد؟ افزایش کرایه را امتحان کنید.", + "Increase Your Trip Fee (Optional)": "افزایش هزینه سفر (اختیاری)", + "We haven't found any drivers yet. Consider increasing your trip fee to make your offer more attractive to drivers.": + "هنوز راننده‌ای پیدا نکرده‌ایم. برای جذاب‌تر کردن پیشنهاد، کرایه را افزایش دهید.", + "No, thanks": "نه، ممنون", + "Increase Fee": "افزایش کرایه", + "Copy": "کپی", + "Promo Copied!": "کد تخفیف کپی شد!", + "Code": "کد", + "Send Intaleq app to him": "ارسال برنامه Intaleq برای او", + "No passenger found for the given phone number": + "مسافری با این شماره تلفن یافت نشد", + "No user found for the given phone number": + "کاربری با این شماره تلفن یافت نشد", + "This price is": "این قیمت است", + "Work": "محل کار", + "Add Home": "افزودن خانه", + "Notifications": "اعلان‌ها", + "💳 Pay with Credit Card": "💳 پرداخت با کارت اعتباری", + "⚠️ You need to choose an amount!": "⚠️ باید مبلغی را انتخاب کنید!", + "💰 Pay with Wallet": "💰 پرداخت با کیف پول", + "You must restart the app to change the language.": + "برای تغییر زبان باید برنامه را دوباره راه‌اندازی کنید.", + "joined": "پیوست", + "Driver joined the channel": "راننده به کانال پیوست", + "Driver left the channel": "راننده کانال را ترک کرد", + "Call Page": "صفحه تماس", + "Call Left": "تماس‌های باقی‌مانده", + " Next as Cash !": " بعدی به صورت نقدی!", + "To use Wallet charge it": "برای استفاده از کیف پول آن را شارژ کنید", + "We are searching for the nearest driver to you": + "در حال جستجو برای نزدیک‌ترین راننده به شما", + "Best choice for cities": "بهترین انتخاب برای شهرها", + "Rayeh Gai: Round trip service for convenient travel between cities, easy and reliable.": + "رفت و برگشت: سرویس سفر دوطرفه برای راحتی سفر بین شهری.", + "This trip is for women only": "این سفر فقط برای بانوان است", + "Total budgets on month": "مجموع بودجه در ماه", + "You have call from driver": "شما تماس از راننده دارید", + "Intaleq": "Intaleq", + "passenger agreement": "توافق‌نامه مسافر", + "To become a passenger, you must review and agree to the ": + "برای مسافر شدن، باید بررسی کنید و موافقت کنید با ", + "agreement subtitle": + "برای ادامه، باید شرایط استفاده و سیاست حریم خصوصی را بپذیرید.", + "terms of use": "شرایط استفاده", + " and acknowledge our Privacy Policy.": + " و سیاست حریم خصوصی ما را تأیید کنید.", + "and acknowledge our": "و تأیید کنید", + "privacy policy": "سیاست حریم خصوصی.", + "i agree": "موافقم", + "Driver already has 2 trips within the specified period.": + "راننده در حال حاضر ۲ سفر در بازه زمانی مشخص دارد.", + "The invitation was sent successfully": + "دعوت‌نامه با موفقیت ارسال شد", + "You should select your country": "باید کشور خود را انتخاب کنید", + "Scooter": "اسکوتر", + "A trip with a prior reservation, allowing you to choose the best captains and cars.": + "سفری با رزرو قبلی، که به شما امکان انتخاب بهترین سفیران و خودروها را می‌دهد.", + "Mishwar Vip": "مشوار VIP", + "The driver waiting you in picked location .": + "راننده در محل انتخاب شده منتظر شماست.", + "About Us": "درباره ما", + "You can change the vibration feedback for all buttons": + "می‌توانید بازخورد لرزشی دکمه‌ها را تغییر دهید", + "Most Secure Methods": "امن‌ترین روش‌ها", + "In-App VOIP Calls": "تماس اینترنتی درون‌برنامه‌ای", + "Recorded Trips for Safety": "سفرهای ضبط شده برای امنیت", + "\nWe also prioritize affordability, offering competitive pricing to make your rides accessible.": + "\nما همچنین اولویت را بر مقرون‌به‌صرفه بودن می‌گذاریم.", + "Intaleq is a ride-sharing app designed with your safety and affordability in mind. We connect you with reliable drivers in your area, ensuring a convenient and stress-free travel experience.\n\nHere are some of the key features that set us apart:": + "Intaleq یک برنامه درخواست خودرو است که با در نظر گرفتن امنیت و بودجه شما طراحی شده است.", + "Sign In by Apple": "ورود با اپل", + "Sign In by Google": "ورود با گوگل", + "How do I request a ride?": "چگونه درخواست سفر دهم؟", + "Step-by-step instructions on how to request a ride through the Intaleq app.": + "دستورالعمل‌های گام‌به‌گام برای درخواست سفر.", + "What types of vehicles are available?": + "چه نوع خودروهایی موجود است؟", + "Intaleq offers a variety of vehicle options to suit your needs, including economy, comfort, and luxury. Choose the option that best fits your budget and passenger count.": + "Intaleq گزینه‌های مختلفی از جمله اقتصادی، راحت و لوکس ارائه می‌دهد.", + "How can I pay for my ride?": "چگونه هزینه سفر را پرداخت کنم؟", + "Intaleq offers multiple payment methods for your convenience. Choose between cash payment or credit/debit card payment during ride confirmation.": + "Intaleq روش‌های پرداخت متعددی ارائه می‌دهد.", + "Can I cancel my ride?": "آیا می‌توانم سفرم را لغو کنم؟", + "Yes, you can cancel your ride under certain conditions (e.g., before driver is assigned). See the Intaleq cancellation policy for details.": + "بله، شما می‌توانید تحت شرایط خاصی (مثلاً قبل از تعیین راننده) سفر خود را لغو کنید. برای جزئیات به سیاست لغو انطلق مراجعه کنید.", + "Driver Registration & Requirements": "ثبت نام راننده و الزامات", + "How can I register as a driver?": + "چگونه به عنوان راننده ثبت نام کنم؟", + "What are the requirements to become a driver?": + "شرایط راننده شدن چیست؟", + "Visit our website or contact Intaleq support for information on driver registration and requirements.": + "برای اطلاعات بیشتر به وب‌سایت ما مراجعه کنید یا با پشتیبانی تماس بگیرید.", + "Intaleq provides in-app chat functionality to allow you to communicate with your driver or passenger during your ride.": + "Intaleq امکان چت درون‌برنامه‌ای را فراهم می‌کند.", + "Intaleq prioritizes your safety. We offer features like driver verification, in-app trip tracking, and emergency contact options.": + "Intaleq امنیت شما را در اولویت قرار می‌دهد.", + "Frequently Questions": "سوالات متداول", + "User does not exist.": "کاربر وجود ندارد.", + "We need your phone number to contact you and to help you.": + "برای تماس و کمک به شما به شماره تلفن نیاز داریم.", + "You will recieve code in sms message": + "کد را در پیامک دریافت خواهید کرد", + "Please enter": "لطفاً وارد کنید", + "We need your phone number to contact you and to help you receive orders.": + "برای دریافت سفارشات به شماره تلفن نیاز داریم.", + "The full name on your criminal record does not match the one on your driver's license. Please verify and provide the correct documents.": + "نام کامل در گواهی عدم سوءپیشینه با گواهینامه مطابقت ندارد.", + "The national number on your driver's license does not match the one on your ID document. Please verify and provide the correct documents.": + "کد ملی در گواهینامه با کارت ملی مطابقت ندارد.", + "Capture an Image of Your Criminal Record": + "از گواهی عدم سوءپیشینه عکس بگیرید", + "IssueDate": "تاریخ صدور", + "Capture an Image of Your car license front": + "از روی کارت ماشین عکس بگیرید", + "Capture an Image of Your ID Document front": + "از روی کارت ملی عکس بگیرید", + "NationalID": "کد ملی", + "You can share the Intaleq App with your friends and earn rewards for rides they take using your code": + "برنامه را با دوستان به اشتراک بگذارید و پاداش بگیرید.", + "FullName": "نام کامل", + "No invitation found yet!": "هنوز دعوتی پیدا نشد!", + "InspectionResult": "نتیجه معاینه", + "Criminal Record": "گواهی عدم سوءپیشینه", + "The email or phone number is already registered.": + "ایمیل یا شماره تلفن قبلاً ثبت شده است.", + "To become a ride-sharing driver on the Intaleq app, you need to upload your driver's license, ID document, and car registration document. Our AI system will instantly review and verify their authenticity in just 2-3 minutes. If your documents are approved, you can start working as a driver on the Intaleq app. Please note, submitting fraudulent documents is a serious offense and may result in immediate termination and legal consequences.": + "برای راننده شدن باید مدارک خود را آپلود کنید. هوش مصنوعی ما در ۲-۳ دقیقه بررسی می‌کند.", + "Documents check": "بررسی مدارک", + "Driver's License": "گواهینامه رانندگی", + "for your first registration!": "برای اولین ثبت نام شما!", + "Get it Now!": "همین الان بگیر!", + "before": "قبل از", + "Code not approved": "کد تأیید نشد", + "3000 LE": "۳۰۰۰ تومان", + "Do you have an invitation code from another driver?": + "آیا کد دعوت از راننده دیگری دارید؟", + "Paste the code here": "کد را اینجا پیست کنید", + "No, I don't have a code": "خیر، کد ندارم", + "Audio uploaded successfully.": "فایل صوتی با موفقیت آپلود شد.", + "Perfect for passengers seeking the latest car models with the freedom to choose any route they desire": + "عالی برای مسافرانی که دنبال خودروهای جدید و آزادی انتخاب مسیر هستند", + "Share this code with your friends and earn rewards when they use it!": + "این کد را به اشتراک بگذارید و پاداش بگیرید!", + "Enter phone": "وارد کردن تلفن", + "complete, you can claim your gift": + "تکمیل شد، می‌توانید هدیه را دریافت کنید", + "When": "وقتی", + "Enter driver's phone": "تلفن راننده را وارد کنید", + "Send Invite": "ارسال دعوت‌نامه", + "Show Invitations": "نمایش دعوت‌ها", + "License Type": "نوع گواهینامه", + "National Number": "کد ملی", + "Name (Arabic)": "نام (فارسی/عربی)", + "Name (English)": "نام (انگلیسی)", + "Address": "آدرس", + "Issue Date": "تاریخ صدور", + "Expiry Date": "تاریخ انقضا", + "License Categories": "دسته‌های گواهینامه", + "driver_license": "گواهینامه", + "Capture an Image of Your Driver License": + "عکس گواهینامه خود را بگیرید", + "ID Documents Back": "پشت کارت ملی", + "National ID": "کارت ملی", + "Occupation": "شغل", + "Religion": "مذهب", + "Full Name (Marital)": "نام کامل", + "Expiration Date": "تاریخ انقضا", + "Capture an Image of Your ID Document Back": "عکس پشت کارت ملی", + "ID Documents Front": "روی کارت ملی", + "First Name": "نام", + "CardID": "شماره کارت", + "Vehicle Details Front": "جزئیات خودرو (جلو)", + "Plate Number": "شماره پلاک", + "Owner Name": "نام مالک", + "Vehicle Details Back": "جزئیات خودرو (پشت)", + "Make": "سازنده", + "Model": "مدل", + "Year": "سال", + "Chassis": "شماره شاسی", + "Color": "رنگ", + "Displacement": "حجم موتور", + "Fuel": "سوخت", + "Tax Expiry Date": "تاریخ انقضای مالیات", + "Inspection Date": "تاریخ معاینه فنی", + "Capture an Image of Your car license back": "عکس پشت کارت ماشین", + "Capture an Image of Your Driver's License": "عکس گواهینامه رانندگی", + "Sign in with Google for easier email and name entry": + "ورود با گوگل برای سهولت", + "You will choose allow all the time to be ready receive orders": + "گزینه 'همیشه اجازه داده شود' را انتخاب کنید", + "Get to your destination quickly and easily.": + "سریع و آسان به مقصد برسید.", + "Enjoy a safe and comfortable ride.": "از سفری امن و راحت لذت ببرید.", + "Choose Language": "انتخاب زبان", + "Pay with Wallet": "پرداخت با کیف پول", + "Invalid MPIN": "MPIN نامعتبر", + "Invalid OTP": "کد تأیید نامعتبر", + "Enter your email address": "آدرس ایمیل خود را وارد کنید", + "Please enter Your Email.": "لطفاً ایمیل خود را وارد کنید.", + "Enter your phone number": "شماره تلفن خود را وارد کنید", + "Please enter your phone number.": + "لطفاً شماره تلفن خود را وارد کنید.", + "Please enter Your Password.": "لطفاً رمز عبور خود را وارد کنید.", + "if you dont have account": "اگر حساب کاربری ندارید", + "Register": "ثبت نام", + "Accept Ride's Terms & Review Privacy Notice": + "پذیرش شرایط و مرور حریم خصوصی", + "By selecting 'I Agree' below, I have reviewed and agree to the Terms of Use and acknowledge the Privacy Notice. I am at least 18 years of age.": + "با انتخاب 'موافقم'، شرایط و حریم خصوصی را پذیرفته‌ام. من حداقل ۱۸ سال دارم.", + "First name": "نام", + "Enter your first name": "نام خود را وارد کنید", + "Please enter your first name.": "لطفاً نام خود را وارد کنید.", + "Last name": "نام خانوادگی", + "Enter your last name": "نام خانوادگی خود را وارد کنید", + "Please enter your last name.": + "لطفاً نام خانوادگی خود را وارد کنید.", + "City": "شهر", + "Please enter your City.": "لطفاً شهر خود را وارد کنید.", + "Verify Email": "تأیید ایمیل", + "We sent 5 digit to your Email provided": + "کد ۵ رقمی به ایمیل شما ارسال شد", + "5 digit": "۵ رقم", + "Send Verification Code": "ارسال کد تأیید", + "Your Ride Duration is ": "مدت زمان سفر شما: ", + "You will be thier in": "شما در ... آنجا خواهید بود", + "You trip distance is": "مسافت سفر شما:", + "Fee is": "هزینه:", + "From : ": "از: ", + "To : ": "به: ", + "Add Promo": "افزودن کد تخفیف", + "Confirm Selection": "تأیید انتخاب", + "distance is": "مسافت:", + "Privacy Policy": "سیاست حریم خصوصی", + "Intaleq LLC": "شرکت Intaleq", + "Syria's pioneering ride-sharing service, proudly developed by Arabian and local owners. We prioritize being near you – both our valued passengers and our dedicated captains.": + "سرویس پیشرو اشتراک سفر در ایران.", + "Intaleq is the first ride-sharing app in Syria, designed to connect you with the nearest drivers for a quick and convenient travel experience.": + "Intaleq اولین برنامه اشتراک سفر است.", + "Why Choose Intaleq?": "چرا Intaleq؟", + "Closest to You": "نزدیک‌ترین به شما", + "We connect you with the nearest drivers for faster pickups and quicker journeys.": + "ما شما را به نزدیک‌ترین رانندگان متصل می‌کنیم.", + "Uncompromising Security": "امنیت بی چون و چرا", + "Lady Captains Available": "رانندگان خانم موجود است", + "Recorded Trips (Voice & AI Analysis)": + "سفرهای ضبط شده (صدا و تحلیل هوش مصنوعی)", + "Fastest Complaint Response": "سریع‌ترین پاسخ به شکایات", + "Our dedicated customer service team ensures swift resolution of any issues.": + "تیم پشتیبانی ما مشکلات را سریع حل می‌کند.", + "Affordable for Everyone": "مقرون‌به‌صرفه برای همه", + "Frequently Asked Questions": "سوالات متداول", + "Getting Started": "شروع کار", + "Simply open the Intaleq app, enter your destination, and tap \"Request Ride\". The app will connect you with a nearby driver.": + "اپلیکیشن را باز کنید، مقصد را وارد کنید و درخواست خودرو دهید.", + "Vehicle Options": "گزینه‌های خودرو", + "Intaleq offers a variety of options including Economy, Comfort, and Luxury to suit your needs and budget.": + "Intaleq گزینه‌های متنوعی ارائه می‌دهد.", + "Payments": "پرداخت‌ها", + "You can pay for your ride using cash or credit/debit card. You can select your preferred payment method before confirming your ride.": + "می‌توانید نقدی یا با کارت پرداخت کنید.", + "Ride Management": "مدیریت سفر", + "Yes, you can cancel your ride, but please note that cancellation fees may apply depending on how far in advance you cancel.": + "بله، می‌توانید سفر را لغو کنید (ممکن است هزینه داشته باشد).", + "For Drivers": "برای رانندگان", + "Driver Registration": "ثبت نام راننده", + "To register as a driver or learn about the requirements, please visit our website or contact Intaleq support directly.": + "برای ثبت نام راننده به سایت مراجعه کنید.", + "Visit Website/Contact Support": "مشاهده وب‌سایت / تماس با پشتیبانی", + "Close": "بستن", + "We are searching for the nearest driver": "جستجوی نزدیک‌ترین راننده", + "Communication": "ارتباطات", + "How do I communicate with the other party (passenger/driver)?": + "چگونه ارتباط برقرار کنم؟", + "You can communicate with your driver or passenger through the in-app chat feature once a ride is confirmed.": + "از طریق چت درون برنامه‌ای.", + "Safety & Security": "ایمنی و امنیت", + "What safety measures does Intaleq offer?": + "چه اقدامات امنیتی ارائه می‌دهید؟", + "Intaleq offers various safety features including driver verification, in-app trip tracking, emergency contact options, and the ability to share your trip status with trusted contacts.": + "تأیید راننده، ردیابی سفر، تماس اضطراری.", + "Enjoy competitive prices across all trip options, making travel accessible.": + "از قیمت‌های رقابتی لذت ببرید.", + "Variety of Trip Choices": "تنوع انتخاب سفر", + "Choose the trip option that perfectly suits your needs and preferences.": + "گزینه مناسب خود را انتخاب کنید.", + "Your Choice, Our Priority": "انتخاب شما، اولویت ما", + "Because we are near, you have the flexibility to choose the ride that works best for you.": + "چون ما نزدیکیم، حق انتخاب دارید.", + "duration is": "مدت زمان:", + "Setting": "تنظیمات", + "Find answers to common questions": "پاسخ سوالات متداول", + "I don't need a ride anymore": "دیگر نیازی به سفر ندارم", + "I was just trying the application": + "فقط داشتم برنامه را تست می‌کردم", + "No driver accepted my request": "هیچ راننده‌ای قبول نکرد", + "I added the wrong pick-up/drop-off location": + "مبدأ/مقصد را اشتباه وارد کردم", + "I don't have a reason": "دلیلی ندارم", + "Can we know why you want to cancel Ride ?": + "چرا می‌خواهید لغو کنید؟", + "Add Payment Method": "افزودن روش پرداخت", + "Ride Wallet": "کیف پول سفر", + "Payment Method": "روش پرداخت", + "Type here Place": "مکان را اینجا بنویسید", + "Are You sure to ride to": "مطمئنید می‌خواهید بروید به", + "Confirm": "تأیید", + "You are Delete": "شما در حال حذف هستید", + "Deleted": "حذف شد", + "You Dont Have Any places yet !": "هنوز مکانی ندارید!", + "From : Current Location": "از: موقعیت فعلی", + "My Cared": "کارت‌های من", + "Add Card": "افزودن کارت", + "Add Credit Card": "افزودن کارت اعتباری", + "Please enter the cardholder name": "نام دارنده کارت", + "Please enter the expiry date": "تاریخ انقضا", + "Please enter the CVV code": "کد CVV", + "Go To Favorite Places": "رفتن به مکان‌های مورد علاقه", + "Go to this Target": "رفتن به این مقصد", + "My Profile": "پروفایل من", + "Are you want to go to this site": "می‌خواهید به این مکان بروید", + "MyLocation": "موقعیت من", + "my location": "موقعیت من", + "Target": "هدف", + "You Should choose rate figure": "باید امتیاز انتخاب کنید", + "Login Captin": "ورود سفیر", + "Register Captin": "ثبت نام سفیر", + "Send Verfication Code": "ارسال کد تأیید", + "KM": "کیلومتر", + "End Ride": "پایان سفر", + "Minute": "دقیقه", + "Go to passenger Location now": "الان به موقعیت مسافر بروید", + "Duration of the Ride is ": "مدت سفر: ", + "Distance of the Ride is ": "مسافت سفر: ", + "Name of the Passenger is ": "نام مسافر: ", + "Hello this is Captain": "سلام، من سفیر هستم", + "Start the Ride": "شروع سفر", + "Please Wait If passenger want To Cancel!": + "لطفاً صبر کنید شاید مسافر لغو کند!", + "Total Duration:": "مدت کل:", + "Active Duration:": "مدت فعال:", + "Waiting for Captin ...": "در انتظار سفیر...", + "Age is ": "سن: ", + "Rating is ": "امتیاز: ", + " to arrive you.": " تا رسیدن به شما.", + "Tariff": "تعرفه", + "Settings": "تنظیمات", + "Feed Back": "بازخورد", + "Please enter a valid 16-digit card number": + "لطفاً شماره کارت ۱۶ رقمی معتبر وارد کنید", + "Add Phone": "افزودن تلفن", + "Please enter a phone number": "لطفاً شماره تلفن وارد کنید", + "You dont Add Emergency Phone Yet!": + "هنوز تلفن اضطراری اضافه نکرده‌اید!", + "You will arrive to your destination after ": + "شما به مقصد می‌رسید بعد از ", + "You can cancel Ride now": "الان می‌توانید سفر را لغو کنید", + "You Can cancel Ride After Captain did not come in the time": + "اگر سفیر به موقع نیامد می‌توانید لغو کنید", + "If you in Car Now. Press Start The Ride": + "اگر در ماشین هستید، شروع سفر را بزنید", + "You Dont Have Any amount in": "موجودی ندارید در", + "Wallet!": "کیف پول!", + "You Have": "شما دارید", + "Save Credit Card": "ذخیره کارت اعتباری", + "Show Promos": "نمایش تخفیف‌ها", + "10 and get 4% discount": "۱۰ و ۴٪ تخفیف بگیرید", + "20 and get 6% discount": "۲۰ و ۶٪ تخفیف بگیرید", + "40 and get 8% discount": "۴۰ و ۸٪ تخفیف بگیرید", + "100 and get 11% discount": "۱۰۰ و ۱۱٪ تخفیف بگیرید", + "Pay with Your PayPal": "پرداخت با PayPal", + "You will choose one of above !": "یکی از موارد بالا را انتخاب کنید!", + "Edit Profile": "ویرایش پروفایل", + "Copy this Promo to use it in your Ride!": + "این کد تخفیف را کپی و استفاده کنید!", + "To change some Settings": "برای تغییر برخی تنظیمات", + "Order Request Page": "صفحه درخواست سفر", + "Rouats of Trip": "مسیرهای سفر", + "Passenger Name is ": "نام مسافر: ", + "Total From Passenger is ": "کل مبلغ از مسافر: ", + "Duration To Passenger is ": "زمان تا مسافر: ", + "Distance To Passenger is ": "مسافت تا مسافر: ", + "Total For You is ": "مجموع برای شما: ", + "Distance is ": "مسافت: ", + " KM": " کیلومتر", + "Duration of Trip is ": "مدت سفر: ", + " Minutes": " دقیقه", + "Apply Order": "پذیرش درخواست", + "Refuse Order": "رد درخواست", + "Rate Captain": "امتیاز به سفیر", + "Enter your Note": "یادداشت خود را وارد کنید", + "Type something...": "چیزی بنویسید...", + "Submit rating": "ثبت امتیاز", + "Rate Passenger": "امتیاز به مسافر", + "Ride Summary": "خلاصه سفر", + "welcome_message": "به Intaleq خوش آمدید!", + "app_description": "Intaleq امن و قابل اعتماد است.", + "get_to_destination": "سریع به مقصد برسید.", + "get_a_ride": "در چند دقیقه خودرو بگیرید.", + "safe_and_comfortable": "از سفری امن و راحت لذت ببرید.", + "committed_to_safety": "متعهد به ایمنی.", + "your ride is Accepted": "سفر شما پذیرفته شد", + "Driver is waiting at pickup.": "راننده در مبدأ منتظر است.", + "Driver is on the way": "راننده در راه است", + "Contact Options": "گزینه‌های تماس", + "Send a custom message": "ارسال پیام سفارشی", + "Type your message": "پیام خود را بنویسید", + "I will go now": "من الان می‌روم", + "You Have Tips": "انعام دارید", + " tips\nTotal is": " انعام\nمجموع:", + "Your fee is ": "هزینه شما: ", + "Do you want to pay Tips for this Driver": "می‌خواهید انعام دهید؟", + "Tip is ": "انعام: ", + "Are you want to wait drivers to accept your order": + "می‌خواهید منتظر پذیرش بمانید؟", + "This price is fixed even if the route changes for the driver.": + "قیمت ثابت است.", + "The price may increase if the route changes.": + "قیمت ممکن است تغییر کند.", + "The captain is responsible for the route.": + "مسئولیت مسیر با سفیر است.", + "We are search for nearst driver": "جستجوی نزدیک‌ترین راننده", + "Your order is being prepared": "سفارش در حال آماده‌سازی", + "The drivers are reviewing your request": "رانندگان در حال بررسی", + "Your order sent to drivers": "به رانندگان ارسال شد", + "You can call or record audio of this trip": + "می‌توانید تماس بگیرید یا ضبط کنید", + "The trip has started! Feel free to contact emergency numbers, share your trip, or activate voice recording for the journey": + "سفر شروع شد! می‌توانید تماس اضطراری بگیرید یا سفر را اشتراک بگذارید.", + "Camera Access Denied.": "دسترسی دوربین رد شد.", + "Open Settings": "باز کردن تنظیمات", + "GPS Required Allow !.": "GPS لازم است!", + "Your Account is Deleted": "حساب شما حذف شد", + "Are you sure to delete your account?": "آیا مطمئنید؟", + "Your data will be erased after 2 weeks\nAnd you will can't return to use app after 1 month ": + "داده‌ها بعد از ۲ هفته پاک می‌شوند.", + "Enter Your First Name": "نام خود را وارد کنید", + "Are you Sure to LogOut?": "آیا برای خروج مطمئنید؟", + "Email Wrong": "ایمیل اشتباه", + "Email you inserted is Wrong.": "ایمیل وارد شده اشتباه است.", + "You have finished all times ": "تمام دفعات را استفاده کردید", + "if you want help you can email us here": "برای کمک ایمیل بزنید", + "Thanks": "ممنون", + "Email Us": "به ما ایمیل بزنید", + "I cant register in your app in face detection ": + "نمی‌توانم با تشخیص چهره ثبت نام کنم", + "Hi": "سلام", + "No face detected": "چهره‌ای تشخیص داده نشد", + "Image detecting result is ": "نتیجه تشخیص تصویر: ", + "from 3 times Take Attention": "از ۳ بار، دقت کنید", + "Be sure for take accurate images please\nYou have": + "لطفاً عکس دقیق بگیرید\nشما دارید", + "image verified": "تصویر تأیید شد", + "Next": "بعدی", + "There is no help Question here": "سوال کمکی اینجا نیست", + "You dont have Points": "امتیاز ندارید", + "You Are Stopped For this Day !": "برای امروز متوقف شدید!", + "You must be charge your Account": "باید حساب را شارژ کنید", + "You Refused 3 Rides this Day that is the reason \nSee you Tomorrow!": + "۳ سفر را رد کردید.\nفردا می‌بینیمتان!", + "Recharge my Account": "شارژ حساب من", + "Ok , See you Tomorrow": "باشه، تا فردا", + "You are Stopped": "متوقف شدید", + "Connected": "متصل", + "Not Connected": "متصل نیست", + "Your are far from passenger location": "از مسافر دور هستید", + "go to your passenger location before\nPassenger cancel trip": + "قبل از لغو مسافر به موقعیت او بروید", + "You will get cost of your work for this trip": + "هزینه این سفر را دریافت خواهید کرد", + " in your wallet": " در کیف پول", + "you gain": "کسب کردید", + "Order Cancelled by Passenger": "لغو توسط مسافر", + "Feedback data saved successfully": "با موفقیت ذخیره شد", + "No Promo for today .": "امروز تخفیفی نیست.", + "Select your destination": "انتخاب مقصد", + "Search for your Start point": "جستجوی نقطه شروع", + "Search for waypoint": "جستجوی نقطه توقف", + "Current Location": "موقعیت فعلی", + "Add Location 1": "افزودن مکان ۱", + "You must Verify email !.": "باید ایمیل را تأیید کنید!", + "Cropper": "برش دهنده", + "Saved Sucssefully": "با موفقیت ذخیره شد", + "Select Date": "انتخاب تاریخ", + "Birth Date": "تاریخ تولد", + "Ok": "باشه", + "the 500 points equal 30 JOD": "۵۰۰ امتیاز برابر ۳۰ تومان", + "the 500 points equal 30 JOD for you \nSo go and gain your money": + "۵۰۰ امتیاز برای شما ۳۰ تومان است\nبروید و پول درآورید", + "token updated": "توکن بروز شد", + "Add Location 2": "افزودن مکان ۲", + "Add Location 3": "افزودن مکان ۳", + "Add Location 4": "افزودن مکان ۴", + "Waiting for your location": "در انتظار موقعیت شما", + "Search for your destination": "جستجوی مقصد", + "Hi! This is": "سلام! این", + " I am using": " من استفاده می‌کنم", + " to ride with": " برای سفر با", + " as the driver.": " به عنوان راننده.", + "is driving a ": "در حال راندن ", + " with license plate ": " با پلاک ", + " I am currently located at ": " من الان در ... هستم ", + "Please go to Car now ": "لطفاً الان به سمت ماشین بروید ", + "You will receive a code in WhatsApp Messenger": + "کد را در واتس‌اپ دریافت خواهید کرد", + "If you need assistance, contact us": + "اگر کمک نیاز دارید تماس بگیرید", + "Promo Ended": "تخفیف تمام شد", + "Enter the promo code and get": "کد تخفیف را وارد کنید و بگیرید", + "DISCOUNT": "تخفیف", + "No wallet record found": "رکورد کیف پول یافت نشد", + "for": "برای", + "Intaleq is the safest ride-sharing app that introduces many features for both captains and passengers. We offer the lowest commission rate of just 8%, ensuring you get the best value for your rides. Our app includes insurance for the best captains, regular maintenance of cars with top engineers, and on-road services to ensure a respectful and high-quality experience for all users.": + "Intaleq امن‌ترین برنامه است. کمیسیون پایین ۸٪. بیمه و تعمیر و نگهداری.", + "You can contact us during working hours from 12:00 - 19:00.": + "تماس در ساعات ۱۲ تا ۱۹.", + "Choose a contact option": "یک گزینه تماس انتخاب کنید", + "Work time is from 12:00 - 19:00.\nYou can send a WhatsApp message or email.": + "ساعات کاری ۱۲ تا ۱۹.\nواتس‌اپ یا ایمیل بزنید.", + "Promo code copied to clipboard!": "کد تخفیف کپی شد!", + "Copy Code": "کپی کد", + "Your invite code was successfully applied!": "کد دعوت اعمال شد!", + "Payment Options": "گزینه‌های پرداخت", + "wait 1 minute to receive message": "۱ دقیقه صبر کنید", + "You have copied the promo code.": "کد تخفیف را کپی کردید.", + "Select Payment Amount": "انتخاب مبلغ پرداخت", + "The promotion period has ended.": "دوره تخفیف تمام شده.", + "Promo Code Accepted": "کد تخفیف پذیرفته شد", + "Tap on the promo code to copy it!": "برای کپی ضربه بزنید!", + "Lowest Price Achieved": "کمترین قیمت حاصل شد", + "Cannot apply further discounts.": "تخفیف بیشتر ممکن نیست.", + "Promo Already Used": "تخفیف قبلاً استفاده شده", + "Invitation Used": "دعوت استفاده شده", + "You have already used this promo code.": + "شما قبلاً از این کد استفاده کرده‌اید.", + "Insert Your Promo Code": "کد تخفیف را وارد کنید", + "Enter promo code here": "کد تخفیف اینجا", + "Please enter a valid promo code": "لطفاً کد معتبر وارد کنید", + "Awfar Car": "خودروی اقتصادی", + "Old and affordable, perfect for budget rides.": + "قدیمی و مقرون‌به‌صرفه.", + " If you need to reach me, please contact the driver directly at": + " اگر کاری دارید با راننده تماس بگیرید در", + "No Car or Driver Found in your area.": + "خودرو یا راننده‌ای یافت نشد.", + "Please Try anther time ": "لطفاً زمان دیگری امتحان کنید ", + "There no Driver Aplly your order sorry for that ": + "هیچ راننده‌ای درخواست شما را نگرفت، متأسفیم ", + "Trip Cancelled": "سفر لغو شد", + "The Driver Will be in your location soon .": + "راننده به‌زودی می‌رسد.", + "The distance less than 500 meter.": "فاصله کمتر از ۵۰۰ متر.", + "Promo End !": "تخفیف تمام شد!", + "There is no notification yet": "اعلانی وجود ندارد", + "Use Touch ID or Face ID to confirm payment": + "از اثر انگشت یا چهره استفاده کنید", + "Contact us for any questions on your order.": + "برای هر سوالی تماس بگیرید.", + "Pyament Cancelled .": "پرداخت لغو شد.", + "type here": "اینجا بنویسید", + "Scan Driver License": "اسکن گواهینامه", + "Please put your licence in these border": + "گواهینامه را در کادر قرار دهید", + "Camera not initialized yet": "دوربین آماده نیست", + "Take Image": "عکس گرفتن", + "AI Page": "صفحه هوش مصنوعی", + "Take Picture Of ID Card": "عکس از کارت ملی", + "Take Picture Of Driver License Card": "عکس از گواهینامه", + "We are process picture please wait ": "در حال پردازش عکس، صبر کنید ", + "There is no data yet.": "هنوز داده‌ای نیست.", + "Name :": "نام:", + "Drivers License Class: ": "کلاس گواهینامه: ", + "Document Number: ": "شماره سند: ", + "Address: ": "آدرس: ", + "Height: ": "قد: ", + "Expiry Date: ": "تاریخ انقضا: ", + "Date of Birth: ": "تاریخ تولد: ", + "You can't continue with us .\nYou should renew Driver license": + "باید گواهینامه را تمدید کنید", + "Detect Your Face ": "تشخیص چهره ", + "Go to next step\nscan Car License.": "مرحله بعد\nاسکن کارت ماشین.", + "Name in arabic": "نام به فارسی", + "Drivers License Class": "کلاس گواهینامه", + "Selected Date": "تاریخ انتخاب شده", + "Select Time": "انتخاب زمان", + "Selected Time": "زمان انتخاب شده", + "Selected Date and Time": "تاریخ و زمان انتخاب شده", + "Lets check Car license ": "بررسی کارت ماشین ", + "Car": "خودرو", + "Plate": "پلاک", + "Rides": "سفرها", + "Selected driver": "راننده انتخاب شده", + "Lets check License Back Face": "بررسی پشت گواهینامه", + "Car License Card": "کارت ماشین", + "No image selected yet": "عکسی انتخاب نشده", + "Made :": "سازنده:", + "model :": "مدل:", + "VIN :": "شماره شاسی:", + "year :": "سال:", + "ُExpire Date": "تاریخ انقضا", + "Login Driver": "ورود راننده", + "Password must br at least 6 character.": + "رمز باید حداقل ۶ کاراکتر باشد.", + "if you don't have account": "اگر حساب ندارید", + "Here recorded trips audio": "صدای ضبط شده سفرها", + "Register as Driver": "ثبت نام به عنوان راننده", + "By selecting \"I Agree\" below, I have reviewed and agree to the Terms of Use and acknowledge the ": + "با انتخاب \"موافقم\"، شرایط استفاده را پذیرفته‌ام و ", + "Log Out Page": "صفحه خروج", + "Log Off": "خروج", + "Register Driver": "ثبت نام راننده", + "Verify Email For Driver": "تأیید ایمیل برای راننده", + "Admin DashBoard": "داشبورد مدیریت", + "Your name": "نام شما", + "your ride is applied": "سفر شما ثبت شد", + "H and": "س و", + "JOD": "تومان", + "m": "د", + "We search nearst Driver to you": "جستجوی نزدیک‌ترین راننده", + "please wait till driver accept your order": + "لطفاً منتظر پذیرش راننده بمانید", + "No accepted orders? Try raising your trip fee to attract riders.": + "سفارشی پذیرفته نشد؟ مبلغ را افزایش دهید.", + "You should select one": "باید یکی را انتخاب کنید", + "The driver accept your order for": "راننده سفارش شما را پذیرفت برای", + "The driver on your way": "راننده در راه است", + "Total price from ": "قیمت کل از ", + "Order Details Intaleq": "جزئیات سفارش Intaleq", + "Selected file:": "فایل انتخاب شده:", + "Your trip cost is": "هزینه سفر شما", + "this will delete all files from your device": + "این کار تمام فایل‌ها را حذف می‌کند", + "Exclusive offers and discounts always with the Intaleq app": + "تخفیف‌های ویژه همیشه با Intaleq", + "Submit Question": "ارسال سوال", + "Please enter your Question.": "لطفاً سوال خود را وارد کنید.", + "Help Details": "جزئیات راهنما", + "No trip yet found": "سفری یافت نشد", + "No Response yet.": "هنوز پاسخی نیست.", + " You Earn today is ": " درآمد امروز شما: ", + " You Have in": " شما دارید در", + "Total points is ": "مجموع امتیازات: ", + "Total Connection Duration:": "مجموع مدت اتصال:", + "Passenger name : ": "نام مسافر: ", + "Cost Of Trip IS ": "هزینه سفر: ", + "Arrival time": "زمان رسیدن", + "arrival time to reach your point": "زمان رسیدن به نقطه شما", + "For Intaleq and scooter trips, the price is calculated dynamically. For Comfort trips, the price is based on time and distance": + "قیمت‌گذاری پویا برای Intaleq و اسکوتر. زمانی و مسافتی برای Comfort.", + "Hello this is Driver": "سلام من راننده هستم", + "Is the Passenger in your Car ?": "آیا مسافر در خودرو است؟", + "Please wait for the passenger to enter the car before starting the trip.": + "لطفاً صبر کنید تا مسافر سوار شود.", + "No ,still Waiting.": "نه، هنوز منتظرم.", + "I arrive you": "رسیدم", + "I Arrive your site": "به موقعیت شما رسیدم", + "You are not in near to passenger location": "نزدیک مسافر نیستید", + "please go to picker location exactly": + "لطفاً دقیقاً به محل سوار شدن بروید", + "You Can Cancel Trip And get Cost of Trip From": + "می‌توانید لغو کنید و هزینه را دریافت کنید از", + "Are you sure to cancel?": "مطمئنید لغو می‌کنید؟", + "Insert Emergincy Number": "درج شماره اضطراری", + "Best choice for comfort car and flexible route and stops point": + "بهترین انتخاب برای راحتی و مسیر منعطف", + "Insert": "درج", + "This is for scooter or a motorcycle.": + "این برای اسکوتر یا موتورسیکلت است.", + "This trip goes directly from your starting point to your destination for a fixed price. The driver must follow the planned route": + "سفر مستقیم با قیمت ثابت.", + "You can decline a request without any cost": + "می‌توانید بدون هزینه رد کنید", + "Perfect for adventure seekers who want to experience something new and exciting": + "عالی برای ماجراجویان", + "My current location is:": "موقعیت فعلی من:", + "and I have a trip on": "و سفری دارم در", + "App with Passenger": "برنامه با مسافر", + "You will be pay the cost to driver or we will get it from you on next trip": + "هزینه را به راننده پرداخت می‌کنید یا در سفر بعد از شما می‌گیریم", + "Trip has Steps": "سفر مراحلی دارد", + "Distance from Passenger to destination is ": "فاصله مسافر تا مقصد: ", + "price is": "قیمت:", + "This ride type does not allow changes to the destination or additional stops": + "امکان تغییر مقصد یا توقف وجود ندارد", + "This price may be changed": "این قیمت ممکن است تغییر کند", + "No SIM card, no problem! Call your driver directly through our app. We use advanced technology to ensure your privacy.": + "سیم‌کارت ندارید؟ مشکلی نیست! از طریق برنامه تماس بگیرید.", + "This ride type allows changes, but the price may increase": + "امکان تغییر دارد اما قیمت ممکن است افزایش یابد", + "Select one message": "یک پیام انتخاب کنید", + "I'm waiting for you": "منتظر شما هستم", + "We noticed the Intaleq is exceeding 100 km/h. Please slow down for your safety. If you feel unsafe, you can share your trip details with a contact or call the police using the red SOS button.": + "سرعت بالای ۱۰۰ کیلومتر تشخیص داده شد. لطفاً آهسته‌تر برانید.", + "Warning: Intaleqing detected!": "هشدار: سرعت غیرمجاز!", + "Please help! Contact me as soon as possible.": + "کمک! سریعاً تماس بگیرید.", + "Share Trip Details": "اشتراک جزئیات سفر", + "Car Plate is ": "پلاک خودرو: ", + "the 300 points equal 300 L.E for you \nSo go and gain your money": + "۳۰۰ امتیاز برابر ۳۰۰ تومان برای شماست\nبروید و پول درآورید", + "the 300 points equal 300 L.E": "۳۰۰ امتیاز برابر ۳۰۰ تومان", + "The payment was not approved. Please try again.": + "پرداخت تأیید نشد. دوباره تلاش کنید.", + "Payment Failed": "پرداخت ناموفق", + "This is a scheduled notification.": + "این یک اعلان زمان‌بندی شده است.", + "An error occurred during the payment process.": + "خطایی در پرداخت رخ داد.", + "The payment was approved.": "پرداخت تأیید شد.", + "Payment Successful": "پرداخت موفق", + "No ride found yet": "هنوز سفری یافت نشد", + "Accept Order": "پذیرش سفارش", + "Bottom Bar Example": "مثال نوار پایین", + "Driver phone": "تلفن راننده", + "Statistics": "آمار", + "Origin": "مبدأ", + "Destination": "مقصد", + "Driver Name": "نام راننده", + "Driver Car Plate": "پلاک راننده", + "Available for rides": "آماده برای سفر", + "Scan Id": "اسکن کارت ملی", + "Camera not initilaized yet": "دوربین هنوز آماده نیست", + "Scan ID MklGoogle": "اسکن ID MklGoogle", + "Language": "زبان", + "Jordan": "اردن", + "USA": "آمریکا", + "Egypt": "مصر", + "Turkey": "ترکیه", + "Saudi Arabia": "عربستان سعودی", + "Qatar": "قطر", + "Bahrain": "بحرین", + "Kuwait": "کویت", + "But you have a negative salary of": "اما موجودی منفی دارید به مبلغ", + "Promo Code": "کد تخفیف", + "Your trip distance is": "مسافت سفر شما:", + "Enter promo code": "کد تخفیف را وارد کنید", + "You have promo!": "تخفیف دارید!", + "Cost Duration": "هزینه مدت زمان", + "Duration is": "مدت زمان:", + "Leave": "ترک کردن", + "Join": "پیوستن", + "Heading your way now. Please be ready.": + "دارم می‌آیم. لطفاً آماده باشید.", + "Approaching your area. Should be there in 3 minutes.": + "نزدیک منطقه شما هستم. ۳ دقیقه دیگر می‌رسم.", + "There's heavy traffic here. Can you suggest an alternate pickup point?": + "ترافیک سنگین است. نقطه دیگری پیشنهاد می‌کنید؟", + "This ride is already taken by another driver.": + "این سفر توسط راننده دیگری گرفته شد.", + "You Should be select reason.": "باید دلیلی را انتخاب کنید.", + "Waiting for Driver ...": "در انتظار راننده...", + "Latest Recent Trip": "آخرین سفر اخیر", + "from your list": "از لیست شما", + "Do you want to change Work location": + "می‌خواهید محل کار را تغییر دهید", + "Do you want to change Home location": "می‌خواهید خانه را تغییر دهید", + "We Are Sorry That we dont have cars in your Location!": + "متاسفیم، در موقعیت شما خودرویی نداریم!", + "Choose from Map": "انتخاب از روی نقشه", + "Pick your ride location on the map - Tap to confirm": + "محل سفر را روی نقشه انتخاب کنید - برای تأیید ضربه بزنید", + "Intaleq is the ride-hailing app that is safe, reliable, and accessible.": + "Intaleq امن و قابل اعتماد است.", + "With Intaleq, you can get a ride to your destination in minutes.": + "با Intaleq در چند دقیقه به مقصد برسید.", + "Intaleq is committed to safety, and all of our captains are carefully screened and background checked.": + "Intaleq متعهد به ایمنی است.", + "Pick from map": "انتخاب از نقشه", + "No Car in your site. Sorry!": "خودرویی در محل شما نیست. متاسفیم!", + "Nearest Car for you about ": "نزدیک‌ترین خودرو حدود ", + "From :": "از:", + "Get Details of Trip": "دریافت جزئیات سفر", + "If you want add stop click here": "برای افزودن توقف اینجا کلیک کنید", + "Where you want go ": "کجا می‌خواهید بروید ", + "My Card": "کارت من", + "Start Record": "شروع ضبط", + "History of Trip": "تاریخچه سفر", + "Helping Center": "مرکز راهنما", + "Record saved": "ضبط ذخیره شد", + "Trips recorded": "سفرهای ضبط شده", + "Select Your Country": "کشور خود را انتخاب کنید", + "To ensure you receive the most accurate information for your location, please select your country below. This will help tailor the app experience and content to your country.": + "لطفاً کشور خود را انتخاب کنید تا اطلاعات دقیق دریافت کنید.", + "Are you sure to delete recorded files": + "آیا از حذف فایل‌های ضبط شده مطمئنید", + "Select recorded trip": "انتخاب سفر ضبط شده", + "Card Number": "شماره کارت", + "Hi, Where to ": "سلام، به کجا ", + "Pick your destination from Map": "مقصد را از نقشه انتخاب کنید", + "Add Stops": "افزودن توقف", + "Get Direction": "مسیریابی", + "Add Location": "افزودن مکان", + "Switch Rider": "تغییر مسافر", + "You will arrive to your destination after timer end.": + "پس از پایان تایمر به مقصد خواهید رسید.", + "You can cancel trip": "می‌توانید سفر را لغو کنید", + "The driver waitting you in picked location .": + "راننده در محل انتخاب شده منتظر شماست.", + "Pay with Your": "پرداخت با", + "Pay with Credit Card": "پرداخت با کارت اعتباری", + "Show Promos to Charge": "نمایش تخفیف‌ها برای شارژ", + "Point": "امتیاز", + "How many hours would you like to wait?": + "چند ساعت می‌خواهید منتظر بمانید؟", + "Driver Wallet": "کیف پول راننده", + "Choose between those Type Cars": + "از بین این نوع خودروها انتخاب کنید", + "hour": "ساعت", + "Select Waiting Hours": "انتخاب ساعات انتظار", + "Total Points is": "مجموع امتیازات:", + "You will receive a code in SMS message": + "کدی در پیامک دریافت خواهید کرد", + "Done": "انجام شد", + "Total Budget from trips is ": "مجموع درآمد از سفرها: ", + "Total Amount:": "مبلغ کل:", + "Total Budget from trips by\nCredit card is ": + "مجموع درآمد از کارت اعتباری: ", + "This amount for all trip I get from Passengers": + "این مبلغ برای تمام سفرهایی که از مسافران گرفتم", + "Pay from my budget": "پرداخت از اعتبار من", + "This amount for all trip I get from Passengers and Collected For me in": + "این مبلغ جمع‌آوری شده برای من در", + "You can buy points from your budget": + "می‌توانید از اعتبار خود امتیاز بخرید", + "insert amount": "مبلغ را وارد کنید", + "You can buy Points to let you online\nby this list below": + "می‌توانید امتیاز بخرید تا آنلاین شوید\nاز لیست زیر", + "Create Wallet to receive your money": + "برای دریافت پول کیف پول بسازید", + "Enter your feedback here": "بازخورد خود را اینجا وارد کنید", + "Please enter your feedback.": "لطفاً بازخورد خود را وارد کنید.", + "Feedback": "بازخورد", + "Submit ": "ارسال ", + "Click here to Show it in Map": "برای نمایش روی نقشه کلیک کنید", + "Canceled": "لغو شد", + "No I want": "نه من می‌خواهم", + "Email is": "ایمیل:", + "Phone Number is": "شماره تلفن:", + "Date of Birth is": "تاریخ تولد:", + "Sex is ": "جنسیت: ", + "Car Details": "جزئیات خودرو", + "VIN is": "شماره شاسی:", + "Color is ": "رنگ: ", + "Make is ": "سازنده: ", + "Model is": "مدل:", + "Year is": "سال:", + "Expiration Date ": "تاریخ انقضا: ", + "Edit Your data": "ویرایش اطلاعات", + "write vin for your car": "شماره شاسی خودرو را بنویسید", + "VIN": "شماره شاسی", + "Please verify your identity": "لطفاً هویت خود را تأیید کنید", + "write Color for your car": "رنگ خودرو را بنویسید", + "write Make for your car": "سازنده خودرو را بنویسید", + "write Model for your car": "مدل خودرو را بنویسید", + "write Year for your car": "سال خودرو را بنویسید", + "write Expiration Date for your car": "تاریخ انقضای خودرو را بنویسید", + "Tariffs": "تعرفه‌ها", + "Minimum fare": "حداقل کرایه", + "Maximum fare": "حداکثر کرایه", + "Flag-down fee": "ورودی", + "Including Tax": "شامل مالیات", + "BookingFee": "هزینه رزرو", + "Morning": "صبح", + "from 07:30 till 10:30 (Thursday, Friday, Saturday, Monday)": + "از ۰۷:۳۰ تا ۱۰:۳۰", + "Evening": "عصر", + "from 12:00 till 15:00 (Thursday, Friday, Saturday, Monday)": + "از ۱۲:۰۰ تا ۱۵:۰۰", + "Night": "شب", + "You have in account": "در حساب دارید", + "Select Country": "انتخاب کشور", + "Ride Today : ": "سفر امروز: ", + "After this period\nYou can't cancel!": + "بعد از این مدت\nنمی‌توانید لغو کنید!", + "from 23:59 till 05:30": "از ۲۳:۵۹ تا ۰۵:۳۰", + "Rate Driver": "امتیاز به راننده", + "Total Cost is ": "هزینه کل: ", + "Write note": "نوشتن یادداشت", + "Time to arrive": "زمان رسیدن", + "Ride Summaries": "خلاصه سفرها", + "Total Cost": "هزینه کل", + "Average of Hours of": "میانگین ساعات", + " is ON for this month": " در این ماه روشن است", + "Days": "روزها", + "Total Hours on month": "مجموع ساعات در ماه", + "Counts of Hours on days": "تعداد ساعات در روزها", + "OrderId": "شناسه سفارش", + "created time": "زمان ایجاد", + "Intaleq Over": "Intaleq تمام شد", + "I will slow down": "من سرعتم را کم می‌کنم", + "Map Passenger": "نقشه مسافر", + "Be Slowly": "آهسته باش", + "If you want to make Google Map App run directly when you apply order": + "اگر می‌خواهید گوگل مپ مستقیماً اجرا شود", + "You can change the language of the app": + "می‌توانید زبان برنامه را تغییر دهید", + "Your Budget less than needed": "بودجه شما کمتر از حد نیاز است", + "You can change the Country to get all features": + "برای دسترسی به تمام ویژگی‌ها کشور را تغییر دهید", + "There is no Car or Driver in your area.": + "در منطقه شما خودرو یا راننده‌ای وجود ندارد.", + "Change Country": "تغییر کشور", + }, + "el": { + "1 Passenger": "1 Passenger", + "2 Passengers": "2 Passengers", + "3 Passengers": "3 Passengers", + "4 Passengers": "4 Passengers", + "2. Attach Recorded Audio (Optional)": + "2. Attach Recorded Audio (Optional)", + "Account": "Account", + "Actions": "Actions", + "Active Users": "Active Users", + "Add a Stop": "Add a Stop", + "Add a new waypoint stop": "Add a new waypoint stop", + "After this period\nYou can\'t cancel!": + "After this period\nYou can\'t cancel!", + "Age is": "Age is", + "Alert": "Alert", + "An OTP has been sent to your number.": + "An OTP has been sent to your number.", + "An error occurred": "An error occurred", + "Appearance": "Appearance", + "Are you sure you want to delete this file?": + "Are you sure you want to delete this file?", + "Are you sure you want to logout?": + "Are you sure you want to logout?", + "Arrived": "Arrived", + "Audio Recording": "Audio Recording", + "Call": "Call", + "Call Support": "Call Support", + "Call left": "Call left", + "Change Photo": "Change Photo", + "Choose from Gallery": "Choose from Gallery", + "Choose from contact": "Choose from contact", + "Click to track the trip": "Click to track the trip", + "Close panel": "Close panel", + "Coming": "Coming", + "Complete Payment": "Complete Payment", + "Confirm Cancellation": "Confirm Cancellation", + "Confirm Pickup Location": "Confirm Pickup Location", + "Connection failed. Please try again.": + "Connection failed. Please try again.", + "Could not create ride. Please try again.": + "Could not create ride. Please try again.", + "Crop Photo": "Crop Photo", + "Dark Mode": "Dark Mode", + "Delete": "Delete", + "Delete Account": "Delete Account", + "Delete All": "Delete All", + "Delete All Recordings?": "Delete All Recordings?", + "Delete Recording?": "Delete Recording?", + "Destination Set": "Destination Set", + "Distance": "Distance", + "Double tap to open search or enter destination": + "Double tap to open search or enter destination", + "Double tap to set or change this waypoint on the map": + "Double tap to set or change this waypoint on the map", + "Drawing route on map...": "Drawing route on map...", + "Driver Phone": "Driver Phone", + "Driver is Going To You": "Driver is Going To You", + "Emergency Mode Triggered": "Emergency Mode Triggered", + "Emergency SOS": "Emergency SOS", + "Enter the 5-digit code": "Enter the 5-digit code", + "Enter your City": "Enter your City", + "Enter your Password": "Enter your Password", + "Failed to book trip: \$e": "Failed to book trip: \$e", + "Failed to get location": "Failed to get location", + "Failed to initiate payment. Please try again.": + "Failed to initiate payment. Please try again.", + "Failed to send OTP": "Failed to send OTP", + "Failed to upload photo": "Failed to upload photo", + "Finished": "Finished", + "Fixed Price": "Fixed Price", + "General": "General", + "Grant": "Grant", + "Have a Promo Code?": "Have a Promo Code?", + "Hello! I\'m inviting you to try Intaleq.": + "Hello! I\'m inviting you to try Intaleq.", + "Hi ,I Arrive your site": "Hi ,I Arrive your site", + "Hi, Where to": "Hi, Where to", + "Home": "Home", + "I am currently located at": "I am currently located at", + "I'm Safe": "I'm Safe", + "If you need to reach me, please contact the driver directly at": + "If you need to reach me, please contact the driver directly at", + "Image Upload Failed": "Image Upload Failed", + "Intaleq Passenger": "Intaleq Passenger", + "Invite": "Invite", + "Join a channel": "Join a channel", + "Last Name": "Last Name", + "Leave a detailed comment (Optional)": + "Leave a detailed comment (Optional)", + "Light Mode": "Light Mode", + "Listen": "Listen", + "Location": "Location", + "Location Received": "Location Received", + "Logout": "Logout", + "Map Error": "Map Error", + "Message": "Message", + "Move map to select destination": "Move map to select destination", + "Move map to set start location": "Move map to set start location", + "Move map to set stop": "Move map to set stop", + "Move map to your home location": "Move map to your home location", + "Move map to your pickup point": "Move map to your pickup point", + "Move map to your work location": "Move map to your work location", + "N/A": "N/A", + "No Notifications": "No Notifications", + "No Recordings Found": "No Recordings Found", + "No Rides now!": "No Rides now!", + "No contacts available": "No contacts available", + "No i want": "No i want", + "No notification data found.": "No notification data found.", + "No routes available for this destination.": + "No routes available for this destination.", + "No user found": "No user found", + "No,I want": "No,I want", + "No.Iwant Cancel Trip.": "No.Iwant Cancel Trip.", + "Now move the map to your pickup point": + "Now move the map to your pickup point", + "Now set the pickup point for the other person": + "Now set the pickup point for the other person", + "On Trip": "On Trip", + "Open": "Open", + "Open destination search": "Open destination search", + "Open in Google Maps": "Open in Google Maps", + "Order VIP Canceld": "Order VIP Canceld", + "Passenger": "Passenger", + "Passenger cancel order": "Passenger cancel order", + "Pay by MTN Wallet": "Pay by MTN Wallet", + "Pay by Sham Cash": "Pay by Sham Cash", + "Pay by Syriatel Wallet": "Pay by Syriatel Wallet", + "Pay with PayPal": "Pay with PayPal", + "Phone": "Phone", + "Phone Number": "Phone Number", + "Phone Number Check": "Phone Number Check", + "Phone number seems too short": "Phone number seems too short", + "Phone verified. Please complete registration.": + "Phone verified. Please complete registration.", + "Pick destination on map": "Pick destination on map", + "Pick location on map": "Pick location on map", + "Pick on map": "Pick on map", + "Pick start point on map": "Pick start point on map", + "Plan Your Route": "Plan Your Route", + "Please add contacts to your phone.": + "Please add contacts to your phone.", + "Please check your internet and try again.": + "Please check your internet and try again.", + "Please enter a valid email.": "Please enter a valid email.", + "Please enter a valid phone number.": + "Please enter a valid phone number.", + "Please enter the number without the leading 0": + "Please enter the number without the leading 0", + "Please enter your phone number": "Please enter your phone number", + "Please go to Car now": "Please go to Car now", + "Please select a reason first": "Please select a reason first", + "Please set a valid SOS phone number.": + "Please set a valid SOS phone number.", + "Please slow down": "Please slow down", + "Please wait while we prepare your trip.": + "Please wait while we prepare your trip.", + "Preferences": "Preferences", + "Profile photo updated": "Profile photo updated", + "Quick Message": "Quick Message", + "Rating is": "Rating is", + "Received empty route data.": "Received empty route data.", + "Record": "Record", + "Record your trips to see them here.": + "Record your trips to see them here.", + "Rejected Orders Count": "Rejected Orders Count", + "Remove waypoint": "Remove waypoint", + "Report": "Report", + "Route and prices have been calculated successfully!": + "Route and prices have been calculated successfully!", + "SOS": "SOS", + "Save": "Save", + "Save Changes": "Save Changes", + "Save Name": "Save Name", + "Search country": "Search country", + "Search for a starting point": "Search for a starting point", + "Select Appearance": "Select Appearance", + "Select Education": "Select Education", + "Select Gender": "Select Gender", + "Select This Ride": "Select This Ride", + "Select betweeen types": "Select betweeen types", + "Send Email": "Send Email", + "Send SOS": "Send SOS", + "Send WhatsApp Message": "Send WhatsApp Message", + "Server Error": "Server Error", + "Server error": "Server error", + "Server error. Please try again.": "Server error. Please try again.", + "Set Destination": "Set Destination", + "Set Phone Number": "Set Phone Number", + "Set as Home": "Set as Home", + "Set as Stop": "Set as Stop", + "Set as Work": "Set as Work", + "Share": "Share", + "Share Trip": "Share Trip", + "Share your experience to help us improve...": + "Share your experience to help us improve...", + "Something went wrong. Please try again.": + "Something went wrong. Please try again.", + "Speaking...": "Speaking...", + "Speed Over": "Speed Over", + "Start Point": "Start Point", + "Stay calm. We are here to help.": "Stay calm. We are here to help.", + "Stop": "Stop", + "Submit Rating": "Submit Rating", + "Support & Info": "Support & Info", + "System Default": "System Default", + "Take a Photo": "Take a Photo", + "Tap to apply your discount": "Tap to apply your discount", + "Tap to search your destination": "Tap to search your destination", + "The driver cancelled the trip.": "The driver cancelled the trip.", + "This action cannot be undone.": "This action cannot be undone.", + "This action is permanent and cannot be undone.": + "This action is permanent and cannot be undone.", + "This is for delivery or a motorcycle.": + "This is for delivery or a motorcycle.", + "Time": "Time", + "To :": "To :", + "Top up Balance": "Top up Balance", + "Top up Balance to continue": "Top up Balance to continue", + "Total Invites": "Total Invites", + "Total Price": "Total Price", + "Trip booked successfully": "Trip booked successfully", + "Type your message...": "Type your message...", + "Unknown Location": "Unknown Location", + "Update Name": "Update Name", + "Verified Passenger": "Verified Passenger", + "View Map": "View Map", + "Wait for the trip to start first": + "Wait for the trip to start first", + "Waiting...": "Waiting...", + "Warning": "Warning", + "Waypoint has been set successfully": + "Waypoint has been set successfully", + "We use location to get accurate and nearest driver for you": + "We use location to get accurate and nearest driver for you", + "WhatsApp": "WhatsApp", + "Why do you want to cancel?": "Why do you want to cancel?", + "Yes": "Yes", + "You should ideintify your gender for this type of trip!": + "You should ideintify your gender for this type of trip!", + "You will choose one of above!": "You will choose one of above!", + "Your Rewards": "Your Rewards", + "Your complaint has been submitted.": + "Your complaint has been submitted.", + "and acknowledge our Privacy Policy.": + "and acknowledge our Privacy Policy.", + "as the driver.": "as the driver.", + "cancelled": "cancelled", + "due to a previous trip.": "due to a previous trip.", + "insert sos phone": "insert sos phone", + "is driving a": "is driving a", + "min added to fare": "min added to fare", + "phone not verified": "phone not verified", + "to arrive you.": "to arrive you.", + "unknown": "unknown", + "wait 1 minute to recive message": "wait 1 minute to recive message", + "with license plate": "with license plate", + "witout zero": "witout zero", + "you must insert token code": "you must insert token code", + "Syria": "Συρία", + "SYP": "SYP", + "Order": "Αίτημα", + "OrderVIP": "VIP Αίτημα", + "Cancel Trip": "Ακύρωση Διαδρομής", + "Passenger Cancel Trip": "Ο επιβάτης ακύρωσε τη διαδρομή", + "VIP Order": "VIP Αίτημα", + "The driver accepted your trip": + "Ο οδηγός αποδέχτηκε τη διαδρομή σας", + "message From passenger": "Μήνυμα από τον επιβάτη", + "Cancel": "Ακύρωση", + "Trip Cancelled. The cost of the trip will be added to your wallet.": + "Η διαδρομή ακυρώθηκε. Το κόστος θα προστεθεί στο πορτοφόλι σας.", + "token change": "Αλλαγή Token", + "Changed my mind": "Άλλαξα γνώμη", + "Please write the reason...": "Παρακαλώ γράψτε τον λόγο...", + "Found another transport": "Βρήκα άλλο μέσο μεταφοράς", + "Driver is taking too long": "Ο οδηγός αργεί πολύ", + "Driver asked me to cancel": "Ο οδηγός μου ζήτησε να ακυρώσω", + "Wrong pickup location": "Λάθος τοποθεσία παραλαβής", + "Other": "Άλλο", + "Don't Cancel": "Να μην ακυρωθεί", + "No Drivers Found": "Δεν βρέθηκαν οδηγοί", + "Sorry, there are no cars available of this type right now.": + "Λυπούμαστε, αλλά δεν υπάρχουν διαθέσιμα αυτοκίνητα αυτού του τύπου αυτή τη στιγμή.", + "Refresh Map": "Ανανέωση χάρτη", + "face detect": "Ανίχνευση Προσώπου", + "Face Detection Result": "Αποτέλεσμα Ανίχνευσης Προσώπου", + "similar": "Παρόμοιο", + "not similar": "Μη παρόμοιο", + "Searching for nearby drivers...": "Αναζήτηση για οδηγούς κοντά...", + "Error": "Σφάλμα", + "Failed to search, please try again later": + "Η αναζήτηση απέτυχε, παρακαλούμε δοκιμάστε ξανά αργότερα", + "Connection Error": "Σφάλμα σύνδεσης", + "Please check your internet connection": + "Παρακαλούμε ελέγξτε τη σύνδεσή σας στο διαδίκτυο", + "Sorry 😔": "Συγγνώμη 😔", + "The driver cancelled the trip for an emergency reason.\nDo you want to search for another driver immediately?": + "Ο οδηγός ακύρωσε τη διαδρομή για έκτακτο λόγο.\nΘέλετε να αναζητήσετε άλλον οδηγό αμέσως;", + "Search for another driver": "Αναζήτηση για άλλον οδηγό", + "We apologize 😔": "Ζητάμε συγγνώμη 😔", + "No drivers found at the moment.\nPlease try again later.": + "Δεν βρέθηκαν οδηγοί αυτή τη στιγμή.\nΠαρακαλούμε δοκιμάστε ξανά αργότερα.", + "Hi ,I will go now": "Γεια, ξεκινάω τώρα", + "Passenger come to you": "Ο επιβάτης έρχεται σε εσάς", + "Call Income": "Εισερχόμενη Κλήση", + "Call Income from Passenger": "Κλήση από Επιβάτη", + "Criminal Document Required": "Απαιτείται Ποινικό Μητρώο", + "You should have upload it .": "Πρέπει να το ανεβάσετε.", + "Call End": "Τέλος Κλήσης", + "The order has been accepted by another driver.": + "Το αίτημα έγινε αποδεκτό από άλλον οδηγό.", + "The order Accepted by another Driver": + "Το αίτημα έγινε δεκτό από άλλον Οδηγό", + "We regret to inform you that another driver has accepted this order.": + "Λυπούμαστε, ένας άλλος οδηγός αποδέχτηκε αυτό το αίτημα.", + "Driver Applied the Ride for You": + "Ο οδηγός καταχώρησε τη διαδρομή για εσάς", + "Applied": "Καταχωρήθηκε", + "Please go to Car Driver": "Παρακαλώ πηγαίνετε στον Οδηγό", + "Ok I will go now.": "Εντάξει, πηγαίνω τώρα.", + "Accepted Ride": "Αποδεκτή Διαδρομή", + "Driver Accepted the Ride for You": + "Ο οδηγός αποδέχτηκε τη διαδρομή για εσάς", + "Promo": "Προσφορά", + "Show latest promo": "Εμφάνιση τελευταίων προσφορών", + "Trip Monitoring": "Παρακολούθηση Διαδρομής", + "Driver Is Going To Passenger": "Ο οδηγός πηγαίνει στον Επιβάτη", + "Please stay on the picked point.": + "Παρακαλώ μείνετε στο επιλεγμένο σημείο.", + "message From Driver": "Μήνυμα από τον Οδηγό", + "Trip is Begin": "Η διαδρομή ξεκινά", + "Cancel Trip from driver": "Ακύρωση από τον οδηγό", + "We will look for a new driver.\nPlease wait.": + "Αναζητούμε νέο οδηγό.\nΠαρακαλώ περιμένετε.", + "The driver canceled your ride.": "Ο οδηγός ακύρωσε τη διαδρομή σας.", + "Driver Finish Trip": "Ο Οδηγός Ολοκλήρωσε τη Διαδρομή", + "you will pay to Driver": "Θα πληρώσετε στον Οδηγό", + "Don’t forget your personal belongings.": + "Μην ξεχάσετε τα αντικείμενά σας.", + "Please make sure you have all your personal belongings and that any remaining fare, if applicable, has been added to your wallet before leaving. Thank you for choosing the Intaleq app": + "Βεβαιωθείτε ότι πήρατε τα πράγματά σας και ότι τυχόν ρέστα προστέθηκαν στο πορτοφόλι σας. Ευχαριστούμε που επιλέξατε το Intaleq.", + "Finish Monitor": "Τέλος Παρακολούθησης", + "Trip finished": "Η διαδρομή έληξε", + "Call Income from Driver": "Κλήση από τον Οδηγό", + "Driver Cancelled Your Trip": "Ο Οδηγός Ακύρωσε τη Διαδρομή", + "you will pay to Driver you will be pay the cost of driver time look to your Intaleq Wallet": + "Θα πληρώσετε για τον χρόνο του οδηγού, δείτε το Πορτοφόλι Intaleq", + "Order Applied": "Το αίτημα υποβλήθηκε", + "welcome to intaleq": "Καλώς ήρθατε στο Intaleq", + "login or register subtitle": + "Εισάγετε τον αριθμό κινητού για είσοδο ή εγγραφή", + "Complaint cannot be filed for this ride. It may not have been completed or started.": + "Δεν μπορεί να υποβληθεί καταγγελία για αυτή τη διαδρομή. Ίσως δεν ολοκληρώθηκε ή δεν ξεκίνησε.", + "phone number label": "Αριθμός Τηλεφώνου", + "phone number required": "Απαιτείται αριθμός τηλεφώνου", + "send otp button": "Αποστολή Κωδικού OTP", + "verify your number title": "Επαληθεύστε τον αριθμό σας", + "otp sent subtitle": + "Ένας 5ψήφιος κωδικός στάλθηκε στο\n@phoneNumber", + "verify and continue button": "Επαλήθευση και Συνέχεια", + "enter otp validation": "Εισάγετε τον 5ψήφιο κωδικό OTP", + "one last step title": "Ένα τελευταίο βήμα", + "complete profile subtitle": + "Ολοκληρώστε το προφίλ σας για να ξεκινήσετε", + "first name label": "Όνομα", + "first name required": "Απαιτείται όνομα", + "last name label": "Επώνυμο", + "Verify OTP": "Επαλήθευση OTP", + "Verification Code": "Κωδικός Επαλήθευσης", + "We have sent a verification code to your mobile number:": + "Στείλαμε έναν κωδικό επαλήθευσης στο κινητό σας:", + "Verify": "Επαλήθευση", + "Resend Code": "Επαναποστολή Κωδικού", + "You can resend in": "Επαναποστολή σε", + "seconds": "δευτερόλεπτα", + "Please enter the complete 6-digit code.": + "Παρακαλώ εισάγετε τον πλήρη 6ψήφιο κωδικό.", + "last name required": "Απαιτείται επώνυμο", + "email optional label": "Email (Προαιρετικό)", + "complete registration button": "Ολοκλήρωση Εγγραφής", + "User with this phone number or email already exists.": + "Υπάρχει ήδη χρήστης με αυτό το τηλέφωνο ή email.", + "otp sent success": "Ο κωδικός στάλθηκε στο WhatsApp.", + "failed to send otp": "Αποτυχία αποστολής OTP.", + "server error try again": "Σφάλμα διακομιστή, προσπαθήστε ξανά.", + "an error occurred": "Προέκυψε σφάλμα: @error", + "otp verification failed": "Η επαλήθευση OTP απέτυχε.", + "registration failed": "Η εγγραφή απέτυχε.", + "welcome user": "Καλώς ήρθες, @firstName!", + "Don't forget your personal belongings.": + "Μην ξεχάσετε τα προσωπικά σας αντικείμενα.", + "Share App": "Κοινοποίηση Εφαρμογής", + "Wallet": "Πορτοφόλι", + "Balance": "Υπόλοιπο", + "Profile": "Προφίλ", + "Contact Support": "Επικοινωνία με Υποστήριξη", + "Session expired. Please log in again.": + "Η συνεδρία έληξε. Συνδεθείτε ξανά.", + "Security Warning": "⚠️ Προειδοποίηση Ασφαλείας", + "Potential security risks detected. The application may not function correctly.": + "Εντοπίστηκαν πιθανοί κίνδυνοι ασφαλείας. Η εφαρμογή ενδέχεται να μην λειτουργεί σωστά.", + "please order now": "Κάντε αίτημα τώρα", + "Where to": "Πού πάτε;", + "Where are you going?": "Πού πηγαίνετε;", + "Quick Actions": "Γρήγορες Ενέργειες", + "My Balance": "Το Υπόλοιπό μου", + "Order History": "Ιστορικό Διαδρομών", + "Contact Us": "Επικοινωνία", + "Driver": "Οδηγός", + "Complaint": "Καταγγελία", + "Promos": "Προσφορές", + "Recent Places": "Πρόσφατα Μέρη", + "From": "Από", + "WhatsApp Location Extractor": "Εξαγωγή Τοποθεσίας WhatsApp", + "Location Link": "Σύνδεσμος Τοποθεσίας", + "Paste location link here": "Επικολλήστε τον σύνδεσμο εδώ", + "Go to this location": "Μετάβαση σε αυτή την τοποθεσία", + "Paste WhatsApp location link": "Επικολλήστε σύνδεσμο WhatsApp", + "Select Order Type": "Επιλογή Τύπου Διαδρομής", + "Choose who this order is for": "Για ποιον είναι η διαδρομή;", + "I want to order for myself": "Για εμένα", + "I want to order for someone else": "Για κάποιον άλλον", + "Order for someone else": "Διαδρομή για άλλον", + "Order for myself": "Διαδρομή για εμένα", + "Are you want to go this site": "Θέλετε να πάτε σε αυτό το σημείο;", + "No": "Όχι", + "Intaleq Wallet": "Πορτοφόλι Intaleq", + "Have a promo code?": "Έχετε κωδικό προσφοράς;", + "Your Wallet balance is ": "Το υπόλοιπο του πορτοφολιού είναι ", + "Cash": "Μετρητά", + "Pay directly to the captain": "Πληρωμή απευθείας στον οδηγό", + "Top up Wallet to continue": "Φορτίστε το Πορτοφόλι για συνέχεια", + "Or pay with Cash instead": "Ή πληρώστε με Μετρητά", + "Confirm & Find a Ride": "Επιβεβαίωση & Εύρεση", + "Balance:": "Υπόλοιπο:", + "Alerts": "Ειδοποιήσεις", + "Welcome Back!": "Καλώς ήρθατε ξανά!", + "Current Balance": "Τρέχον Υπόλοιπο", + "Set Wallet Phone Number": "Ορισμός Τηλεφώνου Πορτοφολιού", + "Link a phone number for transfers": + "Σύνδεση τηλεφώνου για μεταφορές", + "Payment History": "Ιστορικό Πληρωμών", + "View your past transactions": "Δείτε τις προηγούμενες συναλλαγές", + "Top up Wallet": "Φόρτιση Πορτοφολιού", + "Add funds using our secure methods": "Προσθήκη χρημάτων με ασφάλεια", + "Increase Fare": "Αύξηση Ναύλου", + "No drivers accepted your request yet": + "Κανένας οδηγός δεν αποδέχτηκε ακόμα", + "Increasing the fare might attract more drivers. Would you like to increase the price?": + "Η αύξηση του ναύλου μπορεί να προσελκύσει περισσότερους οδηγούς. Θέλετε να αυξήσετε την τιμή;", + "Please make sure not to leave any personal belongings in the car.": + "Βεβαιωθείτε ότι δεν αφήσατε προσωπικά αντικείμενα στο αμάξι.", + "Cancel Ride": "Ακύρωση", + "Route Not Found": "Η διαδρομή δεν βρέθηκε", + "We couldn't find a valid route to this destination. Please try selecting a different point.": + "Δεν βρέθηκε έγκυρη διαδρομή. Παρακαλώ επιλέξτε άλλο σημείο.", + "You can call or record audio during this trip.": + "Μπορείτε να καλέσετε ή να ηχογραφήσετε κατά τη διαδρομή.", + "Warning: Speeding detected!": + "Προειδοποίηση: Εντοπίστηκε υπερβολική ταχύτητα!", + "Comfort": "Comfort", + "Intaleq Balance": "Υπόλοιπο Intaleq", + "Electric": "Ηλεκτρικό", + "Lady": "Lady (Γυναίκες)", + "Van": "Van", + "Rayeh Gai": "Μετ' επιστροφής", + "Join Intaleq as a driver using my referral code!": + "Γίνε οδηγός στο Intaleq με τον κωδικό μου!", + "Use code:": "Χρήση κωδικού:", + "Download the Intaleq Driver app now and earn rewards!": + "Κατεβάστε την εφαρμογή Οδηγού Intaleq και κερδίστε!", + "Get a discount on your first Intaleq ride!": + "Έκπτωση στην πρώτη διαδρομή Intaleq!", + "Use my referral code:": "Χρησιμοποιήστε τον κωδικό μου:", + "Download the Intaleq app now and enjoy your ride!": + "Κατεβάστε το Intaleq και απολαύστε τη διαδρομή!", + "Contacts Loaded": "Οι επαφές φορτώθηκαν", + "Showing": "Εμφάνιση", + "of": "από", + "Customer not found": "Ο πελάτης δεν βρέθηκε", + "Wallet is blocked": "Το πορτοφόλι έχει αποκλειστεί", + "Customer phone is not active": "Το τηλέφωνο δεν είναι ενεργό", + "Balance not enough": "Ανεπαρκές υπόλοιπο", + "Balance limit exceeded": "Υπέρβαση ορίου υπολοίπου", + "Incorrect sms code": "⚠️ Λάθος κωδικός SMS. Προσπαθήστε ξανά.", + "contacts. Others were hidden because they don't have a phone number.": + "επαφές. Οι άλλες αποκρύφθηκαν γιατί δεν έχουν αριθμό.", + "No contacts found": "Δεν βρέθηκαν επαφές", + "No contacts with phone numbers were found on your device.": + "Δεν βρέθηκαν επαφές με αριθμούς στη συσκευή.", + "Permission denied": "Άρνηση πρόσβασης", + "Contact permission is required to pick contacts": + "Απαιτείται άδεια επαφών.", + "An error occurred while picking contacts:": + "Σφάλμα κατά την επιλογή επαφών:", + "Please enter a correct phone": "Εισάγετε σωστό τηλέφωνο", + "Success": "Επιτυχία", + "Invite sent successfully": "Η πρόσκληση στάλθηκε", + "Hello! I'm inviting you to try Intaleq.": + "Γεια! Σε προσκαλώ να δοκιμάσεις το Intaleq.", + "Use my invitation code to get a special gift on your first ride!": + "Χρησιμοποίησε τον κωδικό μου για δώρο στην πρώτη διαδρομή!", + "Your personal invitation code is:": "Ο κωδικός πρόσκλησής σου:", + "Be sure to use it quickly! This code expires at": + "Χρησιμοποίησέ το γρήγορα! Λήγει στις", + "Download the app now:": "Κατέβασε την εφαρμογή:", + "See you on the road!": "Τα λέμε στον δρόμο!", + "This phone number has already been invited.": + "Αυτός ο αριθμός έχει ήδη προσκληθεί.", + "An unexpected error occurred. Please try again.": + "Προέκυψε απροσδόκητο σφάλμα. Προσπαθήστε ξανά.", + "You deserve the gift": "Αξίζετε το δώρο", + "Claim your 20 LE gift for inviting": + "Διεκδικήστε το δώρο 20 € για την πρόσκληση", + "You have got a gift for invitation": "Έχετε ένα δώρο πρόσκλησης", + "You have earned 20": "Κερδίσατε 20", + "LE": "€", + "Vibration feedback for all buttons": "Δόνηση για όλα τα κουμπιά", + "Share with friends and earn rewards": + "Μοιραστείτε με φίλους και κερδίστε", + "Gift Already Claimed": "Το δώρο έχει ήδη ληφθεί", + "You have already received your gift for inviting": + "Έχετε ήδη λάβει το δώρο σας", + "Keep it up!": "Συνεχίστε έτσι!", + "has completed": "ολοκλήρωσε", + "trips": "διαδρομές", + "Personal Information": "Προσωπικά Στοιχεία", + "Name": "Όνομα", + "Not set": "Δεν ορίστηκε", + "Gender": "Φύλο", + "Education": "Εκπαίδευση", + "Work & Contact": "Εργασία & Επικοινωνία", + "Employment Type": "Τύπος Απασχόλησης", + "Marital Status": "Οικογενειακή Κατάσταση", + "SOS Phone": "Τηλέφωνο SOS", + "Sign Out": "Αποσύνδεση", + "Delete My Account": "Διαγραφή Λογαριασμού", + "Update Gender": "Ενημέρωση Φύλου", + "Update": "Ενημέρωση", + "Update Education": "Ενημέρωση Εκπαίδευσης", + "Are you sure? This action cannot be undone.": + "Είστε σίγουροι; Αυτή η ενέργεια δεν αναιρείται.", + "Confirm your Email": "Επιβεβαίωση Email", + "Type your Email": "Πληκτρολογήστε το Email", + "Delete Permanently": "Οριστική Διαγραφή", + "Male": "Άνδρας", + "Female": "Γυναίκα", + "High School Diploma": "Απολυτήριο Λυκείου", + "Associate Degree": "Πτυχίο ΙΕΚ/Κολεγίου", + "Bachelor's Degree": "Πτυχίο ΑΕΙ", + "Master's Degree": "Μεταπτυχιακό", + "Doctoral Degree": "Διδακτορικό", + "Select your preferred language for the app interface.": + "Επιλέξτε γλώσσα εφαρμογής.", + "Language Options": "Επιλογές Γλώσσας", + "You can claim your gift once they complete 2 trips.": + "Μπορείτε να πάρετε το δώρο αφού ολοκληρώσουν 2 διαδρομές.", + "Closest & Cheapest": "Κοντινότερο & Φθηνότερο", + "Comfort choice": "Επιλογή Comfort", + "Travel in a modern, silent electric car. A premium, eco-friendly choice for a smooth ride.": + "Ταξιδέψτε με σύγχρονο, αθόρυβο ηλεκτρικό αυτοκίνητο. Premium και οικολογική επιλογή.", + "Spacious van service ideal for families and groups. Comfortable, safe, and cost-effective travel together.": + "Ευρύχωρο βαν, ιδανικό για οικογένειες. Άνετο, ασφαλές και οικονομικό.", + "Quiet & Eco-Friendly": "Ήσυχο & Οικολογικό", + "Lady Captain for girls": "Γυναίκα Οδηγός για γυναίκες", + "Van for familly": "Βαν για οικογένεια", + "Are you sure to delete this location?": + "Σίγουρα θέλετε να διαγράψετε την τοποθεσία;", + "Submit a Complaint": "Υποβολή Καταγγελίας", + "Submit Complaint": "Υποβολή", + "No trip history found": "Δεν βρέθηκε ιστορικό", + "Your past trips will appear here.": + "Οι προηγούμενες διαδρομές θα εμφανιστούν εδώ.", + "1. Describe Your Issue": "1. Περιγράψτε το θέμα", + "Enter your complaint here...": "Γράψτε την καταγγελία εδώ...", + "2. Attach Recorded Audio": "2. Επισύναψη Ήχου", + "No audio files found.": "Δεν βρέθηκαν αρχεία ήχου.", + "Confirm Attachment": "Επιβεβαίωση Επισύναψης", + "Attach this audio file?": "Επισύναψη αυτού του αρχείου;", + "Uploaded": "Μεταφορτώθηκε", + "3. Review Details & Response": "3. Έλεγχος Λεπτομερειών", + "Date": "Ημερομηνία", + "Today's Promos": "Σημερινές Προσφορές", + "No promos available right now.": "Δεν υπάρχουν προσφορές τώρα.", + "Check back later for new offers!": "Ελέγξτε ξανά αργότερα!", + "Valid Until:": "Ισχύει έως:", + "CODE": "ΚΩΔΙΚΟΣ", + "I Agree": "Συμφωνώ", + "Continue": "Συνέχεια", + "Enable Location": "Ενεργοποίηση Τοποθεσίας", + "To give you the best experience, we need to know where you are. Your location is used to find nearby captains and for pickups.": + "Για την καλύτερη εμπειρία, χρειαζόμαστε την τοποθεσία σας για να βρούμε κοντινούς οδηγούς.", + "Allow Location Access": "Να επιτρέπεται η πρόσβαση", + "Welcome to Intaleq!": "Καλώς ήρθατε στο Intaleq!", + "Before we start, please review our terms.": + "Πριν ξεκινήσουμε, δείτε τους όρους μας.", + "Your journey starts here": "Το ταξίδι ξεκινά εδώ", + "Cancel Search": "Ακύρωση Αναζήτησης", + "Set pickup location": "Ορισμός παραλαβής", + "Move the map to adjust the pin": "Μετακινήστε τον χάρτη", + "Searching for the nearest captain...": + "Αναζήτηση κοντινότερου οδηγού...", + "No one accepted? Try increasing the fare.": + "Κανείς δεν δέχτηκε; Αυξήστε την προσφορά.", + "Increase Your Trip Fee (Optional)": "Αύξηση Ναύλου (Προαιρετικό)", + "We haven't found any drivers yet. Consider increasing your trip fee to make your offer more attractive to drivers.": + "Δεν βρέθηκαν οδηγοί. Σκεφτείτε να αυξήσετε την τιμή για να γίνει πιο ελκυστική η προσφορά.", + "No, thanks": "Όχι, ευχαριστώ", + "Increase Fee": "Αύξηση Τιμής", + "Copy": "Αντιγραφή", + "Promo Copied!": "Αντιγράφηκε!", + "Code": "Κωδικός", + "Send Intaleq app to him": "Αποστολή εφαρμογής", + "No passenger found for the given phone number": + "Δεν βρέθηκε επιβάτης", + "No user found for the given phone number": "Δεν βρέθηκε χρήστης", + "This price is": "Η τιμή είναι", + "Work": "Εργασία", + "Add Home": "Προσθήκη Σπιτιού", + "Notifications": "Ειδοποιήσεις", + "💳 Pay with Credit Card": "💳 Πληρωμή με Κάρτα", + "⚠️ You need to choose an amount!": "⚠️ Επιλέξτε ποσό!", + "💰 Pay with Wallet": "💰 Πληρωμή με Πορτοφόλι", + "You must restart the app to change the language.": + "Επανεκκίνηση για αλλαγή γλώσσας.", + "joined": "μπήκε", + "Driver joined the channel": "Ο οδηγός μπήκε στο κανάλι", + "Driver left the channel": "Ο οδηγός βγήκε από το κανάλι", + "Call Page": "Σελίδα Κλήσης", + "Call Left": "Κλήσεις που απομένουν", + " Next as Cash !": " Επόμενο με Μετρητά!", + "To use Wallet charge it": "Φορτίστε το πορτοφόλι", + "We are searching for the nearest driver to you": + "Ψάχνουμε τον κοντινότερο οδηγό", + "Best choice for cities": "Καλύτερη επιλογή για πόλη", + "Rayeh Gai: Round trip service for convenient travel between cities, easy and reliable.": + "Μετ' επιστροφής: Άνετο ταξίδι μεταξύ πόλεων.", + "This trip is for women only": "Μόνο για γυναίκες", + "Total budgets on month": "Σύνολο μήνα", + "You have call from driver": "Κλήση από οδηγό", + "Intaleq": "Intaleq", + "passenger agreement": "συμφωνία επιβάτη", + "To become a passenger, you must review and agree to the ": + "Πρέπει να συμφωνήσετε με τους ", + "agreement subtitle": "Αποδοχή Όρων Χρήσης και Πολιτικής Απορρήτου.", + "terms of use": "όρους χρήσης", + " and acknowledge our Privacy Policy.": + " και την Πολιτική Απορρήτου.", + "and acknowledge our": "και την", + "privacy policy": "πολιτική απορρήτου.", + "i agree": "συμφωνώ", + "Driver already has 2 trips within the specified period.": + "Ο οδηγός έχει ήδη 2 διαδρομές.", + "The invitation was sent successfully": "Η πρόσκληση στάλθηκε", + "You should select your country": "Επιλέξτε χώρα", + "Scooter": "Σκούτερ", + "A trip with a prior reservation, allowing you to choose the best captains and cars.": + "Διαδρομή με κράτηση, επιλογή οδηγών και οχημάτων.", + "Mishwar Vip": "VIP Διαδρομή", + "The driver waiting you in picked location .": + "Ο οδηγός περιμένει στο σημείο.", + "About Us": "Σχετικά", + "You can change the vibration feedback for all buttons": + "Αλλαγή δόνησης κουμπιών", + "Most Secure Methods": "Ασφαλείς Μέθοδοι", + "In-App VOIP Calls": "Κλήσεις VOIP", + "Recorded Trips for Safety": "Καταγεγραμμένες Διαδρομές", + "\nWe also prioritize affordability, offering competitive pricing to make your rides accessible.": + "\nΠροσιτές τιμές για όλους.", + "Intaleq is a ride-sharing app designed with your safety and affordability in mind. We connect you with reliable drivers in your area, ensuring a convenient and stress-free travel experience.\n\nHere are some of the key features that set us apart:": + "Το Intaleq είναι εφαρμογή μετακίνησης με έμφαση στην ασφάλεια.", + "Sign In by Apple": "Είσοδος με Apple", + "Sign In by Google": "Είσοδος με Google", + "How do I request a ride?": "Πώς ζητάω διαδρομή;", + "Step-by-step instructions on how to request a ride through the Intaleq app.": + "Οδηγίες για αίτημα διαδρομής.", + "What types of vehicles are available?": "Τι οχήματα υπάρχουν;", + "Intaleq offers a variety of vehicle options to suit your needs, including economy, comfort, and luxury. Choose the option that best fits your budget and passenger count.": + "Economy, Comfort, Luxury.", + "How can I pay for my ride?": "Πώς πληρώνω;", + "Intaleq offers multiple payment methods for your convenience. Choose between cash payment or credit/debit card payment during ride confirmation.": + "Μετρητά ή Κάρτα.", + "Can I cancel my ride?": "Μπορώ να ακυρώσω;", + "Yes, you can cancel your ride under certain conditions (e.g., before driver is assigned). See the Intaleq cancellation policy for details.": + "Ναι, μπορείτε να ακυρώσετε τη διαδρομή σας υπό ορισμένες προϋποθέσεις (π.χ. πριν την ανάθεση οδηγού). Δείτε την πολιτική ακύρωσης του Intaleq για λεπτομέρειες.", + "Driver Registration & Requirements": "Εγγραφή Οδηγού", + "How can I register as a driver?": "Πώς γίνομαι οδηγός;", + "What are the requirements to become a driver?": "Απαιτήσεις οδηγού;", + "Visit our website or contact Intaleq support for information on driver registration and requirements.": + "Επισκεφτείτε την ιστοσελίδα ή επικοινωνήστε.", + "Intaleq provides in-app chat functionality to allow you to communicate with your driver or passenger during your ride.": + "Chat εντός εφαρμογής.", + "Intaleq prioritizes your safety. We offer features like driver verification, in-app trip tracking, and emergency contact options.": + "Επαλήθευση οδηγού, παρακολούθηση, SOS.", + "Frequently Questions": "Συχνές Ερωτήσεις", + "User does not exist.": "Ο χρήστης δεν υπάρχει.", + "We need your phone number to contact you and to help you.": + "Χρειαζόμαστε το τηλέφωνο για επικοινωνία.", + "You will recieve code in sms message": "Θα λάβετε SMS με κωδικό", + "Please enter": "Εισάγετε", + "We need your phone number to contact you and to help you receive orders.": + "Χρειαζόμαστε το τηλέφωνο για λήψη παραγγελιών.", + "The full name on your criminal record does not match the one on your driver's license. Please verify and provide the correct documents.": + "Το όνομα στο Ποινικό Μητρώο δεν ταιριάζει με το δίπλωμα.", + "The national number on your driver's license does not match the one on your ID document. Please verify and provide the correct documents.": + "Ο αριθμός ταυτότητας δεν ταιριάζει.", + "Capture an Image of Your Criminal Record": + "Φωτογραφία Ποινικού Μητρώου", + "IssueDate": "Ημ. Έκδοσης", + "Capture an Image of Your car license front": + "Φωτογραφία Άδειας Κυκλοφορίας (Μπροστά)", + "Capture an Image of Your ID Document front": + "Φωτογραφία Ταυτότητας (Μπροστά)", + "NationalID": "Αριθμός Ταυτότητας", + "You can share the Intaleq App with your friends and earn rewards for rides they take using your code": + "Μοιραστείτε και κερδίστε.", + "FullName": "Ονοματεπώνυμο", + "No invitation found yet!": "Καμία πρόσκληση!", + "InspectionResult": "Αποτέλεσμα Ελέγχου", + "Criminal Record": "Ποινικό Μητρώο", + "The email or phone number is already registered.": + "Το email ή τηλέφωνο χρησιμοποιείται.", + "To become a ride-sharing driver on the Intaleq app, you need to upload your driver's license, ID document, and car registration document. Our AI system will instantly review and verify their authenticity in just 2-3 minutes. If your documents are approved, you can start working as a driver on the Intaleq app. Please note, submitting fraudulent documents is a serious offense and may result in immediate termination and legal consequences.": + "Ανεβάστε δίπλωμα, ταυτότητα, άδεια κυκλοφορίας. Έλεγχος σε 2-3 λεπτά.", + "Documents check": "Έλεγχος Εγγράφων", + "Driver's License": "Δίπλωμα Οδήγησης", + "for your first registration!": "για την πρώτη εγγραφή!", + "Get it Now!": "Πάρτε το!", + "before": "πριν", + "Code not approved": "Κωδικός μη αποδεκτός", + "3000 LE": "30 €", + "Do you have an invitation code from another driver?": + "Έχετε κωδικό πρόσκλησης;", + "Paste the code here": "Επικόλληση κωδικού", + "No, I don't have a code": "Όχι", + "Audio uploaded successfully.": "Επιτυχής μεταφόρτωση.", + "Perfect for passengers seeking the latest car models with the freedom to choose any route they desire": + "Ιδανικό για νέα μοντέλα και ελευθερία διαδρομής", + "Share this code with your friends and earn rewards when they use it!": + "Μοιραστείτε και κερδίστε!", + "Enter phone": "Εισαγωγή τηλεφώνου", + "complete, you can claim your gift": "ολοκληρώθηκε, λάβετε το δώρο", + "When": "Όταν", + "Enter driver's phone": "Τηλέφωνο οδηγού", + "Send Invite": "Αποστολή Πρόσκλησης", + "Show Invitations": "Προβολή Προσκλήσεων", + "License Type": "Τύπος Διπλώματος", + "National Number": "Αριθμός Ταυτότητας", + "Name (Arabic)": "Όνομα (Αραβικά)", + "Name (English)": "Όνομα (Αγγλικά)", + "Address": "Διεύθυνση", + "Issue Date": "Ημ. Έκδοσης", + "Expiry Date": "Ημ. Λήξης", + "License Categories": "Κατηγορίες", + "driver_license": "δίπλωμα_οδήγησης", + "Capture an Image of Your Driver License": "Φωτογραφία Διπλώματος", + "ID Documents Back": "Ταυτότητα (Πίσω)", + "National ID": "Ταυτότητα", + "Occupation": "Επάγγελμα", + "Religion": "Θρήσκευμα", + "Full Name (Marital)": "Ονοματεπώνυμο", + "Expiration Date": "Ημερομηνία Λήξης", + "Capture an Image of Your ID Document Back": + "Φωτογραφία Ταυτότητας (Πίσω)", + "ID Documents Front": "Ταυτότητα (Μπροστά)", + "First Name": "Όνομα", + "CardID": "Αρ. Κάρτας", + "Vehicle Details Front": "Στοιχεία Οχήματος (Μπροστά)", + "Plate Number": "Αριθμός Πινακίδας", + "Owner Name": "Ιδιοκτήτης", + "Vehicle Details Back": "Στοιχεία Οχήματος (Πίσω)", + "Make": "Μάρκα", + "Model": "Μοντέλο", + "Year": "Έτος", + "Chassis": "Αριθμός Πλαισίου", + "Color": "Χρώμα", + "Displacement": "Κυβισμός", + "Fuel": "Καύσιμο", + "Tax Expiry Date": "Λήξη Τελών", + "Inspection Date": "Ημ. ΚΤΕΟ", + "Capture an Image of Your car license back": + "Φωτογραφία Άδειας (Πίσω)", + "Capture an Image of Your Driver's License": "Φωτογραφία Διπλώματος", + "Sign in with Google for easier email and name entry": + "Είσοδος με Google", + "You will choose allow all the time to be ready receive orders": + "Επιλέξτε 'Πάντα' για λήψη παραγγελιών", + "Get to your destination quickly and easily.": + "Φτάστε γρήγορα στον προορισμό.", + "Enjoy a safe and comfortable ride.": "Απολαύστε ασφαλή διαδρομή.", + "Choose Language": "Επιλογή Γλώσσας", + "Pay with Wallet": "Πληρωμή με Πορτοφόλι", + "Invalid MPIN": "Άκυρο MPIN", + "Invalid OTP": "Άκυρο OTP", + "Enter your email address": "Εισάγετε email", + "Please enter Your Email.": "Παρακαλώ εισάγετε Email.", + "Enter your phone number": "Εισάγετε τηλέφωνο", + "Please enter your phone number.": "Παρακαλώ εισάγετε τηλέφωνο.", + "Please enter Your Password.": "Εισάγετε Κωδικό.", + "if you dont have account": "αν δεν έχετε λογαριασμό", + "Register": "Εγγραφή", + "Accept Ride's Terms & Review Privacy Notice": "Αποδοχή Όρων", + "By selecting 'I Agree' below, I have reviewed and agree to the Terms of Use and acknowledge the Privacy Notice. I am at least 18 years of age.": + "Επιλέγοντας 'Συμφωνώ', αποδέχομαι τους Όρους. Είμαι άνω των 18.", + "First name": "Όνομα", + "Enter your first name": "Εισάγετε όνομα", + "Please enter your first name.": "Παρακαλώ εισάγετε όνομα.", + "Last name": "Επώνυμο", + "Enter your last name": "Εισάγετε επώνυμο", + "Please enter your last name.": "Παρακαλώ εισάγετε επώνυμο.", + "City": "Πόλη", + "Please enter your City.": "Εισάγετε Πόλη.", + "Verify Email": "Επαλήθευση Email", + "We sent 5 digit to your Email provided": "Στείλαμε 5ψήφιο κωδικό", + "5 digit": "5 ψηφία", + "Send Verification Code": "Αποστολή Κωδικού", + "Your Ride Duration is ": "Διάρκεια: ", + "You will be thier in": "Θα είστε εκεί σε", + "You trip distance is": "Απόσταση: ", + "Fee is": "Κόστος: ", + "From : ": "Από: ", + "To : ": "Προς: ", + "Add Promo": "Προσθήκη Προσφοράς", + "Confirm Selection": "Επιβεβαίωση", + "distance is": "απόσταση είναι", + "Privacy Policy": "Πολιτική Απορρήτου", + "Intaleq LLC": "Intaleq LLC", + "Syria's pioneering ride-sharing service, proudly developed by Arabian and local owners. We prioritize being near you – both our valued passengers and our dedicated captains.": + "Πρωτοποριακή υπηρεσία στην Ελλάδα.", + "Intaleq is the first ride-sharing app in Syria, designed to connect you with the nearest drivers for a quick and convenient travel experience.": + "Το Intaleq συνδέει με τους κοντινότερους οδηγούς.", + "Why Choose Intaleq?": "Γιατί Intaleq;", + "Closest to You": "Δίπλα σας", + "We connect you with the nearest drivers for faster pickups and quicker journeys.": + "Γρηγορότερη εξυπηρέτηση.", + "Uncompromising Security": "Ασφάλεια", + "Lady Captains Available": "Γυναίκες Οδηγοί", + "Recorded Trips (Voice & AI Analysis)": "Καταγεγραμμένες Διαδρομές", + "Fastest Complaint Response": "Άμεση Ανταπόκριση", + "Our dedicated customer service team ensures swift resolution of any issues.": + "Επίλυση θεμάτων άμεσα.", + "Affordable for Everyone": "Οικονομικό", + "Frequently Asked Questions": "Συχνές Ερωτήσεις", + "Getting Started": "Ξεκινώντας", + "Simply open the Intaleq app, enter your destination, and tap \"Request Ride\". The app will connect you with a nearby driver.": + "Ανοίξτε την εφαρμογή, εισάγετε προορισμό, πατήστε Αίτημα.", + "Vehicle Options": "Επιλογές Οχήματος", + "Intaleq offers a variety of options including Economy, Comfort, and Luxury to suit your needs and budget.": + "Economy, Comfort, Luxury.", + "Payments": "Πληρωμές", + "You can pay for your ride using cash or credit/debit card. You can select your preferred payment method before confirming your ride.": + "Μετρητά ή Κάρτα.", + "Ride Management": "Διαχείριση", + "Yes, you can cancel your ride, but please note that cancellation fees may apply depending on how far in advance you cancel.": + "Ναι, μπορείτε να ακυρώσετε (ενδέχεται να υπάρξει χρέωση).", + "For Drivers": "Για Οδηγούς", + "Driver Registration": "Εγγραφή", + "To register as a driver or learn about the requirements, please visit our website or contact Intaleq support directly.": + "Επικοινωνήστε για εγγραφή.", + "Visit Website/Contact Support": "Ιστοσελίδα/Υποστήριξη", + "Close": "Κλείσιμο", + "We are searching for the nearest driver": "Αναζήτηση οδηγού", + "Communication": "Επικοινωνία", + "How do I communicate with the other party (passenger/driver)?": + "Πώς επικοινωνώ;", + "You can communicate with your driver or passenger through the in-app chat feature once a ride is confirmed.": + "Μέσω chat.", + "Safety & Security": "Ασφάλεια", + "What safety measures does Intaleq offer?": "Μέτρα ασφαλείας;", + "Intaleq offers various safety features including driver verification, in-app trip tracking, emergency contact options, and the ability to share your trip status with trusted contacts.": + "Επαλήθευση, παρακολούθηση, επαφές έκτακτης ανάγκης.", + "Enjoy competitive prices across all trip options, making travel accessible.": + "Ανταγωνιστικές τιμές.", + "Variety of Trip Choices": "Ποικιλία", + "Choose the trip option that perfectly suits your needs and preferences.": + "Επιλέξτε ό,τι σας ταιριάζει.", + "Your Choice, Our Priority": "Προτεραιότητά μας", + "Because we are near, you have the flexibility to choose the ride that works best for you.": + "Ευελιξία επιλογής.", + "duration is": "διάρκεια είναι", + "Setting": "Ρύθμιση", + "Find answers to common questions": "Απαντήσεις", + "I don't need a ride anymore": "Δεν χρειάζομαι διαδρομή", + "I was just trying the application": "Δοκίμαζα την εφαρμογή", + "No driver accepted my request": "Κανείς δεν αποδέχτηκε", + "I added the wrong pick-up/drop-off location": "Λάθος τοποθεσία", + "I don't have a reason": "Κανένας λόγος", + "Can we know why you want to cancel Ride ?": "Γιατί ακυρώνετε;", + "Add Payment Method": "Προσθήκη Τρόπου Πληρωμής", + "Ride Wallet": "Πορτοφόλι", + "Payment Method": "Τρόπος Πληρωμής", + "Type here Place": "Πληκτρολογήστε μέρος", + "Are You sure to ride to": "Σίγουρα προς", + "Confirm": "Επιβεβαίωση", + "You are Delete": "Διαγραφή", + "Deleted": "Διαγράφηκε", + "You Dont Have Any places yet !": "Κανένα μέρος ακόμα!", + "From : Current Location": "Από: Τρέχουσα Τοποθεσία", + "My Cared": "Οι Κάρτες Μου", + "Add Card": "Προσθήκη Κάρτας", + "Add Credit Card": "Προσθήκη Πιστωτικής", + "Please enter the cardholder name": "Όνομα κατόχου", + "Please enter the expiry date": "Ημερομηνία λήξης", + "Please enter the CVV code": "Κωδικός CVV", + "Go To Favorite Places": "Μετάβαση στα Αγαπημένα", + "Go to this Target": "Μετάβαση στον Προορισμό", + "My Profile": "Το Προφίλ μου", + "Are you want to go to this site": "Θέλετε να πάτε εδώ;", + "MyLocation": "Η Τοποθεσία Μου", + "my location": "τοποθεσία μου", + "Target": "Στόχος", + "You Should choose rate figure": "Επιλέξτε βαθμολογία", + "Login Captin": "Είσοδος Οδηγού", + "Register Captin": "Εγγραφή Οδηγού", + "Send Verfication Code": "Αποστολή Κωδικού", + "KM": "Χλμ", + "End Ride": "Τέλος Διαδρομής", + "Minute": "Λεπτό", + "Go to passenger Location now": "Πηγαίνετε στον Επιβάτη", + "Duration of the Ride is ": "Διάρκεια: ", + "Distance of the Ride is ": "Απόσταση: ", + "Name of the Passenger is ": "Όνομα Επιβάτη: ", + "Hello this is Captain": "Γεια σας, ο Οδηγός", + "Start the Ride": "Έναρξη", + "Please Wait If passenger want To Cancel!": + "Περιμένετε μήπως ακυρώσει ο επιβάτης!", + "Total Duration:": "Συνολική Διάρκεια:", + "Active Duration:": "Ενεργή Διάρκεια:", + "Waiting for Captin ...": "Αναμονή Οδηγού...", + "Age is ": "Ηλικία: ", + "Rating is ": "Βαθμολογία: ", + " to arrive you.": " για να φτάσει.", + "Tariff": "Τιμοκατάλογος", + "Settings": "Ρυθμίσεις", + "Feed Back": "Σχόλια", + "Please enter a valid 16-digit card number": + "Εισάγετε έγκυρο αριθμό κάρτας", + "Add Phone": "Προσθήκη Τηλεφώνου", + "Please enter a phone number": "Εισάγετε τηλέφωνο", + "You dont Add Emergency Phone Yet!": + "Δεν προσθέσατε τηλέφωνο έκτακτης ανάγκης!", + "You will arrive to your destination after ": "Άφιξη σε ", + "You can cancel Ride now": "Μπορείτε να ακυρώσετε", + "You Can cancel Ride After Captain did not come in the time": + "Ακύρωση αν ο οδηγός αργήσει", + "If you in Car Now. Press Start The Ride": + "Αν είστε στο όχημα, πατήστε Έναρξη", + "You Dont Have Any amount in": "Δεν έχετε υπόλοιπο στο", + "Wallet!": "Πορτοφόλι!", + "You Have": "Έχετε", + "Save Credit Card": "Αποθήκευση Κάρτας", + "Show Promos": "Εμφάνιση Προσφορών", + "10 and get 4% discount": "10 και κερδίστε 4% έκπτωση", + "20 and get 6% discount": "20 και κερδίστε 6% έκπτωση", + "40 and get 8% discount": "40 και κερδίστε 8% έκπτωση", + "100 and get 11% discount": "100 και κερδίστε 11% έκπτωση", + "Pay with Your PayPal": "Πληρωμή με PayPal", + "You will choose one of above !": "Επιλέξτε ένα!", + "Edit Profile": "Επεξεργασία", + "Copy this Promo to use it in your Ride!": "Αντιγράψτε τον κωδικό!", + "To change some Settings": "Αλλαγή Ρυθμίσεων", + "Order Request Page": "Σελίδα Αιτήματος", + "Rouats of Trip": "Διαδρομές", + "Passenger Name is ": "Όνομα Επιβάτη: ", + "Total From Passenger is ": "Σύνολο από Επιβάτη: ", + "Duration To Passenger is ": "Διάρκεια προς Επιβάτη: ", + "Distance To Passenger is ": "Απόσταση προς Επιβάτη: ", + "Total For You is ": "Σύνολο για Εσάς: ", + "Distance is ": "Απόσταση: ", + " KM": " Χλμ", + "Duration of Trip is ": "Διάρκεια: ", + " Minutes": " Λεπτά", + "Apply Order": "Αποδοχή", + "Refuse Order": "Απόρριψη", + "Rate Captain": "Βαθμολογία Οδηγού", + "Enter your Note": "Σχόλιο", + "Type something...": "Γράψτε κάτι...", + "Submit rating": "Υποβολή", + "Rate Passenger": "Βαθμολογία Επιβάτη", + "Ride Summary": "Σύνοψη", + "welcome_message": "Καλώς ήρθατε στο Intaleq!", + "app_description": "Ασφαλής μετακίνηση.", + "get_to_destination": "Φτάστε στον προορισμό.", + "get_a_ride": "Βρείτε διαδρομή.", + "safe_and_comfortable": "Ασφάλεια και άνεση.", + "committed_to_safety": "Δέσμευση στην ασφάλεια.", + "your ride is Accepted": "Η διαδρομή έγινε δεκτή", + "Driver is waiting at pickup.": "Ο οδηγός περιμένει.", + "Driver is on the way": "Ο οδηγός έρχεται", + "Contact Options": "Επικοινωνία", + "Send a custom message": "Προσαρμοσμένο μήνυμα", + "Type your message": "Γράψτε μήνυμα", + "I will go now": "Πηγαίνω τώρα", + "You Have Tips": "Έχετε φιλοδώρημα", + " tips\nTotal is": " φιλοδώρημα\nΣύνολο", + "Your fee is ": "Η χρέωση είναι ", + "Do you want to pay Tips for this Driver": + "Θέλετε να δώσετε φιλοδώρημα;", + "Tip is ": "Φιλοδώρημα: ", + "Are you want to wait drivers to accept your order": + "Θέλετε να περιμένετε;", + "This price is fixed even if the route changes for the driver.": + "Σταθερή τιμή.", + "The price may increase if the route changes.": + "Η τιμή μπορεί να αυξηθεί.", + "The captain is responsible for the route.": + "Ο οδηγός είναι υπεύθυνος για τη διαδρομή.", + "We are search for nearst driver": "Αναζήτηση οδηγού", + "Your order is being prepared": "Προετοιμασία", + "The drivers are reviewing your request": "Εξέταση αιτήματος", + "Your order sent to drivers": "Απεστάλη στους οδηγούς", + "You can call or record audio of this trip": + "Μπορείτε να καλέσετε ή να ηχογραφήσετε", + "The trip has started! Feel free to contact emergency numbers, share your trip, or activate voice recording for the journey": + "Η διαδρομή ξεκίνησε! Μοιραστείτε την ή ηχογραφήστε.", + "Camera Access Denied.": "Άρνηση Πρόσβασης Κάμερας.", + "Open Settings": "Ρυθμίσεις", + "GPS Required Allow !.": "Απαιτείται GPS!", + "Your Account is Deleted": "Ο Λογαριασμός Διαγράφηκε", + "Are you sure to delete your account?": "Σίγουρα διαγραφή;", + "Your data will be erased after 2 weeks\nAnd you will can't return to use app after 1 month ": + "Τα δεδομένα θα διαγραφούν σε 2 εβδομάδες.", + "Enter Your First Name": "Εισάγετε Όνομα", + "Are you Sure to LogOut?": "Σίγουρα Αποσύνδεση;", + "Email Wrong": "Λάθος Email", + "Email you inserted is Wrong.": "Το email είναι λάθος.", + "You have finished all times ": "Τέλος προσπαθειών", + "if you want help you can email us here": + "Στείλτε μας email για βοήθεια", + "Thanks": "Ευχαριστώ", + "Email Us": "Στείλτε Email", + "I cant register in your app in face detection ": + "Πρόβλημα με ανίχνευση προσώπου", + "Hi": "Γεια", + "No face detected": "Δεν ανιχνεύτηκε πρόσωπο", + "Image detecting result is ": "Αποτέλεσμα: ", + "from 3 times Take Attention": "από 3 φορές, Προσοχή", + "Be sure for take accurate images please\nYou have": + "Βγάλτε καθαρές φωτογραφίες\nΈχετε", + "image verified": "επαληθεύτηκε", + "Next": "Επόμενο", + "There is no help Question here": "Δεν υπάρχει ερώτηση βοήθειας", + "You dont have Points": "Δεν έχετε Πόντους", + "You Are Stopped For this Day !": "Αποκλεισμός για σήμερα!", + "You must be charge your Account": "Φορτίστε τον λογαριασμό", + "You Refused 3 Rides this Day that is the reason \nSee you Tomorrow!": + "Απορρίψατε 3 διαδρομές.\nΤα λέμε αύριο!", + "Recharge my Account": "Φόρτιση", + "Ok , See you Tomorrow": "ΟΚ, τα λέμε αύριο", + "You are Stopped": "Αποκλεισμός", + "Connected": "Συνδέθηκε", + "Not Connected": "Δεν συνδέθηκε", + "Your are far from passenger location": + "Είστε μακριά από τον επιβάτη", + "go to your passenger location before\nPassenger cancel trip": + "Πηγαίνετε στον επιβάτη πριν ακυρώσει", + "You will get cost of your work for this trip": + "Θα πληρωθείτε για τη διαδρομή", + " in your wallet": " στο πορτοφόλι", + "you gain": "κερδίσατε", + "Order Cancelled by Passenger": "Ακύρωση από Επιβάτη", + "Feedback data saved successfully": "Αποθηκεύτηκε", + "No Promo for today .": "Καμία Προσφορά σήμερα.", + "Select your destination": "Επιλογή προορισμού", + "Search for your Start point": "Σημείο εκκίνησης", + "Search for waypoint": "Στάση", + "Current Location": "Τρέχουσα Τοποθεσία", + "Add Location 1": "Προσθήκη Τοποθεσίας 1", + "You must Verify email !.": "Επαληθεύστε το email!", + "Cropper": "Περικοπή", + "Saved Sucssefully": "Αποθηκεύτηκε Επιτυχώς", + "Select Date": "Επιλογή Ημερομηνίας", + "Birth Date": "Ημ. Γέννησης", + "Ok": "ΟΚ", + "the 500 points equal 30 JOD": "500 πόντοι ισούνται με 30 €", + "the 500 points equal 30 JOD for you \nSo go and gain your money": + "500 πόντοι = 30 €\nΚερδίστε χρήματα", + "token updated": "token ενημερώθηκε", + "Add Location 2": "Προσθήκη Τοποθεσίας 2", + "Add Location 3": "Προσθήκη Τοποθεσίας 3", + "Add Location 4": "Προσθήκη Τοποθεσίας 4", + "Waiting for your location": "Αναμονή τοποθεσίας", + "Search for your destination": "Αναζήτηση προορισμού", + "Hi! This is": "Γεια! Είμαι", + " I am using": " χρησιμοποιώ", + " to ride with": " για διαδρομή με", + " as the driver.": " ως οδηγό.", + "is driving a ": "οδηγεί ", + " with license plate ": " με πινακίδα ", + " I am currently located at ": " Βρίσκομαι στο ", + "Please go to Car now ": "Πηγαίνετε στο όχημα τώρα ", + "You will receive a code in WhatsApp Messenger": + "Θα λάβετε κωδικό στο WhatsApp", + "If you need assistance, contact us": "Επικοινωνήστε για βοήθεια", + "Promo Ended": "Η Προσφορά Έληξε", + "Enter the promo code and get": "Εισάγετε κωδικό και κερδίστε", + "DISCOUNT": "ΕΚΠΤΩΣΗ", + "No wallet record found": "Δεν βρέθηκε πορτοφόλι", + "for": "για", + "Intaleq is the safest ride-sharing app that introduces many features for both captains and passengers. We offer the lowest commission rate of just 8%, ensuring you get the best value for your rides. Our app includes insurance for the best captains, regular maintenance of cars with top engineers, and on-road services to ensure a respectful and high-quality experience for all users.": + "Το Intaleq είναι η ασφαλέστερη εφαρμογή. Χαμηλή προμήθεια 8%. Ασφάλεια και συντήρηση.", + "You can contact us during working hours from 12:00 - 19:00.": + "Επικοινωνήστε 12:00 - 19:00.", + "Choose a contact option": "Επιλογή επικοινωνίας", + "Work time is from 12:00 - 19:00.\nYou can send a WhatsApp message or email.": + "Ώρες 12:00 - 19:00.\nΣτείλτε WhatsApp ή email.", + "Promo code copied to clipboard!": "Αντιγράφηκε!", + "Copy Code": "Αντιγραφή", + "Your invite code was successfully applied!": "Εφαρμόστηκε επιτυχώς!", + "Payment Options": "Επιλογές Πληρωμής", + "wait 1 minute to receive message": "περιμένετε 1 λεπτό", + "You have copied the promo code.": "Αντιγράψατε τον κωδικό.", + "Select Payment Amount": "Επιλογή Ποσού", + "The promotion period has ended.": "Η προσφορά έληξε.", + "Promo Code Accepted": "Κωδικός Δεκτός", + "Tap on the promo code to copy it!": "Πατήστε για αντιγραφή!", + "Lowest Price Achieved": "Χαμηλότερη Τιμή", + "Cannot apply further discounts.": "Δεν υπάρχουν άλλες εκπτώσεις.", + "Promo Already Used": "Χρησιμοποιήθηκε ήδη", + "Invitation Used": "Πρόσκληση Χρησιμοποιήθηκε", + "You have already used this promo code.": + "Χρησιμοποιήσατε τον κωδικό.", + "Insert Your Promo Code": "Εισαγωγή Κωδικού", + "Enter promo code here": "Εισάγετε κωδικό εδώ", + "Please enter a valid promo code": "Εισάγετε έγκυρο κωδικό", + "Awfar Car": "Οικονομικό Όχημα", + "Old and affordable, perfect for budget rides.": + "Οικονομικό και προσιτό.", + " If you need to reach me, please contact the driver directly at": + " Επικοινωνήστε με τον οδηγό στο", + "No Car or Driver Found in your area.": "Δεν βρέθηκε όχημα ή οδηγός.", + "Please Try anther time ": "Προσπαθήστε ξανά ", + "There no Driver Aplly your order sorry for that ": + "Κανείς δεν δέχτηκε, συγγνώμη ", + "Trip Cancelled": "Διαδρομή Ακυρώθηκε", + "The Driver Will be in your location soon .": + "Ο Οδηγός φτάνει σύντομα.", + "The distance less than 500 meter.": "Απόσταση κάτω από 500μ.", + "Promo End !": "Τέλος Προσφοράς!", + "There is no notification yet": "Καμία ειδοποίηση", + "Use Touch ID or Face ID to confirm payment": + "Χρήση Touch ID ή Face ID", + "Contact us for any questions on your order.": + "Επικοινωνήστε για ερωτήσεις.", + "Pyament Cancelled .": "Πληρωμή Ακυρώθηκε.", + "type here": "γράψτε εδώ", + "Scan Driver License": "Σάρωση Διπλώματος", + "Please put your licence in these border": + "Τοποθετήστε το δίπλωμα στο πλαίσιο", + "Camera not initialized yet": "Η κάμερα δεν άνοιξε", + "Take Image": "Λήψη Φωτογραφίας", + "AI Page": "Σελίδα AI", + "Take Picture Of ID Card": "Φωτογραφία Ταυτότητας", + "Take Picture Of Driver License Card": "Φωτογραφία Διπλώματος", + "We are process picture please wait ": + "Επεξεργασία εικόνας, περιμένετε ", + "There is no data yet.": "Δεν υπάρχουν δεδομένα.", + "Name :": "Όνομα :", + "Drivers License Class: ": "Κατηγορία Διπλώματος: ", + "Document Number: ": "Αριθμός Εγγράφου: ", + "Address: ": "Διεύθυνση: ", + "Height: ": "Ύψος: ", + "Expiry Date: ": "Λήξη: ", + "Date of Birth: ": "Ημ. Γέννησης: ", + "You can't continue with us .\nYou should renew Driver license": + "Πρέπει να ανανεώσετε το δίπλωμα", + "Detect Your Face ": "Ανίχνευση Προσώπου ", + "Go to next step\nscan Car License.": "Επόμενο βήμα\nσάρωση Άδειας.", + "Name in arabic": "Όνομα (Τοπικό)", + "Drivers License Class": "Κατηγορία", + "Selected Date": "Επιλεγμένη Ημερομηνία", + "Select Time": "Επιλογή Ώρας", + "Selected Time": "Επιλεγμένη Ώρα", + "Selected Date and Time": "Επιλογή", + "Lets check Car license ": "Έλεγχος Άδειας ", + "Car": "Όχημα", + "Plate": "Πινακίδα", + "Rides": "Διαδρομές", + "Selected driver": "Επιλεγμένος οδηγός", + "Lets check License Back Face": "Έλεγχος Πίσω Όψης", + "Car License Card": "Άδεια Κυκλοφορίας", + "No image selected yet": "Δεν επιλέχθηκε εικόνα", + "Made :": "Κατασκευαστής :", + "model :": "Μοντέλο :", + "VIN :": "Πλαίσιο :", + "year :": "Έτος :", + "ُExpire Date": "Ημ. Λήξης", + "Login Driver": "Είσοδος Οδηγού", + "Password must br at least 6 character.": "Τουλάχιστον 6 χαρακτήρες.", + "if you don't have account": "αν δεν έχετε λογαριασμό", + "Here recorded trips audio": "Ηχογραφήσεις διαδρομών", + "Register as Driver": "Εγγραφή ως Οδηγός", + "By selecting \"I Agree\" below, I have reviewed and agree to the Terms of Use and acknowledge the ": + "Επιλέγοντας \"Συμφωνώ\", αποδέχομαι τους Όρους Χρήσης και ", + "Log Out Page": "Αποσύνδεση", + "Log Off": "Αποσύνδεση", + "Register Driver": "Εγγραφή Οδηγού", + "Verify Email For Driver": "Επαλήθευση Email Οδηγού", + "Admin DashBoard": "Πίνακας Ελέγχου", + "Your name": "Το όνομά σας", + "your ride is applied": "η διαδρομή καταχωρήθηκε", + "H and": "H και", + "JOD": "€", + "m": "λ", + "We search nearst Driver to you": "Αναζήτηση κοντινού οδηγού", + "please wait till driver accept your order": "περιμένετε την αποδοχή", + "No accepted orders? Try raising your trip fee to attract riders.": + "Αυξήστε την προσφορά σας.", + "You should select one": "Επιλέξτε ένα", + "The driver accept your order for": "Ο οδηγός δέχτηκε για", + "The driver on your way": "Ο οδηγός έρχεται", + "Total price from ": "Συνολική τιμή από ", + "Order Details Intaleq": "Λεπτομέρειες", + "Selected file:": "Επιλεγμένο αρχείο:", + "Your trip cost is": "Κόστος διαδρομής", + "this will delete all files from your device": + "διαγραφή όλων των αρχείων", + "Exclusive offers and discounts always with the Intaleq app": + "Αποκλειστικές προσφορές", + "Submit Question": "Υποβολή Ερώτησης", + "Please enter your Question.": "Εισάγετε Ερώτηση.", + "Help Details": "Λεπτομέρειες Βοήθειας", + "No trip yet found": "Δεν βρέθηκε διαδρομή", + "No Response yet.": "Καμία απάντηση.", + " You Earn today is ": " Κέρδος σήμερα: ", + " You Have in": " Έχετε στο", + "Total points is ": "Σύνολο πόντων: ", + "Total Connection Duration:": "Διάρκεια Σύνδεσης:", + "Passenger name : ": "Όνομα Επιβάτη: ", + "Cost Of Trip IS ": "Κόστος Διαδρομής: ", + "Arrival time": "Ώρα άφιξης", + "arrival time to reach your point": "ώρα άφιξης στο σημείο", + "For Intaleq and scooter trips, the price is calculated dynamically. For Comfort trips, the price is based on time and distance": + "Τιμή βάσει χρόνου και απόστασης.", + "Hello this is Driver": "Γεια σας, ο Οδηγός", + "Is the Passenger in your Car ?": "Είναι ο Επιβάτης στο Όχημα;", + "Please wait for the passenger to enter the car before starting the trip.": + "Περιμένετε να μπει ο επιβάτης.", + "No ,still Waiting.": "Όχι, αναμονή.", + "I arrive you": "Έφτασα", + "I Arrive your site": "Έφτασα στο σημείο", + "You are not in near to passenger location": + "Δεν είστε κοντά στον επιβάτη", + "please go to picker location exactly": + "πηγαίνετε ακριβώς στο σημείο παραλαβής", + "You Can Cancel Trip And get Cost of Trip From": + "Ακύρωση και λήψη κόστους από", + "Are you sure to cancel?": "Σίγουρα ακύρωση;", + "Insert Emergincy Number": "Εισαγωγή SOS Αριθμού", + "Best choice for comfort car and flexible route and stops point": + "Άνετο αμάξι, ευέλικτη διαδρομή", + "Insert": "Εισαγωγή", + "This is for scooter or a motorcycle.": "Για σκούτερ ή μοτοσυκλέτα.", + "This trip goes directly from your starting point to your destination for a fixed price. The driver must follow the planned route": + "Απευθείας διαδρομή, σταθερή τιμή.", + "You can decline a request without any cost": "Απόρριψη χωρίς χρέωση", + "Perfect for adventure seekers who want to experience something new and exciting": + "Για όσους ψάχνουν περιπέτεια", + "My current location is:": "Η τοποθεσία μου:", + "and I have a trip on": "και έχω διαδρομή στο", + "App with Passenger": "Εφαρμογή με Επιβάτη", + "You will be pay the cost to driver or we will get it from you on next trip": + "Πληρωμή στον οδηγό ή στην επόμενη διαδρομή", + "Trip has Steps": "Διαδρομή με Στάσεις", + "Distance from Passenger to destination is ": + "Απόσταση Επιβάτη από προορισμό: ", + "price is": "τιμή είναι", + "This ride type does not allow changes to the destination or additional stops": + "Χωρίς αλλαγές/στάσεις", + "This price may be changed": "Η τιμή μπορεί να αλλάξει", + "No SIM card, no problem! Call your driver directly through our app. We use advanced technology to ensure your privacy.": + "Χωρίς SIM; Καλέστε μέσω εφαρμογής.", + "This ride type allows changes, but the price may increase": + "Αλλαγές επιτρέπονται, η τιμή ίσως αυξηθεί", + "Select one message": "Επιλογή μηνύματος", + "I'm waiting for you": "Σας περιμένω", + "We noticed the Intaleq is exceeding 100 km/h. Please slow down for your safety. If you feel unsafe, you can share your trip details with a contact or call the police using the red SOS button.": + "Υπερβολική ταχύτητα (>100 χλμ/ώ). Παρακαλώ επιβραδύνετε.", + "Warning: Intaleqing detected!": + "Προειδοποίηση: Υπερβολική ταχύτητα!", + "Please help! Contact me as soon as possible.": + "Βοήθεια! Επικοινωνήστε άμεσα.", + "Share Trip Details": "Κοινοποίηση Λεπτομερειών", + "Car Plate is ": "Πινακίδα: ", + "the 300 points equal 300 L.E for you \nSo go and gain your money": + "300 πόντοι = 300 €\nΚερδίστε χρήματα", + "the 300 points equal 300 L.E": "300 πόντοι = 300 €", + "The payment was not approved. Please try again.": + "Η πληρωμή δεν εγκρίθηκε. Προσπαθήστε ξανά.", + "Payment Failed": "Αποτυχία Πληρωμής", + "This is a scheduled notification.": "Προγραμματισμένη ειδοποίηση.", + "An error occurred during the payment process.": "Σφάλμα πληρωμής.", + "The payment was approved.": "Εγκρίθηκε.", + "Payment Successful": "Επιτυχής Πληρωμή", + "No ride found yet": "Δεν βρέθηκε διαδρομή", + "Accept Order": "Αποδοχή", + "Bottom Bar Example": "Παράδειγμα", + "Driver phone": "Τηλέφωνο Οδηγού", + "Statistics": "Στατιστικά", + "Origin": "Αφετηρία", + "Destination": "Προορισμός", + "Driver Name": "Όνομα Οδηγού", + "Driver Car Plate": "Πινακίδα Οδηγού", + "Available for rides": "Διαθέσιμος", + "Scan Id": "Σάρωση Ταυτότητας", + "Camera not initilaized yet": "Κάμερα μη έτοιμη", + "Scan ID MklGoogle": "Σάρωση Ταυτότητας", + "Language": "Γλώσσα", + "Jordan": "Ιορδανία", + "USA": "ΗΠΑ", + "Egypt": "Αίγυπτος", + "Turkey": "Τουρκία", + "Saudi Arabia": "Σαουδική Αραβία", + "Qatar": "Κατάρ", + "Bahrain": "Μπαχρέιν", + "Kuwait": "Κουβέιτ", + "But you have a negative salary of": "Αρνητικό υπόλοιπο:", + "Promo Code": "Κωδικός Προσφοράς", + "Your trip distance is": "Απόσταση διαδρομής:", + "Enter promo code": "Εισάγετε κωδικό", + "You have promo!": "Έχετε προσφορά!", + "Cost Duration": "Κόστος Διάρκειας", + "Duration is": "Διάρκεια:", + "Leave": "Αποχώρηση", + "Join": "Συμμετοχή", + "Heading your way now. Please be ready.": + "Έρχομαι. Να είστε έτοιμοι.", + "Approaching your area. Should be there in 3 minutes.": + "Πλησιάζω. Εκεί σε 3 λεπτά.", + "There's heavy traffic here. Can you suggest an alternate pickup point?": + "Κίνηση. Άλλο σημείο παραλαβής;", + "This ride is already taken by another driver.": + "Η διαδρομή αναλήφθηκε.", + "You Should be select reason.": "Επιλέξτε λόγο.", + "Waiting for Driver ...": "Αναμονή Οδηγού...", + "Latest Recent Trip": "Τελευταία Διαδρομή", + "from your list": "από τη λίστα", + "Do you want to change Work location": "Αλλαγή τοποθεσίας Εργασίας;", + "Do you want to change Home location": "Αλλαγή τοποθεσίας Σπιτιού;", + "We Are Sorry That we dont have cars in your Location!": + "Λυπούμαστε, κανένα όχημα στην περιοχή!", + "Choose from Map": "Επιλογή από Χάρτη", + "Pick your ride location on the map - Tap to confirm": + "Επιλέξτε σημείο στον χάρτη - Πατήστε για επιβεβαίωση", + "Intaleq is the ride-hailing app that is safe, reliable, and accessible.": + "Το Intaleq είναι ασφαλές και αξιόπιστο.", + "With Intaleq, you can get a ride to your destination in minutes.": + "Βρείτε διαδρομή σε λεπτά.", + "Intaleq is committed to safety, and all of our captains are carefully screened and background checked.": + "Δέσμευση στην ασφάλεια, ελεγμένοι οδηγοί.", + "Pick from map": "Επιλογή από χάρτη", + "No Car in your site. Sorry!": "Κανένα όχημα. Συγγνώμη!", + "Nearest Car for you about ": "Κοντινότερο όχημα σε περίπου ", + "From :": "Από:", + "Get Details of Trip": "Λεπτομέρειες", + "If you want add stop click here": "Για προσθήκη στάσης πατήστε εδώ", + "Where you want go ": "Πού θέλετε να πάτε ", + "My Card": "Η Κάρτα Μου", + "Start Record": "Έναρξη Εγγραφής", + "History of Trip": "Ιστορικό", + "Helping Center": "Κέντρο Βοήθειας", + "Record saved": "Αποθηκεύτηκε", + "Trips recorded": "Καταγεγραμμένες", + "Select Your Country": "Επιλογή Χώρας", + "To ensure you receive the most accurate information for your location, please select your country below. This will help tailor the app experience and content to your country.": + "Επιλέξτε χώρα για ακριβείς πληροφορίες.", + "Are you sure to delete recorded files": "Διαγραφή αρχείων;", + "Select recorded trip": "Επιλογή διαδρομής", + "Card Number": "Αριθμός Κάρτας", + "Hi, Where to ": "Γεια, Πού πάτε ", + "Pick your destination from Map": "Προορισμός από Χάρτη", + "Add Stops": "Προσθήκη Στάσεων", + "Get Direction": "Οδηγίες", + "Add Location": "Προσθήκη Τοποθεσίας", + "Switch Rider": "Αλλαγή Επιβάτη", + "You will arrive to your destination after timer end.": + "Άφιξη μετά το πέρας του χρόνου.", + "You can cancel trip": "Μπορείτε να ακυρώσετε", + "The driver waitting you in picked location .": "Ο οδηγός περιμένει.", + "Pay with Your": "Πληρωμή με", + "Pay with Credit Card": "Πληρωμή με Κάρτα", + "Show Promos to Charge": "Προσφορές Φόρτισης", + "Point": "Πόντος", + "How many hours would you like to wait?": "Πόσες ώρες αναμονής;", + "Driver Wallet": "Πορτοφόλι Οδηγού", + "Choose between those Type Cars": "Επιλογή Τύπου Οχήματος", + "hour": "ώρα", + "Select Waiting Hours": "Ώρες Αναμονής", + "Total Points is": "Σύνολο Πόντων", + "You will receive a code in SMS message": "Θα λάβετε SMS", + "Done": "Τέλος", + "Total Budget from trips is ": "Σύνολο εσόδων: ", + "Total Amount:": "Συνολικό Ποσό:", + "Total Budget from trips by\nCredit card is ": + "Σύνολο εσόδων (Κάρτα): ", + "This amount for all trip I get from Passengers": "Ποσό από Επιβάτες", + "Pay from my budget": "Πληρωμή από υπόλοιπο", + "This amount for all trip I get from Passengers and Collected For me in": + "Ποσό που εισπράχθηκε", + "You can buy points from your budget": "Αγορά πόντων από υπόλοιπο", + "insert amount": "εισαγωγή ποσού", + "You can buy Points to let you online\nby this list below": + "Αγορά Πόντων για online", + "Create Wallet to receive your money": "Δημιουργία Πορτοφολιού", + "Enter your feedback here": "Εισάγετε σχόλια", + "Please enter your feedback.": "Παρακαλώ εισάγετε σχόλια.", + "Feedback": "Σχόλια", + "Submit ": "Υποβολή ", + "Click here to Show it in Map": "Προβολή στον Χάρτη", + "Canceled": "Ακυρώθηκε", + "No I want": "Όχι θέλω", + "Email is": "Email:", + "Phone Number is": "Τηλέφωνο:", + "Date of Birth is": "Ημ. Γέννησης:", + "Sex is ": "Φύλο: ", + "Car Details": "Στοιχεία Οχήματος", + "VIN is": "Πλαίσιο:", + "Color is ": "Χρώμα: ", + "Make is ": "Μάρκα: ", + "Model is": "Μοντέλο:", + "Year is": "Έτος:", + "Expiration Date ": "Λήξη: ", + "Edit Your data": "Επεξεργασία", + "write vin for your car": "εισάγετε πλαίσιο", + "VIN": "Πλαίσιο", + "Please verify your identity": "Επαλήθευση ταυτότητας", + "write Color for your car": "εισάγετε χρώμα", + "write Make for your car": "εισάγετε μάρκα", + "write Model for your car": "εισάγετε μοντέλο", + "write Year for your car": "εισάγετε έτος", + "write Expiration Date for your car": "εισάγετε ημερομηνία λήξης", + "Tariffs": "Χρεώσεις", + "Minimum fare": "Ελάχιστη χρέωση", + "Maximum fare": "Μέγιστη χρέωση", + "Flag-down fee": "Σημαία", + "Including Tax": "Με ΦΠΑ", + "BookingFee": "Κόστος Κράτησης", + "Morning": "Πρωί", + "from 07:30 till 10:30 (Thursday, Friday, Saturday, Monday)": + "07:30 - 10:30", + "Evening": "Απόγευμα", + "from 12:00 till 15:00 (Thursday, Friday, Saturday, Monday)": + "12:00 - 15:00", + "Night": "Βράδυ", + "You have in account": "Έχετε στον λογαριασμό", + "Select Country": "Επιλογή Χώρας", + "Ride Today : ": "Διαδρομή Σήμερα: ", + "After this period\nYou can't cancel!": + "Μετά από αυτό\nΔεν μπορείτε να ακυρώσετε!", + "from 23:59 till 05:30": "23:59 - 05:30", + "Rate Driver": "Βαθμολογία Οδηγού", + "Total Cost is ": "Συνολικό Κόστος: ", + "Write note": "Σημείωση", + "Time to arrive": "Ώρα άφιξης", + "Ride Summaries": "Συνόψεις", + "Total Cost": "Συνολικό Κόστος", + "Average of Hours of": "Μέσος όρος ωρών", + " is ON for this month": " είναι ON αυτόν τον μήνα", + "Days": "Ημέρες", + "Total Hours on month": "Σύνολο Ωρών μήνα", + "Counts of Hours on days": "Ώρες ανά ημέρα", + "OrderId": "ID Παραγγελίας", + "created time": "ώρα δημιουργίας", + "Intaleq Over": "Τέλος Intaleq", + "I will slow down": "Θα επιβραδύνω", + "Map Passenger": "Χάρτης Επιβάτη", + "Be Slowly": "Πιο αργά", + "If you want to make Google Map App run directly when you apply order": + "Άμεσο άνοιγμα Google Maps", + "You can change the language of the app": "Αλλαγή γλώσσας εφαρμογής", + "Your Budget less than needed": + "Υπόλοιπο χαμηλότερο του απαιτούμενου", + "You can change the Country to get all features": + "Αλλάξτε Χώρα για όλα τα χαρακτηριστικά", + "There is no Car or Driver in your area.": + "Δεν υπάρχει αυτοκίνητο ή οδηγός στην περιοχή σας.", + "Change Country": "Αλλαγή Χώρας", + }, + "ur": { + "About Intaleq": "انطلق کے بارے میں", + "Chat with us anytime": "کسی भी समय हमसे चैट करें", + "Direct talk with our team": "ہماری ٹیم سے براہ راست بات کریں", + "Email Support": "ای میل سپورٹ", + "For official inquiries": "سرکاری استفسارات کے لیے", + "Intaleq Support": "انطلق سپورٹ", + "Reach out to us via": "ہم سے رابطہ کریں بذریعہ", + "Support is Away": "سپورٹ اب دستیاب نہیں ہے", + "Support is currently Online": "سپورٹ اب آن لائن ہے", + "Voice Call": "صوتی کال", + "We're here to help you 24/7": "ہم چوبیس گھنٹے آپ کی مدد کے لیے حاضر ہیں", + "Working Hours:": "کام کے اوقات:", + "1 Passenger": "1 Passenger", + "2 Passengers": "2 Passengers", + "3 Passengers": "3 Passengers", + "4 Passengers": "4 Passengers", + "2. Attach Recorded Audio (Optional)": + "2. Attach Recorded Audio (Optional)", + "Account": "Account", + "Actions": "Actions", + "Active Users": "Active Users", + "Add a Stop": "Add a Stop", + "Add a new waypoint stop": "Add a new waypoint stop", + "After this period\nYou can\'t cancel!": + "After this period\nYou can\'t cancel!", + "Age is": "Age is", + "Alert": "Alert", + "An OTP has been sent to your number.": + "An OTP has been sent to your number.", + "An error occurred": "An error occurred", + "Appearance": "Appearance", + "Are you sure you want to delete this file?": + "Are you sure you want to delete this file?", + "Are you sure you want to logout?": + "Are you sure you want to logout?", + "Arrived": "Arrived", + "Audio Recording": "Audio Recording", + "Call": "Call", + "Call Support": "Call Support", + "Call left": "Call left", + "Change Photo": "Change Photo", + "Choose from Gallery": "Choose from Gallery", + "Choose from contact": "Choose from contact", + "Click to track the trip": "Click to track the trip", + "Close panel": "Close panel", + "Coming": "Coming", + "Complete Payment": "Complete Payment", + "Confirm Cancellation": "Confirm Cancellation", + "Confirm Pickup Location": "Confirm Pickup Location", + "Connection failed. Please try again.": + "Connection failed. Please try again.", + "Could not create ride. Please try again.": + "Could not create ride. Please try again.", + "Crop Photo": "Crop Photo", + "Dark Mode": "Dark Mode", + "Delete": "Delete", + "Delete Account": "Delete Account", + "Delete All": "Delete All", + "Delete All Recordings?": "Delete All Recordings?", + "Delete Recording?": "Delete Recording?", + "Destination Set": "Destination Set", + "Distance": "Distance", + "Double tap to open search or enter destination": + "Double tap to open search or enter destination", + "Double tap to set or change this waypoint on the map": + "Double tap to set or change this waypoint on the map", + "Drawing route on map...": "Drawing route on map...", + "Driver Phone": "Driver Phone", + "Driver is Going To You": "Driver is Going To You", + "Emergency Mode Triggered": "Emergency Mode Triggered", + "Emergency SOS": "Emergency SOS", + "Enter the 5-digit code": "Enter the 5-digit code", + "Enter your City": "Enter your City", + "Enter your Password": "Enter your Password", + "Failed to book trip: \$e": "Failed to book trip: \$e", + "Failed to get location": "Failed to get location", + "Failed to initiate payment. Please try again.": + "Failed to initiate payment. Please try again.", + "Failed to send OTP": "Failed to send OTP", + "Failed to upload photo": "Failed to upload photo", + "Finished": "Finished", + "Fixed Price": "Fixed Price", + "General": "General", + "Grant": "Grant", + "Have a Promo Code?": "Have a Promo Code?", + "Hello! I\'m inviting you to try Intaleq.": + "Hello! I\'m inviting you to try Intaleq.", + "Hi ,I Arrive your site": "Hi ,I Arrive your site", + "Hi, Where to": "Hi, Where to", + "Home": "Home", + "I am currently located at": "I am currently located at", + "I'm Safe": "I'm Safe", + "If you need to reach me, please contact the driver directly at": + "If you need to reach me, please contact the driver directly at", + "Image Upload Failed": "Image Upload Failed", + "Intaleq Passenger": "Intaleq Passenger", + "Invite": "Invite", + "Join a channel": "Join a channel", + "Last Name": "Last Name", + "Leave a detailed comment (Optional)": + "Leave a detailed comment (Optional)", + "Light Mode": "Light Mode", + "Listen": "Listen", + "Location": "Location", + "Location Received": "Location Received", + "Logout": "Logout", + "Map Error": "Map Error", + "Message": "Message", + "Move map to select destination": "Move map to select destination", + "Move map to set start location": "Move map to set start location", + "Move map to set stop": "Move map to set stop", + "Move map to your home location": "Move map to your home location", + "Move map to your pickup point": "Move map to your pickup point", + "Move map to your work location": "Move map to your work location", + "N/A": "N/A", + "No Notifications": "No Notifications", + "No Recordings Found": "No Recordings Found", + "No Rides now!": "No Rides now!", + "No contacts available": "No contacts available", + "No i want": "No i want", + "No notification data found.": "No notification data found.", + "No routes available for this destination.": + "No routes available for this destination.", + "No user found": "No user found", + "No,I want": "No,I want", + "No.Iwant Cancel Trip.": "No.Iwant Cancel Trip.", + "Now move the map to your pickup point": + "Now move the map to your pickup point", + "Now set the pickup point for the other person": + "Now set the pickup point for the other person", + "On Trip": "On Trip", + "Open": "Open", + "Open destination search": "Open destination search", + "Open in Google Maps": "Open in Google Maps", + "Order VIP Canceld": "Order VIP Canceld", + "Passenger": "Passenger", + "Passenger cancel order": "Passenger cancel order", + "Pay by MTN Wallet": "Pay by MTN Wallet", + "Pay by Sham Cash": "Pay by Sham Cash", + "Pay by Syriatel Wallet": "Pay by Syriatel Wallet", + "Pay with PayPal": "Pay with PayPal", + "Phone": "Phone", + "Phone Number": "Phone Number", + "Phone Number Check": "Phone Number Check", + "Phone number seems too short": "Phone number seems too short", + "Phone verified. Please complete registration.": + "Phone verified. Please complete registration.", + "Pick destination on map": "Pick destination on map", + "Pick location on map": "Pick location on map", + "Pick on map": "Pick on map", + "Pick start point on map": "Pick start point on map", + "Plan Your Route": "Plan Your Route", + "Please add contacts to your phone.": + "Please add contacts to your phone.", + "Please check your internet and try again.": + "Please check your internet and try again.", + "Please enter a valid email.": "Please enter a valid email.", + "Please enter a valid phone number.": + "Please enter a valid phone number.", + "Please enter the number without the leading 0": + "Please enter the number without the leading 0", + "Please enter your phone number": "Please enter your phone number", + "Please go to Car now": "Please go to Car now", + "Please select a reason first": "Please select a reason first", + "Please set a valid SOS phone number.": + "Please set a valid SOS phone number.", + "Please slow down": "Please slow down", + "Please wait while we prepare your trip.": + "Please wait while we prepare your trip.", + "Preferences": "Preferences", + "Profile photo updated": "Profile photo updated", + "Quick Message": "Quick Message", + "Rating is": "Rating is", + "Received empty route data.": "Received empty route data.", + "Record": "Record", + "Record your trips to see them here.": + "Record your trips to see them here.", + "Rejected Orders Count": "Rejected Orders Count", + "Remove waypoint": "Remove waypoint", + "Report": "Report", + "Route and prices have been calculated successfully!": + "Route and prices have been calculated successfully!", + "SOS": "SOS", + "Save": "Save", + "Save Changes": "Save Changes", + "Save Name": "Save Name", + "Search country": "Search country", + "Search for a starting point": "Search for a starting point", + "Select Appearance": "Select Appearance", + "Select Education": "Select Education", + "Select Gender": "Select Gender", + "Select This Ride": "Select This Ride", + "Select betweeen types": "Select betweeen types", + "Send Email": "Send Email", + "Send SOS": "Send SOS", + "Send WhatsApp Message": "Send WhatsApp Message", + "Server Error": "Server Error", + "Server error": "Server error", + "Server error. Please try again.": "Server error. Please try again.", + "Set Destination": "Set Destination", + "Set Phone Number": "Set Phone Number", + "Set as Home": "Set as Home", + "Set as Stop": "Set as Stop", + "Set as Work": "Set as Work", + "Share": "Share", + "Share Trip": "Share Trip", + "Share your experience to help us improve...": + "Share your experience to help us improve...", + "Something went wrong. Please try again.": + "Something went wrong. Please try again.", + "Speaking...": "Speaking...", + "Speed Over": "Speed Over", + "Start Point": "Start Point", + "Stay calm. We are here to help.": "Stay calm. We are here to help.", + "Stop": "Stop", + "Submit Rating": "Submit Rating", + "Support & Info": "Support & Info", + "System Default": "System Default", + "Take a Photo": "Take a Photo", + "Tap to apply your discount": "Tap to apply your discount", + "Tap to search your destination": "Tap to search your destination", + "The driver cancelled the trip.": "The driver cancelled the trip.", + "This action cannot be undone.": "This action cannot be undone.", + "This action is permanent and cannot be undone.": + "This action is permanent and cannot be undone.", + "This is for delivery or a motorcycle.": + "This is for delivery or a motorcycle.", + "Time": "Time", + "To :": "To :", + "Top up Balance": "Top up Balance", + "Top up Balance to continue": "Top up Balance to continue", + "Total Invites": "Total Invites", + "Total Price": "Total Price", + "Trip booked successfully": "Trip booked successfully", + "Type your message...": "Type your message...", + "Unknown Location": "Unknown Location", + "Update Name": "Update Name", + "Verified Passenger": "Verified Passenger", + "View Map": "View Map", + "Wait for the trip to start first": + "Wait for the trip to start first", + "Waiting...": "Waiting...", + "Warning": "Warning", + "Waypoint has been set successfully": + "Waypoint has been set successfully", + "We use location to get accurate and nearest driver for you": + "We use location to get accurate and nearest driver for you", + "WhatsApp": "WhatsApp", + "Why do you want to cancel?": "Why do you want to cancel?", + "Yes": "Yes", + "You should ideintify your gender for this type of trip!": + "You should ideintify your gender for this type of trip!", + "You will choose one of above!": "You will choose one of above!", + "Your Rewards": "Your Rewards", + "Your complaint has been submitted.": + "Your complaint has been submitted.", + "and acknowledge our Privacy Policy.": + "and acknowledge our Privacy Policy.", + "as the driver.": "as the driver.", + "cancelled": "cancelled", + "due to a previous trip.": "due to a previous trip.", + "insert sos phone": "insert sos phone", + "is driving a": "is driving a", + "min added to fare": "min added to fare", + "phone not verified": "phone not verified", + "to arrive you.": "to arrive you.", + "unknown": "unknown", + "wait 1 minute to recive message": "wait 1 minute to recive message", + "with license plate": "with license plate", + "witout zero": "witout zero", + "you must insert token code": "you must insert token code", + "Syria": "شام", + "SYP": "شامی پاؤن", + "Order": "آرڈر", + "OrderVIP": "VIP آرڈر", + "Cancel Trip": "سفر منسوخ کریں", + "Passenger Cancel Trip": "مسافر نے سفر منسوخ کر دیا", + "VIP Order": "VIP آرڈر", + "The driver accepted your trip": + "ڈرائیور نے آپ کا سفر قبول کر لیا ہے", + "message From passenger": "مسافر کا پیغام", + "Cancel": "منسوخ کریں", + "Trip Cancelled. The cost of the trip will be added to your wallet.": + "سفر منسوخ ہو گیا۔ سفر کی لاگت آپ کے والٹ میں شامل کر دی جائے گی۔", + "token change": "ٹوکن کی تبدیلی", + "Changed my mind": "میرا ارادہ بدل گیا", + "Please write the reason...": "براہ کرم وجہ لکھیں...", + "Found another transport": "دوسرا ذریعہ مل گیا", + "Driver is taking too long": "ڈرائیور بہت دیر لگا رہا ہے", + "Driver asked me to cancel": "ڈرائیور نے کینسل کرنے کا کہا", + "Wrong pickup location": "غلط پک اپ لوکیشن", + "Other": "دیگر", + "Don't Cancel": "کینسل نہ کریں", + "No Drivers Found": "کوئی ڈرائیور نہیں ملا", + "Sorry, there are no cars available of this type right now.": + "معذرت، ابھی اس قسم کی کوئی گاڑی دستیاب نہیں ہے۔", + "Refresh Map": "نقشہ ریفریش کریں", + "face detect": "چہرے کی شناخت", + "Face Detection Result": "چہرے کی شناخت کا نتیجہ", + "similar": "ملتا جلتا", + "not similar": "مختلف", + "Searching for nearby drivers...": + "قریبی ڈرائیور تلاش کیے جا رہے ہیں...", + "Error": "خرابی", + "Failed to search, please try again later": + "تلاش ناکام رہی، براہ کرم بعد میں دوبارہ کوشش کریں", + "Connection Error": "کنکشن کی خرابی", + "Please check your internet connection": + "براہ کرم اپنا انٹرنیٹ کنکشن چیک کریں", + "Sorry 😔": "معذرت 😔", + "The driver cancelled the trip for an emergency reason.\nDo you want to search for another driver immediately?": + "ڈرائیور نے ہنگامی وجہ سے ٹرپ کینسل کر دیا ہے۔\nکیا آپ فوراً دوسرا ڈرائیور تلاش کرنا چاہتے ہیں؟", + "Search for another driver": "دوسرا ڈرائیور تلاش کریں", + "We apologize 😔": "ہم معذرت خواہ ہیں 😔", + "No drivers found at the moment.\nPlease try again later.": + "اس وقت کوئی ڈرائیور نہیں ملا۔\nبراہ کرم بعد میں دوبارہ کوشش کریں۔", + "Hi ,I will go now": "سلام، میں اب جا رہا ہوں", + "Passenger come to you": "مسافر آپ کی طرف آ رہا ہے", + "Call Income": "آنے والی کال", + "Call Income from Passenger": "مسافر کی طرف سے کال", + "Criminal Document Required": "پولیس کلیئرنس درکار ہے", + "You should have upload it .": "آپ کو اسے اپ لوڈ کرنا چاہیے۔", + "Call End": "کال ختم", + "The order has been accepted by another driver.": + "آرڈر دوسرے ڈرائیور نے قبول کر لیا ہے۔", + "The order Accepted by another Driver": + "آرڈر دوسرے ڈرائیور نے قبول کر لیا", + "We regret to inform you that another driver has accepted this order.": + "ہمیں افسوس ہے کہ کسی اور ڈرائیور نے یہ آرڈر قبول کر لیا ہے۔", + "Driver Applied the Ride for You": + "ڈرائیور نے آپ کے لیے سفر کی درخواست دی", + "Applied": "درخواست دی گئی", + "Please go to Car Driver": "براہ کرم ڈرائیور کے پاس جائیں", + "Ok I will go now.": "ٹھیک ہے، میں اب جا رہا ہوں۔", + "Accepted Ride": "قبول شدہ سفر", + "Driver Accepted the Ride for You": + "ڈرائیور نے آپ کے لیے سفر قبول کر لیا", + "Promo": "پرومو", + "Show latest promo": "تازہ ترین پرومو دکھائیں", + "Trip Monitoring": "سفر کی نگرانی", + "Driver Is Going To Passenger": "ڈرائیور مسافر کی طرف جا رہا ہے", + "Please stay on the picked point.": + "براہ کرم منتخب کردہ مقام پر رہیں۔", + "message From Driver": "ڈرائیور کا پیغام", + "Trip is Begin": "سفر شروع ہو گیا", + "Cancel Trip from driver": "ڈرائیور کی طرف سے سفر منسوخ", + "We will look for a new driver.\nPlease wait.": + "ہم نئے ڈرائیور کی تلاش کریں گے۔\nبراہ کرم انتظار کریں۔", + "The driver canceled your ride.": + "ڈرائیور نے آپ کی سواری منسوخ کر دی۔", + "Driver Finish Trip": "ڈرائیور نے سفر ختم کر دیا", + "you will pay to Driver": "آپ ڈرائیور کو ادا کریں گے", + "Don’t forget your personal belongings.": + "اپنا ذاتی سامان نہ بھولیں۔", + "Please make sure you have all your personal belongings and that any remaining fare, if applicable, has been added to your wallet before leaving. Thank you for choosing the Intaleq app": + "براہ کرم یقینی بنائیں کہ آپ کے پاس اپنا تمام سامان موجود ہے اور اگر کوئی بقایا کرایہ ہے تو وہ آپ کے والٹ میں شامل کر دیا گیا ہے۔ Intaleq ایپ منتخب کرنے کا شکریہ۔", + "Finish Monitor": "نگرانی ختم کریں", + "Trip finished": "سفر ختم ہو گیا", + "Call Income from Driver": "ڈرائیور کی طرف سے کال", + "Driver Cancelled Your Trip": "ڈرائیور نے آپ کا سفر منسوخ کر دیا", + "you will pay to Driver you will be pay the cost of driver time look to your Intaleq Wallet": + "آپ ڈرائیور کے وقت کی قیمت ادا کریں گے، اپنا Intaleq والٹ دیکھیں", + "Order Applied": "آرڈر لاگو ہو گیا", + "welcome to intaleq": "Intaleq میں خوش آمدید", + "login or register subtitle": + "لاگ ان یا رجسٹر کرنے کے لیے اپنا موبائل نمبر درج کریں", + "Complaint cannot be filed for this ride. It may not have been completed or started.": + "اس سفر کے لیے شکایت درج نہیں کی جا سکتی۔ ہو سکتا ہے یہ مکمل یا شروع نہ ہوا ہو۔", + "phone number label": "فون نمبر", + "phone number required": "فون نمبر درکار ہے", + "send otp button": "او ٹی پی (OTP) بھیجیں", + "verify your number title": "اپنے نمبر کی تصدیق کریں", + "otp sent subtitle": "ایک 5 ہندسوں کا کوڈ بھیجا گیا\n@phoneNumber", + "verify and continue button": "تصدیق کریں اور جاری رکھیں", + "enter otp validation": "براہ کرم 5 ہندسوں کا او ٹی پی درج کریں", + "one last step title": "ایک آخری قدم", + "complete profile subtitle": "شروع کرنے کے لیے پروفایل مکمل کریں", + "first name label": "پہلا نام", + "first name required": "پہلا نام درکار ہے", + "last name label": "آخری نام", + "Verify OTP": "او ٹی پی کی تصدیق کریں", + "Verification Code": "تصدیقی کوڈ", + "We have sent a verification code to your mobile number:": + "ہم نے آپ کے موبائل نمبر پر تصدیقی کوڈ بھیج دیا ہے:", + "Verify": "تصدیق کریں", + "Resend Code": "کوڈ دوبارہ بھیجیں", + "You can resend in": "دوبارہ بھیج سکتے ہیں", + "seconds": "سیکنڈز", + "Please enter the complete 6-digit code.": + "براہ کرم مکمل 6 ہندسوں کا کوڈ درج کریں۔", + "last name required": "آخری نام درکار ہے", + "email optional label": "ای میل (اختیاری)", + "complete registration button": "رجسٹریشن مکمل کریں", + "User with this phone number or email already exists.": + "اس فون نمبر یا ای میل کے ساتھ صارف پہلے سے موجود ہے۔", + "otp sent success": "او ٹی پی کامیابی سے واٹس ایپ پر بھیج دیا گیا۔", + "failed to send otp": "او ٹی پی بھیجنے میں ناکامی۔", + "server error try again": "سرور کی خرابی، دوبارہ کوشش کریں۔", + "an error occurred": "ایک خرابی پیش آ گئی: @error", + "otp verification failed": "او ٹی پی کی تصدیق ناکام ہو گئی۔", + "registration failed": "رجسٹریشن ناکام ہو گئی۔", + "welcome user": "خوش آمدید، @firstName!", + "Don't forget your personal belongings.": + "اپنا ذاتی سامان نہ بھولیں۔", + "Share App": "ایپ شیئر کریں", + "Wallet": "والٹ", + "Balance": "بیلنس", + "Profile": "پروفائل", + "Contact Support": "سپورٹ سے رابطہ کریں", + "Session expired. Please log in again.": + "سیشن ختم ہو گیا۔ براہ کرم دوبارہ لاگ ان کریں۔", + "Security Warning": "⚠️ سیکیورٹی وارننگ", + "Potential security risks detected. The application may not function correctly.": + "ممکنہ سیکیورٹی خطرات کا پتہ چلا۔ ہو سکتا ہے ایپلیکیشن صحیح کام نہ کرے۔", + "please order now": "ابھی آرڈر کریں", + "Where to": "کہاں جانا ہے؟", + "Where are you going?": "آپ کہاں جا رہے ہیں؟", + "Quick Actions": "فوری اقدامات", + "My Balance": "میرا بیلنس", + "Order History": "آرڈر ہسٹری", + "Contact Us": "ہم سے رابطہ کریں", + "Driver": "ڈرائیور", + "Complaint": "شکایت", + "Promos": "پروموز", + "Recent Places": "حالیہ مقامات", + "From": "سے", + "WhatsApp Location Extractor": "واٹس ایپ لوکیشن ایکسٹریکٹر", + "Location Link": "لوکیشن لنک", + "Paste location link here": "لوکیشن لنک یہاں پیسٹ کریں", + "Go to this location": "اس لوکیشن پر جائیں", + "Paste WhatsApp location link": "واٹس ایپ لوکیشن لنک پیسٹ کریں", + "Select Order Type": "آرڈر کی قسم منتخب کریں", + "Choose who this order is for": "منتخب کریں کہ یہ آرڈر کس کے لیے ہے", + "I want to order for myself": "میں اپنے لیے آرڈر کرنا چاہتا ہوں", + "I want to order for someone else": + "میں کسی اور کے لیے آرڈر کرنا چاہتا ہوں", + "Order for someone else": "کسی اور کے لیے آرڈر", + "Order for myself": "اپنے لیے آرڈر", + "Are you want to go this site": "کیا آپ اس جگہ جانا چاہتے ہیں", + "No": "نہیں", + "Intaleq Wallet": "Intaleq والٹ", + "Have a promo code?": "کیا آپ کے پاس پرومو کوڈ ہے؟", + "Your Wallet balance is ": "آپ کا والٹ بیلنس ہے: ", + "Cash": "نقد", + "Pay directly to the captain": "کپتان کو براہ راست ادائیگی کریں", + "Top up Wallet to continue": "جاری رکھنے کے لیے والٹ ٹاپ اپ کریں", + "Or pay with Cash instead": "یا اس کے بجائے نقد ادائیگی کریں", + "Confirm & Find a Ride": "تصدیق کریں اور سواری تلاش کریں", + "Balance:": "بیلنس:", + "Alerts": "الرٹس", + "Welcome Back!": "خوش آمدید!", + "Current Balance": "موجودہ بیلنس", + "Set Wallet Phone Number": "والٹ فون نمبر سیٹ کریں", + "Link a phone number for transfers": + "ٹرانسفر کے لیے فون نمبر لنک کریں", + "Payment History": "ادائیگی کی تاریخ", + "View your past transactions": "اپنی پرانی ٹرانزیکشنز دیکھیں", + "Top up Wallet": "والٹ ٹاپ اپ کریں", + "Add funds using our secure methods": + "ہمارے محفوظ طریقوں سے فنڈز شامل کریں", + "Increase Fare": "کرایہ بڑھائیں", + "No drivers accepted your request yet": + "ابھی تک کسی ڈرائیور نے آپ کی درخواست قبول نہیں کی", + "Increasing the fare might attract more drivers. Would you like to increase the price?": + "کرایہ بڑھانے سے مزید ڈرائیور متوجہ ہو سکتے ہیں۔ کیا آپ قیمت بڑھانا چاہیں گے؟", + "Please make sure not to leave any personal belongings in the car.": + "براہ کرم یقینی بنائیں کہ گاڑی میں کوئی ذاتی سامان نہ چھوڑیں۔", + "Cancel Ride": "سفر منسوخ کریں", + "Route Not Found": "روٹ نہیں ملا", + "We couldn't find a valid route to this destination. Please try selecting a different point.": + "ہمیں اس منزل کے لیے کوئی درست راستہ نہیں ملا۔ براہ کرم کوئی اور پوائنٹ منتخب کریں۔", + "You can call or record audio during this trip.": + "آپ اس سفر کے دوران کال یا آڈیو ریکارڈ کر سکتے ہیں۔", + "Warning: Speeding detected!": "انتباہ: تیز رفتاری کا پتہ چلا!", + "Comfort": "آرام دہ (Comfort)", + "Intaleq Balance": "Intaleq بیلنس", + "Electric": "الیکٹرک", + "Lady": "خواتین", + "Van": "وین", + "Rayeh Gai": "آنا جانا (Round Trip)", + "Join Intaleq as a driver using my referral code!": + "میرے ریفرل کوڈ کا استعمال کرتے ہوئے بطور ڈرائیور Intaleq میں شامل ہوں!", + "Use code:": "کوڈ استعمال کریں:", + "Download the Intaleq Driver app now and earn rewards!": + "ابھی Intaleq ڈرائیور ایپ ڈاؤن لوڈ کریں اور انعامات حاصل کریں!", + "Get a discount on your first Intaleq ride!": + "اپنی پہلی Intaleq سواری پر رعایت حاصل کریں!", + "Use my referral code:": "میرا ریفرل کوڈ استعمال کریں:", + "Download the Intaleq app now and enjoy your ride!": + "ابھی Intaleq ایپ ڈاؤن لوڈ کریں اور اپنی سواری کا لطف اٹھائیں!", + "Contacts Loaded": "رابطے لوڈ ہو گئے", + "Showing": "دکھا رہا ہے", + "of": "میں سے", + "Customer not found": "کسٹمر نہیں ملا", + "Wallet is blocked": "والٹ بلاک ہے", + "Customer phone is not active": "کسٹمر کا فون ایکٹو نہیں ہے", + "Balance not enough": "بیلنس کافی نہیں ہے", + "Balance limit exceeded": "بیلنس کی حد سے تجاوز", + "Incorrect sms code": "⚠️ غلط SMS کوڈ۔ براہ کرم دوبارہ کوشش کریں۔", + "contacts. Others were hidden because they don't have a phone number.": + "رابطے۔ دیگر چھپا دیے گئے کیونکہ ان کا فون نمبر نہیں ہے۔", + "No contacts found": "کوئی رابطہ نہیں ملا", + "No contacts with phone numbers were found on your device.": + "آپ کے آلے پر فون نمبرز کے ساتھ کوئی رابطہ نہیں ملا۔", + "Permission denied": "اجازت مسترد کر دی گئی", + "Contact permission is required to pick contacts": + "رابطے منتخب کرنے کے لیے رابطے کی اجازت درکار ہے۔", + "An error occurred while picking contacts:": + "رابطے منتخب کرتے وقت ایک خرابی پیش آ گئی:", + "Please enter a correct phone": "براہ کرم درست فون نمبر درج کریں", + "Success": "کامیابی", + "Invite sent successfully": "دعوت نامہ کامیابی سے بھیج دیا گیا", + "Hello! I'm inviting you to try Intaleq.": + "ہیلو! میں آپ کو Intaleq آزمانے کی دعوت دے رہا ہوں۔", + "Use my invitation code to get a special gift on your first ride!": + "اپنی پہلی سواری پر خصوصی تحفہ حاصل کرنے کے لیے میرا دعوتی کوڈ استعمال کریں!", + "Your personal invitation code is:": "آپ کا ذاتی دعوتی کوڈ ہے:", + "Be sure to use it quickly! This code expires at": + "اسے جلدی استعمال کرنا یقینی بنائیں! یہ کوڈ ختم ہو جائے گا", + "Download the app now:": "ابھی ایپ ڈاؤن لوڈ کریں:", + "See you on the road!": "راستے میں ملتے ہیں!", + "This phone number has already been invited.": + "اس فون نمبر کو پہلے ہی مدعو کیا جا چکا ہے۔", + "An unexpected error occurred. Please try again.": + "ایک غیر متوقع خرابی پیش آ گئی۔ براہ کرم دوبارہ کوشش کریں۔", + "You deserve the gift": "آپ تحفے کے مستحق ہیں", + "Claim your 20 LE gift for inviting": + "دعوت دینے پر اپنا 20 روپے کا تحفہ حاصل کریں", + "You have got a gift for invitation": + "آپ کو دعوت دینے پر تحفہ ملا ہے", + "You have earned 20": "آپ نے 20 کمائے ہیں", + "LE": "روپیہ", + "Vibration feedback for all buttons": + "تمام بٹنوں کے لیے وائبریشن فیڈبیک", + "Share with friends and earn rewards": + "دوستوں کے ساتھ شیئر کریں اور انعامات حاصل کریں", + "Gift Already Claimed": "تحفہ پہلے ہی حاصل کیا جا چکا ہے", + "You have already received your gift for inviting": + "آپ دعوت دینے کے لیے اپنا تحفہ پہلے ہی وصول کر چکے ہیں", + "Keep it up!": "جاری رکھیں!", + "has completed": "مکمل کر لیا ہے", + "trips": "سفر", + "Personal Information": "ذاتی معلومات", + "Name": "نام", + "Not set": "سیٹ نہیں", + "Gender": "جنس", + "Education": "تعلیم", + "Work & Contact": "کام اور رابطہ", + "Employment Type": "روزگار کی قسم", + "Marital Status": "ازدواجی حیثیت", + "SOS Phone": "SOS فون", + "Sign Out": "سائن آؤٹ", + "Delete My Account": "میرا اکاؤنٹ ڈیلیٹ کریں", + "Update Gender": "جنس اپ ڈیٹ کریں", + "Update": "اپ ڈیٹ", + "Update Education": "تعلیم اپ ڈیٹ کریں", + "Are you sure? This action cannot be undone.": + "کیا آپ کو یقین ہے؟ یہ عمل واپس نہیں کیا جا سکتا۔", + "Confirm your Email": "اپنے ای میل کی تصدیق کریں", + "Type your Email": "اپنا ای میل لکھیں", + "Delete Permanently": "مستقل طور پر ڈیلیٹ کریں", + "Male": "مرد", + "Female": "عورت", + "High School Diploma": "ہائی اسکول ڈپلومہ", + "Associate Degree": "ایسوسی ایٹ ڈگری", + "Bachelor's Degree": "بیچلر ڈگری", + "Master's Degree": "ماسٹر ڈگری", + "Doctoral Degree": "ڈاکٹریٹ ڈگری", + "Select your preferred language for the app interface.": + "ایپ انٹرفیس کے لیے اپنی پسندیدہ زبان منتخب کریں۔", + "Language Options": "زبان کے اختیارات", + "You can claim your gift once they complete 2 trips.": + "جب وہ 2 سفر مکمل کر لیں تو آپ اپنا تحفہ حاصل کر سکتے ہیں۔", + "Closest & Cheapest": "سب سے قریب اور سستا", + "Comfort choice": "آرام دہ انتخاب", + "Travel in a modern, silent electric car. A premium, eco-friendly choice for a smooth ride.": + "جدید، خاموش الیکٹرک کار میں سفر کریں۔ ایک پریمیم، ماحول دوست انتخاب۔", + "Spacious van service ideal for families and groups. Comfortable, safe, and cost-effective travel together.": + "خاندانوں اور گروپوں کے لیے کشادہ وین سروس۔ آرام دہ، محفوظ اور کم خرچ۔", + "Quiet & Eco-Friendly": "خاموش اور ماحول دوست", + "Lady Captain for girls": "خواتین کے لیے لیڈی کیپٹن", + "Van for familly": "فیملی کے لیے وین", + "Are you sure to delete this location?": + "کیا آپ واقعی اس لوکیشن کو ڈیلیٹ کرنا چاہتے ہیں؟", + "Submit a Complaint": "شکایت درج کریں", + "Submit Complaint": "شکایت جمع کرائیں", + "No trip history found": "کوئی سفری تاریخ نہیں ملی", + "Your past trips will appear here.": + "آپ کے پچھلے سفر یہاں ظاہر ہوں گے۔", + "1. Describe Your Issue": "1. اپنا مسئلہ بیان کریں", + "Enter your complaint here...": "اپنی شکایت یہاں لکھیں...", + "2. Attach Recorded Audio": "2. ریکارڈ شدہ آڈیو منسلک کریں", + "No audio files found.": "کوئی آڈیو فائل نہیں ملی۔", + "Confirm Attachment": "منسلک کرنے کی تصدیق کریں", + "Attach this audio file?": "کیا یہ آڈیو فائل منسلک کریں؟", + "Uploaded": "اپ لوڈ ہو گیا", + "3. Review Details & Response": "3. تفصیلات اور جواب کا جائزہ لیں", + "Date": "تاریخ", + "Today's Promos": "آج کے پروموز", + "No promos available right now.": "ابھی کوئی پرومو دستیاب نہیں ہے۔", + "Check back later for new offers!": + "نئی پیشکشوں کے لیے بعد میں دوبارہ چیک کریں!", + "Valid Until:": "تک درست:", + "CODE": "کوڈ", + "I Agree": "میں متفق ہوں", + "Continue": "جاری رکھیں", + "Enable Location": "لوکیشن آن کریں", + "To give you the best experience, we need to know where you are. Your location is used to find nearby captains and for pickups.": + "بہترین تجربہ دینے کے لیے ہمیں آپ کی لوکیشن جاننے کی ضرورت ہے۔ آپ کی لوکیشن قریبی کپتانوں کو تلاش کرنے کے لیے استعمال ہوتی ہے۔", + "Allow Location Access": "لوکیشن تک رسائی کی اجازت دیں", + "Welcome to Intaleq!": "Intaleq میں خوش آمدید!", + "Before we start, please review our terms.": + "شروع کرنے سے پہلے، براہ کرم ہماری شرائط کا جائزہ لیں۔", + "Your journey starts here": "آپ کا سفر یہاں سے شروع ہوتا ہے", + "Cancel Search": "تلاش منسوخ کریں", + "Set pickup location": "پک اپ لوکیشن سیٹ کریں", + "Move the map to adjust the pin": + "پن کو ایڈجسٹ کرنے کے لیے نقشہ منتقل کریں", + "Searching for the nearest captain...": + "قریب ترین کپتان کی تلاش جاری ہے...", + "No one accepted? Try increasing the fare.": + "کسی نے قبول نہیں کیا؟ کرایہ بڑھانے کی کوشش کریں۔", + "Increase Your Trip Fee (Optional)": "اپنی ٹرپ فیس بڑھائیں (اختیاری)", + "We haven't found any drivers yet. Consider increasing your trip fee to make your offer more attractive to drivers.": + "ہمیں ابھی تک کوئی ڈرائیور نہیں ملا۔ اپنی پیشکش کو ڈرائیوروں کے لیے پرکشش بنانے کے لیے ٹرپ فیس بڑھانے پر غور کریں۔", + "No, thanks": "نہیں، شکریہ", + "Increase Fee": "فیس بڑھائیں", + "Copy": "کاپی", + "Promo Copied!": "پرمو کاپی ہو گیا!", + "Code": "کوڈ", + "Send Intaleq app to him": "اسے Intaleq ایپ بھیجیں", + "No passenger found for the given phone number": + "دیے گئے فون نمبر کے لیے کوئی مسافر نہیں ملا", + "No user found for the given phone number": + "دیے گئے فون نمبر کے لیے کوئی صارف نہیں ملا", + "This price is": "یہ قیمت ہے", + "Work": "کام", + "Add Home": "گھر شامل کریں", + "Notifications": "اطلاعات", + "💳 Pay with Credit Card": "💳 کریڈٹ کارڈ سے ادائیگی کریں", + "⚠️ You need to choose an amount!": + "⚠️ آپ کو ایک رقم منتخب کرنے کی ضرورت ہے!", + "💰 Pay with Wallet": "💰 والٹ سے ادائیگی کریں", + "You must restart the app to change the language.": + "زبان تبدیل کرنے کے لیے آپ کو ایپ دوبارہ شروع کرنی چاہیے۔", + "joined": "شامل ہوا", + "Driver joined the channel": "ڈرائیور چینل میں شامل ہو گیا", + "Driver left the channel": "ڈرائیور نے چینل چھوڑ دیا", + "Call Page": "کال پیج", + "Call Left": "بقیہ کالز", + " Next as Cash !": " اگلا نقد کے طور پر!", + "To use Wallet charge it": "والٹ استعمال کرنے کے لیے اسے چارج کریں", + "We are searching for the nearest driver to you": + "ہم آپ کے قریب ترین ڈرائیور کو تلاش کر رہے ہیں", + "Best choice for cities": "شہروں کے لیے بہترین انتخاب", + "Rayeh Gai: Round trip service for convenient travel between cities, easy and reliable.": + "آنا جانا: شہروں کے درمیان آسان سفر کے لیے راؤنڈ ٹرپ سروس، آسان اور قابل اعتماد۔", + "This trip is for women only": "یہ سفر صرف خواتین کے لیے ہے", + "Total budgets on month": "مہینے کا کل بجٹ", + "You have call from driver": "ڈرائیور کی کال ہے", + "Intaleq": "Intaleq", + "passenger agreement": "مسافر معاہدہ", + "To become a passenger, you must review and agree to the ": + "مسافر بننے کے لیے، آپ کو جائزہ لینا ہوگا اور اتفاق کرنا ہوگا ", + "agreement subtitle": + "جاری رکھنے کے لیے، آپ کو استعمال کی شرائط اور رازداری کی پالیسی کا جائزہ لینا اور اتفاق کرنا چاہیے۔", + "terms of use": "استعمال کی شرائط", + " and acknowledge our Privacy Policy.": + " اور ہماری رازداری کی پالیسی کو تسلیم کریں۔", + "and acknowledge our": "اور تسلیم کریں ہماری", + "privacy policy": "رازداری کی پالیسی۔", + "i agree": "میں متفق ہوں", + "Driver already has 2 trips within the specified period.": + "مقررہ مدت میں ڈرائیور کے پاس پہلے ہی 2 سفر ہیں۔", + "The invitation was sent successfully": + "دعوت نامہ کامیابی سے بھیج دیا گیا", + "You should select your country": "آپ کو اپنا ملک منتخب کرنا چاہیے", + "Scooter": "سکوٹر", + "A trip with a prior reservation, allowing you to choose the best captains and cars.": + "پیشگی ریزرویشن کے ساتھ سفر، جو آپ کو بہترین کپتانوں اور کاروں کا انتخاب کرنے کی اجازت دیتا ہے۔", + "Mishwar Vip": "مشوار VIP", + "The driver waiting you in picked location .": + "ڈرائیور منتخب جگہ پر آپ کا انتظار کر رہا ہے۔", + "About Us": "ہمارے بارے میں", + "You can change the vibration feedback for all buttons": + "آپ تمام بٹنوں کے لیے وائبریشن فیڈبیک تبدیل کر سکتے ہیں", + "Most Secure Methods": "انتہائی محفوظ طریقے", + "In-App VOIP Calls": "ان-ایپ VOIP کالز", + "Recorded Trips for Safety": "حفاظت کے لیے ریکارڈ شدہ سفر", + "\nWe also prioritize affordability, offering competitive pricing to make your rides accessible.": + "\nہم سستی کو بھی ترجیح دیتے ہیں، مسابقتی قیمتوں کی پیشکش کرتے ہیں تاکہ آپ کی سواریوں کو قابل رسائی بنایا جا سکے۔", + "Intaleq is a ride-sharing app designed with your safety and affordability in mind. We connect you with reliable drivers in your area, ensuring a convenient and stress-free travel experience.\n\nHere are some of the key features that set us apart:": + "Intaleq ایک رائیڈ شیئرنگ ایپ ہے جو آپ کی حفاظت اور سستی کو مدنظر رکھتے ہوئے ڈیزائن کی گئی ہے۔ ہم آپ کو آپ کے علاقے میں قابل اعتماد ڈرائیوروں سے جوڑتے ہیں۔", + "Sign In by Apple": "ایپل کے ذریعے سائن ان کریں", + "Sign In by Google": "گوگل کے ذریعے سائن ان کریں", + "How do I request a ride?": "میں سواری کی درخواست کیسے کروں؟", + "Step-by-step instructions on how to request a ride through the Intaleq app.": + "Intaleq ایپ کے ذریعے سواری کی درخواست کرنے کے طریقے پر مرحلہ وار ہدایات۔", + "What types of vehicles are available?": + "کس قسم کی گاڑیاں دستیاب ہیں؟", + "Intaleq offers a variety of vehicle options to suit your needs, including economy, comfort, and luxury. Choose the option that best fits your budget and passenger count.": + "Intaleq آپ کی ضروریات کے مطابق گاڑیوں کے مختلف آپشنز پیش کرتا ہے۔", + "How can I pay for my ride?": + "میں اپنی سواری کے لیے ادائیگی کیسے کر سکتا ہوں؟", + "Intaleq offers multiple payment methods for your convenience. Choose between cash payment or credit/debit card payment during ride confirmation.": + "Intaleq آپ کی سہولت کے لیے ادائیگی کے متعدد طریقے پیش کرتا ہے۔", + "Can I cancel my ride?": "کیا میں اپنی سواری منسوخ کر سکتا ہوں؟", + "Yes, you can cancel your ride under certain conditions (e.g., before driver is assigned). See the Intaleq cancellation policy for details.": + "جی ہاں، آپ کچھ شرائط کے تحت اپنی سواری منسوخ کر سکتے ہیں (مثلاً ڈرائیور تفویض ہونے سے پہلے)۔ تفصیلات کے لیے انطلق کی منسوخی کی پالیسی دیکھیں۔", + "Driver Registration & Requirements": "ڈرائیور رجسٹریشن اور تقاضے", + "How can I register as a driver?": + "میں بطور ڈرائیور کیسے رجسٹر ہو سکتا ہوں؟", + "What are the requirements to become a driver?": + "ڈرائیور بننے کے لیے کیا تقاضے ہیں؟", + "Visit our website or contact Intaleq support for information on driver registration and requirements.": + "ڈرائیور رجسٹریشن اور تقاضوں کے بارے میں معلومات کے لیے ہماری ویب سائٹ ملاحظہ کریں یا سپورٹ سے رابطہ کریں۔", + "Intaleq provides in-app chat functionality to allow you to communicate with your driver or passenger during your ride.": + "Intaleq ان-ایپ چیٹ کی فعالیت فراہم کرتا ہے۔", + "Intaleq prioritizes your safety. We offer features like driver verification, in-app trip tracking, and emergency contact options.": + "Intaleq آپ کی حفاظت کو ترجیح دیتا ہے۔", + "Frequently Questions": "اکثر پوچھے گئے سوالات", + "User does not exist.": "صارف موجود نہیں ہے۔", + "We need your phone number to contact you and to help you.": + "ہمیں آپ سے رابطہ کرنے اور آپ کی مدد کرنے کے لیے آپ کے فون نمبر کی ضرورت ہے۔", + "You will recieve code in sms message": + "آپ کو SMS پیغام میں کوڈ موصول ہوگا", + "Please enter": "براہ کرم درج کریں", + "We need your phone number to contact you and to help you receive orders.": + "ہمیں آپ سے رابطہ کرنے اور آرڈرز وصول کرنے میں آپ کی مدد کرنے کے لیے آپ کے فون نمبر کی ضرورت ہے۔", + "The full name on your criminal record does not match the one on your driver's license. Please verify and provide the correct documents.": + "آپ کے پولیس ریکارڈ پر موجود پورا نام آپ کے ڈرائیونگ لائسنس سے میل نہیں کھاتا۔", + "The national number on your driver's license does not match the one on your ID document. Please verify and provide the correct documents.": + "آپ کے ڈرائیونگ لائسنس پر قومی نمبر آپ کے شناختی کارڈ سے میل نہیں کھاتا۔", + "Capture an Image of Your Criminal Record": + "اپنے پولیس کلیئرنس کی تصویر لیں", + "IssueDate": "اجراء کی تاریخ", + "Capture an Image of Your car license front": + "اپنی گاڑی کی رجسٹریشن کے سامنے کی تصویر لیں", + "Capture an Image of Your ID Document front": + "اپنے شناختی کارڈ کے سامنے کی تصویر لیں", + "NationalID": "شناختی کارڈ نمبر", + "You can share the Intaleq App with your friends and earn rewards for rides they take using your code": + "آپ Intaleq ایپ کو اپنے دوستوں کے ساتھ شیئر کر سکتے ہیں اور انعامات حاصل کر سکتے ہیں", + "FullName": "پورا نام", + "No invitation found yet!": "ابھی تک کوئی دعوت نامہ نہیں ملا!", + "InspectionResult": "معائنے کا نتیجہ", + "Criminal Record": "پولیس کلیئرنس", + "The email or phone number is already registered.": + "ای میل یا فون نمبر پہلے سے رجسٹرڈ ہے۔", + "To become a ride-sharing driver on the Intaleq app, you need to upload your driver's license, ID document, and car registration document. Our AI system will instantly review and verify their authenticity in just 2-3 minutes. If your documents are approved, you can start working as a driver on the Intaleq app. Please note, submitting fraudulent documents is a serious offense and may result in immediate termination and legal consequences.": + "ڈرائیور بننے کے لیے، آپ کو اپنا ڈرائیونگ لائسنس، شناختی دستاویز، اور گاڑی کی رجسٹریشن دستاویز اپ لوڈ کرنے کی ضرورت ہے۔", + "Documents check": "دستاویزات کی جانچ", + "Driver's License": "ڈرائیونگ لائسنس", + "for your first registration!": "آپ کی پہلی رجسٹریشن کے لیے!", + "Get it Now!": "ابھی حاصل کریں!", + "before": "پہلے", + "Code not approved": "کوڈ منظور نہیں ہوا", + "3000 LE": "3000 روپیہ", + "Do you have an invitation code from another driver?": + "کیا آپ کے پاس کسی دوسرے ڈرائیور کا دعوتی کوڈ ہے؟", + "Paste the code here": "کوڈ یہاں پیسٹ کریں", + "No, I don't have a code": "نہیں، میرے پاس کوڈ نہیں ہے", + "Audio uploaded successfully.": "آڈیو کامیابی سے اپ لوڈ ہو گئی۔", + "Perfect for passengers seeking the latest car models with the freedom to choose any route they desire": + "جدید ترین کار ماڈلز کے متلاشی مسافروں کے لیے بہترین", + "Share this code with your friends and earn rewards when they use it!": + "اس کوڈ کو اپنے دوستوں کے ساتھ شیئر کریں اور انعامات حاصل کریں!", + "Enter phone": "فون درج کریں", + "complete, you can claim your gift": + "مکمل، آپ اپنا تحفہ حاصل کر سکتے ہیں", + "When": "جب", + "Enter driver's phone": "ڈرائیور کا فون درج کریں", + "Send Invite": "دعوت نامہ بھیجیں", + "Show Invitations": "دعوت نامے دکھائیں", + "License Type": "لائسنس کی قسم", + "National Number": "قومی نمبر", + "Name (Arabic)": "نام (اردو)", + "Name (English)": "نام (انگریزی)", + "Address": "پتہ", + "Issue Date": "اجراء کی تاریخ", + "Expiry Date": "میعاد ختم ہونے کی تاریخ", + "License Categories": "لائسنس کے زمرے", + "driver_license": "ڈرائیونگ لائسنس", + "Capture an Image of Your Driver License": + "اپنے ڈرائیونگ لائسنس کی تصویر لیں", + "ID Documents Back": "شناختی دستاویزات کی پشت", + "National ID": "شناختی کارڈ", + "Occupation": "پیشہ", + "Religion": "مذہب", + "Full Name (Marital)": "پورا نام", + "Expiration Date": "میعاد ختم ہونے کی تاریخ", + "Capture an Image of Your ID Document Back": + "اپنے شناختی کارڈ کی پشت کی تصویر لیں", + "ID Documents Front": "شناختی دستاویزات کا سامنے کا حصہ", + "First Name": "پہلا نام", + "CardID": "کارڈ آئی ڈی", + "Vehicle Details Front": "گاڑی کی تفصیلات سامنے", + "Plate Number": "پلیٹ نمبر", + "Owner Name": "مالک کا نام", + "Vehicle Details Back": "گاڑی کی تفصیلات پیچھے", + "Make": "میک", + "Model": "ماڈل", + "Year": "سال", + "Chassis": "چیسس", + "Color": "رنگ", + "Displacement": "ڈسپلیسمنٹ", + "Fuel": "ایندھن", + "Tax Expiry Date": "ٹیکس کی میعاد ختم ہونے کی تاریخ", + "Inspection Date": "معائنے کی تاریخ", + "Capture an Image of Your car license back": + "اپنی گاڑی کے لائسنس کی پشت کی تصویر لیں", + "Capture an Image of Your Driver's License": + "اپنے ڈرائیونگ لائسنس کی تصویر لیں", + "Sign in with Google for easier email and name entry": + "آسان ای میل اور نام کے اندراج کے لیے گوگل کے ساتھ سائن ان کریں", + "You will choose allow all the time to be ready receive orders": + "آپ آرڈرز وصول کرنے کے لیے ہر وقت اجازت کا انتخاب کریں گے", + "Get to your destination quickly and easily.": + "اپنی منزل پر تیزی اور آسانی سے پہنچیں۔", + "Enjoy a safe and comfortable ride.": + "محفوظ اور آرام دہ سواری کا لطف اٹھائیں۔", + "Choose Language": "زبان منتخب کریں", + "Pay with Wallet": "والٹ سے ادائیگی کریں", + "Invalid MPIN": "غلط MPIN", + "Invalid OTP": "غلط OTP", + "Enter your email address": "اپنا ای میل ایڈریس درج کریں", + "Please enter Your Email.": "براہ کرم اپنا ای میل درج کریں۔", + "Enter your phone number": "اپنا فون نمبر درج کریں", + "Please enter your phone number.": "براہ کرم اپنا فون نمبر درج کریں۔", + "Please enter Your Password.": "براہ کرم اپنا پاس ورڈ درج کریں۔", + "if you dont have account": "اگر آپ کا اکاؤنٹ نہیں ہے", + "Register": "رجسٹر کریں", + "Accept Ride's Terms & Review Privacy Notice": + "سفر کی شرائط قبول کریں اور رازداری کا نوٹس دیکھیں", + "By selecting 'I Agree' below, I have reviewed and agree to the Terms of Use and acknowledge the Privacy Notice. I am at least 18 years of age.": + "نیچے 'میں متفق ہوں' کو منتخب کر کے، میں نے استعمال کی شرائط کا جائزہ لیا ہے اور ان سے اتفاق کرتا ہوں۔", + "First name": "پہلا نام", + "Enter your first name": "اپنا پہلا نام درج کریں", + "Please enter your first name.": "براہ کرم اپنا پہلا نام درج کریں۔", + "Last name": "آخری نام", + "Enter your last name": "اپنا آخری نام درج کریں", + "Please enter your last name.": "براہ کرم اپنا آخری نام درج کریں۔", + "City": "شہر", + "Please enter your City.": "براہ کرم اپنا شہر درج کریں۔", + "Verify Email": "ای میل کی تصدیق کریں", + "We sent 5 digit to your Email provided": + "ہم نے آپ کے فراہم کردہ ای میل پر 5 ہندسے بھیجے ہیں", + "5 digit": "5 ہندسے", + "Send Verification Code": "تصدیقی کوڈ بھیجیں", + "Your Ride Duration is ": "آپ کی سواری کا دورانیہ ہے ", + "You will be thier in": "آپ وہاں ہوں گے میں", + "You trip distance is": "آپ کے سفر کا فاصلہ ہے", + "Fee is": "فیس ہے", + "From : ": "سے: ", + "To : ": "تک: ", + "Add Promo": "پرومو شامل کریں", + "Confirm Selection": "انتخاب کی تصدیق کریں", + "distance is": "فاصلہ ہے", + "Privacy Policy": "رازداری کی پالیسی", + "Intaleq LLC": "Intaleq LLC", + "Syria's pioneering ride-sharing service, proudly developed by Arabian and local owners. We prioritize being near you – both our valued passengers and our dedicated captains.": + "پاکستان کی صف اول کی رائیڈ شیئرنگ سروس۔", + "Intaleq is the first ride-sharing app in Syria, designed to connect you with the nearest drivers for a quick and convenient travel experience.": + "Intaleq پہلی رائیڈ شیئرنگ ایپ ہے جو آپ کو قریب ترین ڈرائیوروں سے جوڑتی ہے۔", + "Why Choose Intaleq?": "Intaleq کا انتخاب کیوں کریں؟", + "Closest to You": "آپ کے قریب ترین", + "We connect you with the nearest drivers for faster pickups and quicker journeys.": + "ہم آپ کو تیز تر پک اپ کے لیے قریب ترین ڈرائیوروں سے جوڑتے ہیں۔", + "Uncompromising Security": "غیر متزلزل سیکیورٹی", + "Lady Captains Available": "خواتین کپتان دستیاب ہیں", + "Recorded Trips (Voice & AI Analysis)": + "ریکارڈ شدہ سفر (آواز اور AI تجزیہ)", + "Fastest Complaint Response": "تیز ترین شکایت کا جواب", + "Our dedicated customer service team ensures swift resolution of any issues.": + "ہماری کسٹمر سروس ٹیم مسائل کے فوری حل کو یقینی بناتی ہے۔", + "Affordable for Everyone": "ہر ایک کے لیے سستا", + "Frequently Asked Questions": "اکثر پوچھے گئے سوالات", + "Getting Started": "شروع کرنا", + "Simply open the Intaleq app, enter your destination, and tap \"Request Ride\". The app will connect you with a nearby driver.": + "بس ایپ کھولیں، منزل درج کریں اور 'سواری کی درخواست کریں' پر ٹیپ کریں۔", + "Vehicle Options": "گاڑی کے اختیارات", + "Intaleq offers a variety of options including Economy, Comfort, and Luxury to suit your needs and budget.": + "Intaleq اکانومی، کمفرٹ اور لگژری سمیت مختلف آپشنز پیش کرتا ہے۔", + "Payments": "ادائیگیاں", + "You can pay for your ride using cash or credit/debit card. You can select your preferred payment method before confirming your ride.": + "آپ نقد یا کارڈ کے ذریعے ادائیگی کر سکتے ہیں۔", + "Ride Management": "سفر کا انتظام", + "Yes, you can cancel your ride, but please note that cancellation fees may apply depending on how far in advance you cancel.": + "جی ہاں، آپ منسوخ کر سکتے ہیں، لیکن منسوخی کی فیس لاگو ہو سکتی ہے۔", + "For Drivers": "ڈرائیوروں کے لیے", + "Driver Registration": "ڈرائیور رجسٹریشن", + "To register as a driver or learn about the requirements, please visit our website or contact Intaleq support directly.": + "رجسٹر کرنے کے لیے ویب سائٹ ملاحظہ کریں یا سپورٹ سے رابطہ کریں۔", + "Visit Website/Contact Support": + "ویب سائٹ ملاحظہ کریں / سپورٹ سے رابطہ کریں", + "Close": "بند کریں", + "We are searching for the nearest driver": + "ہم قریب ترین ڈرائیور تلاش کر رہے ہیں", + "Communication": "مواصلات", + "How do I communicate with the other party (passenger/driver)?": + "میں دوسرے فریق سے کیسے بات کروں؟", + "You can communicate with your driver or passenger through the in-app chat feature once a ride is confirmed.": + "سفر کی تصدیق ہونے پر آپ ایپ میں چیٹ کر سکتے ہیں۔", + "Safety & Security": "حفاظت اور سیکیورٹی", + "What safety measures does Intaleq offer?": + "Intaleq کون سے حفاظتی اقدامات پیش کرتا ہے؟", + "Intaleq offers various safety features including driver verification, in-app trip tracking, emergency contact options, and the ability to share your trip status with trusted contacts.": + "Intaleq ڈرائیور کی تصدیق اور ٹرپ ٹریکنگ پیش کرتا ہے۔", + "Enjoy competitive prices across all trip options, making travel accessible.": + "مسابقتی قیمتوں کا لطف اٹھائیں۔", + "Variety of Trip Choices": "سفر کے انتخاب کی اقسام", + "Choose the trip option that perfectly suits your needs and preferences.": + "وہ آپشن منتخب کریں جو آپ کے لیے موزوں ہو۔", + "Your Choice, Our Priority": "آپ کا انتخاب، ہماری ترجیح", + "Because we are near, you have the flexibility to choose the ride that works best for you.": + "چونکہ ہم قریب ہیں، آپ کے پاس انتخاب کی لچک ہے۔", + "duration is": "دورانیہ ہے", + "Setting": "سیٹنگ", + "Find answers to common questions": "عام سوالات کے جوابات تلاش کریں", + "I don't need a ride anymore": "مجھے اب سواری کی ضرورت نہیں ہے", + "I was just trying the application": "میں صرف ایپلیکیشن آزما رہا تھا", + "No driver accepted my request": + "کسی ڈرائیور نے میری درخواست قبول نہیں کی", + "I added the wrong pick-up/drop-off location": + "میں نے غلط لوکیشن شامل کی", + "I don't have a reason": "میرے پاس کوئی وجہ نہیں ہے", + "Can we know why you want to cancel Ride ?": + "کیا ہم جان سکتے ہیں کہ آپ کیوں منسوخ کرنا چاہتے ہیں؟", + "Add Payment Method": "ادائیگی کا طریقہ شامل کریں", + "Ride Wallet": "سفر والٹ", + "Payment Method": "ادائیگی کا طریقہ", + "Type here Place": "یہاں جگہ لکھیں", + "Are You sure to ride to": "کیا آپ واقعی جانا چاہتے ہیں", + "Confirm": "تصدیق کریں", + "You are Delete": "آپ حذف کر رہے ہیں", + "Deleted": "حذف کر دیا گیا", + "You Dont Have Any places yet !": + "ابھی تک آپ کے پاس کوئی جگہ نہیں ہے!", + "From : Current Location": "سے: موجودہ لوکیشن", + "My Cared": "میرے کارڈز", + "Add Card": "کارڈ شامل کریں", + "Add Credit Card": "کریڈٹ کارڈ شامل کریں", + "Please enter the cardholder name": + "براہ کرم کارڈ ہولڈر کا نام درج کریں", + "Please enter the expiry date": + "براہ کرم میعاد ختم ہونے کی تاریخ درج کریں", + "Please enter the CVV code": "براہ کرم CVV کوڈ درج کریں", + "Go To Favorite Places": "پسندیدہ مقامات پر جائیں", + "Go to this Target": "اس ہدف پر جائیں", + "My Profile": "میرا پروفائل", + "Are you want to go to this site": "کیا آپ اس جگہ جانا چاہتے ہیں", + "MyLocation": "میری لوکیشن", + "my location": "میری لوکیشن", + "Target": "ہدف", + "You Should choose rate figure": "آپ کو ریٹنگ کا انتخاب کرنا چاہیے", + "Login Captin": "کپتان لاگ ان", + "Register Captin": "کپتان رجسٹر", + "Send Verfication Code": "تصدیقی کوڈ بھیجیں", + "KM": "کلو میٹر", + "End Ride": "سفر ختم کریں", + "Minute": "منٹ", + "Go to passenger Location now": "اب مسافر کی لوکیشن پر جائیں", + "Duration of the Ride is ": "سفر کا دورانیہ ہے ", + "Distance of the Ride is ": "سفر کا فاصلہ ہے ", + "Name of the Passenger is ": "مسافر کا نام ہے ", + "Hello this is Captain": "ہیلو یہ کپتان ہے", + "Start the Ride": "سفر شروع کریں", + "Please Wait If passenger want To Cancel!": + "براہ کرم انتظار کریں اگر مسافر منسوخ کرنا چاہے!", + "Total Duration:": "کل دورانیہ:", + "Active Duration:": "فعال دورانیہ:", + "Waiting for Captin ...": "کپتان کا انتظار...", + "Age is ": "عمر ہے ", + "Rating is ": "ریٹنگ ہے ", + " to arrive you.": " آپ تک پہنچنے کے لیے۔", + "Tariff": "ٹیرف", + "Settings": "ترتیبات", + "Feed Back": "فیڈ بیک", + "Please enter a valid 16-digit card number": + "براہ کرم درست 16 ہندسوں کا کارڈ نمبر درج کریں", + "Add Phone": "فون شامل کریں", + "Please enter a phone number": "براہ کرم فون نمبر درج کریں", + "You dont Add Emergency Phone Yet!": + "آپ نے ابھی تک ایمرجنسی فون شامل نہیں کیا!", + "You will arrive to your destination after ": + "آپ اپنی منزل پر پہنچیں گے بعد از ", + "You can cancel Ride now": "آپ اب سواری منسوخ کر سکتے ہیں", + "You Can cancel Ride After Captain did not come in the time": + "اگر کپتان وقت پر نہیں آیا تو آپ سواری منسوخ کر سکتے ہیں", + "If you in Car Now. Press Start The Ride": + "اگر آپ کار میں ہیں تو سفر شروع کریں دبائیں", + "You Dont Have Any amount in": "آپ کے پاس کوئی رقم نہیں ہے میں", + "Wallet!": "والٹ!", + "You Have": "آپ کے پاس ہے", + "Save Credit Card": "کریڈٹ کارڈ محفوظ کریں", + "Show Promos": "پروموز دکھائیں", + "10 and get 4% discount": "10 اور 4% ڈسکاؤنٹ حاصل کریں", + "20 and get 6% discount": "20 اور 6% ڈسکاؤنٹ حاصل کریں", + "40 and get 8% discount": "40 اور 8% ڈسکاؤنٹ حاصل کریں", + "100 and get 11% discount": "100 اور 11% ڈسکاؤنٹ حاصل کریں", + "Pay with Your PayPal": "اپنے پے پال سے ادائیگی کریں", + "You will choose one of above !": + "آپ کو اوپر والوں میں سے ایک کا انتخاب کرنا ہوگا!", + "Edit Profile": "پروفائل میں ترمیم کریں", + "Copy this Promo to use it in your Ride!": + "اپنی سواری میں استعمال کرنے کے لیے اس پرومو کو کاپی کریں!", + "To change some Settings": "کچھ ترتیبات تبدیل کرنے کے لیے", + "Order Request Page": "آرڈر کی درخواست کا صفحہ", + "Rouats of Trip": "سفر کے راستے", + "Passenger Name is ": "مسافر کا نام ہے ", + "Total From Passenger is ": "مسافر سے کل: ", + "Duration To Passenger is ": "مسافر تک دورانیہ ہے ", + "Distance To Passenger is ": "مسافر تک فاصلہ ہے ", + "Total For You is ": "آپ کے لیے کل: ", + "Distance is ": "فاصلہ ہے ", + " KM": " کلو میٹر", + "Duration of Trip is ": "سفر کا دورانیہ ہے ", + " Minutes": " منٹ", + "Apply Order": "آرڈر لاگو کریں", + "Refuse Order": "آرڈر مسترد کریں", + "Rate Captain": "کپتان کو ریٹ کریں", + "Enter your Note": "اپنا نوٹ درج کریں", + "Type something...": "کچھ لکھیں...", + "Submit rating": "ریٹنگ جمع کرائیں", + "Rate Passenger": "مسافر کو ریٹ کریں", + "Ride Summary": "سواری کا خلاصہ", + "welcome_message": "Intaleq میں خوش آمدید!", + "app_description": + "Intaleq ایک محفوظ، قابل اعتماد، اور قابل رسائی رائیڈ ہیلنگ ایپ ہے۔", + "get_to_destination": "اپنی منزل پر تیزی اور آسانی سے پہنچیں۔", + "get_a_ride": + "Intaleq کے ساتھ، آپ منٹوں میں منزل تک سواری حاصل کر سکتے ہیں۔", + "safe_and_comfortable": "محفوظ اور آرام دہ سواری کا لطف اٹھائیں۔", + "committed_to_safety": "Intaleq حفاظت کے لیے پرعزم ہے۔", + "your ride is Accepted": "آپ کی سواری قبول کر لی گئی ہے", + "Driver is waiting at pickup.": "ڈرائیور پک اپ پر انتظار کر رہا ہے۔", + "Driver is on the way": "ڈرائیور راستے میں ہے", + "Contact Options": "رابطے کے اختیارات", + "Send a custom message": "حسب ضرورت پیغام بھیجیں", + "Type your message": "اپنا پیغام ٹائپ کریں", + "I will go now": "میں اب جاؤں گا", + "You Have Tips": "آپ کے پاس ٹپس ہیں", + " tips\nTotal is": " ٹپس\nکل ہے", + "Your fee is ": "آپ کی فیس ہے ", + "Do you want to pay Tips for this Driver": + "کیا آپ اس ڈرائیور کے لیے ٹپ ادا کرنا چاہتے ہیں", + "Tip is ": "ٹپ ہے ", + "Are you want to wait drivers to accept your order": + "کیا آپ چاہتے ہیں کہ ڈرائیورز آپ کا آرڈر قبول کرنے کا انتظار کریں", + "This price is fixed even if the route changes for the driver.": + "یہ قیمت مقررہ ہے چاہے ڈرائیور کا راستہ بدل جائے۔", + "The price may increase if the route changes.": + "اگر راستہ بدل گیا تو قیمت بڑھ سکتی ہے۔", + "The captain is responsible for the route.": + "کپتان راستے کا ذمہ دار ہے۔", + "We are search for nearst driver": "ہم قریبی ڈرائیور تلاش کر رہے ہیں", + "Your order is being prepared": "آپ کا آرڈر تیار ہو رہا ہے", + "The drivers are reviewing your request": + "ڈرائیورز آپ کی درخواست کا جائزہ لے رہے ہیں", + "Your order sent to drivers": "آپ کا آرڈر ڈرائیورز کو بھیج دیا گیا", + "You can call or record audio of this trip": + "آپ اس سفر کی کال یا آڈیو ریکارڈ کر سکتے ہیں", + "The trip has started! Feel free to contact emergency numbers, share your trip, or activate voice recording for the journey": + "سفر شروع ہو گیا ہے! بلا جھجھک ایمرجنسی نمبرز سے رابطہ کریں، اپنا سفر شیئر کریں، یا سفر کے لیے وائس ریکارڈنگ فعال کریں۔", + "Camera Access Denied.": "کیمرے تک رسائی مسترد کر دی گئی۔", + "Open Settings": "ترتیبات کھولیں", + "GPS Required Allow !.": "GPS کی اجازت درکار ہے!.", + "Your Account is Deleted": "آپ کا اکاؤنٹ حذف کر دیا گیا ہے", + "Are you sure to delete your account?": + "کیا آپ واقعی اپنا اکاؤنٹ حذف کرنا چاہتے ہیں؟", + "Your data will be erased after 2 weeks\nAnd you will can't return to use app after 1 month ": + "آپ کا ڈیٹا 2 ہفتوں بعد مٹا دیا جائے گا\nاور آپ 1 ماہ بعد ایپ استعمال کرنے کے لیے واپس نہیں آ سکیں گے ", + "Enter Your First Name": "اپنا پہلا نام درج کریں", + "Are you Sure to LogOut?": "کیا آپ واقعی لاگ آؤٹ کرنا چاہتے ہیں؟", + "Email Wrong": "ای میل غلط ہے", + "Email you inserted is Wrong.": + "جو ای میل آپ نے درج کیا ہے وہ غلط ہے۔", + "You have finished all times ": "آپ نے تمام اوقات ختم کر دیے ہیں ", + "if you want help you can email us here": + "اگر آپ مدد چاہتے ہیں تو آپ ہمیں یہاں ای میل کر سکتے ہیں", + "Thanks": "شکریہ", + "Email Us": "ہمیں ای میل کریں", + "I cant register in your app in face detection ": + "میں چہرے کی شناخت میں آپ کی ایپ میں رجسٹر نہیں ہو سکتا ", + "Hi": "ہیلو", + "No face detected": "کوئی چہرہ شناخت نہیں ہوا", + "Image detecting result is ": "تصویر کی شناخت کا نتیجہ ہے ", + "from 3 times Take Attention": "3 بار سے توجہ دیں", + "Be sure for take accurate images please\nYou have": + "براہ کرم درست تصاویر لینے کا یقین کریں\nآپ کے پاس ہے", + "image verified": "تصویر کی تصدیق ہو گئی", + "Next": "اگلا", + "There is no help Question here": "یہاں کوئی مدد کا سوال نہیں ہے", + "You dont have Points": "آپ کے پاس پوائنٹس نہیں ہیں", + "You Are Stopped For this Day !": "آپ اس دن کے لیے روک دیے گئے ہیں!", + "You must be charge your Account": "آپ کو اپنا اکاؤنٹ چارج کرنا ہوگا", + "You Refused 3 Rides this Day that is the reason \nSee you Tomorrow!": + "آپ نے اس دن 3 سواریوں سے انکار کر دیا یہی وجہ ہے \nکل ملتے ہیں!", + "Recharge my Account": "میرا اکاؤنٹ ریچارج کریں", + "Ok , See you Tomorrow": "ٹھیک ہے، کل ملتے ہیں", + "You are Stopped": "آپ رکے ہوئے ہیں", + "Connected": "منسلک", + "Not Connected": "منسلک نہیں", + "Your are far from passenger location": + "آپ مسافر کی لوکیشن سے دور ہیں", + "go to your passenger location before\nPassenger cancel trip": + "مسافر کے سفر منسوخ کرنے سے پہلے\nاپنی مسافر کی لوکیشن پر جائیں", + "You will get cost of your work for this trip": + "آپ کو اس سفر کے لیے اپنے کام کی قیمت ملے گی", + " in your wallet": " آپ کے والٹ میں", + "you gain": "آپ نے حاصل کیا", + "Order Cancelled by Passenger": + "آرڈر مسافر کی طرف سے منسوخ کر دیا گیا", + "Feedback data saved successfully": + "فیڈ بیک ڈیٹا کامیابی سے محفوظ ہو گیا", + "No Promo for today .": "آج کے لیے کوئی پرومو نہیں ہے۔", + "Select your destination": "اپنی منزل منتخب کریں", + "Search for your Start point": "اپنا نقطہ آغاز تلاش کریں", + "Search for waypoint": "راستے کا نقطہ تلاش کریں", + "Current Location": "موجودہ لوکیشن", + "Add Location 1": "لوکیشن 1 شامل کریں", + "You must Verify email !.": "آپ کو ای میل کی تصدیق کرنی ہوگی!", + "Cropper": "کروپر", + "Saved Sucssefully": "کامیابی سے محفوظ ہو گیا", + "Select Date": "تاریخ منتخب کریں", + "Birth Date": "پیدائش کی تاریخ", + "Ok": "ٹھیک ہے", + "the 500 points equal 30 JOD": "500 پوائنٹس 30 روپے کے برابر ہیں", + "the 500 points equal 30 JOD for you \nSo go and gain your money": + "500 پوائنٹس آپ کے لیے 30 روپے کے برابر ہیں \nتو جائیں اور اپنے پیسے کمائیں", + "token updated": "ٹوکن اپ ڈیٹ ہو گیا", + "Add Location 2": "لوکیشن 2 شامل کریں", + "Add Location 3": "لوکیشن 3 شامل کریں", + "Add Location 4": "لوکیشن 4 شامل کریں", + "Waiting for your location": "آپ کی لوکیشن کا انتظار ہے", + "Search for your destination": "اپنی منزل تلاش کریں", + "Hi! This is": "ہیلو! یہ ہے", + " I am using": " میں استعمال کر رہا ہوں", + " to ride with": " سواری کرنے کے لیے ساتھ", + " as the driver.": " بطور ڈرائیور۔", + "is driving a ": "چلا رہا ہے ایک ", + " with license plate ": " لائسنس پلیٹ کے ساتھ ", + " I am currently located at ": " میں فی الحال یہاں واقع ہوں ", + "Please go to Car now ": "براہ کرم اب کار کے پاس جائیں ", + "You will receive a code in WhatsApp Messenger": + "آپ کو واٹس ایپ میسنجر میں ایک کوڈ موصول ہوگا", + "If you need assistance, contact us": + "اگر آپ کو مدد کی ضرورت ہو تو ہم سے رابطہ کریں", + "Promo Ended": "پرومو ختم ہو گیا", + "Enter the promo code and get": "پرومو کوڈ درج کریں اور حاصل کریں", + "DISCOUNT": "ڈسکاؤنٹ", + "No wallet record found": "کوئی والٹ ریکارڈ نہیں ملا", + "for": "کے لیے", + "Intaleq is the safest ride-sharing app that introduces many features for both captains and passengers. We offer the lowest commission rate of just 8%, ensuring you get the best value for your rides. Our app includes insurance for the best captains, regular maintenance of cars with top engineers, and on-road services to ensure a respectful and high-quality experience for all users.": + "Intaleq سب سے محفوظ رائیڈ شیئرنگ ایپ ہے جو کپتانوں اور مسافروں دونوں کے لیے بہت سی خصوصیات متعارف کراتی ہے۔", + "You can contact us during working hours from 12:00 - 19:00.": + "آپ ہم سے دفتری اوقات 12:00 - 19:00 کے دوران رابطہ کر سکتے ہیں۔", + "Choose a contact option": "رابطے کا اختیار منتخب کریں", + "Work time is from 12:00 - 19:00.\nYou can send a WhatsApp message or email.": + "کام کا وقت 12:00 - 19:00 ہے۔\nآپ واٹس ایپ پیغام یا ای میل بھیج سکتے ہیں۔", + "Promo code copied to clipboard!": + "پرومو کوڈ کلپ بورڈ پر کاپی ہو گیا!", + "Copy Code": "کوڈ کاپی کریں", + "Your invite code was successfully applied!": + "آپ کا دعوتی کوڈ کامیابی سے لاگو ہو گیا!", + "Payment Options": "ادائیگی کے اختیارات", + "wait 1 minute to receive message": + "پیغام موصول ہونے کے لیے 1 منٹ انتظار کریں", + "You have copied the promo code.": "آپ نے پرومو کوڈ کاپی کر لیا ہے۔", + "Select Payment Amount": "ادائیگی کی رقم منتخب کریں", + "The promotion period has ended.": "پروموشن کی مدت ختم ہو گئی ہے۔", + "Promo Code Accepted": "پرومو کوڈ قبول ہو گیا", + "Tap on the promo code to copy it!": + "اسے کاپی کرنے کے لیے پرومو کوڈ پر ٹیپ کریں!", + "Lowest Price Achieved": "کم ترین قیمت حاصل کی گئی", + "Cannot apply further discounts.": "مزید چھوٹ لاگو نہیں کی جا سکتی۔", + "Promo Already Used": "پرومو پہلے ہی استعمال ہو چکا ہے", + "Invitation Used": "دعوت نامہ استعمال ہو چکا ہے", + "You have already used this promo code.": + "آپ پہلے ہی یہ پرومو کوڈ استعمال کر چکے ہیں۔", + "Insert Your Promo Code": "اپنا پرومو کوڈ درج کریں", + "Enter promo code here": "پرومو کوڈ یہاں درج کریں", + "Please enter a valid promo code": + "براہ کرم ایک درست پرومو کوڈ درج کریں", + "Awfar Car": "سستی کار", + "Old and affordable, perfect for budget rides.": + "پرانی اور سستی، بجٹ سواریوں کے لیے بہترین۔", + " If you need to reach me, please contact the driver directly at": + " اگر آپ کو مجھ تک پہنچنے کی ضرورت ہو تو براہ کرم ڈرائیور سے براہ راست رابطہ کریں", + "No Car or Driver Found in your area.": + "آپ کے علاقے میں کوئی کار یا ڈرائیور نہیں ملا۔", + "Please Try anther time ": "براہ کرم کسی اور وقت کوشش کریں ", + "There no Driver Aplly your order sorry for that ": + "کوئی ڈرائیور آپ کا آرڈر اپلائی نہیں کر رہا اس کے لیے معذرت ", + "Trip Cancelled": "سفر منسوخ ہو گیا", + "The Driver Will be in your location soon .": + "ڈرائیور جلد ہی آپ کی لوکیشن پر ہوگا۔", + "The distance less than 500 meter.": "فاصلہ 500 میٹر سے کم ہے۔", + "Promo End !": "پرومو ختم!", + "There is no notification yet": "ابھی تک کوئی اطلاع نہیں ہے", + "Use Touch ID or Face ID to confirm payment": + "ادائیگی کی تصدیق کے لیے ٹچ آئی ڈی یا فیس آئی ڈی استعمال کریں", + "Contact us for any questions on your order.": + "اپنے آرڈر پر کسی بھی سوال کے لیے ہم سے رابطہ کریں۔", + "Pyament Cancelled .": "ادائیگی منسوخ ہو گئی۔", + "type here": "یہاں ٹائپ کریں", + "Scan Driver License": "ڈرائیونگ لائسنس اسکین کریں", + "Please put your licence in these border": + "براہ کرم اپنا لائسنس ان حدود میں رکھیں", + "Camera not initialized yet": "کیمرہ ابھی تک شروع نہیں ہوا", + "Take Image": "تصویر لیں", + "AI Page": "AI صفحہ", + "Take Picture Of ID Card": "شناختی کارڈ کی تصویر لیں", + "Take Picture Of Driver License Card": + "ڈرائیونگ لائسنس کارڈ کی تصویر لیں", + "We are process picture please wait ": + "ہم تصویر پر کارروائی کر رہے ہیں براہ کرم انتظار کریں ", + "There is no data yet.": "ابھی تک کوئی ڈیٹا نہیں ہے۔", + "Name :": "نام :", + "Drivers License Class: ": "ڈرائیونگ لائسنس کلاس: ", + "Document Number: ": "دستاویز نمبر: ", + "Address: ": "پتہ: ", + "Height: ": "اونچائی: ", + "Expiry Date: ": "میعاد ختم ہونے کی تاریخ: ", + "Date of Birth: ": "پیدائش کی تاریخ: ", + "You can't continue with us .\nYou should renew Driver license": + "آپ ہمارے ساتھ جاری نہیں رہ سکتے ۔\nآپ کو ڈرائیور لائسنس کی تجدید کرنی چاہیے", + "Detect Your Face ": "اپنا چہرہ شناخت کریں ", + "Go to next step\nscan Car License.": + "اگلے قدم پر جائیں\nکار لائسنس اسکین کریں۔", + "Name in arabic": "عربی میں نام", + "Drivers License Class": "ڈرائیونگ لائسنس کلاس", + "Selected Date": "منتخب کردہ تاریخ", + "Select Time": "وقت منتخب کریں", + "Selected Time": "منتخب کردہ وقت", + "Selected Date and Time": "منتخب کردہ تاریخ اور وقت", + "Lets check Car license ": "آئیے کار لائسنس چیک کریں ", + "Car": "کار", + "Plate": "پلیٹ", + "Rides": "سواریاں", + "Selected driver": "منتخب ڈرائیور", + "Lets check License Back Face": + "آئیے لائسنس کے پچھلے حصے کو چیک کریں", + "Car License Card": "کار لائسنس کارڈ", + "No image selected yet": "ابھی تک کوئی تصویر منتخب نہیں کی گئی", + "Made :": "بنایا گیا :", + "model :": "ماڈل :", + "VIN :": "VIN :", + "year :": "سال :", + "ُExpire Date": "میعاد ختم ہونے کی تاریخ", + "Login Driver": "لاگ ان ڈرائیور", + "Password must br at least 6 character.": + "پاس ورڈ کم از کم 6 حروف کا ہونا چاہیے۔", + "if you don't have account": "اگر آپ کا اکاؤنٹ نہیں ہے", + "Here recorded trips audio": "یہاں ریکارڈ شدہ دوروں کی آڈیو", + "Register as Driver": "بطور ڈرائیور رجسٹر کریں", + "By selecting \"I Agree\" below, I have reviewed and agree to the Terms of Use and acknowledge the ": + "نیچے \"میں متفق ہوں\" کو منتخب کر کے، میں نے جائزہ لیا ہے اور استعمال کی شرائط سے اتفاق کرتا ہوں اور تسلیم کرتا ہوں ", + "Log Out Page": "لاگ آؤٹ صفحہ", + "Log Off": "لاگ آف", + "Register Driver": "ڈرائیور رجسٹر کریں", + "Verify Email For Driver": "ڈرائیور کے لیے ای میل کی تصدیق کریں", + "Admin DashBoard": "ایڈمن ڈیش بورڈ", + "Your name": "آپ کا نام", + "your ride is applied": "آپ کی سواری لاگو ہو گئی ہے", + "H and": "H اور", + "JOD": "روپیہ", + "m": "منٹ", + "We search nearst Driver to you": + "ہم آپ کے قریب ترین ڈرائیور کو تلاش کرتے ہیں", + "please wait till driver accept your order": + "براہ کرم انتظار کریں جب تک ڈرائیور آپ کا آرڈر قبول نہ کرے", + "No accepted orders? Try raising your trip fee to attract riders.": + "کوئی قبول شدہ آرڈر نہیں؟ سواروں کو راغب کرنے کے لیے اپنی ٹرپ فیس بڑھانے کی کوشش کریں۔", + "You should select one": "آپ کو ایک منتخب کرنا چاہیے", + "The driver accept your order for": + "ڈرائیور آپ کا آرڈر قبول کرتا ہے برائے", + "The driver on your way": "ڈرائیور آپ کے راستے میں ہے", + "Total price from ": "سے کل قیمت ", + "Order Details Intaleq": "آرڈر کی تفصیلات Intaleq", + "Selected file:": "منتخب کردہ فائل:", + "Your trip cost is": "آپ کے سفر کی قیمت ہے", + "this will delete all files from your device": + "یہ آپ کے آلے سے تمام فائلیں حذف کر دے گا", + "Exclusive offers and discounts always with the Intaleq app": + "Intaleq ایپ کے ساتھ ہمیشہ خصوصی پیشکشیں اور چھوٹ", + "Submit Question": "سوال جمع کرائیں", + "Please enter your Question.": "براہ کرم اپنا سوال درج کریں۔", + "Help Details": "مدد کی تفصیلات", + "No trip yet found": "ابھی تک کوئی سفر نہیں ملا", + "No Response yet.": "ابھی تک کوئی جواب نہیں ملا۔", + " You Earn today is ": " آپ کی آج کی کمائی ہے ", + " You Have in": " آپ کے پاس ہے میں", + "Total points is ": "کل پوائنٹس ہیں ", + "Total Connection Duration:": "کل کنکشن کا دورانیہ:", + "Passenger name : ": "مسافر کا نام : ", + "Cost Of Trip IS ": "سفر کی قیمت ہے ", + "Arrival time": "پہنچنے کا وقت", + "arrival time to reach your point": "آپ کے پوائنٹ تک پہنچنے کا وقت", + "For Intaleq and scooter trips, the price is calculated dynamically. For Comfort trips, the price is based on time and distance": + "Intaleq اور سکوٹر کے دوروں کے لیے، قیمت کا حساب متحرک طور پر لگایا جاتا ہے۔ کمفرٹ ٹرپس کے لیے، قیمت وقت اور فاصلے پر مبنی ہوتی ہے۔", + "Hello this is Driver": "ہیلو یہ ڈرائیور ہے", + "Is the Passenger in your Car ?": "کیا مسافر آپ کی کار میں ہے؟", + "Please wait for the passenger to enter the car before starting the trip.": + "براہ کرم سفر شروع کرنے سے پہلے مسافر کے کار میں داخل ہونے کا انتظار کریں۔", + "No ,still Waiting.": "نہیں، ابھی بھی انتظار کر رہا ہوں۔", + "I arrive you": "میں آپ کے پاس پہنچ گیا", + "I Arrive your site": "میں آپ کی لوکیشن پر پہنچ گیا", + "You are not in near to passenger location": + "آپ مسافر کی لوکیشن کے قریب نہیں ہیں", + "please go to picker location exactly": + "براہ کرم بالکل اسی لوکیشن پر جائیں جہاں سے اٹھانا ہے", + "You Can Cancel Trip And get Cost of Trip From": + "آپ سفر منسوخ کر سکتے ہیں اور سفر کی قیمت حاصل کر سکتے ہیں سے", + "Are you sure to cancel?": "کیا آپ منسوخ کرنے کے لیے یقینی ہیں؟", + "Insert Emergincy Number": "ایمرجنسی نمبر درج کریں", + "Best choice for comfort car and flexible route and stops point": + "آرام دہ کار اور لچکدار راستے اور اسٹاپس پوائنٹ کے لیے بہترین انتخاب", + "Insert": "درج کریں", + "This is for scooter or a motorcycle.": + "یہ سکوٹر یا موٹر سائیکل کے لیے ہے۔", + "This trip goes directly from your starting point to your destination for a fixed price. The driver must follow the planned route": + "یہ سفر آپ کے نقطہ آغاز سے سیدھا آپ کی منزل تک ایک مقررہ قیمت پر جاتا ہے۔ ڈرائیور کو منصوبہ بند راستے کی پیروی کرنی چاہیے۔", + "You can decline a request without any cost": + "آپ بغیر کسی قیمت کے درخواست مسترد کر سکتے ہیں", + "Perfect for adventure seekers who want to experience something new and exciting": + "ان مہم جوئی کرنے والوں کے لیے بہترین جو کچھ نیا اور دلچسپ تجربہ کرنا چاہتے ہیں", + "My current location is:": "میری موجودہ لوکیشن ہے:", + "and I have a trip on": "اور میرے پاس ایک سفر ہے پر", + "App with Passenger": "مسافر کے ساتھ ایپ", + "You will be pay the cost to driver or we will get it from you on next trip": + "آپ ڈرائیور کو قیمت ادا کریں گے یا ہم اگلے سفر پر آپ سے لے لیں گے", + "Trip has Steps": "سفر کے مراحل ہیں", + "Distance from Passenger to destination is ": + "مسافر سے منزل تک کا فاصلہ ہے ", + "price is": "قیمت ہے", + "This ride type does not allow changes to the destination or additional stops": + "اس قسم کی سواری منزل میں تبدیلیوں یا اضافی اسٹاپس کی اجازت نہیں دیتی", + "This price may be changed": "یہ قیمت تبدیل ہو سکتی ہے", + "No SIM card, no problem! Call your driver directly through our app. We use advanced technology to ensure your privacy.": + "کوئی سم کارڈ نہیں، کوئی مسئلہ نہیں! ہماری ایپ کے ذریعے براہ راست اپنے ڈرائیور کو کال کریں۔", + "This ride type allows changes, but the price may increase": + "اس قسم کی سواری تبدیلیوں کی اجازت دیتی ہے، لیکن قیمت بڑھ سکتی ہے", + "Select one message": "ایک پیغام منتخب کریں", + "I'm waiting for you": "میں آپ کا انتظار کر رہا ہوں", + "We noticed the Intaleq is exceeding 100 km/h. Please slow down for your safety. If you feel unsafe, you can share your trip details with a contact or call the police using the red SOS button.": + "ہم نے محسوس کیا کہ Intaleq 100 کلومیٹر فی گھنٹہ سے تجاوز کر رہا ہے۔ براہ کرم اپنی حفاظت کے لیے رفتار کم کریں۔", + "Warning: Intaleqing detected!": "انتباہ: تیز رفتاری کا پتہ چلا!", + "Please help! Contact me as soon as possible.": + "براہ کرم مدد کریں! جتنی جلدی ہو سکے مجھ سے رابطہ کریں۔", + "Share Trip Details": "سفر کی تفصیلات شیئر کریں", + "Car Plate is ": "کار پلیٹ ہے ", + "the 300 points equal 300 L.E for you \nSo go and gain your money": + "300 پوائنٹس آپ کے لیے 300 روپے کے برابر ہیں \nتو جائیں اور اپنے پیسے کمائیں", + "the 300 points equal 300 L.E": "300 پوائنٹس 300 روپے کے برابر ہیں", + "The payment was not approved. Please try again.": + "ادائیگی منظور نہیں ہوئی۔ براہ کرم دوبارہ کوشش کریں۔", + "Payment Failed": "ادائیگی ناکام ہو گئی", + "This is a scheduled notification.": "یہ ایک طے شدہ اطلاع ہے۔", + "An error occurred during the payment process.": + "ادائیگی کے عمل کے دوران ایک خرابی پیش آ گئی۔", + "The payment was approved.": "ادائیگی منظور ہو گئی۔", + "Payment Successful": "ادائیگی کامیاب", + "No ride found yet": "ابھی تک کوئی سواری نہیں ملی", + "Accept Order": "آرڈر قبول کریں", + "Bottom Bar Example": "باٹم بار مثال", + "Driver phone": "ڈرائیور کا فون", + "Statistics": "شماریات", + "Origin": "اصل", + "Destination": "منزل", + "Driver Name": "ڈرائیور کا نام", + "Driver Car Plate": "ڈرائیور کار پلیٹ", + "Available for rides": "سواریوں کے لیے دستیاب", + "Scan Id": "آئی ڈی اسکین کریں", + "Camera not initilaized yet": "کیمرہ ابھی تک شروع نہیں ہوا", + "Scan ID MklGoogle": "آئی ڈی MklGoogle اسکین کریں", + "Language": "زبان", + "Jordan": "اردن", + "USA": "امریکہ", + "Egypt": "مصر", + "Turkey": "ترکی", + "Saudi Arabia": "سعودی عرب", + "Qatar": "قطر", + "Bahrain": "بحرین", + "Kuwait": "کویت", + "But you have a negative salary of": "لیکن آپ کی منفی تنخواہ ہے", + "Promo Code": "پرومو کوڈ", + "Your trip distance is": "آپ کے سفر کا فاصلہ ہے", + "Enter promo code": "پرومو کوڈ درج کریں", + "You have promo!": "آپ کے پاس پرومو ہے!", + "Cost Duration": "لاگت کا دورانیہ", + "Duration is": "دورانیہ ہے", + "Leave": "چھوڑیں", + "Join": "شامل ہوں", + "Heading your way now. Please be ready.": + "اب آپ کے راستے کی طرف بڑھ رہا ہوں۔ براہ کرم تیار رہیں۔", + "Approaching your area. Should be there in 3 minutes.": + "آپ کے علاقے کے قریب پہنچ رہا ہوں۔ 3 منٹ میں وہاں ہونا چاہیے۔", + "There's heavy traffic here. Can you suggest an alternate pickup point?": + "یہاں ٹریفک بہت زیادہ ہے۔ کیا آپ متبادل پک اپ پوائنٹ تجویز کر سکتے ہیں؟", + "This ride is already taken by another driver.": + "یہ سواری پہلے ہی کسی اور ڈرائیور نے لے لی ہے۔", + "You Should be select reason.": "آپ کو وجہ منتخب کرنی چاہیے۔", + "Waiting for Driver ...": "ڈرائیور کا انتظار...", + "Latest Recent Trip": "تازہ ترین حالیہ سفر", + "from your list": "آپ کی فہرست سے", + "Do you want to change Work location": + "کیا آپ کام کی جگہ تبدیل کرنا چاہتے ہیں", + "Do you want to change Home location": + "کیا آپ گھر کی لوکیشن تبدیل کرنا چاہتے ہیں", + "We Are Sorry That we dont have cars in your Location!": + "ہم معذرت خواہ ہیں کہ ہمارے پاس آپ کی لوکیشن میں کاریں نہیں ہیں!", + "Choose from Map": "نقشے سے منتخب کریں", + "Pick your ride location on the map - Tap to confirm": + "نقشے پر اپنی سواری کی لوکیشن منتخب کریں - تصدیق کے لیے ٹیپ کریں", + "Intaleq is the ride-hailing app that is safe, reliable, and accessible.": + "Intaleq ایک رائیڈ ہیلنگ ایپ ہے جو محفوظ، قابل اعتماد اور قابل رسائی ہے۔", + "With Intaleq, you can get a ride to your destination in minutes.": + "Intaleq کے ساتھ، آپ منٹوں میں اپنی منزل تک سواری حاصل کر سکتے ہیں۔", + "Intaleq is committed to safety, and all of our captains are carefully screened and background checked.": + "Intaleq حفاظت کے لیے پرعزم ہے، اور ہمارے تمام کپتانوں کی احتیاط سے جانچ پڑتال کی جاتی ہے اور پس منظر کی جانچ کی جاتی ہے۔", + "Pick from map": "نقشے سے منتخب کریں", + "No Car in your site. Sorry!": "آپ کی جگہ پر کوئی کار نہیں۔ معذرت!", + "Nearest Car for you about ": "آپ کے لیے قریب ترین کار تقریباً ", + "From :": "سے :", + "Get Details of Trip": "سفر کی تفصیلات حاصل کریں", + "If you want add stop click here": + "اگر آپ اسٹاپ شامل کرنا چاہتے ہیں تو یہاں کلک کریں", + "Where you want go ": "آپ کہاں جانا چاہتے ہیں ", + "My Card": "میرا کارڈ", + "Start Record": "ریکارڈ شروع کریں", + "History of Trip": "سفر کی تاریخ", + "Helping Center": "ہیلپنگ سینٹر", + "Record saved": "ریکارڈ محفوظ ہو گیا", + "Trips recorded": "دورے ریکارڈ کیے گئے", + "Select Your Country": "اپنا ملک منتخب کریں", + "To ensure you receive the most accurate information for your location, please select your country below. This will help tailor the app experience and content to your country.": + "یہ یقینی بنانے کے لیے کہ آپ کو اپنی لوکیشن کے لیے درست ترین معلومات ملیں، براہ کرم نیچے اپنا ملک منتخب کریں۔", + "Are you sure to delete recorded files": + "کیا آپ واقعی ریکارڈ شدہ فائلیں حذف کرنا چاہتے ہیں", + "Select recorded trip": "ریکارڈ شدہ سفر منتخب کریں", + "Card Number": "کارڈ نمبر", + "Hi, Where to ": "ہیلو، کہاں جانا ہے ", + "Pick your destination from Map": "نقشے سے اپنی منزل منتخب کریں", + "Add Stops": "اسٹاپس شامل کریں", + "Get Direction": "سمت حاصل کریں", + "Add Location": "لوکیشن شامل کریں", + "Switch Rider": "رائیڈر تبدیل کریں", + "You will arrive to your destination after timer end.": + "ٹائمر ختم ہونے کے بعد آپ اپنی منزل پر پہنچ جائیں گے۔", + "You can cancel trip": "آپ سفر منسوخ کر سکتے ہیں", + "The driver waitting you in picked location .": + "ڈرائیور منتخب جگہ پر آپ کا انتظار کر رہا ہے۔", + "Pay with Your": "اپنے ساتھ ادا کریں", + "Pay with Credit Card": "کریڈٹ کارڈ سے ادائیگی کریں", + "Show Promos to Charge": "چارج کرنے کے لیے پروموز دکھائیں", + "Point": "پوائنٹ", + "How many hours would you like to wait?": + "آپ کتنے گھنٹے انتظار کرنا چاہیں گے؟", + "Driver Wallet": "ڈرائیور والٹ", + "Choose between those Type Cars": + "ان قسم کی کاروں کے درمیان انتخاب کریں", + "hour": "گھنٹہ", + "Select Waiting Hours": "انتظار کے اوقات منتخب کریں", + "Total Points is": "کل پوائنٹس ہیں", + "You will receive a code in SMS message": + "آپ کو ایس ایم ایس پیغام میں ایک کوڈ موصول ہوگا", + "Done": "ہو گیا", + "Total Budget from trips is ": "سفروں سے کل بجٹ ہے ", + "Total Amount:": "کل رقم:", + "Total Budget from trips by\nCredit card is ": + "کریڈٹ کارڈ کے ذریعے سفروں سے\nکل بجٹ ہے ", + "This amount for all trip I get from Passengers": + "یہ رقم تمام سفر کے لیے جو مجھے مسافروں سے ملتی ہے", + "Pay from my budget": "میرے بجٹ سے ادا کریں", + "This amount for all trip I get from Passengers and Collected For me in": + "یہ رقم تمام سفر کے لیے جو مجھے مسافروں سے ملتی ہے اور میرے لیے جمع کی گئی ہے", + "You can buy points from your budget": + "آپ اپنے بجٹ سے پوائنٹس خرید سکتے ہیں", + "insert amount": "رقم درج کریں", + "You can buy Points to let you online\nby this list below": + "آپ آن لائن رہنے کے لیے پوائنٹس خرید سکتے ہیں\nنیچے دی گئی اس فہرست کے ذریعے", + "Create Wallet to receive your money": + "اپنے پیسے وصول کرنے کے لیے والٹ بنائیں", + "Enter your feedback here": "اپنا فیڈ بیک یہاں درج کریں", + "Please enter your feedback.": "براہ کرم اپنا فیڈ بیک درج کریں۔", + "Feedback": "فیڈ بیک", + "Submit ": "جمع کرائیں ", + "Click here to Show it in Map": + "اسے نقشے میں دکھانے کے لیے یہاں کلک کریں", + "Canceled": "منسوخ", + "No I want": "نہیں میں چاہتا ہوں", + "Email is": "ای میل ہے:", + "Phone Number is": "فون نمبر ہے:", + "Date of Birth is": "پیدائش کی تاریخ ہے:", + "Sex is ": "جنس ہے: ", + "Car Details": "کار کی تفصیلات", + "VIN is": "VIN ہے:", + "Color is ": "رنگ ہے: ", + "Make is ": "میک ہے: ", + "Model is": "ماڈل ہے:", + "Year is": "سال ہے:", + "Expiration Date ": "میعاد ختم ہونے کی تاریخ: ", + "Edit Your data": "اپنے ڈیٹا میں ترمیم کریں", + "write vin for your car": "اپنی کار کے لیے vin لکھیں", + "VIN": "VIN", + "Please verify your identity": "براہ کرم اپنی شناخت کی تصدیق کریں", + "write Color for your car": "اپنی کار کے لیے رنگ لکھیں", + "write Make for your car": "اپنی کار کے لیے میک لکھیں", + "write Model for your car": "اپنی کار کے لیے ماڈل لکھیں", + "write Year for your car": "اپنی کار کے لیے سال لکھیں", + "write Expiration Date for your car": + "اپنی کار کے لیے میعاد ختم ہونے کی تاریخ لکھیں", + "Tariffs": "ٹیرف", + "Minimum fare": "کم از کم کرایہ", + "Maximum fare": "زیادہ سے زیادہ کرایہ", + "Flag-down fee": "فلیگ ڈاؤن فیس", + "Including Tax": "ٹیکس سمیت", + "BookingFee": "بکنگ فیس", + "Morning": "صبح", + "from 07:30 till 10:30 (Thursday, Friday, Saturday, Monday)": + "07:30 سے 10:30 تک (جمعرات، جمعہ، ہفتہ، پیر)", + "Evening": "شام", + "from 12:00 till 15:00 (Thursday, Friday, Saturday, Monday)": + "12:00 سے 15:00 تک (جمعرات، جمعہ، ہفتہ، پیر)", + "Night": "رات", + "You have in account": "آپ کے اکاؤنٹ میں ہے", + "Select Country": "ملک منتخب کریں", + "Ride Today : ": "آج کی سواری: ", + "After this period\nYou can't cancel!": + "اس مدت کے بعد\nآپ منسوخ نہیں کر سکتے!", + "from 23:59 till 05:30": "23:59 سے 05:30 تک", + "Rate Driver": "ڈرائیور کو ریٹ کریں", + "Total Cost is ": "کل قیمت ہے ", + "Write note": "نوٹ لکھیں", + "Time to arrive": "پہنچنے کا وقت", + "Ride Summaries": "سواری کے خلاصے", + "Total Cost": "کل قیمت", + "Average of Hours of": "گھنٹوں کی اوسط", + " is ON for this month": " اس مہینے کے لیے آن ہے", + "Days": "دن", + "Total Hours on month": "مہینے میں کل گھنٹے", + "Counts of Hours on days": "دنوں میں گھنٹوں کی گنتی", + "OrderId": "آرڈر آئی ڈی", + "created time": "تخلیق کا وقت", + "Intaleq Over": "Intaleq ختم", + "I will slow down": "میں رفتار کم کروں گا", + "Map Passenger": "نقشہ مسافر", + "Be Slowly": "آہستہ رہیں", + "If you want to make Google Map App run directly when you apply order": + "اگر آپ چاہتے ہیں کہ جب آپ آرڈر لاگو کریں تو گوگل میپ ایپ براہ راست چلے", + "You can change the language of the app": + "آپ ایپ کی زبان تبدیل کر سکتے ہیں", + "Your Budget less than needed": "آپ کا بجٹ ضرورت سے کم ہے", + "You can change the Country to get all features": + "آپ تمام خصوصیات حاصل کرنے کے لیے ملک تبدیل کر سکتے ہیں", + "There is no Car or Driver in your area.": + "آپ کے علاقے میں کوئی گاڑی یا ڈرائیور نہیں ہے۔", + "Change Country": "ملک تبدیل کریں", + }, + "hi": { + "About Intaleq": "Intaleq के बारे में", + "Chat with us anytime": "हमसे कभी भी चैट करें", + "Direct talk with our team": "हमारी टीम से सीधे बात करें", + "Email Support": "ईमेल सहायता", + "For official inquiries": "आधिकारिक पूछताछ के लिए", + "Intaleq Support": "Intaleq सहायता", + "Reach out to us via": "हमसे संपर्क करें", + "Support is Away": "सहायता अभी उपलब्ध नहीं है", + "Support is currently Online": "सहायता अभी ऑनलाइन है", + "Voice Call": "वॉइस कॉल", + "We're here to help you 24/7": "हम आपकी सहायता के लिए 24/7 उपलब्ध हैं", + "Working Hours:": "कार्य समय:", + "1 Passenger": "1 Passenger", + "2 Passengers": "2 Passengers", + "3 Passengers": "3 Passengers", + "4 Passengers": "4 Passengers", + "2. Attach Recorded Audio (Optional)": + "2. Attach Recorded Audio (Optional)", + "Account": "Account", + "Actions": "Actions", + "Active Users": "Active Users", + "Add a Stop": "Add a Stop", + "Add a new waypoint stop": "Add a new waypoint stop", + "After this period\nYou can\'t cancel!": + "After this period\nYou can\'t cancel!", + "Age is": "Age is", + "Alert": "Alert", + "An OTP has been sent to your number.": + "An OTP has been sent to your number.", + "An error occurred": "An error occurred", + "Appearance": "Appearance", + "Are you sure you want to delete this file?": + "Are you sure you want to delete this file?", + "Are you sure you want to logout?": + "Are you sure you want to logout?", + "Arrived": "Arrived", + "Audio Recording": "Audio Recording", + "Call": "Call", + "Call Support": "Call Support", + "Call left": "Call left", + "Change Photo": "Change Photo", + "Choose from Gallery": "Choose from Gallery", + "Choose from contact": "Choose from contact", + "Click to track the trip": "Click to track the trip", + "Close panel": "Close panel", + "Coming": "Coming", + "Complete Payment": "Complete Payment", + "Confirm Cancellation": "Confirm Cancellation", + "Confirm Pickup Location": "Confirm Pickup Location", + "Connection failed. Please try again.": + "Connection failed. Please try again.", + "Could not create ride. Please try again.": + "Could not create ride. Please try again.", + "Crop Photo": "Crop Photo", + "Dark Mode": "Dark Mode", + "Delete": "Delete", + "Delete Account": "Delete Account", + "Delete All": "Delete All", + "Delete All Recordings?": "Delete All Recordings?", + "Delete Recording?": "Delete Recording?", + "Destination Set": "Destination Set", + "Distance": "Distance", + "Double tap to open search or enter destination": + "Double tap to open search or enter destination", + "Double tap to set or change this waypoint on the map": + "Double tap to set or change this waypoint on the map", + "Drawing route on map...": "Drawing route on map...", + "Driver Phone": "Driver Phone", + "Driver is Going To You": "Driver is Going To You", + "Emergency Mode Triggered": "Emergency Mode Triggered", + "Emergency SOS": "Emergency SOS", + "Enter the 5-digit code": "Enter the 5-digit code", + "Enter your City": "Enter your City", + "Enter your Password": "Enter your Password", + "Failed to book trip: ": "Failed to book trip: ", + "Failed to get location": "Failed to get location", + "Failed to initiate payment. Please try again.": + "Failed to initiate payment. Please try again.", + "Failed to send OTP": "Failed to send OTP", + "Failed to upload photo": "Failed to upload photo", + "Finished": "Finished", + "Fixed Price": "Fixed Price", + "General": "General", + "Grant": "Grant", + "Have a Promo Code?": "Have a Promo Code?", + "Hello! I\'m inviting you to try Intaleq.": + "Hello! I\'m inviting you to try Intaleq.", + "Hi ,I Arrive your site": "Hi ,I Arrive your site", + "Hi, Where to": "Hi, Where to", + "Home": "Home", + "I am currently located at": "I am currently located at", + "I'm Safe": "I'm Safe", + "If you need to reach me, please contact the driver directly at": + "If you need to reach me, please contact the driver directly at", + "Image Upload Failed": "Image Upload Failed", + "Intaleq Passenger": "Intaleq Passenger", + "Invite": "Invite", + "Join a channel": "Join a channel", + "Last Name": "Last Name", + "Leave a detailed comment (Optional)": + "Leave a detailed comment (Optional)", + "Light Mode": "Light Mode", + "Listen": "Listen", + "Location": "Location", + "Location Received": "Location Received", + "Logout": "Logout", + "Map Error": "Map Error", + "Message": "Message", + "Move map to select destination": "Move map to select destination", + "Move map to set start location": "Move map to set start location", + "Move map to set stop": "Move map to set stop", + "Move map to your home location": "Move map to your home location", + "Move map to your pickup point": "Move map to your pickup point", + "Move map to your work location": "Move map to your work location", + "N/A": "N/A", + "No Notifications": "No Notifications", + "No Recordings Found": "No Recordings Found", + "No Rides now!": "No Rides now!", + "No contacts available": "No contacts available", + "No i want": "No i want", + "No notification data found.": "No notification data found.", + "No routes available for this destination.": + "No routes available for this destination.", + "No user found": "No user found", + "No,I want": "No,I want", + "No.Iwant Cancel Trip.": "No.Iwant Cancel Trip.", + "Now move the map to your pickup point": + "Now move the map to your pickup point", + "Now set the pickup point for the other person": + "Now set the pickup point for the other person", + "On Trip": "On Trip", + "Open": "Open", + "Open destination search": "Open destination search", + "Open in Google Maps": "Open in Google Maps", + "Order VIP Canceld": "Order VIP Canceld", + "Passenger": "Passenger", + "Passenger cancel order": "Passenger cancel order", + "Pay by MTN Wallet": "Pay by MTN Wallet", + "Pay by Sham Cash": "Pay by Sham Cash", + "Pay by Syriatel Wallet": "Pay by Syriatel Wallet", + "Pay with PayPal": "Pay with PayPal", + "Phone": "Phone", + "Phone Number": "Phone Number", + "Phone Number Check": "Phone Number Check", + "Phone number seems too short": "Phone number seems too short", + "Phone verified. Please complete registration.": + "Phone verified. Please complete registration.", + "Pick destination on map": "Pick destination on map", + "Pick location on map": "Pick location on map", + "Pick on map": "Pick on map", + "Pick start point on map": "Pick start point on map", + "Plan Your Route": "Plan Your Route", + "Please add contacts to your phone.": + "Please add contacts to your phone.", + "Please check your internet and try again.": + "Please check your internet and try again.", + "Please enter a valid email.": "Please enter a valid email.", + "Please enter a valid phone number.": + "Please enter a valid phone number.", + "Please enter the number without the leading 0": + "Please enter the number without the leading 0", + "Please enter your phone number": "Please enter your phone number", + "Please go to Car now": "Please go to Car now", + "Please select a reason first": "Please select a reason first", + "Please set a valid SOS phone number.": + "Please set a valid SOS phone number.", + "Please slow down": "Please slow down", + "Please wait while we prepare your trip.": + "Please wait while we prepare your trip.", + "Preferences": "Preferences", + "Profile photo updated": "Profile photo updated", + "Quick Message": "Quick Message", + "Rating is": "Rating is", + "Received empty route data.": "Received empty route data.", + "Record": "Record", + "Record your trips to see them here.": + "Record your trips to see them here.", + "Rejected Orders Count": "Rejected Orders Count", + "Remove waypoint": "Remove waypoint", + "Report": "Report", + "Route and prices have been calculated successfully!": + "Route and prices have been calculated successfully!", + "SOS": "SOS", + "Save": "Save", + "Save Changes": "Save Changes", + "Save Name": "Save Name", + "Search country": "Search country", + "Search for a starting point": "Search for a starting point", + "Select Appearance": "Select Appearance", + "Select Education": "Select Education", + "Select Gender": "Select Gender", + "Select This Ride": "Select This Ride", + "Select betweeen types": "Select betweeen types", + "Send Email": "Send Email", + "Send SOS": "Send SOS", + "Send WhatsApp Message": "Send WhatsApp Message", + "Server Error": "Server Error", + "Server error": "Server error", + "Server error. Please try again.": "Server error. Please try again.", + "Set Destination": "Set Destination", + "Set Phone Number": "Set Phone Number", + "Set as Home": "Set as Home", + "Set as Stop": "Set as Stop", + "Set as Work": "Set as Work", + "Share": "Share", + "Share Trip": "Share Trip", + "Share your experience to help us improve...": + "Share your experience to help us improve...", + "Something went wrong. Please try again.": + "Something went wrong. Please try again.", + "Speaking...": "Speaking...", + "Speed Over": "Speed Over", + "Start Point": "Start Point", + "Stay calm. We are here to help.": "Stay calm. We are here to help.", + "Stop": "Stop", + "Submit Rating": "Submit Rating", + "Support & Info": "Support & Info", + "System Default": "System Default", + "Take a Photo": "Take a Photo", + "Tap to apply your discount": "Tap to apply your discount", + "Tap to search your destination": "Tap to search your destination", + "The driver cancelled the trip.": "The driver cancelled the trip.", + "This action cannot be undone.": "This action cannot be undone.", + "This action is permanent and cannot be undone.": + "This action is permanent and cannot be undone.", + "This is for delivery or a motorcycle.": + "This is for delivery or a motorcycle.", + "Time": "Time", + "To :": "To :", + "Top up Balance": "Top up Balance", + "Top up Balance to continue": "Top up Balance to continue", + "Total Invites": "Total Invites", + "Total Price": "Total Price", + "Trip booked successfully": "Trip booked successfully", + "Type your message...": "Type your message...", + "Unknown Location": "Unknown Location", + "Update Name": "Update Name", + "Verified Passenger": "Verified Passenger", + "View Map": "View Map", + "Wait for the trip to start first": + "Wait for the trip to start first", + "Waiting...": "Waiting...", + "Warning": "Warning", + "Waypoint has been set successfully": + "Waypoint has been set successfully", + "We use location to get accurate and nearest driver for you": + "We use location to get accurate and nearest driver for you", + "WhatsApp": "WhatsApp", + "Why do you want to cancel?": "Why do you want to cancel?", + "Yes": "Yes", + "You should ideintify your gender for this type of trip!": + "You should ideintify your gender for this type of trip!", + "You will choose one of above!": "You will choose one of above!", + "Your Rewards": "Your Rewards", + "Your complaint has been submitted.": + "Your complaint has been submitted.", + "and acknowledge our Privacy Policy.": + "and acknowledge our Privacy Policy.", + "as the driver.": "as the driver.", + "cancelled": "cancelled", + "due to a previous trip.": "due to a previous trip.", + "insert sos phone": "insert sos phone", + "is driving a": "is driving a", + "min added to fare": "min added to fare", + "phone not verified": "phone not verified", + "to arrive you.": "to arrive you.", + "unknown": "unknown", + "wait 1 minute to recive message": "wait 1 minute to recive message", + "with license plate": "with license plate", + "witout zero": "witout zero", + "you must insert token code": "you must insert token code", + "Syria": "भारत", + "SYP": "₹", + "Order": "ऑर्डर", + "OrderVIP": "VIP ऑर्डर", + "Cancel Trip": "ट्रिप रद्द करें", + "Passenger Cancel Trip": "यात्री ने ट्रिप रद्द कर दी", + "VIP Order": "VIP ऑर्डर", + "The driver accepted your trip": + "ड्राइवर ने आपकी ट्रिप स्वीकार कर ली है", + "message From passenger": "यात्री का संदेश", + "Cancel": "रद्द करें", + "Trip Cancelled. The cost of the trip will be added to your wallet.": + "ट्रिप रद्द हो गई। ट्रिप की लागत आपके वॉलेट में जोड़ दी जाएगी।", + "token change": "टोकन परिवर्तन", + "Changed my mind": "मेरा विचार बदल गया", + "Please write the reason...": "कृपया कारण लिखें...", + "Found another transport": "दूसरा वाहन मिल गया", + "Driver is taking too long": "ड्राइवर बहुत समय ले रहा है", + "Driver asked me to cancel": "ड्राइवर ने रद्द करने को कहा", + "Wrong pickup location": "गलत पिकअप स्थान", + "Other": "अन्य", + "Don't Cancel": "रद्द न करें", + "No Drivers Found": "कोई ड्राइवर नहीं मिला", + "Sorry, there are no cars available of this type right now.": + "क्षमा करें, इस समय इस प्रकार की कोई कार उपलब्ध नहीं है।", + "Refresh Map": "नक्शा ताज़ा करें", + "face detect": "चेहरा पहचान (Face Detect)", + "Face Detection Result": "चेहरा पहचान का परिणाम", + "similar": "ملتا جلتا (Similar)", + "not similar": "समान नहीं", + "Searching for nearby drivers...": + "आस-पास के ड्राइवरों की तलाश की जा रही है...", + "Error": "त्रुटि", + "Failed to search, please try again later": + "खोज विफल रही, कृपया बाद में दोबारा प्रयास करें", + "Connection Error": "कनेक्शन त्रुटि", + "Please check your internet connection": + "कृपया अपना इंटरनेट कनेक्शन जांचें", + "Sorry 😔": "क्षमा करें 😔", + "The driver cancelled the trip for an emergency reason.\nDo you want to search for another driver immediately?": + "ड्राइवर ने आपातकालीन कारण से यात्रा रद्द कर दी।\nक्या आप तुरंत दूसरा ड्राइवर खोजना चाहते हैं?", + "Search for another driver": "दूसरे ड्राइवर की तलाश करें", + "We apologize 😔": "हम क्षमा चाहते हैं 😔", + "No drivers found at the moment.\nPlease try again later.": + "इस समय कोई ड्राइवर नहीं मिला।\nकृपया बाद में पुनः प्रयास करें।", + "Hi ,I will go now": "नमस्ते, मैं अब निकल रहा हूँ", + "Passenger come to you": "यात्री आपके पास आ रहा है", + "Call Income": "आने वाली कॉल", + "Call Income from Passenger": "यात्री की कॉल", + "Criminal Document Required": "पुलिस वेरिफिकेशन दस्तावेज़ आवश्यक है", + "You should have upload it .": "आपको इसे अपलोड करना होगा।", + "Call End": "कॉल समाप्त", + "The order has been accepted by another driver.": + "ऑर्डर किसी अन्य ड्राइवर द्वारा स्वीकार कर लिया गया है।", + "The order Accepted by another Driver": + "ऑर्डर दूसरे ड्राइवर ने स्वीकार कर लिया", + "We regret to inform you that another driver has accepted this order.": + "हमें खेद है कि किसी अन्य ड्राइवर ने यह ऑर्डर स्वीकार कर लिया है।", + "Driver Applied the Ride for You": + "ड्राइवर ने आपके लिए राइड अप्लाई की", + "Applied": "अप्लाई किया गया", + "Please go to Car Driver": "कृपया ड्राइवर के पास जाएं", + "Ok I will go now.": "ठीक है, मैं अब जा रहा हूँ।", + "Accepted Ride": "स्वीकृत राइड", + "Driver Accepted the Ride for You": + "ड्राइवर ने आपके लिए राइड स्वीकार कर ली", + "Promo": "प्रोमो", + "Show latest promo": "नवीनतम प्रोमो दिखाएं", + "Trip Monitoring": "ट्रिप की निगरानी", + "Driver Is Going To Passenger": "ड्राइवर यात्री के पास जा रहा है", + "Please stay on the picked point.": "कृपया पिक-अप पॉइंट पर बने रहें।", + "message From Driver": "ड्राइवर का संदेश", + "Trip is Begin": "ट्रिप शुरू हो गई", + "Cancel Trip from driver": "ड्राइवर द्वारा ट्रिप रद्द", + "We will look for a new driver.\nPlease wait.": + "हम नए ड्राइवर की तलाश करेंगे।\nकृपया प्रतीक्षा करें।", + "The driver canceled your ride.": "ड्राइवर ने आपकी राइड रद्द कर दी।", + "Driver Finish Trip": "ड्राइवर ने ट्रिप समाप्त की", + "you will pay to Driver": "आप ड्राइवर को भुगतान करेंगे", + "Don’t forget your personal belongings.": "अपना निजी सामान न भूलें।", + "Please make sure you have all your personal belongings and that any remaining fare, if applicable, has been added to your wallet before leaving. Thank you for choosing the Intaleq app": + "कृपया सुनिश्चित करें कि आपके पास आपका सारा सामान है और शेष किराया वॉलेट में जोड़ दिया गया है। Intaleq चुनने के लिए धन्यवाद।", + "Finish Monitor": "निगरानी समाप्त करें", + "Trip finished": "ट्रिप समाप्त", + "Call Income from Driver": "ड्राइवर से कॉल", + "Driver Cancelled Your Trip": "ड्राइवर ने आपकी ट्रिप रद्द कर दी", + "you will pay to Driver you will be pay the cost of driver time look to your Intaleq Wallet": + "आप ड्राइवर के समय की कीमत चुकाएंगे, अपना Intaleq वॉलेट देखें", + "Order Applied": "ऑर्डर लागू किया गया", + "welcome to intaleq": "Intaleq में आपका स्वागत है", + "login or register subtitle": + "लॉगिन या रजिस्टर करने के लिए अपना मोबाइल नंबर दर्ज करें", + "Complaint cannot be filed for this ride. It may not have been completed or started.": + "इस राइड के लिए शिकायत दर्ज नहीं की जा सकती। हो सकता है यह पूरी या शुरू न हुई हो।", + "phone number label": "फ़ोन नंबर", + "phone number required": "फ़ोन नंबर आवश्यक है", + "send otp button": "OTP भेजें", + "verify your number title": "अपना नंबर सत्यापित करें", + "otp sent subtitle": "एक 5 अंकों का कोड भेजा गया\n@phoneNumber", + "verify and continue button": "सत्यापित करें और जारी रखें", + "enter otp validation": "कृपया 5 अंकों का OTP दर्ज करें", + "one last step title": "एक आखिरी कदम", + "complete profile subtitle": "शुरू करने के लिए प्रोफाइल पूरा करें", + "first name label": "पहला नाम", + "first name required": "पहला नाम आवश्यक है", + "last name label": "अंतिम नाम", + "Verify OTP": "OTP सत्यापित करें", + "Verification Code": "सत्यापन कोड", + "We have sent a verification code to your mobile number:": + "हमने आपके मोबाइल नंबर पर एक सत्यापन कोड भेजा है:", + "Verify": "सत्यापित करें", + "Resend Code": "कोड पुनः भेजें", + "You can resend in": "पुनः भेज सकते हैं", + "seconds": "सेकंड", + "Please enter the complete 6-digit code.": + "कृपया पूरा 6 अंकों का कोड दर्ज करें।", + "last name required": "अंतिम नाम आवश्यक है", + "email optional label": "ईमेल (वैकल्पिक)", + "complete registration button": "पंजीकरण पूरा करें", + "User with this phone number or email already exists.": + "इस फ़ोन नंबर या ईमेल वाला उपयोगकर्ता पहले से मौजूद है।", + "otp sent success": "OTP व्हाट्सएप पर सफलतापूर्वक भेजा गया।", + "failed to send otp": "OTP भेजने में विफल।", + "server error try again": "सर्वर त्रुटि, पुनः प्रयास करें।", + "an error occurred": "एक त्रुटि हुई: @error", + "otp verification failed": "OTP सत्यापन विफल रहा।", + "registration failed": "पंजीकरण विफल रहा।", + "welcome user": "स्वागत है, @firstName!", + "Don't forget your personal belongings.": "अपना निजी सामान न भूलें।", + "Share App": "ऐप शेयर करें", + "Wallet": "वॉलेट", + "Balance": "बैलेंस", + "Profile": "प्रोफ़ाइल", + "Contact Support": "सपोर्ट से संपर्क करें", + "Session expired. Please log in again.": + "सत्र समाप्त हो गया। कृपया पुन: लॉगिन करें।", + "Security Warning": "⚠️ सुरक्षा चेतावनी", + "Potential security risks detected. The application may not function correctly.": + "संभावित सुरक्षा जोखिमों का पता चला। एप्लिकेशन सही ढंग से काम नहीं कर सकता है।", + "please order now": "अभी ऑर्डर करें", + "Where to": "कहाँ जाना है?", + "Where are you going?": "आप कहाँ जा रहे हैं?", + "Quick Actions": "त्वरित क्रियाएं", + "My Balance": "मेरा बैलेंस", + "Order History": "ऑर्डर इतिहास", + "Contact Us": "संपर्क करें", + "Driver": "ड्राइवर", + "Complaint": "शिकायत", + "Promos": "प्रोमो", + "Recent Places": "हाल के स्थान", + "From": "से", + "WhatsApp Location Extractor": "व्हाट्सएप लोकेशन एक्सट्रैक्टर", + "Location Link": "लोकेशन लिंक", + "Paste location link here": "लोकेशन लिंक यहाँ पेस्ट करें", + "Go to this location": "इस लोकेशन पर जाएं", + "Paste WhatsApp location link": "व्हाट्सएप लोकेशन लिंक पेस्ट करें", + "Select Order Type": "ऑर्डर प्रकार चुनें", + "Choose who this order is for": "यह ऑर्डर किसके लिए है चुनें", + "I want to order for myself": "मैं अपने लिए ऑर्डर करना चाहता हूँ", + "I want to order for someone else": + "मैं किसी और के लिए ऑर्डर करना चाहता हूँ", + "Order for someone else": "किसी और के लिए ऑर्डर", + "Order for myself": "स्वयं के लिए ऑर्डर", + "Are you want to go this site": "क्या आप इस जगह जाना चाहते हैं", + "No": "नहीं", + "Intaleq Wallet": "Intaleq वॉलेट", + "Have a promo code?": "क्या आपके पास प्रोमो कोड है?", + "Your Wallet balance is ": "आपका वॉलेट बैलेंस है: ", + "Cash": "नकद", + "Pay directly to the captain": "सीधे कैप्टन को भुगतान करें", + "Top up Wallet to continue": "जारी रखने के लिए वॉलेट रिचार्ज करें", + "Or pay with Cash instead": "या नकद भुगतान करें", + "Confirm & Find a Ride": "पुष्टि करें और राइड खोजें", + "Balance:": "बैलेंस:", + "Alerts": "अलर्ट", + "Welcome Back!": "वापसी पर स्वागत है!", + "Current Balance": "वर्तमान बैलेंस", + "Set Wallet Phone Number": "वॉलेट फ़ोन नंबर सेट करें", + "Link a phone number for transfers": + "ट्रांसफर के लिए फ़ोन नंबर लिंक करें", + "Payment History": "भुगतान इतिहास", + "View your past transactions": "अपने पिछले लेनदेन देखें", + "Top up Wallet": "वॉलेट रिचार्ज करें", + "Add funds using our secure methods": + "हमारी सुरक्षित विधियों से पैसे जोड़ें", + "Increase Fare": "किराया बढ़ाएं", + "No drivers accepted your request yet": + "अभी तक किसी ड्राइवर ने आपका अनुरोध स्वीकार नहीं किया", + "Increasing the fare might attract more drivers. Would you like to increase the price?": + "किराया बढ़ाने से अधिक ड्राइवर आकर्षित हो सकते हैं। क्या आप कीमत बढ़ाना चाहेंगे?", + "Please make sure not to leave any personal belongings in the car.": + "कृपया सुनिश्चित करें कि कार में कोई निजी सामान न छोड़ें।", + "Cancel Ride": "राइड रद्द करें", + "Route Not Found": "रूट नहीं मिला", + "We couldn't find a valid route to this destination. Please try selecting a different point.": + "हमें इस गंतव्य के लिए कोई मान्य मार्ग नहीं मिला। कृपया कोई अन्य बिंदु चुनें।", + "You can call or record audio during this trip.": + "आप इस ट्रिप के दौरान कॉल या ऑडियो रिकॉर्ड कर सकते हैं।", + "Warning: Speeding detected!": "चेतावनी: तेज गति का पता चला!", + "Comfort": "आराम (Comfort)", + "Intaleq Balance": "Intaleq बैलेंस", + "Electric": "इलेक्ट्रिक", + "Lady": "महिला", + "Van": "वैन", + "Rayeh Gai": "आना-जाना (Round Trip)", + "Join Intaleq as a driver using my referral code!": + "मेरे रेफरल कोड का उपयोग करके ड्राइवर के रूप में Intaleq से जुड़ें!", + "Use code:": "कोड का उपयोग करें:", + "Download the Intaleq Driver app now and earn rewards!": + "अभी Intaleq ड्राइवर ऐप डाउनलोड करें और पुरस्कार अर्जित करें!", + "Get a discount on your first Intaleq ride!": + "अपनी पहली Intaleq राइड पर छूट प्राप्त करें!", + "Use my referral code:": "मेरा रेफरल कोड उपयोग करें:", + "Download the Intaleq app now and enjoy your ride!": + "अभी Intaleq ऐप डाउनलोड करें और अपनी राइड का आनंद लें!", + "Contacts Loaded": "संपर्क लोड हो गए", + "Showing": "दिखा रहा है", + "of": "में से", + "Customer not found": "ग्राहक नहीं मिला", + "Wallet is blocked": "वॉलेट ब्लॉक है", + "Customer phone is not active": "ग्राहक का फोन सक्रिय नहीं है", + "Balance not enough": "बैलेंस पर्याप्त नहीं है", + "Balance limit exceeded": "बैलेंस सीमा पार हो गई", + "Incorrect sms code": "⚠️ गलत SMS कोड। कृपया पुनः प्रयास करें।", + "contacts. Others were hidden because they don't have a phone number.": + "संपर्क। अन्य छिपा दिए गए क्योंकि उनके पास फ़ोन नंबर नहीं है।", + "No contacts found": "कोई संपर्क नहीं मिला", + "No contacts with phone numbers were found on your device.": + "आपके डिवाइस पर फ़ोन नंबर वाले कोई संपर्क नहीं मिले।", + "Permission denied": "अनुमति अस्वीकृत", + "Contact permission is required to pick contacts": + "संपर्क चुनने के लिए संपर्क अनुमति आवश्यक है।", + "An error occurred while picking contacts:": + "संपर्क चुनते समय एक त्रुटि हुई:", + "Please enter a correct phone": "कृपया सही फ़ोन नंबर दर्ज करें", + "Success": "सफलता", + "Invite sent successfully": "निमंत्रण सफलतापूर्वक भेजा गया", + "Hello! I'm inviting you to try Intaleq.": + "नमस्ते! मैं आपको Intaleq आज़माने के लिए आमंत्रित कर रहा हूँ।", + "Use my invitation code to get a special gift on your first ride!": + "अपनी पहली राइड पर विशेष उपहार पाने के लिए मेरा आमंत्रण कोड उपयोग करें!", + "Your personal invitation code is:": "आपका व्यक्तिगत आमंत्रण कोड है:", + "Be sure to use it quickly! This code expires at": + "जल्दी इस्तेमाल करें! यह कोड समाप्त हो जाएगा", + "Download the app now:": "अभी ऐप डाउनलोड करें:", + "See you on the road!": "रास्ते में मिलते हैं!", + "This phone number has already been invited.": + "इस फ़ोन नंबर को पहले ही आमंत्रित किया जा चुका है।", + "An unexpected error occurred. Please try again.": + "एक अप्रत्याशित त्रुटि हुई। कृपया पुन: प्रयास करें।", + "You deserve the gift": "आप उपहार के हकदार हैं", + "Claim your 20 LE gift for inviting": + "आमंत्रित करने के लिए अपना ₹20 का उपहार प्राप्त करें", + "You have got a gift for invitation": + "आपको आमंत्रण के लिए एक उपहार मिला है", + "You have earned 20": "आपने 20 अर्जित किए हैं", + "LE": "₹", + "Vibration feedback for all buttons": + "सभी बटनों के लिए वाइब्रेशन फीडबैक", + "Share with friends and earn rewards": + "दोस्तों के साथ साझा करें और पुरस्कार अर्जित करें", + "Gift Already Claimed": "उपहार पहले ही लिया जा चुका है", + "You have already received your gift for inviting": + "आप आमंत्रित करने के लिए अपना उपहार पहले ही प्राप्त कर चुके हैं", + "Keep it up!": "लगे रहो!", + "has completed": "पूरा कर लिया है", + "trips": "ट्रिप्स", + "Personal Information": "व्यक्तिगत जानकारी", + "Name": "नाम", + "Not set": "सेट नहीं", + "Gender": "लिंग", + "Education": "शिक्षा", + "Work & Contact": "काम और संपर्क", + "Employment Type": "रोज़गार का प्रकार", + "Marital Status": "वैवाहिक स्थिति", + "SOS Phone": "SOS फ़ोन", + "Sign Out": "साइन आउट", + "Delete My Account": "मेरा खाता हटाएं", + "Update Gender": "लिंग अपडेट करें", + "Update": "अपडेट", + "Update Education": "शिक्षा अपडेट करें", + "Are you sure? This action cannot be undone.": + "क्या आप सुनिश्चित हैं? यह कार्रवाई पूर्ववत नहीं की जा सकती।", + "Confirm your Email": "अपना ईमेल सत्यापित करें", + "Type your Email": "अपना ईमेल टाइप करें", + "Delete Permanently": "स्थायी रूप से हटाएं", + "Male": "पुरुष", + "Female": "महिला", + "High School Diploma": "हाई स्कूल डिप्लोमा", + "Associate Degree": "एसोसिएट डिग्री", + "Bachelor's Degree": "स्नातक की डिग्री (Bachelor's)", + "Master's Degree": "मास्टर डिग्री", + "Doctoral Degree": "डॉ डॉक्टरेट डिग्री", + "Select your preferred language for the app interface.": + "ऐप इंटरफेस के लिए अपनी पसंदीदा भाषा चुनें।", + "Language Options": "भाषा विकल्प", + "You can claim your gift once they complete 2 trips.": + "जब वे 2 ट्रिप पूरे कर लें तो आप अपना उपहार प्राप्त कर सकते हैं।", + "Closest & Cheapest": "सबसे नज़दीकी और सस्ता", + "Comfort choice": "आरामदायक विकल्प", + "Travel in a modern, silent electric car. A premium, eco-friendly choice for a smooth ride.": + "आधुनिक, शांत इलेक्ट्रिक कार में यात्रा करें। एक प्रीमियम, पर्यावरण के अनुकूल विकल्प।", + "Spacious van service ideal for families and groups. Comfortable, safe, and cost-effective travel together.": + "परिवारों और समूहों के लिए विशाल वैन सेवा। आरामदायक, सुरक्षित और किफायती।", + "Quiet & Eco-Friendly": "शांत और पर्यावरण अनुकूल", + "Lady Captain for girls": "महिलाओं के लिए लेडी कैप्टन", + "Van for familly": "परिवार के लिए वैन", + "Are you sure to delete this location?": + "क्या आप वाकई इस स्थान को हटाना चाहते हैं?", + "Submit a Complaint": "शिकायत दर्ज करें", + "Submit Complaint": "शिकायत जमा करें", + "No trip history found": "कोई ट्रिप इतिहास नहीं मिला", + "Your past trips will appear here.": + "आपकी पिछली ट्रिप्स यहाँ दिखाई देंगी।", + "1. Describe Your Issue": "1. अपनी समस्या का वर्णन करें", + "Enter your complaint here...": "अपनी शिकायत यहाँ लिखें...", + "2. Attach Recorded Audio": "2. रिकॉर्ड किया गया ऑडियो जोड़ें", + "No audio files found.": "कोई ऑडियो फ़ाइल नहीं मिली।", + "Confirm Attachment": "अटैचमेंट की पुष्टि करें", + "Attach this audio file?": "क्या यह ऑडियो फ़ाइल अटैच करें?", + "Uploaded": "अपलोड हो गया", + "3. Review Details & Response": + "3. विवरण और प्रतिक्रिया की समीक्षा करें", + "Date": "तारीख", + "Today's Promos": "आज के प्रोमो", + "No promos available right now.": "अभी कोई प्रोमो उपलब्ध नहीं है।", + "Check back later for new offers!": + "नए ऑफ़र के लिए बाद में दोबारा चेक करें!", + "Valid Until:": "तक वैध:", + "CODE": "कोड", + "I Agree": "मैं सहमत हूँ", + "Continue": "जारी रखें", + "Enable Location": "लोकेशन चालू करें", + "To give you the best experience, we need to know where you are. Your location is used to find nearby captains and for pickups.": + "आपको सबसे अच्छा अनुभव देने के लिए हमें यह जानने की जरूरत है कि आप कहां हैं। आपकी लोकेशन का उपयोग नजदीकी कैप्टन को खोजने के लिए किया जाता है।", + "Allow Location Access": "लोकेशन एक्सेस की अनुमति दें", + "Welcome to Intaleq!": "Intaleq में आपका स्वागत है!", + "Before we start, please review our terms.": + "शुरू करने से पहले, कृपया हमारी शर्तों की समीक्षा करें।", + "Your journey starts here": "आपकी यात्रा यहाँ से शुरू होती है", + "Cancel Search": "खोज रद्द करें", + "Set pickup location": "पिकअप लोकेशन सेट करें", + "Move the map to adjust the pin": + "पिन को समायोजित करने के लिए मैप को खिसकाएं", + "Searching for the nearest captain...": + "निकटतम कैप्टन की खोज की जा रही है...", + "No one accepted? Try increasing the fare.": + "किसी ने स्वीकार नहीं किया? किराया बढ़ाने का प्रयास करें।", + "Increase Your Trip Fee (Optional)": + "अपनी ट्रिप फीस बढ़ाएं (वैकल्पिक)", + "We haven't found any drivers yet. Consider increasing your trip fee to make your offer more attractive to drivers.": + "हमें अभी तक कोई ड्राइवर नहीं मिला है। अपनी पेशकश को ड्राइवरों के लिए अधिक आकर्षक बनाने के लिए ट्रिप फीस बढ़ाने पर विचार करें।", + "No, thanks": "नहीं, धन्यवाद", + "Increase Fee": "फीस बढ़ाएं", + "Copy": "कॉपी", + "Promo Copied!": "प्रोमो कॉपी हो गया!", + "Code": "कोड", + "Send Intaleq app to him": "उसे Intaleq ऐप भेजें", + "No passenger found for the given phone number": + "दिए गए फ़ोन नंबर के लिए कोई यात्री नहीं मिला", + "No user found for the given phone number": + "दिए गए फ़ोन नंबर के लिए कोई उपयोगकर्ता नहीं मिला", + "This price is": "यह कीमत है", + "Work": "काम", + "Add Home": "घर जोड़ें", + "Notifications": "सूचनाएं", + "💳 Pay with Credit Card": "💳 क्रेडिट कार्ड से भुगतान करें", + "⚠️ You need to choose an amount!": + "⚠️ आपको एक राशि चुनने की आवश्यकता है!", + "💰 Pay with Wallet": "💰 वॉलेट से भुगतान करें", + "You must restart the app to change the language.": + "भाषा बदलने के लिए आपको ऐप को रीस्टार्ट करना होगा।", + "joined": "शामिल हुआ", + "Driver joined the channel": "ड्राइवर चैनल में शामिल हो गया", + "Driver left the channel": "ड्राइवर ने चैनल छोड़ दिया", + "Call Page": "कॉल पेज", + "Call Left": "बची हुई कॉल्स", + " Next as Cash !": " अगला नकद के रूप में!", + "To use Wallet charge it": + "वॉलेट का उपयोग करने के लिए इसे रिचार्ज करें", + "We are searching for the nearest driver to you": + "हम आपके निकटतम ड्राइवर को खोज रहे हैं", + "Best choice for cities": "शहरों के लिए सबसे अच्छा विकल्प", + "Rayeh Gai: Round trip service for convenient travel between cities, easy and reliable.": + "आना-जाना: शहरों के बीच आसान यात्रा के लिए राउंड ट्रिप सेवा।", + "This trip is for women only": "यह ट्रिप केवल महिलाओं के लिए है", + "Total budgets on month": "महीने का कुल बजट", + "You have call from driver": "ड्राइवर की कॉल है", + "Intaleq": "Intaleq", + "passenger agreement": "यात्री समझौता", + "To become a passenger, you must review and agree to the ": + "यात्री बनने के लिए, आपको समीक्षा करनी होगी और सहमत होना होगा ", + "agreement subtitle": + "जारी रखने के लिए, आपको उपयोग की शर्तों और गोपनीयता नीति की समीक्षा करनी चाहिए और सहमत होना चाहिए।", + "terms of use": "उपयोग की शर्तें", + " and acknowledge our Privacy Policy.": + " और हमारी गोपनीयता नीति को स्वीकार करें।", + "and acknowledge our": "और स्वीकार करें हमारी", + "privacy policy": "गोपनीयता नीति।", + "i agree": "मैं सहमत हूँ", + "Driver already has 2 trips within the specified period.": + "निर्दिष्ट अवधि में ड्राइवर के पास पहले से ही 2 ट्रिप हैं।", + "The invitation was sent successfully": + "निमंत्रण सफलतापूर्वक भेजा गया", + "You should select your country": "आपको अपना देश चुनना चाहिए", + "Scooter": "स्कूटर", + "A trip with a prior reservation, allowing you to choose the best captains and cars.": + "पूर्व आरक्षण के साथ यात्रा, जो आपको सर्वश्रेष्ठ कैप्टन और कारों को चुनने की अनुमति देती है।", + "Mishwar Vip": "Mishwar VIP", + "The driver waiting you in picked location .": + "ड्राइवर पिक लोकेशन पर आपका इंतज़ार कर रहा है।", + "About Us": "हमारे बारे में", + "You can change the vibration feedback for all buttons": + "आप सभी बटनों के लिए वाइब्रेशन फीडबैक बदल सकते हैं", + "Most Secure Methods": "सबसे सुरक्षित तरीके", + "In-App VOIP Calls": "इन-ऐप VOIP कॉल्स", + "Recorded Trips for Safety": "सुरक्षा के लिए रिकॉर्ड की गई ट्रिप्स", + "\nWe also prioritize affordability, offering competitive pricing to make your rides accessible.": + "\nहम किफायत को भी प्राथमिकता देते हैं, प्रतिस्पर्धी मूल्य निर्धारण की पेशकश करते हैं।", + "Intaleq is a ride-sharing app designed with your safety and affordability in mind. We connect you with reliable drivers in your area, ensuring a convenient and stress-free travel experience.\n\nHere are some of the key features that set us apart:": + "Intaleq एक राइड-शेयरिंग ऐप है जिसे आपकी सुरक्षा और किफायत को ध्यान में रखकर डिज़ाइन किया गया है। हम आपको आपके क्षेत्र में विश्वसनीय ड्राइवरों से जोड़ते हैं।", + "Sign In by Apple": "Apple द्वारा साइन इन करें", + "Sign In by Google": "Google द्वारा साइन इन करें", + "How do I request a ride?": "मैं राइड का अनुरोध कैसे करूँ?", + "Step-by-step instructions on how to request a ride through the Intaleq app.": + "Intaleq ऐप के माध्यम से राइड का अनुरोध करने के तरीके पर चरण-दर-चरण निर्देश।", + "What types of vehicles are available?": + "किस प्रकार के वाहन उपलब्ध हैं?", + "Intaleq offers a variety of vehicle options to suit your needs, including economy, comfort, and luxury. Choose the option that best fits your budget and passenger count.": + "Intaleq आपकी आवश्यकताओं के अनुरूप विभिन्न प्रकार के वाहन विकल्प प्रदान करता है।", + "How can I pay for my ride?": + "मैं अपनी राइड के लिए भुगतान कैसे कर सकता हूँ?", + "Intaleq offers multiple payment methods for your convenience. Choose between cash payment or credit/debit card payment during ride confirmation.": + "Intaleq आपकी सुविधा के लिए भुगतान के कई तरीके प्रदान करता है।", + "Can I cancel my ride?": "क्या मैं अपनी राइड रद्द कर सकता हूँ?", + "Yes, you can cancel your ride under certain conditions (e.g., before driver is assigned). See the Intaleq cancellation policy for details.": + "हाँ, आप कुछ शर्तों के तहत अपनी सवारी रद्द कर सकते हैं (जैसे, ड्राइवर सौंपे जाने से पहले)। विवरण के लिए Intaleq रद्दीकरण नीति देखें।", + "Driver Registration & Requirements": "ड्राइवर पंजीकरण और आवश्यकताएं", + "How can I register as a driver?": + "मैं ड्राइवर के रूप में कैसे पंजीकरण कर सकता हूँ?", + "What are the requirements to become a driver?": + "ड्राइवर बनने के लिए क्या आवश्यकताएं हैं?", + "Visit our website or contact Intaleq support for information on driver registration and requirements.": + "ड्राइवर पंजीकरण और आवश्यकताओं के बारे में जानकारी के लिए हमारी वेबसाइट पर जाएँ या समर्थन से संपर्क करें।", + "Intaleq provides in-app chat functionality to allow you to communicate with your driver or passenger during your ride.": + "Intaleq इन-ऐप चैट की कार्यक्षमता प्रदान करता है।", + "Intaleq prioritizes your safety. We offer features like driver verification, in-app trip tracking, and emergency contact options.": + "Intaleq आपकी सुरक्षा को प्राथमिकता देता है।", + "Frequently Questions": "अक्सर पूछे जाने वाले प्रश्न", + "User does not exist.": "उपयोगकर्ता मौजूद नहीं है।", + "We need your phone number to contact you and to help you.": + "हमें आपसे संपर्क करने और आपकी मदद करने के लिए आपके फ़ोन नंबर की आवश्यकता है।", + "You will recieve code in sms message": + "आपको SMS संदेश में कोड प्राप्त होगा", + "Please enter": "कृपया दर्ज करें", + "We need your phone number to contact you and to help you receive orders.": + "हमें आपसे संपर्क करने और ऑर्डर प्राप्त करने में आपकी सहायता करने के लिए आपके फ़ोन नंबर की आवश्यकता है।", + "The full name on your criminal record does not match the one on your driver's license. Please verify and provide the correct documents.": + "आपके पुलिस रिकॉर्ड पर पूरा नाम आपके ड्राइविंग लाइसेंस से मेल नहीं खाता।", + "The national number on your driver's license does not match the one on your ID document. Please verify and provide the correct documents.": + "आपके ड्राइविंग लाइसेंस पर आधार नंबर आपके आईडी दस्तावेज़ से मेल नहीं खाता है।", + "Capture an Image of Your Criminal Record": + "अपने पुलिस वेरिफिकेशन की तस्वीर लें", + "IssueDate": "जारी करने की तिथि", + "Capture an Image of Your car license front": + "अपनी गाड़ी के कागज (RC) के सामने की तस्वीर लें", + "Capture an Image of Your ID Document front": + "अपने पहचान पत्र (Aadhaar) के सामने की तस्वीर लें", + "NationalID": "आधार नंबर", + "You can share the Intaleq App with your friends and earn rewards for rides they take using your code": + "आप Intaleq ऐप को अपने दोस्तों के साथ साझा कर सकते हैं और पुरस्कार अर्जित कर सकते हैं", + "FullName": "पूरा नाम", + "No invitation found yet!": "अभी तक कोई आमंत्रण नहीं मिला!", + "InspectionResult": "निरीक्षण परिणाम", + "Criminal Record": "पुलिस वेरिफिकेशन", + "The email or phone number is already registered.": + "ईमेल या फ़ोन नंबर पहले से पंजीकृत है।", + "To become a ride-sharing driver on the Intaleq app, you need to upload your driver's license, ID document, and car registration document. Our AI system will instantly review and verify their authenticity in just 2-3 minutes. If your documents are approved, you can start working as a driver on the Intaleq app. Please note, submitting fraudulent documents is a serious offense and may result in immediate termination and legal consequences.": + "ड्राइवर बनने के लिए, आपको अपना ड्राइविंग लाइसेंस, आईडी दस्तावेज़, और गाड़ी के कागज (RC) अपलोड करने की आवश्यकता है।", + "Documents check": "दस्तावेज़ जाँच", + "Driver's License": "ड्राइविंग लाइसेंस", + "for your first registration!": "आपके पहले पंजीकरण के लिए!", + "Get it Now!": "अभी प्राप्त करें!", + "before": "पहले", + "Code not approved": "कोड स्वीकृत नहीं हुआ", + "3000 LE": "₹3000", + "Do you have an invitation code from another driver?": + "क्या आपके पास किसी अन्य ड्राइवर का आमंत्रण कोड है?", + "Paste the code here": "कोड यहाँ पेस्ट करें", + "No, I don't have a code": "नहीं, मेरे पास कोड नहीं है", + "Audio uploaded successfully.": "ऑडियो सफलतापूर्वक अपलोड हो गया।", + "Perfect for passengers seeking the latest car models with the freedom to choose any route they desire": + "नवीनतम कार मॉडल चाहने वाले यात्रियों के लिए उत्तम", + "Share this code with your friends and earn rewards when they use it!": + "इस कोड को अपने दोस्तों के साथ साझा करें और पुरस्कार अर्जित करें!", + "Enter phone": "फ़ोन दर्ज करें", + "complete, you can claim your gift": + "पूरा, आप अपना उपहार प्राप्त कर सकते हैं", + "When": "जब", + "Enter driver's phone": "ड्राइवर का फ़ोन दर्ज करें", + "Send Invite": "आमंत्रण भेजें", + "Show Invitations": "आमंत्रण दिखाएं", + "License Type": "लाइसेंस का प्रकार", + "National Number": "आधार नंबर", + "Name (Arabic)": "नाम (स्थानीय)", + "Name (English)": "नाम (अंग्रेज़ी)", + "Address": "पता", + "Issue Date": "जारी करने की तिथि", + "Expiry Date": "समाप्ति तिथि", + "License Categories": "लाइसेंस श्रेणियाँ", + "driver_license": "ड्राइविंग लाइसेंस", + "Capture an Image of Your Driver License": + "अपने ड्राइविंग लाइसेंस की तस्वीर लें", + "ID Documents Back": "आईडी दस्तावेज़ का पिछला हिस्सा", + "National ID": "आधार कार्ड", + "Occupation": "पेशा", + "Religion": "धर्म", + "Full Name (Marital)": "पूरा नाम", + "Expiration Date": "समाप्ति तिथि", + "Capture an Image of Your ID Document Back": + "अपने आईडी कार्ड के पीछे की तस्वीर लें", + "ID Documents Front": "आईडी दस्तावेज़ का सामने का हिस्सा", + "First Name": "पहला नाम", + "CardID": "कार्ड आईडी", + "Vehicle Details Front": "वाहन विवरण सामने", + "Plate Number": "प्लेट नंबर", + "Owner Name": "मालिक का नाम", + "Vehicle Details Back": "वाहन विवरण पीछे", + "Make": "मेक", + "Model": "मॉडल", + "Year": "वर्ष", + "Chassis": "चेसिस", + "Color": "रंग", + "Displacement": "डिस्प्लेसमेंट", + "Fuel": "ईंधन", + "Tax Expiry Date": "टैक्स समाप्ति तिथि", + "Inspection Date": "निरीक्षण तिथि", + "Capture an Image of Your car license back": + "अपने आरसी (RC) के पीछे की तस्वीर लें", + "Capture an Image of Your Driver's License": + "अपने ड्राइविंग लाइसेंस की तस्वीर लें", + "Sign in with Google for easier email and name entry": + "आसान ईमेल और नाम प्रविष्टि के लिए Google के साथ साइन इन करें", + "You will choose allow all the time to be ready receive orders": + "आप ऑर्डर प्राप्त करने के लिए हर समय अनुमति चुनें", + "Get to your destination quickly and easily.": + "अपनी मंजिल पर जल्दी और आसानी से पहुंचें।", + "Enjoy a safe and comfortable ride.": + "सुरक्षित और आरामदायक सवारी का आनंद लें।", + "Choose Language": "भाषा चुनें", + "Pay with Wallet": "वॉलेट से भुगतान करें", + "Invalid MPIN": "अमान्य MPIN", + "Invalid OTP": "अमान्य OTP", + "Enter your email address": "अपना ईमेल पता दर्ज करें", + "Please enter Your Email.": "कृपया अपना ईमेल दर्ज करें।", + "Enter your phone number": "अपना फ़ोन नंबर दर्ज करें", + "Please enter your phone number.": "कृपया अपना फ़ोन नंबर दर्ज करें।", + "Please enter Your Password.": "कृपया अपना पासवर्ड दर्ज करें।", + "if you dont have account": "यदि आपके पास खाता नहीं है", + "Register": "रजिस्टर करें", + "Accept Ride's Terms & Review Privacy Notice": + "शर्तें स्वीकार करें और गोपनीयता नोटिस देखें", + "By selecting 'I Agree' below, I have reviewed and agree to the Terms of Use and acknowledge the Privacy Notice. I am at least 18 years of age.": + "नीचे 'मैं सहमत हूँ' चुनकर, मैंने उपयोग की शर्तों की समीक्षा की है और उनसे सहमत हूँ।", + "First name": "पहला नाम", + "Enter your first name": "अपना पहला नाम दर्ज करें", + "Please enter your first name.": "कृपया अपना पहला नाम दर्ज करें।", + "Last name": "अंतिम नाम", + "Enter your last name": "अपना अंतिम नाम दर्ज करें", + "Please enter your last name.": "कृपया अपना अंतिम नाम दर्ज करें।", + "City": "शहर", + "Please enter your City.": "कृपया अपना शहर दर्ज करें।", + "Verify Email": "ईमेल सत्यापित करें", + "We sent 5 digit to your Email provided": + "हमने आपके प्रदान किए गए ईमेल पर 5 अंक भेजे हैं", + "5 digit": "5 अंक", + "Send Verification Code": "सत्यापन कोड भेजें", + "Your Ride Duration is ": "आपकी सवारी की अवधि है ", + "You will be thier in": "आप वहां होंगे", + "You trip distance is": "आपकी यात्रा की दूरी है", + "Fee is": "फीस है", + "From : ": "से: ", + "To : ": "तक: ", + "Add Promo": "प्रोमो जोड़ें", + "Confirm Selection": "चयन की पुष्टि करें", + "distance is": "दूरी है", + "Privacy Policy": "गोपनीयता नीति", + "Intaleq LLC": "Intaleq LLC", + "Syria's pioneering ride-sharing service, proudly developed by Arabian and local owners. We prioritize being near you – both our valued passengers and our dedicated captains.": + "भारत की अग्रणी राइड-शेयरिंग सेवा।", + "Intaleq is the first ride-sharing app in Syria, designed to connect you with the nearest drivers for a quick and convenient travel experience.": + "Intaleq पहली राइड-शेयरिंग ऐप है जो आपको निकटतम ड्राइवरों से जोड़ती है।", + "Why Choose Intaleq?": "Intaleq क्यों चुनें?", + "Closest to You": "आपके सबसे करीब", + "We connect you with the nearest drivers for faster pickups and quicker journeys.": + "हम आपको तेज़ पिकअप के लिए निकटतम ड्राइवरों से जोड़ते हैं।", + "Uncompromising Security": "अटल सुरक्षा", + "Lady Captains Available": "लेडी कैप्टन उपलब्ध हैं", + "Recorded Trips (Voice & AI Analysis)": + "रिकॉर्ड की गई यात्राएं (वॉयस और AI विश्लेषण)", + "Fastest Complaint Response": "सबसे तेज़ शिकायत प्रतिक्रिया", + "Our dedicated customer service team ensures swift resolution of any issues.": + "हमारी समर्पित ग्राहक सेवा टीम मुद्दों का त्वरित समाधान सुनिश्चित करती है।", + "Affordable for Everyone": "सभी के लिए किफायती", + "Frequently Asked Questions": "अक्सर पूछे जाने वाले प्रश्न", + "Getting Started": "शुरुआत करना", + "Simply open the Intaleq app, enter your destination, and tap \"Request Ride\". The app will connect you with a nearby driver.": + "बस ऐप खोलें, गंतव्य दर्ज करें और 'राइड का अनुरोध करें' पर टैप करें।", + "Vehicle Options": "वाहन विकल्प", + "Intaleq offers a variety of options including Economy, Comfort, and Luxury to suit your needs and budget.": + "Intaleq इकोनॉमी, कम्फर्ट और लग्जरी सहित कई विकल्प प्रदान करता है।", + "Payments": "भुगतान", + "You can pay for your ride using cash or credit/debit card. You can select your preferred payment method before confirming your ride.": + "आप नकद या कार्ड का उपयोग करके भुगतान कर सकते हैं।", + "Ride Management": "राइड प्रबंधन", + "Yes, you can cancel your ride, but please note that cancellation fees may apply depending on how far in advance you cancel.": + "हाँ, आप अपनी राइड रद्द कर सकते हैं, लेकिन रद्दीकरण शुल्क लागू हो सकता है।", + "For Drivers": "ड्राइवरों के लिए", + "Driver Registration": "ड्राइवर पंजीकरण", + "To register as a driver or learn about the requirements, please visit our website or contact Intaleq support directly.": + "रजिस्टर करने के लिए हमारी वेबसाइट पर जाएँ या समर्थन से संपर्क करें।", + "Visit Website/Contact Support": + "वेबसाइट पर जाएँ / समर्थन से संपर्क करें", + "Close": "बंद करें", + "We are searching for the nearest driver": + "हम निकटतम ड्राइवर खोज रहे हैं", + "Communication": "संचार", + "How do I communicate with the other party (passenger/driver)?": + "मैं दूसरे पक्ष से कैसे संवाद करूँ?", + "You can communicate with your driver or passenger through the in-app chat feature once a ride is confirmed.": + "राइड की पुष्टि होने पर आप ऐप में चैट कर सकते हैं।", + "Safety & Security": "सुरक्षा", + "What safety measures does Intaleq offer?": + "Intaleq कौन से सुरक्षा उपाय प्रदान करता है?", + "Intaleq offers various safety features including driver verification, in-app trip tracking, emergency contact options, and the ability to share your trip status with trusted contacts.": + "Intaleq ड्राइवर सत्यापन और ट्रिप ट्रैकिंग प्रदान करता है।", + "Enjoy competitive prices across all trip options, making travel accessible.": + "प्रतिस्पर्धी कीमतों का आनंद लें।", + "Variety of Trip Choices": "ट्रिप विकल्पों की विविधता", + "Choose the trip option that perfectly suits your needs and preferences.": + "वह विकल्प चुनें जो आपकी आवश्यकताओं के अनुरूप हो।", + "Your Choice, Our Priority": "आपकी पसंद, हमारी प्राथमिकता", + "Because we are near, you have the flexibility to choose the ride that works best for you.": + "चूंकि हम पास हैं, आपके पास चुनने की सुविधा है।", + "duration is": "अवधि है", + "Setting": "सेटिंग", + "Find answers to common questions": "सामान्य प्रश्नों के उत्तर खोजें", + "I don't need a ride anymore": "मुझे अब राइड की आवश्यकता नहीं है", + "I was just trying the application": "मैं बस एप्लिकेशन आज़मा रहा था", + "No driver accepted my request": + "किसी ड्राइवर ने मेरा अनुरोध स्वीकार नहीं किया", + "I added the wrong pick-up/drop-off location": + "मैंने गलत स्थान जोड़ा", + "I don't have a reason": "मेरे पास कोई कारण नहीं है", + "Can we know why you want to cancel Ride ?": + "क्या हम जान सकते हैं कि आप क्यों रद्द करना चाहते हैं?", + "Add Payment Method": "भुगतान विधि जोड़ें", + "Ride Wallet": "राइड वॉलेट", + "Payment Method": "भुगतान विधि", + "Type here Place": "यहाँ स्थान टाइप करें", + "Are You sure to ride to": "क्या आप वाकई जाना चाहते हैं", + "Confirm": "पुष्टि करें", + "You are Delete": "आप हटा रहे हैं", + "Deleted": "हटा दिया गया", + "You Dont Have Any places yet !": + "आपके पास अभी तक कोई स्थान नहीं है!", + "From : Current Location": "से: वर्तमान स्थान", + "My Cared": "मेरे कार्ड", + "Add Card": "कार्ड जोड़ें", + "Add Credit Card": "क्रेडिट कार्ड जोड़ें", + "Please enter the cardholder name": + "कृपया कार्डधारक का नाम दर्ज करें", + "Please enter the expiry date": "कृपया समाप्ति तिथि दर्ज करें", + "Please enter the CVV code": "कृपया CVV कोड दर्ज करें", + "Go To Favorite Places": "पसंदीदा स्थानों पर जाएं", + "Go to this Target": "इस लक्ष्य पर जाएं", + "My Profile": "मेरी प्रोफ़ाइल", + "Are you want to go to this site": + "क्या आप इस साइट पर जाना चाहते हैं", + "MyLocation": "मेरी लोकेशन", + "my location": "मेरी लोकेशन", + "Target": "लक्ष्य", + "You Should choose rate figure": "आपको रेटिंग चुननी चाहिए", + "Login Captin": "कैप्टन लॉगिन", + "Register Captin": "कैप्टन रजिस्टर", + "Send Verfication Code": "सत्यापन कोड भेजें", + "KM": "किमी", + "End Ride": "राइड समाप्त करें", + "Minute": "मिनट", + "Go to passenger Location now": "अब यात्री की लोकेशन पर जाएं", + "Duration of the Ride is ": "राइड की अवधि है ", + "Distance of the Ride is ": "राइड की दूरी है ", + "Name of the Passenger is ": "यात्री का नाम है ", + "Hello this is Captain": "नमस्ते यह कैप्टन है", + "Start the Ride": "राइड शुरू करें", + "Please Wait If passenger want To Cancel!": + "कृपया प्रतीक्षा करें यदि यात्री रद्द करना चाहे!", + "Total Duration:": "कुल अवधि:", + "Active Duration:": "सक्रिय अवधि:", + "Waiting for Captin ...": "कैप्टन का इंतज़ार...", + "Age is ": "आयु है ", + "Rating is ": "रेटिंग है ", + " to arrive you.": " आप तक पहुँचने के लिए।", + "Tariff": "टैरिफ", + "Settings": "सेटिंग्स", + "Feed Back": "प्रतिक्रिया", + "Please enter a valid 16-digit card number": + "कृपया एक वैध 16 अंकों का कार्ड नंबर दर्ज करें", + "Add Phone": "फ़ोन जोड़ें", + "Please enter a phone number": "कृपया एक फ़ोन नंबर दर्ज करें", + "You dont Add Emergency Phone Yet!": + "आपने अभी तक आपातकालीन फ़ोन नहीं जोड़ा है!", + "You will arrive to your destination after ": + "आप अपनी मंजिल पर पहुंचेंगे बाद ", + "You can cancel Ride now": "आप अब राइड रद्द कर सकते हैं", + "You Can cancel Ride After Captain did not come in the time": + "यदि कैप्टन समय पर नहीं आया तो आप राइड रद्द कर सकते हैं", + "If you in Car Now. Press Start The Ride": + "यदि आप कार में हैं तो राइड शुरू करें दबाएं", + "You Dont Have Any amount in": "आपके पास कोई राशि नहीं है में", + "Wallet!": "वॉलेट!", + "You Have": "आपके पास है", + "Save Credit Card": "क्रेडिट कार्ड सहेजें", + "Show Promos": "प्रोमो दिखाएं", + "10 and get 4% discount": "10 और 4% छूट पाएं", + "20 and get 6% discount": "20 और 6% छूट पाएं", + "40 and get 8% discount": "40 और 8% छूट पाएं", + "100 and get 11% discount": "100 और 11% छूट पाएं", + "Pay with Your PayPal": "अपने PayPal से भुगतान करें", + "You will choose one of above !": + "आपको ऊपर वालों में से एक को चुनना होगा!", + "Edit Profile": "प्रोफ़ाइल संपादित करें", + "Copy this Promo to use it in your Ride!": + "अपनी राइड में उपयोग करने के लिए इस प्रोमो को कॉपी करें!", + "To change some Settings": "कुछ सेटिंग्स बदलने के लिए", + "Order Request Page": "ऑर्डर अनुरोध पृष्ठ", + "Rouats of Trip": "ट्रिप के रास्ते", + "Passenger Name is ": "यात्री का नाम है ", + "Total From Passenger is ": "यात्री से कुल: ", + "Duration To Passenger is ": "यात्री तक अवधि है ", + "Distance To Passenger is ": "यात्री तक दूरी है ", + "Total For You is ": "आपके लिए कुल: ", + "Distance is ": "दूरी है ", + " KM": " किमी", + "Duration of Trip is ": "ट्रिप की अवधि है ", + " Minutes": " मिनट", + "Apply Order": "ऑर्डर लागू करें", + "Refuse Order": "ऑर्डर अस्वीकार करें", + "Rate Captain": "कैप्टन को रेट करें", + "Enter your Note": "अपना नोट दर्ज करें", + "Type something...": "कुछ लिखें...", + "Submit rating": "रेटिंग सबमिट करें", + "Rate Passenger": "यात्री को रेट करें", + "Ride Summary": "राइड सारांश", + "welcome_message": "Intaleq में आपका स्वागत है!", + "app_description": + "Intaleq एक सुरक्षित, विश्वसनीय और सुलभ राइड-हेलिंग ऐप है।", + "get_to_destination": "जल्दी और आसानी से अपनी मंजिल पर पहुंचें।", + "get_a_ride": + "Intaleq के साथ, आप मिनटों में राइड प्राप्त कर सकते हैं।", + "safe_and_comfortable": "एक सुरक्षित और आरामदायक राइड का आनंद लें।", + "committed_to_safety": "Intaleq सुरक्षा के लिए प्रतिबद्ध है।", + "your ride is Accepted": "आपकी राइड स्वीकार कर ली गई है", + "Driver is waiting at pickup.": "ड्राइवर पिकअप पर इंतज़ार कर रहा है।", + "Driver is on the way": "ड्राइवर रास्ते में है", + "Contact Options": "संपर्क विकल्प", + "Send a custom message": "कस्टम संदेश भेजें", + "Type your message": "अपना संदेश टाइप करें", + "I will go now": "मैं अब जाऊंगा", + "You Have Tips": "आपके पास टिप्स हैं", + " tips\nTotal is": " टिप्स\nकुल है", + "Your fee is ": "आपकी फीस है ", + "Do you want to pay Tips for this Driver": + "क्या आप इस ड्राइवर के लिए टिप देना चाहते हैं", + "Tip is ": "टिप है ", + "Are you want to wait drivers to accept your order": + "क्या आप चाहते हैं कि ड्राइवर आपका ऑर्डर स्वीकार करने का इंतज़ार करें", + "This price is fixed even if the route changes for the driver.": + "यह कीमत तय है चाहे ड्राइवर का रास्ता बदल जाए।", + "The price may increase if the route changes.": + "अगर रास्ता बदल गया तो कीमत बढ़ सकती है।", + "The captain is responsible for the route.": + "कैप्टन रास्ते के लिए जिम्मेदार है।", + "We are search for nearst driver": "हम निकटतम ड्राइवर खोज रहे हैं", + "Your order is being prepared": "आपका ऑर्डर तैयार हो रहा है", + "The drivers are reviewing your request": + "ड्राइवर आपके अनुरोध की समीक्षा कर रहे हैं", + "Your order sent to drivers": "आपका ऑर्डर ड्राइवरों को भेज दिया गया", + "You can call or record audio of this trip": + "आप इस ट्रिप की कॉल या ऑडियो रिकॉर्ड कर सकते हैं", + "The trip has started! Feel free to contact emergency numbers, share your trip, or activate voice recording for the journey": + "ट्रिप शुरू हो गई है! आपातकालीन नंबरों से संपर्क करें, अपनी ट्रिप साझा करें।", + "Camera Access Denied.": "कैमरा एक्सेस अस्वीकार कर दिया गया।", + "Open Settings": "सेटिंग्स खोलें", + "GPS Required Allow !.": "GPS की अनुमति आवश्यक है!", + "Your Account is Deleted": "आपका खाता हटा दिया गया है", + "Are you sure to delete your account?": + "क्या आप वाकई अपना खाता हटाना चाहते हैं?", + "Your data will be erased after 2 weeks\nAnd you will can't return to use app after 1 month ": + "आपका डेटा 2 सप्ताह बाद मिटा दिया जाएगा\nऔर आप 1 महीने बाद ऐप का उपयोग नहीं कर पाएंगे", + "Enter Your First Name": "अपना पहला नाम दर्ज करें", + "Are you Sure to LogOut?": "क्या आप वाकई लॉग आउट करना चाहते हैं?", + "Email Wrong": "ईमेल गलत है", + "Email you inserted is Wrong.": + "आपके द्वारा दर्ज किया गया ईमेल गलत है।", + "You have finished all times ": "आपने सभी बार समाप्त कर दिए हैं ", + "if you want help you can email us here": + "यदि आप मदद चाहते हैं तो आप हमें यहां ईमेल कर सकते हैं", + "Thanks": "धन्यवाद", + "Email Us": "हमें ईमेल करें", + "I cant register in your app in face detection ": + "मैं चेहरा पहचान में आपके ऐप में रजिस्टर नहीं हो सकता ", + "Hi": "नमस्ते", + "No face detected": "कोई चेहरा पता नहीं चला", + "Image detecting result is ": "छवि पहचान का परिणाम है ", + "from 3 times Take Attention": "3 बार से ध्यान दें", + "Be sure for take accurate images please\nYou have": + "कृपया सटीक चित्र लेने का ध्यान रखें\nआपके पास है", + "image verified": "छवि सत्यापित", + "Next": "अगला", + "There is no help Question here": "यहाँ कोई मदद प्रश्न नहीं है", + "You dont have Points": "आपके पास अंक नहीं हैं", + "You Are Stopped For this Day !": "आप इस दिन के लिए रोक दिए गए हैं!", + "You must be charge your Account": "आपको अपना खाता चार्ज करना होगा", + "You Refused 3 Rides this Day that is the reason \nSee you Tomorrow!": + "आपने इस दिन 3 राइड्स को अस्वीकार कर दिया यही कारण है \nकल मिलते हैं!", + "Recharge my Account": "मेरा खाता रिचार्ज करें", + "Ok , See you Tomorrow": "ठीक है, कल मिलते हैं", + "You are Stopped": "आप रुके हुए हैं", + "Connected": "जुड़ा हुआ", + "Not Connected": "जुड़ा हुआ नहीं", + "Your are far from passenger location": + "आप यात्री की लोकेशन से दूर हैं", + "go to your passenger location before\nPassenger cancel trip": + "यात्री के ट्रिप रद्द करने से पहले\nअपनी यात्री की लोकेशन पर जाएं", + "You will get cost of your work for this trip": + "आपको इस ट्रिप के लिए अपने काम की कीमत मिलेगी", + " in your wallet": " आपके वॉलेट में", + "you gain": "आपने प्राप्त किया", + "Order Cancelled by Passenger": + "यात्री द्वारा ऑर्डर रद्द कर दिया गया", + "Feedback data saved successfully": + "फीडबैक डेटा सफलतापूर्वक सहेजा गया", + "No Promo for today .": "आज के लिए कोई प्रोमो नहीं है।", + "Select your destination": "अपनी मंजिल चुनें", + "Search for your Start point": "अपना प्रारंभिक बिंदु खोजें", + "Search for waypoint": "वेपॉइंट खोजें", + "Current Location": "वर्तमान लोकेशन", + "Add Location 1": "लोकेशन 1 जोड़ें", + "You must Verify email !.": "आपको ईमेल सत्यापित करना होगा!", + "Cropper": "क्रॉपर", + "Saved Sucssefully": "सफलतापूर्वक सहेजा गया", + "Select Date": "तारीख चुनें", + "Birth Date": "जन्म तिथि", + "Ok": "ठीक है", + "the 500 points equal 30 JOD": "500 पॉइंट 30 रुपये के बराबर हैं", + "the 500 points equal 30 JOD for you \nSo go and gain your money": + "500 पॉइंट आपके लिए 30 रुपये के बराबर हैं \nतो जाएं और अपने पैसे कमाएं", + "token updated": "टोकन अपडेट हो गया", + "Add Location 2": "लोकेशन 2 जोड़ें", + "Add Location 3": "लोकेशन 3 जोड़ें", + "Add Location 4": "लोकेशन 4 जोड़ें", + "Waiting for your location": "आपकी लोकेशन का इंतज़ार है", + "Search for your destination": "अपनी मंजिल खोजें", + "Hi! This is": "नमस्ते! यह है", + " I am using": " मैं उपयोग कर रहा हूँ", + " to ride with": " सवारी करने के लिए साथ", + " as the driver.": " बतौर ड्राइवर।", + "is driving a ": "चला रहा है एक ", + " with license plate ": " लाइसेंस प्लेट के साथ ", + " I am currently located at ": " मैं वर्तमान में यहाँ स्थित हूँ ", + "Please go to Car now ": "कृपया अब कार के पास जाएं ", + "You will receive a code in WhatsApp Messenger": + "आपको व्हाट्सएप मैसेंजर में एक कोड प्राप्त होगा", + "If you need assistance, contact us": + "यदि आपको सहायता की आवश्यकता हो, तो हमसे संपर्क करें", + "Promo Ended": "प्रोमो समाप्त", + "Enter the promo code and get": + "प्रोमो कोड दर्ज करें और प्राप्त करें", + "DISCOUNT": "छूट", + "No wallet record found": "कोई वॉलेट रिकॉर्ड नहीं मिला", + "for": "के लिए", + "Intaleq is the safest ride-sharing app that introduces many features for both captains and passengers. We offer the lowest commission rate of just 8%, ensuring you get the best value for your rides. Our app includes insurance for the best captains, regular maintenance of cars with top engineers, and on-road services to ensure a respectful and high-quality experience for all users.": + "Intaleq सबसे सुरक्षित राइड-शेयरिंग ऐप है।", + "You can contact us during working hours from 12:00 - 19:00.": + "आप हमसे कार्यालय समय 12:00 - 19:00 के दौरान संपर्क कर सकते हैं।", + "Choose a contact option": "संपर्क विकल्प चुनें", + "Work time is from 12:00 - 19:00.\nYou can send a WhatsApp message or email.": + "काम का समय 12:00 - 19:00 है।\nआप व्हाट्सएप संदेश या ईमेल भेज सकते हैं।", + "Promo code copied to clipboard!": + "प्रोमो कोड क्लिपबोर्ड पर कॉपी हो गया!", + "Copy Code": "कोड कॉपी करें", + "Your invite code was successfully applied!": + "आपका आमंत्रण कोड सफलतापूर्वक लागू हो गया!", + "Payment Options": "भुगतान विकल्प", + "wait 1 minute to receive message": + "संदेश प्राप्त करने के लिए 1 मिनट प्रतीक्षा करें", + "You have copied the promo code.": "आपने प्रोमो कोड कॉपी कर लिया है।", + "Select Payment Amount": "भुगतान राशि चुनें", + "The promotion period has ended.": "प्रचार अवधि समाप्त हो गई है।", + "Promo Code Accepted": "प्रोमो कोड स्वीकार कर लिया गया", + "Tap on the promo code to copy it!": + "इसे कॉपी करने के लिए प्रोमो कोड पर टैप करें!", + "Lowest Price Achieved": "सबसे कम कीमत हासिल की गई", + "Cannot apply further discounts.": "अधिक छूट लागू नहीं की जा सकती।", + "Promo Already Used": "प्रोमो पहले ही इस्तेमाल हो चुका है", + "Invitation Used": "आमंत्रण इस्तेमाल हो चुका है", + "You have already used this promo code.": + "आप पहले ही यह प्रोमो कोड इस्तेमाल कर चुके हैं।", + "Insert Your Promo Code": "अपना प्रोमो कोड डालें", + "Enter promo code here": "प्रोमो कोड यहाँ डालें", + "Please enter a valid promo code": "कृपया एक मान्य प्रोमो कोड डालें", + "Awfar Car": "किफायती कार", + "Old and affordable, perfect for budget rides.": + "पुरानी और सस्ती, बजट सवारी के लिए उत्तम।", + " If you need to reach me, please contact the driver directly at": + " यदि आपको मुझ तक पहुँचने की आवश्यकता हो, तो कृपया ड्राइवर से सीधे संपर्क करें", + "No Car or Driver Found in your area.": + "आपके क्षेत्र में कोई कार या ड्राइवर नहीं मिला।", + "Please Try anther time ": "कृपया किसी और समय प्रयास करें ", + "There no Driver Aplly your order sorry for that ": + "कोई ड्राइवर आपका ऑर्डर अप्लाई नहीं कर रहा इसके लिए खेद है ", + "Trip Cancelled": "ट्रिप रद्द हो गई", + "The Driver Will be in your location soon .": + "ड्राइवर जल्द ही आपकी लोकेशन पर होगा।", + "The distance less than 500 meter.": "दूरी 500 मीटर से कम है।", + "Promo End !": "प्रोमो समाप्त!", + "There is no notification yet": "अभी तक कोई सूचना नहीं है", + "Use Touch ID or Face ID to confirm payment": + "भुगतान की पुष्टि के लिए टच आईडी या फेस आईडी का उपयोग करें", + "Contact us for any questions on your order.": + "अपने ऑर्डर पर किसी भी प्रश्न के लिए हमसे संपर्क करें।", + "Pyament Cancelled .": "भुगतान रद्द हो गया।", + "type here": "यहाँ टाइप करें", + "Scan Driver License": "ड्राइविंग लाइसेंस स्कैन करें", + "Please put your licence in these border": + "कृपया अपना लाइसेंस इन सीमाओं में रखें", + "Camera not initialized yet": "कैमरा अभी तक शुरू नहीं हुआ", + "Take Image": "तस्वीर लें", + "AI Page": "AI पेज", + "Take Picture Of ID Card": "आईडी कार्ड की तस्वीर लें", + "Take Picture Of Driver License Card": + "ड्राइविंग लाइसेंस कार्ड की तस्वीर लें", + "We are process picture please wait ": + "हम तस्वीर प्रोसेस कर रहे हैं कृपया प्रतीक्षा करें ", + "There is no data yet.": "अभी तक कोई डेटा नहीं है।", + "Name :": "नाम :", + "Drivers License Class: ": "ड्राइविंग लाइसेंस क्लास: ", + "Document Number: ": "दस्तावेज़ नंबर: ", + "Address: ": "पता: ", + "Height: ": "ऊंचाई: ", + "Expiry Date: ": "समाप्ति तिथि: ", + "Date of Birth: ": "जन्म तिथि: ", + "You can't continue with us .\nYou should renew Driver license": + "आप हमारे साथ जारी नहीं रख सकते।\nआपको ड्राइवर लाइसेंस का नवीनीकरण करना चाहिए", + "Detect Your Face ": "अपना चेहरा पहचानें ", + "Go to next step\nscan Car License.": + "अगले कदम पर जाएं\nकार लाइसेंस स्कैन करें।", + "Name in arabic": "स्थानीय नाम", + "Drivers License Class": "ड्राइविंग लाइसेंस क्लास", + "Selected Date": "चयनित तिथि", + "Select Time": "समय चुनें", + "Selected Time": "चयनित समय", + "Selected Date and Time": "चयनित तिथि और समय", + "Lets check Car license ": "आइए कार लाइसेंस (RC) चेक करें ", + "Car": "कार", + "Plate": "प्लेट", + "Rides": "सवारियां", + "Selected driver": "चयनित ड्राइवर", + "Lets check License Back Face": + "आइए लाइसेंस के पिछले हिस्से को चेक करें", + "Car License Card": "कार लाइसेंस कार्ड (RC)", + "No image selected yet": "अभी तक कोई छवि नहीं चुनी गई", + "Made :": "बनाया गया :", + "model :": "मॉडल :", + "VIN :": "VIN :", + "year :": "वर्ष :", + "ُExpire Date": "समाप्ति तिथि", + "Login Driver": "लॉगिन ड्राइवर", + "Password must br at least 6 character.": + "पासवर्ड कम से कम 6 अक्षरों का होना चाहिए।", + "if you don't have account": "अगर आपके पास खाता नहीं है", + "Here recorded trips audio": "यहाँ रिकॉर्ड किए गए ट्रिप्स का ऑडियो", + "Register as Driver": "बतौर ड्राइवर रजिस्टर करें", + "By selecting \"I Agree\" below, I have reviewed and agree to the Terms of Use and acknowledge the ": + "नीचे \"मैं सहमत हूँ\" को चुनकर, मैंने समीक्षा की है और उपयोग की शर्तों से सहमत हूँ और स्वीकार करता हूँ ", + "Log Out Page": "लॉग आउट पेज", + "Log Off": "लॉग ऑफ", + "Register Driver": "ड्राइवर रजिस्टर करें", + "Verify Email For Driver": "ड्राइवर के लिए ईमेल सत्यापित करें", + "Admin DashBoard": "एडमिन डैशबोर्ड", + "Your name": "आपका नाम", + "your ride is applied": "आपकी राइड लागू हो गई है", + "H and": "H और", + "JOD": "₹", + "m": "मिनट", + "We search nearst Driver to you": + "हम आपके निकटतम ड्राइवर को खोजते हैं", + "please wait till driver accept your order": + "कृपया प्रतीक्षा करें जब तक ड्राइवर आपका ऑर्डर स्वीकार न करे", + "No accepted orders? Try raising your trip fee to attract riders.": + "कोई स्वीकृत ऑर्डर नहीं? सवारों को आकर्षित करने के लिए अपनी ट्रिप फीस बढ़ाने की कोशिश करें।", + "You should select one": "आपको एक चुनना चाहिए", + "The driver accept your order for": + "ड्राइवर आपका ऑर्डर स्वीकार करता है के लिए", + "The driver on your way": "ड्राइवर आपके रास्ते में है", + "Total price from ": "से कुल कीमत ", + "Order Details Intaleq": "ऑर्डर विवरण Intaleq", + "Selected file:": "चयनित फ़ाइल:", + "Your trip cost is": "आपकी ट्रिप की कीमत है", + "this will delete all files from your device": + "यह आपके डिवाइस से सभी फ़ाइलें हटा देगा", + "Exclusive offers and discounts always with the Intaleq app": + "Intaleq ऐप के साथ हमेशा विशेष ऑफ़र और छूट", + "Submit Question": "प्रश्न जमा करें", + "Please enter your Question.": "कृपया अपना प्रश्न दर्ज करें।", + "Help Details": "मदद विवरण", + "No trip yet found": "अभी तक कोई ट्रिप नहीं मिला", + "No Response yet.": "अभी तक कोई जवाब नहीं मिला।", + " You Earn today is ": " आपकी आज की कमाई है ", + " You Have in": " आपके पास है में", + "Total points is ": "कुल अंक हैं ", + "Total Connection Duration:": "कुल कनेक्शन अवधि:", + "Passenger name : ": "यात्री का नाम : ", + "Cost Of Trip IS ": "ट्रिप की कीमत है ", + "Arrival time": "पहुंचने का समय", + "arrival time to reach your point": "आपके पॉइंट तक पहुंचने का समय", + "For Intaleq and scooter trips, the price is calculated dynamically. For Comfort trips, the price is based on time and distance": + "कीमत गतिशील रूप से की जाती है। कम्फर्ट ट्रिप्स के लिए, कीमत समय और दूरी पर आधारित होती है।", + "Hello this is Driver": "नमस्ते यह ड्राइवर है", + "Is the Passenger in your Car ?": "क्या यात्री आपकी कार में है?", + "Please wait for the passenger to enter the car before starting the trip.": + "कृपया ट्रिप शुरू करने से पहले यात्री के कार में प्रवेश करने का इंतज़ार करें।", + "No ,still Waiting.": "नहीं, अभी भी इंतज़ार कर रहा हूँ।", + "I arrive you": "मैं आपके पास पहुंच गया", + "I Arrive your site": "मैं आपकी लोकेशन पर पहुंच गया", + "You are not in near to passenger location": + "आप यात्री की लोकेशन के करीब नहीं हैं", + "please go to picker location exactly": + "कृपया बिल्कुल उसी लोकेशन पर जाएं जहां से उठाना है", + "You Can Cancel Trip And get Cost of Trip From": + "आप ट्रिप रद्द कर सकते हैं और ट्रिप की कीमत प्राप्त कर सकते हैं से", + "Are you sure to cancel?": "क्या आप रद्द करने के लिए निश्चित हैं?", + "Insert Emergincy Number": "आपातकालीन नंबर दर्ज करें", + "Best choice for comfort car and flexible route and stops point": + "आरामदायक कार और लचीले रास्ते और स्टॉप पॉइंट के लिए सबसे अच्छा विकल्प", + "Insert": "दर्ज करें", + "This is for scooter or a motorcycle.": + "यह स्कूटर या मोटरसाइकिल के लिए है।", + "This trip goes directly from your starting point to your destination for a fixed price. The driver must follow the planned route": + "यह ट्रिप आपके शुरुआती बिंदु से सीधे आपकी मंजिल तक एक निश्चित कीमत पर जाती है।", + "You can decline a request without any cost": + "आप बिना किसी लागत के अनुरोध अस्वीकार कर सकते हैं", + "Perfect for adventure seekers who want to experience something new and exciting": + "उन साहसी लोगों के लिए उत्तम जो कुछ नया अनुभव करना चाहते हैं", + "My current location is:": "मेरी वर्तमान लोकेशन है:", + "and I have a trip on": "और मेरे पास एक ट्रिप है पर", + "App with Passenger": "यात्री के साथ ऐप", + "You will be pay the cost to driver or we will get it from you on next trip": + "आप ड्राइवर को कीमत चुकाएंगे या हम अगली ट्रिप पर आपसे ले लेंगे", + "Trip has Steps": "ट्रिप के चरण हैं", + "Distance from Passenger to destination is ": + "यात्री से गंतव्य तक की दूरी है ", + "price is": "कीमत है", + "This ride type does not allow changes to the destination or additional stops": + "इस प्रकार की सवारी गंतव्य में परिवर्तन या अतिरिक्त स्टॉप की अनुमति नहीं देती", + "This price may be changed": "यह कीमत बदल सकती है", + "No SIM card, no problem! Call your driver directly through our app. We use advanced technology to ensure your privacy.": + "कोई सिम कार्ड नहीं, कोई समस्या नहीं! हमारे ऐप के माध्यम से सीधे अपने ड्राइवर को कॉल करें।", + "This ride type allows changes, but the price may increase": + "इस प्रकार की सवारी परिवर्तनों की अनुमति देती है, लेकिन कीमत बढ़ सकती है", + "Select one message": "एक संदेश चुनें", + "I'm waiting for you": "मैं आपका इंतज़ार कर रहा हूँ", + "We noticed the Intaleq is exceeding 100 km/h. Please slow down for your safety. If you feel unsafe, you can share your trip details with a contact or call the police using the red SOS button.": + "हमने देखा कि Intaleq 100 किमी/घंटा से अधिक हो रहा है। कृपया अपनी सुरक्षा के लिए धीमा करें।", + "Warning: Intaleqing detected!": "चेतावनी: तेज गति का पता चला!", + "Please help! Contact me as soon as possible.": + "कृपया मदद करें! जितनी जल्दी हो सके मुझसे संपर्क करें।", + "Share Trip Details": "ट्रिप विवरण साझा करें", + "Car Plate is ": "कार प्लेट है ", + "the 300 points equal 300 L.E for you \nSo go and gain your money": + "300 अंक आपके लिए 300 रुपये के बराबर हैं \nतो जाएं और अपने पैसे कमाएं", + "the 300 points equal 300 L.E": "300 अंक 300 रुपये के बराबर हैं", + "The payment was not approved. Please try again.": + "भुगतान स्वीकृत नहीं हुआ। कृपया पुनः प्रयास करें।", + "Payment Failed": "भुगतान विफल हो गया", + "This is a scheduled notification.": "यह एक निर्धारित सूचना है।", + "An error occurred during the payment process.": + "भुगतान प्रक्रिया के दौरान एक त्रुटि हुई।", + "The payment was approved.": "भुगतान स्वीकृत हो गया।", + "Payment Successful": "भुगतान सफल", + "No ride found yet": "अभी तक कोई सवारी नहीं मिली", + "Accept Order": "ऑर्डर स्वीकार करें", + "Bottom Bar Example": "बॉटम बार उदाहरण", + "Driver phone": "ड्राइवर का फ़ोन", + "Statistics": "सांख्यिकी", + "Origin": "मूल", + "Destination": "गंतव्य", + "Driver Name": "ड्राइवर का नाम", + "Driver Car Plate": "ड्राइवर कार प्लेट", + "Available for rides": "सवारियों के लिए उपलब्ध", + "Scan Id": "आईडी स्कैन करें", + "Camera not initilaized yet": "कैमरा अभी तक शुरू नहीं हुआ", + "Scan ID MklGoogle": "आईडी MklGoogle स्कैन करें", + "Language": "भाषा", + "Jordan": "जॉर्डन", + "USA": "अमेरीका", + "Egypt": "मिस्र", + "Turkey": "तुर्की", + "Saudi Arabia": "सऊदी अरब", + "Qatar": "कतर", + "Bahrain": "बहरीन", + "Kuwait": "कुवैत", + "But you have a negative salary of": "लेकिन आपकी नकारात्मक आय है", + "Promo Code": "प्रोमो कोड", + "Your trip distance is": "आपकी ट्रिप की दूरी है", + "Enter promo code": "प्रोमो कोड दर्ज करें", + "You have promo!": "आपके पास प्रोमो है!", + "Cost Duration": "लागत अवधि", + "Duration is": "अवधि है", + "Leave": "छोड़ें", + "Join": "शामिल हों", + "Heading your way now. Please be ready.": + "अब आपके रास्ते की ओर बढ़ रहा हूँ। कृपया तैयार रहें।", + "Approaching your area. Should be there in 3 minutes.": + "आपके क्षेत्र के करीब पहुँच रहा हूँ। 3 मिनट में वहां होना चाहिए।", + "There's heavy traffic here. Can you suggest an alternate pickup point?": + "यहाँ ट्रैफ़िक बहुत है। क्या आप वैकल्पिक पिकअप पॉइंट सुझा सकते हैं?", + "This ride is already taken by another driver.": + "यह सवारी पहले ही किसी अन्य ड्राइवर ने ले ली है।", + "You Should be select reason.": "आपको कारण चुनना चाहिए।", + "Waiting for Driver ...": "ड्राइवर का इंतज़ार...", + "Latest Recent Trip": "नवीनतम हाल की ट्रिप", + "from your list": "आपकी सूची से", + "Do you want to change Work location": + "क्या आप काम की लोकेशन बदलना चाहते हैं", + "Do you want to change Home location": + "क्या आप घर की लोकेशन बदलना चाहते हैं", + "We Are Sorry That we dont have cars in your Location!": + "हम क्षमा चाहते हैं कि हमारे पास आपकी लोकेशन में कारें नहीं हैं!", + "Choose from Map": "मैप से चुनें", + "Pick your ride location on the map - Tap to confirm": + "मैप पर अपनी सवारी की लोकेशन चुनें - पुष्टि के लिए टैप करें", + "Intaleq is the ride-hailing app that is safe, reliable, and accessible.": + "Intaleq एक राइड-हेलिंग ऐप है जो सुरक्षित, विश्वसनीय और सुलभ है।", + "With Intaleq, you can get a ride to your destination in minutes.": + "Intaleq के साथ, आप मिनटों में अपनी मंजिल तक सवारी प्राप्त कर सकते हैं।", + "Intaleq is committed to safety, and all of our captains are carefully screened and background checked.": + "Intaleq सुरक्षा के लिए प्रतिबद्ध है।", + "Pick from map": "मैप से चुनें", + "No Car in your site. Sorry!": + "आपकी जगह पर कोई कार नहीं। क्षमा करें!", + "Nearest Car for you about ": "आपके लिए निकटतम कार लगभग ", + "From :": "से :", + "Get Details of Trip": "ट्रिप का विवरण प्राप्त करें", + "If you want add stop click here": + "यदि आप स्टॉप जोड़ना चाहते हैं तो यहां क्लिक करें", + "Where you want go ": "आप कहाँ जाना चाहते हैं ", + "My Card": "मेरा कार्ड", + "Start Record": "रिकॉर्ड शुरू करें", + "History of Trip": "ट्रिप का इतिहास", + "Helping Center": "सहायता केंद्र", + "Record saved": "रिकॉर्ड सहेजा गया", + "Trips recorded": "ट्रिप्स रिकॉर्ड की गईं", + "Select Your Country": "अपना देश चुनें", + "To ensure you receive the most accurate information for your location, please select your country below. This will help tailor the app experience and content to your country.": + "यह सुनिश्चित करने के लिए कि आपको अपनी लोकेशन के लिए सबसे सटीक जानकारी मिले, कृपया अपना देश चुनें।", + "Are you sure to delete recorded files": + "क्या आप वाकई रिकॉर्ड की गई फ़ाइलें हटाना चाहते हैं", + "Select recorded trip": "रिकॉर्ड की गई ट्रिप चुनें", + "Card Number": "कार्ड नंबर", + "Hi, Where to ": "नमस्ते, कहाँ जाना है ", + "Pick your destination from Map": "मैप से अपनी मंजिल चुनें", + "Add Stops": "स्टॉप्स जोड़ें", + "Get Direction": "दिशा प्राप्त करें", + "Add Location": "लोकेशन जोड़ें", + "Switch Rider": "राइडर बदलें", + "You will arrive to your destination after timer end.": + "टाइमर समाप्त होने के बाद आप अपनी मंजिल पर पहुंच जाएंगे।", + "You can cancel trip": "आप ट्रिप रद्द कर सकते हैं", + "The driver waitting you in picked location .": + "ड्राइवर पिक की गई लोकेशन पर आपका इंतज़ार कर रहा है।", + "Pay with Your": "अपने साथ भुगतान करें", + "Pay with Credit Card": "क्रेडिट कार्ड से भुगतान करें", + "Show Promos to Charge": "चार्ज करने के लिए प्रोमो दिखाएं", + "Point": "अंक", + "How many hours would you like to wait?": + "आप कितने घंटे इंतज़ार करना चाहेंगे?", + "Driver Wallet": "ड्राइवर वॉलेट", + "Choose between those Type Cars": "उन प्रकार की कारों के बीच चुनें", + "hour": "घंटा", + "Select Waiting Hours": "प्रतीक्षा के घंटे चुनें", + "Total Points is": "कुल अंक हैं", + "You will receive a code in SMS message": + "आपको SMS संदेश में एक कोड प्राप्त होगा", + "Done": "हो गया", + "Total Budget from trips is ": "ट्रिप्स से कुल बजट है ", + "Total Amount:": "कुल राशि:", + "Total Budget from trips by\nCredit card is ": + "क्रेडिट कार्ड द्वारा ट्रिप्स से\nकुल बजट है ", + "This amount for all trip I get from Passengers": + "यह राशि सभी ट्रिप के लिए जो मुझे यात्रियों से मिलती है", + "Pay from my budget": "मेरे बजट से भुगतान करें", + "This amount for all trip I get from Passengers and Collected For me in": + "यह राशि सभी ट्रिप के लिए जो मुझे यात्रियों से मिलती है और मेरे लिए एकत्र की गई है", + "You can buy points from your budget": + "आप अपने बजट से अंक खरीद सकते हैं", + "insert amount": "राशि डालें", + "You can buy Points to let you online\nby this list below": + "आप ऑनलाइन रहने के लिए अंक खरीद सकते हैं\nनीचे दी गई इस सूची द्वारा", + "Create Wallet to receive your money": + "अपना पैसा प्राप्त करने के लिए वॉलेट बनाएं", + "Enter your feedback here": "अपना फीडबैक यहाँ दर्ज करें", + "Please enter your feedback.": "कृपया अपना फीडबैक दर्ज करें।", + "Feedback": "फीडबैक", + "Submit ": "जमा करें ", + "Click here to Show it in Map": + "इसे मैप में दिखाने के लिए यहां क्लिक करें", + "Canceled": "रद्द", + "No I want": "नहीं मैं चाहता हूँ", + "Email is": "ईमेल है:", + "Phone Number is": "फ़ोन नंबर है:", + "Date of Birth is": "जन्म तिथि है:", + "Sex is ": "लिंग है: ", + "Car Details": "कार विवरण", + "VIN is": "VIN है:", + "Color is ": "रंग है: ", + "Make is ": "मेक है: ", + "Model is": "मॉडल है:", + "Year is": "वर्ष है:", + "Expiration Date ": "समाप्ति तिथि: ", + "Edit Your data": "अपना डेटा संपादित करें", + "write vin for your car": "अपनी कार के लिए vin लिखें", + "VIN": "VIN", + "Please verify your identity": "कृपया अपनी पहचान सत्यापित करें", + "write Color for your car": "अपनी कार के लिए रंग लिखें", + "write Make for your car": "अपनी कार के लिए मेक लिखें", + "write Model for your car": "अपनी कार के लिए मॉडल लिखें", + "write Year for your car": "अपनी कार के लिए वर्ष लिखें", + "write Expiration Date for your car": + "अपनी कार के लिए समाप्ति तिथि लिखें", + "Tariffs": "टैरिफ", + "Minimum fare": "न्यूनतम किराया", + "Maximum fare": "अधिकतम किराया", + "Flag-down fee": "फ्लैग-डाउन फीस", + "Including Tax": "टैक्स सहित", + "BookingFee": "बुकिंग फीस", + "Morning": "सुबह", + "from 07:30 till 10:30 (Thursday, Friday, Saturday, Monday)": + "07:30 से 10:30 तक", + "Evening": "शाम", + "from 12:00 till 15:00 (Thursday, Friday, Saturday, Monday)": + "12:00 से 15:00 तक", + "Night": "रात", + "You have in account": "आपके खाते में है", + "Select Country": "देश चुनें", + "Ride Today : ": "आज की सवारी: ", + "After this period\nYou can't cancel!": + "इस अवधि के बाद\nआप रद्द नहीं कर सकते!", + "from 23:59 till 05:30": "23:59 से 05:30 तक", + "Rate Driver": "ड्राइवर को रेट करें", + "Total Cost is ": "कुल कीमत है ", + "Write note": "नोट लिखें", + "Time to arrive": "पहुंचने का समय", + "Ride Summaries": "सवारी के सारांश", + "Total Cost": "कुल कीमत", + "Average of Hours of": "घंटों का औसत", + " is ON for this month": " इस महीने के लिए ऑन है", + "Days": "दिन", + "Total Hours on month": "महीने में कुल घंटे", + "Counts of Hours on days": "दिनों में घंटों की गिनती", + "OrderId": "ऑर्डर आईडी", + "created time": "बनाने का समय", + "Intaleq Over": "Intaleq समाप्त", + "I will slow down": "मैं धीमा हो जाऊंगा", + "Map Passenger": "मानचित्र यात्री", + "Be Slowly": "धीरे रहें", + "If you want to make Google Map App run directly when you apply order": + "यदि आप चाहते हैं कि जब आप ऑर्डर लागू करें तो गूगल मैप ऐप सीधे चले", + "You can change the language of the app": + "आप ऐप की भाषा बदल सकते हैं", + "Your Budget less than needed": "आपका बजट आवश्यकता से कम है", + "You can change the Country to get all features": + "आप सभी सुविधाएँ प्राप्त करने के लिए देश बदल सकते हैं", + "There is no Car or Driver in your area.": + "आपके क्षेत्र में कोई कार या ड्राइवर नहीं है।", + "Change Country": "देश बदलें", + }, + "ru": { + "About Intaleq": "Об Intaleq", + "Chat with us anytime": "Пишите нам в любое время", + "Direct talk with our team": "Прямой разговор с нашей командой", + "Email Support": "Поддержка по электронной почте", + "For official inquiries": "Для официальных запросов", + "Intaleq Support": "Поддержка Intaleq", + "Reach out to us via": "Свяжитесь с нами через", + "Support is Away": "Поддержка сейчас недоступна", + "Support is currently Online": "Поддержка сейчас онлайн", + "Voice Call": "Голосовой звонок", + "We're here to help you 24/7": "Мы готовы помочь вам 24/7", + "Working Hours:": "Рабочие часы:", + "1 Passenger": "1 Passenger", + "2 Passengers": "2 Passengers", + "3 Passengers": "3 Passengers", + "4 Passengers": "4 Passengers", + "2. Attach Recorded Audio (Optional)": + "2. Attach Recorded Audio (Optional)", + "Account": "Account", + "Actions": "Actions", + "Active Users": "Active Users", + "Add a Stop": "Add a Stop", + "Add a new waypoint stop": "Add a new waypoint stop", + "After this period\nYou can\'t cancel!": + "After this period\nYou can\'t cancel!", + "Age is": "Age is", + "Alert": "Alert", + "An OTP has been sent to your number.": + "An OTP has been sent to your number.", + "An error occurred": "An error occurred", + "Appearance": "Appearance", + "Are you sure you want to delete this file?": + "Are you sure you want to delete this file?", + "Are you sure you want to logout?": + "Are you sure you want to logout?", + "Arrived": "Arrived", + "Audio Recording": "Audio Recording", + "Call": "Call", + "Call Support": "Call Support", + "Call left": "Call left", + "Change Photo": "Change Photo", + "Choose from Gallery": "Choose from Gallery", + "Choose from contact": "Choose from contact", + "Click to track the trip": "Click to track the trip", + "Close panel": "Close panel", + "Coming": "Coming", + "Complete Payment": "Complete Payment", + "Confirm Cancellation": "Confirm Cancellation", + "Confirm Pickup Location": "Confirm Pickup Location", + "Connection failed. Please try again.": + "Connection failed. Please try again.", + "Could not create ride. Please try again.": + "Could not create ride. Please try again.", + "Crop Photo": "Crop Photo", + "Dark Mode": "Dark Mode", + "Delete": "Delete", + "Delete Account": "Delete Account", + "Delete All": "Delete All", + "Delete All Recordings?": "Delete All Recordings?", + "Delete Recording?": "Delete Recording?", + "Destination Set": "Destination Set", + "Distance": "Distance", + "Double tap to open search or enter destination": + "Double tap to open search or enter destination", + "Double tap to set or change this waypoint on the map": + "Double tap to set or change this waypoint on the map", + "Drawing route on map...": "Drawing route on map...", + "Driver Phone": "Driver Phone", + "Driver is Going To You": "Driver is Going To You", + "Emergency Mode Triggered": "Emergency Mode Triggered", + "Emergency SOS": "Emergency SOS", + "Enter the 5-digit code": "Enter the 5-digit code", + "Enter your City": "Enter your City", + "Enter your Password": "Enter your Password", + "Failed to book trip: \$e": "Failed to book trip: \$e", + "Failed to get location": "Failed to get location", + "Failed to initiate payment. Please try again.": + "Failed to initiate payment. Please try again.", + "Failed to send OTP": "Failed to send OTP", + "Failed to upload photo": "Failed to upload photo", + "Finished": "Finished", + "Fixed Price": "Fixed Price", + "General": "General", + "Grant": "Grant", + "Have a Promo Code?": "Have a Promo Code?", + "Hello! I\'m inviting you to try Intaleq.": + "Hello! I\'m inviting you to try Intaleq.", + "Hi ,I Arrive your site": "Hi ,I Arrive your site", + "Hi, Where to": "Hi, Where to", + "Home": "Home", + "I am currently located at": "I am currently located at", + "I'm Safe": "I'm Safe", + "If you need to reach me, please contact the driver directly at": + "If you need to reach me, please contact the driver directly at", + "Image Upload Failed": "Image Upload Failed", + "Intaleq Passenger": "Intaleq Passenger", + "Invite": "Invite", + "Join a channel": "Join a channel", + "Last Name": "Last Name", + "Leave a detailed comment (Optional)": + "Leave a detailed comment (Optional)", + "Light Mode": "Light Mode", + "Listen": "Listen", + "Location": "Location", + "Location Received": "Location Received", + "Logout": "Logout", + "Map Error": "Map Error", + "Message": "Message", + "Move map to select destination": "Move map to select destination", + "Move map to set start location": "Move map to set start location", + "Move map to set stop": "Move map to set stop", + "Move map to your home location": "Move map to your home location", + "Move map to your pickup point": "Move map to your pickup point", + "Move map to your work location": "Move map to your work location", + "N/A": "N/A", + "No Notifications": "No Notifications", + "No Recordings Found": "No Recordings Found", + "No Rides now!": "No Rides now!", + "No contacts available": "No contacts available", + "No i want": "No i want", + "No notification data found.": "No notification data found.", + "No routes available for this destination.": + "No routes available for this destination.", + "No user found": "No user found", + "No,I want": "No,I want", + "No.Iwant Cancel Trip.": "No.Iwant Cancel Trip.", + "Now move the map to your pickup point": + "Now move the map to your pickup point", + "Now set the pickup point for the other person": + "Now set the pickup point for the other person", + "On Trip": "On Trip", + "Open": "Open", + "Open destination search": "Open destination search", + "Open in Google Maps": "Open in Google Maps", + "Order VIP Canceld": "Order VIP Canceld", + "Passenger": "Passenger", + "Passenger cancel order": "Passenger cancel order", + "Pay by MTN Wallet": "Pay by MTN Wallet", + "Pay by Sham Cash": "Pay by Sham Cash", + "Pay by Syriatel Wallet": "Pay by Syriatel Wallet", + "Pay with PayPal": "Pay with PayPal", + "Phone": "Phone", + "Phone Number": "Phone Number", + "Phone Number Check": "Phone Number Check", + "Phone number seems too short": "Phone number seems too short", + "Phone verified. Please complete registration.": + "Phone verified. Please complete registration.", + "Pick destination on map": "Pick destination on map", + "Pick location on map": "Pick location on map", + "Pick on map": "Pick on map", + "Pick start point on map": "Pick start point on map", + "Plan Your Route": "Plan Your Route", + "Please add contacts to your phone.": + "Please add contacts to your phone.", + "Please check your internet and try again.": + "Please check your internet and try again.", + "Please enter a valid email.": "Please enter a valid email.", + "Please enter a valid phone number.": + "Please enter a valid phone number.", + "Please enter the number without the leading 0": + "Please enter the number without the leading 0", + "Please enter your phone number": "Please enter your phone number", + "Please go to Car now": "Please go to Car now", + "Please select a reason first": "Please select a reason first", + "Please set a valid SOS phone number.": + "Please set a valid SOS phone number.", + "Please slow down": "Please slow down", + "Please wait while we prepare your trip.": + "Please wait while we prepare your trip.", + "Preferences": "Preferences", + "Profile photo updated": "Profile photo updated", + "Quick Message": "Quick Message", + "Rating is": "Rating is", + "Received empty route data.": "Received empty route data.", + "Record": "Record", + "Record your trips to see them here.": + "Record your trips to see them here.", + "Rejected Orders Count": "Rejected Orders Count", + "Remove waypoint": "Remove waypoint", + "Report": "Report", + "Route and prices have been calculated successfully!": + "Route and prices have been calculated successfully!", + "SOS": "SOS", + "Save": "Save", + "Save Changes": "Save Changes", + "Save Name": "Save Name", + "Search country": "Search country", + "Search for a starting point": "Search for a starting point", + "Select Appearance": "Select Appearance", + "Select Education": "Select Education", + "Select Gender": "Select Gender", + "Select This Ride": "Select This Ride", + "Select betweeen types": "Select betweeen types", + "Send Email": "Send Email", + "Send SOS": "Send SOS", + "Send WhatsApp Message": "Send WhatsApp Message", + "Server Error": "Server Error", + "Server error": "Server error", + "Server error. Please try again.": "Server error. Please try again.", + "Set Destination": "Set Destination", + "Set Phone Number": "Set Phone Number", + "Set as Home": "Set as Home", + "Set as Stop": "Set as Stop", + "Set as Work": "Set as Work", + "Share": "Share", + "Share Trip": "Share Trip", + "Share your experience to help us improve...": + "Share your experience to help us improve...", + "Something went wrong. Please try again.": + "Something went wrong. Please try again.", + "Speaking...": "Speaking...", + "Speed Over": "Speed Over", + "Start Point": "Start Point", + "Stay calm. We are here to help.": "Stay calm. We are here to help.", + "Stop": "Stop", + "Submit Rating": "Submit Rating", + "Support & Info": "Support & Info", + "System Default": "System Default", + "Take a Photo": "Take a Photo", + "Tap to apply your discount": "Tap to apply your discount", + "Tap to search your destination": "Tap to search your destination", + "The driver cancelled the trip.": "The driver cancelled the trip.", + "This action cannot be undone.": "This action cannot be undone.", + "This action is permanent and cannot be undone.": + "This action is permanent and cannot be undone.", + "This is for delivery or a motorcycle.": + "This is for delivery or a motorcycle.", + "Time": "Time", + "To :": "To :", + "Top up Balance": "Top up Balance", + "Top up Balance to continue": "Top up Balance to continue", + "Total Invites": "Total Invites", + "Total Price": "Total Price", + "Trip booked successfully": "Trip booked successfully", + "Type your message...": "Type your message...", + "Unknown Location": "Unknown Location", + "Update Name": "Update Name", + "Verified Passenger": "Verified Passenger", + "View Map": "View Map", + "Wait for the trip to start first": + "Wait for the trip to start first", + "Waiting...": "Waiting...", + "Warning": "Warning", + "Waypoint has been set successfully": + "Waypoint has been set successfully", + "We use location to get accurate and nearest driver for you": + "We use location to get accurate and nearest driver for you", + "WhatsApp": "WhatsApp", + "Why do you want to cancel?": "Why do you want to cancel?", + "Yes": "Yes", + "You should ideintify your gender for this type of trip!": + "You should ideintify your gender for this type of trip!", + "You will choose one of above!": "You will choose one of above!", + "Your Rewards": "Your Rewards", + "Your complaint has been submitted.": + "Your complaint has been submitted.", + "and acknowledge our Privacy Policy.": + "and acknowledge our Privacy Policy.", + "as the driver.": "as the driver.", + "cancelled": "cancelled", + "due to a previous trip.": "due to a previous trip.", + "insert sos phone": "insert sos phone", + "is driving a": "is driving a", + "min added to fare": "min added to fare", + "phone not verified": "phone not verified", + "to arrive you.": "to arrive you.", + "unknown": "unknown", + "wait 1 minute to recive message": "wait 1 minute to recive message", + "with license plate": "with license plate", + "witout zero": "witout zero", + "you must insert token code": "you must insert token code", + "Syria": "Сирия", + "SYP": "SYP", + "Order": "Заказ", + "OrderVIP": "VIP Заказ", + "Cancel Trip": "Отменить поездку", + "Passenger Cancel Trip": "Пассажир отменил поездку", + "VIP Order": "VIP Заказ", + "The driver accepted your trip": "Водитель принял ваш заказ", + "message From passenger": "Сообщение от пассажира", + "Cancel": "Отмена", + "Trip Cancelled. The cost of the trip will be added to your wallet.": + "Поездка отменена. Стоимость возвращена на ваш кошелек.", + "token change": "Смена токена", + "Changed my mind": "Я передумал", + "Please write the reason...": "Пожалуйста, напишите причину...", + "Found another transport": "Нашел другой транспорт", + "Driver is taking too long": "Водитель едет слишком долго", + "Driver asked me to cancel": "Водитель попросил меня отменить", + "Wrong pickup location": "Неверное место подачи", + "Other": "Другой", + "Don't Cancel": "Не отменять", + "No Drivers Found": "Водители не найдены", + "Sorry, there are no cars available of this type right now.": + "Извините, сейчас нет доступных машин этого типа.", + "Refresh Map": "Обновить карту", + "face detect": "Распознавание лица", + "Face Detection Result": "Результат распознавания", + "similar": "Похож", + "not similar": "Не похож", + "Searching for nearby drivers...": "Поиск водителей поблизости...", + "Error": "Ошибка", + "Failed to search, please try again later": + "Ошибка поиска, попробуйте еще раз позже", + "Connection Error": "Ошибка подключения", + "Please check your internet connection": + "Пожалуйста, проверьте интернет-соединение", + "Sorry 😔": "Извините 😔", + "The driver cancelled the trip for an emergency reason.\nDo you want to search for another driver immediately?": + "Водитель отменил поездку по экстренной причине.\nХотите немедленно найти другого водителя?", + "Search for another driver": "Найти другого водителя", + "We apologize 😔": "Мы приносим извинения 😔", + "No drivers found at the moment.\nPlease try again later.": + "В данный момент водителей не найдено.\nПожалуйста, попробуйте еще раз позже.", + "Hi ,I will go now": "Здравствуйте, я выезжаю", + "Passenger come to you": "Пассажир идет к вам", + "Call Income": "Входящий вызов", + "Call Income from Passenger": "Вызов от пассажира", + "Criminal Document Required": "Требуется справка о несудимости", + "You should have upload it .": "Вы должны загрузить её.", + "Call End": "Вызов завершен", + "The order has been accepted by another driver.": + "Заказ принят другим водителем.", + "The order Accepted by another Driver": + "Заказ принят другим водителем", + "We regret to inform you that another driver has accepted this order.": + "К сожалению, этот заказ принял другой водитель.", + "Driver Applied the Ride for You": "Водитель создал поездку для вас", + "Applied": "Создан", + "Please go to Car Driver": "Пожалуйста, пройдите к водителю", + "Ok I will go now.": "Хорошо, иду.", + "Accepted Ride": "Принятая поездка", + "Driver Accepted the Ride for You": "Водитель принял поездку для вас", + "Promo": "Промокод", + "Show latest promo": "Показать промокоды", + "Trip Monitoring": "Мониторинг поездки", + "Driver Is Going To Passenger": "Водитель едет к пассажиру", + "Please stay on the picked point.": + "Пожалуйста, оставайтесь в точке посадки.", + "message From Driver": "Сообщение от водителя", + "Trip is Begin": "Поездка началась", + "Cancel Trip from driver": "Отмена поездки водителем", + "We will look for a new driver.\nPlease wait.": + "Ищем нового водителя.\nПодождите.", + "The driver canceled your ride.": "Водитель отменил поездку.", + "Driver Finish Trip": "Водитель завершил поездку", + "you will pay to Driver": "К оплате водителю", + "Don’t forget your personal belongings.": "Не забудьте личные вещи.", + "Please make sure you have all your personal belongings and that any remaining fare, if applicable, has been added to your wallet before leaving. Thank you for choosing the Intaleq app": + "Проверьте вещи и баланс кошелька перед выходом. Спасибо за выбор Intaleq.", + "Finish Monitor": "Завершить", + "Trip finished": "Поездка завершена", + "Call Income from Driver": "Звонок от водителя", + "Driver Cancelled Your Trip": "Водитель отменил вашу поездку", + "you will pay to Driver you will be pay the cost of driver time look to your Intaleq Wallet": + "Оплата за время водителя, см. кошелек Intaleq", + "Order Applied": "Заказ принят", + "welcome to intaleq": "Добро пожаловать в Intaleq", + "login or register subtitle": + "Введите номер телефона для входа или регистрации", + "Complaint cannot be filed for this ride. It may not have been completed or started.": + "Нельзя подать жалобу на эту поездку. Возможно, она не завершена или не начата.", + "phone number label": "Номер телефона", + "phone number required": "Требуется номер телефона", + "send otp button": "Отправить код", + "verify your number title": "Подтверждение номера", + "otp sent subtitle": "5-значный код отправлен на\n@phoneNumber", + "verify and continue button": "Подтвердить и продолжить", + "enter otp validation": "Введите 5-значный код", + "one last step title": "Последний шаг", + "complete profile subtitle": "Заполните профиль для начала", + "first name label": "Имя", + "first name required": "Имя обязательно", + "last name label": "Фамилия", + "Verify OTP": "Проверка кода", + "Verification Code": "Код подтверждения", + "We have sent a verification code to your mobile number:": + "Мы отправили код подтверждения на ваш номер:", + "Verify": "Подтвердить", + "Resend Code": "Отправить снова", + "You can resend in": "Отправить снова через", + "seconds": "сек", + "Please enter the complete 6-digit code.": + "Введите полный 6-значный код.", + "last name required": "Фамилия обязательна", + "email optional label": "Email (необязательно)", + "complete registration button": "Завершить регистрацию", + "User with this phone number or email already exists.": + "Пользователь с таким номером или email уже существует.", + "otp sent success": "Код отправлен в WhatsApp.", + "failed to send otp": "Не удалось отправить код.", + "server error try again": "Ошибка сервера, попробуйте снова.", + "an error occurred": "Произошла ошибка: @error", + "otp verification failed": "Неверный код.", + "registration failed": "Ошибка регистрации.", + "welcome user": "Добро пожаловать, @firstName!", + "Don't forget your personal belongings.": "Не забудьте личные вещи.", + "Share App": "Поделиться приложением", + "Wallet": "Кошелек", + "Balance": "Баланс", + "Profile": "Профиль", + "Contact Support": "Поддержка", + "Session expired. Please log in again.": + "Сессия истекла. Войдите снова.", + "Security Warning": "⚠️ Угроза безопасности", + "Potential security risks detected. The application may not function correctly.": + "Обнаружены риски безопасности. Приложение может работать некорректно.", + "please order now": "Заказать сейчас", + "Where to": "Куда едем?", + "Where are you going?": "Куда вы направляетесь?", + "Quick Actions": "Быстрые действия", + "My Balance": "Мой баланс", + "Order History": "История заказов", + "Contact Us": "Связаться с нами", + "Driver": "Водитель", + "Complaint": "Жалоба", + "Promos": "Промоакции", + "Recent Places": "Недавние места", + "From": "Откуда", + "WhatsApp Location Extractor": "Локация из WhatsApp", + "Location Link": "Ссылка на локацию", + "Paste location link here": "Вставьте ссылку здесь", + "Go to this location": "Перейти к локации", + "Paste WhatsApp location link": "Вставьте ссылку WhatsApp", + "Select Order Type": "Тип заказа", + "Choose who this order is for": "Для кого этот заказ", + "I want to order for myself": "Заказать для себя", + "I want to order for someone else": "Заказать другому человеку", + "Order for someone else": "Заказ другому", + "Order for myself": "Заказ себе", + "Are you want to go this site": "Вы хотите поехать сюда?", + "No": "Нет", + "Intaleq Wallet": "Кошелек Intaleq", + "Have a promo code?": "Есть промокод?", + "Your Wallet balance is ": "Ваш баланс: ", + "Cash": "Наличные", + "Pay directly to the captain": "Оплата водителю напрямую", + "Top up Wallet to continue": "Пополните кошелек для продолжения", + "Or pay with Cash instead": "Или оплатите наличными", + "Confirm & Find a Ride": "Подтвердить и найти", + "Balance:": "Баланс:", + "Alerts": "Уведомления", + "Welcome Back!": "С возвращением!", + "Current Balance": "Текущий баланс", + "Set Wallet Phone Number": "Номер для кошелька", + "Link a phone number for transfers": "Привязать номер для переводов", + "Payment History": "История платежей", + "View your past transactions": "Просмотр транзакций", + "Top up Wallet": "Пополнить кошелек", + "Add funds using our secure methods": "Пополнить безопасным способом", + "Increase Fare": "Повысить цену", + "No drivers accepted your request yet": "Никто еще не принял заказ", + "Increasing the fare might attract more drivers. Would you like to increase the price?": + "Повышение цены привлечет водителей. Повысить?", + "Please make sure not to leave any personal belongings in the car.": + "Убедитесь, что не оставили вещи в машине.", + "Cancel Ride": "Отмена", + "Route Not Found": "Маршрут не найден", + "We couldn't find a valid route to this destination. Please try selecting a different point.": + "Не удалось построить маршрут. Выберите другую точку.", + "You can call or record audio during this trip.": + "Вы можете звонить или вести запись во время поездки.", + "Warning: Speeding detected!": "Внимание: Превышение скорости!", + "Comfort": "Комфорт", + "Intaleq Balance": "Баланс Intaleq", + "Electric": "Электро", + "Lady": "Женский", + "Van": "Минивэн", + "Rayeh Gai": "Туда-обратно", + "Join Intaleq as a driver using my referral code!": + "Стань водителем Intaleq с моим кодом!", + "Use code:": "Код:", + "Download the Intaleq Driver app now and earn rewards!": + "Скачай Intaleq Driver и получай бонусы!", + "Get a discount on your first Intaleq ride!": + "Скидка на первую поездку в Intaleq!", + "Use my referral code:": "Используй мой код:", + "Download the Intaleq app now and enjoy your ride!": + "Скачай Intaleq и наслаждайся поездкой!", + "Contacts Loaded": "Контакты загружены", + "Showing": "Показано", + "of": "из", + "Customer not found": "Клиент не найден", + "Wallet is blocked": "Кошелек заблокирован", + "Customer phone is not active": "Телефон клиента не активен", + "Balance not enough": "Недостаточно средств", + "Balance limit exceeded": "Лимит баланса превышен", + "Incorrect sms code": "⚠️ Неверный СМС код.", + "contacts. Others were hidden because they don't have a phone number.": + "контактов. Остальные скрыты (нет номера).", + "No contacts found": "Контакты не найдены", + "No contacts with phone numbers were found on your device.": + "На устройстве нет контактов с номерами.", + "Permission denied": "Доступ запрещен", + "Contact permission is required to pick contacts": + "Нужен доступ к контактам.", + "An error occurred while picking contacts:": + "Ошибка при выборе контактов:", + "Please enter a correct phone": "Введите корректный номер", + "Success": "Успешно", + "Invite sent successfully": "Приглашение отправлено", + "Hello! I'm inviting you to try Intaleq.": + "Привет! Приглашаю попробовать Intaleq.", + "Use my invitation code to get a special gift on your first ride!": + "Используй мой код для подарка на первую поездку!", + "Your personal invitation code is:": "Твой код приглашения:", + "Be sure to use it quickly! This code expires at": + "Используй быстрее! Код истекает", + "Download the app now:": "Скачай приложение:", + "See you on the road!": "До встречи в пути!", + "This phone number has already been invited.": + "Этот номер уже приглашен.", + "An unexpected error occurred. Please try again.": + "Неожиданная ошибка. Попробуйте снова.", + "You deserve the gift": "Вы заслужили подарок", + "Claim your 20 LE gift for inviting": "Заберите 20 ₽ за приглашение", + "You have got a gift for invitation": + "Вы получили подарок за приглашение", + "You have earned 20": "Вы заработали 20", + "LE": "₽", + "Vibration feedback for all buttons": "Вибрация кнопок", + "Share with friends and earn rewards": + "Делись с друзьями и получай бонусы", + "Gift Already Claimed": "Подарок уже получен", + "You have already received your gift for inviting": + "Вы уже получили подарок за это приглашение", + "Keep it up!": "Так держать!", + "has completed": "завершил", + "trips": "поездок", + "Personal Information": "Личная информация", + "Name": "Имя", + "Not set": "Не задано", + "Gender": "Пол", + "Education": "Образование", + "Work & Contact": "Работа и Контакты", + "Employment Type": "Тип занятости", + "Marital Status": "Семейное положение", + "SOS Phone": "SOS номер", + "Sign Out": "Выйти", + "Delete My Account": "Удалить аккаунт", + "Update Gender": "Обновить пол", + "Update": "Обновить", + "Update Education": "Обновить образование", + "Are you sure? This action cannot be undone.": + "Вы уверены? Это действие необратимо.", + "Confirm your Email": "Подтвердите Email", + "Type your Email": "Введите Email", + "Delete Permanently": "Удалить навсегда", + "Male": "Мужской", + "Female": "Женский", + "High School Diploma": "Среднее образование", + "Associate Degree": "Среднее специальное", + "Bachelor's Degree": "Бакалавр", + "Master's Degree": "Магистр", + "Doctoral Degree": "Доктор наук", + "Select your preferred language for the app interface.": + "Выберите язык интерфейса.", + "Language Options": "Языки", + "You can claim your gift once they complete 2 trips.": + "Вы получите подарок, когда они совершат 2 поездки.", + "Closest & Cheapest": "Ближайший и Дешевый", + "Comfort choice": "Комфорт", + "Travel in a modern, silent electric car. A premium, eco-friendly choice for a smooth ride.": + "Современный, тихий электромобиль. Премиальный и экологичный выбор.", + "Spacious van service ideal for families and groups. Comfortable, safe, and cost-effective travel together.": + "Просторный минивэн для семей и групп. Комфортно, безопасно и выгодно.", + "Quiet & Eco-Friendly": "Тихий и Экологичный", + "Lady Captain for girls": "Женский тариф для девушек", + "Van for familly": "Минивэн для семьи", + "Are you sure to delete this location?": + "Удалить это местоположение?", + "Submit a Complaint": "Подать жалобу", + "Submit Complaint": "Отправить жалобу", + "No trip history found": "История пуста", + "Your past trips will appear here.": + "Здесь будут ваши прошлые поездки.", + "1. Describe Your Issue": "1. Опишите проблему", + "Enter your complaint here...": "Введите текст жалобы...", + "2. Attach Recorded Audio": "2. Прикрепить аудио", + "No audio files found.": "Аудиофайлы не найдены.", + "Confirm Attachment": "Подтвердить вложение", + "Attach this audio file?": "Прикрепить этот файл?", + "Uploaded": "Загружено", + "3. Review Details & Response": "3. Просмотр деталей", + "Date": "Дата", + "Today's Promos": "Промоакции сегодня", + "No promos available right now.": "Нет доступных акций.", + "Check back later for new offers!": "Заходите позже!", + "Valid Until:": "Действует до:", + "CODE": "КОД", + "I Agree": "Согласен", + "Continue": "Продолжить", + "Enable Location": "Включить геолокацию", + "To give you the best experience, we need to know where you are. Your location is used to find nearby captains and for pickups.": + "Нам нужно знать ваше местоположение, чтобы найти ближайших водителей.", + "Allow Location Access": "Разрешить доступ", + "Welcome to Intaleq!": "Добро пожаловать в Intaleq!", + "Before we start, please review our terms.": + "Пожалуйста, ознакомьтесь с условиями.", + "Your journey starts here": "Ваша поездка начинается здесь", + "Cancel Search": "Отменить поиск", + "Set pickup location": "Указать место посадки", + "Move the map to adjust the pin": + "Двигайте карту, чтобы установить метку", + "Searching for the nearest captain...": + "Поиск ближайшего водителя...", + "No one accepted? Try increasing the fare.": + "Никто не принял? Попробуйте повысить цену.", + "Increase Your Trip Fee (Optional)": + "Повысить стоимость (Опционально)", + "We haven't found any drivers yet. Consider increasing your trip fee to make your offer more attractive to drivers.": + "Водители не найдены. Попробуйте повысить цену, чтобы привлечь их.", + "No, thanks": "Нет, спасибо", + "Increase Fee": "Повысить цену", + "Copy": "Копировать", + "Promo Copied!": "Промокод скопирован!", + "Code": "Код", + "Send Intaleq app to him": "Отправить ему приложение Intaleq", + "No passenger found for the given phone number": "Пассажир не найден", + "No user found for the given phone number": "Пользователь не найден", + "This price is": "Цена:", + "Work": "Работа", + "Add Home": "Добавить Дом", + "Notifications": "Уведомления", + "💳 Pay with Credit Card": "💳 Оплата картой", + "⚠️ You need to choose an amount!": "⚠️ Выберите сумму!", + "💰 Pay with Wallet": "💰 Оплата кошельком", + "You must restart the app to change the language.": + "Перезапустите приложение для смены языка.", + "joined": "присоединился", + "Driver joined the channel": "Водитель в чате", + "Driver left the channel": "Водитель покинул чат", + "Call Page": "Звонок", + "Call Left": "Осталось звонков", + " Next as Cash !": " Далее наличными!", + "To use Wallet charge it": "Пополните кошелек", + "We are searching for the nearest driver to you": + "Ищем ближайшего водителя", + "Best choice for cities": "Лучший выбор для города", + "Rayeh Gai: Round trip service for convenient travel between cities, easy and reliable.": + "Туда-обратно: Удобные поездки между городами.", + "This trip is for women only": "Только для женщин", + "Total budgets on month": "Бюджет за месяц", + "You have call from driver": "Звонок от водителя", + "Intaleq": "Intaleq", + "passenger agreement": "соглашение пассажира", + "To become a passenger, you must review and agree to the ": + "Чтобы стать пассажиром, примите ", + "agreement subtitle": "Для продолжения примите Условия и Политику.", + "terms of use": "условия использования", + " and acknowledge our Privacy Policy.": + " и Политику конфиденциальности.", + "and acknowledge our": "и принять", + "privacy policy": "политику конфиденциальности.", + "i agree": "согласен", + "Driver already has 2 trips within the specified period.": + "У водителя уже 2 поездки в этот период.", + "The invitation was sent successfully": "Приглашение отправлено", + "You should select your country": "Выберите страну", + "Scooter": "Самокат", + "A trip with a prior reservation, allowing you to choose the best captains and cars.": + "Поездка по предзаказу, выбор лучших водителей и авто.", + "Mishwar Vip": "Mishwar VIP", + "The driver waiting you in picked location .": "Водитель ждет вас.", + "About Us": "О нас", + "You can change the vibration feedback for all buttons": + "Настройка вибрации кнопок", + "Most Secure Methods": "Безопасные методы", + "In-App VOIP Calls": "Звонки в приложении", + "Recorded Trips for Safety": "Запись поездок для безопасности", + "\nWe also prioritize affordability, offering competitive pricing to make your rides accessible.": + "\nМы предлагаем доступные цены.", + "Intaleq is a ride-sharing app designed with your safety and affordability in mind. We connect you with reliable drivers in your area, ensuring a convenient and stress-free travel experience.\n\nHere are some of the key features that set us apart:": + "Intaleq — безопасное и доступное такси.", + "Sign In by Apple": "Войти через Apple", + "Sign In by Google": "Войти через Google", + "How do I request a ride?": "Как заказать поездку?", + "Step-by-step instructions on how to request a ride through the Intaleq app.": + "Инструкция по заказу поездки.", + "What types of vehicles are available?": "Какие авто доступны?", + "Intaleq offers a variety of vehicle options to suit your needs, including economy, comfort, and luxury. Choose the option that best fits your budget and passenger count.": + "Эконом, Комфорт и Люкс.", + "How can I pay for my ride?": "Как платить?", + "Intaleq offers multiple payment methods for your convenience. Choose between cash payment or credit/debit card payment during ride confirmation.": + "Наличные или карта.", + "Can I cancel my ride?": "Могу я отменить?", + "Yes, you can cancel your ride under certain conditions (e.g., before driver is assigned). See the Intaleq cancellation policy for details.": + "Да, вы можете отменить поездку при определенных условиях (например, до назначения водителя). Подробности см. в правилах отмены Intaleq.", + "Driver Registration & Requirements": "Регистрация водителя", + "How can I register as a driver?": "Как стать водителем?", + "What are the requirements to become a driver?": + "Требования к водителю?", + "Visit our website or contact Intaleq support for information on driver registration and requirements.": + "Посетите сайт или напишите в поддержку.", + "Intaleq provides in-app chat functionality to allow you to communicate with your driver or passenger during your ride.": + "Чат в приложении.", + "Intaleq prioritizes your safety. We offer features like driver verification, in-app trip tracking, and emergency contact options.": + "Мы ценим безопасность: проверка водителей, трекинг.", + "Frequently Questions": "Частые вопросы", + "User does not exist.": "Пользователь не существует.", + "We need your phone number to contact you and to help you.": + "Нам нужен ваш номер для связи.", + "You will recieve code in sms message": "Вы получите код по СМС", + "Please enter": "Введите", + "We need your phone number to contact you and to help you receive orders.": + "Нам нужен номер для заказов.", + "The full name on your criminal record does not match the one on your driver's license. Please verify and provide the correct documents.": + "ФИО в справке не совпадает с правами.", + "The national number on your driver's license does not match the one on your ID document. Please verify and provide the correct documents.": + "Номер паспорта не совпадает.", + "Capture an Image of Your Criminal Record": + "Сфотографируйте справку о несудимости", + "IssueDate": "Дата выдачи", + "Capture an Image of Your car license front": + "Сфотографируйте СТС (лицевая)", + "Capture an Image of Your ID Document front": + "Сфотографируйте паспорт (лицевая)", + "NationalID": "Серия и номер паспорта", + "You can share the Intaleq App with your friends and earn rewards for rides they take using your code": + "Делись и зарабатывай.", + "FullName": "ФИО", + "No invitation found yet!": "Приглашения не найдены!", + "InspectionResult": "Результат осмотра", + "Criminal Record": "Справка о несудимости", + "The email or phone number is already registered.": + "Email или телефон уже зарегистрирован.", + "To become a ride-sharing driver on the Intaleq app, you need to upload your driver's license, ID document, and car registration document. Our AI system will instantly review and verify their authenticity in just 2-3 minutes. If your documents are approved, you can start working as a driver on the Intaleq app. Please note, submitting fraudulent documents is a serious offense and may result in immediate termination and legal consequences.": + "Загрузите права, паспорт и СТС. Проверка займет 2-3 минуты.", + "Documents check": "Проверка документов", + "Driver's License": "Водительское удостоверение", + "for your first registration!": "за первую регистрацию!", + "Get it Now!": "Получить!", + "before": "до", + "Code not approved": "Код не принят", + "3000 LE": "3000 ₽", + "Do you have an invitation code from another driver?": + "У вас есть код приглашения?", + "Paste the code here": "Вставьте код", + "No, I don't have a code": "Нет кода", + "Audio uploaded successfully.": "Аудио загружено.", + "Perfect for passengers seeking the latest car models with the freedom to choose any route they desire": + "Идеально для новых авто и свободы маршрута", + "Share this code with your friends and earn rewards when they use it!": + "Поделись кодом и заработай!", + "Enter phone": "Введите телефон", + "complete, you can claim your gift": "готово, заберите подарок", + "When": "Когда", + "Enter driver's phone": "Введите телефон водителя", + "Send Invite": "Отправить", + "Show Invitations": "Показать приглашения", + "License Type": "Тип прав", + "National Number": "Номер паспорта", + "Name (Arabic)": "Имя (Местное)", + "Name (English)": "Имя (Англ)", + "Address": "Адрес", + "Issue Date": "Дата выдачи", + "Expiry Date": "Действует до", + "License Categories": "Категории", + "driver_license": "права", + "Capture an Image of Your Driver License": "Сфотографируйте права", + "ID Documents Back": "Оборотная сторона паспорта", + "National ID": "Паспорт", + "Occupation": "Профессия", + "Religion": "Религия", + "Full Name (Marital)": "ФИО", + "Expiration Date": "Дата окончания", + "Capture an Image of Your ID Document Back": + "Сфотографируйте оборот паспорта", + "ID Documents Front": "Лицевая сторона паспорта", + "First Name": "Имя", + "CardID": "ID карты", + "Vehicle Details Front": "Авто спереди", + "Plate Number": "Госномер", + "Owner Name": "Владелец", + "Vehicle Details Back": "Авто сзади", + "Make": "Марка", + "Model": "Модель", + "Year": "Год", + "Chassis": "VIN/Шасси", + "Color": "Цвет", + "Displacement": "Объем", + "Fuel": "Топливо", + "Tax Expiry Date": "Окончание налога", + "Inspection Date": "Техосмотр", + "Capture an Image of Your car license back": + "Сфотографируйте СТС (оборот)", + "Capture an Image of Your Driver's License": "Сфотографируйте права", + "Sign in with Google for easier email and name entry": + "Вход через Google", + "You will choose allow all the time to be ready receive orders": + "Выберите 'Всегда разрешать' для приема заказов", + "Get to your destination quickly and easily.": + "Доберитесь быстро и легко.", + "Enjoy a safe and comfortable ride.": "Наслаждайтесь безопасностью.", + "Choose Language": "Язык", + "Pay with Wallet": "Кошельком", + "Invalid MPIN": "Неверный MPIN", + "Invalid OTP": "Неверный код", + "Enter your email address": "Введите email", + "Please enter Your Email.": "Пожалуйста, введите email.", + "Enter your phone number": "Введите номер", + "Please enter your phone number.": "Пожалуйста, введите номер.", + "Please enter Your Password.": "Введите пароль.", + "if you dont have account": "нет аккаунта?", + "Register": "Регистрация", + "Accept Ride's Terms & Review Privacy Notice": "Принять условия", + "By selecting 'I Agree' below, I have reviewed and agree to the Terms of Use and acknowledge the Privacy Notice. I am at least 18 years of age.": + "Нажимая 'Согласен', я принимаю условия. Мне 18+.", + "First name": "Имя", + "Enter your first name": "Введите имя", + "Please enter your first name.": "Введите имя.", + "Last name": "Фамилия", + "Enter your last name": "Введите фамилию", + "Please enter your last name.": "Введите фамилию.", + "City": "Город", + "Please enter your City.": "Введите город.", + "Verify Email": "Подтвердить Email", + "We sent 5 digit to your Email provided": "Отправили 5 цифр на email", + "5 digit": "5 цифр", + "Send Verification Code": "Отправить код", + "Your Ride Duration is ": "Длительность: ", + "You will be thier in": "Прибытие через", + "You trip distance is": "Дистанция:", + "Fee is": "Сбор:", + "From : ": "От: ", + "To : ": "Куда: ", + "Add Promo": "Добавить промо", + "Confirm Selection": "Подтвердить", + "distance is": "дистанция", + "Privacy Policy": "Политика конфиденциальности", + "Intaleq LLC": "Intaleq LLC", + "Syria's pioneering ride-sharing service, proudly developed by Arabian and local owners. We prioritize being near you – both our valued passengers and our dedicated captains.": + "Сервис такси в России.", + "Intaleq is the first ride-sharing app in Syria, designed to connect you with the nearest drivers for a quick and convenient travel experience.": + "Intaleq соединяет вас с ближайшими водителями.", + "Why Choose Intaleq?": "Почему Intaleq?", + "Closest to You": "Ближе всего", + "We connect you with the nearest drivers for faster pickups and quicker journeys.": + "Быстрая подача.", + "Uncompromising Security": "Безопасность", + "Lady Captains Available": "Женщины-водители", + "Recorded Trips (Voice & AI Analysis)": "Запись поездок", + "Fastest Complaint Response": "Быстрая поддержка", + "Our dedicated customer service team ensures swift resolution of any issues.": + "Быстрое решение проблем.", + "Affordable for Everyone": "Доступно всем", + "Frequently Asked Questions": "Частые вопросы", + "Getting Started": "Начало", + "Simply open the Intaleq app, enter your destination, and tap \"Request Ride\". The app will connect you with a nearby driver.": + "Откройте приложение, введите адрес и закажите.", + "Vehicle Options": "Автомобили", + "Intaleq offers a variety of options including Economy, Comfort, and Luxury to suit your needs and budget.": + "Эконом, Комфорт, Люкс.", + "Payments": "Оплата", + "You can pay for your ride using cash or credit/debit card. You can select your preferred payment method before confirming your ride.": + "Наличные или карта.", + "Ride Management": "Управление", + "Yes, you can cancel your ride, but please note that cancellation fees may apply depending on how far in advance you cancel.": + "Да, возможна комиссия за отмену.", + "For Drivers": "Водителям", + "Driver Registration": "Регистрация", + "To register as a driver or learn about the requirements, please visit our website or contact Intaleq support directly.": + "Посетите сайт.", + "Visit Website/Contact Support": "Сайт/Поддержка", + "Close": "Закрыть", + "We are searching for the nearest driver": "Поиск водителя", + "Communication": "Связь", + "How do I communicate with the other party (passenger/driver)?": + "Как связаться?", + "You can communicate with your driver or passenger through the in-app chat feature once a ride is confirmed.": + "Через чат.", + "Safety & Security": "Безопасность", + "What safety measures does Intaleq offer?": + "Какие меры безопасности?", + "Intaleq offers various safety features including driver verification, in-app trip tracking, emergency contact options, and the ability to share your trip status with trusted contacts.": + "Проверка водителей, трекинг.", + "Enjoy competitive prices across all trip options, making travel accessible.": + "Выгодные цены.", + "Variety of Trip Choices": "Выбор поездок", + "Choose the trip option that perfectly suits your needs and preferences.": + "Выберите подходящий вариант.", + "Your Choice, Our Priority": "Ваш выбор - приоритет", + "Because we are near, you have the flexibility to choose the ride that works best for you.": + "Гибкий выбор.", + "duration is": "длительность", + "Setting": "Настройка", + "Find answers to common questions": "Ответы на вопросы", + "I don't need a ride anymore": "Больше не нужно", + "I was just trying the application": "Я просто пробовал", + "No driver accepted my request": "Никто не принял заказ", + "I added the wrong pick-up/drop-off location": "Неверный адрес", + "I don't have a reason": "Нет причины", + "Can we know why you want to cancel Ride ?": "Почему отменяете?", + "Add Payment Method": "Добавить метод оплаты", + "Ride Wallet": "Кошелек", + "Payment Method": "Метод оплаты", + "Type here Place": "Введите место", + "Are You sure to ride to": "Едем сюда?", + "Confirm": "Подтвердить", + "You are Delete": "Удаление", + "Deleted": "Удалено", + "You Dont Have Any places yet !": "Нет сохраненных мест!", + "From : Current Location": "От: Текущее место", + "My Cared": "Мои карты", + "Add Card": "Добавить карту", + "Add Credit Card": "Добавить кредитку", + "Please enter the cardholder name": "Имя владельца", + "Please enter the expiry date": "Срок действия", + "Please enter the CVV code": "CVV код", + "Go To Favorite Places": "В избранное", + "Go to this Target": "К этой цели", + "My Profile": "Профиль", + "Are you want to go to this site": "Хотите поехать сюда?", + "MyLocation": "Моя локация", + "my location": "моя локация", + "Target": "Цель", + "You Should choose rate figure": "Поставьте оценку", + "Login Captin": "Вход для водителя", + "Register Captin": "Регистрация водителя", + "Send Verfication Code": "Отправить код", + "KM": "КМ", + "End Ride": "Завершить", + "Minute": "Мин", + "Go to passenger Location now": "К пассажиру", + "Duration of the Ride is ": "Длительность: ", + "Distance of the Ride is ": "Дистанция: ", + "Name of the Passenger is ": "Имя пассажира: ", + "Hello this is Captain": "Привет, это водитель", + "Start the Ride": "Начать", + "Please Wait If passenger want To Cancel!": "Ждите, вдруг отмена!", + "Total Duration:": "Всего времени:", + "Active Duration:": "Активное время:", + "Waiting for Captin ...": "Ждем водителя...", + "Age is ": "Возраст: ", + "Rating is ": "Рейтинг: ", + " to arrive you.": " чтобы прибыть.", + "Tariff": "Тариф", + "Settings": "Настройки", + "Feed Back": "Отзыв", + "Please enter a valid 16-digit card number": "Введите 16 цифр карты", + "Add Phone": "Добавить телефон", + "Please enter a phone number": "Введите номер", + "You dont Add Emergency Phone Yet!": "Нет экстренного номера!", + "You will arrive to your destination after ": "Прибытие через ", + "You can cancel Ride now": "Можно отменить", + "You Can cancel Ride After Captain did not come in the time": + "Можно отменить при опоздании водителя", + "If you in Car Now. Press Start The Ride": + "Если вы в машине, нажмите Начать", + "You Dont Have Any amount in": "Нет средств в", + "Wallet!": "Кошелек!", + "You Have": "У вас есть", + "Save Credit Card": "Сохранить карту", + "Show Promos": "Показать промо", + "10 and get 4% discount": "10 и скидка 4%", + "20 and get 6% discount": "20 и скидка 6%", + "40 and get 8% discount": "40 и скидка 8%", + "100 and get 11% discount": "100 и скидка 11%", + "Pay with Your PayPal": "Оплата PayPal", + "You will choose one of above !": "Выберите вариант!", + "Edit Profile": "Редактировать", + "Copy this Promo to use it in your Ride!": "Скопируйте промокод!", + "To change some Settings": "Изменить настройки", + "Order Request Page": "Страница заказа", + "Rouats of Trip": "Маршруты", + "Passenger Name is ": "Пассажир: ", + "Total From Passenger is ": "Сумма от пассажира: ", + "Duration To Passenger is ": "Время до пассажира: ", + "Distance To Passenger is ": "Расстояние до пассажира: ", + "Total For You is ": "Всего вам: ", + "Distance is ": "Дистанция: ", + " KM": " КМ", + "Duration of Trip is ": "Длительность: ", + " Minutes": " Мин", + "Apply Order": "Принять", + "Refuse Order": "Отклонить", + "Rate Captain": "Оценить водителя", + "Enter your Note": "Заметка", + "Type something...": "Напишите...", + "Submit rating": "Отправить", + "Rate Passenger": "Оценить пассажира", + "Ride Summary": "Итог", + "welcome_message": "Добро пожаловать в Intaleq!", + "app_description": "Безопасное такси.", + "get_to_destination": "Быстро добраться.", + "get_a_ride": "Машина за минуты.", + "safe_and_comfortable": "Безопасно и комфортно.", + "committed_to_safety": "Мы за безопасность.", + "your ride is Accepted": "Заказ принят", + "Driver is waiting at pickup.": "Водитель ждет.", + "Driver is on the way": "Водитель в пути", + "Contact Options": "Контакты", + "Send a custom message": "Свое сообщение", + "Type your message": "Введите сообщение", + "I will go now": "Выезжаю", + "You Have Tips": "Есть чаевые", + " tips\nTotal is": " чаевые\nВсего", + "Your fee is ": "Сбор: ", + "Do you want to pay Tips for this Driver": "Оставить чаевые?", + "Tip is ": "Чаевые: ", + "Are you want to wait drivers to accept your order": + "Ждать принятия заказа?", + "This price is fixed even if the route changes for the driver.": + "Фиксированная цена.", + "The price may increase if the route changes.": + "Цена может измениться.", + "The captain is responsible for the route.": + "Водитель отвечает за маршрут.", + "We are search for nearst driver": "Ищем водителя", + "Your order is being prepared": "Подготовка заказа", + "The drivers are reviewing your request": "Водители смотрят заказ", + "Your order sent to drivers": "Отправлено водителям", + "You can call or record audio of this trip": "Звонок или запись", + "The trip has started! Feel free to contact emergency numbers, share your trip, or activate voice recording for the journey": + "Поездка началась! Делитесь маршрутом, пишите аудио.", + "Camera Access Denied.": "Нет доступа к камере.", + "Open Settings": "Настройки", + "GPS Required Allow !.": "Включите GPS!", + "Your Account is Deleted": "Аккаунт удален", + "Are you sure to delete your account?": "Удалить аккаунт?", + "Your data will be erased after 2 weeks\nAnd you will can't return to use app after 1 month ": + "Данные удалятся через 2 недели.", + "Enter Your First Name": "Введите имя", + "Are you Sure to LogOut?": "Выйти?", + "Email Wrong": "Неверный Email", + "Email you inserted is Wrong.": "Email введен неверно.", + "You have finished all times ": "Попытки исчерпаны", + "if you want help you can email us here": "Напишите нам для помощи", + "Thanks": "Спасибо", + "Email Us": "Написать нам", + "I cant register in your app in face detection ": + "Не могу пройти проверку лица", + "Hi": "Привет", + "No face detected": "Лицо не найдено", + "Image detecting result is ": "Результат: ", + "from 3 times Take Attention": "из 3 раз, Внимание", + "Be sure for take accurate images please\nYou have": + "Делайте четкие фото\nУ вас есть", + "image verified": "подтверждено", + "Next": "Далее", + "There is no help Question here": "Нет вопроса", + "You dont have Points": "Нет баллов", + "You Are Stopped For this Day !": "Блокировка на сегодня!", + "You must be charge your Account": "Пополните счет", + "You Refused 3 Rides this Day that is the reason \nSee you Tomorrow!": + "Вы отказались от 3 поездок.\nДо завтра!", + "Recharge my Account": "Пополнить", + "Ok , See you Tomorrow": "Ок, до завтра", + "You are Stopped": "Вы заблокированы", + "Connected": "Подключено", + "Not Connected": "Не подключено", + "Your are far from passenger location": "Вы далеко от пассажира", + "go to your passenger location before\nPassenger cancel trip": + "Едьте к пассажиру, пока не отменил", + "You will get cost of your work for this trip": "Вы получите оплату", + " in your wallet": " в кошелек", + "you gain": "вы получили", + "Order Cancelled by Passenger": "Отмена пассажиром", + "Feedback data saved successfully": "Сохранено", + "No Promo for today .": "Нет промокодов.", + "Select your destination": "Выберите назначение", + "Search for your Start point": "Точка старта", + "Search for waypoint": "Точка маршрута", + "Current Location": "Текущее место", + "Add Location 1": "Добавить место 1", + "You must Verify email !.": "Подтвердите email!", + "Cropper": "Обрезка", + "Saved Sucssefully": "Успешно сохранено", + "Select Date": "Выбрать дату", + "Birth Date": "Дата рождения", + "Ok": "Ок", + "the 500 points equal 30 JOD": "500 баллов = 30 ₽", + "the 500 points equal 30 JOD for you \nSo go and gain your money": + "500 баллов = 30 ₽ для вас\nЗарабатывайте", + "token updated": "токен обновлен", + "Add Location 2": "Добавить место 2", + "Add Location 3": "Добавить место 3", + "Add Location 4": "Добавить место 4", + "Waiting for your location": "Ожидание локации", + "Search for your destination": "Поиск назначения", + "Hi! This is": "Привет! Это", + " I am using": " Я использую", + " to ride with": " чтобы ехать с", + " as the driver.": " как водитель.", + "is driving a ": "ведет ", + " with license plate ": " госномер ", + " I am currently located at ": " Я нахожусь в ", + "Please go to Car now ": "Идите к машине ", + "You will receive a code in WhatsApp Messenger": + "Код придет в WhatsApp", + "If you need assistance, contact us": "Свяжитесь для помощи", + "Promo Ended": "Промо завершено", + "Enter the promo code and get": "Введи промокод и получи", + "DISCOUNT": "СКИДКА", + "No wallet record found": "Кошелек не найден", + "for": "для", + "Intaleq is the safest ride-sharing app that introduces many features for both captains and passengers. We offer the lowest commission rate of just 8%, ensuring you get the best value for your rides. Our app includes insurance for the best captains, regular maintenance of cars with top engineers, and on-road services to ensure a respectful and high-quality experience for all users.": + "Intaleq - безопасное такси. Комиссия 8%. Страховка и сервис.", + "You can contact us during working hours from 12:00 - 19:00.": + "Связь с 12:00 до 19:00.", + "Choose a contact option": "Выберите способ связи", + "Work time is from 12:00 - 19:00.\nYou can send a WhatsApp message or email.": + "Время 12:00 - 19:00.\nWhatsApp или email.", + "Promo code copied to clipboard!": "Скопировано!", + "Copy Code": "Копировать код", + "Your invite code was successfully applied!": "Код применен!", + "Payment Options": "Оплата", + "wait 1 minute to receive message": "подождите 1 минуту", + "You have copied the promo code.": "Код скопирован.", + "Select Payment Amount": "Сумма оплаты", + "The promotion period has ended.": "Акция закончилась.", + "Promo Code Accepted": "Код принят", + "Tap on the promo code to copy it!": "Нажми для копирования!", + "Lowest Price Achieved": "Минимальная цена", + "Cannot apply further discounts.": "Скидок больше нет.", + "Promo Already Used": "Уже использован", + "Invitation Used": "Приглашение использовано", + "You have already used this promo code.": + "Вы уже использовали этот код.", + "Insert Your Promo Code": "Вставьте промокод", + "Enter promo code here": "Введите код здесь", + "Please enter a valid promo code": "Введите верный код", + "Awfar Car": "Эконом", + "Old and affordable, perfect for budget rides.": + "Недорогой и доступный.", + " If you need to reach me, please contact the driver directly at": + " Свяжитесь с водителем по номеру", + "No Car or Driver Found in your area.": "Нет машин в вашем районе.", + "Please Try anther time ": "Попробуйте позже ", + "There no Driver Aplly your order sorry for that ": + "Никто не взял заказ, извините ", + "Trip Cancelled": "Поездка отменена", + "The Driver Will be in your location soon .": "Водитель скоро будет.", + "The distance less than 500 meter.": "Дистанция < 500 м.", + "Promo End !": "Промо всё!", + "There is no notification yet": "Нет уведомлений", + "Use Touch ID or Face ID to confirm payment": + "Используйте Touch ID или Face ID", + "Contact us for any questions on your order.": + "Свяжитесь с нами по вопросам заказа.", + "Pyament Cancelled .": "Оплата отменена.", + "type here": "введите здесь", + "Scan Driver License": "Скан прав", + "Please put your licence in these border": "Поместите права в рамку", + "Camera not initialized yet": "Камера не готова", + "Take Image": "Сделать фото", + "AI Page": "AI Страница", + "Take Picture Of ID Card": "Фото паспорта", + "Take Picture Of Driver License Card": "Фото прав", + "We are process picture please wait ": "Обработка фото... ", + "There is no data yet.": "Нет данных.", + "Name :": "Имя:", + "Drivers License Class: ": "Категория: ", + "Document Number: ": "Номер документа: ", + "Address: ": "Адрес: ", + "Height: ": "Рост: ", + "Expiry Date: ": "Истекает: ", + "Date of Birth: ": "Дата рождения: ", + "You can't continue with us .\nYou should renew Driver license": + "Нужно обновить права", + "Detect Your Face ": "Проверка лица ", + "Go to next step\nscan Car License.": "Далее\nскан СТС.", + "Name in arabic": "Имя (местное)", + "Drivers License Class": "Категория", + "Selected Date": "Выбрана дата", + "Select Time": "Выбрать время", + "Selected Time": "Выбрано время", + "Selected Date and Time": "Дата и Время", + "Lets check Car license ": "Проверим СТС ", + "Car": "Авто", + "Plate": "Номер", + "Rides": "Поездки", + "Selected driver": "Выбранный водитель", + "Lets check License Back Face": "Проверим оборот", + "Car License Card": "СТС", + "No image selected yet": "Нет изображения", + "Made :": "Марка :", + "model :": "Модель :", + "VIN :": "VIN :", + "year :": "Год :", + "ُExpire Date": "Дата окончания", + "Login Driver": "Вход водителя", + "Password must br at least 6 character.": "Пароль мин. 6 символов.", + "if you don't have account": "нет аккаунта", + "Here recorded trips audio": "Аудио поездок", + "Register as Driver": "Стать водителем", + "By selecting \"I Agree\" below, I have reviewed and agree to the Terms of Use and acknowledge the ": + "Выбирая \"Согласен\", я принимаю Условия и ", + "Log Out Page": "Страница выхода", + "Log Off": "Выйти", + "Register Driver": "Регистрация водителя", + "Verify Email For Driver": "Email водителя", + "Admin DashBoard": "Панель админа", + "Your name": "Ваше имя", + "your ride is applied": "поездка оформлена", + "H and": "Ч и", + "JOD": "₽", + "m": "м", + "We search nearst Driver to you": "Ищем водителя", + "please wait till driver accept your order": "ждите принятия заказа", + "No accepted orders? Try raising your trip fee to attract riders.": + "Поднимите цену для привлечения.", + "You should select one": "Выберите одно", + "The driver accept your order for": "Водитель принял заказ за", + "The driver on your way": "Водитель едет", + "Total price from ": "Всего от ", + "Order Details Intaleq": "Детали заказа", + "Selected file:": "Файл:", + "Your trip cost is": "Стоимость:", + "this will delete all files from your device": "удалит все файлы", + "Exclusive offers and discounts always with the Intaleq app": + "Эксклюзивные предложения", + "Submit Question": "Задать вопрос", + "Please enter your Question.": "Введите вопрос.", + "Help Details": "Помощь", + "No trip yet found": "Нет поездок", + "No Response yet.": "Нет ответа.", + " You Earn today is ": " Заработано сегодня: ", + " You Have in": " У вас есть в", + "Total points is ": "Всего баллов: ", + "Total Connection Duration:": "Время соединения:", + "Passenger name : ": "Пассажир: ", + "Cost Of Trip IS ": "Стоимость: ", + "Arrival time": "Время прибытия", + "arrival time to reach your point": "время прибытия в точку", + "For Intaleq and scooter trips, the price is calculated dynamically. For Comfort trips, the price is based on time and distance": + "Цена динамическая или по времени/расстоянию.", + "Hello this is Driver": "Привет, я водитель", + "Is the Passenger in your Car ?": "Пассажир в машине?", + "Please wait for the passenger to enter the car before starting the trip.": + "Ждите пассажира.", + "No ,still Waiting.": "Нет, жду.", + "I arrive you": "Я на месте", + "I Arrive your site": "Я на месте", + "You are not in near to passenger location": "Вы далеко", + "please go to picker location exactly": "езжайте точно к точке", + "You Can Cancel Trip And get Cost of Trip From": + "Можно отменить и получить стоимость с", + "Are you sure to cancel?": "Отменить?", + "Insert Emergincy Number": "Ввести SOS номер", + "Best choice for comfort car and flexible route and stops point": + "Комфорт и гибкий маршрут", + "Insert": "Вставить", + "This is for scooter or a motorcycle.": "Для скутера или мотоцикла.", + "This trip goes directly from your starting point to your destination for a fixed price. The driver must follow the planned route": + "Прямая поездка, фикс. цена.", + "You can decline a request without any cost": "Отказ бесплатный", + "Perfect for adventure seekers who want to experience something new and exciting": + "Для искателей приключений", + "My current location is:": "Я здесь:", + "and I have a trip on": "и у меня поездка на", + "App with Passenger": "Приложение с Пассажиром", + "You will be pay the cost to driver or we will get it from you on next trip": + "Оплата водителю или в след. раз", + "Trip has Steps": "Поездка с этапами", + "Distance from Passenger to destination is ": "Дистанция до цели: ", + "price is": "цена", + "This ride type does not allow changes to the destination or additional stops": + "Без изменений маршрута", + "This price may be changed": "Цена может измениться", + "No SIM card, no problem! Call your driver directly through our app. We use advanced technology to ensure your privacy.": + "Звоните через приложение без SIM.", + "This ride type allows changes, but the price may increase": + "Изменения возможны, цена может вырасти", + "Select one message": "Выберите сообщение", + "I'm waiting for you": "Я вас жду", + "We noticed the Intaleq is exceeding 100 km/h. Please slow down for your safety. If you feel unsafe, you can share your trip details with a contact or call the police using the red SOS button.": + "Скорость > 100 км/ч. Притормозите.", + "Warning: Intaleqing detected!": "Внимание: Скорость!", + "Please help! Contact me as soon as possible.": + "Помогите! Свяжитесь со мной.", + "Share Trip Details": "Поделиться деталями", + "Car Plate is ": "Номер: ", + "the 300 points equal 300 L.E for you \nSo go and gain your money": + "300 баллов = 300 ₽\nЗарабатывайте", + "the 300 points equal 300 L.E": "300 баллов = 300 ₽", + "The payment was not approved. Please try again.": + "Оплата не прошла.", + "Payment Failed": "Ошибка оплаты", + "This is a scheduled notification.": "Запланированное уведомление.", + "An error occurred during the payment process.": "Ошибка оплаты.", + "The payment was approved.": "Оплата одобрена.", + "Payment Successful": "Успешно", + "No ride found yet": "Поездка не найдена", + "Accept Order": "Принять заказ", + "Bottom Bar Example": "Пример", + "Driver phone": "Телефон водителя", + "Statistics": "Статистика", + "Origin": "Старт", + "Destination": "Финиш", + "Driver Name": "Имя водителя", + "Driver Car Plate": "Номер авто", + "Available for rides": "Доступен", + "Scan Id": "Скан паспорта", + "Camera not initilaized yet": "Камера не готова", + "Scan ID MklGoogle": "Скан ID", + "Language": "Язык", + "Jordan": "Иордания", + "USA": "США", + "Egypt": "Египет", + "Turkey": "Турция", + "Saudi Arabia": "Саудовская Аравия", + "Qatar": "Катар", + "Bahrain": "Бахрейн", + "Kuwait": "Кувейт", + "But you have a negative salary of": "Отрицательный баланс:", + "Promo Code": "Промокод", + "Your trip distance is": "Дистанция:", + "Enter promo code": "Введите промокод", + "You have promo!": "У вас есть промо!", + "Cost Duration": "Стоимость времени", + "Duration is": "Длительность:", + "Leave": "Выйти", + "Join": "Войти", + "Heading your way now. Please be ready.": "Еду к вам. Будьте готовы.", + "Approaching your area. Should be there in 3 minutes.": + "Подъезжаю. Буду через 3 мин.", + "There's heavy traffic here. Can you suggest an alternate pickup point?": + "Пробки. Может, другое место?", + "This ride is already taken by another driver.": "Заказ уже занят.", + "You Should be select reason.": "Выберите причину.", + "Waiting for Driver ...": "Ждем водителя...", + "Latest Recent Trip": "Последняя поездка", + "from your list": "из списка", + "Do you want to change Work location": "Изменить Работу", + "Do you want to change Home location": "Изменить Дом", + "We Are Sorry That we dont have cars in your Location!": + "Нет машин в вашем районе!", + "Choose from Map": "Выбрать на карте", + "Pick your ride location on the map - Tap to confirm": + "Укажите место на карте", + "Intaleq is the ride-hailing app that is safe, reliable, and accessible.": + "Intaleq - надежное такси.", + "With Intaleq, you can get a ride to your destination in minutes.": + "Машина за минуты.", + "Intaleq is committed to safety, and all of our captains are carefully screened and background checked.": + "Мы проверяем всех водителей.", + "Pick from map": "Указать на карте", + "No Car in your site. Sorry!": "Нет машин. Извините!", + "Nearest Car for you about ": "Ближайшая машина через ", + "From :": "От:", + "Get Details of Trip": "Детали поездки", + "If you want add stop click here": "Добавить остановку", + "Where you want go ": "Куда едем ", + "My Card": "Моя карта", + "Start Record": "Начать запись", + "History of Trip": "История", + "Helping Center": "Помощь", + "Record saved": "Запись сохранена", + "Trips recorded": "Записанные поездки", + "Select Your Country": "Выберите страну", + "To ensure you receive the most accurate information for your location, please select your country below. This will help tailor the app experience and content to your country.": + "Выберите страну для корректной работы.", + "Are you sure to delete recorded files": "Удалить записи?", + "Select recorded trip": "Выбрать запись", + "Card Number": "Номер карты", + "Hi, Where to ": "Куда едем ", + "Pick your destination from Map": "Указать назначение", + "Add Stops": "Остановки", + "Get Direction": "Маршрут", + "Add Location": "Добавить место", + "Switch Rider": "Сменить пассажира", + "You will arrive to your destination after timer end.": + "Прибытие по таймеру.", + "You can cancel trip": "Можно отменить", + "The driver waitting you in picked location .": "Водитель ждет.", + "Pay with Your": "Оплата", + "Pay with Credit Card": "Кредитная карта", + "Show Promos to Charge": "Промо для пополнения", + "Point": "Балл", + "How many hours would you like to wait?": "Сколько часов ждать?", + "Driver Wallet": "Кошелек водителя", + "Choose between those Type Cars": "Выберите тип авто", + "hour": "час", + "Select Waiting Hours": "Часы ожидания", + "Total Points is": "Всего баллов", + "You will receive a code in SMS message": "Код придет в СМС", + "Done": "Готово", + "Total Budget from trips is ": "Бюджет поездок: ", + "Total Amount:": "Всего:", + "Total Budget from trips by\nCredit card is ": "Бюджет по карте: ", + "This amount for all trip I get from Passengers": + "Сумма от пассажиров", + "Pay from my budget": "Оплата с баланса", + "This amount for all trip I get from Passengers and Collected For me in": + "Собранная сумма", + "You can buy points from your budget": "Купить баллы", + "insert amount": "сумма", + "You can buy Points to let you online\nby this list below": + "Купите баллы для работы", + "Create Wallet to receive your money": "Создать кошелек", + "Enter your feedback here": "Ваш отзыв", + "Please enter your feedback.": "Введите отзыв.", + "Feedback": "Отзыв", + "Submit ": "Отправить ", + "Click here to Show it in Map": "Показать на карте", + "Canceled": "Отменено", + "No I want": "Нет, хочу", + "Email is": "Email:", + "Phone Number is": "Телефон:", + "Date of Birth is": "Дата рождения:", + "Sex is ": "Пол: ", + "Car Details": "Детали авто", + "VIN is": "VIN:", + "Color is ": "Цвет: ", + "Make is ": "Марка: ", + "Model is": "Модель:", + "Year is": "Год:", + "Expiration Date ": "Истекает: ", + "Edit Your data": "Редактировать", + "write vin for your car": "введите VIN", + "VIN": "VIN", + "Please verify your identity": "Подтвердите личность", + "write Color for your car": "введите цвет", + "write Make for your car": "введите марку", + "write Model for your car": "введите модель", + "write Year for your car": "введите год", + "write Expiration Date for your car": "введите дату окончания", + "Tariffs": "Тарифы", + "Minimum fare": "Мин. стоимость", + "Maximum fare": "Макс. стоимость", + "Flag-down fee": "Посадка", + "Including Tax": "Вкл. налог", + "BookingFee": "Сбор", + "Morning": "Утро", + "from 07:30 till 10:30 (Thursday, Friday, Saturday, Monday)": + "07:30 - 10:30", + "Evening": "Вечер", + "from 12:00 till 15:00 (Thursday, Friday, Saturday, Monday)": + "12:00 - 15:00", + "Night": "Ночь", + "You have in account": "На счету", + "Select Country": "Страна", + "Ride Today : ": "Поездка сегодня: ", + "After this period\nYou can't cancel!": "Позже отменить нельзя!", + "from 23:59 till 05:30": "23:59 - 05:30", + "Rate Driver": "Оценка водителя", + "Total Cost is ": "Стоимость: ", + "Write note": "Заметка", + "Time to arrive": "Время прибытия", + "Ride Summaries": "Сводка", + "Total Cost": "Всего", + "Average of Hours of": "Среднее часов", + " is ON for this month": " онлайн в этом месяце", + "Days": "Дни", + "Total Hours on month": "Часов в месяц", + "Counts of Hours on days": "Часов по дням", + "OrderId": "ID заказа", + "created time": "создано", + "Intaleq Over": "Конец", + "I will slow down": "Снижаю скорость", + "Map Passenger": "Карта", + "Be Slowly": "Помедленнее", + "If you want to make Google Map App run directly when you apply order": + "Открыть Google Карты", + "You can change the language of the app": "Сменить язык", + "Your Budget less than needed": "Мало средств", + "You can change the Country to get all features": + "Смените страну для всех функций", + "There is no Car or Driver in your area.": + "В вашем районе нет машин или водителей.", + "Change Country": "Сменить страну", + }, + "it": { + "About Intaleq": "Informazioni su Intaleq", + "Chat with us anytime": "Chatta con noi in qualsiasi momento", + "Direct talk with our team": "Parla direttamente con il nostro team", + "Email Support": "Supporto via email", + "For official inquiries": "Per richieste ufficiali", + "Intaleq Support": "Supporto Intaleq", + "Reach out to us via": "Contattaci tramite", + "Support is Away": "Il supporto è attualmente assente", + "Support is currently Online": "Il supporto è attualmente online", + "Voice Call": "Chiamata vocale", + "We're here to help you 24/7": "Siamo qui per aiutarti 24/7", + "Working Hours:": "Orario di lavoro:", + "1 Passenger": "1 Passenger", + "2 Passengers": "2 Passengers", + "3 Passengers": "3 Passengers", + "4 Passengers": "4 Passengers", + "2. Attach Recorded Audio (Optional)": + "2. Attach Recorded Audio (Optional)", + "Account": "Account", + "Actions": "Actions", + "Active Users": "Active Users", + "Add a Stop": "Add a Stop", + "Add a new waypoint stop": "Add a new waypoint stop", + "After this period\nYou can\'t cancel!": + "After this period\nYou can\'t cancel!", + "Age is": "Age is", + "Alert": "Alert", + "An OTP has been sent to your number.": + "An OTP has been sent to your number.", + "An error occurred": "An error occurred", + "Appearance": "Appearance", + "Are you sure you want to delete this file?": + "Are you sure you want to delete this file?", + "Are you sure you want to logout?": + "Are you sure you want to logout?", + "Arrived": "Arrived", + "Audio Recording": "Audio Recording", + "Call": "Call", + "Call Support": "Call Support", + "Call left": "Call left", + "Change Photo": "Change Photo", + "Choose from Gallery": "Choose from Gallery", + "Choose from contact": "Choose from contact", + "Click to track the trip": "Click to track the trip", + "Close panel": "Close panel", + "Coming": "Coming", + "Complete Payment": "Complete Payment", + "Confirm Cancellation": "Confirm Cancellation", + "Confirm Pickup Location": "Confirm Pickup Location", + "Connection failed. Please try again.": + "Connection failed. Please try again.", + "Could not create ride. Please try again.": + "Could not create ride. Please try again.", + "Crop Photo": "Crop Photo", + "Dark Mode": "Dark Mode", + "Delete": "Delete", + "Delete Account": "Delete Account", + "Delete All": "Delete All", + "Delete All Recordings?": "Delete All Recordings?", + "Delete Recording?": "Delete Recording?", + "Destination Set": "Destination Set", + "Distance": "Distance", + "Double tap to open search or enter destination": + "Double tap to open search or enter destination", + "Double tap to set or change this waypoint on the map": + "Double tap to set or change this waypoint on the map", + "Drawing route on map...": "Drawing route on map...", + "Driver Phone": "Driver Phone", + "Driver is Going To You": "Driver is Going To You", + "Emergency Mode Triggered": "Emergency Mode Triggered", + "Emergency SOS": "Emergency SOS", + "Enter the 5-digit code": "Enter the 5-digit code", + "Enter your City": "Enter your City", + "Enter your Password": "Enter your Password", + "Failed to book trip: \$e": "Failed to book trip: \$e", + "Failed to get location": "Failed to get location", + "Failed to initiate payment. Please try again.": + "Failed to initiate payment. Please try again.", + "Failed to send OTP": "Failed to send OTP", + "Failed to upload photo": "Failed to upload photo", + "Finished": "Finished", + "Fixed Price": "Fixed Price", + "General": "General", + "Grant": "Grant", + "Have a Promo Code?": "Have a Promo Code?", + "Hello! I\'m inviting you to try Intaleq.": + "Hello! I\'m inviting you to try Intaleq.", + "Hi ,I Arrive your site": "Hi ,I Arrive your site", + "Hi, Where to": "Hi, Where to", + "Home": "Home", + "I am currently located at": "I am currently located at", + "I'm Safe": "I'm Safe", + "If you need to reach me, please contact the driver directly at": + "If you need to reach me, please contact the driver directly at", + "Image Upload Failed": "Image Upload Failed", + "Intaleq Passenger": "Intaleq Passenger", + "Invite": "Invite", + "Join a channel": "Join a channel", + "Last Name": "Last Name", + "Leave a detailed comment (Optional)": + "Leave a detailed comment (Optional)", + "Light Mode": "Light Mode", + "Listen": "Listen", + "Location": "Location", + "Location Received": "Location Received", + "Logout": "Logout", + "Map Error": "Map Error", + "Message": "Message", + "Move map to select destination": "Move map to select destination", + "Move map to set start location": "Move map to set start location", + "Move map to set stop": "Move map to set stop", + "Move map to your home location": "Move map to your home location", + "Move map to your pickup point": "Move map to your pickup point", + "Move map to your work location": "Move map to your work location", + "N/A": "N/A", + "No Notifications": "No Notifications", + "No Recordings Found": "No Recordings Found", + "No Rides now!": "No Rides now!", + "No contacts available": "No contacts available", + "No i want": "No i want", + "No notification data found.": "No notification data found.", + "No routes available for this destination.": + "No routes available for this destination.", + "No user found": "No user found", + "No,I want": "No,I want", + "No.Iwant Cancel Trip.": "No.Iwant Cancel Trip.", + "Now move the map to your pickup point": + "Now move the map to your pickup point", + "Now set the pickup point for the other person": + "Now set the pickup point for the other person", + "On Trip": "On Trip", + "Open": "Open", + "Open destination search": "Open destination search", + "Open in Google Maps": "Open in Google Maps", + "Order VIP Canceld": "Order VIP Canceld", + "Passenger": "Passenger", + "Passenger cancel order": "Passenger cancel order", + "Pay by MTN Wallet": "Pay by MTN Wallet", + "Pay by Sham Cash": "Pay by Sham Cash", + "Pay by Syriatel Wallet": "Pay by Syriatel Wallet", + "Pay with PayPal": "Pay with PayPal", + "Phone": "Phone", + "Phone Number": "Phone Number", + "Phone Number Check": "Phone Number Check", + "Phone number seems too short": "Phone number seems too short", + "Phone verified. Please complete registration.": + "Phone verified. Please complete registration.", + "Pick destination on map": "Pick destination on map", + "Pick location on map": "Pick location on map", + "Pick on map": "Pick on map", + "Pick start point on map": "Pick start point on map", + "Plan Your Route": "Plan Your Route", + "Please add contacts to your phone.": + "Please add contacts to your phone.", + "Please check your internet and try again.": + "Please check your internet and try again.", + "Please enter a valid email.": "Please enter a valid email.", + "Please enter a valid phone number.": + "Please enter a valid phone number.", + "Please enter the number without the leading 0": + "Please enter the number without the leading 0", + "Please enter your phone number": "Please enter your phone number", + "Please go to Car now": "Please go to Car now", + "Please select a reason first": "Please select a reason first", + "Please set a valid SOS phone number.": + "Please set a valid SOS phone number.", + "Please slow down": "Please slow down", + "Please wait while we prepare your trip.": + "Please wait while we prepare your trip.", + "Preferences": "Preferences", + "Profile photo updated": "Profile photo updated", + "Quick Message": "Quick Message", + "Rating is": "Rating is", + "Received empty route data.": "Received empty route data.", + "Record": "Record", + "Record your trips to see them here.": + "Record your trips to see them here.", + "Rejected Orders Count": "Rejected Orders Count", + "Remove waypoint": "Remove waypoint", + "Report": "Report", + "Route and prices have been calculated successfully!": + "Route and prices have been calculated successfully!", + "SOS": "SOS", + "Save": "Save", + "Save Changes": "Save Changes", + "Save Name": "Save Name", + "Search country": "Search country", + "Search for a starting point": "Search for a starting point", + "Select Appearance": "Select Appearance", + "Select Education": "Select Education", + "Select Gender": "Select Gender", + "Select This Ride": "Select This Ride", + "Select betweeen types": "Select betweeen types", + "Send Email": "Send Email", + "Send SOS": "Send SOS", + "Send WhatsApp Message": "Send WhatsApp Message", + "Server Error": "Server Error", + "Server error": "Server error", + "Server error. Please try again.": "Server error. Please try again.", + "Set Destination": "Set Destination", + "Set Phone Number": "Set Phone Number", + "Set as Home": "Set as Home", + "Set as Stop": "Set as Stop", + "Set as Work": "Set as Work", + "Share": "Share", + "Share Trip": "Share Trip", + "Share your experience to help us improve...": + "Share your experience to help us improve...", + "Something went wrong. Please try again.": + "Something went wrong. Please try again.", + "Speaking...": "Speaking...", + "Speed Over": "Speed Over", + "Start Point": "Start Point", + "Stay calm. We are here to help.": "Stay calm. We are here to help.", + "Stop": "Stop", + "Submit Rating": "Submit Rating", + "Support & Info": "Support & Info", + "System Default": "System Default", + "Take a Photo": "Take a Photo", + "Tap to apply your discount": "Tap to apply your discount", + "Tap to search your destination": "Tap to search your destination", + "The driver cancelled the trip.": "The driver cancelled the trip.", + "This action cannot be undone.": "This action cannot be undone.", + "This action is permanent and cannot be undone.": + "This action is permanent and cannot be undone.", + "This is for delivery or a motorcycle.": + "This is for delivery or a motorcycle.", + "Time": "Time", + "To :": "To :", + "Top up Balance": "Top up Balance", + "Top up Balance to continue": "Top up Balance to continue", + "Total Invites": "Total Invites", + "Total Price": "Total Price", + "Trip booked successfully": "Trip booked successfully", + "Type your message...": "Type your message...", + "Unknown Location": "Unknown Location", + "Update Name": "Update Name", + "Verified Passenger": "Verified Passenger", + "View Map": "View Map", + "Wait for the trip to start first": + "Wait for the trip to start first", + "Waiting...": "Waiting...", + "Warning": "Warning", + "Waypoint has been set successfully": + "Waypoint has been set successfully", + "We use location to get accurate and nearest driver for you": + "We use location to get accurate and nearest driver for you", + "WhatsApp": "WhatsApp", + "Why do you want to cancel?": "Why do you want to cancel?", + "Yes": "Yes", + "You should ideintify your gender for this type of trip!": + "You should ideintify your gender for this type of trip!", + "You will choose one of above!": "You will choose one of above!", + "Your Rewards": "Your Rewards", + "Your complaint has been submitted.": + "Your complaint has been submitted.", + "and acknowledge our Privacy Policy.": + "and acknowledge our Privacy Policy.", + "as the driver.": "as the driver.", + "cancelled": "cancelled", + "due to a previous trip.": "due to a previous trip.", + "insert sos phone": "insert sos phone", + "is driving a": "is driving a", + "min added to fare": "min added to fare", + "phone not verified": "phone not verified", + "to arrive you.": "to arrive you.", + "unknown": "unknown", + "wait 1 minute to recive message": "wait 1 minute to recive message", + "with license plate": "with license plate", + "witout zero": "witout zero", + "you must insert token code": "you must insert token code", + "Syria": "Siria", + "SYP": "SYP", + "Order": "Ordine", + "OrderVIP": "Ordine VIP", + "Cancel Trip": "Annulla corsa", + "Passenger Cancel Trip": "Il passeggero ha annullato la corsa", + "VIP Order": "Ordine VIP", + "The driver accepted your trip": + "L'autista ha accettato la tua corsa", + "message From passenger": "Messaggio dal passeggero", + "Cancel": "Annulla", + "Trip Cancelled. The cost of the trip will be added to your wallet.": + "Corsa annullata. Il costo sarà accreditato sul tuo portafoglio.", + "token change": "Cambio token", + "Changed my mind": "Ho cambiato idea", + "Please write the reason...": "Scrivi il motivo...", + "Found another transport": "Ho trovato un altro mezzo", + "Driver is taking too long": "L'autista ci mette troppo", + "Driver asked me to cancel": "L'autista mi ha chiesto di annullare", + "Wrong pickup location": "Punto di partenza errato", + "Other": "Altro", + "Don't Cancel": "Non annullare", + "No Drivers Found": "Nessun autista trovato", + "Sorry, there are no cars available of this type right now.": + "Spiacenti, non ci sono auto di questo tipo disponibili al momento.", + "Refresh Map": "Aggiorna mappa", + "face detect": "Rilevamento volto", + "Face Detection Result": "Risultato rilevamento volto", + "similar": "Simile", + "not similar": "Non simile", + "Searching for nearby drivers...": + "Ricerca autisti nelle vicinanze...", + "Error": "Errore", + "Failed to search, please try again later": + "Ricerca non riuscita, riprova più tardi", + "Connection Error": "Errore di connessione", + "Please check your internet connection": + "Controlla la tua connessione internet", + "Sorry 😔": "Spiacenti 😔", + "The driver cancelled the trip for an emergency reason.\nDo you want to search for another driver immediately?": + "L'autista ha annullato il viaggio per un'emergenza.\nVuoi cercare subito un altro autista?", + "Search for another driver": "Cerca un altro autista", + "We apologize 😔": "Ci scusiamo 😔", + "No drivers found at the moment.\nPlease try again later.": + "Nessun autista trovato al momento.\nRiprova più tardi.", + "Hi ,I will go now": "Ciao, sto partendo ora", + "Passenger come to you": "Il passeggero sta venendo da te", + "Call Income": "Chiamata in arrivo", + "Call Income from Passenger": "Chiamata dal passeggero", + "Criminal Document Required": "Casellario Giudiziale richiesto", + "You should have upload it .": "Devi caricarlo.", + "Call End": "Chiamata terminata", + "The order has been accepted by another driver.": + "L'ordine è stato accettato da un altro autista.", + "The order Accepted by another Driver": + "Ordine accettato da un altro autista", + "We regret to inform you that another driver has accepted this order.": + "Ci dispiace informarti che un altro autista ha accettato questo ordine.", + "Driver Applied the Ride for You": + "L'autista ha richiesto la corsa per te", + "Applied": "Richiesto", + "Please go to Car Driver": "Per favore, vai dall'autista", + "Ok I will go now.": "Ok, vado ora.", + "Accepted Ride": "Corsa accettata", + "Driver Accepted the Ride for You": + "L'autista ha accettato la corsa per te", + "Promo": "Promo", + "Show latest promo": "Mostra ultime promozioni", + "Trip Monitoring": "Monitoraggio viaggio", + "Driver Is Going To Passenger": + "L'autista sta andando dal passeggero", + "Please stay on the picked point.": + "Per favore, resta al punto di raccolta.", + "message From Driver": "Messaggio dall'autista", + "Trip is Begin": "Il viaggio è iniziato", + "Cancel Trip from driver": "Corsa annullata dall'autista", + "We will look for a new driver.\nPlease wait.": + "Cercheremo un nuovo autista.\nAttendere prego.", + "The driver canceled your ride.": + "L'autista ha annullato la tua corsa.", + "Driver Finish Trip": "L'autista ha terminato la corsa", + "you will pay to Driver": "Pagherai all'autista", + "Don’t forget your personal belongings.": + "Non dimenticare i tuoi effetti personali.", + "Please make sure you have all your personal belongings and that any remaining fare, if applicable, has been added to your wallet before leaving. Thank you for choosing the Intaleq app": + "Assicurati di avere tutti i tuoi effetti personali e che l'eventuale resto sia stato aggiunto al tuo portafoglio. Grazie per aver scelto Intaleq.", + "Finish Monitor": "Termina monitoraggio", + "Trip finished": "Corsa finita", + "Call Income from Driver": "Chiamata dall'autista", + "Driver Cancelled Your Trip": "L'autista ha annullato la tua corsa", + "you will pay to Driver you will be pay the cost of driver time look to your Intaleq Wallet": + "Pagherai il costo del tempo dell'autista, controlla il tuo portafoglio Intaleq", + "Order Applied": "Ordine applicato", + "welcome to intaleq": "Benvenuto in Intaleq", + "login or register subtitle": + "Inserisci il tuo numero di cellulare per accedere o registrarti", + "Complaint cannot be filed for this ride. It may not have been completed or started.": + "Impossibile presentare reclamo per questa corsa. Potrebbe non essere stata completata o iniziata.", + "phone number label": "Numero di telefono", + "phone number required": "Numero di telefono richiesto", + "send otp button": "Invia OTP", + "verify your number title": "Verifica il tuo numero", + "otp sent subtitle": + "Un codice a 5 cifre è stato inviato a\n@phoneNumber", + "verify and continue button": "Verifica e continua", + "enter otp validation": "Inserisci l'OTP a 5 cifre", + "one last step title": "Un ultimo passo", + "complete profile subtitle": "Completa il profilo per iniziare", + "first name label": "Nome", + "first name required": "Nome richiesto", + "last name label": "Cognome", + "Verify OTP": "Verifica OTP", + "Verification Code": "Codice di verifica", + "We have sent a verification code to your mobile number:": + "Abbiamo inviato un codice di verifica al tuo numero:", + "Verify": "Verifica", + "Resend Code": "Invia di nuovo", + "You can resend in": "Puoi inviare di nuovo tra", + "seconds": "secondi", + "Please enter the complete 6-digit code.": + "Inserisci il codice completo a 6 cifre.", + "last name required": "Cognome richiesto", + "email optional label": "Email (Opzionale)", + "complete registration button": "Completa registrazione", + "User with this phone number or email already exists.": + "Utente con questo numero o email già esistente.", + "otp sent success": "OTP inviato con successo su WhatsApp.", + "failed to send otp": "Invio OTP fallito.", + "server error try again": "Errore del server, riprova.", + "an error occurred": "Si è verificato un errore: @error", + "otp verification failed": "Verifica OTP fallita.", + "registration failed": "Registrazione fallita.", + "welcome user": "Benvenuto, @firstName!", + "Don't forget your personal belongings.": + "Non dimenticare i tuoi effetti personali.", + "Share App": "Condividi app", + "Wallet": "Portafoglio", + "Balance": "Saldo", + "Profile": "Profilo", + "Contact Support": "Contatta supporto", + "Session expired. Please log in again.": + "Sessione scaduta. Accedi di nuovo.", + "Security Warning": "⚠️ Avviso di sicurezza", + "Potential security risks detected. The application may not function correctly.": + "Rilevati potenziali rischi di sicurezza. L'app potrebbe non funzionare correttamente.", + "please order now": "Ordina ora", + "Where to": "Dove vuoi andare?", + "Where are you going?": "Dove stai andando?", + "Quick Actions": "Azioni rapide", + "My Balance": "Il mio saldo", + "Order History": "Cronologia ordini", + "Contact Us": "Contattaci", + "Driver": "Autista", + "Complaint": "Reclamo", + "Promos": "Promozioni", + "Recent Places": "Luoghi recenti", + "From": "Da", + "WhatsApp Location Extractor": "Estrattore posizione WhatsApp", + "Location Link": "Link posizione", + "Paste location link here": "Incolla il link della posizione qui", + "Go to this location": "Vai a questa posizione", + "Paste WhatsApp location link": "Incolla link posizione WhatsApp", + "Select Order Type": "Seleziona tipo ordine", + "Choose who this order is for": "Per chi è questo ordine", + "I want to order for myself": "Voglio ordinare per me", + "I want to order for someone else": + "Voglio ordinare per qualcun altro", + "Order for someone else": "Ordina per altri", + "Order for myself": "Ordina per me", + "Are you want to go this site": "Vuoi andare in questo luogo?", + "No": "No", + "Intaleq Wallet": "Portafoglio Intaleq", + "Have a promo code?": "Hai un codice promozionale?", + "Your Wallet balance is ": "Il saldo del tuo portafoglio è: ", + "Cash": "Contanti", + "Pay directly to the captain": "Paga direttamente al conducente", + "Top up Wallet to continue": "Ricarica il portafoglio per continuare", + "Or pay with Cash instead": "O paga in contanti", + "Confirm & Find a Ride": "Conferma e trova corsa", + "Balance:": "Saldo:", + "Alerts": "Avvisi", + "Welcome Back!": "Bentornato!", + "Current Balance": "Saldo attuale", + "Set Wallet Phone Number": "Imposta numero portafoglio", + "Link a phone number for transfers": + "Collega un numero per i trasferimenti", + "Payment History": "Cronologia pagamenti", + "View your past transactions": "Visualizza le transazioni passate", + "Top up Wallet": "Ricarica portafoglio", + "Add funds using our secure methods": + "Aggiungi fondi con i nostri metodi sicuri", + "Increase Fare": "Aumenta tariffa", + "No drivers accepted your request yet": + "Nessun autista ha ancora accettato la tua richiesta", + "Increasing the fare might attract more drivers. Would you like to increase the price?": + "Aumentare la tariffa potrebbe attrarre più autisti. Vuoi aumentare il prezzo?", + "Please make sure not to leave any personal belongings in the car.": + "Assicurati di non lasciare effetti personali in auto.", + "Cancel Ride": "Annulla corsa", + "Route Not Found": "Percorso non trovato", + "We couldn't find a valid route to this destination. Please try selecting a different point.": + "Non siamo riusciti a trovare un percorso valido. Prova a selezionare un punto diverso.", + "You can call or record audio during this trip.": + "Puoi chiamare o registrare audio durante questo viaggio.", + "Warning: Speeding detected!": + "Attenzione: Rilevato eccesso di velocità!", + "Comfort": "Comfort", + "Intaleq Balance": "Saldo Intaleq", + "Electric": "Elettrica", + "Lady": "Donna", + "Van": "Furgone", + "Rayeh Gai": "Andata e Ritorno", + "Join Intaleq as a driver using my referral code!": + "Unisciti a Intaleq come autista usando il mio codice!", + "Use code:": "Usa codice:", + "Download the Intaleq Driver app now and earn rewards!": + "Scarica l'app Intaleq Driver e guadagna premi!", + "Get a discount on your first Intaleq ride!": + "Ottieni uno sconto sulla tua prima corsa Intaleq!", + "Use my referral code:": "Usa il mio codice invito:", + "Download the Intaleq app now and enjoy your ride!": + "Scarica l'app Intaleq e goditi il viaggio!", + "Contacts Loaded": "Contatti caricati", + "Showing": "Visualizzazione", + "of": "di", + "Customer not found": "Cliente non trovato", + "Wallet is blocked": "Il portafoglio è bloccato", + "Customer phone is not active": + "Il telefono del cliente non è attivo", + "Balance not enough": "Saldo insufficiente", + "Balance limit exceeded": "Limite saldo superato", + "Incorrect sms code": "⚠️ Codice SMS errato. Riprova.", + "contacts. Others were hidden because they don't have a phone number.": + "contatti. Altri nascosti perché senza numero.", + "No contacts found": "Nessun contatto trovato", + "No contacts with phone numbers were found on your device.": + "Nessun contatto con numero di telefono trovato sul dispositivo.", + "Permission denied": "Permesso negato", + "Contact permission is required to pick contacts": + "È richiesto il permesso ai contatti per selezionarli.", + "An error occurred while picking contacts:": + "Errore durante la selezione dei contatti:", + "Please enter a correct phone": "Inserisci un numero corretto", + "Success": "Successo", + "Invite sent successfully": "Invito inviato con successo", + "Hello! I'm inviting you to try Intaleq.": + "Ciao! Ti invito a provare Intaleq.", + "Use my invitation code to get a special gift on your first ride!": + "Usa il mio codice invito per un regalo speciale sulla prima corsa!", + "Your personal invitation code is:": + "Il tuo codice invito personale è:", + "Be sure to use it quickly! This code expires at": + "Usalo presto! Questo codice scade il", + "Download the app now:": "Scarica l'app ora:", + "See you on the road!": "Ci vediamo in strada!", + "This phone number has already been invited.": + "Questo numero è già stato invitato.", + "An unexpected error occurred. Please try again.": + "Si è verificato un errore imprevisto. Riprova.", + "You deserve the gift": "Ti meriti il regalo", + "Claim your 20 LE gift for inviting": + "Richiedi il tuo regalo di 20 € per l'invito", + "You have got a gift for invitation": + "Hai ricevuto un regalo per l'invito", + "You have earned 20": "Hai guadagnato 20", + "LE": "€", + "Vibration feedback for all buttons": + "Feedback vibrazione per tutti i pulsanti", + "Share with friends and earn rewards": + "Condividi con amici e guadagna premi", + "Gift Already Claimed": "Regalo già richiesto", + "You have already received your gift for inviting": + "Hai già ricevuto il tuo regalo per questo invito", + "Keep it up!": "Continua così!", + "has completed": "ha completato", + "trips": "viaggi", + "Personal Information": "Informazioni personali", + "Name": "Nome", + "Not set": "Non impostato", + "Gender": "Genere", + "Education": "Istruzione", + "Work & Contact": "Lavoro e Contatti", + "Employment Type": "Tipo di impiego", + "Marital Status": "Stato civile", + "SOS Phone": "Telefono SOS", + "Sign Out": "Esci", + "Delete My Account": "Elimina il mio account", + "Update Gender": "Aggiorna genere", + "Update": "Aggiorna", + "Update Education": "Aggiorna istruzione", + "Are you sure? This action cannot be undone.": + "Sei sicuro? Questa azione non può essere annullata.", + "Confirm your Email": "Conferma la tua email", + "Type your Email": "Scrivi la tua email", + "Delete Permanently": "Elimina definitivamente", + "Male": "Maschio", + "Female": "Femmina", + "High School Diploma": "Diploma di scuola superiore", + "Associate Degree": "Laurea breve", + "Bachelor's Degree": "Laurea triennale", + "Master's Degree": "Laurea magistrale", + "Doctoral Degree": "Dottorato", + "Select your preferred language for the app interface.": + "Seleziona la lingua preferita per l'app.", + "Language Options": "Opzioni lingua", + "You can claim your gift once they complete 2 trips.": + "Puoi richiedere il regalo una volta che completano 2 corse.", + "Closest & Cheapest": "Più vicino ed economico", + "Comfort choice": "Scelta comfort", + "Travel in a modern, silent electric car. A premium, eco-friendly choice for a smooth ride.": + "Viaggia in un'auto elettrica moderna e silenziosa. Una scelta premium ed ecologica.", + "Spacious van service ideal for families and groups. Comfortable, safe, and cost-effective travel together.": + "Servizio van spazioso ideale per famiglie e gruppi. Comodo, sicuro ed economico.", + "Quiet & Eco-Friendly": "Silenzioso ed Ecologico", + "Lady Captain for girls": "Autista donna per ragazze", + "Van for familly": "Furgone per famiglia", + "Are you sure to delete this location?": + "Sei sicuro di voler eliminare questa posizione?", + "Submit a Complaint": "Invia un reclamo", + "Submit Complaint": "Invia reclamo", + "No trip history found": "Nessuna cronologia viaggi", + "Your past trips will appear here.": + "I tuoi viaggi passati appariranno qui.", + "1. Describe Your Issue": "1. Descrivi il problema", + "Enter your complaint here...": "Inserisci qui il tuo reclamo...", + "2. Attach Recorded Audio": "2. Allega audio registrato", + "No audio files found.": "Nessun file audio trovato.", + "Confirm Attachment": "Conferma allegato", + "Attach this audio file?": "Allegare questo file audio?", + "Uploaded": "Caricato", + "3. Review Details & Response": "3. Rivedi dettagli e risposta", + "Date": "Data", + "Today's Promos": "Promo di oggi", + "No promos available right now.": + "Nessuna promozione disponibile ora.", + "Check back later for new offers!": + "Controlla più tardi per nuove offerte!", + "Valid Until:": "Valido fino a:", + "CODE": "CODICE", + "I Agree": "Accetto", + "Continue": "Continua", + "Enable Location": "Attiva posizione", + "To give you the best experience, we need to know where you are. Your location is used to find nearby captains and for pickups.": + "Per offrirti la migliore esperienza, dobbiamo sapere dove sei. La tua posizione serve per trovare autisti vicini.", + "Allow Location Access": "Consenti accesso posizione", + "Welcome to Intaleq!": "Benvenuto in Intaleq!", + "Before we start, please review our terms.": + "Prima di iniziare, rivedi i nostri termini.", + "Your journey starts here": "Il tuo viaggio inizia qui", + "Cancel Search": "Annulla ricerca", + "Set pickup location": "Imposta punto di raccolta", + "Move the map to adjust the pin": + "Sposta la mappa per regolare il segnaposto", + "Searching for the nearest captain...": + "Ricerca del conducente più vicino...", + "No one accepted? Try increasing the fare.": + "Nessuno ha accettato? Prova ad aumentare la tariffa.", + "Increase Your Trip Fee (Optional)": "Aumenta la tariffa (Opzionale)", + "We haven't found any drivers yet. Consider increasing your trip fee to make your offer more attractive to drivers.": + "Non abbiamo ancora trovato autisti. Considera di aumentare la tariffa per rendere l'offerta più attraente.", + "No, thanks": "No, grazie", + "Increase Fee": "Aumenta tariffa", + "Copy": "Copia", + "Promo Copied!": "Promo copiata!", + "Code": "Codice", + "Send Intaleq app to him": "Invia app Intaleq a lui", + "No passenger found for the given phone number": + "Nessun passeggero trovato per questo numero", + "No user found for the given phone number": + "Nessun utente trovato per questo numero", + "This price is": "Questo prezzo è", + "Work": "Lavoro", + "Add Home": "Aggiungi Casa", + "Notifications": "Notifiche", + "💳 Pay with Credit Card": "💳 Paga con carta di credito", + "⚠️ You need to choose an amount!": "⚠️ Devi scegliere un importo!", + "💰 Pay with Wallet": "💰 Paga con portafoglio", + "You must restart the app to change the language.": + "Devi riavviare l'app per cambiare lingua.", + "joined": "unito", + "Driver joined the channel": "L'autista si è unito al canale", + "Driver left the channel": "L'autista ha lasciato il canale", + "Call Page": "Pagina chiamata", + "Call Left": "Chiamate rimaste", + " Next as Cash !": " Prossimo in contanti!", + "To use Wallet charge it": "Per usare il portafoglio, ricaricalo", + "We are searching for the nearest driver to you": + "Cerchiamo l'autista più vicino a te", + "Best choice for cities": "Migliore scelta per città", + "Rayeh Gai: Round trip service for convenient travel between cities, easy and reliable.": + "Andata e Ritorno: Servizio comodo per viaggiare tra città.", + "This trip is for women only": "Questa corsa è solo per donne", + "Total budgets on month": "Budget totali nel mese", + "You have call from driver": "Hai una chiamata dall'autista", + "Intaleq": "Intaleq", + "passenger agreement": "accordo passeggero", + "To become a passenger, you must review and agree to the ": + "Per diventare passeggero, devi accettare i ", + "agreement subtitle": + "Per continuare, devi accettare i Termini d'uso e l'Informativa sulla privacy.", + "terms of use": "termini d'uso", + " and acknowledge our Privacy Policy.": + " e l'Informativa sulla Privacy.", + "and acknowledge our": "e accetta la nostra", + "privacy policy": "politica sulla privacy.", + "i agree": "accetto", + "Driver already has 2 trips within the specified period.": + "L'autista ha già 2 viaggi nel periodo specificato.", + "The invitation was sent successfully": "Invito inviato con successo", + "You should select your country": "Dovresti selezionare il tuo paese", + "Scooter": "Scooter", + "A trip with a prior reservation, allowing you to choose the best captains and cars.": + "Viaggio con prenotazione, scegli i migliori autisti e auto.", + "Mishwar Vip": "Viaggio VIP", + "The driver waiting you in picked location .": + "L'autista ti aspetta al punto di raccolta.", + "About Us": "Chi siamo", + "You can change the vibration feedback for all buttons": + "Puoi cambiare la vibrazione per tutti i pulsanti", + "Most Secure Methods": "Metodi più sicuri", + "In-App VOIP Calls": "Chiamate VOIP in-app", + "Recorded Trips for Safety": "Viaggi registrati per sicurezza", + "\nWe also prioritize affordability, offering competitive pricing to make your rides accessible.": + "\nOffriamo prezzi competitivi.", + "Intaleq is a ride-sharing app designed with your safety and affordability in mind. We connect you with reliable drivers in your area, ensuring a convenient and stress-free travel experience.\n\nHere are some of the key features that set us apart:": + "Intaleq è un'app di ride-sharing progettata per sicurezza e risparmio.", + "Sign In by Apple": "Accedi con Apple", + "Sign In by Google": "Accedi con Google", + "How do I request a ride?": "Come richiedo una corsa?", + "Step-by-step instructions on how to request a ride through the Intaleq app.": + "Istruzioni passo-passo per richiedere una corsa.", + "What types of vehicles are available?": + "Quali veicoli sono disponibili?", + "Intaleq offers a variety of vehicle options to suit your needs, including economy, comfort, and luxury. Choose the option that best fits your budget and passenger count.": + "Intaleq offre opzioni Economy, Comfort e Luxury.", + "How can I pay for my ride?": "Come posso pagare?", + "Intaleq offers multiple payment methods for your convenience. Choose between cash payment or credit/debit card payment during ride confirmation.": + "Puoi pagare in contanti o con carta.", + "Can I cancel my ride?": "Posso annullare la corsa?", + "Yes, you can cancel your ride under certain conditions (e.g., before driver is assigned). See the Intaleq cancellation policy for details.": + "Sì, puoi annullare la corsa a determinate condizioni (ad es. prima dell'assegnazione dell'autista). Consulta la politica di cancellazione Intaleq per i dettagli.", + "Driver Registration & Requirements": + "Registrazione Autista e Requisiti", + "How can I register as a driver?": "Come mi registro come autista?", + "What are the requirements to become a driver?": + "Quali sono i requisiti?", + "Visit our website or contact Intaleq support for information on driver registration and requirements.": + "Visita il sito o contatta il supporto.", + "Intaleq provides in-app chat functionality to allow you to communicate with your driver or passenger during your ride.": + "Intaleq offre una chat in-app.", + "Intaleq prioritizes your safety. We offer features like driver verification, in-app trip tracking, and emergency contact options.": + "Verifica autista, tracciamento viaggio, contatti emergenza.", + "Frequently Questions": "Domande Frequenti", + "User does not exist.": "L'utente non esiste.", + "We need your phone number to contact you and to help you.": + "Ci serve il tuo numero per contattarti.", + "You will recieve code in sms message": "Riceverai un codice via SMS", + "Please enter": "Inserisci", + "We need your phone number to contact you and to help you receive orders.": + "Ci serve il tuo numero per ricevere ordini.", + "The full name on your criminal record does not match the one on your driver's license. Please verify and provide the correct documents.": + "Il nome sul casellario non corrisponde alla patente.", + "The national number on your driver's license does not match the one on your ID document. Please verify and provide the correct documents.": + "Il numero della patente non corrisponde al documento d'identità.", + "Capture an Image of Your Criminal Record": + "Cattura immagine del Casellario Giudiziale", + "IssueDate": "Data rilascio", + "Capture an Image of Your car license front": + "Foto fronte libretto circolazione", + "Capture an Image of Your ID Document front": + "Foto fronte documento identità", + "NationalID": "Numero Carta d'Identità", + "You can share the Intaleq App with your friends and earn rewards for rides they take using your code": + "Condividi l'app e guadagna premi.", + "FullName": "Nome completo", + "No invitation found yet!": "Nessun invito trovato!", + "InspectionResult": "Risultato ispezione", + "Criminal Record": "Casellario Giudiziale", + "The email or phone number is already registered.": + "Email o numero già registrati.", + "To become a ride-sharing driver on the Intaleq app, you need to upload your driver's license, ID document, and car registration document. Our AI system will instantly review and verify their authenticity in just 2-3 minutes. If your documents are approved, you can start working as a driver on the Intaleq app. Please note, submitting fraudulent documents is a serious offense and may result in immediate termination and legal consequences.": + "Carica patente, documento d'identità e libretto. Verifica in 2-3 minuti.", + "Documents check": "Controllo documenti", + "Driver's License": "Patente di guida", + "for your first registration!": "per la tua prima registrazione!", + "Get it Now!": "Ottienilo ora!", + "before": "prima", + "Code not approved": "Codice non approvato", + "3000 LE": "30 €", + "Do you have an invitation code from another driver?": + "Hai un codice invito?", + "Paste the code here": "Incolla il codice qui", + "No, I don't have a code": "No, non ho un codice", + "Audio uploaded successfully.": "Audio caricato con successo.", + "Perfect for passengers seeking the latest car models with the freedom to choose any route they desire": + "Perfetto per chi cerca auto nuove e libertà di percorso", + "Share this code with your friends and earn rewards when they use it!": + "Condividi questo codice e guadagna premi!", + "Enter phone": "Inserisci telefono", + "complete, you can claim your gift": + "completato, puoi richiedere il regalo", + "When": "Quando", + "Enter driver's phone": "Inserisci telefono autista", + "Send Invite": "Invia invito", + "Show Invitations": "Mostra inviti", + "License Type": "Tipo patente", + "National Number": "Numero Carta d'Identità", + "Name (Arabic)": "Nome (Locale)", + "Name (English)": "Nome (Inglese)", + "Address": "Indirizzo", + "Issue Date": "Data rilascio", + "Expiry Date": "Data scadenza", + "License Categories": "Categorie patente", + "driver_license": "patente_guida", + "Capture an Image of Your Driver License": + "Cattura immagine della patente", + "ID Documents Back": "Retro documento identità", + "National ID": "Carta d'Identità", + "Occupation": "Occupazione", + "Religion": "Religione", + "Full Name (Marital)": "Nome completo", + "Expiration Date": "Data scadenza", + "Capture an Image of Your ID Document Back": + "Foto retro documento identità", + "ID Documents Front": "Fronte documento identità", + "First Name": "Nome", + "CardID": "ID Carta", + "Vehicle Details Front": "Dettagli veicolo Fronte", + "Plate Number": "Targa", + "Owner Name": "Proprietario", + "Vehicle Details Back": "Dettagli veicolo Retro", + "Make": "Marca", + "Model": "Modello", + "Year": "Anno", + "Chassis": "Telaio", + "Color": "Colore", + "Displacement": "Cilindrata", + "Fuel": "Carburante", + "Tax Expiry Date": "Scadenza bollo", + "Inspection Date": "Data revisione", + "Capture an Image of Your car license back": + "Foto retro libretto circolazione", + "Capture an Image of Your Driver's License": "Foto patente di guida", + "Sign in with Google for easier email and name entry": + "Accedi con Google per facilità", + "You will choose allow all the time to be ready receive orders": + "Scegli 'Consenti sempre' per ricevere ordini", + "Get to your destination quickly and easily.": + "Arriva a destinazione velocemente.", + "Enjoy a safe and comfortable ride.": + "Goditi una corsa sicura e comoda.", + "Choose Language": "Scegli lingua", + "Pay with Wallet": "Paga con Portafoglio", + "Invalid MPIN": "MPIN non valido", + "Invalid OTP": "OTP non valido", + "Enter your email address": "Inserisci la tua email", + "Please enter Your Email.": "Inserisci la tua email.", + "Enter your phone number": "Inserisci il tuo numero", + "Please enter your phone number.": "Inserisci il numero di telefono.", + "Please enter Your Password.": "Inserisci la password.", + "if you dont have account": "se non hai un account", + "Register": "Registrati", + "Accept Ride's Terms & Review Privacy Notice": + "Accetta Termini e Privacy", + "By selecting 'I Agree' below, I have reviewed and agree to the Terms of Use and acknowledge the Privacy Notice. I am at least 18 years of age.": + "Selezionando 'Accetto', confermo di aver letto termini e privacy. Ho 18 anni.", + "First name": "Nome", + "Enter your first name": "Inserisci il tuo nome", + "Please enter your first name.": "Inserisci il nome.", + "Last name": "Cognome", + "Enter your last name": "Inserisci il tuo cognome", + "Please enter your last name.": "Inserisci il cognome.", + "City": "Città", + "Please enter your City.": "Inserisci la città.", + "Verify Email": "Verifica Email", + "We sent 5 digit to your Email provided": + "Inviate 5 cifre alla tua email", + "5 digit": "5 cifre", + "Send Verification Code": "Invia codice verifica", + "Your Ride Duration is ": "Durata corsa: ", + "You will be thier in": "Sarai lì in", + "You trip distance is": "Distanza viaggio:", + "Fee is": "Tariffa:", + "From : ": "Da: ", + "To : ": "A: ", + "Add Promo": "Aggiungi Promo", + "Confirm Selection": "Conferma selezione", + "distance is": "distanza è", + "Privacy Policy": "Informativa sulla privacy", + "Intaleq LLC": "Intaleq LLC", + "Syria's pioneering ride-sharing service, proudly developed by Arabian and local owners. We prioritize being near you – both our valued passengers and our dedicated captains.": + "Servizio di ride-sharing pionieristico in Italia.", + "Intaleq is the first ride-sharing app in Syria, designed to connect you with the nearest drivers for a quick and convenient travel experience.": + "Intaleq ti connette con gli autisti più vicini.", + "Why Choose Intaleq?": "Perché Intaleq?", + "Closest to You": "Più vicino a te", + "We connect you with the nearest drivers for faster pickups and quicker journeys.": + "Ti connettiamo agli autisti più vicini.", + "Uncompromising Security": "Sicurezza senza compromessi", + "Lady Captains Available": "Autiste donne disponibili", + "Recorded Trips (Voice & AI Analysis)": + "Viaggi registrati (Voce & AI)", + "Fastest Complaint Response": "Risposta reclami veloce", + "Our dedicated customer service team ensures swift resolution of any issues.": + "Il nostro team risolve i problemi velocemente.", + "Affordable for Everyone": "Conveniente per tutti", + "Frequently Asked Questions": "Domande Frequenti", + "Getting Started": "Iniziare", + "Simply open the Intaleq app, enter your destination, and tap \"Request Ride\". The app will connect you with a nearby driver.": + "Apri l'app, inserisci destinazione e richiedi corsa.", + "Vehicle Options": "Opzioni veicolo", + "Intaleq offers a variety of options including Economy, Comfort, and Luxury to suit your needs and budget.": + "Economy, Comfort, Luxury.", + "Payments": "Pagamenti", + "You can pay for your ride using cash or credit/debit card. You can select your preferred payment method before confirming your ride.": + "Contanti o carta.", + "Ride Management": "Gestione corse", + "Yes, you can cancel your ride, but please note that cancellation fees may apply depending on how far in advance you cancel.": + "Sì, puoi annullare, potrebbero esserci costi.", + "For Drivers": "Per Autisti", + "Driver Registration": "Registrazione Autista", + "To register as a driver or learn about the requirements, please visit our website or contact Intaleq support directly.": + "Visita il sito per registrarti.", + "Visit Website/Contact Support": "Sito/Supporto", + "Close": "Chiudi", + "We are searching for the nearest driver": + "Cerchiamo l'autista più vicino", + "Communication": "Comunicazione", + "How do I communicate with the other party (passenger/driver)?": + "Come comunico?", + "You can communicate with your driver or passenger through the in-app chat feature once a ride is confirmed.": + "Tramite chat in-app.", + "Safety & Security": "Sicurezza", + "What safety measures does Intaleq offer?": "Misure di sicurezza?", + "Intaleq offers various safety features including driver verification, in-app trip tracking, emergency contact options, and the ability to share your trip status with trusted contacts.": + "Verifica autista, tracciamento, SOS.", + "Enjoy competitive prices across all trip options, making travel accessible.": + "Prezzi competitivi.", + "Variety of Trip Choices": "Varietà di scelte", + "Choose the trip option that perfectly suits your needs and preferences.": + "Scegli l'opzione adatta a te.", + "Your Choice, Our Priority": "Tua scelta, nostra priorità", + "Because we are near, you have the flexibility to choose the ride that works best for you.": + "Flessibilità di scelta.", + "duration is": "durata è", + "Setting": "Impostazione", + "Find answers to common questions": "Trova risposte", + "I don't need a ride anymore": "Non mi serve più", + "I was just trying the application": "Stavo solo provando", + "No driver accepted my request": "Nessuno ha accettato", + "I added the wrong pick-up/drop-off location": "Posizione errata", + "I don't have a reason": "Nessun motivo", + "Can we know why you want to cancel Ride ?": "Perché vuoi annullare?", + "Add Payment Method": "Aggiungi metodo pagamento", + "Ride Wallet": "Portafoglio Corsa", + "Payment Method": "Metodo pagamento", + "Type here Place": "Scrivi qui luogo", + "Are You sure to ride to": "Sicuro di andare a", + "Confirm": "Conferma", + "You are Delete": "Stai eliminando", + "Deleted": "Eliminato", + "You Dont Have Any places yet !": "Nessun luogo ancora!", + "From : Current Location": "Da: Posizione attuale", + "My Cared": "Le mie carte", + "Add Card": "Aggiungi carta", + "Add Credit Card": "Aggiungi carta credito", + "Please enter the cardholder name": "Nome titolare", + "Please enter the expiry date": "Data scadenza", + "Please enter the CVV code": "Codice CVV", + "Go To Favorite Places": "Vai ai preferiti", + "Go to this Target": "Vai a destinazione", + "My Profile": "Il mio profilo", + "Are you want to go to this site": "Vuoi andare qui?", + "MyLocation": "MiaPosizione", + "my location": "mia posizione", + "Target": "Destinazione", + "You Should choose rate figure": "Devi scegliere un voto", + "Login Captin": "Accesso Autista", + "Register Captin": "Registrazione Autista", + "Send Verfication Code": "Invia codice verifica", + "KM": "KM", + "End Ride": "Fine corsa", + "Minute": "Minuto", + "Go to passenger Location now": "Vai dal passeggero ora", + "Duration of the Ride is ": "Durata corsa: ", + "Distance of the Ride is ": "Distanza corsa: ", + "Name of the Passenger is ": "Nome passeggero: ", + "Hello this is Captain": "Ciao, sono il conducente", + "Start the Ride": "Inizia corsa", + "Please Wait If passenger want To Cancel!": + "Attendi se il passeggero vuole annullare!", + "Total Duration:": "Durata totale:", + "Active Duration:": "Durata attiva:", + "Waiting for Captin ...": "Attesa autista...", + "Age is ": "Età: ", + "Rating is ": "Voto: ", + " to arrive you.": " per arrivare.", + "Tariff": "Tariffa", + "Settings": "Impostazioni", + "Feed Back": "Feedback", + "Please enter a valid 16-digit card number": + "Inserisci numero carta valido", + "Add Phone": "Aggiungi telefono", + "Please enter a phone number": "Inserisci numero telefono", + "You dont Add Emergency Phone Yet!": + "Non hai aggiunto telefono emergenza!", + "You will arrive to your destination after ": "Arriverai tra ", + "You can cancel Ride now": "Puoi annullare ora", + "You Can cancel Ride After Captain did not come in the time": + "Puoi annullare se l'autista tarda", + "If you in Car Now. Press Start The Ride": + "Se sei in auto, premi Inizia", + "You Dont Have Any amount in": "Non hai credito in", + "Wallet!": "Portafoglio!", + "You Have": "Hai", + "Save Credit Card": "Salva carta", + "Show Promos": "Mostra promo", + "10 and get 4% discount": "10 e ottieni 4% sconto", + "20 and get 6% discount": "20 e ottieni 6% sconto", + "40 and get 8% discount": "40 e ottieni 8% sconto", + "100 and get 11% discount": "100 e ottieni 11% sconto", + "Pay with Your PayPal": "Paga con PayPal", + "You will choose one of above !": "Scegline uno sopra!", + "Edit Profile": "Modifica profilo", + "Copy this Promo to use it in your Ride!": "Copia questa promo!", + "To change some Settings": "Per cambiare impostazioni", + "Order Request Page": "Pagina richiesta", + "Rouats of Trip": "Percorsi", + "Passenger Name is ": "Passeggero: ", + "Total From Passenger is ": "Totale da Passeggero: ", + "Duration To Passenger is ": "Durata verso Passeggero: ", + "Distance To Passenger is ": "Distanza verso Passeggero: ", + "Total For You is ": "Totale per te: ", + "Distance is ": "Distanza: ", + " KM": " KM", + "Duration of Trip is ": "Durata viaggio: ", + " Minutes": " Minuti", + "Apply Order": "Accetta ordine", + "Refuse Order": "Rifiuta ordine", + "Rate Captain": "Vota Autista", + "Enter your Note": "Inserisci nota", + "Type something...": "Scrivi qualcosa...", + "Submit rating": "Invia voto", + "Rate Passenger": "Vota Passeggero", + "Ride Summary": "Riepilogo corsa", + "welcome_message": "Benvenuto in Intaleq!", + "app_description": "App di ride-sharing sicura.", + "get_to_destination": "Arriva a destinazione.", + "get_a_ride": "Ottieni una corsa in minuti.", + "safe_and_comfortable": "Sicura e comoda.", + "committed_to_safety": "Impegnati per la sicurezza.", + "your ride is Accepted": "Corsa accettata", + "Driver is waiting at pickup.": "Autista in attesa.", + "Driver is on the way": "Autista in arrivo", + "Contact Options": "Opzioni contatto", + "Send a custom message": "Invia messaggio personalizzato", + "Type your message": "Scrivi messaggio", + "I will go now": "Vado ora", + "You Have Tips": "Hai mance", + " tips\nTotal is": " mance\nTotale è", + "Your fee is ": "Tua tariffa: ", + "Do you want to pay Tips for this Driver": "Vuoi dare la mancia?", + "Tip is ": "Mancia è: ", + "Are you want to wait drivers to accept your order": + "Vuoi attendere accettazione?", + "This price is fixed even if the route changes for the driver.": + "Prezzo fisso.", + "The price may increase if the route changes.": + "Il prezzo può aumentare.", + "The captain is responsible for the route.": + "L'autista è responsabile del percorso.", + "We are search for nearst driver": "Cerchiamo autista", + "Your order is being prepared": "Ordine in preparazione", + "The drivers are reviewing your request": "Autisti stanno valutando", + "Your order sent to drivers": "Inviato agli autisti", + "You can call or record audio of this trip": + "Puoi chiamare o registrare", + "The trip has started! Feel free to contact emergency numbers, share your trip, or activate voice recording for the journey": + "Viaggio iniziato! Condividi o registra.", + "Camera Access Denied.": "Accesso camera negato.", + "Open Settings": "Impostazioni", + "GPS Required Allow !.": "GPS richiesto!", + "Your Account is Deleted": "Account eliminato", + "Are you sure to delete your account?": "Sicuro di eliminare?", + "Your data will be erased after 2 weeks\nAnd you will can't return to use app after 1 month ": + "Dati cancellati tra 2 settimane.", + "Enter Your First Name": "Inserisci Nome", + "Are you Sure to LogOut?": "Sicuro di uscire?", + "Email Wrong": "Email errata", + "Email you inserted is Wrong.": "L'email è sbagliata.", + "You have finished all times ": "Tentativi finiti", + "if you want help you can email us here": "Scrivici per aiuto", + "Thanks": "Grazie", + "Email Us": "Scrivici", + "I cant register in your app in face detection ": + "Non riesco a registrarmi con face detection", + "Hi": "Ciao", + "No face detected": "Nessun volto rilevato", + "Image detecting result is ": "Risultato: ", + "from 3 times Take Attention": "su 3 volte, Attenzione", + "Be sure for take accurate images please\nYou have": + "Fai foto accurate\nHai", + "image verified": "immagine verificata", + "Next": "Avanti", + "There is no help Question here": "Nessuna domanda aiuto", + "You dont have Points": "Non hai Punti", + "You Are Stopped For this Day !": "Fermato per oggi!", + "You must be charge your Account": "Devi ricaricare", + "You Refused 3 Rides this Day that is the reason \nSee you Tomorrow!": + "Rifiutate 3 corse.\nA domani!", + "Recharge my Account": "Ricarica conto", + "Ok , See you Tomorrow": "Ok, a domani", + "You are Stopped": "Sei fermo", + "Connected": "Connesso", + "Not Connected": "Non connesso", + "Your are far from passenger location": "Sei lontano dal passeggero", + "go to your passenger location before\nPassenger cancel trip": + "Vai dal passeggero prima che annulli", + "You will get cost of your work for this trip": + "Sarai pagato per il lavoro", + " in your wallet": " nel portafoglio", + "you gain": "hai guadagnato", + "Order Cancelled by Passenger": "Annullato dal passeggero", + "Feedback data saved successfully": "Feedback salvato", + "No Promo for today .": "Nessuna promo oggi.", + "Select your destination": "Seleziona destinazione", + "Search for your Start point": "Punto di partenza", + "Search for waypoint": "Punto intermedio", + "Current Location": "Posizione attuale", + "Add Location 1": "Aggiungi Posizione 1", + "You must Verify email !.": "Verifica email!", + "Cropper": "Ritaglia", + "Saved Sucssefully": "Salvato con successo", + "Select Date": "Seleziona Data", + "Birth Date": "Data di nascita", + "Ok": "Ok", + "the 500 points equal 30 JOD": "500 punti equivalgono a 30 €", + "the 500 points equal 30 JOD for you \nSo go and gain your money": + "500 punti = 30 €\nGuadagna", + "token updated": "token aggiornato", + "Add Location 2": "Aggiungi Posizione 2", + "Add Location 3": "Aggiungi Posizione 3", + "Add Location 4": "Aggiungi Posizione 4", + "Waiting for your location": "In attesa posizione", + "Search for your destination": "Cerca destinazione", + "Hi! This is": "Ciao! Questo è", + " I am using": " Uso", + " to ride with": " per viaggiare con", + " as the driver.": " come autista.", + "is driving a ": "guida una ", + " with license plate ": " con targa ", + " I am currently located at ": " Sono a ", + "Please go to Car now ": "Vai all'auto ora ", + "You will receive a code in WhatsApp Messenger": + "Riceverai codice su WhatsApp", + "If you need assistance, contact us": "Se serve aiuto, contattaci", + "Promo Ended": "Promo Terminata", + "Enter the promo code and get": "Inserisci codice e ottieni", + "DISCOUNT": "SCONTO", + "No wallet record found": "Nessun record portafoglio", + "for": "per", + "Intaleq is the safest ride-sharing app that introduces many features for both captains and passengers. We offer the lowest commission rate of just 8%, ensuring you get the best value for your rides. Our app includes insurance for the best captains, regular maintenance of cars with top engineers, and on-road services to ensure a respectful and high-quality experience for all users.": + "Intaleq è l'app più sicura. Commissione bassa 8%. Assicurazione e manutenzione.", + "You can contact us during working hours from 12:00 - 19:00.": + "Contattaci 12:00 - 19:00.", + "Choose a contact option": "Scegli contatto", + "Work time is from 12:00 - 19:00.\nYou can send a WhatsApp message or email.": + "Orario 12:00 - 19:00.\nInvia WhatsApp o email.", + "Promo code copied to clipboard!": "Copiato!", + "Copy Code": "Copia codice", + "Your invite code was successfully applied!": "Codice applicato!", + "Payment Options": "Opzioni pagamento", + "wait 1 minute to receive message": "attendi 1 minuto", + "You have copied the promo code.": "Hai copiato il codice.", + "Select Payment Amount": "Seleziona importo", + "The promotion period has ended.": "Promozione finita.", + "Promo Code Accepted": "Codice accettato", + "Tap on the promo code to copy it!": "Tocca per copiare!", + "Lowest Price Achieved": "Prezzo più basso", + "Cannot apply further discounts.": "Niente più sconti.", + "Promo Already Used": "Già usato", + "Invitation Used": "Invito usato", + "You have already used this promo code.": "Codice già usato.", + "Insert Your Promo Code": "Inserisci codice", + "Enter promo code here": "Codice qui", + "Please enter a valid promo code": "Inserisci codice valido", + "Awfar Car": "Auto Economica", + "Old and affordable, perfect for budget rides.": + "Economica e accessibile.", + " If you need to reach me, please contact the driver directly at": + " Contatta l'autista al", + "No Car or Driver Found in your area.": + "Nessuna auto o autista in zona.", + "Please Try anther time ": "Riprova un'altra volta ", + "There no Driver Aplly your order sorry for that ": + "Nessuno ha accettato, spiacenti ", + "Trip Cancelled": "Corsa Annullata", + "The Driver Will be in your location soon .": + "L'autista arriverà presto.", + "The distance less than 500 meter.": "Distanza < 500m.", + "Promo End !": "Promo Finita!", + "There is no notification yet": "Nessuna notifica", + "Use Touch ID or Face ID to confirm payment": + "Usa Touch ID o Face ID", + "Contact us for any questions on your order.": + "Contattaci per domande.", + "Pyament Cancelled .": "Pagamento Annullato.", + "type here": "scrivi qui", + "Scan Driver License": "Scansiona Patente", + "Please put your licence in these border": + "Metti la patente nel bordo", + "Camera not initialized yet": "Camera non pronta", + "Take Image": "Scatta foto", + "AI Page": "Pagina AI", + "Take Picture Of ID Card": "Foto Carta d'Identità", + "Take Picture Of Driver License Card": "Foto Patente", + "We are process picture please wait ": "Elaborazione foto, attendi ", + "There is no data yet.": "Nessun dato.", + "Name :": "Nome :", + "Drivers License Class: ": "Classe Patente: ", + "Document Number: ": "Numero Documento: ", + "Address: ": "Indirizzo: ", + "Height: ": "Altezza: ", + "Expiry Date: ": "Scadenza: ", + "Date of Birth: ": "Data di Nascita: ", + "You can't continue with us .\nYou should renew Driver license": + "Devi rinnovare la patente", + "Detect Your Face ": "Rileva Volto ", + "Go to next step\nscan Car License.": "Avanti\nscansiona Libretto.", + "Name in arabic": "Nome (Locale)", + "Drivers License Class": "Classe Patente", + "Selected Date": "Data Selezionata", + "Select Time": "Seleziona Ora", + "Selected Time": "Ora Selezionata", + "Selected Date and Time": "Data e Ora", + "Lets check Car license ": "Controlliamo Libretto ", + "Car": "Auto", + "Plate": "Targa", + "Rides": "Corse", + "Selected driver": "Autista selezionato", + "Lets check License Back Face": "Controlliamo Retro", + "Car License Card": "Libretto Circolazione", + "No image selected yet": "Nessuna immagine", + "Made :": "Marca :", + "model :": "Modello :", + "VIN :": "Telaio :", + "year :": "Anno :", + "ُExpire Date": "Data Scadenza", + "Login Driver": "Accesso Autista", + "Password must br at least 6 character.": "Password min 6 caratteri.", + "if you don't have account": "se non hai un account", + "Here recorded trips audio": "Audio viaggi", + "Register as Driver": "Registrati come Autista", + "By selecting \"I Agree\" below, I have reviewed and agree to the Terms of Use and acknowledge the ": + "Selezionando \"Accetto\", accetto i Termini d'Uso e ", + "Log Out Page": "Pagina uscita", + "Log Off": "Esci", + "Register Driver": "Registra Autista", + "Verify Email For Driver": "Verifica Email Autista", + "Admin DashBoard": "Dashboard Admin", + "Your name": "Il tuo nome", + "your ride is applied": "corsa richiesta", + "H and": "O e", + "JOD": "€", + "m": "m", + "We search nearst Driver to you": "Cerchiamo autista vicino", + "please wait till driver accept your order": "attendi accettazione", + "No accepted orders? Try raising your trip fee to attract riders.": + "Aumenta la tariffa.", + "You should select one": "Selezionane uno", + "The driver accept your order for": "Accettato per", + "The driver on your way": "Autista in arrivo", + "Total price from ": "Prezzo totale da ", + "Order Details Intaleq": "Dettagli Ordine", + "Selected file:": "File selezionato:", + "Your trip cost is": "Costo viaggio", + "this will delete all files from your device": + "eliminerà tutti i file", + "Exclusive offers and discounts always with the Intaleq app": + "Offerte esclusive", + "Submit Question": "Invia domanda", + "Please enter your Question.": "Inserisci domanda.", + "Help Details": "Dettagli aiuto", + "No trip yet found": "Nessun viaggio", + "No Response yet.": "Nessuna risposta.", + " You Earn today is ": " Guadagno oggi: ", + " You Have in": " Hai in", + "Total points is ": "Punti totali: ", + "Total Connection Duration:": "Durata connessione:", + "Passenger name : ": "Passeggero: ", + "Cost Of Trip IS ": "Costo: ", + "Arrival time": "Ora arrivo", + "arrival time to reach your point": "ora arrivo al punto", + "For Intaleq and scooter trips, the price is calculated dynamically. For Comfort trips, the price is based on time and distance": + "Prezzo dinamico o tempo/distanza.", + "Hello this is Driver": "Ciao sono l'Autista", + "Is the Passenger in your Car ?": "Passeggero in auto?", + "Please wait for the passenger to enter the car before starting the trip.": + "Attendi passeggero.", + "No ,still Waiting.": "No, attendo.", + "I arrive you": "Arrivato", + "I Arrive your site": "Arrivato al sito", + "You are not in near to passenger location": "Sei lontano", + "please go to picker location exactly": "vai al punto esatto", + "You Can Cancel Trip And get Cost of Trip From": + "Annulla e ottieni costo da", + "Are you sure to cancel?": "Sicuro di annullare?", + "Insert Emergincy Number": "Inserisci Numero SOS", + "Best choice for comfort car and flexible route and stops point": + "Auto comfort e percorso flessibile", + "Insert": "Inserisci", + "This is for scooter or a motorcycle.": "Per scooter o moto.", + "This trip goes directly from your starting point to your destination for a fixed price. The driver must follow the planned route": + "Viaggio diretto, prezzo fisso.", + "You can decline a request without any cost": "Rifiuta senza costi", + "Perfect for adventure seekers who want to experience something new and exciting": + "Per chi cerca avventura", + "My current location is:": "Mia posizione:", + "and I have a trip on": "e ho un viaggio su", + "App with Passenger": "App con Passeggero", + "You will be pay the cost to driver or we will get it from you on next trip": + "Pagherai all'autista o al prossimo viaggio", + "Trip has Steps": "Viaggio a tappe", + "Distance from Passenger to destination is ": + "Distanza Passeggero da destinazione: ", + "price is": "prezzo è", + "This ride type does not allow changes to the destination or additional stops": + "Nessun cambio/fermata", + "This price may be changed": "Prezzo variabile", + "No SIM card, no problem! Call your driver directly through our app. We use advanced technology to ensure your privacy.": + "Niente SIM? Chiama tramite app.", + "This ride type allows changes, but the price may increase": + "Cambi permessi, prezzo può salire", + "Select one message": "Scegli messaggio", + "I'm waiting for you": "Ti aspetto", + "We noticed the Intaleq is exceeding 100 km/h. Please slow down for your safety. If you feel unsafe, you can share your trip details with a contact or call the police using the red SOS button.": + "Velocità > 100 km/h. Rallenta.", + "Warning: Intaleqing detected!": "Avviso: Eccesso velocità!", + "Please help! Contact me as soon as possible.": + "Aiuto! Contattami subito.", + "Share Trip Details": "Condividi Dettagli", + "Car Plate is ": "Targa: ", + "the 300 points equal 300 L.E for you \nSo go and gain your money": + "300 punti = 300 €\nGuadagna", + "the 300 points equal 300 L.E": "300 punti = 300 €", + "The payment was not approved. Please try again.": + "Pagamento non approvato. Riprova.", + "Payment Failed": "Pagamento Fallito", + "This is a scheduled notification.": "Notifica programmata.", + "An error occurred during the payment process.": "Errore pagamento.", + "The payment was approved.": "Approvato.", + "Payment Successful": "Pagamento Riuscito", + "No ride found yet": "Nessuna corsa trovata", + "Accept Order": "Accetta Ordine", + "Bottom Bar Example": "Esempio", + "Driver phone": "Telefono Autista", + "Statistics": "Statistiche", + "Origin": "Origine", + "Destination": "Destinazione", + "Driver Name": "Nome Autista", + "Driver Car Plate": "Targa Autista", + "Available for rides": "Disponibile", + "Scan Id": "Scansiona ID", + "Camera not initilaized yet": "Camera non pronta", + "Scan ID MklGoogle": "Scansiona ID", + "Language": "Lingua", + "Jordan": "Giordania", + "USA": "USA", + "Egypt": "Egitto", + "Turkey": "Turchia", + "Saudi Arabia": "Arabia Saudita", + "Qatar": "Qatar", + "Bahrain": "Bahrain", + "Kuwait": "Kuwait", + "But you have a negative salary of": "Saldo negativo:", + "Promo Code": "Codice Promo", + "Your trip distance is": "Distanza viaggio:", + "Enter promo code": "Inserisci codice", + "You have promo!": "Hai promo!", + "Cost Duration": "Costo Durata", + "Duration is": "Durata:", + "Leave": "Lascia", + "Join": "Unisci", + "Heading your way now. Please be ready.": + "Arrivo. Fatti trovare pronto.", + "Approaching your area. Should be there in 3 minutes.": + "Vicino. Lì in 3 minuti.", + "There's heavy traffic here. Can you suggest an alternate pickup point?": + "Traffico. Altro punto raccolta?", + "This ride is already taken by another driver.": "Corsa già presa.", + "You Should be select reason.": "Seleziona motivo.", + "Waiting for Driver ...": "Attesa Autista...", + "Latest Recent Trip": "Ultimo Viaggio", + "from your list": "dalla lista", + "Do you want to change Work location": "Cambiare Lavoro", + "Do you want to change Home location": "Cambiare Casa", + "We Are Sorry That we dont have cars in your Location!": + "Spiacenti, niente auto in zona!", + "Choose from Map": "Scegli da Mappa", + "Pick your ride location on the map - Tap to confirm": + "Scegli punto sulla mappa - Tocca per confermare", + "Intaleq is the ride-hailing app that is safe, reliable, and accessible.": + "Intaleq è sicura e affidabile.", + "With Intaleq, you can get a ride to your destination in minutes.": + "Corsa in minuti.", + "Intaleq is committed to safety, and all of our captains are carefully screened and background checked.": + "Impegno per la sicurezza, autisti verificati.", + "Pick from map": "Scegli da mappa", + "No Car in your site. Sorry!": "Nessuna auto. Spiacenti!", + "Nearest Car for you about ": "Auto più vicina tra circa ", + "From :": "Da:", + "Get Details of Trip": "Dettagli", + "If you want add stop click here": + "Per aggiungere fermata clicca qui", + "Where you want go ": "Dove vuoi andare ", + "My Card": "La mia carta", + "Start Record": "Avvia registrazione", + "History of Trip": "Cronologia", + "Helping Center": "Centro assistenza", + "Record saved": "Salvato", + "Trips recorded": "Viaggi registrati", + "Select Your Country": "Seleziona Paese", + "To ensure you receive the most accurate information for your location, please select your country below. This will help tailor the app experience and content to your country.": + "Seleziona il paese per informazioni accurate.", + "Are you sure to delete recorded files": "Eliminare file?", + "Select recorded trip": "Seleziona viaggio", + "Card Number": "Numero Carta", + "Hi, Where to ": "Ciao, dove ", + "Pick your destination from Map": "Destinazione da Mappa", + "Add Stops": "Aggiungi Fermate", + "Get Direction": "Indicazioni", + "Add Location": "Aggiungi Posizione", + "Switch Rider": "Cambia Passeggero", + "You will arrive to your destination after timer end.": + "Arrivo al termine del timer.", + "You can cancel trip": "Puoi annullare", + "The driver waitting you in picked location .": + "L'autista ti aspetta.", + "Pay with Your": "Paga con", + "Pay with Credit Card": "Paga con Carta", + "Show Promos to Charge": "Promo Ricarica", + "Point": "Punto", + "How many hours would you like to wait?": "Quante ore di attesa?", + "Driver Wallet": "Portafoglio Autista", + "Choose between those Type Cars": "Scegli tipo auto", + "hour": "ora", + "Select Waiting Hours": "Ore Attesa", + "Total Points is": "Punti Totali", + "You will receive a code in SMS message": "Riceverai SMS", + "Done": "Fatto", + "Total Budget from trips is ": "Budget totale viaggi: ", + "Total Amount:": "Importo Totale:", + "Total Budget from trips by\nCredit card is ": + "Budget totale Carte: ", + "This amount for all trip I get from Passengers": + "Importo dai Passeggeri", + "Pay from my budget": "Paga dal budget", + "This amount for all trip I get from Passengers and Collected For me in": + "Importo raccolto", + "You can buy points from your budget": "Compra punti dal budget", + "insert amount": "inserisci importo", + "You can buy Points to let you online\nby this list below": + "Compra Punti per andare online", + "Create Wallet to receive your money": "Crea Portafoglio", + "Enter your feedback here": "Inserisci feedback", + "Please enter your feedback.": "Inserisci feedback.", + "Feedback": "Feedback", + "Submit ": "Invia ", + "Click here to Show it in Map": "Mostra su Mappa", + "Canceled": "Annullato", + "No I want": "No voglio", + "Email is": "Email:", + "Phone Number is": "Telefono:", + "Date of Birth is": "Data Nascita:", + "Sex is ": "Sesso: ", + "Car Details": "Dettagli Auto", + "VIN is": "Telaio:", + "Color is ": "Colore: ", + "Make is ": "Marca: ", + "Model is": "Modello:", + "Year is": "Anno:", + "Expiration Date ": "Scadenza: ", + "Edit Your data": "Modifica dati", + "write vin for your car": "scrivi telaio", + "VIN": "Telaio", + "Please verify your identity": "Verifica identità", + "write Color for your car": "scrivi colore", + "write Make for your car": "scrivi marca", + "write Model for your car": "scrivi modello", + "write Year for your car": "scrivi anno", + "write Expiration Date for your car": "scrivi scadenza", + "Tariffs": "Tariffe", + "Minimum fare": "Tariffa minima", + "Maximum fare": "Tariffa massima", + "Flag-down fee": "Tariffa base", + "Including Tax": "IVA inclusa", + "BookingFee": "Costo Prenotazione", + "Morning": "Mattina", + "from 07:30 till 10:30 (Thursday, Friday, Saturday, Monday)": + "07:30 - 10:30", + "Evening": "Sera", + "from 12:00 till 15:00 (Thursday, Friday, Saturday, Monday)": + "12:00 - 15:00", + "Night": "Notte", + "You have in account": "Hai nel conto", + "Select Country": "Seleziona Paese", + "Ride Today : ": "Corsa Oggi: ", + 'Change Home location ?': 'تغيير موقع المنزل؟', + 'Change Work location ?': 'تغيير موقع العمل؟', + "After this period\nYou can't cancel!": + "Dopo questo\nNon puoi annullare!", + "from 23:59 till 05:30": "23:59 - 05:30", + "Rate Driver": "Vota Autista", + "Total Cost is ": "Costo Totale: ", + "Write note": "Scrivi nota", + "Time to arrive": "Ora arrivo", + "Ride Summaries": "Riepiloghi", + "Total Cost": "Costo Totale", + "Average of Hours of": "Media ore", + " is ON for this month": " è ON questo mese", + "Days": "Giorni", + "Total Hours on month": "Ore Totali mese", + "Counts of Hours on days": "Ore per giorni", + "OrderId": "ID Ordine", + "created time": "ora creazione", + "Intaleq Over": "Intaleq Finito", + "I will slow down": "Rallenterò", + "Map Passenger": "Mappa Passeggero", + "Be Slowly": "Vai piano", + "If you want to make Google Map App run directly when you apply order": + "Apri Google Maps direttamente", + "You can change the language of the app": "Cambia lingua app", + "Your Budget less than needed": "Budget insufficiente", + "You can change the Country to get all features": + "Cambia Paese per tutte le funzioni", + "There is no Car or Driver in your area.": + "Non ci sono auto o autisti nella tua zona.", + "Change Country": "Cambia Paese", + }, + "zh": { + "1 Passenger": "1 Passenger", + "2 Passengers": "2 Passengers", + "3 Passengers": "3 Passengers", + "4 Passengers": "4 Passengers", + "2. Attach Recorded Audio (Optional)": + "2. Attach Recorded Audio (Optional)", + "Account": "Account", + "Actions": "Actions", + "Active Users": "Active Users", + "Add a Stop": "Add a Stop", + "Add a new waypoint stop": "Add a new waypoint stop", + "After this period\nYou can\'t cancel!": + "After this period\nYou can\'t cancel!", + "Age is": "Age is", + "Alert": "Alert", + "An OTP has been sent to your number.": + "An OTP has been sent to your number.", + "An error occurred": "An error occurred", + "Appearance": "Appearance", + "Are you sure you want to delete this file?": + "Are you sure you want to delete this file?", + "Are you sure you want to logout?": + "Are you sure you want to logout?", + "Arrived": "Arrived", + "Audio Recording": "Audio Recording", + "Call": "Call", + "Call Support": "Call Support", + "Call left": "Call left", + "Change Photo": "Change Photo", + "Choose from Gallery": "Choose from Gallery", + "Choose from contact": "Choose from contact", + "Click to track the trip": "Click to track the trip", + "Close panel": "Close panel", + "Coming": "Coming", + "Complete Payment": "Complete Payment", + "Confirm Cancellation": "Confirm Cancellation", + "Confirm Pickup Location": "Confirm Pickup Location", + "Connection failed. Please try again.": + "Connection failed. Please try again.", + "Could not create ride. Please try again.": + "Could not create ride. Please try again.", + "Crop Photo": "Crop Photo", + "Dark Mode": "Dark Mode", + "Delete": "Delete", + "Delete Account": "Delete Account", + "Delete All": "Delete All", + "Delete All Recordings?": "Delete All Recordings?", + "Delete Recording?": "Delete Recording?", + "Destination Set": "Destination Set", + "Distance": "Distance", + "Double tap to open search or enter destination": + "Double tap to open search or enter destination", + "Double tap to set or change this waypoint on the map": + "Double tap to set or change this waypoint on the map", + "Drawing route on map...": "Drawing route on map...", + "Driver Phone": "Driver Phone", + "Driver is Going To You": "Driver is Going To You", + "Emergency Mode Triggered": "Emergency Mode Triggered", + "Emergency SOS": "Emergency SOS", + "Enter the 5-digit code": "Enter the 5-digit code", + "Enter your City": "Enter your City", + "Enter your Password": "Enter your Password", + "Failed to book trip: \$e": "Failed to book trip: \$e", + "Failed to get location": "Failed to get location", + "Failed to initiate payment. Please try again.": + "Failed to initiate payment. Please try again.", + "Failed to send OTP": "Failed to send OTP", + "Failed to upload photo": "Failed to upload photo", + "Finished": "Finished", + "Fixed Price": "Fixed Price", + "General": "General", + "Grant": "Grant", + "Have a Promo Code?": "Have a Promo Code?", + "Hello! I\'m inviting you to try Intaleq.": + "Hello! I\'m inviting you to try Intaleq.", + "Hi ,I Arrive your site": "Hi ,I Arrive your site", + "Hi, Where to": "Hi, Where to", + "Home": "Home", + "I am currently located at": "I am currently located at", + "I'm Safe": "I'm Safe", + "If you need to reach me, please contact the driver directly at": + "If you need to reach me, please contact the driver directly at", + "Image Upload Failed": "Image Upload Failed", + "Intaleq Passenger": "Intaleq Passenger", + "Invite": "Invite", + "Join a channel": "Join a channel", + "Last Name": "Last Name", + "Leave a detailed comment (Optional)": + "Leave a detailed comment (Optional)", + "Light Mode": "Light Mode", + "Listen": "Listen", + "Location": "Location", + "Location Received": "Location Received", + "Logout": "Logout", + "Map Error": "Map Error", + "Message": "Message", + "Move map to select destination": "Move map to select destination", + "Move map to set start location": "Move map to set start location", + "Move map to set stop": "Move map to set stop", + "Move map to your home location": "Move map to your home location", + "Move map to your pickup point": "Move map to your pickup point", + "Move map to your work location": "Move map to your work location", + "N/A": "N/A", + "No Notifications": "No Notifications", + "No Recordings Found": "No Recordings Found", + "No Rides now!": "No Rides now!", + "No contacts available": "No contacts available", + "No i want": "No i want", + "No notification data found.": "No notification data found.", + "No routes available for this destination.": + "No routes available for this destination.", + "No user found": "No user found", + "No,I want": "No,I want", + "No.Iwant Cancel Trip.": "No.Iwant Cancel Trip.", + "Now move the map to your pickup point": + "Now move the map to your pickup point", + "Now set the pickup point for the other person": + "Now set the pickup point for the other person", + "On Trip": "On Trip", + "Open": "Open", + "Open destination search": "Open destination search", + "Open in Google Maps": "Open in Google Maps", + "Order VIP Canceld": "Order VIP Canceld", + "Passenger": "Passenger", + "Passenger cancel order": "Passenger cancel order", + "Pay by MTN Wallet": "Pay by MTN Wallet", + "Pay by Sham Cash": "Pay by Sham Cash", + "Pay by Syriatel Wallet": "Pay by Syriatel Wallet", + "Pay with PayPal": "Pay with PayPal", + "Phone": "Phone", + "Phone Number": "Phone Number", + "Phone Number Check": "Phone Number Check", + "Phone number seems too short": "Phone number seems too short", + "Phone verified. Please complete registration.": + "Phone verified. Please complete registration.", + "Pick destination on map": "Pick destination on map", + "Pick location on map": "Pick location on map", + "Pick on map": "Pick on map", + "Pick start point on map": "Pick start point on map", + "Plan Your Route": "Plan Your Route", + "Please add contacts to your phone.": + "Please add contacts to your phone.", + "Please check your internet and try again.": + "Please check your internet and try again.", + "Please enter a valid email.": "Please enter a valid email.", + "Please enter a valid phone number.": + "Please enter a valid phone number.", + "Please enter the number without the leading 0": + "Please enter the number without the leading 0", + "Please enter your phone number": "Please enter your phone number", + "Please go to Car now": "Please go to Car now", + "Please select a reason first": "Please select a reason first", + "Please set a valid SOS phone number.": + "Please set a valid SOS phone number.", + "Please slow down": "Please slow down", + "Please wait while we prepare your trip.": + "Please wait while we prepare your trip.", + "Preferences": "Preferences", + "Profile photo updated": "Profile photo updated", + "Quick Message": "Quick Message", + "Rating is": "Rating is", + "Received empty route data.": "Received empty route data.", + "Record": "Record", + "Record your trips to see them here.": + "Record your trips to see them here.", + "Rejected Orders Count": "Rejected Orders Count", + "Remove waypoint": "Remove waypoint", + "Report": "Report", + "Route and prices have been calculated successfully!": + "Route and prices have been calculated successfully!", + "SOS": "SOS", + "Save": "Save", + "Save Changes": "Save Changes", + "Save Name": "Save Name", + "Search country": "Search country", + "Search for a starting point": "Search for a starting point", + "Select Appearance": "Select Appearance", + "Select Education": "Select Education", + "Select Gender": "Select Gender", + "Select This Ride": "Select This Ride", + "Select betweeen types": "Select betweeen types", + "Send Email": "Send Email", + "Send SOS": "Send SOS", + "Send WhatsApp Message": "Send WhatsApp Message", + "Server Error": "Server Error", + "Server error": "Server error", + "Server error. Please try again.": "Server error. Please try again.", + "Set Destination": "Set Destination", + "Set Phone Number": "Set Phone Number", + "Set as Home": "Set as Home", + "Set as Stop": "Set as Stop", + "Set as Work": "Set as Work", + "Share": "Share", + "Share Trip": "Share Trip", + "Share your experience to help us improve...": + "Share your experience to help us improve...", + "Something went wrong. Please try again.": + "Something went wrong. Please try again.", + "Speaking...": "Speaking...", + "Speed Over": "Speed Over", + "Start Point": "Start Point", + "Stay calm. We are here to help.": "Stay calm. We are here to help.", + "Stop": "Stop", + "Submit Rating": "Submit Rating", + "Support & Info": "Support & Info", + "System Default": "System Default", + "Take a Photo": "Take a Photo", + "Tap to apply your discount": "Tap to apply your discount", + "Tap to search your destination": "Tap to search your destination", + "The driver cancelled the trip.": "The driver cancelled the trip.", + "This action cannot be undone.": "This action cannot be undone.", + "This action is permanent and cannot be undone.": + "This action is permanent and cannot be undone.", + "This is for delivery or a motorcycle.": + "This is for delivery or a motorcycle.", + "Time": "Time", + "To :": "To :", + "Top up Balance": "Top up Balance", + "Top up Balance to continue": "Top up Balance to continue", + "Total Invites": "Total Invites", + "Total Price": "Total Price", + "Trip booked successfully": "Trip booked successfully", + "Type your message...": "Type your message...", + "Unknown Location": "Unknown Location", + "Update Name": "Update Name", + "Verified Passenger": "Verified Passenger", + "View Map": "View Map", + "Wait for the trip to start first": + "Wait for the trip to start first", + "Waiting...": "Waiting...", + "Warning": "Warning", + "Waypoint has been set successfully": + "Waypoint has been set successfully", + "We use location to get accurate and nearest driver for you": + "We use location to get accurate and nearest driver for you", + "WhatsApp": "WhatsApp", + "Why do you want to cancel?": "Why do you want to cancel?", + "Yes": "Yes", + "You should ideintify your gender for this type of trip!": + "You should ideintify your gender for this type of trip!", + "You will choose one of above!": "You will choose one of above!", + "Your Rewards": "Your Rewards", + "Your complaint has been submitted.": + "Your complaint has been submitted.", + "and acknowledge our Privacy Policy.": + "and acknowledge our Privacy Policy.", + "as the driver.": "as the driver.", + "cancelled": "cancelled", + "due to a previous trip.": "due to a previous trip.", + "insert sos phone": "insert sos phone", + "is driving a": "is driving a", + "min added to fare": "min added to fare", + "phone not verified": "phone not verified", + "to arrive you.": "to arrive you.", + "unknown": "unknown", + "wait 1 minute to recive message": "wait 1 minute to recive message", + "with license plate": "with license plate", + "witout zero": "witout zero", + "you must insert token code": "you must insert token code", + "Syria": "叙利亚", + "SYP": "叙利亚镑", + "Order": "طلب", + "OrderVIP": "طلب VIP", + "Cancel Trip": "إلغاء المشوار", + "Passenger Cancel Trip": "الراكب ألغى المشوار", + "VIP Order": "طلب VIP", + "The driver accepted your trip": "الكابتن قبل مشوارك", + "message From passenger": "رسالة من الراكب", + "Cancel": "إلغاء", + "Trip Cancelled. The cost of the trip will be added to your wallet.": + "تم إلغاء المشوار. المبلغ رجع لمحفظتك.", + "token change": "تغيير الرمز", + "Changed my mind": "我改变了主意", + "Please write the reason...": "请填写原因...", + "Found another transport": "找到了其他交通工具", + "Driver is taking too long": "司机来得太慢了", + "Driver asked me to cancel": "司机要求我取消订单", + "Wrong pickup location": "上车地点错误", + "Other": "غير ذلك", + "Don't Cancel": "不要取消", + "No Drivers Found": "未找到司机", + "Sorry, there are no cars available of this type right now.": + "抱歉,目前没有此类车型。", + "Refresh Map": "刷新地图", + "face detect": "التحقق من الوجه", + "Face Detection Result": "نتيجة التحقق", + "similar": "مطابق", + "not similar": "غير مطابق", + "Searching for nearby drivers...": "正在寻找附近的司机...", + "Error": "خطأ", + "Failed to search, please try again later": "搜索失败,请稍后重试", + "Connection Error": "连接错误", + "Please check your internet connection": "请检查您的网络连接", + "Sorry 😔": "抱歉 😔", + "The driver cancelled the trip for an emergency reason.\nDo you want to search for another driver immediately?": + "司机因紧急情况取消了行程。\n您想立即寻找其他司机吗?", + "Search for another driver": "寻找其他司机", + "We apologize 😔": "我们深表歉意 😔", + "No drivers found at the moment.\nPlease try again later.": + "目前未找到司机。\n请稍后重试。", + "Hi ,I will go now": "هلا، أنا بطلع الحين", + "Passenger come to you": "الراكب جايك", + "Call Income": "مكالمة واردة", + "Call Income from Passenger": "مكالمة من الراكب", + "Criminal Document Required": "صحيفة خلو السوابق مطلوبة", + "You should have upload it .": "لازم ترفعها طال عمرك.", + "Call End": "انتهاء المكالمة", + "The order has been accepted by another driver.": + "الطلب أخذه كابتن ثاني.", + "The order Accepted by another Driver": "الطلب راح لكابتن ثاني", + "We regret to inform you that another driver has accepted this order.": + "المعذرة، في كابتن ثاني سبقك وأخذ الطلب.", + "Driver Applied the Ride for You": "الكابتن قدم الطلب لك", + "Applied": "تم التقديم", + "Please go to Car Driver": "تفضل عند الكابتن", + "Ok I will go now.": "أبشر، رايح له الحين.", + "Accepted Ride": "المشوار مقبول", + "Driver Accepted the Ride for You": "الكابتن قبل المشوار عشانك", + "Promo": "كود خصم", + "Show latest promo": "عرض الخصومات", + "Trip Monitoring": "متابعة المشوار", + "Driver Is Going To Passenger": "الكابتن متوجه للراكب", + "Please stay on the picked point.": "خليك في الموقع المحدد لا هنت.", + "message From Driver": "رسالة من الكابتن", + "Trip is Begin": "بدأ المشوار", + "Cancel Trip from driver": "إلغاء من الكابتن", + "We will look for a new driver.\nPlease wait.": + "بنشوف لك كابتن ثاني.\nانتظر لاهنت.", + "The driver canceled your ride.": "الكابتن ألغى مشوارك.", + "Driver Finish Trip": "الكابتن خلص المشوار", + "you will pay to Driver": "الدفع للكابتن", + "Don’t forget your personal belongings.": "انتبه لأغراضك الشخصية.", + "Please make sure you have all your personal belongings and that any remaining fare, if applicable, has been added to your wallet before leaving. Thank you for choosing the Intaleq app": + "تأكد إن أغراضك معك وإن الباقي رجع للمحفظة قبل تنزل. شكراً لاستخدامك انطلق.", + "Finish Monitor": "إنهاء المتابعة", + "Trip finished": "انتهت الرحلة", + "Call Income from Driver": "اتصال من الكابتن", + "Driver Cancelled Your Trip": "الكابتن كنسل الرحلة", + "you will pay to Driver you will be pay the cost of driver time look to your Intaleq Wallet": + "بتدفع حق وقت الكابتن، شوف محفظتك في انطلق", + "Order Applied": "تم الطلب", + "welcome to intaleq": "حياك في انطلق", + "login or register subtitle": "دخل رقم جوالك للدخول أو التسجيل", + "Complaint cannot be filed for this ride. It may not have been completed or started.": + "ما تقدر ترفع شكوى على هالمشوار. يمكن ما كمل أو ما بدأ.", + "phone number label": "رقم الجوال", + "phone number required": "مطلوب رقم الجوال", + "send otp button": "أرسل كود التحقق", + "verify your number title": "تحقق من رقمك", + "otp sent subtitle": "أرسلنا كود من 5 أرقام على\n@phoneNumber", + "verify and continue button": "تحقق وكمال", + "enter otp validation": "دخل الكود (5 أرقام)", + "one last step title": "خطوة أخيرة", + "complete profile subtitle": "كمل بياناتك عشان تبدأ", + "first name label": "الاسم الأول", + "first name required": "الاسم الأول مطلوب", + "last name label": "اسم العائلة", + "Verify OTP": "تأكيد الرمز", + "Verification Code": "رمز التحقق", + "We have sent a verification code to your mobile number:": + "طرشنا لك رمز التحقق على جوالك:", + "Verify": "تأكيد", + "Resend Code": "إعادة إرسال", + "You can resend in": "تقدر تعيد الإرسال بعد", + "seconds": "ثانية", + "Please enter the complete 6-digit code.": + "دخل الرمز كامل (6 أرقام).", + "last name required": "اسم العائلة مطلوب", + "email optional label": "الإيميل (اختياري)", + "complete registration button": "إتمام التسجيل", + "User with this phone number or email already exists.": + "هالرقم أو الإيميل مسجل من قبل.", + "otp sent success": "تم إرسال الرمز للواتساب.", + "failed to send otp": "فشل إرسال الرمز.", + "server error try again": "خطأ في السيرفر، حاول مرة ثانية.", + "an error occurred": "صار خطأ غير متوقع: @error", + "otp verification failed": "رمز التحقق غلط.", + "registration failed": "فشل التسجيل.", + "welcome user": "يا هلا، @firstName!", + "Don't forget your personal belongings.": "لا تنسى أغراضك.", + "Share App": "شارك التطبيق", + "Wallet": "المحفظة", + "Balance": "الرصيد", + "Profile": "الملف الشخصي", + "Contact Support": "تواصل مع الدعم", + "Session expired. Please log in again.": + "الجلسة انتهت. سجل دخولك مرة ثانية.", + "Security Warning": "⚠️ تنبيه أمني", + "Potential security risks detected. The application may not function correctly.": + "اكتشفنا مخاطر أمنية. يمكن التطبيق ما يشتغل صح.", + "please order now": "اطلب الحين", + "Where to": "وين الوجهة؟", + "Where are you going?": "وين رايح؟", + "Quick Actions": "إجراءات سريعة", + "My Balance": "رصيدي", + "Order History": "سجل الطلبات", + "Contact Us": "اتصل بنا", + "Driver": "كابتن", + "Complaint": "شكوى", + "Promos": "العروض", + "Recent Places": "الأماكن الأخيرة", + "From": "من", + "WhatsApp Location Extractor": "جلب الموقع من واتساب", + "Location Link": "رابط الموقع", + "Paste location link here": "الصق الرابط هنا", + "Go to this location": "رح لهالموقع", + "Paste WhatsApp location link": "حط رابط موقع الواتساب", + "Select Order Type": "اختر نوع الطلب", + "Choose who this order is for": "الطلب لمين؟", + "I want to order for myself": "بطلب لنفسي", + "I want to order for someone else": "بطلب لشخص ثاني", + "Order for someone else": "اطلب لغيرك", + "Order for myself": "اطلب لنفسي", + "Are you want to go this site": "تبي تروح هالمكان؟", + "No": "لا", + "Intaleq Wallet": "محفظة انطلق", + "Have a promo code?": "عندك كود خصم؟", + "Your Wallet balance is ": "رصيدك بالمحفظة: ", + "Cash": "كاش", + "Pay directly to the captain": "ادفع للكابتن كاش", + "Top up Wallet to continue": "اشحن المحفظة عشان تكمل", + "Or pay with Cash instead": "أو ادفع كاش", + "Confirm & Find a Ride": "أكد ودور كابتن", + "Balance:": "الرصيد:", + "Alerts": "تنبيهات", + "Welcome Back!": "هلا بك من جديد!", + "Current Balance": "الرصيد الحالي", + "Set Wallet Phone Number": "حط رقم للمحفظة", + "Link a phone number for transfers": "اربط رقم للتحويلات", + "Payment History": "سجل المدفوعات", + "View your past transactions": "شوف عملياتك السابقة", + "Top up Wallet": "شحن المحفظة", + "Add funds using our secure methods": "ضيف رصيد بطرق آمنة", + "Increase Fare": "زيد السعر", + "No drivers accepted your request yet": "ماحد قبل طلبك لسه", + "Increasing the fare might attract more drivers. Would you like to increase the price?": + "لو زودت السعر ممكن يجيك كابتن أسرع. تبي تزيد السعر؟", + "Please make sure not to leave any personal belongings in the car.": + "تأكد إنك ما نسيت شي في السيارة.", + "Cancel Ride": "إلغاء المشوار", + "Route Not Found": "الطريق غير معروف", + "We couldn't find a valid route to this destination. Please try selecting a different point.": + "ما لقينا طريق للوجهة هذي. جرب تختار نقطة ثانية.", + "You can call or record audio during this trip.": + "تقدر تتصل أو تسجل صوت خلال المشوار.", + "Warning: Speeding detected!": "تنبيه: سرعة عالية!", + "Comfort": "مريح", + "Intaleq Balance": "رصيد انطلق", + "Electric": "كهربائية", + "Lady": "نواعم", + "Van": "عائلية (فان)", + "Rayeh Gai": "رايح جاي", + "Join Intaleq as a driver using my referral code!": + "سجل كابتن في انطلق بكود الدعوة حقي!", + "Use code:": "استخدم الكود:", + "Download the Intaleq Driver app now and earn rewards!": + "حمل تطبيق كابتن انطلق واكسب مكافآت!", + "Get a discount on your first Intaleq ride!": + "لك خصم على أول مشوار في انطلق!", + "Use my referral code:": "استخدم كود الدعوة:", + "Download the Intaleq app now and enjoy your ride!": + "حمل تطبيق انطلق واستمتع بمشوارك!", + "Contacts Loaded": "تم تحميل الأسماء", + "Showing": "عرض", + "of": "من", + "Customer not found": "العميل غير موجود", + "Wallet is blocked": "المحفظة موقوفة", + "Customer phone is not active": "جوال العميل مو شغال", + "Balance not enough": "الرصيد ما يكفي", + "Balance limit exceeded": "تجاوزت حد الرصيد", + "Incorrect sms code": "⚠️ رمز التحقق غلط. حاول مرة ثانية.", + "contacts. Others were hidden because they don't have a phone number.": + "جهة اتصال. الباقي مخفي عشان ما عندهم أرقام.", + "No contacts found": "ما لقينا جهات اتصال", + "No contacts with phone numbers were found on your device.": + "ما في أرقام بجهازك.", + "Permission denied": "ما في صلاحية", + "Contact permission is required to pick contacts": + "نحتاج صلاحية الأسماء.", + "An error occurred while picking contacts:": + "صار خطأ وحنا نختار الأسماء:", + "Please enter a correct phone": "دخل رقم جوال صح", + "Success": "تم", + "Invite sent successfully": "أرسلنا الدعوة", + "Hello! I'm inviting you to try Intaleq.": + "هلا! أدعوك تجرب تطبيق انطلق.", + "Use my invitation code to get a special gift on your first ride!": + "استخدم كودي عشان يجيك هدية بأول مشوار!", + "Your personal invitation code is:": "كود الدعوة حقك:", + "Be sure to use it quickly! This code expires at": + "استعجل عليه! الكود ينتهي في", + "Download the app now:": "حمل التطبيق:", + "See you on the road!": "نشوفك بالدرب!", + "This phone number has already been invited.": + "هالرقم قد أرسلنا له دعوة.", + "An unexpected error occurred. Please try again.": + "صار خطأ غير متوقع. حاول مرة ثانية.", + "You deserve the gift": "تستاهل الهدية", + "Claim your 20 LE gift for inviting": "اطلب هديتك (20 ريال) للدعوة", + "You have got a gift for invitation": "جتك هدية عشان الدعوة", + "You have earned 20": "كسبت 20", + "LE": "ر.س", + "Vibration feedback for all buttons": "اهتزاز لكل الأزرار", + "Share with friends and earn rewards": "شارك مع ربعك واكسب", + "Gift Already Claimed": "أخذت الهدية من قبل", + "You have already received your gift for inviting": + "قد استلمت هديتك على هالدعوة", + "Keep it up!": "كفو عليك!", + "has completed": "كمل", + "trips": "مشاوير", + "Personal Information": "المعلومات الشخصية", + "Name": "الاسم", + "Not set": "مو محدد", + "Gender": "الجنس", + "Education": "التعليم", + "Work & Contact": "العمل والتواصل", + "Employment Type": "نوع الوظيفة", + "Marital Status": "الحالة الاجتماعية", + "SOS Phone": "رقم الطوارئ", + "Sign Out": "تسجيل خروج", + "Delete My Account": "حذف حسابي", + "Update Gender": "تحديث الجنس", + "Update": "تحديث", + "Update Education": "تحديث التعليم", + "Are you sure? This action cannot be undone.": + "متأكد؟ ما تقدر تتراجع بعدين.", + "Confirm your Email": "أكد إيميلك", + "Type your Email": "اكتب إيميلك", + "Delete Permanently": "حذف نهائي", + "Male": "رجل", + "Female": "أنثى", + "High School Diploma": "ثانوي", + "Associate Degree": "دبلوم", + "Bachelor's Degree": "بكالوريوس", + "Master's Degree": "ماجستير", + "Doctoral Degree": "دكتوراه", + "Select your preferred language for the app interface.": + "اختر لغة التطبيق.", + "Language Options": "خيارات اللغة", + "You can claim your gift once they complete 2 trips.": + "تقدر تأخذ الهدية إذا كملوا مشوارين.", + "Closest & Cheapest": "الأقرب والأرخص", + "Comfort choice": "خيار الراحة", + "Travel in a modern, silent electric car. A premium, eco-friendly choice for a smooth ride.": + "تنقل بسيارة كهربائية حديثة وهادية. خيار فخم وصديق للبيئة.", + "Spacious van service ideal for families and groups. Comfortable, safe, and cost-effective travel together.": + "خدمة فان واسعة للعوايل والمجموعات. راحة وأمان وتوفير.", + "Quiet & Eco-Friendly": "هادية وصديقة للبيئة", + "Lady Captain for girls": "كابتن سيدة للبنات", + "Van for familly": "فان للعائلة", + "Are you sure to delete this location?": "متأكد تبي تحذف هالموقع؟", + "Submit a Complaint": "رفع شكوى", + "Submit Complaint": "إرسال الشكوى", + "No trip history found": "ما فيه سجل مشاوير", + "Your past trips will appear here.": "مشاويرك السابقة بتطلع هنا.", + "1. Describe Your Issue": "١. وش المشكلة؟", + "Enter your complaint here...": "اكتب شكواك هنا...", + "2. Attach Recorded Audio": "٢. أرفق تسجيل صوتي", + "No audio files found.": "ما لقينا ملفات صوتية.", + "Confirm Attachment": "تأكيد الإرفاق", + "Attach this audio file?": "ترفق هالملف الصوتي؟", + "Uploaded": "تم الرفع", + "3. Review Details & Response": "٣. مراجعة التفاصيل والرد", + "Date": "التاريخ", + "Today's Promos": "عروض اليوم", + "No promos available right now.": "ما فيه عروض حالياً.", + "Check back later for new offers!": "شيك بعدين يمكن فيه عروض!", + "Valid Until:": "صالح لين:", + "CODE": "验证码", + "I Agree": "أوافق", + "Continue": "متابعة", + "Enable Location": "تفعيل الموقع", + "To give you the best experience, we need to know where you are. Your location is used to find nearby captains and for pickups.": + "عشان نخدمك صح، نبي نعرف موقعك. بنستخدمه عشان نلقى لك كباتن قريبين.", + "Allow Location Access": "السماح بالوصول للموقع", + "Welcome to Intaleq!": "حياك الله في انطلق!", + "Before we start, please review our terms.": + "قبل نبدأ، راجع شروطنا لاهنت.", + "Your journey starts here": "مشوارك يبدأ هنا", + "Cancel Search": "إلغاء البحث", + "Set pickup location": "حدد موقع الانطلاق", + "Move the map to adjust the pin": "حرك الخريطة عشان تظبط الموقع", + "Searching for the nearest captain...": "جاري البحث عن أقرب كابتن...", + "No one accepted? Try increasing the fare.": + "ماحد قبل؟ جرب تزيد السعر.", + "Increase Your Trip Fee (Optional)": "زيد سعر المشوار (اختياري)", + "We haven't found any drivers yet. Consider increasing your trip fee to make your offer more attractive to drivers.": + "ما لقينا كباتن للحين. فكر تزيد السعر عشان يوافقون أسرع.", + "No, thanks": "لا، شكراً", + "Increase Fee": "زيد السعر", + "Copy": "نسخ", + "Promo Copied!": "تم نسخ الكود!", + "Code": "代码", + "Send Intaleq app to him": "أرسل له تطبيق انطلق", + "No passenger found for the given phone number": + "ما لقينا راكب بهالرقم", + "No user found for the given phone number": "ما لقينا مستخدم بهالرقم", + "This price is": "هالسعر هو", + "Work": "الدوام", + "Add Home": "إضافة البيت", + "Notifications": "الإشعارات", + "💳 Pay with Credit Card": "💳 ادفع بالبطاقة", + "⚠️ You need to choose an amount!": "⚠️ لازم تختار مبلغ!", + "💰 Pay with Wallet": "💰 ادفع بالمحفظة", + "You must restart the app to change the language.": + "لازم تعيد تشغيل التطبيق لتغيير اللغة.", + "joined": "انضم", + "Driver joined the channel": "الكابتن دخل الشات", + "Driver left the channel": "الكابتن طلع من الشات", + "Call Page": "صفحة الاتصال", + "Call Left": "مكالمات باقية", + " Next as Cash !": " التالي كاش!", + "To use Wallet charge it": "عشان تستخدم المحفظة اشحنها", + "We are searching for the nearest driver to you": + "ندور لك أقرب كابتن", + "Best choice for cities": "أفضل خيار للمدن", + "Rayeh Gai: Round trip service for convenient travel between cities, easy and reliable.": + "رايح جاي: خدمة مريحة للسفر بين المدن.", + "This trip is for women only": "المشوار للنساء فقط", + "Total budgets on month": "ميزانية الشهر", + "You have call from driver": "عندك اتصال من الكابتن", + "Intaleq": "انطلق", + "passenger agreement": "اتفاقية الراكب", + "To become a passenger, you must review and agree to the ": + "عشان تصير راكب، لازم توافق على ", + "agreement subtitle": "للمتابعة، وافق على الشروط والخصوصية.", + "terms of use": "شروط الاستخدام", + " and acknowledge our Privacy Policy.": " وتقر بسياسة الخصوصية.", + "and acknowledge our": "وتقر بـ", + "privacy policy": "سياسة الخصوصية.", + "i agree": "موافق", + "Driver already has 2 trips within the specified period.": + "الكابتن عنده مشوارين بهالوقت.", + "The invitation was sent successfully": "أرسلنا الدعوة", + "You should select your country": "اختر دولتك", + "Scooter": "سكوتر", + "A trip with a prior reservation, allowing you to choose the best captains and cars.": + "مشوار بحجز مسبق، يمديك تختار أفضل الكباتن والسيارات.", + "Mishwar Vip": "مشوار VIP", + "The driver waiting you in picked location .": + "الكابتن ينتظرك في الموقع.", + "About Us": "من نحن", + "You can change the vibration feedback for all buttons": + "تقدر تغير اهتزاز الأزرار", + "Most Secure Methods": "طرق آمنة", + "In-App VOIP Calls": "مكالمات صوتية بالتطبيق", + "Recorded Trips for Safety": "مشاوير مسجلة للأمان", + "\nWe also prioritize affordability, offering competitive pricing to make your rides accessible.": + "\nونهتم بالأسعار تكون مناسبة.", + "Intaleq is a ride-sharing app designed with your safety and affordability in mind. We connect you with reliable drivers in your area, ensuring a convenient and stress-free travel experience.\n\nHere are some of the key features that set us apart:": + "انطلق تطبيق مشاوير مصمم لأمانك وميزانيتك. نوصلك بكباتن ثقة.", + "Sign In by Apple": "دخول بـ Apple", + "Sign In by Google": "دخول بـ Google", + "How do I request a ride?": "كيف أطلب مشوار؟", + "Step-by-step instructions on how to request a ride through the Intaleq app.": + "خطوات طلب مشوار بتطبيق انطلق.", + "What types of vehicles are available?": "وش أنواع السيارات؟", + "Intaleq offers a variety of vehicle options to suit your needs, including economy, comfort, and luxury. Choose the option that best fits your budget and passenger count.": + "نوفر خيارات كثيرة مثل الاقتصادية والمريحة والفخمة.", + "How can I pay for my ride?": "كيف أدفع؟", + "Intaleq offers multiple payment methods for your convenience. Choose between cash payment or credit/debit card payment during ride confirmation.": + "تقدر تدفع كاش أو بالبطاقة.", + "Can I cancel my ride?": "أقدر ألغي المشوار؟", + "Yes, you can cancel your ride under certain conditions (e.g., before driver is assigned). See the Intaleq cancellation policy for details.": + "是的,您可以在特定条件下(例如分配司机前)取消行程。详情请参阅 Intaleq 取消政策。", + "Driver Registration & Requirements": "تسجيل الكباتن", + "How can I register as a driver?": "كيف أسجل كابتن؟", + "What are the requirements to become a driver?": "وش الشروط؟", + "Visit our website or contact Intaleq support for information on driver registration and requirements.": + "زور موقعنا أو كلم الدعم.", + "Intaleq provides in-app chat functionality to allow you to communicate with your driver or passenger during your ride.": + "عندنا شات داخل التطبيق.", + "Intaleq prioritizes your safety. We offer features like driver verification, in-app trip tracking, and emergency contact options.": + "سلامتك تهمنا. نتحقق من الكباتن وعندنا تتبع للمشوار.", + "Frequently Questions": "الأسئلة الشائعة", + "User does not exist.": "المستخدم مو موجود.", + "We need your phone number to contact you and to help you.": + "نحتاج رقمك للتواصل.", + "You will recieve code in sms message": "بيجيك كود في رسالة", + "Please enter": "الرجاء إدخال", + "We need your phone number to contact you and to help you receive orders.": + "نحتاج رقمك عشان تستقبل طلبات.", + "The full name on your criminal record does not match the one on your driver's license. Please verify and provide the correct documents.": + "الاسم في خلو السوابق ما يطابق الرخصة.", + "The national number on your driver's license does not match the one on your ID document. Please verify and provide the correct documents.": + "رقم الهوية في الرخصة ما يطابق الهوية.", + "Capture an Image of Your Criminal Record": "صور صحيفة خلو السوابق", + "IssueDate": "تاريخ الإصدار", + "Capture an Image of Your car license front": + "صور استمارة السيارة (وجه)", + "Capture an Image of Your ID Document front": "صور الهوية (وجه)", + "NationalID": "رقم الهوية/الإقامة", + "You can share the Intaleq App with your friends and earn rewards for rides they take using your code": + "شارك التطبيق مع ربعك واكسب مكافآت.", + "FullName": "الاسم الكامل", + "No invitation found yet!": "ما فيه دعوات!", + "InspectionResult": "نتيجة الفحص", + "Criminal Record": "خلو السوابق", + "The email or phone number is already registered.": + "الإيميل أو الرقم مسجل.", + "To become a ride-sharing driver on the Intaleq app, you need to upload your driver's license, ID document, and car registration document. Our AI system will instantly review and verify their authenticity in just 2-3 minutes. If your documents are approved, you can start working as a driver on the Intaleq app. Please note, submitting fraudulent documents is a serious offense and may result in immediate termination and legal consequences.": + "عشان تصير كابتن، ارفع رخصتك والهوية والاستمارة. النظام بيراجعها بسرعة.", + "Documents check": "فحص المستندات", + "Driver's License": "رخصة القيادة", + "for your first registration!": "لتسجيلك الأول!", + "Get it Now!": "خذها الحين!", + "before": "قبل", + "Code not approved": "الكود مرفوض", + "3000 LE": "3000 ر.س", + "Do you have an invitation code from another driver?": + "عندك كود دعوة من كابتن ثاني؟", + "Paste the code here": "الصق الكود", + "No, I don't have a code": "لا، ما عندي", + "Audio uploaded successfully.": "تم رفع الصوت.", + "Perfect for passengers seeking the latest car models with the freedom to choose any route they desire": + "مثالي للي يبون سيارات جديدة وحرية اختيار الطريق", + "Share this code with your friends and earn rewards when they use it!": + "شارك الكود واكسب!", + "Enter phone": "دخل الرقم", + "complete, you can claim your gift": "اكتمل، اطلب هديتك", + "When": "متى", + "Enter driver's phone": "رقم الكابتن", + "Send Invite": "إرسال دعوة", + "Show Invitations": "عرض الدعوات", + "License Type": "نوع الرخصة", + "National Number": "رقم الهوية", + "Name (Arabic)": "الاسم (عربي)", + "Name (English)": "الاسم (إنجليزي)", + "Address": "العنوان", + "Issue Date": "تاريخ الإصدار", + "Expiry Date": "تاريخ الانتهاء", + "License Categories": "فئات الرخصة", + "driver_license": "رخصة_قيادة", + "Capture an Image of Your Driver License": "صور رخصتك", + "ID Documents Back": "ظهر الهوية", + "National ID": "رقم الهوية", + "Occupation": "المهنة", + "Religion": "الديانة", + "Full Name (Marital)": "الاسم الكامل", + "Expiration Date": "تاريخ الانتهاء", + "Capture an Image of Your ID Document Back": "صور ظهر الهوية", + "ID Documents Front": "وجه الهوية", + "First Name": "الاسم الأول", + "CardID": "رقم البطاقة", + "Vehicle Details Front": "تفاصيل المركبة (أمام)", + "Plate Number": "رقم اللوحة", + "Owner Name": "اسم المالك", + "Vehicle Details Back": "تفاصيل المركبة (خلف)", + "Make": "الشركة المصنعة", + "Model": "الموديل", + "Year": "السنة", + "Chassis": "رقم الشاصي", + "Color": "اللون", + "Displacement": "سعة المحرك", + "Fuel": "الوقود", + "Tax Expiry Date": "تاريخ انتهاء الضريبة", + "Inspection Date": "تاريخ الفحص الدوري", + "Capture an Image of Your car license back": + "صور استمارة السيارة (قفا)", + "Capture an Image of Your Driver's License": "صور رخصتك", + "Sign in with Google for easier email and name entry": + "ادخل بقوقل أسهل", + "You will choose allow all the time to be ready receive orders": + "اختر 'السماح طوال الوقت' لاستقبال الطلبات", + "Get to your destination quickly and easily.": + "وصل وجهتك بسرعة وسهولة.", + "Enjoy a safe and comfortable ride.": "استمتع بمشوار آمن ومريح.", + "Choose Language": "اختر اللغة", + "Pay with Wallet": "ادفع بالمحفظة", + "Invalid MPIN": "رمز خطأ", + "Invalid OTP": "كود غلط", + "Enter your email address": "دخل إيميلك", + "Please enter Your Email.": "دخل الإيميل لاهنت.", + "Enter your phone number": "دخل رقمك", + "Please enter your phone number.": "دخل رقم الجوال.", + "Please enter Your Password.": "دخل كلمة المرور.", + "if you dont have account": "إذا ما عندك حساب", + "Register": "تسجيل", + "Accept Ride's Terms & Review Privacy Notice": "الموافقة على الشروط", + "By selecting 'I Agree' below, I have reviewed and agree to the Terms of Use and acknowledge the Privacy Notice. I am at least 18 years of age.": + "باختيار 'أوافق'، أقر بأني قريت الشروط وعمري 18 وفوق.", + "First name": "الاسم الأول", + "Enter your first name": "دخل اسمك", + "Please enter your first name.": "دخل الاسم الأول.", + "Last name": "اسم العائلة", + "Enter your last name": "دخل اسم العائلة", + "Please enter your last name.": "دخل اسم العائلة.", + "City": "المدينة", + "Please enter your City.": "دخل مدينتك.", + "Verify Email": "تأكيد الإيميل", + "We sent 5 digit to your Email provided": "أرسلنا 5 أرقام لإيميلك", + "5 digit": "5 أرقام", + "Send Verification Code": "أرسل كود التحقق", + "Your Ride Duration is ": "مدة المشوار: ", + "You will be thier in": "بتوصل خلال", + "You trip distance is": "مسافة المشوار:", + "Fee is": "السعر:", + "From : ": "من: ", + "To : ": "إلى: ", + "Add Promo": "ضيف خصم", + "Confirm Selection": "تأكيد الاختيار", + "distance is": "المسافة هي", + "Privacy Policy": "سياسة الخصوصية", + "Intaleq LLC": "شركة انطلق", + "Syria's pioneering ride-sharing service, proudly developed by Arabian and local owners. We prioritize being near you – both our valued passengers and our dedicated captains.": + "خدمة مشاركة مشاوير رائدة في الخليج.", + "Intaleq is the first ride-sharing app in Syria, designed to connect you with the nearest drivers for a quick and convenient travel experience.": + "انطلق يوصلك بأقرب الكباتن.", + "Why Choose Intaleq?": "ليش انطلق؟", + "Closest to You": "الأقرب لك", + "We connect you with the nearest drivers for faster pickups and quicker journeys.": + "نوصلك بأقرب كباتن عشان ما تتأخر.", + "Uncompromising Security": "أمان تام", + "Lady Captains Available": "كباتن سيدات", + "Recorded Trips (Voice & AI Analysis)": "مشاوير مسجلة", + "Fastest Complaint Response": "استجابة سريعة للشكاوى", + "Our dedicated customer service team ensures swift resolution of any issues.": + "فريقنا يحل مشاكلك بسرعة.", + "Affordable for Everyone": "أسعار تناسب الكل", + "Frequently Asked Questions": "الأسئلة المتكررة", + "Getting Started": "البداية", + "Simply open the Intaleq app, enter your destination, and tap \"Request Ride\". The app will connect you with a nearby driver.": + "افتح التطبيق، حدد وجهتك، واطلب المشوار.", + "Vehicle Options": "خيارات السيارات", + "Intaleq offers a variety of options including Economy, Comfort, and Luxury to suit your needs and budget.": + "نوفر خيارات تناسبك.", + "Payments": "الدفع", + "You can pay for your ride using cash or credit/debit card. You can select your preferred payment method before confirming your ride.": + "ادفع كاش أو بطاقة.", + "Ride Management": "إدارة المشاوير", + "Yes, you can cancel your ride, but please note that cancellation fees may apply depending on how far in advance you cancel.": + "تقدر تلغي، بس يمكن فيه رسوم.", + "For Drivers": "للكباتن", + "Driver Registration": "تسجيل الكابتن", + "To register as a driver or learn about the requirements, please visit our website or contact Intaleq support directly.": + "للتسجيل زر موقعنا.", + "Visit Website/Contact Support": "الموقع / الدعم", + "Close": "إغلاق", + "We are searching for the nearest driver": "ندور أقرب كابتن", + "Communication": "التواصل", + "How do I communicate with the other party (passenger/driver)?": + "كيف أتواصل؟", + "You can communicate with your driver or passenger through the in-app chat feature once a ride is confirmed.": + "عن طريق الشات في التطبيق.", + "Safety & Security": "الأمان", + "What safety measures does Intaleq offer?": "وش إجراءات الأمان؟", + "Intaleq offers various safety features including driver verification, in-app trip tracking, emergency contact options, and the ability to share your trip status with trusted contacts.": + "تحقق من الكابتن وتتبع المشوار.", + "Enjoy competitive prices across all trip options, making travel accessible.": + "أسعار منافسة.", + "Variety of Trip Choices": "خيارات متنوعة", + "Choose the trip option that perfectly suits your needs and preferences.": + "اختر اللي يناسبك.", + "Your Choice, Our Priority": "اختيارك يهمنا", + "Because we are near, you have the flexibility to choose the ride that works best for you.": + "لك الحرية في الاختيار.", + "duration is": "المدة:", + "Setting": "إعدادات", + "Find answers to common questions": "إجابات الأسئلة", + "I don't need a ride anymore": "ما عاد أحتاج مشوار", + "I was just trying the application": "أجرب التطبيق بس", + "No driver accepted my request": "ماحد قبل طلبي", + "I added the wrong pick-up/drop-off location": "الموقع غلط", + "I don't have a reason": "ما عندي سبب", + "Can we know why you want to cancel Ride ?": "ليش تبي تلغي؟", + "Add Payment Method": "إضافة طريقة دفع", + "Ride Wallet": "محفظة المشوار", + "Payment Method": "طريقة الدفع", + "Type here Place": "اكتب المكان", + "Are You sure to ride to": "متأكد تبي تروح لـ", + "Confirm": "تأكيد", + "You are Delete": "أنت بتحذف", + "Deleted": "انحذف", + "You Dont Have Any places yet !": "ما عندك أماكن!", + "From : Current Location": "من: موقعك الحالي", + "My Cared": "بطاقاتي", + "Add Card": "إضافة بطاقة", + "Add Credit Card": "إضافة بطاقة ائتمان", + "Please enter the cardholder name": "اسم صاحب البطاقة", + "Please enter the expiry date": "تاريخ الانتهاء", + "Please enter the CVV code": "كود CVV", + "Go To Favorite Places": "للأماكن المفضلة", + "Go to this Target": "روح للهدف", + "My Profile": "ملفي", + "Are you want to go to this site": "تبي تروح هنا؟", + "MyLocation": "موقعي", + "my location": "موقعي", + "Target": "الهدف", + "You Should choose rate figure": "لازم تختار تقييم", + "Login Captin": "دخول الكابتن", + "Register Captin": "تسجيل كابتن", + "Send Verfication Code": "أرسل الرمز", + "KM": "كم", + "End Ride": "إنهاء المشوار", + "Minute": "دقيقة", + "Go to passenger Location now": "رح لموقع الراكب الحين", + "Duration of the Ride is ": "مدة المشوار: ", + "Distance of the Ride is ": "مسافة المشوار: ", + "Name of the Passenger is ": "اسم الراكب: ", + "Hello this is Captain": "هلا، معك الكابتن", + "Start the Ride": "ابدأ المشوار", + "Please Wait If passenger want To Cancel!": "انتظر يمكن الراكب يلغي!", + "Total Duration:": "المدة الكلية:", + "Active Duration:": "المدة الفعلية:", + "Waiting for Captin ...": "بانتظار الكابتن...", + "Age is ": "العمر: ", + "Rating is ": "التقييم: ", + " to arrive you.": " عشان يوصلك.", + "Tariff": "التعرفة", + "Settings": "الإعدادات", + "Feed Back": "رأيك", + "Please enter a valid 16-digit card number": + "دخل رقم بطاقة صح (16 رقم)", + "Add Phone": "إضافة رقم", + "Please enter a phone number": "دخل رقم جوال", + "You dont Add Emergency Phone Yet!": "ما ضفت رقم طوارئ!", + "You will arrive to your destination after ": "بتوصل بعد ", + "You can cancel Ride now": "تقدر تلغي الحين", + "You Can cancel Ride After Captain did not come in the time": + "تقدر تلغي إذا تأخر الكابتن", + "If you in Car Now. Press Start The Ride": + "إذا ركبت، اضغط ابدأ المشوار", + "You Dont Have Any amount in": "ما عندك رصيد في", + "Wallet!": "المحفظة!", + "You Have": "عندك", + "Save Credit Card": "حفظ البطاقة", + "Show Promos": "عرض الخصومات", + "10 and get 4% discount": "10 وخذ خصم 4%", + "20 and get 6% discount": "20 وخذ خصم 6%", + "40 and get 8% discount": "40 وخذ خصم 8%", + "100 and get 11% discount": "100 وخذ خصم 11%", + "Pay with Your PayPal": "ادفع بـ PayPal", + "You will choose one of above !": "اختر واحد من اللي فوق!", + "Edit Profile": "تعديل الملف", + "Copy this Promo to use it in your Ride!": "انسخ الكود واستخدمه!", + "To change some Settings": "لتغيير الإعدادات", + "Order Request Page": "صفحة الطلب", + "Rouats of Trip": "مسارات المشوار", + "Passenger Name is ": "اسم الراكب: ", + "Total From Passenger is ": "المجموع من الراكب: ", + "Duration To Passenger is ": "الوقت للراكب: ", + "Distance To Passenger is ": "المسافة للراكب: ", + "Total For You is ": "لك: ", + "Distance is ": "المسافة: ", + " KM": " كم", + "Duration of Trip is ": "مدة المشوار: ", + " Minutes": " دقائق", + "Apply Order": "قبول الطلب", + "Refuse Order": "رفض الطلب", + "Rate Captain": "قيم الكابتن", + "Enter your Note": "اكتب ملاحظة", + "Type something...": "اكتب شي...", + "Submit rating": "إرسال التقييم", + "Rate Passenger": "قيم الراكب", + "Ride Summary": "ملخص المشوار", + "welcome_message": "أهلاً بك في انطلق!", + "app_description": "انطلق تطبيق آمن وموثوق.", + "get_to_destination": "وصل وجهتك بسرعة.", + "get_a_ride": "مع انطلق، الموتر يجيك بدقايق.", + "safe_and_comfortable": "استمتع بمشوار آمن.", + "committed_to_safety": "نهتم بسلامتك.", + "your ride is Accepted": "مشوارك انقبل", + "Driver is waiting at pickup.": "الكابتن ينتظرك عند نقطة الركوب.", + "Driver is on the way": "الكابتن بالطريق", + "Contact Options": "خيارات التواصل", + "Send a custom message": "أرسل رسالة", + "Type your message": "اكتب رسالتك", + "I will go now": "بمشي الحين", + "You Have Tips": "عندك إكرامية", + " tips\nTotal is": " إكرامية\nالمجموع", + "Your fee is ": "أجرتك: ", + "Do you want to pay Tips for this Driver": + "تبي تعطي الكابتن إكرامية؟", + "Tip is ": "الإكرامية: ", + "Are you want to wait drivers to accept your order": + "تبي تنتظر الكباتن؟", + "This price is fixed even if the route changes for the driver.": + "السعر ثابت حتى لو تغير الطريق.", + "The price may increase if the route changes.": + "ممكن يزيد السعر لو تغير الطريق.", + "The captain is responsible for the route.": + "الكابتن مسؤول عن الطريق.", + "We are search for nearst driver": "ندور أقرب كابتن", + "Your order is being prepared": "طلبك يتجهز", + "The drivers are reviewing your request": "الكباتن يشوفون طلبك", + "Your order sent to drivers": "أرسلنا طلبك للكباتن", + "You can call or record audio of this trip": "تقدر تتصل أو تسجل صوت", + "The trip has started! Feel free to contact emergency numbers, share your trip, or activate voice recording for the journey": + "بدأ المشوار! تقدر تكلم الطوارئ، تشارك رحلتك، أو تسجل صوت.", + "Camera Access Denied.": "ما في وصول للكاميرا.", + "Open Settings": "افتح الإعدادات", + "GPS Required Allow !.": "شغل الـ GPS!", + "Your Account is Deleted": "انحذف حسابك", + "Are you sure to delete your account?": "متأكد تبي تحذف حسابك؟", + "Your data will be erased after 2 weeks\nAnd you will can't return to use app after 1 month ": + "بتمسح بياناتك بعد أسبوعين\nوما تقدر ترجع بعد شهر", + "Enter Your First Name": "دخل اسمك الأول", + "Are you Sure to LogOut?": "بتسجل خروج؟", + "Email Wrong": "الإيميل غلط", + "Email you inserted is Wrong.": "الإيميل اللي كتبته غلط.", + "You have finished all times ": "خلصت محاولاتك", + "if you want help you can email us here": "تبي مساعدة؟ راسلنا", + "Thanks": "شكراً", + "Email Us": "راسلنا", + "I cant register in your app in face detection ": + "مو قادر أسجل بسبب بصمة الوجه", + "Hi": "هلا", + "No face detected": "ما تعرفنا على الوجه", + "Image detecting result is ": "نتيجة الفحص: ", + "from 3 times Take Attention": "من 3 مرات، انتبه", + "Be sure for take accurate images please\nYou have": + "تأكد إن الصورة واضحة\nعندك", + "image verified": "الصورة تمام", + "Next": "التالي", + "There is no help Question here": "ما في سؤال مساعدة", + "You dont have Points": "ما عندك نقاط", + "You Are Stopped For this Day !": "توقفت اليوم!", + "You must be charge your Account": "لازم تشحن حسابك", + "You Refused 3 Rides this Day that is the reason \nSee you Tomorrow!": + "رفضت 3 مشاوير اليوم.\nنشوفك بكره!", + "Recharge my Account": "شحن حسابي", + "Ok , See you Tomorrow": "تمام، أشوفك بكره", + "You are Stopped": "أنت موقوف", + "Connected": "متصل", + "Not Connected": "غير متصل", + "Your are far from passenger location": "أنت بعيد عن الراكب", + "go to your passenger location before\nPassenger cancel trip": + "رح لموقع الراكب قبل يكنسل", + "You will get cost of your work for this trip": "بتاخذ حق مشوارك", + " in your wallet": " بمحفظتك", + "you gain": "كسبت", + "Order Cancelled by Passenger": "الطلب تكنسل من الراكب", + "Feedback data saved successfully": "حفظنا تقييمك", + "No Promo for today .": "ما في عروض اليوم.", + "Select your destination": "اختر وجهتك", + "Search for your Start point": "ابحث عن نقطة البداية", + "Search for waypoint": "ابحث عن نقطة توقف", + "Current Location": "الموقع الحالي", + "Add Location 1": "إضافة موقع 1", + "You must Verify email !.": "لازم تأكد الإيميل!", + "Cropper": "قص الصورة", + "Saved Sucssefully": "تم الحفظ", + "Select Date": "اختر التاريخ", + "Birth Date": "تاريخ الميلاد", + "Ok": "تم", + "the 500 points equal 30 JOD": "الـ 500 نقطة تساوي 30 ر.س", + "the 500 points equal 30 JOD for you \nSo go and gain your money": + "الـ 500 نقطة بـ 30 ر.س لك\nروح اكسب فلوسك", + "token updated": "تحدث الرمز", + "Add Location 2": "إضافة موقع 2", + "Add Location 3": "إضافة موقع 3", + "Add Location 4": "إضافة موقع 4", + "Waiting for your location": "ننتظر موقعك", + "Search for your destination": "ابحث عن وجهتك", + "Hi! This is": "هلا! هذا", + " I am using": " أنا استخدم", + " to ride with": " عشان اركب مع", + " as the driver.": " ككابتن.", + "is driving a ": "يسوق ", + " with license plate ": " لوحتها ", + " I am currently located at ": " أنا حالياً في ", + "Please go to Car now ": "روح للسيارة الحين", + "You will receive a code in WhatsApp Messenger": + "بيجيك كود ع الواتساب", + "If you need assistance, contact us": "تحتاج مساعدة؟ كلمنا", + "Promo Ended": "انتهى العرض", + "Enter the promo code and get": "دخل الكود واحصل على", + "DISCOUNT": "خصم", + "No wallet record found": "ما لقينا سجل للمحفظة", + "for": "لـ", + "Intaleq is the safest ride-sharing app that introduces many features for both captains and passengers. We offer the lowest commission rate of just 8%, ensuring you get the best value for your rides. Our app includes insurance for the best captains, regular maintenance of cars with top engineers, and on-road services to ensure a respectful and high-quality experience for all users.": + "انطلق أأمن تطبيق مشاوير بميزات كثيرة. عمولتنا 8% بس. عندنا تأمين وصيانة.", + "You can contact us during working hours from 12:00 - 19:00.": + "كلمناه من 12 لـ 7.", + "Choose a contact option": "اختر طريقة تواصل", + "Work time is from 12:00 - 19:00.\nYou can send a WhatsApp message or email.": + "الدوام من 12 لـ 7.\nأرسل واتساب أو إيميل.", + "Promo code copied to clipboard!": "نسخت الكود!", + "Copy Code": "نسخ الكود", + "Your invite code was successfully applied!": "تم تطبيق كود الدعوة!", + "Payment Options": "خيارات الدفع", + "wait 1 minute to receive message": "انتظر دقيقة توصلك الرسالة", + "You have copied the promo code.": "نسخت كود الخصم.", + "Select Payment Amount": "اختر المبلغ", + "The promotion period has ended.": "خلصت فترة العرض.", + "Promo Code Accepted": "انقبل الكود", + "Tap on the promo code to copy it!": "اضغط ع الكود عشان تنسخه!", + "Lowest Price Achieved": "أقل سعر", + "Cannot apply further discounts.": "ما تقدر تخصم أكثر.", + "Promo Already Used": "الكود مستخدم", + "Invitation Used": "الدعوة مستخدمة", + "You have already used this promo code.": "استخدمت هالكود من قبل.", + "Insert Your Promo Code": "حط كود الخصم", + "Enter promo code here": "اكتب الكود هنا", + "Please enter a valid promo code": "دخل كود صحيح", + "Awfar Car": "سيارة توفير", + "Old and affordable, perfect for budget rides.": + "اقتصادية ومناسبة للميزانية.", + " If you need to reach me, please contact the driver directly at": + " إذا بغيتني، كلم الكابتن على", + "No Car or Driver Found in your area.": + "ما لقينا سيارة أو كابتن حولك.", + "Please Try anther time ": "جرب وقت ثاني", + "There no Driver Aplly your order sorry for that ": + "ماحد قبل طلبك، المعذرة", + "Trip Cancelled": "المشوار تكنسل", + "The Driver Will be in your location soon .": "الكابتن بيوصلك قريب.", + "The distance less than 500 meter.": "المسافة أقل من 500 متر.", + "Promo End !": "انتهى العرض!", + "There is no notification yet": "ما في إشعارات", + "Use Touch ID or Face ID to confirm payment": + "استخدم البصمة لتأكيد الدفع", + "Contact us for any questions on your order.": + "تواصل معنا لو عندك سؤال.", + "Pyament Cancelled .": "إلغاء الدفع.", + "type here": "اكتب هنا", + "Scan Driver License": "امسح الرخصة", + "Please put your licence in these border": "حط الرخصة داخل الإطار", + "Camera not initialized yet": "الكاميرا لسه", + "Take Image": "صور", + "AI Page": "صفحة الذكاء الاصطناعي", + "Take Picture Of ID Card": "صور الهوية", + "Take Picture Of Driver License Card": "صور الرخصة", + "We are process picture please wait ": "نعالج الصورة، انتظر شوي", + "There is no data yet.": "ما في بيانات.", + "Name :": "الاسم:", + "Drivers License Class: ": "فئة الرخصة:", + "Document Number: ": "رقم الوثيقة:", + "Address: ": "العنوان:", + "Height: ": "الطول:", + "Expiry Date: ": "تاريخ الانتهاء:", + "Date of Birth: ": "تاريخ الميلاد:", + "You can't continue with us .\nYou should renew Driver license": + "ما تقدر تكمل معنا.\nلازم تجدد الرخصة", + "Detect Your Face ": "تحقق من وجهك", + "Go to next step\nscan Car License.": "الخطوة الجاية\nمسح الاستمارة.", + "Name in arabic": "الاسم بالعربي", + "Drivers License Class": "فئة الرخصة", + "Selected Date": "التاريخ المحدد", + "Select Time": "اختر الوقت", + "Selected Time": "الوقت المحدد", + "Selected Date and Time": "التاريخ والوقت", + "Lets check Car license ": "نشيك الاستمارة", + "Car": "سيارة", + "Plate": "لوحة", + "Rides": "مشاوير", + "Selected driver": "الكابتن المختار", + "Lets check License Back Face": "نشيك ظهر الرخصة", + "Car License Card": "استمارة السيارة", + "No image selected yet": "ما اخترت صورة", + "Made :": "الصنع:", + "model :": "الموديل:", + "VIN :": "رقم الهيكل:", + "year :": "السنة:", + "ُExpire Date": "تاريخ الانتهاء", + "Login Driver": "دخول كابتن", + "Password must br at least 6 character.": + "كلمة المرور 6 حروف ع الأقل.", + "if you don't have account": "ما عندك حساب", + "Here recorded trips audio": "تسجيلات المشاوير هنا", + "Register as Driver": "سجل كابتن", + "By selecting \"I Agree\" below, I have reviewed and agree to the Terms of Use and acknowledge the ": + "باختيار \"أوافق\"، أكون وافقت على الشروط و ", + "Log Out Page": "صفحة الخروج", + "Log Off": "تسجيل خروج", + "Register Driver": "تسجيل كابتن", + "Verify Email For Driver": "تأكيد إيميل الكابتن", + "Admin DashBoard": "لوحة التحكم", + "Your name": "اسمك", + "your ride is applied": "انطلب مشوارك", + "H and": "س و", + "JOD": "ر.س", + "m": "د", + "We search nearst Driver to you": "ندور لك أقرب كابتن", + "please wait till driver accept your order": "انتظر الكابتن يقبل", + "No accepted orders? Try raising your trip fee to attract riders.": + "ماحد قبل؟ ارفع السعر.", + "You should select one": "لازم تختار واحد", + "The driver accept your order for": "الكابتن قبل بـ", + "The driver on your way": "الكابتن جايك", + "Total price from ": "السعر الكلي من ", + "Order Details Intaleq": "تفاصيل الطلب", + "Selected file:": "الملف المختار:", + "Your trip cost is": "تكلفة مشوارك:", + "this will delete all files from your device": + "بيمسح كل الملفات من جهازك", + "Exclusive offers and discounts always with the Intaleq app": + "عروض حصرية دائماً مع انطلق", + "Submit Question": "أرسل سؤال", + "Please enter your Question.": "اكتب سؤالك.", + "Help Details": "تفاصيل المساعدة", + "No trip yet found": "ما لقينا مشوار", + "No Response yet.": "ما في رد للحين.", + " You Earn today is ": " دخلك اليوم: ", + " You Have in": " عندك في", + "Total points is ": "مجموع النقاط ", + "Total Connection Duration:": "مدة الاتصال:", + "Passenger name : ": "اسم الراكب: ", + "Cost Of Trip IS ": "تكلفة المشوار: ", + "Arrival time": "وقت الوصول", + "arrival time to reach your point": "وقت الوصول لنقطتك", + "For Intaleq and scooter trips, the price is calculated dynamically. For Comfort trips, the price is based on time and distance": + "للانطلاق والسكوتر السعر متغير. للراحة السعر بالوقت والمسافة.", + "Hello this is Driver": "هلا، أنا الكابتن", + "Is the Passenger in your Car ?": "الراكب معك؟", + "Please wait for the passenger to enter the car before starting the trip.": + "انتظر الراكب يركب قبل تبدأ.", + "No ,still Waiting.": "لا، لسه أنتظر.", + "I arrive you": "وصلت", + "I Arrive your site": "وصلت موقعك", + "You are not in near to passenger location": "أنت بعيد عن الراكب", + "please go to picker location exactly": "رح لموقع الركوب بالضبط", + "You Can Cancel Trip And get Cost of Trip From": + "تقدر تلغي وتأخذ حقك من", + "Are you sure to cancel?": "متأكد تبي تلغي؟", + "Insert Emergincy Number": "دخل رقم الطوارئ", + "Best choice for comfort car and flexible route and stops point": + "أفضل خيار لسيارة مريحة ومسار مرن", + "Insert": "إدخال", + "This is for scooter or a motorcycle.": "هذا للسكوتر أو الدباب.", + "This trip goes directly from your starting point to your destination for a fixed price. The driver must follow the planned route": + "مشوار مباشر بسعر ثابت. الكابتن يلتزم بالمسار.", + "You can decline a request without any cost": "تقدر ترفض بدون تكلفة", + "Perfect for adventure seekers who want to experience something new and exciting": + "لمحبي المغامرة", + "My current location is:": "موقعي الحالي:", + "and I have a trip on": "وعندي مشوار على", + "App with Passenger": "التطبيق مع الراكب", + "You will be pay the cost to driver or we will get it from you on next trip": + "بتدفع للكابتن أو نأخذها منك المشوار الجاي", + "Trip has Steps": "الرحلة فيها وقفات", + "Distance from Passenger to destination is ": "المسافة للوجهة: ", + "price is": "السعر:", + "This ride type does not allow changes to the destination or additional stops": + "ما تقدر تغير الوجهة أو توقف", + "This price may be changed": "السعر ممكن يتغير", + "No SIM card, no problem! Call your driver directly through our app. We use advanced technology to ensure your privacy.": + "ما عندك شريحة؟ عادي! كلم الكابتن من التطبيق.", + "This ride type allows changes, but the price may increase": + "تقدر تغير بس السعر بيزيد", + "Select one message": "اختر رسالة", + "I'm waiting for you": "أنا أنتظرك", + "We noticed the Intaleq is exceeding 100 km/h. Please slow down for your safety. If you feel unsafe, you can share your trip details with a contact or call the police using the red SOS button.": + "لاحظنا السرعة زادت عن 100. هدي السرعة لسلامتك.", + "Warning: Intaleqing detected!": "تحذير: سرعة عالية!", + "Please help! Contact me as soon as possible.": "فزعة! كلمني بسرعة.", + "Share Trip Details": "شارك تفاصيل المشوار", + "Car Plate is ": "اللوحة: ", + "the 300 points equal 300 L.E for you \nSo go and gain your money": + "300 نقطة تساوي 300 ر.س لك\nرح اكسب فلوسك", + "the 300 points equal 300 L.E": "300 نقطة بـ 300 ر.س", + "The payment was not approved. Please try again.": + "الدفع ما انقبل. جرب مرة ثانية.", + "Payment Failed": "فشل الدفع", + "This is a scheduled notification.": "هذا إشعار مجدول.", + "An error occurred during the payment process.": "خطأ في الدفع.", + "The payment was approved.": "تم الدفع.", + "Payment Successful": "الدفع ناجح", + "No ride found yet": "ما لقينا مشوار", + "Accept Order": "قبول الطلب", + "Bottom Bar Example": "مثال الشريط السفلي", + "Driver phone": "جوال الكابتن", + "Statistics": "الإحصائيات", + "Origin": "الانطلاق", + "Destination": "الوصول", + "Driver Name": "اسم الكابتن", + "Driver Car Plate": "لوحة الكابتن", + "Available for rides": "متاح للمشاوير", + "Scan Id": "مسح الهوية", + "Camera not initilaized yet": "الكاميرا لسه", + "Scan ID MklGoogle": "مسح الهوية MklGoogle", + "Language": "اللغة", + "Jordan": "الأردن", + "USA": "أمريكا", + "Egypt": "مصر", + "Turkey": "تركيا", + "Saudi Arabia": "السعودية", + "Qatar": "قطر", + "Bahrain": "البحرين", + "Kuwait": "الكويت", + "But you have a negative salary of": "بس عليك سالب بقيمة", + "Promo Code": "كود الخصم", + "Your trip distance is": "مسافة مشوارك:", + "Enter promo code": "دخل الكود", + "You have promo!": "عندك خصم!", + "Cost Duration": "تكلفة الوقت", + "Duration is": "المدة:", + "Leave": "مغادرة", + "Join": "انضمام", + "Heading your way now. Please be ready.": "جايك بالطريق. خلك جاهز.", + "Approaching your area. Should be there in 3 minutes.": + "قربت منك. 3 دقايق وأكون عندك.", + "There's heavy traffic here. Can you suggest an alternate pickup point?": + "زحمة هنا. تقدر تغير موقع الركوب؟", + "This ride is already taken by another driver.": + "المشوار راح لكابتن ثاني.", + "You Should be select reason.": "لازم تختار سبب.", + "Waiting for Driver ...": "بانتظار الكابتن...", + "Latest Recent Trip": "آخر مشوار", + "from your list": "من قائمتك", + "Do you want to change Work location": "تغير موقع الدوام؟", + "Do you want to change Home location": "تغير موقع البيت؟", + "We Are Sorry That we dont have cars in your Location!": + "آسفين، ما في سيارات حولك!", + "Choose from Map": "اختر من الخريطة", + "Pick your ride location on the map - Tap to confirm": + "حدد موقعك ع الخريطة - اضغط للتأكيد", + "Intaleq is the ride-hailing app that is safe, reliable, and accessible.": + "انطلق تطبيق مشاوير آمن وموثوق.", + "With Intaleq, you can get a ride to your destination in minutes.": + "مع انطلق، توصل وجهتك بدقايق.", + "Intaleq is committed to safety, and all of our captains are carefully screened and background checked.": + "ملتزمين بالسلامة، وكل كباتننا مفحوصين أمنياً.", + "Pick from map": "اختر من الخريطة", + "No Car in your site. Sorry!": "ما في سيارة عندك. المعذرة!", + "Nearest Car for you about ": "أقرب سيارة لك بعد ", + "From :": "من:", + "Get Details of Trip": "تفاصيل المشوار", + "If you want add stop click here": "تبي تضيف وقفة اضغط هنا", + "Where you want go ": "وين تبي تروح ", + "My Card": "بطاقتي", + "Start Record": "ابدأ التسجيل", + "History of Trip": "سجل المشاوير", + "Helping Center": "مركز المساعدة", + "Record saved": "انحفظ التسجيل", + "Trips recorded": "المشاوير المسجلة", + "Select Your Country": "اختر دولتك", + "To ensure you receive the most accurate information for your location, please select your country below. This will help tailor the app experience and content to your country.": + "عشان نعطيك معلومات دقيقة، اختر دولتك.", + "Are you sure to delete recorded files": "متأكد تبي تحذف الملفات؟", + "Select recorded trip": "اختر مشوار مسجل", + "Card Number": "رقم البطاقة", + "Hi, Where to ": "هلا، لوين؟", + "Pick your destination from Map": "حدد وجهتك من الخريطة", + "Add Stops": "إضافة وقفات", + "Get Direction": "الاتجاهات", + "Add Location": "إضافة موقع", + "Switch Rider": "تغيير الراكب", + "You will arrive to your destination after timer end.": + "بتوصل بعد انتهاء المؤقت.", + "You can cancel trip": "تقدر تكنسل", + "The driver waitting you in picked location .": "الكابتن ينتظرك.", + "Pay with Your": "ادفع بـ", + "Pay with Credit Card": "ادفع بالبطاقة", + "Show Promos to Charge": "عروض الشحن", + "Point": "نقطة", + "How many hours would you like to wait?": "كم ساعة تبي تنتظر؟", + "Driver Wallet": "محفظة الكابتن", + "Choose between those Type Cars": "اختر نوع السيارة", + "hour": "ساعة", + "Select Waiting Hours": "اختر ساعات الانتظار", + "Total Points is": "مجموع النقاط", + "You will receive a code in SMS message": "بيجيك كود برسالة نصية", + "Done": "تم", + "Total Budget from trips is ": "إجمالي الدخل: ", + "Total Amount:": "المبلغ الكلي:", + "Total Budget from trips by\nCredit card is ": + "إجمالي الدخل بالبطاقة: ", + "This amount for all trip I get from Passengers": + "هذا المبلغ من كل الركاب", + "Pay from my budget": "ادفع من رصيدي", + "This amount for all trip I get from Passengers and Collected For me in": + "المبلغ المجمع لي في", + "You can buy points from your budget": "تقدر تشتري نقاط من رصيدك", + "insert amount": "دخل المبلغ", + "You can buy Points to let you online\nby this list below": + "اشتر نقاط عشان تكون متصل\nمن القائمة", + "Create Wallet to receive your money": "أنشئ محفظة لاستلام فلوسك", + "Enter your feedback here": "اكتب ملاحظتك", + "Please enter your feedback.": "اكتب ملاحظتك لاهنت.", + "Feedback": "ملاحظات", + "Submit ": "إرسال ", + "Click here to Show it in Map": "اضغط للعرض على الخريطة", + "Canceled": "ملغي", + "No I want": "لا أبي", + "Email is": "الإيميل:", + "Phone Number is": "الجوال:", + "Date of Birth is": "تاريخ الميلاد:", + "Sex is ": "الجنس: ", + "Car Details": "تفاصيل السيارة", + "VIN is": "رقم الهيكل:", + "Color is ": "اللون: ", + "Make is ": "الشركة:", + "Model is": "الموديل:", + "Year is": "السنة:", + "Expiration Date ": "تاريخ الانتهاء: ", + "Edit Your data": "تعديل بياناتك", + "write vin for your car": "اكتب رقم الهيكل", + "VIN": "رقم الهيكل", + "Please verify your identity": "تحقق من هويتك", + "write Color for your car": "اكتب اللون", + "write Make for your car": "اكتب الشركة", + "write Model for your car": "اكتب الموديل", + "write Year for your car": "اكتب السنة", + "write Expiration Date for your car": "اكتب تاريخ الانتهاء", + "Tariffs": "التعرفة", + "Minimum fare": "أقل سعر", + "Maximum fare": "أعلى سعر", + "Flag-down fee": "فتح الباب", + "Including Tax": "شامل الضريبة", + "BookingFee": "رسوم الحجز", + "Morning": "صباح", + "from 07:30 till 10:30 (Thursday, Friday, Saturday, Monday)": + "من 7:30 لـ 10:30", + "Evening": "مساء", + "from 12:00 till 15:00 (Thursday, Friday, Saturday, Monday)": + "من 12:00 لـ 3:00", + "Night": "ليل", + "You have in account": "عندك بالحساب", + "Select Country": "اختر الدولة", + "Ride Today : ": "مشوار اليوم: ", + "After this period\nYou can't cancel!": "بعد هالوقت\nما تقدر تلغي!", + "from 23:59 till 05:30": "من 11:59 م لـ 5:30 ص", + "Rate Driver": "قيم الكابتن", + "Total Cost is ": "التكلفة الكلية: ", + "Write note": "اكتب ملاحظة", + "Time to arrive": "وقت الوصول", + "Ride Summaries": "ملخص المشاوير", + "Total Cost": "التكلفة الكلية", + "Average of Hours of": "معدل الساعات", + " is ON for this month": " متصل هالشهر", + "Days": "أيام", + "Total Hours on month": "ساعات الشهر", + "Counts of Hours on days": "عدد الساعات بالأيام", + "OrderId": "رقم الطلب", + "created time": "وقت الإنشاء", + "Intaleq Over": "انتهى المشوار", + "I will slow down": "بهدي السرعة", + "Map Passenger": "خريطة الراكب", + "Be Slowly": "على مهلك", + "If you want to make Google Map App run directly when you apply order": + "تبي قوقل ماب يفتح علطول؟", + "You can change the language of the app": "تغيير اللغة", + "Your Budget less than needed": "رصيدك أقل من المطلوب", + "You can change the Country to get all features": + "غير الدولة عشان كل الميزات", + "There is no Car or Driver in your area.": "您所在的区域没有车辆或司机。", + "Change Country": "تغيير الدولة", + }, + }; +} diff --git a/siro_rider/lib/controller/notification/notification_captain_controller.dart b/siro_rider/lib/controller/notification/notification_captain_controller.dart new file mode 100644 index 0000000..50958e2 --- /dev/null +++ b/siro_rider/lib/controller/notification/notification_captain_controller.dart @@ -0,0 +1,62 @@ +import 'dart:convert'; + +import 'package:get/get.dart'; +import 'package:siro_rider/constant/style.dart'; +import 'package:siro_rider/views/widgets/elevated_btn.dart'; + +import '../../constant/box_name.dart'; +import '../../constant/links.dart'; +import '../../main.dart'; +import '../functions/crud.dart'; + +class NotificationCaptainController extends GetxController { + bool isLoading = false; + Map notificationData = {}; + + getNotifications() async { + isLoading = true; + update(); + var res = await CRUD().get( + link: AppLink.getNotificationCaptain, + payload: {'driverID': box.read(BoxName.driverID)}); + if (res == "failure") { + Get.defaultDialog( + title: 'There is no notification yet'.tr, + titleStyle: AppStyle.title, + middleText: '', + confirm: MyElevatedButton( + title: 'Back', + onPressed: () { + Get.back(); + Get.back(); + })); + } + notificationData = jsonDecode(res); + // sql.insertData(notificationData['message'], TableName.captainNotification); + + isLoading = false; + update(); + } + + updateNotification(String id) async { + await CRUD().post( + link: AppLink.updateNotificationCaptain, + payload: {'isShown': true, 'id': id}, + ); + } + + addNotificationCaptain(String driverId, title, body, isPin) async { + await CRUD().post(link: AppLink.addNotificationCaptain, payload: { + 'driverID': driverId, + 'title': title, + 'body': body, + 'isPin': isPin + }); + } + + @override + void onInit() { + getNotifications(); + super.onInit(); + } +} diff --git a/siro_rider/lib/controller/notification/passenger_notification_controller.dart b/siro_rider/lib/controller/notification/passenger_notification_controller.dart new file mode 100644 index 0000000..51f66a7 --- /dev/null +++ b/siro_rider/lib/controller/notification/passenger_notification_controller.dart @@ -0,0 +1,87 @@ +import 'dart:convert'; + +import 'package:get/get.dart'; +import 'package:siro_rider/controller/firebase/firbase_messge.dart'; + +import '../../constant/box_name.dart'; +import '../../constant/links.dart'; +import '../../main.dart'; +import '../../views/widgets/mydialoug.dart'; +import '../firebase/notification_service.dart'; +import '../functions/crud.dart'; + +class PassengerNotificationController extends GetxController { + bool isloading = false; + Map notificationData = {}; + + getNotifications() async { + isloading = true; + update(); + var res = await CRUD().get( + link: AppLink.getNotificationPassenger, + payload: {'passenger_id': box.read(BoxName.passengerID)}); + if (res == "failure" || res == "error") { + MyDialog().getDialog('There is no notification yet'.tr, '', () { + Get.back(); + Get.back(); + }); + } else { + final decoded = jsonDecode(res); + // التحقق من وجود البيانات في 'data' أو 'message' + var rawData = decoded['data'] ?? decoded['message']; + + if (decoded['status'] == 'error' || decoded['status'] == 'failure' || rawData == "No notification data found") { + notificationData = {'status': 'success', 'message': []}; // قائمة فارغة لمنع الخطأ في UI + } else { + // التأكد أننا نخزن قائمة + notificationData = { + 'status': 'success', + 'message': rawData is List ? rawData : [rawData] + }; + } + + isloading = false; + update(); + } + + // sql.insertData(notificationData['message'], TableName.captainNotification); + } + + updateNotification(String id) async { + await CRUD().post( + link: AppLink.updateNotificationPassenger, + payload: {'isShown': 'true', 'id': id}, + ); + Get.back(); + getNotifications(); + } + + addNotificationToPassenger(String title, body) async { + var res = CRUD().post(link: AppLink.addNotificationPassenger, payload: { + 'title': title, + 'body': body, + }); + // Get.find().sendNotificationToPassengerToken( + // title, + // body, + // 'token', + // [], + // 'iphone_ringtone', + // ); + await NotificationService.sendNotification( + category: title, + target: 'token'.toString(), + title: title, + body: body.tr, + isTopic: false, // Important: this is a token + tone: 'cancel', + driverList: [], + ); + } + + @override + void onInit() { + getNotifications(); + super.onInit(); + } +} diff --git a/siro_rider/lib/controller/notification/ride_available_controller.dart b/siro_rider/lib/controller/notification/ride_available_controller.dart new file mode 100644 index 0000000..7acb90f --- /dev/null +++ b/siro_rider/lib/controller/notification/ride_available_controller.dart @@ -0,0 +1,39 @@ +import 'dart:convert'; + +import 'package:siro_rider/constant/style.dart'; +import 'package:siro_rider/views/widgets/elevated_btn.dart'; +import 'package:get/get.dart'; + +import '../../constant/links.dart'; +import '../functions/crud.dart'; + +class RideAvailableController extends GetxController { + bool isLoading = false; + Map rideAvailableMap = {}; + getRideAvailable() async { + isLoading = true; + var res = await CRUD().get(link: AppLink.getRideWaiting, payload: {}); + if (res != 'failure') { + rideAvailableMap = jsonDecode(res); + isLoading = false; + update(); + } else { + Get.defaultDialog( + title: 'No Rides now!'.tr, + middleText: '', + titleStyle: AppStyle.title, + confirm: MyElevatedButton( + title: 'Ok'.tr, + onPressed: () { + Get.back(); + Get.back(); + })); + } + } + + @override + void onInit() { + getRideAvailable(); + super.onInit(); + } +} diff --git a/siro_rider/lib/controller/payment/driver_payment_controller.dart b/siro_rider/lib/controller/payment/driver_payment_controller.dart new file mode 100644 index 0000000..f9b284c --- /dev/null +++ b/siro_rider/lib/controller/payment/driver_payment_controller.dart @@ -0,0 +1,43 @@ +import 'dart:convert'; + +import 'package:siro_rider/views/widgets/elevated_btn.dart'; +import 'package:get/get.dart'; +import 'package:siro_rider/constant/box_name.dart'; +import 'package:siro_rider/constant/links.dart'; +import 'package:siro_rider/controller/functions/crud.dart'; +import 'package:siro_rider/main.dart'; + +class DriverWalletHistoryController extends GetxController { + bool isLoading = false; + List archive = []; + + getArchivePayment() async { + isLoading = true; + update(); + var res = await CRUD().getWallet( + link: AppLink.getWalletByDriver, + payload: {'driverID': box.read(BoxName.driverID)}); + if (res == 'failure') { + Get.defaultDialog( + barrierDismissible: false, + title: 'There is no data yet.'.tr, + middleText: '', + confirm: MyElevatedButton( + title: 'Back'.tr, + onPressed: () { + Get.back(); + Get.back(); + }, + )); + } + archive = jsonDecode(res)['message']; + isLoading = false; + update(); + } + + @override + void onInit() { + getArchivePayment(); + super.onInit(); + } +} diff --git a/siro_rider/lib/controller/payment/passenger_wallet_history_controller.dart b/siro_rider/lib/controller/payment/passenger_wallet_history_controller.dart new file mode 100644 index 0000000..54fbc61 --- /dev/null +++ b/siro_rider/lib/controller/payment/passenger_wallet_history_controller.dart @@ -0,0 +1,48 @@ +import 'dart:convert'; + +import 'package:get/get.dart'; +import 'package:siro_rider/constant/box_name.dart'; +import 'package:siro_rider/constant/links.dart'; +import 'package:siro_rider/controller/functions/crud.dart'; +import 'package:siro_rider/main.dart'; + +import '../../views/widgets/mydialoug.dart'; + +class PassengerWalletHistoryController extends GetxController { + bool isLoading = false; + List archive = []; + + Future getArchivePayment() async { + try { + isLoading = true; + update(); + + var res = await CRUD().getWallet( + link: AppLink.getPassengerWalletArchive, + payload: {'passenger_id': box.read(BoxName.passengerID)}, + ); + + if (res != 'failure') { + archive = jsonDecode(res)['message']; + } else { + MyDialog().getDialog('No wallet record found'.tr, '', () { + Get.back(); + Get.back(); + }); + } + } catch (e) { + // MyDialog().getDialog('An error occurred'.tr, '', () { + // Get.back(); + // }); + } finally { + isLoading = false; + update(); + } + } + + @override + void onInit() { + getArchivePayment(); + super.onInit(); + } +} diff --git a/siro_rider/lib/controller/payment/payment_controller.dart b/siro_rider/lib/controller/payment/payment_controller.dart new file mode 100644 index 0000000..c411060 --- /dev/null +++ b/siro_rider/lib/controller/payment/payment_controller.dart @@ -0,0 +1,768 @@ +import 'dart:convert'; +import 'package:siro_rider/constant/api_key.dart'; +import 'package:siro_rider/constant/style.dart'; +import 'package:siro_rider/controller/firebase/firbase_messge.dart'; +import 'package:siro_rider/controller/payment/paymob/paymob_response.dart'; +import 'package:siro_rider/views/home/map_page_passenger.dart'; +import 'package:http/http.dart' as http; +import 'package:flutter/material.dart'; +import 'package:get/get.dart'; +import 'package:local_auth/local_auth.dart'; +import 'package:siro_rider/controller/home/map/ride_lifecycle_controller.dart'; +import 'package:siro_rider/controller/home/map/ride_state.dart'; +import 'package:siro_rider/controller/home/map/ride_state.dart'; +import 'package:webview_flutter/webview_flutter.dart'; + +import '../../constant/box_name.dart'; +import '../../constant/colors.dart'; +import '../../constant/info.dart'; +import '../../constant/links.dart'; +import '../../main.dart'; +import '../../print.dart'; +import '../firebase/notification_service.dart'; +import '../functions/crud.dart'; +import '../functions/encrypt_decrypt.dart'; +import '../functions/toast.dart'; +import 'paymob/e_cash_screen.dart'; + +class PaymentController extends GetxController { + bool isLoading = false; + bool isWalletChecked = true; + bool isCashChecked = false; + bool isWalletFound = false; + bool isPromoSheetDialogue = false; + final formKey = GlobalKey(); + final promo = TextEditingController(); + final walletphoneController = TextEditingController(); + double totalPassenger = Get.find().totalPassenger; + int? selectedAmount = 0; + List totalPassengerWalletDetails = []; + String passengerTotalWalletAmount = ''; + String ip = '1'; + DateTime now = DateTime.now(); + late int timestamp; + + void updateSelectedAmount(int value) { + selectedAmount = value; + update(); + } + + void changePromoSheetDialogue() { + isPromoSheetDialogue = !isPromoSheetDialogue; + update(); + } + + getPassengerWallet() async { + isLoading = true; + update(); + + await CRUD().getWallet( + link: AppLink.getWalletByPassenger, + payload: {'passenger_id': box.read(BoxName.passengerID)}).then((value) { + box.write(BoxName.passengerWalletTotal, + jsonDecode(value)['message'][0]['total'].toString()); + }); + isLoading = false; + update(); + } + + String paymentToken = ''; + Future generateTokenPassenger(String amount) async { + var res = + await CRUD().post(link: AppLink.addPaymentTokenPassenger, payload: { + 'passengerId': box.read(BoxName.passengerID).toString(), + 'amount': amount.toString(), + }); + var d = jsonDecode(res); + return d['message']; + } + + Future generateTokenDriver(String amount) async { + var res = await CRUD().post(link: AppLink.addPaymentTokenDriver, payload: { + 'driverID': Get.find().driverId, + 'amount': amount.toString(), + }); + var d = jsonDecode(res); + return d['message']; + } + + Future addSeferWallet(String paymentMethod, point) async { + var seferToken = await generateTokenPassenger(point); + await CRUD().postWallet(link: AppLink.addSeferWallet, payload: { + 'amount': point.toString(), + 'paymentMethod': paymentMethod, + 'passengerId': box.read(BoxName.passengerID).toString(), + 'token': seferToken, + 'driverId': 'passenger', + }); + } + + Future addPassengersWallet(String point) async { + var token = await generateTokenPassenger(point); + await CRUD().postWallet(link: AppLink.addPassengersWallet, payload: { + 'passenger_id': box.read(BoxName.passengerID).toString(), + 'balance': point, + 'token': token, + }); + } + + payToDriverForCancelAfterAppliedAndHeNearYou(String rideId) async { + { + double costOfWaiting5Minute = box.read(BoxName.countryCode) == 'Egypt' + ? (4 * .08) + (5 * 1) + // 4 indicate foe 4 km ditance from driver start move to passenger + : (4 * .06) + (5 * .06); //for Eygpt other like jordan .06 per minute + var paymentTokenWait = + await generateTokenDriver(costOfWaiting5Minute.toString()); + var res = + await CRUD().postWallet(link: AppLink.addDrivePayment, payload: { + 'rideId': rideId, + 'amount': costOfWaiting5Minute.toString(), + 'payment_method': 'cancel-from-near', + 'passengerID': box.read(BoxName.passengerID).toString(), + 'token': paymentTokenWait, + 'driverID': Get.find().driverId.toString(), + }); + var paymentTokenWait1 = + await generateTokenDriver(costOfWaiting5Minute.toString()); + var res1 = await CRUD() + .postWallet(link: AppLink.addDriversWalletPoints, payload: { + 'paymentID': 'rideId$rideId', + 'amount': (costOfWaiting5Minute).toStringAsFixed(0), + 'paymentMethod': 'cancel-from-near', + 'token': paymentTokenWait1, + 'driverID': Get.find().driverId.toString(), + }); + + if (res != 'failure') { + // Get.find().sendNotificationToDriverMAP( + // 'Cancel', + // 'Trip Cancelled. The cost of the trip will be added to your wallet.' + // .tr, + // Get.find().driverToken, + // [], + // 'cancel', + // ); + await NotificationService.sendNotification( + category: 'Cancel', + target: Get.find().driverToken.toString(), + title: 'Cancel'.tr, + body: + 'Trip Cancelled. The cost of the trip will be added to your wallet.' + .tr, + isTopic: false, // Important: this is a token + tone: 'cancel', + driverList: [], + ); + } + var paymentTokenWaitPassenger1 = + await generateTokenPassenger((costOfWaiting5Minute * -1).toString()); + await CRUD().post(link: AppLink.addPassengersWallet, payload: { + 'passenger_id': box.read(BoxName.passengerID).toString(), + 'balance': (costOfWaiting5Minute * -1).toString(), + 'token': paymentTokenWaitPassenger1, + }); + Get.offAll(const MapPagePassenger()); + } + } + + addPassengerWallet() async { + isLoading = true; + update(); + + await addSeferWallet('visa-in', selectedAmount.toString()); + await addPassengersWallet(selectedAmount == 100 + ? '100' + : selectedAmount == 200 + ? '215' + : selectedAmount == 400 + ? '450' + : selectedAmount == 1000 + ? '1140' + : '0'); + + // getPassengerWallet(); + + isLoading = false; + update(); + } + + void onChangedPaymentMethodWallet(bool? value) { + if (box.read(BoxName.passengerWalletTotal) == null || + double.parse(box.read(BoxName.passengerWalletTotal).toString()) < + totalPassenger) { + isWalletChecked = false; + isWalletChecked ? isCashChecked = true : isCashChecked = true; + update(); + } else { + isWalletChecked = !isWalletChecked; + isWalletChecked ? isCashChecked = false : isCashChecked = true; + update(); + } + } + + void onChangedPaymentMethodCash(bool? value) { + if (box.read(BoxName.passengerWalletTotal) == null || + double.parse(box.read(BoxName.passengerWalletTotal)) < totalPassenger) { + isWalletChecked = false; + isCashChecked = !isCashChecked; + isCashChecked ? isWalletChecked = false : isWalletChecked = false; + update(); + } else { + isCashChecked = !isCashChecked; + isCashChecked ? isWalletChecked = false : isWalletChecked = true; + update(); + } + } + + void applyPromoCodeToPassenger() async { + //TAWJIHI + CRUD().get(link: AppLink.getPassengersPromo, payload: { + 'promo_code': promo.text, + }).then((value) { + var decod = jsonDecode(value); + + if (decod["status"] == "success") { + var firstElement = decod["message"][0]; + totalPassenger = totalPassenger - + (totalPassenger * int.parse(firstElement['amount'])); + Get.find().promoTaken = true; + update(); + } + }); + } + + +// 'https://accept.paymob.com/unifiedcheckout/?publicKey=egy_pk_live_mbjDC9Ni6FSHKmsz8sOHiVk2xd7oWRve&clientSecret=egy_sk_live_c0904e9cf04506ae64f818d4e075b4a957e3713fdf7a22cb7da30a29e72442b5' +// أضف هذا الرابط إلى ملف AppLink الخاص بك + +// هذه هي الدالة الجديدة التي ستستخدمها لبدء الدفع + Future payWithEcash(BuildContext context, String amount) async { + try { + // 1. يمكنك استخدام نفس طريقة التحقق بالبصمة إذا أردت + bool isAvailable = await LocalAuthentication().isDeviceSupported(); + if (isAvailable) { + bool didAuthenticate = await LocalAuthentication().authenticate( + localizedReason: 'Use Touch ID or Face ID to confirm payment', + ); + + if (didAuthenticate) { + // 2. استدعاء الـ Endpoint الجديد على السيرفر الخاص بك + var res = await CRUD().postWallet( + link: AppLink.payWithEcashPassenger, + payload: { + // ✅ أرسل البيانات التي يحتاجها السيرفر الخاص بـ ecash + "amount": amount, + "passengerId": box.read(BoxName.passengerID), + }, + ); + + // 3. التأكد من أن السيرفر أعاد رابط الدفع بنجاح + if (res != null && + res['status'] == 'success' && + res['message'] != null) { + final String paymentUrl = res['message']; + // 4. الانتقال إلى شاشة الدفع الجديدة الخاصة بـ ecash + Navigator.push( + context, + MaterialPageRoute( + builder: (context) => + EcashPaymentScreen(paymentUrl: paymentUrl), + ), + ); + } else { + // عرض رسالة خطأ في حال فشل السيرفر في إنشاء الرابط + Get.defaultDialog( + title: 'Error'.tr, + content: Text( + 'Failed to initiate payment. Please try again.'.tr, + style: AppStyle.title, + ), + ); + } + } + } + } catch (e) { + Get.defaultDialog( + title: 'Error'.tr, + content: Text( + 'An error occurred during the payment process.'.tr, + style: AppStyle.title, + ), + ); + } + } + + // Future payWithEcashDriver(BuildContext context, String amount) async { + // try { + // // يمكنك استخدام نفس طريقة التحقق بالبصمة إذا أردت + // bool isAvailable = await LocalAuthentication().isDeviceSupported(); + // if (isAvailable) { + // bool didAuthenticate = await LocalAuthentication().authenticate( + // localizedReason: 'Use Touch ID or Face ID to confirm payment'.tr, + // ); + + // if (didAuthenticate) { + // // استدعاء الـ Endpoint الجديد على السيرفر الخاص بك + // var res = await CRUD().postWallet( + // link: AppLink.payWithEcashPassenger, + // // link: + // // 'https://wl.tripz-egypt.com/v1/main/ride/ecash/driver/payWithEcash.php', + // payload: { + // // أرسل البيانات التي يحتاجها السيرفر + // "amount": amount, + // // "driverId": box.read(BoxName.driverID), // تأكد من وجود هذا المتغير + // "passengerId": + // box.read(BoxName.passengerID), // تأكد من وجود هذا المتغير + // }, + // ); + + // // التأكد من أن السيرفر أعاد رابط الدفع بنجاح + // if (res != null && + // res['status'] == 'success' && + // res['message'] != null) { + // final String paymentUrl = res['message']; + // // الانتقال إلى شاشة الدفع الجديدة الخاصة بـ ecash للسائق + // Navigator.push( + // context, + // MaterialPageRoute( + // builder: (context) => + // EcashDriverPaymentScreen(paymentUrl: paymentUrl), + // ), + // ); + // } else { + // // عرض رسالة خطأ في حال فشل السيرفر في إنشاء الرابط + // Get.defaultDialog( + // title: 'Error'.tr, + // content: Text( + // 'Failed to initiate payment. Please try again.'.tr, + // style: AppStyle.title, + // ), + // ); + // } + // } + // } + // } catch (e) { + // Get.defaultDialog( + // title: 'Error'.tr, + // content: Text( + // 'An error occurred during the payment process.'.tr, + // style: AppStyle.title, + // ), + // ); + // } + // } + + /// شاشة جديدة ومبسطة خاصة بدفع السائقين عبر ecash + + // Future payWithMTNWallet( + // BuildContext context, String amount, String currency) async { + // // خزن سياق علوي آمن من البداية + // final BuildContext safeContext = + // Get.overlayContext ?? Get.context ?? context; + + // // سبينر تحميل + // if (!(Get.isDialogOpen ?? false)) { + // Get.dialog(const Center(child: CircularProgressIndicator()), + // barrierDismissible: false); + // } + + // try { + // final phone = box.read(BoxName.phoneWallet) as String; + // final passengerID = box.read(BoxName.passengerID).toString(); + // final formattedAmount = double.parse(amount).toStringAsFixed(0); + + // Log.print("🚀 بدء عملية دفع MTN"); + // Log.print( + // "📦 Payload: passengerID: $passengerID, amount: $formattedAmount, phone: $phone"); + + // // التحقق بالبصمة (اختياري) + حماية من الـ await + // final localAuth = LocalAuthentication(); + // final isAuthSupported = await localAuth.isDeviceSupported(); + // if (isAuthSupported) { + // final didAuth = await localAuth.authenticate( + // localizedReason: 'استخدم بصمة الإصبع أو الوجه لتأكيد الدفع', + // ); + // if (!didAuth) { + // if (Get.isDialogOpen == true) Get.back(); + // Log.print("❌ المستخدم لم يؤكد بالبصمة/الوجه"); + // return; + // } + // } + + // // 1) بدء الدفع + // final responseData = await CRUD().postWalletMtn( + // link: AppLink.payWithMTNStart, + // payload: { + // "amount": formattedAmount, + // "passengerId": passengerID, + // "phone": phone, + // "lang": box.read(BoxName.lang) ?? 'ar', + // }, + // ); + + // // Log.print("✅ استجابة الخادم (mtn_start_payment.php):"); + // // Log.print(responseData); + // Log.print('responseData: ${responseData}'); + + // // فحص الاستجابة بقوة + // late final Map startRes; + // if (responseData is Map) { + // startRes = responseData; + // } else if (responseData is String) { + // startRes = json.decode(responseData) as Map; + // } else { + // throw Exception("تم استلام نوع بيانات غير متوقع من الخادم."); + // } + + // if (startRes['status'] != 'success') { + // final errorMsg = startRes['message']['Error']?.toString().tr ?? + // "فشل بدء عملية الدفع. حاول مرة أخرى."; + // throw Exception(errorMsg); + // } + + // final messageData = startRes["message"] as Map; + // final invoiceNumber = messageData["invoiceNumber"].toString(); + // final operationNumber = messageData["operationNumber"].toString(); + // final guid = messageData["guid"].toString(); + + // // Log.print( + // // "📄 invoiceNumber: $invoiceNumber, 🔢 operationNumber: $operationNumber, 🧭 guid: $guid"); + + // // أغلق السبينر قبل إظهار حوار OTP + // if (Get.isDialogOpen == true) Get.back(); + + // // 2) إدخال OTP بـ Get.defaultDialog (لا يستخدم context قابل للتلف) + // String otpInput = ""; + // await Get.defaultDialog( + // title: "أدخل كود التحقق", + // barrierDismissible: false, + // content: TextField( + // keyboardType: TextInputType.number, + // decoration: const InputDecoration(hintText: "كود OTP"), + // onChanged: (v) => otpInput = v, + // ), + // confirm: TextButton( + // onPressed: () { + // if (otpInput.isEmpty || + // otpInput.length < 4 || + // otpInput.length > 8) { + // Get.snackbar("تنبيه", "أدخل كود OTP صحيح (4–8 أرقام)"); + // return; + // } + // Get.back(result: otpInput); + // }, + // child: const Text("تأكيد"), + // ), + // cancel: TextButton( + // onPressed: () => Get.back(result: null), + // child: const Text("إلغاء"), + // ), + // ).then((res) => otpInput = (res ?? "") as String); + + // if (otpInput.isEmpty) { + // Log.print("❌ لم يتم إدخال OTP"); + // return; + // } + // Log.print("🔐 تم إدخال OTP: $otpInput"); + + // // سبينر أثناء التأكيد + // Get.dialog(const Center(child: CircularProgressIndicator()), + // barrierDismissible: false); + + // // 3) تأكيد الدفع + // final confirmRes = await CRUD().postWalletMtn( + // link: AppLink.payWithMTNConfirm, + // payload: { + // "invoiceNumber": invoiceNumber, + // "operationNumber": operationNumber, + // "guid": guid, + // "otp": otpInput, + // "phone": phone, + // "lang": box.read(BoxName.lang) ?? 'ar', + // }, + // ); + + // if (Get.isDialogOpen == true) Get.back(); + + // // Log.print("✅ استجابة mtn_confirm.php:"); + // // Log.print('confirmRes: ${confirmRes}'); + + // final ok = (confirmRes is Map && confirmRes['status'] == 'success'); + // if (ok) { + // Get.defaultDialog( + // title: "✅ نجاح", + // content: const Text("تمت عملية الدفع وإضافة الرصيد إلى محفظتك."), + // ); + // await getPassengerWallet(); + // } else { + // final errorMsg = (confirmRes['message']['message']?.toString()) ?? + // "فشل في تأكيد الدفع"; + // Get.defaultDialog(title: "❌ فشل", content: Text(errorMsg.tr)); + // } + // } catch (e, s) { + // Log.print("🔥 خطأ أثناء الدفع عبر MTN:"); + // Log.print(e); + // Log.print(s); + // if (Get.isDialogOpen == true) Get.back(); + // Get.defaultDialog( + // title: 'حدث خطأ', + // content: Text(e.toString().replaceFirst("Exception: ", "")), + // ); + // } + // } + + Future payWithSyriaTelWallet(String amount, String currency) async { + // helper لفتح لودينغ بأمان + Future _showLoading() async { + if (!(Get.isDialogOpen ?? false)) { + Get.dialog(const Center(child: CircularProgressIndicator()), + barrierDismissible: false); + } + } + + // helper لإغلاق أي حوار مفتوح + void _closeAnyDialog() { + if (Get.isDialogOpen ?? false) { + Get.back(); + } + } + + await _showLoading(); + try { + final phone = box.read(BoxName.phoneWallet) as String; + final passengerId = box.read(BoxName.passengerID).toString(); + final formattedAmount = double.parse(amount).toStringAsFixed(0); + + Log.print("🚀 Syriatel payment start"); + Log.print( + "📦 Payload => passengerId:$passengerId amount:$formattedAmount phone:$phone"); + + // مصادقة حيوية (اختياري) + final auth = LocalAuthentication(); + if (await auth.isDeviceSupported()) { + final ok = await auth.authenticate( + localizedReason: 'استخدم بصمة الإصبع أو الوجه لتأكيد الدفع', + ); + if (!ok) { + _closeAnyDialog(); + Log.print("❌ User did not authenticate"); + return; + } + } + + // 1) بدء عملية الدفع + final startRaw = await CRUD().postWalletMtn( + link: AppLink.payWithSyriatelStart, + payload: { + "amount": formattedAmount, + "passengerId": passengerId, + "phone": phone, + "lang": box.read(BoxName.lang) ?? 'ar', + }, + ); + + Log.print("✅ Server response (start): $startRaw"); + + // تحويل الاستجابة إلى Map + late final Map startRes; + if (startRaw is Map) { + startRes = startRaw; + } else if (startRaw is String) { + startRes = json.decode(startRaw) as Map; + } else { + throw Exception("Unexpected start response type"); + } + + if (startRes['status'] != 'success') { + final msg = + (startRes['message'] ?? 'Failed to start payment').toString(); + throw Exception(msg); + } + + final messageData = startRes['message'] as Map; + final transactionID = messageData['transactionID'].toString(); + Log.print("📄 transactionID: $transactionID"); +// + // 2) اطلب من المستخدم إدخال OTP عبر Get.dialog (بدون context) + _closeAnyDialog(); // أغلق اللودينغ أولاً + final otpController = TextEditingController(); + final otp = await Get.dialog( + AlertDialog( + title: const Text("أدخل كود التحقق"), + content: TextField( + controller: otpController, + keyboardType: TextInputType.number, + decoration: const InputDecoration(hintText: "كود OTP"), + ), + actions: [ + TextButton( + child: const Text("تأكيد"), + onPressed: () => Get.back(result: otpController.text.trim()), + ), + TextButton( + child: const Text("إلغاء"), + onPressed: () => Get.back(result: null), + ), + ], + ), + barrierDismissible: false, + ); + + if (otp == null || otp.isEmpty) { + Log.print("❌ OTP not provided"); + return; + } + Log.print("🔐 OTP: $otp"); + + await _showLoading(); + + // 3) تأكيد الدفع + final confirmRaw = await CRUD().postWallet( + link: AppLink.payWithSyriatelConfirm, + payload: { + "transactionID": transactionID, + "otp": otp, + }, + ); + + _closeAnyDialog(); // أغلق اللودينغ + + Log.print("✅ Response (confirm): $confirmRaw"); + + late final Map confirmRes; + if (confirmRaw is Map) { + confirmRes = confirmRaw; + } else if (confirmRaw is String) { + confirmRes = json.decode(confirmRaw) as Map; + } else { + throw Exception("Unexpected confirm response type"); + } + + if (confirmRes['status'] == 'success') { + Get.defaultDialog( + title: "✅ نجاح", + content: const Text("تمت عملية الدفع وإضافة الرصيد إلى محفظتك."), + ); + } else { + final msg = (confirmRes['message'] ?? 'فشل في تأكيد الدفع').toString(); + Get.defaultDialog( + title: "❌ فشل", + content: Text(msg), + ); + } + } catch (e, s) { + Log.print("🔥 Error during Syriatel Wallet payment:\n$e\n$s"); + _closeAnyDialog(); + Get.defaultDialog( + title: 'حدث خطأ', + content: Text(e.toString().replaceFirst("Exception: ", "")), + ); + } + } + + @override + void onInit() { + timestamp = now.millisecondsSinceEpoch; + if (box.read(BoxName.passengerWalletTotal) == null) { + box.write(BoxName.passengerWalletTotal, '0'); + } + getPassengerWallet(); + final localAuth = LocalAuthentication(); + super.onInit(); + } +} + +class EcashDriverPaymentScreen extends StatefulWidget { + final String paymentUrl; + + const EcashDriverPaymentScreen({required this.paymentUrl, Key? key}) + : super(key: key); + + @override + State createState() => + _EcashDriverPaymentScreenState(); +} + +class _EcashDriverPaymentScreenState extends State { + late final WebViewController _controller; + + @override + void initState() { + super.initState(); + _controller = WebViewController() + ..setJavaScriptMode(JavaScriptMode.unrestricted) + ..setNavigationDelegate(NavigationDelegate( + onPageFinished: (url) async { + Log.print('Ecash Driver WebView URL Finished: $url'); + await Get.find().getPassengerWallet(); + // هنا نتحقق فقط من أن المستخدم عاد إلى صفحة النجاح + // لا حاجة لاستدعاء أي API هنا، فالـ Webhook يقوم بكل العمل + if (url.contains("success.php")) { + showProcessingDialog(); + } + }, + )) + ..loadRequest(Uri.parse(widget.paymentUrl)); + } + + // دالة لعرض رسالة "العملية قيد المعالجة" + void showProcessingDialog() { + showDialog( + barrierDismissible: false, + context: Get.context!, + builder: (BuildContext context) { + return AlertDialog( + shape: RoundedRectangleBorder( + borderRadius: BorderRadius.circular(12.0), + ), + title: Row( + children: [ + Icon(Icons.check_circle, color: Colors.green), + const SizedBox(width: 8), + Text( + "Payment Successful".tr, + style: TextStyle( + color: Colors.green, + fontWeight: FontWeight.bold, + ), + ), + ], + ), + content: Text( + "Your payment is being processed and your wallet will be updated shortly." + .tr, + style: const TextStyle(fontSize: 16), + ), + actions: [ + TextButton( + onPressed: () { + // أغلق مربع الحوار، ثم أغلق شاشة الدفع + Navigator.pop(context); // Close the dialog + Navigator.pop(context); // Close the payment screen + }, + style: TextButton.styleFrom( + backgroundColor: Colors.green, + shape: RoundedRectangleBorder( + borderRadius: BorderRadius.circular(8.0), + ), + ), + child: Text( + "OK".tr, + style: const TextStyle(color: Colors.white), + ), + ), + ], + ); + }, + ); + } + + @override + Widget build(BuildContext context) { + return Scaffold( + appBar: AppBar(title: Text('Complete Payment'.tr)), + body: WebViewWidget(controller: _controller), + ); + } +} diff --git a/siro_rider/lib/controller/payment/paymob.dart b/siro_rider/lib/controller/payment/paymob.dart new file mode 100644 index 0000000..64b8897 --- /dev/null +++ b/siro_rider/lib/controller/payment/paymob.dart @@ -0,0 +1,158 @@ +import 'package:siro_rider/constant/box_name.dart'; +import 'package:dio/dio.dart' as dio; +import 'package:dio/dio.dart'; +import 'package:get/get.dart'; +import 'package:url_launcher/url_launcher.dart'; + +import '../../constant/api_key.dart'; +import '../../main.dart'; +import '../../print.dart'; +import '../functions/encrypt_decrypt.dart'; + +class PaymobManager extends GetxController { + String authanticationToken1 = ""; + String orderId1 = ""; + + Future getPaymentKey(int amount, String currency) async { + try { + String authanticationToken = await _getAuthanticationToken(); + + int orderId = await _getOrderId( + authanticationToken: authanticationToken, + amount: (100 * amount).toString(), + currency: currency, + ); + + String paymentKey = await _getPaymentKey( + authanticationToken: authanticationToken, + amount: (100 * amount).toString(), + currency: currency, + orderId: orderId.toString(), + ); + authanticationToken1 = authanticationToken.toString(); + orderId1 = orderId.toString(); + update(); + return paymentKey; + } catch (e) { + throw Exception(); + } + } + + Future payWithPayMob(int amount, String currency) async { + // 1. Fetch Payment Key (Assuming PaymobManager is a custom class) + String paymentToken; + try { + paymentToken = await PaymobManager().getPaymentKey(amount, currency); + } on Exception catch (e) { + // Handle errors gracefully, e.g., display error message to user + return; + } + + // 2. Prepare Payment Data Payload + final Map data = { + "source": { + "identifier": box.read(BoxName.phone), //"01010101010" + "subtype": "WALLET", + }, + "payment_token": paymentToken, + }; + + // 3. Make Payment Request using Dio + final dio = Dio(); + try { + final response = await dio.post( + 'https://accept.paymobsolutions.com/api/acceptance/payments/pay', + data: data, + ); + + // 4. Handle Payment Response + if (response.statusCode == 200) { + final paymentData = response.data; // Assuming JSON response + + // Navigate to success screen or display success message + launchUrl(Uri.parse(paymentData['iframe_redirection_url'])); + } else { + // Payment failed: Handle errors (e.g., display error message) + } + } on DioError catch (e) { + // Handle network or Dio-related errors + } + } + + Future _getStatusAfterPaid() async { + final dio.Response response = await Dio().post( + "https://accept.paymob.com/api/ecommerce/orders/transaction_inquiry", + data: { + "auth_token": authanticationToken1, + "merchant_order_id": "970960", + "order_id": orderId1 + }); + return response.data["success"]; + } + + Future _getAuthanticationToken() async { + final dio.Response response = + await Dio().post("https://accept.paymob.com/api/auth/tokens", data: { + "api_key": AK.payMobApikey, + 'username': AK.usernamePayMob, + "password": AK.passwordPayMob, + }); + Log.print('token: ${response}'); + return response.data["token"]; + } + + Future _getOrderId({ + required String authanticationToken, + required String amount, + required String currency, + }) async { + final dio.Response response = await Dio() + .post("https://accept.paymob.com/api/ecommerce/orders", data: { + "auth_token": authanticationToken, + "amount_cents": amount, + "currency": currency, + "delivery_needed": "false", + "items": [], + }); + Log.print('id: ${response}'); + return response.data["id"]; + } + + Future _getPaymentKey({ + required String authanticationToken, + required String orderId, + required String amount, + required String currency, + }) async { + final dio.Response response = await Dio() + .post("https://accept.paymob.com/api/acceptance/payment_keys", data: { + "expiration": 200, + "auth_token": authanticationToken.toString(), + "order_id": orderId.toString(), + "integration_id": + 4601103, ////todo wallet or online card int.parse(AK.integrationIdPayMob), + "lock_order_when_paid": "false", + "amount_cents": amount, + "currency": currency, + "billing_data": { + "first_name": + (box.read(BoxName.name).toString().split(' ')[0]).toString(), + "last_name": + (box.read(BoxName.name).toString().split(' ')[1]).toString(), + "email": (box.read(BoxName.email)), + "phone_number": (box.read(BoxName.phone)), + "apartment": "NA", + "floor": "NA", + "street": "NA", + "building": "NA", + "shipping_method": "NA", + "postal_code": "NA", + "city": "NA", + "country": box.read(BoxName.countryCode), + "state": "NA" + }, + }); + Log.print('token: ${response}'); + return response.data["token"]; + } +} diff --git a/siro_rider/lib/controller/payment/paymob/e_cash_screen.dart b/siro_rider/lib/controller/payment/paymob/e_cash_screen.dart new file mode 100644 index 0000000..50ca379 --- /dev/null +++ b/siro_rider/lib/controller/payment/paymob/e_cash_screen.dart @@ -0,0 +1,100 @@ +import 'package:siro_rider/print.dart'; +import 'package:flutter/material.dart'; +import 'package:get/get.dart'; +import 'package:webview_flutter/webview_flutter.dart'; + +// ✅ شاشة جديدة ومبسطة خاصة بـ ecash +class EcashPaymentScreen extends StatefulWidget { + final String paymentUrl; + + const EcashPaymentScreen({required this.paymentUrl, Key? key}) + : super(key: key); + + @override + State createState() => _EcashPaymentScreenState(); +} + +class _EcashPaymentScreenState extends State { + late final WebViewController _controller; + + @override + void initState() { + super.initState(); + _controller = WebViewController() + ..setJavaScriptMode(JavaScriptMode.unrestricted) + ..setNavigationDelegate(NavigationDelegate( + onPageFinished: (url) { + Log.print('Ecash WebView URL Finished: $url'); + + // ✅ هنا نتحقق فقط من أن المستخدم عاد إلى صفحة النجاح + // هذه الصفحة هي التي حددناها في `APP_REDIRECT_URL_SUCCESS` في ملف PHP + if (url.contains("success.php")) { + // لا نستدعي أي API هنا. الـ Webhook على السيرفر يقوم بكل العمل. + // فقط نعرض للمستخدم رسالة بأن العملية قيد المراجعة ونغلق الشاشة. + showProcessingDialog(); + } + }, + )) + ..loadRequest(Uri.parse(widget.paymentUrl)); + } + + // دالة لعرض رسالة "العملية قيد المعالجة" + void showProcessingDialog() { + showDialog( + barrierDismissible: false, + context: Get.context!, + builder: (BuildContext context) { + return AlertDialog( + shape: RoundedRectangleBorder( + borderRadius: BorderRadius.circular(12.0), + ), + title: Row( + children: [ + Icon(Icons.check_circle, color: Colors.green), + const SizedBox(width: 8), + Text( + "Payment Successful".tr, + style: TextStyle( + color: Colors.green, + fontWeight: FontWeight.bold, + ), + ), + ], + ), + content: Text( + "Your payment is being processed and your wallet will be updated shortly." + .tr, + style: const TextStyle(fontSize: 16), + ), + actions: [ + TextButton( + onPressed: () { + // أغلق مربع الحوار، ثم أغلق شاشة الدفع + Navigator.pop(context); // Close the dialog + Navigator.pop(context); // Close the payment screen + }, + style: TextButton.styleFrom( + backgroundColor: Colors.green, + shape: RoundedRectangleBorder( + borderRadius: BorderRadius.circular(8.0), + ), + ), + child: Text( + "OK".tr, + style: const TextStyle(color: Colors.white), + ), + ), + ], + ); + }, + ); + } + + @override + Widget build(BuildContext context) { + return Scaffold( + appBar: AppBar(title: Text('Complete Payment'.tr)), + body: WebViewWidget(controller: _controller), + ); + } +} \ No newline at end of file diff --git a/siro_rider/lib/controller/payment/paymob/paymob_response.dart b/siro_rider/lib/controller/payment/paymob/paymob_response.dart new file mode 100644 index 0000000..ea1fd61 --- /dev/null +++ b/siro_rider/lib/controller/payment/paymob/paymob_response.dart @@ -0,0 +1,487 @@ +import 'dart:convert'; + +import 'package:siro_rider/constant/box_name.dart'; +import 'package:siro_rider/constant/links.dart'; +import 'package:siro_rider/controller/functions/crud.dart'; +import 'package:siro_rider/main.dart'; +import 'package:dio/dio.dart'; +import 'package:flutter/material.dart'; +import 'package:get/get.dart'; +import 'package:webview_flutter/webview_flutter.dart'; +import 'package:http/http.dart' as http; +import '../../../print.dart'; +import '../../functions/encrypt_decrypt.dart'; + +class PaymobResponse { + bool success; + String? transactionID; + String? responseCode; + String? message; + + PaymobResponse({ + this.transactionID, + required this.success, + this.responseCode, + this.message, + }); + + factory PaymobResponse.fromJson(Map json) { + return PaymobResponse( + success: json['success'] == 'true', + transactionID: json['id'], + message: json['message'], + responseCode: json['txn_response_code'], + ); + } +} + +class PaymobPayment { + static PaymobPayment instance = PaymobPayment(); + + bool _isInitialized = false; + + final Dio _dio = Dio(); + final _baseURL = 'https://accept.paymob.com/api/'; + late String _apiKey; + late int _integrationID; + late int _iFrameID; + late String _iFrameURL; + late int _userTokenExpiration; + + /// Initializing PaymobPayment instance. + Future initialize({ + /// It is a unique identifier for the merchant which used to authenticate your requests calling any of Accept's API. + /// from dashboard Select Settings -> Account Info -> API Key + required String apiKey, + + /// from dashboard Select Developers -> Payment Integrations -> Online Card ID + required int integrationID, + + /// from paymob Select Developers -> iframes + required int iFrameID, + + /// The expiration time of this payment token in seconds. (The maximum is 3600 seconds which is an hour) + int userTokenExpiration = 300, + }) async { + if (_isInitialized) { + return true; + } + _dio.options.baseUrl = _baseURL; + _dio.options.validateStatus = (status) => true; + _apiKey = apiKey; + _integrationID = integrationID; + _iFrameID = iFrameID; + _iFrameURL = + 'https://accept.paymobsolutions.com/api/acceptance/iframes/$_iFrameID?payment_token='; + _isInitialized = true; + _userTokenExpiration = userTokenExpiration; + return _isInitialized; + } + + /// Get authentication token, which is valid for one hour from the creation time. + Future _getAuthToken() async { + try { + final response = await _dio.post( + 'auth/tokens', + data: { + 'api_key': _apiKey, + }, + ); + + return response.data['token']; + } catch (e) { + rethrow; + } + } + + /// At this step, you will register an order to Accept's database, so that you can pay for it later using a transaction + Future _addOrder({ + required String authToken, + required String currency, + required String amount, + required List items, + }) async { + try { + final response = await _dio.post( + 'ecommerce/orders', + data: { + "auth_token": authToken, + "delivery_needed": "false", + "amount_cents": amount, + "currency": currency, + "items": items, + }, + ); + + return response.data['id']; + } catch (e) { + rethrow; + } + } + + /// At this step, you will obtain a payment_key token. This key will be used to authenticate your payment request. It will be also used for verifying your transaction request metadata. + Future _getPurchaseToken({ + required String authToken, + required String currency, + required int orderID, + required String amount, + required PaymobBillingData billingData, + }) async { + final response = await _dio.post( + 'acceptance/payment_keys', + data: { + "auth_token": authToken, + "amount_cents": amount, + "expiration": _userTokenExpiration, + "order_id": orderID, + "billing_data": billingData, + "currency": currency, + "integration_id": _integrationID, + "lock_order_when_paid": "false" + }, + ); + final message = response.data['message']; + if (message != null) { + throw Exception(message); + } + return response.data['token']; + } + + /// Proceed to pay with only calling this function. + /// Opens a WebView at Paymob redirectedURL to accept user payment info. + Future pay( + { + /// BuildContext for navigation to WebView + required BuildContext context, + + /// Which Currency you would pay in. + required String currency, + + /// Payment amount in cents EX: 20000 is an 200 EGP + required String amountInCents, + + /// Optional Callback if you can use return result of pay function or use this callback + void Function(PaymobResponse response)? onPayment, + + /// list of json objects contains the contents of the purchase. + List? items, + + /// The billing data related to the customer related to this payment. + PaymobBillingData? billingData}) async { + if (!_isInitialized) { + throw Exception( + 'PaymobPayment is not initialized call:`PaymobPayment.instance.initialize`'); + } + final authToken = await _getAuthToken(); + final orderID = await _addOrder( + authToken: authToken, + currency: currency, + amount: amountInCents, + items: items ?? [], + ); + final purchaseToken = await _getPurchaseToken( + authToken: authToken, + currency: currency, + orderID: orderID, + amount: amountInCents, + billingData: billingData ?? PaymobBillingData(), + ); + if (context.mounted) { + final response = await PaymobIFrame.show( + context: context, + redirectURL: _iFrameURL + purchaseToken, + onPayment: onPayment, + ); + return response; + } + return null; + } //51624 +} + +class PaymobBillingData { + String? email; + String? firstName; + String? lastName; + String? phoneNumber; + String? apartment; + String? floor; + String? street; + String? building; + String? postalCode; + String? city; + String? state; + String? country; + String? shippingMethod; + + PaymobBillingData({ + this.email, + this.firstName, + this.lastName, + this.phoneNumber, + this.apartment, + this.floor, + this.street, + this.building, + this.postalCode, + this.city, + this.state, + this.country, + this.shippingMethod, + }); + + Map toJson() { + return { + "email": box.read(BoxName.email) ?? box.read(BoxName.emailDriver), + "first_name": + (box.read(BoxName.name).toString().split(' ')[0]).toString(), + "last_name": (box.read(BoxName.name).toString().split(' ')[1]).toString(), + "phone_number": (box.read(BoxName.phone)), + "apartment": apartment ?? "NA", + "floor": floor ?? "NA", + "building": building ?? "NA", + "street": street ?? "NA", + "postal_code": postalCode ?? "NA", + "city": city ?? "NA", + "state": state ?? "NA", + "country": country ?? "NA", + "shipping_method": box.read(BoxName.passengerID) ?? "NA", + }; + } +} + +class PaymobIFrame extends StatefulWidget { + const PaymobIFrame({ + Key? key, + required this.redirectURL, + this.onPayment, + }) : super(key: key); + + final String redirectURL; + final void Function(PaymobResponse)? onPayment; + + static Future show({ + required BuildContext context, + required String redirectURL, + void Function(PaymobResponse)? onPayment, + }) => + Navigator.of(context).push( + MaterialPageRoute( + builder: (context) { + return PaymobIFrame( + onPayment: onPayment, + redirectURL: redirectURL, + ); + }, + ), + ); + + @override + State createState() => _PaymobIFrameState(); +} + +class _PaymobIFrameState extends State { + WebViewController? controller; + + @override + void initState() { + controller = WebViewController() + ..setJavaScriptMode(JavaScriptMode.unrestricted) + ..setNavigationDelegate( + NavigationDelegate( + onNavigationRequest: (NavigationRequest request) { + if (request.url.contains('txn_response_code') && + request.url.contains('success') && + request.url.contains('id')) { + final params = _getParamFromURL(request.url); + final response = PaymobResponse.fromJson(params); + if (widget.onPayment != null) { + widget.onPayment!(response); + } + Navigator.pop(context, response); + return NavigationDecision.prevent; + } + return NavigationDecision.navigate; + }, + ), + ) + ..loadRequest(Uri.parse(widget.redirectURL)); + super.initState(); + } + + @override + Widget build(BuildContext context) { + return Scaffold( + body: controller == null + ? const Center( + child: CircularProgressIndicator.adaptive(), + ) + : SafeArea( + child: WebViewWidget( + controller: controller!, + ), + ), + ); + } + + Map _getParamFromURL(String url) { + final uri = Uri.parse(url); + Map data = {}; + uri.queryParameters.forEach((key, value) { + data[key] = value; + }); + return data; + } +} + +class PaymentScreen extends StatefulWidget { + final String iframeUrl; + + const PaymentScreen({required this.iframeUrl, Key? key}) : super(key: key); + + @override + State createState() => _PaymentScreenState(); +} + +class _PaymentScreenState extends State { + late final WebViewController _controller; + + @override + void initState() { + super.initState(); + _controller = WebViewController() + ..setJavaScriptMode(JavaScriptMode.unrestricted) + ..setNavigationDelegate(NavigationDelegate( + onPageFinished: (url) { + Log.print('url onPageFinished : ${url}'); + if (url.contains("success")) { + _fetchPaymentStatus(); // ✅ استدعاء الويب هوك بعد نجاح الدفع + } else if (url.contains("failed")) { + showCustomDialog( + title: "Error".tr, + message: 'Payment Failed'.tr, // يتم جلب رسالة الخطأ من الخادم + isSuccess: false, + ); + } + }, + )) + ..loadRequest(Uri.parse(widget.iframeUrl)); + } + + // ✅ استدعاء الويب هوك بعد انتهاء الدفع + Future _fetchPaymentStatus() async { + final String userId = (box.read(BoxName.phoneWallet)); // ضع user_id الحقيقي + final String apiUrl = AppLink.paymetVerifyPassenger; + + try { + final response = await CRUD().getWallet(link: apiUrl, payload: { + 'user_id': userId, + 'passengerId': box.read(BoxName.passengerID), + 'paymentMethod': 'visa-in', + }); + + if (response != 'failure' && response != 'token_expired') { + try { + final jsonData = jsonDecode(response); + + if (jsonData['status'] == 'success') { + // تأكد أن 'message' هو String وليس Map + // final message = jsonData['message']; + showCustomDialog( + title: "Payment Status", + message: jsonData['message'], // يتم جلب الرسالة من الخادم + isSuccess: true, + ); + } else { + showCustomDialog( + title: "Error", + message: jsonData['message'], // يتم جلب رسالة الخطأ من الخادم + isSuccess: false, + ); + } + } catch (e) { + showCustomDialog( + title: "Error", + message: response, // يتم جلب رسالة الخطأ من الخادم + isSuccess: false, + ); + } + } else { + showCustomDialog( + title: "Error".tr, + message: response, // يتم جلب رسالة الخطأ من الخادم + isSuccess: false, + ); + } + } catch (e) { + showCustomDialog( + title: "Error".tr, + message: 'Server error'.tr, // يتم جلب رسالة الخطأ من الخادم + isSuccess: false, + ); + } + } + + void showCustomDialog({ + required String title, + required String message, + required bool isSuccess, + }) { + showDialog( + barrierDismissible: false, + context: Get.context!, + builder: (BuildContext context) { + return AlertDialog( + shape: RoundedRectangleBorder( + borderRadius: BorderRadius.circular(12.0), + ), + title: Row( + children: [ + Icon( + isSuccess ? Icons.check_circle : Icons.error, + color: isSuccess ? Colors.green : Colors.red, + ), + const SizedBox(width: 8), + Text( + title, + style: TextStyle( + color: isSuccess ? Colors.green : Colors.red, + fontWeight: FontWeight.bold, + ), + ), + ], + ), + content: Text( + message, + style: const TextStyle(fontSize: 16), + ), + actions: [ + TextButton( + onPressed: () { + Navigator.pop(context); + Navigator.pop(context); + }, + style: TextButton.styleFrom( + backgroundColor: isSuccess ? Colors.green : Colors.red, + shape: RoundedRectangleBorder( + borderRadius: BorderRadius.circular(8.0), + ), + ), + child: Text( + "OK", + style: const TextStyle(color: Colors.white), + ), + ), + ], + ); + }, + ); + } + + @override + Widget build(BuildContext context) { + return Scaffold( + appBar: AppBar(title: const Text('إتمام الدفع')), + body: WebViewWidget(controller: _controller), + ); + } +} diff --git a/siro_rider/lib/controller/payment/paymob/paymob_wallet.dart b/siro_rider/lib/controller/payment/paymob/paymob_wallet.dart new file mode 100644 index 0000000..6d48b35 --- /dev/null +++ b/siro_rider/lib/controller/payment/paymob/paymob_wallet.dart @@ -0,0 +1,382 @@ +import 'package:siro_rider/constant/box_name.dart'; +import 'package:siro_rider/main.dart'; +import 'package:dio/dio.dart'; +import 'package:flutter/material.dart'; +import 'package:webview_flutter/webview_flutter.dart'; + +import '../../../print.dart'; +import '../../functions/encrypt_decrypt.dart'; + +class PaymobResponseWallet { + final bool success; + final String? transactionID; + final String? responseCode; + final String? message; + + PaymobResponseWallet({ + required this.success, + this.transactionID, + this.responseCode, + this.message, + }); + + factory PaymobResponseWallet.fromJson(Map json) { + return PaymobResponseWallet( + success: json['success'] == 'true', + transactionID: json['id'], + responseCode: json['txn_response_code'], + message: json['data']['message'], + ); + } +} + +class PaymobPaymentWallet { + static PaymobPaymentWallet instance = PaymobPaymentWallet(); + + bool _isInitializedWallet = false; + + final Dio _dio = Dio(); + final _baseURL = 'https://accept.paymob.com/api/'; + late String _apiKey; + late int _integrationID; + late int _iFrameID; + late String _iFrameURL; + late int _userTokenExpiration; + + /// Initializing PaymobPayment instance. + Future initialize({ + /// It is a unique identifier for the merchant which used to authenticate your requests calling any of Accept's API. + /// from dashboard Select Settings -> Account Info -> API Key + required String apiKey, + + /// from dashboard Select Developers -> Payment Integrations -> Online Card ID + required int integrationID, + + /// from paymob Select Developers -> iframes + required int iFrameID, + + /// The expiration time of this payment token in seconds. (The maximum is 3600 seconds which is an hour) + int userTokenExpiration = 300, + }) async { + if (_isInitializedWallet) { + return true; + } + _dio.options.baseUrl = _baseURL; + _dio.options.validateStatus = (status) => true; + _apiKey = apiKey; + _integrationID = integrationID; + _iFrameID = iFrameID; + _iFrameURL = + 'https://accept.paymobsolutions.com/api/acceptance/iframes/$_iFrameID?payment_token='; + _isInitializedWallet = true; + _userTokenExpiration = userTokenExpiration; + return _isInitializedWallet; + } + + /// Get authentication token, which is valid for one hour from the creation time. + Future _getAuthToken() async { + try { + final response = await _dio.post( + 'auth/tokens', + data: { + 'api_key': _apiKey, + }, + ); + return response.data['token']; + } catch (e) { + rethrow; + } + } + + /// At this step, you will register an order to Accept's database, so that you can pay for it later using a transaction + Future _addOrder({ + required String authToken, + required String currency, + required String amount, + required List items, + }) async { + try { + final response = await _dio.post( + 'ecommerce/orders', + data: { + "auth_token": authToken, + "delivery_needed": "false", + "amount_cents": amount, + "currency": currency, + "items": items, + }, + ); + return response.data['id']; + } catch (e) { + rethrow; + } + } + + /// At this step, you will obtain a payment_key token. This key will be used to authenticate your payment request. It will be also used for verifying your transaction request metadata. + Future _getPurchaseToken({ + required String authToken, + required String currency, + required int orderID, + required String amount, + required PaymobBillingDataWallet billingData, + }) async { + final response = await _dio.post( + 'acceptance/payment_keys', + data: { + "auth_token": authToken, + "amount_cents": amount, + "expiration": _userTokenExpiration, + "order_id": orderID, + "billing_data": billingData, + "currency": currency, + "integration_id": _integrationID, + "lock_order_when_paid": "false" + }, + ); + // final message = response.data['message']; + // if (message != null) { + // throw Exception(message); + // } + return response.data['token']; + } + + Future _getWalletUrl({ + required String paymentToken, + }) async { + final Map data = { + "source": { + "identifier": (box.read(BoxName.phoneWallet).toString()), + "subtype": "WALLET", + }, + "payment_token": paymentToken, + }; + final dio = Dio(); + try { + final response = await dio.post( + 'https://accept.paymobsolutions.com/api/acceptance/payments/pay', + data: data, + ); + + // 4. Handle Payment Response + if (response.statusCode == 200) { + final paymentData = response.data; // Assuming JSON response + + return paymentData['iframe_redirection_url']; + // Navigate to success screen or display success message + } else { + // Payment failed: Handle errors (e.g., display error message) + } + } on DioError catch (e) { + // Handle network or Dio-related errors + } + return ''; + } + + /// Proceed to pay with only calling this function. + /// Opens a WebView at Paymob redirectedURL to accept user payment info. + Future pay( + { + /// BuildContext for navigation to WebView + required BuildContext context, + + /// Which Currency you would pay in. + required String currency, + + /// Payment amount in cents EX: 20000 is an 200 EGP + required String amountInCents, + + /// Optional Callback if you can use return result of pay function or use this callback + void Function(PaymobResponseWallet response)? onPayment, + + /// list of json objects contains the contents of the purchase. + List? items, + + /// The billing data related to the customer related to this payment. + PaymobBillingDataWallet? billingData}) async { + if (!_isInitializedWallet) { + throw Exception( + 'PaymobPayment is not initialized call:`PaymobPayment.instance.initialize`'); + } + final authToken = await _getAuthToken(); + final orderID = await _addOrder( + authToken: authToken, + currency: currency, + amount: amountInCents, + items: items ?? [], + ); + final purchaseToken = await _getPurchaseToken( + authToken: authToken, + currency: currency, + orderID: orderID, + amount: amountInCents, + billingData: billingData ?? + PaymobBillingDataWallet( + // email: box.read(BoxName.email) ?? box.read(BoxName.emailDriver), + // firstName: box.read(BoxName.name) ?? box.read(BoxName.nameDriver), + // lastName: + // box.read(BoxName.lastNameDriver) ?? box.read(BoxName.name), + // phoneNumber: + // box.read(BoxName.phone) ?? box.read(BoxName.phoneDriver), + ), + ); + final urlWallet = await _getWalletUrl(paymentToken: purchaseToken); + Log.print('urlWallet: ${urlWallet}'); + + if (context.mounted) { + final response = await PaymobIFrameWallet.show( + context: context, + redirectURL: urlWallet, + onPayment: onPayment, + ); + return response; + } + return null; + } +} + +class PaymobBillingDataWallet { + String? email; + String? firstName; + String? lastName; + String? phoneNumber; + String? apartment; + String? floor; + String? street; + String? building; + String? postalCode; + String? city; + String? state; + String? country; + String? shippingMethod; + + PaymobBillingDataWallet({ + this.email, + this.firstName, + this.lastName, + this.phoneNumber, + this.apartment, + this.floor, + this.street, + this.building, + this.postalCode, + this.city, + this.state, + this.country, + this.shippingMethod, + }); + + Map toJson() { + return { + "email": (box.read(BoxName.email)), + "first_name": + (box.read(BoxName.name).toString().split(' ')[0]).toString(), + "last_name": + (box.read(BoxName.name).toString().split(' ')[1]).toString() ?? + 'Intaleq', + "phone_number": (box.read(BoxName.phoneWallet)), + "apartment": apartment ?? "NA", + "floor": floor ?? "NA", + "building": building ?? "NA", + "street": street ?? "NA", + "postal_code": postalCode ?? "NA", + "city": city ?? "NA", + "state": state ?? "NA", + "country": country ?? "NA", + "shipping_method": shippingMethod ?? "NA", + }; + } +} + +class PaymobIFrameWallet extends StatefulWidget { + const PaymobIFrameWallet({ + Key? key, + required this.redirectURL, + this.onPayment, + }) : super(key: key); + + final String redirectURL; + final void Function(PaymobResponseWallet)? onPayment; + + static Future show({ + required BuildContext context, + required String redirectURL, + void Function(PaymobResponseWallet)? onPayment, + }) => + Navigator.of(context).push( + MaterialPageRoute( + builder: (context) { + return PaymobIFrameWallet( + onPayment: onPayment, + redirectURL: redirectURL, + ); + }, + ), + ); + + @override + State createState() => _PaymobIFrameState(); +} + +class _PaymobIFrameState extends State { + WebViewController? controller; + + @override + void initState() { + controller = WebViewController() + ..setJavaScriptMode(JavaScriptMode.unrestricted) + ..setNavigationDelegate( + NavigationDelegate( + onNavigationRequest: (NavigationRequest request) { + if (request.url.contains('txn_response_code') && + // request.url.contains('successfully') && + request.url.contains('success') && + request.url.contains('id')) { + final params = _getParamFromURL(request.url); + final response = PaymobResponseWallet.fromJson(params); + if (widget.onPayment != null) { + widget.onPayment!(response); + } + Navigator.pop(context, response); + return NavigationDecision.prevent; + } + return NavigationDecision.navigate; + }, + ), + ) + ..loadRequest(Uri.parse(widget.redirectURL)); + super.initState(); + } + + @override + Widget build(BuildContext context) { + return Scaffold( + body: controller == null + ? const Center( + child: CircularProgressIndicator.adaptive(), + ) + : SafeArea( + child: WebViewWidget( + controller: controller!, + ), + ), + ); + } + + Map _getParamFromURL(String url) { + final uri = Uri.parse(url); + final queryParams = uri.queryParameters; + final data = {}; + + queryParams.forEach((key, value) { + if (key.contains('.')) { + final parts = key.split('.'); + data.putIfAbsent(parts.first, () => {}); + (data[parts.first] as Map)[parts.last] = value; + } else { + data[key] = value; + } + }); + + return data; + } +} diff --git a/siro_rider/lib/controller/payment/stripe.dart b/siro_rider/lib/controller/payment/stripe.dart new file mode 100644 index 0000000..e69de29 diff --git a/siro_rider/lib/controller/profile/captain_profile_controller.dart b/siro_rider/lib/controller/profile/captain_profile_controller.dart new file mode 100644 index 0000000..26c3680 --- /dev/null +++ b/siro_rider/lib/controller/profile/captain_profile_controller.dart @@ -0,0 +1,95 @@ +import 'dart:convert'; + +import 'package:flutter/material.dart'; +import 'package:get/get.dart'; +import 'package:siro_rider/constant/box_name.dart'; +import 'package:siro_rider/constant/links.dart'; +import 'package:siro_rider/controller/functions/crud.dart'; +import 'package:siro_rider/main.dart'; + +class CaptainProfileController extends GetxController { + bool isLoading = false; + TextEditingController vin = TextEditingController(); + TextEditingController color = TextEditingController(); + TextEditingController make = TextEditingController(); + TextEditingController model = TextEditingController(); + TextEditingController year = TextEditingController(); + TextEditingController expirationDate = TextEditingController(); + + Future updateFields() async { + var payload = { + 'driverID': box.read(BoxName.driverID), + }; + + if (vin.text.isNotEmpty) { + payload['vin'] = vin.text; + } + + if (color.text.isNotEmpty) { + payload['color'] = color.text; + } + + if (model.text.isNotEmpty) { + payload['model'] = model.text; + } + + if (make.text.isNotEmpty) { + payload['make'] = make.text; + } + + if (year.text.isNotEmpty) { + payload['year'] = year.text; + } + + if (expirationDate.text.isNotEmpty) { + payload['expiration_date'] = expirationDate.text; + } + + var res = + await CRUD().post(link: AppLink.updateRegisrationCar, payload: payload); + + if (jsonDecode(res)['status'] == 'success') { + box.write(BoxName.vin, vin.text); + box.write(BoxName.color, color.text); + box.write(BoxName.model, model.text); + box.write(BoxName.make, make.text); + box.write(BoxName.year, year.text); + box.write(BoxName.expirationDate, expirationDate.text); + update(); + Get.back(); + } + } + + Map captainProfileData = {}; + Future getProfileData() async { + var res = await CRUD().get( + link: AppLink.getCaptainProfile, + payload: {'id': box.read(BoxName.driverID)}); + if (res != 'failure') { + var d = jsonDecode(res); + captainProfileData = d['message']; + update(); + box.write(BoxName.sexDriver, d['message']['gender']); + box.write(BoxName.dobDriver, d['message']['birthdate']); + box.write(BoxName.vin, d['message']['vin']); + box.write(BoxName.color, d['message']['color']); + box.write(BoxName.model, d['message']['model']); + box.write(BoxName.carPlate, d['message']['car_plate']); + box.write(BoxName.make, d['message']['make']); + box.write(BoxName.year, d['message']['year']); + box.write(BoxName.expirationDate, d['message']['expiration_date']); + // box.write(BoxName.acc, d['message']['accountBank']); + + update(); + } + } + + @override + void onInit() { + // if (box.read(BoxName.dobDriver) == null) { + getProfileData(); + // } + + super.onInit(); + } +} diff --git a/siro_rider/lib/controller/profile/profile_controller.dart b/siro_rider/lib/controller/profile/profile_controller.dart new file mode 100644 index 0000000..188379e --- /dev/null +++ b/siro_rider/lib/controller/profile/profile_controller.dart @@ -0,0 +1,117 @@ +import 'dart:convert'; + +import 'package:siro_rider/constant/colors.dart'; +import 'package:flutter/cupertino.dart'; +import 'package:flutter/material.dart'; +import 'package:get/get.dart'; +import 'package:siro_rider/constant/box_name.dart'; +import 'package:siro_rider/constant/links.dart'; +import 'package:siro_rider/controller/functions/crud.dart'; +import 'package:siro_rider/main.dart'; + +class ProfileController extends GetxController { + bool isloading = false; + Map prfoileData = {}; + TextEditingController txtController = TextEditingController(); + List genders = ['Male', 'Female', 'Other']; + + String gender = 'Male'; + + void setGender(String value) { + gender = value; + update(); + } + + String? selectedDegree; + + void setDegree(String? degree) { + selectedDegree = degree; + update(); + } + + String? selectedCountry; + + void setCountry(String? country) { + selectedCountry = country; + // box.write(BoxName.countryCode, country); + update(); + } + + updateColumn(Map payload) async { + isloading = true; + update(); + await CRUD().post(link: AppLink.updateprofile, payload: payload); + await getProfile(); + isloading = false; + update(); + } + + updatField(String columnName, TextInputType type) async { + Get.dialog( + CupertinoAlertDialog( + title: Text('${'Update'.tr} $columnName'), + content: Column( + children: [ + const SizedBox(height: 16), // Add spacing between title and input + CupertinoTextField( + controller: txtController, + placeholder: 'type here'.tr, + keyboardType: type, + padding: const EdgeInsets.symmetric(vertical: 12, horizontal: 16), + decoration: BoxDecoration( + border: Border.all(color: CupertinoColors.lightBackgroundGray), + borderRadius: BorderRadius.circular(8), + ), + ), + const SizedBox(height: 20), + CupertinoButton( + color: AppColor.blueColor, + onPressed: () async { + Get.back(); + await updateColumn({ + 'id': box.read(BoxName.passengerID), + columnName: (txtController.text), + }); + if (columnName == 'first_name') { + box.write(BoxName.name, (txtController.text)); + } + + txtController.clear(); + }, + child: Text('Update'.tr), + ), + ], + ), + ), + ); + } + + getProfile() async { + isloading = true; + update(); + var res = await CRUD().get(link: AppLink.getprofile, payload: { + 'id': box.read(BoxName.passengerID).toString(), + }); + + if (res.toString() == 'failure') { + // Get.snackbar('failure', 'message'); + isloading = false; + update(); + } else { + var jsonDecoded = jsonDecode(res); + prfoileData = jsonDecoded['data']; + box.write(BoxName.sosPhonePassenger, prfoileData['sosPhone'].toString()); + box.write(BoxName.gender, prfoileData['gender'].toString()); + box.write(BoxName.name, + '${prfoileData['first_name']} ${prfoileData['last_name']}'); + isloading = false; + update(); + } + } + + @override + void onInit() { + getProfile(); + super.onInit(); + } +} diff --git a/siro_rider/lib/controller/profile/setting_controller.dart b/siro_rider/lib/controller/profile/setting_controller.dart new file mode 100644 index 0000000..8822b03 --- /dev/null +++ b/siro_rider/lib/controller/profile/setting_controller.dart @@ -0,0 +1,28 @@ +import 'package:siro_rider/constant/box_name.dart'; +import 'package:siro_rider/main.dart'; +import 'package:get/get.dart'; + +class SettingController extends GetxController { + bool isGoogleMapsEnabled = false; + + void onChangMapApp() { + if (!isGoogleMapsEnabled) { + isGoogleMapsEnabled = true; + box.write(BoxName.googlaMapApp, true); + update(); + } else { + isGoogleMapsEnabled = false; + box.write(BoxName.googlaMapApp, false); + update(); + } + } + + @override + void onInit() { + if (box.read(BoxName.googlaMapApp) != null) { + isGoogleMapsEnabled = box.read(BoxName.googlaMapApp); + } + update(); + super.onInit(); + } +} diff --git a/siro_rider/lib/controller/rate/rate_conroller.dart b/siro_rider/lib/controller/rate/rate_conroller.dart new file mode 100644 index 0000000..bf1ed6e --- /dev/null +++ b/siro_rider/lib/controller/rate/rate_conroller.dart @@ -0,0 +1,101 @@ +import 'package:flutter/cupertino.dart'; +import 'package:get/get.dart'; +import 'package:siro_rider/constant/box_name.dart'; +import 'package:siro_rider/constant/links.dart'; +import 'package:siro_rider/constant/style.dart'; +import 'package:siro_rider/controller/functions/crud.dart'; +import 'package:siro_rider/controller/home/map/ride_lifecycle_controller.dart'; +import 'package:siro_rider/main.dart'; +import 'package:siro_rider/views/home/map_page_passenger.dart'; +import 'package:siro_rider/views/widgets/elevated_btn.dart'; + +import '../firebase/notification_service.dart'; +import '../payment/payment_controller.dart'; + +// import '../home/captin/home_captain_controller.dart'; + +class RateController extends GetxController { + double selectedRateItemId = -1; + TextEditingController comment = TextEditingController(); + String? rideId, passengerId, driverId, driverName, price; + late GlobalKey formKey; + @override + void onInit() { + formKey = GlobalKey(); + passengerId = Get.arguments['passengerId']; + rideId = Get.arguments['rideId']; + driverId = Get.arguments['driverId']; + driverName = Get.arguments['driverName']; + price = Get.arguments['price']; + box.write(BoxName.tipPercentage, '0'); + super.onInit(); + } + + void selectRateItem(double id) { + selectedRateItemId = id; + update(); + } + + addRateToDriver() async { + if (selectedRateItemId < 1) { + Get.defaultDialog( + title: 'You Should choose rate figure'.tr, + titleStyle: AppStyle.title, + middleText: '', + confirm: MyElevatedButton(title: 'Ok', onPressed: () => Get.back())); + } else if (Get.find().isWalletChecked == true) { + double tip = 0; + tip = (Get.find().totalPassenger) * + (double.parse(box.read(BoxName.tipPercentage).toString())); + + if (tip > 0) { + var res = await CRUD().post(link: AppLink.addTips, payload: { + 'passengerID': box.read(BoxName.passengerID), + 'driverID': Get.find().driverId.toString(), + 'rideID': Get.find().rideId.toString(), + 'tipAmount': tip.toString(), + }); + await Get.find() + .addPassengersWallet(((-1) * tip).toString()); + var token1 = await Get.find().generateTokenDriver( + box.read(BoxName.countryCode) == 'Egypt' + ? tip.toStringAsFixed(0) + : (tip * 100).toString()); + await CRUD().postWallet(link: AppLink.addDriversWalletPoints, payload: { + 'driverID': Get.find().driverId.toString(), + 'paymentID': '${Get.find().rideId}tip', + 'amount': box.read(BoxName.countryCode) == 'Egypt' + ? tip.toStringAsFixed(0) + : (tip * 100).toString(), + 'paymentMethod': 'visa-tip', + 'token': token1, + }); + if (res != 'failure') { + await NotificationService.sendNotification( + category: 'You Have Tips', + target: Get.find().driverToken.toString(), + title: 'You Have Tips'.tr, + body: + '${'${tip.toString()}\$${' tips\nTotal is'.tr}'} ${tip + (Get.find().totalPassenger)}', + isTopic: false, // Important: this is a token + tone: 'ding', + driverList: [], + ); + } + } + } + await CRUD().post( + link: "${AppLink.server}/ride/rate/addRateToDriver.php", + payload: { + 'passenger_id': box.read(BoxName.passengerID).toString(), + 'driver_id': driverId.toString(), + 'ride_id': rideId.toString(), + 'rating': selectedRateItemId.toString(), + 'comment': comment.text, + }, + ); + + Get.find().restCounter(); + Get.offAll(const MapPagePassenger()); + } +} diff --git a/siro_rider/lib/controller/themes/themes.dart b/siro_rider/lib/controller/themes/themes.dart new file mode 100644 index 0000000..eec593d --- /dev/null +++ b/siro_rider/lib/controller/themes/themes.dart @@ -0,0 +1,144 @@ +import 'package:flutter/material.dart'; +import 'package:siro_rider/constant/style.dart'; + +import '../../constant/colors.dart'; + +ThemeData lightThemeEnglish = ThemeData( + brightness: Brightness.light, + fontFamily: "SFPro", + textTheme: TextTheme( + displaySmall: AppStyle.title, + displayLarge: AppStyle.headTitle, + displayMedium: AppStyle.headTitle2, + bodyLarge: AppStyle.title, + bodyMedium: AppStyle.subtitle, + ), + primarySwatch: Colors.blue, + dialogTheme: DialogThemeData( + backgroundColor: AppColor.secondaryColor, + contentTextStyle: AppStyle.title, + titleTextStyle: AppStyle.headTitle2, + ), + appBarTheme: AppBarTheme( + elevation: 0, + color: AppColor.secondaryColor, + centerTitle: true, + iconTheme: const IconThemeData( + color: AppColor.primaryColor, + ), + toolbarTextStyle: TextTheme( + titleSmall: AppStyle.subtitle, + headlineSmall: AppStyle.title, + titleLarge: AppStyle.headTitle2, + ).bodyMedium, + titleTextStyle: TextTheme( + titleSmall: AppStyle.subtitle, + headlineSmall: AppStyle.title, + titleLarge: AppStyle.headTitle2, + ).titleLarge, + ), +); + +ThemeData darkThemeEnglish = ThemeData( + brightness: Brightness.dark, + fontFamily: "SFPro", + primaryColor: AppColor.primaryColor, + scaffoldBackgroundColor: const Color(0xFF121212), + cardColor: const Color(0xFF1E1E1E), + textTheme: TextTheme( + displaySmall: AppStyle.title.copyWith(color: Colors.white), + displayLarge: AppStyle.headTitle.copyWith(color: Colors.white), + displayMedium: AppStyle.headTitle2.copyWith(color: Colors.white), + bodyLarge: AppStyle.title.copyWith(color: Colors.white70), + bodyMedium: AppStyle.subtitle.copyWith(color: Colors.white60), + ), + primarySwatch: Colors.green, + dialogTheme: const DialogThemeData( + backgroundColor: Color(0xFF1E1E1E), + contentTextStyle: TextStyle(color: Colors.white), + titleTextStyle: TextStyle(color: Colors.white, fontWeight: FontWeight.bold), + ), + appBarTheme: const AppBarTheme( + elevation: 0, + color: Color(0xFF121212), + centerTitle: true, + iconTheme: IconThemeData( + color: Colors.white, + ), + titleTextStyle: TextStyle( + color: Colors.white, + fontSize: 20, + fontWeight: FontWeight.bold, + ), + ), +); + +ThemeData lightThemeArabic = ThemeData( + brightness: Brightness.light, + fontFamily: 'SFArabic', + textTheme: TextTheme( + displaySmall: AppStyle.title, + displayLarge: AppStyle.headTitle, + displayMedium: AppStyle.headTitle2, + bodyLarge: AppStyle.title, + bodyMedium: AppStyle.subtitle, + ), + primarySwatch: Colors.blue, + dialogTheme: DialogThemeData( + backgroundColor: AppColor.secondaryColor, + contentTextStyle: AppStyle.title, + titleTextStyle: AppStyle.headTitle2, + ), + appBarTheme: AppBarTheme( + elevation: 0, + color: AppColor.secondaryColor, + centerTitle: true, + iconTheme: const IconThemeData( + color: AppColor.primaryColor, + ), + toolbarTextStyle: TextTheme( + titleSmall: AppStyle.subtitle, + headlineSmall: AppStyle.title, + titleLarge: AppStyle.headTitle2, + ).bodyMedium, + titleTextStyle: TextTheme( + titleSmall: AppStyle.subtitle, + headlineSmall: AppStyle.title, + titleLarge: AppStyle.headTitle2, + ).titleLarge, + ), +); + +ThemeData darkThemeArabic = ThemeData( + brightness: Brightness.dark, + fontFamily: 'SFArabic', + primaryColor: AppColor.primaryColor, + scaffoldBackgroundColor: const Color(0xFF121212), + cardColor: const Color(0xFF1E1E1E), + textTheme: TextTheme( + displaySmall: AppStyle.title.copyWith(color: Colors.white), + displayLarge: AppStyle.headTitle.copyWith(color: Colors.white), + displayMedium: AppStyle.headTitle2.copyWith(color: Colors.white), + bodyLarge: AppStyle.title.copyWith(color: Colors.white70), + bodyMedium: AppStyle.subtitle.copyWith(color: Colors.white60), + ), + primarySwatch: Colors.green, + dialogTheme: const DialogThemeData( + backgroundColor: Color(0xFF1E1E1E), + contentTextStyle: TextStyle(color: Colors.white), + titleTextStyle: TextStyle(color: Colors.white, fontWeight: FontWeight.bold), + ), + appBarTheme: const AppBarTheme( + elevation: 0, + color: Color(0xFF121212), + centerTitle: true, + iconTheme: IconThemeData( + color: Colors.white, + ), + titleTextStyle: TextStyle( + color: Colors.white, + fontSize: 20, + fontWeight: FontWeight.bold, + ), + ), +); diff --git a/siro_rider/lib/controller/voice_call_controller.dart b/siro_rider/lib/controller/voice_call_controller.dart new file mode 100644 index 0000000..f8a1667 --- /dev/null +++ b/siro_rider/lib/controller/voice_call_controller.dart @@ -0,0 +1,722 @@ +import 'dart:async'; +import 'package:flutter/services.dart'; +import 'package:flutter/widgets.dart'; +import 'package:flutter_webrtc/flutter_webrtc.dart' as rtc; +import 'package:get/get.dart' hide Response; +import 'package:permission_handler/permission_handler.dart'; +import 'package:just_audio/just_audio.dart'; + +import '../../constant/box_name.dart'; +import '../../constant/links.dart'; +import '../../main.dart'; +import '../../print.dart'; +import '../../services/signaling_service.dart'; +import '../../views/widgets/voice_call_bottom_sheet.dart'; +import 'functions/crud.dart'; + +// EN: Enum representing the different states of a voice call. +// AR: تعداد يمثل الحالات المختلفة للمكالمة الصوتية. +enum VoiceCallState { idle, dialing, ringing, connecting, active, ended } + +class VoiceCallController extends GetxController with WidgetsBindingObserver { + // EN: Instance of the signaling service to manage WebSocket communication. + // AR: مثيل لخدمة الإشارات لإدارة الاتصال عبر الـ WebSocket. + final SignalingService _signaling = SignalingService(); + + // --- Observable Variables (GetX) / المتغيرات التفاعلية --- + + // EN: Current state of the call. + // AR: الحالة الحالية للمكالمة. + var state = VoiceCallState.idle.obs; + + // EN: Unique identifier for the WebRTC session. + // AR: المعرف الفريد لجلسة الاتصال. + var sessionId = "".obs; + + // EN: ID of the current active ride. + // AR: معرف الرحلة النشطة الحالية. + var rideId = "".obs; + + // EN: Name of the other party (Driver/Passenger). + // AR: اسم الطرف الآخر في المكالمة (سائق/راكب). + var remoteName = "User".obs; + + // EN: Microphone mute status. + // AR: حالة كتم الميكروفون. + var isMuted = false.obs; + + // EN: Speakerphone status. + // AR: حالة مكبر الصوت الخارجي. + var isSpeakerOn = false.obs; + + // EN: Timer countdown variable, starts from 60 seconds. + // AR: متغير العد التنازلي للمؤقت، يبدأ من 60 ثانية. + var elapsedSeconds = 60.obs; + + // --- Core State Variables / متغيرات الحالة الأساسية --- + + // EN: Flag to determine if the current user initiated the call. + // AR: مؤشر لتحديد ما إذا كان المستخدم الحالي هو من بدأ المكالمة. + bool isCaller = false; + + // EN: ID of the current user. + // AR: معرف المستخدم الحالي. + String currentUserId = ""; + + // --- WebRTC Internal Variables / متغيرات WebRTC الداخلية --- + + // EN: The main connection object between peers. + // AR: كائن الاتصال الرئيسي بين الطرفين. + rtc.RTCPeerConnection? _peerConnection; + + // EN: The local audio stream captured from the microphone. + // AR: دفق الصوت المحلي الملتقط من الميكروفون. + rtc.MediaStream? _localStream; + + // EN: Timer to enforce the 60-second call limit. + // AR: مؤقت لفرض حد الـ 60 ثانية للمكالمة. + Timer? _countdownTimer; + + // EN: Timer to hang up if the call is not answered within 30 seconds. + // AR: مؤقت لإنهاء المكالمة إذا لم يتم الرد خلال 30 ثانية. + Timer? _ringingTimeoutTimer; + + // EN: Flag to indicate if the peer connection is currently attempting ICE reconnection. + // AR: مؤشر يوضح ما إذا كان الاتصال يحاول إعادة بناء مسارات الشبكة حالياً. + bool _isReconnecting = false; + Timer? _reconnectTimer; + List _dynamicIceServers = []; + + AudioPlayer? _ringtonePlayer; + + void _startRingtone() async { + try { + _ringtonePlayer ??= AudioPlayer(); + await _ringtonePlayer!.setAsset('assets/start.wav'); + await _ringtonePlayer!.setLoopMode(LoopMode.one); + _ringtonePlayer!.play(); + } catch (e) { + Log.print("Error playing ringtone: $e"); + } + } + + void _stopRingtone() { + try { + _ringtonePlayer?.stop(); + } catch (e) { + Log.print("Error stopping ringtone: $e"); + } + } + + @override + void onInit() { + super.onInit(); + // EN: Add lifecycle observer. + // AR: إضافة مراقب لدورة حياة التطبيق. + WidgetsBinding.instance.addObserver(this); + + // EN: Initialize WebSocket signaling listeners. + // AR: تهيئة مستمعي إشارات الـ WebSocket. + _initSignalingCallbacks(); + } + + // EN: Lifecycle hook: handle app switching background/foreground. + // AR: معالجة انتقال التطبيق إلى الخلفية أو العودة للواجهة. + @override + void didChangeAppLifecycleState(AppLifecycleState state) { + Log.print("VoiceCall: didChangeAppLifecycleState -> $state"); + if (state == AppLifecycleState.paused) { + Log.print( + "WARNING: App is in background. Microphone access might be suspended by the OS.", + ); + } else if (state == AppLifecycleState.resumed) { + Log.print("App resumed. Verifying WebRTC connection health."); + if (this.state.value == VoiceCallState.active) { + _ensureMicrophoneActive(); + _attemptIceRestart(); + } + } + } + + // EN: Registers all event listeners for the signaling server. + // AR: تسجيل جميع مستمعي الأحداث لخادم الإشارات. + void _initSignalingCallbacks() { + // EN: Triggered when successfully connected to the signaling server. + // AR: يُستدعى عند الاتصال بنجاح بخادم الإشارات. + _signaling.onConnected = (iceServers) { + Log.print("WebRTC Signaling Connected & Authenticated"); + _dynamicIceServers = iceServers; + }; + + // EN: Triggered when the WebSocket connection drops. + // AR: يُستدعى عند انقطاع اتصال الـ WebSocket. + _signaling.onDisconnected = (reason) { + Log.print("WebRTC Signaling Disconnected: $reason"); + if (state.value != VoiceCallState.idle) { + _endCallInternal("signaling_disconnected"); + } + }; + + // EN: Triggered when the remote user joins the room. + // AR: يُستدعى عند انضمام الطرف الآخر إلى غرفة الاتصال. + _signaling.onParticipantJoined = () async { + Log.print("Remote participant joined signaling session"); + // EN: If we are the caller, initiate the WebRTC handshake by creating an Offer. + // AR: إذا كنا نحن المتصل، نبدأ مصافحة WebRTC بإنشاء عرض (Offer). + if (isCaller && state.value == VoiceCallState.dialing) { + state.value = VoiceCallState.connecting; + await _createOffer(); + } + }; + + // EN: Triggered when an SDP Offer is received from the remote peer. + // AR: يُستدعى عند استلام عرض اتصال (Offer) من الطرف الآخر. + _signaling.onOffer = (sdpMap) async { + Log.print("Received WebRTC SDP Offer"); + if (!isCaller) { + state.value = VoiceCallState.connecting; + await _initializePeerConnection(); + + // EN: Set the remote peer's settings. + // AR: تعيين إعدادات الطرف الآخر. + final description = rtc.RTCSessionDescription( + sdpMap['sdp'], + sdpMap['type'], + ); + await _peerConnection!.setRemoteDescription(description); + + // EN: Respond with an Answer. + // AR: الرد بإجابة (Answer). + await _createAnswer(); + } + }; + + // EN: Triggered when an SDP Answer is received. + // AR: يُستدعى عند استلام إجابة (Answer) من الطرف الآخر. + _signaling.onAnswer = (sdpMap) async { + Log.print("Received WebRTC SDP Answer"); + if (isCaller && _peerConnection != null) { + final description = rtc.RTCSessionDescription( + sdpMap['sdp'], + sdpMap['type'], + ); + await _peerConnection!.setRemoteDescription(description); + } + }; + + // EN: Triggered when ICE candidates (Network routing info) are exchanged. + // AR: يُستدعى عند تبادل مسارات الشبكة (ICE Candidates) لتأسيس الاتصال. + _signaling.onIceCandidate = (candidateMap) async { + Log.print("Received Remote ICE Candidate"); + if (_peerConnection != null) { + final candidate = rtc.RTCIceCandidate( + candidateMap['candidate'], + candidateMap['sdpMid'], + candidateMap['sdpMLineIndex'], + ); + await _peerConnection!.addCandidate(candidate); + } + }; + + // EN: Triggered when a hangup event is received from the server. + // AR: يُستدعى عند استلام حدث إنهاء المكالمة من السيرفر. + _signaling.onCallEnded = (reason) { + Log.print("WebRTC Call Ended: $reason"); + _endCallInternal(reason); + }; + } + + // --- CALL LIFECYCLE / دورة حياة المكالمة --- + + // EN: Initiates an outgoing call. + // AR: يبدأ مكالمة صادرة. + Future startCall({ + required String rideIdVal, + required String driverId, + required String passengerId, + required String remoteNameVal, + }) async { + if (state.value != VoiceCallState.idle) return; + + // EN: Setup call variables. + // AR: إعداد متغيرات المكالمة. + state.value = VoiceCallState.dialing; + isCaller = true; + currentUserId = passengerId; + rideId.value = rideIdVal; + remoteName.value = remoteNameVal; + isMuted.value = false; + isSpeakerOn.value = false; + elapsedSeconds.value = 60; + _isReconnecting = false; + + _showCallBottomSheet(); + HapticFeedback.vibrate(); + + try { + // 1. EN: Request Microphone Permission / AR: طلب صلاحية الميكروفون + final permissionStatus = await Permission.microphone.request(); + if (!permissionStatus.isGranted) { + _endCallInternal("permission_denied"); + Get.snackbar( + "Error", + "Microphone permission is required for voice calls".tr, + ); + return; + } + + // 2. EN: Call PHP Backend to create Node.js session & notify Driver via FCM. + // AR: استدعاء واجهة PHP لإنشاء الجلسة على Node.js وإشعار السائق عبر FCM. + final response = await CRUD().post( + link: "${AppLink.server}/ride/call/passenger/create_call_session.php", + payload: {'ride_id': rideIdVal}, + ); + + if (response == null || + response == 'failure' || + response['status'] != 'success') { + _endCallInternal("session_creation_failed"); + Get.snackbar( + "Error", + "Failed to initiate call session. Please try again.".tr, + ); + return; + } + + final data = response['data']; + sessionId.value = data['session_id']; + + // 3. EN: Connect to WebRTC signaling server / AR: الاتصال بخادم الإشارات + await _signaling.connect(sessionId.value, currentUserId); + + // 4. EN: Initialize Local WebRTC Audio Stream / AR: تهيئة دفق الصوت المحلي + await _initializeLocalStream(); + + // 5. EN: Start Ringing Timeout Timer (30s max wait for driver to answer). + // AR: بدء مؤقت الرنين (أقصى انتظار 30 ثانية لرد السائق). + _ringingTimeoutTimer = Timer(const Duration(seconds: 30), () { + if (state.value == VoiceCallState.dialing) { + _signaling.send("hangup", {"reason": "no_answer"}); + _endCallInternal("no_answer"); + } + }); + } catch (e) { + Log.print("Error starting WebRTC call: $e"); + _endCallInternal("error"); + } + } + + // EN: Handles incoming call requests via FCM/Socket. + // AR: معالجة طلبات المكالمات الواردة. + Future receiveCall({ + required String sessionIdVal, + required String remoteNameVal, + required String rideIdVal, + }) async { + // EN: If already in a call, send busy signal. + // AR: إذا كان في مكالمة بالفعل، إرسال إشارة مشغول. + if (state.value != VoiceCallState.idle) { + _signaling.send("hangup", {"reason": "busy"}); + return; + } + + state.value = VoiceCallState.ringing; + isCaller = false; + currentUserId = box.read(BoxName.passengerID).toString(); + sessionId.value = sessionIdVal; + rideId.value = rideIdVal; + remoteName.value = remoteNameVal; + isMuted.value = false; + isSpeakerOn.value = false; + elapsedSeconds.value = 60; + _isReconnecting = false; + + _showCallBottomSheet(); + _startRingtone(); + HapticFeedback.vibrate(); + + // EN: Max 30s ringing timeout for receiver before auto-decline. + // AR: أقصى مدة للرنين 30 ثانية قبل الرفض التلقائي. + _ringingTimeoutTimer = Timer(const Duration(seconds: 30), () { + if (state.value == VoiceCallState.ringing) { + declineCall(); + } + }); + } + + // EN: Accepts the incoming call. + // AR: قبول المكالمة الواردة. + Future acceptCall() async { + if (state.value != VoiceCallState.ringing) return; + + _ringingTimeoutTimer?.cancel(); + _stopRingtone(); + state.value = VoiceCallState.connecting; + + try { + // EN: Check Mic permissions / AR: التحقق من صلاحيات الميكروفون + final permissionStatus = await Permission.microphone.request(); + if (!permissionStatus.isGranted) { + declineCall(); + Get.snackbar( + "Error", + "Microphone permission is required for voice calls".tr, + ); + return; + } + + await _signaling.connect(sessionId.value, currentUserId); + await _initializeLocalStream(); + + // EN: Notify caller we accepted / AR: إشعار المتصل بأننا قبلنا المكالمة + _signaling.send("join", {}); + } catch (e) { + Log.print("Error accepting call: $e"); + declineCall(); + } + } + + // EN: Declines an incoming call. + // AR: رفض المكالمة الواردة. + void declineCall() { + _ringingTimeoutTimer?.cancel(); + _stopRingtone(); + _signaling.send("hangup", {"reason": "declined"}); + _endCallInternal("declined"); + } + + // EN: Ends an active or dialing call. + // AR: إنهاء المكالمة النشطة أو الجاري الاتصال بها. + void hangup() { + _signaling.send("hangup", {"reason": "normal"}); + _endCallInternal("hangup"); + } + + // --- WEBRTC CORE HELPERS / دوال WebRTC الأساسية --- + + // EN: Captures the audio from the microphone with optimization constraints. + // AR: التقاط الصوت من الميكروفون مع قيود تحسين الجودة (إلغاء الصدى والضوضاء). + Future _initializeLocalStream() async { + final Map mediaConstraints = { + 'audio': { + 'echoCancellation': true, + 'noiseSuppression': true, + 'autoGainControl': true, + }, + 'video': false, // EN: Audio only / AR: صوت فقط + }; + + _localStream = await rtc.navigator.mediaDevices.getUserMedia( + mediaConstraints, + ); + rtc.Helper.setSpeakerphoneOn(isSpeakerOn.value); + } + + // EN: Verifies local microphone stream health on app resume and recreates/replaces track if suspended. + // AR: التحقق من سلامة مسار الميكروفون المحلي عند استئناف التطبيق وإعادة إنشائه إذا تم تعليقه. + Future _ensureMicrophoneActive() async { + if (_localStream == null || _peerConnection == null) return; + + bool needsRecreation = false; + if (_localStream!.active == false) { + needsRecreation = true; + } else { + for (var track in _localStream!.getAudioTracks()) { + if (!track.enabled && !isMuted.value) { + needsRecreation = true; + break; + } + } + } + + if (needsRecreation) { + Log.print( + "Local audio track ended or disabled. Recreating local stream...", + ); + try { + _localStream?.getTracks().forEach((track) => track.stop()); + _localStream?.dispose(); + _localStream = null; + + await _initializeLocalStream(); + + final senders = await _peerConnection!.getSenders(); + for (var sender in senders) { + final track = sender.track; + if (track != null && track.kind == 'audio') { + final newTracks = _localStream?.getAudioTracks(); + if (newTracks != null && newTracks.isNotEmpty) { + await sender.replaceTrack(newTracks.first); + Log.print( + "Replaced suspended/ended audio track with a new active one.", + ); + } + break; + } + } + } catch (e) { + Log.print("Error recreating local stream on resume: $e"); + } + } else { + _localStream!.getAudioTracks().forEach((track) { + track.enabled = !isMuted.value; + }); + } + } + + // EN: Creates the peer connection object and sets up ICE servers (STUN/TURN). + // AR: إنشاء كائن الاتصال المباشر وإعداد خوادم STUN/TURN لاختراق الجدران النارية. + Future _initializePeerConnection() async { + if (_peerConnection != null) return; + + final List> iceServers = []; + if (_dynamicIceServers.isNotEmpty) { + for (var server in _dynamicIceServers) { + if (server is Map) { + iceServers.add({ + "urls": server["urls"] ?? server["url"], + if (server["username"] != null) "username": server["username"], + if (server["credential"] != null) + "credential": server["credential"], + }); + } + } + } else { + // EN: Fallback STUN servers / AR: خوادم STUN الاحتياطية + iceServers.addAll([ + {"urls": "stun:stun.l.google.com:19302"}, + {"urls": "stun:stun1.l.google.com:19302"}, + ]); + } + + final Map configuration = {"iceServers": iceServers}; + + _peerConnection = await rtc.createPeerConnection(configuration); + + // EN: Gather local network routing info and send to remote peer. + // AR: جمع بيانات مسارات الشبكة المحلية وإرسالها للطرف الآخر. + _peerConnection!.onIceCandidate = (candidate) { + if (candidate.candidate != null) { + _signaling.send("ice_candidate", { + "candidate": { + "candidate": candidate.candidate, + "sdpMid": candidate.sdpMid, + "sdpMLineIndex": candidate.sdpMLineIndex, + }, + }); + } + }; + + // EN: Monitor connection status changes and handle disconnections. + // AR: مراقبة تغيرات حالة الاتصال ومعالجة انقطاع الشبكة. + _peerConnection!.onConnectionState = (connState) { + Log.print("RTCPeerConnectionState: $connState"); + if (connState == + rtc.RTCPeerConnectionState.RTCPeerConnectionStateConnected) { + _onCallConnected(); + } else if (connState == + rtc.RTCPeerConnectionState.RTCPeerConnectionStateFailed || + connState == + rtc.RTCPeerConnectionState.RTCPeerConnectionStateDisconnected) { + _handleIceConnectionFailure(); + } + }; + + // EN: Add local audio stream to the connection to send it to the other peer. + // AR: إضافة دفق الصوت المحلي للاتصال لإرساله للطرف الآخر. + if (_localStream != null) { + _localStream!.getTracks().forEach((track) { + _peerConnection!.addTrack(track, _localStream!); + }); + } + } + + // EN: Attempts an ICE restart to reconnect the WebRTC session when disconnections occur. + // AR: محاولة إعادة تأسيس الاتصال (ICE Restart) في حالة انقطاع الشبكة. + void _handleIceConnectionFailure() { + if (_isReconnecting) return; + _isReconnecting = true; + Log.print( + "ICE connection dropped. Attempting ICE Restart reconnection for 5s...", + ); + + if (isCaller) { + _attemptIceRestart(); + } + + _reconnectTimer?.cancel(); + _reconnectTimer = Timer(const Duration(seconds: 5), () { + if (state.value == VoiceCallState.active && + _peerConnection?.connectionState != + rtc.RTCPeerConnectionState.RTCPeerConnectionStateConnected) { + Log.print("ICE reconnection timed out. Hanging up."); + _endCallInternal("connection_lost"); + } else { + _isReconnecting = false; + Log.print("ICE Reconnection succeeded!"); + } + }); + } + + // EN: Initiates ICE Restart SDP exchange. + // AR: بدء تبادل حزم SDP لإعادة بناء مسارات الاتصال. + Future _attemptIceRestart() async { + if (_peerConnection == null || !isCaller) return; + try { + Log.print("Caller initiating WebRTC ICE Restart..."); + final constraints = { + 'mandatory': { + 'OfferToReceiveAudio': true, + 'OfferToReceiveVideo': false, + }, + 'optional': [ + {'IceRestart': true}, + ], + }; + final offer = await _peerConnection!.createOffer(constraints); + await _peerConnection!.setLocalDescription(offer); + _signaling.send("offer", { + "sdp": {"sdp": offer.sdp, "type": offer.type}, + }); + } catch (e) { + Log.print("Error initiating WebRTC ICE Restart: $e"); + } + } + + // EN: Generates an SDP Offer to initialize the connection. + // AR: إنشاء عرض (Offer) لبدء الاتصال وتحديد قدرات الجهاز. + Future _createOffer() async { + await _initializePeerConnection(); + + final constraints = { + 'mandatory': {'OfferToReceiveAudio': true, 'OfferToReceiveVideo': false}, + 'optional': [], + }; + + final offer = await _peerConnection!.createOffer(constraints); + await _peerConnection!.setLocalDescription(offer); + + _signaling.send("offer", { + "sdp": {"sdp": offer.sdp, "type": offer.type}, + }); + } + + // EN: Generates an SDP Answer in response to an Offer. + // AR: الرد بإنشاء إجابة (Answer) بناءً على العرض المستلم. + Future _createAnswer() async { + final constraints = { + 'mandatory': {'OfferToReceiveAudio': true, 'OfferToReceiveVideo': false}, + 'optional': [], + }; + + final answer = await _peerConnection!.createAnswer(constraints); + await _peerConnection!.setLocalDescription(answer); + + _signaling.send("answer", { + "sdp": {"sdp": answer.sdp, "type": answer.type}, + }); + } + + // EN: Triggered when connection is fully established. Starts the 60s timer. + // AR: يُستدعى عند تأسيس الاتصال بنجاح، ويقوم ببدء مؤقت الـ 60 ثانية. + void _onCallConnected() { + _ringingTimeoutTimer?.cancel(); + _reconnectTimer?.cancel(); + _isReconnecting = false; + + if (state.value != VoiceCallState.active) { + state.value = VoiceCallState.active; + HapticFeedback.vibrate(); + + // EN: Start 120s countdown timer / AR: بدء العد التنازلي لمدة 120 ثانية + _countdownTimer?.cancel(); + elapsedSeconds.value = 120; + _countdownTimer = Timer.periodic(const Duration(seconds: 1), (timer) { + if (elapsedSeconds.value > 1) { + elapsedSeconds.value--; + } else { + elapsedSeconds.value = 0; + _countdownTimer?.cancel(); + // EN: Force hangup when timer reaches 0 / AR: إغلاق إجباري عند وصول المؤقت لصفر + hangup(); + } + }); + } + } + + // EN: Internal cleanup function. Closes all connections and streams. + // AR: دالة التنظيف الداخلية. تقوم بإغلاق جميع الاتصالات وتفريغ الذاكرة. + void _endCallInternal(String reason) { + _countdownTimer?.cancel(); + _ringingTimeoutTimer?.cancel(); + _reconnectTimer?.cancel(); + _stopRingtone(); + + state.value = VoiceCallState.ended; + + // EN: Close WebRTC connection / AR: إغلاق اتصال WebRTC + _peerConnection?.close(); + _peerConnection = null; + + // EN: Stop mic capture / AR: إيقاف التقاط الميكروفون + _localStream?.getTracks().forEach((track) => track.stop()); + _localStream?.dispose(); + _localStream = null; + + // EN: Disconnect WebSockets / AR: إغلاق اتصال الـ WebSockets + _signaling.disconnect(); + + // EN: Close UI BottomSheet after delay / AR: إغلاق واجهة المكالمة بعد فترة زمنية قصيرة + Future.delayed(const Duration(milliseconds: 1500), () { + if (state.value == VoiceCallState.ended) { + state.value = VoiceCallState.idle; + Get.back(); + } + }); + } + + // --- ACTIONS (UI Controls) / إجراءات الواجهة --- + + // EN: Toggles microphone mute state. + // AR: تبديل حالة كتم الميكروفون. + void toggleMute() { + isMuted.value = !isMuted.value; + _localStream?.getAudioTracks().forEach((track) { + track.enabled = !isMuted.value; + }); + } + + // EN: Toggles loudspeaker mode. + // AR: تبديل حالة مكبر الصوت الخارجي. + void toggleSpeaker() { + isSpeakerOn.value = !isSpeakerOn.value; + rtc.Helper.setSpeakerphoneOn(isSpeakerOn.value); + } + + // EN: Displays the call UI overlay. + // AR: إظهار نافذة المكالمة السفلية. + void _showCallBottomSheet() { + Get.bottomSheet( + const VoiceCallBottomSheet(), + isScrollControlled: true, + enableDrag: false, + isDismissible: false, + ); + } + + // EN: Lifecycle hook: clean up resources when controller is destroyed. + // AR: دورة الحياة: تفريغ الذاكرة وإغلاق الموارد عند تدمير المتحكم. + @override + void onClose() { + WidgetsBinding.instance.removeObserver(this); + _countdownTimer?.cancel(); + _ringingTimeoutTimer?.cancel(); + _reconnectTimer?.cancel(); + _stopRingtone(); + _ringtonePlayer?.dispose(); + _peerConnection?.close(); + _localStream?.dispose(); + _signaling.disconnect(); + super.onClose(); + } +} diff --git a/siro_rider/lib/env/env.dart b/siro_rider/lib/env/env.dart new file mode 100644 index 0000000..5d97ae0 --- /dev/null +++ b/siro_rider/lib/env/env.dart @@ -0,0 +1,336 @@ +// Force rebuild to pick up late coordinates from .env +import 'package:envied/envied.dart'; + +part 'env.g.dart'; + +@Envied(path: '.env') +abstract class Env { + @EnviedField(varName: 'basicAuthCredentials', obfuscate: true) + static final String basicAuthCredentials = _Env.basicAuthCredentials; + + @EnviedField(varName: 'basicCompareFaces', obfuscate: true) + static final String basicCompareFaces = _Env.basicCompareFaces; + + @EnviedField(varName: 'mapKeyOsm', obfuscate: true) + static final String mapKeyOsm = _Env.mapKeyOsm; + + @EnviedField(varName: 'sss_encryptionSalt', obfuscate: true) + static final String sss_encryptionSalt = _Env.sss_encryptionSalt; + + @EnviedField(varName: 'sss_pass', obfuscate: true) + static final String sss_pass = _Env.sss_pass; + + @EnviedField(varName: 'addd', obfuscate: true) + static final String addd = _Env.addd; + + @EnviedField(varName: 'passnpassenger', obfuscate: true) + static final String passnpassenger = _Env.passnpassenger; + + @EnviedField(varName: 'newId', obfuscate: true) + static final String newId = _Env.newId; + + @EnviedField(varName: 'allowed', obfuscate: true) + static final String allowed = _Env.allowed; + + @EnviedField(varName: 'allowedWallet', obfuscate: true) + static final String allowedWallet = _Env.allowedWallet; + + @EnviedField(varName: 'apiKeyHere', obfuscate: true) + static final String apiKeyHere = _Env.apiKeyHere; + + @EnviedField(varName: 'getLocationAreaLinks', obfuscate: true) + static final String getLocationAreaLinks = _Env.getLocationAreaLinks; + + @EnviedField(varName: 'initializationVector', obfuscate: true) + static final String initializationVector = _Env.initializationVector; + + @EnviedField(varName: 'basicCompareFacesURL', obfuscate: true) + static final String basicCompareFacesURL = _Env.basicCompareFacesURL; + + @EnviedField(varName: 'accountSIDTwillo', obfuscate: true) + static final String accountSIDTwillo = _Env.accountSIDTwillo; + + @EnviedField(varName: 'serverAPI', obfuscate: true) + static final String serverAPI = _Env.serverAPI; + + @EnviedField(varName: 'mapAPIKEY', obfuscate: true) + static final String mapAPIKEY = _Env.mapAPIKEY; + + @EnviedField(varName: 'mapAPIKEYIOS', obfuscate: true) + static final String mapAPIKEYIOS = _Env.mapAPIKEYIOS; + + @EnviedField(varName: 'twilloRecoveryCode', obfuscate: true) + static final String twilloRecoveryCode = _Env.twilloRecoveryCode; + + @EnviedField(varName: 'authTokenTwillo', obfuscate: true) + static final String authTokenTwillo = _Env.authTokenTwillo; + + @EnviedField(varName: 'chatGPTkey', obfuscate: true) + static final String chatGPTkey = _Env.chatGPTkey; + + @EnviedField(varName: 'transactionCloude', obfuscate: true) + static final String transactionCloude = _Env.transactionCloude; + + @EnviedField(varName: 'visionApi', obfuscate: true) + static final String visionApi = _Env.visionApi; + + @EnviedField(varName: 'secretKey', obfuscate: true) + static final String secretKey = _Env.secretKey; + + + @EnviedField(varName: 'chatGPTkeySefer', obfuscate: true) + static final String chatGPTkeySefer = _Env.chatGPTkeySefer; + + @EnviedField(varName: 'llamaKey', obfuscate: true) + static final String llamaKey = _Env.llamaKey; + + @EnviedField(varName: 'privateKeyFCM', obfuscate: true) + static final String privateKeyFCM = _Env.privateKeyFCM; + + @EnviedField(varName: 'whatsapp', obfuscate: true) + static final String whatsapp = _Env.whatsapp; + + @EnviedField(varName: 'whatappID', obfuscate: true) + static final String whatappID = _Env.whatappID; + + @EnviedField(varName: 'serverPHP', obfuscate: true) + static final String serverPHP = _Env.serverPHP; + + @EnviedField(varName: 'seferAlexandriaServer', obfuscate: true) + static final String seferAlexandriaServer = _Env.seferAlexandriaServer; + + @EnviedField(varName: 'seferPaymentServer', obfuscate: true) + static final String seferPaymentServer = _Env.seferPaymentServer; + + @EnviedField(varName: 'seferCairoServer', obfuscate: true) + static final String seferCairoServer = _Env.seferCairoServer; + + @EnviedField(varName: 'seferGizaServer', obfuscate: true) + static final String seferGizaServer = _Env.seferGizaServer; + + @EnviedField(varName: 'chatGPTkeySeferNew', obfuscate: true) + static final String chatGPTkeySeferNew = _Env.chatGPTkeySeferNew; + + @EnviedField(varName: 'cohere', obfuscate: true) + static final String cohere = _Env.cohere; + + @EnviedField(varName: 'claudeAiAPI', obfuscate: true) + static final String claudeAiAPI = _Env.claudeAiAPI; + + + @EnviedField(varName: 'geminiApi', obfuscate: true) + static final String geminiApi = _Env.geminiApi; + + @EnviedField(varName: 'geminiApiMasa', obfuscate: true) + static final String geminiApiMasa = _Env.geminiApiMasa; + + @EnviedField(varName: 'agoraAppId', obfuscate: true) + static final String agoraAppId = _Env.agoraAppId; + + @EnviedField(varName: 'agoraAppCertificate', obfuscate: true) + static final String agoraAppCertificate = _Env.agoraAppCertificate; + + + @EnviedField(varName: 'integrationIdPayMob', obfuscate: true) + static final String integrationIdPayMob = _Env.integrationIdPayMob; + + @EnviedField(varName: 'passwordPayMob', obfuscate: true) + static final String passwordPayMob = _Env.passwordPayMob; + + @EnviedField(varName: 'usernamePayMob', obfuscate: true) + static final String usernamePayMob = _Env.usernamePayMob; + + @EnviedField(varName: 'payMobApikey', obfuscate: true) + static final String payMobApikey = _Env.payMobApikey; + + @EnviedField(varName: 'integrationIdPayMobWallet', obfuscate: true) + static final String integrationIdPayMobWallet = + _Env.integrationIdPayMobWallet; + + @EnviedField(varName: 'smsPasswordEgypt', obfuscate: true) + static final String smsPasswordEgypt = _Env.smsPasswordEgypt; + + @EnviedField(varName: 'ocpApimSubscriptionKey', obfuscate: true) + static final String ocpApimSubscriptionKey = _Env.ocpApimSubscriptionKey; + + @EnviedField(varName: 'chatGPTkeySeferNew4', obfuscate: true) + static final String chatGPTkeySeferNew4 = _Env.chatGPTkeySeferNew4; + + @EnviedField(varName: 'anthropicAIkeySeferNew', obfuscate: true) + static final String anthropicAIkeySeferNew = _Env.anthropicAIkeySeferNew; + + @EnviedField(varName: 'llama3Key', obfuscate: true) + static final String llama3Key = _Env.llama3Key; + + @EnviedField(varName: 'payMobOutClientSecrret', obfuscate: true) + static final String payMobOutClientSecrret = _Env.payMobOutClientSecrret; + + @EnviedField(varName: 'payMobOutClient_id', obfuscate: true) + static final String payMobOutClient_id = _Env.payMobOutClient_id; + + @EnviedField(varName: 'payMobOutPassword', obfuscate: true) + static final String payMobOutPassword = _Env.payMobOutPassword; + + @EnviedField(varName: 'payMobOutUserName', obfuscate: true) + static final String payMobOutUserName = _Env.payMobOutUserName; + + @EnviedField(varName: 'A', obfuscate: true) + static final String A = _Env.A; + + @EnviedField(varName: 'B', obfuscate: true) + static final String B = _Env.B; + + @EnviedField(varName: 'C', obfuscate: true) + static final String C = _Env.C; + + @EnviedField(varName: 'D', obfuscate: true) + static final String D = _Env.D; + + @EnviedField(varName: 'E', obfuscate: true) + static final String E = _Env.E; + + @EnviedField(varName: 'F', obfuscate: true) + static final String F = _Env.F; + + @EnviedField(varName: 'G', obfuscate: true) + static final String G = _Env.G; + + @EnviedField(varName: 'H', obfuscate: true) + static final String H = _Env.H; + + @EnviedField(varName: 'I', obfuscate: true) + static final String I = _Env.I; + + @EnviedField(varName: 'J', obfuscate: true) + static final String J = _Env.J; + + @EnviedField(varName: 'K', obfuscate: true) + static final String K = _Env.K; + + @EnviedField(varName: 'L', obfuscate: true) + static final String L = _Env.L; + + @EnviedField(varName: 'M', obfuscate: true) + static final String M = _Env.M; + + @EnviedField(varName: 'N', obfuscate: true) + static final String N = _Env.N; + + @EnviedField(varName: 'O', obfuscate: true) + static final String O = _Env.O; + + @EnviedField(varName: 'P', obfuscate: true) + static final String P = _Env.P; + + @EnviedField(varName: 'Q', obfuscate: true) + static final String Q = _Env.Q; + + @EnviedField(varName: 'R', obfuscate: true) + static final String R = _Env.R; + + @EnviedField(varName: 'S', obfuscate: true) + static final String S = _Env.S; + + @EnviedField(varName: 'T', obfuscate: true) + static final String T = _Env.T; + + @EnviedField(varName: 'U', obfuscate: true) + static final String U = _Env.U; + + @EnviedField(varName: 'V', obfuscate: true) + static final String V = _Env.V; + + @EnviedField(varName: 'W', obfuscate: true) + static final String W = _Env.W; + + @EnviedField(varName: 'X', obfuscate: true) + static final String X = _Env.X; + + @EnviedField(varName: 'Y', obfuscate: true) + static final String Y = _Env.Y; + + @EnviedField(varName: 'Z', obfuscate: true) + static final String Z = _Env.Z; + @EnviedField(varName: 'a', obfuscate: true) + static final String a = _Env.a; + + @EnviedField(varName: 'b', obfuscate: true) + static final String b = _Env.b; + + @EnviedField(varName: 'c', obfuscate: true) + static final String c = _Env.c; + + @EnviedField(varName: 'd', obfuscate: true) + static final String d = _Env.d; + + @EnviedField(varName: 'e', obfuscate: true) + static final String e = _Env.e; + + @EnviedField(varName: 'f', obfuscate: true) + static final String f = _Env.f; + + @EnviedField(varName: 'g', obfuscate: true) + static final String g = _Env.g; + + @EnviedField(varName: 'h', obfuscate: true) + static final String h = _Env.h; + + @EnviedField(varName: 'i', obfuscate: true) + static final String i = _Env.i; + + @EnviedField(varName: 'j', obfuscate: true) + static final String j = _Env.j; + + @EnviedField(varName: 'k', obfuscate: true) + static final String k = _Env.k; + + @EnviedField(varName: 'l', obfuscate: true) + static final String l = _Env.l; + + @EnviedField(varName: 'm', obfuscate: true) + static final String m = _Env.m; + + @EnviedField(varName: 'n', obfuscate: true) + static final String n = _Env.n; + + @EnviedField(varName: 'o', obfuscate: true) + static final String o = _Env.o; + + @EnviedField(varName: 'p', obfuscate: true) + static final String p = _Env.p; + + @EnviedField(varName: 'q', obfuscate: true) + static final String q = _Env.q; + + @EnviedField(varName: 'r', obfuscate: true) + static final String r = _Env.r; + + @EnviedField(varName: 's', obfuscate: true) + static final String s = _Env.s; + + @EnviedField(varName: 't', obfuscate: true) + static final String t = _Env.t; + + @EnviedField(varName: 'u', obfuscate: true) + static final String u = _Env.u; + + @EnviedField(varName: 'v', obfuscate: true) + static final String v = _Env.v; + + @EnviedField(varName: 'w', obfuscate: true) + static final String w = _Env.w; + + @EnviedField(varName: 'x', obfuscate: true) + static final String x = _Env.x; + + @EnviedField(varName: 'y', obfuscate: true) + static final String y = _Env.y; + + @EnviedField(varName: 'z', obfuscate: true) + static final String z = _Env.z; + + @EnviedField(varName: 'keyOfApp', obfuscate: true) + static final String keyOfApp = _Env.keyOfApp; + @EnviedField(varName: 'mapSaasKey', obfuscate: true) + static final String mapSaasKey = _Env.mapSaasKey; +} diff --git a/siro_rider/lib/env/env.g.dart b/siro_rider/lib/env/env.g.dart new file mode 100644 index 0000000..577c551 --- /dev/null +++ b/siro_rider/lib/env/env.g.dart @@ -0,0 +1,14414 @@ +// GENERATED CODE - DO NOT MODIFY BY HAND + +part of 'env.dart'; + +// ************************************************************************** +// EnviedGenerator +// ************************************************************************** + +// coverage:ignore-file +// ignore_for_file: type=lint +// generated_from: .env +final class _Env { + static const List _enviedkeybasicAuthCredentials = [ + 3519153949, + 3419152788, + 2912845944, + 3909856071, + 102024447, + 714276509, + 2069783984, + 849211503, + 2977836317, + 3699699576, + 2402219875, + 961575679, + 1650865858, + 1046325856, + 2964222366, + 449603406, + 2379104822, + 1146955300, + 3842537471, + 2541483040, + 4132204505, + 2003530930, + 1891068029, + 2946800660, + 1310424808, + 107780630, + 1852540733, + 3263688512, + 2685353940, + 2468261221, + 2642652816, + ]; + + static const List _envieddatabasicAuthCredentials = [ + 3519154026, + 3419152869, + 2912845846, + 3909856042, + 102024334, + 714276588, + 2069784003, + 849211397, + 2977836388, + 3699699470, + 2402219796, + 961575573, + 1650865844, + 1046325850, + 2964222448, + 449603391, + 2379104836, + 1146955389, + 3842537397, + 2541483120, + 4132204441, + 2003530883, + 1891067978, + 2946800679, + 1310424799, + 107780686, + 1852540751, + 3263688472, + 2685353912, + 2468261159, + 2642652924, + ]; + + static final String basicAuthCredentials = String.fromCharCodes( + List.generate( + _envieddatabasicAuthCredentials.length, + (int i) => i, + growable: false, + ).map((int i) => + _envieddatabasicAuthCredentials[i] ^ + _enviedkeybasicAuthCredentials[i])); + + static const List _enviedkeybasicCompareFaces = [ + 4286381358, + 2783755385, + 465264259, + 646224493, + 3681737418, + 3919080937, + 3622237151, + 225254801, + 1532412247, + 1873959070, + 585270922, + 2964749190, + 1898668606, + 1946995781, + 264559813, + 1278770603, + 3920666442, + 165926944, + 3650929431, + 3625515193, + 2649951911, + 3267881446, + 1914765737, + 2920899768, + 1763024911, + 2963930330, + 724492366, + 4039544587, + ]; + + static const List _envieddatabasicCompareFaces = [ + 4286381396, + 2783755283, + 465264374, + 646224391, + 3681737382, + 3919080860, + 3622237102, + 225254903, + 1532412199, + 1873959156, + 585270960, + 2964749288, + 1898668623, + 1946995767, + 264559772, + 1278770625, + 3920666426, + 165927008, + 3650929446, + 3625515150, + 2649951892, + 3267881425, + 1914765809, + 2920899786, + 1763024983, + 2963930294, + 724492300, + 4039544679, + ]; + + static final String basicCompareFaces = String.fromCharCodes( + List.generate( + _envieddatabasicCompareFaces.length, + (int i) => i, + growable: false, + ).map((int i) => + _envieddatabasicCompareFaces[i] ^ _enviedkeybasicCompareFaces[i])); + + static const List _enviedkeymapKeyOsm = [ + 3060640001, + 346960127, + 3314294098, + 1030012865, + 1437698263, + 3190131666, + 2624192467, + 2853195809, + 1233109344, + 1470699485, + 411546398, + 3054601556, + 1444666290, + 616257806, + 978664394, + 1949900018, + 224395886, + 1412872648, + 3712784326, + 3736141696, + ]; + + static const List _envieddatamapKeyOsm = [ + 3060640108, + 346960030, + 3314294078, + 1030012837, + 1437698226, + 3190131620, + 2624192403, + 2853195859, + 1233109263, + 1470699432, + 411546474, + 3054601521, + 1444666271, + 616257898, + 978664357, + 1949899934, + 224395778, + 1412872617, + 3712784308, + 3736141811, + ]; + + static final String mapKeyOsm = String.fromCharCodes(List.generate( + _envieddatamapKeyOsm.length, + (int i) => i, + growable: false, + ).map((int i) => _envieddatamapKeyOsm[i] ^ _enviedkeymapKeyOsm[i])); + + static const List _enviedkeysss_encryptionSalt = [ + 902995399, + 2082203168, + 608200472, + 3584549682, + 3526956967, + 1881872666, + 2714911356, + 369459796, + 127644444, + 1211822634, + 3470051956, + 3046171699, + 2291535080, + 1755988754, + 3700187058, + 3030591870, + 3224275007, + 1031599735, + 1059479386, + 866222866, + 2494005963, + 1360770546, + 1386678821, + 1686614589, + 2607926240, + 3793974732, + 2823271241, + 706783331, + 3090213729, + 2477052953, + 3922184543, + 3219031649, + 2592858459, + 355801982, + 1028727755, + 1182572517, + 538643747, + 2531875289, + 3113120603, + 2462836846, + 1940765394, + 3268088823, + 1377490059, + 2529292059, + 66366670, + 3350175850, + 636154059, + 1013090096, + 3452064708, + 3630448218, + 1330216132, + 2199017650, + 2506020598, + 3057880454, + 2847145832, + 845501714, + 747272912, + 4125075200, + 1691612427, + 705354137, + 4101017401, + 2138745081, + 1362275669, + ]; + + static const List _envieddatasss_encryptionSalt = [ + 902995389, + 2082203207, + 608200501, + 3584549700, + 3526957004, + 1881872758, + 2714911253, + 369459761, + 127644465, + 1211822616, + 3470051864, + 3046171650, + 2291535026, + 1755988862, + 3700187074, + 3030591750, + 3224275030, + 1031599675, + 1059479312, + 866222884, + 2494005948, + 1360770467, + 1386678890, + 1686614603, + 2607926146, + 3793974702, + 2823271293, + 706783287, + 3090213647, + 2477053018, + 3922184550, + 3219031609, + 2592858409, + 355801862, + 1028727724, + 1182572464, + 538643814, + 2531875232, + 3113120525, + 2462836799, + 1940765339, + 3268088706, + 1377490109, + 2529292111, + 66366599, + 3350175790, + 636154111, + 1013090113, + 3452064660, + 3630448238, + 1330216066, + 2199017703, + 2506020515, + 3057880567, + 2847145735, + 845501761, + 747272933, + 4125075288, + 1691612537, + 705354177, + 4101017429, + 2138745019, + 1362275641, + ]; + + static final String sss_encryptionSalt = String.fromCharCodes( + List.generate( + _envieddatasss_encryptionSalt.length, + (int i) => i, + growable: false, + ).map((int i) => + _envieddatasss_encryptionSalt[i] ^ _enviedkeysss_encryptionSalt[i])); + + static const List _enviedkeysss_pass = [ + 1893471899, + 2349608271, + 2983057176, + 42644819, + 2638824772, + 4026985743, + 2374941959, + 584830455, + 3974535578, + 4215338506, + 3545242246, + 2709426585, + 1043321232, + 3404331437, + 3575242362, + 202302309, + 2996236292, + 405843549, + 2047297606, + 2588784733, + 3390222770, + 1144256972, + 87840572, + 1548393091, + 3763518616, + 1813426160, + 221621844, + 3288149861, + 3473079977, + 2136666060, + 2384050155, + 3175739836, + ]; + + static const List _envieddatasss_pass = [ + 1893471980, + 2349608254, + 2983057270, + 42644798, + 2638824757, + 4026985854, + 2374942068, + 584830365, + 3974535651, + 4215338620, + 3545242353, + 2709426671, + 1043321258, + 3404331459, + 3575242251, + 202302231, + 2996236393, + 405843460, + 2047297548, + 2588784653, + 3390222834, + 1144257021, + 87840523, + 1548393136, + 3763518639, + 1813426120, + 221621772, + 3288149783, + 3473080049, + 2136666016, + 2384050089, + 3175739856, + ]; + + static final String sss_pass = String.fromCharCodes(List.generate( + _envieddatasss_pass.length, + (int i) => i, + growable: false, + ).map((int i) => _envieddatasss_pass[i] ^ _enviedkeysss_pass[i])); + + static const List _enviedkeyaddd = [ + 1709166897, + 714388966, + 2668633056, + 3742156675, + 2560938715, + 734197165, + ]; + + static const List _envieddataaddd = [ + 1709166963, + 714388874, + 2668632994, + 3742156783, + 2560938645, + 734197185, + ]; + + static final String addd = String.fromCharCodes(List.generate( + _envieddataaddd.length, + (int i) => i, + growable: false, + ).map((int i) => _envieddataaddd[i] ^ _enviedkeyaddd[i])); + + static const List _enviedkeypassnpassenger = [ + 846546532, + 687274896, + 1685022243, + 427065348, + 779427125, + 3173652022, + 3882681850, + 2203988661, + 1380572535, + 703673650, + 561238537, + 1739009496, + 228518013, + ]; + + static const List _envieddatapassnpassenger = [ + 846546444, + 687274994, + 1685022276, + 427065446, + 779427164, + 3173652034, + 3882681752, + 2203988717, + 1380572421, + 703673706, + 561238651, + 1739009434, + 228517903, + ]; + + static final String passnpassenger = String.fromCharCodes(List.generate( + _envieddatapassnpassenger.length, + (int i) => i, + growable: false, + ).map((int i) => _envieddatapassnpassenger[i] ^ _enviedkeypassnpassenger[i])); + + static const List _enviedkeynewId = [ + 3177290336, + 2883773472, + 1829415982, + ]; + + static const List _envieddatanewId = [ + 3177290254, + 2883773509, + 1829416025, + ]; + + static final String newId = String.fromCharCodes(List.generate( + _envieddatanewId.length, + (int i) => i, + growable: false, + ).map((int i) => _envieddatanewId[i] ^ _enviedkeynewId[i])); + + static const List _enviedkeyallowed = [ + 163381300, + 899410917, + 1297047114, + 1832468776, + 3165108443, + 4096998934, + 1490676685, + 1439973606, + 1048426519, + 3481102174, + 3456066742, + ]; + + static const List _envieddataallowed = [ + 163381337, + 899410826, + 1297047080, + 1832468801, + 3165108407, + 4096999027, + 1490676704, + 1439973511, + 1048426599, + 3481102126, + 3456066700, + ]; + + static final String allowed = String.fromCharCodes(List.generate( + _envieddataallowed.length, + (int i) => i, + growable: false, + ).map((int i) => _envieddataallowed[i] ^ _enviedkeyallowed[i])); + + static const List _enviedkeyallowedWallet = [ + 1787088871, + 2569911000, + 2442601235, + 1064597121, + 3007662749, + 3522810039, + 3300121391, + 2570607599, + 635715896, + 1576453486, + 2027601924, + 1433393895, + ]; + + static const List _envieddataallowedWallet = [ + 1787088819, + 2569910954, + 2442601338, + 1064597233, + 3007662823, + 3522810080, + 3300121422, + 2570607491, + 635715924, + 1576453387, + 2027602032, + 1433393885, + ]; + + static final String allowedWallet = String.fromCharCodes(List.generate( + _envieddataallowedWallet.length, + (int i) => i, + growable: false, + ).map((int i) => _envieddataallowedWallet[i] ^ _enviedkeyallowedWallet[i])); + + static const List _enviedkeyapiKeyHere = [ + 3593880178, + 4037354333, + 3115330823, + 3329221346, + 1285131282, + 2636057146, + 4122318862, + 1399352256, + 4202661619, + 196131400, + 424123635, + 87673298, + 2749725413, + 1375039539, + 377452600, + 3464350483, + 3865363635, + 1938149974, + 128348290, + 2825817234, + 2004248264, + 684762773, + 2349236384, + 1600339859, + 2291218709, + 107894378, + 3964540342, + 2834440759, + 2545967188, + 1492688522, + 1085528836, + 457442101, + 3456842820, + 3303081587, + 433115674, + 2105832970, + 505826677, + 3046221728, + 965857228, + 3181483455, + 3364668708, + 3344406113, + 2708986004, + 1134352949, + 3161263094, + 1094800141, + 1388977956, + 1664409105, + 1405638671, + ]; + + static const List _envieddataapiKeyHere = [ + 3593880085, + 4037354242, + 3115330896, + 3329221292, + 1285131335, + 2636057176, + 4122318907, + 1399352204, + 4202661598, + 196131388, + 424123521, + 87673275, + 2749725333, + 1375039561, + 377452559, + 3464350526, + 3865363701, + 1938149998, + 128348397, + 2825817343, + 2004248192, + 684762853, + 2349236469, + 1600339966, + 2291218802, + 107894307, + 3964540364, + 2834440831, + 2545967203, + 1492688591, + 1085528912, + 457442128, + 3456842764, + 3303081546, + 433115746, + 2105833040, + 505826637, + 3046221810, + 965857211, + 3181483512, + 3364668771, + 3344406104, + 2708986059, + 1134353010, + 3161263054, + 1094800247, + 1388978044, + 1664409128, + 1405638734, + ]; + + static final String apiKeyHere = String.fromCharCodes(List.generate( + _envieddataapiKeyHere.length, + (int i) => i, + growable: false, + ).map((int i) => _envieddataapiKeyHere[i] ^ _enviedkeyapiKeyHere[i])); + + static const List _enviedkeygetLocationAreaLinks = [ + 1030983922, + 1830364909, + 4257635333, + 2070459031, + 2874292621, + 3209331280, + 3419006876, + 4108543843, + 2552056646, + 1917135110, + 1334924226, + 893905685, + 2788423083, + 340412531, + 4069627648, + 3309198037, + 3919220751, + 2102262303, + 2507660039, + 4214099604, + 2154338237, + 1832691520, + 4250994444, + 2295963708, + 1171285399, + 1996340564, + 72923603, + 3905128695, + 1174399797, + 2243956636, + 3444206530, + 2218631810, + 524164796, + 1238945992, + 3954227757, + 2187942734, + 1868459471, + 353049418, + 348793190, + 2570486058, + 1157308117, + 1607877570, + 540613580, + 4135556821, + 2689807102, + 1011590630, + 1193275234, + 2447038561, + 56196918, + 746761441, + 1870817297, + 2799609826, + 801490819, + 3321627056, + 3688403481, + 81886784, + 2611774327, + 570211596, + 993975372, + 1503632901, + 1042014144, + 538424138, + 2058773924, + 2531437694, + 2954615420, + 261974006, + 1020664114, + 3048633794, + 2032689135, + 3297900598, + 3176408977, + 455944069, + 2406241870, + 4203167376, + 62851156, + ]; + + static const List _envieddatagetLocationAreaLinks = [ + 1030983834, + 1830364825, + 4257635441, + 2070459111, + 2874292734, + 3209331306, + 3419006899, + 4108543820, + 2552056615, + 1917135222, + 1334924203, + 893905723, + 2788423135, + 340412417, + 4069627753, + 3309197989, + 3919220853, + 2102262322, + 2507660130, + 4214099699, + 2154338244, + 1832691504, + 4250994552, + 2295963666, + 1171285492, + 1996340539, + 72923582, + 3905128664, + 1174399809, + 2243956718, + 3444206507, + 2218631922, + 524164806, + 1238946023, + 3954227807, + 2187942695, + 1868459435, + 353049391, + 348793161, + 2570486086, + 1157308090, + 1607877537, + 540613549, + 4135556769, + 2689806999, + 1011590537, + 1193275148, + 2447038542, + 56196945, + 746761348, + 1870817381, + 2799609789, + 801490927, + 3321627103, + 3688403578, + 81886753, + 2611774211, + 570211685, + 993975331, + 1503633003, + 1042014111, + 538424107, + 2058773974, + 2531437595, + 2954615325, + 261973929, + 1020664158, + 3048633771, + 2032689025, + 3297900637, + 3176409058, + 455944107, + 2406241854, + 4203167480, + 62851108, + ]; + + static final String getLocationAreaLinks = String.fromCharCodes( + List.generate( + _envieddatagetLocationAreaLinks.length, + (int i) => i, + growable: false, + ).map((int i) => + _envieddatagetLocationAreaLinks[i] ^ + _enviedkeygetLocationAreaLinks[i])); + + static const List _enviedkeyinitializationVector = [ + 3611405044, + 1380641868, + 1273467373, + 135561897, + 118679966, + 3614237367, + 1922052817, + 44719497, + 925787378, + 440289953, + 2851169437, + 323580025, + 1402542113, + 1981761193, + 3861396433, + 3368225369, + 4095292677, + 2919502404, + 1519960212, + 77225798, + 3334486119, + 42270059, + ]; + + static const List _envieddatainitializationVector = [ + 3611404933, + 1380641844, + 1273467275, + 135561936, + 118680052, + 3614237378, + 1922052794, + 44719614, + 925787293, + 440289988, + 2851169530, + 323579915, + 1402542159, + 1981761227, + 3861396408, + 3368225327, + 4095292765, + 2919502390, + 1519960268, + 77225780, + 3334486053, + 42269977, + ]; + + static final String initializationVector = String.fromCharCodes( + List.generate( + _envieddatainitializationVector.length, + (int i) => i, + growable: false, + ).map((int i) => + _envieddatainitializationVector[i] ^ + _enviedkeyinitializationVector[i])); + + static const List _enviedkeybasicCompareFacesURL = [ + 2963278999, + 1231706159, + 1237829897, + 4164326574, + 1203544259, + 419803506, + 2563430362, + 1145147898, + 4266713877, + 1687422842, + 3789397071, + 2940343940, + 369248159, + 26053090, + 1032102515, + 3003665131, + 4209090589, + 169818371, + 3264705697, + 2683002705, + 1656427848, + 2918553424, + 3219753291, + 1325749876, + 59503219, + 3045734554, + 566252987, + 3551738816, + 618970155, + 3815690867, + 3857590562, + 3591437638, + 401634963, + 4087492929, + 3993538514, + 1037866011, + 4195104667, + 2387751973, + 2952442828, + 826838868, + 4252250418, + 2857196284, + 3186847572, + 1241236113, + 2515367635, + 1402161508, + 1350867777, + 2838494564, + 3444584791, + 496640011, + 3883749492, + 2097541549, + 3312862646, + 3542005587, + 2000363680, + 2764561888, + 1454472523, + 3973161279, + 3753781162, + 4282368754, + ]; + + static const List _envieddatabasicCompareFacesURL = [ + 2963279103, + 1231706203, + 1237830013, + 4164326622, + 1203544240, + 419803464, + 2563430389, + 1145147861, + 4266713971, + 1687422747, + 3789397036, + 2940344033, + 369248178, + 26052998, + 1032102422, + 3003665055, + 4209090680, + 169818464, + 3264705749, + 2683002748, + 1656427822, + 2918553446, + 3219753330, + 1325749830, + 59503175, + 3045734569, + 566252930, + 3551738866, + 618970184, + 3815690823, + 3857590593, + 3591437681, + 401635005, + 4087492905, + 3993538487, + 1037866089, + 4195104756, + 2387752014, + 2952442809, + 826838837, + 4252250434, + 2857196172, + 3186847610, + 1241236210, + 2515367612, + 1402161417, + 1350867822, + 2838494471, + 3444584760, + 496640102, + 3883749380, + 2097541580, + 3312862660, + 3542005558, + 2000363775, + 2764561798, + 1454472490, + 3973161308, + 3753781199, + 4282368641, + ]; + + static final String basicCompareFacesURL = String.fromCharCodes( + List.generate( + _envieddatabasicCompareFacesURL.length, + (int i) => i, + growable: false, + ).map((int i) => + _envieddatabasicCompareFacesURL[i] ^ + _enviedkeybasicCompareFacesURL[i])); + + static const List _enviedkeyaccountSIDTwillo = [ + 3421322762, + 2857483697, + 1955904938, + 1002131221, + 1252992660, + 3903676813, + 1638675655, + 3125190302, + 471338879, + 2533329970, + 4172061735, + 3395523882, + 262355352, + 1111191083, + 3582071858, + 4212909896, + 3262824484, + 3408108420, + 221460951, + 1865913905, + 2183473689, + 3314271961, + 2123442263, + 2285068125, + 950274046, + 3765122410, + 1820216594, + 3752290337, + 2150546053, + 2417151322, + 2200004699, + 2374999429, + 2513609130, + 3373568499, + 1051756201, + 38199397, + 1252504835, + 3155932201, + 1936810569, + 1914142812, + 3795479208, + ]; + + static const List _envieddataaccountSIDTwillo = [ + 3421322843, + 2857483767, + 1955904978, + 1002131237, + 1252992741, + 3903676916, + 1638675699, + 3125190315, + 471338825, + 2533330008, + 4172061778, + 3395523904, + 262355371, + 1111191059, + 3582071809, + 4212909862, + 3262824477, + 3408108540, + 221460898, + 1865913928, + 2183473707, + 3314271976, + 2123442286, + 2285068137, + 950273935, + 3765122396, + 1820216608, + 3752290328, + 2150546164, + 2417151339, + 2200004669, + 2374999535, + 2513609114, + 3373568394, + 1051756190, + 38199357, + 1252504945, + 3155932273, + 1936810533, + 1914142750, + 3795479236, + ]; + + static final String accountSIDTwillo = String.fromCharCodes( + List.generate( + _envieddataaccountSIDTwillo.length, + (int i) => i, + growable: false, + ).map((int i) => + _envieddataaccountSIDTwillo[i] ^ _enviedkeyaccountSIDTwillo[i])); + + static const List _enviedkeyserverAPI = [ + 3030481933, + 561731687, + 1532468078, + 1841881342, + 3767318582, + 2729953903, + 2148714654, + 715605698, + 3361375633, + 1580309697, + 3136913287, + 2879767580, + 4054265575, + 438717263, + 3463805833, + 3239706292, + 3199814531, + 1839544413, + 2332305922, + 285504926, + 3463188451, + 1995243562, + 1826351244, + 2233571696, + 2792829828, + 759113286, + 3865259689, + 661625175, + 2471558285, + 2389747341, + 2380997961, + 3079386356, + 2776300218, + 2908135291, + 384810040, + 2345532123, + 3322230495, + 4115556331, + 903800075, + 1697115129, + 815029601, + 4010386958, + 3042825640, + 2782017991, + 4190416181, + 3779270322, + 1152131118, + 3726609728, + 2617153740, + 141497699, + 1042108120, + 3991368088, + 2193296480, + 2292270379, + 2268330230, + 1982646414, + 719126335, + 1489335517, + 1039370592, + 3398934773, + 1468453387, + 44241409, + 2946069235, + 1084815681, + 4147598144, + 3333411372, + 3449275664, + 52122604, + 1203902763, + 3073124928, + 3598641133, + 3414445114, + 3662147358, + 4168900863, + 3346502965, + 3912207598, + 2712653385, + 1193782938, + 435958833, + 2117539689, + 3683582843, + 2970678956, + 1069484622, + 3682945222, + 4173875370, + 665857694, + 2080896536, + 931921475, + 3419181311, + 3783734052, + 2624902460, + 3021927546, + 1840830698, + 878242419, + 2643783826, + 577583084, + 3382465826, + 2988376195, + 4246655135, + 2413284050, + 902828880, + 1590761919, + 1401586537, + 20073247, + 475617636, + 4294289045, + 2355132819, + 2927711333, + 3749093655, + 709784377, + 666786023, + 1297361891, + 4135437155, + 289723421, + 3953242104, + 1491418928, + 3625744521, + 395040664, + 403841843, + 3997897032, + 2017814758, + 1440850690, + 1402305980, + 1206349808, + 1456809692, + 2878200037, + 4244717068, + 1298661842, + 3525663166, + 716070213, + 4165832518, + 2594039137, + 1620855140, + 2715611197, + 3944530774, + 3038387789, + 2919090311, + 1217557740, + 3002762851, + 1868403459, + 2876075962, + 2891020877, + 4054243556, + 4068284405, + 2339901513, + 2003545733, + 1254196169, + 3426796080, + 2576315786, + 2178899200, + 3834253677, + 3213527118, + 1676097518, + 4076564366, + 3577752839, + 3911289599, + 4055507396, + 4072059363, + ]; + + static const List _envieddataserverAPI = [ + 3030482012, + 561731638, + 1532468031, + 1841881263, + 3767318617, + 2729953805, + 2148714701, + 715605680, + 3361375715, + 1580309639, + 3136913390, + 2879767590, + 4054265526, + 438717209, + 3463805912, + 3239706252, + 3199814580, + 1839544357, + 2332306007, + 285504937, + 3463188377, + 1995243613, + 1826351311, + 2233571590, + 2792829929, + 759113244, + 3865259731, + 661625101, + 2471558377, + 2389747436, + 2380997937, + 3079386241, + 2776300265, + 2908135241, + 384810078, + 2345532137, + 3322230508, + 4115556274, + 903800127, + 1697115028, + 815029531, + 4010387001, + 3042825701, + 2782017981, + 4190416204, + 3779270397, + 1152131156, + 3726609714, + 2617153780, + 141497612, + 1042108092, + 3991368106, + 2193296386, + 2292270425, + 2268330176, + 1982646469, + 719126374, + 1489335460, + 1039370501, + 3398934707, + 1468453482, + 44241493, + 2946069157, + 1084815629, + 4147598087, + 3333411359, + 3449275739, + 52122591, + 1203902787, + 3073124920, + 3598641112, + 3414445152, + 3662147455, + 4168900778, + 3346502988, + 3912207510, + 2712653438, + 1193783039, + 435958888, + 2117539615, + 3683582778, + 2970679029, + 1069484606, + 3682945159, + 4173875452, + 665857786, + 2080896595, + 931921448, + 3419181266, + 3783734038, + 2624902404, + 3021927500, + 1840830628, + 878242343, + 2643783872, + 577582981, + 3382465809, + 2988376313, + 4246655212, + 2413284075, + 902828857, + 1590761964, + 1401586470, + 20073329, + 475617596, + 4294289121, + 2355132875, + 2927711287, + 3749093726, + 709784385, + 666785940, + 1297361812, + 4135437060, + 289723438, + 3953242035, + 1491418965, + 3625744618, + 395040730, + 403841886, + 3997897019, + 2017814666, + 1440850737, + 1402306026, + 1206349704, + 1456809622, + 2878200028, + 4244717179, + 1298661789, + 3525663123, + 716070195, + 4165832463, + 2594039057, + 1620855059, + 2715611208, + 3944530786, + 3038387741, + 2919090417, + 1217557723, + 3002762759, + 1868403560, + 2876076018, + 2891020838, + 4054243516, + 4068284315, + 2339901472, + 2003545840, + 1254196145, + 3426796157, + 2576315865, + 2178899268, + 3834253578, + 3213527065, + 1676097462, + 4076564476, + 3577752927, + 3911289491, + 4055507334, + 4072059279, + ]; + + static final String serverAPI = String.fromCharCodes(List.generate( + _envieddataserverAPI.length, + (int i) => i, + growable: false, + ).map((int i) => _envieddataserverAPI[i] ^ _enviedkeyserverAPI[i])); + + static const List _enviedkeymapAPIKEY = [ + 139422818, + 1274894117, + 705367475, + 190715590, + 2885381275, + 1237552208, + 789992513, + 4210300781, + 831066256, + 1670337347, + 2374393620, + 1329777940, + 3323028931, + 211302211, + 500539022, + 189099516, + 3783448816, + 2865288645, + 954999734, + 3741670607, + 630560556, + 553973186, + 2622942441, + 753712015, + 2703584814, + 577897202, + 3848612565, + 968474137, + 2517180679, + 2557601828, + 1665477934, + 4217909129, + 2053579784, + 2709411570, + 800576793, + 2802364580, + 1739054168, + 185352856, + 3397262411, + ]; + + static const List _envieddatamapAPIKEY = [ + 139422755, + 1274894188, + 705367497, + 190715559, + 2885381320, + 1237552169, + 789992448, + 4210300733, + 831066326, + 1670337297, + 2374393675, + 1329777996, + 3323028897, + 211302161, + 500539072, + 189099468, + 3783448744, + 2865288607, + 954999683, + 3741670534, + 630560598, + 553973233, + 2622942376, + 753712086, + 2703584874, + 577897112, + 3848612507, + 968474176, + 2517180751, + 2557601891, + 1665477988, + 4217909198, + 2053579834, + 2709411457, + 800576811, + 2802364661, + 1739054095, + 185352943, + 3397262342, + ]; + + static final String mapAPIKEY = String.fromCharCodes(List.generate( + _envieddatamapAPIKEY.length, + (int i) => i, + growable: false, + ).map((int i) => _envieddatamapAPIKEY[i] ^ _enviedkeymapAPIKEY[i])); + + static const List _enviedkeymapAPIKEYIOS = [ + 501088550, + 666539920, + 4053119542, + 1824218517, + 2072254230, + 1706975033, + 3890071339, + 3548546957, + 1454318904, + 3829309755, + 2379226428, + 582640862, + 1409675323, + 2677261074, + 116284009, + 2837382892, + 131049603, + 3570702196, + 667973366, + 93631426, + 1310172929, + 3364464954, + 1899319673, + 476934999, + 351204332, + 935705275, + 2626325896, + 689073005, + 3190766987, + 3120074678, + 165345389, + 700148630, + 2884292999, + 1431652494, + 2619573134, + 1382531073, + 91332797, + 2433499408, + 329003519, + ]; + + static const List _envieddatamapAPIKEYIOS = [ + 501088615, + 666539993, + 4053119564, + 1824218612, + 2072254277, + 1706975040, + 3890071407, + 3548547049, + 1454318921, + 3829309776, + 2379226480, + 582640787, + 1409675384, + 2677261152, + 116283928, + 2837382790, + 131049685, + 3570702086, + 667973272, + 93631477, + 1310173017, + 3364464983, + 1899319576, + 476934963, + 351204261, + 935705290, + 2626326001, + 689072899, + 3190767090, + 3120074713, + 165345327, + 700148727, + 2884293040, + 1431652574, + 2619573180, + 1382531126, + 91332850, + 2433499509, + 329003442, + ]; + + static final String mapAPIKEYIOS = String.fromCharCodes(List.generate( + _envieddatamapAPIKEYIOS.length, + (int i) => i, + growable: false, + ).map((int i) => _envieddatamapAPIKEYIOS[i] ^ _enviedkeymapAPIKEYIOS[i])); + + static const List _enviedkeytwilloRecoveryCode = [ + 1803060704, + 221967584, + 432835583, + 1821726476, + 1226349559, + 3763530154, + 544814582, + 3629646694, + 201594051, + 2259326998, + 210178147, + 1274638712, + 1983209288, + 817991099, + 1380881987, + 2385653800, + 3524466903, + 2729798748, + 1380416107, + 445670555, + 3455719338, + 30921306, + 1021685465, + 2215645380, + 215122366, + 1249478418, + 551708365, + 2828195025, + 1800874424, + 1813381215, + 905465401, + ]; + + static const List _envieddatatwilloRecoveryCode = [ + 1803060643, + 221967521, + 432835498, + 1821726523, + 1226349518, + 3763530222, + 544814526, + 3629646646, + 201593995, + 2259327015, + 210178081, + 1274638610, + 1983209229, + 817991042, + 1380881939, + 2385653885, + 3524466847, + 2729798760, + 1380416046, + 445670607, + 3455719410, + 30921230, + 1021685386, + 2215645340, + 215122404, + 1249478474, + 551708351, + 2828194953, + 1800874452, + 1813381149, + 905465429, + ]; + + static final String twilloRecoveryCode = String.fromCharCodes( + List.generate( + _envieddatatwilloRecoveryCode.length, + (int i) => i, + growable: false, + ).map((int i) => + _envieddatatwilloRecoveryCode[i] ^ _enviedkeytwilloRecoveryCode[i])); + + static const List _enviedkeyauthTokenTwillo = [ + 2605337086, + 253218539, + 1242078840, + 2571064566, + 2196923648, + 2996759701, + 2230313950, + 1379900346, + 2385774154, + 1278838377, + 3274709234, + 2950264869, + 1792474851, + 416552561, + 208109492, + 2473448525, + 1955114809, + 3148084352, + 3002432679, + 824898019, + 863883499, + 3849369907, + 748322049, + 3653825883, + 2668352116, + 781505256, + 1926531563, + 1126055465, + 1448047978, + 1887032217, + 2204162845, + 2965026673, + 2408707734, + 1763826856, + 3815008732, + 1651050897, + 2703845745, + 3052539282, + 1291302794, + ]; + + static const List _envieddataauthTokenTwillo = [ + 2605337033, + 253218523, + 1242078733, + 2571064527, + 2196923704, + 2996759807, + 2230313899, + 1379900298, + 2385774200, + 1278838360, + 3274709190, + 2950264906, + 1792474779, + 416552457, + 208109440, + 2473448508, + 1955114761, + 3148084469, + 3002432656, + 824898007, + 863883483, + 3849369857, + 748322105, + 3653825838, + 2668352068, + 781505242, + 1926531546, + 1126055516, + 1448047966, + 1887032296, + 2204162920, + 2965026631, + 2408707747, + 1763826928, + 3815008686, + 1651050953, + 2703845661, + 3052539344, + 1291302886, + ]; + + static final String authTokenTwillo = String.fromCharCodes(List.generate( + _envieddataauthTokenTwillo.length, + (int i) => i, + growable: false, + ).map( + (int i) => _envieddataauthTokenTwillo[i] ^ _enviedkeyauthTokenTwillo[i])); + + static const List _enviedkeychatGPTkey = [ + 242389158, + 388191645, + 3905146314, + 1403215961, + 3224564508, + 350206627, + 616380616, + 2744215402, + 2923495073, + 548064766, + 3735391137, + 3834695638, + 906577526, + 2430929318, + 3767592332, + 2513066538, + 3933033600, + 1973603880, + 3000413891, + 917868357, + 3972029993, + 3413133128, + 1051136169, + 654488403, + 318621822, + 23601985, + 467751169, + 1259904615, + 1741531364, + 925428555, + 4013970699, + 3029798037, + 3371318464, + 3333039117, + 251851895, + 421179081, + 1927806760, + 763427961, + 2049921264, + 704701071, + 2677604537, + 3127931526, + 2675794296, + 3336932672, + 1808943782, + 4114362634, + 747091065, + 3482486270, + 632451631, + 2476307458, + 1019029766, + 137606893, + 2496755630, + 21526636, + 790264907, + 1732060293, + 1714553635, + 338936958, + ]; + + static const List _envieddatachatGPTkey = [ + 242389212, + 388191738, + 3905146343, + 1403215981, + 3224564575, + 350206609, + 616380670, + 2744215323, + 2923495061, + 548064685, + 3735391224, + 3834695601, + 906577460, + 2430929389, + 3767592413, + 2513066575, + 3933033672, + 1973603954, + 3000413831, + 917868340, + 3972030018, + 3413133087, + 1051136198, + 654488356, + 318621757, + 23602040, + 467751257, + 1259904533, + 1741531292, + 925428524, + 4013970782, + 3029798096, + 3371318438, + 3333039192, + 251851790, + 421179120, + 1927806818, + 763427883, + 2049921159, + 704701117, + 2677604555, + 3127931627, + 2675794254, + 3336932625, + 1808943764, + 4114362731, + 747090973, + 3482486172, + 632451612, + 2476307561, + 1019029868, + 137606810, + 2496755702, + 21526558, + 790264851, + 1732060393, + 1714553697, + 338936850, + ]; + + static final String chatGPTkey = String.fromCharCodes(List.generate( + _envieddatachatGPTkey.length, + (int i) => i, + growable: false, + ).map((int i) => _envieddatachatGPTkey[i] ^ _enviedkeychatGPTkey[i])); + + static const List _enviedkeytransactionCloude = [ + 1605517145, + 847036972, + 831201678, + 729285444, + 848447233, + 4232095709, + 2082361366, + 2495967342, + 534375107, + 2433952400, + 3151805455, + 1904326700, + 2527588209, + 164211966, + 758130668, + 3061164117, + 2662655498, + 943757324, + 456332828, + 910736731, + 4132294739, + 2736082735, + 99702804, + 2422846406, + 3549833802, + 344519539, + 2658163168, + 3273986910, + 1853442086, + 2687901792, + 3489667203, + 2421139504, + 2464001680, + 2440855538, + 3469916602, + 3071175721, + 3570873517, + 3516310567, + 97276872, + 3565398609, + 1488924307, + 2453451722, + 2278608336, + 251894312, + 1505616939, + 2547870165, + 2913618629, + 1049738335, + 772639180, + 1811076655, + 3760483362, + 2880001146, + 3208833118, + 1804865667, + 1770524918, + 168238452, + 3749409902, + 194472735, + 3785911494, + 2675977572, + 2247994263, + 902945434, + ]; + + static const List _envieddatatransactionCloude = [ + 1605517064, + 847036996, + 831201773, + 729285427, + 848447348, + 4232095668, + 2082361466, + 2495967233, + 534375086, + 2433952481, + 3151805548, + 1904326723, + 2527588120, + 164211868, + 758130646, + 3061164036, + 2662655580, + 943757379, + 456332867, + 910736657, + 4132294685, + 2736082806, + 99702865, + 2422846338, + 3549833848, + 344519467, + 2658163127, + 3273986847, + 1853442068, + 2687901782, + 3489667290, + 2421139560, + 2464001755, + 2440855473, + 3469916552, + 3071175805, + 3570873597, + 3516310557, + 97276817, + 3565398554, + 1488924322, + 2453451662, + 2278608262, + 251894368, + 1505616925, + 2547870086, + 2913618575, + 1049738269, + 772639231, + 1811076638, + 3760483436, + 2880001097, + 3208833038, + 1804865734, + 1770524871, + 168238369, + 3749409846, + 194472813, + 3785911454, + 2675977480, + 2247994325, + 902945526, + ]; + + static final String transactionCloude = String.fromCharCodes( + List.generate( + _envieddatatransactionCloude.length, + (int i) => i, + growable: false, + ).map((int i) => + _envieddatatransactionCloude[i] ^ _enviedkeytransactionCloude[i])); + + static const List _enviedkeyvisionApi = [ + 1097886132, + 3985866682, + 1524130217, + 2017777195, + 2473862255, + 2350128703, + 2120998776, + 4080028120, + 3590458402, + 1659718715, + 949059994, + 4079865077, + 3981420106, + 1990419615, + 3168376197, + 1728834287, + 4180401915, + 1781248630, + 2088244042, + 728927130, + 828324160, + 3481584062, + 2380366331, + 3845685290, + 2535277535, + 2196147607, + 2905796053, + 2446586623, + 2305220679, + 471959978, + 1374719153, + 3706601957, + 299827297, + 1138908884, + 2020617516, + 605697912, + 3713560841, + 2146932887, + ]; + + static const List _envieddatavisionApi = [ + 1097886087, + 3985866698, + 1524130280, + 2017777255, + 2473862172, + 2350128718, + 2120998699, + 4080028043, + 3590458491, + 1659718767, + 949060076, + 4079864975, + 3981420090, + 1990419625, + 3168376252, + 1728834238, + 4180401870, + 1781248560, + 2088243975, + 728927187, + 828324135, + 3481584092, + 2380366209, + 3845685312, + 2535277464, + 2196147617, + 2905795983, + 2446586574, + 2305220669, + 471960001, + 1374719173, + 3706601903, + 299827257, + 1138908838, + 2020617588, + 605697812, + 3713560907, + 2146932987, + ]; + + static final String visionApi = String.fromCharCodes(List.generate( + _envieddatavisionApi.length, + (int i) => i, + growable: false, + ).map((int i) => _envieddatavisionApi[i] ^ _enviedkeyvisionApi[i])); + + static const List _enviedkeysecretKey = [ + 4015336164, + 4294548072, + 436876341, + 3447150205, + 2949338070, + 4168115423, + 3831479947, + 2455497239, + 3318553548, + 3719678846, + 3143306693, + 2640311066, + 2781547097, + 3667788788, + 1069759370, + 3997190465, + 2079023732, + 3601413803, + 1246461120, + 2202454754, + 2895945296, + 2204185410, + 2095826370, + 3463443610, + 1469909706, + 689086128, + 123808287, + 360820091, + 3124020903, + 854007359, + 17959094, + 3166300703, + 1920913995, + 2167525277, + 2429935079, + 2679882670, + 4029844546, + 176479569, + 2897991528, + 2019932741, + 3122532927, + 4206737031, + 4112353882, + 2475750662, + 345881429, + 1949749200, + 2998244026, + 939489372, + 4225302176, + 1399356340, + 3394717684, + 2846691720, + 140799259, + 1229086340, + 2412393965, + 630987670, + 1173372796, + 498474180, + 4167759607, + 927891759, + 1638991689, + 1465633907, + 1564880863, + 975813684, + 1087683465, + 2436053240, + 2075821487, + 3300547877, + 4246275907, + 1672799032, + 3598755283, + 667102077, + 1568719535, + 1467241636, + 1215356121, + 3093530166, + 800208581, + 4235463897, + 3546980686, + 698373282, + 3388888848, + 2435402745, + 3441933671, + 3543881842, + 721738749, + 681589950, + 1017222993, + 2155086703, + 1581550, + 155640487, + 2162633079, + 3818614442, + 3351473848, + 2609147527, + 66219496, + 2112588228, + 1257866853, + 825421195, + 2126668981, + 4037999574, + 2841532656, + 1731364060, + 463935396, + 1477462254, + 2816849017, + 3545311289, + 430236379, + 1340026388, + 1353280830, + 3327415251, + 2581666353, + 3022581160, + 1220135957, + 1587392335, + ]; + + static const List _envieddatasecretKey = [ + 4015336094, + 4294547983, + 436876394, + 3447150095, + 2949338041, + 4168115375, + 3831480033, + 2455497288, + 3318553593, + 3719678793, + 3143306636, + 2640311155, + 2781547055, + 3667788738, + 1069759482, + 3997190412, + 2079023666, + 3601413864, + 1246461058, + 2202454692, + 2895945249, + 2204185457, + 2095826305, + 3463443624, + 1469909668, + 689086086, + 123808342, + 360820003, + 3124020939, + 854007378, + 17959132, + 3166300774, + 1920913952, + 2167525357, + 2429935007, + 2679882730, + 4029844527, + 176479494, + 2897991505, + 2019932790, + 3122532972, + 4206737104, + 4112353897, + 2475750768, + 345881379, + 1949749128, + 2998244050, + 939489386, + 4225302168, + 1399356385, + 3394717621, + 2846691761, + 140799311, + 1229086385, + 2412393899, + 630987737, + 1173372718, + 498474128, + 4167759520, + 927891784, + 1638991646, + 1465633792, + 1564880779, + 975813639, + 1087683518, + 2436053163, + 2075821531, + 3300547950, + 4246275888, + 1672799095, + 3598755203, + 667101977, + 1568719576, + 1467241696, + 1215356093, + 3093530181, + 800208572, + 4235463905, + 3546980671, + 698373360, + 3388888873, + 2435402634, + 3441933589, + 3543881791, + 721738664, + 681589970, + 1017222948, + 2155086606, + 1581446, + 155640532, + 2162633028, + 3818614468, + 3351473896, + 2609147599, + 66219422, + 2112588195, + 1257866791, + 825421290, + 2126668934, + 4037999589, + 2841532548, + 1731363995, + 463935439, + 1477462231, + 2816848969, + 3545311311, + 430236301, + 1340026401, + 1353280870, + 3327415201, + 2581666409, + 3022581188, + 1220136023, + 1587392291, + ]; + + static final String secretKey = String.fromCharCodes(List.generate( + _envieddatasecretKey.length, + (int i) => i, + growable: false, + ).map((int i) => _envieddatasecretKey[i] ^ _enviedkeysecretKey[i])); + + static const List _enviedkeystripePublishableKe = [ + 1839317751, + 4055198821, + 3653213416, + 3455310338, + 3760944581, + 3672629832, + 4093011737, + 784003973, + 847343954, + 643086942, + 1443690469, + 1528530013, + 79067950, + 682168411, + 3200867997, + 2292398052, + 3638192409, + 1045672322, + 3536248171, + 1366969601, + 3536252828, + 1939114885, + 2561940310, + 546112917, + 3956257752, + 1808807243, + 522815707, + 2050337606, + 1157547450, + 1643284130, + 1599701708, + 2963548178, + 1950300364, + 2753990949, + 361671953, + 1260027854, + 4121309732, + 2073988458, + 2831828, + 3069378595, + 1324701296, + 3576762029, + 1584446120, + 3301011629, + 1001909348, + 3961168685, + 2725407945, + 3592027398, + 2082756909, + 1659395078, + 3166767217, + 1508183835, + 683517484, + 1761560941, + 2027774136, + 2755606542, + 426855793, + 1663823423, + 2831689856, + 3751083812, + 3134275374, + 1007820824, + 1812490555, + 284479710, + 981661688, + 4116375524, + 2152120028, + 968305691, + 2776436853, + 1424024636, + 1690058532, + 3914383580, + 3101625517, + 3767559948, + 223788900, + 2688209364, + 4032446764, + 1648405458, + 2250897834, + 2072228863, + 55235617, + 3123502272, + 1435667919, + 3392401064, + 3713648025, + 2341469150, + 3255122718, + 2122504995, + 1230709287, + 1908780158, + 3697791584, + 1014585792, + 3195820570, + 2458526645, + 2231151324, + 2908160374, + 1794206337, + 1434466934, + 1377686165, + 4209917831, + 2421338853, + 3702190479, + 2410002154, + 2281040672, + 1617682380, + 3526639417, + 468233026, + 2175183498, + 1669160843, + 2345165308, + 683924179, + 3149170488, + 476084031, + 4050895731, + ]; + + static const List _envieddatastripePublishableKe = [ + 1839317633, + 4055198722, + 3653213367, + 3455310450, + 3760944567, + 3672629799, + 4093011817, + 784004079, + 847343885, + 643086955, + 1443690450, + 1528529940, + 79067975, + 682168365, + 3200868011, + 2292397993, + 3638192479, + 1045672385, + 3536248105, + 1366969671, + 3536252909, + 1939114934, + 2561940245, + 546112935, + 3956257718, + 1808807293, + 522815664, + 2050337544, + 1157547504, + 1643284172, + 1599701654, + 2963548240, + 1950300341, + 2753991027, + 361671975, + 1260027808, + 4121309777, + 2073988398, + 2831776, + 3069378683, + 1324701205, + 3576762004, + 1584446177, + 3301011655, + 1001909281, + 3961168765, + 2725407878, + 3592027488, + 2082756933, + 1659395179, + 3166767105, + 1508183903, + 683517528, + 1761560890, + 2027774165, + 2755606650, + 426855746, + 1663823474, + 2831689932, + 3751083894, + 3134275358, + 1007820927, + 1812490602, + 284479662, + 981661585, + 4116375468, + 2152119999, + 968305738, + 2776436760, + 1424024701, + 1690058594, + 3914383505, + 3101625592, + 3767560028, + 223788822, + 2688209294, + 4032446799, + 1648405473, + 2250897915, + 2072228758, + 55235682, + 3123502212, + 1435667877, + 3392401104, + 3713648091, + 2341469060, + 3255122770, + 2122505025, + 1230709343, + 1908780090, + 3697791523, + 1014585843, + 3195820671, + 2458526675, + 2231151268, + 2908160289, + 1794206457, + 1434466828, + 1377686182, + 4209917876, + 2421338759, + 3702190552, + 2410002082, + 2281040657, + 1617682326, + 3526639454, + 468233008, + 2175183609, + 1669160915, + 2345165198, + 683924107, + 3149170516, + 476084093, + 4050895647, + ]; + + static final String stripePublishableKe = String.fromCharCodes( + List.generate( + _envieddatastripePublishableKe.length, + (int i) => i, + growable: false, + ).map((int i) => + _envieddatastripePublishableKe[i] ^ + _enviedkeystripePublishableKe[i])); + + static const List _enviedkeychatGPTkeySefer = [ + 3481780378, + 2488408238, + 1213188678, + 3282450415, + 1033997396, + 3238031914, + 3800381389, + 1613466561, + 144483971, + 315530640, + 1158827724, + 4170309758, + 1967536791, + 3059190364, + 3889030883, + 2634503668, + 2852081925, + 3033934553, + 4203402991, + 3743270854, + 2748434845, + 1745785365, + 2112598479, + 3184059810, + 2066314683, + 1427862432, + 2934044260, + 3642069627, + 1934688327, + 455439846, + 4191000314, + 837631213, + 1465226339, + 4137515676, + 4045632854, + 2149603429, + 644602439, + 1220893653, + 3286123571, + 307176327, + 3863521071, + 2129564827, + 565234555, + 2633654187, + 3876069411, + 315112522, + 2435426053, + 3467212029, + 3985754679, + 773736579, + 3710129599, + 3983039700, + 1401965244, + 1355807447, + 2203742886, + 1842107697, + 1795219852, + 3703120384, + ]; + + static const List _envieddatachatGPTkeySefer = [ + 3481780448, + 2488408265, + 1213188715, + 3282450342, + 1033997373, + 3238031992, + 3800381438, + 1613466536, + 144484023, + 315530751, + 1158827683, + 4170309636, + 1967536886, + 3059190383, + 3889030842, + 2634503554, + 2852082029, + 3033934511, + 4203402893, + 3743270911, + 2748434927, + 1745785423, + 2112598436, + 3184059795, + 2066314744, + 1427862425, + 2934044220, + 3642069513, + 1934688319, + 455439745, + 4191000239, + 837631144, + 1465226323, + 4137515760, + 4045632878, + 2149603343, + 644602389, + 1220893575, + 3286123625, + 307176437, + 3863521127, + 2129564913, + 565234504, + 2633654266, + 3876069446, + 315112575, + 2435426132, + 3467211941, + 3985754727, + 773736687, + 3710129614, + 3983039618, + 1401965284, + 1355807397, + 2203742974, + 1842107741, + 1795219918, + 3703120492, + ]; + + static final String chatGPTkeySefer = String.fromCharCodes(List.generate( + _envieddatachatGPTkeySefer.length, + (int i) => i, + growable: false, + ).map( + (int i) => _envieddatachatGPTkeySefer[i] ^ _enviedkeychatGPTkeySefer[i])); + + static const List _enviedkeyllamaKey = [ + 3468974626, + 926642541, + 1082357605, + 2085769640, + 2966609750, + 90584284, + 625556588, + 1178663449, + 1763532805, + 1702862398, + 2020237533, + 2137426245, + 469878543, + 2211539993, + 663123122, + 151738963, + 972325983, + 1922633015, + 4130619566, + 4294795451, + 1717230592, + 1253761814, + 238290175, + 2824235106, + 2732900456, + 352781565, + 1384226368, + 3910162632, + 2921128404, + 354155768, + 692771880, + 328649116, + 2804902878, + 3598420345, + 1973223067, + 2881006884, + 965842115, + 295358586, + 4209150984, + 1488138470, + 3406440154, + 4105613890, + 3386372571, + 3738130302, + 1621428922, + 3169621936, + 4045399268, + 3155776899, + 2367892643, + 2920930863, + 2566470495, + 4193903929, + 607733079, + 1290743187, + 2989312781, + 3798373704, + 3376110713, + 1936802518, + 1161989973, + 1571794311, + 1164086087, + 1121099519, + 3742776406, + 4127649343, + 1640794839, + 3475731192, + 3458124837, + 1056226943, + 2690316021, + 3905649921, + 2142458726, + 753916329, + 1274867313, + 465697361, + ]; + + static const List _envieddatallamaKey = [ + 3468974704, + 926642495, + 1082357576, + 2085769709, + 2966609699, + 90584229, + 625556483, + 1178663519, + 1763532865, + 1702862443, + 2020237483, + 2137426211, + 469878621, + 2211540061, + 663123184, + 151738940, + 972325941, + 1922632963, + 4130619544, + 4294795485, + 1717230682, + 1253761885, + 238290110, + 2824235030, + 2732900387, + 352781495, + 1384226419, + 3910162622, + 2921128379, + 354155701, + 692771856, + 328649169, + 2804902826, + 3598420302, + 1973223085, + 2881006876, + 965842080, + 295358506, + 4209151085, + 1488138412, + 3406440076, + 4105613941, + 3386372508, + 3738130224, + 1621428958, + 3169622001, + 4045399183, + 3155776979, + 2367892727, + 2920930916, + 2566470459, + 4193903968, + 607733103, + 1290743260, + 2989312873, + 3798373669, + 3376110656, + 1936802488, + 1161989985, + 1571794400, + 1164086048, + 1121099448, + 3742776359, + 4127649398, + 1640794850, + 3475731135, + 3458124892, + 1056226832, + 2690315949, + 3905650035, + 2142458686, + 753916357, + 1274867251, + 465697341, + ]; + + static final String llamaKey = String.fromCharCodes(List.generate( + _envieddatallamaKey.length, + (int i) => i, + growable: false, + ).map((int i) => _envieddatallamaKey[i] ^ _enviedkeyllamaKey[i])); + + static const List _enviedkeyprivateKeyFCM = [ + 1085536354, + 2117980432, + 3306799739, + 1841983872, + 1712404223, + 2262186519, + 2157777467, + 4150668305, + 325024529, + 2723506415, + 1206308484, + 1358232120, + 2189417878, + 935373720, + 1746313307, + 813265728, + 632010940, + 873467287, + 1229687075, + 2909524201, + 274973816, + 2347731494, + 1338722487, + 117948997, + 3986221209, + 1954094011, + 2410354199, + 2337265962, + 2703235542, + 4020650845, + 255509079, + 1020457194, + 464787680, + 988219379, + 2387495565, + 3263720887, + 1593144048, + 4255843428, + 755224448, + 1505632812, + 2965348155, + 2186504905, + 1989935741, + 2124542584, + 3329269738, + 2926109036, + 767012068, + 3813848152, + 1179253254, + 4268404146, + 2334814691, + 2069585713, + 4162817504, + 1351206141, + 2088099270, + 274081735, + 3360573162, + 3570952049, + 122144606, + 803393045, + 525262006, + 103852402, + 2288315268, + 3304166941, + 485424067, + 1204708591, + 2375713068, + 3992905103, + 2251893987, + 3195872905, + 4034441934, + 551949847, + 321179324, + 3825405843, + 2308875251, + 1968464903, + 321932358, + 3600315744, + 2378810289, + 3404894332, + 2549137979, + 2282859265, + 2056378610, + 1290587234, + 2396673472, + 2938124267, + 553438020, + 1881228571, + 2493651485, + 1105635355, + 1410816953, + 3126416171, + 3206121980, + 3997992469, + 3723531113, + 2059981909, + 642832940, + 856970660, + 1512233568, + 2760975304, + 2593280160, + 485980715, + 1008146424, + 1285607526, + 132595010, + 21374975, + 2353511605, + 3855326534, + 143163473, + 784630718, + 2732347287, + 561324353, + 525550095, + 445297249, + 1553083134, + 3064262494, + 30519062, + 1793458618, + 247355209, + 1134279119, + 3070881590, + 879418008, + 3766084471, + 1826713692, + 1571928346, + 1773518061, + 701054897, + 1340631093, + 3180730018, + 3670957592, + 1590914161, + 3075193458, + 2121316450, + 873305468, + 36462730, + 3114095929, + 16258598, + 1823083195, + 2500421080, + 3126003436, + 433577576, + 691671834, + 1709110373, + 928934125, + 766576041, + 3538168671, + 2154380600, + 1867284, + 2055348828, + 1186512334, + 1759112290, + 244091603, + 2701724511, + 2707506788, + 3254080291, + 1567682641, + 1929585270, + 2105902485, + 283649370, + 2808059332, + 21984109, + 3087283938, + 3711374364, + 1442386475, + 2283281943, + 1231006936, + 2951016759, + 2535367279, + 3231269014, + 1310639212, + 2395771600, + 3159821927, + 3498199016, + 1083619337, + 4004544036, + 1687462976, + 843828170, + 3529495194, + 1380398311, + 2340370101, + 3727070323, + 998110942, + 3471121473, + 3450073568, + 1748699910, + 3704610736, + 3340981700, + 3252624413, + 4286661923, + 35250147, + 3123278159, + 1985664252, + 3441207516, + 229839353, + 1632901388, + 3566351477, + 1110685058, + 1749390462, + 2185975649, + 1102555484, + 3622613445, + 163815544, + 794165019, + 1827716839, + 259311062, + 1601493012, + 2664759907, + 1482630079, + 448172301, + 1541517662, + 3361017396, + 12442925, + 1479440892, + 630107509, + 2363652378, + 657813070, + 2823395104, + 1989064289, + 2082361698, + 656868363, + 1985514598, + 2292221355, + 3026989107, + 326024224, + 3350802396, + 705140865, + 2775756809, + 4248267594, + 3117916602, + 2996183745, + 3342043684, + 2109816922, + 131735628, + 1286723645, + 2615653704, + 902288852, + 474764411, + 159250213, + 613017859, + 1465005042, + 3084856908, + 685984197, + 636194235, + 4202543251, + 3084072229, + 418110231, + 3230960518, + 2724189021, + 3943623435, + 630484980, + 4207055448, + 3970420548, + 742437075, + 857083105, + 2322487434, + 3035602517, + 3810119163, + 912608364, + 1185253736, + 3659899564, + 4293560161, + 842337557, + 1228345533, + 508065721, + 3878945523, + 2750671343, + 3444774116, + 674015574, + 203656532, + 845755699, + 829085475, + 1158820187, + 3749720651, + 2868569805, + 2163071307, + 4114830575, + 579975372, + 2045396270, + 3571456202, + 2880322699, + 3786611893, + 794247878, + 2948619491, + 3586079224, + 3423461911, + 2350879543, + 3525378833, + 3295686279, + 2647221635, + 571621218, + 2534614468, + 1934121782, + 3047948616, + 2163170980, + 3700716704, + 200034539, + 3296307380, + 593234061, + 2828846596, + 3202478139, + 2591283556, + 588523465, + 3640357385, + 2136993996, + 875940366, + 2784934566, + 1704795039, + 3417002490, + 3462664461, + 1087126561, + 2449528461, + 877045461, + 173316991, + 2786590731, + 3268851617, + 112842998, + 3026331363, + 1125625609, + 1744390277, + 1251409214, + 493181396, + 4284397103, + 187685506, + 686961108, + 2514440920, + 1199702970, + 4105973880, + 2532201206, + 1158600870, + 3992352894, + 2848387774, + 3450041173, + 2522573071, + 3012910877, + 3630260899, + 300646590, + 1470724744, + 1789793483, + 3468123415, + 4026949611, + 4191460952, + 4052970352, + 1634986255, + 1139983660, + 1349852562, + 48404561, + 2197053561, + 3668826283, + 1412743754, + 2008040715, + 3740902480, + 1759672454, + 2924707767, + 2293874479, + 1790332323, + 2708987693, + 3994362754, + 4113390168, + 1897115504, + 2976342108, + 3196098783, + 853770222, + 1875208249, + 3191047400, + 2407094622, + 4224537593, + 3222836519, + 266738048, + 1513423137, + 2353894958, + 2114425205, + 347189488, + 759583934, + 225464921, + 2672650137, + 2417275516, + 2781533433, + 1383969741, + 2241665463, + 1102721788, + 1261849533, + 547589544, + 3300301578, + 2077924874, + 2893284864, + 1724462037, + 3656845614, + 4007591968, + 2341091702, + 1016131558, + 2777015338, + 2620064644, + 2430166091, + 4126225172, + 3522875847, + 1736834133, + 2662097939, + 4205696505, + 2096953655, + 2810936699, + 804465911, + 4157127994, + 1391364844, + 1021569024, + 1800041482, + 1985623668, + 2684878645, + 555492471, + 2525696941, + 1957424419, + 3527909280, + 1767272482, + 21359628, + 3020321534, + 3113621506, + 2585617493, + 1769644716, + 2421298343, + 3343046064, + 1653058764, + 1753978735, + 2262285349, + 3684209954, + 4053929620, + 3517493269, + 767647536, + 1918390482, + 3857217676, + 1009110292, + 1588807361, + 2984683841, + 515580103, + 274701622, + 3642193543, + 1866506751, + 2821871732, + 2940469654, + 3823409979, + 1212094024, + 3256674376, + 881124468, + 3374665638, + 1346868048, + 1008100250, + 14227651, + 3402565854, + 1121304506, + 4281978284, + 391515760, + 1186667086, + 3949551682, + 348808494, + 1991003804, + 3500568098, + 1266300975, + 4094624159, + 2576304702, + 3066775156, + 3843275408, + 1593669527, + 2513036245, + 2194712465, + 1520341785, + 1903681169, + 1288071388, + 491381245, + 1675998114, + 3467438290, + 3649458080, + 3030470898, + 1437173894, + 3895538845, + 1940348052, + 4130366983, + 2786716903, + 1644435964, + 1115897582, + 710541223, + 829782561, + 1339769361, + 2325825728, + 1791971053, + 2870122083, + 2564980884, + 3742765793, + 262056874, + 2438400602, + 1545066407, + 437751462, + 4281005804, + 3536047437, + 1017035478, + 1659952302, + 2818011523, + 659048397, + 613227570, + 1757056913, + 4013740549, + 1024045124, + 2239597730, + 2199005676, + 1092296362, + 2621417242, + 161103648, + 2654561549, + 3705933034, + 4116218124, + 1830829563, + 3564567002, + 854043773, + 798165390, + 1039848525, + 992815469, + 1593642593, + 1630529889, + 1042937539, + 1919353127, + 3934530445, + 1788196676, + 352686830, + 561809985, + 4214087411, + 3983543649, + 3862801426, + 1938059260, + 1289655026, + 979897043, + 1085546612, + 1558904569, + 1505597789, + 927859855, + 2132736945, + 3840203058, + 718748215, + 2711576833, + 3652274528, + 1719411115, + 1352174176, + 2675475941, + 2706582509, + 1659077676, + 1340726045, + 1378024504, + 3357398403, + 1709691979, + 2175575796, + 1373359080, + 3970383149, + 4021502800, + 1061065555, + 2521841021, + 2727479025, + 1287270750, + 4093614430, + 3973488641, + 3818892712, + 2241497549, + 27943236, + 3273086932, + 1229170977, + 3807172884, + 853419519, + 3482645808, + 3348389928, + 286579514, + 3318504180, + 2632745134, + 3422016745, + 3355782032, + 1227116437, + 3040110052, + 1965638369, + 2923878859, + 3134737308, + 3993078641, + 764440021, + 672618054, + 1635580869, + 3872698699, + 906501940, + 413804204, + 2497558472, + 2970367929, + 3841168338, + 2875510697, + 1415468671, + 2909036276, + 4149919061, + 364026423, + 95761156, + 2113576511, + 1271972680, + 3548019650, + 2076287412, + 4017306139, + 1432083996, + 3904533818, + 1727767353, + 1246726449, + 3467134836, + 148650861, + 1523517899, + 2054849764, + 1494172455, + 1623295738, + 2303356245, + 3941327464, + 1144460083, + 1842096421, + 2785486931, + 1243220690, + 4192599477, + 4197006361, + 760779272, + 3529910928, + 1921874356, + 1137033431, + 3657072110, + 1965491, + 4097534367, + 622726697, + 3563055916, + 3227560643, + 2670112964, + 132777257, + 1996446270, + 4137170142, + 2463773638, + 4019090878, + 3075990052, + 3786380187, + 1871895733, + 1697895460, + 2152339690, + 3685772392, + 2632466768, + 3900013960, + 3802598012, + 4146641338, + 3472229005, + 3416299690, + 923870636, + 3078136941, + 1673760092, + 3888410862, + 668555220, + 1421568934, + 4163099117, + 1797926632, + 684468370, + 810168136, + 3187831198, + 895739254, + 2125158899, + 1139621234, + 3712920767, + 2392948633, + 4107942322, + 2566716398, + 2829940771, + 1299185327, + 2265529887, + 1320750092, + 3212832983, + 306728751, + 1490946087, + 654060542, + 1930075580, + 1850479305, + 1097511424, + 3169531670, + 2807088095, + 4291851655, + 2630499761, + 2458837719, + 2734382998, + 3191205181, + 1234431759, + 1086970154, + 3644867302, + 20628483, + 1851371365, + 740027554, + 1800020632, + 1284009232, + 1088068206, + 972631844, + 3155595289, + 3852420187, + 2831055650, + 2615080090, + 3966254548, + 1369070158, + 2972338506, + 2097908041, + 3384879325, + 670376174, + 1908843389, + 2478472493, + 3012775089, + 4017078425, + 1918175985, + 4176367565, + 1899461541, + 1309265916, + 1768396830, + 2735581779, + 2917380217, + 1420369027, + 2173130411, + 992948060, + 3548558955, + 882752617, + 3278439314, + 3742567363, + 843614814, + 4233940546, + 1503375397, + 3086495279, + 1468572548, + 3803815483, + 2002513, + 924633855, + 3091148365, + 2011946935, + 3601042692, + 3885399235, + 1141413515, + 455924523, + 2242084047, + 482292249, + 1289995632, + 1137511803, + 3374091524, + 2484871337, + 1161660708, + 4099020677, + 3709788811, + 268204093, + 1159671437, + 1120925887, + 1331590015, + 2228774113, + 1884234419, + 87065969, + 331876717, + 2024667782, + 1569340943, + 3194297613, + 228974897, + 1802023868, + 288979922, + 3978099706, + 1276612728, + 1903879006, + 1824108758, + 2785099764, + 1572215343, + 2108353946, + 124757536, + 3543597712, + 1713505708, + 189298924, + 3718097798, + 3058597447, + 697015973, + 563134440, + 1306892321, + 715629631, + 1715149422, + 2013036631, + 587581135, + 1175783084, + 3435805239, + 2549094024, + 23137300, + 3517267680, + 3718729882, + 36614544, + 2190115750, + 4141290943, + 831121412, + 1861553814, + 1460146991, + 3768730000, + 881891312, + 60943423, + 2453836003, + 3384049813, + 2942979167, + 850627788, + 3453777208, + 1189730237, + 3179914697, + 110596776, + 1699511730, + 3508351129, + 2467597387, + 948450228, + 2339131056, + 4203858538, + 1184983903, + 887835348, + 3702557436, + 737384325, + 3987894475, + 2182889900, + 1168958637, + 3133730799, + 2299665491, + 2341894145, + 352258320, + 4220265648, + 4267358455, + 1869770907, + 4138710082, + 3979166653, + 3341228101, + 2528541372, + 2491816885, + 989998293, + 2839646921, + 1642832631, + 681261192, + 227499710, + 168390132, + 2735463622, + 3224853511, + 3580448580, + 2415638996, + 156511176, + 150733534, + 651876942, + 4268328877, + 3838390471, + 482315430, + 250773915, + 4242931519, + 1242976751, + 193454126, + 3371065255, + 3105310500, + 493059064, + 3856586606, + 1213132015, + 588966837, + 2866296937, + 4136308557, + 1979871500, + 3173655395, + 898011520, + 3177135819, + 3779274690, + 1351221062, + 4026440941, + 975758827, + 2785454312, + 3976024711, + 2075740013, + 2055593308, + 3530532438, + 3929628762, + 1630735341, + 3201169877, + 1003927554, + 3359573156, + 3639507041, + 2193907301, + 1808613959, + 4926629, + 2293843019, + 1128173226, + 599268178, + 2352437982, + 1164710456, + 1078164031, + 2352986285, + 1014291137, + 180471227, + 3690797988, + 2715939200, + 4274194808, + 2796097307, + 556069306, + 2467288233, + 3318575675, + 3397344184, + 2370331584, + 401109309, + 2682380790, + 2208267954, + 4291881787, + 21151897, + 2513130988, + 493115498, + 311256947, + 920185716, + 3702037126, + 2414527350, + 2561577348, + 4170200399, + 3842142435, + 190252734, + 1351578442, + 2429577823, + 338312632, + 691950760, + 481636375, + 1268030168, + 1027901697, + 417511500, + 2451028699, + 3382180702, + 3655442731, + 2566230428, + 3022856229, + 1421301139, + 3980596493, + 2281646603, + 2872839279, + 1302221399, + 1365502541, + 684420532, + 2376737216, + 2242815989, + 240814979, + 1994752040, + 3906223122, + 2227728762, + 3156644930, + 2545144973, + 116840972, + 1403188932, + 2713624788, + 4232883388, + 294471339, + 3264851293, + 325824880, + 4182699273, + 2069684060, + 3908747187, + 1605574983, + 2955904833, + 561665247, + 3204320299, + 1721039000, + 2586223327, + 2492969781, + 221418984, + 538072869, + 2592803565, + 2409975186, + 3716452686, + 1830256754, + 441370672, + 1393024510, + 2025187851, + 28410357, + 4061041654, + 2143044652, + 3487302739, + 3697978137, + 2583858962, + 947239044, + 2374879779, + 3699100142, + 1165450858, + 3902700902, + 2682853700, + 3630317683, + 3989397026, + 3675920709, + 1384419368, + 792874190, + 1834510239, + 2013232764, + 1020868781, + 583063941, + 3119960819, + 961240527, + 1340286148, + 465734705, + 3116332103, + 918796805, + 4053666233, + 918620564, + 1107968923, + 2597755085, + 197634261, + 2236538106, + 2279996495, + 512417992, + 3604803323, + 3257914086, + 1067208847, + 2796581642, + 3822344589, + 1434667709, + 3384142305, + 1834585741, + 663644090, + 3313224619, + 1933518118, + 4129076973, + 56034102, + 1293769580, + 4144706380, + 269562010, + 979497654, + 1992170919, + 3491981676, + 963999078, + 1398280667, + 3908367482, + 3302647906, + 630817396, + 341943918, + 2842309531, + 1451926427, + 3397386127, + 1377364199, + 2345739883, + 4126351116, + 3901368064, + 2198039136, + 1887832329, + 933676126, + 2866875958, + 165950815, + 2763887978, + 1650072602, + 1106492627, + 2308285660, + 163580278, + 1581276992, + 1169410429, + 1161358952, + 444857705, + 3787905508, + 1293782039, + 2844263331, + 2886738890, + 3685395278, + 1601620953, + 2519290623, + 1519468699, + 3790210881, + 2094226441, + 2360380313, + 3398306907, + 3603134082, + 3332113362, + 1635903838, + 178751364, + 3884753006, + 181950618, + 2451078581, + 3196524786, + 104370517, + 3866181267, + 425924056, + 2725576042, + 362192809, + 3914497437, + 2141013033, + 691515113, + 942846404, + 3799111513, + 2609990233, + 433480399, + 2467198805, + 4022337975, + 323217885, + 217603413, + 3456859308, + 4007337961, + 614055506, + 2831894770, + 3114209565, + 3305676342, + 370137427, + 1263543636, + 2114082596, + 774629429, + 3567686392, + 3959253110, + 2250098577, + 2303246774, + 893454640, + 2307457929, + 892177970, + 1026600612, + 3694904066, + 37940154, + 1449101885, + 953326631, + 3367139088, + 1595256224, + 1507669000, + 269006243, + 223054556, + 1986003611, + 1039170247, + 297063753, + 3601488623, + 2316436926, + 3762033468, + 3209737845, + 2297587978, + 3366048316, + 2301410322, + 3097969176, + 839899498, + 3282442952, + 982221870, + 2064004740, + 1041347462, + 1811322267, + 1113771634, + 2306400655, + 3832725561, + 2467830708, + 3727518007, + 94094586, + 3355834789, + 2862703676, + 1421288505, + 120561793, + 118538920, + 668651305, + 2225407946, + 2677884663, + 3768050541, + 672390479, + 272942984, + 547980162, + 1925811576, + 1888786058, + 805659951, + 3778221815, + 1000452525, + 1192695981, + 417066163, + 3464037849, + 2591318068, + 3979809735, + 1931713937, + 348441033, + 3391534648, + 3186260435, + 3337558252, + 4241021229, + 4006316331, + 990024486, + 540018664, + 476468588, + 2364116784, + 2426963098, + 1138794579, + 2543232093, + 4033882606, + 2667360293, + 1718693787, + 3112965574, + 3352873006, + 2500162256, + 917631762, + 1785804284, + 1825480243, + 3237827998, + 882241551, + 2356332059, + 4068688357, + 2249583837, + 2245189575, + 1033607244, + 171187105, + 1037242517, + 3459046188, + 4198402706, + 1002293491, + 699804671, + 1722669725, + 692659064, + 3254296159, + 1110992360, + 2415906073, + 1705408268, + 1447584221, + 2730118858, + 381018389, + 2132602483, + 4188790742, + 4022681003, + 4116273612, + 2788641056, + 831585401, + 1022064131, + 99332313, + 3985257888, + 3014690032, + 2906967173, + 4119953409, + 1199742739, + 1529405728, + 2646244847, + 1525112528, + 1590133554, + 3956126852, + 3159372566, + 1041031331, + 523933133, + 713094833, + 4017729928, + 2474499374, + 2274032882, + 724020105, + 3989279324, + 990371971, + 84657242, + 805337768, + 3340497861, + 1447809881, + 948331213, + 2925341325, + 477410495, + 3728035475, + 4248868443, + 1207692067, + 3912942934, + 3956508263, + 2552096469, + 1306714547, + 3809440626, + 3584715925, + 3330104793, + 701943893, + 3351673712, + 1949167976, + 214999864, + 545869442, + 1771710328, + 912755072, + 1884714178, + 3187673843, + 451595272, + 74573965, + 1822316328, + 1519034238, + 2869003300, + 219978568, + 3982152472, + 2156669868, + 134026856, + 3456472543, + 281095369, + 4026024712, + 1290944223, + 3431292649, + 3849666877, + 147437835, + 4294390717, + 354898054, + 1289238332, + 2643957755, + 4088107619, + 3894154483, + 1140711931, + 3232485719, + 2095688585, + 4058965334, + 1406652864, + 1252766862, + 3633712762, + 2361045777, + 3143506582, + 14085863, + 526659713, + 1185408006, + 660814847, + 3693127124, + 3836439459, + 1404090528, + 4194958431, + 3483386578, + 2209987395, + 2514573258, + 2128754978, + 1620094337, + 3065537750, + 2821082491, + 4015520032, + 2699416828, + 1563727035, + 2318997532, + 3009096703, + 4240853869, + 3389576765, + 2694353874, + 2670277705, + 599701034, + 4281275357, + 2093999862, + 2282497045, + 3850236155, + 1250454751, + 1611058439, + 478316863, + 2658557913, + 2541479455, + 1237296763, + 1534834481, + 641293986, + 4257798418, + 747821052, + 4199062952, + 66708659, + 1633386524, + 4067017550, + 264319267, + 2961165242, + 4121665614, + 1160054217, + 1800798484, + 2500854687, + 3690464058, + 748471494, + 1417968619, + 1504925179, + 3328780352, + 1571974576, + 3872213890, + 2271639358, + 3376742057, + 1092290667, + 813770933, + 3097534780, + 2520919323, + 1858667787, + 3755951001, + 533261859, + 1278785330, + 3495927959, + 20611212, + 3059108067, + 285606893, + 1714648318, + 604659004, + 3504355623, + 3198889118, + 1380835532, + 621945810, + 2227978466, + 992577043, + 3218072892, + 3233400660, + 472491067, + 3670337360, + 3491503700, + 3469572750, + 3065199928, + 629845525, + 474179478, + 520889121, + 643711565, + 1419704857, + 352560402, + 2566502214, + 3538916970, + 3482193761, + 2417969695, + 1445021958, + 1584365093, + 2030671657, + 3395271567, + 1572877737, + 3487108341, + 2139837940, + 258499954, + 2034008043, + 3533608451, + 3796980361, + 2732144569, + 1700671014, + 379784814, + 1698797500, + 3707646619, + 2685937249, + 4154939027, + 2275770720, + 2005065992, + 3893824728, + 1053538606, + 1276583041, + 767392289, + 2329231815, + 1844349696, + 109361720, + 385742290, + 4177013720, + 4057721153, + 1557767992, + 872062732, + 3218328969, + 2309551790, + 1135602866, + 971028944, + 1179199215, + 1218017248, + 670701970, + 278119486, + 1654668639, + 2873844239, + 3329606891, + 1905513486, + 1970518972, + 2859566400, + 659735424, + 1270020647, + 352582303, + 1465898630, + 293457185, + 1113584038, + 1162900898, + 1511455766, + 1586301662, + 1684964449, + 3335102112, + 1918297518, + 867004905, + 168453080, + 1719614769, + 1918215206, + 533478040, + 222783565, + 3085341460, + 3464374882, + 733958340, + 2048411703, + 372217802, + 525798875, + 652234189, + 2907990871, + 4151310554, + 787515247, + 3385657349, + 2047711720, + 3081385268, + 1308309535, + 1001244044, + 2890086571, + 665270045, + 1775294707, + 63518887, + 649576604, + 3065301332, + 3502719067, + 3038287952, + 3879218349, + 3179851758, + 3939077195, + 4122811118, + 430501140, + 3035971581, + 902893422, + 427635683, + 2730011451, + 2523183039, + 3272786475, + 2387459503, + 417432601, + 3297045559, + 4060502747, + 939908200, + 3150410563, + 2553407864, + 1572709816, + 2068949480, + 2922742786, + 3439150646, + 3111744726, + 2614684120, + 1384767286, + 183056764, + 3597944479, + 2021718047, + 304391167, + 170753299, + 2455562409, + 3614369200, + 609588703, + 3458840782, + 1006680605, + 4056905045, + 1863866646, + 2624775338, + 186208783, + 1863997245, + 3698612546, + 1138494284, + 3377966922, + 2723569302, + 1696174665, + 1231594080, + 1775194410, + 3144809831, + 3273112191, + 707802323, + 1552489752, + 363893546, + 2570958396, + 2401223919, + 410130005, + 845767803, + 1848399035, + 1027175022, + 4290916264, + 2185755601, + 2478450215, + 209646094, + 3309366240, + 3363219348, + 4022905235, + 3254481462, + 2549408372, + 1172390660, + 4059818617, + 4274730785, + 537664541, + 836331527, + 541289403, + 272421683, + 3078434949, + 552598907, + 2851571027, + 3350772864, + 1238727567, + 1165004395, + 3005921781, + 1100856561, + 2285427135, + 2010991139, + 208585956, + 2673355726, + 3602091483, + 3038826407, + 1411288782, + 3809103714, + 3679331232, + 2932403193, + 2227258167, + 3835831670, + 229609295, + 741525462, + 2031293869, + 3416188007, + 3821780299, + 3370583082, + 3280734342, + 3103555100, + 3674388295, + 3423851501, + 886751393, + 2786690953, + 3002660473, + 3967826657, + 2097679474, + 500967689, + 368540519, + 2492935542, + 2359110093, + 1790252579, + 3331167795, + 2555117519, + 3505928166, + 27756293, + 2576122123, + 1452523982, + 3127160609, + 970813052, + 2565125345, + 1764322590, + 1556734909, + 2235987739, + 1844585618, + 354090702, + 2959351540, + 4058745301, + 2814170779, + 2537400629, + 1562237033, + 4191554306, + 3224368221, + 2221010448, + 4096018618, + 4249718147, + 2801370289, + 3502310923, + 3701664454, + 644714473, + 1347246147, + 544498209, + 1488153636, + 1038554366, + 906519349, + 203296284, + 1333970984, + 2896673534, + 1960913136, + 3197903823, + 3959393609, + 3445230344, + 2904728891, + 3068781067, + 947225262, + 3385573400, + 3344502862, + 2266444987, + 762210448, + 1647682581, + 3570494765, + 3203611454, + 1759931374, + 3856547876, + 729278465, + 3505860349, + 2370708716, + 707420696, + 2229527969, + 3009316491, + 2494180908, + 9884503, + 3480298985, + 3402220791, + 565537650, + 4065839263, + 494162889, + 47273670, + 1202321378, + 764916307, + 62629437, + 468672622, + 1857595321, + 2248643006, + 3811737857, + 2407314564, + 266433106, + 917557949, + 1066162339, + 2132792226, + 3274397868, + 3062020672, + 3765167379, + 2937911740, + 1471502176, + 2695678573, + 3846250102, + 786320986, + 2005279637, + 2393071922, + 811894366, + 775813316, + 450701343, + 1985137779, + 4158891430, + 723802964, + 2105155503, + 3654424909, + 1963782061, + 1575054504, + 676756991, + 335586170, + 452898600, + 573868649, + 2002705710, + 3475536136, + 3076138672, + 958013755, + 3493630507, + 1396510452, + 2234434239, + 1613914085, + 516569916, + 3850006452, + 2116956940, + 3443640755, + 2989496840, + 2367722007, + 1268049243, + 2047485626, + 1481674414, + 2386015404, + 2659193613, + 1447951620, + 4038982735, + 608427975, + 2484364502, + 3959694322, + 1101777209, + 2541413306, + 3565345807, + 2033902288, + 3005838115, + 206671030, + 3560968245, + 2595380954, + 1835881340, + 2975975794, + 513713125, + 3710862094, + 3395886482, + 1179658973, + 1355609318, + 1035428810, + 3890571222, + 3450601011, + 594177530, + 2613765504, + 1820083066, + 4255930691, + 262855456, + 1889064041, + 363624751, + 816015274, + 2415046974, + 2025925411, + 2480300197, + 1189630180, + 1079027340, + 3467742534, + 2136720330, + 1240187370, + 4244115861, + 3977185089, + 2003009309, + 4132007005, + 2679486190, + 350991981, + 2278323638, + 2136824970, + 2046729081, + 2496971765, + 3224982418, + 3661404649, + 1635139260, + 1938557226, + 1007151442, + 4170300236, + 1561837962, + 726973250, + 2454541909, + 2243697273, + 3968379892, + 2072198960, + 337229479, + 1678888051, + 1418736956, + 2705029597, + 1484579177, + 3367785423, + 84043072, + 236552656, + 419850704, + 738786327, + 221744368, + 2327919425, + 2321399502, + 2890018642, + 2396364197, + 3411006195, + 2270479979, + 749836972, + 3619820872, + 3901769288, + 645756009, + 1097476687, + 3074692831, + 2649127997, + 3688014145, + 1040479101, + 3235174823, + 2526083559, + 723743547, + 3499912163, + 1472139631, + 3981425685, + 2411967878, + 393981645, + 3197506923, + 3193695936, + 3106566287, + 2308231928, + 3513514482, + 2833504468, + 2987008167, + 2135808563, + 146921160, + 4033871698, + 865889923, + 871943779, + 2217860701, + 352283082, + 3305859881, + 2766718642, + 4218915165, + 3985342776, + 3564857484, + 3021895197, + 4059524941, + 107609374, + 411075613, + 988007647, + 3981366083, + 3311333715, + 3916627421, + 2422313523, + 211263098, + 964673338, + 2727372083, + 3084658021, + 3991582963, + 2393763329, + 787300743, + 3384399358, + 2867087175, + 3770294393, + 4185313052, + 3837187499, + 2949171162, + 1574658509, + 355529568, + 3093497490, + 3831625331, + 3949013919, + 1924756814, + 2818466486, + 2442202803, + 3741219417, + 2564966489, + 2350271709, + 3336975958, + 2374320061, + 1249800709, + 1628105030, + 3388187254, + 4071837283, + 4027707435, + 2318084948, + 493398516, + 2871559809, + 2538147071, + 3857323015, + 1537174219, + 1015084423, + 1007811834, + 333132782, + 1644187440, + 1403956280, + 3277269056, + 3193248958, + 1096101336, + 3889526353, + 1757280694, + 2289840114, + 3551445955, + 732839688, + 174143470, + 3770844832, + 3727157439, + 888524667, + 3007137510, + 616525616, + 1186691889, + 3588710577, + 2138217208, + 718200117, + 386851126, + 3439583809, + 1284831197, + 1398957692, + 1805694094, + 2343595425, + 1896230702, + 129676655, + 1111991, + 739712956, + 763237123, + 3951020970, + 2574622746, + 1482291327, + 3554150521, + 2118091293, + 1357825597, + 172790042, + 1612620449, + 2340040518, + 881797084, + 4199754505, + 2809796486, + 2157582702, + 447409911, + 111630688, + 3305781894, + 1506089883, + 538883714, + 624452413, + 4056631145, + 360790421, + 121620575, + 3972782349, + 3316390429, + 1243100375, + 1272260408, + 3080480023, + 4117340452, + 1749464530, + 981365583, + 697933604, + 2845166610, + 1701465601, + 30629111, + 1821385790, + 3248107186, + 3498910072, + 1899607094, + 1863657945, + 3863569855, + 3985200248, + 3745056235, + 3321582074, + 3786674968, + 2564687521, + 3294968816, + 2497175466, + 2202299985, + 3274078101, + 2247375778, + 2993709460, + 3847372967, + 3564909645, + 1037302139, + 2326183763, + 1687134225, + 3197807093, + 1870280662, + 3220346902, + 3767188279, + 287883303, + 1369958061, + 3968906095, + 4187816044, + 517411297, + 417572206, + 445283093, + 802965966, + 561525637, + 3571237758, + 1087063676, + 3657768454, + 3911387738, + 969413272, + 1350753235, + 1656035182, + 3598949382, + 2000957403, + 4174331627, + 208223461, + 641053168, + 3307602318, + 418749542, + 2834377088, + 2000099968, + 964986783, + 3630171081, + 936015245, + 3407561402, + 4129610851, + 2008747839, + 2390016365, + 2432469286, + 2729573595, + 947491011, + 1034576666, + 457016082, + 2844782912, + 1701411117, + 2613419969, + 2837373815, + 3369910787, + 3920500550, + 760078164, + 4092806442, + 3770907001, + 3991880895, + 3142762260, + 3505077433, + 1396880770, + 4242339822, + 2173915956, + 3326171082, + 4173722546, + 1542366078, + 1812653728, + 3419105729, + 2708438864, + 3754677675, + 2678918239, + 3566524968, + 392245340, + 1265078623, + 2760776170, + 1547631193, + 276955043, + 328401777, + 4192593497, + 3310988207, + 358134929, + 199398250, + 3431944078, + 2569765796, + 2814608918, + 2281035052, + 3542660275, + 4166401417, + 1895516721, + 4070375049, + 536281444, + 3225284225, + 990386693, + 155606162, + 2938788509, + 4124640395, + 1511989756, + 563440635, + 782802188, + 2461606601, + 1665137949, + 2837793786, + 2247000295, + 2345090308, + 712996351, + 2188841087, + 1283177985, + 4219541248, + 3458908477, + 1391689161, + 1965556112, + 1931654504, + 3320085687, + 246447210, + 2375859845, + 323897742, + 2172800055, + 1229550962, + 3071639195, + 3056011778, + 2781655006, + 2901636528, + 1253729414, + 379958889, + 948148953, + 735408459, + 2364665464, + 1968816619, + 3967119810, + 2270748802, + 938929299, + 1919976769, + 956393171, + 902842244, + 3470734393, + 1474455607, + 4131771277, + 3209173843, + 2143055947, + 3458402259, + 3995385113, + 3845450436, + 342378869, + 1083267231, + 598323984, + 4060045615, + 2310216714, + 2161885205, + 463740147, + 3320733127, + 2679788943, + 209328802, + 4226617261, + 4212229245, + 483698479, + 1333335554, + 1855535372, + 1917921431, + 1272816054, + 1378258566, + 2435066663, + 2140909050, + 3467362303, + 3004567522, + 4160999385, + 923888391, + 1645443780, + 909768319, + 4273537566, + 1960078410, + 4149063086, + 4104657183, + 145000095, + 2609957687, + 3310517812, + 2446897657, + 899164713, + 2229389614, + 2221036390, + 1539334333, + 3330089720, + 1765383561, + 3763711557, + 421911001, + 3448751775, + 1621049960, + 1147639809, + 1529686335, + 3318393987, + 1729090522, + 3435733589, + 1296433531, + 2270640244, + 4158787163, + 941176445, + 644501780, + 1947374871, + 2342262622, + 1749720103, + 145195593, + 3222901788, + 2979029828, + 2387384467, + 1578154651, + 493557771, + 4119914755, + 3755997090, + 1643070984, + 3053439345, + 3689323891, + 2313397070, + 4283660887, + 3464028714, + 1416559202, + 2105543678, + 2133014082, + 2112892852, + 259821546, + 149424358, + 512856449, + 1672418496, + 467361762, + 3250588006, + 908451261, + 1942816266, + 1582371386, + 2896119846, + 816487026, + 631734667, + 1844846604, + 1280076577, + 4170768154, + 3683173117, + 1873327429, + 3743983813, + 1852120335, + 3065944924, + 3061493318, + 1794699881, + 893250914, + 886609179, + 310125993, + 1419872800, + 3040226348, + 2878592958, + 582524761, + 2236999558, + 2025267525, + 4012515166, + 2165063704, + 730766129, + 4135351277, + 2993096973, + 1852127780, + 262657038, + 673567882, + 1775845332, + 4028399509, + 1230948238, + 4234051068, + 1362871229, + 2715924251, + 2066046729, + 3428929162, + 3341616730, + 2339788716, + 2086355143, + 2725199464, + 1849923379, + 1175973567, + 2233476166, + 1991347913, + 829014502, + 1825865339, + 1965184728, + 975267547, + 46595602, + 2557785201, + 811574200, + 3247915358, + 3368385925, + 2379601202, + 788907520, + 2293019671, + 1927501659, + 1605783870, + 2282191786, + 3661322292, + 2626382121, + 280497639, + 1189432246, + 57024570, + 2528929777, + 665327719, + 3870875376, + 1826638339, + 2722124113, + 3148857410, + 3064558797, + 2046711372, + 2034300515, + 1389355484, + 333000346, + 796860408, + 3043618353, + 1914834507, + 629799572, + 1569054780, + 2338392202, + 1094525692, + 3261070506, + 1223637600, + 4153619708, + 790684919, + 942549923, + 3267002088, + 2373341965, + 3994157519, + 3019208121, + 3859399796, + 3380633956, + 3642559988, + 2312856738, + 2500863433, + 437169008, + 2892679370, + 3182486317, + 981944295, + 2128742500, + 2218720359, + 3338824772, + 653202548, + 2934652665, + 2541100326, + 1155095501, + 422531881, + 791380064, + 952490580, + 2927357127, + 3948306502, + 2057902583, + 618351996, + 3235228698, + 483908427, + 710951509, + 3728070755, + 1059306012, + 4167701854, + 119489081, + 1832822401, + 3568246885, + 4060621539, + 4210996815, + 1087603195, + 4274997846, + 3681408352, + 674130462, + 1329482029, + 2151552219, + 2432543996, + 4193589827, + 2241350863, + 3577550019, + 754996191, + 908356171, + 382014318, + 3930049382, + 1610415673, + 1428026736, + 3807150017, + 2786632632, + 1155819551, + 483007515, + 3192245408, + 2270791330, + 1682658050, + 515988825, + 2642227868, + 3141783895, + 1386208292, + 4136005278, + 4294836967, + 76807098, + 3515803733, + 323171098, + 676738701, + 1600625318, + 614848081, + 3320690363, + 2487022667, + 4224312453, + 2054962903, + 1039108684, + 2452358602, + 3580765969, + 3827580620, + 3789921644, + 282750861, + 3532983295, + 3717378749, + 3441345368, + 4031416854, + 1963588602, + 4180140373, + 1629416338, + 1063923805, + 1814362626, + 3872921234, + 2439149606, + 3348820587, + 795111013, + 814070699, + 2120654933, + 2462730759, + 3156373023, + 1122068880, + 2690825404, + 2800882352, + 2333826227, + 4234259008, + 2222639335, + 3313869600, + 4231778008, + 3065460793, + 3342671344, + 3698903867, + 3994077553, + 3852728728, + 2873872078, + 1159732988, + 3664183937, + 3264753981, + 896132042, + 2933072928, + 1604402516, + 3900187847, + 1802668063, + 3240331126, + 2946561709, + 2537152698, + 777979815, + 3476612981, + 3545770158, + 3188490679, + 2062600062, + 843772695, + 4238226694, + 2089972999, + 803433194, + 796626391, + 3346404971, + 1996933672, + 431803232, + 3895904795, + 3063857670, + 1804009891, + 2644942912, + 402652806, + 3842152804, + 1403840999, + 187067540, + 3056934248, + 3183111715, + 2052064746, + 3850468485, + 2556325111, + 349411946, + 3414681983, + 1798381154, + 723299312, + 3351774273, + 3801910514, + 3137977429, + 1210204224, + 4232579361, + 784506845, + 171817949, + 3727539964, + 2056464177, + 677188918, + 355896611, + 2683106624, + 2941256633, + 3993809365, + 3524638048, + 2927742667, + 3050709271, + 3293512662, + 1266062403, + 2126843653, + 2921201225, + 672170134, + 619962283, + 3162636115, + 4281532868, + 65809490, + 1098388873, + 3365558885, + 830256207, + 2604354713, + 1872825439, + 3754882552, + 2442134328, + 3366691918, + 20293746, + 2597281159, + 1917390619, + 2098499134, + 2924053029, + 2787237179, + 1021351964, + 3918119151, + 775779338, + 3963416816, + 2249259874, + 1843819437, + 3740301527, + 736128130, + 3219278705, + 3605727073, + 2041006675, + 1623759802, + 1715504431, + 3862162592, + 2525974333, + 4078329767, + 1509016612, + 2697857535, + 2586819943, + 56523645, + 488930597, + 986413572, + 2642169408, + 138345343, + 2242917601, + 2268662768, + 346318923, + 147197816, + 3841837501, + 3954777406, + 3832129452, + 3640480602, + 2876814872, + 53301794, + 1178549222, + 1042964461, + 3615429402, + 1115665078, + 428385722, + 2106592739, + 2075309051, + 1139461785, + 3501607373, + 3830040059, + 1981667067, + 2078463210, + 2798192082, + 191463444, + 44484226, + 3793254428, + 1866180861, + 247842290, + 2310522127, + 115050178, + 16732183, + 4050705461, + 1520024483, + 76514131, + 684069252, + 1425023956, + 3339540140, + 648002675, + 999675397, + 777037302, + 3022428561, + 1285180841, + 1175522972, + 1864687973, + 3777599201, + 3394737917, + 1835871114, + 3951793907, + 1128392865, + 3797013213, + 1069116187, + 482270381, + 1915945011, + 3969998915, + 627469271, + 4042501393, + 1594261388, + 2589641200, + 1079246605, + 3838731139, + 594852175, + 4277053738, + 2429616906, + 676144626, + 1737892536, + 1227494089, + 2318611500, + 49013431, + 3921227889, + 2786762987, + 910731277, + 1168194847, + 9642518, + 127199510, + 3649925936, + 3769788672, + 1689201483, + 434989233, + 3941246624, + 1672216865, + 373412832, + 3867004521, + 2923749098, + 1626433802, + 3965331907, + 3584237235, + 2811371357, + 262404242, + 28091613, + 449025580, + 705504849, + 2089588568, + 3011712735, + 1470958467, + 763779230, + 618060232, + 3638654393, + 733096155, + 4064999044, + 926371140, + 1915264245, + 2582118340, + 3701511286, + 412821362, + 148261962, + 2949947578, + 2593835345, + 1532575795, + 850237254, + 2230704606, + 2524334125, + 3640940759, + 398723137, + 2219547842, + 4281683642, + 2081601290, + 2696413310, + 2013282185, + 4158801876, + 1971975258, + 3802489706, + 868706236, + 3457812568, + 656351980, + 2205423407, + 3657441566, + 2792302467, + 3917526608, + 3588617544, + 3505484860, + 65995458, + 4182870461, + 2109275750, + 3012147783, + 1353852189, + 2768903595, + 2275333674, + 2460876476, + 1875881256, + 3123444371, + 3616447865, + 1279491158, + 1378636109, + 198439502, + 774098769, + 3333629864, + 1263703309, + 2613493211, + 3759579322, + 3948784374, + 2866276004, + 1225201510, + 276201330, + 3881378420, + 1333270536, + 1167020344, + 3731137530, + 2013128453, + 1268423312, + 584405921, + 4055009467, + 596780915, + 177058472, + 1796575804, + 834791367, + 812106026, + 3930619529, + 2450686982, + 2398592253, + 73633176, + 2418428633, + 1323758403, + 3009947924, + 2059603641, + 3133027782, + 904932493, + 682965041, + 96681623, + 2351559340, + 1778180331, + 97684909, + 544087413, + 132510513, + 2238533219, + 1998974670, + 2218957156, + 3008380196, + 1277902395, + 1268966375, + 1799517161, + 1856927471, + 4089824563, + 2948753658, + 2568533320, + 521835081, + 4038746355, + 2534721941, + 1670201249, + 1811728331, + 1162166913, + 1898549560, + 2948654480, + 2901009943, + 2911677681, + 2815310186, + 2188874160, + 1412854525, + 3961550828, + 484486644, + 4085203908, + 3579822201, + 4008947216, + 1166984689, + 1721572946, + 736203780, + 2747611284, + 39535783, + 764171576, + 1257015450, + 450778844, + 85372012, + 1053725411, + 3644040349, + 2772669201, + 3233733058, + 1431861625, + 3038381355, + 2367217221, + 2283649777, + 2350364789, + 2318128593, + 4107325019, + 157401496, + 2083781936, + 3651226417, + 1235634378, + 3750381335, + 1675554286, + 4155575857, + 467446355, + 4214686643, + 702634429, + 712303747, + 1567960518, + 352541689, + 534026993, + 75369865, + 2267458521, + 3066769069, + 3590411729, + 2942380665, + 881135000, + 439876096, + 2082200155, + 959131142, + 3226183983, + 1805705079, + 416278815, + 782761855, + 2369948756, + 3572666608, + 2017623950, + 3047715311, + 3344610150, + 11286817, + 3614361216, + 419757045, + 3418375005, + 2392045671, + 3625839645, + 4153182169, + 1895009300, + 826795925, + 832382617, + 2855552455, + 516640103, + 3097326913, + 3644017077, + 1736375198, + 1300883196, + 1269079295, + 1674589825, + 837820536, + 3029532241, + 1490398223, + 354933227, + 930667154, + 3953267824, + 2680672233, + 1318017272, + 2378410004, + 3097115705, + 666792429, + 3990985418, + 1648033583, + 1224083855, + 3099232874, + 3602024859, + 523107411, + 1022998311, + 3947062200, + 1268698776, + 4112447178, + 4223496244, + 1895607307, + 1343346586, + 1569239180, + 2399117310, + 2759164687, + 424112886, + 2999714183, + 3839520140, + 3314031783, + 3013173807, + 4008685375, + 1859553179, + 3201257383, + 951117634, + 962987201, + 2171781665, + 2867468515, + 702794205, + 534839755, + 1098520512, + 1024505706, + 24855086, + 1256888647, + 710341508, + 1174171686, + 3969936200, + 352947506, + 1411359712, + 54895376, + 2892538978, + 3811309486, + 1176667167, + 3186571348, + 293018205, + 900275274, + 659668216, + 3631091910, + 3986557832, + 936854211, + 4126162073, + 199206599, + 800343626, + 2500420391, + 2458777080, + 1621984961, + 2230381712, + 3838336724, + 653186549, + 562093785, + 3349474996, + 2470582250, + 3546432743, + 3823404340, + 304228293, + 353650469, + 2795844905, + 3214597663, + 3015830248, + 4096189976, + 1543999863, + 2444608781, + 3075922009, + 2031701569, + 323849278, + 2014036742, + 1932434944, + 1783510442, + 3346370649, + 3330914388, + 3105291624, + 349723999, + 1675851455, + 2585924056, + 267181254, + 434982148, + 2927628990, + 879031917, + 829651192, + 1529714908, + 1305112924, + 655409946, + 294227433, + 3664549654, + 1965090525, + 2820969920, + 3312826671, + 1303484074, + 467549375, + 44215757, + 2655462001, + 703657197, + 3159835075, + 3294492335, + 488218638, + 1964778246, + 233844640, + 4185425491, + 3872509542, + 4098454064, + 2800291797, + 2049071011, + 908392761, + 1142278701, + 2090776555, + 3055917354, + 2147747017, + 3866581642, + 2697987596, + 4061072174, + 416325149, + 4024789595, + 3949568694, + 1651938236, + 2001230579, + 2214888238, + 1290801404, + 56776462, + 3076417887, + 782612972, + 4080283022, + 1316028900, + 1807111207, + 2777418525, + 3799697747, + 3330724827, + 2407025550, + 2192635846, + 1326386701, + 181906566, + 2704591351, + 2332288340, + 2737340964, + 4059820001, + 800157830, + 747116165, + 3945901883, + 458863852, + 378603401, + 91229067, + 3864173461, + 4214835552, + 3064324033, + 4031418546, + 2576908243, + 2186052852, + 693230562, + 821948541, + 1336473536, + 3207554374, + 335661172, + 1077176194, + 1426162892, + 1820589956, + 1417870851, + 3388072177, + 3246018189, + 3372034344, + 1695091022, + 533758591, + 3747368500, + 2774266377, + 2510062662, + 2704449333, + 4121145527, + 2462398332, + 3268788699, + 3053480025, + 1728135667, + 1938970618, + 486276440, + 755968284, + 2808295005, + 243486152, + 606849322, + 3481880680, + 1411375358, + 2656196617, + 4224811188, + 3631388540, + 2278146928, + 3733750977, + 3961916496, + 3261521121, + 1420196296, + 1258193893, + 2659699577, + 1611917360, + 158232170, + 1584612018, + 1267240944, + 2310854457, + 1850517939, + 3176110051, + 416228811, + 3597142785, + 1629335394, + 3536618646, + 3177662378, + 477970022, + 3209901051, + 2324893875, + 415783515, + 1618396512, + 1493894824, + 633482086, + 3982163253, + 733741266, + 3126125659, + 631696737, + 1662825596, + 4060849887, + 240321204, + 2629314537, + 2308625239, + 3298230656, + 2094035418, + 2448544180, + 644550195, + 4086036911, + 3904414186, + 1105783866, + 1999294877, + 12938024, + 3177597289, + 3515511861, + 949893236, + 302406846, + 2303518735, + 1860144402, + 3120657480, + 3694882395, + 533118959, + 3610021195, + 4180819356, + 4211694578, + 807527016, + 3082847207, + 253261105, + 2237573697, + 2801227581, + 1492451588, + 1924428852, + 2492168163, + 3160332339, + 3024419664, + 416040945, + 2865131903, + 3432150747, + 149942035, + 2648035448, + 1196590367, + 3250439783, + 1657627609, + 2921554621, + 3559902096, + 2585257974, + 2672141513, + 1599015608, + 1669205385, + 1232079234, + 2031093583, + 823815510, + 4150417084, + 1820201104, + 1815422022, + 3206591384, + 1858526000, + 3989297436, + 3897322527, + 3039237498, + 1822254470, + 1094685592, + 3014486534, + 3296369807, + 819605426, + 2301430863, + 758485066, + 3519565429, + 2941739565, + 1864720578, + 1001549799, + 3571932630, + 2837022081, + 3111394213, + 2930402907, + 336637218, + 201524404, + 3792471018, + 1441035282, + 4088850205, + 348517556, + 1099546003, + 2693113326, + 1302022818, + 2597824650, + 1460682924, + 3795402845, + 832670082, + 2161598354, + 272941377, + 1956615803, + 4289834814, + 3974568236, + 3129120027, + 2835024837, + 1535440341, + 2764283881, + 3849170814, + 2532849624, + 1393346207, + 3955100587, + 2176470149, + 1501368024, + 2889172741, + 955590581, + 3424074702, + 2823911694, + 138393240, + 2038338061, + 2195665950, + 1815047258, + 25304713, + 4119242703, + 757734756, + 158431145, + 1990222737, + 928084593, + 866445460, + 603077348, + 289207243, + 323744975, + 1673628886, + 230077467, + 1866750776, + 3762323396, + 1834075318, + 1654284016, + 1040388621, + 71195691, + 1992932062, + 2522787843, + 634128198, + 2876095101, + 415221506, + 1999215123, + 2608063479, + 2815438753, + 1530714902, + 2294076006, + 2566134798, + 490172125, + 1058618728, + 2651555461, + 704242038, + 3104613053, + 1307172788, + 77093784, + 615001058, + 2779210399, + 1313973115, + 2762574953, + 3074898838, + 441858326, + 2877948381, + 1094647700, + 3413922526, + 2378611404, + 329721006, + 2913598403, + 2864015806, + 3519308240, + 1729105760, + 1638298188, + 395083425, + 2106960358, + 983494347, + 611499919, + 1835906487, + 2727628584, + 2631083272, + 515509525, + 1452543692, + 2423944150, + 3700294929, + 3518701771, + 802711265, + ]; + + static const List _envieddataprivateKeyFCM = [ + 1085536309, + 2117980490, + 3306799656, + 1841983944, + 1712404104, + 2262186587, + 2157777518, + 4150668383, + 325024600, + 2723506368, + 1206308595, + 1358232148, + 2189417967, + 935373780, + 1746313230, + 813265721, + 632010997, + 873467341, + 1229687147, + 2909524144, + 274973726, + 2347731465, + 1338722503, + 117948962, + 3986221270, + 1954094036, + 2410354209, + 2337266016, + 2703235468, + 4020650797, + 255509051, + 1020457150, + 464787633, + 988219266, + 2387495622, + 3263720956, + 1593144002, + 4255843372, + 755224522, + 1505632833, + 2965348174, + 2186504858, + 1989935671, + 2124542547, + 3329269656, + 2926109016, + 767012013, + 3813848097, + 1179253345, + 4268404168, + 2334814668, + 2069585766, + 4162817483, + 1351206093, + 2088099317, + 274081714, + 3360573100, + 3570951969, + 122144536, + 803393094, + 525261954, + 103852315, + 2288315336, + 3304167019, + 485424119, + 1204708526, + 2375713125, + 3992905210, + 2251893945, + 3195872956, + 4034441957, + 551949920, + 321179386, + 3825405905, + 2308875191, + 1968464978, + 321932415, + 3600315655, + 2378810327, + 3404894286, + 2549137935, + 2282859313, + 2056378516, + 1290587141, + 2396673450, + 2938124163, + 553437998, + 1881228625, + 2493651578, + 1105635434, + 1410816904, + 3126416201, + 3206121867, + 3997992572, + 3723531070, + 2059981921, + 642833016, + 856970710, + 1512233484, + 2760975260, + 2593280200, + 485980703, + 1008146337, + 1285607438, + 132594951, + 21374859, + 2353511677, + 3855326508, + 143163448, + 784630766, + 2732347331, + 561324291, + 525550156, + 445297160, + 1553083035, + 3064262450, + 30519137, + 1793458675, + 247355178, + 1134279062, + 3070881648, + 879418090, + 3766084383, + 1826713646, + 1571928438, + 1773517993, + 701054853, + 1340631117, + 3180730094, + 3670957644, + 1590914105, + 3075193379, + 2121316385, + 873305412, + 36462828, + 3114095964, + 16258677, + 1823083233, + 2500421037, + 3126003382, + 433577564, + 691671918, + 1709110358, + 928934042, + 766576115, + 3538168598, + 2154380651, + 1867334, + 2055348794, + 1186512319, + 1759112200, + 244091558, + 2701724438, + 2707506717, + 3254080342, + 1567682660, + 1929585230, + 2105902572, + 283649330, + 2808059267, + 21984088, + 3087283882, + 3711374378, + 1442386463, + 2283281989, + 1231006897, + 2951016785, + 2535367181, + 3231269074, + 1310639193, + 2395771573, + 3159821825, + 3498198914, + 1083619443, + 4004544097, + 1687463030, + 843828097, + 3529495248, + 1380398244, + 2340370140, + 3727070213, + 998110902, + 3471121416, + 3450073488, + 1748699998, + 3704610771, + 3340981647, + 3252624424, + 4286661960, + 35250130, + 3123278139, + 1985664207, + 3441207534, + 229839253, + 1632901441, + 3566351387, + 1110685166, + 1749390386, + 2185975594, + 1102555430, + 3622613397, + 163815443, + 794165064, + 1827716758, + 259310977, + 1601493030, + 2664759833, + 1482630097, + 448172366, + 1541517574, + 3361017453, + 12442949, + 1479440814, + 630107451, + 2363652437, + 657813023, + 2823395173, + 1989064237, + 2082361673, + 656868472, + 1985514535, + 2292221383, + 3026989151, + 326024269, + 3350802317, + 705140943, + 2775756921, + 4248267522, + 3117916652, + 2996183736, + 3342043667, + 2109816854, + 131735565, + 1286723674, + 2615653690, + 902288876, + 474764361, + 159250204, + 613017929, + 1465004958, + 3084856953, + 685984132, + 636194260, + 4202543318, + 3084072272, + 418110303, + 3230960619, + 2724188932, + 3943623534, + 630484881, + 4207055387, + 3970420488, + 742437020, + 857083048, + 2322487536, + 3035602435, + 3810119118, + 912608259, + 1185253669, + 3659899592, + 4293560105, + 842337637, + 1228345580, + 508065790, + 3878945463, + 2750671275, + 3444774053, + 674015543, + 203656467, + 845755672, + 829085505, + 1158820148, + 3749720690, + 2868569748, + 2163071279, + 4114830478, + 579975416, + 2045396288, + 3571456249, + 2880322776, + 3786611844, + 794247816, + 2948619451, + 3586079158, + 3423461974, + 2350879552, + 3525378884, + 3295686324, + 2647221739, + 571621210, + 2534614449, + 1934121825, + 3047948603, + 2163171068, + 3700716737, + 200034474, + 3296307452, + 593234142, + 2828846645, + 3202478166, + 2591283471, + 588523438, + 3640357483, + 2136994040, + 875940407, + 2784934541, + 1704795128, + 3417002414, + 3462664519, + 1087126640, + 2449528513, + 877045427, + 173316887, + 2786590841, + 3268851673, + 112842898, + 3026331273, + 1125625659, + 1744390383, + 1251409265, + 493181340, + 4284397165, + 187685552, + 686961052, + 2514440889, + 1199703023, + 4105973817, + 2532201153, + 1158600943, + 3992352775, + 2848387783, + 3450041125, + 2522573145, + 3012910917, + 3630260983, + 300646650, + 1470724861, + 1789793422, + 3468123469, + 4026949521, + 4191460865, + 4052970242, + 1634986326, + 1139983711, + 1349852605, + 48404602, + 2197053440, + 3668826336, + 1412743800, + 2008040771, + 3740902438, + 1759672555, + 2924707825, + 2293874499, + 1790332359, + 2708987650, + 3994362820, + 4113390121, + 1897115396, + 2976342123, + 3196098737, + 853770122, + 1875208302, + 3191047321, + 2407094587, + 4224537495, + 3222836545, + 266738156, + 1513423125, + 2353895039, + 2114425088, + 347189446, + 759583893, + 225464875, + 2672650166, + 2417275446, + 2781533356, + 1383969672, + 2241665535, + 1102721684, + 1261849564, + 547589615, + 3300301639, + 2077924940, + 2893284942, + 1724462014, + 3656845639, + 4007592035, + 2341091614, + 1016131472, + 2777015390, + 2620064722, + 2430166019, + 4126225278, + 3522875787, + 1736834077, + 2662098007, + 4205696438, + 2096953717, + 2810936588, + 804465856, + 4157128032, + 1391364766, + 1021569140, + 1800041575, + 1985623617, + 2684878686, + 555492403, + 2525696983, + 1957424468, + 3527909330, + 1767272532, + 21359733, + 3020321436, + 3113621569, + 2585617411, + 1769644790, + 2421298420, + 3343046082, + 1653058710, + 1753978670, + 2262285394, + 3684210024, + 4053929698, + 3517493344, + 767647572, + 1918390406, + 3857217723, + 1009110385, + 1588807323, + 2984683819, + 515580053, + 274701658, + 3642193630, + 1866506637, + 2821871632, + 2940469755, + 3823409929, + 1212094011, + 3256674403, + 881124354, + 3374665619, + 1346867969, + 1008100270, + 14227636, + 3402565768, + 1121304539, + 4281978325, + 391515698, + 1186667069, + 3949551662, + 348808556, + 1991003851, + 3500568082, + 1266300957, + 4094624212, + 2576304746, + 3066775131, + 3843275462, + 1593669605, + 2513036173, + 2194712539, + 1520341866, + 1903681252, + 1288071308, + 491381175, + 1675998185, + 3467438246, + 3649458153, + 3030470853, + 1437173994, + 3895538863, + 1940348158, + 4130367055, + 2786716829, + 1644435893, + 1115897528, + 710541201, + 829782636, + 1339769377, + 2325825718, + 1791970944, + 2870122030, + 2564980940, + 3742765748, + 262056850, + 2438400552, + 1545066443, + 437751495, + 4281005700, + 3536047487, + 1017035441, + 1659952381, + 2818011605, + 659048353, + 613227531, + 1757056971, + 4013740637, + 1024045180, + 2239597775, + 2199005600, + 1092296402, + 2621417337, + 161103729, + 2654561632, + 3705933021, + 4116218213, + 1830829484, + 3564566968, + 854043697, + 798165495, + 1039848474, + 992815413, + 1593642577, + 1630529842, + 1042937591, + 1919353167, + 3934530532, + 1788196668, + 352686720, + 561809958, + 4214087300, + 3983543634, + 3862801500, + 1938059223, + 1289654936, + 979897060, + 1085546499, + 1558904469, + 1505597737, + 927859918, + 2132736969, + 3840203115, + 718748248, + 2711576933, + 3652274438, + 1719411136, + 1352174115, + 2675475841, + 2706582439, + 1659077702, + 1340726061, + 1378024570, + 3357398503, + 1709691950, + 2175575740, + 1373359064, + 3970383223, + 4021502739, + 1061065488, + 2521840950, + 2727478941, + 1287270716, + 4093614367, + 3973488719, + 3818892763, + 2241497574, + 27943208, + 3273086853, + 1229171015, + 3807172897, + 853419415, + 3482645881, + 3348389970, + 286579536, + 3318504095, + 2632745197, + 3422016734, + 3355782082, + 1227116534, + 3040110007, + 1965638274, + 2923878905, + 3134737380, + 3993078563, + 764439995, + 672617995, + 1635580843, + 3872698746, + 906501977, + 413804239, + 2497558449, + 2970367944, + 3841168263, + 2875510725, + 1415468596, + 2909036228, + 4149918999, + 364026462, + 95761258, + 2113576534, + 1271972635, + 3548019621, + 2076287478, + 4017306184, + 1432084085, + 3904533826, + 1727767421, + 1246726402, + 3467134782, + 148650761, + 1523517883, + 2054849699, + 1494172447, + 1623295663, + 2303356161, + 3941327405, + 1144460138, + 1842096496, + 2785486950, + 1243220668, + 4192599507, + 4197006413, + 760779358, + 3529911028, + 1921874387, + 1137033380, + 3657072022, + 1965464, + 4097534457, + 622726730, + 3563055962, + 3227560617, + 2670112929, + 132777244, + 1996446330, + 4137170098, + 2463773609, + 4019090897, + 3075990034, + 3786380257, + 1871895767, + 1697895496, + 2152339617, + 3685772298, + 2632466713, + 3900014046, + 3802597910, + 4146641375, + 3472229045, + 3416299740, + 923870660, + 3078136920, + 1673760017, + 3888410813, + 668555154, + 1421568972, + 4163099040, + 1797926618, + 684468459, + 810168122, + 3187831210, + 895739160, + 2125158844, + 1139621122, + 3712920797, + 2392948680, + 4107942343, + 2566716375, + 2829940758, + 1299185369, + 2265529936, + 1320750171, + 3212833016, + 306728773, + 1490946164, + 654060455, + 1930075625, + 1850479267, + 1097511533, + 3169531684, + 2807088008, + 4291851712, + 2630499777, + 2458837671, + 2734383061, + 3191205200, + 1234431871, + 1086970216, + 3644867248, + 20628602, + 1851371314, + 740027643, + 1800020735, + 1284009340, + 1088068126, + 972631824, + 3155595352, + 3852420151, + 2831055692, + 2615080173, + 3966254480, + 1369070080, + 2972338444, + 2097907973, + 3384879341, + 670376159, + 1908843277, + 2478472478, + 3012775131, + 4017078504, + 1918175962, + 4176367612, + 1899461628, + 1309265813, + 1768396902, + 2735581699, + 2917380141, + 1420369113, + 2173130433, + 992948018, + 3548558875, + 882752605, + 3278439376, + 3742567342, + 843614826, + 4233940506, + 1503375458, + 3086495302, + 1468572611, + 3803815538, + 2002436, + 924633745, + 3091148320, + 2011946973, + 3601042758, + 3885399206, + 1141413576, + 455924506, + 2242084087, + 482292314, + 1289995553, + 1137511758, + 3374091575, + 2484871387, + 1161660739, + 4099020718, + 3709788906, + 268204138, + 1159671547, + 1120925946, + 1331589960, + 2228774068, + 1884234463, + 87065918, + 331876640, + 2024667893, + 1569341024, + 3194297700, + 228974915, + 1802023899, + 288979847, + 3978099659, + 1276612641, + 1903879029, + 1824108706, + 2785099701, + 1572215383, + 2108354016, + 124757570, + 3543597800, + 1713505691, + 189298904, + 3718097918, + 3058597427, + 697016060, + 563134350, + 1306892358, + 715629681, + 1715149316, + 2013036598, + 587581113, + 1175783125, + 3435805299, + 2549094051, + 23137363, + 3517267604, + 3718729935, + 36614599, + 2190115789, + 4141290992, + 831121502, + 1861553862, + 1460147035, + 3768730075, + 881891235, + 60943467, + 2453835910, + 3384049863, + 2942979188, + 850627836, + 3453777229, + 1189730303, + 3179914683, + 110596814, + 1699511782, + 3508351228, + 2467597347, + 948450290, + 2339131131, + 4203858520, + 1184983915, + 887835269, + 3702557317, + 737384437, + 3987894427, + 2182889881, + 1168958690, + 3133730747, + 2299665504, + 2341894245, + 352258370, + 4220265682, + 4267358390, + 1869770988, + 4138710032, + 3979166699, + 3341228075, + 2528541401, + 2491816908, + 989998214, + 2839646861, + 1642832573, + 681261255, + 227499726, + 168390039, + 2735463575, + 3224853574, + 3580448637, + 2415638956, + 156511130, + 150733499, + 651876887, + 4268328925, + 3838390413, + 482315457, + 250774004, + 4242931560, + 1242976733, + 193454103, + 3371065312, + 3105310558, + 493058998, + 3856586530, + 1213131937, + 588966907, + 2866296838, + 4136308488, + 1979871579, + 3173655368, + 898011574, + 3177135870, + 3779274634, + 1351221007, + 4026440860, + 975758770, + 2785454265, + 3976024752, + 2075739962, + 2055593271, + 3530532352, + 3929628720, + 1630735325, + 3201169807, + 1003927603, + 3359573138, + 3639507000, + 2193907242, + 1808613930, + 4926660, + 2293843044, + 1128173309, + 599268154, + 2352437900, + 1164710412, + 1078164082, + 2352986366, + 1014291081, + 180471276, + 3690798036, + 2715939279, + 4274194709, + 2796097386, + 556069314, + 2467288319, + 3318575738, + 3397344225, + 2370331535, + 401109326, + 2682380721, + 2208267970, + 4291881825, + 21151982, + 2513130965, + 493115451, + 311256861, + 920185639, + 3702037236, + 2414527279, + 2561577387, + 4170200332, + 3842142373, + 190252784, + 1351578482, + 2429577770, + 338312691, + 691950784, + 481636430, + 1268030088, + 1027901762, + 417511544, + 2451028617, + 3382180633, + 3655442788, + 2566230482, + 3022856301, + 1421301246, + 3980596582, + 2281646654, + 2872839212, + 1302221319, + 1365502589, + 684420550, + 2376737172, + 2242815931, + 240815042, + 1994752024, + 3906223201, + 2227728643, + 3156644912, + 2545145039, + 116841055, + 1403188980, + 2713624716, + 4232883436, + 294471405, + 3264851246, + 325824826, + 4182699313, + 2069684010, + 3908747227, + 1605574944, + 2955904779, + 561665202, + 3204320361, + 1721039018, + 2586223272, + 2492969823, + 221418941, + 538072918, + 2592803545, + 2409975204, + 3716452615, + 1830256694, + 441370728, + 1393024459, + 2025187967, + 28410291, + 4061041540, + 2143044681, + 3487302656, + 3697978158, + 2583859043, + 947239088, + 2374879810, + 3699100054, + 1165450777, + 3902700841, + 2682853655, + 3630317579, + 3989397112, + 3675920648, + 1384419455, + 792874141, + 1834510286, + 2013232656, + 1020868863, + 583064013, + 3119960720, + 961240503, + 1340286103, + 465734741, + 3116332080, + 918796867, + 4053666287, + 918620629, + 1107969022, + 2597755069, + 197634199, + 2236538035, + 2279996457, + 512417959, + 3604803260, + 3257914033, + 1067208903, + 2796581721, + 3822344664, + 1434667728, + 3384142244, + 1834585789, + 663644105, + 3313224659, + 1933518166, + 4129076894, + 56034124, + 1293769543, + 4144706345, + 269562093, + 979497717, + 1992170947, + 3491981621, + 963998994, + 1398280577, + 3908367368, + 3302647861, + 630817325, + 341943851, + 2842309547, + 1451926513, + 3397386232, + 1377364130, + 2345739802, + 4126351205, + 3901368148, + 2198039049, + 1887832386, + 933676044, + 2866875911, + 165950738, + 2763887966, + 1650072690, + 1106492579, + 2308285618, + 163580239, + 1581276944, + 1169410380, + 1161358853, + 444857632, + 3787905492, + 1293782100, + 2844263403, + 2886738872, + 3685395239, + 1601620975, + 2519290506, + 1519468745, + 3790210836, + 2094226512, + 2360380331, + 3398306834, + 3603134191, + 3332113386, + 1635903848, + 178751471, + 3884752923, + 181950687, + 2451078642, + 3196524723, + 104370528, + 3866181332, + 425923997, + 2725576019, + 362192892, + 3914497455, + 2141013009, + 691515102, + 942846390, + 3799111446, + 2609990188, + 433480365, + 2467198723, + 4022338036, + 323217851, + 217603350, + 3456859271, + 4007337888, + 614055466, + 2831894695, + 3114209577, + 3305676352, + 370137372, + 1263543610, + 2114082666, + 774629468, + 3567686344, + 3959253059, + 2250098679, + 2303246840, + 893454596, + 2307458021, + 892178040, + 1026600657, + 3694904182, + 37940190, + 1449101925, + 953326669, + 3367139175, + 1595256261, + 1507669056, + 269006317, + 223054571, + 1986003671, + 1039170294, + 297063699, + 3601488549, + 2316436874, + 3762033524, + 3209737797, + 2297588043, + 3366048335, + 2301410388, + 3097969278, + 839899417, + 3282442992, + 982221951, + 2064004791, + 1041347534, + 1811322312, + 1113771578, + 2306400708, + 3832725595, + 2467830746, + 3727517954, + 94094519, + 3355834865, + 2862703734, + 1421288556, + 120561901, + 118538990, + 668651291, + 2225407928, + 2677884571, + 3768050437, + 672390401, + 272943079, + 547980271, + 1925811509, + 1888786150, + 805660003, + 3778221757, + 1000452547, + 1192696063, + 417066177, + 3464037789, + 2591318094, + 3979809694, + 1931714040, + 348440986, + 3391534706, + 3186260453, + 3337558171, + 4241021284, + 4006316361, + 990024548, + 540018608, + 476468502, + 2364116836, + 2426963106, + 1138794555, + 2543232111, + 4033882589, + 2667360370, + 1718693827, + 3112965526, + 3352873059, + 2500162206, + 917631840, + 1785804200, + 1825480280, + 3237828092, + 882241639, + 2356332067, + 4068688306, + 2249583798, + 2245189527, + 1033607225, + 171187142, + 1037242576, + 3459046268, + 4198402784, + 1002293379, + 699804623, + 1722669777, + 692658988, + 3254296102, + 1110992290, + 2415906128, + 1705408318, + 1447584170, + 2730118847, + 381018471, + 2132602422, + 4188790718, + 4022681027, + 4116273564, + 2788641129, + 831585301, + 1022064242, + 99332243, + 3985257943, + 3014689974, + 2906967270, + 4119953521, + 1199742841, + 1529405814, + 2646244793, + 1525112483, + 1590133622, + 3956126953, + 3159372624, + 1041031400, + 523933088, + 713094885, + 4017730041, + 2474499427, + 2274032791, + 724020206, + 3989279254, + 990372080, + 84657200, + 805337745, + 3340497798, + 1447809889, + 948331174, + 2925341381, + 477410518, + 3728035563, + 4248868362, + 1207692044, + 3912942909, + 3956508190, + 2552096385, + 1306714499, + 3809440563, + 3584716001, + 3330104712, + 701943910, + 3351673601, + 1949167932, + 214999918, + 545869562, + 1771710239, + 912755144, + 1884714130, + 3187673820, + 451595313, + 74574051, + 1822316368, + 1519034119, + 2869003345, + 219978543, + 3982152564, + 2156669946, + 134026770, + 3456472507, + 281095340, + 4026024818, + 1290944174, + 3431292549, + 3849666943, + 147437883, + 4294390660, + 354898175, + 1289238387, + 2643957649, + 4088107573, + 3894154397, + 1140711818, + 3232485752, + 2095688689, + 4058965251, + 1406652907, + 1252766944, + 3633712660, + 2361045829, + 3143506670, + 14085845, + 526659795, + 1185408094, + 660814790, + 3693127140, + 3836439535, + 1404090576, + 4194958393, + 3483386595, + 2209987450, + 2514573304, + 2128755046, + 1620094387, + 3065537765, + 2821082377, + 4015520115, + 2699416714, + 1563727055, + 2318997610, + 3009096601, + 4240853802, + 3389576713, + 2694353822, + 2670277640, + 599701081, + 4281275375, + 2093999744, + 2282497145, + 3850236052, + 1250454676, + 1611058539, + 478316885, + 2658557842, + 2541479512, + 1237296715, + 1534834504, + 641294059, + 4257798485, + 747820946, + 4199063004, + 66708725, + 1633386582, + 4067017516, + 264319306, + 2961165265, + 4121665549, + 1160054202, + 1800798562, + 2500854702, + 3690464088, + 748471447, + 1417968525, + 1504925091, + 3328780343, + 1571974609, + 3872213942, + 2271639389, + 3376742129, + 1092290569, + 813770883, + 3097534802, + 2520919410, + 1858667872, + 3755951082, + 533261847, + 1278785348, + 3495927968, + 20611301, + 3059107985, + 285606830, + 1714648212, + 604659056, + 3504355677, + 3198889179, + 1380835512, + 621945771, + 2227978411, + 992577111, + 3218072902, + 3233400638, + 472491106, + 3670337329, + 3491503669, + 3469572829, + 3065199986, + 629845622, + 474179494, + 520889158, + 643711550, + 1419704879, + 352560427, + 2566502194, + 3538916883, + 3482193684, + 2417969778, + 1445022017, + 1584365077, + 2030671691, + 3395271660, + 1572877726, + 3487108276, + 2139837854, + 258499896, + 2034007946, + 3533608503, + 3796980424, + 2732144591, + 1700671060, + 379784746, + 1698797512, + 3707646685, + 2685937154, + 4154939131, + 2275770670, + 2005066042, + 3893824693, + 1053538583, + 1276583121, + 767392377, + 2329231744, + 1844349766, + 109361751, + 385742237, + 4177013648, + 4057721090, + 1557767944, + 872062825, + 3218329037, + 2309551843, + 1135602883, + 971028918, + 1179199150, + 1218017198, + 670702065, + 278119436, + 1654668553, + 2873844341, + 3329606815, + 1905513581, + 1970519013, + 2859566380, + 659735494, + 1270020706, + 352582354, + 1465898702, + 293457169, + 1113584096, + 1162900946, + 1511455801, + 1586301576, + 1684964370, + 3335102185, + 1918297563, + 867004800, + 168453004, + 1719614846, + 1918215285, + 533478097, + 222783604, + 3085341504, + 3464374801, + 733958310, + 2048411663, + 372217789, + 525798833, + 652234143, + 2907990843, + 4151310504, + 787515146, + 3385657458, + 2047711705, + 3081385223, + 1308309594, + 1001244157, + 2890086652, + 665270088, + 1775294635, + 63518953, + 649576616, + 3065301356, + 3502719016, + 3038287906, + 3879218427, + 3179851686, + 3939077162, + 4122811048, + 430501234, + 3035971460, + 902893366, + 427635638, + 2730011512, + 2523183069, + 3272786552, + 2387459551, + 417432700, + 3297045586, + 4060502711, + 939908102, + 3150410546, + 2553407803, + 1572709853, + 2068949466, + 2922742835, + 3439150707, + 3111744673, + 2614684063, + 1384767353, + 183056652, + 3597944569, + 2021718136, + 304391054, + 170753396, + 2455562492, + 3614369235, + 609588650, + 3458840801, + 1006680616, + 4056904962, + 1863866738, + 2624775390, + 186208854, + 1863997301, + 3698612585, + 1138494249, + 3377966973, + 2723569360, + 1696174713, + 1231594042, + 1775194393, + 3144809759, + 3273112075, + 707802245, + 1552489774, + 363893574, + 2570958438, + 2401223841, + 410129956, + 845767725, + 1848398988, + 1027174915, + 4290916351, + 2185755528, + 2478450258, + 209646199, + 3309366169, + 3363219442, + 4022905258, + 3254481525, + 2549408333, + 1172390740, + 4059818511, + 4274730824, + 537664603, + 836331631, + 541289355, + 272421737, + 3078435008, + 552598840, + 2851570968, + 3350772952, + 1238727654, + 1165004317, + 3005921682, + 1100856519, + 2285427145, + 2010991185, + 208585908, + 2673355770, + 3602091435, + 3038826454, + 1411288714, + 3809103665, + 3679331286, + 2932403084, + 2227258178, + 3835831617, + 229609334, + 741525388, + 2031293894, + 3416187957, + 3821780347, + 3370583115, + 3280734418, + 3103555194, + 3674388339, + 3423851486, + 886751471, + 2786691033, + 3002660367, + 3967826598, + 2097679392, + 500967744, + 368540462, + 2492935460, + 2359110139, + 1790252651, + 3331167825, + 2555117477, + 3505928082, + 27756334, + 2576122182, + 1452523965, + 3127160648, + 970813007, + 2565125282, + 1764322645, + 1556734926, + 2235987785, + 1844585726, + 354090626, + 2959351430, + 4058745243, + 2814170787, + 2537400646, + 1562236954, + 4191554414, + 3224368165, + 2221010518, + 4096018652, + 4249718209, + 2801370245, + 3502310993, + 3701664415, + 644714393, + 1347246098, + 544498242, + 1488153699, + 1038554259, + 906519409, + 203296356, + 1333971068, + 2896673434, + 1960913088, + 3197903801, + 3959393599, + 3445230438, + 2904728922, + 3068781177, + 947225288, + 3385573485, + 3344502910, + 2266445022, + 762210538, + 1647682671, + 3570494744, + 3203611513, + 1759931323, + 3856547856, + 729278528, + 3505860261, + 2370708653, + 707420715, + 2229528036, + 3009316585, + 2494180888, + 9884453, + 3480298928, + 3402220691, + 565537555, + 4065839344, + 494162827, + 47273717, + 1202321327, + 764916225, + 62629445, + 468672536, + 1857595355, + 2248643052, + 3811737927, + 2407314603, + 266433120, + 917558003, + 1066162414, + 2132792262, + 3274397917, + 3062020642, + 3765167416, + 2937911793, + 1471502165, + 2695678468, + 3846250022, + 786320910, + 2005279683, + 2393071957, + 811894284, + 775813278, + 450701352, + 1985137669, + 4158891467, + 723802896, + 2105155548, + 3654424836, + 1963782082, + 1575054543, + 676756874, + 335586126, + 452898663, + 573868637, + 2002705733, + 3475536239, + 3076138688, + 958013794, + 3493630565, + 1396510366, + 2234434287, + 1613914016, + 516569870, + 3850006518, + 2116956986, + 3443640709, + 2989496921, + 2367722093, + 1268049268, + 2047485689, + 1481674444, + 2386015486, + 2659193668, + 1447951666, + 4038982668, + 608427934, + 2484364432, + 3959694259, + 1101777239, + 2541413372, + 3565345852, + 2033902245, + 3005838160, + 206671101, + 3560968287, + 2595380916, + 1835881266, + 2975975710, + 513713116, + 3710862181, + 3395886503, + 1179658943, + 1355609248, + 1035428742, + 3890571246, + 3450601047, + 594177484, + 2613765624, + 1820083025, + 4255930630, + 262855535, + 1889063987, + 363624782, + 816015346, + 2415046995, + 2025925393, + 2480300231, + 1189630142, + 1079027428, + 3467742475, + 2136720262, + 1240187359, + 4244115934, + 3977185134, + 2003009330, + 4132006953, + 2679486124, + 350991967, + 2278323682, + 2136825081, + 2046729022, + 2496971673, + 3224982439, + 3661404587, + 1635139275, + 1938557213, + 1007151393, + 4170300162, + 1561838061, + 726973221, + 2454541846, + 2243697228, + 3968379842, + 2072199035, + 337229526, + 1678887996, + 1418737017, + 2705029522, + 1484579086, + 3367785465, + 84043031, + 236552638, + 419850644, + 738786398, + 221744287, + 2327919416, + 2321399546, + 2890018588, + 2396364255, + 3411006089, + 2270479906, + 749836993, + 3619820844, + 3901769328, + 645755936, + 1097476618, + 3074692798, + 2649128016, + 3688014132, + 1040479015, + 3235174851, + 2526083468, + 723743570, + 3499912066, + 1472139534, + 3981425735, + 2411967978, + 393981685, + 3197506880, + 3193695983, + 3106566367, + 2308231883, + 3513514431, + 2833504430, + 2987008140, + 2135808593, + 146921211, + 4033871712, + 865889974, + 871943688, + 2217860615, + 352283056, + 3305859944, + 2766718680, + 4218915183, + 3985342813, + 3564857507, + 3021895208, + 4059524907, + 107609467, + 411075653, + 988007600, + 3981366070, + 3311333667, + 3916627429, + 2422313573, + 211263061, + 964673394, + 2727372039, + 3084657920, + 3991582871, + 2393763400, + 787300852, + 3384399287, + 2867087104, + 3770294300, + 4185313109, + 3837187521, + 2949171090, + 1574658435, + 355529493, + 3093497543, + 3831625304, + 3949014000, + 1924756794, + 2818466556, + 2442202763, + 3741219349, + 2564966408, + 2350271716, + 3336975891, + 2374320083, + 1249800776, + 1628104960, + 3388187185, + 4071837186, + 4027707505, + 2318084914, + 493398431, + 2871559912, + 2538146973, + 3857323112, + 1537174147, + 1015084464, + 1007811740, + 333132683, + 1644187511, + 1403956233, + 3277269015, + 3193248913, + 1096101302, + 3889526377, + 1757280709, + 2289840040, + 3551445890, + 732839780, + 174143387, + 3770844883, + 3727157458, + 888524556, + 3007137413, + 616525632, + 1186691924, + 3588710648, + 2138217131, + 718200187, + 386851156, + 3439583794, + 1284831158, + 1398957631, + 1805694179, + 2343595504, + 1896230757, + 129676576, + 1111939, + 739712904, + 763237228, + 3951021027, + 2574622754, + 1482291256, + 3554150473, + 2118091338, + 1357825642, + 172790104, + 1612620497, + 2340040458, + 881797010, + 4199754598, + 2809796530, + 2157582657, + 447409858, + 111630638, + 3305781960, + 1506089898, + 538883796, + 624452361, + 4056631089, + 360790496, + 121620495, + 3972782410, + 3316390475, + 1243100344, + 1272260465, + 3080480127, + 4117340508, + 1749464451, + 981365532, + 697933675, + 2845166704, + 1701465677, + 30629043, + 1821385852, + 3248107258, + 3498909975, + 1899607140, + 1863657901, + 3863569867, + 3985200149, + 3745056166, + 3321582004, + 3786675024, + 2564687569, + 3294968771, + 2497175502, + 2202299910, + 3274078179, + 2247375753, + 2993709510, + 3847372958, + 3564909598, + 1037302070, + 2326183723, + 1687134302, + 3197806976, + 1870280613, + 3220346977, + 3767188335, + 287883389, + 1369958132, + 3968906012, + 4187815968, + 517411252, + 417572132, + 445283153, + 802966011, + 561525747, + 3571237682, + 1087063608, + 3657768501, + 3911387699, + 969413281, + 1350753161, + 1656035092, + 3598949444, + 2000957358, + 4174331559, + 208223383, + 641053106, + 3307602410, + 418749455, + 2834377163, + 2000100071, + 964986841, + 3630171042, + 936015290, + 3407561416, + 4129610805, + 2008747897, + 2390016283, + 2432469362, + 2729573545, + 947491001, + 1034576683, + 457016145, + 2844782857, + 1701411140, + 2613419907, + 2837373747, + 3369910856, + 3920500515, + 760078098, + 4092806494, + 3770906895, + 3991880946, + 3142762365, + 3505077500, + 1396880868, + 4242339755, + 2173915968, + 3326171033, + 4173722593, + 1542365999, + 1812653771, + 3419105672, + 2708438885, + 3754677701, + 2678918193, + 3566524992, + 392245357, + 1265078587, + 2760776098, + 1547631114, + 276955099, + 328401699, + 4192593419, + 3310988269, + 358135011, + 199398151, + 3431944137, + 2569765829, + 2814608953, + 2281035129, + 3542660350, + 4166401484, + 1895516702, + 4070375149, + 536281383, + 3225284325, + 990386775, + 155606229, + 2938788593, + 4124640509, + 1511989672, + 563440545, + 782802297, + 2461606529, + 1665138010, + 2837793684, + 2247000214, + 2345090351, + 712996271, + 2188840984, + 1283178059, + 4219541318, + 3458908497, + 1391689121, + 1965556179, + 1931654491, + 3320085720, + 246447155, + 2375859913, + 323897804, + 2172800095, + 1229550909, + 3071639249, + 3056011873, + 2781654953, + 2901636486, + 1253729459, + 379958792, + 948148906, + 735408387, + 2364665395, + 1968816518, + 3967119867, + 2270748854, + 938929383, + 1919976742, + 956393119, + 902842337, + 3470734462, + 1474455634, + 4131771354, + 3209173769, + 2143055986, + 3458402182, + 3995385184, + 3845450416, + 342378800, + 1083267321, + 598324069, + 4060045657, + 2310216831, + 2161885273, + 463740097, + 3320733088, + 2679788998, + 209328867, + 4226617336, + 4212229160, + 483698526, + 1333335662, + 1855535420, + 1917921508, + 1272816122, + 1378258668, + 2435066688, + 2140908948, + 3467362216, + 3004567456, + 4160999350, + 923888509, + 1645443836, + 909768267, + 4273537606, + 1960078345, + 4149063109, + 4104657233, + 145000137, + 2609957754, + 3310517860, + 2446897611, + 899164751, + 2229389676, + 2221036374, + 1539334398, + 3330089617, + 1765383615, + 3763711499, + 421910936, + 3448751869, + 1621049914, + 1147639911, + 1529686394, + 3318394034, + 1729090464, + 3435733535, + 1296433427, + 2270640204, + 4158787083, + 941176363, + 644501852, + 1947374962, + 2342262564, + 1749720161, + 145195583, + 3222901866, + 2979029761, + 2387384540, + 1578154743, + 493557811, + 4119914824, + 3755997140, + 1643071070, + 3053439258, + 3689323839, + 2313397055, + 4283660817, + 3464028766, + 1416559128, + 2105543596, + 2133014067, + 2112892883, + 259821502, + 149424272, + 512856554, + 1672418444, + 467361716, + 3250587977, + 908451294, + 1942816352, + 1582371453, + 2896119838, + 816486928, + 631734781, + 1844846662, + 1280076626, + 4170768206, + 3683173020, + 1873327373, + 3743983790, + 1852120419, + 3065944889, + 3061493292, + 1794699824, + 893250899, + 886609199, + 310126016, + 1419872854, + 3040226311, + 2878592974, + 582524702, + 2236999606, + 2025267490, + 4012515079, + 2165063746, + 730766085, + 4135351210, + 2993097062, + 1852127821, + 262657135, + 673567935, + 1775845310, + 4028399587, + 1230948317, + 4234050950, + 1362871290, + 2715924346, + 2066046778, + 3428929219, + 3341616640, + 2339788777, + 2086355126, + 2725199360, + 1849923452, + 1175973624, + 2233476211, + 1991347873, + 829014462, + 1825865238, + 1965184669, + 975267481, + 46595678, + 2557785106, + 811574266, + 3247915325, + 3368386019, + 2379601218, + 788907575, + 2293019734, + 1927501611, + 1605783919, + 2282191775, + 3661322353, + 2626382163, + 280497544, + 1189432262, + 57024590, + 2528929736, + 665327650, + 3870875322, + 1826638421, + 2722124092, + 3148857462, + 3064558822, + 2046711335, + 2034300465, + 1389355403, + 333000367, + 796860310, + 3043618406, + 1914834441, + 629799586, + 1569054821, + 2338392282, + 1094525589, + 3261070555, + 1223637506, + 4153619590, + 790684817, + 942549977, + 3267002064, + 2373342028, + 3994157485, + 3019208078, + 3859399771, + 3380633873, + 3642559906, + 2312856724, + 2500863374, + 437168953, + 2892679325, + 3182486398, + 981944237, + 2128742411, + 2218720288, + 3338824819, + 653202450, + 2934652617, + 2541100365, + 1155095450, + 422531864, + 791379979, + 952490545, + 2927357074, + 3948306482, + 2057902523, + 618351941, + 3235228745, + 483908376, + 710951527, + 3728070669, + 1059306030, + 4167701777, + 119489089, + 1832822470, + 3568246870, + 4060621488, + 4210996863, + 1087603107, + 4274997761, + 3681408298, + 674130540, + 1329482100, + 2151552180, + 2432543922, + 4193589882, + 2241350842, + 3577549991, + 754996105, + 908356157, + 382014215, + 3930049312, + 1610415709, + 1428026652, + 3807150068, + 2786632703, + 1155819630, + 483007583, + 3192245457, + 2270791414, + 1682658148, + 515988794, + 2642227880, + 3141783864, + 1386208320, + 4136005319, + 4294836958, + 76807116, + 3515803745, + 323171196, + 676738793, + 1600625392, + 614848098, + 3320690393, + 2487022598, + 4224312546, + 2054962818, + 1039108732, + 2452358650, + 3580765992, + 3827580575, + 3789921621, + 282750964, + 3532983241, + 3717378777, + 3441345302, + 4031416900, + 1963588498, + 4180140348, + 1629416353, + 1063923727, + 1814362711, + 3872921286, + 2439149639, + 3348820517, + 795110956, + 814070728, + 2120654863, + 2462730831, + 3156373086, + 1122068934, + 2690825438, + 2800882421, + 2333826303, + 4234259056, + 2222639281, + 3313869688, + 4231777954, + 3065460833, + 3342671295, + 3698903890, + 3994077534, + 3852728810, + 2873872122, + 1159732917, + 3664184002, + 3264754007, + 896131975, + 2933072998, + 1604402444, + 3900187825, + 1802668104, + 3240331040, + 2946561771, + 2537152642, + 777979871, + 3476612908, + 3545770134, + 3188490725, + 2062599962, + 843772765, + 4238226774, + 2089973090, + 803433102, + 796626338, + 3346404946, + 1996933728, + 431803177, + 3895904889, + 3063857733, + 1804009975, + 2644942897, + 402652845, + 3842152752, + 1403840951, + 187067630, + 3056934183, + 3183111748, + 2052064666, + 3850468557, + 2556325016, + 349411883, + 3414681905, + 1798381080, + 723299229, + 3351774329, + 3801910432, + 3137977407, + 1210204205, + 4232579347, + 784506804, + 171817963, + 3727539894, + 2056464132, + 677188962, + 355896687, + 2683106581, + 2941256671, + 3993809316, + 3524637956, + 2927742616, + 3050709280, + 3293512600, + 1266062346, + 2126843725, + 2921201184, + 672170225, + 619962259, + 3162636062, + 4281532913, + 65809470, + 1098388967, + 3365558796, + 830256247, + 2604354729, + 1872825359, + 3754882452, + 2442134391, + 3366691874, + 20293660, + 2597281258, + 1917390716, + 2098499144, + 2924053071, + 2787237213, + 1021351977, + 3918119068, + 775779388, + 3963416736, + 2249259797, + 1843819468, + 3740301475, + 736128240, + 3219278611, + 3605727023, + 2041006693, + 1623759851, + 1715504484, + 3862162669, + 2525974341, + 4078329804, + 1509016604, + 2697857437, + 2586819840, + 56523595, + 488930665, + 986413675, + 2642169353, + 138345293, + 2242917528, + 2268662711, + 346318898, + 147197773, + 3841837556, + 3954777469, + 3832129510, + 3640480623, + 2876814972, + 53301836, + 1178549125, + 1042964379, + 3615429497, + 1115665124, + 428385685, + 2106592676, + 2075308956, + 1139461837, + 3501607349, + 3830039987, + 1981667006, + 2078463130, + 2798192040, + 191463463, + 44484323, + 3793254519, + 1866180755, + 247842214, + 2310522219, + 115050127, + 16732262, + 4050705535, + 1520024558, + 76514101, + 684069373, + 1425023879, + 3339540216, + 648002628, + 999675462, + 777037211, + 3022428632, + 1285180889, + 1175523016, + 1864687914, + 3777599156, + 3394737841, + 1835871183, + 3951793852, + 1128392853, + 3797013159, + 1069116278, + 482270404, + 1915945080, + 3969998897, + 627469184, + 4042501448, + 1594261498, + 2589641094, + 1079246689, + 3838731206, + 594852130, + 4277053771, + 2429617003, + 676144522, + 1737892495, + 1227494051, + 2318611485, + 49013457, + 3921227835, + 2786762884, + 910731383, + 1168194859, + 9642575, + 127199527, + 3649925994, + 3769788722, + 1689201522, + 434989291, + 3941246669, + 1672216854, + 373412811, + 3867004420, + 2923749037, + 1626433843, + 3965331887, + 3584237300, + 2811371311, + 262404305, + 28091528, + 449025602, + 705504802, + 2089588493, + 3011712742, + 1470958528, + 763779268, + 618060199, + 3638654456, + 733096105, + 4064999083, + 926371104, + 1915264222, + 2582118306, + 3701511194, + 412821304, + 148261924, + 2949947625, + 2593835270, + 1532575812, + 850237218, + 2230704553, + 2524334149, + 3640940699, + 398723182, + 2219547792, + 4281683682, + 2081601378, + 2696413195, + 2013282210, + 4158801828, + 1971975224, + 3802489601, + 868706264, + 3457812525, + 656351966, + 2205423432, + 3657441610, + 2792302574, + 3917526583, + 3588617585, + 3505484893, + 65995440, + 4182870409, + 2109275659, + 3012147760, + 1353852274, + 2768903660, + 2275333747, + 2460876492, + 1875881233, + 3123444436, + 3616447766, + 1279491127, + 1378636072, + 198439464, + 774098742, + 3333629931, + 1263703364, + 2613493166, + 3759579338, + 3948784287, + 2866276072, + 1225201490, + 276201254, + 3881378375, + 1333270594, + 1167020381, + 3731137425, + 2013128523, + 1268423363, + 584405902, + 4055009526, + 596780805, + 177058501, + 1796575846, + 834791297, + 812106056, + 3930619616, + 2450687041, + 2398592133, + 73633268, + 2418428653, + 1323758359, + 3009947970, + 2059603695, + 3133027753, + 904932591, + 682965083, + 96681634, + 2351559393, + 1778180248, + 97684980, + 544087357, + 132510544, + 2238533140, + 1998974594, + 2218957079, + 3008380177, + 1277902456, + 1268966366, + 1799517096, + 1856927371, + 4089824585, + 2948753552, + 2568533261, + 521835068, + 4038746296, + 2534721955, + 1670201290, + 1811728319, + 1162167024, + 1898549625, + 2948654562, + 2901009959, + 2911677598, + 2815310171, + 2188874185, + 1412854430, + 3961550766, + 484486531, + 4085203874, + 3579822099, + 4008947238, + 1166984647, + 1721572921, + 736203889, + 2747611365, + 39535860, + 764171606, + 1257015503, + 450778859, + 85371943, + 1053725362, + 3644040440, + 2772669301, + 3233733039, + 1431861525, + 3038381423, + 2367217206, + 2283649730, + 2350364717, + 2318128572, + 4107324983, + 157401561, + 2083781953, + 3651226453, + 1235634317, + 3750381436, + 1675554264, + 4155575911, + 467446369, + 4214686705, + 702634488, + 712303856, + 1567960561, + 352541654, + 534026899, + 75369890, + 2267458491, + 3066769099, + 3590411684, + 2942380588, + 881135058, + 439876215, + 2082200170, + 959131200, + 3226184012, + 1805705006, + 416278905, + 782761798, + 2369948697, + 3572666534, + 2017624022, + 3047715234, + 3344610103, + 11286863, + 3614361294, + 419756996, + 3418374957, + 2392045573, + 3625839705, + 4153182098, + 1895009374, + 826795971, + 832382701, + 2855552421, + 516640076, + 3097326875, + 3644017095, + 1736375288, + 1300883159, + 1269079230, + 1674589912, + 837820457, + 3029532264, + 1490398314, + 354933151, + 930667207, + 3953267744, + 2680672153, + 1318017163, + 2378410107, + 3097115773, + 666792341, + 3990985381, + 1648033602, + 1224083901, + 3099232804, + 3602024913, + 523107329, + 1022998336, + 3947062226, + 1268698866, + 4112447150, + 4223496263, + 1895607367, + 1343346673, + 1569239232, + 2399117239, + 2759164767, + 424112782, + 2999714242, + 3839520214, + 3314031761, + 3013173863, + 4008685429, + 1859553225, + 3201257446, + 951117575, + 962987170, + 2171781711, + 2867468459, + 702794149, + 534839807, + 1098520569, + 1024505647, + 24855164, + 1256888684, + 710341630, + 1174171716, + 3969936172, + 352947582, + 1411359691, + 54895399, + 2892538927, + 3811309541, + 1176667248, + 3186571320, + 293018143, + 900275224, + 659668098, + 3631091882, + 3986557919, + 936854263, + 4126162164, + 199206557, + 800343554, + 2500420459, + 2458776993, + 1621984938, + 2230381795, + 3838336695, + 653186451, + 562093729, + 3349474947, + 2470582152, + 3546432662, + 3823404387, + 304228255, + 353650518, + 2795844961, + 3214597674, + 3015830200, + 4096190060, + 1543999773, + 2444608841, + 3075921961, + 2031701624, + 323849339, + 2014036834, + 1932434993, + 1783510482, + 3346370619, + 3330914332, + 3105291544, + 349723954, + 1675851464, + 2585923998, + 267181220, + 434982258, + 2927628937, + 879031861, + 829651118, + 1529714926, + 1305112881, + 655409987, + 294227343, + 3664549701, + 1965090441, + 2820969974, + 3312826721, + 1303484127, + 467549319, + 44215721, + 2655461949, + 703657140, + 3159835048, + 3294492288, + 488218680, + 1964778353, + 233844683, + 4185425450, + 3872509500, + 4098454089, + 2800291767, + 2049071061, + 908392705, + 1142278725, + 2090776485, + 3055917391, + 2147747064, + 3866581725, + 2697987686, + 4061072129, + 416325161, + 4024789556, + 3949568669, + 1651938261, + 2001230526, + 2214888316, + 1290801298, + 56776513, + 3076417836, + 782612911, + 4080283099, + 1316028805, + 1807111252, + 2777418569, + 3799697770, + 3330724764, + 2407025605, + 2192635776, + 1326386751, + 181906659, + 2704591245, + 2332288315, + 2737340993, + 4059819915, + 800157879, + 747116247, + 3945901931, + 458863766, + 378603463, + 91229112, + 3864173522, + 4214835466, + 3064324016, + 4031418592, + 2576908259, + 2186052755, + 693230468, + 821948431, + 1336473518, + 3207554338, + 335661082, + 1077176246, + 1426162940, + 1820590050, + 1417870939, + 3388072119, + 3246018275, + 3372034332, + 1695090955, + 533758541, + 3747368538, + 2774266417, + 2510062606, + 2704449381, + 4121145487, + 2462398255, + 3268788624, + 3053479996, + 1728135600, + 1938970514, + 486276401, + 755968338, + 2808294971, + 243486179, + 606849281, + 3481880608, + 1411375291, + 2656196723, + 4224811222, + 3631388422, + 2278146836, + 3733751032, + 3961916465, + 3261521110, + 1420196268, + 1258193807, + 2659699489, + 1611917429, + 158232153, + 1584612074, + 1267240863, + 2310854487, + 1850517899, + 3176110028, + 416228777, + 3597142880, + 1629335335, + 3536618743, + 3177662462, + 477969971, + 3209900985, + 2324893944, + 415783425, + 1618396469, + 1493894855, + 633482031, + 3982163311, + 733741291, + 3126125588, + 631696679, + 1662825477, + 4060849839, + 240321249, + 2629314498, + 2308625154, + 3298230757, + 2094035381, + 2448544132, + 644550256, + 4086036965, + 3904414106, + 1105783923, + 1999294884, + 12938091, + 3177597203, + 3515511920, + 949893149, + 302406862, + 2303518825, + 1860144458, + 3120657464, + 3694882408, + 533118851, + 3610021132, + 4180819413, + 4211694495, + 807526974, + 3082847119, + 253261122, + 2237573669, + 2801227628, + 1492451662, + 1924428806, + 2492168098, + 3160332356, + 3024419586, + 416040863, + 2865131814, + 3432150765, + 149942107, + 2648035347, + 1196590407, + 3250439732, + 1657627630, + 2921554569, + 3559902179, + 2585257874, + 2672141553, + 1599015564, + 1669205433, + 1232079306, + 2031093558, + 823815439, + 4150417094, + 1820201172, + 1815421953, + 3206591444, + 1858525952, + 3989297502, + 3897322535, + 3039237399, + 1822254544, + 1094685678, + 3014486625, + 3296369886, + 819605445, + 2301430806, + 758484992, + 3519565348, + 2941739604, + 1864720513, + 1001549772, + 3571932590, + 2837022153, + 3111394295, + 2930402870, + 336637292, + 201524449, + 3792470956, + 1441035357, + 4088850212, + 348517569, + 1099546100, + 2693113219, + 1302022858, + 2597824709, + 1460682945, + 3795402757, + 832670163, + 2161598456, + 272941335, + 1956615701, + 4289834837, + 3974568319, + 3129120079, + 2835024892, + 1535440269, + 2764283800, + 3849170740, + 2532849576, + 1393346290, + 3955100548, + 2176470259, + 1501367983, + 2889172817, + 955590644, + 3424074647, + 2823911740, + 138393248, + 2038338126, + 2195665969, + 1815047195, + 25304805, + 4119242750, + 757734669, + 158431202, + 1990222844, + 928084540, + 866445566, + 603077282, + 289207226, + 323744920, + 1673628820, + 230077529, + 1866750838, + 3762323375, + 1834075343, + 1654283938, + 1040388679, + 71195727, + 1992932072, + 2522787951, + 634128146, + 2876094984, + 415221617, + 1999215147, + 2608063424, + 2815438799, + 1530715007, + 2294075964, + 2566134908, + 490172150, + 1058618652, + 2651555573, + 704241932, + 3104613119, + 1307172836, + 77093844, + 615001013, + 2779210409, + 1313973035, + 2762574899, + 3074898898, + 441858423, + 2877948316, + 1094647799, + 3413922445, + 2378611449, + 329721039, + 2913598359, + 2864015854, + 3519308163, + 1729105743, + 1638298152, + 395083479, + 2106960342, + 983494394, + 611499992, + 1835906434, + 2727628623, + 2631083332, + 515509616, + 1452543625, + 2423944126, + 3700294992, + 3518701814, + 802711260, + ]; + + static final String privateKeyFCM = String.fromCharCodes(List.generate( + _envieddataprivateKeyFCM.length, + (int i) => i, + growable: false, + ).map((int i) => _envieddataprivateKeyFCM[i] ^ _enviedkeyprivateKeyFCM[i])); + + static const List _enviedkeywhatsapp = [ + 2195178301, + 3209380850, + 1354557741, + 3929837379, + 1591686318, + 4071448521, + 3185014801, + 2843870169, + 4138568645, + 4151498043, + 2009638225, + 1788134088, + 692552165, + 1814325043, + 74171917, + 125768942, + 699397262, + 386340904, + 1662558290, + 2127416697, + 585544007, + 1965711064, + 1685593387, + 3809982822, + 1429440299, + 2822552659, + 682862704, + 2900742296, + 1315219140, + 2568147650, + 3433092805, + 2096720512, + 3558503385, + 3030328327, + 3978098942, + 2207533466, + 958706050, + 2404477182, + 4010028186, + 1254763188, + 2880760711, + 4232257065, + 2886911806, + 2223199226, + 1440935776, + 3660652774, + 1159627196, + 2870001472, + 90361961, + 3674388050, + 395337328, + 2431151023, + 372277701, + 24261392, + 3891421216, + 3397668061, + 862485094, + 3961829532, + 2293076854, + 2540450332, + 2677209958, + 432765038, + 1667396322, + 3809917285, + 3301074614, + 1274683329, + 1248313923, + 22214291, + 1711065323, + 2113754018, + 164312308, + 363863883, + 2238507626, + 2591288262, + 3960354826, + 2018244503, + 3477557962, + 1704464098, + 2877525932, + 257901994, + 1816659461, + 4229879381, + 3489093377, + 551393958, + 2537805475, + 1897371090, + 2763877329, + 1996277607, + 2399098915, + 1121715459, + 3614002814, + 2357512223, + 1296599339, + 1879213339, + 2923557284, + 421747258, + 4276033811, + 3304851021, + 1705047204, + 1995359807, + 2423007263, + 196793214, + 2222802126, + 779165875, + 3944609229, + 1600819663, + 958509817, + 1458920477, + 1557043792, + 4017603323, + 1921251172, + 3416801714, + 692142935, + 2175162433, + 1708936620, + 1755875901, + 3212952007, + 3701352111, + 2496150072, + 1852492092, + 3008159071, + 3127938689, + 3924346392, + 2965283356, + 2520654939, + 1887806822, + 4082420582, + 3786680357, + 389645735, + 1102559840, + 3433447458, + 1831088100, + 3654951710, + 3885368661, + 1820711043, + 2316653757, + 859130893, + 284201899, + 2775377843, + 2134107539, + 2511195831, + 1326689378, + 1768277617, + 1227335424, + 3034173561, + 4129615929, + 3071108492, + 2054831300, + 129591603, + 3567725506, + 3214497052, + 453068456, + 59334561, + 3676086223, + 693176829, + 301127476, + 1208826363, + 2521489431, + 611371415, + 1277900119, + 546156606, + 749490027, + 3111892475, + 5222637, + 2717236262, + 428555533, + 1624443954, + 2469656005, + 1567989936, + 947776256, + 597957949, + 3774420439, + 3528075689, + 3000608003, + 979036119, + 4022838460, + 3869851866, + 2585506398, + 3297419369, + 4096822531, + 3785166482, + 1241855345, + 3382265108, + 2071876894, + 3774296598, + 1859545063, + 48690547, + 2448172526, + 508575221, + 3079528144, + 2126566410, + 3719512705, + 3567964726, + 387031529, + 2940653106, + 4072585693, + 2710228746, + 1776950620, + 3178200575, + 159674039, + 386365052, + 1027281953, + 3038099569, + 1048572713, + 1770522600, + 1825291100, + 4197445491, + 2879263647, + 3866415307, + 3743397482, + 2882999645, + 3727700660, + 2370802571, + 4274588782, + 3006185657, + 814187990, + 2829073772, + 2988525058, + 1605832067, + 1320167835, + 3924541678, + 2238305706, + 978901059, + 1333890184, + 3405197759, + ]; + + static const List _envieddatawhatsapp = [ + 2195178360, + 3209380787, + 1354557804, + 3929837324, + 1591686362, + 4071448491, + 3185014859, + 2843870107, + 4138568598, + 4151498094, + 2009638170, + 1788134143, + 692552145, + 1814325105, + 74171970, + 125768852, + 699397337, + 386340881, + 1662558251, + 2127416603, + 585544048, + 1965711084, + 1685593454, + 3809982721, + 1429440362, + 2822552611, + 682862625, + 2900742337, + 1315219120, + 2568147595, + 3433092861, + 2096720568, + 3558503351, + 3030328414, + 3978098826, + 2207533535, + 958706107, + 2404477076, + 4010028235, + 1254763229, + 2880760766, + 4232257144, + 2886911824, + 2223199158, + 1440935719, + 3660652694, + 1159627211, + 2870001523, + 90361903, + 3674387971, + 395337216, + 2431151052, + 372277744, + 24261492, + 3891421272, + 3397667988, + 862485002, + 3961829592, + 2293076753, + 2540450378, + 2677209900, + 432764948, + 1667396225, + 3809917224, + 3301074639, + 1274683318, + 1248313862, + 22214353, + 1711065242, + 2113754092, + 164312237, + 363863853, + 2238507609, + 2591288245, + 3960354866, + 2018244583, + 3477557921, + 1704464009, + 2877525914, + 257902025, + 1816659551, + 4229879319, + 3489093428, + 551394039, + 2537805459, + 1897371046, + 2763877306, + 1996277548, + 2399098966, + 1121715536, + 3614002737, + 2357512261, + 1296599401, + 1879213416, + 2923557355, + 421747276, + 4276033886, + 3304850967, + 1705047269, + 1995359756, + 2423007307, + 196793117, + 2222802106, + 779165915, + 3944609277, + 1600819590, + 958509717, + 1458920543, + 1557043736, + 4017603240, + 1921251077, + 3416801791, + 692142849, + 2175162421, + 1708936655, + 1755875951, + 3212951965, + 3701352172, + 2496150091, + 1852492125, + 3008158987, + 3127938762, + 3924346454, + 2965283407, + 2520654862, + 1887806742, + 4082420480, + 3786680425, + 389645813, + 1102559783, + 3433447536, + 1831088006, + 3654951726, + 3885368615, + 1820711147, + 2316653809, + 859130984, + 284201937, + 2775377917, + 2134107605, + 2511195867, + 1326689294, + 1768277505, + 1227335513, + 3034173499, + 4129615966, + 3071108577, + 2054831274, + 129591637, + 3567725472, + 3214497140, + 453068541, + 59334592, + 3676086197, + 693176750, + 301127534, + 1208826297, + 2521489486, + 611371471, + 1277900083, + 546156620, + 749490015, + 3111892427, + 5222531, + 2717236299, + 428555587, + 1624443910, + 2469655956, + 1567990005, + 947776359, + 597957962, + 3774420402, + 3528075746, + 3000608049, + 979036082, + 4022838477, + 3869851779, + 2585506319, + 3297419271, + 4096822615, + 3785166534, + 1241855295, + 3382265185, + 2071876972, + 3774296687, + 1859545011, + 48690492, + 2448172439, + 508575159, + 3079528123, + 2126566465, + 3719512795, + 3567964788, + 387031512, + 2940653183, + 4072585605, + 2710228807, + 1776950571, + 3178200521, + 159674082, + 386365003, + 1027282032, + 3038099487, + 1048572797, + 1770522554, + 1825291021, + 4197445431, + 2879263719, + 3866415235, + 3743397384, + 2882999560, + 3727700706, + 2370802663, + 4274588703, + 3006185694, + 814187935, + 2829073726, + 2988525142, + 1605832177, + 1320167923, + 3924541583, + 2238305733, + 978901036, + 1333890258, + 3405197819, + ]; + + static final String whatsapp = String.fromCharCodes(List.generate( + _envieddatawhatsapp.length, + (int i) => i, + growable: false, + ).map((int i) => _envieddatawhatsapp[i] ^ _enviedkeywhatsapp[i])); + + static const List _enviedkeywhatappID = [ + 989542896, + 1312943830, + 4249780588, + 662508841, + 2421555065, + 459150042, + 3082103575, + 3384119932, + 1156738938, + 1133581554, + 4137434583, + 3461970751, + 1388535488, + 304993762, + 356632629, + 253112440, + ]; + + static const List _envieddatawhatappID = [ + 989542851, + 1312943840, + 4249780565, + 662508816, + 2421555018, + 459150051, + 3082103584, + 3384119887, + 1156738892, + 1133581504, + 4137434607, + 3461970702, + 1388535537, + 304993754, + 356632578, + 253112385, + ]; + + static final String whatappID = String.fromCharCodes(List.generate( + _envieddatawhatappID.length, + (int i) => i, + growable: false, + ).map((int i) => _envieddatawhatappID[i] ^ _enviedkeywhatappID[i])); + + static const List _enviedkeyserverPHP = [ + 1596386464, + 4184763474, + 3336799785, + 2511532898, + 1073383562, + 2680352819, + 6213250, + 3028870952, + 3765838608, + 667045674, + 2389685740, + 1318393649, + 3558916360, + 3107718237, + 1941477742, + 3568196280, + 550152871, + 3861822687, + 3516485351, + 3801468140, + 688236691, + 1449136176, + 3798082515, + 523384365, + 3379327226, + 1465957842, + 1673525064, + 3992363005, + ]; + + static const List _envieddataserverPHP = [ + 1596386504, + 4184763430, + 3336799837, + 2511532818, + 1073383673, + 2680352777, + 6213293, + 3028870919, + 3765838705, + 667045722, + 2389685637, + 1318393631, + 3558916475, + 3107718200, + 1941477640, + 3568196317, + 550152917, + 3861822705, + 3516485259, + 3801468037, + 688236773, + 1449136213, + 3798082556, + 523384414, + 3379327135, + 1465957812, + 1673525037, + 3992362895, + ]; + + static final String serverPHP = String.fromCharCodes(List.generate( + _envieddataserverPHP.length, + (int i) => i, + growable: false, + ).map((int i) => _envieddataserverPHP[i] ^ _enviedkeyserverPHP[i])); + + static const List _enviedkeyseferAlexandriaServer = [ + 3358548595, + 2512426865, + 4211675632, + 736757099, + 4035970416, + 275731637, + 1556924929, + 229626338, + 2020624319, + 3797804671, + 2355630569, + 2593772477, + 2607101885, + 3119099041, + 2061692935, + 1999953759, + 2475610928, + 2999190758, + 1098196106, + 583762613, + 4184420487, + 2880339752, + 3518760739, + 2052354987, + 3672884492, + 2288706798, + 960697452, + 1237051374, + 4091542731, + 2885104159, + 3611912999, + 3730363361, + 3160794307, + 4128967402, + ]; + + static const List _envieddataseferAlexandriaServer = [ + 3358548507, + 2512426757, + 4211675524, + 736757019, + 4035970307, + 275731599, + 1556924974, + 229626317, + 2020624332, + 3797804570, + 2355630479, + 2593772504, + 2607101903, + 3119099072, + 2061693035, + 1999953722, + 2475610952, + 2999190663, + 1098196196, + 583762641, + 4184420597, + 2880339777, + 3518760770, + 2052354949, + 3672884607, + 2288706695, + 960697368, + 1237051275, + 4091542756, + 2885104236, + 3611913026, + 3730363271, + 3160794278, + 4128967320, + ]; + + static final String seferAlexandriaServer = String.fromCharCodes( + List.generate( + _envieddataseferAlexandriaServer.length, + (int i) => i, + growable: false, + ).map((int i) => + _envieddataseferAlexandriaServer[i] ^ + _enviedkeyseferAlexandriaServer[i])); + + static const List _enviedkeyseferPaymentServer = [ + 2536778377, + 914589121, + 4294383065, + 4187691988, + 1313379883, + 3096121362, + 2467489969, + 1785568245, + 2023741290, + 1558192803, + 4020226669, + 1287675149, + 3596015768, + 3697427363, + 3726876343, + 3117159911, + 314938860, + 1092767539, + 1505217695, + 714664040, + 2209431449, + 2772347254, + 1664626586, + 298494882, + 975206623, + 415930237, + ]; + + static const List _envieddataseferPaymentServer = [ + 2536778465, + 914589109, + 4294383021, + 4187691940, + 1313379928, + 3096121384, + 2467489950, + 1785568218, + 2023741209, + 1558192838, + 4020226571, + 1287675240, + 3596015850, + 3697427411, + 3726876352, + 3117159881, + 314938783, + 1092767579, + 1505217776, + 714663960, + 2209431478, + 2772347141, + 1664626687, + 298494916, + 975206586, + 415930127, + ]; + + static final String seferPaymentServer = String.fromCharCodes( + List.generate( + _envieddataseferPaymentServer.length, + (int i) => i, + growable: false, + ).map((int i) => + _envieddataseferPaymentServer[i] ^ _enviedkeyseferPaymentServer[i])); + + static const List _enviedkeyseferCairoServer = [ + 696334204, + 82205298, + 3710476921, + 4092767670, + 2190067332, + 1670086747, + 1381900254, + 1688623029, + 2013479453, + 1171258800, + 2598200499, + 2895700044, + 3077488725, + 121049537, + 882201803, + 2605480560, + 3705670814, + 1493938047, + 193485687, + 1588057356, + 215003196, + 1980543392, + 2593350780, + 696663381, + 1099553710, + 2824766986, + 1273774926, + 389654838, + 2798992030, + 3843201537, + 2443362958, + 2887005875, + 2521267288, + 162322523, + 2110833538, + 2692111954, + 1533322716, + 3324903079, + 77020491, + 116375034, + 3205463677, + 87462844, + 3463747915, + ]; + + static const List _envieddataseferCairoServer = [ + 696334100, + 82205190, + 3710476813, + 4092767686, + 2190067447, + 1670086753, + 1381900273, + 1688623002, + 2013479534, + 1171258837, + 2598200513, + 2895700026, + 3077488688, + 121049523, + 882201829, + 2605480451, + 3705670907, + 1493937945, + 193485586, + 1588057470, + 215003154, + 1980543436, + 2593350677, + 696663331, + 1099553739, + 2824767013, + 1273774909, + 389654867, + 2798992120, + 3843201636, + 2443363068, + 2887005853, + 2521267259, + 162322487, + 2110833643, + 2692111921, + 1533322679, + 3324903048, + 77020472, + 116374943, + 3205463579, + 87462873, + 3463747897, + ]; + + static final String seferCairoServer = String.fromCharCodes( + List.generate( + _envieddataseferCairoServer.length, + (int i) => i, + growable: false, + ).map((int i) => + _envieddataseferCairoServer[i] ^ _enviedkeyseferCairoServer[i])); + + static const List _enviedkeyseferGizaServer = [ + 1896330948, + 2817987802, + 3416139627, + 1186349963, + 1973864273, + 2421814679, + 3267349214, + 366331080, + 3924450237, + 2494709682, + 361900306, + 609805057, + 2425514810, + 4085913011, + 723237017, + 4232595940, + 1644502061, + 1329346891, + 104712329, + 325616937, + 1372199061, + 939642319, + 2936220426, + 88034485, + 3569749753, + 628084804, + 937654873, + 3155284282, + 4070949377, + 2727816229, + ]; + + static const List _envieddataseferGizaServer = [ + 1896330924, + 2817987758, + 3416139551, + 1186350075, + 1973864226, + 2421814701, + 3267349233, + 366331111, + 3924450266, + 2494709723, + 361900392, + 609805152, + 2425514825, + 4085913046, + 723237119, + 4232595841, + 1644502111, + 1329346917, + 104712422, + 325616967, + 1372199161, + 939642278, + 2936220516, + 88034512, + 3569749718, + 628084791, + 937654844, + 3155284316, + 4070949476, + 2727816279, + ]; + + static final String seferGizaServer = String.fromCharCodes(List.generate( + _envieddataseferGizaServer.length, + (int i) => i, + growable: false, + ).map( + (int i) => _envieddataseferGizaServer[i] ^ _enviedkeyseferGizaServer[i])); + + static const List _enviedkeychatGPTkeySeferNew = [ + 3466533538, + 2038222324, + 424905249, + 657497677, + 318605853, + 25823056, + 2122702942, + 3276918720, + 229974915, + 313873793, + 66707537, + 2125062029, + 418011015, + 3286523022, + 3874869365, + 1738222491, + 1832141258, + 3991814487, + 1394206019, + 1362842969, + 2048833378, + 549182735, + 2582344274, + 3862745041, + 485631606, + 3396351541, + 3395759411, + 3923657519, + 2485452191, + 3450575002, + 51239110, + 701696952, + 169855577, + 2101939952, + 386881292, + 3931378865, + 1788305527, + 2140319768, + 915405024, + 2168797947, + 965441877, + 864489716, + 2459344062, + 4073375293, + 2027821373, + 3854161652, + 4247545755, + 2368242223, + 4156535058, + 4190459134, + 146823609, + 274418455, + 926108913, + 1213802406, + 1505340403, + 4248083829, + 283157476, + 1905871628, + ]; + + static const List _envieddatachatGPTkeySeferNew = [ + 3466533592, + 2038222227, + 424905228, + 657497623, + 318605865, + 25823039, + 2122702879, + 3276918666, + 229975008, + 313873856, + 66707459, + 2125062082, + 418011104, + 3286523072, + 3874869293, + 1738222577, + 1832141229, + 3991814437, + 1394205958, + 1362842896, + 2048833335, + 549182775, + 2582344244, + 3862744986, + 485631541, + 3396351500, + 3395759467, + 3923657565, + 2485452263, + 3450575101, + 51239059, + 701697021, + 169855597, + 2101939873, + 386881400, + 3931378883, + 1788305413, + 2140319860, + 915404945, + 2168797898, + 965441836, + 864489629, + 2459344075, + 4073375301, + 2027821325, + 3854161566, + 4247545815, + 2368242204, + 4156535158, + 4190459063, + 146823661, + 274418500, + 926108841, + 1213802452, + 1505340331, + 4248083737, + 283157414, + 1905871712, + ]; + + static final String chatGPTkeySeferNew = String.fromCharCodes( + List.generate( + _envieddatachatGPTkeySeferNew.length, + (int i) => i, + growable: false, + ).map((int i) => + _envieddatachatGPTkeySeferNew[i] ^ _enviedkeychatGPTkeySeferNew[i])); + + static const List _enviedkeycohere = [ + 461114257, + 1909279421, + 2571976523, + 3833424498, + 4108484119, + 2763189153, + 1555394195, + 768191425, + 2583342941, + 2986819785, + 3554360607, + 904530186, + 3674480823, + 511161046, + 2903018933, + 2034412479, + 1318265865, + 210960433, + 2648764878, + 1081389400, + 815968213, + 1680999960, + 3705188975, + 3217580678, + 3395565768, + 3707066727, + 2457012709, + 3196855878, + 1223377586, + 4269901275, + 2145367579, + 2084645856, + 919445276, + 887658305, + 39983299, + 2766187929, + 3565171062, + 3226295112, + 2524509497, + 4176116153, + 3325311635, + 2760789061, + 3596276175, + 2939813184, + 3655446295, + 139494125, + 3949175622, + ]; + + static const List _envieddatacohere = [ + 461114320, + 1909279432, + 2571976487, + 3833424389, + 4108484211, + 2763189145, + 1555394282, + 768191476, + 2583342862, + 2986819737, + 3554360648, + 904530277, + 3674480836, + 511161062, + 2903018973, + 2034412533, + 1318265953, + 210960477, + 2648764809, + 1081389416, + 815968161, + 1681000055, + 3705188922, + 3217580768, + 3395565808, + 3707066624, + 2457012650, + 3196855854, + 1223377639, + 4269901198, + 2145367657, + 2084645776, + 919445370, + 887658356, + 39983250, + 2766187947, + 3565170978, + 3226295064, + 2524509524, + 4176116207, + 3325311700, + 2760789021, + 3596276157, + 2939813144, + 3655446395, + 139494063, + 3949175594, + ]; + + static final String cohere = String.fromCharCodes(List.generate( + _envieddatacohere.length, + (int i) => i, + growable: false, + ).map((int i) => _envieddatacohere[i] ^ _enviedkeycohere[i])); + + static const List _enviedkeyclaudeAiAPI = [ + 3865518948, + 3691370737, + 153446920, + 2831596722, + 276220260, + 3835327173, + 2029631399, + 1751783204, + 3546570644, + 3223277567, + 2249520572, + 3021181899, + 4217743719, + 3054127439, + 3053149162, + 3407318902, + 2698972141, + 1463864797, + 3473787449, + 3149571604, + 2552911671, + 926290749, + 384126610, + 1186214951, + 2315825860, + 3624681797, + 1335410838, + 1725266679, + 3926100668, + 3167871771, + 155899774, + 3020911388, + 3210585518, + 1945161006, + 3469755727, + 223619508, + 811556885, + 3406051438, + 1257144806, + 512409761, + 2709697942, + 82036611, + 3464715523, + 1487923078, + 2660912469, + 2123828998, + 3927632976, + 3115047666, + 2387112906, + 3451946414, + 2038358785, + 656670454, + 1670023080, + 3545160744, + 3558280203, + 2680808716, + 1863700488, + 3991492399, + 3358198061, + 3173780453, + 974696064, + 2087721129, + 121537675, + 707663622, + 2009141519, + 3454852459, + 1387808088, + 1239033534, + 4184576603, + 458014798, + 2011840473, + 1826021233, + 776086541, + 1101947340, + 565508932, + 405292776, + 1312787214, + 656794198, + 290298861, + 1848376527, + 3931415046, + 2513478435, + 1212901434, + 4115540979, + 88458918, + 2791271761, + 1220140566, + 3518763645, + 1382833174, + 746086992, + 1546012069, + 1083122868, + 3393640872, + 2746504074, + 532953435, + 1027840401, + 2181683573, + 3123978849, + 3599977697, + 3838316380, + 173045403, + 3104850093, + 1404873562, + 3674449953, + 3614418559, + 2511654960, + 1427723575, + 121766171, + 3317988018, + 2951678773, + 4259760746, + 2956466636, + 684482035, + 387203139, + 1017126403, + ]; + + static const List _envieddataclaudeAiAPI = [ + 3865518878, + 3691370646, + 153446949, + 2831596739, + 276220166, + 3835327142, + 2029631370, + 1751783253, + 3546570722, + 3223277456, + 2249520527, + 3021181938, + 4217743627, + 3054127458, + 3053149074, + 3407318817, + 2698972066, + 1463864741, + 3473787504, + 3149571667, + 2552911680, + 926290794, + 384126662, + 1186215016, + 2315825854, + 3624681734, + 1335410896, + 1725266613, + 3926100690, + 3167871826, + 155899687, + 3020911439, + 3210585573, + 1945161061, + 3469755687, + 223619538, + 811556972, + 3406051348, + 1257144761, + 512409834, + 2709697984, + 82036674, + 3464715637, + 1487923188, + 2660912413, + 2123829035, + 3927632998, + 3115047597, + 2387112958, + 3451946484, + 2038358852, + 656670396, + 1670023140, + 3545160734, + 3558280243, + 2680808779, + 1863700567, + 3991492478, + 3358198127, + 3173780397, + 974696114, + 2087721119, + 121537764, + 707663715, + 2009141595, + 3454852388, + 1387808021, + 1239033587, + 4184576564, + 458014751, + 2011840428, + 1826021142, + 776086580, + 1101947271, + 565508913, + 405292711, + 1312787300, + 656794172, + 290298790, + 1848376476, + 3931415126, + 2513478524, + 1212901499, + 4115540935, + 88458997, + 2791271778, + 1220140613, + 3518763560, + 1382833234, + 746086972, + 1546012103, + 1083122892, + 3393640954, + 2746504115, + 532953407, + 1027840484, + 2181683491, + 3123978779, + 3599977614, + 3838316301, + 173045430, + 3104850144, + 1404873521, + 3674450041, + 3614418464, + 2511655013, + 1427723622, + 121766218, + 3317988067, + 2951678829, + 4259760664, + 2956466580, + 684481951, + 387203073, + 1017126511, + ]; + + static final String claudeAiAPI = String.fromCharCodes(List.generate( + _envieddataclaudeAiAPI.length, + (int i) => i, + growable: false, + ).map((int i) => _envieddataclaudeAiAPI[i] ^ _enviedkeyclaudeAiAPI[i])); + + static const List _enviedkeypayPalClientId = [ + 1417678867, + 859809472, + 1893866620, + 76147435, + 2344469715, + 27085632, + 1195225715, + 3334407434, + 2270571526, + 3830243977, + 2841189154, + 1406375990, + 2428043550, + 3394915516, + 1529631236, + 3192457920, + 904524636, + 2772367473, + 3581045416, + 3218543009, + 3102449874, + 2543684227, + 600303817, + 1891847041, + 856826713, + 1049355133, + 3672953571, + 389925974, + 55813972, + 3030235698, + 3435846944, + 3855759220, + 760590774, + 2624080268, + 3012415415, + 2143075304, + 3295633911, + 66346832, + 648991051, + 3718256520, + 10021964, + 4280365731, + 2978489502, + 1779750536, + 821551981, + 3363875568, + 3149066482, + 3879034467, + 2339143794, + 590415096, + 1499871715, + 2648064182, + 585275144, + 3000069715, + 4237559885, + 2787035513, + 200871348, + 3036013234, + 1460627235, + 3867857809, + 31809830, + 579752314, + 3008074094, + 502211605, + 269519034, + 3074850116, + 4019892143, + 382952498, + 3557029364, + 2516706871, + 3143765389, + 397362660, + 1352541903, + 2626325733, + 4165782338, + 2706947015, + 2891622639, + 3816666629, + 2977145829, + 2858774920, + 2442731139, + 1271073831, + 3394814892, + 2823537888, + 1253144115, + 1492966545, + 3940162498, + ]; + + static const List _envieddatapayPalClientId = [ + 1417678914, + 859809409, + 1893866544, + 76147346, + 2344469694, + 27085612, + 1195225621, + 3334407492, + 2270571599, + 3830244028, + 2841189238, + 1406376012, + 2428043626, + 3394915464, + 1529631351, + 3192457965, + 904524581, + 2772367362, + 3581045447, + 3218543067, + 3102449892, + 2543684341, + 600303757, + 1891847093, + 856826630, + 1049355027, + 3672953490, + 389925902, + 55813988, + 3030235745, + 3435847029, + 3855759104, + 760590813, + 2624080335, + 3012415464, + 2143075225, + 3295633838, + 66346758, + 648991078, + 3718256605, + 10021931, + 4280365768, + 2978489515, + 1779750639, + 821551884, + 3363875517, + 3149066413, + 3879034459, + 2339143720, + 590415061, + 1499871624, + 2648064209, + 585275196, + 3000069663, + 4237559928, + 2787035466, + 200871391, + 3036013194, + 1460627318, + 3867857892, + 31809886, + 579752229, + 3008074074, + 502211711, + 269519103, + 3074850067, + 4019892215, + 382952566, + 3557029279, + 2516706937, + 3143765501, + 397362620, + 1352541832, + 2626325686, + 4165782293, + 2706946967, + 2891622559, + 3816666700, + 2977145759, + 2858774988, + 2442731205, + 1271073919, + 3394814942, + 2823537848, + 1253144159, + 1492966611, + 3940162478, + ]; + + static final String payPalClientId = String.fromCharCodes(List.generate( + _envieddatapayPalClientId.length, + (int i) => i, + growable: false, + ).map((int i) => _envieddatapayPalClientId[i] ^ _enviedkeypayPalClientId[i])); + + static const List _enviedkeypayPalSecret = [ + 305307351, + 3871644781, + 689366590, + 1145404139, + 2738959721, + 2603602599, + 1954834424, + 248616681, + 2944246499, + 151733761, + 2982419777, + 3117076764, + 1066830186, + 822987100, + 187896188, + 78534598, + 1036683290, + 75687099, + 3120225806, + 2773389544, + 1767958175, + 1913249305, + 3440830193, + 846020206, + 184611923, + 3422454224, + 666548823, + 2890272748, + 311826648, + 656894851, + 1015140947, + 944766913, + 2824039557, + 1729684740, + 3823670423, + 2340377013, + 3488764746, + 4214065147, + 3592570438, + 2636452054, + 2933103145, + 655748206, + 3740569120, + 1506594710, + 2344840654, + 3783597206, + 1177928127, + 1803755571, + 3706364536, + 329851065, + 405114068, + 4165888009, + 1966619058, + 2914286955, + 4199143837, + 3319499606, + 1484938375, + 2281390537, + 3699915191, + 13784010, + 1905775355, + 2964823272, + 2833850347, + 2710162265, + 177271164, + 3402747143, + 643614458, + 2591204193, + 4248973377, + 3395135148, + 2934150319, + 1845856018, + 2286304688, + 1694302679, + 3169934074, + 3279088172, + 4149021202, + 2370967428, + 2749475055, + 2468489206, + 181482439, + 2194607960, + 2595544111, + 3739497023, + 510497184, + 2051497186, + ]; + + static const List _envieddatapayPalSecret = [ + 305307293, + 3871644719, + 689366655, + 1145404074, + 2738959647, + 2603602646, + 1954834354, + 248616632, + 2944246436, + 151733844, + 2982419762, + 3117076823, + 1066830126, + 822987116, + 187896102, + 78534572, + 1036683378, + 75687055, + 3120225861, + 2773389442, + 1767958266, + 1913249402, + 3440830091, + 846020118, + 184611893, + 3422454162, + 666548753, + 2890272660, + 311826677, + 656894896, + 1015140971, + 944766866, + 2824039649, + 1729684840, + 3823670517, + 2340377084, + 3488764697, + 4214065102, + 3592570480, + 2636451968, + 2933103227, + 655748131, + 3740569112, + 1506594776, + 2344840586, + 3783597296, + 1177928154, + 1803755525, + 3706364437, + 329851091, + 405114009, + 4165888108, + 1966619112, + 2914286881, + 4199143925, + 3319499544, + 1484938443, + 2281390467, + 3699915218, + 13783969, + 1905775310, + 2964823216, + 2833850252, + 2710162184, + 177271103, + 3402747254, + 643614385, + 2591204130, + 4248973321, + 3395135192, + 2934150397, + 1845856116, + 2286304646, + 1694302618, + 3169933968, + 3279088254, + 4149021291, + 2370967465, + 2749474953, + 2468489166, + 181482399, + 2194607914, + 2595544183, + 3739497043, + 510497250, + 2051497102, + ]; + + static final String payPalSecret = String.fromCharCodes(List.generate( + _envieddatapayPalSecret.length, + (int i) => i, + growable: false, + ).map((int i) => _envieddatapayPalSecret[i] ^ _enviedkeypayPalSecret[i])); + + static const List _enviedkeygeminiApi = [ + 3690096455, + 1417732909, + 2764692064, + 3433425888, + 1659025258, + 2338551706, + 3239196813, + 3861595826, + 613546669, + 2587147504, + 2564872744, + 1394577429, + 2282407548, + 2183761185, + 4147587143, + 307911120, + 3228520373, + 863876420, + 562835940, + 3083656154, + 3581237596, + 4262756485, + 2080755889, + 1417423534, + 3270140256, + 1119288214, + 2335430493, + 2399828377, + 3105418678, + 3054840816, + 64685077, + 1056626707, + 1383961575, + 3919929174, + 2365849596, + 3191106216, + 1905457454, + 3855851362, + 1167805280, + 2040371101, + 2604217690, + 2712993575, + 3780772931, + 2641420901, + 603130156, + 3310724309, + ]; + + static const List _envieddatageminiApi = [ + 3690096406, + 1417732962, + 2764691981, + 3433425809, + 1659025200, + 2338551785, + 3239196892, + 3861595883, + 613546688, + 2587147456, + 2564872720, + 1394577507, + 2282407440, + 2183761262, + 4147587126, + 307911098, + 3228520444, + 863876467, + 562835855, + 3083656118, + 3581237514, + 4262756559, + 2080755927, + 1417423576, + 3270140208, + 1119288226, + 2335430410, + 2399828443, + 3105418736, + 3054840757, + 64685178, + 1056626806, + 1383961482, + 3919929148, + 2365849499, + 3191106257, + 1905457437, + 3855851355, + 1167805270, + 2040371188, + 2604217602, + 2712993621, + 3780772891, + 2641420809, + 603130222, + 3310724281, + ]; + + static final String geminiApi = String.fromCharCodes(List.generate( + _envieddatageminiApi.length, + (int i) => i, + growable: false, + ).map((int i) => _envieddatageminiApi[i] ^ _enviedkeygeminiApi[i])); + + static const List _enviedkeygeminiApiMasa = [ + 3772131040, + 1688514242, + 3407103765, + 670407426, + 4245831149, + 1144564359, + 3133842252, + 2063063350, + 582842987, + 5693210, + 290490415, + 33367945, + 3516177805, + 889001519, + 4248627504, + 4255672262, + 3162735609, + 1898084084, + 3094835894, + 1217020613, + 2737831259, + 1746746299, + 2249501909, + 1281780688, + 1053716075, + 2903755646, + 299589947, + 1541045903, + 2814109884, + 2513653826, + 3410756219, + 2455411323, + 1199743729, + 4167850945, + 2855776277, + 959159085, + 356925827, + 1747777173, + 394036049, + 3414569226, + 361478210, + 2420080300, + 2520147016, + 2630978853, + 2043642686, + 3752728673, + ]; + + static const List _envieddatageminiApiMasa = [ + 3772130993, + 1688514189, + 3407103864, + 670407539, + 4245831095, + 1144564468, + 3133842205, + 2063063423, + 582842907, + 5693310, + 290490466, + 33367997, + 3516177871, + 889001597, + 4248627523, + 4255672205, + 3162735508, + 1898083989, + 3094835954, + 1217020559, + 2737831188, + 1746746347, + 2249501922, + 1281780660, + 1053716017, + 2903755534, + 299589902, + 1541045922, + 2814109919, + 2513653876, + 3410756149, + 2455411244, + 1199743639, + 4167850914, + 2855776381, + 959159066, + 356925907, + 1747777236, + 394036029, + 3414569307, + 361478170, + 2420080350, + 2520146960, + 2630978889, + 2043642748, + 3752728589, + ]; + + static final String geminiApiMasa = String.fromCharCodes(List.generate( + _envieddatageminiApiMasa.length, + (int i) => i, + growable: false, + ).map((int i) => _envieddatageminiApiMasa[i] ^ _enviedkeygeminiApiMasa[i])); + + static const List _enviedkeyagoraAppId = [ + 3832317263, + 824600247, + 3080315056, + 3900931085, + 3473146124, + 779342915, + 2106289893, + 4205358956, + 609217799, + 1622368308, + 1521325953, + 3605300568, + 1579213160, + 991885568, + 1524540163, + 2447823791, + 1013931428, + 918937707, + 3682127949, + 1050456304, + 3920967779, + 2171786206, + 1108080459, + 3070563345, + 2197592583, + 746902908, + 2210288744, + 1032466985, + 3021648317, + 126989861, + 2544891506, + 3009303115, + 2937548858, + 683882045, + 3936767547, + 370481240, + 3508452786, + 3339342045, + 3498572810, + ]; + + static const List _envieddataagoraAppId = [ + 3832317304, + 824600198, + 3080315016, + 3900931125, + 3473146172, + 779342885, + 2106289879, + 4205358854, + 609217841, + 1622368263, + 1521326007, + 3605300535, + 1579213149, + 991885616, + 1524540218, + 2447823813, + 1013931414, + 918937695, + 3682127924, + 1050456261, + 3920967761, + 2171786215, + 1108080511, + 3070563365, + 2197592639, + 746902860, + 2210288657, + 1032466970, + 3021648269, + 126989904, + 2544891466, + 3009303167, + 2937548802, + 683882085, + 3936767561, + 370481152, + 3508452830, + 3339341983, + 3498572902, + ]; + + static final String agoraAppId = String.fromCharCodes(List.generate( + _envieddataagoraAppId.length, + (int i) => i, + growable: false, + ).map((int i) => _envieddataagoraAppId[i] ^ _enviedkeyagoraAppId[i])); + + static const List _enviedkeyagoraAppCertificate = [ + 1345790685, + 277008906, + 712387213, + 2289188027, + 1227355014, + 1836280768, + 1155062051, + 3431414770, + 3380335678, + 2131685751, + 65917614, + 2003693415, + 1644478452, + 994286877, + 2389817048, + 4038511669, + 2184300421, + 3864603606, + 1080502774, + 36888323, + 1215888920, + 1185478675, + 3510739353, + 3980684621, + 1870632155, + 2213035926, + 2857261249, + 3913977985, + 1356518905, + 753962228, + 734893468, + 3696638500, + 830484066, + 2698409883, + 1505861823, + 3692474140, + 21414369, + 1558490013, + 2378350697, + 3707537020, + ]; + + static const List _envieddataagoraAppCertificate = [ + 1345790647, + 277008955, + 712387258, + 2289188042, + 1227355071, + 1836280820, + 1155062039, + 3431414663, + 3380335626, + 2131685710, + 65917597, + 2003693406, + 1644478404, + 994286967, + 2389817008, + 4038511684, + 2184300466, + 3864603619, + 1080502734, + 36888438, + 1215888937, + 1185478693, + 3510739373, + 3980684660, + 1870632175, + 2213035938, + 2857261305, + 3913978096, + 1356518859, + 753962125, + 734893482, + 3696638556, + 830483972, + 2698409966, + 1505861863, + 3692474222, + 21414329, + 1558490097, + 2378350635, + 3707536912, + ]; + + static final String agoraAppCertificate = String.fromCharCodes( + List.generate( + _envieddataagoraAppCertificate.length, + (int i) => i, + growable: false, + ).map((int i) => + _envieddataagoraAppCertificate[i] ^ + _enviedkeyagoraAppCertificate[i])); + + static const List _enviedkeypayPalClientIdLive = [ + 302903440, + 3292875835, + 2362055895, + 3585667840, + 743482780, + 1422113737, + 1444303642, + 3269260833, + 4164497487, + 1298032106, + 1671393889, + 532219890, + 948494266, + 2106157317, + 1441779883, + 3002736248, + 1545429168, + 751491591, + 1596665175, + 2684278206, + 3850460631, + 3040111389, + 2640275917, + 2251019271, + 1643537098, + 988976877, + 2600502720, + 2235958487, + 705192076, + 72114598, + 744847749, + 1201199910, + 847784818, + 3608902160, + 203114023, + 3337169304, + 837924028, + 2762310474, + 1520857522, + 3902653986, + 2364086535, + 1531387574, + 870549805, + 3403890842, + 782199654, + 603141943, + 567628668, + 2645511554, + 4091072485, + 1710195964, + 1164202158, + 2346576506, + 2689896013, + 3199516072, + 1284610630, + 705765155, + 2360233961, + 3772968831, + 2400775783, + 38939757, + 1165307680, + 3355269317, + 3723627239, + 924036739, + 553674211, + 113509580, + 4047501928, + 211915725, + 1380725891, + 1019477356, + 2473690813, + 207989982, + 669022980, + 3826644819, + 1184902078, + 3014826049, + 983172125, + 2389068590, + 2597841182, + 2566350736, + 1112051600, + 652592991, + 2989213427, + 689608253, + 1133723955, + 3001269612, + 1950515532, + ]; + + static const List _envieddatapayPalClientIdLive = [ + 302903489, + 3292875873, + 2362055825, + 3585667947, + 743482870, + 1422113672, + 1444303733, + 3269260923, + 4164497449, + 1298032045, + 1671393813, + 532219804, + 948494301, + 2106157387, + 1441779928, + 3002736157, + 1545429186, + 751491691, + 1596665147, + 2684278152, + 3850460581, + 3040111406, + 2640275886, + 2251019332, + 1643537151, + 988976859, + 2600502680, + 2235958459, + 705192125, + 72114645, + 744847827, + 1201199978, + 847784739, + 3608902267, + 203114057, + 3337169325, + 837924056, + 2762310407, + 1520857552, + 3902654043, + 2364086626, + 1531387604, + 870549829, + 3403890912, + 782199596, + 603141998, + 567628617, + 2645511611, + 4091072416, + 1710195885, + 1164202141, + 2346576402, + 2689895991, + 3199516063, + 1284610591, + 705765211, + 2360233864, + 3772968762, + 2400775702, + 38939688, + 1165307748, + 3355269276, + 3723627191, + 924036823, + 553674166, + 113509514, + 4047501835, + 211915676, + 1380725972, + 1019477277, + 2473690827, + 207989947, + 669023060, + 3826644786, + 1184902127, + 3014826100, + 983172168, + 2389068644, + 2597841236, + 2566350790, + 1112051650, + 652592903, + 2989213313, + 689608293, + 1133723999, + 3001269550, + 1950515488, + ]; + + static final String payPalClientIdLive = String.fromCharCodes( + List.generate( + _envieddatapayPalClientIdLive.length, + (int i) => i, + growable: false, + ).map((int i) => + _envieddatapayPalClientIdLive[i] ^ _enviedkeypayPalClientIdLive[i])); + + static const List _enviedkeypayPalSecretLive = [ + 695171155, + 2676646885, + 1862843345, + 3894515463, + 210448382, + 2644734685, + 652425667, + 3217376634, + 2924563208, + 1057937010, + 1241730561, + 3137465678, + 4006937194, + 4064330582, + 2756599958, + 23442622, + 750678129, + 1695865750, + 2651221535, + 1293424022, + 1108227265, + 2275950844, + 2170279363, + 1846839803, + 1630407691, + 4005371051, + 242932876, + 2923859209, + 3249150789, + 3306462476, + 1988415613, + 2496474295, + 4184579276, + 4282302872, + 97152587, + 4014492647, + 1793443824, + 4252275162, + 3167172389, + 997279167, + 3574485750, + 2385395859, + 2793682355, + 3851273543, + 2378925554, + 873578708, + 1873884350, + 991729440, + 2853049240, + 3733600232, + 3073646637, + 2552993454, + 4021513788, + 3719980103, + 267850051, + 2513587800, + 3006719392, + 995741028, + 2798205499, + 1606705869, + 2183257014, + 4258375452, + 785961064, + 3774608, + 3605921531, + 2433428076, + 1478600213, + 1631595295, + 1831698129, + 1447878570, + 2151237769, + 4126451914, + 3206123371, + 3709425729, + 3721487284, + 863078982, + 4272753026, + 3234564696, + 247470280, + 1897178236, + 1775541971, + 3704090925, + 2253986849, + 2833362075, + 1351938944, + 215728786, + 3308847238, + 3374445957, + ]; + + static const List _envieddatapayPalSecretLive = [ + 695171097, + 2676646836, + 1862843285, + 3894515526, + 210448298, + 2644734636, + 652425640, + 3217376529, + 2924563302, + 1057936950, + 1241730663, + 3137465639, + 4006937132, + 4064330534, + 2756600019, + 23442687, + 750678079, + 1695865760, + 2651221551, + 1293424093, + 1108227203, + 2275950792, + 2170279347, + 1846839740, + 1630407803, + 4005371119, + 242932973, + 2923859267, + 3249150767, + 3306462581, + 1988415500, + 2496474357, + 4184579213, + 4282302972, + 97152626, + 4014492557, + 1793443720, + 4252275095, + 3167172455, + 997279215, + 3574485638, + 2385395945, + 2793682404, + 3851273490, + 2378925507, + 873578628, + 1873884303, + 991729483, + 2853049259, + 3733600160, + 3073646620, + 2552993476, + 4021513830, + 3719980079, + 267850002, + 2513587762, + 3006719438, + 995741011, + 2798205448, + 1606705800, + 2183257086, + 4258375535, + 785960995, + 3774657, + 3605921429, + 2433427981, + 1478600226, + 1631595307, + 1831698049, + 1447878546, + 2151237881, + 4126451955, + 3206123347, + 3709425705, + 3721487315, + 863078921, + 4272753132, + 3234564629, + 247470249, + 1897178155, + 1775541891, + 3704091002, + 2253986937, + 2833362153, + 1351939032, + 215728894, + 3308847300, + 3374446057, + ]; + + static final String payPalSecretLive = String.fromCharCodes( + List.generate( + _envieddatapayPalSecretLive.length, + (int i) => i, + growable: false, + ).map((int i) => + _envieddatapayPalSecretLive[i] ^ _enviedkeypayPalSecretLive[i])); + + static const List _enviedkeyintegrationIdPayMob = [ + 1453771218, + 99799846, + 2120053699, + 1415147158, + 1481111911, + 2831947708, + 408680540, + 1381239986, + 1498235397, + 385457610, + 2932459519, + 3703450582, + 1559665575, + ]; + + static const List _envieddataintegrationIdPayMob = [ + 1453771234, + 99799828, + 2120053744, + 1415147169, + 1481111889, + 2831947663, + 408680556, + 1381240042, + 1498235511, + 385457554, + 2932459411, + 3703450516, + 1559665611, + ]; + + static final String integrationIdPayMob = String.fromCharCodes( + List.generate( + _envieddataintegrationIdPayMob.length, + (int i) => i, + growable: false, + ).map((int i) => + _envieddataintegrationIdPayMob[i] ^ + _enviedkeyintegrationIdPayMob[i])); + + static const List _enviedkeypasswordPayMob = [ + 2651214382, + 2543188177, + 47156322, + 800364083, + 4209799751, + 676623082, + 832144016, + 4270956576, + 1996245296, + 2249932344, + 467292801, + 1298438647, + 1763820894, + 568046576, + 1851455399, + 3871675882, + 1470528502, + 2794214989, + 560206516, + 3419180189, + 3875504829, + 3938504646, + ]; + + static const List _envieddatapasswordPayMob = [ + 2651214409, + 2543188113, + 47156236, + 800364120, + 4209799683, + 676623064, + 832144051, + 4270956569, + 1996245257, + 2249932371, + 467292832, + 1298438559, + 1763820826, + 568046511, + 1851455369, + 3871675805, + 1470528430, + 2794214975, + 560206572, + 3419180273, + 3875504895, + 3938504618, + ]; + + static final String passwordPayMob = String.fromCharCodes(List.generate( + _envieddatapasswordPayMob.length, + (int i) => i, + growable: false, + ).map((int i) => _envieddatapasswordPayMob[i] ^ _enviedkeypasswordPayMob[i])); + + static const List _enviedkeyusernamePayMob = [ + 1143635967, + 3737213395, + 2565222656, + 489734030, + 3993568495, + 3599499068, + 4017240137, + 1318040604, + 2921759128, + 784177800, + 1318608577, + 2398722427, + 1340469675, + 2838957610, + 1566515748, + 1431741204, + 2301052706, + ]; + + static const List _envieddatausernamePayMob = [ + 1143635916, + 3737213412, + 2565222707, + 489734079, + 3993568470, + 3599499021, + 4017240185, + 1318040616, + 2921759144, + 784177853, + 1318608627, + 2398722339, + 1340469721, + 2838957682, + 1566515784, + 1431741270, + 2301052750, + ]; + + static final String usernamePayMob = String.fromCharCodes(List.generate( + _envieddatausernamePayMob.length, + (int i) => i, + growable: false, + ).map((int i) => _envieddatausernamePayMob[i] ^ _enviedkeyusernamePayMob[i])); + + static const List _enviedkeypayMobApikey = [ + 877946335, + 990571313, + 23816359, + 1823019159, + 2064816345, + 4090654266, + 1795448028, + 3436525757, + 1774958597, + 3699700862, + 1989799618, + 3365842929, + 3970531925, + 1296526345, + 1133951785, + 3590514719, + 3588530864, + 2622815636, + 4088730428, + 3133503776, + 3327497261, + 1474374901, + 3583397553, + 2330124316, + 171747989, + 3917404514, + 2233312564, + 3686539197, + 2245010592, + 566840474, + 489723560, + 1821123120, + 1824596000, + 4161653166, + 2653471133, + 318268533, + 3370331868, + 553413114, + 611455261, + 3605201835, + 2963126191, + 1062589215, + 1615167122, + 2707234350, + 4199759030, + 2948947655, + 1160211393, + 1700873236, + 1938002794, + 3374199317, + 3465724160, + 4294693417, + 3911595922, + 2210748827, + 1852099657, + 2147815756, + 1549272082, + 4034263503, + 3707579325, + 748137275, + 3086794963, + 1789977551, + 1252684202, + 1270032683, + 1794697737, + 2993515719, + 1916813237, + 1630188210, + 3312639584, + 2938764538, + 1788738213, + 442600113, + 769817879, + 3388808280, + 1953112730, + 3607334401, + 1772739524, + 2065897249, + 1861719065, + 3423257774, + 3276171255, + 1891388347, + 4036029556, + 787258637, + 3361104153, + 1995069332, + 338144944, + 3577027112, + 3861579086, + 53129487, + 2318131426, + 2851713162, + 3889534770, + 4188327589, + 1119114777, + 3044759775, + 2125934961, + 674982934, + 2455174062, + 1358105253, + 2046998389, + 3899740613, + 3196420711, + 2814940357, + 2472907957, + 3349364562, + 3863504114, + 210642177, + 1266598270, + 3385216451, + 2302666667, + 2769963737, + 2278237766, + 2778874414, + 1304585274, + 334500021, + 3841074701, + 405695381, + 3178606810, + 911292980, + 3560803097, + 2698467315, + 2138540760, + 1708488625, + 1536010377, + 1740744300, + 3554944638, + 1338537760, + 153759107, + 2392258583, + 2517325729, + 1562137179, + 261181330, + 4057344068, + 3606326413, + 43284431, + 2576883894, + 867864581, + 47851640, + 2812786467, + 973176921, + 225989476, + 3632475970, + 3393105632, + 4119873963, + 305548531, + 1700626973, + 3305100287, + 213266753, + 2645964560, + 1249400330, + 1028029236, + 1979363583, + 352332716, + 2959904965, + 1222014745, + 335719055, + 3034844941, + 226441292, + 1926875436, + 3577159923, + 1775113424, + 3199679251, + 3830679614, + 3983650981, + 2954990804, + 1144108644, + 4193816731, + 2129708087, + 2232005629, + 509576731, + 2804010237, + 3348342995, + 3569501774, + 2480116438, + 3951430678, + 3690246575, + 4096388324, + 3733757497, + 800782411, + 2059710812, + 871457814, + 3428515992, + 1203485575, + 1966769807, + 874102638, + 3987488303, + 4263596618, + 3676547691, + 1030709040, + 3714933910, + 3610741808, + 1152296636, + 369443622, + 2966607033, + 2162159764, + 3673440552, + 735430115, + 588154192, + 65278090, + 645065734, + 2597761550, + 3763337418, + 3659667110, + 1631259412, + 2455931148, + 2718813596, + 2661144102, + 899770730, + 3944823544, + 1758731207, + 2967039660, + 1120523741, + 799682919, + 105499444, + 2163862354, + 3499198809, + 1366869290, + 3064414018, + 2952589477, + 4007837456, + 3407273905, + 94642333, + 2873343743, + 3785938068, + 51406210, + 1548429565, + 2243336746, + 4282623484, + 1996588028, + 689083797, + 401092822, + 1365669879, + 1860665063, + 3793892048, + 1338061163, + 1710252589, + 4182186618, + 3248149368, + 1401531703, + 2816626795, + 3034314057, + 3141649374, + 828841320, + 3911654567, + 25345696, + 3800395331, + 2960398276, + 3279834243, + 190002666, + 4163701276, + 1729602162, + 2048511200, + 463396109, + 3003408720, + 540446820, + 1847801397, + 641291196, + 851056219, + 747867377, + 1352886168, + 4277298099, + 2190596762, + 3330112223, + 835337040, + 3071117778, + 4057287278, + 2360094621, + 2955739871, + 3874768359, + 657711989, + 1291344580, + 3708415956, + 1542001892, + 1699492760, + 2559897189, + 363791616, + 2724635379, + 3720457045, + 4092067985, + 3528369260, + 4273739568, + 2810497199, + 1498459680, + 146421583, + 686612339, + ]; + + static const List _envieddatapayMobApikey = [ + 877946258, + 990571381, + 23816405, + 1823019216, + 2064816296, + 4090654321, + 1795447961, + 3436525802, + 1774958678, + 3699700815, + 1989799600, + 3365842855, + 3970531876, + 1296526433, + 1133951811, + 3590514808, + 3588530903, + 2622815708, + 4088730442, + 3133503845, + 3327497341, + 1474374833, + 3583397575, + 2330124364, + 171748095, + 3917404456, + 2233312515, + 3686539211, + 2245010682, + 566840542, + 489723626, + 1821123189, + 1824596056, + 4161653212, + 2653471186, + 318268482, + 3370331791, + 553413065, + 611455327, + 3605201902, + 2963126253, + 1062589304, + 1615167200, + 2707234370, + 4199759056, + 2948947602, + 1160211382, + 1700873280, + 1938002731, + 3374199334, + 3465724265, + 4294693404, + 3911595968, + 2210748917, + 1852099609, + 2147815801, + 1549272136, + 4034263457, + 3707579339, + 748137300, + 3086794911, + 1789977596, + 1252684263, + 1270032665, + 1794697818, + 2993515774, + 1916813255, + 1630188279, + 3312639522, + 2938764445, + 1788738263, + 442600157, + 769817945, + 3388808204, + 1953112830, + 3607334500, + 1772739516, + 2065897321, + 1861719084, + 3423257822, + 3276171171, + 1891388395, + 4036029458, + 787258682, + 3361104215, + 1995069406, + 338144962, + 3577027166, + 3861579063, + 53129534, + 2318131344, + 2851713263, + 3889534824, + 4188327663, + 1119114863, + 3044759790, + 2125934885, + 674983032, + 2455174041, + 1358105311, + 2046998291, + 3899740658, + 3196420625, + 2814940305, + 2472908028, + 3349364502, + 3863504011, + 210642294, + 1266598164, + 3385216395, + 2302666700, + 2769963752, + 2278237701, + 2778874393, + 1304585334, + 334500048, + 3841074804, + 405695398, + 3178606818, + 911293052, + 3560803149, + 2698467255, + 2138540705, + 1708488703, + 1536010440, + 1740744287, + 3554944520, + 1338537751, + 153759191, + 2392258631, + 2517325767, + 1562137151, + 261181418, + 4057344014, + 3606326527, + 43284398, + 2576883918, + 867864628, + 47851530, + 2812786516, + 973176841, + 225989385, + 3632475922, + 3393105556, + 4119874022, + 305548473, + 1700627044, + 3305100165, + 213266736, + 2645964635, + 1249400399, + 1028029293, + 1979363493, + 352332745, + 2959904930, + 1222014833, + 335719166, + 3034844990, + 226441217, + 1926875481, + 3577159871, + 1775113349, + 3199679329, + 3830679672, + 3983651053, + 2954990823, + 1144108581, + 4193816746, + 2129708150, + 2232005530, + 509576787, + 2804010142, + 3348342939, + 3569501823, + 2480116451, + 3951430741, + 3690246645, + 4096388317, + 3733757548, + 800782378, + 2059710726, + 871457858, + 3428516052, + 1203485640, + 1966769911, + 874102528, + 3987488344, + 4263596666, + 3676547625, + 1030709092, + 3714934002, + 3610741834, + 1152296692, + 369443694, + 2966607051, + 2162159830, + 3673440617, + 735430033, + 588154169, + 65278201, + 645065820, + 2597761643, + 3763337400, + 3659667187, + 1631259481, + 2455931225, + 2718813641, + 2661144156, + 899770672, + 3944823497, + 1758731141, + 2967039682, + 1120523679, + 799682818, + 105499505, + 2163862331, + 3499198771, + 1366869346, + 3064414004, + 2952589547, + 4007837562, + 3407273960, + 94642385, + 2873343633, + 3785938119, + 51406259, + 1548429503, + 2243336831, + 4282623413, + 1996587967, + 689083864, + 401092798, + 1365669796, + 1860664970, + 3793891968, + 1338061059, + 1710252652, + 4182186571, + 3248149325, + 1401531742, + 2816626701, + 3034313985, + 3141649319, + 828841278, + 3911654614, + 25345771, + 3800395270, + 2960398217, + 3279834315, + 190002621, + 4163701349, + 1729602105, + 2048511148, + 463396207, + 3003408681, + 540446737, + 1847801468, + 641291244, + 851056173, + 747867282, + 1352886224, + 4277298058, + 2190596815, + 3330112186, + 835336988, + 3071117793, + 4057287192, + 2360094663, + 2955739814, + 3874768291, + 657711891, + 1291344633, + 3708415927, + 1542001810, + 1699492859, + 2559897149, + 363791730, + 2724635307, + 3720457017, + 4092068051, + 3528369152, + 4273739602, + 2810497229, + 1498459714, + 146421549, + 686612241, + ]; + + static final String payMobApikey = String.fromCharCodes(List.generate( + _envieddatapayMobApikey.length, + (int i) => i, + growable: false, + ).map((int i) => _envieddatapayMobApikey[i] ^ _enviedkeypayMobApikey[i])); + + static const List _enviedkeyintegrationIdPayMobWallet = [ + 2066270508, + 2179622687, + 4209350984, + 2023379120, + 918298745, + 4188540777, + 1436949766, + 1673129085, + 3096697544, + 1051366131, + 1844348124, + 3261881089, + 2688865342, + ]; + + static const List _envieddataintegrationIdPayMobWallet = [ + 2066270492, + 2179622701, + 4209351039, + 2023379079, + 918298702, + 4188540762, + 1436949823, + 1673128997, + 3096697530, + 1051366059, + 1844348080, + 3261881155, + 2688865362, + ]; + + static final String integrationIdPayMobWallet = String.fromCharCodes( + List.generate( + _envieddataintegrationIdPayMobWallet.length, + (int i) => i, + growable: false, + ).map((int i) => + _envieddataintegrationIdPayMobWallet[i] ^ + _enviedkeyintegrationIdPayMobWallet[i])); + + static const List _enviedkeysmsPasswordEgypt = [ + 1036102193, + 3328298157, + 1009522011, + 2154832644, + 146526601, + 3215783358, + 3428970750, + 833300789, + 2123059710, + 1796562644, + 1137775961, + 3063260733, + 2341043278, + 574608647, + 1146191723, + 2004583682, + ]; + + static const List _envieddatasmsPasswordEgypt = [ + 1036102267, + 3328298116, + 1009521933, + 2154832748, + 146526644, + 3215783375, + 3428970652, + 833300762, + 2123059646, + 1796562585, + 1137775873, + 3063260751, + 2341043222, + 574608747, + 1146191657, + 2004583790, + ]; + + static final String smsPasswordEgypt = String.fromCharCodes( + List.generate( + _envieddatasmsPasswordEgypt.length, + (int i) => i, + growable: false, + ).map((int i) => + _envieddatasmsPasswordEgypt[i] ^ _enviedkeysmsPasswordEgypt[i])); + + static const List _enviedkeyocpApimSubscriptionKey = [ + 2583408717, + 3139137085, + 3400535982, + 3371139763, + 2618732941, + 1135353242, + 2909433580, + 3199672204, + 1367475262, + 2731871611, + 2779704131, + 500958052, + 199224277, + 883083230, + 182004026, + 2635205194, + 2017358985, + 339330106, + 3582294687, + 3722754054, + 2438197565, + 453063356, + 1271826618, + 699223625, + 3158057028, + 514742855, + 2520546711, + 3825184791, + 140749722, + 1664915553, + 2427400812, + 2458460667, + ]; + + static const List _envieddataocpApimSubscriptionKey = [ + 2583408765, + 3139137115, + 3400535963, + 3371139799, + 2618733036, + 1135353337, + 2909433487, + 3199672303, + 1367475290, + 2731871513, + 2779704096, + 500957953, + 199224289, + 883083247, + 182003977, + 2635205243, + 2017359083, + 339330059, + 3582294782, + 3722754099, + 2438197595, + 453063301, + 1271826575, + 699223675, + 3158057085, + 514742910, + 2520546721, + 3825184804, + 140749738, + 1664915539, + 2427400713, + 2458460616, + ]; + + static final String ocpApimSubscriptionKey = String.fromCharCodes( + List.generate( + _envieddataocpApimSubscriptionKey.length, + (int i) => i, + growable: false, + ).map((int i) => + _envieddataocpApimSubscriptionKey[i] ^ + _enviedkeyocpApimSubscriptionKey[i])); + + static const List _enviedkeychatGPTkeySeferNew4 = [ + 3406563435, + 3563034046, + 690649274, + 1554978139, + 2398992838, + 3639163103, + 2637637167, + 1772006303, + 938009264, + 2696239346, + 2751257740, + 3502166065, + 501613147, + 1577851406, + 375602274, + 2345443321, + 117707980, + 813125276, + 302861949, + 2000329884, + 642188689, + 4153850329, + 80129667, + 3196520857, + 1257144832, + 2517661876, + 3483222691, + 1853187444, + 2113711216, + 2506031566, + 2841945112, + 852129076, + 119027544, + 699426537, + 1235099854, + 3619798932, + 515995761, + 1863347877, + 2321798745, + 3540956111, + 157038889, + 4132801943, + 1528823742, + 1694756598, + 1915757126, + 3217481261, + 509534292, + 1017992970, + 1995797155, + 1353983403, + 3381841113, + 37576376, + 26142595, + 119998388, + 932911126, + 4200148166, + 689018464, + 293890884, + 1656791519, + 533099226, + 1586731781, + 1074321930, + 1198257812, + ]; + + static const List _envieddatachatGPTkeySeferNew4 = [ + 3406563345, + 3563034073, + 690649239, + 1554978093, + 2398992810, + 3639163062, + 2637637194, + 1772006322, + 938009218, + 2696239262, + 2751257789, + 3502166123, + 501613111, + 1577851518, + 375602202, + 2345443216, + 117707937, + 813125328, + 302861879, + 2000329898, + 642188774, + 4153850248, + 80129740, + 3196520943, + 1257144930, + 2517661910, + 3483222679, + 1853187360, + 2113711134, + 2506031501, + 2841945121, + 852129132, + 119027498, + 699426449, + 1235099817, + 3619798977, + 515995700, + 1863347932, + 2321798671, + 3540956062, + 157038944, + 4132802018, + 1528823688, + 1694756514, + 1915757071, + 3217481321, + 509534304, + 1017993083, + 1995797235, + 1353983391, + 3381841055, + 37576429, + 26142678, + 119998405, + 932911225, + 4200148117, + 689018453, + 293890844, + 1656791469, + 533099138, + 1586731881, + 1074321992, + 1198257912, + ]; + + static final String chatGPTkeySeferNew4 = String.fromCharCodes( + List.generate( + _envieddatachatGPTkeySeferNew4.length, + (int i) => i, + growable: false, + ).map((int i) => + _envieddatachatGPTkeySeferNew4[i] ^ + _enviedkeychatGPTkeySeferNew4[i])); + + static const List _enviedkeyanthropicAIkeySeferNew = [ + 1774799936, + 4115313919, + 3222156615, + 1546388780, + 378729630, + 4251115069, + 1979741490, + 1477855026, + 3897515850, + 1777461771, + 3243844657, + 1743983638, + 160886277, + 959562429, + 2949562129, + 4164593423, + 1954648346, + 1729455482, + 2596530700, + 2841153017, + 3299000959, + 2379089744, + 3801341164, + 4166410547, + 311752772, + 719169069, + 1251108655, + 528113318, + 1672114786, + 1309795872, + 1452399026, + 983970801, + 3790281399, + 2018982743, + 2679552167, + 1071484190, + 3918740730, + 167913724, + 3588254069, + 270495646, + 1098733191, + 2690937116, + 2429000554, + 1801335101, + 3364180440, + 1660330751, + 1671116610, + 3892754616, + 3802372244, + 1118700780, + 2139139595, + 1148740618, + 3164384937, + 482525141, + 490669876, + 1058435112, + 255814950, + 3262547038, + 3010417694, + 361682477, + 3462316701, + 3228240998, + 121976268, + 3984241679, + 1225063411, + 3464430938, + 882294470, + 1108727021, + 2416288074, + 3786161809, + 2271179934, + 2708159501, + 719018249, + 3887425679, + 990488566, + 2720536411, + 3066958953, + 3917248453, + 2517290334, + 835064590, + 785246896, + 1532626184, + 2052212562, + 2558974963, + 2364432277, + 1250335244, + 812639328, + 1610646406, + 1139612461, + 174768355, + 2085213186, + 176956703, + 3090364213, + 2582716285, + 3790544145, + 2285580486, + 284111530, + 792844130, + 1960788626, + 1607983971, + 408107270, + 116464010, + 4113203535, + 2301312800, + 4175271726, + 3821564429, + 2159091607, + 2671152551, + 895224109, + 472365106, + 2692906889, + 1641928316, + 397083448, + 1835071686, + 2561251042, + ]; + + static const List _envieddataanthropicAIkeySeferNew = [ + 1774799930, + 4115313816, + 3222156650, + 1546388829, + 378729724, + 4251115102, + 1979741471, + 1477855043, + 3897515836, + 1777461860, + 3243844610, + 1743983663, + 160886312, + 959562448, + 2949562239, + 4164593467, + 1954648396, + 1729455390, + 2596530753, + 2841152936, + 3299000906, + 2379089726, + 3801341081, + 4166410617, + 311752737, + 719169124, + 1251108726, + 528113358, + 1672114735, + 1309795950, + 1452398982, + 983970721, + 3790281459, + 2018982670, + 2679552213, + 1071484201, + 3918740619, + 167913619, + 3588253965, + 270495661, + 1098733226, + 2690937192, + 2429000536, + 1801335124, + 3364180457, + 1660330675, + 1671116586, + 3892754575, + 3802372341, + 1118700706, + 2139139679, + 1148740686, + 3164384975, + 482525068, + 490669938, + 1058435077, + 255815009, + 3262547000, + 3010417702, + 361682522, + 3462316789, + 3228240947, + 121976198, + 3984241749, + 1225063344, + 3464430889, + 882294514, + 1108727002, + 2416288015, + 3786161908, + 2271180027, + 2708159585, + 719018306, + 3887425761, + 990488526, + 2720536324, + 3066958908, + 3917248422, + 2517290291, + 835064667, + 785246973, + 1532626277, + 2052212539, + 2558974880, + 2364432345, + 1250335341, + 812639238, + 1610646454, + 1139612536, + 174768297, + 2085213285, + 176956719, + 3090364273, + 2582716171, + 3790544196, + 2285580458, + 284111611, + 792844048, + 1960788694, + 1607983895, + 408107307, + 116464061, + 4113203577, + 2301312867, + 4175271804, + 3821564543, + 2159091708, + 2671152630, + 895224188, + 472365162, + 2692907003, + 1641928228, + 397083476, + 1835071620, + 2561250958, + ]; + + static final String anthropicAIkeySeferNew = String.fromCharCodes( + List.generate( + _envieddataanthropicAIkeySeferNew.length, + (int i) => i, + growable: false, + ).map((int i) => + _envieddataanthropicAIkeySeferNew[i] ^ + _enviedkeyanthropicAIkeySeferNew[i])); + + static const List _enviedkeyllama3Key = [ + 308392153, + 4158758615, + 982779006, + 3149955873, + 1385267168, + 141885099, + 1096489902, + 2841193549, + 687730870, + 563592626, + 313475201, + 2241326636, + 892791234, + 2469874221, + 575276958, + 1494531917, + 2767395238, + 2624935926, + 3147383533, + 2963920132, + 1413102478, + 304928473, + 1491112895, + 439438177, + 2400647419, + 318979792, + 1749752019, + 1314764142, + 1750275808, + 3667490716, + 1199385559, + 1965244755, + 229689763, + 1947960280, + 3663549076, + 473770641, + 2884246786, + 2276123140, + 3444819483, + 3614132346, + 236508355, + 2239990175, + 2082265405, + 2051703147, + 624004786, + 2370235192, + 2673579557, + 2503825690, + 1524422255, + 2319767976, + 1618130579, + 4055760735, + 3483015048, + 733873214, + 329946775, + 3889718945, + 156964139, + 3979122586, + 142356391, + 33407231, + 3721123503, + 3443622753, + 3230200567, + ]; + + static const List _envieddatallama3Key = [ + 308392114, + 4158758573, + 982778905, + 3149955966, + 1385267093, + 141885183, + 1096489974, + 2841193524, + 687730821, + 563592663, + 313475256, + 2241326696, + 892791168, + 2469874255, + 575277021, + 1494531868, + 2767395223, + 2624935856, + 3147383427, + 2963920201, + 1413102537, + 304928436, + 1491112903, + 439438136, + 2400647308, + 318979716, + 1749751960, + 1314764055, + 1750275731, + 3667490788, + 1199385582, + 1965244678, + 229689840, + 1947960297, + 3663549174, + 473770724, + 2884246896, + 2276123260, + 3444819537, + 3614132240, + 236508407, + 2239990265, + 2082265467, + 2051703068, + 624004861, + 2370235218, + 2673579584, + 2503825710, + 1524422179, + 2319768050, + 1618130641, + 4055760650, + 3483015118, + 733873269, + 329946845, + 3889719026, + 156964122, + 3979122626, + 142356437, + 33407143, + 3721123523, + 3443622691, + 3230200475, + ]; + + static final String llama3Key = String.fromCharCodes(List.generate( + _envieddatallama3Key.length, + (int i) => i, + growable: false, + ).map((int i) => _envieddatallama3Key[i] ^ _enviedkeyllama3Key[i])); + + static const List _enviedkeypayMobOutClientSecrret = [ + 1401068748, + 2852926941, + 7309612, + 1220270238, + 2225174103, + 1809021950, + 681502915, + 1041622274, + 204886644, + 2510054244, + 1600712160, + 447707884, + 3739788400, + 2711169315, + 3013654206, + 138623278, + 2760079478, + 2293148410, + 2961417926, + 2195431184, + 340079548, + 2278256035, + 1390725642, + 1592619301, + 1654163042, + 3726373492, + 3404431385, + 1602641867, + 1931893044, + 4201216849, + 1467354191, + 3163854595, + 1209890042, + 402494834, + 247525392, + 3540720369, + 1681650873, + 1895858053, + 4085107428, + 811763435, + 2651306246, + 3221296577, + 3349009092, + 2049066983, + 2459049135, + 266771154, + 317642173, + 223911294, + 938180301, + 2457719457, + 1624489059, + 1089142449, + 1586059837, + 1454105334, + 2402239425, + 3983300033, + 1413704133, + 939762337, + 3791440635, + 1510012782, + 3847119353, + 4102874597, + 1325180195, + 1716945219, + 817591451, + 3505432673, + 151336573, + 3202100121, + 3481967218, + 4035017012, + 2587189393, + 1539541222, + 1214896486, + 187849261, + 1117745377, + 4112610466, + 2176732092, + 2818078659, + 310581177, + 1774722501, + 4215806903, + 31258578, + 3940850890, + 4189475214, + 1203541873, + 1253920281, + 1599786361, + 587131240, + 3972144197, + 378948903, + 2878531847, + 1325449357, + 2637176925, + 1429419831, + 1165038902, + 135116912, + 803089253, + 1110376659, + 631145643, + 792720530, + 2746536843, + 636317943, + 3246112219, + 3743508984, + 3274289987, + 1646025409, + 2088190630, + 2993345997, + 269781813, + 1105808031, + 3993656546, + 302451567, + 3290855526, + 827949003, + 736131779, + 2802076939, + 1422305308, + 836575547, + 1232893195, + 3608048317, + 119183246, + 1729831070, + 3875720567, + 4270978783, + 974762975, + 1665671485, + 3202954854, + 376161690, + 1074848150, + 1193482534, + 2950856016, + 2171813003, + 2198733550, + 2756081685, + 2406301479, + ]; + + static const List _envieddatapayMobOutClientSecrret = [ + 1401068724, + 2852926884, + 7309638, + 1220270324, + 2225174021, + 1809021842, + 681502888, + 1041622371, + 204886556, + 2510054190, + 1600712109, + 447707868, + 3739788328, + 2711169344, + 3013654157, + 138623254, + 2760079393, + 2293148304, + 2961417863, + 2195431264, + 340079615, + 2278256108, + 1390725730, + 1592619293, + 1654162944, + 3726373378, + 3404431486, + 1602641799, + 1931893005, + 4201216802, + 1467354147, + 3163854661, + 1209889930, + 402494780, + 247525492, + 3540720316, + 1681650816, + 1895858140, + 4085107329, + 811763368, + 2651306355, + 3221296632, + 3349009029, + 2049066895, + 2459049187, + 266771107, + 317642207, + 223911185, + 938180230, + 2457719532, + 1624489011, + 1089142469, + 1586059856, + 1454105253, + 2402239415, + 3983300002, + 1413704183, + 939762415, + 3791440578, + 1510012705, + 3847119309, + 4102874513, + 1325180283, + 1716945211, + 817591517, + 3505432621, + 151336491, + 3202100139, + 3481967160, + 4035017077, + 2587189447, + 1539541200, + 1214896405, + 187849305, + 1117745315, + 4112610545, + 2176732136, + 2818078594, + 310581246, + 1774722435, + 4215806960, + 31258513, + 3940850844, + 4189475323, + 1203541779, + 1253920350, + 1599786268, + 587131230, + 3972144136, + 378948969, + 2878531959, + 1325449454, + 2637176938, + 1429419898, + 1165038924, + 135116858, + 803089163, + 1110376585, + 631145624, + 792720577, + 2746536930, + 636317859, + 3246112237, + 3743508927, + 3274289971, + 1646025376, + 2088190672, + 2993345935, + 269781850, + 1105808092, + 3993656494, + 302451512, + 3290855437, + 827948958, + 736131765, + 2802077021, + 1422305406, + 836575583, + 1232893272, + 3608048377, + 119183343, + 1729831123, + 3875720519, + 4270978725, + 974762903, + 1665671499, + 3202954771, + 376161752, + 1074848217, + 1193482622, + 2950855970, + 2171813075, + 2198733442, + 2756081751, + 2406301515, + ]; + + static final String payMobOutClientSecrret = String.fromCharCodes( + List.generate( + _envieddatapayMobOutClientSecrret.length, + (int i) => i, + growable: false, + ).map((int i) => + _envieddatapayMobOutClientSecrret[i] ^ + _enviedkeypayMobOutClientSecrret[i])); + + static const List _enviedkeypayMobOutClient_id = [ + 2706047868, + 2588692946, + 2641097301, + 4259575080, + 244793647, + 3990250407, + 3868644691, + 3866649017, + 2867711495, + 3666992980, + 3172122632, + 1574874074, + 2359181060, + 2082319323, + 1532227728, + 700856499, + 677493712, + 1664165460, + 1454264780, + 1279201775, + 2697895276, + 3462338334, + 422619954, + 972799563, + 2199129212, + 602887297, + 1520259867, + 3274221891, + 3723098123, + 1712911046, + 4012869951, + 2895804605, + 3033221215, + 1914940416, + 2747279918, + 2576389996, + 3413627825, + 3240731854, + 2771149372, + 3443093041, + 3726373400, + 2972420084, + 1435600490, + 439494205, + 1751083113, + 367769074, + 132705350, + ]; + + static const List _envieddatapayMobOutClient_id = [ + 2706047782, + 2588692962, + 2641097312, + 4259575133, + 244793691, + 3990250387, + 3868644715, + 3866649053, + 2867711569, + 3666992959, + 3172122723, + 1574873993, + 2359181110, + 2082319292, + 1532227801, + 700856449, + 677493674, + 1664165425, + 1454264738, + 1279201705, + 2697895210, + 3462338429, + 422620025, + 972799544, + 2199129114, + 602887365, + 1520259920, + 3274221861, + 3723098179, + 1712910983, + 4012869994, + 2895804557, + 3033221128, + 1914940485, + 2747279970, + 2576389917, + 3413627898, + 3240731831, + 2771149430, + 3443092993, + 3726373460, + 2972420012, + 1435600408, + 439494245, + 1751083013, + 367769008, + 132705322, + ]; + + static final String payMobOutClient_id = String.fromCharCodes( + List.generate( + _envieddatapayMobOutClient_id.length, + (int i) => i, + growable: false, + ).map((int i) => + _envieddatapayMobOutClient_id[i] ^ _enviedkeypayMobOutClient_id[i])); + + static const List _enviedkeypayMobOutPassword = [ + 4117879067, + 4177992814, + 1707360739, + 474099042, + 836026737, + 4222508434, + 34728452, + 2579868690, + 315454297, + 4292997604, + 4221309985, + 3223671112, + 2133814021, + 4064322352, + 3128447263, + 3960859082, + 1057176922, + 3729780277, + 4089107523, + 1009047973, + 1403091786, + 1347590320, + 4227439091, + 1298645704, + 1703200248, + 1173335146, + 1364974508, + 3124789370, + 3917602715, + 2268510062, + 2967700802, + 2095458888, + ]; + + static const List _envieddatapayMobOutPassword = [ + 4117879135, + 4177992796, + 1707360665, + 474098984, + 836026679, + 4222508522, + 34728559, + 2579868759, + 315454330, + 4292997544, + 4221310063, + 3223671075, + 2133814070, + 4064322374, + 3128447333, + 3960859129, + 1057176930, + 3729780303, + 4089107569, + 1009048001, + 1403091731, + 1347590344, + 4227438979, + 1298645638, + 1703200158, + 1173335101, + 1364974580, + 3124789256, + 3917602755, + 2268509954, + 2967700736, + 2095458852, + ]; + + static final String payMobOutPassword = String.fromCharCodes( + List.generate( + _envieddatapayMobOutPassword.length, + (int i) => i, + growable: false, + ).map((int i) => + _envieddatapayMobOutPassword[i] ^ _enviedkeypayMobOutPassword[i])); + + static const List _enviedkeypayMobOutUserName = [ + 2307033185, + 2818738602, + 2608114765, + 2801400093, + 3881127907, + 1822912763, + 3831048450, + 1062373761, + 1266949160, + 2988365597, + 547072755, + 2834290134, + 2196011376, + 627283096, + 1553087477, + 1107709085, + 2087146629, + 39030521, + 3443332468, + 2931076625, + 3067847490, + 1844056965, + 3767489181, + 545918313, + ]; + + static const List _envieddatapayMobOutUserName = [ + 2307033115, + 2818738624, + 2608114744, + 2801400183, + 3881127823, + 1822912676, + 3831048563, + 1062373879, + 1266949191, + 2988365634, + 547072661, + 2834290081, + 2196011291, + 627283186, + 1553087379, + 1107709178, + 2087146735, + 39030421, + 3443332396, + 2931076707, + 3067847450, + 1844057065, + 3767489247, + 545918213, + ]; + + static final String payMobOutUserName = String.fromCharCodes( + List.generate( + _envieddatapayMobOutUserName.length, + (int i) => i, + growable: false, + ).map((int i) => + _envieddatapayMobOutUserName[i] ^ _enviedkeypayMobOutUserName[i])); + + static const List _enviedkeyA = [3927393825]; + + static const List _envieddataA = [3927393904]; + + static final String A = String.fromCharCodes(List.generate( + _envieddataA.length, + (int i) => i, + growable: false, + ).map((int i) => _envieddataA[i] ^ _enviedkeyA[i])); + + static const List _enviedkeyB = [1816253219]; + + static const List _envieddataB = [1816253307]; + + static final String B = String.fromCharCodes(List.generate( + _envieddataB.length, + (int i) => i, + growable: false, + ).map((int i) => _envieddataB[i] ^ _enviedkeyB[i])); + + static const List _enviedkeyC = [1941444907]; + + static const List _envieddataC = [1941444973]; + + static final String C = String.fromCharCodes(List.generate( + _envieddataC.length, + (int i) => i, + growable: false, + ).map((int i) => _envieddataC[i] ^ _enviedkeyC[i])); + + static const List _enviedkeyD = [884821849]; + + static const List _envieddataD = [884821760]; + + static final String D = String.fromCharCodes(List.generate( + _envieddataD.length, + (int i) => i, + growable: false, + ).map((int i) => _envieddataD[i] ^ _enviedkeyD[i])); + + static const List _enviedkeyE = [3613623060]; + + static const List _envieddataE = [3613623134]; + + static final String E = String.fromCharCodes(List.generate( + _envieddataE.length, + (int i) => i, + growable: false, + ).map((int i) => _envieddataE[i] ^ _enviedkeyE[i])); + + static const List _enviedkeyF = [65090977]; + + static const List _envieddataF = [65091060]; + + static final String F = String.fromCharCodes(List.generate( + _envieddataF.length, + (int i) => i, + growable: false, + ).map((int i) => _envieddataF[i] ^ _enviedkeyF[i])); + + static const List _enviedkeyG = [1595226334]; + + static const List _envieddataG = [1595226261]; + + static final String G = String.fromCharCodes(List.generate( + _envieddataG.length, + (int i) => i, + growable: false, + ).map((int i) => _envieddataG[i] ^ _enviedkeyG[i])); + + static const List _enviedkeyH = [590409698]; + + static const List _envieddataH = [590409653]; + + static final String H = String.fromCharCodes(List.generate( + _envieddataH.length, + (int i) => i, + growable: false, + ).map((int i) => _envieddataH[i] ^ _enviedkeyH[i])); + + static const List _enviedkeyI = [3473596254]; + + static const List _envieddataI = [3473596177]; + + static final String I = String.fromCharCodes(List.generate( + _envieddataI.length, + (int i) => i, + growable: false, + ).map((int i) => _envieddataI[i] ^ _enviedkeyI[i])); + + static const List _enviedkeyJ = [756630357]; + + static const List _envieddataJ = [756630288]; + + static final String J = String.fromCharCodes(List.generate( + _envieddataJ.length, + (int i) => i, + growable: false, + ).map((int i) => _envieddataJ[i] ^ _enviedkeyJ[i])); + + static const List _enviedkeyK = [1628007221]; + + static const List _envieddataK = [1628007282]; + + static final String K = String.fromCharCodes(List.generate( + _envieddataK.length, + (int i) => i, + growable: false, + ).map((int i) => _envieddataK[i] ^ _enviedkeyK[i])); + + static const List _enviedkeyL = [2442154538]; + + static const List _envieddataL = [2442154616]; + + static final String L = String.fromCharCodes(List.generate( + _envieddataL.length, + (int i) => i, + growable: false, + ).map((int i) => _envieddataL[i] ^ _enviedkeyL[i])); + + static const List _enviedkeyM = [3038562330]; + + static const List _envieddataM = [3038562388]; + + static final String M = String.fromCharCodes(List.generate( + _envieddataM.length, + (int i) => i, + growable: false, + ).map((int i) => _envieddataM[i] ^ _enviedkeyM[i])); + + static const List _enviedkeyN = [1744105640]; + + static const List _envieddataN = [1744105706]; + + static final String N = String.fromCharCodes(List.generate( + _envieddataN.length, + (int i) => i, + growable: false, + ).map((int i) => _envieddataN[i] ^ _enviedkeyN[i])); + + static const List _enviedkeyO = [1804796630]; + + static const List _envieddataO = [1804796575]; + + static final String O = String.fromCharCodes(List.generate( + _envieddataO.length, + (int i) => i, + growable: false, + ).map((int i) => _envieddataO[i] ^ _enviedkeyO[i])); + + static const List _enviedkeyP = [178819859]; + + static const List _envieddataP = [178819909]; + + static final String P = String.fromCharCodes(List.generate( + _envieddataP.length, + (int i) => i, + growable: false, + ).map((int i) => _envieddataP[i] ^ _enviedkeyP[i])); + + static const List _enviedkeyQ = [563658548]; + + static const List _envieddataQ = [563658613]; + + static final String Q = String.fromCharCodes(List.generate( + _envieddataQ.length, + (int i) => i, + growable: false, + ).map((int i) => _envieddataQ[i] ^ _enviedkeyQ[i])); + + static const List _enviedkeyR = [2594490884]; + + static const List _envieddataR = [2594490952]; + + static final String R = String.fromCharCodes(List.generate( + _envieddataR.length, + (int i) => i, + growable: false, + ).map((int i) => _envieddataR[i] ^ _enviedkeyR[i])); + + static const List _enviedkeyS = [1903746908]; + + static const List _envieddataS = [1903746822]; + + static final String S = String.fromCharCodes(List.generate( + _envieddataS.length, + (int i) => i, + growable: false, + ).map((int i) => _envieddataS[i] ^ _enviedkeyS[i])); + + static const List _enviedkeyT = [1513739119]; + + static const List _envieddataT = [1513739052]; + + static final String T = String.fromCharCodes(List.generate( + _envieddataT.length, + (int i) => i, + growable: false, + ).map((int i) => _envieddataT[i] ^ _enviedkeyT[i])); + + static const List _enviedkeyU = [2646093318]; + + static const List _envieddataU = [2646093390]; + + static final String U = String.fromCharCodes(List.generate( + _envieddataU.length, + (int i) => i, + growable: false, + ).map((int i) => _envieddataU[i] ^ _enviedkeyU[i])); + + static const List _enviedkeyV = [1782962373]; + + static const List _envieddataV = [1782962325]; + + static final String V = String.fromCharCodes(List.generate( + _envieddataV.length, + (int i) => i, + growable: false, + ).map((int i) => _envieddataV[i] ^ _enviedkeyV[i])); + + static const List _enviedkeyW = [1739500627]; + + static const List _envieddataW = [1739500551]; + + static final String W = String.fromCharCodes(List.generate( + _envieddataW.length, + (int i) => i, + growable: false, + ).map((int i) => _envieddataW[i] ^ _enviedkeyW[i])); + + static const List _enviedkeyX = [2642207717]; + + static const List _envieddataX = [2642207649]; + + static final String X = String.fromCharCodes(List.generate( + _envieddataX.length, + (int i) => i, + growable: false, + ).map((int i) => _envieddataX[i] ^ _enviedkeyX[i])); + + static const List _enviedkeyY = [2532365704]; + + static const List _envieddataY = [2532365787]; + + static final String Y = String.fromCharCodes(List.generate( + _envieddataY.length, + (int i) => i, + growable: false, + ).map((int i) => _envieddataY[i] ^ _enviedkeyY[i])); + + static const List _enviedkeyZ = [3659612056]; + + static const List _envieddataZ = [3659612117]; + + static final String Z = String.fromCharCodes(List.generate( + _envieddataZ.length, + (int i) => i, + growable: false, + ).map((int i) => _envieddataZ[i] ^ _enviedkeyZ[i])); + + static const List _enviedkeya = [1529015279]; + + static const List _envieddataa = [1529015198]; + + static final String a = String.fromCharCodes(List.generate( + _envieddataa.length, + (int i) => i, + growable: false, + ).map((int i) => _envieddataa[i] ^ _enviedkeya[i])); + + static const List _enviedkeyb = [1505472212]; + + static const List _envieddatab = [1505472172]; + + static final String b = String.fromCharCodes(List.generate( + _envieddatab.length, + (int i) => i, + growable: false, + ).map((int i) => _envieddatab[i] ^ _enviedkeyb[i])); + + static const List _enviedkeyc = [817639110]; + + static const List _envieddatac = [817639072]; + + static final String c = String.fromCharCodes(List.generate( + _envieddatac.length, + (int i) => i, + growable: false, + ).map((int i) => _envieddatac[i] ^ _enviedkeyc[i])); + + static const List _enviedkeyd = [903440428]; + + static const List _envieddatad = [903440469]; + + static final String d = String.fromCharCodes(List.generate( + _envieddatad.length, + (int i) => i, + growable: false, + ).map((int i) => _envieddatad[i] ^ _enviedkeyd[i])); + + static const List _enviedkeye = [2638867399]; + + static const List _envieddatae = [2638867373]; + + static final String e = String.fromCharCodes(List.generate( + _envieddatae.length, + (int i) => i, + growable: false, + ).map((int i) => _envieddatae[i] ^ _enviedkeye[i])); + + static const List _enviedkeyf = [1828324771]; + + static const List _envieddataf = [1828324822]; + + static final String f = String.fromCharCodes(List.generate( + _envieddataf.length, + (int i) => i, + growable: false, + ).map((int i) => _envieddataf[i] ^ _enviedkeyf[i])); + + static const List _enviedkeyg = [3603845793]; + + static const List _envieddatag = [3603845834]; + + static final String g = String.fromCharCodes(List.generate( + _envieddatag.length, + (int i) => i, + growable: false, + ).map((int i) => _envieddatag[i] ^ _enviedkeyg[i])); + + static const List _enviedkeyh = [1757567873]; + + static const List _envieddatah = [1757567990]; + + static final String h = String.fromCharCodes(List.generate( + _envieddatah.length, + (int i) => i, + growable: false, + ).map((int i) => _envieddatah[i] ^ _enviedkeyh[i])); + + static const List _enviedkeyi = [3471161909]; + + static const List _envieddatai = [3471161946]; + + static final String i = String.fromCharCodes(List.generate( + _envieddatai.length, + (int i) => i, + growable: false, + ).map((int i) => _envieddatai[i] ^ _enviedkeyi[i])); + + static const List _enviedkeyj = [1676293665]; + + static const List _envieddataj = [1676293700]; + + static final String j = String.fromCharCodes(List.generate( + _envieddataj.length, + (int i) => i, + growable: false, + ).map((int i) => _envieddataj[i] ^ _enviedkeyj[i])); + + static const List _enviedkeyk = [4187391328]; + + static const List _envieddatak = [4187391239]; + + static final String k = String.fromCharCodes(List.generate( + _envieddatak.length, + (int i) => i, + growable: false, + ).map((int i) => _envieddatak[i] ^ _enviedkeyk[i])); + + static const List _enviedkeyl = [1278707921]; + + static const List _envieddatal = [1278707875]; + + static final String l = String.fromCharCodes(List.generate( + _envieddatal.length, + (int i) => i, + growable: false, + ).map((int i) => _envieddatal[i] ^ _enviedkeyl[i])); + + static const List _enviedkeym = [1916844783]; + + static const List _envieddatam = [1916844673]; + + static final String m = String.fromCharCodes(List.generate( + _envieddatam.length, + (int i) => i, + growable: false, + ).map((int i) => _envieddatam[i] ^ _enviedkeym[i])); + + static const List _enviedkeyn = [1362889177]; + + static const List _envieddatan = [1362889147]; + + static final String n = String.fromCharCodes(List.generate( + _envieddatan.length, + (int i) => i, + growable: false, + ).map((int i) => _envieddatan[i] ^ _enviedkeyn[i])); + + static const List _enviedkeyo = [418710104]; + + static const List _envieddatao = [418710065]; + + static final String o = String.fromCharCodes(List.generate( + _envieddatao.length, + (int i) => i, + growable: false, + ).map((int i) => _envieddatao[i] ^ _enviedkeyo[i])); + + static const List _enviedkeyp = [398109159]; + + static const List _envieddatap = [398109073]; + + static final String p = String.fromCharCodes(List.generate( + _envieddatap.length, + (int i) => i, + growable: false, + ).map((int i) => _envieddatap[i] ^ _enviedkeyp[i])); + + static const List _enviedkeyq = [2105298030]; + + static const List _envieddataq = [2105297935]; + + static final String q = String.fromCharCodes(List.generate( + _envieddataq.length, + (int i) => i, + growable: false, + ).map((int i) => _envieddataq[i] ^ _enviedkeyq[i])); + + static const List _enviedkeyr = [2100108351]; + + static const List _envieddatar = [2100108371]; + + static final String r = String.fromCharCodes(List.generate( + _envieddatar.length, + (int i) => i, + growable: false, + ).map((int i) => _envieddatar[i] ^ _enviedkeyr[i])); + + static const List _enviedkeys = [4047470971]; + + static const List _envieddatas = [4047470849]; + + static final String s = String.fromCharCodes(List.generate( + _envieddatas.length, + (int i) => i, + growable: false, + ).map((int i) => _envieddatas[i] ^ _enviedkeys[i])); + + static const List _enviedkeyt = [1833080943]; + + static const List _envieddatat = [1833080844]; + + static final String t = String.fromCharCodes(List.generate( + _envieddatat.length, + (int i) => i, + growable: false, + ).map((int i) => _envieddatat[i] ^ _enviedkeyt[i])); + + static const List _enviedkeyu = [2006201138]; + + static const List _envieddatau = [2006201178]; + + static final String u = String.fromCharCodes(List.generate( + _envieddatau.length, + (int i) => i, + growable: false, + ).map((int i) => _envieddatau[i] ^ _enviedkeyu[i])); + + static const List _enviedkeyv = [825548532]; + + static const List _envieddatav = [825548420]; + + static final String v = String.fromCharCodes(List.generate( + _envieddatav.length, + (int i) => i, + growable: false, + ).map((int i) => _envieddatav[i] ^ _enviedkeyv[i])); + + static const List _enviedkeyw = [4292322568]; + + static const List _envieddataw = [4292322684]; + + static final String w = String.fromCharCodes(List.generate( + _envieddataw.length, + (int i) => i, + growable: false, + ).map((int i) => _envieddataw[i] ^ _enviedkeyw[i])); + + static const List _enviedkeyx = [348180012]; + + static const List _envieddatax = [348180040]; + + static final String x = String.fromCharCodes(List.generate( + _envieddatax.length, + (int i) => i, + growable: false, + ).map((int i) => _envieddatax[i] ^ _enviedkeyx[i])); + + static const List _enviedkeyy = [2454981964]; + + static const List _envieddatay = [2454981951]; + + static final String y = String.fromCharCodes(List.generate( + _envieddatay.length, + (int i) => i, + growable: false, + ).map((int i) => _envieddatay[i] ^ _enviedkeyy[i])); + + static const List _enviedkeyz = [1174677600]; + + static const List _envieddataz = [1174677517]; + + static final String z = String.fromCharCodes(List.generate( + _envieddataz.length, + (int i) => i, + growable: false, + ).map((int i) => _envieddataz[i] ^ _enviedkeyz[i])); + + static const List _enviedkeykeyOfApp = [ + 376420277, + 1964177614, + 266714728, + 1589971676, + 266386235, + 3307941698, + 1924858906, + 4256919686, + 1813772791, + 1728846133, + 798034838, + 3662472525, + 691128840, + 477115701, + 3282180146, + 1251529271, + 889650269, + 2707228821, + 4080664693, + 2355927710, + 1891415689, + 681110781, + 126791933, + 3944121008, + 1922649647, + 1159120196, + 828533761, + 2859252017, + 3822253640, + 101185729, + 793224752, + 721431820, + 1330516560, + 4291582049, + 3576316367, + 1170681606, + 1169376090, + 60979340, + ]; + + static const List _envieddatakeyOfApp = [ + 376420311, + 1964177583, + 266714628, + 1589971631, + 266386270, + 3307941684, + 1924858970, + 4256919729, + 1813772737, + 1728846092, + 798034848, + 3662472505, + 691128937, + 477115735, + 3282180188, + 1251529302, + 889650236, + 2707228911, + 4080664592, + 2355927789, + 1891415780, + 681110680, + 126791829, + 3944121045, + 1922649693, + 1159120161, + 828533862, + 2859252043, + 3822253624, + 101185703, + 793224794, + 721431907, + 1330516488, + 4291581971, + 3576316311, + 1170681716, + 1169376024, + 60979454, + ]; + + static final String keyOfApp = String.fromCharCodes(List.generate( + _envieddatakeyOfApp.length, + (int i) => i, + growable: false, + ).map((int i) => _envieddatakeyOfApp[i] ^ _enviedkeykeyOfApp[i])); + + static const List _enviedkeymapSaasKey = [ + 2877431794, + 2886615796, + 4211327812, + 109001071, + 4034617210, + 3902380042, + 2590750097, + 3360017058, + 348778886, + 1822175429, + 2967876957, + 2935638874, + 1241006808, + 1499775304, + 661053536, + 1132994499, + 2067923235, + 145077982, + 2732841582, + 3799819178, + 2732272387, + 2586277473, + 3948821369, + 2593524521, + 1788404973, + 2721766612, + 3676918592, + ]; + + static const List _envieddatamapSaasKey = [ + 2877431707, + 2886615706, + 4211327771, + 109001046, + 4034617166, + 3902380093, + 2590750121, + 3360017088, + 348778933, + 1822175479, + 2967876965, + 2935638889, + 1241006830, + 1499775276, + 661053521, + 1132994554, + 2067923264, + 145077944, + 2732841480, + 3799819165, + 2732272432, + 2586277381, + 3948821275, + 2593524506, + 1788404957, + 2721766626, + 3676918643, + ]; + + static final String mapSaasKey = String.fromCharCodes(List.generate( + _envieddatamapSaasKey.length, + (int i) => i, + growable: false, + ).map((int i) => _envieddatamapSaasKey[i] ^ _enviedkeymapSaasKey[i])); +} diff --git a/siro_rider/lib/firebase_options.dart b/siro_rider/lib/firebase_options.dart new file mode 100644 index 0000000..68b8f42 --- /dev/null +++ b/siro_rider/lib/firebase_options.dart @@ -0,0 +1,67 @@ +// File generated by FlutterFire CLI. +// ignore_for_file: type=lint +import 'package:firebase_core/firebase_core.dart' show FirebaseOptions; +import 'package:flutter/foundation.dart' + show defaultTargetPlatform, kIsWeb, TargetPlatform; + +/// Default [FirebaseOptions] for use with your Firebase apps. +/// +/// Example: +/// ```dart +/// import 'firebase_options.dart'; +/// // ... +/// await Firebase.initializeApp( +/// options: DefaultFirebaseOptions.currentPlatform, +/// ); +/// ``` +class DefaultFirebaseOptions { + static FirebaseOptions get currentPlatform { + if (kIsWeb) { + throw UnsupportedError( + 'DefaultFirebaseOptions have not been configured for web - ' + 'you can reconfigure this by running the FlutterFire CLI again.', + ); + } + switch (defaultTargetPlatform) { + case TargetPlatform.android: + return android; + case TargetPlatform.iOS: + return ios; + case TargetPlatform.macOS: + throw UnsupportedError( + 'DefaultFirebaseOptions have not been configured for macos - ' + 'you can reconfigure this by running the FlutterFire CLI again.', + ); + case TargetPlatform.windows: + throw UnsupportedError( + 'DefaultFirebaseOptions have not been configured for windows - ' + 'you can reconfigure this by running the FlutterFire CLI again.', + ); + case TargetPlatform.linux: + throw UnsupportedError( + 'DefaultFirebaseOptions have not been configured for linux - ' + 'you can reconfigure this by running the FlutterFire CLI again.', + ); + default: + throw UnsupportedError( + 'DefaultFirebaseOptions are not supported for this platform.', + ); + } + } + + static const FirebaseOptions android = FirebaseOptions( + apiKey: 'AIzaSyAEoply_UcEP6KaCu_ziCy_ZDIjAKvi7b8', + appId: '1:825988584191:android:06782b540c7681ad1632ca', + messagingSenderId: '825988584191', + projectId: 'siro-a6957', + storageBucket: 'siro-a6957.firebasestorage.app', + ); + static const FirebaseOptions ios = FirebaseOptions( + apiKey: 'AIzaSyDk6x6KZUY0IQtxoCMXX0F7N_yik8O19eA', + appId: '1:825988584191:ios:1d880fc7fc98b7671632ca', + messagingSenderId: '825988584191', + projectId: 'siro-a6957', + storageBucket: 'siro-a6957.firebasestorage.app', + iosBundleId: 'com.siro.rider', + ); +} diff --git a/siro_rider/lib/main.dart b/siro_rider/lib/main.dart new file mode 100644 index 0000000..5a0f63e --- /dev/null +++ b/siro_rider/lib/main.dart @@ -0,0 +1,114 @@ +import 'dart:async'; +import 'dart:io'; +import 'package:siro_rider/app_bindings.dart'; +import 'package:siro_rider/controller/functions/crud.dart'; +import 'package:siro_rider/views/home/HomePage/contact_us.dart'; +import 'package:siro_rider/views/home/HomePage/share_app_page.dart'; +import 'package:siro_rider/views/home/my_wallet/passenger_wallet.dart'; +import 'package:siro_rider/views/home/profile/passenger_profile_page.dart'; +import 'package:firebase_core/firebase_core.dart'; +import 'package:firebase_messaging/firebase_messaging.dart'; +import 'package:flutter/material.dart'; +import 'package:flutter_secure_storage/flutter_secure_storage.dart'; +import 'package:get/get.dart'; +import 'package:get_storage/get_storage.dart'; +import 'package:flutter/services.dart'; +import 'package:wakelock_plus/wakelock_plus.dart'; +import 'constant/info.dart'; +import 'controller/home/ios_live_activity_service.dart'; +import 'controller/local/local_controller.dart'; +import 'controller/local/translations.dart'; +import 'controller/themes/themes.dart'; +import 'firebase_options.dart'; +import 'models/db_sql.dart'; +import 'print.dart'; +import 'splash_screen_page.dart'; + +// -- Global instances for easy access -- +final box = GetStorage(); +final storage = FlutterSecureStorage(); +DbSql sql = DbSql.instance; + +// Firebase background message handler must be a top-level function. +@pragma('vm:entry-point') +Future backgroundMessageHandler(RemoteMessage message) async { + await Firebase.initializeApp(options: DefaultFirebaseOptions.currentPlatform); + Log.print("Handling a background message: ${message.messageId}"); +} + +void main() { + // Use runZonedGuarded to catch all unhandled exceptions in the app. + runZonedGuarded>(() async { + // --- Step 1: Critical initializations before runApp() --- + // These must complete before the UI can be built. + WidgetsFlutterBinding.ensureInitialized(); + await GetStorage.init(); + WakelockPlus.enable(); + if (Platform.isAndroid || Platform.isIOS) { + await Firebase.initializeApp( + options: DefaultFirebaseOptions.currentPlatform); + FirebaseMessaging.onBackgroundMessage(backgroundMessageHandler); + } +// ✅ التعديل هنا: تهيئة خدمة الـ Live Activity للآيفون + IosLiveActivityService.init(); + + // Lock screen orientation. + await SystemChrome.setPreferredOrientations([ + DeviceOrientation.portraitUp, + DeviceOrientation.portraitDown, + ]); + Get.put(LocaleController()); + // --- Step 2: Run the app immediately --- + // All heavy initializations are deferred to the SplashScreen. + runApp(const MyApp()); + }, (error, stack) { + // Global error handler. + final s = error.toString(); + final ignored = s.contains('PERMISSION_DENIED') || + s.contains('FormatException') || + s.contains('Null check operator used on a null value'); + + if (!ignored) { + CRUD.addError(s, stack.toString(), 'main_zone_guard'); + } + }); +} + +class MyApp extends StatelessWidget { + const MyApp({super.key}); + + @override + Widget build(BuildContext context) { + // Get.find() is used here because LocaleController is already put in AppBindings. + final LocaleController localController = Get.find(); + + return GetMaterialApp( + title: AppInformation.appName, + translations: MyTranslation(), + debugShowCheckedModeBanner: false, + locale: localController.language, + theme: localController.language?.languageCode.startsWith('ar') == true + ? lightThemeArabic + : lightThemeEnglish, + darkTheme: localController.language?.languageCode.startsWith('ar') == true + ? darkThemeArabic + : darkThemeEnglish, + themeMode: localController.themeMode, + + // --- [CRITICAL] --- + // initialBinding tells GetX to run AppBindings once at the start. + // This sets up all our controllers (put, lazyPut) for the entire app lifecycle. + initialBinding: AppBindings(), + + initialRoute: '/', + getPages: [ + GetPage(name: '/', page: () => const SplashScreen()), + // These routes are used by QuickActions and other navigation events. + GetPage(name: '/shareApp', page: () => ShareAppPage()), + GetPage(name: '/wallet', page: () => const PassengerWallet()), + GetPage(name: '/profile', page: () => PassengerProfilePage()), + GetPage(name: '/contactSupport', page: () => ContactUsPage()), + ], + ); + } +} diff --git a/siro_rider/lib/models/db_sql.dart b/siro_rider/lib/models/db_sql.dart new file mode 100644 index 0000000..6dea871 --- /dev/null +++ b/siro_rider/lib/models/db_sql.dart @@ -0,0 +1,139 @@ +import 'dart:convert'; +import 'package:siro_rider/constant/table_names.dart'; +import 'package:siro_rider/main.dart'; + +class DbSql { + static final DbSql instance = DbSql._(); + DbSql._(); + + // Helper to read data as a list of maps from GetStorage + List> _readTable(String table) { + String? dataString = box.read(table); + if (dataString == null) return []; + try { + List parsed = jsonDecode(dataString); + return parsed.map((e) => Map.from(e)).toList(); + } catch (e) { + return []; + } + } + + // Helper to write data back to GetStorage + void _writeTable(String table, List> data) { + box.write(table, jsonEncode(data)); + } + + Future>> getAllData(String table) async { + return _readTable(table); + } + + Future>> getCustomQuery(String query) async { + String q = query.toLowerCase(); + String targetTable = TableName.recentLocations; // Default target + + // Determine the table + if (q.contains(TableName.recentLocations.toLowerCase())) { + targetTable = TableName.recentLocations; + } else if (q.contains(TableName.carLocations.toLowerCase())) { + targetTable = TableName.carLocations; + } else if (q.contains(TableName.placesFavorite.toLowerCase())) { + targetTable = TableName.placesFavorite; + } + + List> data = _readTable(targetTable); + + // Apply DISTINCT logic if needed based on query + if (q.contains('distinct latitude, longitude, name, rate')) { + // Manual distinct by name and location + Map> distinctMap = {}; + for (var item in data) { + String key = '${item['latitude']}_${item['longitude']}_${item['name']}'; + if (!distinctMap.containsKey(key)) { + distinctMap[key] = item; + } + } + data = distinctMap.values.toList(); + } + + // Apply ORDER BY createdAt DESC logic + if (q.contains('order by createdat desc')) { + data.sort((a, b) { + String dateA = a['createdAt'] ?? ''; + String dateB = b['createdAt'] ?? ''; + return dateB.compareTo(dateA); + }); + } + + return data; + } + + Future insertData(Map map, String table) async { + List> data = _readTable(table); + // Generate simple ID + int newId = data.isEmpty ? 1 : (data.last['id'] as int? ?? 0) + 1; + Map newMap = Map.from(map); + newMap['id'] = newId; + data.add(newMap); + _writeTable(table, data); + return newId; + } + + Future insertMapLocation(Map map, String table) async { + List> data = _readTable(table); + + // Check if exists + int existingIndex = data.indexWhere((element) => + element['latitude'] == map['latitude'] && + element['longitude'] == map['longitude'] && + element['name'] == map['name']); + + if (existingIndex != -1) { + // Update + data[existingIndex] = Map.from(data[existingIndex]); + data[existingIndex]['createdAt'] = DateTime.now().toIso8601String(); + for (var key in map.keys) { + if (key != 'latitude' && key != 'longitude' && key != 'name') { + data[existingIndex][key] = map[key]; + } + } + _writeTable(table, data); + return data[existingIndex]['id'] as int? ?? 1; + } else { + // Insert + int newId = data.isEmpty ? 1 : ((data.last['id'] as int?) ?? 0) + 1; + Map newMap = Map.from(map); + newMap['id'] = newId; + newMap['createdAt'] = DateTime.now().toIso8601String(); + data.add(newMap); + _writeTable(table, data); + return newId; + } + } + + Future updateData(Map map, String table, int id) async { + List> data = _readTable(table); + int index = data.indexWhere((element) => element['id'] == id); + if (index != -1) { + data[index] = {...data[index], ...map}; + _writeTable(table, data); + return 1; + } + return 0; + } + + Future deleteData(String table, int id) async { + List> data = _readTable(table); + int initialLength = data.length; + data.removeWhere((element) => element['id'] == id); + if (data.length < initialLength) { + _writeTable(table, data); + return 1; + } + return 0; + } + + Future deleteAllData(String table) async { + _writeTable(table, []); + return 1; + } +} diff --git a/siro_rider/lib/models/model/admin/monthly_ride.dart b/siro_rider/lib/models/model/admin/monthly_ride.dart new file mode 100644 index 0000000..df4d600 --- /dev/null +++ b/siro_rider/lib/models/model/admin/monthly_ride.dart @@ -0,0 +1,21 @@ +class MonthlyDataModel { + final int year; + final int month; + final int day; + final int ridesCount; + + MonthlyDataModel({ + required this.year, + required this.month, + required this.day, + required this.ridesCount, + }); + + factory MonthlyDataModel.fromJson(Map json) => + MonthlyDataModel( + year: json['year'] as int, + month: json['month'] as int, + day: json['day'] as int, + ridesCount: json['rides_count'] as int, + ); +} diff --git a/siro_rider/lib/models/model/admin/passenger_model.dart b/siro_rider/lib/models/model/admin/passenger_model.dart new file mode 100644 index 0000000..ed920bb --- /dev/null +++ b/siro_rider/lib/models/model/admin/passenger_model.dart @@ -0,0 +1,79 @@ +class Passenger { + String id; + String phone; + String email; + String gender; + String status; + String birthdate; + String site; + String firstName; + String lastName; + String sosPhone; + String education; + String employmentType; + String maritalStatus; + String createdAt; + String updatedAt; + int countPassenger; + int countFeedback; + double ratingPassenger; + int countDriverRate; + int countPassengerCancel; + double passengerAverageRating; + int countPassengerRate; + int countPassengerRide; + + Passenger({ + required this.id, + required this.phone, + required this.email, + required this.gender, + required this.status, + required this.birthdate, + required this.site, + required this.firstName, + required this.lastName, + required this.sosPhone, + required this.education, + required this.employmentType, + required this.maritalStatus, + required this.createdAt, + required this.updatedAt, + required this.countPassenger, + required this.countFeedback, + required this.ratingPassenger, + required this.countDriverRate, + required this.countPassengerCancel, + required this.passengerAverageRating, + required this.countPassengerRate, + required this.countPassengerRide, + }); + + factory Passenger.fromJson(Map json) { + return Passenger( + id: json['id'], + phone: json['phone'], + email: json['email'], + gender: json['gender'], + status: json['status'], + birthdate: json['birthdate'], + site: json['site'], + firstName: json['first_name'], + lastName: json['last_name'], + sosPhone: json['sosPhone'], + education: json['education'], + employmentType: json['employmentType'], + maritalStatus: json['maritalStatus'], + createdAt: json['created_at'], + updatedAt: json['updated_at'], + countPassenger: json['countPassenger'], + countFeedback: json['countFeedback'], + ratingPassenger: json['ratingPassenger'].toDouble(), + countDriverRate: json['countDriverRate'], + countPassengerCancel: json['countPassengerCancel'], + passengerAverageRating: json['passengerAverageRating'].toDouble(), + countPassengerRate: json['countPassengerRate'], + countPassengerRide: json['countPassengerRide'], + ); + } +} diff --git a/siro_rider/lib/models/model/driver/rides_summary_model.dart b/siro_rider/lib/models/model/driver/rides_summary_model.dart new file mode 100644 index 0000000..b3b1113 --- /dev/null +++ b/siro_rider/lib/models/model/driver/rides_summary_model.dart @@ -0,0 +1,12 @@ +class MonthlyDataModel { + int day; + int totalDuration; + + MonthlyDataModel({required this.day, required this.totalDuration}); + + factory MonthlyDataModel.fromJson(Map json) => + MonthlyDataModel( + day: int.parse(json['day'].toString().split('-')[2]), + totalDuration: + int.parse(json['total_duration'].toString().split(':')[0])); +} diff --git a/siro_rider/lib/models/model/locations.dart b/siro_rider/lib/models/model/locations.dart new file mode 100644 index 0000000..3b18b60 --- /dev/null +++ b/siro_rider/lib/models/model/locations.dart @@ -0,0 +1,34 @@ +class CarLocationModel { + String id; + String driverId; + double latitude; + double heading; + double speed; + double longitude; + DateTime createdAt; + DateTime updatedAt; + + CarLocationModel({ + required this.id, + required this.driverId, + required this.latitude, + required this.longitude, + required this.heading, + required this.speed, + required this.createdAt, + required this.updatedAt, + }); + + factory CarLocationModel.fromJson(Map json) { + return CarLocationModel( + id: json['id'], + driverId: json['driver_id'], + latitude: double.parse(json['latitude'].toString()), + longitude: double.parse(json['longitude'].toString()), + heading: double.parse(json['heading'].toString()), + speed: double.parse(json['speed'].toString()), + createdAt: DateTime.parse(json['created_at']), + updatedAt: DateTime.parse(json['updated_at']), + ); + } +} diff --git a/siro_rider/lib/models/model/onboarding_model.dart b/siro_rider/lib/models/model/onboarding_model.dart new file mode 100644 index 0000000..b845c9f --- /dev/null +++ b/siro_rider/lib/models/model/onboarding_model.dart @@ -0,0 +1,30 @@ +import 'package:get/get.dart'; + +List onBoardingList = [ + OnBoardingModel( + title: 'Welcome to Intaleq!'.tr, + image: 'assets/images/on1.png', + body: + 'Intaleq is the ride-hailing app that is safe, reliable, and accessible.' + .tr, + ), + OnBoardingModel( + title: 'Get to your destination quickly and easily.'.tr, + image: 'assets/images/on2.png', + body: 'With Intaleq, you can get a ride to your destination in minutes.'.tr, + ), + OnBoardingModel( + title: 'Enjoy a safe and comfortable ride.'.tr, + image: 'assets/images/on3.png', + body: + 'Intaleq is committed to safety, and all of our captains are carefully screened and background checked.' + .tr, + ), +]; + +class OnBoardingModel { + final String? title; + final String? image; + final String? body; + OnBoardingModel({this.body, this.title, this.image}); +} diff --git a/siro_rider/lib/models/model/painter_copoun.dart b/siro_rider/lib/models/model/painter_copoun.dart new file mode 100644 index 0000000..b943e1e --- /dev/null +++ b/siro_rider/lib/models/model/painter_copoun.dart @@ -0,0 +1,272 @@ +import 'dart:math' as math; +import 'package:siro_rider/constant/box_name.dart'; +import 'package:siro_rider/main.dart'; +import 'package:siro_rider/splash_screen_page.dart'; +import 'package:flutter/material.dart'; +import 'package:flutter/services.dart'; +import 'package:get/get.dart'; + +class CouponPainter extends CustomPainter { + final Color primaryColor; + final Color secondaryColor; + + CouponPainter({ + required this.primaryColor, + required this.secondaryColor, + }); + + @override + void paint(Canvas canvas, Size size) { + final Paint primaryPaint = Paint() + ..color = primaryColor + ..style = PaintingStyle.fill; // + + final Paint secondaryPaint = Paint() + ..color = secondaryColor + ..style = PaintingStyle.fill; + + final Path path = Path(); + + // Draw the main ticket shape + path.moveTo(0, size.height * 0.1); + path.lineTo(size.width * 0.93, size.height * 0.1); + path.arcToPoint( + Offset(size.width, size.height * 0.2), + radius: const Radius.circular(20), + clockwise: false, + ); + path.lineTo(size.width, size.height * 0.8); + path.arcToPoint( + Offset(size.width * 0.93, size.height * 0.9), + radius: const Radius.circular(20), + clockwise: false, + ); + path.lineTo(0, size.height * 0.9); + path.close(); + + canvas.drawPath(path, primaryPaint); + + // Draw decorative circles on the left side + for (int i = 0; i < 5; i++) { + canvas.drawCircle( + Offset(0, size.height * (0.2 + i * 0.15)), + 10, + secondaryPaint, + ); + } + + // Draw a wavy pattern on the right side + final wavePaint = Paint() + ..color = secondaryColor.withOpacity(0.3) + ..style = PaintingStyle.stroke + ..strokeWidth = 2; + + for (int i = 0; i < 20; i++) { + canvas.drawLine( + Offset(size.width * 0.8, i * 10.0), + Offset( + size.width, + i * 10.0 + math.sin(i * 0.5) * 10, + ), + wavePaint, + ); + } + } + + @override + bool shouldRepaint(CustomPainter oldDelegate) => false; +} + +class PromoBanner extends StatelessWidget { + final String promoCode; + final String discountPercentage; + final String validity; + + const PromoBanner({ + Key? key, + required this.promoCode, + required this.discountPercentage, + required this.validity, + }) : super(key: key); + + @override + Widget build(BuildContext context) { + return CustomPaint( + painter: CouponPainter( + primaryColor: Colors.blue[800]!, + secondaryColor: Colors.white, + ), + child: Container( + width: 320, + height: 240, + padding: const EdgeInsets.all(16), + child: Column( + mainAxisAlignment: MainAxisAlignment.spaceAround, + children: [ + const SizedBox( + height: 10, + ), + Text( + 'Enter the promo code and get'.tr, + style: const TextStyle( + fontSize: 16, + fontWeight: FontWeight.bold, + color: Colors.white, + ), + textAlign: TextAlign.center, + ), + Text( + '${'DISCOUNT'.tr} $discountPercentage ${'for'.tr} $validity' + .toUpperCase(), + style: const TextStyle( + fontSize: 20, + fontWeight: FontWeight.bold, + color: Colors.white, + ), + textAlign: TextAlign.center, + ), + const SizedBox(height: 10), + Container( + decoration: BoxDecoration( + color: Colors.white, + borderRadius: BorderRadius.circular(10), + boxShadow: [ + BoxShadow( + color: Colors.black.withOpacity(0.1), + blurRadius: 4, + offset: const Offset(0, 2), + ), + ], + ), + padding: const EdgeInsets.symmetric(horizontal: 20, vertical: 10), + child: Text( + promoCode, + style: TextStyle( + fontSize: 24, + fontWeight: FontWeight.bold, + color: Colors.blue[800], + ), + ), + ), + const SizedBox(height: 10), + ElevatedButton( + onPressed: () { + // Copy promo code to clipboard + Clipboard.setData(ClipboardData(text: promoCode)); + // Show a Snackbar or other feedback to the user + ScaffoldMessenger.of(context).showSnackBar( + SnackBar(content: Text('Promo code copied to clipboard!'.tr)), + ); + box.write(BoxName.isGiftToken, '1'); + box.write(BoxName.isFirstTime, '1'); + Get.back(); + }, + style: ElevatedButton.styleFrom( + foregroundColor: Colors.blue[800], // Customize the color + backgroundColor: Colors.white, // Customize the background color + ), + child: Text('Copy Code'.tr), + ) + ], + ), + ), + ); + } +} + +// import 'package:siro_rider/constant/colors.dart'; +// import 'package:flutter/cupertino.dart'; +// import 'package:flutter/material.dart'; + +// class CouponPainter extends CustomPainter { +// @override +// void paint(Canvas canvas, Size size) { +// final Paint paint = Paint() +// ..color = AppColor.blueColor +// ..style = PaintingStyle.fill; + +// final Path path = Path(); + +// // Draw the ticket shape (like the image) +// path.moveTo(0, 0); +// path.lineTo(size.width * 0.7, 0); // top left to top right edge + +// // Draw curve for the cut on the right side (ticket look) +// path.arcToPoint(Offset(size.width, size.height * 0.15), +// radius: const Radius.circular(15), clockwise: false); +// path.lineTo(size.width, size.height * 0.85); +// path.arcToPoint(Offset(size.width * 0.7, size.height), +// radius: const Radius.circular(15), clockwise: false); +// path.lineTo(0, size.height); + +// canvas.drawPath(path, paint); +// } + +// @override +// bool shouldRepaint(CustomPainter oldDelegate) { +// return false; +// } +// } + +// class PromoBanner extends StatelessWidget { +// final String promoCode; +// final String discountPercentage; +// final String validity; + +// const PromoBanner({ +// required this.promoCode, +// required this.discountPercentage, +// required this.validity, +// }); + +// @override +// Widget build(BuildContext context) { +// return CustomPaint( +// painter: CouponPainter(), +// child: Container( +// width: 300, // Fixed width for the promo banner +// height: 180, // Set the desired height for your banner +// padding: const EdgeInsets.all(16), +// child: Column( +// mainAxisAlignment: MainAxisAlignment.spaceAround, +// children: [ +// Text( +// 'Enter the promo code and get'.toUpperCase(), +// style: const TextStyle( +// fontSize: 16, +// fontWeight: FontWeight.bold, +// color: Colors.white, +// ), +// textAlign: TextAlign.center, +// ), +// Text( +// '$discountPercentage OFF for $validity'.toUpperCase(), +// style: const TextStyle( +// fontSize: 18, +// fontWeight: FontWeight.bold, +// color: Colors.white, +// ), +// textAlign: TextAlign.center, +// ), +// const SizedBox(height: 10), +// Container( +// decoration: BoxDecoration( +// color: Colors.white, +// borderRadius: BorderRadius.circular(10), +// ), +// padding: const EdgeInsets.symmetric(horizontal: 20, vertical: 10), +// child: Text( +// promoCode, +// style: TextStyle( +// fontSize: 20, +// fontWeight: FontWeight.bold, +// color: Colors.blue[800], +// ), +// ), +// ), +// ], +// ), +// ), +// ); +// } +// } diff --git a/siro_rider/lib/onbording_page.dart b/siro_rider/lib/onbording_page.dart new file mode 100644 index 0000000..ca8e76f --- /dev/null +++ b/siro_rider/lib/onbording_page.dart @@ -0,0 +1,104 @@ +import 'package:flutter/material.dart'; +import 'package:get/get.dart'; +import 'package:siro_rider/views/widgets/elevated_btn.dart'; + +import 'constant/colors.dart'; +import 'controller/auth/onboarding_controller.dart'; +import 'models/model/onboarding_model.dart'; + +class OnBoardingPage extends StatelessWidget { + OnBoardingControllerImp onBoardingControllerImp = + Get.put(OnBoardingControllerImp()); + + OnBoardingPage({super.key}); + @override + Widget build(BuildContext context) { + return Scaffold( + backgroundColor: AppColor.secondaryColor, + body: SafeArea( + child: Column(mainAxisAlignment: MainAxisAlignment.center, children: [ + SizedBox( + height: Get.height * .7, + child: const CustomSliderOnBoarding(), + ), + const CustomDotControllerOnBoarding(), + // const Spacer(flex: 2), + const SizedBox(height: 20), + MyElevatedButton( + onPressed: () => onBoardingControllerImp.next(), + title: 'Next'.tr, + ) + ]), + )); + } +} + +class CustomSliderOnBoarding extends GetView { + const CustomSliderOnBoarding({Key? key}) : super(key: key); + + @override + Widget build(BuildContext context) { + return PageView.builder( + controller: controller.pageController, + onPageChanged: (val) { + controller.onPageChanged(val); + }, + itemCount: onBoardingList.length, + itemBuilder: (context, i) => Column( + children: [ + Image.asset( + onBoardingList[i].image!, + // width: , + height: Get.width / 2, + fit: BoxFit.fill, + ), + const SizedBox(height: 20), + Text(onBoardingList[i].title!, + textAlign: TextAlign.center, + style: const TextStyle( + fontWeight: FontWeight.bold, + fontSize: 22, + color: AppColor.primaryColor)), + const SizedBox(height: 20), + Container( + width: Get.width * .8, + alignment: Alignment.center, + child: Text( + onBoardingList[i].body!, + textAlign: TextAlign.center, + style: const TextStyle( + height: 2, + color: AppColor.accentColor, + fontWeight: FontWeight.bold, + fontSize: 14), + )), + // const SizedBox(height: 20), + ], + )); + } +} + +class CustomDotControllerOnBoarding extends StatelessWidget { + const CustomDotControllerOnBoarding({Key? key}) : super(key: key); + + @override + Widget build(BuildContext context) { + return GetBuilder( + builder: (controller) => Row( + mainAxisAlignment: MainAxisAlignment.center, + children: [ + ...List.generate( + onBoardingList.length, + (index) => AnimatedContainer( + margin: const EdgeInsets.only(right: 5), + duration: const Duration(milliseconds: 900), + width: controller.currentPage == index ? 20 : 5, + height: 6, + decoration: BoxDecoration( + color: AppColor.primaryColor, + borderRadius: BorderRadius.circular(10)), + )) + ], + )); + } +} diff --git a/siro_rider/lib/print.dart b/siro_rider/lib/print.dart new file mode 100644 index 0000000..a3d59f6 --- /dev/null +++ b/siro_rider/lib/print.dart @@ -0,0 +1,13 @@ +import 'dart:developer' as developer; + +class Log { + Log._(); + + static void print(String value, {StackTrace? stackTrace}) { + developer.log(value, name: 'LOG', stackTrace: stackTrace); + } + + static Object? inspect(Object? object) { + // return developer.inspect(object); + } +} diff --git a/siro_rider/lib/services/emergency_signal_service.dart b/siro_rider/lib/services/emergency_signal_service.dart new file mode 100644 index 0000000..30c739e --- /dev/null +++ b/siro_rider/lib/services/emergency_signal_service.dart @@ -0,0 +1,81 @@ +import 'dart:async'; +import 'dart:math'; +import 'package:flutter/foundation.dart'; +import 'package:sensors_plus/sensors_plus.dart'; + +import '../print.dart'; + +class EmergencySignalService { + static final EmergencySignalService instance = EmergencySignalService._(); + EmergencySignalService._(); + + StreamSubscription? _accelerometerSubscription; + DateTime? _lastShakeTime; + int _shakeCount = 0; + + // Custom thresholds for shaking (force required) + final double _shakeThresholdGravity = 2.7; + final int _shakeSlopTimeMs = 500; + final int _shakeCountResetTimeMs = 3000; + final int _targetShakes = 5; + + VoidCallback? _onEmergencyTriggered; + + /// Starts listening to phone movement + void startListening(VoidCallback onEmergencyTriggered) { + _onEmergencyTriggered = onEmergencyTriggered; + + if (_accelerometerSubscription != null) return; + + _accelerometerSubscription = accelerometerEvents.listen((event) { + double x = event.x; + double y = event.y; + double z = event.z; + + // Calculate the gForce using pythagorean theorem + double gX = x / 9.80665; + double gY = y / 9.80665; + double gZ = z / 9.80665; + + // Overall gForce + double gForce = sqrt(gX * gX + gY * gY + gZ * gZ); + + if (gForce > _shakeThresholdGravity) { + final now = DateTime.now(); + + // Ignore shakes that are too close to each other + if (_lastShakeTime != null && + now.difference(_lastShakeTime!).inMilliseconds < _shakeSlopTimeMs) { + return; + } + + // Reset the counter if elapsed more than the reset window + if (_lastShakeTime != null && + now.difference(_lastShakeTime!).inMilliseconds > + _shakeCountResetTimeMs) { + _shakeCount = 0; + } + + _lastShakeTime = now; + _shakeCount++; + + if (kDebugMode) { + Log.print("🚨 Shake detected! Count: $_shakeCount"); + } + + if (_shakeCount >= _targetShakes) { + _shakeCount = 0; // Reset counter + if (_onEmergencyTriggered != null) { + _onEmergencyTriggered!(); + } + } + } + }); + } + + void stopListening() { + _accelerometerSubscription?.cancel(); + _accelerometerSubscription = null; + _shakeCount = 0; + } +} diff --git a/siro_rider/lib/services/offline_map_service.dart b/siro_rider/lib/services/offline_map_service.dart new file mode 100644 index 0000000..500329a --- /dev/null +++ b/siro_rider/lib/services/offline_map_service.dart @@ -0,0 +1,121 @@ +import 'dart:io'; + +import 'package:get/get.dart'; +import 'package:intaleq_maps/intaleq_maps.dart'; +import 'package:get_storage/get_storage.dart'; +import 'dart:math' as math; +import '../../main.dart'; +import '../print.dart'; + +class OfflineMapService { + static final OfflineMapService instance = OfflineMapService._(); + OfflineMapService._(); + + final _offlineRegionName = "UserRegion"; + bool _isDownloading = false; + LatLng? _lastDownloadedCenter; + + /// Calculate bounding box for a given center and radius in km + LatLngBounds _calculateBounds(LatLng center, double radiusKm) { + const double earthRadius = 6371.0; + + // Latitude degrees per km + double latDelta = (radiusKm / earthRadius) * (180 / math.pi); + // Longitude degrees per km at given latitude + double lngDelta = (radiusKm / earthRadius) * + (180 / math.pi) / + math.cos(center.latitude * math.pi / 180); + + return LatLngBounds( + southwest: + LatLng(center.latitude - latDelta, center.longitude - lngDelta), + northeast: + LatLng(center.latitude + latDelta, center.longitude + lngDelta), + ); + } + + /// Downloads a specified radius around a coordinate + Future downloadRegion(LatLng center, + {double radiusKm = 10.0, + double minZoom = 6.0, + double maxZoom = 15.0}) async { + if (_isDownloading) return; + + // Avoid re-downloading if the user hasn't moved significantly (e.g. > 5km) + if (_lastDownloadedCenter != null) { + double distance = _calculateDistance(center, _lastDownloadedCenter!); + if (distance < 5.0) return; // skip if close to previously downloaded + } + + _isDownloading = true; + + try { + final bounds = _calculateBounds(center, radiusKm); + + // Select style based on current theme + final String styleStr = + Get.isDarkMode ? "assets/style_dark.json" : "assets/style.json"; + + // iOS native crash guard: MLNTilePyramidOfflineRegion does not support relative asset URLs. + // We skip native offline registration on iOS if using local assets to ensure stability. + if (Platform.isIOS && !styleStr.startsWith('http')) { + Log.print( + "ℹ️ Skipping native offline registration on iOS for asset-based style to prevent crash."); + return; + } + + final regionDefinition = OfflineRegionDefinition( + bounds: bounds, + mapStyleUrl: styleStr, + minZoom: minZoom, + maxZoom: maxZoom, + ); + + // We'll update the last downloaded center immediately + _lastDownloadedCenter = center; + + // MapLibre standard API for offline downloads + await downloadOfflineRegion(regionDefinition, metadata: { + 'name': '$_offlineRegionName-${center.latitude}-${center.longitude}', + 'downloadDate': DateTime.now().toIso8601String(), + }); + + // Reassurance log for the user + Log.print("📍 Map Ready: Service is utilizing local tile cache."); + Log.print( + "✅ Offline Map Cached for Region: $center (radius: ${radiusKm}km, style: $styleStr)"); + } catch (e) { + Log.print("⚠️ Offline Map Download Failed: $e"); + } finally { + _isDownloading = false; + } + } + + /// Helper to calculate distance in km + double _calculateDistance(LatLng p1, LatLng p2) { + var p = 0.017453292519943295; + var c = math.cos; + var a = 0.5 - + c((p2.latitude - p1.latitude) * p) / 2 + + c(p1.latitude * p) * + c(p2.latitude * p) * + (1 - c((p2.longitude - p1.longitude) * p)) / + 2; + return 12742 * math.asin(math.sqrt(a)); + } + + /// Clears all offline map regions and tiles from local storage + Future clearCache() async { + try { + Log.print("♻️ Purging MapLibre Offline Cache..."); + // In maplibre_gl 0.25.0, we use top-level functions instead of an OfflineManager class + final List regions = await getListOfRegions(); + for (var region in regions) { + await deleteOfflineRegion(region.id); + } + Log.print("✅ Map cache cleared successfully. ${regions.length} regions removed."); + } catch (e) { + Log.print("⚠️ Failed to clear map cache: $e"); + } + } +} diff --git a/siro_rider/lib/services/pip_service.dart b/siro_rider/lib/services/pip_service.dart new file mode 100644 index 0000000..1d12432 --- /dev/null +++ b/siro_rider/lib/services/pip_service.dart @@ -0,0 +1,63 @@ +import 'dart:io'; +import 'package:flutter/services.dart'; + +import '../print.dart'; + +/// خدمة التحكم بوضع النافذة العائمة (Picture-in-Picture) على أندرويد. +/// تُستدعى عند بدء الرحلة لتفعيل PiP تلقائياً عند خروج المستخدم من التطبيق. +class PipService { + static const MethodChannel _channel = MethodChannel('intaleq/pip'); + + /// هل وضع PiP مدعوم على هذا الجهاز؟ + static Future isPipSupported() async { + if (!Platform.isAndroid) return false; + try { + final result = await _channel.invokeMethod('isPipSupported'); + return result ?? false; + } catch (e) { + return false; + } + } + + /// تفعيل الدخول التلقائي لوضع PiP عند الخروج (أثناء الرحلة) + static Future enablePip() async { + if (!Platform.isAndroid) return; + try { + await _channel.invokeMethod('enablePip'); + } catch (e) { + Log.print('PiP enable error: \$e'); + } + } + + /// تعطيل الدخول التلقائي لوضع PiP (بعد انتهاء الرحلة) + static Future disablePip() async { + if (!Platform.isAndroid) return; + try { + await _channel.invokeMethod('disablePip'); + } catch (e) { + Log.print('PiP disable error: \$e'); + } + } + + /// الدخول يدوياً لوضع PiP + static Future enterPip() async { + if (!Platform.isAndroid) return false; + try { + final result = await _channel.invokeMethod('enterPip'); + return result ?? false; + } catch (e) { + Log.print('PiP enter error: \$e'); + return false; + } + } + + /// الاستماع لتغيير وضع PiP (الدخول/الخروج) + static void listenToPipChanges(Function(bool isInPip) onChanged) { + _channel.setMethodCallHandler((call) async { + if (call.method == 'onPipChanged') { + final isInPip = call.arguments as bool; + onChanged(isInPip); + } + }); + } +} diff --git a/siro_rider/lib/services/ride_live_notification.dart b/siro_rider/lib/services/ride_live_notification.dart new file mode 100644 index 0000000..a31eba6 --- /dev/null +++ b/siro_rider/lib/services/ride_live_notification.dart @@ -0,0 +1,113 @@ +import 'package:flutter_local_notifications/flutter_local_notifications.dart'; +import 'package:get/get.dart'; + +import '../controller/firebase/local_notification.dart'; + +class RideLiveNotification { + static const int _notificationId = 888; // رقم ثابت لإشعار الرحلة + // نستخدم نفس الـ plugin من NotificationController + static FlutterLocalNotificationsPlugin get _plugin => + Get.find().plugin; + // static bool _initialized = false; + + static Future _showOrUpdate({ + required String title, + required String body, + required int progress, + required int maxProgress, + bool indeterminate = false, + }) async { + // await init(); + + final android = AndroidNotificationDetails( + 'live_ride_tracking', // channel id + 'Ride Tracking', // channel name + channelDescription: 'Live updates for the current Intaleq ride', + importance: Importance.max, + priority: Priority.high, + ongoing: true, // إشعار ثابت + autoCancel: false, + showProgress: true, + onlyAlertOnce: true, + maxProgress: maxProgress, + progress: progress, + indeterminate: indeterminate, + icon: '@mipmap/launcher_icon', // غيّرها لو عندك أيقونة أخرى + ); + + final details = NotificationDetails(android: android); + + await _plugin.show( + id: _notificationId, + title: title, + body: body, + notificationDetails: details, + ); + } + + /// إلغاء إشعار الرحلة + static Future cancel() async { + // await init(); + await _plugin.cancel(id: _notificationId); + } + + // ========= حالات جاهزة للحالات المختلفة ========= + + /// حالة البحث عن سائق + static Future showSearching(String statusText) async { + await _showOrUpdate( + title: 'جاري البحث عن سائق…', + body: statusText, + progress: 0, + maxProgress: 0, + indeterminate: true, // شريط متحرّك بدون نسبة + ); + } + + /// السائق في الطريق للراكب + static Future showDriverOnWay({ + required String driverName, + required String etaText, // مثل: "8 دقائق" + String? carInfo, // مثل: "هيونداي • أبيض • ABC-123" + }) async { + final info = [ + driverName, + if (carInfo != null && carInfo.isNotEmpty) carInfo, + etaText, + ].join(' • '); + + await _showOrUpdate( + title: 'السائق في الطريق إليك', + body: info, + progress: 0, + maxProgress: 0, + indeterminate: true, + ); + } + + /// السائق وصل لموقع الراكب + static Future showDriverArrived(String driverName) async { + await _showOrUpdate( + title: 'السائق وصل', + body: 'الرجاء التوجّه لمقابلة $driverName عند نقطة الالتقاء', + progress: 100, + maxProgress: 100, + indeterminate: false, + ); + } + + /// الرحلة جارية (Progress حقيقي) + static Future showTripInProgress({ + required int percentage, // من 0 إلى 100 + required String etaText, // "8 دقائق" مثلاً + }) async { + final safePercent = percentage.clamp(0, 100); + await _showOrUpdate( + title: 'الرحلة جارية الآن', + body: 'المتبقي تقريبًا: $etaText', + progress: safePercent, + maxProgress: 100, + indeterminate: false, + ); + } +} diff --git a/siro_rider/lib/services/ride_tracking_native.dart b/siro_rider/lib/services/ride_tracking_native.dart new file mode 100644 index 0000000..541d251 --- /dev/null +++ b/siro_rider/lib/services/ride_tracking_native.dart @@ -0,0 +1,43 @@ +import 'dart:io'; +import 'package:flutter/services.dart'; + +class RideTrackingNative { + static const MethodChannel _channel = MethodChannel('intaleq/ride_tracking'); + + static Future updateRideTracking({ + required String driverName, + String driverPhone = '', + required String carDetails, + required double driverLat, + required double driverLng, + required double passengerLat, + required double passengerLng, + required double destLat, + required double destLng, + required String rideState, // "waiting" أو "inProgress" + required int estimatedTimeMinutes, + required double totalDistanceMeters, + }) async { + if (!Platform.isAndroid) return; + + await _channel.invokeMethod('updateRideTracking', { + 'driverName': driverName, + 'driverPhone': driverPhone, + 'carDetails': carDetails, + 'driverLat': driverLat, + 'driverLng': driverLng, + 'passengerLat': passengerLat, + 'passengerLng': passengerLng, + 'destLat': destLat, + 'destLng': destLng, + 'rideState': rideState, + 'estimatedTime': estimatedTimeMinutes, + 'totalDistance': totalDistanceMeters, + }); + } + + static Future stopRideTracking() async { + if (!Platform.isAndroid) return; + await _channel.invokeMethod('stopRideTracking'); + } +} diff --git a/siro_rider/lib/services/signaling_service.dart b/siro_rider/lib/services/signaling_service.dart new file mode 100644 index 0000000..def3f5d --- /dev/null +++ b/siro_rider/lib/services/signaling_service.dart @@ -0,0 +1,111 @@ +import 'dart:async'; +import 'dart:convert'; +import 'dart:io'; +import 'package:siro_rider/print.dart'; + +class SignalingService { + WebSocket? _socket; + final String _url = "wss://calls.intaleqapp.com/ws"; + + // Callbacks + Function(List iceServers)? onConnected; + Function(String reason)? onDisconnected; + Function(Map offer)? onOffer; + Function(Map answer)? onAnswer; + Function(Map candidate)? onIceCandidate; + Function(String reason)? onCallEnded; + Function()? onParticipantJoined; + + bool get isConnected => _socket != null && _socket!.readyState == WebSocket.open; + + Future connect(String sessionId, String userId) async { + if (isConnected) return; + + try { + Log.print("Signaling: Connecting to $_url"); + _socket = await WebSocket.connect(_url) + .timeout(const Duration(seconds: 8)); + + _socket!.listen( + (data) { + _handleMessage(data); + }, + onError: (err) { + Log.print("Signaling socket error: $err"); + disconnect("socket_error"); + }, + onDone: () { + Log.print("Signaling socket closed by server"); + disconnect("socket_closed"); + }, + cancelOnError: true, + ); + + // Send the authenticate message as the first message + send("authenticate", { + "session_id": sessionId, + "user_id": userId, + }); + } catch (e) { + Log.print("Signaling connection failed: $e"); + onDisconnected?.call("connection_failed"); + } + } + + void _handleMessage(dynamic data) { + try { + Log.print("Signaling received raw: $data"); + final message = jsonDecode(data); + if (message is! Map) return; + + final type = message['type']; + switch (type) { + case 'authenticated': + final iceServers = message['ice_servers'] as List? ?? []; + onConnected?.call(iceServers); + break; + case 'participant_joined': + onParticipantJoined?.call(); + break; + case 'offer': + if (message['sdp'] != null) { + onOffer?.call(message['sdp']); + } + break; + case 'answer': + if (message['sdp'] != null) { + onAnswer?.call(message['sdp']); + } + break; + case 'ice_candidate': + if (message['candidate'] != null) { + onIceCandidate?.call(message['candidate']); + } + break; + case 'call_ended': + onCallEnded?.call(message['reason'] ?? 'normal'); + break; + } + } catch (e) { + Log.print("Error handling signaling message: $e"); + } + } + + void send(String type, Map data) { + if (!isConnected) return; + final msg = jsonEncode({ + 'type': type, + ...data, + }); + Log.print("Signaling sending: $msg"); + _socket!.add(msg); + } + + void disconnect([String reason = "user_hangup"]) { + if (_socket != null) { + _socket!.close(); + _socket = null; + onDisconnected?.call(reason); + } + } +} diff --git a/siro_rider/lib/splash_screen_page.dart b/siro_rider/lib/splash_screen_page.dart new file mode 100644 index 0000000..9652e5b --- /dev/null +++ b/siro_rider/lib/splash_screen_page.dart @@ -0,0 +1,469 @@ +import 'dart:math'; +import 'package:animated_text_kit/animated_text_kit.dart'; +import 'package:flutter/material.dart'; +import 'package:get/get.dart'; +import 'package:siro_rider/constant/style.dart'; +import 'package:siro_rider/constant/box_name.dart'; +import 'package:siro_rider/main.dart'; + +import 'controller/home/splash_screen_controlle.dart'; + +class SplashScreen extends StatelessWidget { + const SplashScreen({super.key}); + + @override + Widget build(BuildContext context) { + final SplashScreenController controller = Get.put(SplashScreenController()); + final size = MediaQuery.of(context).size; + + // ألوان الـ colorize — سيان كهربائي → أبيض → ذهبي عنبري + const colorizeColors = [ + Color(0xFF1DA1F2), + Colors.white, + Color(0xFFFFB700), + Color(0xFF1DA1F2), + ]; + + return SafeArea( + child: Scaffold( + backgroundColor: const Color(0xFF060B18), + body: Stack( + children: [ + // ── طبقة الشبكة الهندسية ────────────────────────────────── + Positioned.fill( + child: CustomPaint(painter: _GridPainter()), + ), + + // ── توهج سماوي — أعلى اليمين ───────────────────────────── + Positioned( + top: -size.height * 0.18, + right: -size.width * 0.25, + child: Container( + width: size.width * 0.85, + height: size.width * 0.85, + decoration: BoxDecoration( + shape: BoxShape.circle, + gradient: RadialGradient(colors: [ + const Color(0xFF1DA1F2).withOpacity(0.11), + Colors.transparent, + ]), + ), + ), + ), + + // ── توهج أزرق غامق — أسفل اليسار ──────────────────────── + Positioned( + bottom: -size.height * 0.12, + left: -size.width * 0.22, + child: Container( + width: size.width * 0.75, + height: size.width * 0.75, + decoration: BoxDecoration( + shape: BoxShape.circle, + gradient: RadialGradient(colors: [ + const Color(0xFF0052FF).withOpacity(0.09), + Colors.transparent, + ]), + ), + ), + ), + + // ── المحتوى الرئيسي ─────────────────────────────────────── + Center( + child: Column( + mainAxisAlignment: MainAxisAlignment.center, + children: [ + // ── حلقات مدارية + اسم التطبيق ─────────────────── + FadeTransition( + opacity: controller.titleFadeAnimation, + child: ScaleTransition( + scale: controller.titleScaleAnimation, + child: SizedBox( + width: 220, + height: 220, + child: Stack( + alignment: Alignment.center, + children: [ + // الحلقة الخارجية — تدور ببطء + AnimatedBuilder( + animation: controller.orbitAnimation, + builder: (_, __) => Transform.rotate( + angle: controller.orbitAnimation.value * 2 * pi, + child: CustomPaint( + painter: _OrbitalRingPainter( + radius: 100, + dotColor: const Color(0xFF1DA1F2), + lineOpacity: 0.22, + dotSize: 5.5, + ), + size: const Size(220, 220), + ), + ), + ), + // الحلقة الداخلية — تدور عكسياً + AnimatedBuilder( + animation: controller.orbitAnimation, + builder: (_, __) => Transform.rotate( + angle: -controller.orbitAnimation.value * + 2 * + pi * + 0.65, + child: CustomPaint( + painter: _OrbitalRingPainter( + radius: 73, + dotColor: const Color(0xFFFFB700), + lineOpacity: 0.14, + dotSize: 4, + dashCount: 20, + ), + size: const Size(220, 220), + ), + ), + ), + // النقطة المركزية المضيئة + AnimatedBuilder( + animation: controller.glowAnimation, + builder: (_, __) => Container( + width: 8, + height: 8, + decoration: BoxDecoration( + shape: BoxShape.circle, + color: const Color(0xFF1DA1F2), + boxShadow: [ + BoxShadow( + color: const Color(0xFF1DA1F2) + .withOpacity(0.25 + + controller.glowAnimation.value * + 0.35), + blurRadius: 20 + + controller.glowAnimation.value * 20, + spreadRadius: 4, + ), + ], + ), + ), + ), + // ── اسم "Intaleq" مع توهج متنفّس ───────── + AnimatedBuilder( + animation: controller.glowAnimation, + builder: (_, child) => Container( + decoration: BoxDecoration( + shape: BoxShape.circle, + boxShadow: [ + BoxShadow( + color: const Color(0xFF1DA1F2) + .withOpacity(0.08 + + controller.glowAnimation.value * + 0.10), + blurRadius: 40 + + controller.glowAnimation.value * 25, + spreadRadius: 0, + ), + ], + ), + child: child, + ), + child: AnimatedTextKit( + animatedTexts: [ + ColorizeAnimatedText( + 'Intaleq', + textStyle: const TextStyle( + fontSize: 38, + fontWeight: FontWeight.w800, + letterSpacing: 3, + height: 1, + ), + colors: colorizeColors, + speed: const Duration(milliseconds: 380), + ), + ], + isRepeatingAnimation: false, + ), + ), + ], + ), + ), + ), + ), + + const SizedBox(height: 28), + + // ── شريحة "AI-Powered" + الشعار النصي ─────────────── + FadeTransition( + opacity: controller.taglineFadeAnimation, + child: SlideTransition( + position: controller.taglineSlideAnimation, + child: Column( + children: [ + // شريحة الذكاء الاصطناعي + Container( + padding: const EdgeInsets.symmetric( + horizontal: 14, vertical: 5), + decoration: BoxDecoration( + border: Border.all( + color: + const Color(0xFF1DA1F2).withOpacity(0.35), + width: 1, + ), + borderRadius: BorderRadius.circular(20), + color: const Color(0xFF1DA1F2).withOpacity(0.06), + ), + child: Row( + mainAxisSize: MainAxisSize.min, + children: [ + // نقطة نبضية + AnimatedBuilder( + animation: controller.glowAnimation, + builder: (_, __) => Container( + width: 6, + height: 6, + decoration: BoxDecoration( + shape: BoxShape.circle, + color: const Color(0xFF1DA1F2) + .withOpacity(0.5 + + controller.glowAnimation.value * + 0.5), + boxShadow: [ + BoxShadow( + color: const Color(0xFF1DA1F2) + .withOpacity(controller + .glowAnimation.value * + 0.6), + blurRadius: 6, + spreadRadius: 1, + ), + ], + ), + ), + ), + const SizedBox(width: 8), + Text( + 'AI-Powered Mobility', + style: TextStyle( + fontSize: 11, + fontWeight: FontWeight.w600, + color: const Color(0xFF1DA1F2) + .withOpacity(0.85), + letterSpacing: 1.4, + ), + ), + ], + ), + ), + const SizedBox(height: 16), + // الشعار النصي + Text( + 'Your Journey Begins Here'.tr, + style: AppStyle.title.copyWith( + color: const Color(0xFF7A8FA8), + fontSize: 14, + letterSpacing: 0.6, + fontWeight: FontWeight.w400, + ), + ), + ], + ), + ), + ), + ], + ), + ), + + // ── القسم السفلي: شريط التقدم + الإصدار ───────────────── + Align( + alignment: Alignment.bottomCenter, + child: FadeTransition( + opacity: controller.footerFadeAnimation, + child: Padding( + padding: + const EdgeInsets.only(bottom: 44, left: 36, right: 36), + child: Column( + mainAxisSize: MainAxisSize.min, + children: [ + // شريط تقدم رفيع مضيء + Obx(() => _GlowProgressBar( + value: controller.progress.value, + )), + const SizedBox(height: 18), + // معلومات الإصدار + Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + Text( + 'INTALEQ', + style: TextStyle( + fontSize: 9.5, + fontWeight: FontWeight.w700, + color: Colors.white.withOpacity(0.18), + letterSpacing: 3.5, + ), + ), + Text( + 'v${box.read(BoxName.packagInfo) ?? '1.0.0'}', + style: TextStyle( + fontSize: 9.5, + fontWeight: FontWeight.w500, + color: Colors.white.withOpacity(0.18), + letterSpacing: 1, + ), + ), + ], + ), + ], + ), + ), + ), + ), + ], + ), + ), + ); + } +} + +// ── شريط التقدم المضيء ───────────────────────────────────────────────────── +class _GlowProgressBar extends StatelessWidget { + final double value; + const _GlowProgressBar({required this.value}); + + @override + Widget build(BuildContext context) { + return Stack( + children: [ + // المسار + Container( + height: 2, + decoration: BoxDecoration( + color: Colors.white.withOpacity(0.07), + borderRadius: BorderRadius.circular(2), + ), + ), + // الملء المضيء + FractionallySizedBox( + widthFactor: value.clamp(0.0, 1.0), + child: Container( + height: 2, + decoration: BoxDecoration( + gradient: const LinearGradient(colors: [ + Color(0xFF0052FF), + Color(0xFF1DA1F2), + ]), + borderRadius: BorderRadius.circular(2), + boxShadow: [ + BoxShadow( + color: const Color(0xFF1DA1F2).withOpacity(0.55), + blurRadius: 8, + spreadRadius: 1, + ), + ], + ), + ), + ), + ], + ); + } +} + +// ── رسّام الشبكة الهندسية ───────────────────────────────────────────────── +class _GridPainter extends CustomPainter { + @override + void paint(Canvas canvas, Size size) { + final linePaint = Paint() + ..color = const Color(0xFF1DA1F2).withOpacity(0.04) + ..strokeWidth = 0.5; + + const spacing = 36.0; + + for (double y = 0; y < size.height; y += spacing) { + canvas.drawLine(Offset(0, y), Offset(size.width, y), linePaint); + } + for (double x = 0; x < size.width; x += spacing) { + canvas.drawLine(Offset(x, 0), Offset(x, size.height), linePaint); + } + + // نقاط التقاطع + final dotPaint = Paint() + ..color = const Color(0xFF1DA1F2).withOpacity(0.07) + ..style = PaintingStyle.fill; + + for (double y = 0; y < size.height; y += spacing) { + for (double x = 0; x < size.width; x += spacing) { + canvas.drawCircle(Offset(x, y), 0.9, dotPaint); + } + } + } + + @override + bool shouldRepaint(_GridPainter old) => false; +} + +// ── رسّام الحلقة المدارية ───────────────────────────────────────────────── +class _OrbitalRingPainter extends CustomPainter { + final double radius; + final Color dotColor; + final double lineOpacity; + final double dotSize; + final int dashCount; + + const _OrbitalRingPainter({ + this.radius = 95, + this.dotColor = const Color(0xFF1DA1F2), + this.lineOpacity = 0.25, + this.dotSize = 5.5, + this.dashCount = 0, + }); + + @override + void paint(Canvas canvas, Size size) { + final center = Offset(size.width / 2, size.height / 2); + + if (dashCount > 0) { + // حلقة متقطعة (dashed) + final dashPaint = Paint() + ..color = const Color(0xFF1DA1F2).withOpacity(lineOpacity) + ..strokeWidth = 1 + ..style = PaintingStyle.stroke + ..strokeCap = StrokeCap.round; + + const dashAngle = 2 * pi / 40; + final gapRatio = 0.45; + + for (int i = 0; i < dashCount; i++) { + final startAngle = i * (2 * pi / dashCount); + final sweepAngle = (2 * pi / dashCount) * (1 - gapRatio); + canvas.drawArc( + Rect.fromCircle(center: center, radius: radius), + startAngle, + sweepAngle, + false, + dashPaint, + ); + } + } else { + // حلقة متصلة + final ringPaint = Paint() + ..color = const Color(0xFF1DA1F2).withOpacity(lineOpacity) + ..strokeWidth = 1 + ..style = PaintingStyle.stroke; + canvas.drawCircle(center, radius, ringPaint); + } + + // النقطة البراقة — دائماً في القمة (before rotation) + final dotPos = Offset(center.dx, center.dy - radius); + + // توهج خلف النقطة + final glowPaint = Paint() + ..color = dotColor.withOpacity(0.35) + ..maskFilter = const MaskFilter.blur(BlurStyle.normal, 9); + canvas.drawCircle(dotPos, dotSize + 2, glowPaint); + + // النقطة نفسها + final dotPaint = Paint() + ..color = dotColor + ..style = PaintingStyle.fill; + canvas.drawCircle(dotPos, dotSize, dotPaint); + } + + @override + bool shouldRepaint(_OrbitalRingPainter old) => false; +} diff --git a/siro_rider/lib/views/Rate/rate_captain.dart b/siro_rider/lib/views/Rate/rate_captain.dart new file mode 100644 index 0000000..3975da7 --- /dev/null +++ b/siro_rider/lib/views/Rate/rate_captain.dart @@ -0,0 +1,219 @@ +import 'package:siro_rider/controller/home/map/ride_lifecycle_controller.dart'; +import 'package:flutter/material.dart'; +import 'package:flutter_rating_bar/flutter_rating_bar.dart'; +import 'package:get/get.dart'; + +import '../../constant/colors.dart'; +import '../../constant/style.dart'; +import '../../controller/firebase/firbase_messge.dart'; +import '../../controller/payment/payment_controller.dart'; +import '../../controller/rate/rate_conroller.dart'; +import '../widgets/elevated_btn.dart'; +import '../widgets/my_scafold.dart'; + +class RateDriverFromPassenger extends StatelessWidget { + RateDriverFromPassenger({super.key}); + final RateController controller = Get.put(RateController()); + @override + Widget build(BuildContext context) { + return MyScafolld( + title: 'Rate Driver'.tr, + body: [ + Positioned( + top: 10, + left: Get.width * .1, + right: Get.width * .1, + child: Container( + // height: Get.height * 6, + decoration: AppStyle.boxDecoration1, + child: Column( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + Padding( + padding: const EdgeInsets.all(4), + child: Container( + height: Get.height * .5, + decoration: AppStyle.boxDecoration1, + child: Padding( + padding: const EdgeInsets.all(8.0), + child: Column( + mainAxisAlignment: MainAxisAlignment.spaceEvenly, + children: [ + Text( + '${'Total price to '.tr}${Get.find().driverName}', + style: AppStyle.title, + ), + Row( + mainAxisAlignment: + MainAxisAlignment.spaceEvenly, + children: [ + Container( + decoration: BoxDecoration( + border: Border.all( + width: 2, + color: AppColor.redColor, + )), + child: Padding( + padding: const EdgeInsets.all(4), + child: Text( + (double.parse(controller.price + .toString()) * + .12 + + double.parse(controller.price + .toString())) + .toStringAsFixed(2), + style: AppStyle.number.copyWith( + color: AppColor.redColor, + textBaseline: + TextBaseline.ideographic, + decoration: + TextDecoration.lineThrough, + decorationColor: + AppColor.redColor), + ), + ), + ), + const SizedBox( + height: 10, + ), + Container( + decoration: BoxDecoration( + border: Border.all( + width: 2, + color: AppColor.greenColor, + )), + child: Padding( + padding: const EdgeInsets.all(4), + child: Text( + controller.price.toString(), + style: AppStyle.number, + ), + ), + ), + ], + ), + const SizedBox( + height: 10, + ), + Padding( + padding: const EdgeInsets.all(4.0), + child: Text( + 'Exclusive offers and discounts always with the Intaleq app' + .tr, + style: AppStyle.title.copyWith( + color: AppColor.redColor, + ), + textAlign: TextAlign.center, + ), + ), + (Get.find() + .isWalletChecked == + true) + ? const DriverTipWidget() + : const SizedBox(), + ], + ), + )), + ), + Center( + child: RatingBar.builder( + initialRating: 0, + itemCount: 5, + itemSize: 50, + itemPadding: const EdgeInsets.symmetric(horizontal: 2), + itemBuilder: (context, index) { + switch (index) { + case 0: + return const Icon( + Icons.sentiment_very_dissatisfied, + color: Colors.red, + ); + case 1: + return const Icon( + Icons.sentiment_dissatisfied, + color: Colors.redAccent, + ); + case 2: + return const Icon( + Icons.sentiment_neutral, + color: Colors.amber, + ); + case 3: + return const Icon( + Icons.sentiment_satisfied, + color: Colors.lightGreen, + ); + case 4: + return const Icon( + Icons.sentiment_very_satisfied, + color: Colors.green, + ); + default: + return const Icon( + Icons.sentiment_neutral, + color: Colors.amber, + ); + } // + }, + onRatingUpdate: (rating) { + controller.selectRateItem(rating); + }, + ), + ), + const SizedBox( + height: 20, + ), + SizedBox( + width: Get.width * .75, + child: TextFormField( + maxLines: 4, + minLines: 1, + keyboardType: TextInputType.multiline, + controller: controller.comment, + decoration: InputDecoration( + labelText: 'Enter your Note'.tr, + hintText: 'Type something...'.tr, + prefixIcon: Icon( + Icons.rate_review, color: AppColor.grayColor), // Add an icon as a prefix + suffixIcon: IconButton( + icon: const Icon( + Icons.clear, + color: AppColor.redColor, + ), // Add an icon as a suffix + onPressed: () { + controller.comment.clear(); + }, + ), + border: + const OutlineInputBorder(), // Add a border around the input field + enabledBorder: OutlineInputBorder( + borderSide: BorderSide( + color: + AppColor.grayColor.withValues(alpha: 0.5)), // Customize the border color + ), + focusedBorder: OutlineInputBorder( + borderSide: BorderSide( + color: AppColor + .greenColor), // Customize the border color when focused + ), + errorBorder: OutlineInputBorder( + borderSide: BorderSide( + color: AppColor + .redColor), // Customize the border color when there's an error + ), + ), + ), + ), + const SizedBox( + height: 20, + ), + MyElevatedButton( + title: 'Submit rating'.tr, + onPressed: () => controller.addRateToDriver()) + ], + ), + )), + ], + isleading: false); + } +} diff --git a/siro_rider/lib/views/Rate/rating_driver_bottom.dart b/siro_rider/lib/views/Rate/rating_driver_bottom.dart new file mode 100644 index 0000000..49a4ad2 --- /dev/null +++ b/siro_rider/lib/views/Rate/rating_driver_bottom.dart @@ -0,0 +1,166 @@ +import 'package:siro_rider/views/home/map_page_passenger.dart'; +import 'package:flutter/material.dart'; +import 'package:flutter_rating_bar/flutter_rating_bar.dart'; +import 'package:get/get.dart'; + +import '../../constant/colors.dart'; +import '../../constant/links.dart'; +import '../../constant/style.dart'; +import '../../controller/home/map_passenger_controller.dart'; +import '../../controller/rate/rate_conroller.dart'; +import '../widgets/elevated_btn.dart'; +import '../widgets/my_scafold.dart'; + +// ملاحظة: تم حذف جميع الأكواد المتعلقة بالسعر والإكرامية كما طُلِب. +// التركيز الآن على التقييم والملاحظات فقط. + +class RatingDriverBottomSheet extends StatelessWidget { + RatingDriverBottomSheet({super.key}); + final RateController controller = Get.put(RateController()); + + @override + Widget build(BuildContext context) { + // تم تبسيط استخدام MyScafolld لإزالة الـ Positioned واستخدام تصميم مركزي ونظيف. + return MyScafolld( + title: 'Rate Driver'.tr, + body: [ + Center( + child: Container( + width: Get.width * .85, + padding: const EdgeInsets.all(24), + // يفترض أن AppStyle.boxDecoration1 يوفر تصميمًا جميلاً مع حواف مدورة وظل. + decoration: AppStyle.boxDecoration1, + child: Column( + mainAxisSize: MainAxisSize.min, + crossAxisAlignment: CrossAxisAlignment.center, + children: [ + // 1. قسم معلومات السائق والترحيب + CircleAvatar( + radius: 30, + backgroundImage: NetworkImage( + '${AppLink.server}/portrate_captain_image/${controller.driverId}.jpg'), + onBackgroundImageError: (exception, stackTrace) => Icon( + Icons.person, + size: 30, + color: AppColor.cyanBlue), + ), + const SizedBox(height: 16), + + // رسالة ترحيب مركزة على تجربة الرحلة + Text( + '${'How was your trip with'.tr} ${controller.driverName}?', + style: AppStyle.title + .copyWith(fontSize: 20, fontWeight: FontWeight.bold), + textAlign: TextAlign.center, + ), + const SizedBox(height: 12), + + // نص إرشادي يؤكد على أهمية التقييم لتحسين الجودة + Text( + 'Your valuable feedback helps us improve our service quality.' + .tr, + style: AppStyle.title + .copyWith(color: AppColor.grayColor, fontSize: 14), + textAlign: TextAlign.center, + ), + + const SizedBox(height: 32), + + // 2. شريط التقييم (النجمي) + Center( + child: RatingBar.builder( + initialRating: 0, + itemCount: 5, + itemSize: 50, // حجم كبير لجعله النقطة البؤرية + glow: true, + glowColor: Colors.amber.shade200, + itemPadding: const EdgeInsets.symmetric(horizontal: 4), + itemBuilder: (context, index) { + // استخدام أيقونات المشاعر مع أيقونة النجمة للحصول على مظهر أكثر جاذبية + switch (index) { + case 0: + return const Icon(Icons.sentiment_very_dissatisfied, + color: Colors.red); + case 1: + return const Icon(Icons.sentiment_dissatisfied, + color: Colors.redAccent); + case 2: + return const Icon(Icons.sentiment_neutral, + color: Colors.amber); + case 3: + return const Icon(Icons.sentiment_satisfied, + color: Colors.lightGreen); + case 4: + return const Icon(Icons.sentiment_very_satisfied, + color: Colors.green); + default: + return const Icon(Icons.star_rounded, + color: Colors.amber); + } + }, + onRatingUpdate: (rating) { + controller.selectRateItem(rating); + }, + ), + ), + + const SizedBox(height: 32), + + // 3. قسم التعليقات (الملاحظات) + SizedBox( + width: Get.width * .75, + child: TextFormField( + maxLines: 4, + minLines: 1, + keyboardType: TextInputType.multiline, + controller: controller.comment, + decoration: InputDecoration( + labelText: 'Leave a detailed comment (Optional)'.tr, + hintText: + 'Share your experience to help us improve...'.tr, + prefixIcon: + Icon(Icons.rate_review, color: AppColor.grayColor), + suffixIcon: IconButton( + icon: Icon(Icons.clear, color: AppColor.redColor), + onPressed: () { + controller.comment.clear(); + }, + ), + // تحسين شكل الحدود لتكون أكثر جمالية + border: OutlineInputBorder( + borderRadius: BorderRadius.circular(12)), + enabledBorder: OutlineInputBorder( + borderRadius: BorderRadius.circular(12), + borderSide: + BorderSide(color: AppColor.grayColor.withOpacity(0.5), width: 1), + ), + focusedBorder: OutlineInputBorder( + borderRadius: BorderRadius.circular(12), + borderSide: BorderSide( + color: AppColor.greenColor, + width: 2), // لون جذاب عند التركيز + ), + ), + ), + ), + + const SizedBox(height: 32), + + // 4. زر الإرسال + MyElevatedButton( + title: 'Submit Rating'.tr, + onPressed: () async { + await controller.addRateToDriver(); + Get.offAll(() => MapPagePassenger()); + // Get.find() + // .getRideStatusFromStartApp(); + }) + ], + ), + ), + ), + ], + isleading: false, + ); + } +} diff --git a/siro_rider/lib/views/auth/login_page.dart b/siro_rider/lib/views/auth/login_page.dart new file mode 100644 index 0000000..0ee92c9 --- /dev/null +++ b/siro_rider/lib/views/auth/login_page.dart @@ -0,0 +1,711 @@ +import 'package:siro_rider/controller/functions/crud.dart'; +import 'package:flutter/gestures.dart'; +import 'package:flutter/material.dart'; +import 'package:flutter_widget_from_html/flutter_widget_from_html.dart'; +import 'package:get/get.dart'; +import 'package:siro_rider/constant/box_name.dart'; +import 'package:siro_rider/constant/colors.dart'; +import 'package:siro_rider/constant/style.dart'; +import 'package:siro_rider/main.dart'; +import 'package:siro_rider/views/widgets/my_scafold.dart'; +import 'package:path/path.dart'; +import 'package:url_launcher/url_launcher.dart'; + +import '../../constant/info.dart'; +import '../../controller/auth/apple_signin_controller.dart'; +import '../../controller/auth/login_controller.dart'; +import '../widgets/elevated_btn.dart'; +import 'otp_page.dart'; + +class LoginPage extends StatelessWidget { + final controller = Get.put(LoginController()); + final AuthController authController = Get.put(AuthController()); + + LoginPage({super.key}); + + @override + Widget build(BuildContext context) { + Get.put(LoginController()); + Get.put(CRUD()); + return GetBuilder( + builder: (controller) => MyScafolld( + title: 'Login'.tr, + isleading: false, + body: [ + if (box.read(BoxName.agreeTerms) != 'agreed') + _buildAgreementPage(context, controller) + else if (box.read(BoxName.locationPermission) != 'true') + _buildLocationPermissionDialog(context, controller) + else + PhoneNumberScreen() + ], + ), + ); + } + + // ───────────────────────────────────────────────────────────────────────── + // SHARED HELPERS + // ───────────────────────────────────────────────────────────────────────── + + /// Subtle geometric background — two soft circles, no heavy blur needed. + Widget _buildBackground(BuildContext context) { + final isDark = Theme.of(context).brightness == Brightness.dark; + return Stack( + children: [ + // Base gradient + Container( + decoration: BoxDecoration( + gradient: LinearGradient( + begin: Alignment.topLeft, + end: Alignment.bottomRight, + colors: isDark + ? [const Color(0xFF0D0D14), const Color(0xFF161622)] + : [const Color(0xFFF8F9FF), const Color(0xFFEFF1FB)], + ), + ), + ), + // Top-right accent circle + Positioned( + top: -80, + right: -60, + child: Container( + width: 260, + height: 260, + decoration: BoxDecoration( + shape: BoxShape.circle, + gradient: RadialGradient( + colors: [ + AppColor.primaryColor.withOpacity(isDark ? 0.18 : 0.12), + AppColor.primaryColor.withOpacity(0.0), + ], + ), + ), + ), + ), + // Bottom-left accent circle + Positioned( + bottom: -100, + left: -80, + child: Container( + width: 320, + height: 320, + decoration: BoxDecoration( + shape: BoxShape.circle, + gradient: RadialGradient( + colors: [ + AppColor.primaryColor.withOpacity(isDark ? 0.12 : 0.08), + AppColor.primaryColor.withOpacity(0.0), + ], + ), + ), + ), + ), + ], + ); + } + + /// Glassy card container used across screens. + Widget _glassCard({ + required Widget child, + required bool isDark, + EdgeInsets padding = const EdgeInsets.all(20), + double radius = 20, + }) { + return Container( + decoration: BoxDecoration( + borderRadius: BorderRadius.circular(radius), + color: isDark + ? Colors.white.withOpacity(0.05) + : Colors.white.withOpacity(0.75), + border: Border.all( + color: isDark + ? Colors.white.withOpacity(0.08) + : Colors.white.withOpacity(0.9), + width: 1, + ), + boxShadow: [ + BoxShadow( + color: isDark + ? Colors.black.withOpacity(0.3) + : Colors.black.withOpacity(0.06), + blurRadius: 24, + offset: const Offset(0, 8), + ), + ], + ), + padding: padding, + child: child, + ); + } + + /// Pill-shaped icon badge with gradient background. + Widget _iconBadge(IconData icon, bool isDark) { + return Container( + width: 80, + height: 80, + decoration: BoxDecoration( + shape: BoxShape.circle, + gradient: LinearGradient( + begin: Alignment.topLeft, + end: Alignment.bottomRight, + colors: [ + AppColor.primaryColor, + AppColor.primaryColor.withOpacity(0.7), + ], + ), + boxShadow: [ + BoxShadow( + color: AppColor.primaryColor.withOpacity(0.35), + blurRadius: 20, + offset: const Offset(0, 8), + ), + ], + ), + child: Icon(icon, color: Colors.white, size: 36), + ); + } + + /// Section divider line. + Widget _divider(bool isDark) => Container( + height: 1, + decoration: BoxDecoration( + gradient: LinearGradient( + colors: [ + Colors.transparent, + isDark + ? Colors.white.withOpacity(0.1) + : Colors.black.withOpacity(0.08), + Colors.transparent, + ], + ), + ), + ); + + // ───────────────────────────────────────────────────────────────────────── + // AGREEMENT PAGE + // ───────────────────────────────────────────────────────────────────────── + Widget _buildAgreementPage(BuildContext context, LoginController controller) { + final isDark = Theme.of(context).brightness == Brightness.dark; + final textMain = isDark ? Colors.white : const Color(0xFF1A1A2E); + final textSub = isDark ? Colors.white60 : const Color(0xFF6B7280); + + return Stack( + children: [ + _buildBackground(context), + SafeArea( + child: Padding( + padding: const EdgeInsets.symmetric(horizontal: 20, vertical: 16), + child: Column( + children: [ + // ── Header ────────────────────────────────────────────── + const SizedBox(height: 20), + _iconBadge(Icons.policy_outlined, isDark), + const SizedBox(height: 16), + Text( + "passenger agreement".tr, + textAlign: TextAlign.center, + style: AppStyle.headTitle2.copyWith( + color: textMain, + fontSize: 22, + fontWeight: FontWeight.w700, + letterSpacing: 0.3, + ), + ), + const SizedBox(height: 10), + // Subtitle with link + RichText( + textAlign: TextAlign.center, + text: TextSpan( + style: AppStyle.title.copyWith( + height: 1.6, + color: textSub, + fontSize: 13.5, + ), + children: [ + TextSpan( + text: + "To become a passenger, you must review and agree to the " + .tr, + ), + TextSpan( + text: 'Terms of Use'.tr, + style: TextStyle( + decoration: TextDecoration.underline, + decorationColor: AppColor.primaryColor, + color: AppColor.primaryColor, + fontWeight: FontWeight.w600, + ), + recognizer: TapGestureRecognizer() + ..onTap = () { + launchUrl(Uri.parse( + 'https://intaleq.xyz/intaleq/privacy_policy.php')); + }, + ), + TextSpan(text: " and acknowledge our Privacy Policy.".tr), + ], + ), + ), + const SizedBox(height: 16), + _divider(isDark), + const SizedBox(height: 12), + + // ── Policy scroll area ────────────────────────────────── + Expanded( + child: _glassCard( + isDark: isDark, + padding: EdgeInsets.zero, + child: ClipRRect( + borderRadius: BorderRadius.circular(20), + child: SingleChildScrollView( + physics: const BouncingScrollPhysics(), + padding: const EdgeInsets.all(18), + child: HtmlWidget( + box.read(BoxName.lang).toString() == 'ar' + ? AppInformation.privacyPolicyArabic + : AppInformation.privacyPolicy, + textStyle: TextStyle( + color: textSub, + fontSize: 13, + height: 1.7, + ), + ), + ), + ), + ), + ), + + const SizedBox(height: 12), + _divider(isDark), + + // ── Checkbox row ──────────────────────────────────────── + _glassCard( + isDark: isDark, + padding: + const EdgeInsets.symmetric(horizontal: 12, vertical: 6), + child: CheckboxListTile( + title: Text( + 'I Agree'.tr, + style: AppStyle.title.copyWith( + color: textMain, + fontWeight: FontWeight.w600, + fontSize: 14, + ), + ), + value: controller.isAgreeTerms, + onChanged: (value) => controller.changeAgreeTerm(), + activeColor: AppColor.primaryColor, + checkColor: Colors.white, + shape: RoundedRectangleBorder( + borderRadius: BorderRadius.circular(6)), + controlAffinity: ListTileControlAffinity.leading, + contentPadding: EdgeInsets.zero, + dense: true, + ), + ), + + const SizedBox(height: 12), + + // ── CTA Button ────────────────────────────────────────── + _buildPrimaryButton( + label: 'Continue'.tr, + enabled: controller.isAgreeTerms, + onPressed: controller.isAgreeTerms + ? () => controller.saveAgreementTerms() + : () {}, + isDark: isDark, + ), + const SizedBox(height: 8), + ], + ), + ), + ), + ], + ); + } + + // ───────────────────────────────────────────────────────────────────────── + // EMAIL / PASSWORD FORM + // ───────────────────────────────────────────────────────────────────────── + Widget buildEmailPasswordForm( + BuildContext context, LoginController controller) { + final isDark = Theme.of(context).brightness == Brightness.dark; + final textMain = isDark ? Colors.white : const Color(0xFF1A1A2E); + final textSub = isDark ? Colors.white60 : const Color(0xFF6B7280); + + return Stack( + children: [ + _buildBackground(context), + SafeArea( + child: Center( + child: SingleChildScrollView( + padding: const EdgeInsets.symmetric(horizontal: 24, vertical: 32), + child: Column( + crossAxisAlignment: CrossAxisAlignment.stretch, + children: [ + // Logo / badge + Center(child: _iconBadge(Icons.lock_outline_rounded, isDark)), + const SizedBox(height: 20), + Text( + 'Welcome Back'.tr, + textAlign: TextAlign.center, + style: AppStyle.headTitle2.copyWith( + color: textMain, + fontSize: 26, + fontWeight: FontWeight.w700, + ), + ), + const SizedBox(height: 6), + Text( + 'Sign in to continue'.tr, + textAlign: TextAlign.center, + style: + AppStyle.title.copyWith(color: textSub, fontSize: 14), + ), + const SizedBox(height: 32), + + _glassCard( + isDark: isDark, + padding: const EdgeInsets.all(24), + child: Form( + key: controller.formKey, + child: Column( + crossAxisAlignment: CrossAxisAlignment.stretch, + children: [ + // Email field + _buildTextField( + controller: controller.emailController, + label: 'Email'.tr, + hint: 'Your email address'.tr, + icon: Icons.email_outlined, + isDark: isDark, + keyboardType: TextInputType.emailAddress, + validator: (value) => value == null || + value.isEmpty || + !value.contains('@') || + !value.contains('.') + ? 'Enter a valid email'.tr + : null, + ), + const SizedBox(height: 16), + + // Password field + _buildTextField( + controller: controller.passwordController, + label: 'Password'.tr, + hint: 'Your password'.tr, + icon: Icons.lock_outline, + isDark: isDark, + obscureText: true, + validator: (value) => value == null || value.isEmpty + ? 'Enter your password'.tr + : null, + ), + const SizedBox(height: 28), + + GetBuilder( + builder: (controller) => controller.isloading + ? Center( + child: SizedBox( + width: 28, + height: 28, + child: CircularProgressIndicator( + color: AppColor.primaryColor, + strokeWidth: 2.5, + ), + ), + ) + : _buildPrimaryButton( + label: 'Submit'.tr, + enabled: true, + isDark: isDark, + onPressed: () { + if (controller.formKey.currentState! + .validate()) { + controller.login(); + } + }, + ), + ), + ], + ), + ), + ), + ], + ), + ), + ), + ), + ], + ); + } + + // ───────────────────────────────────────────────────────────────────────── + // LOCATION PERMISSION PAGE + // ───────────────────────────────────────────────────────────────────────── + Widget _buildLocationPermissionDialog( + BuildContext context, LoginController controller) { + final isDark = Theme.of(context).brightness == Brightness.dark; + final textMain = isDark ? Colors.white : const Color(0xFF1A1A2E); + final textSub = isDark ? Colors.white60 : const Color(0xFF6B7280); + + return Stack( + children: [ + _buildBackground(context), + SafeArea( + child: Padding( + padding: const EdgeInsets.symmetric(horizontal: 28, vertical: 24), + child: Column( + mainAxisAlignment: MainAxisAlignment.center, + children: [ + const Spacer(flex: 2), + + // Animated-look stacked circles around icon + Stack( + alignment: Alignment.center, + children: [ + // Outer glow ring + Container( + width: 140, + height: 140, + decoration: BoxDecoration( + shape: BoxShape.circle, + color: AppColor.primaryColor.withOpacity(0.08), + border: Border.all( + color: AppColor.primaryColor.withOpacity(0.2), + width: 1, + ), + ), + ), + // Mid ring + Container( + width: 108, + height: 108, + decoration: BoxDecoration( + shape: BoxShape.circle, + color: AppColor.primaryColor.withOpacity(0.12), + border: Border.all( + color: AppColor.primaryColor.withOpacity(0.3), + width: 1, + ), + ), + ), + // Core badge + _iconBadge(Icons.location_on_outlined, isDark), + ], + ), + + const SizedBox(height: 36), + + Text( + 'Enable Location Access'.tr, + style: AppStyle.headTitle2.copyWith( + color: textMain, + fontSize: 24, + fontWeight: FontWeight.w700, + letterSpacing: 0.2, + ), + textAlign: TextAlign.center, + ), + const SizedBox(height: 14), + Text( + 'We need your location to find nearby drivers for pickups and drop-offs.' + .tr, + textAlign: TextAlign.center, + style: AppStyle.title.copyWith( + color: textSub, + fontSize: 14.5, + height: 1.6, + ), + ), + + const SizedBox(height: 40), + + // Feature chips row + Row( + mainAxisAlignment: MainAxisAlignment.center, + children: [ + _featureChip( + Icons.speed_outlined, 'Fast matching'.tr, isDark), + const SizedBox(width: 10), + _featureChip(Icons.shield_outlined, 'Secure'.tr, isDark), + const SizedBox(width: 10), + _featureChip(Icons.near_me_outlined, 'Nearby'.tr, isDark), + ], + ), + + const Spacer(flex: 3), + + _buildPrimaryButton( + label: 'Next'.tr, + enabled: true, + isDark: isDark, + onPressed: () async => + await controller.getLocationPermission(), + ), + const SizedBox(height: 16), + ], + ), + ), + ), + ], + ); + } + + // ───────────────────────────────────────────────────────────────────────── + // SHARED SMALL WIDGETS + // ───────────────────────────────────────────────────────────────────────── + + /// Reusable styled text field. + Widget _buildTextField({ + required TextEditingController controller, + required String label, + required String hint, + required IconData icon, + required bool isDark, + bool obscureText = false, + TextInputType? keyboardType, + String? Function(String?)? validator, + }) { + final fill = isDark ? Colors.white.withOpacity(0.05) : Colors.white; + final border = + isDark ? Colors.white.withOpacity(0.1) : const Color(0xFFE5E7EB); + + return TextFormField( + controller: controller, + obscureText: obscureText, + keyboardType: keyboardType, + style: TextStyle( + color: isDark ? Colors.white : const Color(0xFF1A1A2E), + fontSize: 14.5, + ), + decoration: InputDecoration( + labelText: label, + hintText: hint, + prefixIcon: Icon(icon, + size: 20, color: isDark ? Colors.white38 : const Color(0xFF9CA3AF)), + labelStyle: TextStyle( + color: isDark ? Colors.white38 : const Color(0xFF9CA3AF), + fontSize: 13.5, + ), + hintStyle: TextStyle( + color: isDark ? Colors.white24 : const Color(0xFFD1D5DB), + ), + filled: true, + fillColor: fill, + contentPadding: + const EdgeInsets.symmetric(horizontal: 16, vertical: 16), + enabledBorder: OutlineInputBorder( + borderRadius: BorderRadius.circular(14), + borderSide: BorderSide(color: border, width: 1), + ), + focusedBorder: OutlineInputBorder( + borderRadius: BorderRadius.circular(14), + borderSide: BorderSide(color: AppColor.primaryColor, width: 1.5), + ), + errorBorder: OutlineInputBorder( + borderRadius: BorderRadius.circular(14), + borderSide: const BorderSide(color: Color(0xFFEF4444), width: 1), + ), + focusedErrorBorder: OutlineInputBorder( + borderRadius: BorderRadius.circular(14), + borderSide: const BorderSide(color: Color(0xFFEF4444), width: 1.5), + ), + ), + validator: validator, + ); + } + + /// Full-width gradient primary button. + Widget _buildPrimaryButton({ + required String label, + required bool enabled, + required VoidCallback onPressed, + required bool isDark, + }) { + return SizedBox( + width: double.infinity, + height: 54, + child: DecoratedBox( + decoration: BoxDecoration( + borderRadius: BorderRadius.circular(16), + gradient: enabled + ? LinearGradient( + begin: Alignment.centerLeft, + end: Alignment.centerRight, + colors: [ + AppColor.primaryColor, + AppColor.primaryColor.withOpacity(0.8), + ], + ) + : null, + color: enabled + ? null + : (isDark ? Colors.white12 : const Color(0xFFE5E7EB)), + boxShadow: enabled + ? [ + BoxShadow( + color: AppColor.primaryColor.withOpacity(0.32), + blurRadius: 16, + offset: const Offset(0, 6), + ) + ] + : null, + ), + child: ElevatedButton( + onPressed: onPressed, + style: ElevatedButton.styleFrom( + backgroundColor: Colors.transparent, + shadowColor: Colors.transparent, + shape: + RoundedRectangleBorder(borderRadius: BorderRadius.circular(16)), + ), + child: Text( + label, + style: TextStyle( + color: enabled + ? Colors.white + : (isDark ? Colors.white38 : const Color(0xFF9CA3AF)), + fontWeight: FontWeight.w600, + fontSize: 15, + letterSpacing: 0.4, + ), + ), + ), + ), + ); + } + + /// Small chip used on location page. + Widget _featureChip(IconData icon, String text, bool isDark) { + return Container( + padding: const EdgeInsets.symmetric(horizontal: 12, vertical: 8), + decoration: BoxDecoration( + borderRadius: BorderRadius.circular(30), + color: isDark + ? Colors.white.withOpacity(0.06) + : Colors.white.withOpacity(0.8), + border: Border.all( + color: isDark + ? Colors.white.withOpacity(0.1) + : Colors.black.withOpacity(0.07), + width: 1, + ), + ), + child: Row( + mainAxisSize: MainAxisSize.min, + children: [ + Icon(icon, size: 14, color: AppColor.primaryColor), + const SizedBox(width: 5), + Text( + text, + style: TextStyle( + fontSize: 12, + fontWeight: FontWeight.w500, + color: isDark ? Colors.white70 : const Color(0xFF374151), + ), + ), + ], + ), + ); + } +} diff --git a/siro_rider/lib/views/auth/otp_page.dart b/siro_rider/lib/views/auth/otp_page.dart new file mode 100644 index 0000000..214e5d0 --- /dev/null +++ b/siro_rider/lib/views/auth/otp_page.dart @@ -0,0 +1,929 @@ +import 'dart:ui'; +import 'package:flutter/material.dart'; +import 'package:get/get.dart'; + +import 'package:siro_rider/controller/auth/login_controller.dart'; +import '../../constant/colors.dart'; +import '../../controller/auth/otp_controller.dart'; +import '../../controller/local/phone_intel/intl_phone_field.dart'; + +// ───────────────────────────────────────────────────────────────────────────── +// SHARED DESIGN TOKENS +// ───────────────────────────────────────────────────────────────────────────── + +Color _textMain(bool isDark) => isDark ? Colors.white : const Color(0xFF1A1A2E); + +Color _textSub(bool isDark) => + isDark ? Colors.white60 : const Color(0xFF6B7280); + +InputBorder _inputBorder(bool isDark, {bool focused = false}) => + OutlineInputBorder( + borderRadius: BorderRadius.circular(14), + borderSide: focused + ? BorderSide(color: AppColor.primaryColor, width: 1.5) + : BorderSide( + color: isDark + ? Colors.white.withOpacity(0.12) + : const Color(0xFFE5E7EB), + ), + ); + +// ───────────────────────────────────────────────────────────────────────────── +// AUTH SCREEN (shared scaffold for all auth steps) +// ───────────────────────────────────────────────────────────────────────────── + +/// A visually revamped authentication screen with a glassmorphism effect. +/// It provides a consistent and beautiful UI for all authentication steps. +/// +/// A hidden feature for testers is included: a long-press on the logo +/// will open a dialog for email/password login, suitable for app reviews. +class AuthScreen extends StatelessWidget { + final String title; + final String subtitle; + final Widget form; + + const AuthScreen({ + super.key, + required this.title, + required this.subtitle, + required this.form, + }); + + /// Shows a dialog for testers to log in using email and password. + void _showTesterLoginDialog( + BuildContext context, LoginController controller) { + final isDark = Theme.of(context).brightness == Brightness.dark; + final testerEmailController = TextEditingController(); + final testerPasswordController = TextEditingController(); + final testerFormKey = GlobalKey(); + + showDialog( + context: context, + barrierDismissible: true, + builder: (BuildContext dialogContext) { + return BackdropFilter( + filter: ImageFilter.blur(sigmaX: 8, sigmaY: 8), + child: AlertDialog( + backgroundColor: isDark + ? const Color(0xFF161622).withOpacity(0.97) + : Colors.white.withOpacity(0.97), + shape: + RoundedRectangleBorder(borderRadius: BorderRadius.circular(22)), + titlePadding: const EdgeInsets.fromLTRB(24, 24, 24, 0), + contentPadding: const EdgeInsets.all(24), + title: Column( + children: [ + Container( + padding: const EdgeInsets.all(10), + decoration: BoxDecoration( + shape: BoxShape.circle, + color: AppColor.primaryColor.withOpacity(0.12), + ), + child: Icon(Icons.admin_panel_settings_outlined, + color: AppColor.primaryColor, size: 28), + ), + const SizedBox(height: 12), + Text( + 'App Tester Login'.tr, + textAlign: TextAlign.center, + style: TextStyle( + fontWeight: FontWeight.w700, + fontSize: 17, + color: _textMain(isDark), + ), + ), + ], + ), + content: Form( + key: testerFormKey, + child: Column( + mainAxisSize: MainAxisSize.min, + children: [ + _AuthTextField( + controller: testerEmailController, + label: 'Email'.tr, + icon: Icons.email_outlined, + isDark: isDark, + keyboardType: TextInputType.emailAddress, + validator: (value) => value == null || !value.contains('@') + ? 'Enter a valid email'.tr + : null, + ), + const SizedBox(height: 14), + _AuthTextField( + controller: testerPasswordController, + label: 'Password'.tr, + icon: Icons.lock_outline, + isDark: isDark, + obscureText: true, + validator: (value) => value == null || value.isEmpty + ? 'Enter a password'.tr + : null, + ), + ], + ), + ), + actionsPadding: const EdgeInsets.fromLTRB(16, 0, 16, 16), + actions: [ + Row( + children: [ + Expanded( + child: TextButton( + style: TextButton.styleFrom( + padding: const EdgeInsets.symmetric(vertical: 14), + shape: RoundedRectangleBorder( + borderRadius: BorderRadius.circular(12), + side: BorderSide( + color: isDark + ? Colors.white12 + : const Color(0xFFE5E7EB), + ), + ), + ), + onPressed: () => Navigator.of(dialogContext).pop(), + child: Text('Cancel'.tr, + style: TextStyle( + color: _textSub(isDark), + fontWeight: FontWeight.w500)), + ), + ), + const SizedBox(width: 10), + Expanded( + child: _PrimaryButton( + label: 'Login'.tr, + onPressed: () { + if (testerFormKey.currentState!.validate()) { + controller.emailController.text = + testerEmailController.text; + controller.passwordController.text = + testerPasswordController.text; + controller.login(); + Navigator.of(dialogContext).pop(); + } + }, + ), + ), + ], + ), + ], + ), + ); + }, + ); + } + + @override + Widget build(BuildContext context) { + final loginController = Get.find(); + final isDark = Theme.of(context).brightness == Brightness.dark; + + return Scaffold( + body: Stack( + children: [ + // ── Gradient background ──────────────────────────────────── + Container( + decoration: BoxDecoration( + gradient: LinearGradient( + begin: Alignment.topLeft, + end: Alignment.bottomRight, + colors: isDark + ? [ + const Color(0xFF0D0D14), + const Color(0xFF12121E), + const Color(0xFF161622), + ] + : [ + const Color(0xFFF8F9FF), + const Color(0xFFEFF1FB), + const Color(0xFFFFFFFF), + ], + ), + ), + ), + + // ── Decorative Shape 1 (top-left) ───────────────────────── + Positioned( + top: -90, + left: -70, + child: Container( + width: 280, + height: 280, + decoration: BoxDecoration( + shape: BoxShape.circle, + gradient: RadialGradient( + colors: [ + AppColor.primaryColor.withOpacity(isDark ? 0.18 : 0.10), + AppColor.primaryColor.withOpacity(0.0), + ], + ), + ), + ), + ), + + // ── Decorative Shape 2 (bottom-right) ──────────────────── + Positioned( + bottom: -110, + right: -90, + child: Container( + width: 340, + height: 340, + decoration: BoxDecoration( + shape: BoxShape.circle, + gradient: RadialGradient( + colors: [ + AppColor.primaryColor.withOpacity(isDark ? 0.12 : 0.07), + AppColor.primaryColor.withOpacity(0.0), + ], + ), + ), + ), + ), + + // ── Content ─────────────────────────────────────────────── + SafeArea( + child: Center( + child: SingleChildScrollView( + physics: const BouncingScrollPhysics(), + padding: + const EdgeInsets.symmetric(horizontal: 24.0, vertical: 20), + child: Column( + mainAxisAlignment: MainAxisAlignment.center, + children: [ + // Logo + GestureDetector( + onLongPress: () => + _showTesterLoginDialog(context, loginController), + child: Container( + padding: const EdgeInsets.all(4), + decoration: BoxDecoration( + shape: BoxShape.circle, + color: isDark + ? Colors.white.withOpacity(0.05) + : Colors.white.withOpacity(0.9), + border: Border.all( + color: isDark + ? Colors.white.withOpacity(0.1) + : AppColor.primaryColor.withOpacity(0.15), + width: 1.5, + ), + boxShadow: [ + BoxShadow( + color: AppColor.primaryColor.withOpacity(0.18), + blurRadius: 24, + offset: const Offset(0, 8), + ), + ], + ), + child: ClipRRect( + borderRadius: BorderRadius.circular(50), + child: + Image.asset('assets/images/logo.gif', height: 96), + ), + ), + ), + + const SizedBox(height: 22), + + // Title + Text( + title, + textAlign: TextAlign.center, + style: TextStyle( + fontSize: 26, + fontWeight: FontWeight.w700, + letterSpacing: 0.2, + color: _textMain(isDark), + ), + ), + const SizedBox(height: 8), + + // Subtitle + Text( + subtitle, + textAlign: TextAlign.center, + style: TextStyle( + fontSize: 14.5, + height: 1.55, + color: _textSub(isDark), + ), + ), + + const SizedBox(height: 28), + + // ── Glass card ───────────────────────────────── + ClipRRect( + borderRadius: BorderRadius.circular(24), + child: BackdropFilter( + filter: ImageFilter.blur(sigmaX: 16, sigmaY: 16), + child: Container( + padding: const EdgeInsets.all(24.0), + decoration: BoxDecoration( + color: isDark + ? Colors.white.withOpacity(0.05) + : Colors.white.withOpacity(0.72), + borderRadius: BorderRadius.circular(24), + border: Border.all( + color: isDark + ? Colors.white.withOpacity(0.09) + : Colors.white.withOpacity(0.9), + width: 1, + ), + boxShadow: [ + BoxShadow( + color: isDark + ? Colors.black.withOpacity(0.28) + : Colors.black.withOpacity(0.06), + blurRadius: 28, + offset: const Offset(0, 10), + ), + ], + ), + child: form, + ), + ), + ), + + const SizedBox(height: 18), + + // Tester link + Material( + color: Colors.transparent, + child: InkWell( + onTap: () => + _showTesterLoginDialog(context, loginController), + borderRadius: BorderRadius.circular(12), + child: Padding( + padding: const EdgeInsets.symmetric( + vertical: 10, horizontal: 14), + child: Row( + mainAxisSize: MainAxisSize.min, + children: [ + Icon( + Icons.admin_panel_settings_outlined, + size: 15, + color: isDark ? Colors.white24 : Colors.black26, + ), + const SizedBox(width: 7), + Text( + 'For App Reviewers / Testers'.tr, + style: TextStyle( + color: + isDark ? Colors.white24 : Colors.black26, + fontWeight: FontWeight.w400, + fontSize: 12, + ), + ), + ], + ), + ), + ), + ), + ], + ), + ), + ), + ), + ], + ), + ); + } +} + +// ───────────────────────────────────────────────────────────────────────────── +// PHONE NUMBER SCREEN +// ───────────────────────────────────────────────────────────────────────────── + +class PhoneNumberScreen extends StatefulWidget { + const PhoneNumberScreen({super.key}); + @override + State createState() => _PhoneNumberScreenState(); +} + +class _PhoneNumberScreenState extends State { + final _phoneController = TextEditingController(); + final _formKey = GlobalKey(); + bool _isLoading = false; + + void _submit() async { + if (_formKey.currentState!.validate()) { + setState(() => _isLoading = true); + final rawPhone = _phoneController.text.trim().replaceFirst('+', ''); + final success = await PhoneAuthHelper.sendOtp(rawPhone); + if (success && mounted) { + Get.to(() => OtpVerificationScreen(phoneNumber: rawPhone)); + } + if (mounted) setState(() => _isLoading = false); + } + } + + @override + Widget build(BuildContext context) { + final isDark = Theme.of(context).brightness == Brightness.dark; + + return AuthScreen( + title: 'welcome to intaleq'.tr, + subtitle: 'login or register subtitle'.tr, + form: Form( + key: _formKey, + child: Column( + mainAxisSize: MainAxisSize.min, + children: [ + // Label row + Row( + children: [ + Container( + padding: const EdgeInsets.all(7), + decoration: BoxDecoration( + borderRadius: BorderRadius.circular(10), + color: AppColor.primaryColor.withOpacity(0.12), + ), + child: Icon(Icons.phone_outlined, + size: 18, color: AppColor.primaryColor), + ), + const SizedBox(width: 10), + Text( + 'Enter your phone number'.tr, + style: TextStyle( + color: _textMain(isDark), + fontSize: 15, + fontWeight: FontWeight.w600, + ), + ), + ], + ), + const SizedBox(height: 18), + + // Phone field + IntlPhoneField( + showCountryFlag: false, + searchText: 'Search country'.tr, + languageCode: 'ar', + style: TextStyle(color: _textMain(isDark), fontSize: 15), + dropdownTextStyle: TextStyle(color: _textMain(isDark)), + decoration: InputDecoration( + labelText: 'Phone Number'.tr, + hintText: 'witout zero'.tr, + labelStyle: TextStyle(color: _textSub(isDark), fontSize: 13.5), + hintStyle: TextStyle( + color: isDark ? Colors.white24 : const Color(0xFFD1D5DB), + ), + filled: true, + fillColor: + isDark ? Colors.white.withOpacity(0.05) : Colors.white, + contentPadding: + const EdgeInsets.symmetric(horizontal: 16, vertical: 16), + enabledBorder: _inputBorder(isDark), + focusedBorder: _inputBorder(isDark, focused: true), + errorBorder: OutlineInputBorder( + borderRadius: BorderRadius.circular(14), + borderSide: + const BorderSide(color: Color(0xFFEF4444), width: 1), + ), + focusedErrorBorder: OutlineInputBorder( + borderRadius: BorderRadius.circular(14), + borderSide: + const BorderSide(color: Color(0xFFEF4444), width: 1.5), + ), + ), + initialCountryCode: 'SY', + onChanged: (phone) { + _phoneController.text = phone.completeNumber; + }, + validator: (phone) { + if (phone == null || phone.number.isEmpty) { + return 'Please enter your phone number'.tr; + } + if (phone.number.startsWith('0')) { + return 'Please enter the number without the leading 0'.tr; + } + if (phone.completeNumber.length < 10) { + return 'Phone number seems too short'.tr; + } + return null; + }, + ), + + const SizedBox(height: 24), + + _isLoading + ? _LoadingIndicator() + : _PrimaryButton( + label: 'send otp button'.tr, + onPressed: _submit, + ), + ], + ), + ), + ); + } +} + +// ───────────────────────────────────────────────────────────────────────────── +// OTP VERIFICATION SCREEN +// ───────────────────────────────────────────────────────────────────────────── + +class OtpVerificationScreen extends StatefulWidget { + final String phoneNumber; + const OtpVerificationScreen({super.key, required this.phoneNumber}); + @override + State createState() => _OtpVerificationScreenState(); +} + +class _OtpVerificationScreenState extends State { + final _formKey = GlobalKey(); + final _otpController = TextEditingController(); + bool _isLoading = false; + + void _submit() async { + if (_formKey.currentState!.validate()) { + setState(() => _isLoading = true); + await PhoneAuthHelper.verifyOtp(widget.phoneNumber, _otpController.text.trim()); + if (mounted) setState(() => _isLoading = false); + } + } + + @override + Widget build(BuildContext context) { + final isDark = Theme.of(context).brightness == Brightness.dark; + + return AuthScreen( + title: 'verify your number title'.tr, + subtitle: + 'otp sent subtitle'.trParams({'phoneNumber': widget.phoneNumber}), + form: Column( + mainAxisSize: MainAxisSize.min, + children: [ + // Label row + Row( + children: [ + Container( + padding: const EdgeInsets.all(7), + decoration: BoxDecoration( + borderRadius: BorderRadius.circular(10), + color: AppColor.primaryColor.withOpacity(0.12), + ), + child: Icon(Icons.mark_email_read_outlined, + size: 18, color: AppColor.primaryColor), + ), + const SizedBox(width: 10), + Text( + 'Enter the 5-digit code'.tr, + style: TextStyle( + color: _textMain(isDark), + fontSize: 15, + fontWeight: FontWeight.w600, + ), + ), + ], + ), + const SizedBox(height: 24), + + // OTP Input — underline style, large characters + Form( + key: _formKey, + child: Container( + decoration: BoxDecoration( + color: isDark ? Colors.white.withOpacity(0.05) : Colors.white, + borderRadius: BorderRadius.circular(16), + border: Border.all( + color: isDark + ? Colors.white.withOpacity(0.1) + : const Color(0xFFE5E7EB), + ), + ), + padding: const EdgeInsets.symmetric(horizontal: 20, vertical: 12), + child: TextFormField( + controller: _otpController, + textAlign: TextAlign.center, + keyboardType: TextInputType.number, + maxLength: 3, + style: TextStyle( + fontSize: 30, + fontWeight: FontWeight.w700, + color: AppColor.primaryColor, + letterSpacing: 20, + ), + decoration: InputDecoration( + counterText: '', + hintText: '···', + hintStyle: TextStyle( + color: isDark ? Colors.white12 : const Color(0xFFD1D5DB), + letterSpacing: 20, + fontSize: 30, + fontWeight: FontWeight.w300, + ), + border: InputBorder.none, + contentPadding: const EdgeInsets.symmetric(vertical: 6), + ), + validator: (v) => v == null || v.length < 3 ? '' : null, + ), + ), + ), + + // Progress dots + const SizedBox(height: 14), + ValueListenableBuilder( + valueListenable: _otpController, + builder: (_, value, __) { + final filled = value.text.length.clamp(0, 3); + return Row( + mainAxisAlignment: MainAxisAlignment.center, + children: List.generate(3, (i) { + final active = i < filled; + return AnimatedContainer( + duration: const Duration(milliseconds: 200), + margin: const EdgeInsets.symmetric(horizontal: 4), + width: active ? 22 : 8, + height: 6, + decoration: BoxDecoration( + borderRadius: BorderRadius.circular(4), + color: active + ? AppColor.primaryColor + : (isDark ? Colors.white12 : const Color(0xFFE5E7EB)), + ), + ); + }), + ); + }, + ), + + const SizedBox(height: 28), + + _isLoading + ? _LoadingIndicator() + : _PrimaryButton( + label: 'verify and continue button'.tr, + onPressed: _submit, + ), + ], + ), + ); + } +} + +// ───────────────────────────────────────────────────────────────────────────── +// REGISTRATION SCREEN +// ───────────────────────────────────────────────────────────────────────────── + +class RegistrationScreen extends StatefulWidget { + final String phoneNumber; + const RegistrationScreen({super.key, required this.phoneNumber}); + @override + State createState() => _RegistrationScreenState(); +} + +class _RegistrationScreenState extends State { + final _formKey = GlobalKey(); + final _firstNameController = TextEditingController(); + final _lastNameController = TextEditingController(); + final _emailController = TextEditingController(); + bool _isLoading = false; + + void _submit() async { + if (_formKey.currentState!.validate()) { + setState(() => _isLoading = true); + await PhoneAuthHelper.registerUser( + phoneNumber: widget.phoneNumber, + firstName: _firstNameController.text.trim(), + lastName: _lastNameController.text.trim(), + email: _emailController.text.trim(), + ); + if (mounted) setState(() => _isLoading = false); + } + } + + Widget _buildTextFormField({ + required BuildContext context, + required TextEditingController controller, + required String label, + required IconData icon, + TextInputType keyboardType = TextInputType.text, + bool optional = false, + String? Function(String?)? validator, + }) { + final isDark = Theme.of(context).brightness == Brightness.dark; + return _AuthTextField( + controller: controller, + label: label, + icon: icon, + isDark: isDark, + keyboardType: keyboardType, + validator: validator, + ); + } + + @override + Widget build(BuildContext context) { + final isDark = Theme.of(context).brightness == Brightness.dark; + + return AuthScreen( + title: 'one last step title'.tr, + subtitle: 'complete profile subtitle'.tr, + form: Form( + key: _formKey, + child: Column( + mainAxisSize: MainAxisSize.min, + children: [ + // Header row + Row( + children: [ + Container( + padding: const EdgeInsets.all(7), + decoration: BoxDecoration( + borderRadius: BorderRadius.circular(10), + color: AppColor.primaryColor.withOpacity(0.12), + ), + child: Icon(Icons.person_outline_rounded, + size: 18, color: AppColor.primaryColor), + ), + const SizedBox(width: 10), + Text( + 'Complete your profile'.tr, + style: TextStyle( + color: _textMain(isDark), + fontSize: 15, + fontWeight: FontWeight.w600, + ), + ), + ], + ), + const SizedBox(height: 20), + + Row( + children: [ + Expanded( + child: _buildTextFormField( + context: context, + controller: _firstNameController, + label: 'first name label'.tr, + icon: Icons.badge_outlined, + validator: (v) => + v!.isEmpty ? 'first name required'.tr : null, + ), + ), + const SizedBox(width: 12), + Expanded( + child: _buildTextFormField( + context: context, + controller: _lastNameController, + label: 'last name label'.tr, + icon: Icons.badge_outlined, + validator: (v) => + v!.isEmpty ? 'last name required'.tr : null, + ), + ), + ], + ), + const SizedBox(height: 14), + + _buildTextFormField( + context: context, + controller: _emailController, + label: 'email optional label'.tr, + icon: Icons.email_outlined, + keyboardType: TextInputType.emailAddress, + optional: true, + ), + + const SizedBox(height: 24), + + _isLoading + ? _LoadingIndicator() + : _PrimaryButton( + label: 'complete registration button'.tr, + onPressed: _submit, + ), + ], + ), + ), + ); + } +} + +// ───────────────────────────────────────────────────────────────────────────── +// SHARED PRIVATE WIDGETS (scoped to this file) +// ───────────────────────────────────────────────────────────────────────────── + +/// Reusable styled text field with icon prefix. +class _AuthTextField extends StatelessWidget { + final TextEditingController controller; + final String label; + final IconData icon; + final bool isDark; + final bool obscureText; + final TextInputType? keyboardType; + final String? Function(String?)? validator; + + const _AuthTextField({ + required this.controller, + required this.label, + required this.icon, + required this.isDark, + this.obscureText = false, + this.keyboardType, + this.validator, + }); + + @override + Widget build(BuildContext context) { + return TextFormField( + controller: controller, + obscureText: obscureText, + keyboardType: keyboardType, + style: TextStyle( + color: _textMain(isDark), + fontSize: 14.5, + ), + decoration: InputDecoration( + labelText: label, + prefixIcon: Icon(icon, + size: 20, color: isDark ? Colors.white38 : const Color(0xFF9CA3AF)), + labelStyle: TextStyle(color: _textSub(isDark), fontSize: 13.5), + filled: true, + fillColor: isDark ? Colors.white.withOpacity(0.05) : Colors.white, + contentPadding: + const EdgeInsets.symmetric(horizontal: 16, vertical: 15), + enabledBorder: _inputBorder(isDark), + focusedBorder: _inputBorder(isDark, focused: true), + errorBorder: OutlineInputBorder( + borderRadius: BorderRadius.circular(14), + borderSide: const BorderSide(color: Color(0xFFEF4444), width: 1), + ), + focusedErrorBorder: OutlineInputBorder( + borderRadius: BorderRadius.circular(14), + borderSide: const BorderSide(color: Color(0xFFEF4444), width: 1.5), + ), + ), + validator: validator, + ); + } +} + +/// Full-width gradient primary button. +class _PrimaryButton extends StatelessWidget { + final String label; + final VoidCallback onPressed; + + const _PrimaryButton({required this.label, required this.onPressed}); + + @override + Widget build(BuildContext context) { + return SizedBox( + width: double.infinity, + height: 52, + child: DecoratedBox( + decoration: BoxDecoration( + borderRadius: BorderRadius.circular(16), + gradient: LinearGradient( + begin: Alignment.centerLeft, + end: Alignment.centerRight, + colors: [ + AppColor.primaryColor, + AppColor.primaryColor.withOpacity(0.8), + ], + ), + boxShadow: [ + BoxShadow( + color: AppColor.primaryColor.withOpacity(0.32), + blurRadius: 16, + offset: const Offset(0, 6), + ), + ], + ), + child: ElevatedButton( + onPressed: onPressed, + style: ElevatedButton.styleFrom( + backgroundColor: Colors.transparent, + shadowColor: Colors.transparent, + shape: + RoundedRectangleBorder(borderRadius: BorderRadius.circular(16)), + ), + child: Text( + label, + style: const TextStyle( + color: Colors.white, + fontWeight: FontWeight.w600, + fontSize: 15, + letterSpacing: 0.4, + ), + ), + ), + ), + ); + } +} + +/// Branded loading indicator. +class _LoadingIndicator extends StatelessWidget { + @override + Widget build(BuildContext context) { + return SizedBox( + width: 28, + height: 28, + child: CircularProgressIndicator( + color: AppColor.primaryColor, + strokeWidth: 2.5, + ), + ); + } +} diff --git a/siro_rider/lib/views/auth/otp_token_page.dart b/siro_rider/lib/views/auth/otp_token_page.dart new file mode 100644 index 0000000..0b7921b --- /dev/null +++ b/siro_rider/lib/views/auth/otp_token_page.dart @@ -0,0 +1,176 @@ +import 'package:flutter/material.dart'; +import 'package:get/get.dart'; + +import '../../controller/auth/token_otp_change_controller.dart'; + +class OtpVerificationPage extends StatefulWidget { + final String phone; + final String deviceToken; + final String token; + final String ptoken; + + const OtpVerificationPage({ + super.key, + required this.phone, + required this.deviceToken, + required this.token, + required this.ptoken, + }); + + @override + State createState() => _OtpVerificationPageState(); +} + +class _OtpVerificationPageState extends State { + late final OtpVerificationController controller; + final List _focusNodes = List.generate(3, (index) => FocusNode()); + final List _textControllers = + List.generate(3, (index) => TextEditingController()); + + @override + void initState() { + super.initState(); + controller = Get.put(OtpVerificationController( + phone: widget.phone, + deviceToken: widget.deviceToken, + token: widget.token, + )); + } + + @override + void dispose() { + for (var node in _focusNodes) { + node.dispose(); + } + for (var controller in _textControllers) { + controller.dispose(); + } + super.dispose(); + } + + void _onOtpChanged(String value, int index) { + if (value.isNotEmpty) { + if (index < 2) { + _focusNodes[index + 1].requestFocus(); + } else { + _focusNodes[index].unfocus(); // إلغاء التركيز بعد آخر حقل + } + } else if (index > 0) { + _focusNodes[index - 1].requestFocus(); + } + // تجميع نصوص كل الحقول لتكوين الرمز النهائي + controller.otpCode.value = _textControllers.map((c) => c.text).join(); + } + + Widget _buildOtpInputFields() { + return Directionality( + textDirection: TextDirection.ltr, // لضمان ترتيب الحقول من اليسار لليمين + child: Row( + mainAxisAlignment: MainAxisAlignment.spaceEvenly, + children: List.generate(3, (index) { + return SizedBox( + width: 45, + height: 55, + child: TextFormField( + controller: _textControllers[index], + focusNode: _focusNodes[index], + textAlign: TextAlign.center, + keyboardType: TextInputType.number, + maxLength: 1, + style: const TextStyle(fontSize: 22, fontWeight: FontWeight.bold), + decoration: InputDecoration( + counterText: "", + border: OutlineInputBorder( + borderRadius: BorderRadius.circular(12), + ), + enabledBorder: OutlineInputBorder( + borderRadius: BorderRadius.circular(12), + borderSide: BorderSide(color: Colors.grey.shade300), + ), + focusedBorder: OutlineInputBorder( + borderRadius: BorderRadius.circular(12), + borderSide: BorderSide( + color: Theme.of(context).primaryColor, width: 2), + ), + ), + onChanged: (value) => _onOtpChanged(value, index), + ), + ); + }), + ), + ); + } + + @override + Widget build(BuildContext context) { + return Scaffold( + appBar: AppBar( + title: Text('Verify OTP'.tr), + backgroundColor: Colors.transparent, + elevation: 0, + centerTitle: true, + ), + backgroundColor: Colors.grey[50], + body: SingleChildScrollView( + child: Padding( + padding: const EdgeInsets.all(24.0), + child: Column( + crossAxisAlignment: CrossAxisAlignment.center, + children: [ + const SizedBox(height: 20), + Icon(Icons.phonelink_lock_rounded, + size: 80, color: Theme.of(context).primaryColor), + const SizedBox(height: 24), + Text( + 'Verification Code'.tr, + style: + const TextStyle(fontSize: 24, fontWeight: FontWeight.bold), + ), + const SizedBox(height: 12), + Padding( + padding: const EdgeInsets.symmetric(horizontal: 20.0), + child: Text( + '${'We have sent a verification code to your mobile number:'.tr} ${widget.phone}', + textAlign: TextAlign.center, + style: TextStyle( + color: Colors.grey.shade600, fontSize: 16, height: 1.5), + ), + ), + const SizedBox(height: 40), + _buildOtpInputFields(), + const SizedBox(height: 40), + Obx(() => SizedBox( + width: double.infinity, + height: 50, + child: controller.isVerifying.value + ? const Center(child: CircularProgressIndicator()) + : ElevatedButton( + style: ElevatedButton.styleFrom( + shape: RoundedRectangleBorder( + borderRadius: BorderRadius.circular(12))), + onPressed: () => + controller.verifyOtp(widget.ptoken), + child: Text('Verify'.tr, + style: const TextStyle( + fontSize: 18, fontWeight: FontWeight.w600)), + ), + )), + const SizedBox(height: 24), + Obx( + () => controller.canResend.value + ? TextButton( + onPressed: controller.sendOtp, + child: Text('Resend Code'.tr), + ) + : Text( + '${'You can resend in'.tr} ${controller.countdown.value} ${'seconds'.tr}', + style: const TextStyle(color: Colors.grey), + ), + ) + ], + ), + ), + ), + ); + } +} diff --git a/siro_rider/lib/views/auth/register_page.dart b/siro_rider/lib/views/auth/register_page.dart new file mode 100644 index 0000000..116d27b --- /dev/null +++ b/siro_rider/lib/views/auth/register_page.dart @@ -0,0 +1,295 @@ +import 'package:flutter/material.dart'; +import 'package:get/get.dart'; +import 'package:siro_rider/constant/style.dart'; +import 'package:siro_rider/controller/auth/register_controller.dart'; +import 'package:siro_rider/views/widgets/elevated_btn.dart'; +import 'package:siro_rider/views/widgets/my_scafold.dart'; + +import '../../constant/colors.dart'; + +class RegisterPage extends StatelessWidget { + const RegisterPage({super.key}); + + @override + Widget build(BuildContext context) { + Get.put(RegisterController()); + return MyScafolld( + title: 'Register'.tr, + body: [ + GetBuilder( + builder: (controller) => Form( + key: controller.formKey, + child: Padding( + padding: const EdgeInsets.all(16.0), + child: SingleChildScrollView( + child: Container( + decoration: BoxDecoration( + boxShadow: const [ + BoxShadow( + offset: Offset(3, 3), + color: AppColor.accentColor, + blurRadius: 3) + ], + color: AppColor.secondaryColor, + ), + child: Padding( + padding: const EdgeInsets.all(16), + child: Column(children: [ + Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + SizedBox( + width: Get.width * .4, + child: TextFormField( + keyboardType: TextInputType.text, + controller: controller.firstNameController, + decoration: InputDecoration( + focusedBorder: OutlineInputBorder( + borderSide: const BorderSide( + color: AppColor.primaryColor, + width: 2.0, + ), + borderRadius: BorderRadius.circular(10), + ), + fillColor: AppColor.accentColor, + hoverColor: AppColor.accentColor, + focusColor: AppColor.accentColor, + border: const OutlineInputBorder( + borderRadius: BorderRadius.all( + Radius.circular(12))), + labelText: 'First name'.tr, + hintText: 'Enter your first name'.tr, + ), + validator: (value) { + if (value!.isEmpty) { + return 'Please enter your first name.'.tr; + } + return null; + }, + ), + ), + SizedBox( + width: Get.width * .4, + child: TextFormField( + keyboardType: TextInputType.text, + controller: controller.lastNameController, + decoration: InputDecoration( + focusedBorder: OutlineInputBorder( + borderSide: const BorderSide( + color: AppColor.primaryColor, + width: 2.0, + ), + borderRadius: BorderRadius.circular(10), + ), + focusColor: AppColor.accentColor, + fillColor: AppColor.accentColor, + border: const OutlineInputBorder( + borderRadius: BorderRadius.all( + Radius.circular(12))), + labelText: 'Last name'.tr, + hintText: 'Enter your last name'.tr, + ), + validator: (value) { + if (value!.isEmpty) { + return 'Please enter your last name.'.tr; + } + return null; + }, + ), + ), + ], + ), + const SizedBox( + height: 15, + ), + TextFormField( + keyboardType: TextInputType.emailAddress, + controller: controller.emailController, + decoration: InputDecoration( + focusedBorder: OutlineInputBorder( + borderSide: const BorderSide( + color: AppColor.primaryColor, + width: 2.0, + ), + borderRadius: BorderRadius.circular(10), + ), + fillColor: AppColor.accentColor, + hoverColor: AppColor.accentColor, + focusColor: AppColor.accentColor, + border: const OutlineInputBorder( + borderRadius: + BorderRadius.all(Radius.circular(12))), + labelText: 'Email'.tr, + hintText: 'Enter your email address'.tr, + ), + validator: (value) { + if (value!.isEmpty || + (!value.contains('@') || + !value.contains('.'))) { + return 'Please enter Your Email.'.tr; + } + return null; + }, + ), + const SizedBox( + height: 15, + ), + TextFormField( + obscureText: true, + keyboardType: TextInputType.emailAddress, + controller: controller.passwordController, + decoration: InputDecoration( + focusedBorder: OutlineInputBorder( + borderSide: const BorderSide( + color: AppColor.primaryColor, + width: 2.0, + ), + borderRadius: BorderRadius.circular(10), + ), + fillColor: AppColor.accentColor, + hoverColor: AppColor.accentColor, + focusColor: AppColor.accentColor, + border: const OutlineInputBorder( + borderRadius: + BorderRadius.all(Radius.circular(12))), + labelText: 'Password'.tr, + hintText: 'Enter your Password'.tr, + ), + validator: (value) { + if (value!.isEmpty) { + return 'Please enter Your Password.'.tr; + } + if (value.length < 6) { + return 'Password must br at least 6 character.' + .tr; + } + return null; + }, + ), + const SizedBox( + height: 15, + ), + Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + SizedBox( + width: Get.width * .4, + child: TextFormField( + keyboardType: TextInputType.phone, + cursorColor: AppColor.accentColor, + controller: controller.phoneController, + decoration: InputDecoration( + focusedBorder: OutlineInputBorder( + borderSide: const BorderSide( + color: AppColor.primaryColor, + width: 2.0, + ), + borderRadius: BorderRadius.circular(10), + ), + focusColor: AppColor.accentColor, + fillColor: AppColor.accentColor, + border: const OutlineInputBorder( + borderRadius: BorderRadius.all( + Radius.circular(12))), + labelText: 'Phone'.tr, + hintText: 'Enter your phone number'.tr, + ), + validator: (value) { + if (value!.isEmpty || value.length != 10) { + return 'Please enter your phone number.'.tr; + } + return null; + }, + ), + ), + SizedBox( + width: Get.width * .4, + child: TextFormField( + keyboardType: TextInputType.text, + controller: controller.siteController, + decoration: InputDecoration( + focusedBorder: OutlineInputBorder( + borderSide: const BorderSide( + color: AppColor.primaryColor, + width: 2.0, + ), + borderRadius: BorderRadius.circular(10), + ), + focusColor: AppColor.accentColor, + fillColor: AppColor.accentColor, + border: const OutlineInputBorder( + borderRadius: BorderRadius.all( + Radius.circular(12))), + labelText: 'City'.tr, + hintText: 'Enter your City'.tr, + ), + validator: (value) { + if (value!.isEmpty) { + return 'Please enter your City.'.tr; + } + return null; + }, + ), + ), + ], + ), + const SizedBox( + height: 15, + ), + Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + InkWell( + onTap: () => controller.getBirthDate(), + child: Container( + height: 50, + width: Get.width * .4, + decoration: BoxDecoration( + border: Border.all(), + borderRadius: BorderRadius.circular(13)), + child: Padding( + padding: const EdgeInsets.symmetric( + horizontal: 20), + child: Text( + controller.birthDate, + style: AppStyle.title, + ), + ), + ), + ), + // DropdownButton( + // value: controller.gender, + // items: [ + // DropdownMenuItem( + // value: 'Male'.tr, + // child: Text('Male'.tr), + // ), + // DropdownMenuItem( + // value: 'Female'.tr, + // child: Text('Female'.tr), + // ), + // DropdownMenuItem( + // value: '--'.tr, + // child: Text('--'.tr), + // ), + // ], + // onChanged: (value) { + // controller.changeGender(value!); + // }, + // ) + ], + ), + MyElevatedButton( + title: 'Register'.tr, + onPressed: () => controller.register()) + ]), + ), + ), + ), + ), + ), + ) + ], + isleading: true); + } +} diff --git a/siro_rider/lib/views/auth/sms_verfy_page.dart b/siro_rider/lib/views/auth/sms_verfy_page.dart new file mode 100644 index 0000000..aa162cb --- /dev/null +++ b/siro_rider/lib/views/auth/sms_verfy_page.dart @@ -0,0 +1,119 @@ +import 'package:siro_rider/constant/style.dart'; +import 'package:siro_rider/controller/auth/register_controller.dart'; +import 'package:siro_rider/views/widgets/elevated_btn.dart'; +import 'package:siro_rider/views/widgets/my_scafold.dart'; +import 'package:siro_rider/views/widgets/my_textField.dart'; +import 'package:flutter/material.dart'; +import 'package:get/get.dart'; + +import '../../controller/local/phone_intel/intl_phone_field.dart'; +import '../../print.dart'; +import '../widgets/mycircular.dart'; +// import 'package:intl_phone_field/intl_phone_field.dart'; + +class SmsSignupEgypt extends StatelessWidget { + SmsSignupEgypt({super.key}); + + @override + Widget build(BuildContext context) { + Get.put(RegisterController()); + return MyScafolld( + title: "Phone Number Check".tr, + body: [ + GetBuilder(builder: (registerController) { + return ListView( + children: [ + // Logo at the top + Padding( + padding: const EdgeInsets.only(bottom: 20.0), + child: Image.asset( + 'assets/images/logo.png', // Make sure you have a logo image in your assets folder + height: 100, + ), + ), + // Message to the driver + Padding( + padding: + const EdgeInsets.symmetric(horizontal: 16.0, vertical: 8.0), + child: Text( + 'We need your phone number to contact you and to help you.' + .tr, + textAlign: TextAlign.center, + style: AppStyle.title, + ), + ), + // Phone number input field with country code dropdown + Padding( + padding: const EdgeInsets.all(16.0), + child: IntlPhoneField( + decoration: InputDecoration( + labelText: 'Phone Number'.tr, + border: const OutlineInputBorder( + borderSide: BorderSide(), + ), + ), + initialCountryCode: 'EG', + onChanged: (phone) { + // Properly concatenate country code and number + registerController.phoneController.text = + phone.completeNumber.toString(); + Log.print(' phone.number: ${phone.number}'); + Log.print( + "Formatted phone number: ${registerController.phoneController.text}"); + }, + validator: (phone) { + // Check if the phone number is not null and is valid + if (phone == null || phone.completeNumber.isEmpty) { + return 'Please enter your phone number'; + } + + // Extract the phone number (excluding the country code) + final number = phone.completeNumber.toString(); + + // Check if the number length is exactly 11 digits + if (number.length != 13) { + return 'Phone number must be exactly 11 digits long'; + } + + // If all validations pass, return null + return null; + }, + ), + ), + const SizedBox( + height: 10, + ), + if (registerController.isSent) + Padding( + padding: const EdgeInsets.all(16.0), + child: Form( + key: registerController.formKey3, + child: MyTextForm( + controller: registerController.verifyCode, + label: '5 digit'.tr, + hint: '5 digit'.tr, + type: TextInputType.number), + ), + ), + // Submit button + registerController.isLoading + ? const MyCircularProgressIndicator() + : Padding( + padding: const EdgeInsets.all(16.0), + child: MyElevatedButton( + onPressed: () async { + !registerController.isSent + ? await registerController.sendOtpMessage() + : await registerController.verifySMSCode(); + }, + title: 'Submit'.tr, + ), + ), + ], + ); + }), + ], + isleading: false, + ); + } +} diff --git a/siro_rider/lib/views/auth/verify_email_page.dart b/siro_rider/lib/views/auth/verify_email_page.dart new file mode 100644 index 0000000..e2d0bf0 --- /dev/null +++ b/siro_rider/lib/views/auth/verify_email_page.dart @@ -0,0 +1,90 @@ +import 'package:flutter/material.dart'; +import 'package:get/get.dart'; +import 'package:siro_rider/constant/colors.dart'; +import 'package:siro_rider/constant/style.dart'; +import 'package:siro_rider/controller/auth/register_controller.dart'; +import 'package:siro_rider/views/widgets/elevated_btn.dart'; +import 'package:siro_rider/views/widgets/my_scafold.dart'; + +class VerifyEmailPage extends StatelessWidget { + const VerifyEmailPage({super.key}); + + @override + Widget build(BuildContext context) { + Get.put(RegisterController()); + return MyScafolld( + title: 'Verify Email'.tr, + body: [ + Positioned( + top: 10, + left: 20, + right: 20, + child: Text( + 'We sent 5 digit to your Email provided'.tr, + style: AppStyle.title.copyWith(fontSize: 20), + )), + GetBuilder( + builder: (controller) => Positioned( + top: 100, + left: 80, + right: 80, + child: Padding( + padding: const EdgeInsets.all(10), + child: Column( + children: [ + SizedBox( + width: 100, + child: TextField( + controller: controller.verifyCode, + decoration: InputDecoration( + labelStyle: AppStyle.title, + border: const OutlineInputBorder(), + hintText: '5 digit'.tr, + counterStyle: AppStyle.number, + hintStyle: AppStyle.subtitle + .copyWith(color: AppColor.accentColor), + ), + maxLength: 5, + keyboardType: TextInputType.number, + ), + ), + const SizedBox( + height: 30, + ), + MyElevatedButton( + title: 'Send Verfication Code'.tr, + onPressed: () => controller.sendVerifications()) + ], + ), + ), + )), + ], + isleading: true, + ); + } + + Padding verifyEmail() { + return Padding( + padding: const EdgeInsets.symmetric(horizontal: 10), + child: Container( + decoration: BoxDecoration( + border: Border.all( + color: AppColor.accentColor, + width: 2, + ), + borderRadius: BorderRadius.circular(8), + ), + child: const Padding( + padding: EdgeInsets.all(10), + child: SizedBox( + width: 20, + child: TextField( + maxLength: 1, + keyboardType: TextInputType.number, + ), + ), + ), + ), + ); + } +} diff --git a/siro_rider/lib/views/home/HomePage/about_page.dart b/siro_rider/lib/views/home/HomePage/about_page.dart new file mode 100644 index 0000000..c4fad0b --- /dev/null +++ b/siro_rider/lib/views/home/HomePage/about_page.dart @@ -0,0 +1,233 @@ +import 'package:flutter/cupertino.dart'; +import 'package:get/get.dart'; + +class AboutPage extends StatelessWidget { + const AboutPage({super.key}); + + @override + Widget build(BuildContext context) { + return CupertinoPageScaffold( + navigationBar: CupertinoNavigationBar( + middle: Text('About Us'.tr), + ), + child: SafeArea( + child: SingleChildScrollView( + child: Padding( + padding: const EdgeInsets.all(20.0), + child: Column( + crossAxisAlignment: CrossAxisAlignment.stretch, + children: [ + // Company Logo + Center( + child: Image.asset( + 'assets/images/logo.gif', // Replace with your logo image asset path + height: 80.0, + ), + ), + const SizedBox(height: 20), + + // Company Name and Introduction + Text( + 'Intaleq LLC', + style: CupertinoTheme.of(context).textTheme.navTitleTextStyle, + textAlign: TextAlign.center, + ), + const SizedBox(height: 8), + Text( + "Syria's pioneering ride-sharing service, proudly developed by Arabian and local owners. We prioritize being near you – both our valued passengers and our dedicated captains." + .tr, + style: CupertinoTheme.of(context).textTheme.textStyle, + textAlign: TextAlign.center, + ), + const SizedBox(height: 30), + + // Key Features Section + Text( + 'Why Choose Intaleq?'.tr, + style: CupertinoTheme.of(context).textTheme.navTitleTextStyle, + textAlign: TextAlign.center, + ), + const SizedBox(height: 15), + + // Nearest Availability + Row( + children: [ + const Icon(CupertinoIcons.location_solid, + color: CupertinoColors.activeBlue), + const SizedBox(width: 10), + Expanded( + child: Text( + 'Closest to You'.tr, + style: CupertinoTheme.of(context).textTheme.textStyle, + ), + ), + ], + ), + const SizedBox(height: 10), + Text( + 'We connect you with the nearest drivers for faster pickups and quicker journeys.' + .tr, + style: CupertinoTheme.of(context) + .textTheme + .textStyle + .copyWith(color: CupertinoColors.secondaryLabel), + ), + const SizedBox(height: 20), + + // High-Level Security + Row( + children: [ + const Icon(CupertinoIcons.shield_fill, + color: CupertinoColors.activeGreen), + const SizedBox(width: 10), + Expanded( + child: Text( + 'Uncompromising Security'.tr, + style: CupertinoTheme.of(context).textTheme.textStyle, + ), + ), + ], + ), + const SizedBox(height: 10), + Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Row( + children: [ + const Icon(CupertinoIcons.person_2_fill, + size: 18, color: CupertinoColors.activeGreen), + const SizedBox(width: 5), + Text( + 'Lady Captains Available'.tr, + style: CupertinoTheme.of(context) + .textTheme + .textStyle + .copyWith(fontSize: 15), + ), + ], + ), + const SizedBox(height: 5), + Row( + children: [ + const Icon(CupertinoIcons.recordingtape, + size: 18, color: CupertinoColors.activeGreen), + const SizedBox(width: 5), + Text( + 'Recorded Trips (Voice & AI Analysis)'.tr, + style: CupertinoTheme.of(context) + .textTheme + .textStyle + .copyWith(fontSize: 15), + ), + ], + ), + ], + ), + const SizedBox(height: 20), + + // Fast Support + Row( + children: [ + const Icon(CupertinoIcons.bolt_horizontal_fill, + color: CupertinoColors.systemOrange), + const SizedBox(width: 10), + Expanded( + child: Text( + 'Fastest Complaint Response'.tr, + style: CupertinoTheme.of(context).textTheme.textStyle, + ), + ), + ], + ), + const SizedBox(height: 10), + Text( + 'Our dedicated customer service team ensures swift resolution of any issues.' + .tr, + style: CupertinoTheme.of(context) + .textTheme + .textStyle + .copyWith(color: CupertinoColors.secondaryLabel), + ), + const SizedBox(height: 20), + + // Affordable Pricing + Row( + children: [ + const Icon(CupertinoIcons.money_dollar_circle_fill, + color: CupertinoColors.activeBlue), + const SizedBox(width: 10), + Expanded( + child: Text( + 'Affordable for Everyone'.tr, + style: CupertinoTheme.of(context).textTheme.textStyle, + ), + ), + ], + ), + const SizedBox(height: 10), + Text( + 'Enjoy competitive prices across all trip options, making travel accessible.' + .tr, + style: CupertinoTheme.of(context) + .textTheme + .textStyle + .copyWith(color: CupertinoColors.secondaryLabel), + ), + const SizedBox(height: 20), + + // Trip Options + Row( + children: [ + const Icon(CupertinoIcons.car_detailed, + color: CupertinoColors.systemPurple), + const SizedBox(width: 10), + Expanded( + child: Text( + 'Variety of Trip Choices'.tr, + style: CupertinoTheme.of(context).textTheme.textStyle, + ), + ), + ], + ), + const SizedBox(height: 10), + Text( + 'Choose the trip option that perfectly suits your needs and preferences.' + .tr, + style: CupertinoTheme.of(context) + .textTheme + .textStyle + .copyWith(color: CupertinoColors.secondaryLabel), + ), + const SizedBox(height: 20), + + // Passenger Choice + Row( + children: [ + Icon(CupertinoIcons.hand_draw_fill, + color: CupertinoColors.systemGreen), + const SizedBox(width: 10), + Expanded( + child: Text( + 'Your Choice, Our Priority'.tr, + style: CupertinoTheme.of(context).textTheme.textStyle, + ), + ), + ], + ), + const SizedBox(height: 10), + Text( + 'Because we are near, you have the flexibility to choose the ride that works best for you.' + .tr, + style: CupertinoTheme.of(context) + .textTheme + .textStyle + .copyWith(color: CupertinoColors.secondaryLabel), + ), + ], + ), + ), + ), + ), + ); + } +} diff --git a/siro_rider/lib/views/home/HomePage/contact_us.dart b/siro_rider/lib/views/home/HomePage/contact_us.dart new file mode 100644 index 0000000..f33be44 --- /dev/null +++ b/siro_rider/lib/views/home/HomePage/contact_us.dart @@ -0,0 +1,360 @@ +import 'package:siro_rider/constant/colors.dart'; +import 'package:siro_rider/constant/style.dart'; +import 'package:siro_rider/views/widgets/my_scafold.dart'; +import 'package:flutter/material.dart'; +import 'package:flutter_font_icons/flutter_font_icons.dart'; +import 'package:get/get.dart'; + +import '../../../controller/functions/tts.dart'; +import '../../../controller/home/contact_us_controller.dart'; +import '../../widgets/elevated_btn.dart'; + +class ContactUsPage extends StatelessWidget { + ContactUsPage({super.key}); + + @override + Widget build(BuildContext context) { + final controller = Get.put(ContactUsController()); + final isDark = Theme.of(context).brightness == Brightness.dark; + + return MyScafolld( + title: "Contact Us".tr, + isleading: true, + body: [ + // Background subtle gradient/shape + Positioned.fill( + child: Container( + decoration: BoxDecoration( + gradient: LinearGradient( + begin: Alignment.topLeft, + end: Alignment.bottomRight, + colors: isDark + ? [const Color(0xFF0D0D14), const Color(0xFF161622)] + : [const Color(0xFFF8F9FF), const Color(0xFFEFF1FB)], + ), + ), + ), + ), + SafeArea( + child: SingleChildScrollView( + physics: const BouncingScrollPhysics(), + padding: const EdgeInsets.symmetric(horizontal: 20, vertical: 10), + child: Column( + crossAxisAlignment: CrossAxisAlignment.stretch, + children: [ + // ── Hero Section ────────────────────────────────────────── + _buildHeroSection(isDark), + const SizedBox(height: 24), + + // ── Availability Status ──────────────────────────────────── + _buildAvailabilityStatus(controller, isDark), + const SizedBox(height: 24), + + // ── Support Actions ──────────────────────────────────────── + Text( + "Reach out to us via".tr, + style: AppStyle.title.copyWith( + fontWeight: FontWeight.bold, + fontSize: 16, + color: isDark ? Colors.white70 : Colors.black54, + ), + ), + const SizedBox(height: 12), + _buildContactCards(controller, isDark), + const SizedBox(height: 32), + + // ── About Section ────────────────────────────────────────── + _buildAboutSection(isDark), + const SizedBox(height: 40), + ], + ), + ), + ), + ], + ); + } + + Widget _buildHeroSection(bool isDark) { + return Container( + padding: const EdgeInsets.all(24), + decoration: BoxDecoration( + color: isDark ? Colors.white.withOpacity(0.05) : Colors.white, + borderRadius: BorderRadius.circular(24), + border: Border.all( + color: isDark ? Colors.white12 : Colors.black.withOpacity(0.05), + ), + boxShadow: [ + BoxShadow( + color: isDark ? Colors.black26 : Colors.black.withOpacity(0.03), + blurRadius: 20, + offset: const Offset(0, 10), + ) + ], + ), + child: Column( + children: [ + Container( + padding: const EdgeInsets.all(4), + decoration: BoxDecoration( + shape: BoxShape.circle, + color: isDark ? Colors.white10 : Colors.white, + border: Border.all(color: AppColor.primaryColor.withOpacity(0.2)), + ), + child: ClipRRect( + borderRadius: BorderRadius.circular(50), + child: Image.asset('assets/images/logo.gif', height: 80), + ), + ), + const SizedBox(height: 16), + Text( + "Intaleq Support".tr, + style: AppStyle.headTitle2.copyWith( + fontSize: 22, + fontWeight: FontWeight.bold, + color: isDark ? Colors.white : AppColor.primaryColor, + ), + ), + const SizedBox(height: 4), + Text( + "We're here to help you 24/7".tr, + style: TextStyle( + color: isDark ? Colors.white54 : Colors.black45, + fontSize: 14, + ), + ), + ], + ), + ); + } + + Widget _buildAvailabilityStatus(ContactUsController controller, bool isDark) { + final isOpen = controller.isWorkTime; + return Container( + padding: const EdgeInsets.symmetric(horizontal: 16, vertical: 12), + decoration: BoxDecoration( + color: (isOpen ? AppColor.greenColor : Colors.orange).withOpacity(0.1), + borderRadius: BorderRadius.circular(16), + border: Border.all( + color: (isOpen ? AppColor.greenColor : Colors.orange).withOpacity(0.2), + ), + ), + child: Row( + children: [ + Container( + padding: const EdgeInsets.all(8), + decoration: BoxDecoration( + shape: BoxShape.circle, + color: isOpen ? AppColor.greenColor : Colors.orange, + ), + child: Icon( + isOpen ? Icons.check_circle_outline : Icons.access_time, + color: Colors.white, + size: 18, + ), + ), + const SizedBox(width: 12), + Expanded( + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Text( + isOpen ? "Support is currently Online".tr : "Support is Away".tr, + style: TextStyle( + fontWeight: FontWeight.bold, + color: isOpen ? AppColor.greenColor : Colors.orange, + ), + ), + Text( + "${"Working Hours:".tr} ${controller.workHoursString}", + style: TextStyle( + fontSize: 12, + color: isDark ? Colors.white60 : Colors.black54, + ), + ), + ], + ), + ), + ], + ), + ); + } + + Widget _buildContactCards(ContactUsController controller, bool isDark) { + return Column( + children: [ + _ContactCard( + title: "Voice Call".tr, + subtitle: "Direct talk with our team".tr, + icon: Icons.phone_in_talk_outlined, + color: AppColor.primaryColor, + isDark: isDark, + enabled: controller.isWorkTime, + onTap: controller.makeCall, + trailing: controller.isWorkTime ? null : Icon(Icons.lock_clock_outlined, size: 20, color: isDark ? Colors.white24 : Colors.black26), + ), + const SizedBox(height: 12), + _ContactCard( + title: "WhatsApp".tr, + subtitle: "Chat with us anytime".tr, + icon: FontAwesome.whatsapp, + color: AppColor.greenColor, + isDark: isDark, + onTap: controller.sendWhatsApp, + ), + const SizedBox(height: 12), + _ContactCard( + title: "Email Support".tr, + subtitle: "For official inquiries".tr, + icon: Icons.alternate_email_outlined, + color: AppColor.redColor, + isDark: isDark, + onTap: controller.sendEmail, + ), + ], + ); + } + + Widget _buildAboutSection(bool isDark) { + return Container( + padding: const EdgeInsets.all(20), + decoration: BoxDecoration( + color: isDark ? Colors.white.withOpacity(0.02) : Colors.black.withOpacity(0.02), + borderRadius: BorderRadius.circular(24), + border: Border.all(color: isDark ? Colors.white10 : Colors.black12), + ), + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + Text( + "About Intaleq".tr, + style: TextStyle( + fontWeight: FontWeight.bold, + fontSize: 18, + color: isDark ? Colors.white : Colors.black87, + ), + ), + IconButton( + onPressed: () { + Get.find().speakText( + 'Intaleq is the safest and most reliable ride-sharing app designed especially for passengers in Syria. We provide a comfortable, respectful, and affordable riding experience with features that prioritize your safety and convenience.' + .tr, + ); + }, + icon: Icon(Icons.volume_up_outlined, color: AppColor.primaryColor), + ), + ], + ), + const SizedBox(height: 12), + Text( + 'Intaleq is the safest and most reliable ride-sharing app designed especially for passengers in Syria. We provide a comfortable, respectful, and affordable riding experience with features that prioritize your safety and convenience. Our trusted captains are verified, insured, and supported by regular car maintenance carried out by top engineers. We also offer on-road support services to make sure every trip is smooth and worry-free. With Intaleq, you enjoy quality, safety, and peace of mind—every time you ride.' + .tr, + style: TextStyle( + color: isDark ? Colors.white70 : Colors.black54, + fontSize: 14, + height: 1.6, + ), + ), + ], + ), + ); + } +} + +class _ContactCard extends StatelessWidget { + final String title; + final String subtitle; + final IconData icon; + final Color color; + final bool isDark; + final bool enabled; + final VoidCallback onTap; + final Widget? trailing; + + const _ContactCard({ + required this.title, + required this.subtitle, + required this.icon, + required this.color, + required this.isDark, + this.enabled = true, + required this.onTap, + this.trailing, + }); + + @override + Widget build(BuildContext context) { + return Material( + color: Colors.transparent, + child: InkWell( + onTap: enabled ? onTap : null, + borderRadius: BorderRadius.circular(20), + child: Container( + padding: const EdgeInsets.all(16), + decoration: BoxDecoration( + color: enabled + ? (isDark ? Colors.white.withOpacity(0.05) : Colors.white) + : (isDark ? Colors.white.withOpacity(0.02) : Colors.grey.withOpacity(0.05)), + borderRadius: BorderRadius.circular(20), + border: Border.all( + color: enabled + ? (isDark ? Colors.white12 : Colors.black.withOpacity(0.05)) + : Colors.transparent, + ), + boxShadow: enabled ? [ + BoxShadow( + color: isDark ? Colors.black12 : Colors.black.withOpacity(0.02), + blurRadius: 10, + offset: const Offset(0, 4), + ) + ] : null, + ), + child: Row( + children: [ + Container( + padding: const EdgeInsets.all(12), + decoration: BoxDecoration( + color: (enabled ? color : Colors.grey).withOpacity(0.12), + borderRadius: BorderRadius.circular(14), + ), + child: Icon(icon, color: enabled ? color : Colors.grey, size: 24), + ), + const SizedBox(width: 16), + Expanded( + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Text( + title, + style: TextStyle( + fontWeight: FontWeight.bold, + fontSize: 16, + color: enabled + ? (isDark ? Colors.white : Colors.black87) + : Colors.grey, + ), + ), + Text( + subtitle, + style: TextStyle( + fontSize: 13, + color: isDark ? Colors.white38 : Colors.black38, + ), + ), + ], + ), + ), + trailing ?? Icon( + Icons.arrow_forward_ios, + size: 14, + color: isDark ? Colors.white24 : Colors.black12, + ), + ], + ), + ), + ), + ); + } +} diff --git a/siro_rider/lib/views/home/HomePage/frequentlyQuestionsPage.dart b/siro_rider/lib/views/home/HomePage/frequentlyQuestionsPage.dart new file mode 100644 index 0000000..2a5f06e --- /dev/null +++ b/siro_rider/lib/views/home/HomePage/frequentlyQuestionsPage.dart @@ -0,0 +1,228 @@ +import 'package:siro_rider/views/home/HomePage/contact_us.dart'; +import 'package:flutter/cupertino.dart'; +import 'package:flutter/material.dart'; +import 'package:get/get.dart'; + +class FrequentlyQuestionsPage extends StatelessWidget { + const FrequentlyQuestionsPage({super.key}); + + void _showAnswerDialog(BuildContext context, String question, String answer) { + showCupertinoDialog( + context: context, + builder: (BuildContext context) => CupertinoAlertDialog( + title: Text(question, + style: const TextStyle( + fontWeight: FontWeight.bold, color: Colors.indigo)), + content: Text(answer), + actions: [ + CupertinoDialogAction( + isDefaultAction: true, + onPressed: () { + Navigator.of(context).pop(); + }, + child: const Text('Close'), + ), + ], + ), + ); + } + + @override + Widget build(BuildContext context) { + return CupertinoPageScaffold( + navigationBar: CupertinoNavigationBar( + backgroundColor: Colors.indigo, + middle: Text( + 'Frequently Asked Questions'.tr, + style: const TextStyle(color: Colors.white), + ), + ), + child: SafeArea( + child: ListView( + children: [ + CupertinoListSection.insetGrouped( + header: Text( + 'Getting Started'.tr, + style: const TextStyle(fontWeight: FontWeight.bold), + ), + children: [ + CupertinoListTile( + leading: const Icon( + CupertinoIcons.car_detailed, + color: Colors.indigo, + ), + title: Text('How do I request a ride?'.tr), + trailing: const CupertinoListTileChevron(), + onTap: () => _showAnswerDialog( + context, + 'How do I request a ride?'.tr, + 'Simply open the Intaleq app, enter your destination, and tap "Request Ride". The app will connect you with a nearby driver.' + .tr, + ), + ), + ], + ), + CupertinoListSection.insetGrouped( + header: Text( + 'Vehicle Options'.tr, + style: const TextStyle(fontWeight: FontWeight.bold), + ), + children: [ + CupertinoListTile( + leading: const Icon( + CupertinoIcons.car_fill, + color: Colors.blue, + ), + title: Text('What types of vehicles are available?'.tr), + trailing: const CupertinoListTileChevron(), + onTap: () => _showAnswerDialog( + context, + 'What types of vehicles are available?'.tr, + 'Intaleq offers a variety of options including Economy, Comfort, and Luxury to suit your needs and budget.' + .tr, + ), + ), + ], + ), + CupertinoListSection.insetGrouped( + header: Text( + 'Payments'.tr, + style: const TextStyle(fontWeight: FontWeight.bold), + ), + children: [ + CupertinoListTile( + leading: const Icon( + CupertinoIcons.creditcard, + color: Colors.green, + ), + title: Text('How can I pay for my ride?'.tr), + trailing: const CupertinoListTileChevron(), + onTap: () => _showAnswerDialog( + context, + 'How can I pay for my ride?'.tr, + 'You can pay for your ride using cash or credit/debit card. You can select your preferred payment method before confirming your ride.' + .tr, + ), + ), + ], + ), + CupertinoListSection.insetGrouped( + header: Text( + 'Ride Management'.tr, + style: const TextStyle(fontWeight: FontWeight.bold), + ), + children: [ + CupertinoListTile( + leading: const Icon( + CupertinoIcons.xmark_circle_fill, + color: Colors.red, + ), + title: Text('Can I cancel my ride?'.tr), + trailing: const CupertinoListTileChevron(), + onTap: () => _showAnswerDialog( + context, + 'Can I cancel my ride?'.tr, + 'Yes, you can cancel your ride, but please note that cancellation fees may apply depending on how far in advance you cancel.' + .tr, + ), + ), + ], + ), + CupertinoListSection.insetGrouped( + header: Text( + 'For Drivers'.tr, + style: const TextStyle(fontWeight: FontWeight.bold), + ), + children: [ + CupertinoListTile( + leading: const Icon( + CupertinoIcons.person_crop_circle_fill, + color: Colors.orange, + ), + title: Text('Driver Registration & Requirements'.tr), + trailing: const CupertinoListTileChevron(), + onTap: () => showCupertinoDialog( + context: context, + builder: (BuildContext context) => CupertinoAlertDialog( + title: Text('Driver Registration'.tr, + style: const TextStyle( + fontWeight: FontWeight.bold, + color: Colors.indigo)), + content: Text( + 'To register as a driver or learn about the requirements, please visit our website or contact Intaleq support directly.' + .tr), + actions: [ + CupertinoDialogAction( + isDefaultAction: true, + onPressed: () { + Get.to(() => ContactUsPage()); + // Optionally, you can open a URL here + }, + child: Text('Visit Website/Contact Support'.tr), + ), + CupertinoDialogAction( + onPressed: () { + Navigator.of(context).pop(); + }, + child: Text('Close'.tr), + ), + ], + ), + ), + ), + ], + ), + CupertinoListSection.insetGrouped( + header: Text( + 'Communication'.tr, + style: const TextStyle(fontWeight: FontWeight.bold), + ), + children: [ + CupertinoListTile( + leading: const Icon( + CupertinoIcons.chat_bubble_2_fill, + color: Colors.purple, + ), + title: Text( + 'How do I communicate with the other party (passenger/driver)?' + .tr), + trailing: const CupertinoListTileChevron(), + onTap: () => _showAnswerDialog( + context, + 'How do I communicate with the other party (passenger/driver)?' + .tr, + 'You can communicate with your driver or passenger through the in-app chat feature once a ride is confirmed.' + .tr, + ), + ), + ], + ), + CupertinoListSection.insetGrouped( + header: Text( + 'Safety & Security'.tr, + style: const TextStyle(fontWeight: FontWeight.bold), + ), + children: [ + CupertinoListTile( + leading: const Icon( + CupertinoIcons.shield_fill, + color: Colors.teal, + ), + title: Text('What safety measures does Intaleq offer?'.tr), + trailing: const CupertinoListTileChevron(), + onTap: () => _showAnswerDialog( + context, + 'What safety measures does Intaleq offer?'.tr, + 'Intaleq offers various safety features including driver verification, in-app trip tracking, emergency contact options, and the ability to share your trip status with trusted contacts.' + .tr, + ), + ), + ], + ), + const SizedBox(height: 20), // Add some bottom padding + ], + ), + ), + ); + } +} diff --git a/siro_rider/lib/views/home/HomePage/share_app_page.dart b/siro_rider/lib/views/home/HomePage/share_app_page.dart new file mode 100644 index 0000000..ca97f21 --- /dev/null +++ b/siro_rider/lib/views/home/HomePage/share_app_page.dart @@ -0,0 +1,577 @@ +import 'package:flutter/cupertino.dart'; +import 'package:flutter/material.dart'; +import 'package:get/get.dart'; + +import '../../../constant/colors.dart'; +import '../../../constant/style.dart'; +import '../../../controller/home/profile/invit_controller.dart'; +import '../../../print.dart'; + +class ShareAppPage extends StatelessWidget { + final InviteController controller = Get.put(InviteController()); + + @override + Widget build(BuildContext context) { + return Scaffold( + backgroundColor: AppColor.secondaryColor, + appBar: AppBar( + backgroundColor: AppColor.secondaryColor, + elevation: 0, + title: Text( + 'Invite'.tr, + style: AppStyle.headTitle2.copyWith(fontSize: 20), + ), + leading: IconButton( + icon: Icon(Icons.arrow_back_ios, color: AppColor.cyanBlue), + onPressed: () => Get.back(), + ), + ), + body: SafeArea( + child: GetBuilder( + builder: (controller) { + return Column( + children: [ + Expanded( + child: SingleChildScrollView( + padding: const EdgeInsets.all(16), + child: _buildPassengerTab(context), + ), + ), + ], + ); + }, + ), + ), + ); + } + + Widget _buildPassengerTab(BuildContext context) { + return Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Container( + padding: const EdgeInsets.all(16), + decoration: BoxDecoration( + color: AppColor.grayColor.withOpacity(0.08), + borderRadius: BorderRadius.circular(12), + ), + child: Column( + children: [ + Text( + "Share this code with your friends and earn rewards when they use it!" + .tr, + textAlign: TextAlign.center, + style: TextStyle( + color: AppColor.grayColor, + fontSize: 13, + ), + ), + ], + ), + ), + const SizedBox(height: 20), + _buildPhoneInput(), + const SizedBox(height: 20), + _buildActionButtonsPassengers(), + const SizedBox(height: 20), + const SizedBox(height: 20), + _buildInvitationsListPassengers(context), + ], + ); + } + + // Widget _buildPhoneInput() { + // return Container( + // decoration: BoxDecoration( + // color: CupertinoColors.systemGrey6, + // borderRadius: BorderRadius.circular(8), + // ), + // child: Row( + // children: [ + // Expanded( + // child: CupertinoTextField.borderless( + // controller: controller.invitePhoneController, + // placeholder: 'Enter phone'.tr, + // padding: const EdgeInsets.all(12), + // keyboardType: TextInputType.phone, + // ), + // ), + // CupertinoButton( + // child: const Icon(CupertinoIcons.person_badge_plus, + // color: AppColor.blueColor), + // onPressed: () async { + // await controller.pickContacts(); + // if (controller.contacts.isNotEmpty) { + // if (box.read(BoxName.isSavedPhones) == null) { + // controller.savePhoneToServer(); + // box.write(BoxName.isSavedPhones, true); + // } + // _showContactsDialog(Get.context!); + // } + // }, + // ), + // ], + // ), + // ); + // } + Widget _buildPhoneInput() { + return Container( + decoration: BoxDecoration( + color: AppColor.grayColor.withOpacity(0.1), + borderRadius: BorderRadius.circular(12), + border: Border.all(color: AppColor.grayColor.withOpacity(0.1)), + ), + child: Row( + children: [ + Expanded( + child: CupertinoTextField.borderless( + controller: controller.invitePhoneController, + placeholder: 'Enter phone'.tr, + placeholderStyle: TextStyle( + color: AppColor.grayColor.withOpacity(0.5), fontSize: 16), + style: TextStyle(color: AppColor.writeColor, fontSize: 16), + padding: const EdgeInsets.all(14), + keyboardType: TextInputType.phone, + ), + ), + CupertinoButton( + child: Icon(CupertinoIcons.person_badge_plus, + color: AppColor.cyanBlue), + onPressed: () async { + await controller.pickContacts(); + Log.print('contacts: ${controller.contacts}'); + if (controller.contacts.isNotEmpty) { + _showContactsDialog(Get + .context!); // Show contacts dialog after loading contacts + } else { + Get.snackbar( + 'No contacts available'.tr, + 'Please add contacts to your phone.'.tr, + ); + } + }, + ), + ], + ), + ); + } + + Widget _buildActionButtonsPassengers() { + return Padding( + padding: const EdgeInsets.symmetric(vertical: 20.0, horizontal: 16.0), + child: Row( + children: [ + Expanded( + child: Container( + decoration: BoxDecoration( + borderRadius: BorderRadius.circular(10), + boxShadow: [ + BoxShadow( + color: Colors.black.withOpacity(0.1), + blurRadius: 6, + offset: const Offset(0, 3), + ), + ], + ), + child: CupertinoButton( + color: AppColor.primaryColor, + borderRadius: BorderRadius.circular(10), + padding: const EdgeInsets.symmetric(vertical: 14), + onPressed: controller.sendInviteToPassenger, + child: Text( + 'Send Invite'.tr, + style: TextStyle( + fontSize: 16, + fontWeight: FontWeight.bold, + color: AppColor.secondaryColor, + ), + ), + ), + ), + ), + const SizedBox(width: 16), + Expanded( + child: Container( + decoration: BoxDecoration( + borderRadius: BorderRadius.circular(10), + boxShadow: [ + BoxShadow( + color: Colors.black.withOpacity(0.1), + blurRadius: 6, + offset: const Offset(0, 3), + ), + ], + ), + child: CupertinoButton( + color: AppColor.cyanBlue, + borderRadius: BorderRadius.circular(10), + padding: const EdgeInsets.symmetric(vertical: 14), + child: Text( + 'Show Invitations'.tr, + style: TextStyle( + fontSize: 16, + fontWeight: FontWeight.bold, + color: AppColor.secondaryColor, + ), + ), + onPressed: () async { + controller.fetchDriverStatsPassengers(); + }, + ), + ), + ), + ], + ), + ); + } + + Widget _buildInvitationsListPassengers(BuildContext context) { + return SizedBox( + height: Get.height * .4, + child: controller.driverInvitationDataToPassengers.isEmpty + ? Center( + child: Text( + "No invitation found yet!".tr, + style: TextStyle( + color: AppColor.grayColor, + fontSize: 17, + ), + ), + ) + : ListView.builder( + itemCount: controller.driverInvitationDataToPassengers.length, + itemBuilder: (context, index) { + return _buildInvitationItemPassengers(context, index); + }, + ), + ); + } + + Widget _buildInvitationItemPassengers(BuildContext context, int index) { + // Extracting the data from the sample JSON-like structure + var invitation = controller.driverInvitationDataToPassengers[index]; + + int countOfInvitDriver = + int.tryParse(invitation['countOfInvitDriver']?.toString() ?? '0') ?? 0; + double progressValue = (countOfInvitDriver / 10.0).clamp(0.0, 1.0); + + return GestureDetector( + onTap: () { + controller.onSelectPassengerInvitation(index); + }, + child: Container( + margin: const EdgeInsets.symmetric(vertical: 8.0), + padding: const EdgeInsets.all(16), + decoration: BoxDecoration( + color: AppColor.grayColor.withOpacity(0.08), + borderRadius: BorderRadius.circular(12), + border: Border.all(color: AppColor.grayColor.withOpacity(0.05)), + ), + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Text( + invitation['passengerName'] + .toString(), // Handle null or missing data + style: TextStyle( + fontSize: 17, + fontWeight: FontWeight.w600, + color: AppColor.writeColor, + ), + ), + const SizedBox(height: 8), + ClipRRect( + borderRadius: BorderRadius.circular(4), + child: LinearProgressIndicator( + value: progressValue, + backgroundColor: AppColor.grayColor.withOpacity(0.1), + valueColor: + AlwaysStoppedAnimation(AppColor.primaryColor), + minHeight: 6, + ), + ), + const SizedBox(height: 4), + Text( + '$countOfInvitDriver / 2 ${'Trip'.tr}', // Show trips completed + style: TextStyle( + fontSize: 13, + color: AppColor.grayColor, + ), + ), + ], + ), + ), + ); + } + + Widget _buildPassengerStats(BuildContext context) { + return Container( + padding: const EdgeInsets.all(16), + decoration: BoxDecoration( + color: AppColor.grayColor.withOpacity(0.08), + borderRadius: BorderRadius.circular(12), + border: Border.all(color: AppColor.grayColor.withOpacity(0.05)), + ), + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Text( + "Your Rewards".tr, + style: TextStyle( + fontSize: 17, + fontWeight: FontWeight.w600, + color: AppColor.writeColor, + ), + ), + const SizedBox(height: 16), + _buildStatItem( + context, + "Total Invites".tr, + controller.driverInvitationDataToPassengers[0]['countOfInvitDriver'] + .toString(), + ), + _buildStatItem( + context, + "Active Users".tr, + controller.driverInvitationDataToPassengers[0]['passengerName'] + .toString(), + ), + ], + ), + ); + } + + Widget _buildStatItem(BuildContext context, String label, String value) { + return Padding( + padding: const EdgeInsets.symmetric(vertical: 8.0), + child: Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + Text( + label, + style: TextStyle( + color: AppColor.writeColor, + fontSize: 15, + ), + ), + Text( + value, + style: const TextStyle( + fontWeight: FontWeight.w600, + color: AppColor.blueColor, + fontSize: 15, + ), + ), + ], + ), + ); + } + + void _showContactsDialog(BuildContext context) { + Get.defaultDialog( + backgroundColor: AppColor.secondaryColor, + title: 'Choose from contact'.tr, + titleStyle: TextStyle(color: AppColor.writeColor), + content: SizedBox( + height: 400, + width: 400, + child: Column( + children: [ + // Header with cancel and title + // Container( + // padding: const EdgeInsets.symmetric(horizontal: 16, vertical: 12), + // decoration: const BoxDecoration( + // borderRadius: BorderRadius.vertical(top: Radius.circular(20)), + // color: CupertinoColors.systemGrey6, + // ), + // child: Row( + // mainAxisAlignment: MainAxisAlignment.spaceBetween, + // children: [ + // CupertinoButton( + // padding: EdgeInsets.zero, + // child: Text( + // 'Cancel'.tr, + // style: const TextStyle(color: CupertinoColors.systemBlue), + // ), + // onPressed: () => Navigator.pop(context), + // ), + // Container( + // child: Text('Choose from contact'.tr, + // style: AppStyle.title)), + // const SizedBox(width: 60), // Balance for Cancel button + // ], + // ), + // ), + + // Contact list + Expanded( + child: ListView.builder( + itemCount: controller.contactMaps.length, + itemBuilder: (context, index) { + final contact = controller.contactMaps[index]; + return CupertinoButton( + padding: EdgeInsets.zero, + onPressed: () { + controller.selectPhone(contact['phones'].toString()); + }, + child: Container( + padding: const EdgeInsets.symmetric( + horizontal: 16, vertical: 12), + decoration: BoxDecoration( + color: AppColor.secondaryColor, + border: Border( + bottom: BorderSide( + color: AppColor.grayColor.withOpacity(0.1), + ), + ), + ), + child: Row( + children: [ + // Display contact name and phone number + Expanded( + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Text( + contact['name'], + style: TextStyle( + color: AppColor.writeColor, + fontSize: 17, + fontWeight: FontWeight.w500, + ), + ), + Text( + (contact['phones'][0].toString()), + style: TextStyle( + color: AppColor.grayColor, + fontSize: 15, + ), + ), + ], + ), + ), + // Chevron icon for selection + Icon( + CupertinoIcons.chevron_forward, + color: AppColor.grayColor.withOpacity(0.5), + ), + ], + ), + ), + ); + }, + ), + ), + ], + ), + ), + ); + // showCupertinoModalPopup( + // context: context, + // builder: (BuildContext context) => Container( + // height: 400, + // decoration: BoxDecoration( + // color: CupertinoColors.systemBackground, + // borderRadius: const BorderRadius.vertical(top: Radius.circular(20)), + // boxShadow: [ + // BoxShadow( + // color: CupertinoColors.black.withOpacity(0.2), + // offset: const Offset(0, -4), + // blurRadius: 10, + // ), + // ], + // ), + // child: Column( + // children: [ + // // Header with cancel and title + // Container( + // padding: const EdgeInsets.symmetric(horizontal: 16, vertical: 12), + // decoration: const BoxDecoration( + // borderRadius: BorderRadius.vertical(top: Radius.circular(20)), + // color: CupertinoColors.systemGrey6, + // ), + // child: Row( + // mainAxisAlignment: MainAxisAlignment.spaceBetween, + // children: [ + // CupertinoButton( + // padding: EdgeInsets.zero, + // child: Text( + // 'Cancel'.tr, + // style: const TextStyle(color: CupertinoColors.systemBlue), + // ), + // onPressed: () => Navigator.pop(context), + // ), + // Container( + // child: Text('Choose from contact'.tr, + // style: AppStyle.title)), + // const SizedBox(width: 60), // Balance for Cancel button + // ], + // ), + // ), + + // // Contact list + // Expanded( + // child: ListView.builder( + // itemCount: controller.contactMaps.length, + // itemBuilder: (context, index) { + // final contact = controller.contactMaps[index]; + // return CupertinoButton( + // padding: EdgeInsets.zero, + // onPressed: () { + // controller.selectPhone(contact['phones'].toString()); + // }, + // child: Container( + // padding: const EdgeInsets.symmetric( + // horizontal: 16, vertical: 12), + // decoration: BoxDecoration( + // color: CupertinoColors.systemBackground, + // border: Border( + // bottom: BorderSide( + // color: CupertinoColors.separator.withOpacity(0.5), + // ), + // ), + // ), + // child: Row( + // children: [ + // // Display contact name and phone number + // Expanded( + // child: Column( + // crossAxisAlignment: CrossAxisAlignment.start, + // children: [ + // Text( + // contact['name'], + // style: const TextStyle( + // color: CupertinoColors.label, + // fontSize: 17, + // fontWeight: FontWeight.w500, + // ), + // ), + // Text( + // controller.formatPhoneNumber( + // contact['phones'][0].toString()), + // style: const TextStyle( + // color: CupertinoColors.secondaryLabel, + // fontSize: 15, + // ), + // ), + // ], + // ), + // ), + // // Chevron icon for selection + // const Icon( + // CupertinoIcons.chevron_forward, + // color: CupertinoColors.systemGrey2, + // ), + // ], + // ), + // ), + // ); + // }, + // ), + // ), + // ], + // ), + // ), + // ); + } +} diff --git a/siro_rider/lib/views/home/HomePage/trip_monitor/trip_link_monitor.dart b/siro_rider/lib/views/home/HomePage/trip_monitor/trip_link_monitor.dart new file mode 100644 index 0000000..09ea4cf --- /dev/null +++ b/siro_rider/lib/views/home/HomePage/trip_monitor/trip_link_monitor.dart @@ -0,0 +1,90 @@ +import 'dart:io'; +import 'package:siro_rider/controller/home/trip_monitor_controller.dart'; +import 'package:siro_rider/env/env.dart'; +import 'package:siro_rider/views/widgets/my_scafold.dart'; +import 'package:flutter/material.dart'; +import 'package:flutter/services.dart'; +import 'package:get/get.dart'; +import 'package:intaleq_maps/intaleq_maps.dart'; +import 'package:vibration/vibration.dart'; + +import '../../../../constant/colors.dart'; +import '../../../../constant/style.dart'; +import '../../../widgets/elevated_btn.dart'; + +class TripMonitor extends StatelessWidget { + const TripMonitor({super.key}); + + @override + Widget build(BuildContext context) { + final params = Get.parameters; + // Use params to initialize your controller or pass data + Get.put(TripMonitorController()).init(); + return GetBuilder(builder: (tripMonitorController) { + return MyScafolld( + title: 'Trip Monitor'.tr, + body: [ + IntaleqMap( + apiKey: Env.mapSaasKey, + onMapCreated: tripMonitorController.onMapCreated, + onStyleLoaded: tripMonitorController.onStyleLoaded, + initialCameraPosition: CameraPosition( + target: tripMonitorController.parentLocation, + zoom: 16, + tilt: 40, + ), + markers: tripMonitorController.markers, + ), + speedCircle() + ], + isleading: true, + ); + }); + } +} + +GetBuilder speedCircle() { + if (Get.find().speed > 100) { + if (Platform.isIOS) { + HapticFeedback.selectionClick(); + } else { + Vibration.vibrate(duration: 1000); + } + Get.defaultDialog( + barrierDismissible: false, + titleStyle: AppStyle.title, + title: 'Speed Over'.tr, + middleText: 'Please slow down'.tr, + middleTextStyle: AppStyle.title, + confirm: MyElevatedButton( + title: 'I will slow down'.tr, + onPressed: () => Get.back(), + ), + ); + } + return GetBuilder( + builder: (tripMonitorController) { + return Positioned( + bottom: 25, + right: 100, + child: Container( + decoration: BoxDecoration( + shape: BoxShape.circle, + color: tripMonitorController.speed > 100 + ? Colors.red + : AppColor.secondaryColor, + border: Border.all(width: 3, color: AppColor.redColor), + ), + height: 60, + width: 60, + child: Center( + child: Text( + tripMonitorController.speed.toStringAsFixed(0), + style: AppStyle.number, + ), + ), + ), + ); + }, + ); +} diff --git a/siro_rider/lib/views/home/HomePage/trip_monitor/trip_monitor.dart b/siro_rider/lib/views/home/HomePage/trip_monitor/trip_monitor.dart new file mode 100644 index 0000000..dd6bb2a --- /dev/null +++ b/siro_rider/lib/views/home/HomePage/trip_monitor/trip_monitor.dart @@ -0,0 +1,97 @@ +import 'dart:io'; + +import 'package:siro_rider/controller/home/trip_monitor_controller.dart'; +import 'package:siro_rider/env/env.dart'; +import 'package:siro_rider/views/widgets/my_scafold.dart'; +import 'package:flutter/material.dart'; +import 'package:flutter/services.dart'; +import 'package:get/get.dart'; +import 'package:intaleq_maps/intaleq_maps.dart'; +import 'package:vibration/vibration.dart'; + +import '../../../../constant/colors.dart'; +import '../../../../constant/style.dart'; +import '../../../widgets/elevated_btn.dart'; + +class TripMonitor extends StatelessWidget { + const TripMonitor({super.key}); + + @override + Widget build(BuildContext context) { + final params = Get.parameters; + final arguments = Get.arguments as Map?; + + // Use params or arguments to initialize your controller + final controller = Get.put(TripMonitorController()); + controller.init( + rideId: params['rideId'] ?? arguments?['rideId'], + driverId: params['driverId'] ?? arguments?['driverId'], + ); + return GetBuilder(builder: (tripMonitorController) { + return MyScafolld( + title: 'Trip Monitor'.tr, + body: [ + IntaleqMap( + apiKey: Env.mapSaasKey, + onMapCreated: tripMonitorController.onMapCreated, + onStyleLoaded: controller.onStyleLoaded, + initialCameraPosition: CameraPosition( + target: tripMonitorController.parentLocation, + zoom: 16, + tilt: 40, + ), + markers: tripMonitorController.markers, + ), + speedCircle() + ], + isleading: true, + ); + }); + } +} + +GetBuilder speedCircle() { + if (Get.find().speed > 100) { + if (Platform.isIOS) { + HapticFeedback.selectionClick(); + } else { + Vibration.vibrate(duration: 1000); + } + Get.defaultDialog( + barrierDismissible: false, + titleStyle: AppStyle.title, + title: 'Speed Over'.tr, + middleText: 'Please slow down'.tr, + middleTextStyle: AppStyle.title, + confirm: MyElevatedButton( + title: 'I will slow down'.tr, + onPressed: () => Get.back(), + ), + ); + } + return GetBuilder( + builder: (tripMonitorController) { + return Positioned( + bottom: 25, + right: 100, + child: Container( + decoration: BoxDecoration( + shape: BoxShape.circle, + color: tripMonitorController.speed > 100 + ? Colors.red + : AppColor.secondaryColor, + border: Border.all(width: 3, color: AppColor.redColor), + ), + height: 60, + width: 60, + child: Center( + child: Text( + tripMonitorController.speed.toStringAsFixed(0), + style: AppStyle.number, + ), + ), + ), + ); + }, + ); +} diff --git a/siro_rider/lib/views/home/HomePage/trip_record_page.dart b/siro_rider/lib/views/home/HomePage/trip_record_page.dart new file mode 100644 index 0000000..3f965fe --- /dev/null +++ b/siro_rider/lib/views/home/HomePage/trip_record_page.dart @@ -0,0 +1,263 @@ +import 'package:flutter/material.dart'; +import 'package:get/get.dart'; +import 'package:path/path.dart' as path; +import 'package:share_plus/share_plus.dart'; + +import '../../../controller/functions/audio_record1.dart'; + +class TripsRecordedPage extends StatelessWidget { + const TripsRecordedPage({super.key}); + + @override + Widget build(BuildContext context) { + // Ensure the controller is available. + // If it's not initialized elsewhere, you can use Get.put() or Get.lazyPut() here. + // Get.lazyPut(() => AudioRecorderController()); + + return Scaffold( + appBar: AppBar( + title: Text('Trips recorded'.tr), + backgroundColor: Colors.white, + elevation: 1, + actions: [ + GetBuilder( + builder: (controller) => IconButton( + tooltip: 'Delete All'.tr, + icon: const Icon(Icons.delete_sweep_outlined), + onPressed: () { + _showDeleteConfirmation(context, controller, isDeleteAll: true); + }, + ), + ) + ], + ), + body: GetBuilder( + builder: (controller) { + return Column( + children: [ + Expanded( + child: _buildRecordingsList(controller), + ), + // Show player controls only when a file is selected + if (controller.selectedFilePath != null) + _buildPlayerControls(context, controller), + ], + ); + }, + ), + ); + } + + /// Builds the list of recorded audio files. + Widget _buildRecordingsList(AudioRecorderController controller) { + return FutureBuilder>( + future: controller.getRecordedFiles(), + builder: (context, snapshot) { + if (snapshot.connectionState == ConnectionState.waiting) { + return const Center(child: CircularProgressIndicator()); + } + if (snapshot.hasError) { + return Center(child: Text('Error: ${snapshot.error}'.tr)); + } + if (!snapshot.hasData || snapshot.data!.isEmpty) { + return Center( + child: Column( + mainAxisAlignment: MainAxisAlignment.center, + children: [ + Icon(Icons.mic_off_outlined, size: 80, color: Colors.grey[400]), + const SizedBox(height: 16), + Text( + 'No Recordings Found'.tr, + style: TextStyle(fontSize: 18, color: Colors.grey[600]), + ), + const SizedBox(height: 8), + Padding( + padding: const EdgeInsets.symmetric(horizontal: 40.0), + child: Text( + 'Record your trips to see them here.'.tr, + textAlign: TextAlign.center, + style: TextStyle(color: Colors.grey[500]), + ), + ), + ], + ), + ); + } + + final recordedFiles = snapshot.data!; + return ListView.builder( + padding: const EdgeInsets.only(top: 8, bottom: 8), + itemCount: recordedFiles.length, + itemBuilder: (context, index) { + final file = recordedFiles[index]; + final fileName = path.basename(file); + final isSelected = controller.selectedFilePath == file; + + return Card( + margin: const EdgeInsets.symmetric(horizontal: 16, vertical: 6), + elevation: isSelected ? 4 : 1, + shape: RoundedRectangleBorder( + borderRadius: BorderRadius.circular(12)), + child: ListTile( + leading: Icon( + isSelected && controller.isPlaying + ? Icons.pause_circle_filled + : Icons.play_circle_fill, + color: + isSelected ? Theme.of(context).primaryColor : Colors.grey, + size: 40, + ), + title: Text(fileName, + style: const TextStyle(fontWeight: FontWeight.w500)), + subtitle: Text("Audio Recording".tr), + onTap: () { + if (isSelected) { + controller.isPlaying + ? controller.pausePlayback() + : controller.resumePlayback(); + } else { + controller.playRecordedFile(file); + } + }, + selected: isSelected, + selectedTileColor: + Theme.of(context).primaryColor.withOpacity(0.1), + shape: RoundedRectangleBorder( + borderRadius: BorderRadius.circular(12)), + ), + ); + }, + ); + }, + ); + } + + /// Builds the player UI at the bottom of the screen. + Widget _buildPlayerControls( + BuildContext context, AudioRecorderController controller) { + final fileName = path.basename(controller.selectedFilePath!); + final positionText = Duration(seconds: controller.currentPosition.toInt()) + .toString() + .split('.') + .first + .padLeft(8, '0') + .substring(3); + final durationText = Duration(seconds: controller.totalDuration.toInt()) + .toString() + .split('.') + .first + .padLeft(8, '0') + .substring(3); + + return Material( + elevation: 10, + child: Container( + padding: const EdgeInsets.symmetric(vertical: 12.0, horizontal: 16.0), + child: Column( + mainAxisSize: MainAxisSize.min, + children: [ + Text(fileName, + style: + const TextStyle(fontWeight: FontWeight.bold, fontSize: 16), + textAlign: TextAlign.center), + const SizedBox(height: 8), + Row( + children: [ + Text(positionText), + Expanded( + child: Slider( + value: (controller.totalDuration > 0) + ? controller.currentPosition / controller.totalDuration + : 0.0, + onChanged: (value) { + final newPosition = value * controller.totalDuration; + controller.audioPlayer + .seek(Duration(seconds: newPosition.toInt())); + }, + ), + ), + Text(durationText), + ], + ), + Row( + mainAxisAlignment: MainAxisAlignment.spaceEvenly, + children: [ + IconButton( + icon: const Icon(Icons.share_outlined), + tooltip: 'Share'.tr, + onPressed: () { + Share.shareXFiles([XFile(controller.selectedFilePath!)]); + }, + iconSize: 28, + ), + IconButton( + icon: Icon(controller.isPlaying + ? Icons.pause_circle_filled + : Icons.play_circle_filled), + onPressed: () { + controller.isPlaying + ? controller.pausePlayback() + : controller.resumePlayback(); + }, + iconSize: 56, + color: Theme.of(context).primaryColor, + ), + IconButton( + icon: + const Icon(Icons.delete_outline, color: Colors.redAccent), + tooltip: 'Delete'.tr, + onPressed: () { + _showDeleteConfirmation(context, controller, + isDeleteAll: false); + }, + iconSize: 28, + ), + ], + ) + ], + ), + ), + ); + } + + /// Shows a confirmation dialog for deleting one or all files. + void _showDeleteConfirmation( + BuildContext context, + AudioRecorderController controller, { + required bool isDeleteAll, + }) { + showDialog( + context: context, + builder: (BuildContext context) { + return AlertDialog( + title: Text(isDeleteAll + ? 'Delete All Recordings?'.tr + : 'Delete Recording?'.tr), + content: Text(isDeleteAll + ? 'This action cannot be undone.'.tr + : 'Are you sure you want to delete this file?'.tr), + actions: [ + TextButton( + child: Text('Cancel'.tr), + onPressed: () => Navigator.of(context).pop(), + ), + TextButton( + child: + Text('Delete'.tr, style: const TextStyle(color: Colors.red)), + onPressed: () async { + if (isDeleteAll) { + await controller.deleteAllRecordedFiles(); + } else { + // NOTE: You may need to add this method to your controller + // if it doesn't exist. + // await controller.deleteFile(controller.selectedFilePath!); + } + Navigator.of(context).pop(); + }, + ), + ], + ); + }, + ); + } +} diff --git a/siro_rider/lib/views/home/drawer_menu_page.dart b/siro_rider/lib/views/home/drawer_menu_page.dart new file mode 100644 index 0000000..451025a --- /dev/null +++ b/siro_rider/lib/views/home/drawer_menu_page.dart @@ -0,0 +1,25 @@ +import 'package:flutter/material.dart'; +import 'package:siro_rider/constant/colors.dart'; + +class DrawerMenuPage extends StatelessWidget { + const DrawerMenuPage({super.key}); + + @override + Widget build(BuildContext context) { + return Container( + height: 500, + color: AppColor.secondaryColor.withOpacity(.5), + child: Column( + children: [ + Container( + height: 100, + color: AppColor.secondaryColor, + ), + Container( + color: Colors.transparent, + ) + ], + ), + ); + } +} diff --git a/siro_rider/lib/views/home/map_page_passenger.dart b/siro_rider/lib/views/home/map_page_passenger.dart new file mode 100644 index 0000000..6bbbb10 --- /dev/null +++ b/siro_rider/lib/views/home/map_page_passenger.dart @@ -0,0 +1,204 @@ +import 'package:flutter/material.dart'; +import 'package:get/get.dart'; +import '../../constant/box_name.dart'; +import '../../constant/colors.dart'; +import '../../controller/functions/crud.dart'; +import '../../controller/home/map/map_socket_controller.dart'; +import '../../controller/home/map/map_engine_controller.dart'; +import '../../controller/home/map/location_search_controller.dart'; +import '../../controller/home/map/nearby_drivers_controller.dart'; +import '../../controller/home/map/ride_lifecycle_controller.dart'; +import '../../controller/home/map/ui_interactions_controller.dart'; +import '../../controller/home/map/ride_state.dart'; +import '../../main.dart'; +import '../../views/home/map_widget.dart/ride_begin_passenger.dart'; + +import '../../controller/home/menu_controller.dart'; +import 'map_widget.dart/apply_order_widget.dart'; +import 'map_widget.dart/buttom_sheet_map_show.dart'; +import 'map_widget.dart/car_details_widget_to_go.dart'; +import 'map_widget.dart/cash_confirm_bottom_page.dart'; +import 'map_widget.dart/google_map_passenger_widget.dart'; +import 'map_widget.dart/left_main_menu_icons.dart'; +import 'map_widget.dart/main_bottom_menu_map.dart'; +import 'map_widget.dart/map_menu_widget.dart'; +import '../../controller/functions/package_info.dart'; +import 'map_widget.dart/passengerRideLoctionWidget.dart'; +import 'map_widget.dart/payment_method.page.dart'; +import 'map_widget.dart/points_page_for_rider.dart'; +import 'map_widget.dart/ride_from_start_app.dart'; +import 'map_widget.dart/searching_captain_window.dart'; +import 'map_widget.dart/vip_begin.dart'; + +class MapPagePassenger extends StatelessWidget { + const MapPagePassenger({super.key}); + + @override + Widget build(BuildContext context) { + Get.find(); + Get.find(); + Get.find(); + Get.find(); + Get.find(); + Get.find(); + Get.find(); + Get.find(); + WidgetsBinding.instance.addPostFrameCallback((_) { + checkForUpdate(context); + }); + + return Scaffold( + body: SafeArea( + bottom: true, + child: Stack( + children: [ + GoogleMapPassengerWidget(), + // OsmMapPassengerWidget(), + leftMainMenuIcons(), + // PaymobPackage(), + const PickerIconOnMap(), + // PickerAnimtionContainerFormPlaces(), + const MainBottomMenuMap(), + // NewMainBottomSheet(), + + buttomSheetMapPage(), + CarDetailsTypeToChoose(), + // const HeaderDestination(), + const BurcMoney(), + // const PromoCode(), + ApplyOrderWidget(), + const MapMenuWidget(), + // hexagonClipper(), + const CancelRidePageShow(), + CashConfirmPageShown(), + const PaymentMethodPage(), + const SearchingCaptainWindow(), + AttributionMap(), + // timerForCancelTripFromPassenger(), + // const DriverTimeArrivePassengerPage(), + // const TimerToPassengerFromDriver(), + const PassengerRideLocationWidget(), + const RideBeginPassenger(), + const VipRideBeginPassenger(), + const RideFromStartApp(), + + // cancelRidePage(), + // const MenuIconMapPageWidget(), + PointsPageForRider() + ], + ), + ), + ); + } +} + +class AttributionMap extends StatelessWidget { + const AttributionMap({ + super.key, + }); + + @override + Widget build(BuildContext context) { + return Positioned( + left: 4, + bottom: 20, + child: RotatedBox( + quarterTurns: 0, // يخلي النص عمودي (من تحت لفوق) + child: Opacity( + opacity: 0.7, + child: Text( + "Intaleq Maps", + // "Intaleq Maps • © OpenStreetMap contributors", + style: TextStyle( + fontSize: 10, + color: Colors.grey[700], + fontWeight: FontWeight.w400, + ), + ), + ), + ), + ); + } +} + +class CancelRidePageShow extends StatelessWidget { + const CancelRidePageShow({ + super.key, + }); + + @override + Widget build(BuildContext context) { + return GetBuilder( + builder: (controller) { + // نستخدم RideState Enum لأنه أدق، أو نصلح المنطق النصي + // الشرط: + // 1. يوجد خط مسار + // 2. الحالة ليست "بدأت" + // 3. الحالة ليست "انتهت" + // 4. الحالة ليست "قيد التنفيذ" (لزيادة التأكيد) + + // bool showCancelButton = controller.polyLines.isNotEmpty && + // controller.statusRide != 'Begin' && // استخدمنا && + // controller.statusRide != 'inProgress' && + // controller.statusRide != 'Finished'; + + // يمكنك أيضاً استخدام RideState ليكون أدق: + bool showCancelButton = controller.polyLines.isNotEmpty && + controller.currentRideState.value != RideState.inProgress && + controller.currentRideState.value != RideState.finished; + + return showCancelButton + ? Positioned( + right: box.read(BoxName.lang) != 'ar' ? 10 : null, + left: box.read(BoxName.lang) == 'ar' ? 10 : null, + top: Get.height * .013, + child: GestureDetector( + onTap: () { + // استدعاء دالة الإلغاء + controller.changeCancelRidePageShow(); + // ملاحظة: تأكد أن الدالة تظهر ديالوج للتأكيد أولاً ولا تلغي فوراً + }, + child: Container( + decoration: BoxDecoration( + color: AppColor.redColor, + borderRadius: BorderRadius.circular(15)), + child: Padding( + padding: const EdgeInsets.all(3), + child: Icon( + Icons.clear, + size: 40, + color: AppColor.secondaryColor, + ), + ), + ), + )) + : const SizedBox(); + }, + ); + } +} + +class PickerIconOnMap extends StatelessWidget { + const PickerIconOnMap({ + super.key, + }); + + @override + Widget build(BuildContext context) { + return GetBuilder( + builder: (controller) => controller.isPickerShown + ? Positioned( + bottom: Get.height * .2, + top: 0, + left: 0, + right: 0, + child: controller.isPickerShown + ? const Icon( + Icons.add_location, + color: Colors.purple, + ) + : const SizedBox(), + ) + : const SizedBox()); + } +} diff --git a/siro_rider/lib/views/home/map_widget.dart/apply_order_widget.dart b/siro_rider/lib/views/home/map_widget.dart/apply_order_widget.dart new file mode 100644 index 0000000..8168f4f --- /dev/null +++ b/siro_rider/lib/views/home/map_widget.dart/apply_order_widget.dart @@ -0,0 +1,731 @@ +import 'package:siro_rider/constant/colors.dart'; +import 'package:siro_rider/constant/links.dart'; +import 'package:siro_rider/constant/style.dart'; +import 'package:siro_rider/controller/home/map/ride_lifecycle_controller.dart'; +import 'package:siro_rider/controller/home/map/ride_state.dart'; +import 'package:siro_rider/controller/voice_call_controller.dart'; +import 'package:flutter/material.dart'; +import 'package:flutter/services.dart'; +import 'package:get/get.dart'; +import 'package:intl/intl.dart'; + +import '../../../constant/box_name.dart'; +import '../../../controller/firebase/notification_service.dart'; +import '../../../controller/functions/launch.dart'; +import '../../../controller/functions/crud.dart'; +import '../../../main.dart'; + +class ApplyOrderWidget extends StatelessWidget { + const ApplyOrderWidget({super.key}); + + @override + Widget build(BuildContext context) { + Color parseColor(String colorHex) { + if (colorHex.isEmpty) return Colors.grey; + try { + String processedHex = colorHex.replaceFirst('#', '').trim(); + if (processedHex.length == 6) processedHex = 'FF$processedHex'; + return Color(int.parse('0x$processedHex')); + } catch (e) { + return Colors.grey; + } + } + + return Obx(() { + final controller = Get.find(); + + final bool isVisible = + controller.currentRideState.value == RideState.driverApplied || + controller.currentRideState.value == RideState.driverArrived; + + return AnimatedPositioned( + duration: const Duration(milliseconds: 500), + curve: Curves.elasticOut, + // تغيير: جعلنا الإخفاء للأسفل أقل حدة ليكون التحريك أسرع + bottom: isVisible ? 0 : -400, + left: 0, + right: 0, + child: Container( + decoration: BoxDecoration( + color: Theme.of(context).cardColor, + borderRadius: const BorderRadius.vertical(top: Radius.circular(25)), + boxShadow: [ + BoxShadow( + blurRadius: 20, + spreadRadius: 1, + color: Colors.black.withOpacity(0.1), + offset: const Offset(0, -3), + ) + ], + ), + // تغيير: تقليل الحواف الخارجية بشكل كبير + padding: const EdgeInsets.fromLTRB(16, 8, 16, 16), + child: GetBuilder( + builder: (c) { + return Column( + mainAxisSize: + MainAxisSize.min, // مهم جداً: يأخذ أقل مساحة ممكنة + children: [ + // مقبض صغير + Container( + width: 40, + height: 4, + decoration: BoxDecoration( + color: Colors.grey.withOpacity(0.3), + borderRadius: BorderRadius.circular(10), + ), + ), + const SizedBox(height: 10), // تقليل المسافة + + // 1. [تغيير جوهري] دمج السعر مع الحالة في صف واحد لتوفير المساحة + _buildCompactHeaderRow(context, c), + + const SizedBox(height: 10), // مسافة مضغوطة + + // 2. كرت المعلومات المضغوط + _buildCompactInfoCard(context, c, parseColor), + + const SizedBox(height: 10), // مسافة مضغوطة + + // 3. أزرار الاتصال (Slim) + _buildCompactButtonsRow(context, c), + + const SizedBox(height: 10), // مسافة مضغوطة + + // 4. شريط الوقت + c.currentRideState.value == RideState.driverArrived + ? const DriverArrivePassengerAndWaitMinute() + : const TimeDriverToPassenger(), + ], + ); + }, + ), + ), + ); + }); + } + + // --------------------------------------------------------------------------- + // [NEW] 1. صف الرأس المضغوط (يحتوي الحالة + الإحصائيات + السعر) + // --------------------------------------------------------------------------- + Widget _buildCompactHeaderRow( + BuildContext context, RideLifecycleController controller) { + // تنسيق السعر + final formatter = NumberFormat("#,###"); + String formattedPrice = formatter.format(controller.totalPassenger); + + // حساب الدقائق من الوقت المتبقي الحي، وليس ETA الأصلي فقط. + final int secondsToPassenger = + controller.remainingTimeToPassengerFromDriverAfterApplied > 0 + ? controller.remainingTimeToPassengerFromDriverAfterApplied + : controller.timeToPassengerFromDriverAfterApplied; + final int minutes = + secondsToPassenger <= 0 ? 0 : (secondsToPassenger / 60).ceil(); + + // تنسيق المسافة + String distanceDisplay = ""; + try { + double distMeters = double.parse(controller.distanceByPassenger); + if (distMeters >= 1000) { + distanceDisplay = "${(distMeters / 1000).toStringAsFixed(1)} km"; + } else { + distanceDisplay = "${distMeters.toInt()} m"; + } + } catch (e) { + distanceDisplay = controller.distanceByPassenger; + } + + return Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + crossAxisAlignment: CrossAxisAlignment.center, + children: [ + // القسم الأيسر: الحالة + Chips + Expanded( + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Text( + 'Driver is on the way'.tr, + style: AppStyle.subtitle.copyWith( + color: Colors.grey[600], + fontWeight: FontWeight.w600, + fontSize: 13, // تصغير الخط + ), + ), + const SizedBox(height: 6), + Row( + children: [ + _buildMiniStatChip( + icon: Icons.access_time_filled_rounded, + text: minutes > 0 ? "$minutes ${'min'.tr}" : "--", + color: AppColor.primaryColor, + bgColor: AppColor.primaryColor.withOpacity(0.1), + ), + const SizedBox(width: 8), + _buildMiniStatChip( + icon: Icons.near_me_rounded, + text: distanceDisplay, + color: Colors.orange[800]!, + bgColor: Colors.orange.withOpacity(0.1), + ), + ], + ), + ], + ), + ), + + // القسم الأيمن: السعر (كبير وواضح في الزاوية) + Column( + crossAxisAlignment: CrossAxisAlignment.end, + children: [ + Text( + formattedPrice, + style: AppStyle.title.copyWith( + fontSize: 24, // تصغير من 32 إلى 24 + fontWeight: FontWeight.w900, + color: AppColor.primaryColor, + height: 1.0, + ), + ), + Text( + 'SYP'.tr, + style: TextStyle( + fontSize: 12, + fontWeight: FontWeight.bold, + color: Colors.grey[600], + ), + ), + ], + ), + ], + ); + } + + Widget _buildMiniStatChip({ + required IconData icon, + required String text, + required Color color, + required Color bgColor, + }) { + return Container( + padding: const EdgeInsets.symmetric(horizontal: 8, vertical: 4), + decoration: BoxDecoration( + color: bgColor, + borderRadius: BorderRadius.circular(12), + ), + child: Row( + mainAxisSize: MainAxisSize.min, + children: [ + Icon(icon, size: 12, color: color), // تصغير الأيقونة + const SizedBox(width: 4), + Text( + text, + style: TextStyle( + color: color, + fontWeight: FontWeight.bold, + fontSize: 12, // تصغير الخط + ), + ), + ], + ), + ); + } + + // --------------------------------------------------------------------------- + // [MODIFIED] 2. كرت المعلومات المضغوط جداً + // --------------------------------------------------------------------------- + Widget _buildCompactInfoCard(BuildContext context, + RideLifecycleController controller, Color Function(String) parseColor) { + return Container( + // تقليل الحواف الداخلية للكرت + padding: const EdgeInsets.all(10), + decoration: BoxDecoration( + color: Theme.of(context).scaffoldBackgroundColor, + borderRadius: BorderRadius.circular(16), + border: Border.all(color: Colors.grey.withOpacity(0.1)), + ), + child: Column( + children: [ + // الصف العلوي: سائق + سيارة + Row( + children: [ + // صورة السائق (أصغر) + Container( + decoration: BoxDecoration( + shape: BoxShape.circle, + border: Border.all( + color: AppColor.primaryColor.withOpacity(0.2), width: 2), + ), + child: CircleAvatar( + radius: 22, // تصغير من 28 إلى 22 + backgroundColor: Colors.grey[200], + backgroundImage: NetworkImage( + '${AppLink.server}/portrate_captain_image/${controller.driverId}.jpg'), + onBackgroundImageError: (_, __) => + const Icon(Icons.person, color: Colors.grey, size: 20), + ), + ), + + const SizedBox(width: 10), + + // معلومات نصية + Expanded( + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Text( + controller.driverName, + style: const TextStyle( + fontSize: 15, // تصغير الخط + fontWeight: FontWeight.bold, + ), + maxLines: 1, + overflow: TextOverflow.ellipsis, + ), + const SizedBox(height: 2), + Row( + children: [ + const Icon(Icons.star_rounded, + color: Colors.amber, size: 14), + Text( + " ${controller.driverRate} • ${controller.model}", + style: TextStyle( + fontSize: 12, + color: Colors.grey[700], + fontWeight: FontWeight.w500, + ), + maxLines: 1, + overflow: TextOverflow.ellipsis, + ), + ], + ), + ], + ), + ), + + // أيقونة السيارة (أصغر) + _buildMicroCarIcon(controller, parseColor), + ], + ), + + const SizedBox(height: 8), + + // لوحة السيارة (شريط نحيف جداً) + _buildSlimLicensePlate(controller.licensePlate), + ], + ), + ); + } + + Widget _buildMicroCarIcon( + RideLifecycleController controller, Color Function(String) parseColor) { + Color carColor = parseColor(controller.colorHex); + return Container( + height: 40, // تصغير من 50 + width: 40, + decoration: BoxDecoration( + color: carColor.withOpacity(0.1), + borderRadius: BorderRadius.circular(8), + ), + padding: const EdgeInsets.all(4), + child: ColorFiltered( + colorFilter: ColorFilter.mode(carColor, BlendMode.srcIn), + child: Image.asset( + box.read(BoxName.carType) == 'Scooter' || + box.read(BoxName.carType) == 'Pink Bike' + ? 'assets/images/moto.png' + : 'assets/images/car3.png', + fit: BoxFit.contain, + ), + ), + ); + } + + Widget _buildSlimLicensePlate(String plateNumber) { + return Container( + width: double.infinity, + padding: const EdgeInsets.symmetric(vertical: 2, horizontal: 8), + decoration: BoxDecoration( + color: Get.isDarkMode ? Colors.grey[850] : const Color(0xFFF5F5F5), + borderRadius: BorderRadius.circular(6), + border: Border.all( + color: + Get.isDarkMode ? Colors.white10 : Colors.grey.withOpacity(0.3)), + ), + child: Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + Text( + plateNumber, + style: TextStyle( + fontFamily: 'RobotoMono', + fontSize: 18, + fontWeight: FontWeight.w900, + color: AppColor.writeColor, + letterSpacing: 1.5, + ), + ), + Text("SYR", + style: TextStyle( + fontSize: 10, + fontWeight: FontWeight.bold, + color: AppColor.writeColor.withOpacity(0.6))), + ], + ), + ); + } + + // --------------------------------------------------------------------------- + // [MODIFIED] 3. أزرار الاتصال (Slim Buttons) + // --------------------------------------------------------------------------- + Widget _buildCompactButtonsRow( + BuildContext context, RideLifecycleController controller) { + return SizedBox( + height: 40, // تحديد ارتفاع ثابت وصغير للأزرار + child: Row( + children: [ + Expanded( + child: _buildSlimButton( + label: 'Message'.tr, // اختصار الكلمة + icon: Icons.chat_bubble_outline_rounded, + color: AppColor.blueColor, + bgColor: AppColor.blueColor.withOpacity(0.08), + onTap: () => _showContactOptionsDialog(context, controller), + ), + ), + const SizedBox(width: 10), // تقليل المسافة + Expanded( + child: _buildSlimButton( + label: 'Call'.tr, // اختصار الكلمة + icon: Icons.phone_rounded, + color: Colors.white, + bgColor: AppColor.greenColor, + onTap: () { + HapticFeedback.heavyImpact(); + _showCallSelectionDialog(context, controller); + }, + isPrimary: true, + ), + ), + ], + ), + ); + } + + void _showCallSelectionDialog( + BuildContext context, RideLifecycleController controller) { + Get.dialog( + Dialog( + shape: RoundedRectangleBorder(borderRadius: BorderRadius.circular(20)), + child: Padding( + padding: const EdgeInsets.all(20), + child: Column( + mainAxisSize: MainAxisSize.min, + children: [ + Text( + 'Call Options'.tr, + style: AppStyle.title + .copyWith(fontSize: 18, fontWeight: FontWeight.bold), + ), + const SizedBox(height: 10), + Text( + 'Choose how you want to call the driver'.tr, + style: const TextStyle(color: Colors.grey, fontSize: 14), + textAlign: TextAlign.center, + ), + const SizedBox(height: 20), + ListTile( + leading: CircleAvatar( + backgroundColor: AppColor.greenColor.withOpacity(0.1), + child: Icon(Icons.phone_android_rounded, + color: AppColor.greenColor), + ), + title: Text('Standard Call'.tr, + style: const TextStyle(fontWeight: FontWeight.bold)), + subtitle: Text('Uses cellular network'.tr, + style: const TextStyle(fontSize: 12)), + onTap: () { + Get.back(); + makePhoneCall(controller.driverPhone); + }, + ), + const Divider(), + ListTile( + leading: CircleAvatar( + backgroundColor: AppColor.primaryColor.withOpacity(0.1), + child: Icon(Icons.wifi_calling_3_rounded, + color: AppColor.primaryColor), + ), + title: Text('Free Call'.tr, + style: const TextStyle(fontWeight: FontWeight.bold)), + subtitle: Text('Voice call over internet'.tr, + style: const TextStyle(fontSize: 12)), + onTap: () { + Get.back(); + final voiceCtrl = Get.find(); + final passengerId = box.read(BoxName.passengerID).toString(); + voiceCtrl.startCall( + rideIdVal: controller.rideId, + driverId: controller.driverId, + passengerId: passengerId, + remoteNameVal: controller.driverName, + ); + }, + ), + ], + ), + ), + ), + ); + } + + Widget _buildSlimButton({ + required String label, + required IconData icon, + required Color color, + required Color bgColor, + required VoidCallback onTap, + bool isPrimary = false, + }) { + return ElevatedButton( + onPressed: onTap, + style: ElevatedButton.styleFrom( + backgroundColor: bgColor, + foregroundColor: color, + elevation: isPrimary ? 2 : 0, + padding: EdgeInsets.zero, // إزالة الحواشي الداخلية + shape: RoundedRectangleBorder(borderRadius: BorderRadius.circular(10)), + ), + child: Row( + mainAxisAlignment: MainAxisAlignment.center, + children: [ + Icon(icon, size: 18, color: color), // تصغير الأيقونة + const SizedBox(width: 6), + Text( + label, + style: TextStyle( + fontWeight: FontWeight.bold, + fontSize: 14, // تصغير الخط + color: color, + ), + ), + ], + ), + ); + } + + // --- النوافذ المنبثقة للرسائل (نفس الكود السابق مع تحسين بسيط) --- + void _showContactOptionsDialog( + BuildContext context, RideLifecycleController controller) { + Get.bottomSheet( + Container( + padding: const EdgeInsets.all(20), + decoration: BoxDecoration( + color: Theme.of(context).cardColor, + borderRadius: const BorderRadius.vertical(top: Radius.circular(20)), + ), + child: Column( + mainAxisSize: MainAxisSize.min, + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Text('Quick Message'.tr, + style: AppStyle.title.copyWith(fontSize: 16)), + const SizedBox(height: 15), + ..._buildPredefinedMessages(controller), + const Divider(height: 20), + _buildCustomMessageInput(controller, context), + SizedBox(height: MediaQuery.of(context).viewInsets.bottom), + ], + ), + ), + isScrollControlled: true, + ); + } + + List _buildPredefinedMessages(RideLifecycleController controller) { + const messages = [ + 'Hello, I\'m at the agreed-upon location', + 'I\'m waiting for you', + "How much longer will you be?", + ]; + + return messages + .map((message) => Padding( + padding: const EdgeInsets.only(bottom: 8.0), + child: InkWell( + onTap: () { + _sendMessage(controller, message.tr); + Get.back(); + }, + child: Container( + padding: + const EdgeInsets.symmetric(vertical: 10, horizontal: 12), + decoration: BoxDecoration( + color: Colors.grey.withOpacity(0.08), + borderRadius: BorderRadius.circular(8), + border: Border.all(color: Colors.grey.withOpacity(0.1)), + ), + child: Row( + children: [ + Icon(Icons.chat_bubble_outline, + size: 16, color: AppColor.primaryColor), + const SizedBox(width: 10), + Expanded( + child: Text(message.tr, + style: AppStyle.subtitle.copyWith(fontSize: 13))), + ], + ), + ), + ), + )) + .toList(); + } + + Widget _buildCustomMessageInput( + RideLifecycleController controller, BuildContext context) { + return Row( + children: [ + Expanded( + child: Container( + height: 40, + padding: const EdgeInsets.symmetric(horizontal: 12), + decoration: BoxDecoration( + color: Colors.grey.withOpacity(0.08), + borderRadius: BorderRadius.circular(20), + ), + child: Form( + key: controller.messagesFormKey, + child: TextFormField( + controller: controller.messageToDriver, + decoration: InputDecoration( + hintText: 'Type your message...'.tr, + hintStyle: TextStyle(color: Colors.grey[500], fontSize: 13), + border: InputBorder.none, + contentPadding: const EdgeInsets.only(bottom: 10), + ), + ), + ), + ), + ), + const SizedBox(width: 8), + InkWell( + onTap: () { + if (controller.messagesFormKey.currentState!.validate()) { + _sendMessage(controller, controller.messageToDriver.text); + controller.messageToDriver.clear(); + Get.back(); + } + }, + child: CircleAvatar( + backgroundColor: AppColor.primaryColor, + radius: 20, + child: + const Icon(Icons.send_rounded, color: Colors.white, size: 16), + ), + ), + ], + ); + } + + void _sendMessage(RideLifecycleController controller, String text) async { + try { + await CRUD().post( + link: AppLink.sendChatMessage, + payload: { + 'ride_id': controller.rideId.toString(), + 'sender_id': box.read(BoxName.passengerID).toString(), + 'receiver_id': controller.driverId.toString(), + 'sender_type': 'passenger', + 'message_content': text.tr, + }, + ); + } catch (e) { + // Ignore or log error + } + + NotificationService.sendNotification( + category: 'MSG_FROM_PASSENGER', + target: controller.driverToken.toString(), + title: text.tr, + body: text.tr, + isTopic: false, + tone: 'ding', + driverList: [], + ); + } +} + +// ----------------------------------------------------------------------------- +// مؤشرات الانتظار والوقت (مضغوطة) +// ----------------------------------------------------------------------------- + +class DriverArrivePassengerAndWaitMinute extends StatelessWidget { + const DriverArrivePassengerAndWaitMinute({Key? key}) : super(key: key); + + @override + Widget build(BuildContext context) { + return GetBuilder(builder: (controller) { + return Column( + children: [ + Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + Text('Waiting...'.tr, + style: const TextStyle( + fontWeight: FontWeight.bold, + fontSize: 12, + color: Colors.orange)), + Text( + controller.stringRemainingTimeDriverWaitPassenger5Minute, + style: const TextStyle( + fontWeight: FontWeight.bold, + color: Colors.orange, + fontSize: 12), + ), + ], + ), + const SizedBox(height: 4), + ClipRRect( + borderRadius: BorderRadius.circular(2), + child: LinearProgressIndicator( + backgroundColor: Colors.orange.withOpacity(0.2), + color: Colors.orange, + minHeight: 4, + value: + controller.progressTimerDriverWaitPassenger5Minute.toDouble(), + ), + ), + ], + ); + }); + } +} + +class TimeDriverToPassenger extends StatelessWidget { + const TimeDriverToPassenger({Key? key}) : super(key: key); + + @override + Widget build(BuildContext context) { + return GetBuilder(builder: (controller) { + if (controller.timeToPassengerFromDriverAfterApplied <= 0) { + return const SizedBox(); + } + return Column( + children: [ + // شريط التقدم فقط لأن الوقت والمسافة موجودان بالأعلى + ClipRRect( + borderRadius: BorderRadius.circular(2), + child: LinearProgressIndicator( + backgroundColor: AppColor.primaryColor.withOpacity(0.1), + color: AppColor.primaryColor, + minHeight: 4, + value: controller.progressTimerToPassengerFromDriverAfterApplied + .toDouble() + .clamp(0.0, 1.0), + ), + ), + ], + ); + }); + } +} diff --git a/siro_rider/lib/views/home/map_widget.dart/buttom_sheet_map_show.dart b/siro_rider/lib/views/home/map_widget.dart/buttom_sheet_map_show.dart new file mode 100644 index 0000000..c3dee90 --- /dev/null +++ b/siro_rider/lib/views/home/map_widget.dart/buttom_sheet_map_show.dart @@ -0,0 +1,560 @@ +import 'package:flutter/material.dart'; +import 'package:get/get.dart'; +import 'package:siro_rider/controller/payment/payment_controller.dart'; + +import '../../../constant/style.dart'; +import '../../../controller/home/map/ride_lifecycle_controller.dart'; + +GetBuilder buttomSheetMapPage() { + Get.put(PaymentController()); + return GetBuilder( + builder: (controller) => + controller.isBottomSheetShown && controller.rideConfirm == false + ? const Positioned( + left: 5, + bottom: 0, + right: 5, + child: Column( + // children: [ + // Row( + // mainAxisAlignment: MainAxisAlignment.end, + // children: [ + // double.parse(box.read(BoxName.passengerWalletTotal)) < + // 0 && + // controller.data.isNotEmpty + // ? Container( + // decoration: AppStyle.boxDecoration + // .copyWith(color: AppColor.redColor), + // height: 50, + // width: Get.width * .94, + // child: Padding( + // padding: + // const EdgeInsets.symmetric(horizontal: 8), + // child: Text( + // 'Your trip cost is'.tr + + // ' ${controller.totalCostPassenger.toStringAsFixed(2)} ' + // 'But you have a negative salary of' + // .tr + + // '${double.parse(box.read(BoxName.passengerWalletTotal)).toStringAsFixed(2)}' + // ' in your' + // .tr + + // ' ${AppInformation.appName}' + // ' wallet due to a previous trip.' + // .tr, + // style: AppStyle.subtitle, + // ), + // )) + // : const SizedBox(), + // ], + // ), + // const SizedBox( + // height: 5, + // ), + // AnimatedContainer( + // // clipBehavior: Clip.antiAliasWithSaveLayer, + // curve: Curves.easeInCirc, + // onEnd: () { + // controller.height = 250; + // }, + // height: controller.heightBottomSheetShown, + // duration: const Duration(seconds: 2), + // child: Column( + // children: [ + // controller.data.isEmpty + // ? const SizedBox() + // : Container( + // // width: Get.width * .9, + // height: 100, + // decoration: BoxDecoration( + // color: AppColor.secondaryColor, + // boxShadow: [ + // const BoxShadow( + // color: AppColor.accentColor, + // offset: Offset(2, 2)), + // BoxShadow( + // color: AppColor.accentColor + // .withOpacity(.4), + // offset: const Offset(-2, -2)) + // ], + // borderRadius: const BorderRadius.all( + // Radius.circular(15))), + // child: ListView.builder( + // scrollDirection: Axis.horizontal, + // itemCount: controller + // .dataCarsLocationByPassenger.length - + // 1, + // itemBuilder: + // (BuildContext context, int index) { + // return Container( + // color: controller.gender == 'Female' + // ? const Color.fromARGB( + // 255, 246, 52, 181) + // : AppColor.secondaryColor, + // width: Get.width, + // child: Row( + // mainAxisAlignment: + // MainAxisAlignment.spaceBetween, + // children: [ + // SizedBox( + // width: Get.width * .15, + // child: Padding( + // padding: + // const EdgeInsets.all(8.0), + // child: Image.asset( + // 'assets/images/jeep.png', + // width: 50, + // fit: BoxFit.fill, + // repeat: ImageRepeat.repeatX, + // ), + // ), + // ), + // SizedBox( + // width: Get.width * .55, + // child: Column( + // crossAxisAlignment: + // CrossAxisAlignment.start, + // mainAxisAlignment: + // MainAxisAlignment.spaceEvenly, + // children: [ + // Text( + // controller.hours > 0 + // ? '${'Your Ride Duration is '.tr}${controller.hours} ${'H and'.tr} ${controller.minutes} ${'m'.tr}' + // : '${'Your Ride Duration is '.tr} ${controller.minutes} m', + // style: AppStyle.subtitle, + // ), + // // Text( + // // '${'You will be thier in'.tr} ${DateFormat('h:mm a').format(controller.newTime)}', + // // style: AppStyle.subtitle, + // // ), + // Text( + // '${'Your trip distance is'.tr} ${controller.distance.toStringAsFixed(2)} ${'KM'.tr}', + // style: AppStyle.subtitle, + // ) + // ], + // ), + // ), + // SizedBox( + // width: Get.width * .2, + // child: Padding( + // padding: const EdgeInsets.only( + // right: 5, left: 5), + // child: Column( + // crossAxisAlignment: + // CrossAxisAlignment.center, + // children: [ + // Container( + // width: Get.width * .14, + // height: Get.height * .06, + // decoration: BoxDecoration( + // color: AppColor + // .secondaryColor, + // shape: + // BoxShape.rectangle, + // border: Border.all( + // width: 2, + // color: AppColor + // .greenColor)), + // child: Center( + // child: Text( + // '${'Fee is'.tr} \n${controller.totalPassenger.toStringAsFixed(2)}', + // style: + // AppStyle.subtitle, + // ), + // ), + // ), + // controller.promoTaken + // ? const Icon( + // Icons + // .filter_vintage_rounded, + // color: + // AppColor.redColor, + // ) + // : const SizedBox( + // height: 0, + // ) + // ], + // ), + // ), + // ), + // ], + // ), + // ); + // }, + // ), + // ), + // const SizedBox( + // height: 5, + // ), + // Container( + // // height: 130, + // decoration: BoxDecoration( + // color: AppColor.secondaryColor, + // boxShadow: [ + // const BoxShadow( + // color: AppColor.accentColor, + // offset: Offset(2, 2)), + // BoxShadow( + // color: AppColor.accentColor.withOpacity(.4), + // offset: const Offset(-2, -2)) + // ], + // borderRadius: + // const BorderRadius.all(Radius.circular(15))), + // child: controller.data.isEmpty + // ? const SizedBox() + // : Center( + // child: Padding( + // padding: const EdgeInsets.symmetric( + // horizontal: 5), + // child: Column( + // children: [ + // Row( + // children: [ + // const Icon( + // Icons.location_on, + // color: AppColor.redColor, + // ), + // const SizedBox( + // width: 10, + // ), + // Text( + // 'From : '.tr, + // style: AppStyle.subtitle, + // ), + // Text( + // controller.data[0] + // ['start_address'] + // .toString(), + // style: AppStyle.subtitle, + // ) + // ], + // ), + // Row( + // children: [ + // const Icon(Icons + // .location_searching_rounded), + // const SizedBox( + // width: 10, + // ), + // Text( + // 'To : '.tr, + // style: AppStyle.subtitle, + // ), + // Text( + // controller.data[0]['end_address'], + // style: AppStyle.subtitle, + // ), + // ], + // ), + // const Divider( + // color: AppColor.accentColor, + // thickness: 1, + // height: 2, + // indent: 1, + // ), + // SizedBox( + // height: 40, + // child: Row( + // mainAxisAlignment: + // MainAxisAlignment.center, + // children: [ + // Container( + // decoration: BoxDecoration( + // color: + // AppColor.secondaryColor, + // borderRadius: + // BorderRadius.circular(12), + // // border: Border.all(), + // ), + // child: Row( + // children: [ + // Icon( + // Icons.monetization_on, + // color: Colors.green[400], + // ), + // InkWell( + // onTap: () async { + // controller + // .changeCashConfirmPageShown(); + // Get.find< + // PaymentController>() + // .getPassengerWallet(); + // }, + // child: GetBuilder< + // PaymentController>( + // builder: (paymentController) => + // paymentController + // .isCashChecked + // ? Text( + // 'CASH', + // style: AppStyle + // .title, + // ) + // : Text( + // '${AppInformation.appName} Wallet', + // style: AppStyle + // .title, + // ), + // ), + // ), + // ], + // ), + // ), + // const SizedBox( + // width: 40, + // ), + // GetBuilder( + // builder: + // (paymentController) => + // Container( + // decoration: + // BoxDecoration( + // color: AppColor + // .secondaryColor, + // borderRadius: + // BorderRadius + // .circular( + // 12), + // ), + // child: Row( + // children: [ + // Icon( + // Icons + // .qr_code_2_rounded, + // color: Colors + // .green[ + // 400], + // ), + // InkWell( + // onTap: () { + // if (controller + // .promoTaken == + // false) { + // Get.defaultDialog( + // title: 'Add Promo'.tr, + // titleStyle: AppStyle.title, + // content: Column( + // children: [ + // SizedBox( + // width: Get.width * .7, + // child: TextFormField( + // controller: controller.promo, + // decoration: InputDecoration( + // labelText: 'Promo Code'.tr, + // hintText: 'Enter promo code'.tr, + // labelStyle: AppStyle.subtitle, + // hintStyle: AppStyle.subtitle, + // border: OutlineInputBorder( + // borderRadius: BorderRadius.circular(10), + // ), + // filled: true, + // fillColor: Colors.grey[200], + // focusedBorder: OutlineInputBorder( + // borderSide: const BorderSide( + // color: AppColor.primaryColor, + // width: 2.0, + // ), + // borderRadius: BorderRadius.circular(10), + // ), + // errorBorder: OutlineInputBorder( + // borderSide: const BorderSide( + // color: Colors.red, + // width: 2.0, + // ), + // borderRadius: BorderRadius.circular(10), + // ), + // enabledBorder: OutlineInputBorder( + // borderSide: const BorderSide( + // color: Colors.grey, + // width: 1.0, + // ), + // borderRadius: BorderRadius.circular(10), + // ), + // ), + // ), + // ), + // MyElevatedButton( + // title: 'Add Promo'.tr, + // onPressed: () async { + // controller.applyPromoCodeToPassenger(); + // }, + // ) + // ], + // )); + // } else { + // Get.snackbar( + // 'You have promo!' + // .tr, + // '', + // backgroundColor: + // AppColor.redColor); + // } + // }, + // child: Text( + // 'Add Promo' + // .tr, + // style: AppStyle + // .title, + // ), + // ), + // ], + // ), + // )), + // ], + // ), + // ), + // SizedBox( + // width: Get.width * .95, + // child: Row( + // mainAxisAlignment: + // MainAxisAlignment.center, + // children: [ + // controller.isCashSelectedBeforeConfirmRide == + // false + // ? MyElevatedButton( + // title: 'Next'.tr, + // onPressed: () { + // controller + // .changeCashConfirmPageShown(); + // }, + // ) + // : + // // controller.isPassengerChosen == + // // false + // // ? MyElevatedButton( + // // title: 'Next'.tr, + // // onPressed: () { + // // controller + // // .onChangedPassengersChoose(); + // // Get.defaultDialog( + // // barrierDismissible: + // // false, + // // title: + // // 'How Many Passengers?' + // // .tr, + // // titleStyle: + // // AppStyle + // // .title, + // // content: + // // Column( + // // children: [ + // // Text( + // // 'Allowed up to 4 Passengers.' + // // .tr, + // // style: AppStyle + // // .title, + // // ), + // // SizedBox( + // // height: + // // 200, // Set the desired height here + // // child: + // // CupertinoPicker( + // // itemExtent: + // // 32, + // // onSelectedItemChanged: + // // (index) { + // // controller.onChangedPassengerCount(index + + // // 1); + // // }, + // // children: [ + // // Text('1 Passenger'.tr), + // // Text('2 Passengers'.tr), + // // Text('3 Passengers'.tr), + // // Text('4 Passengers'.tr), + // // ], + // // ), + // // ), + // // MyElevatedButton( + // // title: + // // 'Back', + // // onPressed: + // // () => + // // Get.back(), + // // ) + // // ], + // // ), + // // ); + // // }, + // // ) + // // : + // MyElevatedButton( + // title: 'Confirm Selection' + // .tr, + // onPressed: () { + // controller + // .confirmRideForFirstDriver(); + // }, + // ), + // ], + // ), + // ) + // ], + // ), + // ), + // ), + // ), + // ], + // ), + // ), + // ], + ), + ) + : const SizedBox()); +} + +class Details extends StatelessWidget { + const Details({ + super.key, + }); + + @override + Widget build(BuildContext context) { + return GetBuilder( + builder: (controller) => Column( + children: [ + Row( + mainAxisAlignment: MainAxisAlignment.spaceAround, + children: [ + Text( + '${'Distance is'.tr} ${controller.distance.toStringAsFixed(2)} KM', + style: AppStyle.title, + ), + Text( + '${'Duration is'.tr} ${controller.data[0]['duration']['text']}', + style: AppStyle.title, + ), + ], + ), + Row( + mainAxisAlignment: MainAxisAlignment.spaceAround, + children: [ + Text( + 'Cost for .21/km ${controller.costDistance.toStringAsFixed(2)} ', + style: AppStyle.title, + ), + Text( + '${'Cost Duration'.tr} ${controller.averageDuration.toStringAsFixed(2)} is ${controller.costDuration.toStringAsFixed(2)} ', + style: AppStyle.title, + ), + ], + ), + Row( + mainAxisAlignment: MainAxisAlignment.spaceAround, + children: [ + Text( + 'Total Driver ${controller.totalDriver.toStringAsFixed(2)}', + style: AppStyle.title, + ), + Text( + 'totaME ${controller.totalME.toStringAsFixed(2)} ', + style: AppStyle.title, + ), + ], + ), + Text( + 'Cost for passenger ${controller.totalPassenger.toStringAsFixed(2)} ', + style: AppStyle.title, + ), + ], + )); + } +} diff --git a/siro_rider/lib/views/home/map_widget.dart/call_passenger_page.dart b/siro_rider/lib/views/home/map_widget.dart/call_passenger_page.dart new file mode 100644 index 0000000..1f8eda5 --- /dev/null +++ b/siro_rider/lib/views/home/map_widget.dart/call_passenger_page.dart @@ -0,0 +1,258 @@ +// import 'dart:async'; +// import 'package:SEFER/constant/box_name.dart'; +// import 'package:SEFER/controller/home/map_passenger_controller.dart'; +// import 'package:SEFER/main.dart'; +// import 'package:SEFER/views/widgets/my_scafold.dart'; +// import 'package:flutter/material.dart'; +// import 'package:get/get.dart'; +// import 'package:permission_handler/permission_handler.dart'; + +// import 'package:agora_rtc_engine/agora_rtc_engine.dart'; + +// import '../../../../constant/api_key.dart'; +// import '../../../constant/colors.dart'; +// import '../../../constant/style.dart'; +// import '../../../controller/firebase/firbase_messge.dart'; + +// String appId = AK.agoraAppId; + +// class PassengerCallPage extends StatefulWidget { +// const PassengerCallPage({ +// super.key, +// required this.channelName, +// required this.token, +// required this.remoteID, +// }); +// final String channelName, token, remoteID; +// @override +// State createState() => _PassengerCallPageState(); +// } + +// class _PassengerCallPageState extends State { +// int uid = 0; +// int? _remoteUid = 0; // uid of the remote user +// bool _isJoined = false; // Indicates if the local user has joined the channel +// late RtcEngine agoraEngine; // Agora engine instance +// String status = ''; +// final GlobalKey scaffoldMessengerKey = +// GlobalKey(); // Global key to access the scaffold + +// showMessage(String message) { +// scaffoldMessengerKey.currentState?.showSnackBar(SnackBar( +// content: Text(message), +// )); +// } + +// initAgora() async { +// await setupVoiceSDKEngine(); +// } + +// @override +// void initState() { +// super.initState(); +// _remoteUid = int.parse(widget.remoteID); +// uid = int.parse(box.read(BoxName.phone)); +// // Set up an instance of Agora engine +// initAgora(); +// } + +// Future setupVoiceSDKEngine() async { +// // retrieve or request microphone permission +// await [Permission.microphone].request(); + +// //create an instance of the Agora engine +// agoraEngine = createAgoraRtcEngine(); +// await agoraEngine.initialize(RtcEngineContext(appId: AK.agoraAppId)); +// // Register the event handler +// agoraEngine.registerEventHandler( +// RtcEngineEventHandler( +// onJoinChannelSuccess: (RtcConnection connection, int elapsed) { +// showMessage( +// "Local user uid:${connection.localUid} joined the channel"); +// setState(() { +// _isJoined = true; +// status = 'joined'.tr; +// }); +// }, +// onUserJoined: (RtcConnection connection, int remoteUid, int elapsed) { +// showMessage("Driver joined the channel".tr); +// setState(() { +// status = "Driver joined the channel".tr; +// _remoteUid = remoteUid; +// }); +// }, +// onUserOffline: (RtcConnection connection, int? remoteUid, +// UserOfflineReasonType reason) { +// showMessage("Driver left the channel".tr); +// setState(() { +// status = "Driver left the channel".tr; +// _remoteUid = null; +// }); +// }, +// ), +// ); +// } + +// void join() async { +// // Set channel options including the client role and channel profile +// ChannelMediaOptions options = const ChannelMediaOptions( +// clientRoleType: ClientRoleType.clientRoleBroadcaster, +// channelProfile: ChannelProfileType.channelProfileCommunication, +// ); + +// await agoraEngine.joinChannel( +// token: widget.token, +// channelId: widget.channelName, +// options: options, +// uid: uid, +// ); +// } +// //https://console.agora.io/invite?sign=5e9e22d06f22caeeada9954c9e908572%253A5ba8aed978a35eab5a5113742502ded2a41478b2a81cb19c71a30776e125b58a + +// void leave() { +// setState(() { +// _isJoined = false; +// _remoteUid = null; +// }); +// agoraEngine.leaveChannel(); +// } + +// // Clean up the resources when you leave +// @override +// void dispose() async { +// await agoraEngine.leaveChannel(); +// super.dispose(); +// } + +// // Build UI +// @override +// Widget build(BuildContext context) { +// return MaterialApp( +// scaffoldMessengerKey: scaffoldMessengerKey, +// home: MyScafolld( +// // appBar: AppBar( +// // title: const Text('Get started with Voice Calling'), +// // ), +// title: 'Call Page'.tr, +// isleading: true, +// body: [ +// Positioned( +// top: Get.height * .2, +// child: Container( +// height: 100, width: Get.width, +// decoration: AppStyle.boxDecoration, +// child: Row( +// mainAxisAlignment: MainAxisAlignment.spaceEvenly, +// children: [ +// GestureDetector( +// onTap: () async { +// // await callController.initAgoraFull(); +// // callController.join(); +// // FirebaseMessagesController().sendNotificationToPassengerToken( +// // 'Call Income', +// // '${'You have call from driver'.tr} ${box.read(BoxName.nameDriver)}', +// // Get.find().tokenPassenger, +// // [ +// // callController.token, +// // callController.channelName, +// // callController.uid.toString(), +// // callController.remoteUid.toString(), +// // ], +// // ); +// join(); +// // callController.fetchToken(); +// }, +// child: Container( +// width: 50, +// height: 50, +// decoration: const BoxDecoration( +// shape: BoxShape.circle, +// color: AppColor.greenColor), +// child: const Icon( +// Icons.phone, +// size: 35, +// color: AppColor.secondaryColor, +// )), +// ), +// Column( +// children: [ +// Text( +// status, +// style: AppStyle.title, +// ), +// Text('Driver Name'), +// ], +// ), +// GestureDetector( +// onTap: () async { +// FirebaseMessagesController() +// .sendNotificationToPassengerToken( +// 'Call End'.tr, +// 'Call End', +// Get.find().driverToken, +// [], +// 'iphone_ringtone.wav', +// ); +// leave(); +// Get.back(); +// // }, +// child: Container( +// width: 50, +// height: 50, +// decoration: const BoxDecoration( +// shape: BoxShape.circle, color: AppColor.redColor), +// child: const Icon( +// Icons.phone_disabled_sharp, +// size: 35, +// color: AppColor.secondaryColor, +// )), +// ) +// ], +// ), +// // ignore: prefer_const_constructors +// ), +// ), +// // ListView( +// // padding: const EdgeInsets.symmetric(horizontal: 16, vertical: 4), +// // children: [ +// // // Status text +// // Container(height: 40, child: Center(child: _status())), +// // // Button Row +// // Row( +// // children: [ +// // Expanded( +// // child: ElevatedButton( +// // child: Text("Join".tr), +// // onPressed: () => {join()}, +// // ), +// // ), +// // const SizedBox(width: 10), +// // Expanded( +// // child: ElevatedButton( +// // child: Text("Leave".tr), +// // onPressed: () => {leave()}, +// // ), +// // ), +// // ], +// // ), +// // ], +// // ), +// ]), +// ); +// } + +// // Widget _status() { +// // String statusText; +// // +// // if (!_isJoined) { +// // statusText = 'Join a channel'.tr; +// // } else if (_remoteUid == null) +// // statusText = 'Waiting for a remote user to join...'; +// // else +// // statusText = 'Connected to remote user, uid:$_remoteUid'; +// // +// // return Text( +// // statusText, +// // ); +// // } +// } diff --git a/siro_rider/lib/views/home/map_widget.dart/cancel_raide_page.dart b/siro_rider/lib/views/home/map_widget.dart/cancel_raide_page.dart new file mode 100644 index 0000000..900609f --- /dev/null +++ b/siro_rider/lib/views/home/map_widget.dart/cancel_raide_page.dart @@ -0,0 +1,162 @@ +import 'package:flutter/material.dart'; +import 'package:get/get.dart'; +import 'package:siro_rider/constant/colors.dart'; +import 'package:siro_rider/constant/style.dart'; +import 'package:siro_rider/controller/home/map/ride_lifecycle_controller.dart'; +import '../../widgets/elevated_btn.dart'; + +// دالة لإظهار الشيت +void showCancelRideBottomSheet() { + Get.bottomSheet( + const CancelRidePageWidget(), + backgroundColor: Colors.transparent, + isScrollControlled: true, + ); +} + +// الويدجت مفصولة لترتيب الكود +class CancelRidePageWidget extends StatelessWidget { + const CancelRidePageWidget({Key? key}) : super(key: key); + + @override + Widget build(BuildContext context) { + // تأكد من وجود الكنترولر + final controller = Get.find(); + + final List reasons = [ + "Changed my mind".tr, + "Found another transport".tr, + "Driver is taking too long".tr, + "Driver asked me to cancel".tr, + "Wrong pickup location".tr, + "Other".tr, + ]; + + return Container( + height: Get.height * 0.7, // ارتفاع مناسب + padding: const EdgeInsets.symmetric(horizontal: 20, vertical: 15), + decoration: BoxDecoration( + color: AppColor.secondaryColor, + borderRadius: const BorderRadius.vertical(top: Radius.circular(25)), + ), + child: GetBuilder( + builder: (controller) => Column( + crossAxisAlignment: CrossAxisAlignment.stretch, + children: [ + // مؤشر السحب + Center( + child: Container( + width: 50, + height: 5, + decoration: BoxDecoration( + color: Colors.grey[300], + borderRadius: BorderRadius.circular(10), + ), + ), + ), + const SizedBox(height: 20), + + Text( + 'Why do you want to cancel?'.tr, + style: AppStyle.title + .copyWith(fontSize: 18, fontWeight: FontWeight.bold), + textAlign: TextAlign.center, + ), + const SizedBox(height: 10), + + Expanded( + child: ListView.separated( + itemCount: reasons.length, + separatorBuilder: (context, index) => const Divider(height: 1), + itemBuilder: (context, index) { + bool isSelected = controller.selectedReasonIndex == index; + return Column( + children: [ + ListTile( + contentPadding: EdgeInsets.zero, + title: Text( + reasons[index], + style: TextStyle( + fontWeight: isSelected + ? FontWeight.bold + : FontWeight.normal, + color: isSelected + ? AppColor.primaryColor + : AppColor.writeColor, + fontSize: 15), + ), + trailing: isSelected + ? Icon(Icons.radio_button_checked, + color: AppColor.primaryColor) + : Icon(Icons.radio_button_off, color: Colors.grey), + onTap: () { + controller.selectReason(index, reasons[index]); + }, + ), + + // إظهار حقل النص فقط عند اختيار "أخرى" + if (isSelected && reasons[index] == "Other".tr) + Padding( + padding: const EdgeInsets.only( + bottom: 10, left: 10, right: 10), + child: TextField( + controller: controller.otherReasonController, + decoration: InputDecoration( + hintText: "Please write the reason...".tr, + filled: true, + fillColor: Get.isDarkMode + ? Colors.white.withOpacity(0.05) + : Colors.grey[100], + border: OutlineInputBorder( + borderRadius: BorderRadius.circular(10), + borderSide: BorderSide.none, + ), + contentPadding: const EdgeInsets.symmetric( + horizontal: 15, vertical: 12), + ), + maxLines: 2, + ), + ) + ], + ); + }, + ), + ), + + const SizedBox(height: 20), + + // زر التأكيد + SizedBox( + height: 50, + child: ElevatedButton( + style: ElevatedButton.styleFrom( + backgroundColor: AppColor.redColor, + shape: RoundedRectangleBorder( + borderRadius: BorderRadius.circular(12)), + elevation: 0, + ), + onPressed: () => controller.cancelRide(), + child: Text( + 'Confirm Cancellation'.tr, + style: const TextStyle( + color: Colors.white, + fontWeight: FontWeight.bold, + fontSize: 16), + ), + ), + ), + const SizedBox(height: 10), + // زر التراجع + Center( + child: TextButton( + onPressed: () => Get.back(), + child: Text("Don't Cancel".tr, + style: TextStyle(color: AppColor.grayColor)), + ), + ), + ], + ), + ), + ); + } +} diff --git a/siro_rider/lib/views/home/map_widget.dart/car_details_widget_to_go.dart b/siro_rider/lib/views/home/map_widget.dart/car_details_widget_to_go.dart new file mode 100644 index 0000000..4ef8412 --- /dev/null +++ b/siro_rider/lib/views/home/map_widget.dart/car_details_widget_to_go.dart @@ -0,0 +1,1062 @@ +import 'package:flutter/material.dart'; +import 'package:get/get.dart'; +import 'package:siro_rider/constant/box_name.dart'; +import 'package:siro_rider/constant/colors.dart'; +import 'package:siro_rider/constant/style.dart'; +import 'package:siro_rider/main.dart'; +import 'package:siro_rider/views/home/profile/passenger_profile_page.dart'; +import 'package:siro_rider/views/widgets/elevated_btn.dart'; +import 'package:siro_rider/views/widgets/my_textField.dart'; +import 'package:intl/intl.dart'; +import 'dart:ui'; + +import '../../../constant/info.dart'; +import '../../../controller/functions/tts.dart'; +import '../../../controller/home/map/ride_lifecycle_controller.dart'; +import '../../widgets/mydialoug.dart'; + +// ───────────────────────────────────────────────────────────────────────────── +// CAR TYPE MODEL +// ───────────────────────────────────────────────────────────────────────────── +class CarType { + final String carType; + final String carDetail; + final String image; + bool isSelected = false; + + CarType( + {required this.carType, required this.carDetail, required this.image}); +} + +List carTypes = [ + CarType( + carType: 'Fixed Price', + carDetail: 'Closest & Cheapest'.tr, + image: 'assets/images/carspeed.png'), + CarType( + carType: 'Comfort', + carDetail: 'Comfort choice'.tr, + image: 'assets/images/blob.png'), + CarType( + carType: 'Electric', + carDetail: 'Quiet & Eco-Friendly'.tr, + image: 'assets/images/electric.png'), + CarType( + carType: 'Lady', + carDetail: 'Lady Captain for girls'.tr, + image: 'assets/images/lady.png'), + CarType( + carType: 'Van', + carDetail: 'Van for familly'.tr, + image: 'assets/images/bus.png'), + CarType( + carType: 'Rayeh Gai', + carDetail: "Best choice for cities".tr, + image: 'assets/images/roundtrip.png'), +]; + +// ───────────────────────────────────────────────────────────────────────────── +// MAIN WIDGET +// ───────────────────────────────────────────────────────────────────────────── +class CarDetailsTypeToChoose extends StatelessWidget { + CarDetailsTypeToChoose({super.key}); + final textToSpeechController = Get.find(); + + void _prepareCarTypes(RideLifecycleController controller) { + if (controller.distance > 23) { + if (!carTypes.any((car) => car.carType == 'Rayeh Gai')) { + carTypes.add(CarType( + carType: 'Rayeh Gai', + carDetail: "Best choice for cities".tr, + image: 'assets/images/roundtrip.png')); + } + } else { + carTypes.removeWhere((car) => car.carType == 'Rayeh Gai'); + } + } + + @override + Widget build(BuildContext context) { + return GetBuilder(builder: (controller) { + _prepareCarTypes(controller); + + if (!(controller.isBottomSheetShown) && controller.rideConfirm == false) { + return const SizedBox.shrink(); + } + + return Positioned( + bottom: 0, + left: 0, + right: 0, + child: ClipRRect( + borderRadius: const BorderRadius.only( + topLeft: Radius.circular(28), + topRight: Radius.circular(28), + ), + child: BackdropFilter( + filter: ImageFilter.blur(sigmaX: 12, sigmaY: 12), + child: Container( + decoration: BoxDecoration( + color: AppColor.secondaryColor.withAlpha(240), + borderRadius: const BorderRadius.only( + topLeft: Radius.circular(28), + topRight: Radius.circular(28), + ), + boxShadow: [ + BoxShadow( + color: Colors.black.withAlpha(30), + blurRadius: 30, + spreadRadius: 0, + offset: const Offset(0, -8), + ), + ], + ), + child: Column( + mainAxisSize: MainAxisSize.min, + children: [ + // ── Drag Handle ────────────────────────────────────── + Center( + child: Container( + width: 40, + height: 4, + margin: const EdgeInsets.only(top: 12, bottom: 8), + decoration: BoxDecoration( + color: Colors.grey.shade300, + borderRadius: BorderRadius.circular(2), + ), + ), + ), + + // ── Header ─────────────────────────────────────────── + _buildHeader(controller), + + // ── Negative Balance Warning ───────────────────────── + _buildNegativeBalanceWarning(controller), + + // ── Car Selection List ─────────────────────────────── + SizedBox( + height: 170, + child: ListView.builder( + physics: const BouncingScrollPhysics(), + scrollDirection: Axis.horizontal, + padding: const EdgeInsets.fromLTRB(20, 8, 20, 12), + itemCount: carTypes.length, + itemBuilder: (context, index) { + final carType = carTypes[index]; + final isSelected = controller.selectedIndex == index; + return Padding( + padding: EdgeInsets.only( + right: index < carTypes.length - 1 ? 10 : 0), + child: _buildCarCard( + context, controller, carType, isSelected, index), + ); + }, + ), + ), + + // ── Promo Code & Actions ───────────────────────────── + _buildPromoButton(context, controller), + + SizedBox(height: MediaQuery.of(context).padding.bottom + 10), + ], + ), + ), + ), + ), + ); + }); + } + + // ═══════════════════════════════════════════════════════════════════════════ + // HEADER + // ═══════════════════════════════════════════════════════════════════════════ + Widget _buildHeader(RideLifecycleController controller) { + return Padding( + padding: const EdgeInsets.fromLTRB(22, 4, 22, 8), + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Row( + children: [ + // Title + Expanded( + child: Text( + 'Choose your ride'.tr, + style: AppStyle.headTitle.copyWith( + fontSize: 20, + fontWeight: FontWeight.w800, + letterSpacing: 0.3, + ), + ), + ), + // Close button + GestureDetector( + onTap: () { + controller.isBottomSheetShown = false; + controller.update(); + }, + child: Container( + padding: const EdgeInsets.all(6), + decoration: BoxDecoration( + color: Get.isDarkMode + ? Colors.white.withOpacity(0.08) + : Colors.grey.shade100, + shape: BoxShape.circle, + ), + child: Icon(Icons.close_rounded, + size: 18, color: AppColor.grayColor), + ), + ), + ], + ), + const SizedBox(height: 10), + // Trip Stats Row + Row( + children: [ + // Distance chip + _buildStatChip( + icon: Icons.route_rounded, + value: '${controller.distance.toStringAsFixed(1)} ${'KM'.tr}', + color: AppColor.primaryColor, + ), + const SizedBox(width: 8), + // Duration chip + _buildStatChip( + icon: Icons.schedule_rounded, + value: controller.hours > 0 + ? '${controller.hours}h ${controller.minutes}m' + : '${controller.minutes} ${'min'.tr}', + color: const Color(0xFF6366F1), // Indigo + ), + const Spacer(), + // Price preview for selected car + if (controller.selectedIndex >= 0 && + controller.selectedIndex < carTypes.length) + Container( + padding: + const EdgeInsets.symmetric(horizontal: 12, vertical: 6), + decoration: BoxDecoration( + gradient: LinearGradient( + colors: [ + AppColor.primaryColor, + AppColor.primaryColor.withAlpha(200), + ], + ), + borderRadius: BorderRadius.circular(20), + ), + child: Text( + '${_getPassengerPriceText(carTypes[controller.selectedIndex], controller)} ${'SYP'.tr}', + style: const TextStyle( + color: Colors.white, + fontSize: 13, + fontWeight: FontWeight.w700, + ), + ), + ), + ], + ), + ], + ), + ); + } + + Widget _buildStatChip( + {required IconData icon, required String value, required Color color}) { + return Container( + padding: const EdgeInsets.symmetric(horizontal: 10, vertical: 5), + decoration: BoxDecoration( + color: color.withAlpha(20), + borderRadius: BorderRadius.circular(20), + border: Border.all(color: color.withAlpha(50)), + ), + child: Row( + mainAxisSize: MainAxisSize.min, + children: [ + Icon(icon, size: 14, color: color), + const SizedBox(width: 5), + Text( + value, + style: TextStyle( + fontSize: 12, + fontWeight: FontWeight.w700, + color: color, + ), + ), + ], + ), + ); + } + + // ═══════════════════════════════════════════════════════════════════════════ + // CAR CARD + // ═══════════════════════════════════════════════════════════════════════════ + Widget _buildCarCard(BuildContext context, RideLifecycleController controller, + CarType carType, bool isSelected, int index) { + return GestureDetector( + onTap: () { + controller.selectCarFromList(index); + _showCarDetailsDialog( + context, controller, carType, textToSpeechController); + }, + child: AnimatedContainer( + duration: const Duration(milliseconds: 300), + curve: Curves.easeOutCubic, + width: 108, + decoration: BoxDecoration( + gradient: isSelected + ? LinearGradient( + begin: Alignment.topLeft, + end: Alignment.bottomRight, + colors: [ + AppColor.primaryColor.withAlpha(18), + AppColor.primaryColor.withAlpha(8), + ], + ) + : null, + color: isSelected ? null : AppColor.secondaryColor, + borderRadius: BorderRadius.circular(16), + border: Border.all( + color: isSelected + ? AppColor.primaryColor + : AppColor.grayColor.withOpacity(0.2), + width: isSelected ? 2.0 : 1.0, + ), + boxShadow: [ + BoxShadow( + color: isSelected + ? AppColor.primaryColor.withAlpha(40) + : Colors.black.withAlpha(12), + blurRadius: isSelected ? 12 : 4, + offset: const Offset(0, 3), + ), + ], + ), + child: Stack( + children: [ + // Selected indicator + if (isSelected) + Positioned( + top: 6, + right: 6, + child: Container( + width: 18, + height: 18, + decoration: BoxDecoration( + gradient: LinearGradient( + colors: [ + AppColor.primaryColor, + AppColor.primaryColor.withAlpha(200), + ], + ), + shape: BoxShape.circle, + boxShadow: [ + BoxShadow( + color: AppColor.primaryColor.withAlpha(60), + blurRadius: 6, + ), + ], + ), + child: const Icon(Icons.check, size: 11, color: Colors.white), + ), + ), + + // Card content + Padding( + padding: const EdgeInsets.fromLTRB(8, 10, 8, 8), + child: Column( + mainAxisAlignment: MainAxisAlignment.center, + children: [ + // Car image + AnimatedScale( + scale: isSelected ? 1.12 : 1.0, + duration: const Duration(milliseconds: 300), + child: Image.asset( + carType.image, + height: 48, + fit: BoxFit.contain, + ), + ), + const SizedBox(height: 10), + + // Car name + FittedBox( + fit: BoxFit.scaleDown, + child: Text( + carType.carType.tr, + style: TextStyle( + fontWeight: + isSelected ? FontWeight.w800 : FontWeight.w600, + fontSize: 13, + color: isSelected + ? AppColor.primaryColor + : AppColor.writeColor, + ), + maxLines: 1, + ), + ), + + const SizedBox(height: 6), + + // Price tag + Container( + padding: + const EdgeInsets.symmetric(horizontal: 8, vertical: 4), + decoration: BoxDecoration( + color: isSelected + ? AppColor.primaryColor + : AppColor.writeColor.withOpacity(0.05), + borderRadius: BorderRadius.circular(10), + border: isSelected + ? null + : Border.all( + color: AppColor.grayColor.withOpacity(0.2)), + ), + child: FittedBox( + child: Text( + '${_getPassengerPriceText(carType, controller)} ${'SYP'.tr}', + style: TextStyle( + fontSize: 11, + fontWeight: FontWeight.w700, + color: isSelected + ? Colors.white + : AppColor.writeColor.withOpacity(0.8), + ), + ), + ), + ), + ], + ), + ), + ], + ), + ), + ); + } + + // ═══════════════════════════════════════════════════════════════════════════ + // PROMO BUTTON + // ═══════════════════════════════════════════════════════════════════════════ + Widget _buildPromoButton( + BuildContext context, RideLifecycleController controller) { + if (controller.promoTaken) return const SizedBox.shrink(); + + return Padding( + padding: const EdgeInsets.fromLTRB(20, 6, 20, 4), + child: Material( + color: Colors.transparent, + child: InkWell( + onTap: () => _showPromoCodeDialog(context, controller), + borderRadius: BorderRadius.circular(14), + child: Container( + padding: const EdgeInsets.symmetric(vertical: 12, horizontal: 14), + decoration: BoxDecoration( + gradient: LinearGradient( + colors: [ + Colors.amber.shade50, + Colors.orange.shade50, + ], + ), + borderRadius: BorderRadius.circular(14), + border: Border.all(color: Colors.amber.shade200), + ), + child: Row( + children: [ + Container( + padding: const EdgeInsets.all(7), + decoration: BoxDecoration( + color: Colors.amber.shade100, + shape: BoxShape.circle, + ), + child: Icon(Icons.percent_rounded, + color: Colors.amber.shade800, size: 16), + ), + const SizedBox(width: 12), + Expanded( + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Text( + 'Have a Promo Code?'.tr, + style: TextStyle( + fontSize: 13, + fontWeight: FontWeight.w700, + color: Colors.amber.shade900, + ), + ), + Text( + 'Tap to apply your discount'.tr, + style: TextStyle( + fontSize: 11, color: Colors.amber.shade700), + ), + ], + ), + ), + Container( + padding: const EdgeInsets.all(4), + decoration: BoxDecoration( + color: Colors.amber.shade100, + borderRadius: BorderRadius.circular(8), + ), + child: Icon(Icons.arrow_forward_ios_rounded, + size: 12, color: Colors.amber.shade800), + ), + ], + ), + ), + ), + ), + ); + } + + // ═══════════════════════════════════════════════════════════════════════════ + // NEGATIVE BALANCE WARNING + // ═══════════════════════════════════════════════════════════════════════════ + Widget _buildNegativeBalanceWarning(RideLifecycleController controller) { + final passengerWallet = + double.tryParse(box.read(BoxName.passengerWalletTotal) ?? '0.0') ?? 0.0; + if (passengerWallet < 0.0) { + return Container( + margin: const EdgeInsets.symmetric(horizontal: 20, vertical: 6), + padding: const EdgeInsets.all(12), + decoration: BoxDecoration( + color: Colors.red.shade50, + borderRadius: BorderRadius.circular(12), + border: Border.all(color: Colors.red.shade200), + ), + child: Row( + children: [ + Container( + padding: const EdgeInsets.all(6), + decoration: BoxDecoration( + color: Colors.red.shade100, + shape: BoxShape.circle, + ), + child: Icon(Icons.warning_amber_rounded, + color: Colors.red.shade700, size: 18), + ), + const SizedBox(width: 10), + Expanded( + child: Text( + '${'You have a negative balance of'.tr} ${passengerWallet.toStringAsFixed(2)} ${'SYP'.tr}.', + style: TextStyle( + color: Colors.red.shade800, + fontWeight: FontWeight.w600, + fontSize: 12, + ), + ), + ), + ], + ), + ); + } + return const SizedBox.shrink(); + } + + // ═══════════════════════════════════════════════════════════════════════════ + // PRICING HELPERS (Unchanged logic) + // ═══════════════════════════════════════════════════════════════════════════ + String _getPassengerPriceText( + CarType carType, RideLifecycleController mapPassengerController) { + double rawPrice; + switch (carType.carType) { + case 'Comfort': + rawPrice = mapPassengerController.totalPassengerComfort; + break; + case 'Fixed Price': + rawPrice = mapPassengerController.totalPassengerSpeed; + break; + case 'Electric': + rawPrice = mapPassengerController.totalPassengerElectric; + break; + case 'Awfar Car': + rawPrice = mapPassengerController.totalPassengerBalash; + break; + case 'Scooter': + case 'Pink Bike': + rawPrice = mapPassengerController.totalPassengerScooter; + break; + case 'Van': + rawPrice = mapPassengerController.totalPassengerVan; + break; + case 'Lady': + rawPrice = mapPassengerController.totalPassengerLady; + break; + case 'Rayeh Gai': + rawPrice = mapPassengerController.totalPassengerRayehGai; + break; + default: + return '...'; + } + final int roundedPrice = rawPrice.round(); + final formatter = NumberFormat.decimalPattern(); + return formatter.format(roundedPrice); + } + + // ═══════════════════════════════════════════════════════════════════════════ + // DIALOGS + // ═══════════════════════════════════════════════════════════════════════════ + void _showPromoCodeDialog( + BuildContext context, RideLifecycleController controller) { + Get.dialog( + Dialog( + shape: + RoundedRectangleBorder(borderRadius: BorderRadius.circular(20.0)), + backgroundColor: AppColor.secondaryColor, + elevation: 10, + child: Padding( + padding: const EdgeInsets.all(24.0), + child: Form( + key: controller.promoFormKey, + child: Column( + mainAxisSize: MainAxisSize.min, + crossAxisAlignment: CrossAxisAlignment.stretch, + children: [ + Icon(Icons.local_activity_outlined, + size: 40, color: AppColor.primaryColor), + const SizedBox(height: 16), + Text( + 'Apply Promo Code'.tr, + textAlign: TextAlign.center, + style: AppStyle.headTitle.copyWith(fontSize: 20), + ), + const SizedBox(height: 8), + Text( + 'Enter your code below to apply the discount.'.tr, + textAlign: TextAlign.center, + style: AppStyle.subtitle + .copyWith(color: Colors.grey.shade600, fontSize: 14), + ), + const SizedBox(height: 24), + MyTextForm( + controller: controller.promo, + label: 'Promo Code'.tr, + hint: 'Enter your promo code'.tr, + type: TextInputType.text, + ), + const SizedBox(height: 24), + Row( + children: [ + Expanded( + child: TextButton( + onPressed: () => Navigator.of(context).pop(), + style: TextButton.styleFrom( + foregroundColor: Colors.grey, + ), + child: Text('Cancel'.tr), + ), + ), + const SizedBox(width: 16), + Expanded( + child: MyElevatedButton( + title: 'Apply'.tr, + onPressed: () { + if (controller.promoFormKey.currentState! + .validate()) { + controller.applyPromoCodeToPassenger(context); + Navigator.of(context).pop(); + } + }, + ), + ), + ], + ), + ], + ), + ), + ), + ), + barrierColor: Colors.black.withAlpha(130), + ); + } + + void _showCarDetailsDialog( + BuildContext context, + RideLifecycleController mapPassengerController, + CarType carType, + TextToSpeechController textToSpeechController) { + Get.dialog( + Dialog( + shape: + RoundedRectangleBorder(borderRadius: BorderRadius.circular(28.0)), + backgroundColor: Colors.transparent, + child: Stack( + clipBehavior: Clip.none, + alignment: Alignment.topCenter, + children: [ + Container( + margin: const EdgeInsets.only(top: 55), + padding: const EdgeInsets.fromLTRB(24, 65, 24, 20), + decoration: BoxDecoration( + color: AppColor.secondaryColor, + borderRadius: BorderRadius.circular(28.0), + boxShadow: [ + BoxShadow( + color: Colors.black.withAlpha(30), + blurRadius: 30, + offset: const Offset(0, 10), + ), + ], + ), + child: Column( + mainAxisSize: MainAxisSize.min, + children: [ + Row( + mainAxisAlignment: MainAxisAlignment.center, + children: [ + Text( + carType.carType.tr, + style: AppStyle.headTitle.copyWith( + fontSize: 22, + fontWeight: FontWeight.w800, + ), + ), + const SizedBox(width: 8), + InkWell( + onTap: () => textToSpeechController.speakText( + _getCarDescription( + mapPassengerController, carType)), + borderRadius: BorderRadius.circular(20), + child: Container( + padding: const EdgeInsets.all(6), + decoration: BoxDecoration( + color: AppColor.primaryColor.withAlpha(20), + shape: BoxShape.circle, + ), + child: Icon(Icons.volume_up_rounded, + color: AppColor.primaryColor, size: 20), + ), + ) + ], + ), + const SizedBox(height: 6), + // Price badge in dialog + Container( + padding: + const EdgeInsets.symmetric(horizontal: 14, vertical: 6), + decoration: BoxDecoration( + gradient: LinearGradient( + colors: [ + AppColor.primaryColor, + AppColor.primaryColor.withAlpha(200), + ], + ), + borderRadius: BorderRadius.circular(20), + ), + child: Text( + '${_getPassengerPriceText(carType, mapPassengerController)} ${'SYP'.tr}', + style: const TextStyle( + fontSize: 16, + fontWeight: FontWeight.w800, + color: Colors.white, + ), + ), + ), + const SizedBox(height: 14), + Container( + padding: const EdgeInsets.all(14), + decoration: BoxDecoration( + color: Get.isDarkMode + ? Colors.white.withOpacity(0.05) + : Colors.grey.shade50, + borderRadius: BorderRadius.circular(14), + border: Border.all( + color: Get.isDarkMode + ? Colors.white10 + : Colors.grey.shade100), + ), + child: Text( + _getCarDescription(mapPassengerController, carType), + textAlign: TextAlign.center, + style: AppStyle.subtitle.copyWith( + color: AppColor.writeColor.withOpacity(0.8), + fontSize: 14, + height: 1.5, + ), + ), + ), + const SizedBox(height: 20), + Row( + children: [ + Expanded( + child: TextButton( + onPressed: () => Navigator.of(context).pop(), + style: TextButton.styleFrom( + padding: const EdgeInsets.symmetric(vertical: 12), + shape: RoundedRectangleBorder( + borderRadius: BorderRadius.circular(14), + side: BorderSide( + color: AppColor.grayColor.withOpacity(0.2)), + ), + ), + child: Text('Back'.tr, + style: TextStyle(color: AppColor.grayColor)), + ), + ), + const SizedBox(width: 12), + Expanded( + flex: 2, + child: MyElevatedButton( + kolor: AppColor.greenColor, + title: 'Select This Ride'.tr, + onPressed: () { + Navigator.of(context).pop(); + _handleCarSelection( + context, mapPassengerController, carType); + }, + ), + ), + ], + ), + ], + ), + ), + // Floating car image + Positioned( + top: 0, + child: Container( + padding: const EdgeInsets.all(10), + decoration: BoxDecoration( + color: AppColor.secondaryColor, + shape: BoxShape.circle, + boxShadow: [ + BoxShadow( + color: Colors.black.withAlpha(30), + blurRadius: 15, + offset: const Offset(0, 5), + ), + ], + ), + child: Hero( + tag: 'car_${carType.carType}', + child: Image.asset(carType.image, height: 80), + ), + ), + ), + ], + ), + ), + barrierColor: Colors.black.withAlpha(150), + ); + } + + // ═══════════════════════════════════════════════════════════════════════════ + // LOGIC HELPERS (Unchanged) + // ═══════════════════════════════════════════════════════════════════════════ + String _getCarDescription( + RideLifecycleController mapPassengerController, CarType carType) { + switch (carType.carType) { + case 'Comfort': + return mapPassengerController.endNameAddress + .toLowerCase() + .contains("airport".tr) + ? "Best choice for a comfortable car with a flexible route and stop points. This airport offers visa entry at this price." + .tr + : 'Best choice for comfort car and flexible route and stops point' + .tr; + case 'Fixed Price': + return 'This trip goes directly from your starting point to your destination for a fixed price. The driver must follow the planned route' + .tr; + case 'Electric': + return 'Travel in a modern, silent electric car. A premium, eco-friendly choice for a smooth ride.' + .tr; + case 'Scooter': + case 'Van': + return "Spacious van service ideal for families and groups. Comfortable, safe, and cost-effective travel together." + .tr; + case 'Pink Bike': + return 'This is for delivery or a motorcycle.'.tr; + case 'Mishwar Vip': + return "Perfect for passengers seeking the latest car models with the freedom to choose any route they desire" + .tr; + case 'Awfar Car': + return "Old and affordable, perfect for budget rides.".tr; + case 'Lady': + return "This trip is for women only".tr; + case 'Rayeh Gai': + return "Rayeh Gai: Round trip service for convenient travel between cities, easy and reliable." + .tr; + default: + return ''; + } + } + + void _handleCarSelection(BuildContext context, + RideLifecycleController mapPassengerController, CarType carType) { + box.write(BoxName.carType, carType.carType); + mapPassengerController.totalPassenger = + _getOriginalPrice(carType, mapPassengerController); + if (carType.carType == 'Mishwar Vip') { + Navigator.of(context).pop(); + mapPassengerController.mishwariOption(); + } else if (carType.carType == 'Lady') { + if (box.read(BoxName.gender).toString() != '') { + mapPassengerController.isBottomSheetShown = false; + mapPassengerController.update(); + mapPassengerController.changeCashConfirmPageShown(); + } else { + MyDialog().getDialog('Idintify gender', + 'You should ideintify your gender for this type of trip!'.tr, () { + Get.to(() => PassengerProfilePage()); + }); + } + } else if (carType.carType == 'Rayeh Gai') { + Get.defaultDialog( + barrierDismissible: false, + title: "Select betweeen types".tr, + content: + Row(mainAxisAlignment: MainAxisAlignment.spaceBetween, children: [ + _buildRayehGaiOption(context, mapPassengerController, 'Awfar Car', + mapPassengerController.totalPassengerRayehGaiBalash), + _buildRayehGaiOption(context, mapPassengerController, 'Fixed Price', + mapPassengerController.totalPassengerRayehGai), + _buildRayehGaiOption(context, mapPassengerController, 'Comfort', + mapPassengerController.totalPassengerRayehGaiComfort) + ]), + cancel: MyElevatedButton( + kolor: AppColor.redColor, + title: 'Cancel'.tr, + onPressed: () => Navigator.of(context).pop()), + confirm: MyElevatedButton( + kolor: AppColor.greenColor, + title: 'Next'.tr, + onPressed: () { + mapPassengerController.isBottomSheetShown = false; + mapPassengerController.update(); + mapPassengerController.changeCashConfirmPageShown(); + })); + } else { + mapPassengerController.isBottomSheetShown = false; + mapPassengerController.update(); + mapPassengerController.changeCashConfirmPageShown(); + } + } + + double _getOriginalPrice( + CarType carType, RideLifecycleController mapPassengerController) { + switch (carType.carType) { + case 'Comfort': + return mapPassengerController.totalPassengerComfort; + case 'Fixed Price': + return mapPassengerController.totalPassengerSpeed; + case 'Electric': + return mapPassengerController.totalPassengerElectric; + case 'Awfar Car': + return mapPassengerController.totalPassengerBalash; + case 'Van': + return mapPassengerController.totalPassengerVan; + case 'Lady': + return mapPassengerController.totalPassengerLady; + default: + return 0.0; + } + } + + Widget _buildRayehGaiOption( + BuildContext context, + RideLifecycleController mapPassengerController, + String carTypeName, + double price) { + return GestureDetector( + onTap: () { + Navigator.of(context).pop(); + mapPassengerController.totalPassenger = price; + mapPassengerController.isBottomSheetShown = false; + mapPassengerController.update(); + mapPassengerController.changeCashConfirmPageShown(); + }, + child: Container( + decoration: AppStyle.boxDecoration1, + padding: const EdgeInsets.all(8.0), + child: Column(children: [ + Text(carTypeName.tr), + Text(price.toStringAsFixed(0)) + ])), + ); + } +} + +// ───────────────────────────────────────────────────────────────────────────── +// BURC MONEY WIDGET (Floating negative balance banner) +// ───────────────────────────────────────────────────────────────────────────── +class BurcMoney extends StatelessWidget { + const BurcMoney({super.key}); + + @override + Widget build(BuildContext context) { + return GetBuilder( + builder: (mapPassengerController) { + final passengerWallet = + double.tryParse(box.read(BoxName.passengerWalletTotal) ?? '0.0') ?? + 0.0; + + return mapPassengerController.data.isNotEmpty && + mapPassengerController.isBottomSheetShown && + !mapPassengerController.rideConfirm && + passengerWallet < 0.0 + ? Positioned( + bottom: Get.height * .41, + left: 16, + right: 16, + child: Container( + padding: const EdgeInsets.all(12), + decoration: BoxDecoration( + color: AppColor.redColor.withAlpha(220), + borderRadius: BorderRadius.circular(14), + boxShadow: [ + BoxShadow( + color: Colors.red.withAlpha(40), + blurRadius: 12, + offset: const Offset(0, 4), + ), + ], + ), + child: Row( + children: [ + const Icon( + Icons.warning_amber_rounded, + color: Colors.white, + size: 24, + ), + const SizedBox(width: 8), + Expanded( + child: Text.rich( + TextSpan( + children: [ + TextSpan( + text: '${'Negative Balance:'.tr} ', + style: AppStyle.subtitle.copyWith( + color: Colors.white, + fontWeight: FontWeight.bold, + ), + ), + TextSpan( + text: + '${'You have a balance of'.tr} ${passengerWallet.toStringAsFixed(2)} ${box.read(BoxName.countryCode) == 'Egypt' ? 'LE'.tr : 'SYP'.tr} ${'due to a previous trip.'.tr}', + style: AppStyle.subtitle.copyWith( + color: Colors.white, + ), + ), + ], + ), + textAlign: TextAlign.start, + ), + ), + const SizedBox(width: 8), + GestureDetector( + onTap: () async => + await Get.find().speakText( + '${'you have a negative balance of'.tr}${passengerWallet.toStringAsFixed(2)}${' in your'.tr} ${AppInformation.appName}${' wallet due to a previous trip.'.tr}'), + child: const Icon( + Icons.headphones, + color: Colors.white, + ), + ), + ], + ), + ), + ) + : const SizedBox(); + }, + ); + } +} diff --git a/siro_rider/lib/views/home/map_widget.dart/cash_confirm_bottom_page.dart b/siro_rider/lib/views/home/map_widget.dart/cash_confirm_bottom_page.dart new file mode 100644 index 0000000..2cfd875 --- /dev/null +++ b/siro_rider/lib/views/home/map_widget.dart/cash_confirm_bottom_page.dart @@ -0,0 +1,207 @@ +import 'package:flutter/material.dart'; +import 'package:get/get.dart'; +import 'package:siro_rider/constant/box_name.dart'; +import 'package:siro_rider/constant/style.dart'; +import 'package:siro_rider/views/home/my_wallet/passenger_wallet.dart'; + +import '../../../constant/colors.dart'; +import '../../../constant/info.dart'; +import '../../../controller/home/map/ride_lifecycle_controller.dart'; +import '../../../controller/payment/payment_controller.dart'; +import '../../../main.dart'; +import '../../widgets/elevated_btn.dart'; + +class CashConfirmPageShown extends StatelessWidget { + CashConfirmPageShown({super.key}); + final PaymentController paymentController = Get.put(PaymentController()); + + @override + Widget build(BuildContext context) { + return GetBuilder(builder: (controller) { + // شرط الإظهار الرئيسي لم يتغير + return Positioned( + bottom: 0, + left: 0, + right: 0, + child: AnimatedContainer( + duration: const Duration(milliseconds: 300), + curve: Curves.easeInOut, + // التحكم في ظهور اللوحة لم يتغير + transform: Matrix4.translationValues( + 0, controller.isCashConfirmPageShown ? 0 : Get.height, 0), + decoration: BoxDecoration( + color: AppColor.secondaryColor, + borderRadius: const BorderRadius.only( + topLeft: Radius.circular(24), + topRight: Radius.circular(24), + ), + boxShadow: [ + BoxShadow( + color: Colors.black.withOpacity(0.2), + blurRadius: 20, + ), + ], + ), + child: Padding( + padding: const EdgeInsets.all(20.0), + child: Column( + mainAxisSize: MainAxisSize.min, + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + // --- 1. رأس الصفحة --- + Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + Text( + 'Payment Method'.tr, + style: AppStyle.headTitle.copyWith(fontSize: 24), + ), + // زر الإغلاق (كان معلقاً في الكود القديم، تم تفعيله هنا) + IconButton( + onPressed: () => controller.changeCashConfirmPageShown(), + icon: Icon(Icons.close, color: AppColor.writeColor), + ), + ], + ), + const SizedBox(height: 16), + + // --- 2. بطاقات اختيار الدفع --- + GetBuilder(builder: (paymentCtrl) { + // نفس منطق تغيير اللون للسيارات النسائية + final bool isLadyRide = box.read(BoxName.carType) == 'Lady' || + box.read(BoxName.carType) == 'Pink Bike'; + final Color selectedColor = + isLadyRide ? Colors.pink.shade300 : AppColor.primaryColor; + + return Column( + children: [ + // بطاقة المحفظة + _buildPaymentOptionCard( + icon: Icons.account_balance_wallet_outlined, + title: '${AppInformation.appName} Balance'.tr, + subtitle: + '${'Balance:'.tr} ${box.read(BoxName.passengerWalletTotal) ?? '0.0'} ${'SYP'.tr}', + isSelected: paymentCtrl.isWalletChecked, + selectedColor: selectedColor, + onTap: () => + paymentCtrl.onChangedPaymentMethodWallet(true), + ), + const SizedBox(height: 12), + // بطاقة الكاش + _buildPaymentOptionCard( + icon: Icons.money_rounded, + title: 'Cash'.tr, + subtitle: 'Pay directly to the captain'.tr, + isSelected: paymentCtrl.isCashChecked, + selectedColor: selectedColor, + onTap: () => + paymentCtrl.onChangedPaymentMethodCash(true), + ), + ], + ); + }), + const SizedBox(height: 24), + + // --- 3. أزرار التأكيد (بنفس منطقك القديم تماماً) --- + GetBuilder(builder: (paymentCtrl) { + final bool isWalletSufficient = (double.tryParse( + box.read(BoxName.passengerWalletTotal) ?? '0') ?? + 0) >= + controller.totalPassenger; + + // إذا تم اختيار المحفظة والرصيد غير كافٍ + if (paymentCtrl.isWalletChecked && !isWalletSufficient) { + return Column( + crossAxisAlignment: CrossAxisAlignment.stretch, + children: [ + MyElevatedButton( + title: 'Top up Balance to continue'.tr, + onPressed: () => + Get.to(() => const PassengerWallet()), + kolor: AppColor.redColor, + ), + const SizedBox(height: 8), + TextButton( + onPressed: () => + paymentCtrl.onChangedPaymentMethodCash(true), + child: Text("Or pay with Cash instead".tr, + style: TextStyle(color: AppColor.primaryColor)), + ) + ], + ); + } + // في كل الحالات الأخرى (كاش، أو محفظة برصيد كافٍ) + else { + return MyElevatedButton( + title: 'Confirm & Find a Ride'.tr, + onPressed: () { + // --- نفس منطقك القديم بالضبط --- + controller.changeCashConfirmPageShown(); + // controller.isSearchingWindow = true; + controller.startSearchingForDriver(); + // controller.update(); + }, + ); + } + }), + ], + ), + ), + ), + ); + }); + } + + // --- ويدجت مساعدة لبناء بطاقة الدفع --- + Widget _buildPaymentOptionCard({ + required IconData icon, + required String title, + required String subtitle, + required bool isSelected, + required VoidCallback onTap, + required Color selectedColor, + }) { + return GestureDetector( + onTap: onTap, + child: AnimatedContainer( + duration: const Duration(milliseconds: 250), + padding: const EdgeInsets.all(16), + decoration: BoxDecoration( + color: isSelected + ? selectedColor.withOpacity(0.1) + : AppColor.writeColor.withOpacity(0.05), + borderRadius: BorderRadius.circular(12), + border: Border.all( + color: isSelected + ? selectedColor + : AppColor.writeColor.withOpacity(0.2), + width: isSelected ? 2.0 : 1.0, + ), + ), + child: Row( + children: [ + Icon(icon, + color: isSelected ? selectedColor : AppColor.writeColor, + size: 28), + const SizedBox(width: 16), + Expanded( + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Text(title, + style: + AppStyle.title.copyWith(fontWeight: FontWeight.bold)), + Text(subtitle, + style: AppStyle.subtitle.copyWith( + color: AppColor.writeColor.withOpacity(0.7))), + ], + ), + ), + if (isSelected) + Icon(Icons.check_circle_rounded, color: selectedColor, size: 24), + ], + ), + ), + ); + } +} diff --git a/siro_rider/lib/views/home/map_widget.dart/driver_card_from_passenger.dart b/siro_rider/lib/views/home/map_widget.dart/driver_card_from_passenger.dart new file mode 100644 index 0000000..48c0dd3 --- /dev/null +++ b/siro_rider/lib/views/home/map_widget.dart/driver_card_from_passenger.dart @@ -0,0 +1,106 @@ +import 'package:flutter/material.dart'; +import 'package:get/get.dart'; + +import '../../../constant/style.dart'; +import '../../../controller/home/map/ride_lifecycle_controller.dart'; +import 'hexegone_clipper.dart'; + +GetBuilder hexagonClipper() { + return GetBuilder( + builder: ((controller) => controller.rideConfirm + ? Positioned( + top: Get.height * .1, + left: Get.width * .1, + right: Get.width * .1, + child: ClipPath( + clipper: + HexagonClipper(), // CustomClipper to create a hexagon shape + child: AnimatedContainer( + duration: const Duration(microseconds: 300), + height: 250, + width: 250, + // decoration: AppStyle.boxDecoration, + // gradient: const LinearGradient( + // colors: [AppColor.greenColor, AppColor.secondaryColor], + // begin: Alignment.topLeft, + // end: Alignment.bottomCenter, + // ), + // border: Border.all(), + // color: AppColor.secondaryColor, + // borderRadius: BorderRadius.circular(15)), + child: Column( + mainAxisAlignment: MainAxisAlignment.center, + crossAxisAlignment: CrossAxisAlignment.center, + children: [ + Text( + 'Waiting for Driver ...'.tr, + style: AppStyle.title, + ), + // IconButton( + // onPressed: () { + // }, + // icon: const Icon(Icons.add), + // ), + // Text( + // controller.dataCarsLocationByPassenger['message'] + // [controller.carsOrder]['phone'] + // .toString(), + // style: AppStyle.title, + // ), + Row( + mainAxisAlignment: MainAxisAlignment.spaceEvenly, + children: [ + Text( + '${controller.dataCarsLocationByPassenger['message'][controller.carsOrder]['first_name']} ${controller.dataCarsLocationByPassenger['message'][controller.carsOrder]['last_name']}', + style: AppStyle.title, + ), + Text( + 'Age is '.tr + + controller + .dataCarsLocationByPassenger['message'] + [controller.carsOrder]['age'] + .toString(), + style: AppStyle.title, + ), + ], + ), + Row( + mainAxisAlignment: MainAxisAlignment.spaceEvenly, + children: [ + Text( + controller.dataCarsLocationByPassenger['message'] + [controller.carsOrder]['make'] + .toString(), + style: AppStyle.title, + ), + Text( + controller.dataCarsLocationByPassenger['message'] + [controller.carsOrder]['model'] + .toString(), + style: AppStyle.title, + ), + ], + ), + Text( + 'Rating is '.tr + + controller.dataCarsLocationByPassenger['message'] + [controller.carsOrder]['ratingDriver'] + .toString(), + style: AppStyle.title, + ), + Container( + decoration: BoxDecoration(border: Border.all(width: 2)), + child: Text( + controller.dataCarsLocationByPassenger['message'] + [controller.carsOrder]['car_plate'] + .toString(), + style: AppStyle.title, + ), + ), + ], + ), + ), + ), + ) + : const SizedBox())); +} diff --git a/siro_rider/lib/views/home/map_widget.dart/driver_time_arrive_passenger.dart b/siro_rider/lib/views/home/map_widget.dart/driver_time_arrive_passenger.dart new file mode 100644 index 0000000..7f24f65 --- /dev/null +++ b/siro_rider/lib/views/home/map_widget.dart/driver_time_arrive_passenger.dart @@ -0,0 +1,51 @@ +import 'package:flutter/material.dart'; +import 'package:get/get.dart'; +import 'package:intl/intl.dart'; +// import 'package:intl/intl.dart'; + +import '../../../constant/style.dart'; +import '../../../controller/home/map/ride_lifecycle_controller.dart'; + +class DriverTimeArrivePassengerPage extends StatelessWidget { + const DriverTimeArrivePassengerPage({super.key}); + + @override + Widget build(BuildContext context) { + return GetBuilder( + builder: (controller) { + return controller.remainingTime == 0 + ? Positioned( + bottom: Get.height * .35, + right: Get.width * .05, + child: Stack( + alignment: Alignment.center, + children: [ + Container( + decoration: AppStyle.boxDecoration, + // width: 50, + // height: 50, + child: Padding( + padding: const EdgeInsetsDirectional.only( + start: 5, end: 5), + child: Column( + children: [ + Text( + controller.durationByPassenger.toString() + + ' to arrive you.'.tr, + style: AppStyle.title, + ), + Text( + " ${DateFormat('h:mm a').format(controller.newTime)}", + style: AppStyle.title, + ), + ], + ), + )) + ], + ), + ) + : const SizedBox(); + }, + ); + } +} diff --git a/siro_rider/lib/views/home/map_widget.dart/form_search_places_destenation.dart b/siro_rider/lib/views/home/map_widget.dart/form_search_places_destenation.dart new file mode 100644 index 0000000..224323b --- /dev/null +++ b/siro_rider/lib/views/home/map_widget.dart/form_search_places_destenation.dart @@ -0,0 +1,496 @@ +import 'package:siro_rider/print.dart'; +import 'package:siro_rider/views/widgets/mydialoug.dart'; +import 'dart:async'; + +import 'package:flutter/material.dart'; +import 'package:get/get.dart'; +import 'package:intaleq_maps/intaleq_maps.dart'; +import 'package:siro_rider/constant/box_name.dart'; +import 'package:siro_rider/constant/table_names.dart'; +import 'package:siro_rider/views/widgets/elevated_btn.dart'; + +import '../../../constant/colors.dart'; +import '../../../constant/style.dart'; +import '../../../controller/functions/toast.dart'; +import '../../../controller/home/map/location_search_controller.dart'; +import '../../../controller/home/map/map_engine_controller.dart'; +import '../../../controller/home/map/ride_lifecycle_controller.dart'; +import '../../../controller/home/map/ride_state.dart'; +import '../../../main.dart'; + +// --------------------------------------------------- +// -- Widget for Destination Point Search (Optimized) -- +// --------------------------------------------------- + +GetBuilder formSearchPlacesDestenation() { + final String addWorkValue = + box.read(BoxName.addWork)?.toString() ?? 'addWork'; + final String addHomeValue = + box.read(BoxName.addHome)?.toString() ?? 'addHome'; + + if (addWorkValue.isEmpty || addHomeValue.isEmpty) { + box.write(BoxName.addWork, 'addWork'); + box.write(BoxName.addHome, 'addHome'); + } + + return GetBuilder( + id: 'destination_form', + builder: (controller) { + final mapEngine = Get.find(); + final rideLifecycle = Get.find(); + return Column( + children: [ + _SearchField( + controller: controller, + mapEngine: mapEngine, + rideLifecycle: rideLifecycle, + ), + _QuickActions( + controller: controller, + mapEngine: mapEngine, + rideLifecycle: rideLifecycle, + addWorkValue: addWorkValue, + addHomeValue: addHomeValue, + ), + _SearchResults( + controller: controller, + mapEngine: mapEngine, + rideLifecycle: rideLifecycle, + ), + ], + ); + }, + ); +} + +// --------------------------------------------------- +// -- Private Helper Widgets for Cleaner Code -- +// --------------------------------------------------- + +class _SearchField extends StatefulWidget { + final LocationSearchController controller; + final MapEngineController mapEngine; + final RideLifecycleController rideLifecycle; + + const _SearchField({ + required this.controller, + required this.mapEngine, + required this.rideLifecycle, + }); + + @override + State<_SearchField> createState() => _SearchFieldState(); +} + +class _SearchFieldState extends State<_SearchField> { + Timer? _debounce; + + void _onTextChanged() { + if (mounted) { + setState(() {}); + } + } + + @override + void initState() { + super.initState(); + widget.controller.placeDestinationController.addListener(_onTextChanged); + } + + void _onSearchChanged(String query) { + if (_debounce?.isActive ?? false) _debounce!.cancel(); + _debounce = Timer(const Duration(milliseconds: 500), () { + if (query.length > 2) { + widget.controller.getPlaces(); + widget.mapEngine.changeHeightPlaces(); + } else if (query.isEmpty) { + widget.controller.clearPlacesDestination(); + widget.mapEngine.changeHeightPlaces(); + } + }); + } + + @override + void dispose() { + _debounce?.cancel(); + widget.controller.placeDestinationController.removeListener(_onTextChanged); + super.dispose(); + } + + @override + Widget build(BuildContext context) { + return Padding( + padding: const EdgeInsets.symmetric(horizontal: 16.0, vertical: 8.0), + child: Row( + children: [ + Expanded( + child: TextFormField( + controller: widget.controller.placeDestinationController, + onChanged: _onSearchChanged, + decoration: InputDecoration( + hintText: widget.controller.hintTextDestinationPoint, + hintStyle: AppStyle.subtitle.copyWith(color: Colors.grey[600]), + prefixIcon: Icon(Icons.search, color: AppColor.primaryColor), + suffixIcon: widget + .controller.placeDestinationController.text.isNotEmpty + ? IconButton( + icon: Icon(Icons.clear, color: Colors.grey[400]), + onPressed: () { + widget.controller.placeDestinationController.clear(); + }, + ) + : null, + contentPadding: const EdgeInsets.symmetric( + horizontal: 16.0, vertical: 10.0), + border: OutlineInputBorder( + borderRadius: BorderRadius.circular(8.0), + borderSide: BorderSide.none, + ), + focusedBorder: OutlineInputBorder( + borderRadius: BorderRadius.circular(8.0), + borderSide: BorderSide(color: AppColor.primaryColor), + ), + filled: true, + fillColor: Colors.grey[50], + ), + ), + ), + const SizedBox(width: 8.0), + IconButton( + onPressed: () { + widget.mapEngine.changeMainBottomMenuMap(); + widget.mapEngine.changePickerShown(); + }, + icon: Icon(Icons.location_on_outlined, + color: AppColor.accentColor, size: 30), + tooltip: widget.rideLifecycle.isAnotherOreder + ? 'Pick destination on map'.tr + : 'Pick on map'.tr, + ), + ], + ), + ); + } +} + +class _QuickActions extends StatelessWidget { + final LocationSearchController controller; + final MapEngineController mapEngine; + final RideLifecycleController rideLifecycle; + final String addWorkValue; + final String addHomeValue; + + const _QuickActions({ + required this.controller, + required this.mapEngine, + required this.rideLifecycle, + required this.addWorkValue, + required this.addHomeValue, + }); + + @override + Widget build(BuildContext context) { + return Padding( + padding: const EdgeInsets.symmetric(horizontal: 16.0, vertical: 8.0), + child: Row( + mainAxisAlignment: MainAxisAlignment.spaceAround, + children: [ + _buildQuickActionButton( + icon: Icons.work_outline, + text: addWorkValue == 'addWork' ? 'Add Work'.tr : 'To Work'.tr, + onTap: () { + if (addWorkValue == 'addWork') { + controller.workLocationFromMap = true; + mapEngine.changeMainBottomMenuMap(); + mapEngine.changePickerShown(); + } else { + _handleQuickAction( + controller, + mapEngine, + rideLifecycle, + BoxName.addWork, + 'To Work', + ); + } + }, + onLongPress: () => + _showChangeLocationDialog(controller, mapEngine, 'Work'), + ), + _buildQuickActionButton( + icon: Icons.home_outlined, + text: addHomeValue == 'addHome' ? 'Add Home'.tr : 'To Home'.tr, + onTap: () { + if (addHomeValue == 'addHome') { + controller.homeLocationFromMap = true; + mapEngine.changeMainBottomMenuMap(); + mapEngine.changePickerShown(); + } else { + _handleQuickAction( + controller, + mapEngine, + rideLifecycle, + BoxName.addHome, + 'To Home', + ); + } + }, + onLongPress: () => + _showChangeLocationDialog(controller, mapEngine, 'Home'), + ), + ], + ), + ); + } +} + +class _SearchResults extends StatelessWidget { + final LocationSearchController controller; + final MapEngineController mapEngine; + final RideLifecycleController rideLifecycle; + + const _SearchResults({ + required this.controller, + required this.mapEngine, + required this.rideLifecycle, + }); + + @override + Widget build(BuildContext context) { + return GetBuilder( + id: 'places_list', + builder: (locCtrl) { + return AnimatedContainer( + duration: const Duration(milliseconds: 200), + height: locCtrl.placesDestination.isNotEmpty ? 300 : 0, + decoration: BoxDecoration( + color: Colors.white, + borderRadius: BorderRadius.circular(8.0), + ), + margin: const EdgeInsets.symmetric(horizontal: 16.0), + child: ListView.separated( + shrinkWrap: true, + physics: const ClampingScrollPhysics(), + itemCount: locCtrl.placesDestination.length, + separatorBuilder: (context, index) => + const Divider(height: 1, color: Colors.grey), + itemBuilder: (BuildContext context, int index) { + final res = locCtrl.placesDestination[index]; + final title = res['name_ar'] ?? res['name'] ?? 'Unknown Place'; + final address = res['address'] ?? 'Details not available'; + final latitude = res['latitude']; + final longitude = res['longitude']; + + return ListTile( + leading: const Icon(Icons.place, size: 30, color: Colors.grey), + title: Text( + title, + style: + AppStyle.subtitle.copyWith(fontWeight: FontWeight.w500), + ), + subtitle: Text( + address, + style: TextStyle(color: Colors.grey[600], fontSize: 12), + ), + trailing: IconButton( + icon: const Icon(Icons.favorite_border, color: Colors.grey), + onPressed: () => _handleAddToFavorites( + context, latitude, longitude, title), + ), + onTap: () => _handlePlaceSelection( + controller, + mapEngine, + rideLifecycle, + latitude, + longitude, + title, + index, + ), + ); + }, + ), + ); + }, + ); + } + + Future _handleAddToFavorites(BuildContext context, dynamic latitude, + dynamic longitude, String title) async { + if (latitude != null && longitude != null) { + await sql.insertMapLocation({ + 'latitude': latitude, + 'longitude': longitude, + 'name': title, + 'rate': 'N/A', + }, TableName.placesFavorite); + + Toast.show( + context, + '$title ${'Saved Successfully'.tr}', + AppColor.primaryColor, + ); + } else { + Toast.show( + context, + 'Invalid location data', + AppColor.redColor, + ); + } + } + + Future _handlePlaceSelection( + LocationSearchController controller, + MapEngineController mapEngine, + RideLifecycleController rideLifecycle, + dynamic latitude, + dynamic longitude, + String title, + int index) async { + if (latitude == null || longitude == null) { + Toast.show(Get.context!, 'Invalid location data', AppColor.redColor); + return; + } + + await sql.insertMapLocation({ + 'latitude': latitude, + 'longitude': longitude, + 'name': title, + 'rate': 'N/A', + 'createdAt': DateTime.now().toIso8601String(), + }, TableName.recentLocations); + + final destLatLng = LatLng( + double.parse(latitude.toString()), double.parse(longitude.toString())); + + if (rideLifecycle.isAnotherOreder) { + await _handleAnotherOrderSelection( + controller, mapEngine, rideLifecycle, destLatLng); + } else { + _handleRegularOrderSelection( + controller, mapEngine, rideLifecycle, destLatLng, index); + } + } + + Future _handleAnotherOrderSelection( + LocationSearchController controller, + MapEngineController mapEngine, + RideLifecycleController rideLifecycle, + LatLng destination) async { + controller.myDestination = destination; + controller.clearPlacesDestination(); + + await rideLifecycle.getDirectionMap( + '${controller.passengerLocation.latitude},${controller.passengerLocation.longitude}', + '${controller.myDestination.latitude},${controller.myDestination.longitude}'); + + mapEngine.isPickerShown = false; + controller.passengerStartLocationFromMap = false; + mapEngine.changeMainBottomMenuMap(); + rideLifecycle.showBottomSheet1(); + } + + void _handleRegularOrderSelection( + LocationSearchController controller, + MapEngineController mapEngine, + RideLifecycleController rideLifecycle, + LatLng destination, + int index) { + controller.passengerLocation = controller.newMyLocation; + controller.myDestination = destination; + controller.convertHintTextDestinationNewPlaces(index); + + controller.clearPlacesDestination(); + + mapEngine.changeMainBottomMenuMap(); + controller.passengerStartLocationFromMap = true; + mapEngine.isPickerShown = true; + + rideLifecycle.getDirectionMap( + '${controller.passengerLocation.latitude},${controller.passengerLocation.longitude}', + '${controller.myDestination.latitude},${controller.myDestination.longitude}'); + } +} + +Widget _buildQuickActionButton({ + required IconData icon, + required String text, + VoidCallback? onTap, + VoidCallback? onLongPress, +}) { + return InkWell( + onTap: onTap, + onLongPress: onLongPress, + child: Container( + padding: const EdgeInsets.all(8.0), + decoration: BoxDecoration( + color: AppColor.cyanBlue.withOpacity(0.1), + borderRadius: BorderRadius.circular(8.0), + border: Border.all(color: AppColor.cyanBlue.withOpacity(0.3)), + ), + child: Column( + mainAxisSize: MainAxisSize.min, + children: [ + Icon(icon, color: AppColor.cyanBlue), + const SizedBox(height: 4.0), + Text( + text, + textAlign: TextAlign.center, + style: AppStyle.title.copyWith( + color: AppColor.cyanBlue, fontWeight: FontWeight.w500), + ), + ], + ), + ), + ); +} + +void _showChangeLocationDialog(LocationSearchController controller, + MapEngineController mapEngine, String locationType) { + MyDialog().getDialog( + locationType == 'Work' + ? 'Change Work location ?'.tr + : 'Change Home location ?'.tr, + '', + () { + if (locationType == 'Work') { + controller.workLocationFromMap = true; + } else { + controller.homeLocationFromMap = true; + } + mapEngine.changeMainBottomMenuMap(); + mapEngine.changePickerShown(); + }, + ); +} + +void _handleQuickAction( + LocationSearchController controller, + MapEngineController mapEngine, + RideLifecycleController rideLifecycle, + String boxName, + String hintText) async { + try { + final locationString = box.read(boxName).toString(); + final parts = locationString.split(','); + final latLng = LatLng( + double.parse(parts[0]), + double.parse(parts[1]), + ); + + controller.hintTextDestinationPoint = hintText; + mapEngine.changeMainBottomMenuMap(); + + await rideLifecycle.getDirectionMap( + '${controller.passengerLocation.latitude},${controller.passengerLocation.longitude}', + '${latLng.latitude},${latLng.longitude}', + ); + + controller.currentLocationToFormPlaces = false; + controller.clearPlacesDestination(); + controller.passengerStartLocationFromMap = false; + mapEngine.isPickerShown = false; + rideLifecycle.showBottomSheet1(); + } catch (e) { + Log.print("Error handling quick action: $e"); + Toast.show(Get.context!, "Failed to get location".tr, AppColor.redColor); + } +} diff --git a/siro_rider/lib/views/home/map_widget.dart/form_search_start.dart b/siro_rider/lib/views/home/map_widget.dart/form_search_start.dart new file mode 100644 index 0000000..4fd7b05 --- /dev/null +++ b/siro_rider/lib/views/home/map_widget.dart/form_search_start.dart @@ -0,0 +1,125 @@ +import 'package:flutter/material.dart'; +import 'package:get/get.dart'; +import 'package:intaleq_maps/intaleq_maps.dart'; + +import '../../../constant/colors.dart'; +import '../../../constant/style.dart'; +import '../../../controller/home/map/location_search_controller.dart'; +import '../../../controller/home/map/map_engine_controller.dart'; + +// --------------------------------------------------- +// -- Widget for Start Point Search (Updated) -- +// --------------------------------------------------- + +GetBuilder formSearchPlacesStart() { + return GetBuilder( + id: 'start_point_form', + builder: (controller) { + final mapEngine = Get.find(); + return Column( + children: [ + Padding( + padding: const EdgeInsets.symmetric(horizontal: 16.0, vertical: 8.0), + child: Row( + children: [ + Expanded( + child: TextFormField( + controller: controller.placeStartController, + onChanged: (value) { + if (controller.placeStartController.text.length > 2) { + controller.getPlacesStart(); + } else if (controller.placeStartController.text.isEmpty) { + controller.clearPlacesStart(); + } + }, + decoration: InputDecoration( + hintText: 'Search for a starting point'.tr, + hintStyle: + AppStyle.subtitle.copyWith(color: Colors.grey[600]), + prefixIcon: + Icon(Icons.search, color: AppColor.primaryColor), + suffixIcon: controller.placeStartController.text.isNotEmpty + ? IconButton( + icon: Icon(Icons.clear, color: Colors.grey[400]), + onPressed: () { + controller.placeStartController.clear(); + controller.clearPlacesStart(); + }, + ) + : null, + contentPadding: const EdgeInsets.symmetric( + horizontal: 16.0, vertical: 10.0), + border: OutlineInputBorder( + borderRadius: BorderRadius.circular(8.0), + borderSide: BorderSide.none, + ), + focusedBorder: OutlineInputBorder( + borderRadius: BorderRadius.circular(8.0), + borderSide: BorderSide(color: AppColor.primaryColor), + ), + filled: true, + fillColor: Colors.grey[50], + ), + ), + ), + const SizedBox(width: 8.0), + IconButton( + onPressed: () { + controller.passengerStartLocationFromMap = true; + mapEngine.changeMainBottomMenuMap(); + mapEngine.changePickerShown(); + }, + icon: Icon(Icons.location_on_outlined, + color: AppColor.accentColor, size: 30), + tooltip: 'Pick start point on map'.tr, + ), + ], + ), + ), + AnimatedContainer( + duration: const Duration(milliseconds: 200), + height: controller.placesStart.isNotEmpty ? 300 : 0, + decoration: BoxDecoration( + color: Colors.white, + borderRadius: BorderRadius.circular(8.0), + ), + margin: const EdgeInsets.symmetric(horizontal: 16.0), + child: ListView.separated( + shrinkWrap: true, + physics: const ClampingScrollPhysics(), + itemCount: controller.placesStart.length, + separatorBuilder: (context, index) => + const Divider(height: 1, color: Colors.grey), + itemBuilder: (BuildContext context, int index) { + var res = controller.placesStart[index]; + var title = res['name_ar'] ?? res['name'] ?? 'Unknown Place'; + var address = res['address'] ?? 'Details not available'; + + return ListTile( + leading: const Icon(Icons.place, size: 30, color: Colors.grey), + title: Text(title, + style: AppStyle.subtitle + .copyWith(fontWeight: FontWeight.w500)), + subtitle: Text(address, + style: TextStyle(color: Colors.grey[600], fontSize: 12)), + onTap: () { + var latitude = res['latitude']; + var longitude = res['longitude']; + if (latitude != null && longitude != null) { + controller.passengerLocation = + LatLng(double.parse(latitude), double.parse(longitude)); + controller.placeStartController.text = title; + controller.clearPlacesStart(); + mapEngine.changeMainBottomMenuMap(); + controller.update(); + } + }, + ); + }, + ), + ), + ], + ); + }, + ); +} diff --git a/siro_rider/lib/views/home/map_widget.dart/form_serch_multiy_point.dart b/siro_rider/lib/views/home/map_widget.dart/form_serch_multiy_point.dart new file mode 100644 index 0000000..84312af --- /dev/null +++ b/siro_rider/lib/views/home/map_widget.dart/form_serch_multiy_point.dart @@ -0,0 +1,186 @@ +import 'package:flutter/material.dart'; +import 'package:get/get.dart'; +import 'package:siro_rider/constant/table_names.dart'; +import 'package:intaleq_maps/intaleq_maps.dart'; + +import '../../../constant/colors.dart'; +import '../../../constant/style.dart'; +import '../../../controller/functions/toast.dart'; +import '../../../controller/home/map/location_search_controller.dart'; +import '../../../controller/home/map/map_engine_controller.dart'; +import '../../../controller/home/map/ride_lifecycle_controller.dart'; +import '../../../main.dart'; + +GetBuilder formSearchPlaces(int index) { + return GetBuilder( + builder: (controller) { + final mapEngine = Get.find(); + final rideLifecycle = Get.find(); + return Column( + children: [ + Padding( + padding: const EdgeInsets.all(16), + child: Container( + decoration: BoxDecoration(color: AppColor.secondaryColor), + child: TextField( + decoration: InputDecoration( + border: const OutlineInputBorder( + borderRadius: BorderRadius.only(), + gapPadding: 4, + borderSide: BorderSide( + color: AppColor.redColor, + width: 2, + )), + suffixIcon: const Icon(Icons.search), + hintText: controller.hintTextwayPoint0.tr, + hintStyle: AppStyle.title, + hintMaxLines: 1, + prefixIcon: IconButton( + onPressed: () { + controller.allTextEditingPlaces[index].clear(); + controller.clearPlaces(index); + }, + icon: Icon( + Icons.clear, + color: Colors.red[300], + ), + ), + ), + controller: controller.allTextEditingPlaces[index], + onChanged: (value) { + if (controller.allTextEditingPlaces[index].text.length > 5) { + controller.getPlacesListsWayPoint(index); + mapEngine.changeHeightPlacesAll(index); + } + }, + ), + ), + ), + controller.placeListResponseAll[index].isEmpty + ? InkWell( + onTap: () { + controller.startLocationFromMapAll[index] = true; + controller.wayPointIndex = index; + Get.back(); + mapEngine.changeWayPointStopsSheet(); + mapEngine.changePickerShown(); + }, + child: Text( + 'Choose from Map'.tr + ' $index'.tr, + style: + AppStyle.title.copyWith(color: AppColor.blueColor), + ), + ) + : const SizedBox(), + Container( + height: controller.placeListResponseAll[index].isNotEmpty + ? mapEngine.height + : 0, + color: AppColor.secondaryColor, + child: ListView.builder( + itemCount: controller.placeListResponseAll[index].length, + itemBuilder: (BuildContext context, int i) { + var res = controller.placeListResponseAll[index][i]; + return InkWell( + onTap: () async { + final double lat = res['geometry']['location']['lat']; + final double lng = res['geometry']['location']['lng']; + final String placeName = res['name'].toString(); + final selectedLatLng = LatLng(lat, lng); + + mapEngine.changeHeightPlaces(); + + if (controller.currentLocationToFormPlacesAll[index] == + true) { + controller.newStartPointLocation = + rideLifecycle.passengerLocation; + } else { + rideLifecycle.passengerLocation = + controller.newStartPointLocation; + } + + controller.menuWaypoints[index] = selectedLatLng; + controller.menuWaypointNames[index] = placeName; + + controller.convertHintTextPlaces(index, res); + + final String start = + '${rideLifecycle.passengerLocation.latitude},${rideLifecycle.passengerLocation.longitude}'; + final String dest = + '${rideLifecycle.myDestination.latitude},${rideLifecycle.myDestination.longitude}'; + + await rideLifecycle.getDirectionMap(start, dest); + }, + child: Padding( + padding: const EdgeInsets.symmetric(horizontal: 10), + child: Column( + children: [ + Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + Column( + children: [ + Image.network( + res['icon'], + width: 20, + ), + IconButton( + onPressed: () async { + await sql.insertMapLocation({ + 'latitude': res['geometry'] + ['location']['lat'], + 'longitude': res['geometry'] + ['location']['lng'], + 'name': res['name'].toString(), + 'rate': res['rating'].toString(), + }, TableName.placesFavorite); + Toast.show( + context, + '${res['name']} ${'Saved Sucssefully'.tr}', + AppColor.primaryColor); + }, + icon: const Icon(Icons.favorite_border), + ), + ], + ), + Column( + children: [ + Text( + res['name'].toString(), + style: AppStyle.title, + ), + Text( + res['vicinity'].toString(), + style: AppStyle.subtitle, + ), + ], + ), + Column( + children: [ + Text( + 'rate', + style: AppStyle.subtitle, + ), + Text( + res['rating'].toString(), + style: AppStyle.subtitle, + ), + ], + ), + ], + ), + const Divider( + thickness: 1, + ) + ], + ), + ), + ); + }, + ), + ) + ], + ); + }, + ); +} diff --git a/siro_rider/lib/views/home/map_widget.dart/google_map_passenger_widget.dart b/siro_rider/lib/views/home/map_widget.dart/google_map_passenger_widget.dart new file mode 100644 index 0000000..bead74f --- /dev/null +++ b/siro_rider/lib/views/home/map_widget.dart/google_map_passenger_widget.dart @@ -0,0 +1,84 @@ +import 'package:siro_rider/print.dart'; +import 'package:flutter/material.dart'; +import 'package:siro_rider/env/env.dart'; +import 'package:get/get.dart'; +import 'package:intaleq_maps/intaleq_maps.dart'; +import 'package:siro_rider/controller/home/points_for_rider_controller.dart'; +import 'package:siro_rider/services/offline_map_service.dart'; + +import '../../../controller/home/map/location_search_controller.dart'; +import '../../../controller/home/map/map_engine_controller.dart'; +import '../../../controller/home/map/nearby_drivers_controller.dart'; +import '../../../controller/home/map/ride_lifecycle_controller.dart'; +import '../../widgets/mycircular.dart'; +import '../../widgets/mydialoug.dart'; + +class GoogleMapPassengerWidget extends StatelessWidget { + GoogleMapPassengerWidget({super.key}); + + final WayPointController wayPointController = Get.find(); + + @override + Widget build(BuildContext context) { + final locationSearch = Get.find(); + final rideLifecycle = Get.find(); + final nearbyDrivers = Get.find(); + + return GetBuilder( + builder: (controller) => rideLifecycle.isLoading + ? const MyCircularProgressIndicator() + : Positioned( + bottom: Get.height * .2, + top: 0, + left: 0, + right: 0, + child: IntaleqMap( + apiKey: Env.mapSaasKey, + styleUrl: Get.isDarkMode + ? 'assets/style_dark.json' + : 'assets/style.json', + onMapCreated: controller.onMapCreated, + onStyleLoaded: controller.onStyleLoaded, + onCameraMove: locationSearch.onCameraMoveThrottled, + onCameraIdle: () { + if (controller.mapController != null) { + final position = controller.mapController!.cameraPosition; + if (position != null) { + Log.print('✅ onCameraIdle targeted: ${position.target}'); + locationSearch + .updateCurrentLocationFromCamera(position.target); + OfflineMapService.instance + .downloadRegion(position.target, radiusKm: 1.0); + } else { + Log.print('⚠️ onCameraIdle: cameraPosition is NULL'); + } + } else { + Log.print('⚠️ onCameraIdle: mapController is NULL'); + } + }, + markers: controller.markers, + polylines: controller.polyLines, + polygons: controller.polygons, + circles: controller.circles, + initialCameraPosition: CameraPosition( + target: locationSearch.passengerLocation, + zoom: nearbyDrivers.lowPerf ? 14.5 : 15, + ), + myLocationEnabled: true, + onTap: (latlng) => controller.hidePlaces(), + onLongPress: (latlng) { + MyDialog().getDialog('Are you want to go to this site'.tr, '', + () async { + controller.clearPolyline(); + rideLifecycle.getDirectionMap( + '${locationSearch.passengerLocation.latitude},${locationSearch.passengerLocation.longitude}', + '${latlng.latitude},${latlng.longitude}', + ); + rideLifecycle.showBottomSheet1(); + }); + }, + ), + ), + ); + } +} diff --git a/siro_rider/lib/views/home/map_widget.dart/hexegone_clipper.dart b/siro_rider/lib/views/home/map_widget.dart/hexegone_clipper.dart new file mode 100644 index 0000000..8cd0555 --- /dev/null +++ b/siro_rider/lib/views/home/map_widget.dart/hexegone_clipper.dart @@ -0,0 +1,52 @@ +import 'dart:math'; + +import 'package:flutter/material.dart'; + +class HexagonClipper extends CustomClipper { + @override + Path getClip(Size size) { + final path = Path(); + final height = size.height; + final width = size.width; + final centerX = width / 2; + final centerY = height / 2; + final radius = width / 2; + + const angle = 2 * pi / 10; // Angle between each side of the hexagon + + // Start at the top right vertex of the hexagon + final startX = centerX + radius * cos(0); + final startY = centerY + radius * sin(0); + path.moveTo(startX, startY); + + // Draw the remaining sides of the hexagon + for (int i = 1; i < 10; i++) { + final x = centerX + radius * cos(angle * i); + final y = centerY + radius * sin(angle * i); + path.lineTo(x, y); + } + + path.close(); + + return path; + } + + @override + bool shouldReclip(HexagonClipper oldClipper) => false; +} + +class ArrowClipper extends CustomClipper { + @override + Path getClip(Size size) { + final path = Path(); + path.moveTo(0, size.height / 2); + path.lineTo(size.width / 2, 0); + path.lineTo(size.width, size.height / 2); + path.lineTo(size.width / 2, size.height); + path.close(); + return path; + } + + @override + bool shouldReclip(ArrowClipper oldClipper) => false; +} diff --git a/siro_rider/lib/views/home/map_widget.dart/left_main_menu_icons.dart b/siro_rider/lib/views/home/map_widget.dart/left_main_menu_icons.dart new file mode 100644 index 0000000..a12bc27 --- /dev/null +++ b/siro_rider/lib/views/home/map_widget.dart/left_main_menu_icons.dart @@ -0,0 +1,134 @@ +import 'dart:math'; + +import 'package:siro_rider/views/widgets/elevated_btn.dart'; +import 'package:siro_rider/views/widgets/mycircular.dart'; +import 'package:flutter/material.dart'; +import 'package:flutter_font_icons/flutter_font_icons.dart'; +import 'package:get/get.dart'; +import 'package:intaleq_maps/intaleq_maps.dart'; +import 'dart:ui'; + +import '../../../constant/colors.dart'; +import '../../../controller/home/map/location_search_controller.dart'; +import '../../../controller/home/map/map_engine_controller.dart'; +import '../../../controller/home/vip_waitting_page.dart'; +import '../navigation/navigation_view.dart'; + +// --- الدالة الرئيسية بالتصميم الجديد --- +GetBuilder leftMainMenuIcons() { + return GetBuilder( + builder: (controller) { + final locationSearch = Get.find(); + return Positioned( + top: Get.height * .01, + left: 0, + right: 0, + child: Center( + child: ClipRRect( + borderRadius: BorderRadius.circular(50.0), + child: BackdropFilter( + filter: ImageFilter.blur(sigmaX: 8.0, sigmaY: 8.0), + child: AnimatedContainer( + duration: const Duration(milliseconds: 300), + padding: const EdgeInsets.symmetric(horizontal: 8), + decoration: BoxDecoration( + color: AppColor.secondaryColor.withValues(alpha: 0.4), + borderRadius: BorderRadius.circular(50.0), + border: Border.all(color: AppColor.secondaryColor), + ), + child: Row( + mainAxisAlignment: MainAxisAlignment.center, + mainAxisSize: MainAxisSize.min, + children: [ + _buildMapActionButton( + icon: Icons.near_me_outlined, + tooltip: 'Toggle Map Type', + onPressed: () => Get.to(() => NavigationView()), + ), + _buildVerticalDivider(), + _buildMapActionButton( + icon: Icons.my_location_rounded, + tooltip: 'Go to My Location', + onPressed: () { + controller.mapController?.animateCamera( + CameraUpdate.newLatLng( + LatLng( + locationSearch.passengerLocation.latitude, + locationSearch.passengerLocation.longitude, + ), + ), + ); + }, + ), + _buildVerticalDivider(), + _buildMapActionButton( + icon: Octicons.watch, + tooltip: 'VIP Waiting Page', + onPressed: () => Get.to(() => VipWaittingPage()), + ), + ], + ), + ), + ), + ), + ), + ); + }, + ); +} + +Widget _buildMapActionButton({ + required IconData icon, + required String tooltip, + required VoidCallback onPressed, +}) { + return IconButton( + onPressed: onPressed, + icon: Icon(icon, color: AppColor.writeColor, size: 22), + tooltip: tooltip, + splashRadius: 22, + padding: const EdgeInsets.all(12), + constraints: const BoxConstraints(), + ); +} + +Widget _buildVerticalDivider() { + return Container( + height: 20, + width: 1, + color: AppColor.writeColor.withValues(alpha: 0.2), + ); +} + +class TestPage extends StatelessWidget { + const TestPage({super.key}); + + @override + Widget build(BuildContext context) { + return Scaffold( + appBar: AppBar( + title: const Text('iOS Live Activity Test'), + ), + body: Padding( + padding: const EdgeInsets.all(16.0), + child: Column( + mainAxisAlignment: MainAxisAlignment.center, + children: [ + MyCircularProgressIndicator(), + MyElevatedButton( + title: 'title', + onPressed: () {}, + ), + ElevatedButton( + style: ElevatedButton.styleFrom( + backgroundColor: Colors.red, + ), + onPressed: () async {}, + child: const Text('End Activity'), + ), + ], + ), + ), + ); + } +} diff --git a/siro_rider/lib/views/home/map_widget.dart/main_bottom_Menu_map.dart b/siro_rider/lib/views/home/map_widget.dart/main_bottom_Menu_map.dart new file mode 100644 index 0000000..50fe76d --- /dev/null +++ b/siro_rider/lib/views/home/map_widget.dart/main_bottom_Menu_map.dart @@ -0,0 +1,1172 @@ +import 'package:siro_rider/print.dart'; +import 'package:siro_rider/views/widgets/my_textField.dart'; +import 'package:flutter/cupertino.dart'; +import 'package:flutter/material.dart'; +import 'package:get/get.dart'; +import 'package:siro_rider/constant/box_name.dart'; +import 'package:siro_rider/constant/style.dart'; +import 'package:siro_rider/controller/home/map/map_engine_controller.dart'; +import 'package:siro_rider/controller/home/map/location_search_controller.dart'; +import 'package:siro_rider/controller/home/map/ride_lifecycle_controller.dart'; +import 'package:siro_rider/main.dart'; +import 'package:siro_rider/views/home/map_widget.dart/form_search_places_destenation.dart'; +import 'package:siro_rider/views/widgets/elevated_btn.dart'; +import 'package:intaleq_maps/intaleq_maps.dart'; +import '../../../constant/colors.dart'; +import '../../../constant/table_names.dart'; +import '../../widgets/error_snakbar.dart'; +import '../../widgets/mydialoug.dart'; +import 'form_search_start.dart'; + +// ─── Design Tokens (Modern & Dynamic) ──────────────────────────────────────── + +class _D { + static const double radiusCard = 28; + static const double radiusChip = 20; + static const double radiusInner = 14; + static const double radiusPill = 50; + + static List get cardShadow => [ + BoxShadow( + color: Colors.black.withValues(alpha: 0.08), + blurRadius: 40, + spreadRadius: -8, + offset: const Offset(0, 12), + ), + BoxShadow( + color: Colors.black.withValues(alpha: 0.04), + blurRadius: 16, + spreadRadius: -4, + offset: const Offset(0, 4), + ), + ]; + + static List glowShadow(Color c, {double intensity = 0.4}) => [ + BoxShadow( + color: c.withValues(alpha: intensity), + blurRadius: 24, + spreadRadius: -4, + offset: const Offset(0, 8), + ), + BoxShadow( + color: c.withValues(alpha: intensity * 0.5), + blurRadius: 12, + spreadRadius: -2, + offset: const Offset(0, 3), + ), + ]; + + static const Duration fast = Duration(milliseconds: 180); + static const Duration medium = Duration(milliseconds: 420); + + static LinearGradient primaryGradient({ + Alignment begin = Alignment.topLeft, + Alignment end = Alignment.bottomRight, + }) => + LinearGradient( + begin: begin, + end: end, + colors: [ + AppColor.primaryColor, + AppColor.primaryColor.withValues(alpha: 0.85), + AppColor.primaryColor.withValues(alpha: 0.7), + ], + stops: const [0.0, 0.5, 1.0], + ); + + static LinearGradient cardGradient() => LinearGradient( + begin: Alignment.topLeft, + end: Alignment.bottomRight, + colors: [ + AppColor.secondaryColor.withValues(alpha: 0.98), + AppColor.secondaryColor + .withBlue( + ((AppColor.secondaryColor.b * 255.0).round() + 12).clamp(0, 255), + ) + .withValues(alpha: 0.95), + ], + ); +} + +// ───────────────────────────────────────────────────────────────────────────── +// MAIN BOTTOM MENU MAP - Scrollable Redesign +// ───────────────────────────────────────────────────────────────────────────── + +class MainBottomMenuMap extends StatelessWidget { + const MainBottomMenuMap({super.key}); + + @override + Widget build(BuildContext context) { + return GetBuilder( + builder: (controller) { + if (controller.isPickerShown) { + return const _MapPickerOverlay(); + } + + return Positioned( + bottom: Get.height * .035, + left: 16, + right: 16, + child: AnimatedContainer( + duration: _D.medium, + curve: Curves.easeOutQuint, + constraints: BoxConstraints( + maxHeight: controller.isMainBottomMenuMap + ? Get.height * 0.4 + : Get.height * 0.75, // الحد الأقصى للشاشة المفتوحة + ), + decoration: BoxDecoration( + gradient: _D.cardGradient(), + borderRadius: BorderRadius.circular(_D.radiusCard), + boxShadow: _D.cardShadow, + border: Border.all( + color: Get.isDarkMode + ? Colors.white.withValues(alpha: 0.15) + : Colors.white.withValues(alpha: 0.65), + width: 1.2, + ), + ), + child: ClipRRect( + borderRadius: BorderRadius.circular(_D.radiusCard), + child: SingleChildScrollView( + physics: const BouncingScrollPhysics(), + child: controller.isMainBottomMenuMap + ? const _CollapsedView() + : const _ExpandedView(), + ), + ), + ), + ); + }, + ); + } +} + +// ───────────────────────────────────────────────────────────────────────────── +// COLLAPSED VIEW +// ───────────────────────────────────────────────────────────────────────────── + +class _CollapsedView extends StatelessWidget { + const _CollapsedView(); + + @override + Widget build(BuildContext context) { + final String firstName = box.read(BoxName.name).toString().split(' ').first; + final mapEngine = Get.find(); + final rideLifecycle = Get.find(); + + return GetBuilder( + builder: (locationSearch) { + return Column( + mainAxisSize: MainAxisSize.min, + children: [ + const SizedBox(height: 14), + AnimatedContainer( + duration: _D.fast, + width: 44, + height: 5, + decoration: BoxDecoration( + gradient: LinearGradient( + colors: [ + Colors.grey.shade400.withValues(alpha: 0.6), + Colors.grey.shade300, + Colors.grey.shade400.withValues(alpha: 0.6), + ], + ), + borderRadius: BorderRadius.circular(3), + ), + ), + const SizedBox(height: 16), + Semantics( + button: true, + label: 'Open destination search'.tr, + child: Material( + color: Colors.transparent, + child: InkWell( + onTap: mapEngine.changeMainBottomMenuMap, + borderRadius: BorderRadius.circular(_D.radiusInner), + child: Padding( + padding: + const EdgeInsets.symmetric(horizontal: 18, vertical: 8), + child: Row( + children: [ + AnimatedContainer( + duration: _D.medium, + width: 48, + height: 48, + decoration: BoxDecoration( + gradient: _D.primaryGradient(), + borderRadius: BorderRadius.circular(_D.radiusPill), + boxShadow: _D.glowShadow(AppColor.primaryColor), + ), + child: const Icon(Icons.search_rounded, + color: Colors.white, size: 22), + ), + const SizedBox(width: 16), + Expanded( + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Text.rich( + TextSpan( + children: [ + TextSpan( + text: '${'Where to'.tr} ', + style: AppStyle.title.copyWith( + fontWeight: FontWeight.w600, + fontSize: 16, + color: Colors.grey.shade700, + ), + ), + TextSpan( + text: firstName, + style: AppStyle.title.copyWith( + fontWeight: FontWeight.w800, + fontSize: 16.5, + color: AppColor.primaryColor, + letterSpacing: -0.3, + ), + ), + const TextSpan(text: '؟'), + ], + ), + ), + const SizedBox(height: 2), + if (!rideLifecycle.noCarString) + Text( + 'Tap to search your destination'.tr, + style: AppStyle.subtitle.copyWith( + fontSize: 12, + color: Colors.grey.shade500, + fontWeight: FontWeight.w400, + ), + ), + ], + ), + ), + ], + ), + ), + ), + ), + ), + if (locationSearch.recentPlaces.isNotEmpty) ...[ + const SizedBox(height: 12), + Container( + height: 40, + padding: const EdgeInsets.symmetric(horizontal: 18), + child: ListView.separated( + scrollDirection: Axis.horizontal, + itemCount: locationSearch.recentPlaces.length, + separatorBuilder: (_, __) => const SizedBox(width: 10), + itemBuilder: (context, index) => + _RecentPlaceChip(locationSearch: locationSearch, index: index), + ), + ), + const SizedBox(height: 16), + ] else + const SizedBox(height: 20), + ], + ); + }, + ); + } +} + +// ───────────────────────────────────────────────────────────────────────────── +// EXPANDED VIEW - Grouped Layout +// ───────────────────────────────────────────────────────────────────────────── + +class _ExpandedView extends StatelessWidget { + const _ExpandedView(); + + @override + Widget build(BuildContext context) { + final mapEngine = Get.find(); + final rideLifecycle = Get.find(); + + return GetBuilder( + builder: (locationSearch) { + return Column( + mainAxisSize: MainAxisSize.min, + crossAxisAlignment: CrossAxisAlignment.stretch, + children: [ + const SizedBox(height: 14), + Center( + child: AnimatedContainer( + duration: _D.fast, + width: 44, + height: 5, + decoration: BoxDecoration( + gradient: LinearGradient( + colors: [ + Colors.grey.shade400.withValues(alpha: 0.6), + Colors.grey.shade300, + Colors.grey.shade400.withValues(alpha: 0.6), + ], + ), + borderRadius: BorderRadius.circular(3), + ), + ), + ), + + // ── Header ── + Container( + padding: const EdgeInsets.fromLTRB(20, 18, 16, 14), + child: Row( + children: [ + Text( + 'Plan Your Route'.tr, + style: AppStyle.title.copyWith( + fontWeight: FontWeight.w800, + fontSize: 18, + letterSpacing: -0.5, + ), + ), + const Spacer(), + Semantics( + button: true, + label: 'Close panel'.tr, + child: Material( + color: Colors.transparent, + child: InkWell( + onTap: mapEngine.changeMainBottomMenuMap, + borderRadius: BorderRadius.circular(_D.radiusPill), + child: Container( + width: 38, + height: 38, + decoration: BoxDecoration( + color: Colors.grey.shade100, + shape: BoxShape.circle, + ), + child: Icon(Icons.keyboard_arrow_down_rounded, + size: 24, color: Colors.grey.shade600), + ), + ), + ), + ), + ], + ), + ), + + // ── Group 1: Core Routing ── + _buildSectionTitle('Route'.tr), + + _buildTimelineItem( + dotColor: AppColor.primaryColor, + showTopLine: false, + showBottomLine: true, + isStart: true, + child: !rideLifecycle.isAnotherOreder + ? _TimelineRow( + icon: Icons.my_location_rounded, + iconColor: AppColor.primaryColor, + bgColor: AppColor.primaryColor, + label: locationSearch.currentLocationString, + ) + : Padding( + padding: const EdgeInsets.only(right: 16), + child: formSearchPlacesStart(), + ), + ), + + ...List.generate(locationSearch.activeMenuWaypointCount, (index) { + final wpName = locationSearch.menuWaypointNames[index]; + final isSet = locationSearch.menuWaypoints[index] != null; + final Color accent = + index == 0 ? Colors.amber.shade600 : Colors.deepPurple.shade400; + final Color soft = + index == 0 ? Colors.amber.shade50 : Colors.deepPurple.shade50; + + return _buildTimelineItem( + dotColor: accent, + showTopLine: true, + showBottomLine: true, + child: Container( + padding: const EdgeInsets.symmetric(horizontal: 14, vertical: 12), + decoration: BoxDecoration( + gradient: LinearGradient( + colors: [soft.withValues(alpha: 0.9), soft.withValues(alpha: 0.6)]), + borderRadius: BorderRadius.circular(_D.radiusInner), + border: Border.all( + color: isSet + ? accent.withValues(alpha: 0.35) + : Colors.grey.shade200), + ), + child: Row( + children: [ + Container( + width: 26, + height: 26, + decoration: + BoxDecoration(color: accent, shape: BoxShape.circle), + child: Center( + child: Text('${index + 1}', + style: const TextStyle( + color: Colors.white, + fontSize: 11, + fontWeight: FontWeight.w800))), + ), + const SizedBox(width: 12), + Expanded( + child: GestureDetector( + onTap: () { + mapEngine.changeMainBottomMenuMap(); + locationSearch.startPickingWaypointOnMap(index); + }, + child: Text( + isSet ? wpName : '${'Stop'.tr} ${index + 1}', + style: TextStyle( + fontSize: 13.5, + color: isSet + ? accent.withValues(alpha: 0.9) + : Colors.grey.shade400, + fontWeight: isSet ? FontWeight.w600 : FontWeight.w400, + ), + maxLines: 1, + overflow: TextOverflow.ellipsis, + ), + )), + GestureDetector( + onTap: () => locationSearch.removeMenuWaypoint(index), + child: Container( + width: 28, + height: 28, + decoration: BoxDecoration( + color: Colors.red.shade50, shape: BoxShape.circle), + child: Icon(Icons.close_rounded, + color: Colors.red.shade400, size: 15), + ), + ), + ], + ), + ), + ); + }), + + if (locationSearch.activeMenuWaypointCount < 2) + _buildTimelineItem( + dotColor: Colors.orange.shade300, + isDotDashed: true, + showTopLine: true, + showBottomLine: true, + child: InkWell( + onTap: () => locationSearch.addMenuWaypoint(), + borderRadius: BorderRadius.circular(_D.radiusInner), + child: Container( + padding: + const EdgeInsets.symmetric(horizontal: 16, vertical: 12), + decoration: BoxDecoration( + borderRadius: BorderRadius.circular(_D.radiusInner), + border: Border.all(color: Colors.orange.shade200, width: 1.5), + color: Colors.orange.shade50.withValues(alpha: 0.6), + ), + child: Row( + mainAxisAlignment: MainAxisAlignment.center, + children: [ + Icon(Icons.add_location_alt_outlined, + color: Colors.orange.shade500, size: 18), + const SizedBox(width: 10), + Text('Add a Stop'.tr, + style: TextStyle( + color: Colors.orange.shade700, + fontSize: 13.5, + fontWeight: FontWeight.w600)), + ], + ), + ), + ), + ), + + _buildTimelineItem( + dotColor: Colors.red.shade500, + showTopLine: true, + showBottomLine: false, + isEnd: true, + child: Padding( + padding: const EdgeInsets.only(right: 16), + child: formSearchPlacesDestenation(), + ), + ), + + const SizedBox(height: 16), + + // ── Group 2: Quick Access ── + _buildSectionDivider(), + Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + _buildSectionTitle('Quick Access'.tr), + const FaviouratePlacesDialog(), // تم نقلها هنا لتكون جزء من الوصول السريع + ], + ), + + if (locationSearch.recentPlaces.isNotEmpty) + Container( + height: 40, + margin: const EdgeInsets.only(bottom: 16), + child: ListView.separated( + padding: const EdgeInsets.symmetric(horizontal: 20), + scrollDirection: Axis.horizontal, + itemCount: locationSearch.recentPlaces.length, + separatorBuilder: (_, __) => const SizedBox(width: 10), + itemBuilder: (context, index) => + _RecentPlaceChip(locationSearch: locationSearch, index: index), + ), + ), + + // ── Group 3: Advanced Tools ── + _buildSectionDivider(), + _buildSectionTitle('Advanced Tools'.tr), + + Padding( + padding: const EdgeInsets.symmetric(horizontal: 18), + child: _WhatsAppLinkButton(locationSearch: locationSearch), + ), + const SizedBox(height: 12), + Padding( + padding: const EdgeInsets.symmetric(horizontal: 18), + child: _OrderTypeButton(mapEngine: mapEngine), + ), + + const SizedBox(height: 24), // مساحة سفلية لضمان راحة السحب + ], + ); + }, + ); + } + + Widget _buildSectionTitle(String title) { + return Padding( + padding: const EdgeInsets.only(left: 20, right: 20, bottom: 12), + child: Text( + title, + style: TextStyle( + fontSize: 14, + fontWeight: FontWeight.bold, + color: Colors.grey.shade400, + letterSpacing: 0.5, + ), + ), + ); + } + + Widget _buildSectionDivider() { + return Container( + height: 1, + margin: const EdgeInsets.symmetric(horizontal: 20, vertical: 16), + color: Colors.grey.shade200, + ); + } + + Widget _buildTimelineItem({ + required Color dotColor, + required bool showTopLine, + required bool showBottomLine, + required Widget child, + bool isDotDashed = false, + bool isStart = false, + bool isEnd = false, + }) { + return Padding( + padding: const EdgeInsets.symmetric(horizontal: 20), + child: Row( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + SizedBox( + width: 24, + child: Column( + children: [ + if (showTopLine) + Container( + width: 2.5, height: 12, color: Colors.grey.shade300), + Container( + width: 15, + height: 15, + decoration: BoxDecoration( + color: isDotDashed ? Colors.transparent : dotColor, + shape: BoxShape.circle, + border: + Border.all(color: dotColor, width: isDotDashed ? 2 : 3), + ), + ), + if (showBottomLine) + Container( + width: 2.5, height: 12, color: Colors.grey.shade300), + ], + ), + ), + const SizedBox(width: 14), + Expanded(child: child), + ], + ), + ); + } +} + +// ───────────────────────────────────────────────────────────────────────────── +// MAP PICKER OVERLAY +// ───────────────────────────────────────────────────────────────────────────── + +class _MapPickerOverlay extends StatelessWidget { + const _MapPickerOverlay(); + + String _getModeTitle(LocationSearchController locationSearch, BuildContext context) { + if (locationSearch.isPickingWaypoint) { + return 'Move map to set stop'.tr + + ' ${locationSearch.pickingWaypointIndex + 1}'.tr; + } + if (locationSearch.passengerStartLocationFromMap) { + final rideLifecycle = Get.find(); + return rideLifecycle.isAnotherOreder + ? 'Now set the pickup point for the other person'.tr + : 'Move map to your pickup point'.tr; + } + if (locationSearch.startLocationFromMap) { + return 'Move map to set start location'.tr; + } + if (locationSearch.workLocationFromMap) { + return 'Move map to your work location'.tr; + } + if (locationSearch.homeLocationFromMap) { + return 'Move map to your home location'.tr; + } + return 'Move map to select destination'.tr; + } + + String _getConfirmLabel(LocationSearchController locationSearch, BuildContext context) { + if (locationSearch.isPickingWaypoint) return 'Set as Stop'.tr; + if (locationSearch.passengerStartLocationFromMap) { + return 'Confirm Pickup Location'.tr; + } + if (locationSearch.workLocationFromMap) return 'Set as Work'.tr; + if (locationSearch.homeLocationFromMap) return 'Set as Home'.tr; + return 'Set Destination'.tr; + } + + IconData _getModeIcon(LocationSearchController locationSearch) { + if (locationSearch.isPickingWaypoint) return Icons.add_location_alt_rounded; + if (locationSearch.passengerStartLocationFromMap) { + return Icons.person_pin_circle_rounded; + } + if (locationSearch.workLocationFromMap) return Icons.work_rounded; + if (locationSearch.homeLocationFromMap) return Icons.home_rounded; + return Icons.location_on_rounded; + } + + Color _getModeColor(LocationSearchController locationSearch) { + if (locationSearch.isPickingWaypoint) return Colors.orange.shade600; + if (locationSearch.passengerStartLocationFromMap) return Colors.green.shade600; + if (locationSearch.workLocationFromMap) return Colors.blue.shade600; + if (locationSearch.homeLocationFromMap) return Colors.orange.shade600; + return AppColor.primaryColor; + } + + @override + Widget build(BuildContext context) { + final mapEngine = Get.find(); + + return GetBuilder( + builder: (locationSearch) { + final modeColor = _getModeColor(locationSearch); + + return Positioned( + bottom: Get.height * .035, + left: 16, + right: 16, + child: Column( + mainAxisSize: MainAxisSize.min, + children: [ + Container( + padding: const EdgeInsets.symmetric(horizontal: 18, vertical: 14), + decoration: BoxDecoration( + color: modeColor, + borderRadius: BorderRadius.circular(_D.radiusCard), + ), + child: Row( + children: [ + Icon(_getModeIcon(locationSearch), color: Colors.white, size: 19), + const SizedBox(width: 14), + Expanded( + child: Text( + _getModeTitle(locationSearch, context), + style: const TextStyle( + color: Colors.white, + fontWeight: FontWeight.w700, + fontSize: 14), + ), + ), + ], + ), + ), + const SizedBox(height: 12), + Container( + decoration: BoxDecoration( + color: AppColor.secondaryColor, + borderRadius: BorderRadius.circular(_D.radiusCard), + boxShadow: _D.cardShadow, + ), + child: Column( + mainAxisSize: MainAxisSize.min, + children: [ + Padding( + padding: const EdgeInsets.fromLTRB(20, 18, 20, 2), + child: Row( + children: [ + Icon(Icons.gps_fixed_rounded, color: modeColor, size: 16), + const SizedBox(width: 14), + Expanded( + child: Text( + '${locationSearch.newMyLocation.latitude.toStringAsFixed(5)}, ${locationSearch.newMyLocation.longitude.toStringAsFixed(5)}', + style: TextStyle( + fontSize: 12, + color: Colors.grey.shade700, + fontWeight: FontWeight.w500), + ), + ), + ], + ), + ), + const SizedBox(height: 16), + Padding( + padding: const EdgeInsets.fromLTRB(16, 14, 16, 18), + child: Row( + children: [ + Expanded( + flex: 2, + child: OutlinedButton( + onPressed: () { + mapEngine.isPickerShown = false; + locationSearch.passengerStartLocationFromMap = false; + locationSearch.startLocationFromMap = false; + locationSearch.workLocationFromMap = false; + locationSearch.homeLocationFromMap = false; + locationSearch.isPickingWaypoint = false; + locationSearch.pickingWaypointIndex = -1; + if (!mapEngine.isMainBottomMenuMap) { + mapEngine.isMainBottomMenuMap = true; + mapEngine.mainBottomMenuMapHeight = + Get.height * .22; + } + mapEngine.update(); + locationSearch.update(); + }, + child: Text('Cancel'.tr), + ), + ), + const SizedBox(width: 12), + Expanded( + flex: 3, + child: ElevatedButton( + onPressed: () => _onConfirmTap(mapEngine, locationSearch, context), + style: ElevatedButton.styleFrom( + backgroundColor: modeColor), + child: Text(_getConfirmLabel(locationSearch, context), + style: const TextStyle(color: Colors.white)), + ), + ), + ], + ), + ), + ], + ), + ), + ], + ), + ); + }, + ); + } + + Future _onConfirmTap( + MapEngineController mapEngine, LocationSearchController locationSearch, BuildContext context) async { + final rideLifecycle = Get.find(); + Log.print( + '🔘 _onConfirmTap: isPickingWaypoint=${locationSearch.isPickingWaypoint}, newMyLocation=${locationSearch.newMyLocation}'); + await Future.delayed(const Duration(milliseconds: 280)); + final LatLng currentCameraPosition = LatLng( + locationSearch.newMyLocation.latitude, locationSearch.newMyLocation.longitude); + + if (locationSearch.isPickingWaypoint && locationSearch.pickingWaypointIndex >= 0) { + locationSearch.setMenuWaypointFromMap( + locationSearch.pickingWaypointIndex, currentCameraPosition); + mySnackbarSuccess('Waypoint has been set successfully'.tr); + return; + } + + mapEngine.clearPolyline(); + rideLifecycle.data = []; + + if (locationSearch.passengerStartLocationFromMap) { + final LatLng start = currentCameraPosition; + locationSearch.newStartPointLocation = start; + locationSearch.passengerStartLocationFromMap = false; + mapEngine.isPickerShown = false; + locationSearch.currentLocationToFormPlaces = false; + locationSearch.placesDestination = []; + locationSearch.clearPlacesStart(); + locationSearch.clearPlacesDestination(); + mapEngine.isMainBottomMenuMap = true; + mapEngine.mainBottomMenuMapHeight = Get.height * .22; + mapEngine.update(); + locationSearch.update(); + await rideLifecycle.getDirectionMap('${start.latitude},${start.longitude}', + '${locationSearch.myDestination.latitude},${locationSearch.myDestination.longitude}'); + rideLifecycle.showBottomSheet1(); + return; + } + + if (locationSearch.startLocationFromMap) { + final LatLng start = currentCameraPosition; + locationSearch.newMyLocation = start; + locationSearch.newStartPointLocation = start; + locationSearch.hintTextStartPoint = + '${start.latitude.toStringAsFixed(4)} , ${start.longitude.toStringAsFixed(4)}'; + locationSearch.startLocationFromMap = false; + mapEngine.isPickerShown = false; + locationSearch.update(); + mapEngine.update(); + return; + } + + if (locationSearch.workLocationFromMap) { + box.write(BoxName.addWork, + '${currentCameraPosition.latitude.toStringAsFixed(4)} , ${currentCameraPosition.longitude.toStringAsFixed(4)}'); + locationSearch.hintTextDestinationPoint = 'To Work'.tr; + locationSearch.workLocationFromMap = false; + mapEngine.isPickerShown = false; + locationSearch.update(); + mapEngine.update(); + mySnackbarSuccess('Work Saved'.tr); + return; + } + + if (locationSearch.homeLocationFromMap) { + box.write(BoxName.addHome, + '${currentCameraPosition.latitude.toStringAsFixed(4)} , ${currentCameraPosition.longitude.toStringAsFixed(4)}'); + locationSearch.hintTextDestinationPoint = 'To Home'.tr; + locationSearch.homeLocationFromMap = false; + mapEngine.isPickerShown = false; + locationSearch.update(); + mapEngine.update(); + mySnackbarSuccess('Home Saved'.tr); + return; + } + + locationSearch.myDestination = currentCameraPosition; + locationSearch.hintTextDestinationPoint = + '${currentCameraPosition.latitude.toStringAsFixed(4)} , ${currentCameraPosition.longitude.toStringAsFixed(4)}'; + locationSearch.placesDestination = []; + locationSearch.placeDestinationController.clear(); + locationSearch.passengerStartLocationFromMap = true; + mapEngine.isPickerShown = true; + locationSearch.update(); + mapEngine.update(); + + try { + if (rideLifecycle.isAnotherOreder) { + await mapEngine.mapController?.animateCamera(CameraUpdate.newLatLng( + LatLng(locationSearch.newStartPointLocation.latitude, + locationSearch.newStartPointLocation.longitude))); + } else { + await mapEngine.mapController?.animateCamera(CameraUpdate.newLatLng( + LatLng(locationSearch.passengerLocation.latitude, + locationSearch.passengerLocation.longitude))); + } + } catch (e) { + Log.print("Error occurred: $e"); + } + } +} + +// ───────────────────────────────────────────────────────────────────────────── +// HELPER WIDGETS +// ───────────────────────────────────────────────────────────────────────────── + +class _TimelineRow extends StatelessWidget { + final IconData icon; + final Color iconColor; + final Color bgColor; + final String label; + const _TimelineRow( + {required this.icon, + required this.iconColor, + required this.bgColor, + required this.label}); + + @override + Widget build(BuildContext context) { + return Container( + padding: const EdgeInsets.symmetric(horizontal: 14, vertical: 11), + decoration: BoxDecoration( + color: bgColor.withValues(alpha: 0.06), + borderRadius: BorderRadius.circular(_D.radiusInner)), + child: Row( + children: [ + Icon(icon, color: iconColor, size: 15), + const SizedBox(width: 12), + Expanded( + child: Text(label, + style: AppStyle.subtitle + .copyWith(fontSize: 13, fontWeight: FontWeight.w500), + maxLines: 1, + overflow: TextOverflow.ellipsis)), + ], + ), + ); + } +} + +class _RecentPlaceChip extends StatelessWidget { + final LocationSearchController locationSearch; + final int index; + const _RecentPlaceChip({required this.locationSearch, required this.index}); + + @override + Widget build(BuildContext context) { + final place = locationSearch.recentPlaces[index]; + final rideLifecycle = Get.find(); + return Material( + color: Colors.transparent, + child: InkWell( + onTap: () { + MyDialog().getDialog( + 'Are you want to go this site'.tr, + ' ', + () async { + await locationSearch.getLocation(); + await rideLifecycle.getDirectionMap( + '${locationSearch.passengerLocation.latitude},${locationSearch.passengerLocation.longitude}', + '${place['latitude']},${place['longitude']}'); + rideLifecycle.showBottomSheet1(); + }, + ); + }, + borderRadius: BorderRadius.circular(_D.radiusChip), + child: Container( + padding: const EdgeInsets.symmetric(horizontal: 15, vertical: 7), + decoration: BoxDecoration( + color: AppColor.primaryColor.withValues(alpha: 0.08), + borderRadius: BorderRadius.circular(_D.radiusChip), + ), + child: Row( + mainAxisSize: MainAxisSize.min, + children: [ + Icon(Icons.history_rounded, + size: 14, color: AppColor.primaryColor.withValues(alpha: 0.7)), + const SizedBox(width: 7), + Text(place['name'] ?? '', + style: TextStyle( + fontSize: 12.5, + color: AppColor.primaryColor.withValues(alpha: 0.9), + fontWeight: FontWeight.w600)), + ], + ), + ), + ), + ); + } +} + +class _WhatsAppLinkButton extends StatelessWidget { + final LocationSearchController locationSearch; + const _WhatsAppLinkButton({required this.locationSearch}); + + @override + Widget build(BuildContext context) { + return Material( + color: Colors.transparent, + child: InkWell( + onTap: () { + Get.dialog( + AlertDialog( + shape: RoundedRectangleBorder( + borderRadius: BorderRadius.circular(22)), + title: Text('WhatsApp Location Extractor'.tr), + content: Form( + key: locationSearch.sosFormKey, + child: Column( + mainAxisSize: MainAxisSize.min, + children: [ + MyTextForm( + controller: locationSearch.whatsAppLocationText, + label: 'Location Link'.tr, + type: TextInputType.url, + hint: 'https://maps.app.goo.gl/...'), + const SizedBox(height: 16), + MyElevatedButton( + title: 'Go to this location'.tr, + onPressed: () => locationSearch.goToWhatappLocation()), + ], + ), + ), + ), + ); + }, + borderRadius: BorderRadius.circular(_D.radiusInner), + child: Container( + padding: const EdgeInsets.symmetric(horizontal: 16, vertical: 14), + decoration: BoxDecoration( + color: Colors.green.shade50, + borderRadius: BorderRadius.circular(_D.radiusInner)), + child: Row( + children: [ + Icon(Icons.link_rounded, color: Colors.green.shade700, size: 18), + const SizedBox(width: 14), + Expanded( + child: Text('Paste WhatsApp location link'.tr, + style: TextStyle( + color: Colors.green.shade800, + fontSize: 13.5, + fontWeight: FontWeight.w600))), + ], + ), + ), + ), + ); + } +} + +class _OrderTypeButton extends StatelessWidget { + final MapEngineController mapEngine; + const _OrderTypeButton({required this.mapEngine}); + + @override + Widget build(BuildContext context) { + final rideLifecycle = Get.find(); + final bool isOther = mapEngine.isAnotherOreder; + final Color accent = + isOther ? Colors.indigo.shade500 : AppColor.primaryColor; + + return Material( + color: Colors.transparent, + child: InkWell( + onTap: () { + showCupertinoModalPopup( + context: context, + builder: (ctx) => CupertinoActionSheet( + title: Text('Select Order Type'.tr), + actions: [ + CupertinoActionSheetAction( + child: Text('I want to order for myself'.tr), + onPressed: () { + mapEngine.changeisAnotherOreder(false); + rideLifecycle.isAnotherOreder = false; + Navigator.pop(ctx); + }, + ), + CupertinoActionSheetAction( + child: Text('I want to order for someone else'.tr), + onPressed: () { + mapEngine.changeisAnotherOreder(true); + rideLifecycle.isAnotherOreder = true; + Navigator.pop(ctx); + }, + ), + ], + cancelButton: CupertinoActionSheetAction( + isDefaultAction: true, + onPressed: () => Navigator.pop(ctx), + child: Text('Cancel'.tr)), + ), + ); + }, + borderRadius: BorderRadius.circular(_D.radiusInner), + child: Container( + padding: const EdgeInsets.symmetric(horizontal: 16, vertical: 14), + decoration: BoxDecoration( + color: accent.withValues(alpha: 0.08), + borderRadius: BorderRadius.circular(_D.radiusInner)), + child: Row( + children: [ + Icon(isOther ? Icons.person_rounded : Icons.group_rounded, + color: accent, size: 17), + const SizedBox(width: 14), + Expanded( + child: Text( + isOther + ? 'Order for myself'.tr + : 'Order for someone else'.tr, + style: TextStyle( + color: accent, + fontSize: 13.5, + fontWeight: FontWeight.w600))), + ], + ), + ), + ), + ); + } +} + +class FaviouratePlacesDialog extends StatelessWidget { + const FaviouratePlacesDialog({super.key}); + + @override + Widget build(BuildContext context) { + return GetBuilder( + builder: (locationSearch) { + final rideLifecycle = Get.find(); + return InkWell( + borderRadius: BorderRadius.circular(14), + onTap: () async { + final List favoritePlaces = + await sql.getAllData(TableName.placesFavorite); + Get.defaultDialog( + title: 'Favorite Places'.tr, + content: SizedBox( + width: Get.width * .85, + height: 300, + child: favoritePlaces.isEmpty + ? Center(child: Text('No favorite places yet!'.tr)) + : ListView.separated( + itemCount: favoritePlaces.length, + separatorBuilder: (_, __) => + Divider(height: 1, color: Colors.grey.shade100), + itemBuilder: (context, index) => ListTile( + leading: const Icon(Icons.star, + color: Colors.amber, size: 19), + title: Text(favoritePlaces[index]['name']), + trailing: IconButton( + icon: const Icon(Icons.delete_outline, + color: Colors.redAccent), + onPressed: () async { + await sql.deleteData(TableName.placesFavorite, + favoritePlaces[index]['id']); + Get.back(); + }, + ), + onTap: () async { + Get.back(); + await locationSearch.getLocation(); + await rideLifecycle.getDirectionMap( + '${locationSearch.passengerLocation.latitude},${locationSearch.passengerLocation.longitude}', + '${favoritePlaces[index]['latitude']},${favoritePlaces[index]['longitude']}'); + rideLifecycle.showBottomSheet1(); + }, + ), + ), + ), + confirm: + MyElevatedButton(title: 'Back'.tr, onPressed: () => Get.back()), + ); + }, + child: Padding( + padding: const EdgeInsets.symmetric(horizontal: 14, vertical: 10), + child: Row( + mainAxisSize: MainAxisSize.min, + children: [ + const Icon(Icons.star_border_rounded, + color: AppColor.accentColor, size: 21), + const SizedBox(width: 10), + Text('Favorite Places'.tr, + style: AppStyle.title + .copyWith(fontWeight: FontWeight.w600, fontSize: 14)), + ], + ), + ), + ); + }, + ); + } +} diff --git a/siro_rider/lib/views/home/map_widget.dart/map_menu_widget.dart b/siro_rider/lib/views/home/map_widget.dart/map_menu_widget.dart new file mode 100644 index 0000000..3616142 --- /dev/null +++ b/siro_rider/lib/views/home/map_widget.dart/map_menu_widget.dart @@ -0,0 +1,533 @@ +import 'dart:ui'; + +import 'package:siro_rider/constant/box_name.dart'; +import 'package:siro_rider/main.dart'; +import 'package:flutter/foundation.dart'; +import 'package:flutter/material.dart'; +import 'package:flutter_font_icons/flutter_font_icons.dart'; +import 'package:get/get.dart'; +import 'package:siro_rider/constant/style.dart'; +import 'package:siro_rider/views/home/my_wallet/passenger_wallet.dart'; +import 'package:siro_rider/views/home/profile/complaint_page.dart'; +import 'package:siro_rider/views/home/profile/order_history.dart'; +import 'package:siro_rider/views/home/profile/promos_passenger_page.dart'; +import 'package:url_launcher/url_launcher.dart'; + +import '../../../constant/colors.dart'; +import '../../../constant/links.dart'; +import '../../../controller/home/map/map_engine_controller.dart'; +import '../../notification/notification_page.dart'; +import '../HomePage/contact_us.dart'; +import '../HomePage/share_app_page.dart'; +import '../setting_page.dart'; +import '../profile/passenger_profile_page.dart'; + +// ─── ألوان النظام (Integrated with AppColor) ────────────────────────────────── +Color get _kCyan => AppColor.cyanBlue; +Color get _kBg => + Get.isDarkMode ? const Color(0xFF060B18) : AppColor.secondaryColor; +Color get _kBgSurface => Get.isDarkMode + ? const Color(0xFF0D1525) + : AppColor.secondaryColor.withValues(alpha: 0.9); +const _kAmber = Color(0xFFFFB700); +Color get _kText => AppColor.writeColor; +Color get _kTextMuted => AppColor.grayColor; + +class MapMenuWidget extends StatelessWidget { + const MapMenuWidget({super.key}); + + @override + Widget build(BuildContext context) { + return GetBuilder( + builder: (controller) => Stack( + children: [ + // ── تعتيم الخلفية ─────────────────────────────────────────────── + if (controller.widthMenu > 0) + GestureDetector( + onTap: controller.getDrawerMenu, + child: Container(color: Colors.black.withValues(alpha: 0.55)), + ), + + _buildSideMenu(controller), + _buildMenuButton(controller), + ], + ), + ); + } + + // ── زر القائمة العائم ──────────────────────────────────────────────────── + Widget _buildMenuButton(MapEngineController controller) { + return Positioned( + top: 45, + left: 16, + child: SafeArea( + child: GestureDetector( + onTap: controller.getDrawerMenu, + child: ClipRRect( + borderRadius: BorderRadius.circular(16), + child: BackdropFilter( + filter: ImageFilter.blur(sigmaX: 12, sigmaY: 12), + child: AnimatedContainer( + duration: const Duration(milliseconds: 300), + curve: Curves.easeOut, + width: 48, + height: 48, + decoration: BoxDecoration( + color: _kBg.withValues(alpha: 0.88), + borderRadius: BorderRadius.circular(16), + border: Border.all(color: _kCyan.withValues(alpha: 0.25), width: 1), + boxShadow: [ + BoxShadow( + color: _kCyan.withValues(alpha: 0.12), + blurRadius: 16, + ), + ], + ), + child: AnimatedSwitcher( + duration: const Duration(milliseconds: 200), + child: Icon( + controller.widthMenu > 0 + ? Icons.close_rounded + : Icons.menu_rounded, + key: ValueKey(controller.widthMenu > 0), + color: _kCyan, + size: 22, + ), + ), + ), + ), + ), + ), + ), + ); + } + + // ── القائمة الجانبية ───────────────────────────────────────────────────── + Widget _buildSideMenu(MapEngineController controller) { + return AnimatedPositioned( + duration: const Duration(milliseconds: 420), + curve: Curves.fastOutSlowIn, + top: 0, + bottom: 0, + left: controller.widthMenu > 0 ? 0 : -Get.width, + child: ClipRect( + child: BackdropFilter( + filter: ImageFilter.blur(sigmaX: 20, sigmaY: 20), + child: Container( + width: Get.width * 0.8, + constraints: const BoxConstraints(maxWidth: 320), + decoration: BoxDecoration( + color: _kBg.withValues(alpha: 0.97), + border: Border( + right: BorderSide(color: _kCyan.withValues(alpha: 0.12), width: 1), + ), + boxShadow: [ + BoxShadow( + color: Colors.black.withValues(alpha: 0.5), + blurRadius: 32, + ), + ], + ), + child: Stack( + children: [ + // شبكة خلفية + Positioned.fill( + child: CustomPaint(painter: _MenuGridPainter())), + + // المحتوى + SafeArea( + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + _buildMenuHeader(), + _buildQuickActionButtons(), + _buildDivider(), + Expanded( + child: ListView( + padding: const EdgeInsets.symmetric( + horizontal: 12, vertical: 4), + children: [ + MenuListItem( + title: 'My Balance'.tr, + icon: Icons.account_balance_wallet_outlined, + onTap: () => + Get.to(() => const PassengerWallet()), + ), + MenuListItem( + title: 'Order History'.tr, + icon: Icons.history_rounded, + onTap: () => Get.to(() => const OrderHistory()), + ), + MenuListItem( + title: 'Promos'.tr, + icon: Icons.local_offer_outlined, + onTap: () => + Get.to(() => const PromosPassengerPage()), + ), + MenuListItem( + title: 'Contact Us'.tr, + icon: Icons.contact_support_outlined, + onTap: () => Get.to(() => ContactUsPage()), + ), + MenuListItem( + title: 'Complaint'.tr, + icon: Icons.flag_outlined, + onTap: () => Get.to(() => ComplaintPage()), + ), + MenuListItem( + title: 'Driver'.tr, + icon: Ionicons.car_sport_outline, + onTap: () => _launchDriverAppUrl(), + ), + MenuListItem( + title: 'Share App'.tr, + icon: Icons.share_outlined, + onTap: () => Get.to(() => ShareAppPage()), + ), + MenuListItem( + title: 'Privacy Policy'.tr, + icon: Icons.shield_outlined, + onTap: () => launchUrl( + Uri.parse( + '${AppLink.server}/privacy_policy.php'), + ), + ), + ], + ), + ), + _buildDivider(), + // زر الخروج + Padding( + padding: const EdgeInsets.fromLTRB(12, 4, 12, 12), + child: MenuListItem( + title: 'Logout'.tr, + icon: Icons.logout_rounded, + isDestructive: true, + onTap: () { + Get.defaultDialog( + title: "Logout".tr, + middleText: "Are you sure you want to logout?".tr, + textConfirm: "Logout".tr, + textCancel: "Cancel".tr, + onConfirm: () { + // controller.logout(); + Get.back(); + }, + ); + }, + ), + ), + ], + ), + ), + ], + ), + ), + ), + ), + ); + } + + // ── رأس القائمة ────────────────────────────────────────────────────────── + Widget _buildMenuHeader() { + return Container( + margin: const EdgeInsets.fromLTRB(16, 24, 16, 16), + padding: const EdgeInsets.all(16), + decoration: BoxDecoration( + color: _kBgSurface, + borderRadius: BorderRadius.circular(16), + border: Border.all(color: _kCyan.withValues(alpha: 0.15), width: 1), + ), + child: Row( + children: [ + // أفاتار المستخدم + Stack( + children: [ + Container( + width: 56, + height: 56, + decoration: BoxDecoration( + shape: BoxShape.circle, + gradient: LinearGradient( + begin: Alignment.topLeft, + end: Alignment.bottomRight, + colors: [ + _kCyan.withValues(alpha: 0.2), + _kAmber.withValues(alpha: 0.12), + ], + ), + border: + Border.all(color: _kCyan.withValues(alpha: 0.35), width: 1.5), + ), + child: Icon(Icons.person_rounded, color: _kCyan, size: 28), + ), + // نقطة الحضور + Positioned( + bottom: 1, + right: 1, + child: Container( + width: 12, + height: 12, + decoration: BoxDecoration( + color: const Color(0xFF00E676), + shape: BoxShape.circle, + border: Border.all(color: _kBg, width: 2), + boxShadow: [ + BoxShadow( + color: const Color(0xFF00E676).withValues(alpha: 0.5), + blurRadius: 6, + ), + ], + ), + ), + ), + ], + ), + const SizedBox(width: 14), + Expanded( + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Text( + box.read(BoxName.name) ?? 'Guest', + style: TextStyle( + color: _kText, + fontSize: 17, + fontWeight: FontWeight.w700, + letterSpacing: 0.3, + ), + overflow: TextOverflow.ellipsis, + ), + const SizedBox(height: 5), + Row( + children: [ + Container( + width: 5, + height: 5, + decoration: + BoxDecoration(color: _kCyan, shape: BoxShape.circle), + ), + const SizedBox(width: 6), + Text( + "Intaleq Passenger".tr, + style: TextStyle( + color: _kTextMuted, + fontSize: 12, + letterSpacing: 0.4, + ), + ), + ], + ), + ], + ), + ), + ], + ), + ); + } + + // ── أزرار الإجراءات السريعة ─────────────────────────────────────────────── + Widget _buildQuickActionButtons() { + return Padding( + padding: const EdgeInsets.symmetric(horizontal: 16, vertical: 4), + child: Row( + children: [ + _QuickBtn( + icon: Icons.person_outline_rounded, + label: 'Profile'.tr, + onTap: () => Get.to(() => PassengerProfilePage()), + ), + const SizedBox(width: 8), + _QuickBtn( + icon: Icons.notifications_none_rounded, + label: 'Alerts'.tr, + onTap: () => Get.to(() => const NotificationPage()), + ), + const SizedBox(width: 8), + _QuickBtn( + icon: Icons.settings_outlined, + label: 'Settings'.tr, + onTap: () => Get.to(() => const SettingPage()), + ), + ], + ), + ); + } + + Widget _buildDivider() { + return Container( + margin: const EdgeInsets.symmetric(horizontal: 16, vertical: 8), + height: 1, + decoration: BoxDecoration( + gradient: LinearGradient( + colors: [ + Colors.transparent, + _kCyan.withValues(alpha: 0.15), + Colors.transparent, + ], + ), + ), + ); + } + + void _launchDriverAppUrl() async { + final String driverAppUrl; + if (defaultTargetPlatform == TargetPlatform.android) { + driverAppUrl = + 'https://play.google.com/store/apps/details?id=com.intaleq_driver'; + } else if (defaultTargetPlatform == TargetPlatform.iOS) { + driverAppUrl = + 'https://apps.apple.com/st/app/intaleq-driver/id6482995159'; + } else { + return; + } + try { + final Uri url = Uri.parse(driverAppUrl); + if (await canLaunchUrl(url)) { + await launchUrl(url); + } else { + Get.snackbar('Error', 'Could not launch driver app store.'); + } + } catch (e) { + Get.snackbar('Error', 'Could not open the link.'); + } + } +} + +// ── زر الإجراء السريع ──────────────────────────────────────────────────────── +class _QuickBtn extends StatelessWidget { + final IconData icon; + final String label; + final VoidCallback onTap; + + const _QuickBtn({ + required this.icon, + required this.label, + required this.onTap, + }); + + @override + Widget build(BuildContext context) { + return Expanded( + child: GestureDetector( + onTap: onTap, + child: Container( + padding: const EdgeInsets.symmetric(vertical: 12), + decoration: BoxDecoration( + color: _kBgSurface, + borderRadius: BorderRadius.circular(12), + border: Border.all(color: _kCyan.withValues(alpha: 0.12), width: 1), + ), + child: Column( + mainAxisSize: MainAxisSize.min, + children: [ + Icon(icon, color: _kCyan, size: 22), + const SizedBox(height: 6), + Text( + label, + style: TextStyle( + color: _kTextMuted, + fontSize: 11, + letterSpacing: 0.4, + ), + ), + ], + ), + ), + ), + ); + } +} + +// ── عنصر القائمة ───────────────────────────────────────────────────────────── +class MenuListItem extends StatelessWidget { + const MenuListItem({ + super.key, + required this.title, + required this.onTap, + required this.icon, + this.color, + this.isDestructive = false, + }); + + final String title; + final IconData icon; + final VoidCallback onTap; + final Color? color; + final bool isDestructive; + + @override + Widget build(BuildContext context) { + final iconColor = isDestructive + ? const Color(0xFFFF5252) + : (color ?? _kCyan.withValues(alpha: 0.80)); + final textColor = + isDestructive ? const Color(0xFFFF5252) : (color ?? _kText); + + return Material( + color: Colors.transparent, + child: InkWell( + onTap: onTap, + borderRadius: BorderRadius.circular(12), + splashColor: _kCyan.withValues(alpha: 0.07), + highlightColor: _kCyan.withValues(alpha: 0.04), + child: Padding( + padding: const EdgeInsets.symmetric(horizontal: 12, vertical: 10), + child: Row( + children: [ + // أيقونة بخلفية دقيقة + Container( + width: 36, + height: 36, + decoration: BoxDecoration( + color: isDestructive + ? const Color(0xFFFF5252).withValues(alpha: 0.08) + : _kCyan.withValues(alpha: 0.07), + borderRadius: BorderRadius.circular(10), + ), + child: Icon(icon, size: 19, color: iconColor), + ), + const SizedBox(width: 14), + Expanded( + child: Text( + title.tr, + style: TextStyle( + color: textColor, + fontSize: 15, + fontWeight: FontWeight.w500, + letterSpacing: 0.2, + ), + ), + ), + Icon( + Icons.chevron_right_rounded, + color: _kTextMuted.withValues(alpha: 0.4), + size: 18, + ), + ], + ), + ), + ), + ); + } +} + +// ── رسّام الشبكة ────────────────────────────────────────────────────────────── +class _MenuGridPainter extends CustomPainter { + @override + void paint(Canvas canvas, Size size) { + final paint = Paint() + ..color = AppColor.cyanBlue.withValues(alpha: 0.04) + ..strokeWidth = 0.5; + const spacing = 36.0; + for (double y = 0; y < size.height; y += spacing) { + canvas.drawLine(Offset(0, y), Offset(size.width, y), paint); + } + for (double x = 0; x < size.width; x += spacing) { + canvas.drawLine(Offset(x, 0), Offset(x, size.height), paint); + } + } + + @override + bool shouldRepaint(_MenuGridPainter old) => false; +} diff --git a/siro_rider/lib/views/home/map_widget.dart/menu_map_page.dart b/siro_rider/lib/views/home/map_widget.dart/menu_map_page.dart new file mode 100644 index 0000000..b600c8c --- /dev/null +++ b/siro_rider/lib/views/home/map_widget.dart/menu_map_page.dart @@ -0,0 +1,55 @@ +import 'package:flutter/material.dart'; +import 'package:get/get.dart'; + +import '../../../constant/box_name.dart'; +import '../../../constant/colors.dart'; +import '../../../controller/home/map/map_engine_controller.dart'; +import '../../../main.dart'; + +class MenuIconMapPageWidget extends StatelessWidget { + const MenuIconMapPageWidget({ + super.key, + }); + + @override + Widget build(BuildContext context) { + return GetBuilder( + builder: (controller) => Positioned( + top: Get.height * .008, + left: box.read(BoxName.lang) != 'ar' ? 5 : null, + right: box.read(BoxName.lang) == 'ar' ? 5 : null, + child: Container( + decoration: BoxDecoration( + shape: BoxShape.circle, + color: AppColor.secondaryColor, + border: Border.all(color: AppColor.accentColor)), + child: AnimatedCrossFade( + sizeCurve: Curves.bounceOut, + duration: const Duration( + milliseconds: 300), // Adjust the duration as needed + crossFadeState: controller.heightMenuBool + ? CrossFadeState.showFirst + : CrossFadeState.showSecond, + firstChild: IconButton( + onPressed: () { + controller.getDrawerMenu(); + }, + icon: const Icon( + Icons.close, + color: AppColor.primaryColor, + ), + ), + secondChild: IconButton( + onPressed: () { + controller.getDrawerMenu(); + }, + icon: const Icon( + Icons.menu, + color: AppColor.accentColor, + ), + ), + ), + ), + )); + } +} diff --git a/siro_rider/lib/views/home/map_widget.dart/new_main_bottom_sheet.dart b/siro_rider/lib/views/home/map_widget.dart/new_main_bottom_sheet.dart new file mode 100644 index 0000000..b9c0fde --- /dev/null +++ b/siro_rider/lib/views/home/map_widget.dart/new_main_bottom_sheet.dart @@ -0,0 +1,86 @@ +import 'package:siro_rider/constant/box_name.dart'; +import 'package:siro_rider/constant/colors.dart'; +import 'package:siro_rider/constant/style.dart'; +import 'package:siro_rider/main.dart'; +import 'package:flutter/material.dart'; +import 'package:get/get.dart'; + +class NewMainBottomSheet extends StatelessWidget { + const NewMainBottomSheet({super.key}); + + @override + Widget build(BuildContext context) { + return Positioned( + bottom: 0, + left: 5, + right: 5, + child: Container( + decoration: AppStyle.boxDecoration, + width: Get.width, + height: Get.height * .15, + child: Column( + mainAxisAlignment: MainAxisAlignment.spaceEvenly, + children: [ + Row( + mainAxisAlignment: MainAxisAlignment.spaceAround, + children: [ + Container( + decoration: BoxDecoration( + border: Border.all(), + borderRadius: BorderRadius.circular(15)), + child: Padding( + padding: const EdgeInsets.all(8.0), + child: Row( + children: [ + Text('Home'.tr), + const Icon(Icons.home), + ], + ), + ), + ), + Container( + decoration: BoxDecoration( + border: Border.all(), + borderRadius: BorderRadius.circular(15)), + child: Padding( + padding: const EdgeInsets.all(8.0), + child: Row( + children: [ + Text('Work'.tr), + const Icon(Icons.work_outline), + ], + ), + ), + ), + ], + ), + Row( + mainAxisAlignment: MainAxisAlignment.center, + children: [ + Container( + decoration: BoxDecoration( + border: Border.all(), + borderRadius: BorderRadius.circular(15), + color: AppColor.blueColor.withOpacity(.5), + ), + child: Padding( + padding: const EdgeInsets.all(12), + child: Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + const Icon(Icons.search), + Text( + "${"Where you want go ".tr}${(box.read(BoxName.name).toString().split(' ')[0]).toString()} ?", + ), + ], + ), + ), + ) + ], + ) + ], + ), + ), + ); + } +} diff --git a/siro_rider/lib/views/home/map_widget.dart/passengerRideLoctionWidget.dart b/siro_rider/lib/views/home/map_widget.dart/passengerRideLoctionWidget.dart new file mode 100644 index 0000000..ebdfbc8 --- /dev/null +++ b/siro_rider/lib/views/home/map_widget.dart/passengerRideLoctionWidget.dart @@ -0,0 +1,105 @@ +import 'package:flutter/material.dart'; +import 'package:get/get.dart'; +import 'dart:ui'; // مهم لإضافة تأثير الضبابية + +import '../../../constant/colors.dart'; +import '../../../constant/style.dart'; +import '../../../controller/home/map/location_search_controller.dart'; + +// --- الويدجت الرئيسية بالتصميم الجديد --- +class PassengerRideLocationWidget extends StatefulWidget { + const PassengerRideLocationWidget({super.key}); + + @override + State createState() => + _PassengerRideLocationWidgetState(); +} + +class _PassengerRideLocationWidgetState + extends State + with SingleTickerProviderStateMixin { + late AnimationController _animationController; + late Animation _animation; + + @override + void initState() { + super.initState(); + // --- إعداد الأنيميشن للأيقونة --- + _animationController = AnimationController( + vsync: this, + duration: const Duration(milliseconds: 1200), + )..repeat(reverse: true); // التكرار بشكل عكسي لإنشاء تأثير النبض + + _animation = Tween(begin: 0.9, end: 1.1).animate( + CurvedAnimation(parent: _animationController, curve: Curves.easeInOut), + ); + } + + @override + void dispose() { + _animationController.dispose(); + super.dispose(); + } + + @override + Widget build(BuildContext context) { + return GetBuilder(builder: (controller) { + // --- نفس شرط الإظهار الخاص بك --- + return AnimatedPositioned( + duration: const Duration(milliseconds: 300), + curve: Curves.easeOut, + bottom: controller.isPassengerRideLocationWidget + ? 20 + : -100, // حركة دخول وخروج ناعمة + left: 20, + right: 20, + child: ClipRRect( + borderRadius: BorderRadius.circular(50.0), // حواف دائرية بالكامل + child: BackdropFilter( + filter: ImageFilter.blur(sigmaX: 8.0, sigmaY: 8.0), // تأثير زجاجي + child: Container( + padding: const EdgeInsets.symmetric(horizontal: 20, vertical: 14), + decoration: BoxDecoration( + color: AppColor.secondaryColor.withValues(alpha: 0.85), + borderRadius: BorderRadius.circular(50.0), + border: Border.all(color: AppColor.writeColor.withValues(alpha: 0.2)), + ), + child: Row( + mainAxisAlignment: MainAxisAlignment.center, + children: [ + // --- أيقونة متحركة لجذب الانتباه --- + ScaleTransition( + scale: _animation, + child: Icon( + Icons.location_on, + color: AppColor.primaryColor, + size: 28, + ), + ), + const SizedBox(width: 12), + // --- نص إرشادي واضح --- + Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Text( + "Set pickup location".tr, + style: AppStyle.title + .copyWith(fontWeight: FontWeight.bold), + ), + Text( + "Move the map to adjust the pin".tr, + style: AppStyle.subtitle.copyWith( + color: AppColor.writeColor.withValues(alpha: 0.7), + ), + ), + ], + ), + ], + ), + ), + ), + ), + ); + }); + } +} diff --git a/siro_rider/lib/views/home/map_widget.dart/payment_method.page.dart b/siro_rider/lib/views/home/map_widget.dart/payment_method.page.dart new file mode 100644 index 0000000..5cc7f48 --- /dev/null +++ b/siro_rider/lib/views/home/map_widget.dart/payment_method.page.dart @@ -0,0 +1,417 @@ +import 'package:flutter/material.dart'; + +import 'package:get/get.dart'; +import 'package:siro_rider/constant/box_name.dart'; +import 'package:siro_rider/controller/functions/secure_storage.dart'; +import 'package:siro_rider/controller/home/payment/credit_card_controller.dart'; +import 'package:siro_rider/views/widgets/elevated_btn.dart'; + +import '../../../constant/colors.dart'; +import '../../../constant/style.dart'; +import '../../../controller/home/map/map_engine_controller.dart'; + +class PaymentMethodPage extends StatelessWidget { + const PaymentMethodPage({ + super.key, + }); + + @override + Widget build(BuildContext context) { + return GetBuilder( + builder: (controller) => Positioned( + right: 5, + bottom: 5, + left: 5, + child: AnimatedContainer( + duration: const Duration(milliseconds: 400), + height: controller.isPaymentMethodPageShown + ? controller.paymentPageShown + : 0, + decoration: BoxDecoration( + color: AppColor.secondaryColor, + borderRadius: BorderRadius.circular(15)), + child: Padding( + padding: const EdgeInsets.symmetric(horizontal: 20), + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + Text( + 'My Card'.tr, + style: AppStyle.title.copyWith(fontSize: 22), + ), + IconButton( + onPressed: () => + controller.changePaymentMethodPageShown(), + icon: const Icon(Icons.close), + ), + ], + ), + Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + Text( + 'Add Card'.tr, + style: AppStyle.title, + ), + // GetBuilder( + // builder: (controller) => IconButton( + // onPressed: () { + // // controller.scanCard(); + // // Get.defaultDialog(content: OptionConfigureWidget( + // // initialOptions: scanOptions, + // // onScanOptionChanged: (newOptions) => + // // scanOptions = newOptions, + // // ), + // // ); + // }, + // icon: const Icon(Icons.contact_emergency_sharp), + // ), + // ) + ], + ), + const SizedBox( + height: 10, + ), + const MyCreditCardWidget(), + const Spacer(), + GetBuilder( + builder: (controller) => Row( + mainAxisAlignment: MainAxisAlignment.center, + children: [ + MyElevatedButton( + title: 'Add Credit Card'.tr, + onPressed: () async { + if (controller.formKey.currentState! + .validate()) { + SecureStorage().saveData( + BoxName.cardNumber, + controller + .cardNumberController.text); + SecureStorage().saveData( + BoxName.cardHolderName, + controller + .cardHolderNameController.text); + SecureStorage().saveData( + BoxName.cvvCode, + controller.cvvCodeController.text); + SecureStorage().saveData( + BoxName.expiryDate, + controller + .expiryDateController.text); + } + }, + ), + ], + )) + ], + ), + ), + ), + )); + } +} + +class MyCreditCardWidget extends StatelessWidget { + const MyCreditCardWidget({ + super.key, + }); + + @override + Widget build(BuildContext context) { + Get.put(CreditCardController()); + return GetBuilder( + builder: (controller) => Container( + height: Get.height * .4, + width: Get.width * .9, + decoration: BoxDecoration( + color: AppColor.secondaryColor, + borderRadius: const BorderRadius.all(Radius.circular(15)), + gradient: LinearGradient(colors: [ + AppColor.secondaryColor, + // AppColor.blueColor, + // AppColor.greenColor, + AppColor.accentColor, + // AppColor.primaryColor, + // AppColor.redColor, + // AppColor.yellowColor + ]), + boxShadow: const [ + BoxShadow( + spreadRadius: 3, + offset: Offset(3, 3), + blurRadius: 3, + color: AppColor.redColor), + BoxShadow( + offset: Offset(-3, -3), + blurRadius: 3, + spreadRadius: 3, + color: AppColor.redColor), + ], + ), + child: Form( + key: controller.formKey, + child: Padding( + padding: const EdgeInsets.all(8.0), + child: Column( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + SizedBox( + child: Row( + children: [ + getCardIcon(controller.cardNumberController + .text), // Dynamic credit card icon + SizedBox( + width: Get.width * .03, + ), + SizedBox( + width: Get.width * .25, + child: Text( + 'Card Number'.tr, + style: AppStyle.title, + ), + ), + SizedBox( + width: Get.width * .03, + ), + SizedBox( + width: Get.width * .4, + height: 70, + child: TextFormField( + maxLength: 16, + keyboardType: TextInputType.number, + controller: controller.cardNumberController, + style: const TextStyle( + color: AppColor.blueColor, + fontFamily: 'digital-counter-7', + fontWeight: FontWeight.bold), + decoration: const InputDecoration( + helperStyle: TextStyle( + fontFamily: 'digital-counter-7'), + // labelText: 'Card Number', + ), + // inputFormatters: [DigitObscuringFormatter()], + validator: (value) { + if (value!.isEmpty || value.length != 16) { + return 'Please enter a valid 16-digit card number' + .tr; + } + return null; + }, + ), + ), + ], + ), + ), + Row( + children: [ + const Icon(Icons.person), + SizedBox( + width: Get.width * .03, + ), + SizedBox( + width: Get.width * .25, + child: Text( + 'Holder Name', + style: AppStyle.title, + ), + ), + SizedBox( + width: Get.width * .03, + ), + SizedBox( + width: Get.width * .3, + child: SizedBox( + // height: 50, + child: TextFormField( + style: AppStyle.title, + keyboardType: TextInputType.text, + // maxLength: 16, + controller: controller.cardHolderNameController, + decoration: const InputDecoration( + // labelText: 'Cardholder Name', + ), + validator: (value) { + if (value!.isEmpty) { + return 'Please enter the cardholder name' + .tr; + } + return null; + }, + ), + ), + ) + ], + ), + Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + SizedBox( + width: Get.width * .4, + child: Row( + children: [ + const Icon(Icons.date_range_outlined), + SizedBox( + width: Get.width * .03, + ), + Column( + children: [ + SizedBox( + width: Get.width * .2, + child: Text( + 'Expiry Date', + style: AppStyle.subtitle, + ), + ), + SizedBox( + width: Get.width * .1, + child: SizedBox( + height: 60, + child: TextFormField( + maxLength: 4, + keyboardType: TextInputType.datetime, + controller: + controller.expiryDateController, + style: AppStyle.title, + decoration: const InputDecoration(), + validator: (value) { + if (value!.isEmpty) { + return 'Please enter the expiry date' + .tr; + } + return null; + }, + ), + ), + ) + ], + ), + ], + ), + ), + SizedBox( + width: Get.width * .4, + child: Row( + children: [ + const Icon(Icons.security), + SizedBox( + width: Get.width * .021, + ), + Column( + children: [ + SizedBox( + width: Get.width * .2, + child: Text( + 'CVV Code', + style: AppStyle.subtitle, + ), + ), + SizedBox( + width: Get.width * .2, + child: SizedBox( + height: 60, + child: TextFormField( + obscureText: true, + keyboardType: TextInputType.number, + style: const TextStyle( + color: AppColor.primaryColor, + fontFamily: 'digital-counter-7'), + maxLength: 3, + controller: + controller.cvvCodeController, + decoration: const InputDecoration( + // labelText: 'CVV Code', + ), + validator: (value) { + if (value!.isEmpty && + value.length != 3) { + return 'Please enter the CVV code' + .tr; + } + return null; + }, + ), + ), + ), + ], + ) + ], + ), + ), + ], + ), + // const SizedBox( + // height: 20, + // ), + MyElevatedButton( + title: 'Save'.tr, + onPressed: () { + if (controller.formKey.currentState!.validate()) { + // final creditCard = CreditCardModel( + // cardNumber: controller.cardNumberController.text, + // cardHolderName: + // controller.cardHolderNameController.text, + // expiryDate: controller.expiryDateController.text, + // cvvCode: controller.cvvCodeController.text, + // ); + // Process the credit card details + // You can use GetX to handle the logic here + + if (controller.formKey.currentState!.validate()) { + SecureStorage().saveData(BoxName.cardNumber, + controller.cardNumberController.text); + SecureStorage().saveData(BoxName.cardHolderName, + controller.cardHolderNameController.text); + SecureStorage().saveData(BoxName.cvvCode, + controller.cvvCodeController.text); + SecureStorage().saveData(BoxName.expiryDate, + controller.expiryDateController.text); + } + } + }, + ), + ], + ), + )))); + } + + Widget getCardIcon(String cardNumber) { + String cardType = detectCardType( + cardNumber); // Function to detect card type based on the first digit + + IconData iconData; + Color iconColor; + + switch (cardType) { + case 'Visa': + iconData = Icons.credit_card_rounded; + iconColor = Colors.blue; // Change color for Visa cards + break; + case 'Mastercard': + iconData = Icons.credit_card_rounded; + iconColor = Colors.red; // Change color for Mastercard cards + break; + default: + iconData = Icons.credit_card_rounded; + iconColor = Colors.black; // Default color for other card types + break; + } + + return Icon( + iconData, + color: iconColor, + ); + } + + String detectCardType(String cardNumber) { + if (cardNumber.startsWith('4')) { + return 'Visa'; + } else if (cardNumber.startsWith('5')) { + return 'Mastercard'; + } else { + return 'Other'; + } + } +} diff --git a/siro_rider/lib/views/home/map_widget.dart/picker_animation_container.dart b/siro_rider/lib/views/home/map_widget.dart/picker_animation_container.dart new file mode 100644 index 0000000..92358f7 --- /dev/null +++ b/siro_rider/lib/views/home/map_widget.dart/picker_animation_container.dart @@ -0,0 +1,218 @@ +import 'package:flutter/material.dart'; +import 'package:get/get.dart'; +import 'package:siro_rider/constant/table_names.dart'; + +import '../../../constant/colors.dart'; +import '../../../constant/style.dart'; +import '../../../controller/home/map/location_search_controller.dart'; +import '../../../controller/home/map/map_engine_controller.dart'; +import '../../../controller/home/map/ride_lifecycle_controller.dart'; +import '../../../main.dart'; +import '../../widgets/elevated_btn.dart'; +import 'form_search_places_destenation.dart'; + +class PickerAnimtionContainerFormPlaces extends StatelessWidget { + const PickerAnimtionContainerFormPlaces({super.key}); + + @override + Widget build(BuildContext context) { + final mapEngine = Get.find(); + final locationSearch = Get.find(); + final rideLifecycle = Get.find(); + + return GetBuilder( + builder: (controller) => Positioned( + bottom: 0, + left: 0, + right: 5, + child: AnimatedContainer( + duration: const Duration(milliseconds: 300), + height: controller.heightPickerContainer, + decoration: BoxDecoration( + boxShadow: const [ + BoxShadow( + color: AppColor.accentColor, offset: Offset(2, 2)), + BoxShadow( + color: AppColor.accentColor, offset: Offset(-2, -2)) + ], + color: AppColor.secondaryColor, + borderRadius: const BorderRadius.only( + topLeft: Radius.circular(15), + topRight: Radius.circular(15), + )), + child: Column( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + controller.isPickerShown + ? const SizedBox() + : Text( + 'Hi, Where to '.tr, + style: AppStyle.title, + ), + Column( + mainAxisAlignment: MainAxisAlignment.start, + children: [ + const SizedBox( + height: 5, + ), + controller.isPickerShown + ? InkWell( + onTapDown: (details) { + controller.changePickerShown(); + controller.changeHeightPlaces(); + }, + child: Container( + height: 7, + width: Get.width * .3, + decoration: BoxDecoration( + color: AppColor.accentColor, + borderRadius: BorderRadius.circular(10), + border: Border.all( + color: AppColor.accentColor, + )), + ), + ) + : const SizedBox(), + controller.isPickerShown + ? InkWell( + onTap: () {}, + child: formSearchPlacesDestenation(), + ) + : Row( + mainAxisAlignment: + MainAxisAlignment.spaceEvenly, + children: [ + TextButton( + onPressed: () { + controller.changePickerShown(); + }, + child: Text( + "Pick your destination from Map".tr, + style: AppStyle.subtitle, + ), + ), + TextButton( + onPressed: () async { + List favoritePlaces = await sql + .getAllData(TableName.placesFavorite); + Get.defaultDialog( + title: 'Favorite Places'.tr, + content: SizedBox( + width: Get.width * .8, + height: 300, + child: favoritePlaces.isEmpty + ? Center( + child: Column( + mainAxisAlignment: + MainAxisAlignment.center, + children: [ + const Icon( + Icons + .hourglass_empty_rounded, + size: 99, + color: AppColor + .primaryColor, + ), + Text( + 'You Dont Have Any places yet !' + .tr, + style: AppStyle.title, + ), + ], + ), + ) + : ListView.builder( + itemCount: + favoritePlaces.length, + itemBuilder: + (BuildContext context, + int index) { + return Row( + mainAxisAlignment: + MainAxisAlignment + .spaceBetween, + children: [ + TextButton( + onPressed: () async { + await rideLifecycle + .getDirectionMap( + '${locationSearch.passengerLocation.latitude},${locationSearch.passengerLocation.longitude}', + '${favoritePlaces[index]['latitude']},${favoritePlaces[index]['longitude']}', + ); + controller + .changePickerShown(); + controller + .changeBottomSheetShown( + forceValue: + true); + rideLifecycle + .bottomSheet(); + Get.back(); + }, + child: Text( + favoritePlaces[ + index]['name'], + style: + AppStyle.title, + ), + ), + IconButton( + onPressed: () async { + await sql.deleteData( + TableName + .placesFavorite, + favoritePlaces[ + index] + ['id']); + Get.back(); + Get.snackbar( + 'Deleted ', + '${'You are Delete'.tr} ${favoritePlaces[index]['name']} from your list', + backgroundColor: + AppColor + .accentColor); + }, + icon: const Icon(Icons + .favorite_outlined), + ), + ], + ); + }, + ), + ), + onCancel: () {}, + ); + }, + child: Text( + "Go To Favorite Places".tr, + style: AppStyle.subtitle, + ), + ), + ], + ), + if (controller.isPickerShown && + locationSearch.placesDestination.isEmpty) + MyElevatedButton( + title: 'Go to this Target'.tr, + onPressed: () async { + await rideLifecycle.getDirectionMap( + '${locationSearch.passengerLocation.latitude},${locationSearch.passengerLocation.longitude}', + '${locationSearch.newMyLocation.latitude},${locationSearch.newMyLocation.longitude}', + ); + controller.changePickerShown(); + controller.changeBottomSheetShown( + forceValue: true); + rideLifecycle.bottomSheet(); + }, + ), + if (controller.isPickerShown && + locationSearch.placesDestination.isEmpty) + const SizedBox(), + ], + ), + ], + ), + ), + )); + } +} diff --git a/siro_rider/lib/views/home/map_widget.dart/points_page_for_rider.dart b/siro_rider/lib/views/home/map_widget.dart/points_page_for_rider.dart new file mode 100644 index 0000000..fc6497e --- /dev/null +++ b/siro_rider/lib/views/home/map_widget.dart/points_page_for_rider.dart @@ -0,0 +1,329 @@ +import 'package:flutter/material.dart'; +import 'package:get/get.dart'; +import 'package:siro_rider/constant/style.dart'; + +import '../../../constant/colors.dart'; +import '../../../controller/home/map/location_search_controller.dart'; +import '../../../controller/home/map/map_engine_controller.dart'; +import '../../../controller/home/map/ride_lifecycle_controller.dart'; +import '../../../controller/home/points_for_rider_controller.dart'; + +class PointsPageForRider extends StatelessWidget { + PointsPageForRider({ + super.key, + }); + + final locationSearch = Get.find(); + final mapEngine = Get.find(); + final rideLifecycle = Get.find(); + + @override + Widget build(BuildContext context) { + Get.find(); + + return GetBuilder(builder: (controller) { + return Positioned( + bottom: 2, + left: 2, + right: 2, + child: AnimatedContainer( + duration: const Duration(milliseconds: 300), + height: controller.wayPointSheetHeight, + decoration: AppStyle.boxDecoration, + child: ListView( + children: [ + // const AppBarPointsPageForRider(), + Row( + mainAxisAlignment: MainAxisAlignment.spaceEvenly, + children: [ + IconButton( + onPressed: () { + mapEngine.downPoints(); + }, + icon: const Icon(Icons.arrow_drop_down_circle_outlined), + ), + GetBuilder(builder: (wayPointController) { + return Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + ElevatedButton( + onPressed: () { + wayPointController.addWayPoints(); + controller.isWayPointStopsSheetUtilGetMap = true; + }, + child: const Text('Add Stops'), + ), + wayPointController.wayPoints.length > 1 + ? ElevatedButton( + onPressed: () async { + locationSearch + .getMapPointsForAllMethods(); + }, + child: const Text('Get Direction'), + ) + : const SizedBox() + ], + ); + }), + ], + ), + SizedBox( + height: Get.height * .36, + child: GetBuilder( + builder: (wayPointController) { + return ReorderableListView( + // The children of the list are the text fields + children: wayPointController.wayPoints + .asMap() + .entries + .map((entry) { + final index = entry.key; + return Padding( + key: ValueKey(index), + padding: const EdgeInsets.all(1), + child: ListTile( + leading: Container( + decoration: BoxDecoration( + color: AppColor.deepPurpleAccent, + border: Border.all(), + shape: BoxShape.rectangle), + child: Padding( + padding: const EdgeInsets.all(2), + child: Text( + index.toString(), + style: AppStyle.title, + ), + )), + title: InkWell( + onTap: () { + // showAddLocationDialog(context); + Get.defaultDialog( + content: SizedBox( + width: Get.width, + height: 400, + child: locationSearch + .placeListResponse[index]), + ); + }, + child: Container( + decoration: BoxDecoration( + border: Border.all(), + color: + AppColor.accentColor.withValues(alpha: 0.5)), + child: Row( + mainAxisAlignment: + MainAxisAlignment.spaceBetween, + children: [ + Text(index > 0 + ? locationSearch + .currentLocationStringAll[index] + .toString() + : ''), + const Icon( + Icons.reorder, + size: 20, + ), + ], + ), + ), + ), + trailing: index > 0 + ? IconButton( + icon: const Icon(Icons.close), + onPressed: () { + wayPointController.removeTextField(index); + }, + ) + : IconButton( + icon: Icon( + Icons.close, + color: AppColor.secondaryColor, + ), + onPressed: () {}, + )), + ); + }).toList(), + + // The callback when the user reorders the text fields + onReorder: (int oldIndex, int newIndex) { + wayPointController.reorderTextFields(oldIndex, newIndex); + }, + ); + }), + ), + ], + ), + ), + ); + }); + } + + // GetBuilder( + // builder: (controller) => Container( + // decoration: AppStyle.boxDecoration, + // height: Get.height * + // .5, // height: controller.heightPointsPageForRider, + // width: Get.width, + // child: Column( + // children: [ + // SizedBox( + // height: 300, + // child: ReorderableListView( + // onReorder: (oldIndex, newIndex) { + // if (oldIndex < newIndex) { + // newIndex -= 1; + // } + // pointsForRiderController.locations.insert( + // newIndex, + // pointsForRiderController.locations + // .removeAt(oldIndex)); + // }, + // children: [ + // for (int i = 0; + // i < pointsForRiderController.locations.length; + // i++) + // ListTile( + // key: Key('$i'), + // title: DragTarget( + // onAccept: (int data) { + // pointsForRiderController.locations + // .insert(i, 'New Text Field'); + // }, + // builder: (context, candidateData, rejectedData) { + // return Row( + // children: [ + // SizedBox( + // width: 300, + // child: TextField( + // controller: TextEditingController( + // text: pointsForRiderController + // .locations[i]), + // onChanged: (value) { + // pointsForRiderController + // .locations[i] = value; + // }, + // decoration: InputDecoration( + // prefixIcon: IconButton( + // onPressed: () { + // pointsForRiderController + // .removeLocation(i); + // }, + // icon: const Icon(Icons.delete), + // ), + // labelText: 'Text Field ${i + 1}', + // border: const OutlineInputBorder(), + // ), + // ), + // ), + // IconButton( + // onPressed: () { + // // pointsForRiderController.onReorder( + // // index, newIndex); + // }, + // icon: const Icon(Icons.reorder), + // ), + // ], + // ); + // }, + // ), + // ), + // ], + // ), + // ), + // ElevatedButton( + // onPressed: () { + // pointsForRiderController.addLocation('location'); + // }, + // child: const Text('Add Text Field'), + // ), + // ], + // ), + // )); +} + +void showAddLocationDialog(BuildContext context, int index) { + // Get.put(WayPointController()); + showDialog( + context: context, + builder: (context) { + return Dialog.fullscreen( + // title: const Text('Add Location'), + child: Column( + children: [ + Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + IconButton( + onPressed: () { + Get.back(); + }, + icon: const Icon( + Icons.close, + size: 40, + ), + ), + Text( + 'Add Location'.tr, + style: AppStyle.title, + ), + Icon( + Icons.clear, + color: AppColor.secondaryColor, + ) + ], + ), + // SizedBox( + // width: Get.width, + // child: formSearchCaptain(), + // ), + ], + ), + ); + }, + ); +} + +class AppBarPointsPageForRider extends StatelessWidget { + const AppBarPointsPageForRider({ + super.key, + }); + + @override + Widget build(BuildContext context) { + return Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + IconButton( + onPressed: () {}, + icon: const Icon( + Icons.arrow_back_ios_new_rounded, + color: AppColor.primaryColor, + ), + ), + Row( + children: [ + CircleAvatar( + backgroundColor: AppColor.primaryColor, + maxRadius: 15, + child: Icon( + Icons.person, + color: AppColor.secondaryColor, + ), + ), + TextButton( + onPressed: () {}, + child: Text( + "Switch Rider".tr, + style: AppStyle.title, + ), + ), + ], + ), + Icon( + Icons.clear, + color: AppColor.secondaryColor, + ) + ], + ); + } +} diff --git a/siro_rider/lib/views/home/map_widget.dart/ride_begin_passenger.dart b/siro_rider/lib/views/home/map_widget.dart/ride_begin_passenger.dart new file mode 100644 index 0000000..1a1bd0d --- /dev/null +++ b/siro_rider/lib/views/home/map_widget.dart/ride_begin_passenger.dart @@ -0,0 +1,347 @@ +import 'package:flutter/material.dart'; +import 'package:flutter_font_icons/flutter_font_icons.dart'; +import 'package:get/get.dart'; +import 'package:intl/intl.dart'; + +// تأكد من المسارات +import '../../../constant/box_name.dart'; +import '../../../constant/colors.dart'; +import '../../../constant/links.dart'; +import '../../../constant/style.dart'; +import '../../../controller/functions/audio_record1.dart'; +import '../../../controller/functions/launch.dart'; +import '../../../controller/functions/toast.dart'; +import '../../../controller/home/map/ride_lifecycle_controller.dart'; +import '../../../controller/home/map/ui_interactions_controller.dart'; +import '../../../controller/home/map/ride_state.dart'; +import '../../../controller/profile/profile_controller.dart'; +import '../../../main.dart'; +import '../../../views/home/profile/complaint_page.dart'; + +class RideBeginPassenger extends StatelessWidget { + const RideBeginPassenger({super.key}); + + @override + Widget build(BuildContext context) { + final ProfileController profileController = Get.put(ProfileController()); + final AudioRecorderController audioController = + Get.put(AudioRecorderController()); + final uiController = Get.find(); + + return Obx(() { + final controller = Get.find(); + + // شرط الإظهار + final bool isVisible = + controller.currentRideState.value == RideState.inProgress && + controller.isStartAppHasRide == false; + + return AnimatedPositioned( + duration: const Duration(milliseconds: 500), + curve: Curves.easeInOutCubic, + // تم تقليل قيمة الإخفاء لأن الارتفاع الكلي للنافذة أصبح أصغر + bottom: isVisible ? 0 : -300, + left: 0, + right: 0, + child: Container( + decoration: BoxDecoration( + color: AppColor.secondaryColor, + borderRadius: const BorderRadius.only( + topLeft: Radius.circular(25), + topRight: Radius.circular(25), + ), + boxShadow: [ + BoxShadow( + color: Get.isDarkMode + ? Colors.black.withValues(alpha: 0.4) + : Colors.black.withValues(alpha: 0.1), + blurRadius: 20, + spreadRadius: 2, + offset: const Offset(0, -3), + ), + ], + ), + child: Padding( + padding: const EdgeInsets.symmetric(horizontal: 16, vertical: 10), + child: Column( + mainAxisSize: MainAxisSize.min, + children: [ + // 1. مقبض السحب + Center( + child: Container( + width: 40, + height: 4, + decoration: BoxDecoration( + color: AppColor.grayColor.withValues(alpha: 0.3), + borderRadius: BorderRadius.circular(10), + ), + ), + ), + const SizedBox(height: 12), + + // 2. هيدر المعلومات (سائق + سيارة + سعر) + _buildCompactHeader(controller), + + const SizedBox(height: 12), + + // خط فاصل خفيف + Divider( + height: 1, + thickness: 0.5, + color: AppColor.grayColor.withValues(alpha: 0.2)), + + const SizedBox(height: 12), + + // 3. الأزرار (إجراءات) + _buildCompactActionButtons( + context, controller, profileController, audioController), + + // إضافة هامش سفلي بسيط لرفع الأزرار عن حافة الشاشة + const SizedBox(height: 5), + ], + ), + ), + ), + ); + }); + } + + // --- الهيدر (بدون تغيير، ممتاز) --- + Widget _buildCompactHeader(RideLifecycleController controller) { + return Row( + children: [ + // صورة السائق + Container( + decoration: BoxDecoration( + shape: BoxShape.circle, + border: Border.all( + color: AppColor.primaryColor.withValues(alpha: 0.5), width: 1.5), + ), + child: CircleAvatar( + radius: 24, + backgroundImage: NetworkImage( + '${AppLink.server}/portrate_captain_image/${controller.driverId}.jpg'), + onBackgroundImageError: (_, __) => const Icon(Icons.person), + ), + ), + const SizedBox(width: 10), + + // الاسم ومعلومات السيارة + Expanded( + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Row( + children: [ + Flexible( + child: Text( + controller.driverName, + style: TextStyle( + fontWeight: FontWeight.bold, + fontSize: 15, + color: AppColor.writeColor, + ), + maxLines: 1, + overflow: TextOverflow.ellipsis, + ), + ), + const SizedBox(width: 4), + const Icon(Icons.star, color: Colors.amber, size: 14), + Text( + controller.driverRate, + style: const TextStyle( + fontSize: 12, fontWeight: FontWeight.bold), + ), + ], + ), + const SizedBox(height: 2), + Row( + children: [ + Flexible( + child: Text( + '${controller.model} • ', + style: TextStyle(fontSize: 12, color: AppColor.grayColor), + maxLines: 1, + overflow: TextOverflow.ellipsis, + ), + ), + Container( + padding: + const EdgeInsets.symmetric(horizontal: 4, vertical: 1), + decoration: BoxDecoration( + color: AppColor.writeColor.withValues(alpha: 0.05), + border: Border.all( + color: AppColor.grayColor.withValues(alpha: 0.2)), + borderRadius: BorderRadius.circular(4), + ), + child: Text( + controller.licensePlate, + style: const TextStyle( + fontFamily: 'monospace', + fontSize: 11, + fontWeight: FontWeight.w900, + ), + ), + ), + ], + ), + ], + ), + ), + + // السعر + Container( + padding: const EdgeInsets.symmetric(horizontal: 10, vertical: 6), + decoration: BoxDecoration( + color: AppColor.primaryColor.withValues(alpha: 0.08), + borderRadius: BorderRadius.circular(8), + ), + child: Column( + crossAxisAlignment: CrossAxisAlignment.end, + children: [ + Text( + NumberFormat('#,###').format(controller.totalPassenger), + style: const TextStyle( + fontWeight: FontWeight.w900, + fontSize: 16, + color: AppColor.primaryColor, + ), + ), + Text('SYP', + style: TextStyle(fontSize: 9, color: AppColor.grayColor)), + ], + ), + ), + ], + ); + } + + // --- الأزرار (بدون تغيير) --- + Widget _buildCompactActionButtons( + BuildContext context, + RideLifecycleController controller, + ProfileController profileController, + AudioRecorderController audioController) { + final uiController = Get.find(); + return SizedBox( + height: 60, + child: Row( + mainAxisAlignment: MainAxisAlignment.spaceAround, + children: [ + _compactBtn( + icon: Icons.sos_rounded, + label: 'SOS'.tr, + color: AppColor.redColor, + bgColor: AppColor.redColor.withValues(alpha: 0.1), + onTap: () async { + if (box.read(BoxName.sosPhonePassenger) == null) { + await profileController.updatField( + 'sosPhone', TextInputType.phone); + box.write(BoxName.sosPhonePassenger, + profileController.prfoileData['sosPhone']); + } else { + makePhoneCall('112'); + } + }, + ), + _compactBtn( + icon: FontAwesome.whatsapp, + label: 'WhatsApp'.tr, + color: const Color(0xFF25D366), + bgColor: const Color(0xFF25D366).withValues(alpha: 0.1), + onTap: () async { + final phone = box.read(BoxName.sosPhonePassenger); + if (phone == null || phone.toString().isEmpty) { + // لا يوجد رقم طوارئ — نعرض الديالوج لإدخاله + await uiController.shareTripWithFamily(); + } else { + final formattedPhone = uiController.formatSyrianPhoneNumber( + phone.toString()); + uiController.sendWhatsapp(formattedPhone); + } + }, + ), + + _compactBtn( + icon: Icons.share, + label: 'Share'.tr, + color: AppColor.primaryColor, + bgColor: AppColor.primaryColor.withValues(alpha: 0.1), + onTap: () async => await uiController.shareTripWithFamily(), + ), + GetBuilder( + init: audioController, + builder: (audioCtx) { + return _compactBtn( + icon: audioCtx.isRecording + ? Icons.stop_circle_outlined + : Icons.mic_none_outlined, + label: audioCtx.isRecording ? 'Stop'.tr : 'Record'.tr, + color: audioCtx.isRecording + ? AppColor.redColor + : AppColor.primaryColor, + bgColor: audioCtx.isRecording + ? AppColor.redColor.withValues(alpha: 0.1) + : AppColor.primaryColor.withValues(alpha: 0.1), + onTap: () async { + if (!audioCtx.isRecording) { + await audioCtx.startRecording(rideId: controller.rideId); + if (context.mounted) { + Toast.show(context, 'Start Record'.tr, AppColor.greenColor); + } + } else { + await audioCtx.stopRecording(); + if (context.mounted) { + Toast.show(context, 'Record saved'.tr, AppColor.greenColor); + } + } + }, + ); + }, + ), + _compactBtn( + icon: Icons.info_outline_rounded, + label: 'Report'.tr, + color: AppColor.grayColor, + bgColor: AppColor.writeColor.withValues(alpha: 0.1), + onTap: () => Get.to(() => ComplaintPage()), + ), + ], + ), + ); + } + + Widget _compactBtn({ + required IconData icon, + required String label, + required Color color, + required Color bgColor, + required VoidCallback onTap, + }) { + return InkWell( + onTap: onTap, + borderRadius: BorderRadius.circular(10), + child: Column( + mainAxisAlignment: MainAxisAlignment.center, + children: [ + Container( + padding: const EdgeInsets.all(8), + decoration: BoxDecoration( + color: bgColor, + shape: BoxShape.circle, + ), + child: Icon(icon, size: 20, color: color), + ), + const SizedBox(height: 4), + Text( + label, + style: TextStyle( + fontSize: 10, + color: AppColor.grayColor, + fontWeight: FontWeight.w500), + ), + ], + ), + ); + } +} diff --git a/siro_rider/lib/views/home/map_widget.dart/ride_from_start_app.dart b/siro_rider/lib/views/home/map_widget.dart/ride_from_start_app.dart new file mode 100644 index 0000000..724ef81 --- /dev/null +++ b/siro_rider/lib/views/home/map_widget.dart/ride_from_start_app.dart @@ -0,0 +1,324 @@ +import 'package:siro_rider/controller/functions/launch.dart'; +import 'package:flutter/material.dart'; +import 'package:flutter_font_icons/flutter_font_icons.dart'; +import 'package:get/get.dart'; + +// ... استيراد ملفاتك الأخرى ... +import '../../../constant/box_name.dart'; +import '../../../constant/colors.dart'; +import '../../../constant/links.dart'; +import '../../../constant/style.dart'; +import '../../../controller/home/map/ride_lifecycle_controller.dart'; +import '../../../controller/home/map/ui_interactions_controller.dart'; +import '../../../controller/home/map/ride_state.dart'; +import '../../../controller/profile/profile_controller.dart'; +import '../../../main.dart'; + +class RideFromStartApp extends StatelessWidget { + const RideFromStartApp({super.key}); + + @override + Widget build(BuildContext context) { + final profileController = Get.put(ProfileController()); + final RideLifecycleController controller = + Get.find(); + final UiInteractionsController uiController = + Get.find(); + + return Obx(() { + final bool isRideActive = + controller.currentRideState.value == RideState.inProgress && + controller.isStartAppHasRide == true; + + if (!isRideActive) return const SizedBox(); + + // قراءة البيانات + final rideData = controller.rideStatusFromStartApp['data'] ?? {}; + final driverId = rideData['driver_id']; + final driverName = rideData['driverName'] ?? 'Captain'.tr; + final driverRate = controller.driverRate; + final carType = rideData['carType'] ?? 'Car'.tr; + final carModel = controller.model ?? ''; + final arrivalTime = box.read(BoxName.arrivalTime) ?? '--:--'; + + // تحديد البيانات للعرض + final displayTime = controller.stringRemainingTimeRideBegin.isNotEmpty + ? controller.stringRemainingTimeRideBegin + : arrivalTime; + final displayDistance = rideData['distance']?.toStringAsFixed(1) ?? 'N/A'; + final displayPrice = rideData['price']?.toString() ?? 'N/A'; + + return Positioned( + left: 0, + right: 0, + bottom: 0, // ملتصق بالأسفل تماماً + child: Container( + padding: const EdgeInsets.symmetric(horizontal: 20, vertical: 15), + decoration: BoxDecoration( + color: AppColor.secondaryColor, // خلفية متفاعلة + borderRadius: BorderRadius.only( + topLeft: Radius.circular(25), + topRight: Radius.circular(25), + ), + boxShadow: [ + BoxShadow( + color: Get.isDarkMode + ? Colors.black.withValues(alpha: 0.4) + : Colors.black12, + blurRadius: 15.0, + spreadRadius: 5.0, + offset: const Offset(0, -5), + ), + ], + ), + child: Column( + mainAxisSize: MainAxisSize.min, + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + // 1. مقبض صغير للدلالة على السحب (تصميم جمالي) + Center( + child: Container( + width: 40, + height: 4, + margin: const EdgeInsets.only(bottom: 15), + decoration: BoxDecoration( + color: AppColor.grayColor.withValues(alpha: 0.3), + borderRadius: BorderRadius.circular(10), + ), + ), + ), + + // 2. حالة الرحلة + معلومات السائق + Row( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + // صورة السائق + Container( + padding: const EdgeInsets.all(2), + decoration: BoxDecoration( + shape: BoxShape.circle, + border: + Border.all(color: AppColor.primaryColor, width: 2), + ), + child: CircleAvatar( + radius: 28, + backgroundImage: NetworkImage( + '${AppLink.server}/portrate_captain_image/$driverId.jpg'), + ), + ), + const SizedBox(width: 12), + + // الاسم والسيارة + Expanded( + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Text( + driverName, + style: AppStyle.title.copyWith( + fontSize: 16, + fontWeight: FontWeight.bold, + color: AppColor.writeColor, + ), + maxLines: 1, + overflow: TextOverflow.ellipsis, + ), + const SizedBox(height: 4), + Row( + children: [ + Icon(Icons.star, + color: AppColor.yellowColor, size: 16), + const SizedBox(width: 4), + Text( + driverRate, + style: AppStyle.title.copyWith( + fontSize: 13, fontWeight: FontWeight.bold), + ), + const SizedBox(width: 8), + Container( + width: 1, + height: 12, + color: AppColor.grayColor.withValues(alpha: 0.3)), + const SizedBox(width: 8), + Text( + "$carType - $carModel", + style: AppStyle.title.copyWith( + fontSize: 13, color: AppColor.grayColor), + ), + ], + ), + ], + ), + ), + + // حالة الرحلة (نص ملون) + _buildStatusBadge(controller.currentRideState.value), + ], + ), + + const SizedBox(height: 20), + + // 3. شريط المعلومات (وقت، مسافة، سعر) + Container( + padding: + const EdgeInsets.symmetric(vertical: 12, horizontal: 10), + decoration: BoxDecoration( + color: AppColor.grayColor + .withValues(alpha: 0.1), // خلفية رمادية خفيفة جداً + borderRadius: BorderRadius.circular(15), + ), + child: Row( + mainAxisAlignment: MainAxisAlignment.spaceAround, + children: [ + _buildInfoColumn( + Icons.access_time_filled, displayTime, "Time".tr), + _buildVerticalDivider(), + _buildInfoColumn(Icons.location_on, "$displayDistance KM", + "Distance".tr), + _buildVerticalDivider(), + _buildInfoColumn( + Icons.attach_money, "$displayPrice SYP", "Price".tr), + ], + ), + ), + + const SizedBox(height: 20), + + // 4. أزرار التحكم (SOS & Share) + Row( + children: [ + // زر المشاركة (يأخذ مساحة أكبر) + Expanded( + flex: 2, + child: ElevatedButton.icon( + onPressed: () => _checkAndCall( + uiController.sendWhatsapp, profileController), + icon: + const Icon(FontAwesome.whatsapp, color: Colors.white), + label: Text("Share Trip".tr, + style: const TextStyle(color: Colors.white)), + style: ElevatedButton.styleFrom( + backgroundColor: AppColor.greenColor, + padding: const EdgeInsets.symmetric(vertical: 12), + shape: RoundedRectangleBorder( + borderRadius: BorderRadius.circular(12), + ), + elevation: 0, + ), + ), + ), + const SizedBox(width: 10), + // زر الاستغاثة SOS + Expanded( + flex: 1, + child: ElevatedButton.icon( + onPressed: () => + makePhoneCall(box.read(BoxName.sosPhonePassenger)), + icon: const Icon(Icons.sos, color: Colors.white), + label: Text("SOS".tr, + style: const TextStyle(color: Colors.white)), + style: ElevatedButton.styleFrom( + backgroundColor: AppColor.redColor, + padding: const EdgeInsets.symmetric(vertical: 12), + shape: RoundedRectangleBorder( + borderRadius: BorderRadius.circular(12), + ), + elevation: 0, + ), + ), + ), + ], + ), + ], + ), + ), + ); + }); + } + + // ------------------------- Widgets Helper Methods ------------------------- + + Widget _buildStatusBadge(RideState status) { + String text; + Color color; + + if (status == RideState.inProgress) { + text = 'On Trip'.tr; + color = AppColor.primaryColor; + } else if (status == RideState.driverArrived) { + text = 'Arrived'.tr; + color = AppColor.greenColor; + } else { + text = 'Coming'.tr; + color = AppColor.yellowColor; + } + + return Container( + padding: const EdgeInsets.symmetric(horizontal: 10, vertical: 5), + decoration: BoxDecoration( + color: color.withValues(alpha: 0.1), + borderRadius: BorderRadius.circular(8), + border: Border.all(color: color.withValues(alpha: 0.5)), + ), + child: Text( + text, + style: TextStyle( + color: color, + fontWeight: FontWeight.bold, + fontSize: 12, + ), + ), + ); + } + + Widget _buildInfoColumn(IconData icon, String value, String label) { + return Column( + children: [ + Icon(icon, + color: AppColor.primaryColor, + size: 22), // افترضت أن السكندري لون داكن، أو استخدم Primary + const SizedBox(height: 4), + Text( + value, + style: TextStyle( + fontWeight: FontWeight.w800, + fontSize: 15, + color: AppColor.writeColor, + ), + ), + Text( + label, + style: TextStyle( + fontSize: 11, + color: AppColor.grayColor, + ), + ), + ], + ); + } + + Widget _buildVerticalDivider() { + return Container( + height: 30, + width: 1, + color: AppColor.grayColor.withValues(alpha: 0.2), + ); + } + + // دالة المساعدة للمنطق (بقيت كما هي ولكن تم تمرير البروفايل كونترولر) + Future _checkAndCall( + Function(String) action, ProfileController profileController) async { + String? sosPhone = box.read(BoxName.sosPhonePassenger); + if (sosPhone == null || sosPhone == 'sos') { + await profileController.updatField('sosPhone', TextInputType.phone); + sosPhone = profileController.prfoileData['sosPhone']; + } + + if (sosPhone != null && sosPhone != 'sos') { + action(sosPhone); + } else { + Get.snackbar('Warning'.tr, 'Please set a valid SOS phone number.'.tr, + backgroundColor: AppColor.redColor, colorText: Colors.white); + } + } +} diff --git a/siro_rider/lib/views/home/map_widget.dart/searching_captain_window.dart b/siro_rider/lib/views/home/map_widget.dart/searching_captain_window.dart new file mode 100644 index 0000000..9a29ab5 --- /dev/null +++ b/siro_rider/lib/views/home/map_widget.dart/searching_captain_window.dart @@ -0,0 +1,470 @@ +import 'package:flutter/material.dart'; +import 'package:get/get.dart'; +import 'package:siro_rider/constant/colors.dart'; +import 'package:siro_rider/constant/style.dart'; +import 'package:siro_rider/controller/home/map/ride_lifecycle_controller.dart'; +import 'package:siro_rider/controller/home/map/ride_state.dart'; + +// --- الويدجت الرئيسية بالتصميم الجديد --- +class SearchingCaptainWindow extends StatefulWidget { + const SearchingCaptainWindow({super.key}); + + @override + State createState() => _SearchingCaptainWindowState(); +} + +class _SearchingCaptainWindowState extends State + with SingleTickerProviderStateMixin { + late AnimationController _animationController; + + @override + void initState() { + super.initState(); + _animationController = AnimationController( + vsync: this, + duration: const Duration(seconds: 2), + )..repeat(); + } + + @override + void dispose() { + _animationController.dispose(); + super.dispose(); + } + + @override + Widget build(BuildContext context) { + // [تعديل 1] نستخدم Obx للاستماع إلى التغييرات في حالة الرحلة + return Obx(() { + // ابحث عن الكنترولر مرة واحدة + final controller = Get.find(); + + // [تعديل 2] شرط الإظهار يعتمد الآن على حالة الرحلة مباشرة + final bool isVisible = + controller.currentRideState.value == RideState.searching; + + return AnimatedPositioned( + duration: const Duration(milliseconds: 300), + curve: Curves.easeInOut, + bottom: isVisible ? 0 : -Get.height * 0.45, // زيادة الارتفاع قليلاً + left: 0, + right: 0, + child: Container( + padding: const EdgeInsets.fromLTRB(20, 20, 20, 16), + decoration: BoxDecoration( + color: AppColor.secondaryColor, + borderRadius: const BorderRadius.only( + topLeft: Radius.circular(24), + topRight: Radius.circular(24), + ), + boxShadow: [ + BoxShadow( + color: Colors.black.withValues(alpha: 0.2), + blurRadius: 20, + offset: const Offset(0, -5), + ), + ], + ), + child: Column( + mainAxisSize: MainAxisSize.min, + children: [ + // --- 1. أنيميشن الرادار --- + _buildRadarAnimation(controller), + const SizedBox(height: 20), + + // --- 2. زر الإلغاء --- + SizedBox( + width: double.infinity, + child: OutlinedButton( + onPressed: () { + // [تعديل 3] استدعاء دالة الإلغاء الموحدة + controller.changeCancelRidePageShow(); + // (); + }, + style: OutlinedButton.styleFrom( + foregroundColor: AppColor.writeColor, + side: + BorderSide(color: AppColor.writeColor.withValues(alpha: 0.3)), + shape: RoundedRectangleBorder( + borderRadius: BorderRadius.circular(12)), + padding: const EdgeInsets.symmetric(vertical: 12), + ), + child: Text('Cancel Search'.tr), + ), + ), + ], + ), + ), + ); + }); + } + + // --- ويدجت بناء أنيميشن الرادار --- + Widget _buildRadarAnimation(RideLifecycleController controller) { + return SizedBox( + height: 180, // ارتفاع ثابت لمنطقة الأنيميشن + child: Stack( + alignment: Alignment.center, + children: [ + // --- دوائر الرادار المتحركة (تبقى كما هي) --- + ...List.generate(3, (index) { + return FadeTransition( + opacity: Tween(begin: 1.0, end: 0.0).animate( + CurvedAnimation( + parent: _animationController, + curve: Interval((index) / 3, 1.0, curve: Curves.easeInOut), + ), + ), + child: ScaleTransition( + scale: Tween(begin: 0.3, end: 1.0).animate( + CurvedAnimation( + parent: _animationController, + curve: Interval((index) / 3, 1.0, curve: Curves.easeInOut), + ), + ), + child: Container( + decoration: BoxDecoration( + shape: BoxShape.circle, + border: Border.all( + color: AppColor.primaryColor.withValues(alpha: 0.7), + width: 2, + ), + ), + ), + ), + ); + }), + // --- المحتوى في المنتصف --- + Column( + mainAxisAlignment: MainAxisAlignment.center, + children: [ + Text( + // [تعديل 4] النص يأتي مباشرة من الكنترولر + controller.driversStatusForSearchWindow, + style: AppStyle.headTitle.copyWith(fontSize: 20), + textAlign: TextAlign.center, + ), + const SizedBox(height: 8), + Text( + 'Searching for the nearest captain...'.tr, + style: AppStyle.subtitle + .copyWith(color: AppColor.writeColor.withValues(alpha: 0.7)), + textAlign: TextAlign.center, + ), + const SizedBox(height: 16), + + // --- [!! تعديل جوهري !!] --- + // لم نعد بحاجة لـ buildTimerForIncrease + // المؤقت الرئيسي في الكنترولر هو من يقرر متى يعرض الحوار + // وهذا الجزء من الواجهة أصبح "غبياً" (لا يحتوي على منطق) + // الكنترولر سيستدعي _showIncreaseFeeDialog مباشرة + SizedBox( + height: 40, + width: 40, + child: Stack( + fit: StackFit.expand, + children: [ + CircularProgressIndicator( + strokeWidth: 3, + color: AppColor.primaryColor, + backgroundColor: AppColor.primaryColor.withValues(alpha: 0.2), + ), + Center( + child: Icon( + Icons.search, + color: AppColor.writeColor.withValues(alpha: 0.8), + ), + ), + ], + ), + ), + ], + ), + ], + ), + ); + } +} + +// --- [!! تعديل جوهري !!] --- +// تم حذف دالة `buildTimerForIncrease` بالكامل. +// تم حذف دالة `_showIncreaseFeeDialog` من هذا الملف. +// لماذا؟ لأن الكنترولر الآن هو المسؤول الوحيد عن إظهار الحوار. +// دالة `_showIncreaseFeeDialog` موجودة بالفعل داخل `map_passenger_controller.dart` +// وسيتم استدعاؤها من `_handleRideState` عند انتهاء مهلة الـ 90 ثانية. + +// // --- الويدجت الرئيسية بالتصميم الجديد --- +// class SearchingCaptainWindow extends StatefulWidget { +// const SearchingCaptainWindow({super.key}); + +// @override +// State createState() => _SearchingCaptainWindowState(); +// } + +// class _SearchingCaptainWindowState extends State +// with SingleTickerProviderStateMixin { +// late AnimationController _animationController; + +// @override +// void initState() { +// super.initState(); +// _animationController = AnimationController( +// vsync: this, +// duration: const Duration(seconds: 2), +// )..repeat(); +// } + +// @override +// void dispose() { +// _animationController.dispose(); +// super.dispose(); +// } + +// @override +// Widget build(BuildContext context) { +// return GetBuilder( +// builder: (controller) { +// return AnimatedPositioned( +// duration: const Duration(milliseconds: 300), +// curve: Curves.easeInOut, +// bottom: controller.isSearchingWindow ? 0 : -Get.height * 0.4, +// left: 0, +// right: 0, +// child: Container( +// padding: const EdgeInsets.fromLTRB(20, 20, 20, 16), +// decoration: BoxDecoration( +// color: AppColor.secondaryColor, +// borderRadius: const BorderRadius.only( +// topLeft: Radius.circular(24), +// topRight: Radius.circular(24), +// ), +// boxShadow: [ +// BoxShadow( +// color: Colors.black.withOpacity(0.2), +// blurRadius: 20, +// offset: const Offset(0, -5), +// ), +// ], +// ), +// child: Column( +// mainAxisSize: MainAxisSize.min, +// children: [ +// // --- 1. أنيميشن الرادار --- +// _buildRadarAnimation(controller), +// const SizedBox(height: 20), + +// // --- 2. زر الإلغاء --- +// SizedBox( +// width: double.infinity, +// child: OutlinedButton( +// onPressed: () { +// // --- نفس منطقك للإلغاء --- +// controller.changeCancelRidePageShow(); +// }, +// style: OutlinedButton.styleFrom( +// foregroundColor: AppColor.writeColor, +// side: BorderSide( +// color: AppColor.writeColor.withOpacity(0.3)), +// shape: RoundedRectangleBorder( +// borderRadius: BorderRadius.circular(12)), +// padding: const EdgeInsets.symmetric(vertical: 12), +// ), +// child: Text('Cancel Search'.tr), +// ), +// ), +// ], +// ), +// ), +// ); +// }, +// ); +// } + +// // --- ويدجت بناء أنيميشن الرادار --- +// Widget _buildRadarAnimation(MapPassengerController controller) { +// return SizedBox( +// height: 180, // ارتفاع ثابت لمنطقة الأنيميشن +// child: Stack( +// alignment: Alignment.center, +// children: [ +// // --- دوائر الرادار المتحركة --- +// ...List.generate(3, (index) { +// return FadeTransition( +// opacity: Tween(begin: 1.0, end: 0.0).animate( +// CurvedAnimation( +// parent: _animationController, +// curve: Interval((index) / 3, 1.0, curve: Curves.easeInOut), +// ), +// ), +// child: ScaleTransition( +// scale: Tween(begin: 0.3, end: 1.0).animate( +// CurvedAnimation( +// parent: _animationController, +// curve: Interval((index) / 3, 1.0, curve: Curves.easeInOut), +// ), +// ), +// child: Container( +// decoration: BoxDecoration( +// shape: BoxShape.circle, +// border: Border.all( +// color: AppColor.primaryColor.withOpacity(0.7), +// width: 2, +// ), +// ), +// ), +// ), +// ); +// }), +// // --- المحتوى في المنتصف --- +// Column( +// mainAxisAlignment: MainAxisAlignment.center, +// children: [ +// Text( +// controller.driversStatusForSearchWindow, +// style: AppStyle.headTitle.copyWith(fontSize: 20), +// textAlign: TextAlign.center, +// ), +// const SizedBox(height: 8), +// Text( +// 'Searching for the nearest captain...'.tr, +// style: AppStyle.subtitle +// .copyWith(color: AppColor.writeColor.withOpacity(0.7)), +// textAlign: TextAlign.center, +// ), +// const SizedBox(height: 16), +// // --- استدعاء نفس دالة المؤقت الخاصة بك --- +// buildTimerForIncrease(controller), +// ], +// ), +// ], +// ), +// ); +// } +// } + +// // --- نفس دالة المؤقت الخاصة بك مع تعديلات شكلية بسيطة --- +// Widget buildTimerForIncrease(MapPassengerController mapPassengerController) { +// return StreamBuilder( +// stream: Stream.periodic(const Duration(seconds: 1)) +// .map((_) => ++mapPassengerController.currentTimeSearchingCaptainWindow), +// initialData: 0, +// builder: (context, snapshot) { +// if (snapshot.hasData && snapshot.data! > 45) { +// // --- عرض زر زيادة الأجرة بنفس منطقك القديم --- +// return TextButton( +// onPressed: () => +// _showIncreaseFeeDialog(context, mapPassengerController), +// child: Text( +// "No one accepted? Try increasing the fare.".tr, +// style: AppStyle.title.copyWith( +// color: AppColor.primaryColor, +// decoration: TextDecoration.underline), +// textAlign: TextAlign.center, +// ), +// ); +// } + +// final double progress = (snapshot.data ?? 0).toDouble() / 30.0; + +// return SizedBox( +// height: 40, +// width: 40, +// child: Stack( +// fit: StackFit.expand, +// children: [ +// CircularProgressIndicator( +// value: progress, +// strokeWidth: 3, +// color: AppColor.primaryColor, +// backgroundColor: AppColor.primaryColor.withOpacity(0.2), +// ), +// Center( +// child: Text( +// '${snapshot.data ?? 0}', +// style: AppStyle.title.copyWith( +// color: AppColor.writeColor, fontWeight: FontWeight.bold), +// ), +// ), +// ], +// ), +// ); +// }, +// ); +// } + +// // --- دالة لعرض نافذة زيادة الأجرة (مأخوذة من منطقك القديم) --- +// void _showIncreaseFeeDialog( +// BuildContext context, MapPassengerController mapPassengerController) { +// Get.defaultDialog( +// barrierDismissible: false, +// title: "Increase Your Trip Fee (Optional)".tr, +// titleStyle: AppStyle.title, +// content: Column( +// children: [ +// Text( +// "We haven't found any drivers yet. Consider increasing your trip fee to make your offer more attractive to drivers." +// .tr, +// style: AppStyle.subtitle, +// textAlign: TextAlign.center, +// ), +// const SizedBox(height: 16), +// Row( +// mainAxisAlignment: MainAxisAlignment.center, +// children: [ +// IconButton( +// onPressed: () { +// mapPassengerController.increasFeeFromPassenger.text = +// (mapPassengerController.totalPassenger + 3) +// .toStringAsFixed(1); +// mapPassengerController.update(); +// }, +// icon: const Icon(Icons.add_circle, +// size: 40, color: AppColor.greenColor), +// ), +// SizedBox( +// width: 100, +// child: Form( +// key: mapPassengerController.increaseFeeFormKey, +// child: MyTextForm( +// controller: mapPassengerController.increasFeeFromPassenger, +// label: +// mapPassengerController.totalPassenger.toStringAsFixed(2), +// hint: +// mapPassengerController.totalPassenger.toStringAsFixed(2), +// type: TextInputType.number, +// ), +// ), +// ), +// IconButton( +// onPressed: () { +// mapPassengerController.increasFeeFromPassenger.text = +// (mapPassengerController.totalPassenger - 3) +// .toStringAsFixed(1); +// mapPassengerController.update(); +// }, +// icon: const Icon(Icons.remove_circle, +// size: 40, color: AppColor.redColor), +// ), +// ], +// ), +// ], +// ), +// actions: [ +// TextButton( +// child: Text("No, thanks".tr, +// style: const TextStyle(color: AppColor.redColor)), +// onPressed: () { +// Get.back(); +// // mapPassengerController.cancelRide(); +// mapPassengerController.changeCancelRidePageShow(); +// }, +// ), +// ElevatedButton( +// style: ElevatedButton.styleFrom(backgroundColor: AppColor.greenColor), +// child: Text("Increase Fee".tr), +// onPressed: () => +// mapPassengerController.increaseFeeByPassengerAndReOrder(), +// ), +// ], +// ); +// } diff --git a/siro_rider/lib/views/home/map_widget.dart/select_driver_mishwari.dart b/siro_rider/lib/views/home/map_widget.dart/select_driver_mishwari.dart new file mode 100644 index 0000000..6acec0d --- /dev/null +++ b/siro_rider/lib/views/home/map_widget.dart/select_driver_mishwari.dart @@ -0,0 +1,342 @@ +import 'package:siro_rider/constant/colors.dart'; +import 'package:siro_rider/constant/style.dart'; +import 'package:siro_rider/controller/home/map/ride_lifecycle_controller.dart'; +import 'package:siro_rider/views/widgets/elevated_btn.dart'; +import 'package:flutter/cupertino.dart'; +import 'package:flutter/material.dart'; +import 'package:get/get.dart'; + +import '../../../constant/links.dart'; +import '../../../print.dart'; + +class CupertinoDriverListWidget extends StatelessWidget { + CupertinoDriverListWidget({super.key}); + + final RideLifecycleController mapPassengerController = + Get.find(); + @override + Widget build(BuildContext context) { + return CupertinoPageScaffold( + navigationBar: CupertinoNavigationBar( + middle: Text('Driver List'.tr), // Ensure text is properly localized + ), + child: SafeArea( + child: mapPassengerController.driversForMishwari.isEmpty + ? Center( + child: Text( + 'No drivers available at the moment. Please try again later.' + .tr, + style: const TextStyle( + fontSize: 18, // Adjust the size as needed + fontWeight: FontWeight.w600, + color: CupertinoColors.inactiveGray, // Customize color + ), + textAlign: TextAlign.center, // Center-align the text + ), + ) + : ListView.separated( + itemCount: mapPassengerController.driversForMishwari.length, + separatorBuilder: (context, index) => + const Divider(height: 1), + itemBuilder: (context, index) { + var driver = + mapPassengerController.driversForMishwari[index]; + return Container( + decoration: AppStyle.boxDecoration1, + child: CupertinoListTile( + padding: const EdgeInsets.symmetric( + vertical: 4, horizontal: 8), + leading: CircleAvatar( + radius: 25, + backgroundImage: NetworkImage( + '${AppLink.server}/portrate_captain_image/${driver['id']}.jpg', + ), + child: Builder( + builder: (context) { + return Image.network( + '${AppLink.server}/portrate_captain_image/${driver['id']}.jpg', + fit: BoxFit.cover, + loadingBuilder: (BuildContext context, + Widget child, + ImageChunkEvent? loadingProgress) { + if (loadingProgress == null) { + return child; // Image is loaded + } else { + return Center( + child: CircularProgressIndicator( + value: loadingProgress + .expectedTotalBytes != + null + ? loadingProgress + .cumulativeBytesLoaded / + (loadingProgress + .expectedTotalBytes ?? + 1) + : null, + ), + ); + } + }, + errorBuilder: (BuildContext context, + Object error, StackTrace? stackTrace) { + return const Icon( + Icons + .person, // Icon to show when image fails to load + size: 25, // Adjust the size as needed + color: AppColor + .blueColor, // Color for the error icon + ); + }, + ); + }, + ), + ), + title: Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + Text( + '${driver['NAME'].toString().split(' ')[0]} ${driver['NAME'].toString().split(' ')[1]}', + style: + const TextStyle(fontWeight: FontWeight.bold), + ), + Text('${'Age'.tr}: ${driver['age'].toString()}'), + Row( + children: [ + const Icon(CupertinoIcons.star_fill, + size: 16, + color: CupertinoColors.systemYellow), + const SizedBox(width: 4), + Text(driver['rating']?.toStringAsFixed(1) ?? + 'N/A'.tr), + const SizedBox(width: 8), + Text('${'Rides'.tr}: ${driver['ride_count']}'), + ], + ), + ], + ), + subtitle: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + Text( + '${'Car'.tr}: ${driver['make']} ${driver['model']} (${driver['year']})'), + Text('${'Plate'.tr}: ${driver['car_plate']}'), + ], + ), + Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + SizedBox( + // width: Get.width * .3, + child: Row( + mainAxisAlignment: + MainAxisAlignment.spaceBetween, + children: [ + Text('${'Color'.tr}: ${driver['color']}'), + const SizedBox(width: 8), + Container( + width: 20, + height: 20, + decoration: BoxDecoration( + color: driver['color_hex'] + .toString() == + 'null' + ? Colors.amber + : hexToColor(driver['color_hex'] + .toString()), + borderRadius: + BorderRadius.circular(4), + border: Border.all(), + ), + ), + ], + ), + ), + ], + ), + ], + ), + onTap: () { + Log.print(' driver["id"]: ${driver['driver_id']}'); + Get.find().driverIdVip = + driver['driver_id']; + + // Handle driver selection + Get.defaultDialog( + title: + '${'Selected driver'.tr}: ${driver['NAME']}', + content: Column( + children: [ + Column( + mainAxisAlignment: + MainAxisAlignment.spaceBetween, + children: [ + Text( + '${'Car'.tr}: ${driver['make']} ${driver['model']} (${driver['year']})'), + Text( + '${'Plate'.tr}: ${driver['car_plate']}'), + Row( + mainAxisAlignment: + MainAxisAlignment.center, + children: [ + Text( + '${'Color'.tr}: ${driver['color']}'), + const SizedBox(width: 8), + Container( + width: 20, + height: 20, + decoration: BoxDecoration( + color: driver['color_hex'] + .toString() == + 'null' + ? Colors.amber + : hexToColor( + driver['color_hex'] + .toString()), + borderRadius: + BorderRadius.circular(4), + border: Border.all(), + ), + ), + ], + ), + ], + ), + ], + ), + confirm: MyElevatedButton( + title: 'OK'.tr, + onPressed: () { + Get.back(); + showDateTimePickerDialog(driver); + })); + Log.print('${'Selected driver'.tr}: ${driver['NAME']}'); + // Get.back(); // Close the dialog + }, + ), + ); + }, + )), + ); + } + + Color hexToColor(String hexColor) { + hexColor = hexColor.replaceAll("#", ""); + String colorString = "ff$hexColor"; + return Color(int.parse(colorString, radix: 16)); + } + + void showDriverSelectionDialog(Map driver) { + Get.defaultDialog( + title: '${'Selected driver'.tr}: ${driver['name']}', + content: Column( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + Text( + '${'Car'.tr}: ${driver['make']} ${driver['model']} (${driver['year']})'), + Text('${'Plate'.tr}: ${driver['car_plate']}'), + Row( + mainAxisAlignment: MainAxisAlignment.center, + children: [ + Text('${'Color'.tr}: ${driver['color']}'), + const SizedBox(width: 8), + Container( + width: 20, + height: 20, + decoration: BoxDecoration( + color: driver['color_hex'].toString() == 'null' + ? Colors.amber + : hexToColor(driver['color_hex'].toString()), + borderRadius: BorderRadius.circular(4), + border: Border.all(), + ), + ), + ], + ), + ], + ), + confirm: MyElevatedButton( + title: 'OK'.tr, + onPressed: () { + Get.back(); + showDateTimePickerDialog(driver); + }, + ), + ); + } + + void showDateTimePickerDialog(Map driver) { + Get.defaultDialog( + barrierDismissible: false, + title: "Select date and time of trip".tr, + content: SizedBox( + // height: 400, // Adjust height as needed + width: double.maxFinite, + child: Column( + children: [ + DateTimePickerWidget(), + ], + ), + ), + confirm: MyElevatedButton( + title: 'Confirm Trip'.tr, + onPressed: () async { + DateTime selectedDateTime = + mapPassengerController.selectedDateTime.value; + // Save trip data and set up notifications + Get.back(); + await mapPassengerController.saveTripData(driver, selectedDateTime); + }, + ), + cancel: MyElevatedButton( + kolor: AppColor.redColor, + title: 'Cancel'.tr, + onPressed: () { + Get.back(); + }, + ), + ); + } +} + +class DateTimePickerWidget extends StatelessWidget { + DateTimePickerWidget({super.key}); + + final RideLifecycleController controller = Get.find(); + + @override + Widget build(BuildContext context) { + return CupertinoPageScaffold( + navigationBar: CupertinoNavigationBar( + transitionBetweenRoutes: false, + automaticallyImplyLeading: false, + middle: Text('Date and Time Picker'.tr), + ), + child: SafeArea( + child: Column( + mainAxisAlignment: MainAxisAlignment.center, + children: [ + Obx(() => Text( + '${'Selected Date and Time'.tr}: ${controller.selectedDateTime.value}', + style: const TextStyle(fontSize: 18), + textAlign: TextAlign.center, + )), + const SizedBox(height: 20), + SizedBox( + height: 200, + child: CupertinoDatePicker( + mode: CupertinoDatePickerMode.dateAndTime, + initialDateTime: controller.selectedDateTime.value, + onDateTimeChanged: (newDateTime) { + controller.updateDateTime(newDateTime); + }, + ), + ), + ], + ), + ), + ); + } +} diff --git a/siro_rider/lib/views/home/map_widget.dart/timer_for_cancell_trip_from_passenger.dart b/siro_rider/lib/views/home/map_widget.dart/timer_for_cancell_trip_from_passenger.dart new file mode 100644 index 0000000..9282d38 --- /dev/null +++ b/siro_rider/lib/views/home/map_widget.dart/timer_for_cancell_trip_from_passenger.dart @@ -0,0 +1,63 @@ +import 'package:flutter/material.dart'; +import 'package:get/get.dart'; + +import '../../../constant/style.dart'; +import '../../../controller/home/map/ride_lifecycle_controller.dart'; + +GetBuilder timerForCancelTripFromPassenger() { + return GetBuilder( + builder: (controller) { + final isNearEnd = + controller.remainingTime <= 5; // Define a threshold for "near end" + + return controller.remainingTime > 0 && controller.remainingTime != 25 + ? Positioned( + bottom: 5, + left: 10, + right: 10, + child: Container( + height: 180, + decoration: AppStyle.boxDecoration, + child: Padding( + padding: const EdgeInsets.all(8.0), + child: Column( + children: [ + Row( + mainAxisAlignment: MainAxisAlignment.spaceAround, + children: [ + Stack( + alignment: Alignment.center, + children: [ + CircularProgressIndicator( + value: controller.progress, + // Set the color based on the "isNearEnd" condition + color: isNearEnd ? Colors.red : Colors.blue, + ), + Text( + '${controller.remainingTime}', + style: AppStyle.number, + ), + ], + ), + const SizedBox( + width: 30, + ), + Text( + 'You can cancel Ride now'.tr, + style: AppStyle.title, + ) + ], + ), + Text( + 'After this period\nYou can\'t cancel!'.tr, + style: AppStyle.title, + ) + ], + ), + ), + ), + ) + : const SizedBox(); + }, + ); +} diff --git a/siro_rider/lib/views/home/map_widget.dart/timer_to_passenger_from_driver.dart b/siro_rider/lib/views/home/map_widget.dart/timer_to_passenger_from_driver.dart new file mode 100644 index 0000000..cbbbb91 --- /dev/null +++ b/siro_rider/lib/views/home/map_widget.dart/timer_to_passenger_from_driver.dart @@ -0,0 +1,148 @@ +import 'package:flutter/material.dart'; +import 'package:get/get.dart'; +import 'package:siro_rider/views/widgets/elevated_btn.dart'; + +import '../../../constant/colors.dart'; +import '../../../constant/style.dart'; +import '../../../controller/home/map/ride_lifecycle_controller.dart'; +import 'ride_begin_passenger.dart'; + +class TimerToPassengerFromDriver extends StatelessWidget { + const TimerToPassengerFromDriver({ + super.key, + }); + + @override + Widget build(BuildContext context) { + return GetBuilder(builder: (controller) { + if (controller.remainingTime == 0 && + (controller.isDriverInPassengerWay == true || + controller.timeToPassengerFromDriverAfterApplied > 0)) { + // ) { + return Positioned( + left: 10, + right: 10, + bottom: 5, + child: Container( + decoration: AppStyle.boxDecoration, + height: controller.remainingTime == 0 && + (controller.isDriverInPassengerWay == true || + controller.timeToPassengerFromDriverAfterApplied > 0) + ? 200 + : 0, + // width: 100, + child: Padding( + padding: const EdgeInsets.all(8.0), + child: Column( + children: [ + Text( + 'You Can cancel Ride After Captain did not come in the time' + .tr, + style: AppStyle.title, + textAlign: TextAlign.center, + ), + Stack( + children: [ + LinearProgressIndicator( + backgroundColor: AppColor.accentColor, + color: controller + .remainingTimeToPassengerFromDriverAfterApplied < + 60 + ? AppColor.redColor + : AppColor.greenColor, + minHeight: 25, + borderRadius: BorderRadius.circular(15), + value: controller + .progressTimerToPassengerFromDriverAfterApplied + .toDouble(), + ), + Center( + child: Text( + controller.stringRemainingTimeToPassenger, + style: AppStyle.title, + ), + ) + ], + ), + IconButton( + onPressed: () {}, + icon: const Icon( + Icons.phone, + color: AppColor.blueColor, + ), + ), + controller.remainingTimeToPassengerFromDriverAfterApplied < 60 + ? MyElevatedButton( + title: 'You can cancel trip'.tr, + onPressed: () async { + await controller + .calculateDistanceBetweenPassengerAndDriverBeforeCancelRide(); + }) + : const SizedBox() + ], + ), + ), + ), + ); + } else if (controller.remainingTime == 0 && + controller.isDriverArrivePassenger == true) { + return Positioned( + left: 10, + right: 10, + bottom: 5, + child: Container( + decoration: AppStyle.boxDecoration, + height: controller.remainingTime == 0 && + controller.isDriverArrivePassenger == true + ? 150 + : 0, + // width: 100, + child: Padding( + padding: const EdgeInsets.all(8.0), + child: Column( + children: [ + Text( + 'The driver waiting you in picked location .'.tr, + style: AppStyle.title, + textAlign: TextAlign.center, + ), + Stack( + children: [ + LinearProgressIndicator( + backgroundColor: AppColor.accentColor, + color: + controller.remainingTimeDriverWaitPassenger5Minute < + 60 + ? AppColor.redColor + : AppColor.greenColor, + minHeight: 50, + borderRadius: BorderRadius.circular(15), + value: controller + .progressTimerDriverWaitPassenger5Minute + .toDouble(), + ), + Center( + child: Text( + controller + .stringRemainingTimeDriverWaitPassenger5Minute, + style: AppStyle.title, + ), + ) + ], + ), + Text( + 'Please go to Car now '.tr, + style: AppStyle.title, + textAlign: TextAlign.center, + ), + ], + ), + ), + ), + ); + } else { + return const RideBeginPassenger(); + } + }); + } +} diff --git a/siro_rider/lib/views/home/map_widget.dart/vip_begin.dart b/siro_rider/lib/views/home/map_widget.dart/vip_begin.dart new file mode 100644 index 0000000..53a182c --- /dev/null +++ b/siro_rider/lib/views/home/map_widget.dart/vip_begin.dart @@ -0,0 +1,319 @@ +import 'package:siro_rider/constant/links.dart'; +import 'package:siro_rider/views/home/profile/complaint_page.dart'; +import 'package:flutter/material.dart'; +import 'package:flutter_font_icons/flutter_font_icons.dart'; +import 'package:get/get.dart'; +import 'package:siro_rider/constant/box_name.dart'; +import 'package:siro_rider/controller/profile/profile_controller.dart'; +import 'package:siro_rider/main.dart'; + +import '../../../constant/colors.dart'; +import '../../../constant/style.dart'; +import '../../../controller/functions/audio_record1.dart'; +import '../../../controller/functions/launch.dart'; +import '../../../controller/functions/toast.dart'; +import '../../../controller/home/map/ride_lifecycle_controller.dart'; +import '../../../controller/home/map/ui_interactions_controller.dart'; + +class VipRideBeginPassenger extends StatelessWidget { + const VipRideBeginPassenger({ + super.key, + }); + + @override + Widget build(BuildContext context) { + ProfileController profileController = Get.put(ProfileController()); + AudioRecorderController audioController = + Get.put(AudioRecorderController()); + final uiController = Get.find(); + return GetBuilder(builder: (controller) { + if (controller.statusRideVip == 'Begin' || + !controller.statusRideFromStart) { + return Positioned( + left: 10, + right: 10, + bottom: 10, + child: Container( + decoration: AppStyle.boxDecoration, + height: controller.statusRideVip == 'Begin' ? Get.height * .33 : 0, + // width: 100, + child: Padding( + padding: const EdgeInsets.all(8.0), + child: Column( + mainAxisAlignment: MainAxisAlignment.spaceAround, + children: [ + Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + CircleAvatar( + radius: 30, + backgroundImage: NetworkImage( + '${AppLink.server}/portrate_captain_image/${controller.driverId}.jpg', + ), + onBackgroundImageError: (_, __) { + // Handle error here + }, + backgroundColor: Colors.grey, + child: const Icon( + Icons.person, // Default icon or placeholder + size: 30, + color: Colors.white, + ), // Placeholder background color + ), + Column( + children: [ + Container( + decoration: AppStyle.boxDecoration, + child: Padding( + padding: const EdgeInsets.symmetric( + horizontal: 6, vertical: 2), + child: Text( + controller.driverName, + style: AppStyle.title, + ), + ), + ), + const SizedBox( + height: 10, + ), + Container( + decoration: AppStyle.boxDecoration, + child: Padding( + padding: const EdgeInsets.symmetric( + horizontal: 6, vertical: 2), + child: Row( + mainAxisAlignment: + MainAxisAlignment.spaceAround, + children: [ + Text( + controller.make, + style: AppStyle.title, + ), + const SizedBox( + width: 10, + ), + Text( + controller.model, + style: AppStyle.title, + ), + ], + ), + ), + ), + ], + ), + Column( + children: [ + Container( + decoration: AppStyle.boxDecoration, + child: Padding( + padding: const EdgeInsets.all(3), + child: Text( + 'vip', + style: AppStyle.title, + ), + ), + ), + Text( + '${controller.driverRate} 📈', + style: AppStyle.title, + ), + ], + ), + ], + ), + // SizedBox( + // height: 5, + // ), + Row( + mainAxisAlignment: MainAxisAlignment.spaceAround, + children: [ + Container( + width: Get.width * .15, + decoration: AppStyle.boxDecoration, + child: IconButton( + onPressed: () => Get.to( + () => ComplaintPage(), + transition: Transition.downToUp, + ), + icon: const Icon( + Icons.note_add, + color: AppColor.redColor, + ), + tooltip: ' Add Note', // Optional tooltip for clarity + ), + ), + Container( + width: Get.width * .15, + decoration: AppStyle.boxDecoration, + child: audioController.isRecording == false + ? IconButton( + onPressed: () async { + await audioController.startRecording(rideId: controller.rideId); + if (context.mounted) { + Toast.show(context, 'Start Record'.tr, + AppColor.greenColor); + } + }, + icon: const Icon( + Icons.play_circle_fill_outlined, + color: AppColor.greenColor, + ), + tooltip: + ' Add Note', // Optional tooltip for clarity + ) + : IconButton( + onPressed: () async { + await audioController.stopRecording(); + if (context.mounted) { + Toast.show(context, 'Record saved'.tr, + AppColor.greenColor); + } + }, + icon: const Icon( + Icons.stop_circle, + color: AppColor.greenColor, + ), + tooltip: + ' Add Note', // Optional tooltip for clarity + ), + ), + ], + ), + Row( + mainAxisAlignment: MainAxisAlignment.spaceAround, + children: [ + Container( + decoration: AppStyle.boxDecoration, + width: Get.width * .15, + child: IconButton( + onPressed: () async { + if (box.read(BoxName.sosPhonePassenger) == null) { + { + await profileController.updatField( + 'sosPhone', TextInputType.phone); + box.write(BoxName.sosPhonePassenger, + profileController.prfoileData['sosPhone']); + } + } else { + makePhoneCall('122'); + // box.read(BoxName.sosPhonePassenger)); + } + }, + icon: const Icon( + Icons.sos_rounded, + color: AppColor.redColor, + ), + ), + ), + Container( + decoration: AppStyle.boxDecoration, + width: Get.width * .15, + child: IconButton( + onPressed: () async { + if (box.read(BoxName.sosPhonePassenger) == null || + box.read(BoxName.sosPhonePassenger) == 'sos') { + { + await profileController.updatField( + 'sosPhone', TextInputType.phone); + box.write(BoxName.sosPhonePassenger, + profileController.prfoileData['sosPhone']); + } + } else { + var phone = box.read(BoxName.countryCode) == + 'Egypt' + ? '+2${box.read(BoxName.sosPhonePassenger)}' + : '+962${box.read(BoxName.sosPhonePassenger)}'; + uiController.sendWhatsapp(phone); + } + }, + icon: const Icon( + FontAwesome.whatsapp, + color: AppColor.greenColor, + ), + ), + ), + Container( + decoration: AppStyle.boxDecoration, + width: Get.width * .15, + child: IconButton( + onPressed: () async { + await uiController.shareTripWithFamily(); + }, + icon: const Icon( + AntDesign.Safety, + color: AppColor.blueColor, + ), + ), + ), + ], + ), + Stack( + children: [ + // StreamCounter(), + LinearProgressIndicator( + backgroundColor: AppColor.accentColor, + color: + // controller.remainingTimeTimerRideBegin < 60 + // ? AppColor.redColor + // : + AppColor.greenColor, + minHeight: 25, + borderRadius: BorderRadius.circular(15), + value: + 24 //controller.progressTimerRideBegin.toDouble(), + ), + Center( + child: Text( + controller.stringElapsedTimeRideBeginVip, + style: AppStyle.title, + ), + ) + ], + ) + ], + ), + ), + ), + ); + } else { + return const SizedBox(); + } + }); + } +} + +class StreamCounter extends StatelessWidget { + const StreamCounter({super.key}); + + @override + // Build the UI based on the timer value + Widget build(BuildContext context) { + return GetBuilder(builder: (controller) { + return StreamBuilder( + initialData: 0, + stream: controller.timerController.stream, + builder: (context, snapshot) { + // Calculate the remaining time based on the current tick + final remainingTime = controller.durationToRide - snapshot.data!; + + // Format the remaining time as a string + final formattedRemainingTime = + '${(remainingTime / 60).floor()}:${(remainingTime % 60).toString().padLeft(2, '0')}'; + + // Return the UI widgets based on the remaining time + return Column( + children: [ + Text(formattedRemainingTime), + // ElevatedButton( + // onPressed: () { + // // Handle button press here + // }, + // ), + ], + ); + }, + ); + }); + } +} diff --git a/siro_rider/lib/views/home/my_wallet/passenger_wallet.dart b/siro_rider/lib/views/home/my_wallet/passenger_wallet.dart new file mode 100644 index 0000000..b5cde14 --- /dev/null +++ b/siro_rider/lib/views/home/my_wallet/passenger_wallet.dart @@ -0,0 +1,260 @@ +import 'package:flutter/cupertino.dart'; +import 'package:flutter/material.dart'; +import 'package:get/get.dart'; +import 'package:siro_rider/views/home/my_wallet/payment_history_passenger_page.dart'; +import 'dart:ui'; // لاستخدام تأثيرات متقدمة + +import '../../../constant/box_name.dart'; +import '../../../constant/colors.dart'; +import '../../../constant/info.dart'; +import '../../../constant/style.dart'; +import '../../../controller/functions/toast.dart'; +import '../../../controller/home/payment/credit_card_controller.dart'; +import '../../../controller/payment/payment_controller.dart'; +import '../../../main.dart'; +import '../../widgets/elevated_btn.dart'; +import '../../widgets/my_scafold.dart'; +import 'passenger_wallet_dialoge.dart'; + +// --- الويدجت الرئيسية بالتصميم الجديد --- +class PassengerWallet extends StatelessWidget { + const PassengerWallet({super.key}); + + @override + Widget build(BuildContext context) { + // نفس منطق استدعاء الكنترولرز + Get.put(PaymentController()); + Get.put(CreditCardController()); + + return MyScafolld( + title: 'My Balance'.tr, + isleading: true, + body: [ + // استخدام Stack فقط لعرض الـ Dialog فوق المحتوى عند الحاجة + Stack( + children: [ + // استخدام Column لتنظيم المحتوى بشكل أفضل + Padding( + padding: const EdgeInsets.symmetric(horizontal: 16.0), + child: Column( + crossAxisAlignment: CrossAxisAlignment.stretch, + children: [ + const SizedBox(height: 16), + + // --- 1. بطاقة المحفظة العصرية --- + _buildModernWalletCard(), + + const SizedBox(height: 32), + Text("Actions".tr, + style: AppStyle.title.copyWith( + color: AppColor.writeColor.withOpacity(0.6))), + const Divider(height: 24), + + // --- 2. قائمة الخيارات المنظمة --- + _buildActionTile( + icon: Icons.add_card_rounded, + title: 'Top up Balance'.tr, + subtitle: 'Add funds using our secure methods'.tr, + onTap: () => + showPaymentBottomSheet(context), // نفس دالتك القديمة + ), + _buildActionTile( + icon: Icons.history_rounded, + title: 'Payment History'.tr, + subtitle: 'View your past transactions'.tr, + onTap: () => Get.to( + () => const PaymentHistoryPassengerPage(), + transition: Transition.rightToLeftWithFade), + ), + _buildActionTile( + icon: Icons.phone_iphone_rounded, + title: 'Set Phone Number'.tr, + subtitle: 'Link a phone number for transfers'.tr, + onTap: () => _showWalletPhoneDialog(context, + Get.find()), // نفس دالتك القديمة + ), + ], + ), + ), + + // --- عرض الـ Dialog بنفس طريقتك القديمة --- + const PassengerWalletDialog(), + ], + ), + ], + ); + } + + // --- ويدجت مساعدة لبناء بطاقة المحفظة --- + Widget _buildModernWalletCard() { + return GetBuilder( + builder: (paymentController) { + return Container( + width: double.infinity, + height: Get.height * 0.25, + decoration: BoxDecoration( + borderRadius: BorderRadius.circular(20), + gradient: const LinearGradient( + colors: [ + AppColor.primaryColor, + Color(0xFF1E3A8A) + ], // تدرج لوني أنيق + begin: Alignment.topLeft, + end: Alignment.bottomRight, + ), + boxShadow: [ + BoxShadow( + color: AppColor.primaryColor.withOpacity(0.3), + blurRadius: 25, + offset: const Offset(0, 10), + ), + ], + ), + child: Stack( + children: [ + // --- عنصر تزييني (شكل موجة) --- + Positioned( + right: -100, + bottom: -100, + child: Icon( + Icons.waves, + size: 250, + color: Colors.white.withOpacity(0.05), + ), + ), + Padding( + padding: const EdgeInsets.all(24.0), + child: Column( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + Text( + '${AppInformation.appName} ${'Balance'.tr}', + style: AppStyle.headTitle.copyWith( + color: Colors.white, + fontSize: 20, + fontWeight: FontWeight.bold, + ), + ), + Icon(Icons.memory_rounded, + color: Colors.white.withOpacity(0.7), + size: 30), // أيقونة الشريحة + ], + ), + Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Text( + "Current Balance".tr, + style: AppStyle.subtitle + .copyWith(color: Colors.white.withOpacity(0.7)), + ), + Text( + '${box.read(BoxName.passengerWalletTotal) ?? '0.0'} ${'SYP'.tr}', + style: AppStyle.headTitle2.copyWith( + color: Colors.white, + fontSize: 28, + fontWeight: FontWeight.w600, + letterSpacing: 1.5, + ), + ), + ], + ), + Row( + mainAxisAlignment: MainAxisAlignment.end, + children: [ + Text( + (box.read(BoxName.name) ?? "User Name").toString(), + style: AppStyle.title.copyWith( + color: Colors.white.withOpacity(0.8), + fontSize: 16, + ), + ), + ], + ), + ], + ), + ), + ], + ), + ); + }, + ); + } + + // --- ويدجت مساعدة لبناء عناصر القائمة --- + Widget _buildActionTile({ + required IconData icon, + required String title, + required String subtitle, + required VoidCallback onTap, + }) { + return ListTile( + onTap: onTap, + contentPadding: const EdgeInsets.symmetric(vertical: 8, horizontal: 8), + leading: Container( + padding: const EdgeInsets.all(10), + decoration: BoxDecoration( + color: AppColor.primaryColor.withOpacity(0.1), + borderRadius: BorderRadius.circular(12), + ), + child: Icon(icon, color: AppColor.primaryColor, size: 24), + ), + title: Text(title.tr, style: AppStyle.title), + subtitle: Text(subtitle.tr, + style: AppStyle.subtitle + .copyWith(color: AppColor.writeColor.withOpacity(0.6))), + trailing: Icon(Icons.arrow_forward_ios_rounded, + size: 16, color: AppColor.writeColor), + ); + } + + // --- نفس دالة الـ Dialog الخاصة بك --- + void _showWalletPhoneDialog( + BuildContext context, PaymentController controller) { + Get.dialog( + CupertinoAlertDialog( + title: Text('Insert Wallet phone number'.tr), + content: Column( + children: [ + const SizedBox(height: 10), + Form( + key: controller.formKey, + child: CupertinoTextField( + controller: controller.walletphoneController, + placeholder: 'Insert Wallet phone number'.tr, + keyboardType: TextInputType.phone, + padding: + const EdgeInsets.symmetric(vertical: 12, horizontal: 10), + ), + ), + ], + ), + actions: [ + CupertinoDialogAction( + child: Text('Cancel'.tr, + style: const TextStyle(color: CupertinoColors.destructiveRed)), + onPressed: () => Get.back(), + ), + CupertinoDialogAction( + child: Text('OK'.tr, + style: const TextStyle(color: CupertinoColors.activeGreen)), + onPressed: () { + Get.back(); + box.write( + BoxName.phoneWallet, (controller.walletphoneController.text)); + Toast.show(context, 'Phone Wallet Saved Successfully'.tr, + AppColor.greenColor); + }, + ), + ], + ), + barrierDismissible: false, + ); + } +} + +// الكلاس القديم CardIntaleqWallet لم نعد بحاجة إليه لأنه تم دمجه وتطويره diff --git a/siro_rider/lib/views/home/my_wallet/passenger_wallet_dialoge.dart b/siro_rider/lib/views/home/my_wallet/passenger_wallet_dialoge.dart new file mode 100644 index 0000000..88cebaf --- /dev/null +++ b/siro_rider/lib/views/home/my_wallet/passenger_wallet_dialoge.dart @@ -0,0 +1,486 @@ +import 'package:siro_rider/print.dart'; +import 'package:siro_rider/constant/style.dart'; +import 'package:siro_rider/controller/functions/encrypt_decrypt.dart'; +import 'package:flutter/cupertino.dart'; +import 'package:flutter/material.dart'; +import 'package:get/get.dart'; +import 'package:siro_rider/constant/box_name.dart'; +import 'package:siro_rider/constant/colors.dart'; +import 'package:siro_rider/controller/functions/toast.dart'; +import 'package:siro_rider/controller/payment/payment_controller.dart'; +import 'package:local_auth/local_auth.dart'; + +import '../../../main.dart'; +import '../../widgets/elevated_btn.dart'; +import '../../widgets/my_textField.dart'; +import 'payment_screen_sham.dart'; + +class PassengerWalletDialog extends StatelessWidget { + const PassengerWalletDialog({ + super.key, + }); + + @override + Widget build(BuildContext context) { + return GetBuilder( + builder: (controller) => Positioned( + top: Get.height * .1, + right: Get.width * .15, + left: Get.width * .15, + bottom: Get.height * .1, + child: controller.isPromoSheetDialogue + ? CupertinoActionSheet( + title: Text('Select Payment Amount'.tr), + actions: [ + CupertinoActionSheetAction( + onPressed: () { + controller.updateSelectedAmount( + box.read(BoxName.countryCode) == 'Syria' ? 10000 : 10, + ); + showPaymentOptions(context, controller); + }, + child: Text( + box.read(BoxName.countryCode) == 'Syria' + ? '10000 ${'LE'.tr}' + : '10 ${'SYP'.tr}', + ), + ), + CupertinoActionSheetAction( + onPressed: () { + controller.updateSelectedAmount( + box.read(BoxName.countryCode) == 'Syria' ? 20000 : 20, + ); + showPaymentOptions(context, controller); + }, + child: Text( + box.read(BoxName.countryCode) == 'Syria' + ? '20000 ${'LE'.tr} = 2050 ${'LE'.tr}' + : '20 ${'SYP'.tr}', + ), + ), + CupertinoActionSheetAction( + onPressed: () { + controller.updateSelectedAmount( + box.read(BoxName.countryCode) == 'Syria' ? 40000 : 40, + ); + showPaymentOptions(context, controller); + }, + child: Text( + box.read(BoxName.countryCode) == 'Syria' + ? '40000 ${'LE'.tr} = 4150 ${'LE'.tr}' + : '40 ${'SYP'.tr}', + ), + ), + CupertinoActionSheetAction( + onPressed: () { + controller.updateSelectedAmount( + box.read(BoxName.countryCode) == 'Syria' ? 100000 : 50, + ); + showPaymentOptions(context, controller); + }, + child: Text( + box.read(BoxName.countryCode) == 'Syria' + ? '100000 ${'LE'.tr} = 11000 ${'LE'.tr}' + : '50 ${'SYP'.tr}', + ), + ), + ], + cancelButton: CupertinoActionSheetAction( + onPressed: () { + controller.changePromoSheetDialogue(); + }, + child: Text('Cancel'.tr), + ), + ) + : const SizedBox(), + ), + ); + } +} +// class PassengerWalletDialog extends StatelessWidget { +// const PassengerWalletDialog({ +// super.key, +// }); + +// @override +// Widget build(BuildContext context) { +// return GetBuilder( +// builder: (controller) { +// return Positioned( +// top: Get.height * .1, +// right: Get.width * .15, +// left: Get.width * .15, +// bottom: Get.height * .1, +// child: controller.isPromoSheetDialogue +// ? Container() +// : SizedBox +// .shrink(), // If condition is false, return an empty widget +// ); +// }, +// ); +// } +// } +void showPaymentBottomSheet(BuildContext context) { + final controller = Get.find(); + + showModalBottomSheet( + context: context, + isScrollControlled: true, + shape: const RoundedRectangleBorder( + borderRadius: BorderRadius.vertical(top: Radius.circular(15.0)), + ), + builder: (BuildContext context) { + return WillPopScope( + onWillPop: () async { + Get.back(); + return false; + }, + child: Container( + padding: const EdgeInsets.all(16.0), + child: Column( + mainAxisSize: MainAxisSize.min, + crossAxisAlignment: CrossAxisAlignment.stretch, + children: [ + Text( + 'Select Payment Amount'.tr, + style: AppStyle.headTitle2, + textAlign: TextAlign.center, + ), + const SizedBox(height: 16.0), + + // Payment Options List + _buildPaymentOption( + context: context, + controller: controller, + amount: 500, + bonusAmount: 30, + currency: 'SYP'.tr, + ), + + const SizedBox(height: 8.0), + _buildPaymentOption( + context: context, + controller: controller, + amount: 1000, + bonusAmount: 70, + currency: 'SYP'.tr, + ), + + const SizedBox(height: 8.0), + _buildPaymentOption( + context: context, + controller: controller, + amount: 2000, + bonusAmount: 180, + currency: 'SYP'.tr, + ), + + const SizedBox(height: 8.0), + _buildPaymentOption( + context: context, + controller: controller, + amount: 5000, + bonusAmount: 700, + currency: 'SYP'.tr, + ), + + const SizedBox(height: 16.0), + TextButton( + onPressed: () => Get.back(), + child: Text('Cancel'.tr), + ), + ], + ), + ), + ); + }, + ); +} + +Widget _buildPaymentOption({ + required BuildContext context, + required PaymentController controller, + required int amount, + required double bonusAmount, + required String currency, +}) { + return Material( + color: Colors.transparent, + child: InkWell( + onTap: () { + controller.updateSelectedAmount(amount); + Get.back(); + showPaymentOptions(context, controller); + }, + child: Container( + padding: const EdgeInsets.symmetric(vertical: 12.0, horizontal: 16.0), + decoration: BoxDecoration( + border: Border.all(color: Colors.grey[300]!), + borderRadius: BorderRadius.circular(8.0), + ), + child: Text( + bonusAmount > 0 + ? '${'Pay'.tr} $amount $currency, ${'Get'.tr} ${amount + bonusAmount} $currency' + : '$amount $currency', + style: AppStyle.title, + textAlign: TextAlign.center, + ), + ), + ), + ); +} + +void showPaymentOptions(BuildContext context, PaymentController controller) { + showCupertinoModalPopup( + context: context, + builder: (context) => CupertinoActionSheet( + title: Text('Payment Options'.tr), + actions: [ + box.read(BoxName.countryCode) == 'Syria' + ? CupertinoActionSheetAction( + child: Text('💳 Pay with Credit Card'.tr), + onPressed: () async { + if (controller.selectedAmount != 0) { + controller.payWithEcash( + context, + controller.selectedAmount.toString(), + // () async { + // await controller.addPassengerWallet(); + // controller.changePromoSheetDialogue(); + ); + await controller.getPassengerWallet(); + } else { + Toast.show(context, '⚠️ You need to choose an amount!'.tr, + AppColor.redColor); + } + }, + ) + : const SizedBox(), + // box.read(BoxName.phoneWallet) != null + // ? CupertinoActionSheetAction( + // child: Text('💰 Pay with Wallet'.tr), + // onPressed: () async { + // if (controller.selectedAmount != 0) { + // controller.isLoading = true; + // controller.update(); + // controller.payWithMTNWallet( + // context, + // controller.selectedAmount.toString(), + // 'SYP', + // ); + // await controller.getPassengerWallet(); + // controller.isLoading = false; + // controller.update(); + // } else { + // Toast.show(context, '⚠️ You need to choose an amount!'.tr, + // AppColor.redColor); + // } + // }, + // ) + // : CupertinoActionSheetAction( + // child: Text('Add wallet phone you use'.tr), + // onPressed: () { + // Get.dialog( + // CupertinoAlertDialog( + // title: Text('Insert Wallet phone number'.tr), + // content: Column( + // children: [ + // const SizedBox(height: 10), + // CupertinoTextField( + // controller: controller.walletphoneController, + // placeholder: 'Insert Wallet phone number'.tr, + // keyboardType: TextInputType.phone, + // padding: const EdgeInsets.symmetric( + // vertical: 12, + // horizontal: 10, + // ), + // ), + // ], + // ), + // actions: [ + // CupertinoDialogAction( + // child: Text('Cancel'.tr, + // style: const TextStyle( + // color: CupertinoColors.destructiveRed)), + // onPressed: () { + // Get.back(); + // }, + // ), + // CupertinoDialogAction( + // child: Text('OK'.tr, + // style: const TextStyle( + // color: CupertinoColors.activeGreen)), + // onPressed: () async { + // Get.back(); + // box.write(BoxName.phoneWallet, + // (controller.walletphoneController.text)); + // Toast.show( + // context, + // 'Phone Wallet Saved Successfully'.tr, + // AppColor.greenColor); + // }, + // ), + // ], + // ), + // barrierDismissible: false, + // ); + // }, + // ), + // GestureDetector( + // onTap: () async { + // Get.back(); + // Get.defaultDialog( + // barrierDismissible: false, + // title: 'Insert Wallet phone number'.tr, + // content: Form( + // key: controller.formKey, + // child: MyTextForm( + // controller: controller.walletphoneController, + // label: 'Insert Wallet phone number'.tr, + // hint: '963941234567', + // type: TextInputType.phone)), + // confirm: MyElevatedButton( + // title: 'OK'.tr, + // onPressed: () async { + // Get.back(); + // if (controller.formKey.currentState!.validate()) { + // if (controller.selectedAmount != 0) { + // controller.isLoading = true; + // controller.update(); + // box.write(BoxName.phoneWallet, + // (controller.walletphoneController.text)); + // Get.back(); + // await controller.payWithMTNWallet( + // context, + // controller.selectedAmount.toString(), + // 'SYP', + // ); + // await controller.getPassengerWallet(); + + // controller.isLoading = false; + // controller.update(); + // } else { + // Toast.show( + // context, + // '⚠️ You need to choose an amount!'.tr, + // AppColor.redColor, + // ); + // } + // } + // })); + // }, + // child: Padding( + // padding: const EdgeInsets.all(8.0), + // child: Row( + // mainAxisAlignment: MainAxisAlignment.spaceBetween, + // children: [ + // Text( + // 'Pay by MTN Wallet'.tr, + // style: AppStyle.title, + // ), + // const SizedBox(width: 10), + // Image.asset( + // 'assets/images/cashMTN.png', + // width: 70, + // height: 70, + // fit: BoxFit.contain, + // ), + // ], + // ), + // )), + + GestureDetector( + onTap: () async { + Get.back(); + Get.defaultDialog( + barrierDismissible: false, + title: 'Insert Wallet phone number'.tr, + content: Form( + key: controller.formKey, + child: MyTextForm( + controller: controller.walletphoneController, + label: 'Insert Wallet phone number'.tr, + hint: '963941234567', + type: TextInputType.phone)), + confirm: MyElevatedButton( + title: 'OK'.tr, + onPressed: () async { + Get.back(); + if (controller.formKey.currentState!.validate()) { + box.write(BoxName.phoneWallet, + controller.walletphoneController.text); + await controller.payWithSyriaTelWallet( + controller.selectedAmount.toString(), 'SYP'); + } + })); + }, + child: Padding( + padding: const EdgeInsets.all(8.0), + child: Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + Text( + 'Pay by Syriatel Wallet'.tr, + style: AppStyle.title, + ), + const SizedBox(width: 10), + Image.asset( + 'assets/images/syriatel.png', + width: 70, + height: 70, + fit: BoxFit.fill, + ), + ], + ), + )), + GestureDetector( + onTap: () async { + // التحقق بالبصمة قبل أي شيء + bool isAuthSupported = + await LocalAuthentication().isDeviceSupported(); + + if (isAuthSupported) { + bool didAuthenticate = await LocalAuthentication().authenticate( + localizedReason: 'استخدم بصمة الإصبع أو الوجه لتأكيد الدفع', + ); + + if (!didAuthenticate) { + Log.print("❌ User did not authenticate with biometrics"); + return; + } + } + + // الانتقال مباشرة لإنشاء الفاتورة بعد النجاح بالبصمة + Get.to(() => PaymentScreenSmsProvider( + amount: double.parse(controller.selectedAmount.toString()))); + }, + child: Padding( + padding: const EdgeInsets.all(8.0), + child: Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + Text( + 'Pay by Sham Cash'.tr, + style: AppStyle.title, + ), + const SizedBox(width: 10), + Image.asset( + 'assets/images/shamCash.png', + width: 70, + height: 70, + fit: BoxFit.fill, + ), + ], + ), + )), + ], + cancelButton: CupertinoActionSheetAction( + child: Text('Cancel'.tr), + onPressed: () { + // controller.changePromoSheetDialogue(); + Get.back(); + }, + ), + ), + ); +} \ No newline at end of file diff --git a/siro_rider/lib/views/home/my_wallet/payment_history_driver_page.dart b/siro_rider/lib/views/home/my_wallet/payment_history_driver_page.dart new file mode 100644 index 0000000..5374f12 --- /dev/null +++ b/siro_rider/lib/views/home/my_wallet/payment_history_driver_page.dart @@ -0,0 +1,54 @@ +import 'package:flutter/material.dart'; +import 'package:get/get.dart'; +import 'package:siro_rider/constant/colors.dart'; +import 'package:siro_rider/constant/style.dart'; +import 'package:siro_rider/views/widgets/my_scafold.dart'; +import 'package:siro_rider/views/widgets/mycircular.dart'; + +import '../../../controller/payment/driver_payment_controller.dart'; + +class PaymentHistoryDriverPage extends StatelessWidget { + const PaymentHistoryDriverPage({super.key}); + + @override + Widget build(BuildContext context) { + Get.put(DriverWalletHistoryController()); + return MyScafolld( + title: 'Payment History'.tr, + body: [ + GetBuilder( + builder: (controller) => controller.isLoading + ? const MyCircularProgressIndicator() + : ListView.builder( + itemCount: controller.archive.length, + itemBuilder: (BuildContext context, int index) { + var list = controller.archive[index]; + return Padding( + padding: const EdgeInsets.all(4), + child: Container( + decoration: BoxDecoration( + color: double.parse(list['amount']) < 0 + ? AppColor.redColor.withOpacity(.4) + : AppColor.greenColor.withOpacity(.4)), + child: Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + Text( + list['amount'], + style: AppStyle.title, + ), + Text( + list['created_at'], + style: AppStyle.title, + ), + ], + ), + ), + ); + }, + ), + ) + ], + isleading: true); + } +} diff --git a/siro_rider/lib/views/home/my_wallet/payment_history_passenger_page.dart b/siro_rider/lib/views/home/my_wallet/payment_history_passenger_page.dart new file mode 100644 index 0000000..6e96bd7 --- /dev/null +++ b/siro_rider/lib/views/home/my_wallet/payment_history_passenger_page.dart @@ -0,0 +1,61 @@ +import 'package:flutter/cupertino.dart'; +import 'package:flutter/material.dart'; +import 'package:get/get.dart'; +import 'package:siro_rider/constant/colors.dart'; +import 'package:siro_rider/constant/style.dart'; +import 'package:siro_rider/controller/payment/passenger_wallet_history_controller.dart'; +import 'package:siro_rider/views/widgets/my_scafold.dart'; +import 'package:siro_rider/views/widgets/mycircular.dart'; + +class PaymentHistoryPassengerPage extends StatelessWidget { + const PaymentHistoryPassengerPage({super.key}); + + @override + Widget build(BuildContext context) { + Get.put(PassengerWalletHistoryController()); + return MyScafolld( + title: 'Payment History'.tr, + body: [ + GetBuilder( + builder: (controller) => controller.isLoading + ? const MyCircularProgressIndicator() // iOS-style loading indicator + : controller.archive.isEmpty + ? Center( + child: Text( + 'No wallet record found'.tr, + style: AppStyle.title, + ), + ) + : CupertinoListSection.insetGrouped( + children: List.generate( + controller.archive.length, + (index) { + var list = controller.archive[index]; + return CupertinoListTile( + backgroundColor: double.parse(list['balance']) < 0 + ? AppColor.redColor.withOpacity(.2) + : AppColor.greenColor.withOpacity(.2), + title: Text( + list['balance'], + style: AppStyle.title.copyWith( + color: CupertinoColors.black, + ), + ), + additionalInfo: Text( + list['created_at'], + style: AppStyle.title.copyWith( + fontSize: 12, + color: CupertinoColors.systemGrey, + ), + ), + padding: const EdgeInsets.symmetric( + vertical: 8, horizontal: 16), + ); + }, + ), + ), + ) + ], + isleading: true); + } +} diff --git a/siro_rider/lib/views/home/my_wallet/payment_screen_sham.dart b/siro_rider/lib/views/home/my_wallet/payment_screen_sham.dart new file mode 100644 index 0000000..31a7191 --- /dev/null +++ b/siro_rider/lib/views/home/my_wallet/payment_screen_sham.dart @@ -0,0 +1,515 @@ +import 'dart:async'; +import 'package:flutter/material.dart'; +import 'package:flutter/services.dart'; +import 'package:get/get.dart'; +import 'package:intl/intl.dart'; +import '../../../constant/box_name.dart'; +import '../../../constant/links.dart'; +import '../../../controller/functions/crud.dart'; +import '../../../main.dart'; + +// --- خدمة الدفع (نفس المنطق السابق) --- +class PaymentService { + final String _baseUrl = "${AppLink.paymentServer}/ride/shamcash/passenger"; + + Future createInvoice({required double amount}) async { + final url = "$_baseUrl/create_invoice.php"; + try { + final response = await CRUD().postWallet( + link: url, + payload: { + 'passengerID': box.read(BoxName.passengerID), + 'amount': amount.toString(), + }, + ).timeout(const Duration(seconds: 15)); + + if (response != 'failure') { + final data = response; + if (data['status'] == 'success' && data['invoice_number'] != null) { + return data['invoice_number'].toString(); + } + } + return null; + } catch (e) { + debugPrint("Create Invoice Error: $e"); + return null; + } + } + + Future checkInvoiceStatus(String invoiceNumber) async { + final url = "$_baseUrl/check_status.php"; + try { + final response = await CRUD().postWallet(link: url, payload: { + 'invoice_number': invoiceNumber, + }).timeout(const Duration(seconds: 10)); + + if (response != 'failure') { + final data = response; + return data['status'] == 'success' && + data['invoice_status'] == 'completed'; + } + return false; + } catch (e) { + return false; + } + } +} + +enum PaymentStatus { + creatingInvoice, + waitingForPayment, + paymentSuccess, + paymentTimeout, + paymentError +} + +class PaymentScreenSmsProvider extends StatefulWidget { + final double amount; + final String providerName; + final String providerLogo; + final String qrImagePath; + + const PaymentScreenSmsProvider({ + super.key, + required this.amount, + this.providerName = 'شام كاش', + this.providerLogo = 'assets/images/shamCash.png', + this.qrImagePath = 'assets/images/shamcashsend.png', + }); + + @override + _PaymentScreenSmsProviderState createState() => + _PaymentScreenSmsProviderState(); +} + +class _PaymentScreenSmsProviderState extends State + with SingleTickerProviderStateMixin { + final PaymentService _paymentService = PaymentService(); + Timer? _pollingTimer; + PaymentStatus _status = PaymentStatus.creatingInvoice; + String? _invoiceNumber; + + // العنوان الثابت للدفع (المستخرج من الصورة) + final String _paymentAddress = "80f23afe40499b02f49966c3340ae0fc"; + + // متحكم الأنيميشن للوميض + late AnimationController _blinkController; + late Animation _colorAnimation; + late Animation _shadowAnimation; + + @override + void initState() { + super.initState(); + // إعداد الأنيميشن (وميض أحمر) + _blinkController = AnimationController( + duration: const Duration(milliseconds: 800), + vsync: this, + )..repeat(reverse: true); // يكرر الحركة ذهاباً وإياباً + + _colorAnimation = ColorTween( + begin: Colors.red.shade700, + end: Colors.red.shade100, + ).animate(_blinkController); + + _shadowAnimation = Tween(begin: 2.0, end: 15.0).animate( + CurvedAnimation(parent: _blinkController, curve: Curves.easeInOut), + ); + + _createAndPollInvoice(); + } + + @override + void dispose() { + _pollingTimer?.cancel(); + _blinkController.dispose(); + super.dispose(); + } + + void _createAndPollInvoice() async { + setState(() => _status = PaymentStatus.creatingInvoice); + final invoiceNumber = + await _paymentService.createInvoice(amount: widget.amount); + + if (invoiceNumber != null && mounted) { + setState(() { + _invoiceNumber = invoiceNumber; + _status = PaymentStatus.waitingForPayment; + }); + _startPolling(invoiceNumber); + } else if (mounted) { + setState(() => _status = PaymentStatus.paymentError); + } + } + + void _startPolling(String invoiceNumber) { + const timeoutDuration = Duration(minutes: 5); + var elapsed = Duration.zero; + + _pollingTimer = Timer.periodic(const Duration(seconds: 5), (timer) async { + elapsed += const Duration(seconds: 5); + if (elapsed >= timeoutDuration) { + timer.cancel(); + if (mounted) setState(() => _status = PaymentStatus.paymentTimeout); + return; + } + final isCompleted = + await _paymentService.checkInvoiceStatus(invoiceNumber); + if (isCompleted && mounted) { + timer.cancel(); + setState(() => _status = PaymentStatus.paymentSuccess); + } + }); + } + + Future _onPopInvoked() async { + if (_status == PaymentStatus.waitingForPayment) { + final shouldPop = await showDialog( + context: context, + builder: (context) => AlertDialog( + title: const Text('إلغاء العملية؟', textAlign: TextAlign.right), + content: const Text('الخروج الآن سيؤدي لإلغاء متابعة عملية الدفع.', + textAlign: TextAlign.right), + actions: [ + TextButton( + onPressed: () => Navigator.of(context).pop(false), + child: const Text('البقاء')), + TextButton( + onPressed: () => Navigator.of(context).pop(true), + child: const Text('خروج', style: TextStyle(color: Colors.red))), + ], + ), + ); + return shouldPop ?? false; + } + return true; + } + + @override + Widget build(BuildContext context) { + return WillPopScope( + onWillPop: _onPopInvoked, + child: Scaffold( + backgroundColor: Colors.grey[50], + appBar: AppBar( + title: Text("دفع عبر ${widget.providerName}"), + centerTitle: true, + elevation: 0, + backgroundColor: Colors.white, + foregroundColor: Colors.black, + ), + body: SafeArea( + child: Padding( + padding: const EdgeInsets.all(20.0), + child: Center(child: _buildContentByStatus()), + ), + ), + ), + ); + } + + Widget _buildContentByStatus() { + switch (_status) { + case PaymentStatus.creatingInvoice: + return const Column( + mainAxisAlignment: MainAxisAlignment.center, + children: [ + CircularProgressIndicator(), + SizedBox(height: 20), + Text("جاري إنشاء رقم البيان...", style: TextStyle(fontSize: 16)), + ], + ); + case PaymentStatus.waitingForPayment: + return _buildWaitingForPaymentUI(); + case PaymentStatus.paymentSuccess: + return _buildSuccessUI(); + case PaymentStatus.paymentTimeout: + case PaymentStatus.paymentError: + return _buildErrorUI(); + } + } + + Widget _buildWaitingForPaymentUI() { + final currencyFormat = NumberFormat.decimalPattern('ar_SY'); + final invoiceText = _invoiceNumber ?? '---'; + + return SingleChildScrollView( + physics: const BouncingScrollPhysics(), + child: Column( + crossAxisAlignment: CrossAxisAlignment.center, + children: [ + // 1. المبلغ + Container( + width: double.infinity, + padding: const EdgeInsets.symmetric(vertical: 20, horizontal: 15), + decoration: BoxDecoration( + gradient: LinearGradient( + colors: [Colors.blue.shade800, Colors.blue.shade600]), + borderRadius: BorderRadius.circular(16), + boxShadow: [ + BoxShadow( + color: Colors.blue.withOpacity(0.25), + blurRadius: 10, + offset: const Offset(0, 5)) + ], + ), + child: Column( + children: [ + const Text("المبلغ المطلوب", + style: TextStyle(color: Colors.white70, fontSize: 14)), + const SizedBox(height: 5), + Text("${currencyFormat.format(widget.amount)} ل.س", + style: const TextStyle( + color: Colors.white, + fontSize: 28, + fontWeight: FontWeight.bold)), + ], + ), + ), + const SizedBox(height: 25), + + // 2. رقم البيان (هام جداً - وميض أحمر) + AnimatedBuilder( + animation: _blinkController, + builder: (context, child) { + return Container( + padding: const EdgeInsets.all(20), + decoration: BoxDecoration( + color: Colors.white, + borderRadius: BorderRadius.circular(16), + border: Border.all( + color: _colorAnimation.value ?? Colors.red, + width: 3.0, // إطار سميك + ), + boxShadow: [ + BoxShadow( + color: (_colorAnimation.value ?? Colors.red) + .withOpacity(0.4), + blurRadius: _shadowAnimation.value, + spreadRadius: 2, + ) + ], + ), + child: Column( + children: [ + Row( + mainAxisAlignment: MainAxisAlignment.center, + children: [ + Icon(Icons.warning_rounded, + color: Colors.red.shade800, size: 28), + const SizedBox(width: 8), + Text( + "هام جداً: لا تنسَ!", + style: TextStyle( + color: Colors.red.shade900, + fontWeight: FontWeight.bold, + fontSize: 18), + ), + ], + ), + const SizedBox(height: 10), + const Text( + "يجب نسخ (رقم البيان) هذا ووضعه في تطبيق شام كاش لضمان نجاح العملية.", + textAlign: TextAlign.center, + style: TextStyle( + fontSize: 15, + color: Colors.black87, + fontWeight: FontWeight.w600, + ), + ), + const SizedBox(height: 15), + InkWell( + onTap: () { + Clipboard.setData(ClipboardData(text: invoiceText)); + ScaffoldMessenger.of(context).showSnackBar(SnackBar( + content: const Text("تم نسخ رقم البيان ✅", + textAlign: TextAlign.center), + backgroundColor: Colors.red.shade700)); + }, + borderRadius: BorderRadius.circular(12), + child: Container( + padding: const EdgeInsets.symmetric( + horizontal: 15, vertical: 12), + decoration: BoxDecoration( + color: Colors.red.shade50, + borderRadius: BorderRadius.circular(12), + border: Border.all( + color: Colors.red.shade200, width: 1)), + child: Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + const Text("رقم البيان (Invoice No)", + style: TextStyle( + fontSize: 12, color: Colors.grey)), + Text(invoiceText, + style: TextStyle( + fontSize: 24, + fontWeight: FontWeight.bold, + letterSpacing: 2.0, + color: Colors.red.shade900)), + ], + ), + Container( + padding: const EdgeInsets.all(8), + decoration: BoxDecoration( + color: Colors.red.shade100, + borderRadius: BorderRadius.circular(8), + ), + child: Icon(Icons.copy_rounded, + color: Colors.red.shade900, size: 24), + ), + ], + ), + ), + ), + ], + ), + ); + }, + ), + const SizedBox(height: 25), + + // 3. عنوان الدفع (اختياري / عادي) + Container( + padding: const EdgeInsets.symmetric(horizontal: 15, vertical: 15), + decoration: BoxDecoration( + color: Colors.white, + borderRadius: BorderRadius.circular(12), + border: Border.all(color: Colors.grey.shade300), + ), + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + const Text("عنوان الدفع (Payment Address)", + style: TextStyle(fontSize: 12, color: Colors.grey)), + const SizedBox(height: 8), + InkWell( + onTap: () { + Clipboard.setData(ClipboardData(text: _paymentAddress)); + ScaffoldMessenger.of(context).showSnackBar(SnackBar( + content: const Text("تم نسخ عنوان الدفع ✅", + textAlign: TextAlign.center), + backgroundColor: Colors.green.shade600)); + }, + child: Row( + children: [ + Expanded( + child: Text(_paymentAddress, + style: const TextStyle( + fontSize: 14, + fontWeight: FontWeight.bold, + fontFamily: 'Courier', + color: Colors.black87, + ), + overflow: TextOverflow.ellipsis), + ), + const SizedBox(width: 8), + const Icon(Icons.copy, size: 18, color: Colors.grey), + ], + ), + ), + ], + ), + ), + const SizedBox(height: 30), + + // 4. QR Code + const Text("أو امسح الرمز للدفع", + style: TextStyle(fontSize: 16, fontWeight: FontWeight.bold)), + const SizedBox(height: 10), + GestureDetector( + onTap: () { + showDialog( + context: context, + builder: (ctx) => Dialog( + backgroundColor: Colors.transparent, + child: InteractiveViewer( + child: Image.asset(widget.qrImagePath)))); + }, + child: Container( + padding: const EdgeInsets.all(10), + decoration: BoxDecoration( + color: Colors.white, + borderRadius: BorderRadius.circular(15), + border: Border.all(color: Colors.grey.shade300)), + child: Image.asset(widget.qrImagePath, + width: 150, + height: 150, + fit: BoxFit.contain, + errorBuilder: (c, o, s) => const Icon(Icons.qr_code_2, + size: 100, color: Colors.grey)), + ), + ), + const SizedBox(height: 30), + const LinearProgressIndicator(backgroundColor: Colors.white), + const SizedBox(height: 10), + const Text("جاري التحقق من الدفع تلقائياً...", + style: TextStyle(color: Colors.grey, fontSize: 12)), + const SizedBox(height: 20), + ], + ), + ); + } + + Widget _buildSuccessUI() { + return Column( + mainAxisAlignment: MainAxisAlignment.center, + children: [ + const Icon(Icons.verified_rounded, color: Colors.green, size: 100), + const SizedBox(height: 20), + const Text("تم الدفع بنجاح!", + style: TextStyle(fontSize: 24, fontWeight: FontWeight.bold)), + const SizedBox(height: 40), + SizedBox( + width: double.infinity, + child: ElevatedButton( + style: ElevatedButton.styleFrom( + backgroundColor: Colors.green, + foregroundColor: Colors.white, + padding: const EdgeInsets.symmetric(vertical: 16)), + onPressed: () => Navigator.of(context).pop(), + child: const Text("متابعة", style: TextStyle(fontSize: 18)), + ), + ), + ], + ); + } + + Widget _buildErrorUI() { + return Column( + mainAxisAlignment: MainAxisAlignment.center, + children: [ + Icon(Icons.error_outline_rounded, color: Colors.red.shade400, size: 80), + const SizedBox(height: 20), + Text( + _status == PaymentStatus.paymentTimeout + ? "انتهى الوقت" + : "لم يتم التحقق", + style: const TextStyle(fontSize: 22, fontWeight: FontWeight.bold)), + const SizedBox(height: 15), + const Padding( + padding: EdgeInsets.symmetric(horizontal: 30), + child: Text("لم يصلنا إشعار الدفع خلال الوقت المحدد.", + textAlign: TextAlign.center, + style: TextStyle(color: Colors.grey))), + const SizedBox(height: 40), + SizedBox( + width: double.infinity, + child: ElevatedButton.icon( + style: ElevatedButton.styleFrom( + padding: const EdgeInsets.symmetric(vertical: 15)), + onPressed: _createAndPollInvoice, + icon: const Icon(Icons.refresh), + label: const Text("حاول مرة أخرى"), + ), + ), + const SizedBox(height: 15), + TextButton( + onPressed: () => Navigator.of(context).pop(), + child: const Text("إلغاء", style: TextStyle(color: Colors.grey))) + ], + ); + } +} diff --git a/siro_rider/lib/views/home/navigation/navigation_controller.dart b/siro_rider/lib/views/home/navigation/navigation_controller.dart new file mode 100644 index 0000000..3230a2e --- /dev/null +++ b/siro_rider/lib/views/home/navigation/navigation_controller.dart @@ -0,0 +1,1383 @@ +import 'dart:async'; +import 'dart:convert'; +import 'dart:math'; +import 'package:siro_rider/views/widgets/error_snakbar.dart'; +import 'package:flutter/foundation.dart'; +import 'package:flutter/material.dart'; +import 'package:flutter/services.dart'; +import 'package:geolocator/geolocator.dart'; +import 'package:get/get.dart'; +import 'package:intaleq_maps/intaleq_maps.dart'; +import 'package:http/http.dart' as http; +import '../../../constant/box_name.dart'; +import '../../../constant/links.dart'; +import '../../../controller/functions/crud.dart'; +import '../../../controller/functions/tts.dart'; +import '../../../controller/home/decode_polyline_isolate.dart'; +import '../../../env/env.dart'; +import '../../../main.dart'; +import '../../../print.dart'; +import 'dart:ui'; + +import '../../../services/offline_map_service.dart'; + +class RouteData { + final List coordinates; + final List> steps; + final double distanceM; + final double durationS; + final String points; + + RouteData({ + required this.coordinates, + required this.steps, + required this.distanceM, + required this.durationS, + required this.points, + }); +} + +class NavigationController extends GetxController + with GetSingleTickerProviderStateMixin { + static const Duration _recordInterval = Duration(seconds: 4); + static const Duration _uploadInterval = Duration(minutes: 2); + static const double _minMoveToRecord = 10.0; + static const double _minMoveToProcess = 2.0; + static const double _offRouteThresholdM = 25.0; + static const int _offRouteTriggerSeconds = 6; + + bool isLoading = false; + IntaleqMapController? mapController; + bool isStyleLoaded = false; + final TextEditingController placeDestinationController = + TextEditingController(); + + LatLng? myLocation; + + double _oldHeading = 0.0; + double _targetHeading = 0.0; + double _smoothedHeading = 0.0; + + AnimationController? _animController; + LatLng? _oldLoc; + LatLng? _targetLoc; + + double currentSpeed = 0.0; + double totalDistance = 0.0; + + Set markers = {}; + Set polylines = {}; + Set circles = {}; + Set polygons = {}; + + StreamSubscription? _locationStreamSubscription; + LatLng? _lastProcessedLocation; + + List placesDestination = []; + Timer? _debounce; + + // Alternative route handling + bool _hasAlternativeRoutes = false; + DateTime? _lastAutoRerouteTime; + + LatLng? _finalDestination; + LatLng? _intermediateStop; + List> routeSteps = []; + List _fullRouteCoordinates = []; + int _lastTraveledIndexInFullRoute = 0; + + bool _nextInstructionSpoken = false; + String currentInstruction = ""; + String nextInstruction = ""; + int currentStepIndex = 0; + String distanceToNextStep = ""; + String totalDistanceRemaining = ""; + String estimatedTimeRemaining = ""; + dynamic currentManeuverModifier = 0; + String arrivalTime = "--:--"; // NEW: For the active navigation HUD + + double _routeTotalDistanceM = 0; + double _routeTotalDurationS = 0; + + bool isNavigating = false; + bool isMuted = false; // Sound toggle state + String distanceWithUnit = ""; + bool _cameraLockedToUser = true; + bool _mapReady = false; + + bool isSelectingPlaceLocation = false; + + void togglePlaceSelectionMode() { + isSelectingPlaceLocation = !isSelectingPlaceLocation; + update(); + } + + Future submitNewPlace(String name, String category) async { + if (mapController == null || name.isEmpty || category.isEmpty) return; + + // Get current center of the map as the picked location + final LatLng pickedPos = mapController!.cameraPosition!.target; + + isLoading = true; + update(); + + final String country = + box.read(BoxName.countryCode) == 'SY' ? 'syria' : 'jordan'; + + final Map payload = { + 'name': name, + 'category': category, + 'lat': pickedPos.latitude, + 'lng': pickedPos.longitude, + 'country': country, + }; + + try { + final response = await CRUD().postMapSaas( + link: AppLink.mapSaasPlaces, + payload: payload, + ); + + isLoading = false; + if (response != null) { + HapticFeedback.lightImpact(); + mySnackbarSuccess(box.read(BoxName.lang) == 'ar' + ? 'تمت إضافة المكان بنجاح! شكراً لمساهمتك.' + : 'Place added successfully! Thanks for your contribution.'); + isSelectingPlaceLocation = false; + } else { + mySnackbarWarning(box.read(BoxName.lang) == 'ar' + ? 'تعذر إضافة المكان. يرجى المحاولة لاحقاً.' + : 'Failed to add place. Please try again later.'); + } + update(); + } catch (e) { + isLoading = false; + mySnackbarWarning(box.read(BoxName.lang) == 'ar' + ? 'حدث خطأ أثناء الاتصال بالخادم.' + : 'An error occurred while connecting to the server.'); + update(); + } + } + + DateTime? _offRouteStartTime; + bool _autoRecalcInProgress = false; + + final List> _trackBuffer = []; + Timer? _recordTimer; + Timer? _uploadBatchTimer; + LatLng? _lastBufferedLocation; + DateTime? _lastBufferedTime; + LatLng? _lastDistanceLocation; + + List routes = []; + int selectedRouteIndex = 0; + + List> recentLocations = []; + + double get _targetZoom { + if (currentSpeed < 15) return 19.0; + if (currentSpeed < 40) return 18.0; + if (currentSpeed < 70) return 17.0; + if (currentSpeed < 100) return 16.0; + return 15.0; + } + + double get _targetTilt { + if (currentSpeed < 10) return 0.0; + if (currentSpeed < 40) return 40.0; + return 55.0; + } + + // Categories list for the picker + static final List> placeCategories = [ + { + 'id': 'restaurant', + 'en': 'Restaurant', + 'ar': 'مطعم', + 'icon': 'restaurant' + }, + {'id': 'cafe', 'en': 'Cafe', 'ar': 'مقهى', 'icon': 'coffee'}, + { + 'id': 'supermarket', + 'en': 'Supermarket', + 'ar': 'سوبر ماركت', + 'icon': 'shopping_basket' + }, + { + 'id': 'pharmacy', + 'en': 'Pharmacy', + 'ar': 'صيدلية', + 'icon': 'local_pharmacy' + }, + { + 'id': 'gas_station', + 'en': 'Gas Station', + 'ar': 'محطة وقود', + 'icon': 'local_gas_station' + }, + {'id': 'atm', 'en': 'ATM', 'ar': 'صراف آلي', 'icon': 'atm'}, + {'id': 'bank', 'en': 'Bank', 'ar': 'بنك', 'icon': 'account_balance'}, + {'id': 'mosque', 'en': 'Mosque', 'ar': 'مسجد', 'icon': 'mosque'}, + { + 'id': 'hospital', + 'en': 'Hospital', + 'ar': 'مستشفى', + 'icon': 'local_hospital' + }, + {'id': 'school', 'en': 'School', 'ar': 'مدرسة', 'icon': 'school'}, + { + 'id': 'university', + 'en': 'University', + 'ar': 'جامعة', + 'icon': 'account_balance' + }, + {'id': 'park', 'en': 'Park', 'ar': 'منتزه', 'icon': 'park'}, + {'id': 'hotel', 'en': 'Hotel', 'ar': 'فندق', 'icon': 'hotel'}, + { + 'id': 'mall', + 'en': 'Shopping Mall', + 'ar': 'مركز تسوق', + 'icon': 'shopping_mall' + }, + {'id': 'gym', 'en': 'Gym', 'ar': 'نادي رياضي', 'icon': 'fitness_center'}, + { + 'id': 'salon', + 'en': 'Beauty Salon', + 'ar': 'صالون تجميل', + 'icon': 'content_cut' + }, + {'id': 'bakery', 'en': 'Bakery', 'ar': 'مخبز', 'icon': 'bakery_dining'}, + { + 'id': 'laundry', + 'ar': 'مصبغة', + 'en': 'Laundry', + 'icon': 'local_laundry_service' + }, + { + 'id': 'car_repair', + 'en': 'Car Repair', + 'ar': 'تصليح سيارات', + 'icon': 'build' + }, + { + 'id': 'government', + 'en': 'Government Office', + 'ar': 'دائرة حكومية', + 'icon': 'gavel' + }, + ]; + + IconData get currentManeuverIcon { + switch (currentManeuverModifier) { + case 4: // Arrive + return Icons.place_rounded; + case 6: // Roundabout + return Icons.roundabout_right_rounded; + case 2: // Right + return Icons.turn_right_rounded; + case 3: // Slight Right + return Icons.turn_slight_right_rounded; + case -2: // Left + return Icons.turn_left_rounded; + case -1: // Slight Left + return Icons.turn_slight_left_rounded; + case 7: // Keep Right + return Icons.turn_right_rounded; + case -7: // Keep Left + return Icons.turn_left_rounded; + case 0: // Straight + return Icons.straight_rounded; + default: + return Icons.straight_rounded; + } + } + + void toggleMute() { + isMuted = !isMuted; + update(); + } + + @override + void onInit() { + super.onInit(); + _animController = AnimationController( + vsync: this, duration: const Duration(milliseconds: 1000)); + _animController!.addListener(() { + if (_oldLoc != null && _targetLoc != null && _mapReady) { + final t = _animController!.value; + final lat = lerpDouble(_oldLoc!.latitude, _targetLoc!.latitude, t)!; + final lng = lerpDouble(_oldLoc!.longitude, _targetLoc!.longitude, t)!; + myLocation = LatLng(lat, lng); + _smoothedHeading = _lerpAngle(_oldHeading, _targetHeading, t); + + if (isStyleLoaded) { + _updateCarMarker(); + if (_cameraLockedToUser) { + animateCameraToPosition(myLocation!, + bearing: _smoothedHeading, + zoom: isNavigating ? _targetZoom : 17.0, + tilt: isNavigating ? _targetTilt : 0.0); + } + } + } + }); + _initialize(); + } + + Future _initialize() async { + _loadRecentLocations(); + await _getCurrentLocationAndStartUpdates(); + } + + void _loadRecentLocations() { + final dynamic stored = box.read(BoxName.recentLocations); + if (stored != null) { + try { + List parsed; + if (stored is String) { + parsed = jsonDecode(stored); + } else if (stored is List) { + parsed = stored; + } else { + parsed = []; + } + + recentLocations = parsed + .map((e) => Map.from(e)) + .toList() + .reversed // Most recent first + .take(3) + .toList(); + } catch (e) { + Log.print("Error decoding recent locations: $e"); + recentLocations = []; + } + } else { + recentLocations = []; + } + update(); + } + + @override + void onClose() { + _locationStreamSubscription?.cancel(); + _recordTimer?.cancel(); + _uploadBatchTimer?.cancel(); + _debounce?.cancel(); + _animController?.dispose(); + mapController = null; + placeDestinationController.dispose(); + _flushBufferToServer(); + super.onClose(); + } + + void onMapCreated(IntaleqMapController controller) async { + Log.print("DEBUG: NavigationController.onMapCreated called"); + mapController = controller; + } + + Future onStyleLoaded() async { + Log.print("DEBUG: NavigationController.onStyleLoaded called"); + isStyleLoaded = true; + await _loadCustomIcons(); + + WidgetsBinding.instance.addPostFrameCallback((_) async { + await Future.delayed(const Duration(milliseconds: 300)); + if (!_mapReady) { + Log.print("DEBUG: NavigationController setting _mapReady = true"); + _mapReady = true; + if (myLocation != null) { + Log.print("DEBUG: Animating camera to initial location: $myLocation"); + animateCameraToPosition(myLocation!); + _updateCarMarker(); + } + if (_fullRouteCoordinates.isNotEmpty) { + Log.print("DEBUG: Updating initial polylines"); + _updatePolylinesSets([], _fullRouteCoordinates); + } + } + }); + } + + void onMapTapped(Point point, LatLng tappedPoint) { + if (isNavigating || routes.isEmpty) return; + + int? bestIndex; + double minDistance = 100.0; // 100 meters threshold for tap + + for (int i = 0; i < routes.length; i++) { + for (var coord in routes[i].coordinates) { + final dist = Geolocator.distanceBetween( + tappedPoint.latitude, + tappedPoint.longitude, + coord.latitude, + coord.longitude, + ); + if (dist < minDistance) { + minDistance = dist; + bestIndex = i; + } + } + } + + if (bestIndex != null && bestIndex != selectedRouteIndex) { + HapticFeedback.selectionClick(); + selectRoute(bestIndex); + } + } + + Future onMapLongPressed(Point point, LatLng tappedPoint) async { + HapticFeedback.mediumImpact(); + Get.dialog( + AlertDialog( + shape: RoundedRectangleBorder(borderRadius: BorderRadius.circular(20)), + title: const Text('بدء الملاحة؟', + style: TextStyle(fontWeight: FontWeight.bold)), + content: const Text('هل تريد الذهاب إلى هذا الموقع؟'), + actions: [ + TextButton( + child: const Text('إلغاء', style: TextStyle(color: Colors.grey)), + onPressed: () => Get.back()), + ElevatedButton( + style: ElevatedButton.styleFrom( + backgroundColor: const Color(0xFF0D47A1), + shape: RoundedRectangleBorder( + borderRadius: BorderRadius.circular(12))), + child: + const Text('اذهب الآن', style: TextStyle(color: Colors.white)), + onPressed: () { + Get.back(); + startNavigationTo(tappedPoint, infoWindowTitle: 'الموقع المحدد'); + }, + ), + ], + ), + ); + } + + Future _getCurrentLocationAndStartUpdates() async { + try { + Log.print("DEBUG: Getting initial location..."); + final position = await Geolocator.getCurrentPosition( + desiredAccuracy: LocationAccuracy.high); + myLocation = LatLng(position.latitude, position.longitude); + Log.print("DEBUG: Initial location acquired: $myLocation"); + _targetHeading = position.heading; + _oldHeading = position.heading; + _smoothedHeading = position.heading; + update(); + if (isStyleLoaded) animateCameraToPosition(myLocation!); + // Start the Location Stream for real-time updates + _startLocationStream(); + _startBatchTimers(); + } catch (e) { + Log.print("DEBUG: Error getting initial location: $e"); + } + } + + void _startLocationStream() { + _locationStreamSubscription?.cancel(); + // Listen to location updates with minimum distance filter of 2 meters + // This provides real-time updates without the 3-4 second delay + _locationStreamSubscription = Geolocator.getPositionStream( + locationSettings: const LocationSettings( + accuracy: LocationAccuracy.high, + distanceFilter: 2, // Update every 2 meters + ), + ).listen( + (Position position) { + _handleLocationUpdate(position); + }, + onError: (error) { + Log.print("DEBUG: Location stream error: $error"); + }, + ); + } + + bool _isProcessing = false; + Future _handleLocationUpdate(Position position) async { + if (_isProcessing) return; + _isProcessing = true; + + try { + final newLoc = LatLng(position.latitude, position.longitude); + currentSpeed = position.speed * 3.6; // Convert m/s to km/h + + // Skip if movement is too small + if (_lastProcessedLocation != null) { + final d = Geolocator.distanceBetween( + newLoc.latitude, + newLoc.longitude, + _lastProcessedLocation!.latitude, + _lastProcessedLocation!.longitude, + ); + if (d < _minMoveToProcess) { + _isProcessing = false; + return; + } + } + + Log.print( + "DEBUG: Location update - Speed: ${currentSpeed.toStringAsFixed(1)} km/h, Loc: $newLoc"); + + // Update total distance + if (_lastDistanceLocation != null) { + final d = Geolocator.distanceBetween( + _lastDistanceLocation!.latitude, + _lastDistanceLocation!.longitude, + newLoc.latitude, + newLoc.longitude, + ); + if (d > 5.0) totalDistance += d; + } + _lastDistanceLocation = newLoc; + + _oldLoc = myLocation ?? newLoc; + _targetLoc = newLoc; + + _oldHeading = _smoothedHeading; + if (currentSpeed > 1.5 && _oldLoc != null) { + _targetHeading = Geolocator.bearingBetween( + _oldLoc!.latitude, + _oldLoc!.longitude, + _targetLoc!.latitude, + _targetLoc!.longitude, + ); + } else { + _targetHeading = position.heading; + } + + _animController?.forward(from: 0.0); + _lastProcessedLocation = newLoc; + + if (isStyleLoaded) _updateCarMarker(); + + if (_fullRouteCoordinates.isNotEmpty) { + _updateTraveledPolylineSmart(newLoc); + _checkNavigationStep(newLoc); + _recomputeETA(); + _checkOffRoute(newLoc); + } + update(); + } catch (e) { + Log.print("DEBUG: Error in _handleLocationUpdate: $e"); + } finally { + _isProcessing = false; + } + } + + double _lerpAngle(double from, double to, double t) { + final double diff = ((to - from + 540.0) % 360.0) - 180.0; + return (from + diff * t + 360.0) % 360.0; + } + + void _checkOffRoute(LatLng pos) { + if (!isNavigating || _autoRecalcInProgress || isLoading) return; + if (_fullRouteCoordinates.isEmpty) return; + + const int searchWindow = 80; + final int start = _lastTraveledIndexInFullRoute; + final int end = min(start + searchWindow, _fullRouteCoordinates.length); + + double minDist = double.infinity; + for (int i = start; i < end; i++) { + final d = Geolocator.distanceBetween( + pos.latitude, + pos.longitude, + _fullRouteCoordinates[i].latitude, + _fullRouteCoordinates[i].longitude, + ); + if (d < minDist) minDist = d; + } + + if (minDist > _offRouteThresholdM) { + if (_offRouteStartTime == null) { + _offRouteStartTime = DateTime.now(); + } else { + final elapsed = + DateTime.now().difference(_offRouteStartTime!).inSeconds; + if (elapsed >= _offRouteTriggerSeconds) { + _offRouteStartTime = null; + _autoRecalcInProgress = true; + _smartRecalculateRoute(pos); + } + } + } else { + _offRouteStartTime = null; + } + } + + /// Recalculate immediately from the latest GPS point to the destination. + Future _smartRecalculateRoute(LatLng currentPos) async { + try { + if (_finalDestination != null) { + await recalculateRoute(origin: currentPos, keepNavigationActive: true); + } + _autoRecalcInProgress = false; + } catch (e) { + Log.print("DEBUG: Error in smart recalculate: $e"); + _autoRecalcInProgress = false; + } + } + + void _startBatchTimers() { + _recordTimer?.cancel(); + _uploadBatchTimer?.cancel(); + _recordTimer = Timer.periodic(_recordInterval, (_) => _recordToBuffer()); + _uploadBatchTimer = + Timer.periodic(_uploadInterval, (_) => _flushBufferToServer()); + } + + void _recordToBuffer() { + if (myLocation == null || + (myLocation!.latitude == 0 && myLocation!.longitude == 0)) { + return; + } + final now = DateTime.now(); + final distFromLast = _lastBufferedLocation == null + ? 999.0 + : Geolocator.distanceBetween( + _lastBufferedLocation!.latitude, + _lastBufferedLocation!.longitude, + myLocation!.latitude, + myLocation!.longitude); + final bool moved = distFromLast > _minMoveToRecord && currentSpeed > 0.5; + final bool timeForced = _lastBufferedTime == null || + now.difference(_lastBufferedTime!).inSeconds >= 60; + if (!moved && !timeForced) return; + + _lastBufferedLocation = myLocation; + _lastBufferedTime = now; + + _trackBuffer.add({ + 'lat': double.parse(myLocation!.latitude.toStringAsFixed(6)), + 'lng': double.parse(myLocation!.longitude.toStringAsFixed(6)), + 'spd': double.parse(currentSpeed.toStringAsFixed(1)), + 'head': _smoothedHeading.toStringAsFixed(0), + 'dist': double.parse(totalDistance.toStringAsFixed(1)), + 'ts': now.toIso8601String(), + }); + } + + Future _flushBufferToServer() async { + if (_trackBuffer.isEmpty) return; + final batch = List>.from(_trackBuffer); + _trackBuffer.clear(); + final String passengerId = (box.read(BoxName.passengerID) ?? '').toString(); + + try { + await CRUD().post( + link: '${AppLink.locationServerSide}/add_batch.php', + payload: { + 'driver_id': passengerId, + 'batch_data': jsonEncode(batch), + 'session_dist': totalDistance.toStringAsFixed(1), + }, + ); + } catch (e) { + _trackBuffer.insertAll(0, batch); + } + } + + Future _updateCarMarker() async { + // Car marker is now handled natively by myLocationEnabled: true. + } + + void animateCameraToPosition(LatLng position, + {double? zoom, double bearing = 0.0, double tilt = 0.0}) { + if (!_mapReady || mapController == null) return; + mapController!.animateCamera(CameraUpdate.newCameraPosition(CameraPosition( + target: position, + zoom: zoom ?? (isNavigating ? _targetZoom : 16.0), + bearing: bearing, + tilt: tilt))); + } + + Future _safeAnimateCameraBounds(LatLngBounds? bounds, + {double left = 60, + double top = 60, + double right = 60, + double bottom = 60}) async { + if (bounds == null || mapController == null) return; + try { + final latSpan = + (bounds.northeast.latitude - bounds.southwest.latitude).abs(); + final lngSpan = + (bounds.northeast.longitude - bounds.southwest.longitude).abs(); + if (latSpan < 0.0001 && lngSpan < 0.0001) { + mapController + ?.animateCamera(CameraUpdate.newLatLngZoom(bounds.northeast, 16)); + return; + } + await Future.delayed(const Duration(milliseconds: 200)); + await mapController?.animateCamera(CameraUpdate.newLatLngBounds(bounds, + left: left, top: top, right: right, bottom: bottom)); + } catch (e) { + try { + await mapController + ?.animateCamera(CameraUpdate.newLatLngZoom(bounds!.northeast, 14)); + } catch (_) {} + } + } + + void onUserPanned() { + _cameraLockedToUser = false; + update(); + } + + void relockCameraToUser() { + _cameraLockedToUser = true; + if (myLocation != null) { + animateCameraToPosition(myLocation!, + bearing: _smoothedHeading, zoom: _targetZoom, tilt: _targetTilt); + } + update(); + } + + bool get isCameraLocked => _cameraLockedToUser; + + void _updateTraveledPolylineSmart(LatLng currentPos) { + if (_fullRouteCoordinates.isEmpty) return; + const int searchWindow = 60; + final int startIndex = _lastTraveledIndexInFullRoute; + final int endIndex = + min(startIndex + searchWindow, _fullRouteCoordinates.length); + + double minDist = double.infinity; + int closestIdx = startIndex; + bool foundCloser = false; + + for (int i = startIndex; i < endIndex; i++) { + final d = Geolocator.distanceBetween( + currentPos.latitude, + currentPos.longitude, + _fullRouteCoordinates[i].latitude, + _fullRouteCoordinates[i].longitude, + ); + if (d < minDist) { + minDist = d; + closestIdx = i; + foundCloser = true; + } + } + + if (foundCloser && + minDist < 50 && + closestIdx > _lastTraveledIndexInFullRoute) { + _lastTraveledIndexInFullRoute = closestIdx; + _updatePolylinesSets(_fullRouteCoordinates.sublist(0, closestIdx + 1), + _fullRouteCoordinates.sublist(closestIdx)); + } + } + + Future _updatePolylinesSets( + List traveled, List remaining) async { + Log.print( + "DEBUG: Updating polylines. Traveled: ${traveled.length}, Remaining: ${remaining.length}"); + Set newPolylines = {}; + + // Render Alternative Routes first + for (int i = 0; i < routes.length; i++) { + if (i == selectedRouteIndex) continue; + newPolylines.add(Polyline( + polylineId: PolylineId('alt_$i'), + points: routes[i].coordinates, + color: const Color(0xFFB0BEC5).withOpacity(0.8), + width: 6, + )); + } + + if (remaining.isNotEmpty) { + newPolylines.add(Polyline( + polylineId: const PolylineId('remaining'), + points: remaining, + color: const Color(0xFF00E5FF), + width: 8, + )); + } + + if (traveled.isNotEmpty) { + newPolylines.add(Polyline( + polylineId: const PolylineId('traveled'), + points: traveled, + color: const Color(0xFFBDBDBD).withOpacity(0.6), + width: 5, + )); + } + + polylines = newPolylines; + update(); + } + + void selectRoute(int index) { + if (index < 0 || index >= routes.length) return; + selectedRouteIndex = index; + final r = routes[index]; + _fullRouteCoordinates = r.coordinates; + routeSteps = r.steps; + _routeTotalDistanceM = r.distanceM; + _routeTotalDurationS = r.durationS; + + _lastTraveledIndexInFullRoute = 0; + _recomputeETA(); + _updatePolylinesSets([], _fullRouteCoordinates); + update(); + } + + void goToFavorite(String type) { + LatLng? dest; + switch (type) { + case 'home': + dest = getHomeLatLng(); + break; + case 'work': + dest = getWorkLatLng(); + break; + case 'airport': + dest = getAirportLatLng(); + break; + } + + if (dest != null && myLocation != null) { + getRoute(myLocation!, dest); + } else { + mySnackbarWarning('الموقع غير متاح حالياً.'); + } + } + + LatLng? getHomeLatLng() { + final dynamic stored = box.read(BoxName.addHome); + if (stored != null && stored is String && stored.contains(',')) { + final parts = stored.split(','); + return LatLng(double.parse(parts[0]), double.parse(parts[1])); + } + return null; + } + + LatLng? getWorkLatLng() { + final dynamic stored = box.read(BoxName.addWork); + if (stored != null && stored is String && stored.contains(',')) { + final parts = stored.split(','); + return LatLng(double.parse(parts[0]), double.parse(parts[1])); + } + return null; + } + + LatLng getAirportLatLng() { + final String country = box.read(BoxName.countryCode) ?? 'JO'; + if (country == 'SY') { + return const LatLng(33.4111, 36.5147); // Damascus Airport + } + return const LatLng(31.7225, 35.9933); // Queen Alia Airport (JO) + } + + Future getRoute(LatLng origin, LatLng destination, + {bool keepNavigationActive = false}) async { + isLoading = true; + update(); + + final String langCode = box.read(BoxName.lang) ?? 'ar'; + final Map queryParams = { + 'fromLat': origin.latitude.toString(), + 'fromLng': origin.longitude.toString(), + 'toLat': destination.latitude.toString(), + 'toLng': destination.longitude.toString(), + 'steps': 'true', + 'alternatives': 'true', + 'locale': langCode, + }; + + if (_intermediateStop != null) { + queryParams['stop1Lat'] = _intermediateStop!.latitude.toString(); + queryParams['stop1Lng'] = _intermediateStop!.longitude.toString(); + } + final saasUri = + Uri.parse(AppLink.mapSaasRoute).replace(queryParameters: queryParams); + + try { + final response = + await http.get(saasUri, headers: {'x-api-key': Env.mapSaasKey}); + + if (response.statusCode != 200) { + isLoading = false; + update(); + mySnackbarWarning('تعذر الاتصال بخدمة التوجيه.'); + return; + } + + final data = jsonDecode(response.body); + + // ── Parse primary route (top-level in response) ── + routes.clear(); + final primaryPts = data['points']?.toString() ?? ""; + if (primaryPts.isNotEmpty) { + final coords = await compute>( + decodePolylineIsolate, primaryPts); + routes.add(RouteData( + coordinates: coords, + steps: List>.from(data['instructions'] ?? []), + distanceM: (data['distance'] as num).toDouble(), + durationS: (data['duration'] as num).toDouble(), + points: primaryPts, + )); + } + + // ── Parse alternative routes (in data['alternatives']) ── + // إذا كان هناك routes بديلة متاحة من API + if (data['alternatives'] != null && data['alternatives'] is List) { + _hasAlternativeRoutes = data['alternatives'].isNotEmpty; + for (var alt in data['alternatives']) { + final altPts = alt['points']?.toString() ?? ""; + if (altPts.isEmpty) continue; + final altCoords = await compute>( + decodePolylineIsolate, altPts); + routes.add(RouteData( + coordinates: altCoords, + steps: List>.from(alt['instructions'] ?? []), + distanceM: (alt['distance'] as num).toDouble(), + durationS: (alt['duration'] as num).toDouble(), + points: altPts, + )); + } + if (_hasAlternativeRoutes) { + Log.print("DEBUG: ${routes.length - 1} alternative routes available"); + } + } else { + _hasAlternativeRoutes = false; + } + + if (routes.isEmpty) { + isLoading = false; + update(); + mySnackbarWarning('لم يتم العثور على مسار.'); + return; + } + + selectedRouteIndex = 0; + final selected = routes[0]; + _fullRouteCoordinates = selected.coordinates; + routeSteps = selected.steps; + _routeTotalDistanceM = selected.distanceM; + _routeTotalDurationS = selected.durationS; + + _lastTraveledIndexInFullRoute = 0; + if (isStyleLoaded) _updatePolylinesSets([], _fullRouteCoordinates); + + if (_fullRouteCoordinates.isNotEmpty) { + OfflineMapService.instance + .downloadRegion(_fullRouteCoordinates.last, radiusKm: 2.0); + } + + _recomputeETA(); + + currentStepIndex = 0; + _nextInstructionSpoken = false; + + isNavigating = keepNavigationActive; + _cameraLockedToUser = keepNavigationActive; + _offRouteStartTime = null; + isLoading = false; + + update(); + + if (routeSteps.isNotEmpty) { + currentInstruction = routeSteps[0]['text'] ?? ""; + currentManeuverModifier = routeSteps[0]['sign'] ?? 0; + nextInstruction = routeSteps.length > 1 + ? (langCode == 'ar' + ? "ثم ${routeSteps[1]['text']}" + : "Then ${routeSteps[1]['text']}") + : (langCode == 'ar' ? "الوجهة النهائية" : "Destination"); + + if (!isMuted) { + Get.find().speakText(currentInstruction); + } + } + + // Re-add car marker after polyline updates (ensures it stays on top) + if (isStyleLoaded) _updateCarMarker(); + + if (keepNavigationActive && myLocation != null) { + animateCameraToPosition(myLocation!, + bearing: _smoothedHeading, zoom: _targetZoom, tilt: _targetTilt); + } else if (_fullRouteCoordinates.length >= 2) { + final bounds = + data['bbox'] != null && (data['bbox'] as List).length == 4 + ? LatLngBounds( + southwest: LatLng(data['bbox'][1], data['bbox'][0]), + northeast: LatLng(data['bbox'][3], data['bbox'][2])) + : _boundsFromLatLngList(_fullRouteCoordinates); + await _safeAnimateCameraBounds(bounds, + bottom: 320, top: 150, left: 50, right: 50); + } + update(); + } catch (e) { + isLoading = false; + update(); + Log.print("GetRoute Error: $e"); + } + } + + void _recomputeETA() { + if (_routeTotalDistanceM == 0 || _fullRouteCoordinates.isEmpty) return; + final fraction = + (_fullRouteCoordinates.length - _lastTraveledIndexInFullRoute) / + _fullRouteCoordinates.length; + final remainingM = _routeTotalDistanceM * fraction; + final remainingS = _routeTotalDurationS * fraction; + + // Distance + final String langCode = box.read(BoxName.lang) ?? 'ar'; + if (remainingM > 1000) { + totalDistanceRemaining = (remainingM / 1000).toStringAsFixed(1); + // We will handle the unit in the view or provide a unit string here + } else { + totalDistanceRemaining = remainingM.toStringAsFixed(0); + } + // New variable to hold formatted distance with unit + distanceWithUnit = _formatDistance(remainingM, langCode); + + // Time Remaining + final minutes = (remainingS / 60).round(); + estimatedTimeRemaining = minutes.toString(); + + // Arrival Time Calculation + final arrival = DateTime.now().add(Duration(seconds: remainingS.toInt())); + final h = arrival.hour > 12 + ? arrival.hour - 12 + : (arrival.hour == 0 ? 12 : arrival.hour); + final m = arrival.minute.toString().padLeft(2, '0'); + final ampm = arrival.hour >= 12 ? 'PM' : 'AM'; + arrivalTime = "$h:$m $ampm"; + } + + Future startNavigationTo(LatLng destination, + {String infoWindowTitle = ''}) async { + isLoading = true; + update(); + try { + _finalDestination = destination; + await clearRoute(isNewRoute: true); + + // Preserve car marker if it exists + markers = markers.where((m) => m.markerId.value == 'car').toSet(); + + markers.add(Marker( + markerId: const MarkerId('destination'), + position: destination, + icon: InlqBitmap.fromStyleImage('dest_icon'), + infoWindow: infoWindowTitle.isNotEmpty + ? InfoWindow(title: infoWindowTitle) + : InfoWindow.noText, + )); + + if (myLocation != null) { + markers.add(Marker( + markerId: const MarkerId('origin'), + position: myLocation!, + icon: InlqBitmap.fromStyleImage('start_icon'), + )); + await getRoute(myLocation!, destination); + } + } finally { + isLoading = false; + update(); + } + } + + Future recalculateRoute( + {LatLng? origin, bool keepNavigationActive = false}) async { + final LatLng? routeOrigin = origin ?? myLocation; + if (routeOrigin == null || _finalDestination == null || isLoading) return; + + isLoading = true; + update(); + + markers = markers.where((m) => m.markerId.value != 'origin').toSet(); + markers.add(Marker( + markerId: const MarkerId('origin'), + position: routeOrigin, + icon: InlqBitmap.fromStyleImage('start_icon'), + )); + + await getRoute(routeOrigin, _finalDestination!, + keepNavigationActive: keepNavigationActive); + isLoading = false; + update(); + } + + Future startActiveNavigation() async { + if (routes.isEmpty) { + mySnackbarWarning(box.read(BoxName.lang) == 'ar' + ? 'لا يوجد مسار لبدء الملاحة.' + : 'No route to start navigation.'); + return; + } + if (isNavigating) return; + + isNavigating = true; + _cameraLockedToUser = true; + + // Ensure ETA and distances are up-to-date + _lastTraveledIndexInFullRoute = _lastTraveledIndexInFullRoute; + _recomputeETA(); + + // Initialize current instruction if available + if (routeSteps.isNotEmpty && currentStepIndex < routeSteps.length) { + currentInstruction = routeSteps[currentStepIndex]['text'] ?? ""; + currentManeuverModifier = routeSteps[currentStepIndex]['sign'] ?? 0; + nextInstruction = (currentStepIndex + 1) < routeSteps.length + ? (box.read(BoxName.lang) == 'ar' + ? "ثم ${routeSteps[currentStepIndex + 1]['text']}" + : "Then ${routeSteps[currentStepIndex + 1]['text']}") + : (box.read(BoxName.lang) == 'ar' ? 'الوجهة' : 'Destination'); + + if (!isMuted) { + try { + Get.find().speakText(currentInstruction); + } catch (_) {} + } + } + + // Center camera on user for navigation mode + if (myLocation != null) { + animateCameraToPosition(myLocation!, + bearing: _smoothedHeading, zoom: _targetZoom, tilt: _targetTilt); + } + + update(); + } + + Future clearEverything() async { + placeDestinationController.clear(); + placesDestination = []; + await clearRoute(); + } + + Future clearRoute({bool isNewRoute = false}) async { + _offRouteStartTime = null; + _autoRecalcInProgress = false; + if (!isNewRoute) { + markers = {}; + polylines = {}; + circles = {}; + polygons = {}; + _finalDestination = null; + isNavigating = false; + routes = []; + await _flushBufferToServer(); + } + routeSteps = []; + _fullRouteCoordinates = []; + _lastTraveledIndexInFullRoute = 0; + currentInstruction = ""; + nextInstruction = ""; + currentManeuverModifier = "intaleq"; + distanceToNextStep = ""; + totalDistanceRemaining = ""; + estimatedTimeRemaining = ""; + arrivalTime = "--:--"; + _routeTotalDistanceM = 0; + _routeTotalDurationS = 0; + + if (!isNewRoute) { + await _updateCarMarker(); + } + update(); + } + + Future _loadCustomIcons() async { + if (mapController == null) return; + final carBytes = await rootBundle.load('assets/images/car.png'); + final startBytes = await rootBundle.load('assets/images/A.png'); + final destBytes = await rootBundle.load('assets/images/b.png'); + await mapController!.addImage('car_icon', carBytes.buffer.asUint8List()); + await mapController! + .addImage('start_icon', startBytes.buffer.asUint8List()); + await mapController!.addImage('dest_icon', destBytes.buffer.asUint8List()); + } + + void _checkNavigationStep(LatLng pos) { + if (routeSteps.isEmpty || currentStepIndex >= routeSteps.length) return; + + final interval = routeSteps[currentStepIndex]['interval'] as List; + final endIdx = interval[1] as int; + + if (endIdx >= _fullRouteCoordinates.length) return; + + final endLatLng = _fullRouteCoordinates[endIdx]; + final distance = Geolocator.distanceBetween( + pos.latitude, pos.longitude, endLatLng.latitude, endLatLng.longitude); + + distanceToNextStep = distance > 1000 + ? "${(distance / 1000).toStringAsFixed(1)} km" + : "${distance.toStringAsFixed(0)} m"; + + if (distance < 50 && + !_nextInstructionSpoken && + nextInstruction.isNotEmpty) { + if (!isMuted) { + Get.find().speakText(nextInstruction); + } + _nextInstructionSpoken = true; + } + if (distance < 20) _advanceStep(); + } + + void _advanceStep() { + currentStepIndex++; + final String langCode = box.read(BoxName.lang) ?? 'ar'; + if (currentStepIndex < routeSteps.length) { + currentInstruction = routeSteps[currentStepIndex]['text'] ?? ""; + currentManeuverModifier = routeSteps[currentStepIndex]['sign'] ?? 0; + nextInstruction = (currentStepIndex + 1) < routeSteps.length + ? (langCode == 'ar' + ? "ثم ${routeSteps[currentStepIndex + 1]['text']}" + : "Then ${routeSteps[currentStepIndex + 1]['text']}") + : (langCode == 'ar' ? "ستصل إلى وجهتك" : "Arriving soon"); + _nextInstructionSpoken = false; + update(); + } else { + _finishNavigation(); + } + } + + void _finishNavigation() { + final String langCode = box.read(BoxName.lang) ?? 'ar'; + currentInstruction = + langCode == 'ar' ? "لقد وصلت إلى وجهتك" : "You have arrived"; + currentManeuverModifier = 4; + nextInstruction = ""; + distanceToNextStep = ""; + isNavigating = false; + if (!isMuted) { + Get.find().speakText(currentInstruction); + } + _flushBufferToServer(); + update(); + } + + Future getPlaces() async { + final q = placeDestinationController.text.trim(); + if (q.length < 3) { + placesDestination = []; + update(); + return; + } + if (mapController == null) return; + + try { + // ✅ Use searchPlaces from intaleq_maps SDK + final results = await mapController!.searchPlaces(q); + + if (myLocation != null) { + for (final p in results) { + final plat = double.tryParse(p['latitude']?.toString() ?? '0') ?? 0.0; + final plng = + double.tryParse(p['longitude']?.toString() ?? '0') ?? 0.0; + p['distanceKm'] = _haversineKm( + myLocation!.latitude, myLocation!.longitude, plat, plng); + } + results.sort((a, b) => + (a['distanceKm'] as double).compareTo(b['distanceKm'] as double)); + } + + placesDestination = results; + update(); + } catch (e) { + Log.print('getPlaces error: $e'); + } + } + + Future selectDestination(dynamic place) async { + placeDestinationController.clear(); + placesDestination = []; + final lat = double.parse(place['latitude'].toString()); + final lng = double.parse(place['longitude'].toString()); + await startNavigationTo(LatLng(lat, lng), + infoWindowTitle: place['name'] ?? 'وجهة'); + } + + void onSearchChanged(String query) { + if (_debounce?.isActive ?? false) _debounce!.cancel(); + _debounce = Timer(const Duration(milliseconds: 500), () => getPlaces()); + } + + double _haversineKm(double lat1, double lon1, double lat2, double lon2) { + const R = 6371.0; + final dLat = (lat2 - lat1) * (pi / 180.0); + final dLon = (lon2 - lon1) * (pi / 180.0); + final a = sin(dLat / 2) * sin(dLat / 2) + + cos(lat1 * pi / 180) * + cos(lat2 * pi / 180) * + sin(dLon / 2) * + sin(dLon / 2); + return R * 2 * atan2(sqrt(a), sqrt(1 - a)); + } + + double _kmToLatDelta(double km) => km / 111.32; + double _kmToLngDelta(double km, double lat) => + km / (111.32 * cos(lat * pi / 180)); + LatLngBounds _boundsFromLatLngList(List list) { + double? x0, x1, y0, y1; + for (final ll in list) { + if (x0 == null) { + x0 = x1 = ll.latitude; + y0 = y1 = ll.longitude; + } else { + if (ll.latitude > x1!) x1 = ll.latitude; + if (ll.latitude < x0) x0 = ll.latitude; + if (ll.longitude > y1!) y1 = ll.longitude; + if (ll.longitude < y0!) y0 = ll.longitude; + } + } + return LatLngBounds( + northeast: LatLng(x1!, y1!), southwest: LatLng(x0!, y0!)); + } + + void setIntermediateStop(LatLng stop) { + _intermediateStop = stop; + if (myLocation != null && _finalDestination != null) { + getRoute(myLocation!, _finalDestination!); + } + update(); + } + + void clearIntermediateStop() { + _intermediateStop = null; + if (myLocation != null && _finalDestination != null) { + getRoute(myLocation!, _finalDestination!); + } + update(); + } + + String _formatDistance(double meters, String lang) { + if (meters >= 1000) { + return "${(meters / 1000).toStringAsFixed(1)} ${lang == 'ar' ? 'كم' : 'km'}"; + } else { + return "${meters.toStringAsFixed(0)} ${lang == 'ar' ? 'م' : 'm'}"; + } + } + + Future submitPlaceSuggestion(String name) async { + if (name.trim().isEmpty || myLocation == null) return; + isLoading = true; + update(); + try { + final payload = { + 'name': name, + 'lat': myLocation!.latitude.toString(), + 'lng': myLocation!.longitude.toString(), + 'passenger_id': box.read(BoxName.passengerID), + }; + await CRUD().post(link: AppLink.getPlacesSyria, payload: payload); + mySnackbarInfo(box.read(BoxName.lang) == 'ar' + ? "تم استلام اقتراحك! مكافأتك: +٥٠ نقطة" + : "Suggestion received! Reward: +50 points"); + } finally { + isLoading = false; + update(); + } + } +} diff --git a/siro_rider/lib/views/home/navigation/navigation_view.dart b/siro_rider/lib/views/home/navigation/navigation_view.dart new file mode 100644 index 0000000..26e974f --- /dev/null +++ b/siro_rider/lib/views/home/navigation/navigation_view.dart @@ -0,0 +1,1159 @@ +import 'dart:math'; +import 'dart:ui'; +import 'package:flutter/material.dart'; +import 'package:flutter/services.dart'; +import 'package:get/get.dart'; +import 'package:intaleq_maps/intaleq_maps.dart'; +import 'package:siro_rider/env/env.dart'; + +import '../../../constant/box_name.dart'; +import '../../../constant/colors.dart'; +import '../../../main.dart'; +import '../../widgets/error_snakbar.dart'; +import 'navigation_controller.dart'; + +// ─── Color Palette ────────────────────────────────────────────────────────── +Color get _kSurface => + Get.isDarkMode ? const Color(0xFF0F172A) : const Color(0xFFF8FAFC); +Color get _kCardColor => + Get.isDarkMode ? const Color(0xFF1E293B) : const Color(0xFFFFFFFF); +Color get _kOnSurface => + Get.isDarkMode ? const Color(0xFFF1F5F9) : const Color(0xFF0F172A); +Color get _kPrimary => const Color(0xFF2563EB); + +class NavigationView extends StatelessWidget { + const NavigationView({super.key}); + + @override + Widget build(BuildContext context) { + final NavigationController c = Get.put(NavigationController()); + + return AnnotatedRegion( + value: Get.isDarkMode + ? SystemUiOverlayStyle.light + : SystemUiOverlayStyle.dark, + child: Scaffold( + backgroundColor: _kSurface, + body: GetBuilder( + builder: (_) => Stack( + children: [ + // ── 1. Map Layer ────────────────────────────────────────────── + IntaleqMap( + apiKey: Env.mapSaasKey, + onMapCreated: c.onMapCreated, + onStyleLoaded: c.onStyleLoaded, + onLongPress: (pos) => c.onMapLongPressed(Point(0, 0), pos), + onTap: (pos) => c.onMapTapped(Point(0, 0), pos), + markers: c.markers, + polylines: c.polylines, + circles: c.circles, + polygons: c.polygons, + mapType: Get.isDarkMode + ? IntaleqMapType.normal + : IntaleqMapType.light, + initialCameraPosition: CameraPosition( + target: c.myLocation ?? const LatLng(33.5138, 36.2765), + zoom: 16.0), + myLocationEnabled: false, + ), + + // ── 2. Top UI (Explore Mode) ────────────────────────────────── + if (!c.isNavigating) _ExploreTopUI(controller: c), + + // ── 3. Top UI (Active Navigation Banner) ── + if (c.isNavigating && c.currentInstruction.isNotEmpty) + _ActiveTopInstruction(controller: c), + + // ── 4. Explore Action Row ───────────────────────────────────── + if (!c.isNavigating) _ExploreActionRow(controller: c), + + // ── 5. Bottom Panel (Explore Mode) ──────────────────────────── + if (!c.isNavigating) _ExploreBottomPanel(controller: c), + + // ── 6. Bottom HUD (Active Navigation) ───────────────────────── + if (c.isNavigating) _ActiveBottomHUD(controller: c), + + // ── 7. Search Results Dropdown ──────────────────────────────── + if (c.placesDestination.isNotEmpty && !c.isNavigating) + _SearchResults(controller: c), + + // ── 8. Loading Overlay ──────────────────────────────────────── + if (c.isLoading) const _LoadingOverlay(), + + // ── 9. Location Picker Overlay (Place Creation) ────────────── + _LocationPickerOverlay(controller: c), + + // ── 10. Recenter Button ─────────────────────────────────────── + if (!c.isCameraLocked && !c.isNavigating) + Positioned( + right: 16, + bottom: 250, + child: _buildMapFAB( + icon: Icons.my_location_rounded, + onTap: () => c.relockCameraToUser(), + ), + ), + + // ── 11. Navigation Icon (Fixed Center) ──────────────────────── + if (c.isNavigating) const _NavigationCenterIcon(), + ], + ), + ), + ), + ); + } + + Widget _buildMapFAB({required IconData icon, required VoidCallback onTap}) { + return GestureDetector( + onTap: onTap, + child: Container( + width: 48, + height: 48, + decoration: BoxDecoration( + color: _kCardColor, + shape: BoxShape.circle, + boxShadow: [ + BoxShadow( + color: Colors.black.withOpacity(0.15), + blurRadius: 12, + offset: const Offset(0, 4), + ) + ], + ), + child: Icon(icon, color: _kPrimary, size: 22), + ), + ); + } +} + +// ============================================================================= +// NAVIGATION CENTER ICON (FIXED) +// ============================================================================= + +class _NavigationCenterIcon extends StatelessWidget { + const _NavigationCenterIcon({Key? key}) : super(key: key); + + @override + Widget build(BuildContext context) { + return IgnorePointer( + child: Center( + child: Column( + mainAxisSize: MainAxisSize.min, + children: [ + Container( + decoration: BoxDecoration( + color: _kPrimary, + shape: BoxShape.circle, + boxShadow: [ + BoxShadow( + color: Colors.black.withOpacity(0.3), + blurRadius: 12, + offset: const Offset(0, 4), + ) + ], + border: Border.all(color: Colors.white, width: 3), + ), + padding: const EdgeInsets.all(12), + child: const Icon( + Icons.navigation_rounded, + color: Colors.white, + size: 32, + ), + ), + const SizedBox(height: 40), // Adjust to align with map focus + ], + ), + ), + ); + } +} + +// ============================================================================= +// UI COMPONENTS +// ============================================================================= + +class _ExploreTopUI extends StatelessWidget { + final NavigationController controller; + const _ExploreTopUI({required this.controller}); + + @override + Widget build(BuildContext context) { + return Positioned( + top: 0, + left: 0, + right: 0, + child: SafeArea( + bottom: false, + child: Padding( + padding: const EdgeInsets.symmetric(horizontal: 16, vertical: 12), + child: Container( + decoration: BoxDecoration( + color: _kCardColor, + borderRadius: BorderRadius.circular(16), + boxShadow: [ + BoxShadow( + color: Colors.black.withOpacity(0.08), + blurRadius: 24, + offset: const Offset(0, 8), + ) + ], + ), + padding: const EdgeInsets.symmetric(horizontal: 8, vertical: 6), + child: Row( + children: [ + IconButton( + icon: Icon(Icons.menu_rounded, color: _kOnSurface, size: 24), + onPressed: () {}, + ), + const SizedBox(width: 8), + Expanded( + child: TextField( + controller: controller.placeDestinationController, + onChanged: controller.onSearchChanged, + textInputAction: TextInputAction.search, + style: TextStyle( + fontSize: 16, + color: _kOnSurface, + fontWeight: FontWeight.w600), + decoration: InputDecoration( + hintText: box.read(BoxName.lang) == 'ar' + ? 'إلى أين؟' + : 'Where to?', + hintStyle: TextStyle( + color: _kOnSurface.withOpacity(0.4), fontSize: 16), + border: InputBorder.none, + isDense: true, + ), + ), + ), + if (controller.placeDestinationController.text.isNotEmpty || + controller.routes.isNotEmpty) + IconButton( + icon: Icon(Icons.close_rounded, + color: Colors.red.shade400, size: 22), + onPressed: () => controller.clearEverything(), + ) + else + Padding( + padding: const EdgeInsets.only(right: 8), + child: CircleAvatar( + radius: 18, + backgroundColor: _kPrimary, + child: const Icon(Icons.person_rounded, + color: Colors.white, size: 20), + ), + ), + ], + ), + ), + ), + ), + ); + } +} + +class _ExploreBottomPanel extends StatelessWidget { + final NavigationController controller; + const _ExploreBottomPanel({required this.controller}); + + @override + Widget build(BuildContext context) { + final bool hasRoutes = controller.routes.isNotEmpty; + final isArabic = box.read(BoxName.lang) == 'ar'; + final bottomPad = MediaQuery.of(context).padding.bottom; + + if (!hasRoutes) return const SizedBox.shrink(); + + return Positioned( + bottom: 0, + left: 0, + right: 0, + child: Container( + padding: EdgeInsets.only(bottom: bottomPad + 16, top: 16), + decoration: BoxDecoration( + color: _kCardColor, + borderRadius: const BorderRadius.vertical(top: Radius.circular(24)), + boxShadow: [ + BoxShadow( + color: Colors.black.withOpacity(0.1), + blurRadius: 32, + offset: const Offset(0, -4), + ) + ], + ), + child: Column( + mainAxisSize: MainAxisSize.min, + children: [ + Padding( + padding: const EdgeInsets.symmetric(horizontal: 16), + child: Row( + children: [ + Text( + isArabic ? 'المسارات المتاحة' : 'Available Routes', + style: TextStyle( + color: _kOnSurface, + fontWeight: FontWeight.bold, + fontSize: 14, + ), + ), + ], + ), + ), + const SizedBox(height: 12), + SizedBox( + height: 90, + child: ListView.builder( + padding: const EdgeInsets.symmetric(horizontal: 12), + scrollDirection: Axis.horizontal, + itemCount: controller.routes.length, + itemBuilder: (context, index) { + final r = controller.routes[index]; + final isSelected = controller.selectedRouteIndex == index; + return GestureDetector( + onTap: () => controller.selectRoute(index), + child: Container( + width: 140, + margin: const EdgeInsets.symmetric(horizontal: 4), + padding: const EdgeInsets.all(12), + decoration: BoxDecoration( + color: isSelected ? _kPrimary : _kSurface, + borderRadius: BorderRadius.circular(16), + border: Border.all( + color: isSelected ? _kPrimary : Colors.grey.shade300, + width: 1.5, + ), + ), + child: Column( + mainAxisAlignment: MainAxisAlignment.center, + children: [ + Icon( + Icons.route_rounded, + color: isSelected ? Colors.white : _kOnSurface, + ), + const SizedBox(height: 6), + Text( + "${(r.distanceM / 1000).toStringAsFixed(1)} km", + style: TextStyle( + color: isSelected ? Colors.white : _kOnSurface, + fontWeight: FontWeight.bold, + ), + ), + Text( + "${(r.durationS / 60).toInt()} min", + style: TextStyle( + color: isSelected + ? Colors.white70 + : _kOnSurface.withOpacity(0.6), + fontSize: 12, + ), + ), + ], + ), + ), + ); + }, + ), + ), + const SizedBox(height: 16), + Padding( + padding: const EdgeInsets.symmetric(horizontal: 24), + child: SizedBox( + width: double.infinity, + height: 52, + child: ElevatedButton( + style: ElevatedButton.styleFrom( + backgroundColor: _kPrimary, + elevation: 0, + shape: RoundedRectangleBorder( + borderRadius: BorderRadius.circular(16)), + ), + onPressed: () { + HapticFeedback.mediumImpact(); + controller.startActiveNavigation(); + }, + child: Row( + mainAxisAlignment: MainAxisAlignment.center, + children: [ + const Icon(Icons.navigation_rounded, + color: Colors.white, size: 20), + const SizedBox(width: 8), + Text(isArabic ? 'ابدأ الملاحة' : 'Start Navigation', + style: const TextStyle( + color: Colors.white, + fontSize: 16, + fontWeight: FontWeight.w700)), + ], + ), + ), + ), + ), + ], + ), + ), + ); + } +} + +class _ActiveTopInstruction extends StatelessWidget { + final NavigationController controller; + const _ActiveTopInstruction({required this.controller}); + + @override + Widget build(BuildContext context) { + return Positioned( + top: MediaQuery.of(context).padding.top + 12, + left: 16, + right: 16, + child: Container( + decoration: BoxDecoration( + color: const Color(0xFF1B5E20), + borderRadius: BorderRadius.circular(20), + boxShadow: [ + BoxShadow( + color: Colors.black.withOpacity(0.25), + blurRadius: 16, + offset: const Offset(0, 8)) + ], + ), + padding: const EdgeInsets.symmetric(horizontal: 16, vertical: 14), + child: Row( + children: [ + Container( + padding: const EdgeInsets.all(10), + decoration: BoxDecoration( + color: Colors.white.withOpacity(0.15), + shape: BoxShape.circle, + ), + child: Icon(controller.currentManeuverIcon, + color: Colors.white, size: 28), + ), + const SizedBox(width: 14), + Expanded( + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + mainAxisSize: MainAxisSize.min, + children: [ + Text( + controller.currentInstruction, + style: const TextStyle( + color: Colors.white, + fontSize: 18, + fontWeight: FontWeight.w700), + maxLines: 2, + overflow: TextOverflow.ellipsis, + ), + const SizedBox(height: 2), + Text( + controller.distanceToNextStep, + style: TextStyle( + color: Colors.white.withOpacity(0.8), + fontSize: 14, + fontWeight: FontWeight.w600), + ), + ], + ), + ), + ], + ), + ), + ); + } +} + +class _ActiveBottomHUD extends StatelessWidget { + final NavigationController controller; + const _ActiveBottomHUD({required this.controller}); + + @override + Widget build(BuildContext context) { + final bottomPad = MediaQuery.of(context).padding.bottom; + final isArabic = box.read(BoxName.lang) == 'ar'; + + return Positioned( + bottom: bottomPad + 16, + left: 16, + right: 16, + child: Row( + crossAxisAlignment: CrossAxisAlignment.end, + children: [ + Container( + width: 70, + height: 70, + decoration: BoxDecoration( + color: _kCardColor, + shape: BoxShape.circle, + border: Border.all(color: Colors.red, width: 3), + boxShadow: [ + BoxShadow(color: Colors.black.withOpacity(0.1), blurRadius: 10) + ], + ), + child: Column( + mainAxisAlignment: MainAxisAlignment.center, + children: [ + Text( + controller.currentSpeed.toStringAsFixed(0), + style: const TextStyle( + fontSize: 22, + fontWeight: FontWeight.w900, + color: Colors.black, + ), + ), + const Text( + 'km/h', + style: TextStyle( + fontSize: 10, + fontWeight: FontWeight.w600, + color: Colors.grey, + ), + ), + ], + ), + ), + const SizedBox(width: 12), + Expanded( + child: Container( + decoration: BoxDecoration( + color: _kCardColor, + borderRadius: BorderRadius.circular(24), + boxShadow: [ + BoxShadow( + color: Colors.black.withOpacity(0.15), + blurRadius: 24, + offset: const Offset(0, 8)) + ], + ), + padding: const EdgeInsets.all(16), + child: Column( + mainAxisSize: MainAxisSize.min, + children: [ + Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + Text( + controller.arrivalTime, + style: const TextStyle( + fontSize: 22, + fontWeight: FontWeight.w900, + color: Color(0xFF2563EB), + ), + ), + Text( + isArabic + ? '${controller.estimatedTimeRemaining} د' + : '${controller.estimatedTimeRemaining} min', + style: TextStyle( + fontSize: 16, + fontWeight: FontWeight.w600, + color: _kOnSurface, + ), + ), + Text( + controller.distanceWithUnit, + style: TextStyle( + fontSize: 16, + fontWeight: FontWeight.w600, + color: _kOnSurface.withOpacity(0.7), + ), + ), + ], + ), + const SizedBox(height: 14), + Row( + children: [ + _CircleIconBtn( + icon: controller.isMuted + ? Icons.volume_off_rounded + : Icons.volume_up_rounded, + color: const Color(0xFFE3F2FD), + iconColor: _kPrimary, + onTap: () => controller.toggleMute()), + const Spacer(), + GestureDetector( + onTap: () => controller.clearRoute(), + child: Container( + height: 44, + padding: const EdgeInsets.symmetric(horizontal: 32), + decoration: BoxDecoration( + color: Colors.red.shade600, + borderRadius: BorderRadius.circular(22), + ), + child: Center( + child: Text( + isArabic ? 'إنهاء' : 'End', + style: const TextStyle( + color: Colors.white, + fontSize: 15, + fontWeight: FontWeight.bold, + ), + ), + ), + ), + ), + ], + ), + ], + ), + ), + ), + ], + ), + ); + } +} + +class _CircleIconBtn extends StatelessWidget { + final IconData icon; + final Color color; + final Color iconColor; + final VoidCallback onTap; + const _CircleIconBtn( + {required this.icon, + required this.color, + required this.iconColor, + required this.onTap}); + + @override + Widget build(BuildContext context) { + return GestureDetector( + onTap: () { + HapticFeedback.lightImpact(); + onTap(); + }, + child: Container( + width: 44, + height: 44, + decoration: BoxDecoration(color: color, shape: BoxShape.circle), + child: Icon(icon, color: iconColor, size: 22), + ), + ); + } +} + +class _SearchResults extends StatelessWidget { + final NavigationController controller; + const _SearchResults({required this.controller}); + + @override + Widget build(BuildContext context) { + return Positioned( + top: MediaQuery.of(context).padding.top + 80, + left: 16, + right: 16, + child: Material( + color: _kCardColor, + borderRadius: BorderRadius.circular(16), + elevation: 4, + child: Container( + constraints: BoxConstraints( + maxHeight: MediaQuery.of(context).size.height * 0.4, + ), + child: ListView.separated( + shrinkWrap: true, + itemCount: controller.placesDestination.length, + separatorBuilder: (_, __) => + Divider(height: 1, color: _kOnSurface.withOpacity(0.1)), + itemBuilder: (context, index) { + final place = controller.placesDestination[index]; + return ListTile( + onTap: () => controller.selectDestination(place), + leading: Icon(Icons.location_on_rounded, color: _kPrimary), + title: Text( + place['name'] ?? 'Unknown', + style: TextStyle( + color: _kOnSurface, fontWeight: FontWeight.w600), + ), + subtitle: Text( + place['address'] ?? place['formatted_address'] ?? '', + maxLines: 1, + overflow: TextOverflow.ellipsis, + style: TextStyle( + color: _kOnSurface.withOpacity(0.5), fontSize: 12), + ), + ); + }, + ), + ), + ), + ); + } +} + +class _LoadingOverlay extends StatelessWidget { + const _LoadingOverlay(); + + @override + Widget build(BuildContext context) { + return Positioned.fill( + child: Container( + color: Colors.black38, + child: Center( + child: Container( + padding: const EdgeInsets.all(24), + decoration: BoxDecoration( + color: _kCardColor, + borderRadius: BorderRadius.circular(20), + ), + child: + const CircularProgressIndicator(color: AppColor.primaryColor), + ), + ), + ), + ); + } +} + +class _ExploreActionRow extends StatelessWidget { + final NavigationController controller; + const _ExploreActionRow({required this.controller}); + + @override + Widget build(BuildContext context) { + final bool hasRoutes = controller.routes.isNotEmpty; + final isAr = box.read(BoxName.lang) == 'ar'; + final double safeBottom = MediaQuery.of(context).padding.bottom; + + if (hasRoutes) return const SizedBox.shrink(); + + return Positioned( + bottom: safeBottom + 20, + left: 0, + right: 0, + child: SingleChildScrollView( + scrollDirection: Axis.horizontal, + padding: const EdgeInsets.symmetric(horizontal: 16), + physics: const BouncingScrollPhysics(), + child: Row( + children: [ + _ActionCapsule( + icon: Icons.add_rounded, + label: isAr ? 'إضافة' : 'Add', + onTap: () => controller.togglePlaceSelectionMode(), + isPrimary: true, + ), + _ActionCapsule( + icon: Icons.home_rounded, + label: isAr ? 'المنزل' : 'Home', + onTap: () => controller.goToFavorite('home'), + ), + _ActionCapsule( + icon: Icons.work_rounded, + label: isAr ? 'العمل' : 'Work', + onTap: () => controller.goToFavorite('work'), + ), + _ActionCapsule( + icon: Icons.bookmark_rounded, + label: isAr ? 'المحفوظات' : 'Saved', + onTap: () {}, + ), + ], + ), + ), + ); + } +} + +class _ActionCapsule extends StatelessWidget { + final IconData icon; + final String label; + final VoidCallback onTap; + final bool isPrimary; + + const _ActionCapsule({ + required this.icon, + required this.label, + required this.onTap, + this.isPrimary = false, + }); + + @override + Widget build(BuildContext context) { + Color bgColor; + Color textColor; + + if (isPrimary) { + bgColor = const Color(0xFF0D47A1).withOpacity(0.9); + textColor = Colors.white; + } else { + bgColor = _kCardColor.withOpacity(0.85); + textColor = _kOnSurface; + } + + return Padding( + padding: const EdgeInsets.only(right: 8), + child: GestureDetector( + onTap: () { + HapticFeedback.lightImpact(); + onTap(); + }, + child: ClipRRect( + borderRadius: BorderRadius.circular(50), + child: BackdropFilter( + filter: ImageFilter.blur(sigmaX: 12, sigmaY: 12), + child: Container( + padding: const EdgeInsets.symmetric(horizontal: 16, vertical: 12), + decoration: BoxDecoration( + color: bgColor, + borderRadius: BorderRadius.circular(50), + border: Border.all( + color: Colors.white.withOpacity(0.2), width: 1.2), + boxShadow: const [ + BoxShadow( + color: Color(0x14000000), + blurRadius: 8, + offset: Offset(0, 4)) + ], + ), + child: Row( + mainAxisSize: MainAxisSize.min, + children: [ + Icon(icon, size: 18, color: textColor), + const SizedBox(width: 8), + Text( + label, + style: TextStyle( + fontSize: 14, + fontWeight: FontWeight.w700, + color: textColor, + ), + ), + ], + ), + ), + ), + ), + ), + ); + } +} + +class _LocationPickerOverlay extends StatelessWidget { + final NavigationController controller; + const _LocationPickerOverlay({required this.controller}); + + @override + Widget build(BuildContext context) { + if (!controller.isSelectingPlaceLocation) return const SizedBox.shrink(); + + final isAr = box.read(BoxName.lang) == 'ar'; + + return Stack( + children: [ + IgnorePointer( + child: Container(color: Colors.black.withOpacity(0.1)), + ), + IgnorePointer( + child: Center( + child: Column( + mainAxisSize: MainAxisSize.min, + children: [ + Container( + padding: const EdgeInsets.all(8), + decoration: BoxDecoration( + color: Colors.white.withOpacity(0.9), + shape: BoxShape.circle, + boxShadow: [ + BoxShadow( + color: Colors.black.withOpacity(0.2), + blurRadius: 10, + offset: const Offset(0, 4)) + ], + ), + child: const Icon(Icons.add_location_alt_rounded, + color: Color(0xFF0D47A1), size: 40), + ), + const SizedBox(height: 40), + ], + ), + ), + ), + Positioned( + bottom: 110, + left: 32, + right: 32, + child: ElevatedButton( + style: ElevatedButton.styleFrom( + backgroundColor: const Color(0xFF1B5E20), + padding: const EdgeInsets.symmetric(vertical: 16), + shape: RoundedRectangleBorder( + borderRadius: BorderRadius.circular(16)), + elevation: 8, + shadowColor: const Color(0xFF1B5E20).withOpacity(0.5), + ), + onPressed: () => _showAddPlaceFormDialog(context, controller), + child: Row( + mainAxisAlignment: MainAxisAlignment.center, + children: [ + const Icon(Icons.check_circle_rounded, color: Colors.white), + const SizedBox(width: 12), + Text( + isAr ? 'تأكيد الموقع' : 'Confirm Location', + style: const TextStyle( + color: Colors.white, + fontSize: 18, + fontWeight: FontWeight.w800), + ), + ], + ), + ), + ), + Positioned( + top: 140, + left: 40, + right: 40, + child: IgnorePointer( + child: Container( + padding: const EdgeInsets.symmetric(horizontal: 16, vertical: 10), + decoration: BoxDecoration( + color: Colors.black.withOpacity(0.7), + borderRadius: BorderRadius.circular(30), + ), + child: Text( + isAr + ? "حرك الخريطة لتحديد موقع المكان" + : "Move map to pick place location", + textAlign: TextAlign.center, + style: const TextStyle(color: Colors.white, fontSize: 13), + ), + ), + ), + ), + Positioned( + top: 60, + right: 20, + child: FloatingActionButton.small( + backgroundColor: Colors.white, + elevation: 4, + child: const Icon(Icons.close_rounded, color: Colors.black87), + onPressed: () => controller.togglePlaceSelectionMode(), + ), + ), + ], + ); + } +} + +void _showAddPlaceFormDialog( + BuildContext context, NavigationController controller) { + final nameController = TextEditingController(); + final categoryNotifier = ValueNotifier?>(null); + final isAr = box.read(BoxName.lang) == 'ar'; + + Get.dialog( + AlertDialog( + shape: RoundedRectangleBorder(borderRadius: BorderRadius.circular(24)), + backgroundColor: _kCardColor, + title: Row( + children: [ + const Icon(Icons.add_business_rounded, + color: Color(0xFF0D47A1), size: 28), + const SizedBox(width: 12), + Text(isAr ? 'إضافة مكان جديد' : 'Add New Place', + style: + TextStyle(color: _kOnSurface, fontWeight: FontWeight.bold)), + ], + ), + content: SingleChildScrollView( + child: Column( + mainAxisSize: MainAxisSize.min, + crossAxisAlignment: CrossAxisAlignment.stretch, + children: [ + Text( + isAr + ? "ساهم في تحسين الخريطة بإضافة الأماكن الناقصة." + : "Help improve the map by adding missing places.", + style: + TextStyle(color: _kOnSurface.withOpacity(0.6), fontSize: 13), + ), + const SizedBox(height: 20), + TextField( + controller: nameController, + style: TextStyle(color: _kOnSurface), + decoration: InputDecoration( + labelText: isAr ? 'اسم المكان' : 'Place Name', + labelStyle: TextStyle(color: _kOnSurface.withOpacity(0.6)), + prefixIcon: Icon(Icons.label_rounded, + color: _kOnSurface.withOpacity(0.6)), + filled: true, + fillColor: _kSurface.withOpacity(0.3), + border: + OutlineInputBorder(borderRadius: BorderRadius.circular(12)), + ), + ), + const SizedBox(height: 16), + ValueListenableBuilder?>( + valueListenable: categoryNotifier, + builder: (context, selected, _) { + return InkWell( + onTap: () => _showCategoryPicker(context, (cat) { + categoryNotifier.value = cat; + }), + borderRadius: BorderRadius.circular(12), + child: Container( + padding: const EdgeInsets.symmetric( + horizontal: 12, vertical: 16), + decoration: BoxDecoration( + color: _kSurface.withOpacity(0.3), + borderRadius: BorderRadius.circular(12), + border: Border.all(color: Colors.grey.withOpacity(0.3)), + ), + child: Row( + children: [ + Icon(Icons.category_rounded, + color: _kOnSurface.withOpacity(0.6)), + const SizedBox(width: 12), + Expanded( + child: Text( + selected != null + ? (isAr ? selected['ar']! : selected['en']!) + : (isAr ? 'اختر الفئة' : 'Select Category'), + style: TextStyle( + color: selected != null + ? _kOnSurface + : _kOnSurface.withOpacity(0.4), + fontSize: 16, + ), + ), + ), + Icon(Icons.keyboard_arrow_down_rounded, + color: _kOnSurface.withOpacity(0.6)), + ], + ), + ), + ); + }), + const SizedBox(height: 24), + ElevatedButton( + style: ElevatedButton.styleFrom( + backgroundColor: const Color(0xFF0D47A1), + padding: const EdgeInsets.symmetric(vertical: 16), + shape: RoundedRectangleBorder( + borderRadius: BorderRadius.circular(12)), + ), + onPressed: () { + if (nameController.text.isNotEmpty && + categoryNotifier.value != null) { + Get.back(); + controller.submitNewPlace( + nameController.text, categoryNotifier.value!['id']!); + } else { + mySnackbarWarning( + isAr ? 'يرجى إكمال البيانات' : 'Please fill all fields'); + } + }, + child: Text(isAr ? 'إرسال' : 'Submit', + style: const TextStyle( + color: Colors.white, fontWeight: FontWeight.bold)), + ), + TextButton( + onPressed: () => Get.back(), + child: Text(isAr ? 'إلغاء' : 'Cancel', + style: TextStyle(color: _kOnSurface.withOpacity(0.6))), + ), + ], + ), + ), + ), + ); +} + +void _showCategoryPicker( + BuildContext context, Function(Map) onSelected) { + final isAr = box.read(BoxName.lang) == 'ar'; + + Get.bottomSheet( + Container( + decoration: BoxDecoration( + color: _kCardColor, + borderRadius: const BorderRadius.vertical(top: Radius.circular(24)), + ), + padding: const EdgeInsets.only(top: 12, bottom: 24), + child: Column( + mainAxisSize: MainAxisSize.min, + children: [ + Container( + width: 40, + height: 4, + decoration: BoxDecoration( + color: Colors.grey.withOpacity(0.3), + borderRadius: BorderRadius.circular(2), + ), + ), + const SizedBox(height: 16), + Text(isAr ? 'اختر الفئة' : 'Select Category', + style: TextStyle( + fontSize: 18, + fontWeight: FontWeight.bold, + color: _kOnSurface)), + const SizedBox(height: 16), + Flexible( + child: ListView.builder( + shrinkWrap: true, + itemCount: NavigationController.placeCategories.length, + itemBuilder: (context, index) { + final cat = NavigationController.placeCategories[index]; + return ListTile( + leading: Icon(_getIconData(cat['icon']!), + color: const Color(0xFF0D47A1)), + title: Text(isAr ? cat['ar']! : cat['en']!, + style: TextStyle( + color: _kOnSurface, fontWeight: FontWeight.w600)), + onTap: () { + HapticFeedback.lightImpact(); + onSelected(cat); + Get.back(); + }, + ); + }, + ), + ), + ], + ), + ), + isScrollControlled: true, + ); +} + +IconData _getIconData(String name) { + switch (name) { + case 'restaurant': + return Icons.restaurant_rounded; + case 'coffee': + return Icons.coffee_rounded; + case 'shopping_basket': + return Icons.shopping_basket_rounded; + case 'local_pharmacy': + return Icons.local_pharmacy_rounded; + case 'local_gas_station': + return Icons.local_gas_station_rounded; + case 'atm': + return Icons.atm_rounded; + case 'account_balance': + return Icons.account_balance_rounded; + case 'mosque': + return Icons.mosque_rounded; + case 'local_hospital': + return Icons.local_hospital_rounded; + case 'school': + return Icons.school_rounded; + case 'park': + return Icons.park_rounded; + case 'hotel': + return Icons.hotel_rounded; + case 'shopping_mall': + return Icons.store_rounded; + case 'fitness_center': + return Icons.fitness_center_rounded; + case 'content_cut': + return Icons.content_cut_rounded; + case 'bakery_dining': + return Icons.bakery_dining_rounded; + case 'local_laundry_service': + return Icons.local_laundry_service_rounded; + case 'build': + return Icons.build_rounded; + case 'gavel': + return Icons.gavel_rounded; + default: + return Icons.place_rounded; + } +} diff --git a/siro_rider/lib/views/home/profile/budgets_ads.dart b/siro_rider/lib/views/home/profile/budgets_ads.dart new file mode 100644 index 0000000..e08dea8 --- /dev/null +++ b/siro_rider/lib/views/home/profile/budgets_ads.dart @@ -0,0 +1,71 @@ +import 'package:flutter/material.dart'; +import 'package:get/get.dart'; +import 'package:siro_rider/constant/colors.dart'; +import 'package:siro_rider/constant/style.dart'; +import 'package:siro_rider/controller/payment/payment_controller.dart'; + +import '../../../constant/box_name.dart'; +import '../../../main.dart'; +import '../my_wallet/passenger_wallet.dart'; + +class PointsCaptain extends StatelessWidget { + PaymentController paymentController = Get.put(PaymentController()); + + PointsCaptain({ + super.key, + required this.kolor, + required this.countPoint, + required this.pricePoint, + }); + final Color kolor; + final String countPoint; + double pricePoint; + + @override + Widget build(BuildContext context) { + return InkWell( + onTap: () async { + Get.to(() => const PassengerWallet()); + paymentController.changePromoSheetDialogue(); + }, + child: Padding( + padding: const EdgeInsets.symmetric(horizontal: 3, vertical: 8), + child: Container( + width: Get.width * .21, + height: Get.width * .29, + margin: const EdgeInsets.all(4), + decoration: BoxDecoration( + gradient: LinearGradient( + colors: [ + kolor.withOpacity(0.3), + kolor, + kolor.withOpacity(0.7), + kolor, + ], + begin: Alignment.topLeft, + end: Alignment.bottomRight, + ), + border: Border.all(color: AppColor.accentColor), + borderRadius: BorderRadius.circular(12), + shape: BoxShape.rectangle, + ), + child: Center( + child: Column( + mainAxisAlignment: MainAxisAlignment.spaceAround, + children: [ + Text( + '$countPoint ${'LE'.tr}', + style: AppStyle.subtitle, + ), + Text( + '$pricePoint ${box.read(BoxName.countryCode) == 'Jordan' ? 'JOD'.tr : 'LE'.tr}', + style: AppStyle.title, + textAlign: TextAlign.center, + ), + ], + ), + )), + ), + ); + } +} diff --git a/siro_rider/lib/views/home/profile/complaint_page.dart b/siro_rider/lib/views/home/profile/complaint_page.dart new file mode 100644 index 0000000..9fe0c7a --- /dev/null +++ b/siro_rider/lib/views/home/profile/complaint_page.dart @@ -0,0 +1,229 @@ +import 'dart:io'; + +import 'package:flutter/material.dart'; +import 'package:get/get.dart'; +import 'package:siro_rider/constant/style.dart'; +import 'package:siro_rider/controller/home/profile/complaint_controller.dart'; +import 'package:siro_rider/views/widgets/my_scafold.dart'; // سنستخدم السكافولد الخاص بك +import 'package:siro_rider/views/widgets/mycircular.dart'; +import 'package:siro_rider/views/widgets/mydialoug.dart'; +import 'package:siro_rider/views/widgets/elevated_btn.dart'; // سنستخدم الزر الخاص بك + +import '../../../constant/colors.dart'; +import '../../../controller/functions/audio_record1.dart'; + +// --- الويدجت الرئيسية بالتصميم الجديد --- +class ComplaintPage extends StatelessWidget { + ComplaintPage({super.key}); + + final ComplaintController complaintController = + Get.put(ComplaintController()); + final AudioRecorderController audioRecorderController = + Get.put(AudioRecorderController()); + + @override + Widget build(BuildContext context) { + return MyScafolld( + title: 'Submit a Complaint'.tr, + isleading: true, + body: [ + GetBuilder( + builder: (controller) { + if (controller.isLoading && controller.feedBack.isEmpty) { + // عرض التحميل المبدئي فقط + return const MyCircularProgressIndicator(); + } + return Stack( + children: [ + Form( + key: controller.formKey, + child: ListView( + padding: const EdgeInsets.all(16.0), + children: [ + // --- 1. بطاقة إدخال نص الشكوى --- + _buildSectionCard( + title: '1. Describe Your Issue'.tr, + child: TextFormField( + controller: controller.complaintController, + decoration: InputDecoration( + hintText: 'Enter your complaint here...'.tr, + filled: true, + fillColor: AppColor.secondaryColor.withOpacity(0.5), + border: OutlineInputBorder( + borderRadius: BorderRadius.circular(12), + borderSide: BorderSide.none, + ), + contentPadding: const EdgeInsets.all(16), + ), + maxLines: 6, + style: AppStyle.subtitle, + validator: (value) { + if (value == null || value.isEmpty) { + return 'Please enter a description of the issue.' + .tr; + } + return null; + }, + ), + ), + + // --- 2. بطاقة إرفاق التسجيل الصوتي --- + _buildSectionCard( + title: '2. Attach Recorded Audio (Optional)'.tr, + child: FutureBuilder>( + future: audioRecorderController.getRecordedFiles(), + builder: (context, snapshot) { + if (snapshot.connectionState == + ConnectionState.waiting) { + return const Center( + child: CircularProgressIndicator()); + } + if (snapshot.hasError || + !snapshot.hasData || + snapshot.data!.isEmpty) { + return Center( + child: Text('No audio files found.'.tr, + style: AppStyle.subtitle)); + } + return Column( + children: snapshot.data!.map((audioFilePath) { + final audioFile = File(audioFilePath); + final isUploaded = + controller.audioLink.isNotEmpty && + controller.audioLink.contains( + audioFilePath.split('/').last); + + return ListTile( + leading: Icon( + isUploaded + ? Icons.check_circle + : Icons.mic, + color: isUploaded + ? AppColor.greenColor + : AppColor.redColor), + title: Text(audioFilePath.split('/').last, + style: AppStyle.subtitle, + overflow: TextOverflow.ellipsis), + subtitle: isUploaded + ? Text('Uploaded'.tr, + style: const TextStyle( + color: AppColor.greenColor)) + : null, + onTap: isUploaded + ? null + : () { + MyDialogContent().getDialog( + 'Confirm Attachment'.tr, + Text( + 'Attach this audio file?'.tr), + () async { + await controller + .uploadAudioFile(audioFile); + }); + }, + ); + }).toList(), + ); + }, + ), + ), + + // --- 3. بطاقة تفاصيل الرحلة والرد --- + _buildSectionCard( + title: '3. Review Details & Response'.tr, + child: Column( + children: [ + if (controller.feedBack.isNotEmpty) ...[ + _buildDetailRow(Icons.calendar_today_outlined, + 'Date'.tr, controller.feedBack[0]['date']), + _buildDetailRow( + Icons.monetization_on_outlined, + 'Price'.tr, + '${controller.feedBack[0]['price']}'), + ], + const Divider(height: 24), + ListTile( + leading: const Icon(Icons.support_agent_outlined, + color: AppColor.primaryColor), + title: Text("Intaleq's Response".tr, + style: AppStyle.title), + subtitle: Text( + // --- تعديل هنا لعرض الرد من الخادم --- + controller.passengerReport?['body'] + ?.toString() ?? + 'Awaiting response...'.tr, + style: AppStyle.subtitle.copyWith(height: 1.5), + ), + ), + ], + ), + ), + + // --- 4. زر الإرسال --- + const SizedBox(height: 24), + MyElevatedButton( + kolor: AppColor.blueColor, + title: 'Submit Complaint'.tr, + onPressed: () async { + // --- تعديل: استدعاء الدالة الجديدة فقط --- + await controller.submitComplaintToServer(); + }, + ), + const SizedBox(height: 24), // مسافة إضافية بالأسفل + ], + ), + ), + // --- عرض مؤشر التحميل فوق كل شيء --- + if (controller.isLoading) + Container( + color: Colors.black.withOpacity(0.5), + child: const MyCircularProgressIndicator(), + ), + ], + ); + }, + ), + ], + ); + } + + // --- ويدجت مساعدة لبناء البطاقات --- + Widget _buildSectionCard({required String title, required Widget child}) { + return Card( + margin: const EdgeInsets.only(bottom: 20), + elevation: 4, + shadowColor: Colors.black.withOpacity(0.1), + shape: RoundedRectangleBorder(borderRadius: BorderRadius.circular(16)), + child: Padding( + padding: const EdgeInsets.all(16.0), + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Text(title, style: AppStyle.headTitle.copyWith(fontSize: 18)), + const SizedBox(height: 12), + child, + ], + ), + ), + ); + } + + // --- ويدجت مساعدة لعرض صفوف التفاصيل --- + Widget _buildDetailRow(IconData icon, String label, String value) { + return Padding( + padding: const EdgeInsets.symmetric(vertical: 4.0), + child: Row( + children: [ + Icon(icon, color: AppColor.writeColor.withOpacity(0.6), size: 20), + const SizedBox(width: 12), + Text('${label.tr}:', + style: AppStyle.subtitle + .copyWith(color: AppColor.writeColor.withOpacity(0.7))), + const Spacer(), + Text(value, + style: AppStyle.title.copyWith(fontWeight: FontWeight.bold)), + ], + ), + ); + } +} diff --git a/siro_rider/lib/views/home/profile/order_history.dart b/siro_rider/lib/views/home/profile/order_history.dart new file mode 100644 index 0000000..a67ff24 --- /dev/null +++ b/siro_rider/lib/views/home/profile/order_history.dart @@ -0,0 +1,599 @@ +import 'dart:math' as math; +import 'dart:typed_data'; + +import 'package:siro_rider/env/env.dart'; +import 'package:flutter/material.dart'; +import 'package:flutter/services.dart'; +import 'package:get/get.dart'; +import 'package:intaleq_maps/intaleq_maps.dart'; + +import '../../../constant/colors.dart'; +import '../../../constant/style.dart'; +import '../../../controller/functions/launch.dart'; +import '../../../controller/home/profile/order_history_controller.dart'; +import '../../widgets/my_scafold.dart'; +import '../../widgets/mycircular.dart'; + +// ───────────────────────────────────────────────────────────────────────────── +// Main Screen +// ───────────────────────────────────────────────────────────────────────────── +class OrderHistory extends StatelessWidget { + const OrderHistory({super.key}); + + @override + Widget build(BuildContext context) { + Get.put(OrderHistoryController()); + + return MyScafolld( + title: 'Order History'.tr, + isleading: true, + body: [ + GetBuilder( + builder: (controller) { + if (controller.isloading) { + return const MyCircularProgressIndicator(); + } + if (controller.orderHistoryListPassenger.isEmpty) { + return Center( + child: Column( + mainAxisAlignment: MainAxisAlignment.center, + children: [ + Icon(Icons.route_outlined, + size: 80, color: AppColor.writeColor.withOpacity(0.3)), + const SizedBox(height: 16), + Text('No trip history found'.tr, + style: AppStyle.headTitle2), + const SizedBox(height: 6), + Text('Your past trips will appear here.'.tr, + style: AppStyle.subtitle), + ], + ), + ); + } + return ListView.separated( + padding: const EdgeInsets.symmetric(horizontal: 16, vertical: 20), + itemCount: controller.orderHistoryListPassenger.length, + separatorBuilder: (_, __) => const SizedBox(height: 14), + itemBuilder: (context, index) { + final ride = controller.orderHistoryListPassenger[index]; + return _HistoryCard( + key: ValueKey(ride['id'] ?? index), + ride: ride, + ); + }, + ); + }, + ), + ], + ); + } +} + +// ───────────────────────────────────────────────────────────────────────────── +// Coordinate helpers +// ───────────────────────────────────────────────────────────────────────────── +LatLng _parseLatLng(String raw, LatLng fallback) { + try { + final parts = raw.split(','); + return LatLng(double.parse(parts[0]), double.parse(parts[1])); + } catch (_) { + return fallback; + } +} + +const LatLng _kDamascus = LatLng(33.5, 36.3); + +// ───────────────────────────────────────────────────────────────────────────── +// Lightweight card — NO native map in the list +// ───────────────────────────────────────────────────────────────────────────── +class _HistoryCard extends StatelessWidget { + final Map ride; + const _HistoryCard({Key? key, required this.ride}) : super(key: key); + + @override + Widget build(BuildContext context) { + final start = _parseLatLng(ride['start_location'] ?? '', _kDamascus); + final end = _parseLatLng(ride['end_location'] ?? '', _kDamascus); + final status = ride['status'] ?? ''; + + return Material( + color: Colors.transparent, + child: InkWell( + onTap: () => _openDetail(context, ride, start, end), + borderRadius: BorderRadius.circular(18), + child: Ink( + decoration: BoxDecoration( + color: AppColor.secondaryColor, + borderRadius: BorderRadius.circular(18), + boxShadow: [ + BoxShadow( + color: Colors.black.withOpacity(0.12), + blurRadius: 10, + offset: const Offset(0, 4), + ), + ], + ), + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + // ── Lightweight route preview (pure Flutter, zero native cost) ── + ClipRRect( + borderRadius: const BorderRadius.only( + topLeft: Radius.circular(18), + topRight: Radius.circular(18), + ), + child: SizedBox( + height: 130, + width: double.infinity, + child: CustomPaint( + painter: _RoutePainter(start: start, end: end), + child: Align( + alignment: Alignment.bottomRight, + child: Padding( + padding: const EdgeInsets.all(8), + child: Container( + padding: const EdgeInsets.symmetric( + horizontal: 8, vertical: 4), + decoration: BoxDecoration( + color: Colors.black.withOpacity(0.45), + borderRadius: BorderRadius.circular(10), + ), + child: Row( + mainAxisSize: MainAxisSize.min, + children: [ + const Icon(Icons.map_outlined, + color: Colors.white, size: 13), + const SizedBox(width: 4), + Text('View Map'.tr, + style: const TextStyle( + color: Colors.white, + fontSize: 11, + fontWeight: FontWeight.w600)), + ], + ), + ), + ), + ), + ), + ), + ), + + // ── Details ────────────────────────────────────────────────── + Padding( + padding: const EdgeInsets.fromLTRB(14, 10, 14, 14), + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + Row( + children: [ + Icon(Icons.access_time_rounded, + size: 14, + color: AppColor.writeColor.withOpacity(0.5)), + const SizedBox(width: 4), + Text( + '${ride['date']} · ${ride['time']}', + style: AppStyle.subtitle.copyWith( + fontSize: 12, + color: AppColor.writeColor.withOpacity(0.6)), + ), + ], + ), + _StatusChip(status: status), + ], + ), + const Divider(height: 16), + Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + Text('Total Price'.tr, + style: AppStyle.title.copyWith(fontSize: 15)), + Text( + '${ride['price']} ${'SYP'.tr}', + style: AppStyle.headTitle.copyWith( + fontSize: 20, color: AppColor.primaryColor), + ), + ], + ), + ], + ), + ), + ], + ), + ), + ), + ); + } + + void _openDetail(BuildContext context, Map ride, + LatLng start, LatLng end) { + showModalBottomSheet( + context: context, + isScrollControlled: true, + backgroundColor: Colors.transparent, + builder: (_) => _RideDetailSheet(ride: ride, start: start, end: end), + ); + } +} + +// ───────────────────────────────────────────────────────────────────────────── +// Pure-Flutter route painter — grid background + animated dashed line +// ───────────────────────────────────────────────────────────────────────────── +class _RoutePainter extends CustomPainter { + final LatLng start; + final LatLng end; + + const _RoutePainter({required this.start, required this.end}); + + @override + void paint(Canvas canvas, Size size) { + // Background gradient + final bgPaint = Paint() + ..shader = LinearGradient( + colors: [ + AppColor.primaryColor.withOpacity(0.08), + AppColor.primaryColor.withOpacity(0.18), + ], + begin: Alignment.topLeft, + end: Alignment.bottomRight, + ).createShader(Rect.fromLTWH(0, 0, size.width, size.height)); + canvas.drawRect(Rect.fromLTWH(0, 0, size.width, size.height), bgPaint); + + // Subtle grid + final gridPaint = Paint() + ..color = AppColor.primaryColor.withOpacity(0.06) + ..strokeWidth = 1; + const step = 20.0; + for (double x = 0; x < size.width; x += step) { + canvas.drawLine(Offset(x, 0), Offset(x, size.height), gridPaint); + } + for (double y = 0; y < size.height; y += step) { + canvas.drawLine(Offset(0, y), Offset(size.width, y), gridPaint); + } + + // Map lat/lng to canvas — simple linear projection + final minLat = math.min(start.latitude, end.latitude); + final maxLat = math.max(start.latitude, end.latitude); + final minLng = math.min(start.longitude, end.longitude); + final maxLng = math.max(start.longitude, end.longitude); + + final latRange = maxLat - minLat; + final lngRange = maxLng - minLng; + + final pad = 32.0; + + Offset project(LatLng p) { + double x, y; + if (lngRange < 0.0005) { + x = size.width / 2; + } else { + x = pad + ((p.longitude - minLng) / lngRange) * (size.width - 2 * pad); + } + if (latRange < 0.0005) { + y = size.height / 2; + } else { + // Invert y (latitude grows up, canvas grows down) + y = size.height - + pad - + ((p.latitude - minLat) / latRange) * (size.height - 2 * pad); + } + return Offset(x, y); + } + + final startPt = project(start); + final endPt = project(end); + + // Dashed route line + final linePaint = Paint() + ..color = AppColor.primaryColor + ..strokeWidth = 2.5 + ..strokeCap = StrokeCap.round + ..style = PaintingStyle.stroke; + + _drawDashedLine(canvas, startPt, endPt, linePaint, 8, 5); + + // Glow behind markers + final glowPaint = Paint() + ..color = AppColor.primaryColor.withOpacity(0.2) + ..maskFilter = const MaskFilter.blur(BlurStyle.normal, 8); + canvas.drawCircle(startPt, 14, glowPaint); + canvas.drawCircle(endPt, 14, glowPaint); + + // Start dot (A) + _drawMarker(canvas, startPt, AppColor.primaryColor, 'A'); + + // End dot (B) + _drawMarker(canvas, endPt, AppColor.redColor, 'B'); + } + + void _drawDashedLine(Canvas canvas, Offset p1, Offset p2, Paint paint, + double dashLen, double gapLen) { + final dx = p2.dx - p1.dx; + final dy = p2.dy - p1.dy; + final dist = math.sqrt(dx * dx + dy * dy); + if (dist == 0) return; + final ux = dx / dist; + final uy = dy / dist; + double traveled = 0; + bool drawing = true; + while (traveled < dist) { + final segLen = drawing ? dashLen : gapLen; + final next = math.min(traveled + segLen, dist); + if (drawing) { + canvas.drawLine( + Offset(p1.dx + ux * traveled, p1.dy + uy * traveled), + Offset(p1.dx + ux * next, p1.dy + uy * next), + paint, + ); + } + traveled = next; + drawing = !drawing; + } + } + + void _drawMarker(Canvas canvas, Offset center, Color color, String label) { + // Outer ring + canvas.drawCircle(center, 12, Paint()..color = color.withOpacity(0.25)); + // Solid circle + canvas.drawCircle(center, 8, Paint()..color = color); + // White inner + canvas.drawCircle(center, 4, Paint()..color = Colors.white); + // Label text + final tp = TextPainter( + text: TextSpan( + text: label, + style: TextStyle( + color: color, fontSize: 7, fontWeight: FontWeight.w900)), + textDirection: TextDirection.ltr, + )..layout(); + tp.paint(canvas, center - Offset(tp.width / 2, tp.height / 2)); + } + + @override + bool shouldRepaint(_RoutePainter old) => old.start != start || old.end != end; +} + +// ───────────────────────────────────────────────────────────────────────────── +// Status chip +// ───────────────────────────────────────────────────────────────────────────── +class _StatusChip extends StatelessWidget { + final String status; + const _StatusChip({required this.status}); + + @override + Widget build(BuildContext context) { + Color color; + IconData icon; + + if (status == 'Canceled'.tr) { + color = AppColor.redColor; + icon = Icons.cancel_outlined; + } else if (status == 'Finished'.tr) { + color = AppColor.greenColor; + icon = Icons.check_circle_outline; + } else { + color = AppColor.yellowColor; + icon = Icons.hourglass_empty_rounded; + } + + return Container( + padding: const EdgeInsets.symmetric(horizontal: 8, vertical: 4), + decoration: BoxDecoration( + color: color.withOpacity(0.12), + borderRadius: BorderRadius.circular(20), + border: Border.all(color: color.withOpacity(0.3), width: 1), + ), + child: Row( + mainAxisSize: MainAxisSize.min, + children: [ + Icon(icon, color: color, size: 13), + const SizedBox(width: 4), + Text(status, + style: AppStyle.subtitle.copyWith( + color: color, fontWeight: FontWeight.bold, fontSize: 11)), + ], + ), + ); + } +} + +// ───────────────────────────────────────────────────────────────────────────── +// Detail bottom sheet — ONE MapLibre instance, only when user requests it +// ───────────────────────────────────────────────────────────────────────────── +class _RideDetailSheet extends StatefulWidget { + final Map ride; + final LatLng start; + final LatLng end; + const _RideDetailSheet( + {required this.ride, required this.start, required this.end}); + + @override + State<_RideDetailSheet> createState() => _RideDetailSheetState(); +} + +class _RideDetailSheetState extends State<_RideDetailSheet> { + IntaleqMapController? _mc; + Set _markers = {}; + Set _polylines = {}; + + LatLngBounds? get _bounds { + final latDiff = (widget.start.latitude - widget.end.latitude).abs(); + final lngDiff = (widget.start.longitude - widget.end.longitude).abs(); + if (latDiff < 0.0005 && lngDiff < 0.0005) return null; + return LatLngBounds( + northeast: LatLng( + math.max(widget.start.latitude, widget.end.latitude), + math.max(widget.start.longitude, widget.end.longitude), + ), + southwest: LatLng( + math.min(widget.start.latitude, widget.end.latitude), + math.min(widget.start.longitude, widget.end.longitude), + ), + ); + } + + void _onMapCreated(IntaleqMapController c) => _mc = c; + + Future _onStyleLoaded() async { + WidgetsBinding.instance.addPostFrameCallback((_) async { + await Future.delayed(const Duration(milliseconds: 400)); + if (!mounted || _mc == null) return; + await _draw(); + }); + } + + Future _draw() async { + if (!mounted) return; + + setState(() { + _polylines = { + Polyline( + polylineId: const PolylineId('route'), + points: [widget.start, widget.end], + color: AppColor.primaryColor, + width: 4, + ), + }; + + _markers = { + Marker( + markerId: const MarkerId('start'), + position: widget.start, + icon: InlqBitmap.fromAsset('assets/images/A.png'), + anchor: const Offset(0.5, 1.0), + ), + Marker( + markerId: const MarkerId('end'), + position: widget.end, + icon: InlqBitmap.fromAsset('assets/images/b.png'), + anchor: const Offset(0.5, 1.0), + ), + }; + }); + + final b = _bounds; + if (b != null) { + await _mc?.animateCamera(CameraUpdate.newLatLngBounds(b, + left: 60, top: 60, right: 60, bottom: 60)); + } else { + await _mc?.animateCamera(CameraUpdate.newLatLngZoom(widget.start, 14)); + } + } + + @override + void dispose() { + super.dispose(); + } + + @override + Widget build(BuildContext context) { + final ride = widget.ride; + final center = LatLng( + (widget.start.latitude + widget.end.latitude) / 2, + (widget.start.longitude + widget.end.longitude) / 2, + ); + + return DraggableScrollableSheet( + initialChildSize: 0.88, + minChildSize: 0.5, + maxChildSize: 0.95, + builder: (_, scrollController) => Container( + decoration: BoxDecoration( + color: AppColor.secondaryColor, + borderRadius: const BorderRadius.vertical(top: Radius.circular(24)), + ), + child: Column( + children: [ + // Handle + Container( + margin: const EdgeInsets.symmetric(vertical: 10), + width: 40, + height: 4, + decoration: BoxDecoration( + color: AppColor.writeColor.withOpacity(0.2), + borderRadius: BorderRadius.circular(2), + ), + ), + + // Map — only ONE instance, created on demand + Expanded( + child: ClipRRect( + borderRadius: const BorderRadius.only( + topLeft: Radius.circular(16), + topRight: Radius.circular(16), + ), + child: IntaleqMap( + apiKey: Env.mapSaasKey, + styleUrl: Get.isDarkMode + ? 'assets/style_dark.json' + : 'assets/style.json', + initialCameraPosition: + CameraPosition(target: center, zoom: 12), + onMapCreated: (c) { + _mc = c; + _onStyleLoaded(); + }, + myLocationEnabled: false, + markers: _markers, + polylines: _polylines, + ), + ), + ), + + // Trip info strip + Container( + padding: const EdgeInsets.fromLTRB(20, 14, 20, 20), + child: Column( + children: [ + Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Text('${ride['date']} · ${ride['time']}', + style: AppStyle.subtitle.copyWith( + fontSize: 12, + color: + AppColor.writeColor.withOpacity(0.55))), + const SizedBox(height: 2), + Text('${ride['price']} ${'SYP'.tr}', + style: AppStyle.headTitle.copyWith( + fontSize: 22, color: AppColor.primaryColor)), + ], + ), + _StatusChip(status: ride['status'] ?? ''), + ], + ), + const SizedBox(height: 14), + // Open in Google Maps + SizedBox( + width: double.infinity, + child: ElevatedButton.icon( + onPressed: () { + final url = + 'https://www.google.com/maps/dir/${ride['start_location']}/${ride['end_location']}/'; + showInBrowser(url); + }, + icon: const Icon(Icons.open_in_new, size: 16), + label: Text('Open in Google Maps'.tr), + style: ElevatedButton.styleFrom( + backgroundColor: AppColor.primaryColor, + foregroundColor: Colors.white, + padding: const EdgeInsets.symmetric(vertical: 13), + shape: RoundedRectangleBorder( + borderRadius: BorderRadius.circular(12)), + ), + ), + ), + ], + ), + ), + ], + ), + ), + ); + } +} diff --git a/siro_rider/lib/views/home/profile/passenger_profile_page.dart b/siro_rider/lib/views/home/profile/passenger_profile_page.dart new file mode 100644 index 0000000..466c598 --- /dev/null +++ b/siro_rider/lib/views/home/profile/passenger_profile_page.dart @@ -0,0 +1,1065 @@ +import 'dart:io'; +import 'package:cached_network_image/cached_network_image.dart'; +import 'package:flutter/material.dart'; +import 'package:get/get.dart'; +import 'package:image_cropper/image_cropper.dart'; +import 'package:image_picker/image_picker.dart'; +import 'package:http/http.dart' as http; +import 'package:siro_rider/constant/api_key.dart'; +import 'package:siro_rider/constant/box_name.dart'; +import 'package:siro_rider/constant/colors.dart'; +import 'package:siro_rider/controller/profile/profile_controller.dart'; +import 'package:siro_rider/main.dart'; +import 'package:siro_rider/views/widgets/mycircular.dart'; + +import '../../../constant/style.dart'; +import '../../../controller/functions/log_out.dart'; + +// ───────────────────────────────────────────────────────────────────────────── +// Main Page +// ───────────────────────────────────────────────────────────────────────────── +class PassengerProfilePage extends StatefulWidget { + const PassengerProfilePage({super.key}); + + @override + State createState() => _PassengerProfilePageState(); +} + +class _PassengerProfilePageState extends State { + late final LogOutController logOutController; + File? _pickedImage; + bool _isUploadingImage = false; + + @override + void initState() { + super.initState(); + logOutController = Get.put(LogOutController()); + Get.put(ProfileController()); + } + + // ─── Image Handling ───────────────────────────────────────────────────────── + + Future _pickAndUploadImage() async { + // 1. Pick source + final ImageSource? source = await _showImageSourceSheet(); + if (source == null) return; + + // 2. Pick image + final XFile? picked = + await ImagePicker().pickImage(source: source, imageQuality: 85); + if (picked == null) return; + + // 3. Crop + final CroppedFile? cropped = await ImageCropper().cropImage( + sourcePath: picked.path, + aspectRatio: const CropAspectRatio(ratioX: 1, ratioY: 1), + uiSettings: [ + AndroidUiSettings( + toolbarTitle: 'Crop Photo'.tr, + toolbarColor: AppColor.primaryColor, + toolbarWidgetColor: Colors.white, + initAspectRatio: CropAspectRatioPreset.square, + lockAspectRatio: true, + hideBottomControls: false, + ), + IOSUiSettings( + title: 'Crop Photo'.tr, + aspectRatioLockEnabled: true, + resetAspectRatioEnabled: false, + ), + ], + ); + if (cropped == null) return; + + // 4. Upload + setState(() { + _pickedImage = File(cropped.path); + _isUploadingImage = true; + }); + + try { + final passengerId = box.read(BoxName.passengerID).toString(); + final uri = Uri.parse('${AK.serverPHP}/upload_passenger_image.php'); + final request = http.MultipartRequest('POST', uri) + ..fields['passenger_id'] = passengerId + ..files.add(await http.MultipartFile.fromPath('image', cropped.path)); + + final response = await request.send(); + if (response.statusCode == 200) { + Get.snackbar( + 'Success'.tr, + 'Profile photo updated'.tr, + backgroundColor: Colors.green.withOpacity(0.9), + colorText: Colors.white, + snackPosition: SnackPosition.BOTTOM, + margin: const EdgeInsets.all(16), + borderRadius: 12, + ); + } else { + _showUploadError(); + } + } catch (_) { + _showUploadError(); + } finally { + setState(() => _isUploadingImage = false); + } + } + + void _showUploadError() { + Get.snackbar( + 'Error'.tr, + 'Failed to upload photo'.tr, + backgroundColor: Colors.red.withOpacity(0.9), + colorText: Colors.white, + snackPosition: SnackPosition.BOTTOM, + margin: const EdgeInsets.all(16), + borderRadius: 12, + ); + } + + Future _showImageSourceSheet() async { + return await showModalBottomSheet( + context: context, + shape: const RoundedRectangleBorder( + borderRadius: BorderRadius.vertical(top: Radius.circular(20)), + ), + builder: (_) => SafeArea( + child: Column( + mainAxisSize: MainAxisSize.min, + children: [ + Container( + margin: const EdgeInsets.only(top: 10, bottom: 6), + width: 40, + height: 4, + decoration: BoxDecoration( + color: AppColor.grayColor.withOpacity(0.3), + borderRadius: BorderRadius.circular(2)), + ), + const SizedBox(height: 8), + Text('Change Photo'.tr, + style: + const TextStyle(fontSize: 16, fontWeight: FontWeight.bold)), + const SizedBox(height: 12), + ListTile( + leading: Container( + padding: const EdgeInsets.all(8), + decoration: BoxDecoration( + color: AppColor.primaryColor.withOpacity(0.1), + borderRadius: BorderRadius.circular(10), + ), + child: const Icon(Icons.camera_alt_outlined, + color: AppColor.primaryColor), + ), + title: Text('Take a Photo'.tr, + style: const TextStyle(fontWeight: FontWeight.w500)), + onTap: () => Navigator.pop(context, ImageSource.camera), + ), + ListTile( + leading: Container( + padding: const EdgeInsets.all(8), + decoration: BoxDecoration( + color: Colors.blue.withOpacity(0.1), + borderRadius: BorderRadius.circular(10), + ), + child: const Icon(Icons.photo_library_outlined, + color: Colors.blue), + ), + title: Text('Choose from Gallery'.tr, + style: const TextStyle(fontWeight: FontWeight.w500)), + onTap: () => Navigator.pop(context, ImageSource.gallery), + ), + const SizedBox(height: 12), + ], + ), + ), + ); + } + + // ─── Build ────────────────────────────────────────────────────────────────── + + @override + Widget build(BuildContext context) { + return Scaffold( + backgroundColor: AppColor.secondaryColor.withOpacity(0.96), + appBar: AppBar( + title: Text('My Profile'.tr, + style: AppStyle.headTitle2.copyWith(fontSize: 20)), + backgroundColor: AppColor.secondaryColor, + elevation: 0, + centerTitle: true, + iconTheme: IconThemeData(color: AppColor.writeColor), + ), + body: GetBuilder( + builder: (controller) { + if (controller.isloading) { + return const MyCircularProgressIndicator(); + } + return ListView( + padding: const EdgeInsets.symmetric(horizontal: 20, vertical: 12), + physics: const BouncingScrollPhysics(), + children: [ + _buildProfileHeader(controller), + const SizedBox(height: 32), + _buildSectionCard( + title: 'Personal Information'.tr, + sectionIcon: Icons.person_outline_rounded, + children: [ + _buildTile( + icon: Icons.badge_outlined, + color: Colors.blueAccent, + title: 'Name'.tr, + subtitle: + '${controller.prfoileData['first_name'] ?? ''} ${controller.prfoileData['last_name'] ?? ''}' + .trim(), + onTap: () => _showNameSheet(controller), + ), + _divider(), + _buildTile( + icon: Icons.wc_outlined, + color: Colors.pinkAccent, + title: 'Gender'.tr, + subtitle: controller.prfoileData['gender']?.toString() ?? + 'Not set'.tr, + onTap: () => _showGenderSheet(controller), + ), + _divider(), + _buildTile( + icon: Icons.school_outlined, + color: Colors.orangeAccent, + title: 'Education'.tr, + subtitle: controller.prfoileData['education']?.toString() ?? + 'Not set'.tr, + onTap: () => _showEducationSheet(controller), + ), + ], + ), + const SizedBox(height: 20), + _buildSectionCard( + title: 'Work & Contact'.tr, + sectionIcon: Icons.work_outline_rounded, + children: [ + _buildTile( + icon: Icons.work_outline, + color: Colors.green, + title: 'Employment Type'.tr, + subtitle: + controller.prfoileData['employmentType']?.toString() ?? + 'Not set'.tr, + onTap: () => _showFieldSheet( + controller: controller, + fieldKey: 'employmentType', + title: 'Employment Type'.tr, + icon: Icons.work_outline, + iconColor: Colors.green, + keyboardType: TextInputType.text, + ), + ), + _divider(), + _buildTile( + icon: Icons.favorite_border, + color: Colors.purpleAccent, + title: 'Marital Status'.tr, + subtitle: + controller.prfoileData['maritalStatus']?.toString() ?? + 'Not set'.tr, + onTap: () => _showFieldSheet( + controller: controller, + fieldKey: 'maritalStatus', + title: 'Marital Status'.tr, + icon: Icons.favorite_border, + iconColor: Colors.purpleAccent, + keyboardType: TextInputType.text, + ), + ), + _divider(), + _buildTile( + icon: Icons.sos_outlined, + color: Colors.redAccent, + title: 'SOS Phone'.tr, + subtitle: controller.prfoileData['sosPhone']?.toString() ?? + 'Not set'.tr, + onTap: () => _showFieldSheet( + controller: controller, + fieldKey: 'sosPhone', + title: 'SOS Phone'.tr, + icon: Icons.sos_outlined, + iconColor: Colors.redAccent, + keyboardType: TextInputType.phone, + onSaved: () { + box.write(BoxName.sosPhonePassenger, + controller.prfoileData['sosPhone']); + }, + ), + ), + ], + ), + const SizedBox(height: 20), + _buildSectionCard( + title: 'Account'.tr, + sectionIcon: Icons.manage_accounts_outlined, + children: [ + _buildTile( + icon: Icons.logout_rounded, + color: Colors.blueGrey, + title: 'Sign Out'.tr, + subtitle: '', + onTap: () => logOutController.logOutPassenger(), + trailing: const SizedBox.shrink(), + ), + _divider(), + _buildTile( + icon: Icons.delete_forever_outlined, + color: Colors.redAccent, + title: 'Delete My Account'.tr, + subtitle: '', + onTap: () => _showDeleteSheet(), + trailing: const SizedBox.shrink(), + ), + ], + ), + const SizedBox(height: 32), + ], + ); + }, + ), + ); + } + + // ─── Profile Header ───────────────────────────────────────────────────────── + + Widget _buildProfileHeader(ProfileController controller) { + final firstName = controller.prfoileData['first_name']?.toString() ?? ''; + final lastName = controller.prfoileData['last_name']?.toString() ?? ''; + final fullName = '$firstName $lastName'.trim(); + final passengerId = box.read(BoxName.passengerID)?.toString() ?? ''; + + String email = box.read(BoxName.email) ?? ''; + if (email.contains('intaleqapp.com')) email = ''; + + final initials = fullName.isNotEmpty + ? fullName + .split(' ') + .where((e) => e.isNotEmpty) + .map((e) => e[0].toUpperCase()) + .take(2) + .join() + : '?'; + + final avatarUrl = + '${AK.serverPHP}/portrate_passenger_image/$passengerId.jpg'; + + return Center( + child: Column( + children: [ + // ── Avatar with camera button ────────────────────────────── + Stack( + alignment: Alignment.bottomRight, + children: [ + // Outer glow ring + Container( + padding: const EdgeInsets.all(3), + decoration: BoxDecoration( + shape: BoxShape.circle, + gradient: LinearGradient( + colors: [ + AppColor.primaryColor.withOpacity(0.6), + AppColor.primaryColor.withOpacity(0.1), + ], + begin: Alignment.topLeft, + end: Alignment.bottomRight, + ), + ), + child: CircleAvatar( + radius: 52, + backgroundColor: AppColor.secondaryColor, + child: ClipOval( + child: _isUploadingImage + ? const SizedBox( + width: 104, + height: 104, + child: Center( + child: CircularProgressIndicator( + color: AppColor.primaryColor, + strokeWidth: 2, + ), + ), + ) + : _pickedImage != null + ? Image.file( + _pickedImage!, + width: 104, + height: 104, + fit: BoxFit.cover, + ) + : CachedNetworkImage( + imageUrl: avatarUrl, + width: 104, + height: 104, + fit: BoxFit.cover, + placeholder: (_, __) => Container( + width: 104, + height: 104, + color: + AppColor.primaryColor.withOpacity(0.08), + child: Center( + child: Text( + initials, + style: const TextStyle( + fontSize: 34, + fontWeight: FontWeight.bold, + color: AppColor.primaryColor, + ), + ), + ), + ), + errorWidget: (_, __, ___) => Container( + width: 104, + height: 104, + color: + AppColor.primaryColor.withOpacity(0.08), + child: Center( + child: Text( + initials, + style: const TextStyle( + fontSize: 34, + fontWeight: FontWeight.bold, + color: AppColor.primaryColor, + ), + ), + ), + ), + ), + ), + ), + ), + + // Camera button + GestureDetector( + onTap: _isUploadingImage ? null : _pickAndUploadImage, + child: Container( + width: 36, + height: 36, + margin: const EdgeInsets.only(right: 2, bottom: 2), + decoration: BoxDecoration( + color: AppColor.primaryColor, + shape: BoxShape.circle, + border: + Border.all(color: AppColor.secondaryColor, width: 2.5), + boxShadow: [ + BoxShadow( + color: AppColor.primaryColor.withOpacity(0.4), + blurRadius: 8, + offset: const Offset(0, 3), + ), + ], + ), + child: const Icon(Icons.camera_alt_rounded, + color: Colors.white, size: 17), + ), + ), + ], + ), + + const SizedBox(height: 16), + + // Name + edit hint + Row( + mainAxisAlignment: MainAxisAlignment.center, + mainAxisSize: MainAxisSize.min, + children: [ + Text( + fullName.isEmpty ? 'Passenger'.tr : fullName, + style: TextStyle( + fontSize: 24, + fontWeight: FontWeight.bold, + color: AppColor.writeColor, + ), + ), + const SizedBox(width: 6), + GestureDetector( + onTap: () => _showNameSheet(Get.find()), + child: Container( + padding: const EdgeInsets.all(4), + decoration: BoxDecoration( + color: AppColor.primaryColor.withOpacity(0.1), + shape: BoxShape.circle, + ), + child: const Icon(Icons.edit_rounded, + size: 14, color: AppColor.primaryColor), + ), + ), + ], + ), + + if (email.isNotEmpty) ...[ + const SizedBox(height: 4), + Text( + email, + style: TextStyle( + fontSize: 14, + color: AppColor.grayColor, + fontWeight: FontWeight.w500), + ), + ], + + const SizedBox(height: 10), + + // Passenger badge + Container( + padding: const EdgeInsets.symmetric(horizontal: 14, vertical: 5), + decoration: BoxDecoration( + color: AppColor.primaryColor.withOpacity(0.08), + borderRadius: BorderRadius.circular(20), + border: Border.all(color: AppColor.primaryColor.withOpacity(0.2)), + ), + child: Row( + mainAxisSize: MainAxisSize.min, + children: [ + const Icon(Icons.verified_user_rounded, + size: 13, color: AppColor.primaryColor), + const SizedBox(width: 5), + Text( + 'Verified Passenger'.tr, + style: const TextStyle( + fontSize: 12, + color: AppColor.primaryColor, + fontWeight: FontWeight.w600, + ), + ), + ], + ), + ), + ], + ), + ); + } + + // ─── Section Card ──────────────────────────────────────────────────────────── + + Widget _buildSectionCard({ + required String title, + required IconData sectionIcon, + required List children, + }) { + return Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Padding( + padding: const EdgeInsets.only(left: 8, bottom: 12), + child: Row( + children: [ + Icon(sectionIcon, size: 15, color: AppColor.grayColor), + const SizedBox(width: 8), + Text( + title.toUpperCase(), + style: TextStyle( + fontSize: 15, + fontWeight: FontWeight.bold, + color: AppColor.grayColor, + letterSpacing: 1.2, + ), + ), + ], + ), + ), + Container( + decoration: BoxDecoration( + color: AppColor.secondaryColor, + borderRadius: BorderRadius.circular(18), + boxShadow: [ + BoxShadow( + color: Get.isDarkMode + ? Colors.black.withOpacity(0.2) + : Colors.black.withOpacity(0.04), + blurRadius: 12, + offset: const Offset(0, 4), + ), + ], + ), + child: Column(children: children), + ), + ], + ); + } + + Widget _buildTile({ + required IconData icon, + required Color color, + required String title, + required String subtitle, + required VoidCallback onTap, + Widget? trailing, + }) { + return InkWell( + onTap: onTap, + borderRadius: BorderRadius.circular(18), + child: Padding( + padding: const EdgeInsets.symmetric(horizontal: 16, vertical: 13), + child: Row( + children: [ + Container( + width: 42, + height: 42, + decoration: BoxDecoration( + color: color.withOpacity(0.1), + borderRadius: BorderRadius.circular(12), + ), + child: Icon(icon, color: color, size: 21), + ), + const SizedBox(width: 14), + Expanded( + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Text(title, + style: TextStyle( + fontWeight: FontWeight.w600, + fontSize: 16, + color: AppColor.writeColor)), + if (subtitle.isNotEmpty) ...[ + const SizedBox(height: 4), + Text(subtitle, + style: + TextStyle(color: AppColor.grayColor, fontSize: 13)), + ], + ], + ), + ), + trailing ?? + Icon(Icons.arrow_forward_ios_rounded, + size: 14, color: AppColor.grayColor.withOpacity(0.5)), + ], + ), + ), + ); + } + + Widget _divider() => Divider( + height: 1, + thickness: 1, + indent: 72, + endIndent: 16, + color: AppColor.grayColor.withOpacity(0.1)); + + // ─── Bottom Sheets ─────────────────────────────────────────────────────────── + + /// Name: first + last together + void _showNameSheet(ProfileController controller) { + final firstCtrl = TextEditingController( + text: controller.prfoileData['first_name']?.toString() ?? ''); + final lastCtrl = TextEditingController( + text: controller.prfoileData['last_name']?.toString() ?? ''); + + _openSheet( + title: 'Update Name'.tr, + headerIcon: Icons.badge_outlined, + headerColor: Colors.blueAccent, + child: StatefulBuilder( + builder: (ctx, setStateInner) => Column( + children: [ + _styledField( + controller: firstCtrl, + label: 'First Name'.tr, + hint: 'Enter your first name'.tr, + icon: Icons.person_outline, + type: TextInputType.name, + ), + const SizedBox(height: 14), + _styledField( + controller: lastCtrl, + label: 'Last Name'.tr, + hint: 'Enter your last name'.tr, + icon: Icons.person_outline, + type: TextInputType.name, + ), + const SizedBox(height: 24), + _sheetSaveButton( + label: 'Save Name'.tr, + onPressed: () async { + Get.back(); + // Update both columns sequentially + await controller.updateColumn({ + 'id': box.read(BoxName.passengerID).toString(), + 'first_name': firstCtrl.text.trim(), + 'last_name': lastCtrl.text.trim(), + }); + }, + ), + ], + ), + ), + ); + } + + /// Single text field update + void _showFieldSheet({ + required ProfileController controller, + required String fieldKey, + required String title, + required IconData icon, + required Color iconColor, + required TextInputType keyboardType, + VoidCallback? onSaved, + }) { + final tempCtrl = TextEditingController( + text: controller.prfoileData[fieldKey]?.toString() ?? ''); + + _openSheet( + title: title, + headerIcon: icon, + headerColor: iconColor, + child: Column( + children: [ + _styledField( + controller: tempCtrl, + label: title, + hint: '', + icon: icon, + type: keyboardType, + ), + const SizedBox(height: 24), + _sheetSaveButton( + onPressed: () async { + Get.back(); + await controller.updateColumn({ + 'id': box.read(BoxName.passengerID).toString(), + fieldKey: tempCtrl.text.trim(), + }); + onSaved?.call(); + }, + ), + ], + ), + ); + } + + /// Gender picker sheet + void _showGenderSheet(ProfileController controller) { + final options = ['Male'.tr, 'Female'.tr, 'Other'.tr]; + _openSheet( + title: 'Select Gender'.tr, + headerIcon: Icons.wc_outlined, + headerColor: Colors.pinkAccent, + child: Column( + children: options + .map((g) => _choiceTile( + label: g, + isSelected: controller.prfoileData['gender']?.toString() == g, + onTap: () async { + Get.back(); + await controller.updateColumn({ + 'id': box.read(BoxName.passengerID).toString(), + 'gender': g, + }); + }, + )) + .toList(), + ), + ); + } + + /// Education picker sheet + void _showEducationSheet(ProfileController controller) { + final options = [ + 'High School Diploma'.tr, + 'Associate Degree'.tr, + "Bachelor's Degree".tr, + "Master's Degree".tr, + 'Doctoral Degree'.tr, + ]; + _openSheet( + title: 'Select Education'.tr, + headerIcon: Icons.school_outlined, + headerColor: Colors.orangeAccent, + child: Column( + children: options + .map((d) => _choiceTile( + label: d, + isSelected: + controller.prfoileData['education']?.toString() == d, + onTap: () async { + Get.back(); + await controller.updateColumn({ + 'id': box.read(BoxName.passengerID).toString(), + 'education': d, + }); + }, + )) + .toList(), + ), + ); + } + + /// Delete account sheet + void _showDeleteSheet() { + _openSheet( + title: 'Delete Account'.tr, + headerIcon: Icons.delete_forever_outlined, + headerColor: Colors.redAccent, + child: Column( + children: [ + Container( + padding: const EdgeInsets.all(14), + decoration: BoxDecoration( + color: Colors.red.withOpacity(0.05), + borderRadius: BorderRadius.circular(12), + border: Border.all(color: Colors.red.withOpacity(0.15)), + ), + child: Row( + children: [ + const Icon(Icons.warning_amber_rounded, + color: Colors.redAccent, size: 20), + const SizedBox(width: 10), + Expanded( + child: Text( + 'This action is permanent and cannot be undone.'.tr, + style: TextStyle( + color: Colors.red.withOpacity(0.8), fontSize: 13), + ), + ), + ], + ), + ), + const SizedBox(height: 16), + _styledField( + controller: logOutController.emailTextController, + label: 'Confirm your Email'.tr, + hint: 'example@domain.com', + icon: Icons.email_outlined, + type: TextInputType.emailAddress, + ), + const SizedBox(height: 24), + Row( + children: [ + Expanded( + child: OutlinedButton( + onPressed: () { + logOutController.emailTextController.clear(); + Get.back(); + }, + style: OutlinedButton.styleFrom( + padding: const EdgeInsets.symmetric(vertical: 14), + shape: RoundedRectangleBorder( + borderRadius: BorderRadius.circular(12)), + side: BorderSide(color: Colors.grey[300]!), + ), + child: Text('Cancel'.tr, + style: TextStyle(color: AppColor.grayColor)), + ), + ), + const SizedBox(width: 12), + Expanded( + child: ElevatedButton( + onPressed: () async { + await logOutController.deletePassengerAccount(); + }, + style: ElevatedButton.styleFrom( + backgroundColor: Colors.redAccent, + foregroundColor: Colors.white, + padding: const EdgeInsets.symmetric(vertical: 14), + elevation: 0, + shape: RoundedRectangleBorder( + borderRadius: BorderRadius.circular(12)), + ), + child: Text('Delete'.tr, + style: const TextStyle(fontWeight: FontWeight.bold)), + ), + ), + ], + ), + ], + ), + ); + } + + // ─── Sheet Primitives ──────────────────────────────────────────────────────── + + void _openSheet({ + required String title, + required IconData headerIcon, + required Color headerColor, + required Widget child, + }) { + Get.bottomSheet( + isScrollControlled: true, + _SheetWrapper( + title: title, + headerIcon: headerIcon, + headerColor: headerColor, + child: child, + ), + ); + } + + Widget _styledField({ + required TextEditingController controller, + required String label, + required String hint, + required IconData icon, + required TextInputType type, + }) { + return TextField( + controller: controller, + keyboardType: type, + style: TextStyle(fontSize: 16, color: AppColor.writeColor), + decoration: InputDecoration( + labelText: label, + hintText: hint, + hintStyle: + TextStyle(color: AppColor.grayColor.withOpacity(0.5), fontSize: 14), + prefixIcon: Icon(icon, size: 20, color: AppColor.grayColor), + filled: true, + fillColor: AppColor.secondaryColor, + contentPadding: + const EdgeInsets.symmetric(horizontal: 16, vertical: 15), + border: OutlineInputBorder( + borderRadius: BorderRadius.circular(13), + borderSide: + BorderSide(color: AppColor.grayColor.withOpacity(0.15))), + enabledBorder: OutlineInputBorder( + borderRadius: BorderRadius.circular(13), + borderSide: + BorderSide(color: AppColor.grayColor.withOpacity(0.15))), + focusedBorder: OutlineInputBorder( + borderRadius: BorderRadius.circular(13), + borderSide: BorderSide(color: AppColor.primaryColor, width: 1.5)), + labelStyle: TextStyle(color: AppColor.grayColor, fontSize: 14), + ), + ); + } + + Widget _sheetSaveButton({required VoidCallback onPressed, String? label}) { + return SizedBox( + width: double.infinity, + child: ElevatedButton( + onPressed: onPressed, + style: ElevatedButton.styleFrom( + backgroundColor: AppColor.primaryColor, + foregroundColor: Colors.white, + padding: const EdgeInsets.symmetric(vertical: 15), + elevation: 0, + shape: + RoundedRectangleBorder(borderRadius: BorderRadius.circular(13)), + ), + child: Text( + label ?? 'Save Changes'.tr, + style: const TextStyle(fontSize: 15, fontWeight: FontWeight.bold), + ), + ), + ); + } + + Widget _choiceTile({ + required String label, + required bool isSelected, + required VoidCallback onTap, + }) { + return ListTile( + contentPadding: const EdgeInsets.symmetric(horizontal: 8, vertical: 2), + onTap: onTap, + leading: AnimatedContainer( + duration: const Duration(milliseconds: 200), + width: 22, + height: 22, + decoration: BoxDecoration( + shape: BoxShape.circle, + border: Border.all( + color: isSelected ? AppColor.primaryColor : Colors.grey[300]!, + width: 2, + ), + color: isSelected + ? AppColor.primaryColor.withOpacity(0.1) + : Colors.transparent, + ), + child: isSelected + ? const Icon(Icons.check_rounded, + size: 14, color: AppColor.primaryColor) + : null, + ), + title: Text(label, + style: TextStyle( + fontWeight: isSelected ? FontWeight.w600 : FontWeight.normal, + fontSize: 16, + color: isSelected ? AppColor.primaryColor : AppColor.writeColor)), + ); + } +} + +// ───────────────────────────────────────────────────────────────────────────── +// Reusable Sheet Wrapper +// ───────────────────────────────────────────────────────────────────────────── +class _SheetWrapper extends StatelessWidget { + final String title; + final IconData headerIcon; + final Color headerColor; + final Widget child; + + const _SheetWrapper({ + required this.title, + required this.headerIcon, + required this.headerColor, + required this.child, + }); + + @override + Widget build(BuildContext context) { + return Container( + padding: EdgeInsets.fromLTRB( + 24, + 16, + 24, + MediaQuery.of(context).viewInsets.bottom + 28, + ), + decoration: BoxDecoration( + color: AppColor.secondaryColor, + borderRadius: const BorderRadius.vertical(top: Radius.circular(26)), + ), + child: SingleChildScrollView( + physics: const BouncingScrollPhysics(), + child: Column( + mainAxisSize: MainAxisSize.min, + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + // Handle bar + Center( + child: Container( + width: 38, + height: 4, + margin: const EdgeInsets.only(bottom: 20), + decoration: BoxDecoration( + color: AppColor.grayColor.withOpacity(0.3), + borderRadius: BorderRadius.circular(2), + ), + ), + ), + // Header row + Row( + children: [ + Container( + width: 42, + height: 42, + decoration: BoxDecoration( + color: headerColor.withOpacity(0.12), + borderRadius: BorderRadius.circular(12), + ), + child: Icon(headerIcon, color: headerColor, size: 22), + ), + const SizedBox(width: 12), + Text( + title, + style: TextStyle( + fontSize: 18, + fontWeight: FontWeight.bold, + color: AppColor.writeColor, + ), + ), + ], + ), + const SizedBox(height: 24), + child, + ], + ), + ), + ); + } +} diff --git a/siro_rider/lib/views/home/profile/profile_captain.dart b/siro_rider/lib/views/home/profile/profile_captain.dart new file mode 100644 index 0000000..1661ad6 --- /dev/null +++ b/siro_rider/lib/views/home/profile/profile_captain.dart @@ -0,0 +1,157 @@ +import 'package:cached_network_image/cached_network_image.dart'; +import 'package:flutter/material.dart'; +import 'package:get/get.dart'; +import 'package:siro_rider/constant/box_name.dart'; +import 'package:siro_rider/constant/style.dart'; +import 'package:siro_rider/controller/profile/captain_profile_controller.dart'; +import 'package:siro_rider/main.dart'; +import 'package:siro_rider/views/widgets/elevated_btn.dart'; +import 'package:siro_rider/views/widgets/my_scafold.dart'; + +import '../../../constant/api_key.dart'; +import '../../widgets/my_textField.dart'; + +class ProfileCaptain extends StatelessWidget { + const ProfileCaptain({super.key}); + + @override + Widget build(BuildContext context) { + Get.put(CaptainProfileController()); + return MyScafolld( + title: 'My Profile'.tr, + body: [ + GetBuilder( + builder: (controller) => Padding( + padding: const EdgeInsets.all(16.0), + child: SingleChildScrollView( + child: Center( + child: Column( + crossAxisAlignment: CrossAxisAlignment.center, + children: [ + CircleAvatar( + radius: Get.width * 0.26, + backgroundColor: Colors.white, + backgroundImage: CachedNetworkImageProvider( + '${AK.serverPHP}/portrate_captain_image/${box.read(BoxName.driverID)}.jpg', + ), + ), + const SizedBox(height: 8.0), + Text( + box.read(BoxName.nameDriver) + + ' ' + + box.read(BoxName.lastNameDriver).toString(), + style: AppStyle.title), + const SizedBox(height: 8.0), + Text('${'Email is'.tr} :${box.read(BoxName.emailDriver)}', + style: AppStyle.title), + const SizedBox(height: 8.0), + Text( + '${'Phone Number is'.tr} :${box.read(BoxName.phoneDriver)}', + style: AppStyle.title), + const SizedBox(height: 8.0), + Text( + '${'Date of Birth is'.tr} :${box.read(BoxName.dobDriver)}', + style: AppStyle.title), + const SizedBox(height: 8.0), + Text('${'Sex is '.tr}:${box.read(BoxName.sexDriver)}', + style: AppStyle.title), + const SizedBox(height: 8.0), + const Divider( + // height: 2, + endIndent: 1, + indent: 2, + thickness: 2, + ), + const SizedBox(height: 8.0), + Text('Car Details'.tr, style: AppStyle.headTitle2), + const SizedBox(height: 8.0), + Text('${'VIN is'.tr} :${box.read(BoxName.vin)}', + style: AppStyle.title), + const SizedBox(height: 8.0), + Text('${'Color is '.tr} :${box.read(BoxName.color)}', + style: AppStyle.title), + const SizedBox(height: 8.0), + Text( + '${'Car Plate is '.tr} :${box.read(BoxName.carPlate)}', + style: AppStyle.title), + const SizedBox(height: 8.0), + Text('${'Make is '.tr}:${box.read(BoxName.make)}', + style: AppStyle.title), + const SizedBox(height: 8.0), + Text('${'Model is'.tr} :${box.read(BoxName.model)}', + style: AppStyle.title), + const SizedBox(height: 8.0), + Text('${'Year is'.tr} :${box.read(BoxName.year)}', + style: AppStyle.title), + const SizedBox(height: 8.0), + Text( + '${'Expiration Date '.tr} :${box.read(BoxName.expirationDate)}', + style: AppStyle.title), + const SizedBox(height: 8.0), + ], + ), + ), + ), + ), + ) + ], + isleading: true, + action: GetBuilder( + builder: (controller) => IconButton( + onPressed: () { + Get.defaultDialog( + title: 'Edit Your data'.tr, + titleStyle: AppStyle.title, + content: SizedBox( + height: Get.height * .4, + child: SingleChildScrollView( + child: Column( + children: [ + MyTextForm( + controller: controller.vin, + hint: 'write vin for your car'.tr, + label: 'VIN'.tr, + type: TextInputType.emailAddress, + ), + MyTextForm( + controller: controller.color, + hint: 'write Color for your car'.tr, + label: 'Color'.tr, + type: TextInputType.emailAddress, + ), + MyTextForm( + controller: controller.make, + hint: 'write Make for your car'.tr, + label: 'Make'.tr, + type: TextInputType.emailAddress, + ), + MyTextForm( + controller: controller.model, + hint: 'write Model for your car'.tr, + label: 'Model'.tr, + type: TextInputType.emailAddress, + ), + MyTextForm( + controller: controller.year, + hint: 'write Year for your car'.tr, + label: 'Year'.tr, + type: TextInputType.number, + ), + MyTextForm( + controller: controller.expirationDate, + hint: 'write Expiration Date for your car'.tr, + label: 'Expiration Date'.tr, + type: TextInputType.datetime), + MyElevatedButton( + title: 'Update'.tr, + onPressed: () => controller.updateFields()) + ], + ), + ), + )); + }, + icon: const Icon(Icons.edit), + ), + )); + } +} diff --git a/siro_rider/lib/views/home/profile/promos_passenger_page.dart b/siro_rider/lib/views/home/profile/promos_passenger_page.dart new file mode 100644 index 0000000..b095765 --- /dev/null +++ b/siro_rider/lib/views/home/profile/promos_passenger_page.dart @@ -0,0 +1,206 @@ +import 'package:flutter/material.dart'; +import 'package:flutter/services.dart'; +import 'package:get/get.dart'; +import 'package:siro_rider/controller/home/profile/promos_controller.dart'; +import 'package:siro_rider/views/widgets/my_scafold.dart'; +import 'dart:ui'; // لاستخدامه في الفاصل + +import '../../../constant/colors.dart'; +import '../../../constant/style.dart'; +import '../../widgets/mycircular.dart'; +import 'package:dotted_line/dotted_line.dart'; // ستحتاج لإضافة هذا الباكج + +// ملاحظة: ستحتاج لإضافة هذا الباكج إلى ملف pubspec.yaml الخاص بك +// flutter pub add dotted_line + +// --- الويدجت الرئيسية بالتصميم الجديد --- +class PromosPassengerPage extends StatelessWidget { + const PromosPassengerPage({super.key}); + + @override + Widget build(BuildContext context) { + Get.put(PromosController()); // نفس منطقك القديم + return MyScafolld( + title: "Today's Promos".tr, // عنوان أكثر جاذبية + isleading: true, + body: [ + GetBuilder( + builder: (controller) { + if (controller.isLoading) { + return const MyCircularProgressIndicator(); + } + if (controller.promoList.isEmpty) { + return Center( + child: Column( + mainAxisAlignment: MainAxisAlignment.center, + children: [ + const Icon(Icons.local_offer_outlined, + size: 80, color: Colors.grey), + const SizedBox(height: 16), + Text("No promos available right now.".tr, + style: AppStyle.headTitle2), + Text("Check back later for new offers!".tr, + style: AppStyle.subtitle), + ], + ), + ); + } + return ListView.builder( + padding: const EdgeInsets.all(16.0), + itemCount: controller.promoList.length, + itemBuilder: (BuildContext context, int index) { + final promo = controller.promoList[index]; + // --- استدعاء ويدجت الكوبون الجديدة --- + return _buildPromoTicket(context, promo); + }, + ); + }, + ) + ], + ); + } + + // --- ويدجت بناء كوبون الخصم --- + Widget _buildPromoTicket(BuildContext context, Map promo) { + return Padding( + padding: const EdgeInsets.only(bottom: 20.0), + child: Container( + height: 140, // ارتفاع ثابت للكوبون + decoration: BoxDecoration( + boxShadow: [ + BoxShadow( + color: Colors.black.withOpacity(0.15), + blurRadius: 12, + offset: const Offset(0, 6), + ), + ], + ), + child: ClipPath( + clipper: TicketClipper(), // Clipper مخصص لرسم شكل التذكرة + child: Container( + color: AppColor.secondaryColor, + child: Row( + children: [ + // --- الجزء الأيسر: تفاصيل العرض --- + Expanded( + flex: 3, + child: Padding( + padding: const EdgeInsets.all(16.0), + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + mainAxisAlignment: MainAxisAlignment.center, + children: [ + Text( + promo['description'], + style: AppStyle.headTitle.copyWith(fontSize: 18), + maxLines: 2, + overflow: TextOverflow.ellipsis, + ), + const Spacer(), + Row( + children: [ + const Icon(Icons.calendar_today_outlined, + size: 14, color: Colors.grey), + const SizedBox(width: 6), + Text( + '${'Valid Until:'.tr} ${promo['validity_end_date']}', + style: AppStyle.subtitle + .copyWith(fontSize: 12, color: Colors.grey), + ), + ], + ), + ], + ), + ), + ), + // --- الفاصل المنقط --- + SizedBox( + height: 110, + child: DottedLine( + direction: Axis.vertical, + lineThickness: 2.0, + dashLength: 8.0, + dashColor: AppColor.writeColor.withOpacity(0.2), + dashGapLength: 4.0, + ), + ), + // --- الجزء الأيمن: كود الخصم وزر النسخ --- + Expanded( + flex: 2, + child: GestureDetector( + onTap: () { + // --- نفس منطقك القديم للنسخ --- + Clipboard.setData( + ClipboardData(text: promo['promo_code'])); + Get.snackbar( + 'Promo Copied!'.tr, + '${'Code'.tr} ${promo['promo_code']} ${'copied to clipboard'.tr}', + snackPosition: SnackPosition.BOTTOM, + backgroundColor: AppColor.greenColor, + colorText: Colors.white, + ); + }, + child: Container( + color: AppColor.primaryColor.withOpacity(0.1), + child: Column( + mainAxisAlignment: MainAxisAlignment.center, + children: [ + Text( + 'CODE'.tr, + style: AppStyle.subtitle.copyWith( + color: AppColor.primaryColor, letterSpacing: 2), + ), + const SizedBox(height: 8), + Text( + promo['promo_code'], + style: AppStyle.headTitle.copyWith( + fontSize: 24, color: AppColor.primaryColor), + ), + const SizedBox(height: 12), + Row( + mainAxisAlignment: MainAxisAlignment.center, + children: [ + const Icon(Icons.copy, + size: 14, color: AppColor.primaryColor), + const SizedBox(width: 4), + Text('Copy'.tr, + style: AppStyle.subtitle + .copyWith(color: AppColor.primaryColor)), + ], + ), + ], + ), + ), + ), + ), + ], + ), + ), + ), + ), + ); + } +} + +// --- كلاس مخصص لرسم شكل التذكرة --- +class TicketClipper extends CustomClipper { + @override + Path getClip(Size size) { + Path path = Path(); + + path.lineTo(0.0, size.height); + path.lineTo(size.width, size.height); + path.lineTo(size.width, 0.0); + + double radius = 10; + path.addOval( + Rect.fromCircle(center: Offset(0, size.height / 2), radius: radius)); + path.addOval(Rect.fromCircle( + center: Offset(size.width, size.height / 2), radius: radius)); + + return path; + } + + @override + bool shouldReclip(CustomClipper oldClipper) => false; +} diff --git a/siro_rider/lib/views/home/profile/taarif_page.dart b/siro_rider/lib/views/home/profile/taarif_page.dart new file mode 100644 index 0000000..73492f6 --- /dev/null +++ b/siro_rider/lib/views/home/profile/taarif_page.dart @@ -0,0 +1,88 @@ +import 'package:siro_rider/constant/box_name.dart'; +import 'package:siro_rider/main.dart'; +import 'package:flutter/material.dart'; +import 'package:get/get.dart'; +import 'package:siro_rider/constant/style.dart'; +import 'package:siro_rider/views/widgets/my_scafold.dart'; + +class TaarifPage extends StatelessWidget { + const TaarifPage({super.key}); + + @override + Widget build(BuildContext context) { + return MyScafolld(isleading: true, title: 'Tariffs'.tr, body: [ + Padding( + padding: const EdgeInsets.symmetric(horizontal: 4), + child: ListView( + // mainAxisAlignment: MainAxisAlignment.start, + // crossAxisAlignment: CrossAxisAlignment.stretch, + clipBehavior: Clip.hardEdge, + children: [ + Table( + defaultVerticalAlignment: TableCellVerticalAlignment.middle, + border: TableBorder.symmetric(), + textBaseline: TextBaseline.alphabetic, + children: [ + TableRow( + // decoration: AppStyle.boxDecoration, + children: [ + Text('Minimum fare'.tr, style: AppStyle.title), + box.read(BoxName.countryCode) == 'Jordan' + ? Text('1 ${'JOD'.tr}', style: AppStyle.title) + : Text('20 ${'LE'.tr}', style: AppStyle.title), + ], + ), + TableRow( + children: [ + Text('Maximum fare'.tr, style: AppStyle.title), + box.read(BoxName.countryCode) == 'Jordan' + ? Text('200 ${'JOD'.tr}', style: AppStyle.title) + : Text('15000 ${'LE'.tr}', style: AppStyle.title), + ], + ), + TableRow( + children: [ + Text('Flag-down fee'.tr, style: AppStyle.title), + box.read(BoxName.countryCode) == 'Jordan' + ? Text('0.47 ${'JOD'.tr}', style: AppStyle.title) + : Text('15 ${'LE'.tr}', style: AppStyle.title), + ], + ), + TableRow( + children: [ + box.read(BoxName.countryCode) == 'Jordan' + ? Text('0.05 ${'JOD'.tr}/min and 0.21 ${'JOD'.tr}/km', + style: AppStyle.title) + : Text('1 ${'LE'.tr}/min and 4 ${'LE'.tr}/km', + style: AppStyle.title), + Text('Including Tax'.tr, style: AppStyle.title), + ], + ), + ], + ), + const SizedBox(height: 10), + Text('BookingFee'.tr, style: AppStyle.headTitle2), + const SizedBox(height: 10), + Text('10%', style: AppStyle.title), + const SizedBox(height: 20), + Text('Morning'.tr, style: AppStyle.headTitle2), + const SizedBox(height: 10), + Text( + 'from 07:30 till 10:30 (Thursday, Friday, Saturday, Monday)'.tr, + style: AppStyle.title), + const SizedBox(height: 20), + Text('Evening'.tr, style: AppStyle.headTitle2), + const SizedBox(height: 10), + Text( + 'from 12:00 till 15:00 (Thursday, Friday, Saturday, Monday)'.tr, + style: AppStyle.title), + const SizedBox(height: 20), + Text('Night'.tr, style: AppStyle.headTitle2), + const SizedBox(height: 10), + Text('from 23:59 till 05:30'.tr, style: AppStyle.title), + ], + ), + ), + ]); + } +} diff --git a/siro_rider/lib/views/home/setting_page.dart b/siro_rider/lib/views/home/setting_page.dart new file mode 100644 index 0000000..cf1e8ea --- /dev/null +++ b/siro_rider/lib/views/home/setting_page.dart @@ -0,0 +1,296 @@ +import 'package:siro_rider/controller/home/home_page_controller.dart'; +import 'package:siro_rider/controller/local/local_controller.dart'; +import 'package:siro_rider/constant/colors.dart'; +import 'package:siro_rider/constant/style.dart'; +import 'package:flutter/material.dart'; +import 'package:get/get.dart'; +import 'package:siro_rider/views/lang/languages.dart'; + +import 'HomePage/about_page.dart'; +import 'HomePage/frequentlyQuestionsPage.dart'; +import 'HomePage/share_app_page.dart'; +import 'HomePage/trip_record_page.dart'; + +// NOTE: This is a placeholder for your actual CountryPickerFromSetting widget. +// You should remove this and import your own widget. +class CountryPickerFromSetting extends StatelessWidget { + const CountryPickerFromSetting({super.key}); + @override + Widget build(BuildContext context) { + return Scaffold( + appBar: AppBar(title: Text('Change Country'.tr)), + body: Center( + child: Text('Country Picker Page Placeholder'.tr), + ), + ); + } +} + +class SettingPage extends StatelessWidget { + const SettingPage({super.key}); + + @override + Widget build(BuildContext context) { + // Using lazyPut to ensure the controller is available when needed. + Get.lazyPut(() => HomePageController()); + + return Scaffold( + backgroundColor: AppColor.secondaryColor.withOpacity(0.94), + appBar: AppBar( + title: Text('Setting'.tr, + style: AppStyle.headTitle2.copyWith(fontSize: 20)), + backgroundColor: AppColor.secondaryColor, + elevation: 0.5, + leading: IconButton( + icon: Icon(Icons.arrow_back_ios_new, color: AppColor.writeColor), + onPressed: () => Get.back(), + ), + ), + body: SafeArea( + child: ListView( + padding: const EdgeInsets.symmetric(horizontal: 16.0, vertical: 20.0), + children: [ + _buildSectionHeader('General'.tr), + _buildSettingsCard( + children: [ + _buildSettingsTile( + icon: Icons.language, + color: Colors.blue, + title: 'Language'.tr, + subtitle: 'To change Language the App'.tr, + onTap: () => Get.to(() => const Language()), + ), + Divider( + height: 1, + indent: 68, + endIndent: 16, + color: AppColor.grayColor.withOpacity(0.1)), + GetBuilder( + builder: (localeController) { + return _buildSettingsTile( + icon: Icons.palette_outlined, + color: Colors.deepPurpleAccent, + title: 'Appearance'.tr, + subtitle: (localeController.themeMode == ThemeMode.system + ? 'System Default'.tr + : localeController.themeMode == ThemeMode.dark + ? 'Dark Mode'.tr + : 'Light Mode'.tr) + .tr, + onTap: () => _showThemeSheet(context, localeController), + ); + }, + ), + ], + ), + const SizedBox(height: 24), + _buildSectionHeader('Preferences'.tr), + _buildSettingsCard( + children: [ + GetBuilder( + builder: (controller) { + return _buildSettingsSwitchTile( + icon: Icons.vibration, + color: Colors.purple, + title: 'Vibration'.tr, + subtitle: 'Vibration feedback for all buttons'.tr, + value: controller.isVibrate, + onChanged: controller.changeVibrateOption, + ); + }, + ), + const Divider(height: 1, indent: 68, endIndent: 16), + _buildSettingsTile( + icon: Icons.mic_none, + color: Colors.orange, + title: 'Trips recorded'.tr, + subtitle: 'Here recorded trips audio'.tr, + onTap: () => Get.to(() => const TripsRecordedPage()), + ), + ], + ), + const SizedBox(height: 24), + _buildSectionHeader('Support & Info'.tr), + _buildSettingsCard( + children: [ + _buildSettingsTile( + icon: Icons.help_outline, + color: Colors.cyan, + title: 'Frequently Questions'.tr, + subtitle: 'Find answers to common questions'.tr, + onTap: () => Get.to(() => const FrequentlyQuestionsPage()), + ), + const Divider(height: 1, indent: 68, endIndent: 16), + _buildSettingsTile( + icon: Icons.info_outline, + color: Colors.indigo, + title: 'About Us'.tr, + subtitle: 'Learn more about our app and mission'.tr, + onTap: () => Get.to(() => const AboutPage()), + ), + const Divider(height: 1, indent: 68, endIndent: 16), + _buildSettingsTile( + icon: Icons.share_outlined, + color: Colors.redAccent, + title: 'Share App'.tr, + subtitle: 'Share with friends and earn rewards'.tr, + onTap: () => Get.to(() => ShareAppPage()), + ), + ], + ), + ], + ), + ), + ); + } + + Widget _buildSectionHeader(String title) { + return Padding( + padding: const EdgeInsets.only(bottom: 12.0, left: 8.0), + child: Text( + title, + style: TextStyle( + color: AppColor.grayColor, + fontWeight: FontWeight.bold, + fontSize: 15, + ), + ), + ); + } + + void _showThemeSheet(BuildContext context, LocaleController controller) { + final options = [ + {'label': 'System Default'.tr, 'mode': ThemeMode.system}, + {'label': 'Light Mode'.tr, 'mode': ThemeMode.light}, + {'label': 'Dark Mode'.tr, 'mode': ThemeMode.dark}, + ]; + + Get.bottomSheet( + Container( + padding: const EdgeInsets.all(20), + decoration: BoxDecoration( + color: AppColor.secondaryColor, + borderRadius: const BorderRadius.vertical(top: Radius.circular(20)), + ), + child: Column( + mainAxisSize: MainAxisSize.min, + children: [ + Container( + width: 40, + height: 4, + margin: const EdgeInsets.only(bottom: 20), + decoration: BoxDecoration( + color: AppColor.grayColor.withOpacity(0.3), + borderRadius: BorderRadius.circular(2), + ), + ), + Text('Select Appearance'.tr, + style: AppStyle.headTitle2.copyWith(fontSize: 18)), + const SizedBox(height: 20), + ...options.map((opt) { + final isSelected = controller.themeMode == opt['mode']; + return ListTile( + title: Text(opt['label'] as String, + style: TextStyle( + color: isSelected + ? AppColor.primaryColor + : AppColor.writeColor, + fontWeight: + isSelected ? FontWeight.bold : FontWeight.normal)), + trailing: isSelected + ? Icon(Icons.check_circle, color: AppColor.primaryColor) + : null, + onTap: () { + Get.back(); + controller.changeThemeMode(opt['mode'] as ThemeMode); + }, + ); + }).toList(), + const SizedBox(height: 20), + ], + ), + ), + ); + } + + Widget _buildSettingsCard({required List children}) { + return Container( + decoration: BoxDecoration( + color: AppColor.secondaryColor, + borderRadius: BorderRadius.circular(12), + boxShadow: [ + BoxShadow( + color: Colors.black.withOpacity(0.05), + blurRadius: 10, + offset: const Offset(0, 4), + ) + ], + ), + clipBehavior: Clip.antiAlias, + child: Column( + children: children, + ), + ); + } + + Widget _buildSettingsTile({ + required IconData icon, + required Color color, + required String title, + required String subtitle, + required VoidCallback onTap, + }) { + return ListTile( + onTap: onTap, + leading: Container( + padding: const EdgeInsets.all(8), + decoration: BoxDecoration( + color: color.withOpacity(0.1), + borderRadius: BorderRadius.circular(10), + ), + child: Icon(icon, color: color, size: 22), + ), + title: Text(title, + style: TextStyle( + fontWeight: FontWeight.w500, + fontSize: 16, + color: AppColor.writeColor)), + subtitle: Text(subtitle, + style: TextStyle(color: AppColor.grayColor, fontSize: 13)), + trailing: + Icon(Icons.chevron_right, color: AppColor.grayColor.withOpacity(0.5)), + contentPadding: const EdgeInsets.symmetric(horizontal: 16, vertical: 6), + ); + } + + Widget _buildSettingsSwitchTile({ + required IconData icon, + required Color color, + required String title, + required String subtitle, + required bool value, + required ValueChanged onChanged, + }) { + return SwitchListTile( + secondary: Container( + padding: const EdgeInsets.all(8), + decoration: BoxDecoration( + color: color.withOpacity(0.1), + borderRadius: BorderRadius.circular(10), + ), + child: Icon(icon, color: color, size: 22), + ), + title: Text(title, + style: TextStyle( + fontWeight: FontWeight.w500, + fontSize: 16, + color: AppColor.writeColor)), + subtitle: Text(subtitle, + style: TextStyle(color: AppColor.grayColor, fontSize: 13)), + value: value, + onChanged: onChanged, + activeColor: const Color(0xFF007AFF), // iOS-like blue + contentPadding: const EdgeInsets.symmetric(horizontal: 16, vertical: 6), + ); + } +} diff --git a/siro_rider/lib/views/lang/languages.dart b/siro_rider/lib/views/lang/languages.dart new file mode 100644 index 0000000..53cd755 --- /dev/null +++ b/siro_rider/lib/views/lang/languages.dart @@ -0,0 +1,150 @@ +import 'package:flutter/cupertino.dart'; +import 'package:flutter/material.dart'; +import 'package:get/get.dart'; + +import '../../controller/local/local_controller.dart'; +import '../home/map_page_passenger.dart'; + +class Language extends StatelessWidget { + const Language({Key? key}) : super(key: key); + + @override + Widget build(BuildContext context) { + return CupertinoPageScaffold( + navigationBar: CupertinoNavigationBar( + middle: Text('Choose Language'.tr), + border: null, + ), + child: Material( + // Wrap SafeArea with Material widget + child: SafeArea( + child: GetBuilder( + builder: (controller) => Center( + child: Padding( + padding: const EdgeInsets.symmetric(horizontal: 20), + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + _buildHeader(), + const SizedBox(height: 20), + Expanded( + child: ListView( + physics: const BouncingScrollPhysics(), + children: [ + _buildLanguageButton( + 'العربية', 'ar', controller, context, '🇪🇬'), + _buildLanguageButton('العربية (الخليج)', 'ar-gulf', + controller, context, '🇸🇦'), + _buildLanguageButton('العربية (المغرب)', 'ar-ma', + controller, context, '🇲🇦'), + _buildLanguageButton( + 'English', 'en', controller, context, '🇺🇸'), + _buildLanguageButton( + 'Türkçe', 'tr', controller, context, '🇹🇷'), + _buildLanguageButton( + 'Français', 'fr', controller, context, '🇫🇷'), + _buildLanguageButton( + 'Italiano', 'it', controller, context, '🇮🇹'), + _buildLanguageButton( + 'Deutsch', 'de', controller, context, '🇩🇪'), + _buildLanguageButton( + 'Ελληνικά', 'el', controller, context, '🇬🇷'), + _buildLanguageButton( + 'Español', 'es', controller, context, '🇪🇸'), + _buildLanguageButton( + 'فارسی', 'fa', controller, context, '🇮🇷'), + _buildLanguageButton( + '中文', 'zh', controller, context, '🇨🇳'), + _buildLanguageButton( + 'Русский', 'ru', controller, context, '🇷🇺'), + _buildLanguageButton( + 'हिन्दी', 'hi', controller, context, '🇮🇳'), + ], + ), + ), + ], + ), + ), + ), + ), + ), + ), + ); + } + + Widget _buildHeader() { + return Padding( + padding: const EdgeInsets.only(top: 20, bottom: 10), + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Text( + 'Language Options'.tr, + style: const TextStyle( + fontSize: 24, + fontWeight: FontWeight.bold, + color: CupertinoColors.black, // Or your theme primary color + ), + textAlign: TextAlign.start, + ), + const SizedBox(height: 8), + Text( + "Select your preferred language for the app interface.".tr, + style: TextStyle( + fontSize: 16, + color: CupertinoColors.secondaryLabel, + ), + textAlign: TextAlign.start, + ), + ], + ), + ); + } + + Widget _buildLanguageButton(String title, String langCode, + LocaleController controller, BuildContext context, String flagIcon) { + return Container( + decoration: BoxDecoration( + color: CupertinoColors.white, + borderRadius: BorderRadius.circular(12), + boxShadow: [ + BoxShadow( + color: CupertinoColors.systemGrey5.withOpacity(0.5), + spreadRadius: 1, + blurRadius: 3, + offset: const Offset(0, 2), + ), + ], + ), + child: ListTile( + leading: Text(flagIcon, + style: const TextStyle(fontSize: 28)), // Using flag icon as leading + title: Text( + title, + style: const TextStyle( + fontWeight: FontWeight.w500, + ), + ), + trailing: const Icon(CupertinoIcons.chevron_forward, + color: CupertinoColors.inactiveGray), + onTap: () async { + controller.changeLang(langCode); + showCupertinoDialog( + context: context, + builder: (context) => CupertinoAlertDialog( + title: Text('You should restart app to change language'.tr), + actions: [ + CupertinoDialogAction( + child: Text('Ok'.tr), + onPressed: () { + Get.offAll(() => MapPagePassenger()); + }, + ), + ], + ), + ); + }, + ), + ); + } +} diff --git a/siro_rider/lib/views/notification/notification_captain.dart b/siro_rider/lib/views/notification/notification_captain.dart new file mode 100644 index 0000000..6a85b31 --- /dev/null +++ b/siro_rider/lib/views/notification/notification_captain.dart @@ -0,0 +1,74 @@ +import 'package:flutter/material.dart'; +import 'package:get/get.dart'; +import 'package:siro_rider/constant/style.dart'; +import 'package:siro_rider/controller/notification/notification_captain_controller.dart'; +import 'package:siro_rider/views/widgets/elevated_btn.dart'; +import 'package:siro_rider/views/widgets/my_scafold.dart'; +import 'package:siro_rider/views/widgets/mycircular.dart'; + +class NotificationCaptain extends StatelessWidget { + const NotificationCaptain({super.key}); + @override + Widget build(BuildContext context) { + Get.put(NotificationCaptainController()); + + return MyScafolld( + title: 'Notifications'.tr, + body: [ + GetBuilder( + builder: (notificationCaptainController) => + notificationCaptainController.isLoading + ? const MyCircularProgressIndicator() + : SafeArea( + child: ListView.builder( + itemCount: notificationCaptainController + .notificationData['message'].length, + itemBuilder: (BuildContext context, int index) { + if (notificationCaptainController + .notificationData['message'] == + "No notification data found") { + Get.defaultDialog(); + } + var res = notificationCaptainController + .notificationData['message'][index]; + return Card( + elevation: 4, + child: ListTile( + onTap: () { + Get.defaultDialog( + title: res['title'], + titleStyle: AppStyle.title, + content: SizedBox( + width: Get.width * .8, + height: Get.height * .4, + child: Text( + res['body'], + style: AppStyle.title, + ), + ), + confirm: MyElevatedButton( + title: 'Ok', + onPressed: () { + //todo sql readen + })); + }, + leading: + const Icon(Icons.notification_important), + title: Text( + res['title'], + style: AppStyle.title, + ), + subtitle: Text( + res['body'], + style: AppStyle.subtitle, + ), + ), + ); + }, + ), + )) + ], + isleading: true, + ); + } +} diff --git a/siro_rider/lib/views/notification/notification_page.dart b/siro_rider/lib/views/notification/notification_page.dart new file mode 100644 index 0000000..37057c8 --- /dev/null +++ b/siro_rider/lib/views/notification/notification_page.dart @@ -0,0 +1,101 @@ +import 'package:flutter/cupertino.dart'; +import 'package:flutter/material.dart'; +import 'package:get/get.dart'; +import 'package:siro_rider/constant/colors.dart'; +import 'package:siro_rider/constant/style.dart'; + +import '../../controller/notification/passenger_notification_controller.dart'; +import '../widgets/my_scafold.dart'; +import '../widgets/mycircular.dart'; + +class NotificationPage extends StatelessWidget { + const NotificationPage({super.key}); + + @override + Widget build(BuildContext context) { + Get.put(PassengerNotificationController()); + return MyScafolld( + isleading: true, + title: 'Notifications'.tr, + body: [ + GetBuilder( + builder: (notificationCaptainController) => notificationCaptainController + .isloading + ? const MyCircularProgressIndicator() // iOS-style loading indicator + : SafeArea( + child: ListView.builder( + itemCount: notificationCaptainController + .notificationData['message'].length, + itemBuilder: (BuildContext context, int index) { + if (notificationCaptainController + .notificationData['message'] == + "No notification data found") { + Get.defaultDialog( + title: 'No Notifications'.tr, + content: Text( + 'No notification data found.'.tr, + ), + ); + } + var res = notificationCaptainController + .notificationData['message'][index]; + return Padding( + padding: const EdgeInsets.symmetric( + horizontal: 8, vertical: 4), + child: CupertinoListTile( + backgroundColor: res['isShown'] == 'true' + ? AppColor.secondaryColor.withOpacity(.2) + : AppColor.secondaryColor.withOpacity(.8), + leading: res['isShown'] == 'true' + ? const Icon(CupertinoIcons.bell_slash_fill) + : const Icon(CupertinoIcons.bell_fill), + title: Text( + res['title'], + style: AppStyle.title.copyWith( + color: CupertinoColors.black, + ), + ), + subtitle: Text( + res['body'], + style: AppStyle.subtitle.copyWith( + color: CupertinoColors.systemGrey, + ), + ), + onTap: () { + showCupertinoDialog( + context: context, + builder: (BuildContext context) { + return CupertinoAlertDialog( + title: Text( + res['title'], + style: AppStyle.title, + ), + content: Text( + res['body'], + style: AppStyle.subtitle, + ), + actions: [ + CupertinoDialogAction( + child: const Text('Ok'), + onPressed: () { + notificationCaptainController + .updateNotification( + res['id'].toString()); + Get.back(); + }, + ), + ], + ); + }, + ); + }, + ), + ); + }, + ), + ), + ) + ], + ); + } +} diff --git a/siro_rider/lib/views/widgets/circle_container.dart b/siro_rider/lib/views/widgets/circle_container.dart new file mode 100644 index 0000000..ece7311 --- /dev/null +++ b/siro_rider/lib/views/widgets/circle_container.dart @@ -0,0 +1,68 @@ +import 'package:flutter/material.dart'; +import 'package:get/get.dart'; + +import '../../constant/colors.dart'; +import 'mydialoug.dart'; + +class MyCircleContainer extends StatelessWidget { + final Widget child; + final Color? backgroundColor; + final Color? borderColor; + + MyCircleContainer({ + Key? key, + required this.child, + this.backgroundColor, + this.borderColor, + }) : super(key: key); + + final controller = Get.put(CircleController()); + + @override + Widget build(BuildContext context) { + return GetBuilder( + builder: ((controller) => GestureDetector( + onTap: () { + controller.changeColor(); + MyDialog().getDialog( + 'Rejected Orders Count'.tr, + 'This is the total number of rejected orders per day after accepting the orders' + .tr, () { + Get.back(); + }); + }, + child: AnimatedContainer( + onEnd: () { + controller.onEnd(); + }, + duration: const Duration(milliseconds: 300), + width: controller.size, + height: controller.size, + decoration: BoxDecoration( + shape: BoxShape.circle, + color: controller.isAccented ? AppColor.accentColor : (backgroundColor ?? AppColor.secondaryColor), + border: Border.all( + color: borderColor ?? AppColor.accentColor, + width: 1, + ), + ), + child: Center(child: child), + ), + ))); + } +} + +class CircleController extends GetxController { + bool isAccented = false; + double size = 40; + void changeColor() { + isAccented = !isAccented; + size = 60; + update(); + } + + void onEnd() { + size = 40; + update(); + } +} diff --git a/siro_rider/lib/views/widgets/elevated_btn.dart b/siro_rider/lib/views/widgets/elevated_btn.dart new file mode 100644 index 0000000..a50a133 --- /dev/null +++ b/siro_rider/lib/views/widgets/elevated_btn.dart @@ -0,0 +1,182 @@ +import 'dart:io'; +import 'package:flutter/material.dart'; +import 'package:flutter/services.dart'; +import 'package:vibration/vibration.dart'; + +import '../../constant/box_name.dart'; +import '../../constant/colors.dart'; +import '../../constant/style.dart'; +import '../../main.dart'; + +class MyElevatedButton extends StatefulWidget { + final String title; + final VoidCallback onPressed; + final Color kolor; + final int vibrateDuration; + final IconData? icon; + final bool isLoading; + final double? height; + final double? fontSize; + + const MyElevatedButton({ + Key? key, + required this.title, + required this.onPressed, + this.kolor = AppColor.primaryColor, + this.vibrateDuration = 50, // Shorter = crisper feedback + this.icon, + this.isLoading = false, + this.height = 52, + this.fontSize, + }) : super(key: key); + + @override + State createState() => _MyElevatedButtonState(); +} + +class _MyElevatedButtonState extends State + with SingleTickerProviderStateMixin { + late final AnimationController _pressController; + bool _isVibrateEnabled = true; + + @override + void initState() { + super.initState(); + _pressController = AnimationController( + vsync: this, + duration: const Duration(milliseconds: 120), + reverseDuration: const Duration(milliseconds: 180), + ); + _loadVibratePreference(); + } + + Future _loadVibratePreference() async { + // Reactive to preference changes if needed later + setState(() { + _isVibrateEnabled = box.read(BoxName.isvibrate) ?? true; + }); + } + + @override + void dispose() { + _pressController.dispose(); + super.dispose(); + } + + void _triggerHaptic() { + if (!_isVibrateEnabled) return; + + // Unified approach: HapticFeedback works well on both platforms + if (Platform.isIOS) { + HapticFeedback.lightImpact(); + } else if (Platform.isAndroid) { + // Try native haptic first, fallback to Vibration package if needed + HapticFeedback.mediumImpact(); + // Optional stronger feedback: + // Vibration.vibrate(duration: widget.vibrateDuration); + } + } + + void _handlePress() { + if (widget.isLoading) return; + + _triggerHaptic(); + _pressController.forward().then((_) => _pressController.reverse()); + + // Small delay ensures animation starts before callback + Future.delayed(const Duration(milliseconds: 80), widget.onPressed); + } + + @override + Widget build(BuildContext context) { + final isEnabled = !widget.isLoading && widget.onPressed != () {}; + + return AnimatedBuilder( + animation: _pressController, + builder: (context, child) { + final scale = 1.0 - (_pressController.value * 0.03); + + return Transform.scale( + scale: scale, + child: Container( + height: widget.height, + decoration: BoxDecoration( + borderRadius: BorderRadius.circular(12), + boxShadow: isEnabled + ? [ + BoxShadow( + color: widget.kolor.withOpacity(0.25), + blurRadius: 12, + offset: const Offset(0, 4), + ), + ] + : null, + ), + child: ElevatedButton( + style: ButtonStyle( + backgroundColor: WidgetStateProperty.resolveWith( + (states) { + if (!isEnabled) return widget.kolor.withOpacity(0.5); + if (states.contains(WidgetState.pressed)) { + return widget.kolor.withOpacity(0.92); + } + return widget.kolor; + }, + ), + elevation: WidgetStateProperty.resolveWith( + (states) => isEnabled + ? (states.contains(WidgetState.pressed) ? 2 : 6) + : 0, + ), + shape: WidgetStateProperty.all( + RoundedRectangleBorder( + borderRadius: BorderRadius.circular(12), + ), + ), + padding: WidgetStateProperty.all( + const EdgeInsets.symmetric(horizontal: 24, vertical: 14), + ), + ), + onPressed: isEnabled ? _handlePress : null, + child: _buildContent(), + ), + ), + ); + }, + ); + } + + Widget _buildContent() { + if (widget.isLoading) { + return SizedBox( + width: 20, + height: 20, + child: CircularProgressIndicator( + strokeWidth: 2.5, + valueColor: AlwaysStoppedAnimation(AppColor.secondaryColor), + ), + ); + } + + final textStyle = AppStyle.title.copyWith( + color: AppColor.secondaryColor, + fontSize: widget.fontSize, + fontWeight: FontWeight.w600, + letterSpacing: 0.3, + ); + + if (widget.icon != null) { + return Row( + mainAxisSize: MainAxisSize.min, + mainAxisAlignment: MainAxisAlignment.center, + children: [ + Icon(widget.icon, size: 18, color: AppColor.secondaryColor), + const SizedBox(width: 8), + Text(widget.title, style: textStyle, textAlign: TextAlign.center), + ], + ); + } + + return Text(widget.title, style: textStyle, textAlign: TextAlign.center); + } +} diff --git a/siro_rider/lib/views/widgets/error_snakbar.dart b/siro_rider/lib/views/widgets/error_snakbar.dart new file mode 100644 index 0000000..8016844 --- /dev/null +++ b/siro_rider/lib/views/widgets/error_snakbar.dart @@ -0,0 +1,292 @@ +import 'dart:ui'; +import 'package:flutter/material.dart'; +import 'package:flutter/services.dart'; +import 'package:get/get.dart'; +import '../../constant/colors.dart'; + +// ───────────────────────────────────────────────────────────────────────────── +// Snackbar variant definition +// ───────────────────────────────────────────────────────────────────────────── +enum _SnackVariant { success, error, info, warning } + +extension _VariantProps on _SnackVariant { + Color get baseColor => switch (this) { + _SnackVariant.success => const Color(0xFF1A9E5C), + _SnackVariant.error => const Color(0xFFD93025), + _SnackVariant.info => const Color(0xFF1A73E8), + _SnackVariant.warning => const Color(0xFFF29900), + }; + + Color get surfaceColor => switch (this) { + _SnackVariant.success => const Color(0xFFF0FBF5), + _SnackVariant.error => const Color(0xFFFEF2F1), + _SnackVariant.info => const Color(0xFFF0F6FF), + _SnackVariant.warning => const Color(0xFFFFF8E6), + }; + + IconData get icon => switch (this) { + _SnackVariant.success => Icons.check_circle_rounded, + _SnackVariant.error => Icons.error_rounded, + _SnackVariant.info => Icons.info_rounded, + _SnackVariant.warning => Icons.warning_amber_rounded, + }; + + String get label => switch (this) { + _SnackVariant.success => 'Success', + _SnackVariant.error => 'Error', + _SnackVariant.info => 'Info', + _SnackVariant.warning => 'Warning', + }; + + HapticFeedbackType get haptic => switch (this) { + _SnackVariant.error => HapticFeedbackType.medium, + _SnackVariant.warning => HapticFeedbackType.medium, + _SnackVariant.success => HapticFeedbackType.light, + _SnackVariant.info => HapticFeedbackType.selection, + }; +} + +enum HapticFeedbackType { light, medium, selection } + +// ───────────────────────────────────────────────────────────────────────────── +// Core snackbar widget +// ───────────────────────────────────────────────────────────────────────────── +class _SnackContent extends StatefulWidget { + final String message; + final _SnackVariant variant; + + const _SnackContent({required this.message, required this.variant}); + + @override + State<_SnackContent> createState() => _SnackContentState(); +} + +class _SnackContentState extends State<_SnackContent> + with TickerProviderStateMixin { + late final AnimationController _ctrl; + late final Animation _scaleAnim; + late final Animation _progressAnim; + + static const Duration _displayDuration = Duration(seconds: 4); + + @override + void initState() { + super.initState(); + _ctrl = AnimationController(vsync: this, duration: _displayDuration); + + _scaleAnim = CurvedAnimation( + parent: AnimationController( + vsync: this, + duration: const Duration(milliseconds: 500), + )..forward(), + curve: Curves.elasticOut, + ); + + _progressAnim = Tween(begin: 1.0, end: 0.0).animate( + CurvedAnimation(parent: _ctrl, curve: Curves.linear), + ); + + _ctrl.forward(); + } + + @override + void dispose() { + _ctrl.dispose(); + super.dispose(); + } + + @override + Widget build(BuildContext context) { + final v = widget.variant; + final accent = v.baseColor; + final surface = v.surfaceColor; + + return Container( + margin: const EdgeInsets.symmetric(horizontal: 14, vertical: 8), + decoration: BoxDecoration( + color: surface, + borderRadius: BorderRadius.circular(18), + border: Border.all(color: accent.withOpacity(0.18), width: 1.2), + boxShadow: [ + BoxShadow( + color: accent.withOpacity(0.12), + blurRadius: 20, + spreadRadius: -2, + offset: const Offset(0, 6), + ), + BoxShadow( + color: Colors.black.withOpacity(0.06), + blurRadius: 10, + offset: const Offset(0, 2), + ), + ], + ), + child: ClipRRect( + borderRadius: BorderRadius.circular(18), + child: Column( + mainAxisSize: MainAxisSize.min, + children: [ + // ── Main row ────────────────────────────────────────────────── + Padding( + padding: const EdgeInsets.fromLTRB(14, 14, 10, 12), + child: Row( + crossAxisAlignment: CrossAxisAlignment.center, + children: [ + // Animated icon badge + ScaleTransition( + scale: _scaleAnim, + child: Container( + width: 40, + height: 40, + decoration: BoxDecoration( + color: accent.withOpacity(0.12), + shape: BoxShape.circle, + ), + child: Icon(v.icon, color: accent, size: 22), + ), + ), + const SizedBox(width: 12), + + // Text content + Expanded( + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + mainAxisSize: MainAxisSize.min, + children: [ + Text( + v.label.tr, + style: TextStyle( + color: accent, + fontSize: 13, + fontWeight: FontWeight.w700, + letterSpacing: 0.2, + ), + ), + const SizedBox(height: 3), + Text( + widget.message, + style: TextStyle( + color: Colors.grey[800], + fontSize: 13.5, + height: 1.4, + fontWeight: FontWeight.w400, + ), + maxLines: 2, + overflow: TextOverflow.ellipsis, + ), + ], + ), + ), + + // Close button + GestureDetector( + onTap: () { + HapticFeedback.lightImpact(); + Get.closeCurrentSnackbar(); + }, + child: Container( + width: 30, + height: 30, + margin: const EdgeInsets.only(left: 6), + decoration: BoxDecoration( + color: Colors.grey.withOpacity(0.1), + shape: BoxShape.circle, + ), + child: Icon( + Icons.close_rounded, + size: 16, + color: Colors.grey[500], + ), + ), + ), + ], + ), + ), + + // ── Thin progress strip ─────────────────────────────────────── + AnimatedBuilder( + animation: _progressAnim, + builder: (_, __) => Stack( + children: [ + // Track + Container( + height: 3, + color: accent.withOpacity(0.08), + ), + // Fill + FractionallySizedBox( + widthFactor: _progressAnim.value, + child: Container( + height: 3, + decoration: BoxDecoration( + color: accent.withOpacity(0.45), + borderRadius: const BorderRadius.only( + topRight: Radius.circular(4), + bottomRight: Radius.circular(4), + ), + ), + ), + ), + ], + ), + ), + ], + ), + ), + ); + } +} + +// ───────────────────────────────────────────────────────────────────────────── +// Internal dispatcher — single source of truth +// ───────────────────────────────────────────────────────────────────────────── +SnackbarController _show(_SnackVariant variant, String message) { + // Dismiss any existing snackbar first (no stacking) + if (Get.isSnackbarOpen) Get.closeCurrentSnackbar(); + + switch (variant.haptic) { + case HapticFeedbackType.light: + HapticFeedback.lightImpact(); + case HapticFeedbackType.medium: + HapticFeedback.mediumImpact(); + case HapticFeedbackType.selection: + HapticFeedback.selectionClick(); + } + + return Get.snackbar( + '', + '', + snackPosition: SnackPosition.TOP, + backgroundColor: Colors.transparent, + margin: EdgeInsets.zero, + padding: EdgeInsets.zero, + duration: const Duration(seconds: 4), + animationDuration: const Duration(milliseconds: 380), + barBlur: 0, + overlayBlur: 0, + overlayColor: Colors.transparent, + isDismissible: true, + dismissDirection: DismissDirection.up, + forwardAnimationCurve: Curves.easeOutCubic, + reverseAnimationCurve: Curves.easeInCubic, + snackStyle: SnackStyle.FLOATING, + userInputForm: Form( + child: _SnackContent(message: message, variant: variant), + ), + ); +} + +// ───────────────────────────────────────────────────────────────────────────── +// Public API — drop-in replacements for the old functions +// ───────────────────────────────────────────────────────────────────────────── +SnackbarController mySnackbarSuccess(String message) => + _show(_SnackVariant.success, message); + +SnackbarController mySnackeBarError(String message) => + _show(_SnackVariant.error, message); + +SnackbarController mySnackbarInfo(String message) => + _show(_SnackVariant.info, message); + +SnackbarController mySnackbarWarning(String message) => + _show(_SnackVariant.warning, message); diff --git a/siro_rider/lib/views/widgets/icon_widget_menu.dart b/siro_rider/lib/views/widgets/icon_widget_menu.dart new file mode 100644 index 0000000..923982d --- /dev/null +++ b/siro_rider/lib/views/widgets/icon_widget_menu.dart @@ -0,0 +1,66 @@ +import 'package:flutter/material.dart'; + +import '../../constant/colors.dart'; +import '../../constant/style.dart'; + +class IconWidgetMenu extends StatelessWidget { + const IconWidgetMenu({ + Key? key, + required this.onpressed, + required this.icon, + required this.title, + }) : super(key: key); + + final VoidCallback onpressed; + final IconData icon; + final String title; + + @override + Widget build(BuildContext context) { + return InkWell( + onTap: onpressed, + child: Padding( + padding: const EdgeInsets.only(top: 25), + child: Column( + mainAxisAlignment: MainAxisAlignment.center, + children: [ + Container( + width: 40, + decoration: BoxDecoration( + color: AppColor.secondaryColor, + shape: BoxShape.circle, + boxShadow: [ + BoxShadow( + color: AppColor.secondaryColor, + offset: const Offset(-2, -2), + blurRadius: 0, + spreadRadius: 0, + blurStyle: BlurStyle.outer, + ), + const BoxShadow( + color: AppColor.accentColor, + offset: Offset(3, 3), + blurRadius: 0, + spreadRadius: 0, + blurStyle: BlurStyle.outer, + ), + ], + ), + child: Center( + child: Icon( + icon, + size: 30, + color: AppColor.primaryColor, + ), + ), + ), + Text( + title, + style: AppStyle.subtitle, + ) + ], + ), + ), + ); + } +} diff --git a/siro_rider/lib/views/widgets/my_circular_indicator_timer.dart b/siro_rider/lib/views/widgets/my_circular_indicator_timer.dart new file mode 100644 index 0000000..d0c65e7 --- /dev/null +++ b/siro_rider/lib/views/widgets/my_circular_indicator_timer.dart @@ -0,0 +1,159 @@ +import 'dart:async'; +import 'package:flutter/material.dart'; +import 'package:get/get.dart'; +import '../../constant/colors.dart'; + +class MyCircularProgressIndicatorWithTimer extends StatefulWidget { + final Color backgroundColor; + final bool isLoading; + + const MyCircularProgressIndicatorWithTimer({ + Key? key, + this.backgroundColor = Colors.transparent, + required this.isLoading, + }) : super(key: key); + + @override + State createState() => + _MyCircularProgressIndicatorWithTimerState(); +} + +class _MyCircularProgressIndicatorWithTimerState + extends State { + Timer? _timer; + int _timeLeft = 60; + bool _isLowTime = false; + + @override + void initState() { + super.initState(); + if (widget.isLoading) _startTimer(); + } + + @override + void didUpdateWidget( + covariant MyCircularProgressIndicatorWithTimer oldWidget) { + super.didUpdateWidget(oldWidget); + if (widget.isLoading && !oldWidget.isLoading) { + _resetTimer(); + _startTimer(); + } else if (!widget.isLoading && oldWidget.isLoading) { + _cancelTimer(); + } + } + + void _startTimer() { + _cancelTimer(); // Ensure no duplicate timers + _timer = Timer.periodic(const Duration(seconds: 1), (_) { + if (!mounted) return; + setState(() { + if (_timeLeft > 0) { + _timeLeft--; + _isLowTime = _timeLeft <= 10; + } else { + _cancelTimer(); + } + }); + }); + } + + void _resetTimer() { + _cancelTimer(); + setState(() { + _timeLeft = 60; + _isLowTime = false; + }); + } + + void _cancelTimer() { + _timer?.cancel(); + _timer = null; + } + + @override + void dispose() { + _cancelTimer(); + super.dispose(); + } + + @override + Widget build(BuildContext context) { + if (!widget.isLoading) return const SizedBox.shrink(); + + final progress = _timeLeft / 60.0; + final timerColor = _isLowTime ? Colors.orangeAccent : Colors.blueAccent; + + return Center( + child: Container( + width: 200, + height: 200, + decoration: BoxDecoration( + color: widget.backgroundColor == Colors.transparent + ? AppColor.secondaryColor.withOpacity(0.96) + : widget.backgroundColor, + shape: BoxShape.circle, + boxShadow: [ + BoxShadow( + color: Colors.black.withOpacity(0.08), + blurRadius: 24, + spreadRadius: 2, + offset: const Offset(0, 8), + ), + ], + ), + child: Stack( + alignment: Alignment.center, + children: [ + // Elegant circular progress ring + SizedBox( + width: 184, + height: 184, + child: CircularProgressIndicator( + value: progress, + strokeWidth: 6, + backgroundColor: Get.isDarkMode + ? Colors.grey.shade800 + : Colors.grey.shade100, + valueColor: AlwaysStoppedAnimation(timerColor), + strokeCap: StrokeCap.round, + ), + ), + // Center content + Column( + mainAxisSize: MainAxisSize.min, + children: [ + // Subtle scale animation when time is low + AnimatedContainer( + duration: const Duration(milliseconds: 400), + curve: Curves.easeOutCubic, + transform: Matrix4.identity()..scale(_isLowTime ? 1.08 : 1.0), + child: Image.asset( + 'assets/images/logo.gif', + width: 96, + height: 96, + fit: BoxFit.contain, + ), + ), + const SizedBox(height: 14), + // Clean, modern timer text + AnimatedDefaultTextStyle( + duration: const Duration(milliseconds: 300), + curve: Curves.easeOut, + style: TextStyle( + fontSize: 22, + fontWeight: FontWeight.w600, + color: + _isLowTime ? Colors.orangeAccent : AppColor.writeColor, + letterSpacing: 1.2, + fontFeatures: const [FontFeature.tabularFigures()], + ), + child: Text('${_timeLeft}s'), + ), + ], + ), + ], + ), + ), + ); + } +} diff --git a/siro_rider/lib/views/widgets/my_scafold.dart b/siro_rider/lib/views/widgets/my_scafold.dart new file mode 100644 index 0000000..578483b --- /dev/null +++ b/siro_rider/lib/views/widgets/my_scafold.dart @@ -0,0 +1,52 @@ +import 'package:flutter/material.dart'; +import 'package:get/get.dart'; + +import '../../constant/colors.dart'; +import '../../constant/style.dart'; + +class MyScafolld extends StatelessWidget { + const MyScafolld({ + super.key, + required this.title, + required this.body, + this.action, + required this.isleading, + }); + + final String title; + final List body; + final Widget? action; + final bool isleading; + + @override + Widget build(BuildContext context) { + return Scaffold( + backgroundColor: AppColor.secondaryColor, + appBar: AppBar( + backgroundColor: AppColor.secondaryColor, + elevation: 0, + leading: isleading + ? IconButton( + onPressed: () { + Get.back(); + }, + icon: Icon( + Icons.arrow_back_ios_new, + color: AppColor.primaryColor, + ), + ) + : const SizedBox(), + actions: [ + action ?? Icon( + Icons.clear, + color: AppColor.secondaryColor, + ) + ], + title: Text( + title, + style: AppStyle.title.copyWith(fontSize: 30), + ), + ), + body: SafeArea(child: Stack(children: body))); + } +} diff --git a/siro_rider/lib/views/widgets/my_textField.dart b/siro_rider/lib/views/widgets/my_textField.dart new file mode 100644 index 0000000..79f49ae --- /dev/null +++ b/siro_rider/lib/views/widgets/my_textField.dart @@ -0,0 +1,95 @@ +import 'package:flutter/cupertino.dart'; +import 'package:get/get.dart'; +import 'package:get_storage/get_storage.dart'; + +import '../../constant/box_name.dart'; + +class MyTextForm extends StatelessWidget { + const MyTextForm({ + Key? key, + required this.controller, + required this.label, + required this.hint, + required this.type, + }) : super(key: key); + + final TextEditingController controller; + final String label, hint; + final TextInputType type; + + @override + Widget build(BuildContext context) { + return Padding( + padding: const EdgeInsets.only(bottom: 10), + child: SizedBox( + width: Get.width * .8, + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Text( + label.tr, + style: TextStyle( + color: CupertinoColors.label, + fontSize: 16, + fontWeight: FontWeight.w600, + ), + ), + const SizedBox(height: 8), + CupertinoTextField( + controller: controller, + keyboardType: type, + placeholder: hint.tr, + padding: const EdgeInsets.symmetric(horizontal: 16, vertical: 12), + decoration: BoxDecoration( + color: CupertinoColors.systemBackground, + border: Border.all(color: CupertinoColors.systemGrey4), + borderRadius: BorderRadius.circular(8), + ), + style: const TextStyle(color: CupertinoColors.label), + placeholderStyle: + const TextStyle(color: CupertinoColors.placeholderText), + ), + const SizedBox(height: 4), + ValueListenableBuilder( + valueListenable: controller, + builder: (context, value, child) { + String? errorText = _getErrorText(value.text); + return errorText != null + ? Text( + errorText, + style: const TextStyle( + color: CupertinoColors.destructiveRed, + fontSize: 12), + ) + : const SizedBox.shrink(); + }, + ), + ], + ), + ), + ); + } + + String? _getErrorText(String value) { + if (value.isEmpty) { + return '${'Please enter'.tr} $label'.tr; + } + + if (type == TextInputType.emailAddress) { + if (!value.contains('@')) { + return 'Please enter a valid email.'.tr; + } + } else if (type == TextInputType.phone) { + final box = GetStorage(); + if (box.read(BoxName.countryCode) == 'Egypt') { + if (value.length != 11) { + return 'Please enter a valid phone number.'.tr; + } + } else if (value.length != 10) { + return 'Please enter a valid phone number.'.tr; + } + } + + return null; + } +} diff --git a/siro_rider/lib/views/widgets/mycircular.dart b/siro_rider/lib/views/widgets/mycircular.dart new file mode 100644 index 0000000..c0a9d80 --- /dev/null +++ b/siro_rider/lib/views/widgets/mycircular.dart @@ -0,0 +1,132 @@ +import 'package:flutter/material.dart'; + +class MyCircularProgressIndicator extends StatefulWidget { + final Color backgroundColor; + final double size; + final Color progressColor; + final double strokeWidth; + + const MyCircularProgressIndicator({ + super.key, + this.backgroundColor = Colors.transparent, + this.size = 110, + this.progressColor = Colors.blue, + this.strokeWidth = 3.0, + }); + + @override + State createState() => + _MyCircularProgressIndicatorState(); +} + +class _MyCircularProgressIndicatorState + extends State + with SingleTickerProviderStateMixin { + late AnimationController _controller; + late Animation _scaleAnimation; + late Animation _rotationAnimation; + + @override + void initState() { + super.initState(); + _controller = AnimationController( + duration: const Duration(seconds: 2), + vsync: this, + )..repeat(reverse: true); + + _scaleAnimation = Tween( + begin: 0.95, + end: 1.05, + ).animate(CurvedAnimation( + parent: _controller, + curve: Curves.easeInOut, + )); + + _rotationAnimation = Tween( + begin: 0, + end: 2, + ).animate(CurvedAnimation( + parent: _controller, + curve: Curves.linear, + )); + } + + @override + void dispose() { + _controller.dispose(); + super.dispose(); + } + + @override + Widget build(BuildContext context) { + return Center( + child: AnimatedBuilder( + animation: _controller, + builder: (context, child) { + return Transform.scale( + scale: _scaleAnimation.value, + child: Container( + width: widget.size, + height: widget.size, + decoration: BoxDecoration( + color: widget.backgroundColor, + shape: BoxShape.circle, + boxShadow: [ + BoxShadow( + color: widget.progressColor.withAlpha(30), + blurRadius: 12, + spreadRadius: 2, + ), + ], + ), + child: Stack( + alignment: Alignment.center, + children: [ + // Outer rotating progress indicator + Transform.rotate( + angle: _rotationAnimation.value * 3.14, + child: CircularProgressIndicator( + strokeWidth: widget.strokeWidth, + valueColor: AlwaysStoppedAnimation( + widget.progressColor, + ), + ), + ), + // Inner static progress indicator + CircularProgressIndicator( + strokeWidth: widget.strokeWidth * 0.7, + valueColor: AlwaysStoppedAnimation( + widget.progressColor.withAlpha(150), + ), + ), + // Logo container with scale animation + ScaleTransition( + scale: Tween( + begin: 0.9, + end: 1.0, + ).animate(CurvedAnimation( + parent: _controller, + curve: Curves.easeInOut, + )), + child: Container( + width: widget.size * 0.7, + height: widget.size * 0.7, + decoration: BoxDecoration( + shape: BoxShape.circle, + color: widget.backgroundColor, + ), + child: Image.asset( + 'assets/images/logo.gif', + fit: BoxFit.contain, + ), + ), + ), + ], + ), + ), + ); + }, + ), + ); + } +} diff --git a/siro_rider/lib/views/widgets/mydialoug.dart b/siro_rider/lib/views/widgets/mydialoug.dart new file mode 100644 index 0000000..cad3d5f --- /dev/null +++ b/siro_rider/lib/views/widgets/mydialoug.dart @@ -0,0 +1,523 @@ +import 'dart:ui'; +import 'package:flutter/cupertino.dart'; +import 'package:flutter/material.dart'; +import 'package:flutter/services.dart'; +import 'package:get/get.dart'; + +import '../../constant/colors.dart'; +import '../../constant/style.dart'; +import '../../controller/functions/tts.dart'; + +// ───────────────────────────────────────────────────────────────────────────── +// Config +// ───────────────────────────────────────────────────────────────────────────── +class _DC { + static const Duration animDuration = Duration(milliseconds: 280); + static const double blur = 20.0; + static const double radius = 24.0; + static const Color barrierColor = Color(0x66000000); +} + +// ───────────────────────────────────────────────────────────────────────────── +// Shared animated wrapper — every dialog uses this +// ───────────────────────────────────────────────────────────────────────────── +class _DialogShell extends StatelessWidget { + final Widget child; + const _DialogShell({required this.child}); + + @override + Widget build(BuildContext context) { + return TweenAnimationBuilder( + duration: _DC.animDuration, + tween: Tween(begin: 0.0, end: 1.0), + curve: Curves.easeOutBack, + builder: (_, v, c) => Transform.scale( + scale: 0.88 + (0.12 * v), + child: Opacity(opacity: v.clamp(0.0, 1.0), child: c), + ), + child: BackdropFilter( + filter: ImageFilter.blur(sigmaX: _DC.blur, sigmaY: _DC.blur), + child: Dialog( + backgroundColor: Colors.transparent, + insetPadding: + const EdgeInsets.symmetric(horizontal: 28, vertical: 40), + child: child, + ), + ), + ); + } +} + +// ───────────────────────────────────────────────────────────────────────────── +// Shared glass card +// ───────────────────────────────────────────────────────────────────────────── +class _GlassCard extends StatelessWidget { + final Widget child; + const _GlassCard({required this.child}); + + @override + Widget build(BuildContext context) { + return Container( + decoration: BoxDecoration( + borderRadius: BorderRadius.circular(_DC.radius), + gradient: LinearGradient( + colors: [ + AppColor.secondaryColor.withOpacity(0.95), + AppColor.secondaryColor.withOpacity(0.88), + ], + begin: Alignment.topLeft, + end: Alignment.bottomRight, + ), + boxShadow: [ + BoxShadow( + color: Colors.black.withOpacity(0.18), + blurRadius: 40, + spreadRadius: -4, + offset: const Offset(0, 16), + ), + BoxShadow( + color: AppColor.primaryColor.withOpacity(0.08), + blurRadius: 20, + offset: const Offset(0, 4), + ), + ], + border: Border.all( + color: AppColor.secondaryColor.withOpacity(0.6), + width: 1.2, + ), + ), + child: child, + ); + } +} + +// ───────────────────────────────────────────────────────────────────────────── +// Shared bottom action row +// ───────────────────────────────────────────────────────────────────────────── +class _ActionRow extends StatelessWidget { + final VoidCallback onCancel; + final VoidCallback onConfirm; + final String confirmLabel; + final bool isDestructive; + + const _ActionRow({ + required this.onCancel, + required this.onConfirm, + this.confirmLabel = 'OK', + this.isDestructive = false, + }); + + @override + Widget build(BuildContext context) { + return Container( + decoration: BoxDecoration( + border: Border( + top: BorderSide(color: Colors.grey.withOpacity(0.15), width: 1), + ), + ), + child: Row( + children: [ + // Cancel + Expanded( + child: _ActionButton( + label: 'Cancel'.tr, + color: Colors.grey[600]!, + backgroundColor: Colors.grey.withOpacity(0.07), + onPressed: () { + HapticFeedback.lightImpact(); + onCancel(); + }, + isLeft: true, + ), + ), + Container(width: 1, height: 52, color: Colors.grey.withOpacity(0.15)), + // Confirm + Expanded( + child: _ActionButton( + label: confirmLabel, + color: isDestructive ? AppColor.redColor : AppColor.primaryColor, + backgroundColor: isDestructive + ? AppColor.redColor.withOpacity(0.07) + : AppColor.primaryColor.withOpacity(0.07), + onPressed: () { + HapticFeedback.mediumImpact(); + onConfirm(); + }, + isLeft: false, + isBold: true, + ), + ), + ], + ), + ); + } +} + +class _ActionButton extends StatelessWidget { + final String label; + final Color color; + final Color backgroundColor; + final VoidCallback onPressed; + final bool isLeft; + final bool isBold; + + const _ActionButton({ + required this.label, + required this.color, + required this.backgroundColor, + required this.onPressed, + required this.isLeft, + this.isBold = false, + }); + + @override + Widget build(BuildContext context) { + return Material( + color: Colors.transparent, + child: InkWell( + onTap: onPressed, + borderRadius: BorderRadius.only( + bottomLeft: isLeft ? const Radius.circular(_DC.radius) : Radius.zero, + bottomRight: + !isLeft ? const Radius.circular(_DC.radius) : Radius.zero, + ), + child: Container( + height: 52, + decoration: BoxDecoration( + color: backgroundColor, + borderRadius: BorderRadius.only( + bottomLeft: + isLeft ? const Radius.circular(_DC.radius) : Radius.zero, + bottomRight: + !isLeft ? const Radius.circular(_DC.radius) : Radius.zero, + ), + ), + alignment: Alignment.center, + child: Text( + label, + style: TextStyle( + color: color, + fontSize: 15, + fontWeight: isBold ? FontWeight.w700 : FontWeight.w500, + letterSpacing: -0.2, + ), + ), + ), + ), + ); + } +} + +// ───────────────────────────────────────────────────────────────────────────── +// TTS speak button +// ───────────────────────────────────────────────────────────────────────────── +class _SpeakButton extends StatefulWidget { + final List texts; + const _SpeakButton({required this.texts}); + + @override + State<_SpeakButton> createState() => _SpeakButtonState(); +} + +class _SpeakButtonState extends State<_SpeakButton> + with SingleTickerProviderStateMixin { + bool _speaking = false; + late AnimationController _pulse; + + @override + void initState() { + super.initState(); + _pulse = AnimationController( + vsync: this, + duration: const Duration(milliseconds: 900), + lowerBound: 0.92, + upperBound: 1.0, + ); + } + + @override + void dispose() { + _pulse.dispose(); + super.dispose(); + } + + Future _onTap() async { + if (_speaking) return; + HapticFeedback.selectionClick(); + setState(() => _speaking = true); + _pulse.repeat(reverse: true); + + final tts = Get.find(); + for (final t in widget.texts) { + await tts.speakText(t); + } + + _pulse.stop(); + _pulse.reset(); + if (mounted) setState(() => _speaking = false); + } + + @override + Widget build(BuildContext context) { + return GestureDetector( + onTap: _onTap, + child: AnimatedBuilder( + animation: _pulse, + builder: (_, child) => + Transform.scale(scale: _pulse.value, child: child), + child: AnimatedContainer( + duration: const Duration(milliseconds: 250), + padding: const EdgeInsets.symmetric(horizontal: 14, vertical: 8), + decoration: BoxDecoration( + color: _speaking + ? AppColor.primaryColor.withOpacity(0.15) + : AppColor.primaryColor.withOpacity(0.08), + borderRadius: BorderRadius.circular(30), + border: Border.all( + color: AppColor.primaryColor.withOpacity(_speaking ? 0.4 : 0.15), + width: 1, + ), + ), + child: Row( + mainAxisSize: MainAxisSize.min, + children: [ + Icon( + _speaking + ? CupertinoIcons.speaker_3_fill + : CupertinoIcons.speaker_2_fill, + color: AppColor.primaryColor, + size: 16, + ), + const SizedBox(width: 6), + Text( + _speaking ? 'Speaking...'.tr : 'Listen'.tr, + style: TextStyle( + color: AppColor.primaryColor, + fontSize: 12, + fontWeight: FontWeight.w600, + ), + ), + ], + ), + ), + ), + ); + } +} + +// ───────────────────────────────────────────────────────────────────────────── +// MyDialog — title + text content +// ───────────────────────────────────────────────────────────────────────────── +class MyDialog extends GetxController { + void getDialog( + String title, + String? midTitle, + VoidCallback onPressed, { + IconData? icon, + bool isDestructive = false, + }) { + HapticFeedback.mediumImpact(); + + Get.dialog( + Builder(builder: (dialogContext) { + return _DialogShell( + child: _GlassCard( + child: Column( + mainAxisSize: MainAxisSize.min, + children: [ + // ── Body ────────────────────────────────────────────── + Padding( + padding: const EdgeInsets.fromLTRB(24, 28, 24, 20), + child: Column( + children: [ + // Icon badge + Container( + width: 56, + height: 56, + decoration: BoxDecoration( + shape: BoxShape.circle, + color: (isDestructive + ? AppColor.redColor + : AppColor.primaryColor) + .withOpacity(0.1), + border: Border.all( + color: (isDestructive + ? AppColor.redColor + : AppColor.primaryColor) + .withOpacity(0.2), + ), + ), + child: Icon( + icon ?? + (isDestructive + ? Icons.warning_amber_rounded + : Icons.info_outline_rounded), + color: isDestructive + ? AppColor.redColor + : AppColor.primaryColor, + size: 26, + ), + ), + const SizedBox(height: 16), + + // Title + Text( + title, + textAlign: TextAlign.center, + style: AppStyle.title.copyWith( + fontSize: 18, + fontWeight: FontWeight.w700, + letterSpacing: -0.4, + color: AppColor.writeColor, + ), + ), + + if (midTitle != null && midTitle.isNotEmpty) ...[ + const SizedBox(height: 10), + Text( + midTitle, + textAlign: TextAlign.center, + style: AppStyle.subtitle.copyWith( + fontSize: 14.5, + height: 1.5, + color: Colors.grey[600], + ), + ), + const SizedBox(height: 16), + + // TTS button + _SpeakButton( + texts: [title, if (midTitle.isNotEmpty) midTitle]), + ], + ], + ), + ), + + // ── Actions ─────────────────────────────────────────── + _ActionRow( + onCancel: () => + Navigator.of(dialogContext, rootNavigator: true).pop(), + onConfirm: () { + // إغلاق الديالوج مباشرة باستخدام Navigator.pop + Navigator.of(dialogContext, rootNavigator: true).pop(); + // تنفيذ الأمر بعد إغلاق الديالوج + Future.delayed(const Duration(milliseconds: 100), () { + onPressed(); + }); + }, + confirmLabel: 'OK'.tr, + isDestructive: isDestructive, + ), + ], + ), + ), + ); + }), + barrierDismissible: true, + barrierColor: _DC.barrierColor, + ); + } +} + +// ───────────────────────────────────────────────────────────────────────────── +// MyDialogContent — title + arbitrary widget content +// ───────────────────────────────────────────────────────────────────────────── +class MyDialogContent extends GetxController { + void getDialog( + String title, + Widget? content, + VoidCallback onPressed, { + IconData? icon, + bool isDestructive = false, + String confirmLabel = 'OK', + }) { + HapticFeedback.mediumImpact(); + + Get.dialog( + _DialogShell( + child: _GlassCard( + child: Column( + mainAxisSize: MainAxisSize.min, + children: [ + // ── Body ────────────────────────────────────────────── + Padding( + padding: const EdgeInsets.fromLTRB(24, 28, 24, 20), + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + // Header row: icon + title + TTS + Row( + children: [ + Container( + width: 44, + height: 44, + decoration: BoxDecoration( + borderRadius: BorderRadius.circular(12), + color: (isDestructive + ? AppColor.redColor + : AppColor.primaryColor) + .withOpacity(0.1), + ), + child: Icon( + icon ?? + (isDestructive + ? Icons.warning_amber_rounded + : Icons.tune_rounded), + color: isDestructive + ? AppColor.redColor + : AppColor.primaryColor, + size: 22, + ), + ), + const SizedBox(width: 12), + Expanded( + child: Text( + title, + style: AppStyle.title.copyWith( + fontSize: 17, + fontWeight: FontWeight.w700, + letterSpacing: -0.3, + color: AppColor.writeColor, + ), + ), + ), + _SpeakButton(texts: [title]), + ], + ), + + // Divider + Padding( + padding: const EdgeInsets.symmetric(vertical: 16), + child: Divider( + height: 1, + color: Colors.grey.withOpacity(0.15), + ), + ), + + // Content + if (content != null) content, + ], + ), + ), + + // ── Actions ─────────────────────────────────────────── + _ActionRow( + onCancel: () => Get.back(), + onConfirm: () { + Get.back(); // Dismiss dialog first + WidgetsBinding.instance.addPostFrameCallback((_) { + onPressed(); + }); + }, + confirmLabel: confirmLabel.tr, + isDestructive: isDestructive, + ), + ], + ), + ), + ), + barrierDismissible: true, + barrierColor: _DC.barrierColor, + ); + } +} diff --git a/siro_rider/lib/views/widgets/voice_call_bottom_sheet.dart b/siro_rider/lib/views/widgets/voice_call_bottom_sheet.dart new file mode 100644 index 0000000..4752ea7 --- /dev/null +++ b/siro_rider/lib/views/widgets/voice_call_bottom_sheet.dart @@ -0,0 +1,290 @@ +import 'package:flutter/material.dart'; +import 'package:get/get.dart'; + +import '../../constant/colors.dart'; +import '../../constant/style.dart'; +import '../../controller/voice_call_controller.dart'; + +class VoiceCallBottomSheet extends StatelessWidget { + const VoiceCallBottomSheet({Key? key}) : super(key: key); + + @override + Widget build(BuildContext context) { + final controller = Get.find(); + final double screenHeight = MediaQuery.of(context).size.height; + final bool isDark = Theme.of(context).brightness == Brightness.dark; + + // Harmonious curated colors + final Color bgColor = isDark ? const Color(0xFF121212) : Colors.white; + final Color cardColor = isDark ? const Color(0xFF1E1E1E) : const Color(0xFFF5F5F7); + final Color textColor = isDark ? Colors.white : const Color(0xFF1C1C1E); + final Color subTextColor = isDark ? Colors.white70 : Colors.black54; + + return WillPopScope( + onWillPop: () async => false, + child: Container( + height: screenHeight * 0.9, + decoration: BoxDecoration( + color: bgColor, + borderRadius: const BorderRadius.vertical(top: Radius.circular(32)), + boxShadow: [ + BoxShadow( + color: Colors.black.withOpacity(0.2), + blurRadius: 20, + offset: const Offset(0, -5), + ) + ], + ), + child: Obx(() { + final state = controller.state.value; + final seconds = controller.elapsedSeconds.value; + final remoteName = controller.remoteName.value; + final isMuted = controller.isMuted.value; + final isSpeakerOn = controller.isSpeakerOn.value; + + // Progress ring logic + final double progress = seconds / 60.0; + final Color ringColor = seconds > 10 ? const Color(0xFF2ECC71) : const Color(0xFFE74C3C); + + // Status text translations + String statusText = ""; + switch (state) { + case VoiceCallState.dialing: + statusText = "${'Calling'.tr} $remoteName..."; + break; + case VoiceCallState.ringing: + statusText = "${'Captain'.tr} $remoteName ${'is calling you'.tr}..."; + break; + case VoiceCallState.connecting: + statusText = "Connecting...".tr; + break; + case VoiceCallState.active: + statusText = "Call Connected".tr; + break; + case VoiceCallState.ended: + statusText = "Call Ended".tr; + break; + case VoiceCallState.idle: + statusText = ""; + break; + } + + return Column( + children: [ + // Top Drag Handle Indicator + Center( + child: Container( + margin: const EdgeInsets.only(top: 12, bottom: 24), + width: 44, + height: 5, + decoration: BoxDecoration( + color: isDark ? Colors.white24 : Colors.black12, + borderRadius: BorderRadius.circular(10), + ), + ), + ), + + Expanded( + child: Padding( + padding: const EdgeInsets.symmetric(horizontal: 24), + child: Column( + mainAxisAlignment: MainAxisAlignment.spaceEvenly, + children: [ + // Header Info + Column( + children: [ + Text( + "Free Call".tr, + style: TextStyle( + color: ringColor, + fontWeight: FontWeight.w800, + fontSize: 14, + letterSpacing: 1.2, + ), + ), + const SizedBox(height: 8), + Text( + remoteName, + style: TextStyle( + color: textColor, + fontWeight: FontWeight.w900, + fontSize: 26, + ), + textAlign: TextAlign.center, + ), + const SizedBox(height: 8), + Text( + statusText, + style: TextStyle( + color: subTextColor, + fontWeight: FontWeight.w600, + fontSize: 16, + ), + ), + ], + ), + + // Avatar & Animated Progress Ring + Stack( + alignment: Alignment.center, + children: [ + // Progress ring around avatar (Active state only) + if (state == VoiceCallState.active) + SizedBox( + width: 172, + height: 172, + child: CircularProgressIndicator( + value: progress, + strokeWidth: 5, + backgroundColor: isDark ? Colors.white10 : Colors.black12, + valueColor: AlwaysStoppedAnimation(ringColor), + ), + ), + + // Main Avatar Card + Container( + width: 150, + height: 150, + decoration: BoxDecoration( + shape: BoxShape.circle, + color: cardColor, + boxShadow: [ + BoxShadow( + color: Colors.black.withOpacity(0.08), + blurRadius: 15, + offset: const Offset(0, 8), + ) + ], + ), + child: Center( + child: remoteName.isNotEmpty + ? Text( + remoteName[0].toUpperCase(), + style: TextStyle( + color: textColor, + fontWeight: FontWeight.bold, + fontSize: 54, + ), + ) + : Icon( + Icons.person, + color: textColor.withOpacity(0.6), + size: 64, + ), + ), + ), + ], + ), + + // Timer Counter Display + if (state == VoiceCallState.active) + Text( + "0:${seconds.toString().padLeft(2, '0')}", + style: TextStyle( + color: seconds > 10 ? textColor : const Color(0xFFE74C3C), + fontWeight: FontWeight.bold, + fontSize: 22, + fontFamily: 'monospace', + ), + ) + else + const SizedBox(height: 24), + + // Action Controls Block + if (state == VoiceCallState.ringing) + // Incoming Ringing Controls: Accept / Decline + Row( + mainAxisAlignment: MainAxisAlignment.spaceEvenly, + children: [ + _buildCircleActionButton( + icon: Icons.call_end_rounded, + color: Colors.white, + bgColor: const Color(0xFFE74C3C), + onTap: () => controller.declineCall(), + label: "Decline".tr, + ), + _buildCircleActionButton( + icon: Icons.call_rounded, + color: Colors.white, + bgColor: const Color(0xFF2ECC71), + onTap: () => controller.acceptCall(), + label: "Accept".tr, + ), + ], + ) + else + // Dialing or Connected Controls: Speaker / Mute / Hangup + Row( + mainAxisAlignment: MainAxisAlignment.spaceEvenly, + children: [ + // Speakerphone toggle + _buildCircleActionButton( + icon: isSpeakerOn ? Icons.volume_up_rounded : Icons.volume_down_rounded, + color: isSpeakerOn ? Colors.white : textColor, + bgColor: isSpeakerOn ? const Color(0xFF2ECC71) : cardColor, + onTap: () => controller.toggleSpeaker(), + label: "Speaker".tr, + ), + // Hangup Call + _buildCircleActionButton( + icon: Icons.call_end_rounded, + color: Colors.white, + bgColor: const Color(0xFFE74C3C), + onTap: () => controller.hangup(), + label: "End".tr, + ), + // Mute Microphone + _buildCircleActionButton( + icon: isMuted ? Icons.mic_off_rounded : Icons.mic_rounded, + color: isMuted ? Colors.white : textColor, + bgColor: isMuted ? const Color(0xFFE74C3C) : cardColor, + onTap: () => controller.toggleMute(), + label: "Mute".tr, + ), + ], + ), + ], + ), + ), + ), + ], + ); + }), + ), + ); +} + + Widget _buildCircleActionButton({ + required IconData icon, + required Color color, + required Color bgColor, + required VoidCallback onTap, + required String label, + }) { + return Column( + mainAxisSize: MainAxisSize.min, + children: [ + ElevatedButton( + onPressed: onTap, + style: ElevatedButton.styleFrom( + shape: const CircleBorder(), + padding: const EdgeInsets.all(18), + backgroundColor: bgColor, + foregroundColor: color, + elevation: 2, + ), + child: Icon(icon, size: 28), + ), + const SizedBox(height: 8), + Text( + label, + style: const TextStyle( + fontSize: 12, + fontWeight: FontWeight.bold, + color: Colors.grey, + ), + ), + ], + ); + } +} diff --git a/siro_rider/linux/.gitignore b/siro_rider/linux/.gitignore new file mode 100644 index 0000000..d3896c9 --- /dev/null +++ b/siro_rider/linux/.gitignore @@ -0,0 +1 @@ +flutter/ephemeral diff --git a/siro_rider/linux/CMakeLists.txt b/siro_rider/linux/CMakeLists.txt new file mode 100644 index 0000000..e89ed3c --- /dev/null +++ b/siro_rider/linux/CMakeLists.txt @@ -0,0 +1,128 @@ +# Project-level configuration. +cmake_minimum_required(VERSION 3.13) +project(runner LANGUAGES CXX) + +# The name of the executable created for the application. Change this to change +# the on-disk name of your application. +set(BINARY_NAME "siro_rider") +# The unique GTK application identifier for this application. See: +# https://wiki.gnome.org/HowDoI/ChooseApplicationID +set(APPLICATION_ID "com.siro.siro_rider") + +# Explicitly opt in to modern CMake behaviors to avoid warnings with recent +# versions of CMake. +cmake_policy(SET CMP0063 NEW) + +# Load bundled libraries from the lib/ directory relative to the binary. +set(CMAKE_INSTALL_RPATH "$ORIGIN/lib") + +# Root filesystem for cross-building. +if(FLUTTER_TARGET_PLATFORM_SYSROOT) + set(CMAKE_SYSROOT ${FLUTTER_TARGET_PLATFORM_SYSROOT}) + set(CMAKE_FIND_ROOT_PATH ${CMAKE_SYSROOT}) + set(CMAKE_FIND_ROOT_PATH_MODE_PROGRAM NEVER) + set(CMAKE_FIND_ROOT_PATH_MODE_PACKAGE ONLY) + set(CMAKE_FIND_ROOT_PATH_MODE_LIBRARY ONLY) + set(CMAKE_FIND_ROOT_PATH_MODE_INCLUDE ONLY) +endif() + +# Define build configuration options. +if(NOT CMAKE_BUILD_TYPE AND NOT CMAKE_CONFIGURATION_TYPES) + set(CMAKE_BUILD_TYPE "Debug" CACHE + STRING "Flutter build mode" FORCE) + set_property(CACHE CMAKE_BUILD_TYPE PROPERTY STRINGS + "Debug" "Profile" "Release") +endif() + +# Compilation settings that should be applied to most targets. +# +# Be cautious about adding new options here, as plugins use this function by +# default. In most cases, you should add new options to specific targets instead +# of modifying this function. +function(APPLY_STANDARD_SETTINGS TARGET) + target_compile_features(${TARGET} PUBLIC cxx_std_14) + target_compile_options(${TARGET} PRIVATE -Wall -Werror) + target_compile_options(${TARGET} PRIVATE "$<$>:-O3>") + target_compile_definitions(${TARGET} PRIVATE "$<$>:NDEBUG>") +endfunction() + +# Flutter library and tool build rules. +set(FLUTTER_MANAGED_DIR "${CMAKE_CURRENT_SOURCE_DIR}/flutter") +add_subdirectory(${FLUTTER_MANAGED_DIR}) + +# System-level dependencies. +find_package(PkgConfig REQUIRED) +pkg_check_modules(GTK REQUIRED IMPORTED_TARGET gtk+-3.0) + +# Application build; see runner/CMakeLists.txt. +add_subdirectory("runner") + +# Run the Flutter tool portions of the build. This must not be removed. +add_dependencies(${BINARY_NAME} flutter_assemble) + +# Only the install-generated bundle's copy of the executable will launch +# correctly, since the resources must in the right relative locations. To avoid +# people trying to run the unbundled copy, put it in a subdirectory instead of +# the default top-level location. +set_target_properties(${BINARY_NAME} + PROPERTIES + RUNTIME_OUTPUT_DIRECTORY "${CMAKE_BINARY_DIR}/intermediates_do_not_run" +) + + +# Generated plugin build rules, which manage building the plugins and adding +# them to the application. +include(flutter/generated_plugins.cmake) + + +# === Installation === +# By default, "installing" just makes a relocatable bundle in the build +# directory. +set(BUILD_BUNDLE_DIR "${PROJECT_BINARY_DIR}/bundle") +if(CMAKE_INSTALL_PREFIX_INITIALIZED_TO_DEFAULT) + set(CMAKE_INSTALL_PREFIX "${BUILD_BUNDLE_DIR}" CACHE PATH "..." FORCE) +endif() + +# Start with a clean build bundle directory every time. +install(CODE " + file(REMOVE_RECURSE \"${BUILD_BUNDLE_DIR}/\") + " COMPONENT Runtime) + +set(INSTALL_BUNDLE_DATA_DIR "${CMAKE_INSTALL_PREFIX}/data") +set(INSTALL_BUNDLE_LIB_DIR "${CMAKE_INSTALL_PREFIX}/lib") + +install(TARGETS ${BINARY_NAME} RUNTIME DESTINATION "${CMAKE_INSTALL_PREFIX}" + COMPONENT Runtime) + +install(FILES "${FLUTTER_ICU_DATA_FILE}" DESTINATION "${INSTALL_BUNDLE_DATA_DIR}" + COMPONENT Runtime) + +install(FILES "${FLUTTER_LIBRARY}" DESTINATION "${INSTALL_BUNDLE_LIB_DIR}" + COMPONENT Runtime) + +foreach(bundled_library ${PLUGIN_BUNDLED_LIBRARIES}) + install(FILES "${bundled_library}" + DESTINATION "${INSTALL_BUNDLE_LIB_DIR}" + COMPONENT Runtime) +endforeach(bundled_library) + +# Copy the native assets provided by the build.dart from all packages. +set(NATIVE_ASSETS_DIR "${PROJECT_BUILD_DIR}native_assets/linux/") +install(DIRECTORY "${NATIVE_ASSETS_DIR}" + DESTINATION "${INSTALL_BUNDLE_LIB_DIR}" + COMPONENT Runtime) + +# Fully re-copy the assets directory on each build to avoid having stale files +# from a previous install. +set(FLUTTER_ASSET_DIR_NAME "flutter_assets") +install(CODE " + file(REMOVE_RECURSE \"${INSTALL_BUNDLE_DATA_DIR}/${FLUTTER_ASSET_DIR_NAME}\") + " COMPONENT Runtime) +install(DIRECTORY "${PROJECT_BUILD_DIR}/${FLUTTER_ASSET_DIR_NAME}" + DESTINATION "${INSTALL_BUNDLE_DATA_DIR}" COMPONENT Runtime) + +# Install the AOT library on non-Debug builds only. +if(NOT CMAKE_BUILD_TYPE MATCHES "Debug") + install(FILES "${AOT_LIBRARY}" DESTINATION "${INSTALL_BUNDLE_LIB_DIR}" + COMPONENT Runtime) +endif() diff --git a/siro_rider/linux/flutter/CMakeLists.txt b/siro_rider/linux/flutter/CMakeLists.txt new file mode 100644 index 0000000..d5bd016 --- /dev/null +++ b/siro_rider/linux/flutter/CMakeLists.txt @@ -0,0 +1,88 @@ +# This file controls Flutter-level build steps. It should not be edited. +cmake_minimum_required(VERSION 3.10) + +set(EPHEMERAL_DIR "${CMAKE_CURRENT_SOURCE_DIR}/ephemeral") + +# Configuration provided via flutter tool. +include(${EPHEMERAL_DIR}/generated_config.cmake) + +# TODO: Move the rest of this into files in ephemeral. See +# https://github.com/flutter/flutter/issues/57146. + +# Serves the same purpose as list(TRANSFORM ... PREPEND ...), +# which isn't available in 3.10. +function(list_prepend LIST_NAME PREFIX) + set(NEW_LIST "") + foreach(element ${${LIST_NAME}}) + list(APPEND NEW_LIST "${PREFIX}${element}") + endforeach(element) + set(${LIST_NAME} "${NEW_LIST}" PARENT_SCOPE) +endfunction() + +# === Flutter Library === +# System-level dependencies. +find_package(PkgConfig REQUIRED) +pkg_check_modules(GTK REQUIRED IMPORTED_TARGET gtk+-3.0) +pkg_check_modules(GLIB REQUIRED IMPORTED_TARGET glib-2.0) +pkg_check_modules(GIO REQUIRED IMPORTED_TARGET gio-2.0) + +set(FLUTTER_LIBRARY "${EPHEMERAL_DIR}/libflutter_linux_gtk.so") + +# Published to parent scope for install step. +set(FLUTTER_LIBRARY ${FLUTTER_LIBRARY} PARENT_SCOPE) +set(FLUTTER_ICU_DATA_FILE "${EPHEMERAL_DIR}/icudtl.dat" PARENT_SCOPE) +set(PROJECT_BUILD_DIR "${PROJECT_DIR}/build/" PARENT_SCOPE) +set(AOT_LIBRARY "${PROJECT_DIR}/build/lib/libapp.so" PARENT_SCOPE) + +list(APPEND FLUTTER_LIBRARY_HEADERS + "fl_basic_message_channel.h" + "fl_binary_codec.h" + "fl_binary_messenger.h" + "fl_dart_project.h" + "fl_engine.h" + "fl_json_message_codec.h" + "fl_json_method_codec.h" + "fl_message_codec.h" + "fl_method_call.h" + "fl_method_channel.h" + "fl_method_codec.h" + "fl_method_response.h" + "fl_plugin_registrar.h" + "fl_plugin_registry.h" + "fl_standard_message_codec.h" + "fl_standard_method_codec.h" + "fl_string_codec.h" + "fl_value.h" + "fl_view.h" + "flutter_linux.h" +) +list_prepend(FLUTTER_LIBRARY_HEADERS "${EPHEMERAL_DIR}/flutter_linux/") +add_library(flutter INTERFACE) +target_include_directories(flutter INTERFACE + "${EPHEMERAL_DIR}" +) +target_link_libraries(flutter INTERFACE "${FLUTTER_LIBRARY}") +target_link_libraries(flutter INTERFACE + PkgConfig::GTK + PkgConfig::GLIB + PkgConfig::GIO +) +add_dependencies(flutter flutter_assemble) + +# === Flutter tool backend === +# _phony_ is a non-existent file to force this command to run every time, +# since currently there's no way to get a full input/output list from the +# flutter tool. +add_custom_command( + OUTPUT ${FLUTTER_LIBRARY} ${FLUTTER_LIBRARY_HEADERS} + ${CMAKE_CURRENT_BINARY_DIR}/_phony_ + COMMAND ${CMAKE_COMMAND} -E env + ${FLUTTER_TOOL_ENVIRONMENT} + "${FLUTTER_ROOT}/packages/flutter_tools/bin/tool_backend.sh" + ${FLUTTER_TARGET_PLATFORM} ${CMAKE_BUILD_TYPE} + VERBATIM +) +add_custom_target(flutter_assemble DEPENDS + "${FLUTTER_LIBRARY}" + ${FLUTTER_LIBRARY_HEADERS} +) diff --git a/siro_rider/linux/flutter/generated_plugin_registrant.cc b/siro_rider/linux/flutter/generated_plugin_registrant.cc new file mode 100644 index 0000000..2927771 --- /dev/null +++ b/siro_rider/linux/flutter/generated_plugin_registrant.cc @@ -0,0 +1,35 @@ +// +// Generated file. Do not edit. +// + +// clang-format off + +#include "generated_plugin_registrant.h" + +#include +#include +#include +#include +#include +#include + +void fl_register_plugins(FlPluginRegistry* registry) { + g_autoptr(FlPluginRegistrar) file_selector_linux_registrar = + fl_plugin_registry_get_registrar_for_plugin(registry, "FileSelectorPlugin"); + file_selector_plugin_register_with_registrar(file_selector_linux_registrar); + g_autoptr(FlPluginRegistrar) flutter_secure_storage_linux_registrar = + fl_plugin_registry_get_registrar_for_plugin(registry, "FlutterSecureStorageLinuxPlugin"); + flutter_secure_storage_linux_plugin_register_with_registrar(flutter_secure_storage_linux_registrar); + g_autoptr(FlPluginRegistrar) flutter_webrtc_registrar = + fl_plugin_registry_get_registrar_for_plugin(registry, "FlutterWebRTCPlugin"); + flutter_web_r_t_c_plugin_register_with_registrar(flutter_webrtc_registrar); + g_autoptr(FlPluginRegistrar) gtk_registrar = + fl_plugin_registry_get_registrar_for_plugin(registry, "GtkPlugin"); + gtk_plugin_register_with_registrar(gtk_registrar); + g_autoptr(FlPluginRegistrar) record_linux_registrar = + fl_plugin_registry_get_registrar_for_plugin(registry, "RecordLinuxPlugin"); + record_linux_plugin_register_with_registrar(record_linux_registrar); + g_autoptr(FlPluginRegistrar) url_launcher_linux_registrar = + fl_plugin_registry_get_registrar_for_plugin(registry, "UrlLauncherPlugin"); + url_launcher_plugin_register_with_registrar(url_launcher_linux_registrar); +} diff --git a/siro_rider/linux/flutter/generated_plugin_registrant.h b/siro_rider/linux/flutter/generated_plugin_registrant.h new file mode 100644 index 0000000..e0f0a47 --- /dev/null +++ b/siro_rider/linux/flutter/generated_plugin_registrant.h @@ -0,0 +1,15 @@ +// +// Generated file. Do not edit. +// + +// clang-format off + +#ifndef GENERATED_PLUGIN_REGISTRANT_ +#define GENERATED_PLUGIN_REGISTRANT_ + +#include + +// Registers Flutter plugins. +void fl_register_plugins(FlPluginRegistry* registry); + +#endif // GENERATED_PLUGIN_REGISTRANT_ diff --git a/siro_rider/linux/flutter/generated_plugins.cmake b/siro_rider/linux/flutter/generated_plugins.cmake new file mode 100644 index 0000000..eea2659 --- /dev/null +++ b/siro_rider/linux/flutter/generated_plugins.cmake @@ -0,0 +1,30 @@ +# +# Generated file, do not edit. +# + +list(APPEND FLUTTER_PLUGIN_LIST + file_selector_linux + flutter_secure_storage_linux + flutter_webrtc + gtk + record_linux + url_launcher_linux +) + +list(APPEND FLUTTER_FFI_PLUGIN_LIST + jni +) + +set(PLUGIN_BUNDLED_LIBRARIES) + +foreach(plugin ${FLUTTER_PLUGIN_LIST}) + add_subdirectory(flutter/ephemeral/.plugin_symlinks/${plugin}/linux plugins/${plugin}) + target_link_libraries(${BINARY_NAME} PRIVATE ${plugin}_plugin) + list(APPEND PLUGIN_BUNDLED_LIBRARIES $) + list(APPEND PLUGIN_BUNDLED_LIBRARIES ${${plugin}_bundled_libraries}) +endforeach(plugin) + +foreach(ffi_plugin ${FLUTTER_FFI_PLUGIN_LIST}) + add_subdirectory(flutter/ephemeral/.plugin_symlinks/${ffi_plugin}/linux plugins/${ffi_plugin}) + list(APPEND PLUGIN_BUNDLED_LIBRARIES ${${ffi_plugin}_bundled_libraries}) +endforeach(ffi_plugin) diff --git a/siro_rider/linux/runner/CMakeLists.txt b/siro_rider/linux/runner/CMakeLists.txt new file mode 100644 index 0000000..e97dabc --- /dev/null +++ b/siro_rider/linux/runner/CMakeLists.txt @@ -0,0 +1,26 @@ +cmake_minimum_required(VERSION 3.13) +project(runner LANGUAGES CXX) + +# Define the application target. To change its name, change BINARY_NAME in the +# top-level CMakeLists.txt, not the value here, or `flutter run` will no longer +# work. +# +# Any new source files that you add to the application should be added here. +add_executable(${BINARY_NAME} + "main.cc" + "my_application.cc" + "${FLUTTER_MANAGED_DIR}/generated_plugin_registrant.cc" +) + +# Apply the standard set of build settings. This can be removed for applications +# that need different build settings. +apply_standard_settings(${BINARY_NAME}) + +# Add preprocessor definitions for the application ID. +add_definitions(-DAPPLICATION_ID="${APPLICATION_ID}") + +# Add dependency libraries. Add any application-specific dependencies here. +target_link_libraries(${BINARY_NAME} PRIVATE flutter) +target_link_libraries(${BINARY_NAME} PRIVATE PkgConfig::GTK) + +target_include_directories(${BINARY_NAME} PRIVATE "${CMAKE_SOURCE_DIR}") diff --git a/siro_rider/linux/runner/main.cc b/siro_rider/linux/runner/main.cc new file mode 100644 index 0000000..e7c5c54 --- /dev/null +++ b/siro_rider/linux/runner/main.cc @@ -0,0 +1,6 @@ +#include "my_application.h" + +int main(int argc, char** argv) { + g_autoptr(MyApplication) app = my_application_new(); + return g_application_run(G_APPLICATION(app), argc, argv); +} diff --git a/siro_rider/linux/runner/my_application.cc b/siro_rider/linux/runner/my_application.cc new file mode 100644 index 0000000..3ec65d1 --- /dev/null +++ b/siro_rider/linux/runner/my_application.cc @@ -0,0 +1,148 @@ +#include "my_application.h" + +#include +#ifdef GDK_WINDOWING_X11 +#include +#endif + +#include "flutter/generated_plugin_registrant.h" + +struct _MyApplication { + GtkApplication parent_instance; + char** dart_entrypoint_arguments; +}; + +G_DEFINE_TYPE(MyApplication, my_application, GTK_TYPE_APPLICATION) + +// Called when first Flutter frame received. +static void first_frame_cb(MyApplication* self, FlView* view) { + gtk_widget_show(gtk_widget_get_toplevel(GTK_WIDGET(view))); +} + +// Implements GApplication::activate. +static void my_application_activate(GApplication* application) { + MyApplication* self = MY_APPLICATION(application); + GtkWindow* window = + GTK_WINDOW(gtk_application_window_new(GTK_APPLICATION(application))); + + // Use a header bar when running in GNOME as this is the common style used + // by applications and is the setup most users will be using (e.g. Ubuntu + // desktop). + // If running on X and not using GNOME then just use a traditional title bar + // in case the window manager does more exotic layout, e.g. tiling. + // If running on Wayland assume the header bar will work (may need changing + // if future cases occur). + gboolean use_header_bar = TRUE; +#ifdef GDK_WINDOWING_X11 + GdkScreen* screen = gtk_window_get_screen(window); + if (GDK_IS_X11_SCREEN(screen)) { + const gchar* wm_name = gdk_x11_screen_get_window_manager_name(screen); + if (g_strcmp0(wm_name, "GNOME Shell") != 0) { + use_header_bar = FALSE; + } + } +#endif + if (use_header_bar) { + GtkHeaderBar* header_bar = GTK_HEADER_BAR(gtk_header_bar_new()); + gtk_widget_show(GTK_WIDGET(header_bar)); + gtk_header_bar_set_title(header_bar, "siro_rider"); + gtk_header_bar_set_show_close_button(header_bar, TRUE); + gtk_window_set_titlebar(window, GTK_WIDGET(header_bar)); + } else { + gtk_window_set_title(window, "siro_rider"); + } + + gtk_window_set_default_size(window, 1280, 720); + + g_autoptr(FlDartProject) project = fl_dart_project_new(); + fl_dart_project_set_dart_entrypoint_arguments( + project, self->dart_entrypoint_arguments); + + FlView* view = fl_view_new(project); + GdkRGBA background_color; + // Background defaults to black, override it here if necessary, e.g. #00000000 + // for transparent. + gdk_rgba_parse(&background_color, "#000000"); + fl_view_set_background_color(view, &background_color); + gtk_widget_show(GTK_WIDGET(view)); + gtk_container_add(GTK_CONTAINER(window), GTK_WIDGET(view)); + + // Show the window when Flutter renders. + // Requires the view to be realized so we can start rendering. + g_signal_connect_swapped(view, "first-frame", G_CALLBACK(first_frame_cb), + self); + gtk_widget_realize(GTK_WIDGET(view)); + + fl_register_plugins(FL_PLUGIN_REGISTRY(view)); + + gtk_widget_grab_focus(GTK_WIDGET(view)); +} + +// Implements GApplication::local_command_line. +static gboolean my_application_local_command_line(GApplication* application, + gchar*** arguments, + int* exit_status) { + MyApplication* self = MY_APPLICATION(application); + // Strip out the first argument as it is the binary name. + self->dart_entrypoint_arguments = g_strdupv(*arguments + 1); + + g_autoptr(GError) error = nullptr; + if (!g_application_register(application, nullptr, &error)) { + g_warning("Failed to register: %s", error->message); + *exit_status = 1; + return TRUE; + } + + g_application_activate(application); + *exit_status = 0; + + return TRUE; +} + +// Implements GApplication::startup. +static void my_application_startup(GApplication* application) { + // MyApplication* self = MY_APPLICATION(object); + + // Perform any actions required at application startup. + + G_APPLICATION_CLASS(my_application_parent_class)->startup(application); +} + +// Implements GApplication::shutdown. +static void my_application_shutdown(GApplication* application) { + // MyApplication* self = MY_APPLICATION(object); + + // Perform any actions required at application shutdown. + + G_APPLICATION_CLASS(my_application_parent_class)->shutdown(application); +} + +// Implements GObject::dispose. +static void my_application_dispose(GObject* object) { + MyApplication* self = MY_APPLICATION(object); + g_clear_pointer(&self->dart_entrypoint_arguments, g_strfreev); + G_OBJECT_CLASS(my_application_parent_class)->dispose(object); +} + +static void my_application_class_init(MyApplicationClass* klass) { + G_APPLICATION_CLASS(klass)->activate = my_application_activate; + G_APPLICATION_CLASS(klass)->local_command_line = + my_application_local_command_line; + G_APPLICATION_CLASS(klass)->startup = my_application_startup; + G_APPLICATION_CLASS(klass)->shutdown = my_application_shutdown; + G_OBJECT_CLASS(klass)->dispose = my_application_dispose; +} + +static void my_application_init(MyApplication* self) {} + +MyApplication* my_application_new() { + // Set the program name to the application ID, which helps various systems + // like GTK and desktop environments map this running application to its + // corresponding .desktop file. This ensures better integration by allowing + // the application to be recognized beyond its binary name. + g_set_prgname(APPLICATION_ID); + + return MY_APPLICATION(g_object_new(my_application_get_type(), + "application-id", APPLICATION_ID, "flags", + G_APPLICATION_NON_UNIQUE, nullptr)); +} diff --git a/siro_rider/linux/runner/my_application.h b/siro_rider/linux/runner/my_application.h new file mode 100644 index 0000000..db16367 --- /dev/null +++ b/siro_rider/linux/runner/my_application.h @@ -0,0 +1,21 @@ +#ifndef FLUTTER_MY_APPLICATION_H_ +#define FLUTTER_MY_APPLICATION_H_ + +#include + +G_DECLARE_FINAL_TYPE(MyApplication, + my_application, + MY, + APPLICATION, + GtkApplication) + +/** + * my_application_new: + * + * Creates a new Flutter-based application. + * + * Returns: a new #MyApplication. + */ +MyApplication* my_application_new(); + +#endif // FLUTTER_MY_APPLICATION_H_ diff --git a/siro_rider/macos/.gitignore b/siro_rider/macos/.gitignore new file mode 100644 index 0000000..746adbb --- /dev/null +++ b/siro_rider/macos/.gitignore @@ -0,0 +1,7 @@ +# Flutter-related +**/Flutter/ephemeral/ +**/Pods/ + +# Xcode-related +**/dgph +**/xcuserdata/ diff --git a/siro_rider/macos/Flutter/Flutter-Debug.xcconfig b/siro_rider/macos/Flutter/Flutter-Debug.xcconfig new file mode 100644 index 0000000..4b81f9b --- /dev/null +++ b/siro_rider/macos/Flutter/Flutter-Debug.xcconfig @@ -0,0 +1,2 @@ +#include? "Pods/Target Support Files/Pods-Runner/Pods-Runner.debug.xcconfig" +#include "ephemeral/Flutter-Generated.xcconfig" diff --git a/siro_rider/macos/Flutter/Flutter-Release.xcconfig b/siro_rider/macos/Flutter/Flutter-Release.xcconfig new file mode 100644 index 0000000..5caa9d1 --- /dev/null +++ b/siro_rider/macos/Flutter/Flutter-Release.xcconfig @@ -0,0 +1,2 @@ +#include? "Pods/Target Support Files/Pods-Runner/Pods-Runner.release.xcconfig" +#include "ephemeral/Flutter-Generated.xcconfig" diff --git a/siro_rider/macos/Flutter/GeneratedPluginRegistrant.swift b/siro_rider/macos/Flutter/GeneratedPluginRegistrant.swift new file mode 100644 index 0000000..9b584d9 --- /dev/null +++ b/siro_rider/macos/Flutter/GeneratedPluginRegistrant.swift @@ -0,0 +1,64 @@ +// +// Generated file. Do not edit. +// + +import FlutterMacOS +import Foundation + +import app_links +import audio_session +import connectivity_plus +import device_info_plus +import file_selector_macos +import firebase_auth +import firebase_core +import firebase_messaging +import flutter_app_group_directory +import flutter_local_notifications +import flutter_secure_storage_darwin +import flutter_tts +import flutter_webrtc +import geolocator_apple +import google_sign_in_ios +import just_audio +import local_auth_darwin +import location +import package_info_plus +import record_macos +import share_plus +import sign_in_with_apple +import sqflite_darwin +import url_launcher_macos +import video_player_avfoundation +import wakelock_plus +import webview_flutter_wkwebview + +func RegisterGeneratedPlugins(registry: FlutterPluginRegistry) { + AppLinksMacosPlugin.register(with: registry.registrar(forPlugin: "AppLinksMacosPlugin")) + AudioSessionPlugin.register(with: registry.registrar(forPlugin: "AudioSessionPlugin")) + ConnectivityPlusPlugin.register(with: registry.registrar(forPlugin: "ConnectivityPlusPlugin")) + DeviceInfoPlusMacosPlugin.register(with: registry.registrar(forPlugin: "DeviceInfoPlusMacosPlugin")) + FileSelectorPlugin.register(with: registry.registrar(forPlugin: "FileSelectorPlugin")) + FLTFirebaseAuthPlugin.register(with: registry.registrar(forPlugin: "FLTFirebaseAuthPlugin")) + FLTFirebaseCorePlugin.register(with: registry.registrar(forPlugin: "FLTFirebaseCorePlugin")) + FLTFirebaseMessagingPlugin.register(with: registry.registrar(forPlugin: "FLTFirebaseMessagingPlugin")) + FlutterAppGroupDirectoryPlugin.register(with: registry.registrar(forPlugin: "FlutterAppGroupDirectoryPlugin")) + FlutterLocalNotificationsPlugin.register(with: registry.registrar(forPlugin: "FlutterLocalNotificationsPlugin")) + FlutterSecureStorageDarwinPlugin.register(with: registry.registrar(forPlugin: "FlutterSecureStorageDarwinPlugin")) + FlutterTtsPlugin.register(with: registry.registrar(forPlugin: "FlutterTtsPlugin")) + FlutterWebRTCPlugin.register(with: registry.registrar(forPlugin: "FlutterWebRTCPlugin")) + GeolocatorPlugin.register(with: registry.registrar(forPlugin: "GeolocatorPlugin")) + FLTGoogleSignInPlugin.register(with: registry.registrar(forPlugin: "FLTGoogleSignInPlugin")) + JustAudioPlugin.register(with: registry.registrar(forPlugin: "JustAudioPlugin")) + LocalAuthPlugin.register(with: registry.registrar(forPlugin: "LocalAuthPlugin")) + LocationPlugin.register(with: registry.registrar(forPlugin: "LocationPlugin")) + FPPPackageInfoPlusPlugin.register(with: registry.registrar(forPlugin: "FPPPackageInfoPlusPlugin")) + RecordMacOsPlugin.register(with: registry.registrar(forPlugin: "RecordMacOsPlugin")) + SharePlusMacosPlugin.register(with: registry.registrar(forPlugin: "SharePlusMacosPlugin")) + SignInWithApplePlugin.register(with: registry.registrar(forPlugin: "SignInWithApplePlugin")) + SqflitePlugin.register(with: registry.registrar(forPlugin: "SqflitePlugin")) + UrlLauncherPlugin.register(with: registry.registrar(forPlugin: "UrlLauncherPlugin")) + VideoPlayerPlugin.register(with: registry.registrar(forPlugin: "VideoPlayerPlugin")) + WakelockPlusMacosPlugin.register(with: registry.registrar(forPlugin: "WakelockPlusMacosPlugin")) + WebViewFlutterPlugin.register(with: registry.registrar(forPlugin: "WebViewFlutterPlugin")) +} diff --git a/siro_rider/macos/Podfile b/siro_rider/macos/Podfile new file mode 100644 index 0000000..ff5ddb3 --- /dev/null +++ b/siro_rider/macos/Podfile @@ -0,0 +1,42 @@ +platform :osx, '10.15' + +# CocoaPods analytics sends network stats synchronously affecting flutter build latency. +ENV['COCOAPODS_DISABLE_STATS'] = 'true' + +project 'Runner', { + 'Debug' => :debug, + 'Profile' => :release, + 'Release' => :release, +} + +def flutter_root + generated_xcode_build_settings_path = File.expand_path(File.join('..', 'Flutter', 'ephemeral', 'Flutter-Generated.xcconfig'), __FILE__) + unless File.exist?(generated_xcode_build_settings_path) + raise "#{generated_xcode_build_settings_path} must exist. If you're running pod install manually, make sure \"flutter pub get\" is executed first" + end + + File.foreach(generated_xcode_build_settings_path) do |line| + matches = line.match(/FLUTTER_ROOT\=(.*)/) + return matches[1].strip if matches + end + raise "FLUTTER_ROOT not found in #{generated_xcode_build_settings_path}. Try deleting Flutter-Generated.xcconfig, then run \"flutter pub get\"" +end + +require File.expand_path(File.join('packages', 'flutter_tools', 'bin', 'podhelper'), flutter_root) + +flutter_macos_podfile_setup + +target 'Runner' do + use_frameworks! + + flutter_install_all_macos_pods File.dirname(File.realpath(__FILE__)) + target 'RunnerTests' do + inherit! :search_paths + end +end + +post_install do |installer| + installer.pods_project.targets.each do |target| + flutter_additional_macos_build_settings(target) + end +end diff --git a/siro_rider/macos/Runner.xcodeproj/project.pbxproj b/siro_rider/macos/Runner.xcodeproj/project.pbxproj new file mode 100644 index 0000000..099ce91 --- /dev/null +++ b/siro_rider/macos/Runner.xcodeproj/project.pbxproj @@ -0,0 +1,705 @@ +// !$*UTF8*$! +{ + archiveVersion = 1; + classes = { + }; + objectVersion = 54; + objects = { + +/* Begin PBXAggregateTarget section */ + 33CC111A2044C6BA0003C045 /* Flutter Assemble */ = { + isa = PBXAggregateTarget; + buildConfigurationList = 33CC111B2044C6BA0003C045 /* Build configuration list for PBXAggregateTarget "Flutter Assemble" */; + buildPhases = ( + 33CC111E2044C6BF0003C045 /* ShellScript */, + ); + dependencies = ( + ); + name = "Flutter Assemble"; + productName = FLX; + }; +/* End PBXAggregateTarget section */ + +/* Begin PBXBuildFile section */ + 331C80D8294CF71000263BE5 /* RunnerTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 331C80D7294CF71000263BE5 /* RunnerTests.swift */; }; + 335BBD1B22A9A15E00E9071D /* GeneratedPluginRegistrant.swift in Sources */ = {isa = PBXBuildFile; fileRef = 335BBD1A22A9A15E00E9071D /* GeneratedPluginRegistrant.swift */; }; + 33CC10F12044A3C60003C045 /* AppDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 33CC10F02044A3C60003C045 /* AppDelegate.swift */; }; + 33CC10F32044A3C60003C045 /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 33CC10F22044A3C60003C045 /* Assets.xcassets */; }; + 33CC10F62044A3C60003C045 /* MainMenu.xib in Resources */ = {isa = PBXBuildFile; fileRef = 33CC10F42044A3C60003C045 /* MainMenu.xib */; }; + 33CC11132044BFA00003C045 /* MainFlutterWindow.swift in Sources */ = {isa = PBXBuildFile; fileRef = 33CC11122044BFA00003C045 /* MainFlutterWindow.swift */; }; +/* End PBXBuildFile section */ + +/* Begin PBXContainerItemProxy section */ + 331C80D9294CF71000263BE5 /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = 33CC10E52044A3C60003C045 /* Project object */; + proxyType = 1; + remoteGlobalIDString = 33CC10EC2044A3C60003C045; + remoteInfo = Runner; + }; + 33CC111F2044C79F0003C045 /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = 33CC10E52044A3C60003C045 /* Project object */; + proxyType = 1; + remoteGlobalIDString = 33CC111A2044C6BA0003C045; + remoteInfo = FLX; + }; +/* End PBXContainerItemProxy section */ + +/* Begin PBXCopyFilesBuildPhase section */ + 33CC110E2044A8840003C045 /* Bundle Framework */ = { + isa = PBXCopyFilesBuildPhase; + buildActionMask = 2147483647; + dstPath = ""; + dstSubfolderSpec = 10; + files = ( + ); + name = "Bundle Framework"; + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXCopyFilesBuildPhase section */ + +/* Begin PBXFileReference section */ + 331C80D5294CF71000263BE5 /* RunnerTests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = RunnerTests.xctest; sourceTree = BUILT_PRODUCTS_DIR; }; + 331C80D7294CF71000263BE5 /* RunnerTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = RunnerTests.swift; sourceTree = ""; }; + 333000ED22D3DE5D00554162 /* Warnings.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; path = Warnings.xcconfig; sourceTree = ""; }; + 335BBD1A22A9A15E00E9071D /* GeneratedPluginRegistrant.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = GeneratedPluginRegistrant.swift; sourceTree = ""; }; + 33CC10ED2044A3C60003C045 /* siro_rider.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = "siro_rider.app"; sourceTree = BUILT_PRODUCTS_DIR; }; + 33CC10F02044A3C60003C045 /* AppDelegate.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AppDelegate.swift; sourceTree = ""; }; + 33CC10F22044A3C60003C045 /* Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; name = Assets.xcassets; path = Runner/Assets.xcassets; sourceTree = ""; }; + 33CC10F52044A3C60003C045 /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.xib; name = Base; path = Base.lproj/MainMenu.xib; sourceTree = ""; }; + 33CC10F72044A3C60003C045 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; name = Info.plist; path = Runner/Info.plist; sourceTree = ""; }; + 33CC11122044BFA00003C045 /* MainFlutterWindow.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MainFlutterWindow.swift; sourceTree = ""; }; + 33CEB47222A05771004F2AC0 /* Flutter-Debug.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; path = "Flutter-Debug.xcconfig"; sourceTree = ""; }; + 33CEB47422A05771004F2AC0 /* Flutter-Release.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; path = "Flutter-Release.xcconfig"; sourceTree = ""; }; + 33CEB47722A0578A004F2AC0 /* Flutter-Generated.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; name = "Flutter-Generated.xcconfig"; path = "ephemeral/Flutter-Generated.xcconfig"; sourceTree = ""; }; + 33E51913231747F40026EE4D /* DebugProfile.entitlements */ = {isa = PBXFileReference; lastKnownFileType = text.plist.entitlements; path = DebugProfile.entitlements; sourceTree = ""; }; + 33E51914231749380026EE4D /* Release.entitlements */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.entitlements; path = Release.entitlements; sourceTree = ""; }; + 33E5194F232828860026EE4D /* AppInfo.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; path = AppInfo.xcconfig; sourceTree = ""; }; + 7AFA3C8E1D35360C0083082E /* Release.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; path = Release.xcconfig; sourceTree = ""; }; + 9740EEB21CF90195004384FC /* Debug.xcconfig */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xcconfig; path = Debug.xcconfig; sourceTree = ""; }; +/* End PBXFileReference section */ + +/* Begin PBXFrameworksBuildPhase section */ + 331C80D2294CF70F00263BE5 /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + runOnlyForDeploymentPostprocessing = 0; + }; + 33CC10EA2044A3C60003C045 /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXFrameworksBuildPhase section */ + +/* Begin PBXGroup section */ + 331C80D6294CF71000263BE5 /* RunnerTests */ = { + isa = PBXGroup; + children = ( + 331C80D7294CF71000263BE5 /* RunnerTests.swift */, + ); + path = RunnerTests; + sourceTree = ""; + }; + 33BA886A226E78AF003329D5 /* Configs */ = { + isa = PBXGroup; + children = ( + 33E5194F232828860026EE4D /* AppInfo.xcconfig */, + 9740EEB21CF90195004384FC /* Debug.xcconfig */, + 7AFA3C8E1D35360C0083082E /* Release.xcconfig */, + 333000ED22D3DE5D00554162 /* Warnings.xcconfig */, + ); + path = Configs; + sourceTree = ""; + }; + 33CC10E42044A3C60003C045 = { + isa = PBXGroup; + children = ( + 33FAB671232836740065AC1E /* Runner */, + 33CEB47122A05771004F2AC0 /* Flutter */, + 331C80D6294CF71000263BE5 /* RunnerTests */, + 33CC10EE2044A3C60003C045 /* Products */, + D73912EC22F37F3D000D13A0 /* Frameworks */, + ); + sourceTree = ""; + }; + 33CC10EE2044A3C60003C045 /* Products */ = { + isa = PBXGroup; + children = ( + 33CC10ED2044A3C60003C045 /* siro_rider.app */, + 331C80D5294CF71000263BE5 /* RunnerTests.xctest */, + ); + name = Products; + sourceTree = ""; + }; + 33CC11242044D66E0003C045 /* Resources */ = { + isa = PBXGroup; + children = ( + 33CC10F22044A3C60003C045 /* Assets.xcassets */, + 33CC10F42044A3C60003C045 /* MainMenu.xib */, + 33CC10F72044A3C60003C045 /* Info.plist */, + ); + name = Resources; + path = ..; + sourceTree = ""; + }; + 33CEB47122A05771004F2AC0 /* Flutter */ = { + isa = PBXGroup; + children = ( + 335BBD1A22A9A15E00E9071D /* GeneratedPluginRegistrant.swift */, + 33CEB47222A05771004F2AC0 /* Flutter-Debug.xcconfig */, + 33CEB47422A05771004F2AC0 /* Flutter-Release.xcconfig */, + 33CEB47722A0578A004F2AC0 /* Flutter-Generated.xcconfig */, + ); + path = Flutter; + sourceTree = ""; + }; + 33FAB671232836740065AC1E /* Runner */ = { + isa = PBXGroup; + children = ( + 33CC10F02044A3C60003C045 /* AppDelegate.swift */, + 33CC11122044BFA00003C045 /* MainFlutterWindow.swift */, + 33E51913231747F40026EE4D /* DebugProfile.entitlements */, + 33E51914231749380026EE4D /* Release.entitlements */, + 33CC11242044D66E0003C045 /* Resources */, + 33BA886A226E78AF003329D5 /* Configs */, + ); + path = Runner; + sourceTree = ""; + }; + D73912EC22F37F3D000D13A0 /* Frameworks */ = { + isa = PBXGroup; + children = ( + ); + name = Frameworks; + sourceTree = ""; + }; +/* End PBXGroup section */ + +/* Begin PBXNativeTarget section */ + 331C80D4294CF70F00263BE5 /* RunnerTests */ = { + isa = PBXNativeTarget; + buildConfigurationList = 331C80DE294CF71000263BE5 /* Build configuration list for PBXNativeTarget "RunnerTests" */; + buildPhases = ( + 331C80D1294CF70F00263BE5 /* Sources */, + 331C80D2294CF70F00263BE5 /* Frameworks */, + 331C80D3294CF70F00263BE5 /* Resources */, + ); + buildRules = ( + ); + dependencies = ( + 331C80DA294CF71000263BE5 /* PBXTargetDependency */, + ); + name = RunnerTests; + productName = RunnerTests; + productReference = 331C80D5294CF71000263BE5 /* RunnerTests.xctest */; + productType = "com.apple.product-type.bundle.unit-test"; + }; + 33CC10EC2044A3C60003C045 /* Runner */ = { + isa = PBXNativeTarget; + buildConfigurationList = 33CC10FB2044A3C60003C045 /* Build configuration list for PBXNativeTarget "Runner" */; + buildPhases = ( + 33CC10E92044A3C60003C045 /* Sources */, + 33CC10EA2044A3C60003C045 /* Frameworks */, + 33CC10EB2044A3C60003C045 /* Resources */, + 33CC110E2044A8840003C045 /* Bundle Framework */, + 3399D490228B24CF009A79C7 /* ShellScript */, + ); + buildRules = ( + ); + dependencies = ( + 33CC11202044C79F0003C045 /* PBXTargetDependency */, + ); + name = Runner; + productName = Runner; + productReference = 33CC10ED2044A3C60003C045 /* siro_rider.app */; + productType = "com.apple.product-type.application"; + }; +/* End PBXNativeTarget section */ + +/* Begin PBXProject section */ + 33CC10E52044A3C60003C045 /* Project object */ = { + isa = PBXProject; + attributes = { + BuildIndependentTargetsInParallel = YES; + LastSwiftUpdateCheck = 0920; + LastUpgradeCheck = 1510; + ORGANIZATIONNAME = ""; + TargetAttributes = { + 331C80D4294CF70F00263BE5 = { + CreatedOnToolsVersion = 14.0; + TestTargetID = 33CC10EC2044A3C60003C045; + }; + 33CC10EC2044A3C60003C045 = { + CreatedOnToolsVersion = 9.2; + LastSwiftMigration = 1100; + ProvisioningStyle = Automatic; + SystemCapabilities = { + com.apple.Sandbox = { + enabled = 1; + }; + }; + }; + 33CC111A2044C6BA0003C045 = { + CreatedOnToolsVersion = 9.2; + ProvisioningStyle = Manual; + }; + }; + }; + buildConfigurationList = 33CC10E82044A3C60003C045 /* Build configuration list for PBXProject "Runner" */; + compatibilityVersion = "Xcode 9.3"; + developmentRegion = en; + hasScannedForEncodings = 0; + knownRegions = ( + en, + Base, + ); + mainGroup = 33CC10E42044A3C60003C045; + productRefGroup = 33CC10EE2044A3C60003C045 /* Products */; + projectDirPath = ""; + projectRoot = ""; + targets = ( + 33CC10EC2044A3C60003C045 /* Runner */, + 331C80D4294CF70F00263BE5 /* RunnerTests */, + 33CC111A2044C6BA0003C045 /* Flutter Assemble */, + ); + }; +/* End PBXProject section */ + +/* Begin PBXResourcesBuildPhase section */ + 331C80D3294CF70F00263BE5 /* Resources */ = { + isa = PBXResourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + runOnlyForDeploymentPostprocessing = 0; + }; + 33CC10EB2044A3C60003C045 /* Resources */ = { + isa = PBXResourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + 33CC10F32044A3C60003C045 /* Assets.xcassets in Resources */, + 33CC10F62044A3C60003C045 /* MainMenu.xib in Resources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXResourcesBuildPhase section */ + +/* Begin PBXShellScriptBuildPhase section */ + 3399D490228B24CF009A79C7 /* ShellScript */ = { + isa = PBXShellScriptBuildPhase; + alwaysOutOfDate = 1; + buildActionMask = 2147483647; + files = ( + ); + inputFileListPaths = ( + ); + inputPaths = ( + ); + outputFileListPaths = ( + ); + outputPaths = ( + ); + runOnlyForDeploymentPostprocessing = 0; + shellPath = /bin/sh; + shellScript = "echo \"$PRODUCT_NAME.app\" > \"$PROJECT_DIR\"/Flutter/ephemeral/.app_filename && \"$FLUTTER_ROOT\"/packages/flutter_tools/bin/macos_assemble.sh embed\n"; + }; + 33CC111E2044C6BF0003C045 /* ShellScript */ = { + isa = PBXShellScriptBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + inputFileListPaths = ( + Flutter/ephemeral/FlutterInputs.xcfilelist, + ); + inputPaths = ( + Flutter/ephemeral/tripwire, + ); + outputFileListPaths = ( + Flutter/ephemeral/FlutterOutputs.xcfilelist, + ); + outputPaths = ( + ); + runOnlyForDeploymentPostprocessing = 0; + shellPath = /bin/sh; + shellScript = "\"$FLUTTER_ROOT\"/packages/flutter_tools/bin/macos_assemble.sh && touch Flutter/ephemeral/tripwire"; + }; +/* End PBXShellScriptBuildPhase section */ + +/* Begin PBXSourcesBuildPhase section */ + 331C80D1294CF70F00263BE5 /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + 331C80D8294CF71000263BE5 /* RunnerTests.swift in Sources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + 33CC10E92044A3C60003C045 /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + 33CC11132044BFA00003C045 /* MainFlutterWindow.swift in Sources */, + 33CC10F12044A3C60003C045 /* AppDelegate.swift in Sources */, + 335BBD1B22A9A15E00E9071D /* GeneratedPluginRegistrant.swift in Sources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXSourcesBuildPhase section */ + +/* Begin PBXTargetDependency section */ + 331C80DA294CF71000263BE5 /* PBXTargetDependency */ = { + isa = PBXTargetDependency; + target = 33CC10EC2044A3C60003C045 /* Runner */; + targetProxy = 331C80D9294CF71000263BE5 /* PBXContainerItemProxy */; + }; + 33CC11202044C79F0003C045 /* PBXTargetDependency */ = { + isa = PBXTargetDependency; + target = 33CC111A2044C6BA0003C045 /* Flutter Assemble */; + targetProxy = 33CC111F2044C79F0003C045 /* PBXContainerItemProxy */; + }; +/* End PBXTargetDependency section */ + +/* Begin PBXVariantGroup section */ + 33CC10F42044A3C60003C045 /* MainMenu.xib */ = { + isa = PBXVariantGroup; + children = ( + 33CC10F52044A3C60003C045 /* Base */, + ); + name = MainMenu.xib; + path = Runner; + sourceTree = ""; + }; +/* End PBXVariantGroup section */ + +/* Begin XCBuildConfiguration section */ + 331C80DB294CF71000263BE5 /* Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + BUNDLE_LOADER = "$(TEST_HOST)"; + CURRENT_PROJECT_VERSION = 1; + GENERATE_INFOPLIST_FILE = YES; + MARKETING_VERSION = 1.0; + PRODUCT_BUNDLE_IDENTIFIER = com.siro.siroRider.RunnerTests; + PRODUCT_NAME = "$(TARGET_NAME)"; + SWIFT_VERSION = 5.0; + TEST_HOST = "$(BUILT_PRODUCTS_DIR)/siro_rider.app/$(BUNDLE_EXECUTABLE_FOLDER_PATH)/siro_rider"; + }; + name = Debug; + }; + 331C80DC294CF71000263BE5 /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + BUNDLE_LOADER = "$(TEST_HOST)"; + CURRENT_PROJECT_VERSION = 1; + GENERATE_INFOPLIST_FILE = YES; + MARKETING_VERSION = 1.0; + PRODUCT_BUNDLE_IDENTIFIER = com.siro.siroRider.RunnerTests; + PRODUCT_NAME = "$(TARGET_NAME)"; + SWIFT_VERSION = 5.0; + TEST_HOST = "$(BUILT_PRODUCTS_DIR)/siro_rider.app/$(BUNDLE_EXECUTABLE_FOLDER_PATH)/siro_rider"; + }; + name = Release; + }; + 331C80DD294CF71000263BE5 /* Profile */ = { + isa = XCBuildConfiguration; + buildSettings = { + BUNDLE_LOADER = "$(TEST_HOST)"; + CURRENT_PROJECT_VERSION = 1; + GENERATE_INFOPLIST_FILE = YES; + MARKETING_VERSION = 1.0; + PRODUCT_BUNDLE_IDENTIFIER = com.siro.siroRider.RunnerTests; + PRODUCT_NAME = "$(TARGET_NAME)"; + SWIFT_VERSION = 5.0; + TEST_HOST = "$(BUILT_PRODUCTS_DIR)/siro_rider.app/$(BUNDLE_EXECUTABLE_FOLDER_PATH)/siro_rider"; + }; + name = Profile; + }; + 338D0CE9231458BD00FA5F75 /* Profile */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = 7AFA3C8E1D35360C0083082E /* Release.xcconfig */; + buildSettings = { + ALWAYS_SEARCH_USER_PATHS = NO; + ASSETCATALOG_COMPILER_GENERATE_SWIFT_ASSET_SYMBOL_EXTENSIONS = YES; + CLANG_ANALYZER_NONNULL = YES; + CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE; + CLANG_CXX_LANGUAGE_STANDARD = "gnu++14"; + CLANG_CXX_LIBRARY = "libc++"; + CLANG_ENABLE_MODULES = YES; + CLANG_ENABLE_OBJC_ARC = YES; + CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; + CLANG_WARN_BOOL_CONVERSION = YES; + CLANG_WARN_CONSTANT_CONVERSION = YES; + CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; + CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; + CLANG_WARN_DOCUMENTATION_COMMENTS = YES; + CLANG_WARN_EMPTY_BODY = YES; + CLANG_WARN_ENUM_CONVERSION = YES; + CLANG_WARN_INFINITE_RECURSION = YES; + CLANG_WARN_INT_CONVERSION = YES; + CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; + CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; + CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; + CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; + CLANG_WARN_SUSPICIOUS_MOVE = YES; + CODE_SIGN_IDENTITY = "-"; + COPY_PHASE_STRIP = NO; + DEAD_CODE_STRIPPING = YES; + DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; + ENABLE_NS_ASSERTIONS = NO; + ENABLE_STRICT_OBJC_MSGSEND = YES; + ENABLE_USER_SCRIPT_SANDBOXING = NO; + GCC_C_LANGUAGE_STANDARD = gnu11; + GCC_NO_COMMON_BLOCKS = YES; + GCC_WARN_64_TO_32_BIT_CONVERSION = YES; + GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; + GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; + GCC_WARN_UNUSED_FUNCTION = YES; + GCC_WARN_UNUSED_VARIABLE = YES; + MACOSX_DEPLOYMENT_TARGET = 10.15; + MTL_ENABLE_DEBUG_INFO = NO; + SDKROOT = macosx; + SWIFT_COMPILATION_MODE = wholemodule; + SWIFT_OPTIMIZATION_LEVEL = "-O"; + }; + name = Profile; + }; + 338D0CEA231458BD00FA5F75 /* Profile */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = 33E5194F232828860026EE4D /* AppInfo.xcconfig */; + buildSettings = { + ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; + CLANG_ENABLE_MODULES = YES; + CODE_SIGN_ENTITLEMENTS = Runner/DebugProfile.entitlements; + CODE_SIGN_STYLE = Automatic; + COMBINE_HIDPI_IMAGES = YES; + INFOPLIST_FILE = Runner/Info.plist; + LD_RUNPATH_SEARCH_PATHS = ( + "$(inherited)", + "@executable_path/../Frameworks", + ); + PROVISIONING_PROFILE_SPECIFIER = ""; + SWIFT_VERSION = 5.0; + }; + name = Profile; + }; + 338D0CEB231458BD00FA5F75 /* Profile */ = { + isa = XCBuildConfiguration; + buildSettings = { + CODE_SIGN_STYLE = Manual; + PRODUCT_NAME = "$(TARGET_NAME)"; + }; + name = Profile; + }; + 33CC10F92044A3C60003C045 /* Debug */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = 9740EEB21CF90195004384FC /* Debug.xcconfig */; + buildSettings = { + ALWAYS_SEARCH_USER_PATHS = NO; + ASSETCATALOG_COMPILER_GENERATE_SWIFT_ASSET_SYMBOL_EXTENSIONS = YES; + CLANG_ANALYZER_NONNULL = YES; + CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE; + CLANG_CXX_LANGUAGE_STANDARD = "gnu++14"; + CLANG_CXX_LIBRARY = "libc++"; + CLANG_ENABLE_MODULES = YES; + CLANG_ENABLE_OBJC_ARC = YES; + CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; + CLANG_WARN_BOOL_CONVERSION = YES; + CLANG_WARN_CONSTANT_CONVERSION = YES; + CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; + CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; + CLANG_WARN_DOCUMENTATION_COMMENTS = YES; + CLANG_WARN_EMPTY_BODY = YES; + CLANG_WARN_ENUM_CONVERSION = YES; + CLANG_WARN_INFINITE_RECURSION = YES; + CLANG_WARN_INT_CONVERSION = YES; + CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; + CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; + CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; + CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; + CLANG_WARN_SUSPICIOUS_MOVE = YES; + CODE_SIGN_IDENTITY = "-"; + COPY_PHASE_STRIP = NO; + DEAD_CODE_STRIPPING = YES; + DEBUG_INFORMATION_FORMAT = dwarf; + ENABLE_STRICT_OBJC_MSGSEND = YES; + ENABLE_TESTABILITY = YES; + ENABLE_USER_SCRIPT_SANDBOXING = NO; + GCC_C_LANGUAGE_STANDARD = gnu11; + GCC_DYNAMIC_NO_PIC = NO; + GCC_NO_COMMON_BLOCKS = YES; + GCC_OPTIMIZATION_LEVEL = 0; + GCC_PREPROCESSOR_DEFINITIONS = ( + "DEBUG=1", + "$(inherited)", + ); + GCC_WARN_64_TO_32_BIT_CONVERSION = YES; + GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; + GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; + GCC_WARN_UNUSED_FUNCTION = YES; + GCC_WARN_UNUSED_VARIABLE = YES; + MACOSX_DEPLOYMENT_TARGET = 10.15; + MTL_ENABLE_DEBUG_INFO = YES; + ONLY_ACTIVE_ARCH = YES; + SDKROOT = macosx; + SWIFT_ACTIVE_COMPILATION_CONDITIONS = DEBUG; + SWIFT_OPTIMIZATION_LEVEL = "-Onone"; + }; + name = Debug; + }; + 33CC10FA2044A3C60003C045 /* Release */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = 7AFA3C8E1D35360C0083082E /* Release.xcconfig */; + buildSettings = { + ALWAYS_SEARCH_USER_PATHS = NO; + ASSETCATALOG_COMPILER_GENERATE_SWIFT_ASSET_SYMBOL_EXTENSIONS = YES; + CLANG_ANALYZER_NONNULL = YES; + CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE; + CLANG_CXX_LANGUAGE_STANDARD = "gnu++14"; + CLANG_CXX_LIBRARY = "libc++"; + CLANG_ENABLE_MODULES = YES; + CLANG_ENABLE_OBJC_ARC = YES; + CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; + CLANG_WARN_BOOL_CONVERSION = YES; + CLANG_WARN_CONSTANT_CONVERSION = YES; + CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; + CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; + CLANG_WARN_DOCUMENTATION_COMMENTS = YES; + CLANG_WARN_EMPTY_BODY = YES; + CLANG_WARN_ENUM_CONVERSION = YES; + CLANG_WARN_INFINITE_RECURSION = YES; + CLANG_WARN_INT_CONVERSION = YES; + CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; + CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; + CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; + CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; + CLANG_WARN_SUSPICIOUS_MOVE = YES; + CODE_SIGN_IDENTITY = "-"; + COPY_PHASE_STRIP = NO; + DEAD_CODE_STRIPPING = YES; + DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; + ENABLE_NS_ASSERTIONS = NO; + ENABLE_STRICT_OBJC_MSGSEND = YES; + ENABLE_USER_SCRIPT_SANDBOXING = NO; + GCC_C_LANGUAGE_STANDARD = gnu11; + GCC_NO_COMMON_BLOCKS = YES; + GCC_WARN_64_TO_32_BIT_CONVERSION = YES; + GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; + GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; + GCC_WARN_UNUSED_FUNCTION = YES; + GCC_WARN_UNUSED_VARIABLE = YES; + MACOSX_DEPLOYMENT_TARGET = 10.15; + MTL_ENABLE_DEBUG_INFO = NO; + SDKROOT = macosx; + SWIFT_COMPILATION_MODE = wholemodule; + SWIFT_OPTIMIZATION_LEVEL = "-O"; + }; + name = Release; + }; + 33CC10FC2044A3C60003C045 /* Debug */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = 33E5194F232828860026EE4D /* AppInfo.xcconfig */; + buildSettings = { + ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; + CLANG_ENABLE_MODULES = YES; + CODE_SIGN_ENTITLEMENTS = Runner/DebugProfile.entitlements; + CODE_SIGN_STYLE = Automatic; + COMBINE_HIDPI_IMAGES = YES; + INFOPLIST_FILE = Runner/Info.plist; + LD_RUNPATH_SEARCH_PATHS = ( + "$(inherited)", + "@executable_path/../Frameworks", + ); + PROVISIONING_PROFILE_SPECIFIER = ""; + SWIFT_OPTIMIZATION_LEVEL = "-Onone"; + SWIFT_VERSION = 5.0; + }; + name = Debug; + }; + 33CC10FD2044A3C60003C045 /* Release */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = 33E5194F232828860026EE4D /* AppInfo.xcconfig */; + buildSettings = { + ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; + CLANG_ENABLE_MODULES = YES; + CODE_SIGN_ENTITLEMENTS = Runner/Release.entitlements; + CODE_SIGN_STYLE = Automatic; + COMBINE_HIDPI_IMAGES = YES; + INFOPLIST_FILE = Runner/Info.plist; + LD_RUNPATH_SEARCH_PATHS = ( + "$(inherited)", + "@executable_path/../Frameworks", + ); + PROVISIONING_PROFILE_SPECIFIER = ""; + SWIFT_VERSION = 5.0; + }; + name = Release; + }; + 33CC111C2044C6BA0003C045 /* Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + CODE_SIGN_STYLE = Manual; + PRODUCT_NAME = "$(TARGET_NAME)"; + }; + name = Debug; + }; + 33CC111D2044C6BA0003C045 /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + CODE_SIGN_STYLE = Automatic; + PRODUCT_NAME = "$(TARGET_NAME)"; + }; + name = Release; + }; +/* End XCBuildConfiguration section */ + +/* Begin XCConfigurationList section */ + 331C80DE294CF71000263BE5 /* Build configuration list for PBXNativeTarget "RunnerTests" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 331C80DB294CF71000263BE5 /* Debug */, + 331C80DC294CF71000263BE5 /* Release */, + 331C80DD294CF71000263BE5 /* Profile */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; + 33CC10E82044A3C60003C045 /* Build configuration list for PBXProject "Runner" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 33CC10F92044A3C60003C045 /* Debug */, + 33CC10FA2044A3C60003C045 /* Release */, + 338D0CE9231458BD00FA5F75 /* Profile */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; + 33CC10FB2044A3C60003C045 /* Build configuration list for PBXNativeTarget "Runner" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 33CC10FC2044A3C60003C045 /* Debug */, + 33CC10FD2044A3C60003C045 /* Release */, + 338D0CEA231458BD00FA5F75 /* Profile */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; + 33CC111B2044C6BA0003C045 /* Build configuration list for PBXAggregateTarget "Flutter Assemble" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 33CC111C2044C6BA0003C045 /* Debug */, + 33CC111D2044C6BA0003C045 /* Release */, + 338D0CEB231458BD00FA5F75 /* Profile */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; +/* End XCConfigurationList section */ + }; + rootObject = 33CC10E52044A3C60003C045 /* Project object */; +} diff --git a/siro_rider/macos/Runner.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist b/siro_rider/macos/Runner.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist new file mode 100644 index 0000000..18d9810 --- /dev/null +++ b/siro_rider/macos/Runner.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist @@ -0,0 +1,8 @@ + + + + + IDEDidComputeMac32BitWarning + + + diff --git a/siro_rider/macos/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme b/siro_rider/macos/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme new file mode 100644 index 0000000..f3d01a8 --- /dev/null +++ b/siro_rider/macos/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme @@ -0,0 +1,99 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/siro_rider/macos/Runner.xcworkspace/contents.xcworkspacedata b/siro_rider/macos/Runner.xcworkspace/contents.xcworkspacedata new file mode 100644 index 0000000..1d526a1 --- /dev/null +++ b/siro_rider/macos/Runner.xcworkspace/contents.xcworkspacedata @@ -0,0 +1,7 @@ + + + + + diff --git a/siro_rider/macos/Runner.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist b/siro_rider/macos/Runner.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist new file mode 100644 index 0000000..18d9810 --- /dev/null +++ b/siro_rider/macos/Runner.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist @@ -0,0 +1,8 @@ + + + + + IDEDidComputeMac32BitWarning + + + diff --git a/siro_rider/macos/Runner/AppDelegate.swift b/siro_rider/macos/Runner/AppDelegate.swift new file mode 100644 index 0000000..b3c1761 --- /dev/null +++ b/siro_rider/macos/Runner/AppDelegate.swift @@ -0,0 +1,13 @@ +import Cocoa +import FlutterMacOS + +@main +class AppDelegate: FlutterAppDelegate { + override func applicationShouldTerminateAfterLastWindowClosed(_ sender: NSApplication) -> Bool { + return true + } + + override func applicationSupportsSecureRestorableState(_ app: NSApplication) -> Bool { + return true + } +} diff --git a/siro_rider/macos/Runner/Assets.xcassets/AppIcon.appiconset/Contents.json b/siro_rider/macos/Runner/Assets.xcassets/AppIcon.appiconset/Contents.json new file mode 100644 index 0000000..a2ec33f --- /dev/null +++ b/siro_rider/macos/Runner/Assets.xcassets/AppIcon.appiconset/Contents.json @@ -0,0 +1,68 @@ +{ + "images" : [ + { + "size" : "16x16", + "idiom" : "mac", + "filename" : "app_icon_16.png", + "scale" : "1x" + }, + { + "size" : "16x16", + "idiom" : "mac", + "filename" : "app_icon_32.png", + "scale" : "2x" + }, + { + "size" : "32x32", + "idiom" : "mac", + "filename" : "app_icon_32.png", + "scale" : "1x" + }, + { + "size" : "32x32", + "idiom" : "mac", + "filename" : "app_icon_64.png", + "scale" : "2x" + }, + { + "size" : "128x128", + "idiom" : "mac", + "filename" : "app_icon_128.png", + "scale" : "1x" + }, + { + "size" : "128x128", + "idiom" : "mac", + "filename" : "app_icon_256.png", + "scale" : "2x" + }, + { + "size" : "256x256", + "idiom" : "mac", + "filename" : "app_icon_256.png", + "scale" : "1x" + }, + { + "size" : "256x256", + "idiom" : "mac", + "filename" : "app_icon_512.png", + "scale" : "2x" + }, + { + "size" : "512x512", + "idiom" : "mac", + "filename" : "app_icon_512.png", + "scale" : "1x" + }, + { + "size" : "512x512", + "idiom" : "mac", + "filename" : "app_icon_1024.png", + "scale" : "2x" + } + ], + "info" : { + "version" : 1, + "author" : "xcode" + } +} diff --git a/siro_rider/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_1024.png b/siro_rider/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_1024.png new file mode 100644 index 0000000..82b6f9d Binary files /dev/null and b/siro_rider/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_1024.png differ diff --git a/siro_rider/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_128.png b/siro_rider/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_128.png new file mode 100644 index 0000000..13b35eb Binary files /dev/null and b/siro_rider/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_128.png differ diff --git a/siro_rider/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_16.png b/siro_rider/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_16.png new file mode 100644 index 0000000..0a3f5fa Binary files /dev/null and b/siro_rider/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_16.png differ diff --git a/siro_rider/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_256.png b/siro_rider/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_256.png new file mode 100644 index 0000000..bdb5722 Binary files /dev/null and b/siro_rider/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_256.png differ diff --git a/siro_rider/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_32.png b/siro_rider/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_32.png new file mode 100644 index 0000000..f083318 Binary files /dev/null and b/siro_rider/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_32.png differ diff --git a/siro_rider/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_512.png b/siro_rider/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_512.png new file mode 100644 index 0000000..326c0e7 Binary files /dev/null and b/siro_rider/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_512.png differ diff --git a/siro_rider/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_64.png b/siro_rider/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_64.png new file mode 100644 index 0000000..2f1632c Binary files /dev/null and b/siro_rider/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_64.png differ diff --git a/siro_rider/macos/Runner/Base.lproj/MainMenu.xib b/siro_rider/macos/Runner/Base.lproj/MainMenu.xib new file mode 100644 index 0000000..80e867a --- /dev/null +++ b/siro_rider/macos/Runner/Base.lproj/MainMenu.xib @@ -0,0 +1,343 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/siro_rider/macos/Runner/Configs/AppInfo.xcconfig b/siro_rider/macos/Runner/Configs/AppInfo.xcconfig new file mode 100644 index 0000000..de67fe4 --- /dev/null +++ b/siro_rider/macos/Runner/Configs/AppInfo.xcconfig @@ -0,0 +1,14 @@ +// Application-level settings for the Runner target. +// +// This may be replaced with something auto-generated from metadata (e.g., pubspec.yaml) in the +// future. If not, the values below would default to using the project name when this becomes a +// 'flutter create' template. + +// The application's name. By default this is also the title of the Flutter window. +PRODUCT_NAME = siro_rider + +// The application's bundle identifier +PRODUCT_BUNDLE_IDENTIFIER = com.siro.siroRider + +// The copyright displayed in application information +PRODUCT_COPYRIGHT = Copyright © 2026 com.siro. All rights reserved. diff --git a/siro_rider/macos/Runner/Configs/Debug.xcconfig b/siro_rider/macos/Runner/Configs/Debug.xcconfig new file mode 100644 index 0000000..36b0fd9 --- /dev/null +++ b/siro_rider/macos/Runner/Configs/Debug.xcconfig @@ -0,0 +1,2 @@ +#include "../../Flutter/Flutter-Debug.xcconfig" +#include "Warnings.xcconfig" diff --git a/siro_rider/macos/Runner/Configs/Release.xcconfig b/siro_rider/macos/Runner/Configs/Release.xcconfig new file mode 100644 index 0000000..dff4f49 --- /dev/null +++ b/siro_rider/macos/Runner/Configs/Release.xcconfig @@ -0,0 +1,2 @@ +#include "../../Flutter/Flutter-Release.xcconfig" +#include "Warnings.xcconfig" diff --git a/siro_rider/macos/Runner/Configs/Warnings.xcconfig b/siro_rider/macos/Runner/Configs/Warnings.xcconfig new file mode 100644 index 0000000..42bcbf4 --- /dev/null +++ b/siro_rider/macos/Runner/Configs/Warnings.xcconfig @@ -0,0 +1,13 @@ +WARNING_CFLAGS = -Wall -Wconditional-uninitialized -Wnullable-to-nonnull-conversion -Wmissing-method-return-type -Woverlength-strings +GCC_WARN_UNDECLARED_SELECTOR = YES +CLANG_UNDEFINED_BEHAVIOR_SANITIZER_NULLABILITY = YES +CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE +CLANG_WARN__DUPLICATE_METHOD_MATCH = YES +CLANG_WARN_PRAGMA_PACK = YES +CLANG_WARN_STRICT_PROTOTYPES = YES +CLANG_WARN_COMMA = YES +GCC_WARN_STRICT_SELECTOR_MATCH = YES +CLANG_WARN_OBJC_REPEATED_USE_OF_WEAK = YES +CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES +GCC_WARN_SHADOW = YES +CLANG_WARN_UNREACHABLE_CODE = YES diff --git a/siro_rider/macos/Runner/DebugProfile.entitlements b/siro_rider/macos/Runner/DebugProfile.entitlements new file mode 100644 index 0000000..dddb8a3 --- /dev/null +++ b/siro_rider/macos/Runner/DebugProfile.entitlements @@ -0,0 +1,12 @@ + + + + + com.apple.security.app-sandbox + + com.apple.security.cs.allow-jit + + com.apple.security.network.server + + + diff --git a/siro_rider/macos/Runner/Info.plist b/siro_rider/macos/Runner/Info.plist new file mode 100644 index 0000000..4789daa --- /dev/null +++ b/siro_rider/macos/Runner/Info.plist @@ -0,0 +1,32 @@ + + + + + CFBundleDevelopmentRegion + $(DEVELOPMENT_LANGUAGE) + CFBundleExecutable + $(EXECUTABLE_NAME) + CFBundleIconFile + + CFBundleIdentifier + $(PRODUCT_BUNDLE_IDENTIFIER) + CFBundleInfoDictionaryVersion + 6.0 + CFBundleName + $(PRODUCT_NAME) + CFBundlePackageType + APPL + CFBundleShortVersionString + $(FLUTTER_BUILD_NAME) + CFBundleVersion + $(FLUTTER_BUILD_NUMBER) + LSMinimumSystemVersion + $(MACOSX_DEPLOYMENT_TARGET) + NSHumanReadableCopyright + $(PRODUCT_COPYRIGHT) + NSMainNibFile + MainMenu + NSPrincipalClass + NSApplication + + diff --git a/siro_rider/macos/Runner/MainFlutterWindow.swift b/siro_rider/macos/Runner/MainFlutterWindow.swift new file mode 100644 index 0000000..3cc05eb --- /dev/null +++ b/siro_rider/macos/Runner/MainFlutterWindow.swift @@ -0,0 +1,15 @@ +import Cocoa +import FlutterMacOS + +class MainFlutterWindow: NSWindow { + override func awakeFromNib() { + let flutterViewController = FlutterViewController() + let windowFrame = self.frame + self.contentViewController = flutterViewController + self.setFrame(windowFrame, display: true) + + RegisterGeneratedPlugins(registry: flutterViewController) + + super.awakeFromNib() + } +} diff --git a/siro_rider/macos/Runner/Release.entitlements b/siro_rider/macos/Runner/Release.entitlements new file mode 100644 index 0000000..852fa1a --- /dev/null +++ b/siro_rider/macos/Runner/Release.entitlements @@ -0,0 +1,8 @@ + + + + + com.apple.security.app-sandbox + + + diff --git a/siro_rider/macos/RunnerTests/RunnerTests.swift b/siro_rider/macos/RunnerTests/RunnerTests.swift new file mode 100644 index 0000000..61f3bd1 --- /dev/null +++ b/siro_rider/macos/RunnerTests/RunnerTests.swift @@ -0,0 +1,12 @@ +import Cocoa +import FlutterMacOS +import XCTest + +class RunnerTests: XCTestCase { + + func testExample() { + // If you add code to the Runner application, consider adding tests here. + // See https://developer.apple.com/documentation/xctest for more information about using XCTest. + } + +} diff --git a/siro_rider/packages/calendar_builder/CHANGELOG.md b/siro_rider/packages/calendar_builder/CHANGELOG.md new file mode 100644 index 0000000..40c8f59 --- /dev/null +++ b/siro_rider/packages/calendar_builder/CHANGELOG.md @@ -0,0 +1,18 @@ +## 0.0.6 + +* web, compile issue fix +## 0.0.5 + +* improve pub score +## 0.0.4 + +* added docs +## 0.0.3 + +* improve pub score +## 0.0.2 + +* Support for web +## 0.0.1 + +* initial release. diff --git a/siro_rider/packages/calendar_builder/LICENSE b/siro_rider/packages/calendar_builder/LICENSE new file mode 100644 index 0000000..e9b98ce --- /dev/null +++ b/siro_rider/packages/calendar_builder/LICENSE @@ -0,0 +1,21 @@ +MIT License + +Copyright (c) 2022 Newton Michael + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. diff --git a/siro_rider/packages/calendar_builder/README.md b/siro_rider/packages/calendar_builder/README.md new file mode 100644 index 0000000..6f17b45 --- /dev/null +++ b/siro_rider/packages/calendar_builder/README.md @@ -0,0 +1,328 @@ +# calendar_builder + +Fully customizable calendar package for flutter. +Also supports for disabling dates, highlighting dates and displaying events inside calendar. + +## Features + +- Fully customisable widgets +- Add Events +- Highlight dates +- Disable dates +- Starting week can be changed +- ✅ MonthBuilder +- [TODO] DayBuilder +- [TODO] WeekBuilder + + +| Month Builder | Customised Month Builder | +| :--------------------------------------------------------------------------------------------------------: | :--------------------------------------------------------------------------------------------------------: | +| ![](https://user-images.githubusercontent.com/85326522/160266643-9802e763-cf66-43cb-880f-2f861e93c208.jpg) | ![](https://user-images.githubusercontent.com/85326522/160266640-9cb71c30-9354-42bc-8b99-06f7f33518f6.jpg) | + +| Custom Month Builder | Month Builder with callbacks | +| :--------------------------------------------------------------------------------------------------------: | :--------------------------------------------------------------------------------------------------------: | +| ![](https://user-images.githubusercontent.com/85326522/160266644-3d0b66ff-3ded-4f47-92a7-291cebc7957c.jpg) | ![](https://user-images.githubusercontent.com/85326522/160266642-9cb04737-7182-4f42-b7c1-dd0804f7aa03.jpg) | + +--- + +### Support Light and Dark theme + +![](https://user-images.githubusercontent.com/85326522/160261784-e1df931e-5e9a-475c-8bc9-a3957290de1e.gif) + + +## Installation + + +In your `pubspec.yaml` file within your Flutter Project: + +```yaml +dependencies: + calendar_builder: +``` + + +## How to use + + +```dart +import 'package:calendar_builder/calendar_builder.dart'; +import 'package:flutter/material.dart'; + +class MonthBuilderScreen extends StatelessWidget { + const MonthBuilderScreen({Key? key}) : super(key: key); + + @override + Widget build(BuildContext context) { + return Scaffold( + body: SafeArea( + child: Column( + children: [ + Expanded( + child: CbMonthBuilder( + cbConfig: CbConfig( + startDate: DateTime(2020), + endDate: DateTime(2026), + selectedDate: DateTime(2021,3,4), + selectedYear: DateTime(2021), + ), + ), + ) + ], + ), + ), + ); + } +} + +``` + +### Demo + +![](https://user-images.githubusercontent.com/85326522/160261779-9b11b4df-24c7-48e4-b3b3-d56b3d36d0e5.gif) +## Customised Month Builder +---- +### Output + +--- + +![](https://user-images.githubusercontent.com/85326522/160266642-9cb04737-7182-4f42-b7c1-dd0804f7aa03.jpg) + +### code + +--- + +```dart +CbMonthBuilder( + cbConfig: CbConfig( + startDate: DateTime(2020), + endDate: DateTime(2123), + selectedDate: DateTime(2022, 3, 4), + selectedYear: DateTime(2022), + weekStartsFrom: WeekStartsFrom.wednesday, + disabledDates: [ + DateTime(2022, 1, 7), + DateTime(2022, 1, 9), + ], + eventDates: [ + DateTime(2022, 1, 2), + DateTime(2022, 1, 2), + DateTime(2022, 1, 3) + ], + highlightedDates: [ + DateTime(2022, 1, 6), + DateTime(2022, 1, 3) + ]), + monthCustomizer: MonthCustomizer( + padding: const EdgeInsets.all(20), + monthHeaderCustomizer: MonthHeaderCustomizer( + textStyle: const TextStyle( + color: Colors.red, + fontSize: 22, + fontWeight: FontWeight.bold, + ), + ), + monthButtonCustomizer: MonthButtonCustomizer( + currentDayColor: Colors.orange, + borderStrokeWidth: 2, + textStyleOnDisabled: const TextStyle(color: Colors.red), + highlightedColor: const Color.fromARGB(255, 255, 174, 0)), + monthWeekCustomizer: MonthWeekCustomizer( + textStyle: + const TextStyle(color: Color.fromARGB(255, 255, 174, 0))) + // monthWidth: 500, + // monthHeight: 200 + ), + yearDropDownCustomizer: YearDropDownCustomizer( + yearButtonCustomizer: YearButtonCustomizer( + borderColorOnSelected: Colors.red, + ), + yearHeaderCustomizer: YearHeaderCustomizer( + titleTextStyle: + const TextStyle(color: Color.fromARGB(255, 255, 174, 0)))), + onYearHeaderExpanded: (isExpanded) { + print('isExpanded ' + isExpanded.toString()); + }, + onDateClicked: (onDateClicked) { + print('selected date' + + onDateClicked.selectedDate.toString() + + '\n' + + 'isSelected ' + + onDateClicked.isSelected.toString() + + '\n' + + 'isHighlighted ' + + onDateClicked.isHighlighted.toString() + + '\n' + + 'hasEvent ' + + onDateClicked.hasEvent.toString() + + '\n' + + 'isCurrentDate ' + + onDateClicked.isCurrentDate.toString() + + '\n' + + 'isDisabled ' + + onDateClicked.isDisabled.toString()); + }, + onYearButtonClicked: (year, isSelected) { + print('selected year ' + + year.toString() + + '\n' + + 'isSelected ' + + isSelected.toString()); + }, + ) +``` + +## Custom Month Builder +--- +### Output + +--- + +![](https://user-images.githubusercontent.com/85326522/160266644-3d0b66ff-3ded-4f47-92a7-291cebc7957c.jpg) + +### code + +--- + +```dart + +CbMonthBuilder( + cbConfig: CbConfig( + startDate: DateTime(2020), + endDate: DateTime(2123), + selectedDate: DateTime(2022), + selectedYear: DateTime(2022), + weekStartsFrom: WeekStartsFrom.sunday, + eventDates: [ + DateTime(2022, 1, 2), + DateTime(2022, 1, 2), + DateTime(2022, 1, 3) + ], + highlightedDates: [ + DateTime(2022, 1, 6), + DateTime(2022, 1, 3) + ]), + yearDropDownCustomizer: YearDropDownCustomizer( + yearHeaderBuilder: + (isYearPickerExpanded, selectedDate, selectedYear, year) { + return Container( + height: 40, + color: Colors.yellow, + child: Row( + mainAxisAlignment: MainAxisAlignment.center, + crossAxisAlignment: CrossAxisAlignment.center, + children: [ + Text( + year, + style: const TextStyle(fontWeight: FontWeight.bold), + ), + Icon(!isYearPickerExpanded + ? Icons.arrow_drop_down_outlined + : Icons.arrow_drop_up_outlined) + ], + ), + ); + }, + ), + monthCustomizer: MonthCustomizer( + montMinhHeight: 200, + monthMinWidth: 450, + padding: const EdgeInsets.all(20), + monthHeaderBuilder: (month, headerHeight, headerWidth, paddingLeft) { + return Container( + color: Colors.grey[200], + height: headerHeight, + width: headerWidth, + child: Padding( + padding: EdgeInsets.only(left: paddingLeft), + child: Align( + alignment: Alignment.center, + child: Text( + month, + style: const TextStyle( + fontSize: 22, + fontWeight: FontWeight.w600, + ), + ), + ), + ), + ); + }, + monthWeekBuilder: (index, weeks, weekHeight, weekWidth) { + return SizedBox( + height: weekHeight, + width: weekWidth, + child: Padding( + padding: const EdgeInsets.all(4.0), + child: Container( + decoration: BoxDecoration( + color: Colors.red.withOpacity(0.1), + borderRadius: BorderRadius.circular(10), + border: Border.all(color: Colors.red)), + child: Align( + child: Text( + weeks, + style: const TextStyle( + fontSize: 14, + color: Colors.red, + fontWeight: FontWeight.w500, + ), + overflow: TextOverflow.ellipsis, + maxLines: 1, + ), + ), + ), + ), + ); + }, + monthButtonBuilder: (dateTime, childHeight, childWidth, isSelected, + isDisabled, hasEvent, isHighlighted, isCurrentDay) { + //Text Theme + final txtTheme = Theme.of(context).textTheme; + //color theme + final colorTheme = Theme.of(context); + + var daysText = Align( + child: Text( + '${dateTime.day}', + style: isDisabled + ? txtTheme.caption + : isSelected + ? txtTheme.bodyText1!.copyWith( + fontWeight: FontWeight.bold, + color: colorTheme.brightness == Brightness.dark + ? Colors.black + : Colors.white) + : isHighlighted + ? txtTheme.bodyText2 //Highlighted TextStyle + : isCurrentDay + ? txtTheme.bodyText2 //CurrentDay TextStyle + : txtTheme.bodyText2, + ), + ); + if (isSelected) { + return Container( + decoration: const BoxDecoration( + color: Colors.red, + shape: BoxShape.rectangle, + ), + margin: const EdgeInsets.all(2), + child: daysText, + ); + } + return Container( + decoration: BoxDecoration( + color: isDisabled ? Colors.grey[200] : Colors.yellow, + shape: BoxShape.rectangle, + border: hasEvent || isHighlighted + ? Border.all( + color: isHighlighted ? Colors.red : Colors.blue, + width: 2) + : null), + margin: const EdgeInsets.all(2), + child: daysText, + ); + }, + ), + ) + +``` diff --git a/siro_rider/packages/calendar_builder/analysis_options.yaml b/siro_rider/packages/calendar_builder/analysis_options.yaml new file mode 100644 index 0000000..03ba511 --- /dev/null +++ b/siro_rider/packages/calendar_builder/analysis_options.yaml @@ -0,0 +1,28 @@ +include: package:flutter_lints/flutter.yaml + +analyzer: + enable-experiment: + - non-nullable + strong-mode: + implicit-casts: false + errors: + missing_required_param: error + prefer_const_declarations: warning + prefer_const_constructors: warning + import_of_legacy_library_into_null_safe: ignore + +linter: + rules: + omit_local_variable_types: false + missing_required_param: true + prefer_const_declarations: true + prefer_const_constructors: true + public_member_api_docs: true + use_key_in_widget_constructors: true + prefer_int_literals: true + lines_longer_than_80_chars: false + prefer_relative_imports: true + always_use_package_imports: false + import_of_legacy_library_into_null_safe: false + avoid_print: true + \ No newline at end of file diff --git a/siro_rider/packages/calendar_builder/example/README.md b/siro_rider/packages/calendar_builder/example/README.md new file mode 100644 index 0000000..a135626 --- /dev/null +++ b/siro_rider/packages/calendar_builder/example/README.md @@ -0,0 +1,16 @@ +# example + +A new Flutter project. + +## Getting Started + +This project is a starting point for a Flutter application. + +A few resources to get you started if this is your first Flutter project: + +- [Lab: Write your first Flutter app](https://flutter.dev/docs/get-started/codelab) +- [Cookbook: Useful Flutter samples](https://flutter.dev/docs/cookbook) + +For help getting started with Flutter, view our +[online documentation](https://flutter.dev/docs), which offers tutorials, +samples, guidance on mobile development, and a full API reference. diff --git a/siro_rider/packages/calendar_builder/example/analysis_options.yaml b/siro_rider/packages/calendar_builder/example/analysis_options.yaml new file mode 100644 index 0000000..61b6c4d --- /dev/null +++ b/siro_rider/packages/calendar_builder/example/analysis_options.yaml @@ -0,0 +1,29 @@ +# This file configures the analyzer, which statically analyzes Dart code to +# check for errors, warnings, and lints. +# +# The issues identified by the analyzer are surfaced in the UI of Dart-enabled +# IDEs (https://dart.dev/tools#ides-and-editors). The analyzer can also be +# invoked from the command line by running `flutter analyze`. + +# The following line activates a set of recommended lints for Flutter apps, +# packages, and plugins designed to encourage good coding practices. +include: package:flutter_lints/flutter.yaml + +linter: + # The lint rules applied to this project can be customized in the + # section below to disable rules from the `package:flutter_lints/flutter.yaml` + # included above or to enable additional rules. A list of all available lints + # and their documentation is published at + # https://dart-lang.github.io/linter/lints/index.html. + # + # Instead of disabling a lint rule for the entire project in the + # section below, it can also be suppressed for a single line of code + # or a specific dart file by using the `// ignore: name_of_lint` and + # `// ignore_for_file: name_of_lint` syntax on the line or in the file + # producing the lint. + rules: + # avoid_print: false # Uncomment to disable the `avoid_print` rule + # prefer_single_quotes: true # Uncomment to enable the `prefer_single_quotes` rule + +# Additional information about this file can be found at +# https://dart.dev/guides/language/analysis-options diff --git a/siro_rider/packages/calendar_builder/example/android/.gradle/6.7/fileChanges/last-build.bin b/siro_rider/packages/calendar_builder/example/android/.gradle/6.7/fileChanges/last-build.bin new file mode 100644 index 0000000..f76dd23 Binary files /dev/null and b/siro_rider/packages/calendar_builder/example/android/.gradle/6.7/fileChanges/last-build.bin differ diff --git a/siro_rider/packages/calendar_builder/example/android/.gradle/6.7/fileHashes/fileHashes.lock b/siro_rider/packages/calendar_builder/example/android/.gradle/6.7/fileHashes/fileHashes.lock new file mode 100644 index 0000000..06519fc Binary files /dev/null and b/siro_rider/packages/calendar_builder/example/android/.gradle/6.7/fileHashes/fileHashes.lock differ diff --git a/siro_rider/packages/calendar_builder/example/android/.gradle/6.7/gc.properties b/siro_rider/packages/calendar_builder/example/android/.gradle/6.7/gc.properties new file mode 100644 index 0000000..e69de29 diff --git a/siro_rider/packages/calendar_builder/example/android/.gradle/checksums/checksums.lock b/siro_rider/packages/calendar_builder/example/android/.gradle/checksums/checksums.lock new file mode 100644 index 0000000..c828dd5 Binary files /dev/null and b/siro_rider/packages/calendar_builder/example/android/.gradle/checksums/checksums.lock differ diff --git a/siro_rider/packages/calendar_builder/example/android/.gradle/configuration-cache/gc.properties b/siro_rider/packages/calendar_builder/example/android/.gradle/configuration-cache/gc.properties new file mode 100644 index 0000000..e69de29 diff --git a/siro_rider/packages/calendar_builder/example/android/.gradle/vcs-1/gc.properties b/siro_rider/packages/calendar_builder/example/android/.gradle/vcs-1/gc.properties new file mode 100644 index 0000000..e69de29 diff --git a/siro_rider/packages/calendar_builder/example/android/app/build.gradle b/siro_rider/packages/calendar_builder/example/android/app/build.gradle new file mode 100644 index 0000000..5fe3c92 --- /dev/null +++ b/siro_rider/packages/calendar_builder/example/android/app/build.gradle @@ -0,0 +1,68 @@ +def localProperties = new Properties() +def localPropertiesFile = rootProject.file('local.properties') +if (localPropertiesFile.exists()) { + localPropertiesFile.withReader('UTF-8') { reader -> + localProperties.load(reader) + } +} + +def flutterRoot = localProperties.getProperty('flutter.sdk') +if (flutterRoot == null) { + throw new GradleException("Flutter SDK not found. Define location with flutter.sdk in the local.properties file.") +} + +def flutterVersionCode = localProperties.getProperty('flutter.versionCode') +if (flutterVersionCode == null) { + flutterVersionCode = '1' +} + +def flutterVersionName = localProperties.getProperty('flutter.versionName') +if (flutterVersionName == null) { + flutterVersionName = '1.0' +} + +apply plugin: 'com.android.application' +apply plugin: 'kotlin-android' +apply from: "$flutterRoot/packages/flutter_tools/gradle/flutter.gradle" + +android { + compileSdkVersion flutter.compileSdkVersion + + compileOptions { + sourceCompatibility JavaVersion.VERSION_1_8 + targetCompatibility JavaVersion.VERSION_1_8 + } + + kotlinOptions { + jvmTarget = '1.8' + } + + sourceSets { + main.java.srcDirs += 'src/main/kotlin' + } + + defaultConfig { + // TODO: Specify your own unique Application ID (https://developer.android.com/studio/build/application-id.html). + applicationId "com.example.example" + minSdkVersion flutter.minSdkVersion + targetSdkVersion flutter.targetSdkVersion + versionCode flutterVersionCode.toInteger() + versionName flutterVersionName + } + + buildTypes { + release { + // TODO: Add your own signing config for the release build. + // Signing with the debug keys for now, so `flutter run --release` works. + signingConfig signingConfigs.debug + } + } +} + +flutter { + source '../..' +} + +dependencies { + implementation "org.jetbrains.kotlin:kotlin-stdlib-jdk7:$kotlin_version" +} diff --git a/siro_rider/packages/calendar_builder/example/android/app/src/debug/AndroidManifest.xml b/siro_rider/packages/calendar_builder/example/android/app/src/debug/AndroidManifest.xml new file mode 100644 index 0000000..c208884 --- /dev/null +++ b/siro_rider/packages/calendar_builder/example/android/app/src/debug/AndroidManifest.xml @@ -0,0 +1,7 @@ + + + + diff --git a/siro_rider/packages/calendar_builder/example/android/app/src/main/AndroidManifest.xml b/siro_rider/packages/calendar_builder/example/android/app/src/main/AndroidManifest.xml new file mode 100644 index 0000000..3f41384 --- /dev/null +++ b/siro_rider/packages/calendar_builder/example/android/app/src/main/AndroidManifest.xml @@ -0,0 +1,34 @@ + + + + + + + + + + + + + + diff --git a/siro_rider/packages/calendar_builder/example/android/app/src/main/java/io/flutter/plugins/GeneratedPluginRegistrant.java b/siro_rider/packages/calendar_builder/example/android/app/src/main/java/io/flutter/plugins/GeneratedPluginRegistrant.java new file mode 100644 index 0000000..539ab02 --- /dev/null +++ b/siro_rider/packages/calendar_builder/example/android/app/src/main/java/io/flutter/plugins/GeneratedPluginRegistrant.java @@ -0,0 +1,19 @@ +package io.flutter.plugins; + +import androidx.annotation.Keep; +import androidx.annotation.NonNull; +import io.flutter.Log; + +import io.flutter.embedding.engine.FlutterEngine; + +/** + * Generated file. Do not edit. + * This file is generated by the Flutter tool based on the + * plugins that support the Android platform. + */ +@Keep +public final class GeneratedPluginRegistrant { + private static final String TAG = "GeneratedPluginRegistrant"; + public static void registerWith(@NonNull FlutterEngine flutterEngine) { + } +} diff --git a/siro_rider/packages/calendar_builder/example/android/app/src/main/kotlin/com/example/example/MainActivity.kt b/siro_rider/packages/calendar_builder/example/android/app/src/main/kotlin/com/example/example/MainActivity.kt new file mode 100644 index 0000000..e793a00 --- /dev/null +++ b/siro_rider/packages/calendar_builder/example/android/app/src/main/kotlin/com/example/example/MainActivity.kt @@ -0,0 +1,6 @@ +package com.example.example + +import io.flutter.embedding.android.FlutterActivity + +class MainActivity: FlutterActivity() { +} diff --git a/siro_rider/packages/calendar_builder/example/android/app/src/main/res/drawable-v21/launch_background.xml b/siro_rider/packages/calendar_builder/example/android/app/src/main/res/drawable-v21/launch_background.xml new file mode 100644 index 0000000..f74085f --- /dev/null +++ b/siro_rider/packages/calendar_builder/example/android/app/src/main/res/drawable-v21/launch_background.xml @@ -0,0 +1,12 @@ + + + + + + + + diff --git a/siro_rider/packages/calendar_builder/example/android/app/src/main/res/drawable/launch_background.xml b/siro_rider/packages/calendar_builder/example/android/app/src/main/res/drawable/launch_background.xml new file mode 100644 index 0000000..304732f --- /dev/null +++ b/siro_rider/packages/calendar_builder/example/android/app/src/main/res/drawable/launch_background.xml @@ -0,0 +1,12 @@ + + + + + + + + diff --git a/siro_rider/packages/calendar_builder/example/android/app/src/main/res/mipmap-hdpi/ic_launcher.png b/siro_rider/packages/calendar_builder/example/android/app/src/main/res/mipmap-hdpi/ic_launcher.png new file mode 100644 index 0000000..db77bb4 Binary files /dev/null and b/siro_rider/packages/calendar_builder/example/android/app/src/main/res/mipmap-hdpi/ic_launcher.png differ diff --git a/siro_rider/packages/calendar_builder/example/android/app/src/main/res/mipmap-mdpi/ic_launcher.png b/siro_rider/packages/calendar_builder/example/android/app/src/main/res/mipmap-mdpi/ic_launcher.png new file mode 100644 index 0000000..17987b7 Binary files /dev/null and b/siro_rider/packages/calendar_builder/example/android/app/src/main/res/mipmap-mdpi/ic_launcher.png differ diff --git a/siro_rider/packages/calendar_builder/example/android/app/src/main/res/mipmap-xhdpi/ic_launcher.png b/siro_rider/packages/calendar_builder/example/android/app/src/main/res/mipmap-xhdpi/ic_launcher.png new file mode 100644 index 0000000..09d4391 Binary files /dev/null and b/siro_rider/packages/calendar_builder/example/android/app/src/main/res/mipmap-xhdpi/ic_launcher.png differ diff --git a/siro_rider/packages/calendar_builder/example/android/app/src/main/res/mipmap-xxhdpi/ic_launcher.png b/siro_rider/packages/calendar_builder/example/android/app/src/main/res/mipmap-xxhdpi/ic_launcher.png new file mode 100644 index 0000000..d5f1c8d Binary files /dev/null and b/siro_rider/packages/calendar_builder/example/android/app/src/main/res/mipmap-xxhdpi/ic_launcher.png differ diff --git a/siro_rider/packages/calendar_builder/example/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png b/siro_rider/packages/calendar_builder/example/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png new file mode 100644 index 0000000..4d6372e Binary files /dev/null and b/siro_rider/packages/calendar_builder/example/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png differ diff --git a/siro_rider/packages/calendar_builder/example/android/app/src/main/res/values-night/styles.xml b/siro_rider/packages/calendar_builder/example/android/app/src/main/res/values-night/styles.xml new file mode 100644 index 0000000..3db14bb --- /dev/null +++ b/siro_rider/packages/calendar_builder/example/android/app/src/main/res/values-night/styles.xml @@ -0,0 +1,18 @@ + + + + + + + diff --git a/siro_rider/packages/calendar_builder/example/android/app/src/main/res/values/styles.xml b/siro_rider/packages/calendar_builder/example/android/app/src/main/res/values/styles.xml new file mode 100644 index 0000000..d460d1e --- /dev/null +++ b/siro_rider/packages/calendar_builder/example/android/app/src/main/res/values/styles.xml @@ -0,0 +1,18 @@ + + + + + + + diff --git a/siro_rider/packages/calendar_builder/example/android/app/src/profile/AndroidManifest.xml b/siro_rider/packages/calendar_builder/example/android/app/src/profile/AndroidManifest.xml new file mode 100644 index 0000000..c208884 --- /dev/null +++ b/siro_rider/packages/calendar_builder/example/android/app/src/profile/AndroidManifest.xml @@ -0,0 +1,7 @@ + + + + diff --git a/siro_rider/packages/calendar_builder/example/android/build.gradle b/siro_rider/packages/calendar_builder/example/android/build.gradle new file mode 100644 index 0000000..4256f91 --- /dev/null +++ b/siro_rider/packages/calendar_builder/example/android/build.gradle @@ -0,0 +1,31 @@ +buildscript { + ext.kotlin_version = '1.6.10' + repositories { + google() + mavenCentral() + } + + dependencies { + classpath 'com.android.tools.build:gradle:4.1.0' + classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version" + } +} + +allprojects { + repositories { + google() + mavenCentral() + } +} + +rootProject.buildDir = '../build' +subprojects { + project.buildDir = "${rootProject.buildDir}/${project.name}" +} +subprojects { + project.evaluationDependsOn(':app') +} + +task clean(type: Delete) { + delete rootProject.buildDir +} diff --git a/siro_rider/packages/calendar_builder/example/android/gradle.properties b/siro_rider/packages/calendar_builder/example/android/gradle.properties new file mode 100644 index 0000000..94adc3a --- /dev/null +++ b/siro_rider/packages/calendar_builder/example/android/gradle.properties @@ -0,0 +1,3 @@ +org.gradle.jvmargs=-Xmx1536M +android.useAndroidX=true +android.enableJetifier=true diff --git a/siro_rider/packages/calendar_builder/example/android/gradle/wrapper/gradle-wrapper.properties b/siro_rider/packages/calendar_builder/example/android/gradle/wrapper/gradle-wrapper.properties new file mode 100644 index 0000000..bc6a58a --- /dev/null +++ b/siro_rider/packages/calendar_builder/example/android/gradle/wrapper/gradle-wrapper.properties @@ -0,0 +1,6 @@ +#Fri Jun 23 08:50:38 CEST 2017 +distributionBase=GRADLE_USER_HOME +distributionPath=wrapper/dists +zipStoreBase=GRADLE_USER_HOME +zipStorePath=wrapper/dists +distributionUrl=https\://services.gradle.org/distributions/gradle-6.7-all.zip diff --git a/siro_rider/packages/calendar_builder/example/android/gradlew b/siro_rider/packages/calendar_builder/example/android/gradlew new file mode 100755 index 0000000..9d82f78 --- /dev/null +++ b/siro_rider/packages/calendar_builder/example/android/gradlew @@ -0,0 +1,160 @@ +#!/usr/bin/env bash + +############################################################################## +## +## Gradle start up script for UN*X +## +############################################################################## + +# Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. +DEFAULT_JVM_OPTS="" + +APP_NAME="Gradle" +APP_BASE_NAME=`basename "$0"` + +# Use the maximum available, or set MAX_FD != -1 to use that value. +MAX_FD="maximum" + +warn ( ) { + echo "$*" +} + +die ( ) { + echo + echo "$*" + echo + exit 1 +} + +# OS specific support (must be 'true' or 'false'). +cygwin=false +msys=false +darwin=false +case "`uname`" in + CYGWIN* ) + cygwin=true + ;; + Darwin* ) + darwin=true + ;; + MINGW* ) + msys=true + ;; +esac + +# Attempt to set APP_HOME +# Resolve links: $0 may be a link +PRG="$0" +# Need this for relative symlinks. +while [ -h "$PRG" ] ; do + ls=`ls -ld "$PRG"` + link=`expr "$ls" : '.*-> \(.*\)$'` + if expr "$link" : '/.*' > /dev/null; then + PRG="$link" + else + PRG=`dirname "$PRG"`"/$link" + fi +done +SAVED="`pwd`" +cd "`dirname \"$PRG\"`/" >/dev/null +APP_HOME="`pwd -P`" +cd "$SAVED" >/dev/null + +CLASSPATH=$APP_HOME/gradle/wrapper/gradle-wrapper.jar + +# Determine the Java command to use to start the JVM. +if [ -n "$JAVA_HOME" ] ; then + if [ -x "$JAVA_HOME/jre/sh/java" ] ; then + # IBM's JDK on AIX uses strange locations for the executables + JAVACMD="$JAVA_HOME/jre/sh/java" + else + JAVACMD="$JAVA_HOME/bin/java" + fi + if [ ! -x "$JAVACMD" ] ; then + die "ERROR: JAVA_HOME is set to an invalid directory: $JAVA_HOME + +Please set the JAVA_HOME variable in your environment to match the +location of your Java installation." + fi +else + JAVACMD="java" + which java >/dev/null 2>&1 || die "ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. + +Please set the JAVA_HOME variable in your environment to match the +location of your Java installation." +fi + +# Increase the maximum file descriptors if we can. +if [ "$cygwin" = "false" -a "$darwin" = "false" ] ; then + MAX_FD_LIMIT=`ulimit -H -n` + if [ $? -eq 0 ] ; then + if [ "$MAX_FD" = "maximum" -o "$MAX_FD" = "max" ] ; then + MAX_FD="$MAX_FD_LIMIT" + fi + ulimit -n $MAX_FD + if [ $? -ne 0 ] ; then + warn "Could not set maximum file descriptor limit: $MAX_FD" + fi + else + warn "Could not query maximum file descriptor limit: $MAX_FD_LIMIT" + fi +fi + +# For Darwin, add options to specify how the application appears in the dock +if $darwin; then + GRADLE_OPTS="$GRADLE_OPTS \"-Xdock:name=$APP_NAME\" \"-Xdock:icon=$APP_HOME/media/gradle.icns\"" +fi + +# For Cygwin, switch paths to Windows format before running java +if $cygwin ; then + APP_HOME=`cygpath --path --mixed "$APP_HOME"` + CLASSPATH=`cygpath --path --mixed "$CLASSPATH"` + JAVACMD=`cygpath --unix "$JAVACMD"` + + # We build the pattern for arguments to be converted via cygpath + ROOTDIRSRAW=`find -L / -maxdepth 1 -mindepth 1 -type d 2>/dev/null` + SEP="" + for dir in $ROOTDIRSRAW ; do + ROOTDIRS="$ROOTDIRS$SEP$dir" + SEP="|" + done + OURCYGPATTERN="(^($ROOTDIRS))" + # Add a user-defined pattern to the cygpath arguments + if [ "$GRADLE_CYGPATTERN" != "" ] ; then + OURCYGPATTERN="$OURCYGPATTERN|($GRADLE_CYGPATTERN)" + fi + # Now convert the arguments - kludge to limit ourselves to /bin/sh + i=0 + for arg in "$@" ; do + CHECK=`echo "$arg"|egrep -c "$OURCYGPATTERN" -` + CHECK2=`echo "$arg"|egrep -c "^-"` ### Determine if an option + + if [ $CHECK -ne 0 ] && [ $CHECK2 -eq 0 ] ; then ### Added a condition + eval `echo args$i`=`cygpath --path --ignore --mixed "$arg"` + else + eval `echo args$i`="\"$arg\"" + fi + i=$((i+1)) + done + case $i in + (0) set -- ;; + (1) set -- "$args0" ;; + (2) set -- "$args0" "$args1" ;; + (3) set -- "$args0" "$args1" "$args2" ;; + (4) set -- "$args0" "$args1" "$args2" "$args3" ;; + (5) set -- "$args0" "$args1" "$args2" "$args3" "$args4" ;; + (6) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" ;; + (7) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" ;; + (8) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" ;; + (9) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" "$args8" ;; + esac +fi + +# Split up the JVM_OPTS And GRADLE_OPTS values into an array, following the shell quoting and substitution rules +function splitJvmOpts() { + JVM_OPTS=("$@") +} +eval splitJvmOpts $DEFAULT_JVM_OPTS $JAVA_OPTS $GRADLE_OPTS +JVM_OPTS[${#JVM_OPTS[*]}]="-Dorg.gradle.appname=$APP_BASE_NAME" + +exec "$JAVACMD" "${JVM_OPTS[@]}" -classpath "$CLASSPATH" org.gradle.wrapper.GradleWrapperMain "$@" diff --git a/siro_rider/packages/calendar_builder/example/android/gradlew.bat b/siro_rider/packages/calendar_builder/example/android/gradlew.bat new file mode 100644 index 0000000..aec9973 --- /dev/null +++ b/siro_rider/packages/calendar_builder/example/android/gradlew.bat @@ -0,0 +1,90 @@ +@if "%DEBUG%" == "" @echo off +@rem ########################################################################## +@rem +@rem Gradle startup script for Windows +@rem +@rem ########################################################################## + +@rem Set local scope for the variables with windows NT shell +if "%OS%"=="Windows_NT" setlocal + +@rem Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. +set DEFAULT_JVM_OPTS= + +set DIRNAME=%~dp0 +if "%DIRNAME%" == "" set DIRNAME=. +set APP_BASE_NAME=%~n0 +set APP_HOME=%DIRNAME% + +@rem Find java.exe +if defined JAVA_HOME goto findJavaFromJavaHome + +set JAVA_EXE=java.exe +%JAVA_EXE% -version >NUL 2>&1 +if "%ERRORLEVEL%" == "0" goto init + +echo. +echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. +echo. +echo Please set the JAVA_HOME variable in your environment to match the +echo location of your Java installation. + +goto fail + +:findJavaFromJavaHome +set JAVA_HOME=%JAVA_HOME:"=% +set JAVA_EXE=%JAVA_HOME%/bin/java.exe + +if exist "%JAVA_EXE%" goto init + +echo. +echo ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME% +echo. +echo Please set the JAVA_HOME variable in your environment to match the +echo location of your Java installation. + +goto fail + +:init +@rem Get command-line arguments, handling Windowz variants + +if not "%OS%" == "Windows_NT" goto win9xME_args +if "%@eval[2+2]" == "4" goto 4NT_args + +:win9xME_args +@rem Slurp the command line arguments. +set CMD_LINE_ARGS= +set _SKIP=2 + +:win9xME_args_slurp +if "x%~1" == "x" goto execute + +set CMD_LINE_ARGS=%* +goto execute + +:4NT_args +@rem Get arguments from the 4NT Shell from JP Software +set CMD_LINE_ARGS=%$ + +:execute +@rem Setup the command line + +set CLASSPATH=%APP_HOME%\gradle\wrapper\gradle-wrapper.jar + +@rem Execute Gradle +"%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -classpath "%CLASSPATH%" org.gradle.wrapper.GradleWrapperMain %CMD_LINE_ARGS% + +:end +@rem End local scope for the variables with windows NT shell +if "%ERRORLEVEL%"=="0" goto mainEnd + +:fail +rem Set variable GRADLE_EXIT_CONSOLE if you need the _script_ return code instead of +rem the _cmd.exe /c_ return code! +if not "" == "%GRADLE_EXIT_CONSOLE%" exit 1 +exit /b 1 + +:mainEnd +if "%OS%"=="Windows_NT" endlocal + +:omega diff --git a/siro_rider/packages/calendar_builder/example/android/local.properties b/siro_rider/packages/calendar_builder/example/android/local.properties new file mode 100644 index 0000000..dfb2fd3 --- /dev/null +++ b/siro_rider/packages/calendar_builder/example/android/local.properties @@ -0,0 +1,5 @@ +sdk.dir=/Users/hamzaaleghwairyeen/Library/Android/sdk +flutter.sdk=/Users/hamzaaleghwairyeen/flutter +flutter.buildMode=debug +flutter.versionName=1.0.0 +flutter.versionCode=1 \ No newline at end of file diff --git a/siro_rider/packages/calendar_builder/example/android/settings.gradle b/siro_rider/packages/calendar_builder/example/android/settings.gradle new file mode 100644 index 0000000..44e62bc --- /dev/null +++ b/siro_rider/packages/calendar_builder/example/android/settings.gradle @@ -0,0 +1,11 @@ +include ':app' + +def localPropertiesFile = new File(rootProject.projectDir, "local.properties") +def properties = new Properties() + +assert localPropertiesFile.exists() +localPropertiesFile.withReader("UTF-8") { reader -> properties.load(reader) } + +def flutterSdkPath = properties.getProperty("flutter.sdk") +assert flutterSdkPath != null, "flutter.sdk not set in local.properties" +apply from: "$flutterSdkPath/packages/flutter_tools/gradle/app_plugin_loader.gradle" diff --git a/siro_rider/packages/calendar_builder/example/ios/Flutter/AppFrameworkInfo.plist b/siro_rider/packages/calendar_builder/example/ios/Flutter/AppFrameworkInfo.plist new file mode 100644 index 0000000..8d4492f --- /dev/null +++ b/siro_rider/packages/calendar_builder/example/ios/Flutter/AppFrameworkInfo.plist @@ -0,0 +1,26 @@ + + + + + CFBundleDevelopmentRegion + en + CFBundleExecutable + App + CFBundleIdentifier + io.flutter.flutter.app + CFBundleInfoDictionaryVersion + 6.0 + CFBundleName + App + CFBundlePackageType + FMWK + CFBundleShortVersionString + 1.0 + CFBundleSignature + ???? + CFBundleVersion + 1.0 + MinimumOSVersion + 9.0 + + diff --git a/siro_rider/packages/calendar_builder/example/ios/Flutter/Debug.xcconfig b/siro_rider/packages/calendar_builder/example/ios/Flutter/Debug.xcconfig new file mode 100644 index 0000000..592ceee --- /dev/null +++ b/siro_rider/packages/calendar_builder/example/ios/Flutter/Debug.xcconfig @@ -0,0 +1 @@ +#include "Generated.xcconfig" diff --git a/siro_rider/packages/calendar_builder/example/ios/Flutter/Generated.xcconfig b/siro_rider/packages/calendar_builder/example/ios/Flutter/Generated.xcconfig new file mode 100644 index 0000000..c9090ab --- /dev/null +++ b/siro_rider/packages/calendar_builder/example/ios/Flutter/Generated.xcconfig @@ -0,0 +1,14 @@ +// This is a generated file; do not edit or check into version control. +FLUTTER_ROOT=/Users/hamzaaleghwairyeen/flutter +FLUTTER_APPLICATION_PATH=/Users/hamzaaleghwairyeen/development/App/Intaleq/packages/calendar_builder/example +COCOAPODS_PARALLEL_CODE_SIGN=true +FLUTTER_TARGET=lib/main.dart +FLUTTER_BUILD_DIR=build +FLUTTER_BUILD_NAME=1.0.0 +FLUTTER_BUILD_NUMBER=1 +EXCLUDED_ARCHS[sdk=iphonesimulator*]=i386 +EXCLUDED_ARCHS[sdk=iphoneos*]=armv7 +DART_OBFUSCATION=false +TRACK_WIDGET_CREATION=true +TREE_SHAKE_ICONS=false +PACKAGE_CONFIG=.dart_tool/package_config.json diff --git a/siro_rider/packages/calendar_builder/example/ios/Flutter/Release.xcconfig b/siro_rider/packages/calendar_builder/example/ios/Flutter/Release.xcconfig new file mode 100644 index 0000000..592ceee --- /dev/null +++ b/siro_rider/packages/calendar_builder/example/ios/Flutter/Release.xcconfig @@ -0,0 +1 @@ +#include "Generated.xcconfig" diff --git a/siro_rider/packages/calendar_builder/example/ios/Flutter/ephemeral/flutter_lldb_helper.py b/siro_rider/packages/calendar_builder/example/ios/Flutter/ephemeral/flutter_lldb_helper.py new file mode 100644 index 0000000..a88caf9 --- /dev/null +++ b/siro_rider/packages/calendar_builder/example/ios/Flutter/ephemeral/flutter_lldb_helper.py @@ -0,0 +1,32 @@ +# +# Generated file, do not edit. +# + +import lldb + +def handle_new_rx_page(frame: lldb.SBFrame, bp_loc, extra_args, intern_dict): + """Intercept NOTIFY_DEBUGGER_ABOUT_RX_PAGES and touch the pages.""" + base = frame.register["x0"].GetValueAsAddress() + page_len = frame.register["x1"].GetValueAsUnsigned() + + # Note: NOTIFY_DEBUGGER_ABOUT_RX_PAGES will check contents of the + # first page to see if handled it correctly. This makes diagnosing + # misconfiguration (e.g. missing breakpoint) easier. + data = bytearray(page_len) + data[0:8] = b'IHELPED!' + + error = lldb.SBError() + frame.GetThread().GetProcess().WriteMemory(base, data, error) + if not error.Success(): + print(f'Failed to write into {base}[+{page_len}]', error) + return + +def __lldb_init_module(debugger: lldb.SBDebugger, _): + target = debugger.GetDummyTarget() + # Caveat: must use BreakpointCreateByRegEx here and not + # BreakpointCreateByName. For some reasons callback function does not + # get carried over from dummy target for the later. + bp = target.BreakpointCreateByRegex("^NOTIFY_DEBUGGER_ABOUT_RX_PAGES$") + bp.SetScriptCallbackFunction('{}.handle_new_rx_page'.format(__name__)) + bp.SetAutoContinue(True) + print("-- LLDB integration loaded --") diff --git a/siro_rider/packages/calendar_builder/example/ios/Flutter/ephemeral/flutter_lldbinit b/siro_rider/packages/calendar_builder/example/ios/Flutter/ephemeral/flutter_lldbinit new file mode 100644 index 0000000..e3ba6fb --- /dev/null +++ b/siro_rider/packages/calendar_builder/example/ios/Flutter/ephemeral/flutter_lldbinit @@ -0,0 +1,5 @@ +# +# Generated file, do not edit. +# + +command script import --relative-to-command-file flutter_lldb_helper.py diff --git a/siro_rider/packages/calendar_builder/example/ios/Flutter/flutter_export_environment.sh b/siro_rider/packages/calendar_builder/example/ios/Flutter/flutter_export_environment.sh new file mode 100755 index 0000000..48cc8e9 --- /dev/null +++ b/siro_rider/packages/calendar_builder/example/ios/Flutter/flutter_export_environment.sh @@ -0,0 +1,13 @@ +#!/bin/sh +# This is a generated file; do not edit or check into version control. +export "FLUTTER_ROOT=/Users/hamzaaleghwairyeen/flutter" +export "FLUTTER_APPLICATION_PATH=/Users/hamzaaleghwairyeen/development/App/Intaleq/packages/calendar_builder/example" +export "COCOAPODS_PARALLEL_CODE_SIGN=true" +export "FLUTTER_TARGET=lib/main.dart" +export "FLUTTER_BUILD_DIR=build" +export "FLUTTER_BUILD_NAME=1.0.0" +export "FLUTTER_BUILD_NUMBER=1" +export "DART_OBFUSCATION=false" +export "TRACK_WIDGET_CREATION=true" +export "TREE_SHAKE_ICONS=false" +export "PACKAGE_CONFIG=.dart_tool/package_config.json" diff --git a/siro_rider/packages/calendar_builder/example/ios/Runner.xcodeproj/project.pbxproj b/siro_rider/packages/calendar_builder/example/ios/Runner.xcodeproj/project.pbxproj new file mode 100644 index 0000000..2250fd6 --- /dev/null +++ b/siro_rider/packages/calendar_builder/example/ios/Runner.xcodeproj/project.pbxproj @@ -0,0 +1,484 @@ +// !$*UTF8*$! +{ + archiveVersion = 1; + classes = { + }; + objectVersion = 50; + objects = { + +/* Begin PBXBuildFile section */ + 1498D2341E8E89220040F4C2 /* GeneratedPluginRegistrant.m in Sources */ = {isa = PBXBuildFile; fileRef = 1498D2331E8E89220040F4C2 /* GeneratedPluginRegistrant.m */; }; + 3B3967161E833CAA004F5970 /* AppFrameworkInfo.plist in Resources */ = {isa = PBXBuildFile; fileRef = 3B3967151E833CAA004F5970 /* AppFrameworkInfo.plist */; }; + 74858FAF1ED2DC5600515810 /* AppDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 74858FAE1ED2DC5600515810 /* AppDelegate.swift */; }; + 97C146FC1CF9000F007C117D /* Main.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 97C146FA1CF9000F007C117D /* Main.storyboard */; }; + 97C146FE1CF9000F007C117D /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 97C146FD1CF9000F007C117D /* Assets.xcassets */; }; + 97C147011CF9000F007C117D /* LaunchScreen.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 97C146FF1CF9000F007C117D /* LaunchScreen.storyboard */; }; +/* End PBXBuildFile section */ + +/* Begin PBXCopyFilesBuildPhase section */ + 9705A1C41CF9048500538489 /* Embed Frameworks */ = { + isa = PBXCopyFilesBuildPhase; + buildActionMask = 2147483647; + dstPath = ""; + dstSubfolderSpec = 10; + files = ( + ); + name = "Embed Frameworks"; + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXCopyFilesBuildPhase section */ + +/* Begin PBXFileReference section */ + 1498D2321E8E86230040F4C2 /* GeneratedPluginRegistrant.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = GeneratedPluginRegistrant.h; sourceTree = ""; }; + 1498D2331E8E89220040F4C2 /* GeneratedPluginRegistrant.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = GeneratedPluginRegistrant.m; sourceTree = ""; }; + 3B3967151E833CAA004F5970 /* AppFrameworkInfo.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; name = AppFrameworkInfo.plist; path = Flutter/AppFrameworkInfo.plist; sourceTree = ""; }; + 74858FAD1ED2DC5600515810 /* Runner-Bridging-Header.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = "Runner-Bridging-Header.h"; sourceTree = ""; }; + 74858FAE1ED2DC5600515810 /* AppDelegate.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = AppDelegate.swift; sourceTree = ""; }; + 7AFA3C8E1D35360C0083082E /* Release.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; name = Release.xcconfig; path = Flutter/Release.xcconfig; sourceTree = ""; }; + 9740EEB21CF90195004384FC /* Debug.xcconfig */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xcconfig; name = Debug.xcconfig; path = Flutter/Debug.xcconfig; sourceTree = ""; }; + 9740EEB31CF90195004384FC /* Generated.xcconfig */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xcconfig; name = Generated.xcconfig; path = Flutter/Generated.xcconfig; sourceTree = ""; }; + 97C146EE1CF9000F007C117D /* Runner.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = Runner.app; sourceTree = BUILT_PRODUCTS_DIR; }; + 97C146FB1CF9000F007C117D /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/Main.storyboard; sourceTree = ""; }; + 97C146FD1CF9000F007C117D /* Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Assets.xcassets; sourceTree = ""; }; + 97C147001CF9000F007C117D /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/LaunchScreen.storyboard; sourceTree = ""; }; + 97C147021CF9000F007C117D /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; +/* End PBXFileReference section */ + +/* Begin PBXFrameworksBuildPhase section */ + 97C146EB1CF9000F007C117D /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXFrameworksBuildPhase section */ + +/* Begin PBXGroup section */ + 9740EEB11CF90186004384FC /* Flutter */ = { + isa = PBXGroup; + children = ( + 3B3967151E833CAA004F5970 /* AppFrameworkInfo.plist */, + 9740EEB21CF90195004384FC /* Debug.xcconfig */, + 7AFA3C8E1D35360C0083082E /* Release.xcconfig */, + 9740EEB31CF90195004384FC /* Generated.xcconfig */, + ); + name = Flutter; + sourceTree = ""; + }; + 97C146E51CF9000F007C117D = { + isa = PBXGroup; + children = ( + 9740EEB11CF90186004384FC /* Flutter */, + 97C146F01CF9000F007C117D /* Runner */, + 97C146EF1CF9000F007C117D /* Products */, + ); + sourceTree = ""; + }; + 97C146EF1CF9000F007C117D /* Products */ = { + isa = PBXGroup; + children = ( + 97C146EE1CF9000F007C117D /* Runner.app */, + ); + name = Products; + sourceTree = ""; + }; + 97C146F01CF9000F007C117D /* Runner */ = { + isa = PBXGroup; + children = ( + 97C146FA1CF9000F007C117D /* Main.storyboard */, + 97C146FD1CF9000F007C117D /* Assets.xcassets */, + 97C146FF1CF9000F007C117D /* LaunchScreen.storyboard */, + 97C147021CF9000F007C117D /* Info.plist */, + 1498D2321E8E86230040F4C2 /* GeneratedPluginRegistrant.h */, + 1498D2331E8E89220040F4C2 /* GeneratedPluginRegistrant.m */, + 74858FAE1ED2DC5600515810 /* AppDelegate.swift */, + 74858FAD1ED2DC5600515810 /* Runner-Bridging-Header.h */, + ); + path = Runner; + sourceTree = ""; + }; +/* End PBXGroup section */ + +/* Begin PBXNativeTarget section */ + 97C146ED1CF9000F007C117D /* Runner */ = { + isa = PBXNativeTarget; + buildConfigurationList = 97C147051CF9000F007C117D /* Build configuration list for PBXNativeTarget "Runner" */; + buildPhases = ( + 9740EEB61CF901F6004384FC /* Run Script */, + 97C146EA1CF9000F007C117D /* Sources */, + 97C146EB1CF9000F007C117D /* Frameworks */, + 97C146EC1CF9000F007C117D /* Resources */, + 9705A1C41CF9048500538489 /* Embed Frameworks */, + 3B06AD1E1E4923F5004D2608 /* Thin Binary */, + ); + buildRules = ( + ); + dependencies = ( + ); + name = Runner; + productName = Runner; + productReference = 97C146EE1CF9000F007C117D /* Runner.app */; + productType = "com.apple.product-type.application"; + }; +/* End PBXNativeTarget section */ + +/* Begin PBXProject section */ + 97C146E61CF9000F007C117D /* Project object */ = { + isa = PBXProject; + attributes = { + LastUpgradeCheck = 1300; + ORGANIZATIONNAME = ""; + TargetAttributes = { + 97C146ED1CF9000F007C117D = { + CreatedOnToolsVersion = 7.3.1; + LastSwiftMigration = 1100; + }; + }; + }; + buildConfigurationList = 97C146E91CF9000F007C117D /* Build configuration list for PBXProject "Runner" */; + compatibilityVersion = "Xcode 9.3"; + developmentRegion = en; + hasScannedForEncodings = 0; + knownRegions = ( + en, + Base, + ); + mainGroup = 97C146E51CF9000F007C117D; + productRefGroup = 97C146EF1CF9000F007C117D /* Products */; + projectDirPath = ""; + projectRoot = ""; + targets = ( + 97C146ED1CF9000F007C117D /* Runner */, + ); + }; +/* End PBXProject section */ + +/* Begin PBXResourcesBuildPhase section */ + 97C146EC1CF9000F007C117D /* Resources */ = { + isa = PBXResourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + 97C147011CF9000F007C117D /* LaunchScreen.storyboard in Resources */, + 3B3967161E833CAA004F5970 /* AppFrameworkInfo.plist in Resources */, + 97C146FE1CF9000F007C117D /* Assets.xcassets in Resources */, + 97C146FC1CF9000F007C117D /* Main.storyboard in Resources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXResourcesBuildPhase section */ + +/* Begin PBXShellScriptBuildPhase section */ + 3B06AD1E1E4923F5004D2608 /* Thin Binary */ = { + isa = PBXShellScriptBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + inputPaths = ( + ); + name = "Thin Binary"; + outputPaths = ( + ); + runOnlyForDeploymentPostprocessing = 0; + shellPath = /bin/sh; + shellScript = "/bin/sh \"$FLUTTER_ROOT/packages/flutter_tools/bin/xcode_backend.sh\" embed_and_thin"; + }; + 9740EEB61CF901F6004384FC /* Run Script */ = { + isa = PBXShellScriptBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + inputPaths = ( + ); + name = "Run Script"; + outputPaths = ( + ); + runOnlyForDeploymentPostprocessing = 0; + shellPath = /bin/sh; + shellScript = "/bin/sh \"$FLUTTER_ROOT/packages/flutter_tools/bin/xcode_backend.sh\" build"; + }; +/* End PBXShellScriptBuildPhase section */ + +/* Begin PBXSourcesBuildPhase section */ + 97C146EA1CF9000F007C117D /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + 74858FAF1ED2DC5600515810 /* AppDelegate.swift in Sources */, + 1498D2341E8E89220040F4C2 /* GeneratedPluginRegistrant.m in Sources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXSourcesBuildPhase section */ + +/* Begin PBXVariantGroup section */ + 97C146FA1CF9000F007C117D /* Main.storyboard */ = { + isa = PBXVariantGroup; + children = ( + 97C146FB1CF9000F007C117D /* Base */, + ); + name = Main.storyboard; + sourceTree = ""; + }; + 97C146FF1CF9000F007C117D /* LaunchScreen.storyboard */ = { + isa = PBXVariantGroup; + children = ( + 97C147001CF9000F007C117D /* Base */, + ); + name = LaunchScreen.storyboard; + sourceTree = ""; + }; +/* End PBXVariantGroup section */ + +/* Begin XCBuildConfiguration section */ + 249021D3217E4FDB00AE95B9 /* Profile */ = { + isa = XCBuildConfiguration; + buildSettings = { + ALWAYS_SEARCH_USER_PATHS = NO; + CLANG_ANALYZER_NONNULL = YES; + CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; + CLANG_CXX_LIBRARY = "libc++"; + CLANG_ENABLE_MODULES = YES; + CLANG_ENABLE_OBJC_ARC = YES; + CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; + CLANG_WARN_BOOL_CONVERSION = YES; + CLANG_WARN_COMMA = YES; + CLANG_WARN_CONSTANT_CONVERSION = YES; + CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; + CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; + CLANG_WARN_EMPTY_BODY = YES; + CLANG_WARN_ENUM_CONVERSION = YES; + CLANG_WARN_INFINITE_RECURSION = YES; + CLANG_WARN_INT_CONVERSION = YES; + CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; + CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; + CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; + CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; + CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; + CLANG_WARN_STRICT_PROTOTYPES = YES; + CLANG_WARN_SUSPICIOUS_MOVE = YES; + CLANG_WARN_UNREACHABLE_CODE = YES; + CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; + "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; + COPY_PHASE_STRIP = NO; + DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; + ENABLE_NS_ASSERTIONS = NO; + ENABLE_STRICT_OBJC_MSGSEND = YES; + GCC_C_LANGUAGE_STANDARD = gnu99; + GCC_NO_COMMON_BLOCKS = YES; + GCC_WARN_64_TO_32_BIT_CONVERSION = YES; + GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; + GCC_WARN_UNDECLARED_SELECTOR = YES; + GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; + GCC_WARN_UNUSED_FUNCTION = YES; + GCC_WARN_UNUSED_VARIABLE = YES; + IPHONEOS_DEPLOYMENT_TARGET = 9.0; + MTL_ENABLE_DEBUG_INFO = NO; + SDKROOT = iphoneos; + SUPPORTED_PLATFORMS = iphoneos; + TARGETED_DEVICE_FAMILY = "1,2"; + VALIDATE_PRODUCT = YES; + }; + name = Profile; + }; + 249021D4217E4FDB00AE95B9 /* Profile */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = 7AFA3C8E1D35360C0083082E /* Release.xcconfig */; + buildSettings = { + ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; + CLANG_ENABLE_MODULES = YES; + CURRENT_PROJECT_VERSION = "$(FLUTTER_BUILD_NUMBER)"; + DEVELOPMENT_TEAM = ZPBW2X86B5; + ENABLE_BITCODE = NO; + INFOPLIST_FILE = Runner/Info.plist; + LD_RUNPATH_SEARCH_PATHS = ( + "$(inherited)", + "@executable_path/Frameworks", + ); + PRODUCT_BUNDLE_IDENTIFIER = com.example.example; + PRODUCT_NAME = "$(TARGET_NAME)"; + SWIFT_OBJC_BRIDGING_HEADER = "Runner/Runner-Bridging-Header.h"; + SWIFT_VERSION = 5.0; + VERSIONING_SYSTEM = "apple-generic"; + }; + name = Profile; + }; + 97C147031CF9000F007C117D /* Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + ALWAYS_SEARCH_USER_PATHS = NO; + CLANG_ANALYZER_NONNULL = YES; + CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; + CLANG_CXX_LIBRARY = "libc++"; + CLANG_ENABLE_MODULES = YES; + CLANG_ENABLE_OBJC_ARC = YES; + CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; + CLANG_WARN_BOOL_CONVERSION = YES; + CLANG_WARN_COMMA = YES; + CLANG_WARN_CONSTANT_CONVERSION = YES; + CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; + CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; + CLANG_WARN_EMPTY_BODY = YES; + CLANG_WARN_ENUM_CONVERSION = YES; + CLANG_WARN_INFINITE_RECURSION = YES; + CLANG_WARN_INT_CONVERSION = YES; + CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; + CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; + CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; + CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; + CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; + CLANG_WARN_STRICT_PROTOTYPES = YES; + CLANG_WARN_SUSPICIOUS_MOVE = YES; + CLANG_WARN_UNREACHABLE_CODE = YES; + CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; + "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; + COPY_PHASE_STRIP = NO; + DEBUG_INFORMATION_FORMAT = dwarf; + ENABLE_STRICT_OBJC_MSGSEND = YES; + ENABLE_TESTABILITY = YES; + GCC_C_LANGUAGE_STANDARD = gnu99; + GCC_DYNAMIC_NO_PIC = NO; + GCC_NO_COMMON_BLOCKS = YES; + GCC_OPTIMIZATION_LEVEL = 0; + GCC_PREPROCESSOR_DEFINITIONS = ( + "DEBUG=1", + "$(inherited)", + ); + GCC_WARN_64_TO_32_BIT_CONVERSION = YES; + GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; + GCC_WARN_UNDECLARED_SELECTOR = YES; + GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; + GCC_WARN_UNUSED_FUNCTION = YES; + GCC_WARN_UNUSED_VARIABLE = YES; + IPHONEOS_DEPLOYMENT_TARGET = 9.0; + MTL_ENABLE_DEBUG_INFO = YES; + ONLY_ACTIVE_ARCH = YES; + SDKROOT = iphoneos; + TARGETED_DEVICE_FAMILY = "1,2"; + }; + name = Debug; + }; + 97C147041CF9000F007C117D /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + ALWAYS_SEARCH_USER_PATHS = NO; + CLANG_ANALYZER_NONNULL = YES; + CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; + CLANG_CXX_LIBRARY = "libc++"; + CLANG_ENABLE_MODULES = YES; + CLANG_ENABLE_OBJC_ARC = YES; + CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; + CLANG_WARN_BOOL_CONVERSION = YES; + CLANG_WARN_COMMA = YES; + CLANG_WARN_CONSTANT_CONVERSION = YES; + CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; + CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; + CLANG_WARN_EMPTY_BODY = YES; + CLANG_WARN_ENUM_CONVERSION = YES; + CLANG_WARN_INFINITE_RECURSION = YES; + CLANG_WARN_INT_CONVERSION = YES; + CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; + CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; + CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; + CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; + CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; + CLANG_WARN_STRICT_PROTOTYPES = YES; + CLANG_WARN_SUSPICIOUS_MOVE = YES; + CLANG_WARN_UNREACHABLE_CODE = YES; + CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; + "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; + COPY_PHASE_STRIP = NO; + DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; + ENABLE_NS_ASSERTIONS = NO; + ENABLE_STRICT_OBJC_MSGSEND = YES; + GCC_C_LANGUAGE_STANDARD = gnu99; + GCC_NO_COMMON_BLOCKS = YES; + GCC_WARN_64_TO_32_BIT_CONVERSION = YES; + GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; + GCC_WARN_UNDECLARED_SELECTOR = YES; + GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; + GCC_WARN_UNUSED_FUNCTION = YES; + GCC_WARN_UNUSED_VARIABLE = YES; + IPHONEOS_DEPLOYMENT_TARGET = 9.0; + MTL_ENABLE_DEBUG_INFO = NO; + SDKROOT = iphoneos; + SUPPORTED_PLATFORMS = iphoneos; + SWIFT_COMPILATION_MODE = wholemodule; + SWIFT_OPTIMIZATION_LEVEL = "-O"; + TARGETED_DEVICE_FAMILY = "1,2"; + VALIDATE_PRODUCT = YES; + }; + name = Release; + }; + 97C147061CF9000F007C117D /* Debug */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = 9740EEB21CF90195004384FC /* Debug.xcconfig */; + buildSettings = { + ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; + CLANG_ENABLE_MODULES = YES; + CURRENT_PROJECT_VERSION = "$(FLUTTER_BUILD_NUMBER)"; + DEVELOPMENT_TEAM = ZPBW2X86B5; + ENABLE_BITCODE = NO; + INFOPLIST_FILE = Runner/Info.plist; + LD_RUNPATH_SEARCH_PATHS = ( + "$(inherited)", + "@executable_path/Frameworks", + ); + PRODUCT_BUNDLE_IDENTIFIER = com.example.example; + PRODUCT_NAME = "$(TARGET_NAME)"; + SWIFT_OBJC_BRIDGING_HEADER = "Runner/Runner-Bridging-Header.h"; + SWIFT_OPTIMIZATION_LEVEL = "-Onone"; + SWIFT_VERSION = 5.0; + VERSIONING_SYSTEM = "apple-generic"; + }; + name = Debug; + }; + 97C147071CF9000F007C117D /* Release */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = 7AFA3C8E1D35360C0083082E /* Release.xcconfig */; + buildSettings = { + ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; + CLANG_ENABLE_MODULES = YES; + CURRENT_PROJECT_VERSION = "$(FLUTTER_BUILD_NUMBER)"; + DEVELOPMENT_TEAM = ZPBW2X86B5; + ENABLE_BITCODE = NO; + INFOPLIST_FILE = Runner/Info.plist; + LD_RUNPATH_SEARCH_PATHS = ( + "$(inherited)", + "@executable_path/Frameworks", + ); + PRODUCT_BUNDLE_IDENTIFIER = com.example.example; + PRODUCT_NAME = "$(TARGET_NAME)"; + SWIFT_OBJC_BRIDGING_HEADER = "Runner/Runner-Bridging-Header.h"; + SWIFT_VERSION = 5.0; + VERSIONING_SYSTEM = "apple-generic"; + }; + name = Release; + }; +/* End XCBuildConfiguration section */ + +/* Begin XCConfigurationList section */ + 97C146E91CF9000F007C117D /* Build configuration list for PBXProject "Runner" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 97C147031CF9000F007C117D /* Debug */, + 97C147041CF9000F007C117D /* Release */, + 249021D3217E4FDB00AE95B9 /* Profile */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; + 97C147051CF9000F007C117D /* Build configuration list for PBXNativeTarget "Runner" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 97C147061CF9000F007C117D /* Debug */, + 97C147071CF9000F007C117D /* Release */, + 249021D4217E4FDB00AE95B9 /* Profile */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; +/* End XCConfigurationList section */ + }; + rootObject = 97C146E61CF9000F007C117D /* Project object */; +} diff --git a/siro_rider/packages/calendar_builder/example/ios/Runner.xcodeproj/project.xcworkspace/contents.xcworkspacedata b/siro_rider/packages/calendar_builder/example/ios/Runner.xcodeproj/project.xcworkspace/contents.xcworkspacedata new file mode 100644 index 0000000..919434a --- /dev/null +++ b/siro_rider/packages/calendar_builder/example/ios/Runner.xcodeproj/project.xcworkspace/contents.xcworkspacedata @@ -0,0 +1,7 @@ + + + + + diff --git a/siro_rider/packages/calendar_builder/example/ios/Runner.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist b/siro_rider/packages/calendar_builder/example/ios/Runner.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist new file mode 100644 index 0000000..18d9810 --- /dev/null +++ b/siro_rider/packages/calendar_builder/example/ios/Runner.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist @@ -0,0 +1,8 @@ + + + + + IDEDidComputeMac32BitWarning + + + diff --git a/siro_rider/packages/calendar_builder/example/ios/Runner.xcodeproj/project.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings b/siro_rider/packages/calendar_builder/example/ios/Runner.xcodeproj/project.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings new file mode 100644 index 0000000..f9b0d7c --- /dev/null +++ b/siro_rider/packages/calendar_builder/example/ios/Runner.xcodeproj/project.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings @@ -0,0 +1,8 @@ + + + + + PreviewsEnabled + + + diff --git a/siro_rider/packages/calendar_builder/example/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme b/siro_rider/packages/calendar_builder/example/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme new file mode 100644 index 0000000..c87d15a --- /dev/null +++ b/siro_rider/packages/calendar_builder/example/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme @@ -0,0 +1,87 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/siro_rider/packages/calendar_builder/example/ios/Runner.xcworkspace/contents.xcworkspacedata b/siro_rider/packages/calendar_builder/example/ios/Runner.xcworkspace/contents.xcworkspacedata new file mode 100644 index 0000000..1d526a1 --- /dev/null +++ b/siro_rider/packages/calendar_builder/example/ios/Runner.xcworkspace/contents.xcworkspacedata @@ -0,0 +1,7 @@ + + + + + diff --git a/siro_rider/packages/calendar_builder/example/ios/Runner.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist b/siro_rider/packages/calendar_builder/example/ios/Runner.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist new file mode 100644 index 0000000..18d9810 --- /dev/null +++ b/siro_rider/packages/calendar_builder/example/ios/Runner.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist @@ -0,0 +1,8 @@ + + + + + IDEDidComputeMac32BitWarning + + + diff --git a/siro_rider/packages/calendar_builder/example/ios/Runner.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings b/siro_rider/packages/calendar_builder/example/ios/Runner.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings new file mode 100644 index 0000000..f9b0d7c --- /dev/null +++ b/siro_rider/packages/calendar_builder/example/ios/Runner.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings @@ -0,0 +1,8 @@ + + + + + PreviewsEnabled + + + diff --git a/siro_rider/packages/calendar_builder/example/ios/Runner/AppDelegate.swift b/siro_rider/packages/calendar_builder/example/ios/Runner/AppDelegate.swift new file mode 100644 index 0000000..70693e4 --- /dev/null +++ b/siro_rider/packages/calendar_builder/example/ios/Runner/AppDelegate.swift @@ -0,0 +1,13 @@ +import UIKit +import Flutter + +@UIApplicationMain +@objc class AppDelegate: FlutterAppDelegate { + override func application( + _ application: UIApplication, + didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]? + ) -> Bool { + GeneratedPluginRegistrant.register(with: self) + return super.application(application, didFinishLaunchingWithOptions: launchOptions) + } +} diff --git a/siro_rider/packages/calendar_builder/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Contents.json b/siro_rider/packages/calendar_builder/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Contents.json new file mode 100644 index 0000000..d36b1fa --- /dev/null +++ b/siro_rider/packages/calendar_builder/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Contents.json @@ -0,0 +1,122 @@ +{ + "images" : [ + { + "size" : "20x20", + "idiom" : "iphone", + "filename" : "Icon-App-20x20@2x.png", + "scale" : "2x" + }, + { + "size" : "20x20", + "idiom" : "iphone", + "filename" : "Icon-App-20x20@3x.png", + "scale" : "3x" + }, + { + "size" : "29x29", + "idiom" : "iphone", + "filename" : "Icon-App-29x29@1x.png", + "scale" : "1x" + }, + { + "size" : "29x29", + "idiom" : "iphone", + "filename" : "Icon-App-29x29@2x.png", + "scale" : "2x" + }, + { + "size" : "29x29", + "idiom" : "iphone", + "filename" : "Icon-App-29x29@3x.png", + "scale" : "3x" + }, + { + "size" : "40x40", + "idiom" : "iphone", + "filename" : "Icon-App-40x40@2x.png", + "scale" : "2x" + }, + { + "size" : "40x40", + "idiom" : "iphone", + "filename" : "Icon-App-40x40@3x.png", + "scale" : "3x" + }, + { + "size" : "60x60", + "idiom" : "iphone", + "filename" : "Icon-App-60x60@2x.png", + "scale" : "2x" + }, + { + "size" : "60x60", + "idiom" : "iphone", + "filename" : "Icon-App-60x60@3x.png", + "scale" : "3x" + }, + { + "size" : "20x20", + "idiom" : "ipad", + "filename" : "Icon-App-20x20@1x.png", + "scale" : "1x" + }, + { + "size" : "20x20", + "idiom" : "ipad", + "filename" : "Icon-App-20x20@2x.png", + "scale" : "2x" + }, + { + "size" : "29x29", + "idiom" : "ipad", + "filename" : "Icon-App-29x29@1x.png", + "scale" : "1x" + }, + { + "size" : "29x29", + "idiom" : "ipad", + "filename" : "Icon-App-29x29@2x.png", + "scale" : "2x" + }, + { + "size" : "40x40", + "idiom" : "ipad", + "filename" : "Icon-App-40x40@1x.png", + "scale" : "1x" + }, + { + "size" : "40x40", + "idiom" : "ipad", + "filename" : "Icon-App-40x40@2x.png", + "scale" : "2x" + }, + { + "size" : "76x76", + "idiom" : "ipad", + "filename" : "Icon-App-76x76@1x.png", + "scale" : "1x" + }, + { + "size" : "76x76", + "idiom" : "ipad", + "filename" : "Icon-App-76x76@2x.png", + "scale" : "2x" + }, + { + "size" : "83.5x83.5", + "idiom" : "ipad", + "filename" : "Icon-App-83.5x83.5@2x.png", + "scale" : "2x" + }, + { + "size" : "1024x1024", + "idiom" : "ios-marketing", + "filename" : "Icon-App-1024x1024@1x.png", + "scale" : "1x" + } + ], + "info" : { + "version" : 1, + "author" : "xcode" + } +} diff --git a/siro_rider/packages/calendar_builder/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-1024x1024@1x.png b/siro_rider/packages/calendar_builder/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-1024x1024@1x.png new file mode 100644 index 0000000..dc9ada4 Binary files /dev/null and b/siro_rider/packages/calendar_builder/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-1024x1024@1x.png differ diff --git a/siro_rider/packages/calendar_builder/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@1x.png b/siro_rider/packages/calendar_builder/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@1x.png new file mode 100644 index 0000000..28c6bf0 Binary files /dev/null and b/siro_rider/packages/calendar_builder/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@1x.png differ diff --git a/siro_rider/packages/calendar_builder/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@2x.png b/siro_rider/packages/calendar_builder/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@2x.png new file mode 100644 index 0000000..2ccbfd9 Binary files /dev/null and b/siro_rider/packages/calendar_builder/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@2x.png differ diff --git a/siro_rider/packages/calendar_builder/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@3x.png b/siro_rider/packages/calendar_builder/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@3x.png new file mode 100644 index 0000000..f091b6b Binary files /dev/null and b/siro_rider/packages/calendar_builder/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@3x.png differ diff --git a/siro_rider/packages/calendar_builder/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@1x.png b/siro_rider/packages/calendar_builder/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@1x.png new file mode 100644 index 0000000..4cde121 Binary files /dev/null and b/siro_rider/packages/calendar_builder/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@1x.png differ diff --git a/siro_rider/packages/calendar_builder/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@2x.png b/siro_rider/packages/calendar_builder/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@2x.png new file mode 100644 index 0000000..d0ef06e Binary files /dev/null and b/siro_rider/packages/calendar_builder/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@2x.png differ diff --git a/siro_rider/packages/calendar_builder/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@3x.png b/siro_rider/packages/calendar_builder/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@3x.png new file mode 100644 index 0000000..dcdc230 Binary files /dev/null and b/siro_rider/packages/calendar_builder/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@3x.png differ diff --git a/siro_rider/packages/calendar_builder/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@1x.png b/siro_rider/packages/calendar_builder/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@1x.png new file mode 100644 index 0000000..2ccbfd9 Binary files /dev/null and b/siro_rider/packages/calendar_builder/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@1x.png differ diff --git a/siro_rider/packages/calendar_builder/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@2x.png b/siro_rider/packages/calendar_builder/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@2x.png new file mode 100644 index 0000000..c8f9ed8 Binary files /dev/null and b/siro_rider/packages/calendar_builder/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@2x.png differ diff --git a/siro_rider/packages/calendar_builder/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@3x.png b/siro_rider/packages/calendar_builder/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@3x.png new file mode 100644 index 0000000..a6d6b86 Binary files /dev/null and b/siro_rider/packages/calendar_builder/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@3x.png differ diff --git a/siro_rider/packages/calendar_builder/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@2x.png b/siro_rider/packages/calendar_builder/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@2x.png new file mode 100644 index 0000000..a6d6b86 Binary files /dev/null and b/siro_rider/packages/calendar_builder/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@2x.png differ diff --git a/siro_rider/packages/calendar_builder/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@3x.png b/siro_rider/packages/calendar_builder/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@3x.png new file mode 100644 index 0000000..75b2d16 Binary files /dev/null and b/siro_rider/packages/calendar_builder/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@3x.png differ diff --git a/siro_rider/packages/calendar_builder/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-76x76@1x.png b/siro_rider/packages/calendar_builder/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-76x76@1x.png new file mode 100644 index 0000000..c4df70d Binary files /dev/null and b/siro_rider/packages/calendar_builder/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-76x76@1x.png differ diff --git a/siro_rider/packages/calendar_builder/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-76x76@2x.png b/siro_rider/packages/calendar_builder/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-76x76@2x.png new file mode 100644 index 0000000..6a84f41 Binary files /dev/null and b/siro_rider/packages/calendar_builder/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-76x76@2x.png differ diff --git a/siro_rider/packages/calendar_builder/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-83.5x83.5@2x.png b/siro_rider/packages/calendar_builder/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-83.5x83.5@2x.png new file mode 100644 index 0000000..d0e1f58 Binary files /dev/null and b/siro_rider/packages/calendar_builder/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-83.5x83.5@2x.png differ diff --git a/siro_rider/packages/calendar_builder/example/ios/Runner/Assets.xcassets/LaunchImage.imageset/Contents.json b/siro_rider/packages/calendar_builder/example/ios/Runner/Assets.xcassets/LaunchImage.imageset/Contents.json new file mode 100644 index 0000000..0bedcf2 --- /dev/null +++ b/siro_rider/packages/calendar_builder/example/ios/Runner/Assets.xcassets/LaunchImage.imageset/Contents.json @@ -0,0 +1,23 @@ +{ + "images" : [ + { + "idiom" : "universal", + "filename" : "LaunchImage.png", + "scale" : "1x" + }, + { + "idiom" : "universal", + "filename" : "LaunchImage@2x.png", + "scale" : "2x" + }, + { + "idiom" : "universal", + "filename" : "LaunchImage@3x.png", + "scale" : "3x" + } + ], + "info" : { + "version" : 1, + "author" : "xcode" + } +} diff --git a/siro_rider/packages/calendar_builder/example/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage.png b/siro_rider/packages/calendar_builder/example/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage.png new file mode 100644 index 0000000..9da19ea Binary files /dev/null and b/siro_rider/packages/calendar_builder/example/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage.png differ diff --git a/siro_rider/packages/calendar_builder/example/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage@2x.png b/siro_rider/packages/calendar_builder/example/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage@2x.png new file mode 100644 index 0000000..9da19ea Binary files /dev/null and b/siro_rider/packages/calendar_builder/example/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage@2x.png differ diff --git a/siro_rider/packages/calendar_builder/example/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage@3x.png b/siro_rider/packages/calendar_builder/example/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage@3x.png new file mode 100644 index 0000000..9da19ea Binary files /dev/null and b/siro_rider/packages/calendar_builder/example/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage@3x.png differ diff --git a/siro_rider/packages/calendar_builder/example/ios/Runner/Assets.xcassets/LaunchImage.imageset/README.md b/siro_rider/packages/calendar_builder/example/ios/Runner/Assets.xcassets/LaunchImage.imageset/README.md new file mode 100644 index 0000000..89c2725 --- /dev/null +++ b/siro_rider/packages/calendar_builder/example/ios/Runner/Assets.xcassets/LaunchImage.imageset/README.md @@ -0,0 +1,5 @@ +# Launch Screen Assets + +You can customize the launch screen with your own desired assets by replacing the image files in this directory. + +You can also do it by opening your Flutter project's Xcode project with `open ios/Runner.xcworkspace`, selecting `Runner/Assets.xcassets` in the Project Navigator and dropping in the desired images. \ No newline at end of file diff --git a/siro_rider/packages/calendar_builder/example/ios/Runner/Base.lproj/LaunchScreen.storyboard b/siro_rider/packages/calendar_builder/example/ios/Runner/Base.lproj/LaunchScreen.storyboard new file mode 100644 index 0000000..f2e259c --- /dev/null +++ b/siro_rider/packages/calendar_builder/example/ios/Runner/Base.lproj/LaunchScreen.storyboard @@ -0,0 +1,37 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/siro_rider/packages/calendar_builder/example/ios/Runner/Base.lproj/Main.storyboard b/siro_rider/packages/calendar_builder/example/ios/Runner/Base.lproj/Main.storyboard new file mode 100644 index 0000000..f3c2851 --- /dev/null +++ b/siro_rider/packages/calendar_builder/example/ios/Runner/Base.lproj/Main.storyboard @@ -0,0 +1,26 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/siro_rider/packages/calendar_builder/example/ios/Runner/GeneratedPluginRegistrant.h b/siro_rider/packages/calendar_builder/example/ios/Runner/GeneratedPluginRegistrant.h new file mode 100644 index 0000000..7a89092 --- /dev/null +++ b/siro_rider/packages/calendar_builder/example/ios/Runner/GeneratedPluginRegistrant.h @@ -0,0 +1,19 @@ +// +// Generated file. Do not edit. +// + +// clang-format off + +#ifndef GeneratedPluginRegistrant_h +#define GeneratedPluginRegistrant_h + +#import + +NS_ASSUME_NONNULL_BEGIN + +@interface GeneratedPluginRegistrant : NSObject ++ (void)registerWithRegistry:(NSObject*)registry; +@end + +NS_ASSUME_NONNULL_END +#endif /* GeneratedPluginRegistrant_h */ diff --git a/siro_rider/packages/calendar_builder/example/ios/Runner/GeneratedPluginRegistrant.m b/siro_rider/packages/calendar_builder/example/ios/Runner/GeneratedPluginRegistrant.m new file mode 100644 index 0000000..efe65ec --- /dev/null +++ b/siro_rider/packages/calendar_builder/example/ios/Runner/GeneratedPluginRegistrant.m @@ -0,0 +1,14 @@ +// +// Generated file. Do not edit. +// + +// clang-format off + +#import "GeneratedPluginRegistrant.h" + +@implementation GeneratedPluginRegistrant + ++ (void)registerWithRegistry:(NSObject*)registry { +} + +@end diff --git a/siro_rider/packages/calendar_builder/example/ios/Runner/Info.plist b/siro_rider/packages/calendar_builder/example/ios/Runner/Info.plist new file mode 100644 index 0000000..5baf7a1 --- /dev/null +++ b/siro_rider/packages/calendar_builder/example/ios/Runner/Info.plist @@ -0,0 +1,47 @@ + + + + + CFBundleDevelopmentRegion + $(DEVELOPMENT_LANGUAGE) + CFBundleDisplayName + Example + CFBundleExecutable + $(EXECUTABLE_NAME) + CFBundleIdentifier + $(PRODUCT_BUNDLE_IDENTIFIER) + CFBundleInfoDictionaryVersion + 6.0 + CFBundleName + example + CFBundlePackageType + APPL + CFBundleShortVersionString + $(FLUTTER_BUILD_NAME) + CFBundleSignature + ???? + CFBundleVersion + $(FLUTTER_BUILD_NUMBER) + LSRequiresIPhoneOS + + UILaunchStoryboardName + LaunchScreen + UIMainStoryboardFile + Main + UISupportedInterfaceOrientations + + UIInterfaceOrientationPortrait + UIInterfaceOrientationLandscapeLeft + UIInterfaceOrientationLandscapeRight + + UISupportedInterfaceOrientations~ipad + + UIInterfaceOrientationPortrait + UIInterfaceOrientationPortraitUpsideDown + UIInterfaceOrientationLandscapeLeft + UIInterfaceOrientationLandscapeRight + + UIViewControllerBasedStatusBarAppearance + + + diff --git a/siro_rider/packages/calendar_builder/example/ios/Runner/Runner-Bridging-Header.h b/siro_rider/packages/calendar_builder/example/ios/Runner/Runner-Bridging-Header.h new file mode 100644 index 0000000..308a2a5 --- /dev/null +++ b/siro_rider/packages/calendar_builder/example/ios/Runner/Runner-Bridging-Header.h @@ -0,0 +1 @@ +#import "GeneratedPluginRegistrant.h" diff --git a/siro_rider/packages/calendar_builder/example/lib/custom_month_builder.dart b/siro_rider/packages/calendar_builder/example/lib/custom_month_builder.dart new file mode 100644 index 0000000..4e6967e --- /dev/null +++ b/siro_rider/packages/calendar_builder/example/lib/custom_month_builder.dart @@ -0,0 +1,169 @@ +import 'package:calendar_builder/calendar_builder.dart'; +import 'package:flutter/material.dart'; + +class CustomMonthBuilderScreen extends StatelessWidget { + const CustomMonthBuilderScreen({Key? key}) : super(key: key); + + @override + Widget build(BuildContext context) { + return Scaffold( + body: SafeArea( + child: Column( + children: [ + Expanded( + child: CbMonthBuilder( + cbConfig: CbConfig( + startDate: DateTime(2020), + endDate: DateTime(2123), + selectedDate: DateTime(2022), + selectedYear: DateTime(2022), + weekStartsFrom: WeekStartsFrom.sunday, + eventDates: [ + DateTime(2022, 1, 2), + DateTime(2022, 1, 2), + DateTime(2022, 1, 3) + ], + highlightedDates: [ + DateTime(2022, 1, 6), + DateTime(2022, 1, 3) + ]), + yearDropDownCustomizer: YearDropDownCustomizer( + yearHeaderBuilder: + (isYearPickerExpanded, selectedDate, selectedYear, year) { + return Container( + height: 40, + color: Colors.yellow, + child: Row( + mainAxisAlignment: MainAxisAlignment.center, + crossAxisAlignment: CrossAxisAlignment.center, + children: [ + Text( + year, + style: const TextStyle(fontWeight: FontWeight.bold), + ), + Icon(!isYearPickerExpanded + ? Icons.arrow_drop_down_outlined + : Icons.arrow_drop_up_outlined) + ], + ), + ); + }, + ), + monthCustomizer: MonthCustomizer( + montMinhHeight: 200, + monthMinWidth: 450, + padding: const EdgeInsets.all(20), + monthHeaderBuilder: + (month, headerHeight, headerWidth, paddingLeft) { + return Container( + color: Colors.grey[200], + height: headerHeight, + width: headerWidth, + child: Padding( + padding: EdgeInsets.only(left: paddingLeft), + child: Align( + alignment: Alignment.center, + child: Text( + month, + style: const TextStyle( + fontSize: 22, + fontWeight: FontWeight.w600, + ), + ), + ), + ), + ); + }, + monthWeekBuilder: (index, weeks, weekHeight, weekWidth) { + return SizedBox( + height: weekHeight, + width: weekWidth, + child: Padding( + padding: const EdgeInsets.all(4.0), + child: Container( + decoration: BoxDecoration( + color: Colors.red.withOpacity(0.1), + borderRadius: BorderRadius.circular(10), + border: Border.all(color: Colors.red)), + child: Align( + child: Text( + weeks, + style: const TextStyle( + fontSize: 14, + color: Colors.red, + fontWeight: FontWeight.w500, + ), + overflow: TextOverflow.ellipsis, + maxLines: 1, + ), + ), + ), + ), + ); + }, + monthButtonBuilder: (dateTime, + childHeight, + childWidth, + isSelected, + isDisabled, + hasEvent, + isHighlighted, + isCurrentDay) { + //Text Theme + final txtTheme = Theme.of(context).textTheme; + //color theme + final colorTheme = Theme.of(context); + + var daysText = Align( + child: Text( + '${dateTime.day}', + style: isDisabled + ? txtTheme.titleMedium + : isSelected + ? txtTheme.bodyLarge!.copyWith( + fontWeight: FontWeight.bold, + color: + colorTheme.brightness == Brightness.dark + ? Colors.black + : Colors.white) + : isHighlighted + ? txtTheme.bodyLarge //Highlighted TextStyle + : isCurrentDay + ? txtTheme + .bodyLarge //CurrentDay TextStyle + : txtTheme.bodyLarge, + ), + ); + if (isSelected) { + return Container( + decoration: const BoxDecoration( + color: Colors.red, + shape: BoxShape.rectangle, + ), + margin: const EdgeInsets.all(2), + child: daysText, + ); + } + return Container( + decoration: BoxDecoration( + color: isDisabled ? Colors.grey[200] : Colors.yellow, + shape: BoxShape.rectangle, + border: hasEvent || isHighlighted + ? Border.all( + color: + isHighlighted ? Colors.red : Colors.blue, + width: 2) + : null), + margin: const EdgeInsets.all(2), + child: daysText, + ); + }, + ), + ), + ) + ], + ), + ), + ); + } +} diff --git a/siro_rider/packages/calendar_builder/example/lib/customized_month_builder.dart b/siro_rider/packages/calendar_builder/example/lib/customized_month_builder.dart new file mode 100644 index 0000000..ebd91f7 --- /dev/null +++ b/siro_rider/packages/calendar_builder/example/lib/customized_month_builder.dart @@ -0,0 +1,128 @@ +import 'package:calendar_builder/calendar_builder.dart'; +import 'package:flutter/material.dart'; + +class CustomizedMonthBuilderScreen extends StatefulWidget { + const CustomizedMonthBuilderScreen({Key? key}) : super(key: key); + + @override + State createState() => + _CustomizedMonthBuilderScreenState(); +} + +class _CustomizedMonthBuilderScreenState + extends State { + bool isDarkMode = true; + @override + Widget build(BuildContext context) { + return Theme( + data: isDarkMode ? ThemeData.dark() : ThemeData.light(), + child: Scaffold( + body: SafeArea( + child: Column( + children: [ + Expanded( + child: CbMonthBuilder( + cbConfig: CbConfig( + startDate: DateTime(2020), + endDate: DateTime(2123), + selectedDate: DateTime(2022, 3, 4), + selectedYear: DateTime(2022), + weekStartsFrom: WeekStartsFrom.wednesday, + disabledDates: [ + DateTime(2022, 1, 7), + DateTime(2022, 1, 9), + ], + eventDates: [ + DateTime(2022, 1, 2), + DateTime(2022, 1, 2), + DateTime(2022, 1, 3) + ], + highlightedDates: [ + DateTime(2022, 1, 6), + DateTime(2022, 1, 3) + ]), + monthCustomizer: MonthCustomizer( + padding: const EdgeInsets.all(20), + monthHeaderCustomizer: MonthHeaderCustomizer( + textStyle: const TextStyle( + color: Colors.red, + fontSize: 22, + fontWeight: FontWeight.bold, + ), + ), + monthButtonCustomizer: MonthButtonCustomizer( + currentDayColor: Colors.orange, + borderStrokeWidth: 2, + textStyleOnDisabled: + const TextStyle(color: Colors.red), + highlightedColor: + const Color.fromARGB(255, 255, 174, 0)), + monthWeekCustomizer: MonthWeekCustomizer( + textStyle: const TextStyle( + color: Color.fromARGB(255, 255, 174, 0))) + // monthWidth: 500, + // monthHeight: 200 + ), + yearDropDownCustomizer: YearDropDownCustomizer( + yearButtonCustomizer: YearButtonCustomizer( + borderColorOnSelected: Colors.red, + ), + yearHeaderCustomizer: YearHeaderCustomizer( + titleTextStyle: const TextStyle( + color: Color.fromARGB(255, 255, 174, 0)))), + onYearHeaderExpanded: (isExpanded) { + snackBar('isExpanded ' + isExpanded.toString()); + }, + onDateClicked: (onDateClicked) { + snackBar('selected date' + + onDateClicked.selectedDate.toString() + + '\n' + + 'isSelected ' + + onDateClicked.isSelected.toString() + + '\n' + + 'isHighlighted ' + + onDateClicked.isHighlighted.toString() + + '\n' + + 'hasEvent ' + + onDateClicked.hasEvent.toString() + + '\n' + + 'isCurrentDate ' + + onDateClicked.isCurrentDate.toString() + + '\n' + + 'isDisabled ' + + onDateClicked.isDisabled.toString()); + }, + onYearButtonClicked: (year, isSelected) { + snackBar('selected year ' + + year.toString() + + '\n' + + 'isSelected ' + + isSelected.toString()); + }), + ) + ], + ), + ), + floatingActionButton: FloatingActionButton.extended( + onPressed: () { + isDarkMode = !isDarkMode; + setState(() {}); + }, + isExtended: true, + label: Row( + children: [ + Icon(!isDarkMode ? Icons.dark_mode : Icons.light_mode), + Text(!isDarkMode ? ' Dark Mode' : ' Light Mode') + ], + ), + ), + ), + ); + } + + void snackBar(Object meg) { + ScaffoldMessenger.of(context) + ..hideCurrentSnackBar() + ..showSnackBar(SnackBar(content: Text(meg.toString()))); + } +} diff --git a/siro_rider/packages/calendar_builder/example/lib/main.dart b/siro_rider/packages/calendar_builder/example/lib/main.dart new file mode 100644 index 0000000..683a4cc --- /dev/null +++ b/siro_rider/packages/calendar_builder/example/lib/main.dart @@ -0,0 +1,88 @@ +import 'package:calendar_builder/calendar_builder.dart'; +import 'package:example/custom_month_builder.dart'; +import 'package:example/customized_month_builder.dart'; +import 'package:example/month_builder.dart'; + +import 'package:flutter/material.dart'; + +void main() { + CalendarGlobals.showLogs = true; + runApp(const MyApp()); +} + +class MyApp extends StatelessWidget { + const MyApp({Key? key}) : super(key: key); + + @override + Widget build(BuildContext context) { + return MaterialApp( + title: 'Calendar builder Demo', + // theme: ThemeData(brightness: Brightness.dark), + // themeMode: ThemeMode.dark, + // darkTheme: ThemeData.dark(), + routes: { + '/month_builder': (context) => const MonthBuilderScreen(), + '/customized_month_builder': (context) => + const CustomizedMonthBuilderScreen(), + '/custom_month_builder': (context) => const CustomMonthBuilderScreen(), + // '/fromAsset': (context) => const PlayVideoFromAsset(), + // '/fromNetwork': (context) => const PlayVideoFromNetwork(), + // '/customVideo': (context) => const CustomVideoControlls(), + }, + home: const MainPage(), + ); + } +} + +class MainPage extends StatefulWidget { + const MainPage({Key? key}) : super(key: key); + + @override + State createState() => _MainPageState(); +} + +class _MainPageState extends State { + @override + Widget build(BuildContext context) { + return Scaffold( + body: Center( + child: ListView( + shrinkWrap: true, + children: [ + // _button('Play video from File'), + _button( + 'Default / Simple Month Builder', + onPressed: () => + Navigator.of(context).pushNamed('/month_builder'), + ), + _button( + 'Customized Month Builder', + onPressed: () => + Navigator.of(context).pushNamed('/customized_month_builder'), + ), + _button( + 'Custom Month Builder', + onPressed: () => + Navigator.of(context).pushNamed('/custom_month_builder'), + ), + ], + ), + ), + ); + } + + Widget _button(String text, {void Function()? onPressed}) { + return Center( + child: Padding( + padding: const EdgeInsets.all(20), + child: OutlinedButton( + onPressed: onPressed ?? () {}, + child: Text( + text, + style: const TextStyle(fontSize: 16, fontWeight: FontWeight.bold), + ), + ), + ), + ); + } +} diff --git a/siro_rider/packages/calendar_builder/example/lib/month_builder.dart b/siro_rider/packages/calendar_builder/example/lib/month_builder.dart new file mode 100644 index 0000000..2c03eb9 --- /dev/null +++ b/siro_rider/packages/calendar_builder/example/lib/month_builder.dart @@ -0,0 +1,28 @@ +import 'package:calendar_builder/calendar_builder.dart'; +import 'package:flutter/material.dart'; + +class MonthBuilderScreen extends StatelessWidget { + const MonthBuilderScreen({Key? key}) : super(key: key); + + @override + Widget build(BuildContext context) { + return Scaffold( + body: SafeArea( + child: Column( + children: [ + Expanded( + child: CbMonthBuilder( + cbConfig: CbConfig( + startDate: DateTime(2020), + endDate: DateTime(2026), + selectedDate: DateTime(2021, 3, 4), + selectedYear: DateTime(2021), + ), + ), + ) + ], + ), + ), + ); + } +} diff --git a/siro_rider/packages/calendar_builder/example/macos/Flutter/Flutter-Debug.xcconfig b/siro_rider/packages/calendar_builder/example/macos/Flutter/Flutter-Debug.xcconfig new file mode 100644 index 0000000..c2efd0b --- /dev/null +++ b/siro_rider/packages/calendar_builder/example/macos/Flutter/Flutter-Debug.xcconfig @@ -0,0 +1 @@ +#include "ephemeral/Flutter-Generated.xcconfig" diff --git a/siro_rider/packages/calendar_builder/example/macos/Flutter/Flutter-Release.xcconfig b/siro_rider/packages/calendar_builder/example/macos/Flutter/Flutter-Release.xcconfig new file mode 100644 index 0000000..c2efd0b --- /dev/null +++ b/siro_rider/packages/calendar_builder/example/macos/Flutter/Flutter-Release.xcconfig @@ -0,0 +1 @@ +#include "ephemeral/Flutter-Generated.xcconfig" diff --git a/siro_rider/packages/calendar_builder/example/macos/Flutter/GeneratedPluginRegistrant.swift b/siro_rider/packages/calendar_builder/example/macos/Flutter/GeneratedPluginRegistrant.swift new file mode 100644 index 0000000..cccf817 --- /dev/null +++ b/siro_rider/packages/calendar_builder/example/macos/Flutter/GeneratedPluginRegistrant.swift @@ -0,0 +1,10 @@ +// +// Generated file. Do not edit. +// + +import FlutterMacOS +import Foundation + + +func RegisterGeneratedPlugins(registry: FlutterPluginRegistry) { +} diff --git a/siro_rider/packages/calendar_builder/example/macos/Flutter/ephemeral/Flutter-Generated.xcconfig b/siro_rider/packages/calendar_builder/example/macos/Flutter/ephemeral/Flutter-Generated.xcconfig new file mode 100644 index 0000000..9d1170c --- /dev/null +++ b/siro_rider/packages/calendar_builder/example/macos/Flutter/ephemeral/Flutter-Generated.xcconfig @@ -0,0 +1,11 @@ +// This is a generated file; do not edit or check into version control. +FLUTTER_ROOT=/Users/hamzaaleghwairyeen/flutter +FLUTTER_APPLICATION_PATH=/Users/hamzaaleghwairyeen/development/App/Intaleq/packages/calendar_builder/example +COCOAPODS_PARALLEL_CODE_SIGN=true +FLUTTER_BUILD_DIR=build +FLUTTER_BUILD_NAME=1.0.0 +FLUTTER_BUILD_NUMBER=1 +DART_OBFUSCATION=false +TRACK_WIDGET_CREATION=true +TREE_SHAKE_ICONS=false +PACKAGE_CONFIG=.dart_tool/package_config.json diff --git a/siro_rider/packages/calendar_builder/example/macos/Flutter/ephemeral/flutter_export_environment.sh b/siro_rider/packages/calendar_builder/example/macos/Flutter/ephemeral/flutter_export_environment.sh new file mode 100755 index 0000000..49bd4d7 --- /dev/null +++ b/siro_rider/packages/calendar_builder/example/macos/Flutter/ephemeral/flutter_export_environment.sh @@ -0,0 +1,12 @@ +#!/bin/sh +# This is a generated file; do not edit or check into version control. +export "FLUTTER_ROOT=/Users/hamzaaleghwairyeen/flutter" +export "FLUTTER_APPLICATION_PATH=/Users/hamzaaleghwairyeen/development/App/Intaleq/packages/calendar_builder/example" +export "COCOAPODS_PARALLEL_CODE_SIGN=true" +export "FLUTTER_BUILD_DIR=build" +export "FLUTTER_BUILD_NAME=1.0.0" +export "FLUTTER_BUILD_NUMBER=1" +export "DART_OBFUSCATION=false" +export "TRACK_WIDGET_CREATION=true" +export "TREE_SHAKE_ICONS=false" +export "PACKAGE_CONFIG=.dart_tool/package_config.json" diff --git a/siro_rider/packages/calendar_builder/example/macos/Runner.xcodeproj/project.pbxproj b/siro_rider/packages/calendar_builder/example/macos/Runner.xcodeproj/project.pbxproj new file mode 100644 index 0000000..c84862c --- /dev/null +++ b/siro_rider/packages/calendar_builder/example/macos/Runner.xcodeproj/project.pbxproj @@ -0,0 +1,572 @@ +// !$*UTF8*$! +{ + archiveVersion = 1; + classes = { + }; + objectVersion = 51; + objects = { + +/* Begin PBXAggregateTarget section */ + 33CC111A2044C6BA0003C045 /* Flutter Assemble */ = { + isa = PBXAggregateTarget; + buildConfigurationList = 33CC111B2044C6BA0003C045 /* Build configuration list for PBXAggregateTarget "Flutter Assemble" */; + buildPhases = ( + 33CC111E2044C6BF0003C045 /* ShellScript */, + ); + dependencies = ( + ); + name = "Flutter Assemble"; + productName = FLX; + }; +/* End PBXAggregateTarget section */ + +/* Begin PBXBuildFile section */ + 335BBD1B22A9A15E00E9071D /* GeneratedPluginRegistrant.swift in Sources */ = {isa = PBXBuildFile; fileRef = 335BBD1A22A9A15E00E9071D /* GeneratedPluginRegistrant.swift */; }; + 33CC10F12044A3C60003C045 /* AppDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 33CC10F02044A3C60003C045 /* AppDelegate.swift */; }; + 33CC10F32044A3C60003C045 /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 33CC10F22044A3C60003C045 /* Assets.xcassets */; }; + 33CC10F62044A3C60003C045 /* MainMenu.xib in Resources */ = {isa = PBXBuildFile; fileRef = 33CC10F42044A3C60003C045 /* MainMenu.xib */; }; + 33CC11132044BFA00003C045 /* MainFlutterWindow.swift in Sources */ = {isa = PBXBuildFile; fileRef = 33CC11122044BFA00003C045 /* MainFlutterWindow.swift */; }; +/* End PBXBuildFile section */ + +/* Begin PBXContainerItemProxy section */ + 33CC111F2044C79F0003C045 /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = 33CC10E52044A3C60003C045 /* Project object */; + proxyType = 1; + remoteGlobalIDString = 33CC111A2044C6BA0003C045; + remoteInfo = FLX; + }; +/* End PBXContainerItemProxy section */ + +/* Begin PBXCopyFilesBuildPhase section */ + 33CC110E2044A8840003C045 /* Bundle Framework */ = { + isa = PBXCopyFilesBuildPhase; + buildActionMask = 2147483647; + dstPath = ""; + dstSubfolderSpec = 10; + files = ( + ); + name = "Bundle Framework"; + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXCopyFilesBuildPhase section */ + +/* Begin PBXFileReference section */ + 333000ED22D3DE5D00554162 /* Warnings.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; path = Warnings.xcconfig; sourceTree = ""; }; + 335BBD1A22A9A15E00E9071D /* GeneratedPluginRegistrant.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = GeneratedPluginRegistrant.swift; sourceTree = ""; }; + 33CC10ED2044A3C60003C045 /* example.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = "example.app"; sourceTree = BUILT_PRODUCTS_DIR; }; + 33CC10F02044A3C60003C045 /* AppDelegate.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AppDelegate.swift; sourceTree = ""; }; + 33CC10F22044A3C60003C045 /* Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; name = Assets.xcassets; path = Runner/Assets.xcassets; sourceTree = ""; }; + 33CC10F52044A3C60003C045 /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.xib; name = Base; path = Base.lproj/MainMenu.xib; sourceTree = ""; }; + 33CC10F72044A3C60003C045 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; name = Info.plist; path = Runner/Info.plist; sourceTree = ""; }; + 33CC11122044BFA00003C045 /* MainFlutterWindow.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MainFlutterWindow.swift; sourceTree = ""; }; + 33CEB47222A05771004F2AC0 /* Flutter-Debug.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; path = "Flutter-Debug.xcconfig"; sourceTree = ""; }; + 33CEB47422A05771004F2AC0 /* Flutter-Release.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; path = "Flutter-Release.xcconfig"; sourceTree = ""; }; + 33CEB47722A0578A004F2AC0 /* Flutter-Generated.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; name = "Flutter-Generated.xcconfig"; path = "ephemeral/Flutter-Generated.xcconfig"; sourceTree = ""; }; + 33E51913231747F40026EE4D /* DebugProfile.entitlements */ = {isa = PBXFileReference; lastKnownFileType = text.plist.entitlements; path = DebugProfile.entitlements; sourceTree = ""; }; + 33E51914231749380026EE4D /* Release.entitlements */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.entitlements; path = Release.entitlements; sourceTree = ""; }; + 33E5194F232828860026EE4D /* AppInfo.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; path = AppInfo.xcconfig; sourceTree = ""; }; + 7AFA3C8E1D35360C0083082E /* Release.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; path = Release.xcconfig; sourceTree = ""; }; + 9740EEB21CF90195004384FC /* Debug.xcconfig */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xcconfig; path = Debug.xcconfig; sourceTree = ""; }; +/* End PBXFileReference section */ + +/* Begin PBXFrameworksBuildPhase section */ + 33CC10EA2044A3C60003C045 /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXFrameworksBuildPhase section */ + +/* Begin PBXGroup section */ + 33BA886A226E78AF003329D5 /* Configs */ = { + isa = PBXGroup; + children = ( + 33E5194F232828860026EE4D /* AppInfo.xcconfig */, + 9740EEB21CF90195004384FC /* Debug.xcconfig */, + 7AFA3C8E1D35360C0083082E /* Release.xcconfig */, + 333000ED22D3DE5D00554162 /* Warnings.xcconfig */, + ); + path = Configs; + sourceTree = ""; + }; + 33CC10E42044A3C60003C045 = { + isa = PBXGroup; + children = ( + 33FAB671232836740065AC1E /* Runner */, + 33CEB47122A05771004F2AC0 /* Flutter */, + 33CC10EE2044A3C60003C045 /* Products */, + D73912EC22F37F3D000D13A0 /* Frameworks */, + ); + sourceTree = ""; + }; + 33CC10EE2044A3C60003C045 /* Products */ = { + isa = PBXGroup; + children = ( + 33CC10ED2044A3C60003C045 /* example.app */, + ); + name = Products; + sourceTree = ""; + }; + 33CC11242044D66E0003C045 /* Resources */ = { + isa = PBXGroup; + children = ( + 33CC10F22044A3C60003C045 /* Assets.xcassets */, + 33CC10F42044A3C60003C045 /* MainMenu.xib */, + 33CC10F72044A3C60003C045 /* Info.plist */, + ); + name = Resources; + path = ..; + sourceTree = ""; + }; + 33CEB47122A05771004F2AC0 /* Flutter */ = { + isa = PBXGroup; + children = ( + 335BBD1A22A9A15E00E9071D /* GeneratedPluginRegistrant.swift */, + 33CEB47222A05771004F2AC0 /* Flutter-Debug.xcconfig */, + 33CEB47422A05771004F2AC0 /* Flutter-Release.xcconfig */, + 33CEB47722A0578A004F2AC0 /* Flutter-Generated.xcconfig */, + ); + path = Flutter; + sourceTree = ""; + }; + 33FAB671232836740065AC1E /* Runner */ = { + isa = PBXGroup; + children = ( + 33CC10F02044A3C60003C045 /* AppDelegate.swift */, + 33CC11122044BFA00003C045 /* MainFlutterWindow.swift */, + 33E51913231747F40026EE4D /* DebugProfile.entitlements */, + 33E51914231749380026EE4D /* Release.entitlements */, + 33CC11242044D66E0003C045 /* Resources */, + 33BA886A226E78AF003329D5 /* Configs */, + ); + path = Runner; + sourceTree = ""; + }; + D73912EC22F37F3D000D13A0 /* Frameworks */ = { + isa = PBXGroup; + children = ( + ); + name = Frameworks; + sourceTree = ""; + }; +/* End PBXGroup section */ + +/* Begin PBXNativeTarget section */ + 33CC10EC2044A3C60003C045 /* Runner */ = { + isa = PBXNativeTarget; + buildConfigurationList = 33CC10FB2044A3C60003C045 /* Build configuration list for PBXNativeTarget "Runner" */; + buildPhases = ( + 33CC10E92044A3C60003C045 /* Sources */, + 33CC10EA2044A3C60003C045 /* Frameworks */, + 33CC10EB2044A3C60003C045 /* Resources */, + 33CC110E2044A8840003C045 /* Bundle Framework */, + 3399D490228B24CF009A79C7 /* ShellScript */, + ); + buildRules = ( + ); + dependencies = ( + 33CC11202044C79F0003C045 /* PBXTargetDependency */, + ); + name = Runner; + productName = Runner; + productReference = 33CC10ED2044A3C60003C045 /* example.app */; + productType = "com.apple.product-type.application"; + }; +/* End PBXNativeTarget section */ + +/* Begin PBXProject section */ + 33CC10E52044A3C60003C045 /* Project object */ = { + isa = PBXProject; + attributes = { + LastSwiftUpdateCheck = 0920; + LastUpgradeCheck = 1300; + ORGANIZATIONNAME = ""; + TargetAttributes = { + 33CC10EC2044A3C60003C045 = { + CreatedOnToolsVersion = 9.2; + LastSwiftMigration = 1100; + ProvisioningStyle = Automatic; + SystemCapabilities = { + com.apple.Sandbox = { + enabled = 1; + }; + }; + }; + 33CC111A2044C6BA0003C045 = { + CreatedOnToolsVersion = 9.2; + ProvisioningStyle = Manual; + }; + }; + }; + buildConfigurationList = 33CC10E82044A3C60003C045 /* Build configuration list for PBXProject "Runner" */; + compatibilityVersion = "Xcode 9.3"; + developmentRegion = en; + hasScannedForEncodings = 0; + knownRegions = ( + en, + Base, + ); + mainGroup = 33CC10E42044A3C60003C045; + productRefGroup = 33CC10EE2044A3C60003C045 /* Products */; + projectDirPath = ""; + projectRoot = ""; + targets = ( + 33CC10EC2044A3C60003C045 /* Runner */, + 33CC111A2044C6BA0003C045 /* Flutter Assemble */, + ); + }; +/* End PBXProject section */ + +/* Begin PBXResourcesBuildPhase section */ + 33CC10EB2044A3C60003C045 /* Resources */ = { + isa = PBXResourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + 33CC10F32044A3C60003C045 /* Assets.xcassets in Resources */, + 33CC10F62044A3C60003C045 /* MainMenu.xib in Resources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXResourcesBuildPhase section */ + +/* Begin PBXShellScriptBuildPhase section */ + 3399D490228B24CF009A79C7 /* ShellScript */ = { + isa = PBXShellScriptBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + inputFileListPaths = ( + ); + inputPaths = ( + ); + outputFileListPaths = ( + ); + outputPaths = ( + ); + runOnlyForDeploymentPostprocessing = 0; + shellPath = /bin/sh; + shellScript = "echo \"$PRODUCT_NAME.app\" > \"$PROJECT_DIR\"/Flutter/ephemeral/.app_filename && \"$FLUTTER_ROOT\"/packages/flutter_tools/bin/macos_assemble.sh embed\n"; + }; + 33CC111E2044C6BF0003C045 /* ShellScript */ = { + isa = PBXShellScriptBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + inputFileListPaths = ( + Flutter/ephemeral/FlutterInputs.xcfilelist, + ); + inputPaths = ( + Flutter/ephemeral/tripwire, + ); + outputFileListPaths = ( + Flutter/ephemeral/FlutterOutputs.xcfilelist, + ); + outputPaths = ( + ); + runOnlyForDeploymentPostprocessing = 0; + shellPath = /bin/sh; + shellScript = "\"$FLUTTER_ROOT\"/packages/flutter_tools/bin/macos_assemble.sh && touch Flutter/ephemeral/tripwire"; + }; +/* End PBXShellScriptBuildPhase section */ + +/* Begin PBXSourcesBuildPhase section */ + 33CC10E92044A3C60003C045 /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + 33CC11132044BFA00003C045 /* MainFlutterWindow.swift in Sources */, + 33CC10F12044A3C60003C045 /* AppDelegate.swift in Sources */, + 335BBD1B22A9A15E00E9071D /* GeneratedPluginRegistrant.swift in Sources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXSourcesBuildPhase section */ + +/* Begin PBXTargetDependency section */ + 33CC11202044C79F0003C045 /* PBXTargetDependency */ = { + isa = PBXTargetDependency; + target = 33CC111A2044C6BA0003C045 /* Flutter Assemble */; + targetProxy = 33CC111F2044C79F0003C045 /* PBXContainerItemProxy */; + }; +/* End PBXTargetDependency section */ + +/* Begin PBXVariantGroup section */ + 33CC10F42044A3C60003C045 /* MainMenu.xib */ = { + isa = PBXVariantGroup; + children = ( + 33CC10F52044A3C60003C045 /* Base */, + ); + name = MainMenu.xib; + path = Runner; + sourceTree = ""; + }; +/* End PBXVariantGroup section */ + +/* Begin XCBuildConfiguration section */ + 338D0CE9231458BD00FA5F75 /* Profile */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = 7AFA3C8E1D35360C0083082E /* Release.xcconfig */; + buildSettings = { + ALWAYS_SEARCH_USER_PATHS = NO; + CLANG_ANALYZER_NONNULL = YES; + CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE; + CLANG_CXX_LANGUAGE_STANDARD = "gnu++14"; + CLANG_CXX_LIBRARY = "libc++"; + CLANG_ENABLE_MODULES = YES; + CLANG_ENABLE_OBJC_ARC = YES; + CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; + CLANG_WARN_BOOL_CONVERSION = YES; + CLANG_WARN_CONSTANT_CONVERSION = YES; + CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; + CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; + CLANG_WARN_DOCUMENTATION_COMMENTS = YES; + CLANG_WARN_EMPTY_BODY = YES; + CLANG_WARN_ENUM_CONVERSION = YES; + CLANG_WARN_INFINITE_RECURSION = YES; + CLANG_WARN_INT_CONVERSION = YES; + CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; + CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; + CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; + CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; + CLANG_WARN_SUSPICIOUS_MOVE = YES; + CODE_SIGN_IDENTITY = "-"; + COPY_PHASE_STRIP = NO; + DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; + ENABLE_NS_ASSERTIONS = NO; + ENABLE_STRICT_OBJC_MSGSEND = YES; + GCC_C_LANGUAGE_STANDARD = gnu11; + GCC_NO_COMMON_BLOCKS = YES; + GCC_WARN_64_TO_32_BIT_CONVERSION = YES; + GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; + GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; + GCC_WARN_UNUSED_FUNCTION = YES; + GCC_WARN_UNUSED_VARIABLE = YES; + MACOSX_DEPLOYMENT_TARGET = 10.11; + MTL_ENABLE_DEBUG_INFO = NO; + SDKROOT = macosx; + SWIFT_COMPILATION_MODE = wholemodule; + SWIFT_OPTIMIZATION_LEVEL = "-O"; + }; + name = Profile; + }; + 338D0CEA231458BD00FA5F75 /* Profile */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = 33E5194F232828860026EE4D /* AppInfo.xcconfig */; + buildSettings = { + ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; + CLANG_ENABLE_MODULES = YES; + CODE_SIGN_ENTITLEMENTS = Runner/DebugProfile.entitlements; + CODE_SIGN_STYLE = Automatic; + COMBINE_HIDPI_IMAGES = YES; + INFOPLIST_FILE = Runner/Info.plist; + LD_RUNPATH_SEARCH_PATHS = ( + "$(inherited)", + "@executable_path/../Frameworks", + ); + PROVISIONING_PROFILE_SPECIFIER = ""; + SWIFT_VERSION = 5.0; + }; + name = Profile; + }; + 338D0CEB231458BD00FA5F75 /* Profile */ = { + isa = XCBuildConfiguration; + buildSettings = { + CODE_SIGN_STYLE = Manual; + PRODUCT_NAME = "$(TARGET_NAME)"; + }; + name = Profile; + }; + 33CC10F92044A3C60003C045 /* Debug */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = 9740EEB21CF90195004384FC /* Debug.xcconfig */; + buildSettings = { + ALWAYS_SEARCH_USER_PATHS = NO; + CLANG_ANALYZER_NONNULL = YES; + CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE; + CLANG_CXX_LANGUAGE_STANDARD = "gnu++14"; + CLANG_CXX_LIBRARY = "libc++"; + CLANG_ENABLE_MODULES = YES; + CLANG_ENABLE_OBJC_ARC = YES; + CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; + CLANG_WARN_BOOL_CONVERSION = YES; + CLANG_WARN_CONSTANT_CONVERSION = YES; + CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; + CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; + CLANG_WARN_DOCUMENTATION_COMMENTS = YES; + CLANG_WARN_EMPTY_BODY = YES; + CLANG_WARN_ENUM_CONVERSION = YES; + CLANG_WARN_INFINITE_RECURSION = YES; + CLANG_WARN_INT_CONVERSION = YES; + CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; + CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; + CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; + CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; + CLANG_WARN_SUSPICIOUS_MOVE = YES; + CODE_SIGN_IDENTITY = "-"; + COPY_PHASE_STRIP = NO; + DEBUG_INFORMATION_FORMAT = dwarf; + ENABLE_STRICT_OBJC_MSGSEND = YES; + ENABLE_TESTABILITY = YES; + GCC_C_LANGUAGE_STANDARD = gnu11; + GCC_DYNAMIC_NO_PIC = NO; + GCC_NO_COMMON_BLOCKS = YES; + GCC_OPTIMIZATION_LEVEL = 0; + GCC_PREPROCESSOR_DEFINITIONS = ( + "DEBUG=1", + "$(inherited)", + ); + GCC_WARN_64_TO_32_BIT_CONVERSION = YES; + GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; + GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; + GCC_WARN_UNUSED_FUNCTION = YES; + GCC_WARN_UNUSED_VARIABLE = YES; + MACOSX_DEPLOYMENT_TARGET = 10.11; + MTL_ENABLE_DEBUG_INFO = YES; + ONLY_ACTIVE_ARCH = YES; + SDKROOT = macosx; + SWIFT_ACTIVE_COMPILATION_CONDITIONS = DEBUG; + SWIFT_OPTIMIZATION_LEVEL = "-Onone"; + }; + name = Debug; + }; + 33CC10FA2044A3C60003C045 /* Release */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = 7AFA3C8E1D35360C0083082E /* Release.xcconfig */; + buildSettings = { + ALWAYS_SEARCH_USER_PATHS = NO; + CLANG_ANALYZER_NONNULL = YES; + CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE; + CLANG_CXX_LANGUAGE_STANDARD = "gnu++14"; + CLANG_CXX_LIBRARY = "libc++"; + CLANG_ENABLE_MODULES = YES; + CLANG_ENABLE_OBJC_ARC = YES; + CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; + CLANG_WARN_BOOL_CONVERSION = YES; + CLANG_WARN_CONSTANT_CONVERSION = YES; + CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; + CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; + CLANG_WARN_DOCUMENTATION_COMMENTS = YES; + CLANG_WARN_EMPTY_BODY = YES; + CLANG_WARN_ENUM_CONVERSION = YES; + CLANG_WARN_INFINITE_RECURSION = YES; + CLANG_WARN_INT_CONVERSION = YES; + CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; + CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; + CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; + CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; + CLANG_WARN_SUSPICIOUS_MOVE = YES; + CODE_SIGN_IDENTITY = "-"; + COPY_PHASE_STRIP = NO; + DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; + ENABLE_NS_ASSERTIONS = NO; + ENABLE_STRICT_OBJC_MSGSEND = YES; + GCC_C_LANGUAGE_STANDARD = gnu11; + GCC_NO_COMMON_BLOCKS = YES; + GCC_WARN_64_TO_32_BIT_CONVERSION = YES; + GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; + GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; + GCC_WARN_UNUSED_FUNCTION = YES; + GCC_WARN_UNUSED_VARIABLE = YES; + MACOSX_DEPLOYMENT_TARGET = 10.11; + MTL_ENABLE_DEBUG_INFO = NO; + SDKROOT = macosx; + SWIFT_COMPILATION_MODE = wholemodule; + SWIFT_OPTIMIZATION_LEVEL = "-O"; + }; + name = Release; + }; + 33CC10FC2044A3C60003C045 /* Debug */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = 33E5194F232828860026EE4D /* AppInfo.xcconfig */; + buildSettings = { + ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; + CLANG_ENABLE_MODULES = YES; + CODE_SIGN_ENTITLEMENTS = Runner/DebugProfile.entitlements; + CODE_SIGN_STYLE = Automatic; + COMBINE_HIDPI_IMAGES = YES; + INFOPLIST_FILE = Runner/Info.plist; + LD_RUNPATH_SEARCH_PATHS = ( + "$(inherited)", + "@executable_path/../Frameworks", + ); + PROVISIONING_PROFILE_SPECIFIER = ""; + SWIFT_OPTIMIZATION_LEVEL = "-Onone"; + SWIFT_VERSION = 5.0; + }; + name = Debug; + }; + 33CC10FD2044A3C60003C045 /* Release */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = 33E5194F232828860026EE4D /* AppInfo.xcconfig */; + buildSettings = { + ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; + CLANG_ENABLE_MODULES = YES; + CODE_SIGN_ENTITLEMENTS = Runner/Release.entitlements; + CODE_SIGN_STYLE = Automatic; + COMBINE_HIDPI_IMAGES = YES; + INFOPLIST_FILE = Runner/Info.plist; + LD_RUNPATH_SEARCH_PATHS = ( + "$(inherited)", + "@executable_path/../Frameworks", + ); + PROVISIONING_PROFILE_SPECIFIER = ""; + SWIFT_VERSION = 5.0; + }; + name = Release; + }; + 33CC111C2044C6BA0003C045 /* Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + CODE_SIGN_STYLE = Manual; + PRODUCT_NAME = "$(TARGET_NAME)"; + }; + name = Debug; + }; + 33CC111D2044C6BA0003C045 /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + CODE_SIGN_STYLE = Automatic; + PRODUCT_NAME = "$(TARGET_NAME)"; + }; + name = Release; + }; +/* End XCBuildConfiguration section */ + +/* Begin XCConfigurationList section */ + 33CC10E82044A3C60003C045 /* Build configuration list for PBXProject "Runner" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 33CC10F92044A3C60003C045 /* Debug */, + 33CC10FA2044A3C60003C045 /* Release */, + 338D0CE9231458BD00FA5F75 /* Profile */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; + 33CC10FB2044A3C60003C045 /* Build configuration list for PBXNativeTarget "Runner" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 33CC10FC2044A3C60003C045 /* Debug */, + 33CC10FD2044A3C60003C045 /* Release */, + 338D0CEA231458BD00FA5F75 /* Profile */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; + 33CC111B2044C6BA0003C045 /* Build configuration list for PBXAggregateTarget "Flutter Assemble" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 33CC111C2044C6BA0003C045 /* Debug */, + 33CC111D2044C6BA0003C045 /* Release */, + 338D0CEB231458BD00FA5F75 /* Profile */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; +/* End XCConfigurationList section */ + }; + rootObject = 33CC10E52044A3C60003C045 /* Project object */; +} diff --git a/siro_rider/packages/calendar_builder/example/macos/Runner.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist b/siro_rider/packages/calendar_builder/example/macos/Runner.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist new file mode 100644 index 0000000..18d9810 --- /dev/null +++ b/siro_rider/packages/calendar_builder/example/macos/Runner.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist @@ -0,0 +1,8 @@ + + + + + IDEDidComputeMac32BitWarning + + + diff --git a/siro_rider/packages/calendar_builder/example/macos/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme b/siro_rider/packages/calendar_builder/example/macos/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme new file mode 100644 index 0000000..fb7259e --- /dev/null +++ b/siro_rider/packages/calendar_builder/example/macos/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme @@ -0,0 +1,87 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/siro_rider/packages/calendar_builder/example/macos/Runner.xcworkspace/contents.xcworkspacedata b/siro_rider/packages/calendar_builder/example/macos/Runner.xcworkspace/contents.xcworkspacedata new file mode 100644 index 0000000..1d526a1 --- /dev/null +++ b/siro_rider/packages/calendar_builder/example/macos/Runner.xcworkspace/contents.xcworkspacedata @@ -0,0 +1,7 @@ + + + + + diff --git a/siro_rider/packages/calendar_builder/example/macos/Runner.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist b/siro_rider/packages/calendar_builder/example/macos/Runner.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist new file mode 100644 index 0000000..18d9810 --- /dev/null +++ b/siro_rider/packages/calendar_builder/example/macos/Runner.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist @@ -0,0 +1,8 @@ + + + + + IDEDidComputeMac32BitWarning + + + diff --git a/siro_rider/packages/calendar_builder/example/macos/Runner/AppDelegate.swift b/siro_rider/packages/calendar_builder/example/macos/Runner/AppDelegate.swift new file mode 100644 index 0000000..d53ef64 --- /dev/null +++ b/siro_rider/packages/calendar_builder/example/macos/Runner/AppDelegate.swift @@ -0,0 +1,9 @@ +import Cocoa +import FlutterMacOS + +@NSApplicationMain +class AppDelegate: FlutterAppDelegate { + override func applicationShouldTerminateAfterLastWindowClosed(_ sender: NSApplication) -> Bool { + return true + } +} diff --git a/siro_rider/packages/calendar_builder/example/macos/Runner/Assets.xcassets/AppIcon.appiconset/Contents.json b/siro_rider/packages/calendar_builder/example/macos/Runner/Assets.xcassets/AppIcon.appiconset/Contents.json new file mode 100644 index 0000000..a2ec33f --- /dev/null +++ b/siro_rider/packages/calendar_builder/example/macos/Runner/Assets.xcassets/AppIcon.appiconset/Contents.json @@ -0,0 +1,68 @@ +{ + "images" : [ + { + "size" : "16x16", + "idiom" : "mac", + "filename" : "app_icon_16.png", + "scale" : "1x" + }, + { + "size" : "16x16", + "idiom" : "mac", + "filename" : "app_icon_32.png", + "scale" : "2x" + }, + { + "size" : "32x32", + "idiom" : "mac", + "filename" : "app_icon_32.png", + "scale" : "1x" + }, + { + "size" : "32x32", + "idiom" : "mac", + "filename" : "app_icon_64.png", + "scale" : "2x" + }, + { + "size" : "128x128", + "idiom" : "mac", + "filename" : "app_icon_128.png", + "scale" : "1x" + }, + { + "size" : "128x128", + "idiom" : "mac", + "filename" : "app_icon_256.png", + "scale" : "2x" + }, + { + "size" : "256x256", + "idiom" : "mac", + "filename" : "app_icon_256.png", + "scale" : "1x" + }, + { + "size" : "256x256", + "idiom" : "mac", + "filename" : "app_icon_512.png", + "scale" : "2x" + }, + { + "size" : "512x512", + "idiom" : "mac", + "filename" : "app_icon_512.png", + "scale" : "1x" + }, + { + "size" : "512x512", + "idiom" : "mac", + "filename" : "app_icon_1024.png", + "scale" : "2x" + } + ], + "info" : { + "version" : 1, + "author" : "xcode" + } +} diff --git a/siro_rider/packages/calendar_builder/example/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_1024.png b/siro_rider/packages/calendar_builder/example/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_1024.png new file mode 100644 index 0000000..3c4935a Binary files /dev/null and b/siro_rider/packages/calendar_builder/example/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_1024.png differ diff --git a/siro_rider/packages/calendar_builder/example/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_128.png b/siro_rider/packages/calendar_builder/example/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_128.png new file mode 100644 index 0000000..ed4cc16 Binary files /dev/null and b/siro_rider/packages/calendar_builder/example/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_128.png differ diff --git a/siro_rider/packages/calendar_builder/example/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_16.png b/siro_rider/packages/calendar_builder/example/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_16.png new file mode 100644 index 0000000..483be61 Binary files /dev/null and b/siro_rider/packages/calendar_builder/example/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_16.png differ diff --git a/siro_rider/packages/calendar_builder/example/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_256.png b/siro_rider/packages/calendar_builder/example/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_256.png new file mode 100644 index 0000000..bcbf36d Binary files /dev/null and b/siro_rider/packages/calendar_builder/example/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_256.png differ diff --git a/siro_rider/packages/calendar_builder/example/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_32.png b/siro_rider/packages/calendar_builder/example/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_32.png new file mode 100644 index 0000000..9c0a652 Binary files /dev/null and b/siro_rider/packages/calendar_builder/example/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_32.png differ diff --git a/siro_rider/packages/calendar_builder/example/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_512.png b/siro_rider/packages/calendar_builder/example/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_512.png new file mode 100644 index 0000000..e71a726 Binary files /dev/null and b/siro_rider/packages/calendar_builder/example/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_512.png differ diff --git a/siro_rider/packages/calendar_builder/example/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_64.png b/siro_rider/packages/calendar_builder/example/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_64.png new file mode 100644 index 0000000..8a31fe2 Binary files /dev/null and b/siro_rider/packages/calendar_builder/example/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_64.png differ diff --git a/siro_rider/packages/calendar_builder/example/macos/Runner/Base.lproj/MainMenu.xib b/siro_rider/packages/calendar_builder/example/macos/Runner/Base.lproj/MainMenu.xib new file mode 100644 index 0000000..80e867a --- /dev/null +++ b/siro_rider/packages/calendar_builder/example/macos/Runner/Base.lproj/MainMenu.xib @@ -0,0 +1,343 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/siro_rider/packages/calendar_builder/example/macos/Runner/Configs/AppInfo.xcconfig b/siro_rider/packages/calendar_builder/example/macos/Runner/Configs/AppInfo.xcconfig new file mode 100644 index 0000000..8b42559 --- /dev/null +++ b/siro_rider/packages/calendar_builder/example/macos/Runner/Configs/AppInfo.xcconfig @@ -0,0 +1,14 @@ +// Application-level settings for the Runner target. +// +// This may be replaced with something auto-generated from metadata (e.g., pubspec.yaml) in the +// future. If not, the values below would default to using the project name when this becomes a +// 'flutter create' template. + +// The application's name. By default this is also the title of the Flutter window. +PRODUCT_NAME = example + +// The application's bundle identifier +PRODUCT_BUNDLE_IDENTIFIER = com.example.example + +// The copyright displayed in application information +PRODUCT_COPYRIGHT = Copyright © 2022 com.example. All rights reserved. diff --git a/siro_rider/packages/calendar_builder/example/macos/Runner/Configs/Debug.xcconfig b/siro_rider/packages/calendar_builder/example/macos/Runner/Configs/Debug.xcconfig new file mode 100644 index 0000000..36b0fd9 --- /dev/null +++ b/siro_rider/packages/calendar_builder/example/macos/Runner/Configs/Debug.xcconfig @@ -0,0 +1,2 @@ +#include "../../Flutter/Flutter-Debug.xcconfig" +#include "Warnings.xcconfig" diff --git a/siro_rider/packages/calendar_builder/example/macos/Runner/Configs/Release.xcconfig b/siro_rider/packages/calendar_builder/example/macos/Runner/Configs/Release.xcconfig new file mode 100644 index 0000000..dff4f49 --- /dev/null +++ b/siro_rider/packages/calendar_builder/example/macos/Runner/Configs/Release.xcconfig @@ -0,0 +1,2 @@ +#include "../../Flutter/Flutter-Release.xcconfig" +#include "Warnings.xcconfig" diff --git a/siro_rider/packages/calendar_builder/example/macos/Runner/Configs/Warnings.xcconfig b/siro_rider/packages/calendar_builder/example/macos/Runner/Configs/Warnings.xcconfig new file mode 100644 index 0000000..42bcbf4 --- /dev/null +++ b/siro_rider/packages/calendar_builder/example/macos/Runner/Configs/Warnings.xcconfig @@ -0,0 +1,13 @@ +WARNING_CFLAGS = -Wall -Wconditional-uninitialized -Wnullable-to-nonnull-conversion -Wmissing-method-return-type -Woverlength-strings +GCC_WARN_UNDECLARED_SELECTOR = YES +CLANG_UNDEFINED_BEHAVIOR_SANITIZER_NULLABILITY = YES +CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE +CLANG_WARN__DUPLICATE_METHOD_MATCH = YES +CLANG_WARN_PRAGMA_PACK = YES +CLANG_WARN_STRICT_PROTOTYPES = YES +CLANG_WARN_COMMA = YES +GCC_WARN_STRICT_SELECTOR_MATCH = YES +CLANG_WARN_OBJC_REPEATED_USE_OF_WEAK = YES +CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES +GCC_WARN_SHADOW = YES +CLANG_WARN_UNREACHABLE_CODE = YES diff --git a/siro_rider/packages/calendar_builder/example/macos/Runner/DebugProfile.entitlements b/siro_rider/packages/calendar_builder/example/macos/Runner/DebugProfile.entitlements new file mode 100644 index 0000000..dddb8a3 --- /dev/null +++ b/siro_rider/packages/calendar_builder/example/macos/Runner/DebugProfile.entitlements @@ -0,0 +1,12 @@ + + + + + com.apple.security.app-sandbox + + com.apple.security.cs.allow-jit + + com.apple.security.network.server + + + diff --git a/siro_rider/packages/calendar_builder/example/macos/Runner/Info.plist b/siro_rider/packages/calendar_builder/example/macos/Runner/Info.plist new file mode 100644 index 0000000..4789daa --- /dev/null +++ b/siro_rider/packages/calendar_builder/example/macos/Runner/Info.plist @@ -0,0 +1,32 @@ + + + + + CFBundleDevelopmentRegion + $(DEVELOPMENT_LANGUAGE) + CFBundleExecutable + $(EXECUTABLE_NAME) + CFBundleIconFile + + CFBundleIdentifier + $(PRODUCT_BUNDLE_IDENTIFIER) + CFBundleInfoDictionaryVersion + 6.0 + CFBundleName + $(PRODUCT_NAME) + CFBundlePackageType + APPL + CFBundleShortVersionString + $(FLUTTER_BUILD_NAME) + CFBundleVersion + $(FLUTTER_BUILD_NUMBER) + LSMinimumSystemVersion + $(MACOSX_DEPLOYMENT_TARGET) + NSHumanReadableCopyright + $(PRODUCT_COPYRIGHT) + NSMainNibFile + MainMenu + NSPrincipalClass + NSApplication + + diff --git a/siro_rider/packages/calendar_builder/example/macos/Runner/MainFlutterWindow.swift b/siro_rider/packages/calendar_builder/example/macos/Runner/MainFlutterWindow.swift new file mode 100644 index 0000000..2722837 --- /dev/null +++ b/siro_rider/packages/calendar_builder/example/macos/Runner/MainFlutterWindow.swift @@ -0,0 +1,15 @@ +import Cocoa +import FlutterMacOS + +class MainFlutterWindow: NSWindow { + override func awakeFromNib() { + let flutterViewController = FlutterViewController.init() + let windowFrame = self.frame + self.contentViewController = flutterViewController + self.setFrame(windowFrame, display: true) + + RegisterGeneratedPlugins(registry: flutterViewController) + + super.awakeFromNib() + } +} diff --git a/siro_rider/packages/calendar_builder/example/macos/Runner/Release.entitlements b/siro_rider/packages/calendar_builder/example/macos/Runner/Release.entitlements new file mode 100644 index 0000000..852fa1a --- /dev/null +++ b/siro_rider/packages/calendar_builder/example/macos/Runner/Release.entitlements @@ -0,0 +1,8 @@ + + + + + com.apple.security.app-sandbox + + + diff --git a/siro_rider/packages/calendar_builder/example/pubspec.lock b/siro_rider/packages/calendar_builder/example/pubspec.lock new file mode 100644 index 0000000..750ef9e --- /dev/null +++ b/siro_rider/packages/calendar_builder/example/pubspec.lock @@ -0,0 +1,236 @@ +# Generated by pub +# See https://dart.dev/tools/pub/glossary#lockfile +packages: + async: + dependency: transitive + description: + name: async + sha256: e2eb0491ba5ddb6177742d2da23904574082139b07c1e33b8503b9f46f3e1a37 + url: "https://pub.dev" + source: hosted + version: "2.13.1" + boolean_selector: + dependency: transitive + description: + name: boolean_selector + sha256: "8aab1771e1243a5063b8b0ff68042d67334e3feab9e95b9490f9a6ebf73b42ea" + url: "https://pub.dev" + source: hosted + version: "2.1.2" + calendar_builder: + dependency: "direct main" + description: + path: ".." + relative: true + source: path + version: "0.0.6" + characters: + dependency: transitive + description: + name: characters + sha256: faf38497bda5ead2a8c7615f4f7939df04333478bf32e4173fcb06d428b5716b + url: "https://pub.dev" + source: hosted + version: "1.4.1" + clock: + dependency: transitive + description: + name: clock + sha256: fddb70d9b5277016c77a80201021d40a2247104d9f4aa7bab7157b7e3f05b84b + url: "https://pub.dev" + source: hosted + version: "1.1.2" + collection: + dependency: transitive + description: + name: collection + sha256: "2f5709ae4d3d59dd8f7cd309b4e023046b57d8a6c82130785d2b0e5868084e76" + url: "https://pub.dev" + source: hosted + version: "1.19.1" + cupertino_icons: + dependency: "direct main" + description: + name: cupertino_icons + sha256: "41e005c33bd814be4d3096aff55b1908d419fde52ca656c8c47719ec745873cd" + url: "https://pub.dev" + source: hosted + version: "1.0.9" + fake_async: + dependency: transitive + description: + name: fake_async + sha256: "5368f224a74523e8d2e7399ea1638b37aecfca824a3cc4dfdf77bf1fa905ac44" + url: "https://pub.dev" + source: hosted + version: "1.3.3" + flutter: + dependency: "direct main" + description: flutter + source: sdk + version: "0.0.0" + flutter_lints: + dependency: "direct dev" + description: + name: flutter_lints + sha256: b543301ad291598523947dc534aaddc5aaad597b709d2426d3a0e0d44c5cb493 + url: "https://pub.dev" + source: hosted + version: "1.0.4" + flutter_test: + dependency: "direct dev" + description: flutter + source: sdk + version: "0.0.0" + get: + dependency: transitive + description: + name: get + sha256: "5ed34a7925b85336e15d472cc4cfe7d9ebf4ab8e8b9f688585bf6b50f4c3d79a" + url: "https://pub.dev" + source: hosted + version: "4.7.3" + leak_tracker: + dependency: transitive + description: + name: leak_tracker + sha256: "33e2e26bdd85a0112ec15400c8cbffea70d0f9c3407491f672a2fad47915e2de" + url: "https://pub.dev" + source: hosted + version: "11.0.2" + leak_tracker_flutter_testing: + dependency: transitive + description: + name: leak_tracker_flutter_testing + sha256: "1dbc140bb5a23c75ea9c4811222756104fbcd1a27173f0c34ca01e16bea473c1" + url: "https://pub.dev" + source: hosted + version: "3.0.10" + leak_tracker_testing: + dependency: transitive + description: + name: leak_tracker_testing + sha256: "8d5a2d49f4a66b49744b23b018848400d23e54caf9463f4eb20df3eb8acb2eb1" + url: "https://pub.dev" + source: hosted + version: "3.0.2" + lints: + dependency: transitive + description: + name: lints + sha256: a2c3d198cb5ea2e179926622d433331d8b58374ab8f29cdda6e863bd62fd369c + url: "https://pub.dev" + source: hosted + version: "1.0.1" + matcher: + dependency: transitive + description: + name: matcher + sha256: "12956d0ad8390bbcc63ca2e1469c0619946ccb52809807067a7020d57e647aa6" + url: "https://pub.dev" + source: hosted + version: "0.12.18" + material_color_utilities: + dependency: transitive + description: + name: material_color_utilities + sha256: "9c337007e82b1889149c82ed242ed1cb24a66044e30979c44912381e9be4c48b" + url: "https://pub.dev" + source: hosted + version: "0.13.0" + meta: + dependency: transitive + description: + name: meta + sha256: "23f08335362185a5ea2ad3a4e597f1375e78bce8a040df5c600c8d3552ef2394" + url: "https://pub.dev" + source: hosted + version: "1.17.0" + path: + dependency: transitive + description: + name: path + sha256: "75cca69d1490965be98c73ceaea117e8a04dd21217b37b292c9ddbec0d955bc5" + url: "https://pub.dev" + source: hosted + version: "1.9.1" + sky_engine: + dependency: transitive + description: flutter + source: sdk + version: "0.0.0" + source_span: + dependency: transitive + description: + name: source_span + sha256: "56a02f1f4cd1a2d96303c0144c93bd6d909eea6bee6bf5a0e0b685edbd4c47ab" + url: "https://pub.dev" + source: hosted + version: "1.10.2" + stack_trace: + dependency: transitive + description: + name: stack_trace + sha256: "8b27215b45d22309b5cddda1aa2b19bdfec9df0e765f2de506401c071d38d1b1" + url: "https://pub.dev" + source: hosted + version: "1.12.1" + stream_channel: + dependency: transitive + description: + name: stream_channel + sha256: "969e04c80b8bcdf826f8f16579c7b14d780458bd97f56d107d3950fdbeef059d" + url: "https://pub.dev" + source: hosted + version: "2.1.4" + string_scanner: + dependency: transitive + description: + name: string_scanner + sha256: "921cd31725b72fe181906c6a94d987c78e3b98c2e205b397ea399d4054872b43" + url: "https://pub.dev" + source: hosted + version: "1.4.1" + term_glyph: + dependency: transitive + description: + name: term_glyph + sha256: "7f554798625ea768a7518313e58f83891c7f5024f88e46e7182a4558850a4b8e" + url: "https://pub.dev" + source: hosted + version: "1.2.2" + test_api: + dependency: transitive + description: + name: test_api + sha256: "93167629bfc610f71560ab9312acdda4959de4df6fac7492c89ff0d3886f6636" + url: "https://pub.dev" + source: hosted + version: "0.7.9" + vector_math: + dependency: transitive + description: + name: vector_math + sha256: d530bd74fea330e6e364cda7a85019c434070188383e1cd8d9777ee586914c5b + url: "https://pub.dev" + source: hosted + version: "2.2.0" + vm_service: + dependency: transitive + description: + name: vm_service + sha256: "046d3928e16fa4dc46e8350415661755ab759d9fc97fc21b5ab295f71e4f0499" + url: "https://pub.dev" + source: hosted + version: "15.1.0" + web: + dependency: transitive + description: + name: web + sha256: "868d88a33d8a87b18ffc05f9f030ba328ffefba92d6c127917a2ba740f9cfe4a" + url: "https://pub.dev" + source: hosted + version: "1.1.1" +sdks: + dart: ">=3.9.0 <4.0.0" + flutter: ">=3.18.0-18.0.pre.54" diff --git a/siro_rider/packages/calendar_builder/example/pubspec.yaml b/siro_rider/packages/calendar_builder/example/pubspec.yaml new file mode 100644 index 0000000..50925b7 --- /dev/null +++ b/siro_rider/packages/calendar_builder/example/pubspec.yaml @@ -0,0 +1,91 @@ +name: example +description: A new Flutter project. + +# The following line prevents the package from being accidentally published to +# pub.dev using `flutter pub publish`. This is preferred for private packages. +publish_to: 'none' # Remove this line if you wish to publish to pub.dev + +# The following defines the version and build number for your application. +# A version number is three numbers separated by dots, like 1.2.43 +# followed by an optional build number separated by a +. +# Both the version and the builder number may be overridden in flutter +# build by specifying --build-name and --build-number, respectively. +# In Android, build-name is used as versionName while build-number used as versionCode. +# Read more about Android versioning at https://developer.android.com/studio/publish/versioning +# In iOS, build-name is used as CFBundleShortVersionString while build-number used as CFBundleVersion. +# Read more about iOS versioning at +# https://developer.apple.com/library/archive/documentation/General/Reference/InfoPlistKeyReference/Articles/CoreFoundationKeys.html +version: 1.0.0+1 + +environment: + sdk: ">=2.16.1 <3.0.0" + +# Dependencies specify other packages that your package needs in order to work. +# To automatically upgrade your package dependencies to the latest versions +# consider running `flutter pub upgrade --major-versions`. Alternatively, +# dependencies can be manually updated by changing the version numbers below to +# the latest version available on pub.dev. To see which dependencies have newer +# versions available, run `flutter pub outdated`. +dependencies: + flutter: + sdk: flutter + calendar_builder: + path: ../ + + + # The following adds the Cupertino Icons font to your application. + # Use with the CupertinoIcons class for iOS style icons. + cupertino_icons: ^1.0.2 + +dev_dependencies: + flutter_test: + sdk: flutter + + # The "flutter_lints" package below contains a set of recommended lints to + # encourage good coding practices. The lint set provided by the package is + # activated in the `analysis_options.yaml` file located at the root of your + # package. See that file for information about deactivating specific lint + # rules and activating additional ones. + flutter_lints: ^1.0.0 + +# For information on the generic Dart part of this file, see the +# following page: https://dart.dev/tools/pub/pubspec + +# The following section is specific to Flutter. +flutter: + + # The following line ensures that the Material Icons font is + # included with your application, so that you can use the icons in + # the material Icons class. + uses-material-design: true + + # To add assets to your application, add an assets section, like this: + # assets: + # - images/a_dot_burr.jpeg + # - images/a_dot_ham.jpeg + + # An image asset can refer to one or more resolution-specific "variants", see + # https://flutter.dev/assets-and-images/#resolution-aware. + + # For details regarding adding assets from package dependencies, see + # https://flutter.dev/assets-and-images/#from-packages + + # To add custom fonts to your application, add a fonts section here, + # in this "flutter" section. Each entry in this list should have a + # "family" key with the font family name, and a "fonts" key with a + # list giving the asset and other descriptors for the font. For + # example: + # fonts: + # - family: Schyler + # fonts: + # - asset: fonts/Schyler-Regular.ttf + # - asset: fonts/Schyler-Italic.ttf + # style: italic + # - family: Trajan Pro + # fonts: + # - asset: fonts/TrajanPro.ttf + # - asset: fonts/TrajanPro_Bold.ttf + # weight: 700 + # + # For details regarding fonts from package dependencies, + # see https://flutter.dev/custom-fonts/#from-packages diff --git a/siro_rider/packages/calendar_builder/example/test/widget_test.dart b/siro_rider/packages/calendar_builder/example/test/widget_test.dart new file mode 100644 index 0000000..f3c1285 --- /dev/null +++ b/siro_rider/packages/calendar_builder/example/test/widget_test.dart @@ -0,0 +1,29 @@ +// This is a basic Flutter widget test. +// +// To perform an interaction with a widget in your test, use the WidgetTester +// utility that Flutter provides. For example, you can send tap and scroll +// gestures. You can also use WidgetTester to find child widgets in the widget +// tree, read text, and verify that the values of widget properties are correct. + +import 'package:example/main.dart'; +import 'package:flutter/material.dart'; +import 'package:flutter_test/flutter_test.dart'; + +void main() { + testWidgets('Counter increments smoke test', (WidgetTester tester) async { + // Build our app and trigger a frame. + await tester.pumpWidget(const MyApp()); + + // Verify that our counter starts at 0. + expect(find.text('0'), findsOneWidget); + expect(find.text('1'), findsNothing); + + // Tap the '+' icon and trigger a frame. + await tester.tap(find.byIcon(Icons.add)); + await tester.pump(); + + // Verify that our counter has incremented. + expect(find.text('0'), findsNothing); + expect(find.text('1'), findsOneWidget); + }); +} diff --git a/siro_rider/packages/calendar_builder/example/web/favicon.png b/siro_rider/packages/calendar_builder/example/web/favicon.png new file mode 100644 index 0000000..8aaa46a Binary files /dev/null and b/siro_rider/packages/calendar_builder/example/web/favicon.png differ diff --git a/siro_rider/packages/calendar_builder/example/web/icons/Icon-192.png b/siro_rider/packages/calendar_builder/example/web/icons/Icon-192.png new file mode 100644 index 0000000..b749bfe Binary files /dev/null and b/siro_rider/packages/calendar_builder/example/web/icons/Icon-192.png differ diff --git a/siro_rider/packages/calendar_builder/example/web/icons/Icon-512.png b/siro_rider/packages/calendar_builder/example/web/icons/Icon-512.png new file mode 100644 index 0000000..88cfd48 Binary files /dev/null and b/siro_rider/packages/calendar_builder/example/web/icons/Icon-512.png differ diff --git a/siro_rider/packages/calendar_builder/example/web/icons/Icon-maskable-192.png b/siro_rider/packages/calendar_builder/example/web/icons/Icon-maskable-192.png new file mode 100644 index 0000000..eb9b4d7 Binary files /dev/null and b/siro_rider/packages/calendar_builder/example/web/icons/Icon-maskable-192.png differ diff --git a/siro_rider/packages/calendar_builder/example/web/icons/Icon-maskable-512.png b/siro_rider/packages/calendar_builder/example/web/icons/Icon-maskable-512.png new file mode 100644 index 0000000..d69c566 Binary files /dev/null and b/siro_rider/packages/calendar_builder/example/web/icons/Icon-maskable-512.png differ diff --git a/siro_rider/packages/calendar_builder/example/web/index.html b/siro_rider/packages/calendar_builder/example/web/index.html new file mode 100644 index 0000000..b6b9dd2 --- /dev/null +++ b/siro_rider/packages/calendar_builder/example/web/index.html @@ -0,0 +1,104 @@ + + + + + + + + + + + + + + + + + + + + example + + + + + + + diff --git a/siro_rider/packages/calendar_builder/example/web/manifest.json b/siro_rider/packages/calendar_builder/example/web/manifest.json new file mode 100644 index 0000000..096edf8 --- /dev/null +++ b/siro_rider/packages/calendar_builder/example/web/manifest.json @@ -0,0 +1,35 @@ +{ + "name": "example", + "short_name": "example", + "start_url": ".", + "display": "standalone", + "background_color": "#0175C2", + "theme_color": "#0175C2", + "description": "A new Flutter project.", + "orientation": "portrait-primary", + "prefer_related_applications": false, + "icons": [ + { + "src": "icons/Icon-192.png", + "sizes": "192x192", + "type": "image/png" + }, + { + "src": "icons/Icon-512.png", + "sizes": "512x512", + "type": "image/png" + }, + { + "src": "icons/Icon-maskable-192.png", + "sizes": "192x192", + "type": "image/png", + "purpose": "maskable" + }, + { + "src": "icons/Icon-maskable-512.png", + "sizes": "512x512", + "type": "image/png", + "purpose": "maskable" + } + ] +} diff --git a/siro_rider/packages/calendar_builder/example/windows/CMakeLists.txt b/siro_rider/packages/calendar_builder/example/windows/CMakeLists.txt new file mode 100644 index 0000000..1633297 --- /dev/null +++ b/siro_rider/packages/calendar_builder/example/windows/CMakeLists.txt @@ -0,0 +1,95 @@ +cmake_minimum_required(VERSION 3.14) +project(example LANGUAGES CXX) + +set(BINARY_NAME "example") + +cmake_policy(SET CMP0063 NEW) + +set(CMAKE_INSTALL_RPATH "$ORIGIN/lib") + +# Configure build options. +get_property(IS_MULTICONFIG GLOBAL PROPERTY GENERATOR_IS_MULTI_CONFIG) +if(IS_MULTICONFIG) + set(CMAKE_CONFIGURATION_TYPES "Debug;Profile;Release" + CACHE STRING "" FORCE) +else() + if(NOT CMAKE_BUILD_TYPE AND NOT CMAKE_CONFIGURATION_TYPES) + set(CMAKE_BUILD_TYPE "Debug" CACHE + STRING "Flutter build mode" FORCE) + set_property(CACHE CMAKE_BUILD_TYPE PROPERTY STRINGS + "Debug" "Profile" "Release") + endif() +endif() + +set(CMAKE_EXE_LINKER_FLAGS_PROFILE "${CMAKE_EXE_LINKER_FLAGS_RELEASE}") +set(CMAKE_SHARED_LINKER_FLAGS_PROFILE "${CMAKE_SHARED_LINKER_FLAGS_RELEASE}") +set(CMAKE_C_FLAGS_PROFILE "${CMAKE_C_FLAGS_RELEASE}") +set(CMAKE_CXX_FLAGS_PROFILE "${CMAKE_CXX_FLAGS_RELEASE}") + +# Use Unicode for all projects. +add_definitions(-DUNICODE -D_UNICODE) + +# Compilation settings that should be applied to most targets. +function(APPLY_STANDARD_SETTINGS TARGET) + target_compile_features(${TARGET} PUBLIC cxx_std_17) + target_compile_options(${TARGET} PRIVATE /W4 /WX /wd"4100") + target_compile_options(${TARGET} PRIVATE /EHsc) + target_compile_definitions(${TARGET} PRIVATE "_HAS_EXCEPTIONS=0") + target_compile_definitions(${TARGET} PRIVATE "$<$:_DEBUG>") +endfunction() + +set(FLUTTER_MANAGED_DIR "${CMAKE_CURRENT_SOURCE_DIR}/flutter") + +# Flutter library and tool build rules. +add_subdirectory(${FLUTTER_MANAGED_DIR}) + +# Application build +add_subdirectory("runner") + +# Generated plugin build rules, which manage building the plugins and adding +# them to the application. +include(flutter/generated_plugins.cmake) + + +# === Installation === +# Support files are copied into place next to the executable, so that it can +# run in place. This is done instead of making a separate bundle (as on Linux) +# so that building and running from within Visual Studio will work. +set(BUILD_BUNDLE_DIR "$") +# Make the "install" step default, as it's required to run. +set(CMAKE_VS_INCLUDE_INSTALL_TO_DEFAULT_BUILD 1) +if(CMAKE_INSTALL_PREFIX_INITIALIZED_TO_DEFAULT) + set(CMAKE_INSTALL_PREFIX "${BUILD_BUNDLE_DIR}" CACHE PATH "..." FORCE) +endif() + +set(INSTALL_BUNDLE_DATA_DIR "${CMAKE_INSTALL_PREFIX}/data") +set(INSTALL_BUNDLE_LIB_DIR "${CMAKE_INSTALL_PREFIX}") + +install(TARGETS ${BINARY_NAME} RUNTIME DESTINATION "${CMAKE_INSTALL_PREFIX}" + COMPONENT Runtime) + +install(FILES "${FLUTTER_ICU_DATA_FILE}" DESTINATION "${INSTALL_BUNDLE_DATA_DIR}" + COMPONENT Runtime) + +install(FILES "${FLUTTER_LIBRARY}" DESTINATION "${INSTALL_BUNDLE_LIB_DIR}" + COMPONENT Runtime) + +if(PLUGIN_BUNDLED_LIBRARIES) + install(FILES "${PLUGIN_BUNDLED_LIBRARIES}" + DESTINATION "${INSTALL_BUNDLE_LIB_DIR}" + COMPONENT Runtime) +endif() + +# Fully re-copy the assets directory on each build to avoid having stale files +# from a previous install. +set(FLUTTER_ASSET_DIR_NAME "flutter_assets") +install(CODE " + file(REMOVE_RECURSE \"${INSTALL_BUNDLE_DATA_DIR}/${FLUTTER_ASSET_DIR_NAME}\") + " COMPONENT Runtime) +install(DIRECTORY "${PROJECT_BUILD_DIR}/${FLUTTER_ASSET_DIR_NAME}" + DESTINATION "${INSTALL_BUNDLE_DATA_DIR}" COMPONENT Runtime) + +# Install the AOT library on non-Debug builds only. +install(FILES "${AOT_LIBRARY}" DESTINATION "${INSTALL_BUNDLE_DATA_DIR}" + CONFIGURATIONS Profile;Release + COMPONENT Runtime) diff --git a/siro_rider/packages/calendar_builder/example/windows/flutter/CMakeLists.txt b/siro_rider/packages/calendar_builder/example/windows/flutter/CMakeLists.txt new file mode 100644 index 0000000..b2e4bd8 --- /dev/null +++ b/siro_rider/packages/calendar_builder/example/windows/flutter/CMakeLists.txt @@ -0,0 +1,103 @@ +cmake_minimum_required(VERSION 3.14) + +set(EPHEMERAL_DIR "${CMAKE_CURRENT_SOURCE_DIR}/ephemeral") + +# Configuration provided via flutter tool. +include(${EPHEMERAL_DIR}/generated_config.cmake) + +# TODO: Move the rest of this into files in ephemeral. See +# https://github.com/flutter/flutter/issues/57146. +set(WRAPPER_ROOT "${EPHEMERAL_DIR}/cpp_client_wrapper") + +# === Flutter Library === +set(FLUTTER_LIBRARY "${EPHEMERAL_DIR}/flutter_windows.dll") + +# Published to parent scope for install step. +set(FLUTTER_LIBRARY ${FLUTTER_LIBRARY} PARENT_SCOPE) +set(FLUTTER_ICU_DATA_FILE "${EPHEMERAL_DIR}/icudtl.dat" PARENT_SCOPE) +set(PROJECT_BUILD_DIR "${PROJECT_DIR}/build/" PARENT_SCOPE) +set(AOT_LIBRARY "${PROJECT_DIR}/build/windows/app.so" PARENT_SCOPE) + +list(APPEND FLUTTER_LIBRARY_HEADERS + "flutter_export.h" + "flutter_windows.h" + "flutter_messenger.h" + "flutter_plugin_registrar.h" + "flutter_texture_registrar.h" +) +list(TRANSFORM FLUTTER_LIBRARY_HEADERS PREPEND "${EPHEMERAL_DIR}/") +add_library(flutter INTERFACE) +target_include_directories(flutter INTERFACE + "${EPHEMERAL_DIR}" +) +target_link_libraries(flutter INTERFACE "${FLUTTER_LIBRARY}.lib") +add_dependencies(flutter flutter_assemble) + +# === Wrapper === +list(APPEND CPP_WRAPPER_SOURCES_CORE + "core_implementations.cc" + "standard_codec.cc" +) +list(TRANSFORM CPP_WRAPPER_SOURCES_CORE PREPEND "${WRAPPER_ROOT}/") +list(APPEND CPP_WRAPPER_SOURCES_PLUGIN + "plugin_registrar.cc" +) +list(TRANSFORM CPP_WRAPPER_SOURCES_PLUGIN PREPEND "${WRAPPER_ROOT}/") +list(APPEND CPP_WRAPPER_SOURCES_APP + "flutter_engine.cc" + "flutter_view_controller.cc" +) +list(TRANSFORM CPP_WRAPPER_SOURCES_APP PREPEND "${WRAPPER_ROOT}/") + +# Wrapper sources needed for a plugin. +add_library(flutter_wrapper_plugin STATIC + ${CPP_WRAPPER_SOURCES_CORE} + ${CPP_WRAPPER_SOURCES_PLUGIN} +) +apply_standard_settings(flutter_wrapper_plugin) +set_target_properties(flutter_wrapper_plugin PROPERTIES + POSITION_INDEPENDENT_CODE ON) +set_target_properties(flutter_wrapper_plugin PROPERTIES + CXX_VISIBILITY_PRESET hidden) +target_link_libraries(flutter_wrapper_plugin PUBLIC flutter) +target_include_directories(flutter_wrapper_plugin PUBLIC + "${WRAPPER_ROOT}/include" +) +add_dependencies(flutter_wrapper_plugin flutter_assemble) + +# Wrapper sources needed for the runner. +add_library(flutter_wrapper_app STATIC + ${CPP_WRAPPER_SOURCES_CORE} + ${CPP_WRAPPER_SOURCES_APP} +) +apply_standard_settings(flutter_wrapper_app) +target_link_libraries(flutter_wrapper_app PUBLIC flutter) +target_include_directories(flutter_wrapper_app PUBLIC + "${WRAPPER_ROOT}/include" +) +add_dependencies(flutter_wrapper_app flutter_assemble) + +# === Flutter tool backend === +# _phony_ is a non-existent file to force this command to run every time, +# since currently there's no way to get a full input/output list from the +# flutter tool. +set(PHONY_OUTPUT "${CMAKE_CURRENT_BINARY_DIR}/_phony_") +set_source_files_properties("${PHONY_OUTPUT}" PROPERTIES SYMBOLIC TRUE) +add_custom_command( + OUTPUT ${FLUTTER_LIBRARY} ${FLUTTER_LIBRARY_HEADERS} + ${CPP_WRAPPER_SOURCES_CORE} ${CPP_WRAPPER_SOURCES_PLUGIN} + ${CPP_WRAPPER_SOURCES_APP} + ${PHONY_OUTPUT} + COMMAND ${CMAKE_COMMAND} -E env + ${FLUTTER_TOOL_ENVIRONMENT} + "${FLUTTER_ROOT}/packages/flutter_tools/bin/tool_backend.bat" + windows-x64 $ + VERBATIM +) +add_custom_target(flutter_assemble DEPENDS + "${FLUTTER_LIBRARY}" + ${FLUTTER_LIBRARY_HEADERS} + ${CPP_WRAPPER_SOURCES_CORE} + ${CPP_WRAPPER_SOURCES_PLUGIN} + ${CPP_WRAPPER_SOURCES_APP} +) diff --git a/siro_rider/packages/calendar_builder/example/windows/flutter/generated_plugin_registrant.cc b/siro_rider/packages/calendar_builder/example/windows/flutter/generated_plugin_registrant.cc new file mode 100644 index 0000000..8b6d468 --- /dev/null +++ b/siro_rider/packages/calendar_builder/example/windows/flutter/generated_plugin_registrant.cc @@ -0,0 +1,11 @@ +// +// Generated file. Do not edit. +// + +// clang-format off + +#include "generated_plugin_registrant.h" + + +void RegisterPlugins(flutter::PluginRegistry* registry) { +} diff --git a/siro_rider/packages/calendar_builder/example/windows/flutter/generated_plugin_registrant.h b/siro_rider/packages/calendar_builder/example/windows/flutter/generated_plugin_registrant.h new file mode 100644 index 0000000..dc139d8 --- /dev/null +++ b/siro_rider/packages/calendar_builder/example/windows/flutter/generated_plugin_registrant.h @@ -0,0 +1,15 @@ +// +// Generated file. Do not edit. +// + +// clang-format off + +#ifndef GENERATED_PLUGIN_REGISTRANT_ +#define GENERATED_PLUGIN_REGISTRANT_ + +#include + +// Registers Flutter plugins. +void RegisterPlugins(flutter::PluginRegistry* registry); + +#endif // GENERATED_PLUGIN_REGISTRANT_ diff --git a/siro_rider/packages/calendar_builder/example/windows/flutter/generated_plugins.cmake b/siro_rider/packages/calendar_builder/example/windows/flutter/generated_plugins.cmake new file mode 100644 index 0000000..b93c4c3 --- /dev/null +++ b/siro_rider/packages/calendar_builder/example/windows/flutter/generated_plugins.cmake @@ -0,0 +1,23 @@ +# +# Generated file, do not edit. +# + +list(APPEND FLUTTER_PLUGIN_LIST +) + +list(APPEND FLUTTER_FFI_PLUGIN_LIST +) + +set(PLUGIN_BUNDLED_LIBRARIES) + +foreach(plugin ${FLUTTER_PLUGIN_LIST}) + add_subdirectory(flutter/ephemeral/.plugin_symlinks/${plugin}/windows plugins/${plugin}) + target_link_libraries(${BINARY_NAME} PRIVATE ${plugin}_plugin) + list(APPEND PLUGIN_BUNDLED_LIBRARIES $) + list(APPEND PLUGIN_BUNDLED_LIBRARIES ${${plugin}_bundled_libraries}) +endforeach(plugin) + +foreach(ffi_plugin ${FLUTTER_FFI_PLUGIN_LIST}) + add_subdirectory(flutter/ephemeral/.plugin_symlinks/${ffi_plugin}/windows plugins/${ffi_plugin}) + list(APPEND PLUGIN_BUNDLED_LIBRARIES ${${ffi_plugin}_bundled_libraries}) +endforeach(ffi_plugin) diff --git a/siro_rider/packages/calendar_builder/example/windows/runner/CMakeLists.txt b/siro_rider/packages/calendar_builder/example/windows/runner/CMakeLists.txt new file mode 100644 index 0000000..de2d891 --- /dev/null +++ b/siro_rider/packages/calendar_builder/example/windows/runner/CMakeLists.txt @@ -0,0 +1,17 @@ +cmake_minimum_required(VERSION 3.14) +project(runner LANGUAGES CXX) + +add_executable(${BINARY_NAME} WIN32 + "flutter_window.cpp" + "main.cpp" + "utils.cpp" + "win32_window.cpp" + "${FLUTTER_MANAGED_DIR}/generated_plugin_registrant.cc" + "Runner.rc" + "runner.exe.manifest" +) +apply_standard_settings(${BINARY_NAME}) +target_compile_definitions(${BINARY_NAME} PRIVATE "NOMINMAX") +target_link_libraries(${BINARY_NAME} PRIVATE flutter flutter_wrapper_app) +target_include_directories(${BINARY_NAME} PRIVATE "${CMAKE_SOURCE_DIR}") +add_dependencies(${BINARY_NAME} flutter_assemble) diff --git a/siro_rider/packages/calendar_builder/example/windows/runner/Runner.rc b/siro_rider/packages/calendar_builder/example/windows/runner/Runner.rc new file mode 100644 index 0000000..5fdea29 --- /dev/null +++ b/siro_rider/packages/calendar_builder/example/windows/runner/Runner.rc @@ -0,0 +1,121 @@ +// Microsoft Visual C++ generated resource script. +// +#pragma code_page(65001) +#include "resource.h" + +#define APSTUDIO_READONLY_SYMBOLS +///////////////////////////////////////////////////////////////////////////// +// +// Generated from the TEXTINCLUDE 2 resource. +// +#include "winres.h" + +///////////////////////////////////////////////////////////////////////////// +#undef APSTUDIO_READONLY_SYMBOLS + +///////////////////////////////////////////////////////////////////////////// +// English (United States) resources + +#if !defined(AFX_RESOURCE_DLL) || defined(AFX_TARG_ENU) +LANGUAGE LANG_ENGLISH, SUBLANG_ENGLISH_US + +#ifdef APSTUDIO_INVOKED +///////////////////////////////////////////////////////////////////////////// +// +// TEXTINCLUDE +// + +1 TEXTINCLUDE +BEGIN + "resource.h\0" +END + +2 TEXTINCLUDE +BEGIN + "#include ""winres.h""\r\n" + "\0" +END + +3 TEXTINCLUDE +BEGIN + "\r\n" + "\0" +END + +#endif // APSTUDIO_INVOKED + + +///////////////////////////////////////////////////////////////////////////// +// +// Icon +// + +// Icon with lowest ID value placed first to ensure application icon +// remains consistent on all systems. +IDI_APP_ICON ICON "resources\\app_icon.ico" + + +///////////////////////////////////////////////////////////////////////////// +// +// Version +// + +#ifdef FLUTTER_BUILD_NUMBER +#define VERSION_AS_NUMBER FLUTTER_BUILD_NUMBER +#else +#define VERSION_AS_NUMBER 1,0,0 +#endif + +#ifdef FLUTTER_BUILD_NAME +#define VERSION_AS_STRING #FLUTTER_BUILD_NAME +#else +#define VERSION_AS_STRING "1.0.0" +#endif + +VS_VERSION_INFO VERSIONINFO + FILEVERSION VERSION_AS_NUMBER + PRODUCTVERSION VERSION_AS_NUMBER + FILEFLAGSMASK VS_FFI_FILEFLAGSMASK +#ifdef _DEBUG + FILEFLAGS VS_FF_DEBUG +#else + FILEFLAGS 0x0L +#endif + FILEOS VOS__WINDOWS32 + FILETYPE VFT_APP + FILESUBTYPE 0x0L +BEGIN + BLOCK "StringFileInfo" + BEGIN + BLOCK "040904e4" + BEGIN + VALUE "CompanyName", "com.example" "\0" + VALUE "FileDescription", "example" "\0" + VALUE "FileVersion", VERSION_AS_STRING "\0" + VALUE "InternalName", "example" "\0" + VALUE "LegalCopyright", "Copyright (C) 2022 com.example. All rights reserved." "\0" + VALUE "OriginalFilename", "example.exe" "\0" + VALUE "ProductName", "example" "\0" + VALUE "ProductVersion", VERSION_AS_STRING "\0" + END + END + BLOCK "VarFileInfo" + BEGIN + VALUE "Translation", 0x409, 1252 + END +END + +#endif // English (United States) resources +///////////////////////////////////////////////////////////////////////////// + + + +#ifndef APSTUDIO_INVOKED +///////////////////////////////////////////////////////////////////////////// +// +// Generated from the TEXTINCLUDE 3 resource. +// + + +///////////////////////////////////////////////////////////////////////////// +#endif // not APSTUDIO_INVOKED diff --git a/siro_rider/packages/calendar_builder/example/windows/runner/flutter_window.cpp b/siro_rider/packages/calendar_builder/example/windows/runner/flutter_window.cpp new file mode 100644 index 0000000..b43b909 --- /dev/null +++ b/siro_rider/packages/calendar_builder/example/windows/runner/flutter_window.cpp @@ -0,0 +1,61 @@ +#include "flutter_window.h" + +#include + +#include "flutter/generated_plugin_registrant.h" + +FlutterWindow::FlutterWindow(const flutter::DartProject& project) + : project_(project) {} + +FlutterWindow::~FlutterWindow() {} + +bool FlutterWindow::OnCreate() { + if (!Win32Window::OnCreate()) { + return false; + } + + RECT frame = GetClientArea(); + + // The size here must match the window dimensions to avoid unnecessary surface + // creation / destruction in the startup path. + flutter_controller_ = std::make_unique( + frame.right - frame.left, frame.bottom - frame.top, project_); + // Ensure that basic setup of the controller was successful. + if (!flutter_controller_->engine() || !flutter_controller_->view()) { + return false; + } + RegisterPlugins(flutter_controller_->engine()); + SetChildContent(flutter_controller_->view()->GetNativeWindow()); + return true; +} + +void FlutterWindow::OnDestroy() { + if (flutter_controller_) { + flutter_controller_ = nullptr; + } + + Win32Window::OnDestroy(); +} + +LRESULT +FlutterWindow::MessageHandler(HWND hwnd, UINT const message, + WPARAM const wparam, + LPARAM const lparam) noexcept { + // Give Flutter, including plugins, an opportunity to handle window messages. + if (flutter_controller_) { + std::optional result = + flutter_controller_->HandleTopLevelWindowProc(hwnd, message, wparam, + lparam); + if (result) { + return *result; + } + } + + switch (message) { + case WM_FONTCHANGE: + flutter_controller_->engine()->ReloadSystemFonts(); + break; + } + + return Win32Window::MessageHandler(hwnd, message, wparam, lparam); +} diff --git a/siro_rider/packages/calendar_builder/example/windows/runner/flutter_window.h b/siro_rider/packages/calendar_builder/example/windows/runner/flutter_window.h new file mode 100644 index 0000000..6da0652 --- /dev/null +++ b/siro_rider/packages/calendar_builder/example/windows/runner/flutter_window.h @@ -0,0 +1,33 @@ +#ifndef RUNNER_FLUTTER_WINDOW_H_ +#define RUNNER_FLUTTER_WINDOW_H_ + +#include +#include + +#include + +#include "win32_window.h" + +// A window that does nothing but host a Flutter view. +class FlutterWindow : public Win32Window { + public: + // Creates a new FlutterWindow hosting a Flutter view running |project|. + explicit FlutterWindow(const flutter::DartProject& project); + virtual ~FlutterWindow(); + + protected: + // Win32Window: + bool OnCreate() override; + void OnDestroy() override; + LRESULT MessageHandler(HWND window, UINT const message, WPARAM const wparam, + LPARAM const lparam) noexcept override; + + private: + // The project to run. + flutter::DartProject project_; + + // The Flutter instance hosted by this window. + std::unique_ptr flutter_controller_; +}; + +#endif // RUNNER_FLUTTER_WINDOW_H_ diff --git a/siro_rider/packages/calendar_builder/example/windows/runner/main.cpp b/siro_rider/packages/calendar_builder/example/windows/runner/main.cpp new file mode 100644 index 0000000..bcb57b0 --- /dev/null +++ b/siro_rider/packages/calendar_builder/example/windows/runner/main.cpp @@ -0,0 +1,43 @@ +#include +#include +#include + +#include "flutter_window.h" +#include "utils.h" + +int APIENTRY wWinMain(_In_ HINSTANCE instance, _In_opt_ HINSTANCE prev, + _In_ wchar_t *command_line, _In_ int show_command) { + // Attach to console when present (e.g., 'flutter run') or create a + // new console when running with a debugger. + if (!::AttachConsole(ATTACH_PARENT_PROCESS) && ::IsDebuggerPresent()) { + CreateAndAttachConsole(); + } + + // Initialize COM, so that it is available for use in the library and/or + // plugins. + ::CoInitializeEx(nullptr, COINIT_APARTMENTTHREADED); + + flutter::DartProject project(L"data"); + + std::vector command_line_arguments = + GetCommandLineArguments(); + + project.set_dart_entrypoint_arguments(std::move(command_line_arguments)); + + FlutterWindow window(project); + Win32Window::Point origin(10, 10); + Win32Window::Size size(1280, 720); + if (!window.CreateAndShow(L"example", origin, size)) { + return EXIT_FAILURE; + } + window.SetQuitOnClose(true); + + ::MSG msg; + while (::GetMessage(&msg, nullptr, 0, 0)) { + ::TranslateMessage(&msg); + ::DispatchMessage(&msg); + } + + ::CoUninitialize(); + return EXIT_SUCCESS; +} diff --git a/siro_rider/packages/calendar_builder/example/windows/runner/resource.h b/siro_rider/packages/calendar_builder/example/windows/runner/resource.h new file mode 100644 index 0000000..66a65d1 --- /dev/null +++ b/siro_rider/packages/calendar_builder/example/windows/runner/resource.h @@ -0,0 +1,16 @@ +//{{NO_DEPENDENCIES}} +// Microsoft Visual C++ generated include file. +// Used by Runner.rc +// +#define IDI_APP_ICON 101 + +// Next default values for new objects +// +#ifdef APSTUDIO_INVOKED +#ifndef APSTUDIO_READONLY_SYMBOLS +#define _APS_NEXT_RESOURCE_VALUE 102 +#define _APS_NEXT_COMMAND_VALUE 40001 +#define _APS_NEXT_CONTROL_VALUE 1001 +#define _APS_NEXT_SYMED_VALUE 101 +#endif +#endif diff --git a/siro_rider/packages/calendar_builder/example/windows/runner/resources/app_icon.ico b/siro_rider/packages/calendar_builder/example/windows/runner/resources/app_icon.ico new file mode 100644 index 0000000..c04e20c Binary files /dev/null and b/siro_rider/packages/calendar_builder/example/windows/runner/resources/app_icon.ico differ diff --git a/siro_rider/packages/calendar_builder/example/windows/runner/runner.exe.manifest b/siro_rider/packages/calendar_builder/example/windows/runner/runner.exe.manifest new file mode 100644 index 0000000..c977c4a --- /dev/null +++ b/siro_rider/packages/calendar_builder/example/windows/runner/runner.exe.manifest @@ -0,0 +1,20 @@ + + + + + PerMonitorV2 + + + + + + + + + + + + + + + diff --git a/siro_rider/packages/calendar_builder/example/windows/runner/utils.cpp b/siro_rider/packages/calendar_builder/example/windows/runner/utils.cpp new file mode 100644 index 0000000..d19bdbb --- /dev/null +++ b/siro_rider/packages/calendar_builder/example/windows/runner/utils.cpp @@ -0,0 +1,64 @@ +#include "utils.h" + +#include +#include +#include +#include + +#include + +void CreateAndAttachConsole() { + if (::AllocConsole()) { + FILE *unused; + if (freopen_s(&unused, "CONOUT$", "w", stdout)) { + _dup2(_fileno(stdout), 1); + } + if (freopen_s(&unused, "CONOUT$", "w", stderr)) { + _dup2(_fileno(stdout), 2); + } + std::ios::sync_with_stdio(); + FlutterDesktopResyncOutputStreams(); + } +} + +std::vector GetCommandLineArguments() { + // Convert the UTF-16 command line arguments to UTF-8 for the Engine to use. + int argc; + wchar_t** argv = ::CommandLineToArgvW(::GetCommandLineW(), &argc); + if (argv == nullptr) { + return std::vector(); + } + + std::vector command_line_arguments; + + // Skip the first argument as it's the binary name. + for (int i = 1; i < argc; i++) { + command_line_arguments.push_back(Utf8FromUtf16(argv[i])); + } + + ::LocalFree(argv); + + return command_line_arguments; +} + +std::string Utf8FromUtf16(const wchar_t* utf16_string) { + if (utf16_string == nullptr) { + return std::string(); + } + int target_length = ::WideCharToMultiByte( + CP_UTF8, WC_ERR_INVALID_CHARS, utf16_string, + -1, nullptr, 0, nullptr, nullptr); + if (target_length == 0) { + return std::string(); + } + std::string utf8_string; + utf8_string.resize(target_length); + int converted_length = ::WideCharToMultiByte( + CP_UTF8, WC_ERR_INVALID_CHARS, utf16_string, + -1, utf8_string.data(), + target_length, nullptr, nullptr); + if (converted_length == 0) { + return std::string(); + } + return utf8_string; +} diff --git a/siro_rider/packages/calendar_builder/example/windows/runner/utils.h b/siro_rider/packages/calendar_builder/example/windows/runner/utils.h new file mode 100644 index 0000000..3879d54 --- /dev/null +++ b/siro_rider/packages/calendar_builder/example/windows/runner/utils.h @@ -0,0 +1,19 @@ +#ifndef RUNNER_UTILS_H_ +#define RUNNER_UTILS_H_ + +#include +#include + +// Creates a console for the process, and redirects stdout and stderr to +// it for both the runner and the Flutter library. +void CreateAndAttachConsole(); + +// Takes a null-terminated wchar_t* encoded in UTF-16 and returns a std::string +// encoded in UTF-8. Returns an empty std::string on failure. +std::string Utf8FromUtf16(const wchar_t* utf16_string); + +// Gets the command line arguments passed in as a std::vector, +// encoded in UTF-8. Returns an empty std::vector on failure. +std::vector GetCommandLineArguments(); + +#endif // RUNNER_UTILS_H_ diff --git a/siro_rider/packages/calendar_builder/example/windows/runner/win32_window.cpp b/siro_rider/packages/calendar_builder/example/windows/runner/win32_window.cpp new file mode 100644 index 0000000..c10f08d --- /dev/null +++ b/siro_rider/packages/calendar_builder/example/windows/runner/win32_window.cpp @@ -0,0 +1,245 @@ +#include "win32_window.h" + +#include + +#include "resource.h" + +namespace { + +constexpr const wchar_t kWindowClassName[] = L"FLUTTER_RUNNER_WIN32_WINDOW"; + +// The number of Win32Window objects that currently exist. +static int g_active_window_count = 0; + +using EnableNonClientDpiScaling = BOOL __stdcall(HWND hwnd); + +// Scale helper to convert logical scaler values to physical using passed in +// scale factor +int Scale(int source, double scale_factor) { + return static_cast(source * scale_factor); +} + +// Dynamically loads the |EnableNonClientDpiScaling| from the User32 module. +// This API is only needed for PerMonitor V1 awareness mode. +void EnableFullDpiSupportIfAvailable(HWND hwnd) { + HMODULE user32_module = LoadLibraryA("User32.dll"); + if (!user32_module) { + return; + } + auto enable_non_client_dpi_scaling = + reinterpret_cast( + GetProcAddress(user32_module, "EnableNonClientDpiScaling")); + if (enable_non_client_dpi_scaling != nullptr) { + enable_non_client_dpi_scaling(hwnd); + FreeLibrary(user32_module); + } +} + +} // namespace + +// Manages the Win32Window's window class registration. +class WindowClassRegistrar { + public: + ~WindowClassRegistrar() = default; + + // Returns the singleton registar instance. + static WindowClassRegistrar* GetInstance() { + if (!instance_) { + instance_ = new WindowClassRegistrar(); + } + return instance_; + } + + // Returns the name of the window class, registering the class if it hasn't + // previously been registered. + const wchar_t* GetWindowClass(); + + // Unregisters the window class. Should only be called if there are no + // instances of the window. + void UnregisterWindowClass(); + + private: + WindowClassRegistrar() = default; + + static WindowClassRegistrar* instance_; + + bool class_registered_ = false; +}; + +WindowClassRegistrar* WindowClassRegistrar::instance_ = nullptr; + +const wchar_t* WindowClassRegistrar::GetWindowClass() { + if (!class_registered_) { + WNDCLASS window_class{}; + window_class.hCursor = LoadCursor(nullptr, IDC_ARROW); + window_class.lpszClassName = kWindowClassName; + window_class.style = CS_HREDRAW | CS_VREDRAW; + window_class.cbClsExtra = 0; + window_class.cbWndExtra = 0; + window_class.hInstance = GetModuleHandle(nullptr); + window_class.hIcon = + LoadIcon(window_class.hInstance, MAKEINTRESOURCE(IDI_APP_ICON)); + window_class.hbrBackground = 0; + window_class.lpszMenuName = nullptr; + window_class.lpfnWndProc = Win32Window::WndProc; + RegisterClass(&window_class); + class_registered_ = true; + } + return kWindowClassName; +} + +void WindowClassRegistrar::UnregisterWindowClass() { + UnregisterClass(kWindowClassName, nullptr); + class_registered_ = false; +} + +Win32Window::Win32Window() { + ++g_active_window_count; +} + +Win32Window::~Win32Window() { + --g_active_window_count; + Destroy(); +} + +bool Win32Window::CreateAndShow(const std::wstring& title, + const Point& origin, + const Size& size) { + Destroy(); + + const wchar_t* window_class = + WindowClassRegistrar::GetInstance()->GetWindowClass(); + + const POINT target_point = {static_cast(origin.x), + static_cast(origin.y)}; + HMONITOR monitor = MonitorFromPoint(target_point, MONITOR_DEFAULTTONEAREST); + UINT dpi = FlutterDesktopGetDpiForMonitor(monitor); + double scale_factor = dpi / 96.0; + + HWND window = CreateWindow( + window_class, title.c_str(), WS_OVERLAPPEDWINDOW | WS_VISIBLE, + Scale(origin.x, scale_factor), Scale(origin.y, scale_factor), + Scale(size.width, scale_factor), Scale(size.height, scale_factor), + nullptr, nullptr, GetModuleHandle(nullptr), this); + + if (!window) { + return false; + } + + return OnCreate(); +} + +// static +LRESULT CALLBACK Win32Window::WndProc(HWND const window, + UINT const message, + WPARAM const wparam, + LPARAM const lparam) noexcept { + if (message == WM_NCCREATE) { + auto window_struct = reinterpret_cast(lparam); + SetWindowLongPtr(window, GWLP_USERDATA, + reinterpret_cast(window_struct->lpCreateParams)); + + auto that = static_cast(window_struct->lpCreateParams); + EnableFullDpiSupportIfAvailable(window); + that->window_handle_ = window; + } else if (Win32Window* that = GetThisFromHandle(window)) { + return that->MessageHandler(window, message, wparam, lparam); + } + + return DefWindowProc(window, message, wparam, lparam); +} + +LRESULT +Win32Window::MessageHandler(HWND hwnd, + UINT const message, + WPARAM const wparam, + LPARAM const lparam) noexcept { + switch (message) { + case WM_DESTROY: + window_handle_ = nullptr; + Destroy(); + if (quit_on_close_) { + PostQuitMessage(0); + } + return 0; + + case WM_DPICHANGED: { + auto newRectSize = reinterpret_cast(lparam); + LONG newWidth = newRectSize->right - newRectSize->left; + LONG newHeight = newRectSize->bottom - newRectSize->top; + + SetWindowPos(hwnd, nullptr, newRectSize->left, newRectSize->top, newWidth, + newHeight, SWP_NOZORDER | SWP_NOACTIVATE); + + return 0; + } + case WM_SIZE: { + RECT rect = GetClientArea(); + if (child_content_ != nullptr) { + // Size and position the child window. + MoveWindow(child_content_, rect.left, rect.top, rect.right - rect.left, + rect.bottom - rect.top, TRUE); + } + return 0; + } + + case WM_ACTIVATE: + if (child_content_ != nullptr) { + SetFocus(child_content_); + } + return 0; + } + + return DefWindowProc(window_handle_, message, wparam, lparam); +} + +void Win32Window::Destroy() { + OnDestroy(); + + if (window_handle_) { + DestroyWindow(window_handle_); + window_handle_ = nullptr; + } + if (g_active_window_count == 0) { + WindowClassRegistrar::GetInstance()->UnregisterWindowClass(); + } +} + +Win32Window* Win32Window::GetThisFromHandle(HWND const window) noexcept { + return reinterpret_cast( + GetWindowLongPtr(window, GWLP_USERDATA)); +} + +void Win32Window::SetChildContent(HWND content) { + child_content_ = content; + SetParent(content, window_handle_); + RECT frame = GetClientArea(); + + MoveWindow(content, frame.left, frame.top, frame.right - frame.left, + frame.bottom - frame.top, true); + + SetFocus(child_content_); +} + +RECT Win32Window::GetClientArea() { + RECT frame; + GetClientRect(window_handle_, &frame); + return frame; +} + +HWND Win32Window::GetHandle() { + return window_handle_; +} + +void Win32Window::SetQuitOnClose(bool quit_on_close) { + quit_on_close_ = quit_on_close; +} + +bool Win32Window::OnCreate() { + // No-op; provided for subclasses. + return true; +} + +void Win32Window::OnDestroy() { + // No-op; provided for subclasses. +} diff --git a/siro_rider/packages/calendar_builder/example/windows/runner/win32_window.h b/siro_rider/packages/calendar_builder/example/windows/runner/win32_window.h new file mode 100644 index 0000000..17ba431 --- /dev/null +++ b/siro_rider/packages/calendar_builder/example/windows/runner/win32_window.h @@ -0,0 +1,98 @@ +#ifndef RUNNER_WIN32_WINDOW_H_ +#define RUNNER_WIN32_WINDOW_H_ + +#include + +#include +#include +#include + +// A class abstraction for a high DPI-aware Win32 Window. Intended to be +// inherited from by classes that wish to specialize with custom +// rendering and input handling +class Win32Window { + public: + struct Point { + unsigned int x; + unsigned int y; + Point(unsigned int x, unsigned int y) : x(x), y(y) {} + }; + + struct Size { + unsigned int width; + unsigned int height; + Size(unsigned int width, unsigned int height) + : width(width), height(height) {} + }; + + Win32Window(); + virtual ~Win32Window(); + + // Creates and shows a win32 window with |title| and position and size using + // |origin| and |size|. New windows are created on the default monitor. Window + // sizes are specified to the OS in physical pixels, hence to ensure a + // consistent size to will treat the width height passed in to this function + // as logical pixels and scale to appropriate for the default monitor. Returns + // true if the window was created successfully. + bool CreateAndShow(const std::wstring& title, + const Point& origin, + const Size& size); + + // Release OS resources associated with window. + void Destroy(); + + // Inserts |content| into the window tree. + void SetChildContent(HWND content); + + // Returns the backing Window handle to enable clients to set icon and other + // window properties. Returns nullptr if the window has been destroyed. + HWND GetHandle(); + + // If true, closing this window will quit the application. + void SetQuitOnClose(bool quit_on_close); + + // Return a RECT representing the bounds of the current client area. + RECT GetClientArea(); + + protected: + // Processes and route salient window messages for mouse handling, + // size change and DPI. Delegates handling of these to member overloads that + // inheriting classes can handle. + virtual LRESULT MessageHandler(HWND window, + UINT const message, + WPARAM const wparam, + LPARAM const lparam) noexcept; + + // Called when CreateAndShow is called, allowing subclass window-related + // setup. Subclasses should return false if setup fails. + virtual bool OnCreate(); + + // Called when Destroy is called. + virtual void OnDestroy(); + + private: + friend class WindowClassRegistrar; + + // OS callback called by message pump. Handles the WM_NCCREATE message which + // is passed when the non-client area is being created and enables automatic + // non-client DPI scaling so that the non-client area automatically + // responsponds to changes in DPI. All other messages are handled by + // MessageHandler. + static LRESULT CALLBACK WndProc(HWND const window, + UINT const message, + WPARAM const wparam, + LPARAM const lparam) noexcept; + + // Retrieves a class instance pointer for |window| + static Win32Window* GetThisFromHandle(HWND const window) noexcept; + + bool quit_on_close_ = false; + + // window handle for top level window. + HWND window_handle_ = nullptr; + + // window handle for hosted content. + HWND child_content_ = nullptr; +}; + +#endif // RUNNER_WIN32_WINDOW_H_ diff --git a/siro_rider/packages/calendar_builder/lib/calendar_builder.dart b/siro_rider/packages/calendar_builder/lib/calendar_builder.dart new file mode 100644 index 0000000..177ae29 --- /dev/null +++ b/siro_rider/packages/calendar_builder/lib/calendar_builder.dart @@ -0,0 +1,6 @@ +export 'src/utils/global.dart'; +export 'src/utils/widgets.dart'; +export 'src/models/cb_config.dart'; +export 'src/utils/date_utils_cb.dart'; +export 'src/models/month_data_model.dart'; +export './src/views/month_builder.dart'; diff --git a/siro_rider/packages/calendar_builder/lib/src/controllers/cb_controller.dart b/siro_rider/packages/calendar_builder/lib/src/controllers/cb_controller.dart new file mode 100644 index 0000000..f0fe2a9 --- /dev/null +++ b/siro_rider/packages/calendar_builder/lib/src/controllers/cb_controller.dart @@ -0,0 +1,14 @@ +import '../models/cb_config.dart'; + +import 'package:get/get.dart'; + +///Main controller for all the datas +class CbController extends GetxController { + ///data configuration for [cbcontroller] + CbConfig? cbConfig; + + ///add config + void changeConfig(CbConfig config) { + cbConfig = config; + } +} diff --git a/siro_rider/packages/calendar_builder/lib/src/controllers/month_builder_controller.dart b/siro_rider/packages/calendar_builder/lib/src/controllers/month_builder_controller.dart new file mode 100644 index 0000000..5168a32 --- /dev/null +++ b/siro_rider/packages/calendar_builder/lib/src/controllers/month_builder_controller.dart @@ -0,0 +1,179 @@ +import 'package:get/get.dart'; +import '../../calendar_builder.dart'; + +/// State manager or controller of MonthBuilder +class MonthBuilderController extends GetxController { + ///startDate of month + DateTime mStartDate = DateTime(DateTime.now().year); + + /// EndDate of month + /// default one year greater than [mStartDate] + /// [endDate] should be greater than [startDate] + DateTime mEndDate = + DateTime(DateTime.now().year + 20).subtract(const Duration(days: 1)); + + ///Current day/Todays Date of Birth" + ///default = now + DateTime mCurrentDay = DateTime.now(); + + ///this contains all the [DateTime] from [mStartDate] to [mEndDate] with [mEndDate]+its full year + ///!minimum 1 year dates will be there + late List mAllDates; + + ///this contains all the [DateTime] from [mStartDate] to [mEndDate] + late List mStartToEndDates; + + ///this contains all the dateTime sorted in the basis of years from [mStartDate] to [mEndDate] + ///!minimum 1 year will be there + late List mAllYears; + + ///lits of 16 dates for year dropDown + late List m16DateTimeYears; + + ///Slected Date + ///default = [mStartDate] + DateTime mSelectedDate = DateTime.now(); + + ///Slected Year + ///default = [DateTime(mStartDate.year)] + DateTime mSelectedYear = DateTime(DateTime.now().year); + + ///all events dates + List mEventDates = []; + + ///all disabled dates + List mDisabledDates = []; + + ///all hilighted dates + List mHighlightedDates = []; + + ///weeek start from + ///default = `WeekStartsFrom.sunday` + WeekStartsFrom mWeekStartsFrom = WeekStartsFrom.sunday; + + ///used to improve the performance of [monthBuilder] + ///wee add all the datas using [addToSavedMonthDates] function + ///and theen [savedMonthRemover] this function removers dates + ///if [savedMonthDatas.length] exceeds 3 + /// + List savedMonthDatas = []; + + ///removed date from [savedMonthDatas] + DateTime? removedDate; + + ///all month start up logic + void _logicInitialization() { + ///alll the dates form [mStartDate] to [mEndDate] + mStartToEndDates = + DateUtilsCB.getDaysInBeteween(startDate: mStartDate, endDate: mEndDate); + + ///all the dates in each the year + mAllDates = DateUtilsCB.getAllDaysInBetweenYears( + startDate: mStartDate, endDate: mEndDate); + + ///gets all the years form [mStartDate] to [mEndDate] + mAllYears = DateUtilsCB.getYearsInBeteween( + startDate: mStartDate, endDate: mEndDate); + + _yearBuilderLogic(); + } + + ///configaration for month builder + void config({CbConfig? config, bool useOnHotReload = false}) { + if (useOnHotReload == false) { + mStartDate = config?.startDate ?? DateTime(DateTime.now().year); + } + mEndDate = config?.endDate ?? + DateTime(DateTime.now().year + 20).subtract(const Duration(days: 1)); + + /// + if (useOnHotReload == false) { + mSelectedDate = config?.selectedDate ?? DateTime.now(); + mSelectedYear = config?.selectedYear ?? DateTime(mStartDate.year); + } + mCurrentDay = config?.currentDay ?? DateTime.now(); + mWeekStartsFrom = config?.weekStartsFrom ?? WeekStartsFrom.sunday; + mEventDates = config?.eventDates ?? []; + mHighlightedDates = config?.highlightedDates ?? []; + mDisabledDates = config?.disabledDates ?? []; + _logicInitialization(); + } + + ///For Improving Performace + ///Add selectedYear to savedMonthDatas --- to save data + void addToSavedMonthDates(DateTime date) { + savedMonthDatas.add(date); + savedMonthDatas = savedMonthDatas.toSet().toList(); + } + + ///For Improving Performace + ///to check wether the saved month size exceeds 3 + ///if excedes it removes previous cached datas + void savedMonthRemover(DateTime date) { + CalendarGlobals.debugLogs('-----$date'); + if (savedMonthDatas.length > 3) { + if (savedMonthDatas[0] != date) { + removedDate = savedMonthDatas[0]; + savedMonthDatas.removeAt(0); + update(['removedDate:$removedDate!']); + CalendarGlobals.debugLogs('removedDate:$removedDate!'); + } else { + removedDate = null; + } + } else { + removedDate = null; + } + } + + ///Checking [mAllYears] + ///because to get alll the 16 days to fill the boxes in [UI] + void _yearBuilderLogic() { + if (mAllYears.length < 16) { + m16DateTimeYears = DateUtilsCB.getYearsInBeteween( + startDate: mStartDate, + endDate: DateTime(mAllYears.last.year + (16 - (mAllYears.length))), + ); + } else { + m16DateTimeYears = []; + } + } + + ///fuction to update Selected Date [mSelectedDate] + void changeSelectedDate({ + required DateTime selectedDate, + DateTime? oldSelectedDate, + required String commonUpdateId, + String? updateId, + bool updateByID = false, + }) { + mSelectedDate = selectedDate; + //common update Id for date changes + update([commonUpdateId]); + CalendarGlobals.debugLogs('old:$oldSelectedDate'); + CalendarGlobals.debugLogs('selcted:$selectedDate'); + if (updateByID && oldSelectedDate != null && updateId != null) { + update([selectedDate, oldSelectedDate, updateId]); + } else { + update(); + } + } + + ///fuction to update Selected Date [mSelectedYear] + void changeSelectedYear({ + required DateTime selectedYear, + DateTime? oldSelectedYear, + required String commonUpdateId, + String? updateId, + bool updateByID = false, + }) { + mSelectedYear = selectedYear; + //common update Id for date changes + update([commonUpdateId]); + + if (updateByID && oldSelectedYear != null && updateId != null) { + update([selectedYear, oldSelectedYear, updateId]); + } else { + update(); + } + } +} diff --git a/siro_rider/packages/calendar_builder/lib/src/controllers/month_ui_controller.dart b/siro_rider/packages/calendar_builder/lib/src/controllers/month_ui_controller.dart new file mode 100644 index 0000000..989eda9 --- /dev/null +++ b/siro_rider/packages/calendar_builder/lib/src/controllers/month_ui_controller.dart @@ -0,0 +1,46 @@ +import 'package:flutter/cupertino.dart'; +import 'package:get/get.dart'; + +import '../../calendar_builder.dart'; + +///this controller is used to controll the state of the [month_builder] ui +class MonthUiController extends GetxController { + ///checking wether the yer picker is expanded or not + bool isYearPickerExpanded = false; + + ///Page controller for Month + late PageController mPageController; + + ///callback when year header is expanded + void Function(bool isExpanded)? onYearHeaderExpanded; + + /// callback when year button is clicked + void Function(DateTime selectedYear, bool isSelected)? onYearButtonClicked; + + /// callback when date button is clicked + void Function(OnDateSelected onDateSelected)? onDateClicked; + + ///used to chage the expanded or not-expanded , state of year picker + void chageYearExpanded( + {String? updateId, + required String commonUpdateId, + required bool isExpanded}) { + ///if its aldready in the same state then it will not update + if (isYearPickerExpanded != isExpanded) { + isYearPickerExpanded = isExpanded; + + ///common update Id for year picker expanded + update([commonUpdateId]); + if (updateId != null) { + update([updateId]); + } else { + update(); + } + } + } + + ///checking for year dropdown should be expanded initially or not + void expandInitiaally(bool isExpanded) { + isYearPickerExpanded = isExpanded; + } +} diff --git a/siro_rider/packages/calendar_builder/lib/src/models/cb_config.dart b/siro_rider/packages/calendar_builder/lib/src/models/cb_config.dart new file mode 100644 index 0000000..5be5ac6 --- /dev/null +++ b/siro_rider/packages/calendar_builder/lib/src/models/cb_config.dart @@ -0,0 +1,82 @@ +import '../utils/date_utils_cb.dart'; + +///Global configuration class for [calendar_builder] +class CbConfig { + ///startDate of month + final DateTime startDate; + + /// EndDate of month + /// [endDate] should be greater than [startDate] + final DateTime endDate; + + ///Current day/Todays Date + ///default = now + final DateTime? currentDay; + + ///Slected Date + ///default = [startDate] + final DateTime selectedDate; + + ///Slected Year + ///default = [DateTime(StartDate.year)] + final DateTime selectedYear; + + ///Add events + final List? eventDates; + + ///Add disabled dates + final List? disabledDates; + + ///Add hilighted dates + final List? highlightedDates; + + ///weeek start from + ///default = `WeekStartsFrom.sunday` + /// + ///------options--------- + /// + /// `WeekStartsFrom.monday` + /// + /// `WeekStartsFrom.tuesday` + /// + /// `WeekStartsFrom.wednesday` + /// + /// `WeekStartsFrom.thursday` + /// + /// `WeekStartsFrom.friday` + /// + /// `WeekStartsFrom.saturday` + /// + /// `WeekStartsFrom.sunday` + final WeekStartsFrom weekStartsFrom; + + /// + CbConfig({ + required this.startDate, + required this.endDate, + required this.selectedDate, + required this.selectedYear, + this.currentDay, + this.eventDates, + this.disabledDates, + this.highlightedDates, + this.weekStartsFrom = WeekStartsFrom.sunday, + }) : assert(startDate.isBefore(endDate), + '\n\nERROR ( Calendar Builder ):\n---------\nInside CbConfig()\nEndDate Should be greater than StartDate\n---------\n_'), + assert( + DateUtilsCB.checkDayisSelected( + dateSelected: selectedDate, + loopedDay: endDate, + ) || + selectedDate.isBefore(endDate), + '\n\nERROR ( Calendar Builder ):\n---------\nInside CbConfig()\nSelectedDate Should be in B/w StartDate and EndDate\n---------\n_'), + assert( + DateUtilsCB.checkDayisSelected( + dateSelected: selectedDate, + loopedDay: startDate, + ) || + selectedDate.isAfter(startDate), + '\n\nERROR ( Calendar Builder ):\n---------\nInside CbConfig()\nSelectedDate Should be in B/w StartDate and EndDate\n---------\n_'), + assert(selectedYear.year >= startDate.year && + selectedYear.year <= endDate.year); +} diff --git a/siro_rider/packages/calendar_builder/lib/src/models/month_data_model.dart b/siro_rider/packages/calendar_builder/lib/src/models/month_data_model.dart new file mode 100644 index 0000000..8b95a62 --- /dev/null +++ b/siro_rider/packages/calendar_builder/lib/src/models/month_data_model.dart @@ -0,0 +1,685 @@ +import 'package:flutter/material.dart'; + +///Year Header Builder +typedef WidgetCbYearHeader = Widget Function( + bool isYearPickerExpanded, + DateTime selectedDate, + DateTime selectedYear, + String year, +); + +///year button builder +typedef WidgetCbYearButton = Widget Function( + DateTime dateTime, + double heightResponsive, + double widthResponsive, + bool isYearDisabled, + bool isYearSelected, +); + +///Month button builder +typedef WidgetCbMonthButton = Widget Function( + DateTime dateTime, + double childHeight, + double childWidth, + bool isSelected, + bool isDisabled, + bool hasEvent, + bool isHighlighted, + bool isCurrentDate); + +/// Month week builder +typedef WidgetCbMonthWeek = Widget Function( + int index, + String weeks, + double weekHeight, + double weekWidth, +); + +///Month Header builder +typedef WeidgetCbMonthHeader = Widget Function( + String month, + double headerHeight, + double headerWidth, + double paddingLeft, +); + +///A data class for customizing buttons of [CbYearDropDown] +class YearButtonCustomizer { + ///constructor + YearButtonCustomizer({ + this.borderColorOnSelected, + this.borderColorOnDisabled, + this.borderColorOnEnabled, + this.textColorOnSelected, + this.textColorOnDisabled, + this.textColorOnEnabled, + this.splashColor, + this.hoverColor, + this.onPressed, + this.shrinkOnButtonPressed = true, + }); + + ///Apply border color to button When buttton is [selected] + final Color? borderColorOnSelected; + + ///Apply border color to button When buttton is [Disabled] + + final Color? borderColorOnDisabled; + + ///Apply border color to button When buttton is [Enabled] + + final Color? borderColorOnEnabled; + + ///change text color of [selected] year inside Button + final Color? textColorOnSelected; + + ///change text color of [Disabled] year inside Button + + final Color? textColorOnDisabled; + + ///change text color of [enabled] year inside Button + + final Color? textColorOnEnabled; + + ///Change spalash color of button + final Color? splashColor; + + ///Change hover color of button + + final Color? hoverColor; + + ///onPress calback when buttton is pressed + final void Function(bool isButtonDisabled, DateTime selectedYear)? onPressed; + + ///shrink expanded On Buttton Pressed [bool] + ///default [true] + final bool shrinkOnButtonPressed; +} + +///A data class for customizing year Header of [CbYearDropDown] + +class YearHeaderCustomizer { + /// + YearHeaderCustomizer({ + this.titleTextStyle, + this.height = 40, + this.width, + this.downIcon = Icons.arrow_drop_down_outlined, + this.upIcon = Icons.arrow_drop_up_outlined, + }); + + ///change TextStyle of year title + final TextStyle? titleTextStyle; + + ///change height of year Headder + final double height; + + ///change width of year Headder + final double? width; + + ///change expanded down icons + final IconData downIcon; + + ///change expanded up icons + final IconData upIcon; +} + +///Customize year DropDown +class YearDropDownCustomizer { + /// + const YearDropDownCustomizer({ + this.yearHeaderCustomizer, + this.yearButtonCustomizer, + this.yearHeaderBuilder, + this.yearButtonBuilder, + this.expandedYearHeight = 200, + this.expandedYearWidth, + this.expandYearInitially = false, + }); + + ///customise year Header style [YearHeaderCustomizer] + ///```dart + /// + ///YearHeaderCustomizer(), + /// + /// + /// ``` + /// {@end-tool} + final YearHeaderCustomizer? yearHeaderCustomizer; + + ///customise year button style [YearButtonCustomizer] + ///```dart + /// + ///YearButtonCustomizer(), + /// + /// + /// ``` + /// {@end-tool} + final YearButtonCustomizer? yearButtonCustomizer; + + ///Build your custom YearDropDown Header + /// + ///* NOTE: COPY & PASTE + ///* ### Sample code + /// + /// ```dart + /// yearHeaderBuilder: (isYearPickerExpanded, selectedDate, selectedYear, year) { + /// return SizedBox( + /// height: 40, + /// child: Row( + /// mainAxisAlignment: MainAxisAlignment.center, + /// crossAxisAlignment: CrossAxisAlignment.center, + /// children: [ + /// Text( + /// year, + /// style: const TextStyle(fontWeight: FontWeight.bold), + /// ), + /// Icon(!isYearPickerExpanded + /// ? Icons.arrow_drop_down_outlined + /// : Icons.arrow_drop_up_outlined) + /// ], + /// ), + /// ); + /// }, + /// ``` + /// {@end-tool} + /// + final WidgetCbYearHeader? yearHeaderBuilder; + + ///Build your own year buttons + /// + ///* NOTE: COPY & PASTE + ///* ### Sample code + /// + /// ```dart + /// yearButtonBuilder: (dateTime, heightResponsive,widthResponsive, isyearDisabled, isYearselected) { + /// final txtTheme = Theme.of(context).textTheme; + /// final colorTheme = Theme.of(context); + /// return SizedBox( + /// height: heightResponsive, + /// width: widthResponsive, + /// child: DecoratedBox( + /// decoration: BoxDecoration( + /// borderRadius: BorderRadius.all( + /// Radius.circular(heightResponsive), + /// ), + /// border: Border.all( + /// color: isyearDisabled + /// ? colorTheme.disabledColor.withOpacity(0.1) + /// : isYearselected + /// ? (colorTheme.brightness == + /// Brightness.dark + /// ? colorTheme.accentColor + /// : Colors.black) + /// : Colors.grey, + /// width: isyearDisabled + /// ? 1 + /// : isYearselected + /// ? 1.5 + /// : 1), + /// ), + /// child: FittedBox( + /// fit: BoxFit.scaleDown, + /// child: Text(dateTime.year.toString(), + /// style: isyearDisabled + /// ? txtTheme.caption + /// : isYearselected + /// ? txtTheme.button + /// : txtTheme.button,), + /// ), + /// ), + /// ); + /// }, + /// ``` + /// {@end-tool} + /// + final WidgetCbYearButton? yearButtonBuilder; + + ///Expanded Height of year dropDown + ///default = 200 + final double expandedYearHeight; + + ///Expanded Width of year dropDown + final double? expandedYearWidth; + + ///default = `false` + ///Expande year Drop Down initially + final bool expandYearInitially; +} + +///customozer calss for Month button +class MonthButtonCustomizer { + ///height of month button + final double? height; + + ///width of month button + final double? width; + + ///Text Style on Enabled + final TextStyle? textStyleOnEnabled; + + ///Text Style on Disabled + final TextStyle? textStyleOnDisabled; + + ///Text Style on Selected + final TextStyle? textStyleOnSelected; + + ///Text Style on CurrentDay + final TextStyle? currentDayTextStyle; + + ///Text Style on Highlighted + final TextStyle? highlightedTextStyle; + + /// color on Disabled + final Color? colorOnDisabled; + + /// border color on Enabled + final Color? borderColorOnEnabled; + + /// Highlight Color/Border Color + final Color? highlightedColor; + + ///Current Day Color/BorderColor + final Color? currentDayColor; + + ///color on selected + final Color? colorOnSelected; + + ///event dot color on Enabled + final Color? eventColor; + + ///event color on Disabled + final Color? eventColorOnDisabled; + + ///border Stroke width on Enabled + final double borderStrokeWidth; + + /// default = `PaintingStyle.stroke` + final PaintingStyle paintStyleOnEnabled; + + ///Highlighted Button Painting Style + ///default = `PaintingStyle.stroke` + final PaintingStyle highlightedPaintingStyle; + + ///CurrentDay Button Painting Style + ///default = `PaintingStyle.fill` + final PaintingStyle currentDayPaintingStyle; + + /// default = `PaintingStyle.fill` + final PaintingStyle paintStyleOnDisabled; + + ///on month Button pressed + final void Function(DateTime selectedDate)? onPressed; + + /// + MonthButtonCustomizer({ + this.onPressed, + this.textStyleOnEnabled, + this.textStyleOnDisabled, + this.textStyleOnSelected, + this.currentDayTextStyle, + this.highlightedTextStyle, + this.colorOnDisabled, + this.borderColorOnEnabled, + this.colorOnSelected, + this.eventColor, + this.eventColorOnDisabled, + this.highlightedColor, + this.currentDayColor, + this.highlightedPaintingStyle = PaintingStyle.stroke, + this.currentDayPaintingStyle = PaintingStyle.fill, + this.borderStrokeWidth = 1, + this.paintStyleOnEnabled = PaintingStyle.stroke, + this.paintStyleOnDisabled = PaintingStyle.fill, + this.height, + this.width, + }); +} + +///CUstomiser class for month + +class MonthCustomizer { + ///CUstomiser class for month + MonthCustomizer({ + this.montMinhHeight = 300, + this.monthMinWidth, + this.scrollToSelectedMonth = false, + this.shrinkYearDropDownOnScroll = true, + this.mainAxisSpacing = 20, + this.crossAxisSpacing = 20, + this.padding = EdgeInsets.zero, + this.monthButtonCustomizer, + this.monthButtonBuilder, + this.monthHeaderCustomizer, + this.monthHeaderBuilder, + this.monthWeekBuilder, + this.monthWeekCustomizer, + }); + + ///heigh of single month + final double montMinhHeight; + + ///width of single month depend on the device you use + final double? monthMinWidth; + + ///default `scrollToSelectedMonth = false` + /// + ///if [scrollToSelectedMonth = true] month will scroll to selected date + final bool scrollToSelectedMonth; + + ///default = `true` + ///wether year DropDown Should shrink While Scrolling + final bool shrinkYearDropDownOnScroll; + + ///The number of logical pixels between each month along the main axis. + /// + ///give top & bottom space between months + final double mainAxisSpacing; + + ///The number of logical pixels between each month along the cross axis. + /// + ///give left & right space between months + final double crossAxisSpacing; + + ///set padding arround month + final EdgeInsetsGeometry padding; + + ///Customise month buttons + final MonthButtonCustomizer? monthButtonCustomizer; + + ///Customize month Header + final MonthHeaderCustomizer? monthHeaderCustomizer; + + ///Customize month week + final MonthWeekCustomizer? monthWeekCustomizer; + + ///Build your own month buttons + /// + ///* NOTE: COPY & PASTE + ///* ### Sample code + /// + /// ```dart + /// monthButtonBuilder: (dateTime,childHeight,childWidth,isSelected,isDisabled,hasEvent,isHighlighted,isCurrentDay) { + /// //Text Theme + /// final txtTheme = Theme.of(context).textTheme; + /// //color theme + /// final colorTheme = Theme.of(context); + /// + /// var daysText = Align( + /// child: Text( + /// '${dateTime.day}', + /// style: isDisabled + /// ? txtTheme.caption + /// : isSelected + /// ? txtTheme.bodyText1!.copyWith( + /// fontWeight: FontWeight.bold, + /// color: + /// colorTheme.brightness == Brightness.dark + /// ? Colors.black + /// : Colors.white) + /// : isHighlighted + /// ? txtTheme.bodyText2 //Highlighted TextStyle + /// : isCurrentDay + /// ? txtTheme + /// .bodyText2 //CurrentDay TextStyle + /// : txtTheme.bodyText2, + /// ), + /// ); + /// return Stack( + /// children: [ + /// //if button is Enabled or Disabled + /// isDisabled || !isSelected + /// ? CustomPaint( + /// painter: CirclePainter( + /// color: isDisabled + /// ? colorTheme.disabledColor + /// .withOpacity(0.03) + /// : isHighlighted + /// ? colorTheme.accentColor + /// : isCurrentDay + /// ? colorTheme.accentColor + /// .withOpacity(0.5) + /// : colorTheme.disabledColor + /// .withOpacity(0.05), + /// style: isDisabled + /// ? PaintingStyle.fill + /// : isHighlighted + /// ? PaintingStyle.stroke + /// : isCurrentDay + /// ? PaintingStyle.fill + /// : PaintingStyle.stroke, + /// strokeWidth: 1, + /// radius: childHeight / 2, + /// ), + /// child: daysText, + /// ) + /// //if button is Selected + /// : Align( + /// child: SizedBox( + /// height: childHeight, + /// width: childWidth, + /// child: TweenAnimationBuilder( + /// duration: const Duration(milliseconds: 200), + /// tween: DecorationTween( + /// begin: BoxDecoration( + /// color: colorTheme.accentColor, + /// shape: BoxShape.circle, + /// boxShadow: [ + /// BoxShadow( + /// blurRadius: 5, + /// color: colorTheme.accentColor + /// .withOpacity(0.6), + /// spreadRadius: 3, + /// ), + /// ]), + /// end: BoxDecoration( + /// color: colorTheme.accentColor, + /// shape: BoxShape.circle, + /// ), + /// ), + /// builder: (context, value, child) => + /// DecoratedBox( + /// decoration: value, + /// child: daysText, + /// ), + /// ), + /// ), + /// ), + /// //event button + /// if (hasEvent) + /// Align( + /// alignment: Alignment.bottomCenter, + /// child: CustomPaint( + /// painter: CirclePainter( + /// color: isDisabled + /// ? colorTheme.disabledColor.withOpacity(0.05) + /// : colorTheme.accentColor, + /// style: PaintingStyle.fill, + /// strokeWidth: 0, + /// radius: 3, + /// offset: const Offset(0, -4), + /// ), + /// ), + /// ), + /// ], + /// ); + /// }, + /// ``` + /// {@end-tool} + /// + final WidgetCbMonthButton? monthButtonBuilder; + + ///Build your own weeks + /// + ///* NOTE: COPY & PASTE + ///* ### Sample code + /// + /// ```dart + /// monthWeekBuilder: (index, weeks, weekHeight, weekWidth) { + /// return SizedBox( + /// height: weekHeight, + /// width: weekWidth, + /// child: Align( + /// child: Text( + /// weeks, + /// style: const TextStyle( + /// fontSize: 14, + /// color: Colors.grey, + /// fontWeight: FontWeight.w500, + /// ), + /// overflow: TextOverflow.ellipsis, + /// maxLines: 1, + /// ), + /// ), + /// ); + /// }, + + /// ``` + /// {@end-tool} + /// + final WidgetCbMonthWeek? monthWeekBuilder; + + ///Build your own month Headers + /// + ///* NOTE: COPY & PASTE + ///* ### Sample code + /// + /// ```dart + /// monthHeaderBuilder: + /// (month, headerHeight, headerWidth, paddingLeft) { + /// return SizedBox( + /// height: headerHeight, + /// width: headerWidth, + /// child: Padding( + /// padding: EdgeInsets.only(left: paddingLeft), + /// child: Align( + /// alignment: Alignment.centerLeft, + /// child: Text( + /// month, + /// style: const TextStyle( + /// fontSize: 22, + /// fontWeight: FontWeight.w600, + /// ), + /// ), + /// ), + /// ), + /// ); + /// }, + /// ``` + /// {@end-tool} + /// + final WeidgetCbMonthHeader? monthHeaderBuilder; +} + +///Customizer class for moth header +class MonthHeaderCustomizer { + ///height of year Header + final double height; + + ///width of year header + final double? width; + + ///padding o fHeader Text + final EdgeInsetsGeometry? padding; + + ///Text style of Header Text + final TextStyle? textStyle; + + ///insert All 12 Months + /// + ///* Example + ///```dart + ///[ + /// 'January', + /// 'February', + /// 'March', + /// 'April', + /// 'May', + /// 'June', + /// 'July', + /// 'August', + /// 'September', + /// 'October', + /// 'November', + /// 'December', + ///] + ///```` + /// {@end-tool} + /// + final List? monthList; + + /// + MonthHeaderCustomizer({ + this.height = 40, + this.width, + this.padding, + this.textStyle, + this.monthList, + }); +} + +///Month Weeek customiser +class MonthWeekCustomizer { + ///height of year Header + final double height; + + ///Text style of Header Text + final TextStyle? textStyle; + + ///insert All 7 weeks + /// + ///* Example + ///```dart + ///[ + /// 'SUN', + /// 'MON', + /// 'TUE', + /// 'WED', + /// 'THU', + /// 'FRI', + /// 'SAT', + ///] + ///```` + /// {@end-tool} + /// + final List? weekList; + + /// + MonthWeekCustomizer({ + this.height = 40, + this.textStyle, + this.weekList, + }); +} + +///OnDateSelected +class OnDateSelected { + ///Selected data on calendar + final DateTime selectedDate; + + ///return true if Selected date is equal + final bool isSelected; + + ///return true if Selected date is disabled + final bool isDisabled; + + ///return true if Selected date has event + final bool hasEvent; + + ///return true if Selected date is highlighted + final bool isHighlighted; + + ///return true if Selected date is current day + final bool isCurrentDate; + + /// constructor of OnDateSelected + OnDateSelected({ + required this.selectedDate, + required this.isSelected, + required this.isDisabled, + required this.hasEvent, + required this.isHighlighted, + required this.isCurrentDate, + }); +} diff --git a/siro_rider/packages/calendar_builder/lib/src/utils/date_utils_cb.dart b/siro_rider/packages/calendar_builder/lib/src/utils/date_utils_cb.dart new file mode 100644 index 0000000..edd3215 --- /dev/null +++ b/siro_rider/packages/calendar_builder/lib/src/utils/date_utils_cb.dart @@ -0,0 +1,293 @@ +///calendar week start from [monday,....,saturday,sunday] +enum WeekStartsFrom { + ///week starts from [monday] + monday, + + /// + tuesday, + + /// + + wednesday, + + /// + + thursday, + + /// + + friday, + + ///week starts from [saturday] + saturday, + + ///week starts from [sunday] + sunday, +} + +///contails all the logic of this calendar_builder package +class DateUtilsCB { + ///returns all dates from [startDate - endDate] in the form of List of DateTime + static List getDaysInBeteween({ + required DateTime startDate, + required DateTime endDate, + }) { + List days = []; + for (var i = 0; i <= (endDate.difference(startDate).inDays); i++) { + days.add( + DateTime( + startDate.year, + startDate.month, + // In Dart you can set more than. 30 days, DateTime will do the trick + startDate.day + i, + ), + ); + } + return days; + } + + ///this function return all the dates in a year from [startDate - endDate] + ///if `endDate = DateTime(2021,3,3)` this function will return dates till `endDate` as `DateTime(2022).subtract(Duration` + static List getAllDaysInBetweenYears({ + required DateTime startDate, + required DateTime endDate, + }) { + startDate = DateTime(startDate.year); + + endDate = DateTime(endDate.year + 1); + + List days = []; + for (var i = 0; i <= (endDate.difference(startDate).inDays) - 1; i++) { + days.add(DateTime( + startDate.year, + startDate.month, + // In Dart you can set more than. 30 days, DateTime will do the trick + startDate.day + i, + )); + } + return days; + } + + ///returns all Years from [startDate - endDate] in the form of List of DateTime + static List getYearsInBeteween({ + required DateTime startDate, + required DateTime endDate, + }) { + List years = []; + for (int i = startDate.year; i <= endDate.year; i++) { + years.add(DateTime(i)); + } + return years; + } + + ///Checking for [dateSelected] in [loopedDays] + ///if it contains the same date + ///then + ///it returns true + ///else + ///returns false + static bool checkDayisSelected({ + bool isDisabled = false, + required DateTime dateSelected, + required DateTime loopedDay, + }) { + if (!isDisabled) { + return dateSelected.year == loopedDay.year && + dateSelected.month == loopedDay.month && + dateSelected.day == loopedDay.day; + } else { + return false; + } + } + + ///check year is selected + static bool checkYearIsSelected({ + bool isDisabled = false, + required DateTime dateSelected, + required DateTime loopedDay, + }) { + if (!isDisabled) { + return dateSelected.year == loopedDay.year; + } else { + return false; + } + } + + ///Checking for [date] in [listOfDates] + ///if it contains the same date + ///then + ///it returns true + ///else + ///returns false + static bool checkDayisDisabled( + {required List listOfDates, required DateTime date}) { + return !listOfDates.any((element) => (element.year == date.year && + element.month == date.month && + element.day == date.day)); + } + + ///checking [listOfDates] has matching [date] in it + static bool checkListContainsDate( + {required List listOfDates, required DateTime date}) { + return listOfDates.any((element) => (element.year == date.year && + element.month == date.month && + element.day == date.day)); + } + + ///Checking for [date] in [listOfDates] + ///if it contains the same year + ///then + ///it returns false + ///else + ///returns true + static bool checkYearisDisabled( + {required List listOfDates, required DateTime date}) { + return !listOfDates.any((element) => (element.year == date.year)); + } + + ///!latest removed #1 + // ///This function will return all the DateTime in one year [yearDate] + // static List getAllDatesIn1Year( + // {required DateTime yearDate, required List allDates}) { + // List dates = + // allDates.where((element) => element.year == yearDate.year).toList(); + + // return dates; + // } + + ///If [selectedYear] is 2021 then this function will return all the dates of months in 2021 in the form of [List>>] + static List>> getAllMonthsIn1Year( + {required DateTime selectedYear}) { + ///returns all the dates in a year + ///!latest removed #1 + // List _listOfDatesInYear = getAllDatesIn1Year( + // yearDate: selectedYear, + // allDates: allDates, + // ); + ///!replaced + List _listOfDatesInYear = DateUtilsCB.getAllDaysInBetweenYears( + startDate: DateTime(selectedYear.year), + endDate: + DateTime(selectedYear.year + 1).subtract(const Duration(days: 1))); + + ///genrating Dates in each months as List + List _listOfJan = _listOfDatesInYear + .where((element) => element.month == DateTime.january) + .toList(); + List _listOfFeb = _listOfDatesInYear + .where((element) => element.month == DateTime.february) + .toList(); + List _listOfMarch = _listOfDatesInYear + .where((element) => element.month == DateTime.march) + .toList(); + List _listOfApril = _listOfDatesInYear + .where((element) => element.month == DateTime.april) + .toList(); + List _listOfMay = _listOfDatesInYear + .where((element) => element.month == DateTime.may) + .toList(); + List _listOfJune = _listOfDatesInYear + .where((element) => element.month == DateTime.june) + .toList(); + List _listOfJuly = _listOfDatesInYear + .where((element) => element.month == DateTime.july) + .toList(); + List _listOfAugust = _listOfDatesInYear + .where((element) => element.month == DateTime.august) + .toList(); + List _listOfSept = _listOfDatesInYear + .where((element) => element.month == DateTime.september) + .toList(); + List _listOfOct = _listOfDatesInYear + .where((element) => element.month == DateTime.october) + .toList(); + List _listOfNov = _listOfDatesInYear + .where((element) => element.month == DateTime.november) + .toList(); + List _listOfDec = _listOfDatesInYear + .where((element) => element.month == DateTime.december) + .toList(); + List>> _months = [ + {'Jan': _listOfJan}, + {'Feb': _listOfFeb}, + {'March': _listOfMarch}, + {'April': _listOfApril}, + {'May': _listOfMay}, + {'June': _listOfJune}, + {'July': _listOfJuly}, + {'August': _listOfAugust}, + {'Sept': _listOfSept}, + {'Oct': _listOfOct}, + {'Nov': _listOfNov}, + {'Dec': _listOfDec}, + ]; + return _months; + } + + ///This [getAll42DaysIn1Month] function will return all the 42 days in a m + static List getAll42DaysIn1Month({ + required List month, + WeekStartsFrom weekStartsFrom = WeekStartsFrom.sunday, + }) { + List aMonthDaysList = month; + DateTime firstDayOfaMonth = aMonthDaysList.first; + + ///For finding first Disabled Day + late DateTime firstDisableDay; + int weekSelectedIndex = (WeekStartsFrom.values.indexOf(weekStartsFrom) + 1); + firstDisableDay = firstDayOfaMonth.subtract( + ///Adding +7 to [firstDayOfaMonth.weekday] + ///to avoid -ve result + Duration(days: ((firstDayOfaMonth.weekday + 7) - weekSelectedIndex) % 7), + ); + + /* -----old----- + // if (weekStartsFrom == WeekStartsFrom.monday) { + // ///Starts week with [Monday] + // firstDisableDay = firstDayOfaMonth + // .subtract(Duration(days: firstDayOfaMonth.weekday - 1)); + // } else if (weekStartsFrom == WeekStartsFrom.sunday) { + // ///Starts week with [Sunday] + // if (firstDayOfaMonth.weekday == 7) { + // firstDisableDay = firstDayOfaMonth; + // } else { + // firstDisableDay = + // firstDayOfaMonth.subtract(Duration(days: firstDayOfaMonth.weekday)); + // } + // } else if (weekStartsFrom == WeekStartsFrom.saturday) { + // ///Starts week with [Saturday] + // if (firstDayOfaMonth.weekday == 6) { + // firstDisableDay = firstDayOfaMonth; + // } else if (firstDayOfaMonth.weekday == 7) { + // firstDisableDay = firstDayOfaMonth.subtract(const Duration(days: 1)); + // } else { + // firstDisableDay = firstDayOfaMonth + // .subtract(Duration(days: firstDayOfaMonth.weekday + 1)); + // } + // } + */ + + DateTime lastDayOfaMonth = aMonthDaysList.last; + + ///Algorithm to find Disabled Days + List firstDisabledToLastDayOfMonth = + getDaysInBeteween(startDate: firstDisableDay, endDate: lastDayOfaMonth); + int lastlength = firstDisabledToLastDayOfMonth.length; + int disabledDays = 42 - lastlength; + + ///not used + // while (lastlength % 7 != 0) { + // lastlength++; + // disabledDays++; + // } + + ///To find the last Disabled Days of the month + DateTime lastDisabledDay = + lastDayOfaMonth.add(Duration(days: disabledDays)); + + ///!geting all 42 days + List all42DaysOfMonth = + getDaysInBeteween(startDate: firstDisableDay, endDate: lastDisabledDay); + return all42DaysOfMonth; + } +} diff --git a/siro_rider/packages/calendar_builder/lib/src/utils/global.dart b/siro_rider/packages/calendar_builder/lib/src/utils/global.dart new file mode 100644 index 0000000..272d69b --- /dev/null +++ b/siro_rider/packages/calendar_builder/lib/src/utils/global.dart @@ -0,0 +1,104 @@ +import 'package:flutter/material.dart'; + +///A global theme classs for all colors [Theme] +class CalendarGlobals { + ///Minumum duration + static const kMinDuration = Duration(milliseconds: 400); + + ///maximum duration + static const kMaxDuration = Duration(milliseconds: 800); + + ///orange color + static const Color kOrange = Color(0xffFF5917); + + ///list of months + static const List months = [ + 'January', + 'February', + 'March', + 'April', + 'May', + 'June', + 'July', + 'August', + 'September', + 'October', + 'November', + 'December', + ]; + + ///list of Weeks + static const List> weeksStarter = [ + [ + 'MON', + 'TUE', + 'WED', + 'THU', + 'FRI', + 'SAT', + 'SUN', + ], + [ + 'TUE', + 'WED', + 'THU', + 'FRI', + 'SAT', + 'SUN', + 'MON', + ], + [ + 'WED', + 'THU', + 'FRI', + 'SAT', + 'SUN', + 'MON', + 'TUE', + ], + [ + 'THU', + 'FRI', + 'SAT', + 'SUN', + 'MON', + 'TUE', + 'WED', + ], + [ + 'FRI', + 'SAT', + 'SUN', + 'MON', + 'TUE', + 'WED', + 'THU', + ], + [ + 'SAT', + 'SUN', + 'MON', + 'TUE', + 'WED', + 'THU', + 'FRI', + ], + [ + 'SUN', + 'MON', + 'TUE', + 'WED', + 'THU', + 'FRI', + 'SAT', + ], + ]; + + ///Enable or disable dev logs + static bool showLogs = false; + + ///Enable or disable dev logs + static void debugLogs(Object _log) { + if (showLogs) debugPrint(_log.toString()); + } +} diff --git a/siro_rider/packages/calendar_builder/lib/src/utils/widgets.dart b/siro_rider/packages/calendar_builder/lib/src/utils/widgets.dart new file mode 100644 index 0000000..0afc9da --- /dev/null +++ b/siro_rider/packages/calendar_builder/lib/src/utils/widgets.dart @@ -0,0 +1,115 @@ +import 'package:flutter/material.dart'; + +///easy Mod of [OutlinedButton] +class ModOutlineButton extends StatelessWidget { + ///easy Mod of [OutlinedButton] + const ModOutlineButton({ + Key? key, + required this.height, + required this.width, + this.onPressed, + this.shape, + this.borderSide, + required this.child, + this.overlayColor, + }) : super(key: key); + + ///Height of button + final double height; + + ///Width of button + final double width; + + ///Callback on button pressed + final VoidCallback? onPressed; + + /// Shape of button + final OutlinedBorder? shape; + + /// set border forbutton + final BorderSide? borderSide; + + /// add Child widget + final Widget child; + + /// Overlay color of button + final Color? overlayColor; + + OutlinedBorder _handelButtonShape(Set state) { + return shape ?? const StadiumBorder(); + } + + BorderSide _handelBorderSide(Set state) { + return borderSide ?? + BorderSide( + color: Colors.grey[300]!, + ); + } + + @override + Widget build(BuildContext context) { + return SizedBox( + height: height, + width: width, + child: FittedBox( + fit: BoxFit.scaleDown, + child: OutlinedButton( + onPressed: onPressed, + style: ButtonStyle( + shape: MaterialStateProperty.resolveWith(_handelButtonShape), + overlayColor: MaterialStateProperty.all( + overlayColor ?? Colors.blue[100]!), + side: MaterialStateProperty.resolveWith(_handelBorderSide), + ), + child: child, + ), + ), + ); + } +} + +///for faster performance +///we can add +///-- borders +///-- colors +class CirclePainter extends CustomPainter { + /// + CirclePainter({ + required this.color, + required this.style, + required this.strokeWidth, + required this.radius, + this.offset, + }); + + ///add color + final Color color; + + ///Painting style + final PaintingStyle style; + + ///border width + final double strokeWidth; + + ///radius of the circle + final double radius; + + ///offset + final Offset? offset; + + @override + void paint(Canvas canvas, Size size) { + final _paint = Paint() + ..strokeWidth = strokeWidth + ..color = color + ..style = style; + + canvas.drawCircle( + offset ?? Offset((size.width / 2), (size.height / 2)), radius, _paint); + } + + @override + bool shouldRepaint(covariant CustomPainter oldDelegate) { + return false; + } +} diff --git a/siro_rider/packages/calendar_builder/lib/src/views/month_builder.dart b/siro_rider/packages/calendar_builder/lib/src/views/month_builder.dart new file mode 100644 index 0000000..aadd19c --- /dev/null +++ b/siro_rider/packages/calendar_builder/lib/src/views/month_builder.dart @@ -0,0 +1,1063 @@ +// import 'dart:io'; + +import 'dart:math'; + +import 'package:flutter/foundation.dart'; +import 'package:flutter/material.dart'; +import 'package:get/get.dart'; + +import '../../calendar_builder.dart'; +import '../controllers/cb_controller.dart'; +import '../controllers/month_builder_controller.dart'; +import '../controllers/month_ui_controller.dart'; +import 'year_drop_down.dart'; + +///Month Builder +class CbMonthBuilder extends StatefulWidget { + ///constructor of month builder + const CbMonthBuilder({ + Key? key, + this.matchId, + this.height, + this.width, + this.yearDropDownCustomizer, + this.monthCustomizer, + this.cbConfig, + this.onYearHeaderExpanded, + this.onYearButtonClicked, + this.onDateClicked, + }) : super(key: key); + + ///* -- + ///*#### NOTE: if you are changing matchId then, PLEASE DOO HOT RESTART + /// if u want to use same data between your [ Calendar Builder ] -- make sure to give same [matchId] + final String? matchId; + + /// Height of [CbMonthBuilder] + /// Default height = MediaQuery.of(context).size.heigth + final double? height; + + /// Width of [CbMonthBuilder] + ///Default width = MediaQuery.of(context).size.width + final double? width; + + ///Customize Year Drop down + final YearDropDownCustomizer? yearDropDownCustomizer; + + ///Customise your month + final MonthCustomizer? monthCustomizer; + + ///Configure all the datas like + /// + /// + ///-- `startDate,` + /// + ///--- `endDate,` + /// + ///--- `currentDay,` + /// + ///--- `selectedDate,` + /// + ///--- `selectedYear,` + /// + ///--- `eventDates,` + /// + ///--- `disabledDates,` + /// + ///--- `highlightedDates,` + /// + ///--- `weekStartsFrom` + /// + final CbConfig? cbConfig; + + /// + ///callback when year header is expanded + /// + ///* ### Sample code + /// + ///```dart + /// onYearHeaderExpanded: (isExpanded) {}, + ///``` + ///{@end-tool} + final void Function(bool isExpanded)? onYearHeaderExpanded; + + /// callback when year button is clicked + /// + ///* ### Sample code + /// + ///```dart + /// onYearHeaderExpanded: (isExpanded) {}, + ///``` + ///{@end-tool} + final void Function(DateTime selectedYear, bool isSelected)? + onYearButtonClicked; + + /// callback when date button is clicked + /// + ///* ### Sample code + /// + ///```dart + /// onDateClicked: (onDateClicked) {}, + ///``` + ///{@end-tool} + final void Function(OnDateSelected onDateSelected)? onDateClicked; + + @override + _CbMonthBuilderState createState() => _CbMonthBuilderState(); +} + +class _CbMonthBuilderState extends State { + ///Tags of GetxControllers + ///Data Tag + late String matchingId; + + ///Matching Isd for `CbConfig` + late String cbMatchingId; + + ///Ui Tag + late String uiStateTag; + + @override + void initState() { + super.initState(); + Get.config(enableLog: CalendarGlobals.showLogs); + initControlers(); + } + + @override + void dispose() { + super.dispose(); + Get.delete(tag: uiStateTag); + Get.delete(tag: matchingId); + if (!Get.isRegistered(tag: cbMatchingId)) { + Get.delete( + tag: cbMatchingId, + ); + } + } + + void initControlers() { + ///* NOTE + ///`widget.matchId` concept used only to motch data b/w [CbController()] and `config` + uiStateTag = UniqueKey().toString(); + Get.put(MonthUiController(), tag: uiStateTag); + matchingId = UniqueKey().toString(); + Get.put(MonthBuilderController(), tag: matchingId); + cbMatchingId = widget.matchId ?? UniqueKey().toString(); + Get.put( + CbController(), + tag: cbMatchingId, + ); + expandeYearInitially(); + configDatas(matchingId); + addToUiCtr(); + } + + void addToUiCtr() { + final mUiCtr = Get.find(tag: uiStateTag); + mUiCtr.onDateClicked = widget.onDateClicked; + mUiCtr.onYearButtonClicked = widget.onYearButtonClicked; + mUiCtr.onYearHeaderExpanded = widget.onYearHeaderExpanded; + } + + void configDatas(String matchingId, {bool useOnHotReload = false}) { + final cbCtr = Get.find(tag: cbMatchingId); + final mCtr = Get.find(tag: matchingId); + + if (widget.cbConfig != null) { + cbCtr.changeConfig(widget.cbConfig!); + } + + /// + mCtr.config(config: cbCtr.cbConfig, useOnHotReload: useOnHotReload); + } + + void expandeYearInitially() { + final mUiCtr = Get.find(tag: uiStateTag); + + mUiCtr.expandInitiaally( + widget.yearDropDownCustomizer?.expandYearInitially ?? false); + } + + @override + void didUpdateWidget(covariant CbMonthBuilder oldWidget) { + super.didUpdateWidget(oldWidget); + final mCtr = Get.find(tag: matchingId); + + if (oldWidget.yearDropDownCustomizer?.expandYearInitially != + widget.yearDropDownCustomizer?.expandYearInitially) { + expandeYearInitially(); + } + + /// + if (oldWidget.cbConfig?.selectedDate != widget.cbConfig?.selectedDate) { + DateTime oldDate = oldWidget.cbConfig?.selectedDate ?? DateTime.now(); + DateTime newDate = widget.cbConfig?.selectedDate ?? DateTime.now(); + mCtr.changeSelectedDate( + selectedDate: newDate, + oldSelectedDate: DateTime(oldDate.year, oldDate.month, oldDate.day), + updateByID: true, + updateId: 'dateChangeId', + commonUpdateId: 'commonId'); + } + if (oldWidget.cbConfig?.selectedYear != widget.cbConfig?.selectedYear) { + DateTime oldDate = + oldWidget.cbConfig?.selectedYear ?? DateTime(DateTime.now().year); + DateTime newDate = + widget.cbConfig?.selectedYear ?? DateTime(DateTime.now().year); + changeYear(oldDate: oldDate, newDate: newDate); + } + if (oldWidget.cbConfig != widget.cbConfig) { + configDatas(matchingId, useOnHotReload: true); + } + addToUiCtr(); + + /// + } + + void changeYear({required DateTime oldDate, required DateTime newDate}) { + final mUiCtr = Get.find(tag: uiStateTag); + final mCtr = Get.find(tag: matchingId); + + ///Changes selected date + mCtr.changeSelectedYear( + selectedYear: newDate, + oldSelectedYear: DateTime(oldDate.year, oldDate.month, oldDate.day), + updateByID: true, + updateId: 'dateChangeId', + commonUpdateId: 'commonId'); + + ///isExpanded + Future.delayed(const Duration(milliseconds: 200)).then((value) { + mUiCtr.chageYearExpanded( + isExpanded: false, + updateId: 'monthExpanded', + commonUpdateId: 'commonId'); + }); + + ///changes the page of month pageView + int _mPage = + mCtr.mAllYears.indexWhere((element) => element.year == newDate.year); + mUiCtr.mPageController.jumpToPage(_mPage); + + ///saves and removes months if length exedes 3 + mCtr.addToSavedMonthDates( + DateTime(newDate.year, newDate.month, newDate.day)); + mCtr.savedMonthRemover(DateTime(newDate.year, newDate.month, newDate.day)); + } + + @override + Widget build(BuildContext context) { + final size = MediaQuery.of(context).size; + double cbMonthHeight = widget.height ?? + (size.height - + MediaQuery.of(context).viewPadding.bottom - + MediaQuery.of(context).viewPadding.top); + double cbMonthWidth = widget.width ?? size.width; + + return SafeArea( + child: SizedBox( + height: cbMonthHeight, + width: cbMonthWidth, + child: Column(children: [ + CbYearDropDown( + matchId: matchingId, + uiStateTag: uiStateTag, + expandedYearHeight: + widget.yearDropDownCustomizer?.expandedYearHeight ?? 200, + expandedYearWidth: widget.yearDropDownCustomizer?.expandedYearWidth, + yearButtonBuilder: widget.yearDropDownCustomizer?.yearButtonBuilder, + yearButtonCustomizer: + widget.yearDropDownCustomizer?.yearButtonCustomizer, + yearHeaderBuilder: widget.yearDropDownCustomizer?.yearHeaderBuilder, + yearHeaderCustomizer: + widget.yearDropDownCustomizer?.yearHeaderCustomizer, + ), + const Divider( + endIndent: 0, + indent: 0, + height: 0, + thickness: 1, + ), + Expanded( + child: _MonthView( + matchingId: matchingId, + cbMonthHeight: cbMonthHeight, + yearDropDownCustomizer: widget.yearDropDownCustomizer, + uiStateTag: uiStateTag, + monthCustomizer: widget.monthCustomizer, + ), + ), + ]), + ), + ); + } +} + +class _MonthView extends StatefulWidget { + const _MonthView({ + Key? key, + required this.matchingId, + required this.cbMonthHeight, + this.yearDropDownCustomizer, + this.monthCustomizer, + required this.uiStateTag, + }) : super(key: key); + + final String matchingId; + final double cbMonthHeight; + final YearDropDownCustomizer? yearDropDownCustomizer; + final MonthCustomizer? monthCustomizer; + final String uiStateTag; + + @override + __MonthViewState createState() => __MonthViewState(); +} + +class __MonthViewState extends State<_MonthView> { + @override + void initState() { + super.initState(); + pageInitialise(); + } + + void pageInitialise() { + final mUiCtr = Get.find(tag: widget.uiStateTag); + final mCtr = Get.find(tag: widget.matchingId); + int _initialPage = mCtr.mAllYears + .indexWhere((element) => element.year == mCtr.mSelectedYear.year); + mUiCtr.mPageController = + PageController(initialPage: _initialPage, keepPage: true); + mCtr.addToSavedMonthDates(DateTime(mCtr.mSelectedYear.year, + mCtr.mSelectedYear.month, mCtr.mSelectedYear.day)); + // thisSelectedYear = DateTime(mCtr.mSelectedYear.year, + // mCtr.mSelectedYear.month, mCtr.mSelectedYear.day); + } + + @override + void didUpdateWidget(covariant _MonthView oldWidget) { + super.didUpdateWidget(oldWidget); + if (oldWidget.matchingId != widget.matchingId) { + pageInitialise(); + } + } + + @override + Widget build(BuildContext context) { + final mCtr = Get.find(tag: widget.matchingId); + final mUiCtr = Get.find(tag: widget.uiStateTag); + // height: widget.cbMonthHeight - + // ((widget.yearDropDownCustomizer?.yearHeaderCustomizer?.height ?? + // 40)) + return PageView.builder( + itemCount: mCtr.mAllYears.length, + controller: mUiCtr.mPageController, + physics: const NeverScrollableScrollPhysics(), + scrollDirection: Axis.vertical, + itemBuilder: (context, index) { + DateTime thisSelectedYear = mCtr.mAllYears.elementAt(index); + Widget _monthGrid() { + return _MonthGrid( + matchingId: widget.matchingId, + uiStateTag: widget.uiStateTag, + monthCustomizer: widget.monthCustomizer, + thisSelectedYear: thisSelectedYear, + ); + } + + CalendarGlobals.debugLogs('page: $index'); + return GetBuilder( + id: 'removedDate:$thisSelectedYear!', + tag: widget.matchingId, + builder: (mCtr) { + CalendarGlobals.debugLogs(thisSelectedYear); + return mCtr.removedDate == thisSelectedYear + ? const SizedBox() + : _monthGrid(); + }); + }, + ); + } +} + +class _MonthGrid extends StatefulWidget { + const _MonthGrid({ + Key? key, + required this.matchingId, + required this.uiStateTag, + required this.thisSelectedYear, + this.monthCustomizer, + }) : super(key: key); + final String matchingId; + final String uiStateTag; + final MonthCustomizer? monthCustomizer; + final DateTime thisSelectedYear; + @override + __MonthGridState createState() => __MonthGridState(); +} + +class __MonthGridState extends State<_MonthGrid> { + late final ScrollController _scrollController; + late final double _initialSrollOffset; + @override + void initState() { + super.initState(); + monthScrollConfig(); + } + + void monthScrollConfig() { + final bool scrollToSelectedMonth = + widget.monthCustomizer?.scrollToSelectedMonth ?? false; + final mCtr = Get.find(tag: widget.matchingId); + + ///initially scroll to the perticular selected month if [scrollToSelectedMonth = true] + if (mCtr.mSelectedDate.year != widget.thisSelectedYear.year || + !scrollToSelectedMonth) { + _initialSrollOffset = 0; + } else { + _initialSrollOffset = ((widget.monthCustomizer?.montMinhHeight ?? 300) + + (widget.monthCustomizer?.monthHeaderCustomizer?.height ?? 40) + + (widget.monthCustomizer?.monthWeekCustomizer?.height ?? 40)) * + (mCtr.mSelectedDate.month - 1); + } + _scrollController = ScrollController( + initialScrollOffset: _initialSrollOffset, keepScrollOffset: false); + } + + @override + Widget build(BuildContext context) { + return NotificationListener( + onNotification: (notification) { + if (widget.monthCustomizer?.shrinkYearDropDownOnScroll ?? true) { + ///used to check whether the scroll is started or not + if (notification is ScrollStartNotification) { + ///if scrolling is started the [cbYearDropDown] expand = false + final mUiCtr = + Get.find(tag: widget.uiStateTag); + mUiCtr.chageYearExpanded( + isExpanded: false, + updateId: 'monthExpanded', + commonUpdateId: 'commonId', + ); + } + } + + return true; + }, + child: GridView.builder( + // gridDelegate: const SliverGridDelegateWithFixedCrossAxisCount( + // crossAxisCount: 1, mainAxisExtent: 340), + controller: _scrollController, + gridDelegate: SliverGridDelegateWithMaxCrossAxisExtent( + maxCrossAxisExtent: widget.monthCustomizer?.monthMinWidth ?? + maxCrossAxisExtentCounter(context), + mainAxisExtent: ((widget.monthCustomizer?.montMinhHeight ?? 300) + + (widget.monthCustomizer?.monthHeaderCustomizer?.height ?? 40) + + (widget.monthCustomizer?.monthWeekCustomizer?.height ?? 40)), + crossAxisSpacing: widget.monthCustomizer?.crossAxisSpacing ?? 20, + mainAxisSpacing: widget.monthCustomizer?.mainAxisSpacing ?? 20, + ), + padding: widget.monthCustomizer?.padding ?? EdgeInsets.zero, + shrinkWrap: true, + itemCount: 12, + itemBuilder: (context, index) { + CalendarGlobals.debugLogs('month $index'); + // return Text('data'); + return SingleMonthView( + matchId: widget.matchingId, + uiStateTag: widget.uiStateTag, + monthIndex: index, + monthCustomizer: widget.monthCustomizer, + thisSelectedYear: widget.thisSelectedYear, + ); + }, + )); + } + + ///responsive month grid + double maxCrossAxisExtentCounter(BuildContext context) { + final mq = MediaQuery.of(context); + final size = mq.size; + if (kIsWeb) { + return 700; + } + if (mq.orientation == Orientation.portrait && + (Theme.of(context).platform == TargetPlatform.android || + Theme.of(context).platform == TargetPlatform.iOS)) { + return size.width; + } else if (mq.orientation == Orientation.landscape && + (Theme.of(context).platform == TargetPlatform.android || + Theme.of(context).platform == TargetPlatform.iOS)) { + return size.width / 2; + } + return 700; + } +} + +///This widget contains the design and logics of single month +class SingleMonthView extends StatelessWidget { + /// + const SingleMonthView({ + Key? key, + required this.matchId, + required this.uiStateTag, + required this.monthIndex, + this.monthCustomizer, + required this.thisSelectedYear, + }) : super(key: key); + + ///Tags of GetxControllers + ///Data Tag + final String matchId; + + ///ui tag + final String uiStateTag; + + ///index of month 0-12 + final int monthIndex; + + ///Month Customizer + final MonthCustomizer? monthCustomizer; + + ///selected year of this page + final DateTime thisSelectedYear; + + @override + Widget build(BuildContext context) { + final size = MediaQuery.of(context).size; + final mCtr = Get.find(tag: matchId); + + double monthWidth = size.width; + double monthHeight = monthCustomizer?.montMinhHeight ?? 300; + double buttonHeight = monthHeight / 6; + late double buttonWidth; + double buttonChildHeight = + monthCustomizer?.monthButtonCustomizer?.height ?? (buttonHeight / 1.5); + double buttonChildWidth = + monthCustomizer?.monthButtonCustomizer?.width ?? buttonHeight / 1.5; + + late double paddingLeft; + double weekHeight = monthCustomizer?.monthWeekCustomizer?.height ?? 40; + + ///default = [WeekStartsFrom.sunday] + int weekSelectedIndex = + (WeekStartsFrom.values.indexOf(mCtr.mWeekStartsFrom)); + + // List weeks = + // monthCustomizer?.weekStartsFrom == WeekStartsFrom.monday + // ? Global.weeksStartsMonday + // : monthCustomizer?.weekStartsFrom == WeekStartsFrom.saturday + // ? Global.weeksStartsSaturday + // : Global.weeksStartsSunday; + + double headerHeight = monthCustomizer?.monthHeaderCustomizer?.height ?? 40; + double headerWidth = + monthCustomizer?.monthHeaderCustomizer?.width ?? size.width; + final EdgeInsetsGeometry? padding = + monthCustomizer?.monthHeaderCustomizer?.padding; + final TextStyle? textStyleHeader = + monthCustomizer?.monthHeaderCustomizer?.textStyle; + final TextStyle? textStyleWeeek = + monthCustomizer?.monthWeekCustomizer?.textStyle; + + return Column( + children: [ + LayoutBuilder( + builder: (context, constraints) { + ///[max()] is used to make -negetive values to zero + ///[max()] imported from ['dart:math']; + paddingLeft = max( + 0, (((constraints.maxWidth / 7) / 2) - (buttonChildWidth / 2))); + final List? userMonths = + monthCustomizer?.monthHeaderCustomizer?.monthList; + if (userMonths != null) { + assert(!(userMonths.length < 12), + '\n\nERROR ( Calendar Builder ):\n---------\nInside MonthHeaderCustomizer()\nmonthList length Should be equal to 12\n---------\n_'); + } + + var ifHeaderBuilderEmpty = SizedBox( + height: headerHeight, + width: headerWidth, + child: Padding( + padding: padding ?? EdgeInsets.only(left: paddingLeft), + child: Align( + alignment: Alignment.centerLeft, + child: Text( + userMonths?[monthIndex] ?? + CalendarGlobals.months[monthIndex], + style: textStyleHeader ?? + const TextStyle( + fontSize: 22, fontWeight: FontWeight.w600), + ), + ), + ), + ); + return monthCustomizer?.monthHeaderBuilder == null + ? ifHeaderBuilderEmpty + : monthCustomizer!.monthHeaderBuilder!( + CalendarGlobals.months[monthIndex], + headerHeight, + headerWidth, + paddingLeft, + ); + }, + ), + LayoutBuilder( + builder: (context, constraints) { + buttonWidth = constraints.maxWidth / 7; + return Row( + children: List.generate(7, (weekIndex) { + List? userWeek = + monthCustomizer?.monthWeekCustomizer?.weekList; + if (userWeek != null) { + assert(!(userWeek.length < 7), + '\n\nERROR ( Calendar Builder ):\n---------\nInside MonthWeekCustomizer()\nWeekList length Should be equal to 7\n---------\n_'); + } + + ///if empty + var ifWeekBuilderEmpty = SizedBox( + height: weekHeight, + width: buttonWidth, + child: Align( + child: Text( + userWeek?[weekIndex] ?? + CalendarGlobals.weeksStarter[weekSelectedIndex] + [weekIndex], + style: textStyleWeeek ?? + const TextStyle( + fontSize: 14, + color: Colors.grey, + fontWeight: FontWeight.w500), + overflow: TextOverflow.ellipsis, + maxLines: 1, + ), + ), + ); + return monthCustomizer?.monthWeekBuilder == null + ? ifWeekBuilderEmpty + : monthCustomizer!.monthWeekBuilder!( + weekIndex, + CalendarGlobals.weeksStarter[weekSelectedIndex] + [weekIndex], + weekHeight, + buttonWidth, + ); + })); + }, + ), + SizedBox( + height: monthHeight, + width: monthWidth, + child: _MonthButtonGrid( + matchId: matchId, + uiStateTag: uiStateTag, + monthHeight: monthHeight, + monthWidth: monthWidth, + monthIndex: monthIndex, + buttonChildWidth: buttonChildWidth, + buttonChildHeight: buttonChildHeight, + monthCustomizer: monthCustomizer, + thisSelectedYear: thisSelectedYear, + ), + ), + ], + ); + } +} + +class _MonthButtonGrid extends StatefulWidget { + const _MonthButtonGrid({ + Key? key, + required this.matchId, + required this.monthHeight, + required this.uiStateTag, + required this.monthWidth, + required this.buttonChildHeight, + required this.buttonChildWidth, + required this.thisSelectedYear, + this.monthCustomizer, + required this.monthIndex, + }) : super(key: key); + final String matchId; + final double monthHeight; + final String uiStateTag; + final double monthWidth; + final double buttonChildHeight; + final double buttonChildWidth; + final DateTime thisSelectedYear; + + ///Month Customizer + final MonthCustomizer? monthCustomizer; + + ///index of month 0-12 + final int monthIndex; + + @override + __MonthButtonGridState createState() => __MonthButtonGridState(); +} + +class __MonthButtonGridState extends State<_MonthButtonGrid> + with AutomaticKeepAliveClientMixin { + ///logic for all 42 days in month + ///including previous & after month disabled month dates + late List mAll42DaysInMonth; + + ///contains only the exact same months + late List mCorrectMonths; + + ///Check for Disabled Days in Month + bool checkDayIsDisabled = false; + + ///Check for Selected Days in Month + bool checkDayIsSelected = false; + + ///Check for Highlighted Days in Month + bool checkHighlightedDates = false; + + ///Check is this is current day in Month + bool checkCurrentDay = false; + + ///check for events + late bool checkHasEvent; + + @override + void initState() { + super.initState(); + _initMonthLogic(); + } + + void _initMonthLogic() { + final mCtr = Get.find(tag: widget.matchId); + build42Days(weekStartsFrom: mCtr.mWeekStartsFrom); + mCorrectMonths = DateUtilsCB.getAllMonthsIn1Year( + selectedYear: widget.thisSelectedYear, + + ///!latest removed #1 + // allDates: mCtr.mAllDates, + )[widget.monthIndex] + .values + .first; + } + + void build42Days({WeekStartsFrom? weekStartsFrom}) { + mAll42DaysInMonth = DateUtilsCB.getAll42DaysIn1Month( + weekStartsFrom: weekStartsFrom ?? WeekStartsFrom.sunday, + month: DateUtilsCB.getAllMonthsIn1Year( + selectedYear: widget.thisSelectedYear, + + ///!latest removed #1 + // allDates: mCtr.mAllDates, + )[widget.monthIndex] + .values + .first, + ); + } + + @override + void didUpdateWidget(covariant _MonthButtonGrid oldWidget) { + super.didUpdateWidget(oldWidget); + final mCtr = Get.find(tag: widget.matchId); + _initMonthLogic(); + + if (widget.monthCustomizer != oldWidget.monthCustomizer) { + build42Days(weekStartsFrom: mCtr.mWeekStartsFrom); + } + } + + @override + Widget build(BuildContext context) { + super.build(context); + return GridView.builder( + physics: const NeverScrollableScrollPhysics(), + gridDelegate: SliverGridDelegateWithFixedCrossAxisCount( + ///height of 1 button in grid + mainAxisExtent: widget.monthHeight / 6, + crossAxisCount: 7, + ), + itemCount: mAll42DaysInMonth.length, + padding: EdgeInsets.zero, + itemBuilder: (context, index) { + return GetBuilder( + id: mAll42DaysInMonth[index], + tag: widget.matchId, + builder: (mCtr) { + // Global.debugLogs('grid Btn $index month${widget.monthIndex}'); + _checkingMonthDays( + index: index, selectedDate: mCtr.mSelectedDate); + var _monthButtons = _MonthButtons( + mAll42DaysInMonth: mAll42DaysInMonth, + index: index, + isDisabled: checkDayIsDisabled, + isSelected: checkDayIsSelected, + isCurrentDay: checkCurrentDay, + hasEvent: checkHasEvent, + buttonChildHeight: widget.buttonChildHeight, + buttonChildWidth: widget.buttonChildWidth, + monthCustomizer: widget.monthCustomizer, + isHighlighted: checkHighlightedDates, + ); + return checkDayIsDisabled + ? GestureDetector( + onTap: () { + _checkingMonthDays( + index: index, selectedDate: mCtr.mSelectedDate); + + final mUiCtr = + Get.find(tag: widget.uiStateTag); + mUiCtr.onDateClicked?.call( + OnDateSelected( + selectedDate: mAll42DaysInMonth[index], + isSelected: checkDayIsSelected, + isDisabled: checkDayIsDisabled, + hasEvent: checkHasEvent, + isHighlighted: checkHighlightedDates, + isCurrentDate: checkCurrentDay, + ), + ); + }, + child: _monthButtons) + : GestureDetector( + onTap: () { + _checkingMonthDays( + index: index, selectedDate: mCtr.mSelectedDate); + + final mUiCtr = + Get.find(tag: widget.uiStateTag); + mUiCtr.onDateClicked?.call( + OnDateSelected( + selectedDate: mAll42DaysInMonth[index], + isSelected: checkDayIsSelected, + isDisabled: checkDayIsDisabled, + hasEvent: checkHasEvent, + isHighlighted: checkHighlightedDates, + isCurrentDate: checkCurrentDay, + ), + ); + + ///execute functions + mCtr.changeSelectedDate( + selectedDate: mAll42DaysInMonth[index], + oldSelectedDate: DateTime( + mCtr.mSelectedDate.year, + mCtr.mSelectedDate.month, + mCtr.mSelectedDate.day), + updateByID: true, + updateId: 'dateChangeId', + commonUpdateId: 'commonId'); + // custom onPressed + if (widget.monthCustomizer?.monthButtonCustomizer + ?.onPressed != + null) { + widget.monthCustomizer?.monthButtonCustomizer + ?.onPressed!(mAll42DaysInMonth[index]); + } + }, + behavior: HitTestBehavior.opaque, + //Parent Container + child: _monthButtons); + }); + }, + ); + } + + void _checkingMonthDays( + {required int index, required DateTime selectedDate}) { + final mCtr = Get.find(tag: widget.matchId); + + ///Check for Disabled Days + ///In month + checkDayIsDisabled = DateUtilsCB.checkDayisDisabled( + listOfDates: mCorrectMonths, date: mAll42DaysInMonth[index]); + + ///Check for Disabled days + ///i.e after [mStartDate] + if (!checkDayIsDisabled) { + ///ignores if [mStartDate] is = to [mAll42DaysInMonth[index]] + if (!DateUtilsCB.checkDayisSelected( + dateSelected: mAll42DaysInMonth[index], loopedDay: mCtr.mStartDate)) { + checkDayIsDisabled = mAll42DaysInMonth[index].isBefore(mCtr.mStartDate); + } + } + + ///Check for Disabled days + ///i.e after [mEndDate] + if (!checkDayIsDisabled) { + checkDayIsDisabled = mAll42DaysInMonth[index].isAfter(mCtr.mEndDate); + } + + ///checking if user disabled any dates + if (!checkDayIsDisabled) { + checkDayIsDisabled = DateUtilsCB.checkListContainsDate( + listOfDates: mCtr.mDisabledDates, date: mAll42DaysInMonth[index]); + } + + ///checking for Selected days + checkDayIsSelected = DateUtilsCB.checkDayisSelected( + dateSelected: selectedDate, loopedDay: mAll42DaysInMonth[index]); + + if (!checkDayIsSelected && !checkDayIsDisabled) { + checkHighlightedDates = DateUtilsCB.checkListContainsDate( + listOfDates: mCtr.mHighlightedDates, date: mAll42DaysInMonth[index]); + if (!checkHighlightedDates) { + checkCurrentDay = DateUtilsCB.checkDayisSelected( + dateSelected: mCtr.mCurrentDay, + loopedDay: mAll42DaysInMonth[index]); + } + } + + ///checking for events + checkHasEvent = DateUtilsCB.checkListContainsDate( + listOfDates: mCtr.mEventDates + .where((element) => + element.year == mAll42DaysInMonth[index].year && + element.month == mAll42DaysInMonth[index].month) + .toList(), + date: mAll42DaysInMonth[index]); + } + + @override + bool get wantKeepAlive => true; +} + +class _MonthButtons extends StatelessWidget { + const _MonthButtons({ + Key? key, + required this.mAll42DaysInMonth, + required this.index, + required this.isDisabled, + required this.isSelected, + required this.isHighlighted, + required this.isCurrentDay, + required this.buttonChildHeight, + required this.buttonChildWidth, + required this.hasEvent, + this.monthCustomizer, + }) : super(key: key); + + final List mAll42DaysInMonth; + final int index; + final bool isDisabled; + final bool isSelected; + final bool hasEvent; + final bool isHighlighted; + final bool isCurrentDay; + final double buttonChildHeight; + final double buttonChildWidth; + final MonthCustomizer? monthCustomizer; + + @override + Widget build(BuildContext context) { + final txtTheme = Theme.of(context).textTheme; + final MonthButtonCustomizer? _mBtn = monthCustomizer?.monthButtonCustomizer; + final colorTheme = Theme.of(context); + + var daysText = Align( + child: Text( + '${mAll42DaysInMonth[index].day}', + style: isDisabled + ? _mBtn?.textStyleOnDisabled ?? txtTheme.titleMedium + : isSelected + ? _mBtn?.textStyleOnSelected ?? + txtTheme.bodyLarge!.copyWith( + fontWeight: FontWeight.bold, + color: colorTheme.brightness == Brightness.dark + ? Colors.black + : Colors.white) + : isHighlighted + ? _mBtn?.highlightedTextStyle ?? txtTheme.bodyLarge + : isCurrentDay + ? _mBtn?.currentDayTextStyle ?? txtTheme.bodyLarge + : _mBtn?.textStyleOnEnabled ?? txtTheme.bodyLarge, + )); + var ifBuilderIsEmpty = Stack( + alignment: Alignment.center, + children: [ + isDisabled || !isSelected + ? CustomPaint( + size: Size(buttonChildHeight, buttonChildWidth), + painter: CirclePainter( + color: isDisabled + ? _mBtn?.colorOnDisabled ?? + colorTheme.disabledColor.withOpacity(0.03) + : isHighlighted + ? _mBtn?.highlightedColor ?? + colorTheme.colorScheme.secondary + : isCurrentDay + ? _mBtn?.currentDayColor ?? + colorTheme.colorScheme.secondary + .withOpacity(0.5) + : _mBtn?.borderColorOnEnabled ?? + colorTheme.disabledColor.withOpacity(0.05), + style: isDisabled + ? _mBtn?.paintStyleOnDisabled ?? PaintingStyle.fill + : isHighlighted + ? _mBtn?.highlightedPaintingStyle ?? + PaintingStyle.stroke + : isCurrentDay + ? _mBtn?.currentDayPaintingStyle ?? + PaintingStyle.fill + : _mBtn?.paintStyleOnEnabled ?? + PaintingStyle.stroke, + strokeWidth: _mBtn?.borderStrokeWidth ?? 1, + radius: buttonChildHeight / 2), + child: daysText) + : SizedBox( + height: buttonChildHeight, + width: buttonChildWidth, + child: TweenAnimationBuilder( + duration: const Duration(milliseconds: 200), + tween: DecorationTween( + begin: BoxDecoration( + color: _mBtn?.colorOnSelected ?? + colorTheme.colorScheme.secondary, + shape: BoxShape.circle, + boxShadow: [ + BoxShadow( + blurRadius: 5, + color: + _mBtn?.colorOnSelected?.withOpacity(0.6) ?? + colorTheme.colorScheme.secondary + .withOpacity(0.6), + spreadRadius: 3), + ]), + end: BoxDecoration( + color: _mBtn?.colorOnSelected ?? + colorTheme.colorScheme.secondary, + shape: BoxShape.circle, + ), + ), + builder: (context, value, child) => DecoratedBox( + decoration: value, + child: daysText, + )), + ), + if (hasEvent) + Align( + alignment: Alignment.bottomCenter, + child: CustomPaint( + painter: CirclePainter( + color: isDisabled + ? _mBtn?.eventColorOnDisabled ?? + colorTheme.disabledColor.withOpacity(0.05) + : _mBtn?.eventColor ?? colorTheme.colorScheme.secondary, + style: PaintingStyle.fill, + strokeWidth: 0, + radius: 3, + offset: const Offset(0, -4)), + ), + ), + ], + ); + return monthCustomizer?.monthButtonBuilder == null + ? ifBuilderIsEmpty + : monthCustomizer!.monthButtonBuilder!( + mAll42DaysInMonth[index], + buttonChildHeight, + buttonChildWidth, + isSelected, + isDisabled, + hasEvent, + isHighlighted, + isCurrentDay); + } +} diff --git a/siro_rider/packages/calendar_builder/lib/src/views/year_drop_down.dart b/siro_rider/packages/calendar_builder/lib/src/views/year_drop_down.dart new file mode 100644 index 0000000..434db81 --- /dev/null +++ b/siro_rider/packages/calendar_builder/lib/src/views/year_drop_down.dart @@ -0,0 +1,568 @@ +import '../controllers/month_builder_controller.dart'; +import '../controllers/month_ui_controller.dart'; +import 'package:get/get.dart'; + +import '../../calendar_builder.dart'; +import 'package:flutter/material.dart'; + +//Todo: Add Image Documentation +///A year Drop down class--- default used in [CbMonthBuilder] +class CbYearDropDown extends StatefulWidget { + /// + const CbYearDropDown({ + Key? key, + this.matchId, + this.yearHeaderCustomizer, + this.yearHeaderBuilder, + this.yearButtonCustomizer, + this.yearButtonBuilder, + this.uiStateTag, + this.expandedYearHeight = 200, + this.expandedYearWidth, + }) : super(key: key); + + /// if u want to use same data between your Calendar Builder -- make sure to give same [matchId] + final String? matchId; + + ///customise year Header style [YearHeaderCustomizer] + final YearHeaderCustomizer? yearHeaderCustomizer; + + ///customise year button style [YearButtonCustomizer] + final YearButtonCustomizer? yearButtonCustomizer; + + ///Build your custom YearDropDown Header + final WidgetCbYearHeader? yearHeaderBuilder; + + ///Build your own year buttons + final WidgetCbYearButton? yearButtonBuilder; + + ///Expanded Height of year dropDown + ///default = 200 + final double expandedYearHeight; + + ///Expanded Width of year dropDown + final double? expandedYearWidth; + + ///UI controller tag + final String? uiStateTag; + + @override + _CbYearDropDownState createState() => _CbYearDropDownState(); +} + +class _CbYearDropDownState extends State { + late String matchingId; + late String uiStateTag; + + @override + void initState() { + super.initState(); + initControlers(); + } + + void initControlers() { + uiStateTag = widget.uiStateTag ?? UniqueKey().toString(); + Get.put(MonthUiController(), tag: uiStateTag); + + matchingId = widget.matchId ?? UniqueKey().toString(); + Get.put(MonthBuilderController(), tag: matchingId); + } + + @override + void dispose() { + super.dispose(); + Get.delete(tag: uiStateTag); + Get.delete(tag: matchingId); + } + + @override + Widget build(BuildContext context) { + String matchingId = widget.matchId ?? UniqueKey().toString(); + final mUiCtr = Get.find(tag: uiStateTag); + final size = MediaQuery.of(context).size; + + Widget _ifBuilderEmpty = SizedBox( + height: widget.yearHeaderCustomizer?.height ?? 40, + width: widget.yearHeaderCustomizer?.width ?? size.width, + child: Row( + mainAxisAlignment: MainAxisAlignment.center, + crossAxisAlignment: CrossAxisAlignment.center, + children: [ + GetBuilder( + tag: matchingId, + id: 'dateChangeId', + builder: (mCtr) { + String preMonth = mCtr.mSelectedDate.year == + mCtr.mSelectedYear.year + ? '${CalendarGlobals.months[mCtr.mSelectedDate.month - 1]} - ' + : ''; + String year = '$preMonth${mCtr.mSelectedYear.year}'; + return Text( + year, + style: widget.yearHeaderCustomizer?.titleTextStyle ?? + const TextStyle(fontWeight: FontWeight.bold), + ); + }), + GetBuilder( + tag: uiStateTag, + id: 'monthExpanded', + builder: (mCtr) => Icon(!mCtr.isYearPickerExpanded + ? widget.yearHeaderCustomizer?.downIcon ?? + Icons.arrow_drop_down_outlined + : widget.yearHeaderCustomizer?.upIcon ?? + Icons.arrow_drop_up_outlined)), + ], + ), + ); + return Column( + children: [ + InkWell( + onTap: () { + mUiCtr.onYearHeaderExpanded?.call(!mUiCtr.isYearPickerExpanded); + mUiCtr.chageYearExpanded( + isExpanded: !mUiCtr.isYearPickerExpanded, + commonUpdateId: 'commonId', + updateId: 'monthExpanded'); + }, + child: widget.yearHeaderBuilder == null + ? _ifBuilderEmpty + : GetBuilder( + id: 'monthExpanded', + tag: uiStateTag, + builder: (mUiCtr) => GetBuilder( + id: 'commonId', + tag: matchingId, + builder: (mCtr) { + String preMonth = mCtr.mSelectedDate.year == + mCtr.mSelectedYear.year + ? '${CalendarGlobals.months[mCtr.mSelectedDate.month - 1]} - ' + : ''; + String year = '$preMonth${mCtr.mSelectedYear.year}'; + return widget.yearHeaderBuilder!( + mUiCtr.isYearPickerExpanded, + mCtr.mSelectedDate, + mCtr.mSelectedYear, + year, + ); + }), + ), + ), + _YearDropDown( + matchId: matchingId, + uiStateTag: uiStateTag, + height: widget.expandedYearHeight, + width: widget.expandedYearWidth ?? size.width, + yearButtonBuilder: widget.yearButtonBuilder, + yearButtonCustomizer: widget.yearButtonCustomizer, + ) + ], + ); + } +} + +class _YearDropDown extends StatefulWidget { + const _YearDropDown({ + Key? key, + required this.matchId, + required this.uiStateTag, + required this.height, + required this.width, + this.yearButtonBuilder, + this.yearButtonCustomizer, + }) : super(key: key); + + final String matchId; + final String uiStateTag; + final double height; + final double width; + final WidgetCbYearButton? yearButtonBuilder; + final YearButtonCustomizer? yearButtonCustomizer; + + @override + __YearDropDownState createState() => __YearDropDownState(); +} + +class __YearDropDownState extends State<_YearDropDown> + with SingleTickerProviderStateMixin { + @override + Widget build(BuildContext context) { + return GetBuilder( + tag: widget.uiStateTag, + id: 'monthExpanded', + builder: (mUiCtr) { + ///!this scrolling will not work while we are using builder + // WidgetsBinding.instance!.addPostFrameCallback((_) { + // Scrollable.ensureVisible( + // mCtr.mYearPickerGlobalKey[8].currentContext!); + // }); + return AnimatedSize( + curve: Curves.fastOutSlowIn, + duration: CalendarGlobals.kMinDuration, + reverseDuration: CalendarGlobals.kMinDuration, + child: AnimatedOpacity( + duration: CalendarGlobals.kMaxDuration, + opacity: mUiCtr.isYearPickerExpanded ? 1.0 : 0, + child: SizedBox( + height: mUiCtr.isYearPickerExpanded ? widget.height : 0, + width: widget.width, + child: Visibility( + ///by using [Visibility] will improve the performace + visible: mUiCtr.isYearPickerExpanded, + child: GetBuilder( + id: 'monthExpanded', + tag: widget.matchId, + builder: (mCtr) => _YearBtnGridBuilder( + uiStateTag: widget.uiStateTag, + matchId: widget.matchId, + height: widget.height, + width: widget.width, + mCtr: mCtr, + isExpanded: mUiCtr.isYearPickerExpanded, + yearButtonBuilder: widget.yearButtonBuilder, + yearButtonCustomizer: widget.yearButtonCustomizer, + ), + ), + ), + ), + ), + ); + }, + ); + } +} + +class _YearBtnGridBuilder extends StatefulWidget { + const _YearBtnGridBuilder({ + Key? key, + required this.height, + required this.width, + required this.mCtr, + required this.isExpanded, + required this.matchId, + required this.uiStateTag, + this.yearButtonBuilder, + this.yearButtonCustomizer, + }) : super(key: key); + + final double height; + final double width; + final MonthBuilderController mCtr; + final bool isExpanded; + final String matchId; + final String uiStateTag; + final WidgetCbYearButton? yearButtonBuilder; + final YearButtonCustomizer? yearButtonCustomizer; + + @override + __YearBtnGridBuilderState createState() => __YearBtnGridBuilderState(); +} + +class __YearBtnGridBuilderState extends State<_YearBtnGridBuilder> + with AutomaticKeepAliveClientMixin { + late ScrollController _controller; + late double scrollPosition; + + ///[scrollPosition] it finds the exact scroll position of the [cbYearDropDown] + /// + /// + ///[.truncate] is used to remove fractional part/decimal part + ///``if val = 1.89 + ///val.truncate() + ///it returns 1 and removes fractoinal part`` + void _findScrollPositon() { + scrollPosition = (((((widget.mCtr.m16DateTimeYears.isEmpty + ? widget.mCtr.mAllYears.indexWhere((element) => + element.year == widget.mCtr.mSelectedYear.year) + : widget.mCtr.m16DateTimeYears.indexWhere((element) => + element.year == widget.mCtr.mSelectedYear.year))) / + 4) + .truncate() * + (widget.height / 4)) - + (widget.height / 4)); + } + + @override + void initState() { + super.initState(); + _findScrollPositon(); + _controller = ScrollController( + initialScrollOffset: scrollPosition, keepScrollOffset: true); + } + + @override + void didUpdateWidget(covariant _YearBtnGridBuilder oldWidget) { + super.didUpdateWidget(oldWidget); + if (oldWidget.isExpanded != widget.isExpanded) { + _findScrollPositon(); + _controller.jumpTo( + scrollPosition, + ); + } + } + + @override + void dispose() { + super.dispose(); + _controller.dispose(); + } + + @override + Widget build(BuildContext context) { + super.build(context); + final bool isMaxSize = widget.width >= 1200; + return GridView.builder( + gridDelegate: SliverGridDelegateWithFixedCrossAxisCount( + ///height of 1 button in grid + mainAxisExtent: isMaxSize ? widget.height / 3 : widget.height / 4, + crossAxisCount: isMaxSize ? 5 : 4, + ), + //!same + // SliverGridDelegateWithMaxCrossAxisExtent( + // maxCrossAxisExtent:widget.width / 4, + // mainAxisExtent: widget.height / 4, + // ), + controller: _controller, + addAutomaticKeepAlives: true, + cacheExtent: 20, + physics: const BouncingScrollPhysics(), + itemCount: widget.mCtr.m16DateTimeYears.isEmpty + ? widget.mCtr.mAllYears.length + : (widget.mCtr.m16DateTimeYears.length - (isMaxSize ? 1 : 0)), + itemBuilder: (context, i) => GetBuilder( + tag: widget.matchId, + id: widget.mCtr.m16DateTimeYears.isEmpty + ? widget.mCtr.mAllYears[i] + : widget.mCtr.m16DateTimeYears[i], + builder: (mCtr) { + // Global.debugLogs('Year:$i'); + DateTime thisLoopDate = mCtr.m16DateTimeYears.isEmpty + ? mCtr.mAllYears[i] + : mCtr.m16DateTimeYears[i]; + bool isYearselected = DateUtilsCB.checkYearIsSelected( + /// + isDisabled: DateUtilsCB.checkDayisDisabled( + listOfDates: mCtr.mAllYears, date: thisLoopDate), + + /// + dateSelected: mCtr.mSelectedYear, + loopedDay: thisLoopDate, + ); + bool isyearDisabled = DateUtilsCB.checkYearisDisabled( + listOfDates: mCtr.mAllYears, + date: thisLoopDate, + ); + return FittedBox( + fit: BoxFit.scaleDown, + child: _YearButtons( + matchId: widget.matchId, + uiStateTag: widget.uiStateTag, + isyearDisabled: isyearDisabled, + thisLoopDate: thisLoopDate, + isYearselected: isYearselected, + height: widget.height, + width: widget.width, + builder: widget.yearButtonBuilder, + borderColorOnDisabled: + widget.yearButtonCustomizer?.borderColorOnDisabled, + borderColorOnEnabled: + widget.yearButtonCustomizer?.borderColorOnEnabled, + borderColorOnSelected: + widget.yearButtonCustomizer?.borderColorOnSelected, + shrinkOnButtonPressed: widget.yearButtonCustomizer == null + ? true + : widget.yearButtonCustomizer!.shrinkOnButtonPressed, + hoverColor: widget.yearButtonCustomizer?.hoverColor, + onPressed: widget.yearButtonCustomizer?.onPressed, + splashColor: widget.yearButtonCustomizer?.splashColor, + textColorOnDisabled: + widget.yearButtonCustomizer?.textColorOnDisabled, + textColorOnEnabled: + widget.yearButtonCustomizer?.textColorOnEnabled, + textColorOnSelected: + widget.yearButtonCustomizer?.textColorOnSelected, + ), + ); + }, + ), + ); + } + + @override + bool get wantKeepAlive => true; +} + +class _YearButtons extends StatefulWidget { + const _YearButtons({ + Key? key, + required this.isyearDisabled, + required this.thisLoopDate, + required this.isYearselected, + required this.height, + required this.width, + required this.matchId, + required this.uiStateTag, + this.builder, + this.borderColorOnSelected, + this.borderColorOnDisabled, + this.borderColorOnEnabled, + this.textColorOnSelected, + this.textColorOnDisabled, + this.textColorOnEnabled, + this.splashColor, + this.hoverColor, + this.onPressed, + this.shrinkOnButtonPressed = true, + }) : super(key: key); + + final bool isyearDisabled; + final DateTime thisLoopDate; + final bool isYearselected; + final double height; + final double width; + final String matchId; + final String uiStateTag; + final WidgetCbYearButton? builder; + + /// + final Color? borderColorOnSelected; + final Color? borderColorOnDisabled; + final Color? borderColorOnEnabled; + final Color? textColorOnSelected; + final Color? textColorOnDisabled; + final Color? textColorOnEnabled; + final Color? splashColor; + final Color? hoverColor; + final Function(bool isButtonDisabled, DateTime selectedYear)? onPressed; + final bool shrinkOnButtonPressed; + @override + __YearButtons createState() => __YearButtons(); +} + +class __YearButtons extends State<_YearButtons> + with AutomaticKeepAliveClientMixin { + ///Callback when a year button is pressed + void _onYearPressed() { + final mCtr = Get.find(tag: widget.matchId); + final mUiCtr = Get.find(tag: widget.uiStateTag); + if (widget.isyearDisabled) { + if (widget.onPressed != null) { + widget.onPressed!(widget.isyearDisabled, widget.thisLoopDate); + } + CalendarGlobals.debugLogs('Calendar_builder: year button disabled'); + } else { + if (widget.onPressed != null) { + widget.onPressed!(widget.isyearDisabled, widget.thisLoopDate); + } + + ///Changes selected date + mCtr.changeSelectedYear( + selectedYear: widget.thisLoopDate, + oldSelectedYear: DateTime(mCtr.mSelectedYear.year, + mCtr.mSelectedYear.month, mCtr.mSelectedYear.day), + updateByID: true, + updateId: 'dateChangeId', + commonUpdateId: 'commonId'); + + ///isExpanded + if (widget.shrinkOnButtonPressed) { + Future.delayed(const Duration(milliseconds: 200)).then((value) { + mUiCtr.chageYearExpanded( + isExpanded: false, + updateId: 'monthExpanded', + commonUpdateId: 'commonId'); + }); + } + + ///changes the page of month pageView + int _mPage = mCtr.mAllYears + .indexWhere((element) => element.year == widget.thisLoopDate.year); + mUiCtr.mPageController.jumpToPage(_mPage); + + ///saves and removes months if length exedes 3 + mCtr.addToSavedMonthDates(DateTime(mCtr.mSelectedYear.year, + mCtr.mSelectedYear.month, mCtr.mSelectedYear.day)); + mCtr.savedMonthRemover(DateTime(widget.thisLoopDate.year, + widget.thisLoopDate.month, widget.thisLoopDate.day)); + } + mUiCtr.onYearButtonClicked + ?.call(widget.thisLoopDate, widget.isyearDisabled ? false : true); + } + + @override + Widget build(BuildContext context) { + super.build(context); + final txtTheme = Theme.of(context).textTheme; + final colorTheme = Theme.of(context); + + Widget ifBuilderisEmpty = SizedBox( + height: (widget.height / 5.5) >= 35 ? 35 : widget.height / 5.5, + width: (widget.width / 6) >= 150 ? 150 : (widget.width / 6), + child: InkWell( + onTap: _onYearPressed, + splashColor: + widget.isyearDisabled ? Colors.transparent : widget.splashColor, + hoverColor: widget.isyearDisabled ? null : widget.hoverColor, + customBorder: RoundedRectangleBorder( + borderRadius: BorderRadius.all( + Radius.circular( + (widget.height / 5.5) >= 35 ? 35 : widget.height / 5.5), + ), + ), + child: DecoratedBox( + decoration: BoxDecoration( + borderRadius: BorderRadius.all( + Radius.circular( + (widget.height / 5.5) >= 35 ? 35 : widget.height / 5.5), + ), + border: Border.all( + color: widget.isyearDisabled + ? widget.borderColorOnDisabled ?? + colorTheme.disabledColor.withOpacity(0.1) + : widget.isYearselected + ? widget.borderColorOnSelected ?? + (colorTheme.brightness == Brightness.dark + ? colorTheme.colorScheme.secondary + : Colors.black) + : widget.borderColorOnEnabled ?? Colors.grey, + width: widget.isyearDisabled + ? 1 + : widget.isYearselected + ? 1.5 + : 1), + ), + child: FittedBox( + fit: BoxFit.scaleDown, + child: Text(widget.thisLoopDate.year.toString(), + style: widget.isyearDisabled + ? txtTheme.titleMedium! + .copyWith(color: widget.textColorOnDisabled) + : widget.isYearselected + ? txtTheme.bodyLarge! + .copyWith(color: widget.textColorOnSelected) + : txtTheme.bodyLarge! + .copyWith(color: widget.textColorOnEnabled)), + ), + ), + ), + ); + + return widget.builder == null + ? ifBuilderisEmpty + : GestureDetector( + onTap: () { + ///execute functions + _onYearPressed(); + }, + behavior: HitTestBehavior.opaque, + child: widget.builder!( + widget.thisLoopDate, + (widget.height / 5.5) >= 35 ? 35 : widget.height / 5.5, + (widget.width / 6) >= 150 ? 150 : (widget.width / 6), + widget.isyearDisabled, + widget.isYearselected, + )); + } + + @override + bool get wantKeepAlive => true; +} diff --git a/siro_rider/packages/calendar_builder/pubspec.lock b/siro_rider/packages/calendar_builder/pubspec.lock new file mode 100644 index 0000000..90d8813 --- /dev/null +++ b/siro_rider/packages/calendar_builder/pubspec.lock @@ -0,0 +1,221 @@ +# Generated by pub +# See https://dart.dev/tools/pub/glossary#lockfile +packages: + async: + dependency: transitive + description: + name: async + sha256: e2eb0491ba5ddb6177742d2da23904574082139b07c1e33b8503b9f46f3e1a37 + url: "https://pub.dev" + source: hosted + version: "2.13.1" + boolean_selector: + dependency: transitive + description: + name: boolean_selector + sha256: "8aab1771e1243a5063b8b0ff68042d67334e3feab9e95b9490f9a6ebf73b42ea" + url: "https://pub.dev" + source: hosted + version: "2.1.2" + characters: + dependency: transitive + description: + name: characters + sha256: faf38497bda5ead2a8c7615f4f7939df04333478bf32e4173fcb06d428b5716b + url: "https://pub.dev" + source: hosted + version: "1.4.1" + clock: + dependency: transitive + description: + name: clock + sha256: fddb70d9b5277016c77a80201021d40a2247104d9f4aa7bab7157b7e3f05b84b + url: "https://pub.dev" + source: hosted + version: "1.1.2" + collection: + dependency: transitive + description: + name: collection + sha256: "2f5709ae4d3d59dd8f7cd309b4e023046b57d8a6c82130785d2b0e5868084e76" + url: "https://pub.dev" + source: hosted + version: "1.19.1" + fake_async: + dependency: transitive + description: + name: fake_async + sha256: "5368f224a74523e8d2e7399ea1638b37aecfca824a3cc4dfdf77bf1fa905ac44" + url: "https://pub.dev" + source: hosted + version: "1.3.3" + flutter: + dependency: "direct main" + description: flutter + source: sdk + version: "0.0.0" + flutter_lints: + dependency: "direct dev" + description: + name: flutter_lints + sha256: b543301ad291598523947dc534aaddc5aaad597b709d2426d3a0e0d44c5cb493 + url: "https://pub.dev" + source: hosted + version: "1.0.4" + flutter_test: + dependency: "direct dev" + description: flutter + source: sdk + version: "0.0.0" + get: + dependency: "direct main" + description: + name: get + sha256: "5ed34a7925b85336e15d472cc4cfe7d9ebf4ab8e8b9f688585bf6b50f4c3d79a" + url: "https://pub.dev" + source: hosted + version: "4.7.3" + leak_tracker: + dependency: transitive + description: + name: leak_tracker + sha256: "33e2e26bdd85a0112ec15400c8cbffea70d0f9c3407491f672a2fad47915e2de" + url: "https://pub.dev" + source: hosted + version: "11.0.2" + leak_tracker_flutter_testing: + dependency: transitive + description: + name: leak_tracker_flutter_testing + sha256: "1dbc140bb5a23c75ea9c4811222756104fbcd1a27173f0c34ca01e16bea473c1" + url: "https://pub.dev" + source: hosted + version: "3.0.10" + leak_tracker_testing: + dependency: transitive + description: + name: leak_tracker_testing + sha256: "8d5a2d49f4a66b49744b23b018848400d23e54caf9463f4eb20df3eb8acb2eb1" + url: "https://pub.dev" + source: hosted + version: "3.0.2" + lints: + dependency: transitive + description: + name: lints + sha256: a2c3d198cb5ea2e179926622d433331d8b58374ab8f29cdda6e863bd62fd369c + url: "https://pub.dev" + source: hosted + version: "1.0.1" + matcher: + dependency: transitive + description: + name: matcher + sha256: "12956d0ad8390bbcc63ca2e1469c0619946ccb52809807067a7020d57e647aa6" + url: "https://pub.dev" + source: hosted + version: "0.12.18" + material_color_utilities: + dependency: transitive + description: + name: material_color_utilities + sha256: "9c337007e82b1889149c82ed242ed1cb24a66044e30979c44912381e9be4c48b" + url: "https://pub.dev" + source: hosted + version: "0.13.0" + meta: + dependency: transitive + description: + name: meta + sha256: "23f08335362185a5ea2ad3a4e597f1375e78bce8a040df5c600c8d3552ef2394" + url: "https://pub.dev" + source: hosted + version: "1.17.0" + path: + dependency: transitive + description: + name: path + sha256: "75cca69d1490965be98c73ceaea117e8a04dd21217b37b292c9ddbec0d955bc5" + url: "https://pub.dev" + source: hosted + version: "1.9.1" + sky_engine: + dependency: transitive + description: flutter + source: sdk + version: "0.0.0" + source_span: + dependency: transitive + description: + name: source_span + sha256: "56a02f1f4cd1a2d96303c0144c93bd6d909eea6bee6bf5a0e0b685edbd4c47ab" + url: "https://pub.dev" + source: hosted + version: "1.10.2" + stack_trace: + dependency: transitive + description: + name: stack_trace + sha256: "8b27215b45d22309b5cddda1aa2b19bdfec9df0e765f2de506401c071d38d1b1" + url: "https://pub.dev" + source: hosted + version: "1.12.1" + stream_channel: + dependency: transitive + description: + name: stream_channel + sha256: "969e04c80b8bcdf826f8f16579c7b14d780458bd97f56d107d3950fdbeef059d" + url: "https://pub.dev" + source: hosted + version: "2.1.4" + string_scanner: + dependency: transitive + description: + name: string_scanner + sha256: "921cd31725b72fe181906c6a94d987c78e3b98c2e205b397ea399d4054872b43" + url: "https://pub.dev" + source: hosted + version: "1.4.1" + term_glyph: + dependency: transitive + description: + name: term_glyph + sha256: "7f554798625ea768a7518313e58f83891c7f5024f88e46e7182a4558850a4b8e" + url: "https://pub.dev" + source: hosted + version: "1.2.2" + test_api: + dependency: transitive + description: + name: test_api + sha256: "93167629bfc610f71560ab9312acdda4959de4df6fac7492c89ff0d3886f6636" + url: "https://pub.dev" + source: hosted + version: "0.7.9" + vector_math: + dependency: transitive + description: + name: vector_math + sha256: d530bd74fea330e6e364cda7a85019c434070188383e1cd8d9777ee586914c5b + url: "https://pub.dev" + source: hosted + version: "2.2.0" + vm_service: + dependency: transitive + description: + name: vm_service + sha256: "046d3928e16fa4dc46e8350415661755ab759d9fc97fc21b5ab295f71e4f0499" + url: "https://pub.dev" + source: hosted + version: "15.1.0" + web: + dependency: transitive + description: + name: web + sha256: "868d88a33d8a87b18ffc05f9f030ba328ffefba92d6c127917a2ba740f9cfe4a" + url: "https://pub.dev" + source: hosted + version: "1.1.1" +sdks: + dart: ">=3.9.0-0 <4.0.0" + flutter: ">=3.18.0-18.0.pre.54" diff --git a/siro_rider/packages/calendar_builder/pubspec.yaml b/siro_rider/packages/calendar_builder/pubspec.yaml new file mode 100644 index 0000000..0b06cf5 --- /dev/null +++ b/siro_rider/packages/calendar_builder/pubspec.yaml @@ -0,0 +1,55 @@ +name: calendar_builder +description: Fully customizable calendar package for flutter.Also supports for disabling dates, highlighting dates and displaying events inside calendar. +version: 0.0.6 +homepage: https://github.com/newtaDev/calendar_builder + +environment: + sdk: ">=2.16.1 <4.0.0" + flutter: ">=1.17.0" + +dependencies: + flutter: + sdk: flutter + get: ^4.6.1 + +dev_dependencies: + flutter_test: + sdk: flutter + flutter_lints: ^1.0.0 + +# For information on the generic Dart part of this file, see the +# following page: https://dart.dev/tools/pub/pubspec + +# The following section is specific to Flutter. +flutter: + + # To add assets to your package, add an assets section, like this: + # assets: + # - images/a_dot_burr.jpeg + # - images/a_dot_ham.jpeg + # + # For details regarding assets in packages, see + # https://flutter.dev/assets-and-images/#from-packages + # + # An image asset can refer to one or more resolution-specific "variants", see + # https://flutter.dev/assets-and-images/#resolution-aware. + + # To add custom fonts to your package, add a fonts section here, + # in this "flutter" section. Each entry in this list should have a + # "family" key with the font family name, and a "fonts" key with a + # list giving the asset and other descriptors for the font. For + # example: + # fonts: + # - family: Schyler + # fonts: + # - asset: fonts/Schyler-Regular.ttf + # - asset: fonts/Schyler-Italic.ttf + # style: italic + # - family: Trajan Pro + # fonts: + # - asset: fonts/TrajanPro.ttf + # - asset: fonts/TrajanPro_Bold.ttf + # weight: 700 + # + # For details regarding fonts in packages, see + # https://flutter.dev/custom-fonts/#from-packages diff --git a/siro_rider/packages/calendar_builder/test/calendar_builder_test.dart b/siro_rider/packages/calendar_builder/test/calendar_builder_test.dart new file mode 100644 index 0000000..0da434d --- /dev/null +++ b/siro_rider/packages/calendar_builder/test/calendar_builder_test.dart @@ -0,0 +1,5 @@ +import 'package:flutter_test/flutter_test.dart'; + +void main() { + test('adds one to input values', () {}); +} diff --git a/siro_rider/packages/calendar_builder/test/unit_test/date_utils_test.dart b/siro_rider/packages/calendar_builder/test/unit_test/date_utils_test.dart new file mode 100644 index 0000000..f364361 --- /dev/null +++ b/siro_rider/packages/calendar_builder/test/unit_test/date_utils_test.dart @@ -0,0 +1,116 @@ +import 'package:calendar_builder/src/utils/date_utils_cb.dart'; +import 'package:flutter_test/flutter_test.dart'; + +void main() { + group('DateUtilsCB Testing', () { + final DateTime startDate = DateTime(DateTime.now().year); + final DateTime endDate = + DateTime(DateTime.now().year + 20).subtract(const Duration(days: 1)); + final selectedDate = DateTime.now(); + final notSelectedDate = selectedDate.add(const Duration(days: 1)); + final List listOfDates = [ + selectedDate, + notSelectedDate, + startDate, + endDate + ]; + + /// + DateTime _year = DateTime.now(); + List>> monthsInaYear = + DateUtilsCB.getAllMonthsIn1Year(selectedYear: _year); + + ///!getDaysInBeteween Test + test('getDaysInBeteween', () { + List startToEndDates = + DateUtilsCB.getDaysInBeteween(startDate: startDate, endDate: endDate); + + expect(startToEndDates.first, startDate); + expect(startToEndDates.last, endDate); + }); + + ///!getAllDaysInBetweenYears Test + test('getAllDaysInBetweenYears', () { + List allStartToEndDates = DateUtilsCB.getAllDaysInBetweenYears( + startDate: startDate, endDate: endDate); + + expect(allStartToEndDates.first, startDate); + expect(allStartToEndDates.last, endDate); + }); + + ///!getYearsInBeteween Test + test('getYearsInBeteween', () { + List allYears = DateUtilsCB.getYearsInBeteween( + startDate: startDate, endDate: endDate); + expect(allYears.first, startDate); + expect(allYears.last, DateTime(endDate.year)); + }); + + ///!checkDayisSelected Test + test('checkDayisSelected', () { + /// + bool checkIsSelected(DateTime dateSelected) { + return DateUtilsCB.checkDayisSelected( + dateSelected: dateSelected, loopedDay: selectedDate); + } + + expect(checkIsSelected(selectedDate), true); + expect(checkIsSelected(notSelectedDate), false); + }); + + ///!checkDayisDisabled Test + test('checkDayisDisabled', () { + /// + bool checkIsDisabled(DateTime disabled) { + return DateUtilsCB.checkDayisDisabled( + listOfDates: listOfDates, date: disabled); + } + + expect(checkIsDisabled(selectedDate), false); + expect(checkIsDisabled(DateTime(300)), true); + }); + + ///!checkListContainsDate Test + test('checkListContainsDate', () { + /// + bool checkContains(DateTime contains) { + return DateUtilsCB.checkListContainsDate( + listOfDates: listOfDates, date: contains); + } + + expect(checkContains(selectedDate), true); + expect(checkContains(DateTime(300)), false); + }); + + ///!checkYearisDisabled Test + test('checkYearisDisabled', () { + /// + bool checkYearDisabled(DateTime disabled) { + return DateUtilsCB.checkYearisDisabled( + listOfDates: listOfDates, date: disabled); + } + + expect(checkYearDisabled(selectedDate), false); + expect(checkYearDisabled(DateTime(300)), true); + }); + + ///!getAllMonthsIn1Year Test + test('getAllMonthsIn1Year', () { + expect(monthsInaYear.length, 12); + + ///Checks for first month day (ie, Jan-1) is equal to `DateTime(_year.year)` this date or not + expect(monthsInaYear.first.values.first.first, DateTime(_year.year)); + + ///Checks for last month, last day (ie, Dec-30/31) is equal to `DateTime(_year.year + 1).subtract(const Duration(days: 1))` this date or not + expect(monthsInaYear.last.values.last.last, + DateTime(_year.year + 1).subtract(const Duration(days: 1))); + }); + + ///!getAll42DaysIn1Month Test + test('getAll42DaysIn1Month', () { + final List oneMonth = DateUtilsCB.getAll42DaysIn1Month( + month: monthsInaYear.first.values.first); + expect(oneMonth.length, 42); + }); + }); +} diff --git a/siro_rider/packages/get/CHANGELOG.md b/siro_rider/packages/get/CHANGELOG.md new file mode 100644 index 0000000..c143bbf --- /dev/null +++ b/siro_rider/packages/get/CHANGELOG.md @@ -0,0 +1,1433 @@ +## [4.6.5] +Fix pub dev score + +## [4.6.4] +Added backward compatibility with flutter 2. + +## [4.6.3] +Fix SDK constraints + +## [4.6.2] +Added compatibility with flutter 3.0 + +## [4.6.1] +Fix GetConnect on Flutter web + +## [4.6.0] +Add useInheritedMediaQuery to GetMaterialApp and GetCupertinoApp (@davidhole) +Add Circular reveal Transition (@parmarravi) +Add request to failed response (@heftekharm) +Fix internationalization with only country code (@codercengiz) +Add GetTickerProviderStateMixin when multiple AnimationController objects are used (@NatsuOnFire) +Add the followRedirects and maxRedirects fields to the Request object (@wei53881) +Fix to rx.trigger fires twice (@gslender) +Add proxy setting support to GetConnect (@jtans) +Fix markAsDirty used on permanent controllers (@zenalex) +Update Korean readme (@dumbokim) + + +## [4.5.1] +Fix Snackbar when it have action and icon the same time + +## [4.5.0] - Big Update +To have a page-agnostic snackbar, we used OverlayRoute to display a partial route. +However this had several problems: + +1: There was no possibility to close the page without closing the snackbar +2: Get.back() could cause problems with tests of Get.isSnackbarOpen not being properly invoked +3: Sometimes when using iOS popGesture with an open snackbar, some visual inconsistency might appear. +4: When going to another route, the snackbar was not displayed on the new page, and if the user clicked on the new route as soon as he received a Snackbar, he could not read it. + +We remade the Snackbar from scratch, having its Api based on Overlay, and now opening a Snackbar won't be tied to a route, you can normally navigate routes while a Snackbar is shown at the top (or bottom), and even the PopGesture of the iOS is not influenced by it. + +Using Get.back() is handy, it's a small command, which closes routes, dialogs, snackbars, bottomsheets, etc, however Getx 5 will prioritize code safety, and splitting will reduce the check code as well. Currently we have to check if a snackbar is open, to close the snackbar and prevent the app from going back a page, all this boilerplate code will be removed, at the cost of having what it closes in front of Get.back command. + +For backwards compatibility, Get.back() still works for closing routes and overlays, however two new commands have been added: Get.closeCurrentSnackbar() and Get.closeAllSnackbars(). +Maybe we will have a clearer api in GetX 5, and maybe Get.back() will continue to do everything like it does today. The community will be consulted about the desired api. However version 5 will definitely have commands like: Get.closeCurrentSnackbar, Get.closeCurrentDialog etc. There is also the possibility to close a specific snackbar using the return of Get.snackbar, which will no longer return a void, and now return a SnackbarController. + +Snackbars now also have a Queue, and no longer stack one on top of the other, preventing viewing. GetX now has flexible, customizable, route-independent, and completely stable Snackbars. + +Fixed bugs where the snackbar showed an error in debug mode for a fraction of a second. We found that Flutter has a bug with blur below 0.001, so we set the minimum overlayBlur value to this value if it is ==true. + +Errors with internationalization were also fixed, where if you are in UK, and the app had the en_US language, you didn't have American English by default. Now, if the country code is not present, it will automatically fetch the language code before fetching a fallbackLanguage. + +Update locale also now returns a Future, allowing you to perform an action only when the language has already changed (@MHosssam) + +We are very happy to announce that GetX is now documented in Japanese as well, thanks to (@toshi-kuji) + +GetX has always been focused on transparency. You can tell what's going on with your app just by reading the logs on the console. However, these logs shouldn't appear in production, so it now only appears in debug mode (@maxzod) + +@maxzod has also started translating the docs into Arabic, we hope the documentation will be complete soon. + +Some remaining package logs have been moved to Get.log (@gairick-saha) + +RxList.removeWhere received performance optimizations (@zuvola) + +Optimizations in GetConnect and added the ability to modify all request items in GetConnect (@rodrigorahman) + +The current route could be inconsistent if a dialog were opened after a transition, fixed by @xiangzy1 + +Fixed try/catch case missed in socket_notifier (@ShookLyngs) + +Also we had fixes in the docs: @DeathGun3344 @pinguluk + +GetX also surpassed the incredible mark of more than 7000 likes, being the most liked package in all pub.dev, went from 99% to 100% popularity, and has more than 5.3k stars on github. Documentation is now available in 12 languages, and we're happy for all the engagement from your community. + +This update is a preparation update for version 5, which will be released later this year. + +Breaking and Depreciation: +GetBar is now deprecated, use GetSnackbar instead. +dismissDirection now gets a DismissDirection, making the Snackbar more customizable. + + + + + +## [4.3.8] +- Fix nav2 toNamed remove the route + +## [4.3.7] +- Fix wrong currentRoute when a route is removed +- Remove take that limits the router outlet depth (@steven-spiel) + +## [4.3.6] +- Fix error with autodispose of additional dependencies beyond GetxController +- Added ability to add your own delegate to RouterOutlet (@steven-spiel) +- Added listenAndPump to Rx to give Rx the same behavior as BehaviorSubject (@steven-spiel) + +## [4.3.5] +- Fix GetConnect timeout (@jasonlaw) +- Improve Vietnamese docs (@hp1909) +- Refactor placeholder name route to unnamed routes (@roipeker). +- Fix: Navigate to a page identical to Get.offNamed. +- Fix: Wrong nameRoute after a route is removed +- Added assert to prevent the user from starting a route name without slash. + +## [4.3.4] +- Improve docs + +## [4.3.3] +- Fix Get.reset + +## [4.3.2] +- Fix nullable on internacionalization (@jmguillens) +- Fix nullable on Rx.stream (@steven-spiel) + +## [4.3.1] +- Fix controller is not removed when keyboard is open. +- Improved: Safe removal and insertion of controllers. + +## [4.3.0] +- Added GetResponsiveWidget (@ahmednfwela) +- Added `Get.replace()` (@jwelmac) +- Added Improve korean doc (@sejun2) +- Fix multiple middlewares redirect (@liasica) +- Added gestureWidth and showCupertinoParallax to GetPage to customize cupertino transitions + +## [4.2.5] +- Added anchorRoute and filterPages to GetRouterOutlet (@ahmednfwela) +- Added scrollBehavior and scaffoldMessengerKey to GetMaterialapp(@ejabu and @alionour) +- Fix error when child on MaterialApp is null (@ahmednfwela) +- Fix Korean docs (@rws08) +- Fix error with onClose called before routeTransition on Get.offNamed + +## [4.2.4] +- Fix Get.offAll removing GetxServices from memory + +## [4.2.3] +- Fix back button on navigator 2 +- Added parameters and arguments to Get.rootDelegate + +## [4.2.1] +- Remove [] from docs to try fix pub score + +## [4.2.0] - Big update + +This update fixes important bugs as well as integrates with Navigator 2. It also adds GetRouterOutlet, similar to angular RouterOutlet thanks to @ahmednfwela. Also, the documentation translation for Vietnamese (@khangahs) has been added, making the GetX documentation available for 11 different languages, which is just fantastic for any opensource project. GetX has achieved more than 5.4k likes from the pub, and more than 4k stars on github, has videos about it with 48k on youtube, and has communities in the 4 hemispheres of the earth, besides having a large list of contributors as you see bellow. We're all happy to facilitate development with dart and flutter, and that making programming hassle-free has been taken around the world. + +Changes in this version: + +- Fix: Navigating to the same page with Get.offNamed does not delete the controller from that page using Get.lazyPut. + +- Fix Readme GetMiddleware typos +by @nivisi + +- Fix url replace error +by @KevinZhang19870314 + +- Changed response default encoding from latin1 to utf8 +by @heftekharm + +- Add Duration in ExtensionBottomSheet +by @chanonpingpong + +- Added compatibility with dart-lang/mockito +by @lifez + +- Added extensions methods to convert value in percent value +by @kauemurakami + +- Set darkTheme equal theme when darkTheme is null +by @eduardoFlorence + +- Add padding to 'defaultDialog' +by @KevinZhang19870314 + +- GraphQLResponse inherit Response info +by @jasonlaw + +- Fix Redundant concatenating base url +by @jasonlaw + +- Add content type and length into the headers when the content type is 'application/x-www-form-urlencoded' +by @calvingit + +- Make withCredentials configurable +by @jasonlaw + +- Fix flutter 2.0 error +by @yunchiri + +- Allow deleting all registered instances +by @lemps + +- Refactor/rx interface notify children +@by kranfix + +- Fixed parameter parsing and middleware sorting +by @ahmednfwela + +- Improvements to router outlet +by @ahmednfwela + +- Minor improvements and bug fixes +by @ahmednfwela + +- Adding route guards and improving navigation +by @ahmednfwela + +- Fix RxInterface.proxy losing its previous value on exception +by @WillowWisp + +- Added dispose() for bottomSheet. +by @furkankurt + +- Added Pull request template +by @unacorbatanegra + +- Fix and update documentation: +@Farid566, +@galaxykhh, +@arslee07, +@GoStaRoff, +@BondarenkoArtur, +@denisrudnei, +@Charly6596, +@nateshmbhat, +@hrithikrtiwari, +@Undeadlol1, +@rws08, +@inuyashaaa, +@broccolism, +@aadarshadhakalg, +@ZeroMinJeon + + +## [4.1.4] +- Adjust operator + and - to RxInt (@eduardoflorence) +- Fix dark theme (@eduardoflorence) +- Fix form-urlencoded on GetConnect (@aramayyes) + + +## [4.1.3] +- Fix "Error: A value of type 'Locale?' can't be returned from a function"on flutter web (@nickwri) +- Fix plural translations to expressions >1 (@WolfVic) + +## [4.1.2] +- Fix warning ˜can add data to a closed stream˜ when GetBuilder and Obx are nested +- Fix get_connect decoder can not be null (@Goddchen) +- Migrate example code (@3lB4rt0) +- Fix initial value of nullables (@RafaRuiz) +- Improve error message to navigation (@maxzod) +- Fix typo on docs (@Rahulshahare) +- Fixed darktheme being changed only through Get.changeTheme and not through the DarkTheme theme property in MaterialApp (@GoldenSoju) +- Fix controller is removed when navigate to same page (@eduardoflorence) +- Fix missing reload() and reloadAll() to Get extensions (@lkloon123) + + +## [4.1.1] +- Remove mandatory initialValue to nullables types + +## [4.1.0] +- Added Rxn to non nullables reactives types + +## [4.0.3] +- Added new linter rules to improve score + +## [4.0.2] +- Removed "!" of if else conditions until the null-safety of the dart is consistent for using it. + +## [4.0.1] +- Fix changelog + +## [4.0.0] +- Added append function to StateMixin. Now is possible track loading, success and error handle of your application with ONE LINE OF CODE. Ex: append(()=> api.getUser); +- Migrate to null-safety +- Added ScrollMixin to controllers +- Added loadingMore status to RxStatus +- Fix content-type qual null (@katekko) +- Made GetInstance non nullable (@eduardoflorence) +- Fix multi-parameters url (@iMrLopez) +- Fix Expected value of SkDeletable error (@obadajasm) +- Added triggers, an Rx method that triggers events, even if they are the same as the previous event (@RafaRuiz) +- Improve docs: (@CNAD666), (@dhhAndroid), (@Jackylee1992), + +Switching to null-safety: +You can continue using GetX as normal, with as little breaking changes as possible. +It is still possible to declare the var.obs variable, and this remains the preferred way, forcing null-safety and giving you all the security that sound null-safety delivers to your app. However, if you need to use null, we also provide a solution for you. +Declare the variables with `?` Ex: `final Rx count = 0.obs`. +You can also use custom Rxn types with null-safety: +`RxInt` == not nullable +`RxnInt` == nullable. + +## [3.25.6] +- Added documentation in French (@kamazoun) +- Fix logs messages (@damphat) +- Fix plural to zero on internacionalization (@RafaRuiz) +- Fix error when body hasn't content on GetConnect (@jasonlaw) +- Fix typos on readme (@bashleigh) +- Fix group updates to GetBuilder + +## [3.25.5] +- Fix Get.isDialogOpen when two or more open dialogs are closed + +## [3.25.4] +- Added logs and tests to unknownRoute + +## [3.25.3] +- Fix bindStream error 'Object.noSuchMethod'. + +## [3.25.2] +- Improved Workers system to accept a list of works + +## [3.25.1] +- Improved the log system to display the tag used in the controller that was created. + +## [3.25.0] - Big update +- Added [reload] and [reloadAll] methods to reload your Controller to original values +- Added [FullLifeCycleController] - A GetxController capable of observing all the life cycles of your application. FullLifeCycleController has the life cycles: + * onInit: called when the controller enters the application's memory + * onReady: called after onInit, when build method from widget relationed to controller is done. + * onClose: called when controller is deleted from memory. + * onPaused: called when the application is not currently visible to the user, and running in the background. + * onInactive: called when the application is in an inactive state and is not receiving user input, when the user receives a call, for example + * onResumed: The application is now visible and in the foreground + * onDetached: The application is still hosted on a flutter engine but is detached from any host views. + * didChangeMetrics: called when the window size is changed +- Added SuperController, a complete life circle controller with StateMixin +- Improve Iterable Rx Api. Now, you can to use dart List, Map and Set as reactive, like: List names = ['juan', 'pedro', 'maria'].obs; +- Added assign and assignAll extensions to default dart List +- Added parameters options from Get.toNamed, Get.offNamed, and Get.offAllNamed (@enghitalo) +- Improve Rx disposal logic to completely prevent memory leaks +- Improve Capitalize methods from GetUtils (@eduardoflorence) +- Prevent a close snackbar from close a Screen with double tap (@eduardoflorence) +- Includes GetLifeCycleBase mixin on delete/dispose (@saviogrossi) +- Added internacionalization example to sample app (@rodriguesJeff) +- Added headers to Graphql query and mutation(@asalvi0) +- Added translation with parameter extension (@CpdnCristiano) +- Added Get.parameter access to Middleware (@eduardoflorence) +- Fix RxBool typo (@emanuelmutschlechner) +- Added Filter to GetBuilder +- Added debouce to GetBuilder update +- Added ability to insert an Enum, class, or type of an object as a GetBuilder's Id +- Improve upload time from GetConnect +- Create minified version to DartPad(@roipeker) +- Suggested to use `Get.to(() => Page())` instead of `Get.to(Page())`. +- Added more status codes to GetConnect (@romavic) +- Fix and improve docs: @unacorbatanegra, @lsm, @nivisi, @ThinkDigitalSoftware, @martwozniak, @UsamaElgendy, @@DominusKelvin, @jintak0401, @goondeal + + +## [3.24.0] +- GetWidget has been completely redesigned. +Throughout its lifetime, GetWidget has always been mentioned in the documentation as "something you shouldn't use unless you're sure you need it", and it had a very small use case. A short time ago we realized that it could have some unexpected behaviors, when compared to GetView, so we decided to rebuild it from scratch, creating a really useful widget for the ecosystem. +Objectively, GetWidget is now a Widget that caches the controller and protects children from their parents' reconstructions. This means that if you have a ListView or gridview, you can add items to it without the child (being a GetWidget) being rebuilt. The api is now more concise, as you can use Get.put / Get.lazyput for global dependencies, and Get.create with GetWidget for ephemeral dependencies, or when you need several identical controllers for the same widget, eliminating the need for tags for most cases. + +- Workers now have error handlers, so if an error occurs in your stream, you can recover it from your workers. + +- `isTrue` and `isFalse` setters were added to [RxBool], this will make the code more readable, and will mitigate the use of ".value" in Booleans. + +- [Patch] method was added in GetConnect. + +- Native methods for RxString (trim, contains, startWith, etc.) have been added. + +- Standard constructors for RxList and RxMap have been added (RxList.generate, RxList.from, Map.of, Map.from, etc). + +- Added "onEmpty" status in StateMixin (@alizera) + +- Added query and mutation methods of graphql for getconnect. + +- Added body string for content-type application/x-www-form-urlencoded on GetConnect (@eduardoflorence) + +## [3.23.1] +- Fix allowSelfSigned on Flutter web + +## [3.23.0] +- Add GetResponsive (@SchabanBo) +- Update tests, fix predicate for offNamedUntil (@vbuberen) +- Added Urdu Version for Pakistani Developers (@UsamaSarwar) +- Handle for List field with native datatype on GetConnect(@jasonlaw) +- Added WillPopScope to defaultDialog (@rakeshlanjewar) +- Fix optional query params not attach on createUri from GetConnect (@reinaldowebdev) +- Effective Get.testMode from navigator on tests (@eduardoflorence) +- Fix Navigator 2.0 on GetMaterialApp and CupertinoMaterialApp (@SchabanBo) +- Added Middlewares with initial Routes (@SchabanBo) +- Improve PT-br Docs (@eduardoflorence) +- Added the allowSelfSigned parameter to GetSocket(@eduardoflorence) +- Added Indonesian version to Indonesian Developers (@pratamatama) + +## [3.22.2] +- Fix overlayEntries is null on Master/Dev branch of Flutter + +## [3.22.1] +- Improve: auto jsonDecode occurs only if response.header.contentType is "application/json" +- Improve and fix requests types (@eduardoflorence) +- Fix HeaderValue variables with same name (@haidang93) + + +## [3.22.0] +- Added: more multipart options. Now you can send as multipart: + +File: +'file':MultipartFile(File('./images/avatar.png'), filename: 'avatar.png'), + +String path: +'file':MultipartFile('./images/avatar.png', filename: 'avatar.png'), + +Or bytes (Flutter web work only with bytes): +'file':MultipartFile(File('file').readAsBytesSync(), filename: 'avatar.png'), + +- Added: Upload Progress to MultipartRequest +- Added support to List (@jasonlaw) + + +## [3.21.3] +- Improve multipart file and defaultDecoder on GetConnect + +## [3.21.2] +- Fix GetConnect.request returning a PUT request + +## [3.21.1] +- Allow null body to POST method on GetConnect + +## [3.21.0] - Big update +- This update attaches two nice features developed by (@SchabanBo): *GetPage Children* And *GetMiddleware* +In previous versions, to create child pages, you should do something like: + +```dart +GetPage( + name: '/home', + page: () => HomeView(), + binding: HomeBinding(), +), +GetPage( + name: '/home/products', + page: () => ProductsView(), + binding: ProductsBinding(), +), +GetPage( + name: '/home/products/electronics', + page: () => ElectronicsView(), + binding: ElectronicsBinding(), +), +``` +Although the feature works well, it could be improved in several ways: +1- If you had many pages, the page file could become huge and difficult to read. Besides, it was difficult to know which page was the daughter of which module. +2- It was not possible to delegate the function of naming routes to a subroutine file. +With this update, it is possible to create a declarative structure, very similar to the Flutter widget tree for your route, which might look like this: +```dart +GetPage( + name: '/home', + page: () => HomeView(), + binding: HomeBinding(), + children: [ + GetPage( + name: '/products', + page: () => ProductsView(), + binding: ProductsBinding(), + children: [ + GetPage( + name: '/electronics', + page: () => ElectronicsView(), + binding: ElectronicsBinding(), + ), + ], + ), + ], + ); +``` +Thus, when accessing the url: '/home/products/electronics' +Or use Get.toNamed('/home/products/electronics') it will go directly to the page [ElectronicsView], because the child pages, automatically inherit the name of the ancestral page, so _with any small change on any father in the tree all children will be updated._ If you change [/products] to [/accessories], you don't nesse update on all child links. + +However, the most powerful feature of this version is *GetMiddlewares*. +The GetPage has now new property that takes a list of GetMiddleWare than can perform actions and run them in the specific order. + +### Priority + +The Order of the Middlewares to run can pe set by the priority in the GetMiddleware. + +```dart +final middlewares = [ + GetMiddleware(priority: 2), + GetMiddleware(priority: 5), + GetMiddleware(priority: 4), + GetMiddleware(priority: -8), +]; +``` +those middlewares will be run in this order **-8 => 2 => 4 => 5** + +### Redirect + +This function will be called when the page of the called route is being searched for. It takes RouteSettings as a result to redirect to. Or give it null and there will be no redirecting. + +```dart +GetPage redirect( ) { + final authService = Get.find(); + return authService.authed.value ? null : RouteSettings(name: '/login') +} +``` + +### onPageCalled + +This function will be called when this Page is called before anything created +you can use it to change something about the page or give it new page + +```dart +GetPage onPageCalled(GetPage page) { + final authService = Get.find(); + return page.copyWith(title: 'Welcome ${authService.UserName}'); +} +``` + +### OnBindingsStart + +This function will be called right before the Bindings are initialize. +Here you can change Bindings for this page. + +```dart +List onBindingsStart(List bindings) { + final authService = Get.find(); + if (authService.isAdmin) { + bindings.add(AdminBinding()); + } + return bindings; +} +``` + +### OnPageBuildStart + +This function will be called right after the Bindings are initialize. +Here you can do something after that you created the bindings and before creating the page widget. + +```dart +GetPageBuilder onPageBuildStart(GetPageBuilder page) { + print('bindings are ready'); + return page; +} +``` + +### OnPageBuilt + +This function will be called right after the GetPage.page function is called and will give you the result of the function. and take the widget that will be showed. + +### OnPageDispose + +This function will be called right after disposing all the related objects (Controllers, views, ...) of the page. + +## [3.20.1] +* Fix wrong reference with unnamed routes and added more tests + +## [3.20.0] - Big update +* Added GetConnect. +- GetConnect is an easy way to communicate from your back to your front. With it you can: +- Communicate through websockets +- Send messages and events via websockets. +- Listen to messages and events via websockets. +- Make http requests (GET, PUT, POST, DELETE). +- Add request modifiers (like attaching a token to each request made). +- Add answer modifiers (how to change a value field whenever the answer arrives) +- Add an authenticator, if the answer is 401, you can configure the renewal of your JWT, for example, and then it will again make the http request. +- Set the number of attempts for the authenticator +- Define a baseUrl for all requests +- Define a standard encoder for your Model. +- Note1: You will never need to use jsonEncoder. It will always be called automatically with each request. If you define an encoder for your model, it will return the instance of your model class ALREADY FILLED with server data. +- Note2: all requests are safety, you do not need to insert try / catch in requests. It will always return a response. In case of an error code, Response.hasError will return true. The error code will always be returned, unless the error was a connection error, which will be returned Response.hasError, but with error code null. +- These are relatively new features, and also inserted in separate containers. You don't have to use it if you don't want to. As it is relatively new, some functions, such as specific http methods, may be missing. +* Translation to Korean (@rws08) +* Fix Overlays state (@eduardoflorence) +* Update chinese docs (@jonahzheng) +* Added context.isDarkMode to context extensions + + +## [3.17.1] +- Allow list.assignAll, map.assignAll and set.assignAll operate with null values + +## [3.17.0] +- Added GetCupertinoApp +- Added initial suport to navigator 2.0 + +## [3.16.2] +- Clean RxList, RxMap and RxSet implementation +- Now when declaring an `RxList()`, it will be started empty. If you want to start a null RxList, you must use `RxList(null)`. +Improved GetStream to receive the same parameters as the StreamController, such as `onListen`, `onPause`, `onResume` and `onCancel`. +- Improve docs + +## [3.16.1] +- Fix compilation error on master + +## [3.16.0] +- Documentation translated into Russian language. (@Renat Fakhrutdinov, @Doaxan and @BatttA) +- Added error message callback for StateMixin (@eduardoflorence) +- Fix incorrect Get.reference when pop route (@4mb1t) +- Added Uppercase/Capital letter on GetUtils (@AleFachini) +- Redraw the Streams api to use GetStream instead of StreamControllers. Why this change? +Dart provides a Streams API that is really rich. However, asynchronous streams add extra latency to ensure that events are delivered in the exact order. +It is not yet known whether this latency has any performance impact in mobile applications, and probably not, however, as GetX is also a server-side framework, we need to have the lowest latency at all, since our base is shared. +Dart also has a Synchronous Streams api that has very low latency, however, it is not suitable for use in state management for two reasons: +1- Synchronous Streams can only have one listen (see the issue opened by Hixie on dart lang for reference: https://github.com/dart-lang/sdk/issues/22240). +This means that we cannot use this api for more than one listener, which is the basis of global state management, where we aim to change the state of more than one location. You can test this with this simple snippet: + +```dart +void main() { + var controller = StreamController(sync: true); + var stream = controller.stream; + stream.listen((data) { + print('$data'); + if (data == 'test4') controller.add('test5'); + }); + + print('test1'); + controller.add('test2'); + stream.listen((event) {}); // second listen throws a exception + print('test3'); + controller.add('test4'); + print('test6'); + controller.add('test7'); + print("test8"); +} +``` +2- Even with a single listener, the dart's Synchronous Streams api cannot deliver events in the exact order. We plan to work on a PR in the future at dart-lang to address this. So if we remove the line above that causes the exception, we will have the following output in the log: + +```dart +void main() { + var controller = StreamController(sync: true); + var stream = controller.stream; + stream.listen((data) { + print('$data'); + if (data == 'test4') controller.add('test5'); + }); + + print('test1'); + controller.add('test2'); + // stream.listen((event) {}); // second listen throws a exception + print('test3'); + controller.add('test4'); + print('test6'); + controller.add('test7'); + print("test8"); +} +///////////////////// log: +test1 +test2 +test3 +test4 +test6 +test8 +test5 + +``` +As we can see, test 4 skips to test 6, which skips to test 8, which skips to test 5. Note that test 7 didn't even appear in the log. + +However, if we work with GetStream, everything works as expected: +```dart +void main() { + var controller = GetStream(); + var stream = controller.stream; + stream.listen((data) { + print('$data'); + if (data == 'test4') controller.add('test5'); + }); + + print('test1'); + controller.add('test2'); + // stream.listen((event) {}); // second listen throws a exception + print('test3'); + controller.add('test4'); + print('test6'); + controller.add('test7'); + print("test8"); +} +///////////////////// log: +test1 +test2 +test3 +test4 +test5 +test6 +test7 +test8 + +``` + +The dart documentation is clear that this api should be used with caution, and in view of these tests, we were sure that it is not stable enough to be used as the core of our state management, nor of the websockets notifications and get_server requests. + +Clarification about the controversy over benchmarks: +In a version prior to changeLog, we talked about the 9000% difference in performance between Streams, and GetStreams that ended up causing a lot of controversy in the community. +Initially, we would like to clarify that this does not mean that you will have mobile applications 9000% faster. Only that one of our main resources, showed itself with a high rate of requests, 9000% faster than using traditional streams. In a real world scenario, you will hardly have so many simultaneous requests. +Skia renders frames on new devices at up to 120fps. This means that if you have a 10 second animation, you will have 1200 reconstructions. Unless you are working with animations, or something that requires rendering at the skia boundary, you won't need that much power. So this does not mean that we are revolutionizing the mobile world, only that we have created an alternative to Stream Sincronas, which works as expected, and which has satisfactory performance for low latency resources. The benchmarks are real, but that does not mean that you will have mobile applications 9000% faster, but that you have a new feature that performs at this level to use. +For reference only, the benchmark can be found ([HERE](https://github.com/jonataslaw/getx/blob/master/test/benchmarks/benckmark_test.dart)) + +In short: asynchronous streams from dart work perfectly, but add a latency that we want to remove on Get_server. +Synchronous dart streams have unexpected behaviors, cannot have more than 1 listener and do not deliver events in the correct order, which completely prevents their use in mobile state managements, since you run the risk of displaying data on the wrong screen, since the last event will not always be the last event entered by the sink. +The 9000% figures are real, however, they refer to the gross performance between Streams and GetStreams. This does not mean that this number will impact your applications, because you are unlikely to use all of that power. + + +## [3.15.0] - Big update +- **Improve Performance**: We made modifications to make GetBuilder even faster. We have improved the structure behind it so that listeners are notified faster. Perhaps in version 4.0 everything will be based on this new structure, but maintaining the power and compatibility with streams. If you want to know how much Getx is faster than pure streams or ChangeNotifier (even after the last update using LinkedList), you can create run the repository tests at: (https://github.com/jonataslaw/getx/blob/master/test/benchmarks/benckmark_test.dart) +- **Added StateMixin** +StateMixin allows you to change the state of the controller, and display a loading, an error message, or a widget you want with 0 boilerplate. This makes things like API/Rest communication or websocket absurdly simple, and it's a real revolution in how state management has behaved so far. +You no longer need to have a ternary in your code, and you don't need a widget like FutureBuilder, StreamBuilder or even Obx/GetBuilder to encompass your Visibility. This will change with the way you manage the state of your controllers, decrease your boilerplate absurdly, and give you more security in your code. +- **Added GetNotifier** +GetNotifier is a super and powerful ValueNotifier, which in addition to having the life cycle of the controllers, is extremely fast, and can manage a single state, as a simplified immutable state management solution. +In theory, the only difference between it and GetxController is the possibility of setting an initial value in the constructor's super (exactly as ValueNotifier does). If the initial value is null, use GetxController. If you need a starting value, GetNotifier can be more useful and have less boilerplate, but both serve the same purpose: to decouple your visualization layer from your presentation logic. +- Other Fixes and improvements: + - Fixed GetxController is closed twice when smartManagement.full is turn on + - Fixed phone number validation + - Fixed some inconsistencies in GetWidget and the life cycle of controllers + - It made controller testing completely safe with navigation. + - Improve docs (@eduardoflorence) + - Improve security types on routes (@unacorbatanegra) + - Improve code structure with less duplicate code: (@kranfix) + - Fix named route erroring when route does not exist (@FiercestT) + +## [3.13.2] +- Reunification of the package. +During the 2 week period, we try to keep this package as a compilation of smaller packages. We were successful in separating, getx is well decoupled and it was only necessary to send the internal folders as packages to pub.dev, however, it became very complicated to contribute to the package. This is because it was necessary to clone the repository, replace all pubspec packages with local paths, and after modification, return the original paths to do the PR. With that, the frequency of updates, which was about 4 to 5 days, became almost 2 weeks, and this is not legal for a community as active as Getx, which uses this package precisely in addition to being modern and performance, be constantly improving. This led contributors to the conclusion that getx works best together. +Additional packages will continue to be maintained, and will have the same base as the main package, however, development will take place in the full and main package, and as the addition of new features or bug fixes arrives, we will migrate to the individual packages . Getx reached the mark of 50 contributors today, more than 1500 likes in the pub, and will continue to make development easy. + +## [3.13.1] +- Remove spaces whitespaces from dart files +- +## [3.13.0] +- Fix typos on code and docs (@wbemanuel and @Goddchen) +- Improve: typedef to GetBuilder and Getx widgets +- Improve behaviour of null route on lastest flutter version (@FiercestT) +- Fix onReady called twice on smartManagement.onlyBuilders +- Fix onClose called twice when GetBuilder is used +- Fix default customTransitions, and defaultDuration be ignored on unnamedRoutes +- Transition.native use default Flutter transitions +- Added Get.testMode to use contextless elements on unit tests +- Added Get.appUpdate and improve Get.forceAppUpdate + +## [3.12.1] +- Remove spaces whitespaces from dart files + +## [3.12.0] +- Added BottomSheet Duration && Export SingleGetTickerProvider (@unacorbatanegra) +- Improve docs from dependencies management (@ngxingyu) +- Fix unknownRoute with null Custom Transition (@marcosfons) +- Optimize capitalize method (@zl910627) +- Added Chinese documentation (@idootop) +- Added TextDirection property on GetMaterialApp to improve RTL layout (@justkawal) +- Remove unnecessary files on git (@nipodemos) +- Fix tags on Get.create() and GetWidget() (@roipeker) +- Update mockito dependency on getTests +- Added GetStatelessWidget, a StatelessWidget base to GetWidget with lifecycle control of controllers. Note: It's a base class, you don't need change to use it or change your GetView, GetWidget StatelessWidget to It. + +## [3.11.1] +- Fix docs + +## [3.11.0] +- Refactor structure from scratch to split GetX completely into separate packages. When using the main package (get) you will have everything working perfectly together. However, if you only want one of the resources, you can use the packages separately. +- Improve Rx types +- Added RTL support +- Added GetTests, a set of tools to help you create unit tests using Getx +- RAM consumption improved by dividing resources into smaller components, preventing related classes that are unnecessary from being loaded +- Fix example app (missing activity) (@Grohden) +- Added Get.create() lifecycle (@roipeker) +- Added section Contribution videos and articles in Readme (@stefandevo) +- fix isNullOrBlank extension +- Added all operators overload (@grohden) +- Fixes subscription for Rx::bindStream (@roipeker) +- Added Ability to use tags with GetX widgets (@na2axl) +- Change Arguments from Object to dynamic (@roipeker) +- Added Persistent bottomsheet (@mohak852) +- Improve extensions tests (@Nipodemos) +- Refactor Route Observer (@grohden) +- Added print extensions (@unacorbatanegra) +- Update PT-br Readme (@eduardoflorence) +- Fix analyzer crash (@eduardoflorence) +- Fix for switch types usages in GetUtils (@grohden) +- Improvement: RxList, RxSet and RxMap null check in the constructor (@Hitsu91) +- Improve readme example (@dafinoer) + +## [3.10.2] +- Fixed the use of tags with lazyPut and added Ability to overwrite "tag" in GetView and GetWidget. + +## [3.10.1] +- Fix analyzer + +## [3.10.0] +Getx 3.10 released with CLI and Get Server. +- Added: analyser + effective dart (@Grohden) +- Added TextStyle to generalDialog title and message (@roipeker) +- renamed and added defaults transition duration and types in "GetInterface" (@roipeker) +- added missing parameters in Get.to/Get.offAll (@roipeker) +- added optional transitionDuration and transitionCurve to Get.dialog() (@roipeker) +- Changed HashMap to HashSet and allow update IDs groups on GetBuilder (@roipeker) +- Added a internal VoidCallback in GetStateUpdaterMixin::getUpdate (@roipeker) +- Added Curve property to routes (@roipeker) +- Improve docs, code cleanup, new GetStateUpdaterMixin and GetStateUpdate in favour of StateSetter on GetxController, GetBuilder, SimpleBuilder. (@roipeker) +- Added RxBool.toggle() as an easy shortcut for switching true/false values. (@roipeker) +- Added _RxImp.nil() to easily set the value to null (@roipeker) +- Added missing docs to Rx classes. (@roipeker) +- Added Get.delete(force:false) to Get extensions (@roipeker) +- Added Docs and comments (@nipodemos) +- Added docs to PT-br and fix typos (@eduardoflorence) +- Cleanup route code (@justkawal) +- Extension to facilitate insert widgets inside a CustomScrollView (@alexkharech) +- Fix docs .obs examples (@kai-oswald) +- Added tag capability to GetView +- Improve code separation of RouteManagement and Internacionalization + +## [3.8.0] +- Added: Snackbar Status: Open, Opening, Closing and Closed +example: +```dart + Get.snackbar('title', 'message', snackbarStatus: (status) { + if (status == SnackbarStatus.CLOSED) { + // made anything + } + }); +``` + +## [3.7.0] +- Added: RxSet. Sets can now also be reactive. +- Added isDesktop/isMobile (@roipeker) +- Improve GetPlatform: It is now possible to know which device the user is using if GetPlatform.isWeb is true. +context.responsiveValue used device orientation based on web and non-web applications. Now it checks if it is a desktop application (web or desktop application) to do the responsiveness calculation. (@roipeker) +- Change: The documentation previously stated that Iterables should not access the ".value" property. +However, many users did not pay attention to this fact, and ended up generating unnecessary issues and bugs in their application. +In this version, we focus on code security. Now ".value" is protected, so it cannot be accessed externally by Lists, Maps or Sets. +- Change: Observable lists are now Dart Lists. +There is no difference in your use: +`RxList list = [].obs;` +And you use +`List list = [].obs;` +- Change: You do not need to access the ".value" property of primitives. +For Strings you need interpolation. +For num, int, double, you will have the normal operators, and use it as dart types. +This way, `.value` can be used exclusively in ModelClasses. +Example: + +```dart +var name = "Jonny" .obs; +// usage: +Text ("$name"); + +var count = 0.obs; +// usage: +increment() => count ++; +Text("$count"); +``` + +Thus: List, Map, Set, num, int, double and String, as of this release, will no longer use the .value property. + +NOTE: +The changes were not break changes, however, you may have missed the details of the documentation, so if you faced the message: "The member 'value' can only be used within instance members of subclasses of 'rx_list.dart' "you just need to remove the" .value "property from your list, and everything will work as planned. +The same goes for Maps and Sets. + +## [3.6.2] +- Fix more formatting issues + +## [3.6.1] +- Fix formatting issues + +## [3.6.0] +- Added RxSet +- Change default logger to developer.log (@jorgegaticav) +- Added BindingsBuilder, ValueBuilder, and ObxValue (@roipeker) +- Fix fallback locale not working if missing country code (@thaihuynhxyz) +- Fix validation of email ".com.br" + +## [3.5.1] +- Remove unnecessary whitespaces + +## [3.5.0] +- Added logwritter (@stefandevo) +- Added responsiveValue (@juanjoseleca) +- Fixed ghost url for snackbar, bottomsheets, and dialogs and unnamed navigation. + +## [3.4.6] +- Fix TextField dispose throw on last Flutter hotfix + +## [3.4.5] +- Fix typo on RxList.remove that could cause type errors. +- Remove initialization console print + +## [3.4.4] +- Fix exception 'isInit called null' when tags are used in conjunction with dependencies. (@djade007) +- Fix typos (@tiagocpeixoto) + +## [3.4.3] +- Fix onInit fired only first time +- Fix language callback(@lundin) +- Fix docs (@nipodemos) + +## [3.4.2] +- Fix individual imports + +## [3.4.1] +- Structure organization, and improvements. + +## [3.4.0] +- Added '[everAll]' Worker: Listen a List of '.obx' +- Added Workers dispose +- Fix transition.noTransition +- Fix TextField and VideoPlayController dispose before transition animation + +## [3.3.0] +- Fix extensions (@stefandevo) +- Added CPF to utils options (@kauemurakami) +- Added fenix mode to Get.lazyPut. +Use `Get.lazyPut(()=> Controller(), fenix:true)` to have a controller that after being destroyed, has the ability to be recreated in case someone needs it. This is a function that already exists in smartManagement.keepFactory which is now also possible in full mode. +- Fix native transition on android + +## [3.2.2] +- Improve transitions and refactor route system + +## [3.2.1] +- Prevent black blackground on cupertino fullscreenDialog + +## [3.2.0] +- Improve GetBuilder ram usage +- Added method update to Rx +Now you no longer need to make an entire class reactive to get an element update from it, you can simply call the update method of its instance, like this: +```dart +class User{ + User(this.name = '', this.age = 0); + String name; + int age; +} + +final user = User().obs; + +Obx(()=> Text("Name ${user.value.name}: Age: ${user.value.age}")) + +// To update: +user.update((user){ +user.name = 'Jonny'; +user.age = 18; +}); +``` + +Now is also possible to access a value without using the ".value". Just open and close parentheses. +In the previous example, you could do: +```dart +user().name; // before: user.value.name +``` +And it is also possible to set a value without using the value, inserting the value directly into the variable. +```dart +user(User('João', 35)); // before: user.value = User('João', 35) +``` +Added fenix mode to Get.lazyPut. + + +## [3.1.4] +- Update readme banner + +## [3.1.3] +- Activate unknownRoute on version 3 +- Go back transitions.size and transitions.cupertino + +## [3.1.2] +- Expose GetInstance + +## [3.1.1] +- Improvement .obs methods + +## [3.1.0] +- Added extensions to GetUtils and fix typo on GetUtils.isEmail (@stefandevo) +- Added .gitignore file (@hdeyana) + +## [3.0.1] +- Breaking changes on Rx api and GetController and RxController were merged, and now you only have the 'GetxController' +- Refactor routing system. Now you can add custom transitions and more +- Improved the use of dynamic routes, you can now define two different pages according to your arguments. +- Added GetView widget +- Added internacionalization +- Added validations +- Added Get queqe +- Added GetStorage (with separated package) +- Minor bug fixes. + + +## [2.14.0] +- Added getPages API. +- Deprecated namedPages +- Fix default transition +- Added Duration on Get.offAll(@kluverua) + +## [2.13.1] +- Added sort to ListX +- Prepared the framework for version 3 + +## [2.13.0] +- Added Get.focusScope + +## [2.13.0] +- Update docs +- Fix Bindings list on GetPageRoute + +## [2.12.5] +- Update readme + +## [2.12.4] +- Prevent exceptions on onReady with nullables + +## [2.12.3] +- Fix List lenght == null + +## [2.12.2] +- Fix Workers + +## [2.12.1] +- Added: onReady on Controllers LifeCycle +- Added: Observable maps +- Refactor: observable variables that now consume even less RAM. + +## [2.11.3] +- Type parameters and added docs + +## [2.11.2] +- Added docs +- Improvement performance of Obx + +## [2.11.1] +- Fixed: oninit calling only once. + +## [2.11.0] +- Added Permissions: +You can now revoke permissions to SmartManagement so that it cannot delete a particular controller. +Add to Get.put (Controller(), permanent: true); to make it indelible. +Get.lazyPut() will not receive this resource. Initially he had it, but we saw in internal tests that it could cause problems with the bindings API. Bindings were created to initialize and delete an instance, if it were allowed to make a controller started with lazyPut permanent, copies of that Controller would be created every time Binding was called. For the safety of users, especially new users who could easily do this, it was decided that this feature will only be present in Get.put. +- Improve: Now a controller's life cycle has no connection with the View life cycle. It is no longer called internally in an "initState", it is now called when the Controller enters memory. This means that now onInit will always be called, regardless of where you started your dependency. +- removed: this property of the update() method has been permanently removed. + +## [2.10.3] +- GetBuilder refactor. 11% reduction in RAM consumption and 2% in CPU consumption for the sample application. (using as base Flutter for linux desktop). + +- The "this" property of the "update" method has been deprecated and will be removed in the next update. Please don't use it anymore. Just use "update()" now. + +## [2.10.2] +- Fix Get.generalDialog default options + +## [2.10.1] +- Fix broken links on pub +- Fix List empty error + +## [2.10.0] +- Added SmartManagement, your application's memory is managed intelligently like never before! +- Added Obx, a widget that knows when to rebuild a child, without needing any type. +- Added MixinBuilder - If you need to use GetBuilder in conjunction with GetX, use GetxController with this widget, and the changes will occur either using update (this) or changing some reactive variable. Use only if necessary, for better RAM consumption, prefer widgets in that order: +Obx => GetX => GetBuilder => MixinBuilder. +Obx is the lightest of all, and MixinBuilder is a mix of the other 3, whenever possible, use the specific widget. +- Refactor: StateManager of Get. +- Changed: full List API refactor, now value is no longer needed. +- Added Workers: You can hear changes to a variable and trigger custom callbacks. +- Added Bindings API docs. +- Added Portuguese language to readme(@Nipodemos) + +# [2.7.1] +- Improve list to set and get methods + +## [2.7.0] +- Added obx, a simple state interceptor. +- Improve Bindings, ListX, and +- fix docs typos e broken code (@ghprod) + + +## [2.6.3] +- Flutter currently has a problem on some devices where using showModalBottomSheet() can cause TextFields to be hidden behind the keyboard (https://github.com/flutter/flutter/issues/18564) this issue is closed, even users reporting that the problem still occurs. +The problem happens casually, as well as the problem of the snackbar on the iPhone SE 2, and checking the code, I realized that a padding with MediaQuery.of(context).viewInsets.bottom is missing inside the bottomSheet to make it work correctly, since it does not have any constraint with the keyboard. +For stability, I decided not to use the standard Flutter bottomSheet, which contains many bugs, mainly related to keyboard padding, and the lack of respect for topBar's safeArea, and to use a proprietary bottomSheet implementation that is more stable. The Flutter dialog has no problem, so it will be used as the basis for Get.dialog. The bottomSheet will be based on the Flutter bottomSheet Raw API (_ModalBottomSheetRoute), applying bug fixes. +- Added Get.isSnackbarOpen tests + +## [2.6.2] +- Refactor Bindings API + +## [2.6.1] +- Expose Bindings API + +## [2.6.0] +- Added bindings. +You can now add bindings from your controllers to your routes, to prepare GetBuilder or GetX to create a dependency already declared in a Binding class. This feature is in an experimental phase, and will not be documented until the end of the tests. + +## [2.5.10] +- Removed remnants of previousArgs on routeObserver. +This feature had been deprecated in previous updates, and was removed in version 2.5.8. Some remaining references on the routeObserver were causing exceptions in version 2.5.9, and were removed completely in version 2.5.10. + +## [2.5.9] +- Fix Get.find with named instance + +## [2.5.8] +- Added docs +- Added tests(@chimon2000) + +## [2.5.7] +- Fix Get.generalDialog optionals +- Added GetX onInit support + +## [2.5.6] +- GetBuilder refactor to work with lazyPut. +Now you can list your controllers in advance with Get.lazyPut, and only when it is called for the first time will it be relocated in memory. +- Fix english typos(@gumbarros) + +## [2.5.5] +- Fix arguments broken by new methods + +## [2.5.4] +- Refactor methods + +## [2.5.3] +- Fix snackbar padding on iPhone SE 2. +- Added themes docs +- Added ThemeMode (@RodBr) + +## [2.5.2] +- Fix: key not found when Get.key is used with no MaterialApp + +## [2.5.1] +- Improve - GetBuilder uses 18% less ram on more of 20 controllers. + +## [2.5.0] +- Added List.obs +- Now you can transform any class on obs + +## [2.4.0] +- Added GetX, state manager rxDart based. +- Fix error on add for non global controllers + +## [2.3.2] +- Fix close method called on not root GetBuilder + +## [2.3.1] +- Auto close stream inside close method +- Added docs + +## [2.3.0] +- Added interface to GetX support + +## [2.2.8] +- Added api to platform brightness + +## [2.2.7] +- Fix typos + +## [2.2.6] +- Fix cancel button on defaultDialog don't appear when widget implementation usage + +## [2.2.5] +- Refator defaultDialog + +## [2.2.4] +- Clean code +- Fix Get.LazyPut + +## [2.2.3] +- Remove defaultDialog type + +## [2.2.2] +- Fix GetRoute not found + +## [2.2.1] +- Improve lazyPut and fix tag to lazyput(@rochadaniel) + +## [2.2.0] +- Added: Ability to choose or delay a widget's state change according to its ID. +- Added: Ability to fire triggers when loading materialApp. +- Added: Ability to change theme dynamically. +- Added: Ability to rebuild the entire app with one command. +- Added: Ability to trigger events on the MaterialApp. +- Added: Get.lazyPut (lazy loading of dependencies). +- Added: Get.creator - a factory of dependencies . +- Added: Capability of define abstract class on dependencies. + +## [2.1.2] +- Get.defaultDialog refactor + +## [2.1.1] +- fix typo + +## [2.1.0] +- Added Get.rawSnackbar +- Added instantInit config to snackbars +- Refactor Get Instance Manager +- Improved performance and bug fix to Get State Manager +- Improved performance of GetRoute on namedRoutes +- Hotfix on namedRoutes + +## [2.0.10] +- Bump new Flutter version +- Added Get.generalDialog + +## [2.0.6] +- Fix typo on readme + +## [2.0.5] +- Changing the bottomsheet API to comply with the documentation. + +## [2.0.4] +- Fix type not found in some versions of Flutter stable + +## [2.0.3] +- Update Docs + +## [2.0.2] +- Update GetObserver + +## [2.0.1] +- Fix docs and typos + +## [2.0.0] +- Added easy state manager +- Change dialog API +- Added GetMaterialApp +- Added new experimental APIs +- Improve Observer +- Added default duration on Transitions +- Added new routeNamed sistem +- Added Global stateManager config +- Improve Get instance manager +- Added routingCallback +- Added closeOverlays to Get.back +- Added dynamic urls +- Cleaner code +- Improve lib performance +- Many others minor APIs added + +## [1.20.1] +- Improve: Get.finds + +## [1.20.0] +- Added Get Instance Manager + Get.put / Get.find / Get.delete + +## [1.19.1] +- Fix default transitions for namedRoutes + +## [1.19.0] +- Added nested navigators + +## [1.18.0] +- Added SafeArea to bottomsheets +- Added docs + +## [1.17.0] +- Added experimental APIs + + +## [1.16.1] +- Improve: GetObserver + +## [1.16.0-dev] +- Added Get config +- Added logEnable +- Added Default transition +- Added default popGesture behaviour +- Added overlayContext +- Fix Duration transition + +## [1.14.1-dev] +- Fix ternary on new dart version + +## [1.14.0-dev] +- Added compatibility with Flutter 1.17.1 +- Added back popGesture to iOS (default) and Android (optional) +- Improve performance +- Decrease lib size to 94.9kb (25.4k after compiled on release) + +## [1.13.1-dev] +- Fix back function + +## [1.13.0-dev] +- Plugin refactor +- Added GetPlatform + +## [1.12.0-dev] +-Compatibility with Dev branch + +## [1.11.4] +- Refactor code of library + +## [1.11.3] +-Added docs + + +## [1.11.2] + -Fix flutter web platform and added GetPlatform + +## [1.11.1] + -Improve swipe to back on iOS devices + + ## [1.11.0] + -Added experimental GetCupertino + +## [1.10.5] + -Added setKey to improve modular compatibility + -Added ability to define transition duration directly when calling the new route. + +## [1.10.4] + -Improve Get.offAll() - predicate now is optional + +## [1.10.3] + -Improve default color from dialogs + + ## [1.10.2] + -Improve snackbar text color + -Added background color to snackbar (@claudneysessa) + + ## [1.10.1] + -Backdrop improvement + +## [1.10.0] + -Added backdrop + +## [1.9.2] + -Added docs to GetObserver + + ## [1.9.1] + -Fix typo on snackbar route + +## [1.9.0] + -Added: Navigator observer + -Added: Get.args to named routes + -Improve snackbar performance + +## [1.8.1] + -Fix new snackbar features + +## [1.8.0] + -Add Get.close method. + -Add many Snackbars features + +## [1.7.4] + -Fix dialog child error + +## [1.7.3] + -Added transitions docs + +## [1.7.2] + -Fix bottomsheet on macos + +## [1.7.1] + -Fix docs + +## [1.7.0] + + - Improve geral performance. Get.to Wrap now consumes even less RAM and CPU. In an application with 20 screens, it obtained 82% less RAM usage compared to the traditional method Navigator.push and had a CPU normalization of 23% in a Moto z2, against 64% CPU usage in Navigator.push with MaterialPageRoute. Test it for yourself! + - Added BottomSheet with no context + - Added modern Blur Snackbar + - Added customs transitions + - Improve dialogs performance + +## [1.6.4] + + - Improve performance. + +## [1.6.3] + + - Clean code. + +## [1.6.2] + + - Fix bugs on blurred Snackbars + +## [1.6.1] + + - Add docs and improve performance + +## [1.6.0] + + - Add support to snackbars + +## [1.5.0+1] + + - Add color and opacity to dialogs + +## [1.5.0] + + - Add support to dialogs + +## [1.4.0+7] + + - Add more documentation + +## [1.4.0+6] + +- Improve performance and bug fix + +## [1.4.0] + +- Added Get.removeRoute // ability to remove one route. + Get.until // back repeatedly until the predicate returns true. + Get.offUntil // go to next route and remove all the previous routes until the predicate returns true. + Get.offNamedUntil // go to next named route and remove all the previous routes until the predicate returns true. + +## [1.3.4] + +- Improve performance + +## [1.3.3] + +- Fix Get.back arguments + +## [1.3.2] + +- Improve performance + +## [1.3.1] + +- Update docs + +## [1.3.0] + +- Update docs, readme, and add full support to flutter_web + +## [1.2.1] + +- Fix bug currentState = null + + +## [1.2.0] + +- Add routes navigation with no context + +## [1.1.0] + +- Add support to named routes + +## [1.0.3] + +- Improve Performance + +## [1.0.2] + +- Add examples + +## [1.0.1] + +- Doc changes + +## [1.0.0] + +- initial release diff --git a/siro_rider/packages/get/LICENSE b/siro_rider/packages/get/LICENSE new file mode 100644 index 0000000..2fb920b --- /dev/null +++ b/siro_rider/packages/get/LICENSE @@ -0,0 +1,21 @@ +MIT License + +Copyright (c) 2019 Jonny Borges + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. \ No newline at end of file diff --git a/siro_rider/packages/get/README-ar.md b/siro_rider/packages/get/README-ar.md new file mode 100644 index 0000000..e7b364d --- /dev/null +++ b/siro_rider/packages/get/README-ar.md @@ -0,0 +1,1307 @@ +![](https://raw.githubusercontent.com/jonataslaw/getx-community/master/get.png) + +[![pub package](https://img.shields.io/pub/v/get.svg?label=get&color=blue)](https://pub.dev/packages/get) +[![popularity](https://badges.bar/get/popularity)](https://pub.dev/packages/sentry/score) +[![likes](https://badges.bar/get/likes)](https://pub.dev/packages/get/score) +[![pub points](https://badges.bar/get/pub%20points)](https://pub.dev/packages/get/score) +![building](https://github.com/jonataslaw/get/workflows/build/badge.svg) +[![style: effective dart](https://img.shields.io/badge/style-effective_dart-40c4ff.svg)](https://pub.dev/packages/effective_dart) +[![Discord Shield](https://img.shields.io/discord/722900883784073290.svg?logo=discord)](https://discord.com/invite/9Hpt99N) +[![Get on Slack](https://img.shields.io/badge/slack-join-orange.svg)](https://communityinviter.com/apps/getxworkspace/getx) +[![Telegram](https://img.shields.io/badge/chat-on%20Telegram-blue.svg)](https://t.me/joinchat/PhdbJRmsZNpAqSLJL6bH7g) + +Awesome Flutter + +Buy Me A Coffee + +![](https://raw.githubusercontent.com/jonataslaw/getx-community/master/getx.png) + +
+ +**Languages:** + +[![English](https://img.shields.io/badge/Language-English-blueviolet?style=for-the-badge)](README.md) +[![Vietnamese](https://img.shields.io/badge/Language-Vietnamese-blueviolet?style=for-the-badge)](README-vi.md) +[![Indonesian](https://img.shields.io/badge/Language-Indonesian-blueviolet?style=for-the-badge)](README.id-ID.md) +[![Urdu](https://img.shields.io/badge/Language-Urdu-blueviolet?style=for-the-badge)](README.ur-PK.md) +[![Chinese](https://img.shields.io/badge/Language-Chinese-blueviolet?style=for-the-badge)](README.zh-cn.md) +[![Portuguese](https://img.shields.io/badge/Language-Portuguese-blueviolet?style=for-the-badge)](README.pt-br.md) +[![Spanish](https://img.shields.io/badge/Language-Spanish-blueviolet?style=for-the-badge)](README-es.md) +[![Russian](https://img.shields.io/badge/Language-Russian-blueviolet?style=for-the-badge)](README.ru.md) +[![Polish](https://img.shields.io/badge/Language-Polish-blueviolet?style=for-the-badge)](README.pl.md) +[![Korean](https://img.shields.io/badge/Language-Korean-blueviolet?style=for-the-badge)](README.ko-kr.md) +[![French](https://img.shields.io/badge/Language-French-blueviolet?style=for-the-badge)](README-fr.md) +[![العربيه](https://img.shields.io/badge/Language-arabic-blueviolet?style=for-the-badge)](README-ar.md) + +
+
+ +- [عن المكتبة](#عن-المكتبة) +- [التركيب](#التركيب) +- [بناء تطبيق العداد 🔢](#بناء-تطبيق-العداد-) +- [The Three pillars](#the-three-pillars) + - [State management](#state-management) + - [Reactive State Manager](#reactive-state-manager) + - [More details about state management](#more-details-about-state-management) + - [Route management](#route-management) + - [More details about route management](#more-details-about-route-management) + - [Dependency management](#dependency-management) + - [More details about dependency management](#more-details-about-dependency-management) +- [Utils](#utils) + - [Internationalization](#internationalization) + - [Translations](#translations) + - [Using translations](#using-translations) + - [Using translation with singular and plural](#using-translation-with-singular-and-plural) + - [Using translation with parameters](#using-translation-with-parameters) + - [Locales](#locales) + - [Change locale](#change-locale) + - [System locale](#system-locale) + - [Change Theme](#change-theme) + - [GetConnect](#getconnect) + - [Default configuration](#default-configuration) + - [Custom configuration](#custom-configuration) + - [GetPage Middleware](#getpage-middleware) + - [Priority](#priority) + - [Redirect](#redirect) + - [onPageCalled](#onpagecalled) + - [OnBindingsStart](#onbindingsstart) + - [OnPageBuildStart](#onpagebuildstart) + - [OnPageBuilt](#onpagebuilt) + - [OnPageDispose](#onpagedispose) + - [Other Advanced APIs](#other-advanced-apis) + - [Optional Global Settings and Manual configurations](#optional-global-settings-and-manual-configurations) + - [Local State Widgets](#local-state-widgets) + - [ValueBuilder](#valuebuilder) + - [ObxValue](#obxvalue) + - [Useful tips](#useful-tips) + - [StateMixin](#statemixin) + - [GetView](#getview) + - [GetResponsiveView](#getresponsiveview) + - [How to use it](#how-to-use-it) + - [GetWidget](#getwidget) + - [GetxService](#getxservice) + - [Tests](#tests) + - [Tips](#tips) + - [Mockito or mocktail](#mockito-or-mocktail) + - [Using Get.reset()](#using-getreset) + - [Get.testMode](#gettestmode) +- [Breaking changes from 2.0](#breaking-changes-from-20) +- [Why Getx?](#why-getx) +- [Community](#community) + - [Community channels](#community-channels) + - [How to contribute](#how-to-contribute) + - [Articles and videos](#articles-and-videos) + +# عن المكتبة + +- `GetX` مكتبه خفيفه وقوية لفلاتر , توفر المكتبه السرعه العاليه في التحكم في الحاله , نظام حقن `Ddependency injection` ذكي , والتحكم في التنقل بين الصفحات بسرعه وسهوله + +- `GetX` +- تعتمد علي 3 نقاط اساسية . **الانتاجية والسرعه والتنظيم** + + - **السرعه:** `GetX` تركز علي السرعه واقل استخدام للموارد,`GetX` لا تستخدم `Streams` او `ChangeNotifier`. + + - **الانتاجية:** `GetX` تستخدم طريقه سهله ومريحة في كتابة الكود , لا يهم ماذا تريد انت تبني , يوجد دائما طريقه اسهل لبناء باستخدام `GetX` , ستوفر ساعات من العمل وتوفر لك اعلي سرعه يمكن الوصل لها في تطبيقاتك عموما , يجب ان يهتم المطور بالتخلص من الموارد الغير مستخدمه من الذاكرة , مع `GetX` هذا غير ضروري لانه يتم التخلص من الموارد الغير مستخدمه من الذاكره تلقائيا, اذا اردت تركهم دائما في الذاكرة يمكنك ذلك لكن يجب عليك ان تستخدم `permanent: true` بالاضافه الي توفير الوقت تم تقليل امكانية ترك الموارد في الذاكره بدون التخلص منها , يتم حقن الموارد `lazy` افتراضيا + + - **التنظيم:** `GetX` تسمح لك بفصل الـ `view` عن الـ `presentation logic` و `business logic` باكامل, + بالنسبة للحقن `dependency injection` و التنقل بين الشاشات لا تحتاج فيهم `context` للتنقل بين الصفحات , ولا تحتاك `context` للوصول للموارد عن طريق widget tree, لذلك يتم الفصل بالكامل بين `presentation logic` و `business logic` لا تحتاج لحقن ال `Controllers/Models/Blocs` + داخل شجره العناصر `Widget Tree` خلال `MultiProvider`s. + لان , `GetX` تستخدم نظام حقن خاص بها ويمكنك من فصل الـ `DI` عن الوجهات بالكامل . + +- مع `Getx` تعرف ايه يكون الكود الخاص ب كل جزء في التطبيق , تساعدك في كتابة كود نظيف , بالاضافه الي سهوله التطوير مستقبلا , وهذا يمكنك من مشاركه الاجزاء `modules` امر صعب ليصبح سهل جدا . + `BLOC` كان نقطه البداية لهذا الامر وتظيم الكود بهذه الطريقه في فلاتر , عن طريق فصل كود البزنس عن الواجهات , `GetX` هي التطور لذلك الامر , وذلك عن طريق الاضافه الي ذلك فصل حقن الموارد وفصل التنقل بين الشاشات ايضا , وطبقه البيانات بالكامل ايضا , تعلم اين يكون كل شي في المشروع + +- `Getx` توفر لك السهوله في بناء المشروع والاستقرار كلما كبر حجم المشروع واقصي سرعه ممكن , توفر لك ايضا نظام كامل يعمل في تجانس تام , سهل للمبتدئين , ومنظم للخبراء , امن , مستقر , ومحدث باستمرار ويوفر لك موجموعه من الادوات لتسهل عليك + +- `GetX` ليست ضخمه , تمتلك المكتبة العديد من المميزات تجعلك تبدا في البرمجه بدون القلق عن اي شي كل ميزه منهم منقسمه عن الاخري ولا يبداو الا عندما تستخدمهم , اذا استخدمت جزء التحكم في الحاله فقط لن يتم استخدام جزء التنقل بين الشاشات في تطبيقك الا `Compiled` والعكس صحيح ! . + +-`Getx` لديها نظام شامل , ومجتمع كبير , وعداد كبير من المطورين , وسوف يتم تحديثها باستمرار , تعمل المكتبة علي كل الانظمه بنفس الكود دون تغيير `Android`, `iOS`, `Web`, `Mac`, `Linux`, `Windows` حتي علي الخادم يمكنك استخدام `Getx` لبناء تطبيقات الويب +**[Get Server](https://github.com/jonataslaw/get_server)**. + +**بالاضافه الي ذلك يمكن محاكاه الامر اكثر في فلاتر والخادم عن طريق [Get CLI](https://github.com/jonataslaw/get_cli)**. + +**وللمزيد من الانتاجية يمكنك استخدام اضافه للـ** + +- [فيجوال ستوديو كود](https://marketplace.visualstudio.com/items?itemName=get-snippets.get-snippets) +- [اندرويد استوديو و انتلج](https://plugins.jetbrains.com/plugin/14975-getx-snippets) + +# التركيب + +استخدم المكتبة في ملف `pubspec.yaml` + +
+ +```yaml +dependencies: + get: +``` + +
+استدعي المكتبة في الملفات الي ستستخدمها +
+ +```dart +import 'package:get/get.dart'; +``` + +
+ +# بناء تطبيق العداد 🔢 + +تطبيق العداد الذي يتم انشاء مع كل مشروع جديد يتعدي ال 100 سطر (بالتعليقات) ولكي اريك مدي قوه `GetX` +ساوضح لك كيفيه بناء التطبيق مع تغير قيمه العداد مع كل ضغطه زر والتقل بين الشاشات ومشاركه الحاله كل ذلك بطريقه منذمه وفصل تام لكود البزنس عن الواجهات فقط ب 26 سطر من ضمنهم التعليقات 🔥 + +- الخطوه الاولي : + اكتب `Get` امام `MaterialApp` لتصبح `GetMaterialApp` + +
+ +```dart +void main() => runApp(GetMaterialApp(home: Home())); +``` + +
+ +- ملحوظه : هذا لا يعتبر تعديل علي `MaterialApp` لان , `GetMaterialApp` عباره عن عنصر معد مسبقا ويستخدم `MaterialApp` تحت الغطاء , يمكن تغير الاعدادات يدوين لكن هذا غير ضروري لان ``سيقوم بعمل المسارات و حقن العناصر والترجمه وكل شي تحتاجه ولكن اذا كنت تنوي لاستخدام المكتبة فقط للتحكم في الحاله`State managment`فهذه الخطوه غير ضرورية تكون هذه الخطوه ضرورية عندما تريد التنقل بين الشاشات او عرض`snackbars`والترجمه و اي شي يعتمد علي`context`وتقوم`getx` بتوفيره + +- الخطوه الثانية + قم بكتابة الكود داخل `class` وكتابة المتغيرات والدوال , يمكنك جعل المتغير قابلع لاعاده بناء الواجها عند تغير قيمته باستخدام ال `getter` `.obs` . + +
+ +```dart +class Controller extends GetxController{ + var count = 0.obs; + increment() => count++; +} +``` + +
+ +- الخطوه الثالثه +ابني الواجهه واستخدم `StatelessWidget` لتوفير الموارد , مع `Getx` يمكنك الاستغناء عن `StatefulWidget`. +
+ +```dart +class Home extends StatelessWidget { + + @override + Widget build(context) { + + // Instantiate your class using Get.put() to make it available for all "child" routes there. + final c = Get.put(Controller()); + + return Scaffold( + // Use Obx(()=> to update Text() whenever count is changed. + appBar: AppBar(title: Obx(() => Text("Clicks: ${c.count}"))), + + // Replace the 8 lines Navigator.push by a simple Get.to(). You don't need context + body: Center(child: ElevatedButton( + child: Text("Go to Other"), onPressed: () => Get.to(Other()))), + floatingActionButton: + FloatingActionButton(child: Icon(Icons.add), onPressed: c.increment)); + } +} + +class Other extends StatelessWidget { + // You can ask Get to find a Controller that is being used by another page and redirect you to it. + final Controller c = Get.find(); + + @override + Widget build(context){ + // Access the updated count variable + return Scaffold(body: Center(child: Text("${c.count}"))); + } +} +``` + +
+ +Result: + +![](https://raw.githubusercontent.com/jonataslaw/getx-community/master/counter-app-gif.gif) + +This is a simple project but it already makes clear how powerful Get is. As your project grows, this difference will become more significant. + +Get was designed to work with teams, but it makes the job of an individual developer simple. + +Improve your deadlines, deliver everything on time without losing performance. Get is not for everyone, but if you identified with that phrase, Get is for you! + +# The Three pillars + +## State management + +Get has two different state managers: the simple state manager (we'll call it GetBuilder) and the reactive state manager (GetX/Obx) + +### Reactive State Manager + +Reactive programming can alienate many people because it is said to be complicated. GetX turns reactive programming into something quite simple: + +- You won't need to create StreamControllers. +- You won't need to create a StreamBuilder for each variable +- You will not need to create a class for each state. +- You will not need to create a get for an initial value. +- You will not need to use code generators + +Reactive programming with Get is as easy as using setState. + +Let's imagine that you have a name variable and want that every time you change it, all widgets that use it are automatically changed. + +This is your count variable: + +```dart +var name = 'Jonatas Borges'; +``` + +To make it observable, you just need to add ".obs" to the end of it: + +```dart +var name = 'Jonatas Borges'.obs; +``` + +And in the UI, when you want to show that value and update the screen whenever the values changes, simply do this: + +```dart +Obx(() => Text("${controller.name}")); +``` + +That's all. It's _that_ simple. + +### More details about state management + +**See an more in-depth explanation of state management [here](./documentation/en_US/state_management.md). There you will see more examples and also the difference between the simple state manager and the reactive state manager** + +You will get a good idea of GetX power. + +## Route management + +If you are going to use routes/snackbars/dialogs/bottomsheets without context, GetX is excellent for you too, just see it: + +Add "Get" before your MaterialApp, turning it into GetMaterialApp + +```dart +GetMaterialApp( // Before: MaterialApp( + home: MyHome(), +) +``` + +Navigate to a new screen: + +```dart + +Get.to(NextScreen()); +``` + +Navigate to new screen with name. See more details on named routes [here](./documentation/en_US/route_management.md#navigation-with-named-routes) + +```dart + +Get.toNamed('/details'); +``` + +To close snackbars, dialogs, bottomsheets, or anything you would normally close with Navigator.pop(context); + +```dart +Get.back(); +``` + +To go to the next screen and no option to go back to the previous screen (for use in SplashScreens, login screens, etc.) + +```dart +Get.off(NextScreen()); +``` + +To go to the next screen and cancel all previous routes (useful in shopping carts, polls, and tests) + +```dart +Get.offAll(NextScreen()); +``` + +Noticed that you didn't have to use context to do any of these things? That's one of the biggest advantages of using Get route management. With this, you can execute all these methods from within your controller class, without worries. + +### More details about route management + +**Get works with named routes and also offers lower-level control over your routes! There is in-depth documentation [here](./documentation/en_US/route_management.md)** + +## Dependency management + +Get has a simple and powerful dependency manager that allows you to retrieve the same class as your Bloc or Controller with just 1 lines of code, no Provider context, no inheritedWidget: + +```dart +Controller controller = Get.put(Controller()); // Rather Controller controller = Controller(); +``` + +- Note: If you are using Get's State Manager, pay more attention to the bindings API, which will make it easier to connect your view to your controller. + +Instead of instantiating your class within the class you are using, you are instantiating it within the Get instance, which will make it available throughout your App. +So you can use your controller (or class Bloc) normally + +**Tip:** Get dependency management is decoupled from other parts of the package, so if for example, your app is already using a state manager (any one, it doesn't matter), you don't need to rewrite it all, you can use this dependency injection with no problems at all + +```dart +controller.fetchApi(); +``` + +Imagine that you have navigated through numerous routes, and you need data that was left behind in your controller, you would need a state manager combined with the Provider or Get_it, correct? Not with Get. You just need to ask Get to "find" for your controller, you don't need any additional dependencies: + +```dart +Controller controller = Get.find(); +//Yes, it looks like Magic, Get will find your controller, and will deliver it to you. You can have 1 million controllers instantiated, Get will always give you the right controller. +``` + +And then you will be able to recover your controller data that was obtained back there: + +```dart +Text(controller.textFromApi); +``` + +### More details about dependency management + +**See a more in-depth explanation of dependency management [here](./documentation/en_US/dependency_management.md)** + +# Utils + +## Internationalization + +### Translations + +Translations are kept as a simple key-value dictionary map. +To add custom translations, create a class and extend `Translations`. + +```dart +import 'package:get/get.dart'; + +class Messages extends Translations { + @override + Map> get keys => { + 'en_US': { + 'hello': 'Hello World', + }, + 'de_DE': { + 'hello': 'Hallo Welt', + } + }; +} +``` + +#### Using translations + +Just append `.tr` to the specified key and it will be translated, using the current value of `Get.locale` and `Get.fallbackLocale`. + +```dart +Text('title'.tr); +``` + +#### Using translation with singular and plural + +```dart +var products = []; +Text('singularKey'.trPlural('pluralKey', products.length, Args)); +``` + +#### Using translation with parameters + +```dart +import 'package:get/get.dart'; + + +Map> get keys => { + 'en_US': { + 'logged_in': 'logged in as @name with email @email', + }, + 'es_ES': { + 'logged_in': 'iniciado sesión como @name con e-mail @email', + } +}; + +Text('logged_in'.trParams({ + 'name': 'Jhon', + 'email': 'jhon@example.com' + })); +``` + +### Locales + +Pass parameters to `GetMaterialApp` to define the locale and translations. + +```dart +return GetMaterialApp( + translations: Messages(), // your translations + locale: Locale('en', 'US'), // translations will be displayed in that locale + fallbackLocale: Locale('en', 'UK'), // specify the fallback locale in case an invalid locale is selected. +); +``` + +#### Change locale + +Call `Get.updateLocale(locale)` to update the locale. Translations then automatically use the new locale. + +```dart +var locale = Locale('en', 'US'); +Get.updateLocale(locale); +``` + +#### System locale + +To read the system locale, you could use `Get.deviceLocale`. + +```dart +return GetMaterialApp( + locale: Get.deviceLocale, +); +``` + +## Change Theme + +Please do not use any higher level widget than `GetMaterialApp` in order to update it. This can trigger duplicate keys. A lot of people are used to the prehistoric approach of creating a "ThemeProvider" widget just to change the theme of your app, and this is definitely NOT necessary with **GetX™**. + +You can create your custom theme and simply add it within `Get.changeTheme` without any boilerplate for that: + +```dart +Get.changeTheme(ThemeData.light()); +``` + +If you want to create something like a button that changes the Theme in `onTap`, you can combine two **GetX™** APIs for that: + +- The api that checks if the dark `Theme` is being used. +- And the `Theme` Change API, you can just put this within an `onPressed`: + +```dart +Get.changeTheme(Get.isDarkMode? ThemeData.light(): ThemeData.dark()); +``` + +When `.darkmode` is activated, it will switch to the _light theme_, and when the _light theme_ becomes active, it will change to _dark theme_. + +## GetConnect + +GetConnect is an easy way to communicate from your back to your front with http or websockets + +### Default configuration + +You can simply extend GetConnect and use the GET/POST/PUT/DELETE/SOCKET methods to communicate with your Rest API or websockets. + +```dart +class UserProvider extends GetConnect { + // Get request + Future getUser(int id) => get('http://youapi/users/$id'); + // Post request + Future postUser(Map data) => post('http://youapi/users', body: data); + // Post request with File + Future> postCases(List image) { + final form = FormData({ + 'file': MultipartFile(image, filename: 'avatar.png'), + 'otherFile': MultipartFile(image, filename: 'cover.png'), + }); + return post('http://youapi/users/upload', form); + } + + GetSocket userMessages() { + return socket('https://yourapi/users/socket'); + } +} +``` + +### Custom configuration + +GetConnect is highly customizable You can define base Url, as answer modifiers, as Requests modifiers, define an authenticator, and even the number of attempts in which it will try to authenticate itself, in addition to giving the possibility to define a standard decoder that will transform all your requests into your Models without any additional configuration. + +```dart +class HomeProvider extends GetConnect { + @override + void onInit() { + // All request will pass to jsonEncode so CasesModel.fromJson() + httpClient.defaultDecoder = CasesModel.fromJson; + httpClient.baseUrl = 'https://api.covid19api.com'; + // baseUrl = 'https://api.covid19api.com'; // It define baseUrl to + // Http and websockets if used with no [httpClient] instance + + // It's will attach 'apikey' property on header from all requests + httpClient.addRequestModifier((request) { + request.headers['apikey'] = '12345678'; + return request; + }); + + // Even if the server sends data from the country "Brazil", + // it will never be displayed to users, because you remove + // that data from the response, even before the response is delivered + httpClient.addResponseModifier((request, response) { + CasesModel model = response.body; + if (model.countries.contains('Brazil')) { + model.countries.remove('Brazilll'); + } + }); + + httpClient.addAuthenticator((request) async { + final response = await get("http://yourapi/token"); + final token = response.body['token']; + // Set the header + request.headers['Authorization'] = "$token"; + return request; + }); + + //Autenticator will be called 3 times if HttpStatus is + //HttpStatus.unauthorized + httpClient.maxAuthRetries = 3; + } + } + + @override + Future> getCases(String path) => get(path); +} +``` + +## GetPage Middleware + +The GetPage has now new property that takes a list of GetMiddleWare and run them in the specific order. + +**Note**: When GetPage has a Middlewares, all the children of this page will have the same middlewares automatically. + +### Priority + +The Order of the Middlewares to run can be set by the priority in the GetMiddleware. + +```dart +final middlewares = [ + GetMiddleware(priority: 2), + GetMiddleware(priority: 5), + GetMiddleware(priority: 4), + GetMiddleware(priority: -8), +]; +``` + +those middlewares will be run in this order **-8 => 2 => 4 => 5** + +### Redirect + +This function will be called when the page of the called route is being searched for. It takes RouteSettings as a result to redirect to. Or give it null and there will be no redirecting. + +```dart +RouteSettings redirect(String route) { + final authService = Get.find(); + return authService.authed.value ? null : RouteSettings(name: '/login') +} +``` + +### onPageCalled + +This function will be called when this Page is called before anything created +you can use it to change something about the page or give it new page + +```dart +GetPage onPageCalled(GetPage page) { + final authService = Get.find(); + return page.copyWith(title: 'Welcome ${authService.UserName}'); +} +``` + +### OnBindingsStart + +This function will be called right before the Bindings are initialize. +Here you can change Bindings for this page. + +```dart +List onBindingsStart(List bindings) { + final authService = Get.find(); + if (authService.isAdmin) { + bindings.add(AdminBinding()); + } + return bindings; +} +``` + +### OnPageBuildStart + +This function will be called right after the Bindings are initialize. +Here you can do something after that you created the bindings and before creating the page widget. + +```dart +GetPageBuilder onPageBuildStart(GetPageBuilder page) { + print('bindings are ready'); + return page; +} +``` + +### OnPageBuilt + +This function will be called right after the GetPage.page function is called and will give you the result of the function. and take the widget that will be showed. + +### OnPageDispose + +This function will be called right after disposing all the related objects (Controllers, views, ...) of the page. + +## Other Advanced APIs + +```dart +// give the current args from currentScreen +Get.arguments + +// give name of previous route +Get.previousRoute + +// give the raw route to access for example, rawRoute.isFirst() +Get.rawRoute + +// give access to Routing API from GetObserver +Get.routing + +// check if snackbar is open +Get.isSnackbarOpen + +// check if dialog is open +Get.isDialogOpen + +// check if bottomsheet is open +Get.isBottomSheetOpen + +// remove one route. +Get.removeRoute() + +// back repeatedly until the predicate returns true. +Get.until() + +// go to next route and remove all the previous routes until the predicate returns true. +Get.offUntil() + +// go to next named route and remove all the previous routes until the predicate returns true. +Get.offNamedUntil() + +//Check in what platform the app is running +GetPlatform.isAndroid +GetPlatform.isIOS +GetPlatform.isMacOS +GetPlatform.isWindows +GetPlatform.isLinux +GetPlatform.isFuchsia + +//Check the device type +GetPlatform.isMobile +GetPlatform.isDesktop +//All platforms are supported independently in web! +//You can tell if you are running inside a browser +//on Windows, iOS, OSX, Android, etc. +GetPlatform.isWeb + + +// Equivalent to : MediaQuery.of(context).size.height, +// but immutable. +Get.height +Get.width + +// Gives the current context of the Navigator. +Get.context + +// Gives the context of the snackbar/dialog/bottomsheet in the foreground, anywhere in your code. +Get.contextOverlay + +// Note: the following methods are extensions on context. Since you +// have access to context in any place of your UI, you can use it anywhere in the UI code + +// If you need a changeable height/width (like Desktop or browser windows that can be scaled) you will need to use context. +context.width +context.height + +// Gives you the power to define half the screen, a third of it and so on. +// Useful for responsive applications. +// param dividedBy (double) optional - default: 1 +// param reducedBy (double) optional - default: 0 +context.heightTransformer() +context.widthTransformer() + +/// Similar to MediaQuery.of(context).size +context.mediaQuerySize() + +/// Similar to MediaQuery.of(context).padding +context.mediaQueryPadding() + +/// Similar to MediaQuery.of(context).viewPadding +context.mediaQueryViewPadding() + +/// Similar to MediaQuery.of(context).viewInsets; +context.mediaQueryViewInsets() + +/// Similar to MediaQuery.of(context).orientation; +context.orientation() + +/// Check if device is on landscape mode +context.isLandscape() + +/// Check if device is on portrait mode +context.isPortrait() + +/// Similar to MediaQuery.of(context).devicePixelRatio; +context.devicePixelRatio() + +/// Similar to MediaQuery.of(context).textScaleFactor; +context.textScaleFactor() + +/// Get the shortestSide from screen +context.mediaQueryShortestSide() + +/// True if width be larger than 800 +context.showNavbar() + +/// True if the shortestSide is smaller than 600p +context.isPhone() + +/// True if the shortestSide is largest than 600p +context.isSmallTablet() + +/// True if the shortestSide is largest than 720p +context.isLargeTablet() + +/// True if the current device is Tablet +context.isTablet() + +/// Returns a value according to the screen size +/// can give value for: +/// watch: if the shortestSide is smaller than 300 +/// mobile: if the shortestSide is smaller than 600 +/// tablet: if the shortestSide is smaller than 1200 +/// desktop: if width is largest than 1200 +context.responsiveValue() +``` + +### Optional Global Settings and Manual configurations + +GetMaterialApp configures everything for you, but if you want to configure Get manually. + +```dart +MaterialApp( + navigatorKey: Get.key, + navigatorObservers: [GetObserver()], +); +``` + +You will also be able to use your own Middleware within `GetObserver`, this will not influence anything. + +```dart +MaterialApp( + navigatorKey: Get.key, + navigatorObservers: [ + GetObserver(MiddleWare.observer) // Here + ], +); +``` + +You can create _Global Settings_ for `Get`. Just add `Get.config` to your code before pushing any route. +Or do it directly in your `GetMaterialApp` + +```dart +GetMaterialApp( + enableLog: true, + defaultTransition: Transition.fade, + opaqueRoute: Get.isOpaqueRouteDefault, + popGesture: Get.isPopGestureEnable, + transitionDuration: Get.defaultDurationTransition, + defaultGlobalState: Get.defaultGlobalState, +); + +Get.config( + enableLog = true, + defaultPopGesture = true, + defaultTransition = Transitions.cupertino +) +``` + +You can optionally redirect all the logging messages from `Get`. +If you want to use your own, favourite logging package, +and want to capture the logs there: + +```dart +GetMaterialApp( + enableLog: true, + logWriterCallback: localLogWriter, +); + +void localLogWriter(String text, {bool isError = false}) { + // pass the message to your favourite logging package here + // please note that even if enableLog: false log messages will be pushed in this callback + // you get check the flag if you want through GetConfig.isLogEnable +} + +``` + +### Local State Widgets + +These Widgets allows you to manage a single value, and keep the state ephemeral and locally. +We have flavours for Reactive and Simple. +For instance, you might use them to toggle obscureText in a `TextField`, maybe create a custom +Expandable Panel, or maybe modify the current index in `BottomNavigationBar` while changing the content +of the body in a `Scaffold`. + +#### ValueBuilder + +A simplification of `StatefulWidget` that works with a `.setState` callback that takes the updated value. + +```dart +ValueBuilder( + initialValue: false, + builder: (value, updateFn) => Switch( + value: value, + onChanged: updateFn, // same signature! you could use ( newValue ) => updateFn( newValue ) + ), + // if you need to call something outside the builder method. + onUpdate: (value) => print("Value updated: $value"), + onDispose: () => print("Widget unmounted"), +), +``` + +#### ObxValue + +Similar to [`ValueBuilder`](#valuebuilder), but this is the Reactive version, you pass a Rx instance (remember the magical .obs?) and +updates automatically... isn't it awesome? + +```dart +ObxValue((data) => Switch( + value: data.value, + onChanged: data, // Rx has a _callable_ function! You could use (flag) => data.value = flag, + ), + false.obs, +), +``` + +## Useful tips + +`.obs`ervables (also known as _Rx_ Types) have a wide variety of internal methods and operators. + +> Is very common to _believe_ that a property with `.obs` **IS** the actual value... but make no mistake! +> We avoid the Type declaration of the variable, because Dart's compiler is smart enough, and the code +> looks cleaner, but: + +```dart +var message = 'Hello world'.obs; +print( 'Message "$message" has Type ${message.runtimeType}'); +``` + +Even if `message` _prints_ the actual String value, the Type is **RxString**! + +So, you can't do `message.substring( 0, 4 )`. +You have to access the real `value` inside the _observable_: +The most "used way" is `.value`, but, did you know that you can also use... + +```dart +final name = 'GetX'.obs; +// only "updates" the stream, if the value is different from the current one. +name.value = 'Hey'; + +// All Rx properties are "callable" and returns the new value. +// but this approach does not accepts `null`, the UI will not rebuild. +name('Hello'); + +// is like a getter, prints 'Hello'. +name() ; + +/// numbers: + +final count = 0.obs; + +// You can use all non mutable operations from num primitives! +count + 1; + +// Watch out! this is only valid if `count` is not final, but var +count += 1; + +// You can also compare against values: +count > 2; + +/// booleans: + +final flag = false.obs; + +// switches the value between true/false +flag.toggle(); + + +/// all types: + +// Sets the `value` to null. +flag.nil(); + +// All toString(), toJson() operations are passed down to the `value` +print( count ); // calls `toString()` inside for RxInt + +final abc = [0,1,2].obs; +// Converts the value to a json Array, prints RxList +// Json is supported by all Rx types! +print('json: ${jsonEncode(abc)}, type: ${abc.runtimeType}'); + +// RxMap, RxList and RxSet are special Rx types, that extends their native types. +// but you can work with a List as a regular list, although is reactive! +abc.add(12); // pushes 12 to the list, and UPDATES the stream. +abc[3]; // like Lists, reads the index 3. + + +// equality works with the Rx and the value, but hashCode is always taken from the value +final number = 12.obs; +print( number == 12 ); // prints > true + +/// Custom Rx Models: + +// toJson(), toString() are deferred to the child, so you can implement override on them, and print() the observable directly. + +class User { + String name, last; + int age; + User({this.name, this.last, this.age}); + + @override + String toString() => '$name $last, $age years old'; +} + +final user = User(name: 'John', last: 'Doe', age: 33).obs; + +// `user` is "reactive", but the properties inside ARE NOT! +// So, if we change some variable inside of it... +user.value.name = 'Roi'; +// The widget will not rebuild!, +// `Rx` don't have any clue when you change something inside user. +// So, for custom classes, we need to manually "notify" the change. +user.refresh(); + +// or we can use the `update()` method! +user.update((value){ + value.name='Roi'; +}); + +print( user ); +``` + +## StateMixin + +Another way to handle your `UI` state is use the `StateMixin` . +To implement it, use the `with` to add the `StateMixin` +to your controller which allows a T model. + +```dart +class Controller extends GetController with StateMixin{} +``` + +The `change()` method change the State whenever we want. +Just pass the data and the status in this way: + +```dart +change(data, status: RxStatus.success()); +``` + +RxStatus allow these status: + +```dart +RxStatus.loading(); +RxStatus.success(); +RxStatus.empty(); +RxStatus.error('message'); +``` + +To represent it in the UI, use: + +```dart +class OtherClass extends GetView { + @override + Widget build(BuildContext context) { + return Scaffold( + + body: controller.obx( + (state)=>Text(state.name), + + // here you can put your custom loading indicator, but + // by default would be Center(child:CircularProgressIndicator()) + onLoading: CustomLoadingIndicator(), + onEmpty: Text('No data found'), + + // here also you can set your own error widget, but by + // default will be an Center(child:Text(error)) + onError: (error)=>Text(error), + ), + ); +} +``` + +#### GetView + +I love this Widget, is so simple, yet, so useful! + +Is a `const Stateless` Widget that has a getter `controller` for a registered `Controller`, that's all. + +```dart + class AwesomeController extends GetController { + final String title = 'My Awesome View'; + } + + // ALWAYS remember to pass the `Type` you used to register your controller! + class AwesomeView extends GetView { + @override + Widget build(BuildContext context) { + return Container( + padding: EdgeInsets.all(20), + child: Text(controller.title), // just call `controller.something` + ); + } + } +``` + +#### GetResponsiveView + +Extend this widget to build responsive view. +this widget contains the `screen` property that have all +information about the screen size and type. + +##### How to use it + +You have two options to build it. + +- with `builder` method you return the widget to build. +- with methods `desktop`, `tablet`,`phone`, `watch`. the specific + method will be built when the screen type matches the method + when the screen is [ScreenType.Tablet] the `tablet` method + will be exuded and so on. + **Note:** If you use this method please set the property `alwaysUseBuilder` to `false` + +With `settings` property you can set the width limit for the screen types. + +![example](https://github.com/SchabanBo/get_page_example/blob/master/docs/Example.gif?raw=true) +Code to this screen +[code](https://github.com/SchabanBo/get_page_example/blob/master/lib/pages/responsive_example/responsive_view.dart) + +#### GetWidget + +Most people have no idea about this Widget, or totally confuse the usage of it. +The use case is very rare, but very specific: It `caches` a Controller. +Because of the _cache_, can't be a `const Stateless`. + +> So, when do you need to "cache" a Controller? + +If you use, another "not so common" feature of **GetX**: `Get.create()`. + +`Get.create(()=>Controller())` will generate a new `Controller` each time you call +`Get.find()`, + +That's where `GetWidget` shines... as you can use it, for example, +to keep a list of Todo items. So, if the widget gets "rebuilt", it will keep the same controller instance. + +#### GetxService + +This class is like a `GetxController`, it shares the same lifecycle ( `onInit()`, `onReady()`, `onClose()`). +But has no "logic" inside of it. It just notifies **GetX** Dependency Injection system, that this subclass +**can not** be removed from memory. + +So is super useful to keep your "Services" always reachable and active with `Get.find()`. Like: +`ApiService`, `StorageService`, `CacheService`. + +```dart +Future main() async { + await initServices(); /// AWAIT SERVICES INITIALIZATION. + runApp(SomeApp()); +} + +/// Is a smart move to make your Services intiialize before you run the Flutter app. +/// as you can control the execution flow (maybe you need to load some Theme configuration, +/// apiKey, language defined by the User... so load SettingService before running ApiService. +/// so GetMaterialApp() doesnt have to rebuild, and takes the values directly. +void initServices() async { + print('starting services ...'); + /// Here is where you put get_storage, hive, shared_pref initialization. + /// or moor connection, or whatever that's async. + await Get.putAsync(() => DbService().init()); + await Get.putAsync(SettingsService()).init(); + print('All services started...'); +} + +class DbService extends GetxService { + Future init() async { + print('$runtimeType delays 2 sec'); + await 2.delay(); + print('$runtimeType ready!'); + return this; + } +} + +class SettingsService extends GetxService { + void init() async { + print('$runtimeType delays 1 sec'); + await 1.delay(); + print('$runtimeType ready!'); + } +} + +``` + +The only way to actually delete a `GetxService`, is with `Get.reset()` which is like a +"Hot Reboot" of your app. So remember, if you need absolute persistence of a class instance during the +lifetime of your app, use `GetxService`. + +### Tests + +You can test your controllers like any other class, including their lifecycles: + +```dart +class Controller extends GetxController { + @override + void onInit() { + super.onInit(); + //Change value to name2 + name.value = 'name2'; + } + + @override + void onClose() { + name.value = ''; + super.onClose(); + } + + final name = 'name1'.obs; + + void changeName() => name.value = 'name3'; +} + +void main() { + test(''' +Test the state of the reactive variable "name" across all of its lifecycles''', + () { + /// You can test the controller without the lifecycle, + /// but it's not recommended unless you're not using + /// GetX dependency injection + final controller = Controller(); + expect(controller.name.value, 'name1'); + + /// If you are using it, you can test everything, + /// including the state of the application after each lifecycle. + Get.put(controller); // onInit was called + expect(controller.name.value, 'name2'); + + /// Test your functions + controller.changeName(); + expect(controller.name.value, 'name3'); + + /// onClose was called + Get.delete(); + + expect(controller.name.value, ''); + }); +} +``` + +#### Tips + +##### Mockito or mocktail + +If you need to mock your GetxController/GetxService, you should extend GetxController, and mixin it with Mock, that way + +```dart +class NotificationServiceMock extends GetxService with Mock implements NotificationService {} +``` + +##### Using Get.reset() + +If you are testing widgets, or test groups, use Get.reset at the end of your test or in tearDown to reset all settings from your previous test. + +##### Get.testMode + +if you are using your navigation in your controllers, use `Get.testMode = true` at the beginning of your main. + +# Breaking changes from 2.0 + +1- Rx types: + +| Before | After | +| ------- | ---------- | +| StringX | `RxString` | +| IntX | `RxInt` | +| MapX | `RxMap` | +| ListX | `RxList` | +| NumX | `RxNum` | +| DoubleX | `RxDouble` | + +RxController and GetBuilder now have merged, you no longer need to memorize which controller you want to use, just use GetxController, it will work for simple state management and for reactive as well. + +2- NamedRoutes +Before: + +```dart +GetMaterialApp( + namedRoutes: { + '/': GetRoute(page: Home()), + } +) +``` + +Now: + +```dart +GetMaterialApp( + getPages: [ + GetPage(name: '/', page: () => Home()), + ] +) +``` + +Why this change? +Often, it may be necessary to decide which page will be displayed from a parameter, or a login token, the previous approach was inflexible, as it did not allow this. +Inserting the page into a function has significantly reduced the RAM consumption, since the routes will not be allocated in memory since the app was started, and it also allowed to do this type of approach: + +```dart + +GetStorage box = GetStorage(); + +GetMaterialApp( + getPages: [ + GetPage(name: '/', page:(){ + return box.hasData('token') ? Home() : Login(); + }) + ] +) +``` + +# Why Getx? + +1- Many times after a Flutter update, many of your packages will break. Sometimes compilation errors happen, errors often appear that there are still no answers about, and the developer needs to know where the error came from, track the error, only then try to open an issue in the corresponding repository, and see its problem solved. Get centralizes the main resources for development (State, dependency and route management), allowing you to add a single package to your pubspec, and start working. After a Flutter update, the only thing you need to do is update the Get dependency, and get to work. Get also resolves compatibility issues. How many times a version of a package is not compatible with the version of another, because one uses a dependency in one version, and the other in another version? This is also not a concern using Get, as everything is in the same package and is fully compatible. + +2- Flutter is easy, Flutter is incredible, but Flutter still has some boilerplate that may be unwanted for most developers, such as `Navigator.of(context).push (context, builder [...]`. Get simplifies development. Instead of writing 8 lines of code to just call a route, you can just do it: `Get.to(Home())` and you're done, you'll go to the next page. Dynamic web urls are a really painful thing to do with Flutter currently, and that with GetX is stupidly simple. Managing states in Flutter, and managing dependencies is also something that generates a lot of discussion, as there are hundreds of patterns in the pub. But there is nothing as easy as adding a ".obs" at the end of your variable, and place your widget inside an Obx, and that's it, all updates to that variable will be automatically updated on the screen. + +3- Ease without worrying about performance. Flutter's performance is already amazing, but imagine that you use a state manager, and a locator to distribute your blocs/stores/controllers/ etc. classes. You will have to manually call the exclusion of that dependency when you don't need it. But have you ever thought of simply using your controller, and when it was no longer being used by anyone, it would simply be deleted from memory? That's what GetX does. With SmartManagement, everything that is not being used is deleted from memory, and you shouldn't have to worry about anything but programming. You will be assured that you are consuming the minimum necessary resources, without even having created a logic for this. + +4- Actual decoupling. You may have heard the concept "separate the view from the business logic". This is not a peculiarity of BLoC, MVC, MVVM, and any other standard on the market has this concept. However, this concept can often be mitigated in Flutter due to the use of context. +If you need context to find an InheritedWidget, you need it in the view, or pass the context by parameter. I particularly find this solution very ugly, and to work in teams we will always have a dependence on View's business logic. Getx is unorthodox with the standard approach, and while it does not completely ban the use of StatefulWidgets, InitState, etc., it always has a similar approach that can be cleaner. Controllers have life cycles, and when you need to make an APIREST request for example, you don't depend on anything in the view. You can use onInit to initiate the http call, and when the data arrives, the variables will be populated. As GetX is fully reactive (really, and works under streams), once the items are filled, all widgets that use that variable will be automatically updated in the view. This allows people with UI expertise to work only with widgets, and not have to send anything to business logic other than user events (like clicking a button), while people working with business logic will be free to create and test the business logic separately. + +This library will always be updated and implementing new features. Feel free to offer PRs and contribute to them. + +# Community + +## Community channels + +GetX has a highly active and helpful community. If you have questions, or would like any assistance regarding the use of this framework, please join our community channels, your question will be answered more quickly, and it will be the most suitable place. This repository is exclusive for opening issues, and requesting resources, but feel free to be part of GetX Community. + +| **Slack** | **Discord** | **Telegram** | +| :-------------------------------------------------------------------------------------------------------------------------- | :-------------------------------------------------------------------------------------------------------------------------- | :-------------------------------------------------------------------------------------------------------------------- | +| [![Get on Slack](https://img.shields.io/badge/slack-join-orange.svg)](https://communityinviter.com/apps/getxworkspace/getx) | [![Discord Shield](https://img.shields.io/discord/722900883784073290.svg?logo=discord)](https://discord.com/invite/9Hpt99N) | [![Telegram](https://img.shields.io/badge/chat-on%20Telegram-blue.svg)](https://t.me/joinchat/PhdbJRmsZNpAqSLJL6bH7g) | + +## How to contribute + +_Want to contribute to the project? We will be proud to highlight you as one of our collaborators. Here are some points where you can contribute and make Get (and Flutter) even better._ + +- Helping to translate the readme into other languages. +- Adding documentation to the readme (a lot of Get's functions haven't been documented yet). +- Write articles or make videos teaching how to use Get (they will be inserted in the Readme and in the future in our Wiki). +- Offering PRs for code/tests. +- Including new functions. + +Any contribution is welcome! + +## Articles and videos + +- [Flutter Getx EcoSystem package for arabic people](https://www.youtube.com/playlist?list=PLV1fXIAyjeuZ6M8m56zajMUwu4uE3-SL0) - Tutorial by [Pesa Coder](https://github.com/UsamaElgendy). +- [Dynamic Themes in 3 lines using GetX™](https://medium.com/swlh/flutter-dynamic-themes-in-3-lines-c3b375f292e3) - Tutorial by [Rod Brown](https://github.com/RodBr). +- [Complete GetX™ Navigation](https://www.youtube.com/watch?v=RaqPIoJSTtI) - Route management video by Amateur Coder. +- [Complete GetX State Management](https://www.youtube.com/watch?v=CNpXbeI_slw) - State management video by Amateur Coder. +- [GetX™ Other Features](https://youtu.be/ttQtlX_Q0eU) - Utils, storage, bindings and other features video by Amateur Coder. +- [Firestore User with GetX | Todo App](https://www.youtube.com/watch?v=BiV0DcXgk58) - Video by Amateur Coder. +- [Firebase Auth with GetX | Todo App](https://www.youtube.com/watch?v=-H-T_BSgfOE) - Video by Amateur Coder. +- [The Flutter GetX™ Ecosystem ~ State Management](https://medium.com/flutter-community/the-flutter-getx-ecosystem-state-management-881c7235511d) - State management by [Aachman Garg](https://github.com/imaachman). +- [The Flutter GetX™ Ecosystem ~ Dependency Injection](https://medium.com/flutter-community/the-flutter-getx-ecosystem-dependency-injection-8e763d0ec6b9) - Dependency Injection by [Aachman Garg](https://github.com/imaachman). +- [GetX, the all-in-one Flutter package](https://www.youtube.com/watch?v=IYQgtu9TM74) - A brief tutorial covering State Management and Navigation by Thad Carnevalli. +- [Build a To-do List App from scratch using Flutter and GetX](https://www.youtube.com/watch?v=EcnqFasHf18) - UI + State Management + Storage video by Thad Carnevalli. +- [GetX Flutter Firebase Auth Example](https://medium.com/@jeffmcmorris/getx-flutter-firebase-auth-example-b383c1dd1de2) - Article by Jeff McMorris. +- [Flutter State Management with GetX – Complete App](https://www.appwithflutter.com/flutter-state-management-with-getx/) - by App With Flutter. +- [Flutter Routing with Animation using Get Package](https://www.appwithflutter.com/flutter-routing-using-get-package/) - by App With Flutter. +- [A minimal example on dartpad](https://dartpad.dev/2b3d0d6f9d4e312c5fdbefc414c1727e?) - by [Roi Peker](https://github.com/roipeker) + +
diff --git a/siro_rider/packages/get/README-es.md b/siro_rider/packages/get/README-es.md new file mode 100644 index 0000000..2cea241 --- /dev/null +++ b/siro_rider/packages/get/README-es.md @@ -0,0 +1,578 @@ +![](https://raw.githubusercontent.com/jonataslaw/getx-community/master/get.png) + +*Idiomas: Español (este archivo), [Vietnamita](README-vi.md), [Indonesio](README.id-ID.md), [Urdu](README.ur-PK.md), [Lengua china](README.zh-cn.md), [Inglés](README.md), [Portugués de Brasil](README.pt-br.md), [Ruso](README.ru.md), [Polaco](README.pl.md), [Coreano](README.ko-kr.md), [Francés](README-fr.md).* + +[![pub package](https://img.shields.io/pub/v/get.svg?label=get&color=blue)](https://pub.dev/packages/get) +[![popularity](https://badges.bar/get/popularity)](https://pub.dev/packages/sentry/score) +[![likes](https://badges.bar/get/likes)](https://pub.dev/packages/get/score) +[![pub points](https://badges.bar/get/pub%20points)](https://pub.dev/packages/get/score) +![building](https://github.com/jonataslaw/get/workflows/build/badge.svg) +[![style: effective dart](https://img.shields.io/badge/style-effective_dart-40c4ff.svg)](https://pub.dev/packages/effective_dart) +[![Discord Shield](https://img.shields.io/discord/722900883784073290.svg?logo=discord)](https://discord.com/invite/9Hpt99N) +[![Get on Slack](https://img.shields.io/badge/slack-join-orange.svg)](https://communityinviter.com/apps/getxworkspace/getx) +[![Telegram](https://img.shields.io/badge/chat-on%20Telegram-blue.svg)](https://t.me/joinchat/PhdbJRmsZNpAqSLJL6bH7g) + + Awesome Flutter + +Buy Me A Coffee + +![](https://raw.githubusercontent.com/jonataslaw/getx-community/master/getx.png) + +

Lamentamos la inconsistencia en la traducción. El paquete GetX se actualiza con bastante frecuencia y es posible que las traducciones a documentos no sean tan rápidas. Entonces, para que esta documentación aún tenga todo el contenido, dejaré aquí todos los textos nuevos sin traducir (considero que es mejor tener los documentos en inglés que no tenerlos), por lo que si alguien quiere traducir, sería de gran ayuda 😁

+ +- [Sobre GetX](#sobre-getx) +- [Instalación](#instalación) +- [Proyecto contador con GetX](#proyecto-contador-con-getx) +- [Los tres pilares](#los-tres-pilares) + - [Gestión del Estado](#gestión-del-estado) + - [Reactivo STATE_MANAGER](#reactivo-state_manager) + - [Más detalles sobre la gestión del estado.](#más-detalles-sobre-la-gestión-del-estado) + - [Explicación en video sobre state management](#explicación-en-video-sobre-state-management) + - [Gestión de Rutas](#gestión-de-rutas) + - [Más detalles sobre la gestión de rutas.](#más-detalles-sobre-la-gestión-de-rutas) + - [Explicación del video](#explicación-del-video) + - [Gestión de dependencias](#gestión-de-dependencias) + - [Más detalles sobre la gestión de dependencias.](#más-detalles-sobre-la-gestión-de-dependencias) +- [Utilidades](#utilidades) + - [Cambiar de tema](#cambiar-de-tema) + - [Otras API avanzadas y configuraciones manuales](#otras-api-avanzadas-y-configuraciones-manuales) + - [Configuraciones globales opcionales](#configuraciones-globales-opcionales) + - [Video explanation of Other GetX Features](#video-explanation-of-other-getx-features) +- [Cambios importantes desde 2.0](#cambios-importantes-desde-20) +- [¿Por qué Getx?](#por-qué-getx) +- [Comunidad](#comunidad) + - [Canales de la comunidad](#canales-de-la-comunidad) + - [Cómo contribuir](#cómo-contribuir) + - [Artículos y vídeos](#artículos-y-vídeos-inglés) + +# Sobre GetX + +- GetX es una solución extra ligera y potente para Flutter. Combina gestión de estádo de alto rendimiento, inyección de dependencia inteligente y gestión de rutas de forma rápida y práctica. + +- GetX tiene 3 principios básicos, esto significa que esta es la prioridad para todos los recursos de la biblioteca. + - **RENDIMIENTO:** GetX se centra en el rendimiento y el consumo mínimo de recursos. Los puntos de referencia casi siempre no son importantes en el mundo real, pero si lo desea, aquí hay un indicador de consumo.([benchmarks](https://github.com/jonataslaw/benchmarks)), donde GetX lo hace mejor que otros enfoques de gestión estatal, por ejemplo. La diferencia no es grande, pero muestra nuestra preocupación por no desperdiciar sus recursos. + - **PRODUCTIVIDAD:** GetX utiliza una sintaxis fácil y agradable. + - **ORGANIZACIÓN:** GetX permite el desacoplamiento total de la vista de la lógica de negocio. + +* GetX ahorrará horas de desarrollo y extraerá el máximo rendimiento que su aplicación puede ofrecer, siendo fácil para los principiantes y precisa para los expertos. Navega sin contexto, abre diálogos, snackbars o bottomsheets desde cualquier lugar de tu código, gestiona estados e inyecta dependencias de forma fácil y práctica. Get es seguro, estable, actualizado y ofrece una amplia gama de API que no están presentes en el marco predeterminado. + +- GetX no es bloated. Tiene una multitud de características que le permiten comenzar a programar sin preocuparse por nada, pero cada una de estas características se encuentran en contenedores separados y solo se inician después de su uso. Si solo usa State Management, solo se compilará State Management. Si solo usa rutas, no se compilará nada de la administración estatal. Puede compilar el repositorio de referencia y verá que al usar solo la administración de estado de Get, la aplicación compilada con Get se ha vuelto más pequeña que todas las demás aplicaciones que solo tienen la administración de estado de otros paquetes, porque nada que no se use se compilará en su código, y cada solución GetX fue diseñada para ser muy liviana. El mérito aquí también proviene del movimiento del árbol de Flutter, que es increíble y logra eliminar los recursos no utilizados como ningún otro marco lo hace. + +**GetX hace que su desarrollo sea productivo, pero ¿quiere hacerlo aún más productivo? [Agregue la extensión a su VSCode](https://marketplace.visualstudio.com/items?itemName=get-snippets.get-snippets)** + +# Instalación + +Añada la librería Get en tu archivo pubspec.yaml: + +```yaml +dependencies: + get: +``` + +Importe Get en los archivos en los que se utilizará: + +```dart +import 'package:get/get.dart'; +``` + +# Proyecto Contador con GetX + +Vea una explicación más detallada de la administración del estado [aquí](./documentation/es_ES/state_management.md). Allí verá más ejemplos y también la diferencia entre el Gestión del Estado simple y el Gestión del Estado reactivo + +El proyecto "contador" creado por defecto en un nuevo proyecto en Flutter tiene más de 100 líneas (con comentarios). Para mostrar el poder de GetX, demostraré cómo hacer un "contador" cambiando el estado con cada clic, cambiando de página y compartiendo el estado entre pantallas, todo de manera organizada, separando la vista de la lógica de negocio, SOLO 26 LÍNEAS DE CÓDIGO INCLUIDOS COMENTARIOS. + +- Paso 1: Agregue "Get" antes de su materialApp, convirtiéndolo en GetMaterialApp + +```dart +void main() => runApp(GetMaterialApp(home: Home())); +``` + +**Nota**: esto no modifica el MaterialApp del Flutter, GetMaterialApp no es una MaterialApp modificado, es solo un Widget preconfigurado que tiene como child un MaterialApp por defecto. Puede configurar esto manualmente, pero definitivamente no es necesario. GetMaterialApp creará rutas, las inyectará, inyectará traducciones, inyectará todo lo que necesita para la navegación de rutas. Si usa Get solo para la gestión de estado o dependencias, no es necesario usar GetMaterialApp. GetMaterialApp es necesario para rutas, snackbars, internacionalización, bottomSheets, diálogos y APIs de alto nivel relacionadas con rutas y ausencia de contexto. + +**Nota²:** Este paso solo es necesario si va a usar route management (`Get.to()`, `Get.back()` y así). Si no lo va a usar, no es necesario que realice el paso 1 + +- Paso 2: Cree su clase con la lógica de negocio colocando todas las variables, métodos y controladores dentro de ella. Puede hacer que cualquier variable sea observable usando un simple ".obs". + +```dart +class Controller extends GetxController { + var count = 0.obs; + increment() => count.value++; +} +``` + +- Paso 3: Cree su vista, use StatelessWidget y ahorre algo de RAM, con GetX ya no necesitará usar StatefulWidget. + +```dart +class Home extends StatelessWidget { + + @override + Widget build(context) { + + // Cree una instancia de su clase usando Get.put() para que esté disponible para todas las rutas "secundarias" allí. + final Controller c = Get.put(Controller()); + + return Scaffold( + // Utilice Obx(()=> para actualizar Text() siempre que se cambie el recuento. + appBar: AppBar(title: Obx(() => Text("Clicks: " + c.count.string))), + + // Reemplace el Navigator.push de 8 líneas por un simple Get.to(). No necesitas contexto + body: Center(child: ElevatedButton( + child: Text("Go to Other"), onPressed: () => Get.to(Other()))), + floatingActionButton: + FloatingActionButton(child: Icon(Icons.add), onPressed: c.increment)); + } +} + +class Other extends StatelessWidget { + // Puede pedirle a Get que busque un controlador que está siendo utilizado por otra página y le redirija a él. + final Controller c = Get.find(); + + @override + Widget build(context){ + // Acceder a la variable de recuento actualizada + return Scaffold(body: Center(child: Text(c.count.string))); + } +} + +``` + +Resultado: + +![](https://raw.githubusercontent.com/jonataslaw/getx-community/master/counter-app-gif.gif) + +Este es un proyecto simple pero ya deja en claro cuán poderoso es GetX. A medida que su proyecto crezca, esta diferencia se volverá más significativa. GetX fue diseñado para trabajar con equipos, pero también simplifica el trabajo de un desarrollador individual. Mejore sus plazos, entregue todo a tiempo, sin perder rendimiento. GetX no es para todos, pero si te identificaste con esa frase, ¡GET es para ti! + +# Los tres pilares + +## Gestión del Estado + +Actualmente hay varios State Managers para Flutter. Sin embargo, con la mayoría de ellos implica utilizar ChangeNotifier para actualizar widgets y este es un enfoque malo y muy malo para el rendimiento de aplicaciones medianas o grandes. Puede verificar en la documentación oficial de Flutter que [ChangeNotifier debe usarse con 1 o un máximo de 2 listeners](https://api.Flutter.dev/Flutter/foundation/ChangeNotifier-class.html), por lo que es prácticamente inutilizable para cualquier aplicación mediana o grande. + +GetX no es mejor ni peor que cualquier otro gestor de estado, pero debe analizar estos puntos, así como los puntos que se mencionan a continuación, para elegir entre usar GetX en forma pura (vanilla) o usarlo junto con otro gestor de estado. + +Definitivamente, GetX no es enemigo de ningún otro gestor de estado, porque GetX es más bien un microframework, no solo un gestor de estado, y se puede usar solo o en combinación con ellos. + +### Reactivo STATE_MANAGER + +La programación reactiva puede alienar a muchas personas porque se dice que es complicada. GetX convierte la programación reactiva en algo tan simple que puede ser aprendido y utilizado por aquellos que comenzaron en ese mismo momento en Flutter. No, no necesitará crear StreamControllers. Tampoco necesitará crear un StreamBuilder para cada variable. No necesitará crear una clase para cada estado. No necesitará crear un get para un valor inicial. La programación reactiva con GetX es tan fácil como usar setState (¡o incluso más fácil!). + +Imaginemos que tiene una variable "name" y desea que cada vez que la modifique, todos los widgets que la usan cambien automáticamente. + +Ej. esta es tu variable "name": + +```dart +var name = 'Jonatas Borges'; +``` + +Para que sea observable, solo necesita agregar ".obs" al final: + +```dart +var name = 'Jonatas Borges'.obs; +``` + +¿StreamBuilder? ¿initialValue? ¿builder? No, solo necesitas jugar con esta variable dentro de un widget Obx. + +```dart +Obx(() => Text (controller.name)); +``` + +### Más detalles sobre la gestión del estado. + +**Vea una explicación más detallada de la administración del estado [aquí](./documentation/es_ES/state_management.md). Allí verá más ejemplos y también la diferencia entre el Gestión del Estado simple y el Gestión del Estado reactivo** + +### Explicación en video sobre state management + +Darwin Morocho hizo una increíble serie de videos sobre state management! Link: [Complete GetX State Management](https://www.youtube.com/watch?v=PTjj0DFK8BA&list=PLV0nOzdUS5XtParoZLgKoVwNSK9zROwuO) + +Obtendrá una buena idea de la potencia de GetX. + +## Gestión de Rutas + +Para navegar a una nueva pantalla: + +```dart +Get.to(NextScreen()); +``` + +Para cerrar snackbars, dialogs, bottomsheets o cualquier cosa que normalmente cierre con Navigator.pop(contexto); + +```dart +Get.back(); +``` + +Para ir a la siguiente pantalla, sin opción a volver (util por ejemplo en SplashScreens, LoginScreen, etc.) + +```dart +Get.off(NextScreen()); +``` + +Para ir a la siguiente pantalla y cancelar todas las rutas anteriores (útil en carritos de compras, encuestas y exámenes) + +```dart +Get.offAll(NextScreen()); +``` + +Para navegar a la siguiente ruta y recibir o actualizar datos tan pronto como se regrese de ella: + +```dart +var data = await Get.to(Payment()); +``` + +### Más detalles sobre la gestión de rutas. + +**Vea una explicación más detallada de la Gestión de Rutas [aquí](./documentation/es_ES/route_management.md).** + +### Explicación del video + +Amateur Coder hizo un excelente video que cubre route management con Get! aquí esta el link: [Complete Getx Navigation](https://www.youtube.com/watch?v=RaqPIoJSTtI) + +## Gestión de dependencias + +- Nota: si está utilizando el gestor de estado de GetX, no tiene que preocuparse por esto, solo lea para obtener información, pero preste más atención a la API de bindings, que hará todo esto automáticamente por usted. + +¿Ya estás utilizando GetX y quieres que tu proyecto sea lo más ágil posible? GetX tiene un gestor de dependencias simple y poderoso que le permite recuperar la misma clase que su BLoC o Controller con solo una líneas de código, sin contexto de Provider, sin inheritedWidget: + +```dart +Controller controller = Get.put(Controller()); // Rather Controller controller = Controller(); +``` + +En lugar de crear una instancia de su clase dentro de la clase que está utilizando, la está creando dentro de la instancia GetX, que la hará disponible en toda su aplicación. Entonces puede usar su Controller (o BLoC) normalmente. + +```dart +controller.fetchApi(); +``` + +Imagine que ha navegado a través de numerosas rutas y necesita datos que quedaron en su controlador, necesitaría un gestor de estado combinado con Provider o Get_it, ¿correcto? No con GetX. Solo necesita pedirle a GetX que "encuentre" su controlador, no necesita dependencias adicionales: + +```dart +Controller controller = Get.find(); +//Sí, parece que es magia, Get encontrará su controlador y se lo entregará. Puede tener 1 millón de controladores instanciados, Get siempre le dará el controlador correcto. +``` + +Y luego podrá recuperar los datos de su controlador que se obtuvieron allí: + +```dart +Text(controller.textFromApi); +``` + +¿Buscando lazy loading? Puede declarar todos sus controladores, y se llamará solo cuando alguien lo necesite. Puedes hacer esto con: + +```dart +Get.lazyPut(()=> ApiMock()); +/// ApiMock solo se llamará cuando alguien use Get.find por primera vez +``` + +### Más detalles sobre la gestión de dependencias. + +**Vea una explicación más detallada de la Gestión de dependencias [aquí](./documentation/es_ES/dependency_management.md).** + +# Utilidades + +## Cambiar de tema + +No utilice ningún widget de nivel superior que GetMaterialApp para actualizarlo. Esto puede activar claves duplicadas. Mucha gente está acostumbrada al enfoque prehistórico de crear un widget "ThemeProvider" solo para cambiar el tema de su aplicación, y esto definitivamente NO es necesario con GetX. + +Puede crear su tema personalizado y simplemente agregarlo dentro de Get.changeTheme sin ningún boilerplate para eso: + +```dart +Get.changeTheme(ThemeData.light()); +``` + +Si desea crear algo así como un botón que cambia el tema con onTap, puede combinar dos APIs GetX para eso, la API que verifica si se está utilizando el tema oscuro y la API de cambio de tema, simplemente puede poner esto dentro de un onPressed: + +```dart +Get.changeTheme(Get.isDarkMode? ThemeData.light(): ThemeData.dark()); +``` + +Cuando el modo oscuro está activado, cambiará al tema claro, y cuando el tema claro esté activado, cambiará a oscuro. + +Si quieres saber en profundidad cómo cambiar el tema, puedes seguir este tutorial en Medium que incluso enseña la persistencia del tema usando GetX: + +- [Temas dinámicos en 3 líneas usando GetX](https://medium.com/swlh/flutter-dynamic-themes-in-3-lines-c3b375f292e3) - Tutorial de [Rod Brown](https://github.com/RodBr). + +## Otras API avanzadas y configuraciones manuales + +GetMaterialApp configura todo para usted, pero si desea configurar GetX manualmente utilizando APIs avanzadas. + +```dart +MaterialApp( + navigatorKey: Get.key, + navigatorObservers: [GetObserver()], +); +``` + +También podrá usar su propio Middleware dentro de GetObserver, esto no influirá en nada. + +```dart +MaterialApp( + navigatorKey: Get.key, + navigatorObservers: [GetObserver(MiddleWare.observer)], // Here +); +``` + +```dart +// dar los argumentos actuales de currentScreen +Get.arguments + +// dar el nombre de la ruta anterior +Get.previousRoute + +// dar la ruta sin procesar para acceder, por ejemplo, rawRoute.isFirst() +Get.rawRoute + +// dar acceso a Routing API desde GetObserver +Get.routing + +// comprobar si la cafetería está abierta +Get.isSnackbarOpen + +// comprobar si el diálogo está abierto +Get.isDialogOpen + +// comprobar si bottomsheet está abierto +Get.isBottomSheetOpen + +// eliminar una ruta. +Get.removeRoute() + +// volver repetidamente hasta que predicate devuelva verdadero. +Get.until() + +//ir a la siguiente ruta y eliminar todas las rutas anteriores hasta que predicate devuelva verdadero. +Get.offUntil() + +// ir a la siguiente ruta con nombre y eliminar todas las rutas anteriores hasta que predicate devuelve verdadero. +Get.offNamedUntil() + +//Verifique en qué plataforma se ejecuta la aplicación +GetPlatform.isAndroid +GetPlatform.isIOS +GetPlatform.isWeb + +// Equivalente al método: MediaQuery.of(context).size.height, pero son inmutables. +Get.height +Get.width + +// Da el contexto de la pantalla en primer plano en cualquier parte de su código. +Get.context + +// Da el contexto de la barra de bocadillos / diálogo / hoja inferior en primer plano en cualquier parte de su código. +Get.contextOverlay + +// Note: los siguientes métodos son extensiones de context. Desde que tu +// tiene acceso al contexto en cualquier lugar de su interfaz de usuario, puede usarlo en cualquier lugar del código de la interfaz de usuario + +// Si necesita un cambiable height/width (como las ventanas del navegador que se pueden escalar) necesitará usar context. +context.width +context.height + + + +// le da el poder de definir la mitad de la pantalla ahora, un tercio y así sucesivamente. +// Útil para aplicaciones receptivas. +// param dividedBy (double) optional - default: 1 +// param reducedBy (double) optional - default: 0 +context.heightTransformer() +context.widthTransformer() + +/// Similar a MediaQuery.of(context).size +context.mediaQuerySize() + +/// similar a MediaQuery.of(context).padding +context.mediaQueryPadding() + +/// similar a MediaQuery.of(context).viewPadding +context.mediaQueryViewPadding() + +/// similar a MediaQuery.of(context).viewInsets; +context.mediaQueryViewInsets() + +/// similar a MediaQuery.of(context).orientation; +context.orientation() + +/// comprobar si el dispositivo esta en landscape mode +context.isLandscape() + +/// comprobar si el dispositivo esta en portrait mode +context.isPortrait() + +/// similar a MediaQuery.of(context).devicePixelRatio; +context.devicePixelRatio() + +/// similar a MediaQuery.of(context).textScaleFactor; +context.textScaleFactor() + +/// obtener el lado más corto de la pantalla +context.mediaQueryShortestSide() + +/// Verdadero si el ancho es mayor que 800 +context.showNavbar() + +/// Verdadero si el lado más corto es menor que 600p +context.isPhone() + +/// Verdadero si el lado más corto es más grande que 600p +context.isSmallTablet() + +/// Verdadero si el lado más corto es mayor que 720p +context.isLargeTablet() + +/// Verdadero si el dispositivo actual es una tableta +context.isTablet() +``` + +### Configuraciones globales opcionales + +Puede crear configuraciones globales para GetX. Simplemente agregue Get.config a su código antes de insertar cualquier ruta o hágalo directamente en su GetMaterialApp + +```dart +GetMaterialApp( + enableLog: true, + defaultTransition: Transition.fade, + opaqueRoute: Get.isOpaqueRouteDefault, + popGesture: Get.isPopGestureEnable, + transitionDuration: Get.defaultDurationTransition, + defaultGlobalState: Get.defaultGlobalState, +); + +Get.config( + enableLog = true, + defaultPopGesture = true, + defaultTransition = Transitions.cupertino +) +``` + +Opcionalmente, puede redirigir todos los mensajes de registro de Get. Si desea utilizar su propio paquete de registro favorito y desea capturar los registros allí. + +```dart +GetMaterialApp( + enableLog: true, + logWriterCallback: localLogWriter, +); + +void localLogWriter(String text, {bool isError = false}) { + // pase el mensaje a su paquete de registro favorito aquí + //Nota: incluso si los mensajes de registro están desactivados + // con el comando "enableLog: false", los mensajes seguirán pasando por aquí + // Debe verificar esta configuración manualmente aquí si desea respetarla +} + +``` + +## Video explanation of Other GetX Features + +Amateur Coder hizo un video asombroso sobre utilidades, almacenamiento, enlaces y otras características! Link: [GetX Other Features](https://youtu.be/ttQtlX_Q0eU) + +# Cambios importantes desde 2.0 + +1- Rx types: + +| Antes | Ahora | +| ------- | ---------- | +| StringX | `RxString` | +| IntX | `RxInt` | +| MapX | `RxMap` | +| ListX | `RxList` | +| NumX | `RxNum` | +| DoubleX | `RxDouble` | + +RxController y GetBuilder ahora se han fusionado, ya no necesita memorizar qué controlador desea usar, solo use GetXController, funcionará para gestión de estádo simple y también para reactivo. + +2- Rutas Nombradas + +Antes: + +```dart +GetMaterialApp( + namedRoutes: { + '/': GetRoute(page: Home()), + } +) +``` + +Ahora: + +```dart +GetMaterialApp( + getPages: [ + GetPage(name: '/', page: () => Home()), + ] +) +``` + +¿Por qué este cambio? + +A menudo, puede ser necesario decidir qué página se mostrará desde un parámetro o un token de inicio de sesión, el enfoque anterior era inflexible, ya que no permitía esto. + +Insertar la página en una función ha reducido significativamente el consumo de RAM, ya que las rutas no se asignarán en la memoria desde que se inició la aplicación, y también permitió hacer este tipo de enfoque: + +```dart +GetStorage box = GetStorage(); + +GetMaterialApp( + getPages: [ + GetPage(name: '/', page:(){ + return box.hasData('token') ? Home() : Login(); + }) + ] +) +``` + +# ¿Por qué Getx? + +1- Después de una actualización de Flutter, muchos paquetes suelen romperse. A veces se producen errores de compilación, errores de los que aún no hay respuestas y el desarrollador necesita saber el origen del error, poder rastrear, y solo entonces intentar abrir un issue en el repositorio correspondiente, para finalmente ver su problema resuelto. Getx centraliza los principales recursos para el desarrollo (gestión de estado, dependencia y rutas), lo que le permite agregar un único paquete a su pubspec y comenzar a trabajar. Después de una actualización de Flutter, lo único que debe hacer es actualizar la dependencia Get y ponerse a trabajar. Get también resuelve problemas de compatibilidad. ¿Cuántas veces una versión de un paquete no es compatible con la versión de otro, porque una usa una dependencia en una versión y la otra en otra? Tampoco es una preocupación usando Get, ya que todo estará en el mismo paquete y será totalmente compatible. + +2- Flutter es fácil, Flutter es increíble, pero todavía tiene algo repetitivo que puede ser no deseado para la mayoría de los desarrolladores, como `Navigator.of(context).push (context, builder [...]`. Get simplifica el desarrollo. En lugar de escribir 8 líneas de código para simplemente llamar a una ruta, simplemente puede hacerlo: `Get.to(Home())` y listo, irá a la página siguiente. Algo doloroso de hacer con Flutter actualmente, mientras que con GetX es estúpidamente simple. Gestionar estados en Flutter y dependencias también es algo que genera mucho debate, ya que hay cientos de patrones en el pub. Pero no hay nada tan fácil como agregar un ".obs" al final de su variable, y colocar su widget dentro de un Obx, y eso es todo, todas las actualizaciones de esa variable se actualizarán automáticamente en la pantalla. + +3- Facilidad sin preocuparse por el rendimiento. El rendimiento de Flutter ya es sorprendente, pero imagine que usa un gestor de estado y un localizador para distribuir sus clases de bloc/stores/controllers/ etc. Tendrá que llamar manualmente a la exclusión de esa dependencia cuando no la necesite. Pero, ¿alguna vez pensó en simplemente usar el controlador, y cuando ya no sea necesario, simplemente se elimine de la memoria? Eso es lo que hace GetX. Con SmartManagement, todo lo que no se está utilizando se elimina de la memoria, y no debería tener que preocuparse por nada más que la programación. Se le garantiza el consumo mínimo de recursos, sin siquiera haber creado una lógica para esto. + +4- Desacoplamiento real. Es posible que haya escuchado la idea de "separar la vista de la lógica de negocio". Esta no es una peculiaridad de BLoC, MVC, MVVM, cualquier otro estándar en el mercado tiene este concepto. Sin embargo, a menudo se puede mitigar en Flutter debido al uso del contexto. +Si necesita contexto para encontrar un InheritedWidget, lo necesita en la vista o pasado por parámetro. En particular, encuentro esta solución muy fea, y para trabajar en equipo siempre tendremos una dependencia de la lógica de negocios de la vista. Getx no es ortodoxo con el enfoque estándar, y aunque no prohíbe completamente el uso de StatefulWidgets, InitState, etc., siempre tiene un enfoque similar que puede ser más limpio. Los controladores tienen ciclos de vida, y cuando necesita hacer una solicitud API REST, por ejemplo, no depende de nada en la vista. Puede usar onInit para iniciar la llamada http, y cuando lleguen los datos, se rellenarán las variables. Como GetX es completamente reactivo (realmente, y funciona bajo streams), una vez que se llenan los elementos, todos los widgets que usan esa variable se actualizarán automáticamente en la vista. Esto permite que las personas con experiencia en IU trabajen solo con widgets y no tengan que enviar nada a la lógica de negocios que no sean eventos de usuario (como hacer clic en un botón), mientras que las personas que trabajan con lógica de negocios podrán crearla y probarla por separado. + +Esta librería siempre se actualizará e implementará nuevas características. Siéntase libre de ofrecer PRs y contribuir a ellas. + +# Comunidad + +## Canales de la comunidad + +GetX tiene una comunidad muy activa e implicada. Si tiene dudas, o necesita cualquier tipo de asistencia sobre el uso de este framework, no dude en unirse a nuestr, tu duda será resuelta lo antes posible. Este repositorio es de uso exclusivo para abrir issues, pero siéntase libre de unirse a la Comunidad de GetX. + + +| **Slack (🇬🇧)** | **Discord (🇬🇧 y 🇵🇹)** | **Telegram (🇵🇹)** | +| :-------------------------------------------------------------------------------------------------------------------------- | :-------------------------------------------------------------------------------------------------------------------------- | :-------------------------------------------------------------------------------------------------------------------- | +| [![Get on Slack](https://img.shields.io/badge/slack-join-orange.svg)](https://communityinviter.com/apps/getxworkspace/getx) | [![Discord Shield](https://img.shields.io/discord/722900883784073290.svg?logo=discord)](https://discord.com/invite/9Hpt99N) | [![Telegram](https://img.shields.io/badge/chat-on%20Telegram-blue.svg)](https://t.me/joinchat/PhdbJRmsZNpAqSLJL6bH7g) | + + +# Cómo contribuir + +_¿Quieres contribuir al proyecto? Estaremos orgullosos de destacarte como uno de nuestros colaboradores. Aquí hay algunos puntos en los que puede contribuir y hacer que GetX (y Flutter) sea aún mejor._ + +- Ayudando a traducir el archivo Léame a otros idiomas. + +- Agregar documentación al archivo Léame (ni siquiera la mitad de las funciones de GetX han sido documentadas todavía). + +- Escriba artículos o haga videos que enseñen cómo usar GetX (se insertarán en el archivo Léame y en el futuro en nuestro Wiki). + +- Ofreciendo PRs para código/pruebas. + +- Incluyendo nuevas funciones. + +¡Cualquier contribución es bienvenida! + +## Artículos y vídeos (inglés) + +- [Flutter Getx EcoSystem package for arabic people](https://www.youtube.com/playlist?list=PLV1fXIAyjeuZ6M8m56zajMUwu4uE3-SL0) - Tutorial by [Pesa Coder](https://github.com/UsamaElgendy). +- [Dynamic Themes in 3 lines using GetX™](https://medium.com/swlh/flutter-dynamic-themes-in-3-lines-c3b375f292e3) - Tutorial by [Rod Brown](https://github.com/RodBr). +- [Complete GetX™ Navigation](https://www.youtube.com/watch?v=RaqPIoJSTtI) - Route management video by Amateur Coder. +- [Complete GetX State Management](https://www.youtube.com/watch?v=CNpXbeI_slw) - State management video by Amateur Coder. +- [GetX™ Other Features](https://youtu.be/ttQtlX_Q0eU) - Utils, storage, bindings and other features video by Amateur Coder. +- [Firestore User with GetX | Todo App](https://www.youtube.com/watch?v=BiV0DcXgk58) - Video by Amateur Coder. +- [Firebase Auth with GetX | Todo App](https://www.youtube.com/watch?v=-H-T_BSgfOE) - Video by Amateur Coder. +- [The Flutter GetX™ Ecosystem ~ State Management](https://medium.com/flutter-community/the-flutter-getx-ecosystem-state-management-881c7235511d) - State management by [Aachman Garg](https://github.com/imaachman). +- [The Flutter GetX™ Ecosystem ~ Dependency Injection](https://medium.com/flutter-community/the-flutter-getx-ecosystem-dependency-injection-8e763d0ec6b9) - Dependency Injection by [Aachman Garg](https://github.com/imaachman). +- [GetX, the all-in-one Flutter package](https://www.youtube.com/watch?v=IYQgtu9TM74) - A brief tutorial covering State Management and Navigation by Thad Carnevalli. +- [Build a To-do List App from scratch using Flutter and GetX](https://www.youtube.com/watch?v=EcnqFasHf18) - UI + State Management + Storage video by Thad Carnevalli. +- [GetX Flutter Firebase Auth Example](https://medium.com/@jeffmcmorris/getx-flutter-firebase-auth-example-b383c1dd1de2) - Article by Jeff McMorris. +- [Flutter State Management with GetX – Complete App](https://www.appwithflutter.com/flutter-state-management-with-getx/) - by App With Flutter. +- [Flutter Routing with Animation using Get Package](https://www.appwithflutter.com/flutter-routing-using-get-package/) - by App With Flutter. +- [A minimal example on dartpad](https://dartpad.dev/2b3d0d6f9d4e312c5fdbefc414c1727e?) - by [Roi Peker](https://github.com/roipeker) diff --git a/siro_rider/packages/get/README-fr.md b/siro_rider/packages/get/README-fr.md new file mode 100644 index 0000000..765fd18 --- /dev/null +++ b/siro_rider/packages/get/README-fr.md @@ -0,0 +1,1134 @@ +![](https://raw.githubusercontent.com/jonataslaw/getx-community/master/get.png) + +**Langues: Français (Ce fichier), [Anglais](README.md), [Vietnamien](README-vi.md), [Indonésien](README.id-ID.md), [Urdu](README.ur-PK.md), [Chinois](README.zh-cn.md), [Portuguais du Brésil](README.pt-br.md), [Espagnol](README-es.md), [Russe](README.ru.md), [Polonais](README.pl.md), [Koréen](README.ko-kr.md).** + +[![pub package](https://img.shields.io/pub/v/get.svg?label=get&color=blue)](https://pub.dev/packages/get) +[![popularity](https://badges.bar/get/popularity)](https://pub.dev/packages/sentry/score) +[![likes](https://badges.bar/get/likes)](https://pub.dev/packages/get/score) +[![pub points](https://badges.bar/get/pub%20points)](https://pub.dev/packages/get/score) +![building](https://github.com/jonataslaw/get/workflows/build/badge.svg) +[![style: effective dart](https://img.shields.io/badge/style-effective_dart-40c4ff.svg)](https://pub.dev/packages/effective_dart) +[![Discord Shield](https://img.shields.io/discord/722900883784073290.svg?logo=discord)](https://discord.com/invite/9Hpt99N) +[![Get on Slack](https://img.shields.io/badge/slack-join-orange.svg)](https://communityinviter.com/apps/getxworkspace/getx) +[![Telegram](https://img.shields.io/badge/chat-on%20Telegram-blue.svg)](https://t.me/joinchat/PhdbJRmsZNpAqSLJL6bH7g) + +Awesome Flutter + +Achetez moi un cafe + +![](https://raw.githubusercontent.com/jonataslaw/getx-community/master/getx.png) + +- [A Propos de Get](#a-propos-de-get) +- [Installation](#installation) +- [L'application 'Counter' avec GetX](#application-counter-avec-getx) +- [Les trois pilliers](#les-trois-pilliers) + - [Gestion d'état (State management)](#gestion-d-etat) + - [Gestionnaire d'état réactif (Reactive State Manager)](#gestionnaire-d-etat-reactif) + - [Plus de détails sur la gestion d'état](#plus-de-details-sur-la-gestion-d-etat) + - [Gestion de route](#gestion-de-route) + - [Plus de détails sur la gestion de route](#plus-de-details-sur-la-gestion-de-route) + - [Gestion des dépendances](#gestion-des-dependances) + - [Plus de détails sur la gestion des dépendances](#plus-de-details-sur-la-gestion-des-dependances) +- [Utils](#utils) + - [Internationalization](#internationalization) + - [Traductions](#traductions) + - [Utiliser les traductions](#utiliser-les-traductions) + - [Locales](#locales) + - [Changer la locale](#changer-la-locale) + - [Locale du Système](#locale-du-systeme) + - [Changer le Thème](#changer-le-theme) + - [GetConnect](#getconnect) + - [Configuration par défaut](#configuration-par-defaut) + - [Configuration personnalisée](#configuration-personnalisee) + - [Middleware GetPage](#middleware-getpage) + - [Priority](#priority) + - [Redirect](#redirect) + - [onPageCalled](#onpagecalled) + - [OnBindingsStart](#onbindingsstart) + - [OnPageBuildStart](#onpagebuildstart) + - [OnPageBuilt](#onpagebuilt) + - [OnPageDispose](#onpagedispose) + - [Autres APIs](#autres-apis) + - [Paramètres globaux et configurations manuelles facultatifs](#parametres-globaux-et-configurations-manuelles-facultatifs) + - [State Widgets Locaux](#state-widgets-locaux) + - [ValueBuilder](#valuebuilder) + - [ObxValue](#obxvalue) + - [Conseils utiles](#conseils-utiles) + - [GetView](#getview) + - [GetResponsiveView](#getresponsiveview) + - [Guide d'utilisation](#guide-d-utilisation) + - [GetWidget](#getwidget) + - [GetxService](#getxservice) +- [Changements par rapport à 2.0](#changements-par-rapport-a-20) +- [Pourquoi Getx?](#pourquoi-getx) +- [Communité](#communite) + - [Chaînes communautaires](#chaines-communautaires) + - [Comment contribuer](#comment-contribuer) + - [Articles et videos](#articles-et-videos) + +# A Propos de Get + +- GetX est une solution extra-légère et puissante pour Flutter. Il combine une gestion d'état (state management) de haute performance, une injection de dépendances (dependency injection) intelligente et une gestion de route (route management) rapide et pratique. + +- GetX a 3 principes de base. Cela signifie que ces principes sont les priorités pour toutes les ressources de la bibliothèque GetX: **PRODUCTIVITÉ, PERFORMANCE ET ORGANIZATION.** + + - **PERFORMANCE:** GetX se concentre sur la performance et la consommation minimale de ressources. GetX n'utilise ni Streams ni ChangeNotifier. + + - **PRODUCTIVITÉ:** GetX utilise une syntaxe simple et agréable. Peu importe ce que vous voulez faire, il existe toujours un moyen plus simple avec GetX. Cela économisera des heures de développement et fournira les performances maximales que votre application peut offrir. + + En règle générale, le développeur doit s'occuper lui-même de la suppression des contrôleurs de la mémoire. Avec GetX, cela n'est pas nécessaire car les ressources sont, par défaut, supprimées de la mémoire lorsqu'elles ne sont pas utilisées. Si vous souhaitez les conserver en mémoire, vous devez déclarer explicitement "permanent: true" comme paramètre lors de la création de la ressource. De cette façon, en plus de gagner du temps, vous risquez moins d'avoir des ressources inutiles dans la mémoire. L'initialisation des ressources est également 'lazy' par défaut (i.e. se fait seulement lorsque la ressource est nécessaire). + + - **ORGANIZATION:** GetX permet le découplage total de la Vue (View), de la Logique de Présentation (Presentation Logic), de la Business Logic, de l'injection de dépendances (Dependency Injection) et de la Navigation. Vous n'avez pas besoin de contexte pour naviguer entre les routes, vous n'êtes donc pas dépendant de la hiérarchisation des widgets (visualisation) pour cela. Vous n'avez pas besoin de 'context' pour accéder à vos contrôleurs/blocs via un inheritedWidget, vous dissociez donc complètement votre logique de présentation (Vue) et votre Business logic de votre couche de visualisation. Vous n'avez pas besoin d'injecter vos classes Controlleûrs / Modèles / Blocs le long de la hiérarchie de Widgets via `MultiProvider`. Pour cela, GetX utilise sa propre fonction d'injection de dépendances (DI), découplant complètement la DI de sa Vue. + + Avec GetX, vous savez où trouver chaque module de votre application, avec un code propre par défaut. En plus de rendre la maintenance facile, cela rend le partage de modules quelque chose qui jusque-là dans Flutter était impensable, quelque chose de totalement possible. + BLoC était un point de départ pour organiser le code dans Flutter, il sépare la Business logic de la visualisation. GetX en est une évolution naturelle, séparant non seulement la Business logic mais aussi la logique de présentation. L'injection de dépendances et les routes sont également découplées, et la couche de données est séparée du tout. Vous savez où tout se trouve, et tout cela d'une manière plus facile que de construire un 'Hello World''. + GetX est le moyen le plus simple, pratique et évolutif de créer des applications hautes performances avec le SDK Flutter. Il possède un vaste écosystème qui fonctionne parfaitement, c'est facile pour les débutants et précis pour les experts. Il est sécurisé, stable, à jour et offre une vaste gamme d'API intégrées qui ne sont pas présentes dans le SDK Flutter par défaut. + +- GetX possède une multitude de fonctionnalités qui vous permettent de démarrer la programmation sans vous soucier de quoi que ce soit, mais chacune de ces fonctionnalités se trouve dans des conteneurs séparés et ne démarre qu'après utilisation. Si vous n'utilisez que la gestion des états (State Management), seule la gestion des états sera compilée. Si vous n'utilisez que des routes, rien de la gestion d'état ne sera compilé. + +- GetX a un énorme écosystème, une grande communauté, un grand nombre de collaborateurs, et sera maintenu tant que Flutter existera. GetX est également capable de fonctionner avec le même code sur Android, iOS, Web, Mac, Linux, Windows et sur votre serveur. Il est possible de réutiliser entièrement votre code créé sur le frontend et le backend avec Get Server. + **Il est possible d'entièrement réutiliser votre code écrit sur le frontend, pour le backend avec [Get Server](https://github.com/jonataslaw/get_server)**. + +**De plus, l'ensemble du processus de développement peut être complètement automatisé, à la fois sur le serveur et sur le front-end avec [Get CLI](https://github.com/jonataslaw/get_cli)**. + +**De plus, pour augmenter encore votre productivité, nous avons l'[extension pour VSCode](https://marketplace.visualstudio.com/items?itemName=get-snippets.get-snippets) et l'[extension pour Android Studio/Intellij](https://plugins.jetbrains.com/plugin/14975-getx-snippets)** + +# Installation + +Ajoutez Get à votre fichier pubspec.yaml: + +```yaml +dependencies: + get: +``` + +Importez Get dans les fichiers dans lesquels il doit être utilisé: + +```dart +import 'package:get/get.dart'; +``` + +# Application Counter avec Getx + +Le projet "Counter" créé par défaut sur chaque nouveau projet Flutter comporte plus de 100 lignes (avec commentaires). Pour montrer la puissance de Get, je vais vous montrer comment faire un "compteur" changeant d'état à chaque clic, naviguer entre les pages et partager l'état entre les écrans, le tout de manière organisée, en séparant la Business logic de la Vue, en SEULEMENT 26 LIGNES DE CODE INCLUANT LES COMMENTAIRES. + +- Step 1: + Ajoutez "Get" avant MaterialApp, pour le transformer en GetMaterialApp + +```dart +void main() => runApp(GetMaterialApp(home: Home())); +``` + +- Note: cela ne modifie pas le MaterialApp de Flutter, GetMaterialApp n'est pas un MaterialApp modifié, il s'agit simplement d'un widget préconfiguré, qui a le MaterialApp par défaut comme enfant (child: ). Vous pouvez le configurer manuellement, mais ce n'est certainement pas nécessaire. GetMaterialApp créera des routes, les injectera, injectera les traductions, injectera tout ce dont vous avez besoin pour la navigation de routes. Si vous utilisez Get uniquement pour la gestion de l'état (State management) ou la gestion des dépendances (DI), il n'est pas nécessaire d'utiliser GetMaterialApp. GetMaterialApp est nécessaire pour les routes, les 'snackbars', l'internationalisation, les 'bottomSheets', les dialogues et les API de haut niveau liés aux routes et à l'absence de 'context'. + +- Note²: Cette étape n'est nécessaire que si vous allez utiliser la gestion de routes (Get.to(), Get.back(), etc). Si vous ne l'utiliserez pas, il n'est pas nécessaire de faire l'étape 1. + +- Step 2: + Créez votre classe de Business logic et placez-y toutes les variables, méthodes et contrôleurs. + Vous pouvez rendre toute variable observable en utilisant un simple ".obs". + +```dart +class Controller extends GetxController{ + var count = 0.obs; + increment() => count++; +} +``` + +- Step 3: + Créez votre Vue, utilisez StatelessWidget et économisez de la RAM, avec Get, vous n'aurez peut-être plus besoin d'utiliser StatefulWidget. + +```dart +class Home extends StatelessWidget { + + @override + Widget build(context) { + + // Instanciez votre classe en utilisant Get.put() pour le rendre disponible pour tous les routes "descendantes". + final Controller c = Get.put(Controller()); + + return Scaffold( + // Utilisez Obx(()=> pour mettre à jour Text() chaque fois que count est changé. + appBar: AppBar(title: Obx(() => Text("Clicks: ${c.count}"))), + + // Remplacez les 8 lignes Navigator.push par un simple Get.to(). Vous n'avez pas besoin de 'context' + body: Center(child: ElevatedButton( + child: Text("Go to Other"), onPressed: () => Get.to(Other()))), + floatingActionButton: + FloatingActionButton(child: Icon(Icons.add), onPressed: c.increment)); + } +} + +class Other extends StatelessWidget { + // Vous pouvez demander à Get de trouver un contrôleur utilisé par une autre page et de vous y rediriger. + final Controller c = Get.find(); + + @override + Widget build(context){ + // Accéder à la variable 'count' qui est mise à jour + return Scaffold(body: Center(child: Text("${c.count}"))); + } +} +``` + +Résultat: + +![](https://raw.githubusercontent.com/jonataslaw/getx-community/master/counter-app-gif.gif) + +C'est un projet simple mais il montre déjà à quel point Get est puissant. Au fur et à mesure que votre projet se développe, cette différence deviendra plus significative. + +Get a été conçu pour fonctionner avec des équipes, mais il simplifie le travail d'un développeur individuel. + +Améliorez vos délais, livrez tout à temps sans perte de performances. Get n'est pas pour tout le monde, mais si vous vous êtes identifié à cette phrase, Get est fait pour vous! + +# Les trois pilliers + +## Gestion d Etat + +Get a deux gestionnaires d'état différents: le gestionnaire d'état simple (nous l'appellerons GetBuilder) et le gestionnaire d'état réactif (GetX / Obx). + +### Gestionnaire d Etat Reactif + +La programmation réactive peut aliéner de nombreuses personnes car on dit qu'elle est compliquée. GetX fait de la programmation réactive quelque chose d'assez simple: + +- Vous n'aurez pas besoin de créer des StreamControllers. +- Vous n'aurez pas besoin de créer un StreamBuilder pour chaque variable +- Vous n'aurez pas besoin de créer une classe pour chaque état. +- Vous n'aurez pas besoin de créer un 'get' pour une valeur initiale. +- Vous n'aurez pas besoin d'utiliser des générateurs de code + +La programmation réactive avec Get est aussi simple que d'utiliser setState. + +Imaginons que vous ayez une variable 'name' et que vous souhaitiez que chaque fois que vous la modifiez, tous les widgets qui l'utilisent soient automatiquement modifiés. + +Voici votre variable: + +```dart +var name = 'Jonatas Borges'; +``` + +Pour la rendre observable, il vous suffit d'ajouter ".obs" à la fin: + +```dart +var name = 'Jonatas Borges'.obs; +``` + +Et dans l'interface utilisateur, lorsque vous souhaitez afficher cette valeur et mettre à jour l'écran chaque fois qu'elle change, faites simplement: + +```dart +Obx(() => Text("${controller.name}")); +``` + +C'est _tout_. Si simple que ca. + +### Plus de details sur la gestion d Etat + +**Lire une explication plus approfondie de la gestion d'état [ici](./documentation/fr_FR/state_management.md). Là-bas, vous verrez plus d'exemples surtout pour la différence entre le gestionnaire d'état simple et le gestionnaire d'état réactif.** + +Vous pourrez vous faire une meilleure idée de la puissance de GetX. + +## Gestion de route + +Si vous envisagez d'utiliser des routes/snackbars/dialogs/bottomsheets sans 'context', GetX est également excellent pour vous, voyez par vous-même: + +Ajoutez "Get" avant votre MaterialApp, en le transformant en GetMaterialApp + +```dart +GetMaterialApp( // Avant: MaterialApp( + home: MyHome(), +) +``` + +Accédez à un nouvel écran: + +```dart + +Get.to(ÉcranSuivant()); +``` + +Accédez au nouvel écran par le nom. Voir plus de détails sur les itinéraires nommés (named routes) [ici](./documentation/fr_FR/route_management.md#navigation-avec-des-itinraires-nomms) + +```dart + +Get.toNamed('/details'); +``` + +Pour fermer des snackbars, dialogs, bottomsheets, ou tout ce que vous auriez normalement fermé avec Navigator.pop(context); + +```dart +Get.back(); +``` + +Pour aller à l'écran suivant avec aucune option pour revenir à l'écran précédent (pour une utilisation dans SplashScreens, écrans de connexion, etc.) + +```dart +Get.off(NextScreen()); +``` + +Pour aller à l'écran suivant et annuler tous les itinéraires précédents (utile dans les paniers d'achat en ligne, les sondages et les tests) + +```dart +Get.offAll(NextScreen()); +``` + +Avez-vous remarqué que vous n'avez eu besoin d'utiliser 'context' pour aucune de ces opérations? C'est l'un des plus grands avantages de l'utilisation de la gestion de route avec Get. Avec cela, vous pouvez appeler toutes ces méthodes à partir de votre classe de contrôleur, sans soucis. + +### Plus de details sur la gestion de route + +**Get fonctionne avec des itinéraires nommés (named routes) et offre également un contrôle plus granulaire de vos routes! Il y a une documentation approfondie [ici](./documentation/fr_FR/route_management.md)** + +## Gestion des dependances + +Get a un gestionnaire de dépendances (dependency manager) simple et puissant qui vous permet de récupérer la même classe que votre Bloc ou Controller avec seulement 1 ligne de code, pas de 'context' Provider, pas d'inheritedWidget: + +```dart +Controller controller = Get.put(Controller()); // Au lieu de Controller controller = Controller(); +``` + +- Remarque: Si vous utilisez le gestionnaire d'état de Get, accordez plus d'attention à l'API 'Bindings', qui facilitera la connexion de vos Vues à vos contrôleurs. + +Au lieu d'instancier votre classe dans la classe que vous utilisez, vous l'instanciez dans l'instance Get, ce qui la rendra disponible dans toute votre application. +Vous pouvez donc utiliser votre contrôleur (ou classe Bloc) normalement. + +**Conseil:** La gestion des dépendances est découplée des autres parties du package, donc si, par exemple, votre application utilise déjà un gestionnaire d'état (n'importe lequel, peu importe), vous n'avez pas besoin de tout réécrire, vous pouvez l'utiliser avec l'injection de dépendance de Get sans aucun problème. + +```dart +controller.fetchApi(); +``` + +Imaginez que vous ayez parcouru de nombreuses routes et que vous ayez besoin de données qui ont été laissées dans votre contrôleur, vous auriez besoin d'un gestionnaire d'état combiné avec le 'Provider' ou 'Get_it', n'est-ce pas? Pas avec Get. Il vous suffit de demander à Get de "trouver" votre contrôleur, vous n'avez pas besoin de dépendances supplémentaires: + +```dart +Controller controller = Get.find(); +//Oui, cela ressemble à de la magie. Get trouvera votre contrôleur et vous le livrera. Vous pouvez avoir 1 million de contrôleurs instanciés, Get vous retournera toujours le bon contrôleur. +``` + +Et puis vous pourrez récupérer les données de votre contrôleur obtenu précédemment: + +```dart +Text(controller.textFromApi); +``` + +### Plus de details sur la gestion des dependances + +**Trouvez une explication plus détaillée sur la gestion des dépendances [ici](./documentation/fr_FR/dependency_management.md)** + +# Utils + +## Internationalization + +### Traductions + +Les traductions sont enregistrées sous forme de dictionaire clé-valeur simple. +Pour ajouter des traductions, créez une classe qui 'extend' `Translations`. + +```dart +import 'package:get/get.dart'; + +class Messages extends Translations { + @override + Map> get keys => { + 'en_US': { + 'hello': 'Hello World', + }, + 'de_DE': { + 'hello': 'Hallo Welt', + } + }; +} +``` + +#### Utiliser les traductions + +Ajouter juste `.tr` à la clé et elle sera traduite selon la valeur actuelle `Get.locale` et de `Get.fallbackLocale`. + +```dart +Text('title'.tr); +``` + +#### Utiliser les traductions avec le singulier et le pluriel + +```dart +var products = []; +Text('cléAuSingulier'.trPlural('cléAuPluriel', products.length, Args)); +``` + +#### Utiliser les traductions avec paramètres + +```dart +import 'package:get/get.dart'; + + +Map> get keys => { + 'en_US': { + 'logged_in': 'logged in as @name with email @email', + }, + 'es_ES': { + 'logged_in': 'iniciado sesión como @name con e-mail @email', + } +}; + +Text('logged_in'.trParams({ + 'name': 'Jhon', + 'email': 'jhon@example.com' + })); +``` + +### Locales + +'Locales' signifie lieux. +Pour definir les traductions, passer les paramètres 'locale' et 'translations' à GetMaterialApp. + +```dart +return GetMaterialApp( + translations: Messages(), // Vos traductions + locale: Locale('en', 'US'), // Les traductions seront faites dans cette 'locale' (langue) + fallbackLocale: Locale('en', 'UK'), // definit le 'language de secours' au cas oú un language invalide est sélectionné. +); +``` + +#### Changer la locale + +Appelez `Get.updateLocale (locale)` pour mettre à jour la locale. Les traductions utilisent alors automatiquement la nouvelle langue. + +```dart +var locale = Locale('en', 'US'); +Get.updateLocale(locale); +``` + +#### Locale du systeme + +Pour lire les paramètres régionaux ('locales') du système, vous pouvez utiliser `Get.deviceLocale`. + +```dart +return GetMaterialApp( + locale: Get.deviceLocale, +); +``` + +## Changer le Theme + +Veuillez ne pas utiliser de widget de niveau supérieur à `GetMaterialApp` pour le mettre à jour. Cela peut créer des clés ('keys') en double. Beaucoup de gens sont habitués à l'approche préhistorique de la création d'un widget "ThemeProvider" juste pour changer le thème de votre application, et ce n'est certainement PAS nécessaire avec **GetX ™**. + +Vous pouvez créer votre thème personnalisé et l'ajouter simplement dans `Get.changeTheme` sans aucune préconfiguration pour cela: + +```dart +Get.changeTheme(ThemeData.light()); +``` + +Si vous voulez créer quelque chose comme un bouton qui change le thème dans `onTap`, vous pouvez combiner deux API **GetX ™** pour cela: + +- L'API qui vérifie si le "Thème" sombre est utilisé. +- Et l'API de changement de thème, vous pouvez simplement le mettre dans un 'onPressed': + +```dart +Get.changeTheme(Get.isDarkMode? ThemeData.light(): ThemeData.dark()); +``` + +Lorsque 'onPressed' est appelé, si `.darkmode` est activé, il passera au _thème clair_, et lorsque le _thème clair_ est actif, il passera au _thème sombre_. + +## GetConnect + +GetConnect est un moyen facile de communiquer de votre backend à votre frontend avec http ou websockets. + +### Configuration par defaut + +Vous pouvez simplement 'extends' GetConnect et utiliser les méthodes GET / POST / PUT / DELETE / SOCKET pour communiquer avec votre API Rest ou vos websockets. + +```dart +class UserProvider extends GetConnect { + // Get request + Future getUser(int id) => get('http://youapi/users/$id'); + // Post request + Future postUser(Map data) => post('http://youapi/users', body: data); + // Post request with File + Future> postCases(List image) { + final form = FormData({ + 'file': MultipartFile(image, filename: 'avatar.png'), + 'otherFile': MultipartFile(image, filename: 'cover.png'), + }); + return post('http://youapi/users/upload', form); + } + + GetSocket userMessages() { + return socket('https://yourapi/users/socket'); + } +} +``` + +### Configuration personnalisee + +GetConnect est hautement personnalisable. Vous pouvez définir l'URL de base, comme modificateurs de réponse, comme modificateurs de requêtes, définir un authentificateur, et même le nombre de tentatives oú il tentera de s'authentifier, en plus de donner la possibilité de définir un décodeur standard qui transformera toutes vos Requêtes dans vos Modèles sans aucune configuration supplémentaire. + +```dart +class HomeProvider extends GetConnect { + @override + void onInit() { + // Toute 'Request' passera à jsonEncode donc CasesModel.fromJson() + httpClient.defaultDecoder = CasesModel.fromJson; + httpClient.baseUrl = 'https://api.covid19api.com'; + // baseUrl = 'https://api.covid19api.com'; + // Il définit baseUrl pour Http et websockets si utilisé sans instance [httpClient] + + // Cela attachera la propriété 'apikey' sur l'en-tête ('header') de toutes les 'request's + httpClient.addRequestModifier((request) { + request.headers['apikey'] = '12345678'; + return request; + }); + + // Même si le serveur envoie des données avec le pays "Brésil", + // cela ne sera jamais affiché aux utilisateurs, car vous supprimez + // ces données de la réponse, même avant que la réponse ne soit délivrée + httpClient.addResponseModifier((request, response) { + CasesModel model = response.body; + if (model.countries.contains('Brazil')) { + model.countries.remove('Brazil'); + } + }); + + httpClient.addAuthenticator((request) async { + final response = await get("http://yourapi/token"); + final token = response.body['token']; + // Définit l'en-tête + request.headers['Authorization'] = "$token"; + return request; + }); + + // L'Autenticator sera appelé 3 fois si HttpStatus est HttpStatus.unauthorized + httpClient.maxAuthRetries = 3; + } + + + @override + Future> getCases(String path) => get(path); +} +``` + +## Middleware GetPage + +GetPage a maintenant une nouvelle propriété qui prend une liste de GetMiddleWare et les exécute dans l'ordre spécifique. + +**Note**: Lorsque GetPage a un Middleware, tous les enfants de cette page auront automatiquement les mêmes middlewares. + +### Priority + +L'ordre des middlewares à exécuter peut être défini par la priorité dans GetMiddleware. + +```dart +final middlewares = [ + GetMiddleware(priority: 2), + GetMiddleware(priority: 5), + GetMiddleware(priority: 4), + GetMiddleware(priority: -8), +]; +``` + +ces middlewares seront exécutés dans cet ordre **-8 => 2 => 4 => 5** + +### Redirect + + Cette fonction sera appelée lors de la recherche de la page de l'itinéraire appelé. Elle reçoit RouteSettings comme résultat vers oú rediriger. Sinon donnez-lui la valeur null et il n'y aura pas de redirection. + +```dart +RouteSettings redirect(String route) { + final authService = Get.find(); + return authService.authed.value ? null : RouteSettings(name: '/login'); +} +``` + +### onPageCalled + +Cette fonction sera appelée lorsque cette page sera appelée. +Vous pouvez l'utiliser pour changer quelque chose sur la page ou lui donner une nouvelle page. + +```dart +GetPage onPageCalled(GetPage page) { + final authService = Get.find(); + return page.copyWith(title: 'Welcome ${authService.UserName}'); +} +``` + +### OnBindingsStart + +Cette fonction sera appelée juste avant l'initialisation des liaisons ('bidings'). +Ici, vous pouvez modifier les liaisons de cette page. + +```dart +List onBindingsStart(List bindings) { + final authService = Get.find(); + if (authService.isAdmin) { + bindings.add(AdminBinding()); + } + return bindings; +} +``` + +### OnPageBuildStart + +Cette fonction sera appelée juste après l'initialisation des liaisons ('bidings'). +Ici, vous pouvez faire quelque chose après avoir créé les liaisons et avant de créer le widget de page. + +```dart +GetPageBuilder onPageBuildStart(GetPageBuilder page) { + print('les liaisons sont prêtes'); + return page; +} +``` + +### OnPageBuilt + +Cette fonction sera appelée juste après l'appel de la fonction GetPage.page et vous donnera le résultat de la fonction et prendra le widget qui sera affiché. + +### OnPageDispose + +Cette fonction sera appelée juste après avoir disposé tous les objets associés (contrôleurs, vues, ...) à la page. + +## Autres APIs + +```dart +// donne les arguments actuels de currentScreen +Get.arguments + +// donne le nom de l'itinéraire précédent +Get.previousRoute + +// donne la route brute d'accès par exemple, rawRoute.isFirst() +Get.rawRoute + +// donne accès à l'API de routing de GetObserver +Get.routing + +// vérifier si le snackbar est ouvert +Get.isSnackbarOpen + +// vérifier si la boîte de dialogue est ouverte +Get.isDialogOpen + +// vérifie si la bottomSheet est ouverte +Get.isBottomSheetOpen + +// supprime une route. +Get.removeRoute() + +// retourne à plusieurs reprises jusqu'à ce que le prédicat retourne 'true'. +Get.until() + +// passe à la route suivante et supprime toutes les routes précédentes jusqu'à ce que le prédicat retourne 'true'. +Get.offUntil() + +// passe à la route nommée suivante et supprime toutes les routes précédentes jusqu'à ce que le prédicat retourne 'true'. +Get.offNamedUntil() + +// Vérifie sur quelle plate-forme l'application s'exécute +GetPlatform.isAndroid +GetPlatform.isIOS +GetPlatform.isMacOS +GetPlatform.isWindows +GetPlatform.isLinux +GetPlatform.isFuchsia + +// Vérifie le type d'appareil +GetPlatform.isMobile +GetPlatform.isDesktop +// Toutes les plates-formes sont prises en charge indépendamment, dans le Web! +// Vous pouvez dire si vous utilisez un navigateur +// sur Windows, iOS, OSX, Android, etc. +GetPlatform.isWeb + + +// Équivaut à: MediaQuery.of(context).size.height, +// mais immuable. +Get.height +Get.width + +// Donne le 'context' actuel de 'Navigator'. +Get.context + +// Donne le contexte du snackbar / dialogue / bottomsheet au premier plan, n'importe où dans votre code. +Get.contextOverlay + +// Remarque: les méthodes suivantes sont des extensions sur le 'context'. Puisque vous +// avez accès au contexte à n'importe quel endroit de votre interface utilisateur, vous pouvez l'utiliser n'importe où dans le code de l'interface utilisateur + +// Si vous avez besoin d'une hauteur / largeur variable (comme les fenêtres de bureau ou de navigateur qui peuvent être mises à l'échelle), vous devrez utiliser le contexte. +context.width +context.height + +// Vous donne le pouvoir de définir la moitié de l'écran, un tiers de celui-ci et ainsi de suite. +// Utile pour les applications responsives. +// paramètre dividedBy (double) optionnel - par défaut: 1 +// paramètre reducedBy (double) facultatif - par défaut: 0 +context.heightTransformer () +context.widthTransformer () + +/// Similaire à MediaQuery.of(context).size +context.mediaQuerySize() + +/// Similaire à MediaQuery.of(context).padding +context.mediaQueryPadding() + +/// Similaire à MediaQuery.of(context).viewPadding +context.mediaQueryViewPadding() + +/// Similaire à MediaQuery.of(context).viewInsets; +context.mediaQueryViewInsets() + +/// Similaire à MediaQuery.of(context).orientation; +context.orientation() + +/// Vérifie si l'appareil est en mode paysage +context.isLandscape() + +/// Vérifie si l'appareil est en mode portrait +context.isPortrait() + +/// Similaire à MediaQuery.of(context).devicePixelRatio; +context.devicePixelRatio() + +/// Similaire à MediaQuery.of(context).textScaleFactor; +context.textScaleFactor() + +/// Obtenir le côté le plus court de l'écran +context.mediaQueryShortestSide() + +/// Vrai si la largeur est supérieure à 800p +context.showNavbar() + +/// Vrai si le côté le plus court est inférieur à 600p +context.isPhone() + +/// Vrai si le côté le plus court est plus grand que 600p +context.isSmallTablet() + +/// Vrai si le côté le plus court est plus grand que 720p +context.isLargeTablet() + +/// Vrai si l'appareil actuel est une tablette +context.isTablet() + +/// Renvoie une valeur en fonction de la taille de l'écran +/// peut donner une valeur pour: +/// watch: si le côté le plus court est inférieur à 300 +/// mobile: si le côté le plus court est inférieur à 600 +/// tablette: si le côté le plus court est inférieur à 1200 +/// bureautique: si la largeur est supérieure à 1200 +context.responsiveValue() +``` + +### Parametres globaux et configurations manuelles facultatifs + +GetMaterialApp configure tout pour vous, mais si vous souhaitez configurer Get manuellement: + +```dart +MaterialApp( + navigatorKey: Get.key, + navigatorObservers: [GetObserver()], +); +``` + +Vous pourrez également utiliser votre propre middleware dans `GetObserver`, cela n'influencera rien. + +```dart +MaterialApp( + navigatorKey: Get.key, + navigatorObservers: [ + GetObserver(MiddleWare.observer) // Ici + ], +); +``` + +Vous pouvez créer _Global Settings_ pour `Get`. Ajoutez simplement `Get.config` à votre code avant de changer de route. +Ou faites-le directement dans votre `GetMaterialApp` + +```dart +GetMaterialApp( + enableLog: true, + defaultTransition: Transition.fade, + opaqueRoute: Get.isOpaqueRouteDefault, + popGesture: Get.isPopGestureEnable, + transitionDuration: Get.defaultDurationTransition, + defaultGlobalState: Get.defaultGlobalState, +); + +Get.config( + enableLog = true, + defaultPopGesture = true, + defaultTransition = Transitions.cupertino +) +``` + +Vous pouvez éventuellement rediriger tous les messages de journalisation (logging) de `Get`. +Si vous souhaitez utiliser votre propre package de journalisation préféré, +et souhaitez capturer les logs là-bas: + +```dart +GetMaterialApp( + enableLog: true, + logWriterCallback: localLogWriter, +); + +void localLogWriter(String text, {bool isError = false}) { + // transmettez le message à votre package de journalisation préféré ici + // veuillez noter que même si enableLog: false, les messages du journal seront poussés dans ce 'callback' + // vérifiez le 'flag' si vous le souhaitez via GetConfig.isLogEnable +} + +``` + +### State Widgets Locaux + +Ces Widgets vous permettent de gérer une valeur unique, et de garder l'état éphémère et localement. +Nous avons des saveurs pour réactif et simple. +Par exemple, vous pouvez les utiliser pour basculer obscureText dans un `TextField`, peut-être créer un +Panneau extensible, ou peut-être modifier l'index actuel dans `BottomNavigationBar` tout en modifiant le contenu +de 'body' dans un `Scaffold`. + +#### ValueBuilder + +Une simplification de `StatefulWidget` qui fonctionne avec un callback `.setState` qui prend la valeur mise à jour. + +```dart +ValueBuilder( + initialValue: false, + builder: (value, updateFn) => Switch( + value: value, + onChanged: updateFn, // même signature! vous pouvez utiliser (newValue) => updateFn (newValue) + ), + // si vous devez appeler quelque chose en dehors de la méthode du builder. + onUpdate: (value) => print("Valeur mise à jour: $value"), + onDispose: () => print("Widget détruit"), +), +``` + +#### ObxValue + +Similaire à [`ValueBuilder`](#valuebuilder), mais c'est la version Reactive, vous passez une instance Rx (rappelez-vous les .obs magiques?) et il +se met à jour automatiquement ... n'est-ce pas génial? + +```dart +ObxValue((data) => Switch( + value: data.value, + onChanged: data, // Rx a une fonction _callable_! Vous pouvez utiliser (flag) => data.value = flag, + ), + false.obs, +), +``` + +## Conseils utiles + +`.obs`ervables (également appelés types _Rx_) ont une grande variété de méthodes et d'opérateurs internes. + +> Il est très courant de croire qu'une propriété avec `.obs` ** EST ** la valeur réelle ... mais ne vous y trompez pas! +> Nous évitons la déclaration Type de la variable, car le compilateur de Dart est assez intelligent, et le code +> semble plus propre, mais: + +```dart +var message = 'Hello world'.obs; +print( 'Message "$message" est de Type ${message.runtimeType}'); +``` + +Bien que `message` _prints_ la vraie valeur du String, le Type est **RxString**! + +Donc, vous ne pouvez pas faire `message.substring( 0, 4 )`. +Vous devez utiliser la vraie `valeur` dans _observable_: +La façon "la plus utilisée" est `.value`, mais, que vous pouviez aussi... + +```dart +final name = 'GetX'.obs; +// "met à jour" le flux, uniquement si la valeur est différente de la valeur actuelle. +name.value = 'Hey'; + +// Toutes les propriétés Rx sont "appelables" et renvoie la nouvelle valeur. +// mais cette approche n'accepte pas `null`, l'interface utilisateur ne sera pas reconstruite. +name('Hello'); + +// est comme un getter, affiche `Hello`. +name() ; + +/// nombres: + +final count = 0.obs; + +// Vous pouvez utiliser toutes les opérations non mutables à partir de num primitives! +count + 1; + +// Fais attention! ceci n'est valable que si `count` n'est pas final, mais var +count += 1; + +// Vous pouvez également comparer avec des valeurs: +count > 2; + +/// booleans: + +final flag = false.obs; + +// bascule la valeur entre true / false +flag.toggle(); + + +/// tous les types: + +// Définit la `valeur` sur null. +flag.nil(); + +// Toutes les opérations toString (), toJson () sont transmises à la `valeur` +print( count ); // appelle `toString ()` à l'intérieur de RxInt + +final abc = [0,1,2].obs; +// Convertit la valeur en un Array json, affiche RxList +// Json est pris en charge par tous les types Rx! +print('json: ${jsonEncode(abc)}, type: ${abc.runtimeType}'); + +// RxMap, RxList et RxSet sont des types Rx spéciaux, qui étendent leurs types natifs. +// mais vous pouvez travailler avec une liste comme une liste régulière, bien qu'elle soit réactive! +abc.add(12); // pousse 12 dans la liste et MET À JOUR le flux. +abc[3]; // comme Lists, lit l'index 3. + + +// l'égalité fonctionne avec le Rx et la valeur, mais hashCode est toujours pris à partir de la valeur +final number = 12.obs; +print( number == 12 ); // retource > true + +/// Modèles Rx personnalisés: + +// toJson (), toString () sont différés à l'enfant, vous pouvez donc implémenter 'override' sur eux, et print() l'observable directement. + +class User { + String name, last; + int age; + User({this.name, this.last, this.age}); + + @override + String toString() => '$name $last, $age ans'; +} + +final user = User(name: 'John', last: 'Doe', age: 33).obs; + +// `user` est" réactif ", mais les propriétés à l'intérieur NE SONT PAS! +// Donc, si nous changeons une variable à l'intérieur ... +user.value.name = 'Roi'; +// Le widget ne se reconstruira pas !, +// `Rx` n'a aucun indice lorsque vous changez quelque chose à l'intérieur de l'utilisateur. +// Donc, pour les classes personnalisées, nous devons "notifier" manuellement le changement. +user.refresh(); + +// ou utiliser `update()`! +user.update((value){ + value.name='Roi'; +}); + +print( user ); +``` + +#### GetView + +J'adore ce widget. Si simple, mais si utile! + +C'est un widget `const Stateless` qui a un getter` controller` pour un `Controller` enregistré, c'est tout. + +```dart + class AwesomeController extends GetxController { + final String title = 'My Awesome View'; + } + + // N'oubliez PAS de passer le `Type` que vous avez utilisé pour enregistrer votre contrôleur! + class AwesomeView extends GetView { + @override + Widget build(BuildContext context) { + return Container( + padding: EdgeInsets.all(20), + child: Text(controller.title), // appelez `controller.quelqueChose` + ); + } + } +``` + +#### GetResponsiveView + +Étendez ce widget pour créer une vue réactive. +ce widget contient la propriété `screen` qui a toutes les +informations sur la taille et le type de l'écran. + +##### Guide d utilisation + +Vous avez deux options pour le créer: + +- avec la méthode `builder` vous renvoyez le widget à construire. +- avec les méthodes `desktop`,` tablet`, `phone`,` watch`. la méthode spécifique sera exécutée lorsque le type d'écran correspond à la méthode. + Lorsque l'écran est [ScreenType.Tablet], la méthode `tablet` sera exécutée et ainsi de suite. + **Note:** Si vous utilisez cette méthode, veuillez définir la propriété `alwaysUseBuilder` à `false` + +Avec la propriété `settings`, vous pouvez définir la limite de largeur pour les types d'écran. + +![exemple](https://github.com/SchabanBo/get_page_example/blob/master/docs/Example.gif?raw=true) +Code pour cet écran +[code](https://github.com/SchabanBo/get_page_example/blob/master/lib/pages/responsive_example/responsive_view.dart) + +#### GetWidget + +La plupart des gens n'ont aucune idée de ce widget ou confondent totalement son utilisation. +Le cas d'utilisation est très rare, mais très spécifique: il `met en cache` un contrôleur. +En raison du _cache_, ne peut pas être un `const Stateless`. + +> Alors, quand avez-vous besoin de "mettre en cache" un contrôleur? + +Si vous utilisez, une autre fonctionnalité "pas si courante" de **GetX**: `Get.create()`. + +`Get.create(()=>Controller())` générera un nouveau `Controller` chaque fois que vous appelez +`Get.find()`. + +C'est là que `GetWidget` brille ... comme vous pouvez l'utiliser, par exemple, +pour conserver une liste de s. Donc, si le widget est "reconstruit", il conservera la même instance de contrôleur. + +#### GetxService + +Cette classe est comme un `GetxController`, elle partage le même cycle de vie ( `onInit()`, `onReady()`, `onClose()`), mais n'a pas de "logique" en elle. +Il notifie simplement le **GetX** Dependency Injection system, que cette sous-classe +**ne peut pas** être supprimé de la mémoire. + +Donc est très utile pour garder vos "Services" toujours à portée de main et actifs avec `Get.find()`. Comme: +`ServiceAPI`, `ServiceDeSauvegarde`, `ServiceDeCaching`. + +```dart +Future main() async { + await initServices(); /// Attend l'initialisation des services. + runApp(SomeApp()); +} + +/// Est une démarche intelligente pour que vos services s'initialisent avant d'exécuter l'application Flutter. +/// car vous pouvez contrôler le flux d'exécution (peut-être devez-vous charger une configuration de thème, +/// apiKey, langue définie par l'utilisateur ... donc chargez SettingService avant d'exécuter ApiService. +/// donc GetMaterialApp () n'a pas besoin de se reconstruire et prend les valeurs directement. +void initServices() async { + print('starting services ...'); + /// C'est ici que vous mettez get_storage, hive, shared_pref initialization. + /// ou les connexions moor, ou autres choses async. + await Get.putAsync(() => DbService().init()); + await Get.putAsync(SettingsService()).init(); + print('Tous les services ont démarré...'); +} + +class DbService extends GetxService { + Future init() async { + print('$runtimeType retarde de 2 sec'); + await 2.delay(); + print('$runtimeType prêts!'); + return this; + } +} + +class SettingsService extends GetxService { + void init() async { + print("$runtimeType retarde d'1 sec"); + await 1.delay(); + print('$runtimeType prêts!'); + } +} + +``` + +La seule façon de supprimer réellement un `GetxService`, est d'utiliser`Get.reset ()`qui est comme un +"Hot Reboot" de votre application. N'oubliez donc pas que si vous avez besoin d'une persistance absolue d'une instance de classe +durée de vie de votre application, utilisez `GetxService`. + +# Changements par rapport a 2.0 + +1- Types Rx: + +| Avant | Après | +| ------- | ---------- | +| StringX | `RxString` | +| IntX | `RxInt` | +| MapX | `RxMap` | +| ListX | `RxList` | +| NumX | `RxNum` | +| DoubleX | `RxDouble` | + +RxController et GetBuilder ont maintenant fusionné, vous n'avez plus besoin de mémoriser le contrôleur que vous souhaitez utiliser, utilisez simplement GetxController, cela fonctionnera pour une gestion simple de l'état et également pour la réactivité. + +2- NamedRoutes + +Avant: + +```dart +GetMaterialApp( + namedRoutes: { + '/': GetRoute(page: Home()), + } +) +``` + +Maintenant: + +```dart +GetMaterialApp( + getPages: [ + GetPage(name: '/', page: () => Home()), + ] +) +``` + +Pourquoi ce changement? +Souvent, il peut être nécessaire de décider quelle page sera affichée à partir d'un paramètre, ou d'un 'login token', l'approche précédente était inflexible, car elle ne le permettait pas. +L'insertion de la page dans une fonction a considérablement réduit la consommation de RAM, puisque les routes ne seront pas allouées en mémoire depuis le démarrage de l'application, et cela a également permis de faire ce type d'approche: + +```dart + +GetStorage box = GetStorage(); + +GetMaterialApp( + getPages: [ + GetPage(name: '/', page:(){ + return box.hasData('token') ? Home() : Login(); + }) + ] +) +``` + +# Pourquoi Getx? + +1- Plusieurs fois après une mise à jour de Flutter, plusieurs de vos packages seront invalides. Parfois, des erreurs de compilation se produisent, des erreurs apparaissent souvent pour lesquelles il n'y a toujours pas de réponses, et le développeur doit savoir d'où vient l'erreur, suivre l'erreur, puis seulement essayer d'ouvrir un problème dans le référentiel correspondant et voir son problème résolu. Get centralise les principales ressources pour le développement (gestion des états, des dépendances et des routes), vous permettant d'ajouter un package unique à votre pubspec et de commencer à travailler. Après une mise à jour Flutter, la seule chose à faire est de mettre à jour la dépendance Get et de vous mettre au travail. Get résout également les problèmes de compatibilité. Combien de fois une version d'un package n'est pas compatible avec la version d'un autre, parce que l'une utilise une dépendance dans une version et l'autre dans une autre version? Ce n'est pas non plus un problème avec Get, car tout est dans le même package et est entièrement compatible. + +2- Flutter est facile, Flutter est incroyable, mais Flutter a encore quelques règles standard qui peuvent être indésirables pour la plupart des développeurs, comme `Navigator.of (context) .push (context, builder [...]`. Get simplifie le développement. Au lieu de écrire 8 lignes de code pour simplement appeler une route, vous pouvez simplement le faire: `Get.to (Home ())` et vous avez terminé, vous passerez à la page suivante. Les URL Web dynamiques sont une chose vraiment pénible à voir avec Flutter actuellement, et cela avec GetX est stupidement simple. La gestion des états dans Flutter et la gestion des dépendances sont également quelque chose qui génère beaucoup de discussions, car il y a des centaines de modèles dans la pub. Mais rien n'est aussi simple que d'ajouter un ".obs" à la fin de votre variable, et placez votre widget dans un Obx, et c'est tout, toutes les mises à jour de cette variable seront automatiquement mises à jour à l'écran. + +3- Facilité sans vous soucier des performances. Les performances de Flutter sont déjà étonnantes, mais imaginez que vous utilisez un gestionnaire d'état et un localisateur pour distribuer vos classes blocs / stores / contrôleurs / etc. Vous devrez appeler manuellement l'exclusion de cette dépendance lorsque vous n'en avez pas besoin. Mais avez-vous déjà pensé à simplement utiliser votre «contrôleur`, et quand il n'était plus utilisé par personne, il serait simplement supprimé de la mémoire? C'est ce que fait GetX. Avec SmartManagement, tout ce qui n'est pas utilisé est supprimé de la mémoire et vous ne devriez pas avoir à vous soucier d'autre chose que de la programmation. Vous serez assuré de consommer le minimum de ressources nécessaires, sans même avoir créé de logique pour cela. + +4- Découplage réel. Vous avez peut-être entendu le concept "séparer la vue de la business logic". Ce n'est pas une particularité de BLoC, MVC, MVVM, et tout autre standard sur le marché a ce concept. Cependant, ce concept peut souvent être atténué dans Flutter en raison de l'utilisation de `context`. +Si vous avez besoin de contexte pour trouver un InheritedWidget, vous en avez besoin dans la vue, ou passez le `context` par paramètre. Je trouve particulièrement cette solution très moche, et pour travailler en équipe, nous serons toujours dépendants de la 'business logic' de View. Getx n'est pas orthodoxe avec l'approche standard, et même s'il n'interdit pas complètement l'utilisation de StatefulWidgets, InitState, etc., il a toujours une approche similaire qui peut être plus propre. Les contrôleurs ont des cycles de vie, et lorsque vous devez faire une requête APIREST par exemple, vous ne dépendez de rien de la vue. Vous pouvez utiliser onInit pour lancer l'appel http et lorsque les données arrivent, les variables sont remplies. Comme GetX est totalement réactif (vraiment, et fonctionne sous streams), une fois les éléments remplis, tous les widgets qui utilisent cette variable seront automatiquement mis à jour dans la vue. +Cela permet aux personnes ayant une expertise de l'interface utilisateur de travailler uniquement avec des widgets et de ne pas avoir à envoyer quoi que ce soit à la business logic autre que des événements utilisateur (comme cliquer sur un bouton), tandis que les personnes travaillant avec la business logic seront libres de créer et de tester la Business logic séparément. + +# Communite + +## Chaines communautaires + +GetX a une communauté très active et utile. Si vous avez des questions, ou souhaitez obtenir de l'aide concernant l'utilisation de ce framework, veuillez rejoindre nos canaux communautaires, votre question sera répondue plus rapidement, et ce sera l'endroit le plus approprié. Ce référentiel est exclusif pour l'ouverture des issues Github et la demande de ressources, mais n'hésitez pas à faire partie de la communauté GetX. +| **Slack** | **Discord** | **Telegram** | +| :-------------------------------------------------------------------------------------------------------------------------- | :-------------------------------------------------------------------------------------------------------------------------- | :-------------------------------------------------------------------------------------------------------------------- | +| [![Get sur Slack](https://img.shields.io/badge/slack-join-orange.svg)](https://communityinviter.com/apps/getxworkspace/getx) | [![Discord Shield](https://img.shields.io/discord/722900883784073290.svg?logo=discord)](https://discord.com/invite/9Hpt99N) | [![Telegram](https://img.shields.io/badge/chat-on%20Telegram-blue.svg)](https://t.me/joinchat/PhdbJRmsZNpAqSLJL6bH7g) | + +## Comment contribuer + +_Voulez-vous contribuer au projet? Nous serons fiers de vous mettre en avant comme l'un de nos collaborateurs. Voici quelques points sur lesquels vous pouvez contribuer et améliorer encore Get (et Flutter)._ + +- Aider à traduire les 'Readme's dans d'autres langues. +- Ajout de documentation au readme (beaucoup de fonctions de Get n'ont pas encore été documentées). +- Rédiger des articles ou réaliser des vidéos pour apprendre à utiliser Get (ils seront insérés dans le Readme et à l'avenir dans notre Wiki). +- Offrir des PRs pour code / tests. +- Ajouter de nouvelles fonctions. + +Toute contribution est bienvenue! + +## Articles et videos + +- [Dynamic Themes in 3 lines using GetX™](https://medium.com/swlh/flutter-dynamic-themes-in-3-lines-c3b375f292e3) - Tutorial by [Rod Brown](https://github.com/RodBr). +- [Complete GetX™ Navigation](https://www.youtube.com/watch?v=RaqPIoJSTtI) - Route management video by Amateur Coder. +- [Complete GetX State Management](https://www.youtube.com/watch?v=CNpXbeI_slw) - State management video by Amateur Coder. +- [GetX™ Other Features](https://youtu.be/ttQtlX_Q0eU) - Utils, storage, bindings and other features video by Amateur Coder. +- [Firestore User with GetX | Todo App](https://www.youtube.com/watch?v=BiV0DcXgk58) - Video by Amateur Coder. +- [Firebase Auth with GetX | Todo App](https://www.youtube.com/watch?v=-H-T_BSgfOE) - Video by Amateur Coder. +- [The Flutter GetX™ Ecosystem ~ State Management](https://medium.com/flutter-community/the-flutter-getx-ecosystem-state-management-881c7235511d) - State management by [Aachman Garg](https://github.com/imaachman). +- [The Flutter GetX™ Ecosystem ~ Dependency Injection](https://medium.com/flutter-community/the-flutter-getx-ecosystem-dependency-injection-8e763d0ec6b9) - Dependency Injection by [Aachman Garg](https://github.com/imaachman). +- [GetX, the all-in-one Flutter package](https://www.youtube.com/watch?v=IYQgtu9TM74) - A brief tutorial covering State Management and Navigation by Thad Carnevalli. +- [Build a To-do List App from scratch using Flutter and GetX](https://www.youtube.com/watch?v=EcnqFasHf18) - UI + State Management + Storage video by Thad Carnevalli. +- [GetX Flutter Firebase Auth Example](https://medium.com/@jeffmcmorris/getx-flutter-firebase-auth-example-b383c1dd1de2) - Article by Jeff McMorris. +- [Flutter State Management with GetX – Complete App](https://www.appwithflutter.com/flutter-state-management-with-getx/) - by App With Flutter. +- [Flutter Routing with Animation using Get Package](https://www.appwithflutter.com/flutter-routing-using-get-package/) - by App With Flutter. diff --git a/siro_rider/packages/get/README-vi.md b/siro_rider/packages/get/README-vi.md new file mode 100644 index 0000000..8c53de5 --- /dev/null +++ b/siro_rider/packages/get/README-vi.md @@ -0,0 +1,1176 @@ +![](https://raw.githubusercontent.com/jonataslaw/getx-community/master/get.png) + +**Ngôn ngữ: Tiếng Việt (file này), [English](README.md), [Indonesian](README.id-ID.md), [Urdu](README.ur-PK.md), [Chinese](README.zh-cn.md), [Brazilian Portuguese](README.pt-br.md), [Spanish](README-es.md), [Russian](README.ru.md), [Polish](README.pl.md), [Korean](README.ko-kr.md), [French](README-fr.md).** + +[![pub package](https://img.shields.io/pub/v/get.svg?label=get&color=blue)](https://pub.dev/packages/get) +[![popularity](https://badges.bar/get/popularity)](https://pub.dev/packages/sentry/score) +[![likes](https://badges.bar/get/likes)](https://pub.dev/packages/get/score) +[![pub points](https://badges.bar/get/pub%20points)](https://pub.dev/packages/get/score) +![building](https://github.com/jonataslaw/get/workflows/build/badge.svg) +[![style: effective dart](https://img.shields.io/badge/style-effective_dart-40c4ff.svg)](https://pub.dev/packages/effective_dart) +[![Discord Shield](https://img.shields.io/discord/722900883784073290.svg?logo=discord)](https://discord.com/invite/9Hpt99N) +[![Get on Slack](https://img.shields.io/badge/slack-join-orange.svg)](https://communityinviter.com/apps/getxworkspace/getx) +[![Telegram](https://img.shields.io/badge/chat-on%20Telegram-blue.svg)](https://t.me/joinchat/PhdbJRmsZNpAqSLJL6bH7g) + +Awesome Flutter + +Buy Me A Coffee + +![](https://raw.githubusercontent.com/jonataslaw/getx-community/master/getx.png) + +- [Về GetX](#về-getx) +- [Cài Đặt](#cài-đặt) +- [Counter App với GetX](#counter-app-với-getx) +- [Tam Trụ](#tam-trụ) + - [Quản lý State](#quản-lý-state) + - [Quản lý Reactive State](#quản-lý-reactive-state) + - [Thêm thông tin về quản lý state](#thêm-thông-tin-về-quản-lý-state) + - [Quản lý route](#quản-lý-route) + - [Thêm thông tin về quản lý route](#thêm-thông-tin-về-quản-lý-route) + - [Quản lý dependency](#quản-lý-dependency) + - [Thêm thông tin về quản lý dependency](#thêm-thông-tin-về-quản-lý-dependency) +- [Utils](#utils) + - [Internationalization](#internationalization) + - [Dịch thuật](#dịch-thuật) + - [Sử dụng bản dịch thuật](#sử-dụng-bản-dịch-thuật) + - [Locales](#locales) + - [Đổi locale](#đổi-locale) + - [System locale](#system-locale) + - [Đổi Theme](#đổi-theme) + - [GetConnect](#getconnect) + - [Cấu hình mặc định](#cấu-hình-mặc-định) + - [Cấu hình tùy chỉnh](#cấu-hình-tùy-chỉnh) + - [GetPage Middleware](#getpage-middleware) + - [Ưu tiên](#ưu-tiên) + - [Chuyển hướng](#chuyển-hướng) + - [onPageCalled](#onpagecalled) + - [OnBindingsStart](#onbindingsstart) + - [OnPageBuildStart](#onpagebuildstart) + - [OnPageBuilt](#onpagebuilt) + - [OnPageDispose](#onpagedispose) + - [APIs nâng cao khác](#apis-nâng-cao-khác) + - [Cấu hình thủ công và cài đặt chung tuỳ chọn](#cấu-hình-thủ-công-và-cài-đặt-chung-tuỳ-chọn) + - [Local State Widgets](#local-state-widgets) + - [ValueBuilder](#valuebuilder) + - [ObxValue](#obxvalue) + - [Mẹo hữu ích](#mẹo-hữu-ích) + - [GetView](#getview) + - [GetResponsiveView](#getresponsiveview) + - [Hướng dẫn sử dụng trước khi dùng](#hướng-dẫn-sử-dụng-trước-khi-dùng) + - [GetWidget](#getwidget) + - [GetxService](#getxservice) +- [Thay đổi đột phá 2.0](#thay-đổi-đột-phá-2.0) +- [Tại sao lại dùng GetX](#tại-sao-lại-dùng-getx) +- [Cộng đồng](#cộng-đồng) + - [Kênh Cộng đồng](#kênh-cộng-đồng) + - [Cách cống hiến](#cách-cống-hiến) + - [Các bài báo và video](#các-bài-báo-và-video) + +# Về GetX + +- GetX hướng tới sự nhỏ gọn và giải pháp tối ưu cho Flutter với tốc độ ưu việt trong quản lý state, nạp dependency thông minh, và quản lý route nhanh chóng và thực tế. + +- GetX hướng tới 3 tham vọng chính, nghĩa là tất cả các tài nguyên của thư viện sẽ dành cho những điểm ưu tiên sau: **NĂNG SUẤT, HIỆU SUẤT VÀ TỔ CHỨC.** + + - **HIỆU SUẤT:** GetX tập trung vào hiệu suất và mức tiêu thụ tài nguyên tối thiểu, do đó nó không sử dụng Streams hoặc ChangeNotifier. + + - **NĂNG SUẤT:** GetX sử dụng một cú pháp dễ dàng và dễ thở. Bất kể bạn muốn làm gì, luôn có một cách dễ dàng hơn với GetX. Nó sẽ tiết kiệm hàng giờ phát triển và sẽ cung cấp hiệu suất tối đa mà ứng dụng của bạn có thể mang lại. + + Nói chung, nhà phát triển nên quan tâm đến việc xóa những controller ra khỏi bộ nhớ. Với GetX, mặc định các tài nguyên sẽ + TỰ ĐỘNG xóa khỏi bộ nhớ khi không dùng nữa. Nếu bạn muốn giữ nó trong bộ nhớ, bạn phải khai báo rõ ràng "permanent: true" trong phần dependency của mình. Từ đó, bạn sẽ tiết kiệm thời gian và giảm rủi ro khi phụ thuộc vào bộ nhớ. Theo mặc định, tính năng tải dependency cũng lười biếng. + + - **TỔ CHỨC:** + GetX cho phép tách toàn bộ View, presentation logic, business logic, nạp dependencies và điều hướng. Bạn không cần "context" để điều hướng giữa các route, vì vậy bạn sẽ độc lập trong sơ đồ widget (trực quan hóa). Bạn không cần "context" để truy cập Controller / Blocs của mình thông qua một InheritedWidget, vì vậy bạn hoàn toàn tách rời presentation logic và business logic ra khỏi lớp trực quan của mình. Bạn không cần phải đưa các Controller / Models / Blocs vào sơ đồ widget của mình thông qua `MultiProvider`, vì GetX sử dụng tính năng nạp dependency của riêng nó, tách hoàn toàn DI khỏi chế độ xem của nó. + + Với GetX, bạn biết nơi tìm từng tính năng ứng dụng của mình, với cơ chế clean code theo mặc định. Ngoài việc giúp bảo trì dễ dàng, GetX giúp việc chia sẻ các mô-đun trở thành khả thi trong Flutter. + BLoC là điểm khởi đầu để tổ chức code trong Flutter, nó tách biệt business logic ra khỏi lớp trực quan hóa (visualization). GetX nảy sinh từ điều này, không chỉ tách biệt presentation logic mà còn cả business logic. Nạp dependency bổ sung và route cũng được tách ra và lớp dữ liệu cũng biến mất. Bạn sẽ biết mọi thứ ở đâu và sẽ hình dung tất cả những điều này dễ hơn cả xây dựng chương trình "Hello World". + GetX là cách dễ nhất, thiết thực và có thể mở rộng để xây dựng các ứng dụng hiệu suất cao với Flutter SDK. GetX chứa đựng một hệ sinh thái rộng lớn xung quanh nó hoạt động hoàn hảo cùng nhau, rất dễ dàng cho người mới bắt đầu và nó chính xác cho các chuyên gia. Nó an toàn, ổn định, luôn cập nhật và cung cấp một loạt các API được tích hợp sẵn mà không có trong Flutter SDK mặc định. + +- GetX không cồng kềnh và có vô số tính năng cho phép bạn bắt đầu lập trình mà không cần lo lắng về bất cứ điều gì. Đặc biệt, nó cho phép mỗi tính năng này nằm trong các vùng chứa riêng biệt và chỉ được bắt đầu sau khi sử dụng. Nếu bạn chỉ sử dụng phần quản lý state của GetX thì sẽ chỉ có quản lý state được sử dụng. Nếu bạn chỉ sử dụng route, thì GetX không biên dịch phần quản lý state. + +- GetX có một hệ sinh thái khổng lồ, một cộng đồng lớn, một số lượng lớn cộng tác viên và sẽ được duy trì miễn là Flutter còn tồn tại. GetX có khả năng chạy cùng một mã (code) trên Android, iOS, Web, Mac, Linux, Windows và trên máy chủ của bạn. + **Bạn hoàn toàn có thể sử dụng lại mã của mình trên frontend qua backend với [Get Server](https://github.com/jonataslaw/get_server)**. + +**Ngoài ra, toàn bộ quá trình phát triển có thể hoàn toàn tự động, cả trên máy chủ và frontend với [Get CLI](https://github.com/jonataslaw/get_cli)**. + +**Ngoài ra, nhằm tăng thêm năng suất của bạn, chúng tôi hỗ trợ +[tiện ích trên VSCode](https://marketplace.visualstudio.com/items?itemName=get-snippets.get-snippets) và [tiện ích cho Android Studio/Intellij](https://plugins.jetbrains.com/plugin/14975-getx-snippets)** + +# Cài Đặt + +Thêm Get vào file pubspec.yaml: + +```yaml +dependencies: + get: +``` + +Import get vào file cần sử dụng: + +```dart +import 'package:get/get.dart'; +``` + +# Counter App với GetX + +Dự án "counter" được tạo theo mặc định trên dự án mới trên Flutter có hơn 100 dòng (có comments). Để thể hiện sức mạnh của Get, tôi sẽ trình bày cách tạo "counter" thay đổi trạng thái với mỗi lần nhấp, chuyển đổi giữa các trang và chia sẻ trạng thái giữa các màn hình, tất cả đều theo cách có tổ chức, tách biệt logic nghiệp vụ khỏi chế độ xem, CHỈ VỚI 26 DÒNG! + +- Bước 1: + Thêm "Get" trước MaterialApp, nó sẽ thành GetMaterialApp + +```dart +void main() => runApp(GetMaterialApp(home: Home())); +``` + +- Chú ý: điều này không sửa đổi MaterialApp của Flutter, GetMaterialApp không phải là MaterialApp được sửa đổi, nó chỉ là một Widget được tạo trước với MaterialApp mặc định là child. Bạn có thể cấu hình điều này theo cách thủ công, nhưng nó chắc chắn là không cần thiết. GetMaterialApp sẽ tạo các route, đưa chúng vào, đưa bản dịch, đưa mọi thứ bạn cần để điều hướng route. Nếu bạn chỉ sử dụng Get để quản lý trạng thái hoặc quản lý phụ thuộc, thì không cần thiết phải sử dụng GetMaterialApp. Tóm lại, GetMaterialApp chỉ cần thiết cho các route, snacksbar, internationalization, bottomSheets, Dialog và các APIs cấp cao liên quan đến route và không có "context". +- Chú ý²: Một lần nữa, bước này chỉ cần thiết nếu bạn sử dụng quản lý route (`Get.to ()`, `Get.back ()`, v.v.). Nếu bạn không sử dụng nó thì không cần thực hiện bước 1 + +- Bước 2: + Tạo lớp business logic của bạn và đặt tất cả các biến (variables), hàm (function) và controller bên trong nó. + Bạn có thể làm cho bất kỳ biến nào có thể quan sát được đơn giản bằng cách sử dụng ".obs". + +```dart +class Controller extends GetxController{ + var count = 0.obs; + increment() => count++; +} +``` + +- Bước 3: + Tạo widget của bạn, sử dụng StatelessWidget và tiết kiệm RAM, với Get, bạn có thể không cần sử dụng StatefulWidget nữa. + +```dart +class Home extends StatelessWidget { + + @override + Widget build(context) { + + // Instantiate your class using Get.put() to make it available for all "child" routes there. + final Controller c = Get.put(Controller()); + + return Scaffold( + // Use Obx(()=> to update Text() whenever count is changed. + appBar: AppBar(title: Obx(() => Text("Clicks: ${c.count}"))), + + // Replace the 8 lines Navigator.push by a simple Get.to(). You don't need context + body: Center(child: ElevatedButton( + child: Text("Go to Other"), onPressed: () => Get.to(Other()))), + floatingActionButton: + FloatingActionButton(child: Icon(Icons.add), onPressed: c.increment)); + } +} + +class Other extends StatelessWidget { + // You can ask Get to find a Controller that is being used by another page and redirect you to it. + final Controller c = Get.find(); + + @override + Widget build(context){ + // Access the updated count variable + return Scaffold(body: Center(child: Text("${c.count}"))); + } +} +``` + +Kết quả: + +![](https://raw.githubusercontent.com/jonataslaw/getx-community/master/counter-app-gif.gif) + +Đây là một dự án đơn giản nhưng nó đã cho thấy rõ sức mạnh của Get. Khi dự án của bạn phát triển, sự khác biệt này sẽ trở nên đáng kể hơn. + +Get được thiết kế để làm việc với các nhóm, nhưng nó làm cho công việc của một nhà phát triển cá nhân trở nên đơn giản. + +Cải thiện thời gian, giao mọi thứ đúng hạn mà không làm giảm hiệu suất. Get không dành cho tất cả mọi người, nhưng nếu bạn đã xác định gắn với Get, Get sẽ "get" bạn! + +# Tam Trụ + +## Quản lý State + +Get có 2 cách quản lý trạng thái (state managers) khác nhau : quản lý trạng thái đơn giản (chúng ta gọi nó là GetBuilder) và quản lý trạng thái phản ứng (the reactive state manager) (GetX/Obx). + +### Quản lý Reactive State + +Lập trình phản ứng (reactive programming) có thể khiến nhiều người xa lánh vì nó được cho là phức tạp. GetX biến lập trình phản ứng thành một thứ khá đơn giản: + +- Bạn sẽ không cần tạo StreamControllers. +- Bạn sẽ không cần tạo StreamBuilder cho mỗi biến. +- Bạn sẽ không cần tạo một lớp (class) cho mỗi trạng thái. +- Bạn sẽ không cần tạo get cho một giá trị ban đầu. +- Bạn sẽ không cần sử dụng trình tạo mã. + +Lập trình phản ứng với Get dễ dàng như sử dụng setState. + +Hãy tưởng tượng rằng bạn có một biến tên và muốn rằng mỗi khi bạn thay đổi nó, tất cả các widget sử dụng nó sẽ được tự động thay đổi. + +Đây là biến đếm của bạn: + +```dart +var name = 'Jonatas Borges'; +``` + +Để nó có thể được lắng nghe, bạn chỉ cần thêm ".obs" ở cuối: + +```dart +var name = 'Jonatas Borges'.obs; +``` + +Và trong UI, khi bạn muốn hiển thị giá trị đó và cập nhật màn hình bất cứ khi nào giá trị thay đổi, chỉ cần thực hiện điều này: + +```dart +Obx(() => Text("${controller.name}")); +``` + +Thế thôi. Chỉ là _thế_ thôi người ơi~. + +### Thêm thông tin về Quản lý state + +**Xem thông tin cụ thể tại [đây](./documentation/en_US/state_management.md). Tại đó, bạn có thể tham khảo ví dụ và so sánh sự khác nhau giữa quản lý state cơ bản và quản lý state reactive** + +Bạn sẽ hình dung được sức mạnh của GetX. + +## Quản lý route + +Nếu bạn chỉ sử dụng routes/snackbars/dialogs/bottomsheets không có context, GetX là lựa chọn số 2 trừ 1, nhìn đây: + +Thêm "Get" trước MaterialApp, nó sẽ biến thành GetMaterialApp + +```dart +GetMaterialApp( // Before: MaterialApp( + home: MyHome(), +) +``` + +Di chuyển tới màn hình mới: + +```dart + +Get.to(NextScreen()); +``` + +Di chuyển tới màn hình mới theo tên. Xem thêm tại [đây](./documentation/en_US/route_management.md#navigation-with-named-routes) + +```dart + +Get.toNamed('/details'); +``` + +Để đóng snackbars, dialogs, bottomsheets, hay bất kì thứ gì, bạn có thể xài cái này để thay Navigator.pop(context); + +```dart +Get.back(); +``` + +Đi đến màn hình kế tiếp và bỏ luôn màn hình cũ (thường dùng cho màn hình giới thiệu, màn hình đăng nhập, etc.) + +```dart +Get.off(NextScreen()); +``` + +Đi đến màn hình kế tiếp và đóng tất cả các routes (hữu dụng cho shopping cart, polls, và tests) + +```dart +Get.offAll(NextScreen()); +``` + +Bạn có thấy nãy giờ chúng ta không sử dụng từ khóa "context"? Đây chính là thang điểm 9 + 1 của quản lý route ở Get. Với điểm mạnh trên, bạn có thể thao tác bất cứ đâu, kể cả trong controller class. + +### Thêm thông tin về quản lý route + +**Get hoạt động được với named routes và cũng cung cấp cách điều khiển ở cấp thấp (lower-level control) cho routes của bạn! Tài liệu chi tiết tại [đây](./documentation/en_US/route_management.md)** + +## Quản lý dependency + +Get hỗ trợ tính năng giúp bạn lấy class như Bloc hoặc Controller chỉ với 1 dòng, không cần Provider context hay InheritedWidget: + +```dart +Controller controller = Get.put(Controller()); // Rather Controller controller = Controller(); +``` + +- Chú ý: Nếu bạn dùng Get's State Manager, hãy chú ý đến việc bindings API, có thể giúp dễ dàng kết nối view đến controller. + +Thay vì khởi tạo class của bạn trong class bạn đang sử dụng, bạn đang khởi tạo nó trong phiên bản Get, điều này sẽ làm cho nó có sẵn trên toàn bộ Ứng dụng của bạn. +Vì vậy, bạn có thể sử dụng bộ điều khiển (hoặc Bloc) của mình một cách bình thường + +**Mẹo:** quản lý dependency của Get được tách ra khỏi các phần khác của package, vì vậy, ví dụ: nếu ứng dụng của bạn đã sử dụng 1 trình quản lý trạng thái (bất kỳ cái nào, không quan trọng), bạn không cần phải viết lại tất cả, bạn có thể sử dụng nạp dependency của Get vô lo + +```dart +controller.fetchApi(); +``` + +Hãy tưởng tượng rằng bạn đã điều hướng qua nhiều route và bạn cần dữ liệu bị còn sót trong controller của mình, bạn sẽ cần một trình quản lý dependency kết hợp với Provider hoặc Get_it, đúng không? Với Get, sử dụng Get để "find" cho controller, bạn sẽ hoàn toàn độc lập: + +```dart +Controller controller = Get.find(); +//Yes, it looks like Magic, Get will find your controller, and will deliver it to you. You can have 1 million controllers instantiated, Get will always give you the right controller. +``` + +Và sau đó, bạn sẽ có thể khôi phục dữ liệu controller của mình đã lấy được ở đó: + +```dart +Text(controller.textFromApi); +``` + +### Thêm thông tin về quản lý dependency + +**Xem thêm tại [đây](./documentation/en_US/dependency_management.md)** + +# Utils + +## Internationalization + +### Dịch thuật + +Các bản dịch được lưu giữ như một bản đồ từ điển (dictionary map) key-value đơn giản. +Để thêm các bản dịch tùy chỉnh, hãy tạo một class và kế thừa (extend) từ `Translation`. + +```dart +import 'package:get/get.dart'; + +class Messages extends Translations { + @override + Map> get keys => { + 'en_US': { + 'hello': 'Hello World', + }, + 'de_DE': { + 'hello': 'Hallo Welt', + } + }; +} +``` + +#### Sử dụng bản dịch thuật + +Chỉ cần thêm `.tr` vào key được chỉ định và nó sẽ được dịch, sử dụng giá trị hiện tại của` Get.locale` và `Get.fallbackLocale`. + +```dart +Text('title'.tr); +``` + +#### Sử dụng bản dịch thuật với số ít và số nhiều + +```dart +var products = []; +Text('singularKey'.trPlural('pluralKey', products.length, Args)); +``` + +#### Sử dụng bản dịch với tham số (parameters) + +```dart +import 'package:get/get.dart'; + + +Map> get keys => { + 'en_US': { + 'logged_in': 'logged in as @name with email @email', + }, + 'es_ES': { + 'logged_in': 'iniciado sesión como @name con e-mail @email', + } +}; + +Text('logged_in'.trParams({ + 'name': 'Jhon', + 'email': 'jhon@example.com' + })); +``` + +### Locales + +Chuyển các tham số (parameters) cho `GetMaterialApp` để xác định ngôn ngữ và bản dịch. + +```dart +return GetMaterialApp( + translations: Messages(), // your translations + locale: Locale('en', 'US'), // translations will be displayed in that locale + fallbackLocale: Locale('en', 'UK'), // specify the fallback locale in case an invalid locale is selected. +); +``` + +#### Đổi locale + +Gọi `Get.updateLocale (locale)` 'để cập nhật ngôn ngữ. Các bản dịch sau đó sẽ tự động sử dụng ngôn ngữ mới. + +```dart +var locale = Locale('en', 'US'); +Get.updateLocale(locale); +``` + +#### System locale + +Để đọc system locale, sử dụng `Get.deviceLocale`. + +```dart +return GetMaterialApp( + locale: Get.deviceLocale, +); +``` + +## Đổi chủ đề (Theme) + +Vui lòng không sử dụng bất kỳ Widget con nào cấp cao hơn `GetMaterialApp` để cập nhật nó. Điều này có thể kích hoạt các key trùng lặp. Rất nhiều người đã quen với cách tiếp cận thời tiền sử là tạo tiện ích "ThemeProvider" chỉ để thay đổi chủ đề ứng dụng của bạn và điều này KHÔNG cần thiết với ** GetX ™ **. + +Bạn có thể tạo chủ đề tùy chỉnh của mình và chỉ cần thêm nó vào trong `Get.changeTheme` mà không cần bất kỳ điều gì khác: + +```dart +Get.changeTheme(ThemeData.light()); +``` + +Nếu bạn muốn tạo một cái gì đó giống như một nút thay đổi Theme với `onTap`, bạn có thể kết hợp hai API ** GetX ™ ** cho điều đó: + +- Api kiểm tra xem `Theme` tối có đang được sử dụng hay không. +- Và `Theme` sẽ thay đổi API, bạn sử dụng với `onPressed`: + +```dart +Get.changeTheme(Get.isDarkMode? ThemeData.light(): ThemeData.dark()); +``` + +Khi bật `.darkmode`, nó sẽ chuyển _light theme_, và khi bật _light theme_ , nó sẽ chuyển _dark theme_. + +## GetConnect + +GetConnect tạo giao thức tới http hoặc websockets + +### Cấu hình mặc định + +Đơn giản, bạn có thể kế thừa (extend) từ GetConnect và sử dụng các phương thức GET/POST/PUT/DELETE/SOCKET khi giao tiếp với Rest API hoặc websockets. + +```dart +class UserProvider extends GetConnect { + // Get request + Future getUser(int id) => get('http://youapi/users/$id'); + // Post request + Future postUser(Map data) => post('http://youapi/users', body: data); + // Post request with File + Future> postCases(List image) { + final form = FormData({ + 'file': MultipartFile(image, filename: 'avatar.png'), + 'otherFile': MultipartFile(image, filename: 'cover.png'), + }); + return post('http://youapi/users/upload', form); + } + + GetSocket userMessages() { + return socket('https://yourapi/users/socket'); + } +} +``` + +### Cấu hình tùy chỉnh + +GetConnect có khả năng tùy chỉnh cao Bạn có thể xác định Url chính như answers, modifiers như request, xác địng authenticator và thậm chí số lần thử mà nó sẽ cố gắng authenticate, ngoài việc cung cấp khả năng xác định bộ giải mã chuẩn sẽ chuyển đổi tất cả các request của bạn thành Model mà không cần bất kỳ cấu hình bổ sung nào. + +```dart +class HomeProvider extends GetConnect { + @override + void onInit() { + // All request will pass to jsonEncode so CasesModel.fromJson() + httpClient.defaultDecoder = CasesModel.fromJson; + httpClient.baseUrl = 'https://api.covid19api.com'; + // baseUrl = 'https://api.covid19api.com'; // It define baseUrl to + // Http and websockets if used with no [httpClient] instance + + // It's will attach 'apikey' property on header from all requests + httpClient.addRequestModifier((request) { + request.headers['apikey'] = '12345678'; + return request; + }); + + // Even if the server sends data from the country "Brazil", + // it will never be displayed to users, because you remove + // that data from the response, even before the response is delivered + httpClient.addResponseModifier((request, response) { + CasesModel model = response.body; + if (model.countries.contains('Brazil')) { + model.countries.remove('Brazilll'); + } + }); + + httpClient.addAuthenticator((request) async { + final response = await get("http://yourapi/token"); + final token = response.body['token']; + // Set the header + request.headers['Authorization'] = "$token"; + return request; + }); + + //Autenticator will be called 3 times if HttpStatus is + //HttpStatus.unauthorized + httpClient.maxAuthRetries = 3; + } + } + + @override + Future> getCases(String path) => get(path); +} +``` + +## GetPage Middleware + +GetPage hiện có thuộc tính mới lấy danh sách GetMiddleWare và chạy chúng theo thứ tự cụ thể. + +**Chú ý**: Khi GetPage có Middleware (phần trung gian), tất cả các children của trang này sẽ tự động có cùng middlewares. + +### Ưu tiên + +Thứ tự ưu tiên của Middlewares có thể đặt như sau trong GetMiddleware. + +```dart +final middlewares = [ + GetMiddleware(priority: 2), + GetMiddleware(priority: 5), + GetMiddleware(priority: 4), + GetMiddleware(priority: -8), +]; +``` + +và chúng sẽ chạy như thế này **-8 => 2 => 4 => 5** + +### Chuyển hướng + +Khi bạn muốn tìm kiếm trang của route được gọi, function (hàm) sẽ khởi động. Kết quả là phải có RouteSettings để chuyển hướng đến. Hoặc cung cấp cho nó null và chuyển hướng không xảy ra. + +```dart +RouteSettings redirect(String route) { + final authService = Get.find(); + return authService.authed.value ? null : RouteSettings(name: '/login') +} +``` + +### onPageCalled + +Khi bạn gọi một trang trước mọi thứ được tạo, hàm này sẽ khởi động và +bạn có thể sử dụng nó để thay đổi điều gì đó về trang hoặc tạo cho nó một trang mới + +```dart +GetPage onPageCalled(GetPage page) { + final authService = Get.find(); + return page.copyWith(title: 'Welcome ${authService.UserName}'); +} +``` + +### OnBindingsStart + +Hàm này sẽ khởi động ngay trước khi Bindings diễn ra và bạn có thể thay đổi Bindings cho trang này. + +```dart +List onBindingsStart(List bindings) { + final authService = Get.find(); + if (authService.isAdmin) { + bindings.add(AdminBinding()); + } + return bindings; +} +``` + +### OnPageBuildStart + +Hàm này sẽ khởi động ngay sau khi Bindings diễn ra. Ở đây, bạn có thể làm thứ gì đó sau khi bạn tạo Bindings và trước khi tạo trang widget. + +```dart +GetPageBuilder onPageBuildStart(GetPageBuilder page) { + print('bindings are ready'); + return page; +} +``` + +### OnPageBuilt + +Hàm này sẽ khởi động ngay sau khi GetPage.page được gọi và sẽ cho bạn kết quả của hàm và lấy widget được hiển thị. + +### OnPageDispose + +Function này sẽ khởi động ngay sau khi hủy bỏ tất cả các đối tượng liên quan (Controller, views, ...) của trang. + +## APIs nâng cao khác + +```dart +// give the current args from currentScreen +Get.arguments + +// give name of previous route +Get.previousRoute + +// give the raw route to access for example, rawRoute.isFirst() +Get.rawRoute + +// give access to Routing API from GetObserver +Get.routing + +// check if snackbar is open +Get.isSnackbarOpen + +// check if dialog is open +Get.isDialogOpen + +// check if bottomsheet is open +Get.isBottomSheetOpen + +// remove one route. +Get.removeRoute() + +// back repeatedly until the predicate returns true. +Get.until() + +// go to next route and remove all the previous routes until the predicate returns true. +Get.offUntil() + +// go to next named route and remove all the previous routes until the predicate returns true. +Get.offNamedUntil() + +//Check in what platform the app is running +GetPlatform.isAndroid +GetPlatform.isIOS +GetPlatform.isMacOS +GetPlatform.isWindows +GetPlatform.isLinux +GetPlatform.isFuchsia + +//Check the device type +GetPlatform.isMobile +GetPlatform.isDesktop +//All platforms are supported independently in web! +//You can tell if you are running inside a browser +//on Windows, iOS, OSX, Android, etc. +GetPlatform.isWeb + + +// Equivalent to : MediaQuery.of(context).size.height, +// but immutable. +Get.height +Get.width + +// Gives the current context of the Navigator. +Get.context + +// Gives the context of the snackbar/dialog/bottomsheet in the foreground, anywhere in your code. +Get.contextOverlay + +// Chí ú: Nếu bạn dùng cái này, nhớ đặtt. thànhnce you +// have access to context in any place of your UI, you can use it anywhere in the UI code + +// If you need a changeable height/width (like Desktop or browser windows that can be scaled) you will need to use context. +context.width +context.height + +// Gives you the power to define half the screen, a third of it and so on. +// Useful for responsive applications. +// param dividedBy (double) optional - default: 1 +// param reducedBy (double) optional - default: 0 +context.heightTransformer() +context.widthTransformer() + +/// Similar to MediaQuery.of(context).size +context.mediaQuerySize() + +/// Similar to MediaQuery.of(context).padding +context.mediaQueryPadding() + +/// Similar to MediaQuery.of(context).viewPadding +context.mediaQueryViewPadding() + +/// Similar to MediaQuery.of(context).viewInsets; +context.mediaQueryViewInsets() + +/// Similar to MediaQuery.of(context).orientation; +context.orientation() + +/// Check if device is on landscape mode +context.isLandscape() + +/// Check if device is on portrait mode +context.isPortrait() + +/// Similar to MediaQuery.of(context).devicePixelRatio; +context.devicePixelRatio() + +/// Similar to MediaQuery.of(context).textScaleFactor; +context.textScaleFactor() + +/// Get the shortestSide from screen +context.mediaQueryShortestSide() + +/// True if width be larger than 800 +context.showNavbar() + +/// True if the shortestSide is smaller than 600p +context.isPhone() + +/// True if the shortestSide is largest than 600p +context.isSmallTablet() + +/// True if the shortestSide is largest than 720p +context.isLargeTablet() + +/// True if the current device is Tablet +context.isTablet() + +/// Returns a value according to the screen size +/// can give value for: +/// watch: if the shortestSide is smaller than 300 +/// mobile: if the shortestSide is smaller than 600 +/// tablet: if the shortestSide is smaller than 1200 +/// desktop: if width is largest than 1200 +context.responsiveValue() +``` + +### Cấu hình thủ công và cài đặt chung tuỳ chọn + +GetMaterialApp configures everything for you, but if you want to configure Get manually. + +```dart +MaterialApp( + navigatorKey: Get.key, + navigatorObservers: [GetObserver()], +); +``` + +Bạn cũng sẽ có thể dùng Middleware của riêng bạn trong `GetObserver`, điều này không ảnh hưởng những thứ khác. + +```dart +MaterialApp( + navigatorKey: Get.key, + navigatorObservers: [ + GetObserver(MiddleWare.observer) // Here + ], +); +``` + +Bạn có thể tạo _Global Settings_ cho `Get`. Chỉ cần thêm `Get.config` vào code của bạn trước khi đẩy (push) bất cứ route nào. +Hoặc làm nó trực tiếp trong `GetMaterialApp` của bạn. + +```dart +GetMaterialApp( + enableLog: true, + defaultTransition: Transition.fade, + opaqueRoute: Get.isOpaqueRouteDefault, + popGesture: Get.isPopGestureEnable, + transitionDuration: Get.defaultDurationTransition, + defaultGlobalState: Get.defaultGlobalState, +); + +Get.config( + enableLog = true, + defaultPopGesture = true, + defaultTransition = Transitions.cupertino +) +``` + +Bạn có thể tự chọn chuyển hướng tất cả logging messages từ `Get`. +Nếu bạn muốn sử dụng logging package ưa thích của riêng bạn, và muốn chụp lại những logs đó: + +```dart +GetMaterialApp( + enableLog: true, + logWriterCallback: localLogWriter, +); + +void localLogWriter(String text, {bool isError = false}) { + // pass the message to your favourite logging package here + // please note that even if enableLog: false log messages will be pushed in this callback + // you get check the flag if you want through GetConfig.isLogEnable +} + +``` + +### Local State Widgets + +Các Widget này cho phép bạn quản lý một giá trị duy nhất và giữ trạng thái tạm thời và cục bộ. +Chúng ta có các hướng đi cho Reactive và Simple. +Ví dụ: bạn có thể sử dụng chúng để chuyển đổi văn bản tối nghĩa trong một `TextField`, có thể tạo một widget +Expandable Panel tùy chỉnh hoặc có thể sửa đổi chỉ mục hiện tại trong `BottomNavigationBar` trong khi thay đổi nội dung +bên trong một `Scaffold`. + +#### ValueBuilder + +Đơn giản hóa của `StatefulWidget` hoạt động với lệnh gọi lại` .setState` nhận giá trị cập nhật. + +```dart +ValueBuilder( + initialValue: false, + builder: (value, updateFn) => Switch( + value: value, + onChanged: updateFn, // same signature! you could use ( newValue ) => updateFn( newValue ) + ), + // if you need to call something outside the builder method. + onUpdate: (value) => print("Value updated: $value"), + onDispose: () => print("Widget unmounted"), +), +``` + +#### ObxValue + +Tương tự như [`ValueBuilder`](#valuebuilder), nhưng đây là phiên bản Reactive, bạn kèm một lệnh Rx (nhớ cái .obs không?) và nó cập nhật tự động ... hay chưa? + +```dart +ObxValue((data) => Switch( + value: data.value, + onChanged: data, // Rx has a _callable_ function! You could use (flag) => data.value = flag, + ), + false.obs, +), +``` + +## Mẹo hữu ích + +`.obs` observable (variable có thể quan sát được) (còn được gọi là loại _Rx_) có nhiều phương thức và toán tử bên trong. + +> Is very common to _believe_ that a property with `.obs` **IS** the actual value... but make no mistake! +> We avoid the Type declaration of the variable, because Dart's compiler is smart enough, and the code +> looks cleaner, but: + +```dart +var message = 'Xin Chào'.obs; +print( 'Message "$message" has Type ${message.runtimeType}'); +``` + +Ngay cả khi `message` _prints_ giá trị String, thì kiểu của nó lại là ** RxString **! + +Vì vậy, bạn không thể thực hiện `message.substring (0, 4) '. Bạn phải truy cập vào `value`thực bên trong _observable_: Cách được sử dụng nhiều nhất là`.value`, nhưng, bạn có biết rằng bạn cũng có thể sử dụng ... + +```dart +final name = 'GetX'.obs; +// only "updates" the stream, if the value is different from the current one. +name.value = 'Hey'; + +// All Rx properties are "callable" and returns the new value. +// but this approach does not accepts `null`, the UI will not rebuild. +name('Hello'); + +// is like a getter, prints 'Hello'. +name() ; + +/// numbers: + +final count = 0.obs; + +// You can use all non mutable operations from num primitives! +count + 1; + +// Watch out! this is only valid if `count` is not final, but var +count += 1; + +// You can also compare against values: +count > 2; + +/// booleans: + +final flag = false.obs; + +// switches the value between true/false +flag.toggle(); + + +/// all types: + +// Sets the `value` to null. +flag.nil(); + +// All toString(), toJson() operations are passed down to the `value` +print( count ); // calls `toString()` inside for RxInt + +final abc = [0,1,2].obs; +// Converts the value to a json Array, prints RxList +// Json is supported by all Rx types! +print('json: ${jsonEncode(abc)}, type: ${abc.runtimeType}'); + +// RxMap, RxList and RxSet are special Rx types, that extends their native types. +// but you can work with a List as a regular list, although is reactive! +abc.add(12); // pushes 12 to the list, and UPDATES the stream. +abc[3]; // like Lists, reads the index 3. + + +// equality works with the Rx and the value, but hashCode is always taken from the value +final number = 12.obs; +print( number == 12 ); // prints > true + +/// Custom Rx Models: + +// toJson(), toString() are deferred to the child, so you can implement override on them, and print() the observable directly. + +class User { + String name, last; + int age; + User({this.name, this.last, this.age}); + + @override + String toString() => '$name $last, $age years old'; +} + +final user = User(name: 'Khang', last: 'Huỳnh', age: 33).obs; + +// `user` is "reactive", but the properties inside ARE NOT! +// So, if we change some variable inside of it... +user.value.name = 'Kaiser'; +// The widget will not rebuild!, +// `Rx` don't have any clue when you change something inside user. +// So, for custom classes, we need to manually "notify" the change. +user.refresh(); + +// or we can use the `update()` method! +user.update((value){ + value.name='Kaiser'; +}); + +print( user ); +``` + +## StateMixin + +Một cách khác để xử lý trạng thái `UI` của bạn là sử dụng`StateMixin `. +Để triển khai nó, hãy sử dụng dấu `with` để thêm`StateMixin ` vào bộ điều khiển (controller) của bạn cho phép tích hợp kèm mô hình T. + +```dart +class Controller extends GetController with StateMixin{} +``` + +Phương thức `change()` thay đổi trạng thái bất cứ khi nào chúng ta muốn. +Chỉ cần chuyển dữ liệu và trạng thái theo cách này: + +```dart +change(data, status: RxStatus.success()); +``` + +RxStatus cho phép những trang thái này: + +```dart +RxStatus.loading(); +RxStatus.success(); +RxStatus.empty(); +RxStatus.error('message'); +``` + +Để biểu hiện nó trên UI, sử dụng: + +```dart +class OtherClass extends GetView { + @override + Widget build(BuildContext context) { + return Scaffold( + + body: controller.obx( + (state)=>Text(state.name), + + // here you can put your custom loading indicator, but + // by default would be Center(child:CircularProgressIndicator()) + onLoading: CustomLoadingIndicator(), + onEmpty: Text('No data found'), + + // here also you can set your own error widget, but by + // default will be an Center(child:Text(error)) + onError: (error)=>Text(error), + ), + ); +} +``` + +#### GetView + +Widget này là bảo bối của GetX, rất đơn giản, nhưng rất hữu ích! + +Là một Widget `const Stateless` có getter` controller` cho một `Controller` đã đăng ký, chỉ vậy thôi người ơi~. + +```dart + class AwesomeController extends GetController { + final String title = 'My Awesome View'; + } + + // ALWAYS remember to pass the `Type` you used to register your controller! + class AwesomeView extends GetView { + @override + Widget build(BuildContext context) { + return Container( + padding: EdgeInsets.all(20), + child: Text(controller.title), // just call `controller.something` + ); + } + } +``` + +#### GetResponsiveView + +Mở rộng tiện ích này để xây dựng chế độ responsive. +Widget này chứa thuộc tính `screen` có tất cả +thông tin về kích thước và loại màn hình. + +##### Hướng dẫn sử dụng trước khi dùng + +Bạn có hai lựa chọn để xây dựng nó. + +- với phương thức `builder` bạn trả về tiện ích con để xây dựng. +- với các phương thức `desktop`,` tablet`, `phone`,` watch`. cụ thể, các phương thức này sẽ tạo các loại màn hình khớp với ngữ cảnh khi màn hình là [ScreenType.Tablet] thì phương thức `tablet` sẽ được tạo ra và cứ như vậy. + **Chú ý:** Nếu bạn dùng cái này, nhớ đặt `alwaysUseBuilder` thành `false` + +Với thuộc tính `settings` bạn có thể đặt chiều dài tối thiểu cho các loại màn hình. + +![example](https://github.com/SchabanBo/get_page_example/blob/master/docs/Example.gif?raw=true) +Code to this screen +[code](https://github.com/SchabanBo/get_page_example/blob/master/lib/pages/responsive_example/responsive_view.dart) + +#### GetWidget + +Hầu hết mọi người không biết gì về Widget này, hoặc hoàn toàn nhầm lẫn về cách sử dụng nó. +Trường hợp sử dụng rất hiếm, nhưng rất cụ thể: Nó `caches` một Bộ điều khiển. +Bởi vì _cache_ không thể là một `const Stateless`. + +> Vậy khi nào mình cần cache bộ điều khiển (controller)? + +Nếu sử dụng, bạn sẽ dùng cái này **GetX**: `Get.create()`. + +`Get.create(()=>Controller())` sẽ tạo một `Controller` với mỗi lần gọi `Get.find()`, + +Đó là nơi mà `GetWidget` tỏa sáng ... chẳng hạn như bạn có thể sử dụng nó, để giữ một danh sách các mục Todo. Vì vậy, nếu widget được "xây dựng lại", nó sẽ giữ nguyên phiên bản controller. + +#### GetxService + +Class này giống như một `GetxController`, nó chia sẻ cùng một vòng đời (`onInit ()`,`onReady ()`,`onClose ()`). +Nhưng không có "logic" bên trong của nó. Nó chỉ thông báo cho ** GetX ** Hệ thống Nạp Dependency rằng class con này ** không thể ** bị xóa khỏi bộ nhớ. + +Vì vậy, rất hữu ích để giữ cho "Service" của bạn luôn có thể truy cập và hoạt động với `Get.find ()`. Giống: +`ApiService`,` StorageService`, `CacheService`. + +```dart +Future main() async { + await initServices(); /// AWAIT SERVICES INITIALIZATION. + runApp(SomeApp()); +} + +/// Is a smart move to make your Services intiialize before you run the Flutter app. +/// as you can control the execution flow (maybe you need to load some Theme configuration, +/// apiKey, language defined by the User... so load SettingService before running ApiService. +/// so GetMaterialApp() doesnt have to rebuild, and takes the values directly. +void initServices() async { + print('starting services ...'); + /// Here is where you put get_storage, hive, shared_pref initialization. + /// or moor connection, or whatever that's async. + await Get.putAsync(() => DbService().init()); + await Get.putAsync(SettingsService()).init(); + print('All services started...'); +} + +class DbService extends GetxService { + Future init() async { + print('$runtimeType delays 2 sec'); + await 2.delay(); + print('$runtimeType ready!'); + return this; + } +} + +class SettingsService extends GetxService { + void init() async { + print('$runtimeType delays 1 sec'); + await 1.delay(); + print('$runtimeType ready!'); + } +} + +``` + +Cách duy nhất để thực sự xóa một `GetxService`, là với `Get.reset ()` giống như cách thức "Khởi động nóng" ứng dụng của bạn. Vì vậy, hãy nhớ rằng, nếu bạn cần sự tồn tại tuyệt đối của một class trong vòng đời tồn tại của nó trong ứng dụng của bạn, hãy sử dụng `GetxService`. + +# Thay đổi đột phá 2.0 + +1- Rx types: + +| Before | After | +| ------- | ---------- | +| StringX | `RxString` | +| IntX | `RxInt` | +| MapX | `RxMap` | +| ListX | `RxList` | +| NumX | `RxNum` | +| DoubleX | `RxDouble` | + +RxController và GetBuilder bây giờ đã hợp nhất, bạn không cần phải ghi nhớ bộ điều khiển nào bạn muốn sử dụng, chỉ cần sử dụng GetxController, nó sẽ hoạt động để quản lý trạng thái đơn giản và reactive. + +2- NamedRoutes +Before: + +```dart +GetMaterialApp( + namedRoutes: { + '/': GetRoute(page: Home()), + } +) +``` + +Now: + +```dart +GetMaterialApp( + getPages: [ + GetPage(name: '/', page: () => Home()), + ] +) +``` + +Tại sao lại thay đổi? +Thông thường, có thể cần phải quyết định trang nào sẽ được hiển thị từ một tham số hoặc mã thông báo đăng nhập, cách tiếp cận trước đây không linh hoạt, vì nó không cho phép điều này. +Việc chèn trang vào một hàm đã làm giảm đáng kể mức tiêu thụ RAM, vì các tuyến sẽ không được cấp phát trong bộ nhớ kể từ khi ứng dụng được khởi động và nó cũng cho phép thực hiện kiểu tiếp cận này: + +```dart + +GetStorage box = GetStorage(); + +GetMaterialApp( + getPages: [ + GetPage(name: '/', page:(){ + return box.hasData('token') ? Home() : Login(); + }) + ] +) +``` + +# Tại sao lại dùng GetX + +1- Nhiều lần sau khi cập nhật Flutter, nhiều package của bạn sẽ bị hỏng. Đôi khi lỗi biên dịch code xảy ra, lỗi thường xuất hiện mà vẫn không có câu trả lời; và, chúng ta, nhà phát triển, cần biết lỗi đến từ đâu, theo dõi lỗi, chỉ sau đó cố gắng mở một vấn đề trong kho lưu trữ tương ứng và xem vấn đề của nó đã được giải quyết. Tập trung các tài nguyên chính để phát triển (Quản lý state, dependency và route), cho phép bạn thêm một gói duy nhất vào pubspec của mình và bắt đầu hoạt động. Sau khi cập nhật Flutter, điều duy nhất bạn cần làm là cập nhật Get dependency và bắt đầu làm việc. Get cũng giải quyết các vấn đề tương thích. Có bao nhiêu lần một phiên bản của một gói không tương thích với phiên bản của gói khác, vì một gói sử dụng phần phụ thuộc trong một phiên bản và gói kia trong phiên bản khác? Đây cũng không phải là vấn đề đáng lo ngại khi sử dụng Get, vì mọi thứ đều nằm trong cùng một gói và hoàn toàn tương thích. + +2- Flutter dễ học, Flutter siêu phàm, nhưng Flutter vẫn có một số bản soạn sẵn có thể không mong muốn đối với hầu hết các nhà phát triển, chẳng hạn như `Navigator.of (context) .push (context, builder [...] '. Get đơn giản hóa việc phát triển. Thay vì viết 8 dòng mã chỉ để gọi một tuyến đường, bạn chỉ cần làm điều đó: `` Get.to (Home ()) 'và bạn đã hoàn tất, bạn sẽ chuyển sang trang tiếp theo. Các url web động là một điều thực sự khó khăn để làm với Flutter hiện tại và điều đó với GetX đơn giản đến đần độn :). Quản lý trạng thái trong Flutter và quản lý các phần phụ thuộc cũng là điều tạo ra nhiều cuộc thảo luận, vì có hàng trăm mẫu trong pub (Dart package website). Nhưng không có gì dễ dàng bằng việc thêm ".obs" ở cuối biến của bạn, và đặt tiện ích của bạn bên trong Obx, và thế là xong, tất cả các cập nhật cho biến đó sẽ được tự động cập nhật trên màn hình. + +3- Dễ dàng mà không phải lo lắng về hiệu suất. Hiệu suất của Flutter đã đáng kinh ngạc rồi, nhưng hãy tưởng tượng rằng bạn sử dụng trình quản lý state và trình định vị để phân phối các Blocs / stores / controllers / v.v. của bạn. Bạn sẽ phải gọi thủ công loại trừ sự phụ thuộc khi bạn không cần đến chúng. Nhưng bạn đã bao giờ nghĩ chỉ cần sử dụng bộ điều khiển của mình và khi nó không còn được ai sử dụng nữa, nó sẽ đơn giản được xóa khỏi bộ nhớ? Đó là những gì GetX làm. Với SmartManagement, mọi thứ không được sử dụng sẽ được xóa khỏi bộ nhớ và bạn không phải lo lắng về bất cứ điều gì ngoài lập trình. Bạn sẽ được đảm bảo rằng bạn đang sử dụng các nguồn tài nguyên cần thiết tối thiểu mà thậm chí không cần tạo ra một logic nào cho việc này. + +4- Tách khỏi thực tế. Bạn có thể đã nghe đến khái niệm "tách khung nhìn (view) khỏi business logic". Đây không phải là đặc thù của BLoC, MVC, MVVM và bất kỳ tiêu chuẩn nào khác trên thị trường đều có khái niệm này. Tuy nhiên, khái niệm này thường có thể được giảm thiểu trong Flutter do việc sử dụng ngữ cảnh (context). +Nếu bạn cần ngữ cảnh để tìm một InheritedWidget, bạn cần nó trong dạng xem hoặc chuyển ngữ cảnh theo tham số. Tôi đặc biệt thấy giải pháp này rất chán đời; hơn nữa, để làm việc theo nhóm, chúng tôi sẽ luôn phụ thuộc vào business logic của View. GetX không chính thống với cách tiếp cận tiêu chuẩn và mặc dù nó không cấm hoàn toàn việc sử dụng StatefulWidgets, InitState, v.v., nhưng nó luôn có một cách tiếp cận tương tự có thể rõ ràng hơn. Controller có vòng đời và khi bạn cần thực hiện yêu cầu APIREST chẳng hạn, bạn độc lập với View. Bạn có thể sử dụng onInit để bắt đầu cuộc gọi http và khi dữ liệu đến, các biến sẽ được điền. Vì GetX hoạt động hoàn toàn reactive (đó là sự thực và hoạt động theo luồng), khi các mục được lấp đầy, tất cả tiện ích con sử dụng biến đó sẽ được cập nhật tự động trong View. Điều này cho phép những người có chuyên môn về UI chỉ làm việc với các widget và không phải gửi bất kỳ thứ gì đến logic nghiệp vụ ngoài các sự kiện của người dùng (như nhấp vào nút), trong khi những người làm việc với logic nghiệp vụ sẽ được tự do tạo và kiểm tra logic nghiệp vụ riêng. + +Thư viện này sẽ luôn được cập nhật và triển khai các tính năng mới. Hãy thoải mái đưa ra các bài PR và đóng góp cho chúng. + +# Cộng đồng + +## Kênh Cộng đồng + +GetX có một cộng đồng rất tích cực và hữu ích. Nếu bạn có thắc mắc hoặc muốn được hỗ trợ về việc sử dụng khuôn khổ này, vui lòng tham gia các kênh cộng đồng của chúng tôi, câu hỏi của bạn sẽ được trả lời nhanh hơn và đó sẽ là nơi phù hợp nhất. Kho lưu trữ này dành riêng cho các vấn đề mở và yêu cầu tài nguyên, nhưng hãy thoải mái trở thành một phần của Cộng đồng GetX. + +| **Slack** | **Discord** | **Telegram** | +| :-------------------------------------------------------------------------------------------------------------------------- | :-------------------------------------------------------------------------------------------------------------------------- | :-------------------------------------------------------------------------------------------------------------------- | +| [![Get on Slack](https://img.shields.io/badge/slack-join-orange.svg)](https://communityinviter.com/apps/getxworkspace/getx) | [![Discord Shield](https://img.shields.io/discord/722900883784073290.svg?logo=discord)](https://discord.com/invite/9Hpt99N) | [![Telegram](https://img.shields.io/badge/chat-on%20Telegram-blue.svg)](https://t.me/joinchat/PhdbJRmsZNpAqSLJL6bH7g) | + +## Cách cống hiến + +_Bạn muốn đóng góp cho dự án? Chúng tôi sẽ tự hào giới thiệu bạn với tư cách là một trong những cộng tác viên của chúng tôi. Dưới đây là một số điểm mà bạn có thể đóng góp và làm cho Get (và Flutter) tốt hơn nữa._ + +- Giúp dịch readme sang các ngôn ngữ khác. +- Thêm tài liệu vào readme (rất nhiều chức năng của Get chưa được tài liệu hóa). +- Viết bài hoặc làm video dạy cách sử dụng Get (chúng sẽ được chèn vào Readme và trong tương lai trong Wiki của chúng tôi). +- Đưa ra các PR cho mã / bài kiểm tra. +- Bao gồm các chức năng mới. + +Mọi đóng góp đều được hoan nghênh! + +## Các bài báo và video + +- [Flutter GetX EcoSystem package for arabic people](https://www.youtube.com/playlist?list=PLV1fXIAyjeuZ6M8m56zajMUwu4uE3-SL0) - Hướng dẫn bởi [Pesa Coder](https://github.com/UsamaElgendy). +- [Dynamic Themes in 3 lines using GetX™](https://medium.com/swlh/flutter-dynamic-themes-in-3-lines-c3b375f292e3) - Hướng dẫn bởi [Rod Brown](https://github.com/RodBr). +- [Complete GetX™ Navigation](https://www.youtube.com/watch?v=RaqPIoJSTtI) - Quản lý route bởi Amateur Coder. +- [Complete GetX State Management](https://www.youtube.com/watch?v=CNpXbeI_slw) - Quản lý State video by Amateur Coder. +- [GetX™ Other Features](https://youtu.be/ttQtlX_Q0eU) - Utils, storage, bindings and other features video by Amateur Coder. +- [Firestore User with GetX | Todo App](https://www.youtube.com/watch?v=BiV0DcXgk58) - Video by Amateur Coder. +- [Firebase Auth with GetX | Todo App](https://www.youtube.com/watch?v=-H-T_BSgfOE) - Video by Amateur Coder. +- [The Flutter GetX™ Ecosystem ~ State Management](https://medium.com/flutter-community/the-flutter-getx-ecosystem-state-management-881c7235511d) - Quản lý State by [Aachman Garg](https://github.com/imaachman). +- [The Flutter GetX™ Ecosystem ~ Dependency Injection](https://medium.com/flutter-community/the-flutter-getx-ecosystem-dependency-injection-8e763d0ec6b9) - Nạp dependency by [Aachman Garg](https://github.com/imaachman). +- [GetX, the all-in-one Flutter package](https://www.youtube.com/watch?v=IYQgtu9TM74) - Giới thiệu sơ lược về quản lý State and Navigation by Thad Carnevalli. +- [Build a To-do List App from scratch using Flutter and GetX](https://www.youtube.com/watch?v=EcnqFasHf18) - UI + State Management + Storage video by Thad Carnevalli. +- [GetX Flutter Firebase Auth Example](https://medium.com/@jeffmcmorris/getx-flutter-firebase-auth-example-b383c1dd1de2) - Article by Jeff McMorris. +- [Flutter State Management with GetX – Complete App](https://www.appwithflutter.com/flutter-state-management-with-getx/) - by App With Flutter. +- [Flutter Routing with Animation using Get Package](https://www.appwithflutter.com/flutter-routing-using-get-package/) - by App With Flutter. +- [A minimal example on dartpad](https://dartpad.dev/2b3d0d6f9d4e312c5fdbefc414c1727e?) - by [Roi Peker](https://github.com/roipeker) diff --git a/siro_rider/packages/get/README.id-ID.md b/siro_rider/packages/get/README.id-ID.md new file mode 100644 index 0000000..6b0c07c --- /dev/null +++ b/siro_rider/packages/get/README.id-ID.md @@ -0,0 +1,1113 @@ +![](https://raw.githubusercontent.com/jonataslaw/getx-community/master/get.png) + +**Bahasa: Indonesia (file ini), [Inggris](README.md), [Orang Vietnam](README-vi.md), [Urdu](README.ur-PK.md), [China](README.zh-cn.md), [Portugis (Brazil)](README.pt-br.md), [Spanyol](README-es.md), [Russia](README.ru.md), [Polandia](README.pl.md), [Korea](README.ko-kr.md), [French](README-fr.md)** + +[![pub package](https://img.shields.io/pub/v/get.svg?label=get&color=blue)](https://pub.dev/packages/get) +[![popularity](https://badges.bar/get/popularity)](https://pub.dev/packages/sentry/score) +[![likes](https://badges.bar/get/likes)](https://pub.dev/packages/get/score) +[![pub points](https://badges.bar/get/pub%20points)](https://pub.dev/packages/get/score) +![building](https://github.com/jonataslaw/get/workflows/build/badge.svg) +[![style: effective dart](https://img.shields.io/badge/style-effective_dart-40c4ff.svg)](https://pub.dev/packages/effective_dart) +[![Discord Shield](https://img.shields.io/discord/722900883784073290.svg?logo=discord)](https://discord.com/invite/9Hpt99N) +[![Get on Slack](https://img.shields.io/badge/slack-join-orange.svg)](https://communityinviter.com/apps/getxworkspace/getx) +[![Telegram](https://img.shields.io/badge/chat-on%20Telegram-blue.svg)](https://t.me/joinchat/PhdbJRmsZNpAqSLJL6bH7g) + +Awesome Flutter + +Buy Me A Coffee + +![](https://raw.githubusercontent.com/jonataslaw/getx-community/master/getx.png) + +- [Tentang Get](#tentang-get) +- [Instalasi](#instalasi) +- [Aplikasi Counter menggunakan GetX](#aplikasi-counter-menggunakan-getx) +- [Tiga Pilar](#tiga-pilar) + - [State management](#state-management) + - [Reactive State Manager](#reactive-state-manager) + - [Detail lebih lanjut mengenai state management](#detail-lebih-lanjut-mengenai-state-management) + - [Route management](#route-management) + - [Detail lebih lanjut mengenai route management](#detail-lebih-lanjut-mengenai-route-management) + - [Dependency management](#dependency-management) + - [Detail lebih lanjut mengenai dependency management](#detail-lebih-lanjut-mengenai-dependency-management) +- [Utilitas](#utilitas) + - [Internasionalisasi](#internasionalisasi) + - [Translasi](#translasi) + - [Menggunakan Translasi](#menggunakan-translasi) + - [Lokalisasi](#lokalisasi) + - [Mengubah Lokal](#mengubah-lokal) + - [Lokal Sistem](#lokal-sistem) + - [Mengubah Tema](#mengubah-tema) + - [GetConnect](#getconnect) + - [Konfigurasi Default](#konfigurasi-default) + - [Konfigurasi Kustom](#konfigurasi-kustom) + - [GetPage Middleware](#getpage-middleware) + - [Prioritas](#prioritas) + - [Redirect](#redirect) + - [OnPageCalled](#onpagecalled) + - [OnBindingsStart](#onbindingsstart) + - [OnPageBuildStart](#onpagebuildstart) + - [OnPageBuilt](#onpagebuilt) + - [OnPageDispose](#onpagedispose) + - [API Lanjutan Lainnya](#api-lanjutan-lainnya) + - [Pengaturan Global Opsional dan Konfigurasi Manual](#pengaturan-global-opsional-dan-konfigurasi-manual) + - [Local State Widgets](#local-state-widgets) + - [ValueBuilder](#valuebuilder) + - [ObxValue](#obxvalue) + - [Tips berguna](#tips-berguna) + - [GetView](#getview) + - [GetResponsiveView](#getresponsiveview) + - [Cara pakai](#cara-pakai) + - [GetWidget](#getwidget) + - [GetxService](#getxservice) +- [Breaking change dari 2.0](#breaking-change-dari-20) +- [Mengapa Getx?](#mengapa-getx) +- [Komunitas](#komunitas) + - [Channel Komunitas](#kanal-komunitas) + - [Cara berkontribusi](#cara-berkontribusi) + - [Artikel dan Video](#artikel-dan-video) + +# Tentang Get + +- GetX adalah solusi ekstra-ringan dan powerful untuk Flutter. Ini mengkombinasikan state management dengan performa tinggi, injeksi dependensi yang cerdas, dan route management secara singkat dan praktis. + +- GetX memiliki 3 prinsip dasar, yang menjadi prioritas untuk semua resource yang ada di dalamnya: **PRODUKTIFITAS, PERFORMA DAN ORGANISASI** + + - **PERFORMA:** GetX fokus pada performa dan konsumsi resource minimum. GetX tidak menggunakan Stream atau ChangeNotifier. + + - **PRODUKTIFITAS:** GetX menggunakan sintaks yang mudah dan nyaman. Tidak peduli apa yang akan anda lakukan, akan selalu ada cara yang lebih mudah dengan GetX. Ini akan menghemat waktu development, dan meng-ekstrak performa maksimum pada aplikasi anda. + Umumnya, developer akan selalu berhubungan dengan penghapusan controller dari memori. Dengan GetX, ini tidak diperlukan, karena resource akan dihapus dari memori secara default ketika tidak digunakan. Jika anda ingin menyimpannnya kedalam memori, anda harus secara eksplisit mendeklarasikan "permanent: true" pada dependensi anda. Dengan begitu, selain menghemat waktu, anda juga mengurangi resiko memiliki dependensi yang tidak diperlukan dalam memori. Pemuatan dependensi juga bersifat "lazy" secara default. + + - **ORGANISASI:** GetX memungkinkan pemisahan View, Presentation Logic, Business Logic, Dependency Injection, dan Navigasi. + Anda tidak perlu konteks untuk berpindah antar halaman. Jadi, anda tidak lagi bergantung pada widget tree (visualisasi) untuk hal ini. Anda tidak perlu konteks untuk mengakses controller/bloc melalui InheritedWidget. Dengan ini, anda benar benar memisahkan presentation logic dan business logic dari lapisan visual. Anda tidak perlu menginjeksi kelas Controller/Model/Bloc kedalam widget tree melalui multiprovider, untuk hal ini GetX menggunakan fitur dependency injection nya sendiri, memisahkan DI dari View secara total. + Dengan GetX, anda tahu dimana harus mencari setiap fitur dalam aplikasi anda, memiliki kode yang bersih secara default. Ini selain untuk memfasilitasi maintenance, membuat pembagian modul, sesuatu yang hingga saat itu di Flutter tidak terpikirkan, sesuatu yang sangat mungkin. + BLoC adalah permulaan awal dalam meng-organisir kode di Flutter, ini memisahkan business logic dari visualisasi. GetX adalah evolusi natural dari ini, tidak hanya memisahkan business logic, tapi juga presentation logic. Injeksi dependensi dan route juga dipisahkan sebagai bonus, dan lapisan data benar-benar terpisah secara menyeluruh. Anda tahu dimana semuanya berada, dan segalanya dengan cara yang lebih mudah daripada membuat sebuah hello world. + GetX adalah cara termudah, praktis, dan scalable untuk membangun aplikasi dengan performa tinggi menggunakan Flutter SDK, dengan ekosistem besar di sekelilingnya yang bekerjasama secara sempurna, mudah dipahami untuk pemula, dan akurat untuk ahli. Aman, stabil, up-to-date, dan menawarkan banyak cakupan build-in API yang tidak tersedia di dalam default Flutter SDK. + +- GetX tidak "bloated". Dirinya memiliki banyak fitur yang memungkinkan anda memulai programming tanpa mengkhawatirkan apapun, namun setiap fiturnya terletak didalam kontainer terpisah, dan hanya dimulai setelah digunakan. Jika anda hanya menggunakan State Management, hanya State Management yang akan di-compile. Jika anda hanya menggunakan routes, state management tidak akan di-compile. + +- GetX memiliki ekosistem yang besar, komunitas yang juga besar, banyak kolaborator, dan akan di maintenance selama Flutter ada. GetX juga mampu berjalan dengan kode yang sama di Android, iOS, Web, Mac, Linux, Windows, dan server anda. +**Juga memungkinkan untuk me-reuse kode yang dibuat di frontend ke backend dengan [Get Server](https://github.com/jonataslaw/get_server)**. + +**Selain itu, seluruh proses development bisa di automasi secara menyeluruh, untuk keduanya (server dan frontend) menggunakan [Get CLI](https://github.com/jonataslaw/get_cli)**. + +**Selain itu, untuk lebih meningkatkan produktifitas anda, kami memiliki [ekstensi untuk VSCode](https://marketplace.visualstudio.com/items?itemName=get-snippets.get-snippets) dan [ekstensi untuk Android Studio/Intellij](https://plugins.jetbrains.com/plugin/14975-getx-snippets)** + +# Instalasi + +Tambahkan Get kedalam file `pubspec.yaml` anda: + +```yaml +dependencies: + get: +``` + +Import get didalam file dimana get akan digunakan: + +```dart +import 'package:get/get.dart'; +``` + +# Aplikasi Counter menggunakan GetX + +Proyek "counter" yang dibuat secara default ketika membuat proyek Flutter memiliki lebih dari 100 baris (termasuk comment). Untuk menunjukkan kekuatan Get, kami akan mendemonstrasikan bagaimana cara membuat "counter" yang mengubah state setiap klik, berpindah, dan berbagi state antar halaman, semua dalam cara yang terorganisir, memisahkan business logic dari view, dalam HANYA 26 BARIS KODE TERMASUK COMMENT. + +- Langkah 1: + Tambahkan "Get" sebelum MaterialApp, mengubahnya menjadi GetMaterialApp + +```dart +void main() => runApp(GetMaterialApp(home: Home())); +``` + +- Catatan: ini tidak mengubah MaterialApp bawaan Flutter, GetMaterialApp bukan sebuah MaterialApp yang dimodifikasi, itu hanyalah sebuah Widget yang telah dikonfigurasi sebelumnya, yang mana memiliki default MaterialApp sebagai child. Anda bisa mengkonfigurasinya secara manual, namun hal itu benar-benar tidak diperlukan. GetMaterialApp akan membuat route, menginjeksinya, menginjeksi translasi/terjemahan, dan semua yang anda butuhkan untuk navigasi route. Jika anda hanya menggunakan Get untuk manajemen state atau manajemen dependensi, tidak perlu menggunakan GetMaterialApp. GetMaterialApp diperlukan untuk route, snackbar, internasionalisasi/terjemahan, bottomSheet, dialog, dan high-level API yang berhubungan dengan route dan ketiadaan konteks. + +- Catatan²: Langkah ini hanya diperlukan jika anda akan menggunakan manajemen route (`Get.to()`, `Get.back()` dan seterusnya). Jika anda tidak menggunakannya, langkah 1 tidak diperlukan. + +- Langkah 2: + Buat file baru untuk business logic dan taruh semua variabel, metode, dan kontroler didalamnya. + Anda bisa membuat variabel apapun menjadi "observable" menggunakan notasi tambahan ".obs". + +```dart +class Controller extends GetxController{ + var count = 0.obs; + increment() => count++; +} +``` + +- Langkah 3: + Buat file baru untuk View, gunakan StatelessWidget dan hemat penggunaan RAM, dengan Get, anda mungkin tidak perlu lagi menggunakan StatefulWidget. + +```dart +class Home extends StatelessWidget { + + @override + Widget build(context) { + + // Instansiasi kelas anda menggunakan Get.put() untuk membuatnya tersedia untuk seluruh "child" route dibawahnya. + final Controller c = Get.put(Controller()); + + return Scaffold( + // Gunakan Obx(() => ...) untuk mengupdate Text() ketika `count` berubah. + appBar: AppBar(title: Obx(() => Text("Clicks: ${c.count}"))), + + // Ganti 8 baris Navigator.push menggunan Get.to() agar lebih sederhana. Anda tidak perlu `context`. + body: Center(child: ElevatedButton( + child: Text("Go to Other"), onPressed: () => Get.to(Other()))), + floatingActionButton: + FloatingActionButton(child: Icon(Icons.add), onPressed: c.increment)); + } +} + +class Other extends StatelessWidget { + // Anda bisa meminta Get untuk menemukan kontroler yang digunakan di halaman lain dan redirect ke halaman itu. + final Controller c = Get.find(); + + @override + Widget build(context){ + // Akses variabel `count` yang telah di update. + return Scaffold(body: Center(child: Text("${c.count}"))); + } +} +``` + +Hasil: + +![](https://raw.githubusercontent.com/jonataslaw/getx-community/master/counter-app-gif.gif) + +Ini adalah proyek sederhana, namun sudah membuatnya terlihat jelas betapa powerful kemampuan yang dimiliki Get. Sepanjang proyek anda berkembang, perbedaan ini akan menjadi lebih signifikan. + +Get di desain untuk bekerja dalam tim, namun juga memudahkan pekerjaan untuk developer perseorangan dan membuatnya menjadi lebih sederhana. + +Tingkatkan deadline anda, antarkan semuanya tanpa kehilangan performa. Get bukan untuk semua orang, namun jika anda tersinggung dengan frasa tersebut, Get cocok untukmu! + +# Tiga Pilar + +## State management + +Get memiliki dua state manager berbeda: Simple state manager (kami menyebutnya GetBuilder) dan Reactive state manager (GetX/Obx) + +### Reactive State Manager + +Reactive programming bisa meng-alienasi banya orang karena katanya, sulit dimengerti. GetX mengubah reactive programming menjadi sesuatu yang cukup sederhana: + +- Anda tidak perlu membuat StreamController. +- Anda tidak perlu membuat StreamBuilder untuk setiap variabel. +- Anda tidak perlu membuat kelas untuk setiap state. +- Anda tidak perlu membuat get untuk sebuah value awal (initial value). +- Anda tidak perlu menggunakan generator kode. + +Reactive programming dengan Get semudah menggunakan setState. + +Bayangkan anda memiliki variabel nama, dan setiap kali anda mengubahnya, semua widget yang menggunakannya akan berubah secara otomatis. + +Ini variabel count anda: + +```dart +var name = 'Jonatas Borges'; +``` + +Untuk membuatnya "observable", anda hanya perlu menambahkan ".obs" di belakangnya: + +```dart +var name = 'Jonatas Borges'.obs; +``` + +Dan didalam UI, ketika anda ingin menampilkan value dan update tampilan ketika value itu berubah, cukup lakukan ini: + +```dart +Obx(() => Text("${controller.name}")); +``` + +Selesai! _Sesederhana_ itu. + +### Detail lebih lanjut mengenai state management + +**Baca penjelasan lebih lanjut tentang state management [disini](./documentation/id_ID/state_management.md). Disana anda akan melihat contoh lebih banyak dan juga perbedaan diantara simple state manager dengan reactive state manager** + +Anda akan mendapatkan pemahaman yang baik tentang kekuatan dari GetX. + +## Route management + +Jika anda ingin menggunakan routes/snackbars/dialogs/bottomsheets tanpa context, GetX luar biasa cocok untuk anda, lihat ini: + +Tambahkan "Get" sebelum MaterialApp, mengubahnya menjadi GetMaterialApp + +```dart +GetMaterialApp( // Sebelumnya: MaterialApp( + home: MyHome(), +) +``` + +Pindah ke halaman baru: + +```dart + +Get.to(NextScreen()); +``` + +Pindah ke halaman baru menggunakan nama. Baca detail lebih lanjut tentang penamaan route [disini](./documentation/id_ID/route_management.md#navigation-with-named-routes) + +```dart + +Get.toNamed('/details'); +``` + +Untuk menutup snackbar, dialog, bottomsheet, atau apapun yang normalnya anda tutup menggunakan Navigator.pop(context); + +```dart +Get.back(); +``` + +Untuk pergi ke halaman baru dan mencegah user kembali ke halaman sebelumnya (biasanya digunakan untuk SplashScreen, LoginScreen, dsb). + +```dart +Get.off(NextScreen()); +``` + +Untuk pergi ke halaman baru dan batalkan navigasi sebelumnya (berguna untuk shopping cart, polls, dan test). + +```dart +Get.offAll(NextScreen()); +``` + +Sadarkah bahwa anda tidak menggunakan context sama sekali untuk hal tersebut? Itu adalah keuntungan terbesar dalam menggunakan Get route management. Dengan ini, anda bisa mengeksekusi semua metode dari controller, tanpa ragu. + +### Detail lebih lanjut mengenai route management + +**Get bekerja dengan named route dan juga menawarkan kontrol dengan level yang lebih rendah untuk navigasimu! Dokumentasinya ada [disini](./documentation/id_ID/route_management.md)** + +## Dependency management + +Get memiliki dependency manager sederhana dan powerful yang memungkinkan anda mendapatkan kelas yang setara dengan Bloc atau Controller hanya dengan 1 baris kode, tanpa Provider context, tanpa inheritedWidget: + +```dart +Controller controller = Get.put(Controller()); +``` + +- Catatan: Jika anda menggunakan State Manager milik Get, harap untuk lebih memperhatikan [Bindings](./documentation/id_ID/dependency_management.md#bindings) api, yang mana akan membuat pengkoneksian View terhadap Controller jadi lebih mudah. + +Daripada menginstansiasi kelas anda didalam kelas yang anda gunakan, cukup lakukan hal itu di dalam Get instance, ini akan membuatnya tersedia di semua tempat di Aplikasimu. Jadi anda bisa menggunakan controller (atau class Bloc) secara normal. + +**Tips:** Dependency Management Get terpisah dari bagian lain dari package, jadi jika sebagai contoh aplikasi anda sudah menggunakan state manager (tidak peduli apapun itu), anda tidak perlu menulis ulang sama sekali, anda bisa menggunakan dependency injection tanpa masalah. + +```dart +controller.fetchApi(); +``` + +Bayangkan anda bernavigasi melewati route yang sangat banyak, dan anda membutuhkan data yang tertinggal didalam controller jauh di belakang route sebelumnya, anda akan butuh state manager dikombinasikan dengan Provider atau Get_it, benar kan? Tidak dengan Get. Anda hanya perlu meminta Get untuk "menemukan" controllernya, anda tidak perlu dependensi tambahan: + +```dart +Controller controller = Get.find(); +// Ya, terlihat seperti Sulap, Get akan menemukan controller anda, dan akan mengantarkannya ke lokasi anda. +// Anda bisa memiliki 1 juta controller terinisialisasi, Get akan selalu memberimu controller yang tepat. +``` + +Dan setelahnya anda bisa memperoleh data yang tertinggal sebelumnya: + +```dart +Text(controller.textFromApi); +``` + +### Detail lebih lanjut mengenai dependency management + +**Baca penjelasan lebih lanjut tentang dependency management [disini](./documentation/id_ID/dependency_management.md)** + +# Utilitas + +## Internasionalisasi + +### Translasi + +Translasi disimpan sebagai key-value map sederhana. +Untuk menambahkan translasi kustom, buat sebuah kelas dan extend `Translations`. + +```dart +import 'package:get/get.dart'; + +class Messages extends Translations { + @override + Map> get keys => { + 'en_US': { + 'hello': 'Hello World', + }, + 'id_ID': { + 'hello': 'Halo Dunia', + } + }; +} +``` + +#### Menggunakan Translasi + +Cukup tambahkan `.tr` setelah key yang disebutkan dan value nya akan diterjemahkan, menggunakan value awal dari `Get.locale` dan `Get.fallbackLocale`. + +```dart +Text('title'.tr); +``` + +### Lokalisasi + +Berikan parameter ke `GetMaterialApp` untuk mendefinisikan lokal dan translasi. + +```dart +return GetMaterialApp( + translations: Messages(), // gunakan translasi yang anda buat + locale: Locale('id', 'ID'), // translasi akan ditampilkan di lokal ini + fallbackLocale: Locale('en', 'US'), // berikan lokal penumpu untuk berjaga-jaga jika lokal yang tidak valid dipilih +); +``` + +#### Mengubah Lokal + +Panggil `Get.updateLocale(locale)` untuk memperbarui lokal. Setelahnya, translasi akan menggunakan lokal baru. + +```dart +var locale = Locale('en', 'US'); +Get.updateLocale(locale); +``` + +#### Lokal Sistem + +Untuk membaca lokal sistem, anda bisa menggunakan `Get.deviceLocale`. + +```dart +return GetMaterialApp( + locale: Get.deviceLocale, +); +``` + +## Mengubah Tema + +Harap untuk tidak menggunakan widget dengan level lebih tinggi daripada `GetMaterialApp` untuk memperbaruinya. Ini akan menyebabkan "duplicate keys". Banyak orang terbiasa menggunakan cara lama untuk membuat sebuah "ThemeProvider" widget hanya untuk mengubah tema aplikasi anda, dan ini tentu saja TIDAK diperlukan dengan **GetX™**. + +Anda bisa membuat tema kustom anda sendiri dan cukup menambahkannya kedalam `Get.changeTheme` tanpa boilerplate: + +```dart +Get.changeTheme(ThemeData.light()); +``` + +Jika anda ingin membuat sesuatu seperti tombol yang mengubah Tema ketika `onPressed`, anda bisa mengkombinasikan dua **GetX™** API: + +- API yang melakukan pengecekan terhadap tema gelap `Get.isDarkMode`. +- Dan API pengubah tema `Get.changeTheme`, anda cukup meletakannya didalam `onPressed`: + +```dart +Get.changeTheme(Get.isDarkMode? ThemeData.light(): ThemeData.dark()); +``` + +Ketika `.darkmode` aktif, ini akan mengubah aplikasi anda ke _light theme_, dan sebaliknya, jika _light theme_ sedang aktif, ini akan mengubah aplikasi anda ke _dark theme_. + +## GetConnect + +GetConnect adalah cara mudah untuk berkomunikasi dari backend ke frontend menggunakan http atau websocket. + +### Konfigurasi Default + +Anda bisa secara sederhana meng-extend GetConnect dan menggunakan GET/POST/PUT/DELETE/SOCKET untuk berkomunikasi dengan REST API atau Websocket anda. + +```dart +class UserProvider extends GetConnect { + // Get request + Future getUser(int id) => get('http://youapi/users/$id'); + // Post request + Future postUser(Map data) => post('http://youapi/users', body: data); + // Post request dengan File + Future> postCases(List image) { + final form = FormData({ + 'file': MultipartFile(image, filename: 'avatar.png'), + 'otherFile': MultipartFile(image, filename: 'cover.png'), + }); + return post('http://youapi/users/upload', form); + } + + GetSocket userMessages() { + return socket('https://yourapi/users/socket'); + } +} +``` + +### Konfigurasi Kustom + +GetConnect sangat bisa di disesuaikan, anda bisa mendefinisikan base URL, Response Modifier, Request Modifier, Authenticator, dan bahkan jumlah percobaan akses ulang (retry) yang mana akan mencoba meng-autentikasi dirinya sendiri, sebagai tambahan, anda juga bisa mendefinisikan dekoder standar yang akan mengubah seluruh request kedalam Model anda tanpa konfigurasi tambahan. + +```dart +class HomeProvider extends GetConnect { + @override + void onInit() { + // Semua request akan melewati jsonEncode, jadi, CasesModel.fromJson() + httpClient.defaultDecoder = CasesModel.fromJson; + httpClient.baseUrl = 'https://api.covid19api.com'; + // baseUrl = 'https://api.covid19api.com'; // Ini akan men-setting baseUrl ke + // Http dan websocket jika digunakan tanpa [httpClient] + + // Ini akan mengaitkan properti 'apikey' kedalam header dari semua request. + httpClient.addRequestModifier((request) { + request.headers['apikey'] = '12345678'; + return request; + }); + + // Bahkan jika server mengirim data dari negara "Brazil" + // itu tidak akan pernah ditampilkan ke user, karena anda menghapus + // data tersebut sebelum response, bahkan sebelum response diantarkan. + httpClient.addResponseModifier((request, response) { + CasesModel model = response.body; + if (model.countries.contains('Brazil')) { + model.countries.remove('Brazilll'); + } + }); + + httpClient.addAuthenticator((request) async { + final response = await get("http://yourapi/token"); + final token = response.body['token']; + // Sesuaikan header + request.headers['Authorization'] = "$token"; + return request; + }); + + // Authenticator akan dipanggil 3 kali jika + // HttpStatus == HttpStatus.unauthorized + httpClient.maxAuthRetries = 3; + } + } + + @override + Future> getCases(String path) => get(path); +} +``` + +## GetPage Middleware + +GetPage sekarang memiliki properti baru yang menerima list GetMiddleware dan menjalankannya dalam urutan spesifik. + +**Catatan**: Ketika GetPage memiliki middleware, seluruh child dari halaman tersebut akan secara otomatis memiliki middleware yang sama. + +### Prioritas + +Urutan dari Middleware yang akan dijalankan bisa diatur berdasarkan prioritas didalam GetMiddleware. + +```dart +final middlewares = [ + GetMiddleware(priority: 2), + GetMiddleware(priority: 5), + GetMiddleware(priority: 4), + GetMiddleware(priority: -8), +]; +``` + +middleware diatas akan dijalankan dengan urutan sebagai berikut **-8 => 2 => 4 => 5** + +### Redirect + +Fungsi ini akan terpanggil ketika halaman dari route yang dipanggil sedang dicari. RouteSettings diperlukan untuk mengatur tujuan dari fungsi redirect. Atau berikan null jika tidak ingin ada redirect. + +```dart +RouteSettings redirect(String route) { + final authService = Get.find(); + return authService.authed.value ? null : RouteSettings(name: '/login') +} +``` + +### OnPageCalled + +Fungsi ini akan terpanggil ketika halaman yang dituju dipanggil sebelum apapun dibuat, +anda bisa menggunakannya untuk mengubah sesuatu tentang halaman tersebut atau +berikan halaman baru. + +```dart +GetPage onPageCalled(GetPage page) { + final authService = Get.find(); + return page.copyWith(title: 'Welcome ${authService.UserName}'); +} +``` + +### OnBindingsStart + +Fungsi ini akan terpanggil tepat sebelum Binding ter-inisialisasi. +Disini anda bisa mengubah Binding untuk halaman yang dituju. + +```dart +List onBindingsStart(List bindings) { + final authService = Get.find(); + if (authService.isAdmin) { + bindings.add(AdminBinding()); + } + return bindings; +} +``` + +### OnPageBuildStart + +Fungsi ini akan terpanggil tepat setelah Binding ter-inisialisasi. +Disini anda bisa melakukan sesuatu sebelum halaman yang dituju dibuat. + +```dart +GetPageBuilder onPageBuildStart(GetPageBuilder page) { + print('bindings are ready'); + return page; +} +``` + +### OnPageBuilt + +Fungsi ini akan terpanggil tepat setelah fungsi `GetPage.page` terpanggil dan akan memberikan anda hasil dari fungsinya. Dan mengambil widget yang akan ditampilkan. + +### OnPageDispose + +Fungsi ini akan terpanggil tepat setelah semua objek yang berhubungan (Controller, Views, ...) ter-dispose dari halaman. + +## API Lanjutan Lainnya + +```dart +// memberikan argument dari halaman yang sedang ditampilkan +Get.arguments + +// memberikan nama dari route sebelumnya +Get.previousRoute + +// memberikan akses raw route, contoh: rawRoute.isFirst() +Get.rawRoute + +// memberikan akses terhadap Routing API dari GetObserver +Get.routing + +// cek apakah snackbar sedang tampil +Get.isSnackbarOpen + +// cek apakah dialog sedang tampil +Get.isDialogOpen + +// cek apakah bottomsheet sedang tampil +Get.isBottomSheetOpen + +// hapus satu route +Get.removeRoute() + +// kembali berturut-turut hingga predikat mereturn nilai true. +Get.until() + +// pergi ke halaman selanjutnya dan hapus semua route sebelumnya hingga predikat mereturn nilai true. +Get.offUntil() + +// pergi ke halaman selanjutnya menggunakan nama dan hapus semua route sebelumnya hingga predikat mereturn nilai true. +Get.offNamedUntil() + +// Cek di platform apa aplikasi sedang berjalan +GetPlatform.isAndroid +GetPlatform.isIOS +GetPlatform.isMacOS +GetPlatform.isWindows +GetPlatform.isLinux +GetPlatform.isFuchsia + +// Cek tipe perangkat +GetPlatform.isMobile +GetPlatform.isDesktop +// Semua platform didukung secara independen di web! +// Anda bisa mengetahui apakah anda menjalankannya didalam browser +// di Windows, iOS, OSX, Android, dsb. +GetPlatform.isWeb + + +// Sama dengan : MediaQuery.of(context).size.height, +// tapi immutable. +Get.height +Get.width + +// Memberikan konteks saat ini dari sebuah Navigator +Get.context + +// Memberikan konteks dari snackbar/dialog/bottomsheet di Gives the latar depan, dimanapun di kode anda +Get.contextOverlay + +// Catatan: metode berikut adalah sebuah perluasan konteks. Berhubung anda +// memiliki akses terhadap konteks dimanapun di UI anda, anda bisa menggunakannya dimanapun di kode UI + +// Jika anda memerlukan height/width yang bisa dirubah (seperti Desktop atau browser yang bisa di sesuaikan) anda akan memerlukan konteks +context.width +context.height + +// Memberikan anda kemampuan untuk mendefinisikan separuh layar, sepertiga, dan seterusnya. +// Berguna untuk aplikasi responsive. +// param dibagi dengan (double) optional - default: 1 +// param dikurangi dengan (double) optional - default: 0 +context.heightTransformer() +context.widthTransformer() + +/// Mirip seperti MediaQuery.of(context).size +context.mediaQuerySize() + +/// Mirip seperti MediaQuery.of(context).padding +context.mediaQueryPadding() + +/// Mirip seperti MediaQuery.of(context).viewPadding +context.mediaQueryViewPadding() + +/// Mirip seperti MediaQuery.of(context).viewInsets; +context.mediaQueryViewInsets() + +/// Mirip seperti MediaQuery.of(context).orientation; +context.orientation() + +/// Cek apakah perangkat sedang dalam mode lansekap +context.isLandscape() + +/// Cek apakah perangkat sedang dalam mode portrait +context.isPortrait() + +/// Mirip seperti MediaQuery.of(context).devicePixelRatio; +context.devicePixelRatio() + +/// Mirip seperti MediaQuery.of(context).textScaleFactor; +context.textScaleFactor() + +/// Dapatkan shortestSide dari layar +context.mediaQueryShortestSide() + +/// True jika layar lebih besar dari 800 +context.showNavbar() + +/// True jika shortestSide kurang dari 600p +context.isPhone() + +/// True jika shortestSide lebih besar dari 600p +context.isSmallTablet() + +/// True jika shortestSide lebih besar dari 720p +context.isLargeTablet() + +/// True jika perangkat adalah sebuah Tablet +context.isTablet() + +/// Memberikan sebuah value berdasarkan ukuran layar +/// dapat memberi value untuk: +/// watch: jika shortestSide lebih kecil dari 300 +/// mobile: jika shortestSide lebih kecil dari 600 +/// tablet: jika shortestSide lebih kecil dari 1200 +/// desktop: jika lebar lebih besar dari 1200 +context.responsiveValue() +``` + +### Pengaturan Global Opsional dan Konfigurasi Manual + +GetMaterialApp mengkonfigurasi semuanya untuk anda, namun jika anda ingin mengkonfigurasi Get secara manual. + +```dart +MaterialApp( + navigatorKey: Get.key, + navigatorObservers: [GetObserver()], +); +``` + +Anda juga bisa menggunakan Middleware anda sendiri melalui `GetObserver`, ini tidak akan mempengaruhi apapun. + +```dart +MaterialApp( + navigatorKey: Get.key, + navigatorObservers: [ + GetObserver(MiddleWare.observer) // Disini + ], +); +``` + +Anda bisa membuat _Pengaturan Global_ untuk `Get`. Cukup tambahkan `Get.config` kedalam kode anda sebelum berpindah ke route manapun. +Atau lakukan secara langsung di `GetMaterialApp` + +```dart +GetMaterialApp( + enableLog: true, + defaultTransition: Transition.fade, + opaqueRoute: Get.isOpaqueRouteDefault, + popGesture: Get.isPopGestureEnable, + transitionDuration: Get.defaultDurationTransition, + defaultGlobalState: Get.defaultGlobalState, +); + +Get.config( + enableLog = true, + defaultPopGesture = true, + defaultTransition = Transitions.cupertino +) +``` + +Anda bisa secara opsional me-redirect seluruh pesan logging dari `Get`. +Jika anda ingin menggunakan logging buatan anda sendiri, logging package favorit, +dan ingin meng-capture lognya: + +```dart +GetMaterialApp( + enableLog: true, + logWriterCallback: localLogWriter, +); + +void localLogWriter(String text, {bool isError = false}) { + // oper message ke logging package favorit anda disini + // harap dicatat bahwa meskipun enableLog: false, pesan log akan di-push dalam callback ini, + // anda dapat memeriksa flag-nya jika anda mau melalui GetConfig.isLogEnable +} + +``` + +### Local State Widgets + +Widget ini memungkinkan anda untuk mengelola satu nilai, dan menjaga state emphemeral dan lokal. +Kita memiliki rasa untuk Reactive dan Simple. +Contohnya, anda mungkin menggunakannya untuk men-toggle obscureText di sebuah `TextField`, mungkin membuat +Expandable Panel kustom, atau mungkin memodifikasi index saat ini dalam `BottomNavigationBar` sembari mengganti konten +dari body didalam `Scaffold` + +#### ValueBuilder + +Sebuah simplifikasi dari `StatefulWidget` yang berfungsi dengan sebuah callback `.setState` yang menerima value yang telah diperbarui. + +```dart +ValueBuilder( + initialValue: false, + builder: (value, updateFn) => Switch( + value: value, + onChanged: updateFn, // signaturenya sama! anda bisa menggunakan ( newValue ) => updateFn( newValue ) + ), + // jika anda perlu memanggil sesuatu diluar builder method. + onUpdate: (value) => print("Value updated: $value"), + onDispose: () => print("Widget unmounted"), +), +``` + +#### ObxValue + +Mirip seperti [`ValueBuilder`](#valuebuilder), tapi ini versi Reactive nya, anda bisa menaruh Rx instance (ingat .obs?) dan +akan ter-update secara otomatis... keren kan? + +```dart +ObxValue((data) => Switch( + value: data.value, + onChanged: data, // Rx memiliki sebuah _callable_ function! Anda bisa menggunakan (flag) => data.value = flag, + ), + false.obs, +), +``` + +## Tips berguna + +`.obs`ervables (juga dikenal sebagai _Rx_ Types) memiliki beragam metode dan operator internal. + +> Sangat umum untuk _percaya_ bahwa sebuah properti dengan `.obs` **ADALAH** nilai aktual... jangan salah! +> Kami menghindari Type declaration dari sebuah variabel, karena compiler Dart cukup pintar, dan kode nya +> terlihat lebih bersih, tapi: + +```dart +var message = 'Hello world'.obs; +print( 'Message "$message" has Type ${message.runtimeType}'); +``` + +Meskipun `message` _mengeluarkan output_ nilai String aktual, tipenya adalah **RxString**! + +Jadi, anda tidak bisa melakukan `message.substring( 0, 4 )`. +Anda perlu mengakses `value` aslinya didalam _observable_: +Cara yang paling "sering digunakan" adalah `.value`, tapi, tahukah anda bahwa anda juga bisa menggunakan... + +```dart +final name = 'GetX'.obs; +// hanya "memperbarui" stream, jika nilainya berbeda dari sebelumnya. +name.value = 'Hey'; + +// Seluruh properti Rx "bisa dipanggil" dan akan mereturn nilai baru. +// tapi cara ini tidak menerima `null`, UI-nya tidak akan rebuild. +name('Hello'); + +// ini seperti getter, mengeluarkan output 'Hello'. +name(); + +/// angka: + +final count = 0.obs; + +// Anda bisa menggunakan semua operasi non-mutable dari primitif num! +count + 1; + +// Hati hati! ini hanya valid jika `count` tidak final, melainkan var +count += 1; + +// Anda juga bisa melakukan komparasi antar nilai: +count > 2; + +/// boolean: + +final flag = false.obs; + +// bertukar nilai antara true/false +flag.toggle(); + + +/// semua tipe: + +// Atur `value` menjadi null. +flag.nil(); + +// Semua operasi toString(), toJson() dikirimkan ke `value` +print( count ); // memanggil `toString()` didalamnya untuk RxInt + +final abc = [0,1,2].obs; +// Mengkonversi nilai dari Array json, mengeluarkan output RxList +// Json didukung oleh semua tipe Rx! +print('json: ${jsonEncode(abc)}, type: ${abc.runtimeType}'); + +// RxMap, RxList dan RxSet adalah tipe Rx spesial, mereka meng-extends native type masing-masing. +// tapi anda bisa bekerja menggunakan List sebagai list biasa, meskipun reactive! +abc.add(12); // memasukkan 12 kedalam list, dan MEMPERBARUI stream. +abc[3]; // seperti List, membaca index ke 3. + + +// persamaan berfungsi dengan Rx dan value nya, namun hashCode nya selalu diambil dari value +final number = 12.obs; +print( number == 12 ); // mengeluarkan output: true + +/// Model Rx Kustom: + +// toJson(), toString() ditangguhkan ke child, jadi anda bisa mengimplementasi override pada mereka dan print() observable nya secara langsung + +class User { + String name, last; + int age; + User({this.name, this.last, this.age}); + + @override + String toString() => '$name $last, $age years old'; +} + +final user = User(name: 'John', last: 'Doe', age: 33).obs; + +// `user` memang "reaktif", tapi properti didalamnya TIDAK REAKTIF! +// Jadi, jika kita mengubah variabel didalamnya... +user.value.name = 'Roi'; +// Widget tidak akan rebuild!, +// `Rx` tidak mengetahui apapun ketika anda mengubah sesuatu didalam user. +// Jadi, untuk kelas kustom, kita perlu secara manual "memberi tahu" perubahannya. +user.refresh(); + +// atau kita bisa menggunakan `update()` method! +user.update((value){ + value.name='Roi'; +}); + +print( user ); +``` + +#### GetView + +Saya menyukai Widget ini, sangat simpel dan berguna! + +Adalah sebuah `const Stateless` Widget yang memiliki getter `controller` untuk `Controller` yang terdaftar, itu saja. + +```dart + class AwesomeController extends GetxController { + final String title = 'My Awesome View'; + } + + // SELALU ingat untuk memberikan `Type` yang anda gunakan untuk mendaftarkan controller anda! + class AwesomeView extends GetView { + @override + Widget build(BuildContext context) { + return Container( + padding: EdgeInsets.all(20), + child: Text(controller.title), // cukup panggil `controller.something` + ); + } + } +``` + +#### GetResponsiveView + +Extend widget ini untuk membuat responsive view. +widget ini mengandung properti `screen` yang memiliki semua +informasi tentang ukuran layar dan tipenya. + +##### Cara pakai + +Anda memiliki dua opsi untuk mem-buildnya. + +- dengan `builder` method yang anda return ke widget yang akan di-build. +- dengan metode `desktop`, `tablet`,`phone`, `watch`. method +spesifik akan dibuat ketika tipe layar cocok dengan method. +ketika layarnya adalah [ScreenType.Tablet] maka method `tablet` +akan di eksekusi dan seterusnya. +**Catatan:** Jika anda menggunakan metode ini, mohon atur properti `alwaysUseBuilder` ke `false` + +Dengan properti `settings` anda bisa mengatur batasan lebar untuk tipe layar. + +![example](https://github.com/SchabanBo/get_page_example/blob/master/docs/Example.gif?raw=true) +Code to this screen +[code](https://github.com/SchabanBo/get_page_example/blob/master/lib/pages/responsive_example/responsive_view.dart) + +#### GetWidget + +Kebanyakan orang tidak tahu untuk apa Widget ini, atau benar benar membingungkan penggunaannya. +Kasus penggunaannya sangat langka, namun sangat spesifik: Melakukan `cache` terhadap Controller. +Karena _cache_, tidak bisa dijadikan `const Stateless`. + +> Lalu, kapan anda harus men-"cache" sebuah Controller? + +Jika anda menggunakan, fitur "tidak terlalu umum" dari **GetX**: `Get.create()`. + +`Get.create(()=>Controller())` akan men-generate `Controller` baru setiap kali anda memanggil +`Get.find()`, + +Itulah dimana `GetWidget` bercahaya... karena anda bisa menggunakannya, sebagai contoh, +untuk menyimpan list dari sebuah Todo item. Jadi, jika widget ter-"rebuild", dia akan meyimpan controller yang sama. + +#### GetxService + +Kelas ini mirip seperti `GetxController`, dia berbagi lifecycle ( `onInit()`, `onReady()`, `onClose()`). +Tetapi tidak memiliki "logic" didalamnya. Dia hanya memberi tahu Sistem Dependency Injection **GetX**, bahwa subclass +ini **TIDAK BISA** dihapus dari memori. + +Jadi ini sangat berguna untuk memastikan "Service" anda selalu dapat dijangkau dan aktif dengan `Get.find()`. Seperti: +`ApiService`, `StorageService`, `CacheService`. + +```dart +Future main() async { + await initServices(); /// AWAIT SERVICES INITIALIZATION. + runApp(SomeApp()); +} + +/// Adalah gerakan yang cerdas untuk membuat Service anda menginisialisasi sebelum anda menjalankan aplikasi Flutter +/// seperti anda bisa mengontrol flow eksekusi (mungkin anda perlu memuat beberapa konfigurasi tema, +/// apiKey, bahasa yang ditentukan oleh user...) jadi, load SettingSerice sebelum menjalankan ApiService. +/// supaya GetMaterialApp() tidak perlu rebuild, dan mengambil nilainya secara langsung. +void initServices() async { + print('starting services ...'); + /// Disini adalah dimana anda meletakkan get_storage, hive, inisialisasi shared_pref. + /// atau koneksi moor, atau apapun yang sifatnya async. + await Get.putAsync(() => DbService().init()); + await Get.putAsync(SettingsService()).init(); + print('All services started...'); +} + +class DbService extends GetxService { + Future init() async { + print('$runtimeType delays 2 sec'); + await 2.delay(); + print('$runtimeType ready!'); + return this; + } +} + +class SettingsService extends GetxService { + void init() async { + print('$runtimeType delays 1 sec'); + await 1.delay(); + print('$runtimeType ready!'); + } +} + +``` + +The only way to actually delete a `GetxService`, is with `Get.reset()` which is like a +"Hot Reboot" of your app. So remember, if you need absolute persistence of a class instance during the +lifetime of your app, use `GetxService`. + +Satu-satunya cara untuk benar benar menghapus sebuah `GetxService`, adalah dengan `Get.reset()` dimana ini seperti +"Hot Reboot" dari aplikasi anda. Jadi ingat, jika anda butuh persistensi absolut dari sebuah instance kelas selama +masa hidup aplikasi anda, gunakan `GetxService`. + +# Breaking change dari 2.0 + +1- Tipe Rx: + +| Sebelum | Sesudah | +| ------- | ---------- | +| StringX | `RxString` | +| IntX | `RxInt` | +| MapX | `RxMap` | +| ListX | `RxList` | +| NumX | `RxNum` | +| DoubleX | `RxDouble` | + +RxController dan GetBuilder sekarang digabungkan, anda tidak lagi perlu mengingat kontroler mana yang ingin anda gunakan, cukup gunakan GetxController, ini akan bekerja untuk simple state management dan reactive juga. + +2- NamedRoutes +Sebelumnya: + +```dart +GetMaterialApp( + namedRoutes: { + '/': GetRoute(page: Home()), + } +) +``` + +Sekarang: + +```dart +GetMaterialApp( + getPages: [ + GetPage(name: '/', page: () => Home()), + ] +) +``` + +Mengapa berubah? +Seringkali, mungkin diperlukan untuk memutuskan halaman mana yang akan ditampilkan melalui sebuah parameter, atau login token, cara sebelumnya sangat tidak fleksibel dan tidak memungkinkan untuk melakukan hal ini. +Memasukkan data kedalam fungsi mengurangi konsumsi RAM secara signifikan, mengingat route tidak akan di alokasikan ke memori sejak aplikasi dimulai, dan ini memungkinkan kita melakukan ini: + +```dart + +GetStorage box = GetStorage(); + +GetMaterialApp( + getPages: [ + GetPage(name: '/', page:(){ + return box.hasData('token') ? Home() : Login(); + }) + ] +) +``` + +# Mengapa Getx? + +1- Seringkali setelah Flutter update, banyak package anda yang akan berhenti bekerja. Terkadang compilation error terjadi, error yang sering muncul dan belum ada jawabannya, dan developer perlu mengetahui dimana errornya berasal, mencari errornya, lalu kemudian mencoba membuka sebuah isu di repository yang bersangkutan, dan melihat apakah problemnya terselesaikan. Get memusatkan resource utama untuk development (State, dependency dan route management), memungkinkan anda untuk menambahkan satu package kedalam pubspec, dan mulai bekerja. Setelah Flutter update, satu-satunya hal yang anda perlu lakukan adalah memperbarui dependensi Get, dan kembali bekerja. Get juga menyelesaikan isu kompatibilitas. Berapa kali sebuah versi dari sebuah package tidak kompatibel dengan versi lainnya, karena yang satu menggunakan sebuah dependensi dalam satu versi, dan yang lain menggunakan versi lainnya? Ini juga bukan sebuah masalah menggunakan Get, yang mana semua berada di package yang sama dan kompatibel secara penuh. + +2- Flutter mudah digunakan, Flutter luar biasa, tetapi Flutter masih memiliki beberapa boilerplate yang mungkin tidak diinginkan untuk kebanyakan developer, seperti `Navigator.of(context).push(context builder [...]`. Get menyederhanakan proses development. Daripada menulis 8 baris kode hanya untuk memanggil route, anda bisa menggunakan: `Get.to(Home())` dan selesai, anda akan pergi ke halaman selanjutnya. URL web dinamis adalah hal yang sangat menyakitkan untuk dilakukan dengan Flutter saat ini, dan dengan GetX sangat sederhana. Mengelola state di Flutter, dan megelola dependensi juga suatu hal yang menghasilkan banyak diskusi, dengan ratusan jenis pattern di pub. Tetapi tidak ada yang semudah menambahkan ".obs" di akhir variabel anda, dan meletakkan widget didalam Obx, dan selesai, semua update terhadap variabel tersebut akan secara otomatis terupdate di layar. + +3- Meringankan tanpa mengkhawatirkan performa. Performa Flutter sudah luar biasa, tetapi bayangkan anda menggunakan state manager, dan sebuah locator untuk mendistribusikan bloc/store/controller dsb, kelas. Anda perlu secara manual memanggil pengecualian terhadap dependensi ketika anda tidak membutuhkannya. Namun apakah anda pernah terfikirkan ketika simpelnya, anda menggunakan controller, dan tidak lagi digunakan oleh siapapun, akan dihapus dari memori? Itu yang GetX lakukan. Dengan SmartManagement, semua yang tidak digunakan akan dihapus dari memori, dan anda tidak perlu khawatir tentang apapun selain programming. Anda akan terjamin bahwa anda mengkonsumsi resource minimum yang diperlukan, bahkan tanpa harus membuat logic untuk hal ini. + +4- Actual decoupling. Anda mungkin pernah mendengar konsep "pisahkan view dari business logic". Ini bukanlah sebuah keanehan dari BLoC, MVC, MVVM, dan standard lainnya dalam market yang memiliki konsep ini. Namun, konsep ini terkadang termitigasi di Flutter karena penggunaan konteks. +Jika anda memerlukan konteks untuk menemukan InheritedWidget, anda membutuhkannya di view, atau mengirim konteks melalui parameter. Saya menemukan bahwa solusi ini sangat jelek, dan untuk bekerja dalam tim kami harus selalu memiliki sebuah ketergantungan pada business logic di dalam view. GetX adalah cara yang tidak lazim dengan metode standard, dan sementara itu tidak benar-benar secara penuh melarang penggunaan StatefulWidgets, InitState, dsb., ini selalu memiliki metode yang mirip dan bisa lebih bersih. Controller memiliki life cycle, dan ketika anda perlu membuat APIREST request sebagai contoh, anda tidak bergantung pada apapun didalam view. Anda bisa menggunakan onInit untuk menginisiasi pemanggilan http dan ketika datanya sampai, variabel akan dipopulasikan. GetX juga secara penuh reaktif (serius, dan bekerja dibawah stream), sekali items terisi, semua widget yang menggunakan variabel itu akan secara otomatis diperbarui didalam view. Ini memungkinkan orang orang dengan keahlian di bagian UI untuk bekerja hanya dengan widget, dan tidak perlu mengirim apapun ke business logic selain user event (seperti meng-klik sebuah tombol), sementara orang yang bekerja dengan business logic akan bebas membuat dan melakukan test terhadap business logic secara terpisah. + +Library ini akan terus diperbarui dan mengimplementasikan fitur baru. Jangan ragu untuk menawarkan PR dan berkontribusi ke mereka. + +# Komunitas + +## Channel Komunitas + +GetX memiliki komunitas yang sangat aktif dan membantu. Jika anda memiliki pertanyaan, atau membutuhkan bantuan mengenai penggunaan framework ini, bergabunglah dengan kanal komunitas kami, pertanyaan anda akan dijawab lebih cepat, dan akan menjadi tempat yang paling cocok. Repositori ini eksklusif untuk pembukaan isu dan permintaan resource, tapi jangan ragu untuk menjadi bagian dari Komunitas GetX. + +| **Slack** | **Discord** | **Telegram** | +| :-------------------------------------------------------------------------------------------------------------------------- | :-------------------------------------------------------------------------------------------------------------------------- | :-------------------------------------------------------------------------------------------------------------------- | +| [![Get on Slack](https://img.shields.io/badge/slack-join-orange.svg)](https://communityinviter.com/apps/getxworkspace/getx) | [![Discord Shield](https://img.shields.io/discord/722900883784073290.svg?logo=discord)](https://discord.com/invite/9Hpt99N) | [![Telegram](https://img.shields.io/badge/chat-on%20Telegram-blue.svg)](https://t.me/joinchat/PhdbJRmsZNpAqSLJL6bH7g) | + +## Cara berkontribusi + +_Ingin berkontribusi kedalam proyek? Kami akan sangat bangga untuk menyorot anda sebagai salah satu dari kolaborator kami. Ini adalah beberapa point dimana anda bisa berkontribusi dan membuat Get (dan Flutter) jadi lebih baik_ + +- Membantu menerjemahkan readme ke dalam bahasa lain. +- Menambahkan dokumentasi ke dalam readme (banyak fungsi dari Get yang masih belum terdokumentasi). +- Menulis artikel atau membuat video mengajarkan tentang penggunaan Get (akan dimasukkan kedalam readme dan Wiki kami di masa yang akan datang). +- Menawarkan PR untuk kode/test. +- Menambahkan fungsi baru. + +Kontribusi dalam bentuk apapun dipersilahkan! + +## Artikel dan Video + +- [Dynamic Themes in 3 lines using GetX™](https://medium.com/swlh/flutter-dynamic-themes-in-3-lines-c3b375f292e3) - Tutorial oleh [Rod Brown](https://github.com/RodBr). +- [Complete GetX™ Navigation](https://www.youtube.com/watch?v=RaqPIoJSTtI) - Route management video oleh Amateur Coder. +- [Complete GetX State Management](https://www.youtube.com/watch?v=CNpXbeI_slw) - State management video oleh Amateur Coder. +- [GetX™ Other Features](https://youtu.be/ttQtlX_Q0eU) - Utils, storage, bindings and other features video oleh Amateur Coder. +- [Firestore User with GetX | Todo App](https://www.youtube.com/watch?v=BiV0DcXgk58) - Video oleh Amateur Coder. +- [Firebase Auth with GetX | Todo App](https://www.youtube.com/watch?v=-H-T_BSgfOE) - Video oleh Amateur Coder. +- [The Flutter GetX™ Ecosystem ~ State Management](https://medium.com/flutter-community/the-flutter-getx-ecosystem-state-management-881c7235511d) - State management oleh [Aachman Garg](https://github.com/imaachman). +- [The Flutter GetX™ Ecosystem ~ Dependency Injection](https://medium.com/flutter-community/the-flutter-getx-ecosystem-dependency-injection-8e763d0ec6b9) - Dependency Injection oleh [Aachman Garg](https://github.com/imaachman). +- [GetX, the all-in-one Flutter package](https://www.youtube.com/watch?v=IYQgtu9TM74) - A brief tutorial covering State Management and Navigation oleh Thad Carnevalli. +- [Build a To-do List App from scratch using Flutter and GetX](https://www.youtube.com/watch?v=EcnqFasHf18) - UI + State Management + Storage video oleh Thad Carnevalli. +- [GetX Flutter Firebase Auth Example](https://medium.com/@jeffmcmorris/getx-flutter-firebase-auth-example-b383c1dd1de2) - Article oleh Jeff McMorris. +- [Flutter State Management with GetX – Complete App](https://www.appwithflutter.com/flutter-state-management-with-getx/) - oleh App With Flutter. +- [Flutter Routing with Animation using Get Package](https://www.appwithflutter.com/flutter-routing-using-get-package/) - oleh App With Flutter. diff --git a/siro_rider/packages/get/README.ja-JP.md b/siro_rider/packages/get/README.ja-JP.md new file mode 100644 index 0000000..5f77d85 --- /dev/null +++ b/siro_rider/packages/get/README.ja-JP.md @@ -0,0 +1,1256 @@ +![](https://raw.githubusercontent.com/jonataslaw/getx-community/master/get.png) + +[![pub package](https://img.shields.io/pub/v/get.svg?label=get&color=blue)](https://pub.dev/packages/get) +[![popularity](https://badges.bar/get/popularity)](https://pub.dev/packages/sentry/score) +[![likes](https://badges.bar/get/likes)](https://pub.dev/packages/get/score) +[![pub points](https://badges.bar/get/pub%20points)](https://pub.dev/packages/get/score) +![building](https://github.com/jonataslaw/get/workflows/build/badge.svg) +[![style: effective dart](https://img.shields.io/badge/style-effective_dart-40c4ff.svg)](https://pub.dev/packages/effective_dart) +[![Discord Shield](https://img.shields.io/discord/722900883784073290.svg?logo=discord)](https://discord.com/invite/9Hpt99N) +[![Get on Slack](https://img.shields.io/badge/slack-join-orange.svg)](https://communityinviter.com/apps/getxworkspace/getx) +[![Telegram](https://img.shields.io/badge/chat-on%20Telegram-blue.svg)](https://t.me/joinchat/PhdbJRmsZNpAqSLJL6bH7g) + +Awesome Flutter + +Buy Me A Coffee + +![](https://raw.githubusercontent.com/jonataslaw/getx-community/master/getx.png) + + +
+ +**言語** + + +[![英語](https://img.shields.io/badge/Language-English-blueviolet?style=for-the-badge)](README.md) +[![ベトナム語](https://img.shields.io/badge/Language-Vietnamese-blueviolet?style=for-the-badge)](README-vi.md) +[![インドネシア語](https://img.shields.io/badge/Language-Indonesian-blueviolet?style=for-the-badge)](README.id-ID.md) +[![ウルドゥー語](https://img.shields.io/badge/Language-Urdu-blueviolet?style=for-the-badge)](README.ur-PK.md) +[![中国語](https://img.shields.io/badge/Language-Chinese-blueviolet?style=for-the-badge)](README.zh-cn.md) +[![ポルトガル語](https://img.shields.io/badge/Language-Portuguese-blueviolet?style=for-the-badge)](README.pt-br.md) +[![スペイン語](https://img.shields.io/badge/Language-Spanish-blueviolet?style=for-the-badge)](README-es.md) +[![ロシア語](https://img.shields.io/badge/Language-Russian-blueviolet?style=for-the-badge)](README.ru.md) +[![ポーランド語](https://img.shields.io/badge/Language-Polish-blueviolet?style=for-the-badge)](README.pl.md) +[![韓国語](https://img.shields.io/badge/Language-Korean-blueviolet?style=for-the-badge)](README.ko-kr.md) +[![フランス語](https://img.shields.io/badge/Language-French-blueviolet?style=for-the-badge)](README-fr.md) +[![日本語](https://img.shields.io/badge/Language-Japanese-blueviolet?style=for-the-badge)](README-ja.md) + +
+ +- [Getとは](#Getとは) +- [インストール方法](#インストール方法) +- [GetXによるカウンターアプリ](#GetXによるカウンターアプリ) +- [三本柱](#三本柱) + - [状態管理](#状態管理) + - [リアクティブな状態管理](#リアクティブな状態管理) + - [状態管理に関する詳細ドキュメント](#状態管理に関する詳細ドキュメント) + - [Route管理](#Route管理) + - [Route管理に関する詳細ドキュメント](#Route管理に関する詳細ドキュメント) + - [依存オブジェクト管理](#依存オブジェクト管理) + - [依存オブジェクト管理に関する詳細ドキュメント](#依存オブジェクト管理に関する詳細ドキュメント) +- [ユーティリティ](#ユーティリティ) + - [多言語対応](#多言語対応) + - [翻訳ファイル](#翻訳ファイル) + - [翻訳ファイルの利用](#翻訳ファイルの利用) + - [ロケール](#ロケール) + - [ロケールの変更](#ロケールの変更) + - [システムのロケールを読み込む](#システムのロケールを読み込む) + - [Themeの変更](#Themeの変更) + - [GetConnect](#getconnect) + - [デフォルト設定](#デフォルト設定) + - [カスタム設定](#カスタム設定) + - [GetPageにミドルウェアを設定](#GetPageにミドルウェアを設定) + - [実行優先度](#実行優先度) + - [redirect](#redirect) + - [onPageCalled](#onpagecalled) + - [onBindingsStart](#onbindingsstart) + - [onPageBuildStart](#onpagebuildstart) + - [onPageBuilt](#onpagebuilt) + - [onPageDispose](#onpagedispose) + - [その他API](#その他API) + - [オプションのグローバル設定と手動設定](#オプションのグローバル設定と手動設定) + - [ローカルステートWidget](#ローカルステートWidget) + - [ValueBuilder](#valuebuilder) + - [ObxValue](#obxvalue) + - [お役立ちTIPS](#お役立ちTIPS) + - [StateMixin](#statemixin) + - [GetView](#getview) + - [GetResponsiveView](#getresponsiveview) + - [使い方](#使い方]) + - [GetWidget](#getwidget) + - [GetxService](#getxservice) + - [テストの実行](#テストの実行) + - [mockitoやmocktailを使う場合](#mockitoやmocktailを使う場合) + - [Get.reset()](#Get.reset()) + - [Get.testMode](#Get.testMode) +- [バージョン2.0からの破壊的変更](#バージョン2.0からの破壊的変更) +- [なぜGetXなのか](#なぜGetXなのか) +- [コミュニティ](#コミュニティ) + - [コミュニティチャンネル](#コミュニティチャンネル) + - [コントリビュート方法](#コントリビュート方法) + - [GetXに関する記事と動画](#GetXに関する記事と動画) + +# Getとは + +- GetXはFlutterのための超軽量でパワフルなソリューションです。高パフォーマンスな状態管理機能、インテリジェントな依存オブジェクト管理機能、そしてRoute管理機能の三本柱を軽量かつ実用的な形で組み合わせています。 + +- GetXは3つの基本原則を念頭に開発されています。 **【生産性、パフォーマンス、コードの分離性】** これらはライブラリ内のすべてのリソースに優先適用されている原則です。 + + - **パフォーマンス:** GetXは高いパフォーマンスと最小限のリソース消費を目標にしています。GetXはでは Stream および ChangeNotifier を利用しなくて済みます。 + + - **生産性:** GetXはシンプルで使い心地のいいシンタックスを採用しています。あなたの実現したい機能がどんなものであれ、GetXを使えばより簡単に実現できる方法が見つかるでしょう。開発にかかる時間を短縮し、あなたのアプリケーションのパフォーマンスを最大限引き出してくれます。 + + 開発者はメモリリソースの管理に気を配るのが常です。しかしGetXでは、リソースが使用されていないときはメモリから削除されるのがデフォルト動作のため、過度に気にかける必要はありません。(逆にメモリに残しておきたい場合は、依存オブジェクトをインスタンス化するメソッドを使う際に「permanent: true」と宣言してください)これにより時間が節約できますし、不要な依存オブジェクトがメモリ上に残るリスクも少なくなります。メモリへの読み込みについてもデフォルトは遅延読み込みであり、使用するときに初めてメモリ上に読み込まれます。 + + - **コードの分離性:** GetXを使うと、ビュー、プレゼンテーションロジック、ビジネスロジック、依存オブジェクトの注入、およびナビゲーション周りのコードを書き分けやすくなります。Routeのナビゲーションにはcontextを必要としないため、Widgetツリーに依存することはありません。ロジックについてもInheritedWidget経由でController/BLoCにアクセスする際のcontextは必要ありません。プレゼンテーションロジックとビジネスロジックをUIクラスから完全に切り離すことができます。また、Controller/モデル/BLoCのクラスを、`MultiProvider`を使ってWidgetツリーに注入する必要もありません。GetXでは独自の依存オブジェクト注入機能を使用し、ビュークラスからビューとは無関係なコードをなくすことができるのです。 + + GetXを使うことでアプリケーションの各機能がどこにあるのかがわかりやすくなり、自然と見やすいコードになります。メンテナンスが容易になるだけでなく、それまでのFlutterでは考えられなかったモジュール共有が簡単に実現できるようになりました。 + BLoCはこの分野におけるFlutterの出発点と言えるものでしたが、GetXはこれを正統進化させており、ビジネスロジックのみならずプレゼンテーションロジックも分離することができます。そのほかデータレイヤーはもちろん、依存オブジェクトやRouteの注入に関するコードも。どこに何が配置されているのか全体の見通しがしやすくなり、Hello Worldを表示させるかのように簡単にアプリの機能を利用できるようになるでしょう。 + Flutterアプリを作るならGetXは最も簡単で実用的、かつスケーラブルなソリューションです。強力なエコシステムも存在があるため、初心者にはわかりやすさ、プロには正確性を提供することができます。そしてFlutter SDKにはない幅広い種類のAPIを提供し、セキュアで安定的な環境を構築します。 + +- GetXは肥大化したライブラリではありません。何も気にせずすぐに開発を始められるよう多数の機能を標準で備えていますが、それぞれの機能は個別にコンテナに入っており、使用してはじめて起動します。状態管理機能しか利用していない場合はその機能だけがコンパイルされます。Route管理機能だけを利用していれば、状態管理機能がコンパイルされることはありません。 + +- GetXには巨大なエコシステム、コミュニティ、コラボレーターの存在があるため、Flutterが存在する限りメンテナンスされ続けます。またGetXもFlutterと同様にAndroid、iOS、Web、Mac、Linux、Windows、そしてあなたのサーバー上で、単一のコードから実行することができます。 + +**[Get Server](https://github.com/jonataslaw/get_server)を使うことで、フロントエンドで作成したコードをバックエンドで再利用することが可能です。** + +**さらに、[Get CLI](https://github.com/jonataslaw/get_cli)を使えば、サーバー側でもフロントエンド側でも開発プロセス全体を自動化することができます。** + +**また、生産性をさらに高めるためのツールとして、[VSCode用の拡張機能](https://marketplace.visualstudio.com/items?itemName=get-snippets.get-snippets) と [Android Studio/Intellij用の拡張機能](https://plugins.jetbrains.com/plugin/14975-getx-snippets)があります。** + +# インストール方法 + +Getパッケージを pubspec.yaml に追加します: + +```yaml +dependencies: + get: +``` + +使用するときはこのようにインポートしてください: + +```dart +import 'package:get/get.dart'; +``` + +# GetXによるカウンターアプリ + +Flutterで新規プロジェクトを作成する際に表示されるカウンターアプリは、コメントを含めると100行以上あります。Getの実力を示すため、このカウンターアプリを可読性を重視した形で、コメントを含めてわずか26行のコードで作成する方法を紹介します。 + +- ステップ1: + MaterialAppの前に「Get」を足して、GetMaterialAppにします。 + +```dart +void main() => runApp(GetMaterialApp(home: Home())); +``` + +- 注1: GetMaterialAppはFlutterのMaterialAppに手を加えたものではありません。MaterialAppをchildに持ち、諸々の追加設定をしてくれるWidgetに過ぎません。この設定は手動でも可能ですが、その必要はありません。GetMaterialAppは、Routeの作成・注入、言語翻訳の注入など、ナビゲーションに必要なものをすべて注入してくれます。Getを状態管理や依存オブジェクト管理に限定して使用する場合は、GetMaterialAppを使用する必要はありません。GetMaterialAppは、Route、SnackBar、多言語対応、BottomSheet、Dialog、contextなしの高レベルAPIを利用する場合に必要です。 +- 注2: このステップは、Route管理機能(`Get.to()`や`Get.back()`など)を使用しない場合は、必要ありません。 + +- ステップ2: + ビジネスロジッククラスを作成し、そこに必要な変数、メソッド、コントローラをすべて配置します。 + 変数に ".obs" を付け足すことで、その変数の値の変化を監視することが可能になります。 + +```dart +class Controller extends GetxController{ + var count = 0.obs; + increment() => count++; +} +``` + +- ステップ3: + ビューを作成します。StatelessWidgetを使用することでRAMが節約できます。GetではStatefulWidgetを使用する必要がなくなるかもしれません。 + +```dart +class Home extends StatelessWidget { + + @override + Widget build(context) { + + // Get.put()を使ってクラスをインスタンス化することですべての子Routeで利用できるようになります。 + final Controller c = Get.put(Controller()); + + return Scaffold( + // countが変わるたびにTextを更新するにはObx(()=>)を使ってください。 + appBar: AppBar(title: Obx(() => Text("Clicks: ${c.count}"))), + + // 8行使っていたNavigator.pushの代わりに短い Get.to()を使ってください。context不要です。 + body: Center(child: ElevatedButton( + child: Text("Go to Other"), onPressed: () => Get.to(Other()))), + floatingActionButton: + FloatingActionButton(child: Icon(Icons.add), onPressed: c.increment)); + } +} + +class Other extends StatelessWidget { + // 他のページで使われているコントローラーを見つけてきてくれます。 + final Controller c = Get.find(); + + @override + Widget build(context){ + // 最新のcount変数の値にアクセス + return Scaffold(body: Center(child: Text("${c.count}"))); + } +} +``` + +Result: + +![](https://raw.githubusercontent.com/jonataslaw/getx-community/master/counter-app-gif.gif) + +これはシンプルな例ですが、すでにGetがいかに強力であるかがわかると思います。プロジェクトが大きければ大きいほど、この差はもっと開くでしょう。 + +Getはチームでの作業を想定して設計されていますが、個人開発者の仕事もシンプルにしてくれます。 + +パフォーマンスを落とさず納期までにすべて納品。Getはすべての人に向いているわけではありませんが、このフレーズにぴんと来た人には確実に向いています! + +# 三本柱 + +## 状態管理 + +Getの状態管理には、非リアクティブ(GetBuilder)と、リアクティブ(GetX/Obx)の2つのアプローチがあります。 + +### リアクティブな状態管理 + +リアクティブプログラミングは複雑であると言われ、多くの人に敬遠されています。GetXは、リアクティブプログラミングをシンプルなものに変えます: + +* StreamControllerを作る必要はありません。 +* 変数ごとにStreamBuilderをセットする必要はありません。 +* 状態ごとにクラスを作る必要はありません。 +* 初期値のためにgetを準備する必要はありません。 +- コードの自動生成をする必要がありません。 + +GetにおけるリアクティブプログラミングはsetStateと同じように簡単です。 + +例えば、名前の変数があって、それを変更するたびに、その名前を使っているすべてのWidgetを自動で更新したい場合。 + +```dart +var name = 'Jonatas Borges'; +``` + +このnameをObservable(監視可能)にするには, ".obs"を値の末尾に付けるだけです。 + +```dart +var name = 'Jonatas Borges'.obs; +``` + +UIでその値を表示し、値が変わるたびに内容を更新したい場合は次のようにします。 + +```dart +Obx(() => Text("${controller.name}")); +``` + +以上です。こんなに簡単なんですよ。 + +### 状態管理に関する詳細ドキュメント + +**状態管理に関するより詳細な説明を知りたい方は[こちらの日本語ドキュメント](./documentation/ja_JP/state_management.md)をご覧ください。多くの事例や、非リアクティブな状態管理とリアクティブな状態管理の違いについても説明されています。** + +GetXパワーがもたらす利点をより理解していただけると思います。 + +## Route管理 + +GetXはcontextなしでRoute/SnackBar/Dialog/BottomSheetを使用することができます。具体的に見ていきましょう。 + +いつものMaterialAppの前に「Get」を付け足して、GetMaterialAppにしましょう。 + +```dart +GetMaterialApp( // MaterialApp の前に Get + home: MyHome(), +) +``` + +新しいRouteに画面遷移するにはこのシンタックス。 + +```dart +Get.to(NextScreen()); +``` + +名前付きRouteに画面遷移するにはこのシンタックス。名前付きRouteの詳細は[こちらの日本語ドキュメント](./documentation/ja_JP/route_management.md#navigation-with-named-routes) + +```dart +Get.toNamed('/details'); +``` + +SnackBar、Dialog、BottomSheetなど、Navigator.pop(context)で閉じられるRouteはこれで閉じます。 + +```dart +Get.back(); +``` + +次の画面に移動した後、前の画面に戻れないようにする場合(スプラッシュスクリーンやログイン画面など)はこちら。 + +```dart +Get.off(NextScreen()); +``` + +次の画面に進み、前のRouteをすべてキャンセルする場合(ショッピングカート、アンケート、テストなど)はこちら。 + +```dart +Get.offAll(NextScreen()); +``` + +以上、contextを一度も使わなかったことに気付きましたか?これがGetでRoute管理を行う最大のメリットのひとつです。contextを使わないので、たとえばcontrollerクラスの中でも、これらのメソッドを実行することができます。 + +### Route管理に関する詳細ドキュメント + +**Getは名前付きRouteでも動作し、Routeの下位レベルの制御も可能です。詳細なドキュメントは[こちらの日本語ドキュメント](./documentation/ja_JP/route_management.md)にあります。** + +## 依存オブジェクト管理 + +Getにはシンプルで強力な依存オブジェクト注入機能があります。わずか1行のコードで、Provider contextやinheritedWidgetも使わず、BLoCやControllerのようなクラスのインスタンスを取得することができます。 + +```dart +Controller controller = Get.put(Controller()); // controller = Controller() とする代わりに +``` + +- 注: Getの状態管理機能を使用している場合は、Bindings APIにもご注目を。BindingsはビューとControllerを結びつけるのをより便利にしてくれます。 + +一つのクラスの中でControllerクラスをインスタンス化するのではなく、Getインスタンスの中でインスタンス化することで、アプリ全体でControllerが利用できるようになります。 + +**ヒント:** Getの依存オブジェクト注入機能の部分は、パッケージ全体の中でも他の部分と切り離されているので、たとえば、あなたのアプリがすでに状態管理機能を一部で使用していたとしても、それらを書き直す必要はなく、この依存オブジェクト注入機能をそのまま使用することができます。 + +```dart +controller.fetchApi(); +``` + +色々なRouteを行き来した後に、あるControllerクラスのデータにアクセスする必要が生じたとしましょう。ProviderやGet_itなら再びそのクラスに依存オブジェクトを注入する必要がありますよね?Getの場合は違います。Getでは「find」と依頼するだけで、追加の依存オブジェクトの注入は必要ありません。 + +```dart +Controller controller = Get.find(); +//マジックみたいですね。Getは正しいcontrollerをきちんと探してきてくれますよ。100万のcontrollerのインスタンスがあっても、Getは必ず正しいcontrollerを探し当てます。 +``` + +そして、findで取得したコントローラーのデータをこのように呼び出すことができます。 + +```dart +Text(controller.textFromApi); +``` + +### 依存オブジェクト管理に関する詳細ドキュメント + +**依存オブジェクト管理に関するより詳細な説明は[こちらの日本語ドキュメント](./documentation/ja_JP/dependency_management.md)をご覧ください。** + +# ユーティリティ + +## 多言語対応 + +### 翻訳ファイル + +翻訳ファイルはシンプルなキーと値のMapとして保持されます。 +翻訳を追加するには、クラスを作成して `Translations` を継承します。 + +```dart +import 'package:get/get.dart'; + +class Messages extends Translations { + @override + Map> get keys => { + 'en_US': { + 'hello': 'Hello World', + }, + 'de_DE': { + 'hello': 'Hallo Welt', + } + }; +} +``` + +#### 翻訳ファイルの利用 + +指定されたキーに `.tr` (translateのtr)を追加するだけで、`Get.locale` と `Get.fallbackLocale` の現在の値をに沿って適切な言語に翻訳されます。 + +```dart +Text('title'.tr); +``` + +#### 単数系と複数形に対応 + +```dart +var products = []; +Text('singularKey'.trPlural('pluralKey', products.length, Args)); +``` + +#### パラメーターに対応 + +```dart +import 'package:get/get.dart'; + + +Map> get keys => { + 'en_US': { + 'logged_in': 'logged in as @name with email @email', + }, + 'es_ES': { + 'logged_in': 'iniciado sesión como @name con e-mail @email', + } +}; + +Text('logged_in'.trParams({ + 'name': 'Jhon', + 'email': 'jhon@example.com' + })); +``` + +### ロケール + +ロケールと翻訳を定義するため、`GetMaterialApp`にパラメータを渡します。 + +```dart +return GetMaterialApp( + translations: Messages(), // Translationsを継承したクラスのインスタンス + locale: Locale('en', 'US'), // このロケール設定に沿って翻訳が表示される + fallbackLocale: Locale('en', 'UK'), // 無効なロケールだったときのフォールバックを指定 +); +``` + +#### ロケールの変更 + +ロケールを変更するには、`Get.updateLocale(locale)`を呼び出します。翻訳は新しいロケールに沿ってなされます。 + +```dart +var locale = Locale('en', 'US'); +Get.updateLocale(locale); +``` + +#### システムのロケールを読み込む + +システムのロケールを読み込むには、`Get.deviceLocale`を使用します。 + +```dart +return GetMaterialApp( + locale: Get.deviceLocale, +); +``` + +## Themeの変更 + +`GetMaterialApp`より上位のWidgetを使ってThemeを変更しないでください。Keyの重複を引き起こす可能性があります。アプリのThemeを変更するためには「ThemeProvider」Widgetを作成するという前時代的なアプローチが採られることが多いですが、**GetX™**ではこのようなことは必要ありません。 + +カスタムのThemeDataを作成したら、それを`Get.changeTheme`内に追加するだけです。 + +```dart +Get.changeTheme(ThemeData.light()); +``` + +もし、`onTap`でThemeを変更するボタンを作りたいのであれば、以下の2つの**GetX™** APIを組み合わせることができます。 + +- Dark Theme が使われているかどうかをチェックするAPI +- Theme を変えるAPI(ボタンの`onPressed`の中に設置できます) + +```dart +Get.changeTheme(Get.isDarkMode? ThemeData.light(): ThemeData.dark()); +``` + +Darkモードが有効であれば、_light theme_に切り替わり、Lightモードが有効なら、_dark theme_に切り替わります。 + +## GetConnect + +GetConnect は、http または websocket を使用してバックエンドとフロントエンド間の通信を行う機能です。 + +### デフォルト設定 + +GetConnectを拡張することで、GET/POST/PUT/DELETE/SOCKETメソッドを使用して、Rest APIやウェブソケットと通信することができます。 + +```dart +class UserProvider extends GetConnect { + // Get リクエスト + Future getUser(int id) => get('http://youapi/users/$id'); + // Post リクエスト + Future postUser(Map data) => post('http://youapi/users', body: data); + // File付き Post リクエスト + Future> postCases(List image) { + final form = FormData({ + 'file': MultipartFile(image, filename: 'avatar.png'), + 'otherFile': MultipartFile(image, filename: 'cover.png'), + }); + return post('http://youapi/users/upload', form); + } + + GetSocket userMessages() { + return socket('https://yourapi/users/socket'); + } +} +``` + +### カスタム設定 + +GetConnect は高度なカスタマイズが可能です。ベースUrlの定義はもちろん、リクエストヘッダーを足したり、レスポンスボディに変更を加えたり、認証情報を追加したり、認証回数の制限を設けたりすることができるほか、リクエストをModelに変換するデコーダを定義することもできます。 + +```dart +class HomeProvider extends GetConnect { + @override + void onInit() { + // デフォルトデコーダーをセット + httpClient.defaultDecoder = CasesModel.fromJson; + httpClient.baseUrl = 'https://api.covid19api.com'; + // baseUrlをセット + + // リクエストヘッダーに 'apikey' プロパティを付け足しています。 + httpClient.addRequestModifier((request) { + request.headers['apikey'] = '12345678'; + return request; + }); + + // サーバーが"Brazil"を含むデータを送ってきてもユーザーに表示されることはありません。 + // レスポンスがUIレイヤーに届けられる前にデータが取り除かれているからです。 + httpClient.addResponseModifier((request, response) { + CasesModel model = response.body; + if (model.countries.contains('Brazil')) { + model.countries.remove('Brazilll'); + } + }); + + httpClient.addAuthenticator((request) async { + final response = await get("http://yourapi/token"); + final token = response.body['token']; + // ヘッダーをセット + request.headers['Authorization'] = "$token"; + return request; + }); + + // HttpStatus が HttpStatus.unauthorized である限り、 + // 3回まで認証が試みられます。 + httpClient.maxAuthRetries = 3; + } + } + + @override + Future> getCases(String path) => get(path); +} +``` + +## GetPageにミドルウェアを設定 + +GetPageに新しいプロパティが追加され、GetMiddleWareのListを設定することができるようになりました。GetMiddleWareは設定した任意の順序で実行されます。 + +**注**: GetPageにミドルウェアを設定すると、そのページの子ページはすべて同じミドルウェアを自動的に持つことになります。 + +### 実行優先度 + +GetMiddlewareに設定したpriority(優先度)の若い順にミドルウェアが実行されます。 + +```dart +final middlewares = [ + GetMiddleware(priority: 2), + GetMiddleware(priority: 5), + GetMiddleware(priority: 4), + GetMiddleware(priority: -8), +]; +``` + +この場合の実行順序は **-8 => 2 => 4 => 5** + +### redirect + +redirect関数は、Routeを呼び出してページが検索されると実行されます。リダイレクト先のRouteSettingsが戻り値となります。もしくはnullを与えれば、リダイレクトは行われません。 + +```dart +RouteSettings redirect(String route) { + final authService = Get.find(); + return authService.authed.value ? null : RouteSettings(name: '/login') +} +``` + +### onPageCalled + +onPageCalled関数は、ページが呼び出された直後に実行されます。 +この関数を使ってページの内容を変更したり、新しいページを作成したりすることができます。 + +```dart +GetPage onPageCalled(GetPage page) { + final authService = Get.find(); + return page.copyWith(title: 'Welcome ${authService.UserName}'); +} +``` + +### onBindingsStart + +onBindingsStart関数は、Bindingsが初期化される直前に実行されます。 +たとえば、ページのBindingsを変更することもできます。 + +```dart +List onBindingsStart(List bindings) { + final authService = Get.find(); + if (authService.isAdmin) { + bindings.add(AdminBinding()); + } + return bindings; +} +``` + +### onPageBuildStart + +onPageBuildStart関数は、Bindingsが初期化された直後、ページWidgetが作成される前に実行されます。 + +```dart +GetPageBuilder onPageBuildStart(GetPageBuilder page) { + print('bindings are ready'); + return page; +} +``` + +### onPageBuilt + +onPageBuilt関数は、GetPage.page(ページのビルダー)が呼び出された直後に実行され、表示されるWidgetを結果として受け取ることができます。 + +### onPageDispose + +onPageDispose関数は、ページに関するすべてのオブジェクト(Controller、ビューなど)が破棄された直後に実行されます。 + +## その他API + +```dart +// 現在の画面に渡されているargs(引数)を取得 +Get.arguments + +// 直前のRouteの名前("/" など)を取得 +Get.previousRoute + +// 現在のRouteオブジェクトを取得 +Get.rawRoute + +// GetObserverからRoutingを取得 +Get.routing + +// SnackBarが開いているかチェック +Get.isSnackbarOpen + +// Dialogが開いているかチェック +Get.isDialogOpen + +// BottomSheetが開いているかチェック +Get.isBottomSheetOpen + +// Routeを削除 +Get.removeRoute() + +// 引数のRoutePredicateがtrueを返すまで画面を戻る +Get.until() + +// 引数で指定したRouteに進み、RoutePredicateがtrueを返すまで画面を戻る +Get.offUntil() + +// 引数で指定した名前付きRouteに進み、RoutePredicateがtrueを返すまで画面を戻る +Get.offNamedUntil() + +// アプリがどのプラットフォームで実行されているかのチェック +GetPlatform.isAndroid +GetPlatform.isIOS +GetPlatform.isMacOS +GetPlatform.isWindows +GetPlatform.isLinux +GetPlatform.isFuchsia + +// アプリがどのデバイスで実行されているかのチェック +GetPlatform.isMobile +GetPlatform.isDesktop +// プラットフォームとデバイスのチェックは独立 +// 同じOSでもウェブで実行されているのか、ネイティブで実行されているのか区別 +GetPlatform.isWeb + + +// MediaQuery.of(context).size.height と同じ +// ただしimmutable +Get.height +Get.width + +// Navigatorの現在のcontextを取得 +Get.context + +// SnackBar/Dialog/BottomSheet などフォアグラウンドのcontextを取得 +Get.overlayContext + +// 注: 以降のメソッドはcontextの拡張メソッドです。 +// contextと同じくUIのどこからでもアクセスできます。 + +// ウィンドウサイズの変更などに合わせて変わる height/width を取得 +context.width +context.height + +// 画面の半分のサイズ,1/3のサイズなどを取得 +// レスポンシブなデザインの場合に便利 +// オプションのパラメーター dividedBy で割る数を指定 +// オプションのパラメーター reducedBy でパーセンテージを指定 +context.heightTransformer() +context.widthTransformer() + +/// MediaQuery.of(context).size とほぼ同じ +context.mediaQuerySize() + +/// MediaQuery.of(context).padding とほぼ同じ +context.mediaQueryPadding() + +/// MediaQuery.of(context).viewPadding とほぼ同じ +context.mediaQueryViewPadding() + +/// MediaQuery.of(context).viewInsets とほぼ同じ +context.mediaQueryViewInsets() + +/// MediaQuery.of(context).orientation とほぼ同じ +context.orientation() + +/// デバイスがランドスケープ(横長)モードかどうかチェック +context.isLandscape() + +/// デバイスがポートレート(縦長)モードかどうかチェック +context.isPortrait() + +/// MediaQuery.of(context).devicePixelRatio とほぼ同じ +context.devicePixelRatio() + +/// MediaQuery.of(context).textScaleFactor とほぼ同じ +context.textScaleFactor() + +/// 画面の短辺の長さを取得 +context.mediaQueryShortestSide() + +/// 画面の横幅が800より大きい場合にtrueを返す +context.showNavbar() + +/// 画面の短辺が600より小さい場合にtrueを返す +context.isPhone() + +/// 画面の短辺が600より小さい場合にtrueを返す +context.isSmallTablet() + +/// 画面の短辺が720より大きい場合にtrueを返す +context.isLargeTablet() + +/// デバイスがタブレットの場合にtrueを返す +context.isTablet() + +/// 画面サイズに合わせて value を返す +/// たとえば: +/// 短辺が300より小さい → watchパラメーターの値を返す +/// 短辺が600より小さい → mobileパラメーターの値を返す +/// 短辺が1200より小さい → tabletパラメーターの値を返す +/// 横幅が1200より大きい → desktopパラメーターの値を返す +context.responsiveValue() +``` + +### オプションのグローバル設定と手動設定 + +GetMaterialApp はすべてあなたの代わりに設定してくれますが、手動で設定を施したい場合は MaterialApp の navigatorKey と navigatorObservers の値を指定してください。 + +```dart +MaterialApp( + navigatorKey: Get.key, + navigatorObservers: [GetObserver()], +); +``` + +`GetObserver`内で独自のミドルウェアを使用することもできます。これは他に影響を及ぼすことはありません。 + +```dart +MaterialApp( + navigatorKey: Get.key, + navigatorObservers: [ + GetObserver(MiddleWare.observer) // ここ + ], +); +``` + +`Get` クラスに_グローバル設定_を施すことができます。Routeをプッシュする前のコードに `Get.config` を追加するだけです。もしくは、`GetMaterialApp` 内で直接設定することもできます。 + +```dart +GetMaterialApp( + enableLog: true, + defaultTransition: Transition.fade, + opaqueRoute: Get.isOpaqueRouteDefault, + popGesture: Get.isPopGestureEnable, + transitionDuration: Get.defaultDurationTransition, + defaultGlobalState: Get.defaultGlobalState, +); + +Get.config( + enableLog = true, + defaultPopGesture = true, + defaultTransition = Transitions.cupertino +) +``` + +オプションで、すべてのログメッセージを `Get` からリダイレクトさせることができます。 +お好みのロギングパッケージを使ってログを取得したい場合はこのようにしてください。 + +```dart +GetMaterialApp( + enableLog: true, + logWriterCallback: localLogWriter, +); + +void localLogWriter(String text, {bool isError = false}) { + // ここでお好みのロギングパッケージにメッセージを渡してください + // enableLog: false にしても、ログメッセージはこのコールバックでプッシュされる点ご注意を + // ログが有効かどうかのチェックは Get.isLogEnable で可能 +} + +``` + +### ローカルステートWidget + +ローカルステートWidgetは、1つの変数の状態を一時的かつローカルに管理したい場合に便利です。 +シンプルなValueBuilderとリアクティブなObxValueの2種類があります。 +たとえば、`TextField` Widgetの obscureText プロパティを切り替えたり、折りたたみ可能なパネルをカスタムで作成したり、`BottomNavigation` の現在のインデックス値を変更して内容を変更したりといった用途に最適です。 + +#### ValueBuilder + +setStateでお馴染みの `StatefulWidget` をシンプルにしたビルダーWidgetです。 + +```dart +ValueBuilder( + initialValue: false, + builder: (value, updateFn) => Switch( + value: value, + onChanged: updateFn, // ( newValue ) => updateFn( newValue ) も可 + ), + // builderメソッドの外で何か実行する場合 + onUpdate: (value) => print("Value updated: $value"), + onDispose: () => print("Widget unmounted"), +), +``` + +#### ObxValue + +[`ValueBuilder`](#valuebuilder)に似ていますが、これはそのリアクティブバージョンです。Rxインスタンス(.obsを付けたときに戻る値です)を渡すと自動で更新されます。すごいでしょ? + +```dart +ObxValue((data) => Switch( + value: data.value, + onChanged: data, + // Rxには_呼び出し可能な_関数が備わっているのでこれだけでOK + // (flag) => data.value = flag も可能 + ), + false.obs, +), +``` + +## お役立ちTIPS + +`.obs`が付いた型(_Rx_型とも呼ばれる)には、さまざまな内部メソッドや演算子が用意されています。 + +> `.obs`が付いたプロパティが **実際の値** だと信じてしまいがちですが...間違えないように! +> 我々がcontrollerにおける変数の型宣言を省略してvarとしているのはDartのコンパイラが賢い上に、 +> そのほうがコードがすっきる見えるからですが… + +```dart +var message = 'Hello world'.obs; +print( 'Message "$message" has Type ${message.runtimeType}'); +``` + +`message`を _print_ することで実際の文字列が取り出されはしますが、型は **RxString** です! + +そのため `message.substring( 0, 4 )` などといったことはできません。 +Stringのメソッドにアクセスするには _observable_ の中にある実際の値 `value` にアクセスします。 +アクセスには `.value`を使うのが通常ですが、他の方法もあるのでご紹介します。 + +```dart +final name = 'GetX'.obs; +// 新しい値が現在のものと異なる場合のみ Stream が更新されます。 +name.value = 'Hey'; + +// すべてのRxプロパティは「呼び出し可能」で、valueを返してくれます。 +// ただし `null` は受付不可。nullの場合はUIが更新されない。 +name('Hello'); + +// これはgetterみたいなものです。'Hello' を返します。 +name() ; + +/// num型の場合 + +final count = 0.obs; + +// num型の非破壊的な演算子はすべて使えます。 +count + 1; + +// 注意! この場合は`count`がfinalなら有効ではないです。varなら有効。 +count += 1; + +// 比較演算子も使用可能 +count > 2; + +/// bool型の場合 + +final flag = false.obs; + +// true/false を入れ替えることができます。 +flag.toggle(); + + +/// すべての型 + +// `value` を null にセット。 +flag.nil(); + +// toString(), toJson() などの操作はすべて `value` が対象になります。 +print( count ); // RxIntの `toString()` が呼び出されて数字がprintされる。 + +final abc = [0,1,2].obs; +// json配列に変換した値と、'RxList' がprintされます。 +// JsonはすべてのRx型でサポートされています! +print('json: ${jsonEncode(abc)}, type: ${abc.runtimeType}'); + +// RxMap、RxList、RxSetはそれぞれの元の型を拡張した特別なRx型です。 +// たとえばRxListは通常のListとして扱うことができる上にリアクティブです。 +abc.add(12); // 12をListにプッシュし、Streamを更新してくれます。 +abc[3]; // Listと同様にインデックス番号3の値を取得してくれます。 + + +// 等価演算子はRx型と元の型でも動作しますが、.hashCode は常にvalueから取得します。 +final number = 12.obs; +print( number == 12 ); // true + +/// カスタムのRxモデル + +// toJson()やtoString()をモデルクラスに設定すれば、.obsからでもprintされるように実装可能。 + +class User { + String name, last; + int age; + User({this.name, this.last, this.age}); + + @override + String toString() => '$name $last, $age years old'; +} + +final user = User(name: 'John', last: 'Doe', age: 33).obs; + +// `user` 自体はリアクティブですが、その中のプロパティはリアクティブではありません。 +// そのため、このようにプロパティの値を変更してもWidgetは更新されません。 +user.value.name = 'Roi'; +// `Rx` には自ら変更を検知する手段がないからです。 +// そのため、カスタムクラスの場合はこのようにWidgetに変更を知らせる必要があります。 +user.refresh(); + +// もしくは `update()` メソッドを使用してください。 +user.update((value){ + value.name='Roi'; +}); + +print( user ); +``` +#### StateMixin + +`UI`の状態を管理するもう一つの手法として、`StateMixin`を利用する方法があります。 +controllerクラスに`with`を使って`StateMixin`を追加することで実装可能です。 + +``` dart +class Controller extends GetController with StateMixin{} +``` + +`change()`メソッドにより好きなタイミングで状態を変更することができます。 +このようにデータと状態を渡すだけです。 + +```dart +change(data, status: RxStatus.success()); +``` + +RxStatus には以下のステータスが存在します。 + +``` dart +RxStatus.loading(); +RxStatus.success(); +RxStatus.empty(); +RxStatus.error('message'); +``` + +ステータスごとにUIを設定するにはこのようにします。 + +```dart +class OtherClass extends GetView { + @override + Widget build(BuildContext context) { + return Scaffold( + + body: controller.obx( + (state)=>Text(state.name), + + // ローディング中はカスタムのインジケーターの設定も可能ですが、 + // デフォルトで Center(child:CircularProgressIndicator()) となります。 + onLoading: CustomLoadingIndicator(), + onEmpty: Text('No data found'), + + // 同様にエラーWidgetはカスタム可能ですが、 + // デフォルトは Center(child:Text(error)) です。 + onError: (error)=>Text(error), + ), + ); +} +``` + +#### GetView + +このWidgetは私のお気に入りです。とてもシンプルで扱いやすいですよ! + +このWidgetを一言で表現すると、「controllerをgetterに持つ `const` な StatelessWidget」です。 + +```dart + class AwesomeController extends GetController { + final String title = 'My Awesome View'; + } + + // controllerの `型` を渡すのを忘れずに! + class AwesomeView extends GetView { + @override + Widget build(BuildContext context) { + return Container( + padding: EdgeInsets.all(20), + child: Text(controller.title), // `controller.なんとか` でアクセス + ); + } + } +``` + +#### GetResponsiveView + +GetViewをレスポンシブデザインに対応させたい場合はこのWidgetを継承してください。 +画面サイズやデバイスタイプなどの情報を持つ `screen` プロパティを保持しています。 + +##### 使い方 + +Widgetをビルドする方法は2つあります。 + +- `builder` メソッドを使う。 +- `desktop`, `tablet`, `phone`, `watch` メソッドを使う。 + 画面サイズ、デバイスタイプに応じたWidgetがビルドされます。 + たとえば画面が [ScreenType.Tablet] なら `tablet` メソッドが実行されます。 + **注:** `alwaysUseBuilder` プロパティをfalseにする必要があります。 + +`settings` プロパティでブレイクポイントを設定することもできます。 + +![例](https://github.com/SchabanBo/get_page_example/blob/master/docs/Example.gif?raw=true) +この画面のコード +[コード](https://github.com/SchabanBo/get_page_example/blob/master/lib/pages/responsive_example/responsive_view.dart) + +#### GetWidget + +このWidgetはあまり知られておらず、使用するケースは稀です。 +GetViewとの違いは、Controllerを`キャッシュ`してくれる点です。 +このキャッシュがあるため `const` にはできません。 + +> それでは一体いつControllerをキャッシュする必要があるのかって? + +それは **GetX** のこれまた使う機会の少ない `Get.create()` を使うときです。 + +`Get.create(()=>Controller())` は `Get.find()` を実行するたびに +新しいControllerインスタンスを生成します。 + +そこで `GetWidget` の出番です。たとえば、Todoアイテムのリスト内容を保持したいとき。 +Widgetが更新されてもアイテムはControllerのキャッシュを参照してくれます。 + +#### GetxService + +このクラスは `GetxController` に似ており、同様のライフサイクル(`onInit()`, `onReady()`, `onClose()`)を共有しますが、そこに「ロジック」はありません。**GetX**の依存オブジェクト注入システムに、このサブクラスがメモリから **削除できない** ということを知らせるだけです。 + +そのため `Get.find()` で `ApiService`, `StorageService`, `CacheService` のようなサービス系クラスにいつでもアクセスできるようにしておくと非常に便利です。 + +```dart +Future main() async { + await initServices(); /// サービスクラスの初期化をawait + runApp(SomeApp()); +} + +/// Flutterアプリ実行前にサービスクラスを初期化してフローをコントロールするのは賢いやり方です。 +/// たとえば GetMaterialAppを更新する必要がないようにUser別の +/// Theme、apiKey、言語設定などをApiサービス実行前にロードしたり。 +void initServices() async { + print('starting services ...'); + /// get_storage, hive, shared_pref の初期化はここで行います。 + /// あるいは moor の connection など非同期のメソッドならなんでも。 + await Get.putAsync(() => DbService().init()); + await Get.putAsync(SettingsService()).init(); + print('All services started...'); +} + +class DbService extends GetxService { + Future init() async { + print('$runtimeType delays 2 sec'); + await 2.delay(); + print('$runtimeType ready!'); + return this; + } +} + +class SettingsService extends GetxService { + void init() async { + print('$runtimeType delays 1 sec'); + await 1.delay(); + print('$runtimeType ready!'); + } +} + +``` + +`GetxService` を破棄する唯一の方法は `Get.reset()` メソッドを使うことです。 +これはアプリにおける「ホットリブート」のようなものです。あるクラスのインスタンスを +ライフサイクルの間ずっと残しておきたい場合は `GetxService` を使うというのを覚えておいてください。 + + +## テストの実行 + +Controllerのライフサイクル含め、他のクラスと同様にテストを実行することができます。 + +```dart +class Controller extends GetxController { + @override + void onInit() { + super.onInit(); + // 値を name2 に変更 + name.value = 'name2'; + } + + @override + void onClose() { + name.value = ''; + super.onClose(); + } + + final name = 'name1'.obs; + + void changeName() => name.value = 'name3'; +} + +void main() { + test(''' +Test the state of the reactive variable "name" across all of its lifecycles''', + () { + /// ライフサイクルごとのテストは必ずしも行う必要はありませんが、 + /// GetXの依存オブジェクト注入機能を使用しているのであれば実行をおすすめします。 + final controller = Controller(); + expect(controller.name.value, 'name1'); + + /// このようにライフサイクル経過ごとの状態をテスト可能です。 + Get.put(controller); // onInit が実行される + expect(controller.name.value, 'name2'); + + /// 関数もテストしましょう + controller.changeName(); + expect(controller.name.value, 'name3'); + + /// onClose が実行される + Get.delete(); + + expect(controller.name.value, ''); + }); +} +``` + +#### mockitoやmocktailを使う場合 +GetxController/GetxService をモックする場合 Mock をミックスインしてください。 + +```dart +class NotificationServiceMock extends GetxService with Mock implements NotificationService {} +``` + +#### Get.reset() +WidgetやGroupのテスト時に、テストの最後かtearDownの中で Get.reset() を実行することで設定をリセットすることができます。 + +#### Get.testMode +Controllerの中でナビゲーションを使用している場合は、`Get.testMode = true`をmainの開始で実行してください。 + + +# バージョン2.0からの破壊的変更 + +1- Rx型の名称 + +| 変更前 | 変更後 | +| ------- | ---------- | +| StringX | `RxString` | +| IntX | `RxInt` | +| MapX | `RxMap` | +| ListX | `RxList` | +| NumX | `RxNum` | +| DoubleX | `RxDouble` | + +RxControllerとGetBuilderが統合され、Controllerにどれを使うか覚えておく必要がなくなりました。GetxControllerを使うだけで、リアクティブと非リアクティブな状態管理の両方に対応できるようになりました。 + +2- 名前付きRoute +変更前: + +```dart +GetMaterialApp( + namedRoutes: { + '/': GetRoute(page: Home()), + } +) +``` + +変更後: + +```dart +GetMaterialApp( + getPages: [ + GetPage(name: '/', page: () => Home()), + ] +) +``` + +変更の効果: +ページ表示にはパラメータやログイントークンを起点にする方法もありますが、以前のアプローチではこれができず、柔軟性に欠けていました。 +ページを関数から取得するよう変更したことで、このようなアプローチを可能にし、アプリ起動直後にRouteがメモリに割り当てられることもないため、RAMの消費量を大幅に削減することもできました。 + +```dart + +GetStorage box = GetStorage(); + +GetMaterialApp( + getPages: [ + GetPage(name: '/', page:(){ + return box.hasData('token') ? Home() : Login(); + }) + ] +) +``` + +# なぜGetXなのか + +1- Flutterのアップデートが重なると、依存パッケージがうまく動かなくなることがあります。コンパイルエラーを起こしたり、その時点で解決方法がないようなエラーが発生したり。開発者はそのエラーを追跡し、該当リポジトリにissueを提起し、問題が解決されるのを待つ必要があります。Getは開発に必要な主要リソース(状態管理、依存オブジェクト管理、Route管理)を一元化し、Pubspecにパッケージを1つ追加するだけでコーディングを開始することができます。Flutterがアップデートしたときに必要なことは、Getも併せてアップデートすることだけです。それですぐに作業を再開できます。またGetはパッケージ間の互換性の問題も解消します。互いに依存するパッケージAの最新バージョンとBの最新バージョンの間に互換性がない、ということが何度あったでしょうか。Getを使えばすべてが同じパッケージ内にあるため、互換性の心配はありません。 + +2- Flutterは手軽で素晴らしいフレームワークですが、`Navigator.of(context).push (context, builder [...]`のように、ほとんどの開発者にとって不要な定型文が一部にあります。Getを使えばそのような定型文を簡素化できます。Routeを呼ぶためだけに8行のコードを書く代わりに、`Get.to(Home())`を実行すれば、次の画面に遷移することができるのです。またウェブURLを動的なものにすることは現在Flutterでは本当に骨の折れる作業ですが、GetXを使えば非常に簡単です。そしてFlutterにおける状態管理と依存オブジェクト管理については、たくさんのパターンやパッケージがあるので多くの議論を生んでいます。しかしGetXのアプローチは大変シンプルです。これは一例ですが、変数の最後に「.obs」を追加して「Obx()」の中にWidgetを配置するだけで、その変数の状態変化が自動でWidgetに反映されます。 + +3- GetXではパフォーマンスのことをあまり気にせず開発ができます。Flutterのパフォーマンスはそれだけで素晴らしいものですが、状態管理と併せて BLoC / データストア / Controller などを届けるためのサービスロケーターを使用することを想像してみてください。そのインスタンスが必要ないときはリソースを解放するイベントを明示的に呼び出さなければなりません。そんなとき、使用されなくなったら自動でメモリから削除してくれればいいのに、と考えたことはありませんか?それを実現してくれるのがGetXです。SmartManagement機能により未使用のリソースはすべて自動でメモリから破棄されるので、本来の開発作業に集中することができます。メモリ管理のためのロジックを作らなくても、常に必要最小限のリソースを使っていることが保証されるのです。 + +4- コードのデカップリング(分離)がしやすい。「ビューをビジネスロジックから分離する」というコンセプトを聞いたことがあるかもしれません。これはなにもBLoC、MVC、MVVMに限ったことではなく、どのアーキテクチャパターンもこのコンセプトが考え方の基本にあると言っていいでしょう。しかし、Flutterではcontextの使用によりこのコンセプトが薄まってしまいがちです。 +InheritedWidgetを参照するためにcontextが必要なとき、ビューの中でそれを使用するか、引数としてcontextを渡しますよね?私はこの方法は美しくないと感じます。常にビュー内のビジネスロジックに依存しなければならないのは、特にチームで仕事をする場面においては不便だと感じます。GetXによるアプローチでは、StatefulWidgetやinitStateなどの使用を禁止しているわけではありませんが、それらよりもずっとスッキリ書けるようになっています。Controller自体にライフサイクルがあるため、たとえばREST APIのリクエストを行うときも、ビューの中の何かに依存するということがありません。Controllerのライフサイクルの一つである onInit を使用してhttpを呼び出し、データが到着すると変数にセットされます。GetXはリアクティブな変数を扱うことができるので、インスタンス変数が変わりし次第、その変数に依存するWidgetがすべて自動更新されます。これによりUIの担当者はWidgetの見た目に注力することができ、ボタンクリックなどのユーザーイベント以外のものをビジネスロジックに渡す必要がなくなります。その一方でビジネスロジックの担当者はビジネスロジックだけに集中し、個別のテストを簡単に行うことができます。 + +GetXライブラリは今後も更新され続け、新しい機能を実装していきます。気軽にプルリクエストを出していただき、ライブラリの成長に貢献していただけるとうれしいです。 + +# コミュニティ + +## コミュニティチャンネル + +GetXコミュニティは非常に活発で有益な情報であふれています。ご質問がある場合や、このフレームワークの使用に関して支援が必要な場合は、ぜひコミュニティチャンネルにご参加ください。このリポジトリは、issueの提起およびリクエスト専用ですが、気軽にコミュニティにご参加いただければ幸いです。 + +| **Slack** | **Discord** | **Telegram** | +| :-------------------------------------------------------------------------------------------------------------------------- | :-------------------------------------------------------------------------------------------------------------------------- | :-------------------------------------------------------------------------------------------------------------------- | +| [![Get on Slack](https://img.shields.io/badge/slack-join-orange.svg)](https://communityinviter.com/apps/getxworkspace/getx) | [![Discord Shield](https://img.shields.io/discord/722900883784073290.svg?logo=discord)](https://discord.com/invite/9Hpt99N) | [![Telegram](https://img.shields.io/badge/chat-on%20Telegram-blue.svg)](https://t.me/joinchat/PhdbJRmsZNpAqSLJL6bH7g) | + +## コントリビュート方法 + +_GetXプロジェクトに貢献してみませんか?あなたをコントリビューターの一人としてご紹介できるのを楽しみにしています。GetおよびFlutterをより良いものにするためのコントリビュート例をご紹介します。_ + +- Readmeの多言語対応。 +- Readmeの追加ドキュメント執筆 (ドキュメントで触れられていない機能がまだまだたくさんあります)。 +- Getの使い方を紹介する記事やビデオの作成(Readmeに掲載させていただきます。将来的にWikiができればそこにも掲載予定)。 +- コードやテストのプルリクエスト。 +- 新機能の提案。 + +どのような形の貢献であれ歓迎しますので、ぜひコミュニティにご参加ください! + +## GetXに関する記事と動画 + +- [Flutter Getx EcoSystem package for arabic people](https://www.youtube.com/playlist?list=PLV1fXIAyjeuZ6M8m56zajMUwu4uE3-SL0) - Tutorial by [Pesa Coder](https://github.com/UsamaElgendy). +- [Dynamic Themes in 3 lines using GetX™](https://medium.com/swlh/flutter-dynamic-themes-in-3-lines-c3b375f292e3) - Tutorial by [Rod Brown](https://github.com/RodBr). +- [Complete GetX™ Navigation](https://www.youtube.com/watch?v=RaqPIoJSTtI) - Route management video by Amateur Coder. +- [Complete GetX State Management](https://www.youtube.com/watch?v=CNpXbeI_slw) - State management video by Amateur Coder. +- [GetX™ Other Features](https://youtu.be/ttQtlX_Q0eU) - Utils, storage, bindings and other features video by Amateur Coder. +- [Firestore User with GetX | Todo App](https://www.youtube.com/watch?v=BiV0DcXgk58) - Video by Amateur Coder. +- [Firebase Auth with GetX | Todo App](https://www.youtube.com/watch?v=-H-T_BSgfOE) - Video by Amateur Coder. +- [The Flutter GetX™ Ecosystem ~ State Management](https://medium.com/flutter-community/the-flutter-getx-ecosystem-state-management-881c7235511d) - State management by [Aachman Garg](https://github.com/imaachman). +- [The Flutter GetX™ Ecosystem ~ Dependency Injection](https://medium.com/flutter-community/the-flutter-getx-ecosystem-dependency-injection-8e763d0ec6b9) - Dependency Injection by [Aachman Garg](https://github.com/imaachman). +- [GetX, the all-in-one Flutter package](https://www.youtube.com/watch?v=IYQgtu9TM74) - A brief tutorial covering State Management and Navigation by Thad Carnevalli. +- [Build a To-do List App from scratch using Flutter and GetX](https://www.youtube.com/watch?v=EcnqFasHf18) - UI + State Management + Storage video by Thad Carnevalli. +- [GetX Flutter Firebase Auth Example](https://medium.com/@jeffmcmorris/getx-flutter-firebase-auth-example-b383c1dd1de2) - Article by Jeff McMorris. +- [Flutter State Management with GetX – Complete App](https://www.appwithflutter.com/flutter-state-management-with-getx/) - by App With Flutter. +- [Flutter Routing with Animation using Get Package](https://www.appwithflutter.com/flutter-routing-using-get-package/) - by App With Flutter. +- [A minimal example on dartpad](https://dartpad.dev/2b3d0d6f9d4e312c5fdbefc414c1727e?) - by [Roi Peker](https://github.com/roipeker) diff --git a/siro_rider/packages/get/README.ko-kr.md b/siro_rider/packages/get/README.ko-kr.md new file mode 100644 index 0000000..ab1770e --- /dev/null +++ b/siro_rider/packages/get/README.ko-kr.md @@ -0,0 +1,1266 @@ +![](https://raw.githubusercontent.com/jonataslaw/getx-community/master/get.png) + +[![pub package](https://img.shields.io/pub/v/get.svg?label=get&color=blue)](https://pub.dev/packages/get) +[![popularity](https://badges.bar/get/popularity)](https://pub.dev/packages/sentry/score) +[![likes](https://badges.bar/get/likes)](https://pub.dev/packages/get/score) +[![pub points](https://badges.bar/get/pub%20points)](https://pub.dev/packages/get/score) +![building](https://github.com/jonataslaw/get/workflows/build/badge.svg) +[![style: effective dart](https://img.shields.io/badge/style-effective_dart-40c4ff.svg)](https://pub.dev/packages/effective_dart) +[![Discord Shield](https://img.shields.io/discord/722900883784073290.svg?logo=discord)](https://discord.com/invite/9Hpt99N) +[![Get on Slack](https://img.shields.io/badge/slack-join-orange.svg)](https://communityinviter.com/apps/getxworkspace/getx) +[![Telegram](https://img.shields.io/badge/chat-on%20Telegram-blue.svg)](https://t.me/joinchat/PhdbJRmsZNpAqSLJL6bH7g) + +Awesome Flutter + +Buy Me A Coffee + +![](https://raw.githubusercontent.com/jonataslaw/getx-community/master/getx.png) + + +
+ +**Languages:** + + +[![영어](https://img.shields.io/badge/Language-English-blueviolet?style=for-the-badge)](README.md) +[![베트남어](https://img.shields.io/badge/Language-Vietnamese-blueviolet?style=for-the-badge)](README-vi.md) +[![인도네시아어](https://img.shields.io/badge/Language-Indonesian-blueviolet?style=for-the-badge)](README.id-ID.md) +[![우르두어](https://img.shields.io/badge/Language-Urdu-blueviolet?style=for-the-badge)](README.ur-PK.md) +[![중국어](https://img.shields.io/badge/Language-Chinese-blueviolet?style=for-the-badge)](README.zh-cn.md) +[![포르투칼어](https://img.shields.io/badge/Language-Portuguese-blueviolet?style=for-the-badge)](README.pt-br.md) +[![스페인어](https://img.shields.io/badge/Language-Spanish-blueviolet?style=for-the-badge)](README-es.md) +[![러시아어](https://img.shields.io/badge/Language-Russian-blueviolet?style=for-the-badge)](README.ru.md) +[![폴란드어](https://img.shields.io/badge/Language-Polish-blueviolet?style=for-the-badge)](README.pl.md) +[![한국어](https://img.shields.io/badge/Language-Korean-blueviolet?style=for-the-badge)](README.ko-kr.md) +[![프랑스어](https://img.shields.io/badge/Language-French-blueviolet?style=for-the-badge)](README-fr.md) + +
+ +- [Get에 대하여](#get에-대하여) +- [설치](#설치) +- [GetX를 사용한 Counter 앱](#getx를-사용한-counter-앱) +- [세가지 주요점](#세가지-주요점) + - [상태 관리](#상태-관리) + - [반응형 상태 관리자](#반응형-상태-관리자) + - [상태 관리에 대한 자세한 내용](#상태-관리에-대한-자세한-내용) + - [라우트 관리](#라우트-관리) + - [라우트 관리에 대한 자세한 내용](#라우트-관리에-대한-자세한-내용) + - [종속성 관리](#종속성-관리) + - [종속성 관리에 대한 자세한 내용](#종속성-관리에-대한-자세한-내용) +- [기능들](#기능들) + - [국제화](#국제화) + - [번역](#번역) + - [번역 사용법](#번역-사용법) + - [지역화](#지역화) + - [지역 변경](#지역-변경) + - [시스템 지역](#시스템-지역) + - [테마 변경](#테마-변경) + - [GetConnect](#getconnect) + - [기본 구성](#기본-구성) + - [커스텀 구성](#커스텀-구성) + - [GetPage Middleware](#getpage-middleware) + - [Priority](#priority) + - [Redirect](#redirect) + - [onPageCalled](#onpagecalled) + - [OnBindingsStart](#onbindingsstart) + - [OnPageBuildStart](#onpagebuildstart) + - [OnPageBuilt](#onpagebuilt) + - [OnPageDispose](#onpagedispose) + - [기타 고급 API](#기타-고급-api) + - [선택적 전역 설정과 수동 구성](#선택적-전역-설정과-수동-구성) + - [지역 상태 위젯들](#지역-상태-위젯들) + - [ValueBuilder](#valuebuilder) + - [ObxValue](#obxvalue) + - [유용한 팁](#유용한-팁) + - [GetView](#getview) + - [GetResponsiveView](#getresponsiveview) + - [사용 방법](#사용-방법) + - [GetWidget](#getwidget) + - [GetxService](#getxservice) +- [2.0의 주요 변경점](#20의-주요-변경점) +- [왜 Getx인가?](#왜-getx인가) +- [커뮤니티](#커뮤니티) + - [커뮤니티 채널](#커뮤니티-채널) + - [기여하는 방법](#기여하는-방법) + - [기사 및 비디오](#기사-및-비디오) + +# Get에 대하여 + +- GetX는 Flutter를 위한 매우 가볍고 강력한 솔루션입니다. 고성능 상태 관리, 지능형 종속성 주입 및 빠르고 실용적인 라우트 관리가 결합되어 있습니다. + +- GetX는 라이브러리의 모든 사항에 대해서 **생산성, 성능, 조직화**의 3 가지 기본 원칙을 가지고 있습니다. + + - **성능:** GetX는 성능과 최소한의 리소스 소비에 중점을 둡니다. GetX는 Streams나 ChangeNotifier를 사용하지 않습니다. + + - **생산성:** GetX는 쉽고 친숙한 구문을 사용합니다. 원하시는 것보다 Getx에는 항상 더 쉬운 방법이 있습니다. 개발 시간을 아끼고 애플리케이션을 최대 성능으로 제공할 수 있습니다. + + 일반적으로 개발자는 메모리에서 컨트롤러들을 제거하는 데 관심을 가져야합니다. GetX에서는 리소스가 기본적으로 사용되지 않으면 메모리에서 제거되므로 필요하지 않습니다. 만약 메모리에 유지하려면 종속성에서 "permanent : true"를 명시적으로 선언해야합니다. 이렇게하면 시간을 절약 할 수있을뿐만 아니라 불필요한 메모리 종속성이 발생할 위험이 줄어 듭니다. 종속성은 기본적으로 lazy로 로드됩니다. + + - **조직화:** GetX는 화면, 프레젠테이션 로직, 비즈니스 로직, 종속성 주입 및 네비게이션을 완전히 분리 할 수 있습니다. 라우트간 전환을 하는데에 컨텍스트가 필요하지 않아 위젯 트리(시각객체)에 독립적입니다. inheritedWidget을 통해 컨트롤러/블록에 접근하는 데 컨텍스트가 필요하지 않아 시각화 계층에서 프레젠테이션 로직과 비즈니스 로직을 완전히 분리됩니다. 이 GetX는 자체 종속성 주입 기능을 사용하여 DI를 뷰에서 완전히 분리하기 때문에 다중 Provider를 통해 위젯 트리에서 컨트롤러/모델/블록으로 주입 할 필요가 없습니다. + + GetX를 사용하면 기본적으로 클린 코드를 가지게 되어 애플리케이션의 각 기능을 쉽게 찾을 수있습니다. 이것은 유지 보수를 용이하게 하며 모듈의 공유가 가능하고 Flutter에서는 생각할 수 없었던 것들도 전부 가능합니다. + BLoC은 Flutter에서 코드를 구성하기 위한 시작점으로 비즈니스 로직과 시각객체를 분리합니다. Getx는 비즈니스 로직 뿐만 아니라 프레젠테이션 로직을 분리하는 자연스러운 진화입니다. 추가로 종속성 주입과 라우트 또한 분리되고 데이터 계층이 모두로부터 분리됩니다. Hello World를 구현하는 것보다 더 쉽게 모든 것이 어디 있는지 알수 있습니다. + Flutter SDK와 함께 GetX를 사용하면 가장 쉽고 실용적이며 확장 가능한 고성능 어플리케이션을 만들수 있습니다. 초보자에게는 쉬우며 전문가에게는 정확하고 완벽하게 동작하는 대규모 생태계가 함께합니다. 안전하고 안정적이며 업데이트되고 기본 Flutter SDK에 없는 광범위한 API 빌드를 제공합니다. + +- GetX는 비대하지 않습니다. 아무 걱정없이 프로그래밍을 시작할 수 있는 다양한 기능이 있지만 각 기능은 별도의 컨테이너에 있으며 사용한 후에만 시작됩니다. 만약 상태 관리만 사용하면 오직 상태 관리만 컴파일 됩니다. 라우트만 사용하는 경우 상태 관리는 컴파일되지 않습니다. + +- GetX는 거대한 생태계, 대규모 커뮤니티, 수많은 공동 작업자를 보유하고 있으며 Flutter가 존재하는 한 유지됩니다. GetX도 Android, iOS, 웹, Mac, Linux, Windows 및 서버에서 동일한 코드로 실행할 수 있습니다. +**[Get Server](https://github.com/jonataslaw/get_server)를 사용한 백엔드에는 프런트엔드에서 만든 코드를 완전히 재사용 할 수 있습니다.** + +**추가로 [Get CLI](https://github.com/jonataslaw/get_cli)를 프런트엔드와 서버 양쪽에서 사용하면 전체 개발 프로세스를 자동화 할 수 있습니다.** + +**추가로 생산성 향상을 위해 +[VSCode 확장](https://marketplace.visualstudio.com/items?itemName=get-snippets.get-snippets)과 [Android Studio/Intellij 확장](https://plugins.jetbrains.com/plugin/14975-getx-snippets)이 있습니다.** + +# 설치 + +pubspec.yaml 파일에 Get 추가: + +```yaml +dependencies: + get: +``` + +사용할 파일에 Import get: + +```dart +import 'package:get/get.dart'; +``` + +# GetX를 사용한 Counter 앱 + +Flutter의 새 프로젝트에서 기본적으로 생성 되는 "counter" 프로젝트는 100줄이 넘습니다 (코멘트 포함). Get의 힘을 보여주기 위해 클릭 할 때마다 상태를 변경하고, 페이지 사이를 전환하고, 화면 사이의 상태를 공유하는 "counter"를 만드는 방법을 주석이 포함된 26줄의 코드로 보여줄 것입니다. + +- 1 단계: + MaterialApp 에 "Get"을 추가하여 GetMaterialApp 으로 변경합니다. + +```dart +void main() => runApp(GetMaterialApp(home: Home())); +``` + +- 주석: 이는 Flutter의 MaterialApp을 변경하지 않으며 GetMaterialApp 또한 수정 된 MaterialApp이 아니고, 기본 MaterialApp을 자식으로 갖는 사전 구성된 위젯 일뿐입니다. 수동으로 구성 할 수 있지만 반드시 필요한 것은 아닙니다. GetMaterialApp은 라우트를 생성하고 추가하며, 번역을 추가하고, 라우트 탐색에 필요한 모든 것을 추가합니다. 만약 상태 관리 또는 종속성 관리에만 Get을 사용하는 경우 GetMaterialApp을 사용할 필요가 없습니다. GetMaterialApp은 라우트, 스택바, 국제화, bottomSheets, 다이얼로그 및 컨텍스트 부재와 라우트에 연관된 상위 api들에 필요합니다. +- 주석²: 이 단계는 라우트 관리 (`Get.to ()`,`Get.back ()` 등)를 사용하려는 경우에만 필요합니다. 사용하지 않을 경우 1 단계를 수행 할 필요가 없습니다. + +- 2 단계: + 비즈니스 로직 클래스를 만들고 모든 변수, 함수, 컨트롤러를 포함하십시오. + ".obs"를 이용하면 간단히 모든 변수를 observable로 만들수 있습니다. + +```dart +class Controller extends GetxController{ + var count = 0.obs; + increment() => count++; +} +``` + +- 3 단계: + StatelessWidget를 이용해 View를 만들어 RAM을 아끼고 StatefulWidget은 더 이상 사용하지 않아도 됩니다. + +```dart +class Home extends StatelessWidget { + + @override + Widget build(context) { + + // Get.put()을 사용하여 클래스를 인스턴스화하여 모든 "child'에서 사용가능하게 합니다. + final Controller c = Get.put(Controller()); + + return Scaffold( + // count가 변경 될 때마다 Obx(()=> 를 사용하여 Text()에 업데이트합니다. + appBar: AppBar(title: Obx(() => Text("Clicks: ${c.count}"))), + + // 8줄의 Navigator.push를 간단한 Get.to()로 변경합니다. context는 필요없습니다. + body: Center(child: ElevatedButton( + child: Text("Go to Other"), onPressed: () => Get.to(Other()))), + floatingActionButton: + FloatingActionButton(child: Icon(Icons.add), onPressed: c.increment)); + } +} + +class Other extends StatelessWidget { + // 다른 페이지에서 사용되는 컨트롤러를 Get으로 찾아서 redirect 할 수 있습니다. + final Controller c = Get.find(); + + @override + Widget build(context){ + // 업데이트된 count 변수에 연결 + return Scaffold(body: Center(child: Text("${c.count}"))); + } +} +``` + +결론: + +![](https://raw.githubusercontent.com/jonataslaw/getx-community/master/counter-app-gif.gif) + +이것은 간단한 프로젝트 이지만 Get이 얼마나 강력한지 명확히 보여줍니다. 프로젝트가 성장하면 차이점이 더 커질 것 입니다. + +Get은 팀단위 업무에 맞춰 디자인되었지만 개별 개발자의 작업도 단순화합니다. + +마감일을 개선하고 성능의 손실 없이 재시간에 제공하십시오. Get은 모두를 위한 것은 아니지만 위의 설명에 해당사항이 있으면 당신을 위한 것입니다! + +# 세가지 주요점 + +## 상태 관리 + +Get은 두가지 상태 관리자가 있습니다: 단순 상태관리자(GetBuilder라고 함)와 반응형 상태관리자(GetX/Obx) + +### 반응형 상태 관리자 + +반응형 프로그래밍은 복잡하다고 알려져있기 때문에 많은 사람들에게 소외될 수 있습니다. GetX가 매우 단순하게 반응형 프로그래밍을 바꿉니다: + +- StreamControllers를 만들 필요가 없습니다. +- 각 변수에 대해 StreamBuilder를 만들 필요가 없습니다. +- 각각의 상태(state)를 위한 클래스를 만들 필요가 없습니다. +- 초기값을 위한 get이 필요하지 않습니다. +- 코드 생성기를 사용할 필요가 없습니다. + +Get의 반응형 프로그램은 setState를 사용하는 것 만큼 쉽습니다. + +매번 변경되기를 원하고 모든 위젯에서 자동적으로 반영되는 변수가 있다고 가정해봅시다. + +여기 name 변수가 있습니다: + +```dart +var name = 'Jonatas Borges'; +``` + +".obs"만 끝에 추가하여 observable로 만듭니다: + +```dart +var name = 'Jonatas Borges'.obs; +``` + +아래와 같이 간단히 보여주고 싶은 UI에 추가하면 값이 변경될때마다 화면에 업데이트 됩니다: + +```dart +Obx(() => Text("${controller.name}")); +``` + +이게 다 입니다. _정말_ 간단하죠. + +### 상태 관리에 대한 자세한 내용 + +**상태 관리에 대한 자세한 설명은 [여기](./documentation/kr_KO/state_management.md)를 보십시오. 여기에서 더 많은 예제와 단순 상태 관리자와 반응형 상태 관리자의 차이점을 볼 수 있습니다.** + +GetX 능력에 대한 좋은 아이디어를 얻을 수 있습니다. + +## 라우트 관리 + +만약 라우트/스낵바/다이얼로그/bottomsheets을 context 없이 사용하려면 GetX는 훌륭한 대안입니다. 여기를 보십시오: + +MaterialApp 앞에 "Get"을 추가해서 GetMaterialApp으로 변경합니다. + +```dart +GetMaterialApp( // Before: MaterialApp( + home: MyHome(), +) +``` + +새로운 화면으로 이동합니다: + +```dart + +Get.to(NextScreen()); +``` + +명칭으로 새로운 화면으로 이동합니다. 명칭으로 라우트하는 더 자세한 사항은 [여기](./documentation/kr_KO/route_management.md#이름있는-라우트-탐색) 있습니다. + +```dart + +Get.toNamed('/details'); +``` + +스낵바, 다이얼로그, bottomsheets 또는 Navigator.pop(context);로 닫아야 하는 어떤것도 닫게 합니다: + +```dart +Get.back(); +``` + +다음 화면으로 이동하고 이전 화면으로 돌아갈 필요가 없는 경우 (스플래시, 로그인화면 등..) + +```dart +Get.off(NextScreen()); +``` + +다음 화면으로 이동하고 이전 화면들 모두 닫는 경우 (쇼핑카트, 투표, 테스트에 유용) + +```dart +Get.offAll(NextScreen()); +``` + +이러한 작업을 수행하기 위해 컨텍스트를 사용할 필요가 없다는 것을 보셨나요? 이것이 Get 라우트 관리를 사용하는 가장 큰 장점 중 하나입니다. 이를 통해 걱정없이 컨트롤러 클래스 내에서 이러한 모든 메서드를 실행할 수 있습니다. + +### 라우트 관리에 대한 자세한 내용 + +**Get은 명명된 라우트로 작업하고 더 쉬운 방식으로 라우트의 제어를 제공합니다! [여기](./documentation/kr_KO/route_management.md)에 더 자세한 문서가 있습니다.** + +## 종속성 관리 + +Get은 간단하고 강력한 종속성 관리자를 가지고 있어 Bloc나 Controller와 유사한 클래스를 Provide context, inheritedWidget 없이 1줄의 코드로 끌어낼 수 있습니다: + +```dart +Controller controller = Get.put(Controller()); // Rather Controller controller = Controller(); +``` + +- 주석: Get의 상태 관리자를 사용중이면 뷰를 controller에 더 쉽게 연결할 수 있는 바인딩 api에 더 주의를 기울이십시오. + +사용 중인 클래스에서 클래스를 인스턴스화하는 대신에 Get 인스턴스에서 인스턴스화하면 앱에서 해당 클래스를 사용할 수 있습니다. +그래서 controller(또는 Bloc)를 정상적으로 사용할 수 있습니다. + +**팁:** Get 종속성 관리는 패키지의 다른 부분과 분리되어서 예제 앱이 이미 상태 관리자(하나여도 상관없음)를 사용중이면 모두 다시 작성할 필요 없이 아무 문제 없이 종속성 주입을 사용할 수 있습니다. + +```dart +controller.fetchApi(); +``` + +여러 경로들을 탐색했고 controller에 남아있는 데이터가 필요가 있다고 가정하십시오. Get_it이나 Provider와 조합된 상태 관리자가 필요합니다. 맞습니까? Get은 아닙니다. 다른 추가적인 종속성이 필요없이 controller를 Get의 "find"로 찾으면 됩니다: + +```dart +Controller controller = Get.find(); +//마법처럼 Get이 controller를 찾아서 가져올 것 입니다. 백만개의 인스턴스화 contrller를 가질수 있고 Get은 올바른 controller를 항상 가져다 줄 것입니다. +``` + +그리고나서 가져온 controller 데이터를 사용할 수 있습니다: + +```dart +Text(controller.textFromApi); +``` + +### 종속성 관리에 대한 자세한 내용 + +**종속성 관리에 대한 더 자세한 사항은 [여기](./documentation/kr_KO/dependency_management.md)에 있습니다.** + +# 기능들 + +## 국제화 + +### 번역 + +번역은 간단한 key-value 맵으로 유지됩니다. +커스텀 번역을 추가하려면 `Translations`으로 확장하여 클래스를 만드세요. + +```dart +import 'package:get/get.dart'; + +class Messages extends Translations { + @override + Map> get keys => { + 'en_US': { + 'hello': 'Hello World', + }, + 'de_DE': { + 'hello': 'Hallo Welt', + } + }; +} +``` + +#### 번역 사용법 + +단지 `.tr`로 명시된 키만 추가하면 `Get.locale`과 `Get.fallbackLocale`의 현재값을 사용해서 번역될 것 입니다. + +```dart +Text('title'.tr); +``` + +#### 단수와 복수의 번역 사용법 + +```dart +var products = []; +Text('singularKey'.trPlural('pluralKey', products.length, Args)); +``` + +#### 파라미터로 번역 사용하는 방법 + +```dart +import 'package:get/get.dart'; + + +Map> get keys => { + 'en_US': { + 'logged_in': 'logged in as @name with email @email', + }, + 'es_ES': { + 'logged_in': 'iniciado sesión como @name con e-mail @email', + } +}; + +Text('logged_in'.trParams({ + 'name': 'Jhon', + 'email': 'jhon@example.com' + })); +``` + +### 지역화 + +`GetMaterialApp`의 파라미터를 전달하여 지역과 번역어를 정의합니다. + +```dart +return GetMaterialApp( + translations: Messages(), // 번역들 + locale: Locale('en', 'US'), // 해당 지역의 번역이 표시 + fallbackLocale: Locale('en', 'UK'), // 잘못된 지역이 선택된 경우 복구될 지역을 지정 +); +``` + +#### 지역 변경 + +지역을 업데이트할때 `Get.updateLocale(locale)`를 콜하십시오. 새로운 지역을 사용하여 자동적으로 번역합니다. + +```dart +var locale = Locale('en', 'US'); +Get.updateLocale(locale); +``` + +#### 시스템 지역 + +`Get.deviceLocale`를 사용해서 시스템 지역을 읽어옵니다. + +```dart +return GetMaterialApp( + locale: Get.deviceLocale, +); +``` + +## 테마 변경 + +테마를 업데이트하기 위해 `GetMaterialApp` 보다 더 상위 위젯을 사용하지 말아 주십시오. 이러면 중복 키가 트리거 될 수 있습니다. 많은 사람들이 테마를 바꾸기 위해 "ThemeProvider" 위젯을 사용하고 있는데 **GetX**는 이런 방식이 필요 없습니다. + +다른 표준사항은 없이 `Get.changeTheme`로 추가하고 간단하게 커스텀 테마를 만들수 있습니다: + +```dart +Get.changeTheme(ThemeData.light()); +``` + +`onTap`에 테마 변경이 있는 버튼 같은 무언가를 만들고 싶다면 두개의 **GetX™** API를 조합하여 가능합니다: + +- 다크`테마`를 사용중인지 확인합니다. +- 그리고 `테마` 변경 API 를 `onPressed`에 넣으면 됩니다: + +```dart +Get.changeTheme(Get.isDarkMode? ThemeData.light(): ThemeData.dark()); +``` + +`.darkmode`가 활성화 될때 _light theme_ 로 바뀔것 이고 _light theme_ 가 활성화되면 _dark theme_ 로 변경될 것입니다. + +## GetConnect + +GetConnect는 http나 websockets으로 프론트와 백엔드의 통신을 위한 쉬운 방법입니다. + +### 기본 구성 + +GetConnect를 간단하게 확장하고 Rest API나 websockets의 GET/POST/PUT/DELETE/SOCKET 메서드를 사용할 수 있습니다. + +```dart +class UserProvider extends GetConnect { + // Get request + Future getUser(int id) => get('http://youapi/users/$id'); + // Post request + Future postUser(Map data) => post('http://youapi/users', body: data); + // Post request with File + Future> postCases(List image) { + final form = FormData({ + 'file': MultipartFile(image, filename: 'avatar.png'), + 'otherFile': MultipartFile(image, filename: 'cover.png'), + }); + return post('http://youapi/users/upload', form); + } + + GetSocket userMessages() { + return socket('https://yourapi/users/socket'); + } +} +``` + +### 커스텀 구성 + +GetConnect는 고도로 커스텀화 할 수 있습니다. base Url을 정의하고 응답자 및 요청을 수정하고 인증자를 정의할 수 있습니다. 그리고 인증 횟수까지 정의 할 수 있습니다. 더해서 추가 구성없이 모델로 응답을 변형시킬 수 있는 표준 디코더 정의도 가능합니다. + +```dart +class HomeProvider extends GetConnect { + @override + void onInit() { + // 모든 요청은 jsonEncode로 CasesModel.fromJson()를 거칩니다. + httpClient.defaultDecoder = CasesModel.fromJson; + httpClient.baseUrl = 'https://api.covid19api.com'; + // baseUrl = 'https://api.covid19api.com'; + // [httpClient] 인스턴트 없이 사용하는경우 Http와 websockets의 baseUrl 정의 + + // 모든 요청의 헤더에 'apikey' 속성을 첨부합니다. + httpClient.addRequestModifier((request) { + request.headers['apikey'] = '12345678'; + return request; + }); + + // 서버가 "Brazil"이란 데이터를 보내더라도 + // 응답이 전달되기 전에 응답의 데이터를 지우기 때문에 + // 사용자에게 표시되지 않을 것입니다. + httpClient.addResponseModifier((request, response) { + CasesModel model = response.body; + if (model.countries.contains('Brazil')) { + model.countries.remove('Brazilll'); + } + }); + + httpClient.addAuthenticator((request) async { + final response = await get("http://yourapi/token"); + final token = response.body['token']; + // 헤더 설정 + request.headers['Authorization'] = "$token"; + return request; + }); + + // 인증자가 HttpStatus가 HttpStatus.unauthorized이면 + // 3번 호출됩니다. + httpClient.maxAuthRetries = 3; + } + } + + @override + Future> getCases(String path) => get(path); +} +``` + +## GetPage Middleware + +GetPage는 GetMiddleWare의 목록을 특정 순서로 실행하는 새로운 프로퍼티를 가집니다. + +**주석**: GetPage가 Middleware를 가질때 페이지의 모든 하위는 같은 Middleware를 자동적으로 가지게 됩니다. + +### Priority + +Middleware의 실행 순서는 GetMiddleware안의 priority에 따라서 설정할 수 있습니다. + +```dart +final middlewares = [ + GetMiddleware(priority: 2), + GetMiddleware(priority: 5), + GetMiddleware(priority: 4), + GetMiddleware(priority: -8), +]; +``` + +이 Middleware는 다음 순서로 실행됩니다. **-8 => 2 => 4 => 5** + +### Redirect + +이 함수는 호출된 라우트의 페이지를 검색할때 호출됩니다. 리다이렉트한 결과로 RouteSettings을 사용합니다. 또는 null을 주면 리다이렉트 하지 않습니다. + +```dart +RouteSettings redirect(String route) { + final authService = Get.find(); + return authService.authed.value ? null : RouteSettings(name: '/login') +} +``` + +### onPageCalled + +이 함수는 생성되지 않은 페이지가 호출될 때 호출됩니다. +페이지에 대한 어떤것을 변경하는데 사용하거나 새로운 페이지를 줄 수 있습니다. + +```dart +GetPage onPageCalled(GetPage page) { + final authService = Get.find(); + return page.copyWith(title: 'Welcome ${authService.UserName}'); +} +``` + +### OnBindingsStart + +이 함수는 Bindings가 초기화되기 바로 직전에 호출됩니다. +여기에서 이 페이지를 위해 Bindings을 변경할 수 있습니다. + +```dart +List onBindingsStart(List bindings) { + final authService = Get.find(); + if (authService.isAdmin) { + bindings.add(AdminBinding()); + } + return bindings; +} +``` + +### OnPageBuildStart + +이 함수는 Bindings가 초기화된 직후에 호출됩니다. +여기에서 bindings를 생성한 후 페이지 위젯을 생성하기 전에 무엇이든 할 수 있습니다. + +```dart +GetPageBuilder onPageBuildStart(GetPageBuilder page) { + print('bindings are ready'); + return page; +} +``` + +### OnPageBuilt + +이 함수는 GetPage.page 함수가 호출된 직후에 호출며 함수의 결과를 제공합니다. 그리고 표시될 위젯을 가져옵니다. + +### OnPageDispose + +이 함수는 페이지의 연관된 모든 오브젝트들(Controllers, views, ...)이 해제된 직후에 호출됩니다. + +## 기타 고급 API + +```dart +// currentScreen에서 현재 인수들을 제공 +Get.arguments + +// 이전 경로의 이름을 제공 +Get.previousRoute + +// rawRoute.isFirst()와 같은 접근에 필요한 원시 경로를 제공 +Get.rawRoute + +// GetObserver로 부터 Rounting API의 접근을 제공 +Get.routing + +// snackbar가 열려 있는지 확인 +Get.isSnackbarOpen + +// dialog가 열려 있는지 확인 +Get.isDialogOpen + +// bottomsheet가 열려 있는지 확인 +Get.isBottomSheetOpen + +// 1개의 경로 제거 +Get.removeRoute() + +// 값이 true가 될때까지 반복적으로 되돌림 +Get.until() + +// 다음 경로로 이동하고 값이 true가 될때까지 이전 모든 경로를 제거 +Get.offUntil() + +// 명명된 다음 경로로 이동하고 값이 true가 될때까지 이전 모든 경로를 제거 +Get.offNamedUntil() + +// 앱이 구동중인 플랫폼을 확인 +GetPlatform.isAndroid +GetPlatform.isIOS +GetPlatform.isMacOS +GetPlatform.isWindows +GetPlatform.isLinux +GetPlatform.isFuchsia + +// 장치 타입을 확인 +GetPlatform.isMobile +GetPlatform.isDesktop +// 모든 플랫폼은 독립적으로 웹을 제공합니다! +// Windows, iOS, OSX, Android 등의 +// 브러우저에서 구동중이면 알 수 있습니다. +GetPlatform.isWeb + + +// MediaQuery.of(context).size.height 과 동일 +// 하지만 불변함. +Get.height +Get.width + +// Navigator의 현재 context를 제공 +Get.context + +// 코드 어디에서든지 foreground에서 snackbar/dialog/bottomsheet의 context를 제공 +Get.contextOverlay + +// 주석: 다음 메서드는 context의 확장입니다. +// UI의 모든 위치에서 컨텍스트에 액세스 할 수 있으므로 UI 코드의 어느 곳에서나 사용할 수 있습니다. + +// 변경되는 height/width(데스크탑이나 브라우저와 같이 늘어날 수 있는 것)가 필요하면 context를 사용해야함 +context.width +context.height + +// 화면의 절반, 1/3 등을 정의할 수 있는 기능을 제공합니다. +// 반응성이 높은 앱에 유용합니다. +// param dividedBy (double) optional - default: 1 +// param reducedBy (double) optional - default: 0 +context.heightTransformer() +context.widthTransformer() + +/// MediaQuery.of(context).size 와 유사함 +context.mediaQuerySize() + +/// MediaQuery.of(context).padding 와 유사함 +context.mediaQueryPadding() + +/// MediaQuery.of(context).viewPadding 와 유사함 +context.mediaQueryViewPadding() + +/// MediaQuery.of(context).viewInsets; 와 유사함 +context.mediaQueryViewInsets() + +/// MediaQuery.of(context).orientation; 와 유사함 +context.orientation() + +/// 장치의 가로 모드 확인 +context.isLandscape() + +/// 장치의 세로 모드 확인 +context.isPortrait() + +/// MediaQuery.of(context).devicePixelRatio; 와 유사함 +context.devicePixelRatio() + +/// MediaQuery.of(context).textScaleFactor; 와 유사함 +context.textScaleFactor() + +/// 화면에서 shortestSide를 제공 +context.mediaQueryShortestSide() + +/// True if width be larger than 800 +context.showNavbar() + +/// shortestSide가 600p 미만이면 True +context.isPhone() + +/// shortestSide가 600p 이상이면 True +context.isSmallTablet() + +/// shortestSide가 720p 이상이면 True +context.isLargeTablet() + +/// 현재 장치가 Tablet이면 True +context.isTablet() + +/// 화면 사이즈에 따라 value를 반환 +/// 반환될 수 있는 값들: +/// watch: shortestSide가 300 미만일 때 +/// mobile: shortestSide가 600 미만일 때 +/// tablet: shortestSide가 1200 미만일 때 +/// desktop: shortestSide가 1200 이상일 때 +context.responsiveValue() +``` + +### 선택적 전역 설정과 수동 구성 + +GetMaterialApp은 모든 것이 구성되어 있지만 원한다면 수동으로 Get을 구성할 수 있습니다. + +```dart +MaterialApp( + navigatorKey: Get.key, + navigatorObservers: [GetObserver()], +); +``` + +`GetObserver`안에 Middleware를 사용할 수 있고 이로 인한 어떤 영향도 없습니다. + +```dart +MaterialApp( + navigatorKey: Get.key, + navigatorObservers: [ + GetObserver(MiddleWare.observer) // Here + ], +); +``` + +`Get`을 위한 _Global Settings_ 을 만들수 있습니다. 어떠한 라우트도 포함되기 전에 `Get.config`에 추가하십시오. +또는 `GetMaterialApp`에 직접 추가 하십시오. + +```dart +GetMaterialApp( + enableLog: true, + defaultTransition: Transition.fade, + opaqueRoute: Get.isOpaqueRouteDefault, + popGesture: Get.isPopGestureEnable, + transitionDuration: Get.defaultDurationTransition, + defaultGlobalState: Get.defaultGlobalState, +); + +Get.config( + enableLog = true, + defaultPopGesture = true, + defaultTransition = Transitions.cupertino +) +``` + +선택적으로 `Get`으로 모든 로그 메세지를 리다이렉트 할 수 있습니다. +만약 유명한 로그 패키지를 사용하고 싶으면 +여기에서 원하는 로그가 있습니다: + +```dart +GetMaterialApp( + enableLog: true, + logWriterCallback: localLogWriter, +); + +void localLogWriter(String text, {bool isError = false}) { + // pass the message to your favourite logging package here + // please note that even if enableLog: false log messages will be pushed in this callback + // you get check the flag if you want through GetConfig.isLogEnable +} + +``` + +### 지역 상태 위젯들 + +이러한 위젯은 단일값을 관리하고 지역적이고 임시적인 상태를 유지합니다. +우리는 반응적이고 단순함을 위해 추가할 수 있습니다. +예를 들어 `TextField`의 obscureText의 전환으로 사용하거나 +커스텀된 확장되는 패널을 만들거나 +`Scaffold`의 body가 변경되는 동안 `BottomNavigationBar`의 현재 index를 수정할 수 있습니다. + +#### ValueBuilder + +업데이트된 값을 되돌려 받는 `.setState`로 작동하는 `StatefulWidget`의 단순화 입니다. + +```dart +ValueBuilder( + initialValue: false, + builder: (value, updateFn) => Switch( + value: value, + onChanged: updateFn, // same signature! you could use ( newValue ) => updateFn( newValue ) + ), + // if you need to call something outside the builder method. + onUpdate: (value) => print("Value updated: $value"), + onDispose: () => print("Widget unmounted"), +), +``` + +#### ObxValue + +[`ValueBuilder`](#valuebuilder)와 비슷하지만 Rx 인스턴스(마법같은 .obs를 기억하세요)를 전달하고 +자동적으로 업데이트되는 반응형 버전입니다... 놀랍지 않습니까? + +```dart +ObxValue((data) => Switch( + value: data.value, + onChanged: data, // Rx에는 호출가능한 함수가 있습니다! (flag) => data.value = flag, 가 사용가능 합니다. + ), + false.obs, +), +``` + +## 유용한 팁 + +`.obs`(_Rx_ 타입이라고 알려진)는 다양한 내부 메서드와 연산자가 있습니다. + +> `.obs`프로퍼티가 **실제 값**이라고 _믿는_ 것은 일반적이지만 실수하지 마십시오! +> 다트의 컴파일러는 충분히 똑똑하고 코드가 깔끔하기 때문에 변수의 타입 선언을 하지 않습니다. +> 하지만: + +```dart +var message = 'Hello world'.obs; +print( 'Message "$message" has Type ${message.runtimeType}'); +``` + +`message`가 실제 String 값을 _출력_ 하더라도 타입은 **RxString**입니다! + +그래서 `message.substring( 0, 4 )`은 사용하지 못합니다. +_observable(.obs)_ 안의 실제 값에 접근해야 합니다: +가장 많이 사용되는 방법은 `.value`지만 사용할 수 있었는지 알고 있었나요... + +```dart +final name = 'GetX'.obs; +// 현재 값과 다른 값이면 stream을 업데이트만 합니다. +name.value = 'Hey'; + +// 모든 Rx 프로퍼티가 "호출 가능"하고 새로운 값을 반환합니다. +// 하지만 이 접근방식은 `null`를 허용하지 않고 UI가 재구축하지 않습니다. +name('Hello'); + +// getter와 과 같이 'Hello'를 출력합니다. +name() ; + +/// 숫자 타입들: + +final count = 0.obs; + +// 기존 숫자 타입으로 모든 변형 불가 작업을 사용할수 있습니다. +count + 1; + +// 주의하세요! 아래는 `count`가 final이 아닌 경우에만 유효합니다. +count += 1; + +// 값들을 비교할 수도 있습니다: +count > 2; + +/// booleans: + +final flag = false.obs; + +// true/false 사이의 전환이 됩니다. +flag.toggle(); + + +/// 모든 타입들: + +// `값`을 null로 셋합니다. +flag.nil(); + +// 모든 toString(), toJson() 함수들은 `값`으로 전달됩니다. +print( count ); // RxInt 내부에서 `toString()`이 호출됩니다. + +final abc = [0,1,2].obs; +// 값을 json 배열로 바꾸고 RxList를 출력합니다. +// Json은 모든 Rx 타입들을 지원합니다! +print('json: ${jsonEncode(abc)}, type: ${abc.runtimeType}'); + +// RxMap, RxList 그리고 RxSet은 그들의 native 타입들을 확장한 특별한 Rx 타입들입니다. +// 반응형이긴 하지만 일반 list로서 RxList가 동작합니다! +abc.add(12); // list에 12가 들어가고 stream을 업데이트합니다. +abc[3]; // List와 같이 인덱스 3을 읽습니다. + + +// 동등비교는 Rx와 값에서 동작하지만 해시코드는 항상 값으로부터 받습니다. +final number = 12.obs; +print( number == 12 ); // prints > true + +/// 커스텀 Rx 모델들: + +// toJson(), toString()은 child에게 지연됩니다. 그래서 이것들을 재정의 하고 직접 관찰하여 print() 할수 있습니다. + +class User { + String name, last; + int age; + User({this.name, this.last, this.age}); + + @override + String toString() => '$name $last, $age years old'; +} + +final user = User(name: 'John', last: 'Doe', age: 33).obs; + +// `user`는 "반응형"이지만 내부 프로퍼티들은 아닙니다! +// 그래서 만약 내부의 변수를 바꾸면... +user.value.name = 'Roi'; +// 위젯은 재구성 되지 않을것 입니다! +// user의 내부의 무언가가 바뀌어도 `Rx`는 알 수가 않습니다. +// 그래서 커스텀 클래스들은 수동으로 바뀌었다고 "알릴" 필요가 있습니다. +user.refresh(); + +// 또는 `update()` 함수를 사용할 수 있습니다! +user.update((value){ + value.name='Roi'; +}); + +print( user ); +``` +## StateMixin + +`UI` 상태를 처리하는 또 다른 방법은 `StateMixin` 를 사용하는 것입니다. +이를 구현하려면 `with`를 사용하여 `StateMixin`을 추가하고 +T 모델을 허용하는 컨트롤러에 연결합니다. + +``` dart +class Controller extends GetController with StateMixin{} +``` + +`change()` 메소드는 우리가 원할 때마다 State를 변경합니다. +다음과 같이 데이터와 상태를 전달하면 됩니다: + +```dart +change(data, status: RxStatus.success()); +``` + +RxStatus는 다음 상태를 허용합니다: + +``` dart +RxStatus.loading(); +RxStatus.success(); +RxStatus.empty(); +RxStatus.error('message'); +``` + +UI에서 사용하는 방법: + +```dart +class OtherClass extends GetView { + @override + Widget build(BuildContext context) { + return Scaffold( + + body: controller.obx( + (state)=>Text(state.name), + + // 여기에 사용자 정의 로딩 표시기를 넣을 수 있지만 + // 기본값은 Center(child:CircularProgressIndicator()) 입니다 + onLoading: CustomLoadingIndicator(), + onEmpty: Text('No data found'), + + // 여기에서도 자신의 오류 위젯을 설정할 수 있지만 + // 기본값은 Center(child:Text(error)) 입니다 + onError: (error)=>Text(error), + ), + ); +} +``` + +#### GetView + +이 위젯을 사랑합니다. 매우 간단하고 유용합니다! + +등록된 `Controller`인 `controller`의 getter로 가져온 `const Stateless`위젯 입니다. 이게 전부입니다. + +```dart + class AwesomeController extends GetxController { + final String title = 'My Awesome View'; + } + + // controller를 등록할때 사용한 `타입`을 전달하는 것을 항상 기억하세요! + class AwesomeView extends GetView { + @override + Widget build(BuildContext context) { + return Container( + padding: EdgeInsets.all(20), + child: Text(controller.title), // 단지 `controller.something`을 호출합니다. + ); + } + } +``` + +#### GetResponsiveView + +ResponsiveView 를 빌드하려면 이 위젯을 확장하세요. 이 위젯에는 화면 크기 및 유형에 대한 모든 정보가 있는 화면 속성이 포함되어 있습니다. + +##### 사용 방법 + +그것을 빌드하기 위한 두가지 옵션이 있습니다. +- `builder` method 를 사용하면 빌드 할 위젯을 반환합니다. +- `desktop`, `tablet`, `phone`, `watch` method를 사용하면 특정 메소드는 screen type 이 일치할때 빌드됩니다. Screen type이 [ScreenType.Tablet] 일때, tablet method 가 스며나옵니다. 참고: 만약 이 method 를 사용할 경우, `alwaysUseBuilder` 프로퍼티를 `false` 로 설정해주세요. + +`settings` 프로퍼티를 사용하면 screen types 를 위한 width limit 를 설정할 수 있습니다. + +![example](https://github.com/SchabanBo/get_page_example/blob/master/docs/Example.gif?raw=true) +Code to this screen +[code](https://github.com/SchabanBo/get_page_example/blob/master/lib/pages/responsive_example/responsive_view.dart) + +#### GetWidget + +대부분의 사람들이 이 위젯에대해 모르거나 사용법을 완전히 혼동합니다. +사용 사례는 매우 드물지만 매우 구체적입니다: Controller를 `caches`합니다. +_cache_ 이기 때문에 `const Stateless`가 될 수 없습니다. + +> 그러면 언제 Controller를 "cache"할 필요가 있을까요? + +만약 **GetX**의 기능 중 또 다른 "흔하지 않은" 기능을 사용하는 경우:`Get.create()` + +`Get.create(()=>Controller())`가 `Get.find()`을 호출할 때마다 +새로운 `Controller`를 생성할 것 입니다. + +여기서 `GetWidget`이 빛나게 됩니다... 예를 들어 Todo 리스트를 유지하려고 사용할 때 입니다. +위젯이 "재구성"될때 동일한 controller 인스턴스를 유지할 것입니다. + +#### GetxService + +이 클래스틑 `GetxController`와 같이 동일한 생성주기(`onInit()`, `onReady()`, `onClose()`)를 공유합니다. +하지만 이안에 "로직"은 없습니다. 단지 **GetX** 종속성 주입 시스템이 하위클래스를 메모리에서 +**삭제할 수 없음**을 알립니다. + +그래서 `Get.find()`로 활성화하고 항상 접근하는 "서비스들"을 유지하는데 매우 유용합니다. : +`ApiService`, `StorageService`, `CacheService`. + +```dart +Future main() async { + await initServices(); /// 서비스들 초기화를 기다림. + runApp(SomeApp()); +} + +/// 플러터 앱이 실행되기 전에 서비스들을 초기화하는 현명한 방법입니다. +/// 실행 흐름을 제어 할수 있으므로(테마 구성, apiKey, 사용자가 정의한 언어등을 로드해야 할 필요가 있으므로 +/// ApiService의 구동전에 SettingService를 로드해야 합니다. +/// 그래서 GetMaterialApp()은 재구성하지 않고 직접적으로 값을 가져옵니다. +Future initServices() async { + print('starting services ...'); + /// 여기에서 get_storage, hive, shared_pref 초기화를 하세요. + /// 또는 연결 고정 또는 비동기적인 무엇이든 하세요. + await Get.putAsync(() => DbService().init()); + await Get.putAsync(SettingsService()).init(); + print('All services started...'); +} + +class DbService extends GetxService { + Future init() async { + print('$runtimeType delays 2 sec'); + await 2.delay(); + print('$runtimeType ready!'); + return this; + } +} + +class SettingsService extends GetxService { + void init() async { + print('$runtimeType delays 1 sec'); + await 1.delay(); + print('$runtimeType ready!'); + } +} + +``` + +`GetxService`를 실질적으로 지우는 한가지 방법은 앱의 "Hot Reboot"과 같은 `Get.reset()`뿐 입니다. +따라서 앱 실행중 절대로 유지되어야 하는 클래스 인스턴스가 필요하면 +`GetxService`를 사용하세요. + +### 테스트 + +당신은 당신의 컨트롤러들을 생성주기를 포함하여 다른 어떤 클래스처럼 테스트할 수 있습니다 : + +```dart +class Controller extends GetxController { + @override + void onInit() { + super.onInit(); + //name2로 값 변경 + name.value = 'name2'; + } + + @override + void onClose() { + name.value = ''; + super.onClose(); + } + + final name = 'name1'.obs; + + void changeName() => name.value = 'name3'; +} + +void main() { + test(''' +Test the state of the reactive variable "name" across all of its lifecycles''', + () { + /// 당신은 생성주기를 제외하고 컨트롤러를 테스트할 수 있습니다, + /// 그러나 당신이 사용하지 않는다면 추천되지 않습니다 + /// GetX 종속성 주입 + final controller = Controller(); + expect(controller.name.value, 'name1'); + + /// 당신이 그것을 사용한다면, 당신은 모든 것을 테스트할 수 있습니다, + /// 각각의 생성주기 이후 어플리케이션의 상태를 포함하여. + Get.put(controller); // onInit was called + expect(controller.name.value, 'name2'); + + /// 당신의 함수를 테스트하세요 + controller.changeName(); + expect(controller.name.value, 'name3'); + + /// onClose 호출됨 + Get.delete(); + + expect(controller.name.value, ''); + }); +} +``` + +#### 팁들 + +##### Mockito 또는 mocktail +당신이 당신의 GetxController/GetxService를 모킹하려고 한다면, 당신은 GetxController를 extend 하고, Mock과 mixin 하라, 그렇게 되면 + +```dart +class NotificationServiceMock extends GetxService with Mock implements NotificationService {} +``` + +##### Get.reset() 사용하기 +당신이 위젯 또는 테스트 그룹을 테스트하고 있다면, 당신의 테스트의 마지막 또는 해제 때 당신의 이전 테스트에서 모든 설정을 리셋하기 위해 Get.rest을 사용하십시오 + +##### Get.testMode +당신이 당신의 컨트롤러에서 당신의 네비게이션을 사용하고 있다면, 당신의 메인의 시작에 `Get.testMode = true` 를 사용하십시오. + + +# 2.0의 주요 변경점 + +1- Rx 타입들: + +| 이전 | 이후 | +| ------- | ---------- | +| StringX | `RxString` | +| IntX | `RxInt` | +| MapX | `RxMap` | +| ListX | `RxList` | +| NumX | `RxNum` | +| DoubleX | `RxDouble` | + +RxController와 GetBuilder는 합쳐졌습니다. 더이상 사용할 controller를 기억시킬 필요가 없습니다. GetxController를 사용하세요. 단순 및 반응형 상태관리 모두에서 잘 동작합니다. + +2- 명명된 라우트 +이전: + +```dart +GetMaterialApp( + namedRoutes: { + '/': GetRoute(page: Home()), + } +) +``` + +지금: + +```dart +GetMaterialApp( + getPages: [ + GetPage(name: '/', page: () => Home()), + ] +) +``` + +무엇이 달라졌습니까? +종종 매개 변수 또는 로그인 토큰에 의해 표시 할 페이지를 결정해야 할 수 있습니다. 이전 접근 방식은 이를 허용하지 않았기 때문에 유연하지 않았습니다. +페이지를 함수에 삽입하면 앱이 시작된 이후 라우트가 메모리에 할당되지 않고 이러한 유형의 접근 방식이 가능하기 때문에 RAM 소비가 크게 감소했습니다: + +```dart + +GetStorage box = GetStorage(); + +GetMaterialApp( + getPages: [ + GetPage(name: '/', page:(){ + return box.hasData('token') ? Home() : Login(); + }) + ] +) +``` + +# 왜 Getx인가? + +1- 플러터가 업데이트된 이후 자주 많은 패키지가 깨졌을 것입니다. 때때로 컴파일중 에러가 발생하고 종종 이에 대해 답변을 해줄 사람이 없었을 겁니다. 그리고 개발자는 에러가 어디에서 발생했는지 추적해서 알아야합니다. 그리고 오직 리포지트리를 통해서 이슈를 오픈하고 해결책을 찾아야합니다. Get은 개발을 위한 주 리소스들(상태, 종속성, 라우트 관리)을 중앙화합니다. pubspec에 단일 패키지를 추가하고 작업을 시작 할 수 있습니다. 플러터가 업데이트 된 이후에도 Get 의존을 업데이트하면 작업할 수 있습니다. Get은 호환성 이슈도 해결합니다. 한 버전에서 종속적으로 사용하여 다른 버전에서 다른 버전을 사용할때 패키지 버전이 다른 버전과 호환되지 않는 경우가 몇 번입니까? 모든 것이 동일한 패키지에 있고 완벽하게 호환되므로 Get을 사용하면 문제가 되지 않습니다. + +2- 플러터는 쉽고 놀랍지만 대다수의 개발자들이 원하지 않는 몇가지 상용구가 있습니다. `Navigator.of(context).push (context, builder [...]` 같은 것들 입니다. Get은 개발을 단순화합니다. 라우트를 위해 8줄의 코드를 작성하고 `Get.to(Home())`만 하면 다음 페이지로 갈 수 있습니다. 동적 웹 url은 현재 플러터에서 정말로 고통스러운 것이고 GetX로 하는 것은 정말 간단합니다. 플러터에서 상태와 종속성을 관리하는 것은 pub에서 수백가지의 패턴이라 많은 논의를 생산합니다. 그러나 변수 끝에 ".obs"를 추가하고 위젯을 Obx 안에 배치하는 것만큼 쉬운 것은 없습니다. 이것으로 해당 변수가 업데이트되면 화면에 자동으로 업데이트됩니다. + +3- 성능에 대하여 걱정하지 않아도 됩니다. 플러터의 성능은 이미 놀랍습니다. 하지만 상태관리자를 사용하고 blocs/stores/controllers 등의 클래스들을 로케이터로 배포하는 것을 상상해보십시오. 종속성이 필요 없는 경우 종속성 제외를 수동으로 호출해야 합니다. 하지만 간단하게 controller를 사용하고 이것들을 더이상 사용하지 않을때 간단하게 메모리에서 삭제될수 있을까요? 이것이 GetX가 하는 일입니다. SmartManagement를 사용하면 사용하지 않는 모든것이 메모리에서 삭제되기 때문에 프로그래밍 말고 다른 걱정을 할 필요가 없습니다. 이러한 로직을 만들지 않고도 최소한의 리소스만 사용함을 보장합니다. + +4- 실질적으로 분리됨. "비즈니스 로직으로부터 뷰를 분리"라는 개념을 들어보셨을 겁니다. 이것은 BLoC, MVC, MVVM의 특징이 아니며 이미 나와 있는 또 다른 표준 개념입니다. 그러나 이 개념은 context의 사용으로 인해 플러터에서 종종 완화됩니다. +만약 InheritedWidget을 찾기 위해 context가 필요하면 뷰나 파라미터로 conetext를 전달해야 합니다. 저는 특히 이 방식이 매우 별로이고 팀의 작업이 항상 뷰의 비즈니스 로직에 의존하게 됩니다. GetX는 표준 접근에서 비정통적이고 StatefulWidgets, InitState 등의 사용을 완전 배제하지 않지만 항상 깔끔하게 유사한 접근을 제공합니다. 예를 들어 Controllers의 수명주기에서 APIREST 요청이 필요할 때 뷰에 어떤 것도 의존할 필요가 없습니다. http 호출의 초기화를 onInit 에서 사용가능 하고 데이터가 도착하면 변수들이 채워집니다. GetX는 완전히 반응형이며(실제 스트림으로 동작) 아이탬중 하나가 채워지면 이 변수를 사용중인 모든 위젯이 자동적으로 화면에서 갱신됩니다. 이를 통해 UI 전문가는 위젯으로만 작업하고 사용자 이벤트(예 : 버튼 클릭) 이외의 비즈니스 로직에 아무것도 보낼 필요가 없으며 비즈니스 로직을 개발하는 사람들은 비즈니스 로직을 별도로 만들고 테스트 할 수 있습니다. + +이 라이브러리는 항상 업데이트되고 새로운 기능이 포함됩니다. 자유롭게 PR을 제공하고 여기에 기여하세요. + +# 커뮤니티 + +## 커뮤니티 채널 + +GetX에는 매우 활동적이고 유용한 커뮤니티가 있습니다. 이 프레임워크의 사용과 관련하여 질문이 있거나 도움이 필요한 경우 커뮤니티 채널에 가입하십시오. 질문에 대한 답변이 더 빨리 제공되며 가장 적합한 장소가 될 것입니다. 이 저장소는 이슈오픈 및 리소스 요청 전용이지만 GetX 커뮤니티의 일부에 속해있습니다. + +| **Slack** | **Discord** | **Telegram** | +| :-------------------------------------------------------------------------------------------------------------------------- | :-------------------------------------------------------------------------------------------------------------------------- | :-------------------------------------------------------------------------------------------------------------------- | +| [![Get on Slack](https://img.shields.io/badge/slack-join-orange.svg)](https://communityinviter.com/apps/getxworkspace/getx) | [![Discord Shield](https://img.shields.io/discord/722900883784073290.svg?logo=discord)](https://discord.com/invite/9Hpt99N) | [![Telegram](https://img.shields.io/badge/chat-on%20Telegram-blue.svg)](https://t.me/joinchat/PhdbJRmsZNpAqSLJL6bH7g) | + +## 기여하는 방법 + +_프로젝트에 기여하고 싶으신가요? 우리는 귀하를 우리의 협력자 중 한 명으로 부각시켜 자랑스럽게 생각합니다. 다음은 Get(그리고 플러터)을 더욱 향상시키고 기여할 수 있는 몇 가지 사항입니다._ + +- readme을 다른 언어로 번역하는 데 도움이 됩니다. +- readme에 문서를 추가합니다(Get의 많은 기능이 아직 문서화되지 않았습니다). +- Get 사용법을 설명하는 기사를 쓰거나 비디오를 만듭니다(읽기 및 향후 위키에 삽입될 예정). +- 코드/테스트에 대한 PR을 제공합니다. +- 새로운 기능을 포함합니다. + +어떤 기여도 환영합니다! + +## 기사 및 비디오 + +- [Flutter Getx EcoSystem package for arabic people](https://www.youtube.com/playlist?list=PLV1fXIAyjeuZ6M8m56zajMUwu4uE3-SL0) - Tutorial by [Pesa Coder](https://github.com/UsamaElgendy). +- [Dynamic Themes in 3 lines using GetX™](https://medium.com/swlh/flutter-dynamic-themes-in-3-lines-c3b375f292e3) - Tutorial by [Rod Brown](https://github.com/RodBr). +- [Complete GetX™ Navigation](https://www.youtube.com/watch?v=RaqPIoJSTtI) - Route management video by Amateur Coder. +- [Complete GetX State Management](https://www.youtube.com/watch?v=CNpXbeI_slw) - State management video by Amateur Coder. +- [GetX™ Other Features](https://youtu.be/ttQtlX_Q0eU) - Utils, storage, bindings and other features video by Amateur Coder. +- [Firestore User with GetX | Todo App](https://www.youtube.com/watch?v=BiV0DcXgk58) - Video by Amateur Coder. +- [Firebase Auth with GetX | Todo App](https://www.youtube.com/watch?v=-H-T_BSgfOE) - Video by Amateur Coder. +- [The Flutter GetX™ Ecosystem ~ State Management](https://medium.com/flutter-community/the-flutter-getx-ecosystem-state-management-881c7235511d) - State management by [Aachman Garg](https://github.com/imaachman). +- [The Flutter GetX™ Ecosystem ~ Dependency Injection](https://medium.com/flutter-community/the-flutter-getx-ecosystem-dependency-injection-8e763d0ec6b9) - Dependency Injection by [Aachman Garg](https://github.com/imaachman). +- [GetX, the all-in-one Flutter package](https://www.youtube.com/watch?v=IYQgtu9TM74) - A brief tutorial covering State Management and Navigation by Thad Carnevalli. +- [Build a To-do List App from scratch using Flutter and GetX](https://www.youtube.com/watch?v=EcnqFasHf18) - UI + State Management + Storage video by Thad Carnevalli. +- [GetX Flutter Firebase Auth Example](https://medium.com/@jeffmcmorris/getx-flutter-firebase-auth-example-b383c1dd1de2) - Article by Jeff McMorris. +- [Flutter State Management with GetX – Complete App](https://www.appwithflutter.com/flutter-state-management-with-getx/) - by App With Flutter. +- [Flutter Routing with Animation using Get Package](https://www.appwithflutter.com/flutter-routing-using-get-package/) - by App With Flutter. +- [A minimal example on dartpad](https://dartpad.dev/2b3d0d6f9d4e312c5fdbefc414c1727e?) - by [Roi Peker](https://github.com/roipeker) diff --git a/siro_rider/packages/get/README.md b/siro_rider/packages/get/README.md new file mode 100644 index 0000000..956dd52 --- /dev/null +++ b/siro_rider/packages/get/README.md @@ -0,0 +1,1276 @@ +![](https://raw.githubusercontent.com/jonataslaw/getx-community/master/get.png) + +[![pub package](https://img.shields.io/pub/v/get.svg?label=get&color=blue)](https://pub.dev/packages/get) +[![popularity](https://badges.bar/get/popularity)](https://pub.dev/packages/sentry/score) +[![likes](https://badges.bar/get/likes)](https://pub.dev/packages/get/score) +[![pub points](https://badges.bar/get/pub%20points)](https://pub.dev/packages/get/score) +![building](https://github.com/jonataslaw/get/workflows/build/badge.svg) +[![style: effective dart](https://img.shields.io/badge/style-effective_dart-40c4ff.svg)](https://pub.dev/packages/effective_dart) +[![Discord Shield](https://img.shields.io/discord/722900883784073290.svg?logo=discord)](https://discord.com/invite/9Hpt99N) +[![Get on Slack](https://img.shields.io/badge/slack-join-orange.svg)](https://communityinviter.com/apps/getxworkspace/getx) +[![Telegram](https://img.shields.io/badge/chat-on%20Telegram-blue.svg)](https://t.me/joinchat/PhdbJRmsZNpAqSLJL6bH7g) + +Awesome Flutter + +Buy Me A Coffee + +![](https://raw.githubusercontent.com/jonataslaw/getx-community/master/getx.png) + + +
+ +**Languages:** + + +[![English](https://img.shields.io/badge/Language-English-blueviolet?style=for-the-badge)](README.md) +[![Vietnamese](https://img.shields.io/badge/Language-Vietnamese-blueviolet?style=for-the-badge)](README-vi.md) +[![Indonesian](https://img.shields.io/badge/Language-Indonesian-blueviolet?style=for-the-badge)](README.id-ID.md) +[![Urdu](https://img.shields.io/badge/Language-Urdu-blueviolet?style=for-the-badge)](README.ur-PK.md) +[![Chinese](https://img.shields.io/badge/Language-Chinese-blueviolet?style=for-the-badge)](README.zh-cn.md) +[![Portuguese](https://img.shields.io/badge/Language-Portuguese-blueviolet?style=for-the-badge)](README.pt-br.md) +[![Spanish](https://img.shields.io/badge/Language-Spanish-blueviolet?style=for-the-badge)](README-es.md) +[![Russian](https://img.shields.io/badge/Language-Russian-blueviolet?style=for-the-badge)](README.ru.md) +[![Polish](https://img.shields.io/badge/Language-Polish-blueviolet?style=for-the-badge)](README.pl.md) +[![Korean](https://img.shields.io/badge/Language-Korean-blueviolet?style=for-the-badge)](README.ko-kr.md) +[![French](https://img.shields.io/badge/Language-French-blueviolet?style=for-the-badge)](README-fr.md) +[![Japanese](https://img.shields.io/badge/Language-Japanese-blueviolet?style=for-the-badge)](README.ja-JP.md) + + +
+ +- [About Get](#about-get) +- [Installing](#installing) +- [Counter App with GetX](#counter-app-with-getx) +- [The Three pillars](#the-three-pillars) + - [State management](#state-management) + - [Reactive State Manager](#reactive-state-manager) + - [More details about state management](#more-details-about-state-management) + - [Route management](#route-management) + - [More details about route management](#more-details-about-route-management) + - [Dependency management](#dependency-management) + - [More details about dependency management](#more-details-about-dependency-management) +- [Utils](#utils) + - [Internationalization](#internationalization) + - [Translations](#translations) + - [Using translations](#using-translations) + - [Locales](#locales) + - [Change locale](#change-locale) + - [System locale](#system-locale) + - [Change Theme](#change-theme) + - [GetConnect](#getconnect) + - [Default configuration](#default-configuration) + - [Custom configuration](#custom-configuration) + - [GetPage Middleware](#getpage-middleware) + - [Priority](#priority) + - [Redirect](#redirect) + - [onPageCalled](#onpagecalled) + - [OnBindingsStart](#onbindingsstart) + - [OnPageBuildStart](#onpagebuildstart) + - [OnPageBuilt](#onpagebuilt) + - [OnPageDispose](#onpagedispose) + - [Other Advanced APIs](#other-advanced-apis) + - [Optional Global Settings and Manual configurations](#optional-global-settings-and-manual-configurations) + - [Local State Widgets](#local-state-widgets) + - [ValueBuilder](#valuebuilder) + - [ObxValue](#obxvalue) + - [Useful tips](#useful-tips) + - [GetView](#getview) + - [GetResponsiveView](#getresponsiveview) + - [How to use it](#how-to-use-it) + - [GetWidget](#getwidget) + - [GetxService](#getxservice) +- [Breaking changes from 2.0](#breaking-changes-from-20) +- [Why Getx?](#why-getx) +- [Community](#community) + - [Community channels](#community-channels) + - [How to contribute](#how-to-contribute) + - [Articles and videos](#articles-and-videos) + +# About Get + +- GetX is an extra-light and powerful solution for Flutter. It combines high-performance state management, intelligent dependency injection, and route management quickly and practically. + +- GetX has 3 basic principles. This means that these are the priority for all resources in the library: **PRODUCTIVITY, PERFORMANCE AND ORGANIZATION.** + + - **PERFORMANCE:** GetX is focused on performance and minimum consumption of resources. GetX does not use Streams or ChangeNotifier. + + - **PRODUCTIVITY:** GetX uses an easy and pleasant syntax. No matter what you want to do, there is always an easier way with GetX. It will save hours of development and will provide the maximum performance your application can deliver. + + Generally, the developer should be concerned with removing controllers from memory. With GetX this is not necessary because resources are removed from memory when they are not used by default. If you want to keep it in memory, you must explicitly declare "permanent: true" in your dependency. That way, in addition to saving time, you are less at risk of having unnecessary dependencies on memory. Dependency loading is also lazy by default. + + - **ORGANIZATION:** GetX allows the total decoupling of the View, presentation logic, business logic, dependency injection, and navigation. You do not need context to navigate between routes, so you are not dependent on the widget tree (visualization) for this. You don't need context to access your controllers/blocs through an inheritedWidget, so you completely decouple your presentation logic and business logic from your visualization layer. You do not need to inject your Controllers/Models/Blocs classes into your widget tree through `MultiProvider`s. For this, GetX uses its own dependency injection feature, decoupling the DI from its view completely. + + With GetX you know where to find each feature of your application, having clean code by default. In addition to making maintenance easy, this makes the sharing of modules something that until then in Flutter was unthinkable, something totally possible. + BLoC was a starting point for organizing code in Flutter, it separates business logic from visualization. GetX is a natural evolution of this, not only separating the business logic but the presentation logic. Bonus injection of dependencies and routes are also decoupled, and the data layer is out of it all. You know where everything is, and all of this in an easier way than building a hello world. + GetX is the easiest, practical, and scalable way to build high-performance applications with the Flutter SDK. It has a large ecosystem around it that works perfectly together, it's easy for beginners, and it's accurate for experts. It is secure, stable, up-to-date, and offers a huge range of APIs built-in that are not present in the default Flutter SDK. + +- GetX is not bloated. It has a multitude of features that allow you to start programming without worrying about anything, but each of these features are in separate containers and are only started after use. If you only use State Management, only State Management will be compiled. If you only use routes, nothing from the state management will be compiled. + +- GetX has a huge ecosystem, a large community, a large number of collaborators, and will be maintained as long as the Flutter exists. GetX too is capable of running with the same code on Android, iOS, Web, Mac, Linux, Windows, and on your server. + **It is possible to fully reuse your code made on the frontend on your backend with [Get Server](https://github.com/jonataslaw/get_server)**. + +**In addition, the entire development process can be completely automated, both on the server and on the front end with [Get CLI](https://github.com/jonataslaw/get_cli)**. + +**In addition, to further increase your productivity, we have the +[extension to VSCode](https://marketplace.visualstudio.com/items?itemName=get-snippets.get-snippets) and the [extension to Android Studio/Intellij](https://plugins.jetbrains.com/plugin/14975-getx-snippets)** + +# Installing + +Add Get to your pubspec.yaml file: + +```yaml +dependencies: + get: +``` + +Import get in files that it will be used: + +```dart +import 'package:get/get.dart'; +``` + +# Counter App with GetX + +The "counter" project created by default on new project on Flutter has over 100 lines (with comments). To show the power of Get, I will demonstrate how to make a "counter" changing the state with each click, switching between pages and sharing the state between screens, all in an organized way, separating the business logic from the view, in ONLY 26 LINES CODE INCLUDING COMMENTS. + +- Step 1: + Add "Get" before your MaterialApp, turning it into GetMaterialApp + +```dart +void main() => runApp(GetMaterialApp(home: Home())); +``` + +- Note: this does not modify the MaterialApp of the Flutter, GetMaterialApp is not a modified MaterialApp, it is just a pre-configured Widget, which has the default MaterialApp as a child. You can configure this manually, but it is definitely not necessary. GetMaterialApp will create routes, inject them, inject translations, inject everything you need for route navigation. If you use Get only for state management or dependency management, it is not necessary to use GetMaterialApp. GetMaterialApp is necessary for routes, snackbars, internationalization, bottomSheets, dialogs, and high-level apis related to routes and absence of context. +- Note²: This step is only necessary if you gonna use route management (`Get.to()`, `Get.back()` and so on). If you not gonna use it then it is not necessary to do step 1 + +- Step 2: + Create your business logic class and place all variables, methods and controllers inside it. + You can make any variable observable using a simple ".obs". + +```dart +class Controller extends GetxController{ + var count = 0.obs; + increment() => count++; +} +``` + +- Step 3: + Create your View, use StatelessWidget and save some RAM, with Get you may no longer need to use StatefulWidget. + +```dart +class Home extends StatelessWidget { + + @override + Widget build(context) { + + // Instantiate your class using Get.put() to make it available for all "child" routes there. + final Controller c = Get.put(Controller()); + + return Scaffold( + // Use Obx(()=> to update Text() whenever count is changed. + appBar: AppBar(title: Obx(() => Text("Clicks: ${c.count}"))), + + // Replace the 8 lines Navigator.push by a simple Get.to(). You don't need context + body: Center(child: ElevatedButton( + child: Text("Go to Other"), onPressed: () => Get.to(Other()))), + floatingActionButton: + FloatingActionButton(child: Icon(Icons.add), onPressed: c.increment)); + } +} + +class Other extends StatelessWidget { + // You can ask Get to find a Controller that is being used by another page and redirect you to it. + final Controller c = Get.find(); + + @override + Widget build(context){ + // Access the updated count variable + return Scaffold(body: Center(child: Text("${c.count}"))); + } +} +``` + +Result: + +![](https://raw.githubusercontent.com/jonataslaw/getx-community/master/counter-app-gif.gif) + +This is a simple project but it already makes clear how powerful Get is. As your project grows, this difference will become more significant. + +Get was designed to work with teams, but it makes the job of an individual developer simple. + +Improve your deadlines, deliver everything on time without losing performance. Get is not for everyone, but if you identified with that phrase, Get is for you! + +# The Three pillars + +## State management + +Get has two different state managers: the simple state manager (we'll call it GetBuilder) and the reactive state manager (GetX/Obx) + +### Reactive State Manager + +Reactive programming can alienate many people because it is said to be complicated. GetX turns reactive programming into something quite simple: + +- You won't need to create StreamControllers. +- You won't need to create a StreamBuilder for each variable +- You will not need to create a class for each state. +- You will not need to create a get for an initial value. +- You will not need to use code generators + +Reactive programming with Get is as easy as using setState. + +Let's imagine that you have a name variable and want that every time you change it, all widgets that use it are automatically changed. + +This is your count variable: + +```dart +var name = 'Jonatas Borges'; +``` + +To make it observable, you just need to add ".obs" to the end of it: + +```dart +var name = 'Jonatas Borges'.obs; +``` + +And in the UI, when you want to show that value and update the screen whenever the values changes, simply do this: + +```dart +Obx(() => Text("${controller.name}")); +``` + +That's all. It's _that_ simple. + +### More details about state management + +**See an more in-depth explanation of state management [here](./documentation/en_US/state_management.md). There you will see more examples and also the difference between the simple state manager and the reactive state manager** + +You will get a good idea of GetX power. + +## Route management + +If you are going to use routes/snackbars/dialogs/bottomsheets without context, GetX is excellent for you too, just see it: + +Add "Get" before your MaterialApp, turning it into GetMaterialApp + +```dart +GetMaterialApp( // Before: MaterialApp( + home: MyHome(), +) +``` + +Navigate to a new screen: + +```dart + +Get.to(NextScreen()); +``` + +Navigate to new screen with name. See more details on named routes [here](./documentation/en_US/route_management.md#navigation-with-named-routes) + +```dart + +Get.toNamed('/details'); +``` + +To close snackbars, dialogs, bottomsheets, or anything you would normally close with Navigator.pop(context); + +```dart +Get.back(); +``` + +To go to the next screen and no option to go back to the previous screen (for use in SplashScreens, login screens, etc.) + +```dart +Get.off(NextScreen()); +``` + +To go to the next screen and cancel all previous routes (useful in shopping carts, polls, and tests) + +```dart +Get.offAll(NextScreen()); +``` + +Noticed that you didn't have to use context to do any of these things? That's one of the biggest advantages of using Get route management. With this, you can execute all these methods from within your controller class, without worries. + +### More details about route management + +**Get works with named routes and also offers lower-level control over your routes! There is in-depth documentation [here](./documentation/en_US/route_management.md)** + +## Dependency management + +Get has a simple and powerful dependency manager that allows you to retrieve the same class as your Bloc or Controller with just 1 lines of code, no Provider context, no inheritedWidget: + +```dart +Controller controller = Get.put(Controller()); // Rather Controller controller = Controller(); +``` + +- Note: If you are using Get's State Manager, pay more attention to the bindings API, which will make it easier to connect your view to your controller. + +Instead of instantiating your class within the class you are using, you are instantiating it within the Get instance, which will make it available throughout your App. +So you can use your controller (or class Bloc) normally + +**Tip:** Get dependency management is decoupled from other parts of the package, so if for example, your app is already using a state manager (any one, it doesn't matter), you don't need to rewrite it all, you can use this dependency injection with no problems at all + +```dart +controller.fetchApi(); +``` + +Imagine that you have navigated through numerous routes, and you need data that was left behind in your controller, you would need a state manager combined with the Provider or Get_it, correct? Not with Get. You just need to ask Get to "find" for your controller, you don't need any additional dependencies: + +```dart +Controller controller = Get.find(); +//Yes, it looks like Magic, Get will find your controller, and will deliver it to you. You can have 1 million controllers instantiated, Get will always give you the right controller. +``` + +And then you will be able to recover your controller data that was obtained back there: + +```dart +Text(controller.textFromApi); +``` + +### More details about dependency management + +**See a more in-depth explanation of dependency management [here](./documentation/en_US/dependency_management.md)** + +# Utils + +## Internationalization + +### Translations + +Translations are kept as a simple key-value dictionary map. +To add custom translations, create a class and extend `Translations`. + +```dart +import 'package:get/get.dart'; + +class Messages extends Translations { + @override + Map> get keys => { + 'en_US': { + 'hello': 'Hello World', + }, + 'de_DE': { + 'hello': 'Hallo Welt', + } + }; +} +``` + +#### Using translations + +Just append `.tr` to the specified key and it will be translated, using the current value of `Get.locale` and `Get.fallbackLocale`. + +```dart +Text('title'.tr); +``` + +#### Using translation with singular and plural + +```dart +var products = []; +Text('singularKey'.trPlural('pluralKey', products.length, Args)); +``` + +#### Using translation with parameters + +```dart +import 'package:get/get.dart'; + + +Map> get keys => { + 'en_US': { + 'logged_in': 'logged in as @name with email @email', + }, + 'es_ES': { + 'logged_in': 'iniciado sesión como @name con e-mail @email', + } +}; + +Text('logged_in'.trParams({ + 'name': 'Jhon', + 'email': 'jhon@example.com' + })); +``` + +### Locales + +Pass parameters to `GetMaterialApp` to define the locale and translations. + +```dart +return GetMaterialApp( + translations: Messages(), // your translations + locale: Locale('en', 'US'), // translations will be displayed in that locale + fallbackLocale: Locale('en', 'UK'), // specify the fallback locale in case an invalid locale is selected. +); +``` + +#### Change locale + +Call `Get.updateLocale(locale)` to update the locale. Translations then automatically use the new locale. + +```dart +var locale = Locale('en', 'US'); +Get.updateLocale(locale); +``` + +#### System locale + +To read the system locale, you could use `Get.deviceLocale`. + +```dart +return GetMaterialApp( + locale: Get.deviceLocale, +); +``` + +## Change Theme + +Please do not use any higher level widget than `GetMaterialApp` in order to update it. This can trigger duplicate keys. A lot of people are used to the prehistoric approach of creating a "ThemeProvider" widget just to change the theme of your app, and this is definitely NOT necessary with **GetX™**. + +You can create your custom theme and simply add it within `Get.changeTheme` without any boilerplate for that: + +```dart +Get.changeTheme(ThemeData.light()); +``` + +If you want to create something like a button that changes the Theme in `onTap`, you can combine two **GetX™** APIs for that: + +- The api that checks if the dark `Theme` is being used. +- And the `Theme` Change API, you can just put this within an `onPressed`: + +```dart +Get.changeTheme(Get.isDarkMode? ThemeData.light(): ThemeData.dark()); +``` + +When `.darkmode` is activated, it will switch to the _light theme_, and when the _light theme_ becomes active, it will change to _dark theme_. + +## GetConnect + +GetConnect is an easy way to communicate from your back to your front with http or websockets + +### Default configuration + +You can simply extend GetConnect and use the GET/POST/PUT/DELETE/SOCKET methods to communicate with your Rest API or websockets. + +```dart +class UserProvider extends GetConnect { + // Get request + Future getUser(int id) => get('http://youapi/users/$id'); + // Post request + Future postUser(Map data) => post('http://youapi/users', body: data); + // Post request with File + Future> postCases(List image) { + final form = FormData({ + 'file': MultipartFile(image, filename: 'avatar.png'), + 'otherFile': MultipartFile(image, filename: 'cover.png'), + }); + return post('http://youapi/users/upload', form); + } + + GetSocket userMessages() { + return socket('https://yourapi/users/socket'); + } +} +``` + +### Custom configuration + +GetConnect is highly customizable You can define base Url, as answer modifiers, as Requests modifiers, define an authenticator, and even the number of attempts in which it will try to authenticate itself, in addition to giving the possibility to define a standard decoder that will transform all your requests into your Models without any additional configuration. + +```dart +class HomeProvider extends GetConnect { + @override + void onInit() { + // All request will pass to jsonEncode so CasesModel.fromJson() + httpClient.defaultDecoder = CasesModel.fromJson; + httpClient.baseUrl = 'https://api.covid19api.com'; + // baseUrl = 'https://api.covid19api.com'; // It define baseUrl to + // Http and websockets if used with no [httpClient] instance + + // It's will attach 'apikey' property on header from all requests + httpClient.addRequestModifier((request) { + request.headers['apikey'] = '12345678'; + return request; + }); + + // Even if the server sends data from the country "Brazil", + // it will never be displayed to users, because you remove + // that data from the response, even before the response is delivered + httpClient.addResponseModifier((request, response) { + CasesModel model = response.body; + if (model.countries.contains('Brazil')) { + model.countries.remove('Brazilll'); + } + }); + + httpClient.addAuthenticator((request) async { + final response = await get("http://yourapi/token"); + final token = response.body['token']; + // Set the header + request.headers['Authorization'] = "$token"; + return request; + }); + + //Autenticator will be called 3 times if HttpStatus is + //HttpStatus.unauthorized + httpClient.maxAuthRetries = 3; + } + } + + @override + Future> getCases(String path) => get(path); +} +``` + +## GetPage Middleware + +The GetPage has now new property that takes a list of GetMiddleWare and run them in the specific order. + +**Note**: When GetPage has a Middlewares, all the children of this page will have the same middlewares automatically. + +### Priority + +The Order of the Middlewares to run can be set by the priority in the GetMiddleware. + +```dart +final middlewares = [ + GetMiddleware(priority: 2), + GetMiddleware(priority: 5), + GetMiddleware(priority: 4), + GetMiddleware(priority: -8), +]; +``` + +those middlewares will be run in this order **-8 => 2 => 4 => 5** + +### Redirect + +This function will be called when the page of the called route is being searched for. It takes RouteSettings as a result to redirect to. Or give it null and there will be no redirecting. + +```dart +RouteSettings redirect(String route) { + final authService = Get.find(); + return authService.authed.value ? null : RouteSettings(name: '/login') +} +``` + +### onPageCalled + +This function will be called when this Page is called before anything created +you can use it to change something about the page or give it new page + +```dart +GetPage onPageCalled(GetPage page) { + final authService = Get.find(); + return page.copyWith(title: 'Welcome ${authService.UserName}'); +} +``` + +### OnBindingsStart + +This function will be called right before the Bindings are initialize. +Here you can change Bindings for this page. + +```dart +List onBindingsStart(List bindings) { + final authService = Get.find(); + if (authService.isAdmin) { + bindings.add(AdminBinding()); + } + return bindings; +} +``` + +### OnPageBuildStart + +This function will be called right after the Bindings are initialize. +Here you can do something after that you created the bindings and before creating the page widget. + +```dart +GetPageBuilder onPageBuildStart(GetPageBuilder page) { + print('bindings are ready'); + return page; +} +``` + +### OnPageBuilt + +This function will be called right after the GetPage.page function is called and will give you the result of the function. and take the widget that will be showed. + +### OnPageDispose + +This function will be called right after disposing all the related objects (Controllers, views, ...) of the page. + +## Other Advanced APIs + +```dart +// give the current args from currentScreen +Get.arguments + +// give name of previous route +Get.previousRoute + +// give the raw route to access for example, rawRoute.isFirst() +Get.rawRoute + +// give access to Routing API from GetObserver +Get.routing + +// check if snackbar is open +Get.isSnackbarOpen + +// check if dialog is open +Get.isDialogOpen + +// check if bottomsheet is open +Get.isBottomSheetOpen + +// remove one route. +Get.removeRoute() + +// back repeatedly until the predicate returns true. +Get.until() + +// go to next route and remove all the previous routes until the predicate returns true. +Get.offUntil() + +// go to next named route and remove all the previous routes until the predicate returns true. +Get.offNamedUntil() + +//Check in what platform the app is running +GetPlatform.isAndroid +GetPlatform.isIOS +GetPlatform.isMacOS +GetPlatform.isWindows +GetPlatform.isLinux +GetPlatform.isFuchsia + +//Check the device type +GetPlatform.isMobile +GetPlatform.isDesktop +//All platforms are supported independently in web! +//You can tell if you are running inside a browser +//on Windows, iOS, OSX, Android, etc. +GetPlatform.isWeb + + +// Equivalent to : MediaQuery.of(context).size.height, +// but immutable. +Get.height +Get.width + +// Gives the current context of the Navigator. +Get.context + +// Gives the context of the snackbar/dialog/bottomsheet in the foreground, anywhere in your code. +Get.contextOverlay + +// Note: the following methods are extensions on context. Since you +// have access to context in any place of your UI, you can use it anywhere in the UI code + +// If you need a changeable height/width (like Desktop or browser windows that can be scaled) you will need to use context. +context.width +context.height + +// Gives you the power to define half the screen, a third of it and so on. +// Useful for responsive applications. +// param dividedBy (double) optional - default: 1 +// param reducedBy (double) optional - default: 0 +context.heightTransformer() +context.widthTransformer() + +/// Similar to MediaQuery.of(context).size +context.mediaQuerySize() + +/// Similar to MediaQuery.of(context).padding +context.mediaQueryPadding() + +/// Similar to MediaQuery.of(context).viewPadding +context.mediaQueryViewPadding() + +/// Similar to MediaQuery.of(context).viewInsets; +context.mediaQueryViewInsets() + +/// Similar to MediaQuery.of(context).orientation; +context.orientation() + +/// Check if device is on landscape mode +context.isLandscape() + +/// Check if device is on portrait mode +context.isPortrait() + +/// Similar to MediaQuery.of(context).devicePixelRatio; +context.devicePixelRatio() + +/// Similar to MediaQuery.of(context).textScaleFactor; +context.textScaleFactor() + +/// Get the shortestSide from screen +context.mediaQueryShortestSide() + +/// True if width be larger than 800 +context.showNavbar() + +/// True if the shortestSide is smaller than 600p +context.isPhone() + +/// True if the shortestSide is largest than 600p +context.isSmallTablet() + +/// True if the shortestSide is largest than 720p +context.isLargeTablet() + +/// True if the current device is Tablet +context.isTablet() + +/// Returns a value according to the screen size +/// can give value for: +/// watch: if the shortestSide is smaller than 300 +/// mobile: if the shortestSide is smaller than 600 +/// tablet: if the shortestSide is smaller than 1200 +/// desktop: if width is largest than 1200 +context.responsiveValue() +``` + +### Optional Global Settings and Manual configurations + +GetMaterialApp configures everything for you, but if you want to configure Get manually. + +```dart +MaterialApp( + navigatorKey: Get.key, + navigatorObservers: [GetObserver()], +); +``` + +You will also be able to use your own Middleware within `GetObserver`, this will not influence anything. + +```dart +MaterialApp( + navigatorKey: Get.key, + navigatorObservers: [ + GetObserver(MiddleWare.observer) // Here + ], +); +``` + +You can create _Global Settings_ for `Get`. Just add `Get.config` to your code before pushing any route. +Or do it directly in your `GetMaterialApp` + +```dart +GetMaterialApp( + enableLog: true, + defaultTransition: Transition.fade, + opaqueRoute: Get.isOpaqueRouteDefault, + popGesture: Get.isPopGestureEnable, + transitionDuration: Get.defaultDurationTransition, + defaultGlobalState: Get.defaultGlobalState, +); + +Get.config( + enableLog = true, + defaultPopGesture = true, + defaultTransition = Transitions.cupertino +) +``` + +You can optionally redirect all the logging messages from `Get`. +If you want to use your own, favourite logging package, +and want to capture the logs there: + +```dart +GetMaterialApp( + enableLog: true, + logWriterCallback: localLogWriter, +); + +void localLogWriter(String text, {bool isError = false}) { + // pass the message to your favourite logging package here + // please note that even if enableLog: false log messages will be pushed in this callback + // you get check the flag if you want through GetConfig.isLogEnable +} + +``` + +### Local State Widgets + +These Widgets allows you to manage a single value, and keep the state ephemeral and locally. +We have flavours for Reactive and Simple. +For instance, you might use them to toggle obscureText in a `TextField`, maybe create a custom +Expandable Panel, or maybe modify the current index in `BottomNavigationBar` while changing the content +of the body in a `Scaffold`. + +#### ValueBuilder + +A simplification of `StatefulWidget` that works with a `.setState` callback that takes the updated value. + +```dart +ValueBuilder( + initialValue: false, + builder: (value, updateFn) => Switch( + value: value, + onChanged: updateFn, // same signature! you could use ( newValue ) => updateFn( newValue ) + ), + // if you need to call something outside the builder method. + onUpdate: (value) => print("Value updated: $value"), + onDispose: () => print("Widget unmounted"), +), +``` + +#### ObxValue + +Similar to [`ValueBuilder`](#valuebuilder), but this is the Reactive version, you pass a Rx instance (remember the magical .obs?) and +updates automatically... isn't it awesome? + +```dart +ObxValue((data) => Switch( + value: data.value, + onChanged: data, // Rx has a _callable_ function! You could use (flag) => data.value = flag, + ), + false.obs, +), +``` + +## Useful tips + +`.obs`ervables (also known as _Rx_ Types) have a wide variety of internal methods and operators. + +> Is very common to _believe_ that a property with `.obs` **IS** the actual value... but make no mistake! +> We avoid the Type declaration of the variable, because Dart's compiler is smart enough, and the code +> looks cleaner, but: + +```dart +var message = 'Hello world'.obs; +print( 'Message "$message" has Type ${message.runtimeType}'); +``` + +Even if `message` _prints_ the actual String value, the Type is **RxString**! + +So, you can't do `message.substring( 0, 4 )`. +You have to access the real `value` inside the _observable_: +The most "used way" is `.value`, but, did you know that you can also use... + +```dart +final name = 'GetX'.obs; +// only "updates" the stream, if the value is different from the current one. +name.value = 'Hey'; + +// All Rx properties are "callable" and returns the new value. +// but this approach does not accepts `null`, the UI will not rebuild. +name('Hello'); + +// is like a getter, prints 'Hello'. +name() ; + +/// numbers: + +final count = 0.obs; + +// You can use all non mutable operations from num primitives! +count + 1; + +// Watch out! this is only valid if `count` is not final, but var +count += 1; + +// You can also compare against values: +count > 2; + +/// booleans: + +final flag = false.obs; + +// switches the value between true/false +flag.toggle(); + + +/// all types: + +// Sets the `value` to null. +flag.nil(); + +// All toString(), toJson() operations are passed down to the `value` +print( count ); // calls `toString()` inside for RxInt + +final abc = [0,1,2].obs; +// Converts the value to a json Array, prints RxList +// Json is supported by all Rx types! +print('json: ${jsonEncode(abc)}, type: ${abc.runtimeType}'); + +// RxMap, RxList and RxSet are special Rx types, that extends their native types. +// but you can work with a List as a regular list, although is reactive! +abc.add(12); // pushes 12 to the list, and UPDATES the stream. +abc[3]; // like Lists, reads the index 3. + + +// equality works with the Rx and the value, but hashCode is always taken from the value +final number = 12.obs; +print( number == 12 ); // prints > true + +/// Custom Rx Models: + +// toJson(), toString() are deferred to the child, so you can implement override on them, and print() the observable directly. + +class User { + String name, last; + int age; + User({this.name, this.last, this.age}); + + @override + String toString() => '$name $last, $age years old'; +} + +final user = User(name: 'John', last: 'Doe', age: 33).obs; + +// `user` is "reactive", but the properties inside ARE NOT! +// So, if we change some variable inside of it... +user.value.name = 'Roi'; +// The widget will not rebuild!, +// `Rx` don't have any clue when you change something inside user. +// So, for custom classes, we need to manually "notify" the change. +user.refresh(); + +// or we can use the `update()` method! +user.update((value){ + value.name='Roi'; +}); + +print( user ); +``` +## StateMixin + +Another way to handle your `UI` state is use the `StateMixin` . +To implement it, use the `with` to add the `StateMixin` +to your controller which allows a T model. + +``` dart +class Controller extends GetController with StateMixin{} +``` + +The `change()` method change the State whenever we want. +Just pass the data and the status in this way: + +```dart +change(data, status: RxStatus.success()); +``` + +RxStatus allow these status: + +``` dart +RxStatus.loading(); +RxStatus.success(); +RxStatus.empty(); +RxStatus.error('message'); +``` + +To represent it in the UI, use: + +```dart +class OtherClass extends GetView { + @override + Widget build(BuildContext context) { + return Scaffold( + + body: controller.obx( + (state)=>Text(state.name), + + // here you can put your custom loading indicator, but + // by default would be Center(child:CircularProgressIndicator()) + onLoading: CustomLoadingIndicator(), + onEmpty: Text('No data found'), + + // here also you can set your own error widget, but by + // default will be an Center(child:Text(error)) + onError: (error)=>Text(error), + ), + ); +} +``` + +#### GetView + +I love this Widget, is so simple, yet, so useful! + +Is a `const Stateless` Widget that has a getter `controller` for a registered `Controller`, that's all. + +```dart + class AwesomeController extends GetController { + final String title = 'My Awesome View'; + } + + // ALWAYS remember to pass the `Type` you used to register your controller! + class AwesomeView extends GetView { + @override + Widget build(BuildContext context) { + return Container( + padding: EdgeInsets.all(20), + child: Text(controller.title), // just call `controller.something` + ); + } + } +``` + +#### GetResponsiveView + +Extend this widget to build responsive view. +this widget contains the `screen` property that have all +information about the screen size and type. + +##### How to use it + +You have two options to build it. + +- with `builder` method you return the widget to build. +- with methods `desktop`, `tablet`,`phone`, `watch`. the specific + method will be built when the screen type matches the method + when the screen is [ScreenType.Tablet] the `tablet` method + will be exuded and so on. + **Note:** If you use this method please set the property `alwaysUseBuilder` to `false` + +With `settings` property you can set the width limit for the screen types. + +![example](https://github.com/SchabanBo/get_page_example/blob/master/docs/Example.gif?raw=true) +Code to this screen +[code](https://github.com/SchabanBo/get_page_example/blob/master/lib/pages/responsive_example/responsive_view.dart) + +#### GetWidget + +Most people have no idea about this Widget, or totally confuse the usage of it. +The use case is very rare, but very specific: It `caches` a Controller. +Because of the _cache_, can't be a `const Stateless`. + +> So, when do you need to "cache" a Controller? + +If you use, another "not so common" feature of **GetX**: `Get.create()`. + +`Get.create(()=>Controller())` will generate a new `Controller` each time you call +`Get.find()`, + +That's where `GetWidget` shines... as you can use it, for example, +to keep a list of Todo items. So, if the widget gets "rebuilt", it will keep the same controller instance. + +#### GetxService + +This class is like a `GetxController`, it shares the same lifecycle ( `onInit()`, `onReady()`, `onClose()`). +But has no "logic" inside of it. It just notifies **GetX** Dependency Injection system, that this subclass +**can not** be removed from memory. + +So is super useful to keep your "Services" always reachable and active with `Get.find()`. Like: +`ApiService`, `StorageService`, `CacheService`. + +```dart +Future main() async { + await initServices(); /// AWAIT SERVICES INITIALIZATION. + runApp(SomeApp()); +} + +/// Is a smart move to make your Services intiialize before you run the Flutter app. +/// as you can control the execution flow (maybe you need to load some Theme configuration, +/// apiKey, language defined by the User... so load SettingService before running ApiService. +/// so GetMaterialApp() doesnt have to rebuild, and takes the values directly. +void initServices() async { + print('starting services ...'); + /// Here is where you put get_storage, hive, shared_pref initialization. + /// or moor connection, or whatever that's async. + await Get.putAsync(() => DbService().init()); + await Get.putAsync(SettingsService()).init(); + print('All services started...'); +} + +class DbService extends GetxService { + Future init() async { + print('$runtimeType delays 2 sec'); + await 2.delay(); + print('$runtimeType ready!'); + return this; + } +} + +class SettingsService extends GetxService { + void init() async { + print('$runtimeType delays 1 sec'); + await 1.delay(); + print('$runtimeType ready!'); + } +} + +``` + +The only way to actually delete a `GetxService`, is with `Get.reset()` which is like a +"Hot Reboot" of your app. So remember, if you need absolute persistence of a class instance during the +lifetime of your app, use `GetxService`. + + +### Tests + +You can test your controllers like any other class, including their lifecycles: + +```dart +class Controller extends GetxController { + @override + void onInit() { + super.onInit(); + //Change value to name2 + name.value = 'name2'; + } + + @override + void onClose() { + name.value = ''; + super.onClose(); + } + + final name = 'name1'.obs; + + void changeName() => name.value = 'name3'; +} + +void main() { + test(''' +Test the state of the reactive variable "name" across all of its lifecycles''', + () { + /// You can test the controller without the lifecycle, + /// but it's not recommended unless you're not using + /// GetX dependency injection + final controller = Controller(); + expect(controller.name.value, 'name1'); + + /// If you are using it, you can test everything, + /// including the state of the application after each lifecycle. + Get.put(controller); // onInit was called + expect(controller.name.value, 'name2'); + + /// Test your functions + controller.changeName(); + expect(controller.name.value, 'name3'); + + /// onClose was called + Get.delete(); + + expect(controller.name.value, ''); + }); +} +``` + +#### Tips + +##### Mockito or mocktail +If you need to mock your GetxController/GetxService, you should extend GetxController, and mixin it with Mock, that way + +```dart +class NotificationServiceMock extends GetxService with Mock implements NotificationService {} +``` + +##### Using Get.reset() +If you are testing widgets, or test groups, use Get.reset at the end of your test or in tearDown to reset all settings from your previous test. + +##### Get.testMode +if you are using your navigation in your controllers, use `Get.testMode = true` at the beginning of your main. + + +# Breaking changes from 2.0 + +1- Rx types: + +| Before | After | +| ------- | ---------- | +| StringX | `RxString` | +| IntX | `RxInt` | +| MapX | `RxMap` | +| ListX | `RxList` | +| NumX | `RxNum` | +| DoubleX | `RxDouble` | + +RxController and GetBuilder now have merged, you no longer need to memorize which controller you want to use, just use GetxController, it will work for simple state management and for reactive as well. + +2- NamedRoutes +Before: + +```dart +GetMaterialApp( + namedRoutes: { + '/': GetRoute(page: Home()), + } +) +``` + +Now: + +```dart +GetMaterialApp( + getPages: [ + GetPage(name: '/', page: () => Home()), + ] +) +``` + +Why this change? +Often, it may be necessary to decide which page will be displayed from a parameter, or a login token, the previous approach was inflexible, as it did not allow this. +Inserting the page into a function has significantly reduced the RAM consumption, since the routes will not be allocated in memory since the app was started, and it also allowed to do this type of approach: + +```dart + +GetStorage box = GetStorage(); + +GetMaterialApp( + getPages: [ + GetPage(name: '/', page:(){ + return box.hasData('token') ? Home() : Login(); + }) + ] +) +``` + +# Why Getx? + +1- Many times after a Flutter update, many of your packages will break. Sometimes compilation errors happen, errors often appear that there are still no answers about, and the developer needs to know where the error came from, track the error, only then try to open an issue in the corresponding repository, and see its problem solved. Get centralizes the main resources for development (State, dependency and route management), allowing you to add a single package to your pubspec, and start working. After a Flutter update, the only thing you need to do is update the Get dependency, and get to work. Get also resolves compatibility issues. How many times a version of a package is not compatible with the version of another, because one uses a dependency in one version, and the other in another version? This is also not a concern using Get, as everything is in the same package and is fully compatible. + +2- Flutter is easy, Flutter is incredible, but Flutter still has some boilerplate that may be unwanted for most developers, such as `Navigator.of(context).push (context, builder [...]`. Get simplifies development. Instead of writing 8 lines of code to just call a route, you can just do it: `Get.to(Home())` and you're done, you'll go to the next page. Dynamic web urls are a really painful thing to do with Flutter currently, and that with GetX is stupidly simple. Managing states in Flutter, and managing dependencies is also something that generates a lot of discussion, as there are hundreds of patterns in the pub. But there is nothing as easy as adding a ".obs" at the end of your variable, and place your widget inside an Obx, and that's it, all updates to that variable will be automatically updated on the screen. + +3- Ease without worrying about performance. Flutter's performance is already amazing, but imagine that you use a state manager, and a locator to distribute your blocs/stores/controllers/ etc. classes. You will have to manually call the exclusion of that dependency when you don't need it. But have you ever thought of simply using your controller, and when it was no longer being used by anyone, it would simply be deleted from memory? That's what GetX does. With SmartManagement, everything that is not being used is deleted from memory, and you shouldn't have to worry about anything but programming. You will be assured that you are consuming the minimum necessary resources, without even having created a logic for this. + +4- Actual decoupling. You may have heard the concept "separate the view from the business logic". This is not a peculiarity of BLoC, MVC, MVVM, and any other standard on the market has this concept. However, this concept can often be mitigated in Flutter due to the use of context. +If you need context to find an InheritedWidget, you need it in the view, or pass the context by parameter. I particularly find this solution very ugly, and to work in teams we will always have a dependence on View's business logic. Getx is unorthodox with the standard approach, and while it does not completely ban the use of StatefulWidgets, InitState, etc., it always has a similar approach that can be cleaner. Controllers have life cycles, and when you need to make an APIREST request for example, you don't depend on anything in the view. You can use onInit to initiate the http call, and when the data arrives, the variables will be populated. As GetX is fully reactive (really, and works under streams), once the items are filled, all widgets that use that variable will be automatically updated in the view. This allows people with UI expertise to work only with widgets, and not have to send anything to business logic other than user events (like clicking a button), while people working with business logic will be free to create and test the business logic separately. + +This library will always be updated and implementing new features. Feel free to offer PRs and contribute to them. + +# Community + +## Community channels + +GetX has a highly active and helpful community. If you have questions, or would like any assistance regarding the use of this framework, please join our community channels, your question will be answered more quickly, and it will be the most suitable place. This repository is exclusive for opening issues, and requesting resources, but feel free to be part of GetX Community. + +| **Slack** | **Discord** | **Telegram** | +| :-------------------------------------------------------------------------------------------------------------------------- | :-------------------------------------------------------------------------------------------------------------------------- | :-------------------------------------------------------------------------------------------------------------------- | +| [![Get on Slack](https://img.shields.io/badge/slack-join-orange.svg)](https://communityinviter.com/apps/getxworkspace/getx) | [![Discord Shield](https://img.shields.io/discord/722900883784073290.svg?logo=discord)](https://discord.com/invite/9Hpt99N) | [![Telegram](https://img.shields.io/badge/chat-on%20Telegram-blue.svg)](https://t.me/joinchat/PhdbJRmsZNpAqSLJL6bH7g) | + +## How to contribute + +_Want to contribute to the project? We will be proud to highlight you as one of our collaborators. Here are some points where you can contribute and make Get (and Flutter) even better._ + +- Helping to translate the readme into other languages. +- Adding documentation to the readme (a lot of Get's functions haven't been documented yet). +- Write articles or make videos teaching how to use Get (they will be inserted in the Readme and in the future in our Wiki). +- Offering PRs for code/tests. +- Including new functions. + +Any contribution is welcome! + +## Articles and videos + +- [Flutter Getx EcoSystem package for arabic people](https://www.youtube.com/playlist?list=PLV1fXIAyjeuZ6M8m56zajMUwu4uE3-SL0) - Tutorial by [Pesa Coder](https://github.com/UsamaElgendy). +- [Dynamic Themes in 3 lines using GetX™](https://medium.com/swlh/flutter-dynamic-themes-in-3-lines-c3b375f292e3) - Tutorial by [Rod Brown](https://github.com/RodBr). +- [Complete GetX™ Navigation](https://www.youtube.com/watch?v=RaqPIoJSTtI) - Route management video by Amateur Coder. +- [Complete GetX State Management](https://www.youtube.com/watch?v=CNpXbeI_slw) - State management video by Amateur Coder. +- [GetX™ Other Features](https://youtu.be/ttQtlX_Q0eU) - Utils, storage, bindings and other features video by Amateur Coder. +- [Firestore User with GetX | Todo App](https://www.youtube.com/watch?v=BiV0DcXgk58) - Video by Amateur Coder. +- [Firebase Auth with GetX | Todo App](https://www.youtube.com/watch?v=-H-T_BSgfOE) - Video by Amateur Coder. +- [The Flutter GetX™ Ecosystem ~ State Management](https://medium.com/flutter-community/the-flutter-getx-ecosystem-state-management-881c7235511d) - State management by [Aachman Garg](https://github.com/imaachman). +- [The Flutter GetX™ Ecosystem ~ Dependency Injection](https://medium.com/flutter-community/the-flutter-getx-ecosystem-dependency-injection-8e763d0ec6b9) - Dependency Injection by [Aachman Garg](https://github.com/imaachman). +- [GetX, the all-in-one Flutter package](https://www.youtube.com/watch?v=IYQgtu9TM74) - A brief tutorial covering State Management and Navigation by Thad Carnevalli. +- [Build a To-do List App from scratch using Flutter and GetX](https://www.youtube.com/watch?v=EcnqFasHf18) - UI + State Management + Storage video by Thad Carnevalli. +- [GetX Flutter Firebase Auth Example](https://medium.com/@jeffmcmorris/getx-flutter-firebase-auth-example-b383c1dd1de2) - Article by Jeff McMorris. +- [Flutter State Management with GetX – Complete App](https://www.appwithflutter.com/flutter-state-management-with-getx/) - by App With Flutter. +- [Flutter Routing with Animation using Get Package](https://www.appwithflutter.com/flutter-routing-using-get-package/) - by App With Flutter. +- [A minimal example on dartpad](https://dartpad.dev/2b3d0d6f9d4e312c5fdbefc414c1727e?) - by [Roi Peker](https://github.com/roipeker) diff --git a/siro_rider/packages/get/README.pl.md b/siro_rider/packages/get/README.pl.md new file mode 100644 index 0000000..cbc6861 --- /dev/null +++ b/siro_rider/packages/get/README.pl.md @@ -0,0 +1,547 @@ +![](https://raw.githubusercontent.com/jonataslaw/getx-community/master/get.png) + +*Languages: [English](README.md), [Wietnamski](README-vi.md), [Indonezyjski](README.id-ID.md), [Urdu](README.ur-PK.md), [Język chiński](README.zh-cn.md), [Brazilian Portuguese](README.pt-br.md), [Spanish](README-es.md), [Russian](README.ru.md), Polish (Jesteś tu), [Koreański](README.ko-kr.md), [French](README-fr.md)* + +[![pub package](https://img.shields.io/pub/v/get.svg?label=get&color=blue)](https://pub.dev/packages/get) +[![popularity](https://badges.bar/get/popularity)](https://pub.dev/packages/sentry/score) +[![likes](https://badges.bar/get/likes)](https://pub.dev/packages/get/score) +[![pub points](https://badges.bar/get/pub%20points)](https://pub.dev/packages/get/score) +![building](https://github.com/jonataslaw/get/workflows/build/badge.svg) +[![style: effective dart](https://img.shields.io/badge/style-effective_dart-40c4ff.svg)](https://pub.dev/packages/effective_dart) +[![Discord Shield](https://img.shields.io/discord/722900883784073290.svg?logo=discord)](https://discord.com/invite/9Hpt99N) +[![Get on Slack](https://img.shields.io/badge/slack-join-orange.svg)](https://communityinviter.com/apps/getxworkspace/getx) +[![Telegram](https://img.shields.io/badge/chat-on%20Telegram-blue.svg)](https://t.me/joinchat/PhdbJRmsZNpAqSLJL6bH7g) + + Awesome Flutter + +Buy Me A Coffee + + +![](https://raw.githubusercontent.com/jonataslaw/getx-community/master/getx.png) + +- [Kanały komunikacji i wsparcia:](#kanały-komunikacji-i-wsparcia) +- [Wprowadzenie](#wprowadzenie) +- [Instalacja](#instalacja) +- [Counter App z GetX](#counter-app-z-getx) +- [Trzy filary](#trzy-filary) + - [Menadżer stanu](#menadżer-stanu) + - [Reaktywny menadżer stanu](#reaktywny-menadżer-stanu) + - [Bardziej szczegółowo o menadżerze stanu](#bardziej-szczegółowo-o-menadżerze-stanu) + - [Video tłumaczące użycie menadżera stanu](#video-tłumaczące-użycie-menadżera-stanu) + - [Zarządzanie routami](#zarządzanie-routami) + - [Więcej o routach](#więcej-o-routach) + - [Video tłumaczące użycie](#video-tłumaczące-użycie) + - [Zarządzanie dependencies](#zarządzanie-dependencies) + - [Bardziej szczegółowo o menadżerze dependencies](#bardziej-szczegółowo-o-menadżerze-dependencies) +- [Jak włożyć coś od siebie](#jak-włożyć-coś-od-siebie) +- [Narzędzia](#narzędzia) + - [Zmiana motywu](#zmiana-motywu) + - [Inne zaawansowane API](#inne-zaawansowane-api) + - [Opcjonalne globalne ustawienia i manualna konfiguracja](#opcjonalne-globalne-ustawienia-i-manualna-konfiguracja) + - [Video tłumaczące inne funkcjonalności GetX](#video-tłumaczące-inne-funkcjonalności-getx) +- [Zmiany od 2.0](#zmiany-od-20) + + +# Kanały komunikacji i wsparcia: + +[**Slack (English)**](https://communityinviter.com/apps/getxworkspace/getx) + +[**Discord (English and Portuguese)**](https://discord.com/invite/9Hpt99N) + +[**Telegram (Portuguese)**](https://t.me/joinchat/PhdbJRmsZNpAqSLJL6bH7g) + +# Wprowadzenie +- GetX jest bardzo lekką, a zarazem potężną biblioteką do Flattera. Łączy wysoką wydajność menadżera stanu, inteligętne dodawanie dependencies i zarządzanie routami w szybki i praktyczny sposób. +- GetX nie jest dla wszystkich, skupia się na jak najmniejszej konsumpcji zasobów (wydajności) ([zobacz benchmarki](https://github.com/jonataslaw/benchmarks)), używaniu łatwej skłani (produktywności) i daniu możliwości pełnego rozbicia View na z logiki biznesowej (organizacja). +- GetX da Ci supermoce i zwiększy produktywność w tworzeniu projektu. Oszczędzi godziny zarówno początkującym jak i ekspertom. +- Nawiguj bez podawania `context`, używaj open `dialogs`, `snackbarów` oraz `bottomsheetów` z każdego miejsca w kodzie. Zarządzaj stanami i dodawaj dependencies w prosty i praktyczny sposób! +- Get jest bezpieczny, stabilny i aktualny. Oprócz tego oferuje szeroki zakres API, które nie są zawarte w standardowym frameworku. +- GetX nie jest przytłaczający. Ma wiele funkcjonalności pozwalajacych na rozpoczęcie programowania bez martwienia się zupełnie nic. Wszystkie funkcjonalności są w osobnych kontenerach, które dodawane są dopiero po ich użyciu. Jeśli tylko używasz menadżera stanu, tylko on będzie kompilowany. Jeśli używasz routów, lecz nic z menadżera stanu to nie będzie on kompilowany. Możesz skompilować repozytorium benchmark i zobaczysz że używa tylko menadżera stanu. Aplikacje używajace Get są mniejsze niz inne, ponieważ wszystkie rozwiązania GetX są projektowane z myślą o lekkości i wydajności. Jest to też zasługa Flutterowego AOT, które jest niesamowite i eliminuje nieużywane zasoby jak żaden inny framework. + +**GetX zwiększa twoja produktywność, lecz możesz to jeszcze przyspieszyć instalując rozszerzenie [GetX extension](https://marketplace.visualstudio.com/items?itemName=get-snippets.get-snippets) do swojego VSCode**. Jeszcze nie dostępne w innych IDE. + +# Instalacja + +Dodaj Get do swojego pliku pubspec.yaml: + +```yaml +dependencies: + get: +``` + +Zaimportuj Get do plików w których chcesz go użyć: + +```dart +import 'package:get/get.dart'; +``` + +# Counter App z GetX + +Przykładowa aplikaja tworzona domyślnie podczas kreacji nowego projektu we Flaterze ma ponad 100 lini kodu (z komentarzami). By pokazać siłę Get pokażę jak zrobić "licznik" ze zmianą stanu przy każdym kliknięciu, zmianą stron i udostępniajac stan pomiędzy ekranami. Wszystko w zorganizowany sposób dzieląc bussines logic z view w zaledwie 26 LINI KODU WŁĄCZAJĄC W TO KOMENTARZE. + +-Krok 1: +Dodaj "Get" przed MaterialApp, zamieniając je na GetMaterialApp + + +```dart +void main() => runApp(GetMaterialApp(home: Home())); +``` + +- Note: nie jest to modyfikaja MaterialApp, ponieważ GetMaterialApp nie jest zmodyfikowanym MaterialApp z Fluttera, jest tylko skonfigurowanym Widgetem mającym domyślnie MaterialApp jako dziecko. Możesz to konfigurować ręcznie, ale nie jest to konieczne. GetMaterialApp jest niezbędne dla działania routów, snackbarów, bootomsheetów, internacjonalizacji, dialogów i wysokopoziomowych api powiązanych z routami i nieobecnościa kontekstu. Nie jest to jednak wymagane do używania zarzadzania stanem i dependencies. + +-Krok 2: +Tworzymy klasę business logic i umieszczmy w niej wszystkie zmienne, metody oraz kontrolery. Możesz zmienić zmiennaą na obserwowalną używajac prostego subfixu ".obs" + +```dart +class Controller extends GetxController{ + var count = 0.obs; + increment() => count.value++; +} +``` +- Krok 3: +Tworzymy View. Użyj StatelessWidget oszczędzajac przy tym RAM. Z Get nie będzie Ci potrzebny StatefullWidget. + + +```dart +class Home extends StatelessWidget { + + @override + Widget build(context) { + + // Instantiate your class using Get.put() to make it available for all "child" routes there. + final Controller c = Get.put(Controller()); + + return Scaffold( + // Use Obx(()=> to update Text() whenever count is changed. + appBar: AppBar(title: Obx(() => Text("Clicks: " + c.count.string))), + + // Replace the 8 lines Navigator.push by a simple Get.to(). You don't need context + body: Center(child: ElevatedButton( + child: Text("Go to Other"), onPressed: () => Get.to(Other()))), + floatingActionButton: + FloatingActionButton(child: Icon(Icons.add), onPressed: c.increment)); + } +} + +class Other extends StatelessWidget { + // You can ask Get to find a Controller that is being used by another page and redirect you to it. + final Controller c = Get.find(); + + @override + Widget build(context){ + // Access the updated count variable + return Scaffold(body: Center(child: Text(c.count.string))); + } +} +``` +Wynik: + +![](https://raw.githubusercontent.com/jonataslaw/getx-community/master/counter-app-gif.gif) + +Jest to prosty projekt, ale już na jego przykładzie widać potęgę Get. Wraz ze wzrostem rozmiaru aplikacji ta różnica tylko się powiększa. + +Get był projektowany dla pracy z zespołem, ale równie dobrze sprawdza się w indywidualnych projektach. + +Zawsze dotrzymuj deadlinów i dostarczaj swoje rozwiązania na czas bez straty na wydajności. Get nie jest dla wszystkich jak już wspominałem, ale jeśli identyfikujesz się z powyższym zdaniem Get jest właśnie dla Ciebie. + +# Trzy filary + +## Menadżer stanu + +Obecnie istnieje kilka menadżeów dla Fluttera. Jednak większość z nich wymaga używania ChangeNotifier, po to aby zaktualizować widżety, co nie sprawdza się pod kątem wydajności w średnich i dużych aplikacach. Możesz sprawdzić w oficjalnej dokumentacji, że ChangeNotifier powinien być używany z maksimum dwoma listinerami (https://api.flutter.dev/flutter/foundation/ChangeNotifier-class.html), będąc praktycznie bezużytecznym w średnich i duzych projektach. + +Get nie jest ani lepszy, ani gorszy od innych menadżerów stanów, ale powinieneś rozpatrzyć te punkty jak i poniższe, aby wybrać między użyciem Get w czystej formie (Vanilla), albo używaniem go wraz z innym menadżerem. + +Definitywnie Get nie jest przeciwnikiem żadnego innego menadżera, ponieważ jest on mikroframeworkiem, nie tylko menadżerem stanu. Może być użyty samodzielnie, lub w koegzystencji. + +Get ma bardzo lekki i prosty menadżer stanu (napisany w tylko 95 lini kodu), który nie używa ChangeNotifier. Sprosta on wymaganiom szczególnie nowych we Flutterze i nie sprawi problemu nawet w dużych aplikacjach. + +### Reaktywny menadżer stanu + +Reaktywne programowanie może odtrącać niektórych, ponieważ powszechnie jest uważane za skomplikowane. GetX zamienia to w coś prostego: + +- Nie musisz tworzyć StreamControllerów, +- Nie musisz tworzyć StreamBuildera dla każdej zmiennej, +- Nie ma potrzeby tworzenia klasy dla każdego stanu, +- Nie musisz tworzyć Get dla inicjalnej zmiennej + +Wyobraź sobie, że masz zmienną i za każdym razem jak zmienisz ją chcesz żeby wszystkie widżety używające jej automatycznie się zmieniły + +Przykładowa zmienna: +```dart +var name = 'Jonatas Borges'; +``` + +By zamienić ją na obserwowalną dodaj ".obx" na końcu: + +```dart +var name = 'Jonatas Borges'.obs; +``` + +I w UI, kiedy chcesz go zaktualizować przy modyfikacji zmiennej po prostu dodaj to: +```dart +Obx (() => Text (controller.name)); +``` + +To wszystko. *Proste*, co nie? + +### Bardziej szczegółowo o menadżerze stanu +**Zobacz bardziej szczegółowe wytłumaczenie menadżera stanu [tutaj](./documentation/en_US/state_management.md). Znajdują się tam przykłady jak o różnice między prostym menadżerem stanu oraz reaktywnym** + +### Video tłumaczące użycie menadżera stanu + +Tadas Petra nagrał o tym niezwykły film: + +Link: [Complete GetX State Management](https://www.youtube.com/watch?v=CNpXbeI_slw) + +## Zarządzanie routami + +Jeśli chcesz używać routes/snackbars/dialogs/bottomsheets z GetX możesz to robić bez contextu. + +Zamień MaterialApp na GetMaterialApp +```dart +GetMaterialApp( // Before: MaterialApp( + home: MyHome(), +) +``` + +By nawigować do nowego ekranu: + +```dart +Get.to(NextScreen()); +``` + +By powrócić do poprzedniego ekranu + +```dart +Get.back(); +``` + +By przejść do następnego ekranu bez możliwości powrotu do poprzedniego (do zastosowania SplashScreenów, ekranów logowania itd.) + +```dart +Get.off(NextScreen()); +``` + +By przejść do następnego ekranu niszcząc poprzednie routy (użyteczne w koszykach, ankietach i testach) + +```dart +Get.offAll(NextScreen()); +``` + +By nawigować do następnego routa i otrzymać, lub uaktualnić dane zaraz po tym jak z niego wrócisz: +```dart +var data = await Get.to(Payment()); +``` +w innym ekranie wyślij dane z poprzedniego routa:featury + +```dart +Get.back(result: 'sucess'); +``` +I użyj następujące np.: +```dart +if(data == 'sucess') madeAnything(); +``` +Zobacz, ze do żadnej z tych operacji nie potrzebowałeś contextu. Jest to jedna z głównych zalet GetX oszczędzającego na niepotrzebnej obudowie w kod i dającego możliwość używania tych metod w klasie kontrolera. + + +### Więcej o routach + +**Get używa named routes oraz oferuje niskopoziomową obsługę routów! Zobacz bardziej szczegółową dokumentacje [tutaj](./documentation/en_US/route_management.md)** + +### Video tłumaczące użycie + +Tadas Petra nagrał o tym niezwykły film: + +Link: [Complete GetX Navigation](https://www.youtube.com/watch?v=RaqPIoJSTtI) + +## Zarządzanie dependencies + +Get ma prosty, a zarazem potężny menadżer dependencies. Pozwala on na otrzymanie tych samych klas jak twoje Bloc lub Kontroler pisząc jedną linię kodu bez Provider context i inheritedWidget: + +```dart +Controller controller = Get.put(Controller()); // Rather Controller controller = Controller(); +``` + +- Note: Jeśli używasz menadżera stanu Get zwróć uwagę na binding api, które pozwoli Ci łatwiej połączyć twój widok z kontrolerem. +https://github.com/jonataslaw/get +**Tip:** Menadżer dependency Get jest oddzielony od innych części pakietu więc jeśli już używasz menadżera stanu(którego kolwiek, bez różnicy) nie musisz przepisywać tego wszystkiego na nowo. Możesz używać tego dodawania dependencies bez poroblemu. + +```dart +controller.fetchApi(); +``` +Wyobraź sobie, że musisz nawigować pomiędzy wieloma routami i potrzebujesz dane z kontrolerów z poprzednich ekranów. Musiałbyś użyć menadżera stanu z dodatkiem Providera albo Get_it, prawda? Otóż nie z Fet. Musisz po prostu poprosić Get o znalezienie tego kontrolera i nie potrzebujesz przy tym dodatkowych dependencies. + +```dart +Controller controller = Get.find(); +//Tak, to wygląda jak Magia, Get znjadzie Twój kontroler i Ci go dostarczy. Możesz mieć nawet MILION kontrolerów, a Get zawsze da Ci prawidłowy kontroler. +``` + +I wtedy będziesz mógł otrzymać z niego dane bez żadnego problemu + +```dart +Text(controller.textFromApi); +``` +### Bardziej szczegółowo o menadżerze dependencies + +**Zobzcz więcej w dokumentacji [tutaj](./documentation/en_US/dependency_management.md)** + +# Jak włożyć coś od siebie + +Możesz uczestniczyć w rozwoju projektu na różny sposób: +- Pomagając w tłumaczeniu readme na inne języki. +- Dodając dokumentację do readme (nawet połowa funkcji została jeszcze opisana). +- Pisząc artykuły i nagrywając filmy pokazujące użycie biblioteki Get (będą zamieszczone w readme, a w przyszłości na naszej Wiki). +- Oferując PR-y dla kodu i testów. +- Dodając nowe funkcje. + +Każda współpraca jest mile widziana! + +# Narzędzia + +## Zmiana motywu + +Nie powinno się używać innego widżetu niż GetMaterialApp by go zaktualizować. To może powodować duplikacje kluczy. Wiele osób nawykło do prehistorycznego podejścia tworzenia widżetu "ThemeProvider" tylko po to by zmienić motyw aplikacji. Z Get nie jest to wymagane. + +Możesz stworzyć customowy motyw i łatwo go dodać z Get.changeTheme bez niepotrzebnego kodu. + +```dart +Get.changeTheme(ThemeData.light()); +``` + +Jeśli chcesz stworzyć coś jak przycisk zmieniający motyw aplikacji na onTap, możesz połączyć dwia Get API. Api sprawdzające czy ciemny motyw jest używany i Api zajmujące się zmianą motywu. Po prostu użyj tego w onPressed: + +```dart +Get.changeTheme(Get.isDarkMode? ThemeData.light(): ThemeData.dark());featury +``` + +Kiedy ciemny motyw jest aktywny zmieni się on na jasny, w przeciwnym wypadku zmieni się na ciemny. + +Jeśli interesuje Cię jak zmieniać motywy podążaj za samouczkiem na Medium pokazującum zmianę motywu przy użyciu Get: + +- [Dynamic Themes in 3 lines using Get](https://medium.com/swlh/flutter-dynamic-themes-in-3-lines-c3b375f292e3) - Samouczek stworzony przez [Rod Brown](https://github.com/RodBr). + +## Inne zaawansowane API + +```dart +// give the current args from currentScreen +Get.arguments + +// give name of previous route +Get.previousRoute + +// give the raw route to access for example, rawRoute.isFirst() +Get.rawRoute + +// give access to Rounting API from GetObserver +Get.routing + +// check if snackbar is open +Get.isSnackbarOpen + +// check if dialog is open +Get.isDialogOpen + +// check if bottomsheet is opefeaturyn +Get.isBottomSheetOpen + +// remove one route. +Get.removeRoute() + +// back repeatedly until the predicate returns true. +Get.until() + +// go to next route and remove all the previous routes until the predicate returns true. +Get.offUntil() + +// go to next named route and remove all the previous routes until the predicate returns true. +Get.offNamedUntil() + +//Check in what platform the app is running +GetPlatform.isAndroid +GetPlatform.isIOS +GetPlatform.isWeb + +// Equivalent to the method: MediaQuery.of(context).size.height, but they are immutable. +Get.height +Get.width + +// Gives the current context of navigator. +Get.context + +// Gives the context of the snackbar/dialog/bottomsheet in the foreground anywhere in your code. +Get.contextOverlay + +// Note: the following methods are extensions on context. Since you +// have access to context in any place of your UI, you can use it anywhere in the UI code + +// If you need a changeable height/width (like browser windows that can be scfeaturyaled) you will need to use context. +context.width +context.height + +// gives you the power to define half the screen now, a third of it and so on. +//Useful for responsive applications. +// param dividedBy (double) optional - default: 1 +// param reducedBy (double) optional - default: 0 +context.heightTransformer() +context.widthTransformer() + +/// similar to MediaQuery.of(context).size +context.mediaQuerySize() + +/// similar to MediaQuery.of(context).padding +context.mediaQueryPadding() + +/// similar to MediaQuery.of(context).viewPadding +context.mediaQueryViewPadding() + +/// similar to MediaQuery.of(context).viewInsets; +context.mediaQueryViewInsets() + +/// similar to MediaQuery.of(context).orientation; +context.orientation() + +/// check if device is on landscape mode +context.isLandscape() + +/// check if device is on portrait mode +context.isPortrait() + +/// similar to MediaQuery.of(context).devicePixelRatio; +context.devicePixelRatio() + +/// similar to MediaQuery.of(context).textScaleFactor; +context.textScaleFactor() + +/// get the shortestSide from screen +context.mediaQueryShortestSide() + +/// True if width be larger thfeaturyan 800 +context.showNavbar() + +/// True if the shortestSide is smaller than 600p +context.isPhone() + +/// True if the shortestSide is largest than 600p +context.isSmallTablet() + +/// True if the shortestSide is largest than 720p +context.isLargeTablet() + +/// True if the current device is Tablet +context.isTablet() +``` + +### Opcjonalne globalne ustawienia i manualna konfiguracja + +GetMaterialApp konfiguruje wszystko za Ciebie, ale jeśli chcesz możesz konfigurować Get manualnie. + +```dart +MaterialApp( + navigatorKey: Get.key, + navigatorObservers: [GetObserver()], +); +``` + +Będziesz mógł używać swojego Midware z GetObserver, nie wpływa to na nic. + +```dart +MaterialApp( + navigatorKey: Get.key, + navigatorObservers: [ + GetObserver(MiddleWare.observer) // Here + ], +); +``` + +Mozesz stworzyć globalne ustawienia dla Get. Tylko dodaj Get.config do swojego kodu przed użyciem routów, lub bezpośrednio w GetMaterialApp + +```dart +GetMaterialApp( + enableLog: true, + defaultTransition: Transition.fade, + opaqueRoute: Get.isOpaqueRouteDefault, + popGesture: Get.isPopGestureEnable, + transitionDuration: Get.defaultDurationTransition, + defaultGlobalState: Get.defaultGlobalState,https://github.com/jonataslaw/ge +); + +Get.config( + enableLog = true, + defaultPopGesture = true, + defaultTransition = Transitions.cupertino +) +``` + +Opcjonalnie możesz przekierować wszystkie logi z Get by używać swojej ulubionej paczki i zbierać w niej logi. + +```dart +GetMaterialApp( + enableLog: true, + logWriterCallback: localLogWriter, + ); + void localLogWriter(String text, {bool isError = false}) { + // tutaj przekaż wiadomosci do ulubionej paczki + // pamiętaj że nawet jeśli "enableLog: false" logi i tak będą wysłane w tym callbacku + // Musisz sprawdzić konfiguracje flag jeśli chcesz przez GetConfig.isLogEnable + } +``` +## Video tłumaczące inne funkcjonalności GetX + + +Tadas Petra nagrał niezwykły film tłumaczący powyższe zagadnienia! + +Link: [GetX Other Features](https://youtu.be/ttQtlX_Q0eU) + + +# Zmiany od 2.0 + +1- Typy Rx: + +| Przed | Po | +| ------- | ---------- | +| StringX | `RxString` | +| IntX | `RxInt` | +| MapX | `RxMax` | +| ListX | `RxList` | +| NumX | `RxNum` | +| DoubleX | `RxDouble` | + +RXController i GetBuilder teraz zostały połączone. Nie musisz już pamiętać którego kontrolera chcesz użyć, po prostu korzystaj z GetxController, będzie działać zarówno dla prostego jak i reaktywnego menadżera stanów. + +2- NamedRoutes +Wcześniej: + +```dart +GetMaterialApp( + namedRoutes: { + '/': GetRoute(page: Home()), + } +) +``` + +Teraz: + +```dart +GetMaterialApp( + getPages: [ + GetPage(name: '/', page: () => Home()), + ] +) +``` + +Po co ta zmiana? +Często może być niezbędnym decydowanie która strona będzie wyświetlana w zależności od parametru, lub tokenu logowania. Wczesniejsze podejście było nieelastyczne, ponieważ na to nie pozwalało. Zawarcie strony w funkcji zmniejszyło sporzycie RAM-u, ze względu na niealokowanie routów od początku działania aplikacji. Pozwoliło to także na takie podejscie: + +```dart + +GetStorage box = GetStorage(); + +GetMaterialApp( + getPages: [ + GetPage(name: '/', page:(){ + return box.hasData('token') ? Home() : Login(); + }) + ] +) +``` diff --git a/siro_rider/packages/get/README.pt-br.md b/siro_rider/packages/get/README.pt-br.md new file mode 100644 index 0000000..7793293 --- /dev/null +++ b/siro_rider/packages/get/README.pt-br.md @@ -0,0 +1,1132 @@ +![](https://raw.githubusercontent.com/jonataslaw/getx-community/master/get.png) + +**Idiomas: [Inglês](README.md), [Vietnamita](README-vi.md), [Indonésia](README.id-ID.md), [Urdu](README.ur-PK.md), [Chinês](README.zh-cn.md), Português (este arquivo), [Espanhol](README-es.md), [Russo](README.ru.md), [Polonês](README.pl.md), [Coreano](README.ko-kr.md), [Francês](README-fr.md)** + +[![pub package](https://img.shields.io/pub/v/get.svg?label=get&color=blue)](https://pub.dev/packages/get) +[![popularity](https://badges.bar/get/popularity)](https://pub.dev/packages/sentry/score) +[![likes](https://badges.bar/get/likes)](https://pub.dev/packages/get/score) +[![pub points](https://badges.bar/get/pub%20points)](https://pub.dev/packages/get/score) +![building](https://github.com/jonataslaw/get/workflows/build/badge.svg) +[![style: effective dart](https://img.shields.io/badge/style-effective_dart-40c4ff.svg)](https://pub.dev/packages/effective_dart) +[![Discord Shield](https://img.shields.io/discord/722900883784073290.svg?logo=discord)](https://discord.com/invite/9Hpt99N) +[![Get on Slack](https://img.shields.io/badge/slack-join-orange.svg)](https://communityinviter.com/apps/getxworkspace/getx) +[![Telegram](https://img.shields.io/badge/chat-on%20Telegram-blue.svg)](https://t.me/joinchat/PhdbJRmsZNpAqSLJL6bH7g) + + Awesome Flutter + +Buy Me A Coffee + + +![](https://raw.githubusercontent.com/jonataslaw/getx-community/master/getx.png) + +

Pedimos desculpas por qualquer parte não traduzida aqui. O GetX™ é atualizado com muita frequência e as traduções podem não vir ao mesmo tempo. Então, para manter essa documentação pelo menos com tudo que a versão em inglês tem, eu vou deixar todos os textos não-traduzidos aqui (eu considero que é melhor ele estar lá em inglês do que não estar), então se alguém quiser traduzir, seria muito útil 😁

+ +- [Sobre Get](#sobre-get) +- [Instalando](#instalando) +- [App Counter usando GetX](#app-counter-usando-getx) +- [Os três pilares](#os-três-pilares) + - [Gerenciamento de estado](#gerenciamento-de-estado) + - [Reactive state manager](#reactive-state-manager) + - [Mais detalhes sobre gerenciamento de estado](#mais-detalhes-sobre-gerenciamento-de-estado) + - [Explicação em video do gerenciamento de estado](#explicação-em-video-do-gerenciamento-de-estado) + - [Gerenciamento de rotas](#gerenciamento-de-rotas) + - [Mais detalhes sobre gerenciamento de rotas](#mais-detalhes-sobre-gerenciamento-de-rotas) + - [Explicação em video do gerenciamento de rotas](#explicação-em-video-do-gerenciamento-de-rotas) + - [Gerenciamento de Dependência](#gerenciamento-de-dependência) + - [Mais detalhes sobre gerenciamento de dependências](#mais-detalhes-sobre-gerenciamento-de-dependências) +- [Utilidades](#utilidades) + - [Internacionalização](#internacionalização) + - [Traduções](#traduções) + - [Usando traduções](#usando-traduções) + - [Localidade](#localidade) + - [Alterar local](#alterar-local) + - [Localidade do sistema operacional](#localidade-do-sistema-operacional) + - [Mudar tema (changeTheme)](#mudar-tema-changetheme) + - [GetConnect](#getconnect) + - [Configuração Padrão](#configuração-padrão) + - [Configuração Personalizada](#configuração-personalizada) + - [GetPage Middleware](#getpage-middleware) + - [Priority](#priority) + - [Redirect](#redirect) + - [onPageCalled](#onpagecalled) + - [OnBindingsStart](#onbindingsstart) + - [OnPageBuildStart](#onpagebuildstart) + - [OnPageBuilt](#onpagebuilt) + - [OnPageDispose](#onpagedispose) + - [Outras APIs avançadas](#outras-apis-avançadas) + - [Configurações Globais opcionais e configurações manuais](#configurações-globais-opcionais-e-configurações-manuais) + - [Widgets de Estado Local](#widgets-de-estado-local) + - [ValueBuilder](#valuebuilder) + - [ObxValue](#obxvalue) + - [Explicação em vídeo sobre Outras Features do GetX](#explicação-em-vídeo-sobre-outras-features-do-getx) + - [Dicas Úteis](#dicas-úteis) + - [GetView](#getview) + - [GetWidget](#getwidget) + - [GetxService](#getxservice) +- [Breaking Changes da versão 2 para 3](#breaking-changes-da-versão-2-para-3) + - [Tipagem Rx](#tipagem-rx) + - [RxController e GetBuilder se uniram](#rxcontroller-e-getbuilder-se-uniram) + - [Rotas nomeadas](#rotas-nomeadas) + - [Porque essa mudança?](#porque-essa-mudança) +- [Por que GetX™?](#por-que-getx) +- [Comunidade](#comunidade) + - [Canais da comunidade](#canais-da-comunidade) + - [Como contribuir](#como-contribuir) + - [Artigos e vídeos](#artigos-e-vídeos) + +# Sobre Get + +- Get é uma biblioteca poderosa e extraleve para Flutter. Ela combina um gerenciador de estado de alta performance, injeção de dependência inteligente e gerenciamento de rotas de uma forma rápida e prática. + +- GetX™ possui 3 princípios básicos, o que significa que esta é a prioridade para todos os recursos da biblioteca: **PRODUTIVIDADE, PERFORMANCE AND ORGANIZAÇÃO.** + + - **PERFOMANCE**: GetX™ é focado em desempenho e consumo mínimo de recursos. GetX não usa Streams ou ChangeNotifier. + + - **PRODUTIVIDADE**: GetX™ usa uma sintaxe fácil e agradável. Não importa o que você queira fazer, sempre há uma maneira mais fácil com GetX™. Isso economizará horas de desenvolvimento e extrairá o máximo de desempenho que seu aplicativo pode oferecer. + Geralmente, o desenvolvedor deve se preocupar em remover os controladores da memória. Com GetX™, isso não é necessário porque, por padrão, os recursos são removidos da memória quando não são usados. Se quiser mantê-lo na memória, você deve declarar explicitamente "permanent: true" em sua dependência. Dessa forma, além de economizar tempo, você corre menos risco de ter dependências desnecessárias na memória. O carregamento da dependência também é lazy por padrão. + + - **ORGANIZAÇÃO**: GetX™ permite o desacoplamento total da View, lógica de apresentação, lógica de negócios, injeção de dependência e navegação. Você não precisa de contexto para navegar entre as rotas, portanto, você não depende da árvore do widget (visualização) para isso. Você não precisa de contexto para acessar seus Controllers/BLoCs por meio de um inheritedWidget, então você desacopla completamente sua lógica de apresentação e lógica de negócios de sua camada de visualização. Você não precisa injetar suas classes Controllers/Models/BLoCs em sua árvore de widgets através de multiproviders, pois GetX™ usa seu próprio recurso de injeção de dependência, desacoplando a DI de sua View completamente. + Com GetX™ você sabe onde encontrar cada recurso de sua aplicação, tendo o código limpo por padrão. Isso além de facilitar a manutenção, torna o compartilhamento dos módulos, algo que até então em Flutter era impensável, em algo totalmente possível. + O BLoC foi um ponto de partida para organizar o código no Flutter, ele separa a lógica de negócios da visualização. GetX™ é uma evolução natural disso, separando não apenas a lógica de negócios, mas a lógica de apresentação. O bônus da injeção de dependências e rotas também são dissociadas e a camada de dados está fora de tudo. Você sabe onde está tudo e tudo isso de uma maneira mais fácil do que construir um hello world. + GetX™ é a maneira mais fácil, prática e escalonável de construir aplicativos de alto desempenho com o Flutter SDK, com um grande ecossistema em torno dele que funciona perfeitamente em conjunto, sendo fácil para iniciantes e preciso para especialistas. É seguro, estável, atualizado e oferece uma grande variedade de APIs integradas que não estão presentes no Flutter SDK padrão. + +- GetX™ não é inchado. Possui uma infinidade de recursos que permitem que você comece a programar sem se preocupar com nada, mas cada um desses recursos está em contêineres separados e só são iniciados após o uso. Se você usar apenas o Gerenciamento de estado, apenas o Gerenciamento de estado será compilado. Se você usar apenas rotas, nada do gerenciamento de estado será compilado. + +- GetX™ possui um enorme ecossistema, uma grande comunidade, um grande número de colaboradores e será mantido enquanto o Flutter existir. Getx também é capaz de rodar com o mesmo código no Android, iOS, Web, Mac, Linux, Windows e em seu servidor. +**É possível reutilizar totalmente seu código feito no frontend em seu backend com [Get Server](https://github.com/jonataslaw/get_server)**. + +**Além disso, todo o processo de desenvolvimento pode ser totalmente automatizado, tanto no servidor quanto no front-end com **[Get CLI](https://github.com/jonataslaw/get_cli)**. + +**Além disso, para aumentar ainda mais sua produtividade, temos a [extensão para VSCode](https://marketplace.visualstudio.com/items?itemName=get-snippets.get-snippets) e a [extensão para Android Studio/Intellij](https://plugins.jetbrains.com/plugin/14975-getx-snippets)** + +# Instalando + +Adicione Get ao seu arquivo pubspec.yaml + +```yaml +dependencies: + get: +``` + +Importe o get nos arquivos que ele for usado: + +```dart +import 'package:get/get.dart'; +``` + +# App Counter usando GetX + +O app 'Counter' criado por padrão no flutter com o comando `flutter create` tem mais de 100 linhas(incluindo os comentários). Para demonstrar o poder do Get, irei demonstrar como fazer o mesmo 'Counter' mudando o estado em cada toque trocando entre páginas e compartilhando o estado entre telas. Tudo de forma organizada, separando a lógica de negócio da View, COM SOMENTE 26 LINHAS INCLUINDO COMENTÁRIOS + +- Passo 1: +Troque `MaterialApp` para `GetMaterialApp` + +```dart +void main() => runApp(GetMaterialApp(home: Home())); +``` + +- **Obs:** Isso não modifica o `MaterialApp` do Flutter, GetMaterialApp não é uma versão modificada do MaterialApp, é só um Widget pré-configurado, que tem como child o MaterialApp padrão. Você pode configurar isso manualmente, mas definitivamente não é necessário. GetMaterialApp vai criar rotas, injetá-las, injetar traduções, injetar tudo que você precisa para navegação por rotas (gerenciamento de rotas). Se você quer somente usar o gerenciador de estado ou somente o gerenciador de dependências, não é necessário usar o GetMaterialApp. Ele somente é necessário para: + - Rotas + - Snackbars/bottomsheets/dialogs + - apis relacionadas a rotas e a ausência de `context` + - Internacionalização +- **Obs²:** Esse passo só é necessário se você for usar o gerenciamento de rotas (`Get.to()`, `Get.back()` e assim por diante), Se você não vai usar isso então não é necessário seguir o passo 1 + +- Passo 2: +Cria a sua classe de regra de negócio e coloque todas as variáveis, métodos e controllers dentro dela. +Você pode fazer qualquer variável observável usando um simples `.obs` + +```dart +class Controller extends GetxController{ + var count = 0.obs; + increment() => count.value++; +} +``` + +- Passo 3: +Crie sua View usando StatelessWidget, já que, usando Get, você não precisa mais usar StatefulWidgets. + +```dart +class Home extends StatelessWidget { + + @override + Widget build(context) { + + // Instancie sua classe usando Get.put() para torná-la disponível para todas as rotas subsequentes + final Controller c = Get.put(Controller()); + + return Scaffold( + // Use Obx(()=> para atualizar Text() sempre que a contagem é alterada. + appBar: AppBar(title: Obx(() => Text("Total de cliques: ${c.count}"))), + + // Troque o Navigator.push de 8 linhas por um simples Get.to(). Você não precisa do 'context' + body: Center(child: ElevatedButton( + child: Text("Ir pra Outra tela"), onPressed: () => Get.to(Outra()))), + floatingActionButton: + FloatingActionButton(child: Icon(Icons.add), onPressed: c.increment)); + } +} + +class Outra extends StatelessWidget { + // Você pode pedir o Get para encontrar o controller que foi usado em outra página e redirecionar você pra ele. + final Controller c = Get.find(); + @override + Widget build(context) => Scaffold(body: Center(child: Text("${c.count}"))); +} + +``` + +Resultado: + +![](https://raw.githubusercontent.com/jonataslaw/getx-community/master/counter-app-gif.gif) + +Esse é um projeto simples mas já deixa claro o quão poderoso o Get é. Enquanto seu projeto cresce, essa diferença se torna bem mais significante. + +Get foi feito para funcionar com times, mas torna o trabalho de um desenvolvedor individual simples. + +Melhore seus prazos, entregue tudo a tempo sem perder performance. Get não é para todos, mas se você identificar com o que foi dito acima, Get é para você! + + +# Os três pilares + +## Gerenciamento de estado + +GetX™ possui dois gerenciadores de estado diferentes: o gerenciador de estado simples (vamos chamá-lo de GetBuilder) e o gerenciador de estado reativo (GetX/Obx) + +### Reactive state manager + +Programação reativa pode alienar muitas pessoas porque é dito que é complicado. GetX™ transforma a programação reativa em algo bem simples: + +* Você não precisa criar StreamControllers +* Você não precisa criar um StreamBuilder para cada variável +* Você não precisa criar uma classe para cada estado +* Você não precisa criar um get para o valor inicial +* Você não precisará usar geradores de código + +Programação reativa com o Get é tão fácil quanto usar setState. + +Vamos imaginar que você tenha uma variável e quer que toda vez que ela alterar, todos os widgets que a usam são automaticamente alterados. + +Essa é sua variável: + +```dart +var name = 'Jonatas Borges'; +``` + +Para fazer dela uma variável observável, você só precisa adicionar `.obs` no final: + +```dart +var name = 'Jonatas Borges'.obs; +``` + +E Na UI, quando quiser mostrar a variável e escutar as mudanças dela, simplesmente faça isso: + +```dart +Obx (() => Text (controller.name)); +``` + +Só isso. É *simples assim*; + +### Mais detalhes sobre gerenciamento de estado + +**Veja uma explicação mais completa do gerenciamento de estado [aqui](./documentation/pt_BR/state_management.md). Lá terá mais exemplos e também a diferença do simple state manager do reactive state manager** + +### Explicação em video do gerenciamento de estado + +Amateur Coder fez um vídeo ótimo sobre o gerenciamento de estado! (em inglês). Link: [Complete GetX State Management](https://www.youtube.com/watch?v=CNpXbeI_slw) + +Você vai ter uma boa idea do poder do GetX™ + +## Gerenciamento de rotas + +Se você for usar routes / snackbars / dialogs / bottomsheets sem contexto, GetX™ é excelente para você também, veja: + +Adicione "Get" antes do seu MaterialApp, transformando-o em GetMaterialApp + +```dart +GetMaterialApp( // Antes: MaterialApp( + home: MyHome(), +) +``` + +Para navegar para uma próxima tela: + +```dart +Get.to(ProximaTela()); +``` + +Para navegar para uma próxima tela com uma rota nomeada. Veja mais detalhes sobre rotas nomeadas [aqui](./documentation/pt_BR/route_management.md#navegar-com-rotas-nomeadas) + +```dart +Get.toNamed('/detalhes'); +``` + +Para fechar snackbars, dialogs, bottomsheets, ou qualquer coisa que você normalmente fecharia com o `Navigator.pop(context)` (como por exemplo fechar a View atual e voltar para a anterior): + +```dart +Get.back(); +``` + +Para ir para a próxima tela e NÃO deixar opção para voltar para a tela anterior (bom para SplashScreens, telas de login e etc.): + +```dart +Get.off(ProximaTela()); +``` + +Para ir para a próxima tela e cancelar todas as rotas anteriores (útil em telas de carrinho, votações ou testes): + +```dart +Get.offAll(ProximaTela()); +``` + +Para navegar para a próxima rota e receber ou atualizar dados assim que retornar da rota: + +```dart +var dados = await Get.to(Pagamento()); +``` + +Notou que você não precisou usar `context` para fazer nenhuma dessas coisas? Essa é uma das maiores vantagens de usar o gerenciamento de rotas do GetX™. Com isso, você pode executar todos esse métodos de dentro da classe Controller, sem preocupações. + +### Mais detalhes sobre gerenciamento de rotas + +**GetX™ funciona com rotas nomeadas também! Veja uma explicação mais completa do gerenciamento de rotas [aqui](./documentation/pt_BR/route_management.md)** + +### Explicação em video do gerenciamento de rotas + +Amateur Coder fez um outro vídeo excelente sobre gerenciamento de rotas! Link: [Complete Getx Navigation](https://www.youtube.com/watch?v=RaqPIoJSTtI) + +## Gerenciamento de Dependência + +- Nota: Se você está usando o gerenciador de estado do Get, você não precisa se preocupar com isso, só leia a documentação, mas dê uma atenção a api `Bindings`, que vai fazer tudo isso automaticamente para você. + +Já está usando o Get e quer fazer seu projeto o melhor possível? Get tem um gerenciador de dependência simples e poderoso que permite você pegar a mesma classe que seu Bloc ou Controller com apenas uma linha de código, sem Provider context, sem inheritedWidget: + +```dart +Controller controller = Get.put(Controller()); // Em vez de Controller controller = Controller(); +``` + +Em vez de instanciar sua classe dentro da classe que você está usando, você está instanciando ele dentro da instância do Get, que vai fazer ele ficar disponível por todo o App para que então você possa usar seu controller (ou uma classe Bloc) normalmente + + +**Dica:** O gerenciamento de dependência Get é desacoplado de outras partes do pacote, então se, por exemplo, seu aplicativo já estiver usando um gerenciador de estado (qualquer um, não importa), você não precisa reescrever tudo, você pode usar esta injeção de dependência sem problemas + +```dart +controller.fetchApi(); +``` + +Agora, imagine que você navegou por inúmeras rotas e precisa de dados que foram deixados para trás em seu controlador. Você precisaria de um gerenciador de estado combinado com o Provider ou Get_it, correto? Não com Get. Você só precisa pedir ao Get para "procurar" pelo seu controlador, você não precisa de nenhuma dependência adicional para isso: + +```dart +Controller controller = Get.find(); +// Sim, parece Magia, o Get irá descobrir qual é seu controller e irá te entregar. +// Você pode ter 1 milhão de controllers instanciados, o Get sempre te entregará o controller correto. +// Apenas se lembre de Tipar seu controller, final controller = Get.find(); por exemplo, não irá funcionar. +``` + +E então você será capaz de recuperar os dados do seu controller que foram obtidos anteriormente: + +```dart +Text(controller.textFromApi); +``` + +Procurando por `lazyLoading` (carregar somente quando for usar)? Você pode declarar todos os seus controllers e eles só vão ser inicializados e chamados quando alguém precisar. Você pode fazer isso + +```dart +Get.lazyPut(()=> ApiMock()); +/// ApiMock só será chamado quando alguém usar o Get.find pela primeira vez +``` + +### Mais detalhes sobre gerenciamento de dependências + +**Veja uma explicação mais completa do gerenciamento de dependência [aqui](./documentation/pt_BR/dependency_management.md)** + +# Utilidades + +## Internacionalização +### Traduções +Nós mantemos as traduções num simples dictionary map de chave-valor. +Para adicionar traduções personalizadas, crie uma classe e estenda `Translations`. + +```dart +import 'package:get/get.dart'; + +class Messages extends Translations { + @override + Map> get keys => { + 'en_US': { + 'hello': 'Hello World', + }, + 'de_DE': { + 'hello': 'Hallo Welt', + } + }; +} +``` + +#### Usando traduções +Basta anexar `.tr` a chave especificada e ela será traduzida, usando o valor atual de `Get.locale` ou `Get.fallbackLocale`. +```dart +Text('hello'.tr); +``` + +### Localidade +Passe parâmetros para `GetMaterialApp` definir a localidade e as traduções. + +```dart +return GetMaterialApp( + translations: Messages(), // suas traduções + locale: Locale('en', 'US'), // as traduções serão exibidas para esta localidade + fallbackLocale: Locale('en', 'UK'), // especifica uma localidade em caso de falha na localidade definida +); +``` + +#### Alterar local +Use `Get.updateLocale(locale)` para atualizar a localidade. As traduções usarão automaticamente a nova localidade e a UI será atualizada. +```dart +var locale = Locale('en', 'US'); +Get.updateLocale(locale); +``` + +#### Localidade do sistema operacional +Para ler a localidade do sistema operacional, você pode usar `Get.deviceLocale`. +```dart +import 'dart:ui' as ui; + +return GetMaterialApp( + locale: Get.deviceLocale, +); +``` + +## Mudar tema (changeTheme) + +Por favor não use widget acima do GetMaterialApp para atualizar o tema. Isso pode causar keys duplicadas. Várias pessoas estão acostumadas com o jeito normal de criar um Widget `ThemeProvider` só pra alterar o tema do app, mas isso definitivamente NÃO é necessário com GetX™. + +Você pode criar seu tema customizado e simplesmente adicionar dentro do `Get.changeTheme` sem nenhum boilerplate para isso: + +```dart +Get.changeTheme(ThemeData.light()) +``` + +Se você quer criar algo como um botão que muda o tema com o toque, você pode combinar duas APIs GetX™ pra isso: +- A API que checa se o tema dark está sendo aplicado; +- A API de mudar o tema e colocar isso no `onPressed:` + +```dart +Get.changeTheme(Get.isDarkMode ? ThemeData.light() : ThemeData.dark()) +``` + +Quando o modo Dark está ativado, ele vai trocar pro modo light e vice versa. + +Se você quiser saber mais como trocar o tema, você pode seguir esse tutorial no Medium que até ensina persistência do tema usando Get (e SharedPreferences): + +- [Dynamic Themes in 3 lines using Get](https://medium.com/swlh/flutter-dynamic-themes-in-3-lines-c3b375f292e3) - Tutorial by [Rod Brown](https://github.com/RodBr). + + +## GetConnect +GetConnect é uma maneira fácil de se comunicar de trás para a frente com http ou websockets + +### Configuração Padrão +Você pode simplesmente estender GetConnect e usar os métodos GET/POST/PUT/DELETE/SOCKET para se comunicar com sua API Rest ou websockets. + +```dart +class UserProvider extends GetConnect { + // Requisição Get + Future getUser(int id) => get('http://youapi/users/$id'); + // Requisição Post + Future postUser(Map data) => post('http://youapi/users', body: data); + // Requisição Post com Arquivo + Future> postCases(List image) { + final form = FormData({ + 'file': MultipartFile(image, filename: 'avatar.png'), + 'otherFile': MultipartFile(image, filename: 'cover.png'), + }); + return post('http://youapi/users/upload', form); + } + + GetSocket userMessages() { + return socket('https://yourapi/users/socket'); + } +} +``` +### Configuração Personalizada +GetConnect é altamente personalizável, você pode definir uma base Url, modificadores de resposta, modificadores de Requests, definir um autenticador e até o número de tentativas em que tentará se autenticar, além de dar a possibilidade de definir um decodificador padrão que irá transformar todas as suas solicitações em seus modelos sem qualquer configuração adicional. + +```dart +class HomeProvider extends GetConnect { + @override + void onInit() { + // Todas as requisições passam por jsonEncode e então por CasesModel.fromJson() + httpClient.defaultDecoder = CasesModel.fromJson; + httpClient.baseUrl = 'https://api.covid19api.com'; + // baseUrl = 'https://api.covid19api.com'; // Define baseUrl para + // Http e websockets se usado sem uma instância [httpClient] + + // Anexa a propriedade 'apikey' no cabeçalho de todas as requisições + httpClient.addRequestModifier((request) { + request.headers['apikey'] = '12345678'; + return request; + }); + + // Mesmo que o servidor envie dados do país "Brasil", + // eles nunca serão exibidos para os usuários, porque você removeu + // os dados da resposta, mesmo antes de a resposta ser entregue + httpClient.addResponseModifier((request, response) { + CasesModel model = response.body; + if (model.countries.contains('Brazil')) { + model.countries.remove('Brazil'); + } + }); + + httpClient.addAuthenticator((request) async { + final response = await get("http://yourapi/token"); + final token = response.body['token']; + // Configurando um cabeçalho + request.headers['Authorization'] = "$token"; + return request; + }); + + // O autenticador será chamado 3 vezes se HttpStatus for + // HttpStatus.unauthorized + httpClient.maxAuthRetries = 3; + } + } + + @override + Future> getCases(String path) => get(path); +} +``` + +## GetPage Middleware + +O GetPage agora tem uma nova propriedade que recebe uma lista de GetMiddleWare e executa cada item na ordem específica. + +**Nota**: Quando GetPage tem Middlewares, todos os filhos desta página terão os mesmos middlewares automaticamente. + +### Priority + +A ordem dos middlewares a serem executados pode ser definida pela prioridade no GetMiddleware. + +```dart +final middlewares = [ + GetMiddleware(priority: 2), + GetMiddleware(priority: 5), + GetMiddleware(priority: 4), + GetMiddleware(priority: -8), +]; +``` +Esses middlewares serão executados nesta ordem: **-8 => 2 => 4 => 5** + +### Redirect + +Esta função será chamada quando a página da rota chamada estiver sendo pesquisada. RouteSettings se torna o resultado do redirecionamento. Ou retorne nulo e não haverá redirecionamento. + +```dart +RouteSettings redirect(String route) { + final authService = Get.find(); + return authService.authed.value ? null : RouteSettings(name: '/login') +} +``` + +### onPageCalled + +Esta função será chamada quando uma página for chamada, antes de qualquer coisa ser criada e +você pode usá-la para mudar algo sobre a página ou dar-lhe uma nova página + +```dart +GetPage onPageCalled(GetPage page) { + final authService = Get.find(); + return page.copyWith(title: 'Welcome ${authService.UserName}'); +} +``` + +### OnBindingsStart + +Esta função será chamada logo antes da inicialização dos Bindings. +Aqui você pode alterar as ligações desta página. + +```dart +List onBindingsStart(List bindings) { + final authService = Get.find(); + if (authService.isAdmin) { + bindings.add(AdminBinding()); + } + return bindings; +} +``` + +### OnPageBuildStart + +Esta função será chamada logo após a inicialização dos Bindings. +Aqui você pode fazer algo depois de criar as ligações e antes de criar o widget da página. + +```dart +GetPageBuilder onPageBuildStart(GetPageBuilder page) { + print('bindings are ready'); + return page; +} +``` + +### OnPageBuilt + +Esta função será chamada logo após a função GetPage.page ser chamada e fornecerá o resultado da função e obtém o widget que será mostrado. + +### OnPageDispose + +Esta função será chamada logo após descartar todos os objetos relacionados (controladores, visualizações, ...) da página. + +## Outras APIs avançadas + +```dart +// fornece os arguments da tela atual +Get.arguments + +// fornece o nome da rota anterior +Get.previousRoute + +// fornece a rota bruta para acessar por exemplo, rawRoute.isFirst() +Get.rawRoute + +// fornece acesso a API de rotas de dentro do GetObserver +Get.routing + +// checa se o snackbar está aberto +Get.isSnackbarOpen + +// checa se o dialog está aberto +Get.isDialogOpen + +// checa se o bottomsheet está aberto +Get.isBottomSheetOpen + +// remove uma rota. +Get.removeRoute() + +// volta repetidamente até o predicate retorne true. +Get.until() + +// vá para a próxima rota e remove todas as rotas +//anteriores até que o predicate retorne true. +Get.offUntil() + +// vá para a próxima rota nomeada e remove todas as +//rotas anteriores até que o predicate retorne true. +Get.offNamedUntil() + +// Verifica em que plataforma o app está sendo executado +// (Esse método é completamente compatível com o FlutterWeb, +// diferente do método do framework "Platform.isAndroid") +GetPlatform.isAndroid +GetPlatform.isIOS +GetPlatform.isMacOS +GetPlatform.isWindows +GetPlatform.isLinux +GetPlatform.isFuchsia + +// Verifica o tipo de dispositivo +GetPlatform.isMobile +GetPlatform.isDesktop +// Todas as plataformas são suportadas de forma independente na web! +// Você pode saber se está executando dentro de um navegador +// no Windows, iOS, OSX, Android, etc. +GetPlatform.isWeb + +// Equivalente ao método: MediaQuery.of(context).size.width ou height, mas é imutável. +// Significa que não irá atualizar mesmo que o tamanho da tela mude (como em navegadores ou app desktop) +Get.height +Get.width + +// fornece o context da tela em qualquer lugar do seu código. +Get.context + +// fornece o context de snackbar/dialog/bottomsheet em qualquer lugar do seu código. +Get.contextOverlay + +// Obs: os métodos a seguir são extensions do context. Já que se +// tem acesso ao context em qualquer lugar do código da UI, você pode usar lá + +// Se você precisa de um width/height adaptável (como em navegadores em que a janela pode ser redimensionada) +// você precisa usar 'context' +context.width +context.height + +// Dá a você agora o poder de definir metade da tela, um terço da dela e assim por diante. +// Útil para aplicativos responsivos. +// param dividedBy (double) opcional - default: 1 +// param reducedBy (double) opcional - default: 0 +context.heightTransformer() +context.widthTransformer() + +/// similar a MediaQuery.of(context).size +context.mediaQuerySize() + +/// similar a MediaQuery.of(this).padding +context.mediaQueryPadding() + +/// similar a MediaQuery.of(this).viewPadding +context.mediaQueryViewPadding() + +/// similar a MediaQuery.of(this).viewInsets; +context.mediaQueryViewInsets() + +/// similar a MediaQuery.of(this).orientation; +context.orientation() + +/// verifica se o dispositivo está no modo paisagem +context.isLandscape() + +/// verifica se o dispositivo está no modo retrato +context.isPortrait() + +/// similar a MediaQuery.of(this).devicePixelRatio; +context.devicePixelRatio() + +/// similar a MediaQuery.of(this).textScaleFactor; +context.textScaleFactor() + +/// obtém a menor dimensão (largura ou altura) da tela +context.mediaQueryShortestSide() + +/// retorna True se a largura da tela for maior que 800px +context.showNavbar() + +/// retorna True se a menor dimensão (largura ou altura) da tela for menor que 600px +context.isPhone() + +/// retorna True se a menor dimensão (largura ou altura) da tela for maior ou igual a 600px +context.isSmallTablet() + +/// retorna True se a menor dimensão (largura ou altura) da tela for maior ou igual a 720px +context.isLargeTablet() + +/// retorna True se o dispositivo é um Tablet +context.isTablet() + +/// Retorna um valor de acordo com o tamanho da tela +/// Os valores possíveis são: +/// swatch: se a menor dimensão (largura ou altura) da tela for menor que 300px +/// mobile: se a menor dimensão (largura ou altura) da tela for menor que 600px +/// tablet: se a menor dimensão (largura ou altura) da tela for menor que 1200px +/// desktop: se a largura da tela é maior ou iguial a 1200px +context.responsiveValue() +``` + +### Configurações Globais opcionais e configurações manuais + +GetMaterialApp configura tudo para você, mas se quiser configurar Get manualmente, você pode. + +```dart +MaterialApp( + navigatorKey: Get.key, + navigatorObservers: [GetObserver()], +); +``` + +Você também será capaz de usar seu próprio Middleware dentro do GetObserver, isso não irá influenciar em nada. + +```dart +MaterialApp( + navigatorKey: Get.key, + navigatorObservers: [ + GetObserver(MiddleWare.observer) // Aqui + ], +); +``` + +Você pode criar Configurações Globais para o Get. Apenas adicione `Get.config` ao seu código antes de usar qualquer rota ou faça diretamente no seu GetMaterialApp + +```dart +GetMaterialApp( + enableLog: true, + defaultTransition: Transition.fade, + opaqueRoute: Get.isOpaqueRouteDefault, + popGesture: Get.isPopGestureEnable, + transitionDuration: Get.defaultDurationTransition, + defaultGlobalState: Get.defaultGlobalState, +); +Get.config( + enableLog = true, + defaultPopGesture = true, + defaultTransition = Transitions.cupertino +) +``` + +É possível redirecionar todas as mensagens de log do GetX™. Útil quando se tem um package de logging e vc quer que ele lide com todos os logs + +```dart +GetMaterialApp( + enableLog: true, + logWriterCallback: localLogWriter, +); + +void localLogWriter(String text, {bool isError = false}) { + // passage a mensagem para seu package de logging favorito aqui + // Obs: mesmo que as mensagens de log estejam desativadas + // com o comando "enableLog: false", as mensagens ainda vão passar por aqui + // Você precisa checar essa config manualmente aqui se quiser respeitá-la +} +``` + +### Widgets de Estado Local + +Esses Widgets permitem que você gerencie um único valor e mantenha o estado efêmero e localmente. Temos versões para Reativo e Simples. Por exemplo, você pode usá-los para alternar obscureText em um `TextField`, talvez criar um painel expansível personalizado ou talvez modificar o índice atual em um `BottomNavigationBar` enquanto altera o conteúdo do corpo em um `Scaffold`. + +#### ValueBuilder +Uma simplificação de `StatefulWidget` que funciona com um callback de `setState` que passa o valor atualizado. + + +```dart +ValueBuilder( + initialValue: false, + builder: (value, updateFn) => Switch( + value: value, + onChanged: updateFn, // mesma assinatura! Você poderia usar ( newValue ) => updateFn( newValue ) + ), + // se você precisa chamar algo fora do método builder. + onUpdate: (value) => print("Valor atualizado: $value"), + onDispose: () => print("Widget desmontado"), +), +``` + +#### ObxValue +Similar a ValueBuilder, mas esta é a versão Reativa, você passa uma instância Rx (lembra do .obs mágico?) e +atualiza automaticamente... não é incrível? + +```dart +ObxValue( + (data) => Switch( + value: data.value, + onChanged: data, // Rx tem uma função _callable_! Você poderia usar (flag) => data.value = flag, + ), + false.obs, +), +``` + +### Explicação em vídeo sobre Outras Features do GetX + +Amateur Coder fez um vídeo incrível sobre utils, storage, bindings e outras features! Link: [GetX Other Features](https://youtu.be/ttQtlX_Q0eU) + + +## Dicas Úteis + +`.obs`ervables (também conhecidos como _Rx_ Types) possuem uma grande variedade de métodos e operadores internos. + +> É muito comum acreditar que uma propriedade com `.obs` **É** o valor real... mas não se engane! +> Evitamos a declaração de tipo da variável, porque o compilador do Dart é inteligente o suficiente e o código +> parece mais limpo, mas: + +```dart +var message = 'Hello world'.obs; +print( 'Message "$message" é do tipo ${message.runtimeType}'); +``` + +Mesmo que `message` _imprima_ o valor da string, seu tipo é **RxString**! + +Então, você não pode fazer `message.substring( 0, 4 )`. +Você tem que acessar o `valor` real dentro do _observable_: +A "maneira" mais usada é utilizando `.value`, mas, você sabia que também pode usar: + +```dart +final name = 'GetX'.obs; +// apenas "atualiza" o stream, se o valor for diferente do atual. +name.value = 'Hey'; + +// Todas as propriedades Rx são "chamáveis" e retorna o novo valor. +// mas esta abordagem não aceita `null`, a UI não será reconstruída +name('Hello'); + +// é como um getter, imprime 'Hello' +name() ; + +/// números: + +final count = 0.obs; + +// Você pode usar todas as operações não mutáveis ​​de um num! +count + 1; + +// Cuidado! isso só é válido se `count` não for final, mas var +count += 1; + +// Você também pode comparar com os valores: +count > 2; + +/// booleans: + +final flag = false.obs; + +// mude o valor entre true/false +flag.toggle(); + + +/// todos os tipos: + +// Defina `value` como null. +flag.nil(); + +// Todas as operações toString() e toJson() são passada para `value` +print( count ); // chama `toString()` de RxInt + +final abc = [0,1,2].obs; +// Converte o valor em um Array json, imprime RxList +// Json é suportado por todos os Rx types! +print('json: ${jsonEncode(abc)}, type: ${abc.runtimeType}'); + +// RxMap, RxList e RxSet são Rx types especiais, que estendem seus tipos nativos. +// mas você pode trabalhar com uma lista como uma lista normal, embora seja reativa! +abc.add(12); // Coloca 12 na lista, e ATUALIZA o stream. +abc[3]; // como uma lista lê o índice 3. + +// a igualdade funciona com o Rx e o value do observável, mas o hashCode é sempre obtido do value +final number = 12.obs; +print( number == 12 ); // prints > true + +/// Rx Models personalizados: + +// toJson(), toString() são transferidos para o filho, para que você possa implementar +// override neles e imprimir o observável diretamente. + +class User { + String name, last; + int age; + User({this.name, this.last, this.age}); + + @override + String toString() => '$name $last, $age years old'; +} + +final user = User(name: 'John', last: 'Doe', age: 33).obs; + +// `user` é "reativo", mas as propriedades dentro NÃO SÃO! +// Então, se mudarmos alguma variável dentro dele: +user.value.name = 'Roi'; +// O widget não vai reconstruir!, +// `Rx` não tem nenhuma notificação quando você muda algo dentro do usuário. +// Portanto, para classes personalizadas, precisamos "notificar" manualmente a mudança. +user.refresh(); + +// ou podemos usar o método `update()`! +user.update((value){ + value.name='Roi'; +}); + +print( user ); // Resultado (toString): Roi Doe, 33 years old +``` + +#### GetView + +Eu amo este Widget, é tão simples, mas tão útil! + +É um Widget `const Stateless` que tem um getter `controller` registrado para Controller, só isso. + +```dart +class AwesomeController extends GetxController { + final String title = 'My Awesome View'; +} + +// SEMPRE lembre de passar o `Type` que você usou para registrar seu controlador! +class AwesomeView extends GetView { + @override + Widget build(BuildContext context) { + return Container( + padding: EdgeInsets.all(20), + child: Text(controller.title ), // apenas chame `controller.something` + ); + } +} +``` + +#### GetWidget + +A maioria das pessoas não tem ideia sobre este widget, ou confunde totalmente o uso dele. +O caso de uso é muito raro, mas muito específico: Ele armazena em `cache` um Controller. +Por causa do _cache_, não pode ser um `const Stateless`. + +> Então, quando você precisa armazenar em "cache" um Controller? + +Se você usar, uma outra característica "não tão comum" de **GetX™**: `Get.create()`. + +`Get.create(()=>Controller())` irá gerar um novo `Controller` cada vez que você chamar +`Get.find()`, + +É aí que `GetWidget` brilha... já que você pode usá-lo, por exemplo, +para manter uma lista de itens Todo. Portanto, se o widget for "reconstruído", ele manterá a mesma instância do controlador. + +#### GetxService + +Esta classe é como um `GetxController`, ele compartilha o mesmo ciclo de vida ( `onInit()`, `onReady()`, `onClose()`). +Mas não tem "lógica" dentro dele. Ele apenas notifica o sistema de injeção de dependência do GetX™ de que esta subclasse +**não pode** ser removida da memória. + +Portanto, é muito útil manter seus "Services" sempre acessíveis e ativos com `Get.find()`. Como: +`ApiService`, `StorageService`, `CacheService`. + +```dart +Future main() async { + await initServices(); /// Aguarda a inicialização dos Services. + runApp(SomeApp()); +} + +/// É uma jogada inteligente para inicializar seus services antes de executar o aplicativo Flutter, +/// já que você pode controlar o fluxo de execução (talvez você precise carregar alguma configuração de tema, +/// apiKey, linguagem definida pelo usuário ... então carregue SettingService antes de executar ApiService. +/// então GetMaterialApp() não precisa reconstruir e obtém os valores diretamente. +void initServices() async { + print('iniciando serviços...'); + /// Aqui é onde você coloca a inicialização de get_storage, hive, shared_pref. + /// ou checa a conexão, ou o que quer que seja assíncrono. + await Get.putAsync(() => DbService().init()); + await Get.putAsync(SettingsService()).init(); + print('Todos os serviços iniciados.'); +} + +class DbService extends GetxService { + Future init() async { + print('$runtimeType delays 2 sec'); + await 2.delay(); + print('$runtimeType ready!'); + return this; + } +} + +class SettingsService extends GetxService { + void init() async { + print('$runtimeType delays 1 sec'); + await 1.delay(); + print('$runtimeType ready!'); + } +} +``` + +A única maneira de realmente excluir um `GetxService`, é com o `Get.reset()`, que é como uma +"hot restart" do seu aplicativo. Portanto, lembre-se, se você precisar de persistência absoluta de uma instância de classe durante +o ciclo de vida de seu aplicativo, use GetxService. + + +# Breaking Changes da versão 2 para 3 + +## Tipagem Rx + +| Antes | Depois | +| ------- | ---------- | +| StringX | `RxString` | +| IntX | `RxInt` | +| MapX | `RxMap` | +| ListX | `RxList` | +| NumX | `RxNum` | +| DoubleX | `RxDouble` | + +## RxController e GetBuilder se uniram + +RxController e GetBuilder agora viraram um só, você não precisa mais memorizar qual controller quer usar, apenas coloque `GetxController`, vai funcionar para os dois gerenciamento de estados + +```dart +//Gerenciador de estado simples +class Controller extends GetXController { + String nome = ''; + + void atualizarNome(String novoNome) { + nome = novoNome; + update() + } +} +``` + +```dart +class Controller extends GetXController { + final nome = ''.obs; + + // não precisa de um método direto pra atualizar o nome + // só usar o nome.value +} +``` + +## Rotas nomeadas + +Antes: + +```dart +GetMaterialApp( + namedRoutes: { + '/': GetRoute(page: Home()), + } +) +``` + +Agora: + +```dart +GetMaterialApp( + getPages: [ + GetPage(name: '/', page: () => Home()), + ] +) +``` + +### Porque essa mudança? + +Frequentemente, pode ser necessário decidir qual pagina vai ser mostrada ao usuário a partir de um parâmetro, como um token de login. A forma abordada anteriormente não era flexível, já que não permitia isso. + +Inserir a página numa função reduziu significativamente o consumo de RAM, já que as rotas não são alocadas na memória no momento que o app é iniciado e também permite fazer esse tipo de abordagem: + +```dart + +GetStorage box = GetStorage(); + +GetMaterialApp( + getPages: [ + GetPage(name: '/', page:(){ + return box.hasData('token') ? Home() : Login(); + }) + ] +) +``` + +# Por que GetX™? + +1- Muitas vezes após uma atualização do Flutter, muitos dos seus packages irão quebrar. As vezes acontecem erros de compilação, muitas vezes aparecem erros que ainda não existem respostas sobre e o desenvolvedor necessita saber de onde o erro veio, rastreá-lo, para só então tentar abrir uma issue no repositório correspondente e ver seu problema resolvido. Get centraliza os principais recursos para o desenvolvimento (Gerência de estado, de dependências e de rotas), permitindo você adicionar um único package em seu pubspec e começar a trabalhar. Após uma atualização do Flutter, a única coisa que você precisa fazer é atualizar a dependencia do Get e começar a trabalhar. Get também resolve problemas de compatibilidade. Quantas vezes uma versão de um package não é compatível com a versão de outro, porque um utiliza uma dependência em uma versão e o outro em outra versão? Essa também não é uma preocupação usando Get, já que tudo está no mesmo package e é totalmente compatível. + +2- Flutter é fácil, Flutter é incrível, mas Flutter ainda tem algum boilerplate que pode ser indesejado para maioria dos desenvolvedores, como o Navigator.of(context).push(context, builder[...]. Get simplifica o desenvolvimento. Em vez de escrever 8 linhas de código para apenas chamar uma rota, você pode simplesmente fazer: Get.to(Home()) e pronto, você irá para a próxima página. Urls dinâmicas da web é algo realmente doloroso de fazer com o Flutter atualmente e isso com o GetX™ é estupidamente simples. Gerenciar estados no Flutter e gerenciar dependências também é algo que gera muita discussão, por haver centenas de padrões na pub. Mas não há nada que seja tão fácil quanto adicionar um ".obs" no final de sua variável, colocar o seu widget dentro de um Obx e pronto, todas atualizações daquela variável serão automaticamente atualizadas na tela. + +3- Facilidade sem se preocupar com desempenho. O desempenho do Flutter já é incrível, mas imagine que você use um gerenciador de estados e um locator para distribuir suas classes blocs/stores/controllers/ etc. Você deverá chamar manualmente a exclusão daquela dependência quando não precisar dela. Mas já pensou em simplesmente usar seu controlador e quando ele não tivesse mais sendo usado por ninguém, ele simplesmente fosse excluído da memória? É isso que GetX™ faz. Com o SmartManagement, tudo que não está sendo usado é excluído da memória e você não deve se preocupar em nada além de programar. Você terá garantia que está consumindo o mínimo de recursos necessários, sem ao menos ter criado uma lógica para isso. + +4- Desacoplamento real. Você já deve ter ouvido o conceito "separar a view da lógica de negócios". Isso não é uma peculiaridade do BLoC, MVC ou MVVM, qualquer outro padrão existente no mercado tem esse conceito. No entanto, muitas vezes esse conceito pode ser mitigado no Flutter por conta do uso do context. +Se você precisa de context para localizar um InheritedWidget, você precisa disso na view ou passar o context por parâmetro. Eu particularmente acho essa solução muito feia e para trabalhar em equipes teremos sempre uma dependência da lógica de negócios da View. GetX™ é pouco ortodoxo com a abordagem padrão e apesar de não proibir totalmente o uso de StatefulWidgets, InitState e etc, ele tem sempre uma abordagem similar que pode ser mais limpa. Os controllers tem ciclos de vida e quando você precisa fazer uma solicitação APIREST por exemplo, você não depende de nada da view. Você pode usar onInit para iniciar a chamada http e quando os dados chegarem, as variáveis serão preenchidas. Como GetX™ é totalmente reativo (de verdade e trabalha sob streams), assim que os itens forem preenchidos, automaticamente será atualizado na view todos os widgets que usam aquela variável. Isso permite que as pessoas especialistas em UI trabalhem apenas com widgets e não precisem enviar nada para a lógica de negócio além de eventos do usuário (como clicar em um botão), enquanto as pessoas que trabalham com a lógica de negócio ficarão livres para criá-la e testá-la separadamente. + +# Comunidade + +## Canais da comunidade + +GetX™ tem uma comunidade altamente ativa e útil. Se você tiver dúvidas, ou quiser alguma ajuda com relação ao uso deste framework, por favor entre em nossos canais da comunidade, sua dúvida será respondida mais rapidamente, e será o lugar mais adequado. Este repositório é exclusivo para abertura de issues e solicitação de recursos, mas fique à vontade para fazer parte da Comunidade GetX™. + +| **Slack (Inglês)** | **Discord (Inglês e Português)** | **Telegram (Português)** | +| :-------------------------------------------------------------------------------------------------------------------------- | :-------------------------------------------------------------------------------------------------------------------------- | :-------------------------------------------------------------------------------------------------------------------- | +| [![Get on Slack](https://img.shields.io/badge/slack-join-orange.svg)](https://communityinviter.com/apps/getxworkspace/getx) | [![Discord Shield](https://img.shields.io/discord/722900883784073290.svg?logo=discord)](https://discord.com/invite/9Hpt99N) | [![Telegram](https://img.shields.io/badge/chat-on%20Telegram-blue.svg)](https://t.me/joinchat/PhdbJRmsZNpAqSLJL6bH7g) | + +## Como contribuir + +_Quer contribuir com o projeto? Teremos o orgulho de destacá-lo como um de nossos colaboradores. Aqui estão alguns pontos onde você pode contribuir e tornar o Get (e Flutter) ainda melhor._ + +- Ajudando a traduzir o readme para outros idiomas. +- Adicionando documentação ao readme (muitas funções do Get ainda não foram documentadas). +- Escreva artigos ou faça vídeos ensinando como usar o Get (eles serão inseridos no Readme e futuramente em nosso Wiki). +- Fazendo PRs para código/testes. +- Incluindo novas funções. + +Qualquer contribuição é bem-vinda! + + +## Artigos e vídeos + +- [Dynamic Themes in 3 lines using GetX™](https://medium.com/swlh/flutter-dynamic-themes-in-3-lines-c3b375f292e3) - Tutorial by [Rod Brown](https://github.com/RodBr). (inglês) +- [Complete GetX™ Navigation](https://www.youtube.com/watch?v=RaqPIoJSTtI) - Route management video by Amateur Coder. (inglês) +- [Complete GetX™ State Management](https://www.youtube.com/watch?v=CNpXbeI_slw) - State management video by Amateur Coder. (inglês) +- [GetX™ Other Features](https://youtu.be/ttQtlX_Q0eU) - Utils, storage, bindings and other features video by Amateur Coder. (inglês) +- [Firestore User with GetX™ | Todo App](https://www.youtube.com/watch?v=BiV0DcXgk58) - Video by Amateur Coder. (inglês) +- [Firebase Auth with GetX™ | Todo App](https://www.youtube.com/watch?v=-H-T_BSgfOE) - Video by Amateur Coder. (inglês) +- [The Flutter GetX™ Ecosystem ~ State Management](https://medium.com/flutter-community/the-flutter-getx-ecosystem-state-management-881c7235511d) - State management by [Aachman Garg](https://github.com/imaachman). (inglês) +- [The Flutter GetX™ Ecosystem ~ Dependency Injection](https://medium.com/flutter-community/the-flutter-getx-ecosystem-dependency-injection-8e763d0ec6b9) - Dependency Injection by [Aachman Garg](https://github.com/imaachman). (inglês) +- [GetX™, the all-in-one Flutter package](https://www.youtube.com/watch?v=IYQgtu9TM74) - A brief tutorial covering State Management and Navigation by Thad Carnevalli. (inglês) +- [Build a To-do List App from scratch using Flutter and GetX™](https://www.youtube.com/watch?v=EcnqFasHf18) - UI + State Management + Storage video by Thad Carnevalli. (inglês) +- [GetX™ Flutter Firebase Auth Example](https://medium.com/@jeffmcmorris/getx-flutter-firebase-auth-example-b383c1dd1de2) - Article by Jeff McMorris. (inglês) +- [Flutter State Management with GetX – Complete App](https://www.appwithflutter.com/flutter-state-management-with-getx/) - by App With Flutter. (inglês) +- [Flutter Routing with Animation using Get Package](https://www.appwithflutter.com/flutter-routing-using-get-package/) - by App With Flutter. (inglês) diff --git a/siro_rider/packages/get/README.ru.md b/siro_rider/packages/get/README.ru.md new file mode 100644 index 0000000..d6d1bab --- /dev/null +++ b/siro_rider/packages/get/README.ru.md @@ -0,0 +1,912 @@ +![](https://raw.githubusercontent.com/jonataslaw/getx-community/master/get.png) + +_Языки: Русский (этот файл), [вьетнамский](README-vi.md), [индонезийский](README.id-ID.md), [урду](README.ur-PK.md), [Английский](README.md), [Китайский](README.zh-cn.md), [Бразильский Португальский](README.pt-br.md), [Испанский](README-es.md), [Польский](README.pl.md), [Kорейский](README.ko-kr.md), [French](README-fr.md)._ + +[![pub package](https://img.shields.io/pub/v/get.svg?label=get&color=blue)](https://pub.dev/packages/get) +[![popularity](https://badges.bar/get/popularity)](https://pub.dev/packages/sentry/score) +[![likes](https://badges.bar/get/likes)](https://pub.dev/packages/get/score) +[![pub points](https://badges.bar/get/pub%20points)](https://pub.dev/packages/get/score) +![building](https://github.com/jonataslaw/get/workflows/build/badge.svg) +[![style: effective dart](https://img.shields.io/badge/style-effective_dart-40c4ff.svg)](https://pub.dev/packages/effective_dart) +[![Discord Shield](https://img.shields.io/discord/722900883784073290.svg?logo=discord)](https://discord.com/invite/9Hpt99N) +[![Get on Slack](https://img.shields.io/badge/slack-join-orange.svg)](https://communityinviter.com/apps/getxworkspace/getx) +[![Telegram](https://img.shields.io/badge/chat-on%20Telegram-blue.svg)](https://t.me/joinchat/PhdbJRmsZNpAqSLJL6bH7g) + +Awesome Flutter + +Buy Me A Coffee + +![](https://raw.githubusercontent.com/jonataslaw/getx-community/master/getx.png) + +- [Про Get](#про-get) +- [Установка](#установка) +- [Приложение "Счётчик" с GetX](#приложение-счётчик-с-getx) +- [Три столпа](#три-столпа) + - [Управление состоянием](#управление-состоянием) + - [Реактивное управление состоянием](#реактивное-управление-состоянием) + - [Подробнее об управлении состоянием](#подробнее-об-управлении-состоянием) + - [Управление маршрутами](#управление-маршрутами) + - [Подробнее об управлении маршрутами](#подробнее-об-управлении-маршрутами) + - [Внедрение зависимостей](#внедрение-зависимостей) + - [Подробнее о внедрении зависимостей](#подробнее-о-внедрении-зависимостей) +- [Утилиты](#утилиты) + - [Интернационализация](#интернационализация) + - [Переводы](#переводы) + - [Использование переводов](#использование-переводов) + - [Локализация](#локализация) + - [Изменение локализации](#изменение-локализации) + - [Системная локализация](#системная-локализация) + - [Изменение темы](#изменение-темы) + - [Другие API](#другие-api) + - [Дополнительные глобальные настройки и ручные настройки](#дополнительные-глобальные-настройки-и-ручные-настройки) + - [Локальные виджеты состояния](#локальные-виджеты-состояния) + - [ValueBuilder](#valuebuilder) + - [ObxValue](#obxvalue) + - [Полезные советы](#полезные-советы) + - [GetView](#getview) + - [GetWidget](#getwidget) + - [GetxService](#getxservice) +- [Критические изменения по сравнению с версией 2.0](#критические-изменения-по-сравнению-с-версией-20) +- [Почему Getx?](#почему-getx) +- [Сообщества](#сообщества) + - [Каналы сообщества](#каналы-сообщества) + - [Как внести свой вклад](#как-внести-свой-вклад) + - [Статьи и видео](#статьи-и-видео) + +# Про Get + +- GetX - это сверхлегкое и мощное решение для Flutter. Оно совмещает в себе высокопроизводительное управление состоянием, интеллектуальное внедрение зависимостей, управление маршрутами быстрым и практичным способом. + +- GetX имеет 3 базовых принципа, являющихся приоритетом для всех ресурсов в библиотеке + + - **Производительность:** GetX сфокусирован на производительности и минимальном потреблении ресурсов. Бенчмарки почти всегда не имеют значения в реальном мире, но, если Вам угодно, здесь ([бенчмарки](https://github.com/jonataslaw/benchmarks)) есть индикаторы потребления, где GetX работает лучше, чем другие подходы к управлению состоянием. Разница небольшая, но демонстрирует нашу заботу о ресурсах. + - **Продуктивность:** GetX использует простой и приятный синтаксис. Не имеет значения, что вы хотите сделать, всегда есть более легкий способ с GetX. Это сэкономит часы разработки и обеспечит максимальную производительность, которую может обеспечить ваше приложение. + - **Организация:** GetX позволяет полностью разделить представление, логику представления, бизнес-логику, внедрение зависимостей и навигацию. Вам не нужен контекст для навигации между маршрутами, поэтому вы не зависите от дерева виджетов. Вам не нужен контекст для доступа к вашим контроллерам / блокам через наследуемый виджет, поэтому вы полностью отделяете логику представления и бизнес-логику от уровня визуализации. Вам не нужно внедрять классы Controllers / Models / Blocs в дерево виджетов через мультипровайдеры, поскольку GetX использует собственную функцию внедрения зависимостей, полностью отделяя DI от его представления. + С GetX вы знаете, где найти каждую функцию вашего приложения, имея чистый код по умолчанию. Это, помимо упрощения обслуживания, делает возможным совместное использование модулей, что до того момента во Flutter было немыслимо. + BLoC был отправной точкой для организации кода во Flutter, он отделяет бизнес-логику от визуализации. Getx является естественным развитием этого, разделяя не только бизнес-логику, но и логику представления. Дополнительное внедрение зависимостей и маршрутов также разделено, и уровень данных не учитывается. Вы знаете, где все находится, и это проще, чем написать "Hello World". + GetX - это самый простой, практичный и масштабируемый способ создания высокопроизводительных приложений с помощью Flutter SDK с большой экосистемой вокруг него, которая отлично работает, прост для новичков и точен для экспертов. Он безопасен, стабилен, актуален и предлагает огромный набор встроенных API, которых нет в Flutter SDK по умолчанию. + +- GetX не раздут. Он имеет множество функций, которые позволяют вам начать программировать, ни о чем не беспокоясь, но каждая из этих функций находится в отдельных контейнерах и запускается только после использования. Если вы используете только управление состоянием, то будет скомпилировано только управление состоянием. Если вы используете маршрутизацию, то ничего из управления состоянием не будет скомпилировано. Вы можете воспользоваться репозиторием бенчмарка, и вы увидите, что используя только управление состоянием Get, приложение, которое скомпилировано с помощью Get, имеет меньший размер, чем приложения использующие другие пакеты для управления состоянием, потому что всё, что не используется, не будет скомпилировано в Ваш код. Таким образом каждое решение GetX было спроектировано, чтобы быть сверхлёгким. Также в этом есть и заслуга Flutter, который умеет устранять неиспользуемые ресурсы, как ни один другой фреймворк. + +- Getx имеет огромную экосистему, способную работать с одним и тем же кодом на Android, iOS, в Интернете, Mac, Linux, Windows и на вашем сервере. +**С помощью [Get Server](https://github.com/jonataslaw/get_server) ваш код, созданный на веб-интерфейсе, можно повторно использовать на вашем сервере.** + +**Кроме того, весь процесс разработки может быть полностью автоматизирован как на сервере, так и во внешнем интерфейсе с помощью [Get CLI](https://github.com/jonataslaw/get_cli)**. + +**Кроме того, для дальнейшего повышения вашей продуктивности у нас есть [расширение для VSCode](https://marketplace.visualstudio.com/items?itemName=get-snippets.get-snippets) и [расширение для Android Studio / Intellij](https://plugins.jetbrains.com/plugin/14975-getx-snippets).** + +# Установка + +Добавьте Get в файл pubspec.yaml: + +```yaml +dependencies: + get: +``` + +Импортируйте Get в файлы, в которых планируете его использовать: + +```dart +import 'package:get/get.dart'; +``` + +# Приложение "Счётчик" с GetX + +Проект "Счётчик", созданный по умолчанию для нового проекта на Flutter, имеет более 100 строк (с комментариями). Чтобы показать возможности Get, я продемонстрирую, как сделать "Счётчик", изменяющий состояние при каждом клике, переключении между страницами и передаче состояния между экранами. Всё это вместе с разделением бизнес логики от представления занимает ВСЕГО ЛИШЬ 26 СТРОК КОДА, ВКЛЮЧАЯ КОММЕНТАРИИ. + +- Шаг 1: + Добавьте "Get" перед вашим MaterialApp, превращая его в GetMaterialApp + +```dart +void main() => runApp(GetMaterialApp(home: Home())); +``` + +- Примечание: это не изменяет MaterialApp, GetMaterialApp не является модифицированным MaterialApp, это просто предварительно настроенный виджет, у которого в качестве дочернего по умолчанию используется MaterialApp. Вы можете настроить это вручную, но это не обязательно. GetMaterialApp будет создавать маршруты, вводить их, вводить переводы, вводить всё, что вам нужно для навигации. Если вы используете Get только для управления состоянием или зависимостями, нет необходимости использовать GetMaterialApp. GetMaterialApp необходим для навигации, снекбаров, интернационализации, bottomSheets, диалогов и API, связанных с маршрутами и отсутствием контекста. +- Примечание²: Этот шаг необходим только в том случае, если вы собираетесь использовать управление маршрутами (`Get.to()`, `Get.back()` и так далее). Если вы не собираетесь его использовать, то шаг 1 выполнять необязательно. + +- Шаг 2: + Создайте свой класс бизнес-логики и поместите в него все переменные, методы и контроллеры. + Вы можете сделать любую переменную наблюдаемой, используя простой ".obs". + +```dart +class Controller extends GetxController{ + var count = 0.obs; + increment() => count++; +} +``` + +- Шаг 3: + Создайте свой View, используйте StatelessWidget и сэкономьте немного оперативной памяти, с Get вам больше не нужно использовать StatefulWidget. + +```dart +class Home extends StatelessWidget { + + @override + Widget build(context) { + + // Создайте экземпляр вашего класса с помощью Get.put(), чтобы сделать его доступным для всех "дочерних" маршрутов. + final Controller c = Get.put(Controller()); + + return Scaffold( + // Используйте Obx(()=> чтобы обновить Text() как только count изменится. + appBar: AppBar(title: Obx(() => Text("Кликов: ${c.count}"))), + + // Замените 8 строк Navigator.push простым Get.to(). Вам не нужен context! + body: Center(child: ElevatedButton( + child: Text("Перейти к Other"), onPressed: () => Get.to(Other()))), + floatingActionButton: + FloatingActionButton(child: Icon(Icons.add), onPressed: c.increment)); + } +} + +class Other extends StatelessWidget { + // "Попросите" Get найти и предоставить вам ваш Controller, используемый на другой странице. + final Controller c = Get.find(); + + @override + Widget build(context){ + // Получите доступ к обновленной переменной count + return Scaffold(body: Center(child: Text("${c.count}"))); + } +} +``` + +Результат: + +![](counter-app-gif.gif) + +Это простой проект, но он уже дает понять, насколько мощным является Get. По мере роста вашего проекта эта разница будет становиться все более значительной. + +Get был разработан для работы с командами, но он упрощает работу отдельного разработчика. + +Оптимизируйте ваши сроки, доставляйте всё вовремя без потери производительности. Get не для всех, но, если вы идентифицировали себя с предыщим предложением, Get для вас! + +# Три столпа + +## Управление состоянием + +В настоящее время для Flutter есть несколько менеджеров состояний. Однако большинство из них связано с использованием ChangeNotifier для обновления виджетов, и это плохой и очень плохой подход к производительности для средних или больших приложений. Вы можете проверить в официальной документации Flutter, что [ChangeNotifier следует использовать с 1 или максимум 2 слушателями](https://api.flutter.dev/flutter/foundation/ChangeNotifier-class.html), что делает его практически непригодным для любого приложения среднего или большого размера. + +Get не лучше и не хуже, чем любой другой менеджер состояний, но вам следует проанализировать его, а также пункты ниже, чтобы выбрать между использованием Get в чистой форме (Vanilla), либо совместно с другим менеджером состояний. + +Определенно, Get не враг любого другого менеджера состояний, потому что Get - это микрофреймворк, а не просто менеджер состояний, и его можно использовать отдельно или вместе с ними. + +Get имеет два разных менеджера состояний: простой менеджер состояний (мы назовем его GetBuilder) и реактивный менеджер состояний (который называется GetX). + +### Реактивное управление состоянием + +Реактивное программирование может оттолкнуть многих людей, потому что считается сложным. GetX превращает реактивное программирование в нечто довольно простое: + +- Вам не нужно создавать StreamControllers. +- Вам не нужно создавать StreamBuilder для каждой переменной. +- Вам не нужно создавать класс для каждого состояния. +- Вам не нужно создавать геттер начального значения. + +Реактивное программирование с Get так же просто, как использование setState. + +Представим, что у вас есть переменная name и вы хотите, чтобы каждый раз, когда вы её изменяете, все виджеты, которые её используют, менялись автоматически. + +Это ваша переменная: + +```dart +var name = 'Джонатас Борхес'; +``` + +Чтобы сделать его наблюдаемым, вам просто нужно добавить в конец ".obs": + +```dart +var name = 'Джонатас Борхес'.obs; +``` + +А в пользовательском интерфейсе, если вы хотите отображать это значение и обновлять экран при изменении значений, просто сделайте следующее: + +```dart +Obx(() => Text("${controller.name}")); +``` + +Вот и всё. Это _так_ просто. + +### Подробнее об управлении состоянием + +**Более подробное объяснение управления состоянием [здесь](./documentation/ru_RU/state_management.md). Там вы увидите больше примеров, а также разницу между простым менеджером состояния и реактивным менеджером состояния.** + +Вы получите хорошее представление о мощности GetX. + +## Управление маршрутами + +Если вы собираетесь использовать маршруты / снекбары / диалоги / bottomsheets без контекста, GetX отлично подойдёт вам, просто посмотрите: + +Добавьте "Get" перед MaterialApp, превратив его в GetMaterialApp. + +```dart +GetMaterialApp( // Ранее: MaterialApp( + home: MyHome(), +) +``` + +Перейдите на новый экран: + +```dart + +Get.to(NextScreen()); +``` + +Перейдите на новый экран с именем. Более подробную информацию об именованных маршрутах смотрите [здесь](./documentation/ru_RU/route_management.md#navigation-with-named-routes) + +```dart + +Get.toNamed('/details'); +``` + +Закрыть снекбар, диалог, bottomsheets, или что-то иное, что вы обычно закрывали с помощью Navigator.pop(context); + +```dart +Get.back(); +``` + +Для перехода к следующему экрану без возможности вернуться к предыдущему экрану (для использования в SplashScreens, экранах входа и т. д.) + +```dart +Get.off(NextScreen()); +``` + +Для перехода к следующему экрану и отмены всех предыдущих маршрутов (полезно в корзинах для покупок, опросах и тестах) + +```dart +Get.offAll(NextScreen()); +``` + +Заметили, что вам не нужно было использовать контекст, чтобы делать что-либо из этого? Это одно из самых больших преимуществ использования Get. Благодаря этому вы можете без проблем выполнять все эти методы из класса контроллера. + +### Подробнее об управлении маршрутами + +**Get работает с именованными маршрутами, а также предлагает более низкий уровень контроля над вашими маршрутами! [Здесь](./documentation/ru_RU/route_management.md) есть подробная документация.** + +## Внедрение зависимостей + +Get имеет простой и мощный менеджер зависимостей, который позволяет вам получить тот же класс, что и ваш BLoC или контроллер, всего одной строкой кода, без Provider context, без InheritedWidget: + +```dart +Controller controller = Get.put(Controller()); // Вместо Controller controller = Controller(); +``` + +- Примечание: Если вы используете Get State Manager, обратите больше внимания на API привязок, который упростит подключение вашего представления к контроллеру. + +Вместо того, чтобы создавать экземпляр вашего класса внутри класса, который вы используете, вы создаете его в экземпляре Get, что сделает его доступным во всем приложении. Таким образом, вы можете использовать свой контроллер (или BLoC) в обычном режиме. + +**Совет:** Управление зависимостями Get не связано с другими частями пакета, поэтому, если, например, ваше приложение уже использует менеджер состояний (любой, не имеет значения), вам не нужно все это переписывать, вы можете использовать это внедрение зависимостей без проблем. + +```dart +controller.fetchApi(); +``` + +Представьте, что вы прошли через множество маршрутов и вам нужны данные, которые остались в вашем контроллере, вам понадобится менеджер состояний в сочетании с Provider или Get_it, верно? Только не с Get. Вам просто нужно попросить Get «найти» ваш контроллер, никаких дополнительных зависимостей вам не потребуется: + +```dart +Controller controller = Get.find(); +// Да, это выглядит как Магия! Get найдет ваш controller и доставит его вам. У вас может быть миллион созданных контроллеров, и Get всегда найдет нужный. +``` + +И тогда вы сможете восстановить данные вашего контроллера, которые были там получены: + +```dart +Text(controller.textFromApi); +``` + +### Подробнее о внедрении зависимостей + +**Более подробное объяснение управления зависимостями [здесь](./documentation/ru_RU/dependency_management.md)** + +# Утилиты + +## Интернационализация + +### Переводы + +Переводы хранятся в виде карты пар "ключ-значение". Чтобы добавить собственные переводы, создайте класс и расширьте `Translations`. + +```dart +import 'package:get/get.dart'; + +class Messages extends Translations { + @override + Map> get keys => { + 'en_US': { + 'hello': 'Hello World', + }, + 'de_DE': { + 'hello': 'Hallo Welt', + } + }; +} +``` + +#### Использование переводов + +Просто добавьте `.tr` к указанному ключу, и он будет переведен с использованием текущего значения `Get.locale` и `Get.fallbackLocale`. + +```dart +Text('title'.tr); +``` + +### Локализация + +Передайте параметры в `GetMaterialApp`, чтобы определить языковой стандарт и переводы. + +```dart +return GetMaterialApp( + translations: Messages(), // ваши переводы + locale: Locale('en', 'US'), // перевод будет осуществлен в этой локализации + fallbackLocale: Locale('en', 'UK'), // установите резервную локализацию на случай если будет выбрана невалидный локализация. +); +``` + +#### Изменение локализации + +Вызовите `Get.updateLocale(locale)`, чтобы обновить локализацию. Затем переводы автоматически используют новый языковой стандарт. + +```dart +var locale = Locale('en', 'US'); +Get.updateLocale(locale); +``` + +#### Системная локализация + +Чтобы узнать системную локализацию, вам следует использовать `window.locale`. + +```dart +import 'dart:ui' as ui; + +return GetMaterialApp( + locale: ui.window.locale, +); +``` + +## Изменение темы + +Пожалуйста, не используйте виджет более высокого уровня, чем `GetMaterialApp`, для его обновления. Это может вызвать повторяющиеся ключи. Многие люди привыкли к старому подходу к созданию виджета «ThemeProvider» только для того, чтобы изменить тему вашего приложения, а это НЕ требуется с GetX ™. + +Вы можете создать свою собственную тему и просто добавить ее в `Get.changeTheme` без повторяющегося кода: + +```dart +Get.changeTheme(ThemeData.light()); +``` + +Если вы хотите создать что-то вроде кнопки, которая изменяет тему, вы можете объединить для этого два API **GetX ™**: + +- API, который проверяет, используется ли темная тема. +- И API смены темы. + +Вы можете просто поместить это в `onPressed`: + +```dart +Get.changeTheme(Get.isDarkMode? ThemeData.light(): ThemeData.dark()); +``` + +Когда `.darkmode` активен, он переключится на _light theme_, и когда _light theme_ станет активной, он изменится на _dark theme_. + +## Другие API + +```dart +// получить текущие аргументы текущего экрана +Get.arguments + +// получить аргументы предыдущего маршрута +Get.previousArguments + +// получить имя предыдущего маршрута +Get.previousRoute + +// получить чистый маршрут, например, чтобы узнать: rawRoute.isFirst() +Get.rawRoute + +// получить доступ к Rounting API из GetObserver +Get.routing + +// проверить, открыт ли снекбар +Get.isSnackbarOpen + +// открыт ли диалог +Get.isDialogOpen + +// открыт ли bottomsheets +Get.isBottomSheetOpen + +// удалить один маршрут +Get.removeRoute() + +// возвращаться назад, пока данный предикат не выполнится +Get.until() + +// идти вперед, удалив предыдущие маршруты, пока данный предикат не выполнится +Get.offUntil() + +// перейти к следующему именованному маршруту, удалив предыдущие маршруты, пока данный предикат не выполнится +Get.offNamedUntil() + +// проверить на какой платформе работает приложение +GetPlatform.isAndroid +GetPlatform.isIOS +GetPlatform.isMacOS +GetPlatform.isWindows +GetPlatform.isLinux +GetPlatform.isFuchsia + +// проверить тип устройства +GetPlatform.isMobile +GetPlatform.isDesktop +// В вебе все платформы поддерживаются независимо! +// Можно узнать, работает ли приложение сейчас в браузере +// и на Windows, и на iOS, и на OSX, и на Android и так далее +GetPlatform.isWeb + + +// Эквивалент : MediaQuery.of(context).size.height, +// но неизменяемый. +Get.height +Get.width + +// Текущий контекст навигации +Get.context + +// Получить контекст показанного снекбара/диалога/bottomsheets в любом месте вызова. +Get.contextOverlay + +// Внимание: методы ниже являются расширениями класса BuildContext. +// Поскольку доступ к контексту есть в любом месте из вашего UI, +// вы можете использовать расширения в любом месте UI кода + +// Если вам нужна изменяемая высота/ширина (например, настольное или браузерное окно, размер которого можно изменить), вам нужно использовать context +context.width +context.height + +// Дает возможность определить половину экрана, треть и так далее. +// Полезно для отзывчивых приложений. +// param dividedBy (double) optional - default: 1 +// param reducedBy (double) optional - default: 0 +context.heightTransformer() +context.widthTransformer() + +/// Схоже с MediaQuery.of(context).size +context.mediaQuerySize() + +/// Схоже с MediaQuery.of(context).padding +context.mediaQueryPadding() + +/// Схоже с MediaQuery.of(context).viewPadding +context.mediaQueryViewPadding() + +/// Схоже с MediaQuery.of(context).viewInsets; +context.mediaQueryViewInsets() + +/// Схоже с MediaQuery.of(context).orientation; +context.orientation() + +/// Проверить, в горизонтальном ли режиме устройство +context.isLandscape() + +/// Проверить, в вертикальном ли режиме устройство +context.isPortrait() + +/// Схоже с to MediaQuery.of(context).devicePixelRatio; +context.devicePixelRatio() + +/// Схоже с MediaQuery.of(context).textScaleFactor; +context.textScaleFactor() + +/// Получить shortestSide экрана +context.mediaQueryShortestSide() + +/// Вернет True, если ширина больше 800 +context.showNavbar() + +/// Вернет True, если меньшая сторона меньше 600p +context.isPhone() + +/// Вернет True, если меньшая сторона больше 600p +context.isSmallTablet() + +/// Вернет True, если меньшая сторона больше 720p +context.isLargeTablet() + +/// Вернет True, если текущее устройство — Планшет +context.isTablet() + +/// Возвращает value в зависимости от размера экрана +/// Можно устанавливать значения для: +/// watch: Если меньшая сторона меньше 300 +/// mobile: Если меньшая сторона меньше 600 +/// tablet: Если меньшая сторона меньше 1200 +/// desktop: Если ширина больше 1200 +context.responsiveValue() +``` + +### Дополнительные глобальные настройки и ручные настройки + +GetMaterialApp настраивает все за вас, но если вы хотите настроить Get вручную. + +```dart +MaterialApp( + navigatorKey: Get.key, + navigatorObservers: [GetObserver()], +); +``` + +Вы также сможете использовать собственное промежуточное ПО в `GetObserver`, это ни на что не повлияет. + +```dart +MaterialApp( + navigatorKey: Get.key, + navigatorObservers: [ + GetObserver(MiddleWare.observer) // Here + ], +); +``` + +Вы можете создать _Глобальные Настройки_ Для `Get`. Просто добавьте `Get.config` в ваш код прежде чем нажимать на любой из маршрутов. +Или сделайте это прямо в `GetMaterialApp` + +```dart +GetMaterialApp( + enableLog: true, + defaultTransition: Transition.fade, + opaqueRoute: Get.isOpaqueRouteDefault, + popGesture: Get.isPopGestureEnable, + transitionDuration: Get.defaultDurationTransition, + defaultGlobalState: Get.defaultGlobalState, +); + +Get.config( + enableLog = true, + defaultPopGesture = true, + defaultTransition = Transitions.cupertino +) +``` + +При желании, вы сможете перенаправить все сообщения из `Get`. +Если вы хотите использовать свой любимый пакет для логирования и собирать логи там: + +```dart +GetMaterialApp( + enableLog: true, + logWriterCallback: localLogWriter, +); + +void localLogWriter(String text, {bool isError = false}) { + // передайте сообщение вашей любимой log-библиотеке + // но учитывайте, что даже если enableLog: false, сообщения все равно будут передаваться сюда + // узнать значение этого флага можно с помощью GetConfig.isLogEnable +} + +``` + +### Локальные виджеты состояния + +Эти виджеты позволяют управлять одним значением, сохраняя состояние эфемерным и локальным. +У нас есть варианты для Reactive и Simple. +Например, вы можете использовать их для переключения obscureText в `TextField`, возможно, для создания кастомного ExpandablePanel или, возможно, для изменения текущего индекса в `BottomNavigationBar` при изменении содержимого body в `Scaffold`. + +#### ValueBuilder + +Упрощение `StatefulWidget` который работает с вызовом `.setState` принимающим обновленное значение. + +```dart +ValueBuilder( + initialValue: false, + builder: (value, updateFn) => Switch( + value: value, + onChanged: updateFn, // такая же сигнатура! Вы можете использовать ( newValue ) => updateFn( newValue ) + ), + // Если нужно вызвать что-то вне метода builder + onUpdate: (value) => print("Значение обновлено: $value"), + onDispose: () => print("Виджет удален"), +), +``` + +#### ObxValue + +Похож на [`ValueBuilder`](#valuebuilder), но это реактивная версия, вы передаёте Rx экземпляр (помните волшебный .obs?) и +автоматически обновляетесь... разве это не великолепно? + +```dart +ObxValue((data) => Switch( + value: data.value, + onChanged: data, // У Rx есть _callable_ функция! Вы можете использовать (flag) => data.value = flag, + ), + false.obs, +), +``` + +## Полезные советы + +`.obs`ervables (наблюдатели) (также известные как Rx-типы) имеют широкий спектр внутренних методов и операторов + +> Очень распространено _мнение_, что свойство с `.obs` **ЯВЛЯЕТСЯ** действительным значением... но не ошибайтесь! +> Мы избегаем объявления типа переменной, потому что компилятор Dart достаточно умен, и +> код выглядит чище, но: + +```dart +var message = 'Привет, мир'.obs; +print( 'Тип "$message" — ${message.runtimeType}'); +``` + +Даже если `message` _выводит_ значение String, его тип - **RxString**! + +Итак, вы не сможете сделать `message.substring( 0, 4 )`. +Вы должны получить доступ к реальному `value` внутри _observable_: +Самый "используемый способ" это `.value`, но, знаете ли вы, что вы также можете использовать ... + +```dart +final name = 'GetX'.obs; +// "обновляет" поток только если значение отличается от текущего. +name.value = 'Хей'; + +// Все свойства Rx являются "вызываемыми" и возвращают новые значения. +// но это не работает с `null`: UI не будет перестроен. +name('Привет'); + +// как геттер, напечатает 'Привет'. +name() ; + +/// числа: + +final count = 0.obs; + +// Вы можете использовать все неизменяемые операции с числами! +count + 1; + +// Осторожно! Это можно использовать только если `count` не final, а var +count += 1; + +// Сравнения так же работают: +count > 2; + +/// логические: + +final flag = false.obs; + +// переключает значение между true/false +flag.toggle(); + + +/// все типы: + +// обнуляет значение переменной `value`. +flag.nil(); + +// Все toString(), toJson() операции применяются к `value` +print( count ); // вызывает `toString()` внутри RxInt + +final abc = [0,1,2].obs; +// Преобразует значение в json массив, выводит RxList +// Json поддерживается всеми Rx типами! +print('json: ${jsonEncode(abc)}, тип: ${abc.runtimeType}'); + +// RxMap, RxList и RxSet являются особенными Rx типами: они расширяют нативные типы. +// Но вы можете работать со списком как и с обычным списком, хоть и реактивным! +abc.add(12); // добавлеет 12 в список, and ОБНОВЛЯЕТ поток. +abc[3]; // как списки, возвращает значение с индексом 3. + + +// Сравнение равенства работает с Rx и с его value, но хэш код всегда берется у value +final number = 12.obs; +print( number == 12 ); // печатает true + +/// Кастомные Rx Модели: + +// toJson(), toString() передаются child, так что вы можете перегрузить эти методы в нем, и вызвать print напрямую. + +class User { + String name, last; + int age; + User({this.name, this.last, this.age}); + + @override + String toString() => '$name $last, возраст: $age'; +} + +final user = User(name: 'Джон', last: 'Доу', age: 33).obs; + +// `user` – "реактивный", но его свойства – НЕТ! +// Так что если мы обновим что-либо внутри user... +user.value.name = 'Рой'; +// Виджет перестроен не будет! +// `Rx` не знает, изменили ли вы что-то у user. +// Так что для кастомных классов вам нужно явно "уведомлять" об изменении. +user.refresh(); + +// или мы можем использовать метод `update()`! +user.update((value){ + value.name='Рой'; +}); + +print( user ); +``` + +#### GetView + +Я люблю этот виджет, он такой простой, но такой полезный! + +Это `const Stateless` виджет, который имеет геттер `controller` для зарегистрированного `Controller`, вот и всё. + +```dart + class AwesomeController extends GetxController { + final String title = 'Моя Удивительная View'; + } + + // ВСЕГДА передавайте `Тип` вашего контроллера! + class AwesomeView extends GetView { + @override + Widget build(BuildContext context) { + return Container( + padding: EdgeInsets.all(20), + child: Text( controller.title ), // просто вызовите `controller.что-то` + ); + } + } +``` + +#### GetWidget + +Большинство людей понятия не имеют об этом виджете или путаются при его применении. +Вариант его использования редок, но конкретен: он кэширует Controller. +Поэтому из-за _cache_, он не может быть `const Stateless`. + +> Итак, когда вам нужно «кэшировать» контроллер? + +В случаях использования другой "не распространённой" фичи **GetX**: `Get.create()`. + +`Get.create(()=>Controller())` будет создавать новый `Controller` каждый раз при вызове +`Get.find()`, + +Это тот самый случай, когда `GetWidget` блистает... поскольку вы можете использовать его, например, для хранения списка элементов Todo. Итак, если виджет будет «перестроен», он сохранит тот же экземпляр контроллера. + +#### GetxService + +Этот класс похож на `GetxController`, у него такой же жизненный цикл ( `onInit()`, `onReady()`, `onClose()`). +Но внутри нет никакой «логики». Он просто уведомляет систему **GetX** Dependency Injection о том, что этот подкласс **нельзя** удалить из памяти. + +Так что очень полезно держать ваши «Сервисы» всегда доступными и активными с помощью `Get.find()`. Например: +`ApiService`, `StorageService`, `CacheService`. + +```dart +Future main() async { + await initServices(); /// ПОДОЖДИТЕ ИНИЦИАЛИЗАЦИЮ СЕРВИСОВ. + runApp(SomeApp()); +} + +/// Умным решением будет проинициализировать сервисы перед вызовом runApp, +/// поскольку вы можете контроллировать процесс инициализации +/// (может, вам нужно загрузить конфигурацию Темы, ключи API, язык, определенный пользователем... +/// Загружайте SettingService прежде чем запускать ApiService. +/// Таким образом GetMaterialApp() принимает параметры напрямую, и ему не нужно будет перезагружаться +void initServices() async { + print('запуск сервисов ...'); + /// Здесь вы инициализируете get_storage, hive, shared_pref, + /// или что-либо другое асинхронное. + await Get.putAsync(() => DbService().init()); + await Get.putAsync(SettingsService()).init(); + print('Все сервисы запущены...'); +} + +class DbService extends GetxService { + Future init() async { + print('$runtimeType задержка 2 секунды'); + await 2.delay(); + print('$runtimeType готов!'); + return this; + } +} + +class SettingsService extends GetxService { + void init() async { + print('$runtimeType задержка 1 секунду'); + await 1.delay(); + print('$runtimeType готов!'); + } +} + +``` + +Единственный способ удалить `GetxService` - использовать `Get.reset()`, который похож на «горячую перезагрузку» вашего приложения. Так что помните, если вам нужен постоянный экземпляр класса в течение всего жизненного цикла вашего приложения, используйте `GetxService`. + +# Критические изменения по сравнению с версией 2.0 + +1- Rx типы: + +| До | После | +| ------- | ---------- | +| StringX | `RxString` | +| IntX | `RxInt` | +| MapX | `RxMap` | +| ListX | `RxList` | +| NumX | `RxNum` | +| DoubleX | `RxDouble` | + +RxController и GetBuilder теперь объединены, вам больше не нужно запоминать, какой контроллер вы хотите использовать, просто используйте GetxController, он будет работать как для простого управления состоянием, так и для реактивного. + +2- NamedRoutes +До: + +```dart +GetMaterialApp( + namedRoutes: { + '/': GetRoute(page: Home()), + } +) +``` + +Сейчас: + +```dart +GetMaterialApp( + getPages: [ + GetPage(name: '/', page: () => Home()), + ] +) +``` + +Для чего это изменение? +Часто может потребоваться решить, какая страница будет отображаться с помощью параметра или токена входа, предыдущий подход был негибким, так как он не позволял этого. +Вставка страницы в функцию значительно снизила потребление оперативной памяти, поскольку маршруты не будут выделяться в памяти с момента запуска приложения, а также позволил использовать такой подход: + +```dart + +GetStorage box = GetStorage(); + +GetMaterialApp( + getPages: [ + GetPage(name: '/', page:(){ + return box.hasData('token') ? Home() : Login(); + }) + ] +) +``` + +# Почему Getx? + +1- Много раз после обновления Flutter многие из ваших пакетов ломались. Иногда случаются ошибки компиляции, часто возникают ошибки, на которые до сих пор нет ответов, и разработчику необходимо знать, откуда возникла ошибка, отслеживать ошибку, только затем попытаться открыть проблему в соответствующем репозитории и увидеть, как проблема решена. Get централизует основные ресурсы для разработки (управление состоянием, зависимостями и маршрутами), позволяя вам добавить один пакет в свой pubspec и начать работу. После обновления Flutter единственное, что вам нужно сделать, это обновить зависимость Get и приступить к работе. Get также решает проблемы совместимости. Как часто бывало, что одна версия пакета несовместима с другой, потому что одна использует зависимость в одной версии, а другая - в другой? Это не проблема при использовании Get, поскольку все находится в одном пакете и полностью совместимо. + +2- Flutter - это просто, Flutter - это невероятно, но у Flutter все еще некоторый шаблонный код, который может быть нежелательным для большинства разработчиков, например `Navigator.of(context).push (context, builder [...]`. Get упрощает разработку. Вместо того, чтобы писать 8 строк кода для вызова маршрута, вы можете просто сделать это: `Get.to(Home())` и всё готово, вы перейдёте на следующую страницу. Динамические URL-адреса - это действительно болезненная вещь, которую нужно решать во Flutter в настоящее время, а с GetX это элементарно. Управление состояниями во Flutter и управление зависимостями также вызывает много споров, поскольку в pub есть сотни паттернов. Но нет ничего проще, чем добавить «.obs» в конец вашей переменной и поместить ваш виджет внутри Obx, и всё, все обновления этой переменной будут автоматически обновляться на экране. + +3- Лёгкость, не беспокоясь о производительности. Производительность Flutter уже потрясающая, но представьте, что вы используете диспетчер состояний и локатор для распределения классов блоков / хранилищ / контроллеров / и других классов. Вам придётся вручную вызывать исключение этой зависимости, когда она вам не нужна. Но вы когда-нибудь думали о том, чтобы просто использовать свой контроллер, и когда он больше никем не использовался, он просто был бы удален из памяти? Это то, что делает GetX. Благодаря SmartManagement всё, что не используется, удаляется из памяти, и вам не нужно беспокоиться ни о чем, кроме программирования. Вы будете уверены, что потребляете минимум необходимых ресурсов, даже не создав для этого логики. + +4- Действительное разделение. Вы могли слышать о концепции разделения представления от бизнес логики. Это не исключительная особенность BLoC, MVC, MVVM и тд, любой стандарт реализует эту концепцию. Однако во Flutter возможно ослабление этой концепции из-за необходимости использования контекста. +Если вам нужен контекст для поиска InheritedWidget, он вам нужен в представлении, либо нужно передать контекст как параметр. Мы считаем это решение очень уродливым, и для работы в команде мы всегда будем зависеть от логики представления (View). Getx - необычный подход со стандартным доступом, который хоть и не запрещает использование StatefulWidgets, InitState, и т.д., всегда имеет более чистый аналог. У контроллеров есть жизненные циклы, и когда вам нужно сделать, например, запрос APIREST, вы не зависите ни от чего в представлении. Вы можете использовать onInit для инициирования http-вызова, и когда данные поступят, переменные будут заполнены. Поскольку GetX полностью реактивен (действительно реактивен и работает с потоками), после заполнения элементов все виджеты, использующие эту переменную, будут автоматически обновлены в представлении. Это позволяет людям с опытом работы с пользовательским интерфейсом работать только с виджетами и не отправлять в бизнес-логику ничего, кроме пользовательских событий (например, нажатия кнопки), в то время как люди, работающие с бизнес-логикой, смогут создавать и тестировать бизнес-логику отдельно. + +Эта библиотека всегда будет обновляться и реализовывать новые функции. Не стесняйтесь предлагать PR. + +# Сообщества + +## Каналы сообщества + +У GetX очень активное и готовое к взаимовыручке сообщество. Если у вас есть вопросы или вы хотите получить какую-либо помощь относительно использования этого фреймворка, присоединяйтесь к нашим каналам сообщества, на ваш вопрос ответят быстро. Этот репозиторий предназначен исключительно для открытия проблем и запроса ресурсов, но не стесняйтесь быть частью сообщества GetX. + +| **Slack** | **Discord** | **Telegram** | +| :-------------------------------------------------------------------------------------------------------------------------- | :-------------------------------------------------------------------------------------------------------------------------- | :-------------------------------------------------------------------------------------------------------------------- | +| [![Get on Slack](https://img.shields.io/badge/slack-join-orange.svg)](https://communityinviter.com/apps/getxworkspace/getx) | [![Discord Shield](https://img.shields.io/discord/722900883784073290.svg?logo=discord)](https://discord.com/invite/9Hpt99N) | [![Telegram](https://img.shields.io/badge/chat-on%20Telegram-blue.svg)](https://t.me/joinchat/PhdbJRmsZNpAqSLJL6bH7g) | + +## Как внести свой вклад + +_Хотите внести свой вклад в проект? Вы будем рады отметить вас как одного из наших соавторов. Вот несколько направлений, где вы можете сделать Get (и Flutter) лучше._ + +- Помощь в переводе readme на другие языки. +- Добавление документации в readme (многие функции Get еще не задокументированы). +- Напишите статью или сделайте видео, обучающие использованию Get (они будут вставлены в Readme и в будущем в нашу Wiki). +- Предложите PRs для кода/тестов. +- Новые фичи. + +Приветствуется любой вклад! + +## Статьи и видео + +- [Dynamic Themes in 3 lines using GetX™](https://medium.com/swlh/flutter-dynamic-themes-in-3-lines-c3b375f292e3) - Tutorial by [Rod Brown](https://github.com/RodBr). +- [Complete GetX™ Navigation](https://www.youtube.com/watch?v=RaqPIoJSTtI) - Route management video by Amateur Coder. +- [Complete GetX State Management](https://www.youtube.com/watch?v=CNpXbeI_slw) - State management video by Amateur Coder. +- [GetX™ Other Features](https://youtu.be/ttQtlX_Q0eU) - Utils, storage, bindings and other features video by Amateur Coder. +- [Firestore User with GetX | Todo App](https://www.youtube.com/watch?v=BiV0DcXgk58) - Video by Amateur Coder. +- [Firebase Auth with GetX | Todo App](https://www.youtube.com/watch?v=-H-T_BSgfOE) - Video by Amateur Coder. +- [The Flutter GetX™ Ecosystem ~ State Management](https://medium.com/flutter-community/the-flutter-getx-ecosystem-state-management-881c7235511d) - State management by [Aachman Garg](https://github.com/imaachman). +- [GetX, the all-in-one Flutter package](https://www.youtube.com/watch?v=IYQgtu9TM74) - A brief tutorial covering State Management and Navigation by Thad Carnevalli. +- [Build a To-do List App from scratch using Flutter and GetX](https://www.youtube.com/watch?v=EcnqFasHf18) - UI + State Management + Storage video by Thad Carnevalli. +- [GetX Flutter Firebase Auth Example](https://medium.com/@jeffmcmorris/getx-flutter-firebase-auth-example-b383c1dd1de2) - Article by Jeff McMorris. diff --git a/siro_rider/packages/get/README.ur-PK.md b/siro_rider/packages/get/README.ur-PK.md new file mode 100644 index 0000000..8579a91 --- /dev/null +++ b/siro_rider/packages/get/README.ur-PK.md @@ -0,0 +1,1054 @@ +![](https://raw.githubusercontent.com/jonataslaw/getx-community/master/get.png) + +**🌎 اردو ( Selected ✔) [| انگریزی |](README.md) [| ویتنامی |](README-vi.md) [| انڈونیشی |](README.id-ID.md) [چینی |](README.zh-cn.md) [برازیلی پرتگالی |](README.pt-br.md) [ہسپانوی |](README-es.md) [روسی |](README.ru.md) [پولش |](README.pl.md) [کورین |](README.ko-kr.md), [French](README-fr.md)** + +[![pub package](https://img.shields.io/pub/v/get.svg?label=get&color=blue)](https://pub.dev/packages/get) +[![popularity](https://badges.bar/get/popularity)](https://pub.dev/packages/sentry/score) +[![likes](https://badges.bar/get/likes)](https://pub.dev/packages/get/score) +[![pub points](https://badges.bar/get/pub%20points)](https://pub.dev/packages/get/score) +![building](https://github.com/jonataslaw/get/workflows/build/badge.svg) +[![style: effective dart](https://img.shields.io/badge/style-effective_dart-40c4ff.svg)](https://pub.dev/packages/effective_dart) +[![Discord Shield](https://img.shields.io/discord/722900883784073290.svg?logo=discord)](https://discord.com/invite/9Hpt99N) +[![Get on Slack](https://img.shields.io/badge/slack-join-orange.svg)](https://communityinviter.com/apps/getxworkspace/getx) +[![Telegram](https://img.shields.io/badge/chat-on%20Telegram-blue.svg)](https://t.me/joinchat/PhdbJRmsZNpAqSLJL6bH7g) + +Awesome Flutter + +Buy Me A Coffee + +![](https://raw.githubusercontent.com/jonataslaw/getx-community/master/getx.png) + +- [تعارف](#تعارف) +- [انسٹال](#انسٹال) +- [کاؤنٹرایپ](#کاؤنٹرایپ) +- [تین ستون](#تین-ستون) + - [اسٹیٹ مینجمنٹ](#اسٹیٹ-مینجمنٹ) + - [ری ایکٹو اسٹیٹ منیجر](#ری-ایکٹو-اسٹیٹ-منیجر) + - [اسٹیٹ مینجمنٹ کے بارے میں مزید تفصیلات](#اسٹیٹ-مینجمنٹ-کے-بارے-میں-مزید-تفصیلات) + - [روٹ مینجمنٹ](#روٹ-مینجمنٹ) + - [روٹ مینجمنٹ کے بارے میں مزید تفصیلات](#روٹ-مینجمنٹ-کے-بارے-میں-مزید-تفصیلات) + - [انحصار کا انتظام](#انحصار-کا-انتظام) + - [انحصار کے انتظام کے بارے میں مزید تفصیلات](#انحصار-کے-انتظام-کے-بارے-میں-مزید-تفصیلات) +- [استعمال](#استعمال) + - [عالمگیریت](#عالمگیریت) + - [ترجمہ](#ترجمہ) + - [ترجمہ کا استعمال](#ترجمہ-کا-استعمال) + - [مقامی](#مقامی) + - [مقام کی تبدیلی](#مقام-کی-تبدیلی) + - [سسٹم لوکیشن](#سسٹم-لوکیشن) + - [تھیم کی تبدیلی](#تھیم-کی-تبدیلی) + - [رابطے کا قیام](#رابطے-کا-قیام) + - [ڈیفالٹ کنکشن کا قیام](#ڈیفالٹ-کنکشن-کا-قیام) + - [خود سے رابطے کا قیام](#خود-سے-رابطے-کا-قیام) + - [گیٹ پیج مڈل ویئر](#گیٹ-پیج-مڈل-ویئر) + - [ترجیح](#ترجیح) + - [ری ڈائریکٹ](#ری-ڈائریکٹ) + - [جب پیج کی درخواست کی جائے](#جب-پیج-کی-درخواست-کی-جائے) + - [آنبائنڈنگ اسٹارٹ](#آنبائنڈنگ-اسٹارٹ) + - [آنپیج بلڈ اسٹارٹ](#آنپیج-بلڈ-اسٹارٹ) + - [جب پیج لوڈ ہو](#جب-پیج-لوڈ-ہو) + - [جب صفحہ تصرف ہوجائے](#جب-صفحہ-تصرف-ہوجائے) + - [دوسرے اعلی درجے کی APIs](#دوسرے-اعلی-درجے-کی-apis) + - [اختیاری عالمی ترتیبات اور دستی تشکیلات](#اختیاری-عالمی-ترتیبات-اور-دستی-تشکیلات) + - [مقامی اسٹیٹ ویجٹ](#مقامی-اسٹیٹ-ویجٹ) + - [ویلیو بلڈر](#ویلیو-بلڈر) + - [اوبکس ویلیو](#اوبکس-ویلیو) + - [کارآمد نکات](#کارآمد-نکات) + - [گیٹ ویو](#گیٹ-ویو) + - [گیٹ ویجٹ](#گیٹ-ویجٹ) + - [گیٹکس سروس](#گیٹکس-سروس) +- [پچھلے ورژن سے اہم تبدیلیاں](#پچھلے-ورژن-سے-اہم-تبدیلیاں) +- [گیٹکس کیوں؟](#گیٹکس-کیوں) +- [سماجی خدمات](#سماجی-خدمات) + - [کمیونٹی چینلز](#کمیونٹی-چینلز) + - [کس طرح شراکت کریں](#کس-طرح-شراکت-کریں) + - [مضامین اور ویڈیوز](#مضامین-اور-ویڈیوز) + +# تعارف + +گیٹ ایکس اسٹیٹ مینجمنٹ کے لئے ایک ہلکا پھلکا اور طاقتور حل ہے۔ یہ تیز اور عملی انداز میں اعلی کارکردگی والی اسٹسٹ مینجمنٹ ، ذہین انحصار انجکشن ، اور روٹ مینجمنٹ کو یکجا کرتا ہے۔ گیٹ ایکس کے 3 بنیادی اصول ہیں ، اس کا مطلب یہ ہے کہ لائبریری میں موجود تمام وسائل کی ترجیح یہی ہے: **پروڈکٹیوٹی, کارکردگی اور تنظیم** + + **پروڈکٹیوٹی :** گیٹ ایکس کارکردگی اور وسائل کی کم سے کم کھپت پر مرکوز ہے۔ گیٹ ایکس اسٹریمز یا چینج نوٹیفائر استعمال نہیں کرتا ہے۔ + + **کارکردگی :** گیٹ ایکس ایک آسان اور خوشگوار ترکیب استعمال کرتا ہے۔ اس سے کوئی فرق نہیں پڑتا ہے کہ آپ کیا کرنا چاہتے ہیں ، گیٹ-ایکس کے ساتھ ہمیشہ ایک آسان راستہ رہتا ہے۔ اس سے کوڈنگ کے کئی گھنٹوں کی بچت ہوگی اور یہ آپ کی ایپلیکیشن فراہم کرنے والی زیادہ سے زیادہ کارکردگی کو نکال دے گی۔ عام طور پر ، ڈویلپر میموری سے کنٹرولرز کو ہٹانے سے متعلق رہنا چاہئے۔ گیٹ-ایکس کے ساتھ یہ ضروری نہیں ہے ، کیونکہ وسائل میموری سے حذف ہوجاتے ہیں جب وہ بطور ڈیفالٹ استعمال نہیں ہوتے ہیں۔ اگر آپ اسے یاد میں رکھنا چاہتے ہیں تو ، آپ کو اپنی انحصار میں واضح طور پر "مستقل: سچ" کا اعلان کرنا ہوگا۔ اس طرح ، وقت کی بچت کے علاوہ ، آپ کو میموری پر غیر ضروری انحصار کرنے کا خطرہ بھی کم ہوتا ہے۔ انحصار لوڈنگ ڈیفالٹ کے لحاظ سے بھی سست ہے۔ + + **تنظیم :** گیٹ-ایکس کی مدد سے منظر ، نمائش کی منطق ، کاروباری منطق ، انحصار انجیکشن ، اور نیویگیشن کی مجموعی ڈوپولنگ کی اجازت دیتا ہے۔ راستوں کے مابین تشریف لے جانے کے لئے سیاق و سباق کی ضرورت نہیں ہے ، لہذا ، آپ اس کے لئے ویجیٹ ٹری (ویژنائزیشن) پر منحصر نہیں ہیں۔ وراثت میں ملنے والے ویجیٹ کے ذریعے اپنے کنٹرولرز / بلاکس تک رسائی حاصل کرنے کے لئے سیاق و سباق کی ضرورت نہیں ہے ، لہذا آپ اپنی پریزنٹیشن منطق اور کاروباری منطق کو اپنی نظریاتی پرت سے مکمل طور پر ڈوپل کرتے ہیں۔ آپ کو متعدد فراہم کنندگان کے ذریعہ اپنے ویجیٹ ٹری میں اپنے کنٹرولرز / ماڈلز / بلاکس کی کلاسیں انجیکشن کرنے کی ضرورت نہیں ہے ، کیونکہ یہ گیٹ ایکس اپنی انحصار انجیکشن کی خصوصیت استعمال کرتا ہے ، جس سے ڈی آئی کو اس کے نظارے کو مکمل طور پر خارج کردیتی ہے۔ گیٹ-ایکس کے ذریعے آپ جانتے ہو کہ اپنی درخواست کی ہر خصوصیت کو کہاں تلاش کرنا ہے ، بطور ڈیفالٹ صاف ستھرا۔ بحالی کی سہولت فراہم کرنے کے علاوہ ، یہ ماڈیولوں کی شیئرنگ کو بھی یقینی بناتا ہے ، ایسی کوئی چیز جو اس وقت تک پھڑپھڑ پھینک کر ناقابل فہم تھی ، اور کچھ مکمل طور پر ممکن تھا۔ +بی ایل او سی پھڑپھڑا میں کوڈ کو منظم کرنے کا نقطہ آغاز تھا ، یہ کاروباری منطق کو تصور سے الگ کرتا ہے۔ گیٹ ایکس اس کا فطری ارتقا ہے ، جس سے نہ صرف کاروباری منطق کو الگ کیا جائے بلکہ پیش کش کی منطق بھی۔ انحصار اور راستوں کا بونس انجیکشن بھی ڈوپل ہوچکا ہے ، اور ڈیٹا لیئر ان سب سے باہر ہے۔ آپ جانتے ہیں کہ سب کچھ کہاں ہے ، اور یہ سب کچھ ہیلو دنیا کی تعمیر سے زیادہ آسان طریقے سے ہے۔ گیٹ-ایکس ، فلٹر ایس ڈی کے کے ساتھ اعلی کارکردگی کی ایپلی کیشنز کی تعمیر کا آسان ترین ، عملی اور اسکیل ایبل طریقہ ہے ، جس کے ارد گرد ایک بہت بڑا ماحولیاتی نظام ہے جو کامل کے ساتھ مل کر کام کرتا ہے ، ابتدائی افراد کے لئے آسان اور ماہرین کے لئے درست ہے۔ یہ محفوظ ، مستحکم ، تازہ ترین ہے ، اور APIs کی ایک بہت بڑی رینج پیش کرتا ہے جو پہلے سے طے شدہ فلوٹر SDK پر موجود نہیں ہے۔ + +گیٹ ایکس پھولا ہوا نہیں ہے۔ اس میں بہت ساری خصوصیات ہیں جو آپ کو کسی بھی چیز کی فکر کیے بغیر پروگرامنگ شروع کرنے کی اجازت دیتی ہیں ، لیکن ان خصوصیات میں سے ہر ایک الگ الگ کنٹینر میں ہے ، اور صرف استعمال کے بعد شروع کی گئی ہے۔ اگر آپ صرف اسٹیٹ مینجمنٹ کا استعمال کرتے ہیں تو صرف اسٹیٹ مینجمنٹ مرتب کی جائے گی۔ اگر آپ صرف راستے ہی استعمال کرتے ہیں تو ، اسٹیٹ مینجمنٹ کی طرف سے کوئی بھی چیز مرتب نہیں کی جائے گی۔ + +گیٹ ایکس میں ایک بہت بڑا ماحولیاتی نظام ، ایک بڑی برادری ، بڑی تعداد میں تعاون کار موجود ہے ، اور جب تک پھڑپھڑ موجود ہے اس کو برقرار رکھا جائے گا۔ گیٹ ایکس بھی اسی کوڈ کے ساتھ اینڈروئیڈ ، آئی او ایس ، ویب ، میک ، لینکس ، ونڈوز اور اپنے سرور پر چلنے کے قابل ہے۔ +**یہ ممکن ہے کہ اپنے پس منظر میں فرنٹ اینڈ پر تیار کردہ اپنے کوڈ کو پوری طرح سے استعمال کریں [گیٹ ایکس سرور](https://github.com/jonataslaw/get_server)**. + +**اس کے علاوہ ، سرور پر اور سامنے والے اختتام پر ، پوری ترقی کا عمل مکمل طور پر خودکار ہوسکتا ہے [CLI حاصل کریں](https://github.com/jonataslaw/get_cli)**. + +**اس کے علاوہ ، آپ کی پیداوری کو مزید بڑھانے کے لئے ، ہمارے پاس ہے +[VSCode](https://marketplace.visualstudio.com/items?itemName=get-snippets.get-snippets) اور [Android Studio/Intellij](https://plugins.jetbrains.com/plugin/14975-getx-snippets)** + +# انسٹال +کوڈ میں گیٹ ایکس کی تنصیب +```yaml +# pubspec.yaml +dependencies: + get: +``` +ان فائلوں میں امپورٹ کریں جو استعمال ہوں گی +```dart +import 'package:get/get.dart'; +``` + +# کاؤنٹرایپ + +گیٹ-ایکس کی طاقت کو ظاہر کرنے کے ل I ، میں یہ ظاہر کروں گا کہ کس طرح ہر کلک کے ساتھ "کاؤنٹر" بنانا ہے ، کس طرح صفحات کے مابین تبادلہ کرنا اور اسکرینوں کے درمیان اسٹسٹ کو مشترکہ انداز میں بانٹنا ، کاروباری منطق کو صرف نظر سے الگ کرنا ، 26 لائنز کوڈ شامل تبصرے۔ + +- پہلا قدم : + اپنے میٹریل ایپ سے پہلے "گیٹ" شامل کریں ، اسے گیٹ میٹریئل ایپ میں تبدیل کریں + +```dart +void main() => runApp(GetMaterialApp(home: Home())); +``` + +نوٹ: اس سے مٹیریل ایپ میں ترمیم نہیں ہوتی ، گیٹ میٹیرال ایپ کوئی ترمیم شدہ میٹریل ایپ نہیں ہے ، یہ ایک کنفیگریڈ ویجیٹ ہے ، جس میں بطور سی سی فلڈ میٹریل ایپ ہے۔ آپ اسے دستی طور پر تشکیل دے سکتے ہیں ، لیکن یہ یقینی طور پر ضروری نہیں ہے۔ گیٹ میٹریئل ایپ راستوں کو تخلیق کرے گی ، انہیں انجیکشن دے گی ، ترجمہ انجیکشن کرے گی ، روٹ نیویگیشن کے لئے آپ کی ضرورت کی ہر چیز کو انجیکشن دے گی۔ اگر آپ صرف ریاستی انتظام یا انحصار کے انتظام کے لئے گیٹیکس کا استعمال کرتے ہیں تو ، گیٹ میٹریئل ایپ کو استعمال کرنے کی ضرورت نہیں ہے۔ گیٹ میٹیرال ایپ راستوں ، سنیکبارز ، عالمگیریت ، نچلی شیٹس ، مکالموں ، اور روٹس سے متعلق اعلی سطحی اپس اور سیاق و سباق کی عدم موجودگی کے لئے ضروری ہے۔ +یہ اقدام صرف اس صورت میں ضروری ہے اگر آپ روٹ مینجمنٹ کا استعمال کریں گے (`Get.to()`, `Get.back()`). اگر آپ اسے استعمال نہیں کریں گے تو پھر ضروری نہیں ہے کہ قدم 1 کریں + +- دوسرا مرحلہ : + اپنی کاروباری منطق کلاس بنائیں اور اس کے اندر تمام متغیرات ، طریقے اور کنٹرولر رکھیں۔ + کا استعمال کرتے ہوئے کسی بھی متغیر کو قابل مشاہدہ کرسکتے ہیں ".obs". + +```dart +class Controller extends GetxController{ + var count = 0.obs; + increment() => count++; +} +``` + +- تیسرا قدم : + اپنا نظارہ بنائیں ، اسٹیٹ لیس ویجیٹ استعمال کریں اور کچھ رام کو بچائیں ، گیٹ-ایکس کی مدد سے آپ کو اب اسٹیٹ فل ویجٹ استعمال کرنے کی ضرورت نہیں ہوگی۔ + +```dart +class Home extends StatelessWidget { + + @override + Widget build(context) { + // آپ کی کلاس کا آغاز + // Instantiate your class using Get.put() to make it available for all "child" routes there. + final Controller c = Get.put(Controller()); + + return Scaffold( + // Use Obx(()=> to update Text() whenever count is changed. + appBar: AppBar(title: Obx(() => Text("Clicks: ${c.count}"))), + + // Replace the 8 lines Navigator.push by a simple Get.to(). You don't need context + body: Center(child: ElevatedButton( + child: Text("Go to Other"), onPressed: () => Get.to(Other()))), + floatingActionButton: + FloatingActionButton(child: Icon(Icons.add), onPressed: c.increment)); + } +} + +class Other extends StatelessWidget { + // You can ask Get to find a Controller that is being used by another page and redirect you to it. + final Controller c = Get.find(); + + @override + Widget build(context){ + // Access the updated count variable + return Scaffold(body: Center(child: Text("${c.count}"))); + } +} +``` + +نتیجہ +![](https://raw.githubusercontent.com/jonataslaw/getx-community/master/counter-app-gif.gif) +یہ ایک سادہ پروجیکٹ ہے لیکن اس سے پہلے ہی یہ واضح ہوجاتا ہے کہ گیٹ کتنا طاقتور ہے۔ جیسے جیسے آپ کا پروجیکٹ بڑھتا جائے گا ، یہ فرق مزید نمایاں ہوتا جائے گا۔ +گیٹ کو ٹیموں کے ساتھ کام کرنے کے لئے ڈیزائن کیا گیا تھا ، لیکن اس سے ایک فرد ڈویلپر کا کام آسان ہوجاتا ہے۔ +اپنی آخری تاریخ کو بہتر بنائیں ، کارکردگی کو کھونے کے بغیر وقت پر سب کچھ فراہم کریں۔ اگر آپ نے اس جملے کی نشاندہی کی ہے تو ، گیٹ-ایکس آپ کے لئے ہے! +# تین ستون +## اسٹیٹ مینجمنٹ +گیٹ کے دو مختلف مینیجر ہوتے ہیں: سادہ ریاستی مینیجر (ہم اسے گیٹ بلڈر کہیں گے) اور رد عمل کا مظاہرہ کرنے والے مینیجر (گیٹ-ایکس / اوب-ایکس) +### ری ایکٹو اسٹیٹ منیجر +ری ایکٹیو پروگرامنگ بہت سے لوگوں کو اجنبی بنا سکتا ہے کیونکہ ایسا کہا جاتا ہے کہ یہ پیچیدہ ہے۔ گیٹ ایکس نے رد عمل مندانہ پروگرامنگ کو کسی آسان چیز میں تبدیل کردیا: +- آپ کو اسٹریمکنٹرولر بنانے کی ضرورت نہیں ہوگی +- آپ کو ہر متغیر کے لئے ایک اسٹریم بلڈر بنانے کی ضرورت نہیں ہوگی +- آپ کو ہر ریاست کے لئے کلاس بنانے کی ضرورت نہیں ہوگی +- آپ کو ابتدائی قدر کے لئے گیٹ ایکس بنانے کی ضرورت نہیں ہوگی +- آپ کو کوڈ جنریٹر استعمال کرنے کی ضرورت نہیں ہوگی + + +گیٹ-ایکس کے ساتھ قابل عمل پروگرامنگ اتنا ہی آسان ہے جتنا سیٹ اسٹیٹ کے استعمال سے۔ + +آئیے تصور کریں کہ آپ کے پاس متغیر ہے اور چاہتے ہیں کہ جب بھی آپ اسے تبدیل کریں ، اس کا استعمال کرنے والے تمام وجیٹس خود بخود تبدیل ہوجائیں۔ + +یہ آپ کی گنتی متغیر ہے: + +```dart +var name = 'Jonatas Borges'; +``` + +".obs" اسے مشاہدہ کرنے کے لئے؛ آپ کو اس کے آخر میں شامل کرنے کی ضرورت ہے + +```dart +var name = 'Jonatas Borges'.obs; +``` + +اور صارف کے انٹرفیس میں ، جب آپ اس نمبر کو دکھانا چاہتے ہیں اور جب بھی اس کی اہمیت بدل جاتی ہے تو اسکرین کو اپ ڈیٹ کرنا چاہتے ہیں ، صرف یہ کریں: + +```dart +Obx(() => Text("${controller.name}")); +``` + +بس۔ یہ آسان ہے. + +### اسٹیٹ مینجمنٹ کے بارے میں مزید تفصیلات + +**اسٹیٹ مینجمنٹ کی مزید گہرائی سے وضاحت ملاحظہ کریں [یہاں](./documentation/en_US/state_management.md). وہاں آپ مزید مثالیں دیکھیں گے اور آسان ریاستی مینیجر اور رد عمل ریاست کے مینیجر کے مابین بھی فرق** + +آپ کو گیٹ ایکس پاور کا ایک اچھا خیال ملے گا۔ + +## روٹ مینجمنٹ +اگر آپ سیاق و سباق کے بغیر راستے / سنیکبارز / مکالمے / بوتل شیٹ استعمال کرنے جارہے ہیں تو گیٹ ایکس آپ کے لئے بھی بہترین ہے ، بس اسے دیکھیں: +اپنے میٹریل ایپ سے پہلے "گیٹ" شامل کریں ، اسے گیٹ میٹریئل ایپ میں تبدیل کریں +```dart +GetMaterialApp( // Before: MaterialApp( + home: MyHome(), +) +``` + +نئی اسکرین پر جائیں: + +```dart + +Get.to(NextScreen()); +``` + +نام کے ساتھ نئی اسکرین پر جائیں۔ نامزد راستوں کے بارے میں مزید تفصیلات دیکھیں [یہاں](./documentation/en_US/route_management.md#navigation-with-named-routes) + +```dart + +Get.toNamed('/details'); +``` + +سنیک بار ، ڈائیلاگ ، نیچے شیٹ کو بند کریں +Navigator.pop(context); + +```dart +Get.back(); +``` + +اگلی اسکرین پر جانے کے لئے اور پچھلی اسکرین پر واپس جانے کا کوئی آپشن نہیں (اسپلش اسکرین ، لاگ ان اسکرینوں وغیرہ میں استعمال کیلئے) + +```dart +Get.off(NextScreen()); +``` + +اگلی سکرین پر جانے اور پچھلے سبھی راستوں کو منسوخ کرنے کے لئے (شاپنگ کارٹس ، پولز اور ٹیسٹوں میں کارآمد) + +```dart +Get.offAll(NextScreen()); +``` + +غور کیا کہ آپ کو ان میں سے کوئی بھی کام کرنے کے لئے سیاق و سباق کا استعمال نہیں کرنا پڑا؟ گیٹ روٹ مینجمنٹ کو استعمال کرنے کا سب سے بڑا فائدہ یہ ہے۔ اس کی مدد سے ، آپ اپنے کنٹرولر کلاس کے اندر ، تشویش کے بغیر ، ان تمام طریقوں کو انجام دے سکتے ہیں۔ + +### روٹ مینجمنٹ کے بارے میں مزید تفصیلات + +**گیٹ ایکس نامی روٹ کے ساتھ کام کرتا ہے اور اپنے راستوں پر نچلی سطح کا کنٹرول بھی پیش کرتا ہے! ایک گہرائی میں دستاویزات موجود ہیں [یہاں](./documentation/en_US/route_management.md)** + +## انحصار کا انتظام + +گیٹ ایکس کے پاس ایک سادہ اور طاقتور انحصار منیجر ہے جو آپ کو اپنے بلاک یا کنٹرولر کی طرح ایک ہی کلاس کو دوبارہ حاصل کرنے کی سہولت دیتا ہے جس میں کوڈ کی صرف 1 لائنز ، کوئی فراہم کنندہ سیاق و سباق ، کوئی وراثت والا ویجٹ نہیں ہے۔ + +```dart +Controller controller = Get.put(Controller()); // Rather Controller controller = Controller(); +``` +نوٹ: اگر آپ گیٹ اسٹیٹ منیجر استعمال کررہے ہیں تو ، اے پی آئی کی پابندیوں پر زیادہ توجہ دیں ، جس سے آپ کے قول کو اپنے کنٹرولر سے مربوط کرنے میں آسانی ہوگی۔ + +آپ جس کلاس کو استعمال کررہے ہیں اس میں اپنی کلاس کو تیز کرنے کے بجائے ، آپ اسے حاصل کریں مثال کے طور پر اندر داخل کررہے ہیں ، جس سے یہ آپ کے ایپ میں دستیاب ہوگا۔ +لہذا آپ اپنے کنٹرولر (یا کلاس بلاک) کو عام طور پر استعمال کرسکتے ہیں + +**اشارہ:**گیٹ ایکس انحصار کا انتظام پیکیج کے دوسرے حصوں سے گر گیا ہے ، لہذا اگر مثال کے طور پر آپ کی ایپ پہلے ہی اسٹیٹ مینیجر کو استعمال کررہی ہے (کوئی بھی ، اس سے کوئی فرق نہیں پڑتا ہے) ، آپ کو یہ سب کچھ دوبارہ لکھنے کی ضرورت نہیں ہے ، آپ اس انحصار کو استعمال کرسکتے ہیں۔ +```dart +controller.fetchApi(); +``` + +ذرا تصور کریں کہ آپ نے متعدد راستوں سے گھوما ہوا ہے ، اور آپ کو ایک ایسے ڈیٹا کی ضرورت ہے جو آپ کے کنٹرولر میں پیچھے رہ گیا ہو ، آپ کو فراہم کنندہ یا گیٹ_یٹ کے ساتھ مل کر ایک ریاستی مینیجر کی ضرورت ہوگی ، صحیح؟ گیٹ ایکس کے ساتھ نہیں۔ آپ کو اپنے کنٹرولر کے ل "" ڈھونڈنے "کے لئے گیٹ ایکس سے پوچھنے کی ضرورت ہے ، آپ کو کسی بھی اضافی انحصار کی ضرورت نہیں ہے۔ + +```dart +Controller controller = Get.find(); +``` + +اور پھر آپ اپنا کنٹرولر ڈیٹا دوبارہ حاصل کرنے میں کامیاب ہوجائیں گے جو وہاں واپس حاصل کیا گیا تھا + +```dart +Text(controller.textFromApi); +``` + +### انحصار کے انتظام کے بارے میں مزید تفصیلات + +**انحصار کے انتظام کی مزید گہرائی سے وضاحت ملاحظہ کریں [یہاں](./documentation/en_US/dependency_management.md)** + +# استعمال + +## عالمگیریت + +### ترجمہ + +ترجمہ کو ایک آسان کلیدی قدر والے لغت کے نقشے کے طور پر رکھا جاتا ہے۔ +حسب ضرورت ترجمہ شامل کرنے کے لئے ، ایک کلاس تشکیل دیں اور توسیع کریں +`Translations` +```dart +import 'package:get/get.dart'; + +class Messages extends Translations { + @override + Map> get keys => { + 'en_US': { + 'hello': 'Hello World', + }, + 'de_DE': { + 'hello': 'Hallo Welt', + } + }; +} +``` + +#### ترجمہ کا استعمال + +بس ضمیمہ کریں `.tr` مخصوص کی میں اور اس کی موجودہ قیمت کا استعمال کرتے ہوئے ترجمہ کیا جائے گا`Get.locale` اور `Get.fallbackLocale`. + +```dart +Text('title'.tr); +``` + +### مقامی + +مقام اور ترجمے کی وضاحت کے لئے پیرامیٹرز کو `گیٹ میٹیرال ایپ` پاس کریں۔ + +```dart +return GetMaterialApp( + translations: Messages(), // your translations + locale: Locale('en', 'US'), // translations will be displayed in that locale + fallbackLocale: Locale('en', 'UK'), // specify the fallback locale in case an invalid locale is selected. +); +``` + +#### مقام کی تبدیلی + +لوکل کو اپ ڈیٹ کرنے کے لئے کال کریں گیٹ۔ اپ ڈیٹ لوکل (لوکل)۔ پھر ترجمے خود بخود نیا مقام استعمال کرتے ہیں۔ + +```dart +var locale = Locale('en', 'US'); +Get.updateLocale(locale); +``` + +#### سسٹم لوکیشن + +ڈیوائس لوکل حاصل کرنے کے لئے اس لائن کو استعمال کریں + +```dart +return GetMaterialApp( + locale: Get.deviceLocale, +); +``` + +## تھیم کی تبدیلی + +برائے کرم `گیٹ میٹرال ایپ` سے زیادہ کسی بھی اعلی سطح کے ویجیٹ کو اپ ڈیٹ کرنے کیلئے استعمال نہ کریں۔ اس سے ڈپلیکیٹ کیز کو متحرک کیا جاسکتا ہے۔ بہت سارے لوگ صرف اپنی ایپ کے تھیم کو تبدیل کرنے کے لئے "تھیم پیڈائزر" ویجیٹ بنانے کے پراگیتہاسک نقطہ نظر کے عادی ہیں ، اور یہ ** گیٹ ایکس ™ ** کے ساتھ یقینی طور پر ضروری نہیں ہے۔ + +آپ اپنا کسٹم تھیم تشکیل دے سکتے ہیں اور اس کے لئے کسی بھی بوائلر پلیٹ کے بغیر اسے `گیٹ.چینج تھیم` میں شامل کرسکتے ہیں: + +```dart +Get.changeTheme(ThemeData.light()); +``` + + +اگر آپ بٹن کی طرح کوئی چیز بنانا چاہتے ہیں جو تھیم کو `آن ٹیپ میں تبدیل کردے ، تو آپ اس کے لئے دو ** گیٹ ایکس ™ ** اے پی پی کو جوڑ سکتے ہیں: + +- اے پی آئی جو چیک کرتا ہے کہ آیا گہرا `تھیم` استعمال کیا جارہا ہے۔ +- اور `تھیم` کی تبدیلی ، آپ اسے صرف `آن پیسڈ` میں ڈال سکتے ہیں۔ + +```dart +Get.changeTheme(Get.isDarkMode? ThemeData.light(): ThemeData.dark()); +``` + +جب ڈارک موڈ چالو ہوجاتا ہے ، تو وہ _ لائٹ تھیم_ میں تبدیل ہوجائے گا ، اور جب _ لائٹ تھیم_ فعال ہوجائے گا ، تو یہ _ ڈارک تھیم_ میں بدل جائے گا۔ + +## رابطے کا قیام +گیٹ کنیکٹ آپ کی پیٹھ سے اپنے سامنے تک HTTP یا ویب ساکٹس کے ذریعہ مواصلت کرنے کا ایک آسان طریقہ ہے + +### ڈیفالٹ کنکشن کا قیام +آپ آرام سے گیٹ کنیکٹ کو بڑھا سکتے ہیں اور GET / POST / PUT / DELETE / SOCKET طریقوں کو اپنے ریسٹ API یا ویب ساکٹس کے ساتھ بات چیت کرسکتے ہیں۔ + +```dart +class UserProvider extends GetConnect { + // Get request + Future getUser(int id) => get('http://youapi/users/$id'); + // Post request + Future postUser(Map data) => post('http://youapi/users', body: data); + // Post request with File + Future> postCases(List image) { + final form = FormData({ + 'file': MultipartFile(image, filename: 'avatar.png'), + 'otherFile': MultipartFile(image, filename: 'cover.png'), + }); + return post('http://youapi/users/upload', form); + } + + GetSocket userMessages() { + return socket('https://yourapi/users/socket'); + } +} +``` +### خود سے رابطے کا قیام + +گیٹ کنیکٹ انتہائی حسب ضرورت ہے آپ درخواست کو تبدیل کرنے والے ، جواب دہندگان کے بطور ، جواب دہندگان کی حیثیت سے ، ایک مستند کی وضاحت ، اور حتی کہ کوششوں کی تعداد بھی کرسکتے ہیں جس میں وہ خود کو مستند کرنے کی کوشش کرے گی ، اس کے علاوہ یہ ایک معیاری ڈیکوڈر کی وضاحت کے امکان کو بھی فراہم کرے گی جو تبدیل ہوجائے گی۔ آپ کی ساری درخواستیں آپ میں اضافی تشکیل کے بغیر ماڈل کرتی ہیں۔ + +```dart +class HomeProvider extends GetConnect { + @override + void onInit() { + // All request will pass to jsonEncode so CasesModel.fromJson() + httpClient.defaultDecoder = CasesModel.fromJson; + httpClient.baseUrl = 'https://api.covid19api.com'; + // baseUrl = 'https://api.covid19api.com'; // It define baseUrl to + // Http and websockets if used with no [httpClient] instance + + // It's will attach 'apikey' property on header from all requests + httpClient.addRequestModifier((request) { + request.headers['apikey'] = '12345678'; + return request; + }); + + // Even if the server sends data from the country "Brazil", + // it will never be displayed to users, because you remove + // that data from the response, even before the response is delivered + httpClient.addResponseModifier((request, response) { + CasesModel model = response.body; + if (model.countries.contains('Brazil')) { + model.countries.remove('Brazilll'); + } + }); + + httpClient.addAuthenticator((request) async { + final response = await get("http://yourapi/token"); + final token = response.body['token']; + // Set the header + request.headers['Authorization'] = "$token"; + return request; + }); + + //Autenticator will be called 3 times if HttpStatus is + //HttpStatus.unauthorized + httpClient.maxAuthRetries = 3; + } + } + + @override + Future> getCases(String path) => get(path); +} +``` + +## گیٹ پیج مڈل ویئر + +گیٹ پیج کے پاس اب نئی پراپرٹی ہے جو گیٹ میڈل ویئر کی فہرست لیتی ہے اور انہیں مخصوص ترتیب میں چلاتی ہے۔ + +نوٹ: جب گیٹ پیج کے مڈل ویئرز ہوں گے تو ، اس صفحے کے سبھی بچوں میں ایک جیسے مڈل ویئرز خودبخود ہوں گے۔ + +### ترجیح + +مڈل ویئر کو چلانے کا آرڈر گیٹ میڈل ویئر میں ترجیحی طور پر ترتیب دیا جاسکتا ہے۔ + +```dart +final middlewares = [ + GetMiddleware(priority: 2), + GetMiddleware(priority: 5), + GetMiddleware(priority: 4), + GetMiddleware(priority: -8), +]; +``` +وہ مڈل ویئر اسی ترتیب سے چلائے جائیں گے **-8 => 2 => 4 => 5** + +### ری ڈائریکٹ + +اس فنکشن کو اس وقت کہا جائے گا جب کال والے راستے کے صفحے کی تلاش کی جا رہی ہو۔ اس کو ری ڈائریکٹ کرنے کے نتیجے میں روٹ سیٹنگز لیتے ہیں۔ یا اسے کالعدم کردیں اور کوئی ردوبدل نہیں ہوگا۔ + +```dart +RouteSettings redirect(String route) { + final authService = Get.find(); + return authService.authed.value ? null : RouteSettings(name: '/login') +} +``` + +### جب پیج کی درخواست کی جائے + +جب اس صفحے کو کچھ بھی تخلیق کرنے سے پہلے بلایا جائے گا تو اس فنکشن کو کہا جائے گا +آپ اسے صفحہ کے بارے میں کچھ تبدیل کرنے یا نیا صفحہ دینے کیلئے استعمال کرسکتے ہیں + +```dart +GetPage onPageCalled(GetPage page) { + final authService = Get.find(); + return page.copyWith(title: 'Welcome ${authService.UserName}'); +} +``` + +### آنبائنڈنگ اسٹارٹ + +اس فنکشن کو بائنڈنگ شروع کرنے سے پہلے ہی کہا جائے گا۔ +یہاں آپ اس صفحے کے لئے پابندیوں کو تبدیل کرسکتے ہیں۔ + +```dart +List onBindingsStart(List bindings) { + final authService = Get.find(); + if (authService.isAdmin) { + bindings.add(AdminBinding()); + } + return bindings; +} +``` + +### آنپیج بلڈ اسٹارٹ + +اس فنکشن کو بائنڈنگ شروع کرنے کے بعد ہی کہا جائے گا۔ +یہاں آپ اس کے بعد اور پیج ویجیٹ بنانے سے پہلے پابندیوں کو تخلیق کرنے کے بعد کچھ کرسکتے ہیں۔ + +```dart +GetPageBuilder onPageBuildStart(GetPageBuilder page) { + print('bindings are ready'); + return page; +} +``` + +### جب پیج لوڈ ہو + +اس فنکشن کو گیٹ پیج ڈاٹ پیج فنکشن کے بلانے کے ٹھیک ہی بعد میں کہا جائے گا اور آپ کو اس فنکشن کا نتیجہ پیش کرے گا۔ اور دکھایا جائے گا کہ ویجیٹ لے لو. + +### جب صفحہ تصرف ہوجائے + +اس فنکشن کو صفحے کے تمام متعلقہ اشیاء (کنٹرولرز ، آراء ، ...) کو ضائع کرنے کے بعد ہی کہا جائے گا۔ + +## دوسرے اعلی درجے کی APIs + +```dart +// give the current args from currentScreen +Get.arguments + +// give name of previous route +Get.previousRoute + +// give the raw route to access for example, rawRoute.isFirst() +Get.rawRoute + +// give access to Routing API from GetObserver +Get.routing + +// check if snackbar is open +Get.isSnackbarOpen + +// check if dialog is open +Get.isDialogOpen + +// check if bottomsheet is open +Get.isBottomSheetOpen + +// remove one route. +Get.removeRoute() + +// back repeatedly until the predicate returns true. +Get.until() + +// go to next route and remove all the previous routes until the predicate returns true. +Get.offUntil() + +// go to next named route and remove all the previous routes until the predicate returns true. +Get.offNamedUntil() + +//Check in what platform the app is running +GetPlatform.isAndroid +GetPlatform.isIOS +GetPlatform.isMacOS +GetPlatform.isWindows +GetPlatform.isLinux +GetPlatform.isFuchsia + +//Check the device type +GetPlatform.isMobile +GetPlatform.isDesktop +//All platforms are supported independently in web! +//You can tell if you are running inside a browser +//on Windows, iOS, OSX, Android, etc. +GetPlatform.isWeb + + +// Equivalent to : MediaQuery.of(context).size.height, +// but immutable. +Get.height +Get.width + +// Gives the current context of the Navigator. +Get.context + +// Gives the context of the snackbar/dialog/bottomsheet in the foreground, anywhere in your code. +Get.contextOverlay + +// Note: the following methods are extensions on context. Since you +// have access to context in any place of your UI, you can use it anywhere in the UI code + +// If you need a changeable height/width (like Desktop or browser windows that can be scaled) you will need to use context. +context.width +context.height + +// Gives you the power to define half the screen, a third of it and so on. +// Useful for responsive applications. +// param dividedBy (double) optional - default: 1 +// param reducedBy (double) optional - default: 0 +context.heightTransformer() +context.widthTransformer() + +/// Similar to MediaQuery.of(context).size +context.mediaQuerySize() + +/// Similar to MediaQuery.of(context).padding +context.mediaQueryPadding() + +/// Similar to MediaQuery.of(context).viewPadding +context.mediaQueryViewPadding() + +/// Similar to MediaQuery.of(context).viewInsets; +context.mediaQueryViewInsets() + +/// Similar to MediaQuery.of(context).orientation; +context.orientation() + +/// Check if device is on landscape mode +context.isLandscape() + +/// Check if device is on portrait mode +context.isPortrait() + +/// Similar to MediaQuery.of(context).devicePixelRatio; +context.devicePixelRatio() + +/// Similar to MediaQuery.of(context).textScaleFactor; +context.textScaleFactor() + +/// Get the shortestSide from screen +context.mediaQueryShortestSide() + +/// True if width be larger than 800 +context.showNavbar() + +/// True if the shortestSide is smaller than 600p +context.isPhone() + +/// True if the shortestSide is largest than 600p +context.isSmallTablet() + +/// True if the shortestSide is largest than 720p +context.isLargeTablet() + +/// True if the current device is Tablet +context.isTablet() + +/// اسکرین کے سائز کے مطابق ایک قیمت لوٹاتا ہے +/// اس کی قیمت دے سکتے ہیں: +/// واچ: اگر مختصر ترین جگہ 300 سے چھوٹی ہے +/// موبائل: اگر مختصر ترین سائٹ 600 سے چھوٹی ہے +/// ٹیبلٹ: اگر مختصر ترین سائٹ 1200 سے چھوٹی ہے +/// ڈیسک ٹاپ: اگر چوڑائی 1200 سے زیادہ ہے +context.responsiveValue() +``` + +### اختیاری عالمی ترتیبات اور دستی تشکیلات + +گیٹ میٹریئل ایپ آپ کے لئے ہر چیز کو کنفیگر کرتی ہے ، لیکن اگر آپ تشکیل کرنا چاہتے ہیں تو دستی طور پر حاصل کریں۔ + +```dart +MaterialApp( + navigatorKey: Get.key, + navigatorObservers: [GetObserver()], +); +``` + +آپ `گیٹ اوزرور` کے اندر اپنا مڈل ویئر بھی استعمال کرسکیں گے ، اس سے کسی بھی چیز پر اثر نہیں پڑے گا۔ + +```dart +MaterialApp( + navigatorKey: Get.key, + navigatorObservers: [ + GetObserver(MiddleWare.observer) // Here + ], +); +``` + +آپ `گیٹ` کیلئے _ عالمی ترتیبات_ تشکیل دے سکتے ہیں۔ کسی بھی راستے کو آگے بڑھانے سے پہلے صرف اپنے کوڈ میں `گیٹ کنفیگ` شامل کریں۔ +یا اسے اپنے `گیٹ میٹیرال ایپ` میں براہ راست کریں + +```dart +GetMaterialApp( + enableLog: true, + defaultTransition: Transition.fade, + opaqueRoute: Get.isOpaqueRouteDefault, + popGesture: Get.isPopGestureEnable, + transitionDuration: Get.defaultDurationTransition, + defaultGlobalState: Get.defaultGlobalState, +); + +Get.config( + enableLog = true, + defaultPopGesture = true, + defaultTransition = Transitions.cupertino +) +``` + +آپ لاگ ان پیغامات کو اختیاری طور پر `گیٹ` سے دوبارہ بھیج سکتے ہیں۔ +اگر آپ خود اپنا ، پسندیدہ لاگنگ پیکیج استعمال کرنا چاہتے ہیں تو ، +اور وہاں موجود نوشتہ جات پر قبضہ کرنا چاہتے ہیں: + +```dart +GetMaterialApp( + enableLog: true, + logWriterCallback: localLogWriter, +); + +void localLogWriter(String text, {bool isError = false}) { + // pass the message to your favourite logging package here + // please note that even if enableLog: false log messages will be pushed in this callback + // you get check the flag if you want through GetConfig.isLogEnable +} + +``` + +### مقامی اسٹیٹ ویجٹ + +یہ وجیٹس آپ کو ایک ہی قیمت کا انتظام کرنے ، اور مقامی طور پر ریاست کو دائمی اور مقامی رکھنے کی اجازت دیتے ہیں۔ +ہمارے پاس ری ایکٹیو اور سادہ ذائقے ہیں۔ +مثال کے طور پر ، آپ ان کو ٹیکسٹ فیلڈ میں چھپے ہوئے متن کو ٹوگل کرنے کے لئے استعمال کرسکتے ہیں ، شاید کوئی رواج بنائیں +توسیع پذیر پینل ، یا ہوسکتا ہے کہ موجودہ فہرست میں ترمیم کرکے نیچے کی نیویگیشن بار میں مواد کو تبدیل کرتے ہوئے +`Scaffold` میں جسم کا + +#### ویلیو بلڈر + +`StatefulWidget` کی ایک سادگی جو` .setState` کال بیک کے ساتھ کام کرتی ہے جو تازہ ترین قیمت لیتی ہے۔ + +```dart +ValueBuilder( + initialValue: false, + builder: (value, updateFn) => Switch( + value: value, + onChanged: updateFn, // same signature! you could use ( newValue ) => updateFn( newValue ) + ), + // if you need to call something outside the builder method. + onUpdate: (value) => print("Value updated: $value"), + onDispose: () => print("Widget unmounted"), +), +``` + +#### اوبکس ویلیو + +اس طرح آپ کو قیمت ملتی ہے + +```dart +ObxValue((data) => Switch( + value: data.value, + onChanged: data, // Rx has a _callable_ function! You could use (flag) => data.value = flag, + ), + false.obs, +), +``` + +## کارآمد نکات + +`.obs`ervables ( _Rx_ Types) +```dart +var message = 'Hello world'.obs; +print( 'Message "$message" has Type ${message.runtimeType}'); +``` + + `message` --> **RxString** + +[x] `message.substring( 0, 4 )`. +[o] `.value` + +```dart +final name = 'GetX'.obs; +// only "updates" the stream, if the value is different from the current one. +name.value = 'Hey'; + +// All Rx properties are "callable" and returns the new value. +// but this approach does not accepts `null`, the UI will not rebuild. +name('Hello'); + +// is like a getter, prints 'Hello'. +name() ; + +/// numbers: + +final count = 0.obs; + +// You can use all non mutable operations from num primitives! +count + 1; + +// Watch out! this is only valid if `count` is not final, but var +count += 1; + +// You can also compare against values: +count > 2; + +/// booleans: + +final flag = false.obs; + +// switches the value between true/false +flag.toggle(); + + +/// all types: + +// Sets the `value` to null. +flag.nil(); + +// All toString(), toJson() operations are passed down to the `value` +print( count ); // calls `toString()` inside for RxInt + +final abc = [0,1,2].obs; +// Converts the value to a json Array, prints RxList +// Json is supported by all Rx types! +print('json: ${jsonEncode(abc)}, type: ${abc.runtimeType}'); + +// RxMap, RxList and RxSet are special Rx types, that extends their native types. +// but you can work with a List as a regular list, although is reactive! +abc.add(12); // pushes 12 to the list, and UPDATES the stream. +abc[3]; // like Lists, reads the index 3. + + +// equality works with the Rx and the value, but hashCode is always taken from the value +final number = 12.obs; +print( number == 12 ); // prints > true + +/// Custom Rx Models: + +// toJson(), toString() are deferred to the child, so you can implement override on them, and print() the observable directly. + +class User { + String name, last; + int age; + User({this.name, this.last, this.age}); + + @override + String toString() => '$name $last, $age years old'; +} + +final user = User(name: 'John', last: 'Doe', age: 33).obs; + +// `user` is "reactive", but the properties inside ARE NOT! +// So, if we change some variable inside of it... +user.value.name = 'Roi'; +// The widget will not rebuild!, +// `Rx` don't have any clue when you change something inside user. +// So, for custom classes, we need to manually "notify" the change. +user.refresh(); + +// or we can use the `update()` method! +user.update((value){ + value.name='Roi'; +}); + +print( user ); +``` + +#### گیٹ ویو + + +مجھے یہ ویجیٹ پسند ہے ، بہت آسان ، پھر بھی ، اتنا مفید ہے! + +ایک کانسٹیٹ اسٹیٹ لیس ویجیٹ ہے جس میں رجسٹرڈ `کنٹرولر` کے لئے حاصل کرنے والا `کنٹرولر` ہے ، بس۔ + +```dart + class AwesomeController extends GetxController { + final String title = 'My Awesome View'; + } + + // ALWAYS remember to pass the `Type` you used to register your controller! + class AwesomeView extends GetView { + @override + Widget build(BuildContext context) { + return Container( + padding: EdgeInsets.all(20), + child: Text(controller.title), // just call `controller.something` + ); + } + } +``` + +#### گیٹ ویجٹ + +زیادہ تر لوگوں کو اس ویجیٹ کے بارے میں کوئی اندازہ نہیں ہے ، یا اس کے استعمال کو پوری طرح سے الجھن میں ہے +استعمال کا معاملہ بہت کم ہے ، لیکن بہت ہی خاص ہے: یہ ایک کنٹرولر کی مدد کرتا ہے +کیچ_کی وجہ سے ، `مجاز اسٹیٹ لیس نہیں ہوسکتا ہے + +> تو ، جب آپ کو ایک کنٹرولر "کیش" کرنے کی ضرورت ہے؟ + +اگر آپ استعمال کرتے ہیں تو ، ** گیٹ ایکس ** کی ایک اور "اتنی عام نہیں" خصوصیت: `گیٹ.کریٹ`۔ + +`Get.create(()=>Controller())` ایک نیا پیدا کرے گا `Controller` ہر بار جب آپ کال کریں گے +`Get.find()`, + +اسی جگہ پر `گیٹ ویجٹ` چمکتا ہے ... جیسے کہ آپ اسے استعمال کرسکتے ہیں ، مثال کے طور پر ، +ٹوڈو اشیاء کی ایک فہرست رکھنے کے ل. لہذا ، اگر آپکے پاس وجٹس کو "دوبارہ تعمیر" ہو جاتا ہے تو ، یہ وہی کنٹرولر مثال برقرار رکھے گا۔ + +#### گیٹکس سروس + +This class is like a `GetxController`, it shares the same lifecycle ( `onInit()`, `onReady()`, `onClose()`). +But has no "logic" inside of it. It just notifies **GetX** Dependency Injection system, that this subclass +**can not** be removed from memory. + +So is super useful to keep your "Services" always reachable and active with `Get.find()`. Like: +`ApiService`, `StorageService`, `CacheService`. + +```dart +Future main() async { + await initServices(); /// AWAIT SERVICES INITIALIZATION. + runApp(SomeApp()); +} + +/// Is a smart move to make your Services intiialize before you run the Flutter app. +/// as you can control the execution flow (maybe you need to load some Theme configuration, +/// apiKey, language defined by the User... so load SettingService before running ApiService. +/// so GetMaterialApp() doesnt have to rebuild, and takes the values directly. +void initServices() async { + print('starting services ...'); + /// Here is where you put get_storage, hive, shared_pref initialization. + /// or moor connection, or whatever that's async. + await Get.putAsync(() => DbService().init()); + await Get.putAsync(SettingsService()).init(); + print('All services started...'); +} + +class DbService extends GetxService { + Future init() async { + print('$runtimeType delays 2 sec'); + await 2.delay(); + print('$runtimeType ready!'); + return this; + } +} + +class SettingsService extends GetxService { + void init() async { + print('$runtimeType delays 1 sec'); + await 1.delay(); + print('$runtimeType ready!'); + } +} + +``` + +`گیٹکسسروس` کو اصل میں حذف کرنے کا واحد راستہ ،`گیٹ.ریسیٹ` ہے جو ایک جیسے ہے +آپ کی ایپ کا "گرم ریبوٹ"۔ لہذا ، یاد رکھیں ، اگر آپ کو دوران کلاس مثال کے طور پر مطلق استقامت کی ضرورت ہو +اپنی ایپ کی زندگی بھر ، `گیٹکسسروس` استعمال کریں۔ + +# پچھلے ورژن سے اہم تبدیلیاں + +1. آر ایکس اقسام: + +| Before | After | +| ------- | ---------- | +| StringX | `RxString` | +| IntX | `RxInt` | +| MapX | `RxMap` | +| ListX | `RxList` | +| NumX | `RxNum` | +| DoubleX | `RxDouble` | + +آر ایکس کنٹرولر اور گیٹ بلڈر اب آپس میں مل گئے ہیں ، اب آپ کو یہ حفظ کرنے کی ضرورت نہیں ہے کہ آپ کون سے کنٹرولر استعمال کرنا چاہتے ہیں ، صرف گیٹکسکنٹرولر کا استعمال کریں ، یہ سادہ سسٹم مینجمنٹ اور رد عمل کے بھی کام کرے گا۔ + +2. نامزد روٹس +پہلے: + +```dart +GetMaterialApp( + namedRoutes: { + '/': GetRoute(page: Home()), + } +) +``` + +اب: + +```dart +GetMaterialApp( + getPages: [ + GetPage(name: '/', page: () => Home()), + ] +) +``` + +یہ تبدیلی کیوں؟ +اکثر ، یہ فیصلہ کرنا ضروری ہوسکتا ہے کہ پیرامیٹر ، یا لاگ ان ٹوکن سے کون سا صفحہ ڈسپلے ہوگا ، پچھلا نقطہ نظر پیچیدہ تھا ، کیونکہ اس نے اس کی اجازت نہیں دی۔ +صفحہ کو کسی فنکشن میں داخل کرنے سے رام کی کھپت میں نمایاں کمی واقع ہوئی ہے ، کیونکہ ایپ شروع ہونے کے بعد سے روٹوں کو میموری میں مختص نہیں کیا جائے گا ، اور اس طرح اس طرح کے نقطہ نظر کو کرنے کی بھی اجازت دی گئی ہے۔ + +```dart + +GetStorage box = GetStorage(); + +GetMaterialApp( + getPages: [ + GetPage(name: '/', page:(){ + return box.hasData('token') ? Home() : Login(); + }) + ] +) +``` + +# گیٹکس کیوں؟ + +1. فلٹر کی تازہ کاری کے بعد ، آپ کے بہت سے پیکیجز ٹوٹ جائیں گے۔ بعض اوقات تالیف کی غلطیاں ہوتی ہیں ، غلطیاں اکثر ظاہر ہوتی ہیں کہ اب بھی اس کے بارے میں کوئی جواب نہیں ملتا ہے ، اور ڈویلپر کو یہ جاننے کی ضرورت ہوتی ہے کہ غلطی کہاں سے ہوئی ہے ، غلطی کو ٹریک کریں ، تب ہی متعلقہ ذخیرہ میں کوئی مسئلہ کھولنے کی کوشش کریں ، اور دیکھیں کہ اس کا مسئلہ حل ہوتا ہے۔ ترقی کے مرکزی وسائل کو مرکز بنائیں (ریاست ، انحصار اور روٹ مینجمنٹ) ، آپ کو اپنے پبسپیک میں ایک پیکیج شامل کرنے اور کام شروع کرنے کی اجازت دے۔ پھڑپھڑانے کی تازہ کاری کے بعد ، آپ کو صرف انحصار کرنے کی ضرورت ہے گیٹ انحصار کو اپ ڈیٹ کریں ، اور کام کریں۔ مطابقت کے مسائل کو بھی حل کریں حاصل کریں۔ ایک پیکج کا ورژن کتنی بار دوسرے کے ورژن کے ساتھ مطابقت نہیں رکھتا ہے ، کیونکہ ایک ورژن میں انحصار استعمال کرتا ہے ، اور دوسرا دوسرے ورژن میں۔ گیٹ کو استعمال کرنے میں بھی یہ کوئی تشویش نہیں ہے ، کیونکہ سب کچھ ایک ہی پیکج میں ہے اور مکمل طور پر ہم آہنگ ہے۔ + +2. فلٹر آسان ہے .فلٹر ناقابل یقین ہے ، لیکن .فلٹر کے پاس اب بھی کچھ بوائلرپلیٹ موجود ہے جو زیادہ تر ڈویلپرز کے لئے ناپسندیدہ ہوسکتا ہے ، جیسے `Navigator.of(context).push (context, builder [...]`. پروگرامنگ کو آسان بنائیں۔ صرف راستے پر کال کرنے کے لئے 8 لائنوں کے کوڈ لکھنے کے بجائے ، آپ صرف یہ کرسکتے ہیں: `Get.to(Home())` اور آپ کر چکے ہیں ، آپ اگلے صفحے پر جائیں گے۔ متحرک ویب یو آر ایل ایک بہت تکلیف دہ چیز ہے جس کے ساتھ کرنا ہے ۔فلٹر فی الحال ، اور یہ کہ گیٹیکس کے ساتھ احمقانہ حد تک آسان ہے۔ .. فلٹر میں ریاستوں کا انتظام کرنا ، اور انحصار کا انتظام کرنا بھی ایک ایسی چیز ہے جو بہت ساری بحثیں پیدا کرتی ہے ، کیوں کہ پب میں سیکڑوں نمونوں کی موجودگی موجود ہے۔ لیکن آپ کے متغیر کے اختتام پر `.obs` شامل کرنے جتنا آسان کوئی چیز نہیں ہے ، اور اپنے ویجیٹ کو کسی اوکس کے اندر رکھ دیں ، اور بات یہ ہے کہ اس متغیر کی تمام تر تازہ کاری خود بخود اسکرین پر اپ ڈیٹ ہوجائے گی۔ + +3. کارکردگی کی فکر کئے بغیر آسانی۔ .فلٹر کی کارکردگی پہلے ہی حیرت انگیز ہے ، لیکن تصور کریں کہ آپ اپنے بلاکس / اسٹورز / کنٹرولرز / وغیرہ کلاسوں کو تقسیم کرنے کے لئے اسٹیٹ مینیجر اور لوکیٹر کا استعمال کرتے ہیں۔ جب آپ کو ضرورت نہ ہو تو آپ کو دستی طور پر اس انحصار کے اخراج کو کال کرنا پڑے گا۔ لیکن کیا آپ نے کبھی اپنے کنٹرولر کو محض استعمال کرنے کے بارے میں سوچا ہے ، اور جب اب یہ کسی کے ذریعہ استعمال نہیں ہو رہا تھا تو ، اسے آسانی سے میموری سے حذف کردیا جائے گا؟ گیٹ ایکس یہی کرتا ہے۔ اسمارٹ مینجمنٹ کے ساتھ ، ہر وہ چیز جو استعمال نہیں ہورہی ہے اسے میموری سے حذف کردیا جاتا ہے ، اور آپ کو پروگرامنگ کے علاوہ کسی بھی چیز کی فکر کرنے کی ضرورت نہیں ہے۔ آپ کو یقین دلایا جائے گا کہ آپ کم از کم ضروری وسائل بروئے کار لا رہے ہیں ، حتی کہ اس کے لئے بھی کوئی منطق پیدا نہیں کیا۔ + +4. اصل ڈیکوپلنگ۔ آپ نے یہ نظریہ "کاروبار کی منطق سے نظریہ کو الگ کریں" سنا ہوگا۔ یہ ریاستی انتظام کے دیگر حلوں کی کوئی خاصیت نہیں ہے اور مارکیٹ میں کسی دوسرے معیار کا یہ تصور ہے۔ تاہم ، سیاق و سباق کے استعمال کی وجہ سے پھڑپھڑ میں اکثر اس تصور کو کم کیا جاسکتا ہے۔ +اگر آپ کو وراثت والے ویجیٹ کو تلاش کرنے کے لئے سیاق و سباق کی ضرورت ہوتی ہے تو ، آپ کو اس کی نظر میں ضرورت ہوگی ، یا پیرامیٹر کے ذریعہ سیاق و سباق کو منتقل کریں۔ مجھے خاص طور پر یہ حل بہت ہی بدصورت معلوم ہوتا ہے ، اور ٹیموں میں کام کرنے کے لئے ہمیں ہمیشہ ویو کی کاروباری منطق پر انحصار کرنا پڑے گا۔ گیٹکس معیاری نقطہ نظر کے ساتھ غیر روایتی ہے ، اور اگرچہ اس میں اسٹیٹ فل وِیجٹس ، انیسٹیٹ وغیرہ کے استعمال پر مکمل پابندی نہیں ہے تو ، اس کا ہمیشہ ایسا ہی نقطہ نظر ہوتا ہے جو صاف ستھرا ہوسکتا ہے۔ کنٹرولرز کے پاس زندگی کا دور رہتا ہے ، اور جب آپ کو مثال کے طور پر درخواست دینے کی ضرورت ہوتی ہے تو ، آپ کو نظر میں کسی چیز پر انحصار نہیں کرنا ہوتا ہے۔ آپ ایچ ٹی ٹی پی کال شروع کرنے کے لئے اونٹ کا استعمال کرسکتے ہیں ، اور جب ڈیٹا آجائے گا تو متغیرات آباد ہوجائیں گے۔ چونکہ گیٹ ایکس مکمل طور پر رد عمل مند ہے (واقعتا، ، اور نہروں کے تحت کام کرتا ہے) ، ایک بار جب سامان بھر جاتا ہے تو ، اس متغیر کو استعمال کرنے والے تمام ویجٹ خود بخود منظر میں اپ ڈیٹ ہوجائیں گے۔ اس سے UI کی مہارت رکھنے والے افراد کو صرف وگیٹس کے ساتھ کام کرنے کا موقع ملتا ہے ، اور صارف کے واقعات (جیسے بٹن پر کلک کرنے کے علاوہ) کے علاوہ کاروباری منطق پر کچھ بھی نہیں بھیجنا پڑتا ہے ، جبکہ کاروباری منطق کے ساتھ کام کرنے والے افراد الگ الگ کاروبار کی منطق کی تخلیق اور جانچ کر سکتے ہیں۔ + +اس لائبریری کو ہمیشہ اپ ڈیٹ کیا جائے گا اور نئی خصوصیات کو نافذ کیا جائے گا۔ بلا جھجک پی آر پیش کریں اور ان میں اپنا حصہ ڈالیں۔ + +# سماجی خدمات + +## کمیونٹی چینلز + +گیٹ ایکس میں انتہائی فعال اور مددگار کمیونٹی ہے۔ اگر آپ کے ذہن میں سوالات ہیں ، یا اس فریم ورک کے استعمال کے سلسلے میں کوئی مدد چاہتے ہیں تو ، براہ کرم ہمارے کمیونٹی چینلز میں شامل ہوں ، آپ کے سوال کا زیادہ جلد جواب دیا جائے گا ، اور یہ سب سے موزوں جگہ ہوگی۔ یہ ذخیر. مسائل کو کھولنے ، اور وسائل کی درخواست کرنے کے لئے خصوصی ہے ، لیکن گیٹ ایکس کمیونٹی کا حصہ بننے میں آزاد محسوس کرتے ہیں۔ + +| **Slack** | **Discord** | **Telegram** | +| :-------------------------------------------------------------------------------------------------------------------------- | :-------------------------------------------------------------------------------------------------------------------------- | :-------------------------------------------------------------------------------------------------------------------- | +| [![Get on Slack](https://img.shields.io/badge/slack-join-orange.svg)](https://communityinviter.com/apps/getxworkspace/getx) | [![Discord Shield](https://img.shields.io/discord/722900883784073290.svg?logo=discord)](https://discord.com/invite/9Hpt99N) | [![Telegram](https://img.shields.io/badge/chat-on%20Telegram-blue.svg)](https://t.me/joinchat/PhdbJRmsZNpAqSLJL6bH7g) | + +## کس طرح شراکت کریں + + +منصوبے میں شراکت کرنا چاہتے ہیں؟ ہمیں اپنے ایک ساتھی کی حیثیت سے آپ کو اجاگر کرنے پر فخر ہوگا۔ یہاں کچھ نکات ہیں جہاں آپ اپنا حصہ ڈال سکتے ہیں اور گیٹ (اور پھڑپھڑنا) کو اور بہتر بنا سکتے ہیں۔ + +- ریڈمی کو دوسری زبانوں میں ترجمہ کرنے میں مدد کرنا۔ +- دستاویزات کو ریڈ می میں شامل کرنا (گیٹ کے بہت سارے کام ابھی دستاویزی نہیں ہوئے ہیں)۔ +- مضامین لکھیں یا ویڈیوز بنائیں جس کی تعلیم دیتے ہیں کہ گیٹ (ان کو ریڈیم میں اور مستقبل میں ہمارے ویکی میں داخل کیا جائے گا) کو کس طرح استعمال کیا جائے۔ +- کوڈ / ٹیسٹ کے لئے پی آر پیش کرنا۔ +- نئے افعال سمیت. + +کسی بھی شراکت کا خیرمقدم ہے! + +## مضامین اور ویڈیوز + +- [Dynamic Themes in 3 lines using GetX™](https://medium.com/swlh/flutter-dynamic-themes-in-3-lines-c3b375f292e3) - Tutorial by [Rod Brown](https://github.com/RodBr). +- [Complete GetX™ Navigation](https://www.youtube.com/watch?v=RaqPIoJSTtI) - Route management video by Amateur Coder. +- [Complete GetX State Management](https://www.youtube.com/watch?v=CNpXbeI_slw) - State management video by Amateur Coder. +- [GetX™ Other Features](https://youtu.be/ttQtlX_Q0eU) - Utils, storage, bindings and other features video by Amateur Coder. +- [Firestore User with GetX | Todo App](https://www.youtube.com/watch?v=BiV0DcXgk58) - Video by Amateur Coder. +- [Firebase Auth with GetX | Todo App](https://www.youtube.com/watch?v=-H-T_BSgfOE) - Video by Amateur Coder. +- [The Flutter GetX™ Ecosystem ~ State Management](https://medium.com/flutter-community/the-flutter-getx-ecosystem-state-management-881c7235511d) - State management by [Aachman Garg](https://github.com/imaachman). +- [The Flutter GetX™ Ecosystem ~ Dependency Injection](https://medium.com/flutter-community/the-flutter-getx-ecosystem-dependency-injection-8e763d0ec6b9) - Dependency Injection by [Aachman Garg](https://github.com/imaachman). +- [GetX, the all-in-one Flutter package](https://www.youtube.com/watch?v=IYQgtu9TM74) - A brief tutorial covering State Management and Navigation by Thad Carnevalli. +- [Build a To-do List App from scratch using Flutter and GetX](https://www.youtube.com/watch?v=EcnqFasHf18) - UI + State Management + Storage video by Thad Carnevalli. +- [GetX Flutter Firebase Auth Example](https://medium.com/@jeffmcmorris/getx-flutter-firebase-auth-example-b383c1dd1de2) - Article by Jeff McMorris. +- [Flutter State Management with GetX – Complete App](https://www.appwithflutter.com/flutter-state-management-with-getx/) - by App With Flutter. +- [Flutter Routing with Animation using Get Package](https://www.appwithflutter.com/flutter-routing-using-get-package/) - by App With Flutter. + + diff --git a/siro_rider/packages/get/README.zh-cn.md b/siro_rider/packages/get/README.zh-cn.md new file mode 100644 index 0000000..9814a8d --- /dev/null +++ b/siro_rider/packages/get/README.zh-cn.md @@ -0,0 +1,919 @@ +![](https://raw.githubusercontent.com/jonataslaw/getx-community/master/get.png) + +_语言: 中文, [英文](README.md), [越南文](README-vi.md), [印度尼西亚](README.id-ID.md), [乌尔都语](README.ur-PK.md), [巴西葡萄牙语](README.pt-br.md), [俄语](README.ru.md), [西班牙语](README-es.md), [波兰语](README.pl.md), [韩国语](README.ko-kr.md), [法语](README-fr.md), [French](README-fr.md)._ + +[![pub package](https://img.shields.io/pub/v/get.svg?label=get&color=blue)](https://pub.dev/packages/get) +[![popularity](https://badges.bar/get/popularity)](https://pub.dev/packages/sentry/score) +[![likes](https://badges.bar/get/likes)](https://pub.dev/packages/get/score) +[![pub points](https://badges.bar/get/pub%20points)](https://pub.dev/packages/get/score) +![building](https://github.com/jonataslaw/get/workflows/build/badge.svg) +[![style: effective dart](https://img.shields.io/badge/style-effective_dart-40c4ff.svg)](https://pub.dev/packages/effective_dart) +[![Discord Shield](https://img.shields.io/discord/722900883784073290.svg?logo=discord)](https://discord.com/invite/9Hpt99N) +[![Get on Slack](https://img.shields.io/badge/slack-join-orange.svg)](https://communityinviter.com/apps/getxworkspace/getx) +[![Telegram](https://img.shields.io/badge/chat-on%20Telegram-blue.svg)](https://t.me/joinchat/PhdbJRmsZNpAqSLJL6bH7g) + +Awesome Flutter + +Buy Me A Coffee + +![](https://raw.githubusercontent.com/jonataslaw/getx-community/master/getx.png) + +- [关于Get](#关于get) +- [安装](#安装) +- [GetX的计数器示例](#getx的计数器示例) +- [三大功能](#三大功能) + - [状态管理](#状态管理) + - [响应式状态管理器](#响应式状态管理器) + - [关于状态管理的更多细节](#关于状态管理的更多细节) + - [路由管理](#路由管理) + - [关于路由管理的更多细节](#关于路由管理的更多细节) + - [依赖管理](#依赖管理) + - [关于依赖管理的更多细节](#关于依赖管理的更多细节) +- [实用工具](#实用工具) + - [国际化](#国际化) + - [翻译](#翻译) + - [使用翻译](#使用翻译) + - [语言](#语言) + - [改变语言](#改变语言) + - [系统语言](#系统语言) + - [改变主题](#改变主题) + - [其他高级API](#其他高级api) + - [可选的全局设置和手动配置](#可选的全局设置和手动配置) + - [局部状态组件](#局部状态组件) + - [ValueBuilder](#valuebuilder) + - [ObxValue](#obxvalue) + - [有用的提示](#有用的提示) + - [GetView](#getview) + - [GetWidget](#getwidget) + - [GetxService](#getxservice) +- [从2.0开始的兼容性变化](#从20开始的兼容性变化) +- [为什么选择Getx?](#为什么选择getx) +- [社区](#社区) + - [社区渠道](#社区渠道) + - [如何做贡献](#如何做贡献) + - [文章和视频](#文章和视频) + +# 关于Get + +- GetX 是 Flutter 上的一个轻量且强大的解决方案:高性能的状态管理、智能的依赖注入和便捷的路由管理。 + +- GetX 有3个基本原则: + + - **性能:** GetX 专注于性能和最小资源消耗。GetX 打包后的apk占用大小和运行时的内存占用与其他状态管理插件不相上下。如果你感兴趣,这里有一个[性能测试](https://github.com/jonataslaw/benchmarks)。 + - **效率:** GetX 的语法非常简捷,并保持了极高的性能,能极大缩短你的开发时长。 + - **结构:** GetX 可以将界面、逻辑、依赖和路由完全解耦,用起来更清爽,逻辑更清晰,代码更容易维护。 + +- GetX 并不臃肿,却很轻量。如果你只使用状态管理,只有状态管理模块会被编译,其他没用到的东西都不会被编译到你的代码中。它拥有众多的功能,但这些功能都在独立的容器中,只有在使用后才会启动。 + +- Getx有一个庞大的生态系统,能够在Android、iOS、Web、Mac、Linux、Windows和你的服务器上用同样的代码运行。 +**通过[Get Server](https://github.com/jonataslaw/get_server)** 可以在你的后端完全重用你在前端写的代码。 + +**此外,通过[Get CLI](https://github.com/jonataslaw/get_cli)**,无论是在服务器上还是在前端,整个开发过程都可以完全自动化。 + +**此外,为了进一步提高您的生产效率,我们还为您准备了一些插件** + +- **getx_template**:一键生成每个页面必需的文件夹、文件、模板代码等等 + - [Android Studio/Intellij插件](https://plugins.jetbrains.com/plugin/15919-getx) +- **GetX Snippets**:输入少量字母,自动提示选择后,可生成常用的模板代码 + - [Android Studio/Intellij扩展](https://plugins.jetbrains.com/plugin/14975-getx-snippets) + - [VSCode扩展](https://marketplace.visualstudio.com/items?itemName=get-snippets.get-snippets) + +# 安装 + +将 Get 添加到你的 pubspec.yaml 文件中。 + +```yaml +dependencies: + get: +``` + +在需要用到的文件中导入,它将被使用。 + +```dart +import 'package:get/get.dart'; +``` + +# GetX的计数器示例 + +Flutter默认创建的 "计数器 "项目有100多行(含注释),为了展示Get的强大功能,我将使用 GetX 重写一个"计数器 Plus版",实现: +- 每次点击都能改变状态 +- 在不同页面之间切换 +- 在不同页面之间共享状态 +- 将业务逻辑与界面分离 + +而完成这一切只需 **26 行代码(含注释)** + +- 步骤1. +在你的MaterialApp前添加 "Get",将其变成GetMaterialApp。 + +```dart +void main() => runApp(GetMaterialApp(home: Home())); +``` + +- 注意:这并不能修改Flutter的MaterialApp,GetMaterialApp并不是修改后的MaterialApp,它只是一个预先配置的Widget,它的子组件是默认的MaterialApp。你可以手动配置,但绝对没有必要。GetMaterialApp会创建路由,注入它们,注入翻译,注入你需要的一切路由导航。如果你只用Get来进行状态管理或依赖管理,就没有必要使用GetMaterialApp。GetMaterialApp对于路由、snackbar、国际化、bottomSheet、对话框以及与路由相关的高级apis和没有上下文(context)的情况下是必要的。 +- 注2: 只有当你要使用路由管理(`Get.to()`, `Get.back()`等)时才需要这一步。如果你不打算使用它,那么就不需要做第1步。 + +- 第二步: + 创建你的业务逻辑类,并将所有的变量,方法和控制器放在里面。 + 你可以使用一个简单的".obs "使任何变量成为可观察的。 + +```dart +class Controller extends GetxController{ + var count = 0.obs; + increment() => count++; +} +``` + +- 第三步: + 创建你的界面,使用StatelessWidget节省一些内存,使用Get你可能不再需要使用StatefulWidget。 + +```dart +class Home extends StatelessWidget { + + @override + Widget build(context) { + + // 使用Get.put()实例化你的类,使其对当下的所有子路由可用。 + final Controller c = Get.put(Controller()); + + return Scaffold( + // 使用Obx(()=>每当改变计数时,就更新Text()。 + appBar: AppBar(title: Obx(() => Text("Clicks: ${c.count}"))), + + // 用一个简单的Get.to()即可代替Navigator.push那8行,无需上下文! + body: Center(child: ElevatedButton( + child: Text("Go to Other"), onPressed: () => Get.to(Other()))), + floatingActionButton: + FloatingActionButton(child: Icon(Icons.add), onPressed: c.increment)); + } +} + +class Other extends StatelessWidget { + // 你可以让Get找到一个正在被其他页面使用的Controller,并将它返回给你。 + final Controller c = Get.find(); + + @override + Widget build(context){ + // 访问更新后的计数变量 + return Scaffold(body: Center(child: Text("${c.count}"))); + } +} +``` + +结果: + +![](https://raw.githubusercontent.com/jonataslaw/getx-community/master/counter-app-gif.gif) + +这是一个简单的项目,但它已经让人明白Get的强大。随着项目的发展,这种差异将变得更加显著。 + +Get的设计是为了与团队合作,但它也可以让个人开发者的工作变得更简单。 + +加快开发速率,在不损失性能的情况下按时交付一切。Get并不适合每一个人,但如果你认同这句话,Get就是为你准备的! + +# 三大功能 + +## 状态管理 + +目前,Flutter有几种状态管理器。但是,它们中的大多数都涉及到使用ChangeNotifier来更新widget,这对于中大型应用的性能来说是一个很糟糕的方法。你可以在Flutter的官方文档中查看到,[ChangeNotifier应该使用1个或最多2个监听器](https://api.flutter.dev/flutter/foundation/ChangeNotifier-class.html),这使得它们实际上无法用于任何中等或大型应用。 + +Get 并不是比任何其他状态管理器更好或更差,而是说你应该分析这些要点以及下面的要点来选择只用Get,还是与其他状态管理器结合使用。 + +Get不是其他状态管理器的敌人,因为Get是一个微框架,而不仅仅是一个状态管理器,既可以单独使用,也可以与其他状态管理器结合使用。 + +Get有两个不同的状态管理器:简单的状态管理器(GetBuilder)和响应式状态管理器(GetX)。 + +### 响应式状态管理器 + +响应式编程可能会让很多人感到陌生,因为觉得它很复杂,但是GetX将响应式编程变得非常简单。 + +- 你不需要创建StreamControllers. +- 你不需要为每个变量创建一个StreamBuilder。 +- 你不需要为每个状态创建一个类。 +- 你不需要为一个初始值创建一个get。 + +使用 Get 的响应式编程就像使用 setState 一样简单。 + +让我们想象一下,你有一个名称变量,并且希望每次你改变它时,所有使用它的小组件都会自动刷新。 + +这就是你的计数变量。 + +```dart +var name = 'Jonatas Borges'; +``` + +要想让它变得可观察,你只需要在它的末尾加上".obs"。 + +```dart +var name = 'Jonatas Borges'.obs; +``` + +而在UI中,当你想显示该值并在值变化时更新页面,只需这样做。 + +```dart +Obx(() => Text("${controller.name}")); +``` + +这就是全部,就这么简单。 + +### 关于状态管理的更多细节 + +**关于状态管理更深入的解释请查看[这里](./documentation/zh_CN/state_management.md)。在那里你将看到更多的例子,以及简单的状态管理器和响应式状态管理器之间的区别**。 + +你会对GetX的能力有一个很好的了解。 + +## 路由管理 + +如果你想免上下文(context)使用路由/snackbars/dialogs/bottomsheets,GetX对你来说也是极好的,来吧展示: + +在你的MaterialApp前加上 "Get",把它变成GetMaterialApp。 + +```dart +GetMaterialApp( // Before: MaterialApp( + home: MyHome(), +) +``` + +导航到新页面 + +```dart + +Get.to(NextScreen()); +``` + +用别名导航到新页面。查看更多关于命名路由的详细信息[这里](./documentation/zh_CN/route_management.md#navigation-with-named-routes) + +```dart + +Get.toNamed('/details'); +``` + +要关闭snackbars, dialogs, bottomsheets或任何你通常会用Navigator.pop(context)关闭的东西。 + +```dart +Get.back(); +``` + +进入下一个页面,但没有返回上一个页面的选项(用于闪屏页,登录页面等)。 + +```dart +Get.off(NextScreen()); +``` + +进入下一个页面并取消之前的所有路由(在购物车、投票和测试中很有用)。 + +```dart +Get.offAll(NextScreen()); +``` + +注意到你不需要使用context来做这些事情吗?这就是使用Get路由管理的最大优势之一。有了它,你可以在你的控制器类中执行所有这些方法,而不用担心context在哪里。 + +### 关于路由管理的更多细节 + +**关于别名路由,和对路由的低级控制,请看[这里](./documentation/zh_CN/route_management.md)**。 + +## 依赖管理 + +Get有一个简单而强大的依赖管理器,它允许你只用1行代码就能检索到与你的Bloc或Controller相同的类,无需Provider context,无需inheritedWidget。 + +```dart +Controller controller = Get.put(Controller()); // 而不是 Controller controller = Controller(); +``` + +- 注意:如果你使用的是Get的状态管理器,请多注意绑定api,这将使你的界面更容易连接到你的控制器。 + +你是在Get实例中实例化它,而不是在你使用的类中实例化你的类,这将使它在整个App中可用。 +所以你可以正常使用你的控制器(或类Bloc)。 + +**提示:** Get依赖管理与包的其他部分是解耦的,所以如果你的应用已经使用了一个状态管理器(任何一个,都没关系),你不需要全部重写,你可以使用这个依赖注入。 + +```dart +controller.fetchApi(); +``` + +想象一下,你已经浏览了无数条路由,现在你需要拿到一个被遗留在控制器中的数据,那你需要一个状态管理器与Provider或Get_it一起使用来拿到它,对吗?用Get则不然,Get会自动为你的控制器找到你想要的数据,而你甚至不需要任何额外的依赖关系。 + +```dart +Controller controller = Get.find(); +//是的,它看起来像魔术,Get会找到你的控制器,并将其提供给你。你可以实例化100万个控制器,Get总会给你正确的控制器。 +``` + +然后你就可以恢复你在后面获得的控制器数据。 + +```dart +Text(controller.textFromApi); +``` + +### 关于依赖管理的更多细节 + +**关于依赖管理的更深入解释请看[此处](./documentation/zh_CN/dependency_management.md)**。 + +# 实用工具 + +## 国际化 + +### 翻译 + +翻译被保存为一个简单的键值字典映射。 +要添加自定义翻译,请创建一个类并扩展`翻译`。 + +```dart +import 'package:get/get.dart'; + +class Messages extends Translations { + @override + Map> get keys => { + 'zh_CN': { + 'hello': '你好 世界', + }, + 'de_DE': { + 'hello': 'Hallo Welt', + } + }; +} +``` + +#### 使用翻译 + +只要将`.tr`追加到指定的键上,就会使用`Get.locale`和`Get.fallbackLocale`的当前值进行翻译。 + +```dart +Text('title'.tr); +``` + +### 语言 + +传递参数给`GetMaterialApp`来定义语言和翻译。 + +```dart +return GetMaterialApp( + translations: Messages(), // 你的翻译 + locale: Locale('zh', 'CN'), // 将会按照此处指定的语言翻译 + fallbackLocale: Locale('en', 'US'), // 添加一个回调语言选项,以备上面指定的语言翻译不存在 +); +``` + +#### 改变语言 + +调用`Get.updateLocale(locale)`来更新语言环境。然后翻译会自动使用新的locale。 + +```dart +var locale = Locale('en', 'US'); +Get.updateLocale(locale); +``` + +#### 系统语言 + +要读取系统语言,可以使用`window.locale`。 + +```dart +import 'dart:ui' as ui; + +return GetMaterialApp( + locale: ui.window.locale, +); +``` + +## 改变主题 + +请不要使用比`GetMaterialApp`更高级别的widget来更新主题,这可能会造成键重复。很多人习惯于创建一个 "ThemeProvider "的widget来改变应用主题,这在**GetX™**中是绝对没有必要的。 + +你可以创建你的自定义主题,并简单地将其添加到`Get.changeTheme`中,而无需任何模板。 + +```dart +Get.changeTheme(ThemeData.light()); +``` + +如果你想在 "onTap "中创建类似于改变主题的按钮,你可以结合两个**GetX™** API来实现。 + +- 检查是否使用了深色的 "Theme "的API,以及 "Theme "更改API。 +- 而`Theme` Change API,你可以把下面的代码放在`onPressed`里。 + +```dart +Get.changeTheme(Get.isDarkMode? ThemeData.light(): ThemeData.dark()); +``` + +当`.darkmode`被激活时,它将切换到light主题,当light主题被激活时,它将切换到dark主题。 + +## 其他高级API + +```dart +// 给出当前页面的args。 +Get.arguments + +//给出以前的路由名称 +Get.previousRoute + +// 给出要访问的原始路由,例如,rawRoute.isFirst() +Get.rawRoute + +// 允许从GetObserver访问Rounting API。 +Get.routing + +// 检查 snackbar 是否打开 +Get.isSnackbarOpen + +// 检查 dialog 是否打开 +Get.isDialogOpen + +// 检查 bottomsheet 是否打开 +Get.isBottomSheetOpen + +// 删除一个路由。 +Get.removeRoute() + +//反复返回,直到表达式返回真。 +Get.until() + +// 转到下一条路由,并删除所有之前的路由,直到表达式返回true。 +Get.offUntil() + +// 转到下一个命名的路由,并删除所有之前的路由,直到表达式返回true。 +Get.offNamedUntil() + +//检查应用程序在哪个平台上运行。 +GetPlatform.isAndroid +GetPlatform.isIOS +GetPlatform.isMacOS +GetPlatform.isWindows +GetPlatform.isLinux +GetPlatform.isFuchsia + +//检查设备类型 +GetPlatform.isMobile +GetPlatform.isDesktop +//所有平台都是独立支持web的! +//你可以知道你是否在浏览器内运行。 +//在Windows、iOS、OSX、Android等系统上。 +GetPlatform.isWeb + + +// 相当于.MediaQuery.of(context).size.height, +//但不可改变。 +Get.height +Get.width + +// 提供当前上下文。 +Get.context + +// 在你的代码中的任何地方,在前台提供 snackbar/dialog/bottomsheet 的上下文。 +Get.contextOverlay + +// 注意:以下方法是对上下文的扩展。 +// 因为在你的UI的任何地方都可以访问上下文,你可以在UI代码的任何地方使用它。 + +// 如果你需要一个可改变的高度/宽度(如桌面或浏览器窗口可以缩放),你将需要使用上下文。 +context.width +context.height + +// 让您可以定义一半的页面、三分之一的页面等。 +// 对响应式应用很有用。 +// 参数: dividedBy (double) 可选 - 默认值:1 +// 参数: reducedBy (double) 可选 - 默认值:0。 +context.heightTransformer() +context.widthTransformer() + +/// 类似于 MediaQuery.of(context).size。 +context.mediaQuerySize() + +/// 类似于 MediaQuery.of(context).padding。 +context.mediaQueryPadding() + +/// 类似于 MediaQuery.of(context).viewPadding。 +context.mediaQueryViewPadding() + +/// 类似于 MediaQuery.of(context).viewInsets。 +context.mediaQueryViewInsets() + +/// 类似于 MediaQuery.of(context).orientation; +context.orientation() + +///检查设备是否处于横向模式 +context.isLandscape() + +///检查设备是否处于纵向模式。 +context.isPortrait() + +///类似于MediaQuery.of(context).devicePixelRatio。 +context.devicePixelRatio() + +///类似于MediaQuery.of(context).textScaleFactor。 +context.textScaleFactor() + +///查询设备最短边。 +context.mediaQueryShortestSide() + +///如果宽度大于800,则为真。 +context.showNavbar() + +///如果最短边小于600p,则为真。 +context.isPhone() + +///如果最短边大于600p,则为真。 +context.isSmallTablet() + +///如果最短边大于720p,则为真。 +context.isLargeTablet() + +///如果当前设备是平板电脑,则为真 +context.isTablet() + +///根据页面大小返回一个值。 +///可以给值为: +///watch:如果最短边小于300 +///mobile:如果最短边小于600 +///tablet:如果最短边(shortestSide)小于1200 +///desktop:如果宽度大于1200 +context.responsiveValue() +``` + +### 可选的全局设置和手动配置 + +GetMaterialApp为你配置了一切,但如果你想手动配置Get。 + +```dart +MaterialApp( + navigatorKey: Get.key, + navigatorObservers: [GetObserver()], +); +``` + +你也可以在`GetObserver`中使用自己的中间件,这不会影响任何事情。 + +```dart +MaterialApp( + navigatorKey: Get.key, + navigatorObservers: [ + GetObserver(MiddleWare.observer) // Here + ], +); +``` + +你可以为 "Get "创建_全局设置。只需在推送任何路由之前将`Get.config`添加到你的代码中。 +或者直接在你的`GetMaterialApp`中做。 + +```dart +GetMaterialApp( + enableLog: true, + defaultTransition: Transition.fade, + opaqueRoute: Get.isOpaqueRouteDefault, + popGesture: Get.isPopGestureEnable, + transitionDuration: Get.defaultDurationTransition, + defaultGlobalState: Get.defaultGlobalState, +); + +Get.config( + enableLog = true, + defaultPopGesture = true, + defaultTransition = Transitions.cupertino +) +``` + +你可以选择重定向所有来自`Get`的日志信息。 +如果你想使用你自己喜欢的日志包,并想查看那里的日志。 + +```dart +GetMaterialApp( + enableLog: true, + logWriterCallback: localLogWriter, +); + +void localLogWriter(String text, {bool isError = false}) { + // 在这里把信息传递给你最喜欢的日志包。 + // 请注意,即使enableLog: false,日志信息也会在这个回调中被推送。 + // 如果你想的话,可以通过GetConfig.isLogEnable来检查这个标志。 +} + +``` + +### 局部状态组件 + +这些Widgets允许您管理一个单一的值,并保持状态的短暂性和本地性。 +我们有Reactive和Simple两种风格。 +例如,你可以用它们来切换`TextField`中的obscureText,也许可以创建一个自定义的可扩展面板(Expandable Panel),或者在"Scaffold "的主体中改变内容的同时修改`BottomNavigationBar`中的当前索引。 + + +#### ValueBuilder + +`StatefulWidget`的简化,它与`.setState`回调一起工作,并接受更新的值。 + +```dart +ValueBuilder( + initialValue: false, + builder: (value, updateFn) => Switch( + value: value, + onChanged: updateFn, // 你可以用( newValue )=> updateFn( newValue )。 + ), + // 如果你需要调用 builder 方法之外的东西。 + onUpdate: (value) => print("Value updated: $value"), + onDispose: () => print("Widget unmounted"), +), +``` + +#### ObxValue + +类似于[`ValueBuilder`](#valuebuilder),但这是Reactive版本,你需要传递一个Rx实例(还记得神奇的.obs吗?自动更新......是不是很厉害?) + +```dart +ObxValue((data) => Switch( + value: data.value, + onChanged: data, // Rx 有一个 _callable_函数! 你可以使用 (flag) => data.value = flag, + ), + false.obs, +), +``` + +## 有用的提示 + +`.obs`ervables (也称为_Rx_ Types)有各种各样的内部方法和操作符。 + +> `.obs`的属性**是**实际值,不要搞错了! +> 我们避免了变量的类型声明,因为Dart的编译器足够聪明,而且代码 +> 看起来更干净,但: + +```dart +var message = 'Hello world'.obs; +print( 'Message "$message" has Type ${message.runtimeType}'); +``` + +即使`message` _prints_实际的字符串值,类型也是**RxString**! +所以,你不能做`message.substring( 0, 4 )`。 +你必须在_observable_里面访问真正的`value`。 +最常用的方法是".value", 但是你也可以用... + +```dart +final name = 'GetX'.obs; +//只有在值与当前值不同的情况下,才会 "更新 "流。 +name.value = 'Hey'; + +// 所有Rx属性都是 "可调用 "的,并返回新的值。 +//但这种方法不接受 "null",UI将不会重建。 +name('Hello'); + +// 就像一个getter,打印'Hello'。 +name() ; + +///数字。 + +final count = 0.obs; + +// 您可以使用num基元的所有不可变操作! +count + 1; + +// 注意!只有当 "count "不是final时,这才有效,除了var +count += 1; + +// 你也可以与数值进行比较。 +count > 2; + +/// booleans: + +final flag = false.obs; + +// 在真/假之间切换数值 +flag.toggle(); + + +/// 所有类型。 + +// 将 "value "设为空。 +flag.nil(); + +// 所有的toString()、toJson()操作都会向下传递到`value`。 +print( count ); // 在内部调用 "toString() "来GetRxInt + +final abc = [0,1,2].obs; +// 将值转换为json数组,打印RxList。 +// 所有Rx类型都支持Json! +print('json: ${jsonEncode(abc)}, type: ${abc.runtimeType}'); + +// RxMap, RxList 和 RxSet 是特殊的 Rx 类型,扩展了它们的原生类型。 +// 但你可以像使用普通列表一样使用列表,尽管它是响应式的。 +abc.add(12); // 将12添加到列表中,并更新流。 +abc[3]; // 和Lists一样,读取索引3。 + + +// Rx和值是平等的,但hashCode总是从值中提取。 +final number = 12.obs; +print( number == 12 ); // prints > true + +///自定义Rx模型。 + +// toJson(), toString()都是递延给子代的,所以你可以在它们上实现覆盖,并直接打印()可观察的内容。 + +class User { + String name, last; + int age; + User({this.name, this.last, this.age}); + + @override + String toString() => '$name $last, $age years old'; +} + +final user = User(name: 'John', last: 'Doe', age: 33).obs; + +// `user`是 "响应式 "的,但里面的属性却不是! +// 所以,如果我们改变其中的一些变量: +user.value.name = 'Roi'; +// 小部件不会重建! +// 对于自定义类,我们需要手动 "通知 "改变。 +user.refresh(); + +// 或者我们可以使用`update()`方法! +user.update((value){ + value.name='Roi'; +}); + +print( user ); +``` + +#### GetView + +我很喜欢这个Widget,很简单,很有用。 + +它是一个对已注册的`Controller`有一个名为`controller`的getter的`const Stateless`的Widget,仅此而已。 + +```dart + class AwesomeController extends GetxController { + final String title = 'My Awesome View'; + } + + // 一定要记住传递你用来注册控制器的`Type`! + class AwesomeView extends GetView { + @override + Widget build(BuildContext context) { + return Container( + padding: EdgeInsets.all(20), + child: Text( controller.title ), // 只需调用 "controller.something"。 + ); + } + } +``` + +#### GetWidget + +大多数人都不知道这个Widget,或者完全搞不清它的用法。 +这个用例非常少见且特殊:它 "缓存 "了一个Controller,由于_cache_,不能成为一个 "const Stateless"(因为_cache_,所以不能成为一个`const Stateless`)。 + +> 那么,什么时候你需要 "缓存 "一个Controller? + +如果你使用了**GetX**的另一个 "不常见 "的特性 `Get.create()` + +`Get.create(()=>Controller())` 会在每次调用时生成一个新的`Controller` +`Get.find()` + +你可以用它来保存Todo项目的列表,如果小组件被 "重建",它将保持相同的控制器实例。 + +#### GetxService + +这个类就像一个 "GetxController",它共享相同的生命周期("onInit()"、"onReady()"、"onClose()")。 +但里面没有 "逻辑"。它只是通知**GetX**的依赖注入系统,这个子类**不能**从内存中删除。 + +所以这对保持你的 "服务 "总是可以被`Get.find()`获取到并保持运行是超级有用的。比如 +`ApiService`,`StorageService`,`CacheService`。 + +```dart +Future main() async { + await initServices(); /// 等待服务初始化. + runApp(SomeApp()); +} + +/// 在你运行Flutter应用之前,让你的服务初始化是一个明智之举。 +////因为你可以控制执行流程(也许你需要加载一些主题配置,apiKey,由用户自定义的语言等,所以在运行ApiService之前加载SettingService。 +///所以GetMaterialApp()不需要重建,可以直接取值。 +void initServices() async { + print('starting services ...'); + ///这里是你放get_storage、hive、shared_pref初始化的地方。 + ///或者moor连接,或者其他什么异步的东西。 + await Get.putAsync(() => DbService().init()); + await Get.putAsync(SettingsService()).init(); + print('All services started...'); +} + +class DbService extends GetxService { + Future init() async { + print('$runtimeType delays 2 sec'); + await 2.delay(); + print('$runtimeType ready!'); + return this; + } +} + +class SettingsService extends GetxService { + void init() async { + print('$runtimeType delays 1 sec'); + await 1.delay(); + print('$runtimeType ready!'); + } +} + +``` + +实际删除一个`GetxService`的唯一方法是使用`Get.reset()`,它就像"热重启 "你的应用程序。 + +所以如果你需要在你的应用程序的生命周期内对一个类实例进行绝对的持久化,请使用`GetxService`。 + +# 从2.0开始的兼容性变化 + +1- Rx类型。 + +| Before | After | +| ------- | ---------- | +| StringX | `RxString` | +| IntX | `RxInt` | +| MapX | `RxMap` | +| ListX | `RxList` | +| NumX | `RxNum` | +| DoubleX | `RxDouble` | + +现在RxController和GetBuilder已经合并了,你不再需要记住你要用哪个控制器,只要用GetxController就可以了,它可以用于简单的状态管理,也可以用于响应式。 + +2- 别名路由 +之前: + +```dart +GetMaterialApp( + namedRoutes: { + '/': GetRoute(page: Home()), + } +) +``` + +现在: + +```dart +GetMaterialApp( + getPages: [ + GetPage(name: '/', page: () => Home()), + ] +) +``` + +为什么要做这样的改变? +通常情况下,可能需要通过一个参数,或者一个登录令牌来决定显示哪个页面。 +将页面插入到一个函数中,大大降低了RAM的消耗,因为自从应用程序启动后,路由将不会在内存中分配。 + +```dart + +GetStorage box = GetStorage(); + +GetMaterialApp( + getPages: [ + GetPage(name: '/', page:(){ + return box.hasData('token') ? Home() : Login(); + }) + ] +) +``` + +# 为什么选择Getx? + +1- Flutter更新后,很多时候,你的很多包都会坏掉。有时会发生编译错误,经常出现的错误,至今仍没有答案,开发者需要知道错误的来源,跟踪错误,才会尝试在相应的仓库中开一个问题,并看到其问题的解决。Get集中了开发的主要资源(状态、依赖和路由管理),让你可以在pubspec中添加一个包,然后开始工作。Flutter更新后,你唯一需要做的就是更新Get依赖,然后开始工作。Get还可以解决兼容性问题。有多少次,一个包的版本与另一个包的版本不兼容,因为一个包在一个版本中使用了依赖,而另一个包在另一个版本中使用了依赖?使用Get也不用担心这个问题,因为所有的东西都在同一个包里,是完全兼容的。 + +2- Flutter很简单,Flutter很不可思议,但是Flutter仍然有一些代码,对于大多数开发者来说可能是不需要的,比如`Navigator.of(context).push (context, builder [...]`,你写了8行代码仅仅只为了调用一个路由。而使用Get只需`Get.to(Home())`就完成了,你将进入下一个页面。动态网页URL是目前Flutter中非常痛苦的一件事,而用GetX则非常简单。在Flutter中管理状态,管理依赖关系也产生了很多讨论,因为pub中的模式有上百种。但是没有什么比在你的变量末尾加一个".obs "更简单的了,把你的widget放在一个Obx里面,就这样,所有对这个变量的更新都会在页面上自动更新。 + +3-轻松,不用担心性能。Flutter的性能已经很惊人了,但是想象一下,你使用一个状态管理器,和一个定位器来分布你的blocs/stores/controllers/等等类。当你不需要那个依赖的时候,你必须手动调用排除它。但是,你有没有想过简单地使用你的控制器,当它不再被任何人使用时,它会简单地从内存中删除?这就是GetX所做的。有了SmartManagement,所有不被使用的东西都会从内存中删除,除了编程,您不应该担心任何事情。GetX将保证您消耗的是最低限度的必要资源,甚至没有为此创建一个逻辑。 + +4-实际解耦。你可能听说过 "将界面与业务逻辑分离 "的概念。这并不是BLoC、MVC、MVVM的特例,市面上的其他标准都有这个概念。但是,由于使用了上下文(context),这个概念在Flutter中往往可以得到缓解。 +如果你需要上下文来寻找InheritedWidget,你需要在界面中找到它,或者通过参数传递上下文。我特别觉得这种解决方案非常丑陋,要在团队中工作,我们总会对View的业务逻辑产生依赖。Getx与标准的做法不一样,虽然它并没有完全禁止使用StatefulWidgets、InitState等,但它总有类似的方法,可以更干净。控制器是有生命周期的,例如当你需要进行APIREST请求时,你不依赖于界面中的任何东西。你可以使用onInit来启动http调用,当数据到达时,变量将被填充。由于GetX是完全响应式的(真的,在流下工作),一旦项目被填充,所有使用该变量的widgets将在界面中自动更新。这使得具有UI专业知识的人只需要处理widget,除了用户事件(比如点击按钮)之外,不需要向业务逻辑发送任何东西,而处理业务逻辑的人将可以自由地单独创建和测试业务逻辑。 + +这个库会一直更新和实现新的功能。欢迎提供PR,并为其做出贡献。 + +# 社区 + +## 社区渠道 + +GetX拥有一个非常活跃且乐于助人的社区。如果你有问题,或者想得到关于这个框架使用的任何帮助,请加入我们的社区频道。这个资源库是提问、申请资源的专用库,欢迎随时加入GetX社区。 + +| **Slack** | **Discord** | **Telegram** | +| :-------------------------------------------------------------------------------------------------------------------------- | :-------------------------------------------------------------------------------------------------------------------------- | :-------------------------------------------------------------------------------------------------------------------- | +| [![Get on Slack](https://img.shields.io/badge/slack-join-orange.svg)](https://communityinviter.com/apps/getxworkspace/getx) | [![Discord Shield](https://img.shields.io/discord/722900883784073290.svg?logo=discord)](https://discord.com/invite/9Hpt99N) | [![Telegram](https://img.shields.io/badge/chat-on%20Telegram-blue.svg)](https://t.me/joinchat/PhdbJRmsZNpAqSLJL6bH7g) | + +## 如何做贡献 + +_想为项目做贡献吗?我们将自豪地强调你是我们的合作者之一。以下是您可以做出贡献并使Get(和Flutter)变得更好的几点。 + +- 帮助将readme翻译成其他语言。 +- 为readme添加文档(Get的很多功能还没有被记录下来)。 +- 撰写文章或制作视频,教大家如何使用Get(它们将被记录到readme和未来的Wiki中)。 +- 提供代码/测试的PR。 +- 包括新功能。 + +欢迎任何贡献 + +## 文章和视频 + +- [Dynamic Themes in 3 lines using GetX™](https://medium.com/swlh/flutter-dynamic-themes-in-3-lines-c3b375f292e3) - Tutorial by [Rod Brown](https://github.com/RodBr). +- [Complete GetX™ Navigation](https://www.youtube.com/watch?v=RaqPIoJSTtI) - Route management video by Amateur Coder. +- [Complete GetX State Management](https://www.youtube.com/watch?v=CNpXbeI_slw) - State management video by Amateur Coder. +- [GetX™ Other Features](https://youtu.be/ttQtlX_Q0eU) - utils, storage, bindings and other features video by Amateur Coder. +- [Firestore User with GetX | Todo App](https://www.youtube.com/watch?v=BiV0DcXgk58) - Video by Amateur Coder. +- [Firebase Auth with GetX | Todo App](https://www.youtube.com/watch?v=-H-T_BSgfOE) - Video by Amateur Coder. +- [The Flutter GetX™ Ecosystem ~ State Management](https://medium.com/flutter-community/the-flutter-getx-ecosystem-state-management-881c7235511d) - State management by [Aachman Garg](https://github.com/imaachman). +- [GetX, the all-in-one Flutter package](https://www.youtube.com/watch?v=IYQgtu9TM74) - A brief tutorial covering State Management and Navigation by Thad Carnevalli. +- [Build a To-do List App from scratch using Flutter and GetX](https://www.youtube.com/watch?v=EcnqFasHf18) - UI + State Management + Storage video by Thad Carnevalli. +- [GetX Flutter Firebase Auth Example](https://medium.com/@jeffmcmorris/getx-flutter-firebase-auth-example-b383c1dd1de2) - Article by Jeff McMorris. +- [Flutter State Management with GetX – Complete App](https://www.appwithflutter.com/flutter-state-management-with-getx/) - by App With Flutter. +- [Flutter Routing with Animation using Get Package](https://www.appwithflutter.com/flutter-routing-using-get-package/) - by App With Flutter. +- [Flutter GetX use --- simple charm!](https://github.com/CNAD666/getx_template/blob/main/docs/Use%20of%20Flutter%20GetX---simple%20charm!.md) - CNAD666 + - [Flutter GetX使用---简洁的魅力!](https://juejin.cn/post/6924104248275763208) + diff --git a/siro_rider/packages/get/_config.yml b/siro_rider/packages/get/_config.yml new file mode 100644 index 0000000..c419263 --- /dev/null +++ b/siro_rider/packages/get/_config.yml @@ -0,0 +1 @@ +theme: jekyll-theme-cayman \ No newline at end of file diff --git a/siro_rider/packages/get/analysis_options.yaml b/siro_rider/packages/get/analysis_options.yaml new file mode 100644 index 0000000..60e2162 --- /dev/null +++ b/siro_rider/packages/get/analysis_options.yaml @@ -0,0 +1,90 @@ +# Include option is buggy: +# https://github.com/flutter/flutter/issues/62591 +# In case the include issue gets fixed, lines below INCLUDE_FIX +# can be removed +# include: package:flutter_lints/flutter.yaml + +# include: package:effective_dart/analysis_options.1.2.0.yaml +analyzer: + strong-mode: + implicit-casts: false +linter: + rules: + await_only_futures: true + # This one is desirable, but that's a lot of work for now + public_member_api_docs: false + # Desirable, but would be breaking changes: + avoid_positional_boolean_parameters: false + constant_identifier_names: false + include_file_not_found: false + + # INCLUDE_FIX (copy of effective dart 1.2.0) + # STYLE + camel_case_types: true + close_sinks: true + unnecessary_statements: true + camel_case_extensions: true + library_names: true + file_names: true + library_prefixes: true + non_constant_identifier_names: true + directives_ordering: true + lines_longer_than_80_chars: true # avoid + curly_braces_in_flow_control_structures: true + + # DOCUMENTATION + slash_for_doc_comments: true + package_api_docs: true # prefer + #- comment_references # Unused because https://github.com/dart-lang/sdk/issues/36974 + + # USAGE + implementation_imports: true + avoid_relative_lib_imports: true # prefer + prefer_relative_imports: true # prefer + prefer_adjacent_string_concatenation: true + prefer_interpolation_to_compose_strings: true # prefer + unnecessary_brace_in_string_interps: true # avoid + prefer_collection_literals: true + avoid_function_literals_in_foreach_calls: true # avoid + prefer_iterable_whereType: true + prefer_function_declarations_over_variables: true + unnecessary_lambdas: true + prefer_equal_for_default_values: true + avoid_init_to_null: true + unnecessary_getters_setters: true + annotate_overrides: true + #- unnecessary_getters # prefer # Disabled pending fix: https://github.com/dart-lang/linter/issues/23 + #- prefer_expression_function_bodies # consider + unnecessary_this: true + prefer_initializing_formals: true + type_init_formals: true + empty_constructor_bodies: true + unnecessary_new: true + unnecessary_const: true + avoid_catches_without_on_clauses: true # avoid + avoid_catching_errors: true + use_rethrow_when_possible: true + unrelated_type_equality_checks: true + + # DESIGN + use_to_and_as_if_applicable: true # prefer + one_member_abstracts: true # avoid + avoid_classes_with_only_static_members: true # avoid + prefer_mixin: true + prefer_final_fields: true # prefer + use_setters_to_change_properties: true + avoid_setters_without_getters: true + avoid_returning_null: true # avoid + avoid_returning_this: true # avoid + type_annotate_public_apis: true # prefer + #- prefer_typing_uninitialized_variables # consider + omit_local_variable_types: true # avoid + avoid_types_on_closure_parameters: true # avoid + avoid_return_types_on_setters: true # avoid + prefer_generic_function_type_aliases: true + avoid_private_typedef_functions: true # prefer + #- use_function_type_syntax_for_parameters # consider + hash_and_equals: true + avoid_equals_and_hash_code_on_mutable_classes: true # avoid + avoid_null_checks_in_equality_operators: true + diff --git a/siro_rider/packages/get/documentation/ar_EG/dependency_management.md b/siro_rider/packages/get/documentation/ar_EG/dependency_management.md new file mode 100644 index 0000000..6cfa95f --- /dev/null +++ b/siro_rider/packages/get/documentation/ar_EG/dependency_management.md @@ -0,0 +1,410 @@ +# Dependency Management +- [Dependency Management](#dependency-management) + - [Instancing methods](#instancing-methods) + - [Get.put()](#getput) + - [Get.lazyPut](#getlazyput) + - [Get.putAsync](#getputasync) + - [Get.create](#getcreate) + - [Using instantiated methods/classes](#using-instantiated-methodsclasses) + - [Specifying an alternate instance](#specifying-an-alternate-instance) + - [Differences between methods](#differences-between-methods) + - [Bindings](#bindings) + - [Bindings class](#bindings-class) + - [BindingsBuilder](#bindingsbuilder) + - [SmartManagement](#smartmanagement) + - [How to change](#how-to-change) + - [SmartManagement.full](#smartmanagementfull) + - [SmartManagement.onlyBuilders](#smartmanagementonlybuilders) + - [SmartManagement.keepFactory](#smartmanagementkeepfactory) + - [How bindings work under the hood](#how-bindings-work-under-the-hood) + - [Notes](#notes) + +Get has a simple and powerful dependency manager that allows you to retrieve the same class as your Bloc or Controller with just 1 lines of code, no Provider context, no inheritedWidget: + +```dart +Controller controller = Get.put(Controller()); // Rather Controller controller = Controller(); +``` + +Instead of instantiating your class within the class you are using, you are instantiating it within the Get instance, which will make it available throughout your App. +So you can use your controller (or Bloc class) normally + +- Note: If you are using Get's State Manager, pay more attention to the [Bindings](#bindings) api, which will make easier to connect your view to your controller. +- Note²: Get dependency management is decloupled from other parts of the package, so if for example your app is already using a state manager (any one, it doesn't matter), you don't need to change that, you can use this dependency injection manager with no problems at all + +## Instancing methods +The methods and it's configurable parameters are: + +### Get.put() + +The most common way of inserting a dependency. Good for the controllers of your views for example. + +```dart +Get.put(SomeClass()); +Get.put(LoginController(), permanent: true); +Get.put(ListItemController, tag: "some unique string"); +``` + +This is all options you can set when using put: +```dart +Get.put( + // mandatory: the class that you want to get to save, like a controller or anything + // note: "S" means that it can be a class of any type + S dependency + + // optional: this is for when you want multiple classess that are of the same type + // since you normally get a class by using Get.find(), + // you need to use tag to tell which instance you need + // must be unique string + String tag, + + // optional: by default, get will dispose instances after they are not used anymore (example, + // the controller of a view that is closed), but you might need that the instance + // to be kept there throughout the entire app, like an instance of sharedPreferences or something + // so you use this + // defaults to false + bool permanent = false, + + // optional: allows you after using an abstract class in a test, replace it with another one and follow the test. + // defaults to false + bool overrideAbstract = false, + + // optional: allows you to create the dependency using function instead of the dependency itself. + // this one is not commonly used + InstanceBuilderCallback builder, +) +``` + +### Get.lazyPut +It is possible to lazyLoad a dependency so that it will be instantiated only when is used. Very useful for computational expensive classes or if you want to instantiate several classes in just one place (like in a Bindings class) and you know you will not gonna use that class at that time. + +```dart +/// ApiMock will only be called when someone uses Get.find for the first time +Get.lazyPut(() => ApiMock()); + +Get.lazyPut( + () { + // ... some logic if needed + return FirebaseAuth(); + }, + tag: Math.random().toString(), + fenix: true +) + +Get.lazyPut( () => Controller() ) +``` + +This is all options you can set when using lazyPut: +```dart +Get.lazyPut( + // mandatory: a method that will be executed when your class is called for the first time + InstanceBuilderCallback builder, + + // optional: same as Get.put(), it is used for when you want multiple different instance of a same class + // must be unique + String tag, + + // optional: It is similar to "permanent", the difference is that the instance is discarded when + // is not being used, but when it's use is needed again, Get will recreate the instance + // just the same as "SmartManagement.keepFactory" in the bindings api + // defaults to false + bool fenix = false + +) +``` + +### Get.putAsync +If you want to register an asynchronous instance, you can use `Get.putAsync`: + +```dart +Get.putAsync(() async { + final prefs = await SharedPreferences.getInstance(); + await prefs.setInt('counter', 12345); + return prefs; +}); + +Get.putAsync( () async => await YourAsyncClass() ) +``` + +This is all options you can set when using putAsync: +```dart +Get.putAsync( + + // mandatory: an async method that will be executed to instantiate your class + AsyncInstanceBuilderCallback builder, + + // optional: same as Get.put(), it is used for when you want multiple different instance of a same class + // must be unique + String tag, + + // optional: same as in Get.put(), used when you need to maintain that instance alive in the entire app + // defaults to false + bool permanent = false +) +``` + +### Get.create + +This one is tricky. A detailed explanation of what this is and the differences between the other one can be found on [Differences between methods:](#differences-between-methods) section + +```dart +Get.Create(() => SomeClass()); +Get.Create(() => LoginController()); +``` + +This is all options you can set when using create: + +```dart +Get.create( + // required: a function that returns a class that will be "fabricated" every + // time `Get.find()` is called + // Example: Get.create(() => YourClass()) + FcBuilderFunc builder, + + // optional: just like Get.put(), but it is used when you need multiple instances + // of a of a same class + // Useful in case you have a list that each item need it's own controller + // needs to be a unique string. Just change from tag to name + String name, + + // optional: just like int`Get.put()`, it is for when you need to keep the + // instance alive thoughout the entire app. The difference is in Get.create + // permanent is true by default + bool permanent = true +``` + +## Using instantiated methods/classes + +Imagine that you have navigated through numerous routes, and you need a data that was left behind in your controller, you would need a state manager combined with the Provider or Get_it, correct? Not with Get. You just need to ask Get to "find" for your controller, you don't need any additional dependencies: + +```dart +final controller = Get.find(); +// OR +Controller controller = Get.find(); + +// Yes, it looks like Magic, Get will find your controller, and will deliver it to you. +// You can have 1 million controllers instantiated, Get will always give you the right controller. +``` + +And then you will be able to recover your controller data that was obtained back there: + +```dart +Text(controller.textFromApi); +``` + +Since the returned value is a normal class, you can do anything you want: +```dart +int count = Get.find().getInt('counter'); +print(count); // out: 12345 +``` + +To remove an instance of Get: + +```dart +Get.delete(); //usually you don't need to do this because GetX already delete unused controllers +``` + +## Specifying an alternate instance + +A currently inserted instance can be replaced with a similar or extended class instance by using the `replace` or `lazyReplace` method. This can then be retrieved by using the original class. + +```dart +abstract class BaseClass {} +class ParentClass extends BaseClass {} + +class ChildClass extends ParentClass { + bool isChild = true; +} + + +Get.put(ParentClass()); + +Get.replace(ChildClass()); + +final instance = Get.find(); +print(instance is ChildClass); //true + + +class OtherClass extends BaseClass {} +Get.lazyReplace(() => OtherClass()); + +final instance = Get.find(); +print(instance is ChildClass); // false +print(instance is OtherClass); //true +``` + +## Differences between methods + +First, let's of the `fenix` of Get.lazyPut and the `permanent` of the other methods. + +The fundamental difference between `permanent` and `fenix` is how you want to store your instances. + +Reinforcing: by default, GetX deletes instances when they are not in use. +It means that: If screen 1 has controller 1 and screen 2 has controller 2 and you remove the first route from stack, (like if you use `Get.off()` or `Get.offNamed()`) the controller 1 lost its use so it will be erased. + +But if you want to opt for using `permanent:true`, then the controller will not be lost in this transition - which is very useful for services that you want to keep alive throughout the entire application. + +`fenix` in the other hand is for services that you don't worry in losing between screen changes, but when you need that service, you expect that it is alive. So basically, it will dispose the unused controller/service/class, but when you need it, it will "recreate from the ashes" a new instance. + +Proceeding with the differences between methods: + +- Get.put and Get.putAsync follows the same creation order, with the difference that the second uses an asynchronous method: those two methods creates and initializes the instance. That one is inserted directly in the memory, using the internal method `insert` with the parameters `permanent: false` and `isSingleton: true` (this isSingleton parameter only purpose is to tell if it is to use the dependency on `dependency` or if it is to use the dependency on `FcBuilderFunc`). After that, `Get.find()` is called that immediately initialize the instances that are on memory. + +- Get.create: As the name implies, it will "create" your dependency! Similar to `Get.put()`, it also calls the internal method `insert` to instancing. But `permanent` became true and `isSingleton` became false (since we are "creating" our dependency, there is no way for it to be a singleton instace, that's why is false). And because it has `permanent: true`, we have by default the benefit of not losing it between screens! Also, `Get.find()` is not called immediately, it wait to be used in the screen to be called. It is created this way to make use of the parameter `permanent`, since then, worth noticing, `Get.create()` was made with the goal of create not shared instances, but don't get disposed, like for example a button in a listView, that you want a unique instance for that list - because of that, Get.create must be used together with GetWidget. + +- Get.lazyPut: As the name implies, it is a lazy proccess. The instance is create, but it is not called to be used immediately, it remains waiting to be called. Contrary to the other methods, `insert` is not called here. Instead, the instance is inserted in another part of the memory, a part responsible to tell if the instance can be recreated or not, let's call it "factory". If we want to create something to be used later, it will not be mix with things been used right now. And here is where `fenix` magic enters: if you opt to leaving `fenix: false`, and your `smartManagement` are not `keepFactory`, then when using `Get.find` the instance will change the place in the memory from the "factory" to common instance memory area. Right after that, by default it is removed from the "factory". Now, if you opt for `fenix: true`, the instance continues to exist in this dedicated part, even going to the common area, to be called again in the future. + +## Bindings + +One of the great differentials of this package, perhaps, is the possibility of full integration of the routes, state manager and dependency manager. +When a route is removed from the Stack, all controllers, variables, and instances of objects related to it are removed from memory. If you are using streams or timers, they will be closed automatically, and you don't have to worry about any of that. +In version 2.10 Get completely implemented the Bindings API. +Now you no longer need to use the init method. You don't even have to type your controllers if you don't want to. You can start your controllers and services in the appropriate place for that. +The Binding class is a class that will decouple dependency injection, while "binding" routes to the state manager and dependency manager. +This allows Get to know which screen is being displayed when a particular controller is used and to know where and how to dispose of it. +In addition, the Binding class will allow you to have SmartManager configuration control. You can configure the dependencies to be arranged when removing a route from the stack, or when the widget that used it is laid out, or neither. You will have intelligent dependency management working for you, but even so, you can configure it as you wish. + +### Bindings class + +- Create a class and implements Binding + +```dart +class HomeBinding implements Bindings {} +``` + +Your IDE will automatically ask you to override the "dependencies" method, and you just need to click on the lamp, override the method, and insert all the classes you are going to use on that route: + +```dart +class HomeBinding implements Bindings { + @override + void dependencies() { + Get.lazyPut(() => HomeController()); + Get.put(()=> Api()); + } +} + +class DetailsBinding implements Bindings { + @override + void dependencies() { + Get.lazyPut(() => DetailsController()); + } +} +``` + +Now you just need to inform your route, that you will use that binding to make the connection between route manager, dependencies and states. + +- Using named routes: + +```dart +getPages: [ + GetPage( + name: '/', + page: () => HomeView(), + binding: HomeBinding(), + ), + GetPage( + name: '/details', + page: () => DetailsView(), + binding: DetailsBinding(), + ), +]; +``` + +- Using normal routes: + +```dart +Get.to(Home(), binding: HomeBinding()); +Get.to(DetailsView(), binding: DetailsBinding()) +``` + +There, you don't have to worry about memory management of your application anymore, Get will do it for you. + +The Binding class is called when a route is called, you can create an "initialBinding in your GetMaterialApp to insert all the dependencies that will be created. + +```dart +GetMaterialApp( + initialBinding: SampleBind(), + home: Home(), +); +``` + +### BindingsBuilder + +The default way of creating a binding is by creating a class that implements Bindings. +But alternatively, you can use `BindingsBuilder` callback so that you can simply use a function to instantiate whatever you desire. + +Example: + +```dart +getPages: [ + GetPage( + name: '/', + page: () => HomeView(), + binding: BindingsBuilder(() { + Get.lazyPut(() => ControllerX()); + Get.put(()=> Api()); + }), + ), + GetPage( + name: '/details', + page: () => DetailsView(), + binding: BindingsBuilder(() { + Get.lazyPut(() => DetailsController()); + }), + ), +]; +``` + +That way you can avoid to create one Binding class for each route making this even simpler. + +Both ways of doing work perfectly fine and we want you to use what most suit your tastes. + +### SmartManagement + +GetX by default disposes unused controllers from memory, even if a failure occurs and a widget that uses it is not properly disposed. +This is what is called the `full` mode of dependency management. +But if you want to change the way GetX controls the disposal of classes, you have `SmartManagement` class that you can set different behaviors. + +#### How to change + +If you want to change this config (which you usually don't need) this is the way: + +```dart +void main () { + runApp( + GetMaterialApp( + smartManagement: SmartManagement.onlyBuilders //here + home: Home(), + ) + ) +} +``` + +#### SmartManagement.full + +It is the default one. Dispose classes that are not being used and were not set to be permanent. In the majority of the cases you will want to keep this config untouched. If you new to GetX then don't change this. + +#### SmartManagement.onlyBuilders +With this option, only controllers started in `init:` or loaded into a Binding with `Get.lazyPut()` will be disposed. + +If you use `Get.put()` or `Get.putAsync()` or any other approach, SmartManagement will not have permissions to exclude this dependency. + +With the default behavior, even widgets instantiated with "Get.put" will be removed, unlike SmartManagement.onlyBuilders. + +#### SmartManagement.keepFactory + +Just like SmartManagement.full, it will remove it's dependencies when it's not being used anymore. However, it will keep their factory, which means it will recreate the dependency if you need that instance again. + +### How bindings work under the hood +Bindings creates transitory factories, which are created the moment you click to go to another screen, and will be destroyed as soon as the screen-changing animation happens. +This happens so fast that the analyzer will not even be able to register it. +When you navigate to this screen again, a new temporary factory will be called, so this is preferable to using SmartManagement.keepFactory, but if you don't want to create Bindings, or want to keep all your dependencies on the same Binding, it will certainly help you. +Factories take up little memory, they don't hold instances, but a function with the "shape" of that class you want. +This has a very low cost in memory, but since the purpose of this lib is to get the maximum performance possible using the minimum resources, Get removes even the factories by default. +Use whichever is most convenient for you. + +## Notes + +- DO NOT USE SmartManagement.keepFactory if you are using multiple Bindings. It was designed to be used without Bindings, or with a single Binding linked in the GetMaterialApp's initialBinding. + +- Using Bindings is completely optional, if you want you can use `Get.put()` and `Get.find()` on classes that use a given controller without any problem. +However, if you work with Services or any other abstraction, I recommend using Bindings for a better organization. diff --git a/siro_rider/packages/get/documentation/ar_EG/route_management.md b/siro_rider/packages/get/documentation/ar_EG/route_management.md new file mode 100644 index 0000000..00ad35a --- /dev/null +++ b/siro_rider/packages/get/documentation/ar_EG/route_management.md @@ -0,0 +1,569 @@ +- [Route Management](#route-management) + - [How to use](#how-to-use) + - [Navigation without named routes](#navigation-without-named-routes) + - [Navigation with named routes](#navigation-with-named-routes) + - [Send data to named Routes](#send-data-to-named-routes) + - [Dynamic urls links](#dynamic-urls-links) + - [Middleware](#middleware) + - [Navigation without context](#navigation-without-context) + - [SnackBars](#snackbars) + - [Dialogs](#dialogs) + - [BottomSheets](#bottomsheets) + - [Nested Navigation](#nested-navigation) + +# Route Management + +This is the complete explanation of all there is to Getx when the matter is route management. + +## How to use + +Add this to your pubspec.yaml file: + +```yaml +dependencies: + get: +``` + +If you are going to use routes/snackbars/dialogs/bottomsheets without context, or use the high-level Get APIs, you need to simply add "Get" before your MaterialApp, turning it into GetMaterialApp and enjoy! + +```dart +GetMaterialApp( // Before: MaterialApp( + home: MyHome(), +) +``` + +## Navigation without named routes + +To navigate to a new screen: + +```dart +Get.to(NextScreen()); +``` + +To close snackbars, dialogs, bottomsheets, or anything you would normally close with Navigator.pop(context); + +```dart +Get.back(); +``` + +To go to the next screen and no option to go back to the previous screen (for use in SplashScreens, login screens and etc.) + +```dart +Get.off(NextScreen()); +``` + +To go to the next screen and cancel all previous routes (useful in shopping carts, polls, and tests) + +```dart +Get.offAll(NextScreen()); +``` + +To navigate to the next route, and receive or update data as soon as you return from it: + +```dart +var data = await Get.to(Payment()); +``` + +on other screen, send a data for previous route: + +```dart +Get.back(result: 'success'); +``` + +And use it: + +ex: + +```dart +if(data == 'success') madeAnything(); +``` + +Don't you want to learn our syntax? +Just change the Navigator (uppercase) to navigator (lowercase), and you will have all the functions of the standard navigation, without having to use context +Example: + +```dart + +// Default Flutter navigator +Navigator.of(context).push( + context, + MaterialPageRoute( + builder: (BuildContext context) { + return HomePage(); + }, + ), +); + +// Get using Flutter syntax without needing context +navigator.push( + MaterialPageRoute( + builder: (_) { + return HomePage(); + }, + ), +); + +// Get syntax (It is much better, but you have the right to disagree) +Get.to(HomePage()); + + +``` + +## Navigation with named routes + +- If you prefer to navigate by namedRoutes, Get also supports this. + +To navigate to nextScreen + +```dart +Get.toNamed("/NextScreen"); +``` + +To navigate and remove the previous screen from the tree. + +```dart +Get.offNamed("/NextScreen"); +``` + +To navigate and remove all previous screens from the tree. + +```dart +Get.offAllNamed("/NextScreen"); +``` + +To define routes, use GetMaterialApp: + +```dart +void main() { + runApp( + GetMaterialApp( + initialRoute: '/', + getPages: [ + GetPage(name: '/', page: () => MyHomePage()), + GetPage(name: '/second', page: () => Second()), + GetPage( + name: '/third', + page: () => Third(), + transition: Transition.zoom + ), + ], + ) + ); +} +``` + +To handle navigation to non-defined routes (404 error), you can define an unknownRoute page in GetMaterialApp. + +```dart +void main() { + runApp( + GetMaterialApp( + unknownRoute: GetPage(name: '/notfound', page: () => UnknownRoutePage()), + initialRoute: '/', + getPages: [ + GetPage(name: '/', page: () => MyHomePage()), + GetPage(name: '/second', page: () => Second()), + ], + ) + ); +} +``` + +### Send data to named Routes + +Just send what you want for arguments. Get accepts anything here, whether it is a String, a Map, a List, or even a class instance. + +```dart +Get.toNamed("/NextScreen", arguments: 'Get is the best'); +``` + +on your class or controller: + +```dart +print(Get.arguments); +//print out: Get is the best +``` + +### Dynamic urls links + +Get offer advanced dynamic urls just like on the Web. Web developers have probably already wanted this feature on Flutter, and most likely have seen a package promise this feature and deliver a totally different syntax than a URL would have on web, but Get also solves that. + +```dart +Get.offAllNamed("/NextScreen?device=phone&id=354&name=Enzo"); +``` + +on your controller/bloc/stateful/stateless class: + +```dart +print(Get.parameters['id']); +// out: 354 +print(Get.parameters['name']); +// out: Enzo +``` + +You can also receive NamedParameters with Get easily: + +```dart +void main() { + runApp( + GetMaterialApp( + initialRoute: '/', + getPages: [ + GetPage( + name: '/', + page: () => MyHomePage(), + ), + GetPage( + name: '/profile/', + page: () => MyProfile(), + ), + //You can define a different page for routes with arguments, and another without arguments, but for that you must use the slash '/' on the route that will not receive arguments as above. + GetPage( + name: '/profile/:user', + page: () => UserProfile(), + ), + GetPage( + name: '/third', + page: () => Third(), + transition: Transition.cupertino + ), + ], + ) + ); +} +``` + +Send data on route name + +```dart +Get.toNamed("/profile/34954"); +``` + +On second screen take the data by parameter + +```dart +print(Get.parameters['user']); +// out: 34954 +``` + +or send multiple parameters like this + +```dart +Get.toNamed("/profile/34954?flag=true&country=italy"); +``` +or +```dart +var parameters = {"flag": "true","country": "italy",}; +Get.toNamed("/profile/34954", parameters: parameters); +``` + +On second screen take the data by parameters as usually + +```dart +print(Get.parameters['user']); +print(Get.parameters['flag']); +print(Get.parameters['country']); +// out: 34954 true italy +``` + + + +And now, all you need to do is use Get.toNamed() to navigate your named routes, without any context (you can call your routes directly from your BLoC or Controller class), and when your app is compiled to the web, your routes will appear in the url <3 + +### Middleware + +If you want to listen Get events to trigger actions, you can to use routingCallback to it + +```dart +GetMaterialApp( + routingCallback: (routing) { + if(routing.current == '/second'){ + openAds(); + } + } +) +``` + +If you are not using GetMaterialApp, you can use the manual API to attach Middleware observer. + +```dart +void main() { + runApp( + MaterialApp( + onGenerateRoute: Router.generateRoute, + initialRoute: "/", + navigatorKey: Get.key, + navigatorObservers: [ + GetObserver(MiddleWare.observer), // HERE !!! + ], + ), + ); +} +``` + +Create a MiddleWare class + +```dart +class MiddleWare { + static observer(Routing routing) { + /// You can listen in addition to the routes, the snackbars, dialogs and bottomsheets on each screen. + ///If you need to enter any of these 3 events directly here, + ///you must specify that the event is != Than you are trying to do. + if (routing.current == '/second' && !routing.isSnackbar) { + Get.snackbar("Hi", "You are on second route"); + } else if (routing.current =='/third'){ + print('last route called'); + } + } +} +``` + +Now, use Get on your code: + +```dart +class First extends StatelessWidget { + @override + Widget build(BuildContext context) { + return Scaffold( + appBar: AppBar( + leading: IconButton( + icon: Icon(Icons.add), + onPressed: () { + Get.snackbar("hi", "i am a modern snackbar"); + }, + ), + title: Text('First Route'), + ), + body: Center( + child: ElevatedButton( + child: Text('Open route'), + onPressed: () { + Get.toNamed("/second"); + }, + ), + ), + ); + } +} + +class Second extends StatelessWidget { + @override + Widget build(BuildContext context) { + return Scaffold( + appBar: AppBar( + leading: IconButton( + icon: Icon(Icons.add), + onPressed: () { + Get.snackbar("hi", "i am a modern snackbar"); + }, + ), + title: Text('second Route'), + ), + body: Center( + child: ElevatedButton( + child: Text('Open route'), + onPressed: () { + Get.toNamed("/third"); + }, + ), + ), + ); + } +} + +class Third extends StatelessWidget { + @override + Widget build(BuildContext context) { + return Scaffold( + appBar: AppBar( + title: Text("Third Route"), + ), + body: Center( + child: ElevatedButton( + onPressed: () { + Get.back(); + }, + child: Text('Go back!'), + ), + ), + ); + } +} +``` + +## Navigation without context + +### SnackBars + +To have a simple SnackBar with Flutter, you must get the context of Scaffold, or you must use a GlobalKey attached to your Scaffold + +```dart +final snackBar = SnackBar( + content: Text('Hi!'), + action: SnackBarAction( + label: 'I am a old and ugly snackbar :(', + onPressed: (){} + ), +); +// Find the Scaffold in the widget tree and use +// it to show a SnackBar. +Scaffold.of(context).showSnackBar(snackBar); +``` + +With Get: + +```dart +Get.snackbar('Hi', 'i am a modern snackbar'); +``` + +With Get, all you have to do is call your Get.snackbar from anywhere in your code or customize it however you want! + +```dart +Get.snackbar( + "Hey i'm a Get SnackBar!", // title + "It's unbelievable! I'm using SnackBar without context, without boilerplate, without Scaffold, it is something truly amazing!", // message + icon: Icon(Icons.alarm), + shouldIconPulse: true, + onTap:(){}, + barBlur: 20, + isDismissible: true, + duration: Duration(seconds: 3), +); + + + ////////// ALL FEATURES ////////// + // Color colorText, + // Duration duration, + // SnackPosition snackPosition, + // Widget titleText, + // Widget messageText, + // bool instantInit, + // Widget icon, + // bool shouldIconPulse, + // double maxWidth, + // EdgeInsets margin, + // EdgeInsets padding, + // double borderRadius, + // Color borderColor, + // double borderWidth, + // Color backgroundColor, + // Color leftBarIndicatorColor, + // List boxShadows, + // Gradient backgroundGradient, + // TextButton mainButton, + // OnTap onTap, + // bool isDismissible, + // bool showProgressIndicator, + // AnimationController progressIndicatorController, + // Color progressIndicatorBackgroundColor, + // Animation progressIndicatorValueColor, + // SnackStyle snackStyle, + // Curve forwardAnimationCurve, + // Curve reverseAnimationCurve, + // Duration animationDuration, + // double barBlur, + // double overlayBlur, + // Color overlayColor, + // Form userInputForm + /////////////////////////////////// +``` + +If you prefer the traditional snackbar, or want to customize it from scratch, including adding just one line (Get.snackbar makes use of a mandatory title and message), you can use +`Get.rawSnackbar();` which provides the RAW API on which Get.snackbar was built. + +### Dialogs + +To open dialog: + +```dart +Get.dialog(YourDialogWidget()); +``` + +To open default dialog: + +```dart +Get.defaultDialog( + onConfirm: () => print("Ok"), + middleText: "Dialog made in 3 lines of code" +); +``` + +You can also use Get.generalDialog instead of showGeneralDialog. + +For all other Flutter dialog widgets, including cupertinos, you can use Get.overlayContext instead of context, and open it anywhere in your code. +For widgets that don't use Overlay, you can use Get.context. +These two contexts will work in 99% of cases to replace the context of your UI, except for cases where inheritedWidget is used without a navigation context. + +### BottomSheets + +Get.bottomSheet is like showModalBottomSheet, but don't need of context. + +```dart +Get.bottomSheet( + Container( + child: Wrap( + children: [ + ListTile( + leading: Icon(Icons.music_note), + title: Text('Music'), + onTap: () {} + ), + ListTile( + leading: Icon(Icons.videocam), + title: Text('Video'), + onTap: () {}, + ), + ], + ), + ) +); +``` + +## Nested Navigation + +Get made Flutter's nested navigation even easier. +You don't need the context, and you will find your navigation stack by Id. + +- NOTE: Creating parallel navigation stacks can be dangerous. The ideal is not to use NestedNavigators, or to use sparingly. If your project requires it, go ahead, but keep in mind that keeping multiple navigation stacks in memory may not be a good idea for RAM consumption. + +See how simple it is: + +```dart +Navigator( + key: Get.nestedKey(1), // create a key by index + initialRoute: '/', + onGenerateRoute: (settings) { + if (settings.name == '/') { + return GetPageRoute( + page: () => Scaffold( + appBar: AppBar( + title: Text("Main"), + ), + body: Center( + child: TextButton( + color: Colors.blue, + onPressed: () { + Get.toNamed('/second', id:1); // navigate by your nested route by index + }, + child: Text("Go to second"), + ), + ), + ), + ); + } else if (settings.name == '/second') { + return GetPageRoute( + page: () => Center( + child: Scaffold( + appBar: AppBar( + title: Text("Main"), + ), + body: Center( + child: Text("second") + ), + ), + ), + ); + } + } +), +``` diff --git a/siro_rider/packages/get/documentation/ar_EG/state_management.md b/siro_rider/packages/get/documentation/ar_EG/state_management.md new file mode 100644 index 0000000..498ae9b --- /dev/null +++ b/siro_rider/packages/get/documentation/ar_EG/state_management.md @@ -0,0 +1,789 @@ +* [State Management](#state-management) + + [Reactive State Manager](#reactive-state-manager) + - [Advantages](#advantages) + - [Maximum performance:](#maximum-performance) + - [Declaring a reactive variable](#declaring-a-reactive-variable) + - [Having a reactive state, is easy.](#having-a-reactive-state-is-easy) + - [Using the values in the view](#using-the-values-in-the-view) + - [Conditions to rebuild](#conditions-to-rebuild) + - [Where .obs can be used](#where-obs-can-be-used) + - [Note about Lists](#note-about-lists) + - [Why i have to use .value](#why-i-have-to-use-value) + - [Obx()](#obx) + - [Workers](#workers) + + [Simple State Manager](#simple-state-manager) + - [Advantages](#advantages-1) + - [Usage](#usage) + - [How it handles controllers](#how-it-handles-controllers) + - [You won't need StatefulWidgets anymore](#you-wont-need-statefulwidgets-anymore) + - [Why it exists](#why-it-exists) + - [Other ways of using it](#other-ways-of-using-it) + - [Unique IDs](#unique-ids) + + [Mixing the two state managers](#mixing-the-two-state-managers) + + [GetBuilder vs GetX vs Obx vs MixinBuilder](#getbuilder-vs-getx-vs-obx-vs-mixinbuilder) + +# State Management + +GetX does not use Streams or ChangeNotifier like other state managers. Why? In addition to building applications for android, iOS, web, linux, macos and linux, with GetX you can build server applications with the same syntax as Flutter/GetX. In order to improve response time and reduce RAM consumption, we created GetValue and GetStream, which are low latency solutions that deliver a lot of performance, at a low operating cost. We use this base to build all of our resources, including state management. + +* _Complexity_: Some state managers are complex and have a lot of boilerplate. With GetX you don't have to define a class for each event, the code is highly clean and clear, and you do a lot more by writing less. Many people have given up on Flutter because of this topic, and they now finally have a stupidly simple solution for managing states. +* _No code generators_: You spend half your development time writing your application logic. Some state managers rely on code generators to have minimally readable code. Changing a variable and having to run build_runner can be unproductive, and often the waiting time after a flutter clean will be long, and you will have to drink a lot of coffee. + +With GetX everything is reactive, and nothing depends on code generators, increasing your productivity in all aspects of your development. + +* _It does not depend on context_: You probably already needed to send the context of your view to a controller, making the View's coupling with your business logic high. You have probably had to use a dependency for a place that has no context, and had to pass the context through various classes and functions. This just doesn't exist with GetX. You have access to your controllers from within your controllers without any context. You don't need to send the context by parameter for literally nothing. +* _Granular control_: most state managers are based on ChangeNotifier. ChangeNotifier will notify all widgets that depend on it when notifyListeners is called. If you have 40 widgets on one screen, which have a variable of your ChangeNotifier class, when you update one, all of them will be rebuilt. + +With GetX, even nested widgets are respected. If you have Obx watching your ListView, and another watching a checkbox inside the ListView, when changing the CheckBox value, only it will be updated, when changing the List value, only the ListView will be updated. + +* _It only reconstructs if its variable REALLY changes_: GetX has flow control, that means if you display a Text with 'Paola', if you change the observable variable to 'Paola' again, the widget will not be reconstructed. That's because GetX knows that 'Paola' is already being displayed in Text, and will not do unnecessary reconstructions. + +Most (if not all) current state managers will rebuild on the screen. + +## Reactive State Manager + +Reactive programming can alienate many people because it is said to be complicated. GetX turns reactive programming into something quite simple: + +* You won't need to create StreamControllers. +* You won't need to create a StreamBuilder for each variable +* You will not need to create a class for each state. +* You will not need to create a get for an initial value. + +Reactive programming with Get is as easy as using setState. + +Let's imagine that you have a name variable and want that every time you change it, all widgets that use it are automatically changed. + +This is your count variable: + +``` dart +var name = 'Jonatas Borges'; +``` + +To make it observable, you just need to add ".obs" to the end of it: + +``` dart +var name = 'Jonatas Borges'.obs; +``` + +That's all. It's *that* simple. + +From now on, we might refer to this reactive-".obs"(ervables) variables as _Rx_. + +What did we do under the hood? We created a `Stream` of `String` s, assigned the initial value `"Jonatas Borges"` , we notified all widgets that use `"Jonatas Borges"` that they now "belong" to this variable, and when the _Rx_ value changes, they will have to change as well. + +This is the **magic of GetX**, thanks to Dart's capabilities. + +But, as we know, a `Widget` can only be changed if it is inside a function, because static classes do not have the power to "auto-change". + +You will need to create a `StreamBuilder` , subscribe to this variable to listen for changes, and create a "cascade" of nested `StreamBuilder` if you want to change several variables in the same scope, right? + +No, you don't need a `StreamBuilder` , but you are right about static classes. + +Well, in the view, we usually have a lot of boilerplate when we want to change a specific Widget, that's the Flutter way. +With **GetX** you can also forget about this boilerplate code. + +`StreamBuilder( … )` ? `initialValue: …` ? `builder: …` ? Nope, you just need to place this variable inside an `Obx()` Widget. + +``` dart +Obx (() => Text (controller.name)); +``` + +_What do you need to memorize?_ Only `Obx(() =>` . + +You are just passing that Widget through an arrow-function into an `Obx()` (the "Observer" of the _Rx_). + +`Obx` is pretty smart, and will only change if the value of `controller.name` changes. + +If `name` is `"John"` , and you change it to `"John"` ( `name.value = "John"` ), as it's the same `value` as before, nothing will change on the screen, and `Obx` , to save resources, will simply ignore the new value and not rebuild the Widget. **Isn't that amazing?** + +> So, what if I have 5 _Rx_ (observable) variables within an `Obx` ? + +It will just update when **any** of them changes. + +> And if I have 30 variables in a class, when I update one, will it update **all** the variables that are in that class? + +Nope, just the **specific Widget** that uses that _Rx_ variable. + +So, **GetX** only updates the screen, when the _Rx_ variable changes it's value. + +``` + +final isOpen = false.obs; + +// NOTHING will happen... same value. +void onButtonTap() => isOpen.value=false; +``` + +### Advantages + +**GetX()** helps you when you need **granular** control over what's being updated. + +If you do not need `unique IDs` , because all your variables will be modified when you perform an action, then use `GetBuilder` , +because it's a Simple State Updater (in blocks, like `setState()` ), made in just a few lines of code. +It was made simple, to have the least CPU impact, and just to fulfill a single purpose (a _State_ rebuild) and spend the minimum resources possible. + +If you need a **powerful** State Manager, you can't go wrong with **GetX**. + +It doesn't work with variables, but __flows__, everything in it are `Streams` under the hood. + +You can use _rxDart_ in conjunction with it, because everything are `Streams`, +you can listen to the `event` of each "_Rx_ variable", +because everything in it are `Streams`. + +It is literally a _BLoC_ approach, easier than _MobX_, and without code generators or decorations. +You can turn **anything** into an _"Observable"_ with just a `.obs` . + +### Maximum performance: + +In addition to having a smart algorithm for minimal rebuilds, **GetX** uses comparators +to make sure the State has changed. + +If you experience any errors in your app, and send a duplicate change of State, +**GetX** will ensure it will not crash. + +With **GetX** the State only changes if the `value` change. +That's the main difference between **GetX**, and using _ `computed` from MobX_. +When joining two __observables__, and one changes; the listener of that _observable_ will change as well. + +With **GetX**, if you join two variables, `GetX()` (similar to `Observer()` ) will only rebuild if it implies a real change of State. + +### Declaring a reactive variable + +You have 3 ways to turn a variable into an "observable". + +1 - The first is using **`Rx{Type}`**. + +``` dart +// initial value is recommended, but not mandatory +final name = RxString(''); +final isLogged = RxBool(false); +final count = RxInt(0); +final balance = RxDouble(0.0); +final items = RxList([]); +final myMap = RxMap({}); +``` + +2 - The second is to use **`Rx`** and use Darts Generics, `Rx` + +``` dart +final name = Rx(''); +final isLogged = Rx(false); +final count = Rx(0); +final balance = Rx(0.0); +final number = Rx(0); +final items = Rx>([]); +final myMap = Rx>({}); + +// Custom classes - it can be any class, literally +final user = Rx(); +``` + +3 - The third, more practical, easier and preferred approach, just add **`.obs`** as a property of your `value` : + +``` dart +final name = ''.obs; +final isLogged = false.obs; +final count = 0.obs; +final balance = 0.0.obs; +final number = 0.obs; +final items = [].obs; +final myMap = {}.obs; + +// Custom classes - it can be any class, literally +final user = User().obs; +``` + +##### Having a reactive state, is easy. + +As we know, _Dart_ is now heading towards _null safety_. +To be prepared, from now on, you should always start your _Rx_ variables with an **initial value**. + +> Transforming a variable into an _observable_ + _initial value_ with **GetX** is the simplest, and most practical approach. + +You will literally add a " `.obs` " to the end of your variable, and **that’s it**, you’ve made it observable, +and its `.value` , well, will be the _initial value_). + +### Using the values in the view + +``` dart +// controller file +final count1 = 0.obs; +final count2 = 0.obs; +int get sum => count1.value + count2.value; +``` + +``` dart +// view file +GetX( + builder: (controller) { + print("count 1 rebuild"); + return Text('${controller.count1.value}'); + }, +), +GetX( + builder: (controller) { + print("count 2 rebuild"); + return Text('${controller.count2.value}'); + }, +), +GetX( + builder: (controller) { + print("count 3 rebuild"); + return Text('${controller.sum}'); + }, +), +``` + +If we increment `count1.value++` , it will print: + +* `count 1 rebuild` + +* `count 3 rebuild` + +because `count1` has a value of `1` , and `1 + 0 = 1` , changing the `sum` getter value. + +If we change `count2.value++` , it will print: + +* `count 2 rebuild` + +* `count 3 rebuild` + +because `count2.value` changed, and the result of the `sum` is now `2` . + +* NOTE: By default, the very first event will rebuild the widget, even if it is the same `value`. + + This behavior exists due to Boolean variables. + +Imagine you did this: + +``` dart +var isLogged = false.obs; +``` + +And then, you checked if a user is "logged in" to trigger an event in `ever` . + +``` dart +@override +onInit() async { + ever(isLogged, fireRoute); + isLogged.value = await Preferences.hasToken(); +} + +fireRoute(logged) { + if (logged) { + Get.off(Home()); + } else { + Get.off(Login()); + } +} +``` + +if `hasToken` was `false` , there would be no change to `isLogged` , so `ever()` would never be called. +To avoid this type of behavior, the first change to an _observable_ will always trigger an event, +even if it contains the same `.value` . + +You can remove this behavior if you want, using: + `isLogged.firstRebuild = false;` + +### Conditions to rebuild + +In addition, Get provides refined state control. You can condition an event (such as adding an object to a list), on a certain condition. + +``` dart +// First parameter: condition, must return true or false. +// Second parameter: the new value to apply if the condition is true. +list.addIf(item < limit, item); +``` + +Without decorations, without a code generator, without complications :smile: + +Do you know Flutter's counter app? Your Controller class might look like this: + +``` dart +class CountController extends GetxController { + final count = 0.obs; +} +``` + +With a simple: + +``` dart +controller.count.value++ +``` + +You could update the counter variable in your UI, regardless of where it is stored. + +### Where .obs can be used + +You can transform anything on obs. Here are two ways of doing it: + +* You can convert your class values to obs + +``` dart +class RxUser { + final name = "Camila".obs; + final age = 18.obs; +} +``` + +* or you can convert the entire class to be an observable + +``` dart +class User { + User({String name, int age}); + var name; + var age; +} + +// when instantianting: +final user = User(name: "Camila", age: 18).obs; +``` + +### Note about Lists + +Lists are completely observable as are the objects within it. That way, if you add a value to a list, it will automatically rebuild the widgets that use it. + +You also don't need to use ".value" with lists, the amazing dart api allowed us to remove that. +Unfortunaly primitive types like String and int cannot be extended, making the use of .value mandatory, but that won't be a problem if you work with gets and setters for these. + +``` dart +// On the controller +final String title = 'User Info:'.obs +final list = List().obs; + +// on the view +Text(controller.title.value), // String need to have .value in front of it +ListView.builder ( + itemCount: controller.list.length // lists don't need it +) +``` + +When you are making your own classes observable, there is a different way to update them: + +``` dart +// on the model file +// we are going to make the entire class observable instead of each attribute +class User() { + User({this.name = '', this.age = 0}); + String name; + int age; +} + +// on the controller file +final user = User().obs; +// when you need to update the user variable: +user.update( (user) { // this parameter is the class itself that you want to update +user.name = 'Jonny'; +user.age = 18; +}); +// an alternative way of update the user variable: +user(User(name: 'João', age: 35)); + +// on view: +Obx(()=> Text("Name ${user.value.name}: Age: ${user.value.age}")) +// you can also access the model values without the .value: +user().name; // notice that is the user variable, not the class (variable has lowercase u) +``` + +You don't have to work with sets if you don't want to. you can use the "assign 'and" assignAll "api. +The "assign" api will clear your list, and add a single object that you want to start there. +The "assignAll" api will clear the existing list and add any iterable objects that you inject into it. + +### Why i have to use .value + +We could remove the obligation to use 'value' to `String` and `int` with a simple decoration and code generator, but the purpose of this library is precisely avoid external dependencies. We want to offer an environment ready for programming, involving the essentials (management of routes, dependencies and states), in a simple, lightweight and performant way, without a need of an external package. + +You can literally add 3 letters to your pubspec (get) and a colon and start programming. All solutions included by default, from route management to state management, aim at ease, productivity and performance. + +The total weight of this library is less than that of a single state manager, even though it is a complete solution, and that is what you must understand. + +If you are bothered by `.value` , and like a code generator, MobX is a great alternative, and you can use it in conjunction with Get. For those who want to add a single dependency in pubspec and start programming without worrying about the version of a package being incompatible with another, or if the error of a state update is coming from the state manager or dependency, or still, do not want to worrying about the availability of controllers, whether literally "just programming", get is just perfect. + +If you have no problem with the MobX code generator, or have no problem with the BLoC boilerplate, you can simply use Get for routes, and forget that it has state manager. Get SEM and RSM were born out of necessity, my company had a project with more than 90 controllers, and the code generator simply took more than 30 minutes to complete its tasks after a Flutter Clean on a reasonably good machine, if your project it has 5, 10, 15 controllers, any state manager will supply you well. If you have an absurdly large project, and code generator is a problem for you, you have been awarded this solution. + +Obviously, if someone wants to contribute to the project and create a code generator, or something similar, I will link in this readme as an alternative, my need is not the need for all devs, but for now I say, there are good solutions that already do that, like MobX. + +### Obx() + +Typing in Get using Bindings is unnecessary. you can use the Obx widget instead of GetX which only receives the anonymous function that creates a widget. +Obviously, if you don't use a type, you will need to have an instance of your controller to use the variables, or use `Get.find()` .value or Controller.to.value to retrieve the value. + +### Workers + +Workers will assist you, triggering specific callbacks when an event occurs. + +``` dart +/// Called every time `count1` changes. +ever(count1, (_) => print("$_ has been changed")); + +/// Called only first time the variable $_ is changed +once(count1, (_) => print("$_ was changed once")); + +/// Anti DDos - Called every time the user stops typing for 1 second, for example. +debounce(count1, (_) => print("debouce$_"), time: Duration(seconds: 1)); + +/// Ignore all changes within 1 second. +interval(count1, (_) => print("interval $_"), time: Duration(seconds: 1)); +``` + +All workers (except `debounce` ) have a `condition` named parameter, which can be a `bool` or a callback that returns a `bool` . +This `condition` defines when the `callback` function executes. + +All workers returns a `Worker` instance, that you can use to cancel ( via `dispose()` ) the worker. + + +* **`ever`** + + is called every time the _Rx_ variable emits a new value. + +* **`everAll`** + + Much like `ever` , but it takes a `List` of _Rx_ values Called every time its variable is changed. That's it. + +* **`once`** + +'once' is called only the first time the variable has been changed. + +* **`debounce`** + +'debounce' is very useful in search functions, where you only want the API to be called when the user finishes typing. If the user types "Jonny", you will have 5 searches in the APIs, by the letter J, o, n, n, and y. With Get this does not happen, because you will have a "debounce" Worker that will only be triggered at the end of typing. + +* **`interval`** + +'interval' is different from the debouce. debouce if the user makes 1000 changes to a variable within 1 second, he will send only the last one after the stipulated timer (the default is 800 milliseconds). Interval will instead ignore all user actions for the stipulated period. If you send events for 1 minute, 1000 per second, debounce will only send you the last one, when the user stops strafing events. interval will deliver events every second, and if set to 3 seconds, it will deliver 20 events that minute. This is recommended to avoid abuse, in functions where the user can quickly click on something and get some advantage (imagine that the user can earn coins by clicking on something, if he clicked 300 times in the same minute, he would have 300 coins, using interval, you you can set a time frame for 3 seconds, and even then clicking 300 or a thousand times, the maximum he would get in 1 minute would be 20 coins, clicking 300 or 1 million times). The debounce is suitable for anti-DDos, for functions like search where each change to onChange would cause a query to your api. Debounce will wait for the user to stop typing the name, to make the request. If it were used in the coin scenario mentioned above, the user would only win 1 coin, because it is only executed, when the user "pauses" for the established time. + +* NOTE: Workers should always be used when starting a Controller or Class, so it should always be on onInit (recommended), Class constructor, or the initState of a StatefulWidget (this practice is not recommended in most cases, but it shouldn't have any side effects). + +## Simple State Manager + +Get has a state manager that is extremely light and easy, which does not use ChangeNotifier, will meet the need especially for those new to Flutter, and will not cause problems for large applications. + +GetBuilder is aimed precisely at multiple state control. Imagine that you added 30 products to a cart, you click delete one, at the same time that the list is updated, the price is updated and the badge in the shopping cart is updated to a smaller number. This type of approach makes GetBuilder killer, because it groups states and changes them all at once without any "computational logic" for that. GetBuilder was created with this type of situation in mind, since for ephemeral change of state, you can use setState and you would not need a state manager for this. + +That way, if you want an individual controller, you can assign IDs for that, or use GetX. This is up to you, remembering that the more "individual" widgets you have, the more the performance of GetX will stand out, while the performance of GetBuilder should be superior, when there is multiple change of state. + +### Advantages + +1. Update only the required widgets. + +2. Does not use changeNotifier, it is the state manager that uses less memory (close to 0mb). + +3. Forget StatefulWidget! With Get you will never need it. With the other state managers, you will probably have to use a StatefulWidget to get the instance of your Provider, BLoC, MobX Controller, etc. But have you ever stopped to think that your appBar, your scaffold, and most of the widgets that are in your class are stateless? So why save the state of an entire class, if you can only save the state of the Widget that is stateful? Get solves that, too. Create a Stateless class, make everything stateless. If you need to update a single component, wrap it with GetBuilder, and its state will be maintained. + +4. Organize your project for real! Controllers must not be in your UI, place your TextEditController, or any controller you use within your Controller class. + +5. Do you need to trigger an event to update a widget as soon as it is rendered? GetBuilder has the property "initState", just like StatefulWidget, and you can call events from your controller, directly from it, no more events being placed in your initState. + +6. Do you need to trigger an action like closing streams, timers and etc? GetBuilder also has the dispose property, where you can call events as soon as that widget is destroyed. + +7. Use streams only if necessary. You can use your StreamControllers inside your controller normally, and use StreamBuilder also normally, but remember, a stream reasonably consumes memory, reactive programming is beautiful, but you shouldn't abuse it. 30 streams open simultaneously can be worse than changeNotifier (and changeNotifier is very bad). + +8. Update widgets without spending ram for that. Get stores only the GetBuilder creator ID, and updates that GetBuilder when necessary. The memory consumption of the get ID storage in memory is very low even for thousands of GetBuilders. When you create a new GetBuilder, you are actually sharing the state of GetBuilder that has a creator ID. A new state is not created for each GetBuilder, which saves A LOT OF ram for large applications. Basically your application will be entirely Stateless, and the few Widgets that will be Stateful (within GetBuilder) will have a single state, and therefore updating one will update them all. The state is just one. + +9. Get is omniscient and in most cases it knows exactly the time to take a controller out of memory. You should not worry about when to dispose of a controller, Get knows the best time to do this. + +### Usage + +``` dart +// Create controller class and extends GetxController +class Controller extends GetxController { + int counter = 0; + void increment() { + counter++; + update(); // use update() to update counter variable on UI when increment be called + } +} +// On your Stateless/Stateful class, use GetBuilder to update Text when increment be called +GetBuilder( + init: Controller(), // INIT IT ONLY THE FIRST TIME + builder: (_) => Text( + '${_.counter}', + ), +) +//Initialize your controller only the first time. The second time you are using ReBuilder for the same controller, do not use it again. Your controller will be automatically removed from memory as soon as the widget that marked it as 'init' is deployed. You don't have to worry about that, Get will do it automatically, just make sure you don't start the same controller twice. +``` + +**Done!** + +* You have already learned how to manage states with Get. + +* Note: You may want a larger organization, and not use the init property. For that, you can create a class and extends Bindings class, and within it mention the controllers that will be created within that route. Controllers will not be created at that time, on the contrary, this is just a statement, so that the first time you use a Controller, Get will know where to look. Get will remain lazyLoad, and will continue to dispose Controllers when they are no longer needed. See the pub.dev example to see how it works. + +If you navigate many routes and need data that was in your previously used controller, you just need to use GetBuilder Again (with no init): + +``` dart +class OtherClass extends StatelessWidget { + @override + Widget build(BuildContext context) { + return Scaffold( + body: Center( + child: GetBuilder( + builder: (s) => Text('${s.counter}'), + ), + ), + ); + } + +``` + +If you need to use your controller in many other places, and outside of GetBuilder, just create a get in your controller and have it easily. (or use `Get.find()` ) + +``` dart +class Controller extends GetxController { + + /// You do not need that. I recommend using it just for ease of syntax. + /// with static method: Controller.to.increment(); + /// with no static method: Get.find().increment(); + /// There is no difference in performance, nor any side effect of using either syntax. Only one does not need the type, and the other the IDE will autocomplete it. + static Controller get to => Get.find(); // add this line + + int counter = 0; + void increment() { + counter++; + update(); + } +} +``` + +And then you can access your controller directly, that way: + +``` dart +FloatingActionButton( + onPressed: () { + Controller.to.increment(), + } // This is incredibly simple! + child: Text("${Controller.to.counter}"), +), +``` + +When you press FloatingActionButton, all widgets that are listening to the 'counter' variable will be updated automatically. + +### How it handles controllers + +Let's say we have this: + + `Class a => Class B (has controller X) => Class C (has controller X)` + +In class A the controller is not yet in memory, because you have not used it yet (Get is lazyLoad). In class B you used the controller, and it entered memory. In class C you used the same controller as in class B, Get will share the state of controller B with controller C, and the same controller is still in memory. If you close screen C and screen B, Get will automatically take controller X out of memory and free up resources, because Class a is not using the controller. If you navigate to B again, controller X will enter memory again, if instead of going to class C, you return to class A again, Get will take the controller out of memory in the same way. If class C didn't use the controller, and you took class B out of memory, no class would be using controller X and likewise it would be disposed of. The only exception that can mess with Get, is if you remove B from the route unexpectedly, and try to use the controller in C. In this case, the creator ID of the controller that was in B was deleted, and Get was programmed to remove it from memory every controller that has no creator ID. If you intend to do this, add the "autoRemove: false" flag to class B's GetBuilder and use adoptID = true; in class C's GetBuilder. + +### You won't need StatefulWidgets anymore + +Using StatefulWidgets means storing the state of entire screens unnecessarily, even because if you need to minimally rebuild a widget, you will embed it in a Consumer/Observer/BlocProvider/GetBuilder/GetX/Obx, which will be another StatefulWidget. +The StatefulWidget class is a class larger than StatelessWidget, which will allocate more RAM, and this may not make a significant difference between one or two classes, but it will most certainly do when you have 100 of them! +Unless you need to use a mixin, like TickerProviderStateMixin, it will be totally unnecessary to use a StatefulWidget with Get. + +You can call all methods of a StatefulWidget directly from a GetBuilder. +If you need to call initState() or dispose() method for example, you can call them directly; + +``` dart +GetBuilder( + initState: (_) => Controller.to.fetchApi(), + dispose: (_) => Controller.to.closeStreams(), + builder: (s) => Text('${s.username}'), +), +``` + +A much better approach than this is to use the onInit() and onClose() method directly from your controller. + +``` dart +@override +void onInit() { + fetchApi(); + super.onInit(); +} +``` + +* NOTE: If you want to start a method at the moment the controller is called for the first time, you DON'T NEED to use constructors for this, in fact, using a performance-oriented package like Get, this borders on bad practice, because it deviates from the logic in which the controllers are created or allocated (if you create an instance of this controller, the constructor will be called immediately, you will be populating a controller before it is even used, you are allocating memory without it being in use, this definitely hurts the principles of this library). The onInit() methods; and onClose(); were created for this, they will be called when the Controller is created, or used for the first time, depending on whether you are using Get.lazyPut or not. If you want, for example, to make a call to your API to populate data, you can forget about the old-fashioned method of initState/dispose, just start your call to the api in onInit, and if you need to execute any command like closing streams, use the onClose() for that. + +### Why it exists + +The purpose of this package is precisely to give you a complete solution for navigation of routes, management of dependencies and states, using the least possible dependencies, with a high degree of decoupling. Get engages all high and low level Flutter APIs within itself, to ensure that you work with the least possible coupling. We centralize everything in a single package, to ensure that you don't have any kind of coupling in your project. That way, you can put only widgets in your view, and leave the part of your team that works with the business logic free, to work with the business logic without depending on any element of the View. This provides a much cleaner working environment, so that part of your team works only with widgets, without worrying about sending data to your controller, and part of your team works only with the business logic in its breadth, without depending on no element of the view. + +So to simplify this: +You don't need to call methods in initState and send them by parameter to your controller, nor use your controller constructor for that, you have the onInit() method that is called at the right time for you to start your services. +You do not need to call the device, you have the onClose() method that will be called at the exact moment when your controller is no longer needed and will be removed from memory. That way, leave views for widgets only, refrain from any kind of business logic from it. + +Do not call a dispose method inside GetxController, it will not do anything, remember that the controller is not a Widget, you should not "dispose" it, and it will be automatically and intelligently removed from memory by Get. If you used any stream on it and want to close it, just insert it into the close method. Example: + +``` dart +class Controller extends GetxController { + StreamController user = StreamController(); + StreamController name = StreamController(); + + /// close stream = onClose method, not dispose. + @override + void onClose() { + user.close(); + name.close(); + super.onClose(); + } +} +``` + +Controller life cycle: + +* onInit() where it is created. +* onClose() where it is closed to make any changes in preparation for the delete method +* deleted: you do not have access to this API because it is literally removing the controller from memory. It is literally deleted, without leaving any trace. + +### Other ways of using it + +You can use Controller instance directly on GetBuilder value: + +``` dart +GetBuilder( + init: Controller(), + builder: (value) => Text( + '${value.counter}', //here + ), +), +``` + +You may also need an instance of your controller outside of your GetBuilder, and you can use these approaches to achieve this: + +``` dart +class Controller extends GetxController { + static Controller get to => Get.find(); +[...] +} +// on you view: +GetBuilder( + init: Controller(), // use it only first time on each controller + builder: (_) => Text( + '${Controller.to.counter}', //here + ) +), +``` + +or + +``` dart +class Controller extends GetxController { + // static Controller get to => Get.find(); // with no static get +[...] +} +// on stateful/stateless class +GetBuilder( + init: Controller(), // use it only first time on each controller + builder: (_) => Text( + '${Get.find().counter}', //here + ), +), +``` + +* You can use "non-canonical" approaches to do this. If you are using some other dependency manager, like get_it, modular, etc., and just want to deliver the controller instance, you can do this: + +``` dart +Controller controller = Controller(); +[...] +GetBuilder( + init: controller, //here + builder: (_) => Text( + '${controller.counter}', // here + ), +), + +``` + +### Unique IDs + +If you want to refine a widget's update control with GetBuilder, you can assign them unique IDs: + +``` dart +GetBuilder( + id: 'text' + init: Controller(), // use it only first time on each controller + builder: (_) => Text( + '${Get.find().counter}', //here + ), +), +``` + +And update it this form: + +``` dart +update(['text']); +``` + +You can also impose conditions for the update: + +``` dart +update(['text'], counter < 10); +``` + +GetX does this automatically and only reconstructs the widget that uses the exact variable that was changed, if you change a variable to the same as the previous one and that does not imply a change of state , GetX will not rebuild the widget to save memory and CPU cycles (3 is being displayed on the screen, and you change the variable to 3 again. In most state managers, this will cause a new rebuild, but with GetX the widget will only is rebuilt again, if in fact his state has changed). + +## Mixing the two state managers + +Some people opened a feature request, as they wanted to use only one type of reactive variable, and the other mechanics, and needed to insert an Obx into a GetBuilder for this. Thinking about it MixinBuilder was created. It allows both reactive changes by changing ".obs" variables, and mechanical updates via update(). However, of the 4 widgets he is the one that consumes the most resources, since in addition to having a Subscription to receive change events from his children, he subscribes to the update method of his controller. + +Extending GetxController is important, as they have life cycles, and can "start" and "end" events in their onInit() and onClose() methods. You can use any class for this, but I strongly recommend you use the GetxController class to place your variables, whether they are observable or not. + +## StateMixin + +Another way to handle your `UI` state is use the `StateMixin` . +To implement it, use the `with` to add the `StateMixin` +to your controller which allows a T model. + +``` dart +class Controller extends GetController with StateMixin{} +``` + +The `change()` method change the State whenever we want. +Just pass the data and the status in this way: + +```dart +change(data, status: RxStatus.success()); +``` + +RxStatus allow these status: + +``` dart +RxStatus.loading(); +RxStatus.success(); +RxStatus.empty(); +RxStatus.error('message'); +``` + +To represent it in the UI, use: + +```dart +class OtherClass extends GetView { + @override + Widget build(BuildContext context) { + return Scaffold( + + body: controller.obx( + (state)=>Text(state.name), + + // here you can put your custom loading indicator, but + // by default would be Center(child:CircularProgressIndicator()) + onLoading: CustomLoadingIndicator(), + onEmpty: Text('No data found'), + + // here also you can set your own error widget, but by + // default will be an Center(child:Text(error)) + onError: (error)=>Text(error), + ), + ); +} +``` + +## GetBuilder vs GetX vs Obx vs MixinBuilder + +In a decade working with programming I was able to learn some valuable lessons. + +My first contact with reactive programming was so "wow, this is incredible" and in fact reactive programming is incredible. +However, it is not suitable for all situations. Often all you need is to change the state of 2 or 3 widgets at the same time, or an ephemeral change of state, in which case reactive programming is not bad, but it is not appropriate. + +Reactive programming has a higher RAM consumption that can be compensated for by the individual workflow, which will ensure that only one widget is rebuilt and when necessary, but creating a list with 80 objects, each with several streams is not a good one idea. Open the dart inspect and check how much a StreamBuilder consumes, and you'll understand what I'm trying to tell you. + +With that in mind, I created the simple state manager. It is simple, and that is exactly what you should demand from it: updating state in blocks in a simple way, and in the most economical way. + +GetBuilder is very economical in RAM, and there is hardly a more economical approach than him (at least I can't imagine one, if it exists, please let us know). + +However, GetBuilder is still a mechanical state manager, you need to call update() just like you would need to call Provider's notifyListeners(). + +There are other situations where reactive programming is really interesting, and not working with it is the same as reinventing the wheel. With that in mind, GetX was created to provide everything that is most modern and advanced in a state manager. It updates only what is necessary and when necessary, if you have an error and send 300 state changes simultaneously, GetX will filter and update the screen only if the state actually changes. + +GetX is still more economical than any other reactive state manager, but it consumes a little more RAM than GetBuilder. Thinking about it and aiming to maximize the consumption of resources that Obx was created. Unlike GetX and GetBuilder, you will not be able to initialize a controller inside an Obx, it is just a Widget with a StreamSubscription that receives change events from your children, that's all. It is more economical than GetX, but loses to GetBuilder, which was to be expected, since it is reactive, and GetBuilder has the most simplistic approach that exists, of storing a widget's hashcode and its StateSetter. With Obx you don't need to write your controller type, and you can hear the change from multiple different controllers, but it needs to be initialized before, either using the example approach at the beginning of this readme, or using the Bindings class. diff --git a/siro_rider/packages/get/documentation/en_US/dependency_management.md b/siro_rider/packages/get/documentation/en_US/dependency_management.md new file mode 100644 index 0000000..c701ec1 --- /dev/null +++ b/siro_rider/packages/get/documentation/en_US/dependency_management.md @@ -0,0 +1,410 @@ +# Dependency Management +- [Dependency Management](#dependency-management) + - [Instancing methods](#instancing-methods) + - [Get.put()](#getput) + - [Get.lazyPut](#getlazyput) + - [Get.putAsync](#getputasync) + - [Get.create](#getcreate) + - [Using instantiated methods/classes](#using-instantiated-methodsclasses) + - [Specifying an alternate instance](#specifying-an-alternate-instance) + - [Differences between methods](#differences-between-methods) + - [Bindings](#bindings) + - [Bindings class](#bindings-class) + - [BindingsBuilder](#bindingsbuilder) + - [SmartManagement](#smartmanagement) + - [How to change](#how-to-change) + - [SmartManagement.full](#smartmanagementfull) + - [SmartManagement.onlyBuilder](#smartmanagementonlybuilder) + - [SmartManagement.keepFactory](#smartmanagementkeepfactory) + - [How bindings work under the hood](#how-bindings-work-under-the-hood) + - [Notes](#notes) + +Get has a simple and powerful dependency manager that allows you to retrieve the same class as your Bloc or Controller with just 1 lines of code, no Provider context, no inheritedWidget: + +```dart +Controller controller = Get.put(Controller()); // Rather Controller controller = Controller(); +``` + +Instead of instantiating your class within the class you are using, you are instantiating it within the Get instance, which will make it available throughout your App. +So you can use your controller (or Bloc class) normally + +- Note: If you are using Get's State Manager, pay more attention to the [Bindings](#bindings) api, which will make easier to connect your view to your controller. +- Note²: Get dependency management is decloupled from other parts of the package, so if for example your app is already using a state manager (any one, it doesn't matter), you don't need to change that, you can use this dependency injection manager with no problems at all + +## Instancing methods +The methods and it's configurable parameters are: + +### Get.put() + +The most common way of inserting a dependency. Good for the controllers of your views for example. + +```dart +Get.put(SomeClass()); +Get.put(LoginController(), permanent: true); +Get.put(ListItemController, tag: "some unique string"); +``` + +This is all options you can set when using put: +```dart +Get.put( + // mandatory: the class that you want to get to save, like a controller or anything + // note: "S" means that it can be a class of any type + S dependency + + // optional: this is for when you want multiple classess that are of the same type + // since you normally get a class by using Get.find(), + // you need to use tag to tell which instance you need + // must be unique string + String tag, + + // optional: by default, get will dispose instances after they are not used anymore (example, + // the controller of a view that is closed), but you might need that the instance + // to be kept there throughout the entire app, like an instance of sharedPreferences or something + // so you use this + // defaults to false + bool permanent = false, + + // optional: allows you after using an abstract class in a test, replace it with another one and follow the test. + // defaults to false + bool overrideAbstract = false, + + // optional: allows you to create the dependency using function instead of the dependency itself. + // this one is not commonly used + InstanceBuilderCallback builder, +) +``` + +### Get.lazyPut +It is possible to lazyLoad a dependency so that it will be instantiated only when is used. Very useful for computational expensive classes or if you want to instantiate several classes in just one place (like in a Bindings class) and you know you will not gonna use that class at that time. + +```dart +/// ApiMock will only be called when someone uses Get.find for the first time +Get.lazyPut(() => ApiMock()); + +Get.lazyPut( + () { + // ... some logic if needed + return FirebaseAuth(); + }, + tag: Math.random().toString(), + fenix: true +) + +Get.lazyPut( () => Controller() ) +``` + +This is all options you can set when using lazyPut: +```dart +Get.lazyPut( + // mandatory: a method that will be executed when your class is called for the first time + InstanceBuilderCallback builder, + + // optional: same as Get.put(), it is used for when you want multiple different instance of a same class + // must be unique + String tag, + + // optional: It is similar to "permanent", the difference is that the instance is discarded when + // is not being used, but when it's use is needed again, Get will recreate the instance + // just the same as "SmartManagement.keepFactory" in the bindings api + // defaults to false + bool fenix = false + +) +``` + +### Get.putAsync +If you want to register an asynchronous instance, you can use `Get.putAsync`: + +```dart +Get.putAsync(() async { + final prefs = await SharedPreferences.getInstance(); + await prefs.setInt('counter', 12345); + return prefs; +}); + +Get.putAsync( () async => await YourAsyncClass() ) +``` + +This is all options you can set when using putAsync: +```dart +Get.putAsync( + + // mandatory: an async method that will be executed to instantiate your class + AsyncInstanceBuilderCallback builder, + + // optional: same as Get.put(), it is used for when you want multiple different instance of a same class + // must be unique + String tag, + + // optional: same as in Get.put(), used when you need to maintain that instance alive in the entire app + // defaults to false + bool permanent = false +) +``` + +### Get.create + +This one is tricky. A detailed explanation of what this is and the differences between the other one can be found on [Differences between methods:](#differences-between-methods) section + +```dart +Get.Create(() => SomeClass()); +Get.Create(() => LoginController()); +``` + +This is all options you can set when using create: + +```dart +Get.create( + // required: a function that returns a class that will be "fabricated" every + // time `Get.find()` is called + // Example: Get.create(() => YourClass()) + FcBuilderFunc builder, + + // optional: just like Get.put(), but it is used when you need multiple instances + // of a of a same class + // Useful in case you have a list that each item need it's own controller + // needs to be a unique string. Just change from tag to name + String name, + + // optional: just like int`Get.put()`, it is for when you need to keep the + // instance alive thoughout the entire app. The difference is in Get.create + // permanent is true by default + bool permanent = true +``` + +## Using instantiated methods/classes + +Imagine that you have navigated through numerous routes, and you need a data that was left behind in your controller, you would need a state manager combined with the Provider or Get_it, correct? Not with Get. You just need to ask Get to "find" for your controller, you don't need any additional dependencies: + +```dart +final controller = Get.find(); +// OR +Controller controller = Get.find(); + +// Yes, it looks like Magic, Get will find your controller, and will deliver it to you. +// You can have 1 million controllers instantiated, Get will always give you the right controller. +``` + +And then you will be able to recover your controller data that was obtained back there: + +```dart +Text(controller.textFromApi); +``` + +Since the returned value is a normal class, you can do anything you want: +```dart +int count = Get.find().getInt('counter'); +print(count); // out: 12345 +``` + +To remove an instance of Get: + +```dart +Get.delete(); //usually you don't need to do this because GetX already delete unused controllers +``` + +## Specifying an alternate instance + +A currently inserted instance can be replaced with a similar or extended class instance by using the `replace` or `lazyReplace` method. This can then be retrieved by using the original class. + +```dart +abstract class BaseClass {} +class ParentClass extends BaseClass {} + +class ChildClass extends ParentClass { + bool isChild = true; +} + + +Get.put(ParentClass()); + +Get.replace(ChildClass()); + +final instance = Get.find(); +print(instance is ChildClass); //true + + +class OtherClass extends BaseClass {} +Get.lazyReplace(() => OtherClass()); + +final instance = Get.find(); +print(instance is ChildClass); // false +print(instance is OtherClass); //true +``` + +## Differences between methods + +First, let's of the `fenix` of Get.lazyPut and the `permanent` of the other methods. + +The fundamental difference between `permanent` and `fenix` is how you want to store your instances. + +Reinforcing: by default, GetX deletes instances when they are not in use. +It means that: If screen 1 has controller 1 and screen 2 has controller 2 and you remove the first route from stack, (like if you use `Get.off()` or `Get.offNamed()`) the controller 1 lost its use so it will be erased. + +But if you want to opt for using `permanent:true`, then the controller will not be lost in this transition - which is very useful for services that you want to keep alive throughout the entire application. + +`fenix` in the other hand is for services that you don't worry in losing between screen changes, but when you need that service, you expect that it is alive. So basically, it will dispose the unused controller/service/class, but when you need it, it will "recreate from the ashes" a new instance. + +Proceeding with the differences between methods: + +- Get.put and Get.putAsync follows the same creation order, with the difference that the second uses an asynchronous method: those two methods creates and initializes the instance. That one is inserted directly in the memory, using the internal method `insert` with the parameters `permanent: false` and `isSingleton: true` (this isSingleton parameter only purpose is to tell if it is to use the dependency on `dependency` or if it is to use the dependency on `FcBuilderFunc`). After that, `Get.find()` is called that immediately initialize the instances that are on memory. + +- Get.create: As the name implies, it will "create" your dependency! Similar to `Get.put()`, it also calls the internal method `insert` to instancing. But `permanent` became true and `isSingleton` became false (since we are "creating" our dependency, there is no way for it to be a singleton instace, that's why is false). And because it has `permanent: true`, we have by default the benefit of not losing it between screens! Also, `Get.find()` is not called immediately, it wait to be used in the screen to be called. It is created this way to make use of the parameter `permanent`, since then, worth noticing, `Get.create()` was made with the goal of create not shared instances, but don't get disposed, like for example a button in a listView, that you want a unique instance for that list - because of that, Get.create must be used together with GetWidget. + +- Get.lazyPut: As the name implies, it is a lazy proccess. The instance is create, but it is not called to be used immediately, it remains waiting to be called. Contrary to the other methods, `insert` is not called here. Instead, the instance is inserted in another part of the memory, a part responsible to tell if the instance can be recreated or not, let's call it "factory". If we want to create something to be used later, it will not be mix with things been used right now. And here is where `fenix` magic enters: if you opt to leaving `fenix: false`, and your `smartManagement` are not `keepFactory`, then when using `Get.find` the instance will change the place in the memory from the "factory" to common instance memory area. Right after that, by default it is removed from the "factory". Now, if you opt for `fenix: true`, the instance continues to exist in this dedicated part, even going to the common area, to be called again in the future. + +## Bindings + +One of the great differentials of this package, perhaps, is the possibility of full integration of the routes, state manager and dependency manager. +When a route is removed from the Stack, all controllers, variables, and instances of objects related to it are removed from memory. If you are using streams or timers, they will be closed automatically, and you don't have to worry about any of that. +In version 2.10 Get completely implemented the Bindings API. +Now you no longer need to use the init method. You don't even have to type your controllers if you don't want to. You can start your controllers and services in the appropriate place for that. +The Binding class is a class that will decouple dependency injection, while "binding" routes to the state manager and dependency manager. +This allows Get to know which screen is being displayed when a particular controller is used and to know where and how to dispose of it. +In addition, the Binding class will allow you to have SmartManager configuration control. You can configure the dependencies to be arranged when removing a route from the stack, or when the widget that used it is laid out, or neither. You will have intelligent dependency management working for you, but even so, you can configure it as you wish. + +### Bindings class + +- Create a class and implements Binding + +```dart +class HomeBinding implements Bindings {} +``` + +Your IDE will automatically ask you to override the "dependencies" method, and you just need to click on the lamp, override the method, and insert all the classes you are going to use on that route: + +```dart +class HomeBinding implements Bindings { + @override + void dependencies() { + Get.lazyPut(() => HomeController()); + Get.put(()=> Api()); + } +} + +class DetailsBinding implements Bindings { + @override + void dependencies() { + Get.lazyPut(() => DetailsController()); + } +} +``` + +Now you just need to inform your route, that you will use that binding to make the connection between route manager, dependencies and states. + +- Using named routes: + +```dart +getPages: [ + GetPage( + name: '/', + page: () => HomeView(), + binding: HomeBinding(), + ), + GetPage( + name: '/details', + page: () => DetailsView(), + binding: DetailsBinding(), + ), +]; +``` + +- Using normal routes: + +```dart +Get.to(Home(), binding: HomeBinding()); +Get.to(DetailsView(), binding: DetailsBinding()) +``` + +There, you don't have to worry about memory management of your application anymore, Get will do it for you. + +The Binding class is called when a route is called, you can create an "initialBinding in your GetMaterialApp to insert all the dependencies that will be created. + +```dart +GetMaterialApp( + initialBinding: SampleBind(), + home: Home(), +); +``` + +### BindingsBuilder + +The default way of creating a binding is by creating a class that implements Bindings. +But alternatively, you can use `BindingsBuilder` callback so that you can simply use a function to instantiate whatever you desire. + +Example: + +```dart +getPages: [ + GetPage( + name: '/', + page: () => HomeView(), + binding: BindingsBuilder(() { + Get.lazyPut(() => ControllerX()); + Get.put(()=> Api()); + }), + ), + GetPage( + name: '/details', + page: () => DetailsView(), + binding: BindingsBuilder(() { + Get.lazyPut(() => DetailsController()); + }), + ), +]; +``` + +That way you can avoid to create one Binding class for each route making this even simpler. + +Both ways of doing work perfectly fine and we want you to use what most suit your tastes. + +### SmartManagement + +GetX by default disposes unused controllers from memory, even if a failure occurs and a widget that uses it is not properly disposed. +This is what is called the `full` mode of dependency management. +But if you want to change the way GetX controls the disposal of classes, you have `SmartManagement` class that you can set different behaviors. + +#### How to change + +If you want to change this config (which you usually don't need) this is the way: + +```dart +void main () { + runApp( + GetMaterialApp( + smartManagement: SmartManagement.onlyBuilder //here + home: Home(), + ) + ) +} +``` + +#### SmartManagement.full + +It is the default one. Dispose classes that are not being used and were not set to be permanent. In the majority of the cases you will want to keep this config untouched. If you new to GetX then don't change this. + +#### SmartManagement.onlyBuilder +With this option, only controllers started in `init:` or loaded into a Binding with `Get.lazyPut()` will be disposed. + +If you use `Get.put()` or `Get.putAsync()` or any other approach, SmartManagement will not have permissions to exclude this dependency. + +With the default behavior, even widgets instantiated with "Get.put" will be removed, unlike SmartManagement.onlyBuilder. + +#### SmartManagement.keepFactory + +Just like SmartManagement.full, it will remove it's dependencies when it's not being used anymore. However, it will keep their factory, which means it will recreate the dependency if you need that instance again. + +### How bindings work under the hood +Bindings creates transitory factories, which are created the moment you click to go to another screen, and will be destroyed as soon as the screen-changing animation happens. +This happens so fast that the analyzer will not even be able to register it. +When you navigate to this screen again, a new temporary factory will be called, so this is preferable to using SmartManagement.keepFactory, but if you don't want to create Bindings, or want to keep all your dependencies on the same Binding, it will certainly help you. +Factories take up little memory, they don't hold instances, but a function with the "shape" of that class you want. +This has a very low cost in memory, but since the purpose of this lib is to get the maximum performance possible using the minimum resources, Get removes even the factories by default. +Use whichever is most convenient for you. + +## Notes + +- DO NOT USE SmartManagement.keepFactory if you are using multiple Bindings. It was designed to be used without Bindings, or with a single Binding linked in the GetMaterialApp's initialBinding. + +- Using Bindings is completely optional, if you want you can use `Get.put()` and `Get.find()` on classes that use a given controller without any problem. +However, if you work with Services or any other abstraction, I recommend using Bindings for a better organization. diff --git a/siro_rider/packages/get/documentation/en_US/route_management.md b/siro_rider/packages/get/documentation/en_US/route_management.md new file mode 100644 index 0000000..00ad35a --- /dev/null +++ b/siro_rider/packages/get/documentation/en_US/route_management.md @@ -0,0 +1,569 @@ +- [Route Management](#route-management) + - [How to use](#how-to-use) + - [Navigation without named routes](#navigation-without-named-routes) + - [Navigation with named routes](#navigation-with-named-routes) + - [Send data to named Routes](#send-data-to-named-routes) + - [Dynamic urls links](#dynamic-urls-links) + - [Middleware](#middleware) + - [Navigation without context](#navigation-without-context) + - [SnackBars](#snackbars) + - [Dialogs](#dialogs) + - [BottomSheets](#bottomsheets) + - [Nested Navigation](#nested-navigation) + +# Route Management + +This is the complete explanation of all there is to Getx when the matter is route management. + +## How to use + +Add this to your pubspec.yaml file: + +```yaml +dependencies: + get: +``` + +If you are going to use routes/snackbars/dialogs/bottomsheets without context, or use the high-level Get APIs, you need to simply add "Get" before your MaterialApp, turning it into GetMaterialApp and enjoy! + +```dart +GetMaterialApp( // Before: MaterialApp( + home: MyHome(), +) +``` + +## Navigation without named routes + +To navigate to a new screen: + +```dart +Get.to(NextScreen()); +``` + +To close snackbars, dialogs, bottomsheets, or anything you would normally close with Navigator.pop(context); + +```dart +Get.back(); +``` + +To go to the next screen and no option to go back to the previous screen (for use in SplashScreens, login screens and etc.) + +```dart +Get.off(NextScreen()); +``` + +To go to the next screen and cancel all previous routes (useful in shopping carts, polls, and tests) + +```dart +Get.offAll(NextScreen()); +``` + +To navigate to the next route, and receive or update data as soon as you return from it: + +```dart +var data = await Get.to(Payment()); +``` + +on other screen, send a data for previous route: + +```dart +Get.back(result: 'success'); +``` + +And use it: + +ex: + +```dart +if(data == 'success') madeAnything(); +``` + +Don't you want to learn our syntax? +Just change the Navigator (uppercase) to navigator (lowercase), and you will have all the functions of the standard navigation, without having to use context +Example: + +```dart + +// Default Flutter navigator +Navigator.of(context).push( + context, + MaterialPageRoute( + builder: (BuildContext context) { + return HomePage(); + }, + ), +); + +// Get using Flutter syntax without needing context +navigator.push( + MaterialPageRoute( + builder: (_) { + return HomePage(); + }, + ), +); + +// Get syntax (It is much better, but you have the right to disagree) +Get.to(HomePage()); + + +``` + +## Navigation with named routes + +- If you prefer to navigate by namedRoutes, Get also supports this. + +To navigate to nextScreen + +```dart +Get.toNamed("/NextScreen"); +``` + +To navigate and remove the previous screen from the tree. + +```dart +Get.offNamed("/NextScreen"); +``` + +To navigate and remove all previous screens from the tree. + +```dart +Get.offAllNamed("/NextScreen"); +``` + +To define routes, use GetMaterialApp: + +```dart +void main() { + runApp( + GetMaterialApp( + initialRoute: '/', + getPages: [ + GetPage(name: '/', page: () => MyHomePage()), + GetPage(name: '/second', page: () => Second()), + GetPage( + name: '/third', + page: () => Third(), + transition: Transition.zoom + ), + ], + ) + ); +} +``` + +To handle navigation to non-defined routes (404 error), you can define an unknownRoute page in GetMaterialApp. + +```dart +void main() { + runApp( + GetMaterialApp( + unknownRoute: GetPage(name: '/notfound', page: () => UnknownRoutePage()), + initialRoute: '/', + getPages: [ + GetPage(name: '/', page: () => MyHomePage()), + GetPage(name: '/second', page: () => Second()), + ], + ) + ); +} +``` + +### Send data to named Routes + +Just send what you want for arguments. Get accepts anything here, whether it is a String, a Map, a List, or even a class instance. + +```dart +Get.toNamed("/NextScreen", arguments: 'Get is the best'); +``` + +on your class or controller: + +```dart +print(Get.arguments); +//print out: Get is the best +``` + +### Dynamic urls links + +Get offer advanced dynamic urls just like on the Web. Web developers have probably already wanted this feature on Flutter, and most likely have seen a package promise this feature and deliver a totally different syntax than a URL would have on web, but Get also solves that. + +```dart +Get.offAllNamed("/NextScreen?device=phone&id=354&name=Enzo"); +``` + +on your controller/bloc/stateful/stateless class: + +```dart +print(Get.parameters['id']); +// out: 354 +print(Get.parameters['name']); +// out: Enzo +``` + +You can also receive NamedParameters with Get easily: + +```dart +void main() { + runApp( + GetMaterialApp( + initialRoute: '/', + getPages: [ + GetPage( + name: '/', + page: () => MyHomePage(), + ), + GetPage( + name: '/profile/', + page: () => MyProfile(), + ), + //You can define a different page for routes with arguments, and another without arguments, but for that you must use the slash '/' on the route that will not receive arguments as above. + GetPage( + name: '/profile/:user', + page: () => UserProfile(), + ), + GetPage( + name: '/third', + page: () => Third(), + transition: Transition.cupertino + ), + ], + ) + ); +} +``` + +Send data on route name + +```dart +Get.toNamed("/profile/34954"); +``` + +On second screen take the data by parameter + +```dart +print(Get.parameters['user']); +// out: 34954 +``` + +or send multiple parameters like this + +```dart +Get.toNamed("/profile/34954?flag=true&country=italy"); +``` +or +```dart +var parameters = {"flag": "true","country": "italy",}; +Get.toNamed("/profile/34954", parameters: parameters); +``` + +On second screen take the data by parameters as usually + +```dart +print(Get.parameters['user']); +print(Get.parameters['flag']); +print(Get.parameters['country']); +// out: 34954 true italy +``` + + + +And now, all you need to do is use Get.toNamed() to navigate your named routes, without any context (you can call your routes directly from your BLoC or Controller class), and when your app is compiled to the web, your routes will appear in the url <3 + +### Middleware + +If you want to listen Get events to trigger actions, you can to use routingCallback to it + +```dart +GetMaterialApp( + routingCallback: (routing) { + if(routing.current == '/second'){ + openAds(); + } + } +) +``` + +If you are not using GetMaterialApp, you can use the manual API to attach Middleware observer. + +```dart +void main() { + runApp( + MaterialApp( + onGenerateRoute: Router.generateRoute, + initialRoute: "/", + navigatorKey: Get.key, + navigatorObservers: [ + GetObserver(MiddleWare.observer), // HERE !!! + ], + ), + ); +} +``` + +Create a MiddleWare class + +```dart +class MiddleWare { + static observer(Routing routing) { + /// You can listen in addition to the routes, the snackbars, dialogs and bottomsheets on each screen. + ///If you need to enter any of these 3 events directly here, + ///you must specify that the event is != Than you are trying to do. + if (routing.current == '/second' && !routing.isSnackbar) { + Get.snackbar("Hi", "You are on second route"); + } else if (routing.current =='/third'){ + print('last route called'); + } + } +} +``` + +Now, use Get on your code: + +```dart +class First extends StatelessWidget { + @override + Widget build(BuildContext context) { + return Scaffold( + appBar: AppBar( + leading: IconButton( + icon: Icon(Icons.add), + onPressed: () { + Get.snackbar("hi", "i am a modern snackbar"); + }, + ), + title: Text('First Route'), + ), + body: Center( + child: ElevatedButton( + child: Text('Open route'), + onPressed: () { + Get.toNamed("/second"); + }, + ), + ), + ); + } +} + +class Second extends StatelessWidget { + @override + Widget build(BuildContext context) { + return Scaffold( + appBar: AppBar( + leading: IconButton( + icon: Icon(Icons.add), + onPressed: () { + Get.snackbar("hi", "i am a modern snackbar"); + }, + ), + title: Text('second Route'), + ), + body: Center( + child: ElevatedButton( + child: Text('Open route'), + onPressed: () { + Get.toNamed("/third"); + }, + ), + ), + ); + } +} + +class Third extends StatelessWidget { + @override + Widget build(BuildContext context) { + return Scaffold( + appBar: AppBar( + title: Text("Third Route"), + ), + body: Center( + child: ElevatedButton( + onPressed: () { + Get.back(); + }, + child: Text('Go back!'), + ), + ), + ); + } +} +``` + +## Navigation without context + +### SnackBars + +To have a simple SnackBar with Flutter, you must get the context of Scaffold, or you must use a GlobalKey attached to your Scaffold + +```dart +final snackBar = SnackBar( + content: Text('Hi!'), + action: SnackBarAction( + label: 'I am a old and ugly snackbar :(', + onPressed: (){} + ), +); +// Find the Scaffold in the widget tree and use +// it to show a SnackBar. +Scaffold.of(context).showSnackBar(snackBar); +``` + +With Get: + +```dart +Get.snackbar('Hi', 'i am a modern snackbar'); +``` + +With Get, all you have to do is call your Get.snackbar from anywhere in your code or customize it however you want! + +```dart +Get.snackbar( + "Hey i'm a Get SnackBar!", // title + "It's unbelievable! I'm using SnackBar without context, without boilerplate, without Scaffold, it is something truly amazing!", // message + icon: Icon(Icons.alarm), + shouldIconPulse: true, + onTap:(){}, + barBlur: 20, + isDismissible: true, + duration: Duration(seconds: 3), +); + + + ////////// ALL FEATURES ////////// + // Color colorText, + // Duration duration, + // SnackPosition snackPosition, + // Widget titleText, + // Widget messageText, + // bool instantInit, + // Widget icon, + // bool shouldIconPulse, + // double maxWidth, + // EdgeInsets margin, + // EdgeInsets padding, + // double borderRadius, + // Color borderColor, + // double borderWidth, + // Color backgroundColor, + // Color leftBarIndicatorColor, + // List boxShadows, + // Gradient backgroundGradient, + // TextButton mainButton, + // OnTap onTap, + // bool isDismissible, + // bool showProgressIndicator, + // AnimationController progressIndicatorController, + // Color progressIndicatorBackgroundColor, + // Animation progressIndicatorValueColor, + // SnackStyle snackStyle, + // Curve forwardAnimationCurve, + // Curve reverseAnimationCurve, + // Duration animationDuration, + // double barBlur, + // double overlayBlur, + // Color overlayColor, + // Form userInputForm + /////////////////////////////////// +``` + +If you prefer the traditional snackbar, or want to customize it from scratch, including adding just one line (Get.snackbar makes use of a mandatory title and message), you can use +`Get.rawSnackbar();` which provides the RAW API on which Get.snackbar was built. + +### Dialogs + +To open dialog: + +```dart +Get.dialog(YourDialogWidget()); +``` + +To open default dialog: + +```dart +Get.defaultDialog( + onConfirm: () => print("Ok"), + middleText: "Dialog made in 3 lines of code" +); +``` + +You can also use Get.generalDialog instead of showGeneralDialog. + +For all other Flutter dialog widgets, including cupertinos, you can use Get.overlayContext instead of context, and open it anywhere in your code. +For widgets that don't use Overlay, you can use Get.context. +These two contexts will work in 99% of cases to replace the context of your UI, except for cases where inheritedWidget is used without a navigation context. + +### BottomSheets + +Get.bottomSheet is like showModalBottomSheet, but don't need of context. + +```dart +Get.bottomSheet( + Container( + child: Wrap( + children: [ + ListTile( + leading: Icon(Icons.music_note), + title: Text('Music'), + onTap: () {} + ), + ListTile( + leading: Icon(Icons.videocam), + title: Text('Video'), + onTap: () {}, + ), + ], + ), + ) +); +``` + +## Nested Navigation + +Get made Flutter's nested navigation even easier. +You don't need the context, and you will find your navigation stack by Id. + +- NOTE: Creating parallel navigation stacks can be dangerous. The ideal is not to use NestedNavigators, or to use sparingly. If your project requires it, go ahead, but keep in mind that keeping multiple navigation stacks in memory may not be a good idea for RAM consumption. + +See how simple it is: + +```dart +Navigator( + key: Get.nestedKey(1), // create a key by index + initialRoute: '/', + onGenerateRoute: (settings) { + if (settings.name == '/') { + return GetPageRoute( + page: () => Scaffold( + appBar: AppBar( + title: Text("Main"), + ), + body: Center( + child: TextButton( + color: Colors.blue, + onPressed: () { + Get.toNamed('/second', id:1); // navigate by your nested route by index + }, + child: Text("Go to second"), + ), + ), + ), + ); + } else if (settings.name == '/second') { + return GetPageRoute( + page: () => Center( + child: Scaffold( + appBar: AppBar( + title: Text("Main"), + ), + body: Center( + child: Text("second") + ), + ), + ), + ); + } + } +), +``` diff --git a/siro_rider/packages/get/documentation/en_US/state_management.md b/siro_rider/packages/get/documentation/en_US/state_management.md new file mode 100644 index 0000000..498ae9b --- /dev/null +++ b/siro_rider/packages/get/documentation/en_US/state_management.md @@ -0,0 +1,789 @@ +* [State Management](#state-management) + + [Reactive State Manager](#reactive-state-manager) + - [Advantages](#advantages) + - [Maximum performance:](#maximum-performance) + - [Declaring a reactive variable](#declaring-a-reactive-variable) + - [Having a reactive state, is easy.](#having-a-reactive-state-is-easy) + - [Using the values in the view](#using-the-values-in-the-view) + - [Conditions to rebuild](#conditions-to-rebuild) + - [Where .obs can be used](#where-obs-can-be-used) + - [Note about Lists](#note-about-lists) + - [Why i have to use .value](#why-i-have-to-use-value) + - [Obx()](#obx) + - [Workers](#workers) + + [Simple State Manager](#simple-state-manager) + - [Advantages](#advantages-1) + - [Usage](#usage) + - [How it handles controllers](#how-it-handles-controllers) + - [You won't need StatefulWidgets anymore](#you-wont-need-statefulwidgets-anymore) + - [Why it exists](#why-it-exists) + - [Other ways of using it](#other-ways-of-using-it) + - [Unique IDs](#unique-ids) + + [Mixing the two state managers](#mixing-the-two-state-managers) + + [GetBuilder vs GetX vs Obx vs MixinBuilder](#getbuilder-vs-getx-vs-obx-vs-mixinbuilder) + +# State Management + +GetX does not use Streams or ChangeNotifier like other state managers. Why? In addition to building applications for android, iOS, web, linux, macos and linux, with GetX you can build server applications with the same syntax as Flutter/GetX. In order to improve response time and reduce RAM consumption, we created GetValue and GetStream, which are low latency solutions that deliver a lot of performance, at a low operating cost. We use this base to build all of our resources, including state management. + +* _Complexity_: Some state managers are complex and have a lot of boilerplate. With GetX you don't have to define a class for each event, the code is highly clean and clear, and you do a lot more by writing less. Many people have given up on Flutter because of this topic, and they now finally have a stupidly simple solution for managing states. +* _No code generators_: You spend half your development time writing your application logic. Some state managers rely on code generators to have minimally readable code. Changing a variable and having to run build_runner can be unproductive, and often the waiting time after a flutter clean will be long, and you will have to drink a lot of coffee. + +With GetX everything is reactive, and nothing depends on code generators, increasing your productivity in all aspects of your development. + +* _It does not depend on context_: You probably already needed to send the context of your view to a controller, making the View's coupling with your business logic high. You have probably had to use a dependency for a place that has no context, and had to pass the context through various classes and functions. This just doesn't exist with GetX. You have access to your controllers from within your controllers without any context. You don't need to send the context by parameter for literally nothing. +* _Granular control_: most state managers are based on ChangeNotifier. ChangeNotifier will notify all widgets that depend on it when notifyListeners is called. If you have 40 widgets on one screen, which have a variable of your ChangeNotifier class, when you update one, all of them will be rebuilt. + +With GetX, even nested widgets are respected. If you have Obx watching your ListView, and another watching a checkbox inside the ListView, when changing the CheckBox value, only it will be updated, when changing the List value, only the ListView will be updated. + +* _It only reconstructs if its variable REALLY changes_: GetX has flow control, that means if you display a Text with 'Paola', if you change the observable variable to 'Paola' again, the widget will not be reconstructed. That's because GetX knows that 'Paola' is already being displayed in Text, and will not do unnecessary reconstructions. + +Most (if not all) current state managers will rebuild on the screen. + +## Reactive State Manager + +Reactive programming can alienate many people because it is said to be complicated. GetX turns reactive programming into something quite simple: + +* You won't need to create StreamControllers. +* You won't need to create a StreamBuilder for each variable +* You will not need to create a class for each state. +* You will not need to create a get for an initial value. + +Reactive programming with Get is as easy as using setState. + +Let's imagine that you have a name variable and want that every time you change it, all widgets that use it are automatically changed. + +This is your count variable: + +``` dart +var name = 'Jonatas Borges'; +``` + +To make it observable, you just need to add ".obs" to the end of it: + +``` dart +var name = 'Jonatas Borges'.obs; +``` + +That's all. It's *that* simple. + +From now on, we might refer to this reactive-".obs"(ervables) variables as _Rx_. + +What did we do under the hood? We created a `Stream` of `String` s, assigned the initial value `"Jonatas Borges"` , we notified all widgets that use `"Jonatas Borges"` that they now "belong" to this variable, and when the _Rx_ value changes, they will have to change as well. + +This is the **magic of GetX**, thanks to Dart's capabilities. + +But, as we know, a `Widget` can only be changed if it is inside a function, because static classes do not have the power to "auto-change". + +You will need to create a `StreamBuilder` , subscribe to this variable to listen for changes, and create a "cascade" of nested `StreamBuilder` if you want to change several variables in the same scope, right? + +No, you don't need a `StreamBuilder` , but you are right about static classes. + +Well, in the view, we usually have a lot of boilerplate when we want to change a specific Widget, that's the Flutter way. +With **GetX** you can also forget about this boilerplate code. + +`StreamBuilder( … )` ? `initialValue: …` ? `builder: …` ? Nope, you just need to place this variable inside an `Obx()` Widget. + +``` dart +Obx (() => Text (controller.name)); +``` + +_What do you need to memorize?_ Only `Obx(() =>` . + +You are just passing that Widget through an arrow-function into an `Obx()` (the "Observer" of the _Rx_). + +`Obx` is pretty smart, and will only change if the value of `controller.name` changes. + +If `name` is `"John"` , and you change it to `"John"` ( `name.value = "John"` ), as it's the same `value` as before, nothing will change on the screen, and `Obx` , to save resources, will simply ignore the new value and not rebuild the Widget. **Isn't that amazing?** + +> So, what if I have 5 _Rx_ (observable) variables within an `Obx` ? + +It will just update when **any** of them changes. + +> And if I have 30 variables in a class, when I update one, will it update **all** the variables that are in that class? + +Nope, just the **specific Widget** that uses that _Rx_ variable. + +So, **GetX** only updates the screen, when the _Rx_ variable changes it's value. + +``` + +final isOpen = false.obs; + +// NOTHING will happen... same value. +void onButtonTap() => isOpen.value=false; +``` + +### Advantages + +**GetX()** helps you when you need **granular** control over what's being updated. + +If you do not need `unique IDs` , because all your variables will be modified when you perform an action, then use `GetBuilder` , +because it's a Simple State Updater (in blocks, like `setState()` ), made in just a few lines of code. +It was made simple, to have the least CPU impact, and just to fulfill a single purpose (a _State_ rebuild) and spend the minimum resources possible. + +If you need a **powerful** State Manager, you can't go wrong with **GetX**. + +It doesn't work with variables, but __flows__, everything in it are `Streams` under the hood. + +You can use _rxDart_ in conjunction with it, because everything are `Streams`, +you can listen to the `event` of each "_Rx_ variable", +because everything in it are `Streams`. + +It is literally a _BLoC_ approach, easier than _MobX_, and without code generators or decorations. +You can turn **anything** into an _"Observable"_ with just a `.obs` . + +### Maximum performance: + +In addition to having a smart algorithm for minimal rebuilds, **GetX** uses comparators +to make sure the State has changed. + +If you experience any errors in your app, and send a duplicate change of State, +**GetX** will ensure it will not crash. + +With **GetX** the State only changes if the `value` change. +That's the main difference between **GetX**, and using _ `computed` from MobX_. +When joining two __observables__, and one changes; the listener of that _observable_ will change as well. + +With **GetX**, if you join two variables, `GetX()` (similar to `Observer()` ) will only rebuild if it implies a real change of State. + +### Declaring a reactive variable + +You have 3 ways to turn a variable into an "observable". + +1 - The first is using **`Rx{Type}`**. + +``` dart +// initial value is recommended, but not mandatory +final name = RxString(''); +final isLogged = RxBool(false); +final count = RxInt(0); +final balance = RxDouble(0.0); +final items = RxList([]); +final myMap = RxMap({}); +``` + +2 - The second is to use **`Rx`** and use Darts Generics, `Rx` + +``` dart +final name = Rx(''); +final isLogged = Rx(false); +final count = Rx(0); +final balance = Rx(0.0); +final number = Rx(0); +final items = Rx>([]); +final myMap = Rx>({}); + +// Custom classes - it can be any class, literally +final user = Rx(); +``` + +3 - The third, more practical, easier and preferred approach, just add **`.obs`** as a property of your `value` : + +``` dart +final name = ''.obs; +final isLogged = false.obs; +final count = 0.obs; +final balance = 0.0.obs; +final number = 0.obs; +final items = [].obs; +final myMap = {}.obs; + +// Custom classes - it can be any class, literally +final user = User().obs; +``` + +##### Having a reactive state, is easy. + +As we know, _Dart_ is now heading towards _null safety_. +To be prepared, from now on, you should always start your _Rx_ variables with an **initial value**. + +> Transforming a variable into an _observable_ + _initial value_ with **GetX** is the simplest, and most practical approach. + +You will literally add a " `.obs` " to the end of your variable, and **that’s it**, you’ve made it observable, +and its `.value` , well, will be the _initial value_). + +### Using the values in the view + +``` dart +// controller file +final count1 = 0.obs; +final count2 = 0.obs; +int get sum => count1.value + count2.value; +``` + +``` dart +// view file +GetX( + builder: (controller) { + print("count 1 rebuild"); + return Text('${controller.count1.value}'); + }, +), +GetX( + builder: (controller) { + print("count 2 rebuild"); + return Text('${controller.count2.value}'); + }, +), +GetX( + builder: (controller) { + print("count 3 rebuild"); + return Text('${controller.sum}'); + }, +), +``` + +If we increment `count1.value++` , it will print: + +* `count 1 rebuild` + +* `count 3 rebuild` + +because `count1` has a value of `1` , and `1 + 0 = 1` , changing the `sum` getter value. + +If we change `count2.value++` , it will print: + +* `count 2 rebuild` + +* `count 3 rebuild` + +because `count2.value` changed, and the result of the `sum` is now `2` . + +* NOTE: By default, the very first event will rebuild the widget, even if it is the same `value`. + + This behavior exists due to Boolean variables. + +Imagine you did this: + +``` dart +var isLogged = false.obs; +``` + +And then, you checked if a user is "logged in" to trigger an event in `ever` . + +``` dart +@override +onInit() async { + ever(isLogged, fireRoute); + isLogged.value = await Preferences.hasToken(); +} + +fireRoute(logged) { + if (logged) { + Get.off(Home()); + } else { + Get.off(Login()); + } +} +``` + +if `hasToken` was `false` , there would be no change to `isLogged` , so `ever()` would never be called. +To avoid this type of behavior, the first change to an _observable_ will always trigger an event, +even if it contains the same `.value` . + +You can remove this behavior if you want, using: + `isLogged.firstRebuild = false;` + +### Conditions to rebuild + +In addition, Get provides refined state control. You can condition an event (such as adding an object to a list), on a certain condition. + +``` dart +// First parameter: condition, must return true or false. +// Second parameter: the new value to apply if the condition is true. +list.addIf(item < limit, item); +``` + +Without decorations, without a code generator, without complications :smile: + +Do you know Flutter's counter app? Your Controller class might look like this: + +``` dart +class CountController extends GetxController { + final count = 0.obs; +} +``` + +With a simple: + +``` dart +controller.count.value++ +``` + +You could update the counter variable in your UI, regardless of where it is stored. + +### Where .obs can be used + +You can transform anything on obs. Here are two ways of doing it: + +* You can convert your class values to obs + +``` dart +class RxUser { + final name = "Camila".obs; + final age = 18.obs; +} +``` + +* or you can convert the entire class to be an observable + +``` dart +class User { + User({String name, int age}); + var name; + var age; +} + +// when instantianting: +final user = User(name: "Camila", age: 18).obs; +``` + +### Note about Lists + +Lists are completely observable as are the objects within it. That way, if you add a value to a list, it will automatically rebuild the widgets that use it. + +You also don't need to use ".value" with lists, the amazing dart api allowed us to remove that. +Unfortunaly primitive types like String and int cannot be extended, making the use of .value mandatory, but that won't be a problem if you work with gets and setters for these. + +``` dart +// On the controller +final String title = 'User Info:'.obs +final list = List().obs; + +// on the view +Text(controller.title.value), // String need to have .value in front of it +ListView.builder ( + itemCount: controller.list.length // lists don't need it +) +``` + +When you are making your own classes observable, there is a different way to update them: + +``` dart +// on the model file +// we are going to make the entire class observable instead of each attribute +class User() { + User({this.name = '', this.age = 0}); + String name; + int age; +} + +// on the controller file +final user = User().obs; +// when you need to update the user variable: +user.update( (user) { // this parameter is the class itself that you want to update +user.name = 'Jonny'; +user.age = 18; +}); +// an alternative way of update the user variable: +user(User(name: 'João', age: 35)); + +// on view: +Obx(()=> Text("Name ${user.value.name}: Age: ${user.value.age}")) +// you can also access the model values without the .value: +user().name; // notice that is the user variable, not the class (variable has lowercase u) +``` + +You don't have to work with sets if you don't want to. you can use the "assign 'and" assignAll "api. +The "assign" api will clear your list, and add a single object that you want to start there. +The "assignAll" api will clear the existing list and add any iterable objects that you inject into it. + +### Why i have to use .value + +We could remove the obligation to use 'value' to `String` and `int` with a simple decoration and code generator, but the purpose of this library is precisely avoid external dependencies. We want to offer an environment ready for programming, involving the essentials (management of routes, dependencies and states), in a simple, lightweight and performant way, without a need of an external package. + +You can literally add 3 letters to your pubspec (get) and a colon and start programming. All solutions included by default, from route management to state management, aim at ease, productivity and performance. + +The total weight of this library is less than that of a single state manager, even though it is a complete solution, and that is what you must understand. + +If you are bothered by `.value` , and like a code generator, MobX is a great alternative, and you can use it in conjunction with Get. For those who want to add a single dependency in pubspec and start programming without worrying about the version of a package being incompatible with another, or if the error of a state update is coming from the state manager or dependency, or still, do not want to worrying about the availability of controllers, whether literally "just programming", get is just perfect. + +If you have no problem with the MobX code generator, or have no problem with the BLoC boilerplate, you can simply use Get for routes, and forget that it has state manager. Get SEM and RSM were born out of necessity, my company had a project with more than 90 controllers, and the code generator simply took more than 30 minutes to complete its tasks after a Flutter Clean on a reasonably good machine, if your project it has 5, 10, 15 controllers, any state manager will supply you well. If you have an absurdly large project, and code generator is a problem for you, you have been awarded this solution. + +Obviously, if someone wants to contribute to the project and create a code generator, or something similar, I will link in this readme as an alternative, my need is not the need for all devs, but for now I say, there are good solutions that already do that, like MobX. + +### Obx() + +Typing in Get using Bindings is unnecessary. you can use the Obx widget instead of GetX which only receives the anonymous function that creates a widget. +Obviously, if you don't use a type, you will need to have an instance of your controller to use the variables, or use `Get.find()` .value or Controller.to.value to retrieve the value. + +### Workers + +Workers will assist you, triggering specific callbacks when an event occurs. + +``` dart +/// Called every time `count1` changes. +ever(count1, (_) => print("$_ has been changed")); + +/// Called only first time the variable $_ is changed +once(count1, (_) => print("$_ was changed once")); + +/// Anti DDos - Called every time the user stops typing for 1 second, for example. +debounce(count1, (_) => print("debouce$_"), time: Duration(seconds: 1)); + +/// Ignore all changes within 1 second. +interval(count1, (_) => print("interval $_"), time: Duration(seconds: 1)); +``` + +All workers (except `debounce` ) have a `condition` named parameter, which can be a `bool` or a callback that returns a `bool` . +This `condition` defines when the `callback` function executes. + +All workers returns a `Worker` instance, that you can use to cancel ( via `dispose()` ) the worker. + + +* **`ever`** + + is called every time the _Rx_ variable emits a new value. + +* **`everAll`** + + Much like `ever` , but it takes a `List` of _Rx_ values Called every time its variable is changed. That's it. + +* **`once`** + +'once' is called only the first time the variable has been changed. + +* **`debounce`** + +'debounce' is very useful in search functions, where you only want the API to be called when the user finishes typing. If the user types "Jonny", you will have 5 searches in the APIs, by the letter J, o, n, n, and y. With Get this does not happen, because you will have a "debounce" Worker that will only be triggered at the end of typing. + +* **`interval`** + +'interval' is different from the debouce. debouce if the user makes 1000 changes to a variable within 1 second, he will send only the last one after the stipulated timer (the default is 800 milliseconds). Interval will instead ignore all user actions for the stipulated period. If you send events for 1 minute, 1000 per second, debounce will only send you the last one, when the user stops strafing events. interval will deliver events every second, and if set to 3 seconds, it will deliver 20 events that minute. This is recommended to avoid abuse, in functions where the user can quickly click on something and get some advantage (imagine that the user can earn coins by clicking on something, if he clicked 300 times in the same minute, he would have 300 coins, using interval, you you can set a time frame for 3 seconds, and even then clicking 300 or a thousand times, the maximum he would get in 1 minute would be 20 coins, clicking 300 or 1 million times). The debounce is suitable for anti-DDos, for functions like search where each change to onChange would cause a query to your api. Debounce will wait for the user to stop typing the name, to make the request. If it were used in the coin scenario mentioned above, the user would only win 1 coin, because it is only executed, when the user "pauses" for the established time. + +* NOTE: Workers should always be used when starting a Controller or Class, so it should always be on onInit (recommended), Class constructor, or the initState of a StatefulWidget (this practice is not recommended in most cases, but it shouldn't have any side effects). + +## Simple State Manager + +Get has a state manager that is extremely light and easy, which does not use ChangeNotifier, will meet the need especially for those new to Flutter, and will not cause problems for large applications. + +GetBuilder is aimed precisely at multiple state control. Imagine that you added 30 products to a cart, you click delete one, at the same time that the list is updated, the price is updated and the badge in the shopping cart is updated to a smaller number. This type of approach makes GetBuilder killer, because it groups states and changes them all at once without any "computational logic" for that. GetBuilder was created with this type of situation in mind, since for ephemeral change of state, you can use setState and you would not need a state manager for this. + +That way, if you want an individual controller, you can assign IDs for that, or use GetX. This is up to you, remembering that the more "individual" widgets you have, the more the performance of GetX will stand out, while the performance of GetBuilder should be superior, when there is multiple change of state. + +### Advantages + +1. Update only the required widgets. + +2. Does not use changeNotifier, it is the state manager that uses less memory (close to 0mb). + +3. Forget StatefulWidget! With Get you will never need it. With the other state managers, you will probably have to use a StatefulWidget to get the instance of your Provider, BLoC, MobX Controller, etc. But have you ever stopped to think that your appBar, your scaffold, and most of the widgets that are in your class are stateless? So why save the state of an entire class, if you can only save the state of the Widget that is stateful? Get solves that, too. Create a Stateless class, make everything stateless. If you need to update a single component, wrap it with GetBuilder, and its state will be maintained. + +4. Organize your project for real! Controllers must not be in your UI, place your TextEditController, or any controller you use within your Controller class. + +5. Do you need to trigger an event to update a widget as soon as it is rendered? GetBuilder has the property "initState", just like StatefulWidget, and you can call events from your controller, directly from it, no more events being placed in your initState. + +6. Do you need to trigger an action like closing streams, timers and etc? GetBuilder also has the dispose property, where you can call events as soon as that widget is destroyed. + +7. Use streams only if necessary. You can use your StreamControllers inside your controller normally, and use StreamBuilder also normally, but remember, a stream reasonably consumes memory, reactive programming is beautiful, but you shouldn't abuse it. 30 streams open simultaneously can be worse than changeNotifier (and changeNotifier is very bad). + +8. Update widgets without spending ram for that. Get stores only the GetBuilder creator ID, and updates that GetBuilder when necessary. The memory consumption of the get ID storage in memory is very low even for thousands of GetBuilders. When you create a new GetBuilder, you are actually sharing the state of GetBuilder that has a creator ID. A new state is not created for each GetBuilder, which saves A LOT OF ram for large applications. Basically your application will be entirely Stateless, and the few Widgets that will be Stateful (within GetBuilder) will have a single state, and therefore updating one will update them all. The state is just one. + +9. Get is omniscient and in most cases it knows exactly the time to take a controller out of memory. You should not worry about when to dispose of a controller, Get knows the best time to do this. + +### Usage + +``` dart +// Create controller class and extends GetxController +class Controller extends GetxController { + int counter = 0; + void increment() { + counter++; + update(); // use update() to update counter variable on UI when increment be called + } +} +// On your Stateless/Stateful class, use GetBuilder to update Text when increment be called +GetBuilder( + init: Controller(), // INIT IT ONLY THE FIRST TIME + builder: (_) => Text( + '${_.counter}', + ), +) +//Initialize your controller only the first time. The second time you are using ReBuilder for the same controller, do not use it again. Your controller will be automatically removed from memory as soon as the widget that marked it as 'init' is deployed. You don't have to worry about that, Get will do it automatically, just make sure you don't start the same controller twice. +``` + +**Done!** + +* You have already learned how to manage states with Get. + +* Note: You may want a larger organization, and not use the init property. For that, you can create a class and extends Bindings class, and within it mention the controllers that will be created within that route. Controllers will not be created at that time, on the contrary, this is just a statement, so that the first time you use a Controller, Get will know where to look. Get will remain lazyLoad, and will continue to dispose Controllers when they are no longer needed. See the pub.dev example to see how it works. + +If you navigate many routes and need data that was in your previously used controller, you just need to use GetBuilder Again (with no init): + +``` dart +class OtherClass extends StatelessWidget { + @override + Widget build(BuildContext context) { + return Scaffold( + body: Center( + child: GetBuilder( + builder: (s) => Text('${s.counter}'), + ), + ), + ); + } + +``` + +If you need to use your controller in many other places, and outside of GetBuilder, just create a get in your controller and have it easily. (or use `Get.find()` ) + +``` dart +class Controller extends GetxController { + + /// You do not need that. I recommend using it just for ease of syntax. + /// with static method: Controller.to.increment(); + /// with no static method: Get.find().increment(); + /// There is no difference in performance, nor any side effect of using either syntax. Only one does not need the type, and the other the IDE will autocomplete it. + static Controller get to => Get.find(); // add this line + + int counter = 0; + void increment() { + counter++; + update(); + } +} +``` + +And then you can access your controller directly, that way: + +``` dart +FloatingActionButton( + onPressed: () { + Controller.to.increment(), + } // This is incredibly simple! + child: Text("${Controller.to.counter}"), +), +``` + +When you press FloatingActionButton, all widgets that are listening to the 'counter' variable will be updated automatically. + +### How it handles controllers + +Let's say we have this: + + `Class a => Class B (has controller X) => Class C (has controller X)` + +In class A the controller is not yet in memory, because you have not used it yet (Get is lazyLoad). In class B you used the controller, and it entered memory. In class C you used the same controller as in class B, Get will share the state of controller B with controller C, and the same controller is still in memory. If you close screen C and screen B, Get will automatically take controller X out of memory and free up resources, because Class a is not using the controller. If you navigate to B again, controller X will enter memory again, if instead of going to class C, you return to class A again, Get will take the controller out of memory in the same way. If class C didn't use the controller, and you took class B out of memory, no class would be using controller X and likewise it would be disposed of. The only exception that can mess with Get, is if you remove B from the route unexpectedly, and try to use the controller in C. In this case, the creator ID of the controller that was in B was deleted, and Get was programmed to remove it from memory every controller that has no creator ID. If you intend to do this, add the "autoRemove: false" flag to class B's GetBuilder and use adoptID = true; in class C's GetBuilder. + +### You won't need StatefulWidgets anymore + +Using StatefulWidgets means storing the state of entire screens unnecessarily, even because if you need to minimally rebuild a widget, you will embed it in a Consumer/Observer/BlocProvider/GetBuilder/GetX/Obx, which will be another StatefulWidget. +The StatefulWidget class is a class larger than StatelessWidget, which will allocate more RAM, and this may not make a significant difference between one or two classes, but it will most certainly do when you have 100 of them! +Unless you need to use a mixin, like TickerProviderStateMixin, it will be totally unnecessary to use a StatefulWidget with Get. + +You can call all methods of a StatefulWidget directly from a GetBuilder. +If you need to call initState() or dispose() method for example, you can call them directly; + +``` dart +GetBuilder( + initState: (_) => Controller.to.fetchApi(), + dispose: (_) => Controller.to.closeStreams(), + builder: (s) => Text('${s.username}'), +), +``` + +A much better approach than this is to use the onInit() and onClose() method directly from your controller. + +``` dart +@override +void onInit() { + fetchApi(); + super.onInit(); +} +``` + +* NOTE: If you want to start a method at the moment the controller is called for the first time, you DON'T NEED to use constructors for this, in fact, using a performance-oriented package like Get, this borders on bad practice, because it deviates from the logic in which the controllers are created or allocated (if you create an instance of this controller, the constructor will be called immediately, you will be populating a controller before it is even used, you are allocating memory without it being in use, this definitely hurts the principles of this library). The onInit() methods; and onClose(); were created for this, they will be called when the Controller is created, or used for the first time, depending on whether you are using Get.lazyPut or not. If you want, for example, to make a call to your API to populate data, you can forget about the old-fashioned method of initState/dispose, just start your call to the api in onInit, and if you need to execute any command like closing streams, use the onClose() for that. + +### Why it exists + +The purpose of this package is precisely to give you a complete solution for navigation of routes, management of dependencies and states, using the least possible dependencies, with a high degree of decoupling. Get engages all high and low level Flutter APIs within itself, to ensure that you work with the least possible coupling. We centralize everything in a single package, to ensure that you don't have any kind of coupling in your project. That way, you can put only widgets in your view, and leave the part of your team that works with the business logic free, to work with the business logic without depending on any element of the View. This provides a much cleaner working environment, so that part of your team works only with widgets, without worrying about sending data to your controller, and part of your team works only with the business logic in its breadth, without depending on no element of the view. + +So to simplify this: +You don't need to call methods in initState and send them by parameter to your controller, nor use your controller constructor for that, you have the onInit() method that is called at the right time for you to start your services. +You do not need to call the device, you have the onClose() method that will be called at the exact moment when your controller is no longer needed and will be removed from memory. That way, leave views for widgets only, refrain from any kind of business logic from it. + +Do not call a dispose method inside GetxController, it will not do anything, remember that the controller is not a Widget, you should not "dispose" it, and it will be automatically and intelligently removed from memory by Get. If you used any stream on it and want to close it, just insert it into the close method. Example: + +``` dart +class Controller extends GetxController { + StreamController user = StreamController(); + StreamController name = StreamController(); + + /// close stream = onClose method, not dispose. + @override + void onClose() { + user.close(); + name.close(); + super.onClose(); + } +} +``` + +Controller life cycle: + +* onInit() where it is created. +* onClose() where it is closed to make any changes in preparation for the delete method +* deleted: you do not have access to this API because it is literally removing the controller from memory. It is literally deleted, without leaving any trace. + +### Other ways of using it + +You can use Controller instance directly on GetBuilder value: + +``` dart +GetBuilder( + init: Controller(), + builder: (value) => Text( + '${value.counter}', //here + ), +), +``` + +You may also need an instance of your controller outside of your GetBuilder, and you can use these approaches to achieve this: + +``` dart +class Controller extends GetxController { + static Controller get to => Get.find(); +[...] +} +// on you view: +GetBuilder( + init: Controller(), // use it only first time on each controller + builder: (_) => Text( + '${Controller.to.counter}', //here + ) +), +``` + +or + +``` dart +class Controller extends GetxController { + // static Controller get to => Get.find(); // with no static get +[...] +} +// on stateful/stateless class +GetBuilder( + init: Controller(), // use it only first time on each controller + builder: (_) => Text( + '${Get.find().counter}', //here + ), +), +``` + +* You can use "non-canonical" approaches to do this. If you are using some other dependency manager, like get_it, modular, etc., and just want to deliver the controller instance, you can do this: + +``` dart +Controller controller = Controller(); +[...] +GetBuilder( + init: controller, //here + builder: (_) => Text( + '${controller.counter}', // here + ), +), + +``` + +### Unique IDs + +If you want to refine a widget's update control with GetBuilder, you can assign them unique IDs: + +``` dart +GetBuilder( + id: 'text' + init: Controller(), // use it only first time on each controller + builder: (_) => Text( + '${Get.find().counter}', //here + ), +), +``` + +And update it this form: + +``` dart +update(['text']); +``` + +You can also impose conditions for the update: + +``` dart +update(['text'], counter < 10); +``` + +GetX does this automatically and only reconstructs the widget that uses the exact variable that was changed, if you change a variable to the same as the previous one and that does not imply a change of state , GetX will not rebuild the widget to save memory and CPU cycles (3 is being displayed on the screen, and you change the variable to 3 again. In most state managers, this will cause a new rebuild, but with GetX the widget will only is rebuilt again, if in fact his state has changed). + +## Mixing the two state managers + +Some people opened a feature request, as they wanted to use only one type of reactive variable, and the other mechanics, and needed to insert an Obx into a GetBuilder for this. Thinking about it MixinBuilder was created. It allows both reactive changes by changing ".obs" variables, and mechanical updates via update(). However, of the 4 widgets he is the one that consumes the most resources, since in addition to having a Subscription to receive change events from his children, he subscribes to the update method of his controller. + +Extending GetxController is important, as they have life cycles, and can "start" and "end" events in their onInit() and onClose() methods. You can use any class for this, but I strongly recommend you use the GetxController class to place your variables, whether they are observable or not. + +## StateMixin + +Another way to handle your `UI` state is use the `StateMixin` . +To implement it, use the `with` to add the `StateMixin` +to your controller which allows a T model. + +``` dart +class Controller extends GetController with StateMixin{} +``` + +The `change()` method change the State whenever we want. +Just pass the data and the status in this way: + +```dart +change(data, status: RxStatus.success()); +``` + +RxStatus allow these status: + +``` dart +RxStatus.loading(); +RxStatus.success(); +RxStatus.empty(); +RxStatus.error('message'); +``` + +To represent it in the UI, use: + +```dart +class OtherClass extends GetView { + @override + Widget build(BuildContext context) { + return Scaffold( + + body: controller.obx( + (state)=>Text(state.name), + + // here you can put your custom loading indicator, but + // by default would be Center(child:CircularProgressIndicator()) + onLoading: CustomLoadingIndicator(), + onEmpty: Text('No data found'), + + // here also you can set your own error widget, but by + // default will be an Center(child:Text(error)) + onError: (error)=>Text(error), + ), + ); +} +``` + +## GetBuilder vs GetX vs Obx vs MixinBuilder + +In a decade working with programming I was able to learn some valuable lessons. + +My first contact with reactive programming was so "wow, this is incredible" and in fact reactive programming is incredible. +However, it is not suitable for all situations. Often all you need is to change the state of 2 or 3 widgets at the same time, or an ephemeral change of state, in which case reactive programming is not bad, but it is not appropriate. + +Reactive programming has a higher RAM consumption that can be compensated for by the individual workflow, which will ensure that only one widget is rebuilt and when necessary, but creating a list with 80 objects, each with several streams is not a good one idea. Open the dart inspect and check how much a StreamBuilder consumes, and you'll understand what I'm trying to tell you. + +With that in mind, I created the simple state manager. It is simple, and that is exactly what you should demand from it: updating state in blocks in a simple way, and in the most economical way. + +GetBuilder is very economical in RAM, and there is hardly a more economical approach than him (at least I can't imagine one, if it exists, please let us know). + +However, GetBuilder is still a mechanical state manager, you need to call update() just like you would need to call Provider's notifyListeners(). + +There are other situations where reactive programming is really interesting, and not working with it is the same as reinventing the wheel. With that in mind, GetX was created to provide everything that is most modern and advanced in a state manager. It updates only what is necessary and when necessary, if you have an error and send 300 state changes simultaneously, GetX will filter and update the screen only if the state actually changes. + +GetX is still more economical than any other reactive state manager, but it consumes a little more RAM than GetBuilder. Thinking about it and aiming to maximize the consumption of resources that Obx was created. Unlike GetX and GetBuilder, you will not be able to initialize a controller inside an Obx, it is just a Widget with a StreamSubscription that receives change events from your children, that's all. It is more economical than GetX, but loses to GetBuilder, which was to be expected, since it is reactive, and GetBuilder has the most simplistic approach that exists, of storing a widget's hashcode and its StateSetter. With Obx you don't need to write your controller type, and you can hear the change from multiple different controllers, but it needs to be initialized before, either using the example approach at the beginning of this readme, or using the Bindings class. diff --git a/siro_rider/packages/get/documentation/es_ES/dependency_management.md b/siro_rider/packages/get/documentation/es_ES/dependency_management.md new file mode 100644 index 0000000..6df7d9d --- /dev/null +++ b/siro_rider/packages/get/documentation/es_ES/dependency_management.md @@ -0,0 +1,266 @@ +- [Gestión de dependencias](#gestión-de-dependencias) + - [Simple Instance Manager](#simple-instance-manager) + - [Options](#options) + - [Bindings](#bindings) + - [Cómo utilizar](#cómo-utilizar) + - [SmartManagement](#smartmanagement) + + +# Gestión de dependencias + +## Simple Instance Manager + +- Nota: si está utilizando el gestor de estado de GetX, no tiene que preocuparse por esto, solo lea para obtener información, pero preste más atención a la API de bindings, que hará todo esto automáticamente por usted. + +¿Ya estás utilizando GetX y quieres que tu proyecto sea lo más ágil posible? GetX tiene un gestor de dependencias simple y poderoso que le permite recuperar la misma clase que su BLoC o Controller con solo una líneas de código, sin contexto de Provider, sin inheritedWidget: + +```dart +Controller controller = Get.put(Controller()); // Rather Controller controller = Controller(); +``` + +En lugar de crear una instancia de su clase dentro de la clase que está utilizando, la está creando dentro de la instancia GetX, que la hará disponible en toda su aplicación. Entonces puede usar su Controller (o BLoC) normalmente. + +```dart +controller.fetchApi(); +``` + +Imagine que ha navegado a través de numerosas rutas y necesita datos que quedaron en su controlador, necesitaría un gestor de estado combinado con Providere o Get_it, ¿correcto? No con GetX. Solo necesita pedirle a GetX que "encuentre" su controlador, no necesita dependencias adicionales: + +```dart +Controller controller = Get.find(); +//Yes, it looks like Magic, Get will find your controller, and will deliver it to you. You can have 1 million controllers instantiated, Get will always give you the right controller. +``` + +Y luego podrá recuperar los datos de su controlador que se obtuvieron allí: + +```dart +Text(controller.textFromApi); +``` + +¿Buscando lazy loading? Puede declarar todos sus controladores, y se llamará solo cuando alguien lo necesite. Puedes hacer esto con: + +```dart +Get.lazyPut(()=> ApiMock()); +/// ApiMock will only be called when someone uses Get.find for the first time +``` + +Si desea registrar una instancia asincrónica, puede usar Get.putAsync. + +```dart +Get.putAsync(() async { + final prefs = await SharedPreferences.getInstance(); + await prefs.setInt('counter', 12345); + return prefs; +}); +``` + +uso: + +```dart + int count = Get.find().getInt('counter'); + print(count); + // out: 12345 +} +``` + +Para eliminar una instancia de GetX: + +```dart +Get.delete(); +``` + +## Instancing methods + +Although Getx already delivers very good settings for use, it is possible to refine them even more so that it become more useful to the programmer. The methods and it's configurable parameters are: + +- Get.put(): + +```dart +Get.put( + // mandatory: the class that you want to get to save, like a controller or anything + // note: that "S" means that it can be anything + S dependency + + // optional: this is for when you want multiple classess that are of the same type + // since you normally get a class by using Get.find(), + // you need to use tag to tell which instance you need + // must be unique string + String tag, + + // optional: by default, get will dispose instances after they are not used anymore (example, + // the controller of a view that is closed), but you might need that the instance + // to be kept there throughout the entire app, like an instance of sharedPreferences or something + // so you use this + // defaults to false + bool permanent = false, + + // optional: allows you after using an abstract class in a test, replace it with another one and follow the test. + // defaults to false + bool overrideAbstract = false, + + // optional: allows you to create the dependency using function instead of the dependency itself. + InstanceBuilderCallback builder, +) +``` + +- Get.lazyPut: + +```dart +Get.lazyPut( + // mandatory: a method that will be executed when your class is called for the first time + // Example: Get.lazyPut( () => Controller() ) + InstanceBuilderCallback builder, + + // optional: same as Get.put(), it is used for when you want multiple different instance of a same class + // must be unique + String tag, + + // optional: It is similar to "permanent", the difference is that the instance is discarded when + // is not being used, but when it's use is needed again, Get will recreate the instance + // just the same as "SmartManagement.keepFactory" in the bindings api + // defaults to false + bool fenix = false + +) +``` + +- Get.putAsync: + +```dart +Get.putAsync( + + // mandatory: an async method that will be executed to instantiate your class + // Example: Get.putAsync( () async => await YourAsyncClass() ) + AsyncInstanceBuilderCallback builder, + + // optional: same as Get.put(), it is used for when you want multiple different instance of a same class + // must be unique + String tag, + + // optional: same as in Get.put(), used when you need to maintain that instance alive in the entire app + // defaults to false + bool permanent = false +``` + +- Get.create: + +```dart +Get.create( + // required: a function that returns a class that will be "fabricated" every + // time `Get.find()` is called + // Example: Get.create(() => YourClass()) + FcBuilderFunc builder, + // optional: just like Get.put(), but it is used when you need multiple instances + // of a of a same class + // Useful in case you have a list that each item need it's own controller + // needs to be a unique string. Just change from tag to name + String name, + // optional: just like int`Get.put()`, it is for when you need to keep the + // instance alive thoughout the entire app. The difference is in Get.create + // permanent is true by default + bool permanent = true +``` + +### Diferences between methods: + +First, let's of the `fenix` of Get.lazyPut and the `permanent` of the other methods. + +The fundamental difference between `permanent` and `fenix` is how you want to store your instances. +Reinforcing: by default, GetX deletes instances when they are not is use. +It means that: If screen 1 has controller 1 and screen 2 has controller 2 and you remove the first route from stack, (like if you use `Get.off()` or `Get.offName()`) the controller 1 lost it's use so it will be erased. +But if you want to opt to `permanent:true`, then the controller will not be lost in this transition - which is very usefult for services that you want to keep alive thoughout the entire application. +`fenix` in the other hand is for services that you don't worry in losing between screen changes, but when you need that service, you expect that it is alive. So basically, it will dispose the unused controller/service/class, but when you need that, it will "recreate from the ashes" a new instance. + +Proceeding with the differences between methods: + +- Get.put and Get.putAsync follow the same creation order, with the difference that asyn opt for applying a asynchronous method: those two methods create and initialize the instance. That one is inserted directly in the memory, using the internal method `insert` with the parameters `permanent: false` and `isSingleton: true` (this isSingleton parameter only porpuse is to tell if it is to use the dependency on `dependency` or if it is to use the dependency on `FcBuilderFunc`). After that, `Get.find()` is called that immediately initialize the instances that are on memory. + +- Get.create: As the name implies, it will "create" your dependency! Similar to `Get.put()`, it also call the internal method `insert` to instancing. But `permanent` became true and `isSingleton` became false (since we are "creating" our dependency, there is no way for it to be a singleton instace, that's why is false). And because it has `permanent: true`, we have by default the benefit of not losing it between screens! Also, `Get.find()` is not called immediately, it wait to be used in the screen to be called. It is created this way to make use of the parameter `permanent`, since then, worth noticing, `Get.create()` was made with the goal of create not shared instances, but don't get disposed, like for example a button in a listView, that you want a unique instance for that list - because of that, Get.create must be used together with GetWidget. + +- Get.lazyPut: As the name implies, it is a lazy proccess. The instance is create, but it is not called to be used immediately, it remains waiting to be called. Contrary to the other methods, `insert` is not called here. Instead, the instance is inserted in another part of the memory, a part responsable to tell if the instance can be recreated or not, let's call it "factory". If we want to create something to be used later, it will not be mix with things been used right now. And here is where `fenix` magic enters: if you opt to leaving `fenix: false`, and your `smartManagement` are not `keepFactory`, then when using `Get.find` the instance will change the place in the memory from the "factory" to common instance memory area. Right after that, by default it is removed from the "factory". Now, if you opt for `fenix: true`, the instance continues to exist in this dedicated part, even going to the common area, to be called again in the future. + + +## Bindings + +Una de las grandes diferencias de este paquete, tal vez, es la posibilidad de una integración completa de las rutas, gestor de estado y dependencias. + +Cuando se elimina una ruta del stack, todos los controladores, variables e instancias de objetos relacionados con ella se eliminan de la memoria. Si está utilizando stream o timers, se cerrarán automáticamente y no tendrá que preocuparse por nada de eso. + +En la versión 2.10 GetX se implementó por completo la API de bindings. + +Ahora ya no necesita usar el método init. Ni siquiera tiene que escribir sus controladores si no lo desea. Puede iniciar sus controladores y servicios en un lugar apropiado para eso. + +La clase Binding es una clase que desacoplará la inyección de dependencia, al tiempo que vinculará rutas con el gestor de estado y el gestor de dependencias. + +Esto permite conocer qué pantalla se muestra cuando se utiliza un controlador en particular y saber dónde y cómo descartarlo. + +Además, la clase Binding le permitirá tener el control de configuración SmartManager. Puede configurar las dependencias que se organizarán al eliminar una ruta de la pila, o cuando el widget que lo usó se presenta, o ninguno de los dos. Tendrá una gestión inteligente de dependencias que funcione para usted, pero aun así, puede configurarla como desee. + +### Cómo utilizar + +- Crea una clase e implementa Binding + +```dart +class HomeBinding implements Bindings{ +``` + +Su IDE le pedirá automáticamente que anule el método de "dependencies", y solo necesita hacer clic en la lámpara, anular el método e insertar todas las clases que va a utilizar en esa ruta: + +```dart +class HomeBinding implements Bindings{ + @override + void dependencies() { + Get.lazyPut(() => ControllerX()); + Get.lazyPut(()=> Api()); + } +} +``` + +Ahora solo necesita informar su ruta, que utilizará ese binding para establecer la conexión entre el gestor de rutas, las dependencias y los estados. + +- Uso de rutas nombradas: + +```dart +getPages: [ + GetPage(name: '/', page: () => Home(), binding: HomeBinding()), +] +``` + +- Usando rutas normales: + +```dart +Get.to(Home(), binding: HomeBinding()); +``` + +Allí, ya no tiene que preocuparse por la administración de memoria de su aplicación, GetX lo hará por usted. + +La clase Binding se llama cuando se llama una ruta, puede crear un initialBinding en su GetMaterialApp para insertar todas las dependencias que se crearán. + +```dart +GetMaterialApp( + initialBinding: SampleBind(), + home: Home(), +); +``` + +## SmartManagement + +Siempre prefiera usar SmartManagement estándar (full), no necesita configurar nada para eso, GetX ya se lo proporciona de forma predeterminada. Seguramente eliminará todos los controladores en desuso de la memoria, ya que su control refinado elimina la dependencia, incluso si se produce un error y un widget que lo utiliza no se elimina correctamente. + +El modo "full" también es lo suficientemente seguro como para usarlo con StatelessWidget, ya que tiene numerosos callbacks de seguridad que evitarán que un controlador permanezca en la memoria si ningún widget lo está utilizando, y los disposers no son importante aquí. Sin embargo, si le molesta el comportamiento predeterminado, o simplemente no quiere que suceda, GetX ofrece otras opciones más indulgentes para la administración inteligente de la memoria, como SmartManagement.onlyBuilders, que dependerá de la eliminación efectiva de los widgets que estén usando el controller para eliminarlo, y puede evitar que se implemente un controlador usando "autoRemove: false" en su GetBuilder/GetX. + +Con esta opción, solo se eliminarán los controladores iniciados en "init:" o cargados en un enlace con "Get.lazyPut"; si usa Get.put o cualquier otro enfoque, SmartManagement no tendrá permisos para excluir esta dependencia. + +Con el comportamiento predeterminado, incluso los widgets instanciados con "Get.put" se eliminarán, a diferencia de SmartManagement.onlyBuilders. + +SmartManagement.keepFactory es como SmartManagement.full, con una diferencia. SmartManagement.full purga los factories de las premises, de modo que Get.lazyPut() solo podrá llamarse una vez y su factory y sus referencias se autodestruirán. SmartManagement.keepFactory eliminará sus dependencias cuando sea necesario, sin embargo, mantendrá la "forma" de estas, para hacer una igual si necesita una instancia de eso nuevamente. + +En lugar de usar SmartManagement.keepFactory, puede usar Bindings. + +Bindings crea factories transitorios, que se crean en el momento en que hace clic para ir a otra pantalla, y se destruirán tan pronto como ocurra la animación de cambio de pantalla. Es tan poco tiempo que el analizador ni siquiera podrá registrarlo. Cuando navegue de nuevo a esta pantalla, se llamará a una nueva factory temporal, por lo que es preferible usar SmartManagement.keepFactory, pero si no desea crear enlaces o desea mantener todas sus dependencias en el mismo enlace, sin duda te ayudará. Las factories ocupan poca memoria, no tienen instancias, sino una función con la "forma" de esa clase que desea. Esto es muy poco, pero dado que el propósito de esta lib es obtener el máximo rendimiento posible utilizando los recursos mínimos, GetX elimina incluso las factories por defecto. Use el que sea más conveniente para usted. + +- NOTA: NO USE SmartManagement.keepFactory si está utilizando bindings múltiples. Fue diseñado para usarse sin bindings, o con uno único vinculado en el binding inicial de GetMaterialApp. + +- NOTA2: El uso de bindings es completamente opcional, puede usar Get.put() y Get.find() en clases que usan un controlador dado sin ningún problema. + +Sin embargo, si trabaja con Servicios o cualquier otra abstracción, le recomiendo usar binding para una organización más grande. diff --git a/siro_rider/packages/get/documentation/es_ES/route_management.md b/siro_rider/packages/get/documentation/es_ES/route_management.md new file mode 100644 index 0000000..4f5f375 --- /dev/null +++ b/siro_rider/packages/get/documentation/es_ES/route_management.md @@ -0,0 +1,562 @@ +- [Gestión de Rutas](#gestión-de-rutas) + - [¿Cómo utilizarlo](#cómo-utilizarlo) + - [Navegación sin rutas nombradas](#navegación-sin-rutas-nombradas) + - [Navegación con rutas nombradas](#navegación-con-rutas-nombradas) + - [Enviar datos a rutas nombradas](#enviar-datos-a-rutas-nombradas) + - [Enlaces de URL dinámicos](#enlaces-de-url-dinámicos) + - [Middleware](#middleware) + - [Navegación sin contexto](#navegación-sin-contexto) + - [SnackBars](#snackbars) + - [Diálogos](#diálogos) + - [BottomSheets](#bottomsheets) + - [Navegación anidada](#navegación-anidada) + +# Gestión de Rutas + +Cualquier contribución es bienvenida! + +## ¿Cómo utilizarlo + +Agregue esto a su archivo pubspec.yaml: + +```yaml +dependencies: + get: +``` + +Si va a utilizar rutas/snackbars/dialogs/bottomsheets sin contexto, o las APIs de GetX de alto nivel, simplemente debe agregar "Get" antes de su MaterialApp, ¡convertirlo en GetMaterialApp y disfrutar! + +```dart +GetMaterialApp( // Before: MaterialApp( + home: MyHome(), +) +``` + +## Navegación sin rutas nombradas + +Para navegar a una nueva pantalla: + +```dart +Get.to(NextScreen()); +``` + +Para cerrar snackbars, dialogs, bottomsheets o cualquier cosa que normalmente cierre con Navigator.pop(contexto); + +```dart +Get.back(); +``` + +Para ir a la siguiente pantalla, sin opción a volver (util por ejemplo en SplashScreens, LoginScreen, etc.) + +```dart +Get.off(NextScreen()); +``` + +Para ir a la siguiente pantalla y cancelar todas las rutas anteriores (útil en carritos de compras, encuestas y exámenes) + +```dart +Get.offAll(NextScreen()); +``` + +Para navegar a la siguiente ruta y recibir o actualizar datos tan pronto como se regrese de ella: + +```dart +var data = await Get.to(Payment()); +``` + +en la otra pantalla, envíe los datos para la ruta anterior: + +```dart +Get.back(result: 'success'); +``` + +Y luego usarlo: + +ej: + +```dart +if(data == 'success') madeAnything(); +``` + +¿No quieres aprender nuestra sintaxis? + +Simplemente cambie Navigator (mayúsculas) a navigator (minúsculas), y tendrá todas las funciones de la navegación estándar, pero sin tener que usar el contexto. + +Ejemplo: + +```dart +// Default Flutter navigator +Navigator.of(context).push( + context, + MaterialPageRoute( + builder: (BuildContext context) { + return HomePage(); + }, + ), +); + +// Get using Flutter syntax without needing context +navigator.push( + MaterialPageRoute( + builder: (_) { + return HomePage(); + }, + ), +); + +// Get syntax (It is much better, but you have the right to disagree) +Get.to(HomePage()); +``` + +## Navegación con rutas nombradas + +- Si prefiere navegar con rutas nombradas, con GetX también es posible. + +Para navegar a la siguiente pantalla + +```dart +Get.toNamed("/NextScreen"); +``` + +Para navegar y eliminar la pantalla anterior del árbol. + +```dart +Get.offNamed("/NextScreen"); +``` + +Para navegar y eliminar todas las pantallas anteriores del árbol. + +```dart +Get.offAllNamed("/NextScreen"); +``` + +Para definir rutas, use GetMaterialApp: + +```dart +void main() { + runApp( + GetMaterialApp( + initialRoute: '/', + getPages: [ + GetPage(name: '/', page: () => MyHomePage()), + GetPage(name: '/second', page: () => Second()), + GetPage( + name: '/third', + page: () => Third(), + transition: Transition.zoom + ), + ], + ) + ); +} +``` + +Para manejar la navegación a rutas no definidas (error 404), puede definir una página de ruta desconocida en GetMaterialApp. + +```dart +void main() { + runApp( + GetMaterialApp( + unknownRoute: GetPage(name: '/notfound', page: () => UnknownRoutePage()), + initialRoute: '/', + getPages: [ + GetPage(name: '/', page: () => MyHomePage()), + GetPage(name: '/second', page: () => Second()), + ], + ) + ); +} +``` + +### Enviar datos a rutas nombradas + +Envía lo que quieras usando el parámetro arguments. GetX acepta cualquier cosa aquí, ya sea un String, Map, List o incluso una instancia de clase. + +```dart +Get.toNamed("/NextScreen", arguments: 'Get is the best'); +``` + +luego en su clase o controlador: + +```dart +print(Get.arguments); +//print out: Get is the best +``` + +### Enlaces de URL dinámicos + +GetX ofrece URLs dinámicas avanzadas como en la Web. Los desarrolladores web probablemente ya quisieron esta característica en Flutter, y lo más probable es que hayan visto un paquete que promete esta característica y pero que ofrece una sintaxis totalmente diferente a la que una URL tendría en la web, pero GetX lo resuelve. + +```dart +Get.offAllNamed("/NextScreen?device=phone&id=354&name=Enzo"); +``` + +y luego en su clase controller/bloc/stateful/stateless: + +```dart +print(Get.parameters['id']); +// out: 354 +print(Get.parameters['name']); +// out: Enzo +``` + +También puede recibir parámetros nombrados fácilmente: + +```dart +void main() { + runApp( + GetMaterialApp( + initialRoute: '/', + getPages: [ + GetPage( + name: '/', + page: () => MyHomePage(), + ), + GetPage( + name: '/profile/', + page: () => MyProfile(), + ), + //You can define a different page for routes with arguments, and another without arguments, but for that you must use the slash '/' on the route that will not receive arguments as above. + GetPage( + name: '/profile/:user', + page: () => UserProfile(), + ), + GetPage( + name: '/third', + page: () => Third(), + transition: Transition.cupertino + ), + ], + ) + ); +} +``` + +Enviar datos sobre el nombre de la ruta + +```dart +Get.toNamed("/second/34954"); +``` + +Y en la segunda pantalla tome los datos por parámetro + +```dart +print(Get.parameters['user']); +// salida: 34954 +``` + +o envie multiples parametros de la siguiente manera + +```dart +Get.toNamed("/profile/34954?flag=true"); +``` + +En la segunda pantalla tome los parametros como lo haria normalmente + +```dart +print(Get.parameters['user']); +print(Get.parameters['flag']); +// salida: 34954 true +``` + +Y ahora, todo lo que necesita hacer es usar Get.toNamed() para navegar por sus rutas nombradas, sin ningún contexto (puede llamar a sus rutas directamente desde su clase BLoC o Controller), y cuando su aplicación se compila para web, sus rutas aparecerán en la url del navegador <3 + +### Middleware + +Si desea escuchar eventos de GetX para activar acciones, puede usar el routingCallback: + +```dart +GetMaterialApp( + routingCallback: (routing) { + if(routing.current == '/second'){ + openAds(); + } + } +) +``` + +Si no está usando GetMaterialApp, puede usar la API para adjuntar el observador de Middleware. + +```dart +void main() { + runApp( + MaterialApp( + onGenerateRoute: Router.generateRoute, + initialRoute: "/", + navigatorKey: Get.key, + navigatorObservers: [ + GetObserver(MiddleWare.observer), // HERE !!! + ], + ), + ); +} +``` + +Crear la clase MiddleWare: + +```dart +class MiddleWare { + static observer(Routing routing) { + /// You can listen in addition to the routes, the snackbars, dialogs and bottomsheets on each screen. + ///If you need to enter any of these 3 events directly here, + ///you must specify that the event is != Than you are trying to do. + if (routing.current == '/second' && !routing.isSnackbar) { + Get.snackbar("Hi", "You are on second route"); + } else if (routing.current =='/third'){ + print('last route called'); + } + } +} +``` + +Ahora, usa GetX en tu código: + +```dart +class First extends StatelessWidget { + @override + Widget build(BuildContext context) { + return Scaffold( + appBar: AppBar( + leading: IconButton( + icon: Icon(Icons.add), + onPressed: () { + Get.snackbar("hi", "i am a modern snackbar"); + }, + ), + title: Text('First Route'), + ), + body: Center( + child: ElevatedButton( + child: Text('Open route'), + onPressed: () { + Get.toNamed("/second"); + }, + ), + ), + ); + } +} + +class Second extends StatelessWidget { + @override + Widget build(BuildContext context) { + return Scaffold( + appBar: AppBar( + leading: IconButton( + icon: Icon(Icons.add), + onPressed: () { + Get.snackbar("hi", "i am a modern snackbar"); + }, + ), + title: Text('second Route'), + ), + body: Center( + child: ElevatedButton( + child: Text('Open route'), + onPressed: () { + Get.toNamed("/third"); + }, + ), + ), + ); + } +} + +class Third extends StatelessWidget { + @override + Widget build(BuildContext context) { + return Scaffold( + appBar: AppBar( + title: Text("Third Route"), + ), + body: Center( + child: ElevatedButton( + onPressed: () { + Get.back(); + }, + child: Text('Go back!'), + ), + ), + ); + } +} +``` + +## Navegación sin contexto + +### SnackBars + +Para tener simple SnackBar con Flutter, debe obtener el contexto de Scaffold, o debe utilizar una GlobalKey: + +```dart +final snackBar = SnackBar( + content: Text('Hi!'), + action: SnackBarAction( + label: 'I am a old and ugly snackbar :(', + onPressed: (){} + ), +); +// Find the Scaffold in the widget tree and use +// it to show a SnackBar. +Scaffold.of(context).showSnackBar(snackBar); +``` + +Con GetX esto se resume en: + +```dart +Get.snackbar('Hi', 'i am a modern snackbar'); +``` + +Todo lo que tiene que hacer es llamar a Get.snackbar desde cualquier parte de su código y personalizarlo como desee: + +```dart +Get.snackbar( + "Hey i'm a Get SnackBar!", // title + "It's unbelievable! I'm using SnackBar without context, without boilerplate, without Scaffold, it is something truly amazing!", // message + icon: Icon(Icons.alarm), + shouldIconPulse: true, + onTap:(){}, + barBlur: 20, + isDismissible: true, + duration: Duration(seconds: 3), +); + + + ////////// ALL FEATURES ////////// + // Color colorText, + // Duration duration, + // SnackPosition snackPosition, + // Widget titleText, + // Widget messageText, + // bool instantInit, + // Widget icon, + // bool shouldIconPulse, + // double maxWidth, + // EdgeInsets margin, + // EdgeInsets padding, + // double borderRadius, + // Color borderColor, + // double borderWidth, + // Color backgroundColor, + // Color leftBarIndicatorColor, + // List boxShadows, + // Gradient backgroundGradient, + // TextButton mainButton, + // OnTap onTap, + // bool isDismissible, + // bool showProgressIndicator, + // AnimationController progressIndicatorController, + // Color progressIndicatorBackgroundColor, + // Animation progressIndicatorValueColor, + // SnackStyle snackStyle, + // Curve forwardAnimationCurve, + // Curve reverseAnimationCurve, + // Duration animationDuration, + // double barBlur, + // double overlayBlur, + // Color overlayColor, + // Form userInputForm + /////////////////////////////////// +``` + +Si prefiere el snackbar tradicional, o desea personalizarlo desde cero, inclyendo reducirlo a una sola línea de código (dado que Get.snackbar utiliza al menos un título y un mensaje obligatorios), puede usar `Get.rawSnackbar();` que proporciona la API en la que se creó el Get.snackbar. + +### Diálogos + +Para abrir el dialog: + +```dart +Get.dialog(YourDialogWidget()); +``` + +Para abrir un dialog predeterminado: + +```dart +Get.defaultDialog( + onConfirm: () => print("Ok"), + middleText: "Dialog made in 3 lines of code" +); +``` + +También puede usar Get.generalDialog en lugar de showGeneralDialog. + +Para todos los demás dialogs de Flutter, incluidos los cupertinos, puede usar Get.overlayContext en lugar de context, y abrirlo en cualquier parte de su código. + +Para los widgets que no usan Overlay, puede usar Get.context. + +Estos dos contexts funcionarán en el 99% de los casos para reemplazar el context de su UI, excepto en los casos donde inheritedWidget es usado sin un contexto de navegación. + +### BottomSheets + +Get.bottomSheet es como showModalBottomSheet, pero no necesita contexto. + +```dart +Get.bottomSheet( + Container( + child: Wrap( + children: [ + ListTile( + leading: Icon(Icons.music_note), + title: Text('Music'), + onTap: () {} + ), + ListTile( + leading: Icon(Icons.videocam), + title: Text('Video'), + onTap: () {}, + ), + ], + ), + ) +); +``` + +## Navegación anidada + +GetX hizo la navegación anidada de Flutter aún más fácil. + +No necesita el contexto, y encontrará su pila de navegación por Id. + +- NOTA: Crear pilas de navegación paralelas puede ser peligroso. Lo ideal es no usar NestedNavigators o hacerlo con moderación. Si su proyecto lo requiere, continúe, pero tenga en cuenta que mantener múltiples pilas de navegación en la memoria puede no ser una buena idea para el consumo de RAM. + +Mira qué simple es: + +```dart +Navigator( + key: Get.nestedKey(1), // create a key by index + initialRoute: '/', + onGenerateRoute: (settings) { + if (settings.name == '/') { + return GetPageRoute( + page: () => Scaffold( + appBar: AppBar( + title: Text("Main"), + ), + body: Center( + child: TextButton( + color: Colors.blue, + onPressed: () { + Get.toNamed('/second', id:1); // navigate by your nested route by index + }, + child: Text("Go to second"), + ), + ), + ), + ); + } else if (settings.name == '/second') { + return GetPageRoute( + page: () => Center( + child: Scaffold( + appBar: AppBar( + title: Text("Main"), + ), + body: Center( + child: Text("second") + ), + ), + ), + ); + } + } +), +``` diff --git a/siro_rider/packages/get/documentation/es_ES/state_management.md b/siro_rider/packages/get/documentation/es_ES/state_management.md new file mode 100644 index 0000000..cfd3bab --- /dev/null +++ b/siro_rider/packages/get/documentation/es_ES/state_management.md @@ -0,0 +1,601 @@ +- [Gestión del Estado](#gestión-del-estado) + - [Gestor de Estado Simple](#gestor-de-estado-simple) + - [Ventajas](#ventajas) + - [Uso](#uso) + - [Cómo maneja los Controllers](#cómo-maneja-los-controllers) + - [Ya no necesitará StatefulWidgets](#ya-no-necesitará-statefulwidgets) + - [Por qué existe](#por-qué-existe) + - [Otras formas de usarlo](#otras-formas-de-usarlo) + - [ID únicos](#id-únicos) + - [Reactivo STATE_MANAGER](#reactivo-state_manager) + - [Ventajas](#ventajas-1) + - [Uso](#uso-1) + - [Donde se pueden usar .obs](#donde-se-pueden-usar-obs) + - [Nota sobre listas](#nota-sobre-listas) + - [¿Por qué tengo que usar .value](#por-qué-tengo-que-usar-value) + - [Obx()](#obx) + - [Workers](#workers) + - [Mezclando los dos State Managers](#mezclando-los-dos-state-managers) + - [GetBuilder vs GetX vs Obx vs MixinBuilder](#getbuilder-vs-getx-vs-obx-vs-mixinbuilder) + +# Gestión del Estado + +Actualmente hay varios State Managers para Flutter. Sin embargo, con la mayoría de ellos implica utilizar ChangeNotifier para actualizar widgets y este es un enfoque malo y muy malo para el rendimiento de aplicaciones medianas o grandes. Puede verificar en la documentación oficial de Flutter que [ChangeNotifier debe usarse con 1 o un máximo de 2 listeners](https://api.Flutter.dev/Flutter/foundation/ChangeNotifier-class.html), por lo que es prácticamente inutilizable para cualquier aplicación mediana o grande. + +Otros state managers son buenos, pero tienen sus matices: + +- BLoC es muy seguro y eficiente, pero es muy complejo para principiantes, lo que ha impedido que las personas se desarrollen con Flutter. + +- MobX es más fácil que BLoC y reactivo, casi perfecto, diría, pero necesita usar un generador de código, que para aplicaciones grandes, reduce la productividad, ya que necesitará beber muchos cafés hasta que su código esté listo nuevamente después de un `flutter clean` (¡Y esto no es culpa de MobX, sino del codegen que es realmente lento!). + +- Provider usa InheritedWidget para entregar el mismo listener, como una forma de resolver el problema mencionado anteriormente con ChangeNotifier, lo que implica que cualquier acceso a su clase ChangeNotifier debe estar dentro del árbol de widgets debido al contexto necesario para acceder. + +GetX no es mejor ni peor que cualquier otro gestor de estado, pero debe analizar estos puntos, así como los puntos que se mencionan a continuación, para elegir entre usar GetX en forma pura (vanilla) o usarlo junto con otro gestor de estado. + +Definitivamente, GetX no es enemigo de ningún otro gestor de estado, porque GetX es más bien un microframework, no solo un gestor de estado, y se puede usar solo o en combinación con ellos. + +## Gestor de Estado Simple + +GetX tiene un gestor de estado que es extremadamente ligero y fácil de implementar, especialmente para aquellos nuevos en Flutter, que no utiliza ChangeNotifier, y satisface la necesidad, y no causará problemas en aplicaciones grandes. + +### Ventajas + +1. Actualiza solo los widgets necesarios. + +2. No usa changeNotifier, es el gestor de estados que usa menos memoria (cerca de 0mb). + +3. ¡Olvídate de StatefulWidget! Con GetX nunca lo necesitarás. Con los otros state managers, probablemente tendrá que usar un StatefulWidget para obtener la instancia de su Provider,BLoC,MobX Controller, etc. Pero alguna vez se detuvo para pensar que su appBar, su Scaffold y la mayoría de los widgets que están en tu clase son Stateless? Entonces, ¿por qué guardar el estado de una clase completa, si puede guardar solo el estado del widget que es Stateful? GetX también resuelve eso. Crea una clase Stateless, haz todo Stateless. Si necesita actualizar un solo componente, envuélvalo con GetBuilder, y se mantendrá su estado. + +4. ¡Organiza tu proyecto de verdad! Los Controllers no deben estar en su UI, colocar su TextEditController o cualquier controller que utilice dentro de su clase Controller. + +5. ¿Necesita activar un evento para actualizar un widget tan pronto como este se dibuje? GetBuilder tiene la propiedad "initState", al igual que en un StatefulWidget, y puede llamar a eventos desde su Controller, directamente desde él, sin que se coloquen más eventos en su initState. + +6. ¿Necesita activar una acción como cerrar streams, timers, etc.? GetBuilder también tiene la propiedad dispose, donde puede llamar a eventos tan pronto como se destruya ese widget. + +7. Use streams solo si es necesario. Puede usar sus StreamControllers dentro de su Controller normalmente, y usar StreamBuilder también normalmente, pero recuerde, un stream consume una cantidad azonablemente de memoria, la programación reactiva es hermosa, pero no debe abusar de ella. 30 streams abiertos simultáneamente pueden ser peores que un changeNotifier (y changeNotifier es muy malo). + +8. Actualice los widgets sin consumir ram por eso. GetX almacena solo el creator ID de GetBuilder y lo actualiza cuando es necesario. El consumo de memoria del almacenamiento del Get ID en la memoria es muy bajo, incluso para miles de GetBuilders. Cuando crea un nuevo GetBuilder, en realidad está compartiendo el estado de GetBuilder que tiene un creator ID. No se crea un nuevo estado para cada GetBuilder, lo que ahorra MUCHA RAM para aplicaciones grandes. Básicamente, su aplicación será completamente Stateless, y los pocos Widgets que serán Stateful (dentro de GetBuilder) tendrán un solo estado y por lo tanto actualizar uno los actualizará a todos. El estado es solo uno. + +9. GetX es omnisciente y, en la mayoría de los casos, sabe exactamente el momento de sacar un Controller de la memoria. No debe preocuparse por eso, GetX conoce el mejor momento para hacerlo. + +### Uso + +```dart +// Create controller class and extends GetXController +class Controller extends GetXController { + int counter = 0; + void increment() { + counter++; + update(); // use update() to update counter variable on UI when increment be called + } +} +// On your Stateless/Stateful class, use GetBuilder to update Text when increment be called +GetBuilder( + init: Controller(), // INIT IT ONLY THE FIRST TIME + builder: (_) => Text( + '${_.counter}', + ), +) +//Initialize your controller only the first time. The second time you are using ReBuilder for the same controller, do not use it again. Your controller will be automatically removed from memory as soon as the widget that marked it as 'init' is deployed. You don't have to worry about that, Get will do it automatically, just make sure you don't start the same controller twice. +``` + +**¡Listo!** + +- Ya has aprendido a gestionar estados con GetX. + +- Nota: es posible que desee una organización más grande y no usar la propiedad init. Para eso, puede crear una clase y extender la clase Bindings, dentro de ella mencionar los Controllers que necesita crear dentro de esa ruta. Pero los Controllers no se crearán en ese momento, por el contrario, esto será solo una declaración, por lo que, la primera vez que use un Controller, GetX sabrá dónde buscarlo. GetX seguirá siendo lazyLoad y se ocupará de eliminar los controllers cuando ya no sean necesarios. Vea el ejemplo pub.dev para ver cómo funciona. + +Si navega por muchas rutas y necesita datos que estaban en su Controller utilizado previamente, solo necesita usar nuevamente GetBuilder (sin init): + +```dart +class OtherClass extends StatelessWidget { + @override + Widget build(BuildContext context) { + return Scaffold( + body: Center( + child: GetBuilder( + builder: (s) => Text('${s.counter}'), + ), + ), + ); + } +``` + +Si necesita usar su Controller en muchos otros lugares y fuera de GetBuilder, simplemente cree un get en su Controller y obténgalo fácilmente. (o use `Get.find ()`) + +```dart +class Controller extends GetXController { + + /// You do not need that. I recommend using it just for ease of syntax. + /// with static method: Controller.to.increment(); + /// with no static method: Get.find().increment(); + /// There is no difference in performance, nor any side effect of using either syntax. Only one does not need the type, and the other the IDE will autocomplete it. + static Controller get to => Get.find(); // add this line + + int counter = 0; + void increment() { + counter++; + update(); + } +} +``` + +Y luego puede acceder a su Controller directamente, de esa manera: + +```dart +FloatingActionButton( + onPressed: () { + Controller.to.increment(), + } // This is incredibly simple! + child: Text("${Controller.to.counter}"), +), +``` + +Cuando presiona FloatingActionButton, todos los widgets que escuchan la variable 'counter' se actualizarán automáticamente. + +### Cómo maneja los Controllers + +Digamos que tenemos esto: + +`Class a => Class B (has controller X) => Class C (has controller X)` + +En la clase A, el Controller aún no está en la memoria, porque aún no lo ha utilizado (GetX es lazyLoad). En la clase B usaste el Controller y entró en la memoria. En la clase C usó el mismo Controller que en la clase B, GetX compartirá el estado del Controller B con el Controller C, y el mismo Controller todavía está en la memoria. Si cierra la pantalla C y la pantalla B, GetX eliminará automáticamente Controller X de la memoria y liberará recursos, porque la clase A no está utilizando Controller. Si navega nuevamente hacia B, Controller X ingresará nuevamente a la memoria, si en lugar de ir a la clase C, regresa nuevamente a la clase A, GetX eliminará el Controller de la misma manera. Si la clase C no usó el Controller, y usted sacó la clase B de la memoria, ninguna clase estaría usando Controller X y de la misma manera se eliminaría. La única excepción que puede interferir con GetX es si elimina B de la ruta de forma inesperada e intenta utilizar el Controller en C. En este caso, se eliminó el creator ID del Controller que estaba en B y GetX se programó para eliminar de la memoria cada controller que no tiene creator ID. Si tiene la intención de hacer esto, agregue el indicador "autoRemove: false" al GetBuilder de clase B y use "adoptID = true;" en GetBuilder de la clase C. + +### Ya no necesitará StatefulWidgets + +Usar StatefulWidgets significa almacenar el estado de pantallas enteras innecesariamente, incluso si necesita reconstruir mínimamente un widget, lo incrustará en un Consumer/Observer/BlocProvider/GetBuilder/GetX/Obx, que será será también otro StatefulWidget. + +La clase StatefulWidget es una clase más grande que StatelessWidget, que asignará más RAM, y esto puede no hacer una diferencia significativa entre una o dos clases, ¡pero sin duda lo hará cuando tenga 100 de ellas! +A menos que necesite usar un mixin, como TickerProviderStateMixin, será totalmente innecesario usar un StatefulWidget con GetX. + +Puede llamar a todos los métodos de un StatefulWidget directamente desde un GetBuilder. Si necesita llamar al método initState() o dispose(), por ejemplo, puede llamarlos directamente; + +```dart +GetBuilder( + initState: (_) => Controller.to.fetchApi(), + dispose: (_) => Controller.to.closeStreams(), + builder: (s) => Text('${s.username}'), +), +``` + +Un enfoque mucho mejor que esto es utilizar el método onInit() y onClose() directamente desde su Controller. + +```dart +@override +void onInit() { + fetchApi(); + super.onInit(); +} +``` + +- NOTA: Si desea iniciar un método en el momento en que se llama al Controller por primera vez, NO NECESITA usar constructores para esto, de hecho, usando un paquete orientado al rendimiento como GetX, esto sería casi una mala práctica, debido a que se desvía de la lógica en la que los controllers son creados o asignados (si crea una instancia de este controller, se llamará al constructor inmediatamente, completará un Controller antes de que se use, estará asignando memoria sin ser usado, esto definitivamente perjudica los principios de esta biblioteca). Los métodos onInit(); y onClose(); fueron creados para esto, se los llamará cuando se cree el controller, o se use por primera vez, dependiendo de si está utilizando GetX.lazyPut o no. Si desea, por ejemplo, hacer una llamada a su API para llenar datos, puede olvidarse del viejo método initState/dispose, simplemente inicie su llamada a la API en onInit y si necesita ejecutar algún comando como cerrar streams, use onClose() para eso. + +### Por qué existe + +El propósito de este paquete es precisamente brindarle una solución completa para la navegación de rutas, la gestión de dependencias y de estados, utilizando la menor cantidad de dependencias posibles, con un alto grado de desacoplamiento. GetX se acopla internamente a todas las API de Flutter de alto y bajo nivel, para garantizar que trabaje con el menor acoplamiento posible. Centralizamos todo en un solo paquete, para garantizar que no tenga ningún otro tipo de acoplamiento en su proyecto. De esa manera, puede poner solo widgets en su vista y dejar libre la parte de su equipo que trabaja con la lógica de negocios, sin depender de ningún elemento de la vista. Esto proporciona un entorno de trabajo mucho más limpio y ordenado, de modo tal que parte de su equipo trabajará solo con widgets, sin preocuparse por tener que enviar datos a su Controller, mientras la otra parte de su equipo trabajará solo con lógica de negocios, sin depender de ningún elemento de la UI. + +Entonces, para simplificar esto: + +No necesita llamar a métodos en initState y enviarlos por parámetro a su Controller, ni usar un constructor Controller. Para eso tiene el método onInit() que se llamará en el momento adecuado para que sus servicios sean iniciados. No necesita llamar a dispose(), dado que dispone del método onClose() que se llamará en el momento exacto en que su Controller ya no se necesita, y se eliminará de la memoria. De esa manera, deje las vistas solo para widgets, y abstenerse de incluír cualquier tipo de lógica de negocios. + +No llame a un método dispose() dentro de GetXController, no hará nada, recuerde que Controller no es un widget, no debe "eliminarlo" y GetX lo eliminará de forma automática e inteligente de la memoria. Si utilizó algún stream en él y desea cerrarlo, simplemente insértelo en el método de cierre. + +Ejemplo: + +```dart +class Controller extends GetXController { + StreamController user = StreamController(); + StreamController name = StreamController(); + + /// close stream = onClose method, not dispose. + @override + void onClose() { + user.close(); + name.close(); + super.onClose(); + } +} +``` + +Ciclo de vida del Controller: + +- onInit() donde se crea. +- onClose() donde está cerrado para cualquier tipo de modificación en preparación para ser removido. +- deleted: no tiene acceso a esta API porque literalmente el Controller está eliminando de la memoria, sin dejar rastro (literal). + +### Otras formas de usarlo + +Puede usar la instancia de Controller directamente en el value de GetBuilder: + +```dart +GetBuilder( + init: Controller(), + builder: (value) => Text( + '${value.counter}', //here + ), +), +``` + +También puede necesitar una instancia de su Controller fuera de su GetBuilder, y puede usar estos enfoques para lograr esto: + +```dart +class Controller extends GetXController { + static Controller get to => Get.find(); +[...] +} +// on you view: +GetBuilder( + init: Controller(), // use it only first time on each controller + builder: (_) => Text( + '${Controller.to.counter}', //here + ) +), +``` + +o + +```dart +class Controller extends GetXController { + // static Controller get to => Get.find(); // with no static get +[...] +} +// on stateful/stateless class +GetBuilder( + init: Controller(), // use it only first time on each controller + builder: (_) => Text( + '${Get.find().counter}', //here + ), +), +``` + +- Puede utilizar enfoques "no canónicos" para hacer esto. Si está utilizando algún otro gestor de dependencias, como get_it, modular, etc., y solo desea entregar la instancia de Controller, puede hacer esto: + +```dart +Controller controller = Controller(); +[...] +GetBuilder( + init: controller, //here + builder: (_) => Text( + '${controller.counter}', // here + ), +), +``` + +### ID únicos + +Si desea refinar el control de actualización de widgets con GetBuilder, puede asignarles ID únicos: + +```dart +GetBuilder( + id: 'text' + init: Controller(), // use it only first time on each controller + builder: (_) => Text( + '${Get.find().counter}', //here + ), +), +``` + +Y actualízalo de esta forma: + +```dart +update(['text']); +``` + +También puede imponer condiciones para la actualización: + +```dart +update(['text'], counter < 10); +``` + +GetX hace esto automáticamente y solo reconstruye el widget que usa la variable exacta que se modificó, si cambia una variable a la misma que la anterior y eso no implica un cambio de estado, GetX no reconstruirá el widget para ahorrar memoria y ciclos de CPU (ej. si se muestra 3 en pantalla y la variable cambia a 3 nuevamente, en la mayoría de los gestores de estados, esto provocará una nueva reconstrucción, pero con GetX el widget solo se reconstruirá si efectivamente su estado ha sido modificado). + +## Reactivo STATE_MANAGER + +La programación reactiva puede alienar a muchas personas porque se dice que es complicada. GetX convierte la programación reactiva en algo tan simple que puede ser aprendido y utilizado por aquellos que comenzaron en ese mismo momento en Flutter. No, no necesitará crear StreamControllers. Tampoco necesitará crear un StreamBuilder para cada variable. No necesitará crear una clase para cada estado. No necesitará crear un get para un valor inicial. La programación reactiva con GetX es tan fácil como usar setState (¡o incluso más fácil!). + +Imaginemos que tiene una variable "name" y desea que cada vez que la modifique, todos los widgets que la usan cambien automáticamente. + +Ej. esta es tu variable "name": + +```dart +var name = 'Jonatas Borges'; +``` + +Para que sea observable, solo necesita agregar ".obs" al final: + +```dart +var name = 'Jonatas Borges'.obs; +``` + +Esto raya en lo absurdo cuando se trata de practicidad. ¿Qué hicimos, debajo del capó? Creamos un stream de Strings, asignamos el valor inicial "Jonatas Borges", advertimos a todos los widgets que usan "Jonatas Borges" que ahora pertenecen a esta variable, y cuando se modifica, ellos también lo harán. Esta es la magia de GetX, que solo Dart nos permite hacer. + +De acuerdo, pero como sabemos, un widget solo se puede modificar si está dentro de una función, porque las clases estáticas no tienen el poder de "auto-change". Tendrá que crear un StreamBuilder, suscribirse para escuchar esta variable y crear una "cascada" de StreamBuilder si desea cambiar multiples variables en el mismo scope, ¿verdad? +No, no necesitas un StreamBuilder, pero tienes razón sobre las clases estáticas. + +Bueno, en la vista, generalmente tenemos mucho boilerplate cuando queremos cambiar un widget específico. Con GetX también puedes olvidarte de esto. ¿StreamBuilder? ¿initialValue? ¿builder? No, solo necesitas jugar con esta variable dentro de un widget Obx. + +```dart +Obx(() => Text (controller.name)); +``` + +¿Qué necesitas memorizar? "Obx(() =>" + +Simplemente está pasando ese widget a través de una función de flecha en un Obx. Obx es inteligente, y solo se cambiará si se modifica el valor de "name". Si el nombre es "John" y usted lo cambia "John", no tendrá ningún cambio en la pantalla, y Obx simplemente ignorará este cambio y no reconstruirá ningún widget, para ahorrar recursos. ¿No es increíble? + +¿Qué pasa si tengo 5 variables observables dentro de un Obx? Se actualizará cuando se modifique alguna de ellos. Y si tengo 30 variables en una clase, cuando actualizo una, ¿actualizará todas las variables que están en esa clase? No, solo el widget específico que usa esa variable. Y si ametrallo mi variable observable mil millones de veces con el mismo valor, ¿me congelaré en la pantalla para reconstrucciones innecesarias? No, GetX solo actualiza la pantalla cuando la variable cambia en la pantalla, si la pantalla sigue siendo la misma, no reconstruirá nada. + +### Ventajas + +GetBuilder está dirigido precisamente al control de múltiples estados. Imagine que agregó 30 productos a un carrito, hace clic en eliminar uno, al mismo tiempo que se actualiza la lista, se actualiza el precio y la insignia en el carrito de compras a un número menor. Este tipo de enfoque hace que GetBuilder sea superior, porque agrupa estados y los cambia todos a la vez sin ninguna "lógica computacional" para eso. GetBuilder se creó con este tipo de situación en mente, ya que para un cambio de estado efímero, puede usar setState y no necesitaría un gestor de estado. Sin embargo, hay situaciones en las que solo desea que el widget donde una determinada variable ha sido modificada sea reconstruida, y esto es lo que GetX hace con un dominio nunca antes visto. + +De esa manera, si desea un controlador individual, puede asignar un ID o usar GetX. Esto depende de usted, recordando que cuantos más widgets "individuales" tenga, más se destacará el rendimiento de GetX, mientras que el rendimiento de GetBuilder debería ser superior cuando haya un cambio múltiple de estado. + +Puede usar ambos en cualquier situación, pero si desea ajustar su aplicación al máximo rendimiento posible, diría que: + +- si sus variables se cambian en diferentes momentos, use GetX, porque no hay competencia para ello cuando el tema es para reconstruir solo lo que es necesario, +- si no necesita ID únicos, porque todas sus variables cambiarán cuando realice una acción, use GetBuilder, porque es un simple actualizador de estado en bloques, hecho en unas pocas líneas de código, para que haga exactamente lo que promete hacer: actualizar el estado en bloques. No hay forma de comparar RAM, CPU o cualquier otra cosa, desde un gestor de estado gigante a un simple StatefulWidget (como GetBuilder) que se actualiza cuando se llama a update(). Se hizo de una manera simple, para involucrar la menor lógica computacional, para cumplir con un solo propósito y consumiendo la menor cantidad de recursos posibles. + +Si quieres un poderoso gestor de estado, puedes ir sin temor a GetX. No funciona con variables, pero fluye, todo lo que contiene son streams bajo el capó. Puede usar rxDart junto con él, porque todo es streams, puede escuchar el evento de cada "variable", porque todo en él es streams, es literalmente BLoC, más fácil que MobX, y sin generador de código o decoraciones. + +Si quieres poder, GetX te ofrece el gestor de estado más avanzado que puedas tener. + +GetX fue construido 100% basado en Streams, y le brinda toda la potencia de fuego que BLoC le brindó, con una instalación más fácil que al de MobX. + +Sin decoraciones, puede convertir cualquier cosa en Observable con solo un ".obs". + +Máximo rendimiento: además de tener un algoritmo inteligente para una reconstrucción mínima, GetX utiliza comparadores para asegurarse de que el estado realmente haya cambiado. Si experimenta algún error en su aplicación y envía un cambio de estado duplicado, GetX se asegurará de que su aplicación no se colapse. + +El estado solo cambia si los valores son modificados. Esa es la principal diferencia entre GetX y usar Computed de MobX. Al unir dos observables, cuando se cambia uno, la audiencia de ese observable cambiará. Con GetX, si une dos variables (lo cual sería innecesario), GetX (similar a Observer) solo cambiará si implica un cambio de estado real. + +### Uso + +Tienes 3 formas de convertir una variable en observable. + +El primero es usar Rx{Type}. + +```dart +var count = RxString(); +``` + +El segundo es usar Rx y escribirlo con `Rx` + +```dart +var count = Rx(); +``` + +El tercer enfoque, más práctico, fácil e increíble, es simplemente agregar un .obs a su variable. + +```dart +var count = 0.obs; + +// or Rxint count = 0.obs; +// or Rx count = 0.obs; +``` + +Como sabemos, Dart ahora se dirige hacia el null safety. Con eso es una buena idea, de ahora en adelante, que comience a usar sus variables siempre con un valor inicial. + +Transformar una variable en observable con un valor inicial con GetX es el enfoque más simple y práctico que existe actualmente en Flutter. Literalmente agregará un ".obs" al final de su variable, y eso es todo, lo ha hecho observable, y su valor será el valor inicial, ¡esto es fantástico! + +Puede agregar variables, y si desea escribir un widget que le permita obtener su controlador dentro, solo necesita usar el widget GetX en lugar de Obx + +```dart +final count1 = 0.obs; +final count2 = 0.obs; +int get sum => count1.value + count2.value; +``` + +```dart +GetX( + builder: (value) { + print("count 1 rebuild"); + return Text('${value.count1.value}'); + }, +), +GetX( + builder: (_) { + print("count 2 rebuild"); + return Text('${_.count2.value}'); + }, +), +GetX( + builder: (_) { + print("count 3 rebuild"); + return Text('${_.sum}'); + }, +), +``` + +Si incrementamos el número de counter1, solo se reconstruyen el counter1 y el counter3, porque el counter1 ahora tiene un valor de 1 y 1 + 0 = 1, cambiando el valor de la suma. + +Si cambiamos el counter2, solo se reconstruyen el counter2 y 3, porque el valor de 2 ha cambiado y el resultado de la suma ahora es 2. + +Si agregamos el número 1 para counter1, que ya contiene 1, no se reconstruye ningún widget. Si agregamos un valor de 1 para el counter1 y un valor de 2 para el counter2, solo se reconstruirán 2 y 3, porque GetX además de cambiar solo lo que es necesario, evita la duplicación de eventos. + +- NOTA: Por defecto, el primer evento permitirá la reconstrucción incluso si es igual. Creamos este comportamiento debido a variables dualistas, como Boolean. + +Imaginemos que hiciste esto: + +```dart +var isLogged = false.obs; +``` + +y luego verifica si un usuario ha iniciado sesión para activar un evento en "ever". + +```dart +onInit(){ + ever(isLogged, fireRoute); + isLogged.value = await Preferences.hasToken(); +} + +fireRoute(logged) { + if (logged) { + Get.off(Home()); + } else { + Get.off(Login()); + } +} +``` + +si hasToken fuera falso, no habría cambios en isLogged, por lo que nunca se llamaría. Para evitar este tipo de comportamiento, el primer cambio a un observable siempre desencadenará un evento, incluso si es el mismo. + +Puede eliminar este comportamiento si lo desea, utilizando: +`isLogged.firstRebuild = false;` + +Además, GetX proporciona control de estado refinado. Puede condicionar un evento (como agregar un objeto a una lista), en una determinada condición: + +```dart +list.addIf(item < limit, item); +``` + +Sin decoraciones, sin un generador de código, sin complicaciones, GetX cambiará la forma en que administra sus estados en Flutter, y eso no es una promesa, ¡es una certeza! + +¿Conoces el counter de Flutter? Su clase de controlador podría verse así: + +```dart +class CountCtl extends GetxController { + final count = 0.obs; +} +``` + +Con un simple: + +```dart +ctl.count.value++ +``` + +Puede actualizar la variable de contador en su IU, independientemente de dónde esté almacenada. + +### Donde se pueden usar .obs + +Puedes transformar cualquier cosa en obs: + +```dart +class RxUser { + final name = "Camila".obs; + final age = 18.obs; +} + +class User { + User({String name, int age}); + final rx = RxUser(); + + String get name => rx.name.value; + set name(String value) => rx.name.value = value; + + int get age => rx.age.value; + set age(int value) => rx.age.value = value; +} +``` + +```dart +void main() { + final user = User(); + print(user.name); + user.age = 23; + user.rx.age.listen((int age) => print(age)); + user.age = 24; + user.age = 25; +} +___________ +out: +Camila +23 +24 +25 +``` + +### Nota sobre listas + +Trabajar con listas usando GetX es lo mejor y lo más divertido del mundo. Son completamente observables como lo son los objetos dentro de él. De esa manera, si agrega un valor a una lista, reconstruirá automáticamente los widgets que lo usan. + +Tampoco necesita usar ".value" con las listas, la increíble api de Dart nos permitió eliminar eso, los tipos primitivos desafortunados como String e int no se pueden extender, haciendo que el uso de .value sea obligatorio, pero eso no será un problema si trabajas con gets y setters para estos. + +```dart +final list = List().obs; +``` + +```dart +ListView.builder ( + itemCount: list.length +) +``` + +No tiene que trabajar con Sets si no lo desea. puede usar la api "assign" y "assignAll". + +La API "assign" borrará su lista y agregará un solo objeto, con el que quiere comenzar allí. + +La API "assignAll" borrará la lista existente y agregará cualquier objeto iterable que le inyecte. + +### ¿Por qué tengo que usar .value + +Podríamos eliminar la obligación de usar 'value' para String e int con una simple decoración y generador de código, pero el propósito de esta biblioteca es, precisamente, no necesitar ninguna dependencia externa. Ofrecer un entorno listo para la programación, que incluya lo esencial (gestión de rutas, dependencias y estados), de una manera simple, ligera y de gran rendimiento sin necesidad de ningún otro paquete externo. Literalmente, agrega GetX a su pubspec y puede comenzar a programar. + +Todas las soluciones incluidas por defecto, desde gestión de rutas a gestión de estádo, apuntan a la facilidad, la productividad y el rendimiento. El peso total de esta biblioteca es menor que el de un solo gestor de estado, aunque es una solución completa, y eso es lo que debe comprender. + +Si le molesta el ".value" y, como además si se trata de un generador de código, MobX ya es una gran alternativa, puede simplemente usarlo junto con GetX. + +Para aquellos que desean agregar una sola dependencia en pubspec y comenzar a programar sin preocuparse de que la versión de un paquete sea incompatible con otra, o si el error de una actualización de estado proviene de gestor de estado o dependencia, o aún, no quieren preocuparse por la disponibilidad de controladores, ya sea literalmente "solo programación", GetX es simplemente perfecto. + +Si no tiene ningún problema con el generador de código de MobX, o no tiene ningún problema con el boilerplate de BLoC, simplemente puede usar GetX para las rutas y olvidar que incluye un gestor de estado. GetX, SEM y RSM nacieron por necesidad, mi empresa tenía un proyecto con más de 90 controladores, y el generador de código tardó más de 30 minutos en completar sus tareas después de un Flutter Clean en una máquina razonablemente buena. Si su proyecto tiene 5, 10, 15 controladores, cualquier gestor de estado te vendrá bien. Si tiene un proyecto absurdamente grande y el generador de código es un problema para usted, se le ha otorgado esta solución. + +Obviamente, si alguien quiere contribuir al proyecto y crear un generador de código, o algo similar, lo añadiré a este archivo como una alternativa, mi necesidad no es la necesidad de todos los desarrolladores, pero lo que ahora digo es que hay buenas soluciones que ya hacen eso, como MobX. + +### Obx() + +El Typing en GetX usando Bindings es innecesario. Puede usar el widget Obx (en lugar de GetX), que solo recibe la función anónima que crea un widget. + +Obviamente, si no usa un tipo, necesitará tener una instancia de su controlador para usar las variables, o usar `Get.find ()` .value o Controller.to.value para recuperar el valor. + +### Workers + +Los workers lo ayudarán, activando callbacks específicos cuando ocurra un evento. + +```dart +/// Called every time the variable $_ is changed +ever(count1, (_) => print("$_ has been changed")); + +/// Called only first time the variable $_ is changed +once(count1, (_) => print("$_ was changed once")); + +/// Anti DDos - Called every time the user stops typing for 1 second, for example. +debounce(count1, (_) => print("debouce$_"), time: Duration(seconds: 1)); + +/// Ignore all changes within 1 second. +interval(count1, (_) => print("interval $_"), time: Duration(seconds: 1)); +``` + +- ever: se llama cada vez que se cambia su variable. Eso es. + +- once: se llama solo la primera vez que se ha cambiado la variable. + +- debounce: es muy útil en las funciones de búsqueda, donde solo desea que se llame a la API cuando el usuario termina de escribir. Si el usuario escribe "JONNY", tendrá 5 búsquedas en las API, por la letra J, O, N, N e Y. Con GetX esto no sucede, porque tendrá un worker "debounce" que solo se activará al final de la escritura. + +- interval: es diferente del debouce. Con debouce si el usuario realiza 1000 cambios en una variable dentro de 1 segundo, enviará solo el último después del timer estipulado (el valor predeterminado es 800 milisegundos). En cambio, el interval ignorará todas las acciones del usuario durante el período estipulado. Si envía eventos durante 1 minuto, 1000 por segundo, la función antirrebote solo le enviará el último, cuando el usuario deje de enviar eventos. Interval entregará eventos cada segundo, y si se establece en 3 segundos, entregará 20 eventos ese minuto. Esto se recomienda para evitar abusos, en funciones en las que el usuario puede hacer clic rápidamente en algo y obtener alguna ventaja (imagine que el usuario puede ganar monedas haciendo clic en algo, si hace clic 300 veces en el mismo minuto, tendría 300 monedas, usando el interval, puede establecer un time frame de 3 segundos, e incluso luego hacer clic 300 o mil veces, el máximo que obtendría en 1 minuto sería 20 monedas, haciendo clic 300 o 1 millón de veces). El debouce es adecuado para anti-DDos, para funciones como la búsqueda donde cada cambio en onChange provocaría una consulta en su API. Debounce esperará a que el usuario deje de escribir el nombre para realizar la solicitud. Si se usara en el escenario de monedas mencionado anteriormente, el usuario solo ganaría 1 moneda, ya que solo se ejecuta cuando el usuario "hace una pausa" durante el tiempo establecido. + +- NOTE: Los Workers siempre deben usarse al iniciar un controlador o clase, por lo que siempre debe estar en onInit (recomendado), Class Constructor o initState de un StatefulWidget (esta práctica no se recomienda en la mayoría de los casos, pero no debería tener efectos secundarios). + +## Mezclando los dos State Managers + +Algunas personas abrieron una feature request, ya que querían usar solo un tipo de variable reactiva, y la otra mecánica, y necesitaban insertar un Obx en un GetBuilder para esto. Pensando en ello, se creó MixinBuilder. Permite cambios reactivos cambiando las variables ".obs" y actualizaciones mecánicas a través de update(). Sin embargo, de los 4 widgets, es el que consume más recursos, ya que además de tener una suscripción para recibir eventos de cambio de sus hijos, se suscribe al método update de su controlador. + +Extender GetxController es importante, ya que tienen ciclos de vida y pueden "iniciar" y "finalizar" eventos en sus métodos onInit() y onClose(). Puede usar cualquier clase para esto, pero le recomiendo que use la clase GetxController para colocar sus variables, sean observables o no. + +## GetBuilder vs GetX vs Obx vs MixinBuilder + +En una década trabajando con programación pude aprender algunas lecciones valiosas. + +Mi primer contacto con la programación reactiva fue tan "guau, esto es increíble" y, de hecho, la programación reactiva es increíble. + +Sin embargo, no es adecuado para todas las situaciones. A menudo, todo lo que necesita es cambiar el estado de 2 o 3 widgets al mismo tiempo, o un cambio de estado efímero, en cuyo caso la programación reactiva no es mala, pero no es apropiada. + +La programación reactiva tiene un mayor consumo de RAM que se puede compensar con el workflow individual, lo que garantizará que solo se reconstruya un widget y cuando sea necesario, pero crear una lista con 80 objetos, cada uno con varios streams no es una buena idea. Abra el dart inspector y compruebe cuánto consume un StreamBuilder, y comprenderá lo que estoy tratando de decirle. + +Con eso en mente, creé el Simple State Manager. Es simple, y eso es exactamente lo que debe exigirle: actualizar el estado en bloques de una manera simple y de la manera más económica. + +GetBuilder es muy económico en RAM, y es difícil que haya un enfoque más económico que él (al menos no puedo imaginar uno, si existe, háganoslo saber). + +Sin embargo, GetBuilder sigue siendo un gestor de estado mecánico, debe llamar a update() al igual que necesitaría llamar a notifyListeners() con Provider. + +Hay otras situaciones, en las que la programación reactiva es realmente interesante, y no trabajar con ella es lo mismo que reinventar la rueda. Con eso en mente, GetX fue creado para proporcionar todo lo más moderno y avanzado en un gestor de estado. Actualiza solo lo necesario y solo si es necesario, si tiene un error y envía 300 cambios de estado simultáneamente, GetX lo filtrará y actualizará la pantalla solo si el estado realmente fue modificado. + +GetX es aún más económico que cualquier otro gestor de estado reactivo, pero consume un poco más de RAM que GetBuilder. Pensando en ello y con el objetivo de maximizar el consumo de recursos es que se creó Obx. A diferencia de GetX y GetBuilder, no podrá inicializar un controlador dentro de un Obx, es solo un Widget con una stream suscription que recibe eventos de cambio de sus children, eso es todo. Es más económico que GetX, pero pierde con GetBuilder, lo que era de esperar, ya que es reactivo, y GetBuilder tiene el enfoque más simplista que existe, de almacenar el código hash de un widget y su StateSetter. Con Obx no necesita escribir su tipo de controlador, y puede escuchar el cambio desde varios controladores diferentes, pero debe inicializarse antes, ya sea utilizando el enfoque de ejemplo al comienzo de este archivo o utilizando la clase Bindings. diff --git a/siro_rider/packages/get/documentation/fr_FR/dependency_management.md b/siro_rider/packages/get/documentation/fr_FR/dependency_management.md new file mode 100644 index 0000000..be22293 --- /dev/null +++ b/siro_rider/packages/get/documentation/fr_FR/dependency_management.md @@ -0,0 +1,383 @@ +# Gestion des dépendances +- [Gestion des dépendances](#Gestion-des-dépendances) + - [Instanciation des methodes](#Instanciation-des-methodes) + - [Get.put()](#getput) + - [Get.lazyPut](#getlazyput) + - [Get.putAsync](#getputasync) + - [Get.create](#getcreate) + - [Utilisation de méthodes/classes instanciées](#utilisation-de-mthodes-classes-instancies) + - [Différences entre les méthodes](#differences-entre-les-methodes) + - [Bindings](#bindings) + - [Classe Bindings](#classe-bindings) + - [BindingsBuilder](#bindingsbuilder) + - [SmartManagement](#smartmanagement) + - [Comment changer](#comment-changer) + - [SmartManagement.full](#smartmanagementfull) + - [SmartManagement.onlyBuilders](#smartmanagementonlybuilders) + - [SmartManagement.keepFactory](#smartmanagementkeepfactory) + - [Comment Bindings fonctionne sous le capot](#comment-bindings-fonctionne-sous-le-capot) + - [Notes](#notes) + +Get a un gestionnaire de dépendances simple et puissant qui vous permet de récupérer la même classe que votre Bloc ou Controller avec une seule ligne de code, pas de context Provider, pas d' inheritedWidget: + +```dart +Controller controller = Get.put(Controller()); // Au lieu de Controller controller = Controller(); +``` + +Au lieu d'instancier votre classe dans la classe que vous utilisez, vous l'instanciez dans l'instance Get, qui la rendra disponible dans toute votre application. +Vous pouvez donc utiliser votre contrôleur (ou classe Bloc) normalement + +- Note: Si vous utilisez le gestionnaire d'état de Get, faites plus attention à l'API [Bindings] (# bindings), qui facilitera la connexion de votre vue à votre contrôleur. +- Note²: La gestion des dépendances est découplée des autres parties du package, donc si, par exemple, votre application utilise déjà un gestionnaire d'état (n'importe lequel, peu importe), vous n'avez pas besoin de changer cela, vous pouvez utiliser ce manager d'injection de dépendance sans aucun problème. + +## Instanciation des methodes +Les méthodes et leurs paramètres configurables sont: + +### Get.put() + +La manière la plus courante d'insérer une dépendance. Bon pour les contrôleurs de vos vues par exemple. + +```dart +Get.put(SomeClass()); +Get.put(LoginController(), permanent: true); +Get.put(ListItemController, tag: "un String unique"); +``` + +Ce sont toutes les options que vous pouvez définir lorsque vous utilisez put: +```dart +Get.put( + // obligatoire: la classe que vous voulez que get enregistre, comme un 'controler' ou autre + // note: "S" signifie que ca peut etre une classe de n'importe quel type + S dependency + + // optionnel: c'est pour quand vous voulez plusieurs classes qui sont du même type + // puisque vous obtenez normalement une classe en utilisant Get.find(), + // vous devez utiliser ce tag pour indiquer de quelle instance vous avez besoin + // doit être un String unique + String tag, + + // optionnel: par défaut, get supprimera les instances une fois qu'elles ne seront plus utilisées (exemple, + // le contrôleur d'une vue qui est fermée), mais vous pourriez avoir besoin que l'instance + // soit conservée dans toute l'application, comme une instance de sharedPreferences ou quelque chose du genre + // donc vous utilisez ceci + // équivaut à false par défaut + bool permanent = false, + + // facultatif: permet après avoir utilisé une classe abstraite dans un test, de la remplacer par une autre et de suivre le test. + // équivaut à false par défaut + bool overrideAbstract = false, + + // facultatif: vous permet de créer la dépendance en utilisant la fonction au lieu de la dépendance elle-même. + // ce n'est pas couramment utilisé + InstanceBuilderCallback builder, +) +``` + +### Get.lazyPut +Il est possible de lazyLoad une dépendance afin qu'elle ne soit instanciée que lorsqu'elle est utilisée. Très utile pour les classes qui demandent beaucoup de ressources ou si vous souhaitez instancier plusieurs classes en un seul endroit (comme dans une classe Bindings) et que vous savez que vous n'utiliserez pas cette classe à ce moment-là. + +```dart +/// ApiMock ne sera appelé que lorsque quelqu'un utilise Get.find pour la première fois +Get.lazyPut(() => ApiMock()); + +Get.lazyPut( + () { + // ... some logic if needed + return FirebaseAuth(); + }, + tag: Math.random().toString(), + fenix: true +) + +Get.lazyPut(() => Controller() ) +``` + +Ce sont toutes les options que vous pouvez définir lors de l'utilisation de lazyPut: +```dart +Get.lazyPut( + // obligatoire: une méthode qui sera exécutée lorsque votre classe sera appelée pour la première fois + InstanceBuilderCallback builder, + + // facultatif: identique à Get.put(), il est utilisé lorsque vous voulez plusieurs instances différentes d'une même classe + // doit être unique + String tag, + + // facultatif: cela est similaire à "permanent", la différence est que l'instance est supprimée lorsqu'elle + // n'est pas utilisée, mais lorsqu'elle est à nouveau nécessaire, Get recrée l'instance + // identique à "SmartManagement.keepFactory" dans l'API Bindings + // vaut false par défaut + bool fenix = false + +) +``` + +### Get.putAsync +Si vous souhaitez enregistrer une instance async, vous pouvez utiliser `Get.putAsync`: + +```dart +Get.putAsync(() async { + final prefs = await SharedPreferences.getInstance(); + await prefs.setInt('counter', 12345); + return prefs; +}); + +Get.putAsync(() async => await YourAsyncClass()) +``` + +Ce sont toutes les options que vous pouvez définir lors de l'utilisation de putAsync: +```dart +Get.putAsync( + + // obligatoire: une méthode async qui sera exécutée pour instancier votre classe + AsyncInstanceBuilderCallback builder, + + // facultatif: identique à Get.put(), il est utilisé lorsque vous voulez plusieurs instances différentes d'une même classe + // doit être unique + String tag, + + // facultatif: identique à Get.put(), utilisé lorsque vous devez maintenir cette instance active dans l'ensemble de l'application + // vaut false par défaut + bool permanent = false +) +``` + +### Get.create + +Celui-ci est délicat. Une explication détaillée de ce que c'est et des différences d'avec les autres peut être trouvée dans la section [Différences entre les méthodes:](#differences-entre-les-methodes). + +```dart +Get.Create(() => SomeClass()); +Get.Create(() => LoginController()); +``` + +Ce sont toutes les options que vous pouvez définir lors de l'utilisation de create: + +```dart +Get.create( + // requis: une fonction qui renvoie une classe qui sera "fabriquée" chaque + // fois que `Get.find()` est appelé + // Exemple: Get.create(() => YourClass()) + FcBuilderFunc builder, + + // facultatif: comme Get.put(), mais il est utilisé lorsque vous avez besoin de plusieurs instances + // d'une même classe + // Utile dans le cas où vous avez une liste oú chaque élément a besoin de son propre contrôleur + // doit être une String unique. Changez simplement de 'tag' en 'name' + String name, + + // optionnel: tout comme dans `Get.put()`, c'est pour quand vous devez garder l' + // instance vivante dans toute l'application. La différence est que dans Get.create, + // permanent est 'true' par défaut + bool permanent = true +``` + +## Utilisation de méthodes/classes instanciées + +Imaginez que vous ayez parcouru de nombreuses routes et que vous ayez besoin d'une donnée qui a été laissée dans votre contrôleur, vous auriez besoin d'un gestionnaire d'état combiné avec le 'Provider' ou Get_it, n'est-ce pas? Pas avec Get. Il vous suffit de demander à Get de "find" (trouver) votre contrôleur, vous n'avez pas besoin de dépendances supplémentaires: + +```dart +final controller = Get.find(); +// OR +Controller controller = Get.find(); + +// Oui, cela ressemble à Magic, Get trouvera votre contrôleur et vous le livrera. +// Vous pouvez avoir 1 million de contrôleurs instanciés, Get vous trouvera toujours le bon contrôleur. +``` + +Et puis vous pourrez récupérer les données de votre contrôleur qui ont été obtenues là-bas: + +```dart +Text(controller.textFromApi); +``` + +La valeur renvoyée étant une classe normale, vous pouvez faire tout ce que vous voulez: +```dart +int count = Get.find().getInt('counter'); +print(count); // donne: 12345 +``` + +Pour supprimer une instance de Get: + +```dart +Get.delete(); //généralement, vous n'avez pas besoin de le faire car GetX supprime déjà les contrôleurs inutilisés- +``` + +## Differences entre les methodes + +Commençons par le `fenix` de Get.lazyPut et le `permanent` des autres méthodes. + +La différence fondamentale entre `permanent` et `fenix` réside dans la manière dont vous souhaitez stocker vos instances. + +Renforcement: par défaut, GetX supprime les instances lorsqu'elles ne sont pas utilisées. +Cela signifie que: Si l'écran 1 a le contrôleur 1 et l'écran 2 a le contrôleur 2 et que vous supprimez la première route du Stack, (comme si vous utilisez `Get.off()` ou `Get.offNamed()`) le contrôleur 1 a perdu son utilisation, il sera donc effacé. + +Mais si vous optez pour l'utilisation de `permanent: true`, alors le contrôleur ne sera pas perdu dans cette transition - ce qui est très utile pour les services que vous souhaitez maintenir actif dans toute l'application. + +`fenix`, quant à lui, est destiné aux services que vous ne craignez pas de perdre entre les changements d'écran, mais lorsque vous avez besoin de ce service, vous vous attendez à ce qu'il soit vivant. Donc, fondamentalement, il supprimera le contrôleur / service / classe inutilisé, mais lorsque vous en aurez besoin, il "recréera à partir de ses cendres" une nouvelle instance. + +Différences entre les méthodes: + +- Get.put et Get.putAsync suivent le même ordre de création, à la différence que la seconde utilise une méthode asynchrone: ces deux méthodes créent et initialisent l'instance. Celle-ci est insérée directement dans la mémoire, en utilisant la méthode interne `insert` avec les paramètres` permanent: false` et `isSingleton: true` (ce paramètre isSingleton a pour seul but de dire s'il faut utiliser la dépendance sur` dependency` ou s'il doit utiliser la dépendance sur `FcBuilderFunc`). Après cela, `Get.find()` est appelé pour initialiser immédiatement les instances qui sont en mémoire. + +- Get.create: Comme son nom l'indique, il "créera" votre dépendance! Similaire à `Get.put()`, il appelle également la méthode interne `insert` pour l'instanciation. Mais `permanent` devient vrai et` isSingleton` devient faux (puisque nous "créons" notre dépendance, il n'y a aucun moyen pour que ce soit une instance singleton, c'est pourquoi il est faux). Et comme il a `permanent: true`, nous avons par défaut l'avantage de ne pas le perdre entre les écrans! De plus, `Get.find()` n'est pas appelé immédiatement, il attend d'être utilisé dans l'écran pour être appelé. Il est créé de cette façon pour utiliser le paramètre `permanent`, depuis lors, il convient de noter que` Get.create() `a été créé dans le but de créer des instances non partagées, mais qui ne sont pas supprimées, comme par exemple un bouton dans un listView, pour lequel vous voulez une instance unique pour cette liste - à cause de cela, Get.create doit être utilisé avec GetWidget. + +- Get.lazyPut: Comme son nom l'indique, il s'agit d'un processus 'paresseux'. L'instance est créée, mais elle n'est pas appelée pour être utilisée immédiatement, elle reste en attente d'être appelée. Contrairement aux autres méthodes, `insert` n'est pas appelé ici. Au lieu de cela, l'instance est insérée dans une autre partie de la mémoire, une partie chargée de dire si l'instance peut être recréée ou non, appelons-la "factory". Si nous voulons créer quelque chose pour être utilisé plus tard, il ne sera pas mélangé avec les choses actuellement utilisées. Et voici où la magie de `fenix` apparaît: si vous choisissez de laisser` fenix: false`, et que votre `smartManagement` n'est pas` keepFactory`, alors lors de l'utilisation de `Get.find`, l'instance changera la place dans la mémoire de la "factory" à la zone de mémoire d'instance commune. Juste après cela, par défaut, il est retiré de `la factory`. Maintenant, si vous optez pour `fenix: true`, l'instance continue d'exister dans cette partie dédiée, allant même vers la zone commune, pour être appelée à nouveau dans le futur. + +## Bindings + +L'une des grandes différences de ce package, peut-être, est la possibilité d'une intégration complète des routes, du gestionnaire d'état et du gestionnaire de dépendances. +Lorsqu'une route est supprimée de la pile, tous les contrôleurs, variables et instances d'objets qui lui sont associés sont supprimés de la mémoire. Si vous utilisez des streams ou timers, ils seront fermés automatiquement et vous n'aurez à vous soucier de rien de tout cela. +Dans la version 2.10, Get a complètement implémenté l'API Bindings. +Vous n'avez plus besoin d'utiliser la méthode init. Vous n'avez même pas besoin de `typer`(declaration de type) vos contrôleurs si vous ne le souhaitez pas. Vous pouvez démarrer vos contrôleurs et services à l'endroit approprié pour cela. +La classe Binding est une classe qui découplera l'injection de dépendances, en faisant du "binding" des routes entre le gestionnaire d'état et le gestionnaire de dépendances. +Cela permet à Get de savoir quel écran est affiché lorsqu'un contrôleur particulier est utilisé et de savoir où et comment s'en débarrasser. +De plus, la classe Binding vous permettra d'avoir le contrôle de la configuration de SmartManager. Vous pouvez configurer les dépendances à organiser lors de la suppression d'une route du Stack, ou lorsque le widget qui l'utilisait est disposé, ou ni l'un ni l'autre. Vous disposerez d'une gestion intelligente des dépendances qui fonctionnera pour vous, mais vous pourrez malgré tout la configurer comme vous le souhaitez. + +### Classe Bindings + +- Créer une classe et implémenter Bindings + +```dart +class HomeBinding implements Bindings {} +``` + +Votre IDE vous demandera automatiquement de remplacer la méthode "dependencies", et il vous suffit de cliquer sur la lampe, de remplacer la méthode et d'insérer toutes les classes que vous allez utiliser sur cette route: + +```dart +class HomeBinding implements Bindings { + @override + void dependencies() { + Get.lazyPut(() => HomeController()); + Get.put(()=> Api()); + } +} + +class DetailsBinding implements Bindings { + @override + void dependencies() { + Get.lazyPut(() => DetailsController()); + } +} +``` + +Il vous suffit maintenant d'informer votre route, que vous utiliserez ce Binding pour établir la connexion entre le gestionnaire de routes, les dépendances et les états. + +- En utilisant les routes nommées: + +```dart +getPages: [ + GetPage( + name: '/', + page: () => HomeView(), + binding: HomeBinding(), + ), + GetPage( + name: '/details', + page: () => DetailsView(), + binding: DetailsBinding(), + ), +]; +``` + +- En utilisant les routes normales: + +```dart +Get.to(Home(), binding: HomeBinding()); +Get.to(DetailsView(), binding: DetailsBinding()) +``` + +Là, vous n'avez plus à vous soucier de la gestion de la mémoire de votre application, Get le fera pour vous. + +La classe Binding est appelée lorsqu'une route est appelée, vous pouvez créer un "initialBinding dans votre GetMaterialApp pour insérer toutes les dépendances qui seront créées. + +```dart +GetMaterialApp( + initialBinding: SampleBind(), + home: Home(), +); +``` + +### BindingsBuilder + +La manière par défaut de créer un binding est de créer une classe qui implémente Bindings. + +Mais alternativement, vous pouvez utiliser le callback `BindingsBuilder` afin de pouvoir simplement utiliser une fonction pour instancier ce que vous désirez. + +Exemple: + +```dart +getPages: [ + GetPage( + name: '/', + page: () => HomeView(), + binding: BindingsBuilder(() { + Get.lazyPut(() => ControllerX()); + Get.put(()=> Api()); + }), + ), + GetPage( + name: '/details', + page: () => DetailsView(), + binding: BindingsBuilder(() { + Get.lazyPut(() => DetailsController()); + }), + ), +]; +``` + +De cette façon, vous pouvez éviter de créer une classe Binding pour chaque route, ce qui est encore plus simple. + +Les deux méthodes fonctionnent parfaitement bien et nous voulons que vous utilisiez ce qui correspond le mieux à vos goûts. + +### SmartManagement + +GetX par défaut supprime les contrôleurs inutilisés de la mémoire, même si un échec se produit et qu'un widget qui l'utilise n'est pas correctement supprimé. +C'est ce qu'on appelle le mode `full` de gestion des dépendances. +Mais si vous voulez changer la façon dont GetX contrôle la suppression des classes, vous avez la classe `SmartManagement` pour définir différents comportements. + +#### Comment changer + +Si vous souhaitez modifier cette configuration (dont vous n'avez généralement pas besoin), procédez comme suit: + +```dart +void main () { + runApp( + GetMaterialApp( + smartManagement: SmartManagement.onlyBuilders //Ici + home: Home(), + ) + ) +} +``` + +#### SmartManagement.full + +C'est celui par défaut. Supprime les classes qui ne sont pas utilisées et qui n'ont pas été définies pour être permanentes. Dans la majorité des cas, vous voudrez garder cette configuration intacte. Si vous débutez avec GetX, ne changez pas cela. + +#### SmartManagement.onlyBuilders + +Avec cette option, seuls les contrôleurs démarrés dans `init:` ou chargés dans un Binding avec `Get.lazyPut()` seront supprimés. + +Si vous utilisez `Get.put()` ou `Get.putAsync()` ou toute autre approche, SmartManagement n'aura pas les autorisations pour exclure cette dépendance. + +Avec le comportement par défaut, même les widgets instanciés avec "Get.put" seront supprimés, contrairement à SmartManagement.onlyBuilders. + +#### SmartManagement.keepFactory + +Tout comme SmartManagement.full, il supprimera ses dépendances lorsqu'elles ne seront plus utilisées. Cependant, il conservera leur factory, ce qui signifie qu'il recréera la dépendance si vous avez à nouveau besoin de cette instance. + +### Comment Bindings fonctionne sous le capot + +Bindings crée des `'factories' transitoires`, qui sont créées au moment où vous cliquez pour aller à un autre écran, et seront détruites dès que l'animation de changement d'écran se produit. +Cela arrive si vite que l'analyseur ne pourra même pas l'enregistrer. +Lorsque vous accédez à nouveau à cet écran, une nouvelle fabrique temporaire sera appelée, c'est donc préférable à l'utilisation de SmartManagement.keepFactory, mais si vous ne voulez pas créer de Bindings, ou si vous voulez garder toutes vos dépendances sur le même Binding , cela vous aidera certainement. +Les factories prennent peu de mémoire, elles ne contiennent pas d'instances, mais une fonction avec la "forme" de cette classe que vous voulez. +Cela a un très faible coût en mémoire, mais comme le but de cette bibliothèque est d'obtenir le maximum de performances possible en utilisant le minimum de ressources, Get supprime même les factories par défaut. +Utilisez celui qui vous convient le mieux. + +## Notes + +- N'UTILISEZ PAS SmartManagement.keepFactory si vous utilisez plusieurs Bindings. Il a été conçu pour être utilisé sans Bindings ou avec une seule Binding liée dans le fichier initialBinding de GetMaterialApp. + +- L'utilisation de Bindings est complètement facultative, si vous le souhaitez, vous pouvez utiliser `Get.put()` et `Get.find()` sur les classes qui utilisent un contrôleur donné sans aucun problème. + Cependant, si vous travaillez avec des services ou toute autre abstraction, je vous recommande d'utiliser Bindings pour une meilleure organisation. \ No newline at end of file diff --git a/siro_rider/packages/get/documentation/fr_FR/route_management.md b/siro_rider/packages/get/documentation/fr_FR/route_management.md new file mode 100644 index 0000000..84117a0 --- /dev/null +++ b/siro_rider/packages/get/documentation/fr_FR/route_management.md @@ -0,0 +1,560 @@ +- [Gestion de route](#gestion-de-route) + - [Utilisation](#utilisation) + - [Navigation sans nom](#navigation-sans-nom) + - [Navigation par nom](#navigation-par-nom) + - [Envoyer des données aux routes nommées](#envoyer-des-donnes-aux-routes-nommes) + - [Liens URL dynamiques](#liens-url-dynamiques) + - [Middleware](#middleware) + - [Navigation sans context](#navigation-sans-context) + - [SnackBars](#snackbars) + - [Dialogs](#dialogs) + - [BottomSheets](#bottomsheets) + - [Nested Navigation](#nested-navigation) + +# Gestion de route + +C'est l'explication complète de tout ce qu'il y a à savoir sur Getx quand il s'agit de la gestion des routes. + +## Utilisation + +Ajoutez ceci à votre fichier pubspec.yaml: + +```yaml +dependencies: + get: +``` + +Si vous allez utiliser des routes/snackbars/dialogs/bottomsheets sans contexte, ou utiliser les API Get de haut niveau, vous devez simplement ajouter "Get" avant votre MaterialApp, en le transformant en GetMaterialApp et en profiter! + +```dart +GetMaterialApp( // Avant: MaterialApp( + home: MyHome(), +) +``` + +## Navigation sans nom + +Pour accéder à un nouvel écran: + +```dart +Get.to(NextScreen()); +``` + +Pour fermer les snackbars, dialogs, bottomsheets ou tout ce que vous fermez normalement avec Navigator.pop(context); + +```dart +Get.back(); +``` + +Pour aller à l'écran suivant et aucune option pour revenir à l'écran précédent (pour une utilisation dans SplashScreens, écrans de connexion, etc.) + +```dart +Get.off(NextScreen()); +``` + +Pour aller à l'écran suivant et annuler toutes les routes précédents (utile dans les paniers d'achat e-commerce, les sondages et les tests) + +```dart +Get.offAll(NextScreen()); +``` + +Pour naviguer vers l'écran suivant et recevoir ou mettre à jour des données dès que vous en revenez: + +```dart +var data = await Get.to(Payment()); +``` + +sur l'autre écran, envoyez les données pour l'écran précédent: + +```dart +Get.back(result: 'success'); +``` + +Et utilisez-les: + +ex: + +```dart +if(data == 'success') madeAnything(); +``` + +Vous ne voulez pas apprendre notre syntaxe? +Changez simplement le Navigateur (majuscule) en navigateur (minuscule), et vous aurez toutes les fonctions de la navigation standard, sans avoir à utiliser 'context'. +Exemple: + +```dart + +// Navigateur Flutter par défaut +Navigator.of(context).push( + context, + MaterialPageRoute( + builder: (BuildContext context) { + return HomePage(); + }, + ), +); + +// Utilisez la syntaxe Flutter sans avoir besoin de 'context' +navigator.push( + MaterialPageRoute( + builder: (_) { + return HomePage(); + }, + ), +); + +// Syntaxe Get (c'est beaucoup mieux, mais vous avez le droit d'être en désaccord) +Get.to(HomePage()); + + +``` + +## Navigation Par Nom + +- Si vous préférez naviguer par namedRoutes, Get prend également en charge cela. + +Pour aller à nextScreen + +```dart +Get.toNamed("/NextScreen"); +``` + +Pour naviguer et supprimer l'écran précédent du stack. + +```dart +Get.offNamed("/NextScreen"); +``` + +Pour naviguer et supprimer tous les écrans précédents du stack. + +```dart +Get.offAllNamed("/NextScreen"); +``` + +Pour définir des routes, utilisez GetMaterialApp: + +```dart +void main() { + runApp( + GetMaterialApp( + initialRoute: '/', + getPages: [ + GetPage(name: '/', page: () => MyHomePage()), + GetPage(name: '/second', page: () => Second()), + GetPage( + name: '/third', + page: () => Third(), + transition: Transition.zoom + ), + ], + ) + ); +} +``` + +Pour gérer la navigation vers des routes non définies (erreur 404), vous pouvez définir une page 'unknownRoute' dans GetMaterialApp. + +```dart +void main() { + runApp( + GetMaterialApp( + unknownRoute: GetPage(name: '/notfound', page: () => UnknownRoutePage()), + initialRoute: '/', + getPages: [ + GetPage(name: '/', page: () => MyHomePage()), + GetPage(name: '/second', page: () => Second()), + ], + ) + ); +} +``` + +### Envoyer des données aux routes nommées + +Envoyez simplement ce que vous voulez comme arguments. Get accepte n'importe quoi ici, qu'il s'agisse d'une String, d'une Map, d'une List ou même d'une instance de classe. + +```dart +Get.toNamed("/NextScreen", arguments: 'Get is the best'); +``` + +dans votre classe ou contrôleur: + +```dart +print(Get.arguments); +//montre: Get is the best +``` + +### Liens URL dynamiques + +Get propose des URL dynamiques avancées, tout comme sur le Web. Les développeurs Web ont probablement déjà voulu cette fonctionnalité sur Flutter, et ont très probablement vu un package promettre cette fonctionnalité et fournir une syntaxe totalement différente de celle d'une URL sur le Web, mais Get résout également cela. + +```dart +Get.offAllNamed("/NextScreen?device=phone&id=354&name=Enzo"); +``` + +sur votre classe controller/bloc/stateful/stateless: + +```dart +print(Get.parameters['id']); +// donne: 354 +print(Get.parameters['name']); +// donne: Enzo +``` + +Vous pouvez également recevoir facilement des paramètres nommés avec Get: + +```dart +void main() { + runApp( + GetMaterialApp( + initialRoute: '/', + getPages: [ + GetPage( + name: '/', + page: () => MyHomePage(), + ), + GetPage( + name: '/profile/', + page: () => MyProfile(), + ), + //Vous pouvez définir une page différente pour les routes avec arguments, et une autre sans arguments, mais pour cela vous devez utiliser la barre oblique '/' sur la route qui ne recevra pas d'arguments comme ci-dessus. + GetPage( + name: '/profile/:user', + page: () => UserProfile(), + ), + GetPage( + name: '/third', + page: () => Third(), + transition: Transition.cupertino + ), + ], + ) + ); +} +``` + +Envoyer des données sur le nom de la route + +```dart +Get.toNamed("/profile/34954"); +``` + +Sur le deuxième écran, recevez les données par paramètre + +```dart +print(Get.parameters['user']); +// donne: 34954 +``` + +ou envoyer plusieurs paramètres comme celui-ci + +```dart +Get.toNamed("/profile/34954?flag=true"); +``` + +Sur le deuxième écran, prenez les données par paramètres comme d'habitude + +```dart +print(Get.parameters['user']); +print(Get.parameters['flag']); +// donne: 34954 true +``` + +Et maintenant, tout ce que vous avez à faire est d'utiliser Get.toNamed() pour parcourir vos routes nommées, sans aucun contexte (vous pouvez appeler vos routes directement à partir de votre classe BLoC ou Controller), et lorsque votre application est compilée sur le Web, vos routes apparaîtront dans l'url <3 + +### Middleware + +Si vous souhaitez écouter les événements Get pour déclencher des actions, vous pouvez utiliser routingCallback pour le faire: + +```dart +GetMaterialApp( + routingCallback: (routing) { + if(routing.current == '/second'){ + openAds(); + } + } +) +``` + +Si vous n'utilisez pas GetMaterialApp, vous pouvez utiliser l'API manuelle pour attacher l'observateur Middleware. + +```dart +void main() { + runApp( + MaterialApp( + onGenerateRoute: Router.generateRoute, + initialRoute: "/", + navigatorKey: Get.key, + navigatorObservers: [ + GetObserver(MiddleWare.observer), // ICI !!! + ], + ), + ); +} +``` + +Créez une classe MiddleWare + +```dart +class MiddleWare { + static observer(Routing routing) { + /// Vous pouvez écouter en plus des routes, des snackbars, des dialogs et des bottomsheets sur chaque écran. + /// Si vous devez saisir l'un de ces 3 événements directement ici, + /// vous devez spécifier que l'événement est != Ce que vous essayez de faire. + if (routing.current == '/second' && !routing.isSnackbar) { + Get.snackbar("Hi", "You are on second route"); + } else if (routing.current =='/third'){ + print('dernière route'); + } + } +} +``` + +Maintenant, utilisez Get sur votre code: + +```dart +class First extends StatelessWidget { + @override + Widget build(BuildContext context) { + return Scaffold( + appBar: AppBar( + leading: IconButton( + icon: Icon(Icons.add), + onPressed: () { + Get.snackbar("hi", "i am a modern snackbar"); + }, + ), + title: Text('First Route'), + ), + body: Center( + child: ElevatedButton( + child: Text('Open route'), + onPressed: () { + Get.toNamed("/second"); + }, + ), + ), + ); + } +} + +class Second extends StatelessWidget { + @override + Widget build(BuildContext context) { + return Scaffold( + appBar: AppBar( + leading: IconButton( + icon: Icon(Icons.add), + onPressed: () { + Get.snackbar("hi", "i am a modern snackbar"); + }, + ), + title: Text('second Route'), + ), + body: Center( + child: ElevatedButton( + child: Text('Open route'), + onPressed: () { + Get.toNamed("/third"); + }, + ), + ), + ); + } +} + +class Third extends StatelessWidget { + @override + Widget build(BuildContext context) { + return Scaffold( + appBar: AppBar( + title: Text("Third Route"), + ), + body: Center( + child: ElevatedButton( + onPressed: () { + Get.back(); + }, + child: Text('Go back!'), + ), + ), + ); + } +} +``` + +## Navigation sans context + +### SnackBars + +Pour avoir un simple SnackBar avec Flutter, vous devez obtenir le 'context' de Scaffold, ou vous devez utiliser un GlobalKey attaché à votre Scaffold + +```dart +final snackBar = SnackBar( + content: Text('Hi!'), + action: SnackBarAction( + label: 'I am a old and ugly snackbar :(', + onPressed: (){} + ), +); +// Trouvez le scaffold dans l'arborescence des widgets et utilisez-le pour afficher un SnackBar. +Scaffold.of(context).showSnackBar(snackBar); +``` + +Avec Get: + +```dart +Get.snackbar('Hi', 'i am a modern snackbar'); +``` + +Avec Get, tout ce que vous avez à faire est d'appeler votre Get.snackbar à partir de n'importe où dans votre code ou de le personnaliser comme vous le souhaitez! + +```dart +Get.snackbar( + "Hey i'm a Get SnackBar!", // title + "C'est incroyable! J'utilise SnackBar sans context, sans code standard, sans Scaffold, c'est quelque chose de vraiment incroyable!", // message + icon: Icon(Icons.alarm), + shouldIconPulse: true, + onTap:(){}, + barBlur: 20, + isDismissible: true, + duration: Duration(seconds: 3), +); + + + ////////// TOUTES LES FONCTIONNALITÉS ////////// + // Color colorText, + // Duration duration, + // SnackPosition snackPosition, + // Widget titleText, + // Widget messageText, + // bool instantInit, + // Widget icon, + // bool shouldIconPulse, + // double maxWidth, + // EdgeInsets margin, + // EdgeInsets padding, + // double borderRadius, + // Color borderColor, + // double borderWidth, + // Color backgroundColor, + // Color leftBarIndicatorColor, + // List boxShadows, + // Gradient backgroundGradient, + // TextButton mainButton, + // OnTap onTap, + // bool isDismissible, + // bool showProgressIndicator, + // AnimationController progressIndicatorController, + // Color progressIndicatorBackgroundColor, + // Animation progressIndicatorValueColor, + // SnackStyle snackStyle, + // Curve forwardAnimationCurve, + // Curve reverseAnimationCurve, + // Duration animationDuration, + // double barBlur, + // double overlayBlur, + // Color overlayColor, + // Form userInputForm + /////////////////////////////////// +``` + +Si vous préférez le snack-bar traditionnel, ou souhaitez le personnaliser à partir de zéro, y compris en ajoutant une seule ligne (Get.snackbar utilise un titre et un message obligatoires), vous pouvez utiliser +`Get.rawSnackbar ();` qui fournit l'API brute sur laquelle Get.snackbar a été construit. + +### Dialogs + +Pour ouvrir un 'dialog': + +```dart +Get.dialog(VotreDialogWidget()); +``` + +Pour ouvrir le 'dialog' par défaut: + +```dart +Get.defaultDialog( + onConfirm: () => print("Ok"), + middleText: "Dialog made in 3 lines of code" +); +``` + +Vous pouvez également utiliser Get.generalDialog au lieu de showGeneralDialog. + +Pour tous les autres widgets de la boîte de dialogue Flutter, y compris cupertinos, vous pouvez utiliser Get.overlayContext au lieu du context et l'ouvrir n'importe où dans votre code. +Pour les widgets qui n'utilisent pas Overlay, vous pouvez utiliser Get.context. +Ces deux contextes fonctionneront dans 99% des cas pour remplacer le context de votre interface utilisateur, sauf dans les cas où inheritedWidget est utilisé sans context de navigation. + +### BottomSheets + +Get.bottomSheet est comme showModalBottomSheet, mais n'a pas besoin de 'context'. + +```dart +Get.bottomSheet( + Container( + child: Wrap( + children: [ + ListTile( + leading: Icon(Icons.music_note), + title: Text('Music'), + onTap: () {} + ), + ListTile( + leading: Icon(Icons.videocam), + title: Text('Video'), + onTap: () {}, + ), + ], + ), + ) +); +``` + +## Nested Navigation + +Getx a rendu la navigation imbriquée de Flutter encore plus facile. +Vous n'avez pas besoin de 'context' et vous trouverez votre stack de navigation par ID. + +- NOTE: La création de stacks de navigation parallèles peut être dangereuse. L'idéal est de ne pas utiliser NestedNavigators, ou de l'utiliser avec parcimonie. Si votre projet l'exige, allez-y, mais gardez à l'esprit que conserver plusieurs stacks de navigation en mémoire n'est peut-être pas une bonne idée pour la consommation de RAM. + +Voyez comme c'est simple: + +```dart +Navigator( + key: Get.nestedKey(1), // créez une clé par index + initialRoute: '/', + onGenerateRoute: (settings) { + if (settings.name == '/') { + return GetPageRoute( + page: () => Scaffold( + appBar: AppBar( + title: Text("Main"), + ), + body: Center( + child: TextButton( + color: Colors.blue, + onPressed: () { + Get.toNamed('/second', id:1); // naviguer votre itinéraire imbriqué par index + }, + child: Text("Go to second"), + ), + ), + ), + ); + } else if (settings.name == '/second') { + return GetPageRoute( + page: () => Center( + child: Scaffold( + appBar: AppBar( + title: Text("Main"), + ), + body: Center( + child: Text("second") + ), + ), + ), + ); + } + } +), +``` diff --git a/siro_rider/packages/get/documentation/fr_FR/state_management.md b/siro_rider/packages/get/documentation/fr_FR/state_management.md new file mode 100644 index 0000000..04904f4 --- /dev/null +++ b/siro_rider/packages/get/documentation/fr_FR/state_management.md @@ -0,0 +1,721 @@ +- [Gestion d'État](#gestion-d-etat) + - [Gestionnaire d'état réactif](#gestionnaire-d-etat-reactif) + - [Avantages](#avantages) + - [Performance maximale:](#performance-maximale) + - [Déclaration d'une variable réactive](#declaration-d-une-variable-reactive) + - [Avoir un état réactif, c'est facile.](#avoir-un-etat-reactif-c-est-facile) + - [Utilisation des valeurs dans la Vue](#utilisation-des-valeurs-dans-la-vue) + - [Conditions pour reconstruire](#conditions-pour-reconstruire) + - [Quand utiliser .obs](#quand-utiliser-obs) + - [Remarque sur List](#remarque-sur-list) + - [Pourquoi je dois utiliser .value](#pourquoi-je-dois-utiliser-value) + - [Obx()](#obx) + - [Workers](#workers) + - [Gestionnaire d'état simple](#gestionnaire-d-etat-simple) + - [Atouts](#atouts) + - [Utilisation](#utilisation) + - [Comment il gère les contrôleurs](#comment-il-gre-les-contrleurs) + - [Vous n'aurez plus besoin de StatefulWidgets](#vous-naurez-plus-besoin-de-statefulwidgets) + - [Pourquoi ça existe](#pourquoi-ca-existe) + - [Autres façons de l'utiliser](#autres-formes-d-utilisation) + - [IDs Uniques](#ids-uniques) + - [Mélanger les deux gestionnaires d'état](#mixing-the-two-state-managers) + - [GetBuilder vs GetX vs Obx vs MixinBuilder](#getbuilder-vs-getx-vs-obx-vs-mixinbuilder) + +# Gestion d Etat + +GetX n'utilise pas Streams ou ChangeNotifier comme les autres gestionnaires d'état. Pourquoi? En plus de créer des applications pour Android, iOS, Web, Linux, MacOS et Linux, GetX vous permet de créer des applications serveur avec la même syntaxe que Flutter / GetX. Afin d'améliorer le temps de réponse et de réduire la consommation de RAM, nous avons créé GetValue et GetStream, des solutions à faible latence qui offrent beaucoup de performances, à un faible coût d'exploitation. Nous utilisons cette base pour construire toutes nos ressources, y compris la gestion d'état. + +- _Complexité_: Certains gestionnaires d'État sont complexes et ont beaucoup de code standard. Avec GetX, vous n'avez pas à définir une classe pour chaque événement, le code est très propre et clair, et vous faites beaucoup plus en écrivant moins. Beaucoup de gens ont abandonné Flutter à cause de ce sujet, et ils ont enfin une solution stupidement simple pour gérer les états. +- _Aucun générateur de code_: Vous passez la moitié de votre temps de développement à écrire la logique de votre application. Certains gestionnaires d'état s'appuient sur des générateurs de code pour avoir un code lisible minimal. Changer une variable et avoir à exécuter build_runner peut être improductif, et souvent le temps d'attente après un redémarrage sera long, et vous devrez boire beaucoup de café. + Avec GetX, tout est réactif, et rien ne dépend des générateurs de code, augmentant votre productivité dans tous les aspects de votre développement. +- _Cela ne dépend pas de 'context'_: Vous avez probablement déjà eu besoin d'envoyer le contexte de votre vue à un contrôleur, ce qui rend le couplage de la vue avec votre logique métier élevé. Vous avez probablement dû utiliser une dépendance dans un endroit qui n'a pas de contexte, et avez dû passer le contexte à travers différentes classes et fonctions. Cela n'existe tout simplement pas avec GetX. Vous avez accès à vos contrôleurs depuis vos contrôleurs sans aucun contexte. Vous n'avez pas besoin d'envoyer le contexte par paramètre pour rien. +- _Contrôle granulaire_: la plupart des gestionnaires d'état sont basés sur ChangeNotifier. ChangeNotifier notifiera tous les widgets qui en dépendent lors de l'appel de notifyListeners. Si vous avez 40 widgets sur un écran, qui ont une variable de votre classe ChangeNotifier, lorsque vous en mettez un à jour, tous seront reconstruits. + Avec GetX, même les widgets imbriqués sont respectés. Si Obx gère votre ListView et un autre gère une case à cocher dans ListView, lors de la modification de la valeur CheckBox, il ne sera mis à jour que, lors de la modification de la valeur List, seul le ListView sera mis à jour. +- _Il ne reconstruit que si sa variable change VRAIMENT_: GetX a un contrôle de flux, cela signifie que si vous affichez un texte avec 'Paola', si vous changez à nouveau la variable observable en 'Paola', le widget ne sera pas reconstruit. C'est parce que GetX sait que `Paola` est déjà affiché dans Text et ne fera pas de reconstructions inutiles. + La plupart (sinon tous) les gestionnaires d'état actuels se reconstruiront à l'écran. + +## Gestionnaire d etat reactif + +La programmation réactive peut aliéner de nombreuses personnes car on dit qu'elle est compliquée. GetX transforme la programmation réactive en quelque chose d'assez simple: + +- Vous n'aurez pas besoin de créer des StreamControllers. +- Vous n'aurez pas besoin de créer un StreamBuilder pour chaque variable +- Vous n'aurez pas besoin de créer une classe pour chaque état. +- Vous n'aurez pas besoin de créer un 'get' pour une valeur initiale. + + +La programmation réactive avec Get est aussi simple que d'utiliser setState. + +Imaginons que vous ayez une variable de 'name' et que vous souhaitiez que chaque fois que vous la modifiez, tous les widgets qui l'utilisent soient automatiquement modifiés. + +Voici votre variable: + +```dart +var name = 'Jonatas Borges'; +``` + +Pour la rendre observable, il vous suffit d'ajouter ".obs" à la fin: + +```dart +var name = 'Jonatas Borges'.obs; +``` + +C'est *tout*. Si simple que ca. + +A partir de maintenant, nous pourrions désigner ces variables réactives - ". Obs" (ervables) comme _Rx_. + +Qu'est ce qui s'est passé derrière les rideaux? Nous avons créé un `Stream` de` String`s, assigné la valeur initiale `" Jonatas Borges "`, nous avons notifié tous les widgets qui utilisent `" Jonatas Borges "` qu'ils "appartiennent" maintenant à cette variable, et quand la valeur _Rx_ changements, ils devront également changer. + +C'est la **magie de GetX**, grâce aux performances de Dart. + +Mais, comme nous le savons, un `Widget` ne peut être changé que s'il est à l'intérieur d'une fonction, car les classes statiques n'ont pas le pouvoir de" changer automatiquement ". + +Vous devrez créer un `StreamBuilder`, vous abonner à cette variable pour écouter les changements et créer une" cascade "de` StreamBuilder` imbriqués si vous voulez changer plusieurs variables dans la même portée, non? + +Non, vous n'avez pas besoin d'un `StreamBuilder`, mais vous avez raison pour les classes statiques. + +Eh bien, dans la vue, nous avons généralement beaucoup de code standard lorsque nous voulons changer un widget spécifique, c'est la manière Flutter. +Avec **GetX**, vous pouvez également oublier ce code passe-partout. + +`StreamBuilder( … )`? `initialValue: …`? `builder: …`? Non, il vous suffit de placer cette variable dans un widget `Obx()`. + +```dart +Obx (() => Text (controller.name)); +``` + +_Que devez-vous mémoriser?_ Seulement `Obx(() =>`. + +Vous passez simplement ce Widget via une fonction dans un `Obx()` (l' "Observateur" du _Rx_). + +`Obx` est assez intelligent et ne changera que si la valeur de` controller.name` change. + +Si `name` est` "John" `, et que vous le changez en` "John" `(` name.value = "John" `), comme c'est la même` valeur` qu'avant, rien ne changera à l'écran, et `Obx`, pour économiser les ressources, ignorera simplement la nouvelle valeur et ne reconstruira pas le widget. **N'est-ce pas incroyable?** + +> Alors, que faire si j'ai 5 variables _Rx_ (observables) dans un `Obx`? + +Il sera simplement mis à jour lorsque **l'un d'entre eux** change. + +> Et si j'ai 30 variables dans une classe, lorsque j'en mets une à jour, est-ce que cela va mettre à jour **toutes** les variables qui sont dans cette classe? + +Non, juste le **Widget spécifique** qui utilise cette variable _Rx_. + +Ainsi, **GetX** ne met à jour l'écran que lorsque la variable _Rx_ change sa valeur. + +``` +final isOpen = false.obs; + +// Rien de ne change... valeur identique. +void onButtonTap() => isOpen.value=false; +``` +### Avantages + +**GetX()** vous aide lorsque vous avez besoin d'un contrôle **granulaire** sur ce qui est mis à jour. + + +Si vous n'avez pas besoin d'ID uniques, car toutes vos variables seront modifiées lorsque vous effectuez une action, utilisez `GetBuilder`, +parce que c'est un Simple State Updater (en blocs, comme `setState()`), fait en seulement quelques lignes de code. +Il a été rendu simple, pour avoir le moins d'impact sur le processeur, et juste pour remplir un seul objectif (une reconstruction de _l'état_) et dépenser le minimum de ressources possible. + +Si vous avez besoin d'un State Manager **puissant** , vous ne pouvez pas vous tromper avec **GetX**. + +Cela ne fonctionne pas avec les variables, mais __flows__, tout ce qu'il contient sont des `Streams` en réalité. +Vous pouvez utiliser _rxDart_ en conjonction avec lui, car tout est `Streams`. +Vous pouvez écouter les changements de chaque "variable _Rx_", +parce que tout ce qui se trouve dedans est un `Streams`. + + +C'est littéralement une approche _BLoC_, plus facile que _MobX_, et sans générateurs de code ni décorations. +Vous pouvez transformer **n'importe quoi** en un _"Observable"_ avec juste un `.obs`. + +### Performance maximale: + +En plus d'avoir un algorithme intelligent pour des reconstructions minimales, **GetX** utilise des comparateurs +pour s'assurer que l'État a changé. + +Si vous rencontrez des erreurs dans votre application et envoyez un changement d'état en double, +**GetX** garantira qu'il ne plantera pas. + +Avec **GetX**, l'état ne change que si la `valeur` change. +C'est la principale différence entre **GetX** et l'utilisation de _`computed` de MobX_. +Lors de la jonction de deux __observables__, si l'une change; le listener de cet _observable_ changera également. + +Avec **GetX**, si vous joignez deux variables, `GetX()` (similaire à `Observer()`), ne se reconstruira que si cela implique un réel changement d'état. + +### Declaration d une variable reactive + +Vous avez 3 façons de transformer une variable en "observable". + +1 - La première est d'utiliser **`Rx{Type}`**. + +```dart +// la valeur initiale est recommandée, mais pas obligatoire +final name = RxString(''); +final isLogged = RxBool(false); +final count = RxInt(0); +final balance = RxDouble(0.0); +final items = RxList([]); +final myMap = RxMap({}); +``` + +2 - La seconde consiste à utiliser **`Rx`** et à utiliser les types `Rx` Génériques Darts + +```dart +final name = Rx(''); +final isLogged = Rx(false); +final count = Rx(0); +final balance = Rx(0.0); +final number = Rx(0); +final items = Rx>([]); +final myMap = Rx>({}); + +// Classes personnalisées - il peut s'agir de n'importe quelle classe, littéralement +final user = Rx(); +``` + +3 - La troisième approche, plus pratique, plus facile et préférée, ajoutez simplement **`.obs`** comme propriété de votre` valeur`: + +```dart +final name = ''.obs; +final isLogged = false.obs; +final count = 0.obs; +final balance = 0.0.obs; +final number = 0.obs; +final items = [].obs; +final myMap = {}.obs; + +// Classes personnalisées - il peut s'agir de n'importe quelle classe, littéralement +final user = User().obs; +``` + +##### Avoir un etat reactif, c est facile. + +Comme nous le savons, _Dart_ se dirige maintenant vers _null safety_. +Pour être prêt, à partir de maintenant, vous devez toujours commencer vos variables _Rx_ avec une **valeur initiale**. + +> Transformer une variable en _observable_ + _valeurInitiale_ avec **GetX** est l'approche la plus simple et la plus pratique. + +Vous allez littéralement ajouter un "".obs"" à la fin de votre variable, et **c'est tout**, vous l'avez rendue observable, +et sa `.value`, eh bien, sera la _valeurInitiale_. + +### Utilisation des valeurs dans la Vue + +```dart +// dans le controlleur +final count1 = 0.obs; +final count2 = 0.obs; +int get sum => count1.value + count2.value; +``` + +```dart +// dans la vue +GetX( + builder: (controller) { + print("count 1 reconstruction"); + return Text('${controller.count1.value}'); + }, +), +GetX( + builder: (controller) { + print("count 2 reconstruction"); + return Text('${controller.count2.value}'); + }, +), +GetX( + builder: (controller) { + print("count 3 reconstruction"); + return Text('${controller.sum}'); + }, +), +``` + +Si nous incrémentons `count1.value++`, cela affichera: +- `count 1 reconstruction` +- `count 3 reconstruction` + +parce que `count1` a une valeur de `1`, et `1 + 0 = 1`, changeant la valeur du getter `sum`. + +Si nous incrémentons `count2.value++`, cela affichera: +- `count 2 reconstruction` +- `count 3 reconstruction` + +parce que `count2.value` a changé et que le résultat de `sum` est maintenant `2`. + +- NOTE: Par défaut, le tout premier événement reconstruira le widget, même s'il s'agit de la même `valeur`. + Ce comportement existe en raison de variables booléennes. + +Imaginez que vous fassiez ceci: + +```dart +var isLogged = false.obs; +``` + +Et puis, vous vérifiez si un utilisateur est "connecté" pour déclencher un événement dans `ever`. + +```dart +@override +onInit(){ + ever(isLogged, fireRoute); + isLogged.value = await Preferences.hasToken(); +} + +fireRoute(logged) { + if (logged) { + Get.off(Home()); + } else { + Get.off(Login()); + } +} +``` + +si `hasToken` était `false`, il n'y aurait pas de changement à `isLogged`, donc` ever() `ne serait jamais appelé. +Pour éviter ce type de comportement, la première modification d'un _observable_ déclenchera toujours un événement, +même s'il contient la même `.value`. + +Vous pouvez supprimer ce comportement si vous le souhaitez, en utilisant: +`isLogged.firstRebuild = false;` + +### Conditions pour reconstruire + +En outre, Get fournit un contrôle d'état raffiné. Vous pouvez conditionner un événement (comme l'ajout d'un objet à une liste), à ​​une certaine condition. + +```dart +// Premier paramètre: condition, doit retourner vrai ou faux. +// Deuxième paramètre: la nouvelle valeur à appliquer si la condition est vraie. +list.addIf(item < limit, item); +``` + +Sans décorations, sans générateur de code, sans complications :smile: + +Connaissez-vous l'application 'counter' de Flutter? Votre classe Controller pourrait ressembler à ceci: + +```dart +class CountController extends GetxController { + final count = 0.obs; +} +``` + +Avec un simple: + +```dart +controller.count.value++ +``` + +Vous pouvez mettre à jour la variable de compteur dans votre interface utilisateur, quel que soit l'endroit où elle est stockée. + +### Quand utiliser .obs + +Vous pouvez tout transformer sur obs. Voici deux façons de procéder: + +* Vous pouvez convertir vos valeurs de classe en obs +```dart +class RxUser { + final name = "Camila".obs; + final age = 18.obs; +} +``` + +* ou vous pouvez convertir la classe entière en un observable: +```dart +class User { + User({String name, int age}); + var name; + var age; +} + +// en instanciant: +final user = User(name: "Camila", age: 18).obs; +``` + +### Remarque sur List + +Les listes sont complètement observables, tout comme les objets qu'elles contiennent. De cette façon, si vous ajoutez une valeur à une liste, cela reconstruira automatiquement les widgets qui l'utilisent. + +Vous n'avez pas non plus besoin d'utiliser ".value" avec des listes, l'incroyable api de Dart nous a permis de supprimer cela. +Malheureusement, les types primitifs comme String et int ne peuvent pas être étendus, ce qui rend l'utilisation de .value obligatoire, mais ce ne sera pas un problème si vous travaillez avec des getters et des setters pour ceux-ci. + +```dart +// Dans le controlleur +final String title = 'User Info:'.obs; +final list = List().obs; + +// Dans la vue +Text(controller.title.value), // La String doit avoir .value devant elle +ListView.builder ( + itemCount: controller.list.length // pas besoin pour List +) +``` + +Lorsque vous rendez vos propres classes observables, il existe une manière différente de les mettre à jour: + +```dart +// sur le fichier modèle +// nous allons rendre la classe entière observable au lieu de chaque attribut +class User() { + User({this.name = '', this.age = 0}); + String name; + int age; +} + + +// Dans le controlleur +final user = User().obs; +// lorsque vous devez mettre à jour la variable utilisateur: +user.update( (user) { // ce paramètre est la classe même que vous souhaitez mettre à jour +user.name = 'Jonny'; +user.age = 18; +}); +// une autre manière de mettre à jour la variable user: +user(User(name: 'João', age: 35)); + +// Dans la vue: +Obx(()=> Text("Name ${user.value.name}: Age: ${user.value.age}")) +// vous pouvez également accéder aux valeurs du modèle sans le .value: +user().name; //notez que c'est la variable utilisateur, pas la classe (la variable a un u minuscule) +``` + +Vous n'êtes pas obligé de travailler avec des setters si vous ne le souhaitez pas. vous pouvez utiliser les API `assign` et `assignAll`. +L'API `assign` effacera votre liste et ajoutera un seul objet que vous souhaitez. +L'API `assignAll` effacera la liste existante et ajoutera tous les objets itérables que vous y injecterez. + +### Pourquoi je dois utiliser .value + +Nous pourrions supprimer l'obligation d'utiliser 'value' pour `String` et` int` avec une simple décoration et un générateur de code, mais le but de cette bibliothèque est précisément d'éviter les dépendances externes. Nous souhaitons proposer un environnement prêt à la programmation, impliquant l'essentiel (gestion des routes, des dépendances et des états), de manière simple, légère et performante, sans avoir besoin d'un package externe. + +Vous pouvez littéralement ajouter 3 lettres à votre pubspec (get) et un signe deux-points et commencer la programmation. Toutes les solutions incluses par défaut, de la gestion des routes à la gestion des états, visent la facilité, la productivité et la performance. + +Le poids total de cette bibliothèque est inférieur à celui d'un seul gestionnaire d'état, bien qu'il s'agisse d'une solution complète, et c'est ce que vous devez comprendre. + +Si vous êtes dérangé par `.value`, et comme un générateur de code, MobX est une excellente alternative, et vous pouvez l'utiliser en conjonction avec Get. Pour ceux qui veulent ajouter une seule dépendance dans pubspec et commencer à programmer sans se soucier de l'incompatibilité de la version d'un package avec un autre, ou si l'erreur d'une mise à jour d'état vient du gestionnaire d'état ou de la dépendance, ou encore, ne veulent pas s'inquiéter de la disponibilité des contrôleurs, que ce soit littéralement "juste de la programmation", get est tout simplement parfait. + +Si vous n'avez aucun problème avec le générateur de code MobX, ou si vous n'avez aucun problème avec le code standard BLoC, vous pouvez simplement utiliser Get pour les routes et oublier qu'il a un gestionnaire d'état. Get SEM et RSM sont nés par nécessité, mon entreprise avait un projet avec plus de 90 contrôleurs, et le générateur de code a simplement pris plus de 30 minutes pour terminer ses tâches après un Flutter Clean sur une machine raisonnablement bonne, si votre projet il a 5, 10, 15 contrôleurs, n'importe quel gestionnaire d'état vous suffira bien. Si vous avez un projet d'une taille absurde et que le générateur de code est un problème pour vous, cette solution vous a été attribuée. + +Évidemment, si quelqu'un veut contribuer au projet et créer un générateur de code, ou quelque chose de similaire, je vais créer un lien dans ce readme comme alternative, mon besoin n'est pas le besoin de tous les développeurs, mais pour l'instant je dis q'il y a de bonnes solutions qui font déjà cela, comme MobX. + +### Obx() + +Les types dans Get à l'aide de Bindings ne sont pas nécessaires. Vous pouvez utiliser le widget Obx, au lieu de GetX, qui ne reçoit que la fonction anonyme qui crée un widget. +Évidemment, si vous n'utilisez pas de type, vous devrez avoir une instance de votre contrôleur pour utiliser les variables, ou utiliser `Get.find()` .value ou Controller.to.value pour récupérer la valeur . + +### Workers + +Les 'workers' vous assisteront, déclenchant des callbacks spécifiques lorsqu'un événement se produit. + +```dart +/// Appelée à chaque fois que `count1` change. +ever(count1, (_) => print("$_ a été modifié")); + +/// Appelée uniquement la première fois que la variable est modifiée +once(count1, (_) => print("$_ a été changé une fois")); + +/// Anti DDos - Appelée chaque fois que l'utilisateur arrête de taper pendant 1 seconde, par exemple. +debounce(count1, (_) => print("debouce$_"), time: Duration(seconds: 1)); + +/// Ignore toutes les modifications pendant 1 seconde. +interval(count1, (_) => print("interval $_"), time: Duration(seconds: 1)); +``` +Tous les workers (sauf `debounce`) ont un paramètre nommé `condition`, qui peut etre un `bool` ou un callback qui retourne un `bool`. +Cette `condition` definit quand la fonction `callback` est executée. + +Tous les workers renvoyent un objet `Worker`, qui peut être utilisé pour annuler ( via `dispose()` ) le `worker`. + +- **`ever`** + est appelée chaque fois que la variable _Rx_ émet une nouvelle valeur. + +- **`everAll`** + Un peu comme `ever`, mais il prend une` List` de valeurs _Rx_. Appelée chaque fois que sa variable est changée. C'est tout. + +- **`once`** +'once' est appelée uniquement la première fois que la variable a été modifiée. + +- **`debounce`** +'debounce' est très utile dans les fonctions de recherche, où vous souhaitez que l'API ne soit appelée que lorsque l'utilisateur a fini de taper. Si l'utilisateur tape "Jonny", vous aurez 5 recherches dans les API, par la lettre J, o, n, n et y. Avec Get, cela ne se produit pas, car vous aurez un Worker "anti-rebond" qui ne sera déclenché qu'à la fin de la saisie. + +- **`interval`** +'interval' est différent de 'debounce'. Avec `debounce` si l'utilisateur fait 1000 changements à une variable en 1 seconde, il n'enverra que le dernier après le temporisateur stipulé (la valeur par défaut est 800 millisecondes). 'Interval' ignorera à la place toutes les actions de l'utilisateur pour la période stipulée. Si vous envoyez des événements pendant 1 minute, 1000 par seconde, debounce ne vous enverra que le dernier, lorsque l'utilisateur arrête de mitrailler les événements. interval délivrera des événements toutes les secondes, et s'il est réglé sur 3 secondes, il fournira 20 événements cette minute. Ceci est recommandé pour éviter les abus, dans des fonctions où l'utilisateur peut rapidement cliquer sur quelque chose et obtenir un avantage (imaginez que l'utilisateur puisse gagner des pièces en cliquant sur quelque chose, s'il cliquait 300 fois dans la même minute, il aurait 300 pièces, en utilisant l'intervalle, vous pouvez définir une période de 3 secondes, et même en cliquant 300 ou mille fois, le maximum qu'il obtiendrait en 1 minute serait de 20 pièces, en cliquant 300 ou 1 million de fois). Le 'debounce' convient aux anti-DDos, pour des fonctions comme la recherche où chaque changement de onChange entraînerait une requête à votre api. Debounce attendra que l'utilisateur arrête de taper le nom, pour faire la demande. S'il était utilisé dans le scénario de pièces mentionné ci-dessus, l'utilisateur ne gagnerait qu'une pièce, car il n'est exécuté que lorsque l'utilisateur "fait une pause" pendant le temps établi. + +- NOTE: Les 'workers' doivent toujours être utilisés lors du démarrage d'un contrôleur ou d'une classe, il doit donc toujours être dans onInit (recommandé), le constructeur de classe ou l'initState d'un StatefulWidget (cette pratique n'est pas recommandée dans la plupart des cas, mais cela ne devrait poser aucun problème). + +## Gestionnaire d etat simple + +Get a un gestionnaire d'état extrêmement léger et facile, qui n'utilise pas ChangeNotifier, répondra aux besoins en particulier des nouveaux utilisateurs de Flutter et ne posera pas de problèmes pour les applications volumineuses. + +GetBuilder vise précisément le contrôle de plusieurs états. Imaginez que vous avez ajouté 30 produits à un panier, que vous cliquez sur supprimer un, en même temps que la liste est mise à jour, le prix est mis à jour et le badge dans le panier est mis à jour avec un nombre plus petit. Ce type d'approche fait de GetBuilder un tueur, car il regroupe les états et les modifie tous à la fois sans aucune "logique de calcul" pour cela. GetBuilder a été créé avec ce type de situation à l'esprit, car pour un changement d'état éphémère, vous pouvez utiliser setState et vous n'aurez pas besoin d'un gestionnaire d'état pour cela. + +De cette façon, si vous voulez un contrôleur individuel, vous pouvez lui attribuer des ID ou utiliser GetX. Cela dépend de vous, en vous rappelant que plus vous avez de widgets "individuels", plus les performances de GetX se démarqueront, tandis que les performances de GetBuilder devraient être supérieures, en cas de changement d'état multiple. + +### Atouts + +1. Met à jour uniquement les widgets requis. + +2. N'utilise pas changeNotifier, c'est le gestionnaire d'état qui utilise le moins de mémoire (proche de 0 Mo). + +3. Oubliez StatefulWidget! Avec Get, vous n'en aurez jamais besoin. Avec les autres gestionnaires d'états, vous devrez probablement utiliser un StatefulWidget pour obtenir l'instance de votre fournisseur, BLoC, MobX Controller, etc. Mais vous êtes-vous déjà arrêté pour penser que votre appBar, votre 'scaffold', et la plupart des les widgets de votre classe sont sans état (stateless)? Alors pourquoi sauvegarder l'état d'une classe entière, si vous pouvez sauvegarder l'état du widget qui est `avec état` (statefull)? Get résout cela aussi. Créez une classe sans état, rendez tout `sans état`. Si vous devez mettre à jour un seul composant, enveloppez-le avec GetBuilder et son état sera conservé. + +4. Organisez votre projet pour de vrai! Les contrôleurs ne doivent pas être dans votre interface utilisateur, placer votre TextEditController ou tout contrôleur que vous utilisez dans votre classe Controller. + +5. Avez-vous besoin de déclencher un événement pour mettre à jour un widget dès son rendu? GetBuilder a la propriété "initState", tout comme StatefulWidget, et vous pouvez appeler des événements depuis votre contrôleur, directement depuis celui-ci, aucun événement n'étant placé dans votre initState. + +6. Avez-vous besoin de déclencher une action comme la fermeture de stream, de timers, etc.? GetBuilder a également la propriété dispose(), où vous pouvez appeler des événements dès que ce widget est détruit. + +7. N'utilisez les streams que si nécessaire. Vous pouvez utiliser vos StreamControllers à l'intérieur de votre contrôleur normalement, et utiliser StreamBuilder également normalement, mais rappelez-vous qu'un stream consomme raisonnablement de la mémoire, la programmation réactive est belle, mais vous ne devriez pas en abuser. 30 streams ouverts simultanément peuvent être pires que changeNotifier (et changeNotifier est très mauvais). + +8. Mettez à jour les widgets sans dépenser de RAM pour cela. Get stocke uniquement l'ID de créateur GetBuilder et met à jour ce GetBuilder si nécessaire. La consommation de mémoire du stockage get ID en mémoire est très faible, même pour des milliers de GetBuilders. Lorsque vous créez un nouveau GetBuilder, vous partagez en fait l'état de GetBuilder qui a un ID de créateur. Un nouvel état n'est pas créé pour chaque GetBuilder, ce qui économise BEAUCOUP de RAM pour les applications volumineuses. Fondamentalement, votre application sera entièrement sans état (stateless), et les quelques widgets qui seront stateful (dans GetBuilder) auront un seul état, et par conséquent, la mise à jour d'un seul les mettra tous à jour. L'état est unique. + +9. Get est omniscient et, dans la plupart des cas, il sait exactement quand sortir de mémoire un contrôleur. Vous ne devez pas vous soucier du moment de vous débarrasser d'un contrôleur, Get connaît le meilleur moment pour le faire. + +### Utilisation + +```dart +// Créez la classe controller qui 'extends' GetxController +class Controller extends GetxController { + int counter = 0; + void increment() { + counter++; + update(); // utilisez update() pour mettre à jour la variable de compteur sur l'interface utilisateur lorsque incrément() est appelé + } +} +// Sur votre classe Stateless / Stateful, utilisez GetBuilder pour mettre à jour le texte lorsque incrément() est appelé +GetBuilder( + init: Controller(), // INITIER CA UNIQUEMENT LA PREMIÈRE FOIS + builder: (_) => Text( + '${_.counter}', + ), +) +//Initialisez votre contrôleur uniquement la première fois. La deuxième fois que vous utilisez ReBuilder pour le même contrôleur, ne recommencez pas. Votre contrôleur sera automatiquement supprimé de la mémoire dès que le widget qui l'a marqué comme `init` sera déployé. Vous n'avez pas à vous en soucier, Get le fera automatiquement, assurez-vous simplement de ne pas démarrer deux fois le même contrôleur. +``` + +**Fait!** + +- Vous avez déjà appris à gérer les états avec Get. + +- Note: Vous pouvez souhaiter une organisation plus grande et ne pas utiliser la propriété init. Pour cela, vous pouvez créer une classe et étendre la classe Bindings, et y mentionner les contrôleurs qui seront créés dans cette route. Les contrôleurs ne seront pas créés à ce moment-là, au contraire, il ne s'agit que d'une déclaration, de sorte que la première fois que vous utilisez un contrôleur, Get saura où chercher. Get restera lazyLoad et continuera à supprimer les contrôleurs lorsqu'ils ne seront plus nécessaires. Voir l'exemple pub.dev pour voir comment cela fonctionne. + +Si vous parcourez de nombreuses routes et avez besoin de données qui se trouvaient dans votre contrôleur précédemment utilisé, il vous suffit de réutiliser GetBuilder (sans init): + +```dart +class OtherClass extends StatelessWidget { + @override + Widget build(BuildContext context) { + return Scaffold( + body: Center( + child: GetBuilder( + builder: (s) => Text('${s.counter}'), + ), + ), + ); + } + +``` + +Si vous devez utiliser votre contrôleur dans de nombreux autres endroits, et en dehors de GetBuilder, créez simplement un get dans votre contrôleur et ayez-le facilement. (ou utilisez `Get.find()`) + +```dart +class Controller extends GetxController { + + /// Vous n'en avez pas besoin. Je recommande de l'utiliser uniquement pour faciliter la syntaxe. + /// avec la méthode statique: Controller.to.counter(); + /// sans méthode statique: Get.find() .counter(); + /// Il n'y a aucune différence de performances, ni aucun effet secondaire de l'utilisation de l'une ou l'autre syntaxe. Un seul n'a pas besoin du type, et l'autre l'EDI le complétera automatiquement. + static Controller get to => Get.find(); // Ajouter cette ligne + + int counter = 0; + void increment() { + counter++; + update(); + } +} +``` + +Et puis vous pouvez accéder directement à votre contrôleur, de cette façon: + +```dart +FloatingActionButton( + onPressed:() { + Controller.to.increment(), + } // This is incredibly simple! + child: Text("${Controller.to.counter}"), +), +``` + +Lorsque vous appuyez sur FloatingActionButton, tous les widgets qui écoutent la variable `counter` seront mis à jour automatiquement. + +### Comment il gère les contrôleurs + +Disons que nous avons ceci: + +`Class a => Class B (has controller X) => Class C (has controller X)` + +Dans la classe A, le contrôleur n'est pas encore en mémoire, car vous ne l'avez pas encore utilisé (Get est lazyLoad). Dans la classe B, vous avez utilisé le contrôleur et il est entré en mémoire. Dans la classe C, vous avez utilisé le même contrôleur que dans la classe B, Get partagera l'état du contrôleur B avec le contrôleur C, et le même contrôleur est toujours en mémoire. Si vous fermez l'écran C et l'écran B, Get retirera automatiquement le contrôleur X de la mémoire et libèrera des ressources, car la classe A n'utilise pas le contrôleur. Si vous naviguez à nouveau vers B, le contrôleur X entrera à nouveau en mémoire, si au lieu de passer à la classe C, vous revenez en classe A, Get retirera le contrôleur de la mémoire de la même manière. Si la classe C n'utilisait pas le contrôleur et que vous retiriez la classe B de la mémoire, aucune classe n'utiliserait le contrôleur X et de même, elle serait éliminée. La seule exception qui peut gâcher Get, est si vous supprimez B de l'itinéraire de manière inattendue et essayez d'utiliser le contrôleur dans C.Dans ce cas, l'ID de créateur du contrôleur qui était dans B a été supprimé et Get a été programmé pour supprimer de la mémoire tous les contrôleurs qui n'ont pas d'ID de créateur. Si vous avez l'intention de faire cela, ajoutez l'indicateur "autoRemove: false" au GetBuilder de la classe B et utilisez adoptID = true; dans GetBuilder de la classe C. + +### Vous n'aurez plus besoin de StatefulWidgets + +Utiliser StatefulWidgets signifie stocker inutilement l'état d'écrans entiers, même parce que si vous avez besoin de reconstruire au minimum un widget, vous l'intègrerez dans un Consumer / Observer / BlocProvider / GetBuilder / GetX / Obx, qui sera un autre StatefulWidget. +La classe StatefulWidget est une classe plus grande que StatelessWidget, qui allouera plus de RAM, et cela ne fera peut-être pas une différence significative entre une ou deux classes, mais cela le fera très certainement lorsque vous en aurez 100! +À moins que vous n'ayez besoin d'utiliser un mixin, comme TickerProviderStateMixin, il sera totalement inutile d'utiliser un StatefulWidget avec Get. + +Vous pouvez appeler toutes les méthodes d'un StatefulWidget directement à partir d'un GetBuilder. +Si vous devez appeler la méthode initState() ou dispose() par exemple, vous pouvez les appeler directement: + +```dart +GetBuilder( + initState: (_) => Controller.to.fetchApi(), + dispose: (_) => Controller.to.closeStreams(), + builder: (s) => Text('${s.username}'), +), +``` + +Une bien meilleure approche que celle-ci consiste à utiliser les méthodes onInit() et onClose() directement à partir de votre contrôleur. + +```dart +@override +void onInit() { + fetchApi(); + super.onInit(); +} +``` + +- NOTE: Si vous voulez démarrer une méthode au moment où le contrôleur est appelé pour la première fois, vous N'AVEZ PAS BESOIN d'utiliser des constructeurs pour cela, en fait, en utilisant un package orienté performance comme Get, cela frôle la mauvaise pratique, car il s'écarte de la logique dans laquelle les contrôleurs sont créés ou alloués (si vous créez une instance de ce contrôleur, le constructeur sera appelé immédiatement, vous remplirez un contrôleur avant même qu'il ne soit utilisé, vous allouez de la mémoire sans qu'elle ne soit utilisée , cela nuit définitivement aux principes de cette bibliothèque). Les méthodes onInit(); et onClose(); ont été créés pour cela, ils seront appelés lors de la création du Controller, ou lors de sa première utilisation, selon que vous utilisez Get.lazyPut ou non. Si vous voulez, par exemple, faire un appel à votre API pour remplir des données, vous pouvez oublier la méthode à l'ancienne de initState / dispose, lancez simplement votre appel à l'API dans onInit, et si vous devez exécuter une commande comme la fermeture des flux, utilisez onClose() pour cela. + +### Pourquoi ca existe + +Le but de ce package est précisément de vous donner une solution complète pour la navigation des routes, la gestion des dépendances et des états, en utilisant le moins de dépendances possible, avec un haut degré de découplage. Get engage toutes les API Flutter de haut et bas niveau en lui-même, pour vous assurer de travailler avec le moins de couplage possible. Nous centralisons tout dans un seul package, pour vous assurer que vous n'avez aucun type de couplage dans votre projet. De cette façon, vous pouvez mettre uniquement des widgets dans votre vue et laisser la partie de votre équipe qui travaille avec la `business logique` libre, pour travailler avec la business logique sans dépendre d'aucun élément de la vue. Cela fournit un environnement de travail beaucoup plus propre, de sorte qu'une partie de votre équipe ne travaille qu'avec des widgets, sans se soucier d'envoyer des données à votre contrôleur, et une partie de votre équipe ne travaille qu'avec la business logique dans toute son ampleur, sans dépendre d'aucun élément de la Vue. + +Donc, pour simplifier cela: +Vous n'avez pas besoin d'appeler des méthodes dans initState et de les envoyer par paramètre à votre contrôleur, ni d'utiliser votre constructeur de contrôleur pour cela, vous avez la méthode onInit() qui est appelée au bon moment pour démarrer vos services. +Vous n'avez pas besoin d'appeler l'appareil, vous avez la méthode onClose() qui sera appelée au moment exact où votre contrôleur n'est plus nécessaire et sera supprimé de la mémoire. De cette façon, ne laissez les vues que pour les widgets, abstenez-vous d'y mettre tout type de business logique. + +N'appelez pas une méthode dispose() dans GetxController, cela ne fera rien, rappelez-vous que le contrôleur n'est pas un Widget, vous ne devez pas le `supprimer`, et il sera automatiquement et intelligemment supprimé de la mémoire par Get. Si vous avez utilisé un Stream et que vous souhaitez le fermer, insérez-le simplement dans la méthode close(). Exemple: + +```dart +class Controller extends GetxController { + StreamController user = StreamController(); + StreamController name = StreamController(); + + /// pour fermer stream = méthode onClose(), pas dispose(). + @override + void onClose() { + user.close(); + name.close(); + super.onClose(); + } +} +``` + +Cycle de vie du controlleur: + +- onInit() quand il est créé. +- onClose() quand il est fermé pour apporter des modifications en préparation de la méthode delete. +- deleted: vous n'avez pas accès à cette API car elle supprime littéralement le contrôleur de la mémoire. Il est littéralement supprimé, sans laisser de trace. + +### Autres formes d utilisation + +Vous pouvez utiliser l'instance Controller directement sur la valeur GetBuilder: + +```dart +GetBuilder( + init: Controller(), + builder: (value) => Text( + '${value.counter}', // ici + ), +), +``` + +Vous pouvez également avoir besoin d'une instance de votre contrôleur en dehors de votre GetBuilder, et vous pouvez utiliser ces approches pour y parvenir: + +```dart +class Controller extends GetxController { + static Controller get to => Get.find(); +[...] +} +// Dans la vue: +GetBuilder( + init: Controller(), // utilisez-le seulement la première fois sur chaque contrôleur + builder: (_) => Text( + '${Controller.to.counter}', // ici + ) +), +``` + +ou encore + +```dart +class Controller extends GetxController { + // static Controller get to => Get.find(); // sans static get +[...] +} +// Dans la classe stateful/stateless +GetBuilder( + init: Controller(), // utilisez-le seulement la première fois sur chaque contrôleur + builder: (_) => Text( + '${Get.find().counter}', // ici + ), +), +``` + +- Vous pouvez utiliser des approches `non canoniques` pour ce faire. Si vous utilisez un autre gestionnaire de dépendances, comme get_it, modular, etc., et que vous souhaitez simplement fournir l'instance de contrôleur, vous pouvez le faire: + +```dart +Controller controller = Controller(); +[...] +GetBuilder( + init: controller, // ici + builder: (_) => Text( + '${controller.counter}', // ici + ), +), + +``` + +### IDs Uniques + +Si vous souhaitez affiner le contrôle de mise à jour d'un widget avec GetBuilder, vous pouvez leur attribuer des ID uniques: + +```dart +GetBuilder( + id: 'text' + init: Controller(), // utilisez-le seulement la première fois sur chaque contrôleur + builder: (_) => Text( + '${Get.find().counter}', // ici + ), +), +``` + +Et mettez-le à jour de cette façon: + +```dart +update(['text']); +``` + +Vous pouvez également imposer des conditions pour la mise à jour: + +```dart +update(['text'], counter < 10); +``` + +GetX le fait automatiquement et ne reconstruit que le widget qui utilise la variable exacte qui a été modifiée, si vous remplacez une variable par la même que la précédente et que cela n'implique pas un changement d'état, GetX ne reconstruira pas le widget pour économiser de la mémoire et Cycles CPU (3 est affiché à l'écran, et vous changez à nouveau la variable à 3. Dans la plupart des gestionnaires d'états, cela entraînera une nouvelle reconstruction, mais avec GetX, le widget ne sera reconstruit qu'à nouveau, si en fait son état a changé ). + +## Mélanger les deux gestionnaires d'état + +Certaines personnes ont ouvert une demande de fonctionnalité, car elles ne voulaient utiliser qu'un seul type de variable réactive, et les autres mécanismes, et devaient insérer un Obx dans un GetBuilder pour cela. En y réfléchissant, MixinBuilder a été créé. Il permet à la fois des changements réactifs en changeant les variables ".obs" et des mises à jour mécaniques via update(). Cependant, des 4 widgets c'est celui qui consomme le plus de ressources, car en plus d'avoir un Abonnement pour recevoir les événements de changement de ses enfants, il souscrit à la méthode de mise à jour de son contrôleur. + +L'extension de GetxController est importante, car ils ont des cycles de vie et peuvent `démarrer` et `terminer` des événements dans leurs méthodes onInit() et onClose(). Vous pouvez utiliser n'importe quelle classe pour cela, mais je vous recommande fortement d'utiliser la classe GetxController pour placer vos variables, qu'elles soient observables ou non. + +## GetBuilder vs GetX vs Obx vs MixinBuilder + +En une décennie de travail avec la programmation, j'ai pu apprendre de précieuses leçons. + +Mon premier contact avec la programmation réactive a été tellement "wow, c'est incroyable" et en fait la programmation réactive est incroyable. +Cependant, elle ne convient pas à toutes les situations. Souvent, il suffit de changer l'état de 2 ou 3 widgets en même temps, ou d'un changement d'état éphémère, auquel cas la programmation réactive n'est pas mauvaise, mais elle n'est pas appropriée. + +La programmation réactive a une consommation de RAM plus élevée qui peut être compensée par le flux de travail individuel, ce qui garantira qu'un seul widget est reconstruit et si nécessaire, mais créer une liste avec 80 objets, chacun avec plusieurs flux n'est pas une bonne idée . Ouvrez le 'dart inspect' et vérifiez combien un StreamBuilder consomme, et vous comprendrez ce que j'essaie de vous dire. + +Dans cet esprit, j'ai créé le gestionnaire d'état simple. C'est simple, et c'est exactement ce que vous devriez lui demander: mettre à jour l'état par blocs de manière simple et de la manière la plus économique. + +GetBuilder est très économique en RAM, et il n'y a guère d'approche plus économique que lui (du moins je ne peux pas en imaginer une, si elle existe, merci de nous le faire savoir). + +Cependant, GetBuilder est toujours un gestionnaire d'état mécanique, vous devez appeler update() comme vous auriez besoin d'appeler les notifyListeners() de Provider. + +Il y a d'autres situations où la programmation réactive est vraiment intéressante, et ne pas travailler avec elle revient à réinventer la roue. Dans cet esprit, GetX a été créé pour fournir tout ce qui est le plus moderne et le plus avancé dans un gestionnaire d'état. Il met à jour uniquement ce qui est nécessaire et si nécessaire, si vous avez une erreur et envoyez 300 changements d'état simultanément, GetX filtrera et mettra à jour l'écran uniquement si l'état change réellement. + +GetX est toujours plus économique que tout autre gestionnaire d'état réactif, mais il consomme un peu plus de RAM que GetBuilder. En y réfléchissant et en visant à maximiser la consommation de ressources, Obx a été créé. Contrairement à GetX et GetBuilder, vous ne pourrez pas initialiser un contrôleur à l'intérieur d'un Obx, c'est juste un widget avec un StreamSubscription qui reçoit les événements de changement de vos widgets enfants, c'est tout. Il est plus économique que GetX, mais perd face à GetBuilder, ce qui était prévisible, car il est réactif, et GetBuilder a l'approche la plus simpliste qui existe, de stocker le hashcode d'un widget et son StateSetter. Avec Obx, vous n'avez pas besoin d'écrire votre type de contrôleur, et vous pouvez entendre le changement de plusieurs contrôleurs différents, mais il doit être initialisé avant, soit en utilisant l'approche d'exemple au début de ce readme, soit en utilisant la classe Bindings. \ No newline at end of file diff --git a/siro_rider/packages/get/documentation/id_ID/dependency_management.md b/siro_rider/packages/get/documentation/id_ID/dependency_management.md new file mode 100644 index 0000000..214896a --- /dev/null +++ b/siro_rider/packages/get/documentation/id_ID/dependency_management.md @@ -0,0 +1,395 @@ +- [Dependency Management](#dependency-management) + - [Menginstansiasi method](#menginstansiasi-method) + - [Get.put()](#getput) + - [Get.lazyPut](#getlazyput) + - [Get.putAsync](#getputasync) + - [Get.create](#getcreate) + - [Menggunakan method/kelas yang terinstansiasi](#menggunakan-methodkelas-yang-terinstansiasi) + - [Perbedaan antar method](#perbedaan-antar-method) + - [Bindings](#bindings) + - [Bindings class](#bindings-class) + - [BindingsBuilder](#bindingsbuilder) + - [SmartManagement](#smartmanagement) + - [Cara mengubahnya](#cara-mengubahnya) + - [SmartManagement.full](#smartmanagementfull) + - [SmartManagement.onlyBuilders](#smartmanagementonlybuilders) + - [SmartManagement.keepFactory](#smartmanagementkeepfactory) + - [Cara kerja bindings dibalik layar](#cara-kerja-bindings-dibalik-layar) + - [Catatan](#catatan) + +# Dependency Management + +Get memiliki dependency manager sederhana dan powerful yang memungkinkan anda mendapatkan kelas yang setara dengan Bloc atau Controller hanya dengan 1 baris kode, tanpa Provider context, tanpa inheritedWidget: + +```dart +Controller controller = Get.put(Controller()); +``` + +Daripada menginstansiasi kelas anda didalam kelas yang anda gunakan, cukup lakukan hal itu di dalam Get instance, ini akan membuatnya tersedia di semua tempat di Aplikasimu. Jadi anda bisa menggunakan controller (atau class Bloc) secara normal. + +- Catatan: Jika anda menggunakan State Manager milik Get, harap untuk lebih memperhatikan [Bindings](#bindings) api, yang mana akan membuat pengkoneksian View terhadap Controller jadi lebih mudah. +- Note²: Dependency Management Get terpisah dari bagian lain dari package, jadi jika sebagai contoh aplikasi anda sudah menggunakan state manager (tidak peduli apapun itu), anda tidak perlu menulis ulang sama sekali, anda bisa menggunakan dependency injection tanpa masalah. + +## Menginstansiasi method + +Berikut adalah metode dan parameternya yang dapat dikonfigurasi: + +### Get.put() + +Cara paling umum untuk memasukkan dependensi, untuk kontroler dari view anda contohnya. + +```dart +Get.put(SomeClass()); +Get.put(LoginController(), permanent: true); +Get.put(ListItemController, tag: "some unique string"); +``` + +Berikut adalah semua opsi yang bisa anda atur ketika menggunakan put: + +```dart +Get.put( + // wajib: kelas yang ingin anda simpan, seperti controller, atau apapun + // catatan: "S" menandakan bahwa tipenya bisa jadi sebuah kelas dari tipe apapun. + S dependency + + // opsional: ini digunakan ketika anda ingin memasukkan banyak kelas yang memiliki tipe yang sama. + // berhubung normalnya anda memanggil kelas menggunakan Get.find(), + // anda perlu menggunakan tag untuk menandai instance mana yang anda butuhkan + // tag harus unik, dan bertipe String. + String tag, + + // opsional: secara default, get akan men-dispose instance setelah tidak digunakan lagi (contoh, + // sebuah controller dari view yang ditutup), tapi mungkin anda membutuhkannya untuk digunakan + // ditempat lain di aplikasi anda, contohnya seperti sebuah instance dari SharedPreference, atau yang lain. + // Maka anda perlu ini + // nilai defaultnya adalah false + bool permanent = false, + + // opsional: memungkinkan anda setelah menggunakan kelas abstrak didalam test, menggantinya dengan yang lain dan mengikuti testnya. + // nilai defaultnya adalah false + bool overrideAbstract = false, + + // opsional: memungkinkan anda untuk memasukkan dependensi menggunakan fungsi daripada dependensi itu sendiri. + // ini jarang dipakai. + InstanceBuilderCallback builder, +) +``` + +### Get.lazyPut + +Anda bisa melakukan lazyload terhadap sebuah dependensi supaya dependensi tersebut terinstansiasi hanya ketika digunakan saja. Sangat berguna untuk kelas komputasional yang "mahal" atau jika anda ingin menginstansiasi beberapa kelas hanya dalam satu lokasi (seperti pada kelas Bindings) dan anda tahu anda tidak akan menggunakannya secara langsung. + +```dart +/// ApiMock hanya akan dipanggil ketika seseorang menggunakan Get.find pertama kali. +Get.lazyPut(() => ApiMock()); + +Get.lazyPut( + () { + // ... beberapa logic jika diperlukan.. + return FirebaseAuth(); + }, + tag: Math.random().toString(), + fenix: true +) + +Get.lazyPut( () => Controller() ) +``` + +Berikut adalah semua opsi yang bisa anda atur ketika menggunakan lazyPut: + +```dart +Get.lazyPut( + // wajib: sebuah method yang akan di eksekusi ketika kelas anda dipanggil untuk pertama kali + InstanceBuilderCallback builder, + + // opsional: sama seperti Get.put(), ini digunakan ketika anda menginginkan banyak instance berbeda dengan kelas yang sama + // harus unik dan harus String. + String tag, + + // opsional: Mirip seperti "permanent", bedanya adalah instance akan dihapus ketika tidak + // digunakan, tetapi ketika diperlukan lagi, Get akan membuat ulang instance yang sama, + // seperti "SmartManagement.keepFactory" pada bindings api. + bool fenix = false + +) +``` + +### Get.putAsync + +Jika anda ingin mendaftarkan instance yang asynchronous, anda bisa menggunakan `Get.putAsync()`: + +```dart +Get.putAsync(() async { + final prefs = await SharedPreferences.getInstance(); + await prefs.setInt('counter', 12345); + return prefs; +}); + +Get.putAsync( () async => await YourAsyncClass() ) +``` + +Berikut adalah semua opsi yang anda bisa atur ketika menggunakan putAsync: + +```dart +Get.putAsync( + + // wajib: sebuah async method yang akan di eksekusi untuk menginstansiasi kelas anda + AsyncInstanceBuilderCallback builder, + + // opsional: sama seperti Get.put(), ini digunakan ketika anda menginginkan banyak instance berbeda dengan kelas yang sama + // harus unik dan harus String. + String tag, + + // opsional: sama seperti Get.put(), digunakan ketika anda ingin mempertahankan + // instance tersebut (keep-alive) untuk digunakan diseluruh aplikasi anda. + // nilai defaultnya adalah false + bool permanent = false +) +``` + +### Get.create + +Yang satu ini agak rumit. Penjelasan lebih detail tentang ini dan perbedaannya dengan yang lain bisa ditemukan di sesi [Perbedaan antar method](#perbedaan-antar-method). + +```dart +Get.create(() => SomeClass()); +Get.create(() => LoginController()); +``` + +Berikut adalah semua opsi yang bisa anda atur ketika menggunakan create: + +```dart +Get.create( + // diperlukan: sebuah fungsi yang mereturn sebuah kelas yang akan "terfabrikasi" setiap + // kali `Get.find()` dipanggil + // Contoh: Get.create(() => YourClass()) + FcBuilderFunc builder, + + // opsional: sama seperti Get.put(), ini digunakan ketika anda menginginkan + // banyak instance berbeda dengan kelas yang sama. + // Berguna dalam kasus ketika anda memiliki sebuah list yang setiap isinya membutuhkan + // controllernya masing-masing. + // Harus unik dan harus String. Cukup ganti `tag` menjadi `name`. + String name, + + // opsional: sama seperti Get.put(), digunakan ketika anda ingin mempertahankan + // instance tersebut (keep-alive) untuk digunakan diseluruh aplikasi anda. + // Untuk Get.create, `permanent` nilainya `true` secara default. + bool permanent = true +``` + +## Menggunakan method/kelas yang terinstansiasi + +Bayangkan anda bernavigasi melewati route yang sangat banyak, dan anda membutuhkan data yang tertinggal didalam controller jauh di belakang route sebelumnya, anda akan butuh state manager dikombinasikan dengan Provider atau Get_it, benar kan? Tidak dengan Get. Anda hanya perlu meminta Get untuk "menemukan" controllernya, anda tidak perlu dependensi tambahan: + +```dart +final controller = Get.find(); +// ATAU +Controller controller = Get.find(); + +// Ya, terlihat seperti Sulap, Get akan menemukan controller anda, dan akan mengantarkannya ke lokasi anda. +// Anda bisa memiliki 1 juta controller terinisialisasi, Get akan selalu memberimu controller yang tepat. +``` + +Dan setelahnya anda bisa memperoleh data yang tertinggal sebelumnya: + +```dart +Text(controller.textFromApi); +``` + +Berhubung value yang direturn adalah sebuah kelas normal, anda bisa melakukan apapun yang anda mau: + +```dart +int count = Get.find().getInt('counter'); +print(count); // keluaran: 12345 +``` + +Untuk menghapus sebuah instance dari Get: + +```dart +Get.delete(); // biasanya anda tidak perlu melakukan ini karena GetX sudah melakukannya untuk anda +``` + +## Perbedaan antar method + +Sebelum kita mulai, mari kita bahas tentang `fenix` dari Get.lazyPut dan `permanent` dari method lainnya. + +Perbedaan mendasar diantara `permanent` dan `fenix` adalah bagaimana anda ingin menyimpannya (kelas anda). + +Menguatkan: secara default, GetX menghapus instance ketika tidak digunakan. + +Artinya: Jika screen 1 memiliki controller 1, dan screen 2 memiliki controller 2, dan anda menghapus route pertama dari stack, (seperti pada halnya anda menggunakan `Get.off()` atau `Get.offNamed()`), controller 1 akan kehilangan status kegunaannya dan akan dihapus. + +Tapi jika anda menggunakan `permanent:true`, maka controller tidak akan dihapus pada saat berpindah halaman - yang mana sangat berguna untuk service yang ingin anda pertahankan supaya tetap ada (keep-alive) diseluruh aplikasi anda. + +`fenix` di sisi lain adalah sebuah service yang anda tidak perlu khawatir kehilangan ketika berpindah antar halaman, tetapi ketika anda membutuhkan service tersebut, anda berekspektasi bahwa service tersebut masih ada. Walaupun sebenarnya, controller/service/class tetap ter-dispose, dan ketika anda membutuhkannya, dia akan membuat ulang (dari abu-nya) sebuah instance baru. + +Lanjut dengan perbedaan antar method: + +- Get.put dan Get.putAsync mengikuti urutan pembuatan yang sama, bedanya, yang kedua menggunakan asynchronous method: kedua method tersebut membuat dan menginisialisasi sebuah instance. Dimasukkan secara langsung kedalam memori, menggunakan method internal `insert` dengan parameter `permanent:false` dan `isSingleton:true` (isSingleton parameter ini hanya hanya bertujuan untuk membedakan apakah harus menggunakannya pada `dependency` atau menggunakannya pada `FcBuilderFunc`). Setelah itu, `Get.find()` dipanggil dan segera menginisialisasi instance yang ada didalam memori. + +- Get.create: seperti namanya, dia akan "membuat" dependensi anda! Mirip seperti `Get.put()`, dia juga memanggil metode internal `insert` untuk menginstansiasi. Namun mengubah `permanent` menjadi true dan `isSingleton` menjadi false (karena kita "membuat" dependensi, tidak ada cara untuk menjadikannya sebagai singleton, inilah kenapa nilainya false). Dan karena dia memiliki `permanent:true`, kita secara default memiliki keuntungan untuk tidak kehilangannya pada saat berpindah halaman! Dan juga, `Get.find()` tidak dipanggil secara langsung, dia menunggu untuk digunakan disuatu halaman untuk dipanggil. Ini dibuat dengan cara tersebut supaya bisa menggunakan parameter `permanent`, sementara itu, perlu diketahui, `Get.create()` dibuat dengan tujuan untuk membuat instance yang tidak dapat di-share, tetapi juga tidak ter-dispose, seperti contohnya sebuah button didalam ListView, dan anda menginginkan sebuah instance unik untuk list tersebut - karena itu, Get.create harus digunakan bersamaan dengan GetWidget. + +- Get.lazyPut: seperti namanya, ini membuat "lazy process". Instance nya dibuat, namun tidak digunakan secara langsung, dia menunggu untuk dipanggil. Bertentangan dengan metode lain, `insert` tidak dipanggil disini. Sebaliknya, instance dimasukkan ke bagian lain didalam memori, bagian yang bertanggung jawab untuk memberi tahu apakah instance bisa dibuat ulang atau tidak, mari kita sebut itu sebagai "factory". Jika kita ingin membuat sesuatu untuk digunakan nanti, ini tidak akan tercampur dengan yang digunakan sekarang. Dan disini adalah dimana "sihir" `fenix` terjadi: jika anda memilih untuk membiarkan `fenix: false`, dan `smartManagement` bukan `keepFactory`, maka ketika menggunakan `Get.find`, instance akan mengubah posisinya didalam memori supaya tersedia di bagian terpisah ini, bahkan menuju ke area umum, untuk dipanggil lagi di masa yang akan datang. + +## Bindings + +Salah satu dari perbedaan besar dari package ini, mungkin, adalah suatu kemungkinan untuk mengintegrasikan route, state manager, dan dependency manager secara penuh. + +Ketika route dihapus dari Stack, semua kontroler, variabel, dan instance yang berhubungan dengan itu akan dihapus dari memori. Jika anda menggunakan stream atau timer, mereka akan ditutup secara otomatis, dan anda tidak perlu khawatir tentang hal itu. + +Di versi 2.10, Get benar-benar mengimplementasi Bindings API. Sekarang anda tidak perlu menggunakan init method. Bahkan anda tidak perlu mengetik controller yang ingin anda tuju jika anda mau. Anda bisa memulai controller dan service di tempat yang tepat untuk itu. + +Binding class adalah sebuah kelas yang memisahkan dependency injection, sembari "mengaitkan" route ke state manager dan dependency manager. + +Ini memungkinkan Get untuk mengetahui tampilan mana yang sedang ditampilkan ketika controller yang bersangkutan digunakan dan untuk mengetahui bagaimana cara men-dispose nya. + +Sebagai tambahan, Binding class memungkinkan anda untuk memiliki kontrol terhadap konfigurasi SmartManager. Anda bisa mengkonfigurasi dependensi anda untuk diurutkan ketika penghapusan route dari stack, atau ketika widget yang digunakan diletakkan, atau tidak keduanya. Anda akan memiliki dependensi management pintar yang bekerja untuk anda, tapi meski begitu, anda bisa mengkonfigurasinya sesuka hati anda. + +### Bindings class + +- Buat sebuah kelas yang meng-implements Bindings + +```dart +class HomeBinding implements Bindings {} +``` + +IDE anda akan secara otomatis meminta anda untuk meng-override "dependencies method", dan anda hanya perlu klik ikon lampu, override method nya, dan masukkan semua kelas yang akan anda gunakan dalam route tersebut: + +```dart +class HomeBinding implements Bindings { + @override + void dependencies() { + Get.lazyPut(() => HomeController()); + Get.put(()=> Api()); + } +} + +class DetailsBinding implements Bindings { + @override + void dependencies() { + Get.lazyPut(() => DetailsController()); + } +} +``` + +Sekarang anda hanya perlu memberi tahu route anda, bahwa anda akan menggunakan binding tersebut untuk membuat koneksi diantara route manager, dependency manager dan state. + +- Menggunakan named route: + +```dart +getPages: [ + GetPage( + name: '/', + page: () => HomeView(), + binding: HomeBinding(), + ), + GetPage( + name: '/details', + page: () => DetailsView(), + binding: DetailsBinding(), + ), +]; +``` + +- Menggunakan normal route: + +```dart +Get.to(Home(), binding: HomeBinding()); +Get.to(DetailsView(), binding: DetailsBinding()) +``` + +Disana, anda tidak perlu lagi khawatir tentang manajemen memori aplikasi anda, Get akan melakukannya untuk anda. + +Binding akan dipanggil ketika route dipanggil, anda juga bisa membuat sebuah "initialBinding" di GetMaterialApp dan memasukkan semua dependensi yang diperlukan. + +```dart +GetMaterialApp( + initialBinding: SampleBind(), + home: Home(), +); +``` + +### BindingsBuilder + +Secara default, untuk membuat sebuah binding adalah dengan membuat kelas baru yang meng-implements Bindings. +Secara alternatif, anda bisa menggunakan `BindingsBuilder` untuk menginstansiasi apapun yang anda mau melalui sebuah fungsi callback. + +Example: + +```dart +getPages: [ + GetPage( + name: '/', + page: () => HomeView(), + binding: BindingsBuilder(() { + Get.lazyPut(() => ControllerX()); + Get.put(()=> Api()); + }), + ), + GetPage( + name: '/details', + page: () => DetailsView(), + binding: BindingsBuilder(() { + Get.lazyPut(() => DetailsController()); + }), + ), +]; +``` + +Dengan cara ini, anda bisa menghindari membuat satu kelas Binding untuk setiap route yang anda buat, membuatnya jadi semakin simpel. + +Kedua cara tersebut bekerja secara sempurna dan kami ingin anda menggunakan yang manapun yang anda rasa cocok untuk anda. + +### SmartManagement + +GetX secara default men-dispose controller yang tidak digunakan dari memori, bahkan jika kegagalan terjadi dan widget yang menggunakannya tidak ter-dispose dengan benar. +Ini adalah apa yang disebut dengan `full` mode dari sebuah dependency management. +Tetapi jika anda ingin mengubah cara kerja GetX dalam mengontrol "disposal" terhadap kelas, anda memiliki kelas `SmartManagement` yang anda bisa atur perilakunya. + +#### Cara mengubahnya + +Jika anda ingin mengubah konfigurasi ini (yang biasanya tidak diperlukan), ini caranya: + +```dart +void main () { + runApp( + GetMaterialApp( + smartManagement: SmartManagement.onlyBuilders // Disini + home: Home(), + ) + ) +} +``` + +#### SmartManagement.full + +Ini adalah pengaturan default. Dispose semua kelas yang tidak digunakan dan tidak ditandai sebagai permanent. Di kebanyakan kasus anda ingin konfigurasi ini tidak disentuh. Jika anda baru di GetX, jangan mengubahnya. + +#### SmartManagement.onlyBuilders + +Dengan opsi ini, hanya controller yang dimulai didalam `init:` atau yang ter-load kedalam sebuah Binding dengan `Get.lazyPut()`, yang akan di dispose. + +Jika anda menggunakan `Get.put()` atau `Get.putAsync()` atau cara lain, SmartManagement tidak akan memiliki izin untuk meng-exclude dependensi ini. + +Dengan perilaku default, bahkan widget yang terinstansiasi dengan "Get.put" akan dihapus, tidak seperti SmartManagement.onlyBuilders. + +#### SmartManagement.keepFactory + +Sama seperti SmartManagement.full, ini akan menghapus semua dependensi ketika tidak digunakan lagi. Meski begitu, ini akan menyimpan factory mereka, yang artinya dia akan membuat ulang dependensi jika anda membutuhkannya lagi. + +### Cara kerja bindings dibalik layar + +Bindings membuat factory sementara, yang mana dibuat ketika anda meng-klik untuk pindah ke halaman lain, dan akan dihapus segera setelah animasi perpindahan halaman terjadi. +Ini terjadi begitu cepat bahkan analyzer sekalipun tidak bisa meregistrasikannya. +Ketika anda kembali ke halaman itu lagi, factory baru akan dipanggil, jadi ini lebih disarankan daripada menggunakan SmartManagement.keepFactory, tapi jika anda tidak ingin membuat Bindings, atau ingin menyimpan semua dependensi didalam Binding yang sama, itu akan sangat membantu. +Konsumsi memori terhadap Factory sangatlah kecil, mereka tidak memegang instance, hanya sebuah fungsi dengan "bentukan" dari kelas yang anda inginkan. +Ini sangat menghemat penggunaan memori, tetapi karena tujuan dari lib ini adalah untuk mendapatkan performa maksimum dan menggunakan resource seminimum mungkin, Get menghapus bahkan si factory itu sendiri secara default. +Gunakan mana yang anda rasa mudah untuk anda. + +## Catatan + +- JANGAN GUNAKAN SmartManagement.keepFactory jika anda menggunakan lebih dari satu Bindings. Ini dedesain untuk digunakan tanpa Bindings, atau dengan satu Binding terhubung dengan initialBinding milik GetMaterialApp. + +- Menggunakan Binding sifatnya opsional, jika anda mau, anda bisa menggunakan `Get.put()` dan `Get.find()` untuk kelas yang menggunakan controller tanpa masalah. + Meski begitu, jika anda bekerja dengan Service atau segala jenis abstraksi lain, Saya merekomendasikan menggunakan Bindings supaya pengorganisiran menjadi lebih baik. diff --git a/siro_rider/packages/get/documentation/id_ID/route_management.md b/siro_rider/packages/get/documentation/id_ID/route_management.md new file mode 100644 index 0000000..75e78a0 --- /dev/null +++ b/siro_rider/packages/get/documentation/id_ID/route_management.md @@ -0,0 +1,564 @@ +- [Route Management](#route-management) + - [Cara pakai](#cara-pakai) + - [Navigasi tanpa named route](#navigasi-tanpa-named-route) + - [Navigasi menggunakan named route](#navigasi-menggunakan-named-route) + - [Mengirim data ke named route](#mengirim-data-ke-named-route) + - [Tautan URL dinamis](#tautan-url-dinamis) + - [Middleware](#middleware) + - [Navigasi tanpa konteks](#navigasi-tanpa-konteks) + - [SnackBar](#snackbar) + - [Dialog](#dialog) + - [BottomSheet](#bottomsheet) + - [Navigasi Bersarang](#navigasi-bersarang) + +# Route Management + +Ini adalah penjelasan lengkap mengenai route management di GetX. + +## Cara pakai + +Tambahkan ini kedalam pubspec.yaml anda: + +```yaml +dependencies: + get: +``` + +Jika anda akan menggunakan route/snackbar/dialog/bottomsheet tanpa konteks, atau menggunakan high-level API dari Get, cukup tambahkan "Get" sebelum MaterialApp, mengubahnya menjadi GetMaterialApp, dan selamat menikmati! + +```dart +GetMaterialApp( // Sebelumnya: MaterialApp( + home: MyHome(), +) +``` + +## Navigasi tanpa named route + +Untuk pindah ke halaman baru: + +```dart +Get.to(NextScreen()); +``` + +Untuk menutup snackbar, dialog, bottomsheet, atau apapun yang normalnya anda tutup menggunakan Navigator.pop(context); + +```dart +Get.back(); +``` + +Untuk pergi ke halaman baru dan mencegah user kembali ke halaman sebelumnya (biasanya digunakan untuk SplashScreen, LoginScreen, dsb). + +```dart +Get.off(NextScreen()); +``` + +Untuk pergi ke halaman baru dan batalkan navigasi sebelumnya (berguna untuk shopping cart, polls, dan test). + +```dart +Get.offAll(NextScreen()); +``` + +Untuk pergi ke halaman baru dan menerima atau memperbarui data segera setelah anda kembali dari halaman tersebut: + +```dart +var data = await Get.to(Payment()); +``` + +pada halaman lain, kirim data ke halaman sebelumnya: + +```dart +Get.back(result: 'success'); +``` + +Lalu gunakan: + +contoh: + +```dart +if(data == 'success') madeAnything(); +``` + +Bukankah anda ingin mempelajari sintaks kami? +Cukup ubah Navigator (uppercase) ke navigator (lowercase), dan anda akan mendapatkan semua fungsi standar navigasi, tanpa harus menggunakan konteks. +Contoh: + +```dart + +// Navigator bawaan Flutter +Navigator.of(context).push( + context, + MaterialPageRoute( + builder: (BuildContext context) { + return HomePage(); + }, + ), +); + +// Get menggunakan sintaks Flutter tanpa membutuhkan konteks. +navigator.push( + MaterialPageRoute( + builder: (_) { + return HomePage(); + }, + ), +); + +// Sintaks Get (Lebih baik, tapi anda juga berhak untuk tidak setuju) +Get.to(HomePage()); + + +``` + +## Navigasi menggunakan named route + +- Jika anda lebih suka bernavigasi menggunakan namedRoutes, Get juga bisa melakukannya. + +Untuk pindah ke halaman nextScreen + +```dart +Get.toNamed("/NextScreen"); +``` + +Untuk pindah dan hapus halaman sebelumnya dari widget tree. + +```dart +Get.offNamed("/NextScreen"); +``` + +Untuk pindah dan hapus semua halaman sebelumnya dari widget tree. + +```dart +Get.offAllNamed("/NextScreen"); +``` + +Untuk mendifinisikan route, gunakan GetMaterialApp: + +```dart +void main() { + runApp( + GetMaterialApp( + initialRoute: '/', + getPages: [ + GetPage(name: '/', page: () => MyHomePage()), + GetPage(name: '/second', page: () => Second()), + GetPage( + name: '/third', + page: () => Third(), + transition: Transition.zoom + ), + ], + ) + ); +} +``` + +Untuk menangani navigasi ke route yang tidak terdefinisi (404), anda bisa mendefinisikan sebuah halaman unknownRoute didalam GetMaterialApp. + +```dart +void main() { + runApp( + GetMaterialApp( + unknownRoute: GetPage(name: '/notfound', page: () => UnknownRoutePage()), + initialRoute: '/', + getPages: [ + GetPage(name: '/', page: () => MyHomePage()), + GetPage(name: '/second', page: () => Second()), + ], + ) + ); +} +``` + +### Mengirim data ke named route + +Cukup kirim apa yang anda mau sebagai arguments. Get menerima apapun disitu, baik dalam bentuk String, Map, List atau bahkan instance dari sebuah Kelas. + +```dart +Get.toNamed("/NextScreen", arguments: 'Get is the best'); +``` + +di dalam kelas atau controller anda: + +```dart +print(Get.arguments); +// keluaran: Get is the best +``` + +### Tautan URL dinamis + +Get menawarkan tautan URL dinamis lebih lanjut sama seperti di Web. Para Web developer mungkin sudah menginginkan fitur ini di Flutter, dan mungkin juga sering melihat sebuah package menjanjikan fitur ini dan mengantarkan sintaks yang benar benar berbeda dari sebuah URL yang kita miliki di web, Get juga menyelesaikan masalah ini. + +```dart +Get.offAllNamed("/NextScreen?device=phone&id=354&name=Enzo"); +``` + +didalam controller/bloc/stateful/stateless class anda: + +```dart +print(Get.parameters['id']); +// keluaran: 354 +print(Get.parameters['name']); +// keluaran: Enzo +``` + +Anda juga bisa menerima NamedParameters dengan Get dengan mudah: + +```dart +void main() { + runApp( + GetMaterialApp( + initialRoute: '/', + getPages: [ + GetPage( + name: '/', + page: () => MyHomePage(), + ), + GetPage( + name: '/profile/', + page: () => MyProfile(), + ), + // Anda bisa mendefinisikan halaman berbeda untuk routes dengan arguments, + // dan yang lainnya tanpa arguments, namun untuk itu anda perlu slash '/' + // pada route yang tidak menerima arguments seperti diatas. + GetPage( + name: '/profile/:user', + page: () => UserProfile(), + ), + GetPage( + name: '/third', + page: () => Third(), + transition: Transition.cupertino + ), + ], + ) + ); +} +``` + +Kirim data ke named route + +```dart +Get.toNamed("/profile/34954"); +``` + +Pada halaman kedua, ambil data menggunakan parameter + +```dart +print(Get.parameters['user']); +// keluaran: 34954 +``` + +atau kirim beberapa parameter seperti ini + +```dart +Get.toNamed("/profile/34954?flag=true"); +``` + +Pada layar kedua, ambil data berdasarkan parameter seperti biasanya + +```dart +print(Get.parameters['user']); +print(Get.parameters['flag']); +// keluaran: 34954 true +``` + + +Dan sekarang, yang anda perlu lakukan adalah menggunakan Get.toNamed() untuk bernavigasi ke named route anda, tanpa konteks (anda bisa memanggil route secara langsung dari kelas BLoC atau Controller), dan ketika aplikasi anda di-compile di web, route anda akan muncul di url <3 + +### Middleware + +Jika anda ingin me-listen sebuah Get event untuk melakukan sebuah action, anda bisa menggunakan routingCallback didalamnya. + +```dart +GetMaterialApp( + routingCallback: (routing) { + if(routing.current == '/second'){ + openAds(); + } + } +) +``` + +Jika anda tidak menggunakan GetMaterialApp, anda bisa menggunakan API untuk mengaitkan Middleware observer secara manual. + +```dart +void main() { + runApp( + MaterialApp( + onGenerateRoute: Router.generateRoute, + initialRoute: "/", + navigatorKey: Get.key, + navigatorObservers: [ + GetObserver(MiddleWare.observer), // Disini + ], + ), + ); +} +``` + +Membuat sebuah kelas Middleware + +```dart +class MiddleWare { + static observer(Routing routing) { + /// Anda bisa me-listen sebuah route, snackbar, dialog, dan bottomsheet disetiap halaman. + /// Jika anda harus memasukkan salah satu dari 3 event tersebut secara langsung disini, + /// anda perlu menyebutkan bahwa event tersebut != (tidak sama dengan) apa yang mau anda lakukan. + if (routing.current == '/second' && !routing.isSnackbar) { + Get.snackbar("Halo", "Anda sedang berada di route kedua"); + } else if (routing.current =='/third'){ + print('route terakhir dipanggil'); + } + } +} +``` + +Sekarang, gunakan Get dalam kode anda: + +```dart +class First extends StatelessWidget { + @override + Widget build(BuildContext context) { + return Scaffold( + appBar: AppBar( + leading: IconButton( + icon: Icon(Icons.add), + onPressed: () { + Get.snackbar("halo", "saya adalah snackbar modern"); + }, + ), + title: Text('Halaman Pertama'), + ), + body: Center( + child: ElevatedButton( + child: Text('Pindah halaman'), + onPressed: () { + Get.toNamed("/second"); + }, + ), + ), + ); + } +} + +class Second extends StatelessWidget { + @override + Widget build(BuildContext context) { + return Scaffold( + appBar: AppBar( + leading: IconButton( + icon: Icon(Icons.add), + onPressed: () { + Get.snackbar("halo", "saya adalah snackbar modern"); + }, + ), + title: Text('Halaman kedua'), + ), + body: Center( + child: ElevatedButton( + child: Text('Pindah halaman'), + onPressed: () { + Get.toNamed("/third"); + }, + ), + ), + ); + } +} + +class Third extends StatelessWidget { + @override + Widget build(BuildContext context) { + return Scaffold( + appBar: AppBar( + title: Text("Halaman ketiga"), + ), + body: Center( + child: ElevatedButton( + onPressed: () { + Get.back(); + }, + child: Text('Kembali!'), + ), + ), + ); + } +} +``` + +## Navigasi tanpa konteks + +### SnackBar + +Untuk mendapatkan SnackBar sederhana dengan Flutter, anda harus mendapatkan konteks dari sebuah Scaffold, atau anda harus menggunakan GlobalKey yang dikaitkan pada Scaffold anda + +```dart +final snackBar = SnackBar( + content: Text('Halo!'), + action: SnackBarAction( + label: 'Saya adalah snackbar tua yang jelek :(', + onPressed: () {} + ), +); +// Temukan Scaffold didalam widget tree dan gunakan itu +// untuk menampilkan snackbar +Scaffold.of(context).showSnackBar(snackBar); +``` + +Dengan Get: + +```dart +Get.snackbar('Halo', 'Saya adalah snackbar modern'); +``` + +Dengan Get, yang anda butuhkan hanya memanggil Get.snackbar darimanapun di kode anda atau menyesuaikannya sesuka hati anda! + +```dart +Get.snackbar( + "Halo, saya snackbar milik Get!", // judul + "Sulit dipercaya! Saya menggunakan SnackBar tanpa konteks, tanpa boilerplate, tanpa Scaffold, ini benar benar keren!", // pesan + icon: Icon(Icons.alarm), + shouldIconPulse: true, + onTap: () {}, + barBlur: 20, + isDismissible: true, + duration: Duration(seconds: 3), +); + + + ////////// SEMUA FITUR ////////// + // Color colorText, + // Duration duration, + // SnackPosition snackPosition, + // Widget titleText, + // Widget messageText, + // bool instantInit, + // Widget icon, + // bool shouldIconPulse, + // double maxWidth, + // EdgeInsets margin, + // EdgeInsets padding, + // double borderRadius, + // Color borderColor, + // double borderWidth, + // Color backgroundColor, + // Color leftBarIndicatorColor, + // List boxShadows, + // Gradient backgroundGradient, + // TextButton mainButton, + // OnTap onTap, + // bool isDismissible, + // bool showProgressIndicator, + // AnimationController progressIndicatorController, + // Color progressIndicatorBackgroundColor, + // Animation progressIndicatorValueColor, + // SnackStyle snackStyle, + // Curve forwardAnimationCurve, + // Curve reverseAnimationCurve, + // Duration animationDuration, + // double barBlur, + // double overlayBlur, + // Color overlayColor, + // Form userInputForm + /////////////////////////////////// +``` + +Jika anda lebih menyukai snackbar tradisional, atau ingin menyesuaikannya sendiri dari awal, termasuk menambahkan hanya satu baris (Get.snackbar memanfaatkan title dan message yang diperlukan), anda bisa gunakan +`Get.rawSnackbar();` yang akan menyediakan RAW API untuk Get.snackbar yang dibuat. + +### Dialog + +Untuk membuka dialog: + +```dart +Get.dialog(YourDialogWidget()); +``` + +Untuk membuka default dialog: + +```dart +Get.defaultDialog( + onConfirm: () => print("Ok"), + middleText: "Dialog made in 3 lines of code" +); +``` + +Anda juga bisa menggunakan Get.generalDialog daripada showGeneralDialog. + +Untuk semua widget dialog di Flutter, termasuk cupertino, anda bisa menggunakan Get.overlayContext daripada context, dan membukanya darimanapun di kode anda. +Untuk widget yang tidak menggunakan Overlay, anda bisa menggunakan Get.context. +Kedua konteks akan bekerja dalam 99% kasus untuk me-replace konteks dari UI anda, kecuali untuk kasus dimana inheritedWidget digunakan tanpa konteks navigasi. + +### BottomSheet + +Get.bottomSheet sama seperti showModalBottomSheet, tapi tidak membutuhkan konteks. + +```dart +Get.bottomSheet( + Container( + child: Wrap( + children: [ + ListTile( + leading: Icon(Icons.music_note), + title: Text('Music'), + onTap: () {} + ), + ListTile( + leading: Icon(Icons.videocam), + title: Text('Video'), + onTap: () {}, + ), + ], + ), + ) +); +``` + +## Navigasi Bersarang + +Get membuat navigasi bersarang milik Flutter menjadi lebih mudah. +Anda tidak perlu konteks, dan anda akan menemukan stack navigasi melalui Id. + +- CATATAN: Membuat stack navigasi parallel bisa jadi berbahaya. Sebaiknya hindari penggunaan Navigasi Bersarang, atau gunakan dengan bijak. Jika proyek anda membutuhkannya, silahkan, tapi mohon di ingat bahwa menyimpan lebih dari satu navigation stack didalam memori mungkin bukan ide yang bagus untuk konsumsi RAM. + +Lihat betapa sederhananya ini: + +```dart +Navigator( + key: Get.nestedKey(1), // buat sebuah key menggunakan index + initialRoute: '/', + onGenerateRoute: (settings) { + if (settings.name == '/') { + return GetPageRoute( + page: () => Scaffold( + appBar: AppBar( + title: Text("Main"), + ), + body: Center( + child: TextButton( + color: Colors.blue, + onPressed: () { + Get.toNamed('/second', id:1); // pindah ke halaman bersarang anda menggunakan index + }, + child: Text("Go to second"), + ), + ), + ), + ); + } else if (settings.name == '/second') { + return GetPageRoute( + page: () => Center( + child: Scaffold( + appBar: AppBar( + title: Text("Main"), + ), + body: Center( + child: Text("second") + ), + ), + ), + ); + } + } +), +``` diff --git a/siro_rider/packages/get/documentation/id_ID/state_management.md b/siro_rider/packages/get/documentation/id_ID/state_management.md new file mode 100644 index 0000000..1e821c0 --- /dev/null +++ b/siro_rider/packages/get/documentation/id_ID/state_management.md @@ -0,0 +1,746 @@ +- [State Management](#state-management) + - [Reactive State Manager](#reactive-state-manager) + - [Keuntungan](#keuntungan) + - [Performa Maksimum](#performa-maksimum) + - [Mendeklarasikan reactive variable](#mendeklarasikan-reactive-variable) + - [Memiliki sebuah reactive state itu, mudah](#memiliki-sebuah-reactive-state-itu-mudah) + - [Menggunakan value didalam view](#menggunakan-value-didalam-view) + - [Kondisi untuk rebuild](#kondisi-untuk-rebuild) + - [Dimana .obs bisa digunakan](#dimana-obs-bisa-digunakan) + - [Catatan mengenai List](#catatan-mengenai-list) + - [Mengapa harus menggunakan .value](#mengapa-harus-menggunakan-value) + - [Obx()](#obx) + - [Worker](#worker) + - [Simple State Manager](#simple-state-manager) + - [Keuntungan](#keuntungan-1) + - [Penggunaan](#penggunaan) + - [Bagaimana Get meng-handle controller](#bagaimana-get-meng-handle-controller) + - [Anda tidak membutuhkan StatefulWidget lagi](#anda-tidak-membutuhkan-statefulwidget-lagi) + - [Mengapa GetX ada](#mengapa-getx-ada) + - [Cara lain dalam menggunakannya](#cara-lain-dalam-menggunakannya) + - [Unique ID](#unique-id) + - [Mencampur 2 state manager](#mencampur-2-state-manager) + - [GetBuilder vs GetX vs Obx vs MixinBuilder](#getbuilder-vs-getx-vs-obx-vs-mixinbuilder) + +# State Management + +GetX tidak menggunakan Stream atau ChangeNotifier seperti state manager lainnya. Mengapa? Selain membangun aplikasi untuk Android, iOS, Web, Linux, MacOS, dan Linux, dengan GEtX anda bisa membangun aplikasi server dengan sintaks yang sama seperti Flutter/GetX. Untuk meningkatkan waktu response dan mengurangi konsumsi RAM, kami menciptakan GetValue dan GetStream, yang memiliki solusi latensi rendah yang dapat memberikan performa yang banyak dengan biaya operasi yang rendah. Kami menggunakan ini sebagai dasar untuk membangun semua resource kami, termasuk state management. + +- _Kompleksitas_: Beberapa state manager yang ada bisa dibilang kompleks dan memiliki banyak boilerplate. Dengan GetX anda tidak perlu mendefinisikan sebuah kelas untuk setiap event, kode yang dibuat pun bersih dan jelas, dan anda bisa melakukan banyak hal dengan menulis lebih sedikit kode. Banyak orang menyerah menggunakan Flutter karena hal ini, dan pada akhirnya mereka mendapatkan solusi yang sangat sederhana untuk me-manage state. + +- _Tidak ada code generator_: Anda menghabiskan separuh waktu development anda menuliskan logic dari aplikasi yang anda buat. Beberapa state manager bergantung pada code generator yang menghasilkan kode dengan keterbacaan yang rendah. Mengubah sebuah variabel dan perlu menjalankan run build_runner bisa jadi tidak produktif, dan terkadang waktu menunggu setelah sebuah flutter clean akan lama, dan anda harus meminum banyak kopi untuk itu. + +Dengan GetX semuanya reactive, dan tidak bergantung pada code generator, meningkatkan produktifitas di segala aspek development anda. + +- _Tidak bergantung pada konteks_: Anda mungkin pernah diharuskan untuk mengirim konteks dari view ke sebuah controller, membuat keterkaitan yang tinggi terhadap View yang anda buat dengan Business Logic. Anda mungkin pernah diharuskan untuk menggunakan dependensi untuk suatu tempat yang tidak memiliki konteks, dan harus mengirim koteks tersebut melalui berbagai macam kelas dan fungsi. Hal ini tidak ada di GetX. Anda memiliki akses terhadap controller anda dari controller yang anda buat tanpa konteks apapun. Anda tidak perlu mengirim konteks melalui parameter untuk hal yang secara harfiah tidak diperlukan. + +- _Kontrol granular_: Kebanyakan state manager didasari oleh ChangeNotifier. ChangeNotifier akan memberi tahu semua widget yang bergantung padanya ketika notifyListener dipanggil. Jika anda memiliki 40 widget didalam satu halaman, yang mana memiliki variabel dari kelas ChangeNotifier anda, ketika anda memperbarui satu dari mereka, semuanya akan me-rebuild. +Dengan GetX, bahkan nested widget pun dihargai. Jika anda memiliki Obx membungkus ListView anda, dan yang lain membungkus sebuah checkbox didalam ListView tersebut, ketika nilai dari CheckBox berubah, hanya CheckBox tersebut yang akan diperbarui, ketika nilai dari List yang berubah, hanya ListView yang akan diperbarui. + +- _Hanya merekonstruksi jika variabelnya BENAR-BENAR berubah_: GetX memiliki kontrol flow, yang artinya jika anda menampilkan Text dengan 'Paola', jika anda mengubah variabel observabel menjadi 'Paola' lagi, widget tidak akan direkonstruksi. Ini karena GetX tahu bahwa 'Paola' sudah ditampilkan di Text, dan tidak akan melakukan rekonstruksi yang tidak diperlukan. +Kebanyakan state manager (jika tidak semuanya) saat ini akan merebuild tampilan. + +## Reactive State Manager + +Reactive programming bisa meng-alienasi banya orang karena katanya, sulit dimengerti. GetX mengubah reactive programming menjadi sesuatu yang cukup sederhana: + +- Anda tidak perlu membuat StreamController. +- Anda tidak perlu membuat StreamBuilder untuk setiap variabel. +- Anda tidak perlu membuat kelas untuk setiap state. +- Anda tidak perlu membuat get untuk sebuah value awal (initial value). +- Anda tidak perlu menggunakan generator kode. + +Reactive programming dengan Get semudah menggunakan setState. + +Bayangkan anda memiliki variabel nama, dan setiap kali anda mengubahnya, semua widget yang menggunakannya akan berubah secara otomatis. + +Ini variabel count anda: + +```dart +var name = 'Jonatas Borges'; +``` + +Untuk membuatnya "observable", anda hanya perlu menambahkan ".obs" di belakangnya: + +```dart +var name = 'Jonatas Borges'.obs; +``` + +Selesai! _Sesederhana_ itu. + +Mulai saat ini, kami akan mereferensikan variabel reactive-".obs"(ervables) sebagai _Rx_. + +Apa yang kami lakukan dibalik layar? Kami membuat sebuah `Stream` dari `String`, mengajukan value awal `"Jonatas Borges"`, kami memberi tahu semua widget yang menggunakan `"Jonatas Borges"` bahwa mereka sekarang "milik" variabel tersebut, dan ketika nilai _Rx_ berubah, mereka harus mengubahnya juga. + +Ini adalah **keajaiban dari GetX**, terima kasih untuk kemampuan Dart. + +Tapi, seperti yang kita ketahui, sebuah `Widget` hanya bisa dirubah jika lokasinya berada didalam sebuah fungsi, karena kelas static tidak memiliki kemampuan untuk "otomatis berubah" + +Anda akan harus untuk membuat `StreamBuilder`, berlangganan ke variabel tersebut untuk "mendengar" perubahan, dan membuat sebuah "cascade" dari nested `StreamBuilder` jika anda ingin mengubah beberapa variabel didalam scope, benar kan? + +Tidak, anda tidak perlu `StreamBuilder`, tapi anda benar tentang kelas static. + +Yah, didalam view, kita biasanya memiliki banyak boilerplate ketika kita ingin mengubah sebuah Widget secara spesifik, itu adalah cara Flutter. +Dengan **GetX** anda juga bisa melupakan tentang boilerplate code ini. + +`StreamBuilder( … )`? `initialValue: …`? `builder: …`? Tidak, anda hanya perlu meletakkan variabel kedalam Widget `Obx()`. + +```dart +Obx (() => Text (controller.name)); +``` + +_Apa yang perlu anda ingat?_ Hanya `Obx(() =>`. + +Anda hanya mengirim Widget itu melalui sebuah arrow-function kedalam sebuah `Obx()` (sebuah "Pengamat" daripada _Rx_). + +`Obx` cukup pintar, dan akan selalu berubah jika value dari `controller.name` berubah. + +Jika `name` nilainya `"John"`, dan anda mengubahnya ke `"John"` (`name.value = "John"`), karena `value` nya sama seperti sebelumnya, tidak akan ada perubahan apapun di layar, dan `Obex`, untuk menghemat resource, akan secara sederhana mengabaikan value baru yang diberikan dan tidak akan merebuild Widget. **Keren kan?** + +> Lalu, bagaimana jika Saya memiliki 5 variabel _Rx_ (observable) didalam `Obx`? + +Dia hanya akan memperbarui ketika **semuanya** berubah. + +> Dan jika Saya memiliki 30 variabel didalam sebuah kelas, ketika Saya memperbarui salah satu dari mereka, apakah akan memperbarui **semua** variabel didalam kelas tersebut? + +Tidak, hanya **Widget tertentu* yang menggunakan variabel _Rx_ tersebut. + +Jadi, **GetX** hanya memperbarui tampilan, ketika nilai dari variabel _Rx_ berubah. + +```dart +final isOpen = false.obs; + +// TIDAK AKAN terjadi apa apa... nilainya sama. +void onButtonTap() => isOpen.value=false; +``` + +### Keuntungan + +**GetX()** membantu anda ketika anda membutuhkan kontrol **granular** atas apa yang sedang diperbarui. + +Jika anda tidak membutuhkan `unique ID`, karena semua variabel anda akan di modifikasi ketika anda melakukan sebuah aksi, maka gunakanlah `GetBuilder`, +karena dia adalah Simple State Updater (didalam block, seperti `setState()`), dibuat hanya dengan beberapa baris kode. +Ini dibuat sederhana, untuk mendapatkan pengaruh CPU yang sedikit, dan hanya untuk memenuhi satu kebutuhan (sebuah _State_ rebuild) dan menggunakan resource se-minimal mungkin. + +Jika anda perlu sebuah State Manager yang **powerful**, anda tidak akan salah dengan **GetX**. + +Ini tidak bekerja dengan variabel, melainkan __aliran (flows)__, semuanya adalah `Streams` dibalik layar. +Anda bisa menggunakan _rxDart_ bersamaan dengannya, karena semuanya adalah `Streams`, +anda bisa me-listen sebuah `event` dari setiap "variabel _Rx_", +karena semua didalamnya adalah `Streams`. + +Ini secara harfiah adalah cara yang digunakan _BLoC_, lebih mudah dari _MobX_, dan tanpa code generator atau decoration. +Anda bisa mengubah **apapun** menjadi sebuah _"Observable"_ hanya dengan `.obs`. + +### Performa Maksimum + +Selain memiliki sebuah algoritma pintar untuk minimal rebuild, **GetX** menggunakan pembanding +untuk memastikan State nya berubah. + +Jika anda mengalami error di aplikasi anda, dan mengirim sebuah duplikat terhadap perubahan State, +**GetX** akan memastikan aplikasi anda tidak crash. + +Dengan **GetX**, State hanya berubah ketika `value` nya berubah. +Itu adalah perbedaan utama diantara **GetX**, dan dengan menggunakan _`computed` dari MobX_. +Ketika menggabungkan kedua __observable__, dan salah satunya berubah; listener dari _observable_ itu akan berubah juga. + +Dengan **GetX**, jika anda menggabungkan dua variabel, `GetX()` (mirip seperti `Observer()`) hanya akan merebuild jika State nya benar-benar berubah. + +### Mendeklarasikan reactive variable + +Anda memiliki 3 cara untuk mengubah variabel menjadi sebuah "observable". + +1 - Yang pertama adalah dengan menggunakan **`Rx{Type}`**. + +```dart +// value awal direkomendasikan, tetapi tidak wajib +final name = RxString(''); +final isLogged = RxBool(false); +final count = RxInt(0); +final balance = RxDouble(0.0); +final items = RxList([]); +final myMap = RxMap({}); +``` + +2 - Yang kedua adalah dengan menggunakan **`Rx`** dan Darts Generics, `Rx` + +```dart +final name = Rx(''); +final isLogged = Rx(false); +final count = Rx(0); +final balance = Rx(0.0); +final number = Rx(0) +final items = Rx>([]); +final myMap = Rx>({}); + +// Kelas Kustom - ini bisa jadi kelas apapun, secara harfiah +final user = Rx(); +``` + +3 - Yang ketiga, cara yang lebih praktis, mudah dan lebih disukai, cukup tambahkan **`.obs`** sebagai properti dari `value` anda: + +```dart +final name = ''.obs; +final isLogged = false.obs; +final count = 0.obs; +final balance = 0.0.obs; +final number = 0.obs; +final items = [].obs; +final myMap = {}.obs; + +// Kelas Kustom - ini bisa jadi kelas apapun, secara harfiah +final user = User().obs; +``` + +#### Memiliki sebuah reactive state itu, mudah + +Seperti yang kita ketahui, _Dart_ saat ini sedang mempersiapkan ke _null safety_. +Sebagai persiapan, mulai dari sekarang, anda harus selalu memulai variabel _Rx_ anda dengan sebuah **initial value** (nilai awal). + +> Mengubah sebuah variabel menjadi sebuah _observable_ + _initial value_ dengan **GetX** adalah cara yang paling sederhana, dan sangat praktis. + +Anda hanya cukup menambahkan sebuah "`.obs`" di akhir variabel anda, dan **selesai**, anda telah membuatnya observable, +dan untuk `.value` nya, yah, _initial value_ yang anda berikan. + +### Menggunakan value didalam view + +```dart +// file controller +final count1 = 0.obs; +final count2 = 0.obs; +int get sum => count1.value + count2.value; +``` + +```dart +// file view +GetX( + builder: (controller) { + print("count 1 rebuild"); + return Text('${controller.count1.value}'); + }, +), +GetX( + builder: (controller) { + print("count 2 rebuild"); + return Text('${controller.count2.value}'); + }, +), +GetX( + builder: (controller) { + print("count 3 rebuild"); + return Text('${controller.sum}'); + }, +), +``` + +Jika kita meng-increment `count1.value++`, ini akan mencetak: + +- `count 1 rebuild` +- `count 3 rebuild` + +karena `count1` memiliki nilai `1`, dan `1 + 0 = 1`, mengubah nilai dari getter `sum`. + +Jika kita mengubah `count2.value++`, ini akan mencetak: + +- `count 2 rebuild` +- `count 3 rebuild` + +karena `count2.value` berubah, dan hasil dari `sum` sekarang adalah `2`. + +- CATATAN: Secara default, event yang paling pertama akan merebuild widget, meskipun `value` nya sama. + perilaku ini hadir karena variabel Boolean. + +Bayangkan anda melakukan ini: + +```dart +var isLogged = false.obs; +``` + +Dan kemudian, anda melakukan pengecekan apakah user "sudah login" untuk men-trigger sebuah event didalam `ever`. + +```dart +@override +onInit(){ + ever(isLogged, fireRoute); + isLogged.value = await Preferences.hasToken(); +} + +fireRoute(logged) { + if (logged) { + Get.off(Home()); + } else { + Get.off(Login()); + } +} +``` + +jika `hasToken` nilainya `false`, tidak akan terjadi apa apa kepada `isLogged`, jadi `ever()` tidak akan dipanggil. +Untuk menghindari jenis perilaku ini, perubahan awal terhadap sebuah _observable_ harus selalu men-trigger sebuah event, +bahkan ketika mereka memiliki `.value` yang sama. + +Anda bisa menghapus perilaku ini jika anda mau, menggunakan: +`isLogged.firstRebuild = false;` + +### Kondisi untuk rebuild + +Selain itu, Get menyediakan state kontrol yang telah dipoles. Anda bisa mengkondisikan sebuah event (seperti menambahkan sebuah object kedalam list), dalam suatu kondisi. + +```dart +// Parameter pertama: kondisi, harus me-return true atau false +// Parameter kedua: nilai baru yang akan dimasukkan jika kondisinya true +list.addIf(item < limit, item); +``` + +Tanpa decoration, tanpa code generator, tanpa komplikasi :smile: + +Anda tahu counter app milik Flutter? Controller anda mungkin terlihat seperti ini: + +```dart +class CountController extends GetxController { + final count = 0.obs; +} +``` + +Hanya dengan: + +```dart +controller.count.value++ +``` + +Anda bisa memperbarui variabel counter di UI anda, tidak perduli dimanapun itu diletakkan. + +### Dimana .obs bisa digunakan + +Anda bisa mengubah apapun dengan obs. Berikut adalah dua cara untuk melakukannya: + +* Anda bisa mengkonversi value kelas anda menjadi obs + +```dart +class RxUser { + final name = "Camila".obs; + final age = 18.obs; +} +``` + +* atau anda bisa mengkonversi seluruh kelasnya menjadi observable + +```dart +class User { + User({String name, int age}); + var name; + var age; +} + +// saat menginstansiasi: +final user = User(name: "Camila", age: 18).obs; +``` + +### Catatan mengenai List + +List, dia observable secara menyeluruh, termasuk objek didalamnya. +Dengan itu, jika anda menambahkan value kedalam list, dia akan secara otomatis merebuild widget yang menggunakannya. + +Anda juga tidak perlu menggunakan ".value" ketika mengakses list, API dart yang luar biasa mengizinkan kita untuk menghapusnya. +Sayangnya, tipe data primitif seperti String dan int tidak bisa di extend, membuat penggunaan .value menjadi suatu hal yang wajib, tapi itu bukan masalah jika anda bekerja menggunakan getter dan setter untuk mereka. + +```dart +// Didalam Controller +final String title = 'User Info:'.obs +final list = List().obs; + +// Didalam View +Text(controller.title.value), // String harus memiliki .value didepannya +ListView.builder ( + itemCount: controller.list.length // list tidak perlu itu +) +``` + +Ketika anda membuat kelas anda sendiri observable, ada berbagai cara untuk memperbaruinya: + +```dart +// didalam file model +// kita akan membuat seluruh kelas menjadi observable daripada +// mengimplementasikannya pada masing-masing atribut. +class User() { + User({this.name = '', this.age = 0}); + String name; + int age; +} + + +// didalam file controller +final user = User().obs; +// ketika anda perlu mengupdate variabel user: +user.update( (user) { // parameter ini adalah kelas itu sendiri yang akan anda update + user.name = 'Jonny'; + user.age = 18; +}); +// cara alternatif untuk melakukannya: +user(User(name: 'João', age: 35)); + +// didalam view: +Obx(()=> Text("Name ${user.value.name}: Age: ${user.value.age}")) +// anda juga bisa mengakses nilai model tanpa .value: +user().name; // perhatikan bahwa yang digunakan adalah variabel user, bukan kelasnya (variabel memiliki "u" kecil) +``` + +Anda tidak perlu bekerja dengan sets jika anda tidak mau. Anda bisa menggunakan API "assign" dan "assignAll". +API "assign" akan membersihkan list anda, dan memasukkan satu objek sebagai permulaan. +API "assignAll" akan membersihkan list yang sudah ada dan menambahkan objek iterable yang anda inject kedalamnya. + +### Mengapa harus menggunakan .value + +Kami bisa saja menghapus kebijakan untuk menggunakan 'value' pada `String` dan `int` dengan decoration sederhana dan code generator, tapi tujuan dari library ini adalah untuk menghindari dependensi eksternal. Kami ingin menawarkan sebuah environment yang siap untuk programming, melibatkan hal-hal penting (route, dependency, dan state management), dengan cara yang sederhana, ringan, dan cepat, tanpa membutuhkan package dari luar. + +Anda bisa secara harfial menambahkan 3 huruf ke pubspec anda dan sebuah titik dua dan mulai membuat sebuah program. Semua solusi sudah termasuk secara default, mulai dari route management, hingga state management, menargetkan kemudahan, produktifitas dan performa. + +Berat total dari library ini kurang dari satu state manager, meskipun ini adalah solusi komplit, dan inilah yang harus anda pahami. + +Jika anda terganggu dengan `.value`, dan menyukai code generator, MobX adalah alternatif yang baik, dan anda bisa menggunakannya bersamaan dengan Get. Untuk kalian yang ingin menambahkan satu dependensi di pubspec dan mulai membuat sebuah program tanpa mengkhawatirkan versi dari sebuah package tidak kompatibel dengan yang lain, atau sebuah error dari perbaruan state datang dari state manager atau dependensi, atau semacamnya, dan tidak mau khawatir tentang ketersediaan controller, ataupun secara harfiah "hanya ingin membuat program", get sudah sangat sempurna. + +Jika anda merasa tidak masalah dengan code generator MobX, atau tidak masalah dengan boilerplate dari BLoC, anda bisa menggunakan Get untuk route, dan lupakan bahwa dia memiliki state manager. Get SEM dan RSM lahir karena kebutuhan, perusahaan saya memiliki proyek dengan lebih dari 90 controller, dan code generator sederhananya memakan waktu 30 menit untuk menyelesaikan tugasnya setelah Flutter Clean di komputer yang secara masuk akal bagus, jika proyek anda memiliki 5, 10, hingga 15 controller, state manager apapun akan mensuplai anda dengan baik. Jika anda memiliki proyek yang secara absurd berskala besar, dan code generator adalah masalah untuk anda, maka anggap ini sebagai hadiah. + +Jelas, jika seseorang ingin berkontribusi terhadap proyek dan membuat sebuah code generator, atau sejenisnya, Saya akan tautkan kedalam readme ini sebagai alternatif, kebutuhan saya bukan kebutuhan untuk semua developer, namun untuk saat ini Saya mengatakan, sudah ada solusi yang baik diluar sana yang sudah melakukan hal itu, seperti MobX. + +### Obx() + +Memberi tipe di Get saat menggunakan Binding tidak diperlukan. Anda bisa menggunakan widget Obx daripada GetX yang mana hanya menerima fungsi anonim yang membuat sebuah widget. +Jelas, jika anda tidak menggunakan sebuah tipe, anda harus memiliki sebuah instance dari controller anda untuk menggunakan variabel didalamnya, atau gunakan `Get.find()` .value atau Controller.to.value untuk mengambil value. + +### Worker + +Worker akan membantu anda, men-trigger callback spesifik ketika sebuah event terjadi. + +```dart +/// Terpangil setiap kali `count1` berubah. +ever(count1, (_) => print("$_ telah dirubah")); + +/// Terpanggil hanya pada saat pertama kali variabel $_ dirubah. +once(count1, (_) => print("$_ telah dirubah sekali")); + +/// Anti DDos - Terpangil setiap kali the user berhenti mengetik setelah 1 detik, contoh: +debounce(count1, (_) => print("debouce$_"), time: Duration(seconds: 1)); + +/// Abaikan semua perubahan selama 1 detik. +interval(count1, (_) => print("interval $_"), time: Duration(seconds: 1)); +``` + +Semua worker (kecuali `debounce`) memiliki sebuah `condition` named parameter, yang bisa jadi sebuah `bool` atau sebuah callback yang mereturn `bool` +`condition` ini terdefinisikan ketika fungsi `callback` di eksekusi. + +Semua worker mereturn sebuah instance `Worker`, yang bisa anda gunakan untuk membatalkan worker tersebut (melalui `dispose()`). + +- **`ever`**\ +terpanggil setiap kali variabel _Rx_ meng-emit value baru. + +- **`everAll`**\ +Mirip seperti `ever`, tapi menerima `List` sebagai nilai _Rx_, terpanggil setiap kali variabel berubah. + +- **`once`**\ +Terpanggil hanya sekali pada saat pertama kali variabel berubah. + +- **`debounce`**\ +'debounce' sangat berguna pada fungsi pencarian, dimana anda hanya ingin API dipanggil ketika user selesai mengetik. Jika user mengetik "Jonny", anda akan pendapatkan 5 pencarian di API, dengan huruf J, o, n, n, dan y. Dengan Get, ini tidak terjadi lagi, karena anda memiliki sebuah "debounce" worker, yang akan men-trigger pada akhir pengetikan. + +- **`interval`**\ +berbeda dengan debounce. untuk debounce, jika user melakukan 1000 perubahan terhadap sebuah variabel dalam 1 detik, dia akan mengirim hanya yang terakhir setelah waktu yang ditetapkan (defaultnya adalah 800 milisekon). +\ +\ +Interval bekerja sebaliknya, dia akan mengabaikan semua interaksi user dalam rentang waktu yang ditentukan. Jika anda mengirim event dalam 1 menit, 1000 per detik, debounce akan mengirimkan anda yang terakhir, ketika user berhenti melakukan spam terhadap event. Interval akan mengantar event setiap detik, dan jika diatur menjadi 3 detik, dia akan mengirimkan 20 event setiap menit. +\ +\ +Ini direkomendasikan untuk menghindari penyalahgunaan, dalam fungsi dimana user bisa secara cepat melakukan klik pada sesuatu untuk mendapatkan sebuah keuntungan (bayangkan jika user bisa mendapat koin dengan meng-klik pada sesuatu, jika dia mengklik 300 kali dalam 1 menit, dia akan mendapatkan 300 koin, menggunakan interval, anda bisa mengatur jangka waktu selama 3 detik, dan meskipun user meng-klik sebanyak 300 kali atau ribuan kali, maksimum koin yang bisa dia dapatkan dalam 1 menit akan selalu 20 koin, bahkan ketika dia meng-klik 1 juta kali sekalipun) +\ +\ +Debounce cocok sebagai anti-DDos, untuk fungsi seperti search dimana setiap perubahan terhadap onChange akan mengirim sebuah query ke API anda. Debounce akan menunggu user berhenti mengetik nama, untuk membuat sebuah request. Jika ini digunakan pada skenario koin diatas, user hanya akan mendapatkan 1 koin, karena hanya akan di eksekusi ketika user memberi jeda terhadap waktu yang ditentukan. + +- CATATAN: Worker harus selalu digunakan ketika memulai sebuah Controller atau Class, jadi dia harus selalu diletakkan didalam onInit (direkomendasikan), Class constructor, atau initState dari StatefulWidget (praktik ini tidak direkomendasikan dalam kebanyakan kasus, dan tidak akan ada side effect). + +## Simple State Manager + +Get memiliki state manager yang sangat ringan dan mudah, dan tidak menggunakan ChangeNotifier, yang akan memenuhi kebutuhan khususnya untuk mereka yang baru di Flutter, dan tidak akan membuat masalah untuk aplikasi besar. + +GetBuilder membidik dengan tepat pada state control multipel. Bayangkan anda menambahkan 30 produk kedalam sebuah keranjang belanja, anda meng-klik "delete" pada salah satu produk tersebut, di waktu yang sama, list, harga, dan badge diperbarui ke angka yang lebih kecil. Pendekatan ini membuat GetBuilder mematikan, karena mengelompokkan state dan mengubah semuanya secara bersamaan dalam satu waktu tanpa "computational logic" untuk itu. Getbuilder dibuat dengan mempertimbangkan situasi seperti ini, untuk perubahan state "ephemeral", anda bisa menggunakan setState dan anda tidak membutuhkan sebuah state manager untuk itu. + +Dengan begitu, jika anda menginginkan controller yang bekerja secara individu, anda bisa mengajukan ID untuknya, atau gunakan GetX. Semuanya terserah anda, mengingat bahwa semakin banyak "individual" widget yang anda miliki, performa dari GetX akan semakin terlihat, sementara performa dari GetBuilder harusnya lebih superior, ketika terjadi perubahan state secara multipel. + +### Keuntungan + +1. Hanya memperbarui widget yang diperlukan + +2. Tidak menggunakan changeNotifier, ini adalah state manager yang menggunakan memori lebih kecil (mendekati 0mb). + +3. Lupakan StatefulWidget! Dengan Get, anda tidak akan pernah membutuhkannya. Dengan state manager lain, anda mungkin harus menggunakan StatefulWidget untuk mendapatkan sebuah instance milik anda dari Provider, BLoC, MobX Controller, dsb. Tapi pernahkah anda berhenti untuk berfikir bahwa appBar, scaffold, dan kebanyakan widget anda itu stateless? Lalu mengapa menyimpan state dari seluruh kelas, jika anda hanya bisa menyimpan state dari Widget yang stateful? Get menyelesaikan masalah itu, juga. Buat kelas Stateless, buat semuanya stateless. Jika anda butuh update pada satu komponen, bungkus komponen itu dengan GetBuilder, dan state-nya akan di-maintain. + +4. Organisir proyek anda secara nyata! Controller tidak seharusnya ada di UI, letakkan TextEditingController anda, atau controller apapun didalam kelas Controller anda. + +5. Apakah anda perlu men-trigger sebuah event untuk widget segera setelah dirender? GetBuilder memiliki properti "initState", sama seperti StatefulWidget, dan anda akan bisa memanggil event dari controller anda, langsung dari sana, tidak ada lagi event diletakkan didalam initState anda. + +6. Apakah anda perlu men-trigger sebuah action seperti menutup stream, timer, dan semacamnya? GetBuilder juga memiliki properti dispose, dimana anda bisa memanggil event segera setelah widget dihancurkan. + +7. Gunakan stream hanya jika dibutuhkan. Anda bisa menggunakan StreamController didalam controller anda secara normal, dan menggunakan StreamBuilder juga secara normal, namun perlu di ingat, sebuah stream cukup memakan memori, reactive programming itu indah, namun anda tidak boleh menyalahgunakannya. 30 stream terbuka secara simultan bisa lebih buruk daripada changeNotifier (dan changeNotifier itu sangat buruk). + +8. Perbarui widget tanpa menghabiskan RAM untuk itu. Get menyimpan hanya creator ID milik GetBuilder, dan memperbarui GetBuilder tersebut ketika diperlukan. Konsumsi memori dari get ID storage sangat rendah bahkan untuk ribuan GetBuilder sekalipun. Ketika anda membuat GetBuilder baru, anda sebenarnya berbagi state dari GetBuilder yang memiliki creator ID. State baru tidak dibuat untuk setiap GetBuilder, yang mana menghemat SANGAT BANYAK RAM untuk aplikasi berskala besar. Pada dasarnya, aplikasi anda akan Stateless secara menyeluruh, dan semakin sedikit Widget yang akan Stateful (didalam GetBuilder) akan memiliki satu state, dan oleh karena itu, mengupdate salah satu dari mereka akan mengupdate semuanya. State nya hanya satu. + +9. Get maha tahu, dan dalam kebanyakan kasus, dia mengetahui dengan tepat kapan harus menghapus sebuah controller dari memori. Anda tidak perlu khawatir tentang kapan harus men-dispose sebuah controller, Get tahu waktu terbaik untuk melakukannya. + +### Penggunaan + +```dart +// Buat kelas controller dan extends GetxController +class Controller extends GetxController { + int counter = 0; + void increment() { + counter++; + update(); // gunakan update() untuk mengupdate variabel counter di UI ketika increment dipanggil + } +} +// Pada Stateless/Stateful widget anda, gunakan GetBuilder untuk mengupdate Text ketika increment dipanggil +GetBuilder( + init: Controller(), // INISIALISASIKAN CONTROLLER HANYA UNTUK PERTAMA KALI + builder: (_) => Text( + '${_.counter}', + ), +) +// Inisialisasi controller anda hanya untuk pertama kali. Kedua kalinya anda menggunakan ReBuilder untuk controller yang sama, dan jangan gunakan itu lagi. Controller anda akan secara otomatis dihapus dari memori segera setelah widget yang ditandai sebagai 'init' di-deploy. Anda tidak perlu khawatir tentang itu, Get akan melakukannya secara otomatis, cukup pastikan anda tidak memulai controller yang sama dua kali. +``` + +**Selesai!** + +- Anda sudah mempelajari bagaimana caranya memanage state menggunakan Get. + +- Catatan: Anda mungkin menginginkan organisasi yang lebih besar, dan tidak menggunakan properti init. Untuk itu, anda bisa membuat kelas dan meng-extends kelas Bindings, dan didalamnya, sebutkan controller yang akan dibuat untuk route tersebut. Controller tidak akan dibuat pada waktu itu, sebaliknya, ini hanyalah sebuah statement, jadi pada saat pertama kali anda menggunakan sebuah Controller, Get akan tahu dimana harus mencarinya. Get akan melakukan lazyload, dan akan melanjutkan untuk men-dispose controller yang tidak lagi digunakan. Lihat contoh di pub.dev untuk melihat bagaimana cara kerjanya. + +Jika anda bernavigasi ke banyak route dan membutuhkan data dari controller yang sebelumnya anda gunakan, anda hanya perlu menggunakan GetBuilder lagi (tanpa init): + +```dart +class OtherClass extends StatelessWidget { + @override + Widget build(BuildContext context) { + return Scaffold( + body: Center( + child: GetBuilder( + builder: (s) => Text('${s.counter}'), + ), + ), + ); + } + +``` + +Jika anda perlu menggunakan controller anda di banyak tempat, dan diluar dari GetBuilder, cukup buat getter didalam controller anda dan anda akan mendapatkannya dengan mudah (atau gunakan `Get.find()`) + +```dart +class Controller extends GetxController { + + /// Anda tidak membutuhkan itu. Saya menyarankan menggunakannya hanya untuk kemudahan sintaks. + /// dengan static method: Controller.to.increment(); + /// tanpa static method: Get.find().increment(); + /// Tidak ada perbedaan dari segi performa, atau efek samping apapun dalam menggunakan kedua sintaks diatas. Yang berbeda hanyalah yang satu tidak memerlukan type, dan yang satu lagi akan di autocomplete oleh IDE. + static Controller get to => Get.find(); // Tambahkan baris ini + + int counter = 0; + void increment() { + counter++; + update(); + } +} +``` + +Dan anda bisa mengakses controller secara langsung, dengan cara itu: + +```dart +FloatingActionButton( + onPressed: () { + Controller.to.increment(), + } // Ini luar biasa simpel! + child: Text("${Controller.to.counter}"), +), +``` + +Ketika anda menekan FloatingActionButton, semua widget yang me-listen variabel 'counter' akan diupdate secara otomatis. + +### Bagaimana Get meng-handle controller + +Anggaplah kita memiliki ini: + +`Class A => Class B (memiliki controller X) => Class C (memiliki controller X)` + +Di kelas A, controller belum ada di memori, karena anda belum menggunakannya (Get itu lazyload). Di kelas B anda menggunakan controller tersebut, dan controller itu masuk kedalam memori. Di kelas C, anda menggunakan controller yang sama seperti di kelas B, Get akan berbagi state dari controller B dengan controller C, dan controller yang sama akan tetap ada di memori. + +Jika anda menutup screen C dan screen B, Get akan secara otomatis menghapus controller X dari memori dan membebaskan resource, karena kelas A tidak menggunakan controller. Jika anda bernavigasi ke kelas B lagi, controller X akan masuk ke memori lagi, jika daripada menuju ke kelas C, anda kembali ke kelas A lagi, Get akan menghapus controller dari memori dengan cara yang sama. Jika kelas C tidak menggunakan controller, dan anda mengeluarkan kelas B dari memori, tidak ada kelas yang menggunakan controller X dan demikian pula kelas itu akan dibuang. + +Satu-satunya exception yang bisa mengacau dengan Get, adalah jika anda menghapus B dari route secara tidak sengaja, dan mencoba menggunakan controller di C. Dalam kasus ini, creator ID dari controller yang ada di B terhapus, dan Get diprogram untuk menghapusnya dari memori untuk setiap controller yang tidak memiliki creator ID. Jika anda berniat melakukan ini, tambahkan flag "autoRemove: false" ke GetBuilder di kelas B dan gunakan "adoptID = true;" di GetBuilder pada kelas C. + +### Anda tidak membutuhkan StatefulWidget lagi + +Menggunakan StatefulWidget berarti menyimpan sebuah state dari seluruh layar secara tidak perlu, meski karena anda perlu untuk merebuild sebuah widget secara minimal, anda akan menyematkannya kedalam Consumer/Observer/BlocProvider/GetBuilder/GetX/Obx, yang mana akan menjadi StatfulWidget yang lain. + +StatefulWidget adalah sebuah kelas yang lebih besar daripada StatelessWidget, yang mana akan mengalokasi lebih banyak RAM, dan ini mungkin tidak akan membuat perbedaan secara signifikan antara satu atau dua kelas, tapi itu pasti akan terjadi ketika anda memiliki 100 dari mereka! +Kecuali anda perlu menggunakan mixin, seperti TickerProviderStateMixin, akan sangat tidak dibutuhkan menggunakan StatefulWidget dengan Get. + +Anda bisa memanggil semua method dari StatefulWidget secara langsung melalui GetBuilder. +Jika anda perlu memanggil initState() atau dispose() method contohnya, anda bisa memanggilnya secara langsung; + +```dart +GetBuilder( + initState: (_) => Controller.to.fetchApi(), + dispose: (_) => Controller.to.closeStreams(), + builder: (s) => Text('${s.username}'), +), +``` + +Cara yang lebih baik daripada ini adalah dengan menggunakan onInit() dan onClose() method secara langsung dari controller anda. + +```dart +@override +void onInit() { + fetchApi(); + super.onInit(); +} +``` + +- CATATAN: Jika anda ingin memulai sebuah method pada saat controller dipanggil pertama kali, anda TIDAK PERLU menggunakan constructor, faktanya, menggunakan package yang berorientasi pada performa seperti Get, ini berbatas pada bad practice, karena menyimpang dari logic dimana setiap controller dibuat atau dialokasikan (jika anda membuat sebuah instance dari controller, constructornya akan dipanggil dengan segera, anda akan menumpuk controller bahkan sebelum digunakan, anda mengalokasikan memori tanpa digunakan, hal ini benar-benar menyakiti prinsip dasar library ini). method onInit(); dan onClose(); dibuat untuk hal ini, mereka akan dipanggil ketika Controller dibuat, atau digunakan untuk pertama kali, bergantung pada kondisi apakah anda menggunakan Get.lazyPut atau tidak. Jika anda mau, sebagai contoh, membuat sebuah panggilan ke API anda untuk mempopulasikan data, anda bisa lupakan tentang metode lawas initState/dispose, cukup mulai memanggilnya didalam onInit, dan jika anda perlu meng-eksekusi perintah seperti menutup stream, gunakan onClose() untuk hal itu. + +### Mengapa GetX ada + +Tujuan dari package ini adalah secara tepat memberikan anda sebuah solusi komplit untuk navigasi route, dependency dan state management, menggunakan sedikit mungkin dependensi, dengan tingkat decoupling yang tinggi. Get melibatkan semua Flutter API baik dari level tertinggi dan terendah dalam dirinya sendiri, untuk memastikan bahwa anda bekerja dengan sedikit mungkin keterkaitan (coupling). Kami memusatkan semuanya kedalam satu package, untuk memastikan bahwa anda tidak memiliki keterkaitan (coupling) di proyek anda. Dengan begitu, anda bisa menaruh hanya widget di view anda, dan membiarkan bagian tim anda yang bekerja dengan business logic secara bebas, bekerja dengan business logic tanpa bergantung pada elemen apapun yang ada didalam View. Ini menyediakan lingkungan kerja yang lebih bersih, jadi bagian yang lain dari tim anda bisa bekerja hanya dengan widget, tanpa khawatir tentang mengirim data dari controller anda. + +Jadi untuk menyederhanakannya: +Anda tidak perlu memanggil method di initState dan mengirim mereka menggunakan parameter ke controller anda, atau menggunakan constructor didalam controller anda untuk itu, anda memiliki method onInit() yang akan dipanggil di waktu yang tepat untuk memulai service anda. +Anda tidak perlu memanggil perangkatnya, anda memiliki method onClose() yang akan dipanggil di momen yang tepat ketika controller tidak lagi dibutuhkan dan akan dihapus dari memori. Dengan begitu, biarkan views hanya untuk widget, menghindari berbagai macam business logic darinya. + +Jangan memanggil dispose method didalam GetxController, itu tidak akan melakukan apa-apa, ingat bahwa controller bukanlah sebuah Widget, anda tidak seharusnya men-"dispose" sebuah controller, dan dia akan secara otomatis dan secara pandai dihapus dari memori oleh Get. Jika anda menggunakan stream didalamnya dan ingin menutupnya, cukup masukkan itu kedalam close method. Contoh: + +```dart +class Controller extends GetxController { + StreamController user = StreamController(); + StreamController name = StreamController(); + + /// menutup stream = onClose method, bukan dispose. + @override + void onClose() { + user.close(); + name.close(); + super.onClose(); + } +} +``` + +Controller life cycle (atau: siklus kehidupan controller): + +- onInit() dimana ketika Controller dibuat. +- onClose() dimana ketika Controller ditutup untuk membuat segala jenis perubahan dalam rangka persiapan untuk metode penghapusan +- deleted: anda tidak lagi memiliki akses ke API ini karena secara harfiah menghapusnya dari memori, dan secara harfiah pula itu dihapus, tanpa meninggalkan jejak. + +### Cara lain dalam menggunakannya + +Anda bisa menggunakan Controller secara langsung didalam GetBuilder value: + +```dart +GetBuilder( + init: Controller(), + builder: (value) => Text( + '${value.counter}', // Disini + ), +), +``` + +Anda juga mungkin membutuhkan sebuah instance dari controller anda diluar GetBuilder, dan anda bisa menggunakan pendekatan ini: + +```dart +class Controller extends GetxController { + static Controller get to => Get.find(); +[...] +} +// didalam View: +GetBuilder( + init: Controller(), // Gunakan ini hanya untuk pertama kali pada setiap controller + builder: (_) => Text( + '${Controller.to.counter}', // Disini + ) +), +``` + +atau + +```dart +class Controller extends GetxController { + // static Controller get to => Get.find(); // tanpa static getter +[...] +} +// didalam stateful/stateless class +GetBuilder( + init: Controller(), // Gunakan ini hanya untuk pertama kali pada setiap controller + builder: (_) => Text( + '${Get.find().counter}', // Disini + ), +), +``` + +- Anda bisa menggunakan cara "non-canonical" untuk hal ini. Jika anda menggunakan dependensi manager lain, seperti get_it, modular, etc., dan hanya ingin mengirimkan instance controller, anda bisa melakukan ini: + +```dart +Controller controller = Controller(); +[...] +GetBuilder( + init: controller, // Disini + builder: (_) => Text( + '${controller.counter}', // Disini + ), +), + +``` + +### Unique ID + +Jika anda ingin me-refine update control sebuah widget dengan GetBuilder, anda bisa mengajukan unique ID untuk mereka: + +```dart +GetBuilder( + id: 'text' // Disini + init: Controller(), + builder: (_) => Text( + '${Get.find().counter}', + ), +), +``` + +Dan mengupdatenya dalam bentuk ini: + +```dart +update(['text']); +``` + +Anda juga bisa menerapkan kondisi untuk updatenya: + +```dart +update(['text'], counter < 10); +``` + +GetX melakukan ini secara otomatis dan hanya merekonstruksi widget yang menggunakan variabel persis yang dirubah, jika anda mengubah sebuah variabel dengan hal yang sama seperti sebelumnya, dan tidak mengimplifikasikan sebuah perubahan sate , GetX tidak akan merebuild widget untuk menghemat memori dan siklus CPU. + +## Mencampur 2 state manager + +Beberapa orang membuka sebuah permintaan fitur, karena mereka hanya ingin menggunakan satu jenis variabel reaktif, dan mekanisme lain, dan diharuskan untuk memasukkan Obx kedalam GetBuilder untuk hal ini. Memikirkan hal ini, MixinBuilder dibuat. Ini mengizinkan kedua perubahan reaktif dengan mengubah variabel ".obs", dan mekanikal update via update(). Meski begitu, dari 4 widget dia adalah satu-satunya yang mengonsumsi resource paling banyak, karena selain memiliki langganan untuk menerima event perubahan dari children nya, dia juga berlangganan kepada metode update di controllernya. + +Meng-extend GetxController sangatlah penting, karena mereka memiliki siklus dan bisa "memulai" dan "mengakhiri" event di method onInit() dan onClose() mereka. Anda bisa menggunakan kelas apapun untuk ini, tapi Saya sangat merekomendasikan anda untuk menggunakan kelas GetxController untuk menempatkan variabel anda, baik apakah mereka observable atau tidak. + +## GetBuilder vs GetX vs Obx vs MixinBuilder + +Dalam satu dekade bekerja dengan programming Saya mendapat beberapa pelajaran berharga. + +Kontak pertama saya dengan reactive programming adalah seperti "waw, ini luar biasa" dan faktanya, reactive programming itu luar biasa. +Meski begitu, ini tidak cocok untuk segala situasi. Terkadang semua yang anda butuhkan adalah mengubah state dari 2 atau 3 widget dalam waktu yang sama, atau sebuah perubahan state sementara, yang mana reactive programming tidaklah buruk, tapi tidak cocok. + +Reactive programming memiliki konsumsi lebih tinggi dalam penggunaan RAM yang bisa dikompensasi oleh alur kerja individu, dimana akan memastikan bahwa hanya satu widget direbuild dan jika dibutuhkan, namun membuat sebuah list dari 80 objek, masing masing dengan beberapa stream bukanlah ide yang bagus. Buka dart inspect dan cek berapa banyak yang dikonsumsi oleh StreamBuilder, dan anda akan memahami apa yang saya coba katakan kepada anda. + +Dengan memikirkan hal itu, Saya membuat sebuah state manager yang simpel. Ini simpel, dan itulah yang harus anda tuntut darinya: mengupdate state dalam sebuah block dengan cara yang sederhana, dan dengan cara yang paling ekonomis. + +GetBuilder sangat ekonomis di RAM, dan hampir tidak ada pendekatan yang lebih ekonomis darinya (setidaknya saya tidak bisa membayangkannya, jika itu ada, mohon beri tahu kami). + +Meski begitu, GetBuilder tetaplah sebuah state manager mekanik, anda perlu memanggil update() seperti anda perlu memanggil notifyListeners() milik Provider. + +Ada beberapa situasi lain dimana reactive programming benar benar menarik, dan tidak bekerja dengan itu sama saja seperti "reinventing the wheel". Dengan memikirkan hal itu, GetX dibuat untuk menyediakan semuanya yang paling modern dan advanced dalam sebuah state manager. Dia mengupdate hanya apa yang diperlukan dan ketika diperlukan, jika anda memiliki error dan mengirim 300 perubahan state secara beruntun, GetX akan memfilter dan mengupdate layar hanya jika state nya benar-benar berubah. + +GetX masih lebih ekonomis dari reactive state manager yang lain, namun dia juga menkonsumsi sedikit lebih banyak RAM daripada GetBuilder. Memikirkan tentang hal itu dan menargetkan untuk memaksimalkan konsumsi resource yang dibuat oleh Obx. Tidak seperti GetX dan GetBuilder, anda tidak akan bisa menginisialisasi sebuah controller didalam Obx, itu hanyalah sebuah widget dengan StreamSubscription yang menerima event perubahan dari children anda, itu saja. Ini lebih ekonomis dari GetX, namun kalah dari GetBuilder, yang memang diharapkan, karena dia reactive dan GetBuilder memiliki pendekatan yang paling sederhana yang ada, untuk menyimpan hashCode milik sebuah widget dan StateSetter nya. Dengan Obx anda tidak perlu menulis tipe controller, dan anda bisa mendengar perubahan dari banyak controller yang berbeda, namun itu harus di inisialisasi sebelumnya, baik menggunakan contoh pendekatan di awal readme ini, atau menggunakan Binding class. diff --git a/siro_rider/packages/get/documentation/ja_JP/dependency_management.md b/siro_rider/packages/get/documentation/ja_JP/dependency_management.md new file mode 100644 index 0000000..9dbefb3 --- /dev/null +++ b/siro_rider/packages/get/documentation/ja_JP/dependency_management.md @@ -0,0 +1,405 @@ +# 依存オブジェクト管理 +- [依存オブジェクト管理](#依存オブジェクト管理) + - [インスタンス化に使用するメソッド](#インスタンス化に使用するメソッド) + - [Get.put()](#getput) + - [Get.lazyPut()](#getlazyput) + - [Get.putAsync()](#getputasync) + - [Get.create()](#getcreate) + - [インスタンス化したクラスを使う](#インスタンス化したクラスを使う) + - [依存オブジェクトの置換](#依存オブジェクトの置換) + - [各メソッドの違い](#各メソッドの違い) + - [Bindings(Routeと依存オブジェクトの結束)](#Bindings(Routeと依存オブジェクトの結束)) + - [Bindingsクラス](#bindingsクラス) + - [BindingsBuilder](#bindingsbuilder) + - [SmartManagement](#smartmanagement) + - [設定の変更方法](#設定の変更方法) + - [SmartManagement.full](#smartmanagementfull) + - [SmartManagement.onlyBuilder](#smartmanagementonlybuilder) + - [SmartManagement.keepFactory](#smartmanagementkeepfactory) + - [Bindingsの仕組み](#Bindingsの仕組み) + - [補足](#補足) + +Getにはシンプルで強力な依存オブジェクト管理機能があります。たった1行のコードで、Provider contextやinheritedWidgetを使うことなく、BlocもしくはControllerのインスタンスを取得することができます。 + +```dart +Controller controller = Get.put(Controller()); // Controller controller = Controller() の代わりに +``` + +UIクラスの中でControllerクラスをインスタンス化する代わりに、Getインスタンスの中でインスタンス化することで、アプリ全体でControllerを利用できるようになります。 + +- 注: Getの状態管理機能を使用する場合は、[Bindings](#bindings)の使用も検討してください。Bindingsを使うことでビューにControllerを結合させることができます。 +- 注²: Getの依存オブジェクト管理機能は、パッケージの他の部分から独立しています。そのため、たとえばあなたのアプリが既に他の状態管理ライブラリを使用している場合(どんなものでも)、何の問題もなく2つを組み合わせることができます。 + +## インスタンス化に使用するメソッド +Controllerを初期化するのに使用するメソッドとその設定パラメーターについてご説明します。 + +### Get.put() + +依存オブジェクトを注入するための最も基本のメソッド。たとえば、ビューで使用するControllerに使います。 + +```dart +Get.put(SomeClass()); +Get.put(LoginController(), permanent: true); +Get.put(ListItemController, tag: "some unique string"); +``` + +以下が put() を使用する際に設定できるパラメーターです。 +```dart +Get.put( + // 必須。インスタンスを保存しておきたいControllerなどを設定 + // 注: "S" 型はジェネリクスで、どんな型でもOK + S dependency + + // オプション。これは同じ型のControllerインスタンスが複数存在する場合に、 + // タグIDにより識別したい場合に使用します。 + // Get.find(tag: ) でこのputで設定したインスタンスを探します。 + // tag はユニークなStringである必要があります。 + String tag, + + // オプション。デフォルトでは使用されなくなったインスタンスは破棄されますが、 + // (たとえばビューが閉じられた場合など) SharedPreferencesのインスタンスなど、 + // アプリ全体を通して生かしておきたい場合があるかと思います。 + // その場合はこれをtrueにしてください。デフォルトはfalseです。 + bool permanent = false, + + // オプション。テストで抽象クラスを使用した後、別クラスに置換してテストを追うことができます。 + // デフォルトはfalseです。 + bool overrideAbstract = false, + + // オプション: 依存オブジェクトを関数を使って作ることができます。 + // 使用頻度は低いと思います。 + InstanceBuilderCallback builder, +) +``` + +### Get.lazyPut() +依存オブジェクトをすぐにロードする代わりに、lazy(遅延、消極的)ロードすることができます。実際に使用されるときに初めてインスタンス化されます。計算量の多いクラスや、Bindingsを使って複数のControllerをまとめてインスタンス化したいが、その時点ではすぐにそれらを使用しないことがわかっている場合などに非常に便利です。 + +```dart +/// この場合のApiMockは Get.find を使用した時点でインスタンス化されます。 +Get.lazyPut(() => ApiMock()); + +Get.lazyPut( + () { + // 必要ならここに何かのロジック + return FirebaseAuth(); + }, + tag: Math.random().toString(), + fenix: true +) + +Get.lazyPut( () => Controller() ) +``` + +これが .lazyPut で設定できるパラメーターです。 +```dart +Get.lazyPut( + // 必須。クラスSが初めてfindの対象になったときに実行されるメソッド + InstanceBuilderCallback builder, + + // オプション。Get.put()のtagと同様に同じクラスの異なるインスタンスが必要なときに使用 + // ユニークな値を指定 + String tag, + + // オプション。"permanent" に似ていますが、使用されていないときはインスタンスが + // 破棄され、再び使用するときにGetがインスタンスを再び作成する点が異なります。 + // Bindings APIの "SmartManagement.keepFactory " と同じです。 + // デフォルトはfalse + bool fenix = false + +) +``` + +### Get.putAsync() +SharedPreferencesなど、非同期のインスタンスを登録したいときに使います。 + +```dart +Get.putAsync(() async { + final prefs = await SharedPreferences.getInstance(); + await prefs.setInt('counter', 12345); + return prefs; +}); + +Get.putAsync( () async => await YourAsyncClass() ) +``` + +これが .putAsync で設定できるパラメーターです。 +```dart +Get.putAsync( + + // 必須。クラスをインスタンス化するための非同期メソッドを指定 + AsyncInstanceBuilderCallback builder, + + // オプション。Get.put() と同じです。同じクラスの異なるインスタンスを作りたいときに使用 + // ユニークな値を指定 + String tag, + + // オプション。Get.put() と同じです。アプリ全体を通して生かしておきたい場合に使用 + // デフォルトはfalse + bool permanent = false +) +``` + +### Get.create() + +これは使いどころに迷うかもしれません。他のものとの違いなど詳細な説明は「[各メソッドの違い](#各メソッドの違い)」のセクションをご一読ください。 + +```dart +Get.Create(() => SomeClass()); +Get.Create(() => LoginController()); +``` + +これが .create で設定できるパラメーターです。 + +```dart +Get.create( + // 必須。Get.find() が呼ばれるたびにインスタンスがこの関数で新たに組み立てられる。 + // 例: Get.create(() => YourClass()) + FcBuilderFunc builder, + + // オプション。Get.put() のtagと同様で、同じクラスによる + // 複数インスタンスを扱うときに使用します。 + // リストのアイテムにそれぞれコントローラが必要な場合に便利です。 + // 文字列はユニークである必要があります。 + String name, + + // オプション。Get.put() と同様アプリ全体でインスタンスを維持するときに使用。 + // 唯一の違いは Get.create() のpermanentはデフォルトでtrueということだけです。 + bool permanent = true +``` + +## インスタンス化したクラスを使う + +いくつかのRouteを渡り歩いた後、以前のControllerに残してきたデータが必要になったとしたら、Provider や Get_it と組み合わせる必要がありますよね?Getの場合は違います。GetにControllerの「検索」を依頼するだけで追加の依存オブジェクトの注入は必要ありません。 + +```dart +final controller = Get.find(); +// もしくは +Controller controller = Get.find(); + +// マジックみたいですよね。でも実際にGetはControllerのインスタンスを探して届けてくれます。 +// 100万ものControllerをインスタンス化していても、Getは常に正しいControllerを探してくれます。 +``` + +そしてそのControllerが以前取得したデータをあなたは復元することができます。 + +```dart +Text(controller.textFromApi); +``` + +戻り値は通常のクラスなので、そのクラスで可能なことは何でもできます。 +```dart +int count = Get.find().getInt('counter'); +print(count); // 出力: 12345 +``` + +インスタンスを明示的に削除したい場合はこのようにしてください。 + +```dart +Get.delete(); // 通常であれば、GetXは未使用Controllerを自動削除するので、この作業は必要ありません。 +``` + +## 依存オブジェクトの置換 + +注入されている依存オブジェクトは `replace` または `lazyReplace` メソッドを使って、子クラスなど関連クラスのインスタンスに置き換えることができます。これは元の抽象クラスを型指定することで取得することができます。 + +```dart +abstract class BaseClass {} +class ParentClass extends BaseClass {} + +class ChildClass extends ParentClass { + bool isChild = true; +} + + +Get.put(ParentClass()); + +Get.replace(ChildClass()); + +final instance = Get.find(); +print(instance is ChildClass); //true + + +class OtherClass extends BaseClass {} +Get.lazyReplace(() => OtherClass()); + +final instance = Get.find(); +print(instance is ChildClass); // false +print(instance is OtherClass); //true +``` + +## Differences between methods + +まずは Get.lazyPut の `fenix` プロパティと、他メソッドの `permanent` プロパティの違いについてご説明します。 + +`permanent` と `fenix` の根本的な違いは、インスタンスをどのように保持したいかという点に尽きます。 + +しつこいようですが、GetXでは使われていないインスタンスは削除されるのがデフォルトの動作です。 +これはもし画面AがController A、画面BがController Bを持っている場合において、画面Bに遷移するときに画面Aをスタックから削除した場合(`Get.off()` や `Get.offNamed()` を使うなどして)、Controller Aは消えてなくなるということです。 + +しかし Get.put() する際に `permanent:true` としていれば、Controller Aはこの画面削除により失われることはありません。これはアプリケーション全体を通してControllerを残しておきたい場合に大変便利です。 + +一方の `fenix` は、画面削除に伴っていったんはControllerが消去されますが、再び使いたいと思ったときに復活させることができます。つまり基本的には未使用の Controller / サービス / その他クラス は消去されますが、必要なときは新しいインスタンスを「燃えカス」から作り直すことができるのです。 + +各メソッドを使用する際のプロセスの違いをご説明します。 + +- Get.put と Get.putAsync はインスタンスを作成して初期化するプロセスは同じですが、後者は非同期メソッドを使用するという違いがあります。この2つのメソッドは内部に保有するメソッド `insert` に `permanent: false` と `isSingleton: true` という引数を渡して、メモリに直接インスタンスを挿入します (この isSingleton が行っていることは、依存オブジェクトを `dependency` と `builder` プロパティのどちらから拝借するかを判断することだけです)。その後に `Get.find()` が呼ばれると、メモリ上にあるインスタンスを即座に初期化するというプロセスをたどります。 + +- Get.create はその名の通り、依存オブジェクトを「クリエイト」します。Get.put() と同様に内部メソッドである `insert` を呼び出してインスタンス化します。違いは `permanent: true` で `isSingleton: false` である点です (依存オブジェクトを「クリエイト」しているため、シングルトンにはなりません。それが false になっている理由です)。また `permanent: true` となっているので、デフォルトでは画面の破棄などでインスタンスを失わないというメリットがあります。また `Get.find()` はすぐに呼ばれず、画面内で実際に使用されてから呼ばれます。これは `permanent` の特性を活かすための設計ですが、それゆえ `Get.create()` は共有しないけど破棄もされないインスタンスを作成する目的で作られたと言えます。たとえば、ListViewの中のボタンアイテムに使うControllerインスタンスのように、そのリスト内でしか使わないけどリストアイテムごとに固有のインスタンスが必要なケースなどが考えられます。そのため、Get.create は GetWidget との併用がマストです。 + +- Get.lazyPut は初期化をlazy(遅延、消極的)に行います。実行されるとインスタンスは作成されますが、すぐに使用できるように初期化はされず、待機状態になります。また他のメソッドと異なり `insert` メソッドは呼び出されません。その代わり、インスタンスはメモリの別の部分に挿入されます。この部分を「ファクトリー」と呼ぶことにしましょう。「ファクトリー」は、そのインスタンスが再生成できるかどうかを決める役割を持っています。これは後で使う予定のものを、現在進行形で使われているものと混ざらないようにするための工夫です。ここで `fenix` によるマジックが登場します。デフォルトの `fenix: false` のままにしており、かつ `SmartManagement` が `keepFactory` ではない場合において `Get.find` を使用すると、インスタンスは「ファクトリー」から共有メモリ領域に移動します。その直後にインスタンスは「ファクトリー」から削除されます。しかし `fenix: true` としていた場合、インスタンスは「ファクトリー」に残るため、共有メモリ領域から削除されても再び呼び出すことができるのです。 + +## Bindings(Routeと依存オブジェクトの結束) + +このパッケージの一番の差別化要素は、Route管理 / 状態管理 / 依存オブジェクト管理 を統合したことにあると思っています。 +スタックからRouteが削除されれば、関係するController、変数、オブジェクトのインスタンスがすべてメモリから削除されます。たとえばStreamやTimerを使用している場合も同様ですので、開発者は何も心配する必要はありません。 +Getはバージョン2.10からBindings APIをフル実装しました。 +Bindingsを使用すれば init でControllerを起動する必要はありません。またControllerの型を指定する必要もありません。Controllerやサービスは各々適切な場所で起動することができるようになりました。 +Bindingsは依存オブジェクトの注入をビューから切り離すことができるクラスです。それに加え、状態と依存オブジェクトの管理機能をRouteに「結束(bind)」してくれます。 +これによりGetは、あるControllerが使用されたときにどの画面UIが表示されているかを知ることができます。つまり、そのControllerをどのタイミングでどう処分するかを判断することができるということです。 +さらにBindingsでは SmartManager の制御により、依存オブジェクトをどのタイミング(スタックからRouteを削除したときか、それに依存するWidgetを表示したときか、いずれでもないか)で整理するかを設定することができます。インテリジェントな依存オブジェクトの自動管理機能を持ちつつ、自分の好きなように設定できるのです。 + +### Bindingsクラス + +- Bindings機能を実装したクラスを作成することができます。 + +```dart +class HomeBinding implements Bindings {} +``` + +"dependencies" メソッドをオーバーライドするようIDEに自動で指摘されます。表示をクリックしてメソッドを override し、そのRoute内で使用するすべてのクラスを挿入してください。 + +```dart +class HomeBinding implements Bindings { + @override + void dependencies() { + Get.lazyPut(() => HomeController()); + Get.put(()=> Api()); + } +} + +class DetailsBinding implements Bindings { + @override + void dependencies() { + Get.lazyPut(() => DetailsController()); + } +} +``` + +Bindingsを設定したら、このクラスが Route管理 / 依存オブジェクト管理 / 状態管理 を互いに接続する目的で使用されるものだということをRouteに知らせてあげます。 + +- 名前付きRouteを使う場合 + +```dart +getPages: [ + GetPage( + name: '/', + page: () => HomeView(), + binding: HomeBinding(), + ), + GetPage( + name: '/details', + page: () => DetailsView(), + binding: DetailsBinding(), + ), +]; +``` + +- 通常のRouteを使う場合 + +```dart +Get.to(Home(), binding: HomeBinding()); +Get.to(DetailsView(), binding: DetailsBinding()) +``` + +これでアプリケーションのメモリ管理を気にする必要がなくなります。Getがすべてやってくれます。 + +BindingsクラスはRouteの呼び出しと同時に呼び出されます。また、すべてに共通の依存オブジェクトを挿入するためには GetMaterialApp の initialBinding プロパティを使用してください。 + +```dart +GetMaterialApp( + initialBinding: SampleBind(), + home: Home(), +); +``` + +### BindingsBuilder + +Bindingsを作成する一般的な方法は Bindings を実装したクラスを作成することですが、`BindingsBuilder` コールバックを使う方法もあります。 + +Example: + +```dart +getPages: [ + GetPage( + name: '/', + page: () => HomeView(), + binding: BindingsBuilder(() { + Get.lazyPut(() => ControllerX()); + Get.put(()=> Api()); + }), + ), + GetPage( + name: '/details', + page: () => DetailsView(), + binding: BindingsBuilder(() { + Get.lazyPut(() => DetailsController()); + }), + ), +]; +``` + +この方法ならRouteごとにBindingsクラスを作る必要はありません。 + +どちらの方法でも効果は変わりませんのでお好みの方法を使ってください。 + +### SmartManagement + +エラーが発生してControllerを使用するWidgetが正しく破棄されなかった場合でも、Controllerが未使用になればGetXはデフォルトの動作通りそれをメモリから削除します。 +これがいわゆる依存オブジェクト管理機能の `full` モードと呼ばれるものです。 +しかしもしGetXによるオブジェクト破棄の方法をコントロールしたい場合は、`SmartManagement`クラスを使って設定してください。 + +#### 設定の変更方法 + +この設定は通常変更する必要はありませんが、変更されたい場合はこのようにしてください。 + +```dart +void main () { + runApp( + GetMaterialApp( + smartManagement: SmartManagement.onlyBuilder // ここで設定 + home: Home(), + ) + ) +} +``` + +#### SmartManagement.full + +これがデフォルトのモードです。使用されていない、かつ `permanent: true` が設定されていないオブジェクトを自動で破棄してくれます。特殊な事情がない限り、この設定は触らない方がいいでしょう。GetXを使って間がない場合は特に。 + +#### SmartManagement.onlyBuilder +`init:` もしくはBindings内で `Get.lazyPut()` により設定したビルダー製のオブジェクトだけを破棄するモードです。 + +もしそれが `Get.put()` や `Get.putAsync()` などのアプローチで生成したオブジェクトだとしたら、SmartManagement は勝手にメモリから除外することはできません。 + +それに対してデフォルトのモードでは `Get.put()` で生成したオブジェクトも破棄します。 + +#### SmartManagement.keepFactory + +SmartManagement.full と同じように、オブジェクトが使用されていない状態になれば破棄します。ただし、前述の「ファクトリー」に存在するものだけは残します。つまりそのインスタンスが再び必要になった際は依存オブジェクトを再度生成するということです。 + +### Bindingsの仕組み +Bindingsは「一過性のファクトリー」のようなものを作成します。これはそのRouteに画面遷移した瞬間に作成され、そこから画面移動するアニメーションが発生した瞬間に破棄されます。 +この動作は非常に高速で行われるので、アナライザーでは捕捉できないほどです。 +再び元の画面に戻ると新しい「一過性のファクトリー」が呼び出されます。そのためこれは SmartManagement.keepFactory を使用するよりも多くの場合好ましいですが、Bindingsを作成したくない場合やすべての依存オブジェクトを同じBindingsに持っておきたい場合は SmartManagement.keepFactory を使うといいでしょう。 +ファクトリーのメモリ使用量は少なく、インスタンスを保持することはありません。その代わりにそのクラスのインスタンスを形作る関数を保持します。 +メモリコストは非常に低いのですが、最小リソースで最大パフォーマンスを得ることが目的のGetではデフォルトでファクトリーを削除します。 +どちらか都合に合う方ををお使いいただければと思います。 + +## 補足 + +- 複数のBindingsを使う場合は SmartManagement.keepFactory は**使わない**でください。これは Bindings を使わないケースや、GetMaterialAppのinitialBindingに設定された単独のBindingと一緒に使うケースを想定されて作られました。 + +- Bindingsを使うことは必須ではありません。`Get.put()` と `Get.find()` だけでも全く問題ありません。 +ただし、サービスやその他抽象度の高いクラスをアプリに取り入れる場合はコード整理のために使うことをおすすめします。 diff --git a/siro_rider/packages/get/documentation/ja_JP/route_management.md b/siro_rider/packages/get/documentation/ja_JP/route_management.md new file mode 100644 index 0000000..f32c4a1 --- /dev/null +++ b/siro_rider/packages/get/documentation/ja_JP/route_management.md @@ -0,0 +1,567 @@ +- [Route管理](#Route管理) + - [使い方](#使い方) + - [通常Routeによるナビゲーション](#通常Routeによるナビゲーション) + - [名前付きRouteによるナビゲーション](#名前付きRouteによるナビゲーション) + - [名前付きRouteにデータを送る](#名前付きRouteにデータを送る) + - [動的URLの生成](#動的URLの生成) + - [ミドルウェアの使用](#ミドルウェアの使用) + - [contextを使わないナビゲーション](#contextを使わないナビゲーション) + - [SnackBar](#snackbar) + - [Dialog](#dialog) + - [BottomSheet](#bottomsheet) + - [ネスト構造のナビゲーション](#ネスト構造のナビゲーション) + +# Route管理 + +このドキュメントではGetXにおけるRoute管理のすべてをご説明します。 + +## How to use + +次の3文字を pubspec.yaml ファイルに追加してください。 + +```yaml +dependencies: + get: +``` + +Route / SnackBar / Dialog / BottomSheet をcontextなしで、あるいは高レベルのGet APIを使用するには MaterialApp の前に「Get」を追加してください。それだけで GetMaterialApp の機能が使用できます。 + +```dart +GetMaterialApp( // 変更前: MaterialApp( + home: MyHome(), +) +``` + +## 名前付きRouteによる画面遷移 + +次の画面に遷移するには Get.to を使ってください。 + +```dart +Get.to(NextScreen()); +``` + +SnackBar / Dialog / BottomSheet など Navigator.pop(context) で閉じるものと同じものを閉じるには Get.back を使います。 + +```dart +Get.back(); +``` + +次の画面に遷移しつつ、前の画面に戻れないようにするには Get.off を使います(スプラッシュスクリーンやログイン画面などで使用)。 + +```dart +Get.off(NextScreen()); +``` + +次の画面に遷移して、それ以前のRouteはすべて破棄するには Get.offAll を使います(ショッピングカート、投票、テストなどで使用) + +```dart +Get.offAll(NextScreen()); +``` + +次の画面に遷移して、戻ったらデータを受け取る方法はこちら。 + +```dart +var data = await Get.to(Payment()); +``` + +次の画面では、このようにデータを前の画面に送る必要があります。 + +```dart +Get.back(result: 'success'); +``` + +そして使いましょう。 + +ex: + +```dart +if(data == 'success') madeAnything(); +``` + +どのようなシンタックスがあるかもっと知りたいですか? +いつもの Navigator ではなく navigator と入れてみてください。通常のNavigatorで使えるプロパティがcontextなしで使えるようになっているかと思います。 + +```dart + +// 通常のFlutterによるNavigator +Navigator.of(context).push( + context, + MaterialPageRoute( + builder: (BuildContext context) { + return HomePage(); + }, + ), +); + +// GetではFlutterのシンタックスをcontextなしで使えます +navigator.push( + MaterialPageRoute( + builder: (_) { + return HomePage(); + }, + ), +); + +// Getのシンタックス(上記よりかなり短いですね) +Get.to(HomePage()); + + +``` + +## 名前付きRouteによる画面遷移 + +- Getは名前付きRouteによる遷移もサポートしています。 + +次の画面への遷移はこう。 + +```dart +Get.toNamed("/NextScreen"); +``` + +Get.off の名前付きRoute版。 + +```dart +Get.offNamed("/NextScreen"); +``` + +Get.offAll の名前付きRoute版。 + +```dart +Get.offAllNamed("/NextScreen"); +``` + +Routeを定義するにはGetMaterialAppを使ってください。 + +```dart +void main() { + runApp( + GetMaterialApp( + initialRoute: '/', + getPages: [ + GetPage(name: '/', page: () => MyHomePage()), + GetPage(name: '/second', page: () => Second()), + GetPage( + name: '/third', + page: () => Third(), + transition: Transition.zoom + ), + ], + ) + ); +} +``` + +未定義Route(404エラー)に遷移させるには、GetMaterialAppで unknownRoute を設定してください。 + +```dart +void main() { + runApp( + GetMaterialApp( + unknownRoute: GetPage(name: '/notfound', page: () => UnknownRoutePage()), + initialRoute: '/', + getPages: [ + GetPage(name: '/', page: () => MyHomePage()), + GetPage(name: '/second', page: () => Second()), + ], + ) + ); +} +``` + +### 名前付きRouteにデータを送る + +次の画面に渡すデータは arguments で引数を設定します。Getでは引数にどんなものでも指定できます。StringでもMapでもListでも、クラスのインスタンスでも大丈夫です。 + +```dart +Get.toNamed("/NextScreen", arguments: 'Get is the best'); +``` + +ビュー側のクラスやControllerで値を使うにはこうしてください。 + +```dart +print(Get.arguments); +// Get is the best が表示される +``` + +### 動的URLの生成 + +Getはウェブのような高度な動的URLを提供します。ウェブ開発者はFlutterにこの機能が提供されることを待ち望んでいたことでしょう。この機能の提供を謳うパッケージは存在しますが、ウェブ上のURLとは全く異なるシンタックスが表示されているのを見たことがあるかもしれません。Getはこの点も解決します。 + +```dart +Get.offAllNamed("/NextScreen?device=phone&id=354&name=Enzo"); +``` + +ビュー側のクラスやControllerで値を使う方法。 + +```dart +print(Get.parameters['id']); +// 出力: 354 +print(Get.parameters['name']); +// 出力: Enzo +``` + +この名前付きパラメーターはこのように簡単に受け取ることもできます。 + +```dart +void main() { + runApp( + GetMaterialApp( + initialRoute: '/', + getPages: [ + GetPage( + name: '/', + page: () => MyHomePage(), + ), + GetPage( + name: '/profile/', + page: () => MyProfile(), + ), + // 引数userを使う場合と使わない場合で別ページを定義することが可能です。 + // ただ、そのためにはスラッシュ '/' をベースのRoute名の後に入れる必要があります。 + GetPage( + name: '/profile/:user', + page: () => UserProfile(), + ), + GetPage( + name: '/third', + page: () => Third(), + transition: Transition.cupertino + ), + ], + ) + ); +} +``` + +Route名を使ってデータを送る方法。 + +```dart +Get.toNamed("/profile/34954"); +``` + +次の画面でデータを受け取る方法。 + +```dart +print(Get.parameters['user']); +// out: 34954 +``` + +複数のパラメーターを送信するにはこちら。 + +```dart +Get.toNamed("/profile/34954?flag=true&country=italy"); +``` +もしくは +```dart +var parameters = {"flag": "true","country": "italy",}; +Get.toNamed("/profile/34954", parameters: parameters); +``` + +次の画面でデータを受け取る方法。 + +```dart +print(Get.parameters['user']); +print(Get.parameters['flag']); +print(Get.parameters['country']); +// 出力: 34954 true italy +``` + + + +あとは Get.toNamed() を使い、名前付きRouteを指定するだけです(contextを使わないので BLoC や Controller から直接Routeを呼び出すことができます)。ウェブアプリとしてコンパイルされると、Routeが正しくURLに表示されます。 + +### ミドルウェアの使用 + +何かのアクションのトリガーとなるイベントを取得したい場合は、routingCallbackを使用してください。 + +```dart +GetMaterialApp( + routingCallback: (routing) { + if(routing.current == '/second'){ + openAds(); + } + } +) +``` + +GetMaterialAppを使用しない場合は、手動のAPIを使ってミドルウェアオブザーバーを設定してください。 + +```dart +void main() { + runApp( + MaterialApp( + onGenerateRoute: Router.generateRoute, + initialRoute: "/", + navigatorKey: Get.key, + navigatorObservers: [ + GetObserver(MiddleWare.observer), // ここ + ], + ), + ); +} +``` + +ミドルウェアクラスを作成する + +```dart +class MiddleWare { + static observer(Routing routing) { + /// Routeの他に SnackBar / Dialog / BottomSheet のイベントも監視することができます。 + /// また、ここで直接この3つのいずれかを表示したい場合は、 + /// イベント自身が「それではない」ことを事前にチェックする必要があります。 + if (routing.current == '/second' && !routing.isSnackbar) { + Get.snackbar("Hi", "You are on second route"); + } else if (routing.current =='/third'){ + print('last route called'); + } + } +} +``` + +それではGetをコードで使ってみましょう。 + +```dart +class First extends StatelessWidget { + @override + Widget build(BuildContext context) { + return Scaffold( + appBar: AppBar( + leading: IconButton( + icon: Icon(Icons.add), + onPressed: () { + Get.snackbar("hi", "i am a modern snackbar"); + }, + ), + title: Text('First Route'), + ), + body: Center( + child: ElevatedButton( + child: Text('Open route'), + onPressed: () { + Get.toNamed("/second"); + }, + ), + ), + ); + } +} + +class Second extends StatelessWidget { + @override + Widget build(BuildContext context) { + return Scaffold( + appBar: AppBar( + leading: IconButton( + icon: Icon(Icons.add), + onPressed: () { + Get.snackbar("hi", "i am a modern snackbar"); + }, + ), + title: Text('second Route'), + ), + body: Center( + child: ElevatedButton( + child: Text('Open route'), + onPressed: () { + Get.toNamed("/third"); + }, + ), + ), + ); + } +} + +class Third extends StatelessWidget { + @override + Widget build(BuildContext context) { + return Scaffold( + appBar: AppBar( + title: Text("Third Route"), + ), + body: Center( + child: ElevatedButton( + onPressed: () { + Get.back(); + }, + child: Text('Go back!'), + ), + ), + ); + } +} +``` + +## contextを使わないナビゲーション + +### SnackBar + +FlutterでシンプルなSnackBarを表示したいとき、Scaffoldのcontextか、GlobalKeyを取得する必要があります。 + +```dart +final snackBar = SnackBar( + content: Text('Hi!'), + action: SnackBarAction( + label: 'I am a old and ugly snackbar :(', + onPressed: (){} + ), +); +// WidgetツリーでScaffoldを探し、それをSnackBar表示に使用します。 +Scaffold.of(context).showSnackBar(snackBar); +``` + +Getならこうなります。 + +```dart +Get.snackbar('Hi', 'i am a modern snackbar'); +``` + +コードのどこにいようと、Get.snackbar を呼ぶだけでいいのです。カスタマイズも自由自在です。 + +```dart +Get.snackbar( + "Hey i'm a Get SnackBar!", // タイトル + "It's unbelievable! I'm using SnackBar without context, without boilerplate, without Scaffold, it is something truly amazing!", // 本文 + icon: Icon(Icons.alarm), + shouldIconPulse: true, + onTap:(){}, + barBlur: 20, + isDismissible: true, + duration: Duration(seconds: 3), +); + + + ////////// すべてのプロパティ ////////// + // Color colorText, + // Duration duration, + // SnackPosition snackPosition, + // Widget titleText, + // Widget messageText, + // bool instantInit, + // Widget icon, + // bool shouldIconPulse, + // double maxWidth, + // EdgeInsets margin, + // EdgeInsets padding, + // double borderRadius, + // Color borderColor, + // double borderWidth, + // Color backgroundColor, + // Color leftBarIndicatorColor, + // List boxShadows, + // Gradient backgroundGradient, + // TextButton mainButton, + // OnTap onTap, + // bool isDismissible, + // bool showProgressIndicator, + // AnimationController progressIndicatorController, + // Color progressIndicatorBackgroundColor, + // Animation progressIndicatorValueColor, + // SnackStyle snackStyle, + // Curve forwardAnimationCurve, + // Curve reverseAnimationCurve, + // Duration animationDuration, + // double barBlur, + // double overlayBlur, + // Color overlayColor, + // Form userInputForm + /////////////////////////////////// +``` + +従来の SnackBar がお好みの場合や、ゼロからカスタマイズしたい場合 (たとえば Get.snackbar ではタイトルと本文が必須項目となっています)は `Get.rawSnackbar();` を使ってください。SnackBarの元々のAPIを取得できます。 + +### Dialog + +ダイアログを表示する方法。 + +```dart +Get.dialog(YourDialogWidget()); +``` + +デフォルトのダイアログを表示する方法。 + +```dart +Get.defaultDialog( + onConfirm: () => print("Ok"), + middleText: "Dialog made in 3 lines of code" +); +``` + +また showGeneralDialog の代わりに Get.generalDialog が使えます。 + +Overlayを使用するCupertino含むその他のFlutterのダイアログについては、contextの代わりに Get.overlayContext を使うことでコードのどこでもダイアログを表示することができます。 +Overlayを使わないWidgetについては、Get.context が使えます。 +これら2つのcontextはほとんどのケースでUIのcontextを代替することができるでしょう。ただし、ナビゲーションのcontextを使用せずInheritedWidgetが使われているケースは例外です。 + +### BottomSheet + +Get.bottomSheet は showModalBottomSheet に似ていますが、contextが不要です。 + +```dart +Get.bottomSheet( + Container( + child: Wrap( + children: [ + ListTile( + leading: Icon(Icons.music_note), + title: Text('Music'), + onTap: () {} + ), + ListTile( + leading: Icon(Icons.videocam), + title: Text('Video'), + onTap: () {}, + ), + ], + ), + ) +); +``` + +## ネスト構造のナビゲーション + +GetはFlutterのネスト構造のナビゲーションの扱いも簡単にしてくれます。 +contextを必要とせず、IDによりナビゲーションのスタックを見つけることができます。 + +- 注: 並列のナビゲーションスタックを作成することは危険です。ネスト構造のNavigatorを使用しないか、使用を控えめにするのが理想です。必要なら使っていただいても問題ありませんが、複数のナビゲーションのスタックを保持することはRAM消費の面で好ましくないということは覚えておいてください。 + +こんなに簡単にできます。 + +```dart +Navigator( + key: Get.nestedKey(1), // インデックス指定でkey作成 + initialRoute: '/', + onGenerateRoute: (settings) { + if (settings.name == '/') { + return GetPageRoute( + page: () => Scaffold( + appBar: AppBar( + title: Text("Main"), + ), + body: Center( + child: TextButton( + color: Colors.blue, + onPressed: () { + Get.toNamed('/second', id:1); // インデックス指定でネスト型Routeに遷移 + }, + child: Text("Go to second"), + ), + ), + ), + ); + } else if (settings.name == '/second') { + return GetPageRoute( + page: () => Center( + child: Scaffold( + appBar: AppBar( + title: Text("Main"), + ), + body: Center( + child: Text("second") + ), + ), + ), + ); + } + } +), +``` diff --git a/siro_rider/packages/get/documentation/ja_JP/state_management.md b/siro_rider/packages/get/documentation/ja_JP/state_management.md new file mode 100644 index 0000000..3c30c05 --- /dev/null +++ b/siro_rider/packages/get/documentation/ja_JP/state_management.md @@ -0,0 +1,787 @@ +* [状態管理](#状態管理) + + [リアクティブな状態管理](#リアクティブな状態管理) + - [利点](#利点) + - [パフォーマンスの最大化](#パフォーマンスの最大化) + - [リアクティブな変数の宣言](#リアクティブな変数の宣言) + - [初期値の設定](#初期値の設定) + - [Observableの値をビュー内で使う](#Observableの値をビュー内で使う) + - [更新条件を設定](#更新条件を設定) + - [.obsの使いどころ](#.obsの使いどころ) + - [List(Rx)に関する補足](#List(Rx)に関する補足) + - [なぜ「.value」を使う必要があるのか](#なぜ「.value」を使う必要があるのか) + - [Obx()](#obx) + - [Worker](#worker) + + [非リアクティブな状態管理](#非リアクティブな状態管理) + - [利点](#利点) + - [使用例](#使用例) + - [Controllerインスタンスの扱い](#Controllerインスタンスの扱い) + - [StatefulWidgetsはもういらない](#StatefulWidgetsはもういらない) + - [Getの目的](#Getの目的) + - [Controllerの様々な使用方法](#Controllerの様々な使用方法) + - [ユニークIDの設定](#ユニークIDの設定) + + [状態管理ソリューションを混在させる](#状態管理ソリューションを混在させる) + + [StateMixin](#StateMixin) + + [GetBuilder VS GetX VS Obx VS MixinBuilder](#GetBuilder-VS-GetX-VS-Obx-VS-MixinBuilder) + +# 状態管理 + +GetXは他の状態管理ライブラリのように Stream や ChangeNotifier を使用する必要がありません。なぜか?私たちは応答時間とRAM消費量を改善するために GetValueとGetStream という低遅延のソリューションを開発しましたが、状態管理機能を含むGetXのリソースはすべてこれをベースに作られているためです。このソリューションはより低い運用コストと高いパフォーマンスを実現します。GetXを使えばAndroid、iOS、Web、Linux、macOS用のアプリケーションを作成するだけでなく、Flutter/GetXと同じシンタックスでサーバーアプリケーションを作ることができます。 + +* _バカみたいにシンプル_: 他の状態管理アプローチの中には、複雑で多くのボイラープレートコードを書かなければいけないものもあります。この問題により少なくない人たちがFlutterを見限りましたが、今ようやく、バカみたいにシンプルなソリューションを手に入れることができました。GetXを使えば、非常にすっきりとした、記述量の少ないコードでより多くのことができるようになります。イベントごとにクラスを定義する必要もありません。 +* _コード生成にサヨナラ_: 開発時間の半分はアプリケーションロジックの作成に費やします。それにも関わらず、状態管理ライブラリの中には、ミニマルなコードを作るためにコード生成ツールに依存しているものがあります。変数を変更して build_runner を実行するのは非生産的ですし、flutter clean 後の待ち時間もコーヒーをたくさん飲まなければならないほど長くなることもあります。 + +GetXはすべてがリアクティブであり、コード生成ツールに依存しないため、開発のあらゆる面において生産性が向上します。 + +* _context依存にサヨナラ_: ビューとビジネスロジックを連携させるため、ビューのcontextをControllerに送る必要に迫られた。contextがないところで依存オブジェクトの注入をする必要があり、contextを方々のクラスや関数からなんとか渡した。これらの経験、誰もが通ってきた道かと思います。しかし、GetXではこのような経験をすることはありません。contextなしで、Controllerの中から別のControllerにアクセスすることができます。パラメーターを通じて無駄にcontextを送る必要はもうありません。 +* _細かいコントロール_: 多くの状態管理ソリューションは、ChangeNotifierをベースにしています。ChangeNotifierは、notifyListenerが呼ばれたときに、依存するすべてのWidgetに通知します。画面に40個のWidgetがあるとしましょう。それらがすべてChangeNotifierの変数に依存している場合、変数を1つでも更新すれば、すべてのWidgetが更新されます。 + +GetXを使えばネストされたWidgetさえも的確にビルドを処理することができます。ListViewを担当するObxと、ListViewの中のチェックボックスを担当するObxがあれば、チェックボックスの値を変更した場合はチェックボックスWidgetだけが更新され、Listの値を変更した場合はListViewだけが更新されます。 + +* _変数が本当に変わったときだけ更新する_: GetXはデータの流れをコントロールします。つまり、Textに紐づいたObservable(監視可能)変数の値 'Paola' を、同じ 'Paola' に変更してもWidgetは更新されません。これは、GetXがTextに'Paola'がすでに表示されていることをわかっているためです。 + +多くの状態管理ソリューションは、この場合更新を行います。 + +## リアクティブな状態管理 + +リアクティブプログラミングは複雑であると言われがちなためか、多くの人に敬遠されています。しかし、GetXはリアクティブプログラミングを非常にシンプルなものにしてくれます。 + +* StreamControllerを作る必要はありません。 +* 変数ごとにStreamBuilderをセットする必要はありません。 +* 状態ごとにクラスを作る必要はありません。 +* 初期値のためにgetを準備する必要はありません。 + +Getによるリアクティブプログラミングは、setState並に簡単です。 + +たとえば name という変数があり、それを変更するたびに変数に依存するすべてのWidgetを自動更新したいとします。 + +これがその name 変数です。 + +``` dart +var name = 'Jonatas Borges'; +``` + +これをObservable(監視可能)にするには、値の末尾に ".obs" を付け足すだけです。 + +``` dart +var name = 'Jonatas Borges'.obs; +``` + +これで終わりです。*こんなに* 簡単なんですよ。 + +(以後、このリアクティブな ".obs" 変数、Observable(監視可能)を _Rx_ と呼ぶことがあります。) + +内部ではこのような処理を行っています: `String`の`Stream`を作成し、初期値`"Jonatas Borges"`を割り当て、`"Jonatas Borges"`に依存するすべてのWidgetに、あなたは今この変数の影響下にあるから、_Rx_の値が変更されたときには、あなたも同様に変更する必要がある旨を通知。 + +これがDartの機能のおかげで実現できた **GetX マジック** です。 + +しかし皆さんご存知の通り、`Widget` は関数の中にいなければ自らを更新できません。静的クラスには「自動更新」の機能がないからです。 + +それなら、同じスコープ内で複数の変数に依存してWidgetをビルドする場合は、複数の `StreamBuilder` をネストして変数の変化を監視する必要がありますね。 + +いいえ、**GetX** なら `StreamBuilder` すら不要です。 + +またWidgetを更新する際のボイラープレートコードについても、**GetX**では忘れてください。 + +`StreamBuilder( ... )` ? `initialValue: ...` ? `builder: ...` ? これらはすべて不要で、対象のWidgetを `Obx()` の中に入れるだけです。 + +``` dart +Obx (() => Text (controller.name)); +``` + +_覚えること?_ それは `Obx(() =>` だけです。 + +そのWidgetをアロー関数を通じて `Obx()`(_Rx_のObserver(監視者))に渡すだけです。 + +`Obx` は非常に賢く、`controller.name` の値が本当に変わったときにのみ、Widgetの更新をかけます。 + +`name` が `"John"` だとして、それを `"John"` ( `name.value = "John"` ) に変更しても、以前と同じ `value` のため画面上では何も変化しません。`Obx` はリソースを節約するために値を無視し、Widgetを更新しません。**すごいでしょ?** + +> では、もしも `Obx` の中に_Rx_(Observable)変数が5つあったらどうでしょう? + +5つの**いずれかに**値の変化があればWidgetは更新されます。 + +> また、1つのControllerクラスに30もの変数がある場合、1つの変数を更新したら変数に関わるWidgetが**すべて**更新されてしまうのでしょうか? + +いいえ、_Rx_ 変数を使う特定のWidgetだけが更新されます。 + +言い換えるなら、**GetX**は _Rx_ 変数の値が変化したときだけ画面更新をしてくれるということです。 + +```dart + +final isOpen = false.obs; + +// 同じ値なので何も起きません。 +void onButtonTap() => isOpen.value=false; +``` + +### 利点 + +**GetX()**は何を更新して何をしないのか、の**細かい**コントロールが可能です。 + +すべての更新するのでそのようなコントロールが不要な場合は、`GetBuilder` を検討してください。 +これはわずか数行のコードで作られた、状態更新のためのシンプルなビルダーです。(`setState()`のようにブロックで) +CPUへの影響を最小限にするために作られており、単一の目的(_状態_ の再構築)を果たすため、可能な限りリソース消費を抑えました。 + +**強力な** 状態管理のソリューションを求めているなら、**GetX**で間違いはありません。 + +変数をそのまま扱うことはできませんが、内部では `Stream` としてデータが扱われています。 + +すべてが `Stream` なので、_RxDart_ を組み合わせることも可能ですし、 +"_Rx_ 変数" のイベントや状態を監視することも可能です。 + +GetXは _MobX_ より簡単で、コード自動生成や記述量を減らした_BLoC_ 型アプローチと言えるかもしれません。 +値の末尾に `.obs` を付けるだけで**なんでも** _"Observable(監視可能)"_ にできるのです。 + +### パフォーマンスの最大化 + +ビルドを最小限に抑えるための賢いアルゴリズムに加えて、 +**GetX**はコンパレーターを使用して状態が変更されたことを確認します。 + +アプリでなにかしらのエラーが発生し、状態が変更された情報を +二重に送信してしまったとしても**GetX**はクラッシュを防いでくれます。 + +**GetX**では値が変化したときにはじめて「状態」が変化するためです。 +これが **GetX** と _MobX の `computed`_ を使う際の主な違いです。 +2つの __Observable__ を組み合わせて一つが変化したとき、それを監視しているオブジェクトも変化します。 + +これは `GetX()` (`Observer()`のようなもの) において2つの変数を組み合わせた場合においても、 +それが本当に状態の変化を意味するときだけWidgetの更新が行われるということでもあります。 + +### リアクティブな変数の宣言 + +変数を "Observable" にする方法は3つあります。 + +1 - **`Rx{Type}`** を使用する + +``` dart +// 初期値を入れることを推奨しますが、必須ではありません +final name = RxString(''); +final isLogged = RxBool(false); +final count = RxInt(0); +final balance = RxDouble(0.0); +final items = RxList([]); +final myMap = RxMap({}); +``` + +2 - **`Rx`** とジェネリクスによる型指定の組み合わせ + +``` dart +final name = Rx(''); +final isLogged = Rx(false); +final count = Rx(0); +final balance = Rx(0.0); +final number = Rx(0); +final items = Rx>([]); +final myMap = Rx>({}); + +// 任意の型を指定可能 - どんなクラスでもOK +final user = Rx(); +``` + +3 - 最も実用的で簡単な方法として、**`.obs`** を値に付ける + +``` dart +final name = ''.obs; +final isLogged = false.obs; +final count = 0.obs; +final balance = 0.0.obs; +final number = 0.obs; +final items = [].obs; +final myMap = {}.obs; + +// カスタムクラスのインスタンスにも付けられます +final user = User().obs; +``` + +##### 初期値の設定 + +ご存知の通り、_Dart_ は現在 _null safety_ へ移行しているところです。 +それに備えるために今後は _Rx_ 変数は常に**初期値**を設定してください。 + +> **GetX** で変数を _Observable_ にしつつ _初期値_ を設定するのはとても簡単です。 + +変数の末尾に `.obs` を付ける。**それだけ。** +めでたく Observable とそのプロパティ `.value` (つまり _初期値_)ができました。 + +### Observableの値をビュー内で使う + +``` dart +// Controllerクラス +final count1 = 0.obs; +final count2 = 0.obs; +int get sum => count1.value + count2.value; +``` + +``` dart +// ビュークラス +GetX( + builder: (controller) { + print("count 1 rebuild"); + return Text('${controller.count1.value}'); + }, +), +GetX( + builder: (controller) { + print("count 2 rebuild"); + return Text('${controller.count2.value}'); + }, +), +GetX( + builder: (controller) { + print("count 3 rebuild"); + return Text('${controller.sum}'); + }, +), +``` + +`count1.value++` を実行すると、以下の通りprintされます。 + +* `count 1 rebuild` + +* `count 3 rebuild` + +なぜなら `count1` の値が `1` に変わり、それに伴ってgetter `sum` の値にも `1 + 0 = 1` と変化が起こるからです。 + +今度は `count2.value++` を実行してみましょう。 + +* `count 2 rebuild` + +* `count 3 rebuild` + +もうおわかりですね。これは `count2.value` が変わり、その結果 `sum` が `2` になったからです。 + +* 注: デフォルト仕様では、`value` に変化がなかったとしても、それが最初のイベントであればWidgetを更新します。 + + この仕様はbool変数の性質から来るものです。 + +たとえばこの場合を想像してみてください。 + +``` dart +var isLogged = false.obs; +``` + +そして、isLogged(ユーザーがログインしたかどうか)の変化をトリガーにever関数内のコールバックfireRouteを呼び出したいとします。 + +``` dart +@override +onInit() async { + // everは引数1が変化するたびに引数2を実行するリスナー + ever(isLogged, fireRoute); + isLogged.value = await Preferences.hasToken(); +} + +fireRoute(logged) { + if (logged) { + Get.off(Home()); + } else { + Get.off(Login()); + } +} +``` + +もし `hasToken` が `false` なら `isLogged` に変化はありません。すると `ever()` のコールバックは永遠に呼び出されないことになります。 +このような挙動を防ぐために _Observable_ への最初の更新は、それがたとえ同じ `.value` だったとしても +常にイベントを引き起こすようにしています。 + +ご参考までに、この仕様は以下の設定で解除することができます。 + `isLogged.firstRebuild = false;` + +### 更新条件を設定 + +Getにはさらに洗練された「状態」のコントロール方法があります。イベント(Listへのオブジェクト追加など)に対して条件を付けることが可能です。 + +``` dart +// 引数1: Listにオブジェクトを加える条件。trueかfalseを返すこと +// 引数2: 条件がtrueの場合に加える新しいオブジェクト +list.addIf(item < limit, item); +``` + +最低限のコードで、コード生成ツールも使わず、とても簡単ですね :smile: + +カウンターアプリもこのようにシンプルに実現できます。 + +``` dart +class CountController extends GetxController { + final count = 0.obs; +} +``` + +Controllerを設定して、下記を実行するだけ。 + +``` dart +controller.count.value++ +``` + +UIの数字が置き換わりましたね。このようにアプリのどこであっても更新をかけることができます。 + +### .obsの使いどころ + +.obs を使うことでどんなものもObservableにすることができます。方法は2つ。 + +* クラスのインスタンス変数をobsに変換する + +``` dart +class RxUser { + final name = "Camila".obs; + final age = 18.obs; +} +``` + +* クラスのインスタンスを丸々obsに変換する + +``` dart +class User { + User({String name, int age}); + var name; + var age; +} + +// インスタンス化の際 +final user = User(name: "Camila", age: 18).obs; +``` + +### List(Rx)に関する補足 + +List(Rx)はその中のオブジェクトと同様、監視可能(Observable)です。そのためオブジェクトを追加すると、List(Rx)に依存するWidgetは自動更新されます。 + +またList(Rx)をListとするために ".value" を使う必要はありません。DartのAPIがこれを可能にしてくれました。ただ、残念ながら他のStringやintのようなプリミティブ型は拡張ができないため、.value を使う必要があります。getterやsetterを活用するのであればあまり問題になりませんが。 + +``` dart +// Controllerクラス +final String title = 'User Info:'.obs +final list = List().obs; + +// ビュークラス +Text(controller.title.value), // Stringの場合は .value が必要 +ListView.builder ( + itemCount: controller.list.length // Listの場合は不要 +) +``` + +カスタムのクラスをObservableにした場合は、様々な方法で値を更新することができます。 + +``` dart +// モデルクラス +// 属性をobsにするやり方ではなく、クラス全体をobsにする方法を採ります +class User() { + User({this.name = '', this.age = 0}); + String name; + int age; +} + +// Controllerクラス +final user = User().obs; +// user変数を更新するときはこのようなメソッドを作ります +user.update( (user) { // このパラメーターは更新するオブジェクトそのもの +user.name = 'Jonny'; +user.age = 18; +}); +// あるいは、この方法でも。変数名は呼び出し可能です。 +user(User(name: 'João', age: 35)); + +// ビュークラス +Obx(()=> Text("Name ${user.value.name}: Age: ${user.value.age}")) +// .value を使わずにモデルのプロパティにアクセスすることも可能です +user().name; // userがUserではないことに注目。user()でUserを受け取れます。 +``` + +ListのsetAllやsetRangeメソッドの代わりに、"assign" "assignAll" APIを使っていただくことも可能です。 +"assign" APIはListの内容をクリアした後に、指定した単独のオブジェクトを追加してくれます。 +"assignAll" APIはそのIterable版です。 + +### なぜ「.value」を使う必要があるのか + +ちょっとしたアノテーションとコード生成ツールを使って`String`や`int`で `.value` を使わなくて済むようにもすることはできますが、このライブラリの目的は「外部依存パッケージを減らす」ことです。私たちは、外部パッケージを必要としない、必須ツール(Route、依存オブジェクト、状態の管理)が揃った開発環境を軽量かつシンプルな方法で提供したいと考えています。 + +まさに pubspecに3文字(get)とコロンを加えて、プログラミングを始めることができるのです。Route管理から状態管理まで、必要なソリューションが標準装備されています。GetXはシンプルさ、生産性、高いパフォーマンスを目指します。 + +これほど多機能であるにも関わらず、このライブラリの総容量は他の多くの状態管理ライブラリよりも少ないです。その点をご理解いただけるとうれしいです。 + +`.value` が嫌でコード生成ツールを使いたいという方には、MobXは素晴らしいライブラリだと思いますし、Getと併用することもできます。逆に多くの外部パッケージに依存したくない方、パッケージ間の互換性を気にしたくない方、状態管理ツールや依存オブジェクトから状態更新エラーが出ているかどうかを気にせずプログラミングをしたい方、依存するControllerクラスのインスタンスがあるかどうかを都度都度心配したくない方にとってはGetはまさに最適です。 + +MobXのコード生成や、BLoCのボイラープレートコードが気にならないのであれば、Route管理にだけでもGetをお使いいただけるとうれしいです。GetのSEMとRSMは必要に迫られて生まれたものです。私の会社で以前、90以上のControllerを持つプロジェクトがあり、それなりの性能のマシンでflutter cleanを行った後でさえ、コード生成ツールがタスクを完了するのに30分以上かかりました。もしあなたが大きなプロジェクトに関わっており、コード生成ツールが問題になっているのであれば、Getを検討してみてください。 + +もちろん、コード生成ツールをGetXに導入したい方が実際にツールを作成してプロジェクトに貢献した場合は、このReadMeに代替ソリューションとして掲載させていただきます。私はすべての開発者のニーズをかなえたいわけではありませんが、今はこの質問に対しては、「すでにMobXのように同様のことを実現してくれる良いソリューションがある」とだけ言わせてください。 + +### Obx() + +GetX()の代わりにObx()を使用することもできます。ObxはWidgetを生成する匿名関数をパラメーターに持ちます。複数のControllerに対応することができますが、自身はControllerのインスタンスを持たず、型指定もできません。そのため別途Controllerのインスタンスを作るか、`Get.find()` でインスタンスを探しておく必要があります。 + +### Worker + +Worker はイベント発生に伴って指定したコールバックを呼び出すことができます。 + +``` dart +/// `count1` が更新されるたびに第2引数のコールバックが実行される +ever(count1, (_) => print("$_ has been changed")); + +/// `count1` の最初の更新時のみ実行される +once(count1, (_) => print("$_ was changed once")); + +/// DDoS攻撃対策に最適。たとえば、ユーザーが打鍵やクリックを止めて1秒後に実行など +debounce(count1, (_) => print("debouce$_"), time: Duration(seconds: 1)); + +/// 1秒以内の連続更新はすべて無視して実行しない +interval(count1, (_) => print("interval $_"), time: Duration(seconds: 1)); +``` + +すべてのWorker(`debounce` 以外) は `condition` パラメーターを持ちます。`condition` は `bool` でも `bool` を返すコールバックでも構いません。 +この `condition` が Worker のコールバックを実行するかどうかを決めています。 + +また Worker は `Worker` インスタンスを返します。これは `dispose()` などを通じて Worker を破棄するときに使用します。 + + +* **`ever`** + + は _Rx_ 変数が新しい値になるたびに呼ばれます。 + +* **`everAll`** + + `ever` とほぼ同じですが、_Rx_ 変数の `List` を受け取ります。いずれかの値が更新されれば、その更新後の値を受け取ってコールバックが実行されます。 + +* **`once`** + +変数が最初に更新されたときのみに呼ばれます。 + +* **`debounce`** + +'debounce' は検索機能などで導入するととても有益です。たとえば、ユーザーがタイピングを止めたときにのみAPIを呼び出したいときに使います。ユーザーが "Jonny" と入れたときに 5回も APIに問い合わせを行うのは避けたいですよね。Getなら "debounce" があるので大丈夫です。 + +* **`interval`** + +`interval` は debounce とは異なります。ユーザーが1秒間に1000回変数に変更を加えた場合、debounceが一定期間経過後(デフォルトは800ミリ秒)に最後の変更イベントだけ送信するのに対して、intervalは代わりに一定期間の間のユーザーによるアクションをすべて無視します。intervalは1秒ごとにイベントを送信しており、3秒に設定した場合は1分間に20個のイベントを送信します。これはユーザーがキーやマウスを連打することで何かしらの報酬を得られる場合に、その悪用を避けるために使用できます(ユーザーが何かをクリックしてコインを獲得できるとします。たとえ何秒かかったとしても300回クリックすれば300枚のコインを得ることができてしまいます。intervalを使用してインターバルを3秒に設定した場合は、何回クリックしようが1分間で得られるコインの上限は20枚になります)。一方のdebounceはアンチDDosや、検索のように変更を加えるたびにonChangeからAPI問い合わせが発生するような機能に適しています。ユーザーが入力し終わるのを待ってリクエストを送信するのです。debounceを前述のコイン獲得のケースで使用した場合、ユーザーはコインを1枚しか獲得できません。これは指定した期間、ユーザーが動作を「一時停止」したときにのみ実行されるからです。 + +* 注: Workerを使用する場合は、Controllerなどを起動するときに次のいずれかの方法で登録する必要があります。onInit(推奨)内、クラスのコンストラクタ、またはStatefulWidgetのinitState内(この方法は推奨しませんが、副作用はないはずです)。 + +## 非リアクティブな状態管理 + +GetはChangeNotifierを使わない軽量かつシンプルな状態管理機能を有しています。特にFlutterに慣れていない方のニーズを満たし、大規模なアプリケーションでも問題を起こすことがないと信じています。 + +GetBuilderは複数の状態を扱う場面で使われることを想定して作られました。たとえばショッピングカートに30個の商品があるとします。そしてあなたが商品を一つ削除すると同時に、カートのリストが更新され、合計金額が更新され、アイテム数を示すバッジが更新されます。GetBuilderはこのようなユースケースに最適です。というのも、GetBuilderは状態をControllerで束ねてそのControllerに依存するすべてのWidgetを一度に更新させることができるからです。 + +それらとは独立したControllerが必要な場合は、GetBuilderのidプロパティに専用IDを割り当てるか、GetXを使ってください。ケースバイケースですが、そのような「独立した」Widetが多いほど GetX() のパフォーマンスが際立ち、複数の状態変化がありそれに伴うWidgetの更新が多いほど GetBuilder() のパフォーマンスが勝ることを覚えておいてください。 + +### 利点 + +1. 必要なWidgetのみ更新される。 + +2. ChangeNotifierを使わず、メモリ使用量が少ない。 + +3. StatefulWidgetのことはもう忘れましょう。Getでは必要ありません。他の状態管理ライブラリではStatefulWidgetを使用することがあるでしょう。しかしAppBarやScaffoldなどクラス内のほとんどのWidgetがStatelessであるにも関わらず、StatefulなWidgetの状態だけを保持する代わりに、クラス全体の状態を保持しているのはなぜでしょうか?Getならクラス全体をStatelessにすることができます。更新が必要なコンポーネントは GetBuilder などで囲むことで「状態」が保持されます。 + +4. プロジェクトを整理しましょう!ControllerはUIの中にあってはいけません。TextEditControllerなどの類はすべてControllerクラスに配置してしまいましょう。 + +5. Widgetのレンダリングが開始されると同時にイベントを実行してWidgetを更新させる必要がありますか?GetBuilderにはStatefulWidgetと同様の「initState」プロパティがあり、そこからControllerのイベントを直接呼び出すことができます。initStateを使用する必要はもうありません。 + +6. StreamやTimerのインスタンスを破棄したい場合はGetBuilderのdisposeプロパティを利用してください。Widgetが破棄されると同時にイベントを呼び出すことができます。 + +7. GetXとStreamController / StreamBuilderを組み合わせるなどしてStreamを普通に使っていただいても問題ありませんが、必要なときに限って使うことをおすすめします。Streamのメモリ消費は適度であり、リアクティブプログラミングは美しいですが、たとえば30ものStreamを同時に立ち上げることを考えてみてください。これはChangeNotifierを使うよりもよくないことのように思います。 + +8. 必要以上にRAMを使わずWidgetを更新します。GetはGetBuilderのクリエーターIDのみを保存し、必要に応じてGetBuilderを更新します。何千ものGetBuilderを作成したとしても、ID保存のためのメモリ消費量は非常に少ないです。GetBuilderを新規に作成するということは、実際にはクリエーターIDを持つ GetBuilder の状態を共有しているに過ぎないためです。GetBuilderごとに状態が新たに作成されるわけではないため、特に大規模なアプリケーションでは多くのRAMを節約できます。基本的にGetXで作成するアプリケーションは全体的にStatelessであり、いくつかのStatefulなWidget(GetBuilder内のWidget)は単一の状態を持っているため、一つを更新すればすべてが更新されます。 + +9. Getはアプリ全体の流れをよく把握しており、Controllerをメモリから破棄するタイミングを正確に知っています。実際の破棄はGetがやってくれるため、開発者が心配する必要はありません。 + +### 使用例 + +``` dart +// Controllerクラスを作成してGetxControllerを継承しましょう +class Controller extends GetxController { + int counter = 0; + void increment() { + counter++; + update(); + // increment 実行時にcounter変数に依存するUIを更新。 + // GetBuilderを使うWidgetの場合はupdate()が必要。 + } +} +// ビュー側のクラスでGetBuilderを使ってcounter変数を組み込む +GetBuilder( + init: Controller(), // 最初に使用するときのみ初期化 + builder: (_) => Text( + '${_.counter}', + ), +) +// Controllerの初期化は最初の1回だけ行ってください。同じControllerを再度 GetBuilder / GetX で使用する場合は初期化する必要はありません。コントローラは、それを「init」とマークしたウィジェットがデプロイされると同時に、自動的にメモリから削除されます。Getがすべて自動で行ってくれるので、何も心配することはありません。同じControllerを2つ立ち上げることがないよう、それだけご注意ください。 +``` + +**最後に** + +* 以上、Getを使った状態管理の手法をご説明させていただきました。 + +* 注: もっと柔軟に管理する手法として、initプロパティを使わない方法もあります。Bindingsを継承したクラスを作成し、dependenciesメソッドをoverrideしてその中でGet.put()でControllerを注入してください(複数可)。このクラスとUI側のクラスを紐づけることでControllerをそのRoute内で使用できます。そしてそのControllerを初めて使用するとき、Getはdependencies内を見て初期化を実行してくれます。このlazy(遅延、消極的)ロードを維持しつつ、不要になったControllerは破棄し続けます。具体的な仕組みについてはpub.devの例をご参照ください。 + +Routeを移動して以前使用したControllerのデータが必要になった場合は、再度GetBuilderを使用してください。initする必要はありません。 + +``` dart +class OtherClass extends StatelessWidget { + @override + Widget build(BuildContext context) { + return Scaffold( + body: Center( + child: GetBuilder( + builder: (s) => Text('${s.counter}'), + ), + ), + ); + } + +``` + +GetBuilderの外でControllerを使用する場合は、Controller内にgetterを作成しておくと便利です。Controller.to で呼び出しましょう。(もしくは `Get.find()` を使うのもありです) + +``` dart +class Controller extends GetxController { + + /// 記述量を省くためにstaticメソッドにすることをおすすめします。 + /// staticメソッド使う場合 → Controller.to.increment(); + /// 使わない場合 → Get.find().increment(); + /// どちらを使ってもパフォーマンスに影響があったり副作用が出たりはしません。前者は型の指定が不要という違いがあるだけです + static Controller get to => Get.find(); // これを追加 + + int counter = 0; + void increment() { + counter++; + update(); + } +} +``` + +これで以下のようにControllerに直接アクセスできます。 + +``` dart +FloatingActionButton( + onPressed: () { + Controller.to.increment(), + } // とっても簡単ですね! + child: Text("${Controller.to.counter}"), +), +``` + +FloatingActionButton を押すと counter変数 に依存するWidgetがすべて自動的に更新されます。 + +### Controllerインスタンスの扱い + +次のような画面の流れがあるとします。 + + `画面A => 画面B (Controller X を使用) => 画面C (Controller X を使用)` + +画面Aの段階ではまだ未使用なので、Controllerはメモリにありません(Getは基本lazyロードなので)。画面Bに遷移すると、Controllerがメモリ内に保存されます。画面Cでは画面Bと同じControllerを使用しているため、GetはBとCでControllerの状態を共有し、同じControllerがメモリ内に引き続きいることになります。画面Cを閉じてさらに画面Bを閉じ、画面Aに戻ったとしましょう。そこではControllerが使われていないため、GetはControllerをメモリから出してリソースを解放します。そこで再度画面Bに遷移すると、Controllerは再度メモリに保存されます。そして今度は画面Cに行かずに画面Aに戻ります。Getは同様にControllerをメモリから破棄してくれます。また、仮に画面CがControllerを使っておらず画面Cにいたとして、画面BをRouteスタックから削除したとしましょう。するとControllerを使用している画面(クラス)はなくなりますので、同様にメモリから破棄されます。Getが正常動作しないと考えられる唯一の例外は、画面Cにいるときに画面Bを誤ってRouteスタックから削除してしまい、Controllerの使用を試みたときです。この場合は、画面Bで作成されたControllerのクリエーターIDが削除されてしまったことが原因です(GetはクリエーターIDのないControllerはメモリから破棄するようプログラムされています)。もし意図があってこの事例に対応したい場合は、画面BのGetBuilderに "autoRemove: false" フラグを追加した上で、CクラスのGetBuilderに "adoptID: true" を追加してください。 + +### StatefulWidgetsはもういらない + +StatefulWidgetsを使用すると、画面全体の状態を不必要に保存することになります。ウィジェットを最小限に再構築する必要がある場合は、Consumer/Observer/BlocProvider/GetBuilder/GetX/Obxの中に埋め込むことになりますが、それは別のStatefulWidgetになります。 +StatefulWidgetはStatelessWidgetよりも多くのRAMが割り当てられます。これは1つや2つのStatefulWidgetでは大きな違いは産まないかもしれませんが、それが100もあった場合は確実に違いが出ます。 +TickerProviderStateMixinのようなMixinを使用する必要がない限り、GetでStatefulWidgetを使用する必要はありません。 + +たとえばinitState()やdispose()メソッドなど、StatefulWidgetのメソッドをGetBuilderから直接呼び出すことも可能です。 + +``` dart +GetBuilder( + initState: (_) => Controller.to.fetchApi(), + dispose: (_) => Controller.to.closeStreams(), + builder: (s) => Text('${s.username}'), +), +``` + +しかし、これよりもベターなアプローチはControllerの中で直接 onInit() や onClose() メソッドを呼び出すことです。 + +``` dart +@override +void onInit() { + fetchApi(); + super.onInit(); +} +``` + +* 注: コンストラクタを通じてControllerを立ち上げる必要はありません。このようなプラクティスは、パフォーマンス重視であるGetのControllerの作成や割り当ての原理、考え方から外れてしまいます(コンストラクタ経由でインスタンスを作成すれば、実際に使用される前の段階でControllerを生成し、メモリを割り当てることになります)。onInit() と onClose() メソッドはこのために作られたもので、Controllerのインスタンスが作成されたとき、または初めて使用されたときに呼び出されます(Get.lazyPutを使用しているか否か次第)。たとえば、データを取得するためにAPIを呼び出したい場合は initState/dispose の代わりに onInit() を使用し、Streamを閉じるなどのコマンドを実行する必要がある場合は onClose() を使用してください。 + +### Getの目的 + +このパッケージの目的は、Routeのナビゲーション、依存オブジェクトと状態の管理のための完全なソリューションを、開発者が外部パッケージに極力依存せずに済むような形で提供し、高度なコード分離性(デカップリング)を実現することです。それを確実なものとするため、Getはあらゆる高レベルおよび低レベルのFlutter APIを取り込んでいます。これによりビューとロジックを切り分けることが容易になり、UIチームにはWidgetの構築に集中してもらい、ビジネスロジック担当チームにはロジックに集中してもらうことができます。Getを使うことでよりクリーンな作業環境を構築することができるのです。 + +要するに、initState内でメソッドを呼び出してパラメーターを通じてControllerにデータを送信する必要も、そのためにControllerのコンストラクタを使用する必要もありません。Getには必要なタイミングでサービスを呼び出してくれう onInit() メソッドがあります。 +Controllerが不要になれば、onClose() メソッドがジャストなタイミングでメモリから破棄してくれます。これにより、ビューとビジネスロジックを分離することができるのです。 + +GetxController 内に dispose() メソッドがあっても何も起こらないので記述しないでください。ControllerはWidgetではないので「dispose」できません。たとえばController内でStreamを使用していてそれを閉じたい場合は、以下のように onClose() メソッドにコードを記述してください。 + +``` dart +class Controller extends GetxController { + StreamController user = StreamController(); + StreamController name = StreamController(); + + /// Streamを閉じる場合は dispose() ではなく onClose() + @override + void onClose() { + user.close(); + name.close(); + super.onClose(); + } +} +``` + +Controllerのライフサイクルについて。 + +* onInit() はControllerが作成されたタイミングで実行されます。 +* onClose() は onDelete() メソッドが実行される直前のタイミングで実行されます。 +* Controllerが削除されるとそのAPIにアクセスすることはできません。文字通りメモリからの削除だからです。削除のトレースログも残りません。 + +### Controllerの様々な使用方法 + +ControllerインスタンスはGetBuilderのvalueを通じて使用することができます。 + +``` dart +GetBuilder( + init: Controller(), + builder: (value) => Text( + '${value.counter}', // ここ + ), +), +``` + +GetBuilderの外でControllerインスタンスを使う場合は、このアプローチをおすすめします。 + +``` dart +class Controller extends GetxController { + static Controller get to => Get.find(); +[...] +} +// ビュー側で +GetBuilder( + init: Controller(), // 最初に使うときだけ必要 + builder: (_) => Text( + '${Controller.to.counter}', // ここ + ) +), +``` + +もしくは + +``` dart +class Controller extends GetxController { + // static get を省き、 +[...] +} +// ビュー側で +GetBuilder( + init: Controller(), // 最初に使うときだけ必要 + builder: (_) => Text( + '${Get.find().counter}', // ここ + ), +), +``` + +* get_it や modular など他の依存オブジェクト管理ライブラリを使用しているため、単にControllerのインスタンスを渡したいだけの場合は、このような「非正規」な方法もあります。 + +``` dart +Controller controller = Controller(); +[...] +GetBuilder( + init: controller, // ここ + builder: (_) => Text( + '${controller.counter}', // ここ + ), +), + +``` + +### ユニークIDの設定 + +GetBuilderを使ってWidgetの更新をコントロールしたい場合は、このようにユニークIDを振ってください。 + +``` dart +GetBuilder( + id: 'text' + init: Controller(), // 最初に使うときだけ必要 + builder: (_) => Text( + '${Get.find().counter}', // ここ + ), +), +``` + +そして以下のようにWidgetを更新します。 + +``` dart +update(['text']); +``` + +さらに更新に条件を設けることができます。 + +``` dart +update(['text'], counter < 10); +``` + +GetXはこの更新を自動で行ってくれます。指定したIDを持ち、その変数に依存するWidgetのみを更新します。また変数を前の値と同じ値に変更しても、それが状態の変化を意味しない場合はメモリとCPUサイクルを節約するためにWidgetを更新しません (画面に 3 が表示されているときに、変数を再び 3 に変更したとします。このような場合にWidgetを更新する状態管理ソリューションも存在しますが、GetXでは実際に状態が変更された場合にのみ更新されます)。 + +## 状態管理ソリューションを混在させる + +MixinBuilderはObxとGetBuilderを併用したいというリクエストから発想して作られました。これは ".obs" 変数の変更によるリアクティブな更新と、update() メソッドによるメカニカルな更新の両方を混在可能にします。ただし、GetBuiler / GetX / Obx / MixinBuilder の4つの中で最もリソースを消費するWidgetです。というのも、Widgetからのイベントを検知するためのSubscriptionに加えて、Controller自身のupdateメソッドも購読する必要があるからです。 + +MixinBuilderに使用するControllerクラスには、変数を `.obs`(Observable)とするかどうかに関わらず、GetxControllerを継承したものを使用してください。GetxControllerにはライフサイクルがあり、onInit() および onClose() メソッドでイベントを「開始」したり「終了」したりすることができます。 + +## StateMixin + +`StateMixin` を使うことでさらに `UI` の「状態」を便利に扱うことができます。 +`with` を使って `StateMixin` をControllerにミックスインしてください。Tにはモデルのクラス名が入ります。 + +``` dart +class Controller extends GetController with StateMixin{} +``` + +状態を変更するには `change()` メソッドを使ってください。 +パラメーターにはビューに渡すデータと「状態」をセットします。 + +```dart +change(data, status: RxStatus.success()); +``` + +RxStatus の「状態」は以下の4つです。 + +``` dart +RxStatus.loading(); // ロード中 +RxStatus.success(); // ロード成功 +RxStatus.empty(); // データが空 +RxStatus.error('message'); // エラー +``` + +それぞれの「状態」をUIで表すには以下のようにします。 + +```dart +class OtherClass extends GetView { + @override + Widget build(BuildContext context) { + return Scaffold( + + body: controller.obx( + (state)=>Text(state.name), + + // ここはカスタムのロードインジケーターでも可能ですが、 + // デフォルトは Center(child:CircularProgressIndicator()) + onLoading: CustomLoadingIndicator(), + onEmpty: Text('No data found'), + + // ここもカスタムのエラーWidgetでも構いませんが、 + // デフォルトは Center(child:Text(error)) + onError: (error)=>Text(error), + ), + ); +} +``` + +## GetBuilder VS GetX VS Obx VS MixinBuilder + +私は10年間プログラミングに携わってきて、いくつか貴重な教訓を得ることができました。 + +リアクティブプログラミングに初めて触れたとき、「おお、これはすごい」と感嘆せずにはいられませんでしたし、実際にすごいものでした。 +しかし、リアクティブプログラミングはすべての状況に適しているわけではありません。多くの場合、必要なのは2,3のWidgetの状態を同時に更新すること、またはローカルでの一時的な状態の変更であり、これらの場合はリアクティブである必要はありません。 + +リアクティブプログラミングのRAM消費量の多さは、必要なときだけ、かつ1つのWidgetだけ同時に更新するようすることである程度補うことができます。ただ、たとえば80ものオブジェクトを持つリストがあったとして、それぞれが複数のStreamを持つのは得策ではありません。Dartのインスペクターを開いて、StreamBuilderがどれだけRAMを消費しているか見てみてください。私が伝えたいことを理解してもらえると思います。 + +そのことを念頭に私はシンプルな状態管理ソリューションを作りました。このシンプルさに期待することは、リソース面で経済的である点、Widget単位ではなくブロック単位で状態を更新できる点であるべきです。 + +GetBuilderはRAM消費の面で最も経済的なソリューションだと信じています(もしあれば、ぜひ教えてください)。 + +しかし、GetBuilderは依然として update() により更新がかかるスタイルのメカニカルな状態管理ソリューションであり、notifyListeners() と呼び出し回数は変わりありません。 + +一方で、ここでリアクティブプログラミングを使わないのは車輪の再発明なんじゃないかと思えるような状況もあります。この点を考慮して、GetX() は先進的な状態管理の手法を提供するために作られました。必要なものを必要なときだけ更新し、エラーが発生してユーザーが300ものイベントを同時に送信したとしても、GetX() は状態の変化をフィルタリングして画面を更新してくれます。 + +GetX() は他のリアクティブな状態管理ソリューションに比べて経済的であることに変わりはありませんが、GetBuilder() よりは少しだけ多くのRAMを消費します。その点を考慮し、リソース消費を最大限活かすことを目指して Obx() は開発されました。GetX() や GetBuilder() と異なり、Obx() の中でControllerを初期化することはできません。Obx() は、子Widgetからの更新イベントを受け取る Stream購読Widgetでしかありません。GetX() よりは経済的ですが、GetBuilder() には負けます。GetBuilder() はWidgetのハッシュ値と状態のsetterを保持しているだけなので、これはある意味当然です。Obx() はControllerの型を指定する必要がなく、複数の異なるコントローラからの変更を聞くことができます。ただし、Obx() の外かBindingsで事前にControllerを初期化しておく必要があります。 diff --git a/siro_rider/packages/get/documentation/kr_KO/dependency_management.md b/siro_rider/packages/get/documentation/kr_KO/dependency_management.md new file mode 100644 index 0000000..d901080 --- /dev/null +++ b/siro_rider/packages/get/documentation/kr_KO/dependency_management.md @@ -0,0 +1,378 @@ +# 종속성 관리 +- [종속성 관리](#종속성-관리) + - [인스턴스 메서드](#인스턴스-메서드) + - [Get.put()](#getput) + - [Get.lazyPut](#getlazyput) + - [Get.putAsync](#getputasync) + - [Get.create](#getcreate) + - [인스턴스화 된 메서드/클래스 사용](#인스턴스화-된-메서드/클래스-사용) + - [메서드간의 차이점](#메서드간의-차이점) + - [바인딩](#바인딩) + - [사용 방법](#사용-방법) + - [BindingsBuilder](#bindingsbuilder) + - [SmartManagement](#smartmanagement) + - [변경하는 방법](#변경하는-방법) + - [SmartManagement.full](#smartmanagementfull) + - [SmartManagement.onlyBuilders](#smartmanagementonlybuilders) + - [SmartManagement.keepFactory](#smartmanagementkeepfactory) + - [바인딩이 작동하는 자세한 설명](#바인딩이-작동하는-자세한-설명) + - [주석](#주석) + +Get은 Provider context, inheritedWidget 없이 단 1줄의 코드로 Bloc 나 Controller 같은 클래스를 찾을수 있는 간단하고 강력한 종속성 관리자가 있습니다. + +```dart +Controller controller = Get.put(Controller()); // Controller controller = Controller(); 대체 +``` + +사용중인 클래스 내에서 클래스를 인스턴스화하는 대신 Get 인스턴스 내에서 인스턴스화하여 앱 전체에서 사용할 수 있습니다. +그러고나면 컨트롤러 (또는 Bloc 클래스)를 정상적으로 사용할 수 있습니다. + +- 주석: Get의 상태 관리자를 사용하는 경우 [바인딩](#바인딩) api에 더 많은 주의를 기울여야합니다. 그러면 뷰를 컨트롤러에 더 쉽게 연결할 수 있습니다. +- 주석²: Get의 종속성 관리는 패키지의 다른 부분에서 분리되므로 예를 들어 앱이 이미 상태 관리자를 사용하고있는 경우라도(하나라도 상관 없음) 변경할 필요가 없습니다. 아무 문제 없이 종속성 주입 관리자를 사용할 수 있습니다. + +## 인스턴스 메서드 +메서드와 구성 파라미터는 다음과 같습니다: + +### Get.put() + +종속성 인스턴스화의 가장 흔한 방법 입니다. 예를 들어 뷰의 controller들에 좋습니다. + +```dart +Get.put(SomeClass()); +Get.put(LoginController(), permanent: true); +Get.put(ListItemController, tag: "some unique string"); +``` + +put 사용시 설정 가능한 모든 사항: +```dart +Get.put( + // 필수: cotroller나 어떤것이든 get에 저장하려는 클래스 + // 주석: "S"는 모든 유형의 클래스가 가능합니다. + S dependency + + // 선택: 동일한 유형의 여러 클래스를 사용하기를 원하면 + // 일반적으로 Get.find() 로 클래스를 가져오므로 + // 어떤 인스턴스인지 구분을 위해 tag를 사용해야합니다. + // 고유한 string 이여야 합니다. + String tag, + + // 선택: 기본적으로 get은 더이상 사용하지 않는 인스턴스는 dispose 합니다. by default, get will dispose instances after they are not used anymore (example, + // (예를 들어 뷰의 controller가 닫힌 경우) 하지만 sharedPreferences와 같은 인스턴스는 앱 전체에서 유지되어야 할 필요가 있습니다. + // 이런 경우 사용합니다. + // 기본값은 false + bool permanent = false, + + // 선택: 테스트에서 추상 클래스를 사용한 후에 다른 클래스로 교체하고 테스트를 수행합니다. + // 기본값은 false + bool overrideAbstract = false, + + // 선택: 자체 종속성 대신에 함수로 종속성을 생성합니다. + // 이것은 일반적으로 사용되지 않습니다. + InstanceBuilderCallback builder, +) +``` + +### Get.lazyPut +인스턴스하게 사용하는 경우에만 의존성을 lazyLoad 할 수 있습니다. 계산 비용이 많이 드는 클래스나 한곳에서 다양한 클래스를 당장 사용하지 않으면서 인스턴스화 하기를 원한다면(Bindings 클래스처럼) 매우 유용합니다. + +```dart +/// ApiMock은 처음으로 Get.find을 사용하는 경우에만 호출됩니다. +Get.lazyPut(() => ApiMock()); + +Get.lazyPut( + () { + // 어떤 로직이 필요하다면 ... + return FirebaseAuth(); + }, + tag: Math.random().toString(), + fenix: true +) + +Get.lazyPut( () => Controller() ) +``` + +lazyPut을 사용시 설정 가능한 모든 사항: +```dart +Get.lazyPut( + // 필수: 이 메서드는 처음으로 클래스가 호출할 때 실행될 것입니다 + InstanceBuilderCallback builder, + + // 선택: Get.put()과 같이 같은 클래스를 다중으로 인스턴스할 경우 사용합니다. + // 고유값이어야 합니다. + String tag, + + // 선택: "permanent"와 유사합니다. 차이점은 인스턴스가 사용되지 않으면 폐기되지만 + // 다시 사용할 때 Get이 바인딩 api의 "SmartManagement.keepFactory"와 동일하게 인스턴스를 재생성한다는 것입니다. + // 기본값은 false + bool fenix = false + +) +``` + +### Get.putAsync +만약 비동기로 인스턴스를 등록하길 원하면 `Get.putAsync`를 사용할 수 있습니다.: + +```dart +Get.putAsync(() async { + final prefs = await SharedPreferences.getInstance(); + await prefs.setInt('counter', 12345); + return prefs; +}); + +Get.putAsync( () async => await YourAsyncClass() ) +``` + +putAsync 사용시 설정 가능한 모든 사항: +```dart +Get.putAsync( + + // 필수: 클래스를 인스턴스화 하기 위해 실행되는 비동기 메서드입니다. + AsyncInstanceBuilderCallback builder, + + // 선택: Get.put()과 같이 같은 클래스를 다중으로 인스턴스할 경우 사용합니다. + // 고유값이어야 합니다. + String tag, + + // 선택: Get.put()과 같이 앱 유지중에 인스턴스가 활성되어야 하는 경우 사용합니다. + // 기본값은 false + bool permanent = false +) +``` + +### Get.create + +이것은 까다롭습니다. 이것이 무엇인지 상세한 설명과 다른것과의 차이점에 대해서는 [메서드간의 차이점:](#메서드간의-차이점) 섹션에서 확인할 수 있습니다. + +```dart +Get.Create(() => SomeClass()); +Get.Create(() => LoginController()); +``` + +create 사용시 설정 가능한 모든 사항: + +```dart +Get.create( + // 필수: `Get.find()`가 호출 될 때마다 만들어진 클래스를 반환하는 메서드입니다. + // 예시: Get.create(() => YourClass()) + FcBuilderFunc builder, + + // 선택: Get.put()과 거의 동일하지만 동일 클래스의 여러 인스턴스가 필요할 때 사용합니다. + // 개개의 리스트별로 controller가 필요한 경우 유용합니다. + // 고유값이어야 합니다. 단지 tag에서 name으로 변경되었습니다. + String name, + + // 선택: Get.put()과 같이 앱 유지중에 인스턴스가 활성되어야 하는 경우 사용합니다. + // Get.create에서 다른점은 + // permanent의 기본값이 true 입니다. + bool permanent = true +``` + +## 인스턴스화 된 메서드/클래스 사용 + +여러 경로를 탐색했고 controller에 남겨진 데이터가 필요하다고 상상해보세요. Provider 또는 Get_it과 결합된 상태 관리자가 필요합니다. 맞습니까? Get은 아닙니다. +어떤 종속적인 추가가 필요 없고 단지 Get에게 controller를 "find"하라고 하면 됩니다: + +```dart +final controller = Get.find(); +// OR +Controller controller = Get.find(); + +// 그렇습니다. 마법 같아요. Get은 controller를 찾고 배달해 줍니다. +// Get은 백만개의 contrller를 인스턴스화해서 가질수 있고 항상 올바르게 전달해 줍니다. +``` + +그리고 나서 얻어낸 controller에서 데이터를 가져올 수 있습니다: + +```dart +Text(controller.textFromApi); +``` + +반환된 값은 일반 클래스라서 무엇이든 할 수 있습니다: + +```dart +int count = Get.find().getInt('counter'); +print(count); // out: 12345 +``` + +Get의 인스턴스에서 삭제합니다: + +```dart +Get.delete(); // 보통 GetX는 미사용 controller를 삭제하기 때문에 수행할 필요가 없습니다 +``` + +## 메서드간의 차이점 + +첫째, Get.lazyPut의 `fenix`와 다른 메서드들의 `permanent`을 살펴보겠습니다. + +`permanent`와 `fenix` 사이의 근본적인 차이점은 인스턴스를 저장하는 방법입니다. + +추가 내용: 기본적으로 GetX는 사용하지 않을때 인스턴스를 삭제합니다. +이것은 다음을 의미합니다: 만약 화면 1이 컨트롤러 1을 가지고 있고 화면 2가 컨트롤러 2를 가졌을때 스택에서 첫번째 경로가 제거되면(`Get.off()`나 `Get.offNamed()`를 사용했을 때처럼) 컨트롤러 1은 더이상 사용되지 않기 때문에 지워질 것입니다. + +하지만 `permanent:true`를 설정하면 컨트롤러가 화면이 바뀌는동안 사라지지 않을 것입니다. 즉, 전체 어플리케이션이 실행되는 동안에 계속 유지하려고 하는 서비스에 매우 유용합니다. + +반면 `fenix`는 화면이 바뀌는동안 컨트롤러가 사라지는 것은 상관없지만, 컨트롤러가 필요한 시점에 살아있어야 하는 서비스를 위해 존재합니다. 그래서 기본적으로는 사용하지 않는 컨트롤러/서비스/클래스를 폐기하지만, 필요한 경우 새 인스턴스를 "남아있는 흔적으로부터 다시 생성"합니다. + +메서드간 차이점에 대해: + +- Get.put과 Get.putAsync는 동일한 생성 명령을 따르지만 두번째가 비동기 메서드를 사용하는 것이 차이점입니다: 두 메서드는 인스턴스를 생성하고 초기화 합니다. 이것은 `permanent: false`와 `isSingleton: true` 파라미터들과 내부 `insert` 메서드를 사용하여 메모리에 직접 추가됩니다.(여기의 isSingleton 파라미터의 목적은 `dependency`에 의한 종속성을 사용할 것인지 `FcBuilderFunc`에 의한 종속성을 사용할 것인지 알려주는 것입니다.) 이후에 `Get.find()`는 즉시 초기화한 메모리안의 인스턴스를 호출합니다. + +- Get.create: 이름 그대로 종속성을 "생성"합니다! `Get.put()`과 마찬가지로 내부 메서드 `insert`를 호출하여 인스턴스화 합니다. 그러나 `permanent`가 true가 되고 `isSingleton`이 false가 됩니다(종속성을 "생성중"인 상태라 싱글톤 인스턴스가 될 방법이 없어서 false 입니다.) 그리고 `permanent: true`이기 때문에 기본적으로 화면 전환간에 손실되지 않는 장점이 있습니다! 또한 `Get.find()`는 즉시 호출되지 않으며 호출될 화면에서 사용되기를 기다립니다. `permanent` 파라미터를 사용하기 위한 방법으로 만들어졌습니다. 다음의 가치를 가지고 있습니다. 생성을 위한 목적으로 `Get.create()`는 공유되는 인스턴스가 아니지만 폐기되지 않습니다. 예를들어 리스트뷰 안의 버튼은 리스트를 위한 고유한 인스턴스입니다. - 이때문에 Get.create는 GetWidget과 함께 사용되어야만 합니다. + +- Get.lazyPut: 이름 그대로 lazy 처리됩니다. 인스턴스가 만들어지나 즉시 사용되도록 호출되지 않고 호출되기를 기다립니다. 다른 메서드와 다르게 `insert`가 여기에서 호출되지 않습니다. 대신 인스턴스는 메모리의 다른 부분에 추가됩니다. 인스턴스가 재생성 가능한지 아닌지를 책임지는 부분으로 "factory"라고 부릅니다. 나중에 사용할 어떤 것을 생성하기 원한다면 지금 사용했던 것과 섞이지 않아야 할 것입니다. 그리고 여기에서 `fenix` 마법이 시작됩니다: `fenix: false`를 그대로두고 `smartManagement`는 `keepFactory`가 아니면 `Get.find`를 사용할 때 인스턴스는 "factory"에서 공통 인스턴스 메모리 영역으로 위치가 변경됩니다. 바로 그뒤에 기본적으로 "factory"에서 제거됩니다. 이제 `fenix: true`로 설정하면 인스턴스는 전용부분에서 계속 존재하며 공통 영역으로 이동하여 미래에 다시 호출됩니다. + +## 바인딩 + +이 패키지의 가장 큰 특이한점 중 하나는 아마도 라우트, 상태 관리자, 종속성 관리자의 완전한 통합의 가능성 일 것입니다. +스택에서 라우트가 삭제되면 모든 컨트롤러, 변수 및 관련된 인스턴스 오브젝트가 메모리에서 제거됩니다. 스트림이나 타이머를 사용중이면 자동적으로 종료되고 이것에 대한 어떤 걱정도 할 필요가 없습니다. +Get의 2.10 버전에는 Bindings API를 완전히 구현했습니다. +이제 init 메서드는 더 이상 사용할 필요가 없습니다. 원하지 않으며 컨트롤러 타입도 필요 없습니다. 컨트롤러와 서비스를 위한 적절한 위치에서 시작할 수 있습니다. +바인딩 클래스는 상태 관리자와 종속성 관리자에 라우트를 "결합"하는 동시에 종속성 주입을 분리하는 클래스입니다. +이를 통해 Get은 특정 컨트롤러가 사용될때 표시되는 스크린을 알고 어디서 어떻게 이것이 제거 되는지 알수 있습니다. +추가로 Binding 클래스로 SmartManager 구성을 제어 할 수 있습니다. 스택에서 경로를 제거하거나 경로를 사용한 위젯이 배치되거나 둘 다 배치되지 않을 때 정렬되도록 종속성을 설정 할 수 있습니다. 지능적으로 종속성 관리가 동작하지만 원하는대로 구성 할 수 있습니다. + +### 사용 방법 + +- class를 생성하고 Binding을 implement 합니다. + +```dart +class HomeBinding implements Bindings {} +``` + +IDE가 자동적으로 "종속적인" 메서드를 오버라이딩할지 요청하며 램프를 클릭하기만 하면 됩니다. 그리고 메서드를 오버라이딩하고 해당 경로에 사용할 모든 클래스들을 추가하면 됩니다: + +```dart +class HomeBinding implements Bindings { + @override + void dependencies() { + Get.lazyPut(() => HomeController()); + Get.put(()=> Api()); + } +} + +class DetailsBinding implements Bindings { + @override + void dependencies() { + Get.lazyPut(() => DetailsController()); + } +} +``` + +이제 라우트에 라우트, 종속성, 상태 관리자 사이를 연결하는데 해당 바인딩을 사용할 것이라고 알리기만 하면 됩니다. + +- 명명된 라우트 사용법: + +```dart +getPages: [ + GetPage( + name: '/', + page: () => HomeView(), + binding: HomeBinding(), + ), + GetPage( + name: '/details', + page: () => DetailsView(), + binding: DetailsBinding(), + ), +]; +``` + +- 일반 라우트 사용법: + +```dart +Get.to(Home(), binding: HomeBinding()); +Get.to(DetailsView(), binding: DetailsBinding()) +``` + +이제 어플리케이션의 어디서도 메모리 관리에 대해서 걱정하지 않아도 됩니다. Get이 그것을 처리 할 것입니다. + +Binding 클래스는 라우트가 호출될 때 불려집니다. GetMaterialApp의 "initialBinding"에서 모든 종속성을 추가하여 생성할 수 있습니다. + +```dart +GetMaterialApp( + initialBinding: SampleBind(), + home: Home(), +); +``` + +### BindingsBuilder + +바인딩을 생성하는 기본 방법은 바인딩을 구현한 클래스를 만드는 것 입니다. +하지만 대안으로 `BindingsBuilder` 콜백을 사용하여 간단하게 원하는 것을 인스턴스화하는 함수를 사용할 수 있습니다. + +예시: + +```dart +getPages: [ + GetPage( + name: '/', + page: () => HomeView(), + binding: BindingsBuilder(() { + Get.lazyPut(() => ControllerX()); + Get.put(()=> Api()); + }), + ), + GetPage( + name: '/details', + page: () => DetailsView(), + binding: BindingsBuilder(() { + Get.lazyPut(() => DetailsController()); + }), + ), +]; +``` + +이 방법은 각 라우트에 대해 한개의 바인딩 클래스 만드는 것을 피할수 있어서 더 간단하게 할 수 있습니다. + +두 방법 모두 완벽하게 작동하며 취향에 맞춰서 사용하시면 됩니다. + +### SmartManagement + +GetX는 기본적으로 메모리에서 사용되지 않는 컨트롤러들을 제거합니다. 문제가 생기거나 적절히 사용하지 않는 위젯도 마찬가지 입니다. +이것이 종속성 관리의 `full`모드 입니다. +하지만 GetX 클래스의 제거를 제어하는 방식을 변경하기 원한다면 `SmartManagement` 클래스로 다른 행동을 설정할 수 있습니다. + +#### 변경하는 방법 + +구성을 변경(보통은 필요 없습니다)하려면 이렇게 하세요: + +```dart +void main () { + runApp( + GetMaterialApp( + smartManagement: SmartManagement.onlyBuilders // 이곳 + home: Home(), + ) + ) +} +``` + +#### SmartManagement.full + +이것이 기본입니다. permanent가 설정되지 않으면 사용되지 않는 클래스를 제거합니다. 대부분의 경우 이 구성을 변경하지 않고 유지하십시오. GetX가 처음이라면 바꾸지 마십시오. + +#### SmartManagement.onlyBuilders +이 옵션은 오직 컨트롤러가 `init:`에서 시작되었거나 `Get.lazyPut()`으로 바인딩되어 로드되면 제거됩니다. + +`Get.put()`이나 `Get.putAsync()` 또는 다른 접근을 를 사용하면 SmartManagement는 종속성 제거를 위한 권한을 가지지 못합니다. + +기본 동작은 SmartManagement.onlyBuilders와 다르게 "Get.put"으로 인스턴스화된 위젯들도 삭제됩니다. + +#### SmartManagement.keepFactory + +SmartManagement.full과 같이 더이상 사용되지 않으면 종속성이 제거됩니다. 하지만 factory가 유지되어 다시 인스턴스가 필요하면 종속성이 재생성됩니다. + +### 바인딩이 작동하는 자세한 설명 +바인딩은 다른 화면으로 이동하려고 클릭하는 순간에 임시 factory를 생성합니다. 그리고 화면 전환 애니메이션이 발생하는 즉시 제거됩니다. +이 행위는 매우 빨라 분석기에 등록도 되지 않습니다. +다시 화면으로 이동하면 새로운 임시 factory를 호출하므로 SmartManagement.keepFactory 사용을 선택할 수도 있습니다. 그러나 바인딩을 생성하지 않거나 동일한 바인딩에 대해 모든 종속성을 유지하고 싶다면 도움이 됩니다. +Factory는 적은 메모리만 사용하고 인스턴스를 가지지 않지만 원하는 클래스의 "형태"를 가진 함수를 가집니다. +메모리에서 매우 적은 비용을 가지지만 이 라이브러리의 목적이 최소 리소스를 사용하여 가능한 최대 성능을 가지는 것이라 GetX는 기본적으로 factory를 제거합니다. +가장 편한방법을 취하십시오. + +## 주석 + +- 다중 바인딩을 사용한다면 SmartManagement.keepFactory를 사용하지 마세요. 바인딩을 사용하지 않거나 GetMaterialApp의 initialBinding에 연결한 1개의 바인딩만 설계하세요. + +- 바인딩의 사용은 완전히 선택사항입니다. 클래스에서 `Get.put()`과 `Get.find()`를 사용하면 아무 문제없이 컨트롤러가 주어집니다. +그러나 서비스나 다른 추상적인 동작을 원하면 더 나은 구성의 바인딩을 추천합니다. diff --git a/siro_rider/packages/get/documentation/kr_KO/route_management.md b/siro_rider/packages/get/documentation/kr_KO/route_management.md new file mode 100644 index 0000000..1004b8d --- /dev/null +++ b/siro_rider/packages/get/documentation/kr_KO/route_management.md @@ -0,0 +1,564 @@ +- [라우트 관리](#라우트-관리) + - [사용하는 방법](#사용하는-방법) + - [이름없는 라우트 탐색](#이름없는-라우트-탐색) + - [이름있는 라우트 탐색](#이름있는-라우트-탐색) + - [이름있는 라우트에 데이터 보내기](#이름있는-라우트에-데이터-보내기) + - [동적 url 링크](#동적-url-링크) + - [미들웨어](#미들웨어) + - [context 없이 탐색](#context-없이-탐색) + - [SnackBars](#snackbars) + - [Dialogs](#dialogs) + - [BottomSheets](#bottomsheets) + - [중첩된 탐색](#중첩된-탐색) + +# 라우트 관리 + +라우트 관리가 문제 있는 경우 GetX가 모든 것을 완벽히 설명해줍니다. + +## 사용하는 방법 + +pubspec.yaml 파일에 추가: + +```yaml +dependencies: + get: +``` + +context 없이 routes/snackbars/dialogs/bottomsheets을 사용하거나 고급 GetX API를 사용하려면 MaterialApp 앞에 "Get"만 추가하여 GetMaterialApp으로 바꿔서 이용하세요! + +```dart +GetMaterialApp( // 이전: MaterialApp( + home: MyHome(), +) +``` + +## 이름없는 라우트 탐색 + +새 화면으로 이동: + +```dart +Get.to(NextScreen()); +``` + +snackbars, dialogs, bottomsheets 또는 Navigator.pop(context);로 보통 닫았던 것들을 닫기 + +```dart +Get.back(); +``` + +다음 화면으로 이동하고 이전 화면에서 돌아오지 않는 경우 (스플래시나 로그인 화면 등을 사용하는 경우) + +```dart +Get.off(NextScreen()); +``` + +다음 화면으로 이동하고 이전 화면이 모두 닫히는 경우 (장바구니, 투표, 테스트에 유용함) + +```dart +Get.offAll(NextScreen()); +``` + +다음 화면으로 이동하고 돌아올때 바로 데이터를 받거나 업데이트할 경우: + +```dart +var data = await Get.to(Payment()); +``` + +다른 화면에서 이전화면으로 데이터를 전달할때: + +```dart +Get.back(result: 'success'); +``` + +그리고 사용방법: + +예시: + +```dart +if(data == 'success') madeAnything(); +``` + +우리의 문법을 배우고 싶지 않습니까? +Navigator를 navigator로 바꾸시면 됩니다. 그리고 context를 사용하지 않아도 표준 navigator의 모든 기능이 가능합니다. +예시: + +```dart + +// 기본 Flutter navigator +Navigator.of(context).push( + context, + MaterialPageRoute( + builder: (BuildContext context) { + return HomePage(); + }, + ), +); + +// GetX는 context 필요 없이 Flutter 문법을 사용 +navigator.push( + MaterialPageRoute( + builder: (_) { + return HomePage(); + }, + ), +); + +// GetX 문법 (이것은 동의하지 않겠지만 더 좋습니다) +Get.to(HomePage()); + + +``` + +## 이름있는 라우트 탐색 + +- namedRoutes로 탐색하기를 선호하면 GetX도 지원합니다. + +nextScreen으로 이동 + +```dart +Get.toNamed("/NextScreen"); +``` + +다음으로 이동하고 트리에서 이전 화면을 지웁니다. + +```dart +Get.offNamed("/NextScreen"); +``` + +다음으로 이동하고 트리에서 이전 화면 전체를 지웁니다. + +```dart +Get.offAllNamed("/NextScreen"); +``` + +GetMaterialApp를 사용하여 라우트들을 정의: + +```dart +void main() { + runApp( + GetMaterialApp( + initialRoute: '/', + getPages: [ + GetPage(name: '/', page: () => MyHomePage()), + GetPage(name: '/second', page: () => Second()), + GetPage( + name: '/third', + page: () => Third(), + transition: Transition.zoom + ), + ], + ) + ); +} +``` + +정의 안된 라우트로 이동시 제어 (404 에러), GetMaterialApp에 unknownRoute를 정의할 수 있습니다. + +```dart +void main() { + runApp( + GetMaterialApp( + unknownRoute: GetPage(name: '/notfound', page: () => UnknownRoutePage()), + initialRoute: '/', + getPages: [ + GetPage(name: '/', page: () => MyHomePage()), + GetPage(name: '/second', page: () => Second()), + ], + ) + ); +} +``` + +### 이름있는 라우트에 데이터 보내기 + +무엇이든 인수를 통해 전달합니다. GetX는 String, Map, List, 클래스 인스턴스등 모든 것을 허용합니다. + +```dart +Get.toNamed("/NextScreen", arguments: 'Get is the best'); +``` + +클래스 또는 컨트롤러에서: + +```dart +print(Get.arguments); +// 출력: Get is the best +``` + +### 동적 url 링크 + +GetX는 웹과 같이 향상된 동적 url을 제공합니다. 웹 개발자들은 아마 Flutter에서 이미 이 기능을 원하고 있을 것 입니다. 대부분의 경우 패키지가 이 기능을 약속하고 URL이 웹에서 제공하는 것과 완전히 다른 구문을 제공하는 것을 보았을 것입니다. 하지만 GetX는 이 기능을 해결합니다. + +```dart +Get.offAllNamed("/NextScreen?device=phone&id=354&name=Enzo"); +``` + +controller/bloc/stateful/stateless 클래스에서: + +```dart +print(Get.parameters['id']); +// 출력: 354 +print(Get.parameters['name']); +// 출력: Enzo +``` + +GetX는 쉽게 NamedParameters 전달을 할 수 있습니다: + +```dart +void main() { + runApp( + GetMaterialApp( + initialRoute: '/', + getPages: [ + GetPage( + name: '/', + page: () => MyHomePage(), + ), + GetPage( + name: '/profile/', + page: () => MyProfile(), + ), + //You can define a different page for routes with arguments, and another without arguments, but for that you must use the slash '/' on the route that will not receive arguments as above. + GetPage( + name: '/profile/:user', + page: () => UserProfile(), + ), + GetPage( + name: '/third', + page: () => Third(), + transition: Transition.cupertino + ), + ], + ) + ); +} +``` + +경로 명으로 데이터 보냄 + +```dart +Get.toNamed("/profile/34954"); +``` + +다음 화면에서 파라미터로 데이터를 가져옴 + +```dart +print(Get.parameters['user']); +// 출력: 34954 +``` + + +또는 이와 같은 여러 매개 변수를 보냅니다. + +```dart +Get.toNamed("/profile/34954?flag=true"); +``` + +두 번째 화면에서 일반적으로 매개 변수별로 데이터를 가져옵니다. + +```dart +print(Get.parameters['user']); +print(Get.parameters['flag']); +// 출력: 34954 true +``` + + + +이제 Get.toNamed()를 사용하여 어떤 context도 없이 명명된 라우트를 탐색하고 (BLoC 또는 Controller 클래스로 부터 직접 라우트를 호출할 수 있음) 앱이 웹으로 컴파일되면 경로는 url에 표시됩니다. <3 + +### 미들웨어 + +만약 GetX 이벤트를 받아서 행동을 트리거 하려면 routingCallback을 사용하면 가능합니다. + +```dart +GetMaterialApp( + routingCallback: (routing) { + if(routing.current == '/second'){ + openAds(); + } + } +) +``` + +GetMaterialApp을 사용하지 않는다면 수동 API를 사용해서 Middleware observer를 추가할 수 있습니다. + +```dart +void main() { + runApp( + MaterialApp( + onGenerateRoute: Router.generateRoute, + initialRoute: "/", + navigatorKey: Get.key, + navigatorObservers: [ + GetObserver(MiddleWare.observer), // 여기 !!! + ], + ), + ); +} +``` + +MiddleWare class 생성 + +```dart +class MiddleWare { + static observer(Routing routing) { + /// 각 화면의 routes, snackbars, dialogs와 bottomsheets에서 추가하여 받을 수 있습니다. + /// If you need to enter any of these 3 events directly here, + /// you must specify that the event is != Than you are trying to do. + if (routing.current == '/second' && !routing.isSnackbar) { + Get.snackbar("Hi", "You are on second route"); + } else if (routing.current == '/third'){ + print('last route called'); + } + } +} +``` + +이제, 코드에서 Get을 사용하세요: + +```dart +class First extends StatelessWidget { + @override + Widget build(BuildContext context) { + return Scaffold( + appBar: AppBar( + leading: IconButton( + icon: Icon(Icons.add), + onPressed: () { + Get.snackbar("hi", "i am a modern snackbar"); + }, + ), + title: Text('First Route'), + ), + body: Center( + child: ElevatedButton( + child: Text('Open route'), + onPressed: () { + Get.toNamed("/second"); + }, + ), + ), + ); + } +} + +class Second extends StatelessWidget { + @override + Widget build(BuildContext context) { + return Scaffold( + appBar: AppBar( + leading: IconButton( + icon: Icon(Icons.add), + onPressed: () { + Get.snackbar("hi", "i am a modern snackbar"); + }, + ), + title: Text('second Route'), + ), + body: Center( + child: ElevatedButton( + child: Text('Open route'), + onPressed: () { + Get.toNamed("/third"); + }, + ), + ), + ); + } +} + +class Third extends StatelessWidget { + @override + Widget build(BuildContext context) { + return Scaffold( + appBar: AppBar( + title: Text("Third Route"), + ), + body: Center( + child: ElevatedButton( + onPressed: () { + Get.back(); + }, + child: Text('Go back!'), + ), + ), + ); + } +} +``` + +## context 없이 탐색 + +### SnackBars + +Flutter로 간단한 SnackBar를 사용하려면 Scaffold의 context가 반드시 주어지거나 Scaffold에 GlobalKey를 추가해서 사용해야만 합니다. + +```dart +final snackBar = SnackBar( + content: Text('Hi!'), + action: SnackBarAction( + label: 'I am a old and ugly snackbar :(', + onPressed: (){} + ), +); +// 위젯 트리에서 Scaffold를 찾아서 사용하면 +// SnackBar가 보여집니다. +Scaffold.of(context).showSnackBar(snackBar); +``` + +Get을 사용할때: + +```dart +Get.snackbar('Hi', 'i am a modern snackbar'); +``` + +Get을 사용하면 코드의 어디에서든지 Get.snackbar를 호출하거나 원하는데로 수정하기만 하면 됩니다! + +```dart +Get.snackbar( + "Hey i'm a Get SnackBar!", // title + "It's unbelievable! I'm using SnackBar without context, without boilerplate, without Scaffold, it is something truly amazing!", // message + icon: Icon(Icons.alarm), + shouldIconPulse: true, + onTap:(){}, + barBlur: 20, + isDismissible: true, + duration: Duration(seconds: 3), +); + + + ////////// ALL FEATURES ////////// + // Color colorText, + // Duration duration, + // SnackPosition snackPosition, + // Widget titleText, + // Widget messageText, + // bool instantInit, + // Widget icon, + // bool shouldIconPulse, + // double maxWidth, + // EdgeInsets margin, + // EdgeInsets padding, + // double borderRadius, + // Color borderColor, + // double borderWidth, + // Color backgroundColor, + // Color leftBarIndicatorColor, + // List boxShadows, + // Gradient backgroundGradient, + // TextButton mainButton, + // OnTap onTap, + // bool isDismissible, + // bool showProgressIndicator, + // AnimationController progressIndicatorController, + // Color progressIndicatorBackgroundColor, + // Animation progressIndicatorValueColor, + // SnackStyle snackStyle, + // Curve forwardAnimationCurve, + // Curve reverseAnimationCurve, + // Duration animationDuration, + // double barBlur, + // double overlayBlur, + // Color overlayColor, + // Form userInputForm + /////////////////////////////////// +``` + +기존 스낵바를 선호하거나 한 줄만 추가하는 것을 포함하여 처음부터 커스텀하려는 경우(Get.snackbar는 필수로 제목과 메시지를 사용함) 다음을 사용할 수 있습니다. +Get.snackbar가 빌드된 RAW API를 제공하는`Get.rawSnackbar ();`. + +### Dialogs + +dialog 열기: + +```dart +Get.dialog(YourDialogWidget()); +``` + +default dialog 열기: + +```dart +Get.defaultDialog( + onConfirm: () => print("Ok"), + middleText: "Dialog made in 3 lines of code" +); +``` + +showGeneralDialog 대신에 Get.generalDialog를 사용할 수 있습니다. + +cupertinos를 포함한 다른 모든 Flutter 대화 상자 위젯의 경우 context 대신 Get.overlayContext를 사용하고 코드의 어느 곳에서나 열 수 있습니다. +오버레이를 사용하지 않는 위젯의 경우 Get.context를 사용할 수 있습니다. +이 두 context는 탐색 context 없이 inheritedWidget이 사용되는 경우를 제외하고 99%의 경우에 UI의 context를 대체하여 동작합니다. + +### BottomSheets + +Get.bottomSheet는 showModalBottomSheet와 같지만 context가 필요 없습니다. + +```dart +Get.bottomSheet( + Container( + child: Wrap( + children: [ + ListTile( + leading: Icon(Icons.music_note), + title: Text('Music'), + onTap: () {} + ), + ListTile( + leading: Icon(Icons.videocam), + title: Text('Video'), + onTap: () {}, + ), + ], + ), + ) +); +``` + +## 중첩된 탐색 + +GetX는 Fultter의 중첩된 탐색을 더 쉽게 만듭니다. +context가 필요 없고 Id로 탐색 스택을 찾을 수 있습니다. + +- 주석: 병렬 탐색 스택을 만드는 것은 위험 할 수 있습니다. 이상적인 것은 NestedNavigators를 사용하지 않거나 아껴서 사용하는 것입니다. 프로젝트에 필요한 경우 여러 탐색 스택을 메모리에 유지하는 것이 RAM 소비에 좋지 않을 수 있음을 명심하십시오. + +간단합니다: + +```dart +Navigator( + key: Get.nestedKey(1), // index로 key를 생성 + initialRoute: '/', + onGenerateRoute: (settings) { + if (settings.name == '/') { + return GetPageRoute( + page: () => Scaffold( + appBar: AppBar( + title: Text("Main"), + ), + body: Center( + child: TextButton( + color: Colors.blue, + onPressed: () { + Get.toNamed('/second', id:1); // index로 중첩된 경로를 탐색 + }, + child: Text("Go to second"), + ), + ), + ), + ); + } else if (settings.name == '/second') { + return GetPageRoute( + page: () => Center( + child: Scaffold( + appBar: AppBar( + title: Text("Main"), + ), + body: Center( + child: Text("second") + ), + ), + ), + ); + } + } +), +``` diff --git a/siro_rider/packages/get/documentation/kr_KO/state_management.md b/siro_rider/packages/get/documentation/kr_KO/state_management.md new file mode 100644 index 0000000..fa4f643 --- /dev/null +++ b/siro_rider/packages/get/documentation/kr_KO/state_management.md @@ -0,0 +1,717 @@ +- [상태 관리자](#상태-관리자) + - [반응형 상태 관리자](#반응형-상태-관리자) + - [장점](#장점) + - [최대의 성능](#최대의-성능) + - [반응형 변수 선언하기](#반응형-변수-선언하기) + - [반응형 상태를 갖는 간단한 방법](#반응형-상태를-갖는-간단한-방법) + - [변수를 화면에 적용하기](#변수를-화면에-적용하기) + - [재빌드에 조건 걸기](#재빌드에-조건-걸기) + - [.obs를 사용하는 방법](#obs를-사용하는-방법) + - [List를 사용할 때](#list를-사용할-때) + - [어째서 .value를 사용하는가](#어째서-value를-사용하는가) + - [Obx()](#obx) + - [Workers](#workers) + - [간단한 상태 관리자](#간단한-상태-관리자) + - [장점](#장점-1) + - [사용법](#사용법) + - [controller의 동작 방식](#controller의-동작-방식) + - [StatefulWidget을 더 이상 사용할 필요없습니다](#statefulwidget을-더-이상-사용할-필요없습니다) + - [이 패키지의 목표](#이-패키지의-목표) + - [다른 사용법](#다른-사용법) + - [고유 ID](#고유-id) + - [2개의 상태 관리자 섞어쓰기](#2개의-상태-관리자-섞어쓰기) + - [GetBuilder vs GetX vs Obx vs MixinBuilder](#getbuilder-vs-getx-vs-obx-vs-mixinbuilder) + +# 상태 관리자 + +GetX는 다른 상태 관리자처럼 Streams나 ChangeNotifier를 사용하지 않습니다. 어째서일까요? GetX를 사용하면 Android, iOS, 웹, Linux, macOS, Linux 용 어플리케이션뿐만 아니라, 서버 어플리케이션도 Flutter/GetX의 문법으로 만들 수 있습니다. 반응 시간을 줄이고, RAM을 효율적으로 사용하기 위해, 우리는 GetValue와 GetStream을 만들었습니다. GetValue와 GetStream은 적은 연산 자원으로 낮은 레이턴시와 높은 퍼포먼스를 보여줍니다. 우리는 이를 토대로 상태관리를 포함해 모든 리소스를 빌드합니다. + +- _복잡도_: 어떤 상태관리자들은 복잡하고 매우 비슷한 형태를 띕니다. GetX를 이용하면 모든 이벤트를 위한 클래스를 정의할 필요가 없습니다. 이는 당신의 코드를 매우 깔끔하게 만들어주며, 적을 코드들을 줄여줍니다. 많은 Flutter 개발자들이 이런 이유로 개발을 포기해왔지만, 드디어 상태관리를 해결해줄 엄청나게 간단한 방법이 나왔습니다. +- _code generators에 의존하지 않음_: 당신은 어플리케이션 개발을 위한 로직을 작성하는데 개발시간의 절반을 할애했을 것입니다. 어떤 상태관리자들은 code generator에 의존하여 읽기 쉬운 코드를 작성했을 것입니다. 변수를 바꾸고 build_runner를 실행해야 하는 것은 비생산적일 수 있으며, 심지어 Flutter가 이를 반영되기를 기다리면서 커피 한 잔을 즐겨야 할 정도로 오래 기다릴 수 있습니다. GetX는 모든것을 즉각적으로 반응합니다. code generator에 의존하지 않고, 모든 면에서 당신의 생산성을 높여줍니다. +- _필요없는 context_: 아마 당신은 비즈니스 로직을 UI에 반영하기 위해, 여러 위젯 컨트롤러에 context를 넘겨주었을 것입니다. context를 이용한 위젯을 사용하기 위해, context를 다양한 클래스와 함수들을 이용하여 전달하였을 것입니다. GetX를 이용하면 그럴 필요가 없습니다. context없이 controller만으로 접근하여 사용할 수 있습니다. 말 그대로 아무 의미 없이 context를 파라미터로 넘겨줄 필요가 없습니다. +- _세분화된 컨트롤_: 대부분의 상태관리자들은 ChangeNotifier을 기반으로 동작합니다. ChangeNotifier는 notifyListeners가 호출되면 모든 위젯들에게 알릴 것입니다. 만약 당신 스크린에 수많은 ChangeNotifier 클래스를 갖는 40개의 위젯이 있다면, 한 번 업데이트 할 때마다 모든 위젯들이 다시 빌드될 것입니다. GetX를 이용하면 위젯이 중첩되더라도, 변경된 위젯만 다시 빌드됩니다. 한 Obx가 ListView를 보고있고, 다른 Obx가 ListView 안의 checkbox를 보고있을 때, checkBox 값이 변경되면, checkBox만 업데이트 되고, ListView 값이 변경되면 ListView만 업데이트 됩니다. +- _**정말** 바뀌었을 때만 재구성_: GetX는 흐름제어를 합니다. '진탁'이라는 Text를 화면에 보여준다고 해봅시다. 만약 당신이 obserable 변수인 '진탁'을 다시 한 번 '진탁'으로 변경한다면, 그 위젯은 재구성되지 않습니다. 왜냐하면 GetX는 '진탁'이 이미 Text로 보여주고 있다는 것을 알고 있기 때문에, 불필요한 재구성을 하지 않습니다. 대부분(모두일 수도 있는) 지금까지의 대부분의 상태관리자들은 스크린에 다시 빌드하여 보여줍니다. + +## 반응형 상태 관리자 + +반응형 프로그래밍은 복잡하다고 말해지기 때문에 많은 사람들이 접하기 힘들게 합니다. GetX는 반응형 프로그래밍을 꽤 간단한 것으로 만들어줍니다: + +- StreamControllers를 생성할 필요가 없습니다. +- StreamBuilder를 각 변수마다 생성할 필요가 없습니다. +- 각 상태마다 클래스를 만들어줄 필요가 없습니다. +- 초기값을 위한 get을 만들어줄 필요가 없습니다. + +GetX와 함께하는 반응형 프로그래밍은 setState를 사용하는 것만큼 쉽습니다. + +이름 변수가 하나 있고, 이 변수가 변경될 때마다 해당 변수를 사용하는 모든 위젯들이 자동적으로 변경된다고 해봅시다. + +여기 이름 변수가 있습니다. + +```dart +var name = 'Jonatas Borges'; +``` + +이 변수를 observable로 만들고 싶다면, 맨 뒤에 ".obs"만 붙이면 됩니다. + +```dart +var name = 'Jonatas Borges'.obs; +``` + +이게 끝입니다. 정말 쉽죠? + +지금부터, 우리는 이런 반응형-".obs"(ervables) 변수들을 _Rx_ 라고 부르겠습니다. + +우리가 내부에서 무엇을 했나요? 우리는 `String`의 `Stream`에 초기값인 `"Jonatas Borges"`를 할당했습니다. 우리는 `"Jonatas Borges"`을 사용하는 위젯들에게, 이제 이 변수에 "속한다"고 알리며 이 Rx 변수가 바뀔 때마다, 그 위젯들도 바뀌어야 한다고 알립니다. + +이것이 Dart 언어의 기능에 기반한, **GetX의 마법**입니다. + +하지만, 알다시피 static 클래스들은 "자동 변경"할 힘이 없기 때문에, `위젯`은 함수 안에 있는 경우에만 변경이 가능합니다. + +몇몇 변수를 동일한 범위 내에서 변화시키고 싶을 때, 당신은 `StreamBuilder`를 생성하여 이 변수를 지켜보면서 변화를 감지하고, "연쇄적으로" 중첩된 `StreamBuilder`를 만들 것입니다, 맞죠? + +아뇨, 더 이상 `StreamBuilder`를 만들 필요 없습니다. 하지만 static 클래스를 사용한다는 점은 맞아요. + +특정한 위젯을 변경하고 싶을 때, 우리는 모양이 비슷한 코드들을 봐야 했습니다. 그건 Flutter 방식이죠. **GetX**를 이용하면 이런 비슷한 모양의 코드는 잊어버릴 수 있습니다. + +`StreamBuilder( … )`? `initialValue: …`? `builder: …`? 아뇨, 당신은 그저 `Obx()` 위젯 안에 변수를 넣기만 하면 됩니다. + +```dart +Obx (() => Text (controller.name)); +``` + +_당신이 기억해야할 것은?_ `Obx(() =>`만 기억하세요. + +당신은 화살표함수를 통해 그 위젯을 `Obx()`으로 전달하는 것입니다. (그 _Rx_ 의 "Observer") + +`Obx`는 꽤 스마트하며 `controller.name`이 바뀔 경우에만 바뀔 것입니다. + +만약 `name`이 `"John"`이고, 당신이 이를 `"John"` (`name.value = "John"`)으로 바꾼다면, 기존 `value`와 동일하므로 화면상으로 바뀌는 것이 없습니다. 그리고 `Obx`는 리소스를 아끼기 위해 새 값을 무시하고 재빌드하지 않습니다. **놀랍지 않나요?** + +> 그래서, 제가 만약 5개의 _Rx_ (observable) 변수를 `Obx`안에 가지고 있다면 어떻게 되나요? + +그 변수들 중 **아무거나** 변경이 되었을 때 업데이트 됩니다. + +> 그리고 제가 만약 클래스 안에 30개의 변수를 갖고 있고 하나만 업데이트 했다면, 클래스 안의 **모든** 변수가 업데이트 되나요? + +아뇨, 단지 그 _Rx_ 변수를 사용하는 **특정한 위젯만** 업데이트 됩니다. + +그래서 **GetX**는 _Rx_ 변수의 변경이 있을 때만 화면에 업데이트 합니다. + +``` +final isOpen = false.obs; + +// 아무일도 일어나지 않습니다. 동일한 값이기 때문입니다. +void onButtonTap() => isOpen.value=false; +``` +### 장점 + +**GetX()** 는 업데이트된 것들을 **세부적으로** 제어해야할 때 유용합니다. + +어떤 동작을 수행할 때 모든 변수가 수정되어 `고유 ID`가 필요없을 때 `GetBuilder`를 사용하세요. `GetBuilder`는 단 몇줄의 코드로 상태를 변경시켜줍니다(`setState()`처럼). 이것은 단순하면서 CPU에 최소한의 부담을 주며, State 재빌드라는 하나의 목적을 수행하기 위해 가능한 한 최소의 리소스를 사용합니다. + +**강력한** 상택 관리자가 필요하다면, **GetX**와 함께하세요. + +GetX는 변수를 이용하지 않고, 내부에서 모든 것이 `Streams`로 구성된 __flow__ 를 이용합니다. +모든 것이 `Streams`이기 때문에, 접속사로써 _rxDart_ 를 이용합니다. +모든 것이 `Streams`이기 때문에, 각 "_Rx_ 변수"의 `event`를 주시할 수 있습니다. + +말 그대로 _BLoC_ 의 접근 법이며, generator와 decoration 없이 _MobX_ 보다 쉽습니다. +**모든 것들을** `.obs`를 붙임으로써 _"Observable"_ 하게 만들 수 있습니다. + +### 최대의 성능 + +최소의 재빌드를 위해 똑똑한 알고리즘을 적용하기 위해, **GetX**는 상태가 변했는지 확인하는 comparator를 사용합니다. + +당신의 앱에서 에러가 발생하고 상태 변경을 중복하여 보내면, **GetX**는 충돌하지 않도록 보장해줍니다. + +**GetX**를 사용하면 `value`가 변경된 경우만 상태가 변경됩니다. +이 점이 **GetX**와 _`computed`를 사용하는 MobX_ 와의 주요 차이점입니다. +2개의 __observable__ 변수를 결합하고 하나만 변경되는 경우, 그 _observable_ 를 참조하는 것 또한 변경됩니다. + +**GetX**를 사용하면, 2개의 변수를 결합한 경우 (`Oberver()`와 비슷한)`GetX()`는 정말 상태가 변경된 경우만 재빌드됩니다. + +### 반응형 변수 선언하기 + +변수를 "observable"하게 만드는 방법은 3가지가 있습니다. + + +1 - 첫 번째 방법: **`Rx{Type}`**. + +```dart +// 초기값을 설정하는 것을 추천하지만, 필수는 아닙니다. +final name = RxString(''); +final isLogged = RxBool(false); +final count = RxInt(0); +final balance = RxDouble(0.0); +final items = RxList([]); +final myMap = RxMap({}); +``` + +2 - 두 번째 방법: **`Rx`**와 Dart의 제너릭을 이용 `Rx` + +```dart +final name = Rx(''); +final isLogged = Rx(false); +final count = Rx(0); +final balance = Rx(0.0); +final number = Rx(0); +final items = Rx>([]); +final myMap = Rx>({}); + +// 커스텀 클래스 - 그 어떤 클래스도 가능합니다 +final user = Rx(); +``` + +3 - The third, more practical, easier and preferred approach, just add **`.obs`** as a property of your `value`: + +3 - 세 번째 방법: 실용적이며 쉽고 선호되는 방법으로, 단순히 **`.obs`**를 `value`의 속성으로 덧붙이는 방법 + +```dart +final name = ''.obs; +final isLogged = false.obs; +final count = 0.obs; +final balance = 0.0.obs; +final number = 0.obs; +final items = [].obs; +final myMap = {}.obs; + +// 커스텀 클래스 - 그 어떤 클래스도 가능합니다 +final user = User().obs; +``` + +##### 반응형 상태를 갖는 간단한 방법 + +알다시피 _Dart_ 는 _null safety_ 가 곧 도입될 것입니다. +이를 대비하기 위해 지금부터, _Rx_ 변수를 항상 **초기값**으로 초기화해주세요. + +> 변수를 **GetX** 를 이용하여 _observable_ + _초기값_ 으로 바꾸는 것은 매우 쉽고 실용적입니다. + +변수의 맨 뒤에 "`.obs`" 글자를 붙이기만 하면 되고, **이게 다입니다**. +당신은 변수를 observable 하게 만들었으며 `.value`를 이용하여 _초기값_ 에 접근할 수 있습니다. + + +### 변수를 화면에 적용하기 + +```dart +// controller file +final count1 = 0.obs; +final count2 = 0.obs; +int get sum => count1.value + count2.value; +``` + +```dart +// view file +GetX( + builder: (controller) { + print("count 1 rebuild"); + return Text('${controller.count1.value}'); + }, +), +GetX( + builder: (controller) { + print("count 2 rebuild"); + return Text('${controller.count2.value}'); + }, +), +GetX( + builder: (controller) { + print("sum rebuild"); + return Text('${controller.sum}'); + }, +), +``` + +`count1.value++`를 하면, 다음이 출력됩니다: +- `count 1 rebuild` +- `sum rebuild` + +because `count1` has a value of `1`, and `1 + 0 = 1`, changing the `sum` getter value. + +왜냐하면 `count1`은 `1`을 갖고 있고, `1 + 0 = 1`이며 `sum` getter의 값을 변경하기 때문입니다. + +`count2.value++`를 하면, 다음이 출력됩니다: +- `count 2 rebuild` +- `sum rebuild` + +왜냐하면 `count2.value`가 바뀌었고 `sum` 결과는 이제 `2`이기 때문입니다. + + +- 참고: 기본적으로, 동일한 `value`로 변경되더라도, 첫 번째 이벤트는 위젯을 재빌드합니다. 이 동작은 Boolean 변수로 인해 일어납니다. + +다음과 같이 했다고 생각해봅시다: + +```dart +var isLogged = false.obs; +``` + +그리고 `ever`에서 이벤트를 발생시키기 위해, 사용자가 "로그인" 되어있는지 확인한다고 해봅시다. + +```dart +@override +onInit(){ + ever(isLogged, fireRoute); + isLogged.value = await Preferences.hasToken(); +} + +fireRoute(logged) { + if (logged) { + Get.off(Home()); + } else { + Get.off(Login()); + } +} +``` + +만약 `hasToken`이 `false`라면, `isLogged`에 변화는 없을 것입니다. 그러면 `ever()`는 호출되지 않을 것입니다. +이런 동작을 피하기 위해서, `.value`가 동일한 값으로 변경되더라도 _observable_ 의 첫 변경은 이벤트를 발생시킬 것입니다. + +이런 동작을 원하지 않는다면, 다음으로 막을 수 있습니다: +`isLogged.firstRebuild = false;` + + +### 재빌드에 조건 걸기 + +또한, Get은 정교한 상태 관리 기능을 제공합니다. 특정 조건에서 이벤트를 조건화할 수 있습니다.(리스트에 요소를 추가하는 등) + +```dart +// 첫 번째 parameter: 조건, 반드시 true 혹은 false를 return +// 두 번째 parameter: 조건이 true 일 경우 적용할 새 value +list.addIf(item < limit, item); +``` + +decoration 없이, code generator 없이, 복잡함 없이 :smile: + +Flutter의 counter 앱을 아시나요? 당신의 Controller 클래스는 아마 다음과 같을 것입니다. + +```dart +class CountController extends GetxController { + final count = 0.obs; +} +``` + +간단합니다: + +```dart +controller.count.value++ +``` + +어디에서 변경되든지 간에 관계없이, counter 변수를 당신의 UI 내에서 업데이트 할 수 있습니다. + +### .obs를 사용하는 방법 + +그 어떠한 것도 obs로 바꿀 수 있습니다. 2가지 방법이 있습니다. + +* 클래스 값들을 obs로 바꿀 수 있습니다. +```dart +class RxUser { + final name = "Camila".obs; + final age = 18.obs; +} +``` + +* 또는 클래스 전체를 observable로 만들 수 있습니다. +```dart +class User { + User({String name, int age}); + var name; + var age; +} + +// 인스턴스화 할때 +final user = User(name: "Camila", age: 18).obs; +``` + +### List를 사용할 때 + +리스트내 요소들과 마찬가지로 리스트 또한 완벽하게 observable로 만들 수 있습니다. 이렇게 하면, 리스트에 요소를 추가하였을 때 자동적으로 그 리스트를 사용하는 위젯들을 리빌드할 수 있습니다. + +리스트는 ".value"를 이용할 필요가 없습니다. 놀랍게도 dart api가 ".value" 없이도 사용할 수 있게 만들어줍니다. +불행히도 String, int와 같은 primitive type들은 확장할 수 없기때문에 ".value"가 반드시 필요합니다만, getter와 setter를 이용하면 이러한 문제는 해결됩니다. + +```dart +// On the controller +final String title = 'User Info:'.obs +final list = List().obs; + +// on the view +Text(controller.title.value), // String은 .value가 필요합니다 +ListView.builder ( + itemCount: controller.list.length // 리스트는 .value가 필요없습니다. +) +``` + +당신이 만든 observable 클래스를 만들었을 때, 업데이트를 하는 다른 방법이 있습니다. + +```dart +// model 파일에서 +// 각 field들을 observable로 만드는 대신, 클래스 전체를 observable로 만들 것입니다. +class User() { + User({this.name = '', this.age = 0}); + String name; + int age; +} + + +// controller 파일에서 +final user = User().obs; +// when you need to update the user variable: +// user의 변수를 업데이트해야할 때 +user.update( (user) { // 이 parameter는 업데이트 하길 원하는 인스턴스 자체입니다. +user.name = 'Jonny'; +user.age = 18; +}); +// user 인스턴스를 업데이트하는 또다른 방법 +user(User(name: 'João', age: 35)); + +// on view: +Obx(()=> Text("Name ${user.value.name}: Age: ${user.value.age}")) +// .value 없이 model의 value에 접근할 수 있습니다. +user().name; // User 클래스가 아니라, user 변수임을 주의하세요 (변수는 소문자 u를 갖고 있습니다.) +``` + +원하지 않으면 set을 이용하지 않아도 됩니다. "assign"과 "assignAll" api를 이용할 수 있습니다. +"assign" api는 당신의 리스트를 비우고, 채우고 싶은 하나의 요소를 넣을 수 있습니다. +"assignAll" api는 존재하는 리스트를 비우고, 삽입하길 원하는 iterable 객체들을 추가할 수 있습니다. + +### 어째서 .value를 사용하는가 + +code generator와 decoration을 이용하면 `String`과 `int`와 같은 타입에도 '.value'를 이용하지 않아도 되었겠지만, 이 라이브러리의 목표는 외부 종속성을 피하는 것입니다. 우리는 외부 패키지를 이용하지 않고, 간단하고 가벼우며 성능좋은 필수요소들(라우트 관리, 종속성 관리, 상태 관리)을 제공하고, 쾌적한 프로그래밍 환경을 제공하고 싶었습니다. + +단 3글자(get)와 콜론(;)만 pubspec에 적고 프로그래밍을 시작하세요. 모든 솔루션들이 기본적으로 제공되며, 쉽고 생산성과 성능 좋게 라우트와 상태 관리를 할 수 있습니다. + +이 라이브러리는 완벽한 솔루션임에도 불구하고 단일 상태 관리 패키지보다 가볍습니다. 이 점을 꼭 아셔야 합니다. + +만약 `.value`가 code generator처럼 당신을 괴롭힌다면, MobX가 훌륭한 대안으로 Get과 함께 활용할 수 있습니다. pubspec에서 단일 종속성을 원하고, 호환되지 않는 버전의 패키지들을 걱정하지 않고 프로그래밍을 시작하길 원하거나, 상태 업데이트 오류가 상태 관리자나 패키지에서 비롯되는 경우, controller에 사용가능성에 대한 걱정하기 원하지 않고 말그대로 "프로그래밍만"을 하고 싶은 경우, get은 완벽한 방안입니다. + +당신이 MobX의 code generator를 이용하는데 문제가 없었거나 BloC의 boilerplate를 이용하는데 문제가 없었다면, Get을 라우트하는데 쉽게 사용할 수 있을 것이며 상태 관리자를 갖고 있다는 사실을 잊을 것입니다. Get의 SEM과 RSM은 필수적으로 탄생했습니다. 저희 회사에는 90개의 controller가 넘는 프로젝트가 있었는데, 충분히 좋은 디바이스에서도 flutter clean 이후, code generator는 작업을 끝내는데 30분 이상이 걸렸습니다. 당신의 프로젝트에 5, 10, 15개 정도의 controller들만 있다면 어떤 상태 관리자들도 충분히 좋겠지만, 엄청 큰 프로젝트를 진행하고 있다면 code generator는 문제를 일으킬 것입니다. get은 매우 훌륭한 해결책입니다. + +누군가 이 프로젝트에 기여하고자 code generator나 비슷한 것을 만들고 있다면, 저는 이 readme로 링크시키겠습니다. 저한테 필요한 것들이 모든 개발자에게 필요한 것들은 아니겠지만, 지금으로써는 MobX와 같은 좋은 솔루션들이 있다고 말할 수 있습니다. + +### Obx() + +바인딩을 이용해 Get을 입력하는 것은 불필요합니다. 익명 함수만 받는 GetX 대신 Obx 위젯을 이용할 수 있습니다. 타입을 이용하지 않는다면, 변수를 사용하기 위한 controller 객체를 이용하거나, `Get.find().value` 혹은 `Controller.to.value`를 이용하여 value에 접근하면 됩니다. + +### Workers + +Worker는 이벤트가 일어났을 때, 특정 콜백함수들을 호출하는 것을 도와줍니다. + +```dart +/// 'count1'이 변경될 때마다 호출 +ever(count1, (_) => print("$_ has been changed")); + +/// 'count1'이 처음으로 변경될 때 호출 +once(count1, (_) => print("$_ was changed once")); + +/// Anti DDos - 'count1'이 변경되고 1초간 변화가 없을 때 호출 +debounce(count1, (_) => print("debouce$_"), time: Duration(seconds: 1)); + +/// 'count1'이 변경되고 있는 동안 1초 간격으로 호출 +interval(count1, (_) => print("interval $_"), time: Duration(seconds: 1)); +``` +(`debounce`를 제외한)모든 worker들은 `condition` parameter를 가집니다. 이 parameter는 `bool` 이거나 `bool`을 return 하는 콜백함수입니다. 이 `condition`은 `callback` 함수가 언제 실행될지 정의합니다. + +모든 worker들은 `Worker` 객체를 return하며, `dispose()`를 이용하여 worker 동작을 취소시킬 수 있습니다. + +- **`ever`** +_Rx_ 변수가 바뀔 때마다 항상 호출됩니다. + +- **`everAll`** +`ever`처럼, `List` _Rx_ 변수가 주어지고 변경될 때마다 호출됩니다. + +- **`once`** +변수가 최초로 변경될 때(한 번만) 호출됩니다. + +- **`debounce`** +'debounce'는 검색 함수를 구현하는 데에 매우 유용합니다. API 호출을 타이핑이 모두 끝났을 때만 호출 시킬 수 있습니다. 만약 사용자가 "진탁"을 타이핑한다면, 당신은 'ㅈ,ㅣ,ㄴ,ㅌ,ㅏ,ㄱ'에 해당하는 6번의 검색을 해야할 것입니다. Get을 이용하면 이런 일은 일어나지 않을 것입니다. 왜냐하면 "debounce" Worker는 타이핑이 끝났을 때에만 검색하도록 만들어주기 때문입니다. + +- **`interval`** +'interval'은 debounce와 다릅니다. 사용자가 1초에 1000번의 변화를 주는 행동을 한다고 해봅시다. debounce는 마지막 변화가 있은 후, 정해진 시간(기본적으로는 800ms)이 지나면 한 번만 호출됩니다. interval은 정해진 시간동안 사용자의 행동들을 무시합니다. 사용자가 1분동안 1초에 1000번의 변화를 주는 행동을 지속한다면, debounce는 사용자가 행동을 멈춘 후 한 번만 호출됩니다. 1초로 time이 설정된 interval은 매 초마다 1번씩 총 60번 호출되며, 3초로 time이 설정된 interval은 3초마다 1번씩 총 20번 호출 될 것입니다. interval은 엄청 빠른 터치(클릭)를 이용한 어뷰징(abusing)을 막는데 사용하는 데에 사용하기를 추천합니다.(예를 들어 특정 버튼을 눌러 코인을 얻는다고 해봅시다. 1분에 300번의 터치를 한다면, 사용자는 1분에 300코인을 얻을 것입니다. 하지만 interval를 이용하여 3초를 time으로 설정하면 사용자가 300번을 터치하든, 수 천번을 터치하든지 간에 20코인밖에 얻지 못할 것입니다.) 검색과 같이 변화가 api를 통해 쿼리를 호출해야 하는 경우, debounce는 DDos 공격을 막는데 효과적입니다. debounce는 사용자가 타이핑을 멈추길 기다리고, 멈추면 호출되기 때문입니다. 위쪽의 코인 시나리오에 대입해서 생각해보면, 터치를 "멈춘" 때, 코인 1개만 얻을 수 있을 것입니다. + + + +- 참고: Worker는 Controller 혹은 클래스를 시작할 때만 사용할 수 있습니다. 그래서 항상 onInit 내에 있거나(권장사항), 클래스 생성자, StatefulWidget의 initState 안에(권장하지는 않지만 부작용은 없습니다.) 있어야 합니다. + +## 간단한 상태 관리자 + +Get은 ChangeNotifier를 사용하지 않고, 엄청나게 가볍고 사용하기 쉬운 상태 관리자를 제공합니다. 이 상태 관리자는 Flutter가 처음인 사람들의 요구를 충족하며 대규모 어플리케이션에서도 문제를 발생시키지 않습니다. + +GetBuilder는 여러 상태 컨트롤을 정확하게 해내는 것을 목표로 합니다. 장바구니에 30개의 상품이 있고, 사용자가 하나를 삭제하기 위해 터치(클릭)하면 상품 목록이 업데이트 되어 가격과 품목 수가 줄어든다고 해봅시다. 이런 상황에서 GetBuilder는 매우 유용합니다. 왜냐하면 상태들을 그룹화하여 "연산 로직"없이 한 번에 변경하기 때문입니다. GetBuilder는 이런 상황을 고려하여 만들어졌습니다. 일시적인 상태 변화를 위해 setState를 사용하면 되므로 상태 관리자가 필요없기 때문입니다. + +이렇게 하면 개별적 controller를 원하는 경우, 각 ID를 할당해주거나 GetX를 사용할 수 있습니다. 어떤 것을 선택할지 당신에게 달려있지만 이 점을 기억하세요. "개별" 위젯이 많은 경우에는 GetX의 성능이 뛰어나고, 상태 변화가 여러 번 일어나는 경우에는 GetBuilder의 성능이 뛰어납니다. + + + +### 장점 + +1. 필요한 위젯만 업데이트 해줍니다. + +2. ChangeNotifier를 사용하지 않고, 적은 메모리(거의 0mb)를 이용하여 상태 관리를 해줍니다. + +3. StatfulWidget을 이용 안 해도 됩니다! Get을 이용하면 더 이상 StatefulWidget이 필요 없습니다. 다른 상태 관리자들을 사용하면, Provider, BLoC, MobX Controller 등의 객체를 갖기 위해 StatefulWidget을 사용해야 합니다. appBar, Scaffold, 그리고 대부분의 위젯들이 StatelessWidget로 구성된 것을 생각해본 적이 있나요? Get은 이 부분도 해결해줍니다. 모든 것들을 Stateless로 만드세요. 하나의 위젯만 업데이트할 필요가 있다면, GetBuilder로 감싸면 해당 상태를 가질 수 있습니다. + +4. 당신의 프로젝트를 잘 정돈할 수 있습니다! Controller들은 UI내에 두지 않고, TextEditController나 다른 controller 들을 당신의 Controller 클래스 내에 두세요! + +5. 렌더링 된 직후, 위젯을 업데이트하기 위해 이벤트를 발생시킬 필요가 있나요? GetBuilder는 StatefulWidget처럼 "initState"를 갖고 있습니다. 그리고 controller로부터 직접적으로 이벤트를 호출하고, 더 이상 이벤트를 initState내에 배치할 필요가 없습니다. + +6. timers 등과 같은 streams를 닫는 행동을 트리거해야 하나요? GetBuilder는 dispose 또한 갖고 있어서, 위젯이 없어지자마자 dispose를 호출할 수 있습니다. + +7. streams는 정말 필요할 때만 사용하세요. StreamController와 StreamBuilder는 controller 안에 정상적으로 사용할 수 있습니다만! 기억하세요. stream은 메모리를 적당히 사용하지만, 남용해서는 안됩니다. 30개의 stream이 동시에 열려있다면 ChangeNotifier보다 안좋습니다(ChangeNotifier는 매우 나쁩니다). + +8. RAM의 소모 없이 위젯을 업데이트 하세요. Get은 GetBuilder의 creator ID만 저장하고 필요한 경우에만 해당 GetBuilder만 업데이트 합니다. 수천개의 GetBuilder가 있어도 get은 ID를 저장하는데 매우 적은 메모리를 사용합니다. 새 GetBuilder를 생성한다면, creator ID를 갖고 있는 GetBuilder의 상태를 공유합니다. 각 GetBuilder의 새 상태는 생성 되지 않기 때문에 큰 규모의 어플리케이션에서도 **많은** RAM 자원을 절약합니다. 기본적으로 당신의 어플리케이션은 전반적으로 Stateless 이고, 극히 일부의 위젯만 단일 상태를 가진 (GetBuilder를 포함한)Stateful일 것이기 때문에, 하나의 업데이트만으로 그것들을 전부 업데이트 합니다. 상태는 단 하나뿐입니다. + +9. Get은 전지적으로 대부분의 경우 어느 타이밍에 메모리에서 제거해야할 지 알 고 있습니다. 당신은 언제 컨트롤러를 dispose해야하는지만 걱정하세요. + +### 사용법 + +```dart +// GetxController를 상속(extends)하는 controller 클래스를 만드세요 +class Controller extends GetxController { + int counter = 0; + void increment() { + counter++; + update(); // increment()가 호출되었을 때, counter 변수가 변경되어 UI에 반영되어야 한다는 것을 update()로 알려주세요 + } +} +// 당신의 Stateless/Stateful 클래스에서, increment()가 호출되었을 때 GetBuilder를 이용해 Text를 업데이트 하세요 +GetBuilder( + init: Controller(), // 맨 처음만! 초기화(init)해주세요 + builder: (_) => Text( + '${_.counter}', + ), +) + +// controller는 처음만 초기화하면 됩니다. 같은 controller로 GetBuilder를 또 사용하려는 경우에는 init을 하지 마세요. +// 중복으로 'init'이 있는 위젯이 배치되자마자, controller는 자동적으로 메모리에서 제거될 것입니다. +// 걱정하실 필요 없이, Get은 자동적으로 controller를 찾아서 해줄겁니다. 그냥 2번 init하지 않는 것만 하시면 됩니다. +``` + +**끝입니다!** + +- 당신은 이미 Get을 이용하여 상태관리를 어떻게 하는지 다 배우셨어요! + +- 참고: 큰 규모의 프로젝트를 진행하면서 init 속성을 사용하지 않을 수도 있습니다. 그럴 때에는, Binding 클래스를 상속(extends)한 클래스를 만들고, 그 클래스 내에서 해당 라우트에 생성되어야 하는 controller를 선언하세요. controller가 즉각적으로 만들어지지는 않지만, controller가 처음 사용될 때 Get이 알아서 잘 만들어줄 것입니다. Get은 lazyLoad를 지원하며, controller가 더 이상 필요하지 않을 때 dispose를 해줍니다. 사용예제는 pub.dev에서 확인하세요. + +수많은 라우트를 진행하면서 예전에 사용하였던 controller의 데이터가 필요하면, GetBuilder를 다시 사용하시면 됩니다 (init 없이): + +```dart +class OtherClass extends StatelessWidget { + @override + Widget build(BuildContext context) { + return Scaffold( + body: Center( + child: GetBuilder( + builder: (s) => Text('${s.counter}'), + ), + ), + ); + } + +``` + +GetBuilder 밖의 여러 곳에서 controller를 사용해야 하는 경우, 간단하게 Controller 클래스 안의 getter로 접근할 수 있습니다. (아니면 `Get.find()`를 사용하세요) + +```dart +class Controller extends GetxController { + + /// You do not need that. I recommend using it just for ease of syntax. + /// with static method: Controller.to.increment(); + /// with no static method: Get.find().increment(); + /// There is no difference in performance, nor any side effect of using either syntax. Only one does not need the type, and the other the IDE will autocomplete it. + static Controller get to => Get.find(); // add this line + + int counter = 0; + void increment() { + counter++; + update(); + } +} +``` + +그리고 아래와 같은 방법으로, controller에 바로 접근하세요: + +```dart +FloatingActionButton( + onPressed: () { + Controller.to.increment(), + } // This is incredibly simple! + child: Text("${Controller.to.counter}"), +), +``` + +FloatingActionButton을 눌렀을 때, counter 변수를 주시(listen)하고 있는 위젯은 자동적으로 업데이트됩니다. + +### controller의 동작 방식 + +아래와 같은 상황을 가정해보겠습니다: + +`Class A => Class B (has controller X) => Class C (has controller X)` + +A 클래스에서 controller를 아직 사용하지 않았기 때문에, controller는 메모리에 없습니다(Get은 lazyLoad를 지원합니다). B 클래스에서는 controller를 사용하기 때문에 메모리에 로드됩니다. C 클래스에서는 B 클래스에서 사용한 controller와 같은 controller를 사용하기 때문에, Get은 B의 controller와 C의 controller의 상태를 공유하며, 그 동일한 controller는 여전히 메모리에 있습니다. 그리고 C 화면과 B 화면을 닫으면, Get은 자동적으로 controller X (B와 C에서 쓰인 controller)를 메모리에서 해제해줄 것입니다. 왜냐하면 A 클래스에서는 controller X를 사용하지 않기 때문이죠. 만약 B 화면으로 라우팅한다면 controller X는 다시 메모리에 로드됩니다. 그리고 C 화면으로 라우팅되는 대신, A 화면으로 되돌아간다면 같은 방식으로 controller X는 메모리에서 해제됩니다. 만약 클래스 C에서 controller를 사용하지 않고, 클래스 B가 메모리에서 해제된다면, controller를 사용하는 클래스가 없기 때문에 같은 방식으로 controller는 메모리에서 해제됩니다. Get이 에러날 수 있는 유일한 예외 상황은 B가 예기치않게 라우트 상에서 제거되고, C에서 controller를 사용하려고 하는 경우입니다. 이 경우, B에 있던 controller의 creator ID가 제거되는데, Get은 creator ID를 갖고 있지 않은 controller는 메모리에서 제거하도록 프로그래밍되어 있습니다. 이런 일을 원하지 않으신다면, "authoRemove: false" 플래그를 B 클래스의 GetBuilder에 추가하고, "assignId: true"를 C 클래스의 GetBuilder에 추가해주세요. + +### StatefulWidget을 더 이상 사용할 필요없습니다 + +SatefullWidget을 사용한다는 것은 위젯을 최소한으로 재빌드해야하는 경우에도, 위젯을 Consumer / Oberver / BlocProvider / GetBuilder / GetX / Obx 안에 넣어줄 것이기 때문에, 또다른 StatefulWidget을 사용하는 것과 마찬가지이므로 화면 전체의 상태를 불필요하게 저장합니다. StatefulWidget 클래스는 StatelessWidget 클래스보다 더 많은 RAM 할당이 필요한 큰 규모의 클래스입니다. 1개나 2개 정도의 클래스라면 별 차이가 없겠지만, 100개 이상부터는 차이가 있을 것입니다! TickerProviderStateMixin과 같은 mixin이 필요없는 경우, Get을 사용하면 StatefulWidget은 필요 없습니다. + +StatefulWidget에서 메소드를 직접적으로 호출하는 것처럼, Getbuilder를 통해 메소드를 호출할 수 있습니다. +initState()나 dispose()를 호출할 필요가 있을 때에도, 직접적으로 호출할 수 있습니다. + +```dart +GetBuilder( + initState: (_) => Controller.to.fetchApi(), + dispose: (_) => Controller.to.closeStreams(), + builder: (s) => Text('${s.username}'), +), +``` + +위 방법보다 더 좋은 방법은 Controller에서 onInit()과 onClose()를 이용하는 것입니다. + +```dart +@override +void onInit() { + fetchApi(); + super.onInit(); +} +``` + +- 참고: controller가 처음 불려졌을 때 어떤 메소드가 호출되길 원하는 경우, (좋은 성능을 목표로하는 Get 패키지를 이용하면)이를 위해서 생성자를 **사용할 필요가 없습니다**. 생성자를 사용한다는 것은 controller가 생성되거나 할당되었을 때의 로직에서 벗어나는 일이기 때문에 좋지 않습니다. (controller 객체를 생성하려하면 생성자는 즉시 호출되며, controller를 사용하기 이전부터 메모리에 로드됩니다. 이러한 동작은 이 라이브러리의 성능을 저해합니다.) onInit()과 onClose()는 이를 위해 만들어졌습니다. Get.lazyPut하는지 여부에 따라, controller가 생성되거나 처음 사용될 때 onInit()과 onClose()가 호출됩니다. API를 호출하기 위한 데이터를 초기화 등을 위해 구식 방식의 initState/dispose를 사용하는 대신 onInit()을 사용하고, stream을 닫는 등의 동작이 필요하면 onClose()를 사용하세요. + +### 이 패키지의 목표 + +이 패키지의 목표는 당신에게 최소의 종속성(pubspec의 dependencies)으로 라우트/상태/종속성 관리를 위한 완전한 솔루션을 제공하는 것입니다. Get은 어떤 종속성에서도, 어떤 버전의 Flutter API를 사용하더라도 동작하도록 보장해줍니다. 어떤 종속성에서도 당신의 프로젝트가 동작하도록 단일 패키지로 모든 것을 집약하였습니다. 이런 방법으로 당신은 화면상 위젯들만 신경쓰고, 팀원 중 일부는 비즈니스 로직에만 신경쓸 수 있도록 하였습니다. 이 점은 당신에게 더 나은 작업환경을 제공합니다. 팀원 중 일부는 controller에 보내지는 데이터에 신경 쓰지 않고 위젯에만 집중하고, 다른 팀원들은 위젯 배치에는 신경쓰지 않고 비즈니스 로직에만 집중하여 작업할 수 있습니다. + +간단히 말하면: 여러 메소드들을 initState에서 호출할 필요도 없고, 메소드들을 parameter로 controller에 넘겨줄 필요 없고, controller 생성자를 호출할 필요도 없습니다. 여러분의 서비스가 시작하고 호출되는 onInit()를 이용하면 됩니다. 그리고 controller가 더 이상 필요 없을 때 메모리에서 제거 될 때 호출되는 onClose()를 이용하세요. 이 방법으로 화면 구성은 위젯 배치만 신경써도 되게 해줍니다. + +GetxController 안에서 dispose를 호출하지 마세요. 아무동작도 하지 않을 뿐더러 controller는 위젯이 아니기 때문에 "dispose"할 수 없다는 점을 기억하세요. Get에 의해 자동적으로 똑똑하게 메모리에서 해제 될 것입니다. 만약 stream들을 닫고 싶다면 onClose() 메소드 안에서 닫아주세요. 예를 들어: + +```dart +class Controller extends GetxController { + StreamController user = StreamController(); + StreamController name = StreamController(); + + /// dispose가 아니라 onClose()에서 stream을 닫으세요 + @override + void onClose() { + user.close(); + name.close(); + super.onClose(); + } +} +``` + +Controller 생명 주기: + +- onInit()은 생성되었을 때 호출 +- onClose()는 delete 메소드를 준비하기 위해 닫히는 경우 +- deleted: controller가 메모리에서 해제되어 더 이상 API에 접근할 수 없을 때. 말 그대로 삭제되어 추적할 수 없습니다. + +### 다른 사용법 + +Controller 객체를 GetBuilder 안에서 value로 직접 접근할 수 있습니다: + +```dart +GetBuilder( + init: Controller(), + builder: (value) => Text( + '${value.counter}', // 여기! + ), +), +``` + +GetBuilder 바깥에서도 controller 객체가 필요하면, 다음과 같이 접근할 수 있습니다: + +```dart +class Controller extends GetxController { + static Controller get to => Get.find(); +[...] +} +// 화면상 +GetBuilder( + init: Controller(), // 각 controller를 처음 사용할 때 init 하세요 + builder: (_) => Text( + '${Controller.to.counter}', // 여기! + ) +), +``` + +아니면 + +```dart +class Controller extends GetxController { + // static Controller get to => Get.find(); // static get 없이 +[...] +} +// stateless/stateful 클래스에서 +GetBuilder( + init: Controller(), // 각 controller를 처음 사용할 때 init 하세요 + builder: (_) => Text( + '${Get.find().counter}', // 여기! + ), +), +``` + +- "비표준"적인 방식의 접근도 다음과 같이 가능합니다. get_it, modular 등과 같은 다른 종속성 관리자를 사용한다면, 아래와 같이 controller 객체를 전달해줄 수 있습니다: + +```dart +Controller controller = Controller(); +[...] +GetBuilder( + init: controller, // 여기! + builder: (_) => Text( + '${controller.counter}', // 여기! + ), +), + +``` + +### 고유 ID + +GetBuilder로 위젯의 업데이트를 좀 더 세분화하여 다루고 싶다면, 고유 ID를 부여하세요: + +```dart +GetBuilder( + id: 'text' + init: Controller(), // 각 controller를 처음 사용할 때 init 하세요 + builder: (_) => Text( + '${Get.find().counter}', // 여기! + ), +), +``` + +그리고 다음과 같이 update 하세요: + +```dart +update(['text']); +``` + +또, update하는데 조건도 줄 수 있습니다: + +```dart +update(['text'], counter < 10); +``` + +GetX는 위젯이 정말 값이 변경되었을 때에만 재빌드합니다. 만약 변수의 값이 전과 같은 값으로 변경되었다면, GetX는 메모리와 CPU 자원을 아끼기 위해 재빌드하지 않습니다.(화면에 3이라는 숫자가 보여지고 있고, 그 숫자가 다시 3으로 변경된 경우를 가정하겠습니다. 대부분의 상태 관리자들은 이러한 경우에 재빌드를 합니다만, GetX를 사용하면 정말 값이 변경되었을 때에만 재빌드를 합니다.) + +## 2개의 상태 관리자 섞어쓰기 + +단 하나의 반응변수(.obs)와 다른 메커니즘(update())가 모두 필요해서 Getbuilder 안에 Obx를 넣어야 하는 경우가 필요했습니다. 이 경우를 위해 MixinBuilder가 만들어졌습니다. ".obs"변수의 값이 바뀔 때 즉각적으로 바뀌는 것과 update()를 통해 바뀌는 것 모두를 지원합니다. 하지만, 이 위젯이 GetBuilder, GetX, Obx 보다 더 많은 리소스를 필요로합니다. 왜냐하면 controller의 update() 메소드와 자식으로부터의 .obs 변수의 변화를 주시하고 있어야 하기 때문입니다. + +GetxController를 상속(extends)하는 것은 중요합니다. onInit()과 onClose()에서 "시작"과 "종료" 이벤트를 수행할 수 있는 생명 주기를 갖고 있기 때문입니다. 이를 위해서 어떤 클래스를 사용해도 괜찮지만, obervable한 변수든 아니든 간에 GetXController를 사용해 변수를 다루길 적극 권장합니다. + + +## GetBuilder vs GetX vs Obx vs MixinBuilder + +10년간 프로그래밍을 하며 일해오면서, 귀중한 교훈을 얻을 수 있었습니다. + +반응형 프로그래밍을 처음 접했을 때 "와, 진짜 굉장한데!"라고 느꼈고, 실제로도 반응형 프로그래밍은 정말 놀랍습니다. 하지만, 모든 상황에서 올바르지는 않습니다. 많은 경우 2개내지 3개의 위젯의 상태를 동시에 변경하거나 일시적으로 변경해야하는데, 반응형 프로그래밍은 나쁘지 않지만 적적하지 않습니다. + +반응형 프로그래밍은 각각의 워크플로우를 위한 RAM 자원을 많이 필요로 합니다. 하나의 위젯만이 재빌드 되어야 하는 경우는 괜찮지만, 리스트에 80개 가량의 요소가 있고, 각각 stream이 있을 경우에는 좋지 않습니다. dart inspect 창을 열고 StreamBuilder가 얼마나 많은 리소스를 사용하는지 보신다면, 제 말이 이해가 가실겁니다. + +이런 생각에, 저는 간단한 상태 관리자를 만들었습니다. 간단합니다. 그리고 이것이 여러분이 정말 요구하는 것이에요: 블록 단위로 매우 경제적이고 간단하게 상태를 업데이트합니다. + +`GetBuilder`는 RAM의 측면에서 가장 경제적입니다. 이보다 더 경제적인 방법은 없을 겁니다(만약 그런 방법을 고안하신다면, 꼭 저희에게 알려주세요!) + +하지만 `GetBuilder`는 수동적인 상태 관리자입니다. Provider의 notifyListeners()를 호출하는 것처럼 update()를 호출해야만 합니다. + +반응형 프로그래밍이 정말 도움이 되는 상황들이 많습니다. 이를 활용하지 않는건 바퀴를 다시 만드는 것과 마찬가지입니다. 이런 생각에, `GetX`는 상태 관리자로 가장 현대적이고 높은 수준의 기능들을 제공하기 위해 만들어졌습니다. 이것은 필요한 것들을 필요한 때에 업데이트합니다. 만약 에러가 있고 300개의 상태가 동시에 변경되면, `GetX`는 화면상에 반영되어야할 것들만 필터링하여 업데이트 합니다. + +`GetX`는 다른 반응형 상태 관리자들보다 경제적이지만, `GetBuiler`보다 조금 더 RAM을 소모합니다. 능동적이면서 RAM의 최대한 효율적으로 사용하기 위해 `Obx`가 만들어졌습니다. `GetX`와 `GetBuilder`와 다르게 `Obx`안에서 controller를 초기화할 수 없습니다. 단지 자식으로부터 변화를 감지하는 StreamSubscription을 갖고 있는 위젯일 뿐입니다. `Obx`는 `GetX`보다는 경제적이지만 `GetBuilder`보다는 덜 경제적입니다. 왜냐하면 `Obx`는 반응적이고, `GetBuilder`는 위젯의 해시코드와 StateSetter만 저장하는 최적의 접근 방식을 갖고 있기 때문입니다. `Obx`를 이용하면 controller의 타입을 적어줄 필요가 없고, 여러 개의 다른 controller 변화를 감지합니다. 하지만 사용 전에 초기화거나, readme에 있는 예제처럼 사용하거나, Binding 클래스를 사용해야 합니다. diff --git a/siro_rider/packages/get/documentation/pt_BR/dependency_management.md b/siro_rider/packages/get/documentation/pt_BR/dependency_management.md new file mode 100644 index 0000000..b73fa31 --- /dev/null +++ b/siro_rider/packages/get/documentation/pt_BR/dependency_management.md @@ -0,0 +1,382 @@ +# Gerenciamento de dependência +- [Gerenciamento de dependência](#gerenciamento-de-dependência) + - [Gerenciamento de dependências simples](#gerenciamento-de-dependências-simples) + - [Métodos de criar instâncias](#métodos-de-criar-instâncias) + - [Get.put()](#getput) + - [Get.lazyPut](#getlazyput) + - [Get.putAsync](#getputasync) + - [Get.create](#getcreate) + - [Usando as classes/dependências instanciadas](#usando-as-classesdependências-instanciadas) + - [Diferenças entre os métodos](#diferenças-entre-os-métodos) + - [Bindings](#bindings) + - [Classe Bindings](#classe-bindings) + - [BindingsBuilder](#bindingsbuilder) + - [SmartManagement](#smartmanagement) + - [Como alterar](#como-alterar) + - [SmartManagement.full](#smartmanagementfull) + - [SmartManagement.onlyBuilders](#smartmanagementonlybuilders) + - [SmartManagement.keepFactory](#smartmanagementkeepfactory) + - [Como os Bindings funcionam](#como-os-bindings-funcionam) + - [Notas](#notas) + +Get tem um gerenciador de dependência simples e poderoso que permite você pegar a mesma classe que seu Bloc ou Controller com apenas uma linha de código, sem Provider context, sem inheritedWidget: + +```dart +Controller controller = Get.put(Controller()); // Em vez de Controller controller = Controller(); +``` + +Em vez de instanciar sua classe dentro da classe que você está usando, você está instanciando ele dentro da instância do Get, que vai fazer ele ficar disponível por todo o App + +Para que então você possa usar seu controller (ou uma classe Bloc) normalmente + +- Nota: Se você está usando o gerenciado de estado do Get, você não precisa se preocupar com isso, só leia a documentação, mas dê uma atenção a api [Bindings](#bindings), que vai fazer tudo isso automaticamente para você. +- Nota²: O gerenciamento de dependência do get é desacoplado de outras partes do package, então se por exemplo seu aplicativo já está usando um outro gerenciador de estado (qualquer um, não importa), você não precisa de reescrever tudo, pode simplesmente usar só a injeção de dependência sem problemas + +## Métodos de criar instâncias +Todos os métodos e seus parâmetros configuráveis são: + +### Get.put() +A forma mais comum de instanciar uma dependência. Bom para os controllers das views por exemplo. + +```dart +Get.put(Classe()); + +Get.put(LoginController(), permanent: true); + +Get.put( + ListItemController, + tag: "uma string única", +); +``` + +E essas são todas as opções que você pode definir: +```dart +Get.put( + // obrigatório: a classe que você quer salvar, como um controller ou qualquer outra coisa + // obs: Esse "S" significa que pode ser qualquer coisa + S dependency + + // opcional: isso é pra quando você quer múltiplas classess que são do mesmo tipo + // já que você normalmente pega usando "Get.find()", + // você precisa usar uma tag para dizer qual das instâncias vc precisa + // precisa ser uma string única + String tag, + + // opcional: por padrão, get vai descartar as instâncias quando elas não são mais usadas (exemplo, + // o controller de uma view que foi fechada) // Mas talvez você precisa quea instância seja mantida por todo o app, como a instância do SharedPreferences por exemplo + // então vc usa isso + // padrão: false + bool permanent = false, + + // opcional: permite criar a dependência usando uma função em vez da dependênia em si + InstanceBuilderCallback builder, +) +``` + +### Get.lazyPut +É possível que você vá inserir essa instância, mas sabe que não vai usá-la imediatamente no app. +Nesses casos pode ser usado o lazyPut que só cria a instância no momento que ela for necessária pela primeira vez. +É útil também caso seja uma classe que é muito pesada e você não quer carregar ela junto com tudo quando o app abre. + +```dart +/// ApiMock só será instanciado quando Get.find for usado pela primeira vez +Get.lazyPut(() => ApiMock()); + +Get.lazyPut( + () { + // ... alguma lógica se necessário + return FirebaseAuth(); + }, + tag: Math.random().toString(), + fenix: true +) + +Get.lazyPut( () => Controller() ) +``` + +E essas são todas as opções que você pode definir: +```dart +Get.lazyPut( + // obrigatório: um método que vai ser executado quando sua classe é chamada pela primeira vez + InstanceBuilderCallback builder, + + // opcional: igual ao Get.put(), é usado quando você precisa de múltiplas instâncias de uma mesma classe + // precisa ser uma string única + String tag, + + // opcional: é similar a "permanent", mas a instância é descartada quando + // não é mais usada e é refeita quando precisa ser usada novamente + // Assim como a opção SmartManagement.keepFactory na api Bindings + // padrão: false + bool fenix = false + +) +``` + +### Get.putAsync +Se você quiser criar uma instância assíncrona, você pode usar `Get.putAsync`: + +```dart +Get.putAsync(() async { + final prefs = await SharedPreferences.getInstance(); + await prefs.setInt('counter', 12345); + return prefs; +}); + +Get.putAsync( () async => await SuaClasseAssincrona() ) +``` + +E essas são todas as opções que você pode definir: +```dart +Get.putAsync( + + // Obrigatório: um método assíncrono que vai ser executado para instanciar sua classe + AsyncInstanceBuilderCallback builder, + + // opcional: igual ao Get.put(), é usado quando você precisa de múltiplas instâncias de uma mesma classe + // precisa ser uma string única + String tag, + + // opcional: igual ao Get.put(), usado quando você precisa manter a instância ativa no app inteiro. + // padrão: false + bool permanent = false +``` + +### Get.create +Esse é mais específico. Uma explicação detalhada do que esse método é e as diferenças dele para os outros podem ser encontradas em [Diferenças entre os métodos](#diferenças-entre-os-métodos) + + +```dart +Get.Create(() => SomeClass()); +Get.Create(() => LoginController()); +``` + +E essas são todas as opções que você pode definir: +```dart +Get.create( + // Obrigatório: Uma função que retorna uma classe que será "fabricada" toda vez que Get.find() for chamado + InstanceBuilderCallback builder, + + // opcional: igual ao Get.put(), mas é usado quando você precisa de múltiplas instâncias de uma mesma classe. + // Útil caso você tenha uma lista em que cada item precise de um controller próprio + // precisa ser uma string única. Apenas mudou o nome de tag para name. + String name, + + // opcional: igual ao Get.put(), usado quando você precisa manter a instância ativa no app inteiro. A diferença + // é que com Get.create o permanent está habilitado por padrão + bool permanent = true +``` + +## Usando as classes/dependências instanciadas + +Agora, imagine que você navegou por inúmeras rotas e precisa de dados que foram deixados para trás em seu controlador. Você precisaria de um gerenciador de estado combinado com o Provider ou Get_it, correto? Não com Get. Você só precisa pedir ao Get para "procurar" pelo seu controlador, você não precisa de nenhuma dependência adicional para isso: + +```dart +final controller = Get.find(); +// OU +Controller controller = Get.find(); +// Sim, parece Magia, o Get irá descobrir qual é seu controller, e irá te entregar. +// Você pode ter 1 milhão de controllers instanciados, o Get sempre te entregará o controller correto. +// Apenas se lembre de Tipar seu controller, final controller = Get.find(); por exemplo, não irá funcionar. +``` + +E então você será capaz de recuperar os dados do seu controller que foram obtidos anteriormente: + +```dart +Text(controller.textFromApi); +``` + +Já que o valor retornado é uma classe normal, você pode fazer o que quiser com ela: + +```dart +int valor = Get.find().getInt('contador'); +print(valor); // Imprime: 123456 +``` + +Para remover a instância do Get: + +```dart +Get.delete(); +``` + +## Diferenças entre os métodos + +Primeiro, vamos falar do `fenix` do Get.lazyPut e o `permanent` dos outros métodos. + +A diferença fundamental entre `permanent` e `fenix` está em como você quer armazenar as suas instâncias. + +Reforçando: por padrão, o Get apaga as instâncias quando elas não estão em uso. +Isso significa que: Se a tela 1 tem o controller 1 e a tela 2 tem o controller 2 e você remove a primeira rota da stack (usando `Get.off()` ou `Get.offNamed`), o controller 1 perdeu seu uso portanto será apagado. + +Mas se você optar por usar `permanent: true`, então ela não se perde nessa transição - o que é muito útil para serviços que você quer manter rodando na aplicação inteira. + +Já o `fenix`, é para serviços que você não se preocupa em perder por uma tela ou outra, mas quando você precisar chamar o serviço, você espera que ele "retorne das cinzas" (`fenix: true`), criando uma nova instância. + +Prosseguindo com as diferenças entre os métodos: + +- Get.put e Get.putAsync seguem a mesma ordem de criação, com a diferença que o Async opta por aplicar um método assíncrono: Esses dois métodos criam e já inicializam a instância. Esta é inserida diretamente na memória, através do método interno `insert` com os parâmetros `permanent: false` e `isSingleton: true` (esse parâmetro `isSingleton` serve apenas para dizer se é para utilizar a dependência colocada em `dependency`, ou se é para usar a dependência colocada no `InstanceBuilderCallback`). Depois disso, é chamado o `Get.find` que imediatamente inicializa as instâncias que estão na memória. + +- Get.create: Como o nome indica, você vai "criar" a sua dependência! Similar ao `Get.put`, ela também chama o método interno `insert` para instanciamento. Contudo, `permanent` e `isSingleton` passam a ser `true` e `false` (Como estamos "criando" a nossa dependência, não tem como ela ser um Singleton de algo, logo, `false`). E por ser `permanent: true`, temos por padrão o benefício de não se perder entre telas! Além disso, não é chamado o `Get.find`, logo ela fica esperando ser chamada para ser usada. Ele é criado dessa forma para aproveitar o uso do parâmetro `permanent`, já que, vale ressaltar, o Get.create foi criado com o objetivo de criar instâncias não compartilhadas, mas que não se perdem, como por exemplo um botão em um listView, que você quer uma instância única para aquela lista - por conta disso, o Get.create deve ser usado em conjunto com o GetWidget. + +- Get.lazyPut: Como o nome dá a entender, é um processo preguiçoso (lazy). A instância é criada, mas ela não é chamada para uso logo em seguida, ela fica aguardando ser chamada. Diferente dos outros métodos, o `insert` não é chamado. Ao invés disso, a instância é inserida em outra parte na memória, uma parte responsável por dizer se a instância pode ser recriada ou não, vamos chamá-la de "fábrica". Se queremos criar algo para ser chamado só depois, não vamos misturá-lo com as coisas que estão sendo usadas agora. E é aqui que entra a mágica do `fenix`. Se você optou por deixar `fenix: false`, e seu `smartManagement` não for `keepFactory`, então ao usar o `Get.find` a instância passa da "fábrica" para a área comum das instância. Em seguinda, por padrão é removida da "fábrica". Agora, se você optou por `fenix: true`, a instância continua a existir nessa parte dedicada, mesmo indo para a área comum, para ser chamada futuramente caso precise. + +## Bindings + +Um dos grandes diferenciais desse package, talvez, seja a possibilidade de integração total com rotas, gerenciador de estado e gerenciador de dependências. + +Quando uma rota é removida da stack, todos os controllers, variáveis e instâncias de objetos relacionados com ela são removidos da memória. Se você está usando streams ou timer, eles serão fechados automaticamente, e você não precisa se preocupar com nada disso. + +Na versão 2.10 Get implementou completamente a API Bindings. + +Agora você não precisa mais usar o método `init`. Você não precisa nem tipar seus controllers se não quiser. Você pode começar seus controllers e services num lugar apropriado para isso. + +A classe Binding é uma classe que vai desacoplar a injeção de dependência, enquanto liga as rotas ao gerenciador de estados e o gerenciador de dependências. + +Isso permite Get saber qual tela está sendo mostrada quando um controller particular é usado e saber onde e como descartar o mesmo. + +Somando a isso, a classe Binding vai permitir que você tenha um controle de configuração SmartManager. Você pode configurar as dependências que serão organizadas quando for remover a rota da stack, ou quando o widget que usa ele é definido, ou nada disso. Você vai ter gerenciador de dependências inteligente trabalhando para você, e você pode configurá-lo como quiser. + +### Classe Bindings + +Crie uma classe qualquer que implemente a Bindings. + +```dart +class HomeBinding implements Bindings {} +``` + +Sua IDE vai automaticamente te perguntar para dar override no método `dependencies()`, aí você clica na lâmpada, clica em "override the method", e insira todas as classes que você vai usar nessa rota: + +```dart +class HomeBinding implements Bindings{ + @override + void dependencies() { + Get.lazyPut(() => HomeController()); + Get.lazyPut(()=> Api()); + } +} + +class DetalhesBinding implements Bindings { + @override + void dependencies() { + Get.lazyPut(() => DetalhesController()); + } +} +``` + +Agora você só precisa informar sua rota que você vai usar esse binding para fazer a conexão entre os gerenciadores de rotas, dependências e estados. + +Usando rotas nomeadas + +```dart +getPages: [ + GetPage( + name: '/', + page: () => HomeView(), + binding: HomeBinding(), + ), + GetPage( + name: '/detalhes', + page: () => DetalhesView(), + binding: DetalhesBinding(), + ), +]; +``` + +Usando rotas normais: + +```dart +Get.to(Home(), binding: HomeBinding()); +Get.to(DetalhesView(), binding: DetalhesBinding()) +``` + +Então, você não vai precisar se preocupar com gerenciamento da memória da sua aplicação mais, Get vai fazer para você. + +A classe Bindings é chamada quando uma rota é chamada. Você pode criar uma Binding inicial no seu GetMaterialApp para inserir todas as dependências que serão criadas. + +```dart +GetMaterialApp( + initialBinding: SampleBind(), + home: Home(), +) +``` + +### BindingsBuilder + +A forma padrão de criar um binding é criando uma classe que implementa o Bindings. + +Mas alternativamente, você também pode usar a função `BindingsBuilder` par que você possa simplesmente usar uma função pra criar essas instâncias + +Exemplo: + +```dart +getPages: [ + GetPage( + name: '/', + page: () => HomeView(), + binding: BindingsBuilder(() { + Get.lazyPut(() => ControllerX()); + Get.put(()=> Api()); + }), + ), + GetPage( + name: '/detalhes', + page: () => DetalhesView(), + binding: BindingsBuilder(() { + Get.lazyPut(() => DetalhesController()); + }), + ), +]; +``` + +Dessa forma você pode evitar criar uma classe Binding para cada rota, deixando tudo mais simples. + +As duas formas funcionam perfeitamente e você é livre para usar o que mais se encaixa no seu estilo de uso + +### SmartManagement + +GetX por padrão descarta controllers não utilizados da memória, mesmo que uma falha ocorra e um widget que usa ele não for propriamente descartado. +Essa é o chamado modo `full` do gerenciamento de dependências. +Mas se você quiser mudar a forma que o GetX controla o descarte das classes, você tem a sua disposição a classe `SmartManagement` que pode definir diferentes comportamentos. + +#### Como alterar + +Se você quiser alterar essa configuração (que normalmente você não precisa mudar) essa é a forma: + +```dart +void main () { + runApp( + GetMaterialApp( + smartManagement: SmartManagement.onlyBuilders //Aqui + home: Home(), + ) + ) +} +``` + +#### SmartManagement.full + +É o padrão. Descarta as classes que não estão mais sendo utilizadas e que não foram definidas para serem permanents. Na grande maioria dos casos você não vai querer nem precisar alterar essa configuração. Se você for novo com GetX, não altere isto. + +#### SmartManagement.onlyBuilders +Com essa opção, somente controllers iniciados pelo `init:` or iniciados dentro de um Binding com `Get.lazyPut()` serão descartados. + +Se você usar `Get.put()` ou `Get.putAsync()` or qualquer outra forma, SmartManagement não vai ter permissão para excluir essa dependência. + +Com o comportamento padrão, até widgets instanciados com `Get.put()` serão removidos, ao contrário do `SmartManagement.onlyBuilders`. + +#### SmartManagement.keepFactory + +Assim como o modo `full`, ele vai descartar as dependências quando não estiverem sendo mais utilizadas. Porém, ele irá manter a "factory" de cada dependência. Isso significa que caso você precise de da dependência novamente, ele vai recriar aquele instância novamente. + +#### Como os Bindings funcionam +Bindings cria fábricas transitórias, que são criadas no momento que você clica para ir para outra tela, e será destruído assim que a animação de mudança de tela acontecer. +É tão pouco tempo, tão rápido, que o analyzer sequer conseguirá registrá-lo. +Quando você navegar para essa tela novamente, uma nova fábrica temporária será chamada, então isso é preferível à usar `SmartManagement.keepFactory`, mas se você não quer ter o trabalho de criar Bindings, ou deseja manter todas suas dependências no mesmo Binding, isso certamente irá te ajudar. +Fábricas ocupam pouca memória, elas não guardam instâncias, mas uma função com a "forma" daquela classe que você quer. +Isso é muito pouco, mas como o objetivo dessa lib é obter o máximo de desempenho possível usando o mínimo de recursos, Get remove até as fábricas por padrão. Use o que achar mais conveniente para você. + +## Notas + +* Nota: NÃO USE SmartManagement.keepfactory se você está usando vários Bindings. Ele foi criado para ser usado sem Bindings, ou com um único Binding ligado ao GetMaterialApp lá no `initialBinding` + +* Nota²: Usar Bindings é completamente opcional, você pode usar Get.put() e Get.find() em classes que usam o controller sem problemas. Porém, se você trabalhar com Services ou qualquer outra abstração, eu recomendo usar Bindings. Especialmente em grandes empresas. diff --git a/siro_rider/packages/get/documentation/pt_BR/route_management.md b/siro_rider/packages/get/documentation/pt_BR/route_management.md new file mode 100644 index 0000000..decce56 --- /dev/null +++ b/siro_rider/packages/get/documentation/pt_BR/route_management.md @@ -0,0 +1,558 @@ +- [Navegação sem rotas nomeadas](#navegação-sem-rotas-nomeadas) + - [SnackBars](#snackbars) + - [Dialogs](#dialogs) + - [BottomSheets](#bottomsheets) +- [Navegar com rotas nomeadas](#navegar-com-rotas-nomeadas) + - [Enviar dados para rotas nomeadas](#enviar-dados-para-rotas-nomeadas) + - [Links de Url dinâmicos](#links-de-url-dinâmicos) + - [Middleware](#middleware) + - [Change Theme](#change-theme) + - [Configurações Globais Opcionais](#configurações-globais-opcionais) + - [Nested Navigators](#nested-navigators) + +## Navegação sem rotas nomeadas + +Para navegar para uma próxima tela: + +```dart +Get.to(ProximaTela()); +``` + +Para fechar snackbars, dialogs, bottomsheets, ou qualquer coisa que você normalmente fecharia com o `Navigator.pop(context)` (como por exemplo fechar a View atual e voltar para a anterior): + +```dart +Get.back(); +``` + +Para ir para a próxima tela e NÃO deixar opção para voltar para a tela anterior (bom para SplashScreens, telas de login e etc.): + +```dart +Get.off(ProximaTela()); +``` + +Para ir para a próxima tela e cancelar todas as rotas anteriores (útil em telas de carrinho, votações ou testes): + +```dart +Get.offAll(ProximaTela()); +``` + +Para navegar para a próxima rota, e receber ou atualizar dados assim que retornar da rota: + +```dart +var dados = await Get.to(Pagamento()); +``` + +Na outra tela, envie os dados para a rota anterior: + +```dart +Get.back(result: 'sucesso'); +``` + +E use-os: + +```dart +if (dados == 'sucesso') fazerQualquerCoisa(); +``` + +Não quer aprender nossa sintaxe? +Apenas mude o `Navigator` (letra maiúscula) para `navigator` (letra minúscula), e você terá todas as funcionalidades de navegação padrão, sem precisar usar `context` + +Exemplo: + +```dart +// Navigator padrão do Flutter +Navigator.of(context).push( + context, + MaterialPageRoute( + builder: (BuildContext context) { + return HomePage(); + }, + ), +); + +// Get usando a sintaxe Flutter sem precisar do context +navigator.push( + MaterialPageRoute( + builder: (_) { + return HomePage(); + }, + ), +); + +// Sintaxe do Get (é bem melhor, mas você tem o direito de discordar) +Get.to(HomePage()); +``` + +### SnackBars + +Para ter um `SnackBar` simples no Flutter, você precisa do `context` do Scaffold, ou uma `GlobalKey` atrelada ao seu Scaffold. + +```dart +final snackBar = SnackBar( + content: Text('Olá!'), + action: SnackBarAction( + label: 'Eu sou uma SnackBar velha e feia :(', + onPressed: (){} + ), +); +// Encontra o Scaffold na árvore de Widgets e +// o usa para mostrar o SnackBar +Scaffold.of(context).showSnackBar(snackBar); +``` + +Com o Get: + +```dart +Get.snackbar('Olá', 'eu sou uma SnackBar moderna e linda!'); +``` + +Com Get, tudo que você precisa fazer é chamar `Get.snackbar()` de qualquer lugar no seu código, e/ou customizá-lo da forma que quiser! + +```dart +Get.snackbar( + "Ei, eu sou uma SnackBar Get!", // título + "É inacreditável! Eu estou usando uma SnackBar sem context, sem boilerplate, sem Scaffold!", // mensagem + icon: Icon(Icons.alarm), + shouldIconPulse: true, + onTap:(){}, + barBlur: 20, + isDismissible: true, + duration: Duration(seconds: 3), +); + + + ////////// TODOS OS RECURSOS ////////// + // Color colorText, + // Duration duration, + // SnackPosition snackPosition, + // Widget titleText, + // Widget messageText, + // bool instantInit, + // Widget icon, + // bool shouldIconPulse, + // double maxWidth, + // EdgeInsets margin, + // EdgeInsets padding, + // double borderRadius, + // Color borderColor, + // double borderWidth, + // Color backgroundColor, + // Color leftBarIndicatorColor, + // List boxShadows, + // Gradient backgroundGradient, + // TextButton mainButton, + // OnTap onTap, + // bool isDismissible, + // bool showProgressIndicator, + // AnimationController progressIndicatorController, + // Color progressIndicatorBackgroundColor, + // Animation progressIndicatorValueColor, + // SnackStyle snackStyle, + // Curve forwardAnimationCurve, + // Curve reverseAnimationCurve, + // Duration animationDuration, + // double barBlur, + // double overlayBlur, + // Color overlayColor, + // Form userInputForm + /////////////////////////////////// +``` + +Se você prefere a SnackBar tradicional, ou quer customizar por completo, como por exemplo fazer ele ter uma só linha (`Get.snackbar` tem os parâmetros `title` e `message` obrigatórios), você pode usar `Get.rawSnackbar();` que fornece a API bruta na qual `Get.snackbar` foi contruído. + +### Dialogs + +Para abrir um dialog: + +```dart +Get.dialog(SeuWidgetDialog()); +``` + +Para abrir um dialog padrão: + +```dart +Get.defaultDialog( + onConfirm: () => print("Ok"), + middleText: "Dialog made in 3 lines of code", +); +``` + +Você também pode usar `Get.generalDialog` em vez de `showGeneralDialog`. + +Para todos os outros Widgets do tipo dialog do Flutter, incluindo os do Cupertino, você pode usar `Get.overlayContext` em vez do `context`, e abrir em qualquer lugar do seu código. + +Para widgets que não usam `overlayContext`, você pode usar `Get.context`. Esses dois contextos vão funcionar em 99% dos casos para substituir o context da sua UI, exceto em casos onde o `inheritedWidget` é usado sem a navigation context. + +### BottomSheets + +`Get.bottomSheet()` é tipo o `showModalBottomSheet()`, mas não precisa do context. + +```dart +Get.bottomSheet( + Container( + child: Wrap( + children: [ + ListTile( + leading: Icon(Icons.music_note), + title: Text('Música'), + onTap: () {} + ), + ListTile( + leading: Icon(Icons.videocam), + title: Text('Vídeo'), + onTap: () {}, + ), + ], + ), + ), +); +``` + +## Navegar com rotas nomeadas + +- Se você prefere navegar por rotas nomeadas, Get também dá suporte a isso: + +Para navegar para uma nova tela + +```dart +Get.toNamed("/ProximaTela"); +``` + +Para navegar para uma tela sem a opção de voltar para a rota atual. + +```dart +Get.offNamed("/ProximaTela"); +``` + +Para navegar para uma nova tela e remover todas rotas anteriores da stack + +```dart +Get.offAllNamed("/ProximaTela"); +``` + +Para definir rotas, use o `GetMaterialApp`: + +```dart +void main() { + runApp( + GetMaterialApp( + initialRoute: '/', + getPages: [ + GetPage(name: '/', page: () => Home()), + GetPage(name: '/login', page: () => Login()), + GetPage(name: '/cadastro', page: () => Cadastro(), transition: Transition.cupertino), + ] + ) + ); +} +``` + +Para lidar com a navegação para rotas não definidas (erro 404), você pode definir uma página unknownRoute em GetMaterialApp. + +```dart +void main() { + runApp( + GetMaterialApp( + unknownRoute: GetPage(name: '/notfound', page: () => UnknownRoutePage()), + initialRoute: '/', + getPages: [ + GetPage(name: '/', page: () => MyHomePage()), + GetPage(name: '/second', page: () => Second()), + ], + ) + ); +} +``` + +### Enviar dados para rotas nomeadas + +Apenas envie o que você quiser no parâmetro `arguments`. Get aceita qualquer coisa aqui, seja String, Map, List, ou até a instância de uma classe. + +```dart +Get.toNamed("/ProximaTela", arguments: 'Get é o melhor'); +``` + +Na sua classe ou controller: + +```dart +print(Get.arguments); //valor: Get é o melhor +``` + +#### Links de Url dinâmicos + +Get oferece links de url dinâmicos assim como na Web. +Desenvolvedores Web provavelmente já queriam essa feature no Flutter, e muito provavelmente viram um package que promete essa feature mas entrega uma sintaxe totalmente diferente do que uma url teria na web, mas o Get também resolve isso. + +```dart +Get.offAllNamed("/ProximaTela?device=phone&id=354&name=Enzo"); +``` + +na sua classe controller/bloc/stateful/stateless: + +```dart +print(Get.parameters['id']); // valor: 354 +print(Get.parameters['name']); // valor: Enzo +``` + +Você também pode receber parâmetros nomeados com o Get facilmente: + +```dart +void main() => runApp( + GetMaterialApp( + initialRoute: '/', + getPages: [ + GetPage(name: '/', page: () => Home()), + /// Importante! ':user' não é uma nova rota, é somente uma + /// especificação do parâmentro. Não use '/segunda/:user/' e '/segunda' + /// se você precisa de uma nova rota para o user, então + /// use '/segunda/user/:user' se '/segunda' for uma rota + GetPage(name: '/segunda/:user', page: () => Segunda()), // recebe a ID + GetPage(name: '/terceira', page: () => Terceira(), transition: Transition.cupertino), + ] + ), +); +``` + +Envie dados na rota nomeada + +```dart +Get.toNamed("/segunda/34954"); +``` + +Na segunda tela receba os dados usando `Get.parameters[]` + +```dart +print(Get.parameters['user']); +// valor: 34954 +``` + + +ou envie vários parâmetros como este + +```dart +Get.toNamed("/profile/34954?flag=true"); +``` + +Na segunda tela, pegue os dados por parâmetros normalmente +```dart +print(Get.parameters['user']); +print(Get.parameters['flag']); +// valor: 34954 true +``` + + + +E agora, tudo que você precisa fazer é usar `Get.toNamed)` para navegar por suas rotas nomeadas, sem nenhum `context` (você pode chamar suas rotas diretamente do seu BLoc ou do Controller), e quando seu aplicativo é compilado para a web, suas rotas vão aparecer na url ❤ + +#### Middleware + +Se você quer escutar eventos do Get para ativar ações, você pode usar `routingCallback` para isso + +```dart +GetMaterialApp( + routingCallback: (route){ + if(routing.current == '/segunda'){ + openAds(); + } + } +) +``` + +Se você não estiver usando o `GetMaterialApp`, você pode usar a API manual para anexar um observer Middleware. + +```dart +void main() { + runApp( + MaterialApp( + onGenerateRoute: Router.generateRoute, + initialRoute: "/", + navigatorKey: Get.key, + navigatorObservers: [ + GetObserver(MiddleWare.observer), // AQUI !!! + ], + ) + ); +} +``` + +Criar uma classe MiddleWare + +```dart +class MiddleWare { + static observer(Routing routing) { + /// Você pode escutar junto com as rotas, snackbars, dialogs + /// e bottomsheets em cada tela. + /// Se você precisar entrar em algum um desses 3 eventos aqui diretamente, + /// você precisa especificar que o evento é != do que você está tentando fazer + if (routing.current == '/segunda' && !routing.isSnackbar) { + Get.snackbar("Olá", "Você está na segunda rota"); + } else if (routing.current =='/terceira'){ + print('última rota chamada'); + } + } +} +``` + +Agora, use Get no seu código: + +```dart +class Primeira extends StatelessWidget { + @override + Widget build(BuildContext context) { + return Scaffold( + appBar: AppBar( + leading: IconButton( + icon: Icon(Icons.add), + onPressed: () { + Get.snackbar("Oi", "eu sou uma snackbar moderna"); + }, + ), + title: Text('Primeira rota'), + ), + body: Center( + child: ElevatedButton( + child: Text('Abrir rota'), + onPressed: () { + Get.toNamed("/segunda"); + }, + ), + ), + ); + } +} + +class Segunda extends StatelessWidget { + @override + Widget build(BuildContext context) { + return Scaffold( + appBar: AppBar( + leading: IconButton( + icon: Icon(Icons.add), + onPressed: () { + Get.snackbar("Oi", "eu sou uma snackbar moderna"); + }, + ), + title: Text('Segunda rota'), + ), + body: Center( + child: ElevatedButton( + child: Text('Abrir rota'), + onPressed: () { + Get.toNamed("/terceira"); + }, + ), + ), + ); + } +} + +class Terceira extends StatelessWidget { + @override + Widget build(BuildContext context) { + return Scaffold( + appBar: AppBar( + title: Text("Terceira Rota"), + ), + body: Center( + child: ElevatedButton( + onPressed: () { + Get.back(); + }, + child: Text('Voltar!'), + ), + ), + ); + } +} +``` + +### Change Theme + +Por favor não use nenhum widget acima do `GetMaterialApp` para atualizá-lo. Isso pode ativar keys duplicadas. Muitas pessoas estão acostumadas com a forma pré-história de criar um widget `ThemeProvider` só pra mudar o tema do seu app, e isso definitamente NÃO é necessário com o Get. + +Você pode criar seu tema customizado e simplesmente adicionar ele dentro de `Get.changeTheme()` sem nenhum boilerplate para isso: + +```dart +Get.changeTheme(ThemeData.light()); +``` + +Se você quer criar algo como um botão que muda o tema com um toque, você pode combinar duas APIs do Get para isso, a API que checa se o tema dark está sendo usado, e a API de mudança de tema. E dentro de um `onPressed` você coloca isso: + +```dart +Get.changeTheme(Get.isDarkMode? ThemeData.light(): ThemeData.dark()); +``` + +Quando o modo escuro está ativado, ele vai alterar para o modo claro, e vice versa. + +Se você quer saber a fundo como mudar o tema, você pode seguir esse tutorial no Medium que até te ensina a persistir o tema usando Get e shared_preferences: + +- [Dynamic Themes in 3 lines using Get](https://medium.com/swlh/flutter-dynamic-themes-in-3-lines-c3b375f292e3) - Tutorial by [Rod Brown](https://github.com/RodBr). + +### Configurações Globais Opcionais + +Você pode mudar configurações globais para o Get. Apenas adicione `Get.config` no seu código antes de ir para qualquer rota ou faça diretamente no seu GetMaterialApp + +```dart +// essa forma +GetMaterialApp( + enableLog: true, + defaultTransition: Transition.fade, + opaqueRoute: Get.isOpaqueRouteDefault, + popGesture: Get.isPopGestureEnable, + transitionDuration: Get.defaultDurationTransition, + defaultGlobalState: Get.defaultGlobalState, +); + +// ou essa +Get.config( + enableLog = true, + defaultPopGesture = true, + defaultTransition = Transitions.cupertino +) +``` +### Nested Navigators + +Get fez a navegação aninhada no Flutter mais fácil ainda. Você não precisa do `context`, e você encontrará sua `navigation stack` pela ID. + +* Nota: Criar navegação paralela em stacks pode ser perigoso. O idela é não usar `NestedNavigators`, ou usar com moderação. Se o seu projeto requer isso, vá em frente, mas fique ciente que manter múltiplas stacks de navegação na memória pode não ser uma boa ideia no quesito consumo de RAM. + +Veja como é simples: +```dart +Navigator( + key: nestedKey(1), // crie uma key com um index + initialRoute: '/', + onGenerateRoute: (settings) { + if (settings.name == '/') { + return GetPageRoute( + page: () => Scaffold( + appBar: AppBar( + title: Text("Principal"), + ), + body: Center( + child: TextButton( + color: Colors.blue, + child: Text("Ir para a segunda"), + onPressed: () { + Get.toNamed('/segunda', id:1); // navega pela sua navegação aninhada usando o index + }, + ) + ), + ), + ); + } else if (settings.name == '/segunda') { + return GetPageRoute( + page: () => Center( + child: Scaffold( + appBar: AppBar( + title: Text("Principal"), + ), + body: Center( + child: Text("Segunda") + ), + ), + ), + ); + } + } +), +``` diff --git a/siro_rider/packages/get/documentation/pt_BR/state_management.md b/siro_rider/packages/get/documentation/pt_BR/state_management.md new file mode 100644 index 0000000..85f82e4 --- /dev/null +++ b/siro_rider/packages/get/documentation/pt_BR/state_management.md @@ -0,0 +1,501 @@ +- [Simple State Manager](#simple-state-manager) + - [Uso do gerenciador de estado simples](#uso-do-gerenciador-de-estado-simples) + - [Sem StatefulWidget](#sem-statefulwidget) + - [Formas de uso](#formas-de-uso) +- [Reactive State Manager](#reactive-state-manager) + - [GetX vs GetBuilder vs Obx vs MixinBuilder](#getx-vs-getbuilder-vs-obx-vs-mixinbuilder) +- [Workers](#workers) + +## Simple State Manager + +Há atualmente vários gerenciadores de estados para o Flutter. Porém, a maioria deles envolve usar `ChangeNotifier` para atualizar os widgets e isso é uma abordagem muito ruim no quesito performance em aplicações de médio ou grande porte. Você pode checar na documentação oficial do Flutter que o [`ChangeNotifier` deveria ser usado com um ou no máximo dois listeners](https://api.flutter.dev/flutter/foundation/ChangeNotifier-class.html), fazendo-o praticamente inutilizável em qualquer aplicação média ou grande. + +Outros gerenciadores de estado são bons, mas tem suas nuances. + +* BLoC é bem seguro e eficiente, mas é muito complexo (especialmente para iniciantes), o que impediu pessoas de desenvolverem com Flutter. +* MobX é mais fácil que o BLoc e é reativo, quase perfeito eu diria, mas você precisa usar um code generator que, para aplicações de grande porte, reduz a produtividade (você terá que beber vários cafés até que seu código esteja pronto denovo depois de um `flutter clean`, o que não é culpa do MobX, na verdade o code generator que é muito lento!). +* Provider usa o `InheritedWidget` para entregar o mesmo listener, como uma forma de solucionar o problema reportado acima com o ChangeNotifier, o que indica que qualquer acesso ao ChangeNotifier dele tem que ser dentro da árvore de widgets por causa do `context` necessário para acessar o Inherited. + +Get não é melhor ou pior que nenhum gerenciador de estado, mas você deveria analisar esses pontos tanto quanto os argumentos abaixo para escolher entre usar Get na sua forma pura, ou usando-o em conjunto com outro gerenciador de estado. + +Definitivamente, Get não é o inimigo de nenhum gerenciador, porque Get é um microframework, não apenas um gerenciador, e pode ser usado tanto sozinho quanto em conjunto com eles. + +Get tem um gerenciador de estado que é extremamente leve e fácil que não usa ChangeNotifier, vai atender a necessidade especialmente daqueles novos no Flutter, e não vai causar problemas em aplicações de grande porte. + +**Que melhoras na performance o Get traz?** + +1. Atualiza somente o widget necessário. + +2. Não usa o `ChangeNotifier`, é o gerenciador de estado que utiliza menos memória (próximo de 0mb até agora). + +3. Esqueça StatefulWidget's! Com Get você nunca mais vai precisar deles. Com outros gerenciadores de estado, você provavelmente precisa usar um StatefulWidget para pegar a instância do seu Provider, BLoc, MobX controller, etc. Mas já parou para pensar que seu AppBar, seu Scaffold e a maioria dos widgets que estão na sua classe são stateless? Então porque salvar o estado de uma classe inteira, se você pode salvar somente o estado de um widget stateful? Get resolve isso também. Crie uma classe Stateless, faça tudo stateless. Se você precisar atualizar um único componente, envolva ele com o `GetBuilder`, e seu estado será mantido. + +4. Organize seu projeto de verdade! Controllers não devem ficar na sua UI, coloque seus `TextEditController`, ou qualquer controller que você usa dentro da classe Controller. + +5. Você precisa acionar um evento para atualizar um widget assim que ele é renderizado? GetBuilder tem a propriedade `initState()` assim como um StatefulWidget, e você pode acionar eventos a partir do seu controller, diretamente de lá. Sem mais de eventos serem colocados no initState. + +6. Você precisa acionar uma ação como fechar Streams, timers, etc? GetBuilder também tem a propriedade `dispose()`, onde você pode acionar eventos assim que o widget é destruído. + +7. Use `Stream`s somente se necessário. Você pode usar seus StreamControllers dentro do seu controller normalmente, e usar `StreamBuilder` normalmente também, mas lembre-se, um Stream consume uma memória razoável, programação reativa é linda, mas você não abuse. 30 Streams abertos simultaneamente podem ser ainda piores que o `ChangeNotifier` (e olha que o ChangeNotifier é bem ruim) + +8. Atualizar widgets sem gastar memória com isso. Get guarda somente a "ID do criador" do GetBuilder, e atualiza esse GetBuilder quando necessário. O consumo de memória do ID do GetBuilder é muito baixo mesmo para milhares de GetBuilders. Quando você cria um novo GetBuilder, na verdade você está compartilhando o estado do GetBuilder quem tem um ID do creator. Um novo estado não é criado para cada GetBuilder, o que reduz MUITO o consumo de memória RAM em aplicações grandes. Basicamente sua aplicação vai ser toda stateless, e os poucos widgets que serão Stateful (dentro do GetBuilder) vão ter um estado único, e assim atualizar um deles vai atualizar todos eles. O estado é um só. + +9. Get é onisciente e na maioria dos casos sabe o momento exato de tirar um controller da memória. Você não precisa se preocupar com quando descartar o controller, Get sabe o melhor momento para fazer isso. + +Vamos analisar o seguite exemplo: + +`Class A => Class B (ControllerX) => Class C (ControllerX)` + +* Na classe A o controller não está ainda na memória, porque você ainda não o usou (Get carrega só quando precisa). + +* Na classe B você usou o controller, e ele entrou na memória. + +* Na classe C você usou o mesmo controller da classe B, então o Get vai compartilhar o estado do controller B com o controller C, e o mesmo controller ainda estará na memória. + +* Se você fechar a classe C e classe B, Get vai tirar o controller X da memória automaticamente e liberar recursos, porque a classe A não está usando o controller. + +* Se você navegar para a Classe B denovo, o controller X vai entrar na memória denovo. + +* Se em vez de ir para a classe C você voltar para a classe A, Get vai tirar o controller da memória do mesmo jeito. + +* Se a classe C não usar o controller, e você tirar a classe B da memória, nenhuma classe estaria usando o controller X, e novamente o controller seria descartado. + +**Nota**: A única exceção que pode atrapalhar o Get, é se +Você remover classe B da rota de forma inesperada, e tentasse usar o controller na classe C. Nesse caso, o ID do creator do controller que estava em B seria deletado, e o Get foi programado para remover da memória todo controller que não tem nenhum ID de creator. Se é sua intenção fazer isso, adicione a config `autoRemove: false` no GetBuilder da classe B, e use `adoptID = true;` no GetBuilder da classe C. + +### Uso do gerenciador de estado simples + +```dart +// Crie a classe Controller e entenda ela do GetController +class Controller extends GetController { + int counter = 0; + void increment() { + counter++; + update(); // use update() para atualizar a variável counter na UI quando increment for chamado + } +} +// Na sua classe Stateless/Stateful, use o GetBuilder para atualizar o texto quando a função increment for chamada +GetBuilder( + init: Controller(), // INICIE O CONTROLLER SOMENTE NA PRIMEIRA VEZ + builder: (controller) => Text( + '${controller.counter}', + ), +), +// Inicialize seu controller somente uma vez. Na segunda vez que você for usar GetBuilder para o mesmo controller, não Inicialize denovo. Seu controller será automaticamente removido da memória. Você não precisa se preocupar com isso, Get vai fazer isso automaticamente, apenas tenha certeza que você não vai inicializar o mesmo controller duas vezes. +``` + +**Feito!** + +Você já aprendeu como gerenciar estados com o Get. + +Nota: Você talvez queira uma maior organização, e não querer usar a propriedade `init`. Para isso, você pode criar uma classe e extendê-la da classe `Bindings`, e nela mencionar os controllers que serão criados dentro daquela rota. Controllers não serão criados naquele momento exato, muito pelo contrário, isso é apenas uma declaração, para que na primeira vez que vc use um Controller, Get vai saber onde procurar. Get vai continuar no formato "lazyLoad" (carrega somente quando necessário) e vai continuar descartando os Controllers quando eles não forem mais necessários. Veja pub.dev example para ver como funciona. + +Se você navegar por várias rotas e precisa de algum dado que estava em um outro controller previamente utilizado, você só precisa utilizar o GetBuilder novamente (sem o init): + +```dart +class OutraClasse extends StatelessWidget { + @override + Widget build(BuildContext context) { + return Scaffold( + body: Center( + child: GetBuilder( + builder: (s) => Text('${s.counter}'), + ), + ), + ); + } +} +``` + +Se você precisa utilizar seu controller em vários outros lugares, e fora do GetBuilder, apenas crie um getter no seu controller que você consegue ele facilmente (ou use `Get.find()` ) + +```dart +class Controller extends GetController { + + /// Você não precisa disso. Eu recomendo usar isso apenas + /// porque a sintaxe é mais fácil. + /// com o método estático: Controller.to.increment(); + /// sem o método estático: Get.find().increment(); + /// Não há diferença em performance, nem efeito colateral por usar esse sintaxe. Só uma não precisa da tipage, e a outra forma a IDE vai autocompletar. + static Controller get to => Get.find(); // adicione esta linha + + int counter = 0; + void increment() { + counter++; + update(); + } +} +``` + +E então você pode acessar seu controller diretamente, desse jeito: + +```dart +FloatingActionButton( + onPressed:(){ + Controller.to.increment(), + } // Isso é incrivelmente simples! + child: Text("${Controller.to.counter}"), +), +``` + +Quando você pressionar o FloatingActionButton, todos os widgets que estão escutando a variável `counter` serão atualizados automaticamente. + +#### Sem StatefulWidget + +Usar StatefulWidget's significa guardar o estado de telas inteiras desnecessariamente, mesmo porque se você precisa recarregar minimamente algum widget, você vai incorporá-lo num Consumer/Observer/BlocProvider/GetBuilder/GetX/Obx, que vai ser outro StatefulWidget. +A classe StatefulWidget é maior que a classe StatelessWidget, o que vai alocar mais memória, e isso pode não fazer uma diferença significativa com uma ou duas classes, mas com certeza fará quando você tiver 100 delas! + +A não ser que você precise usar um mixin, como o `TickerProviderStateMixin`, será totalmente desnecessário usar um StatefulWidget com o Get. + +Você pode chamar todos os métodos de um StatefulWidget diretamente de um GetBuilder. +Se você precisa chamar o método `initState()` ou `dispose()` por exemplo, é possível chamá-los diretamente: + +```dart +GetBuilder( + initState: (_) => Controller.to.fetchApi(), + dispose: (_) => Controller.to.closeStreams(), + builder: (s) => Text('${s.username}'), +), +``` + +Uma abordagem muito melhor que isso é usar os métodos `onInit()` e `onClose()` diretamente do seu controller. + +```dart +@override +void onInit() { + fetchApi(); + super.onInit(); +} +``` + +* Nota: Se você quiser executar um método no momento que o controller é chamado pela primeira vez, você NÃO precisa usar construtores para isso, na verdade, usando um package que é focado em performance como o Get, isso chega no limite de má prática, porque se desvia da lógica de que os controllers são criados ou alocados (Se você criar uma instância desse controller, o construtor vai ser chamado imediatamente, e ele será populado antes de ser usado, ou seja, você está alocando memória e não está utilizando, o que fere os princípios desse package). Os métodos `onInit()` e `onClose()` foram criados para isso, eles serão chamados quando o controller é criado, ou usados pela primeira vez, dependendo de como você está utilizando o Get (lazyPut ou não). Se quiser, por exemplo, fazer uma chamada para sua API para popular dados, você pode esquecer do estilo antigo de usar `initState()/dispose()`, apenas comece sua chamada para a api no `onInit`, e apenas se você precisar executar algum comando como fechar stream, use o `onClose()`. + +O propósito desse package é precisamente te dar uma solução completa para navegação de rotas, gerenciamente de dependências e estados, usando o mínimo possível de dependências, com um alto grau de desacoplamento. Get envolve em todas as APIs de baixo e alto nível dentro de si mesmo, para ter certeza que você irá trabalhar com o mínimo possível de acoplamento. + +Nós centralizamos tudo em um único package. Dessa forma, você pode colocar somente widgets na sua view, e o controller pode ter só lógica de negócio, sem depender de nenhum elemento da View. Isso fornece um ambiente de trabalho muito mais limpo, para que parte do seu time possa trabalhar apenas com os widgets, sem se preocupar sobre enviar dados para o controller, e outra parte se preocupe apenas com a lógica de negócio, sem depender de nenhum elemento da view. + +Então, para simplificar isso: + +Você não precisa chamar métodos no `initState()` e enviá-los para seu controller via parâmetros, nem precisa do construtor do controller pra isso, você possui o método `onInit()` que é chamado no momento certo para você inicializar seus services. + +Você não precisa chamar o método `dispose()`, você tem o método `onClose()` que vai ser chamado no momento exato quando seu controller não for mais necessário e será removido da memória. Dessa forma, você pode deixar a view somente para os widgets, e o controller só para as regras de negócio. + +Não chame o método `dispose()` dentro do GetController, não vai fazer nada. Lembre-se que o controller não é um widget, você não deveria usar o dispose lá, e esse método será automaticamente e inteligentemente removido da memória pelo Get. Se você usou algum stream no controller e quer fechá-lo, apenas insira o método para fechar os stream dentro do método `onClose()`. + +Exemplo: + +```dart +class Controller extends GetController { + var user = StreamController(); + var name = StreamController(); + + /// fechar stream = método onClose(), não dispose(). + @override + void onClose() { + user.close(); + name.close(); + super.onClose(); + } +} +``` + +Ciclo de vida do controller: + +* `onInit()`: Onde ele é criado. +* `onClose()`: Onde ele é fechado para fazer mudanças em preparação para o método delete() +* deleted: Você não tem acesso a essa API porque ela está literalmente removendo o controller da memória. Está literalmente deletado, sem deixar rastros. + +##### Formas de uso + +Você pode usar uma instância do Controller diretamente no `value` do GetBuilder + +```dart +GetBuilder( + init: Controller(), + builder: (value) => Text( + '${value.counter}', //aqui + ) +), +``` + +Você talvez também precise de uma instância do seu controller fora do GetBuilder, e você pode usar essas abordagens para conseguir isso: + +essa: + +```dart +class Controller extends GetController { + static Controller get to => Get.find(); // criando um getter estático + [...] +} +// Na sua view/tela +GetBuilder( + init: Controller(), // use somente uma vez por controller, não se esqueça + builder: (_) => Text( + '${Controller.to.counter}', //aqui + ) +), +``` + +ou essa: + +```dart +class Controller extends GetController { + // sem nenhum método estático +[...] +} +// Numa classe stateful/stateless +GetBuilder( + init: Controller(), // use somente uma vez por controller, não se esqueça + builder: (_) => Text( + '${Get.find().counter}', //aqui + ) +), +``` + +* Você pode usar outras abordagens "menos regulares". Se você está utilizando outro gerenciador de dependências, como o get_it, modular, etc., e só quer entregar a instância do controller, pode fazer isso: + +```dart +Controller controller = Controller(); +[...] +GetBuilder( + init: controller, //aqui + builder: (_) => Text( + '${controller.counter}', // aqui + ) +), + +``` + +Essa abordagem não é recomendada, uma vez que você vai precisar descartar os controllers manualmente, fechar seus stream manualmente, e literalmente abandonar um dos grandes benefícios desse package, que é controle de memória inteligente. Mas se você confia no seu potencial, vai em frente! + +Se você quiser refinar o controle de atualização de widgets do GetBuilder, você pode assinalar a ele IDs únicas + +```dart +GetBuilder( + id: 'text' + init: Controller(), // use somente uma vez por controller, não se esqueça + builder: (_) => Text( + '${Get.find().counter}', //aqui + ) +), +``` + +E atualizá-los dessa forma: + +```dart +update(['text']); +``` + +Você também pode impor condições para o update acontecer: + +```dart +update(['text'], counter < 10); +``` + +GetX faz isso automaticamente e somente reconstrói o widget que usa a exata variável que foi alterada. Se você alterar o valor da variável para o mesmo valor que ela era anteriormente e isso não sugira uma mudança de estado, GetX não vai reconstruir esse widget, economizando memória e ciclos de CPU (Ex: 3 está sendo mostrado na tela, e você muda a variável para ter o valor 3 denovo. Na maioria dos gerenciadores de estado, isso vai causar uma reconstrução do widget, mas com o GetX o widget só vai reconstruir se de fato o estado mudou). + +GetBuilder é focado precisamente em múltiplos controles de estados. Imagine que você adicionou 30 produtos ao carrinho, você clica pra deletar um deles, e ao mesmo tempos a lista é atualizada, o preço é atualizado e o pequeno círculo mostrando a quantidade de produtos é atualizado. Esse tipo de abordagem faz o GetBuilder excelente, porque ele agupa estados e muda todos eles de uma vez sem nenhuma "lógica computacional" pra isso. GetBuilder foi criado com esse tipo de situação em mente, já que pra mudanças de estados simples, você pode simplesmente usar o `setState()`, e você não vai precisar de um gerenciador de estado para isso. Porém, há situações onde você quer somente que o widget onde uma certa variável mudou seja reconstruído, e isso é o que o GetX faz com uma maestria nunca vista antes. + +Dessa forma, se você quiser controlar individualmente, você pode assinalar ID's para isso, ou usar GetX. Isso é com você, apenas lembre-se que quando mais "widgets individuais" você tiver, mais a performance do GetX vai se sobressair. Mas o GetBuilder vai ser superior quando há multiplas mudanças de estado. + +Você pode usar os dois em qualquer situação, mas se quiser refinar a aplicação para a melhor performance possível, eu diria isso: se as suas variáveis são alteradas em momentos diferentes, use GetX, porque não tem competição para isso quando o widget é para reconstruir somente o que é necessário. Se você não precisa de IDs únicas, porque todas as suas variáveis serão alteradas quando você fazer uma ação, use GetBuilder, porque é um atualizador de estado em blocos simples, feito com apenas algumas linhas de código, para fazer justamente o que ele promete fazer: atualizar estado em blocos. Não há forma de comparar RAM, CPU, etc de um gerenciador de estado gigante com um simples StatefulWidget (como GetBuilder) que é atualizado quando você chama `update()`. Foi feito de uma forma simples, para ter o mínimo de lógica computacional, somente para cumprir um único papel e gastar o mínimo de recursos possível. +Se você quer um gerenciador de estados poderoso, você pode ir sem medo para o GetX. Ele não funciona com variáveis, mas sim fluxos. Tudo está em seus streams por baixo dos panos. Você pode usar `rxDart` em conjunto com ele, porque tudo é um stream, você pode ouvir o evento de cada "variável", porque tudo é um stream, é literalmente BLoc, só que mais fácil que MobX e sem code generators ou decorations. + +## Reactive State Manager + +Se você quer poder, Get té dá o mais avançado gerenciador de estado que você pode ter. +GetX foi construído 100% baseado em Stream, e te dá todo o poder de fogo que o BLoc te dá, com uma sintaxe mais fácil que a do MobX. +Sem decorations, você poder tornar qualquer coisa em um `Observable` com somete um `.obs` + +Performance máxima: Somando ao fato de ter um algoritmo inteligente para reconstrução mínima, Get usa comparadores para ter certeza que o estado mudou. Se você encontrar erros na sua aplicação, e enviar uma mudança de estado duplicada, Get vai ter certeza que sua aplicação não entre em colapso. + +O estado só muda se o valor mudar. Essa é a principal diferença entre Get, e usar o `Computed` do MobX. Quando juntar dois observables, se um deles é alterado, a escuta daquele observable vai mudar. Com Get, se você juntar duas variáveis (que na verdade é desnecessário), GetX(similar ao Observer) vai somente mudar se implicar numa mudança real de estado. Exemplo: + +```dart +final count1 = 0.obs; +final count2 = 0.obs; +int get sum => count1.value + count2.value; +``` + +```dart +GetX( + builder: (_) { + print("count 1 foi reconstruído"); + return Text('${_.count1.value}'); + }, +), +GetX( + builder: (_) { + print("count 2 foi reconstruído"); + return Text('${_.count2.value}'); + }, +), +GetX( + builder: (_) { + print("sum foi reconstruído"); + return Text('${_.sum}'); + }, +), +``` + +Se nós incrementarmos o número do `count1`, somente `count1` e `sum` serão reconstruídos, porque `count1` agora tem um valor de 1, e 1 + 0 = 1, alterando o valor do `sum`. + +Se nós mudarmos `count2`, somente `count2` e `sum` serão reconstruídos, porque o valor do 2 mudou, e o resultado da variável `sum` é agora 2. + +Se definirmos o valor de `count1` para 1, nenhum widget será reconstruído, porque o valor já era 1. + +Se definirmos o valor de `count1` para 1 denovo, e definirmos o valor de `count2` para 2, então somente o `count2`e o `sum` vão ser reconstruídos, simplesmente porque o GetX não somente altera o que for necessário, ele também evita eventos duplicados. + +Somando a isso, Get provê um controle de estado refinado. Você pode adicionar uma condição a um evento (como adicionar um objeto a uma lista). + +```dart +list.addIf(item < limit, item); +``` + +Sem decorations, sem code generator, sem complicações, GetX vai mudar a forma que você controla seus estados no Flutter, e isso não é uma promessa, isso é uma certeza! + +Sabe o app de contador do Flutter? Sua classe Controller pode ficar assim: + +```dart +class CountController extends RxController { + final count = 0.obs; +} +``` + +E com um simples: + +```dart +controller.count.value++ +``` + +Você pode atualizar a variável counter na sua UI, independente de onde esteja sendo armazenada. + +Você pode transformar qualquer coisa em obs: + +```dart +class RxUsuario { + final nome = "Camila".obs; + final idade = 18.obs; +} + +class Usuario { + Usuario({String nome, int idade}); + final rx = RxUsuario(); + + String get nome => rx.nome.value; + set nome(String value) => rx.nome.value = value; + + int get idade => rx.idade.value; + set idade(int value) => rx.idade.value = value; +} +``` + +```dart + +void main() { + final usuario = Usuario(); + print(usuario.nome); + usuario.idade = 23; + usuario.rx.idade.listen((int idade) => print(idade)); + usuario.idade = 24; + usuario.idade = 25; +} +___________ +saída: +Camila +23 +24 +25 +``` + +Trabalhar com `Lists` usando Get é algo muito agradável. Elas são completamente observáveis assim como os objetos dentro dela. Dessa forma, se você adicionar uma valor a lista, ela vai automaticamente reconstruir os widgets que a usam. + +Você também não precisa usar `.value` com listas, a api dart nos permitiu remover isso. Infelizmente tipos primitivos como String e int não podem ser extendidos, fazend o uso de `.value` obrigatório, mas isso não será um problema se você usar getters e setters para esses. + +```dart +final list = List().obs; + +ListView.builder ( +itemCount: list.length +) +``` + +Você não precisa trabalhar com sets se não quiser. Você pode usar as APIs `assign` e `assignAll` + +A api `assign` vai limpar sua lista e adicionar um único objeto que você quer. + +A api `assignAll` vai limpar sua lista e vai adicionar objetos `Iterable` que você precisa. + +Nós poderíamos remover a obrigação de usar o value em String e int com uma simples decoration e code generator, mas o propósito desse package é precisamente não precisar de nenhuma dependência externa. É para oferecer um ambiente pronto para programar, envolvendo os essenciais (gerenciamento de rotas, dependências e estados), numa forma simples, leve e performática sem precisar de packages externos. Você pode literalmente adicionar 3 letras e um ':' no seu pubspec.yaml e começar a programar. Todas as soluções incluídas por padrão, miram em facilidade, produtividade e performance. + +O peso total desse package é menor que o de um único gerenciador de estado, mesmo sendo uma solução completa, e isso é o que você precisa entender. + +Se você está incomodado com o `.value`, e gosta de code generator, MobX é uma excelente alternativa, e você pode usá-lo em conjunto com o Get. Para aqueles que querem adicionar uma única dependência no pubspec.yaml e começar a programar sem se preocupar sobre a versão de um package sendo incompatível com outra, ou se o erro de uma atualização do estado está vindo do gerenciador de estado ou da dependência, ou ainda, não quer se preocupar com a disponibilidade de controllers, prefere literalmente "só programar", Get é perfeito. + +Agora se você não tem problemas com o code generator do MobX, ou não vê problema no boilerplate do BLoc, você pode simplesmente usar o Get para rotas, e esquecer que nele existe um gerenciador de estado. Get nasceu da necessidade, minha empresa tinha um projeto com mais de 90 controllers e o code generator simplesmente levava mais de 30 minutos para completar suas tarefas depois de um `flutter clean` numa máquina razoavelmente boa, se o seu projeto tem 5, 10, 15 controllers, qualquer gerenciador de estado vai ter satisfazer. + +Se você tem um projeto absurdamente grande, e code generator é um problema para você, então você foi presenteado com essa solução que é o Get. + +Obviamente, se alguém quiser contribuir para o projeto e criar um code generator, or algo similar, eu vou linkar no README como uma alternativa, minha necessidade não é a necessidade de todos os devs, mas por agora eu digo: há boas soluções que já fazem isso, como MobX. + +Tipagem no Get usando Bindings é desnecessário. Você pode usar o widget `Obx()` em vez do GetX, e ele só recebe a função anônima que cria o widget. + +### GetX vs GetBuilder vs Obx vs MixinBuilder + +Em uma década de trabalho com programação eu fui capaz de aprender umas lições valiosas. + +Meu primeiro contato com programação reactiva foi tão "Nossa, isso é incrível" e de fato é incrível. + +Porém, não é ideal para todas as situações. De vez em quando tudo que você precisa é mudar o estado de duas ou três variáveis ao mesmo tempo, ou uma mudança de estado diferente, que nesses casos a programação reativa não é ruim, mas não é apropriado. + +Programação reativa tem um consumo de RAM maior que pode ser compensado pelo fluxo individual, que vai se encarregar que apenas o Widget necessário é reconstruído, mas criar uma lista com 80 objetos, cada um com vários streams não é uma boa ideia. Abra o `dart inspect` e cheque quando um StreamBuilder consome, e você vai entender o que eu estou tentando dizer a você. + +Com isso em mente, eu criar o gerenciador de estados simples. É simples, e é exatamente o que você deve exigir dele: alterar vários estados em blocos de uma forma simples, e mais econômico possível. + +GetBuilder economiza muito quando se trata de RAM, e dificilmente vai existir uma forma mais econômica de lidar com isso do que ele (pelo menos eu não consigo imaginar nenhum. Se existir, me avise). + +Entretando, GetBuilder ainda é um gerenciador de estados "mecânico", você precisa chamar o `update()` assim como você faria com o `notifyListeners()` do `Provider`. + +Há outras situações onde a programação reativa é muito interessante, e não trabalhar com ela é a mesma coisa que reinventar a roda. Com isso em mente, GetX foi criado para prover tudo que há de mais moder e avançado num gerenciado de estado. Ele atualiza somente o que é necessário quando for necessário. Se por exemplo você tiver um erro que mande 300 alterações de estado simultaneamente, GetX vai filtrar e alterar a tela somente se o estado mudar de verdade. + +GetX ainda é mais econômico que qualquer outro gerenciador de estados reativo, mas consome um pouco mais de RAM do que o GetBuilder. Pensando nisso e mirando em minimizar o consumo de recursos que o Obx foi criado. + +Ao contrário de GetX e GetBuilder, você não será capaz de inicializar o controller dentro do Obx, é só um Widget com um `StreamSubscription` que recebe eventos de mundança das childrens ou child, só isso. É mais econômico que o GetX, mas perde para o GetBuilder, que é nada mais que o esperado, já que é reativo. GetBuilder tem uma das formas mais simplística que existe, de guardar o hashcode de um Widget e seu StateSetter. Com Obs você não precisa escrever seu tipo de controller, e você pode ouvir mudanças de múltiplos controllers diferentes, mas eles precisam ser inicializados antes, tanto usando o forma demonstrada no exemplo no início desse README, ou usando a classe `Bindings` + +Concluindo, uma pessoa abriu um pedido para uma feature nova, como ele queria usar somente um tipo de variável reativa, e precisava inserir um Obx junto do GetBuilder para isso. Pensando nisso, `MixinBuilder` foi criado. Ele permite as duas formas de alterar estados: usando variáveis com `.obs`, ou a forma mecânica via `update()` + +Porém, desses 4 widgets, esse é o que consome mais recursos, já que usa os dois gerenciadores de estado combinados. + +* Nota: Para usar GetBuilder e MixinBuilder você precisa usar GetController. Para usar GetX ou Obx você precisa usar RxController. + +## Workers + +Workers vai te dar suporte, ativando callbacks específicos quando um evento ocorrer. + +```dart +/// Chamada toda vez que a variável for alterada +ever(count1, (value) => print("novo valor: $value")); + +/// Chamada apenas na primeira vez que a variável for alterada +once(count1, (value) => print("novo valor: $value (não vai mudar mais)")); + +/// Anti DDos - Chamada toda vez que o usuário parar de digitar por 1 segundo, por exemplo. +debounce(count1, (value) => print("debouce $value"), time: Duration(seconds: 1)); + +/// Ignore todas as mudanças num período de 1 segundo. +interval(count1, (value) => print("interval $value"), time: Duration(seconds: 1)); +``` + +* **ever** +é chamado toda vez que a variável mudar de valor. É só isso. + +* **once** +é chamado somente na primeira vez que a variável mudar de valor. + +* **debounce** +É muito útil em funções de pesquisa, onde você somente quer que a API seja chamada depois que o usuário terminar de digitar. Normalmente, se o usuário digitar "Jonny", será feita 5 requests na sua API, pelas letras 'J', 'o', 'n', 'n' e 'y'. Com o `debounce` isso não acontece, porque você tem a sua disposição uma função que só fazer a pesquisa na api quando o usuário parar de digitar. O `debounce` é bom para táticas anti-DDos, para funções de pesquisa em que cada letra digitada ativaria um request na API. Debounce vai esperar o usário parar de digitar o nome, para então fazer o request para API. + +* **interval** +Quando se usa `debounce` , se o usuário fizer 1000 mudanças numa variável em 1 segundo, o `debounce` só computa a última mudança feita após a inatividade por um tempo estipulado (o padrão é 800 milisegundos). `interval` por outro lado vai ignorar todas as ações do usuário pelo período estipulado. Se o `interval` for de 1 segundo, então ele só conseguirá enviar 60 eventos por segundo. Se for 3 segundos de prazo, então o `interval` vai enviar 20 eventos por minuto (diferente do `debounce` que só enviaria o evento depois que o prazo estipulado acabar). Isso é recomendado para evitar abuso em funções que o usuário pode clicar rapidamente em algo para ter uma vantagem. Para exemplificar, imagine que o usuário pode ganhar moedas clicando num botão. Se ele clicar 300 vezes no botão em um minuto, ele vai ganhar 300 moedas. Usando o `interval`, você pode definir um prazo de 1 segundo por exemplo, e mesmo se ele clicasse 300 vezes em um minuto, ele ganharia apenas 60 moedas. Se fosse usado o `debounce`, o usuário ganharia apenas 1 moeda, porque só é executado quando o usuário para de clicar por um prazo estabelecido. + +- NOTA: Workers devem ser utilizados sempre na inicialização de um Controller ou Classe, dessa forma, ele deve estar sempre no onInit (recomendado), no Construtor de classe, ou no initState de um StatefulWidget (essa prática não é recomendada na maioria dos casos, mas não deve trazer efeitos colaterais). \ No newline at end of file diff --git a/siro_rider/packages/get/documentation/ru_RU/dependency_management.md b/siro_rider/packages/get/documentation/ru_RU/dependency_management.md new file mode 100644 index 0000000..3d9b899 --- /dev/null +++ b/siro_rider/packages/get/documentation/ru_RU/dependency_management.md @@ -0,0 +1,379 @@ +# Управление зависимостями +- [Управление зависимостями](#управление-зависимостями) + - [Методы создания экземпляров](#методы-создания-экземпляров) + - [Get.put()](#getput) + - [Get.lazyPut](#getlazyput) + - [Get.putAsync](#getputasync) + - [Get.create](#getcreate) + - [Применение методов/классов создания экземпляров](#применение-методовклассов-создания-экземпляров) + - [Различия между методами](#различия-между-методами) + - [Подвязки](#подвязки) + - [Класс Bindings](#класс-bindings) + - [BindingsBuilder](#bindingsbuilder) + - [SmartManagement](#smartmanagement) + - [Как поменять](#как-поменять) + - [SmartManagement.full](#smartmanagementfull) + - [SmartManagement.onlyBuilders](#smartmanagementonlybuilders) + - [SmartManagement.keepFactory](#smartmanagementkeepfactory) + - [Как подвязки работают под капотом](#как-подвязки-работают-под-капотом) + - [Примечания](#примечания) + +Get имеет простой и мощный менеджер зависимостей, позволяющий вам получить тот же класс, что и ваш Bloc или Controller, с помощью 1 строки кода, без Provider и inheritedWidget: + +```dart +Controller controller = Get.put(Controller()); // Rather Controller controller = Controller(); +``` + +Вместо того, чтобы создавать экземпляр вашего класса в классе, который вы используете, вы создаёте его в экземпляре Get, что сделает его доступным во всем приложении. +Таким образом Вы можете использовать свой контроллер (или Bloc) + +- Примечание: Если вы применяете менеджер состояний Get, обратите внимание на [Bindings](#bindings) api, упрощающего подключение вашего предсталения к контроллеру. +- Примечаие²: Управление зависимостями Get отделено от других частей пакета, поэтому, если, например, ваше приложение уже использует другой менеджер состояний, вам не нужно его менять, вы можете использовать этот менеджер внедрения зависимостей без каких-либо проблем. + +## Методы создания экземпляров +Методы и настраиваемые параметры: + +### Get.put() + +Самый распространенный способ внедрения зависимости. Например, хорош для контроллеров ваших представлений. + +```dart +Get.put(SomeClass()); +Get.put(LoginController(), permanent: true); +Get.put(ListItemController, tag: "some unique string"); +``` + +Это все параметры, которые вы можете установить при использовании put: +```dart +Get.put( + // mandatory: the class that you want to get to save, like a controller or anything + // note: "S" means that it can be a class of any type + S dependency + + // optional: this is for when you want multiple classess that are of the same type + // since you normally get a class by using Get.find(), + // you need to use tag to tell which instance you need + // must be unique string + String tag, + + // optional: by default, get will dispose instances after they are not used anymore (example, + // the controller of a view that is closed), but you might need that the instance + // to be kept there throughout the entire app, like an instance of sharedPreferences or something + // so you use this + // defaults to false + bool permanent = false, + + // optional: allows you after using an abstract class in a test, replace it with another one and follow the test. + // defaults to false + bool overrideAbstract = false, + + // optional: allows you to create the dependency using function instead of the dependency itself. + // this one is not commonly used + InstanceBuilderCallback builder, +) +``` + +### Get.lazyPut +Можно отложить загрузку зависимости, чтобы она создавалась только тогда, когда она используется. Очень полезно для вычислительных ресурсоёмких классов или если вы хотите создать экземпляры нескольких классов в одном месте (например, в классе Bindings), и вы знаете, что не собираетесь использовать этот класс в то время. + +```dart +/// ApiMock will only be called when someone uses Get.find for the first time +Get.lazyPut(() => ApiMock()); + +Get.lazyPut( + () { + // ... some logic if needed + return FirebaseAuth(); + }, + tag: Math.random().toString(), + fenix: true +) + +Get.lazyPut( () => Controller() ) +``` + +Это все параметры, которые вы можете установить при использовании lazyPut: +```dart +Get.lazyPut( + // mandatory: a method that will be executed when your class is called for the first time + InstanceBuilderCallback builder, + + // optional: same as Get.put(), it is used for when you want multiple different instance of a same class + // must be unique + String tag, + + // optional: It is similar to "permanent", the difference is that the instance is discarded when + // is not being used, but when it's use is needed again, Get will recreate the instance + // just the same as "SmartManagement.keepFactory" in the bindings api + // defaults to false + bool fenix = false + +) +``` + +### Get.putAsync +Если вы хотите зарегистрировать асинхронный экземпляр, вы можете использовать `Get.putAsync`: + +```dart +Get.putAsync(() async { + final prefs = await SharedPreferences.getInstance(); + await prefs.setInt('counter', 12345); + return prefs; +}); + +Get.putAsync( () async => await YourAsyncClass() ) +``` + +Это все параметры, которые вы можете установить при использовании putAsync: +```dart +Get.putAsync( + + // mandatory: an async method that will be executed to instantiate your class + AsyncInstanceBuilderCallback builder, + + // optional: same as Get.put(), it is used for when you want multiple different instance of a same class + // must be unique + String tag, + + // optional: same as in Get.put(), used when you need to maintain that instance alive in the entire app + // defaults to false + bool permanent = false +) +``` + +### Get.create + +Это хитрый метод. Подробное объяснение того, что это такое, и различий между ними можно найти в разделе [Различия между методами](#различия-между-методами): + +```dart +Get.Create(() => SomeClass()); +Get.Create(() => LoginController()); +``` + +Это все параметры, которые вы можете установить при использовании create: + +```dart +Get.create( + // required: a function that returns a class that will be "fabricated" every + // time `Get.find()` is called + // Example: Get.create(() => YourClass()) + FcBuilderFunc builder, + + // optional: just like Get.put(), but it is used when you need multiple instances + // of a of a same class + // Useful in case you have a list that each item need it's own controller + // needs to be a unique string. Just change from tag to name + String name, + + // optional: just like int`Get.put()`, it is for when you need to keep the + // instance alive thoughout the entire app. The difference is in Get.create + // permanent is true by default + bool permanent = true +``` + +## Применение методов/классов создания экземпляров + +Представьте, что вы прошли через множество маршрутов и вам нужны данные, которые остались в вашем контроллере. Вам понадобится менеджер состояний в сочетании с Provider или Get_it, верно? Только не с Get. Вам просто нужно попросить Get «найти» ваш контроллер, никаких дополнительных зависимостей вам не потребуется: + +```dart +final controller = Get.find(); +// OR +Controller controller = Get.find(); + +// Yes, it looks like Magic, Get will find your controller, and will deliver it to you. +// You can have 1 million controllers instantiated, Get will always give you the right controller. +``` + +И тогда вы сможете восстановить данные вашего контроллера, которые были там получены: + +```dart +Text(controller.textFromApi); +``` + +Поскольку возвращаемое значение является обычным классом, вы можете делать все, что захотите: +```dart +int count = Get.find().getInt('counter'); +print(count); // out: 12345 +``` + +Чтобы удалить экземпляр Get: + +```dart +Get.delete(); //usually you don't need to do this because GetX already delete unused controllers +``` + +## Различия между методами + +Сперва давайте рассмотрим параметр `fenix` метода Get.lazyPut и `permanent` других методов. + +Фундаментальное различие между `permanent` и `fenix` заключается в том, как вы хотите хранить свои экземпляры. + +Закрепляя это: по умолчанию GetX удаляет экземпляры, когда они не используются. +Это означает, что: если на экране 1 есть контроллер 1, а на экране 2 есть контроллер 2, и вы удаляете первый маршрут из стека (например, если вы используете `Get.off()` или `Get.offNamed()`), контроллер 1 теперь не используется, поэтому он будет стёрт. + +Но если вы используете `permanent: true`, тогда контроллер не будет потерян при этом переходе - что очень полезно для служб, которые вы хотите поддерживать на протяжении всего приложения. + +`fenix` предназначен для сервисов, о потере которых вы не беспокоитесь между сменами экрана, но когда вам нужен этот сервис, вы ожидаете, что он будет активен. По сути, он избавится от неиспользуемого контроллера/службы/класса, но когда он вам понадобится, он «воссоздает из пепла» новый экземпляр. + +Исходя из различий между методами: + +- Get.put и Get.putAsync следует одному и тому же порядку создания, с той разницей, что второй использует асинхронный метод: эти два метода создают и инициализируют экземпляр. Они вставляются непосредственно в память с использованием внутреннего метода `insert` с параметрами `permanent: false` и `isSingleton: true` (параметр isSingleton предназначен только для того, чтобы указать, следует ли использовать зависимость от `dependency` или она должна использовать зависимость от `FcBuilderFunc`). После этого вызывается `Get.find()`, который немедленно инициализирует экземпляры, находящиеся в памяти. + +- Get.create: Как следует из названия, он «создаст» вашу зависимость! Подобно `Get.put()`, он также вызывает внутренний метод `insert` для создания экземпляра. Но `permanent` становится true и `isSingleton` становится false (поскольку мы «создаем» нашу зависимость, она не может быть синглтоном, поэтому false). И поскольку `permanent: true`, мы по умолчанию не теряем его между экранами! Также, `Get.find()` не вызывается немедленно, он ожидает использования на экране для вызова. Он создан таким образом, чтобы использовать параметр `permanent`, `Get.create()` был создан с целью создания не общих экземпляров, но не удаляемых, как, например, кнопка в listView, где вам нужен уникальный экземпляр для этого списка - по этой причине Get.create необходимо использовать вместе с GetWidget. + +- Get.lazyPut: Как следует из названия, это ленивый процесс. Экземпляр создается, но он не вызывается для немедленного использования, он остается в ожидании вызова. В отличие от других методов, `insert` не вызывается здесь. Вместо этого экземпляр вставляется в другую часть памяти, часть, отвечающую за определение возможности воссоздания экземпляра, назовем это «фабрикой». Если мы хотим создать что-то, что будет использоваться позже, это не будет смешиваться с вещами, которые использовались сейчас. И здесь вступает в силу магия `fenix`: если вы решаете оставить `fenix: false`, и ваш `smartManagement` не является `keepFactory`, то, при использовании `Get.find`, экземпляр изменит место в памяти с «фабрики» на область памяти общего экземпляра. Сразу после этого по умолчанию удаляется с «фабрики». Теперь, если вы выберете `fenix: true`, экземпляр продолжит существовать в этой выделенной части, даже перейдя в общую область, для повторного вызова в будущем. + +## Подвязки + +Возможно, одной из главных особенностей этого пакета является возможность полной интеграции маршрутов, менеджера состояний и менеджера зависимостей. +Когда маршрут удаляется из стека, все контроллеры, переменные и экземпляры связанных с ним объектов удаляются из памяти. Если вы используете потоки или таймеры, они закроются автоматически, и вам не о чем беспокоиться. +В версии 2.10 полностью реализован API привязок. +Теперь вам больше не нужно использовать метод инициализации. Вам даже не нужно вводить контроллеры, если вы этого не хотите. Вы можете запустить свои контроллеры и серисы в соответствующем для этого месте. +Класс Binding - это класс, который будет разделять внедрение зависимостей, при этом «привязывая» маршруты к диспетчеру состояний и диспетчеру зависимостей. +Этот класс позволяет Get узнать, какой экран отображается при использовании конкретного контроллера, а также узнать, где и как его удалить. +Кроме того, класс Binding позволит вам контролировать конфигурацию SmartManager. Вы можете настроить зависимости, которые будут упорядочены при удалении маршрута из стека, или когда виджет, который его использовал, выкладывается, или ни то, ни другое. На вас будет работать интеллектуальное управление зависимостями, но даже в этом случае вы можете настроить его по своему усмотрению. + +### Класс Bindings + +- Создайте класс и реализуйте Binding + +```dart +class HomeBinding implements Bindings {} +``` + +Ваша IDE автоматически попросит вас переопределить метод «зависимостей», и вам просто нужно последовать этой просьбе, переопределить метод и вставить все классы, которые вы собираетесь использовать на этом маршруте: + +```dart +class HomeBinding implements Bindings { + @override + void dependencies() { + Get.lazyPut(() => HomeController()); + Get.put(()=> Api()); + } +} + +class DetailsBinding implements Bindings { + @override + void dependencies() { + Get.lazyPut(() => DetailsController()); + } +} +``` + +Теперь вам просто нужно сообщить своему маршруту, что вы будете использовать эту привязку для установления связи между диспетчером маршрутов, зависимостями и состояниями. + +- Используя именованные маршруты: + +```dart +getPages: [ + GetPage( + name: '/', + page: () => HomeView(), + binding: HomeBinding(), + ), + GetPage( + name: '/details', + page: () => DetailsView(), + binding: DetailsBinding(), + ), +]; +``` + +- Используя обычные маршруты: + +```dart +Get.to(Home(), binding: HomeBinding()); +Get.to(DetailsView(), binding: DetailsBinding()) +``` + +Вам больше не нужно беспокоиться об управлении памятью вашего приложения, Get сделает это за вас. + +Класс Binding вызывается при вызове маршрута, вы можете создать "initialBinding" в GetMaterialApp, чтобы вставить все зависимости, которые будут созданы. + +```dart +GetMaterialApp( + initialBinding: SampleBind(), + home: Home(), +); +``` + +### BindingsBuilder + +По умолчанию привязка создается путем создания класса, реализующего привязки. +Но в качестве альтернативы вы можете использовать обратный вызов `BindingsBuilder`, чтобы просто использовать функцию для создания всего, что вы хотите. + +Example: + +```dart +getPages: [ + GetPage( + name: '/', + page: () => HomeView(), + binding: BindingsBuilder(() { + Get.lazyPut(() => ControllerX()); + Get.put(()=> Api()); + }), + ), + GetPage( + name: '/details', + page: () => DetailsView(), + binding: BindingsBuilder(() { + Get.lazyPut(() => DetailsController()); + }), + ), +]; +``` + +Таким образом, вы можете избежать создания одного класса привязки для каждого маршрута, что сделает это еще проще. + +Оба способа работают идеально, и мы хотим, чтобы вы использовали то, что больше всего соответствует вашим вкусам. + +### SmartManagement + +GetX по умолчанию удаляет неиспользуемые контроллеры из памяти, даже если происходит сбой и виджет, который их использует, не удаляется должным образом. +Это то, что называется `полным` режимом управления зависимостями. +Но если вы хотите поменять способ, которым GetX управляет удалением классов, у вас есть класс `SmartManagement`, в котором вы можете задавать другое поведение. + +#### Как поменять + +Если вы хотите поменять эту конфигурацию (что обычно не требуется), вот способ: + +```dart +void main () { + runApp( + GetMaterialApp( + smartManagement: SmartManagement.onlyBuilders //here + home: Home(), + ) + ) +} +``` + +#### SmartManagement.full + +Это значение по умолчанию. Удаляет классы, которые не используются и не были постоянными. В большинстве случаев вы захотите оставить эту конфигурацию нетронутой. Если вы новичок в GetX, не меняйте это. + +#### SmartManagement.onlyBuilders +С этой опцией будут удалены только контроллеры, запущенные в `init:` или загруженные в Binding с помощью `Get.lazyPut()`. + +Если вы используете `Get.put()` или `Get.putAsync()` или любой другой подход, SmartManagement не будет иметь разрешений на исключение этой зависимости. + +При поведении по умолчанию даже виджеты, созданные с помощью Get.put, будут удалены, в отличие от SmartManagement.onlyBuilders. + +#### SmartManagement.keepFactory + +Как и SmartManagement.full, он удаляет зависимости, когда он больше не используется. Однако он сохранит свою фабрику, что означает, что он воссоздает зависимость, если вам снова понадобится этот экземпляр. + +### Как подвязки работают под капотом +Привязки создают временные фабрики, которые создаются в тот момент, когда вы кликаете для перехода на другой экран, и будут уничтожены, как только произойдет анимация смены экрана. +Это происходит так быстро, что анализатор даже не сможет это зарегистрировать. +Когда вы снова перейдете на этот экран, будет вызвана новая временная фабрика, поэтому это предпочтительнее, чем использование SmartManagement.keepFactory, но если вы не хотите создавать привязки или хотите сохранить все свои зависимости в одной привязке, это вам поможет. +Фабрики занимают мало памяти, они содержат не экземпляры, а функцию с «формой» того класса, который вам нужен. +Это имеет очень низкую стоимость памяти, но поскольку цель этой библиотеки - получить максимально возможную производительность с использованием минимальных ресурсов, Get по умолчанию удаляет даже фабрики. Используйте то, что вам удобнее. + +## Примечания + +- НЕ ИСПОЛЬЗУЙТЕ SmartManagement.keepFactory, если вы используете несколько привязок. Он был разработан для использования без привязок или с одной привязкой, связанной в initialBinding GetMaterialApp. + +- Использование привязок совершенно необязательно, если вы хотите, вы можете без проблем использовать `Get.put()` и `Get.find()` для классов, которые используют данный контроллер. +Однако, если вы работаете со службами или любой другой абстракцией, я рекомендую использовать привязки для лучшей организации. diff --git a/siro_rider/packages/get/documentation/ru_RU/route_management.md b/siro_rider/packages/get/documentation/ru_RU/route_management.md new file mode 100644 index 0000000..22468e4 --- /dev/null +++ b/siro_rider/packages/get/documentation/ru_RU/route_management.md @@ -0,0 +1,563 @@ +- [Управление маршрутами](#управление-маршрутами) + - [Как использовать](#как-использовать) + - [Навигация без именованных маршрутов](#навигация-без-именованных-маршрутов) + - [Навигация по именованным маршрутам](#навигация-по-именованным-маршрутам) + - [Отправить данные по именованному маршруту](#отправить-данные-по-именованному-маршруту) + - [Динамические url-ссылки](#динамические-url-ссылки) + - [Middleware](#middleware) + - [Навигация без контекста](#навигация-без-контекста) + - [SnackBars](#snackbars) + - [Dialogs](#dialogs) + - [BottomSheets](#bottomsheets) + - [Вложенная навигация](#вложенная-навигация) + +# Управление маршрутами + +Это полное объяснение всего, что нужно Getx, когда речь идет об управлении маршрутами. + +## Как использовать + +Добавьте к вашему pubspec.yaml следующее: + +```yaml +dependencies: + get: +``` + +Если вы собираетесь использовать маршруты/snackbars/dialogs/bottomSheets без контекста или использовать высокоуровневые API Get, вам нужно просто добавить «Get» перед вашим MaterialApp, превратив его в GetMaterialApp! + +```dart +GetMaterialApp( // Before: MaterialApp( + home: MyHome(), +) +``` + +## Навигация без именованных маршрутов + +Для навигации на новый экран: + +```dart +Get.to(NextScreen()); +``` + +Чтобы закрыть snackbars, диалог, bottomsheets, или все, что вы обычно закрывали с помощью Navigator.pop(context); + +```dart +Get.back(); +``` + +Для перехода к следующему экрану и отсутствия возможности вернуться к предыдущему экрану (для использования в SplashScreens, экранах входа и т.д.) + +```dart +Get.off(NextScreen()); +``` + +Для перехода к следующему экрану и отмены всех предыдущих маршрутов (полезно в корзинах для покупок, опросах и тестах) + +```dart +Get.offAll(NextScreen()); +``` + +Чтобы перейти к следующему маршруту и ​​получить или обновить данные, как только вы вернетесь с него: + +```dart +var data = await Get.to(Payment()); +``` + +отправить данные на предыдущий экран: + +```dart +Get.back(result: 'success'); +``` + +И использовать их: + +пример: + +```dart +if(data == 'success') madeAnything(); +``` + +Нет желания учить наш синтаксис? +Просто измените Navigator(верхний регистр) на navigator (нижний регистр), и вы получите все функции стандартной навигации без использования контекста. +Пример: + +```dart + +// Default Flutter navigator +Navigator.of(context).push( + context, + MaterialPageRoute( + builder: (BuildContext context) { + return HomePage(); + }, + ), +); + +// Get using Flutter syntax without needing context +navigator.push( + MaterialPageRoute( + builder: (_) { + return HomePage(); + }, + ), +); + +// Get syntax (It is much better, but you have the right to disagree) +Get.to(HomePage()); + + +``` + +## Навигация по именованным маршрутам + +- Если вы предпочитаете перемещаться по именованным маршрутам, Get также поддерживает это. + +Для навигации на следующий экран + +```dart +Get.toNamed("/NextScreen"); +``` + +Для навигации и удаления предыдущего экрана из дерева. + +```dart +Get.offNamed("/NextScreen"); +``` + +Для навигации и удаления всех предыдущих экранов из дерева. + +```dart +Get.offAllNamed("/NextScreen"); +``` + +Для определения маршрутов используйте GetMaterialApp: + +```dart +void main() { + runApp( + GetMaterialApp( + initialRoute: '/', + getPages: [ + GetPage(name: '/', page: () => MyHomePage()), + GetPage(name: '/second', page: () => Second()), + GetPage( + name: '/third', + page: () => Third(), + transition: Transition.zoom + ), + ], + ) + ); +} +``` + +Для обработки навигации по неопределенным маршрутам (ошибка 404) вы можете определить страницу unknownRoute в GetMaterialApp. + +```dart +void main() { + runApp( + GetMaterialApp( + unknownRoute: GetPage(name: '/notfound', page: () => UnknownRoutePage()), + initialRoute: '/', + getPages: [ + GetPage(name: '/', page: () => MyHomePage()), + GetPage(name: '/second', page: () => Second()), + ], + ) + ); +} +``` + +### Отправить данные по именованному маршруту + +Просто отправьте то, что хотите в качестве аргументов. Get принимает здесь всё, что угодно, будь то String, Map, List или даже экземпляр класса. + +```dart +Get.toNamed("/NextScreen", arguments: 'Get is the best'); +``` + +в вашем классе или контроллере: + +```dart +print(Get.arguments); +//print out: Get is the best +``` + +### Динамические url-ссылки + +Получите расширенные динамические url-адреса, как в Интернете. Веб-разработчики, вероятно, уже хотели эту функцию на Flutter, и, скорее всего, видели, что пакет обещает эту функцию и предоставляет совершенно другой синтаксис, чем url-адрес в Интернете, но Get также решает эту проблему. + +```dart +Get.offAllNamed("/NextScreen?device=phone&id=354&name=Enzo"); +``` + +в вашем controller/bloc/stateful/stateless классе: + +```dart +print(Get.parameters['id']); +// out: 354 +print(Get.parameters['name']); +// out: Enzo +``` + +Вы также можете легко получить именованные параметры с помощью Get: + +```dart +void main() { + runApp( + GetMaterialApp( + initialRoute: '/', + getPages: [ + GetPage( + name: '/', + page: () => MyHomePage(), + ), + GetPage( + name: '/profile/', + page: () => MyProfile(), + ), + //You can define a different page for routes with arguments, and another without arguments, but for that you must use the slash '/' on the route that will not receive arguments as above. + GetPage( + name: '/profile/:user', + page: () => UserProfile(), + ), + GetPage( + name: '/third', + page: () => Third(), + transition: Transition.cupertino + ), + ], + ) + ); +} +``` + +Отправьте данные по именованному маршруту + +```dart +Get.toNamed("/profile/34954"); +``` + +На втором экране возьмите данные по параметрам + +```dart +print(Get.parameters['user']); +// out: 34954 +``` + +или отправьте несколько таких параметров + +```dart +Get.toNamed("/profile/34954?flag=true"); +``` + +На втором экране взять данные по параметрам как обычно. + +```dart +print(Get.parameters['user']); +print(Get.parameters['flag']); +// out: 34954 true +``` + + + +И теперь все, что вам нужно сделать, это использовать Get.toNamed() для навигации по именованным маршрутам без какого-либо контекста (вы можете вызывать свои маршруты непосредственно из класса BLoC или контроллера), а когда ваше приложение будет скомпилировано в Интернете, ваше маршруты появятся в url <3 + +### Middleware + +Если вы хотите прослушивать события Get для запуска действий, вы можете использовать для этого routingCallback + +```dart +GetMaterialApp( + routingCallback: (routing) { + if(routing.current == '/second'){ + openAds(); + } + } +) +``` + +Если вы не используете GetMaterialApp, вы можете использовать ручной API для подключения наблюдателя. + +```dart +void main() { + runApp( + MaterialApp( + onGenerateRoute: Router.generateRoute, + initialRoute: "/", + navigatorKey: Get.key, + navigatorObservers: [ + GetObserver(MiddleWare.observer), // HERE !!! + ], + ), + ); +} +``` + +Создайте класс MiddleWare + +```dart +class MiddleWare { + static observer(Routing routing) { + /// You can listen in addition to the routes, the snackbars, dialogs and bottomsheets on each screen. + ///If you need to enter any of these 3 events directly here, + ///you must specify that the event is != Than you are trying to do. + if (routing.current == '/second' && !routing.isSnackbar) { + Get.snackbar("Hi", "You are on second route"); + } else if (routing.current =='/third'){ + print('last route called'); + } + } +} +``` + +Теперь используйте Get в своем коде: + +```dart +class First extends StatelessWidget { + @override + Widget build(BuildContext context) { + return Scaffold( + appBar: AppBar( + leading: IconButton( + icon: Icon(Icons.add), + onPressed: () { + Get.snackbar("hi", "i am a modern snackbar"); + }, + ), + title: Text('First Route'), + ), + body: Center( + child: ElevatedButton( + child: Text('Open route'), + onPressed: () { + Get.toNamed("/second"); + }, + ), + ), + ); + } +} + +class Second extends StatelessWidget { + @override + Widget build(BuildContext context) { + return Scaffold( + appBar: AppBar( + leading: IconButton( + icon: Icon(Icons.add), + onPressed: () { + Get.snackbar("hi", "i am a modern snackbar"); + }, + ), + title: Text('second Route'), + ), + body: Center( + child: ElevatedButton( + child: Text('Open route'), + onPressed: () { + Get.toNamed("/third"); + }, + ), + ), + ); + } +} + +class Third extends StatelessWidget { + @override + Widget build(BuildContext context) { + return Scaffold( + appBar: AppBar( + title: Text("Third Route"), + ), + body: Center( + child: ElevatedButton( + onPressed: () { + Get.back(); + }, + child: Text('Go back!'), + ), + ), + ); + } +} +``` + +## Навигация без контекста + +### SnackBars + +Чтобы получить простой SnackBar с Flutter, вы должны получить контекст Scaffold, или вы должны использовать GlobalKey, прикрепленный к вашему Scaffold + +```dart +final snackBar = SnackBar( + content: Text('Hi!'), + action: SnackBarAction( + label: 'I am a old and ugly snackbar :(', + onPressed: (){} + ), +); +// Find the Scaffold in the widget tree and use +// it to show a SnackBar. +Scaffold.of(context).showSnackBar(snackBar); +``` + +Реализация в Get: + +```dart +Get.snackbar('Hi', 'i am a modern snackbar'); +``` + +С Get всё, что вам нужно сделать, это вызвать Get.snackbar из любого места кода или настроить его так, как вы хотите! + +```dart +Get.snackbar( + "Hey i'm a Get SnackBar!", // title + "It's unbelievable! I'm using SnackBar without context, without boilerplate, without Scaffold, it is something truly amazing!", // message + icon: Icon(Icons.alarm), + shouldIconPulse: true, + onTap:(){}, + barBlur: 20, + isDismissible: true, + duration: Duration(seconds: 3), +); + + + ////////// ALL FEATURES ////////// + // Color colorText, + // Duration duration, + // SnackPosition snackPosition, + // Widget titleText, + // Widget messageText, + // bool instantInit, + // Widget icon, + // bool shouldIconPulse, + // double maxWidth, + // EdgeInsets margin, + // EdgeInsets padding, + // double borderRadius, + // Color borderColor, + // double borderWidth, + // Color backgroundColor, + // Color leftBarIndicatorColor, + // List boxShadows, + // Gradient backgroundGradient, + // TextButton mainButton, + // OnTap onTap, + // bool isDismissible, + // bool showProgressIndicator, + // AnimationController progressIndicatorController, + // Color progressIndicatorBackgroundColor, + // Animation progressIndicatorValueColor, + // SnackStyle snackStyle, + // Curve forwardAnimationCurve, + // Curve reverseAnimationCurve, + // Duration animationDuration, + // double barBlur, + // double overlayBlur, + // Color overlayColor, + // Form userInputForm + /////////////////////////////////// +``` + +Если вы предпочитаете традиционный snackbar, или хотите настроить его с нуля, вы можете использовать +`Get.rawSnackbar();` который предоставляет RAW API, на котором был построен Get.snackbar. + +### Dialogs + +Чтобы открыть: + +```dart +Get.dialog(YourDialogWidget()); +``` + +Чтобы открыть диалог по умолчанию: + +```dart +Get.defaultDialog( + onConfirm: () => print("Ok"), + middleText: "Dialog made in 3 lines of code" +); +``` + +Вы также можете использовать Get.generalDialog вместо showGeneralDialog. + +Для всех других виджетов диалога Flutter, включая cupertino, вы можете использовать Get.overlayContext вместо контекста и открывать его в любом месте вашего кода. +Для виджетов, которые не используют Overlay, вы можете использовать Get.context. +Эти два контекста будут работать в 99% случаев для замены контекста вашего пользовательского интерфейса, за исключением случаев, когда наследуемый виджет используется без контекста навигации. + +### BottomSheets + +Get.bottomSheet похож на showModalBottomSheet, но не требует контекста. + +```dart +Get.bottomSheet( + Container( + child: Wrap( + children: [ + ListTile( + leading: Icon(Icons.music_note), + title: Text('Music'), + onTap: () {} + ), + ListTile( + leading: Icon(Icons.videocam), + title: Text('Video'), + onTap: () {}, + ), + ], + ), + ) +); +``` + +## Вложенная навигация + +Get сделал вложенную навигацию Flutter еще проще. +Вам не нужен контекст, и вы найдёте свой стек навигации по Id. + +- ПРИМЕЧАНИЕ: Создание параллельных стеков навигации может быть опасным. В идеале не используйте NestedNavigators или используйте их редко. Если этого требует ваш проект, продолжайте, но имейте в виду, что хранение нескольких стеков навигации в памяти может быть не лучшим решением для потребления оперативной памяти. + +Смотрите как это просто: + +```dart +Navigator( + key: Get.nestedKey(1), // create a key by index + initialRoute: '/', + onGenerateRoute: (settings) { + if (settings.name == '/') { + return GetPageRoute( + page: () => Scaffold( + appBar: AppBar( + title: Text("Main"), + ), + body: Center( + child: TextButton( + color: Colors.blue, + onPressed: () { + Get.toNamed('/second', id:1); // navigate by your nested route by index + }, + child: Text("Go to second"), + ), + ), + ), + ); + } else if (settings.name == '/second') { + return GetPageRoute( + page: () => Center( + child: Scaffold( + appBar: AppBar( + title: Text("Main"), + ), + body: Center( + child: Text("second") + ), + ), + ), + ); + } + } +), +``` diff --git a/siro_rider/packages/get/documentation/ru_RU/state_management.md b/siro_rider/packages/get/documentation/ru_RU/state_management.md new file mode 100644 index 0000000..78ae9ce --- /dev/null +++ b/siro_rider/packages/get/documentation/ru_RU/state_management.md @@ -0,0 +1,732 @@ +- [Управление состоянием](#управление-состоянием) + - [Реактивное управление состоянием](#реактивное-управление-состоянием) + - [Преимущества](#преимущества) + - [Объявление реактивной переменной](#объявление-реактивной-переменной) + - [Использование значений в представлении](#использование-значений-в-представлении) + - [Условия для перестраивания](#условия-для-перестраивания) + - [Где .obs может быть использован](#где-obs-может-быть-использован) + - [Примечание о списках](#примечание-о-списках) + - [Почему мне нужно использовать .value](#почему-мне-нужно-использовать-value) + - [Obx()](#obx) + - [Workers](#workers) + - [Обычное управление состоянием](#обычное-управление-состоянием) + - [Преимущества](#преимущества-1) + - [Использование](#использование) + - [Как обрабатываются контроллеры](#как-обрабатываются-контроллеры) + - [Вам больше не понадобятся StatefulWidgets](#вам-больше-не-понадобятся-statefulwidgets) + - [Почему это существует](#почему-это-существует) + - [Другие способы использования](#другие-способы-использования) + - [Уникальные идентификаторы](#уникальные-идентификаторы) + - [Смешивание двух менеджеров состояний](#смешивание-двух-менеджеров-состояний) + - [GetBuilder vs GetX vs Obx vs MixinBuilder](#getbuilder-vs-getx-vs-obx-vs-mixinbuilder) + +# Управление состоянием + +В настоящее время для Flutter есть несколько менеджеров состояний. Однако большинство из них связано с использованием ChangeNotifier для обновления виджетов, и это плохой и очень плохой подход к производительности средних или больших приложений. Вы можете проверить в официальной документации Flutter, что [ChangeNotifier следует использовать с 1 или максимум 2 слушателями](https://api.flutter.dev/flutter/foundation/ChangeNotifier-class.html), что делает его практически непригодным для любого приложения среднего или большого размера. + +Остальные менеджеры состояний хороши, но есть свои нюансы: + +- BLoC безопасен и эффективен, но сложен для новичков, что удерживает людей от разработки с Flutter. +- MobX проще, чем BLoC, реактивен, и я бы сказал, почти идеален, но вам нужно использовать генератор кода, который для больших приложений снижает производительность, таким образом вам нужно будет пить много кофе, прежде чем ваш код снова не будет готов после flutter clean (И это не вина MobX, а вина кодогенерации, которая очень медленная!). +- Provider использует InheritedWidget для доставки слушателя в качестве способа решения проблемы, описанной выше, с помощью ChangeNotifier, что подразумевает, что любой доступ к классу ChangeNotifier должен находиться в дереве виджетов из-за контекста для доступа к Inherited. + +Get не лучше и не хуже, чем любой другой менеджер состояний, но вам следует проанализировать эти моменты, а также приведенные ниже пункты, чтобы выбрать между использованием Get в чистом виде (Vanilla) или его вместе с другим менеджером состояний. Определенно, Get - не враг любого другого менеджера состояний, потому что Get - это микрофреймворк, а не просто менеджер состояний, и его можно использовать отдельно или вместе с ними. + +## Реактивное управление состоянием + +Реактивное программирование может оттолкнуть многих людей, потому что считается сложным. GetX превращает реактивное программирование в нечто довольно простое: + +- Вам не нужно создавать StreamControllers. +- Вам не нужно создавать StreamBuilder для каждой переменной. +- Вам не нужно создавать класс для каждого состояния. +- Вам не нужно создавать получение начального значения. + +Реактивное программирование с помощью Get так же просто, как использование setState. + +Представим, что у вас есть переменная `name` и вы хотите, чтобы каждый раз, когда вы её изменяете, все виджеты, которые её используют, менялись автоматически. + +Это ваша переменная: + +```dart +var name = 'Jonatas Borges'; +``` + +Чтобы сделать его наблюдаемым, вам просто нужно добавить в конец «.obs»: + +```dart +var name = 'Jonatas Borges'.obs; +``` + +Вот и всё. Это *так* просто. + +С этого момента мы могли бы называть эти - ".obs" (ervables) переменные как _Rx_. + +Что мы делали под капотом? Мы создали `Stream` из `String`ов, которому было присвоено начальное значение `"Jonatas Borges"`, мы уведомили все виджеты, которые используют `"Jonatas Borges"`, что они теперь «принадлежат» этой переменной, и когда значение _Rx_ изменится, они также должны будут измениться. + +Это **волшебство GetX** возможно, благодаря возможностям Dart. + +Но, как мы знаем, виджет можно изменить только в том случае, если он находится внутри функции, потому что статические классы не имеют права «автоматически изменяться». + +Вам нужно будет создать `StreamBuilder`, подписаться на эту переменную, чтобы отслеживать изменения, и создать «каскад» вложенных `StreamBuilder`, если вы хотите изменить несколько переменных в одной области, верно? + +Нет, вам не нужен `StreamBuilder`, но насчёт статических классов вы правы. + +Что ж, в представлении во Flutter, когда мы хотим изменить конкретный виджет, приходится писать много шаблоного кода. +C **GetX** вы можете забыть о шаблонном коде. + +`StreamBuilder( … )`? `initialValue: …`? `builder: …`? Нет, вам просто нужно поместить эту переменную в виджет `Obx()`. + +```dart +Obx (() => Text (controller.name)); +``` + +_Что нужно запомнить?_ Только `Obx(() =>`. + +Вы просто передаёте этот виджет через стрелочную функцию в `Obx()` ("Observer" в _Rx_). + +`Obx` довольно умён и изменится только при изменении значения `controller.name`. + +Если `name` == `"John"`, и вы измените его на `"John"` (`name.value = "John"`), на экране ничего не изменится, так как это то же значение, что и раньше. `Obx` для экономии ресурсов просто проигнорирует новое значение, а не будет перестраивать виджет. **Разве это не потрясающе?** + +> Итак, что, если у меня есть 5 переменных _Rx_ (observable) в `Obx`? + +Он просто обновится, когда **любой** из них изменится. + +> И если у меня есть 30 переменных в классе, когда я обновлю одну, обновятся ли **все** переменные этого класса? + +Нет, только **конкретный виджет**, который использует эту переменную _Rx_. + +Итак, **GetX** обновляет экран только тогда, когда переменная _Rx_ меняет свое значение. + +``` +final isOpen = false.obs; + +// NOTHING will happen... same value. +void onButtonTap() => isOpen.value=false; +``` +### Преимущества + +**GetX()** поможет вам, когда вам нужен **детальный** контроль над тем, что обновляется. + +Если вам не нужны уникальные идентификаторы, из-за того что все ваши переменные будут изменены при выполнении, используйте GetBuilder, потому что это простой модуль обновления состояния (как `setState()`), написанный всего в несколько строк кода. +Он был сделан простым, чтобы иметь наименьшее влияние на CPU и просто выполнять единственную цель (восстановление состояния), тратя минимально возможные ресурсы. + +Если вам нужен **мощный** менеджер состояний, то вашим выбором будет **GetX**. + +Он не работает с переменными, а работает с потоками, все в нем - это `Streams` под капотом. +Вы можете использовать _rxDart_ вместе с ним, потому что все это `Streams`, +вы можете прослушивать событие каждой «переменной _Rx_», потому что всё в нём - это `Streams`. + +Это буквально подход _BLoC_, который проще, чем _MobX_, и без генераторов кода и тд. +Вы можете превратить что угодно в _"Observable"_ с помощью `.obs`. + +### Максимальная производительность: + +В дополнение к интеллектуальному алгоритму минимальных перестроек, **GetX** использует компараторы, чтобы убедиться, что состояние изменилось. + +Если вы столкнетесь с ошибками в своем приложении и отправите дублирующее изменение состояния, +**GetX** гарантирует, что оно не выйдет из строя. + +С **GetX** состояние изменяется только при изменении значения. +В этом основное отличие между **GetX** и применением _`computed` из MobX_. +При объединении двух __observables__, когда один из них изменяется; слушатель этого _observable_ также изменится. + +В **GetX**, если вы объедините две переменные, `GetX()` (аналогично `Observer()`) будет перестраиваться только в том случае, если это подразумевает реальное изменение состояния. + +### Объявление реактивной переменной + +У вас есть 3 способа превратить переменную в "observable". + + +1 - Первый использует **`Rx{Type}`**. + +```dart +// initial value is recommended, but not mandatory +final name = RxString(''); +final isLogged = RxBool(false); +final count = RxInt(0); +final balance = RxDouble(0.0); +final items = RxList([]); +final myMap = RxMap({}); +``` + +2 - Второй - использовать **`Rx`** и дженерики `Rx` + +```dart +final name = Rx(''); +final isLogged = Rx(false); +final count = Rx(0); +final balance = Rx(0.0); +final number = Rx(0) +final items = Rx>([]); +final myMap = Rx>({}); + +// Custom classes - it can be any class, literally +final user = Rx(); +``` + +3 - Третий, более практичный, простой и предпочтительный подход, просто добавьте **`.obs`** в качестве свойства вашего значения: + +```dart +final name = ''.obs; +final isLogged = false.obs; +final count = 0.obs; +final balance = 0.0.obs; +final number = 0.obs; +final items = [].obs; +final myMap = {}.obs; + +// Custom classes - it can be any class, literally +final user = User().obs; +``` + +##### Реактивные состояния - это просто. + +Как мы знаем, _Dart_ сейчас движется в сторону _null safety_. +Чтобы быть готовым, с этого момента вы всегда должны начинать свои переменные _Rx_ с **начальным значением**. + +> Преобразование переменной в _observable_ + _начальное значение_ c **GetX** - самый простой и практичный подход. + +Вы буквально добавите "`.obs`" в конец своей переменной и **всё**, вы сделали её observable, +и её `.value`, будет начальным значением. + + +### Использование значений в представлении + +```dart +// controller file +final count1 = 0.obs; +final count2 = 0.obs; +int get sum => count1.value + count2.value; +``` + +```dart +// view file +GetX( + builder: (controller) { + print("count 1 rebuild"); + return Text('${controller.count1.value}'); + }, +), +GetX( + builder: (controller) { + print("count 2 rebuild"); + return Text('${controller.count2.value}'); + }, +), +GetX( + builder: (controller) { + print("count 3 rebuild"); + return Text('${controller.sum}'); + }, +), +``` + +Если мы увеличим `count1.value++`, он выведет: +- `count 1 rebuild` +- `count 3 rebuild` + +поскольку `count1` имеет значение `1`, а `1 + 0 = 1`, изменяет геттер `sum`. + +Если мы изменим `count2.value++`, он выведет: +- `count 2 rebuild` +- `count 3 rebuild` + +так как `count2.value` изменился, и теперь `sum` равен `2`. + +- Примечание: По умолчанию самое первое событие перестраивает виджет, даже если это то же значение. + Такое поведение существует из-за Boolean переменных. + +Представьте, что вы сделали это: + +```dart +var isLogged = false.obs; +``` + +А затем вы проверили, вошел ли пользователь в систему, чтобы вызвать событие в `ever`. + +```dart +@override +onInit(){ + ever(isLogged, fireRoute); + isLogged.value = await Preferences.hasToken(); +} + +fireRoute(logged) { + if (logged) { + Get.off(Home()); + } else { + Get.off(Login()); + } +} +``` + +Если `hasToken` был `false`, `isLogged` не изменится, поэтому `ever()` никогде не будет вызван. +Чтобы избежать такого поведения, первое изменение _observable_ всегда будет запускать событие, даже если оно содержит то же самое `.value`. + +Вы можете убран данное поведение, если хотите, используя: +`isLogged.firstRebuild = false;` + +### Условия для перестраивания + +Кроме того, Get обеспечивает усовершенствованный контроль состояния. Вы можете обусловить событие (например, добавление объекта в список) определенным условием. + +```dart +// First parameter: condition, must return true of false +// Second parameter: the new value to aplly if the condition is true +list.addIf(item < limit, item); +``` + +Без украшений, без генератора кода, без сложностей :smile: + +Вы ведь знаете счётчик Flutter? Ваш класс контроллера может выглядеть так: + +```dart +class CountController extends GetxController { + final count = 0.obs; +} +``` + +С простым: + +```dart +controller.count.value++ +``` + +Вы можете обновить переменную счетчика в своем пользовательском интерфейсе, независимо от того, где она хранится. + +### Где .obs может быть использован + +Вы можете преобразовать что угодно в obs. Вот два способа сделать это: + +* Вы можете преобразовать значения вашего класса в obs +```dart +class RxUser { + final name = "Camila".obs; + final age = 18.obs; +} +``` + +* или вы можете преобразовать весь класс в observable +```dart +class User { + User({String name, int age}); + var name; + var age; +} + +// when instantianting: +final user = User(name: "Camila", age: 18).obs; +``` + +### Примечание о списках + +Списки полностью наблюдаемы, как и объекты внутри них. Таким образом, если вы добавите значение в список, он автоматически перестроит виджеты, которые его используют. + +Вам также не нужно использовать ".value" со списками, замечательный API-интерфейс Dart позволяет нам избежать этого. +К сожалению, примитивные типы, такие как String и int, не могут быть расширены, что делает использование .value обязательным, но это не будет проблемой, если вы работаете с геттерами и сеттерами для них. + +```dart +// On the controller +final String title = 'User Info:'.obs +final list = List().obs; + +// on the view +Text(controller.title.value), // String need to have .value in front of it +ListView.builder ( + itemCount: controller.list.length // lists don't need it +) +``` + +Когда вы делаете свои собственные классы наблюдаемыми, есть другой способ их обновить: + +```dart +// on the model file +// we are going to make the entire class observable instead of each attribute +class User() { + User({this.name = '', this.age = 0}); + String name; + int age; +} + + +// on the controller file +final user = User().obs; +// when you need to update the user variable: +user.update( (user) { // this parameter is the class itself that you want to update +user.name = 'Jonny'; +user.age = 18; +}); +// an alternative way of update the user variable: +user(User(name: 'João', age: 35)); + +// on view: +Obx(()=> Text("Name ${user.value.name}: Age: ${user.value.age}")) +// you can also access the model values without the .value: +user().name; // notice that is the user variable, not the class (variable has lowercase u) +``` + +Вам не нужно работать с наборами, если вы этого не хотите, вы можете использовать API "assign" и "assignAll". +API "assign" очистит ваш список и добавит один объект, который вы хотите начать там. +API "assignAll" очистит существующий список и добавит любые повторяемые объекты, которые вы в него вставляете. + +### Почему мне нужно использовать .value + +Мы могли бы убрать обязательство использовать 'value' для `String` и `int` с помощью простого оформления и генератора кода, но цель этой библиотеки как раз и состоит в том, чтобы избежать внешних зависимостей. Мы хотим предложить среду, готовую для программирования, включающую в себя самое необходимое (управление маршрутами, зависимостями и состояниями) простым, легким и производительным способом без необходимости во внешнем пакете. + +Вы можете буквально добавить 3 буквы в свой pubspec (get), двоеточие и начать программировать. Все решения, включенные по умолчанию, от управления маршрутами до управления состоянием, нацелены на простоту, продуктивность и производительность. + +Общий вес этой библиотеки меньше, чем у одного менеджера состояний, хотя это полное решение, и это то, что вы должны понимать. + +Если вас беспокоит `.value`, и вам нравится генератор кода, MobX - отличная альтернатива, и вы можете использовать его вместе с Get. Для тех, кто хочет добавить одну зависимость в pubspec и начать программировать, не беспокоясь ни о совместимости версий пакетов, ни об ошибках обновления состояния исходящих от менеджеров состояний или зависимостей и не хочет беспокоиться о доступности контроллеров, а «просто программирование», Get идеален. + +Если у вас нет проблем с MobX или BLoC, вы можете просто использовать Get для маршрутов и забыть о том, что у него есть менеджер состояний. Простой и реактивный менеджеры состояний Get появились из-за то, что в моей компании был проект с более чем 90 контроллерами, а генератору кода после flutter clean требовалось более 30 минут для выполнения своих задач на достаточно хорошей машине. Если у вас 5, 10, 15 контроллеров, то вам подойдёт любой менеджер состояний. Если у вас абсурдно большой проект и генератор кода является для вас проблемой, то решение прямо перед вами. + +Очевидно, что если кто-то хочет внести свой вклад в проект и создать генератор кода или что-то подобное, я укажу об этом в readme в качестве альтернативы. Моя потребность не в востребованности для всех разработчиков, я лишь говорю, что есть хорошие решения, которые уже делают это, например, MobX. + +### Obx() + +Bindings в Get необязательны. Вы можете использовать виджет Obx вместо GetX, который получает только анонимную функцию, создающую виджет. +Очевидно, что если вы не используете тип, вам потребуется экземпляр вашего контроллера для использования переменных или использовать `Get.find()`.value или Controller.to.value для получения значения. + +### Workers + +Workers помогут вам, инициируя определенные обратные вызовы при возникновении события. + +```dart +/// Called every time `count1` changes. +ever(count1, (_) => print("$_ has been changed")); + +/// Called only first time the variable $_ is changed +once(count1, (_) => print("$_ was changed once")); + +/// Anti DDos - Called every time the user stops typing for 1 second, for example. +debounce(count1, (_) => print("debouce$_"), time: Duration(seconds: 1)); + +/// Ignore all changes within 1 second. +interval(count1, (_) => print("interval $_"), time: Duration(seconds: 1)); +``` +У всех workers (кроме `debounce`) есть именованный параметр `condition`, которое может быть `bool` или обратным вызовом возвращающим `bool`. +Этот `condition` определяет, когда выполняется функция обратного вызова. + +Все workers возвращают экземпляр `Worker`, который можно использовать для отмены (с помощью метода `dispose()`) worker. + +- **`ever`** + вызывается каждый раз, когда переменная _Rx_ выдает новое значение. + +- **`everAll`** + как `ever`, но он принимает `List` значений _Rx_ вызываемый каждый раз, когда его переменная изменяется. Вот и всё. + + +- **`once`** +'once' вызывается только при первом изменении переменной. + +- **`debounce`** +'debounce' очень полезен в функциях поиска, где вы хотите, чтобы API вызывался только тогда, когда пользователь заканчивает ввод. Если пользователь вводит "Jonny", у вас будет 5 поисковых запросов в API по буквам J, o, n, n и y. С Get этого не происходит, потому что у вас будет "debounce" Worker, который будет запускаться только в конце набора. + +- **`interval`** +'interval' отличается от `debouce`. В `debouce`, если пользователь внесёт 1000 изменений в переменную в течение 1 секунды, он отправит только последнее после установленного таймера (по умолчанию 800 миллисекунд). Вместо этого Interval будет игнорировать все действия пользователя в течение указанного периода. Если вы отправляете события в течение 1 минуты, 1000 в секунду, debounce отправит вам только последнее, когда пользователь прекратит стрелять событиями. Interval будет доставлять события каждую секунду, а если установлен на 3 секунды, то он будет доставлять 20 событий в эту минуту. Это рекомендуется во избежание злоупотреблений в функциях, где пользователь может быстро щелкнуть что-либо и получить некоторое преимущество (представьте, что пользователь может зарабатывать монеты, щелкая что-либо, если он щелкнет 300 раз за ту же минуту, у него будет 300 монет, используя интервал, вы можете установить временной интервал на 3 секунды, и даже если щелкнуть 300 или тысячу раз, максимум, который он получит за 1 минуту, составит 20 монет, щелкнув 300 или 1 миллион раз). Debounce подходит для защиты от DDos, для таких функций, как поиск, где каждое изменение onChange будет вызывать запрос к вашему API. Debounce будет ждать, пока пользователь перестанет вводить имя, чтобы сделать запрос. Если бы он использовался в вышеупомянутом сценарии с монетами, пользователь накликал бы только 1 монету, потому что он выполняется только тогда, когда пользователь "делает паузу" на установленное время. + +- ПРИМЕЧАНИЕ: должны всегда использоваться при запуске контроллера или класса, поэтому он всегда должен быть в onInit (рекомендуется), в конструкторе класса или в initState StatefulWidget (в большинстве случаев эта практика не рекомендуется, но не должна иметь побочных эффектов). + +## Обычное управление состоянием + +Get имеет чрезвычайно легкий и простой менеджер состояний, который не использует ChangeNotifier, удовлетворит потребности, особенно для тех, кто плохо знаком с Flutter, и не вызовет проблем для больших приложений. + +GetBuilder нацелен именно на контроль нескольких состояний. Представьте, что вы добавили 30 продуктов в корзину, вы нажимаете удалить один, одновременно с этим обновляется список, обновляется цена, а значок в корзине покупок обновляется до меньшего числа. Такой подход делает GetBuilder убийственным, потому что он группирует состояния и изменяет их все сразу без какой-либо "вычислительной логики" для этого. GetBuilder был создан с учётом такого рода ситуаций, поскольку для временного изменения состояния вы можете использовать setState, и для этого вам не понадобится менеджер состояний. + +Таким образом, если вам нужен отдельный контроллер, вы можете назначить для него идентификаторы или использовать GetX. Это зависит от вас, помните, что чем больше у вас «индивидуальных» виджетов, тем больше ресурсов будет забирать GetX, в то время как производительность GetBuilder должна быть выше при многократном изменении состояния. + +### Преимущества + +1. Обновляйте только необходимые виджеты. + +2. Не используйте changeNotifier, это менеджер состояний, который использует меньше памяти (около 0 МБ). + +3. Забудьте о StatefulWidget! С Get он больше не понадобится. С другими менеджерами состояний вам, вероятно, придется использовать StatefulWidget, чтобы получить экземпляр вашего Provider, BLoC, MobX Controller и т.д. Но задумывались ли вы когда-нибудь о том, что ваш AppBar, Scaffold и большинство виджетов в вашем классе не имеют состояния и по сути являются Stateless? Так зачем хранить состояние всего класса, если можно хранить только состояние виджета, которые истинно Stateful? Get решает и эту проблему. Создавайте классы Stateless, всё делайте stateless. Если вам нужно обновить один компонент, просто оберните его GetBuilder. + +4. Организуйте свой проект по-настоящему! Контроллеры не должны быть в вашем пользовательском интерфейсе, поместите ваш TextEditController или любой контроллер, который вы используете, в свой класс Controller. + +5. Вам нужно инициировать событие для обновления виджета, как только он будет отрисован? GetBuilder имеет свойство initState, как и StatefulWidget, и вы можете вызывать события вашего контроллера прямо из него. + +6. Вам необходимо инициировать такие действия как закрытия потоков, таймеров и т.д.? GetBuilder также имеет свойство dispose, с помощью которого вы можете вызывать события, как только этот виджет будет уничтожен. + +7. Используйте потоки только при необходимости. Вы можете использовать свои StreamControllers внутри своего контроллера в обычном режиме, а также использовать StreamBuilder как обычно, но помните, что поток разумно потребляет память и реактивное программирование - это прекрасно, но вы не должны злоупотреблять этим. 30 потоков, открытых одновременно, может быть хуже, чем changeNotifier (а changeNotifier - очень плохо). + +8. Обновляйте виджеты, не тратя на это оперативную память. Get сохраняет только идентификатор создателя GetBuilder и обновляет этот GetBuilder при необходимости. Потребление памяти для хранения идентификатора get в памяти очень низкое даже для тысяч GetBuilders. Когда вы создаете новый GetBuilder, вы фактически передаёте состояние GetBuilder, у которого есть идентификатор создателя. Новое состояние не создается для каждого GetBuilder, что экономит МНОГО ОЗУ для больших приложений. В основном ваше приложение будет полностью Stateless, и несколько виджетов, которые Stateful (при помощи GetBuilder), будут иметь общее состояние, и поэтому обновление обного обновит их всех. Состояние всего одно. + +9. Get - всеведущий и в большинстве случаев точно знает, в какое время нужно извлечь контроллер из памяти. Вам не следует беспокоиться о том, когда утилизировать контроллер, Get знает, когда это сделать. + +### Использование + +```dart +// Create controller class and extends GetxController +class Controller extends GetxController { + int counter = 0; + void increment() { + counter++; + update(); // use update() to update counter variable on UI when increment be called + } +} +// On your Stateless/Stateful class, use GetBuilder to update Text when increment be called +GetBuilder( + init: Controller(), // INIT IT ONLY THE FIRST TIME + builder: (_) => Text( + '${_.counter}', + ), +) +//Initialize your controller only the first time. The second time you are using ReBuilder for the same controller, do not use it again. Your controller will be automatically removed from memory as soon as the widget that marked it as 'init' is deployed. You don't have to worry about that, Get will do it automatically, just make sure you don't start the same controller twice. +``` + +**Готово!** + +- Вы уже узнали, как управлять состояниями с помощью Get. + +- Примечание: Возможно, вам нужна более крупная организация и не использовать свойство init. Для этого вы можете создать класс и расширить класс Bindings, указав в нем контроллеры, которые будут созданы в рамках этого маршрута. Контроллеры не будут создаваться в это время, наоборот, это просто инструкция, так что при первом использовании контроллера Get будет знать, где его искать. Get останется lazyLoad и продолжит удалять контроллеры, когда они больше не нужны. Смотрите пример в pub.dev, чтобы увидеть, как это работает. + +Если вы перемещаетесь по многим маршрутам и вам нужны данные, которые были в вашем ранее используемом контроллере, вам просто нужно использовать снова GetBuilder (без инициализации): + +```dart +class OtherClass extends StatelessWidget { + @override + Widget build(BuildContext context) { + return Scaffold( + body: Center( + child: GetBuilder( + builder: (s) => Text('${s.counter}'), + ), + ), + ); + } + +``` + +Если вам нужно использовать свой контроллер во многих других местах и ​​за пределами GetBuilder, просто создайте get в своем контроллере и легко его получите. (или используйте `Get.find()`) + +```dart +class Controller extends GetxController { + + /// You do not need that. I recommend using it just for ease of syntax. + /// with static method: Controller.to.increment(); + /// with no static method: Get.find().increment(); + /// There is no difference in performance, nor any side effect of using either syntax. Only one does not need the type, and the other the IDE will autocomplete it. + static Controller get to => Get.find(); // add this line + + int counter = 0; + void increment() { + counter++; + update(); + } +} +``` + +И тогда вы можете напрямую получить доступ к своему контроллеру: + +```dart +FloatingActionButton( + onPressed: () { + Controller.to.increment(), + } // This is incredibly simple! + child: Text("${Controller.to.counter}"), +), +``` + +Когда вы нажимаете FloatingActionButton, все виджеты, которые прослушивают переменную 'counter', будут обновлены автоматически. + +### Как обрабатываются контроллеры + +Допустим, у нас есть это: + +`Class a => Class B (has controller X) => Class C (has controller X)` + +В классе A контроллер ещё не находится в памяти, потому что вы его ещё не использовали (Get is lazyLoad). В классе B вы использовали контроллер, и он вошёл в память. В классе C вы использовали тот же контроллер, что и в классе B, Get будет разделять состояние контроллера B с контроллером C, и тот же контроллер всё ещё находится в памяти. Если вы закроете экран C и экран B, Get автоматически извлечёт контроллер X из памяти и освободит ресурсы, поскольку класс A не использует контроллер. Если вы снова перейдете к B, контроллер X снова войдет в память, если вместо перехода к классу C вы снова вернётесь к классу A, Get таким же образом выведет контроллер из памяти. Если класс C не использовал контроллер, а вы вынули класс B из памяти, ни один класс не будет использовать контроллер X, и, соответственно, он будет удален. Единственное исключение, которое может случиться с Get, - это если вы неожиданно удалите B из маршрута и попытаетесь использовать контроллер в C. В этом случае идентификатор создателя контроллера, который был в B, был удален, и Get был запрограммирован на удаление его из памяти каждого контроллера, у которого нет идентификатора создателя. Если вы намереваетесь сделать это, добавьте флаг "autoRemove: false" в GetBuilder класса B GetBuilder и используйте adoptID = true в GetBuilder класса C. + +### Вам больше не понадобятся StatefulWidgets + +Использование StatefulWidgets означает ненужное сохранение состояния всех экранов, даже если вам нужно минимально перестроить виджет, вы встроите его в Consumer/Observer/BlocProvider/GetBuilder/GetX/Obx, которые будет ещё одним StatefulWidget. +Класс StatefulWidget - это класс большего размера, чем StatelessWidget, который будет выделять больше оперативной памяти, и это может не иметь существенного значения между одним или двумя классами, но, безусловно, будет иметь место, когда у вас их 100! +Если вам не нужно использовать миксин, например TickerProviderStateMixin, использовать StatefulWidget с Get совершенно не нужно. + +Вы можете вызывать все методы StatefulWidget прямо из GetBuilder. +Например, если вам нужно вызвать метод initState() или dispose(), вы можете вызвать их напрямую; + +```dart +GetBuilder( + initState: (_) => Controller.to.fetchApi(), + dispose: (_) => Controller.to.closeStreams(), + builder: (s) => Text('${s.username}'), +), +``` + +Гораздо лучший подход, чем этот, - использовать методы onInit() и onClose() непосредственно из вашего контроллера. + +```dart +@override +void onInit() { + fetchApi(); + super.onInit(); +} +``` + +- ПРИМЕЧАНИЕ: Если вы хотите запустить метод в момент первого вызова контроллера, вам НЕ НУЖНО использовать для этого конструкторы, на самом деле, используя ориентированный на производительность пакет, такой как Get, это граничит с плохой практикой, потому что отклоняется от логики, в которой контроллеры создаются или выделяются (если вы создаете экземпляр этого контроллера, конструктор будет вызываться немедленно, вы будете заполнять контроллер ещё до того, как он будет использован, вы выделяете память, не используя её , это определенно вредит принципам этой библиотеки). +Методы onInit(); и onClose(); были созданы для этого, они будут вызываться при создании Контроллера или использоваться в первый раз, в зависимости от того, используете вы Get.lazyPut или нет. +Если вы хотите, например, вызвать ваш API для заполнения данных, вы можете забыть о старомодном методе initState/dispose, просто начните свой вызов api в onInit, и если вам нужно выполнить любую команду как закрытие потоков, используйте для этого onClose(). + +### Почему это существует + +Цель этого пакета - предоставить вам законченное решение для навигации по маршрутам, управления зависимостями и состояниями с использованием минимально возможных зависимостей с высокой степенью разделения. +Get включает в себя все высокоуровневые и низкоуровневые API-интерфейсы Flutter, чтобы гарантировать, что вы работаете с наименьшими взаимозависимостями. +Мы централизуем всё в одном пакете, чтобы гарантировать, что у вас нет никакой взаимозависимости в вашем проекте. +Таким образом, вы можете поместить в свое представление только виджеты и оставить часть своей команды, которая работает с бизнес-логикой, свободной, чтобы работать с бизнес-логикой независимо от какого-либо элемента представления. +Это обеспечивает гораздо более чистую рабочую среду, так что часть вашей команды работает только с виджетами, не беспокоясь об отправке данных на ваш контроллер, а часть вашей команды работает только с бизнес-логикой, независимо от какого-либо элемента представления. + +Итак, чтобы упростить это: вам не нужно вызывать методы в initState и отправлять их по параметрам на ваш контроллер или использовать для этого конструктор вашего контроллера, у вас есть метод onInit (), который вызывается в нужное время, чтобы вы могли начать ваши сервисы. +Вам не нужно вызывать устройство, у вас есть метод onClose(), который будет вызываться именно в тот момент, когда ваш контроллер больше не нужен и будет удален из памяти. Таким образом, оставьте представления только для виджетов, воздерживаясь от какой-либо бизнес-логики. + +Не вызывайте метод удаления внутри GetxController, он ничего не сделает, помните, что контроллер не является виджетом, его не следует "удалять", и он будет автоматически и разумно удалён из памяти с помощью Get. +Если вы использовали какой-либо поток и хотите закрыть его, просто вставьте его в метод close. Пример: + +```dart +class Controller extends GetxController { + StreamController user = StreamController(); + StreamController name = StreamController(); + + /// close stream = onClose method, not dispose. + @override + void onClose() { + user.close(); + name.close(); + super.onClose(); + } +} +``` + +Жизненный цикл контроллера: + +- onInit() когда он создается. +- onClose() когда он закрывается для внесения каких-либо изменений при подготовке к удалению. +- удалено: у вас нет доступа к этому API, потому что он буквально удаляет контроллер из памяти. Он буквально удаляется, не оставляя следов. + +### Другие способы использования + +Вы можете использовать экземпляр контроллера непосредственно со значением GetBuilder: + +```dart +GetBuilder( + init: Controller(), + builder: (value) => Text( + '${value.counter}', //here + ), +), +``` + +Вам также может понадобиться экземпляр вашего контроллера вне GetBuilder, и вы можете использовать эти подходы для достижения этой цели: + +```dart +class Controller extends GetxController { + static Controller get to => Get.find(); +[...] +} +// on you view: +GetBuilder( + init: Controller(), // use it only first time on each controller + builder: (_) => Text( + '${Controller.to.counter}', //here + ) +), +``` + +или + +```dart +class Controller extends GetxController { + // static Controller get to => Get.find(); // with no static get +[...] +} +// on stateful/stateless class +GetBuilder( + init: Controller(), // use it only first time on each controller + builder: (_) => Text( + '${Get.find().counter}', //here + ), +), +``` + +- Для этого можно использовать "неканоничные" подходы. Если вы используете какой-либо другой менеджер зависимостей, например get_it, modular и т.д., и просто хотите доставить экземпляр контроллера, вы можете сделать это: + +```dart +Controller controller = Controller(); +[...] +GetBuilder( + init: controller, //here + builder: (_) => Text( + '${controller.counter}', // here + ), +), + +``` + +### Уникальные идентификаторы + +Если вы хотите уточнить элемент управления обновлением виджета с помощью GetBuilder, вы можете назначить им уникальные идентификаторы: + +```dart +GetBuilder( + id: 'text' + init: Controller(), // use it only first time on each controller + builder: (_) => Text( + '${Get.find().counter}', //here + ), +), +``` + +И обновите это следующим образом: + +```dart +update(['text']); +``` + +Также можно наложить условия на обновление: + +```dart +update(['text'], counter < 10); +``` + +GetX делает это автоматически и восстанавливает только виджет, который использует точную переменную, которая была изменена, если вы измените переменную на ту же самую, что и предыдущая, и это не означает изменения состояния, GetX не будет перестраивать виджет для экономии памяти и CPU (На экране отображается 3, и вы снова меняете переменную на 3. В большинстве менеджеров состояний это вызовет новую перестройку, но с GetX виджет будет перестраиваться снова только в том случае, если на самом деле его состояние изменилось). + +## Смешивание двух менеджеров состояний + +Некоторые открыли запрос, так как они хотели использовать только один тип реактивной переменной и другой механизм, и для этого нужно было вставить Obx в GetBuilder. +Подумав об этом, был создан MixinBuilder. +Он позволяет как реактивные изменения путем изменения переменных ".obs", так и механические обновления через update(). +Однако из 4 виджетов он - тот, который потребляет больше всего ресурсов, поскольку помимо подписки на получение событий изменений от своих дочерних элементов, он подписывается на метод обновления своего контроллера. + +Расширение GetxController важно, поскольку у них есть жизненные циклы, и они могут "запускать" и "завершать" события в своих методах onInit() и onClose(). +Вы можете использовать для этого любой класс, но я настоятельно рекомендую вам использовать класс GetxController для размещения ваших переменных, независимо от того, наблюдаемы они или нет. + + +## GetBuilder vs GetX vs Obx vs MixinBuilder + +За десять лет работы с программированием я смог извлечь несколько ценных уроков. + +Мой первый контакт с реактивным программированием был таким: "Вау, это невероятно", и на самом деле реактивное программирование невероятно. +Однако он подходит не для всех ситуаций. Часто всё, что вам нужно, - это изменить состояние 2 или 3 виджетов одновременно или кратковременное изменение состояния, и в этом случае реактивный подход неплох, но не подходит. + +Реактивное программирование требует более высокого потребления оперативной памяти, что может быть компенсировано отдельным рабочим процессом, который гарантирует, что только один виджет будет перестроен и при необходимости, но создание списка из 80 объектов, каждый с несколькими потоками, не является хорошей идеей. +Откройте dart inspect и проверьте, сколько потребляет StreamBuilder, и вы поймёте, что я пытаюсь вам сказать. + +Имея это в виду, я создал простой менеджер состояний. Это просто, и это именно то, что вы должны от него требовать: обновление состояния в блоках простым и наиболее экономичным способом. + +GetBuilder очень экономичен в оперативной памяти, и вряд ли существует более экономичный подход, чем он (по крайней мере, я не могу представить его, если он существует, сообщите нам). + +Однако GetBuilder по-прежнему является механическим менеджером состояний, вам нужно вызвать update() так же, как вам нужно было бы вызвать notifyListeners() провайдера. + +Бывают и другие ситуации, когда реактивное программирование действительно интересно, и не работать с ним - все равно, что изобретать колесо. +Имея это в виду, GetX был создан, чтобы предоставить всё самое современное и продвинутое в менеджере состояний. +Он обновляет только то, что необходимо, и при необходимости, если у вас есть ошибка и вы отправляете 300 изменений состояния одновременно, GetX будет фильтровать и обновлять экран только в том случае, если состояние действительно изменяется. + +GetX по-прежнему более экономичен, чем любой другой менеджер реактивного состояния, но он потребляет немного больше оперативной памяти, чем GetBuilder. +Думая об этом и стремясь максимизировать потребление ресурсов, Obx был создан. +В отличие от GetX и GetBuilder, вы не сможете инициализировать контроллер внутри Obx, это просто виджет с StreamSubscription, который получает события изменения от ваших детей, вот и всё. +Он более экономичен, чем GetX, но проигрывает GetBuilder, что и следовало ожидать, поскольку он является реактивным, а GetBuilder имеет самый упрощенный подход к хранению хэш-кода виджета и его StateSetter. +С Obx вам не нужно писать свой тип контроллера, и вы можете услышать изменение от нескольких разных контроллеров, но его необходимо инициализировать перед этим, используя примерный подход в начале этого файла readme или используя класс Bindings. diff --git a/siro_rider/packages/get/documentation/vi_VI/dependency_management.md b/siro_rider/packages/get/documentation/vi_VI/dependency_management.md new file mode 100644 index 0000000..a5fac49 --- /dev/null +++ b/siro_rider/packages/get/documentation/vi_VI/dependency_management.md @@ -0,0 +1,380 @@ +# Quản lý dependency +- [Quản lý dependency](#dependency-management) + - [Instancing methods](#instancing-methods) + - [Get.put()](#getput) + - [Get.lazyPut](#getlazyput) + - [Get.putAsync](#getputasync) + - [Get.create](#getcreate) + - [Sử dụng các phương thức / class](#using-instantiated-methodsclasses) + - [Khác nhau giữa phương thức (methods)](#differences-between-methods) + - [Bindings](#bindings) + - [Cách sử dụng](#how-to-use) + - [BindingsBuilder](#bindingsbuilder) + - [SmartManagement](#smartmanagement) + - [Cách thay đổi](#How-to-change) + - [SmartManagement.full](#smartmanagementfull) + - [SmartManagement.onlyBuilders](#smartmanagementonlybuilders) + - [SmartManagement.keepFactory](#smartmanagementkeepfactory) + - [Cách bindings làm việc ngầm](#how-bindings-work-under-the-hood) + - [Chí ú](#notes) + +Get có một trình quản lý dependency đơn giản và mạnh mẽ cho phép bạn truy xuất cùng một class với Blocs hoặc Controller của bạn chỉ với 1 dòng mã, không có "context", không có InheritedWidget + +```dart +Controller controller = Get.put(Controller()); // Rather Controller controller = Controller(); +``` + +Thay vì khởi tạo class của bạn trong class bạn đang sử dụng, bạn đang khởi tạo nó trong phiên bản Get, điều này sẽ làm cho nó có sẵn trên toàn bộ Ứng dụng của bạn. +Vì vậy, bạn có thể sử dụng controller (hoặc class Blocs) của mình một cách bình thường + +- Note: Nếu bạn đang sử dụng Get's State Manager, hãy chú ý hơn đến [Bindings](#bindings) api, điều này sẽ giúp kết nối chế độ xem với controller của bạn dễ dàng hơn. +- Note²: Quản lý state của Get được tách biệt khỏi các phần khác của gói, vì vậy, nếu ví dụ: nếu ứng dụng của bạn đã sử dụng trình quản lý state (bất kỳ cái nào, không quan trọng), bạn không cần phải thay đổi điều đó, bạn có thể sử dụng phần dependency này người quản lý không có vấn đề gì cả + +## Instancing methods +Các phương thức và các tham số có thể định cấu hình của nó là: + +### Get.put() + +Cách phổ biến nhất để chèn một dependency, là một điều tốt cho controller của View của bạn. + +```dart +Get.put(SomeClass()); +Get.put(LoginController(), permanent: true); +Get.put(ListItemController, tag: "some unique string"); +``` + +Đây là tùy chọn mà bạn có thể đặt lệnh: +```dart +Get.put( + // mandatory: the class that you want to get to save, like a controller or anything + // note: "S" means that it can be a class of any type + S dependency + + // optional: this is for when you want multiple classess that are of the same type + // since you normally get a class by using Get.find(), + // you need to use tag to tell which instance you need + // must be unique string + String tag, + + // optional: by default, get will dispose instances after they are not used anymore (example, + // the controller of a view that is closed), but you might need that the instance + // to be kept there throughout the entire app, like an instance of sharedPreferences or something + // so you use this + // defaults to false + bool permanent = false, + + // optional: allows you after using an abstract class in a test, replace it with another one and follow the test. + // defaults to false + bool overrideAbstract = false, + + // optional: allows you to create the dependency using function instead of the dependency itself. + // this one is not commonly used + InstanceBuilderCallback builder, +) +``` + +### Get.lazyPut +Có thể lazyLoad một dependecy để nó chỉ được khởi tạo khi được sử dụng. Rất hữu ích cho các class ngốn nhiều tài nguyên hoặc nếu bạn muốn khởi tạo một số class chỉ ở một nơi (như trong class Bindings) và bạn biết rằng mình sẽ không sử dụng class đó tại thời điểm nhất định. + +```dart +/// ApiMock will only be called when someone uses Get.find for the first time +Get.lazyPut(() => ApiMock()); + +Get.lazyPut( + () { + // ... some logic if needed + return FirebaseAuth(); + }, + tag: Math.random().toString(), + fenix: true +) + +Get.lazyPut( () => Controller() ) +``` + +Đây là các tùy chọn bạn có thể đặt lệnh: +```dart +Get.lazyPut( + // mandatory: a method that will be executed when your class is called for the first time + InstanceBuilderCallback builder, + + // optional: same as Get.put(), it is used for when you want multiple different instance of a same class + // must be unique + String tag, + + // optional: It is similar to "permanent", the difference is that the instance is discarded when + // is not being used, but when it's use is needed again, Get will recreate the instance + // just the same as "SmartManagement.keepFactory" in the bindings api + // defaults to false + bool fenix = false + +) +``` + +### Get.putAsync + Đây là khi bạn muốn xài asynchronize code `Get.putAsync`: + +```dart +Get.putAsync(() async { + final prefs = await SharedPreferences.getInstance(); + await prefs.setInt('counter', 12345); + return prefs; +}); + +Get.putAsync( () async => await YourAsyncClass() ) +``` + +Đây là tùy chọn bạn có thể đặt lệnh với putAsync: +```dart +Get.putAsync( + + // mandatory: an async method that will be executed to instantiate your class + AsyncInstanceBuilderCallback builder, + + // optional: same as Get.put(), it is used for when you want multiple different instance of a same class + // must be unique + String tag, + + // optional: same as in Get.put(), used when you need to maintain that instance alive in the entire app + // defaults to false + bool permanent = false +) +``` + +### Get.create + +Cái này hơi khó giải thích, nhưng sự khác nhau giữa chúng có thể được tìm thấy trên mục [Differences between methods:](#differences-between-methods) + +```dart +Get.Create(() => SomeClass()); +Get.Create(() => LoginController()); +``` + +Tùy chọn có thể sử dụng: + +```dart +Get.create( + // required: a function that returns a class that will be "fabricated" every + // time `Get.find()` is called + // Example: Get.create(() => YourClass()) + FcBuilderFunc builder, + + // optional: just like Get.put(), but it is used when you need multiple instances + // of a of a same class + // Useful in case you have a list that each item need it's own controller + // needs to be a unique string. Just change from tag to name + String name, + + // optional: just like int`Get.put()`, it is for when you need to keep the + // instance alive thoughout the entire app. The difference is in Get.create + // permanent is true by default + bool permanent = true +``` + +## Sử dụng các phương thức / class + +Hãy tưởng tượng rằng bạn đã điều hướng qua nhiều route và bạn cần một dữ liệu còn sót trong controller của mình, bạn sẽ cần một trình quản lý state kết hợp với Provider hoặc Get_it, phải hem? Với Get, bạn chỉ cần yêu cầu Get to "find" cho controller của mình và thế là xong: + +```dart +final controller = Get.find(); +// OR +Controller controller = Get.find(); + +// Yes, it looks like Magic, Get will find your controller, and will deliver it to you. +// You can have 1 million controllers instantiated, Get will always give you the right controller. +``` + +Và sau đó, bạn sẽ có thể khôi phục dữ liệu controller của mình đã lấy được ở đó: + +```dart +Text(controller.textFromApi); +``` + +Vì giá trị trả về là một class bình thường, bạn có thể làm bất cứ điều gì bạn muốn: +```dart +int count = Get.find().getInt('counter'); +print(count); // out: 12345 +``` + +Để xóa một controller đang chạy ngầm của Get: + +```dart +Get.delete(); //thường thì Get tự xóa, bạn không cần phải đặt lệnh này. +``` + +## Khác nhau giữa phương thức (methods) + +Đầu tiên, hãy nói về `fenix` của Get.lazyPut và `permanent`của các phương thức khác. + +Sự khác biệt cơ bản giữa `permanent` và `fenix` là cách bạn muốn lưu trữ các cá thể của mình. + +Củng cố: theo mặc định, GetX xóa các trường hợp khi chúng không được sử dụng. +Có nghĩa là: Nếu màn hình 1 có controller 1 và màn hình 2 có controller 2 và bạn xóa route đầu tiên khỏi stack, (chẳng hạn như nếu bạn sử dụng `` Get.off () 'hoặc' `Get.offNamed()``) thì controller 1 bị mất việc sử dụng nó vì vậy nó sẽ bị xóa. + +Nhưng nếu bạn muốn chọn sử dụng `permanent: true`, thì controller sẽ không bị mất trong quá trình chuyển đổi này - điều này rất hữu ích cho các dịch vụ mà bạn muốn duy trì hoạt động trong toàn bộ ứng dụng. + +Mặt khác, `fenix` dành cho các dịch vụ mà bạn không lo bị mất giữa các lần thay đổi màn hình, nhưng khi bạn cần dịch vụ đó, bạn hy vọng rằng nó vẫn tồn tại. Vì vậy, về cơ bản, nó sẽ loại bỏ controller / service / class không sử dụng, nhưng khi bạn cần, nó sẽ "tạo lại từ đống tro tàn" ở một trường hợp (instance) mới. + +Tiếp tục với sự khác biệt giữa các phương pháp: + +- Get.put và Get.putAsync tuân theo cùng một thứ tự tạo, với sự khác biệt là một cái sử dụng phương thức không đồng bộ: hai phương thức đó đều tạo và khởi tạo các trường hợp. Cái sử dụng không đồng bộ được chèn trực tiếp vào bộ nhớ, bằng cách sử dụng phương thức nội bộ `insert` với các tham số `permanent: false` và` isSingleton: true` (tham số isSingleton này chỉ nhằm mục đích cho biết liệu nó có sử dụng dependency vào `dependency` hay không hoặc nếu nó được sử dụng dependency vào `FcBuilderFunc`). Sau đó, `Get.find ()` được gọi để khởi tạo ngay lập tức các các trường hợp trên bộ nhớ. + +- Get.create: Như tên của nó, nó sẽ "tạo ra" sự dependency cho bạn! Tương tự như `Get.put ()`, nó cũng gọi phương thức nội bộ là `insert` để các trường hợp. Nhưng `permanent` trở thành true và` isSingleton` trở thành false (vì chúng ta đang "tạo" dependency của mình, không có cách nào để nó là một instace singleton, đó là lý do tại sao lại là false). Và bởi vì nó có `permanent: true`, chúng tôi mặc định có lợi ích là không bị mất nó giữa các màn hình! Ngoài ra, `` Get.find () 'không được gọi ngay lập tức, nó phải chờ được sử dụng trong màn hình để được gọi. Nó được tạo ra theo cách này để sử dụng tham số `permanent ', vì vậy, đáng chú ý là` Get.create () `được tạo ra với mục tiêu tạo ra các phiên bản không được chia sẻ, nhưng không bị loại bỏ, như ví dụ: trong listView, mà bạn muốn có một phiên bản duy nhất cho danh sách đó - do đó, Get.create phải được sử dụng cùng với GetWidget. + +- Get.lazyPut: Như tên của nó, nó là một quy trình lười biếng. Cá thể được tạo, nhưng nó không được gọi để sử dụng ngay lập tức, nó vẫn đang chờ được gọi. Trái ngược với các phương thức khác, `insert` không được gọi ở đây. Thay vào đó, cá thể được chèn vào một phần khác của bộ nhớ, một phần chịu trách nhiệm cho biết liệu cá thể đó có thể được tạo lại hay không, chúng ta hãy gọi nó là "nhà máy". Nếu chúng ta muốn tạo ra thứ gì đó để sử dụng sau này, nó sẽ không bị trộn lẫn với những thứ đã được sử dụng ngay bây giờ. Và đây là nơi phép thuật của `fenix` đi vào: nếu bạn chọn bỏ` fenix: false`, và `smartManagement` của bạn không phải là` keepFactory`, thì khi sử dụng `Get.find`, instance sẽ thay đổi vị trí trong bộ nhớ từ "nhà máy" đến vùng bộ nhớ cá thể chung. Ngay sau đó, theo mặc định, nó được xóa khỏi "nhà máy". Bây giờ, nếu bạn chọn `fenix: true`, cá thể vẫn tiếp tục tồn tại trong phần dành riêng này, thậm chí sẽ chuyển sang vùng chung, sẽ được gọi lại trong tương lai. + +## Bindings + +Có lẽ, một trong những điểm khác biệt lớn của gói này là khả năng tích hợp đầy đủ các route, trình quản lý state và trình quản lý dependency. +Khi một route bị xóa khỏi stack, tất cả các controller, biến và phiên bản của các đối tượng liên quan đến nó sẽ bị xóa khỏi bộ nhớ. Nếu bạn đang sử dụng luồng hoặc bộ hẹn giờ, chúng sẽ tự động bị đóng và bạn không phải lo lắng về bất kỳ điều gì trong số đó. +Trong phiên bản 2.10 Được triển khai hoàn toàn API bindings. +Bây giờ bạn không cần sử dụng phương thức init nữa. Bạn thậm chí không cần phải nhập controller của mình nếu bạn không muốn. Bạn có thể khởi động controller và dịch vụ của mình ở nơi thích hợp cho việc đó. +Lớp Binding là một class sẽ tách riêng việc tiêm dependency, trong khi "bindings" các route đường tới trình quản lý state và trình quản lý dependency. +Điều này cho phép Nhận biết màn hình nào đang được hiển thị khi một controller cụ thể được sử dụng và biết vị trí và cách vứt bỏ nó. +Ngoài ra, class Binding sẽ cho phép bạn kiểm soát cấu hình SmartManager. Bạn có thể định cấu hình các phần dependency được sắp xếp khi xóa một route khỏi ngăn xếp hoặc khi widget con đã sử dụng nó được bố trí hoặc không. Bạn sẽ có quản lý dependency thông minh làm việc cho bạn, nhưng ngay cả như vậy, bạn có thể định cấu hình nó theo ý muốn. + +### Bindings class + +- Tạo một class và implements Binding + +```dart +class HomeBinding implements Bindings {} +``` + +IDE của bạn sẽ tự động yêu cầu bạn ghi đè phương thức "dependency" và bạn chỉ cần nhấp vào đèn, ghi đè phương thức và chèn tất cả các class bạn sẽ sử dụng trên route đó: + +```dart +class HomeBinding implements Bindings { + @override + void dependencies() { + Get.lazyPut(() => HomeController()); + Get.put(()=> Api()); + } +} + +class DetailsBinding implements Bindings { + @override + void dependencies() { + Get.lazyPut(() => DetailsController()); + } +} +``` + +Bây giờ bạn chỉ cần thông báo route của mình, rằng bạn sẽ sử dụng bindings đó để tạo kết nối giữa trình quản lý route, các dependency và state. + +- Sử dụng routes có tên: + +```dart +getPages: [ + GetPage( + name: '/', + page: () => HomeView(), + binding: HomeBinding(), + ), + GetPage( + name: '/details', + page: () => DetailsView(), + binding: DetailsBinding(), + ), +]; +``` + +- Sử dụng routes thường: + +```dart +Get.to(Home(), binding: HomeBinding()); +Get.to(DetailsView(), binding: DetailsBinding()) +``` + +Ở đó, bạn không phải lo lắng về việc quản lý bộ nhớ của ứng dụng của mình nữa, Get sẽ thay bạn làm điều đó. + +Lớp Binding được gọi khi một route được gọi, bạn có thể tạo một "InitialBinding trong GetMaterialApp của mình để chèn tất cả các dependency sẽ được tạo. + +```dart +GetMaterialApp( + initialBinding: SampleBind(), + home: Home(), +); +``` + +### BindingsBuilder + +Cách mặc định để tạo bindings là tạo một class thực hiện các bindings. +Nhưng cách khác, bạn có thể sử dụng lệnh gọi lại `BindingsBuilder` để bạn có thể chỉ cần sử dụng một hàm để khởi tạo bất cứ thứ gì bạn muốn. + +Example: + +```dart +getPages: [ + GetPage( + name: '/', + page: () => HomeView(), + binding: BindingsBuilder(() { + Get.lazyPut(() => ControllerX()); + Get.put(()=> Api()); + }), + ), + GetPage( + name: '/details', + page: () => DetailsView(), + binding: BindingsBuilder(() { + Get.lazyPut(() => DetailsController()); + }), + ), +]; +``` + +Bằng cách đó, bạn có thể tránh tạo một class Binding cho mỗi routes, làm cho việc này trở nên đơn giản hơn. + +Cả hai cách làm việc đều hoàn toàn tốt và chúng tôi muốn bạn sử dụng những gì phù hợp với sở thích của bạn nhất. + +### SmartManagement + +GetX theo mặc định loại bỏ controller không sử dụng khỏi bộ nhớ, ngay cả khi xảy ra lỗi và widget con sử dụng nó không được xử lý đúng cách. +Đây được gọi là chế độ quản lý dependency `` đầy đủ`. +Nhưng nếu bạn muốn thay đổi cách GetX kiểm soát việc xử lý các class, bạn có class `SmartManagement` để bạn có thể thiết lập các hành vi khác nhau. + +#### Cách thay đổi + +Nếu bạn muốn thay đổi cấu hình này (mà bạn thường không cần) thì đây là cách: + +```dart +void main () { + runApp( + GetMaterialApp( + smartManagement: SmartManagement.onlyBuilders //here + home: Home(), + ) + ) +} +``` + +#### SmartManagement.full + +Nó là một trong những mặc định. Loại bỏ các class không được sử dụng và không được đặt thành vĩnh viễn. Trong phần lớn các trường hợp, bạn sẽ muốn giữ nguyên cấu hình này. Nếu bạn mới sử dụng GetX thì đừng thay đổi điều này. + +#### SmartManagement.onlyBuilders +Với tùy chọn này, chỉ những controller bắt đầu trong `init: 'hoặc được tải vào Binding với` `Get.lazyPut ()` mới được xử lý. + +Nếu bạn sử dụng `Get.put () 'hoặc' Get.putAsync ()` hoặc bất kỳ cách tiếp cận nào khác, SmartManagement sẽ không có quyền loại trừ sự dependency này. + +Với hành vi mặc định, ngay cả các widget con được khởi tạo bằng "Get.put" sẽ bị xóa, không giống như SmartManagement.onlyBuilders. + +#### SmartManagement.keepFactory + +Cũng giống như SmartManagement.full, nó sẽ loại bỏ các phần dependency của nó khi nó không được sử dụng nữa. Tuy nhiên, nó sẽ giữ nguyên chế độ factory của họ, có nghĩa là nó sẽ tạo lại phần dependency nếu bạn cần lại phiên bản đó. + +### Cách bindings làm việc ngầm +Các liên kết tạo ra các factory tạm thời, được tạo ra ngay khi bạn nhấp để chuyển sang màn hình khác và sẽ bị phá hủy ngay sau khi hoạt ảnh thay đổi màn hình xảy ra. +Điều này xảy ra quá nhanh đến nỗi máy phân tích thậm chí sẽ không thể đăng ký nó. +Khi bạn điều hướng đến màn hình này một lần nữa, một factory tạm thời mới sẽ được gọi, vì vậy điều này thích hợp hơn khi sử dụng SmartManagement.keepFactory, nhưng nếu bạn không muốn tạo Bindings hoặc muốn giữ tất cả các dependency của mình trên cùng một Binding, thì chắc chắn sẽ giúp ích cho bạn. +Các factory chiếm ít bộ nhớ, chúng không chứa các cá thể mà là một chức năng có "hình dạng" của class đó mà bạn muốn. +Điều này có chi phí bộ nhớ rất thấp, nhưng vì mục đích của lib này là để đạt được hiệu suất tối đa có thể bằng cách sử dụng tài nguyên tối thiểu, Get xóa ngay cả các factory theo mặc định. +Sử dụng cái nào thuận tiện nhất cho bạn. + +## Chí ú + +- KHÔNG SỬ DỤNG SmartManagement.keepFactory nếu bạn đang sử dụng nhiều Binding. Nó được thiết kế để sử dụng mà không có Bindings, hoặc với một Bindings duy nhất được liên kết trong `initialBinding` của GetMaterialApp. + +- Việc sử dụng Bindings là hoàn toàn tùy chọn, nếu muốn, bạn có thể sử dụng `Get.put () 'và' Get.find()` trên các class sử dụng controller nhất định mà không gặp bất kỳ vấn đề gì. +Tuy nhiên, nếu bạn làm việc với Service hoặc bất kỳ abstract nào khác, tôi khuyên bạn nên sử dụng Bindings để tổ chức tốt hơn. diff --git a/siro_rider/packages/get/documentation/vi_VI/route_management.md b/siro_rider/packages/get/documentation/vi_VI/route_management.md new file mode 100644 index 0000000..d5f6d1d --- /dev/null +++ b/siro_rider/packages/get/documentation/vi_VI/route_management.md @@ -0,0 +1,569 @@ +- [Quản lý route](#route-management) + - [Hướng dẫn sử dụng trước khi dùng](#how-to-use) + - [Điều hướng không cần tên](#navigation-without-named-routes) + - [Điều hướng cần tên](#navigation-with-named-routes) + - [Gửi data cho route có tên](#send-data-to-named-routes) + - [Dynamic urls links](#dynamic-urls-links) + - [Middleware](#middleware) + - [Điều hướng không cần context](#navigation-without-context) + - [SnackBars](#snackbars) + - [Dialogs](#dialogs) + - [BottomSheets](#bottomsheets) + - [Điều hướng lồng (Nested Navigation)](#nested-navigation) + +# Quản lý route + +Đây là lời giải thích đầy đủ về tất cả những gì có cho Getx khi vấn đề là quản lý routes. + +## Hướng dẫn sử dụng trước khi dùng + +Thêm cái này vào file pubspec.yaml của bạn: + +```yaml +dependencies: + get: +``` + +Nếu bạn định sử dụng các routes / snackbars / dialogs / bottomsheets mà không có "context" hoặc sử dụng các API cấp cao, bạn chỉ cần thêm Get trước MaterialApp của mình, biến nó thành GetMaterialApp và tung hành! + +```dart +GetMaterialApp( // Before: MaterialApp( + home: MyHome(), +) +``` + +## Điều hướng không cần tên + +Để điều hướng đến một màn hình mới: + +```dart +Get.to(NextScreen()); +``` + +Để đóng snackbars, dialog, bottomsheets hoặc bất cứ thứ gì bạn thường đóng bằng Navigator.pop (context); + +```dart +Get.back(); +``` + +Để chuyển đến màn hình tiếp theo và không có tùy chọn nào để quay lại màn hình trước đó (để sử dụng trong SplashScreens, màn hình đăng nhập, v.v.) + +```dart +Get.off(NextScreen()); +``` + +Để chuyển đến màn hình tiếp theo và hủy tất cả các lộ trình trước đó (hữu ích trong giỏ hàng, polls và test) + +```dart +Get.offAll(NextScreen()); +``` + +Để điều hướng đến routes tiếp theo và nhận hoặc cập nhật dữ liệu ngay sau khi bạn trở về từ routes đó: + +```dart +var data = await Get.to(Payment()); +``` + +trên màn hình khác, gửi dữ liệu cho routes trước đó: + +```dart +Get.back(result: 'success'); +``` + +And use it: + +ex: + +```dart +if(data == 'success') madeAnything(); +``` + +Bạn không muốn học cú pháp của chúng tôi? +Chỉ cần thay đổi Navigator (chữ in hoa) thành navigator (chữ thường) và bạn sẽ có tất cả các chức năng của điều hướng tiêu chuẩn mà không cần phải sử dụng "context" +Thí dụ: + +```dart + +// Default Flutter navigator +Navigator.of(context).push( + context, + MaterialPageRoute( + builder: (BuildContext context) { + return HomePage(); + }, + ), +); + +// Get using Flutter syntax without needing context +navigator.push( + MaterialPageRoute( + builder: (_) { + return HomePage(); + }, + ), +); + +// Get syntax (It is much better, but you have the right to disagree) +Get.to(HomePage()); + + +``` + +## Điều hướng cần tên + +- Nếu bạn thích điều hướng bằng tên, Get cũng hỗ trợ điều này. + +To navigate to nextScreen + +```dart +Get.toNamed("/NextScreen"); +``` + +Để điều hướng và xóa màn hình trước đó khỏi cây widget. + +```dart +Get.offNamed("/NextScreen"); +``` + +Để điều hướng và xóa tất cả các màn hình trước đó khỏi cây widget. + +```dart +Get.offAllNamed("/NextScreen"); +``` + +Để định dạng routes, sử dụng GetMaterialApp: + +```dart +void main() { + runApp( + GetMaterialApp( + initialRoute: '/', + getPages: [ + GetPage(name: '/', page: () => MyHomePage()), + GetPage(name: '/second', page: () => Second()), + GetPage( + name: '/third', + page: () => Third(), + transition: Transition.zoom + ), + ], + ) + ); +} +``` + +Để xử lý điều hướng đến các routes không được xác định (lỗi 404), bạn có thể xác định trang 'không xác định' trong GetMaterialApp. + +```dart +void main() { + runApp( + GetMaterialApp( + unknownRoute: GetPage(name: '/notfound', page: () => UnknownRoutePage()), + initialRoute: '/', + getPages: [ + GetPage(name: '/', page: () => MyHomePage()), + GetPage(name: '/second', page: () => Second()), + ], + ) + ); +} +``` + +### Gửi data cho route có tên + +Chỉ cần gửi những gì bạn muốn cho các đối số (arguments). Get chấp nhận bất kỳ thứ gì ở đây, cho dù đó là String, Map, List hay thậm chí là một class trường hợp. + +```dart +Get.toNamed("/NextScreen", arguments: 'Get is the best'); +``` + +Trong class controller của bạn: + +```dart +print(Get.arguments); +//print out: Get is the best +``` + +### Dynamic urls links + +Get hỗ trợ các url động nâng cao giống như trên Web. Các nhà phát triển web có lẽ đã muốn tính năng này trên Flutter và rất có thể đã thấy một gói hứa hẹn tính năng này và cung cấp một cú pháp hoàn toàn khác so với một URL sẽ có trên web, và Get cũng giải quyết được điều này. + +```dart +Get.offAllNamed("/NextScreen?device=phone&id=354&name=Enzo"); +``` + +trong controller/bloc/stateful/stateless của class: + +```dart +print(Get.parameters['id']); +// out: 354 +print(Get.parameters['name']); +// out: Enzo +``` + +Bạn có thể đặt NamedParameters với Get dễ dàng: + +```dart +void main() { + runApp( + GetMaterialApp( + initialRoute: '/', + getPages: [ + GetPage( + name: '/', + page: () => MyHomePage(), + ), + GetPage( + name: '/profile/', + page: () => MyProfile(), + ), + //You can define a different page for routes with arguments, and another without arguments, but for that you must use the slash '/' on the route that will not receive arguments as above. + GetPage( + name: '/profile/:user', + page: () => UserProfile(), + ), + GetPage( + name: '/third', + page: () => Third(), + transition: Transition.cupertino + ), + ], + ) + ); +} +``` + +Gửi data bằng tên + +```dart +Get.toNamed("/profile/34954"); +``` + +Trên màn hình thứ hai, lấy dữ liệu theo tham số (parameters) + +```dart +print(Get.parameters['user']); +// out: 34954 +``` + +hoặc gửi nhiều tham số như thế này + +```dart +Get.toNamed("/profile/34954?flag=true&country=italy"); +``` +or +```dart +var parameters = {"flag": "true","country": "italy",}; +Get.toNamed("/profile/34954", parameters: parameters); +``` + +Trên màn hình thứ hai, lấy dữ liệu theo các tham số như thường lệ + +```dart +print(Get.parameters['user']); +print(Get.parameters['flag']); +print(Get.parameters['country']); +// out: 34954 true italy +``` + + + +Và bây giờ, tất cả những gì bạn cần làm là sử dụng Get.toNamed () để điều hướng các routes đã đặt tên của bạn mà không cần bất kỳ "context" nào (bạn có thể gọi các routes của mình trực tiếp từ BLoC hoặc lớp Bộ điều khiển) và khi ứng dụng của bạn được biên dịch lên web, các routes sẽ xuất hiện trong url <3 + +### Middleware + +Nếu bạn muốn nghe Get events để kích hoạt các hành động, bạn có thể sử dụng routingCallback cho nó + +```dart +GetMaterialApp( + routingCallback: (routing) { + if(routing.current == '/second'){ + openAds(); + } + } +) +``` + +Nếu bạn không sử dụng GetMaterialApp, bạn có thể sử dụng API thủ công để đính kèm trình quan sát Middleware. + +```dart +void main() { + runApp( + MaterialApp( + onGenerateRoute: Router.generateRoute, + initialRoute: "/", + navigatorKey: Get.key, + navigatorObservers: [ + GetObserver(MiddleWare.observer), // HERE !!! + ], + ), + ); +} +``` + +Tạo một MiddleWare class + +```dart +class MiddleWare { + static observer(Routing routing) { + /// You can listen in addition to the routes, the snackbars, dialogs and bottomsheets on each screen. + ///If you need to enter any of these 3 events directly here, + ///you must specify that the event is != Than you are trying to do. + if (routing.current == '/second' && !routing.isSnackbar) { + Get.snackbar("Hi", "You are on second route"); + } else if (routing.current =='/third'){ + print('last route called'); + } + } +} +``` + +Bây giờ, hãy sử dụng Get trên code của bạn: + +```dart +class First extends StatelessWidget { + @override + Widget build(BuildContext context) { + return Scaffold( + appBar: AppBar( + leading: IconButton( + icon: Icon(Icons.add), + onPressed: () { + Get.snackbar("hi", "i am a modern snackbar"); + }, + ), + title: Text('First Route'), + ), + body: Center( + child: ElevatedButton( + child: Text('Open route'), + onPressed: () { + Get.toNamed("/second"); + }, + ), + ), + ); + } +} + +class Second extends StatelessWidget { + @override + Widget build(BuildContext context) { + return Scaffold( + appBar: AppBar( + leading: IconButton( + icon: Icon(Icons.add), + onPressed: () { + Get.snackbar("hi", "i am a modern snackbar"); + }, + ), + title: Text('second Route'), + ), + body: Center( + child: ElevatedButton( + child: Text('Open route'), + onPressed: () { + Get.toNamed("/third"); + }, + ), + ), + ); + } +} + +class Third extends StatelessWidget { + @override + Widget build(BuildContext context) { + return Scaffold( + appBar: AppBar( + title: Text("Third Route"), + ), + body: Center( + child: ElevatedButton( + onPressed: () { + Get.back(); + }, + child: Text('Go back!'), + ), + ), + ); + } +} +``` + +## Điều hướng không cần context + +### SnackBars + +Để có một SnackBar đơn giản với Flutter, bạn phải lấy context của Scaffold, hoặc bạn phải sử dụng GlobalKey được gắn vào Scaffold của bạn + +```dart +final snackBar = SnackBar( + content: Text('Hi!'), + action: SnackBarAction( + label: 'I am a old and ugly snackbar :(', + onPressed: (){} + ), +); +// Find the Scaffold in the widget tree and use +// it to show a SnackBar. +Scaffold.of(context).showSnackBar(snackBar); +``` + +With Get: + +```dart +Get.snackbar('Hi', 'i am a modern snackbar'); +``` + +Với Get, tất cả những gì bạn phải làm là gọi thanh Get.snackbar từ bất kỳ đâu trong code của bạn hoặc tùy chỉnh nó theo cách bạn muốn! + +```dart +Get.snackbar( + "Hey i'm a Get SnackBar!", // title + "It's unbelievable! I'm using SnackBar without context, without boilerplate, without Scaffold, it is something truly amazing!", // message + icon: Icon(Icons.alarm), + shouldIconPulse: true, + onTap:(){}, + barBlur: 20, + isDismissible: true, + duration: Duration(seconds: 3), +); + + + ////////// ALL FEATURES ////////// + // Color colorText, + // Duration duration, + // SnackPosition snackPosition, + // Widget titleText, + // Widget messageText, + // bool instantInit, + // Widget icon, + // bool shouldIconPulse, + // double maxWidth, + // EdgeInsets margin, + // EdgeInsets padding, + // double borderRadius, + // Color borderColor, + // double borderWidth, + // Color backgroundColor, + // Color leftBarIndicatorColor, + // List boxShadows, + // Gradient backgroundGradient, + // TextButton mainButton, + // OnTap onTap, + // bool isDismissible, + // bool showProgressIndicator, + // AnimationController progressIndicatorController, + // Color progressIndicatorBackgroundColor, + // Animation progressIndicatorValueColor, + // SnackStyle snackStyle, + // Curve forwardAnimationCurve, + // Curve reverseAnimationCurve, + // Duration animationDuration, + // double barBlur, + // double overlayBlur, + // Color overlayColor, + // Form userInputForm + /////////////////////////////////// +``` + +Nếu bạn thích snackbar truyền thống hoặc muốn tùy chỉnh nó từ đầu, bao gồm chỉ thêm một dòng (Get.snackbar sử dụng tiêu đề và thông báo bắt buộc), bạn có thể sử dụng +`Get.rawSnackbar ()`; 'cung cấp API RAW trên đó Get. + +### Dialogs + +To open dialog: + +```dart +Get.dialog(YourDialogWidget()); +``` + +To open default dialog: + +```dart +Get.defaultDialog( + onConfirm: () => print("Ok"), + middleText: "Dialog made in 3 lines of code" +); +``` + +Bạn cũng có thể sử dụng Get.generalDialog thay vì showGeneralDialog. + +Đối với tất cả các tiện ích hộp thoại Flutter khác, bao gồm cả cupertinos, bạn có thể sử dụng Get.overlayContext thay vì context và mở nó ở bất kỳ đâu trong mã của bạn. +Đối với các widget không sử dụng Overlay, bạn có thể sử dụng Get.context. +Hai context này sẽ hoạt động trong 99% trường hợp để thay thế context của UI của bạn, ngoại trừ các trường hợp trong đó inheritWidget được sử dụng mà không có context điều hướng. + +### BottomSheets + +Get.bottomSheet giống như showModalBottomSheet, nhưng không cần context. + +```dart +Get.bottomSheet( + Container( + child: Wrap( + children: [ + ListTile( + leading: Icon(Icons.music_note), + title: Text('Music'), + onTap: () {} + ), + ListTile( + leading: Icon(Icons.videocam), + title: Text('Video'), + onTap: () {}, + ), + ], + ), + ) +); +``` + +## Điều hướng lồng (Nested Navigation) + +Làm cho điều hướng lồng (nested navigation) của Flutter thậm chí còn dễ dàng hơn. +Bạn không cần context và bạn sẽ tìm thấy stack điều hướng của mình theo Id. + +- CHÍ Ú: Việc tạo các stack điều hướng song song có thể gây nguy hiểm. Lý tưởng nhất là không sử dụng NestedNavigators, hoặc sử dụng một cách tối thiểu. Nếu dự án của bạn yêu cầu, hãy tiếp tục, nhưng hãy nhớ rằng việc giữ nhiều stack điều hướng trong bộ nhớ có thể không phải là một ý tưởng hay cho việc tiêu thụ RAM. + +Xem nó code đơn giản nè: + +```dart +Navigator( + key: Get.nestedKey(1), // create a key by index + initialRoute: '/', + onGenerateRoute: (settings) { + if (settings.name == '/') { + return GetPageRoute( + page: () => Scaffold( + appBar: AppBar( + title: Text("Main"), + ), + body: Center( + child: TextButton( + color: Colors.blue, + onPressed: () { + Get.toNamed('/second', id:1); // navigate by your nested route by index + }, + child: Text("Go to second"), + ), + ), + ), + ); + } else if (settings.name == '/second') { + return GetPageRoute( + page: () => Center( + child: Scaffold( + appBar: AppBar( + title: Text("Main"), + ), + body: Center( + child: Text("second") + ), + ), + ), + ); + } + } +), +``` diff --git a/siro_rider/packages/get/documentation/vi_VI/state_management.md b/siro_rider/packages/get/documentation/vi_VI/state_management.md new file mode 100644 index 0000000..c432190 --- /dev/null +++ b/siro_rider/packages/get/documentation/vi_VI/state_management.md @@ -0,0 +1,784 @@ +* [Quản lý State](#state-management) + + [Quản lý Reactive State](#reactive-state-manager) + - [Lợi thế](#advantages) + - [Hiệu suất tối đa:](#maximum-performance) + - [Khai báo một biến phản ứng (reactive variable)](#declaring-a-reactive-variable) + - [Thât dễ khi có reactive state.](#having-a-reactive-state-is-easy) + - [Sử dụng values trong View](#using-the-values-in-the-view) + - [Điều kiện để tái tạo lại](#conditions-to-rebuild) + - [Nơi .obs có thể dùng](#where-obs-can-be-used) + - [Chí ú về Lists](#note-about-lists) + - [Tại sao tôi phải dùng .value](#why-i-have-to-use-value) + - [Obx()](#obx) + - [Workers](#workers) + + [Quản lý State đơn giản](#simple-state-manager) + - [Lợi thế](#advantages-1) + - [Sử dụng](#usage) + - [Cách GetX sử dụng controllers](#how-it-handles-controllers) + - [Không cần StatefulWidget nữa!](#you-wont-need-statefulwidgets-anymore) + - [Tại sao GetX tồn tại?](#why-it-exists) + - [Cách sử dụng khác](#other-ways-of-using-it) + - [IDs độc nhất](#unique-ids) + + [Trộn hai trình quản lý state](#mixing-the-two-state-managers) + + [GetBuilder vs GetX vs Obx vs MixinBuilder](#getbuilder-vs-getx-vs-obx-vs-mixinbuilder) + +# Quản lý State + +GetX không sử dụng Streams hoặc ChangeNotifier như các quản lý state khác. Tại sao? Ngoài việc xây dựng các ứng dụng cho android, iOS, web, linux, macos và linux, với GetX bạn có thể xây dựng các ứng dụng máy chủ với cú pháp tương tự như Flutter / GetX. Để cải thiện thời gian phản hồi và giảm mức tiêu thụ RAM, chúng tôi đã tạo GetValue và GetStream, là các giải pháp có độ trễ thấp mang lại nhiều hiệu suất với chi phí vận hành thấp. Chúng tôi sử dụng cơ sở này để xây dựng tất cả các nguồn lực của mình, bao gồm cả quản lý state. + +* _Phức hợp_: Một số quản lý state rất phức tạp và có rất nhiều cơ sở hạ tầng. Với GetX, bạn không phải xác định một class cho mỗi event, code rất rõ ràng và rõ ràng, và bạn làm được nhiều việc hơn bằng cách viết ít hơn. Nhiều người đã từ bỏ Flutter vì chủ đề này, và cuối cùng họ đã có một giải pháp đơn giản đến mức đần độn để quản lý các state. +* _Không trình tạo mã_: Bạn dành một nửa thời gian phát triển để viết logic ứng dụng của mình. Một số quản lý state dựa vào trình tạo mã để có mã có thể đọc được ở mức tối thiểu. Việc thay đổi một biến và phải chạy build_runner có thể gây mất hiệu quả, chuyện này rất ngốn thời gian chờ đợi sau khi quét sạch sẽ rất lâu và bạn phải uống rất nhiều cà phê. + +Với GetX, mọi thứ đều hoạt động và độc lập với trình tạo mã, giúp tăng năng suất của bạn trong mọi khía cạnh phát triển của bạn. + +* _Không phụ thuộc vào context_: Có thể bạn đã cần gửi context của chế độ xem của mình tới controller, làm cho khả năng kết hợp của View với business logic của bạn cao hơn. Bạn có thể phải sử dụng một dependency cho một nơi không có context và phải chuyển context qua các class và hàm khác nhau. Điều này không tồn tại với GetX. Bạn có quyền truy cập vào controller của mình từ bên trong controller mà không cần bất kỳ context nào. Bạn không cần phải gửi context theo tham số vì không có gì theo nghĩa đen. +* _Kiểm soát hạt_: Hầu hết các quản lý state đều dựa trên ChangeNotifier. ChangeNotifier sẽ thông báo cho tất cả các widget phụ thuộc vào nó khi thông báo cho các widget được gọi. Nếu bạn có 40 widget con trên một màn hình, trong đó có một biến thuộc class ChangeNotifier của bạn, khi bạn cập nhật một widget con, tất cả chúng sẽ được xây dựng lại. + +Với GetX, ngay cả các widget lồng nhau cũng được tôn trọng. Nếu bạn có Obx đang xem ListView của bạn và người khác đang xem hộp kiểm bên trong ListView, thì khi thay đổi giá trị CheckBox, chỉ nó mới được cập nhật, khi thay đổi giá trị List, chỉ ListView sẽ được cập nhật. + +* _Chỉ tái tạo lại nếu biến CẦN thay đổi_: GetX có tính năng kiểm soát streams, điều đó có nghĩa là nếu bạn hiển thị Text là 'Kaiser', nếu bạn thay đổi lại biến có thể quan sát thành 'Kaiser', widget sẽ không được tạo lại. Đó là bởi vì GetX biết rằng 'Kaiser' đã được hiển thị trong Văn bản và sẽ không thực hiện các thao tác tái tạo không cần thiết. + +Hầu hết (nếu không phải tất cả) các trình quản lý state hiện tại sẽ xây dựng lại trên màn hình. + +## Quản lý Reactive State + +Lập trình phản ứng (Reactive programming) có thể khiến nhiều người xa lánh vì nó được cho là phức tạp. GetX biến lập trình phản ứng thành một thứ khá đơn giản: + +* Bạn sẽ không cần tạo StreamControllers. +* Bạn sẽ không cần tạo StreamBuilder cho mỗi biến +* Bạn sẽ không cần phải tạo một class cho mỗi state. +* Bạn sẽ không cần tạo get cho một giá trị ban đầu. + +Lập trình phản ứng với Get dễ dàng như sử dụng setState. + +Hãy tưởng tượng rằng bạn có một biến tên và muốn rằng mỗi khi bạn thay đổi nó, tất cả các widget sử dụng nó sẽ được tự động thay đổi. + +Đây là count variable của bạn: + +``` dart +var name = 'Khang Huỳnh'; +``` + +Để làm cho nó có thể quan sát được, bạn chỉ cần thêm ".obs" vào cuối nó: + +``` dart +var name = 'Khang Huỳnh'.obs; +``` + +Chỉ vậy thôi, chỉ *vậy thôi* người ơi~ + +Từ bây giờ, chúng ta có thể tham chiếu đến các biến reactive - ". Obs" (có thể thay thế) này là _Rx_. + +Chúng tôi đã làm gì phía dưới class code? Chúng tôi đã tạo một `Stream` của `String`, được gán giá trị ban đầu `"Khang Huỳnh"`, chúng tôi đã thông báo cho tất cả các widget con sử dụng `"Khang Huỳnh"` rằng chúng hiện "thuộc về" biến này và khi giá trị _Rx_ thay đổi, chúng phải thay đổi theo. +Đây là **phép màu của GetX**, nhờ vào khả năng của Dart. + +Tuy nhiên, như chúng ta đã biết, một `Widget` chỉ có thể được thay đổi nếu nó nằm bên trong một hàm, bởi vì các class tĩnh không có quyền" tự động thay đổi ". + +Bạn sẽ cần tạo một `StreamBuilder`, đăng ký biến này để lắng nghe các thay đổi và tạo một "stream" các` StreamBuilder` lồng nhau nếu bạn muốn thay đổi một số biến trong cùng một phạm vi, phải không? + +Không, bạn không cần `StreamBuilder`, nhưng bạn đã đúng về các class tĩnh. + +Theo quan điểm, chúng ta thường có rất nhiều bảng soạn sẵn khi chúng ta muốn thay đổi một Widget cụ thể, đó là cách Flutter. +Với ** GetX **, bạn cũng có thể quên mã soạn sẵn này. + +`StreamBuilder (…)`? `initialValue:…`? `builder:…`? Không, bạn chỉ cần đặt biến này bên trong Widget `Obx ()`. + +``` dart +Obx (() => Text (controller.name)); +``` + +_Bạn cần nhớ gì?_ Chỉ `Obx(() =>` . + +Bạn chỉ đang chuyển Widget đó thông qua một hàm mũi tên vào một `Obx ()` ("Observer" của _Rx_). + +`Obx` khá thông minh và sẽ chỉ thay đổi nếu giá trị của `controller.name` thay đổi. + +Nếu `name` là` "Kaiser" `và bạn thay đổi nó thành` "Kaiser" `(` name.value = "Kaiser" `), vì nó giống như` giá trị` như trước, sẽ không có gì thay đổi trên màn hình, và `Obx`, để tiết kiệm tài nguyên, sẽ đơn giản bỏ qua giá trị mới và không xây dựng lại Widget. **Tuyệt vời ông mặt trời chứ?** + +> So, what if I have 5 _Rx_ (observable) variables within an `Obx` ? + +Nó sẽ chỉ cập nhật khi ** bất kỳ ** nào trong số chúng thay đổi. + +> And if I have 30 variables in a class, when I update one, will it update **all** the variables that are in that class? + +Không, chỉ **Widget cụ thể** sử dụng biến _Rx_ đó. + +Vì vậy, **GetX** chỉ cập nhật màn hình, khi biến _Rx_ thay đổi giá trị của nó. + +``` + +final isOpen = false.obs; + +// NOTHING will happen... same value. +void onButtonTap() => isOpen.value=false; +``` + +### Lợi thế + +**GetX()** giúp bạn khi bạn cần kiểm soát **chi tiết** đối với những gì đang được cập nhật. + +Nếu bạn không cần `ID duy nhất`, vì tất cả các biến của bạn sẽ được sửa đổi khi bạn thực hiện một hành động, thì hãy sử dụng` GetBuilder`, +bởi vì nó là một Trình cập nhật state đơn giản (trong các khối, như `setState ()` '), được tạo chỉ trong một vài dòng mã. +Nó được làm đơn giản, ít ảnh hưởng đến CPU nhất và chỉ để thực hiện một mục đích duy nhất (xây dựng lại _State_) và sử dụng tài nguyên tối thiểu có thể. + +Nếu bạn cần một Trình quản lý state **mạnh mẽ**, bạn không thể làm sai với **GetX**. + +Nó không hoạt động với các biến, nhưng __flows__, mọi thứ trong đó đều là `Streams`. + +Bạn có thể sử dụng _rxDart_ kết hợp với nó, vì mọi thứ đều là `Luồng`, +bạn có thể nghe `event` của từng" biến _Rx_ ", +bởi vì mọi thứ trong đó đều là `Streams`. + +Nó thực sự là một cách tiếp cận _BLoC_, dễ dàng hơn _MobX_ và không có trình tạo code hoặc decorations. +Bạn có thể biến **mọi thứ** thành một _"Observable" _ chỉ với một `.obs`. + +### Hiệu suất tối đa: + +Ngoài việc có một thuật toán thông minh để xây dựng lại tối thiểu, **GetX** sử dụng trình so sánh để đảm bảo rằng Bang đã thay đổi. + +Nếu bạn gặp bất kỳ lỗi nào trong ứng dụng của mình và gửi một bản thay đổi state, **GetX** sẽ đảm bảo rằng nó sẽ không gặp sự cố. + +Với **GetX** State chỉ thay đổi nếu `giá trị` thay đổi. +Đó là sự khác biệt chính giữa **GetX** và việc sử dụng _ `computed` từ MobX_. +Khi kết hợp hai __observables__, và một thay đổi; trình nghe của _observable_ đó cũng sẽ thay đổi. + +Với **GetX**, nếu bạn nối hai biến, `GetX ()` (tương tự như `Observer ()`) sẽ chỉ xây dựng lại nếu nó ngụ ý thay đổi state thực sự. + +### Khai báo một biến phản ứng (reactive variable) + +Bạn có 3 cách để thay đổi variable thành "observable". + +1 - Sử dụng **`Rx{Type}`**. + +``` dart +// initial value is recommended, but not mandatory +final name = RxString(''); +final isLogged = RxBool(false); +final count = RxInt(0); +final balance = RxDouble(0.0); +final items = RxList([]); +final myMap = RxMap({}); +``` + +2 - Sử dụng **`Rx`** và dùng Darts Generics, `Rx` + +``` dart +final name = Rx(''); +final isLogged = Rx(false); +final count = Rx(0); +final balance = Rx(0.0); +final number = Rx(0); +final items = Rx>([]); +final myMap = Rx>({}); + +// Custom classes - it can be any class, literally +final user = Rx(); +``` + +3 - Cách tối ưu nhất, thêm **`.obs`** ở `value` : + +``` dart +final name = ''.obs; +final isLogged = false.obs; +final count = 0.obs; +final balance = 0.0.obs; +final number = 0.obs; +final items = [].obs; +final myMap = {}.obs; + +// Custom classes - it can be any class, literally +final user = User().obs; +``` + +##### Thât dễ khi có reactive state. + +Như chúng ta biết, _Dart_ đang hướng tới _null safety_. +Để chuẩn bị, từ bây giờ, bạn phải luôn bắt đầu các biến _Rx_ của mình bằng một **initial value**. + +> Transforming a variable into an _observable_ + _initial value_ with **GetX** is the simplest, and most practical approach. + +Theo đúng nghĩa đen, bạn sẽ thêm một "` .obs` "vào cuối biến của mình và **vậy thôi người ơi~**, bạn đã làm cho nó có thể quan sát được, và `.value` của nó sẽ là _initial value_). + +### Sử dụng values trong View + +``` dart +// controller file +final count1 = 0.obs; +final count2 = 0.obs; +int get sum => count1.value + count2.value; +``` + +``` dart +// view file +GetX( + builder: (controller) { + print("count 1 rebuild"); + return Text('${controller.count1.value}'); + }, +), +GetX( + builder: (controller) { + print("count 2 rebuild"); + return Text('${controller.count2.value}'); + }, +), +GetX( + builder: (controller) { + print("count 3 rebuild"); + return Text('${controller.sum}'); + }, +), +``` + +Nếu chúng ta cộng `count1.value++` , nó sẽ in: + +* `count 1 rebuild` + +* `count 3 rebuild` + +bởi vì `count1` có giá trị là` 1` và `1 + 0 = 1`, thay đổi giá trị getter` sum`. + +Nếu ta thay đổi `count2.value++` , nó sẽ in: + +* `count 2 rebuild` + +* `count 3 rebuild` + +bởi vì `count2.value` đã thay đổi, và kết quả của` sum` bây giờ là `2`. + +* LƯU Ý: Theo mặc định, event đầu tiên sẽ xây dựng lại widget con, ngay cả khi nó là cùng một `giá trị`. + +Hành vi này tồn tại do các biến Boolean. + +Ví dụ, bạn code thế này: + +``` dart +var isLogged = false.obs; +``` + +Và sau đó, bạn đã kiểm tra xem người dùng có "đăng nhập" để kích hoạt event trong `ever` không. + +``` dart +@override +onInit(){ + ever(isLogged, fireRoute); + isLogged.value = await Preferences.hasToken(); +} + +fireRoute(logged) { + if (logged) { + Get.off(Home()); + } else { + Get.off(Login()); + } +} +``` + +nếu `hasToken` là` false`, sẽ không có thay đổi thành `isLogged`, vì vậy `ever ()` sẽ không bao giờ được gọi. +Để tránh loại hành vi này, thay đổi đầu tiên đối với _observable_ sẽ luôn kích hoạt một event, +ngay cả khi nó chứa cùng một `.value`. + +Bạn có thể xóa hành vi này nếu muốn, bằng cách sử dụng: + `isLogged.firstRebuild = false;` + +### Điều kiện để tái tạo lại + +Ngoài ra, Get cung cấp khả năng kiểm soát state đã được tinh chỉnh. Bạn có thể điều kiện một event (chẳng hạn như thêm một đối tượng vào danh sách), với một điều kiện nhất định. + +``` dart +// First parameter: condition, must return true or false. +// Second parameter: the new value to apply if the condition is true. +list.addIf(item < limit, item); +``` + +Không có decoration, không có trình tạo mã, không có phức tạp hóa vấn đề: smile: + +Bạn có biết ứng dụng counter của Flutter không? Class controller của bạn có thể trông giống như sau: + +``` dart +class CountController extends GetxController { + final count = 0.obs; +} +``` + +Đơn giản hơn: + +``` dart +controller.count.value++ +``` + +Bạn có thể cập nhật counter trong UI của mình, bất kể nó được lưu trữ ở đâu. + +### Nơi .obs có thể dùng + +Bạn có thể biến đổi bất cứ thứ gì trên obs. Đây là hai cách để làm điều đó: + +* Bạn có thể chuyển đổi các giá trị class của mình thành obs + +``` dart +class RxUser { + final name = "Camila".obs; + final age = 18.obs; +} +``` + +* hoặc bạn có thể biến cả 1 class thành observable + +``` dart +class User { + User({String name, int age}); + var name; + var age; +} + +// when instantianting: +final user = User(name: "Camila", age: 18).obs; +``` + +### Chí ú về Lists + +List hoàn toàn có thể quan sát được cũng như các đối tượng bên trong nó. Bằng cách đó, nếu bạn thêm một giá trị vào danh sách, nó sẽ tự động xây dựng lại các widget con sử dụng nó. + +Bạn cũng không cần phải sử dụng ".value" với các danh sách, api phi tiêu tuyệt vời đã cho phép chúng tôi loại bỏ điều đó. +Tiếc thay, các kiểu nguyên thủy như String và int không thể được mở rộng, khiến việc sử dụng .value là bắt buộc, nhưng điều đó sẽ không thành vấn đề nếu bạn làm việc với getters và setters cho những thứ này. + +``` dart +// On the controller +final String title = 'User Info:'.obs +final list = List().obs; + +// on the view +Text(controller.title.value), // String need to have .value in front of it +ListView.builder ( + itemCount: controller.list.length // lists don't need it +) +``` + +Khi bạn đang làm cho các class của riêng mình có thể quan sát được, có một cách khác để cập nhật chúng: + +``` dart +// on the model file +// we are going to make the entire class observable instead of each attribute +class User() { + User({this.name = '', this.age = 0}); + String name; + int age; +} + +// on the controller file +final user = User().obs; +// when you need to update the user variable: +user.update( (user) { // this parameter is the class itself that you want to update +user.name = 'Jonny'; +user.age = 18; +}); +// an alternative way of update the user variable: +user(User(name: 'João', age: 35)); + +// on view: +Obx(()=> Text("Name ${user.value.name}: Age: ${user.value.age}")) +// you can also access the model values without the .value: +user().name; // notice that is the user variable, not the class (variable has lowercase u) +``` + +Bạn không cần phải làm việc với các bộ nếu bạn không muốn. bạn có thể sử dụng api "assign" và "assignAll". +Api "assign" sẽ xóa danh sách của bạn và thêm một đối tượng duy nhất mà bạn muốn bắt đầu ở đó. +Api "allowAll" sẽ xóa danh sách hiện có và thêm bất kỳ đối tượng có thể lặp lại nào mà bạn đưa vào đó. + +### Tại sao tôi phải dùng .value + +Chúng ta có thể loại bỏ việc sử dụng 'value' đối với `String` và` int` bằng một trình tạo mã và decoration đơn giản, nhưng mục đích của thư viện này chính là tránh các dependency bên ngoài. Chúng tôi muốn cung cấp một môi trường sẵn sàng cho việc lập trình, liên quan đến các yếu tố cần thiết (quản lý các route, dependency và state), theo cách đơn giản, nhẹ và hiệu quả mà không cần gói bên ngoài. + +Theo nghĩa đen, bạn có thể thêm 3 chữ cái vào pubspec (get) của mình và dấu hai chấm và bắt đầu lập trình. Tất cả các giải pháp được bao gồm theo mặc định, từ quản lý route đến quản lý state, nhằm mục đích dễ dàng, năng suất và hiệu suất. + +Tổng trọng lượng của thư viện này ít hơn của một trình quản lý state duy nhất, mặc dù nó là một giải pháp hoàn chỉnh và đó là những gì bạn phải hiểu. + +Nếu bạn bị làm phiền bởi `.value`, và giống như một trình tạo mã, MobX là một giải pháp thay thế tuyệt vời và bạn có thể sử dụng nó cùng với Get. Đối với những người muốn thêm một gói dependency duy nhất vào pubspec và bắt đầu lập trình mà không cần lo lắng về phiên bản của gói không tương thích với gói khác hoặc nếu lỗi cập nhật state đến từ trình quản lý state hoặc dependency, hoặc vẫn không muốn lo lắng về sự sẵn có của controller, cho dù theo nghĩa đen là "chỉ là lập trình", GetX là lựa chọn hoàn hảo. + +Nếu bạn không gặp vấn đề gì với trình tạo mã MobX hoặc không gặp vấn đề gì với bảng soạn sẵn BLoC, bạn có thể chỉ cần sử dụng Get cho các route và quên rằng nó có trình quản lý state. Get SEM và RSM ra đời không cần thiết, công ty của tôi có một dự án với hơn 90 controller và trình tạo mã chỉ mất hơn 30 phút để hoàn thành nhiệm vụ của nó sau khi Flutter Clean trên một máy khá tốt, nếu dự án của bạn có 5, 10, 15 controller, bất kỳ nhà quản lý state sẽ cung cấp cho bạn tốt. Nếu bạn có một dự án lớn đến mức ngớ ngẩn và trình tạo mã là một vấn đề đối với bạn, thì bạn đã được trao giải pháp này. + +Rõ ràng, nếu ai đó muốn đóng góp vào dự án và tạo trình tạo mã, hoặc thứ gì đó tương tự, tôi sẽ liên kết trong readme này như một giải pháp thay thế, nhu cầu của tôi không phải là nhu cầu của tất cả các nhà phát triển, nhưng ý tôi là thế, đã có những giải pháp tốt đã làm được điều đó, như MobX. + +### Obx() + +Nhập vào Get bằng cách sử dụng Bindings là không cần thiết. bạn có thể sử dụng widget Obx thay vì GetX, widget chỉ nhận được chức năng ẩn danh tạo widget. +Rõ ràng, nếu bạn không sử dụng một kiểu, bạn sẽ cần phải có một phiên bản của controller để sử dụng các biến hoặc sử dụng `Get.find ()` .value hoặc Controller.to.value để truy xuất giá trị . + +### Workers + +Workers sẽ hỗ trợ bạn, kích hoạt các lệnh gọi lại cụ thể khi một event xảy ra. + +``` dart +/// Called every time `count1` changes. +ever(count1, (_) => print("$_ has been changed")); + +/// Called only first time the variable $_ is changed +once(count1, (_) => print("$_ was changed once")); + +/// Anti DDos - Called every time the user stops typing for 1 second, for example. +debounce(count1, (_) => print("debouce$_"), time: Duration(seconds: 1)); + +/// Ignore all changes within 1 second. +interval(count1, (_) => print("interval $_"), time: Duration(seconds: 1)); +``` + +Tất cả các workers (except `debounce` ) có `condition` tham số được đặt tên, mà có thể là loại `bool` hoặc lệnh gọi lại trả về một `bool` . +`condition` này mô tả khi `callback` kích hoạt. + +Tất cả các workers đều trả về trường hợp `Worker`, mà bạn có thể đóng ( thông qua `dispose()` ) của worker. + + +* **`ever`** + + được gọi mỗi khi biến _Rx_ tạo ra một giá trị mới. + +* **`everAll`** + +Giống như `ever`, nhưng nó có một` List` gồm các giá trị _Rx_ Được gọi mỗi khi biến của nó bị thay đổi. Chỉ vậy thôi người ơi~ 😊 + +* **`once`** + +'once' chỉ được gọi lần đầu tiên biến được thay đổi. + +* **`debounce`** + +'debounce' rất hữu ích trong các hàm tìm kiếm, nơi bạn chỉ muốn API được gọi khi người dùng nhập xong. Nếu người dùng nhập "Kaiser", bạn sẽ có 6 tìm kiếm trong các API, theo ký tự K, a, i, s, e và r. Với Get, điều này không xảy ra, bởi vì bạn sẽ có một Worker "debounce" sẽ chỉ được kích hoạt khi kết thúc nhập. + +* **`interval`** + +'interval' khác với debounce. Debounce xảy ra nếu người dùng thực hiện 1000 thay đổi đối với một biến trong vòng 1 giây, y sẽ chỉ gửi biến cuối cùng sau bộ hẹn giờ quy định (mặc định là 800 mili giây). Thay vào đó, interval sẽ bỏ qua tất cả các hành động của người dùng trong interval quy định. Nếu bạn gửi event trong 1 phút, 1000 mỗi giây, tính năng gỡ lỗi sẽ chỉ gửi cho bạn event cuối cùng, khi người dùng ngừng phân chia event. interval sẽ phân phối các event mỗi giây và nếu được đặt thành 3 giây, nó sẽ phân phối 20 event trong phút đó. Điều này được khuyến nghị để tránh lạm dụng, trong các chức năng mà người dùng có thể nhanh chóng nhấp vào một thứ gì đó và có được một số lợi thế (hãy tưởng tượng rằng người dùng có thể kiếm được xu bằng cách nhấp vào thứ gì đó, nếu y nhấp 300 lần trong cùng một phút, y sẽ có 300 xu, bằng cách sử dụng interval, bạn có thể đặt khung thời gian trong 3 giây, và thậm chí sau đó nhấp vào 300 hoặc một nghìn lần, tối đa y sẽ nhận được trong 1 phút sẽ là 20 xu, nhấp 300 hoặc 1 triệu lần). Việc gỡ lỗi này phù hợp cho việc chống DDos, cho các chức năng như tìm kiếm trong đó mỗi thay đổi đối với onChange sẽ gây ra một truy vấn tới api của bạn. Debounce sẽ đợi người dùng ngừng nhập tên để thực hiện yêu cầu. Nếu nó được sử dụng trong kịch bản đồng xu được đề cập ở trên, người dùng sẽ chỉ giành được 1 đồng xu, bởi vì nó chỉ được thực thi, khi người dùng "tạm dừng" trong thời gian đã thiết lập. + +* CHÍ Ú: Workers phải luôn được sử dụng khi khởi động Controller hoặc Class, vì vậy nó phải luôn ở trên onInit (được khuyến nghị), phương thức khởi tạo Class hoặc initState của StatefulWidget (phương pháp này không được khuyến khích trong hầu hết các trường hợp, nhưng nó không nên có hiệu ứng phụ nào khác). + +## Quản lý State đơn giản + +Get có một trình quản lý state cực kỳ nhẹ và dễ dàng, không sử dụng ChangeNotifier, sẽ đáp ứng nhu cầu đặc biệt cho những người mới sử dụng Flutter và sẽ không gây ra sự cố cho các ứng dụng lớn. + +GetBuilder nhắm chính xác vào việc kiểm soát nhiều state. Hãy tưởng tượng rằng bạn đã thêm 30 sản phẩm vào giỏ hàng, bạn nhấp vào xóa một sản phẩm, đồng thời danh sách được cập nhật, giá được cập nhật và huy hiệu trong giỏ hàng được cập nhật thành số lượng nhỏ hơn. Kiểu tiếp cận này khiến GetBuilder trở thành kẻ giết người, bởi vì nó nhóm các state và thay đổi tất cả chúng cùng một lúc mà không có bất kỳ "logic tính toán" nào cho điều đó. GetBuilder được tạo ra với loại tình huống này, vì để thay đổi state tạm thời, bạn có thể sử dụng setState và bạn sẽ không cần trình quản lý state cho việc này. + +Bằng cách đó, nếu bạn muốn một controller riêng lẻ, bạn có thể gán ID cho controller đó hoặc sử dụng GetX. Điều này là tùy thuộc vào bạn, hãy nhớ rằng bạn càng có nhiều widget "riêng lẻ" thì hiệu suất của GetX càng nổi bật, trong khi hiệu suất của GetBuilder phải vượt trội hơn khi có nhiều thay đổi state. + +### Lợi thế + +1. Chỉ cập nhật các widget được yêu cầu. + +2. Không sử dụng changeNotifier, đó là trình quản lý state sử dụng ít bộ nhớ hơn (gần như bằng 0mb). + +3. Quên StatefulWidget! Với Get, bạn sẽ không bao giờ cần đến nó. Với các trình quản lý state khác, bạn có thể sẽ phải sử dụng StatefulWidget để lấy phiên bản của Provider, BLoC, MobX, v.v. Nhưng bạn đã bao giờ nghĩ rằng AppBar, Scaffole và hầu hết các widget trong class của bạn là stateless? Vậy tại sao phải lưu state của toàn bộ class, nếu bạn chỉ có thể lưu state của Widget là stateful? Get giải quyết được điều đó bằng cách tạo một class Stateless, làm cho mọi thứ trở nên vô trạng. Nếu bạn cần cập nhật một thành phần riêng lẻ, hãy bọc nó bằng GetBuilder và state của nó sẽ được duy trì. + +4. Tái cơ cấu cho dự án của bạn xanh, sạch và đẹp! Controller không được nằm trong UI của bạn, hãy đặt TextEditController của bạn hoặc bất kỳ controller nào bạn sử dụng trong class Controller của mình. + +5. Bạn có cần kích hoạt event để cập nhật widget con ngay khi nó được hiển thị không? GetBuilder có thuộc tính "initState", giống như StatefulWidget và bạn có thể gọi các event từ controller của mình, trực tiếp từ nó, không có thêm event nào được đặt trong initState của bạn. + +6. Bạn có cần phải kích hoạt một hành động như đóng streams, hẹn giờ, v.v. không? GetBuilder cũng có dispose property, nơi bạn có thể gọi các event ngay khi widget đó bị phá hủy. + +7. Chỉ sử dụng các streams nếu cần thiết. Bạn có thể sử dụng StreamControllers bên trong controller của mình một cách bình thường và sử dụng StreamBuilder cũng bình thường, nhưng hãy nhớ rằng, một streams tiêu thụ bộ nhớ một kha khá, lập trình phản ứng rất đẹp, nhưng bạn không nên lạm dụng nó. 30 streams mở cùng lúc có thể tệ hơn changeNotifier (và changeNotifier đã rất là tệ). + +8. Cập nhật các widgets mà không tốn ram. Chỉ lưu trữ ID người tạo GetBuilder và cập nhật GetBuilder đó khi cần thiết. Mức tiêu thụ bộ nhớ của get ID trong bộ nhớ là rất thấp ngay cả đối với hàng nghìn GetBuilders. Khi bạn tạo GetBuilder mới, bạn thực sự đang chia sẻ state GetBuilder có ID người tạo. Một state mới không được tạo cho mỗi GetBuilder, giúp tiết kiệm RẤT NHIỀU ram cho các ứng dụng lớn. Về cơ bản, ứng dụng của bạn sẽ hoàn toàn là Không state và một số ít Tiện ích sẽ có state (trong GetBuilder) sẽ có một state duy nhất, và do đó cập nhật một sẽ cập nhật tất cả. Nhà nước chỉ là một. + +9. Get là toàn trí và trong hầu hết các trường hợp, nó biết chính xác thời gian để lấy controller ra khỏi bộ nhớ. Bạn không nên lo lắng về việc khi nào nên vứt bỏ controller, Get biết thời điểm tốt nhất để thực hiện việc này. + +### Sử dụng + +``` dart +// Create controller class and extends GetxController +class Controller extends GetxController { + int counter = 0; + void increment() { + counter++; + update(); // use update() to update counter variable on UI when increment be called + } +} +// On your Stateless/Stateful class, use GetBuilder to update Text when increment be called +GetBuilder( + init: Controller(), // INIT IT ONLY THE FIRST TIME + builder: (_) => Text( + '${_.counter}', + ), +) +//Initialize your controller only the first time. The second time you are using ReBuilder for the same controller, do not use it again. Your controller will be automatically removed from memory as soon as the widget that marked it as 'init' is deployed. You don't have to worry about that, Get will do it automatically, just make sure you don't start the same controller twice. +``` + +**OK, giải thích xong rồi!** + +* Bạn đã học cách quản lý state với Get. + +* Lưu ý: Bạn có thể muốn một tổ chức lớn hơn và không sử dụng thuộc tính init. Vì vậy, bạn có thể tạo một class và mở rộng class Bindings và trong đó đề cập đến các controller sẽ được tạo trong route đó. Khi đó các Controllers sẽ không được tạo, ngược lại, đây chỉ là một câu lệnh, để lần đầu sử dụng Controller, Get sẽ biết cần tìm ở đâu. Get sẽ vẫn là lazyLoad và sẽ tiếp tục loại bỏ Controller khi chúng không còn cần thiết nữa. Hãy xem ví dụ pub.dev để xem nó hoạt động như thế nào. + +Nếu bạn điều hướng nhiều route và cần dữ liệu trong controller đã sử dụng trước đó, bạn chỉ cần sử dụng GetBuilder Again (không có init): + +``` dart +class OtherClass extends StatelessWidget { + @override + Widget build(BuildContext context) { + return Scaffold( + body: Center( + child: GetBuilder( + builder: (s) => Text('${s.counter}'), + ), + ), + ); + } + +``` + +Nếu bạn cần sử dụng controller của mình ở nhiều nơi khác và bên ngoài GetBuilder, chỉ cần tạo quyền truy cập vào controller của bạn và có nó một cách dễ dàng. (hoặc sử dụng `Get.find ()`) + +``` dart +class Controller extends GetxController { + + /// You do not need that. I recommend using it just for ease of syntax. + /// with static method: Controller.to.increment(); + /// with no static method: Get.find().increment(); + /// There is no difference in performance, nor any side effect of using either syntax. Only one does not need the type, and the other the IDE will autocomplete it. + static Controller get to => Get.find(); // add this line + + int counter = 0; + void increment() { + counter++; + update(); + } +} +``` + +Sau đó, truy cập thẳng vào controller của bạn: + +``` dart +FloatingActionButton( + onPressed: () { + Controller.to.increment(), + } // This is incredibly simple! + child: Text("${Controller.to.counter}"), +), +``` + +Khi bạn nhấn FloatingActionButton, tất cả các widget đang lắng nghe biến 'counter' sẽ được cập nhật tự động. + +### Cách GetX sử dụng controllers + +Ví dụ: + + `Class a => Class B (has controller X) => Class C (has controller X)` + +Trong class A, controller chưa có trong bộ nhớ, vì bạn chưa sử dụng nó (Get là lazyLoad). Trong class B, bạn đã sử dụng controller và nó đã vào bộ nhớ. Trong class C, bạn đã sử dụng cùng một controller như trong class B, Get sẽ chia sẻ state của controller B với controller C, và controller tương tự vẫn còn trong bộ nhớ. Nếu bạn đóng màn hình C và màn hình B, Get sẽ tự động lấy controller X ra khỏi bộ nhớ và giải phóng tài nguyên, vì Class A không sử dụng controller. Nếu bạn điều hướng đến B một lần nữa, controller X sẽ nhập lại bộ nhớ, nếu thay vì đi đến class C, bạn quay lại class A một lần nữa, Get sẽ đưa controller ra khỏi bộ nhớ theo cách tương tự. Nếu class C không sử dụng controller và bạn đã lấy class B ra khỏi bộ nhớ, thì sẽ không có class nào sử dụng controller X và tương tự như vậy, nó sẽ bị loại bỏ. Ngoại lệ duy nhất có thể gây rắc rối với Get là nếu bạn xóa B khỏi route một cách bất ngờ và cố gắng sử dụng controller trong C. Trong trường hợp này, ID người tạo của controller ở B đã bị xóa và Get được lập trình để xóa nó khỏi bộ nhớ mọi controller không có ID người tạo. Nếu bạn dự định làm điều này, hãy thêm flag "autoRemove: false" vào GetBuilder của class B và sử dụng adoptID = true trong GetBuilder của class C. + +### Không cần StatefulWidget nữa! + +Sử dụng StatefulWidgets có nghĩa là lưu trữ state của toàn bộ màn hình một cách không cần thiết, ngay cả khi bạn cần xây dựng lại một cách tối thiểu widget, bạn sẽ nhúng nó vào Consumer / Observer / BlocProvider / GetBuilder / GetX / Obx, đây sẽ là một StatefulWidget khác. +Class StatefulWidget là một class lớn hơn StatelessWidget, class này sẽ phân bổ nhiều RAM hơn và điều này có thể không tạo ra sự khác biệt đáng kể giữa một hoặc hai class, nhưng chắc chắn nó sẽ làm được khi bạn có 100 class trong số chúng! +Trừ khi bạn cần sử dụng một mixin, như TickerProviderStateMixin, thì việc sử dụng StatefulWidget với Get là hoàn toàn không cần thiết. + +Bạn có thể gọi trực tiếp tất cả các phương thức của StatefulWidget từ GetBuilder. +Nếu bạn cần gọi phương thức initState () hoặc dispose () chẳng hạn, bạn có thể gọi chúng trực tiếp; + +``` dart +GetBuilder( + initState: (_) => Controller.to.fetchApi(), + dispose: (_) => Controller.to.closeStreams(), + builder: (s) => Text('${s.username}'), +), +``` + +Một cách tiếp cận tốt hơn nhiều so với cách này là sử dụng phương thức onInit () và onClose () trực tiếp từ controller của bạn. + +``` dart +@override +void onInit() { + fetchApi(); + super.onInit(); +} +``` + +* CHÍ Ú: Nếu bạn muốn bắt đầu một phương thức tại thời điểm controller được gọi lần đầu tiên, bạn KHÔNG CẦN sử dụng các hàm tạo cho việc này, trên thực tế, bằng cách sử dụng gói hướng hiệu suất như Get, điều này không phù hợp với thực tiễn xấu, bởi vì nó lệch khỏi logic trong đó controller được tạo hoặc chỉ định (nếu bạn tạo một phiên bản của controller này, hàm tạo sẽ được gọi ngay lập tức, bạn sẽ điền controller trước khi nó được sử dụng, bạn đang cấp phát bộ nhớ mà không sử dụng nó , điều này chắc chắn làm hỏng các nguyên tắc của thư viện này). Các phương thức onInit(); và onClose(); được tạo ra cho mục đích này, chúng sẽ được gọi khi Controller được tạo hoặc được sử dụng lần đầu tiên, tùy thuộc vào việc bạn có đang sử dụng Get.lazyPut hay không. Ví dụ: nếu bạn muốn thực hiện lệnh gọi tới API của mình để điền dữ liệu, bạn có thể quên phương thức cũ của initState / dispose, chỉ cần bắt đầu lệnh gọi tới api trong onInit. Nếu bạn cần thực thi bất kỳ lệnh nào, như đóng streams, hãy sử dụng onClose() cho việc đó. + +### Tại sao GetX tồn tại? + +Mục đích của gói này chính xác là cung cấp cho bạn một giải pháp hoàn chỉnh để điều hướng các route, quản lý các dependency và state, sử dụng các dependency ít nhất có thể, với mức độ tách biệt cao. Nhận tất cả các API Flutter cấp cao và cấp thấp trong chính nó, để đảm bảo rằng bạn làm việc với ít khớp nối nhất có thể. Chúng tôi tập trung mọi thứ trong một gói duy nhất, để đảm bảo rằng bạn không có bất kỳ loại khớp nối nào trong dự án của mình. Bằng cách đó, bạn có thể chỉ đặt các widget trong chế độ xem của mình và để phần của nhóm làm việc với logic nghiệp vụ tự do làm việc với logic nghiệp vụ độc lập với View. Điều này cung cấp một môi trường làm việc sạch hơn nhiều, để một phần nhóm của bạn chỉ hoạt động với các widget mà không phải lo lắng về việc gửi dữ liệu đến controller của bạn và một phần nhóm của bạn chỉ làm việc với logic nghiệp vụ trong phạm vi bề rộng của nó mà không dependency vào bất kỳ yếu tố View. + +Vì vậy, để đơn giản hóa điều này: +Bạn không cần gọi các phương thức trong initState và gửi chúng theo tham số đến controller của mình, cũng như không sử dụng phương thức khởi tạo controller cho việc đó, bạn có phương thức onInit() được gọi vào đúng thời điểm để bạn khởi động các dịch vụ của mình. +Bạn không cần phải gọi thiết bị, bạn có phương thức onClose() sẽ được gọi vào thời điểm chính xác khi controller của bạn không còn cần thiết nữa và sẽ bị xóa khỏi bộ nhớ. Bằng cách đó, chỉ để lại chế độ xem cho các widget, tránh bất kỳ loại logic nghiệp vụ nào từ nó. + +Đừng gọi một phương thức vứt bỏ bên trong GetxController, nó sẽ không làm được gì cả, hãy nhớ rằng controller không phải là một Widget, bạn không nên "vứt bỏ" nó, và nó sẽ được Get tự động và thông minh xóa khỏi bộ nhớ. Nếu bạn đã sử dụng bất kỳ streams nào trên đó và muốn đóng streams đó, chỉ cần chèn streams đó vào phương thức đóng. Thí dụ: + +``` dart +class Controller extends GetxController { + StreamController user = StreamController(); + StreamController name = StreamController(); + + /// close stream = onClose method, not dispose. + @override + void onClose() { + user.close(); + name.close(); + super.onClose(); + } +} +``` + +Vòng đời của controller: + +* onInit() nơi nó được tạo. +* onClose() nơi nó được đóng để thực hiện bất kỳ thay đổi nào nhằm chuẩn bị cho phương thức xóa +* deleted: bạn không có quyền truy cập vào API này vì nó sẽ xóa controller khỏi bộ nhớ theo đúng nghĩa đen. Nó được xóa theo đúng nghĩa đen, mà không để lại bất kỳ dấu vết nào. + +### Cách sử dụng khác + +Bạn có thể sử dụng phiên bản Controller trực tiếp trên giá trị GetBuilder: + +``` dart +GetBuilder( + init: Controller(), + builder: (value) => Text( + '${value.counter}', //here + ), +), +``` + +Bạn cũng có thể cần một phiên bản của controller bên ngoài GetBuilder và bạn có thể sử dụng các phương pháp này để đạt được điều này: + +``` dart +class Controller extends GetxController { + static Controller get to => Get.find(); +[...] +} +// on you view: +GetBuilder( + init: Controller(), // use it only first time on each controller + builder: (_) => Text( + '${Controller.to.counter}', //here + ) +), +``` + +or + +``` dart +class Controller extends GetxController { + // static Controller get to => Get.find(); // with no static get +[...] +} +// on stateful/stateless class +GetBuilder( + init: Controller(), // use it only first time on each controller + builder: (_) => Text( + '${Get.find().counter}', //here + ), +), +``` + +* Bạn có thể sử dụng các phương pháp tiếp cận "không chuẩn" để thực hiện việc này. Nếu bạn đang sử dụng một số trình quản lý dependency khác, như get_it, modular, v.v. và chỉ muốn cung cấp phiên bản controller, bạn có thể thực hiện điều này: + +``` dart +Controller controller = Controller(); +[...] +GetBuilder( + init: controller, //here + builder: (_) => Text( + '${controller.counter}', // here + ), +), + +``` + +### IDs độc nhất + +Nếu bạn muốn tinh chỉnh kiểm soát cập nhật của widget con với GetBuilder, bạn có thể gán cho chúng các ID độc: + +``` dart +GetBuilder( + id: 'text' + init: Controller(), // use it only first time on each controller + builder: (_) => Text( + '${Get.find().counter}', //here + ), +), +``` + +Và cập nhật nó vào biểu mẫu này: + +``` dart +update(['text']); +``` + +Bạn cũng có thể áp đặt các điều kiện cho bản cập nhật: + +``` dart +update(['text'], counter < 10); +``` + +GetX thực hiện điều này tự động và chỉ cấu trúc lại widget con sử dụng biến chính xác đã được thay đổi, nếu bạn thay đổi một biến thành giống với biến trước đó và điều đó không ngụ ý thay đổi state, GetX sẽ không xây dựng lại widget con để tiết kiệm bộ nhớ và Chu kỳ CPU ( 3 đang được hiển thị trên màn hình và bạn lại thay đổi biến thành 3. Trong hầu hết các trình quản lý state, điều này sẽ gây ra việc xây dựng lại mới, nhưng với GetX, widget sẽ chỉ được xây dựng lại, nếu trên thực tế state của nó đã thay đổi ). + +## Trộn hai trình quản lý state + +Một số người đã mở một yêu cầu tính năng, vì họ chỉ muốn sử dụng một loại biến phản ứng và cơ chế khác và cần chèn Obx vào GetBuilder cho việc này. Suy nghĩ về nó MixinBuilder đã được tạo ra. Nó cho phép cả những thay đổi phản ứng bằng cách thay đổi các biến ".obs" và cập nhật thủ công thông qua update(). Tuy nhiên, trong số 4 widget, nó là widget tiêu tốn nhiều tài nguyên nhất, vì ngoài việc có Subscription để nhận các event thay đổi từ con mình, nó còn đăng ký phương thức cập nhật của controller của mình. + +Việc mở rộng GetxController rất quan trọng, vì chúng có vòng đời và có thể "bắt đầu" và "kết thúc" các event trong các phương thức onInit() và onClose() của chúng. Bạn có thể sử dụng bất kỳ lớp nào cho việc này, nhưng tôi thực sự khuyên bạn nên sử dụng lớp GetxController để đặt các biến của bạn, cho dù chúng có thể quan sát được hay không. + +## StateMixin + +Một cách khác để xử lý state `UI` của bạn là sử dụng` StateMixin `. +Để triển khai nó, hãy sử dụng dấu `với` để thêm` StateMixin ` bộ điều khiển của bạn cho phép một mô hình T. + +``` dart +class Controller extends GetController with StateMixin{} +``` + +Phương thức `change()` thay đổi state bất cứ khi nào chúng ta muốn. +Chỉ cần truyền dữ liệu và state theo cách này: + +```dart +change(data, status: RxStatus.success()); +``` + +RxStatus cho phép các state này: + +``` dart +RxStatus.loading(); +RxStatus.success(); +RxStatus.empty(); +RxStatus.error('message'); +``` + +Để diễn tả nó trên UI, sử dụng: + +```dart +class OtherClass extends GetView { + @override + Widget build(BuildContext context) { + return Scaffold( + + body: controller.obx( + (state)=>Text(state.name), + + // here you can put your custom loading indicator, but + // by default would be Center(child:CircularProgressIndicator()) + onLoading: CustomLoadingIndicator(), + onEmpty: Text('No data found'), + + // here also you can set your own error widget, but by + // default will be an Center(child:Text(error)) + onError: (error)=>Text(error), + ), + ); +} +``` + +## GetBuilder vs GetX vs Obx vs MixinBuilder + +Trong một thập kỷ làm việc với lập trình, tôi đã có thể học được một số bài học quý giá. + +Lần đầu tiên tôi tiếp xúc với lập trình phản ứng là rất "Trời thần ơi, tuyệt vời ông mặt trời!" và trên thực tế, lập trình phản ứng là không thể tin được. +Tuy nhiên, nó không phải là thích hợp cho tất cả các trường hợp. Thông thường, tất cả những gì bạn cần là thay đổi state của 2 hoặc 3 widget cùng lúc, hoặc thay đổi state trong thời gian ngắn, trong trường hợp này, lập trình phản ứng không phải là xấu, nhưng nó không phù hợp. + +Lập trình phản ứng có mức tiêu thụ RAM cao hơn có thể được bù đắp bởi quy trình làm việc riêng lẻ, điều này sẽ đảm bảo rằng chỉ một widget con được xây dựng lại và khi cần thiết, nhưng tạo danh sách với 80 đối tượng, mỗi đối tượng có nhiều streams không phải là một ý kiến hay . Mở thanh kiểm tra phi tiêu và kiểm tra xem StreamBuilder tiêu thụ bao nhiêu và bạn sẽ hiểu những gì tôi đang cố gắng nói với bạn. + +Với ý nghĩ đó, tôi đã tạo trình quản lý state đơn giản. Nó đơn giản, và đó chính xác là những gì bạn cần ở nó: cập nhật state trong các khối theo cách đơn giản và tiết kiệm nhất. + +GetBuilder rất tiết kiệm RAM và khó có cách tiếp cận nào tiết kiệm hơn nó (ít nhất là tôi không thể tưởng tượng được, nếu đã tồn tại cách khác, vui lòng cho chúng tôi biết). + +Tuy nhiên, GetBuilder vẫn là một trình quản lý state cơ học, bạn cần phải gọi update () giống như bạn sẽ cần gọi tới Provider's InformListaries (). + +Có những tình huống khác mà lập trình phản ứng thực sự thú vị và nếu không dùng nó đồng nghĩa như đang phát minh lại cái bánh xe. Với suy nghĩ đó, GetX được tạo ra để cung cấp mọi thứ hiện đại và tiên tiến nhất trong một trình quản lý state. Nó chỉ cập nhật những gì cần thiết và khi cần thiết, nếu bạn gặp lỗi và gửi 300 state thay đổi đồng thời, GetX sẽ lọc và cập nhật màn hình chỉ khi state thực sự thay đổi. + +GetX vẫn tiết kiệm hơn bất kỳ trình quản lý state phản ứng nào khác, nhưng nó tiêu tốn nhiều RAM hơn GetBuilder một chút. Suy nghĩ về điều đó và hướng tới việc tiêu thụ tối đa tài nguyên mà Obx đã tạo ra. Không giống như GetX và GetBuilder, bạn sẽ không thể khởi tạo controller bên trong Obx, nó chỉ là một Widget với StreamSubscription nhận các event thay đổi từ con bạn, vậy thôi. Nó tiết kiệm hơn GetX, nhưng thua GetBuilder, điều được mong đợi, vì nó có tính phản ứng và GetBuilder có cách tiếp cận đơn giản nhất tồn tại, đó là lưu trữ hashCode của widget con và StateSetter của nó. Với Obx, bạn không cần phải viết loại controller của mình và bạn có thể nghe thấy sự thay đổi từ nhiều controller khác nhau, nhưng nó cần được khởi tạo trước đó, sử dụng phương pháp ví dụ ở đầu readme này hoặc sử dụng class Bindings. diff --git a/siro_rider/packages/get/documentation/zh_CN/dependency_management.md b/siro_rider/packages/get/documentation/zh_CN/dependency_management.md new file mode 100644 index 0000000..e3686b6 --- /dev/null +++ b/siro_rider/packages/get/documentation/zh_CN/dependency_management.md @@ -0,0 +1,375 @@ +# #依赖管理 +- [依赖管理](#依赖管理) + - [实例方法](#实例方法) + - [Get.put()](#Get.put()) + - [Get.lazyPut](#Get.lazyPut) + - [Get.putAsync](#Get.putAsync) + - [Get.create](#Get.create) + - [使用实例化方法/类](#使用实例化方法/类) + - [方法之间的差异](#方法之间的差异) + - [Bindings](#Bindings) + - [Bindings类](#Bindings类) + - [BindingsBuilder](#BindingsBuilder) + - [智能管理](#智能管理) + - [如何改变](#如何改变) + - [SmartManagement.full](#smartmanagementfull) + - [SmartManagement.onlyBuilders](#SmartManagement.onlyBuilders) + - [SmartManagement.keepFactory](#smartmanagementkeepFactory) + - [Bindings的工作原理](#Bindings的工作原理) + - [注释](#注释) + +Get有一个简单而强大的依赖管理器,它允许你只用1行代码就能检索到与你的Bloc或Controller相同的类,无需Provider上下文,无需 inheritedWidget。 + +```dart +Controller controller = Get.put(Controller()); // 而不是 Controller controller = Controller(); +``` + +你是在Get实例中实例化它,而不是在你正在使用的类中实例化你的类,这将使它在整个App中可用。 +所以你可以正常使用你的控制器(或Bloc类)。 + +- 注意:如果你使用的是Get的状态管理器,请多关注[Bindings](#Bindings)api,这将使你的视图更容易连接到你的控制器。 +- 注意事项²。Get的依赖管理与包中的其他部分是分离的,所以如果你的应用已经使用了一个状态管理器(任何一个,都没关系),你不需要修改也可以同时使用这个依赖注入管理器,完全没有问题。 + +## 实例方法 +这些方法和它的可配置参数是: + +### Get.put() + +最常见的插入依赖关系的方式。例如,对于你的视图的控制器来说: + +```dart +Get.put(SomeClass()); +Get.put(LoginController(), permanent: true); +Get.put(ListItemController, tag: "some unique string"); +``` + +这是你使用put时可以设置的所有选项。 +```dart +Get.put( + // 必备:你想得到保存的类,比如控制器或其他东西。 + // 注:"S "意味着它可以是任何类型的类。 + S dependency + + // 可选:当你想要多个相同类型的类时,可以用这个方法。 + // 因为你通常使用Get.find()来获取一个类。 + // 你需要使用标签来告诉你需要哪个实例。 + // 必须是唯一的字符串 + String tag, + + // 可选:默认情况下,get会在实例不再使用后进行销毁 + // (例如:一个已经销毁的视图的Controller) + // 但你可能需要这个实例在整个应用生命周期中保留在那里,就像一个sharedPreferences的实例或其他东西。 + //所以你设置这个选项 + // 默认值为false + bool permanent = false, + + // 可选:允许你在测试中使用一个抽象类后,用另一个抽象类代替它,然后再进行测试。 + // 默认为false + bool overrideAbstract = false, + + // 可选:允许你使用函数而不是依赖(dependency)本身来创建依赖。 + // 这个不常用 + InstanceBuilderCallback builder, +) +``` + +### Get.lazyPut +可以懒加载一个依赖,这样它只有在使用时才会被实例化。这对于计算代价高的类来说非常有用,或者如果你想在一个地方实例化几个类(比如在Bindings类中),而且你知道你不会在那个时候使用这个类。 + +```dart +///只有当第一次使用Get.find时,ApiMock才会被调用。 +Get.lazyPut(() => ApiMock()); + +Get.lazyPut( + () { + // ... some logic if needed + return FirebaseAuth(); + }, + tag: Math.random().toString(), + fenix: true +) + +Get.lazyPut( () => Controller() ) +``` + +这是你在使用lazyPut时可以设置的所有选项。 +```dart +Get.lazyPut( + // 强制性:当你的类第一次被调用时,将被执行的方法。 + InstanceBuilderCallback builder, + + // 可选:和Get.put()一样,当你想让同一个类有多个不同的实例时,就会用到它。 + // 必须是唯一的 + String tag, + + // 可选:类似于 "永久", + // 不同的是,当不使用时,实例会被丢弃,但当再次需要使用时,Get会重新创建实例, + // 就像 bindings api 中的 "SmartManagement.keepFactory "一样。 + // 默认值为false + bool fenix = false + +) +``` + +### Get.putAsync +如果你想注册一个异步实例,你可以使用`Get.putAsync`。 + +```dart +Get.putAsync(() async { + final prefs = await SharedPreferences.getInstance(); + await prefs.setInt('counter', 12345); + return prefs; +}); + +Get.putAsync( () async => await YourAsyncClass() ) +``` + +这都是你在使用putAsync时可以设置的选项。 +```dart +Get.putAsync( + + // 必备:一个将被执行的异步方法,用于实例化你的类。 + AsyncInstanceBuilderCallback builder, + + // 可选:和Get.put()一样,当你想让同一个类有多个不同的实例时,就会用到它。 + // 必须是唯一的 + String tag, + + // 可选:与Get.put()相同,当你需要在整个应用程序中保持该实例的生命时使用。 + // 默认值为false + bool permanent = false +) +``` + +### Get.create + +这个就比较棘手了。关于这个是什么和其他的区别,可以在[方法之间的差异](#方法之间的差异)部分找到详细的解释。 + +```dart +Get.Create(() => SomeClass()); +Get.Create(() => LoginController()); +``` + +这是你在使用create时可以设置的所有选项。 + +```dart +Get.create( + // 需要:一个返回每次调用"Get.find() "都会被新建的类的函数。 + // 示例: Get.create(()=>YourClass()) + FcBuilderFunc builder, + + // 可选:就像Get.put()一样,但当你需要多个同类的实例时,会用到它。 + // 当你有一个列表,每个项目都需要自己的控制器时,这很有用。 + // 需要是一个唯一的字符串。只要把标签改成名字 + String name, + + // 可选:就像 Get.put() 一样, + // 它是为了当你需要在整个应用中保活实例的时候 + // 区别在于 Get.create 的 permanent默认为true + bool permanent = true +``` + +## 使用实例化方法/类 + +想象一下,你已经浏览了无数条路由,现在你需要拿到一个被遗留在控制器中的数据,那么你会需要一个状态管理器与Provider或Get_it相结合,对吗?用Get则不然,你只需要让Get为你的控制器自动 "寻找",你不需要任何额外的依赖关系。 + +```dart +final controller = Get.find(); +// 或者 +Controller controller = Get.find(); + +// 是的,它看起来像魔术,Get会找到你的控制器,并将其提供给你。 +// 你可以实例化100万个控制器,Get总会给你正确的控制器。 +``` + +然后你就可以恢复你在后面获得的控制器数据。 + +```dart +Text(controller.textFromApi); +``` + +由于返回的值是一个正常的类,你可以做任何你想做的事情。 +```dart +int count = Get.find().getInt('counter'); +print(count); // out: 12345 +``` + +移除一个Get实例: + +```dart +Get.delete(); //通常你不需要这样做,因为GetX已经删除了未使用的控制器。 +``` + +## 方法之间的差异 + +首先,让我们来看看Get.lazyPut的 "fenix "和其他方法的 "permanent"。 + +`permanent`和`fenix`的根本区别在于你想如何存储实例。 + +强化:默认情况下,GetX会在不使用实例时删除它们。 +这意味着 如果页面1有控制器1,页面2有控制器2,而你从堆栈中删除了第一个路由,(比如你使用`Get.off()`或`Get.offNamed()`)控制器1失去了它的使用,所以它将被删除。 + +但是如果你想选择使用`permanent:true`,那么控制器就不会在这个过渡中丢失--这对于你想在整个应用程序中保持生命的服务来说非常有用。 + +`fenix`则是针对那些你不担心在页面变化之间丢失的服务,但当你需要该服务时,你希望它还活着。所以基本上,它会处理未使用的控制器/服务/类,但当你需要它时,它会 "从灰烬中重新创建 "一个新的实例。 + +继续说说方法之间的区别: + +- Get.put和Get.putAsync的创建顺序是一样的,不同的是,第二个方法使用的是异步方法创建和初始化实例。put是直接插入内存,使用内部方法`insert`,参数`permanent: false`和`isSingleton: true`(这个isSingleton参数只是告诉它是使用`dependency`上的依赖,还是使用`FcBuilderFunc`上的依赖),之后,调用`Get.find()`,立即初始化内存中的实例。 + +- Get.create。顾名思义,它将 "创建 "你的依赖关系!类似于`Get.put()`。与`Get.put()`类似,它也会调用内部方法`insert`来实例化。但是`permanent`变成了true,而`isSingleton`变成了false(因为我们是在 "创建 "我们的依赖关系,所以它没有办法成为一个单例,这就是为什么是false)。因为它有`permanent: true`,所以我们默认的好处是不会在页面跳转之间销毁它。另外,`Get.find()`并不是立即被调用,而是等待在页面中被调用,这样创建是为了利用 "permanent "这个参数,值得注意的是,`Get.create()`的目标是创建不共享的实例,但不会被销毁,比如listView中的一个按钮,你想为该列表创建一个唯一的实例--正因为如此,Get.create必须和GetWidget一起使用。 + +- Get.lazyPut。顾名思义,这是一个懒加载的过程。实例被创建了,但它并没有被调用来立即使用,而是一直等待被调用。与其他方法相反,这里没有调用 "insert"。取而代之的是,实例被插入到内存的另一个部分,这个部分负责判断实例是否可以被重新创建,我们称之为 "工厂"。如果我们想创建一些以后使用的东西,它不会和现在使用的东西混在一起。这就是 "fenix "的魔力所在:如果你选择留下 "fenix: false",并且你的 "smartManagement "不是 "keepFactory",那么当使用 "Get.find "时,实例将把内存中的位置从 "工厂 "改为普通实例内存区域。紧接着,默认情况下,它将从 "工厂 "中移除。现在,如果你选择 "fenix: true",实例将继续存在这个专用的部分,甚至进入公共区域,以便将来再次被调用。 + +## Bindings + +这个包最大的区别之一,也许就是可以将路由、状态管理器和依赖管理器完全集成。 +当一个路由从Stack中移除时,所有与它相关的控制器、变量和对象的实例都会从内存中移除。如果你使用的是流或定时器,它们会自动关闭,你不必担心这些。 +在2.10版本中,Get完全实现了Bindings API。 +现在你不再需要使用init方法了。如果你不想的话,你甚至不需要键入你的控制器。你可以在适当的地方启动你的控制器和服务来实现。 +Binding类是一个将解耦依赖注入的类,同时 "Bindings "路由到状态管理器和依赖管理器。 +这使得Get可以知道当使用某个控制器时,哪个页面正在显示,并知道在哪里以及如何销毁它。 +此外,Binding类将允许你拥有SmartManager配置控制。你可以配置依赖关系,当从堆栈中删除一个路由时,或者当使用它的widget被布置时,或者两者都不布置。你将有智能依赖管理为你工作,但即使如此,你也可以按照你的意愿进行配置。 + +### Bindings类 + +- 创建一个类并实现Binding + +```dart +class HomeBinding implements Bindings {} +``` + +你的IDE会自动要求你重写 "dependencies"方法,然后插入你要在该路由上使用的所有类。 + +```dart +class HomeBinding implements Bindings { + @override + void dependencies() { + Get.lazyPut(() => HomeController()); + Get.put(()=> Api()); + } +} + +class DetailsBinding implements Bindings { + @override + void dependencies() { + Get.lazyPut(() => DetailsController()); + } +} +``` + +现在你只需要通知你的路由,你将使用该 Binding 来建立路由管理器、依赖关系和状态之间的连接。 + +- 使用别名路由: + +```dart +getPages: [ + GetPage( + name: '/', + page: () => HomeView(), + binding: HomeBinding(), + ), + GetPage( + name: '/details', + page: () => DetailsView(), + binding: DetailsBinding(), + ), +]; +``` + +- 使用正常路由。 + +```dart +Get.to(Home(), binding: HomeBinding()); +Get.to(DetailsView(), binding: DetailsBinding()) +``` + +至此,你不必再担心你的应用程序的内存管理,Get将为你做这件事。 + +Binding类在调用路由时被调用,你可以在你的GetMaterialApp中创建一个 "initialBinding "来插入所有将要创建的依赖关系。 + +```dart +GetMaterialApp( + initialBinding: SampleBind(), + home: Home(), +); +``` + +### BindingsBuilder + +创建Bindings的默认方式是创建一个实现Bindings的类,但是,你也可以使用`BindingsBuilder`回调,这样你就可以简单地使用一个函数来实例化任何你想要的东西。 + +例子: + +```dart +getPages: [ + GetPage( + name: '/', + page: () => HomeView(), + binding: BindingsBuilder(() { + Get.lazyPut(() => ControllerX()); + Get.put(()=> Api()); + }), + ), + GetPage( + name: '/details', + page: () => DetailsView(), + binding: BindingsBuilder(() { + Get.lazyPut(() => DetailsController()); + }), + ), +]; +``` + +这样一来,你就可以避免为每条路径创建一个 Binding 类,使之更加简单。 + +两种方式都可以完美地工作,我们希望您使用最适合您的风格。 + +### 智能管理 + +GetX 默认情况下会将未使用的控制器从内存中移除。 +但是如果你想改变GetX控制类的销毁方式,你可以用`SmartManagement`类设置不同的行为。 + +#### 如何改变 + +如果你想改变这个配置(你通常不需要),就用这个方法。 + +```dart +void main () { + runApp( + GetMaterialApp( + smartManagement: SmartManagement.onlyBuilders //这里 + home: Home(), + ) + ) +} +``` + +#### SmartManagement.full + +这是默认的。销毁那些没有被使用的、没有被设置为永久的类。在大多数情况下,你会希望保持这个配置不受影响。如果你是第一次使用GetX,那么不要改变这个配置。 + +#### SmartManagement.onlyBuilders +使用该选项,只有在`init:`中启动的控制器或用`Get.lazyPut()`加载到Binding中的控制器才会被销毁。 + +如果你使用`Get.put()`或`Get.putAsync()`或任何其他方法,SmartManagement将没有权限移除这个依赖。 + +在默认行为下,即使是用 "Get.put "实例化的widget也会被移除,这与SmartManagement.onlyBuilders不同。 + +#### SmartManagement.keepFactory + +就像SmartManagement.full一样,当它不再被使用时,它将删除它的依赖关系,但它将保留它们的工厂,这意味着如果你再次需要该实例,它将重新创建该依赖关系。 +### Bindings的工作原理 +Bindings会创建过渡性工厂,在你点击进入另一个页面的那一刻,这些工厂就会被创建,一旦换屏动画发生,就会被销毁。 +这种情况发生得非常快,以至于分析器甚至都来不及注册。 +当你再次导航到这个页面时,一个新的临时工厂将被调用,所以这比使用SmartManagement.keepFactory更可取,但如果你不想创建Bindings,或者想让你所有的依赖关系都在同一个Binding上,它肯定会帮助你。 +Factories占用的内存很少,它们并不持有实例,而是一个具有你想要的那个类的 "形状 "的函数。 +这在内存上的成本很低,但由于这个库的目的是用最少的资源获得最大的性能,所以Get连工厂都默认删除。 +请使用对你来说最方便的方法。 + +## 注释 + +- 如果你使用多个Bindings,不要使用SmartManagement.keepFactory。它被设计成在没有Bindings的情况下使用,或者在GetMaterialApp的初始Binding中链接一个Binding。 + +- 使用Bindings是完全可选的,你也可以在使用给定控制器的类上使用`Get.put()`和`Get.find()`。 +然而,如果你使用Services或任何其他抽象,我建议使用Bindings来更好地组织。 diff --git a/siro_rider/packages/get/documentation/zh_CN/route_management.md b/siro_rider/packages/get/documentation/zh_CN/route_management.md new file mode 100644 index 0000000..4de7db3 --- /dev/null +++ b/siro_rider/packages/get/documentation/zh_CN/route_management.md @@ -0,0 +1,556 @@ +- [路由管理](#路由管理) + - [如何使用](#如何使用) + - [普通路由导航](#普通路由导航) + - [别名路由导航](#别名路由导航) + - [发送数据到别名路由](#发送数据到别名路由) + - [动态网页链接](#动态网页链接) + - [中间件](#中间件) + - [免context导航](#免context导航) + - [SnackBars](#SnackBars) + - [Dialogs](#dialogs) + - [BottomSheets](#bottomSheets) + - [嵌套导航](#嵌套导航) + +# 路由管理 + +这是关于Getx在路由管理方面的完整解释。 + +## 如何使用 + +将此添加到你的pubspec.yaml文件中。 + +```yaml +dependencies: + get: +``` + +如果你要在没有context的情况下使用路由/SnackBars/Dialogs/BottomSheets,或者使用高级的Get API,你只需要在你的MaterialApp前面加上 "Get",就可以把它变成GetMaterialApp,享受吧! + +```dart +GetMaterialApp( // Before: MaterialApp( + home: MyHome(), +) +``` + +## 普通路由导航 + +导航到新的页面。 + +```dart +Get.to(NextScreen()); +``` + +关闭SnackBars、Dialogs、BottomSheets或任何你通常会用Navigator.pop(context)关闭的东西。 + +```dart +Get.back(); +``` + +进入下一个页面,但没有返回上一个页面的选项(用于SplashScreens,登录页面等)。 + +```dart +Get.off(NextScreen()); +``` + +进入下一个界面并取消之前的所有路由(在购物车、投票和测试中很有用)。 + +```dart +Get.offAll(NextScreen()); +``` + +要导航到下一条路由,并在返回后立即接收或更新数据。 + +```dart +var data = await Get.to(Payment()); +``` + +在另一个页面上,发送前一个路由的数据。 + +```dart +Get.back(result: 'success'); +``` + +并使用它,例: + +```dart +if(data == 'success') madeAnything(); +``` + +你不想学习我们的语法吗? +只要把 Navigator(大写)改成 navigator(小写),你就可以拥有标准导航的所有功能,而不需要使用context,例如: + +```dart + +// 默认的Flutter导航 +Navigator.of(context).push( + context, + MaterialPageRoute( + builder: (BuildContext context) { + return HomePage(); + }, + ), +); + +// 使用Flutter语法获得,而不需要context。 +navigator.push( + MaterialPageRoute( + builder: (_) { + return HomePage(); + }, + ), +); + +// get语法 (这要好得多) +Get.to(HomePage()); + + +``` + +## 别名路由导航 + +- 如果你喜欢用别名路由导航,Get也支持。 + +导航到下一个页面 + +```dart +Get.toNamed("/NextScreen"); +``` + +浏览并删除前一个页面。 + +```dart +Get.offNamed("/NextScreen"); +``` + +浏览并删除所有以前的页面。 + +```dart +Get.offAllNamed("/NextScreen"); +``` + +要定义路由,使用GetMaterialApp。 + +```dart +void main() { + runApp( + GetMaterialApp( + initialRoute: '/', + getPages: [ + GetPage(name: '/', page: () => MyHomePage()), + GetPage(name: '/second', page: () => Second()), + GetPage( + name: '/third', + page: () => Third(), + transition: Transition.zoom + ), + ], + ) + ); +} +``` + +要处理到未定义路线的导航(404错误),可以在GetMaterialApp中定义unknownRoute页面。 + +```dart +void main() { + runApp( + GetMaterialApp( + unknownRoute: GetPage(name: '/notfound', page: () => UnknownRoutePage()), + initialRoute: '/', + getPages: [ + GetPage(name: '/', page: () => MyHomePage()), + GetPage(name: '/second', page: () => Second()), + ], + ) + ); +} +``` + +### 发送数据到别名路由 + +只要发送你想要的参数即可。Get在这里接受任何东西,无论是一个字符串,一个Map,一个List,甚至一个类的实例。 + +```dart +Get.toNamed("/NextScreen", arguments: 'Get is the best'); +``` + +在你的类或控制器上: + +```dart +print(Get.arguments); +//print out: Get is the best +``` + +### 动态网页链接 + +Get提供高级动态URL,就像在Web上一样。Web开发者可能已经在Flutter上想要这个功能了,Get也解决了这个问题。 + +```dart +Get.offAllNamed("/NextScreen?device=phone&id=354&name=Enzo"); +``` + +在你的controller/bloc/stateful/stateless类上: + +```dart +print(Get.parameters['id']); +// out: 354 +print(Get.parameters['name']); +// out: Enzo +``` + +你也可以用Get轻松接收NamedParameters。 + +```dart +void main() { + runApp( + GetMaterialApp( + initialRoute: '/', + getPages: [ + GetPage( + name: '/', + page: () => MyHomePage(), + ), + GetPage( + name: '/profile/', + page: () => MyProfile(), + ), + //你可以为有参数的路由定义一个不同的页面,也可以为没有参数的路由定义一个不同的页面,但是你必须在不接收参数的路由上使用斜杠"/",就像上面说的那样。 + GetPage( + name: '/profile/:user', + page: () => UserProfile(), + ), + GetPage( + name: '/third', + page: () => Third(), + transition: Transition.cupertino + ), + ], + ) + ); +} +``` + +发送别名路由数据 + +```dart +Get.toNamed("/second/34954"); +``` + +在第二个页面上,通过参数获取数据 + +```dart +print(Get.parameters['user']); +// out: 34954 +``` + +或像这样发送多个参数 + +```dart +Get.toNamed("/profile/34954?flag=true"); +``` + +在第二个屏幕上,通常按参数获取数据 + +```dart +print(Get.parameters['user']); +print(Get.parameters['flag']); +// out: 34954 true +``` + + +现在,你需要做的就是使用Get.toNamed()来导航你的别名路由,不需要任何context(你可以直接从你的BLoC或Controller类中调用你的路由),当你的应用程序被编译到web时,你的路由将出现在URL中。 + +### 中间件 + +如果你想通过监听Get事件来触发动作,你可以使用routingCallback来实现。 + +```dart +GetMaterialApp( + routingCallback: (routing) { + if(routing.current == '/second'){ + openAds(); + } + } +) +``` + +如果你没有使用GetMaterialApp,你可以使用手动API来附加Middleware观察器。 + +```dart +void main() { + runApp( + MaterialApp( + onGenerateRoute: Router.generateRoute, + initialRoute: "/", + navigatorKey: Get.key, + navigatorObservers: [ + GetObserver(MiddleWare.observer), // HERE !!! + ], + ), + ); +} +``` + +创建一个MiddleWare类 + +```dart +class MiddleWare { + static observer(Routing routing) { + ///你除了可以监听路由外,还可以监听每个页面上的SnackBars、Dialogs和Bottomsheets。 + if (routing.current == '/second' && !routing.isSnackbar) { + Get.snackbar("Hi", "You are on second route"); + } else if (routing.current =='/third'){ + print('last route called'); + } + } +} +``` + +现在,在你的代码上使用Get: + +```dart +class First extends StatelessWidget { + @override + Widget build(BuildContext context) { + return Scaffold( + appBar: AppBar( + leading: IconButton( + icon: Icon(Icons.add), + onPressed: () { + Get.snackbar("hi", "i am a modern snackbar"); + }, + ), + title: Text('First Route'), + ), + body: Center( + child: ElevatedButton( + child: Text('Open route'), + onPressed: () { + Get.toNamed("/second"); + }, + ), + ), + ); + } +} + +class Second extends StatelessWidget { + @override + Widget build(BuildContext context) { + return Scaffold( + appBar: AppBar( + leading: IconButton( + icon: Icon(Icons.add), + onPressed: () { + Get.snackbar("hi", "i am a modern snackbar"); + }, + ), + title: Text('second Route'), + ), + body: Center( + child: ElevatedButton( + child: Text('Open route'), + onPressed: () { + Get.toNamed("/third"); + }, + ), + ), + ); + } +} + +class Third extends StatelessWidget { + @override + Widget build(BuildContext context) { + return Scaffold( + appBar: AppBar( + title: Text("Third Route"), + ), + body: Center( + child: ElevatedButton( + onPressed: () { + Get.back(); + }, + child: Text('Go back!'), + ), + ), + ); + } +} +``` + +## 免context导航 + +### SnackBars + +用Flutter创建一个简单的SnackBar,你必须获得Scaffold的context,或者你必须使用一个GlobalKey附加到你的Scaffold上。 + +```dart +final snackBar = SnackBar( + content: Text('Hi!'), + action: SnackBarAction( + label: 'I am a old and ugly snackbar :(', + onPressed: (){} + ), +); +// 在小组件树中找到脚手架并使用它显示一个SnackBars。 +Scaffold.of(context).showSnackBar(snackBar); +``` + +用Get: + +```dart +Get.snackbar('Hi', 'i am a modern snackbar'); +``` + +有了Get,你所要做的就是在你代码的任何地方调用你的Get.snackbar,或者按照你的意愿定制它。 + +```dart +Get.snackbar( + "Hey i'm a Get SnackBar!", // title + "It's unbelievable! I'm using SnackBar without context, without boilerplate, without Scaffold, it is something truly amazing!", // message + icon: Icon(Icons.alarm), + shouldIconPulse: true, + onTap:(){}, + barBlur: 20, + isDismissible: true, + duration: Duration(seconds: 3), +); + + + ////////// ALL FEATURES ////////// + // Color colorText, + // Duration duration, + // SnackPosition snackPosition, + // Widget titleText, + // Widget messageText, + // bool instantInit, + // Widget icon, + // bool shouldIconPulse, + // double maxWidth, + // EdgeInsets margin, + // EdgeInsets padding, + // double borderRadius, + // Color borderColor, + // double borderWidth, + // Color backgroundColor, + // Color leftBarIndicatorColor, + // List boxShadows, + // Gradient backgroundGradient, + // TextButton mainButton, + // OnTap onTap, + // bool isDismissible, + // bool showProgressIndicator, + // AnimationController progressIndicatorController, + // Color progressIndicatorBackgroundColor, + // Animation progressIndicatorValueColor, + // SnackStyle snackStyle, + // Curve forwardAnimationCurve, + // Curve reverseAnimationCurve, + // Duration animationDuration, + // double barBlur, + // double overlayBlur, + // Color overlayColor, + // Form userInputForm + /////////////////////////////////// +``` + +如果您喜欢传统的SnackBars,或者想从头开始定制,包括只添加一行(Get.snackbar使用了一个强制性的标题和信息),您可以使用 +`Get.rawSnackbar();`它提供了建立Get.snackbar的RAW API。 + +### Dialogs + +打开Dialogs: + +```dart +Get.dialog(YourDialogWidget()); +``` + +打开默认Dialogs: + +```dart +Get.defaultDialog( + onConfirm: () => print("Ok"), + middleText: "Dialog made in 3 lines of code" +); +``` + +你也可以用Get.generalDialog代替showGeneralDialog。 + +对于所有其他的FlutterDialogs小部件,包括cupertinos,你可以使用Get.overlayContext来代替context,并在你的代码中任何地方打开它。 +对于不使用Overlay的小组件,你可以使用Get.context。 +这两个context在99%的情况下都可以代替你的UIcontext,除了在没有导航context的情况下使用 inheritedWidget的情况。 + +### BottomSheets + +Get.bottomSheet类似于showModalBottomSheet,但不需要context: + +```dart +Get.bottomSheet( + Container( + child: Wrap( + children: [ + ListTile( + leading: Icon(Icons.music_note), + title: Text('Music'), + onTap: () {} + ), + ListTile( + leading: Icon(Icons.videocam), + title: Text('Video'), + onTap: () {}, + ), + ], + ), + ) +); +``` + +## 嵌套导航 + +Get让Flutter的嵌套导航更加简单。 +你不需要context,而是通过Id找到你的导航栈。 + +- 注意:创建平行导航堆栈可能是危险的。理想的情况是不要使用NestedNavigators,或者尽量少用。如果你的项目需要它,请继续,但请记住,在内存中保持多个导航堆栈可能不是一个好主意(消耗RAM)。 + +看看它有多简单: + +```dart +Navigator( + key: Get.nestedKey(1), // create a key by index + initialRoute: '/', + onGenerateRoute: (settings) { + if (settings.name == '/') { + return GetPageRoute( + page: () => Scaffold( + appBar: AppBar( + title: Text("Main"), + ), + body: Center( + child: TextButton( + color: Colors.blue, + onPressed: () { + Get.toNamed('/second', id:1); // navigate by your nested route by index + }, + child: Text("Go to second"), + ), + ), + ), + ); + } else if (settings.name == '/second') { + return GetPageRoute( + page: () => Center( + child: Scaffold( + appBar: AppBar( + title: Text("Main"), + ), + body: Center( + child: Text("second") + ), + ), + ), + ); + } + } +), +``` diff --git a/siro_rider/packages/get/documentation/zh_CN/state_management.md b/siro_rider/packages/get/documentation/zh_CN/state_management.md new file mode 100644 index 0000000..6867d42 --- /dev/null +++ b/siro_rider/packages/get/documentation/zh_CN/state_management.md @@ -0,0 +1,714 @@ +- [状态管理](#状态管理) + - [响应式状态管理器](#响应式状态管理器) + - [优点](#优势) + - [声明一个响应式变量](#声明一个响应式变量) + - [使用视图中的值](#使用视图中的值) + - [什么时候重建](#什么时候重建) + - [可以使用.obs的地方](#可以使用.obs的地方) + - [关于List的说明](#关于List的说明) + - [为什么使用.value](#为什么使用.value) + - [Obx()](#obx) + - [Workers](#Workers) + - [简单状态管理器](#简单状态管理器) + - [优点](#优点) + - [用法](#用法) + - [如何处理controller](#如何处理controller) + - [无需StatefulWidgets](#无需StatefulWidgets) + - [为什么它存在](#为什么它存在) + - [其他使用方法](#其他使用方法) + - [唯一的ID](#唯一的ID) + - [与其他状态管理器混用](#与其他状态管理器混用) + - [GetBuilder vs GetX vs Obx vs MixinBuilder](#GetBuilder-vs-GetX-vs-Obx-vs-MixinBuilder) + +# 状态管理 + +目前,Flutter有几种状态管理器。但是,它们中的大多数都涉及到使用ChangeNotifier来更新widget,这对于中大型应用的性能来说是一个糟糕的方法。你可以在Flutter官方文档中查到,[ChangeNotifier应该使用1个或最多2个监听器](https://api.flutter.dev/flutter/foundation/ChangeNotifier-class.html),这使得它实际上无法用于任何中等或大型应用。 + +其他的状态管理器也不错,但有其细微的差别。 + +- BLoC非常安全和高效,但是对于初学者来说非常复杂,这使得人们无法使用Flutter进行开发。 +- MobX比BLoC更容易,而且是响应式的,几乎是完美的,但是你需要使用一个代码生成器,对于大型应用来说,这降低了生产力,因为你需要喝很多咖啡,直到你的代码在`flutter clean`之后再次准备好(这不是MobX的错,而是codegen真的很慢!)。 +- Provider使用InheritedWidget来传递相同的监听器,以此来解决上面报告的ChangeNotifier的问题,这意味着对其ChangeNotifier类的任何访问都必须在widget树内。 + +Get并不是比任何其他状态管理器更好或更差,而是说你应该分析这些要点以及下面的要点来选择是只用Get,还是与其他状态管理器结合使用。Get不是其他状态管理器的敌人,因为Get是一个微框架,而不仅仅是一个状态管理器,它的状态管理功能既可以单独使用,也可以与其他状态管理器结合使用。 + +## 响应式状态管理器 + +响应式编程可能会让很多人感到陌生,因为它很复杂,但是GetX将响应式编程变得非常简单。 + +- 你不需要创建StreamControllers. +- 你不需要为每个变量创建一个StreamBuilder。 +- 你不需要为每个状态创建一个类。 +- 你不需要为一个初始值创建一个get。 + +使用 Get 的响应式编程就像使用 setState 一样简单。 + +让我们想象一下,你有一个名称变量,并且希望每次你改变它时,所有使用它的小组件都会自动刷新。 + +这是你的计数变量: + +```dart +var name = 'Jonatas Borges'; +``` + +要想让它变得可观察,你只需要在它的末尾加上".obs"。 + +```dart +var name = 'Jonatas Borges'.obs; +``` + +就这么简单! + +我们把这个reactive-".obs"(ervables)变量称为_Rx_。 + +我们做了什么?我们创建了一个 "Stream "的 "String",分配了初始值 "Jonatas Borges",我们通知所有使用 "Jonatas Borges "的widgets,它们现在 "属于 "这个变量,当_Rx_的值发生变化时,它们也要随之改变。 + +这就是GetX**的**魔力,这要归功于Dart的能力。 + +但是,我们知道,一个`Widget`只有在函数里面才能改变,因为静态类没有 "自动改变 "的能力。 + +你需要创建一个`StreamBuilder`,订阅这个变量来监听变化,如果你想在同一个范围内改变几个变量,就需要创建一个 "级联 "的嵌套`StreamBuilder`,对吧? + +不,你不需要一个`StreamBuilder`,但你对静态类的理解是对的。 + +在视图中,当我们想改变一个特定的Widget时,我们通常有很多Flutter方式的模板。 +有了**GetX**,你也可以忘记这些模板代码了。 + +`StreamBuilder( ... )`? `initialValue: ...`? `builder: ...`? 不,你只需要把这个变量放在`Obx()`这个Widget里面就可以了。 + +```dart +Obx (() => Text (controller.name)); +``` + +_你只需记住 `Obx(()=>` + +你只需将Widget通过一个箭头函数传递给 `Obx()`(_Rx_的 "观察者")。 + +`Obx`是相当聪明的,只有当`controller.name`的值发生变化时才会改变。 + +如果`name`是`"John"`,你把它改成了`"John"`(`name.value="John"`),因为它和之前的`value`是一样的,所以界面上不会有任何变化,而`Obx`为了节省资源,会直接忽略新的值,不重建Widget。**这是不是很神奇**? + +> 那么,如果我在一个`Obx`里有5个_Rx_(可观察的)变量呢? + +当其中**任何**一个变量发生变化时,它就会更新。 + +> 如果我在一个类中有 30 个变量,当我更新其中一个变量时,它会更新该类中**所有**的变量吗? + +不会,只会更新使用那个 _Rx_ 变量的**特定 Widget**。 + +所以,只有当_Rx_变量的值发生变化时,**GetX**才会更新界面。 + +``` +final isOpen = false.obs; + +//什么都不会发生......相同的值。 +void onButtonTap() => isOpen.value=false; +``` +### 优势 + +**当你需要对更新的内容进行**精细的控制时,**GetX()** 可以帮助你。 + +如果你不需要 "unique IDs",比如当你执行一个操作时,你的所有变量都会被修改,那么就使用`GetBuilder`。 +因为它是一个简单的状态更新器(以块为单位,比如`setState()`),只用几行代码就能完成。 +它做得很简单,对CPU的影响最小,只是为了完成一个单一的目的(一个_State_ Rebuild),并尽可能地花费最少的资源。 + +如果你需要一个**强大的**状态管理器,用**GetX**是不会错的。 + +它不能和变量一起工作,除了__flows__,它里面的东西本质都是`Streams`。 +你可以将_rxDart_与它结合使用,因为所有的东西都是`Streams`。 +你可以监听每个"_Rx_变量 "的 "事件"。 +因为里面的所有东西都是 "Streams"。 + +这实际上是一种_BLoC_方法,比_MobX_更容易,而且没有代码生成器或装饰。 +你可以把**任何东西**变成一个_"Observable"_,只需要在它末尾加上`.obs`。 + +### 最高性能 + +除了有一个智能的算法来实现最小化的重建,**GetX**还使用了比较器以确保状态已经改变。 + +如果你的应用程序中遇到错误,并发送重复的状态变更,**GetX**将确保它不会崩溃。 + +使用**GetX**,只有当`value`改变时,状态才会改变。 +这就是**GetX**,和使用MobX_的_`computed`的主要区别。 +当加入两个__observable__,其中一个发生变化时,该_observable_的监听器也会发生变化。 + +使用**GetX**,如果你连接了两个变量,`GetX()`(类似于`Observer()`)只有在它的状态真正变化时才会重建。 + +### 声明一个响应式变量 + +你有3种方法可以把一个变量变成是 "可观察的"。 + + +1 - 第一种是使用 **`Rx{Type}`**。 + +```dart +// 建议使用初始值,但不是强制性的 +final name = RxString(''); +final isLogged = RxBool(false); +final count = RxInt(0); +final balance = RxDouble(0.0); +final items = RxList([]); +final myMap = RxMap({}); +``` + +2 - 第二种是使用 **`Rx`**,规定泛型 `Rx`。 + +```dart +final name = Rx(''); +final isLogged = Rx(false); +final count = Rx(0); +final balance = Rx(0.0); +final number = Rx(0) +final items = Rx>([]); +final myMap = Rx>({}); + +// 自定义类 - 可以是任何类 +final user = Rx(); +``` + +3 - 第三种更实用、更简单、更可取的方法,只需添加 **`.obs`** 作为`value`的属性。 + +```dart +final name = ''.obs; +final isLogged = false.obs; +final count = 0.obs; +final balance = 0.0.obs; +final number = 0.obs; +final items = [].obs; +final myMap = {}.obs; + +// 自定义类 - 可以是任何类 +final user = User().obs; +``` + +##### 有一个反应的状态,很容易。 + +我们知道,_Dart_现在正朝着_null safety_的方向发展。 +为了做好准备,从现在开始,你应该总是用一个**初始值**来开始你的_Rx_变量。 + +> 用**GetX**将一个变量转化为一个_observable_ + _initial value_是最简单,也是最实用的方法。 + +你只需在变量的末尾添加一个"`.obs`",即可把它变成可观察的变量, +然后它的`.value`就是_初始值_)。 + + +### 使用视图中的值 + +```dart +// controller +final count1 = 0.obs; +final count2 = 0.obs; +int get sum => count1.value + count2.value; +``` + +```dart +// 视图 +GetX( + builder: (controller) { + print("count 1 rebuild"); + return Text('${controller.count1.value}'); + }, +), +GetX( + builder: (controller) { + print("count 2 rebuild"); + return Text('${controller.count2.value}'); + }, +), +GetX( + builder: (controller) { + print("count 3 rebuild"); + return Text('${controller.sum}'); + }, +), +``` + +如果我们把`count1.value++`递增,就会打印出来: +- `count 1 rebuild` +- `count 3 rebuild` + + +如果我们改变`count2.value++`,就会打印出来。 +- `count 2 rebuild` +- `count 3 rebuild` + +因为`count2.value`改变了,`sum`的结果现在是`2`。 + +- 注意:默认情况下,第一个事件将重建小组件,即使是相同的`值`。 + 这种行为是由于布尔变量而存在的。 + +想象一下你这样做。 + +```dart +var isLogged = false.obs; +``` + +然后,你检查用户是否 "登录",以触发`ever`的事件。 + +```dart +@override +onInit(){ + ever(isLogged, fireRoute); + isLogged.value = await Preferences.hasToken(); +} + +fireRoute(logged) { + if (logged) { + Get.off(Home()); + } else { + Get.off(Login()); + } +} +``` + +如果 "hasToken "是 "false","isLogged "就不会有任何变化,所以 "ever() "永远不会被调用。 +为了避免这种问题,_observable_的第一次变化将总是触发一个事件,即使它包含相同的`.value`。 + +如果你想删除这种行为,你可以使用: +`isLogged.firstRebuild = false;`。 + +### 什么时候重建 + +此外,Get还提供了精细的状态控制。你可以根据特定的条件对一个事件进行条件控制(比如将一个对象添加到List中)。 + +```dart +// 第一个参数:条件,必须返回true或false。 +// 第二个参数:如果条件为真,则为新的值。 +list.addIf(item < limit, item); +``` + +没有装饰,没有代码生成器,没有复杂的程序: 爽歪歪! + +你知道Flutter的计数器应用吗?你的Controller类可能是这样的。 + +```dart +class CountController extends GetxController { + final count = 0.obs; +} +``` + +用一个简单的。 + +```dart +controller.count.value++ +``` + +你可以在你的UI中更新计数器变量,不管它存储在哪里。 + +### 可以使用.obs的地方 + +你可以在 obs 上转换任何东西,这里有两种方法: + +* 可以将你的类值转换为 obs +```dart +class RxUser { + final name = "Camila".obs; + final age = 18.obs; +} +``` + +* 或者可以将整个类转换为一个可观察的类。 +```dart +class User { + User({String name, int age}); + var name; + var age; +} + +//实例化时。 +final user = User(name: "Camila", age: 18).obs; +``` + +### 关于List的说明 + +List和它里面的对象一样,是完全可以观察的。这样一来,如果你在List中添加一个值,它会自动重建使用它的widget。 + +你也不需要在List中使用".value",神奇的dart api允许我们删除它。 +不幸的是,像String和int这样的原始类型不能被扩展,使得.value的使用是强制性的,但是如果你使用get和setter来处理这些类型,这将不是一个问题。 + +```dart +// controller +final String title = 'User Info:'.obs +final list = List().obs; + +// view +Text(controller.title.value), // 字符串后面需要有.value。 +ListView.builder ( + itemCount: controller.list.length // List不需要它 +) +``` + +当你在使自己的类可观察时,有另外一种方式来更新它们: + +```dart +// model +// 我们将使整个类成为可观察的,而不是每个属性。 +class User{ + User({this.name = '', this.age = 0}); + String name; + int age; +} + +// controller +final user = User().obs; +//当你需要更新user变量时。 +user.update( (user) { // 这个参数是你要更新的类本身。 + user.name = 'Jonny'; + user.age = 18; +}); +// 更新user变量的另一种方式。 +user(User(name: 'João', age: 35)); + +// view +Obx(()=> Text("Name ${user.value.name}: Age: ${user.value.age}")); +// 你也可以不使用.value来访问模型值。 +user().name; // 注意是user变量,而不是类变量(首字母是小写的)。 +``` + +你可以使用 "assign "和" assignAll "。 +"assign "会清除你的List,并添加一个单个对象。 +"assignAll "将清除现有的List,并添加任何可迭代对象。 + +### 为什么使用.value + +我们可以通过一个简单的装饰和代码生成器来消除使用"String "和 "int "的值的义务,但这个库的目的正是为了避免外部依赖。我们希望提供一个准备好的编程的环境(路由、依赖和状态的管理),以一种简单、轻量级和高性能的方式,而不需要一个外部包。 + +你可以在你的pubspec中添加3个字母(get)和一个冒号,然后开始编程。从路由管理到状态管理,所有的解决方案都是默认的,目的是为了方便、高效和高性能。 + +这个库的总大小还不如一个状态管理器,尽管它是一个完整的解决方案。 + +如果你被`.value`困扰,喜欢代码生成器,MobX是一个很好的选择,也可以和Get一起使用。对于那些想在pubspec中添加一个单一的依赖,然后开始编程,而不用担心一个包的版本与另一个包不兼容,也不用担心状态更新的错误来自于状态管理器或依赖,还是不想担心控制器的可用性,get都是刚刚好。 + +如果你对MobX代码生成器或者BLoC模板熟悉,你可以直接用Get来做路由,而忘记它有状态管理器。如果有一个项目有90多个控制器,MobX代码生成器在标准机器上进行Flutter Clean后,需要30多分钟才能完成任务。如果你的项目有5个、10个、15个控制器,任何一个状态管理器都能很好的满足你。如果你的项目大得离谱,代码生成器对你来说是个问题,但你已经获得了Get这个解决方案。 + +显然,如果有人想为项目做贡献,创建一个代码生成器,或者类似的东西,我将在这个readme中链接,作为一个替代方案,我的需求并不是所有开发者的需求,但现在我要说的是,已经有很好的解决方案,比如MobX。 + +### Obx() + +在Get中使用Bindings的类型是不必要的。你可以使用Obx widget代替GetX,GetX只接收创建widget的匿名函数。 +如果你不使用类型,你将需要有一个控制器的实例来使用变量,或者使用`Get.find()`.value或Controller.to.value来检索值。 + +### Workers + +Workers将协助你在事件发生时触发特定的回调。 + +```dart +///每次`count1`变化时调用。 +ever(count1, (_) => print("$_ has been changed")); + +///只有在变量$_第一次被改变时才会被调用。 +once(count1, (_) => print("$_ was changed once")); + +///防DDos - 每当用户停止输入1秒时调用,例如。 +debounce(count1, (_) => print("debouce$_"), time: Duration(seconds: 1)); + +///忽略1秒内的所有变化。 +interval(count1, (_) => print("interval $_"), time: Duration(seconds: 1)); +``` +所有Workers(除 "debounce "外)都有一个名为 "condition"的参数,它可以是一个 "bool "或一个返回 "bool "的回调。 +这个`condition`定义了`callback`函数何时执行。 + +所有worker都会返回一个`Worker`实例,你可以用它来取消(通过`dispose()`)worker。 + +- **`ever`** + 每当_Rx_变量发出一个新的值时,就会被调用。 + +- **`everAll`** + 和 "ever "很像,但它需要一个_Rx_值的 "List",每次它的变量被改变时都会被调用。就是这样。 + + +- **`once`** +'once'只在变量第一次被改变时被调用。 + +- **`debounce`** +debounce'在搜索函数中非常有用,你只希望API在用户完成输入时被调用。如果用户输入 "Jonny",你将在API中进行5次搜索,分别是字母J、o、n、n和y。使用Get不会发生这种情况,因为你将有一个 "debounce "Worker,它只会在输入结束时触发。 + +- **`interval`** +'interval'与debouce不同,debouce如果用户在1秒内对一个变量进行了1000次修改,他将在规定的计时器(默认为800毫秒)后只发送最后一次修改。Interval则会忽略规定时间内的所有用户操作。如果你发送事件1分钟,每秒1000个,那么当用户停止DDOS事件时,debounce将只发送最后一个事件。建议这样做是为了避免滥用,在用户可以快速点击某样东西并获得一些好处的功能中(想象一下,用户点击某样东西可以赚取硬币,如果他在同一分钟内点击300次,他就会有300个硬币,使用间隔,你可以设置时间范围为3秒,无论是点击300次或100万次,1分钟内他最多获得20个硬币)。debounce适用于防DDOS,适用于搜索等功能,每次改变onChange都会调用你的api进行查询。Debounce会等待用户停止输入名称,进行请求。如果在上面提到的投币场景中使用它,用户只会赢得1个硬币,因为只有当用户 "暂停 "到既定时间时,它才会被执行。 + +- 注意:Worker应该总是在启动Controller或Class时使用,所以应该总是在onInit(推荐)、Class构造函数或StatefulWidget的initState(大多数情况下不推荐这种做法,但应该不会有任何副作用)。 + +## 简单状态管理器 + +Get有一个极其轻巧简单的状态管理器,它不使用ChangeNotifier,可以满足特别是对Flutter新手的需求,而且不会给大型应用带来问题。 + +GetBuilder正是针对多状态控制的。想象一下,你在购物车中添加了30个产品,你点击删除一个,同时List更新了,价格更新了,购物车中的徽章也更新为更小的数字。这种类型的方法使GetBuilder成为杀手锏,因为它将状态分组并一次性改变,而无需为此进行任何 "计算逻辑"。GetBuilder就是考虑到这种情况而创建的,因为对于短暂的状态变化,你可以使用setState,而不需要状态管理器。 + +这样一来,如果你想要一个单独的控制器,你可以为其分配ID,或者使用GetX。这取决于你,记住你有越多的 "单独 "部件,GetX的性能就越突出,而当有多个状态变化时,GetBuilder的性能应该更优越。 + +### 优点 + +1. 只更新需要的小部件。 + +2. 不使用changeNotifier,状态管理器使用较少的内存(接近0mb)。 + +3. 忘掉StatefulWidget! 使用Get你永远不会需要它。对于其他的状态管理器,你可能需要使用StatefulWidget来获取你的Provider、BLoC、MobX控制器等的实例。但是你有没有停下来想一想,你的appBar,你的脚手架,以及你的类中的大部分widget都是无状态的?那么如果你只能保存有状态的Widget的状态,为什么要保存整个类的状态呢?Get也解决了这个问题。创建一个无状态类,让一切都成为无状态。如果你需要更新单个组件,就用GetBuilder把它包起来,它的状态就会被维护。 + +4. 真正的解耦你的项目! 控制器一定不要在你的UI中,把你的TextEditController,或者你使用的任何控制器放在你的Controller类中。 + +5. 你是否需要触发一个事件来更新一个widget,一旦它被渲染?GetBuilder有一个属性 "initState",就像StatefulWidget一样,你可以从你的控制器中调用事件,直接从控制器中调用,不需要再在你的initState中放置事件。 + +6. 你是否需要触发一个动作,比如关闭流、定时器等?GetBuilder也有dispose属性,只要该widget被销毁,你就可以调用事件。 + +7. 仅在必要时使用流。你可以在你的控制器里面正常使用你的StreamControllers,也可以正常使用StreamBuilder,但是请记住,一个流消耗合理的内存,响应式编程很美,但是你不应该滥用它。30个流同时打开会比changeNotifier更糟糕(而且changeNotifier非常糟糕)。 + +8. 更新widgets而不需要为此花费ram。Get只存储GetBuilder的创建者ID,必要时更新该GetBuilder。get ID存储在内存中的消耗非常低,即使是成千上万的GetBuilders。当你创建一个新的GetBuilder时,你实际上是在共享拥有创建者ID的GetBuilder的状态。不会为每个GetBuilder创建一个新的状态,这为大型应用节省了大量的内存。基本上你的应用程序将是完全无状态的,而少数有状态的Widgets(在GetBuilder内)将有一个单一的状态,因此更新一个状态将更新所有的状态。状态只是一个。 + +9. Get是全知全能的,在大多数情况下,它很清楚地知道从内存中取出一个控制器的时机,你不需要担心什么时候移除一个控制器,Get知道最佳的时机。 + +### 用法 + +```dart +// 创建控制器类并扩展GetxController。 +class Controller extends GetxController { + int counter = 0; + void increment() { + counter++; + update(); // 当调用增量时,使用update()来更新用户界面上的计数器变量。 + } +} +// 在你的Stateless/Stateful类中,当调用increment时,使用GetBuilder来更新Text。 +GetBuilder( + init: Controller(), // 首次启动 + builder: (_) => Text( + '${_.counter}', + ), +) +//只在第一次时初始化你的控制器。第二次使用ReBuilder时,不要再使用同一控制器。一旦将控制器标记为 "init "的部件部署完毕,你的控制器将自动从内存中移除。你不必担心这个问题,Get会自动做到这一点,只是要确保你不要两次启动同一个控制器。 +``` + +**完成!** + +- 你已经学会了如何使用Get管理状态。 + +- 注意:你可能想要一个更大的规模,而不是使用init属性。为此,你可以创建一个类并扩展Bindings类,并在其中添加将在该路由中创建的控制器。控制器不会在那个时候被创建,相反,这只是一个声明,这样你第一次使用Controller时,Get就会知道去哪里找。Get会保持懒加载,当不再需要Controller时,会自动移除它们。请看pub.dev的例子来了解它是如何工作的。 + +如果你导航了很多路由,并且需要之前使用的Controller中的数据,你只需要再用一次GetBuilder(没有init)。 + +```dart +class OtherClass extends StatelessWidget { + @override + Widget build(BuildContext context) { + return Scaffold( + body: Center( + child: GetBuilder( + builder: (s) => Text('${s.counter}'), + ), + ), + ); + } + +``` + +如果你需要在许多其他地方使用你的控制器,并且在GetBuilder之外,只需在你的控制器中创建一个get,就可以轻松地拥有它。(或者使用`Get.find()`) + +```dart +class Controller extends GetxController { + + /// 你不需要这个,我推荐使用它只是为了方便语法。 + /// 用静态方法:Controller.to.increment()。 + /// 没有静态方法的情况下:Get.find().increment(); + /// 使用这两种语法在性能上没有区别,也没有任何副作用。一个不需要类型,另一个IDE会自动完成。 + static Controller get to => Get.find(); // 添加这一行 + + int counter = 0; + void increment() { + counter++; + update(); + } +} +``` + +然后你可以直接访问你的控制器,这样: + +```dart +FloatingActionButton( + onPressed: () { + Controller.to.increment(), + } // 是不是贼简单! + child: Text("${Controller.to.counter}"), +), +``` + +当你按下FloatingActionButton时,所有监听'counter'变量的widget都会自动更新。 + +### 如何处理controller + +比方说,我们有这样的情况。 + +`Class a => Class B (has controller X) => Class C (has controller X)` + +在A类中,控制器还没有进入内存,因为你还没有使用它(Get是懒加载)。在类B中,你使用了控制器,并且它进入了内存。在C类中,你使用了与B类相同的控制器,Get会将控制器B的状态与控制器C共享,同一个控制器还在内存中。如果你关闭C屏和B屏,Get会自动将控制器X从内存中移除,释放资源,因为a类没有使用该控制器。如果你再次导航到B,控制器X将再次进入内存,如果你没有去C类,而是再次回到a类,Get将以同样的方式将控制器从内存中移除。如果类C没有使用控制器,你把类B从内存中移除,就没有类在使用控制器X,同样也会被处理掉。唯一能让Get乱了阵脚的例外情况,是如果你意外地从路由中删除了B,并试图使用C中的控制器,在这种情况下,B中的控制器的创建者ID被删除了,Get被设计为从内存中删除每一个没有创建者ID的控制器。如果你打算这样做,在B类的GetBuilder中添加 "autoRemove: false "标志,并在C类的GetBuilder中使用adopID = true; + +### 无需StatefulWidgets + +使用StatefulWidgets意味着不必要地存储整个界面的状态,甚至因为如果你需要最小化地重建一个widget,你会把它嵌入一个Consumer/Observer/BlocProvider/GetBuilder/GetX/Obx中,这将是另一个StatefulWidget。 +StatefulWidget类是一个比StatelessWidget大的类,它将分配更多的RAM,只使用一两个类之间可能不会有明显的区别,但当你有100个类时,它肯定会有区别! +除非你需要使用混合器,比如TickerProviderStateMixin,否则完全没有必要使用StatefulWidget与Get。 + +你可以直接从GetBuilder中调用StatefulWidget的所有方法。 +例如,如果你需要调用initState()或dispose()方法,你可以直接调用它们。 + +```dart +GetBuilder( + initState: (_) => Controller.to.fetchApi(), + dispose: (_) => Controller.to.closeStreams(), + builder: (s) => Text('${s.username}'), +), +``` + +比这更好的方法是直接从控制器中使用onInit()和onClose()方法。 + +```dart +@override +void onInit() { + fetchApi(); + super.onInit(); +} +``` + +- 注意:如果你想在控制器第一次被调用的那一刻启动一个方法,你不需要为此使用构造函数,使用像Get这样面向性能的包,这样做反而是糟糕的做法,因为它偏离了控制器被创建或分配的逻辑(如果你创建了这个控制器的实例,构造函数会立即被调用,你会在控制器还没有被使用之前就填充了一个控制器,你在没有被使用的情况下就分配了内存,这绝对违背这个库的原则)。onInit();和onClose();方法就是为此而创建的,它们会在Controller被创建,或者第一次使用时被调用,这取决于你是否使用Get.lazyPut。例如,如果你想调用你的API来填充数据,你可以忘掉老式的initState/dispose方法,只需在onInit中开始调用api,如果你需要执行任何命令,如关闭流,使用onClose()来实现。 + +### 为什么它存在 + +这个包的目的正是为了给你提供一个完整的解决方案,用于导航路线,管理依赖和状态,使用尽可能少的依赖,高度解耦。Get将所有高低级别的Flutter API都纳入自身,以确保你在工作中尽可能减少耦合。我们将所有的东西集中在一个包中,以确保你在你的项目中没有任何形式的耦合。这样一来,你就可以只在视图中放置小组件,而让你的团队中负责业务逻辑的那部分人自由地工作,不需要依赖视图中的任何元素来处理业务逻辑。这样就提供了一个更加干净的工作环境,这样你的团队中的一部分人只用widget工作,而不用担心将数据发送到你的controller,你的团队中的一部分人只用业务逻辑工作,而不依赖于视图的任何元素。 + +所以为了简化这个问题。 +你不需要在initState中调用方法,然后通过参数发送给你的控制器,也不需要使用你的控制器构造函数,你有onInit()方法,在合适的时间被调用,以启动你的服务。 +你不需要调用设备,你有onClose()方法,它将在确切的时刻被调用,当你的控制器不再需要时,将从内存中删除。这样一来,只给widget留下视图,不要从中进行任何形式的业务逻辑。 + +不要在GetxController里面调用dispose方法,它不会有任何作用,记住控制器不是Widget,你不应该 "dispose "它,它会被Get自动智能地从内存中删除。如果你在上面使用了任何流,想关闭它,只要把它插入到close方法中就可以了。例如 + +```dart +class Controller extends GetxController { + StreamController user = StreamController(); + StreamController name = StreamController(); + + ///关闭流用onClose方法,而不是dispose + @override + void onClose() { + user.close(); + name.close(); + super.onClose(); + } +} +``` + +控制器的生命周期。 + +- onInit()是创建控制器的地方。 +- onClose(),关闭控制器,为删除方法做准备。 +- deleted: 你不能访问这个API,因为它实际上是将控制器从内存中删除。它真的被删除了,不留任何痕迹。 + +### 其他使用方法 + +你可以直接在GetBuilder值上使用Controller实例。 + +```dart +GetBuilder( + init: Controller(), + builder: (value) => Text( + '${value.counter}', //here + ), +), +``` + +你可能还需要在GetBuilder之外的控制器实例,你可以使用这些方法来实现。 + +```dart +class Controller extends GetxController { + static Controller get to => Get.find(); +[...] +} +//view +GetBuilder( + init: Controller(), // 每个控制器只用一次 + builder: (_) => Text( + '${Controller.to.counter}', //here + ) +), +``` + +或者 + +```dart +class Controller extends GetxController { + // static Controller get to => Get.find(); // with no static get +[...] +} +// on stateful/stateless class +GetBuilder( + init: Controller(), // 每个控制器只用一次 + builder: (_) => Text( + '${Get.find().counter}', //here + ), +), +``` + +- 你可以使用 "非规范 "的方法来做这件事。如果你正在使用一些其他的依赖管理器,比如get_it、modular等,并且只想交付控制器实例,你可以这样做。 + +```dart +Controller controller = Controller(); +[...] +GetBuilder( + init: controller, //here + builder: (_) => Text( + '${controller.counter}', // here + ), +), + +``` + +### 唯一的ID + +如果你想用GetBuilder完善一个widget的更新控件,你可以给它们分配唯一的ID。 + +```dart +GetBuilder( + id: 'text', //这里 + init: Controller(), // 每个控制器只用一次 + builder: (_) => Text( + '${Get.find().counter}', //here + ), +), +``` + +并更新它: + +```dart +update(['text']); +``` + +您还可以为更新设置条件。 + +```dart +update(['text'], counter < 10); +``` + +GetX会自动进行重建,并且只重建使用被更改的变量的小组件,如果您将一个变量更改为与之前相同的变量,并且不意味着状态的更改,GetX不会重建小组件以节省内存和CPU周期(界面上正在显示3,而您再次将变量更改为3。在大多数状态管理器中,这将导致一个新的重建,但在GetX中,如果事实上他的状态已经改变,那么widget将只被再次重建) + +## 与其他状态管理器混用 + +有人开了一个功能请求,因为他们只想使用一种类型的响应式变量,而其他的则手动去更新,需要为此在GetBuilder中插入一个Obx。思来想去,MixinBuilder应运而生。它既可以通过改变".obs "变量进行响应式改变,也可以通过update()进行手动更新。然而,在4个widget中,他是消耗资源最多的一个,因为除了有一个Subscription来接收来自他的子代的变化事件外,他还订阅了他的控制器的update方法。 + +扩展GetxController是很重要的,因为它们有生命周期,可以在它们的onInit()和onClose()方法中 "开始 "和 "结束 "事件。你可以使用任何类来实现这一点,但我强烈建议你使用GetxController类来放置你的变量,无论它们是否是可观察的。 + + +## GetBuilder vs GetX vs Obx vs MixinBuilder + +在十年的编程工作中,我能够学到一些宝贵的经验。 + +我第一次接触到响应式编程的时候,是那么的 "哇,这太不可思议了",事实上响应式编程是不可思议的。 +但是,它并不适合所有情况。通常情况下,你需要的是同时改变2、3个widget的状态,或者是短暂的状态变化,这种情况下,响应式编程不是不好,而是不适合。 + +响应式编程对RAM的消耗比较大,可以通过单独的工作流来弥补,这样可以保证只有一个widget被重建,而且是在必要的时候,但是创建一个有80个对象的List,每个对象都有几个流,这不是一个好的想法。打开dart inspect,查看一个StreamBuilder的消耗量,你就会明白我想告诉你什么。 + +考虑到这一点,我创建了简单的状态管理器。它很简单,这正是你应该对它提出的要求:以一种简单的方式,并且以最高效的方式更新块中的状态。 + +GetBuilder在RAM中是非常高效的,几乎没有比他更高效的方法(至少我无法想象,如果存在,请告诉我们)。 + +然而,GetBuilder仍然是一个手动的状态管理器,你需要调用update(),就像你需要调用Provider的notifyListeners()一样。 + +还有一些情况下,响应式编程真的很有趣,不使用它就等于重新发明轮子。考虑到这一点,GetX的创建是为了提供状态管理器中最现代和先进的一切。它只在必要的时候更新必要的东西,如果你出现了错误,同时发送了300个状态变化,GetX只在状态真正发生变化时才会过滤并更新界面。 + +GetX比其他响应式状态管理器还是比较高效的,但它比GetBuilder多消耗一点内存。思前想后,以最大限度地消耗资源为目标,Obx应运而生。与GetX和GetBuilder不同的是,你将无法在Obx内部初始化一个控制器,它只是一个带有StreamSubscription的Widget,接收来自你的子代的变化事件,仅此而已。它比GetX更高效,但输给了GetBuilder,这是意料之中的,因为它是响应式的,而且GetBuilder有最简单的方法,即存储widget的hashcode和它的StateSetter。使用Obx,你不需要写你的控制器类型,你可以从多个不同的控制器中监听到变化,但它需要在之前进行初始化,或者使用本readme开头的示例方法,或者使用Bindings类。 diff --git a/siro_rider/packages/get/example/README.md b/siro_rider/packages/get/example/README.md new file mode 100644 index 0000000..8843647 --- /dev/null +++ b/siro_rider/packages/get/example/README.md @@ -0,0 +1,16 @@ +# example + +A new Flutter project. + +## Getting Started + +This project is a starting point for a Flutter application. + +A few resources to get you started if this is your first Flutter project: + +- [Lab: Write your first Flutter app](https://flutter.dev/documentation/get-started/codelab) +- [Cookbook: Useful Flutter samples](https://flutter.dev/documentation/cookbook) + +For help getting started with Flutter, view our +[online documentation](https://flutter.dev/docs), which offers tutorials, +samples, guidance on mobile development, and a full API reference. diff --git a/siro_rider/packages/get/example/android/.gradle/6.7/fileChanges/last-build.bin b/siro_rider/packages/get/example/android/.gradle/6.7/fileChanges/last-build.bin new file mode 100644 index 0000000..f76dd23 Binary files /dev/null and b/siro_rider/packages/get/example/android/.gradle/6.7/fileChanges/last-build.bin differ diff --git a/siro_rider/packages/get/example/android/.gradle/6.7/fileHashes/fileHashes.lock b/siro_rider/packages/get/example/android/.gradle/6.7/fileHashes/fileHashes.lock new file mode 100644 index 0000000..3fef8ba Binary files /dev/null and b/siro_rider/packages/get/example/android/.gradle/6.7/fileHashes/fileHashes.lock differ diff --git a/siro_rider/packages/get/example/android/.gradle/6.7/gc.properties b/siro_rider/packages/get/example/android/.gradle/6.7/gc.properties new file mode 100644 index 0000000..e69de29 diff --git a/siro_rider/packages/get/example/android/.gradle/checksums/checksums.lock b/siro_rider/packages/get/example/android/.gradle/checksums/checksums.lock new file mode 100644 index 0000000..6bb06b0 Binary files /dev/null and b/siro_rider/packages/get/example/android/.gradle/checksums/checksums.lock differ diff --git a/siro_rider/packages/get/example/android/.gradle/configuration-cache/gc.properties b/siro_rider/packages/get/example/android/.gradle/configuration-cache/gc.properties new file mode 100644 index 0000000..e69de29 diff --git a/siro_rider/packages/get/example/android/.gradle/vcs-1/gc.properties b/siro_rider/packages/get/example/android/.gradle/vcs-1/gc.properties new file mode 100644 index 0000000..e69de29 diff --git a/siro_rider/packages/get/example/android/app/build.gradle b/siro_rider/packages/get/example/android/app/build.gradle new file mode 100644 index 0000000..6ca2344 --- /dev/null +++ b/siro_rider/packages/get/example/android/app/build.gradle @@ -0,0 +1,59 @@ +def localProperties = new Properties() +def localPropertiesFile = rootProject.file('local.properties') +if (localPropertiesFile.exists()) { + localPropertiesFile.withReader('UTF-8') { reader -> + localProperties.load(reader) + } +} + +def flutterRoot = localProperties.getProperty('flutter.sdk') +if (flutterRoot == null) { + throw new GradleException("Flutter SDK not found. Define location with flutter.sdk in the local.properties file.") +} + +def flutterVersionCode = localProperties.getProperty('flutter.versionCode') +if (flutterVersionCode == null) { + flutterVersionCode = '1' +} + +def flutterVersionName = localProperties.getProperty('flutter.versionName') +if (flutterVersionName == null) { + flutterVersionName = '1.0' +} + +apply plugin: 'com.android.application' +apply plugin: 'kotlin-android' +apply from: "$flutterRoot/packages/flutter_tools/gradle/flutter.gradle" + +android { + compileSdkVersion 30 + + sourceSets { + main.java.srcDirs += 'src/main/kotlin' + } + + defaultConfig { + // TODO: Specify your own unique Application ID (https://developer.android.com/studio/build/application-id.html). + applicationId "com.example.example" + minSdkVersion 16 + targetSdkVersion 30 + versionCode flutterVersionCode.toInteger() + versionName flutterVersionName + } + + buildTypes { + release { + // TODO: Add your own signing config for the release build. + // Signing with the debug keys for now, so `flutter run --release` works. + signingConfig signingConfigs.debug + } + } +} + +flutter { + source '../..' +} + +dependencies { + implementation "org.jetbrains.kotlin:kotlin-stdlib-jdk7:$kotlin_version" +} diff --git a/siro_rider/packages/get/example/android/app/src/debug/AndroidManifest.xml b/siro_rider/packages/get/example/android/app/src/debug/AndroidManifest.xml new file mode 100644 index 0000000..c208884 --- /dev/null +++ b/siro_rider/packages/get/example/android/app/src/debug/AndroidManifest.xml @@ -0,0 +1,7 @@ + + + + diff --git a/siro_rider/packages/get/example/android/app/src/main/AndroidManifest.xml b/siro_rider/packages/get/example/android/app/src/main/AndroidManifest.xml new file mode 100644 index 0000000..34dd77e --- /dev/null +++ b/siro_rider/packages/get/example/android/app/src/main/AndroidManifest.xml @@ -0,0 +1,41 @@ + + + + + + + + + + + + + + + + diff --git a/siro_rider/packages/get/example/android/app/src/main/java/io/flutter/plugins/GeneratedPluginRegistrant.java b/siro_rider/packages/get/example/android/app/src/main/java/io/flutter/plugins/GeneratedPluginRegistrant.java new file mode 100644 index 0000000..539ab02 --- /dev/null +++ b/siro_rider/packages/get/example/android/app/src/main/java/io/flutter/plugins/GeneratedPluginRegistrant.java @@ -0,0 +1,19 @@ +package io.flutter.plugins; + +import androidx.annotation.Keep; +import androidx.annotation.NonNull; +import io.flutter.Log; + +import io.flutter.embedding.engine.FlutterEngine; + +/** + * Generated file. Do not edit. + * This file is generated by the Flutter tool based on the + * plugins that support the Android platform. + */ +@Keep +public final class GeneratedPluginRegistrant { + private static final String TAG = "GeneratedPluginRegistrant"; + public static void registerWith(@NonNull FlutterEngine flutterEngine) { + } +} diff --git a/siro_rider/packages/get/example/android/app/src/main/kotlin/com/example/example/MainActivity.kt b/siro_rider/packages/get/example/android/app/src/main/kotlin/com/example/example/MainActivity.kt new file mode 100644 index 0000000..e793a00 --- /dev/null +++ b/siro_rider/packages/get/example/android/app/src/main/kotlin/com/example/example/MainActivity.kt @@ -0,0 +1,6 @@ +package com.example.example + +import io.flutter.embedding.android.FlutterActivity + +class MainActivity: FlutterActivity() { +} diff --git a/siro_rider/packages/get/example/android/app/src/main/res/drawable-v21/launch_background.xml b/siro_rider/packages/get/example/android/app/src/main/res/drawable-v21/launch_background.xml new file mode 100644 index 0000000..f74085f --- /dev/null +++ b/siro_rider/packages/get/example/android/app/src/main/res/drawable-v21/launch_background.xml @@ -0,0 +1,12 @@ + + + + + + + + diff --git a/siro_rider/packages/get/example/android/app/src/main/res/drawable/launch_background.xml b/siro_rider/packages/get/example/android/app/src/main/res/drawable/launch_background.xml new file mode 100644 index 0000000..304732f --- /dev/null +++ b/siro_rider/packages/get/example/android/app/src/main/res/drawable/launch_background.xml @@ -0,0 +1,12 @@ + + + + + + + + diff --git a/siro_rider/packages/get/example/android/app/src/main/res/mipmap-hdpi/ic_launcher.png b/siro_rider/packages/get/example/android/app/src/main/res/mipmap-hdpi/ic_launcher.png new file mode 100644 index 0000000..db77bb4 Binary files /dev/null and b/siro_rider/packages/get/example/android/app/src/main/res/mipmap-hdpi/ic_launcher.png differ diff --git a/siro_rider/packages/get/example/android/app/src/main/res/mipmap-mdpi/ic_launcher.png b/siro_rider/packages/get/example/android/app/src/main/res/mipmap-mdpi/ic_launcher.png new file mode 100644 index 0000000..17987b7 Binary files /dev/null and b/siro_rider/packages/get/example/android/app/src/main/res/mipmap-mdpi/ic_launcher.png differ diff --git a/siro_rider/packages/get/example/android/app/src/main/res/mipmap-xhdpi/ic_launcher.png b/siro_rider/packages/get/example/android/app/src/main/res/mipmap-xhdpi/ic_launcher.png new file mode 100644 index 0000000..09d4391 Binary files /dev/null and b/siro_rider/packages/get/example/android/app/src/main/res/mipmap-xhdpi/ic_launcher.png differ diff --git a/siro_rider/packages/get/example/android/app/src/main/res/mipmap-xxhdpi/ic_launcher.png b/siro_rider/packages/get/example/android/app/src/main/res/mipmap-xxhdpi/ic_launcher.png new file mode 100644 index 0000000..d5f1c8d Binary files /dev/null and b/siro_rider/packages/get/example/android/app/src/main/res/mipmap-xxhdpi/ic_launcher.png differ diff --git a/siro_rider/packages/get/example/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png b/siro_rider/packages/get/example/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png new file mode 100644 index 0000000..4d6372e Binary files /dev/null and b/siro_rider/packages/get/example/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png differ diff --git a/siro_rider/packages/get/example/android/app/src/main/res/values-night/styles.xml b/siro_rider/packages/get/example/android/app/src/main/res/values-night/styles.xml new file mode 100644 index 0000000..449a9f9 --- /dev/null +++ b/siro_rider/packages/get/example/android/app/src/main/res/values-night/styles.xml @@ -0,0 +1,18 @@ + + + + + + + diff --git a/siro_rider/packages/get/example/android/app/src/main/res/values/styles.xml b/siro_rider/packages/get/example/android/app/src/main/res/values/styles.xml new file mode 100644 index 0000000..d74aa35 --- /dev/null +++ b/siro_rider/packages/get/example/android/app/src/main/res/values/styles.xml @@ -0,0 +1,18 @@ + + + + + + + diff --git a/siro_rider/packages/get/example/android/app/src/profile/AndroidManifest.xml b/siro_rider/packages/get/example/android/app/src/profile/AndroidManifest.xml new file mode 100644 index 0000000..c208884 --- /dev/null +++ b/siro_rider/packages/get/example/android/app/src/profile/AndroidManifest.xml @@ -0,0 +1,7 @@ + + + + diff --git a/siro_rider/packages/get/example/android/build.gradle b/siro_rider/packages/get/example/android/build.gradle new file mode 100644 index 0000000..9b6ed06 --- /dev/null +++ b/siro_rider/packages/get/example/android/build.gradle @@ -0,0 +1,29 @@ +buildscript { + ext.kotlin_version = '1.3.50' + repositories { + google() + jcenter() + } + + dependencies { + classpath 'com.android.tools.build:gradle:4.1.0' + classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version" + } +} + +allprojects { + repositories { + google() + jcenter() + } +} + +rootProject.buildDir = '../build' +subprojects { + project.buildDir = "${rootProject.buildDir}/${project.name}" + project.evaluationDependsOn(':app') +} + +task clean(type: Delete) { + delete rootProject.buildDir +} diff --git a/siro_rider/packages/get/example/android/gradle.properties b/siro_rider/packages/get/example/android/gradle.properties new file mode 100644 index 0000000..94adc3a --- /dev/null +++ b/siro_rider/packages/get/example/android/gradle.properties @@ -0,0 +1,3 @@ +org.gradle.jvmargs=-Xmx1536M +android.useAndroidX=true +android.enableJetifier=true diff --git a/siro_rider/packages/get/example/android/gradle/wrapper/gradle-wrapper.properties b/siro_rider/packages/get/example/android/gradle/wrapper/gradle-wrapper.properties new file mode 100644 index 0000000..bc6a58a --- /dev/null +++ b/siro_rider/packages/get/example/android/gradle/wrapper/gradle-wrapper.properties @@ -0,0 +1,6 @@ +#Fri Jun 23 08:50:38 CEST 2017 +distributionBase=GRADLE_USER_HOME +distributionPath=wrapper/dists +zipStoreBase=GRADLE_USER_HOME +zipStorePath=wrapper/dists +distributionUrl=https\://services.gradle.org/distributions/gradle-6.7-all.zip diff --git a/siro_rider/packages/get/example/android/gradlew b/siro_rider/packages/get/example/android/gradlew new file mode 100755 index 0000000..9d82f78 --- /dev/null +++ b/siro_rider/packages/get/example/android/gradlew @@ -0,0 +1,160 @@ +#!/usr/bin/env bash + +############################################################################## +## +## Gradle start up script for UN*X +## +############################################################################## + +# Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. +DEFAULT_JVM_OPTS="" + +APP_NAME="Gradle" +APP_BASE_NAME=`basename "$0"` + +# Use the maximum available, or set MAX_FD != -1 to use that value. +MAX_FD="maximum" + +warn ( ) { + echo "$*" +} + +die ( ) { + echo + echo "$*" + echo + exit 1 +} + +# OS specific support (must be 'true' or 'false'). +cygwin=false +msys=false +darwin=false +case "`uname`" in + CYGWIN* ) + cygwin=true + ;; + Darwin* ) + darwin=true + ;; + MINGW* ) + msys=true + ;; +esac + +# Attempt to set APP_HOME +# Resolve links: $0 may be a link +PRG="$0" +# Need this for relative symlinks. +while [ -h "$PRG" ] ; do + ls=`ls -ld "$PRG"` + link=`expr "$ls" : '.*-> \(.*\)$'` + if expr "$link" : '/.*' > /dev/null; then + PRG="$link" + else + PRG=`dirname "$PRG"`"/$link" + fi +done +SAVED="`pwd`" +cd "`dirname \"$PRG\"`/" >/dev/null +APP_HOME="`pwd -P`" +cd "$SAVED" >/dev/null + +CLASSPATH=$APP_HOME/gradle/wrapper/gradle-wrapper.jar + +# Determine the Java command to use to start the JVM. +if [ -n "$JAVA_HOME" ] ; then + if [ -x "$JAVA_HOME/jre/sh/java" ] ; then + # IBM's JDK on AIX uses strange locations for the executables + JAVACMD="$JAVA_HOME/jre/sh/java" + else + JAVACMD="$JAVA_HOME/bin/java" + fi + if [ ! -x "$JAVACMD" ] ; then + die "ERROR: JAVA_HOME is set to an invalid directory: $JAVA_HOME + +Please set the JAVA_HOME variable in your environment to match the +location of your Java installation." + fi +else + JAVACMD="java" + which java >/dev/null 2>&1 || die "ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. + +Please set the JAVA_HOME variable in your environment to match the +location of your Java installation." +fi + +# Increase the maximum file descriptors if we can. +if [ "$cygwin" = "false" -a "$darwin" = "false" ] ; then + MAX_FD_LIMIT=`ulimit -H -n` + if [ $? -eq 0 ] ; then + if [ "$MAX_FD" = "maximum" -o "$MAX_FD" = "max" ] ; then + MAX_FD="$MAX_FD_LIMIT" + fi + ulimit -n $MAX_FD + if [ $? -ne 0 ] ; then + warn "Could not set maximum file descriptor limit: $MAX_FD" + fi + else + warn "Could not query maximum file descriptor limit: $MAX_FD_LIMIT" + fi +fi + +# For Darwin, add options to specify how the application appears in the dock +if $darwin; then + GRADLE_OPTS="$GRADLE_OPTS \"-Xdock:name=$APP_NAME\" \"-Xdock:icon=$APP_HOME/media/gradle.icns\"" +fi + +# For Cygwin, switch paths to Windows format before running java +if $cygwin ; then + APP_HOME=`cygpath --path --mixed "$APP_HOME"` + CLASSPATH=`cygpath --path --mixed "$CLASSPATH"` + JAVACMD=`cygpath --unix "$JAVACMD"` + + # We build the pattern for arguments to be converted via cygpath + ROOTDIRSRAW=`find -L / -maxdepth 1 -mindepth 1 -type d 2>/dev/null` + SEP="" + for dir in $ROOTDIRSRAW ; do + ROOTDIRS="$ROOTDIRS$SEP$dir" + SEP="|" + done + OURCYGPATTERN="(^($ROOTDIRS))" + # Add a user-defined pattern to the cygpath arguments + if [ "$GRADLE_CYGPATTERN" != "" ] ; then + OURCYGPATTERN="$OURCYGPATTERN|($GRADLE_CYGPATTERN)" + fi + # Now convert the arguments - kludge to limit ourselves to /bin/sh + i=0 + for arg in "$@" ; do + CHECK=`echo "$arg"|egrep -c "$OURCYGPATTERN" -` + CHECK2=`echo "$arg"|egrep -c "^-"` ### Determine if an option + + if [ $CHECK -ne 0 ] && [ $CHECK2 -eq 0 ] ; then ### Added a condition + eval `echo args$i`=`cygpath --path --ignore --mixed "$arg"` + else + eval `echo args$i`="\"$arg\"" + fi + i=$((i+1)) + done + case $i in + (0) set -- ;; + (1) set -- "$args0" ;; + (2) set -- "$args0" "$args1" ;; + (3) set -- "$args0" "$args1" "$args2" ;; + (4) set -- "$args0" "$args1" "$args2" "$args3" ;; + (5) set -- "$args0" "$args1" "$args2" "$args3" "$args4" ;; + (6) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" ;; + (7) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" ;; + (8) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" ;; + (9) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" "$args8" ;; + esac +fi + +# Split up the JVM_OPTS And GRADLE_OPTS values into an array, following the shell quoting and substitution rules +function splitJvmOpts() { + JVM_OPTS=("$@") +} +eval splitJvmOpts $DEFAULT_JVM_OPTS $JAVA_OPTS $GRADLE_OPTS +JVM_OPTS[${#JVM_OPTS[*]}]="-Dorg.gradle.appname=$APP_BASE_NAME" + +exec "$JAVACMD" "${JVM_OPTS[@]}" -classpath "$CLASSPATH" org.gradle.wrapper.GradleWrapperMain "$@" diff --git a/siro_rider/packages/get/example/android/gradlew.bat b/siro_rider/packages/get/example/android/gradlew.bat new file mode 100644 index 0000000..aec9973 --- /dev/null +++ b/siro_rider/packages/get/example/android/gradlew.bat @@ -0,0 +1,90 @@ +@if "%DEBUG%" == "" @echo off +@rem ########################################################################## +@rem +@rem Gradle startup script for Windows +@rem +@rem ########################################################################## + +@rem Set local scope for the variables with windows NT shell +if "%OS%"=="Windows_NT" setlocal + +@rem Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. +set DEFAULT_JVM_OPTS= + +set DIRNAME=%~dp0 +if "%DIRNAME%" == "" set DIRNAME=. +set APP_BASE_NAME=%~n0 +set APP_HOME=%DIRNAME% + +@rem Find java.exe +if defined JAVA_HOME goto findJavaFromJavaHome + +set JAVA_EXE=java.exe +%JAVA_EXE% -version >NUL 2>&1 +if "%ERRORLEVEL%" == "0" goto init + +echo. +echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. +echo. +echo Please set the JAVA_HOME variable in your environment to match the +echo location of your Java installation. + +goto fail + +:findJavaFromJavaHome +set JAVA_HOME=%JAVA_HOME:"=% +set JAVA_EXE=%JAVA_HOME%/bin/java.exe + +if exist "%JAVA_EXE%" goto init + +echo. +echo ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME% +echo. +echo Please set the JAVA_HOME variable in your environment to match the +echo location of your Java installation. + +goto fail + +:init +@rem Get command-line arguments, handling Windowz variants + +if not "%OS%" == "Windows_NT" goto win9xME_args +if "%@eval[2+2]" == "4" goto 4NT_args + +:win9xME_args +@rem Slurp the command line arguments. +set CMD_LINE_ARGS= +set _SKIP=2 + +:win9xME_args_slurp +if "x%~1" == "x" goto execute + +set CMD_LINE_ARGS=%* +goto execute + +:4NT_args +@rem Get arguments from the 4NT Shell from JP Software +set CMD_LINE_ARGS=%$ + +:execute +@rem Setup the command line + +set CLASSPATH=%APP_HOME%\gradle\wrapper\gradle-wrapper.jar + +@rem Execute Gradle +"%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -classpath "%CLASSPATH%" org.gradle.wrapper.GradleWrapperMain %CMD_LINE_ARGS% + +:end +@rem End local scope for the variables with windows NT shell +if "%ERRORLEVEL%"=="0" goto mainEnd + +:fail +rem Set variable GRADLE_EXIT_CONSOLE if you need the _script_ return code instead of +rem the _cmd.exe /c_ return code! +if not "" == "%GRADLE_EXIT_CONSOLE%" exit 1 +exit /b 1 + +:mainEnd +if "%OS%"=="Windows_NT" endlocal + +:omega diff --git a/siro_rider/packages/get/example/android/local.properties b/siro_rider/packages/get/example/android/local.properties new file mode 100644 index 0000000..6df17b3 --- /dev/null +++ b/siro_rider/packages/get/example/android/local.properties @@ -0,0 +1,2 @@ +sdk.dir=/Users/hamzaaleghwairyeen/Library/Android/sdk +flutter.sdk=/Users/hamzaaleghwairyeen/flutter \ No newline at end of file diff --git a/siro_rider/packages/get/example/android/settings.gradle b/siro_rider/packages/get/example/android/settings.gradle new file mode 100644 index 0000000..44e62bc --- /dev/null +++ b/siro_rider/packages/get/example/android/settings.gradle @@ -0,0 +1,11 @@ +include ':app' + +def localPropertiesFile = new File(rootProject.projectDir, "local.properties") +def properties = new Properties() + +assert localPropertiesFile.exists() +localPropertiesFile.withReader("UTF-8") { reader -> properties.load(reader) } + +def flutterSdkPath = properties.getProperty("flutter.sdk") +assert flutterSdkPath != null, "flutter.sdk not set in local.properties" +apply from: "$flutterSdkPath/packages/flutter_tools/gradle/app_plugin_loader.gradle" diff --git a/siro_rider/packages/get/example/example.md b/siro_rider/packages/get/example/example.md new file mode 100644 index 0000000..6234e9a --- /dev/null +++ b/siro_rider/packages/get/example/example.md @@ -0,0 +1,581 @@ +# GetX codelab + +In this example you will learn the basics of GetX. You will see how much easier it is to code with this framework, and you will know what problems GetX proposes to solve. + +If the default Flutter application were rewritten with Getx, it would have only a few lines of code. The Getx state manager is easier than using setState. You just need to add a ".obs" at the end of your variable, and wrap the widget you want to change within a Obx(). + +```dart +void main() => runApp(MaterialApp(home: Home())); + +class Home extends StatelessWidget { + var count = 0.obs; + @override + Widget build(context) => Scaffold( + appBar: AppBar(title: Text("counter")), + body: Center( + child: Obx(() => Text("$count")), + ), + floatingActionButton: FloatingActionButton( + child: Icon(Icons.add), + onPressed: () => count ++, + )); +} +``` +However, this simple example deals with ephemeral state management. If you need to access this data in several places in your application, you will need global state management. +The most common way to do this is to separate the business logic from its visualization. I know, you've heard this concept before, and it might have been scary for you, but with Getx, it's stupidly simple. +Getx provides you with a class capable of initializing data, and removing it when it is no longer needed, and its use is very simple: +Just create a class by extending GetxController and insert ALL your variables and functions there. + +```dart +class Controller extends GetxController { + var count = 0; + void increment() { + count++; + update(); + } +} +``` +Here you can choose between simple state management, or reactive state management. +The simple one will update its variable on the screen whenever update() is called. It is used with a widget called "GetBuilder". + +```dart +class Home extends StatelessWidget { + final controller = Get.put(Controller()); + @override + Widget build(BuildContext context) { + return Scaffold( + appBar: AppBar(title: Text("counter")), + body: Center( + child: Column( + mainAxisAlignment: MainAxisAlignment.center, + children: [ + GetBuilder( + builder: (_) => Text( + 'clicks: ${controller.count}', + )), + ElevatedButton( + child: Text('Next Route'), + onPressed: () { + Get.to(Second()); + }, + ), + ], + ), + ), + floatingActionButton: FloatingActionButton( + child: Icon(Icons.add), + onPressed: controller.increment(), + ), + ); + } +} +class Second extends StatelessWidget { + final Controller ctrl = Get.find(); + @override + Widget build(context){ + return Scaffold(body: Center(child: Text("${ctrl.count}"))); + } +} +``` +When instantiating your controller, you may have noticed that we use `Get.put(Controller())`. This is enough to make your controller available to other pages as long as it is in memory. +You may have noticed that you have a new button using `Get.to(Second())`. This is enough to navigate to another page. You don't need a + +```dart +Navigator.of(context).push(context, + MaterialPageRoute(context, builder: (context){ + return Second(); + }, +); +``` +all that huge code, it's reduced to a simple `Get.to(Second())`. Isn't that incredible? + +You may also have noticed that on the other page you simply used Get.find (), and the framework knows which controller you registered previously, and returns it effortlessly, you don't need to type the find with `Get.find()` so that he knows what you need. + +However, this is simple state management. You may want to control the output of each change of state, you may want to use and manipulate streams, you may want a variable to only be changed on the screen, when it definitely changes, you may need a debounce on changing the state, and to these and other needs, Getx has powerful, intelligent, and lightweight state management that can address any need, regardless of the size of your project. And its use is even easier than the previous one. + +In your controller, you can remove the update method, Getx is reactive, so when a variable changes, it will automatically change on the screen. +You just need to add a ".obs" in front of your variable, and that's it, it's already reactive. + +```dart +class Controller extends GetxController { + var count = 0.obs; + void increment() { + count++; + } +} +``` +Now you just need to change GetBuilder for GetX and that's it +```dart +class Home extends StatelessWidget { + final controller = Get.put(Controller()); + @override + Widget build(BuildContext context) { + return Scaffold( + appBar: AppBar(title: Text("counter")), + body: Center( + child: Column( + mainAxisAlignment: MainAxisAlignment.center, + children: [ + GetX( + builder: (_) => Text( + 'clicks: ${controller.count}', + )), + ElevatedButton( + child: Text('Next Route'), + onPressed: () { + Get.to(Second()); + }, + ), + ], + ), + ), + floatingActionButton: FloatingActionButton( + child: Icon(Icons.add), + onPressed: controller.increment(), + ), + ); + } +} +class Second extends StatelessWidget { + final Controller ctrl = Get.find(); + @override + Widget build(context){ + return Scaffold(body: Center(child: Text("${ctrl.count}"))); + } +} +``` + +GetX is a useful widget when you want to inject the controller into the init property, or when you want to retrieve an instance of the controller within the widget itself. In other cases, you can insert your widget into an Obx, which receives a widget function. This looks much easier and clearer, just like the first example + +```dart +class Home extends StatelessWidget { + final controller = Get.put(Controller()); + @override + Widget build(BuildContext context) { + return Scaffold( + appBar: AppBar(title: Text("counter")), + body: Center( + child: Column( + mainAxisAlignment: MainAxisAlignment.center, + children: [ + Obx(() => Text( + 'clicks: ${controller.count}', + )), + ElevatedButton( + child: Text('Next Route'), + onPressed: () { + Get.to(Second()); + }, + ), + ], + ), + ), + floatingActionButton: FloatingActionButton( + child: Icon(Icons.add), + onPressed: controller.increment(), + ), + ); + } +} +class Second extends StatelessWidget { + final Controller ctrl = Get.find(); + @override + Widget build(context){ + return Scaffold(body: Center(child: Text("${ctrl.count}"))); + } +} +``` +If you are a more demanding user, you must have said: BLoC separates the View from the business logic. But what about the presentation logic? Will I be obliged to attach it to the visualization? Will I be totally dependent on the context for everything I want to do? Will I have to insert a bunch of variables, TextEditingControllers in my view? If I need to hear the Scroll on my screen, do I need to insert an initState and a function into my view? If I need to trigger an action when this scroll reaches the end, do I insert it into the view, or in the bloc/changeNotifier class? Well, these are common architectural questions, and most of the time the solution to them is ugly. +With Getx you have no doubts when your architecture, if you need a function, it must be on your Controller, if you need to trigger an event, it needs to be on your controller, your view is generally a StatelessWidget free from any dirt. +This means that if someone has already done something you’re looking for, you can copy the controller entirely from someone else, and it will work for you, this level of standardization is what Flutter lacked, and it’s because of this that Getx has become so popular in the last few days. Flutter is amazing, and has minor one-off problems. Getx came to solve these specific problems. Flutter provides powerful APIs, and we turn them into an easy, clean, clear, and concise API for you to build applications in a fast, performance and highly scalable way. +If you have already asked yourself some of these questions above, you have certainly found the solution to your problems. Getx is able to completely separate any logic, be it presentation or business, and you will only have pure widgets in your visualization layer. No variables, no functions, just widgets. This will facilitate the work of your team working with the UI, as well as your team working with your logic. They won't depend on initState to do anything, their controller has onInit. Your code can be tested in isolation, the way it is. +But what about dependency injection? Will I have it attached to my visualization? +If you've used any state manager, you've probably heard of "multiAnything", or something like that. +You have probably already inserted dozens of ChangeNotifier or Blocs classes in a widget, just to have it all over the tree. +This level of coupling is yet another problem that Getx came to solve. For this, in this ecosystem we use BINDINGS. +Bindings are dependency injection classes. They are completely outside your widget tree, making your code cleaner, more organized, and allowing you to access it anywhere without context. +You can initialize dozens of controllers in your Bindings, when you need to know what is being injected into your view, just open the Bindings file on your page and that's it, you can clearly see what has been prepared to be initialized in your View. +Bindings is the first step towards having a scalable application, you can visualize what will be injected into your page, and decouple the dependency injection from your visualization layer. + +To create a Binding, simply create a class and implement Bindings + +```dart +class SampleBind extends Bindings { + @override + void dependencies() { + Get.lazyPut(() => Controller()); + Get.lazyPut(() => Controller2()); + Get.lazyPut(() => Controller3()); + } +} +``` +You can use with named routes (preferred) +```dart +void main() { + runApp(GetMaterialApp( + initialRoute: '/home', + getPages: [ + GetPage(name: '/home', page: () => First(), binding: SampleBind()), + ], + )); +} +``` + +Or unnamed +```dart +Get.to(Second(), binding: SampleBind()); +``` + +There is a trick that can clear your View even more. +Instead of extending StatelessWidget, you can extend GetView, which is a StatelessWidget with a "controller" property. + +See the example and see how clean your code can be using this approach. +The standard Flutter counter has almost 100 lines, it would be summarized to: + +on main.dart +```dart +void main() { + runApp(GetMaterialApp( + initialRoute: '/home', + getPages: [ + GetPage(name: '/home', page: () => HomeView(), binding: HomeBinding()), + ], + )); +} +``` +on home_bindings.dart +```dart +class HomeBinding implements Bindings { + @override + void dependencies() { + Get.lazyPut(() => HomeController()); + } +} +``` + +on home_controller.dart +```dart +class HomeController extends GetxController { + var count = 0.obs; + void increment() => count++; +} +``` +on home_view.dart +```dart +class Home extends GetView { + @override + Widget build(context) => Scaffold( + appBar: AppBar(title: Text("counter")), + body: Center( + child: Obx(() => Text("${controller.counter}")), + ), + floatingActionButton: FloatingActionButton( + child: Icon(Icons.add), + onPressed: controller.increment, + )); +} +``` +What did you do: +He built an example of the counter, (with less code than the original), decoupling its visualization, its business logic, its dependency injection, in a clean, scalable way, facilitating code maintenance and reusability. If you need an accountant on another project, or your developer friend does, you can just share the content of the controller file with him, and everything will work perfectly. +As the view has only widgets, you can use a view for android, and another for iOS, taking advantage of 100% of your business logic, your view has only widgets! you can change them however you want, without affecting your application in any way. + +However, some examples like internationalization, Snackbars without context, validators, responsiveness and other Getx resources, were not explored (and it would not even be possible to explore all resources in such a simple example), so below is an example not very complete, but trying demonstrate how to use internationalization, reactive custom classes, reactive lists, snackbars contextless, workers etc. + +```dart +import 'dart:ui'; +import 'package:flutter/material.dart'; +import 'package:get/get.dart'; + +void main() { + runApp(GetMaterialApp( + // It is not mandatory to use named routes, but dynamic urls are interesting. + initialRoute: '/home', + defaultTransition: Transition.native, + translations: MyTranslations(), + locale: Locale('pt', 'BR'), + getPages: [ + //Simple GetPage + GetPage(name: '/home', page: () => First()), + // GetPage with custom transitions and bindings + GetPage( + name: '/second', + page: () => Second(), + customTransition: SizeTransitions(), + binding: SampleBind(), + ), + // GetPage with default transitions + GetPage( + name: '/third', + transition: Transition.cupertino, + page: () => Third(), + ), + ], + )); +} + +class MyTranslations extends Translations { + @override + Map> get keys => { + 'en': { + 'title': 'Hello World %s', + }, + 'en_US': { + 'title': 'Hello World from US', + }, + 'pt': { + 'title': 'Olá de Portugal', + }, + 'pt_BR': { + 'title': 'Olá do Brasil', + }, + }; +} + +class Controller extends GetxController { + int count = 0; + void increment() { + count++; + // use update method to update all count variables + update(); + } +} + +class First extends StatelessWidget { + @override + Widget build(BuildContext context) { + return Scaffold( + appBar: AppBar( + leading: IconButton( + icon: Icon(Icons.add), + onPressed: () { + Get.snackbar("Hi", "I'm modern snackbar"); + }, + ), + title: Text("title".trArgs(['John'])), + ), + body: Center( + child: Column( + mainAxisAlignment: MainAxisAlignment.center, + children: [ + GetBuilder( + init: Controller(), + // You can initialize your controller here the first time. Don't use init in your other GetBuilders of same controller + builder: (_) => Text( + 'clicks: ${_.count}', + )), + ElevatedButton( + child: Text('Next Route'), + onPressed: () { + Get.toNamed('/second'); + }, + ), + ElevatedButton( + child: Text('Change locale to English'), + onPressed: () { + Get.updateLocale(Locale('en', 'UK')); + }, + ), + ], + ), + ), + floatingActionButton: FloatingActionButton( + child: Icon(Icons.add), + onPressed: () { + Get.find().increment(); + }), + ); + } +} + +class Second extends GetView { + @override + Widget build(BuildContext context) { + return Scaffold( + appBar: AppBar( + title: Text('second Route'), + ), + body: Center( + child: Column( + mainAxisAlignment: MainAxisAlignment.center, + children: [ + Obx( + () { + print("count1 rebuild"); + return Text('${controller.count1}'); + }, + ), + Obx( + () { + print("count2 rebuild"); + return Text('${controller.count2}'); + }, + ), + Obx(() { + print("sum rebuild"); + return Text('${controller.sum}'); + }), + Obx( + () => Text('Name: ${controller.user.value?.name}'), + ), + Obx( + () => Text('Age: ${controller.user.value?.age}'), + ), + ElevatedButton( + child: Text("Go to last page"), + onPressed: () { + Get.toNamed('/third', arguments: 'arguments of second'); + }, + ), + ElevatedButton( + child: Text("Back page and open snackbar"), + onPressed: () { + Get.back(); + Get.snackbar( + 'User 123', + 'Successfully created', + ); + }, + ), + ElevatedButton( + child: Text("Increment"), + onPressed: () { + controller.increment(); + }, + ), + ElevatedButton( + child: Text("Increment"), + onPressed: () { + controller.increment2(); + }, + ), + ElevatedButton( + child: Text("Update name"), + onPressed: () { + controller.updateUser(); + }, + ), + ElevatedButton( + child: Text("Dispose worker"), + onPressed: () { + controller.disposeWorker(); + }, + ), + ], + ), + ), + ); + } +} + +class Third extends GetView { + @override + Widget build(BuildContext context) { + return Scaffold( + floatingActionButton: FloatingActionButton(onPressed: () { + controller.incrementList(); + }), + appBar: AppBar( + title: Text("Third ${Get.arguments}"), + ), + body: Center( + child: Obx(() => ListView.builder( + itemCount: controller.list.length, + itemBuilder: (context, index) { + return Text("${controller.list[index]}"); + }))), + ); + } +} + +class SampleBind extends Bindings { + @override + void dependencies() { + Get.lazyPut(() => ControllerX()); + } +} + +class User { + User({this.name = 'Name', this.age = 0}); + String name; + int age; +} + +class ControllerX extends GetxController { + final count1 = 0.obs; + final count2 = 0.obs; + final list = [56].obs; + final user = User().obs; + + updateUser() { + user.update((value) { + value!.name = 'Jose'; + value.age = 30; + }); + } + + /// Once the controller has entered memory, onInit will be called. + /// It is preferable to use onInit instead of class constructors or initState method. + /// Use onInit to trigger initial events like API searches, listeners registration + /// or Workers registration. + /// Workers are event handlers, they do not modify the final result, + /// but it allows you to listen to an event and trigger customized actions. + /// Here is an outline of how you can use them: + + /// made this if you need cancel you worker + late Worker _ever; + + @override + onInit() { + /// Called every time the variable $_ is changed + _ever = ever(count1, (_) => print("$_ has been changed (ever)")); + + everAll([count1, count2], (_) => print("$_ has been changed (everAll)")); + + /// Called first time the variable $_ is changed + once(count1, (_) => print("$_ was changed once (once)")); + + /// Anti DDos - Called every time the user stops typing for 1 second, for example. + debounce(count1, (_) => print("debouce$_ (debounce)"), + time: Duration(seconds: 1)); + + /// Ignore all changes within 1 second. + interval(count1, (_) => print("interval $_ (interval)"), + time: Duration(seconds: 1)); + } + + int get sum => count1.value + count2.value; + + increment() => count1.value++; + + increment2() => count2.value++; + + disposeWorker() { + _ever.dispose(); + // or _ever(); + } + + incrementList() => list.add(75); +} + +class SizeTransitions extends CustomTransition { + @override + Widget buildTransition( + BuildContext context, + Curve? curve, + Alignment? alignment, + Animation animation, + Animation secondaryAnimation, + Widget child) { + return Align( + alignment: Alignment.center, + child: SizeTransition( + sizeFactor: CurvedAnimation( + parent: animation, + curve: curve!, + ), + child: child, + ), + ); + } +} +``` \ No newline at end of file diff --git a/siro_rider/packages/get/example/lib/lang/en_us.dart b/siro_rider/packages/get/example/lib/lang/en_us.dart new file mode 100644 index 0000000..32f3e14 --- /dev/null +++ b/siro_rider/packages/get/example/lib/lang/en_us.dart @@ -0,0 +1,12 @@ +// ignore_for_file: file_names + +const Map en_US = { + 'covid': 'Corona Virus', + 'total_confirmed': 'Total Confirmed', + 'total_deaths': 'Total Deaths', + 'fetch_country': 'Fetch by country', + 'corona_by_country': 'Corona by country', + 'total_infecteds': 'Total Infecteds', + 'details': 'Details', + 'total_recovered': 'Total Recovered', +}; diff --git a/siro_rider/packages/get/example/lib/lang/pt_br.dart b/siro_rider/packages/get/example/lib/lang/pt_br.dart new file mode 100644 index 0000000..f891515 --- /dev/null +++ b/siro_rider/packages/get/example/lib/lang/pt_br.dart @@ -0,0 +1,12 @@ +// ignore_for_file: file_names + +const Map pt_BR = { + 'covid': 'Corona Vírus', + 'total_confirmed': 'Total confirmado', + 'total_deaths': 'Total de mortes', + 'fetch_country': 'Listar por país', + 'corona_by_country': 'Corona por país', + 'total_infecteds': 'Total de infectados', + 'details': 'Detalhes', + 'total_recovered': 'Total de recuperados' +}; diff --git a/siro_rider/packages/get/example/lib/lang/translation_service.dart b/siro_rider/packages/get/example/lib/lang/translation_service.dart new file mode 100644 index 0000000..d27c221 --- /dev/null +++ b/siro_rider/packages/get/example/lib/lang/translation_service.dart @@ -0,0 +1,15 @@ +import 'package:flutter/material.dart'; +import 'package:get/get.dart'; + +import 'en_us.dart'; +import 'pt_br.dart'; + +class TranslationService extends Translations { + static Locale? get locale => Get.deviceLocale; + static final fallbackLocale = Locale('en', 'US'); + @override + Map> get keys => { + 'en_US': en_US, + 'pt_BR': pt_BR, + }; +} diff --git a/siro_rider/packages/get/example/lib/main.dart b/siro_rider/packages/get/example/lib/main.dart new file mode 100644 index 0000000..1caea5f --- /dev/null +++ b/siro_rider/packages/get/example/lib/main.dart @@ -0,0 +1,129 @@ +import 'package:flutter/material.dart'; +import 'package:get/get.dart'; + +import 'lang/translation_service.dart'; +import 'routes/app_pages.dart'; +import 'shared/logger/logger_utils.dart'; + +void main() { + runApp(MyApp()); +} + +class MyApp extends StatelessWidget { + const MyApp({Key? key}) : super(key: key); + + @override + Widget build(BuildContext context) { + return GetMaterialApp.router( + debugShowCheckedModeBanner: false, + enableLog: true, + logWriterCallback: Logger.write, + // initialRoute: AppPages.INITIAL, + getPages: AppPages.routes, + locale: TranslationService.locale, + fallbackLocale: TranslationService.fallbackLocale, + translations: TranslationService(), + ); + } +} + +/// Nav 2 snippet +// void main() { +// runApp(MyApp()); +// } + +// class MyApp extends StatelessWidget { +// MyApp({Key? key}) : super(key: key); + +// @override +// Widget build(BuildContext context) { +// return GetMaterialApp.router( +// getPages: [ +// GetPage( +// participatesInRootNavigator: true, +// name: '/first', +// page: () => First()), +// GetPage( +// name: '/second', +// page: () => Second(), +// ), +// GetPage( +// name: '/third', +// page: () => Third(), +// ), +// ], +// debugShowCheckedModeBanner: false, +// ); +// } +// } + +// class First extends StatelessWidget { +// @override +// Widget build(BuildContext context) { +// return Scaffold( +// appBar: AppBar( +// title: Text('page one'), +// leading: IconButton( +// icon: Icon(Icons.more), +// onPressed: () { +// Get.changeTheme( +// context.isDarkMode ? ThemeData.light() : ThemeData.dark()); +// }, +// ), +// ), +// body: Center( +// child: Container( +// height: 300, +// width: 300, +// child: ElevatedButton( +// onPressed: () {}, +// child: Text('next screen'), +// ), +// ), +// ), +// ); +// } +// } + +// class Second extends StatelessWidget { +// @override +// Widget build(BuildContext context) { +// return Scaffold( +// appBar: AppBar( +// title: Text('page two ${Get.parameters["id"]}'), +// ), +// body: Center( +// child: Container( +// height: 300, +// width: 300, +// child: ElevatedButton( +// onPressed: () {}, +// child: Text('next screen'), +// ), +// ), +// ), +// ); +// } +// } + +// class Third extends StatelessWidget { +// @override +// Widget build(BuildContext context) { +// return Scaffold( +// backgroundColor: Colors.red, +// appBar: AppBar( +// title: Text('page three'), +// ), +// body: Center( +// child: Container( +// height: 300, +// width: 300, +// child: ElevatedButton( +// onPressed: () {}, +// child: Text('go to first screen'), +// ), +// ), +// ), +// ); +// } +// } diff --git a/siro_rider/packages/get/example/lib/pages/home/bindings/home_binding.dart b/siro_rider/packages/get/example/lib/pages/home/bindings/home_binding.dart new file mode 100644 index 0000000..52f36ec --- /dev/null +++ b/siro_rider/packages/get/example/lib/pages/home/bindings/home_binding.dart @@ -0,0 +1,15 @@ +import 'package:get/get.dart'; +import '../data/home_api_provider.dart'; + +import '../data/home_repository.dart'; +import '../domain/adapters/repository_adapter.dart'; +import '../presentation/controllers/home_controller.dart'; + +class HomeBinding extends Bindings { + @override + void dependencies() { + Get.lazyPut(() => HomeProvider()); + Get.lazyPut(() => HomeRepository(provider: Get.find())); + Get.lazyPut(() => HomeController(homeRepository: Get.find())); + } +} diff --git a/siro_rider/packages/get/example/lib/pages/home/data/home_api_provider.dart b/siro_rider/packages/get/example/lib/pages/home/data/home_api_provider.dart new file mode 100644 index 0000000..c7f0443 --- /dev/null +++ b/siro_rider/packages/get/example/lib/pages/home/data/home_api_provider.dart @@ -0,0 +1,19 @@ +import 'package:get/get.dart'; +import '../domain/entity/cases_model.dart'; + +// ignore: one_member_abstracts +abstract class IHomeProvider { + Future> getCases(String path); +} + +class HomeProvider extends GetConnect implements IHomeProvider { + @override + void onInit() { + httpClient.defaultDecoder = + (val) => CasesModel.fromJson(val as Map); + httpClient.baseUrl = 'https://api.covid19api.com'; + } + + @override + Future> getCases(String path) => get(path); +} diff --git a/siro_rider/packages/get/example/lib/pages/home/data/home_repository.dart b/siro_rider/packages/get/example/lib/pages/home/data/home_repository.dart new file mode 100644 index 0000000..0e459aa --- /dev/null +++ b/siro_rider/packages/get/example/lib/pages/home/data/home_repository.dart @@ -0,0 +1,18 @@ +import '../domain/adapters/repository_adapter.dart'; +import '../domain/entity/cases_model.dart'; +import 'home_api_provider.dart'; + +class HomeRepository implements IHomeRepository { + HomeRepository({required this.provider}); + final IHomeProvider provider; + + @override + Future getCases() async { + final cases = await provider.getCases("/summary"); + if (cases.status.hasError) { + return Future.error(cases.statusText!); + } else { + return cases.body!; + } + } +} diff --git a/siro_rider/packages/get/example/lib/pages/home/domain/adapters/repository_adapter.dart b/siro_rider/packages/get/example/lib/pages/home/domain/adapters/repository_adapter.dart new file mode 100644 index 0000000..9bceb0d --- /dev/null +++ b/siro_rider/packages/get/example/lib/pages/home/domain/adapters/repository_adapter.dart @@ -0,0 +1,6 @@ +import '../entity/cases_model.dart'; + +// ignore: one_member_abstracts +abstract class IHomeRepository { + Future getCases(); +} diff --git a/siro_rider/packages/get/example/lib/pages/home/domain/entity/cases_model.dart b/siro_rider/packages/get/example/lib/pages/home/domain/entity/cases_model.dart new file mode 100644 index 0000000..949d9f2 --- /dev/null +++ b/siro_rider/packages/get/example/lib/pages/home/domain/entity/cases_model.dart @@ -0,0 +1,167 @@ +// To parse this JSON data, do +// +// final welcome = welcomeFromJson(jsonString); + +import 'dart:convert'; + +class CasesModel { + CasesModel({ + required this.id, + required this.message, + required this.global, + required this.countries, + required this.date, + }); + + final String id; + final String message; + final Global global; + final List countries; + final DateTime date; + + factory CasesModel.fromRawJson(String str) => + CasesModel.fromJson(json.decode(str) as Map); + + String toRawJson() => json.encode(toJson()); + + factory CasesModel.fromJson(Map json) => CasesModel( + id: json["ID"] as String, + message: json["Message"] as String, + global: Global.fromJson(json["Global"] as Map), + countries: List.from((json["Countries"] as Iterable).map( + (x) => Country.fromJson(x as Map), + )), + date: DateTime.parse(json["Date"] as String), + ); + + Map toJson() => { + "ID": id, + "Message": message, + "Global": global.toJson(), + "Countries": List.from(countries.map((x) => x.toJson())), + "Date": date.toIso8601String(), + }; +} + +class Country { + Country({ + required this.id, + required this.country, + required this.countryCode, + required this.slug, + required this.newConfirmed, + required this.totalConfirmed, + required this.newDeaths, + required this.totalDeaths, + required this.newRecovered, + required this.totalRecovered, + required this.date, + required this.premium, + }); + + final String id; + final String country; + final String countryCode; + final String slug; + final int newConfirmed; + final int totalConfirmed; + final int newDeaths; + final int totalDeaths; + final int newRecovered; + final int totalRecovered; + final DateTime date; + final Premium premium; + + factory Country.fromRawJson(String str) => + Country.fromJson(json.decode(str) as Map); + + String toRawJson() => json.encode(toJson()); + + factory Country.fromJson(Map json) => Country( + id: json["ID"] as String, + country: json["Country"] as String, + countryCode: json["CountryCode"] as String, + slug: json["Slug"] as String, + newConfirmed: json["NewConfirmed"] as int, + totalConfirmed: json["TotalConfirmed"] as int, + newDeaths: json["NewDeaths"] as int, + totalDeaths: json["TotalDeaths"] as int, + newRecovered: json["NewRecovered"] as int, + totalRecovered: json["TotalRecovered"] as int, + date: DateTime.parse(json["Date"] as String), + premium: Premium.fromJson(json["Premium"] as Map), + ); + + Map toJson() => { + "ID": id, + "Country": country, + "CountryCode": countryCode, + "Slug": slug, + "NewConfirmed": newConfirmed, + "TotalConfirmed": totalConfirmed, + "NewDeaths": newDeaths, + "TotalDeaths": totalDeaths, + "NewRecovered": newRecovered, + "TotalRecovered": totalRecovered, + "Date": date.toIso8601String(), + "Premium": premium.toJson(), + }; +} + +class Premium { + Premium(); + + factory Premium.fromRawJson(String str) => + Premium.fromJson(json.decode(str) as Map); + + String toRawJson() => json.encode(toJson()); + + factory Premium.fromJson(Map json) => Premium(); + + Map toJson() => {}; +} + +class Global { + Global({ + required this.newConfirmed, + required this.totalConfirmed, + required this.newDeaths, + required this.totalDeaths, + required this.newRecovered, + required this.totalRecovered, + required this.date, + }); + + final int newConfirmed; + final int totalConfirmed; + final int newDeaths; + final int totalDeaths; + final int newRecovered; + final int totalRecovered; + final DateTime date; + + factory Global.fromRawJson(String str) => + Global.fromJson(json.decode(str) as Map); + + String toRawJson() => json.encode(toJson()); + + factory Global.fromJson(Map json) => Global( + newConfirmed: json["NewConfirmed"] as int, + totalConfirmed: json["TotalConfirmed"] as int, + newDeaths: json["NewDeaths"] as int, + totalDeaths: json["TotalDeaths"] as int, + newRecovered: json["NewRecovered"] as int, + totalRecovered: json["TotalRecovered"] as int, + date: DateTime.parse(json["Date"] as String), + ); + + Map toJson() => { + "NewConfirmed": newConfirmed, + "TotalConfirmed": totalConfirmed, + "NewDeaths": newDeaths, + "TotalDeaths": totalDeaths, + "NewRecovered": newRecovered, + "TotalRecovered": totalRecovered, + "Date": date.toIso8601String(), + }; +} diff --git a/siro_rider/packages/get/example/lib/pages/home/presentation/controllers/home_controller.dart b/siro_rider/packages/get/example/lib/pages/home/presentation/controllers/home_controller.dart new file mode 100644 index 0000000..10afef4 --- /dev/null +++ b/siro_rider/packages/get/example/lib/pages/home/presentation/controllers/home_controller.dart @@ -0,0 +1,84 @@ +import 'package:get/get.dart'; + +import '../../domain/adapters/repository_adapter.dart'; +import '../../domain/entity/cases_model.dart'; + +class HomeController extends SuperController { + HomeController({required this.homeRepository}); + + final IHomeRepository homeRepository; + + @override + void onInit() { + super.onInit(); + + //Loading, Success, Error handle with 1 line of code + append(() => homeRepository.getCases); + } + + Country getCountryById(String id) { + final index = int.tryParse(id); + if (index != null) { + return state!.countries[index]; + } + + return state!.countries.first; + } + + @override + void onReady() { + print('The build method is done. ' + 'Your controller is ready to call dialogs and snackbars'); + super.onReady(); + } + + @override + void onClose() { + print('onClose called'); + super.onClose(); + } + + @override + void didChangeMetrics() { + print('the window size did change'); + super.didChangeMetrics(); + } + + @override + void didChangePlatformBrightness() { + print('platform change ThemeMode'); + super.didChangePlatformBrightness(); + } + + @override + Future didPushRoute(String route) { + print('the route $route will be open'); + return super.didPushRoute(route); + } + + @override + Future didPopRoute() { + print('the current route will be closed'); + return super.didPopRoute(); + } + + @override + void onDetached() { + print('onDetached called'); + } + + @override + void onInactive() { + print('onInative called'); + } + + @override + void onPaused() { + print('onPaused called'); + } + + @override + void onResumed() { + print('onResumed called'); + } +} diff --git a/siro_rider/packages/get/example/lib/pages/home/presentation/views/country_view.dart b/siro_rider/packages/get/example/lib/pages/home/presentation/views/country_view.dart new file mode 100644 index 0000000..680cbfe --- /dev/null +++ b/siro_rider/packages/get/example/lib/pages/home/presentation/views/country_view.dart @@ -0,0 +1,56 @@ +import 'dart:ui'; + +import 'package:flutter/material.dart'; +import 'package:get/get.dart'; + +import '../controllers/home_controller.dart'; + +class CountryView extends GetView { + @override + Widget build(BuildContext context) { + return Container( + decoration: BoxDecoration( + image: DecorationImage( + fit: BoxFit.cover, + colorFilter: ColorFilter.linearToSrgbGamma(), + image: NetworkImage( + "https://images.pexels.com/photos/3902882/pexels-photo-3902882.jpeg?auto=compress&cs=tinysrgb&dpr=2&h=650&w=940"))), + child: BackdropFilter( + filter: ImageFilter.blur(sigmaX: 15.0, sigmaY: 15.0), + child: Container( + child: Scaffold( + backgroundColor: Colors.transparent, + appBar: AppBar( + title: Text('corona_by_country'.tr), + backgroundColor: Colors.transparent, + elevation: 0, + centerTitle: true, + ), + body: Center( + child: ListView.builder( + itemCount: controller.state!.countries.length, + itemBuilder: (context, index) { + final country = controller.state!.countries[index]; + return ListTile( + onTap: () { + //Get.rootDelegate.toNamed('/home/country'); + Get.rootDelegate + .toNamed('/home/country/details?id=$index'); + }, + trailing: CircleAvatar( + backgroundImage: NetworkImage( + "https://flagpedia.net/data/flags/normal/${country.countryCode.toLowerCase()}.png"), + ), + title: Text(country.country), + subtitle: Text( + // ignore: lines_longer_than_80_chars + '${'total_infecteds'.tr}${' ${country.totalConfirmed}'}'), + ); + }), + ), + ), + ), + ), + ); + } +} diff --git a/siro_rider/packages/get/example/lib/pages/home/presentation/views/details_view.dart b/siro_rider/packages/get/example/lib/pages/home/presentation/views/details_view.dart new file mode 100644 index 0000000..9a167da --- /dev/null +++ b/siro_rider/packages/get/example/lib/pages/home/presentation/views/details_view.dart @@ -0,0 +1,86 @@ +import 'dart:ui'; + +import 'package:flutter/material.dart'; +import 'package:get/get.dart'; +import '../controllers/home_controller.dart'; + +class DetailsView extends GetView { + @override + Widget build(BuildContext context) { + final parameter = Get.rootDelegate.parameters; + final country = controller.getCountryById(parameter['id'] ?? ''); + return Container( + decoration: BoxDecoration( + image: DecorationImage( + fit: BoxFit.cover, + colorFilter: ColorFilter.linearToSrgbGamma(), + image: NetworkImage( + "https://flagpedia.net/data/flags/normal/${country.countryCode.toLowerCase()}.png"), + ), + ), + child: BackdropFilter( + filter: ImageFilter.blur(sigmaX: 15.0, sigmaY: 15.0), + child: Container( + child: Scaffold( + backgroundColor: Colors.transparent, + appBar: AppBar( + title: Text('details'.tr), + backgroundColor: Colors.black12, + elevation: 0, + centerTitle: true, + ), + body: Center( + child: Column( + mainAxisAlignment: MainAxisAlignment.center, + children: [ + Text( + '${country.country}', + style: TextStyle(fontSize: 45, fontWeight: FontWeight.bold), + ), + SizedBox( + height: 35, + ), + Text( + 'total_confirmed'.tr, + style: TextStyle( + fontSize: 25, + ), + ), + Text( + '${country.totalConfirmed}', + style: TextStyle(fontSize: 35, fontWeight: FontWeight.bold), + ), + SizedBox( + height: 10, + ), + Text( + 'total_deaths'.tr, + style: TextStyle( + fontSize: 25, + ), + ), + Text( + '${country.totalDeaths}', + style: TextStyle(fontSize: 35, fontWeight: FontWeight.bold), + ), + SizedBox( + height: 10, + ), + Text( + 'total_recovered'.tr, + style: TextStyle( + fontSize: 25, + ), + ), + Text( + '${country.totalRecovered}', + style: TextStyle(fontSize: 35, fontWeight: FontWeight.bold), + ), + ], + )), + ), + ), + ), + ); + } +} diff --git a/siro_rider/packages/get/example/lib/pages/home/presentation/views/home_view.dart b/siro_rider/packages/get/example/lib/pages/home/presentation/views/home_view.dart new file mode 100644 index 0000000..f2d8688 --- /dev/null +++ b/siro_rider/packages/get/example/lib/pages/home/presentation/views/home_view.dart @@ -0,0 +1,118 @@ +import 'package:flutter/material.dart'; +import 'package:get/get.dart'; + +import '../controllers/home_controller.dart'; + +class HomeView extends GetView { + @override + Widget build(BuildContext context) { + return Container( + decoration: BoxDecoration( + color: Colors.white, + image: DecorationImage( + fit: BoxFit.cover, + colorFilter: ColorFilter.linearToSrgbGamma(), + image: NetworkImage( + "https://images.pexels.com/photos/3902882/pexels-photo-3902882.jpeg?auto=compress&cs=tinysrgb&dpr=2&h=650&w=940"), + ), + ), + child: Scaffold( + backgroundColor: Colors.transparent, + appBar: AppBar( + leading: IconButton( + icon: Icon(Icons.add), + onPressed: () { + Get.snackbar('title', 'message'); + }, + ), + title: Text('covid'.tr), + backgroundColor: Colors.white10, + elevation: 0, + centerTitle: true, + ), + body: Center( + child: controller.obx( + (state) { + return Column( + mainAxisAlignment: MainAxisAlignment.center, + children: [ + SizedBox( + height: 100, + ), + Text( + 'total_confirmed'.tr, + style: TextStyle( + fontSize: 30, + ), + ), + Text( + '${state!.global.totalConfirmed}', + style: TextStyle(fontSize: 45, fontWeight: FontWeight.bold), + ), + SizedBox( + height: 10, + ), + Text( + 'total_deaths'.tr, + style: TextStyle( + fontSize: 30, + ), + ), + Text( + '${state.global.totalDeaths}', + style: TextStyle(fontSize: 45, fontWeight: FontWeight.bold), + ), + SizedBox( + height: 10, + ), + OutlinedButton( + style: OutlinedButton.styleFrom( + textStyle: TextStyle(color: Colors.black), + side: BorderSide( + color: Colors.deepPurple, + width: 3, + ), + shape: StadiumBorder(), + ), + onPressed: () async { + final data = + await Get.rootDelegate.toNamed('/home/country'); + print('DATA: $data'); + }, + child: Text( + 'fetch_country'.tr, + style: TextStyle( + fontWeight: FontWeight.bold, + color: Colors.black, + ), + ), + ), + OutlinedButton( + style: OutlinedButton.styleFrom( + textStyle: TextStyle(color: Colors.black), + side: BorderSide( + color: Colors.deepPurple, + width: 3, + ), + shape: StadiumBorder(), + ), + onPressed: () { + Get.updateLocale(Locale('pt', 'BR')); + }, + child: Text( + 'Update language to Portuguese', + style: TextStyle( + fontWeight: FontWeight.bold, + color: Colors.black, + ), + ), + ), + ], + ); + }, + ), + ), + ), + ); + } +} diff --git a/siro_rider/packages/get/example/lib/routes/app_pages.dart b/siro_rider/packages/get/example/lib/routes/app_pages.dart new file mode 100644 index 0000000..1a43c4d --- /dev/null +++ b/siro_rider/packages/get/example/lib/routes/app_pages.dart @@ -0,0 +1,32 @@ +import 'package:get/get.dart'; + +import '../pages/home/bindings/home_binding.dart'; +import '../pages/home/presentation/views/country_view.dart'; +import '../pages/home/presentation/views/details_view.dart'; +import '../pages/home/presentation/views/home_view.dart'; + +part 'app_routes.dart'; + +// ignore: avoid_classes_with_only_static_members +class AppPages { + static const INITIAL = Routes.HOME; + + static final routes = [ + GetPage( + name: Routes.HOME, + page: () => HomeView(), + binding: HomeBinding(), + children: [ + GetPage( + name: Routes.COUNTRY, + page: () => CountryView(), + children: [ + GetPage( + name: Routes.DETAILS, + page: () => DetailsView(), + ), + ], + ), + ]), + ]; +} diff --git a/siro_rider/packages/get/example/lib/routes/app_routes.dart b/siro_rider/packages/get/example/lib/routes/app_routes.dart new file mode 100644 index 0000000..ff3986a --- /dev/null +++ b/siro_rider/packages/get/example/lib/routes/app_routes.dart @@ -0,0 +1,7 @@ +part of 'app_pages.dart'; + +abstract class Routes { + static const HOME = '/home'; + static const COUNTRY = '/country'; + static const DETAILS = '/details'; +} diff --git a/siro_rider/packages/get/example/lib/shared/logger/logger_utils.dart b/siro_rider/packages/get/example/lib/shared/logger/logger_utils.dart new file mode 100644 index 0000000..7460cd3 --- /dev/null +++ b/siro_rider/packages/get/example/lib/shared/logger/logger_utils.dart @@ -0,0 +1,6 @@ +mixin Logger { + // Sample of abstract logging function + static void write(String text, {bool isError = false}) { + Future.microtask(() => print('** $text. isError: [$isError]')); + } +} diff --git a/siro_rider/packages/get/example/macos/Flutter/Flutter-Debug.xcconfig b/siro_rider/packages/get/example/macos/Flutter/Flutter-Debug.xcconfig new file mode 100644 index 0000000..c2efd0b --- /dev/null +++ b/siro_rider/packages/get/example/macos/Flutter/Flutter-Debug.xcconfig @@ -0,0 +1 @@ +#include "ephemeral/Flutter-Generated.xcconfig" diff --git a/siro_rider/packages/get/example/macos/Flutter/Flutter-Release.xcconfig b/siro_rider/packages/get/example/macos/Flutter/Flutter-Release.xcconfig new file mode 100644 index 0000000..c2efd0b --- /dev/null +++ b/siro_rider/packages/get/example/macos/Flutter/Flutter-Release.xcconfig @@ -0,0 +1 @@ +#include "ephemeral/Flutter-Generated.xcconfig" diff --git a/siro_rider/packages/get/example/macos/Flutter/GeneratedPluginRegistrant.swift b/siro_rider/packages/get/example/macos/Flutter/GeneratedPluginRegistrant.swift new file mode 100644 index 0000000..cccf817 --- /dev/null +++ b/siro_rider/packages/get/example/macos/Flutter/GeneratedPluginRegistrant.swift @@ -0,0 +1,10 @@ +// +// Generated file. Do not edit. +// + +import FlutterMacOS +import Foundation + + +func RegisterGeneratedPlugins(registry: FlutterPluginRegistry) { +} diff --git a/siro_rider/packages/get/example/macos/Flutter/ephemeral/Flutter-Generated.xcconfig b/siro_rider/packages/get/example/macos/Flutter/ephemeral/Flutter-Generated.xcconfig new file mode 100644 index 0000000..3b03f43 --- /dev/null +++ b/siro_rider/packages/get/example/macos/Flutter/ephemeral/Flutter-Generated.xcconfig @@ -0,0 +1,11 @@ +// This is a generated file; do not edit or check into version control. +FLUTTER_ROOT=/Users/hamzaaleghwairyeen/flutter +FLUTTER_APPLICATION_PATH=/Users/hamzaaleghwairyeen/development/App/Intaleq/packages/get/example +COCOAPODS_PARALLEL_CODE_SIGN=true +FLUTTER_BUILD_DIR=build +FLUTTER_BUILD_NAME=1.0.0 +FLUTTER_BUILD_NUMBER=1 +DART_OBFUSCATION=false +TRACK_WIDGET_CREATION=true +TREE_SHAKE_ICONS=false +PACKAGE_CONFIG=.dart_tool/package_config.json diff --git a/siro_rider/packages/get/example/macos/Flutter/ephemeral/flutter_export_environment.sh b/siro_rider/packages/get/example/macos/Flutter/ephemeral/flutter_export_environment.sh new file mode 100755 index 0000000..a10a7cc --- /dev/null +++ b/siro_rider/packages/get/example/macos/Flutter/ephemeral/flutter_export_environment.sh @@ -0,0 +1,12 @@ +#!/bin/sh +# This is a generated file; do not edit or check into version control. +export "FLUTTER_ROOT=/Users/hamzaaleghwairyeen/flutter" +export "FLUTTER_APPLICATION_PATH=/Users/hamzaaleghwairyeen/development/App/Intaleq/packages/get/example" +export "COCOAPODS_PARALLEL_CODE_SIGN=true" +export "FLUTTER_BUILD_DIR=build" +export "FLUTTER_BUILD_NAME=1.0.0" +export "FLUTTER_BUILD_NUMBER=1" +export "DART_OBFUSCATION=false" +export "TRACK_WIDGET_CREATION=true" +export "TREE_SHAKE_ICONS=false" +export "PACKAGE_CONFIG=.dart_tool/package_config.json" diff --git a/siro_rider/packages/get/example/macos/Runner.xcodeproj/project.pbxproj b/siro_rider/packages/get/example/macos/Runner.xcodeproj/project.pbxproj new file mode 100644 index 0000000..cc89c87 --- /dev/null +++ b/siro_rider/packages/get/example/macos/Runner.xcodeproj/project.pbxproj @@ -0,0 +1,572 @@ +// !$*UTF8*$! +{ + archiveVersion = 1; + classes = { + }; + objectVersion = 51; + objects = { + +/* Begin PBXAggregateTarget section */ + 33CC111A2044C6BA0003C045 /* Flutter Assemble */ = { + isa = PBXAggregateTarget; + buildConfigurationList = 33CC111B2044C6BA0003C045 /* Build configuration list for PBXAggregateTarget "Flutter Assemble" */; + buildPhases = ( + 33CC111E2044C6BF0003C045 /* ShellScript */, + ); + dependencies = ( + ); + name = "Flutter Assemble"; + productName = FLX; + }; +/* End PBXAggregateTarget section */ + +/* Begin PBXBuildFile section */ + 335BBD1B22A9A15E00E9071D /* GeneratedPluginRegistrant.swift in Sources */ = {isa = PBXBuildFile; fileRef = 335BBD1A22A9A15E00E9071D /* GeneratedPluginRegistrant.swift */; }; + 33CC10F12044A3C60003C045 /* AppDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 33CC10F02044A3C60003C045 /* AppDelegate.swift */; }; + 33CC10F32044A3C60003C045 /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 33CC10F22044A3C60003C045 /* Assets.xcassets */; }; + 33CC10F62044A3C60003C045 /* MainMenu.xib in Resources */ = {isa = PBXBuildFile; fileRef = 33CC10F42044A3C60003C045 /* MainMenu.xib */; }; + 33CC11132044BFA00003C045 /* MainFlutterWindow.swift in Sources */ = {isa = PBXBuildFile; fileRef = 33CC11122044BFA00003C045 /* MainFlutterWindow.swift */; }; +/* End PBXBuildFile section */ + +/* Begin PBXContainerItemProxy section */ + 33CC111F2044C79F0003C045 /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = 33CC10E52044A3C60003C045 /* Project object */; + proxyType = 1; + remoteGlobalIDString = 33CC111A2044C6BA0003C045; + remoteInfo = FLX; + }; +/* End PBXContainerItemProxy section */ + +/* Begin PBXCopyFilesBuildPhase section */ + 33CC110E2044A8840003C045 /* Bundle Framework */ = { + isa = PBXCopyFilesBuildPhase; + buildActionMask = 2147483647; + dstPath = ""; + dstSubfolderSpec = 10; + files = ( + ); + name = "Bundle Framework"; + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXCopyFilesBuildPhase section */ + +/* Begin PBXFileReference section */ + 333000ED22D3DE5D00554162 /* Warnings.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; path = Warnings.xcconfig; sourceTree = ""; }; + 335BBD1A22A9A15E00E9071D /* GeneratedPluginRegistrant.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = GeneratedPluginRegistrant.swift; sourceTree = ""; }; + 33CC10ED2044A3C60003C045 /* example.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = "example.app"; sourceTree = BUILT_PRODUCTS_DIR; }; + 33CC10F02044A3C60003C045 /* AppDelegate.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AppDelegate.swift; sourceTree = ""; }; + 33CC10F22044A3C60003C045 /* Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; name = Assets.xcassets; path = Runner/Assets.xcassets; sourceTree = ""; }; + 33CC10F52044A3C60003C045 /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.xib; name = Base; path = Base.lproj/MainMenu.xib; sourceTree = ""; }; + 33CC10F72044A3C60003C045 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; name = Info.plist; path = Runner/Info.plist; sourceTree = ""; }; + 33CC11122044BFA00003C045 /* MainFlutterWindow.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MainFlutterWindow.swift; sourceTree = ""; }; + 33CEB47222A05771004F2AC0 /* Flutter-Debug.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; path = "Flutter-Debug.xcconfig"; sourceTree = ""; }; + 33CEB47422A05771004F2AC0 /* Flutter-Release.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; path = "Flutter-Release.xcconfig"; sourceTree = ""; }; + 33CEB47722A0578A004F2AC0 /* Flutter-Generated.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; name = "Flutter-Generated.xcconfig"; path = "ephemeral/Flutter-Generated.xcconfig"; sourceTree = ""; }; + 33E51913231747F40026EE4D /* DebugProfile.entitlements */ = {isa = PBXFileReference; lastKnownFileType = text.plist.entitlements; path = DebugProfile.entitlements; sourceTree = ""; }; + 33E51914231749380026EE4D /* Release.entitlements */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.entitlements; path = Release.entitlements; sourceTree = ""; }; + 33E5194F232828860026EE4D /* AppInfo.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; path = AppInfo.xcconfig; sourceTree = ""; }; + 7AFA3C8E1D35360C0083082E /* Release.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; path = Release.xcconfig; sourceTree = ""; }; + 9740EEB21CF90195004384FC /* Debug.xcconfig */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xcconfig; path = Debug.xcconfig; sourceTree = ""; }; +/* End PBXFileReference section */ + +/* Begin PBXFrameworksBuildPhase section */ + 33CC10EA2044A3C60003C045 /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXFrameworksBuildPhase section */ + +/* Begin PBXGroup section */ + 33BA886A226E78AF003329D5 /* Configs */ = { + isa = PBXGroup; + children = ( + 33E5194F232828860026EE4D /* AppInfo.xcconfig */, + 9740EEB21CF90195004384FC /* Debug.xcconfig */, + 7AFA3C8E1D35360C0083082E /* Release.xcconfig */, + 333000ED22D3DE5D00554162 /* Warnings.xcconfig */, + ); + path = Configs; + sourceTree = ""; + }; + 33CC10E42044A3C60003C045 = { + isa = PBXGroup; + children = ( + 33FAB671232836740065AC1E /* Runner */, + 33CEB47122A05771004F2AC0 /* Flutter */, + 33CC10EE2044A3C60003C045 /* Products */, + D73912EC22F37F3D000D13A0 /* Frameworks */, + ); + sourceTree = ""; + }; + 33CC10EE2044A3C60003C045 /* Products */ = { + isa = PBXGroup; + children = ( + 33CC10ED2044A3C60003C045 /* example.app */, + ); + name = Products; + sourceTree = ""; + }; + 33CC11242044D66E0003C045 /* Resources */ = { + isa = PBXGroup; + children = ( + 33CC10F22044A3C60003C045 /* Assets.xcassets */, + 33CC10F42044A3C60003C045 /* MainMenu.xib */, + 33CC10F72044A3C60003C045 /* Info.plist */, + ); + name = Resources; + path = ..; + sourceTree = ""; + }; + 33CEB47122A05771004F2AC0 /* Flutter */ = { + isa = PBXGroup; + children = ( + 335BBD1A22A9A15E00E9071D /* GeneratedPluginRegistrant.swift */, + 33CEB47222A05771004F2AC0 /* Flutter-Debug.xcconfig */, + 33CEB47422A05771004F2AC0 /* Flutter-Release.xcconfig */, + 33CEB47722A0578A004F2AC0 /* Flutter-Generated.xcconfig */, + ); + path = Flutter; + sourceTree = ""; + }; + 33FAB671232836740065AC1E /* Runner */ = { + isa = PBXGroup; + children = ( + 33CC10F02044A3C60003C045 /* AppDelegate.swift */, + 33CC11122044BFA00003C045 /* MainFlutterWindow.swift */, + 33E51913231747F40026EE4D /* DebugProfile.entitlements */, + 33E51914231749380026EE4D /* Release.entitlements */, + 33CC11242044D66E0003C045 /* Resources */, + 33BA886A226E78AF003329D5 /* Configs */, + ); + path = Runner; + sourceTree = ""; + }; + D73912EC22F37F3D000D13A0 /* Frameworks */ = { + isa = PBXGroup; + children = ( + ); + name = Frameworks; + sourceTree = ""; + }; +/* End PBXGroup section */ + +/* Begin PBXNativeTarget section */ + 33CC10EC2044A3C60003C045 /* Runner */ = { + isa = PBXNativeTarget; + buildConfigurationList = 33CC10FB2044A3C60003C045 /* Build configuration list for PBXNativeTarget "Runner" */; + buildPhases = ( + 33CC10E92044A3C60003C045 /* Sources */, + 33CC10EA2044A3C60003C045 /* Frameworks */, + 33CC10EB2044A3C60003C045 /* Resources */, + 33CC110E2044A8840003C045 /* Bundle Framework */, + 3399D490228B24CF009A79C7 /* ShellScript */, + ); + buildRules = ( + ); + dependencies = ( + 33CC11202044C79F0003C045 /* PBXTargetDependency */, + ); + name = Runner; + productName = Runner; + productReference = 33CC10ED2044A3C60003C045 /* example.app */; + productType = "com.apple.product-type.application"; + }; +/* End PBXNativeTarget section */ + +/* Begin PBXProject section */ + 33CC10E52044A3C60003C045 /* Project object */ = { + isa = PBXProject; + attributes = { + LastSwiftUpdateCheck = 0920; + LastUpgradeCheck = 0930; + ORGANIZATIONNAME = ""; + TargetAttributes = { + 33CC10EC2044A3C60003C045 = { + CreatedOnToolsVersion = 9.2; + LastSwiftMigration = 1100; + ProvisioningStyle = Automatic; + SystemCapabilities = { + com.apple.Sandbox = { + enabled = 1; + }; + }; + }; + 33CC111A2044C6BA0003C045 = { + CreatedOnToolsVersion = 9.2; + ProvisioningStyle = Manual; + }; + }; + }; + buildConfigurationList = 33CC10E82044A3C60003C045 /* Build configuration list for PBXProject "Runner" */; + compatibilityVersion = "Xcode 9.3"; + developmentRegion = en; + hasScannedForEncodings = 0; + knownRegions = ( + en, + Base, + ); + mainGroup = 33CC10E42044A3C60003C045; + productRefGroup = 33CC10EE2044A3C60003C045 /* Products */; + projectDirPath = ""; + projectRoot = ""; + targets = ( + 33CC10EC2044A3C60003C045 /* Runner */, + 33CC111A2044C6BA0003C045 /* Flutter Assemble */, + ); + }; +/* End PBXProject section */ + +/* Begin PBXResourcesBuildPhase section */ + 33CC10EB2044A3C60003C045 /* Resources */ = { + isa = PBXResourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + 33CC10F32044A3C60003C045 /* Assets.xcassets in Resources */, + 33CC10F62044A3C60003C045 /* MainMenu.xib in Resources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXResourcesBuildPhase section */ + +/* Begin PBXShellScriptBuildPhase section */ + 3399D490228B24CF009A79C7 /* ShellScript */ = { + isa = PBXShellScriptBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + inputFileListPaths = ( + ); + inputPaths = ( + ); + outputFileListPaths = ( + ); + outputPaths = ( + ); + runOnlyForDeploymentPostprocessing = 0; + shellPath = /bin/sh; + shellScript = "echo \"$PRODUCT_NAME.app\" > \"$PROJECT_DIR\"/Flutter/ephemeral/.app_filename && \"$FLUTTER_ROOT\"/packages/flutter_tools/bin/macos_assemble.sh embed\n"; + }; + 33CC111E2044C6BF0003C045 /* ShellScript */ = { + isa = PBXShellScriptBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + inputFileListPaths = ( + Flutter/ephemeral/FlutterInputs.xcfilelist, + ); + inputPaths = ( + Flutter/ephemeral/tripwire, + ); + outputFileListPaths = ( + Flutter/ephemeral/FlutterOutputs.xcfilelist, + ); + outputPaths = ( + ); + runOnlyForDeploymentPostprocessing = 0; + shellPath = /bin/sh; + shellScript = "\"$FLUTTER_ROOT\"/packages/flutter_tools/bin/macos_assemble.sh && touch Flutter/ephemeral/tripwire"; + }; +/* End PBXShellScriptBuildPhase section */ + +/* Begin PBXSourcesBuildPhase section */ + 33CC10E92044A3C60003C045 /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + 33CC11132044BFA00003C045 /* MainFlutterWindow.swift in Sources */, + 33CC10F12044A3C60003C045 /* AppDelegate.swift in Sources */, + 335BBD1B22A9A15E00E9071D /* GeneratedPluginRegistrant.swift in Sources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXSourcesBuildPhase section */ + +/* Begin PBXTargetDependency section */ + 33CC11202044C79F0003C045 /* PBXTargetDependency */ = { + isa = PBXTargetDependency; + target = 33CC111A2044C6BA0003C045 /* Flutter Assemble */; + targetProxy = 33CC111F2044C79F0003C045 /* PBXContainerItemProxy */; + }; +/* End PBXTargetDependency section */ + +/* Begin PBXVariantGroup section */ + 33CC10F42044A3C60003C045 /* MainMenu.xib */ = { + isa = PBXVariantGroup; + children = ( + 33CC10F52044A3C60003C045 /* Base */, + ); + name = MainMenu.xib; + path = Runner; + sourceTree = ""; + }; +/* End PBXVariantGroup section */ + +/* Begin XCBuildConfiguration section */ + 338D0CE9231458BD00FA5F75 /* Profile */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = 7AFA3C8E1D35360C0083082E /* Release.xcconfig */; + buildSettings = { + ALWAYS_SEARCH_USER_PATHS = NO; + CLANG_ANALYZER_NONNULL = YES; + CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE; + CLANG_CXX_LANGUAGE_STANDARD = "gnu++14"; + CLANG_CXX_LIBRARY = "libc++"; + CLANG_ENABLE_MODULES = YES; + CLANG_ENABLE_OBJC_ARC = YES; + CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; + CLANG_WARN_BOOL_CONVERSION = YES; + CLANG_WARN_CONSTANT_CONVERSION = YES; + CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; + CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; + CLANG_WARN_DOCUMENTATION_COMMENTS = YES; + CLANG_WARN_EMPTY_BODY = YES; + CLANG_WARN_ENUM_CONVERSION = YES; + CLANG_WARN_INFINITE_RECURSION = YES; + CLANG_WARN_INT_CONVERSION = YES; + CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; + CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; + CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; + CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; + CLANG_WARN_SUSPICIOUS_MOVE = YES; + CODE_SIGN_IDENTITY = "-"; + COPY_PHASE_STRIP = NO; + DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; + ENABLE_NS_ASSERTIONS = NO; + ENABLE_STRICT_OBJC_MSGSEND = YES; + GCC_C_LANGUAGE_STANDARD = gnu11; + GCC_NO_COMMON_BLOCKS = YES; + GCC_WARN_64_TO_32_BIT_CONVERSION = YES; + GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; + GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; + GCC_WARN_UNUSED_FUNCTION = YES; + GCC_WARN_UNUSED_VARIABLE = YES; + MACOSX_DEPLOYMENT_TARGET = 10.11; + MTL_ENABLE_DEBUG_INFO = NO; + SDKROOT = macosx; + SWIFT_COMPILATION_MODE = wholemodule; + SWIFT_OPTIMIZATION_LEVEL = "-O"; + }; + name = Profile; + }; + 338D0CEA231458BD00FA5F75 /* Profile */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = 33E5194F232828860026EE4D /* AppInfo.xcconfig */; + buildSettings = { + ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; + CLANG_ENABLE_MODULES = YES; + CODE_SIGN_ENTITLEMENTS = Runner/DebugProfile.entitlements; + CODE_SIGN_STYLE = Automatic; + COMBINE_HIDPI_IMAGES = YES; + INFOPLIST_FILE = Runner/Info.plist; + LD_RUNPATH_SEARCH_PATHS = ( + "$(inherited)", + "@executable_path/../Frameworks", + ); + PROVISIONING_PROFILE_SPECIFIER = ""; + SWIFT_VERSION = 5.0; + }; + name = Profile; + }; + 338D0CEB231458BD00FA5F75 /* Profile */ = { + isa = XCBuildConfiguration; + buildSettings = { + CODE_SIGN_STYLE = Manual; + PRODUCT_NAME = "$(TARGET_NAME)"; + }; + name = Profile; + }; + 33CC10F92044A3C60003C045 /* Debug */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = 9740EEB21CF90195004384FC /* Debug.xcconfig */; + buildSettings = { + ALWAYS_SEARCH_USER_PATHS = NO; + CLANG_ANALYZER_NONNULL = YES; + CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE; + CLANG_CXX_LANGUAGE_STANDARD = "gnu++14"; + CLANG_CXX_LIBRARY = "libc++"; + CLANG_ENABLE_MODULES = YES; + CLANG_ENABLE_OBJC_ARC = YES; + CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; + CLANG_WARN_BOOL_CONVERSION = YES; + CLANG_WARN_CONSTANT_CONVERSION = YES; + CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; + CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; + CLANG_WARN_DOCUMENTATION_COMMENTS = YES; + CLANG_WARN_EMPTY_BODY = YES; + CLANG_WARN_ENUM_CONVERSION = YES; + CLANG_WARN_INFINITE_RECURSION = YES; + CLANG_WARN_INT_CONVERSION = YES; + CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; + CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; + CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; + CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; + CLANG_WARN_SUSPICIOUS_MOVE = YES; + CODE_SIGN_IDENTITY = "-"; + COPY_PHASE_STRIP = NO; + DEBUG_INFORMATION_FORMAT = dwarf; + ENABLE_STRICT_OBJC_MSGSEND = YES; + ENABLE_TESTABILITY = YES; + GCC_C_LANGUAGE_STANDARD = gnu11; + GCC_DYNAMIC_NO_PIC = NO; + GCC_NO_COMMON_BLOCKS = YES; + GCC_OPTIMIZATION_LEVEL = 0; + GCC_PREPROCESSOR_DEFINITIONS = ( + "DEBUG=1", + "$(inherited)", + ); + GCC_WARN_64_TO_32_BIT_CONVERSION = YES; + GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; + GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; + GCC_WARN_UNUSED_FUNCTION = YES; + GCC_WARN_UNUSED_VARIABLE = YES; + MACOSX_DEPLOYMENT_TARGET = 10.11; + MTL_ENABLE_DEBUG_INFO = YES; + ONLY_ACTIVE_ARCH = YES; + SDKROOT = macosx; + SWIFT_ACTIVE_COMPILATION_CONDITIONS = DEBUG; + SWIFT_OPTIMIZATION_LEVEL = "-Onone"; + }; + name = Debug; + }; + 33CC10FA2044A3C60003C045 /* Release */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = 7AFA3C8E1D35360C0083082E /* Release.xcconfig */; + buildSettings = { + ALWAYS_SEARCH_USER_PATHS = NO; + CLANG_ANALYZER_NONNULL = YES; + CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE; + CLANG_CXX_LANGUAGE_STANDARD = "gnu++14"; + CLANG_CXX_LIBRARY = "libc++"; + CLANG_ENABLE_MODULES = YES; + CLANG_ENABLE_OBJC_ARC = YES; + CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; + CLANG_WARN_BOOL_CONVERSION = YES; + CLANG_WARN_CONSTANT_CONVERSION = YES; + CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; + CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; + CLANG_WARN_DOCUMENTATION_COMMENTS = YES; + CLANG_WARN_EMPTY_BODY = YES; + CLANG_WARN_ENUM_CONVERSION = YES; + CLANG_WARN_INFINITE_RECURSION = YES; + CLANG_WARN_INT_CONVERSION = YES; + CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; + CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; + CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; + CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; + CLANG_WARN_SUSPICIOUS_MOVE = YES; + CODE_SIGN_IDENTITY = "-"; + COPY_PHASE_STRIP = NO; + DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; + ENABLE_NS_ASSERTIONS = NO; + ENABLE_STRICT_OBJC_MSGSEND = YES; + GCC_C_LANGUAGE_STANDARD = gnu11; + GCC_NO_COMMON_BLOCKS = YES; + GCC_WARN_64_TO_32_BIT_CONVERSION = YES; + GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; + GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; + GCC_WARN_UNUSED_FUNCTION = YES; + GCC_WARN_UNUSED_VARIABLE = YES; + MACOSX_DEPLOYMENT_TARGET = 10.11; + MTL_ENABLE_DEBUG_INFO = NO; + SDKROOT = macosx; + SWIFT_COMPILATION_MODE = wholemodule; + SWIFT_OPTIMIZATION_LEVEL = "-O"; + }; + name = Release; + }; + 33CC10FC2044A3C60003C045 /* Debug */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = 33E5194F232828860026EE4D /* AppInfo.xcconfig */; + buildSettings = { + ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; + CLANG_ENABLE_MODULES = YES; + CODE_SIGN_ENTITLEMENTS = Runner/DebugProfile.entitlements; + CODE_SIGN_STYLE = Automatic; + COMBINE_HIDPI_IMAGES = YES; + INFOPLIST_FILE = Runner/Info.plist; + LD_RUNPATH_SEARCH_PATHS = ( + "$(inherited)", + "@executable_path/../Frameworks", + ); + PROVISIONING_PROFILE_SPECIFIER = ""; + SWIFT_OPTIMIZATION_LEVEL = "-Onone"; + SWIFT_VERSION = 5.0; + }; + name = Debug; + }; + 33CC10FD2044A3C60003C045 /* Release */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = 33E5194F232828860026EE4D /* AppInfo.xcconfig */; + buildSettings = { + ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; + CLANG_ENABLE_MODULES = YES; + CODE_SIGN_ENTITLEMENTS = Runner/Release.entitlements; + CODE_SIGN_STYLE = Automatic; + COMBINE_HIDPI_IMAGES = YES; + INFOPLIST_FILE = Runner/Info.plist; + LD_RUNPATH_SEARCH_PATHS = ( + "$(inherited)", + "@executable_path/../Frameworks", + ); + PROVISIONING_PROFILE_SPECIFIER = ""; + SWIFT_VERSION = 5.0; + }; + name = Release; + }; + 33CC111C2044C6BA0003C045 /* Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + CODE_SIGN_STYLE = Manual; + PRODUCT_NAME = "$(TARGET_NAME)"; + }; + name = Debug; + }; + 33CC111D2044C6BA0003C045 /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + CODE_SIGN_STYLE = Automatic; + PRODUCT_NAME = "$(TARGET_NAME)"; + }; + name = Release; + }; +/* End XCBuildConfiguration section */ + +/* Begin XCConfigurationList section */ + 33CC10E82044A3C60003C045 /* Build configuration list for PBXProject "Runner" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 33CC10F92044A3C60003C045 /* Debug */, + 33CC10FA2044A3C60003C045 /* Release */, + 338D0CE9231458BD00FA5F75 /* Profile */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; + 33CC10FB2044A3C60003C045 /* Build configuration list for PBXNativeTarget "Runner" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 33CC10FC2044A3C60003C045 /* Debug */, + 33CC10FD2044A3C60003C045 /* Release */, + 338D0CEA231458BD00FA5F75 /* Profile */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; + 33CC111B2044C6BA0003C045 /* Build configuration list for PBXAggregateTarget "Flutter Assemble" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 33CC111C2044C6BA0003C045 /* Debug */, + 33CC111D2044C6BA0003C045 /* Release */, + 338D0CEB231458BD00FA5F75 /* Profile */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; +/* End XCConfigurationList section */ + }; + rootObject = 33CC10E52044A3C60003C045 /* Project object */; +} diff --git a/siro_rider/packages/get/example/macos/Runner.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist b/siro_rider/packages/get/example/macos/Runner.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist new file mode 100644 index 0000000..18d9810 --- /dev/null +++ b/siro_rider/packages/get/example/macos/Runner.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist @@ -0,0 +1,8 @@ + + + + + IDEDidComputeMac32BitWarning + + + diff --git a/siro_rider/packages/get/example/macos/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme b/siro_rider/packages/get/example/macos/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme new file mode 100644 index 0000000..ae8ff59 --- /dev/null +++ b/siro_rider/packages/get/example/macos/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme @@ -0,0 +1,89 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/siro_rider/packages/get/example/macos/Runner.xcworkspace/contents.xcworkspacedata b/siro_rider/packages/get/example/macos/Runner.xcworkspace/contents.xcworkspacedata new file mode 100644 index 0000000..1d526a1 --- /dev/null +++ b/siro_rider/packages/get/example/macos/Runner.xcworkspace/contents.xcworkspacedata @@ -0,0 +1,7 @@ + + + + + diff --git a/siro_rider/packages/get/example/macos/Runner.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist b/siro_rider/packages/get/example/macos/Runner.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist new file mode 100644 index 0000000..18d9810 --- /dev/null +++ b/siro_rider/packages/get/example/macos/Runner.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist @@ -0,0 +1,8 @@ + + + + + IDEDidComputeMac32BitWarning + + + diff --git a/siro_rider/packages/get/example/macos/Runner/AppDelegate.swift b/siro_rider/packages/get/example/macos/Runner/AppDelegate.swift new file mode 100644 index 0000000..d53ef64 --- /dev/null +++ b/siro_rider/packages/get/example/macos/Runner/AppDelegate.swift @@ -0,0 +1,9 @@ +import Cocoa +import FlutterMacOS + +@NSApplicationMain +class AppDelegate: FlutterAppDelegate { + override func applicationShouldTerminateAfterLastWindowClosed(_ sender: NSApplication) -> Bool { + return true + } +} diff --git a/siro_rider/packages/get/example/macos/Runner/Assets.xcassets/AppIcon.appiconset/Contents.json b/siro_rider/packages/get/example/macos/Runner/Assets.xcassets/AppIcon.appiconset/Contents.json new file mode 100644 index 0000000..a2ec33f --- /dev/null +++ b/siro_rider/packages/get/example/macos/Runner/Assets.xcassets/AppIcon.appiconset/Contents.json @@ -0,0 +1,68 @@ +{ + "images" : [ + { + "size" : "16x16", + "idiom" : "mac", + "filename" : "app_icon_16.png", + "scale" : "1x" + }, + { + "size" : "16x16", + "idiom" : "mac", + "filename" : "app_icon_32.png", + "scale" : "2x" + }, + { + "size" : "32x32", + "idiom" : "mac", + "filename" : "app_icon_32.png", + "scale" : "1x" + }, + { + "size" : "32x32", + "idiom" : "mac", + "filename" : "app_icon_64.png", + "scale" : "2x" + }, + { + "size" : "128x128", + "idiom" : "mac", + "filename" : "app_icon_128.png", + "scale" : "1x" + }, + { + "size" : "128x128", + "idiom" : "mac", + "filename" : "app_icon_256.png", + "scale" : "2x" + }, + { + "size" : "256x256", + "idiom" : "mac", + "filename" : "app_icon_256.png", + "scale" : "1x" + }, + { + "size" : "256x256", + "idiom" : "mac", + "filename" : "app_icon_512.png", + "scale" : "2x" + }, + { + "size" : "512x512", + "idiom" : "mac", + "filename" : "app_icon_512.png", + "scale" : "1x" + }, + { + "size" : "512x512", + "idiom" : "mac", + "filename" : "app_icon_1024.png", + "scale" : "2x" + } + ], + "info" : { + "version" : 1, + "author" : "xcode" + } +} diff --git a/siro_rider/packages/get/example/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_1024.png b/siro_rider/packages/get/example/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_1024.png new file mode 100644 index 0000000..3c4935a Binary files /dev/null and b/siro_rider/packages/get/example/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_1024.png differ diff --git a/siro_rider/packages/get/example/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_128.png b/siro_rider/packages/get/example/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_128.png new file mode 100644 index 0000000..ed4cc16 Binary files /dev/null and b/siro_rider/packages/get/example/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_128.png differ diff --git a/siro_rider/packages/get/example/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_16.png b/siro_rider/packages/get/example/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_16.png new file mode 100644 index 0000000..483be61 Binary files /dev/null and b/siro_rider/packages/get/example/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_16.png differ diff --git a/siro_rider/packages/get/example/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_256.png b/siro_rider/packages/get/example/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_256.png new file mode 100644 index 0000000..bcbf36d Binary files /dev/null and b/siro_rider/packages/get/example/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_256.png differ diff --git a/siro_rider/packages/get/example/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_32.png b/siro_rider/packages/get/example/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_32.png new file mode 100644 index 0000000..9c0a652 Binary files /dev/null and b/siro_rider/packages/get/example/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_32.png differ diff --git a/siro_rider/packages/get/example/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_512.png b/siro_rider/packages/get/example/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_512.png new file mode 100644 index 0000000..e71a726 Binary files /dev/null and b/siro_rider/packages/get/example/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_512.png differ diff --git a/siro_rider/packages/get/example/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_64.png b/siro_rider/packages/get/example/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_64.png new file mode 100644 index 0000000..8a31fe2 Binary files /dev/null and b/siro_rider/packages/get/example/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_64.png differ diff --git a/siro_rider/packages/get/example/macos/Runner/Base.lproj/MainMenu.xib b/siro_rider/packages/get/example/macos/Runner/Base.lproj/MainMenu.xib new file mode 100644 index 0000000..537341a --- /dev/null +++ b/siro_rider/packages/get/example/macos/Runner/Base.lproj/MainMenu.xib @@ -0,0 +1,339 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/siro_rider/packages/get/example/macos/Runner/Configs/AppInfo.xcconfig b/siro_rider/packages/get/example/macos/Runner/Configs/AppInfo.xcconfig new file mode 100644 index 0000000..cf9be60 --- /dev/null +++ b/siro_rider/packages/get/example/macos/Runner/Configs/AppInfo.xcconfig @@ -0,0 +1,14 @@ +// Application-level settings for the Runner target. +// +// This may be replaced with something auto-generated from metadata (e.g., pubspec.yaml) in the +// future. If not, the values below would default to using the project name when this becomes a +// 'flutter create' template. + +// The application's name. By default this is also the title of the Flutter window. +PRODUCT_NAME = example + +// The application's bundle identifier +PRODUCT_BUNDLE_IDENTIFIER = com.example.example + +// The copyright displayed in application information +PRODUCT_COPYRIGHT = Copyright © 2021 com.example. All rights reserved. diff --git a/siro_rider/packages/get/example/macos/Runner/Configs/Debug.xcconfig b/siro_rider/packages/get/example/macos/Runner/Configs/Debug.xcconfig new file mode 100644 index 0000000..36b0fd9 --- /dev/null +++ b/siro_rider/packages/get/example/macos/Runner/Configs/Debug.xcconfig @@ -0,0 +1,2 @@ +#include "../../Flutter/Flutter-Debug.xcconfig" +#include "Warnings.xcconfig" diff --git a/siro_rider/packages/get/example/macos/Runner/Configs/Release.xcconfig b/siro_rider/packages/get/example/macos/Runner/Configs/Release.xcconfig new file mode 100644 index 0000000..dff4f49 --- /dev/null +++ b/siro_rider/packages/get/example/macos/Runner/Configs/Release.xcconfig @@ -0,0 +1,2 @@ +#include "../../Flutter/Flutter-Release.xcconfig" +#include "Warnings.xcconfig" diff --git a/siro_rider/packages/get/example/macos/Runner/Configs/Warnings.xcconfig b/siro_rider/packages/get/example/macos/Runner/Configs/Warnings.xcconfig new file mode 100644 index 0000000..42bcbf4 --- /dev/null +++ b/siro_rider/packages/get/example/macos/Runner/Configs/Warnings.xcconfig @@ -0,0 +1,13 @@ +WARNING_CFLAGS = -Wall -Wconditional-uninitialized -Wnullable-to-nonnull-conversion -Wmissing-method-return-type -Woverlength-strings +GCC_WARN_UNDECLARED_SELECTOR = YES +CLANG_UNDEFINED_BEHAVIOR_SANITIZER_NULLABILITY = YES +CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE +CLANG_WARN__DUPLICATE_METHOD_MATCH = YES +CLANG_WARN_PRAGMA_PACK = YES +CLANG_WARN_STRICT_PROTOTYPES = YES +CLANG_WARN_COMMA = YES +GCC_WARN_STRICT_SELECTOR_MATCH = YES +CLANG_WARN_OBJC_REPEATED_USE_OF_WEAK = YES +CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES +GCC_WARN_SHADOW = YES +CLANG_WARN_UNREACHABLE_CODE = YES diff --git a/siro_rider/packages/get/example/macos/Runner/DebugProfile.entitlements b/siro_rider/packages/get/example/macos/Runner/DebugProfile.entitlements new file mode 100644 index 0000000..dddb8a3 --- /dev/null +++ b/siro_rider/packages/get/example/macos/Runner/DebugProfile.entitlements @@ -0,0 +1,12 @@ + + + + + com.apple.security.app-sandbox + + com.apple.security.cs.allow-jit + + com.apple.security.network.server + + + diff --git a/siro_rider/packages/get/example/macos/Runner/Info.plist b/siro_rider/packages/get/example/macos/Runner/Info.plist new file mode 100644 index 0000000..4789daa --- /dev/null +++ b/siro_rider/packages/get/example/macos/Runner/Info.plist @@ -0,0 +1,32 @@ + + + + + CFBundleDevelopmentRegion + $(DEVELOPMENT_LANGUAGE) + CFBundleExecutable + $(EXECUTABLE_NAME) + CFBundleIconFile + + CFBundleIdentifier + $(PRODUCT_BUNDLE_IDENTIFIER) + CFBundleInfoDictionaryVersion + 6.0 + CFBundleName + $(PRODUCT_NAME) + CFBundlePackageType + APPL + CFBundleShortVersionString + $(FLUTTER_BUILD_NAME) + CFBundleVersion + $(FLUTTER_BUILD_NUMBER) + LSMinimumSystemVersion + $(MACOSX_DEPLOYMENT_TARGET) + NSHumanReadableCopyright + $(PRODUCT_COPYRIGHT) + NSMainNibFile + MainMenu + NSPrincipalClass + NSApplication + + diff --git a/siro_rider/packages/get/example/macos/Runner/MainFlutterWindow.swift b/siro_rider/packages/get/example/macos/Runner/MainFlutterWindow.swift new file mode 100644 index 0000000..2722837 --- /dev/null +++ b/siro_rider/packages/get/example/macos/Runner/MainFlutterWindow.swift @@ -0,0 +1,15 @@ +import Cocoa +import FlutterMacOS + +class MainFlutterWindow: NSWindow { + override func awakeFromNib() { + let flutterViewController = FlutterViewController.init() + let windowFrame = self.frame + self.contentViewController = flutterViewController + self.setFrame(windowFrame, display: true) + + RegisterGeneratedPlugins(registry: flutterViewController) + + super.awakeFromNib() + } +} diff --git a/siro_rider/packages/get/example/macos/Runner/Release.entitlements b/siro_rider/packages/get/example/macos/Runner/Release.entitlements new file mode 100644 index 0000000..852fa1a --- /dev/null +++ b/siro_rider/packages/get/example/macos/Runner/Release.entitlements @@ -0,0 +1,8 @@ + + + + + com.apple.security.app-sandbox + + + diff --git a/siro_rider/packages/get/example/pubspec.lock b/siro_rider/packages/get/example/pubspec.lock new file mode 100644 index 0000000..cc86ddf --- /dev/null +++ b/siro_rider/packages/get/example/pubspec.lock @@ -0,0 +1,196 @@ +# Generated by pub +# See https://dart.dev/tools/pub/glossary#lockfile +packages: + async: + dependency: transitive + description: + name: async + sha256: e2eb0491ba5ddb6177742d2da23904574082139b07c1e33b8503b9f46f3e1a37 + url: "https://pub.dev" + source: hosted + version: "2.13.1" + boolean_selector: + dependency: transitive + description: + name: boolean_selector + sha256: "8aab1771e1243a5063b8b0ff68042d67334e3feab9e95b9490f9a6ebf73b42ea" + url: "https://pub.dev" + source: hosted + version: "2.1.2" + characters: + dependency: transitive + description: + name: characters + sha256: faf38497bda5ead2a8c7615f4f7939df04333478bf32e4173fcb06d428b5716b + url: "https://pub.dev" + source: hosted + version: "1.4.1" + clock: + dependency: transitive + description: + name: clock + sha256: fddb70d9b5277016c77a80201021d40a2247104d9f4aa7bab7157b7e3f05b84b + url: "https://pub.dev" + source: hosted + version: "1.1.2" + collection: + dependency: transitive + description: + name: collection + sha256: "2f5709ae4d3d59dd8f7cd309b4e023046b57d8a6c82130785d2b0e5868084e76" + url: "https://pub.dev" + source: hosted + version: "1.19.1" + fake_async: + dependency: transitive + description: + name: fake_async + sha256: "5368f224a74523e8d2e7399ea1638b37aecfca824a3cc4dfdf77bf1fa905ac44" + url: "https://pub.dev" + source: hosted + version: "1.3.3" + flutter: + dependency: "direct main" + description: flutter + source: sdk + version: "0.0.0" + flutter_test: + dependency: "direct dev" + description: flutter + source: sdk + version: "0.0.0" + get: + dependency: "direct main" + description: + path: ".." + relative: true + source: path + version: "4.6.5" + leak_tracker: + dependency: transitive + description: + name: leak_tracker + sha256: "33e2e26bdd85a0112ec15400c8cbffea70d0f9c3407491f672a2fad47915e2de" + url: "https://pub.dev" + source: hosted + version: "11.0.2" + leak_tracker_flutter_testing: + dependency: transitive + description: + name: leak_tracker_flutter_testing + sha256: "1dbc140bb5a23c75ea9c4811222756104fbcd1a27173f0c34ca01e16bea473c1" + url: "https://pub.dev" + source: hosted + version: "3.0.10" + leak_tracker_testing: + dependency: transitive + description: + name: leak_tracker_testing + sha256: "8d5a2d49f4a66b49744b23b018848400d23e54caf9463f4eb20df3eb8acb2eb1" + url: "https://pub.dev" + source: hosted + version: "3.0.2" + matcher: + dependency: transitive + description: + name: matcher + sha256: "12956d0ad8390bbcc63ca2e1469c0619946ccb52809807067a7020d57e647aa6" + url: "https://pub.dev" + source: hosted + version: "0.12.18" + material_color_utilities: + dependency: transitive + description: + name: material_color_utilities + sha256: "9c337007e82b1889149c82ed242ed1cb24a66044e30979c44912381e9be4c48b" + url: "https://pub.dev" + source: hosted + version: "0.13.0" + meta: + dependency: transitive + description: + name: meta + sha256: "23f08335362185a5ea2ad3a4e597f1375e78bce8a040df5c600c8d3552ef2394" + url: "https://pub.dev" + source: hosted + version: "1.17.0" + path: + dependency: transitive + description: + name: path + sha256: "75cca69d1490965be98c73ceaea117e8a04dd21217b37b292c9ddbec0d955bc5" + url: "https://pub.dev" + source: hosted + version: "1.9.1" + sky_engine: + dependency: transitive + description: flutter + source: sdk + version: "0.0.0" + source_span: + dependency: transitive + description: + name: source_span + sha256: "56a02f1f4cd1a2d96303c0144c93bd6d909eea6bee6bf5a0e0b685edbd4c47ab" + url: "https://pub.dev" + source: hosted + version: "1.10.2" + stack_trace: + dependency: transitive + description: + name: stack_trace + sha256: "8b27215b45d22309b5cddda1aa2b19bdfec9df0e765f2de506401c071d38d1b1" + url: "https://pub.dev" + source: hosted + version: "1.12.1" + stream_channel: + dependency: transitive + description: + name: stream_channel + sha256: "969e04c80b8bcdf826f8f16579c7b14d780458bd97f56d107d3950fdbeef059d" + url: "https://pub.dev" + source: hosted + version: "2.1.4" + string_scanner: + dependency: transitive + description: + name: string_scanner + sha256: "921cd31725b72fe181906c6a94d987c78e3b98c2e205b397ea399d4054872b43" + url: "https://pub.dev" + source: hosted + version: "1.4.1" + term_glyph: + dependency: transitive + description: + name: term_glyph + sha256: "7f554798625ea768a7518313e58f83891c7f5024f88e46e7182a4558850a4b8e" + url: "https://pub.dev" + source: hosted + version: "1.2.2" + test_api: + dependency: transitive + description: + name: test_api + sha256: "93167629bfc610f71560ab9312acdda4959de4df6fac7492c89ff0d3886f6636" + url: "https://pub.dev" + source: hosted + version: "0.7.9" + vector_math: + dependency: transitive + description: + name: vector_math + sha256: d530bd74fea330e6e364cda7a85019c434070188383e1cd8d9777ee586914c5b + url: "https://pub.dev" + source: hosted + version: "2.2.0" + vm_service: + dependency: transitive + description: + name: vm_service + sha256: "046d3928e16fa4dc46e8350415661755ab759d9fc97fc21b5ab295f71e4f0499" + url: "https://pub.dev" + source: hosted + version: "15.1.0" +sdks: + dart: ">=3.9.0-0 <4.0.0" + flutter: ">=3.18.0-18.0.pre.54" diff --git a/siro_rider/packages/get/example/pubspec.yaml b/siro_rider/packages/get/example/pubspec.yaml new file mode 100644 index 0000000..0ed8552 --- /dev/null +++ b/siro_rider/packages/get/example/pubspec.yaml @@ -0,0 +1,72 @@ +name: get_demo +description: A new Flutter project. + +# The following line prevents the package from being accidentally published to +# pub.dev using `pub publish`. This is preferred for private packages. +publish_to: "none" # Remove this line if you wish to publish to pub.dev + +# The following defines the version and build number for your application. +# A version number is three numbers separated by dots, like 1.2.43 +# followed by an optional build number separated by a +. +# Both the version and the builder number may be overridden in flutter +# build by specifying --build-name and --build-number, respectively. +# In Android, build-name is used as versionName while build-number used as versionCode. +# Read more about Android versioning at https://developer.android.com/studio/publish/versioning +# In iOS, build-name is used as CFBundleShortVersionString while build-number used as CFBundleVersion. +# Read more about iOS versioning at +# https://developer.apple.com/library/archive/documentation/General/Reference/InfoPlistKeyReference/Articles/CoreFoundationKeys.html +version: 1.0.0+1 + +environment: + sdk: ">=2.12.0 <3.0.0" + +dependencies: + flutter: + sdk: flutter + + # The following adds the Cupertino Icons font to your application. + # Use with the CupertinoIcons class for iOS style icons. + get: + path: ../ + #get_test: ^3.13.3 + +dev_dependencies: + flutter_test: + sdk: flutter + +# For information on the generic Dart part of this file, see the +# following page: https://dart.dev/tools/pub/pubspec + +# The following section is specific to Flutter. +flutter: + # The following line ensures that the Material Icons font is + # included with your application, so that you can use the icons in + # the material Icons class. + uses-material-design: true + # To add assets to your application, add an assets section, like this: + # assets: + # - images/a_dot_burr.jpeg + # - images/a_dot_ham.jpeg + # An image asset can refer to one or more resolution-specific "variants", see + # https://flutter.dev/assets-and-images/#resolution-aware. + # For details regarding adding assets from package dependencies, see + # https://flutter.dev/assets-and-images/#from-packages + # To add custom fonts to your application, add a fonts section here, + # in this "flutter" section. Each entry in this list should have a + # "family" key with the font family name, and a "fonts" key with a + # list giving the asset and other descriptors for the font. For + # example: + # fonts: + # - family: Schyler + # fonts: + # - asset: fonts/Schyler-Regular.ttf + # - asset: fonts/Schyler-Italic.ttf + # style: italic + # - family: Trajan Pro + # fonts: + # - asset: fonts/TrajanPro.ttf + # - asset: fonts/TrajanPro_Bold.ttf + # weight: 700 + # + # For details regarding fonts from package dependencies, + # see https://flutter.dev/custom-fonts/#from-packages \ No newline at end of file diff --git a/siro_rider/packages/get/example/test/main_test.dart b/siro_rider/packages/get/example/test/main_test.dart new file mode 100644 index 0000000..ca19ed9 --- /dev/null +++ b/siro_rider/packages/get/example/test/main_test.dart @@ -0,0 +1,175 @@ +import 'dart:io'; +import 'dart:math'; +import 'package:flutter/material.dart'; +import 'package:flutter_test/flutter_test.dart'; +import 'package:get/get.dart'; +import 'package:get_demo/pages/home/domain/adapters/repository_adapter.dart'; +import 'package:get_demo/pages/home/domain/entity/cases_model.dart'; +import 'package:get_demo/pages/home/presentation/controllers/home_controller.dart'; +// import 'package:get_demo/routes/app_pages.dart'; +// import 'package:get_test/get_test.dart'; +import 'package:matcher/matcher.dart' as m; + +class MockRepository implements IHomeRepository { + @override + Future getCases() async { + await Future.delayed(Duration(milliseconds: 100)); + + if (Random().nextBool()) { + return CasesModel( + global: Global( + totalDeaths: 100, + totalConfirmed: 200, + date: DateTime.now(), + newConfirmed: 0, + newDeaths: 0, + newRecovered: 0, + totalRecovered: 0), + countries: [], + date: DateTime.now(), + id: '', + message: '', + ); + } + + return Future.error('error'); + } +} + +void main() { + WidgetsFlutterBinding.ensureInitialized(); + setUpAll(() => HttpOverrides.global = null); + final binding = BindingsBuilder(() { + Get.lazyPut(() => MockRepository()); + Get.lazyPut( + () => HomeController(homeRepository: Get.find())); + }); + + test('Test Binding', () { + expect(Get.isPrepared(), false); + expect(Get.isPrepared(), false); + + /// test you Binding class with BindingsBuilder + binding.builder(); + + expect(Get.isPrepared(), true); + expect(Get.isPrepared(), true); + + Get.reset(); + }); + test('Test Controller', () async { + /// Controller can't be on memory + expect(() => Get.find(), throwsA(m.TypeMatcher())); + + /// build Binding + binding.builder(); + + /// recover your controller + final controller = Get.find(); + + /// check if onInit was called + expect(controller.initialized, true); + + /// check initial Status + expect(controller.status.isLoading, true); + + /// await time request + await Future.delayed(Duration(milliseconds: 100)); + + if (controller.status.isError) { + expect(controller.state, null); + } + + if (controller.status.isSuccess) { + expect(controller.state!.global.totalDeaths, 100); + expect(controller.state!.global.totalConfirmed, 200); + } + }); + + test('ever', () async { + final count = ''.obs; + var result = ''; + ever(count, (value) { + result = value; + }); + count.value = '1'; + expect('1', result); + }); + + /// Tests with GetTests + /// TEMPORARILY REMOVED from the null-safetym branch as + /// get_test is not yet null safety. + /* getTest( + "test description", + getPages: AppPages.routes, + initialRoute: AppPages.INITIAL, + widgetTest: (tester) async { + expect('/home', Get.currentRoute); + + Get.toNamed('/home/country'); + expect('/home/country', Get.currentRoute); + + Get.toNamed('/home/country/details'); + expect('/home/country/details', Get.currentRoute); + + Get.back(); + + expect('/home/country', Get.currentRoute); + }, + ); + + testGetX( + 'GetX test', + widget: GetX( + init: Controller(), + builder: (controller) { + return Text("ban:${controller.count}"); + }, + ), + test: (e) { + expect(find.text("ban:0"), findsOneWidget); + }, + ); + + testController( + 'Controller test', + (controller) { + print('controllllllll ${controller.count}'); + }, + controller: Controller(), + onInit: (c) { + c.increment(); + print('onInit'); + }, + onReady: (c) { + print('onReady'); + c.increment(); + }, + onClose: (c) { + print('onClose'); + }, + );*/ +} + +class Controller extends GetxController { + final count = 0.obs; + void increment() => count.value++; + + @override + void onInit() { + print('inittt'); + super.onInit(); + } + + @override + void onReady() { + print('onReady'); + super.onReady(); + } + + @override + void onClose() { + super.onClose(); + print('onClose'); + } +} diff --git a/siro_rider/packages/get/example/web/favicon.png b/siro_rider/packages/get/example/web/favicon.png new file mode 100644 index 0000000..8aaa46a Binary files /dev/null and b/siro_rider/packages/get/example/web/favicon.png differ diff --git a/siro_rider/packages/get/example/web/icons/Icon-192.png b/siro_rider/packages/get/example/web/icons/Icon-192.png new file mode 100644 index 0000000..b749bfe Binary files /dev/null and b/siro_rider/packages/get/example/web/icons/Icon-192.png differ diff --git a/siro_rider/packages/get/example/web/icons/Icon-512.png b/siro_rider/packages/get/example/web/icons/Icon-512.png new file mode 100644 index 0000000..88cfd48 Binary files /dev/null and b/siro_rider/packages/get/example/web/icons/Icon-512.png differ diff --git a/siro_rider/packages/get/example/web/index.html b/siro_rider/packages/get/example/web/index.html new file mode 100644 index 0000000..0081e18 --- /dev/null +++ b/siro_rider/packages/get/example/web/index.html @@ -0,0 +1,98 @@ + + + + + + + + + + + + + + + + + example + + + + + + + diff --git a/siro_rider/packages/get/example/web/manifest.json b/siro_rider/packages/get/example/web/manifest.json new file mode 100644 index 0000000..8c01291 --- /dev/null +++ b/siro_rider/packages/get/example/web/manifest.json @@ -0,0 +1,23 @@ +{ + "name": "example", + "short_name": "example", + "start_url": ".", + "display": "standalone", + "background_color": "#0175C2", + "theme_color": "#0175C2", + "description": "A new Flutter project.", + "orientation": "portrait-primary", + "prefer_related_applications": false, + "icons": [ + { + "src": "icons/Icon-192.png", + "sizes": "192x192", + "type": "image/png" + }, + { + "src": "icons/Icon-512.png", + "sizes": "512x512", + "type": "image/png" + } + ] +} diff --git a/siro_rider/packages/get/example_nav2/README.md b/siro_rider/packages/get/example_nav2/README.md new file mode 100644 index 0000000..a1ffbb2 --- /dev/null +++ b/siro_rider/packages/get/example_nav2/README.md @@ -0,0 +1,16 @@ +# example_nav2 + +A new Flutter project. + +## Getting Started + +This project is a starting point for a Flutter application. + +A few resources to get you started if this is your first Flutter project: + +- [Lab: Write your first Flutter app](https://flutter.dev/docs/get-started/codelab) +- [Cookbook: Useful Flutter samples](https://flutter.dev/docs/cookbook) + +For help getting started with Flutter, view our +[online documentation](https://flutter.dev/docs), which offers tutorials, +samples, guidance on mobile development, and a full API reference. diff --git a/siro_rider/packages/get/example_nav2/android/.gradle/6.7/fileChanges/last-build.bin b/siro_rider/packages/get/example_nav2/android/.gradle/6.7/fileChanges/last-build.bin new file mode 100644 index 0000000..f76dd23 Binary files /dev/null and b/siro_rider/packages/get/example_nav2/android/.gradle/6.7/fileChanges/last-build.bin differ diff --git a/siro_rider/packages/get/example_nav2/android/.gradle/6.7/fileHashes/fileHashes.lock b/siro_rider/packages/get/example_nav2/android/.gradle/6.7/fileHashes/fileHashes.lock new file mode 100644 index 0000000..76a51a0 Binary files /dev/null and b/siro_rider/packages/get/example_nav2/android/.gradle/6.7/fileHashes/fileHashes.lock differ diff --git a/siro_rider/packages/get/example_nav2/android/.gradle/6.7/gc.properties b/siro_rider/packages/get/example_nav2/android/.gradle/6.7/gc.properties new file mode 100644 index 0000000..e69de29 diff --git a/siro_rider/packages/get/example_nav2/android/.gradle/checksums/checksums.lock b/siro_rider/packages/get/example_nav2/android/.gradle/checksums/checksums.lock new file mode 100644 index 0000000..b689017 Binary files /dev/null and b/siro_rider/packages/get/example_nav2/android/.gradle/checksums/checksums.lock differ diff --git a/siro_rider/packages/get/example_nav2/android/.gradle/configuration-cache/gc.properties b/siro_rider/packages/get/example_nav2/android/.gradle/configuration-cache/gc.properties new file mode 100644 index 0000000..e69de29 diff --git a/siro_rider/packages/get/example_nav2/android/.gradle/vcs-1/gc.properties b/siro_rider/packages/get/example_nav2/android/.gradle/vcs-1/gc.properties new file mode 100644 index 0000000..e69de29 diff --git a/siro_rider/packages/get/example_nav2/android/app/build.gradle b/siro_rider/packages/get/example_nav2/android/app/build.gradle new file mode 100644 index 0000000..b07a8f9 --- /dev/null +++ b/siro_rider/packages/get/example_nav2/android/app/build.gradle @@ -0,0 +1,59 @@ +def localProperties = new Properties() +def localPropertiesFile = rootProject.file('local.properties') +if (localPropertiesFile.exists()) { + localPropertiesFile.withReader('UTF-8') { reader -> + localProperties.load(reader) + } +} + +def flutterRoot = localProperties.getProperty('flutter.sdk') +if (flutterRoot == null) { + throw new GradleException("Flutter SDK not found. Define location with flutter.sdk in the local.properties file.") +} + +def flutterVersionCode = localProperties.getProperty('flutter.versionCode') +if (flutterVersionCode == null) { + flutterVersionCode = '1' +} + +def flutterVersionName = localProperties.getProperty('flutter.versionName') +if (flutterVersionName == null) { + flutterVersionName = '1.0' +} + +apply plugin: 'com.android.application' +apply plugin: 'kotlin-android' +apply from: "$flutterRoot/packages/flutter_tools/gradle/flutter.gradle" + +android { + compileSdkVersion 30 + + sourceSets { + main.java.srcDirs += 'src/main/kotlin' + } + + defaultConfig { + // TODO: Specify your own unique Application ID (https://developer.android.com/studio/build/application-id.html). + applicationId "com.get.example_nav2" + minSdkVersion 16 + targetSdkVersion 30 + versionCode flutterVersionCode.toInteger() + versionName flutterVersionName + } + + buildTypes { + release { + // TODO: Add your own signing config for the release build. + // Signing with the debug keys for now, so `flutter run --release` works. + signingConfig signingConfigs.debug + } + } +} + +flutter { + source '../..' +} + +dependencies { + implementation "org.jetbrains.kotlin:kotlin-stdlib-jdk7:$kotlin_version" +} diff --git a/siro_rider/packages/get/example_nav2/android/app/src/debug/AndroidManifest.xml b/siro_rider/packages/get/example_nav2/android/app/src/debug/AndroidManifest.xml new file mode 100644 index 0000000..a508b49 --- /dev/null +++ b/siro_rider/packages/get/example_nav2/android/app/src/debug/AndroidManifest.xml @@ -0,0 +1,7 @@ + + + + diff --git a/siro_rider/packages/get/example_nav2/android/app/src/main/AndroidManifest.xml b/siro_rider/packages/get/example_nav2/android/app/src/main/AndroidManifest.xml new file mode 100644 index 0000000..d4e7bbe --- /dev/null +++ b/siro_rider/packages/get/example_nav2/android/app/src/main/AndroidManifest.xml @@ -0,0 +1,41 @@ + + + + + + + + + + + + + + + + diff --git a/siro_rider/packages/get/example_nav2/android/app/src/main/java/io/flutter/plugins/GeneratedPluginRegistrant.java b/siro_rider/packages/get/example_nav2/android/app/src/main/java/io/flutter/plugins/GeneratedPluginRegistrant.java new file mode 100644 index 0000000..539ab02 --- /dev/null +++ b/siro_rider/packages/get/example_nav2/android/app/src/main/java/io/flutter/plugins/GeneratedPluginRegistrant.java @@ -0,0 +1,19 @@ +package io.flutter.plugins; + +import androidx.annotation.Keep; +import androidx.annotation.NonNull; +import io.flutter.Log; + +import io.flutter.embedding.engine.FlutterEngine; + +/** + * Generated file. Do not edit. + * This file is generated by the Flutter tool based on the + * plugins that support the Android platform. + */ +@Keep +public final class GeneratedPluginRegistrant { + private static final String TAG = "GeneratedPluginRegistrant"; + public static void registerWith(@NonNull FlutterEngine flutterEngine) { + } +} diff --git a/siro_rider/packages/get/example_nav2/android/app/src/main/kotlin/com/get/example_nav2/MainActivity.kt b/siro_rider/packages/get/example_nav2/android/app/src/main/kotlin/com/get/example_nav2/MainActivity.kt new file mode 100644 index 0000000..4b1c5d0 --- /dev/null +++ b/siro_rider/packages/get/example_nav2/android/app/src/main/kotlin/com/get/example_nav2/MainActivity.kt @@ -0,0 +1,6 @@ +package com.get.example_nav2 + +import io.flutter.embedding.android.FlutterActivity + +class MainActivity: FlutterActivity() { +} diff --git a/siro_rider/packages/get/example_nav2/android/app/src/main/res/drawable-v21/launch_background.xml b/siro_rider/packages/get/example_nav2/android/app/src/main/res/drawable-v21/launch_background.xml new file mode 100644 index 0000000..f74085f --- /dev/null +++ b/siro_rider/packages/get/example_nav2/android/app/src/main/res/drawable-v21/launch_background.xml @@ -0,0 +1,12 @@ + + + + + + + + diff --git a/siro_rider/packages/get/example_nav2/android/app/src/main/res/drawable/launch_background.xml b/siro_rider/packages/get/example_nav2/android/app/src/main/res/drawable/launch_background.xml new file mode 100644 index 0000000..304732f --- /dev/null +++ b/siro_rider/packages/get/example_nav2/android/app/src/main/res/drawable/launch_background.xml @@ -0,0 +1,12 @@ + + + + + + + + diff --git a/siro_rider/packages/get/example_nav2/android/app/src/main/res/mipmap-hdpi/ic_launcher.png b/siro_rider/packages/get/example_nav2/android/app/src/main/res/mipmap-hdpi/ic_launcher.png new file mode 100644 index 0000000..db77bb4 Binary files /dev/null and b/siro_rider/packages/get/example_nav2/android/app/src/main/res/mipmap-hdpi/ic_launcher.png differ diff --git a/siro_rider/packages/get/example_nav2/android/app/src/main/res/mipmap-mdpi/ic_launcher.png b/siro_rider/packages/get/example_nav2/android/app/src/main/res/mipmap-mdpi/ic_launcher.png new file mode 100644 index 0000000..17987b7 Binary files /dev/null and b/siro_rider/packages/get/example_nav2/android/app/src/main/res/mipmap-mdpi/ic_launcher.png differ diff --git a/siro_rider/packages/get/example_nav2/android/app/src/main/res/mipmap-xhdpi/ic_launcher.png b/siro_rider/packages/get/example_nav2/android/app/src/main/res/mipmap-xhdpi/ic_launcher.png new file mode 100644 index 0000000..09d4391 Binary files /dev/null and b/siro_rider/packages/get/example_nav2/android/app/src/main/res/mipmap-xhdpi/ic_launcher.png differ diff --git a/siro_rider/packages/get/example_nav2/android/app/src/main/res/mipmap-xxhdpi/ic_launcher.png b/siro_rider/packages/get/example_nav2/android/app/src/main/res/mipmap-xxhdpi/ic_launcher.png new file mode 100644 index 0000000..d5f1c8d Binary files /dev/null and b/siro_rider/packages/get/example_nav2/android/app/src/main/res/mipmap-xxhdpi/ic_launcher.png differ diff --git a/siro_rider/packages/get/example_nav2/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png b/siro_rider/packages/get/example_nav2/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png new file mode 100644 index 0000000..4d6372e Binary files /dev/null and b/siro_rider/packages/get/example_nav2/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png differ diff --git a/siro_rider/packages/get/example_nav2/android/app/src/main/res/values-night/styles.xml b/siro_rider/packages/get/example_nav2/android/app/src/main/res/values-night/styles.xml new file mode 100644 index 0000000..449a9f9 --- /dev/null +++ b/siro_rider/packages/get/example_nav2/android/app/src/main/res/values-night/styles.xml @@ -0,0 +1,18 @@ + + + + + + + diff --git a/siro_rider/packages/get/example_nav2/android/app/src/main/res/values/styles.xml b/siro_rider/packages/get/example_nav2/android/app/src/main/res/values/styles.xml new file mode 100644 index 0000000..d74aa35 --- /dev/null +++ b/siro_rider/packages/get/example_nav2/android/app/src/main/res/values/styles.xml @@ -0,0 +1,18 @@ + + + + + + + diff --git a/siro_rider/packages/get/example_nav2/android/app/src/profile/AndroidManifest.xml b/siro_rider/packages/get/example_nav2/android/app/src/profile/AndroidManifest.xml new file mode 100644 index 0000000..a508b49 --- /dev/null +++ b/siro_rider/packages/get/example_nav2/android/app/src/profile/AndroidManifest.xml @@ -0,0 +1,7 @@ + + + + diff --git a/siro_rider/packages/get/example_nav2/android/build.gradle b/siro_rider/packages/get/example_nav2/android/build.gradle new file mode 100644 index 0000000..9b6ed06 --- /dev/null +++ b/siro_rider/packages/get/example_nav2/android/build.gradle @@ -0,0 +1,29 @@ +buildscript { + ext.kotlin_version = '1.3.50' + repositories { + google() + jcenter() + } + + dependencies { + classpath 'com.android.tools.build:gradle:4.1.0' + classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version" + } +} + +allprojects { + repositories { + google() + jcenter() + } +} + +rootProject.buildDir = '../build' +subprojects { + project.buildDir = "${rootProject.buildDir}/${project.name}" + project.evaluationDependsOn(':app') +} + +task clean(type: Delete) { + delete rootProject.buildDir +} diff --git a/siro_rider/packages/get/example_nav2/android/gradle.properties b/siro_rider/packages/get/example_nav2/android/gradle.properties new file mode 100644 index 0000000..94adc3a --- /dev/null +++ b/siro_rider/packages/get/example_nav2/android/gradle.properties @@ -0,0 +1,3 @@ +org.gradle.jvmargs=-Xmx1536M +android.useAndroidX=true +android.enableJetifier=true diff --git a/siro_rider/packages/get/example_nav2/android/gradle/wrapper/gradle-wrapper.properties b/siro_rider/packages/get/example_nav2/android/gradle/wrapper/gradle-wrapper.properties new file mode 100644 index 0000000..bc6a58a --- /dev/null +++ b/siro_rider/packages/get/example_nav2/android/gradle/wrapper/gradle-wrapper.properties @@ -0,0 +1,6 @@ +#Fri Jun 23 08:50:38 CEST 2017 +distributionBase=GRADLE_USER_HOME +distributionPath=wrapper/dists +zipStoreBase=GRADLE_USER_HOME +zipStorePath=wrapper/dists +distributionUrl=https\://services.gradle.org/distributions/gradle-6.7-all.zip diff --git a/siro_rider/packages/get/example_nav2/android/local.properties b/siro_rider/packages/get/example_nav2/android/local.properties new file mode 100644 index 0000000..6df17b3 --- /dev/null +++ b/siro_rider/packages/get/example_nav2/android/local.properties @@ -0,0 +1,2 @@ +sdk.dir=/Users/hamzaaleghwairyeen/Library/Android/sdk +flutter.sdk=/Users/hamzaaleghwairyeen/flutter \ No newline at end of file diff --git a/siro_rider/packages/get/example_nav2/android/settings.gradle b/siro_rider/packages/get/example_nav2/android/settings.gradle new file mode 100644 index 0000000..44e62bc --- /dev/null +++ b/siro_rider/packages/get/example_nav2/android/settings.gradle @@ -0,0 +1,11 @@ +include ':app' + +def localPropertiesFile = new File(rootProject.projectDir, "local.properties") +def properties = new Properties() + +assert localPropertiesFile.exists() +localPropertiesFile.withReader("UTF-8") { reader -> properties.load(reader) } + +def flutterSdkPath = properties.getProperty("flutter.sdk") +assert flutterSdkPath != null, "flutter.sdk not set in local.properties" +apply from: "$flutterSdkPath/packages/flutter_tools/gradle/app_plugin_loader.gradle" diff --git a/siro_rider/packages/get/example_nav2/ios/Flutter/AppFrameworkInfo.plist b/siro_rider/packages/get/example_nav2/ios/Flutter/AppFrameworkInfo.plist new file mode 100644 index 0000000..9367d48 --- /dev/null +++ b/siro_rider/packages/get/example_nav2/ios/Flutter/AppFrameworkInfo.plist @@ -0,0 +1,26 @@ + + + + + CFBundleDevelopmentRegion + en + CFBundleExecutable + App + CFBundleIdentifier + io.flutter.flutter.app + CFBundleInfoDictionaryVersion + 6.0 + CFBundleName + App + CFBundlePackageType + FMWK + CFBundleShortVersionString + 1.0 + CFBundleSignature + ???? + CFBundleVersion + 1.0 + MinimumOSVersion + 8.0 + + diff --git a/siro_rider/packages/get/example_nav2/ios/Flutter/Debug.xcconfig b/siro_rider/packages/get/example_nav2/ios/Flutter/Debug.xcconfig new file mode 100644 index 0000000..592ceee --- /dev/null +++ b/siro_rider/packages/get/example_nav2/ios/Flutter/Debug.xcconfig @@ -0,0 +1 @@ +#include "Generated.xcconfig" diff --git a/siro_rider/packages/get/example_nav2/ios/Flutter/Generated.xcconfig b/siro_rider/packages/get/example_nav2/ios/Flutter/Generated.xcconfig new file mode 100644 index 0000000..3446f93 --- /dev/null +++ b/siro_rider/packages/get/example_nav2/ios/Flutter/Generated.xcconfig @@ -0,0 +1,14 @@ +// This is a generated file; do not edit or check into version control. +FLUTTER_ROOT=/Users/hamzaaleghwairyeen/flutter +FLUTTER_APPLICATION_PATH=/Users/hamzaaleghwairyeen/development/App/Intaleq/packages/get/example_nav2 +COCOAPODS_PARALLEL_CODE_SIGN=true +FLUTTER_TARGET=lib/main.dart +FLUTTER_BUILD_DIR=build +FLUTTER_BUILD_NAME=1.0.0 +FLUTTER_BUILD_NUMBER=1 +EXCLUDED_ARCHS[sdk=iphonesimulator*]=i386 +EXCLUDED_ARCHS[sdk=iphoneos*]=armv7 +DART_OBFUSCATION=false +TRACK_WIDGET_CREATION=true +TREE_SHAKE_ICONS=false +PACKAGE_CONFIG=.dart_tool/package_config.json diff --git a/siro_rider/packages/get/example_nav2/ios/Flutter/Release.xcconfig b/siro_rider/packages/get/example_nav2/ios/Flutter/Release.xcconfig new file mode 100644 index 0000000..592ceee --- /dev/null +++ b/siro_rider/packages/get/example_nav2/ios/Flutter/Release.xcconfig @@ -0,0 +1 @@ +#include "Generated.xcconfig" diff --git a/siro_rider/packages/get/example_nav2/ios/Flutter/ephemeral/flutter_lldb_helper.py b/siro_rider/packages/get/example_nav2/ios/Flutter/ephemeral/flutter_lldb_helper.py new file mode 100644 index 0000000..a88caf9 --- /dev/null +++ b/siro_rider/packages/get/example_nav2/ios/Flutter/ephemeral/flutter_lldb_helper.py @@ -0,0 +1,32 @@ +# +# Generated file, do not edit. +# + +import lldb + +def handle_new_rx_page(frame: lldb.SBFrame, bp_loc, extra_args, intern_dict): + """Intercept NOTIFY_DEBUGGER_ABOUT_RX_PAGES and touch the pages.""" + base = frame.register["x0"].GetValueAsAddress() + page_len = frame.register["x1"].GetValueAsUnsigned() + + # Note: NOTIFY_DEBUGGER_ABOUT_RX_PAGES will check contents of the + # first page to see if handled it correctly. This makes diagnosing + # misconfiguration (e.g. missing breakpoint) easier. + data = bytearray(page_len) + data[0:8] = b'IHELPED!' + + error = lldb.SBError() + frame.GetThread().GetProcess().WriteMemory(base, data, error) + if not error.Success(): + print(f'Failed to write into {base}[+{page_len}]', error) + return + +def __lldb_init_module(debugger: lldb.SBDebugger, _): + target = debugger.GetDummyTarget() + # Caveat: must use BreakpointCreateByRegEx here and not + # BreakpointCreateByName. For some reasons callback function does not + # get carried over from dummy target for the later. + bp = target.BreakpointCreateByRegex("^NOTIFY_DEBUGGER_ABOUT_RX_PAGES$") + bp.SetScriptCallbackFunction('{}.handle_new_rx_page'.format(__name__)) + bp.SetAutoContinue(True) + print("-- LLDB integration loaded --") diff --git a/siro_rider/packages/get/example_nav2/ios/Flutter/ephemeral/flutter_lldbinit b/siro_rider/packages/get/example_nav2/ios/Flutter/ephemeral/flutter_lldbinit new file mode 100644 index 0000000..e3ba6fb --- /dev/null +++ b/siro_rider/packages/get/example_nav2/ios/Flutter/ephemeral/flutter_lldbinit @@ -0,0 +1,5 @@ +# +# Generated file, do not edit. +# + +command script import --relative-to-command-file flutter_lldb_helper.py diff --git a/siro_rider/packages/get/example_nav2/ios/Flutter/flutter_export_environment.sh b/siro_rider/packages/get/example_nav2/ios/Flutter/flutter_export_environment.sh new file mode 100755 index 0000000..5412a19 --- /dev/null +++ b/siro_rider/packages/get/example_nav2/ios/Flutter/flutter_export_environment.sh @@ -0,0 +1,13 @@ +#!/bin/sh +# This is a generated file; do not edit or check into version control. +export "FLUTTER_ROOT=/Users/hamzaaleghwairyeen/flutter" +export "FLUTTER_APPLICATION_PATH=/Users/hamzaaleghwairyeen/development/App/Intaleq/packages/get/example_nav2" +export "COCOAPODS_PARALLEL_CODE_SIGN=true" +export "FLUTTER_TARGET=lib/main.dart" +export "FLUTTER_BUILD_DIR=build" +export "FLUTTER_BUILD_NAME=1.0.0" +export "FLUTTER_BUILD_NUMBER=1" +export "DART_OBFUSCATION=false" +export "TRACK_WIDGET_CREATION=true" +export "TREE_SHAKE_ICONS=false" +export "PACKAGE_CONFIG=.dart_tool/package_config.json" diff --git a/siro_rider/packages/get/example_nav2/ios/Runner.xcodeproj/project.pbxproj b/siro_rider/packages/get/example_nav2/ios/Runner.xcodeproj/project.pbxproj new file mode 100644 index 0000000..91470ea --- /dev/null +++ b/siro_rider/packages/get/example_nav2/ios/Runner.xcodeproj/project.pbxproj @@ -0,0 +1,471 @@ +// !$*UTF8*$! +{ + archiveVersion = 1; + classes = { + }; + objectVersion = 46; + objects = { + +/* Begin PBXBuildFile section */ + 1498D2341E8E89220040F4C2 /* GeneratedPluginRegistrant.m in Sources */ = {isa = PBXBuildFile; fileRef = 1498D2331E8E89220040F4C2 /* GeneratedPluginRegistrant.m */; }; + 3B3967161E833CAA004F5970 /* AppFrameworkInfo.plist in Resources */ = {isa = PBXBuildFile; fileRef = 3B3967151E833CAA004F5970 /* AppFrameworkInfo.plist */; }; + 74858FAF1ED2DC5600515810 /* AppDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 74858FAE1ED2DC5600515810 /* AppDelegate.swift */; }; + 97C146FC1CF9000F007C117D /* Main.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 97C146FA1CF9000F007C117D /* Main.storyboard */; }; + 97C146FE1CF9000F007C117D /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 97C146FD1CF9000F007C117D /* Assets.xcassets */; }; + 97C147011CF9000F007C117D /* LaunchScreen.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 97C146FF1CF9000F007C117D /* LaunchScreen.storyboard */; }; +/* End PBXBuildFile section */ + +/* Begin PBXCopyFilesBuildPhase section */ + 9705A1C41CF9048500538489 /* Embed Frameworks */ = { + isa = PBXCopyFilesBuildPhase; + buildActionMask = 2147483647; + dstPath = ""; + dstSubfolderSpec = 10; + files = ( + ); + name = "Embed Frameworks"; + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXCopyFilesBuildPhase section */ + +/* Begin PBXFileReference section */ + 1498D2321E8E86230040F4C2 /* GeneratedPluginRegistrant.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = GeneratedPluginRegistrant.h; sourceTree = ""; }; + 1498D2331E8E89220040F4C2 /* GeneratedPluginRegistrant.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = GeneratedPluginRegistrant.m; sourceTree = ""; }; + 3B3967151E833CAA004F5970 /* AppFrameworkInfo.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; name = AppFrameworkInfo.plist; path = Flutter/AppFrameworkInfo.plist; sourceTree = ""; }; + 74858FAD1ED2DC5600515810 /* Runner-Bridging-Header.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = "Runner-Bridging-Header.h"; sourceTree = ""; }; + 74858FAE1ED2DC5600515810 /* AppDelegate.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = AppDelegate.swift; sourceTree = ""; }; + 7AFA3C8E1D35360C0083082E /* Release.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; name = Release.xcconfig; path = Flutter/Release.xcconfig; sourceTree = ""; }; + 9740EEB21CF90195004384FC /* Debug.xcconfig */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xcconfig; name = Debug.xcconfig; path = Flutter/Debug.xcconfig; sourceTree = ""; }; + 9740EEB31CF90195004384FC /* Generated.xcconfig */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xcconfig; name = Generated.xcconfig; path = Flutter/Generated.xcconfig; sourceTree = ""; }; + 97C146EE1CF9000F007C117D /* Runner.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = Runner.app; sourceTree = BUILT_PRODUCTS_DIR; }; + 97C146FB1CF9000F007C117D /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/Main.storyboard; sourceTree = ""; }; + 97C146FD1CF9000F007C117D /* Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Assets.xcassets; sourceTree = ""; }; + 97C147001CF9000F007C117D /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/LaunchScreen.storyboard; sourceTree = ""; }; + 97C147021CF9000F007C117D /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; +/* End PBXFileReference section */ + +/* Begin PBXFrameworksBuildPhase section */ + 97C146EB1CF9000F007C117D /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXFrameworksBuildPhase section */ + +/* Begin PBXGroup section */ + 9740EEB11CF90186004384FC /* Flutter */ = { + isa = PBXGroup; + children = ( + 3B3967151E833CAA004F5970 /* AppFrameworkInfo.plist */, + 9740EEB21CF90195004384FC /* Debug.xcconfig */, + 7AFA3C8E1D35360C0083082E /* Release.xcconfig */, + 9740EEB31CF90195004384FC /* Generated.xcconfig */, + ); + name = Flutter; + sourceTree = ""; + }; + 97C146E51CF9000F007C117D = { + isa = PBXGroup; + children = ( + 9740EEB11CF90186004384FC /* Flutter */, + 97C146F01CF9000F007C117D /* Runner */, + 97C146EF1CF9000F007C117D /* Products */, + ); + sourceTree = ""; + }; + 97C146EF1CF9000F007C117D /* Products */ = { + isa = PBXGroup; + children = ( + 97C146EE1CF9000F007C117D /* Runner.app */, + ); + name = Products; + sourceTree = ""; + }; + 97C146F01CF9000F007C117D /* Runner */ = { + isa = PBXGroup; + children = ( + 97C146FA1CF9000F007C117D /* Main.storyboard */, + 97C146FD1CF9000F007C117D /* Assets.xcassets */, + 97C146FF1CF9000F007C117D /* LaunchScreen.storyboard */, + 97C147021CF9000F007C117D /* Info.plist */, + 1498D2321E8E86230040F4C2 /* GeneratedPluginRegistrant.h */, + 1498D2331E8E89220040F4C2 /* GeneratedPluginRegistrant.m */, + 74858FAE1ED2DC5600515810 /* AppDelegate.swift */, + 74858FAD1ED2DC5600515810 /* Runner-Bridging-Header.h */, + ); + path = Runner; + sourceTree = ""; + }; +/* End PBXGroup section */ + +/* Begin PBXNativeTarget section */ + 97C146ED1CF9000F007C117D /* Runner */ = { + isa = PBXNativeTarget; + buildConfigurationList = 97C147051CF9000F007C117D /* Build configuration list for PBXNativeTarget "Runner" */; + buildPhases = ( + 9740EEB61CF901F6004384FC /* Run Script */, + 97C146EA1CF9000F007C117D /* Sources */, + 97C146EB1CF9000F007C117D /* Frameworks */, + 97C146EC1CF9000F007C117D /* Resources */, + 9705A1C41CF9048500538489 /* Embed Frameworks */, + 3B06AD1E1E4923F5004D2608 /* Thin Binary */, + ); + buildRules = ( + ); + dependencies = ( + ); + name = Runner; + productName = Runner; + productReference = 97C146EE1CF9000F007C117D /* Runner.app */; + productType = "com.apple.product-type.application"; + }; +/* End PBXNativeTarget section */ + +/* Begin PBXProject section */ + 97C146E61CF9000F007C117D /* Project object */ = { + isa = PBXProject; + attributes = { + LastUpgradeCheck = 1020; + ORGANIZATIONNAME = ""; + TargetAttributes = { + 97C146ED1CF9000F007C117D = { + CreatedOnToolsVersion = 7.3.1; + LastSwiftMigration = 1100; + }; + }; + }; + buildConfigurationList = 97C146E91CF9000F007C117D /* Build configuration list for PBXProject "Runner" */; + compatibilityVersion = "Xcode 9.3"; + developmentRegion = en; + hasScannedForEncodings = 0; + knownRegions = ( + en, + Base, + ); + mainGroup = 97C146E51CF9000F007C117D; + productRefGroup = 97C146EF1CF9000F007C117D /* Products */; + projectDirPath = ""; + projectRoot = ""; + targets = ( + 97C146ED1CF9000F007C117D /* Runner */, + ); + }; +/* End PBXProject section */ + +/* Begin PBXResourcesBuildPhase section */ + 97C146EC1CF9000F007C117D /* Resources */ = { + isa = PBXResourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + 97C147011CF9000F007C117D /* LaunchScreen.storyboard in Resources */, + 3B3967161E833CAA004F5970 /* AppFrameworkInfo.plist in Resources */, + 97C146FE1CF9000F007C117D /* Assets.xcassets in Resources */, + 97C146FC1CF9000F007C117D /* Main.storyboard in Resources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXResourcesBuildPhase section */ + +/* Begin PBXShellScriptBuildPhase section */ + 3B06AD1E1E4923F5004D2608 /* Thin Binary */ = { + isa = PBXShellScriptBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + inputPaths = ( + ); + name = "Thin Binary"; + outputPaths = ( + ); + runOnlyForDeploymentPostprocessing = 0; + shellPath = /bin/sh; + shellScript = "/bin/sh \"$FLUTTER_ROOT/packages/flutter_tools/bin/xcode_backend.sh\" embed_and_thin"; + }; + 9740EEB61CF901F6004384FC /* Run Script */ = { + isa = PBXShellScriptBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + inputPaths = ( + ); + name = "Run Script"; + outputPaths = ( + ); + runOnlyForDeploymentPostprocessing = 0; + shellPath = /bin/sh; + shellScript = "/bin/sh \"$FLUTTER_ROOT/packages/flutter_tools/bin/xcode_backend.sh\" build"; + }; +/* End PBXShellScriptBuildPhase section */ + +/* Begin PBXSourcesBuildPhase section */ + 97C146EA1CF9000F007C117D /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + 74858FAF1ED2DC5600515810 /* AppDelegate.swift in Sources */, + 1498D2341E8E89220040F4C2 /* GeneratedPluginRegistrant.m in Sources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXSourcesBuildPhase section */ + +/* Begin PBXVariantGroup section */ + 97C146FA1CF9000F007C117D /* Main.storyboard */ = { + isa = PBXVariantGroup; + children = ( + 97C146FB1CF9000F007C117D /* Base */, + ); + name = Main.storyboard; + sourceTree = ""; + }; + 97C146FF1CF9000F007C117D /* LaunchScreen.storyboard */ = { + isa = PBXVariantGroup; + children = ( + 97C147001CF9000F007C117D /* Base */, + ); + name = LaunchScreen.storyboard; + sourceTree = ""; + }; +/* End PBXVariantGroup section */ + +/* Begin XCBuildConfiguration section */ + 249021D3217E4FDB00AE95B9 /* Profile */ = { + isa = XCBuildConfiguration; + buildSettings = { + ALWAYS_SEARCH_USER_PATHS = NO; + CLANG_ANALYZER_NONNULL = YES; + CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; + CLANG_CXX_LIBRARY = "libc++"; + CLANG_ENABLE_MODULES = YES; + CLANG_ENABLE_OBJC_ARC = YES; + CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; + CLANG_WARN_BOOL_CONVERSION = YES; + CLANG_WARN_COMMA = YES; + CLANG_WARN_CONSTANT_CONVERSION = YES; + CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; + CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; + CLANG_WARN_EMPTY_BODY = YES; + CLANG_WARN_ENUM_CONVERSION = YES; + CLANG_WARN_INFINITE_RECURSION = YES; + CLANG_WARN_INT_CONVERSION = YES; + CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; + CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; + CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; + CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; + CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; + CLANG_WARN_STRICT_PROTOTYPES = YES; + CLANG_WARN_SUSPICIOUS_MOVE = YES; + CLANG_WARN_UNREACHABLE_CODE = YES; + CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; + "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; + COPY_PHASE_STRIP = NO; + DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; + ENABLE_NS_ASSERTIONS = NO; + ENABLE_STRICT_OBJC_MSGSEND = YES; + GCC_C_LANGUAGE_STANDARD = gnu99; + GCC_NO_COMMON_BLOCKS = YES; + GCC_WARN_64_TO_32_BIT_CONVERSION = YES; + GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; + GCC_WARN_UNDECLARED_SELECTOR = YES; + GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; + GCC_WARN_UNUSED_FUNCTION = YES; + GCC_WARN_UNUSED_VARIABLE = YES; + IPHONEOS_DEPLOYMENT_TARGET = 9.0; + MTL_ENABLE_DEBUG_INFO = NO; + SDKROOT = iphoneos; + SUPPORTED_PLATFORMS = iphoneos; + TARGETED_DEVICE_FAMILY = "1,2"; + VALIDATE_PRODUCT = YES; + }; + name = Profile; + }; + 249021D4217E4FDB00AE95B9 /* Profile */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = 7AFA3C8E1D35360C0083082E /* Release.xcconfig */; + buildSettings = { + ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; + CLANG_ENABLE_MODULES = YES; + CURRENT_PROJECT_VERSION = "$(FLUTTER_BUILD_NUMBER)"; + ENABLE_BITCODE = NO; + INFOPLIST_FILE = Runner/Info.plist; + LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks"; + PRODUCT_BUNDLE_IDENTIFIER = com.get.exampleNav2; + PRODUCT_NAME = "$(TARGET_NAME)"; + SWIFT_OBJC_BRIDGING_HEADER = "Runner/Runner-Bridging-Header.h"; + SWIFT_VERSION = 5.0; + VERSIONING_SYSTEM = "apple-generic"; + }; + name = Profile; + }; + 97C147031CF9000F007C117D /* Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + ALWAYS_SEARCH_USER_PATHS = NO; + CLANG_ANALYZER_NONNULL = YES; + CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; + CLANG_CXX_LIBRARY = "libc++"; + CLANG_ENABLE_MODULES = YES; + CLANG_ENABLE_OBJC_ARC = YES; + CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; + CLANG_WARN_BOOL_CONVERSION = YES; + CLANG_WARN_COMMA = YES; + CLANG_WARN_CONSTANT_CONVERSION = YES; + CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; + CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; + CLANG_WARN_EMPTY_BODY = YES; + CLANG_WARN_ENUM_CONVERSION = YES; + CLANG_WARN_INFINITE_RECURSION = YES; + CLANG_WARN_INT_CONVERSION = YES; + CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; + CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; + CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; + CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; + CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; + CLANG_WARN_STRICT_PROTOTYPES = YES; + CLANG_WARN_SUSPICIOUS_MOVE = YES; + CLANG_WARN_UNREACHABLE_CODE = YES; + CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; + "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; + COPY_PHASE_STRIP = NO; + DEBUG_INFORMATION_FORMAT = dwarf; + ENABLE_STRICT_OBJC_MSGSEND = YES; + ENABLE_TESTABILITY = YES; + GCC_C_LANGUAGE_STANDARD = gnu99; + GCC_DYNAMIC_NO_PIC = NO; + GCC_NO_COMMON_BLOCKS = YES; + GCC_OPTIMIZATION_LEVEL = 0; + GCC_PREPROCESSOR_DEFINITIONS = ( + "DEBUG=1", + "$(inherited)", + ); + GCC_WARN_64_TO_32_BIT_CONVERSION = YES; + GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; + GCC_WARN_UNDECLARED_SELECTOR = YES; + GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; + GCC_WARN_UNUSED_FUNCTION = YES; + GCC_WARN_UNUSED_VARIABLE = YES; + IPHONEOS_DEPLOYMENT_TARGET = 9.0; + MTL_ENABLE_DEBUG_INFO = YES; + ONLY_ACTIVE_ARCH = YES; + SDKROOT = iphoneos; + TARGETED_DEVICE_FAMILY = "1,2"; + }; + name = Debug; + }; + 97C147041CF9000F007C117D /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + ALWAYS_SEARCH_USER_PATHS = NO; + CLANG_ANALYZER_NONNULL = YES; + CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; + CLANG_CXX_LIBRARY = "libc++"; + CLANG_ENABLE_MODULES = YES; + CLANG_ENABLE_OBJC_ARC = YES; + CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; + CLANG_WARN_BOOL_CONVERSION = YES; + CLANG_WARN_COMMA = YES; + CLANG_WARN_CONSTANT_CONVERSION = YES; + CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; + CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; + CLANG_WARN_EMPTY_BODY = YES; + CLANG_WARN_ENUM_CONVERSION = YES; + CLANG_WARN_INFINITE_RECURSION = YES; + CLANG_WARN_INT_CONVERSION = YES; + CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; + CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; + CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; + CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; + CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; + CLANG_WARN_STRICT_PROTOTYPES = YES; + CLANG_WARN_SUSPICIOUS_MOVE = YES; + CLANG_WARN_UNREACHABLE_CODE = YES; + CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; + "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; + COPY_PHASE_STRIP = NO; + DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; + ENABLE_NS_ASSERTIONS = NO; + ENABLE_STRICT_OBJC_MSGSEND = YES; + GCC_C_LANGUAGE_STANDARD = gnu99; + GCC_NO_COMMON_BLOCKS = YES; + GCC_WARN_64_TO_32_BIT_CONVERSION = YES; + GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; + GCC_WARN_UNDECLARED_SELECTOR = YES; + GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; + GCC_WARN_UNUSED_FUNCTION = YES; + GCC_WARN_UNUSED_VARIABLE = YES; + IPHONEOS_DEPLOYMENT_TARGET = 9.0; + MTL_ENABLE_DEBUG_INFO = NO; + SDKROOT = iphoneos; + SUPPORTED_PLATFORMS = iphoneos; + SWIFT_OPTIMIZATION_LEVEL = "-Owholemodule"; + TARGETED_DEVICE_FAMILY = "1,2"; + VALIDATE_PRODUCT = YES; + }; + name = Release; + }; + 97C147061CF9000F007C117D /* Debug */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = 9740EEB21CF90195004384FC /* Debug.xcconfig */; + buildSettings = { + ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; + CLANG_ENABLE_MODULES = YES; + CURRENT_PROJECT_VERSION = "$(FLUTTER_BUILD_NUMBER)"; + ENABLE_BITCODE = NO; + INFOPLIST_FILE = Runner/Info.plist; + LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks"; + PRODUCT_BUNDLE_IDENTIFIER = com.get.exampleNav2; + PRODUCT_NAME = "$(TARGET_NAME)"; + SWIFT_OBJC_BRIDGING_HEADER = "Runner/Runner-Bridging-Header.h"; + SWIFT_OPTIMIZATION_LEVEL = "-Onone"; + SWIFT_VERSION = 5.0; + VERSIONING_SYSTEM = "apple-generic"; + }; + name = Debug; + }; + 97C147071CF9000F007C117D /* Release */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = 7AFA3C8E1D35360C0083082E /* Release.xcconfig */; + buildSettings = { + ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; + CLANG_ENABLE_MODULES = YES; + CURRENT_PROJECT_VERSION = "$(FLUTTER_BUILD_NUMBER)"; + ENABLE_BITCODE = NO; + INFOPLIST_FILE = Runner/Info.plist; + LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks"; + PRODUCT_BUNDLE_IDENTIFIER = com.get.exampleNav2; + PRODUCT_NAME = "$(TARGET_NAME)"; + SWIFT_OBJC_BRIDGING_HEADER = "Runner/Runner-Bridging-Header.h"; + SWIFT_VERSION = 5.0; + VERSIONING_SYSTEM = "apple-generic"; + }; + name = Release; + }; +/* End XCBuildConfiguration section */ + +/* Begin XCConfigurationList section */ + 97C146E91CF9000F007C117D /* Build configuration list for PBXProject "Runner" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 97C147031CF9000F007C117D /* Debug */, + 97C147041CF9000F007C117D /* Release */, + 249021D3217E4FDB00AE95B9 /* Profile */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; + 97C147051CF9000F007C117D /* Build configuration list for PBXNativeTarget "Runner" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 97C147061CF9000F007C117D /* Debug */, + 97C147071CF9000F007C117D /* Release */, + 249021D4217E4FDB00AE95B9 /* Profile */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; +/* End XCConfigurationList section */ + }; + rootObject = 97C146E61CF9000F007C117D /* Project object */; +} diff --git a/siro_rider/packages/get/example_nav2/ios/Runner.xcodeproj/project.xcworkspace/contents.xcworkspacedata b/siro_rider/packages/get/example_nav2/ios/Runner.xcodeproj/project.xcworkspace/contents.xcworkspacedata new file mode 100644 index 0000000..919434a --- /dev/null +++ b/siro_rider/packages/get/example_nav2/ios/Runner.xcodeproj/project.xcworkspace/contents.xcworkspacedata @@ -0,0 +1,7 @@ + + + + + diff --git a/siro_rider/packages/get/example_nav2/ios/Runner.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist b/siro_rider/packages/get/example_nav2/ios/Runner.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist new file mode 100644 index 0000000..18d9810 --- /dev/null +++ b/siro_rider/packages/get/example_nav2/ios/Runner.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist @@ -0,0 +1,8 @@ + + + + + IDEDidComputeMac32BitWarning + + + diff --git a/siro_rider/packages/get/example_nav2/ios/Runner.xcodeproj/project.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings b/siro_rider/packages/get/example_nav2/ios/Runner.xcodeproj/project.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings new file mode 100644 index 0000000..f9b0d7c --- /dev/null +++ b/siro_rider/packages/get/example_nav2/ios/Runner.xcodeproj/project.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings @@ -0,0 +1,8 @@ + + + + + PreviewsEnabled + + + diff --git a/siro_rider/packages/get/example_nav2/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme b/siro_rider/packages/get/example_nav2/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme new file mode 100644 index 0000000..a28140c --- /dev/null +++ b/siro_rider/packages/get/example_nav2/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme @@ -0,0 +1,91 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/siro_rider/packages/get/example_nav2/ios/Runner.xcworkspace/contents.xcworkspacedata b/siro_rider/packages/get/example_nav2/ios/Runner.xcworkspace/contents.xcworkspacedata new file mode 100644 index 0000000..1d526a1 --- /dev/null +++ b/siro_rider/packages/get/example_nav2/ios/Runner.xcworkspace/contents.xcworkspacedata @@ -0,0 +1,7 @@ + + + + + diff --git a/siro_rider/packages/get/example_nav2/ios/Runner.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist b/siro_rider/packages/get/example_nav2/ios/Runner.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist new file mode 100644 index 0000000..18d9810 --- /dev/null +++ b/siro_rider/packages/get/example_nav2/ios/Runner.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist @@ -0,0 +1,8 @@ + + + + + IDEDidComputeMac32BitWarning + + + diff --git a/siro_rider/packages/get/example_nav2/ios/Runner.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings b/siro_rider/packages/get/example_nav2/ios/Runner.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings new file mode 100644 index 0000000..f9b0d7c --- /dev/null +++ b/siro_rider/packages/get/example_nav2/ios/Runner.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings @@ -0,0 +1,8 @@ + + + + + PreviewsEnabled + + + diff --git a/siro_rider/packages/get/example_nav2/ios/Runner/AppDelegate.swift b/siro_rider/packages/get/example_nav2/ios/Runner/AppDelegate.swift new file mode 100644 index 0000000..70693e4 --- /dev/null +++ b/siro_rider/packages/get/example_nav2/ios/Runner/AppDelegate.swift @@ -0,0 +1,13 @@ +import UIKit +import Flutter + +@UIApplicationMain +@objc class AppDelegate: FlutterAppDelegate { + override func application( + _ application: UIApplication, + didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]? + ) -> Bool { + GeneratedPluginRegistrant.register(with: self) + return super.application(application, didFinishLaunchingWithOptions: launchOptions) + } +} diff --git a/siro_rider/packages/get/example_nav2/ios/Runner/Assets.xcassets/AppIcon.appiconset/Contents.json b/siro_rider/packages/get/example_nav2/ios/Runner/Assets.xcassets/AppIcon.appiconset/Contents.json new file mode 100644 index 0000000..d36b1fa --- /dev/null +++ b/siro_rider/packages/get/example_nav2/ios/Runner/Assets.xcassets/AppIcon.appiconset/Contents.json @@ -0,0 +1,122 @@ +{ + "images" : [ + { + "size" : "20x20", + "idiom" : "iphone", + "filename" : "Icon-App-20x20@2x.png", + "scale" : "2x" + }, + { + "size" : "20x20", + "idiom" : "iphone", + "filename" : "Icon-App-20x20@3x.png", + "scale" : "3x" + }, + { + "size" : "29x29", + "idiom" : "iphone", + "filename" : "Icon-App-29x29@1x.png", + "scale" : "1x" + }, + { + "size" : "29x29", + "idiom" : "iphone", + "filename" : "Icon-App-29x29@2x.png", + "scale" : "2x" + }, + { + "size" : "29x29", + "idiom" : "iphone", + "filename" : "Icon-App-29x29@3x.png", + "scale" : "3x" + }, + { + "size" : "40x40", + "idiom" : "iphone", + "filename" : "Icon-App-40x40@2x.png", + "scale" : "2x" + }, + { + "size" : "40x40", + "idiom" : "iphone", + "filename" : "Icon-App-40x40@3x.png", + "scale" : "3x" + }, + { + "size" : "60x60", + "idiom" : "iphone", + "filename" : "Icon-App-60x60@2x.png", + "scale" : "2x" + }, + { + "size" : "60x60", + "idiom" : "iphone", + "filename" : "Icon-App-60x60@3x.png", + "scale" : "3x" + }, + { + "size" : "20x20", + "idiom" : "ipad", + "filename" : "Icon-App-20x20@1x.png", + "scale" : "1x" + }, + { + "size" : "20x20", + "idiom" : "ipad", + "filename" : "Icon-App-20x20@2x.png", + "scale" : "2x" + }, + { + "size" : "29x29", + "idiom" : "ipad", + "filename" : "Icon-App-29x29@1x.png", + "scale" : "1x" + }, + { + "size" : "29x29", + "idiom" : "ipad", + "filename" : "Icon-App-29x29@2x.png", + "scale" : "2x" + }, + { + "size" : "40x40", + "idiom" : "ipad", + "filename" : "Icon-App-40x40@1x.png", + "scale" : "1x" + }, + { + "size" : "40x40", + "idiom" : "ipad", + "filename" : "Icon-App-40x40@2x.png", + "scale" : "2x" + }, + { + "size" : "76x76", + "idiom" : "ipad", + "filename" : "Icon-App-76x76@1x.png", + "scale" : "1x" + }, + { + "size" : "76x76", + "idiom" : "ipad", + "filename" : "Icon-App-76x76@2x.png", + "scale" : "2x" + }, + { + "size" : "83.5x83.5", + "idiom" : "ipad", + "filename" : "Icon-App-83.5x83.5@2x.png", + "scale" : "2x" + }, + { + "size" : "1024x1024", + "idiom" : "ios-marketing", + "filename" : "Icon-App-1024x1024@1x.png", + "scale" : "1x" + } + ], + "info" : { + "version" : 1, + "author" : "xcode" + } +} diff --git a/siro_rider/packages/get/example_nav2/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-1024x1024@1x.png b/siro_rider/packages/get/example_nav2/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-1024x1024@1x.png new file mode 100644 index 0000000..dc9ada4 Binary files /dev/null and b/siro_rider/packages/get/example_nav2/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-1024x1024@1x.png differ diff --git a/siro_rider/packages/get/example_nav2/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@1x.png b/siro_rider/packages/get/example_nav2/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@1x.png new file mode 100644 index 0000000..28c6bf0 Binary files /dev/null and b/siro_rider/packages/get/example_nav2/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@1x.png differ diff --git a/siro_rider/packages/get/example_nav2/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@2x.png b/siro_rider/packages/get/example_nav2/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@2x.png new file mode 100644 index 0000000..2ccbfd9 Binary files /dev/null and b/siro_rider/packages/get/example_nav2/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@2x.png differ diff --git a/siro_rider/packages/get/example_nav2/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@3x.png b/siro_rider/packages/get/example_nav2/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@3x.png new file mode 100644 index 0000000..f091b6b Binary files /dev/null and b/siro_rider/packages/get/example_nav2/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@3x.png differ diff --git a/siro_rider/packages/get/example_nav2/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@1x.png b/siro_rider/packages/get/example_nav2/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@1x.png new file mode 100644 index 0000000..4cde121 Binary files /dev/null and b/siro_rider/packages/get/example_nav2/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@1x.png differ diff --git a/siro_rider/packages/get/example_nav2/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@2x.png b/siro_rider/packages/get/example_nav2/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@2x.png new file mode 100644 index 0000000..d0ef06e Binary files /dev/null and b/siro_rider/packages/get/example_nav2/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@2x.png differ diff --git a/siro_rider/packages/get/example_nav2/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@3x.png b/siro_rider/packages/get/example_nav2/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@3x.png new file mode 100644 index 0000000..dcdc230 Binary files /dev/null and b/siro_rider/packages/get/example_nav2/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@3x.png differ diff --git a/siro_rider/packages/get/example_nav2/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@1x.png b/siro_rider/packages/get/example_nav2/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@1x.png new file mode 100644 index 0000000..2ccbfd9 Binary files /dev/null and b/siro_rider/packages/get/example_nav2/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@1x.png differ diff --git a/siro_rider/packages/get/example_nav2/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@2x.png b/siro_rider/packages/get/example_nav2/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@2x.png new file mode 100644 index 0000000..c8f9ed8 Binary files /dev/null and b/siro_rider/packages/get/example_nav2/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@2x.png differ diff --git a/siro_rider/packages/get/example_nav2/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@3x.png b/siro_rider/packages/get/example_nav2/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@3x.png new file mode 100644 index 0000000..a6d6b86 Binary files /dev/null and b/siro_rider/packages/get/example_nav2/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@3x.png differ diff --git a/siro_rider/packages/get/example_nav2/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@2x.png b/siro_rider/packages/get/example_nav2/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@2x.png new file mode 100644 index 0000000..a6d6b86 Binary files /dev/null and b/siro_rider/packages/get/example_nav2/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@2x.png differ diff --git a/siro_rider/packages/get/example_nav2/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@3x.png b/siro_rider/packages/get/example_nav2/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@3x.png new file mode 100644 index 0000000..75b2d16 Binary files /dev/null and b/siro_rider/packages/get/example_nav2/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@3x.png differ diff --git a/siro_rider/packages/get/example_nav2/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-76x76@1x.png b/siro_rider/packages/get/example_nav2/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-76x76@1x.png new file mode 100644 index 0000000..c4df70d Binary files /dev/null and b/siro_rider/packages/get/example_nav2/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-76x76@1x.png differ diff --git a/siro_rider/packages/get/example_nav2/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-76x76@2x.png b/siro_rider/packages/get/example_nav2/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-76x76@2x.png new file mode 100644 index 0000000..6a84f41 Binary files /dev/null and b/siro_rider/packages/get/example_nav2/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-76x76@2x.png differ diff --git a/siro_rider/packages/get/example_nav2/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-83.5x83.5@2x.png b/siro_rider/packages/get/example_nav2/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-83.5x83.5@2x.png new file mode 100644 index 0000000..d0e1f58 Binary files /dev/null and b/siro_rider/packages/get/example_nav2/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-83.5x83.5@2x.png differ diff --git a/siro_rider/packages/get/example_nav2/ios/Runner/Assets.xcassets/LaunchImage.imageset/Contents.json b/siro_rider/packages/get/example_nav2/ios/Runner/Assets.xcassets/LaunchImage.imageset/Contents.json new file mode 100644 index 0000000..0bedcf2 --- /dev/null +++ b/siro_rider/packages/get/example_nav2/ios/Runner/Assets.xcassets/LaunchImage.imageset/Contents.json @@ -0,0 +1,23 @@ +{ + "images" : [ + { + "idiom" : "universal", + "filename" : "LaunchImage.png", + "scale" : "1x" + }, + { + "idiom" : "universal", + "filename" : "LaunchImage@2x.png", + "scale" : "2x" + }, + { + "idiom" : "universal", + "filename" : "LaunchImage@3x.png", + "scale" : "3x" + } + ], + "info" : { + "version" : 1, + "author" : "xcode" + } +} diff --git a/siro_rider/packages/get/example_nav2/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage.png b/siro_rider/packages/get/example_nav2/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage.png new file mode 100644 index 0000000..9da19ea Binary files /dev/null and b/siro_rider/packages/get/example_nav2/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage.png differ diff --git a/siro_rider/packages/get/example_nav2/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage@2x.png b/siro_rider/packages/get/example_nav2/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage@2x.png new file mode 100644 index 0000000..9da19ea Binary files /dev/null and b/siro_rider/packages/get/example_nav2/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage@2x.png differ diff --git a/siro_rider/packages/get/example_nav2/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage@3x.png b/siro_rider/packages/get/example_nav2/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage@3x.png new file mode 100644 index 0000000..9da19ea Binary files /dev/null and b/siro_rider/packages/get/example_nav2/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage@3x.png differ diff --git a/siro_rider/packages/get/example_nav2/ios/Runner/Assets.xcassets/LaunchImage.imageset/README.md b/siro_rider/packages/get/example_nav2/ios/Runner/Assets.xcassets/LaunchImage.imageset/README.md new file mode 100644 index 0000000..89c2725 --- /dev/null +++ b/siro_rider/packages/get/example_nav2/ios/Runner/Assets.xcassets/LaunchImage.imageset/README.md @@ -0,0 +1,5 @@ +# Launch Screen Assets + +You can customize the launch screen with your own desired assets by replacing the image files in this directory. + +You can also do it by opening your Flutter project's Xcode project with `open ios/Runner.xcworkspace`, selecting `Runner/Assets.xcassets` in the Project Navigator and dropping in the desired images. \ No newline at end of file diff --git a/siro_rider/packages/get/example_nav2/ios/Runner/Base.lproj/LaunchScreen.storyboard b/siro_rider/packages/get/example_nav2/ios/Runner/Base.lproj/LaunchScreen.storyboard new file mode 100644 index 0000000..f2e259c --- /dev/null +++ b/siro_rider/packages/get/example_nav2/ios/Runner/Base.lproj/LaunchScreen.storyboard @@ -0,0 +1,37 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/siro_rider/packages/get/example_nav2/ios/Runner/Base.lproj/Main.storyboard b/siro_rider/packages/get/example_nav2/ios/Runner/Base.lproj/Main.storyboard new file mode 100644 index 0000000..f3c2851 --- /dev/null +++ b/siro_rider/packages/get/example_nav2/ios/Runner/Base.lproj/Main.storyboard @@ -0,0 +1,26 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/siro_rider/packages/get/example_nav2/ios/Runner/GeneratedPluginRegistrant.h b/siro_rider/packages/get/example_nav2/ios/Runner/GeneratedPluginRegistrant.h new file mode 100644 index 0000000..7a89092 --- /dev/null +++ b/siro_rider/packages/get/example_nav2/ios/Runner/GeneratedPluginRegistrant.h @@ -0,0 +1,19 @@ +// +// Generated file. Do not edit. +// + +// clang-format off + +#ifndef GeneratedPluginRegistrant_h +#define GeneratedPluginRegistrant_h + +#import + +NS_ASSUME_NONNULL_BEGIN + +@interface GeneratedPluginRegistrant : NSObject ++ (void)registerWithRegistry:(NSObject*)registry; +@end + +NS_ASSUME_NONNULL_END +#endif /* GeneratedPluginRegistrant_h */ diff --git a/siro_rider/packages/get/example_nav2/ios/Runner/GeneratedPluginRegistrant.m b/siro_rider/packages/get/example_nav2/ios/Runner/GeneratedPluginRegistrant.m new file mode 100644 index 0000000..efe65ec --- /dev/null +++ b/siro_rider/packages/get/example_nav2/ios/Runner/GeneratedPluginRegistrant.m @@ -0,0 +1,14 @@ +// +// Generated file. Do not edit. +// + +// clang-format off + +#import "GeneratedPluginRegistrant.h" + +@implementation GeneratedPluginRegistrant + ++ (void)registerWithRegistry:(NSObject*)registry { +} + +@end diff --git a/siro_rider/packages/get/example_nav2/ios/Runner/Info.plist b/siro_rider/packages/get/example_nav2/ios/Runner/Info.plist new file mode 100644 index 0000000..3eb0e58 --- /dev/null +++ b/siro_rider/packages/get/example_nav2/ios/Runner/Info.plist @@ -0,0 +1,45 @@ + + + + + CFBundleDevelopmentRegion + $(DEVELOPMENT_LANGUAGE) + CFBundleExecutable + $(EXECUTABLE_NAME) + CFBundleIdentifier + $(PRODUCT_BUNDLE_IDENTIFIER) + CFBundleInfoDictionaryVersion + 6.0 + CFBundleName + example_nav2 + CFBundlePackageType + APPL + CFBundleShortVersionString + $(FLUTTER_BUILD_NAME) + CFBundleSignature + ???? + CFBundleVersion + $(FLUTTER_BUILD_NUMBER) + LSRequiresIPhoneOS + + UILaunchStoryboardName + LaunchScreen + UIMainStoryboardFile + Main + UISupportedInterfaceOrientations + + UIInterfaceOrientationPortrait + UIInterfaceOrientationLandscapeLeft + UIInterfaceOrientationLandscapeRight + + UISupportedInterfaceOrientations~ipad + + UIInterfaceOrientationPortrait + UIInterfaceOrientationPortraitUpsideDown + UIInterfaceOrientationLandscapeLeft + UIInterfaceOrientationLandscapeRight + + UIViewControllerBasedStatusBarAppearance + + + diff --git a/siro_rider/packages/get/example_nav2/ios/Runner/Runner-Bridging-Header.h b/siro_rider/packages/get/example_nav2/ios/Runner/Runner-Bridging-Header.h new file mode 100644 index 0000000..308a2a5 --- /dev/null +++ b/siro_rider/packages/get/example_nav2/ios/Runner/Runner-Bridging-Header.h @@ -0,0 +1 @@ +#import "GeneratedPluginRegistrant.h" diff --git a/siro_rider/packages/get/example_nav2/lib/app/middleware/auth_middleware.dart b/siro_rider/packages/get/example_nav2/lib/app/middleware/auth_middleware.dart new file mode 100644 index 0000000..f59de50 --- /dev/null +++ b/siro_rider/packages/get/example_nav2/lib/app/middleware/auth_middleware.dart @@ -0,0 +1,33 @@ +import 'package:get/get.dart'; + +import '../../services/auth_service.dart'; +import '../routes/app_pages.dart'; + +class EnsureAuthMiddleware extends GetMiddleware { + @override + Future redirectDelegate(GetNavConfig route) async { + // you can do whatever you want here + // but it's preferable to make this method fast + // await Future.delayed(Duration(milliseconds: 500)); + + if (!AuthService.to.isLoggedInValue) { + final newRoute = Routes.LOGIN_THEN(route.location!); + return GetNavConfig.fromRoute(newRoute); + } + return await super.redirectDelegate(route); + } +} + +class EnsureNotAuthedMiddleware extends GetMiddleware { + @override + Future redirectDelegate(GetNavConfig route) async { + if (AuthService.to.isLoggedInValue) { + //NEVER navigate to auth screen, when user is already authed + return null; + + //OR redirect user to another screen + //return GetNavConfig.fromRoute(Routes.PROFILE); + } + return await super.redirectDelegate(route); + } +} diff --git a/siro_rider/packages/get/example_nav2/lib/app/modules/dashboard/bindings/dashboard_binding.dart b/siro_rider/packages/get/example_nav2/lib/app/modules/dashboard/bindings/dashboard_binding.dart new file mode 100644 index 0000000..da48f13 --- /dev/null +++ b/siro_rider/packages/get/example_nav2/lib/app/modules/dashboard/bindings/dashboard_binding.dart @@ -0,0 +1,12 @@ +import 'package:get/get.dart'; + +import '../controllers/dashboard_controller.dart'; + +class DashboardBinding extends Bindings { + @override + void dependencies() { + Get.lazyPut( + () => DashboardController(), + ); + } +} diff --git a/siro_rider/packages/get/example_nav2/lib/app/modules/dashboard/controllers/dashboard_controller.dart b/siro_rider/packages/get/example_nav2/lib/app/modules/dashboard/controllers/dashboard_controller.dart new file mode 100644 index 0000000..a459c7d --- /dev/null +++ b/siro_rider/packages/get/example_nav2/lib/app/modules/dashboard/controllers/dashboard_controller.dart @@ -0,0 +1,17 @@ +import 'dart:async'; + +import 'package:get/get.dart'; + +class DashboardController extends GetxController { + final now = DateTime.now().obs; + @override + void onReady() { + super.onReady(); + Timer.periodic( + Duration(seconds: 1), + (timer) { + now.value = DateTime.now(); + }, + ); + } +} diff --git a/siro_rider/packages/get/example_nav2/lib/app/modules/dashboard/views/dashboard_view.dart b/siro_rider/packages/get/example_nav2/lib/app/modules/dashboard/views/dashboard_view.dart new file mode 100644 index 0000000..b7fed5b --- /dev/null +++ b/siro_rider/packages/get/example_nav2/lib/app/modules/dashboard/views/dashboard_view.dart @@ -0,0 +1,26 @@ +import 'package:flutter/material.dart'; +import 'package:get/get.dart'; + +import '../controllers/dashboard_controller.dart'; + +class DashboardView extends GetView { + @override + Widget build(BuildContext context) { + return Scaffold( + body: Center( + child: Obx( + () => Column( + mainAxisSize: MainAxisSize.min, + children: [ + Text( + 'DashboardView is working', + style: TextStyle(fontSize: 20), + ), + Text('Time: ${controller.now.value.toString()}'), + ], + ), + ), + ), + ); + } +} diff --git a/siro_rider/packages/get/example_nav2/lib/app/modules/home/bindings/home_binding.dart b/siro_rider/packages/get/example_nav2/lib/app/modules/home/bindings/home_binding.dart new file mode 100644 index 0000000..d08a80d --- /dev/null +++ b/siro_rider/packages/get/example_nav2/lib/app/modules/home/bindings/home_binding.dart @@ -0,0 +1,12 @@ +import 'package:get/get.dart'; + +import '../controllers/home_controller.dart'; + +class HomeBinding extends Bindings { + @override + void dependencies() { + Get.lazyPut( + () => HomeController(), + ); + } +} diff --git a/siro_rider/packages/get/example_nav2/lib/app/modules/home/controllers/home_controller.dart b/siro_rider/packages/get/example_nav2/lib/app/modules/home/controllers/home_controller.dart new file mode 100644 index 0000000..d1129d6 --- /dev/null +++ b/siro_rider/packages/get/example_nav2/lib/app/modules/home/controllers/home_controller.dart @@ -0,0 +1,3 @@ +import 'package:get/get.dart'; + +class HomeController extends GetxController {} diff --git a/siro_rider/packages/get/example_nav2/lib/app/modules/home/views/home_view.dart b/siro_rider/packages/get/example_nav2/lib/app/modules/home/views/home_view.dart new file mode 100644 index 0000000..9bd8e4f --- /dev/null +++ b/siro_rider/packages/get/example_nav2/lib/app/modules/home/views/home_view.dart @@ -0,0 +1,65 @@ +import 'package:flutter/material.dart'; +import 'package:get/get.dart'; + +import '../../../routes/app_pages.dart'; +import '../controllers/home_controller.dart'; + +class HomeView extends GetView { + @override + Widget build(BuildContext context) { + return GetRouterOutlet.builder( + builder: (context, delegate, currentRoute) { + //This router outlet handles the appbar and the bottom navigation bar + final currentLocation = currentRoute?.location; + var currentIndex = 0; + if (currentLocation?.startsWith(Routes.PRODUCTS) == true) { + currentIndex = 2; + } + if (currentLocation?.startsWith(Routes.PROFILE) == true) { + currentIndex = 1; + } + return Scaffold( + body: GetRouterOutlet( + initialRoute: Routes.DASHBOARD, + // anchorRoute: Routes.HOME, + key: Get.nestedKey(Routes.HOME), + ), + bottomNavigationBar: BottomNavigationBar( + currentIndex: currentIndex, + onTap: (value) { + switch (value) { + case 0: + delegate.toNamed(Routes.HOME); + break; + case 1: + delegate.toNamed(Routes.PROFILE); + break; + case 2: + delegate.toNamed(Routes.PRODUCTS); + break; + default: + } + }, + items: [ + // _Paths.HOME + [Empty] + BottomNavigationBarItem( + icon: Icon(Icons.home), + label: 'Home', + ), + // _Paths.HOME + Routes.PROFILE + BottomNavigationBarItem( + icon: Icon(Icons.account_box_rounded), + label: 'Profile', + ), + // _Paths.HOME + _Paths.PRODUCTS + BottomNavigationBarItem( + icon: Icon(Icons.account_box_rounded), + label: 'Products', + ), + ], + ), + ); + }, + ); + } +} diff --git a/siro_rider/packages/get/example_nav2/lib/app/modules/login/bindings/login_binding.dart b/siro_rider/packages/get/example_nav2/lib/app/modules/login/bindings/login_binding.dart new file mode 100644 index 0000000..ac119f4 --- /dev/null +++ b/siro_rider/packages/get/example_nav2/lib/app/modules/login/bindings/login_binding.dart @@ -0,0 +1,12 @@ +import 'package:get/get.dart'; + +import '../controllers/login_controller.dart'; + +class LoginBinding extends Bindings { + @override + void dependencies() { + Get.lazyPut( + () => LoginController(), + ); + } +} diff --git a/siro_rider/packages/get/example_nav2/lib/app/modules/login/controllers/login_controller.dart b/siro_rider/packages/get/example_nav2/lib/app/modules/login/controllers/login_controller.dart new file mode 100644 index 0000000..e5595f4 --- /dev/null +++ b/siro_rider/packages/get/example_nav2/lib/app/modules/login/controllers/login_controller.dart @@ -0,0 +1,3 @@ +import 'package:get/get.dart'; + +class LoginController extends GetxController {} diff --git a/siro_rider/packages/get/example_nav2/lib/app/modules/login/views/login_view.dart b/siro_rider/packages/get/example_nav2/lib/app/modules/login/views/login_view.dart new file mode 100644 index 0000000..822ac4a --- /dev/null +++ b/siro_rider/packages/get/example_nav2/lib/app/modules/login/views/login_view.dart @@ -0,0 +1,44 @@ +import 'package:flutter/material.dart'; +import 'package:get/get.dart'; + +import '../../../../services/auth_service.dart'; +import '../../../routes/app_pages.dart'; +import '../controllers/login_controller.dart'; + +class LoginView extends GetView { + @override + Widget build(BuildContext context) { + return Scaffold( + body: Center( + child: Column( + mainAxisSize: MainAxisSize.min, + children: [ + Obx( + () { + final isLoggedIn = AuthService.to.isLoggedInValue; + return Text( + 'You are currently:' + ' ${isLoggedIn ? "Logged In" : "Not Logged In"}' + "\nIt's impossible to enter this " + "route when you are logged in!", + ); + }, + ), + MaterialButton( + child: Text( + 'Do LOGIN !!', + style: TextStyle(color: Colors.blue, fontSize: 20), + ), + onPressed: () { + AuthService.to.login(); + final thenTo = Get.rootDelegate.currentConfiguration! + .currentPage!.parameters?['then']; + Get.rootDelegate.offNamed(thenTo ?? Routes.HOME); + }, + ), + ], + ), + ), + ); + } +} diff --git a/siro_rider/packages/get/example_nav2/lib/app/modules/product_details/bindings/product_details_binding.dart b/siro_rider/packages/get/example_nav2/lib/app/modules/product_details/bindings/product_details_binding.dart new file mode 100644 index 0000000..624d55a --- /dev/null +++ b/siro_rider/packages/get/example_nav2/lib/app/modules/product_details/bindings/product_details_binding.dart @@ -0,0 +1,14 @@ +import 'package:get/get.dart'; + +import '../controllers/product_details_controller.dart'; + +class ProductDetailsBinding extends Bindings { + @override + void dependencies() { + Get.create( + () => ProductDetailsController( + Get.parameters['productId'] ?? '', + ), + ); + } +} diff --git a/siro_rider/packages/get/example_nav2/lib/app/modules/product_details/controllers/product_details_controller.dart b/siro_rider/packages/get/example_nav2/lib/app/modules/product_details/controllers/product_details_controller.dart new file mode 100644 index 0000000..d894e10 --- /dev/null +++ b/siro_rider/packages/get/example_nav2/lib/app/modules/product_details/controllers/product_details_controller.dart @@ -0,0 +1,18 @@ +import 'package:get/get.dart'; + +class ProductDetailsController extends GetxController { + final String productId; + + ProductDetailsController(this.productId); + @override + void onInit() { + super.onInit(); + Get.log('ProductDetailsController created with id: $productId'); + } + + @override + void onClose() { + Get.log('ProductDetailsController close with id: $productId'); + super.onClose(); + } +} diff --git a/siro_rider/packages/get/example_nav2/lib/app/modules/product_details/views/product_details_view.dart b/siro_rider/packages/get/example_nav2/lib/app/modules/product_details/views/product_details_view.dart new file mode 100644 index 0000000..7938691 --- /dev/null +++ b/siro_rider/packages/get/example_nav2/lib/app/modules/product_details/views/product_details_view.dart @@ -0,0 +1,25 @@ +import 'package:flutter/material.dart'; + +import 'package:get/get.dart'; + +import '../controllers/product_details_controller.dart'; + +class ProductDetailsView extends GetWidget { + @override + Widget build(BuildContext context) { + return Scaffold( + body: Center( + child: Column( + mainAxisSize: MainAxisSize.min, + children: [ + Text( + 'ProductDetailsView is working', + style: TextStyle(fontSize: 20), + ), + Text('ProductId: ${controller.productId}') + ], + ), + ), + ); + } +} diff --git a/siro_rider/packages/get/example_nav2/lib/app/modules/products/bindings/products_binding.dart b/siro_rider/packages/get/example_nav2/lib/app/modules/products/bindings/products_binding.dart new file mode 100644 index 0000000..e7c762d --- /dev/null +++ b/siro_rider/packages/get/example_nav2/lib/app/modules/products/bindings/products_binding.dart @@ -0,0 +1,12 @@ +import 'package:get/get.dart'; + +import '../controllers/products_controller.dart'; + +class ProductsBinding extends Bindings { + @override + void dependencies() { + Get.lazyPut( + () => ProductsController(), + ); + } +} diff --git a/siro_rider/packages/get/example_nav2/lib/app/modules/products/controllers/products_controller.dart b/siro_rider/packages/get/example_nav2/lib/app/modules/products/controllers/products_controller.dart new file mode 100644 index 0000000..13f3acf --- /dev/null +++ b/siro_rider/packages/get/example_nav2/lib/app/modules/products/controllers/products_controller.dart @@ -0,0 +1,28 @@ +import 'package:get/get.dart'; + +import '../../../../models/demo_product.dart'; + +class ProductsController extends GetxController { + final products = [].obs; + + void loadDemoProductsFromSomeWhere() { + products.add( + DemoProduct( + name: 'Product added on: ${DateTime.now().toString()}', + id: DateTime.now().millisecondsSinceEpoch.toString(), + ), + ); + } + + @override + void onReady() { + super.onReady(); + loadDemoProductsFromSomeWhere(); + } + + @override + void onClose() { + Get.printInfo(info: 'Products: onClose'); + super.onClose(); + } +} diff --git a/siro_rider/packages/get/example_nav2/lib/app/modules/products/views/products_view.dart b/siro_rider/packages/get/example_nav2/lib/app/modules/products/views/products_view.dart new file mode 100644 index 0000000..2a72353 --- /dev/null +++ b/siro_rider/packages/get/example_nav2/lib/app/modules/products/views/products_view.dart @@ -0,0 +1,49 @@ +import 'package:flutter/material.dart'; +import 'package:get/get.dart'; + +import '../../../routes/app_pages.dart'; +import '../controllers/products_controller.dart'; + +class ProductsView extends GetView { + @override + Widget build(BuildContext context) { + return Scaffold( + floatingActionButton: FloatingActionButton.extended( + onPressed: controller.loadDemoProductsFromSomeWhere, + label: Text('Add'), + ), + body: Column( + children: [ + Hero( + tag: 'heroLogo', + child: const FlutterLogo(), + ), + Expanded( + child: Obx( + () => RefreshIndicator( + onRefresh: () async { + controller.products.clear(); + controller.loadDemoProductsFromSomeWhere(); + }, + child: ListView.builder( + itemCount: controller.products.length, + itemBuilder: (context, index) { + final item = controller.products[index]; + return ListTile( + onTap: () { + Get.rootDelegate + .toNamed(Routes.PRODUCT_DETAILS(item.id)); + }, + title: Text(item.name), + subtitle: Text(item.id), + ); + }, + ), + ), + ), + ), + ], + ), + ); + } +} diff --git a/siro_rider/packages/get/example_nav2/lib/app/modules/profile/bindings/profile_binding.dart b/siro_rider/packages/get/example_nav2/lib/app/modules/profile/bindings/profile_binding.dart new file mode 100644 index 0000000..5eb3b2b --- /dev/null +++ b/siro_rider/packages/get/example_nav2/lib/app/modules/profile/bindings/profile_binding.dart @@ -0,0 +1,12 @@ +import 'package:get/get.dart'; + +import '../controllers/profile_controller.dart'; + +class ProfileBinding extends Bindings { + @override + void dependencies() { + Get.lazyPut( + () => ProfileController(), + ); + } +} diff --git a/siro_rider/packages/get/example_nav2/lib/app/modules/profile/controllers/profile_controller.dart b/siro_rider/packages/get/example_nav2/lib/app/modules/profile/controllers/profile_controller.dart new file mode 100644 index 0000000..85bb3e0 --- /dev/null +++ b/siro_rider/packages/get/example_nav2/lib/app/modules/profile/controllers/profile_controller.dart @@ -0,0 +1,3 @@ +import 'package:get/get.dart'; + +class ProfileController extends GetxController {} diff --git a/siro_rider/packages/get/example_nav2/lib/app/modules/profile/views/profile_view.dart b/siro_rider/packages/get/example_nav2/lib/app/modules/profile/views/profile_view.dart new file mode 100644 index 0000000..168b6aa --- /dev/null +++ b/siro_rider/packages/get/example_nav2/lib/app/modules/profile/views/profile_view.dart @@ -0,0 +1,51 @@ +import 'package:flutter/material.dart'; +import 'package:get/get.dart'; + +import '../../../routes/app_pages.dart'; +import '../controllers/profile_controller.dart'; + +class ProfileView extends GetView { + @override + Widget build(BuildContext context) { + return Scaffold( + backgroundColor: Colors.amber, + body: Center( + child: Column( + mainAxisSize: MainAxisSize.min, + children: [ + Text( + 'ProfileView is working', + style: TextStyle(fontSize: 20), + ), + Hero( + tag: 'heroLogo', + child: const FlutterLogo(), + ), + MaterialButton( + child: Text('Show a test dialog'), + onPressed: () { + //shows a dialog + Get.defaultDialog( + title: 'Test Dialog !!', + barrierDismissible: true, + ); + }, + ), + MaterialButton( + child: Text('Show a test dialog in Home router outlet'), + onPressed: () { + //shows a dialog + + Get.defaultDialog( + title: 'Test Dialog In Home Outlet !!', + barrierDismissible: true, + navigatorKey: Get.nestedKey(Routes.HOME), + ); + }, + ) + ], + ), + ), + ); + } +} diff --git a/siro_rider/packages/get/example_nav2/lib/app/modules/root/bindings/root_binding.dart b/siro_rider/packages/get/example_nav2/lib/app/modules/root/bindings/root_binding.dart new file mode 100644 index 0000000..e1e94d1 --- /dev/null +++ b/siro_rider/packages/get/example_nav2/lib/app/modules/root/bindings/root_binding.dart @@ -0,0 +1,12 @@ +import 'package:get/get.dart'; + +import '../controllers/root_controller.dart'; + +class RootBinding extends Bindings { + @override + void dependencies() { + Get.lazyPut( + () => RootController(), + ); + } +} diff --git a/siro_rider/packages/get/example_nav2/lib/app/modules/root/controllers/root_controller.dart b/siro_rider/packages/get/example_nav2/lib/app/modules/root/controllers/root_controller.dart new file mode 100644 index 0000000..826348f --- /dev/null +++ b/siro_rider/packages/get/example_nav2/lib/app/modules/root/controllers/root_controller.dart @@ -0,0 +1,20 @@ +import 'package:get/get.dart'; + +class RootController extends GetxController { + //TODO: Implement RootController + + final count = 0.obs; + @override + void onInit() { + super.onInit(); + } + + @override + void onReady() { + super.onReady(); + } + + @override + void onClose() {} + void increment() => count.value++; +} diff --git a/siro_rider/packages/get/example_nav2/lib/app/modules/root/views/drawer.dart b/siro_rider/packages/get/example_nav2/lib/app/modules/root/views/drawer.dart new file mode 100644 index 0000000..be7d53a --- /dev/null +++ b/siro_rider/packages/get/example_nav2/lib/app/modules/root/views/drawer.dart @@ -0,0 +1,74 @@ +import 'package:flutter/material.dart'; +import 'package:get/get.dart'; + +import '../../../../services/auth_service.dart'; +import '../../../routes/app_pages.dart'; + +class DrawerWidget extends StatelessWidget { + const DrawerWidget({ + Key? key, + }) : super(key: key); + + @override + Widget build(BuildContext context) { + return Drawer( + child: Column( + children: [ + Container( + height: 100, + color: Colors.red, + ), + ListTile( + title: Text('Home'), + onTap: () { + Get.rootDelegate.toNamed(Routes.HOME); + //to close the drawer + + Navigator.of(context).pop(); + }, + ), + ListTile( + title: Text('Settings'), + onTap: () { + Get.rootDelegate.toNamed(Routes.SETTINGS); + //to close the drawer + + Navigator.of(context).pop(); + }, + ), + if (AuthService.to.isLoggedInValue) + ListTile( + title: Text( + 'Logout', + style: TextStyle( + color: Colors.red, + ), + ), + onTap: () { + AuthService.to.logout(); + Get.rootDelegate.toNamed(Routes.LOGIN); + //to close the drawer + + Navigator.of(context).pop(); + }, + ), + if (!AuthService.to.isLoggedInValue) + ListTile( + title: Text( + 'Login', + style: TextStyle( + color: Colors.blue, + ), + ), + onTap: () { + Get.rootDelegate.toNamed(Routes.LOGIN); + //to close the drawer + + Navigator.of(context).pop(); + }, + ), + ], + ), + ); + } +} diff --git a/siro_rider/packages/get/example_nav2/lib/app/modules/root/views/root_view.dart b/siro_rider/packages/get/example_nav2/lib/app/modules/root/views/root_view.dart new file mode 100644 index 0000000..a7e0c07 --- /dev/null +++ b/siro_rider/packages/get/example_nav2/lib/app/modules/root/views/root_view.dart @@ -0,0 +1,31 @@ +import 'package:flutter/material.dart'; +import 'package:get/get.dart'; + +import '../../../routes/app_pages.dart'; +import '../controllers/root_controller.dart'; +import 'drawer.dart'; + +class RootView extends GetView { + @override + Widget build(BuildContext context) { + return GetRouterOutlet.builder( + builder: (context, delegate, current) { + final title = current?.location; + return Scaffold( + drawer: DrawerWidget(), + appBar: AppBar( + title: Text(title ?? ''), + centerTitle: true, + ), + body: GetRouterOutlet( + initialRoute: Routes.HOME, + // anchorRoute: '/', + // filterPages: (afterAnchor) { + // return afterAnchor.take(1); + // }, + ), + ); + }, + ); + } +} diff --git a/siro_rider/packages/get/example_nav2/lib/app/modules/settings/bindings/settings_binding.dart b/siro_rider/packages/get/example_nav2/lib/app/modules/settings/bindings/settings_binding.dart new file mode 100644 index 0000000..fb567f0 --- /dev/null +++ b/siro_rider/packages/get/example_nav2/lib/app/modules/settings/bindings/settings_binding.dart @@ -0,0 +1,12 @@ +import 'package:get/get.dart'; + +import '../controllers/settings_controller.dart'; + +class SettingsBinding extends Bindings { + @override + void dependencies() { + Get.lazyPut( + () => SettingsController(), + ); + } +} diff --git a/siro_rider/packages/get/example_nav2/lib/app/modules/settings/controllers/settings_controller.dart b/siro_rider/packages/get/example_nav2/lib/app/modules/settings/controllers/settings_controller.dart new file mode 100644 index 0000000..265e54b --- /dev/null +++ b/siro_rider/packages/get/example_nav2/lib/app/modules/settings/controllers/settings_controller.dart @@ -0,0 +1,20 @@ +import 'package:get/get.dart'; + +class SettingsController extends GetxController { + //TODO: Implement SettingsController + + final count = 0.obs; + @override + void onInit() { + super.onInit(); + } + + @override + void onReady() { + super.onReady(); + } + + @override + void onClose() {} + void increment() => count.value++; +} diff --git a/siro_rider/packages/get/example_nav2/lib/app/modules/settings/views/settings_view.dart b/siro_rider/packages/get/example_nav2/lib/app/modules/settings/views/settings_view.dart new file mode 100644 index 0000000..8880264 --- /dev/null +++ b/siro_rider/packages/get/example_nav2/lib/app/modules/settings/views/settings_view.dart @@ -0,0 +1,19 @@ +import 'package:flutter/material.dart'; + +import 'package:get/get.dart'; + +import '../controllers/settings_controller.dart'; + +class SettingsView extends GetView { + @override + Widget build(BuildContext context) { + return Scaffold( + body: Center( + child: Text( + 'SettingsView is working', + style: TextStyle(fontSize: 20), + ), + ), + ); + } +} diff --git a/siro_rider/packages/get/example_nav2/lib/app/routes/app_pages.dart b/siro_rider/packages/get/example_nav2/lib/app/routes/app_pages.dart new file mode 100644 index 0000000..456a935 --- /dev/null +++ b/siro_rider/packages/get/example_nav2/lib/app/routes/app_pages.dart @@ -0,0 +1,98 @@ +import 'package:get/get.dart'; + +import '../middleware/auth_middleware.dart'; +import '../modules/dashboard/bindings/dashboard_binding.dart'; +import '../modules/dashboard/views/dashboard_view.dart'; +import '../modules/home/bindings/home_binding.dart'; +import '../modules/home/views/home_view.dart'; +import '../modules/login/bindings/login_binding.dart'; +import '../modules/login/views/login_view.dart'; +import '../modules/product_details/bindings/product_details_binding.dart'; +import '../modules/product_details/views/product_details_view.dart'; +import '../modules/products/bindings/products_binding.dart'; +import '../modules/products/views/products_view.dart'; +import '../modules/profile/bindings/profile_binding.dart'; +import '../modules/profile/views/profile_view.dart'; +import '../modules/root/bindings/root_binding.dart'; +import '../modules/root/views/root_view.dart'; +import '../modules/settings/bindings/settings_binding.dart'; +import '../modules/settings/views/settings_view.dart'; + +part 'app_routes.dart'; + +class AppPages { + AppPages._(); + + static const INITIAL = Routes.HOME; + + static final routes = [ + GetPage( + name: '/', + page: () => RootView(), + binding: RootBinding(), + participatesInRootNavigator: true, + preventDuplicates: true, + children: [ + GetPage( + middlewares: [ + //only enter this route when not authed + EnsureNotAuthedMiddleware(), + ], + name: _Paths.LOGIN, + page: () => LoginView(), + binding: LoginBinding(), + ), + GetPage( + preventDuplicates: true, + name: _Paths.HOME, + page: () => HomeView(), + bindings: [ + HomeBinding(), + ], + title: null, + children: [ + GetPage( + name: _Paths.DASHBOARD, + page: () => DashboardView(), + binding: DashboardBinding(), + ), + GetPage( + middlewares: [ + //only enter this route when authed + EnsureAuthMiddleware(), + ], + name: _Paths.PROFILE, + page: () => ProfileView(), + title: 'Profile', + transition: Transition.size, + binding: ProfileBinding(), + ), + GetPage( + name: _Paths.PRODUCTS, + page: () => ProductsView(), + title: 'Products', + transition: Transition.zoom, + binding: ProductsBinding(), + children: [ + GetPage( + name: _Paths.PRODUCT_DETAILS, + page: () => ProductDetailsView(), + binding: ProductDetailsBinding(), + middlewares: [ + //only enter this route when authed + EnsureAuthMiddleware(), + ], + ), + ], + ), + ], + ), + GetPage( + name: _Paths.SETTINGS, + page: () => SettingsView(), + binding: SettingsBinding(), + ), + ], + ), + ]; +} diff --git a/siro_rider/packages/get/example_nav2/lib/app/routes/app_routes.dart b/siro_rider/packages/get/example_nav2/lib/app/routes/app_routes.dart new file mode 100644 index 0000000..ef2b20d --- /dev/null +++ b/siro_rider/packages/get/example_nav2/lib/app/routes/app_routes.dart @@ -0,0 +1,30 @@ +// ignore_for_file: non_constant_identifier_names + +part of 'app_pages.dart'; +// DO NOT EDIT. This is code generated via package:get_cli/get_cli.dart + +abstract class Routes { + static const HOME = _Paths.HOME; + + static const PROFILE = _Paths.HOME + _Paths.PROFILE; + static const SETTINGS = _Paths.SETTINGS; + + static const PRODUCTS = _Paths.HOME + _Paths.PRODUCTS; + + static const LOGIN = _Paths.LOGIN; + static const DASHBOARD = _Paths.HOME + _Paths.DASHBOARD; + Routes._(); + static String LOGIN_THEN(String afterSuccessfulLogin) => + '$LOGIN?then=${Uri.encodeQueryComponent(afterSuccessfulLogin)}'; + static String PRODUCT_DETAILS(String productId) => '$PRODUCTS/$productId'; +} + +abstract class _Paths { + static const HOME = '/home'; + static const PRODUCTS = '/products'; + static const PROFILE = '/profile'; + static const SETTINGS = '/settings'; + static const PRODUCT_DETAILS = '/:productId'; + static const LOGIN = '/login'; + static const DASHBOARD = '/dashboard'; +} diff --git a/siro_rider/packages/get/example_nav2/lib/main.dart b/siro_rider/packages/get/example_nav2/lib/main.dart new file mode 100644 index 0000000..6de39d3 --- /dev/null +++ b/siro_rider/packages/get/example_nav2/lib/main.dart @@ -0,0 +1,27 @@ +import 'package:flutter/material.dart'; +import 'package:get/get.dart'; + +import 'app/routes/app_pages.dart'; +import 'services/auth_service.dart'; + +void main() { + runApp( + GetMaterialApp.router( + title: "Application", + initialBinding: BindingsBuilder( + () { + Get.put(AuthService()); + }, + ), + getPages: AppPages.routes, + // routeInformationParser: GetInformationParser( + // // initialRoute: Routes.HOME, + // ), + // routerDelegate: GetDelegate( + // backButtonPopMode: PopMode.History, + // preventDuplicateHandlingMode: + // PreventDuplicateHandlingMode.ReorderRoutes, + // ), + ), + ); +} diff --git a/siro_rider/packages/get/example_nav2/lib/models/demo_product.dart b/siro_rider/packages/get/example_nav2/lib/models/demo_product.dart new file mode 100644 index 0000000..f94f378 --- /dev/null +++ b/siro_rider/packages/get/example_nav2/lib/models/demo_product.dart @@ -0,0 +1,9 @@ +class DemoProduct { + final String name; + final String id; + + DemoProduct({ + required this.name, + required this.id, + }); +} diff --git a/siro_rider/packages/get/example_nav2/lib/services/auth_service.dart b/siro_rider/packages/get/example_nav2/lib/services/auth_service.dart new file mode 100644 index 0000000..90b0559 --- /dev/null +++ b/siro_rider/packages/get/example_nav2/lib/services/auth_service.dart @@ -0,0 +1,17 @@ +import 'package:get/get.dart'; + +class AuthService extends GetxService { + static AuthService get to => Get.find(); + + /// Mocks a login process + final isLoggedIn = false.obs; + bool get isLoggedInValue => isLoggedIn.value; + + void login() { + isLoggedIn.value = true; + } + + void logout() { + isLoggedIn.value = false; + } +} diff --git a/siro_rider/packages/get/example_nav2/pubspec.lock b/siro_rider/packages/get/example_nav2/pubspec.lock new file mode 100644 index 0000000..cd7697b --- /dev/null +++ b/siro_rider/packages/get/example_nav2/pubspec.lock @@ -0,0 +1,212 @@ +# Generated by pub +# See https://dart.dev/tools/pub/glossary#lockfile +packages: + async: + dependency: transitive + description: + name: async + sha256: e2eb0491ba5ddb6177742d2da23904574082139b07c1e33b8503b9f46f3e1a37 + url: "https://pub.dev" + source: hosted + version: "2.13.1" + boolean_selector: + dependency: transitive + description: + name: boolean_selector + sha256: "8aab1771e1243a5063b8b0ff68042d67334e3feab9e95b9490f9a6ebf73b42ea" + url: "https://pub.dev" + source: hosted + version: "2.1.2" + characters: + dependency: transitive + description: + name: characters + sha256: faf38497bda5ead2a8c7615f4f7939df04333478bf32e4173fcb06d428b5716b + url: "https://pub.dev" + source: hosted + version: "1.4.1" + clock: + dependency: transitive + description: + name: clock + sha256: fddb70d9b5277016c77a80201021d40a2247104d9f4aa7bab7157b7e3f05b84b + url: "https://pub.dev" + source: hosted + version: "1.1.2" + collection: + dependency: transitive + description: + name: collection + sha256: "2f5709ae4d3d59dd8f7cd309b4e023046b57d8a6c82130785d2b0e5868084e76" + url: "https://pub.dev" + source: hosted + version: "1.19.1" + cupertino_icons: + dependency: "direct main" + description: + name: cupertino_icons + sha256: "41e005c33bd814be4d3096aff55b1908d419fde52ca656c8c47719ec745873cd" + url: "https://pub.dev" + source: hosted + version: "1.0.9" + effective_dart: + dependency: "direct main" + description: + name: effective_dart + sha256: "5c177606846432cafa701ed883b907a6807c59417d689b49a5d7b9de012dffc5" + url: "https://pub.dev" + source: hosted + version: "1.3.1" + fake_async: + dependency: transitive + description: + name: fake_async + sha256: "5368f224a74523e8d2e7399ea1638b37aecfca824a3cc4dfdf77bf1fa905ac44" + url: "https://pub.dev" + source: hosted + version: "1.3.3" + flutter: + dependency: "direct main" + description: flutter + source: sdk + version: "0.0.0" + flutter_test: + dependency: "direct dev" + description: flutter + source: sdk + version: "0.0.0" + get: + dependency: "direct main" + description: + path: ".." + relative: true + source: path + version: "4.6.5" + leak_tracker: + dependency: transitive + description: + name: leak_tracker + sha256: "33e2e26bdd85a0112ec15400c8cbffea70d0f9c3407491f672a2fad47915e2de" + url: "https://pub.dev" + source: hosted + version: "11.0.2" + leak_tracker_flutter_testing: + dependency: transitive + description: + name: leak_tracker_flutter_testing + sha256: "1dbc140bb5a23c75ea9c4811222756104fbcd1a27173f0c34ca01e16bea473c1" + url: "https://pub.dev" + source: hosted + version: "3.0.10" + leak_tracker_testing: + dependency: transitive + description: + name: leak_tracker_testing + sha256: "8d5a2d49f4a66b49744b23b018848400d23e54caf9463f4eb20df3eb8acb2eb1" + url: "https://pub.dev" + source: hosted + version: "3.0.2" + matcher: + dependency: transitive + description: + name: matcher + sha256: "12956d0ad8390bbcc63ca2e1469c0619946ccb52809807067a7020d57e647aa6" + url: "https://pub.dev" + source: hosted + version: "0.12.18" + material_color_utilities: + dependency: transitive + description: + name: material_color_utilities + sha256: "9c337007e82b1889149c82ed242ed1cb24a66044e30979c44912381e9be4c48b" + url: "https://pub.dev" + source: hosted + version: "0.13.0" + meta: + dependency: transitive + description: + name: meta + sha256: "23f08335362185a5ea2ad3a4e597f1375e78bce8a040df5c600c8d3552ef2394" + url: "https://pub.dev" + source: hosted + version: "1.17.0" + path: + dependency: transitive + description: + name: path + sha256: "75cca69d1490965be98c73ceaea117e8a04dd21217b37b292c9ddbec0d955bc5" + url: "https://pub.dev" + source: hosted + version: "1.9.1" + sky_engine: + dependency: transitive + description: flutter + source: sdk + version: "0.0.0" + source_span: + dependency: transitive + description: + name: source_span + sha256: "56a02f1f4cd1a2d96303c0144c93bd6d909eea6bee6bf5a0e0b685edbd4c47ab" + url: "https://pub.dev" + source: hosted + version: "1.10.2" + stack_trace: + dependency: transitive + description: + name: stack_trace + sha256: "8b27215b45d22309b5cddda1aa2b19bdfec9df0e765f2de506401c071d38d1b1" + url: "https://pub.dev" + source: hosted + version: "1.12.1" + stream_channel: + dependency: transitive + description: + name: stream_channel + sha256: "969e04c80b8bcdf826f8f16579c7b14d780458bd97f56d107d3950fdbeef059d" + url: "https://pub.dev" + source: hosted + version: "2.1.4" + string_scanner: + dependency: transitive + description: + name: string_scanner + sha256: "921cd31725b72fe181906c6a94d987c78e3b98c2e205b397ea399d4054872b43" + url: "https://pub.dev" + source: hosted + version: "1.4.1" + term_glyph: + dependency: transitive + description: + name: term_glyph + sha256: "7f554798625ea768a7518313e58f83891c7f5024f88e46e7182a4558850a4b8e" + url: "https://pub.dev" + source: hosted + version: "1.2.2" + test_api: + dependency: transitive + description: + name: test_api + sha256: "93167629bfc610f71560ab9312acdda4959de4df6fac7492c89ff0d3886f6636" + url: "https://pub.dev" + source: hosted + version: "0.7.9" + vector_math: + dependency: transitive + description: + name: vector_math + sha256: d530bd74fea330e6e364cda7a85019c434070188383e1cd8d9777ee586914c5b + url: "https://pub.dev" + source: hosted + version: "2.2.0" + vm_service: + dependency: transitive + description: + name: vm_service + sha256: "046d3928e16fa4dc46e8350415661755ab759d9fc97fc21b5ab295f71e4f0499" + url: "https://pub.dev" + source: hosted + version: "15.1.0" +sdks: + dart: ">=3.9.0 <4.0.0" + flutter: ">=3.18.0-18.0.pre.54" diff --git a/siro_rider/packages/get/example_nav2/pubspec.yaml b/siro_rider/packages/get/example_nav2/pubspec.yaml new file mode 100644 index 0000000..c13b55c --- /dev/null +++ b/siro_rider/packages/get/example_nav2/pubspec.yaml @@ -0,0 +1,22 @@ +name: example_nav2 +version: 1.0.0+1 +publish_to: none +description: A new Flutter project. +environment: + sdk: ">=2.12.0 <3.0.0" + +dependencies: + cupertino_icons: ^1.0.2 + effective_dart: 1.3.1 + # get: ^4.1.4 + get: + path: ../ + flutter: + sdk: flutter + +dev_dependencies: + flutter_test: + sdk: flutter + +flutter: + uses-material-design: true diff --git a/siro_rider/packages/get/example_nav2/web/favicon.png b/siro_rider/packages/get/example_nav2/web/favicon.png new file mode 100644 index 0000000..8aaa46a Binary files /dev/null and b/siro_rider/packages/get/example_nav2/web/favicon.png differ diff --git a/siro_rider/packages/get/example_nav2/web/icons/Icon-192.png b/siro_rider/packages/get/example_nav2/web/icons/Icon-192.png new file mode 100644 index 0000000..b749bfe Binary files /dev/null and b/siro_rider/packages/get/example_nav2/web/icons/Icon-192.png differ diff --git a/siro_rider/packages/get/example_nav2/web/icons/Icon-512.png b/siro_rider/packages/get/example_nav2/web/icons/Icon-512.png new file mode 100644 index 0000000..88cfd48 Binary files /dev/null and b/siro_rider/packages/get/example_nav2/web/icons/Icon-512.png differ diff --git a/siro_rider/packages/get/example_nav2/web/index.html b/siro_rider/packages/get/example_nav2/web/index.html new file mode 100644 index 0000000..0bb814e --- /dev/null +++ b/siro_rider/packages/get/example_nav2/web/index.html @@ -0,0 +1,98 @@ + + + + + + + + + + + + + + + + + example_nav2 + + + + + + + diff --git a/siro_rider/packages/get/example_nav2/web/manifest.json b/siro_rider/packages/get/example_nav2/web/manifest.json new file mode 100644 index 0000000..01c5d38 --- /dev/null +++ b/siro_rider/packages/get/example_nav2/web/manifest.json @@ -0,0 +1,23 @@ +{ + "name": "example_nav2", + "short_name": "example_nav2", + "start_url": ".", + "display": "standalone", + "background_color": "#0175C2", + "theme_color": "#0175C2", + "description": "A new Flutter project.", + "orientation": "portrait-primary", + "prefer_related_applications": false, + "icons": [ + { + "src": "icons/Icon-192.png", + "sizes": "192x192", + "type": "image/png" + }, + { + "src": "icons/Icon-512.png", + "sizes": "512x512", + "type": "image/png" + } + ] +} diff --git a/siro_rider/packages/get/example_nav2/windows/CMakeLists.txt b/siro_rider/packages/get/example_nav2/windows/CMakeLists.txt new file mode 100644 index 0000000..714311a --- /dev/null +++ b/siro_rider/packages/get/example_nav2/windows/CMakeLists.txt @@ -0,0 +1,95 @@ +cmake_minimum_required(VERSION 3.15) +project(example_nav2 LANGUAGES CXX) + +set(BINARY_NAME "example_nav2") + +cmake_policy(SET CMP0063 NEW) + +set(CMAKE_INSTALL_RPATH "$ORIGIN/lib") + +# Configure build options. +get_property(IS_MULTICONFIG GLOBAL PROPERTY GENERATOR_IS_MULTI_CONFIG) +if(IS_MULTICONFIG) + set(CMAKE_CONFIGURATION_TYPES "Debug;Profile;Release" + CACHE STRING "" FORCE) +else() + if(NOT CMAKE_BUILD_TYPE AND NOT CMAKE_CONFIGURATION_TYPES) + set(CMAKE_BUILD_TYPE "Debug" CACHE + STRING "Flutter build mode" FORCE) + set_property(CACHE CMAKE_BUILD_TYPE PROPERTY STRINGS + "Debug" "Profile" "Release") + endif() +endif() + +set(CMAKE_EXE_LINKER_FLAGS_PROFILE "${CMAKE_EXE_LINKER_FLAGS_RELEASE}") +set(CMAKE_SHARED_LINKER_FLAGS_PROFILE "${CMAKE_SHARED_LINKER_FLAGS_RELEASE}") +set(CMAKE_C_FLAGS_PROFILE "${CMAKE_C_FLAGS_RELEASE}") +set(CMAKE_CXX_FLAGS_PROFILE "${CMAKE_CXX_FLAGS_RELEASE}") + +# Use Unicode for all projects. +add_definitions(-DUNICODE -D_UNICODE) + +# Compilation settings that should be applied to most targets. +function(APPLY_STANDARD_SETTINGS TARGET) + target_compile_features(${TARGET} PUBLIC cxx_std_17) + target_compile_options(${TARGET} PRIVATE /W4 /WX /wd"4100") + target_compile_options(${TARGET} PRIVATE /EHsc) + target_compile_definitions(${TARGET} PRIVATE "_HAS_EXCEPTIONS=0") + target_compile_definitions(${TARGET} PRIVATE "$<$:_DEBUG>") +endfunction() + +set(FLUTTER_MANAGED_DIR "${CMAKE_CURRENT_SOURCE_DIR}/flutter") + +# Flutter library and tool build rules. +add_subdirectory(${FLUTTER_MANAGED_DIR}) + +# Application build +add_subdirectory("runner") + +# Generated plugin build rules, which manage building the plugins and adding +# them to the application. +include(flutter/generated_plugins.cmake) + + +# === Installation === +# Support files are copied into place next to the executable, so that it can +# run in place. This is done instead of making a separate bundle (as on Linux) +# so that building and running from within Visual Studio will work. +set(BUILD_BUNDLE_DIR "$") +# Make the "install" step default, as it's required to run. +set(CMAKE_VS_INCLUDE_INSTALL_TO_DEFAULT_BUILD 1) +if(CMAKE_INSTALL_PREFIX_INITIALIZED_TO_DEFAULT) + set(CMAKE_INSTALL_PREFIX "${BUILD_BUNDLE_DIR}" CACHE PATH "..." FORCE) +endif() + +set(INSTALL_BUNDLE_DATA_DIR "${CMAKE_INSTALL_PREFIX}/data") +set(INSTALL_BUNDLE_LIB_DIR "${CMAKE_INSTALL_PREFIX}") + +install(TARGETS ${BINARY_NAME} RUNTIME DESTINATION "${CMAKE_INSTALL_PREFIX}" + COMPONENT Runtime) + +install(FILES "${FLUTTER_ICU_DATA_FILE}" DESTINATION "${INSTALL_BUNDLE_DATA_DIR}" + COMPONENT Runtime) + +install(FILES "${FLUTTER_LIBRARY}" DESTINATION "${INSTALL_BUNDLE_LIB_DIR}" + COMPONENT Runtime) + +if(PLUGIN_BUNDLED_LIBRARIES) + install(FILES "${PLUGIN_BUNDLED_LIBRARIES}" + DESTINATION "${INSTALL_BUNDLE_LIB_DIR}" + COMPONENT Runtime) +endif() + +# Fully re-copy the assets directory on each build to avoid having stale files +# from a previous install. +set(FLUTTER_ASSET_DIR_NAME "flutter_assets") +install(CODE " + file(REMOVE_RECURSE \"${INSTALL_BUNDLE_DATA_DIR}/${FLUTTER_ASSET_DIR_NAME}\") + " COMPONENT Runtime) +install(DIRECTORY "${PROJECT_BUILD_DIR}/${FLUTTER_ASSET_DIR_NAME}" + DESTINATION "${INSTALL_BUNDLE_DATA_DIR}" COMPONENT Runtime) + +# Install the AOT library on non-Debug builds only. +install(FILES "${AOT_LIBRARY}" DESTINATION "${INSTALL_BUNDLE_DATA_DIR}" + CONFIGURATIONS Profile;Release + COMPONENT Runtime) diff --git a/siro_rider/packages/get/example_nav2/windows/flutter/CMakeLists.txt b/siro_rider/packages/get/example_nav2/windows/flutter/CMakeLists.txt new file mode 100644 index 0000000..b02c548 --- /dev/null +++ b/siro_rider/packages/get/example_nav2/windows/flutter/CMakeLists.txt @@ -0,0 +1,103 @@ +cmake_minimum_required(VERSION 3.15) + +set(EPHEMERAL_DIR "${CMAKE_CURRENT_SOURCE_DIR}/ephemeral") + +# Configuration provided via flutter tool. +include(${EPHEMERAL_DIR}/generated_config.cmake) + +# TODO: Move the rest of this into files in ephemeral. See +# https://github.com/flutter/flutter/issues/57146. +set(WRAPPER_ROOT "${EPHEMERAL_DIR}/cpp_client_wrapper") + +# === Flutter Library === +set(FLUTTER_LIBRARY "${EPHEMERAL_DIR}/flutter_windows.dll") + +# Published to parent scope for install step. +set(FLUTTER_LIBRARY ${FLUTTER_LIBRARY} PARENT_SCOPE) +set(FLUTTER_ICU_DATA_FILE "${EPHEMERAL_DIR}/icudtl.dat" PARENT_SCOPE) +set(PROJECT_BUILD_DIR "${PROJECT_DIR}/build/" PARENT_SCOPE) +set(AOT_LIBRARY "${PROJECT_DIR}/build/windows/app.so" PARENT_SCOPE) + +list(APPEND FLUTTER_LIBRARY_HEADERS + "flutter_export.h" + "flutter_windows.h" + "flutter_messenger.h" + "flutter_plugin_registrar.h" + "flutter_texture_registrar.h" +) +list(TRANSFORM FLUTTER_LIBRARY_HEADERS PREPEND "${EPHEMERAL_DIR}/") +add_library(flutter INTERFACE) +target_include_directories(flutter INTERFACE + "${EPHEMERAL_DIR}" +) +target_link_libraries(flutter INTERFACE "${FLUTTER_LIBRARY}.lib") +add_dependencies(flutter flutter_assemble) + +# === Wrapper === +list(APPEND CPP_WRAPPER_SOURCES_CORE + "core_implementations.cc" + "standard_codec.cc" +) +list(TRANSFORM CPP_WRAPPER_SOURCES_CORE PREPEND "${WRAPPER_ROOT}/") +list(APPEND CPP_WRAPPER_SOURCES_PLUGIN + "plugin_registrar.cc" +) +list(TRANSFORM CPP_WRAPPER_SOURCES_PLUGIN PREPEND "${WRAPPER_ROOT}/") +list(APPEND CPP_WRAPPER_SOURCES_APP + "flutter_engine.cc" + "flutter_view_controller.cc" +) +list(TRANSFORM CPP_WRAPPER_SOURCES_APP PREPEND "${WRAPPER_ROOT}/") + +# Wrapper sources needed for a plugin. +add_library(flutter_wrapper_plugin STATIC + ${CPP_WRAPPER_SOURCES_CORE} + ${CPP_WRAPPER_SOURCES_PLUGIN} +) +apply_standard_settings(flutter_wrapper_plugin) +set_target_properties(flutter_wrapper_plugin PROPERTIES + POSITION_INDEPENDENT_CODE ON) +set_target_properties(flutter_wrapper_plugin PROPERTIES + CXX_VISIBILITY_PRESET hidden) +target_link_libraries(flutter_wrapper_plugin PUBLIC flutter) +target_include_directories(flutter_wrapper_plugin PUBLIC + "${WRAPPER_ROOT}/include" +) +add_dependencies(flutter_wrapper_plugin flutter_assemble) + +# Wrapper sources needed for the runner. +add_library(flutter_wrapper_app STATIC + ${CPP_WRAPPER_SOURCES_CORE} + ${CPP_WRAPPER_SOURCES_APP} +) +apply_standard_settings(flutter_wrapper_app) +target_link_libraries(flutter_wrapper_app PUBLIC flutter) +target_include_directories(flutter_wrapper_app PUBLIC + "${WRAPPER_ROOT}/include" +) +add_dependencies(flutter_wrapper_app flutter_assemble) + +# === Flutter tool backend === +# _phony_ is a non-existent file to force this command to run every time, +# since currently there's no way to get a full input/output list from the +# flutter tool. +set(PHONY_OUTPUT "${CMAKE_CURRENT_BINARY_DIR}/_phony_") +set_source_files_properties("${PHONY_OUTPUT}" PROPERTIES SYMBOLIC TRUE) +add_custom_command( + OUTPUT ${FLUTTER_LIBRARY} ${FLUTTER_LIBRARY_HEADERS} + ${CPP_WRAPPER_SOURCES_CORE} ${CPP_WRAPPER_SOURCES_PLUGIN} + ${CPP_WRAPPER_SOURCES_APP} + ${PHONY_OUTPUT} + COMMAND ${CMAKE_COMMAND} -E env + ${FLUTTER_TOOL_ENVIRONMENT} + "${FLUTTER_ROOT}/packages/flutter_tools/bin/tool_backend.bat" + windows-x64 $ + VERBATIM +) +add_custom_target(flutter_assemble DEPENDS + "${FLUTTER_LIBRARY}" + ${FLUTTER_LIBRARY_HEADERS} + ${CPP_WRAPPER_SOURCES_CORE} + ${CPP_WRAPPER_SOURCES_PLUGIN} + ${CPP_WRAPPER_SOURCES_APP} +) diff --git a/siro_rider/packages/get/example_nav2/windows/flutter/generated_plugin_registrant.cc b/siro_rider/packages/get/example_nav2/windows/flutter/generated_plugin_registrant.cc new file mode 100644 index 0000000..8b6d468 --- /dev/null +++ b/siro_rider/packages/get/example_nav2/windows/flutter/generated_plugin_registrant.cc @@ -0,0 +1,11 @@ +// +// Generated file. Do not edit. +// + +// clang-format off + +#include "generated_plugin_registrant.h" + + +void RegisterPlugins(flutter::PluginRegistry* registry) { +} diff --git a/siro_rider/packages/get/example_nav2/windows/flutter/generated_plugin_registrant.h b/siro_rider/packages/get/example_nav2/windows/flutter/generated_plugin_registrant.h new file mode 100644 index 0000000..dc139d8 --- /dev/null +++ b/siro_rider/packages/get/example_nav2/windows/flutter/generated_plugin_registrant.h @@ -0,0 +1,15 @@ +// +// Generated file. Do not edit. +// + +// clang-format off + +#ifndef GENERATED_PLUGIN_REGISTRANT_ +#define GENERATED_PLUGIN_REGISTRANT_ + +#include + +// Registers Flutter plugins. +void RegisterPlugins(flutter::PluginRegistry* registry); + +#endif // GENERATED_PLUGIN_REGISTRANT_ diff --git a/siro_rider/packages/get/example_nav2/windows/flutter/generated_plugins.cmake b/siro_rider/packages/get/example_nav2/windows/flutter/generated_plugins.cmake new file mode 100644 index 0000000..b93c4c3 --- /dev/null +++ b/siro_rider/packages/get/example_nav2/windows/flutter/generated_plugins.cmake @@ -0,0 +1,23 @@ +# +# Generated file, do not edit. +# + +list(APPEND FLUTTER_PLUGIN_LIST +) + +list(APPEND FLUTTER_FFI_PLUGIN_LIST +) + +set(PLUGIN_BUNDLED_LIBRARIES) + +foreach(plugin ${FLUTTER_PLUGIN_LIST}) + add_subdirectory(flutter/ephemeral/.plugin_symlinks/${plugin}/windows plugins/${plugin}) + target_link_libraries(${BINARY_NAME} PRIVATE ${plugin}_plugin) + list(APPEND PLUGIN_BUNDLED_LIBRARIES $) + list(APPEND PLUGIN_BUNDLED_LIBRARIES ${${plugin}_bundled_libraries}) +endforeach(plugin) + +foreach(ffi_plugin ${FLUTTER_FFI_PLUGIN_LIST}) + add_subdirectory(flutter/ephemeral/.plugin_symlinks/${ffi_plugin}/windows plugins/${ffi_plugin}) + list(APPEND PLUGIN_BUNDLED_LIBRARIES ${${ffi_plugin}_bundled_libraries}) +endforeach(ffi_plugin) diff --git a/siro_rider/packages/get/example_nav2/windows/runner/CMakeLists.txt b/siro_rider/packages/get/example_nav2/windows/runner/CMakeLists.txt new file mode 100644 index 0000000..977e38b --- /dev/null +++ b/siro_rider/packages/get/example_nav2/windows/runner/CMakeLists.txt @@ -0,0 +1,18 @@ +cmake_minimum_required(VERSION 3.15) +project(runner LANGUAGES CXX) + +add_executable(${BINARY_NAME} WIN32 + "flutter_window.cpp" + "main.cpp" + "run_loop.cpp" + "utils.cpp" + "win32_window.cpp" + "${FLUTTER_MANAGED_DIR}/generated_plugin_registrant.cc" + "Runner.rc" + "runner.exe.manifest" +) +apply_standard_settings(${BINARY_NAME}) +target_compile_definitions(${BINARY_NAME} PRIVATE "NOMINMAX") +target_link_libraries(${BINARY_NAME} PRIVATE flutter flutter_wrapper_app) +target_include_directories(${BINARY_NAME} PRIVATE "${CMAKE_SOURCE_DIR}") +add_dependencies(${BINARY_NAME} flutter_assemble) diff --git a/siro_rider/packages/get/example_nav2/windows/runner/Runner.rc b/siro_rider/packages/get/example_nav2/windows/runner/Runner.rc new file mode 100644 index 0000000..f6310c3 --- /dev/null +++ b/siro_rider/packages/get/example_nav2/windows/runner/Runner.rc @@ -0,0 +1,121 @@ +// Microsoft Visual C++ generated resource script. +// +#pragma code_page(65001) +#include "resource.h" + +#define APSTUDIO_READONLY_SYMBOLS +///////////////////////////////////////////////////////////////////////////// +// +// Generated from the TEXTINCLUDE 2 resource. +// +#include "winres.h" + +///////////////////////////////////////////////////////////////////////////// +#undef APSTUDIO_READONLY_SYMBOLS + +///////////////////////////////////////////////////////////////////////////// +// English (United States) resources + +#if !defined(AFX_RESOURCE_DLL) || defined(AFX_TARG_ENU) +LANGUAGE LANG_ENGLISH, SUBLANG_ENGLISH_US + +#ifdef APSTUDIO_INVOKED +///////////////////////////////////////////////////////////////////////////// +// +// TEXTINCLUDE +// + +1 TEXTINCLUDE +BEGIN + "resource.h\0" +END + +2 TEXTINCLUDE +BEGIN + "#include ""winres.h""\r\n" + "\0" +END + +3 TEXTINCLUDE +BEGIN + "\r\n" + "\0" +END + +#endif // APSTUDIO_INVOKED + + +///////////////////////////////////////////////////////////////////////////// +// +// Icon +// + +// Icon with lowest ID value placed first to ensure application icon +// remains consistent on all systems. +IDI_APP_ICON ICON "resources\\app_icon.ico" + + +///////////////////////////////////////////////////////////////////////////// +// +// Version +// + +#ifdef FLUTTER_BUILD_NUMBER +#define VERSION_AS_NUMBER FLUTTER_BUILD_NUMBER +#else +#define VERSION_AS_NUMBER 1,0,0 +#endif + +#ifdef FLUTTER_BUILD_NAME +#define VERSION_AS_STRING #FLUTTER_BUILD_NAME +#else +#define VERSION_AS_STRING "1.0.0" +#endif + +VS_VERSION_INFO VERSIONINFO + FILEVERSION VERSION_AS_NUMBER + PRODUCTVERSION VERSION_AS_NUMBER + FILEFLAGSMASK VS_FFI_FILEFLAGSMASK +#ifdef _DEBUG + FILEFLAGS VS_FF_DEBUG +#else + FILEFLAGS 0x0L +#endif + FILEOS VOS__WINDOWS32 + FILETYPE VFT_APP + FILESUBTYPE 0x0L +BEGIN + BLOCK "StringFileInfo" + BEGIN + BLOCK "040904e4" + BEGIN + VALUE "CompanyName", "com.get" "\0" + VALUE "FileDescription", "A new Flutter project." "\0" + VALUE "FileVersion", VERSION_AS_STRING "\0" + VALUE "InternalName", "example_nav2" "\0" + VALUE "LegalCopyright", "Copyright (C) 2021 com.get. All rights reserved." "\0" + VALUE "OriginalFilename", "example_nav2.exe" "\0" + VALUE "ProductName", "example_nav2" "\0" + VALUE "ProductVersion", VERSION_AS_STRING "\0" + END + END + BLOCK "VarFileInfo" + BEGIN + VALUE "Translation", 0x409, 1252 + END +END + +#endif // English (United States) resources +///////////////////////////////////////////////////////////////////////////// + + + +#ifndef APSTUDIO_INVOKED +///////////////////////////////////////////////////////////////////////////// +// +// Generated from the TEXTINCLUDE 3 resource. +// + + +///////////////////////////////////////////////////////////////////////////// +#endif // not APSTUDIO_INVOKED diff --git a/siro_rider/packages/get/example_nav2/windows/runner/flutter_window.cpp b/siro_rider/packages/get/example_nav2/windows/runner/flutter_window.cpp new file mode 100644 index 0000000..41bbc5e --- /dev/null +++ b/siro_rider/packages/get/example_nav2/windows/runner/flutter_window.cpp @@ -0,0 +1,64 @@ +#include "flutter_window.h" + +#include + +#include "flutter/generated_plugin_registrant.h" + +FlutterWindow::FlutterWindow(RunLoop* run_loop, + const flutter::DartProject& project) + : run_loop_(run_loop), project_(project) {} + +FlutterWindow::~FlutterWindow() {} + +bool FlutterWindow::OnCreate() { + if (!Win32Window::OnCreate()) { + return false; + } + + RECT frame = GetClientArea(); + + // The size here must match the window dimensions to avoid unnecessary surface + // creation / destruction in the startup path. + flutter_controller_ = std::make_unique( + frame.right - frame.left, frame.bottom - frame.top, project_); + // Ensure that basic setup of the controller was successful. + if (!flutter_controller_->engine() || !flutter_controller_->view()) { + return false; + } + RegisterPlugins(flutter_controller_->engine()); + run_loop_->RegisterFlutterInstance(flutter_controller_->engine()); + SetChildContent(flutter_controller_->view()->GetNativeWindow()); + return true; +} + +void FlutterWindow::OnDestroy() { + if (flutter_controller_) { + run_loop_->UnregisterFlutterInstance(flutter_controller_->engine()); + flutter_controller_ = nullptr; + } + + Win32Window::OnDestroy(); +} + +LRESULT +FlutterWindow::MessageHandler(HWND hwnd, UINT const message, + WPARAM const wparam, + LPARAM const lparam) noexcept { + // Give Flutter, including plugins, an opportunity to handle window messages. + if (flutter_controller_) { + std::optional result = + flutter_controller_->HandleTopLevelWindowProc(hwnd, message, wparam, + lparam); + if (result) { + return *result; + } + } + + switch (message) { + case WM_FONTCHANGE: + flutter_controller_->engine()->ReloadSystemFonts(); + break; + } + + return Win32Window::MessageHandler(hwnd, message, wparam, lparam); +} diff --git a/siro_rider/packages/get/example_nav2/windows/runner/flutter_window.h b/siro_rider/packages/get/example_nav2/windows/runner/flutter_window.h new file mode 100644 index 0000000..b663ddd --- /dev/null +++ b/siro_rider/packages/get/example_nav2/windows/runner/flutter_window.h @@ -0,0 +1,39 @@ +#ifndef RUNNER_FLUTTER_WINDOW_H_ +#define RUNNER_FLUTTER_WINDOW_H_ + +#include +#include + +#include + +#include "run_loop.h" +#include "win32_window.h" + +// A window that does nothing but host a Flutter view. +class FlutterWindow : public Win32Window { + public: + // Creates a new FlutterWindow driven by the |run_loop|, hosting a + // Flutter view running |project|. + explicit FlutterWindow(RunLoop* run_loop, + const flutter::DartProject& project); + virtual ~FlutterWindow(); + + protected: + // Win32Window: + bool OnCreate() override; + void OnDestroy() override; + LRESULT MessageHandler(HWND window, UINT const message, WPARAM const wparam, + LPARAM const lparam) noexcept override; + + private: + // The run loop driving events for this window. + RunLoop* run_loop_; + + // The project to run. + flutter::DartProject project_; + + // The Flutter instance hosted by this window. + std::unique_ptr flutter_controller_; +}; + +#endif // RUNNER_FLUTTER_WINDOW_H_ diff --git a/siro_rider/packages/get/example_nav2/windows/runner/main.cpp b/siro_rider/packages/get/example_nav2/windows/runner/main.cpp new file mode 100644 index 0000000..1a65366 --- /dev/null +++ b/siro_rider/packages/get/example_nav2/windows/runner/main.cpp @@ -0,0 +1,42 @@ +#include +#include +#include + +#include "flutter_window.h" +#include "run_loop.h" +#include "utils.h" + +int APIENTRY wWinMain(_In_ HINSTANCE instance, _In_opt_ HINSTANCE prev, + _In_ wchar_t *command_line, _In_ int show_command) { + // Attach to console when present (e.g., 'flutter run') or create a + // new console when running with a debugger. + if (!::AttachConsole(ATTACH_PARENT_PROCESS) && ::IsDebuggerPresent()) { + CreateAndAttachConsole(); + } + + // Initialize COM, so that it is available for use in the library and/or + // plugins. + ::CoInitializeEx(nullptr, COINIT_APARTMENTTHREADED); + + RunLoop run_loop; + + flutter::DartProject project(L"data"); + + std::vector command_line_arguments = + GetCommandLineArguments(); + + project.set_dart_entrypoint_arguments(std::move(command_line_arguments)); + + FlutterWindow window(&run_loop, project); + Win32Window::Point origin(10, 10); + Win32Window::Size size(1280, 720); + if (!window.CreateAndShow(L"example_nav2", origin, size)) { + return EXIT_FAILURE; + } + window.SetQuitOnClose(true); + + run_loop.Run(); + + ::CoUninitialize(); + return EXIT_SUCCESS; +} diff --git a/siro_rider/packages/get/example_nav2/windows/runner/resource.h b/siro_rider/packages/get/example_nav2/windows/runner/resource.h new file mode 100644 index 0000000..66a65d1 --- /dev/null +++ b/siro_rider/packages/get/example_nav2/windows/runner/resource.h @@ -0,0 +1,16 @@ +//{{NO_DEPENDENCIES}} +// Microsoft Visual C++ generated include file. +// Used by Runner.rc +// +#define IDI_APP_ICON 101 + +// Next default values for new objects +// +#ifdef APSTUDIO_INVOKED +#ifndef APSTUDIO_READONLY_SYMBOLS +#define _APS_NEXT_RESOURCE_VALUE 102 +#define _APS_NEXT_COMMAND_VALUE 40001 +#define _APS_NEXT_CONTROL_VALUE 1001 +#define _APS_NEXT_SYMED_VALUE 101 +#endif +#endif diff --git a/siro_rider/packages/get/example_nav2/windows/runner/resources/app_icon.ico b/siro_rider/packages/get/example_nav2/windows/runner/resources/app_icon.ico new file mode 100644 index 0000000..c04e20c Binary files /dev/null and b/siro_rider/packages/get/example_nav2/windows/runner/resources/app_icon.ico differ diff --git a/siro_rider/packages/get/example_nav2/windows/runner/run_loop.cpp b/siro_rider/packages/get/example_nav2/windows/runner/run_loop.cpp new file mode 100644 index 0000000..2d6636a --- /dev/null +++ b/siro_rider/packages/get/example_nav2/windows/runner/run_loop.cpp @@ -0,0 +1,66 @@ +#include "run_loop.h" + +#include + +#include + +RunLoop::RunLoop() {} + +RunLoop::~RunLoop() {} + +void RunLoop::Run() { + bool keep_running = true; + TimePoint next_flutter_event_time = TimePoint::clock::now(); + while (keep_running) { + std::chrono::nanoseconds wait_duration = + std::max(std::chrono::nanoseconds(0), + next_flutter_event_time - TimePoint::clock::now()); + ::MsgWaitForMultipleObjects( + 0, nullptr, FALSE, static_cast(wait_duration.count() / 1000), + QS_ALLINPUT); + bool processed_events = false; + MSG message; + // All pending Windows messages must be processed; MsgWaitForMultipleObjects + // won't return again for items left in the queue after PeekMessage. + while (::PeekMessage(&message, nullptr, 0, 0, PM_REMOVE)) { + processed_events = true; + if (message.message == WM_QUIT) { + keep_running = false; + break; + } + ::TranslateMessage(&message); + ::DispatchMessage(&message); + // Allow Flutter to process messages each time a Windows message is + // processed, to prevent starvation. + next_flutter_event_time = + std::min(next_flutter_event_time, ProcessFlutterMessages()); + } + // If the PeekMessage loop didn't run, process Flutter messages. + if (!processed_events) { + next_flutter_event_time = + std::min(next_flutter_event_time, ProcessFlutterMessages()); + } + } +} + +void RunLoop::RegisterFlutterInstance( + flutter::FlutterEngine* flutter_instance) { + flutter_instances_.insert(flutter_instance); +} + +void RunLoop::UnregisterFlutterInstance( + flutter::FlutterEngine* flutter_instance) { + flutter_instances_.erase(flutter_instance); +} + +RunLoop::TimePoint RunLoop::ProcessFlutterMessages() { + TimePoint next_event_time = TimePoint::max(); + for (auto instance : flutter_instances_) { + std::chrono::nanoseconds wait_duration = instance->ProcessMessages(); + if (wait_duration != std::chrono::nanoseconds::max()) { + next_event_time = + std::min(next_event_time, TimePoint::clock::now() + wait_duration); + } + } + return next_event_time; +} diff --git a/siro_rider/packages/get/example_nav2/windows/runner/run_loop.h b/siro_rider/packages/get/example_nav2/windows/runner/run_loop.h new file mode 100644 index 0000000..000d362 --- /dev/null +++ b/siro_rider/packages/get/example_nav2/windows/runner/run_loop.h @@ -0,0 +1,40 @@ +#ifndef RUNNER_RUN_LOOP_H_ +#define RUNNER_RUN_LOOP_H_ + +#include + +#include +#include + +// A runloop that will service events for Flutter instances as well +// as native messages. +class RunLoop { + public: + RunLoop(); + ~RunLoop(); + + // Prevent copying + RunLoop(RunLoop const&) = delete; + RunLoop& operator=(RunLoop const&) = delete; + + // Runs the run loop until the application quits. + void Run(); + + // Registers the given Flutter instance for event servicing. + void RegisterFlutterInstance( + flutter::FlutterEngine* flutter_instance); + + // Unregisters the given Flutter instance from event servicing. + void UnregisterFlutterInstance( + flutter::FlutterEngine* flutter_instance); + + private: + using TimePoint = std::chrono::steady_clock::time_point; + + // Processes all currently pending messages for registered Flutter instances. + TimePoint ProcessFlutterMessages(); + + std::set flutter_instances_; +}; + +#endif // RUNNER_RUN_LOOP_H_ diff --git a/siro_rider/packages/get/example_nav2/windows/runner/runner.exe.manifest b/siro_rider/packages/get/example_nav2/windows/runner/runner.exe.manifest new file mode 100644 index 0000000..c977c4a --- /dev/null +++ b/siro_rider/packages/get/example_nav2/windows/runner/runner.exe.manifest @@ -0,0 +1,20 @@ + + + + + PerMonitorV2 + + + + + + + + + + + + + + + diff --git a/siro_rider/packages/get/example_nav2/windows/runner/utils.cpp b/siro_rider/packages/get/example_nav2/windows/runner/utils.cpp new file mode 100644 index 0000000..d19bdbb --- /dev/null +++ b/siro_rider/packages/get/example_nav2/windows/runner/utils.cpp @@ -0,0 +1,64 @@ +#include "utils.h" + +#include +#include +#include +#include + +#include + +void CreateAndAttachConsole() { + if (::AllocConsole()) { + FILE *unused; + if (freopen_s(&unused, "CONOUT$", "w", stdout)) { + _dup2(_fileno(stdout), 1); + } + if (freopen_s(&unused, "CONOUT$", "w", stderr)) { + _dup2(_fileno(stdout), 2); + } + std::ios::sync_with_stdio(); + FlutterDesktopResyncOutputStreams(); + } +} + +std::vector GetCommandLineArguments() { + // Convert the UTF-16 command line arguments to UTF-8 for the Engine to use. + int argc; + wchar_t** argv = ::CommandLineToArgvW(::GetCommandLineW(), &argc); + if (argv == nullptr) { + return std::vector(); + } + + std::vector command_line_arguments; + + // Skip the first argument as it's the binary name. + for (int i = 1; i < argc; i++) { + command_line_arguments.push_back(Utf8FromUtf16(argv[i])); + } + + ::LocalFree(argv); + + return command_line_arguments; +} + +std::string Utf8FromUtf16(const wchar_t* utf16_string) { + if (utf16_string == nullptr) { + return std::string(); + } + int target_length = ::WideCharToMultiByte( + CP_UTF8, WC_ERR_INVALID_CHARS, utf16_string, + -1, nullptr, 0, nullptr, nullptr); + if (target_length == 0) { + return std::string(); + } + std::string utf8_string; + utf8_string.resize(target_length); + int converted_length = ::WideCharToMultiByte( + CP_UTF8, WC_ERR_INVALID_CHARS, utf16_string, + -1, utf8_string.data(), + target_length, nullptr, nullptr); + if (converted_length == 0) { + return std::string(); + } + return utf8_string; +} diff --git a/siro_rider/packages/get/example_nav2/windows/runner/utils.h b/siro_rider/packages/get/example_nav2/windows/runner/utils.h new file mode 100644 index 0000000..3879d54 --- /dev/null +++ b/siro_rider/packages/get/example_nav2/windows/runner/utils.h @@ -0,0 +1,19 @@ +#ifndef RUNNER_UTILS_H_ +#define RUNNER_UTILS_H_ + +#include +#include + +// Creates a console for the process, and redirects stdout and stderr to +// it for both the runner and the Flutter library. +void CreateAndAttachConsole(); + +// Takes a null-terminated wchar_t* encoded in UTF-16 and returns a std::string +// encoded in UTF-8. Returns an empty std::string on failure. +std::string Utf8FromUtf16(const wchar_t* utf16_string); + +// Gets the command line arguments passed in as a std::vector, +// encoded in UTF-8. Returns an empty std::vector on failure. +std::vector GetCommandLineArguments(); + +#endif // RUNNER_UTILS_H_ diff --git a/siro_rider/packages/get/example_nav2/windows/runner/win32_window.cpp b/siro_rider/packages/get/example_nav2/windows/runner/win32_window.cpp new file mode 100644 index 0000000..c10f08d --- /dev/null +++ b/siro_rider/packages/get/example_nav2/windows/runner/win32_window.cpp @@ -0,0 +1,245 @@ +#include "win32_window.h" + +#include + +#include "resource.h" + +namespace { + +constexpr const wchar_t kWindowClassName[] = L"FLUTTER_RUNNER_WIN32_WINDOW"; + +// The number of Win32Window objects that currently exist. +static int g_active_window_count = 0; + +using EnableNonClientDpiScaling = BOOL __stdcall(HWND hwnd); + +// Scale helper to convert logical scaler values to physical using passed in +// scale factor +int Scale(int source, double scale_factor) { + return static_cast(source * scale_factor); +} + +// Dynamically loads the |EnableNonClientDpiScaling| from the User32 module. +// This API is only needed for PerMonitor V1 awareness mode. +void EnableFullDpiSupportIfAvailable(HWND hwnd) { + HMODULE user32_module = LoadLibraryA("User32.dll"); + if (!user32_module) { + return; + } + auto enable_non_client_dpi_scaling = + reinterpret_cast( + GetProcAddress(user32_module, "EnableNonClientDpiScaling")); + if (enable_non_client_dpi_scaling != nullptr) { + enable_non_client_dpi_scaling(hwnd); + FreeLibrary(user32_module); + } +} + +} // namespace + +// Manages the Win32Window's window class registration. +class WindowClassRegistrar { + public: + ~WindowClassRegistrar() = default; + + // Returns the singleton registar instance. + static WindowClassRegistrar* GetInstance() { + if (!instance_) { + instance_ = new WindowClassRegistrar(); + } + return instance_; + } + + // Returns the name of the window class, registering the class if it hasn't + // previously been registered. + const wchar_t* GetWindowClass(); + + // Unregisters the window class. Should only be called if there are no + // instances of the window. + void UnregisterWindowClass(); + + private: + WindowClassRegistrar() = default; + + static WindowClassRegistrar* instance_; + + bool class_registered_ = false; +}; + +WindowClassRegistrar* WindowClassRegistrar::instance_ = nullptr; + +const wchar_t* WindowClassRegistrar::GetWindowClass() { + if (!class_registered_) { + WNDCLASS window_class{}; + window_class.hCursor = LoadCursor(nullptr, IDC_ARROW); + window_class.lpszClassName = kWindowClassName; + window_class.style = CS_HREDRAW | CS_VREDRAW; + window_class.cbClsExtra = 0; + window_class.cbWndExtra = 0; + window_class.hInstance = GetModuleHandle(nullptr); + window_class.hIcon = + LoadIcon(window_class.hInstance, MAKEINTRESOURCE(IDI_APP_ICON)); + window_class.hbrBackground = 0; + window_class.lpszMenuName = nullptr; + window_class.lpfnWndProc = Win32Window::WndProc; + RegisterClass(&window_class); + class_registered_ = true; + } + return kWindowClassName; +} + +void WindowClassRegistrar::UnregisterWindowClass() { + UnregisterClass(kWindowClassName, nullptr); + class_registered_ = false; +} + +Win32Window::Win32Window() { + ++g_active_window_count; +} + +Win32Window::~Win32Window() { + --g_active_window_count; + Destroy(); +} + +bool Win32Window::CreateAndShow(const std::wstring& title, + const Point& origin, + const Size& size) { + Destroy(); + + const wchar_t* window_class = + WindowClassRegistrar::GetInstance()->GetWindowClass(); + + const POINT target_point = {static_cast(origin.x), + static_cast(origin.y)}; + HMONITOR monitor = MonitorFromPoint(target_point, MONITOR_DEFAULTTONEAREST); + UINT dpi = FlutterDesktopGetDpiForMonitor(monitor); + double scale_factor = dpi / 96.0; + + HWND window = CreateWindow( + window_class, title.c_str(), WS_OVERLAPPEDWINDOW | WS_VISIBLE, + Scale(origin.x, scale_factor), Scale(origin.y, scale_factor), + Scale(size.width, scale_factor), Scale(size.height, scale_factor), + nullptr, nullptr, GetModuleHandle(nullptr), this); + + if (!window) { + return false; + } + + return OnCreate(); +} + +// static +LRESULT CALLBACK Win32Window::WndProc(HWND const window, + UINT const message, + WPARAM const wparam, + LPARAM const lparam) noexcept { + if (message == WM_NCCREATE) { + auto window_struct = reinterpret_cast(lparam); + SetWindowLongPtr(window, GWLP_USERDATA, + reinterpret_cast(window_struct->lpCreateParams)); + + auto that = static_cast(window_struct->lpCreateParams); + EnableFullDpiSupportIfAvailable(window); + that->window_handle_ = window; + } else if (Win32Window* that = GetThisFromHandle(window)) { + return that->MessageHandler(window, message, wparam, lparam); + } + + return DefWindowProc(window, message, wparam, lparam); +} + +LRESULT +Win32Window::MessageHandler(HWND hwnd, + UINT const message, + WPARAM const wparam, + LPARAM const lparam) noexcept { + switch (message) { + case WM_DESTROY: + window_handle_ = nullptr; + Destroy(); + if (quit_on_close_) { + PostQuitMessage(0); + } + return 0; + + case WM_DPICHANGED: { + auto newRectSize = reinterpret_cast(lparam); + LONG newWidth = newRectSize->right - newRectSize->left; + LONG newHeight = newRectSize->bottom - newRectSize->top; + + SetWindowPos(hwnd, nullptr, newRectSize->left, newRectSize->top, newWidth, + newHeight, SWP_NOZORDER | SWP_NOACTIVATE); + + return 0; + } + case WM_SIZE: { + RECT rect = GetClientArea(); + if (child_content_ != nullptr) { + // Size and position the child window. + MoveWindow(child_content_, rect.left, rect.top, rect.right - rect.left, + rect.bottom - rect.top, TRUE); + } + return 0; + } + + case WM_ACTIVATE: + if (child_content_ != nullptr) { + SetFocus(child_content_); + } + return 0; + } + + return DefWindowProc(window_handle_, message, wparam, lparam); +} + +void Win32Window::Destroy() { + OnDestroy(); + + if (window_handle_) { + DestroyWindow(window_handle_); + window_handle_ = nullptr; + } + if (g_active_window_count == 0) { + WindowClassRegistrar::GetInstance()->UnregisterWindowClass(); + } +} + +Win32Window* Win32Window::GetThisFromHandle(HWND const window) noexcept { + return reinterpret_cast( + GetWindowLongPtr(window, GWLP_USERDATA)); +} + +void Win32Window::SetChildContent(HWND content) { + child_content_ = content; + SetParent(content, window_handle_); + RECT frame = GetClientArea(); + + MoveWindow(content, frame.left, frame.top, frame.right - frame.left, + frame.bottom - frame.top, true); + + SetFocus(child_content_); +} + +RECT Win32Window::GetClientArea() { + RECT frame; + GetClientRect(window_handle_, &frame); + return frame; +} + +HWND Win32Window::GetHandle() { + return window_handle_; +} + +void Win32Window::SetQuitOnClose(bool quit_on_close) { + quit_on_close_ = quit_on_close; +} + +bool Win32Window::OnCreate() { + // No-op; provided for subclasses. + return true; +} + +void Win32Window::OnDestroy() { + // No-op; provided for subclasses. +} diff --git a/siro_rider/packages/get/example_nav2/windows/runner/win32_window.h b/siro_rider/packages/get/example_nav2/windows/runner/win32_window.h new file mode 100644 index 0000000..17ba431 --- /dev/null +++ b/siro_rider/packages/get/example_nav2/windows/runner/win32_window.h @@ -0,0 +1,98 @@ +#ifndef RUNNER_WIN32_WINDOW_H_ +#define RUNNER_WIN32_WINDOW_H_ + +#include + +#include +#include +#include + +// A class abstraction for a high DPI-aware Win32 Window. Intended to be +// inherited from by classes that wish to specialize with custom +// rendering and input handling +class Win32Window { + public: + struct Point { + unsigned int x; + unsigned int y; + Point(unsigned int x, unsigned int y) : x(x), y(y) {} + }; + + struct Size { + unsigned int width; + unsigned int height; + Size(unsigned int width, unsigned int height) + : width(width), height(height) {} + }; + + Win32Window(); + virtual ~Win32Window(); + + // Creates and shows a win32 window with |title| and position and size using + // |origin| and |size|. New windows are created on the default monitor. Window + // sizes are specified to the OS in physical pixels, hence to ensure a + // consistent size to will treat the width height passed in to this function + // as logical pixels and scale to appropriate for the default monitor. Returns + // true if the window was created successfully. + bool CreateAndShow(const std::wstring& title, + const Point& origin, + const Size& size); + + // Release OS resources associated with window. + void Destroy(); + + // Inserts |content| into the window tree. + void SetChildContent(HWND content); + + // Returns the backing Window handle to enable clients to set icon and other + // window properties. Returns nullptr if the window has been destroyed. + HWND GetHandle(); + + // If true, closing this window will quit the application. + void SetQuitOnClose(bool quit_on_close); + + // Return a RECT representing the bounds of the current client area. + RECT GetClientArea(); + + protected: + // Processes and route salient window messages for mouse handling, + // size change and DPI. Delegates handling of these to member overloads that + // inheriting classes can handle. + virtual LRESULT MessageHandler(HWND window, + UINT const message, + WPARAM const wparam, + LPARAM const lparam) noexcept; + + // Called when CreateAndShow is called, allowing subclass window-related + // setup. Subclasses should return false if setup fails. + virtual bool OnCreate(); + + // Called when Destroy is called. + virtual void OnDestroy(); + + private: + friend class WindowClassRegistrar; + + // OS callback called by message pump. Handles the WM_NCCREATE message which + // is passed when the non-client area is being created and enables automatic + // non-client DPI scaling so that the non-client area automatically + // responsponds to changes in DPI. All other messages are handled by + // MessageHandler. + static LRESULT CALLBACK WndProc(HWND const window, + UINT const message, + WPARAM const wparam, + LPARAM const lparam) noexcept; + + // Retrieves a class instance pointer for |window| + static Win32Window* GetThisFromHandle(HWND const window) noexcept; + + bool quit_on_close_ = false; + + // window handle for top level window. + HWND window_handle_ = nullptr; + + // window handle for hosted content. + HWND child_content_ = nullptr; +}; + +#endif // RUNNER_WIN32_WINDOW_H_ diff --git a/siro_rider/packages/get/lib/get.dart b/siro_rider/packages/get/lib/get.dart new file mode 100644 index 0000000..28f34ed --- /dev/null +++ b/siro_rider/packages/get/lib/get.dart @@ -0,0 +1,14 @@ +/// GetX is an extra-light and powerful multiplatform framework. +/// It combines high performance state management, intelligent dependency +/// injection, and route management in a quick and practical way. +library get; + +export 'get_common/get_reset.dart'; +export 'get_connect/connect.dart'; +export 'get_core/get_core.dart'; +export 'get_instance/get_instance.dart'; +export 'get_navigation/get_navigation.dart'; +export 'get_rx/get_rx.dart'; +export 'get_state_manager/get_state_manager.dart'; +export 'get_utils/get_utils.dart'; +export 'route_manager.dart'; diff --git a/siro_rider/packages/get/lib/get_common/get_reset.dart b/siro_rider/packages/get/lib/get_common/get_reset.dart new file mode 100644 index 0000000..2dc0a59 --- /dev/null +++ b/siro_rider/packages/get/lib/get_common/get_reset.dart @@ -0,0 +1,11 @@ +import '../get.dart'; + +extension GetResetExt on GetInterface { + void reset( + {@deprecated bool clearFactory = true, bool clearRouteBindings = true}) { + GetInstance().resetInstance(clearRouteBindings: clearRouteBindings); + Get.clearRouteTree(); + Get.clearTranslations(); + Get.resetRootNavigator(); + } +} diff --git a/siro_rider/packages/get/lib/get_connect.dart b/siro_rider/packages/get/lib/get_connect.dart new file mode 100644 index 0000000..6231bf2 --- /dev/null +++ b/siro_rider/packages/get/lib/get_connect.dart @@ -0,0 +1 @@ +export 'get_connect/connect.dart'; diff --git a/siro_rider/packages/get/lib/get_connect/connect.dart b/siro_rider/packages/get/lib/get_connect/connect.dart new file mode 100644 index 0000000..c1d730f --- /dev/null +++ b/siro_rider/packages/get/lib/get_connect/connect.dart @@ -0,0 +1,396 @@ +import '../get_instance/src/lifecycle.dart'; +import 'http/src/certificates/certificates.dart'; +import 'http/src/exceptions/exceptions.dart'; +import 'http/src/http.dart'; +import 'http/src/response/response.dart'; +import 'sockets/sockets.dart'; + +export 'http/src/certificates/certificates.dart'; +export 'http/src/http.dart'; +export 'http/src/multipart/form_data.dart'; +export 'http/src/multipart/multipart_file.dart'; +export 'http/src/response/response.dart'; +export 'sockets/sockets.dart'; + +abstract class GetConnectInterface with GetLifeCycleBase { + List? sockets; + GetHttpClient get httpClient; + + Future> get( + String url, { + Map? headers, + String? contentType, + Map? query, + Decoder? decoder, + }); + + Future> request( + String url, + String method, { + dynamic body, + String? contentType, + Map? headers, + Map? query, + Decoder? decoder, + }); + + Future> post( + String url, + dynamic body, { + String? contentType, + Map? headers, + Map? query, + Decoder? decoder, + }); + + Future> put( + String url, + dynamic body, { + String? contentType, + Map? headers, + Map? query, + Decoder? decoder, + }); + + Future> delete( + String url, { + Map? headers, + String? contentType, + Map? query, + Decoder? decoder, + }); + + Future> patch( + String url, + dynamic body, { + String? contentType, + Map? headers, + Map? query, + Decoder? decoder, + Progress? uploadProgress, + }); + + Future> query( + String query, { + String? url, + Map? variables, + Map? headers, + }); + + Future> mutation( + String mutation, { + String? url, + Map? variables, + Map? headers, + }); + + GetSocket socket( + String url, { + Duration ping = const Duration(seconds: 5), + }); +} + +class GetConnect extends GetConnectInterface { + GetConnect({ + this.userAgent = 'getx-client', + this.timeout = const Duration(seconds: 5), + this.followRedirects = true, + this.maxRedirects = 5, + this.sendUserAgent = false, + this.maxAuthRetries = 1, + this.allowAutoSignedCert = false, + this.withCredentials = false, + }) { + $configureLifeCycle(); + } + + bool allowAutoSignedCert; + String userAgent; + bool sendUserAgent; + String? baseUrl; + String defaultContentType = 'application/json; charset=utf-8'; + bool followRedirects; + int maxRedirects; + int maxAuthRetries; + Decoder? defaultDecoder; + Duration timeout; + List? trustedCertificates; + String Function(Uri url)? findProxy; + GetHttpClient? _httpClient; + List? _sockets; + bool withCredentials; + + @override + List get sockets => _sockets ??= []; + + @override + GetHttpClient get httpClient => _httpClient ??= GetHttpClient( + userAgent: userAgent, + sendUserAgent: sendUserAgent, + timeout: timeout, + followRedirects: followRedirects, + maxRedirects: maxRedirects, + maxAuthRetries: maxAuthRetries, + allowAutoSignedCert: allowAutoSignedCert, + baseUrl: baseUrl, + trustedCertificates: trustedCertificates, + withCredentials: withCredentials, + findProxy: findProxy); + + @override + Future> get( + String url, { + Map? headers, + String? contentType, + Map? query, + Decoder? decoder, + }) { + _checkIfDisposed(); + return httpClient.get( + url, + headers: headers, + contentType: contentType, + query: query, + decoder: decoder, + ); + } + + @override + Future> post( + String? url, + dynamic body, { + String? contentType, + Map? headers, + Map? query, + Decoder? decoder, + Progress? uploadProgress, + }) { + _checkIfDisposed(); + return httpClient.post( + url, + body: body, + headers: headers, + contentType: contentType, + query: query, + decoder: decoder, + uploadProgress: uploadProgress, + ); + } + + @override + Future> put( + String url, + dynamic body, { + String? contentType, + Map? headers, + Map? query, + Decoder? decoder, + Progress? uploadProgress, + }) { + _checkIfDisposed(); + return httpClient.put( + url, + body: body, + headers: headers, + contentType: contentType, + query: query, + decoder: decoder, + uploadProgress: uploadProgress, + ); + } + + @override + Future> patch( + String url, + dynamic body, { + String? contentType, + Map? headers, + Map? query, + Decoder? decoder, + Progress? uploadProgress, + }) { + _checkIfDisposed(); + return httpClient.patch( + url, + body: body, + headers: headers, + contentType: contentType, + query: query, + decoder: decoder, + uploadProgress: uploadProgress, + ); + } + + @override + Future> request( + String url, + String method, { + dynamic body, + String? contentType, + Map? headers, + Map? query, + Decoder? decoder, + Progress? uploadProgress, + }) { + _checkIfDisposed(); + return httpClient.request( + url, + method, + body: body, + headers: headers, + contentType: contentType, + query: query, + decoder: decoder, + uploadProgress: uploadProgress, + ); + } + + @override + Future> delete( + String url, { + Map? headers, + String? contentType, + Map? query, + Decoder? decoder, + }) { + _checkIfDisposed(); + return httpClient.delete( + url, + headers: headers, + contentType: contentType, + query: query, + decoder: decoder, + ); + } + + @override + GetSocket socket( + String url, { + Duration ping = const Duration(seconds: 5), + }) { + _checkIfDisposed(isHttp: false); + + final newSocket = GetSocket(_concatUrl(url)!, ping: ping); + sockets.add(newSocket); + return newSocket; + } + + String? _concatUrl(String? url) { + if (url == null) return baseUrl; + return baseUrl == null ? url : baseUrl! + url; + } + + /// query allow made GraphQL raw querys + /// final connect = GetConnect(); + /// connect.baseUrl = 'https://countries.trevorblades.com/'; + /// final response = await connect.query( + /// r""" + /// { + /// country(code: "BR") { + /// name + /// native + /// currency + /// languages { + /// code + /// name + /// } + /// } + ///} + ///""", + ///); + ///print(response.body); + @override + Future> query( + String query, { + String? url, + Map? variables, + Map? headers, + }) async { + try { + final res = await post( + url, + {'query': query, 'variables': variables}, + headers: headers, + ); + + final listError = res.body['errors']; + if ((listError is List) && listError.isNotEmpty) { + return GraphQLResponse( + graphQLErrors: listError + .map((e) => GraphQLError( + code: e['extensions']['code']?.toString(), + message: e['message']?.toString(), + )) + .toList()); + } + return GraphQLResponse.fromResponse(res); + } on Exception catch (_) { + return GraphQLResponse(graphQLErrors: [ + GraphQLError( + code: null, + message: _.toString(), + ) + ]); + } + } + + @override + Future> mutation( + String mutation, { + String? url, + Map? variables, + Map? headers, + }) async { + try { + final res = await post( + url, + {'query': mutation, 'variables': variables}, + headers: headers, + ); + + final listError = res.body['errors']; + if ((listError is List) && listError.isNotEmpty) { + return GraphQLResponse( + graphQLErrors: listError + .map((e) => GraphQLError( + code: e['extensions']['code']?.toString(), + message: e['message']?.toString(), + )) + .toList()); + } + return GraphQLResponse.fromResponse(res); + } on Exception catch (_) { + return GraphQLResponse(graphQLErrors: [ + GraphQLError( + code: null, + message: _.toString(), + ) + ]); + } + } + + bool _isDisposed = false; + + bool get isDisposed => _isDisposed; + + void _checkIfDisposed({bool isHttp = true}) { + if (_isDisposed) { + throw 'Can not emit events to disposed clients'; + } + } + + void dispose() { + if (_sockets != null) { + for (var socket in sockets) { + socket.close(); + } + _sockets?.clear(); + sockets = null; + } + if (_httpClient != null) { + httpClient.close(); + _httpClient = null; + } + _isDisposed = true; + } +} diff --git a/siro_rider/packages/get/lib/get_connect/http/src/_http/_html/_file_decoder_html.dart b/siro_rider/packages/get/lib/get_connect/http/src/_http/_html/_file_decoder_html.dart new file mode 100644 index 0000000..ee89fcf --- /dev/null +++ b/siro_rider/packages/get/lib/get_connect/http/src/_http/_html/_file_decoder_html.dart @@ -0,0 +1,17 @@ +List fileToBytes(dynamic data) { + if (data is List) { + return data; + } else { + throw const FormatException( + 'File is not "File" or "String" or "List"'); + } +} + +// void writeOnFile(List bytes) { +// var blob = html.Blob(["data"], 'text/plain', 'native'); +// var anchorElement = html.AnchorElement( +// href: html.Url.createObjectUrlFromBlob(blob).toString(), +// ) +// ..setAttribute("download", "data.txt") +// ..click(); +// } diff --git a/siro_rider/packages/get/lib/get_connect/http/src/_http/_html/_http_request_html.dart b/siro_rider/packages/get/lib/get_connect/http/src/_http/_html/_http_request_html.dart new file mode 100644 index 0000000..d3b6d7d --- /dev/null +++ b/siro_rider/packages/get/lib/get_connect/http/src/_http/_html/_http_request_html.dart @@ -0,0 +1,117 @@ +import 'dart:async'; +// ignore: avoid_web_libraries_in_flutter +import 'dart:html'; + +import '../../certificates/certificates.dart'; +import '../../exceptions/exceptions.dart'; +import '../../request/request.dart'; +import '../../response/response.dart'; +import '../interface/request_base.dart'; +import '../utils/body_decoder.dart'; + +/// A `dart:html` implementation of `HttpRequestBase`. +class HttpRequestImpl implements HttpRequestBase { + HttpRequestImpl({ + bool allowAutoSignedCert = true, + List? trustedCertificates, + this.withCredentials = false, + String Function(Uri url)? findProxy, + }); + + /// The currently active XHRs. + final _xhrs = {}; + + ///This option requires that you submit credentials for requests + ///on different sites. The default is false + final bool withCredentials; + + @override + Duration? timeout; + + /// Sends an HTTP request and asynchronously returns the response. + @override + Future> send(Request request) async { + var bytes = await request.bodyBytes.toBytes(); + HttpRequest xhr; + + xhr = HttpRequest() + ..timeout = timeout?.inMilliseconds + ..open(request.method, '${request.url}', async: true); // check this + + _xhrs.add(xhr); + + xhr + ..responseType = 'blob' + ..withCredentials = withCredentials; + request.headers.forEach(xhr.setRequestHeader); + + var completer = Completer>(); + xhr.onLoad.first.then((_) { + var blob = xhr.response as Blob? ?? Blob([]); + var reader = FileReader(); + + reader.onLoad.first.then((_) async { + var bodyBytes = BodyBytesStream.fromBytes(reader.result as List); + + final stringBody = + await bodyBytesToString(bodyBytes, xhr.responseHeaders); + + String? contentType; + + if (xhr.responseHeaders.containsKey('content-type')) { + contentType = xhr.responseHeaders['content-type']; + } else { + contentType = 'application/json'; + } + // xhr.responseHeaders.containsKey(key) + final body = bodyDecoded( + request, + stringBody, + contentType, + ); + + final response = Response( + bodyBytes: bodyBytes, + statusCode: xhr.status, + request: request, + headers: xhr.responseHeaders, + statusText: xhr.statusText, + body: body, + bodyString: stringBody, + ); + completer.complete(response); + }); + + reader.onError.first.then((error) { + completer.completeError( + GetHttpException(error.toString(), request.url), + StackTrace.current, + ); + }); + + reader.readAsArrayBuffer(blob); + }); + + xhr.onError.first.then((_) { + completer.completeError( + GetHttpException('XMLHttpRequest error.', request.url), + StackTrace.current); + }); + + xhr.send(bytes); + + try { + return await completer.future; + } finally { + _xhrs.remove(xhr); + } + } + + /// Closes the client and abort all active requests. + @override + void close() { + for (var xhr in _xhrs) { + xhr.abort(); + } + } +} diff --git a/siro_rider/packages/get/lib/get_connect/http/src/_http/_io/_file_decoder_io.dart b/siro_rider/packages/get/lib/get_connect/http/src/_http/_io/_file_decoder_io.dart new file mode 100644 index 0000000..f3fe013 --- /dev/null +++ b/siro_rider/packages/get/lib/get_connect/http/src/_http/_io/_file_decoder_io.dart @@ -0,0 +1,20 @@ +import 'dart:io'; + +List fileToBytes(dynamic data) { + if (data is File) { + return data.readAsBytesSync(); + } else if (data is String) { + if (File(data).existsSync()) { + return File(data).readAsBytesSync(); + } else { + throw 'File $data not exists'; + } + } else if (data is List) { + return data; + } else { + throw const FormatException( + 'File is not "File" or "String" or "List"'); + } +} + +void writeOnFile(List bytes) {} diff --git a/siro_rider/packages/get/lib/get_connect/http/src/_http/_io/_http_request_io.dart b/siro_rider/packages/get/lib/get_connect/http/src/_http/_io/_http_request_io.dart new file mode 100644 index 0000000..24d289a --- /dev/null +++ b/siro_rider/packages/get/lib/get_connect/http/src/_http/_io/_http_request_io.dart @@ -0,0 +1,99 @@ +import 'dart:async'; +import 'dart:io' as io; + +import '../../certificates/certificates.dart'; +import '../../exceptions/exceptions.dart'; +import '../../request/request.dart'; +import '../../response/response.dart'; +import '../interface/request_base.dart'; +import '../utils/body_decoder.dart'; + +/// A `dart:io` implementation of `HttpRequestBase`. +class HttpRequestImpl extends HttpRequestBase { + io.HttpClient? _httpClient; + io.SecurityContext? _securityContext; + + HttpRequestImpl({ + bool allowAutoSignedCert = true, + List? trustedCertificates, + bool withCredentials = false, + String Function(Uri url)? findProxy, + }) { + _httpClient = io.HttpClient(); + if (trustedCertificates != null) { + _securityContext = io.SecurityContext(); + for (final trustedCertificate in trustedCertificates) { + _securityContext! + .setTrustedCertificatesBytes(List.from(trustedCertificate.bytes)); + } + } + + _httpClient = io.HttpClient(context: _securityContext); + _httpClient!.badCertificateCallback = (_, __, ___) => allowAutoSignedCert; + _httpClient!.findProxy = findProxy; + } + + @override + Future> send(Request request) async { + var stream = request.bodyBytes.asBroadcastStream(); + io.HttpClientRequest? ioRequest; + try { + _httpClient!.connectionTimeout = timeout; + ioRequest = (await _httpClient!.openUrl(request.method, request.url)) + ..followRedirects = request.followRedirects + ..persistentConnection = request.persistentConnection + ..maxRedirects = request.maxRedirects + ..contentLength = request.contentLength ?? -1; + request.headers.forEach(ioRequest.headers.set); + + var response = timeout == null + ? await stream.pipe(ioRequest) as io.HttpClientResponse + : await stream.pipe(ioRequest).timeout(timeout!) + as io.HttpClientResponse; + + var headers = {}; + response.headers.forEach((key, values) { + headers[key] = values.join(','); + }); + + final bodyBytes = (response); + final stringBody = await bodyBytesToString(bodyBytes, headers); + + final body = bodyDecoded( + request, + stringBody, + response.headers.contentType?.mimeType, + ); + + return Response( + headers: headers, + request: request, + statusCode: response.statusCode, + statusText: response.reasonPhrase, + bodyBytes: bodyBytes, + body: body, + bodyString: stringBody, + ); + } on TimeoutException catch (_) { + ioRequest?.abort(); + rethrow; + } on io.HttpException catch (error) { + throw GetHttpException(error.message, error.uri); + } + } + + /// Closes the HttpClient. + @override + void close() { + if (_httpClient != null) { + _httpClient!.close(force: true); + _httpClient = null; + } + } +} + +// extension FileExt on io.FileSystemEntity { +// String get fileName { +// return this?.path?.split(io.Platform.pathSeparator)?.last; +// } +// } diff --git a/siro_rider/packages/get/lib/get_connect/http/src/_http/_stub/_file_decoder_stub.dart b/siro_rider/packages/get/lib/get_connect/http/src/_http/_stub/_file_decoder_stub.dart new file mode 100644 index 0000000..0a9ae9f --- /dev/null +++ b/siro_rider/packages/get/lib/get_connect/http/src/_http/_stub/_file_decoder_stub.dart @@ -0,0 +1,5 @@ +void writeOnFile(List bytes) {} + +List fileToBytes(dynamic data) { + throw UnimplementedError(); +} diff --git a/siro_rider/packages/get/lib/get_connect/http/src/_http/_stub/_http_request_stub.dart b/siro_rider/packages/get/lib/get_connect/http/src/_http/_stub/_http_request_stub.dart new file mode 100644 index 0000000..335b287 --- /dev/null +++ b/siro_rider/packages/get/lib/get_connect/http/src/_http/_stub/_http_request_stub.dart @@ -0,0 +1,20 @@ +import '../../certificates/certificates.dart'; +import '../../request/request.dart'; +import '../../response/response.dart'; +import '../interface/request_base.dart'; + +class HttpRequestImpl extends HttpRequestBase { + HttpRequestImpl({ + bool allowAutoSignedCert = true, + List? trustedCertificates, + bool withCredentials = false, + String Function(Uri url)? findProxy, + }); + @override + void close() {} + + @override + Future> send(Request request) { + throw UnimplementedError(); + } +} diff --git a/siro_rider/packages/get/lib/get_connect/http/src/_http/interface/request_base.dart b/siro_rider/packages/get/lib/get_connect/http/src/_http/interface/request_base.dart new file mode 100644 index 0000000..8c2bb98 --- /dev/null +++ b/siro_rider/packages/get/lib/get_connect/http/src/_http/interface/request_base.dart @@ -0,0 +1,19 @@ +import '../../request/request.dart'; +import '../../response/response.dart'; + +/// Abstract interface of [HttpRequestImpl]. +abstract class HttpRequestBase { + /// Sends an HTTP [Request]. + Future> send(Request request); + + /// Closes the [Request] and cleans up any resources associated with it. + void close(); + + /// Gets and sets the timeout. + /// + /// For mobile, this value will be applied for both connection and request + /// timeout. + /// + /// For web, this value will be the request timeout. + Duration? timeout; +} diff --git a/siro_rider/packages/get/lib/get_connect/http/src/_http/mock/http_request_mock.dart b/siro_rider/packages/get/lib/get_connect/http/src/_http/mock/http_request_mock.dart new file mode 100644 index 0000000..fe62885 --- /dev/null +++ b/siro_rider/packages/get/lib/get_connect/http/src/_http/mock/http_request_mock.dart @@ -0,0 +1,47 @@ +import '../../request/request.dart'; +import '../../response/response.dart'; +import '../interface/request_base.dart'; +import '../utils/body_decoder.dart'; + +typedef MockClientHandler = Future Function(Request request); + +class MockClient extends HttpRequestBase { + /// The handler for than transforms request on response + final MockClientHandler _handler; + + /// Creates a [MockClient] with a handler that receives [Request]s and sends + /// [Response]s. + MockClient(this._handler); + + @override + Future> send(Request request) async { + var requestBody = await request.bodyBytes.toBytes(); + var bodyBytes = BodyBytesStream.fromBytes(requestBody); + + var response = await _handler(request); + + final stringBody = await bodyBytesToString(bodyBytes, response.headers!); + + var mimeType = response.headers!.containsKey('content-type') + ? response.headers!['content-type'] + : ''; + + final body = bodyDecoded( + request, + stringBody, + mimeType, + ); + return Response( + headers: response.headers, + request: request, + statusCode: response.statusCode, + statusText: response.statusText, + bodyBytes: bodyBytes, + body: body, + bodyString: stringBody, + ); + } + + @override + void close() {} +} diff --git a/siro_rider/packages/get/lib/get_connect/http/src/_http/utils/body_decoder.dart b/siro_rider/packages/get/lib/get_connect/http/src/_http/utils/body_decoder.dart new file mode 100644 index 0000000..99a6942 --- /dev/null +++ b/siro_rider/packages/get/lib/get_connect/http/src/_http/utils/body_decoder.dart @@ -0,0 +1,34 @@ +import 'dart:convert'; + +import '../../../../../get_core/get_core.dart'; +import '../../request/request.dart'; + +T? bodyDecoded(Request request, String stringBody, String? mimeType) { + T? body; + dynamic bodyToDecode; + + if (mimeType != null && mimeType.contains('application/json')) { + try { + bodyToDecode = jsonDecode(stringBody); + } on FormatException catch (_) { + Get.log('Cannot decode server response to json'); + bodyToDecode = stringBody; + } + } else { + bodyToDecode = stringBody; + } + + try { + if (stringBody == '') { + body = null; + } else if (request.decoder == null) { + body = bodyToDecode as T?; + } else { + body = request.decoder!(bodyToDecode); + } + } on Exception catch (_) { + body = stringBody as T; + } + + return body; +} diff --git a/siro_rider/packages/get/lib/get_connect/http/src/certificates/certificates.dart b/siro_rider/packages/get/lib/get_connect/http/src/certificates/certificates.dart new file mode 100644 index 0000000..eb3ec3e --- /dev/null +++ b/siro_rider/packages/get/lib/get_connect/http/src/certificates/certificates.dart @@ -0,0 +1,5 @@ +class TrustedCertificate { + final List bytes; + + TrustedCertificate(this.bytes); +} diff --git a/siro_rider/packages/get/lib/get_connect/http/src/exceptions/exceptions.dart b/siro_rider/packages/get/lib/get_connect/http/src/exceptions/exceptions.dart new file mode 100644 index 0000000..a64ea1f --- /dev/null +++ b/siro_rider/packages/get/lib/get_connect/http/src/exceptions/exceptions.dart @@ -0,0 +1,35 @@ +class GetHttpException implements Exception { + final String message; + + final Uri? uri; + + GetHttpException(this.message, [this.uri]); + + @override + String toString() => message; +} + +class GraphQLError { + GraphQLError({this.code, this.message}); + final String? message; + final String? code; + + @override + String toString() => 'GETCONNECT ERROR:\n\tcode:$code\n\tmessage:$message'; +} + +class UnauthorizedException implements Exception { + @override + String toString() { + return 'Operation Unauthorized'; + } +} + +class UnexpectedFormat implements Exception { + final String message; + UnexpectedFormat(this.message); + @override + String toString() { + return 'Unexpected format: $message'; + } +} diff --git a/siro_rider/packages/get/lib/get_connect/http/src/http.dart b/siro_rider/packages/get/lib/get_connect/http/src/http.dart new file mode 100644 index 0000000..5fd7ada --- /dev/null +++ b/siro_rider/packages/get/lib/get_connect/http/src/http.dart @@ -0,0 +1,563 @@ +import 'dart:async'; +import 'dart:convert'; + +import '../src/certificates/certificates.dart'; +import '../src/exceptions/exceptions.dart'; +import '../src/multipart/form_data.dart'; +import '../src/request/request.dart'; +import '../src/response/response.dart'; +import '../src/status/http_status.dart'; +import '_http/_stub/_http_request_stub.dart' + if (dart.library.io) '_http/_io/_http_request_io.dart' + if (dart.library.html) '_http/_html/_http_request_html.dart' as platform; +import '_http/interface/request_base.dart'; +import 'interceptors/get_modifiers.dart'; + +typedef Decoder = T Function(dynamic data); + +typedef Progress = Function(double percent); + +class GetHttpClient { + String userAgent; + String? baseUrl; + + String defaultContentType = 'application/json; charset=utf-8'; + + bool followRedirects; + int maxRedirects; + int maxAuthRetries; + + bool sendUserAgent; + + Decoder? defaultDecoder; + + Duration timeout; + + bool errorSafety = true; + + final HttpRequestBase _httpClient; + + final GetModifier _modifier; + + String Function(Uri url)? findProxy; + + GetHttpClient({ + this.userAgent = 'getx-client', + this.timeout = const Duration(seconds: 8), + this.followRedirects = true, + this.maxRedirects = 5, + this.sendUserAgent = false, + this.maxAuthRetries = 1, + bool allowAutoSignedCert = false, + this.baseUrl, + List? trustedCertificates, + bool withCredentials = false, + String Function(Uri url)? findProxy, + }) : _httpClient = platform.HttpRequestImpl( + allowAutoSignedCert: allowAutoSignedCert, + trustedCertificates: trustedCertificates, + withCredentials: withCredentials, + findProxy: findProxy, + ), + _modifier = GetModifier(); + + void addAuthenticator(RequestModifier auth) { + _modifier.authenticator = auth as RequestModifier; + } + + void addRequestModifier(RequestModifier interceptor) { + _modifier.addRequestModifier(interceptor); + } + + void removeRequestModifier(RequestModifier interceptor) { + _modifier.removeRequestModifier(interceptor); + } + + void addResponseModifier(ResponseModifier interceptor) { + _modifier.addResponseModifier(interceptor); + } + + void removeResponseModifier(ResponseModifier interceptor) { + _modifier.removeResponseModifier(interceptor); + } + + Uri _createUri(String? url, Map? query) { + if (baseUrl != null) { + url = baseUrl! + url!; + } + final uri = Uri.parse(url!); + if (query != null) { + return uri.replace(queryParameters: query); + } + return uri; + } + + Future> _requestWithBody( + String? url, + String? contentType, + dynamic body, + String method, + Map? query, + Decoder? decoder, + Progress? uploadProgress, + ) async { + List? bodyBytes; + Stream>? bodyStream; + final headers = {}; + + if (sendUserAgent) { + headers['user-agent'] = userAgent; + } + + if (body is FormData) { + bodyBytes = await body.toBytes(); + headers['content-length'] = bodyBytes.length.toString(); + headers['content-type'] = + 'multipart/form-data; boundary=${body.boundary}'; + } else if (contentType != null && + contentType.toLowerCase() == 'application/x-www-form-urlencoded' && + body is Map) { + var parts = []; + (body as Map).forEach((key, value) { + parts.add('${Uri.encodeQueryComponent(key)}=' + '${Uri.encodeQueryComponent(value.toString())}'); + }); + var formData = parts.join('&'); + bodyBytes = utf8.encode(formData); + headers['content-length'] = bodyBytes.length.toString(); + headers['content-type'] = contentType; + } else if (body is Map || body is List) { + var jsonString = json.encode(body); + + bodyBytes = utf8.encode(jsonString); + headers['content-length'] = bodyBytes.length.toString(); + headers['content-type'] = contentType ?? defaultContentType; + } else if (body is String) { + bodyBytes = utf8.encode(body); + headers['content-length'] = bodyBytes.length.toString(); + headers['content-type'] = contentType ?? defaultContentType; + } else if (body == null) { + headers['content-type'] = contentType ?? defaultContentType; + headers['content-length'] = '0'; + } else { + if (!errorSafety) { + throw UnexpectedFormat('body cannot be ${body.runtimeType}'); + } + } + + if (bodyBytes != null) { + bodyStream = _trackProgress(bodyBytes, uploadProgress); + } + + final uri = _createUri(url, query); + return Request( + method: method, + url: uri, + headers: headers, + bodyBytes: bodyStream, + contentLength: bodyBytes?.length ?? 0, + followRedirects: followRedirects, + maxRedirects: maxRedirects, + decoder: decoder, + ); + } + + Stream> _trackProgress( + List bodyBytes, + Progress? uploadProgress, + ) { + var total = 0; + var length = bodyBytes.length; + + var byteStream = + Stream.fromIterable(bodyBytes.map((i) => [i])).transform>( + StreamTransformer.fromHandlers(handleData: (data, sink) { + total += data.length; + if (uploadProgress != null) { + var percent = total / length * 100; + uploadProgress(percent); + } + sink.add(data); + }), + ); + return byteStream; + } + + void _setSimpleHeaders( + Map headers, + String? contentType, + ) { + headers['content-type'] = contentType ?? defaultContentType; + if (sendUserAgent) { + headers['user-agent'] = userAgent; + } + } + + Future> _performRequest( + HandlerExecute handler, { + bool authenticate = false, + int requestNumber = 1, + Map? headers, + }) async { + var request = await handler(); + + headers?.forEach((key, value) { + request.headers[key] = value; + }); + + if (authenticate) await _modifier.authenticator!(request); + final newRequest = await _modifier.modifyRequest(request); + + _httpClient.timeout = timeout; + try { + var response = await _httpClient.send(newRequest); + + final newResponse = + await _modifier.modifyResponse(newRequest, response); + + if (HttpStatus.unauthorized == newResponse.statusCode && + _modifier.authenticator != null && + requestNumber <= maxAuthRetries) { + return _performRequest( + handler, + authenticate: true, + requestNumber: requestNumber + 1, + headers: newRequest.headers, + ); + } else if (HttpStatus.unauthorized == newResponse.statusCode) { + if (!errorSafety) { + throw UnauthorizedException(); + } else { + return Response( + request: newRequest, + headers: newResponse.headers, + statusCode: newResponse.statusCode, + body: newResponse.body, + bodyBytes: newResponse.bodyBytes, + bodyString: newResponse.bodyString, + statusText: newResponse.statusText, + ); + } + } + + return newResponse; + } on Exception catch (err) { + if (!errorSafety) { + throw GetHttpException(err.toString()); + } else { + return Response( + request: newRequest, + headers: null, + statusCode: null, + body: null, + statusText: "$err", + ); + } + } + } + + Future> _get( + String url, + String? contentType, + Map? query, + Decoder? decoder, + ) { + final headers = {}; + _setSimpleHeaders(headers, contentType); + final uri = _createUri(url, query); + + return Future.value(Request( + method: 'get', + url: uri, + headers: headers, + decoder: decoder ?? (defaultDecoder as Decoder?), + contentLength: 0, + followRedirects: followRedirects, + maxRedirects: maxRedirects, + )); + } + + Future> _request( + String? url, + String method, { + String? contentType, + required dynamic body, + required Map? query, + Decoder? decoder, + required Progress? uploadProgress, + }) { + return _requestWithBody( + url, + contentType, + body, + method, + query, + decoder ?? (defaultDecoder as Decoder?), + uploadProgress, + ); + } + + Request _delete( + String url, + String? contentType, + Map? query, + Decoder? decoder, + ) { + final headers = {}; + _setSimpleHeaders(headers, contentType); + final uri = _createUri(url, query); + + return Request( + method: 'delete', + url: uri, + headers: headers, + decoder: decoder ?? (defaultDecoder as Decoder?), + ); + } + + Future> patch( + String url, { + dynamic body, + String? contentType, + Map? headers, + Map? query, + Decoder? decoder, + Progress? uploadProgress, + // List files, + }) async { + try { + var response = await _performRequest( + () => _request( + url, + 'patch', + contentType: contentType, + body: body, + query: query, + decoder: decoder, + uploadProgress: uploadProgress, + ), + headers: headers, + ); + return response; + } on Exception catch (e) { + if (!errorSafety) { + throw GetHttpException(e.toString()); + } + return Future.value(Response( + statusText: 'Can not connect to server. Reason: $e', + )); + } + } + + Future> post( + String? url, { + dynamic body, + String? contentType, + Map? headers, + Map? query, + Decoder? decoder, + Progress? uploadProgress, + // List files, + }) async { + try { + var response = await _performRequest( + () => _request( + url, + 'post', + contentType: contentType, + body: body, + query: query, + decoder: decoder, + uploadProgress: uploadProgress, + ), + headers: headers, + ); + return response; + } on Exception catch (e) { + if (!errorSafety) { + throw GetHttpException(e.toString()); + } + return Future.value(Response( + statusText: 'Can not connect to server. Reason: $e', + )); + } + } + + Future> request( + String url, + String method, { + dynamic body, + String? contentType, + Map? headers, + Map? query, + Decoder? decoder, + Progress? uploadProgress, + }) async { + try { + var response = await _performRequest( + () => _request( + url, + method, + contentType: contentType, + query: query, + body: body, + decoder: decoder, + uploadProgress: uploadProgress, + ), + headers: headers, + ); + return response; + } on Exception catch (e) { + if (!errorSafety) { + throw GetHttpException(e.toString()); + } + return Future.value(Response( + statusText: 'Can not connect to server. Reason: $e', + )); + } + } + + Future> put( + String url, { + dynamic body, + String? contentType, + Map? headers, + Map? query, + Decoder? decoder, + Progress? uploadProgress, + }) async { + try { + var response = await _performRequest( + () => _request( + url, + 'put', + contentType: contentType, + query: query, + body: body, + decoder: decoder, + uploadProgress: uploadProgress, + ), + headers: headers, + ); + return response; + } on Exception catch (e) { + if (!errorSafety) { + throw GetHttpException(e.toString()); + } + return Future.value(Response( + statusText: 'Can not connect to server. Reason: $e', + )); + } + } + + Future> get( + String url, { + Map? headers, + String? contentType, + Map? query, + Decoder? decoder, + }) async { + try { + var response = await _performRequest( + () => _get(url, contentType, query, decoder), + headers: headers, + ); + return response; + } on Exception catch (e) { + if (!errorSafety) { + throw GetHttpException(e.toString()); + } + return Future.value(Response( + statusText: 'Can not connect to server. Reason: $e', + )); + } + } + + // Future> download( + // String url, + // String path, { + // Map headers, + // String contentType = 'application/octet-stream', + // Map query, + // }) async { + // try { + // var response = await _performRequest( + // () => _get(url, contentType, query, null), + // headers: headers, + // ); + // response.bodyBytes.listen((value) {}); + // return response; + // } on Exception catch (e) { + // if (!errorSafety) { + // throw GetHttpException(e.toString()); + // } + // return Future.value(Response( + // statusText: 'Can not connect to server. Reason: $e', + // )); + // } + + // int byteCount = 0; + // int totalBytes = httpResponse.contentLength; + + // Directory appDocDir = await getApplicationDocumentsDirectory(); + // String appDocPath = appDocDir.path; + + // File file = File(path); + + // var raf = file.openSync(mode: FileMode.write); + + // Completer completer = Completer(); + + // httpResponse.listen( + // (data) { + // byteCount += data.length; + + // raf.writeFromSync(data); + + // if (onDownloadProgress != null) { + // onDownloadProgress(byteCount, totalBytes); + // } + // }, + // onDone: () { + // raf.closeSync(); + + // completer.complete(file.path); + // }, + // onError: (e) { + // raf.closeSync(); + // file.deleteSync(); + // completer.completeError(e); + // }, + // cancelOnError: true, + // ); + + // return completer.future; + // } + + Future> delete( + String url, { + Map? headers, + String? contentType, + Map? query, + Decoder? decoder, + }) async { + try { + var response = await _performRequest( + () async => _delete(url, contentType, query, decoder), + headers: headers, + ); + return response; + } on Exception catch (e) { + if (!errorSafety) { + throw GetHttpException(e.toString()); + } + return Future.value(Response( + statusText: 'Can not connect to server. Reason: $e', + )); + } + } + + void close() { + _httpClient.close(); + } +} diff --git a/siro_rider/packages/get/lib/get_connect/http/src/interceptors/get_modifiers.dart b/siro_rider/packages/get/lib/get_connect/http/src/interceptors/get_modifiers.dart new file mode 100644 index 0000000..4ddc3f8 --- /dev/null +++ b/siro_rider/packages/get/lib/get_connect/http/src/interceptors/get_modifiers.dart @@ -0,0 +1,56 @@ +import 'dart:async'; + +import '../request/request.dart'; +import '../response/response.dart'; + +typedef RequestModifier = FutureOr> Function(Request request); + +typedef ResponseModifier = FutureOr Function( + Request request, Response response); + +typedef HandlerExecute = Future> Function(); + +class GetModifier { + final _requestModifiers = []; + final _responseModifiers = []; + RequestModifier? authenticator; + + void addRequestModifier(RequestModifier interceptor) { + _requestModifiers.add(interceptor as RequestModifier); + } + + void removeRequestModifier(RequestModifier interceptor) { + _requestModifiers.remove(interceptor); + } + + void addResponseModifier(ResponseModifier interceptor) { + _responseModifiers.add(interceptor as ResponseModifier); + } + + void removeResponseModifier(ResponseModifier interceptor) { + _requestModifiers.remove(interceptor); + } + + Future> modifyRequest(Request request) async { + var newRequest = request; + if (_requestModifiers.isNotEmpty) { + for (var interceptor in _requestModifiers) { + newRequest = await interceptor(newRequest) as Request; + } + } + + return newRequest; + } + + Future> modifyResponse( + Request request, Response response) async { + var newResponse = response; + if (_responseModifiers.isNotEmpty) { + for (var interceptor in _responseModifiers) { + newResponse = await interceptor(request, response) as Response; + } + } + + return newResponse; + } +} diff --git a/siro_rider/packages/get/lib/get_connect/http/src/multipart/form_data.dart b/siro_rider/packages/get/lib/get_connect/http/src/multipart/form_data.dart new file mode 100644 index 0000000..a440685 --- /dev/null +++ b/siro_rider/packages/get/lib/get_connect/http/src/multipart/form_data.dart @@ -0,0 +1,116 @@ +import 'dart:async'; +import 'dart:convert'; +import 'dart:math'; + +import '../request/request.dart'; +import '../utils/utils.dart'; +import 'multipart_file.dart'; + +class FormData { + FormData(Map map) : boundary = _getBoundary() { + map.forEach((key, value) { + if (value == null) return; + if (value is MultipartFile) { + files.add(MapEntry(key, value)); + } else if (value is List) { + files.addAll(value.map((e) => MapEntry(key, e))); + } else if (value is List) { + fields.addAll(value.map((e) => MapEntry(key, e.toString()))); + } else { + fields.add(MapEntry(key, value.toString())); + } + }); + } + + static const int _maxBoundaryLength = 70; + + static String _getBoundary() { + final random = Random(); + var list = List.generate(_maxBoundaryLength - GET_BOUNDARY.length, + (_) => boundaryCharacters[random.nextInt(boundaryCharacters.length)], + growable: false); + return '$GET_BOUNDARY${String.fromCharCodes(list)}'; + } + + final String boundary; + + /// The form fields to send for this request. + final fields = >[]; + + /// The files to send for this request + final files = >[]; + + /// Returns the header string for a field. The return value is guaranteed to + /// contain only ASCII characters. + String _fieldHeader(String name, String value) { + var header = + 'content-disposition: form-data; name="${browserEncode(name)}"'; + if (!isPlainAscii(value)) { + header = '$header\r\n' + 'content-type: text/plain; charset=utf-8\r\n' + 'content-transfer-encoding: binary'; + } + return '$header\r\n\r\n'; + } + + /// Returns the header string for a file. The return value is guaranteed to + /// contain only ASCII characters. + String _fileHeader(MapEntry file) { + var header = + 'content-disposition: form-data; name="${browserEncode(file.key)}"'; + header = '$header; filename="${browserEncode(file.value.filename)}"'; + header = '$header\r\n' + 'content-type: ${file.value.contentType}'; + return '$header\r\n\r\n'; + } + + /// The length of the request body from this [FormData] + int get length { + var length = 0; + + for (final item in fields) { + length += '--'.length + + _maxBoundaryLength + + '\r\n'.length + + utf8.encode(_fieldHeader(item.key, item.value)).length + + utf8.encode(item.value).length + + '\r\n'.length; + } + + for (var file in files) { + length += '--'.length + + _maxBoundaryLength + + '\r\n'.length + + utf8.encode(_fileHeader(file)).length + + file.value.length! + + '\r\n'.length; + } + + return length + '--'.length + _maxBoundaryLength + '--\r\n'.length; + } + + Future> toBytes() { + return BodyBytesStream(_encode()).toBytes(); + } + + Stream> _encode() async* { + const line = [13, 10]; + final separator = utf8.encode('--$boundary\r\n'); + final close = utf8.encode('--$boundary--\r\n'); + + for (var field in fields) { + yield separator; + yield utf8.encode(_fieldHeader(field.key, field.value)); + yield utf8.encode(field.value); + yield line; + } + + for (final file in files) { + yield separator; + yield utf8.encode(_fileHeader(file)); + yield* file.value.stream!; + yield line; + } + yield close; + } +} diff --git a/siro_rider/packages/get/lib/get_connect/http/src/multipart/multipart_file.dart b/siro_rider/packages/get/lib/get_connect/http/src/multipart/multipart_file.dart new file mode 100644 index 0000000..042b3e5 --- /dev/null +++ b/siro_rider/packages/get/lib/get_connect/http/src/multipart/multipart_file.dart @@ -0,0 +1,30 @@ +import '../_http/_stub/_file_decoder_stub.dart' + if (dart.library.html) '../_http/_html/_file_decoder_html.dart' + if (dart.library.io) '../_http/_io/_file_decoder_io.dart' as decoder; +import '../request/request.dart'; + +class MultipartFile { + MultipartFile( + dynamic data, { + required this.filename, + this.contentType = 'application/octet-stream', + }) : _bytes = decoder.fileToBytes(data) { + _length = _bytes.length; + _stream = BodyBytesStream.fromBytes(_bytes); + } + + final List _bytes; + + final String contentType; + + /// This stream will emit the file content of File. + Stream>? _stream; + + int? _length; + + Stream>? get stream => _stream; + + int? get length => _length; + + final String filename; +} diff --git a/siro_rider/packages/get/lib/get_connect/http/src/request/request.dart b/siro_rider/packages/get/lib/get_connect/http/src/request/request.dart new file mode 100644 index 0000000..0d249db --- /dev/null +++ b/siro_rider/packages/get/lib/get_connect/http/src/request/request.dart @@ -0,0 +1,131 @@ +import 'dart:async'; +import 'dart:convert'; +import 'dart:typed_data'; + +import '../http.dart'; +import '../multipart/form_data.dart'; + +class Request { + /// Headers attach to this [Request] + final Map headers; + + /// The [Uri] from request + final Uri url; + + final Decoder? decoder; + + /// The Http Method from this [Request] + /// ex: `GET`,`POST`,`PUT`,`DELETE` + final String method; + + final int? contentLength; + + /// The BodyBytesStream of body from this [Request] + final Stream> bodyBytes; + + /// When true, the client will follow redirects to resolves this [Request] + final bool followRedirects; + + /// The maximum number of redirects if [followRedirects] is true. + final int maxRedirects; + + final bool persistentConnection; + + final FormData? files; + + const Request._({ + required this.method, + required this.bodyBytes, + required this.url, + required this.headers, + required this.contentLength, + required this.followRedirects, + required this.maxRedirects, + required this.files, + required this.persistentConnection, + required this.decoder, + }); + + factory Request({ + required Uri url, + required String method, + required Map headers, + Stream>? bodyBytes, + bool followRedirects = true, + int maxRedirects = 4, + int? contentLength, + FormData? files, + bool persistentConnection = true, + Decoder? decoder, + }) { + if (followRedirects) { + assert(maxRedirects > 0); + } + return Request._( + url: url, + method: method, + bodyBytes: bodyBytes ??= BodyBytesStream.fromBytes(const []), + headers: Map.from(headers), + followRedirects: followRedirects, + maxRedirects: maxRedirects, + contentLength: contentLength, + files: files, + persistentConnection: persistentConnection, + decoder: decoder, + ); + } + + Request copyWith({ + Uri? url, + String? method, + Map? headers, + Stream>? bodyBytes, + bool? followRedirects, + int? maxRedirects, + int? contentLength, + FormData? files, + bool? persistentConnection, + Decoder? decoder, + bool appendHeader = true, + }) { + // If appendHeader is set to true, we will merge origin headers with that + if (appendHeader && headers != null) { + headers.addAll(this.headers); + } + + return Request._( + url: url ?? this.url, + method: method ?? this.method, + bodyBytes: bodyBytes ?? this.bodyBytes, + headers: headers == null ? this.headers : Map.from(headers), + followRedirects: followRedirects ?? this.followRedirects, + maxRedirects: maxRedirects ?? this.maxRedirects, + contentLength: contentLength ?? this.contentLength, + files: files ?? this.files, + persistentConnection: persistentConnection ?? this.persistentConnection, + decoder: decoder ?? this.decoder, + ); + } +} + +extension BodyBytesStream on Stream> { + static Stream> fromBytes(List bytes) => + Stream.fromIterable([bytes]); + + Future toBytes() { + var completer = Completer(); + var sink = ByteConversionSink.withCallback( + (bytes) => completer.complete( + Uint8List.fromList(bytes), + ), + ); + listen((val) => sink.add(val), + onError: completer.completeError, + onDone: sink.close, + cancelOnError: true); + return completer.future; + } + + Future bytesToString([Encoding encoding = utf8]) => + encoding.decodeStream(this); +} diff --git a/siro_rider/packages/get/lib/get_connect/http/src/response/response.dart b/siro_rider/packages/get/lib/get_connect/http/src/response/response.dart new file mode 100644 index 0000000..75c48e5 --- /dev/null +++ b/siro_rider/packages/get/lib/get_connect/http/src/response/response.dart @@ -0,0 +1,270 @@ +import 'dart:collection'; +import 'dart:convert'; + +import '../exceptions/exceptions.dart'; +import '../request/request.dart'; +import '../status/http_status.dart'; + +class GraphQLResponse extends Response { + final List? graphQLErrors; + GraphQLResponse({T? body, this.graphQLErrors}) : super(body: body); + GraphQLResponse.fromResponse(Response res) + : graphQLErrors = null, + super( + request: res.request, + statusCode: res.statusCode, + bodyBytes: res.bodyBytes, + bodyString: res.bodyString, + statusText: res.statusText, + headers: res.headers, + body: res.body['data'] as T?); +} + +class Response { + const Response({ + this.request, + this.statusCode, + this.bodyBytes, + this.bodyString, + this.statusText = '', + this.headers = const {}, + this.body, + }); + + /// The Http [Request] linked with this [Response]. + final Request? request; + + /// The response headers. + final Map? headers; + + /// The status code returned by the server. + final int? statusCode; + + /// Human-readable context for [statusCode]. + final String? statusText; + + /// [HttpStatus] from [Response]. `status.connectionError` is true + /// when statusCode is null. `status.isUnauthorized` is true when + /// statusCode is equal `401`. `status.isNotFound` is true when + /// statusCode is equal `404`. `status.isServerError` is true when + /// statusCode is between `500` and `599`. + HttpStatus get status => HttpStatus(statusCode); + + /// `hasError` is true when statusCode is not between 200 and 299. + bool get hasError => status.hasError; + + /// `isOk` is true when statusCode is between 200 and 299. + bool get isOk => !hasError; + + /// `unauthorized` is true when statusCode is equal `401`. + bool get unauthorized => status.isUnauthorized; + + /// The response body as a Stream of Bytes. + final Stream>? bodyBytes; + + /// The response body as a Stream of Bytes. + final String? bodyString; + + /// The decoded body of this [Response]. You can access the + /// body parameters as Map + /// Ex: `body['title'];` + final T? body; +} + +Future bodyBytesToString( + Stream> bodyBytes, Map headers) { + return bodyBytes.bytesToString(_encodingForHeaders(headers)); +} + +/// Returns the encoding to use for a response with the given headers. +/// +/// Defaults to [utf8] if the headers don't specify a charset or if that +/// charset is unknown. +Encoding _encodingForHeaders(Map headers) => + _encodingForCharset(_contentTypeForHeaders(headers).parameters!['charset']); + +/// Returns the [Encoding] that corresponds to [charset]. +/// +/// Returns [fallback] if [charset] is null or if no [Encoding] was found that +/// corresponds to [charset]. +Encoding _encodingForCharset(String? charset, [Encoding fallback = utf8]) { + if (charset == null) return fallback; + return Encoding.getByName(charset) ?? fallback; +} + +/// Returns the MediaType object for the given headers's content-type. +/// +/// Defaults to `application/octet-stream`. +HeaderValue _contentTypeForHeaders(Map headers) { + var contentType = headers['content-type']; + if (contentType != null) return HeaderValue.parse(contentType); + return HeaderValue('application/octet-stream'); +} + +class HeaderValue { + String _value; + Map? _parameters; + Map? _unmodifiableParameters; + + HeaderValue([this._value = '', Map? parameters]) { + if (parameters != null) { + _parameters = HashMap.from(parameters); + } + } + + static HeaderValue parse(String value, + {String parameterSeparator = ';', + String? valueSeparator, + bool preserveBackslash = false}) { + var result = HeaderValue(); + result._parse(value, parameterSeparator, valueSeparator, preserveBackslash); + return result; + } + + String get value => _value; + + void _ensureParameters() { + _parameters ??= HashMap(); + } + + Map? get parameters { + _ensureParameters(); + _unmodifiableParameters ??= UnmodifiableMapView(_parameters!); + return _unmodifiableParameters; + } + + @override + String toString() { + var stringBuffer = StringBuffer(); + stringBuffer.write(_value); + if (parameters != null && parameters!.isNotEmpty) { + _parameters!.forEach((name, value) { + stringBuffer + ..write('; ') + ..write(name) + ..write('=') + ..write(value); + }); + } + return stringBuffer.toString(); + } + + void _parse(String value, String parameterSeparator, String? valueSeparator, + bool preserveBackslash) { + var index = 0; + + bool done() => index == value.length; + + void bump() { + while (!done()) { + if (value[index] != ' ' && value[index] != '\t') return; + index++; + } + } + + String parseValue() { + var start = index; + while (!done()) { + if (value[index] == ' ' || + value[index] == '\t' || + value[index] == valueSeparator || + value[index] == parameterSeparator) { + break; + } + index++; + } + return value.substring(start, index); + } + + void expect(String expected) { + if (done() || value[index] != expected) { + throw StateError('Failed to parse header value'); + } + index++; + } + + void maybeExpect(String expected) { + if (value[index] == expected) index++; + } + + void parseParameters() { + var parameters = HashMap(); + _parameters = UnmodifiableMapView(parameters); + + String parseParameterName() { + var start = index; + while (!done()) { + if (value[index] == ' ' || + value[index] == '\t' || + value[index] == '=' || + value[index] == parameterSeparator || + value[index] == valueSeparator) { + break; + } + index++; + } + return value.substring(start, index).toLowerCase(); + } + + String? parseParameterValue() { + if (!done() && value[index] == '"') { + var stringBuffer = StringBuffer(); + index++; + while (!done()) { + if (value[index] == '\\') { + if (index + 1 == value.length) { + throw StateError('Failed to parse header value'); + } + if (preserveBackslash && value[index + 1] != '"') { + stringBuffer.write(value[index]); + } + index++; + } else if (value[index] == '"') { + index++; + break; + } + stringBuffer.write(value[index]); + index++; + } + return stringBuffer.toString(); + } else { + var val = parseValue(); + return val == '' ? null : val; + } + } + + while (!done()) { + bump(); + if (done()) return; + var name = parseParameterName(); + bump(); + if (done()) { + parameters[name] = null; + return; + } + maybeExpect('='); + bump(); + if (done()) { + parameters[name] = null; + return; + } + var valueParameter = parseParameterValue(); + if (name == 'charset' && valueParameter != null) { + valueParameter = valueParameter.toLowerCase(); + } + parameters[name] = valueParameter; + bump(); + if (done()) return; + if (value[index] == valueSeparator) return; + expect(parameterSeparator); + } + } + + bump(); + _value = parseValue(); + bump(); + if (done()) return; + maybeExpect(parameterSeparator); + parseParameters(); + } +} diff --git a/siro_rider/packages/get/lib/get_connect/http/src/status/http_status.dart b/siro_rider/packages/get/lib/get_connect/http/src/status/http_status.dart new file mode 100644 index 0000000..188cfe0 --- /dev/null +++ b/siro_rider/packages/get/lib/get_connect/http/src/status/http_status.dart @@ -0,0 +1,92 @@ +class HttpStatus { + HttpStatus(this.code); + + final int? code; + + static const int continue_ = 100; + static const int switchingProtocols = 101; + static const int processing = 102; + static const int earlyHints = 103; + static const int ok = 200; + static const int created = 201; + static const int accepted = 202; + static const int nonAuthoritativeInformation = 203; + static const int noContent = 204; + static const int resetContent = 205; + static const int partialContent = 206; + static const int multiStatus = 207; + static const int alreadyReported = 208; + static const int imUsed = 226; + static const int multipleChoices = 300; + static const int movedPermanently = 301; + static const int found = 302; + static const int movedTemporarily = 302; // Common alias for found. + static const int seeOther = 303; + static const int notModified = 304; + static const int useProxy = 305; + static const int switchProxy = 306; + static const int temporaryRedirect = 307; + static const int permanentRedirect = 308; + static const int badRequest = 400; + static const int unauthorized = 401; + static const int paymentRequired = 402; + static const int forbidden = 403; + static const int notFound = 404; + static const int methodNotAllowed = 405; + static const int notAcceptable = 406; + static const int proxyAuthenticationRequired = 407; + static const int requestTimeout = 408; + static const int conflict = 409; + static const int gone = 410; + static const int lengthRequired = 411; + static const int preconditionFailed = 412; + static const int requestEntityTooLarge = 413; + static const int requestUriTooLong = 414; + static const int unsupportedMediaType = 415; + static const int requestedRangeNotSatisfiable = 416; + static const int expectationFailed = 417; + static const int imATeapot = 418; + static const int misdirectedRequest = 421; + static const int unprocessableEntity = 422; + static const int locked = 423; + static const int failedDependency = 424; + static const int tooEarly = 425; + static const int upgradeRequired = 426; + static const int preconditionRequired = 428; + static const int tooManyRequests = 429; + static const int requestHeaderFieldsTooLarge = 431; + static const int connectionClosedWithoutResponse = 444; + static const int unavailableForLegalReasons = 451; + static const int clientClosedRequest = 499; + static const int internalServerError = 500; + static const int notImplemented = 501; + static const int badGateway = 502; + static const int serviceUnavailable = 503; + static const int gatewayTimeout = 504; + static const int httpVersionNotSupported = 505; + static const int variantAlsoNegotiates = 506; + static const int insufficientStorage = 507; + static const int loopDetected = 508; + static const int notExtended = 510; + static const int networkAuthenticationRequired = 511; + static const int networkConnectTimeoutError = 599; + + bool get connectionError => code == null; + + bool get isUnauthorized => code == unauthorized; + + bool get isForbidden => code == forbidden; + + bool get isNotFound => code == notFound; + + bool get isServerError => + between(internalServerError, networkConnectTimeoutError); + + bool between(int begin, int end) { + return !connectionError && code! >= begin && code! <= end; + } + + bool get isOk => between(200, 299); + + bool get hasError => !isOk; +} diff --git a/siro_rider/packages/get/lib/get_connect/http/src/utils/utils.dart b/siro_rider/packages/get/lib/get_connect/http/src/utils/utils.dart new file mode 100644 index 0000000..364ef39 --- /dev/null +++ b/siro_rider/packages/get/lib/get_connect/http/src/utils/utils.dart @@ -0,0 +1,139 @@ +import 'dart:convert'; + +bool isTokenChar(int byte) { + return byte > 31 && byte < 128 && !SEPARATOR_MAP[byte]; +} + +bool isValueChar(int byte) { + return (byte > 31 && byte < 128) || + (byte == CharCode.SP) || + (byte == CharCode.HT); +} + +class CharCode { + static const int HT = 9; + static const int LF = 10; + static const int CR = 13; + static const int SP = 32; + static const int COMMA = 44; + static const int SLASH = 47; + static const int ZERO = 48; + static const int ONE = 49; + static const int COLON = 58; + static const int SEMI_COLON = 59; +} + +const bool F = false; + +const bool T = true; +const SEPARATOR_MAP = [ + F, F, F, F, F, F, F, F, F, T, F, F, F, F, F, F, F, F, F, F, F, F, F, F, // + F, F, F, F, F, F, F, F, T, F, T, F, F, F, F, F, T, T, F, F, T, F, F, T, // + F, F, F, F, F, F, F, F, F, F, T, T, T, T, T, T, T, F, F, F, F, F, F, F, // + F, F, F, F, F, F, F, F, F, F, F, F, F, F, F, F, F, F, F, T, T, T, F, F, // + F, F, F, F, F, F, F, F, F, F, F, F, F, F, F, F, F, F, F, F, F, F, F, F, // + F, F, F, T, F, T, F, F, F, F, F, F, F, F, F, F, F, F, F, F, F, F, F, F, // + F, F, F, F, F, F, F, F, F, F, F, F, F, F, F, F, F, F, F, F, F, F, F, F, // + F, F, F, F, F, F, F, F, F, F, F, F, F, F, F, F, F, F, F, F, F, F, F, F, // + F, F, F, F, F, F, F, F, F, F, F, F, F, F, F, F, F, F, F, F, F, F, F, F, // + F, F, F, F, F, F, F, F, F, F, F, F, F, F, F, F, F, F, F, F, F, F, F, F, // + F, F, F, F, F, F, F, F, F, F, F, F, F, F, F, F +]; + +String validateField(String field) { + for (var i = 0; i < field.length; i++) { + if (!isTokenChar(field.codeUnitAt(i))) { + throw FormatException( + 'Invalid HTTP header field name: ${json.encode(field)}', field, i); + } + } + return field.toLowerCase(); +} + +// Stream> toBodyBytesStream(Stream> stream) { +// return (stream); +// } + +final _asciiOnly = RegExp(r'^[\x00-\x7F]+$'); + +final newlineRegExp = RegExp(r'\r\n|\r|\n'); + +/// Returns whether [string] is composed entirely of ASCII-compatible +/// characters. +bool isPlainAscii(String string) => _asciiOnly.hasMatch(string); + +const String GET_BOUNDARY = 'getx-http-boundary-'; + +/// Encode [value] like browsers +String browserEncode(String value) { + return value.replaceAll(newlineRegExp, '%0D%0A').replaceAll('"', '%22'); +} + +const List boundaryCharacters = [ + 43, + 95, + 45, + 46, + 48, + 49, + 50, + 51, + 52, + 53, + 54, + 55, + 56, + 57, + 65, + 66, + 67, + 68, + 69, + 70, + 71, + 72, + 73, + 74, + 75, + 76, + 77, + 78, + 79, + 80, + 81, + 82, + 83, + 84, + 85, + 86, + 87, + 88, + 89, + 90, + 97, + 98, + 99, + 100, + 101, + 102, + 103, + 104, + 105, + 106, + 107, + 108, + 109, + 110, + 111, + 112, + 113, + 114, + 115, + 116, + 117, + 118, + 119, + 120, + 121, + 122 +]; diff --git a/siro_rider/packages/get/lib/get_connect/sockets/sockets.dart b/siro_rider/packages/get/lib/get_connect/sockets/sockets.dart new file mode 100644 index 0000000..faf9855 --- /dev/null +++ b/siro_rider/packages/get/lib/get_connect/sockets/sockets.dart @@ -0,0 +1,9 @@ +import 'src/sockets_stub.dart' + if (dart.library.html) 'src/sockets_html.dart' + if (dart.library.io) 'src/sockets_io.dart'; + +class GetSocket extends BaseWebSocket { + GetSocket(String url, + {Duration ping = const Duration(seconds: 5), bool allowSelfSigned = true}) + : super(url, ping: ping, allowSelfSigned: allowSelfSigned); +} diff --git a/siro_rider/packages/get/lib/get_connect/sockets/src/socket_notifier.dart b/siro_rider/packages/get/lib/get_connect/sockets/src/socket_notifier.dart new file mode 100644 index 0000000..f8a30fa --- /dev/null +++ b/siro_rider/packages/get/lib/get_connect/sockets/src/socket_notifier.dart @@ -0,0 +1,101 @@ +import 'dart:convert'; + +/// Signature for [SocketNotifier.addCloses]. +typedef CloseSocket = void Function(Close); + +/// Signature for [SocketNotifier.addMessages]. +typedef MessageSocket = void Function(dynamic val); + +/// Signature for [SocketNotifier.open]. +typedef OpenSocket = void Function(); + +/// Wrapper class to message and reason from SocketNotifier +class Close { + final String? message; + final int? reason; + + Close(this.message, this.reason); + + @override + String toString() { + return 'Closed by server [$reason => $message]!'; + } +} + +/// This class manages the transmission of messages over websockets using +/// GetConnect +class SocketNotifier { + List? _onMessages = []; + Map? _onEvents = {}; + List? _onCloses = []; + List? _onErrors = []; + + late OpenSocket open; + + /// subscribe to close events + void addCloses(CloseSocket socket) { + _onCloses!.add(socket); + } + + /// subscribe to error events + void addErrors(CloseSocket socket) { + _onErrors!.add((socket)); + } + + /// subscribe to named events + void addEvents(String event, MessageSocket socket) { + _onEvents![event] = socket; + } + + /// subscribe to message events + void addMessages(MessageSocket socket) { + _onMessages!.add((socket)); + } + + /// Dispose messages, events, closes and errors subscriptions + void dispose() { + _onMessages = null; + _onEvents = null; + _onCloses = null; + _onErrors = null; + } + + /// Notify all subscriptions on [addCloses] + void notifyClose(Close err) { + for (var item in _onCloses!) { + item(err); + } + } + + /// Notify all subscriptions on [addMessages] + void notifyData(dynamic data) { + for (var item in _onMessages!) { + item(data); + } + if (data is String) { + _tryOn(data); + } + } + + /// Notify all subscriptions on [addErrors] + void notifyError(Close err) { + // rooms.removeWhere((key, value) => value.contains(_ws)); + for (var item in _onErrors!) { + item(err); + } + } + + void _tryOn(String message) { + try { + var msg = jsonDecode(message); + final event = msg['type']; + final data = msg['data']; + if (_onEvents!.containsKey(event)) { + _onEvents![event]!(data); + } + // ignore: avoid_catches_without_on_clauses + } catch (_) { + return; + } + } +} diff --git a/siro_rider/packages/get/lib/get_connect/sockets/src/sockets_html.dart b/siro_rider/packages/get/lib/get_connect/sockets/src/sockets_html.dart new file mode 100644 index 0000000..d2a9317 --- /dev/null +++ b/siro_rider/packages/get/lib/get_connect/sockets/src/sockets_html.dart @@ -0,0 +1,116 @@ +import 'dart:async'; +import 'dart:convert'; +// ignore: avoid_web_libraries_in_flutter +import 'dart:html'; + +import '../../../get_core/get_core.dart'; +import 'socket_notifier.dart'; + +class BaseWebSocket { + String url; + WebSocket? socket; + SocketNotifier? socketNotifier = SocketNotifier(); + Duration ping; + bool isDisposed = false; + bool allowSelfSigned; + + ConnectionStatus? connectionStatus; + Timer? _t; + BaseWebSocket( + this.url, { + this.ping = const Duration(seconds: 5), + this.allowSelfSigned = true, + }) { + url = url.startsWith('https') + ? url.replaceAll('https:', 'wss:') + : url.replaceAll('http:', 'ws:'); + } + + void close([int? status, String? reason]) { + socket?.close(status, reason); + } + + // ignore: use_setters_to_change_properties + void connect() { + try { + connectionStatus = ConnectionStatus.connecting; + socket = WebSocket(url); + socket!.onOpen.listen((e) { + socketNotifier?.open(); + _t = Timer?.periodic(ping, (t) { + socket!.send(''); + }); + connectionStatus = ConnectionStatus.connected; + }); + + socket!.onMessage.listen((event) { + socketNotifier!.notifyData(event.data); + }); + + socket!.onClose.listen((e) { + _t?.cancel(); + + connectionStatus = ConnectionStatus.closed; + socketNotifier!.notifyClose(Close(e.reason, e.code)); + }); + socket!.onError.listen((event) { + _t?.cancel(); + socketNotifier!.notifyError(Close(event.toString(), 0)); + connectionStatus = ConnectionStatus.closed; + }); + } on Exception catch (e) { + _t?.cancel(); + socketNotifier!.notifyError(Close(e.toString(), 500)); + connectionStatus = ConnectionStatus.closed; + // close(500, e.toString()); + } + } + + void dispose() { + socketNotifier!.dispose(); + socketNotifier = null; + isDisposed = true; + } + + void emit(String event, dynamic data) { + send(jsonEncode({'type': event, 'data': data})); + } + + void on(String event, MessageSocket message) { + socketNotifier!.addEvents(event, message); + } + + void onClose(CloseSocket fn) { + socketNotifier!.addCloses(fn); + } + + void onError(CloseSocket fn) { + socketNotifier!.addErrors(fn); + } + + void onMessage(MessageSocket fn) { + socketNotifier!.addMessages(fn); + } + + // ignore: use_setters_to_change_properties + void onOpen(OpenSocket fn) { + socketNotifier!.open = fn; + } + + void send(dynamic data) { + if (connectionStatus == ConnectionStatus.closed) { + connect(); + } + if (socket != null && socket!.readyState == WebSocket.OPEN) { + socket!.send(data); + } else { + Get.log('WebSocket not connected, message $data not sent'); + } + } +} + +enum ConnectionStatus { + connecting, + connected, + closed, +} diff --git a/siro_rider/packages/get/lib/get_connect/sockets/src/sockets_io.dart b/siro_rider/packages/get/lib/get_connect/sockets/src/sockets_io.dart new file mode 100644 index 0000000..288777d --- /dev/null +++ b/siro_rider/packages/get/lib/get_connect/sockets/src/sockets_io.dart @@ -0,0 +1,138 @@ +import 'dart:async'; +import 'dart:convert'; +import 'dart:io'; +import 'dart:math'; + +import '../../../get_core/get_core.dart'; +import 'socket_notifier.dart'; + +class BaseWebSocket { + String url; + WebSocket? socket; + SocketNotifier? socketNotifier = SocketNotifier(); + bool isDisposed = false; + Duration ping; + bool allowSelfSigned; + ConnectionStatus? connectionStatus; + + BaseWebSocket( + this.url, { + this.ping = const Duration(seconds: 5), + this.allowSelfSigned = true, + }); + + void close([int? status, String? reason]) { + socket?.close(status, reason); + } + + // ignore: use_setters_to_change_properties + Future connect() async { + if (isDisposed) { + socketNotifier = SocketNotifier(); + } + try { + connectionStatus = ConnectionStatus.connecting; + socket = allowSelfSigned + ? await _connectForSelfSignedCert(url) + : await WebSocket.connect(url); + + socket!.pingInterval = ping; + socketNotifier?.open(); + connectionStatus = ConnectionStatus.connected; + + socket!.listen((data) { + socketNotifier!.notifyData(data); + }, onError: (err) { + socketNotifier!.notifyError(Close(err.toString(), 1005)); + }, onDone: () { + connectionStatus = ConnectionStatus.closed; + socketNotifier! + .notifyClose(Close('Connection Closed', socket!.closeCode)); + }, cancelOnError: true); + return; + } on SocketException catch (e) { + connectionStatus = ConnectionStatus.closed; + socketNotifier! + .notifyError(Close(e.osError!.message, e.osError!.errorCode)); + return; + } + } + + void dispose() { + socketNotifier!.dispose(); + socketNotifier = null; + isDisposed = true; + } + + void emit(String event, dynamic data) { + send(jsonEncode({'type': event, 'data': data})); + } + + void on(String event, MessageSocket message) { + socketNotifier!.addEvents(event, message); + } + + void onClose(CloseSocket fn) { + socketNotifier!.addCloses(fn); + } + + void onError(CloseSocket fn) { + socketNotifier!.addErrors(fn); + } + + void onMessage(MessageSocket fn) { + socketNotifier!.addMessages(fn); + } + + // ignore: use_setters_to_change_properties + void onOpen(OpenSocket fn) { + socketNotifier!.open = fn; + } + + void send(dynamic data) async { + if (connectionStatus == ConnectionStatus.closed) { + await connect(); + } + + if (socket != null) { + socket!.add(data); + } + } + + Future _connectForSelfSignedCert(String url) async { + try { + var r = Random(); + var key = base64.encode(List.generate(8, (_) => r.nextInt(255))); + var client = HttpClient(context: SecurityContext()); + client.badCertificateCallback = (cert, host, port) { + Get.log( + 'BaseWebSocket: Allow self-signed certificate => $host:$port. '); + return true; + }; + + var request = await client.getUrl(Uri.parse(url)); + request.headers.add('Connection', 'Upgrade'); + request.headers.add('Upgrade', 'websocket'); + request.headers.add('Sec-WebSocket-Version', '13'); + request.headers.add('Sec-WebSocket-Key', key.toLowerCase()); + + var response = await request.close(); + // ignore: close_sinks + var socket = await response.detachSocket(); + var webSocket = WebSocket.fromUpgradedSocket( + socket, + serverSide: false, + ); + + return webSocket; + } on Exception catch (_) { + rethrow; + } + } +} + +enum ConnectionStatus { + connecting, + connected, + closed, +} diff --git a/siro_rider/packages/get/lib/get_connect/sockets/src/sockets_stub.dart b/siro_rider/packages/get/lib/get_connect/sockets/src/sockets_stub.dart new file mode 100644 index 0000000..98ebd91 --- /dev/null +++ b/siro_rider/packages/get/lib/get_connect/sockets/src/sockets_stub.dart @@ -0,0 +1,54 @@ +import './socket_notifier.dart'; + +class BaseWebSocket { + String url; + Duration ping; + bool allowSelfSigned; + BaseWebSocket( + this.url, { + this.ping = const Duration(seconds: 5), + this.allowSelfSigned = true, + }) { + throw 'To use sockets you need dart:io or dart:html'; + } + + Future connect() async { + throw 'To use sockets you need dart:io or dart:html'; + } + + void onOpen(OpenSocket fn) { + throw 'To use sockets you need dart:io or dart:html'; + } + + void onClose(CloseSocket fn) { + throw 'To use sockets you need dart:io or dart:html'; + } + + void onError(CloseSocket fn) { + throw 'To use sockets you need dart:io or dart:html'; + } + + void onMessage(MessageSocket fn) { + throw 'To use sockets you need dart:io or dart:html'; + } + + void on(String event, MessageSocket message) { + throw 'To use sockets you need dart:io or dart:html'; + } + + void close([int? status, String? reason]) { + throw 'To use sockets you need dart:io or dart:html'; + } + + void send(dynamic data) async { + throw 'To use sockets you need dart:io or dart:html'; + } + + void dispose() { + throw 'To use sockets you need dart:io or dart:html'; + } + + void emit(String event, dynamic data) { + throw 'To use sockets you need dart:io or dart:html'; + } +} diff --git a/siro_rider/packages/get/lib/get_core/get_core.dart b/siro_rider/packages/get/lib/get_core/get_core.dart new file mode 100644 index 0000000..2eab26f --- /dev/null +++ b/siro_rider/packages/get/lib/get_core/get_core.dart @@ -0,0 +1,9 @@ +library get_core; + +export 'src/get_interface.dart'; +export 'src/get_main.dart'; +export 'src/log.dart'; +export 'src/smart_management.dart'; +export 'src/typedefs.dart'; + +T? ambiguate(T? value) => value; diff --git a/siro_rider/packages/get/lib/get_core/src/get_interface.dart b/siro_rider/packages/get/lib/get_core/src/get_interface.dart new file mode 100644 index 0000000..00b407e --- /dev/null +++ b/siro_rider/packages/get/lib/get_core/src/get_interface.dart @@ -0,0 +1,15 @@ +import 'package:flutter/foundation.dart'; +import 'package:flutter/widgets.dart'; + +import 'log.dart'; +import 'smart_management.dart'; + +/// GetInterface allows any auxiliary package to be merged into the "Get" +/// class through extensions +abstract class GetInterface { + SmartManagement smartManagement = SmartManagement.full; + RouterDelegate? routerDelegate; + RouteInformationParser? routeInformationParser; + bool isLogEnable = kDebugMode; + LogWriterCallback log = defaultLogWriterCallback; +} diff --git a/siro_rider/packages/get/lib/get_core/src/get_main.dart b/siro_rider/packages/get/lib/get_core/src/get_main.dart new file mode 100644 index 0000000..cab2be9 --- /dev/null +++ b/siro_rider/packages/get/lib/get_core/src/get_main.dart @@ -0,0 +1,12 @@ +import 'get_interface.dart'; + +///Use to instead of Navigator.push, off instead of Navigator.pushReplacement, +///offAll instead of Navigator.pushAndRemoveUntil. For named routes just +///add "named" after them. Example: toNamed, offNamed, and AllNamed. +///To return to the previous screen, use back(). +///No need to pass any context to Get, just put the name of the route inside +///the parentheses and the magic will occur. +class _GetImpl extends GetInterface {} + +// ignore: non_constant_identifier_names +final Get = _GetImpl(); diff --git a/siro_rider/packages/get/lib/get_core/src/log.dart b/siro_rider/packages/get/lib/get_core/src/log.dart new file mode 100644 index 0000000..01dd302 --- /dev/null +++ b/siro_rider/packages/get/lib/get_core/src/log.dart @@ -0,0 +1,10 @@ +import 'dart:developer' as developer; +import 'get_main.dart'; + +///VoidCallback from logs +typedef LogWriterCallback = void Function(String text, {bool isError}); + +/// default logger from GetX +void defaultLogWriterCallback(String value, {bool isError = false}) { + if (isError || Get.isLogEnable) developer.log(value, name: 'GETX'); +} diff --git a/siro_rider/packages/get/lib/get_core/src/smart_management.dart b/siro_rider/packages/get/lib/get_core/src/smart_management.dart new file mode 100644 index 0000000..2aad02b --- /dev/null +++ b/siro_rider/packages/get/lib/get_core/src/smart_management.dart @@ -0,0 +1,22 @@ +/// GetX by default disposes unused controllers from memory, +/// Through different behaviors. +/// SmartManagement.full +/// [SmartManagement.full] is the default one. Dispose classes that are +/// not being used and were not set to be permanent. In the majority +/// of the cases you will want to keep this config untouched. +/// If you new to GetX then don't change this. +/// [SmartManagement.onlyBuilder] only controllers started in init: +/// or loaded into a Binding with Get.lazyPut() will be disposed. If you use +/// Get.put() or Get.putAsync() or any other approach, SmartManagement +/// will not have permissions to exclude this dependency. With the default +/// behavior, even widgets instantiated with "Get.put" will be removed, +/// unlike SmartManagement.onlyBuilders. +/// [SmartManagement.keepFactory]Just like SmartManagement.full, +/// it will remove it's dependencies when it's not being used anymore. +/// However, it will keep their factory, which means it will recreate +/// the dependency if you need that instance again. +enum SmartManagement { + full, + onlyBuilder, + keepFactory, +} diff --git a/siro_rider/packages/get/lib/get_core/src/typedefs.dart b/siro_rider/packages/get/lib/get_core/src/typedefs.dart new file mode 100644 index 0000000..50b1d8f --- /dev/null +++ b/siro_rider/packages/get/lib/get_core/src/typedefs.dart @@ -0,0 +1 @@ +typedef ValueUpdater = T Function(); diff --git a/siro_rider/packages/get/lib/get_instance/get_instance.dart b/siro_rider/packages/get/lib/get_instance/get_instance.dart new file mode 100644 index 0000000..bff32cd --- /dev/null +++ b/siro_rider/packages/get/lib/get_instance/get_instance.dart @@ -0,0 +1,4 @@ +export 'src/bindings_interface.dart'; +export 'src/extension_instance.dart'; +export 'src/get_instance.dart'; +export 'src/lifecycle.dart'; diff --git a/siro_rider/packages/get/lib/get_instance/src/bindings_interface.dart b/siro_rider/packages/get/lib/get_instance/src/bindings_interface.dart new file mode 100644 index 0000000..941e012 --- /dev/null +++ b/siro_rider/packages/get/lib/get_instance/src/bindings_interface.dart @@ -0,0 +1,65 @@ +import 'get_instance.dart'; + +/// [Bindings] should be extended or implemented. +/// When using `GetMaterialApp`, all `GetPage`s and navigation +/// methods (like Get.to()) have a `binding` property that takes an +/// instance of Bindings to manage the +/// dependencies() (via Get.put()) for the Route you are opening. +// ignore: one_member_abstracts +abstract class Bindings { + void dependencies(); +} + +/// Simplifies Bindings generation from a single callback. +/// To avoid the creation of a custom Binding instance per route. +/// +/// Example: +/// ``` +/// GetPage( +/// name: '/', +/// page: () => Home(), +/// // This might cause you an error. +/// // binding: BindingsBuilder(() => Get.put(HomeController())), +/// binding: BindingsBuilder(() { Get.put(HomeController(); })), +/// // Using .lazyPut() works fine. +/// // binding: BindingsBuilder(() => Get.lazyPut(() => HomeController())), +/// ), +/// ``` +class BindingsBuilder extends Bindings { + /// Register your dependencies in the [builder] callback. + final BindingBuilderCallback builder; + + /// Shortcut to register 1 Controller with Get.put(), + /// Prevents the issue of the fat arrow function with the constructor. + /// BindingsBuilder(() => Get.put(HomeController())), + /// + /// Sample: + /// ``` + /// GetPage( + /// name: '/', + /// page: () => Home(), + /// binding: BindingsBuilder.put(() => HomeController()), + /// ), + /// ``` + factory BindingsBuilder.put(InstanceBuilderCallback builder, + {String? tag, bool permanent = false}) { + return BindingsBuilder( + () => GetInstance().put(builder(), tag: tag, permanent: permanent)); + } + + /// WARNING: don't use `()=> Get.put(Controller())`, + /// if only passing 1 callback use `BindingsBuilder.put(Controller())` + /// or `BindingsBuilder(()=> Get.lazyPut(Controller()))` + BindingsBuilder(this.builder); + + @override + void dependencies() { + builder(); + } +} + +// abstract class INavigation {} +// typedef Snack = Function(); +// typedef Modal = Function(); +// typedef Route = Function(); +typedef BindingBuilderCallback = void Function(); diff --git a/siro_rider/packages/get/lib/get_instance/src/extension_instance.dart b/siro_rider/packages/get/lib/get_instance/src/extension_instance.dart new file mode 100644 index 0000000..97053d3 --- /dev/null +++ b/siro_rider/packages/get/lib/get_instance/src/extension_instance.dart @@ -0,0 +1,160 @@ +import '../../route_manager.dart'; +import 'get_instance.dart'; + +extension Inst on GetInterface { + /// Creates a new Instance lazily from the `builder()` callback. + /// + /// The first time you call `Get.find()`, the `builder()` callback will create + /// the Instance and persisted as a Singleton (like you would use + /// `Get.put()`). + /// + /// Using `Get.smartManagement` as [SmartManagement.keepFactory] has + /// the same outcome + /// as using `fenix:true` : + /// The internal register of `builder()` will remain in memory to recreate + /// the Instance if the Instance has been removed with `Get.delete()`. + /// Therefore, future calls to `Get.find()` will return the same Instance. + /// + /// If you need to make use of GetxController's life-cycle + /// (`onInit(), onStart(), onClose()`) + /// [fenix] is a great choice to mix with `GetBuilder` and `GetX` widgets, + /// and/or [GetMaterialApp] Navigation. + /// + /// You could use `Get.lazyPut(fenix:true)` in your app's `main()` instead of + /// `Bindings` for each [GetPage]. + /// And the memory management will be similar. + /// + /// Subsequent calls to `Get.lazyPut` with the same parameters + /// (`` and optionally [tag] will **not** override the original). + void lazyPut(InstanceBuilderCallback builder, + {String? tag, bool fenix = false}) { + GetInstance().lazyPut(builder, tag: tag, fenix: fenix); + } + + // void printInstanceStack() { + // GetInstance().printInstanceStack(); + // } + + /// async version of `Get.put()`. + /// Awaits for the resolution of the Future from `builder()`parameter and + /// stores the Instance returned. + Future putAsync(AsyncInstanceBuilderCallback builder, + {String? tag, bool permanent = false}) async => + GetInstance().putAsync(builder, tag: tag, permanent: permanent); + + /// Creates a new Class Instance [S] from the builder callback[S]. + /// Every time `find()` is used, it calls the builder method to generate + /// a new Instance [S]. + /// It also registers each `instance.onClose()` with the current + /// Route `GetConfig.currentRoute` to keep the lifecycle active. + /// Is important to know that the instances created are only stored per Route. + /// So, if you call `Get.delete()` the "instance factory" used in this + /// method (`Get.create()`) will be removed, but NOT the instances + /// already created by it. + /// Uses `tag` as the other methods. + /// + /// Example: + /// + /// ```create(() => Repl()); + /// Repl a = find(); + /// Repl b = find(); + /// print(a==b); (false)``` + void create(InstanceBuilderCallback builder, + {String? tag, bool permanent = true}) => + GetInstance().create(builder, tag: tag, permanent: permanent); + + /// Finds a Instance of the required Class ``(or [tag]) + /// In the case of using `Get.create()`, it will generate an Instance + /// each time you call `Get.find()`. + S find({String? tag}) => GetInstance().find(tag: tag); + + /// Injects an `Instance` in memory. + /// + /// No need to define the generic type `<[S]>` as it's inferred + /// from the [dependency] parameter. + /// + /// - [dependency] The Instance to be injected. + /// - [tag] optionally, use a [tag] as an "id" to create multiple records + /// of the same `Type` the [tag] does **not** conflict with the same tags + /// used by other dependencies Types. + /// - [permanent] keeps the Instance in memory and persist it, + /// not following `Get.smartManagement` + /// rules. Although, can be removed by `GetInstance.reset()` + /// and `Get.delete()` + /// - [builder] If defined, the [dependency] must be returned from here + S put(S dependency, + {String? tag, + bool permanent = false, + InstanceBuilderCallback? builder}) => + GetInstance().put(dependency, tag: tag, permanent: permanent); + + /// Clears all registered instances (and/or tags). + /// Even the persistent ones. + /// + /// - `clearFactory` clears the callbacks registered by `Get.lazyPut()` + /// - `clearRouteBindings` clears Instances associated with Routes when using + /// [GetMaterialApp]. + // bool reset( + // {@deprecated bool clearFactory = true, + // @deprecated bool clearRouteBindings = true}) => + // GetInstance().reset( + // // ignore: deprecated_member_use_from_same_package + // clearFactory: clearFactory, + // // ignore: deprecated_member_use_from_same_package + // clearRouteBindings: clearRouteBindings); + + /// Deletes the `Instance`, cleaning the memory and closes any open + /// controllers (`DisposableInterface`). + /// + /// - [tag] Optional "tag" used to register the Instance + /// - [force] Will delete an Instance even if marked as `permanent`. + Future delete({String? tag, bool force = false}) async => + GetInstance().delete(tag: tag, force: force); + + /// Deletes all Instances, cleaning the memory and closes any open + /// controllers (`DisposableInterface`). + /// + /// - [force] Will delete the Instances even if marked as `permanent`. + Future deleteAll({bool force = false}) async => + GetInstance().deleteAll(force: force); + + void reloadAll({bool force = false}) => GetInstance().reloadAll(force: force); + + void reload({String? tag, String? key, bool force = false}) => + GetInstance().reload(tag: tag, key: key, force: force); + + /// Checks if a Class `Instance` (or [tag]) is registered in memory. + /// - [tag] optional, if you use a [tag] to register the Instance. + bool isRegistered({String? tag}) => + GetInstance().isRegistered(tag: tag); + + /// Checks if an `Instance` (or [tag]) returned from a factory builder + /// `Get.lazyPut()`, is registered in memory. + /// - [tag] optional, if you use a [tag] to register the Instance. + bool isPrepared({String? tag}) => GetInstance().isPrepared(tag: tag); + + /// Replace a parent instance of a class in dependency management + /// with a [child] instance + /// - [tag] optional, if you use a [tag] to register the Instance. + void replace

(P child, {String? tag}) { + final info = GetInstance().getInstanceInfo

(tag: tag); + final permanent = (info.isPermanent ?? false); + delete

(tag: tag, force: permanent); + put(child, tag: tag, permanent: permanent); + } + + /// Replaces a parent instance with a new Instance

lazily from the + /// `

builder()` callback. + /// - [tag] optional, if you use a [tag] to register the Instance. + /// - [fenix] optional + /// + /// Note: if fenix is not provided it will be set to true if + /// the parent instance was permanent + void lazyReplace

(InstanceBuilderCallback

builder, + {String? tag, bool? fenix}) { + final info = GetInstance().getInstanceInfo

(tag: tag); + final permanent = (info.isPermanent ?? false); + delete

(tag: tag, force: permanent); + lazyPut(builder, tag: tag, fenix: fenix ?? permanent); + } +} diff --git a/siro_rider/packages/get/lib/get_instance/src/get_instance.dart b/siro_rider/packages/get/lib/get_instance/src/get_instance.dart new file mode 100644 index 0000000..346ebc2 --- /dev/null +++ b/siro_rider/packages/get/lib/get_instance/src/get_instance.dart @@ -0,0 +1,551 @@ +import 'dart:async'; + +import '../../get_core/get_core.dart'; +import '../../get_navigation/src/router_report.dart'; +import 'lifecycle.dart'; + +class InstanceInfo { + final bool? isPermanent; + final bool? isSingleton; + bool get isCreate => !isSingleton!; + final bool isRegistered; + final bool isPrepared; + final bool? isInit; + const InstanceInfo({ + required this.isPermanent, + required this.isSingleton, + required this.isRegistered, + required this.isPrepared, + required this.isInit, + }); +} + +class GetInstance { + factory GetInstance() => _getInstance ??= const GetInstance._(); + + const GetInstance._(); + + static GetInstance? _getInstance; + + T call() => find(); + + /// Holds references to every registered Instance when using + /// `Get.put()` + static final Map _singl = {}; + + /// Holds a reference to every registered callback when using + /// `Get.lazyPut()` + // static final Map _factory = {}; + + void injector( + InjectorBuilderCallback fn, { + String? tag, + bool fenix = false, + // bool permanent = false, + }) { + lazyPut( + () => fn(this), + tag: tag, + fenix: fenix, + // permanent: permanent, + ); + } + + /// async version of `Get.put()`. + /// Awaits for the resolution of the Future from `builder()` parameter and + /// stores the Instance returned. + Future putAsync( + AsyncInstanceBuilderCallback builder, { + String? tag, + bool permanent = false, + }) async { + return put(await builder(), tag: tag, permanent: permanent); + } + + /// Injects an instance `` in memory to be globally accessible. + /// + /// No need to define the generic type `` as it's inferred from + /// the [dependency] + /// + /// - [dependency] The Instance to be injected. + /// - [tag] optionally, use a [tag] as an "id" to create multiple records of + /// the same Type<[S]> + /// - [permanent] keeps the Instance in memory, not following + /// `Get.smartManagement` rules. + S put( + S dependency, { + String? tag, + bool permanent = false, + @deprecated InstanceBuilderCallback? builder, + }) { + _insert( + isSingleton: true, + name: tag, + permanent: permanent, + builder: builder ?? (() => dependency)); + return find(tag: tag); + } + + /// Creates a new Instance lazily from the `builder()` callback. + /// + /// The first time you call `Get.find()`, the `builder()` callback will create + /// the Instance and persisted as a Singleton (like you would + /// use `Get.put()`). + /// + /// Using `Get.smartManagement` as [SmartManagement.keepFactory] has + /// the same outcome as using `fenix:true` : + /// The internal register of `builder()` will remain in memory to recreate + /// the Instance if the Instance has been removed with `Get.delete()`. + /// Therefore, future calls to `Get.find()` will return the same Instance. + /// + /// If you need to make use of GetxController's life-cycle + /// (`onInit(), onStart(), onClose()`) [fenix] is a great choice to mix with + /// `GetBuilder()` and `GetX()` widgets, and/or `GetMaterialApp` Navigation. + /// + /// You could use `Get.lazyPut(fenix:true)` in your app's `main()` instead + /// of `Bindings()` for each `GetPage`. + /// And the memory management will be similar. + /// + /// Subsequent calls to `Get.lazyPut()` with the same parameters + /// (<[S]> and optionally [tag] will **not** override the original). + void lazyPut( + InstanceBuilderCallback builder, { + String? tag, + bool? fenix, + bool permanent = false, + }) { + _insert( + isSingleton: true, + name: tag, + permanent: permanent, + builder: builder, + fenix: fenix ?? Get.smartManagement == SmartManagement.keepFactory, + ); + } + + /// Creates a new Class Instance [S] from the builder callback[S]. + /// Every time [find]<[S]>() is used, it calls the builder method to generate + /// a new Instance [S]. + /// It also registers each `instance.onClose()` with the current + /// Route `Get.reference` to keep the lifecycle active. + /// Is important to know that the instances created are only stored per Route. + /// So, if you call `Get.delete()` the "instance factory" used in this + /// method (`Get.create()`) will be removed, but NOT the instances + /// already created by it. + /// + /// Example: + /// + /// ```create(() => Repl()); + /// Repl a = find(); + /// Repl b = find(); + /// print(a==b); (false)``` + void create( + InstanceBuilderCallback builder, { + String? tag, + bool permanent = true, + }) { + _insert( + isSingleton: false, + name: tag, + builder: builder, + permanent: permanent, + ); + } + + /// Injects the Instance [S] builder into the `_singleton` HashMap. + void _insert({ + bool? isSingleton, + String? name, + bool permanent = false, + required InstanceBuilderCallback builder, + bool fenix = false, + }) { + final key = _getKey(S, name); + + if (_singl.containsKey(key)) { + final dep = _singl[key]; + if (dep != null && dep.isDirty) { + _singl[key] = _InstanceBuilderFactory( + isSingleton, + builder, + permanent, + false, + fenix, + name, + lateRemove: dep as _InstanceBuilderFactory, + ); + } + } else { + _singl[key] = _InstanceBuilderFactory( + isSingleton, + builder, + permanent, + false, + fenix, + name, + ); + } + } + + /// Initializes the dependencies for a Class Instance [S] (or tag), + /// If its a Controller, it starts the lifecycle process. + /// Optionally associating the current Route to the lifetime of the instance, + /// if `Get.smartManagement` is marked as [SmartManagement.full] or + /// [SmartManagement.keepFactory] + /// Only flags `isInit` if it's using `Get.create()` + /// (not for Singletons access). + /// Returns the instance if not initialized, required for Get.create() to + /// work properly. + S? _initDependencies({String? name}) { + final key = _getKey(S, name); + final isInit = _singl[key]!.isInit; + S? i; + if (!isInit) { + i = _startController(tag: name); + if (_singl[key]!.isSingleton!) { + _singl[key]!.isInit = true; + if (Get.smartManagement != SmartManagement.onlyBuilder) { + RouterReportManager.reportDependencyLinkedToRoute(_getKey(S, name)); + } + } + } + return i; + } + + InstanceInfo getInstanceInfo({String? tag}) { + final build = _getDependency(tag: tag); + + return InstanceInfo( + isPermanent: build?.permanent, + isSingleton: build?.isSingleton, + isRegistered: isRegistered(tag: tag), + isPrepared: !(build?.isInit ?? true), + isInit: build?.isInit, + ); + } + + _InstanceBuilderFactory? _getDependency({String? tag, String? key}) { + final newKey = key ?? _getKey(S, tag); + + if (!_singl.containsKey(newKey)) { + Get.log('Instance "$newKey" is not registered.', isError: true); + return null; + } else { + return _singl[newKey]; + } + } + + void markAsDirty({String? tag, String? key}) { + final newKey = key ?? _getKey(S, tag); + if (_singl.containsKey(newKey)) { + final dep = _singl[newKey]; + if (dep != null && !dep.permanent) { + dep.isDirty = true; + } + } + } + + /// Initializes the controller + S _startController({String? tag}) { + final key = _getKey(S, tag); + final i = _singl[key]!.getDependency() as S; + if (i is GetLifeCycleBase) { + i.onStart(); + if (tag == null) { + Get.log('Instance "$S" has been initialized'); + } else { + Get.log('Instance "$S" with tag "$tag" has been initialized'); + } + if (!_singl[key]!.isSingleton!) { + RouterReportManager.appendRouteByCreate(i); + } + } + return i; + } + + S putOrFind(InstanceBuilderCallback dep, {String? tag}) { + final key = _getKey(S, tag); + + if (_singl.containsKey(key)) { + return _singl[key]!.getDependency() as S; + } else { + return GetInstance().put(dep(), tag: tag); + } + } + + /// Finds the registered type <[S]> (or [tag]) + /// In case of using Get.[create] to register a type <[S]> or [tag], + /// it will create an instance each time you call [find]. + /// If the registered type <[S]> (or [tag]) is a Controller, + /// it will initialize it's lifecycle. + S find({String? tag}) { + final key = _getKey(S, tag); + if (isRegistered(tag: tag)) { + final dep = _singl[key]; + if (dep == null) { + if (tag == null) { + throw 'Class "$S" is not registered'; + } else { + throw 'Class "$S" with tag "$tag" is not registered'; + } + } + + // if (dep.lateRemove != null) { + // dep.isDirty = true; + // if(dep.fenix) + // } + + /// although dirty solution, the lifecycle starts inside + /// `initDependencies`, so we have to return the instance from there + /// to make it compatible with `Get.create()`. + final i = _initDependencies(name: tag); + return i ?? dep.getDependency() as S; + } else { + // ignore: lines_longer_than_80_chars + throw '"$S" not found. You need to call "Get.put($S())" or "Get.lazyPut(()=>$S())"'; + } + } + + /// Generates the key based on [type] (and optionally a [name]) + /// to register an Instance Builder in the hashmap. + String _getKey(Type type, String? name) { + return name == null ? type.toString() : type.toString() + name; + } + + /// Clears all registered instances (and/or tags). + /// Even the persistent ones. + /// This should be used at the end or tearDown of unit tests. + /// + /// `clearFactory` clears the callbacks registered by [lazyPut] + /// `clearRouteBindings` clears Instances associated with routes. + /// + bool resetInstance( + {@deprecated bool clearFactory = true, bool clearRouteBindings = true}) { + // if (clearFactory) _factory.clear(); + // deleteAll(force: true); + if (clearRouteBindings) RouterReportManager.clearRouteKeys(); + _singl.clear(); + + return true; + } + + /// Delete registered Class Instance [S] (or [tag]) and, closes any open + /// controllers `DisposableInterface`, cleans up the memory + /// + /// /// Deletes the Instance<[S]>, cleaning the memory. + // /// + // /// - [tag] Optional "tag" used to register the Instance + // /// - [key] For internal usage, is the processed key used to register + // /// the Instance. **don't use** it unless you know what you are doing. + + /// Deletes the Instance<[S]>, cleaning the memory and closes any open + /// controllers (`DisposableInterface`). + /// + /// - [tag] Optional "tag" used to register the Instance + /// - [key] For internal usage, is the processed key used to register + /// the Instance. **don't use** it unless you know what you are doing. + /// - [force] Will delete an Instance even if marked as `permanent`. + bool delete({String? tag, String? key, bool force = false}) { + final newKey = key ?? _getKey(S, tag); + + if (!_singl.containsKey(newKey)) { + Get.log('Instance "$newKey" already removed.', isError: true); + return false; + } + + final dep = _singl[newKey]; + + if (dep == null) return false; + + final _InstanceBuilderFactory builder; + if (dep.isDirty) { + builder = dep.lateRemove ?? dep; + } else { + builder = dep; + } + + if (builder.permanent && !force) { + Get.log( + // ignore: lines_longer_than_80_chars + '"$newKey" has been marked as permanent, SmartManagement is not authorized to delete it.', + isError: true, + ); + return false; + } + final i = builder.dependency; + + if (i is GetxServiceMixin && !force) { + return false; + } + + if (i is GetLifeCycleBase) { + i.onDelete(); + Get.log('"$newKey" onDelete() called'); + } + + if (builder.fenix) { + builder.dependency = null; + builder.isInit = false; + return true; + } else { + if (dep.lateRemove != null) { + dep.lateRemove = null; + Get.log('"$newKey" deleted from memory'); + return false; + } else { + _singl.remove(newKey); + if (_singl.containsKey(newKey)) { + Get.log('Error removing object "$newKey"', isError: true); + } else { + Get.log('"$newKey" deleted from memory'); + } + return true; + } + } + } + + /// Delete all registered Class Instances and, closes any open + /// controllers `DisposableInterface`, cleans up the memory + /// + /// - [force] Will delete the Instances even if marked as `permanent`. + void deleteAll({bool force = false}) { + final keys = _singl.keys.toList(); + for (final key in keys) { + delete(key: key, force: force); + } + } + + void reloadAll({bool force = false}) { + _singl.forEach((key, value) { + if (value.permanent && !force) { + Get.log('Instance "$key" is permanent. Skipping reload'); + } else { + value.dependency = null; + value.isInit = false; + Get.log('Instance "$key" was reloaded.'); + } + }); + } + + void reload({ + String? tag, + String? key, + bool force = false, + }) { + final newKey = key ?? _getKey(S, tag); + + final builder = _getDependency(tag: tag, key: newKey); + if (builder == null) return; + + if (builder.permanent && !force) { + Get.log( + '''Instance "$newKey" is permanent. Use [force = true] to force the restart.''', + isError: true, + ); + return; + } + + final i = builder.dependency; + + if (i is GetxServiceMixin && !force) { + return; + } + + if (i is GetLifeCycleBase) { + i.onDelete(); + Get.log('"$newKey" onDelete() called'); + } + + builder.dependency = null; + builder.isInit = false; + Get.log('Instance "$newKey" was restarted.'); + } + + /// Check if a Class Instance<[S]> (or [tag]) is registered in memory. + /// - [tag] is optional, if you used a [tag] to register the Instance. + bool isRegistered({String? tag}) => _singl.containsKey(_getKey(S, tag)); + + /// Checks if a lazy factory callback `Get.lazyPut()` that returns an + /// Instance<[S]> is registered in memory. + /// - [tag] is optional, if you used a [tag] to register the lazy Instance. + bool isPrepared({String? tag}) { + final newKey = _getKey(S, tag); + + final builder = _getDependency(tag: tag, key: newKey); + if (builder == null) { + return false; + } + + if (!builder.isInit) { + return true; + } + return false; + } +} + +typedef InstanceBuilderCallback = S Function(); + +typedef InjectorBuilderCallback = S Function(GetInstance); + +typedef AsyncInstanceBuilderCallback = Future Function(); + +/// Internal class to register instances with `Get.put()`. +class _InstanceBuilderFactory { + /// Marks the Builder as a single instance. + /// For reusing [dependency] instead of [builderFunc] + bool? isSingleton; + + /// When fenix mode is avaliable, when a new instance is need + /// Instance manager will recreate a new instance of S + bool fenix; + + /// Stores the actual object instance when [isSingleton]=true. + S? dependency; + + /// Generates (and regenerates) the instance when [isSingleton]=false. + /// Usually used by factory methods + InstanceBuilderCallback builderFunc; + + /// Flag to persist the instance in memory, + /// without considering `Get.smartManagement` + bool permanent = false; + + bool isInit = false; + + _InstanceBuilderFactory? lateRemove; + + bool isDirty = false; + + String? tag; + + _InstanceBuilderFactory( + this.isSingleton, + this.builderFunc, + this.permanent, + this.isInit, + this.fenix, + this.tag, { + this.lateRemove, + }); + + void _showInitLog() { + if (tag == null) { + Get.log('Instance "$S" has been created'); + } else { + Get.log('Instance "$S" has been created with tag "$tag"'); + } + } + + /// Gets the actual instance by it's [builderFunc] or the persisted instance. + S getDependency() { + if (isSingleton!) { + if (dependency == null) { + _showInitLog(); + dependency = builderFunc(); + } + return dependency!; + } else { + return builderFunc(); + } + } +} diff --git a/siro_rider/packages/get/lib/get_instance/src/lifecycle.dart b/siro_rider/packages/get/lib/get_instance/src/lifecycle.dart new file mode 100644 index 0000000..c3210fb --- /dev/null +++ b/siro_rider/packages/get/lib/get_instance/src/lifecycle.dart @@ -0,0 +1,104 @@ +import '../../get_core/get_core.dart'; + +/// Special callable class to keep the contract of a regular method, and avoid +/// overrides if you extend the class that uses it, as Dart has no final +/// methods. +/// Used in `DisposableInterface` to avoid the danger of overriding onStart. +class InternalFinalCallback { + ValueUpdater? _callback; + + InternalFinalCallback({ValueUpdater? callback}) : _callback = callback; + + T call() => _callback!.call(); +} + +/// The [GetLifeCycle] +/// +/// ```dart +/// class SomeController with GetLifeCycle { +/// SomeController() { +/// configureLifeCycle(); +/// } +/// } +/// ``` +mixin GetLifeCycleBase { + /// Called at the exact moment the widget is allocated in memory. + /// It uses an internal "callable" type, to avoid any @overrides in subclases. + /// This method should be internal and is required to define the + /// lifetime cycle of the subclass. + final onStart = InternalFinalCallback(); + + // /// The `configureLifeCycle` works as a constructor for the [GetLifeCycle] + // /// + // /// This method must be invoked in the constructor of the implementation + // void configureLifeCycle() { + // if (_initialized) return; + // } + + /// Internal callback that starts the cycle of this controller. + final onDelete = InternalFinalCallback(); + + /// Called immediately after the widget is allocated in memory. + /// You might use this to initialize something for the controller. + void onInit() {} + + /// Called 1 frame after onInit(). It is the perfect place to enter + /// navigation events, like snackbar, dialogs, or a new route, or + /// async request. + void onReady() {} + + /// Called before [onDelete] method. [onClose] might be used to + /// dispose resources used by the controller. Like closing events, + /// or streams before the controller is destroyed. + /// Or dispose objects that can potentially create some memory leaks, + /// like TextEditingControllers, AnimationControllers. + /// Might be useful as well to persist some data on disk. + void onClose() {} + + bool _initialized = false; + + /// Checks whether the controller has already been initialized. + bool get initialized => _initialized; + + // Internal callback that starts the cycle of this controller. + void _onStart() { + if (_initialized) return; + onInit(); + _initialized = true; + } + + bool _isClosed = false; + + /// Checks whether the controller has already been closed. + bool get isClosed => _isClosed; + + // Internal callback that starts the cycle of this controller. + void _onDelete() { + if (_isClosed) return; + _isClosed = true; + onClose(); + } + + void $configureLifeCycle() { + _checkIfAlreadyConfigured(); + onStart._callback = _onStart; + onDelete._callback = _onDelete; + } + + void _checkIfAlreadyConfigured() { + if (_initialized) { + throw """You can only call configureLifeCycle once. +The proper place to insert it is in your class's constructor +that inherits GetLifeCycle."""; + } + } +} + +abstract class GetLifeCycle with GetLifeCycleBase { + GetLifeCycle() { + $configureLifeCycle(); + } +} + +/// Allow track difference between GetxServices and GetxControllers +mixin GetxServiceMixin {} diff --git a/siro_rider/packages/get/lib/get_navigation/get_navigation.dart b/siro_rider/packages/get/lib/get_navigation/get_navigation.dart new file mode 100644 index 0000000..0cb2a3b --- /dev/null +++ b/siro_rider/packages/get/lib/get_navigation/get_navigation.dart @@ -0,0 +1,20 @@ +library get_navigation; + +export 'src/bottomsheet/bottomsheet.dart'; +export 'src/extension_navigation.dart'; +export 'src/nav2/get_information_parser.dart'; +export 'src/nav2/get_nav_config.dart'; +export 'src/nav2/get_router_delegate.dart'; +export 'src/nav2/router_outlet.dart'; +export 'src/root/get_cupertino_app.dart'; +export 'src/root/get_material_app.dart'; +export 'src/root/internacionalization.dart'; +export 'src/root/root_controller.dart'; +export 'src/routes/custom_transition.dart'; +export 'src/routes/default_route.dart'; +export 'src/routes/get_route.dart'; +export 'src/routes/observers/route_observer.dart'; +export 'src/routes/route_middleware.dart'; +export 'src/routes/transitions_type.dart'; +export 'src/snackbar/snackbar.dart'; +export 'src/snackbar/snackbar_controller.dart'; diff --git a/siro_rider/packages/get/lib/get_navigation/src/bottomsheet/bottomsheet.dart b/siro_rider/packages/get/lib/get_navigation/src/bottomsheet/bottomsheet.dart new file mode 100644 index 0000000..a6bbc2d --- /dev/null +++ b/siro_rider/packages/get/lib/get_navigation/src/bottomsheet/bottomsheet.dart @@ -0,0 +1,335 @@ +import 'package:flutter/material.dart'; + +import '../../../get.dart'; +import '../router_report.dart'; + +class GetModalBottomSheetRoute extends PopupRoute { + GetModalBottomSheetRoute({ + this.builder, + this.theme, + this.barrierLabel, + this.backgroundColor, + this.isPersistent, + this.elevation, + this.shape, + this.removeTop = true, + this.clipBehavior, + this.modalBarrierColor, + this.isDismissible = true, + this.enableDrag = true, + required this.isScrollControlled, + RouteSettings? settings, + this.enterBottomSheetDuration = const Duration(milliseconds: 250), + this.exitBottomSheetDuration = const Duration(milliseconds: 200), + }) : super(settings: settings) { + RouterReportManager.reportCurrentRoute(this); + } + final bool? isPersistent; + final WidgetBuilder? builder; + final ThemeData? theme; + final bool isScrollControlled; + final Color? backgroundColor; + final double? elevation; + final ShapeBorder? shape; + final Clip? clipBehavior; + final Color? modalBarrierColor; + final bool isDismissible; + final bool enableDrag; + // final String name; + final Duration enterBottomSheetDuration; + final Duration exitBottomSheetDuration; + // remove safearea from top + final bool removeTop; + + @override + Duration get transitionDuration => const Duration(milliseconds: 700); + + @override + bool get barrierDismissible => isDismissible; + + @override + final String? barrierLabel; + + @override + Color get barrierColor => modalBarrierColor ?? Colors.black54; + + AnimationController? _animationController; + + @override + void dispose() { + RouterReportManager.reportRouteDispose(this); + super.dispose(); + } + + @override + AnimationController createAnimationController() { + assert(_animationController == null); + _animationController = + BottomSheet.createAnimationController(navigator!.overlay!); + _animationController!.duration = enterBottomSheetDuration; + _animationController!.reverseDuration = exitBottomSheetDuration; + return _animationController!; + } + + @override + Widget buildPage(BuildContext context, Animation animation, + Animation secondaryAnimation) { + final sheetTheme = + theme?.bottomSheetTheme ?? Theme.of(context).bottomSheetTheme; + // By definition, the bottom sheet is aligned to the bottom of the page + // and isn't exposed to the top padding of the MediaQuery. + Widget bottomSheet = MediaQuery.removePadding( + context: context, + removeTop: removeTop, + child: Padding( + padding: + EdgeInsets.only(bottom: MediaQuery.of(context).viewInsets.bottom), + child: _GetModalBottomSheet( + route: this, + backgroundColor: backgroundColor ?? + sheetTheme.modalBackgroundColor ?? + sheetTheme.backgroundColor, + elevation: + elevation ?? sheetTheme.modalElevation ?? sheetTheme.elevation, + shape: shape, + clipBehavior: clipBehavior, + isScrollControlled: isScrollControlled, + enableDrag: enableDrag, + ), + ), + ); + if (theme != null) bottomSheet = Theme(data: theme!, child: bottomSheet); + return bottomSheet; + } +} + +class _GetModalBottomSheet extends StatefulWidget { + const _GetModalBottomSheet({ + Key? key, + this.route, + this.backgroundColor, + this.elevation, + this.shape, + this.clipBehavior, + this.isScrollControlled = false, + this.enableDrag = true, + this.isPersistent = false, + }) : super(key: key); + final bool isPersistent; + final GetModalBottomSheetRoute? route; + final bool isScrollControlled; + final Color? backgroundColor; + final double? elevation; + final ShapeBorder? shape; + final Clip? clipBehavior; + final bool enableDrag; + + @override + _GetModalBottomSheetState createState() => _GetModalBottomSheetState(); +} + +class _GetModalBottomSheetState extends State<_GetModalBottomSheet> { + String _getRouteLabel(MaterialLocalizations localizations) { + if ((Theme.of(context).platform == TargetPlatform.android) || + (Theme.of(context).platform == TargetPlatform.fuchsia)) { + return localizations.dialogLabel; + } else { + return ''; + } + } + + @override + Widget build(BuildContext context) { + assert(debugCheckHasMediaQuery(context)); + assert(debugCheckHasMaterialLocalizations(context)); + final mediaQuery = MediaQuery.of(context); + final localizations = MaterialLocalizations.of(context); + final routeLabel = _getRouteLabel(localizations); + + return AnimatedBuilder( + animation: widget.route!.animation!, + builder: (context, child) { + // Disable the initial animation when accessible navigation is on so + // that the semantics are added to the tree at the correct time. + final animationValue = mediaQuery.accessibleNavigation + ? 1.0 + : widget.route!.animation!.value; + return Semantics( + scopesRoute: true, + namesRoute: true, + label: routeLabel, + explicitChildNodes: true, + child: ClipRect( + child: CustomSingleChildLayout( + delegate: _GetModalBottomSheetLayout( + animationValue, widget.isScrollControlled), + child: widget.isPersistent == false + ? BottomSheet( + animationController: widget.route!._animationController, + onClosing: () { + if (widget.route!.isCurrent) { + Navigator.pop(context); + } + }, + builder: widget.route!.builder!, + backgroundColor: widget.backgroundColor, + elevation: widget.elevation, + shape: widget.shape, + clipBehavior: widget.clipBehavior, + enableDrag: widget.enableDrag, + ) + : Scaffold( + bottomSheet: BottomSheet( + animationController: + widget.route!._animationController, + onClosing: () { + // if (widget.route.isCurrent) { + // Navigator.pop(context); + // } + }, + builder: widget.route!.builder!, + backgroundColor: widget.backgroundColor, + elevation: widget.elevation, + shape: widget.shape, + clipBehavior: widget.clipBehavior, + enableDrag: widget.enableDrag, + ), + )), + ), + ); + }, + ); + } +} + +class _GetPerModalBottomSheet extends StatefulWidget { + const _GetPerModalBottomSheet({ + Key? key, + this.route, + this.isPersistent, + this.backgroundColor, + this.elevation, + this.shape, + this.clipBehavior, + this.isScrollControlled = false, + this.enableDrag = true, + }) : super(key: key); + final bool? isPersistent; + final GetModalBottomSheetRoute? route; + final bool isScrollControlled; + final Color? backgroundColor; + final double? elevation; + final ShapeBorder? shape; + final Clip? clipBehavior; + final bool enableDrag; + + @override + // ignore: lines_longer_than_80_chars + _GetPerModalBottomSheetState createState() => + _GetPerModalBottomSheetState(); +} + +// ignore: lines_longer_than_80_chars +class _GetPerModalBottomSheetState + extends State<_GetPerModalBottomSheet> { + String _getRouteLabel(MaterialLocalizations localizations) { + if ((Theme.of(context).platform == TargetPlatform.android) || + (Theme.of(context).platform == TargetPlatform.fuchsia)) { + return localizations.dialogLabel; + } else { + return ''; + } + } + + @override + Widget build(BuildContext context) { + assert(debugCheckHasMediaQuery(context)); + assert(debugCheckHasMaterialLocalizations(context)); + final mediaQuery = MediaQuery.of(context); + final localizations = MaterialLocalizations.of(context); + final routeLabel = _getRouteLabel(localizations); + + return AnimatedBuilder( + animation: widget.route!.animation!, + builder: (context, child) { + // Disable the initial animation when accessible navigation is on so + // that the semantics are added to the tree at the correct time. + final animationValue = mediaQuery.accessibleNavigation + ? 1.0 + : widget.route!.animation!.value; + return Semantics( + scopesRoute: true, + namesRoute: true, + label: routeLabel, + explicitChildNodes: true, + child: ClipRect( + child: CustomSingleChildLayout( + delegate: _GetModalBottomSheetLayout( + animationValue, widget.isScrollControlled), + child: widget.isPersistent == false + ? BottomSheet( + animationController: widget.route!._animationController, + onClosing: () { + if (widget.route!.isCurrent) { + Navigator.pop(context); + } + }, + builder: widget.route!.builder!, + backgroundColor: widget.backgroundColor, + elevation: widget.elevation, + shape: widget.shape, + clipBehavior: widget.clipBehavior, + enableDrag: widget.enableDrag, + ) + : Scaffold( + bottomSheet: BottomSheet( + animationController: + widget.route!._animationController, + onClosing: () { + // if (widget.route.isCurrent) { + // Navigator.pop(context); + // } + }, + builder: widget.route!.builder!, + backgroundColor: widget.backgroundColor, + elevation: widget.elevation, + shape: widget.shape, + clipBehavior: widget.clipBehavior, + enableDrag: widget.enableDrag, + ), + )), + ), + ); + }, + ); + } +} + +class _GetModalBottomSheetLayout extends SingleChildLayoutDelegate { + _GetModalBottomSheetLayout(this.progress, this.isScrollControlled); + + final double progress; + final bool isScrollControlled; + + @override + BoxConstraints getConstraintsForChild(BoxConstraints constraints) { + return BoxConstraints( + minWidth: constraints.maxWidth, + maxWidth: constraints.maxWidth, + minHeight: 0.0, + maxHeight: isScrollControlled + ? constraints.maxHeight + : constraints.maxHeight * 9.0 / 16.0, + ); + } + + @override + Offset getPositionForChild(Size size, Size childSize) { + return Offset(0.0, size.height - childSize.height * progress); + } + + @override + bool shouldRelayout(_GetModalBottomSheetLayout oldDelegate) { + return progress != oldDelegate.progress; + } +} diff --git a/siro_rider/packages/get/lib/get_navigation/src/dialog/dialog_route.dart b/siro_rider/packages/get/lib/get_navigation/src/dialog/dialog_route.dart new file mode 100644 index 0000000..f0c6d01 --- /dev/null +++ b/siro_rider/packages/get/lib/get_navigation/src/dialog/dialog_route.dart @@ -0,0 +1,73 @@ +import 'package:flutter/widgets.dart'; + +import '../router_report.dart'; + +class GetDialogRoute extends PopupRoute { + GetDialogRoute({ + required RoutePageBuilder pageBuilder, + bool barrierDismissible = true, + String? barrierLabel, + Color barrierColor = const Color(0x80000000), + Duration transitionDuration = const Duration(milliseconds: 200), + RouteTransitionsBuilder? transitionBuilder, + RouteSettings? settings, + }) : widget = pageBuilder, + _barrierDismissible = barrierDismissible, + _barrierLabel = barrierLabel, + _barrierColor = barrierColor, + _transitionDuration = transitionDuration, + _transitionBuilder = transitionBuilder, + super(settings: settings) { + RouterReportManager.reportCurrentRoute(this); + } + + final RoutePageBuilder widget; + + @override + bool get barrierDismissible => _barrierDismissible; + final bool _barrierDismissible; + + @override + void dispose() { + RouterReportManager.reportRouteDispose(this); + super.dispose(); + } + + @override + String? get barrierLabel => _barrierLabel; + final String? _barrierLabel; + + @override + Color get barrierColor => _barrierColor; + final Color _barrierColor; + + @override + Duration get transitionDuration => _transitionDuration; + final Duration _transitionDuration; + + final RouteTransitionsBuilder? _transitionBuilder; + + @override + Widget buildPage(BuildContext context, Animation animation, + Animation secondaryAnimation) { + return Semantics( + scopesRoute: true, + explicitChildNodes: true, + child: widget(context, animation, secondaryAnimation), + ); + } + + @override + Widget buildTransitions(BuildContext context, Animation animation, + Animation secondaryAnimation, Widget child) { + if (_transitionBuilder == null) { + return FadeTransition( + opacity: CurvedAnimation( + parent: animation, + curve: Curves.linear, + ), + child: child); + } // Some default transition + return _transitionBuilder!(context, animation, secondaryAnimation, child); + } +} diff --git a/siro_rider/packages/get/lib/get_navigation/src/extension_navigation.dart b/siro_rider/packages/get/lib/get_navigation/src/extension_navigation.dart new file mode 100644 index 0000000..ac31d87 --- /dev/null +++ b/siro_rider/packages/get/lib/get_navigation/src/extension_navigation.dart @@ -0,0 +1,1372 @@ +import 'dart:ui' as ui; + +import 'package:flutter/material.dart'; +import 'package:flutter/scheduler.dart'; + +import '../../get_core/get_core.dart'; +import '../../get_instance/src/bindings_interface.dart'; +import '../../get_utils/get_utils.dart'; +import '../get_navigation.dart'; +import 'dialog/dialog_route.dart'; +import 'root/parse_route.dart'; + +/// It replaces the Flutter Navigator, but needs no context. +/// You can to use navigator.push(YourRoute()) rather +/// Navigator.push(context, YourRoute()); +NavigatorState? get navigator => GetNavigation(Get).key.currentState; + +extension ExtensionBottomSheet on GetInterface { + Future bottomSheet( + Widget bottomsheet, { + Color? backgroundColor, + double? elevation, + bool persistent = true, + ShapeBorder? shape, + Clip? clipBehavior, + Color? barrierColor, + bool? ignoreSafeArea, + bool isScrollControlled = false, + bool useRootNavigator = false, + bool isDismissible = true, + bool enableDrag = true, + RouteSettings? settings, + Duration? enterBottomSheetDuration, + Duration? exitBottomSheetDuration, + }) { + return Navigator.of(overlayContext!, rootNavigator: useRootNavigator) + .push(GetModalBottomSheetRoute( + builder: (_) => bottomsheet, + isPersistent: persistent, + // theme: Theme.of(key.currentContext, shadowThemeOnly: true), + theme: Theme.of(key.currentContext!), + isScrollControlled: isScrollControlled, + + barrierLabel: MaterialLocalizations.of(key.currentContext!) + .modalBarrierDismissLabel, + + backgroundColor: backgroundColor ?? Colors.transparent, + elevation: elevation, + shape: shape, + removeTop: ignoreSafeArea ?? true, + clipBehavior: clipBehavior, + isDismissible: isDismissible, + modalBarrierColor: barrierColor, + settings: settings, + enableDrag: enableDrag, + enterBottomSheetDuration: + enterBottomSheetDuration ?? const Duration(milliseconds: 250), + exitBottomSheetDuration: + exitBottomSheetDuration ?? const Duration(milliseconds: 200), + )); + } +} + +extension ExtensionDialog on GetInterface { + /// Show a dialog. + /// You can pass a [transitionDuration] and/or [transitionCurve], + /// overriding the defaults when the dialog shows up and closes. + /// When the dialog closes, uses those animations in reverse. + Future dialog( + Widget widget, { + bool barrierDismissible = true, + Color? barrierColor, + bool useSafeArea = true, + GlobalKey? navigatorKey, + Object? arguments, + Duration? transitionDuration, + Curve? transitionCurve, + String? name, + RouteSettings? routeSettings, + }) { + assert(debugCheckHasMaterialLocalizations(context!)); + + // final theme = Theme.of(context, shadowThemeOnly: true); + final theme = Theme.of(context!); + return generalDialog( + pageBuilder: (buildContext, animation, secondaryAnimation) { + final pageChild = widget; + Widget dialog = Builder(builder: (context) { + return Theme(data: theme, child: pageChild); + }); + if (useSafeArea) { + dialog = SafeArea(child: dialog); + } + return dialog; + }, + barrierDismissible: barrierDismissible, + barrierLabel: MaterialLocalizations.of(context!).modalBarrierDismissLabel, + barrierColor: barrierColor ?? Colors.black54, + transitionDuration: transitionDuration ?? defaultDialogTransitionDuration, + transitionBuilder: (context, animation, secondaryAnimation, child) { + return FadeTransition( + opacity: CurvedAnimation( + parent: animation, + curve: transitionCurve ?? defaultDialogTransitionCurve, + ), + child: child, + ); + }, + navigatorKey: navigatorKey, + routeSettings: + routeSettings ?? RouteSettings(arguments: arguments, name: name), + ); + } + + /// Api from showGeneralDialog with no context + Future generalDialog({ + required RoutePageBuilder pageBuilder, + bool barrierDismissible = false, + String? barrierLabel, + Color barrierColor = const Color(0x80000000), + Duration transitionDuration = const Duration(milliseconds: 200), + RouteTransitionsBuilder? transitionBuilder, + GlobalKey? navigatorKey, + RouteSettings? routeSettings, + }) { + assert(!barrierDismissible || barrierLabel != null); + final nav = navigatorKey?.currentState ?? + Navigator.of(overlayContext!, + rootNavigator: + true); //overlay context will always return the root navigator + return nav.push( + GetDialogRoute( + pageBuilder: pageBuilder, + barrierDismissible: barrierDismissible, + barrierLabel: barrierLabel, + barrierColor: barrierColor, + transitionDuration: transitionDuration, + transitionBuilder: transitionBuilder, + settings: routeSettings, + ), + ); + } + + /// Custom UI Dialog. + Future defaultDialog({ + String title = "Alert", + EdgeInsetsGeometry? titlePadding, + TextStyle? titleStyle, + Widget? content, + EdgeInsetsGeometry? contentPadding, + VoidCallback? onConfirm, + VoidCallback? onCancel, + VoidCallback? onCustom, + Color? cancelTextColor, + Color? confirmTextColor, + String? textConfirm, + String? textCancel, + String? textCustom, + Widget? confirm, + Widget? cancel, + Widget? custom, + Color? backgroundColor, + bool barrierDismissible = true, + Color? buttonColor, + String middleText = "Dialog made in 3 lines of code", + TextStyle? middleTextStyle, + double radius = 20.0, + // ThemeData themeData, + List? actions, + + // onWillPop Scope + WillPopCallback? onWillPop, + + // the navigator used to push the dialog + GlobalKey? navigatorKey, + }) { + var leanCancel = onCancel != null || textCancel != null; + var leanConfirm = onConfirm != null || textConfirm != null; + actions ??= []; + + if (cancel != null) { + actions.add(cancel); + } else { + if (leanCancel) { + actions.add(TextButton( + style: TextButton.styleFrom( + tapTargetSize: MaterialTapTargetSize.shrinkWrap, + padding: const EdgeInsets.symmetric(horizontal: 10, vertical: 8), + shape: RoundedRectangleBorder( + side: BorderSide( + color: buttonColor ?? theme.colorScheme.secondary, + width: 2, + style: BorderStyle.solid), + borderRadius: BorderRadius.circular(100)), + ), + onPressed: () { + onCancel?.call(); + back(); + }, + child: Text( + textCancel ?? "Cancel", + style: TextStyle( + color: cancelTextColor ?? theme.colorScheme.secondary), + ), + )); + } + } + if (confirm != null) { + actions.add(confirm); + } else { + if (leanConfirm) { + actions.add(TextButton( + style: TextButton.styleFrom( + tapTargetSize: MaterialTapTargetSize.shrinkWrap, + backgroundColor: buttonColor ?? theme.colorScheme.secondary, + shape: RoundedRectangleBorder( + borderRadius: BorderRadius.circular(100)), + ), + child: Text( + textConfirm ?? "Ok", + style: TextStyle( + color: confirmTextColor ?? theme.colorScheme.onPrimary), + ), + onPressed: () { + onConfirm?.call(); + })); + } + } + + Widget baseAlertDialog = AlertDialog( + titlePadding: titlePadding ?? const EdgeInsets.all(8), + contentPadding: contentPadding ?? const EdgeInsets.all(8), + + backgroundColor: backgroundColor ?? theme.dialogBackgroundColor, + shape: RoundedRectangleBorder( + borderRadius: BorderRadius.all(Radius.circular(radius))), + title: Text(title, textAlign: TextAlign.center, style: titleStyle), + content: Column( + crossAxisAlignment: CrossAxisAlignment.center, + mainAxisSize: MainAxisSize.min, + children: [ + content ?? + Text(middleText, + textAlign: TextAlign.center, style: middleTextStyle), + const SizedBox(height: 16), + ButtonTheme( + minWidth: 78.0, + height: 34.0, + child: Wrap( + alignment: WrapAlignment.center, + spacing: 8, + runSpacing: 8, + children: actions, + ), + ) + ], + ), + // actions: actions, // ?? [cancelButton, confirmButton], + buttonPadding: EdgeInsets.zero, + ); + + return dialog( + onWillPop != null + ? WillPopScope( + onWillPop: onWillPop, + child: baseAlertDialog, + ) + : baseAlertDialog, + barrierDismissible: barrierDismissible, + navigatorKey: navigatorKey, + ); + } +} + +extension ExtensionSnackbar on GetInterface { + SnackbarController rawSnackbar({ + String? title, + String? message, + Widget? titleText, + Widget? messageText, + Widget? icon, + bool instantInit = true, + bool shouldIconPulse = true, + double? maxWidth, + EdgeInsets margin = const EdgeInsets.all(0.0), + EdgeInsets padding = const EdgeInsets.all(16), + double borderRadius = 0.0, + Color? borderColor, + double borderWidth = 1.0, + Color backgroundColor = const Color(0xFF303030), + Color? leftBarIndicatorColor, + List? boxShadows, + Gradient? backgroundGradient, + Widget? mainButton, + OnTap? onTap, + Duration? duration = const Duration(seconds: 3), + bool isDismissible = true, + DismissDirection? dismissDirection, + bool showProgressIndicator = false, + AnimationController? progressIndicatorController, + Color? progressIndicatorBackgroundColor, + Animation? progressIndicatorValueColor, + SnackPosition snackPosition = SnackPosition.BOTTOM, + SnackStyle snackStyle = SnackStyle.FLOATING, + Curve forwardAnimationCurve = Curves.easeOutCirc, + Curve reverseAnimationCurve = Curves.easeOutCirc, + Duration animationDuration = const Duration(seconds: 1), + SnackbarStatusCallback? snackbarStatus, + double barBlur = 0.0, + double overlayBlur = 0.0, + Color? overlayColor, + Form? userInputForm, + }) { + final getSnackBar = GetSnackBar( + snackbarStatus: snackbarStatus, + title: title, + message: message, + titleText: titleText, + messageText: messageText, + snackPosition: snackPosition, + borderRadius: borderRadius, + margin: margin, + duration: duration, + barBlur: barBlur, + backgroundColor: backgroundColor, + icon: icon, + shouldIconPulse: shouldIconPulse, + maxWidth: maxWidth, + padding: padding, + borderColor: borderColor, + borderWidth: borderWidth, + leftBarIndicatorColor: leftBarIndicatorColor, + boxShadows: boxShadows, + backgroundGradient: backgroundGradient, + mainButton: mainButton, + onTap: onTap, + isDismissible: isDismissible, + dismissDirection: dismissDirection, + showProgressIndicator: showProgressIndicator, + progressIndicatorController: progressIndicatorController, + progressIndicatorBackgroundColor: progressIndicatorBackgroundColor, + progressIndicatorValueColor: progressIndicatorValueColor, + snackStyle: snackStyle, + forwardAnimationCurve: forwardAnimationCurve, + reverseAnimationCurve: reverseAnimationCurve, + animationDuration: animationDuration, + overlayBlur: overlayBlur, + overlayColor: overlayColor, + userInputForm: userInputForm, + ); + + final controller = SnackbarController(getSnackBar); + + if (instantInit) { + controller.show(); + } else { + ambiguate(SchedulerBinding.instance)?.addPostFrameCallback((_) { + controller.show(); + }); + } + return controller; + } + + SnackbarController showSnackbar(GetSnackBar snackbar) { + final controller = SnackbarController(snackbar); + controller.show(); + return controller; + } + + SnackbarController snackbar( + String title, + String message, { + Color? colorText, + Duration? duration = const Duration(seconds: 3), + + /// with instantInit = false you can put snackbar on initState + bool instantInit = true, + SnackPosition? snackPosition, + Widget? titleText, + Widget? messageText, + Widget? icon, + bool? shouldIconPulse, + double? maxWidth, + EdgeInsets? margin, + EdgeInsets? padding, + double? borderRadius, + Color? borderColor, + double? borderWidth, + Color? backgroundColor, + Color? leftBarIndicatorColor, + List? boxShadows, + Gradient? backgroundGradient, + TextButton? mainButton, + OnTap? onTap, + bool? isDismissible, + bool? showProgressIndicator, + DismissDirection? dismissDirection, + AnimationController? progressIndicatorController, + Color? progressIndicatorBackgroundColor, + Animation? progressIndicatorValueColor, + SnackStyle? snackStyle, + Curve? forwardAnimationCurve, + Curve? reverseAnimationCurve, + Duration? animationDuration, + double? barBlur, + double? overlayBlur, + SnackbarStatusCallback? snackbarStatus, + Color? overlayColor, + Form? userInputForm, + }) { + final getSnackBar = GetSnackBar( + snackbarStatus: snackbarStatus, + titleText: titleText ?? + Text( + title, + style: TextStyle( + color: colorText ?? iconColor ?? Colors.black, + fontWeight: FontWeight.w800, + fontSize: 16, + ), + ), + messageText: messageText ?? + Text( + message, + style: TextStyle( + color: colorText ?? iconColor ?? Colors.black, + fontWeight: FontWeight.w300, + fontSize: 14, + ), + ), + snackPosition: snackPosition ?? SnackPosition.TOP, + borderRadius: borderRadius ?? 15, + margin: margin ?? const EdgeInsets.symmetric(horizontal: 10), + duration: duration, + barBlur: barBlur ?? 7.0, + backgroundColor: backgroundColor ?? Colors.grey.withOpacity(0.2), + icon: icon, + shouldIconPulse: shouldIconPulse ?? true, + maxWidth: maxWidth, + padding: padding ?? const EdgeInsets.all(16), + borderColor: borderColor, + borderWidth: borderWidth, + leftBarIndicatorColor: leftBarIndicatorColor, + boxShadows: boxShadows, + backgroundGradient: backgroundGradient, + mainButton: mainButton, + onTap: onTap, + isDismissible: isDismissible ?? true, + dismissDirection: dismissDirection, + showProgressIndicator: showProgressIndicator ?? false, + progressIndicatorController: progressIndicatorController, + progressIndicatorBackgroundColor: progressIndicatorBackgroundColor, + progressIndicatorValueColor: progressIndicatorValueColor, + snackStyle: snackStyle ?? SnackStyle.FLOATING, + forwardAnimationCurve: forwardAnimationCurve ?? Curves.easeOutCirc, + reverseAnimationCurve: reverseAnimationCurve ?? Curves.easeOutCirc, + animationDuration: animationDuration ?? const Duration(seconds: 1), + overlayBlur: overlayBlur ?? 0.0, + overlayColor: overlayColor ?? Colors.transparent, + userInputForm: userInputForm); + + final controller = SnackbarController(getSnackBar); + + if (instantInit) { + controller.show(); + } else { + //routing.isSnackbar = true; + ambiguate(SchedulerBinding.instance)?.addPostFrameCallback((_) { + controller.show(); + }); + } + return controller; + } +} + +extension GetNavigation on GetInterface { + /// **Navigation.push()** shortcut.

+ /// + /// Pushes a new `page` to the stack + /// + /// It has the advantage of not needing context, + /// so you can call from your business logic + /// + /// You can set a custom [transition], and a transition [duration]. + /// + /// You can send any type of value to the other route in the [arguments]. + /// + /// Just like native routing in Flutter, you can push a route + /// as a [fullscreenDialog], + /// + /// [id] is for when you are using nested navigation, + /// as explained in documentation + /// + /// If you want the same behavior of ios that pops a route when the user drag, + /// you can set [popGesture] to true + /// + /// If you're using the [Bindings] api, you must define it here + /// + /// By default, GetX will prevent you from push a route that you already in, + /// if you want to push anyway, set [preventDuplicates] to false + Future? to( + dynamic page, { + bool? opaque, + Transition? transition, + Curve? curve, + Duration? duration, + int? id, + String? routeName, + bool fullscreenDialog = false, + dynamic arguments, + Bindings? binding, + bool preventDuplicates = true, + bool? popGesture, + double Function(BuildContext context)? gestureWidth, + }) { + // var routeName = "/${page.runtimeType}"; + routeName ??= "/${page.runtimeType}"; + routeName = _cleanRouteName(routeName); + if (preventDuplicates && routeName == currentRoute) { + return null; + } + return global(id).currentState?.push( + GetPageRoute( + opaque: opaque ?? true, + page: _resolvePage(page, 'to'), + routeName: routeName, + gestureWidth: gestureWidth, + settings: RouteSettings( + name: routeName, + arguments: arguments, + ), + popGesture: popGesture ?? defaultPopGesture, + transition: transition ?? defaultTransition, + curve: curve ?? defaultTransitionCurve, + fullscreenDialog: fullscreenDialog, + binding: binding, + transitionDuration: duration ?? defaultTransitionDuration, + ), + ); + } + + GetPageBuilder _resolvePage(dynamic page, String method) { + if (page is GetPageBuilder) { + return page; + } else if (page is Widget) { + Get.log( + '''WARNING, consider using: "Get.$method(() => Page())" instead of "Get.$method(Page())". +Using a widget function instead of a widget fully guarantees that the widget and its controllers will be removed from memory when they are no longer used. + '''); + return () => page; + } else if (page is String) { + throw '''Unexpected String, +use toNamed() instead'''; + } else { + throw '''Unexpected format, +you can only use widgets and widget functions here'''; + } + } + + /// **Navigation.pushNamed()** shortcut.

+ /// + /// Pushes a new named `page` to the stack. + /// + /// It has the advantage of not needing context, so you can call + /// from your business logic. + /// + /// You can send any type of value to the other route in the [arguments]. + /// + /// [id] is for when you are using nested navigation, + /// as explained in documentation + /// + /// By default, GetX will prevent you from push a route that you already in, + /// if you want to push anyway, set [preventDuplicates] to false + /// + /// Note: Always put a slash on the route ('/page1'), to avoid unnexpected errors + Future? toNamed( + String page, { + dynamic arguments, + int? id, + bool preventDuplicates = true, + Map? parameters, + }) { + if (preventDuplicates && page == currentRoute) { + return null; + } + + if (parameters != null) { + final uri = Uri(path: page, queryParameters: parameters); + page = uri.toString(); + } + + return global(id).currentState?.pushNamed( + page, + arguments: arguments, + ); + } + + /// **Navigation.pushReplacementNamed()** shortcut.

+ /// + /// Pop the current named `page` in the stack and push a new one in its place + /// + /// It has the advantage of not needing context, so you can call + /// from your business logic. + /// + /// You can send any type of value to the other route in the [arguments]. + /// + /// [id] is for when you are using nested navigation, + /// as explained in documentation + /// + /// By default, GetX will prevent you from push a route that you already in, + /// if you want to push anyway, set [preventDuplicates] to false + /// + /// Note: Always put a slash on the route ('/page1'), to avoid unnexpected errors + Future? offNamed( + String page, { + dynamic arguments, + int? id, + bool preventDuplicates = true, + Map? parameters, + }) { + if (preventDuplicates && page == currentRoute) { + return null; + } + + if (parameters != null) { + final uri = Uri(path: page, queryParameters: parameters); + page = uri.toString(); + } + return global(id).currentState?.pushReplacementNamed( + page, + arguments: arguments, + ); + } + + /// **Navigation.popUntil()** shortcut.

+ /// + /// Calls pop several times in the stack until [predicate] returns true + /// + /// [id] is for when you are using nested navigation, + /// as explained in documentation + /// + /// [predicate] can be used like this: + /// `Get.until((route) => Get.currentRoute == '/home')`so when you get to home page, + /// + /// or also like this: + /// `Get.until((route) => !Get.isDialogOpen())`, to make sure the + /// dialog is closed + void until(RoutePredicate predicate, {int? id}) { + // if (key.currentState.mounted) // add this if appear problems on future with route navigate + // when widget don't mounted + return global(id).currentState?.popUntil(predicate); + } + + /// **Navigation.pushAndRemoveUntil()** shortcut.

+ /// + /// Push the given `page`, and then pop several pages in the stack until + /// [predicate] returns true + /// + /// [id] is for when you are using nested navigation, + /// as explained in documentation + /// + /// Obs: unlike other get methods, this one you need to send a function + /// that returns the widget to the page argument, like this: + /// Get.offUntil(GetPageRoute(page: () => HomePage()), predicate) + /// + /// [predicate] can be used like this: + /// `Get.offUntil(page, (route) => (route as GetPageRoute).routeName == '/home')` + /// to pop routes in stack until home, + /// or also like this: + /// `Get.until((route) => !Get.isDialogOpen())`, to make sure the dialog + /// is closed + Future? offUntil(Route page, RoutePredicate predicate, {int? id}) { + // if (key.currentState.mounted) // add this if appear problems on future with route navigate + // when widget don't mounted + return global(id).currentState?.pushAndRemoveUntil(page, predicate); + } + + /// **Navigation.pushNamedAndRemoveUntil()** shortcut.

+ /// + /// Push the given named `page`, and then pop several pages in the stack + /// until [predicate] returns true + /// + /// You can send any type of value to the other route in the [arguments]. + /// + /// [id] is for when you are using nested navigation, + /// as explained in documentation + /// + /// [predicate] can be used like this: + /// `Get.offNamedUntil(page, ModalRoute.withName('/home'))` + /// to pop routes in stack until home, + /// or like this: + /// `Get.offNamedUntil((route) => !Get.isDialogOpen())`, + /// to make sure the dialog is closed + /// + /// Note: Always put a slash on the route name ('/page1'), to avoid unexpected errors + Future? offNamedUntil( + String page, + RoutePredicate predicate, { + int? id, + dynamic arguments, + Map? parameters, + }) { + if (parameters != null) { + final uri = Uri(path: page, queryParameters: parameters); + page = uri.toString(); + } + + return global(id).currentState?.pushNamedAndRemoveUntil( + page, + predicate, + arguments: arguments, + ); + } + + /// **Navigation.popAndPushNamed()** shortcut.

+ /// + /// Pop the current named page and pushes a new `page` to the stack + /// in its place + /// + /// You can send any type of value to the other route in the [arguments]. + /// It is very similar to `offNamed()` but use a different approach + /// + /// The `offNamed()` pop a page, and goes to the next. The + /// `offAndToNamed()` goes to the next page, and removes the previous one. + /// The route transition animation is different. + Future? offAndToNamed( + String page, { + dynamic arguments, + int? id, + dynamic result, + Map? parameters, + }) { + if (parameters != null) { + final uri = Uri(path: page, queryParameters: parameters); + page = uri.toString(); + } + return global(id).currentState?.popAndPushNamed( + page, + arguments: arguments, + result: result, + ); + } + + /// **Navigation.removeRoute()** shortcut.

+ /// + /// Remove a specific [route] from the stack + /// + /// [id] is for when you are using nested navigation, + /// as explained in documentation + void removeRoute(Route route, {int? id}) { + return global(id).currentState?.removeRoute(route); + } + + /// **Navigation.pushNamedAndRemoveUntil()** shortcut.

+ /// + /// Push a named `page` and pop several pages in the stack + /// until [predicate] returns true. [predicate] is optional + /// + /// It has the advantage of not needing context, so you can + /// call from your business logic. + /// + /// You can send any type of value to the other route in the [arguments]. + /// + /// [predicate] can be used like this: + /// `Get.until((route) => Get.currentRoute == '/home')`so when you get to home page, + /// or also like + /// `Get.until((route) => !Get.isDialogOpen())`, to make sure the dialog + /// is closed + /// + /// [id] is for when you are using nested navigation, + /// as explained in documentation + /// + /// Note: Always put a slash on the route ('/page1'), to avoid unexpected errors + Future? offAllNamed( + String newRouteName, { + RoutePredicate? predicate, + dynamic arguments, + int? id, + Map? parameters, + }) { + if (parameters != null) { + final uri = Uri(path: newRouteName, queryParameters: parameters); + newRouteName = uri.toString(); + } + + return global(id).currentState?.pushNamedAndRemoveUntil( + newRouteName, + predicate ?? (_) => false, + arguments: arguments, + ); + } + + /// Returns true if a Snackbar, Dialog or BottomSheet is currently OPEN + bool get isOverlaysOpen => + (isSnackbarOpen || isDialogOpen! || isBottomSheetOpen!); + + /// Returns true if there is no Snackbar, Dialog or BottomSheet open + bool get isOverlaysClosed => + (!isSnackbarOpen && !isDialogOpen! && !isBottomSheetOpen!); + + /// **Navigation.popUntil()** shortcut.

+ /// + /// Pop the current page, snackbar, dialog or bottomsheet in the stack + /// + /// if your set [closeOverlays] to true, Get.back() will close the + /// currently open snackbar/dialog/bottomsheet AND the current page + /// + /// [id] is for when you are using nested navigation, + /// as explained in documentation + /// + /// It has the advantage of not needing context, so you can call + /// from your business logic. + void back({ + T? result, + bool closeOverlays = false, + bool canPop = true, + int? id, + }) { + //TODO: This code brings compatibility of the new snackbar with GetX 4, + // remove this code in version 5 + if (isSnackbarOpen && !closeOverlays) { + closeCurrentSnackbar(); + return; + } + + if (closeOverlays && isOverlaysOpen) { + //TODO: This code brings compatibility of the new snackbar with GetX 4, + // remove this code in version 5 + if (isSnackbarOpen) { + closeAllSnackbars(); + } + navigator?.popUntil((route) { + return (!isDialogOpen! && !isBottomSheetOpen!); + }); + } + if (canPop) { + if (global(id).currentState?.canPop() == true) { + global(id).currentState?.pop(result); + } + } else { + global(id).currentState?.pop(result); + } + } + + /// **Navigation.popUntil()** (with predicate) shortcut .

+ /// + /// Close as many routes as defined by [times] + /// + /// [id] is for when you are using nested navigation, + /// as explained in documentation + void close(int times, [int? id]) { + if (times < 1) { + times = 1; + } + var count = 0; + var back = global(id).currentState?.popUntil((route) => count++ == times); + + return back; + } + + /// **Navigation.pushReplacement()** shortcut .

+ /// + /// Pop the current page and pushes a new `page` to the stack + /// + /// It has the advantage of not needing context, + /// so you can call from your business logic + /// + /// You can set a custom [transition], define a Tween [curve], + /// and a transition [duration]. + /// + /// You can send any type of value to the other route in the [arguments]. + /// + /// Just like native routing in Flutter, you can push a route + /// as a [fullscreenDialog], + /// + /// [id] is for when you are using nested navigation, + /// as explained in documentation + /// + /// If you want the same behavior of ios that pops a route when the user drag, + /// you can set [popGesture] to true + /// + /// If you're using the [Bindings] api, you must define it here + /// + /// By default, GetX will prevent you from push a route that you already in, + /// if you want to push anyway, set [preventDuplicates] to false + Future? off( + dynamic page, { + bool opaque = false, + Transition? transition, + Curve? curve, + bool? popGesture, + int? id, + String? routeName, + dynamic arguments, + Bindings? binding, + bool fullscreenDialog = false, + bool preventDuplicates = true, + Duration? duration, + double Function(BuildContext context)? gestureWidth, + }) { + routeName ??= "/${page.runtimeType.toString()}"; + routeName = _cleanRouteName(routeName); + if (preventDuplicates && routeName == currentRoute) { + return null; + } + return global(id).currentState?.pushReplacement(GetPageRoute( + opaque: opaque, + gestureWidth: gestureWidth, + page: _resolvePage(page, 'off'), + binding: binding, + settings: RouteSettings( + arguments: arguments, + name: routeName, + ), + routeName: routeName, + fullscreenDialog: fullscreenDialog, + popGesture: popGesture ?? defaultPopGesture, + transition: transition ?? defaultTransition, + curve: curve ?? defaultTransitionCurve, + transitionDuration: duration ?? defaultTransitionDuration)); + } + + /// + /// Push a `page` and pop several pages in the stack + /// until [predicate] returns true. [predicate] is optional + /// + /// It has the advantage of not needing context, + /// so you can call from your business logic + /// + /// You can set a custom [transition], a [curve] and a transition [duration]. + /// + /// You can send any type of value to the other route in the [arguments]. + /// + /// Just like native routing in Flutter, you can push a route + /// as a [fullscreenDialog], + /// + /// [predicate] can be used like this: + /// `Get.until((route) => Get.currentRoute == '/home')`so when you get to home page, + /// or also like + /// `Get.until((route) => !Get.isDialogOpen())`, to make sure the dialog + /// is closed + /// + /// [id] is for when you are using nested navigation, + /// as explained in documentation + /// + /// If you want the same behavior of ios that pops a route when the user drag, + /// you can set [popGesture] to true + /// + /// If you're using the [Bindings] api, you must define it here + /// + /// By default, GetX will prevent you from push a route that you already in, + /// if you want to push anyway, set [preventDuplicates] to false + Future? offAll( + dynamic page, { + RoutePredicate? predicate, + bool opaque = false, + bool? popGesture, + int? id, + String? routeName, + dynamic arguments, + Bindings? binding, + bool fullscreenDialog = false, + Transition? transition, + Curve? curve, + Duration? duration, + double Function(BuildContext context)? gestureWidth, + }) { + routeName ??= "/${page.runtimeType.toString()}"; + routeName = _cleanRouteName(routeName); + return global(id).currentState?.pushAndRemoveUntil( + GetPageRoute( + opaque: opaque, + popGesture: popGesture ?? defaultPopGesture, + page: _resolvePage(page, 'offAll'), + binding: binding, + gestureWidth: gestureWidth, + settings: RouteSettings( + name: routeName, + arguments: arguments, + ), + fullscreenDialog: fullscreenDialog, + routeName: routeName, + transition: transition ?? defaultTransition, + curve: curve ?? defaultTransitionCurve, + transitionDuration: duration ?? defaultTransitionDuration, + ), + predicate ?? (route) => false); + } + + /// Takes a route [name] String generated by [to], [off], [offAll] + /// (and similar context navigation methods), cleans the extra chars and + /// accommodates the format. + /// TODO: check for a more "appealing" URL naming convention. + /// `() => MyHomeScreenView` becomes `/my-home-screen-view`. + String _cleanRouteName(String name) { + name = name.replaceAll('() => ', ''); + + /// uncommonent for URL styling. + // name = name.paramCase!; + if (!name.startsWith('/')) { + name = '/$name'; + } + return Uri.tryParse(name)?.toString() ?? name; + } + + /// change default config of Get + void config( + {bool? enableLog, + LogWriterCallback? logWriterCallback, + bool? defaultPopGesture, + bool? defaultOpaqueRoute, + Duration? defaultDurationTransition, + bool? defaultGlobalState, + Transition? defaultTransition}) { + if (enableLog != null) { + Get.isLogEnable = enableLog; + } + if (logWriterCallback != null) { + Get.log = logWriterCallback; + } + if (defaultPopGesture != null) { + _getxController.defaultPopGesture = defaultPopGesture; + } + if (defaultOpaqueRoute != null) { + _getxController.defaultOpaqueRoute = defaultOpaqueRoute; + } + if (defaultTransition != null) { + _getxController.defaultTransition = defaultTransition; + } + + if (defaultDurationTransition != null) { + _getxController.defaultTransitionDuration = defaultDurationTransition; + } + } + + Future updateLocale(Locale l) async { + Get.locale = l; + await forceAppUpdate(); + } + + /// As a rule, Flutter knows which widget to update, + /// so this command is rarely needed. We can mention situations + /// where you use const so that widgets are not updated with setState, + /// but you want it to be forcefully updated when an event like + /// language change happens. using context to make the widget dirty + /// for performRebuild() is a viable solution. + /// However, in situations where this is not possible, or at least, + /// is not desired by the developer, the only solution for updating + /// widgets that Flutter does not want to update is to use reassemble + /// to forcibly rebuild all widgets. Attention: calling this function will + /// reconstruct the application from the sketch, use this with caution. + /// Your entire application will be rebuilt, and touch events will not + /// work until the end of rendering. + Future forceAppUpdate() async { + await engine.performReassemble(); + } + + void appUpdate() => _getxController.update(); + + void changeTheme(ThemeData theme) { + _getxController.setTheme(theme); + } + + void changeThemeMode(ThemeMode themeMode) { + _getxController.setThemeMode(themeMode); + } + + GlobalKey? addKey(GlobalKey newKey) { + return _getxController.addKey(newKey); + } + + GlobalKey? nestedKey(dynamic key) { + keys.putIfAbsent( + key, + () => GlobalKey( + debugLabel: 'Getx nested key: ${key.toString()}', + ), + ); + return keys[key]; + } + + GlobalKey global(int? k) { + GlobalKey newKey; + if (k == null) { + newKey = key; + } else { + if (!keys.containsKey(k)) { + throw 'Route id ($k) not found'; + } + newKey = keys[k]!; + } + + if (newKey.currentContext == null && !testMode) { + throw """You are trying to use contextless navigation without + a GetMaterialApp or Get.key. + If you are testing your app, you can use: + [Get.testMode = true], or if you are running your app on + a physical device or emulator, you must exchange your [MaterialApp] + for a [GetMaterialApp]. + """; + } + + return newKey; + } + + /// give current arguments + dynamic get arguments => routing.args; + + /// give name from current route + String get currentRoute => routing.current; + + /// give name from previous route + String get previousRoute => routing.previous; + + /// check if snackbar is open + bool get isSnackbarOpen => + SnackbarController.isSnackbarBeingShown; //routing.isSnackbar; + + void closeAllSnackbars() { + SnackbarController.cancelAllSnackbars(); + } + + Future closeCurrentSnackbar() async { + await SnackbarController.closeCurrentSnackbar(); + } + + /// check if dialog is open + bool? get isDialogOpen => routing.isDialog; + + /// check if bottomsheet is open + bool? get isBottomSheetOpen => routing.isBottomSheet; + + /// check a raw current route + Route? get rawRoute => routing.route; + + /// check if popGesture is enable + bool get isPopGestureEnable => defaultPopGesture; + + /// check if default opaque route is enable + bool get isOpaqueRouteDefault => defaultOpaqueRoute; + + /// give access to currentContext + BuildContext? get context => key.currentContext; + + /// give access to current Overlay Context + BuildContext? get overlayContext { + BuildContext? overlay; + key.currentState?.overlay?.context.visitChildElements((element) { + overlay = element; + }); + return overlay; + } + + /// give access to Theme.of(context) + ThemeData get theme { + var theme = ThemeData.fallback(); + if (context != null) { + theme = Theme.of(context!); + } + return theme; + } + + ///The current [WidgetsBinding] + WidgetsBinding get engine { + return WidgetsFlutterBinding.ensureInitialized(); + } + + /// The window to which this binding is bound. + ui.SingletonFlutterWindow get window => ui.window; + + Locale? get deviceLocale => ui.window.locale; + + ///The number of device pixels for each logical pixel. + double get pixelRatio => ui.window.devicePixelRatio; + + Size get size => ui.window.physicalSize / pixelRatio; + + ///The horizontal extent of this size. + double get width => size.width; + + ///The vertical extent of this size + double get height => size.height; + + ///The distance from the top edge to the first unpadded pixel, + ///in physical pixels. + double get statusBarHeight => ui.window.padding.top; + + ///The distance from the bottom edge to the first unpadded pixel, + ///in physical pixels. + double get bottomBarHeight => ui.window.padding.bottom; + + ///The system-reported text scale. + double get textScaleFactor => ui.window.textScaleFactor; + + /// give access to TextTheme.of(context) + TextTheme get textTheme => theme.textTheme; + + /// give access to Mediaquery.of(context) + MediaQueryData get mediaQuery => MediaQuery.of(context!); + + /// Check if dark mode theme is enable + bool get isDarkMode => (theme.brightness == Brightness.dark); + + /// Check if dark mode theme is enable on platform on android Q+ + bool get isPlatformDarkMode => + (ui.window.platformBrightness == Brightness.dark); + + /// give access to Theme.of(context).iconTheme.color + Color? get iconColor => theme.iconTheme.color; + + /// give access to FocusScope.of(context) + FocusNode? get focusScope => FocusManager.instance.primaryFocus; + + // /// give access to Immutable MediaQuery.of(context).size.height + // double get height => MediaQuery.of(context).size.height; + + // /// give access to Immutable MediaQuery.of(context).size.width + // double get width => MediaQuery.of(context).size.width; + + GlobalKey get key => _getxController.key; + + Map> get keys => _getxController.keys; + + GetMaterialController get rootController => _getxController; + + bool get defaultPopGesture => _getxController.defaultPopGesture; + bool get defaultOpaqueRoute => _getxController.defaultOpaqueRoute; + + Transition? get defaultTransition => _getxController.defaultTransition; + + Duration get defaultTransitionDuration { + return _getxController.defaultTransitionDuration; + } + + Curve get defaultTransitionCurve => _getxController.defaultTransitionCurve; + + Curve get defaultDialogTransitionCurve { + return _getxController.defaultDialogTransitionCurve; + } + + Duration get defaultDialogTransitionDuration { + return _getxController.defaultDialogTransitionDuration; + } + + Routing get routing => _getxController.routing; + + Map get parameters => _getxController.parameters; + set parameters(Map newParameters) => + _getxController.parameters = newParameters; + + CustomTransition? get customTransition => _getxController.customTransition; + set customTransition(CustomTransition? newTransition) => + _getxController.customTransition = newTransition; + + bool get testMode => _getxController.testMode; + set testMode(bool isTest) => _getxController.testMode = isTest; + + void resetRootNavigator() { + _getxController = GetMaterialController(); + } + + static GetMaterialController _getxController = GetMaterialController(); +} + +extension NavTwoExt on GetInterface { + void addPages(List getPages) { + routeTree.addRoutes(getPages); + } + + void clearRouteTree() { + _routeTree.routes.clear(); + } + + static final _routeTree = ParseRouteTree(routes: []); + + ParseRouteTree get routeTree => _routeTree; + void addPage(GetPage getPage) { + routeTree.addRoute(getPage); + } + + /// Casts the stored router delegate to a desired type + TDelegate? delegate, TPage>() => + routerDelegate as TDelegate?; + + // // ignore: use_setters_to_change_properties + // void setDefaultDelegate(RouterDelegate? delegate) { + // _routerDelegate = delegate; + // } + + // GetDelegate? getDelegate() => delegate(); + + GetInformationParser createInformationParser({String initialRoute = '/'}) { + if (routeInformationParser == null) { + return routeInformationParser = GetInformationParser( + initialRoute: initialRoute, + ); + } else { + return routeInformationParser as GetInformationParser; + } + } + + // static GetDelegate? _delegate; + + GetDelegate get rootDelegate => createDelegate(); + + GetDelegate createDelegate({ + GetPage? notFoundRoute, + List? navigatorObservers, + TransitionDelegate? transitionDelegate, + PopMode backButtonPopMode = PopMode.History, + PreventDuplicateHandlingMode preventDuplicateHandlingMode = + PreventDuplicateHandlingMode.ReorderRoutes, + }) { + if (routerDelegate == null) { + return routerDelegate = GetDelegate( + notFoundRoute: notFoundRoute, + navigatorObservers: navigatorObservers, + transitionDelegate: transitionDelegate, + backButtonPopMode: backButtonPopMode, + preventDuplicateHandlingMode: preventDuplicateHandlingMode, + ); + } else { + return routerDelegate as GetDelegate; + } + } +} + +extension OverlayExt on GetInterface { + Future showOverlay({ + required Future Function() asyncFunction, + Color opacityColor = Colors.black, + Widget? loadingWidget, + double opacity = .5, + }) async { + final navigatorState = + Navigator.of(Get.overlayContext!, rootNavigator: false); + final overlayState = navigatorState.overlay!; + + final overlayEntryOpacity = OverlayEntry(builder: (context) { + return Opacity( + opacity: opacity, + child: Container( + color: opacityColor, + )); + }); + final overlayEntryLoader = OverlayEntry(builder: (context) { + return loadingWidget ?? + const Center( + child: SizedBox( + height: 90, + width: 90, + child: Text('Loading...'), + )); + }); + overlayState.insert(overlayEntryOpacity); + overlayState.insert(overlayEntryLoader); + + T data; + + try { + data = await asyncFunction(); + } on Exception catch (_) { + overlayEntryLoader.remove(); + overlayEntryOpacity.remove(); + rethrow; + } + + overlayEntryLoader.remove(); + overlayEntryOpacity.remove(); + return data; + } +} diff --git a/siro_rider/packages/get/lib/get_navigation/src/nav2/get_information_parser.dart b/siro_rider/packages/get/lib/get_navigation/src/nav2/get_information_parser.dart new file mode 100644 index 0000000..b64caac --- /dev/null +++ b/siro_rider/packages/get/lib/get_navigation/src/nav2/get_information_parser.dart @@ -0,0 +1,47 @@ +import 'package:flutter/foundation.dart'; +import 'package:flutter/widgets.dart'; + +import '../../../get.dart'; + +class GetInformationParser extends RouteInformationParser { + final String initialRoute; + + GetInformationParser({ + this.initialRoute = '/', + }) { + Get.log('GetInformationParser is created !'); + } + @override + SynchronousFuture parseRouteInformation( + RouteInformation routeInformation, + ) { + var location = routeInformation.location; + if (location == '/') { + //check if there is a corresponding page + //if not, relocate to initialRoute + if (!Get.routeTree.routes.any((element) => element.name == '/')) { + location = initialRoute; + } + } + + Get.log('GetInformationParser: route location: $location'); + + final matchResult = Get.routeTree.matchRoute(location ?? initialRoute); + + return SynchronousFuture( + GetNavConfig( + currentTreeBranch: matchResult.treeBranch, + location: location, + state: routeInformation.state, + ), + ); + } + + @override + RouteInformation restoreRouteInformation(GetNavConfig configuration) { + return RouteInformation( + location: configuration.location, + state: configuration.state, + ); + } +} diff --git a/siro_rider/packages/get/lib/get_navigation/src/nav2/get_nav_config.dart b/siro_rider/packages/get/lib/get_navigation/src/nav2/get_nav_config.dart new file mode 100644 index 0000000..ab7bf62 --- /dev/null +++ b/siro_rider/packages/get/lib/get_navigation/src/nav2/get_nav_config.dart @@ -0,0 +1,60 @@ +import 'package:flutter/widgets.dart'; + +import '../../../get.dart'; + +// class GetRouterState extends GetxController { +// GetRouterState({required this.currentTreeBranch}); +// final List currentTreeBranch; +// GetPage? get currentPage => currentTreeBranch.last; + +// static GetNavConfig? fromRoute(String route) { +// final res = Get.routeTree.matchRoute(route); +// if (res.treeBranch.isEmpty) return null; +// return GetNavConfig( +// currentTreeBranch: res.treeBranch, +// location: route, +// state: null, +// ); +// } +// } + +/// This config enables us to navigate directly to a sub-url +class GetNavConfig extends RouteInformation { + final List currentTreeBranch; + GetPage? get currentPage => currentTreeBranch.last; + + GetNavConfig({ + required this.currentTreeBranch, + required String? location, + required Object? state, + }) : super( + location: location, + state: state, + ); + + GetNavConfig copyWith({ + List? currentTreeBranch, + required String? location, + required Object? state, + }) { + return GetNavConfig( + currentTreeBranch: currentTreeBranch ?? this.currentTreeBranch, + location: location ?? this.location, + state: state ?? this.state, + ); + } + + static GetNavConfig? fromRoute(String route) { + final res = Get.routeTree.matchRoute(route); + if (res.treeBranch.isEmpty) return null; + return GetNavConfig( + currentTreeBranch: res.treeBranch, + location: route, + state: null, + ); + } + + @override + String toString() => ''' +======GetNavConfig=====\ncurrentTreeBranch: $currentTreeBranch\ncurrentPage: $currentPage\n======GetNavConfig====='''; +} diff --git a/siro_rider/packages/get/lib/get_navigation/src/nav2/get_router_delegate.dart b/siro_rider/packages/get/lib/get_navigation/src/nav2/get_router_delegate.dart new file mode 100644 index 0000000..9318096 --- /dev/null +++ b/siro_rider/packages/get/lib/get_navigation/src/nav2/get_router_delegate.dart @@ -0,0 +1,486 @@ +import 'dart:async'; + +import 'package:flutter/foundation.dart'; +import 'package:flutter/material.dart'; + +import '../../../get.dart'; +import '../../../get_state_manager/src/simple/list_notifier.dart'; + +class GetDelegate extends RouterDelegate + with ListenableMixin, ListNotifierMixin { + final List history = []; + final PopMode backButtonPopMode; + final PreventDuplicateHandlingMode preventDuplicateHandlingMode; + + final GetPage notFoundRoute; + + final List? navigatorObservers; + final TransitionDelegate? transitionDelegate; + + final _allCompleters = {}; + + GetDelegate({ + GetPage? notFoundRoute, + this.navigatorObservers, + this.transitionDelegate, + this.backButtonPopMode = PopMode.History, + this.preventDuplicateHandlingMode = + PreventDuplicateHandlingMode.ReorderRoutes, + }) : notFoundRoute = notFoundRoute ?? + GetPage( + name: '/404', + page: () => const Scaffold( + body: Text('Route not found'), + ), + ) { + Get.log('GetDelegate is created !'); + } + + @override + GetNavConfig? get currentConfiguration { + if (history.isEmpty) return null; + final route = history.last; + return route; + } + + GlobalKey get navigatorKey => Get.key; + + Map get parameters { + return currentConfiguration?.currentPage?.parameters ?? {}; + } + + T arguments() { + return currentConfiguration?.currentPage?.arguments as T; + } + + /// Removes routes according to [PopMode] + /// until it reaches the specifc [fullRoute], + /// DOES NOT remove the [fullRoute] + Future backUntil( + String fullRoute, { + PopMode popMode = PopMode.Page, + }) async { + // remove history or page entries until you meet route + var iterator = currentConfiguration; + while (_canPop(popMode) && + iterator != null && + iterator.location != fullRoute) { + await _pop(popMode); + // replace iterator + iterator = currentConfiguration; + } + refresh(); + } + + @override + Widget build(BuildContext context) { + final pages = getVisualPages(); + if (pages.isEmpty) return const SizedBox.shrink(); + final extraObservers = navigatorObservers; + return GetNavigator( + key: navigatorKey, + onPopPage: _onPopVisualRoute, + pages: pages, + observers: [ + GetObserver(), + if (extraObservers != null) ...extraObservers, + ], + transitionDelegate: + transitionDelegate ?? const DefaultTransitionDelegate(), + ); + } + + // void _unsafeHistoryClear() { + // history.clear(); + // } + + Future canPopHistory() { + return SynchronousFuture(_canPopHistory()); + } + + Future canPopPage() { + return SynchronousFuture(_canPopPage()); + } + + /// gets the visual pages from the current history entry + /// + /// visual pages must have [participatesInRootNavigator] set to true + List getVisualPages() { + final currentHistory = currentConfiguration; + if (currentHistory == null) return []; + + final res = currentHistory.currentTreeBranch + .where((r) => r.participatesInRootNavigator != null); + if (res.isEmpty) { + //default behavoir, all routes participate in root navigator + return history.map((e) => e.currentPage!).toList(); + } else { + //user specified at least one participatesInRootNavigator + return res + .where((element) => element.participatesInRootNavigator == true) + .toList(); + } + } + + // GetPageRoute getPageRoute(RouteSettings? settings) { + // return PageRedirect(settings ?? RouteSettings(name: '/404'), _notFound()) + // .page(); + // } + + Future handlePopupRoutes({ + Object? result, + }) async { + Route? currentRoute; + navigatorKey.currentState!.popUntil((route) { + currentRoute = route; + return true; + }); + if (currentRoute is PopupRoute) { + return await navigatorKey.currentState!.maybePop(result); + } + return false; + } + + Future? offAndToNamed( + String page, { + dynamic arguments, + int? id, + dynamic result, + Map? parameters, + PopMode popMode = PopMode.History, + }) async { + if (parameters != null) { + final uri = Uri(path: page, queryParameters: parameters); + page = uri.toString(); + } + + await popRoute(result: result); + return toNamed(page, arguments: arguments, parameters: parameters); + } + + Future offNamed( + String page, { + dynamic arguments, + Map? parameters, + }) async { + history.removeLast(); + return toNamed(page, arguments: arguments, parameters: parameters); + } + + Future popHistory() async { + return await _popHistory(); + } + + // returns the popped page + @override + Future popRoute({ + Object? result, + PopMode popMode = PopMode.Page, + }) async { + //Returning false will cause the entire app to be popped. + final wasPopup = await handlePopupRoutes(result: result); + if (wasPopup) return true; + final popped = await _pop(popMode); + refresh(); + if (popped != null) { + //emulate the old pop with result + return true; + } + return false; + } + + /// Adds a new history entry and waits for the result + Future pushHistory( + GetNavConfig config, { + bool rebuildStack = true, + }) async { + //this changes the currentConfiguration + await _pushHistory(config); + if (rebuildStack) { + refresh(); + } + } + + Future runMiddleware(GetNavConfig config) async { + final middlewares = config.currentTreeBranch.last.middlewares; + if (middlewares == null) { + return config; + } + var iterator = config; + for (var item in middlewares) { + var redirectRes = await item.redirectDelegate(iterator); + if (redirectRes == null) return null; + iterator = redirectRes; + } + return iterator; + } + + @override + Future setNewRoutePath(GetNavConfig configuration) async { + await pushHistory(configuration); + } + + Future toNamed( + String page, { + dynamic arguments, + Map? parameters, + }) async { + if (parameters != null) { + final uri = Uri(path: page, queryParameters: parameters); + page = uri.toString(); + } + + final decoder = Get.routeTree.matchRoute(page, arguments: arguments); + decoder.replaceArguments(arguments); + + final completer = Completer(); + + if (decoder.route != null) { + _allCompleters[decoder.route!] = completer; + await pushHistory( + GetNavConfig( + currentTreeBranch: decoder.treeBranch, + location: page, + state: null, //TODO: persist state? + ), + ); + + return completer.future; + } else { + ///TODO: IMPLEMENT ROUTE NOT FOUND + + return Future.value(); + } + } + + bool _canPop(PopMode mode) { + switch (mode) { + case PopMode.History: + return _canPopHistory(); + case PopMode.Page: + default: + return _canPopPage(); + } + } + + bool _canPopHistory() { + return history.length > 1; + } + + bool _canPopPage() { + final currentTreeBranch = currentConfiguration?.currentTreeBranch; + if (currentTreeBranch == null) return false; + return currentTreeBranch.length > 1 ? true : _canPopHistory(); + } + + Future _doPopHistory() async { + return await _unsafeHistoryRemoveAt(history.length - 1); + } + + // @override + // Future setInitialRoutePath(GetNavConfig configuration) async { + // //no need to clear history with Reorder route strategy + // // _unsafeHistoryClear(); + // // _resultCompleter.clear(); + // await pushHistory(configuration); + // } + + Future _doPopPage() async { + final currentBranch = currentConfiguration?.currentTreeBranch; + if (currentBranch != null && currentBranch.length > 1) { + //remove last part only + final remaining = currentBranch.take(currentBranch.length - 1); + final prevHistoryEntry = + history.length > 1 ? history[history.length - 2] : null; + + //check if current route is the same as the previous route + if (prevHistoryEntry != null) { + //if so, pop the entire history entry + final newLocation = remaining.last.name; + final prevLocation = prevHistoryEntry.location; + if (newLocation == prevLocation) { + //pop the entire history entry + return await _popHistory(); + } + } + + //create a new route with the remaining tree branch + final res = await _popHistory(); + await _pushHistory( + GetNavConfig( + currentTreeBranch: remaining.toList(), + location: remaining.last.name, + state: null, //TOOD: persist state?? + ), + ); + return res; + } else { + //remove entire entry + return await _popHistory(); + } + } + + bool _onPopVisualRoute(Route route, dynamic result) { + final didPop = route.didPop(result); + if (!didPop) { + return false; + } + final settings = route.settings; + if (settings is GetPage) { + final config = history.cast().firstWhere( + (element) => element?.currentPage == settings, + orElse: () => null, + ); + if (config != null) { + _removeHistoryEntry(config); + } + if (_allCompleters.containsKey(settings)) { + _allCompleters[settings]?.complete(route.popped); + } + } + refresh(); + + return true; + } + + Future _pop(PopMode mode) async { + switch (mode) { + case PopMode.History: + return await _popHistory(); + case PopMode.Page: + return await _popPage(); + default: + return null; + } + } + + Future _popHistory() async { + if (!_canPopHistory()) return null; + return await _doPopHistory(); + } + + Future _popPage() async { + if (!_canPopPage()) return null; + return await _doPopPage(); + } + + Future _pushHistory(GetNavConfig config) async { + if (config.currentPage!.preventDuplicates) { + final originalEntryIndex = + history.indexWhere((element) => element.location == config.location); + if (originalEntryIndex >= 0) { + switch (preventDuplicateHandlingMode) { + case PreventDuplicateHandlingMode.PopUntilOriginalRoute: + await backUntil(config.location!, popMode: PopMode.Page); + break; + case PreventDuplicateHandlingMode.ReorderRoutes: + await _unsafeHistoryRemoveAt(originalEntryIndex); + await _unsafeHistoryAdd(config); + break; + case PreventDuplicateHandlingMode.DoNothing: + default: + break; + } + return; + } + } + await _unsafeHistoryAdd(config); + } + + Future _removeHistoryEntry(GetNavConfig entry) async { + await _unsafeHistoryRemove(entry); + } + + Future _unsafeHistoryAdd(GetNavConfig config) async { + final res = await runMiddleware(config); + if (res == null) return; + history.add(res); + } + + Future _unsafeHistoryRemove(GetNavConfig config) async { + var index = history.indexOf(config); + if (index >= 0) await _unsafeHistoryRemoveAt(index); + } + + Future _unsafeHistoryRemoveAt(int index) async { + if (index == history.length - 1 && history.length > 1) { + //removing WILL update the current route + final toCheck = history[history.length - 2]; + final resMiddleware = await runMiddleware(toCheck); + if (resMiddleware == null) return null; + history[history.length - 2] = resMiddleware; + } + return history.removeAt(index); + } +} + +class GetNavigator extends Navigator { + GetNavigator({ + GlobalKey? key, + bool Function(Route, dynamic)? onPopPage, + required List pages, + List? observers, + bool reportsRouteUpdateToEngine = false, + TransitionDelegate? transitionDelegate, + }) : super( + //keys should be optional + key: key, + onPopPage: onPopPage ?? + (route, result) { + final didPop = route.didPop(result); + if (!didPop) { + return false; + } + return true; + }, + reportsRouteUpdateToEngine: reportsRouteUpdateToEngine, + pages: pages, + observers: [ + // GetObserver(), + if (observers != null) ...observers, + ], + transitionDelegate: + transitionDelegate ?? const DefaultTransitionDelegate(), + ); +} + +/// Enables the user to customize the intended pop behavior +/// +/// Goes to either the previous history entry or the previous page entry +/// +/// e.g. if the user navigates to these pages +/// 1) /home +/// 2) /home/products/1234 +/// +/// when popping on [History] mode, it will emulate a browser back button. +/// +/// so the new history stack will be: +/// 1) /home +/// +/// when popping on [Page] mode, it will only remove the last part of the route +/// so the new history stack will be: +/// 1) /home +/// 2) /home/products +/// +/// another pop will change the history stack to: +/// 1) /home +enum PopMode { + History, + Page, +} + +/// Enables the user to customize the behavior when pushing multiple routes that +/// shouldn't be duplicates +enum PreventDuplicateHandlingMode { + /// Removes the history entries until it reaches the old route + PopUntilOriginalRoute, + + /// Simply don't push the new route + DoNothing, + + /// Recommended - Moves the old route entry to the front + /// + /// With this mode, you guarantee there will be only one + /// route entry for each location + ReorderRoutes +} diff --git a/siro_rider/packages/get/lib/get_navigation/src/nav2/router_outlet.dart b/siro_rider/packages/get/lib/get_navigation/src/nav2/router_outlet.dart new file mode 100644 index 0000000..ca8c4c0 --- /dev/null +++ b/siro_rider/packages/get/lib/get_navigation/src/nav2/router_outlet.dart @@ -0,0 +1,168 @@ +import 'package:flutter/material.dart'; + +import '../../../get.dart'; + +class RouterOutlet, T extends Object> + extends StatefulWidget { + final TDelegate routerDelegate; + final Widget Function( + BuildContext context, + TDelegate delegate, + T? currentRoute, + ) builder; + + //keys + RouterOutlet.builder({ + Key? key, + TDelegate? delegate, + required this.builder, + }) : routerDelegate = delegate ?? Get.delegate()!, + super(key: key); + + RouterOutlet({ + Key? key, + TDelegate? delegate, + required Iterable Function(T currentNavStack) pickPages, + required Widget Function( + BuildContext context, + TDelegate, + Iterable? page, + ) + pageBuilder, + }) : this.builder( + builder: (context, rDelegate, currentConfig) { + var picked = + currentConfig == null ? null : pickPages(currentConfig); + if (picked?.isEmpty ?? false) { + picked = null; + } + return pageBuilder(context, rDelegate, picked); + }, + delegate: delegate, + ); + @override + RouterOutletState createState() => + RouterOutletState(); +} + +class RouterOutletState, T extends Object> + extends State> { + TDelegate get delegate => widget.routerDelegate; + @override + void initState() { + super.initState(); + _getCurrentRoute(); + delegate.addListener(onRouterDelegateChanged); + } + + @override + void dispose() { + delegate.removeListener(onRouterDelegateChanged); + super.dispose(); + } + + T? currentRoute; + void _getCurrentRoute() { + currentRoute = delegate.currentConfiguration; + } + + void onRouterDelegateChanged() { + setState(_getCurrentRoute); + } + + @override + Widget build(BuildContext context) { + return widget.builder(context, delegate, currentRoute); + } +} + +class GetRouterOutlet extends RouterOutlet { + GetRouterOutlet({ + String? anchorRoute, + required String initialRoute, + Iterable Function(Iterable afterAnchor)? filterPages, + GlobalKey? key, + GetDelegate? delegate, + }) : this.pickPages( + pickPages: (config) { + Iterable> ret; + if (anchorRoute == null) { + // jump the ancestor path + final length = Uri.parse(initialRoute).pathSegments.length; + + return config.currentTreeBranch + .skip(length) + .take(length) + .toList(); + } + ret = config.currentTreeBranch.pickAfterRoute(anchorRoute); + if (filterPages != null) { + ret = filterPages(ret); + } + return ret; + }, + emptyPage: (delegate) => + Get.routeTree.matchRoute(initialRoute).route ?? + delegate.notFoundRoute, + key: key, + delegate: delegate, + ); + GetRouterOutlet.pickPages({ + Widget Function(GetDelegate delegate)? emptyWidget, + GetPage Function(GetDelegate delegate)? emptyPage, + required Iterable Function(GetNavConfig currentNavStack) pickPages, + bool Function(Route, dynamic)? onPopPage, + GlobalKey? key, + GetDelegate? delegate, + }) : super( + pageBuilder: (context, rDelegate, pages) { + final pageRes = [ + ...?pages, + if (pages == null || pages.isEmpty) emptyPage?.call(rDelegate), + ].whereType(); + + if (pageRes.isNotEmpty) { + return GetNavigator( + onPopPage: onPopPage ?? + (route, result) { + final didPop = route.didPop(result); + if (!didPop) { + return false; + } + return true; + }, + pages: pageRes.toList(), + key: key, + ); + } + return (emptyWidget?.call(rDelegate) ?? const SizedBox.shrink()); + }, + pickPages: pickPages, + delegate: delegate ?? Get.rootDelegate, + ); + + GetRouterOutlet.builder({ + required Widget Function( + BuildContext context, + GetDelegate delegate, + GetNavConfig? currentRoute, + ) + builder, + GetDelegate? routerDelegate, + }) : super.builder( + builder: builder, + delegate: routerDelegate, + ); +} + +extension PagesListExt on List { + Iterable pickAtRoute(String route) { + return skipWhile((value) { + return value.name != route; + }); + } + + Iterable pickAfterRoute(String route) { + return pickAtRoute(route).skip(1); + } +} diff --git a/siro_rider/packages/get/lib/get_navigation/src/root/get_cupertino_app.dart b/siro_rider/packages/get/lib/get_navigation/src/root/get_cupertino_app.dart new file mode 100644 index 0000000..9744e87 --- /dev/null +++ b/siro_rider/packages/get/lib/get_navigation/src/root/get_cupertino_app.dart @@ -0,0 +1,321 @@ +import 'package:flutter/cupertino.dart'; +import 'package:flutter/foundation.dart'; +import 'package:flutter/material.dart'; + +import '../../../get_core/get_core.dart'; +import '../../../get_instance/get_instance.dart'; +import '../../../get_state_manager/get_state_manager.dart'; +import '../../../get_utils/get_utils.dart'; +import '../../get_navigation.dart'; + +class GetCupertinoApp extends StatelessWidget { + final GlobalKey? navigatorKey; + + final Widget? home; + final Map? routes; + final String? initialRoute; + final RouteFactory? onGenerateRoute; + final InitialRouteListFactory? onGenerateInitialRoutes; + final RouteFactory? onUnknownRoute; + final List? navigatorObservers; + final TransitionBuilder? builder; + final String title; + final GenerateAppTitle? onGenerateTitle; + final CustomTransition? customTransition; + final Color? color; + final Map>? translationsKeys; + final Translations? translations; + final TextDirection? textDirection; + final Locale? locale; + final Locale? fallbackLocale; + final Iterable>? localizationsDelegates; + final LocaleListResolutionCallback? localeListResolutionCallback; + final LocaleResolutionCallback? localeResolutionCallback; + final Iterable supportedLocales; + final bool showPerformanceOverlay; + final bool checkerboardRasterCacheImages; + final bool checkerboardOffscreenLayers; + final bool showSemanticsDebugger; + final bool debugShowCheckedModeBanner; + final Map? shortcuts; + final ThemeData? highContrastTheme; + final ThemeData? highContrastDarkTheme; + final Map>? actions; + final Function(Routing?)? routingCallback; + final Transition? defaultTransition; + final bool? opaqueRoute; + final VoidCallback? onInit; + final VoidCallback? onReady; + final VoidCallback? onDispose; + final bool? enableLog; + final LogWriterCallback? logWriterCallback; + final bool? popGesture; + final SmartManagement smartManagement; + final Bindings? initialBinding; + final Duration? transitionDuration; + final bool? defaultGlobalState; + final List? getPages; + final GetPage? unknownRoute; + final RouteInformationProvider? routeInformationProvider; + final RouteInformationParser? routeInformationParser; + final RouterDelegate? routerDelegate; + final BackButtonDispatcher? backButtonDispatcher; + final CupertinoThemeData? theme; + final bool useInheritedMediaQuery; + const GetCupertinoApp({ + Key? key, + this.theme, + this.navigatorKey, + this.home, + Map this.routes = + const {}, + this.initialRoute, + this.onGenerateRoute, + this.onGenerateInitialRoutes, + this.onUnknownRoute, + List this.navigatorObservers = + const [], + this.builder, + this.translationsKeys, + this.translations, + this.textDirection, + this.title = '', + this.onGenerateTitle, + this.color, + this.customTransition, + this.onInit, + this.onDispose, + this.locale, + this.fallbackLocale, + this.localizationsDelegates, + this.localeListResolutionCallback, + this.localeResolutionCallback, + this.supportedLocales = const [Locale('en', 'US')], + this.showPerformanceOverlay = false, + this.checkerboardRasterCacheImages = false, + this.checkerboardOffscreenLayers = false, + this.showSemanticsDebugger = false, + this.debugShowCheckedModeBanner = true, + this.shortcuts, + this.smartManagement = SmartManagement.full, + this.initialBinding, + this.useInheritedMediaQuery = false, + this.unknownRoute, + this.routingCallback, + this.defaultTransition, + this.onReady, + this.getPages, + this.opaqueRoute, + this.enableLog = kDebugMode, + this.logWriterCallback, + this.popGesture, + this.transitionDuration, + this.defaultGlobalState, + this.highContrastTheme, + this.highContrastDarkTheme, + this.actions, + }) : routeInformationProvider = null, + routeInformationParser = null, + routerDelegate = null, + backButtonDispatcher = null, + super(key: key); + + GetCupertinoApp.router({ + Key? key, + this.theme, + this.routeInformationProvider, + RouteInformationParser? routeInformationParser, + RouterDelegate? routerDelegate, + this.backButtonDispatcher, + this.builder, + this.title = '', + this.onGenerateTitle, + this.useInheritedMediaQuery = false, + this.color, + this.highContrastTheme, + this.highContrastDarkTheme, + this.locale, + this.localizationsDelegates, + this.localeListResolutionCallback, + this.localeResolutionCallback, + this.supportedLocales = const [Locale('en', 'US')], + this.showPerformanceOverlay = false, + this.checkerboardRasterCacheImages = false, + this.checkerboardOffscreenLayers = false, + this.showSemanticsDebugger = false, + this.debugShowCheckedModeBanner = true, + this.shortcuts, + this.actions, + this.customTransition, + this.translationsKeys, + this.translations, + this.textDirection, + this.fallbackLocale, + this.routingCallback, + this.defaultTransition, + this.opaqueRoute, + this.onInit, + this.onReady, + this.onDispose, + this.enableLog = kDebugMode, + this.logWriterCallback, + this.popGesture, + this.smartManagement = SmartManagement.full, + this.initialBinding, + this.transitionDuration, + this.defaultGlobalState, + this.getPages, + this.unknownRoute, + }) : routerDelegate = routerDelegate ??= Get.createDelegate( + notFoundRoute: unknownRoute, + ), + routeInformationParser = + routeInformationParser ??= Get.createInformationParser( + initialRoute: getPages?.first.name ?? '/', + ), + navigatorObservers = null, + navigatorKey = null, + onGenerateRoute = null, + home = null, + onGenerateInitialRoutes = null, + onUnknownRoute = null, + routes = null, + initialRoute = null, + super(key: key) { + Get.routerDelegate = routerDelegate; + Get.routeInformationParser = routeInformationParser; + } + + @override + Widget build(BuildContext context) => GetBuilder( + init: Get.rootController, + dispose: (d) { + onDispose?.call(); + }, + initState: (i) { + Get.engine.addPostFrameCallback((timeStamp) { + onReady?.call(); + }); + if (locale != null) Get.locale = locale; + + if (fallbackLocale != null) Get.fallbackLocale = fallbackLocale; + + if (translations != null) { + Get.addTranslations(translations!.keys); + } else if (translationsKeys != null) { + Get.addTranslations(translationsKeys!); + } + + Get.customTransition = customTransition; + + initialBinding?.dependencies(); + if (getPages != null) { + Get.addPages(getPages!); + } + + Get.smartManagement = smartManagement; + onInit?.call(); + + Get.config( + enableLog: enableLog ?? Get.isLogEnable, + logWriterCallback: logWriterCallback, + defaultTransition: defaultTransition ?? Get.defaultTransition, + defaultOpaqueRoute: opaqueRoute ?? Get.isOpaqueRouteDefault, + defaultPopGesture: popGesture ?? Get.isPopGestureEnable, + defaultDurationTransition: + transitionDuration ?? Get.defaultTransitionDuration, + ); + }, + builder: (_) => routerDelegate != null + ? CupertinoApp.router( + routerDelegate: routerDelegate!, + routeInformationParser: routeInformationParser!, + backButtonDispatcher: backButtonDispatcher, + routeInformationProvider: routeInformationProvider, + key: _.unikey, + theme: theme, + builder: defaultBuilder, + title: title, + onGenerateTitle: onGenerateTitle, + color: color, + locale: Get.locale ?? locale, + localizationsDelegates: localizationsDelegates, + localeListResolutionCallback: localeListResolutionCallback, + localeResolutionCallback: localeResolutionCallback, + supportedLocales: supportedLocales, + showPerformanceOverlay: showPerformanceOverlay, + checkerboardRasterCacheImages: checkerboardRasterCacheImages, + checkerboardOffscreenLayers: checkerboardOffscreenLayers, + showSemanticsDebugger: showSemanticsDebugger, + debugShowCheckedModeBanner: debugShowCheckedModeBanner, + shortcuts: shortcuts, + useInheritedMediaQuery: useInheritedMediaQuery, + ) + : CupertinoApp( + key: _.unikey, + theme: theme, + navigatorKey: (navigatorKey == null + ? Get.key + : Get.addKey(navigatorKey!)), + home: home, + routes: routes ?? const {}, + initialRoute: initialRoute, + onGenerateRoute: + (getPages != null ? generator : onGenerateRoute), + onGenerateInitialRoutes: (getPages == null || home != null) + ? onGenerateInitialRoutes + : initialRoutesGenerate, + onUnknownRoute: onUnknownRoute, + navigatorObservers: (navigatorObservers == null + ? [ + GetObserver(routingCallback, Get.routing) + ] + : [ + GetObserver(routingCallback, Get.routing) + ] + ..addAll(navigatorObservers!)), + builder: defaultBuilder, + title: title, + onGenerateTitle: onGenerateTitle, + color: color, + locale: Get.locale ?? locale, + localizationsDelegates: localizationsDelegates, + localeListResolutionCallback: localeListResolutionCallback, + localeResolutionCallback: localeResolutionCallback, + supportedLocales: supportedLocales, + showPerformanceOverlay: showPerformanceOverlay, + checkerboardRasterCacheImages: checkerboardRasterCacheImages, + checkerboardOffscreenLayers: checkerboardOffscreenLayers, + showSemanticsDebugger: showSemanticsDebugger, + debugShowCheckedModeBanner: debugShowCheckedModeBanner, + shortcuts: shortcuts, + useInheritedMediaQuery: useInheritedMediaQuery, + // actions: actions, + ), + ); + + Widget defaultBuilder(BuildContext context, Widget? child) { + return Directionality( + textDirection: textDirection ?? + (rtlLanguages.contains(Get.locale?.languageCode) + ? TextDirection.rtl + : TextDirection.ltr), + child: builder == null + ? (child ?? Material()) + : builder!(context, child ?? Material()), + ); + } + + Route generator(RouteSettings settings) { + return PageRedirect(settings: settings, unknownRoute: unknownRoute).page(); + } + + List> initialRoutesGenerate(String name) { + return [ + PageRedirect( + settings: RouteSettings(name: name), + unknownRoute: unknownRoute, + ).page() + ]; + } +} diff --git a/siro_rider/packages/get/lib/get_navigation/src/root/get_material_app.dart b/siro_rider/packages/get/lib/get_navigation/src/root/get_material_app.dart new file mode 100644 index 0000000..57ff5c7 --- /dev/null +++ b/siro_rider/packages/get/lib/get_navigation/src/root/get_material_app.dart @@ -0,0 +1,351 @@ +import 'package:flutter/foundation.dart'; +import 'package:flutter/material.dart'; + +import '../../../get_core/get_core.dart'; +import '../../../get_instance/get_instance.dart'; +import '../../../get_state_manager/get_state_manager.dart'; +import '../../../get_utils/get_utils.dart'; +import '../../get_navigation.dart'; + +class GetMaterialApp extends StatelessWidget { + final GlobalKey? navigatorKey; + + final GlobalKey? scaffoldMessengerKey; + final Widget? home; + final Map? routes; + final String? initialRoute; + final RouteFactory? onGenerateRoute; + final InitialRouteListFactory? onGenerateInitialRoutes; + final RouteFactory? onUnknownRoute; + final List? navigatorObservers; + final TransitionBuilder? builder; + final String title; + final GenerateAppTitle? onGenerateTitle; + final ThemeData? theme; + final ThemeData? darkTheme; + final ThemeMode themeMode; + final CustomTransition? customTransition; + final Color? color; + final Map>? translationsKeys; + final Translations? translations; + final TextDirection? textDirection; + final Locale? locale; + final Locale? fallbackLocale; + final Iterable>? localizationsDelegates; + final LocaleListResolutionCallback? localeListResolutionCallback; + final LocaleResolutionCallback? localeResolutionCallback; + final Iterable supportedLocales; + final bool showPerformanceOverlay; + final bool checkerboardRasterCacheImages; + final bool checkerboardOffscreenLayers; + final bool showSemanticsDebugger; + final bool debugShowCheckedModeBanner; + final Map? shortcuts; + final ScrollBehavior? scrollBehavior; + final ThemeData? highContrastTheme; + final ThemeData? highContrastDarkTheme; + final Map>? actions; + final bool debugShowMaterialGrid; + final ValueChanged? routingCallback; + final Transition? defaultTransition; + final bool? opaqueRoute; + final VoidCallback? onInit; + final VoidCallback? onReady; + final VoidCallback? onDispose; + final bool? enableLog; + final LogWriterCallback? logWriterCallback; + final bool? popGesture; + final SmartManagement smartManagement; + final Bindings? initialBinding; + final Duration? transitionDuration; + final bool? defaultGlobalState; + final List? getPages; + final GetPage? unknownRoute; + final RouteInformationProvider? routeInformationProvider; + final RouteInformationParser? routeInformationParser; + final RouterDelegate? routerDelegate; + final BackButtonDispatcher? backButtonDispatcher; + final bool useInheritedMediaQuery; + const GetMaterialApp({ + Key? key, + this.navigatorKey, + this.scaffoldMessengerKey, + this.home, + Map this.routes = + const {}, + this.initialRoute, + this.onGenerateRoute, + this.onGenerateInitialRoutes, + this.onUnknownRoute, + this.useInheritedMediaQuery = false, + List this.navigatorObservers = + const [], + this.builder, + this.textDirection, + this.title = '', + this.onGenerateTitle, + this.color, + this.theme, + this.darkTheme, + this.themeMode = ThemeMode.system, + this.locale, + this.fallbackLocale, + this.localizationsDelegates, + this.localeListResolutionCallback, + this.localeResolutionCallback, + this.supportedLocales = const [Locale('en', 'US')], + this.debugShowMaterialGrid = false, + this.showPerformanceOverlay = false, + this.checkerboardRasterCacheImages = false, + this.checkerboardOffscreenLayers = false, + this.showSemanticsDebugger = false, + this.debugShowCheckedModeBanner = true, + this.shortcuts, + this.scrollBehavior, + this.customTransition, + this.translationsKeys, + this.translations, + this.onInit, + this.onReady, + this.onDispose, + this.routingCallback, + this.defaultTransition, + this.getPages, + this.opaqueRoute, + this.enableLog = kDebugMode, + this.logWriterCallback, + this.popGesture, + this.transitionDuration, + this.defaultGlobalState, + this.smartManagement = SmartManagement.full, + this.initialBinding, + this.unknownRoute, + this.highContrastTheme, + this.highContrastDarkTheme, + this.actions, + }) : routeInformationProvider = null, + routeInformationParser = null, + routerDelegate = null, + backButtonDispatcher = null, + super(key: key); + + GetMaterialApp.router({ + Key? key, + this.routeInformationProvider, + this.scaffoldMessengerKey, + RouteInformationParser? routeInformationParser, + RouterDelegate? routerDelegate, + this.backButtonDispatcher, + this.builder, + this.title = '', + this.onGenerateTitle, + this.color, + this.theme, + this.darkTheme, + this.useInheritedMediaQuery = false, + this.highContrastTheme, + this.highContrastDarkTheme, + this.themeMode = ThemeMode.system, + this.locale, + this.localizationsDelegates, + this.localeListResolutionCallback, + this.localeResolutionCallback, + this.supportedLocales = const [Locale('en', 'US')], + this.debugShowMaterialGrid = false, + this.showPerformanceOverlay = false, + this.checkerboardRasterCacheImages = false, + this.checkerboardOffscreenLayers = false, + this.showSemanticsDebugger = false, + this.debugShowCheckedModeBanner = true, + this.shortcuts, + this.scrollBehavior, + this.actions, + this.customTransition, + this.translationsKeys, + this.translations, + this.textDirection, + this.fallbackLocale, + this.routingCallback, + this.defaultTransition, + this.opaqueRoute, + this.onInit, + this.onReady, + this.onDispose, + this.enableLog = kDebugMode, + this.logWriterCallback, + this.popGesture, + this.smartManagement = SmartManagement.full, + this.initialBinding, + this.transitionDuration, + this.defaultGlobalState, + this.getPages, + this.navigatorObservers, + this.unknownRoute, + }) : routerDelegate = routerDelegate ??= Get.createDelegate( + notFoundRoute: unknownRoute, + ), + routeInformationParser = + routeInformationParser ??= Get.createInformationParser( + initialRoute: getPages?.first.name ?? '/', + ), + //navigatorObservers = null, + navigatorKey = null, + onGenerateRoute = null, + home = null, + onGenerateInitialRoutes = null, + onUnknownRoute = null, + routes = null, + initialRoute = null, + super(key: key) { + Get.routerDelegate = routerDelegate; + Get.routeInformationParser = routeInformationParser; + } + + @override + Widget build(BuildContext context) => GetBuilder( + init: Get.rootController, + dispose: (d) { + onDispose?.call(); + }, + initState: (i) { + Get.engine.addPostFrameCallback((timeStamp) { + onReady?.call(); + }); + if (locale != null) Get.locale = locale; + + if (fallbackLocale != null) Get.fallbackLocale = fallbackLocale; + + if (translations != null) { + Get.addTranslations(translations!.keys); + } else if (translationsKeys != null) { + Get.addTranslations(translationsKeys!); + } + + Get.customTransition = customTransition; + + initialBinding?.dependencies(); + if (getPages != null) { + Get.addPages(getPages!); + } + + //Get.setDefaultDelegate(routerDelegate); + Get.smartManagement = smartManagement; + onInit?.call(); + + Get.config( + enableLog: enableLog ?? Get.isLogEnable, + logWriterCallback: logWriterCallback, + defaultTransition: defaultTransition ?? Get.defaultTransition, + defaultOpaqueRoute: opaqueRoute ?? Get.isOpaqueRouteDefault, + defaultPopGesture: popGesture ?? Get.isPopGestureEnable, + defaultDurationTransition: + transitionDuration ?? Get.defaultTransitionDuration, + ); + }, + builder: (_) => routerDelegate != null + ? MaterialApp.router( + routerDelegate: routerDelegate!, + routeInformationParser: routeInformationParser!, + backButtonDispatcher: backButtonDispatcher, + routeInformationProvider: routeInformationProvider, + key: _.unikey, + builder: defaultBuilder, + title: title, + onGenerateTitle: onGenerateTitle, + color: color, + theme: _.theme ?? theme ?? ThemeData.fallback(), + darkTheme: + _.darkTheme ?? darkTheme ?? theme ?? ThemeData.fallback(), + themeMode: _.themeMode ?? themeMode, + locale: Get.locale ?? locale, + scaffoldMessengerKey: + scaffoldMessengerKey ?? _.scaffoldMessengerKey, + localizationsDelegates: localizationsDelegates, + localeListResolutionCallback: localeListResolutionCallback, + localeResolutionCallback: localeResolutionCallback, + supportedLocales: supportedLocales, + debugShowMaterialGrid: debugShowMaterialGrid, + showPerformanceOverlay: showPerformanceOverlay, + checkerboardRasterCacheImages: checkerboardRasterCacheImages, + checkerboardOffscreenLayers: checkerboardOffscreenLayers, + showSemanticsDebugger: showSemanticsDebugger, + debugShowCheckedModeBanner: debugShowCheckedModeBanner, + shortcuts: shortcuts, + scrollBehavior: scrollBehavior, + useInheritedMediaQuery: useInheritedMediaQuery, + ) + : MaterialApp( + key: _.unikey, + navigatorKey: (navigatorKey == null + ? Get.key + : Get.addKey(navigatorKey!)), + scaffoldMessengerKey: + scaffoldMessengerKey ?? _.scaffoldMessengerKey, + home: home, + routes: routes ?? const {}, + initialRoute: initialRoute, + onGenerateRoute: + (getPages != null ? generator : onGenerateRoute), + onGenerateInitialRoutes: (getPages == null || home != null) + ? onGenerateInitialRoutes + : initialRoutesGenerate, + onUnknownRoute: onUnknownRoute, + navigatorObservers: (navigatorObservers == null + ? [ + GetObserver(routingCallback, Get.routing) + ] + : [ + GetObserver(routingCallback, Get.routing) + ] + ..addAll(navigatorObservers!)), + builder: defaultBuilder, + title: title, + onGenerateTitle: onGenerateTitle, + color: color, + theme: _.theme ?? theme ?? ThemeData.fallback(), + darkTheme: + _.darkTheme ?? darkTheme ?? theme ?? ThemeData.fallback(), + themeMode: _.themeMode ?? themeMode, + locale: Get.locale ?? locale, + localizationsDelegates: localizationsDelegates, + localeListResolutionCallback: localeListResolutionCallback, + localeResolutionCallback: localeResolutionCallback, + supportedLocales: supportedLocales, + debugShowMaterialGrid: debugShowMaterialGrid, + showPerformanceOverlay: showPerformanceOverlay, + checkerboardRasterCacheImages: checkerboardRasterCacheImages, + checkerboardOffscreenLayers: checkerboardOffscreenLayers, + showSemanticsDebugger: showSemanticsDebugger, + debugShowCheckedModeBanner: debugShowCheckedModeBanner, + shortcuts: shortcuts, + scrollBehavior: scrollBehavior, + useInheritedMediaQuery: useInheritedMediaQuery, + // actions: actions, + ), + ); + + Widget defaultBuilder(BuildContext context, Widget? child) { + return Directionality( + textDirection: textDirection ?? + (rtlLanguages.contains(Get.locale?.languageCode) + ? TextDirection.rtl + : TextDirection.ltr), + child: builder == null + ? (child ?? Material()) + : builder!(context, child ?? Material()), + ); + } + + Route generator(RouteSettings settings) { + return PageRedirect(settings: settings, unknownRoute: unknownRoute).page(); + } + + List> initialRoutesGenerate(String name) { + return [ + PageRedirect( + settings: RouteSettings(name: name), + unknownRoute: unknownRoute, + ).page() + ]; + } +} diff --git a/siro_rider/packages/get/lib/get_navigation/src/root/internacionalization.dart b/siro_rider/packages/get/lib/get_navigation/src/root/internacionalization.dart new file mode 100644 index 0000000..9c63275 --- /dev/null +++ b/siro_rider/packages/get/lib/get_navigation/src/root/internacionalization.dart @@ -0,0 +1,11 @@ +const List rtlLanguages = [ + 'ar', // Arabic + 'fa', // Farsi + 'he', // Hebrew + 'ps', // Pashto + 'ur', +]; + +abstract class Translations { + Map> get keys; +} diff --git a/siro_rider/packages/get/lib/get_navigation/src/root/parse_route.dart b/siro_rider/packages/get/lib/get_navigation/src/root/parse_route.dart new file mode 100644 index 0000000..09c7bc6 --- /dev/null +++ b/siro_rider/packages/get/lib/get_navigation/src/root/parse_route.dart @@ -0,0 +1,188 @@ +import '../../get_navigation.dart'; + +class RouteDecoder { + final List treeBranch; + GetPage? get route => treeBranch.isEmpty ? null : treeBranch.last; + final Map parameters; + final Object? arguments; + const RouteDecoder( + this.treeBranch, + this.parameters, + this.arguments, + ); + void replaceArguments(Object? arguments) { + final _route = route; + if (_route != null) { + final index = treeBranch.indexOf(_route); + treeBranch[index] = _route.copy(arguments: arguments); + } + } + + void replaceParameters(Object? arguments) { + final _route = route; + if (_route != null) { + final index = treeBranch.indexOf(_route); + treeBranch[index] = _route.copy(parameters: parameters); + } + } +} + +class ParseRouteTree { + ParseRouteTree({ + required this.routes, + }); + + final List routes; + + RouteDecoder matchRoute(String name, {Object? arguments}) { + final uri = Uri.parse(name); + // /home/profile/123 => home,profile,123 => /,/home,/home/profile,/home/profile/123 + final split = uri.path.split('/').where((element) => element.isNotEmpty); + var curPath = '/'; + final cumulativePaths = [ + '/', + ]; + for (var item in split) { + if (curPath.endsWith('/')) { + curPath += '$item'; + } else { + curPath += '/$item'; + } + cumulativePaths.add(curPath); + } + + final treeBranch = cumulativePaths + .map((e) => MapEntry(e, _findRoute(e))) + .where((element) => element.value != null) + .map((e) => MapEntry(e.key, e.value!)) + .toList(); + + final params = Map.from(uri.queryParameters); + if (treeBranch.isNotEmpty) { + //route is found, do further parsing to get nested query params + final lastRoute = treeBranch.last; + final parsedParams = _parseParams(name, lastRoute.value.path); + if (parsedParams.isNotEmpty) { + params.addAll(parsedParams); + } + //copy parameters to all pages. + final mappedTreeBranch = treeBranch + .map( + (e) => e.value.copy( + parameters: { + if (e.value.parameters != null) ...e.value.parameters!, + ...params, + }, + name: e.key, + ), + ) + .toList(); + return RouteDecoder( + mappedTreeBranch, + params, + arguments, + ); + } + + //route not found + return RouteDecoder( + treeBranch.map((e) => e.value).toList(), + params, + arguments, + ); + } + + void addRoutes(List getPages) { + for (final route in getPages) { + addRoute(route); + } + } + + void addRoute(GetPage route) { + routes.add(route); + + // Add Page children. + for (var page in _flattenPage(route)) { + addRoute(page); + } + } + + List _flattenPage(GetPage route) { + final result = []; + if (route.children.isEmpty) { + return result; + } + + final parentPath = route.name; + for (var page in route.children) { + // Add Parent middlewares to children + final parentMiddlewares = [ + if (page.middlewares != null) ...page.middlewares!, + if (route.middlewares != null) ...route.middlewares! + ]; + result.add( + _addChild( + page, + parentPath, + parentMiddlewares, + ), + ); + + final children = _flattenPage(page); + for (var child in children) { + result.add(_addChild( + child, + parentPath, + [ + ...parentMiddlewares, + if (child.middlewares != null) ...child.middlewares!, + ], + )); + } + } + return result; + } + + /// Change the Path for a [GetPage] + GetPage _addChild( + GetPage origin, String parentPath, List middlewares) => + origin.copy( + middlewares: middlewares, + name: (parentPath + origin.name).replaceAll(r'//', '/'), + ); + + GetPage? _findRoute(String name) { + return routes.firstWhereOrNull( + (route) => route.path.regex.hasMatch(name), + ); + } + + Map _parseParams(String path, PathDecoded routePath) { + final params = {}; + var idx = path.indexOf('?'); + if (idx > -1) { + path = path.substring(0, idx); + final uri = Uri.tryParse(path); + if (uri != null) { + params.addAll(uri.queryParameters); + } + } + var paramsMatch = routePath.regex.firstMatch(path); + + for (var i = 0; i < routePath.keys.length; i++) { + var param = Uri.decodeQueryComponent(paramsMatch![i + 1]!); + params[routePath.keys[i]!] = param; + } + return params; + } +} + +extension FirstWhereExt on List { + /// The first element satisfying [test], or `null` if there are none. + T? firstWhereOrNull(bool Function(T element) test) { + for (var element in this) { + if (test(element)) return element; + } + return null; + } +} diff --git a/siro_rider/packages/get/lib/get_navigation/src/root/root_controller.dart b/siro_rider/packages/get/lib/get_navigation/src/root/root_controller.dart new file mode 100644 index 0000000..0f8b8ac --- /dev/null +++ b/siro_rider/packages/get/lib/get_navigation/src/root/root_controller.dart @@ -0,0 +1,86 @@ +import 'package:flutter/material.dart'; + +import '../../../get.dart'; + +class GetMaterialController extends SuperController { + bool testMode = false; + Key? unikey; + ThemeData? theme; + ThemeData? darkTheme; + ThemeMode? themeMode; + + final scaffoldMessengerKey = GlobalKey(); + + bool defaultPopGesture = GetPlatform.isIOS; + bool defaultOpaqueRoute = true; + + Transition? defaultTransition; + Duration defaultTransitionDuration = Duration(milliseconds: 300); + Curve defaultTransitionCurve = Curves.easeOutQuad; + + Curve defaultDialogTransitionCurve = Curves.easeOutQuad; + + Duration defaultDialogTransitionDuration = Duration(milliseconds: 300); + + final routing = Routing(); + + Map parameters = {}; + + CustomTransition? customTransition; + + var _key = GlobalKey(debugLabel: 'Key Created by default'); + + Map> keys = {}; + + GlobalKey get key => _key; + + GlobalKey? addKey(GlobalKey newKey) { + _key = newKey; + return key; + } + + @override + void didChangeLocales(List? locales) { + Get.asap(() { + final locale = Get.deviceLocale; + if (locale != null) { + Get.updateLocale(locale); + } + }); + } + + @override + void onDetached() {} + + @override + void onInactive() {} + + @override + void onPaused() {} + + @override + void onResumed() {} + + void restartApp() { + unikey = UniqueKey(); + update(); + } + + void setTheme(ThemeData value) { + if (darkTheme == null) { + theme = value; + } else { + if (value.brightness == Brightness.light) { + theme = value; + } else { + darkTheme = value; + } + } + update(); + } + + void setThemeMode(ThemeMode value) { + themeMode = value; + update(); + } +} diff --git a/siro_rider/packages/get/lib/get_navigation/src/router_report.dart b/siro_rider/packages/get/lib/get_navigation/src/router_report.dart new file mode 100644 index 0000000..306ef12 --- /dev/null +++ b/siro_rider/packages/get/lib/get_navigation/src/router_report.dart @@ -0,0 +1,113 @@ +import 'dart:collection'; + +import 'package:flutter/widgets.dart'; + +import '../../get.dart'; + +class RouterReportManager { + /// Holds a reference to `Get.reference` when the Instance was + /// created to manage the memory. + static final Map> _routesKey = {}; + + /// Stores the onClose() references of instances created with `Get.create()` + /// using the `Get.reference`. + /// Experimental feature to keep the lifecycle and memory management with + /// non-singleton instances. + static final Map> _routesByCreate = {}; + + void printInstanceStack() { + Get.log(_routesKey.toString()); + } + + static Route? _current; + + // ignore: use_setters_to_change_properties + static void reportCurrentRoute(Route newRoute) { + _current = newRoute; + } + + /// Links a Class instance [S] (or [tag]) to the current route. + /// Requires usage of `GetMaterialApp`. + static void reportDependencyLinkedToRoute(String depedencyKey) { + if (_current == null) return; + if (_routesKey.containsKey(_current)) { + _routesKey[_current!]!.add(depedencyKey); + } else { + _routesKey[_current] = [depedencyKey]; + } + } + + static void clearRouteKeys() { + _routesKey.clear(); + _routesByCreate.clear(); + } + + static void appendRouteByCreate(GetLifeCycleBase i) { + _routesByCreate[_current] ??= HashSet(); + // _routesByCreate[Get.reference]!.add(i.onDelete as Function); + _routesByCreate[_current]!.add(i.onDelete); + } + + static void reportRouteDispose(Route disposed) { + if (Get.smartManagement != SmartManagement.onlyBuilder) { + ambiguate(WidgetsBinding.instance)?.addPostFrameCallback((_) { + _removeDependencyByRoute(disposed); + }); + } + } + + static void reportRouteWillDispose(Route disposed) { + final keysToRemove = []; + + _routesKey[disposed]?.forEach(keysToRemove.add); + + /// Removes `Get.create()` instances registered in `routeName`. + if (_routesByCreate.containsKey(disposed)) { + for (final onClose in _routesByCreate[disposed]!) { + // assure the [DisposableInterface] instance holding a reference + // to onClose() wasn't disposed. + onClose(); + } + _routesByCreate[disposed]!.clear(); + _routesByCreate.remove(disposed); + } + + for (final element in keysToRemove) { + GetInstance().markAsDirty(key: element); + + //_routesKey.remove(element); + } + + keysToRemove.clear(); + } + + /// Clears from memory registered Instances associated with [routeName] when + /// using `Get.smartManagement` as [SmartManagement.full] or + /// [SmartManagement.keepFactory] + /// Meant for internal usage of `GetPageRoute` and `GetDialogRoute` + static void _removeDependencyByRoute(Route routeName) { + final keysToRemove = []; + + _routesKey[routeName]?.forEach(keysToRemove.add); + + /// Removes `Get.create()` instances registered in `routeName`. + if (_routesByCreate.containsKey(routeName)) { + for (final onClose in _routesByCreate[routeName]!) { + // assure the [DisposableInterface] instance holding a reference + // to onClose() wasn't disposed. + onClose(); + } + _routesByCreate[routeName]!.clear(); + _routesByCreate.remove(routeName); + } + + for (final element in keysToRemove) { + final value = GetInstance().delete(key: element); + if (value) { + _routesKey[routeName]?.remove(element); + } + } + + keysToRemove.clear(); + } +} diff --git a/siro_rider/packages/get/lib/get_navigation/src/routes/circular_reveal_clipper.dart b/siro_rider/packages/get/lib/get_navigation/src/routes/circular_reveal_clipper.dart new file mode 100644 index 0000000..d53be25 --- /dev/null +++ b/siro_rider/packages/get/lib/get_navigation/src/routes/circular_reveal_clipper.dart @@ -0,0 +1,46 @@ +import 'dart:math' show sqrt, max; +import 'dart:ui' show lerpDouble; + +import 'package:flutter/material.dart'; + +class CircularRevealClipper extends CustomClipper { + final double fraction; + final Alignment? centerAlignment; + final Offset? centerOffset; + final double? minRadius; + final double? maxRadius; + + CircularRevealClipper({ + required this.fraction, + this.centerAlignment, + this.centerOffset, + this.minRadius, + this.maxRadius, + }); + + @override + Path getClip(Size size) { + final center = centerAlignment?.alongSize(size) ?? + centerOffset ?? + Offset(size.width / 2, size.height / 2); + final minRadius = this.minRadius ?? 0; + final maxRadius = this.maxRadius ?? calcMaxRadius(size, center); + + return Path() + ..addOval( + Rect.fromCircle( + center: center, + radius: lerpDouble(minRadius, maxRadius, fraction)!, + ), + ); + } + + @override + bool shouldReclip(CustomClipper oldClipper) => true; + + static double calcMaxRadius(Size size, Offset center) { + final w = max(center.dx, size.width - center.dx); + final h = max(center.dy, size.height - center.dy); + return sqrt(w * w + h * h); + } +} diff --git a/siro_rider/packages/get/lib/get_navigation/src/routes/custom_transition.dart b/siro_rider/packages/get/lib/get_navigation/src/routes/custom_transition.dart new file mode 100644 index 0000000..c2fd22d --- /dev/null +++ b/siro_rider/packages/get/lib/get_navigation/src/routes/custom_transition.dart @@ -0,0 +1,13 @@ +import 'package:flutter/widgets.dart'; + +// ignore: one_member_abstracts +abstract class CustomTransition { + Widget buildTransition( + BuildContext context, + Curve? curve, + Alignment? alignment, + Animation animation, + Animation secondaryAnimation, + Widget child, + ); +} diff --git a/siro_rider/packages/get/lib/get_navigation/src/routes/default_route.dart b/siro_rider/packages/get/lib/get_navigation/src/routes/default_route.dart new file mode 100644 index 0000000..843e58d --- /dev/null +++ b/siro_rider/packages/get/lib/get_navigation/src/routes/default_route.dart @@ -0,0 +1,127 @@ +import 'package:flutter/material.dart'; + +import '../../../get.dart'; +import '../router_report.dart'; +import 'get_transition_mixin.dart'; + +mixin PageRouteReportMixin on Route { + @override + void install() { + super.install(); + RouterReportManager.reportCurrentRoute(this); + } + + @override + void dispose() { + super.dispose(); + RouterReportManager.reportRouteDispose(this); + } +} + +class GetPageRoute extends PageRoute + with GetPageRouteTransitionMixin, PageRouteReportMixin { + /// Creates a page route for use in an iOS designed app. + /// + /// The [builder], [maintainState], and [fullscreenDialog] arguments must not + /// be null. + GetPageRoute({ + RouteSettings? settings, + this.transitionDuration = const Duration(milliseconds: 300), + this.opaque = true, + this.parameter, + this.gestureWidth, + this.curve, + this.alignment, + this.transition, + this.popGesture, + this.customTransition, + this.barrierDismissible = false, + this.barrierColor, + this.binding, + this.bindings, + this.routeName, + this.page, + this.title, + this.showCupertinoParallax = true, + this.barrierLabel, + this.maintainState = true, + bool fullscreenDialog = false, + this.middlewares, + }) : super(settings: settings, fullscreenDialog: fullscreenDialog); + + @override + final Duration transitionDuration; + final GetPageBuilder? page; + final String? routeName; + //final String reference; + final CustomTransition? customTransition; + final Bindings? binding; + final Map? parameter; + final List? bindings; + + @override + final bool showCupertinoParallax; + + @override + final bool opaque; + final bool? popGesture; + + @override + final bool barrierDismissible; + final Transition? transition; + final Curve? curve; + final Alignment? alignment; + final List? middlewares; + + @override + final Color? barrierColor; + + @override + final String? barrierLabel; + + @override + final bool maintainState; + + @override + void dispose() { + super.dispose(); + final middlewareRunner = MiddlewareRunner(middlewares); + middlewareRunner.runOnPageDispose(); + } + + Widget? _child; + + Widget _getChild() { + if (_child != null) return _child!; + final middlewareRunner = MiddlewareRunner(middlewares); + + final localbindings = [ + if (bindings != null) ...bindings!, + if (binding != null) ...[binding!] + ]; + final bindingsToBind = middlewareRunner.runOnBindingsStart(localbindings); + if (bindingsToBind != null) { + for (final binding in bindingsToBind) { + binding.dependencies(); + } + } + + final pageToBuild = middlewareRunner.runOnPageBuildStart(page)!; + _child = middlewareRunner.runOnPageBuilt(pageToBuild()); + return _child!; + } + + @override + Widget buildContent(BuildContext context) { + return _getChild(); + } + + @override + final String? title; + + @override + String get debugLabel => '${super.debugLabel}(${settings.name})'; + + @override + final double Function(BuildContext context)? gestureWidth; +} diff --git a/siro_rider/packages/get/lib/get_navigation/src/routes/default_transitions.dart b/siro_rider/packages/get/lib/get_navigation/src/routes/default_transitions.dart new file mode 100644 index 0000000..3a01477 --- /dev/null +++ b/siro_rider/packages/get/lib/get_navigation/src/routes/default_transitions.dart @@ -0,0 +1,209 @@ +import 'package:flutter/cupertino.dart'; +import 'package:flutter/material.dart'; + +import 'circular_reveal_clipper.dart'; + +class LeftToRightFadeTransition { + Widget buildTransitions( + BuildContext context, + Curve? curve, + Alignment? alignment, + Animation animation, + Animation secondaryAnimation, + Widget child) { + return SlideTransition( + position: Tween( + begin: const Offset(-1.0, 0.0), + end: Offset.zero, + ).animate(animation), + child: FadeTransition( + opacity: animation, + child: SlideTransition( + position: Tween( + begin: Offset.zero, + end: const Offset(1.0, 0.0), + ).animate(secondaryAnimation), + child: child), + ), + ); + } +} + +class RightToLeftFadeTransition { + Widget buildTransitions( + BuildContext context, + Curve? curve, + Alignment? alignment, + Animation animation, + Animation secondaryAnimation, + Widget child) { + return SlideTransition( + position: Tween( + begin: const Offset(1.0, 0.0), + end: Offset.zero, + ).animate(animation), + child: FadeTransition( + opacity: animation, + child: SlideTransition( + position: Tween( + begin: Offset.zero, + end: const Offset(-1.0, 0.0), + ).animate(secondaryAnimation), + child: child), + ), + ); + } +} + +class NoTransition { + Widget buildTransitions( + BuildContext context, + Curve curve, + Alignment alignment, + Animation animation, + Animation secondaryAnimation, + Widget child) { + return child; + } +} + +class FadeInTransition { + Widget buildTransitions( + BuildContext context, + Curve? curve, + Alignment? alignment, + Animation animation, + Animation secondaryAnimation, + Widget child) { + return FadeTransition(opacity: animation, child: child); + } +} + +class SlideDownTransition { + Widget buildTransitions( + BuildContext context, + Curve? curve, + Alignment? alignment, + Animation animation, + Animation secondaryAnimation, + Widget child) { + return SlideTransition( + position: Tween( + begin: Offset(0.0, 1.0), + end: Offset.zero, + ).animate(animation), + child: child, + ); + } +} + +class SlideLeftTransition { + Widget buildTransitions( + BuildContext context, + Curve? curve, + Alignment? alignment, + Animation animation, + Animation secondaryAnimation, + Widget child) { + return SlideTransition( + position: Tween( + begin: Offset(-1.0, 0.0), + end: Offset.zero, + ).animate(animation), + child: child, + ); + } +} + +class SlideRightTransition { + Widget buildTransitions( + BuildContext context, + Curve? curve, + Alignment? alignment, + Animation animation, + Animation secondaryAnimation, + Widget child) { + return SlideTransition( + position: Tween( + begin: Offset(1.0, 0.0), + end: Offset.zero, + ).animate(animation), + child: child, + ); + } +} + +class SlideTopTransition { + Widget buildTransitions( + BuildContext context, + Curve? curve, + Alignment? alignment, + Animation animation, + Animation secondaryAnimation, + Widget child) { + return SlideTransition( + position: Tween( + begin: Offset(0.0, -1.0), + end: Offset.zero, + ).animate(animation), + child: child, + ); + } +} + +class ZoomInTransition { + Widget buildTransitions( + BuildContext context, + Curve? curve, + Alignment? alignment, + Animation animation, + Animation secondaryAnimation, + Widget child) { + return ScaleTransition( + scale: animation, + child: child, + ); + } +} + +class SizeTransitions { + Widget buildTransitions( + BuildContext context, + Curve curve, + Alignment? alignment, + Animation animation, + Animation secondaryAnimation, + Widget child) { + return Align( + alignment: Alignment.center, + child: SizeTransition( + sizeFactor: CurvedAnimation( + parent: animation, + curve: curve, + ), + child: child, + ), + ); + } +} + +class CircularRevealTransition { + Widget buildTransitions( + BuildContext context, + Curve? curve, + Alignment? alignment, + Animation animation, + Animation secondaryAnimation, + Widget child) { + return ClipPath( + clipper: CircularRevealClipper( + fraction: animation.value, + centerAlignment: Alignment.center, + centerOffset: Offset.zero, + minRadius: 0, + maxRadius: 800, + ), + child: child, + ); + } +} diff --git a/siro_rider/packages/get/lib/get_navigation/src/routes/get_route.dart b/siro_rider/packages/get/lib/get_navigation/src/routes/get_route.dart new file mode 100644 index 0000000..f63b3ed --- /dev/null +++ b/siro_rider/packages/get/lib/get_navigation/src/routes/get_route.dart @@ -0,0 +1,184 @@ +import 'package:flutter/cupertino.dart'; +import 'package:flutter/material.dart'; + +import '../../../get_core/src/get_main.dart'; +import '../../../get_instance/get_instance.dart'; +import '../../get_navigation.dart'; + +class GetPage extends Page { + final GetPageBuilder page; + final bool? popGesture; + final Map? parameters; + final String? title; + final Transition? transition; + final Curve curve; + final bool? participatesInRootNavigator; + final Alignment? alignment; + final bool maintainState; + final bool opaque; + final double Function(BuildContext context)? gestureWidth; + final Bindings? binding; + final List bindings; + final CustomTransition? customTransition; + final Duration? transitionDuration; + final bool fullscreenDialog; + final bool preventDuplicates; + // @override + // final LocalKey? key; + + // @override + // RouteSettings get settings => this; + + @override + final Object? arguments; + + @override + final String name; + + final List children; + final List? middlewares; + final PathDecoded path; + final GetPage? unknownRoute; + final bool showCupertinoParallax; + + GetPage({ + required this.name, + required this.page, + this.title, + this.participatesInRootNavigator, + this.gestureWidth, + // RouteSettings settings, + this.maintainState = true, + this.curve = Curves.linear, + this.alignment, + this.parameters, + this.opaque = true, + this.transitionDuration, + this.popGesture, + this.binding, + this.bindings = const [], + this.transition, + this.customTransition, + this.fullscreenDialog = false, + this.children = const [], + this.middlewares, + this.unknownRoute, + this.arguments, + this.showCupertinoParallax = true, + this.preventDuplicates = true, + }) : path = _nameToRegex(name), + assert(name.startsWith('/'), + 'It is necessary to start route name [$name] with a slash: /$name'), + super( + key: ValueKey(name), + name: name, + arguments: Get.arguments, + ); + // settings = RouteSettings(name: name, arguments: Get.arguments); + + GetPage copy({ + String? name, + GetPageBuilder? page, + bool? popGesture, + Map? parameters, + String? title, + Transition? transition, + Curve? curve, + Alignment? alignment, + bool? maintainState, + bool? opaque, + Bindings? binding, + List? bindings, + CustomTransition? customTransition, + Duration? transitionDuration, + bool? fullscreenDialog, + RouteSettings? settings, + List? children, + GetPage? unknownRoute, + List? middlewares, + bool? preventDuplicates, + final double Function(BuildContext context)? gestureWidth, + bool? participatesInRootNavigator, + Object? arguments, + bool? showCupertinoParallax, + }) { + return GetPage( + participatesInRootNavigator: + participatesInRootNavigator ?? this.participatesInRootNavigator, + preventDuplicates: preventDuplicates ?? this.preventDuplicates, + name: name ?? this.name, + page: page ?? this.page, + popGesture: popGesture ?? this.popGesture, + parameters: parameters ?? this.parameters, + title: title ?? this.title, + transition: transition ?? this.transition, + curve: curve ?? this.curve, + alignment: alignment ?? this.alignment, + maintainState: maintainState ?? this.maintainState, + opaque: opaque ?? this.opaque, + binding: binding ?? this.binding, + bindings: bindings ?? this.bindings, + customTransition: customTransition ?? this.customTransition, + transitionDuration: transitionDuration ?? this.transitionDuration, + fullscreenDialog: fullscreenDialog ?? this.fullscreenDialog, + children: children ?? this.children, + unknownRoute: unknownRoute ?? this.unknownRoute, + middlewares: middlewares ?? this.middlewares, + gestureWidth: gestureWidth ?? this.gestureWidth, + arguments: arguments ?? this.arguments, + showCupertinoParallax: + showCupertinoParallax ?? this.showCupertinoParallax, + ); + } + + @override + Route createRoute(BuildContext context) { + // return GetPageRoute(settings: this, page: page); + final _page = PageRedirect( + route: this, + settings: this, + unknownRoute: unknownRoute, + ).getPageToRoute(this, unknownRoute); + + return _page; + } + + static PathDecoded _nameToRegex(String path) { + var keys = []; + + String _replace(Match pattern) { + var buffer = StringBuffer('(?:'); + + if (pattern[1] != null) buffer.write('\.'); + buffer.write('([\\w%+-._~!\$&\'()*,;=:@]+))'); + if (pattern[3] != null) buffer.write('?'); + + keys.add(pattern[2]); + return "$buffer"; + } + + var stringPath = '$path/?' + .replaceAllMapped(RegExp(r'(\.)?:(\w+)(\?)?'), _replace) + .replaceAll('//', '/'); + + return PathDecoded(RegExp('^$stringPath\$'), keys); + } +} + +@immutable +class PathDecoded { + final RegExp regex; + final List keys; + const PathDecoded(this.regex, this.keys); + + @override + int get hashCode => regex.hashCode; + + @override + bool operator ==(Object other) { + if (identical(this, other)) return true; + + return other is PathDecoded && + other.regex == regex; // && listEquals(other.keys, keys); + } +} diff --git a/siro_rider/packages/get/lib/get_navigation/src/routes/get_transition_mixin.dart b/siro_rider/packages/get/lib/get_navigation/src/routes/get_transition_mixin.dart new file mode 100644 index 0000000..69a3cdb --- /dev/null +++ b/siro_rider/packages/get/lib/get_navigation/src/routes/get_transition_mixin.dart @@ -0,0 +1,714 @@ +import 'dart:math'; +import 'dart:ui'; + +import 'package:flutter/cupertino.dart'; +import 'package:flutter/foundation.dart'; +import 'package:flutter/gestures.dart'; +import 'package:flutter/material.dart'; + +import '../../../get.dart'; +import 'default_transitions.dart'; + +const double _kBackGestureWidth = 20.0; +const int _kMaxDroppedSwipePageForwardAnimationTime = + 800; // Screen widths per second. + +// An eyeballed value for the maximum time it takes +//for a page to animate forward +// if the user releases a page mid swipe. +const int _kMaxPageBackAnimationTime = 300; // Milliseconds. + +// The maximum time for a page to get reset to it's original position if the +// user releases a page mid swipe. +const double _kMinFlingVelocity = 1.0; // Milliseconds. + +class CupertinoBackGestureController { + final AnimationController controller; + + final NavigatorState navigator; + + /// Creates a controller for an iOS-style back gesture. + /// + /// The [navigator] and [controller] arguments must not be null. + CupertinoBackGestureController({ + required this.navigator, + required this.controller, + }) { + navigator.didStartUserGesture(); + } + + /// The drag gesture has ended with a horizontal motion of + /// [fractionalVelocity] as a fraction of screen width per second. + void dragEnd(double velocity) { + // Fling in the appropriate direction. + // AnimationController.fling is guaranteed to + // take at least one frame. + // + // This curve has been determined through rigorously eyeballing native iOS + // animations. + const Curve animationCurve = Curves.fastLinearToSlowEaseIn; + final bool animateForward; + + // If the user releases the page before mid screen with sufficient velocity, + // or after mid screen, we should animate the page out. Otherwise, the page + // should be animated back in. + if (velocity.abs() >= _kMinFlingVelocity) { + animateForward = velocity <= 0; + } else { + animateForward = controller.value > 0.5; + } + + if (animateForward) { + // The closer the panel is to dismissing, the shorter the animation is. + // We want to cap the animation time, but we want to use a linear curve + // to determine it. + final droppedPageForwardAnimationTime = min( + lerpDouble( + _kMaxDroppedSwipePageForwardAnimationTime, 0, controller.value)! + .floor(), + _kMaxPageBackAnimationTime, + ); + controller.animateTo(1.0, + duration: Duration(milliseconds: droppedPageForwardAnimationTime), + curve: animationCurve); + } else { + // This route is destined to pop at this point. Reuse navigator's pop. + navigator.pop(); + + // The popping may have finished inline if already at the + // target destination. + if (controller.isAnimating) { + // Otherwise, use a custom popping animation duration and curve. + final droppedPageBackAnimationTime = lerpDouble( + 0, _kMaxDroppedSwipePageForwardAnimationTime, controller.value)! + .floor(); + controller.animateBack(0.0, + duration: Duration(milliseconds: droppedPageBackAnimationTime), + curve: animationCurve); + } + } + + if (controller.isAnimating) { + // Keep the userGestureInProgress in true state so we don't change the + // curve of the page transition mid-flight since CupertinoPageTransition + // depends on userGestureInProgress. + late AnimationStatusListener animationStatusCallback; + animationStatusCallback = (status) { + navigator.didStopUserGesture(); + controller.removeStatusListener(animationStatusCallback); + }; + controller.addStatusListener(animationStatusCallback); + } else { + navigator.didStopUserGesture(); + } + } + + /// The drag gesture has changed by [fractionalDelta]. The total range of the + /// drag should be 0.0 to 1.0. + void dragUpdate(double delta) { + controller.value -= delta; + } +} + +class CupertinoBackGestureDetector extends StatefulWidget { + final Widget child; + + final double gestureWidth; + final ValueGetter enabledCallback; + + final ValueGetter> onStartPopGesture; + + const CupertinoBackGestureDetector({ + Key? key, + required this.enabledCallback, + required this.onStartPopGesture, + required this.child, + required this.gestureWidth, + }) : super(key: key); + + @override + CupertinoBackGestureDetectorState createState() => + CupertinoBackGestureDetectorState(); +} + +class CupertinoBackGestureDetectorState + extends State> { + CupertinoBackGestureController? _backGestureController; + + late HorizontalDragGestureRecognizer _recognizer; + + @override + Widget build(BuildContext context) { + assert(debugCheckHasDirectionality(context)); + // For devices with notches, the drag area needs to be larger on the side + // that has the notch. + var dragAreaWidth = Directionality.of(context) == TextDirection.ltr + ? MediaQuery.of(context).padding.left + : MediaQuery.of(context).padding.right; + dragAreaWidth = max(dragAreaWidth, widget.gestureWidth); + return Stack( + fit: StackFit.passthrough, + children: [ + widget.child, + PositionedDirectional( + start: 0.0, + width: dragAreaWidth, + top: 0.0, + bottom: 0.0, + child: Listener( + onPointerDown: _handlePointerDown, + behavior: HitTestBehavior.translucent, + ), + ), + ], + ); + } + + @override + void dispose() { + _recognizer.dispose(); + super.dispose(); + } + + @override + void initState() { + super.initState(); + _recognizer = HorizontalDragGestureRecognizer(debugOwner: this) + ..onStart = _handleDragStart + ..onUpdate = _handleDragUpdate + ..onEnd = _handleDragEnd + ..onCancel = _handleDragCancel; + } + + double _convertToLogical(double value) { + switch (Directionality.of(context)) { + case TextDirection.rtl: + return -value; + case TextDirection.ltr: + return value; + } + } + + void _handleDragCancel() { + assert(mounted); + // This can be called even if start is not called, paired with + // the "down" event + // that we don't consider here. + _backGestureController?.dragEnd(0.0); + _backGestureController = null; + } + + void _handleDragEnd(DragEndDetails details) { + assert(mounted); + assert(_backGestureController != null); + _backGestureController!.dragEnd(_convertToLogical( + details.velocity.pixelsPerSecond.dx / context.size!.width)); + _backGestureController = null; + } + + void _handleDragStart(DragStartDetails details) { + assert(mounted); + assert(_backGestureController == null); + _backGestureController = widget.onStartPopGesture(); + } + + void _handleDragUpdate(DragUpdateDetails details) { + assert(mounted); + assert(_backGestureController != null); + _backGestureController!.dragUpdate( + _convertToLogical(details.primaryDelta! / context.size!.width)); + } + + void _handlePointerDown(PointerDownEvent event) { + if (widget.enabledCallback()) _recognizer.addPointer(event); + } +} + +mixin GetPageRouteTransitionMixin on PageRoute { + ValueNotifier? _previousTitle; + + @override + Color? get barrierColor => null; + + @override + String? get barrierLabel => null; + + double Function(BuildContext context)? get gestureWidth; + + /// Whether a pop gesture can be started by the user. + /// + /// Returns true if the user can edge-swipe to a previous route. + /// + /// Returns false once [isPopGestureInProgress] is true, but + /// [isPopGestureInProgress] can only become true if [popGestureEnabled] was + /// true first. + /// + /// This should only be used between frames, not during build. + bool get popGestureEnabled => _isPopGestureEnabled(this); + + /// True if an iOS-style back swipe pop gesture is currently + /// underway for this route. + /// + /// See also: + /// + /// * [isPopGestureInProgress], which returns true if a Cupertino pop gesture + /// is currently underway for specific route. + /// * [popGestureEnabled], which returns true if a user-triggered pop gesture + /// would be allowed. + bool get popGestureInProgress => isPopGestureInProgress(this); + + /// The title string of the previous [CupertinoPageRoute]. + /// + /// The [ValueListenable]'s value is readable after the route is installed + /// onto a [Navigator]. The [ValueListenable] will also notify its listeners + /// if the value changes (such as by replacing the previous route). + /// + /// The [ValueListenable] itself will be null before the route is installed. + /// Its content value will be null if the previous route has no title or + /// is not a [CupertinoPageRoute]. + /// + /// See also: + /// + /// * [ValueListenableBuilder], which can be used to listen and rebuild + /// widgets based on a ValueListenable. + ValueListenable get previousTitle { + assert( + _previousTitle != null, + ''' +Cannot read the previousTitle for a route that has not yet been installed''', + ); + return _previousTitle!; + } + + bool get showCupertinoParallax; + + /// {@template flutter.cupertino.CupertinoRouteTransitionMixin.title} + /// A title string for this route. + /// + /// Used to auto-populate [CupertinoNavigationBar] and + /// [CupertinoSliverNavigationBar]'s `middle`/`largeTitle` widgets when + /// one is not manually supplied. + /// {@endtemplate} + String? get title; + + @override + // A relatively rigorous eyeball estimation. + Duration get transitionDuration => const Duration(milliseconds: 400); + + /// Builds the primary contents of the route. + @protected + Widget buildContent(BuildContext context); + + @override + Widget buildPage(BuildContext context, Animation animation, + Animation secondaryAnimation) { + final child = buildContent(context); + final Widget result = Semantics( + scopesRoute: true, + explicitChildNodes: true, + child: child, + ); + return result; + } + + @override + Widget buildTransitions(BuildContext context, Animation animation, + Animation secondaryAnimation, Widget child) { + return buildPageTransitions( + this, context, animation, secondaryAnimation, child); + } + + @override + bool canTransitionTo(TransitionRoute nextRoute) { + // Don't perform outgoing animation if the next route is a + // fullscreen dialog. + + return (nextRoute is GetPageRouteTransitionMixin && + !nextRoute.fullscreenDialog && + nextRoute.showCupertinoParallax) || + (nextRoute is CupertinoRouteTransitionMixin && + !nextRoute.fullscreenDialog); + } + + @override + void didChangePrevious(Route? previousRoute) { + final previousTitleString = previousRoute is CupertinoRouteTransitionMixin + ? previousRoute.title + : null; + if (_previousTitle == null) { + _previousTitle = ValueNotifier(previousTitleString); + } else { + _previousTitle!.value = previousTitleString; + } + super.didChangePrevious(previousRoute); + } + + /// Returns a [CupertinoFullscreenDialogTransition] if [route] is a full + /// screen dialog, otherwise a [CupertinoPageTransition] is returned. + /// + /// Used by [CupertinoPageRoute.buildTransitions]. + /// + /// This method can be applied to any [PageRoute], not just + /// [CupertinoPageRoute]. It's typically used to provide a Cupertino style + /// horizontal transition for material widgets when the target platform + /// is [TargetPlatform.iOS]. + /// + /// See also: + /// + /// * [CupertinoPageTransitionsBuilder], which uses this method to define a + /// [PageTransitionsBuilder] for the [PageTransitionsTheme]. + static Widget buildPageTransitions( + PageRoute rawRoute, + BuildContext context, + Animation animation, + Animation secondaryAnimation, + Widget child, + ) { + // Check if the route has an animation that's currently participating + // in a back swipe gesture. + // + // In the middle of a back gesture drag, let the transition be linear to + // match finger motions. + final route = rawRoute as GetPageRoute; + final linearTransition = isPopGestureInProgress(route); + final finalCurve = route.curve ?? Get.defaultTransitionCurve; + final hasCurve = route.curve != null; + if (route.fullscreenDialog && route.transition == null) { + return CupertinoFullscreenDialogTransition( + primaryRouteAnimation: hasCurve + ? CurvedAnimation(parent: animation, curve: finalCurve) + : animation, + secondaryRouteAnimation: secondaryAnimation, + child: child, + linearTransition: linearTransition, + ); + } else { + if (route.customTransition != null) { + return route.customTransition!.buildTransition( + context, + finalCurve, + route.alignment, + animation, + secondaryAnimation, + route.popGesture ?? Get.defaultPopGesture + ? CupertinoBackGestureDetector( + gestureWidth: + route.gestureWidth?.call(context) ?? _kBackGestureWidth, + enabledCallback: () => _isPopGestureEnabled(route), + onStartPopGesture: () => _startPopGesture(route), + child: child) + : child, + ); + } + + /// Apply the curve by default... + final iosAnimation = animation; + animation = CurvedAnimation(parent: animation, curve: finalCurve); + + switch (route.transition ?? Get.defaultTransition) { + case Transition.leftToRight: + return SlideLeftTransition().buildTransitions( + context, + route.curve, + route.alignment, + animation, + secondaryAnimation, + route.popGesture ?? Get.defaultPopGesture + ? CupertinoBackGestureDetector( + gestureWidth: route.gestureWidth?.call(context) ?? + _kBackGestureWidth, + enabledCallback: () => _isPopGestureEnabled(route), + onStartPopGesture: () => _startPopGesture(route), + child: child) + : child); + + case Transition.downToUp: + return SlideDownTransition().buildTransitions( + context, + route.curve, + route.alignment, + animation, + secondaryAnimation, + route.popGesture ?? Get.defaultPopGesture + ? CupertinoBackGestureDetector( + gestureWidth: route.gestureWidth?.call(context) ?? + _kBackGestureWidth, + enabledCallback: () => _isPopGestureEnabled(route), + onStartPopGesture: () => _startPopGesture(route), + child: child) + : child); + + case Transition.upToDown: + return SlideTopTransition().buildTransitions( + context, + route.curve, + route.alignment, + animation, + secondaryAnimation, + route.popGesture ?? Get.defaultPopGesture + ? CupertinoBackGestureDetector( + gestureWidth: route.gestureWidth?.call(context) ?? + _kBackGestureWidth, + enabledCallback: () => _isPopGestureEnabled(route), + onStartPopGesture: () => _startPopGesture(route), + child: child) + : child); + + case Transition.noTransition: + return route.popGesture ?? Get.defaultPopGesture + ? CupertinoBackGestureDetector( + gestureWidth: + route.gestureWidth?.call(context) ?? _kBackGestureWidth, + enabledCallback: () => _isPopGestureEnabled(route), + onStartPopGesture: () => _startPopGesture(route), + child: child) + : child; + + case Transition.rightToLeft: + return SlideRightTransition().buildTransitions( + context, + route.curve, + route.alignment, + animation, + secondaryAnimation, + route.popGesture ?? Get.defaultPopGesture + ? CupertinoBackGestureDetector( + gestureWidth: route.gestureWidth?.call(context) ?? + _kBackGestureWidth, + enabledCallback: () => _isPopGestureEnabled(route), + onStartPopGesture: () => _startPopGesture(route), + child: child) + : child); + + case Transition.zoom: + return ZoomInTransition().buildTransitions( + context, + route.curve, + route.alignment, + animation, + secondaryAnimation, + route.popGesture ?? Get.defaultPopGesture + ? CupertinoBackGestureDetector( + gestureWidth: route.gestureWidth?.call(context) ?? + _kBackGestureWidth, + enabledCallback: () => _isPopGestureEnabled(route), + onStartPopGesture: () => _startPopGesture(route), + child: child) + : child); + + case Transition.fadeIn: + return FadeInTransition().buildTransitions( + context, + route.curve, + route.alignment, + animation, + secondaryAnimation, + route.popGesture ?? Get.defaultPopGesture + ? CupertinoBackGestureDetector( + gestureWidth: route.gestureWidth?.call(context) ?? + _kBackGestureWidth, + enabledCallback: () => _isPopGestureEnabled(route), + onStartPopGesture: () => _startPopGesture(route), + child: child) + : child); + + case Transition.rightToLeftWithFade: + return RightToLeftFadeTransition().buildTransitions( + context, + route.curve, + route.alignment, + animation, + secondaryAnimation, + route.popGesture ?? Get.defaultPopGesture + ? CupertinoBackGestureDetector( + gestureWidth: route.gestureWidth?.call(context) ?? + _kBackGestureWidth, + enabledCallback: () => _isPopGestureEnabled(route), + onStartPopGesture: () => _startPopGesture(route), + child: child) + : child); + + case Transition.leftToRightWithFade: + return LeftToRightFadeTransition().buildTransitions( + context, + route.curve, + route.alignment, + animation, + secondaryAnimation, + route.popGesture ?? Get.defaultPopGesture + ? CupertinoBackGestureDetector( + gestureWidth: route.gestureWidth?.call(context) ?? + _kBackGestureWidth, + enabledCallback: () => _isPopGestureEnabled(route), + onStartPopGesture: () => _startPopGesture(route), + child: child) + : child); + + case Transition.cupertino: + return CupertinoPageTransition( + primaryRouteAnimation: animation, + secondaryRouteAnimation: secondaryAnimation, + linearTransition: linearTransition, + child: CupertinoBackGestureDetector( + gestureWidth: + route.gestureWidth?.call(context) ?? _kBackGestureWidth, + enabledCallback: () => _isPopGestureEnabled(route), + onStartPopGesture: () => _startPopGesture(route), + child: child, + ), + ); + + case Transition.size: + return SizeTransitions().buildTransitions( + context, + route.curve!, + route.alignment, + animation, + secondaryAnimation, + route.popGesture ?? Get.defaultPopGesture + ? CupertinoBackGestureDetector( + gestureWidth: route.gestureWidth?.call(context) ?? + _kBackGestureWidth, + enabledCallback: () => _isPopGestureEnabled(route), + onStartPopGesture: () => _startPopGesture(route), + child: child) + : child); + + case Transition.fade: + return FadeUpwardsPageTransitionsBuilder().buildTransitions( + route, + context, + animation, + secondaryAnimation, + route.popGesture ?? Get.defaultPopGesture + ? CupertinoBackGestureDetector( + gestureWidth: route.gestureWidth?.call(context) ?? + _kBackGestureWidth, + enabledCallback: () => _isPopGestureEnabled(route), + onStartPopGesture: () => _startPopGesture(route), + child: child) + : child); + + case Transition.topLevel: + return ZoomPageTransitionsBuilder().buildTransitions( + route, + context, + animation, + secondaryAnimation, + route.popGesture ?? Get.defaultPopGesture + ? CupertinoBackGestureDetector( + gestureWidth: route.gestureWidth?.call(context) ?? + _kBackGestureWidth, + enabledCallback: () => _isPopGestureEnabled(route), + onStartPopGesture: () => _startPopGesture(route), + child: child) + : child); + + case Transition.native: + return PageTransitionsTheme().buildTransitions( + route, + context, + iosAnimation, + secondaryAnimation, + route.popGesture ?? Get.defaultPopGesture + ? CupertinoBackGestureDetector( + gestureWidth: route.gestureWidth?.call(context) ?? + _kBackGestureWidth, + enabledCallback: () => _isPopGestureEnabled(route), + onStartPopGesture: () => _startPopGesture(route), + child: child) + : child); + + case Transition.circularReveal: + return CircularRevealTransition().buildTransitions( + context, + route.curve, + route.alignment, + animation, + secondaryAnimation, + route.popGesture ?? Get.defaultPopGesture + ? CupertinoBackGestureDetector( + gestureWidth: route.gestureWidth?.call(context) ?? + _kBackGestureWidth, + enabledCallback: () => _isPopGestureEnabled(route), + onStartPopGesture: () => _startPopGesture(route), + child: child) + : child); + + default: + if (Get.customTransition != null) { + return Get.customTransition!.buildTransition(context, route.curve, + route.alignment, animation, secondaryAnimation, child); + } + + return PageTransitionsTheme().buildTransitions( + route, + context, + iosAnimation, + secondaryAnimation, + route.popGesture ?? Get.defaultPopGesture + ? CupertinoBackGestureDetector( + gestureWidth: route.gestureWidth?.call(context) ?? + _kBackGestureWidth, + enabledCallback: () => _isPopGestureEnabled(route), + onStartPopGesture: () => _startPopGesture(route), + child: child) + : child); + } + } + } + + // Called by CupertinoBackGestureDetector when a pop ("back") drag start + // gesture is detected. The returned controller handles all of the subsequent + // drag events. + /// True if an iOS-style back swipe pop gesture is currently + /// underway for [route]. + /// + /// This just check the route's [NavigatorState.userGestureInProgress]. + /// + /// See also: + /// + /// * [popGestureEnabled], which returns true if a user-triggered pop gesture + /// would be allowed. + static bool isPopGestureInProgress(PageRoute route) { + return route.navigator!.userGestureInProgress; + } + + static bool _isPopGestureEnabled(PageRoute route) { + // If there's nothing to go back to, then obviously we don't support + // the back gesture. + if (route.isFirst) return false; + // If the route wouldn't actually pop if we popped it, then the gesture + // would be really confusing (or would skip internal routes), + //so disallow it. + if (route.willHandlePopInternally) return false; + // If attempts to dismiss this route might be vetoed such as in a page + // with forms, then do not allow the user to dismiss the route with a swipe. + if (route.hasScopedWillPopCallback) return false; + // Fullscreen dialogs aren't dismissible by back swipe. + if (route.fullscreenDialog) return false; + // If we're in an animation already, we cannot be manually swiped. + if (route.animation!.status != AnimationStatus.completed) return false; + // If we're being popped into, we also cannot be swiped until the pop above + // it completes. This translates to our secondary animation being + // dismissed. + if (route.secondaryAnimation!.status != AnimationStatus.dismissed) { + return false; + } + // If we're in a gesture already, we cannot start another. + if (isPopGestureInProgress(route)) return false; + + // Looks like a back gesture would be welcome! + return true; + } + + static CupertinoBackGestureController _startPopGesture( + PageRoute route) { + assert(_isPopGestureEnabled(route)); + + return CupertinoBackGestureController( + navigator: route.navigator!, + controller: route.controller!, // protected access + ); + } +} diff --git a/siro_rider/packages/get/lib/get_navigation/src/routes/observers/route_observer.dart b/siro_rider/packages/get/lib/get_navigation/src/routes/observers/route_observer.dart new file mode 100644 index 0000000..d728e2d --- /dev/null +++ b/siro_rider/packages/get/lib/get_navigation/src/routes/observers/route_observer.dart @@ -0,0 +1,241 @@ +import 'package:flutter/widgets.dart'; + +import '../../../../get_core/get_core.dart'; +import '../../../../instance_manager.dart'; +import '../../../get_navigation.dart'; +import '../../dialog/dialog_route.dart'; +import '../../router_report.dart'; + +/// Extracts the name of a route based on it's instance type +/// or null if not possible. +String? _extractRouteName(Route? route) { + if (route?.settings.name != null) { + return route!.settings.name; + } + + if (route is GetPageRoute) { + return route.routeName; + } + + if (route is GetDialogRoute) { + return 'DIALOG ${route.hashCode}'; + } + + if (route is GetModalBottomSheetRoute) { + return 'BOTTOMSHEET ${route.hashCode}'; + } + + return null; +} + +class GetObserver extends NavigatorObserver { + final Function(Routing?)? routing; + + final Routing? _routeSend; + + GetObserver([this.routing, this._routeSend]); + + @override + void didPop(Route route, Route? previousRoute) { + super.didPop(route, previousRoute); + final currentRoute = _RouteData.ofRoute(route); + final newRoute = _RouteData.ofRoute(previousRoute); + + // if (currentRoute.isSnackbar) { + // // Get.log("CLOSE SNACKBAR ${currentRoute.name}"); + // Get.log("CLOSE SNACKBAR"); + // } else + + if (currentRoute.isBottomSheet || currentRoute.isDialog) { + Get.log("CLOSE ${currentRoute.name}"); + } else if (currentRoute.isGetPageRoute) { + Get.log("CLOSE TO ROUTE ${currentRoute.name}"); + } + if (previousRoute != null) { + RouterReportManager.reportCurrentRoute(previousRoute); + } + + // Here we use a 'inverse didPush set', meaning that we use + // previous route instead of 'route' because this is + // a 'inverse push' + _routeSend?.update((value) { + // Only PageRoute is allowed to change current value + if (previousRoute is PageRoute) { + value.current = _extractRouteName(previousRoute) ?? ''; + value.previous = newRoute.name ?? ''; + } else if (value.previous.isNotEmpty) { + value.current = value.previous; + } + + value.args = previousRoute?.settings.arguments; + value.route = previousRoute; + value.isBack = true; + value.removed = ''; + // value.isSnackbar = newRoute.isSnackbar; + value.isBottomSheet = newRoute.isBottomSheet; + value.isDialog = newRoute.isDialog; + }); + + // print('currentRoute.isDialog ${currentRoute.isDialog}'); + + routing?.call(_routeSend); + } + + @override + void didPush(Route route, Route? previousRoute) { + super.didPush(route, previousRoute); + final newRoute = _RouteData.ofRoute(route); + + // if (newRoute.isSnackbar) { + // // Get.log("OPEN SNACKBAR ${newRoute.name}"); + // Get.log("OPEN SNACKBAR"); + // } else + + if (newRoute.isBottomSheet || newRoute.isDialog) { + Get.log("OPEN ${newRoute.name}"); + } else if (newRoute.isGetPageRoute) { + Get.log("GOING TO ROUTE ${newRoute.name}"); + } + + RouterReportManager.reportCurrentRoute(route); + _routeSend?.update((value) { + // Only PageRoute is allowed to change current value + if (route is PageRoute) { + value.current = newRoute.name ?? ''; + } + final previousRouteName = _extractRouteName(previousRoute); + if (previousRouteName != null) { + value.previous = previousRouteName; + } + + value.args = route.settings.arguments; + value.route = route; + value.isBack = false; + value.removed = ''; + value.isBottomSheet = + newRoute.isBottomSheet ? true : value.isBottomSheet ?? false; + value.isDialog = newRoute.isDialog ? true : value.isDialog ?? false; + }); + + if (routing != null) { + routing!(_routeSend); + } + } + + @override + void didRemove(Route route, Route? previousRoute) { + super.didRemove(route, previousRoute); + final routeName = _extractRouteName(route); + final currentRoute = _RouteData.ofRoute(route); + + Get.log("REMOVING ROUTE $routeName"); + + _routeSend?.update((value) { + value.route = previousRoute; + value.isBack = false; + value.removed = routeName ?? ''; + value.previous = routeName ?? ''; + // value.isSnackbar = currentRoute.isSnackbar ? false : value.isSnackbar; + value.isBottomSheet = + currentRoute.isBottomSheet ? false : value.isBottomSheet; + value.isDialog = currentRoute.isDialog ? false : value.isDialog; + }); + + if (route is GetPageRoute) { + RouterReportManager.reportRouteWillDispose(route); + } + routing?.call(_routeSend); + } + + @override + void didReplace({Route? newRoute, Route? oldRoute}) { + super.didReplace(newRoute: newRoute, oldRoute: oldRoute); + final newName = _extractRouteName(newRoute); + final oldName = _extractRouteName(oldRoute); + final currentRoute = _RouteData.ofRoute(oldRoute); + + Get.log("REPLACE ROUTE $oldName"); + Get.log("NEW ROUTE $newName"); + + if (newRoute != null) { + RouterReportManager.reportCurrentRoute(newRoute); + } + + _routeSend?.update((value) { + // Only PageRoute is allowed to change current value + if (newRoute is PageRoute) { + value.current = newName ?? ''; + } + + value.args = newRoute?.settings.arguments; + value.route = newRoute; + value.isBack = false; + value.removed = ''; + value.previous = '$oldName'; + // value.isSnackbar = currentRoute.isSnackbar ? false : value.isSnackbar; + value.isBottomSheet = + currentRoute.isBottomSheet ? false : value.isBottomSheet; + value.isDialog = currentRoute.isDialog ? false : value.isDialog; + }); + if (oldRoute is GetPageRoute) { + RouterReportManager.reportRouteWillDispose(oldRoute); + } + + routing?.call(_routeSend); + } +} + +class Routing { + String current; + String previous; + dynamic args; + String removed; + Route? route; + bool? isBack; + // bool? isSnackbar; + bool? isBottomSheet; + bool? isDialog; + + Routing({ + this.current = '', + this.previous = '', + this.args, + this.removed = '', + this.route, + this.isBack, + // this.isSnackbar, + this.isBottomSheet, + this.isDialog, + }); + + void update(void fn(Routing value)) { + fn(this); + } +} + +/// This is basically a util for rules about 'what a route is' +class _RouteData { + final bool isGetPageRoute; + //final bool isSnackbar; + final bool isBottomSheet; + final bool isDialog; + final String? name; + + _RouteData({ + required this.name, + required this.isGetPageRoute, + // required this.isSnackbar, + required this.isBottomSheet, + required this.isDialog, + }); + + factory _RouteData.ofRoute(Route? route) { + return _RouteData( + name: _extractRouteName(route), + isGetPageRoute: route is GetPageRoute, + // isSnackbar: route is SnackRoute, + isDialog: route is GetDialogRoute, + isBottomSheet: route is GetModalBottomSheetRoute, + ); + } +} diff --git a/siro_rider/packages/get/lib/get_navigation/src/routes/route_middleware.dart b/siro_rider/packages/get/lib/get_navigation/src/routes/route_middleware.dart new file mode 100644 index 0000000..517ed13 --- /dev/null +++ b/siro_rider/packages/get/lib/get_navigation/src/routes/route_middleware.dart @@ -0,0 +1,291 @@ +import 'package:flutter/cupertino.dart'; +import 'package:flutter/foundation.dart'; +import '../../../get.dart'; + +abstract class _RouteMiddleware { + /// The Order of the Middlewares to run. + /// + /// {@tool snippet} + /// This Middewares will be called in this order. + /// ```dart + /// final middlewares = [ + /// GetMiddleware(priority: 2), + /// GetMiddleware(priority: 5), + /// GetMiddleware(priority: 4), + /// GetMiddleware(priority: -8), + /// ]; + /// ``` + /// -8 => 2 => 4 => 5 + /// {@end-tool} + int? priority; + + /// This function will be called when the page of + /// the called route is being searched for. + /// It take RouteSettings as a result an redirect to the new settings or + /// give it null and there will be no redirecting. + /// {@tool snippet} + /// ```dart + /// GetPage redirect(String route) { + /// final authService = Get.find(); + /// return authService.authed.value ? null : RouteSettings(name: '/login'); + /// } + /// ``` + /// {@end-tool} + RouteSettings? redirect(String route); + + /// Similar to [redirect], + /// This function will be called when the router delegate changes the + /// current route. + /// + /// The default implmentation is to navigate to + /// the input route, with no redirection. + /// + /// if this returns null, the navigation is stopped, + /// and no new routes are pushed. + /// {@tool snippet} + /// ```dart + /// GetNavConfig? redirect(GetNavConfig route) { + /// final authService = Get.find(); + /// return authService.authed.value ? null : RouteSettings(name: '/login'); + /// } + /// ``` + /// {@end-tool} + Future redirectDelegate(GetNavConfig route); + + /// This function will be called when this Page is called + /// you can use it to change something about the page or give it new page + /// {@tool snippet} + /// ```dart + /// GetPage onPageCalled(GetPage page) { + /// final authService = Get.find(); + /// return page.copyWith(title: 'Welcome ${authService.UserName}'); + /// } + /// ``` + /// {@end-tool} + GetPage? onPageCalled(GetPage page); + + /// This function will be called right before the [Bindings] are initialize. + /// Here you can change [Bindings] for this page + /// {@tool snippet} + /// ```dart + /// List onBindingsStart(List bindings) { + /// final authService = Get.find(); + /// if (authService.isAdmin) { + /// bindings.add(AdminBinding()); + /// } + /// return bindings; + /// } + /// ``` + /// {@end-tool} + List? onBindingsStart(List bindings); + + /// This function will be called right after the [Bindings] are initialize. + GetPageBuilder? onPageBuildStart(GetPageBuilder page); + + /// This function will be called right after the + /// GetPage.page function is called and will give you the result + /// of the function. and take the widget that will be showed. + Widget onPageBuilt(Widget page); + + void onPageDispose(); +} + +/// The Page Middlewares. +/// The Functions will be called in this order +/// (( [redirect] -> [onPageCalled] -> [onBindingsStart] -> +/// [onPageBuildStart] -> [onPageBuilt] -> [onPageDispose] )) +class GetMiddleware implements _RouteMiddleware { + @override + int? priority = 0; + + GetMiddleware({this.priority}); + + @override + RouteSettings? redirect(String? route) => null; + + @override + GetPage? onPageCalled(GetPage? page) => page; + + @override + List? onBindingsStart(List? bindings) => bindings; + + @override + GetPageBuilder? onPageBuildStart(GetPageBuilder? page) => page; + + @override + Widget onPageBuilt(Widget page) => page; + + @override + void onPageDispose() {} + + @override + Future redirectDelegate(GetNavConfig route) => + SynchronousFuture(route); +} + +class MiddlewareRunner { + MiddlewareRunner(this._middlewares); + + final List? _middlewares; + + List _getMiddlewares() { + final _m = _middlewares ?? []; + return _m + ..sort( + (a, b) => (a.priority ?? 0).compareTo(b.priority ?? 0), + ); + } + + GetPage? runOnPageCalled(GetPage? page) { + _getMiddlewares().forEach((element) { + page = element.onPageCalled(page); + }); + return page; + } + + RouteSettings? runRedirect(String? route) { + RouteSettings? to; + for (final element in _getMiddlewares()) { + to = element.redirect(route); + if (to != null) { + break; + } + } + Get.log('Redirect to $to'); + return to; + } + + List? runOnBindingsStart(List? bindings) { + _getMiddlewares().forEach((element) { + bindings = element.onBindingsStart(bindings); + }); + return bindings; + } + + GetPageBuilder? runOnPageBuildStart(GetPageBuilder? page) { + _getMiddlewares().forEach((element) { + page = element.onPageBuildStart(page); + }); + return page; + } + + Widget runOnPageBuilt(Widget page) { + _getMiddlewares().forEach((element) { + page = element.onPageBuilt(page); + }); + return page; + } + + void runOnPageDispose() => + _getMiddlewares().forEach((element) => element.onPageDispose()); +} + +class PageRedirect { + GetPage? route; + GetPage? unknownRoute; + RouteSettings? settings; + bool isUnknown; + + PageRedirect({ + this.route, + this.unknownRoute, + this.isUnknown = false, + this.settings, + }); + + // redirect all pages that needes redirecting + GetPageRoute page() { + while (needRecheck()) {} + final _r = (isUnknown ? unknownRoute : route)!; + return GetPageRoute( + page: _r.page, + parameter: _r.parameters, + settings: isUnknown + ? RouteSettings( + name: _r.name, + arguments: settings!.arguments, + ) + : settings, + curve: _r.curve, + opaque: _r.opaque, + showCupertinoParallax: _r.showCupertinoParallax, + gestureWidth: _r.gestureWidth, + customTransition: _r.customTransition, + binding: _r.binding, + bindings: _r.bindings, + transitionDuration: + _r.transitionDuration ?? Get.defaultTransitionDuration, + transition: _r.transition, + popGesture: _r.popGesture, + fullscreenDialog: _r.fullscreenDialog, + middlewares: _r.middlewares, + ); + } + + // redirect all pages that needes redirecting + GetPageRoute getPageToRoute(GetPage rou, GetPage? unk) { + while (needRecheck()) {} + final _r = (isUnknown ? unk : rou)!; + + return GetPageRoute( + page: _r.page, + parameter: _r.parameters, + alignment: _r.alignment, + title: _r.title, + maintainState: _r.maintainState, + routeName: _r.name, + settings: _r, + curve: _r.curve, + showCupertinoParallax: _r.showCupertinoParallax, + gestureWidth: _r.gestureWidth, + opaque: _r.opaque, + customTransition: _r.customTransition, + binding: _r.binding, + bindings: _r.bindings, + transitionDuration: + _r.transitionDuration ?? Get.defaultTransitionDuration, + transition: _r.transition, + popGesture: _r.popGesture, + fullscreenDialog: _r.fullscreenDialog, + middlewares: _r.middlewares, + ); + } + + /// check if redirect is needed + bool needRecheck() { + if (settings == null && route != null) { + settings = route; + } + final match = Get.routeTree.matchRoute(settings!.name!); + Get.parameters = match.parameters; + + // No Match found + if (match.route == null) { + isUnknown = true; + return false; + } + + final runner = MiddlewareRunner(match.route!.middlewares); + route = runner.runOnPageCalled(match.route); + addPageParameter(route!); + + // No middlewares found return match. + if (match.route!.middlewares == null || match.route!.middlewares!.isEmpty) { + return false; + } + final newSettings = runner.runRedirect(settings!.name); + if (newSettings == null) { + return false; + } + settings = newSettings; + return true; + } + + void addPageParameter(GetPage route) { + if (route.parameters == null) return; + + final parameters = Get.parameters; + parameters.addEntries(route.parameters!.entries); + Get.parameters = parameters; + } +} diff --git a/siro_rider/packages/get/lib/get_navigation/src/routes/transitions_type.dart b/siro_rider/packages/get/lib/get_navigation/src/routes/transitions_type.dart new file mode 100644 index 0000000..38f4ab6 --- /dev/null +++ b/siro_rider/packages/get/lib/get_navigation/src/routes/transitions_type.dart @@ -0,0 +1,22 @@ +import 'package:flutter/widgets.dart'; + +enum Transition { + fade, + fadeIn, + rightToLeft, + leftToRight, + upToDown, + downToUp, + rightToLeftWithFade, + leftToRightWithFade, + zoom, + topLevel, + noTransition, + cupertino, + cupertinoDialog, + size, + circularReveal, + native, +} + +typedef GetPageBuilder = Widget Function(); diff --git a/siro_rider/packages/get/lib/get_navigation/src/snackbar/snackbar.dart b/siro_rider/packages/get/lib/get_navigation/src/snackbar/snackbar.dart new file mode 100644 index 0000000..4a92ca7 --- /dev/null +++ b/siro_rider/packages/get/lib/get_navigation/src/snackbar/snackbar.dart @@ -0,0 +1,660 @@ +import 'dart:async'; +import 'dart:ui'; + +import 'package:flutter/material.dart'; +import 'package:flutter/scheduler.dart'; + +import '../../../get_core/get_core.dart'; +import '../../get_navigation.dart'; + +typedef OnTap = void Function(GetSnackBar snack); + +typedef SnackbarStatusCallback = void Function(SnackbarStatus? status); + +@Deprecated('use GetSnackBar') +class GetBar extends GetSnackBar { + GetBar({ + Key? key, + String? title, + String? message, + Widget? titleText, + Widget? messageText, + Widget? icon, + bool shouldIconPulse = true, + double? maxWidth, + EdgeInsets margin = const EdgeInsets.all(0.0), + EdgeInsets padding = const EdgeInsets.all(16), + double borderRadius = 0.0, + Color? borderColor, + double borderWidth = 1.0, + Color backgroundColor = const Color(0xFF303030), + Color? leftBarIndicatorColor, + List? boxShadows, + Gradient? backgroundGradient, + Widget? mainButton, + OnTap? onTap, + Duration? duration, + bool isDismissible = true, + DismissDirection? dismissDirection, + bool showProgressIndicator = false, + AnimationController? progressIndicatorController, + Color? progressIndicatorBackgroundColor, + Animation? progressIndicatorValueColor, + SnackPosition snackPosition = SnackPosition.BOTTOM, + SnackStyle snackStyle = SnackStyle.FLOATING, + Curve forwardAnimationCurve = Curves.easeOutCirc, + Curve reverseAnimationCurve = Curves.easeOutCirc, + Duration animationDuration = const Duration(seconds: 1), + double barBlur = 0.0, + double overlayBlur = 0.0, + Color overlayColor = Colors.transparent, + Form? userInputForm, + SnackbarStatusCallback? snackbarStatus, + }) : super( + key: key, + title: title, + message: message, + titleText: titleText, + messageText: messageText, + icon: icon, + shouldIconPulse: shouldIconPulse, + maxWidth: maxWidth, + margin: margin, + padding: padding, + borderRadius: borderRadius, + borderColor: borderColor, + borderWidth: borderWidth, + backgroundColor: backgroundColor, + leftBarIndicatorColor: leftBarIndicatorColor, + boxShadows: boxShadows, + backgroundGradient: backgroundGradient, + mainButton: mainButton, + onTap: onTap, + duration: duration, + isDismissible: isDismissible, + dismissDirection: dismissDirection, + showProgressIndicator: showProgressIndicator, + progressIndicatorController: progressIndicatorController, + progressIndicatorBackgroundColor: progressIndicatorBackgroundColor, + progressIndicatorValueColor: progressIndicatorValueColor, + snackPosition: snackPosition, + snackStyle: snackStyle, + forwardAnimationCurve: forwardAnimationCurve, + reverseAnimationCurve: reverseAnimationCurve, + animationDuration: animationDuration, + barBlur: barBlur, + overlayBlur: overlayBlur, + overlayColor: overlayColor, + userInputForm: userInputForm, + snackbarStatus: snackbarStatus, + ); +} + +class GetSnackBar extends StatefulWidget { + /// A callback for you to listen to the different Snack status + final SnackbarStatusCallback? snackbarStatus; + + /// The title displayed to the user + final String? title; + + /// The direction in which the SnackBar can be dismissed. + /// + /// Default is [DismissDirection.down] when + /// [snackPosition] == [SnackPosition.BOTTOM] and [DismissDirection.up] + /// when [snackPosition] == [SnackPosition.TOP] + final DismissDirection? dismissDirection; + + /// The message displayed to the user. + final String? message; + + /// Replaces [title]. Although this accepts a [Widget], it is meant + /// to receive [Text] or [RichText] + final Widget? titleText; + + /// Replaces [message]. Although this accepts a [Widget], it is meant + /// to receive [Text] or [RichText] + final Widget? messageText; + + /// Will be ignored if [backgroundGradient] is not null + final Color backgroundColor; + + /// If not null, shows a left vertical colored bar on notification. + /// It is not possible to use it with a [Form] and I do not recommend + /// using it with [LinearProgressIndicator] + final Color? leftBarIndicatorColor; + + /// [boxShadows] The shadows generated by Snack. Leave it null + /// if you don't want a shadow. + /// You can use more than one if you feel the need. + /// Check (this example)[https://github.com/flutter/flutter/blob/master/packages/flutter/lib/src/material/shadows.dart] + final List? boxShadows; + + /// Give to GetSnackbar a gradient background. + /// It Makes [backgroundColor] be ignored. + final Gradient? backgroundGradient; + + /// You can use any widget here, but I recommend [Icon] or [Image] as + /// indication of what kind + /// of message you are displaying. Other widgets may break the layout + final Widget? icon; + + /// An option to animate the icon (if present). Defaults to true. + final bool shouldIconPulse; + + /// (optional) An action that the user can take based on the snack bar. + /// + /// For example, the snack bar might let the user undo the operation that + /// prompted the snackbar. + final Widget? mainButton; + + /// A callback that registers the user's click anywhere. + /// An alternative to [mainButton] + final OnTap? onTap; + + /// How long until Snack will hide itself (be dismissed). + /// To make it indefinite, leave it null. + final Duration? duration; + + /// True if you want to show a [LinearProgressIndicator]. + final bool showProgressIndicator; + + /// An optional [AnimationController] when you want to control the + /// progress of your [LinearProgressIndicator]. + final AnimationController? progressIndicatorController; + + /// A [LinearProgressIndicator] configuration parameter. + final Color? progressIndicatorBackgroundColor; + + /// A [LinearProgressIndicator] configuration parameter. + final Animation? progressIndicatorValueColor; + + /// Determines if the user can swipe or click the overlay + /// (if [overlayBlur] > 0) to dismiss. + /// It is recommended that you set [duration] != null if this is false. + /// If the user swipes to dismiss or clicks the overlay, no value + /// will be returned. + final bool isDismissible; + + /// Used to limit Snack width (usually on large screens) + final double? maxWidth; + + /// Adds a custom margin to Snack + final EdgeInsets margin; + + /// Adds a custom padding to Snack + /// The default follows material design guide line + final EdgeInsets padding; + + /// Adds a radius to all corners of Snack. Best combined with [margin]. + /// I do not recommend using it with [showProgressIndicator] + /// or [leftBarIndicatorColor]. + final double borderRadius; + + /// Adds a border to every side of Snack + /// I do not recommend using it with [showProgressIndicator] + /// or [leftBarIndicatorColor]. + final Color? borderColor; + + /// Changes the width of the border if [borderColor] is specified + final double? borderWidth; + + /// Snack can be based on [SnackPosition.TOP] or on [SnackPosition.BOTTOM] + /// of your screen. + /// [SnackPosition.BOTTOM] is the default. + final SnackPosition snackPosition; + + /// Snack can be floating or be grounded to the edge of the screen. + /// If grounded, I do not recommend using [margin] or [borderRadius]. + /// [SnackStyle.FLOATING] is the default + /// If grounded, I do not recommend using a [backgroundColor] with + /// transparency or [barBlur] + final SnackStyle snackStyle; + + /// The [Curve] animation used when show() is called. + /// [Curves.easeOut] is default + final Curve forwardAnimationCurve; + + /// The [Curve] animation used when dismiss() is called. + /// [Curves.fastOutSlowIn] is default + final Curve reverseAnimationCurve; + + /// Use it to speed up or slow down the animation duration + final Duration animationDuration; + + /// Default is 0.0. If different than 0.0, blurs only Snack's background. + /// To take effect, make sure your [backgroundColor] has some opacity. + /// The greater the value, the greater the blur. + final double barBlur; + + /// Default is 0.0. If different than 0.0, creates a blurred + /// overlay that prevents the user from interacting with the screen. + /// The greater the value, the greater the blur. + final double overlayBlur; + + /// Default is [Colors.transparent]. Only takes effect if [overlayBlur] > 0.0. + /// Make sure you use a color with transparency here e.g. + /// Colors.grey[600].withOpacity(0.2). + final Color? overlayColor; + + /// A [TextFormField] in case you want a simple user input. + /// Every other widget is ignored if this is not null. + final Form? userInputForm; + + const GetSnackBar({ + Key? key, + this.title, + this.message, + this.titleText, + this.messageText, + this.icon, + this.shouldIconPulse = true, + this.maxWidth, + this.margin = const EdgeInsets.all(0.0), + this.padding = const EdgeInsets.all(16), + this.borderRadius = 0.0, + this.borderColor, + this.borderWidth = 1.0, + this.backgroundColor = const Color(0xFF303030), + this.leftBarIndicatorColor, + this.boxShadows, + this.backgroundGradient, + this.mainButton, + this.onTap, + this.duration, + this.isDismissible = true, + this.dismissDirection, + this.showProgressIndicator = false, + this.progressIndicatorController, + this.progressIndicatorBackgroundColor, + this.progressIndicatorValueColor, + this.snackPosition = SnackPosition.BOTTOM, + this.snackStyle = SnackStyle.FLOATING, + this.forwardAnimationCurve = Curves.easeOutCirc, + this.reverseAnimationCurve = Curves.easeOutCirc, + this.animationDuration = const Duration(seconds: 1), + this.barBlur = 0.0, + this.overlayBlur = 0.0, + this.overlayColor = Colors.transparent, + this.userInputForm, + this.snackbarStatus, + }) : super(key: key); + + @override + State createState() => GetSnackBarState(); + + /// Show the snack. It's call [SnackbarStatus.OPENING] state + /// followed by [SnackbarStatus.OPEN] + SnackbarController show() { + return Get.showSnackbar(this); + } +} + +class GetSnackBarState extends State + with TickerProviderStateMixin { + AnimationController? _fadeController; + late Animation _fadeAnimation; + + final Widget _emptyWidget = SizedBox(width: 0.0, height: 0.0); + final double _initialOpacity = 1.0; + final double _finalOpacity = 0.4; + + final Duration _pulseAnimationDuration = Duration(seconds: 1); + + late bool _isTitlePresent; + late double _messageTopMargin; + + FocusScopeNode? _focusNode; + late FocusAttachment _focusAttachment; + + final Completer _boxHeightCompleter = Completer(); + + late CurvedAnimation _progressAnimation; + + final _backgroundBoxKey = GlobalKey(); + + double get buttonPadding { + if (widget.padding.right - 12 < 0) { + return 4; + } else { + return widget.padding.right - 12; + } + } + + RowStyle get _rowStyle { + if (widget.mainButton != null && widget.icon == null) { + return RowStyle.action; + } else if (widget.mainButton == null && widget.icon != null) { + return RowStyle.icon; + } else if (widget.mainButton != null && widget.icon != null) { + return RowStyle.all; + } else { + return RowStyle.none; + } + } + + @override + Widget build(BuildContext context) { + return Align( + heightFactor: 1.0, + child: Material( + color: widget.snackStyle == SnackStyle.FLOATING + ? Colors.transparent + : widget.backgroundColor, + child: SafeArea( + minimum: widget.snackPosition == SnackPosition.BOTTOM + ? EdgeInsets.only( + bottom: MediaQuery.of(context).viewInsets.bottom) + : EdgeInsets.only(top: MediaQuery.of(context).padding.top), + bottom: widget.snackPosition == SnackPosition.BOTTOM, + top: widget.snackPosition == SnackPosition.TOP, + left: false, + right: false, + child: Stack( + children: [ + FutureBuilder( + future: _boxHeightCompleter.future, + builder: (context, snapshot) { + if (snapshot.hasData) { + if (widget.barBlur == 0) { + return _emptyWidget; + } + return ClipRRect( + borderRadius: BorderRadius.circular(widget.borderRadius), + child: BackdropFilter( + filter: ImageFilter.blur( + sigmaX: widget.barBlur, sigmaY: widget.barBlur), + child: Container( + height: snapshot.data!.height, + width: snapshot.data!.width, + decoration: BoxDecoration( + color: Colors.transparent, + borderRadius: + BorderRadius.circular(widget.borderRadius), + ), + ), + ), + ); + } else { + return _emptyWidget; + } + }, + ), + if (widget.userInputForm != null) + _containerWithForm() + else + _containerWithoutForm() + ], + ), + ), + ), + ); + } + + @override + void dispose() { + _fadeController?.dispose(); + widget.progressIndicatorController?.removeListener(_updateProgress); + widget.progressIndicatorController?.dispose(); + + _focusAttachment.detach(); + _focusNode!.dispose(); + super.dispose(); + } + + @override + void initState() { + super.initState(); + + assert( + widget.userInputForm != null || + ((widget.message != null && widget.message!.isNotEmpty) || + widget.messageText != null), + ''' +You need to either use message[String], or messageText[Widget] or define a userInputForm[Form] in GetSnackbar'''); + + _isTitlePresent = (widget.title != null || widget.titleText != null); + _messageTopMargin = _isTitlePresent ? 6.0 : widget.padding.top; + + _configureLeftBarFuture(); + _configureProgressIndicatorAnimation(); + + if (widget.icon != null && widget.shouldIconPulse) { + _configurePulseAnimation(); + _fadeController?.forward(); + } + + _focusNode = FocusScopeNode(); + _focusAttachment = _focusNode!.attach(context); + } + + Widget _buildLeftBarIndicator() { + if (widget.leftBarIndicatorColor != null) { + return FutureBuilder( + future: _boxHeightCompleter.future, + builder: (buildContext, snapshot) { + if (snapshot.hasData) { + return Container( + color: widget.leftBarIndicatorColor, + width: 5.0, + height: snapshot.data!.height, + ); + } else { + return _emptyWidget; + } + }, + ); + } else { + return _emptyWidget; + } + } + + void _configureLeftBarFuture() { + ambiguate(SchedulerBinding.instance)?.addPostFrameCallback( + (_) { + final keyContext = _backgroundBoxKey.currentContext; + if (keyContext != null) { + final box = keyContext.findRenderObject() as RenderBox; + _boxHeightCompleter.complete(box.size); + } + }, + ); + } + + void _configureProgressIndicatorAnimation() { + if (widget.showProgressIndicator && + widget.progressIndicatorController != null) { + widget.progressIndicatorController!.addListener(_updateProgress); + + _progressAnimation = CurvedAnimation( + curve: Curves.linear, parent: widget.progressIndicatorController!); + } + } + + void _configurePulseAnimation() { + _fadeController = + AnimationController(vsync: this, duration: _pulseAnimationDuration); + _fadeAnimation = Tween(begin: _initialOpacity, end: _finalOpacity).animate( + CurvedAnimation( + parent: _fadeController!, + curve: Curves.linear, + ), + ); + + _fadeController!.addStatusListener((status) { + if (status == AnimationStatus.completed) { + _fadeController!.reverse(); + } + if (status == AnimationStatus.dismissed) { + _fadeController!.forward(); + } + }); + + _fadeController!.forward(); + } + + Widget _containerWithForm() { + return Container( + key: _backgroundBoxKey, + constraints: widget.maxWidth != null + ? BoxConstraints(maxWidth: widget.maxWidth!) + : null, + decoration: BoxDecoration( + color: widget.backgroundColor, + gradient: widget.backgroundGradient, + boxShadow: widget.boxShadows, + borderRadius: BorderRadius.circular(widget.borderRadius), + border: widget.borderColor != null + ? Border.all( + color: widget.borderColor!, + width: widget.borderWidth!, + ) + : null, + ), + child: Padding( + padding: const EdgeInsets.only( + left: 8.0, right: 8.0, bottom: 8.0, top: 16.0), + child: FocusScope( + child: widget.userInputForm!, + node: _focusNode, + autofocus: true, + ), + ), + ); + } + + Widget _containerWithoutForm() { + final iconPadding = widget.padding.left > 16.0 ? widget.padding.left : 0.0; + final left = _rowStyle == RowStyle.icon || _rowStyle == RowStyle.all + ? 4.0 + : widget.padding.left; + final right = _rowStyle == RowStyle.action || _rowStyle == RowStyle.all + ? 8.0 + : widget.padding.right; + return Container( + key: _backgroundBoxKey, + constraints: widget.maxWidth != null + ? BoxConstraints(maxWidth: widget.maxWidth!) + : null, + decoration: BoxDecoration( + color: widget.backgroundColor, + gradient: widget.backgroundGradient, + boxShadow: widget.boxShadows, + borderRadius: BorderRadius.circular(widget.borderRadius), + border: widget.borderColor != null + ? Border.all(color: widget.borderColor!, width: widget.borderWidth!) + : null, + ), + child: Column( + mainAxisSize: MainAxisSize.min, + children: [ + widget.showProgressIndicator + ? LinearProgressIndicator( + value: widget.progressIndicatorController != null + ? _progressAnimation.value + : null, + backgroundColor: widget.progressIndicatorBackgroundColor, + valueColor: widget.progressIndicatorValueColor, + ) + : _emptyWidget, + Row( + mainAxisSize: MainAxisSize.max, + children: [ + _buildLeftBarIndicator(), + if (_rowStyle == RowStyle.icon || _rowStyle == RowStyle.all) + ConstrainedBox( + constraints: + BoxConstraints.tightFor(width: 42.0 + iconPadding), + child: _getIcon(), + ), + Expanded( + flex: 1, + child: Column( + crossAxisAlignment: CrossAxisAlignment.stretch, + mainAxisSize: MainAxisSize.min, + children: [ + if (_isTitlePresent) + Padding( + padding: EdgeInsets.only( + top: widget.padding.top, + left: left, + right: right, + ), + child: widget.titleText ?? + Text( + widget.title ?? "", + style: TextStyle( + fontSize: 16.0, + color: Colors.white, + fontWeight: FontWeight.bold, + ), + ), + ) + else + _emptyWidget, + Padding( + padding: EdgeInsets.only( + top: _messageTopMargin, + left: left, + right: right, + bottom: widget.padding.bottom, + ), + child: widget.messageText ?? + Text( + widget.message ?? "", + style: + TextStyle(fontSize: 14.0, color: Colors.white), + ), + ), + ], + ), + ), + if (_rowStyle == RowStyle.action || _rowStyle == RowStyle.all) + Padding( + padding: EdgeInsets.only(right: buttonPadding), + child: widget.mainButton, + ), + ], + ), + ], + ), + ); + } + + Widget? _getIcon() { + if (widget.icon != null && widget.icon is Icon && widget.shouldIconPulse) { + return FadeTransition( + opacity: _fadeAnimation, + child: widget.icon, + ); + } else if (widget.icon != null) { + return widget.icon; + } else { + return _emptyWidget; + } + } + + void _updateProgress() => setState(() {}); +} + +enum RowStyle { + icon, + action, + all, + none, +} + +/// Indicates Status of snackbar +/// [SnackbarStatus.OPEN] Snack is fully open, [SnackbarStatus.CLOSED] Snackbar +/// has closed, +/// [SnackbarStatus.OPENING] Starts with the opening animation and ends +/// with the full +/// snackbar display, [SnackbarStatus.CLOSING] Starts with the closing animation +/// and ends +/// with the full snackbar dispose +enum SnackbarStatus { OPEN, CLOSED, OPENING, CLOSING } + +/// Indicates if snack is going to start at the [TOP] or at the [BOTTOM] +enum SnackPosition { TOP, BOTTOM } + +/// Indicates if snack will be attached to the edge of the screen or not +enum SnackStyle { FLOATING, GROUNDED } diff --git a/siro_rider/packages/get/lib/get_navigation/src/snackbar/snackbar_controller.dart b/siro_rider/packages/get/lib/get_navigation/src/snackbar/snackbar_controller.dart new file mode 100644 index 0000000..bcd7f9f --- /dev/null +++ b/siro_rider/packages/get/lib/get_navigation/src/snackbar/snackbar_controller.dart @@ -0,0 +1,372 @@ +import 'dart:async'; +import 'dart:math'; +import 'dart:ui'; + +import 'package:flutter/material.dart'; + +import '../../../get.dart'; + +class SnackbarController { + static final _snackBarQueue = _SnackBarQueue(); + static bool get isSnackbarBeingShown => _snackBarQueue._isJobInProgress; + final key = GlobalKey(); + + late Animation _filterBlurAnimation; + late Animation _filterColorAnimation; + + final GetSnackBar snackbar; + final _transitionCompleter = Completer(); + + late SnackbarStatusCallback? _snackbarStatus; + late final Alignment? _initialAlignment; + late final Alignment? _endAlignment; + + bool _wasDismissedBySwipe = false; + + bool _onTappedDismiss = false; + + Timer? _timer; + + /// The animation that drives the route's transition and the previous route's + /// forward transition. + late final Animation _animation; + + /// The animation controller that the route uses to drive the transitions. + /// + /// The animation itself is exposed by the [animation] property. + late final AnimationController _controller; + + SnackbarStatus? _currentStatus; + + final _overlayEntries = []; + + OverlayState? _overlayState; + + SnackbarController(this.snackbar); + + Future get future => _transitionCompleter.future; + + /// Close the snackbar with animation + Future close({bool withAnimations = true}) async { + if (!withAnimations) { + _removeOverlay(); + return; + } + _removeEntry(); + await future; + } + + /// Adds GetSnackbar to a view queue. + /// Only one GetSnackbar will be displayed at a time, and this method returns + /// a future to when the snackbar disappears. + Future show() { + return _snackBarQueue._addJob(this); + } + + void _cancelTimer() { + if (_timer != null && _timer!.isActive) { + _timer!.cancel(); + } + } + + // ignore: avoid_returning_this + void _configureAlignment(SnackPosition snackPosition) { + switch (snackbar.snackPosition) { + case SnackPosition.TOP: + { + _initialAlignment = const Alignment(-1.0, -2.0); + _endAlignment = const Alignment(-1.0, -1.0); + break; + } + case SnackPosition.BOTTOM: + { + _initialAlignment = const Alignment(-1.0, 2.0); + _endAlignment = const Alignment(-1.0, 1.0); + break; + } + } + } + + void _configureOverlay() { + _overlayState = Overlay.of(Get.overlayContext!); + _overlayEntries.clear(); + _overlayEntries.addAll(_createOverlayEntries(_getBodyWidget())); + _overlayState!.insertAll(_overlayEntries); + _configureSnackBarDisplay(); + } + + void _configureSnackBarDisplay() { + assert(!_transitionCompleter.isCompleted, + 'Cannot configure a snackbar after disposing it.'); + _controller = _createAnimationController(); + _configureAlignment(snackbar.snackPosition); + _snackbarStatus = snackbar.snackbarStatus; + _filterBlurAnimation = _createBlurFilterAnimation(); + _filterColorAnimation = _createColorOverlayColor(); + _animation = _createAnimation(); + _animation.addStatusListener(_handleStatusChanged); + _configureTimer(); + _controller.forward(); + } + + void _configureTimer() { + if (snackbar.duration != null) { + if (_timer != null && _timer!.isActive) { + _timer!.cancel(); + } + _timer = Timer(snackbar.duration!, _removeEntry); + } else { + if (_timer != null) { + _timer!.cancel(); + } + } + } + + /// Called to create the animation that exposes the current progress of + /// the transition controlled by the animation controller created by + /// `createAnimationController()`. + Animation _createAnimation() { + assert(!_transitionCompleter.isCompleted, + 'Cannot create a animation from a disposed snackbar'); + return AlignmentTween(begin: _initialAlignment, end: _endAlignment).animate( + CurvedAnimation( + parent: _controller, + curve: snackbar.forwardAnimationCurve, + reverseCurve: snackbar.reverseAnimationCurve, + ), + ); + } + + /// Called to create the animation controller that will drive the transitions + /// to this route from the previous one, and back to the previous route + /// from this one. + AnimationController _createAnimationController() { + assert(!_transitionCompleter.isCompleted, + 'Cannot create a animationController from a disposed snackbar'); + assert(snackbar.animationDuration >= Duration.zero); + return AnimationController( + duration: snackbar.animationDuration, + debugLabel: '$runtimeType', + vsync: _overlayState!, + ); + } + + Animation _createBlurFilterAnimation() { + return Tween(begin: 0.0, end: snackbar.overlayBlur).animate( + CurvedAnimation( + parent: _controller, + curve: const Interval( + 0.0, + 0.35, + curve: Curves.easeInOutCirc, + ), + ), + ); + } + + Animation _createColorOverlayColor() { + return ColorTween( + begin: const Color(0x00000000), end: snackbar.overlayColor) + .animate( + CurvedAnimation( + parent: _controller, + curve: const Interval( + 0.0, + 0.35, + curve: Curves.easeInOutCirc, + ), + ), + ); + } + + Iterable _createOverlayEntries(Widget child) { + return [ + if (snackbar.overlayBlur > 0.0) ...[ + OverlayEntry( + builder: (context) => GestureDetector( + onTap: () { + if (snackbar.isDismissible && !_onTappedDismiss) { + _onTappedDismiss = true; + close(); + } + }, + child: AnimatedBuilder( + animation: _filterBlurAnimation, + builder: (context, child) { + return BackdropFilter( + filter: ImageFilter.blur( + sigmaX: max(0.001, _filterBlurAnimation.value), + sigmaY: max(0.001, _filterBlurAnimation.value), + ), + child: Container( + constraints: const BoxConstraints.expand(), + color: _filterColorAnimation.value, + ), + ); + }, + ), + ), + maintainState: false, + opaque: false, + ), + ], + OverlayEntry( + builder: (context) => Semantics( + child: AlignTransition( + alignment: _animation, + child: snackbar.isDismissible + ? _getDismissibleSnack(child) + : _getSnackbarContainer(child), + ), + focused: false, + container: true, + explicitChildNodes: true, + ), + maintainState: false, + opaque: false, + ), + ]; + } + + Widget _getBodyWidget() { + return Builder(builder: (_) { + return GestureDetector( + child: snackbar, + onTap: snackbar.onTap != null + ? () => snackbar.onTap?.call(snackbar) + : null, + ); + }); + } + + DismissDirection _getDefaultDismissDirection() { + if (snackbar.snackPosition == SnackPosition.TOP) { + return DismissDirection.up; + } + return DismissDirection.down; + } + + Widget _getDismissibleSnack(Widget child) { + return Dismissible( + direction: snackbar.dismissDirection ?? _getDefaultDismissDirection(), + resizeDuration: null, + confirmDismiss: (_) { + if (_currentStatus == SnackbarStatus.OPENING || + _currentStatus == SnackbarStatus.CLOSING) { + return Future.value(false); + } + return Future.value(true); + }, + key: const Key('dismissible'), + onDismissed: (_) { + _wasDismissedBySwipe = true; + _removeEntry(); + }, + child: _getSnackbarContainer(child), + ); + } + + Widget _getSnackbarContainer(Widget child) { + return Container( + margin: snackbar.margin, + child: child, + ); + } + + void _handleStatusChanged(AnimationStatus status) { + switch (status) { + case AnimationStatus.completed: + _currentStatus = SnackbarStatus.OPEN; + _snackbarStatus?.call(_currentStatus); + if (_overlayEntries.isNotEmpty) _overlayEntries.first.opaque = false; + + break; + case AnimationStatus.forward: + _currentStatus = SnackbarStatus.OPENING; + _snackbarStatus?.call(_currentStatus); + break; + case AnimationStatus.reverse: + _currentStatus = SnackbarStatus.CLOSING; + _snackbarStatus?.call(_currentStatus); + if (_overlayEntries.isNotEmpty) _overlayEntries.first.opaque = false; + break; + case AnimationStatus.dismissed: + assert(!_overlayEntries.first.opaque); + _currentStatus = SnackbarStatus.CLOSED; + _snackbarStatus?.call(_currentStatus); + _removeOverlay(); + break; + } + } + + void _removeEntry() { + assert( + !_transitionCompleter.isCompleted, + 'Cannot remove entry from a disposed snackbar', + ); + + _cancelTimer(); + + if (_wasDismissedBySwipe) { + Timer(const Duration(milliseconds: 200), _controller.reset); + _wasDismissedBySwipe = false; + } else { + _controller.reverse(); + } + } + + void _removeOverlay() { + for (var element in _overlayEntries) { + element.remove(); + } + + assert(!_transitionCompleter.isCompleted, + 'Cannot remove overlay from a disposed snackbar'); + _controller.dispose(); + _overlayEntries.clear(); + _transitionCompleter.complete(); + } + + Future _show() { + _configureOverlay(); + return future; + } + + static void cancelAllSnackbars() { + _snackBarQueue._cancelAllJobs(); + } + + static Future closeCurrentSnackbar() async { + await _snackBarQueue._closeCurrentJob(); + } +} + +class _SnackBarQueue { + final _queue = GetQueue(); + final _snackbarList = []; + + SnackbarController? get _currentSnackbar { + if (_snackbarList.isEmpty) return null; + return _snackbarList.first; + } + + bool get _isJobInProgress => _snackbarList.isNotEmpty; + + Future _addJob(SnackbarController job) async { + _snackbarList.add(job); + final data = await _queue.add(job._show); + _snackbarList.remove(job); + return data; + } + + Future _cancelAllJobs() async { + await _currentSnackbar?.close(); + _queue.cancelAllJobs(); + _snackbarList.clear(); + } + + Future _closeCurrentJob() async { + if (_currentSnackbar == null) return; + await _currentSnackbar!.close(); + } +} diff --git a/siro_rider/packages/get/lib/get_rx/get_rx.dart b/siro_rider/packages/get/lib/get_rx/get_rx.dart new file mode 100644 index 0000000..88565d8 --- /dev/null +++ b/siro_rider/packages/get/lib/get_rx/get_rx.dart @@ -0,0 +1,5 @@ +library get_rx; + +export 'src/rx_stream/rx_stream.dart'; +export 'src/rx_types/rx_types.dart'; +export 'src/rx_workers/rx_workers.dart'; diff --git a/siro_rider/packages/get/lib/get_rx/src/rx_stream/get_stream.dart b/siro_rider/packages/get/lib/get_rx/src/rx_stream/get_stream.dart new file mode 100644 index 0000000..13c5a6c --- /dev/null +++ b/siro_rider/packages/get/lib/get_rx/src/rx_stream/get_stream.dart @@ -0,0 +1,209 @@ +part of rx_stream; + +/// [GetStream] is the lightest and most performative way of working +/// with events at Dart. You sintaxe is like StreamController, but it works +/// with simple callbacks. In this way, every event calls only one function. +/// There is no buffering, to very low memory consumption. +/// event [add] will add a object to stream. [addError] will add a error +/// to stream. [listen] is a very light StreamSubscription interface. +/// Is possible take the last value with [value] property. +class GetStream { + void Function()? onListen; + void Function()? onPause; + void Function()? onResume; + FutureOr Function()? onCancel; + + GetStream({this.onListen, this.onPause, this.onResume, this.onCancel}); + List>? _onData = >[]; + + bool? _isBusy = false; + + FutureOr removeSubscription(LightSubscription subs) async { + if (!_isBusy!) { + return _onData!.remove(subs); + } else { + await Future.delayed(Duration.zero); + return _onData?.remove(subs); + } + } + + FutureOr addSubscription(LightSubscription subs) async { + if (!_isBusy!) { + return _onData!.add(subs); + } else { + await Future.delayed(Duration.zero); + return _onData!.add(subs); + } + } + + int? get length => _onData?.length; + + bool get hasListeners => _onData!.isNotEmpty; + + void _notifyData(T data) { + _isBusy = true; + for (final item in _onData!) { + if (!item.isPaused) { + item._data?.call(data); + } + } + _isBusy = false; + } + + void _notifyError(Object error, [StackTrace? stackTrace]) { + assert(!isClosed, 'You cannot add errors to a closed stream.'); + _isBusy = true; + var itemsToRemove = >[]; + for (final item in _onData!) { + if (!item.isPaused) { + if (stackTrace != null) { + item._onError?.call(error, stackTrace); + } else { + item._onError?.call(error); + } + + if (item.cancelOnError ?? false) { + //item.cancel?.call(); + itemsToRemove.add(item); + item.pause(); + item._onDone?.call(); + } + } + } + for (final item in itemsToRemove) { + _onData!.remove(item); + } + _isBusy = false; + } + + void _notifyDone() { + assert(!isClosed, 'You cannot close a closed stream.'); + _isBusy = true; + for (final item in _onData!) { + if (!item.isPaused) { + item._onDone?.call(); + } + } + _isBusy = false; + } + + T? _value; + + T? get value => _value; + + void add(T event) { + assert(!isClosed, 'You cannot add event to closed Stream'); + _value = event; + _notifyData(event); + } + + bool get isClosed => _onData == null; + + void addError(Object error, [StackTrace? stackTrace]) { + assert(!isClosed, 'You cannot add error to closed Stream'); + _notifyError(error, stackTrace); + } + + void close() { + assert(!isClosed, 'You cannot close a closed Stream'); + _notifyDone(); + _onData = null; + _isBusy = null; + _value = null; + } + + LightSubscription listen(void Function(T event) onData, + {Function? onError, void Function()? onDone, bool? cancelOnError}) { + final subs = LightSubscription( + removeSubscription, + onPause: onPause, + onResume: onResume, + onCancel: onCancel, + ) + ..onData(onData) + ..onError(onError) + ..onDone(onDone) + ..cancelOnError = cancelOnError; + addSubscription(subs); + onListen?.call(); + return subs; + } + + Stream get stream => + GetStreamTransformation(addSubscription, removeSubscription); +} + +class LightSubscription extends StreamSubscription { + final RemoveSubscription _removeSubscription; + LightSubscription(this._removeSubscription, + {this.onPause, this.onResume, this.onCancel}); + final void Function()? onPause; + final void Function()? onResume; + final FutureOr Function()? onCancel; + + bool? cancelOnError = false; + + @override + Future cancel() { + _removeSubscription(this); + onCancel?.call(); + return Future.value(); + } + + OnData? _data; + + Function? _onError; + + Callback? _onDone; + + bool _isPaused = false; + + @override + void onData(OnData? handleData) => _data = handleData; + + @override + void onError(Function? handleError) => _onError = handleError; + + @override + void onDone(Callback? handleDone) => _onDone = handleDone; + + @override + void pause([Future? resumeSignal]) { + _isPaused = true; + onPause?.call(); + } + + @override + void resume() { + _isPaused = false; + onResume?.call(); + } + + @override + bool get isPaused => _isPaused; + + @override + Future asFuture([E? futureValue]) => Future.value(futureValue); +} + +class GetStreamTransformation extends Stream { + final AddSubscription _addSubscription; + final RemoveSubscription _removeSubscription; + GetStreamTransformation(this._addSubscription, this._removeSubscription); + + @override + LightSubscription listen(void Function(T event)? onData, + {Function? onError, void Function()? onDone, bool? cancelOnError}) { + final subs = LightSubscription(_removeSubscription) + ..onData(onData) + ..onError(onError) + ..onDone(onDone); + _addSubscription(subs); + return subs; + } +} + +typedef RemoveSubscription = FutureOr Function( + LightSubscription subs); + +typedef AddSubscription = FutureOr Function(LightSubscription subs); diff --git a/siro_rider/packages/get/lib/get_rx/src/rx_stream/mini_stream.dart b/siro_rider/packages/get/lib/get_rx/src/rx_stream/mini_stream.dart new file mode 100644 index 0000000..e08e463 --- /dev/null +++ b/siro_rider/packages/get/lib/get_rx/src/rx_stream/mini_stream.dart @@ -0,0 +1,203 @@ +part of rx_stream; + +class Node { + T? data; + Node? next; + Node({this.data, this.next}); +} + +class MiniSubscription { + const MiniSubscription( + this.data, this.onError, this.onDone, this.cancelOnError, this.listener); + final OnData data; + final Function? onError; + final Callback? onDone; + final bool cancelOnError; + + Future cancel() async => listener.removeListener(this); + + final FastList listener; +} + +class MiniStream { + FastList listenable = FastList(); + + late T _value; + + T get value => _value; + + set value(T val) { + add(val); + } + + void add(T event) { + _value = event; + listenable._notifyData(event); + } + + void addError(Object error, [StackTrace? stackTrace]) { + listenable._notifyError(error, stackTrace); + } + + int get length => listenable.length; + + bool get hasListeners => listenable.isNotEmpty; + + bool get isClosed => _isClosed; + + MiniSubscription listen(void Function(T event) onData, + {Function? onError, + void Function()? onDone, + bool cancelOnError = false}) { + final subs = MiniSubscription( + onData, + onError, + onDone, + cancelOnError, + listenable, + ); + listenable.addListener(subs); + return subs; + } + + bool _isClosed = false; + + void close() { + if (_isClosed) { + throw 'You can not close a closed Stream'; + } + listenable._notifyDone(); + listenable.clear(); + _isClosed = true; + } +} + +class FastList { + Node>? _head; + + void _notifyData(T data) { + var currentNode = _head; + do { + currentNode?.data?.data(data); + currentNode = currentNode?.next; + } while (currentNode != null); + } + + void _notifyDone() { + var currentNode = _head; + do { + currentNode?.data?.onDone?.call(); + currentNode = currentNode?.next; + } while (currentNode != null); + } + + void _notifyError(Object error, [StackTrace? stackTrace]) { + var currentNode = _head; + while (currentNode != null) { + currentNode.data!.onError?.call(error, stackTrace); + currentNode = currentNode.next; + } + } + + /// Checks if this list is empty + bool get isEmpty => _head == null; + + bool get isNotEmpty => !isEmpty; + + /// Returns the length of this list + int get length { + var length = 0; + var currentNode = _head; + + while (currentNode != null) { + currentNode = currentNode.next; + length++; + } + return length; + } + + /// Shows the element at position [position]. `null` for invalid positions. + MiniSubscription? _elementAt(int position) { + if (isEmpty || length < position || position < 0) return null; + + var node = _head; + var current = 0; + + while (current != position) { + node = node!.next; + current++; + } + return node!.data; + } + + /// Inserts [data] at the end of the list. + void addListener(MiniSubscription data) { + var newNode = Node(data: data); + + if (isEmpty) { + _head = newNode; + } else { + var currentNode = _head!; + while (currentNode.next != null) { + currentNode = currentNode.next!; + } + currentNode.next = newNode; + } + } + + bool contains(T element) { + var length = this.length; + for (var i = 0; i < length; i++) { + if (_elementAt(i) == element) return true; + if (length != this.length) { + throw ConcurrentModificationError(this); + } + } + return false; + } + + void removeListener(MiniSubscription element) { + var length = this.length; + for (var i = 0; i < length; i++) { + if (_elementAt(i) == element) { + _removeAt(i); + break; + } + } + } + + void clear() { + var length = this.length; + for (var i = 0; i < length; i++) { + _removeAt(i); + } + } + + MiniSubscription? _removeAt(int position) { + var index = 0; + var currentNode = _head; + Node>? previousNode; + + if (isEmpty || length < position || position < 0) { + throw Exception('Invalid position'); + } else if (position == 0) { + _head = _head!.next; + } else { + while (index != position) { + previousNode = currentNode; + currentNode = currentNode!.next; + index++; + } + + if (previousNode == null) { + _head = null; + } else { + previousNode.next = currentNode!.next; + } + + currentNode!.next = null; + } + + return currentNode!.data; + } +} diff --git a/siro_rider/packages/get/lib/get_rx/src/rx_stream/rx_stream.dart b/siro_rider/packages/get/lib/get_rx/src/rx_stream/rx_stream.dart new file mode 100644 index 0000000..ec08bb5 --- /dev/null +++ b/siro_rider/packages/get/lib/get_rx/src/rx_stream/rx_stream.dart @@ -0,0 +1,8 @@ +library rx_stream; + +import 'dart:async'; + +import '../rx_typedefs/rx_typedefs.dart'; + +part 'get_stream.dart'; +part 'mini_stream.dart'; diff --git a/siro_rider/packages/get/lib/get_rx/src/rx_typedefs/rx_typedefs.dart b/siro_rider/packages/get/lib/get_rx/src/rx_typedefs/rx_typedefs.dart new file mode 100644 index 0000000..74f82b7 --- /dev/null +++ b/siro_rider/packages/get/lib/get_rx/src/rx_typedefs/rx_typedefs.dart @@ -0,0 +1,3 @@ +typedef Condition = bool Function(); +typedef OnData = void Function(T data); +typedef Callback = void Function(); diff --git a/siro_rider/packages/get/lib/get_rx/src/rx_types/rx_core/rx_impl.dart b/siro_rider/packages/get/lib/get_rx/src/rx_types/rx_core/rx_impl.dart new file mode 100644 index 0000000..18c6e66 --- /dev/null +++ b/siro_rider/packages/get/lib/get_rx/src/rx_types/rx_core/rx_impl.dart @@ -0,0 +1,394 @@ +part of rx_types; + +/// global object that registers against `GetX` and `Obx`, and allows the +/// reactivity +/// of those `Widgets` and Rx values. + +mixin RxObjectMixin on NotifyManager { + late T _value; + + /// Makes a direct update of [value] adding it to the Stream + /// useful when you make use of Rx for custom Types to referesh your UI. + /// + /// Sample: + /// ``` + /// class Person { + /// String name, last; + /// int age; + /// Person({this.name, this.last, this.age}); + /// @override + /// String toString() => '$name $last, $age years old'; + /// } + /// + /// final person = Person(name: 'John', last: 'Doe', age: 18).obs; + /// person.value.name = 'Roi'; + /// person.refresh(); + /// print( person ); + /// ``` + void refresh() { + subject.add(value); + } + + /// updates the value to `null` and adds it to the Stream. + /// Even with null-safety coming, is still an important feature to support, as + /// `call()` doesn't accept `null` values. For instance, + /// `InputDecoration.errorText` has to be null to not show the "error state". + /// + /// Sample: + /// ``` + /// final inputError = ''.obs..nil(); + /// print('${inputError.runtimeType}: $inputError'); // outputs > RxString: null + /// ``` + // void nil() { + // subject.add(_value = null); + // } + + /// Makes this Rx looks like a function so you can update a new + /// value using `rx(someOtherValue)`. Practical to assign the Rx directly + /// to some Widget that has a signature ::onChange( value ) + /// + /// Example: + /// ``` + /// final myText = 'GetX rocks!'.obs; + /// + /// // in your Constructor, just to check it works :P + /// ever( myText, print ) ; + /// + /// // in your build(BuildContext) { + /// TextField( + /// onChanged: myText, + /// ), + ///``` + T call([T? v]) { + if (v != null) { + value = v; + } + return value; + } + + bool firstRebuild = true; + bool sentToStream = false; + + /// Same as `toString()` but using a getter. + String get string => value.toString(); + + @override + String toString() => value.toString(); + + /// Returns the json representation of `value`. + dynamic toJson() => value; + + /// This equality override works for _RxImpl instances and the internal + /// values. + @override + // ignore: avoid_equals_and_hash_code_on_mutable_classes + bool operator ==(Object o) { + // Todo, find a common implementation for the hashCode of different Types. + if (o is T) return value == o; + if (o is RxObjectMixin) return value == o.value; + return false; + } + + @override + // ignore: avoid_equals_and_hash_code_on_mutable_classes + int get hashCode => _value.hashCode; + + /// Updates the [value] and adds it to the stream, updating the observer + /// Widget, only if it's different from the previous value. + set value(T val) { + if (subject.isClosed) return; + sentToStream = false; + if (_value == val && !firstRebuild) return; + firstRebuild = false; + _value = val; + sentToStream = true; + subject.add(_value); + } + + /// Returns the current [value] + T get value { + RxInterface.proxy?.addListener(subject); + return _value; + } + + Stream get stream => subject.stream; + + /// Returns a [StreamSubscription] similar to [listen], but with the + /// added benefit that it primes the stream with the current [value], rather + /// than waiting for the next [value]. This should not be called in [onInit] + /// or anywhere else during the build process. + StreamSubscription listenAndPump(void Function(T event) onData, + {Function? onError, void Function()? onDone, bool? cancelOnError}) { + final subscription = listen( + onData, + onError: onError, + onDone: onDone, + cancelOnError: cancelOnError, + ); + + subject.add(value); + + return subscription; + } + + /// Binds an existing `Stream` to this Rx to keep the values in sync. + /// You can bind multiple sources to update the value. + /// Closing the subscription will happen automatically when the observer + /// Widget (`GetX` or `Obx`) gets unmounted from the Widget tree. + void bindStream(Stream stream) { + final listSubscriptions = + _subscriptions[subject] ??= []; + listSubscriptions.add(stream.listen((va) => value = va)); + } +} + +class RxNotifier = RxInterface with NotifyManager; + +mixin NotifyManager { + GetStream subject = GetStream(); + final _subscriptions = >{}; + + bool get canUpdate => _subscriptions.isNotEmpty; + + /// This is an internal method. + /// Subscribe to changes on the inner stream. + void addListener(GetStream rxGetx) { + if (!_subscriptions.containsKey(rxGetx)) { + final subs = rxGetx.listen((data) { + if (!subject.isClosed) subject.add(data); + }); + final listSubscriptions = + _subscriptions[rxGetx] ??= []; + listSubscriptions.add(subs); + } + } + + StreamSubscription listen( + void Function(T) onData, { + Function? onError, + void Function()? onDone, + bool? cancelOnError, + }) => + subject.listen( + onData, + onError: onError, + onDone: onDone, + cancelOnError: cancelOnError ?? false, + ); + + /// Closes the subscriptions for this Rx, releasing the resources. + void close() { + _subscriptions.forEach((getStream, _subscriptions) { + for (final subscription in _subscriptions) { + subscription.cancel(); + } + }); + + _subscriptions.clear(); + subject.close(); + } +} + +/// Base Rx class that manages all the stream logic for any Type. +abstract class _RxImpl extends RxNotifier with RxObjectMixin { + _RxImpl(T initial) { + _value = initial; + } + + void addError(Object error, [StackTrace? stackTrace]) { + subject.addError(error, stackTrace); + } + + Stream map(R mapper(T? data)) => stream.map(mapper); + + /// Uses a callback to update [value] internally, similar to [refresh], + /// but provides the current value as the argument. + /// Makes sense for custom Rx types (like Models). + /// + /// Sample: + /// ``` + /// class Person { + /// String name, last; + /// int age; + /// Person({this.name, this.last, this.age}); + /// @override + /// String toString() => '$name $last, $age years old'; + /// } + /// + /// final person = Person(name: 'John', last: 'Doe', age: 18).obs; + /// person.update((person) { + /// person.name = 'Roi'; + /// }); + /// print( person ); + /// ``` + void update(void fn(T? val)) { + fn(_value); + subject.add(_value); + } + + /// Following certain practices on Rx data, we might want to react to certain + /// listeners when a value has been provided, even if the value is the same. + /// At the moment, we ignore part of the process if we `.call(value)` with + /// the same value since it holds the value and there's no real + /// need triggering the entire process for the same value inside, but + /// there are other situations where we might be interested in + /// triggering this. + /// + /// For example, supposed we have a `int seconds = 2` and we want to animate + /// from invisible to visible a widget in two seconds: + /// RxEvent.call(seconds); + /// then after a click happens, you want to call a RxEvent.call(seconds). + /// By doing `call(seconds)`, if the value being held is the same, + /// the listeners won't trigger, hence we need this new `trigger` function. + /// This will refresh the listener of an AnimatedWidget and will keep + /// the value if the Rx is kept in memory. + /// Sample: + /// ``` + /// Rx secondsRx = RxInt(); + /// secondsRx.listen((value) => print("$value seconds set")); + /// + /// secondsRx.call(2); // This won't trigger any listener, since the value is the same + /// secondsRx.trigger(2); // This will trigger the listener independently from the value. + /// ``` + /// + void trigger(T v) { + var firstRebuild = this.firstRebuild; + value = v; + // If it's not the first rebuild, the listeners have been called already + // So we won't call them again. + if (!firstRebuild && !sentToStream) { + subject.add(v); + } + } +} + +class RxBool extends Rx { + RxBool(bool initial) : super(initial); + @override + String toString() { + return value ? "true" : "false"; + } +} + +class RxnBool extends Rx { + RxnBool([bool? initial]) : super(initial); + @override + String toString() { + return "$value"; + } +} + +extension RxBoolExt on Rx { + bool get isTrue => value; + + bool get isFalse => !isTrue; + + bool operator &(bool other) => other && value; + + bool operator |(bool other) => other || value; + + bool operator ^(bool other) => !other == value; + + /// Toggles the bool [value] between false and true. + /// A shortcut for `flag.value = !flag.value;` + /// FIXME: why return this? fluent interface is not + /// not really a dart thing since we have '..' operator + // ignore: avoid_returning_this + Rx toggle() { + subject.add(_value = !_value); + return this; + } +} + +extension RxnBoolExt on Rx { + bool? get isTrue => value; + + bool? get isFalse { + if (value != null) return !isTrue!; + return null; + } + + bool? operator &(bool other) { + if (value != null) { + return other && value!; + } + return null; + } + + bool? operator |(bool other) { + if (value != null) { + return other || value!; + } + return null; + } + + bool? operator ^(bool other) => !other == value; + + /// Toggles the bool [value] between false and true. + /// A shortcut for `flag.value = !flag.value;` + /// FIXME: why return this? fluent interface is not + /// not really a dart thing since we have '..' operator + // ignore: avoid_returning_this + Rx? toggle() { + if (_value != null) { + subject.add(_value = !_value!); + return this; + } + return null; + } +} + +/// Foundation class used for custom `Types` outside the common native Dart +/// types. +/// For example, any custom "Model" class, like User().obs will use `Rx` as +/// wrapper. +class Rx extends _RxImpl { + Rx(T initial) : super(initial); + + @override + dynamic toJson() { + try { + return (value as dynamic)?.toJson(); + } on Exception catch (_) { + throw '$T has not method [toJson]'; + } + } +} + +class Rxn extends Rx { + Rxn([T? initial]) : super(initial); + + @override + dynamic toJson() { + try { + return (value as dynamic)?.toJson(); + } on Exception catch (_) { + throw '$T has not method [toJson]'; + } + } +} + +extension StringExtension on String { + /// Returns a `RxString` with [this] `String` as initial value. + RxString get obs => RxString(this); +} + +extension IntExtension on int { + /// Returns a `RxInt` with [this] `int` as initial value. + RxInt get obs => RxInt(this); +} + +extension DoubleExtension on double { + /// Returns a `RxDouble` with [this] `double` as initial value. + RxDouble get obs => RxDouble(this); +} + +extension BoolExtension on bool { + /// Returns a `RxBool` with [this] `bool` as initial value. + RxBool get obs => RxBool(this); +} + +extension RxT on T { + /// Returns a `Rx` instance with [this] `T` as initial value. + Rx get obs => Rx(this); +} diff --git a/siro_rider/packages/get/lib/get_rx/src/rx_types/rx_core/rx_interface.dart b/siro_rider/packages/get/lib/get_rx/src/rx_types/rx_core/rx_interface.dart new file mode 100644 index 0000000..eb0fc42 --- /dev/null +++ b/siro_rider/packages/get/lib/get_rx/src/rx_types/rx_core/rx_interface.dart @@ -0,0 +1,41 @@ +part of rx_types; + +/// This class is the foundation for all reactive (Rx) classes that makes Get +/// so powerful. +/// This interface is the contract that _RxImpl] uses in all it's +/// subclass. +abstract class RxInterface { + static RxInterface? proxy; + + bool get canUpdate; + + /// Adds a listener to stream + void addListener(GetStream rxGetx); + + /// Close the Rx Variable + void close(); + + /// Calls `callback` with current value, when the value changes. + StreamSubscription listen(void Function(T event) onData, + {Function? onError, void Function()? onDone, bool? cancelOnError}); + + /// Avoids an unsafe usage of the `proxy` + static T notifyChildren(RxNotifier observer, ValueGetter builder) { + final _observer = RxInterface.proxy; + RxInterface.proxy = observer; + final result = builder(); + if (!observer.canUpdate) { + RxInterface.proxy = _observer; + throw """ + [Get] the improper use of a GetX has been detected. + You should only use GetX or Obx for the specific widget that will be updated. + If you are seeing this error, you probably did not insert any observable variables into GetX/Obx + or insert them outside the scope that GetX considers suitable for an update + (example: GetX => HeavyWidget => variableObservable). + If you need to update a parent widget and a child widget, wrap each one in an Obx/GetX. + """; + } + RxInterface.proxy = _observer; + return result; + } +} diff --git a/siro_rider/packages/get/lib/get_rx/src/rx_types/rx_core/rx_num.dart b/siro_rider/packages/get/lib/get_rx/src/rx_types/rx_core/rx_num.dart new file mode 100644 index 0000000..741eb08 --- /dev/null +++ b/siro_rider/packages/get/lib/get_rx/src/rx_types/rx_core/rx_num.dart @@ -0,0 +1,1354 @@ +part of rx_types; + +extension RxNumExt on Rx { + /// Multiplication operator. + num operator *(num other) => value * other; + + /// Euclidean modulo operator. + /// + /// Returns the remainder of the Euclidean division. The Euclidean division of + /// two integers `a` and `b` yields two integers `q` and `r` such that + /// `a == b * q + r` and `0 <= r < b.abs()`. + /// + /// The Euclidean division is only defined for integers, but can be easily + /// extended to work with doubles. In that case `r` may have a non-integer + /// value, but it still verifies `0 <= r < |b|`. + /// + /// The sign of the returned value `r` is always positive. + /// + /// See [remainder] for the remainder of the truncating division. + num operator %(num other) => value % other; + + /// Division operator. + double operator /(num other) => value / other; + + /// Truncating division operator. + /// + /// If either operand is a [double] then the result of the truncating division + /// `a ~/ b` is equivalent to `(a / b).truncate().toInt()`. + /// + /// If both operands are [int]s then `a ~/ b` performs the truncating + /// integer division. + int operator ~/(num other) => value ~/ other; + + /// Negate operator. + num operator -() => -value; + + /// Returns the remainder of the truncating division of `this` by [other]. + /// + /// The result `r` of this operation satisfies: + /// `this == (this ~/ other) * other + r`. + /// As a consequence the remainder `r` has the same sign as the divider + /// `this`. + num remainder(num other) => value.remainder(other); + + /// Relational less than operator. + bool operator <(num other) => value < other; + + /// Relational less than or equal operator. + bool operator <=(num other) => value <= other; + + /// Relational greater than operator. + bool operator >(num other) => value > other; + + /// Relational greater than or equal operator. + bool operator >=(num other) => value >= other; + + /// True if the number is the double Not-a-Number value; otherwise, false. + bool get isNaN => value.isNaN; + + /// True if the number is negative; otherwise, false. + /// + /// Negative numbers are those less than zero, and the double `-0.0`. + bool get isNegative => value.isNegative; + + /// True if the number is positive infinity or negative infinity; otherwise, + /// false. + bool get isInfinite => value.isInfinite; + + /// True if the number is finite; otherwise, false. + /// + /// The only non-finite numbers are NaN, positive infinity, and + /// negative infinity. + bool get isFinite => value.isFinite; + + /// Returns the absolute value of this [num]. + num abs() => value.abs(); + + /// Returns minus one, zero or plus one depending on the sign and + /// numerical value of the number. + /// + /// Returns minus one if the number is less than zero, + /// plus one if the number is greater than zero, + /// and zero if the number is equal to zero. + /// + /// Returns NaN if the number is the double NaN value. + /// + /// Returns a number of the same type as this number. + /// For doubles, `-0.0.sign == -0.0`. + /// The result satisfies: + /// + /// n == n.sign * n.abs() + /// + /// for all numbers `n` (except NaN, because NaN isn't `==` to itself). + num get sign => value.sign; + + /// Returns the integer closest to `this`. + /// + /// Rounds away from zero when there is no closest integer: + /// `(3.5).round() == 4` and `(-3.5).round() == -4`. + /// + /// If `this` is not finite (`NaN` or infinity), throws an [UnsupportedError]. + int round() => value.round(); + + /// Returns the greatest integer no greater than `this`. + /// + /// If `this` is not finite (`NaN` or infinity), throws an [UnsupportedError]. + int floor() => value.floor(); + + /// Returns the least integer no smaller than `this`. + /// + /// If `this` is not finite (`NaN` or infinity), throws an [UnsupportedError]. + int ceil() => value.ceil(); + + /// Returns the integer obtained by discarding any fractional + /// digits from `this`. + /// + /// If `this` is not finite (`NaN` or infinity), throws an [UnsupportedError]. + int truncate() => value.truncate(); + + /// Returns the double integer value closest to `this`. + /// + /// Rounds away from zero when there is no closest integer: + /// `(3.5).roundToDouble() == 4` and `(-3.5).roundToDouble() == -4`. + /// + /// If this is already an integer valued double, including `-0.0`, or it is a + /// non-finite double value, the value is returned unmodified. + /// + /// For the purpose of rounding, `-0.0` is considered to be below `0.0`, + /// and `-0.0` is therefore considered closer to negative numbers than `0.0`. + /// This means that for a value, `d` in the range `-0.5 < d < 0.0`, + /// the result is `-0.0`. + /// + /// The result is always a double. + /// If this is a numerically large integer, the result may be an infinite + /// double. + double roundToDouble() => value.roundToDouble(); + + /// Returns the greatest double integer value no greater than `this`. + /// + /// If this is already an integer valued double, including `-0.0`, or it is a + /// non-finite double value, the value is returned unmodified. + /// + /// For the purpose of rounding, `-0.0` is considered to be below `0.0`. + /// A number `d` in the range `0.0 < d < 1.0` will return `0.0`. + /// + /// The result is always a double. + /// If this is a numerically large integer, the result may be an infinite + /// double. + double floorToDouble() => value.floorToDouble(); + + /// Returns the least double integer value no smaller than `this`. + /// + /// If this is already an integer valued double, including `-0.0`, or it is a + /// non-finite double value, the value is returned unmodified. + /// + /// For the purpose of rounding, `-0.0` is considered to be below `0.0`. + /// A number `d` in the range `-1.0 < d < 0.0` will return `-0.0`. + /// + /// The result is always a double. + /// If this is a numerically large integer, the result may be an infinite + /// double. + double ceilToDouble() => value.ceilToDouble(); + + /// Returns the double integer value obtained by discarding any fractional + /// digits from the double value of `this`. + /// + /// If this is already an integer valued double, including `-0.0`, or it is a + /// non-finite double value, the value is returned unmodified. + /// + /// For the purpose of rounding, `-0.0` is considered to be below `0.0`. + /// A number `d` in the range `-1.0 < d < 0.0` will return `-0.0`, and + /// in the range `0.0 < d < 1.0` it will return 0.0. + /// + /// The result is always a double. + /// If this is a numerically large integer, the result may be an infinite + /// double. + double truncateToDouble() => value.truncateToDouble(); + + /// Returns this [num] clamped to be in the range [lowerLimit]-[upperLimit]. + /// + /// The comparison is done using [compareTo] and therefore takes `-0.0` into + /// account. This also implies that [double.nan] is treated as the maximal + /// double value. + /// + /// The arguments [lowerLimit] and [upperLimit] must form a valid range where + /// `lowerLimit.compareTo(upperLimit) <= 0`. + num clamp(num lowerLimit, num upperLimit) => + value.clamp(lowerLimit, upperLimit); + + /// Truncates this [num] to an integer and returns the result as an [int]. */ + int toInt() => value.toInt(); + + /// Return this [num] as a [double]. + /// + /// If the number is not representable as a [double], an + /// approximation is returned. For numerically large integers, the + /// approximation may be infinite. + double toDouble() => value.toDouble(); + + /// Returns a decimal-point string-representation of `this`. + /// + /// Converts `this` to a [double] before computing the string representation. + /// + /// If the absolute value of `this` is greater or equal to `10^21` then this + /// methods returns an exponential representation computed by + /// `this.toStringAsExponential()`. Otherwise the result + /// is the closest string representation with exactly [fractionDigits] digits + /// after the decimal point. If [fractionDigits] equals 0 then the decimal + /// point is omitted. + /// + /// The parameter [fractionDigits] must be an integer satisfying: + /// `0 <= fractionDigits <= 20`. + /// + /// Examples: + /// + /// 1.toStringAsFixed(3); // 1.000 + /// (4321.12345678).toStringAsFixed(3); // 4321.123 + /// (4321.12345678).toStringAsFixed(5); // 4321.12346 + /// 123456789012345.toStringAsFixed(3); // 123456789012345.000 + /// 10000000000000000.toStringAsFixed(4); // 10000000000000000.0000 + /// 5.25.toStringAsFixed(0); // 5 + String toStringAsFixed(int fractionDigits) => + value.toStringAsFixed(fractionDigits); + + /// Returns an exponential string-representation of `this`. + /// + /// Converts `this` to a [double] before computing the string representation. + /// + /// If [fractionDigits] is given then it must be an integer satisfying: + /// `0 <= fractionDigits <= 20`. In this case the string contains exactly + /// [fractionDigits] after the decimal point. Otherwise, without the + /// parameter, the returned string uses the shortest number of digits that + /// accurately represent [this]. + /// + /// If [fractionDigits] equals 0 then the decimal point is omitted. + /// Examples: + /// + /// 1.toStringAsExponential(); // 1e+0 + /// 1.toStringAsExponential(3); // 1.000e+0 + /// 123456.toStringAsExponential(); // 1.23456e+5 + /// 123456.toStringAsExponential(3); // 1.235e+5 + /// 123.toStringAsExponential(0); // 1e+2 + String toStringAsExponential([int? fractionDigits]) => + value.toStringAsExponential(fractionDigits); + + /// Converts `this` to a double and returns a string representation with + /// exactly [precision] significant digits. + /// + /// The parameter [precision] must be an integer satisfying: + /// `1 <= precision <= 21`. + /// + /// Examples: + /// + /// 1.toStringAsPrecision(2); // 1.0 + /// 1e15.toStringAsPrecision(3); // 1.00e+15 + /// 1234567.toStringAsPrecision(3); // 1.23e+6 + /// 1234567.toStringAsPrecision(9); // 1234567.00 + /// 12345678901234567890.toStringAsPrecision(20); // 12345678901234567168 + /// 12345678901234567890.toStringAsPrecision(14); // 1.2345678901235e+19 + /// 0.00000012345.toStringAsPrecision(15); // 1.23450000000000e-7 + /// 0.0000012345.toStringAsPrecision(15); // 0.00000123450000000000 + String toStringAsPrecision(int precision) => + value.toStringAsPrecision(precision); +} + +extension RxnNumExt on Rx { + /// Multiplication operator. + num? operator *(num other) { + if (value != null) { + return value! * other; + } + return null; + } + + /// Euclidean modulo operator. + /// + /// Returns the remainder of the Euclidean division. The Euclidean division of + /// two integers `a` and `b` yields two integers `q` and `r` such that + /// `a == b * q + r` and `0 <= r < b.abs()`. + /// + /// The Euclidean division is only defined for integers, but can be easily + /// extended to work with doubles. In that case `r` may have a non-integer + /// value, but it still verifies `0 <= r < |b|`. + /// + /// The sign of the returned value `r` is always positive. + /// + /// See [remainder] for the remainder of the truncating division. + num? operator %(num other) { + if (value != null) { + return value! % other; + } + return null; + } + + /// Division operator. + double? operator /(num other) { + if (value != null) { + return value! / other; + } + return null; + } + + /// Truncating division operator. + /// + /// If either operand is a [double] then the result of the truncating division + /// `a ~/ b` is equivalent to `(a / b).truncate().toInt()`. + /// + /// If both operands are [int]s then `a ~/ b` performs the truncating + /// integer division. + int? operator ~/(num other) { + if (value != null) { + return value! ~/ other; + } + return null; + } + + /// Negate operator. + num? operator -() { + if (value != null) { + return -value!; + } + return null; + } + + /// Returns the remainder of the truncating division of `this` by [other]. + /// + /// The result `r` of this operation satisfies: + /// `this == (this ~/ other) * other + r`. + /// As a consequence the remainder `r` has the same sign as the divider + /// `this`. + num? remainder(num other) => value?.remainder(other); + + /// Relational less than operator. + bool? operator <(num other) { + if (value != null) { + return value! < other; + } + return null; + } + + /// Relational less than or equal operator. + bool? operator <=(num other) { + if (value != null) { + return value! <= other; + } + return null; + } + + /// Relational greater than operator. + bool? operator >(num other) { + if (value != null) { + return value! > other; + } + return null; + } + + /// Relational greater than or equal operator. + bool? operator >=(num other) { + if (value != null) { + return value! >= other; + } + return null; + } + + /// True if the number is the double Not-a-Number value; otherwise, false. + bool? get isNaN => value?.isNaN; + + /// True if the number is negative; otherwise, false. + /// + /// Negative numbers are those less than zero, and the double `-0.0`. + bool? get isNegative => value?.isNegative; + + /// True if the number is positive infinity or negative infinity; otherwise, + /// false. + bool? get isInfinite => value?.isInfinite; + + /// True if the number is finite; otherwise, false. + /// + /// The only non-finite numbers are NaN, positive infinity, and + /// negative infinity. + bool? get isFinite => value?.isFinite; + + /// Returns the absolute value of this [num]. + num? abs() => value?.abs(); + + /// Returns minus one, zero or plus one depending on the sign and + /// numerical value of the number. + /// + /// Returns minus one if the number is less than zero, + /// plus one if the number is greater than zero, + /// and zero if the number is equal to zero. + /// + /// Returns NaN if the number is the double NaN value. + /// + /// Returns a number of the same type as this number. + /// For doubles, `-0.0.sign == -0.0`. + /// The result satisfies: + /// + /// n == n.sign * n.abs() + /// + /// for all numbers `n` (except NaN, because NaN isn't `==` to itself). + num? get sign => value?.sign; + + /// Returns the integer closest to `this`. + /// + /// Rounds away from zero when there is no closest integer: + /// `(3.5).round() == 4` and `(-3.5).round() == -4`. + /// + /// If `this` is not finite (`NaN` or infinity), throws an [UnsupportedError]. + int? round() => value?.round(); + + /// Returns the greatest integer no greater than `this`. + /// + /// If `this` is not finite (`NaN` or infinity), throws an [UnsupportedError]. + int? floor() => value?.floor(); + + /// Returns the least integer no smaller than `this`. + /// + /// If `this` is not finite (`NaN` or infinity), throws an [UnsupportedError]. + int? ceil() => value?.ceil(); + + /// Returns the integer obtained by discarding any fractional + /// digits from `this`. + /// + /// If `this` is not finite (`NaN` or infinity), throws an [UnsupportedError]. + int? truncate() => value?.truncate(); + + /// Returns the double integer value closest to `this`. + /// + /// Rounds away from zero when there is no closest integer: + /// `(3.5).roundToDouble() == 4` and `(-3.5).roundToDouble() == -4`. + /// + /// If this is already an integer valued double, including `-0.0`, or it is a + /// non-finite double value, the value is returned unmodified. + /// + /// For the purpose of rounding, `-0.0` is considered to be below `0.0`, + /// and `-0.0` is therefore considered closer to negative numbers than `0.0`. + /// This means that for a value, `d` in the range `-0.5 < d < 0.0`, + /// the result is `-0.0`. + /// + /// The result is always a double. + /// If this is a numerically large integer, the result may be an infinite + /// double. + double? roundToDouble() => value?.roundToDouble(); + + /// Returns the greatest double integer value no greater than `this`. + /// + /// If this is already an integer valued double, including `-0.0`, or it is a + /// non-finite double value, the value is returned unmodified. + /// + /// For the purpose of rounding, `-0.0` is considered to be below `0.0`. + /// A number `d` in the range `0.0 < d < 1.0` will return `0.0`. + /// + /// The result is always a double. + /// If this is a numerically large integer, the result may be an infinite + /// double. + double? floorToDouble() => value?.floorToDouble(); + + /// Returns the least double integer value no smaller than `this`. + /// + /// If this is already an integer valued double, including `-0.0`, or it is a + /// non-finite double value, the value is returned unmodified. + /// + /// For the purpose of rounding, `-0.0` is considered to be below `0.0`. + /// A number `d` in the range `-1.0 < d < 0.0` will return `-0.0`. + /// + /// The result is always a double. + /// If this is a numerically large integer, the result may be an infinite + /// double. + double? ceilToDouble() => value?.ceilToDouble(); + + /// Returns the double integer value obtained by discarding any fractional + /// digits from the double value of `this`. + /// + /// If this is already an integer valued double, including `-0.0`, or it is a + /// non-finite double value, the value is returned unmodified. + /// + /// For the purpose of rounding, `-0.0` is considered to be below `0.0`. + /// A number `d` in the range `-1.0 < d < 0.0` will return `-0.0`, and + /// in the range `0.0 < d < 1.0` it will return 0.0. + /// + /// The result is always a double. + /// If this is a numerically large integer, the result may be an infinite + /// double. + double? truncateToDouble() => value?.truncateToDouble(); + + /// Returns this [num] clamped to be in the range [lowerLimit]-[upperLimit]. + /// + /// The comparison is done using [compareTo] and therefore takes `-0.0` into + /// account. This also implies that [double.nan] is treated as the maximal + /// double value. + /// + /// The arguments [lowerLimit] and [upperLimit] must form a valid range where + /// `lowerLimit.compareTo(upperLimit) <= 0`. + num? clamp(num lowerLimit, num upperLimit) => + value?.clamp(lowerLimit, upperLimit); + + /// Truncates this [num] to an integer and returns the result as an [int]. */ + int? toInt() => value?.toInt(); + + /// Return this [num] as a [double]. + /// + /// If the number is not representable as a [double], an + /// approximation is returned. For numerically large integers, the + /// approximation may be infinite. + double? toDouble() => value?.toDouble(); + + /// Returns a decimal-point string-representation of `this`. + /// + /// Converts `this` to a [double] before computing the string representation. + /// + /// If the absolute value of `this` is greater or equal to `10^21` then this + /// methods returns an exponential representation computed by + /// `this.toStringAsExponential()`. Otherwise the result + /// is the closest string representation with exactly [fractionDigits] digits + /// after the decimal point. If [fractionDigits] equals 0 then the decimal + /// point is omitted. + /// + /// The parameter [fractionDigits] must be an integer satisfying: + /// `0 <= fractionDigits <= 20`. + /// + /// Examples: + /// + /// 1.toStringAsFixed(3); // 1.000 + /// (4321.12345678).toStringAsFixed(3); // 4321.123 + /// (4321.12345678).toStringAsFixed(5); // 4321.12346 + /// 123456789012345.toStringAsFixed(3); // 123456789012345.000 + /// 10000000000000000.toStringAsFixed(4); // 10000000000000000.0000 + /// 5.25.toStringAsFixed(0); // 5 + String? toStringAsFixed(int fractionDigits) => + value?.toStringAsFixed(fractionDigits); + + /// Returns an exponential string-representation of `this`. + /// + /// Converts `this` to a [double] before computing the string representation. + /// + /// If [fractionDigits] is given then it must be an integer satisfying: + /// `0 <= fractionDigits <= 20`. In this case the string contains exactly + /// [fractionDigits] after the decimal point. Otherwise, without the + /// parameter, the returned string uses the shortest number of digits that + /// accurately represent [this]. + /// + /// If [fractionDigits] equals 0 then the decimal point is omitted. + /// Examples: + /// + /// 1.toStringAsExponential(); // 1e+0 + /// 1.toStringAsExponential(3); // 1.000e+0 + /// 123456.toStringAsExponential(); // 1.23456e+5 + /// 123456.toStringAsExponential(3); // 1.235e+5 + /// 123.toStringAsExponential(0); // 1e+2 + String? toStringAsExponential([int? fractionDigits]) => + value?.toStringAsExponential(fractionDigits); + + /// Converts `this` to a double and returns a string representation with + /// exactly [precision] significant digits. + /// + /// The parameter [precision] must be an integer satisfying: + /// `1 <= precision <= 21`. + /// + /// Examples: + /// + /// 1.toStringAsPrecision(2); // 1.0 + /// 1e15.toStringAsPrecision(3); // 1.00e+15 + /// 1234567.toStringAsPrecision(3); // 1.23e+6 + /// 1234567.toStringAsPrecision(9); // 1234567.00 + /// 12345678901234567890.toStringAsPrecision(20); // 12345678901234567168 + /// 12345678901234567890.toStringAsPrecision(14); // 1.2345678901235e+19 + /// 0.00000012345.toStringAsPrecision(15); // 1.23450000000000e-7 + /// 0.0000012345.toStringAsPrecision(15); // 0.00000123450000000000 + String? toStringAsPrecision(int precision) => + value?.toStringAsPrecision(precision); +} + +class RxNum extends Rx { + RxNum(num initial) : super(initial); + + num operator +(num other) { + value += other; + return value; + } + + /// Subtraction operator. + num operator -(num other) { + value -= other; + return value; + } +} + +class RxnNum extends Rx { + RxnNum([num? initial]) : super(initial); + + num? operator +(num other) { + if (value != null) { + value = value! + other; + return value; + } + return null; + } + + /// Subtraction operator. + num? operator -(num other) { + if (value != null) { + value = value! - other; + return value; + } + return null; + } +} + +extension RxDoubleExt on Rx { + /// Addition operator. + Rx operator +(num other) { + value = value + other; + return this; + } + + /// Subtraction operator. + Rx operator -(num other) { + value = value - other; + return this; + } + + /// Multiplication operator. + double operator *(num other) => value * other; + + double operator %(num other) => value % other; + + /// Division operator. + double operator /(num other) => value / other; + + /// Truncating division operator. + /// + /// The result of the truncating division `a ~/ b` is equivalent to + /// `(a / b).truncate()`. + int operator ~/(num other) => value ~/ other; + + /// Negate operator. */ + double operator -() => -value; + + /// Returns the absolute value of this [double]. + double abs() => value.abs(); + + /// Returns the sign of the double's numerical value. + /// + /// Returns -1.0 if the value is less than zero, + /// +1.0 if the value is greater than zero, + /// and the value itself if it is -0.0, 0.0 or NaN. + double get sign => value.sign; + + /// Returns the integer closest to `this`. + /// + /// Rounds away from zero when there is no closest integer: + /// `(3.5).round() == 4` and `(-3.5).round() == -4`. + /// + /// If `this` is not finite (`NaN` or infinity), throws an [UnsupportedError]. + int round() => value.round(); + + /// Returns the greatest integer no greater than `this`. + /// + /// If `this` is not finite (`NaN` or infinity), throws an [UnsupportedError]. + int floor() => value.floor(); + + /// Returns the least integer no smaller than `this`. + /// + /// If `this` is not finite (`NaN` or infinity), throws an [UnsupportedError]. + int ceil() => value.ceil(); + + /// Returns the integer obtained by discarding any fractional + /// digits from `this`. + /// + /// If `this` is not finite (`NaN` or infinity), throws an [UnsupportedError]. + int truncate() => value.truncate(); + + /// Returns the integer double value closest to `this`. + /// + /// Rounds away from zero when there is no closest integer: + /// `(3.5).roundToDouble() == 4` and `(-3.5).roundToDouble() == -4`. + /// + /// If this is already an integer valued double, including `-0.0`, or it is + /// not a finite value, the value is returned unmodified. + /// + /// For the purpose of rounding, `-0.0` is considered to be below `0.0`, + /// and `-0.0` is therefore considered closer to negative numbers than `0.0`. + /// This means that for a value, `d` in the range `-0.5 < d < 0.0`, + /// the result is `-0.0`. + double roundToDouble() => value.roundToDouble(); + + /// Returns the greatest integer double value no greater than `this`. + /// + /// If this is already an integer valued double, including `-0.0`, or it is + /// not a finite value, the value is returned unmodified. + /// + /// For the purpose of rounding, `-0.0` is considered to be below `0.0`. + /// A number `d` in the range `0.0 < d < 1.0` will return `0.0`. + double floorToDouble() => value.floorToDouble(); + + /// Returns the least integer double value no smaller than `this`. + /// + /// If this is already an integer valued double, including `-0.0`, or it is + /// not a finite value, the value is returned unmodified. + /// + /// For the purpose of rounding, `-0.0` is considered to be below `0.0`. + /// A number `d` in the range `-1.0 < d < 0.0` will return `-0.0`. + double ceilToDouble() => value.ceilToDouble(); + + /// Returns the integer double value obtained by discarding any fractional + /// digits from `this`. + /// + /// If this is already an integer valued double, including `-0.0`, or it is + /// not a finite value, the value is returned unmodified. + /// + /// For the purpose of rounding, `-0.0` is considered to be below `0.0`. + /// A number `d` in the range `-1.0 < d < 0.0` will return `-0.0`, and + /// in the range `0.0 < d < 1.0` it will return 0.0. + double truncateToDouble() => value.truncateToDouble(); +} + +extension RxnDoubleExt on Rx { + /// Addition operator. + Rx? operator +(num other) { + if (value != null) { + value = value! + other; + return this; + } + return null; + } + + /// Subtraction operator. + Rx? operator -(num other) { + if (value != null) { + value = value! + other; + return this; + } + return null; + } + + /// Multiplication operator. + double? operator *(num other) { + if (value != null) { + return value! * other; + } + return null; + } + + double? operator %(num other) { + if (value != null) { + return value! % other; + } + return null; + } + + /// Division operator. + double? operator /(num other) { + if (value != null) { + return value! / other; + } + return null; + } + + /// Truncating division operator. + /// + /// The result of the truncating division `a ~/ b` is equivalent to + /// `(a / b).truncate()`. + int? operator ~/(num other) { + if (value != null) { + return value! ~/ other; + } + return null; + } + + /// Negate operator. */ + double? operator -() { + if (value != null) { + return -value!; + } + return null; + } + + /// Returns the absolute value of this [double]. + double? abs() { + return value?.abs(); + } + + /// Returns the sign of the double's numerical value. + /// + /// Returns -1.0 if the value is less than zero, + /// +1.0 if the value is greater than zero, + /// and the value itself if it is -0.0, 0.0 or NaN. + double? get sign => value?.sign; + + /// Returns the integer closest to `this`. + /// + /// Rounds away from zero when there is no closest integer: + /// `(3.5).round() == 4` and `(-3.5).round() == -4`. + /// + /// If `this` is not finite (`NaN` or infinity), throws an [UnsupportedError]. + int? round() => value?.round(); + + /// Returns the greatest integer no greater than `this`. + /// + /// If `this` is not finite (`NaN` or infinity), throws an [UnsupportedError]. + int? floor() => value?.floor(); + + /// Returns the least integer no smaller than `this`. + /// + /// If `this` is not finite (`NaN` or infinity), throws an [UnsupportedError]. + int? ceil() => value?.ceil(); + + /// Returns the integer obtained by discarding any fractional + /// digits from `this`. + /// + /// If `this` is not finite (`NaN` or infinity), throws an [UnsupportedError]. + int? truncate() => value?.truncate(); + + /// Returns the integer double value closest to `this`. + /// + /// Rounds away from zero when there is no closest integer: + /// `(3.5).roundToDouble() == 4` and `(-3.5).roundToDouble() == -4`. + /// + /// If this is already an integer valued double, including `-0.0`, or it is + /// not a finite value, the value is returned unmodified. + /// + /// For the purpose of rounding, `-0.0` is considered to be below `0.0`, + /// and `-0.0` is therefore considered closer to negative numbers than `0.0`. + /// This means that for a value, `d` in the range `-0.5 < d < 0.0`, + /// the result is `-0.0`. + double? roundToDouble() => value?.roundToDouble(); + + /// Returns the greatest integer double value no greater than `this`. + /// + /// If this is already an integer valued double, including `-0.0`, or it is + /// not a finite value, the value is returned unmodified. + /// + /// For the purpose of rounding, `-0.0` is considered to be below `0.0`. + /// A number `d` in the range `0.0 < d < 1.0` will return `0.0`. + double? floorToDouble() => value?.floorToDouble(); + + /// Returns the least integer double value no smaller than `this`. + /// + /// If this is already an integer valued double, including `-0.0`, or it is + /// not a finite value, the value is returned unmodified. + /// + /// For the purpose of rounding, `-0.0` is considered to be below `0.0`. + /// A number `d` in the range `-1.0 < d < 0.0` will return `-0.0`. + double? ceilToDouble() => value?.ceilToDouble(); + + /// Returns the integer double value obtained by discarding any fractional + /// digits from `this`. + /// + /// If this is already an integer valued double, including `-0.0`, or it is + /// not a finite value, the value is returned unmodified. + /// + /// For the purpose of rounding, `-0.0` is considered to be below `0.0`. + /// A number `d` in the range `-1.0 < d < 0.0` will return `-0.0`, and + /// in the range `0.0 < d < 1.0` it will return 0.0. + double? truncateToDouble() => value?.truncateToDouble(); +} + +class RxDouble extends Rx { + RxDouble(double initial) : super(initial); +} + +class RxnDouble extends Rx { + RxnDouble([double? initial]) : super(initial); +} + +class RxInt extends Rx { + RxInt(int initial) : super(initial); + + /// Addition operator. + RxInt operator +(int other) { + value = value + other; + return this; + } + + /// Subtraction operator. + RxInt operator -(int other) { + value = value - other; + return this; + } +} + +class RxnInt extends Rx { + RxnInt([int? initial]) : super(initial); + + /// Addition operator. + RxnInt operator +(int other) { + if (value != null) { + value = value! + other; + } + return this; + } + + /// Subtraction operator. + RxnInt operator -(int other) { + if (value != null) { + value = value! - other; + } + return this; + } +} + +extension RxIntExt on Rx { + /// Bit-wise and operator. + /// + /// Treating both `this` and [other] as sufficiently large two's component + /// integers, the result is a number with only the bits set that are set in + /// both `this` and [other] + /// + /// If both operands are negative, the result is negative, otherwise + /// the result is non-negative. + int operator &(int other) => value & other; + + /// Bit-wise or operator. + /// + /// Treating both `this` and [other] as sufficiently large two's component + /// integers, the result is a number with the bits set that are set in either + /// of `this` and [other] + /// + /// If both operands are non-negative, the result is non-negative, + /// otherwise the result is negative. + int operator |(int other) => value | other; + + /// Bit-wise exclusive-or operator. + /// + /// Treating both `this` and [other] as sufficiently large two's component + /// integers, the result is a number with the bits set that are set in one, + /// but not both, of `this` and [other] + /// + /// If the operands have the same sign, the result is non-negative, + /// otherwise the result is negative. + int operator ^(int other) => value ^ other; + + /// The bit-wise negate operator. + /// + /// Treating `this` as a sufficiently large two's component integer, + /// the result is a number with the opposite bits set. + /// + /// This maps any integer `x` to `-x - 1`. + int operator ~() => ~value; + + /// Shift the bits of this integer to the left by [shiftAmount]. + /// + /// Shifting to the left makes the number larger, effectively multiplying + /// the number by `pow(2, shiftIndex)`. + /// + /// There is no limit on the size of the result. It may be relevant to + /// limit intermediate values by using the "and" operator with a suitable + /// mask. + /// + /// It is an error if [shiftAmount] is negative. + int operator <<(int shiftAmount) => value << shiftAmount; + + /// Shift the bits of this integer to the right by [shiftAmount]. + /// + /// Shifting to the right makes the number smaller and drops the least + /// significant bits, effectively doing an integer division by + ///`pow(2, shiftIndex)`. + /// + /// It is an error if [shiftAmount] is negative. + int operator >>(int shiftAmount) => value >> shiftAmount; + + /// Returns this integer to the power of [exponent] modulo [modulus]. + /// + /// The [exponent] must be non-negative and [modulus] must be + /// positive. + int modPow(int exponent, int modulus) => value.modPow(exponent, modulus); + + /// Returns the modular multiplicative inverse of this integer + /// modulo [modulus]. + /// + /// The [modulus] must be positive. + /// + /// It is an error if no modular inverse exists. + int modInverse(int modulus) => value.modInverse(modulus); + + /// Returns the greatest common divisor of this integer and [other]. + /// + /// If either number is non-zero, the result is the numerically greatest + /// integer dividing both `this` and `other`. + /// + /// The greatest common divisor is independent of the order, + /// so `x.gcd(y)` is always the same as `y.gcd(x)`. + /// + /// For any integer `x`, `x.gcd(x)` is `x.abs()`. + /// + /// If both `this` and `other` is zero, the result is also zero. + int gcd(int other) => value.gcd(other); + + /// Returns true if and only if this integer is even. + bool get isEven => value.isEven; + + /// Returns true if and only if this integer is odd. + bool get isOdd => value.isOdd; + + /// Returns the minimum number of bits required to store this integer. + /// + /// The number of bits excludes the sign bit, which gives the natural length + /// for non-negative (unsigned) values. Negative values are complemented to + /// return the bit position of the first bit that differs from the sign bit. + /// + /// To find the number of bits needed to store the value as a signed value, + /// add one, i.e. use `x.bitLength + 1`. + /// ``` + /// x.bitLength == (-x-1).bitLength + /// + /// 3.bitLength == 2; // 00000011 + /// 2.bitLength == 2; // 00000010 + /// 1.bitLength == 1; // 00000001 + /// 0.bitLength == 0; // 00000000 + /// (-1).bitLength == 0; // 11111111 + /// (-2).bitLength == 1; // 11111110 + /// (-3).bitLength == 2; // 11111101 + /// (-4).bitLength == 2; // 11111100 + /// ``` + int get bitLength => value.bitLength; + + /// Returns the least significant [width] bits of this integer as a + /// non-negative number (i.e. unsigned representation). The returned value + /// has zeros in all bit positions higher than [width]. + /// ``` + /// (-1).toUnsigned(5) == 31 // 11111111 -> 00011111 + /// ``` + /// This operation can be used to simulate arithmetic from low level + /// languages. + /// For example, to increment an 8 bit quantity: + /// ``` + /// q = (q + 1).toUnsigned(8); + /// ``` + /// `q` will count from `0` up to `255` and then wrap around to `0`. + /// + /// If the input fits in [width] bits without truncation, the result is the + /// same as the input. The minimum width needed to avoid truncation of `x` is + /// given by `x.bitLength`, i.e. + /// ``` + /// x == x.toUnsigned(x.bitLength); + /// ``` + int toUnsigned(int width) => value.toUnsigned(width); + + /// Returns the least significant [width] bits of this integer, extending the + /// highest retained bit to the sign. This is the same as truncating the + /// value to fit in [width] bits using an signed 2-s complement + /// representation. + /// The returned value has the same bit value in all positions higher than + /// [width]. + /// + /// ``` + /// V--sign bit-V + /// 16.toSigned(5) == -16 // 00010000 -> 11110000 + /// 239.toSigned(5) == 15 // 11101111 -> 00001111 + /// ^ ^ + /// ``` + /// This operation can be used to simulate arithmetic from low level + /// languages. + /// For example, to increment an 8 bit signed quantity: + /// ``` + /// q = (q + 1).toSigned(8); + /// ``` + /// `q` will count from `0` up to `127`, wrap to `-128` and count back up to + /// `127`. + /// + /// If the input value fits in [width] bits without truncation, the result is + /// the same as the input. The minimum width needed to avoid truncation + /// of `x` is `x.bitLength + 1`, i.e. + /// ``` + /// x == x.toSigned(x.bitLength + 1); + /// ``` + int toSigned(int width) => value.toSigned(width); + + /// Return the negative value of this integer. + /// + /// The result of negating an integer always has the opposite sign, except + /// for zero, which is its own negation. + int operator -() => -value; + + /// Returns the absolute value of this integer. + /// + /// For any integer `x`, the result is the same as `x < 0 ? -x : x`. + int abs() => value.abs(); + + /// Returns the sign of this integer. + /// + /// Returns 0 for zero, -1 for values less than zero and + /// +1 for values greater than zero. + int get sign => value.sign; + + /// Returns `this`. + int round() => value.round(); + + /// Returns `this`. + int floor() => value.floor(); + + /// Returns `this`. + int ceil() => value.ceil(); + + /// Returns `this`. + int truncate() => value.truncate(); + + /// Returns `this.toDouble()`. + double roundToDouble() => value.roundToDouble(); + + /// Returns `this.toDouble()`. + double floorToDouble() => value.floorToDouble(); + + /// Returns `this.toDouble()`. + double ceilToDouble() => value.ceilToDouble(); + + /// Returns `this.toDouble()`. + double truncateToDouble() => value.truncateToDouble(); +} + +extension RxnIntExt on Rx { + /// Bit-wise and operator. + /// + /// Treating both `this` and [other] as sufficiently large two's component + /// integers, the result is a number with only the bits set that are set in + /// both `this` and [other] + /// + /// If both operands are negative, the result is negative, otherwise + /// the result is non-negative. + int? operator &(int other) { + if (value != null) { + return value! & other; + } + return null; + } + + /// Bit-wise or operator. + /// + /// Treating both `this` and [other] as sufficiently large two's component + /// integers, the result is a number with the bits set that are set in either + /// of `this` and [other] + /// + /// If both operands are non-negative, the result is non-negative, + /// otherwise the result is negative. + int? operator |(int other) { + if (value != null) { + return value! | other; + } + return null; + } + + /// Bit-wise exclusive-or operator. + /// + /// Treating both `this` and [other] as sufficiently large two's component + /// integers, the result is a number with the bits set that are set in one, + /// but not both, of `this` and [other] + /// + /// If the operands have the same sign, the result is non-negative, + /// otherwise the result is negative. + int? operator ^(int other) { + if (value != null) { + return value! ^ other; + } + return null; + } + + /// The bit-wise negate operator. + /// + /// Treating `this` as a sufficiently large two's component integer, + /// the result is a number with the opposite bits set. + /// + /// This maps any integer `x` to `-x - 1`. + int? operator ~() { + if (value != null) { + return ~value!; + } + return null; + } + + /// Shift the bits of this integer to the left by [shiftAmount]. + /// + /// Shifting to the left makes the number larger, effectively multiplying + /// the number by `pow(2, shiftIndex)`. + /// + /// There is no limit on the size of the result. It may be relevant to + /// limit intermediate values by using the "and" operator with a suitable + /// mask. + /// + /// It is an error if [shiftAmount] is negative. + int? operator <<(int shiftAmount) { + if (value != null) { + return value! << shiftAmount; + } + return null; + } + + /// Shift the bits of this integer to the right by [shiftAmount]. + /// + /// Shifting to the right makes the number smaller and drops the least + /// significant bits, effectively doing an integer division by + ///`pow(2, shiftIndex)`. + /// + /// It is an error if [shiftAmount] is negative. + int? operator >>(int shiftAmount) { + if (value != null) { + return value! >> shiftAmount; + } + return null; + } + + /// Returns this integer to the power of [exponent] modulo [modulus]. + /// + /// The [exponent] must be non-negative and [modulus] must be + /// positive. + int? modPow(int exponent, int modulus) => value?.modPow(exponent, modulus); + + /// Returns the modular multiplicative inverse of this integer + /// modulo [modulus]. + /// + /// The [modulus] must be positive. + /// + /// It is an error if no modular inverse exists. + int? modInverse(int modulus) => value?.modInverse(modulus); + + /// Returns the greatest common divisor of this integer and [other]. + /// + /// If either number is non-zero, the result is the numerically greatest + /// integer dividing both `this` and `other`. + /// + /// The greatest common divisor is independent of the order, + /// so `x.gcd(y)` is always the same as `y.gcd(x)`. + /// + /// For any integer `x`, `x.gcd(x)` is `x.abs()`. + /// + /// If both `this` and `other` is zero, the result is also zero. + int? gcd(int other) => value?.gcd(other); + + /// Returns true if and only if this integer is even. + bool? get isEven => value?.isEven; + + /// Returns true if and only if this integer is odd. + bool? get isOdd => value?.isOdd; + + /// Returns the minimum number of bits required to store this integer. + /// + /// The number of bits excludes the sign bit, which gives the natural length + /// for non-negative (unsigned) values. Negative values are complemented to + /// return the bit position of the first bit that differs from the sign bit. + /// + /// To find the number of bits needed to store the value as a signed value, + /// add one, i.e. use `x.bitLength + 1`. + /// ``` + /// x.bitLength == (-x-1).bitLength + /// + /// 3.bitLength == 2; // 00000011 + /// 2.bitLength == 2; // 00000010 + /// 1.bitLength == 1; // 00000001 + /// 0.bitLength == 0; // 00000000 + /// (-1).bitLength == 0; // 11111111 + /// (-2).bitLength == 1; // 11111110 + /// (-3).bitLength == 2; // 11111101 + /// (-4).bitLength == 2; // 11111100 + /// ``` + int? get bitLength => value?.bitLength; + + /// Returns the least significant [width] bits of this integer as a + /// non-negative number (i.e. unsigned representation). The returned value + /// has zeros in all bit positions higher than [width]. + /// ``` + /// (-1).toUnsigned(5) == 31 // 11111111 -> 00011111 + /// ``` + /// This operation can be used to simulate arithmetic from low level + /// languages. + /// For example, to increment an 8 bit quantity: + /// ``` + /// q = (q + 1).toUnsigned(8); + /// ``` + /// `q` will count from `0` up to `255` and then wrap around to `0`. + /// + /// If the input fits in [width] bits without truncation, the result is the + /// same as the input. The minimum width needed to avoid truncation of `x` is + /// given by `x.bitLength`, i.e. + /// ``` + /// x == x.toUnsigned(x.bitLength); + /// ``` + int? toUnsigned(int width) => value?.toUnsigned(width); + + /// Returns the least significant [width] bits of this integer, extending the + /// highest retained bit to the sign. This is the same as truncating the + /// value to fit in [width] bits using an signed 2-s complement + /// representation. + /// The returned value has the same bit value in all positions higher than + /// [width]. + /// + /// ``` + /// V--sign bit-V + /// 16.toSigned(5) == -16 // 00010000 -> 11110000 + /// 239.toSigned(5) == 15 // 11101111 -> 00001111 + /// ^ ^ + /// ``` + /// This operation can be used to simulate arithmetic from low level + /// languages. + /// For example, to increment an 8 bit signed quantity: + /// ``` + /// q = (q + 1).toSigned(8); + /// ``` + /// `q` will count from `0` up to `127`, wrap to `-128` and count back up to + /// `127`. + /// + /// If the input value fits in [width] bits without truncation, the result is + /// the same as the input. The minimum width needed to avoid truncation + /// of `x` is `x.bitLength + 1`, i.e. + /// ``` + /// x == x.toSigned(x.bitLength + 1); + /// ``` + int? toSigned(int width) => value?.toSigned(width); + + /// Return the negative value of this integer. + /// + /// The result of negating an integer always has the opposite sign, except + /// for zero, which is its own negation. + int? operator -() { + if (value != null) { + return -value!; + } + return null; + } + + /// Returns the absolute value of this integer. + /// + /// For any integer `x`, the result is the same as `x < 0 ? -x : x`. + int? abs() => value?.abs(); + + /// Returns the sign of this integer. + /// + /// Returns 0 for zero, -1 for values less than zero and + /// +1 for values greater than zero. + int? get sign => value?.sign; + + /// Returns `this`. + int? round() => value?.round(); + + /// Returns `this`. + int? floor() => value?.floor(); + + /// Returns `this`. + int? ceil() => value?.ceil(); + + /// Returns `this`. + int? truncate() => value?.truncate(); + + /// Returns `this.toDouble()`. + double? roundToDouble() => value?.roundToDouble(); + + /// Returns `this.toDouble()`. + double? floorToDouble() => value?.floorToDouble(); + + /// Returns `this.toDouble()`. + double? ceilToDouble() => value?.ceilToDouble(); + + /// Returns `this.toDouble()`. + double? truncateToDouble() => value?.truncateToDouble(); +} diff --git a/siro_rider/packages/get/lib/get_rx/src/rx_types/rx_core/rx_string.dart b/siro_rider/packages/get/lib/get_rx/src/rx_types/rx_core/rx_string.dart new file mode 100644 index 0000000..8dcb74a --- /dev/null +++ b/siro_rider/packages/get/lib/get_rx/src/rx_types/rx_core/rx_string.dart @@ -0,0 +1,289 @@ +part of rx_types; + +extension RxStringExt on Rx { + String operator +(String val) => _value + val; + + int compareTo(String other) { + return value.compareTo(other); + } + + /// Returns true if this string ends with [other]. For example: + /// + /// 'Dart'.endsWith('t'); // true + bool endsWith(String other) { + return value.endsWith(other); + } + + /// Returns true if this string starts with a match of [pattern]. + bool startsWith(Pattern pattern, [int index = 0]) { + return value.startsWith(pattern, index); + } + + /// Returns the position of the first match of [pattern] in this string + int indexOf(Pattern pattern, [int start = 0]) { + return value.indexOf(pattern, start); + } + + /// Returns the starting position of the last match [pattern] in this string, + /// searching backward starting at [start], inclusive: + int lastIndexOf(Pattern pattern, [int? start]) { + return value.lastIndexOf(pattern, start); + } + + /// Returns true if this string is empty. + bool get isEmpty => value.isEmpty; + + /// Returns true if this string is not empty. + bool get isNotEmpty => !isEmpty; + + /// Returns the substring of this string that extends from [startIndex], + /// inclusive, to [endIndex], exclusive + String substring(int startIndex, [int? endIndex]) { + return value.substring(startIndex, endIndex); + } + + /// Returns the string without any leading and trailing whitespace. + String trim() { + return value.trim(); + } + + /// Returns the string without any leading whitespace. + /// + /// As [trim], but only removes leading whitespace. + String trimLeft() { + return value.trimLeft(); + } + + /// Returns the string without any trailing whitespace. + /// + /// As [trim], but only removes trailing whitespace. + String trimRight() { + return value.trimRight(); + } + + /// Pads this string on the left if it is shorter than [width]. + /// + /// Return a new string that prepends [padding] onto this string + /// one time for each position the length is less than [width]. + String padLeft(int width, [String padding = ' ']) { + return value.padLeft(width, padding); + } + + /// Pads this string on the right if it is shorter than [width]. + + /// Return a new string that appends [padding] after this string + /// one time for each position the length is less than [width]. + String padRight(int width, [String padding = ' ']) { + return value.padRight(width, padding); + } + + /// Returns true if this string contains a match of [other]: + bool contains(Pattern other, [int startIndex = 0]) { + return value.contains(other, startIndex); + } + + /// Replaces all substrings that match [from] with [replace]. + String replaceAll(Pattern from, String replace) { + return value.replaceAll(from, replace); + } + + /// Splits the string at matches of [pattern] and returns a list + /// of substrings. + List split(Pattern pattern) { + return value.split(pattern); + } + + /// Returns an unmodifiable list of the UTF-16 code units of this string. + List get codeUnits => value.codeUnits; + + /// Returns an [Iterable] of Unicode code-points of this string. + /// + /// If the string contains surrogate pairs, they are combined and returned + /// as one integer by this iterator. Unmatched surrogate halves are treated + /// like valid 16-bit code-units. + Runes get runes => value.runes; + + /// Converts all characters in this string to lower case. + /// If the string is already in all lower case, this method returns `this`. + String toLowerCase() { + return value.toLowerCase(); + } + + /// Converts all characters in this string to upper case. + /// If the string is already in all upper case, this method returns `this`. + String toUpperCase() { + return value.toUpperCase(); + } + + Iterable allMatches(String string, [int start = 0]) { + return value.allMatches(string, start); + } + + Match? matchAsPrefix(String string, [int start = 0]) { + return value.matchAsPrefix(string, start); + } +} + +extension RxnStringExt on Rx { + String operator +(String val) => (_value ?? '') + val; + + int? compareTo(String other) { + return value?.compareTo(other); + } + + /// Returns true if this string ends with [other]. For example: + /// + /// 'Dart'.endsWith('t'); // true + bool? endsWith(String other) { + return value?.endsWith(other); + } + + /// Returns true if this string starts with a match of [pattern]. + bool? startsWith(Pattern pattern, [int index = 0]) { + return value?.startsWith(pattern, index); + } + + /// Returns the position of the first match of [pattern] in this string + int? indexOf(Pattern pattern, [int start = 0]) { + return value?.indexOf(pattern, start); + } + + /// Returns the starting position of the last match [pattern] in this string, + /// searching backward starting at [start], inclusive: + int? lastIndexOf(Pattern pattern, [int? start]) { + return value?.lastIndexOf(pattern, start); + } + + /// Returns true if this string is empty. + bool? get isEmpty => value?.isEmpty; + + /// Returns true if this string is not empty. + bool? get isNotEmpty => value?.isNotEmpty; + + /// Returns the substring of this string that extends from [startIndex], + /// inclusive, to [endIndex], exclusive + String? substring(int startIndex, [int? endIndex]) { + return value?.substring(startIndex, endIndex); + } + + /// Returns the string without any leading and trailing whitespace. + String? trim() { + return value?.trim(); + } + + /// Returns the string without any leading whitespace. + /// + /// As [trim], but only removes leading whitespace. + String? trimLeft() { + return value?.trimLeft(); + } + + /// Returns the string without any trailing whitespace. + /// + /// As [trim], but only removes trailing whitespace. + String? trimRight() { + return value?.trimRight(); + } + + /// Pads this string on the left if it is shorter than [width]. + /// + /// Return a new string that prepends [padding] onto this string + /// one time for each position the length is less than [width]. + String? padLeft(int width, [String padding = ' ']) { + return value?.padLeft(width, padding); + } + + /// Pads this string on the right if it is shorter than [width]. + + /// Return a new string that appends [padding] after this string + /// one time for each position the length is less than [width]. + String? padRight(int width, [String padding = ' ']) { + return value?.padRight(width, padding); + } + + /// Returns true if this string contains a match of [other]: + bool? contains(Pattern other, [int startIndex = 0]) { + return value?.contains(other, startIndex); + } + + /// Replaces all substrings that match [from] with [replace]. + String? replaceAll(Pattern from, String replace) { + return value?.replaceAll(from, replace); + } + + /// Splits the string at matches of [pattern] and returns a list + /// of substrings. + List? split(Pattern pattern) { + return value?.split(pattern); + } + + /// Returns an unmodifiable list of the UTF-16 code units of this string. + List? get codeUnits => value?.codeUnits; + + /// Returns an [Iterable] of Unicode code-points of this string. + /// + /// If the string contains surrogate pairs, they are combined and returned + /// as one integer by this iterator. Unmatched surrogate halves are treated + /// like valid 16-bit code-units. + Runes? get runes => value?.runes; + + /// Converts all characters in this string to lower case. + /// If the string is already in all lower case, this method returns `this`. + String? toLowerCase() { + return value?.toLowerCase(); + } + + /// Converts all characters in this string to upper case. + /// If the string is already in all upper case, this method returns `this`. + String? toUpperCase() { + return value?.toUpperCase(); + } + + Iterable? allMatches(String string, [int start = 0]) { + return value?.allMatches(string, start); + } + + Match? matchAsPrefix(String string, [int start = 0]) { + return value?.matchAsPrefix(string, start); + } +} + +/// Rx class for `String` Type. +class RxString extends Rx implements Comparable, Pattern { + RxString(String initial) : super(initial); + + @override + Iterable allMatches(String string, [int start = 0]) { + return value.allMatches(string, start); + } + + @override + Match? matchAsPrefix(String string, [int start = 0]) { + return value.matchAsPrefix(string, start); + } + + @override + int compareTo(String other) { + return value.compareTo(other); + } +} + +/// Rx class for `String` Type. +class RxnString extends Rx implements Comparable, Pattern { + RxnString([String? initial]) : super(initial); + + @override + Iterable allMatches(String string, [int start = 0]) { + return value!.allMatches(string, start); + } + + @override + Match? matchAsPrefix(String string, [int start = 0]) { + return value!.matchAsPrefix(string, start); + } + + @override + int compareTo(String other) { + return value!.compareTo(other); + } +} diff --git a/siro_rider/packages/get/lib/get_rx/src/rx_types/rx_iterables/rx_list.dart b/siro_rider/packages/get/lib/get_rx/src/rx_types/rx_iterables/rx_list.dart new file mode 100644 index 0000000..21cafee --- /dev/null +++ b/siro_rider/packages/get/lib/get_rx/src/rx_types/rx_iterables/rx_list.dart @@ -0,0 +1,172 @@ +part of rx_types; + +/// Create a list similar to `List` +class RxList extends ListMixin + with NotifyManager>, RxObjectMixin> + implements RxInterface> { + RxList([List initial = const []]) { + _value = List.from(initial); + } + + factory RxList.filled(int length, E fill, {bool growable = false}) { + return RxList(List.filled(length, fill, growable: growable)); + } + + factory RxList.empty({bool growable = false}) { + return RxList(List.empty(growable: growable)); + } + + /// Creates a list containing all [elements]. + factory RxList.from(Iterable elements, {bool growable = true}) { + return RxList(List.from(elements, growable: growable)); + } + + /// Creates a list from [elements]. + factory RxList.of(Iterable elements, {bool growable = true}) { + return RxList(List.of(elements, growable: growable)); + } + + /// Generates a list of values. + factory RxList.generate(int length, E generator(int index), + {bool growable = true}) { + return RxList(List.generate(length, generator, growable: growable)); + } + + /// Creates an unmodifiable list containing all [elements]. + factory RxList.unmodifiable(Iterable elements) { + return RxList(List.unmodifiable(elements)); + } + + @override + Iterator get iterator => value.iterator; + + @override + void operator []=(int index, E val) { + _value[index] = val; + refresh(); + } + + /// Special override to push() element(s) in a reactive way + /// inside the List, + @override + RxList operator +(Iterable val) { + addAll(val); + refresh(); + return this; + } + + @override + E operator [](int index) { + return value[index]; + } + + @override + void add(E item) { + _value.add(item); + refresh(); + } + + @override + void addAll(Iterable item) { + _value.addAll(item); + refresh(); + } + + @override + void removeWhere(bool test(E element)) { + _value.removeWhere(test); + refresh(); + } + + @override + void retainWhere(bool test(E element)) { + _value.retainWhere(test); + refresh(); + } + + @override + int get length => value.length; + + @override + @protected + List get value { + RxInterface.proxy?.addListener(subject); + return _value; + } + + @override + set length(int newLength) { + _value.length = newLength; + refresh(); + } + + @override + void insertAll(int index, Iterable iterable) { + _value.insertAll(index, iterable); + refresh(); + } + + @override + Iterable get reversed => value.reversed; + + @override + Iterable where(bool Function(E) test) { + return value.where(test); + } + + @override + Iterable whereType() { + return value.whereType(); + } + + @override + void sort([int compare(E a, E b)?]) { + _value.sort(compare); + refresh(); + } +} + +extension ListExtension on List { + RxList get obs => RxList(this); + + /// Add [item] to [List] only if [item] is not null. + void addNonNull(E item) { + if (item != null) add(item); + } + + // /// Add [Iterable] to [List] only if [Iterable] is not null. + // void addAllNonNull(Iterable item) { + // if (item != null) addAll(item); + // } + + /// Add [item] to List only if [condition] is true. + void addIf(dynamic condition, E item) { + if (condition is Condition) condition = condition(); + if (condition is bool && condition) add(item); + } + + /// Adds [Iterable] to [List] only if [condition] is true. + void addAllIf(dynamic condition, Iterable items) { + if (condition is Condition) condition = condition(); + if (condition is bool && condition) addAll(items); + } + + /// Replaces all existing items of this list with [item] + void assign(E item) { + // if (this is RxList) { + // (this as RxList)._value; + // } + + clear(); + add(item); + } + + /// Replaces all existing items of this list with [items] + void assignAll(Iterable items) { + // if (this is RxList) { + // (this as RxList)._value; + // } + clear(); + addAll(items); + } +} diff --git a/siro_rider/packages/get/lib/get_rx/src/rx_types/rx_iterables/rx_map.dart b/siro_rider/packages/get/lib/get_rx/src/rx_types/rx_iterables/rx_map.dart new file mode 100644 index 0000000..af0cab4 --- /dev/null +++ b/siro_rider/packages/get/lib/get_rx/src/rx_types/rx_iterables/rx_map.dart @@ -0,0 +1,108 @@ +part of rx_types; + +class RxMap extends MapMixin + with NotifyManager>, RxObjectMixin> + implements RxInterface> { + RxMap([Map initial = const {}]) { + _value = Map.from(initial); + } + + factory RxMap.from(Map other) { + return RxMap(Map.from(other)); + } + + /// Creates a [LinkedHashMap] with the same keys and values as [other]. + factory RxMap.of(Map other) { + return RxMap(Map.of(other)); + } + + ///Creates an unmodifiable hash based map containing the entries of [other]. + factory RxMap.unmodifiable(Map other) { + return RxMap(Map.unmodifiable(other)); + } + + /// Creates an identity map with the default implementation, [LinkedHashMap]. + factory RxMap.identity() { + return RxMap(Map.identity()); + } + + @override + V? operator [](Object? key) { + return value[key as K]; + } + + @override + void operator []=(K key, V value) { + _value[key] = value; + refresh(); + } + + @override + void clear() { + _value.clear(); + refresh(); + } + + @override + Iterable get keys => value.keys; + + @override + V? remove(Object? key) { + final val = _value.remove(key); + refresh(); + return val; + } + + @override + @protected + Map get value { + RxInterface.proxy?.addListener(subject); + return _value; + } +} + +extension MapExtension on Map { + RxMap get obs { + return RxMap(this); + } + + void addIf(dynamic condition, K key, V value) { + if (condition is Condition) condition = condition(); + if (condition is bool && condition) { + this[key] = value; + } + } + + void addAllIf(dynamic condition, Map values) { + if (condition is Condition) condition = condition(); + if (condition is bool && condition) addAll(values); + } + + void assign(K key, V val) { + if (this is RxMap) { + final map = (this as RxMap); + // map._value; + map._value.clear(); + this[key] = val; + } else { + clear(); + this[key] = val; + } + } + + void assignAll(Map val) { + if (val is RxMap && this is RxMap) { + if ((val as RxMap)._value == (this as RxMap)._value) return; + } + if (this is RxMap) { + final map = (this as RxMap); + if (map._value == val) return; + map._value = val; + map.refresh(); + } else { + if (this == val) return; + clear(); + addAll(val); + } + } +} diff --git a/siro_rider/packages/get/lib/get_rx/src/rx_types/rx_iterables/rx_set.dart b/siro_rider/packages/get/lib/get_rx/src/rx_types/rx_iterables/rx_set.dart new file mode 100644 index 0000000..ccfbbee --- /dev/null +++ b/siro_rider/packages/get/lib/get_rx/src/rx_types/rx_iterables/rx_set.dart @@ -0,0 +1,151 @@ +part of rx_types; + +class RxSet extends SetMixin + with NotifyManager>, RxObjectMixin> + implements RxInterface> { + RxSet([Set initial = const {}]) { + _value = Set.from(initial); + } + + /// Special override to push() element(s) in a reactive way + /// inside the List, + RxSet operator +(Set val) { + addAll(val); + refresh(); + return this; + } + + void update(void fn(Iterable? value)) { + fn(value); + refresh(); + } + + @override + @protected + Set get value { + RxInterface.proxy?.addListener(subject); + return _value; + } + + @override + @protected + set value(Set val) { + if (_value == val) return; + _value = val; + refresh(); + } + + @override + bool add(E value) { + final val = _value.add(value); + refresh(); + return val; + } + + @override + bool contains(Object? element) { + return value.contains(element); + } + + @override + Iterator get iterator => value.iterator; + + @override + int get length => value.length; + + @override + E? lookup(Object? object) { + return value.lookup(object); + } + + @override + bool remove(Object? item) { + var hasRemoved = _value.remove(item); + if (hasRemoved) { + refresh(); + } + return hasRemoved; + } + + @override + Set toSet() { + return value.toSet(); + } + + @override + void addAll(Iterable item) { + _value.addAll(item); + refresh(); + } + + @override + void clear() { + _value.clear(); + refresh(); + } + + @override + void removeAll(Iterable elements) { + _value.removeAll(elements); + refresh(); + } + + @override + void retainAll(Iterable elements) { + _value.retainAll(elements); + refresh(); + } + + @override + void retainWhere(bool Function(E) E) { + _value.retainWhere(E); + refresh(); + } +} + +extension SetExtension on Set { + RxSet get obs { + return RxSet({})..addAll(this); + } + + // /// Add [item] to [List] only if [item] is not null. + // void addNonNull(E item) { + // if (item != null) add(item); + // } + + // /// Add [Iterable] to [List] only if [Iterable] is not null. + // void addAllNonNull(Iterable item) { + // if (item != null) addAll(item); + // } + + /// Add [item] to [List] only if [condition] is true. + void addIf(dynamic condition, E item) { + if (condition is Condition) condition = condition(); + if (condition is bool && condition) add(item); + } + + /// Adds [Iterable] to [List] only if [condition] is true. + void addAllIf(dynamic condition, Iterable items) { + if (condition is Condition) condition = condition(); + if (condition is bool && condition) addAll(items); + } + + /// Replaces all existing items of this list with [item] + void assign(E item) { + // if (this is RxSet) { + // (this as RxSet)._value; + // } + + clear(); + add(item); + } + + /// Replaces all existing items of this list with [items] + void assignAll(Iterable items) { + // if (this is RxSet) { + // (this as RxSet)._value; + // } + clear(); + addAll(items); + } +} diff --git a/siro_rider/packages/get/lib/get_rx/src/rx_types/rx_types.dart b/siro_rider/packages/get/lib/get_rx/src/rx_types/rx_types.dart new file mode 100644 index 0000000..fb5e7e5 --- /dev/null +++ b/siro_rider/packages/get/lib/get_rx/src/rx_types/rx_types.dart @@ -0,0 +1,17 @@ +library rx_types; + +import 'dart:async'; +import 'dart:collection'; + +import 'package:flutter/foundation.dart'; +import '../rx_stream/rx_stream.dart'; +import '../rx_typedefs/rx_typedefs.dart'; + +part 'rx_core/rx_impl.dart'; +part 'rx_core/rx_interface.dart'; +part 'rx_core/rx_num.dart'; +part 'rx_core/rx_string.dart'; + +part 'rx_iterables/rx_list.dart'; +part 'rx_iterables/rx_set.dart'; +part 'rx_iterables/rx_map.dart'; diff --git a/siro_rider/packages/get/lib/get_rx/src/rx_workers/rx_workers.dart b/siro_rider/packages/get/lib/get_rx/src/rx_workers/rx_workers.dart new file mode 100644 index 0000000..934bcfa --- /dev/null +++ b/siro_rider/packages/get/lib/get_rx/src/rx_workers/rx_workers.dart @@ -0,0 +1,273 @@ +import 'dart:async'; + +import '../../../get_core/get_core.dart'; +import '../rx_types/rx_types.dart'; +import 'utils/debouncer.dart'; + +bool _conditional(dynamic condition) { + if (condition == null) return true; + if (condition is bool) return condition; + if (condition is bool Function()) return condition(); + return true; +} + +typedef WorkerCallback = Function(T callback); + +class Workers { + Workers(this.workers); + final List workers; + + void dispose() { + for (final worker in workers) { + if (!worker._disposed) { + worker.dispose(); + } + } + } +} + +/// +/// Called every time [listener] changes. As long as the [condition] +/// returns true. +/// +/// Sample: +/// Every time increment() is called, ever() will process the [condition] +/// (can be a [bool] expression or a `bool Function()`), and only call +/// the callback when [condition] is true. +/// In our case, only when count is bigger to 5. In order to "dispose" +/// this Worker +/// that will run forever, we made a `worker` variable. So, when the count value +/// reaches 10, the worker gets disposed, and releases any memory resources. +/// +/// ``` +/// // imagine some counter widget... +/// +/// class _CountController extends GetxController { +/// final count = 0.obs; +/// Worker worker; +/// +/// void onInit() { +/// worker = ever(count, (value) { +/// print('counter changed to: $value'); +/// if (value == 10) worker.dispose(); +/// }, condition: () => count > 5); +/// } +/// +/// void increment() => count + 1; +/// } +/// ``` +Worker ever( + RxInterface listener, + WorkerCallback callback, { + dynamic condition = true, + Function? onError, + void Function()? onDone, + bool? cancelOnError, +}) { + StreamSubscription sub = listener.listen( + (event) { + if (_conditional(condition)) callback(event); + }, + onError: onError, + onDone: onDone, + cancelOnError: cancelOnError, + ); + return Worker(sub.cancel, '[ever]'); +} + +/// Similar to [ever], but takes a list of [listeners], the condition +/// for the [callback] is common to all [listeners], +/// and the [callback] is executed to each one of them. The [Worker] is +/// common to all, so `worker.dispose()` will cancel all streams. +Worker everAll( + List listeners, + WorkerCallback callback, { + dynamic condition = true, + Function? onError, + void Function()? onDone, + bool? cancelOnError, +}) { + final evers = []; + for (var i in listeners) { + final sub = i.listen( + (event) { + if (_conditional(condition)) callback(event); + }, + onError: onError, + onDone: onDone, + cancelOnError: cancelOnError, + ); + evers.add(sub); + } + + Future cancel() { + for (var i in evers) { + i.cancel(); + } + return Future.value(() {}); + } + + return Worker(cancel, '[everAll]'); +} + +/// `once()` will execute only 1 time when [condition] is met and cancel +/// the subscription to the [listener] stream right after that. +/// [condition] defines when [callback] is called, and +/// can be a [bool] or a `bool Function()`. +/// +/// Sample: +/// ``` +/// class _CountController extends GetxController { +/// final count = 0.obs; +/// Worker worker; +/// +/// @override +/// Future onInit() async { +/// worker = once(count, (value) { +/// print("counter reached $value before 3 seconds."); +/// }, condition: () => count() > 2); +/// 3.delay(worker.dispose); +/// } +/// void increment() => count + 1; +/// } +///``` +Worker once( + RxInterface listener, + WorkerCallback callback, { + dynamic condition = true, + Function? onError, + void Function()? onDone, + bool? cancelOnError, +}) { + late Worker ref; + StreamSubscription? sub; + sub = listener.listen( + (event) { + if (!_conditional(condition)) return; + ref._disposed = true; + ref._log('called'); + sub?.cancel(); + callback(event); + }, + onError: onError, + onDone: onDone, + cancelOnError: cancelOnError, + ); + ref = Worker(sub.cancel, '[once]'); + return ref; +} + +/// Ignore all changes in [listener] during [time] (1 sec by default) or until +/// [condition] is met (can be a [bool] expression or a `bool Function()`), +/// It brings the 1st "value" since the period of time, so +/// if you click a counter button 3 times in 1 sec, it will show you "1" +/// (after 1 sec of the first press) +/// click counter 3 times in 1 sec, it will show you "4" (after 1 sec) +/// click counter 2 times in 1 sec, it will show you "7" (after 1 sec). +/// +/// Sample: +/// // wait 1 sec each time an event starts, only if counter is lower than 20. +/// worker = interval( +/// count, +/// (value) => print(value), +/// time: 1.seconds, +/// condition: () => count < 20, +/// ); +/// ``` +Worker interval( + RxInterface listener, + WorkerCallback callback, { + Duration time = const Duration(seconds: 1), + dynamic condition = true, + Function? onError, + void Function()? onDone, + bool? cancelOnError, +}) { + var debounceActive = false; + StreamSubscription sub = listener.listen( + (event) async { + if (debounceActive || !_conditional(condition)) return; + debounceActive = true; + await Future.delayed(time); + debounceActive = false; + callback(event); + }, + onError: onError, + onDone: onDone, + cancelOnError: cancelOnError, + ); + return Worker(sub.cancel, '[interval]'); +} + +/// [debounce] is similar to [interval], but sends the last value. +/// Useful for Anti DDos, every time the user stops typing for 1 second, +/// for instance. +/// When [listener] emits the last "value", when [time] hits, +/// it calls [callback] with the last "value" emitted. +/// +/// Sample: +/// +/// ``` +/// worker = debounce( +/// count, +/// (value) { +/// print(value); +/// if( value > 20 ) worker.dispose(); +/// }, +/// time: 1.seconds, +/// ); +/// } +/// ``` +Worker debounce( + RxInterface listener, + WorkerCallback callback, { + Duration? time, + Function? onError, + void Function()? onDone, + bool? cancelOnError, +}) { + final _debouncer = + Debouncer(delay: time ?? const Duration(milliseconds: 800)); + StreamSubscription sub = listener.listen( + (event) { + _debouncer(() { + callback(event); + }); + }, + onError: onError, + onDone: onDone, + cancelOnError: cancelOnError, + ); + return Worker(sub.cancel, '[debounce]'); +} + +class Worker { + Worker(this.worker, this.type); + + /// subscription.cancel() callback + final Future Function() worker; + + /// type of worker (debounce, interval, ever).. + final String type; + bool _disposed = false; + + bool get disposed => _disposed; + + //final bool _verbose = true; + void _log(String msg) { + // if (!_verbose) return; + Get.log('$runtimeType $type $msg'); + } + + void dispose() { + if (_disposed) { + _log('already disposed'); + return; + } + _disposed = true; + worker(); + _log('disposed'); + } + + void call() => dispose(); +} diff --git a/siro_rider/packages/get/lib/get_rx/src/rx_workers/utils/debouncer.dart b/siro_rider/packages/get/lib/get_rx/src/rx_workers/utils/debouncer.dart new file mode 100644 index 0000000..078a1ed --- /dev/null +++ b/siro_rider/packages/get/lib/get_rx/src/rx_workers/utils/debouncer.dart @@ -0,0 +1,27 @@ +import 'dart:async'; + +/// This "function" class is the implementation of `debouncer()` Worker. +/// It calls the function passed after specified [delay] parameter. +/// Example: +/// ``` +/// final delayed = Debouncer( delay: Duration( seconds: 1 )) ; +/// print( 'the next function will be called after 1 sec' ); +/// delayed( () => print( 'called after 1 sec' )); +/// ``` +class Debouncer { + final Duration? delay; + Timer? _timer; + + Debouncer({this.delay}); + + void call(void Function() action) { + _timer?.cancel(); + _timer = Timer(delay!, action); + } + + /// Notifies if the delayed call is active. + bool get isRunning => _timer?.isActive ?? false; + + /// Cancel the current delayed call. + void cancel() => _timer?.cancel(); +} diff --git a/siro_rider/packages/get/lib/get_state_manager/get_state_manager.dart b/siro_rider/packages/get/lib/get_state_manager/get_state_manager.dart new file mode 100644 index 0000000..24a2f40 --- /dev/null +++ b/siro_rider/packages/get/lib/get_state_manager/get_state_manager.dart @@ -0,0 +1,13 @@ +library get_state_manager; + +export 'src/rx_flutter/rx_disposable.dart'; +export 'src/rx_flutter/rx_getx_widget.dart'; +export 'src/rx_flutter/rx_notifier.dart'; +export 'src/rx_flutter/rx_obx_widget.dart'; +export 'src/rx_flutter/rx_ticket_provider_mixin.dart'; +export 'src/simple/get_controllers.dart'; +export 'src/simple/get_responsive.dart'; +export 'src/simple/get_state.dart'; +export 'src/simple/get_view.dart'; +export 'src/simple/mixin_state.dart'; +export 'src/simple/simple_builder.dart'; diff --git a/siro_rider/packages/get/lib/get_state_manager/src/rx_flutter/rx_disposable.dart b/siro_rider/packages/get/lib/get_state_manager/src/rx_flutter/rx_disposable.dart new file mode 100644 index 0000000..97af96f --- /dev/null +++ b/siro_rider/packages/get/lib/get_state_manager/src/rx_flutter/rx_disposable.dart @@ -0,0 +1,42 @@ +import 'package:flutter/material.dart'; + +import '../../../get.dart'; + +/// Unlike GetxController, which serves to control events on each of its pages, +/// GetxService is not automatically disposed (nor can be removed with +/// Get.delete()). +/// It is ideal for situations where, once started, that service will +/// remain in memory, such as Auth control for example. Only way to remove +/// it is Get.reset(). +abstract class GetxService extends DisposableInterface with GetxServiceMixin {} + +abstract class DisposableInterface extends GetLifeCycle { + /// Called immediately after the widget is allocated in memory. + /// You might use this to initialize something for the controller. + @override + @mustCallSuper + void onInit() { + super.onInit(); + + Get.engine.addPostFrameCallback((_) => onReady()); + } + + /// Called 1 frame after onInit(). It is the perfect place to enter + /// navigation events, like snackbar, dialogs, or a new route, or + /// async request. + @override + void onReady() { + super.onReady(); + } + + /// Called before [onDelete] method. [onClose] might be used to + /// dispose resources used by the controller. Like closing events, + /// or streams before the controller is destroyed. + /// Or dispose objects that can potentially create some memory leaks, + /// like TextEditingControllers, AnimationControllers. + /// Might be useful as well to persist some data on disk. + @override + void onClose() { + super.onClose(); + } +} diff --git a/siro_rider/packages/get/lib/get_state_manager/src/rx_flutter/rx_getx_widget.dart b/siro_rider/packages/get/lib/get_state_manager/src/rx_flutter/rx_getx_widget.dart new file mode 100644 index 0000000..a108704 --- /dev/null +++ b/siro_rider/packages/get/lib/get_state_manager/src/rx_flutter/rx_getx_widget.dart @@ -0,0 +1,133 @@ +import 'dart:async'; + +import 'package:flutter/foundation.dart'; +import 'package:flutter/widgets.dart'; + +import '../../../get_core/get_core.dart'; +import '../../../get_instance/src/get_instance.dart'; +import '../../../get_rx/src/rx_types/rx_types.dart'; +import '../../get_state_manager.dart'; + +typedef GetXControllerBuilder = Widget Function( + T controller); + +class GetX extends StatefulWidget { + final GetXControllerBuilder builder; + final bool global; + + // final Stream Function(T) stream; + // final StreamController Function(T) streamController; + final bool autoRemove; + final bool assignId; + final void Function(GetXState state)? initState, + dispose, + didChangeDependencies; + final void Function(GetX oldWidget, GetXState state)? didUpdateWidget; + final T? init; + final String? tag; + + const GetX({ + this.tag, + required this.builder, + this.global = true, + this.autoRemove = true, + this.initState, + this.assignId = false, + // this.stream, + this.dispose, + this.didChangeDependencies, + this.didUpdateWidget, + this.init, + // this.streamController + }); + + @override + void debugFillProperties(DiagnosticPropertiesBuilder properties) { + super.debugFillProperties(properties); + properties + ..add( + DiagnosticsProperty('controller', init), + ) + ..add(DiagnosticsProperty('tag', tag)) + ..add( + ObjectFlagProperty>.has('builder', builder)); + } + + @override + GetXState createState() => GetXState(); +} + +class GetXState extends State> { + final _observer = RxNotifier(); + T? controller; + bool? _isCreator = false; + late StreamSubscription _subs; + + @override + void initState() { + // var isPrepared = GetInstance().isPrepared(tag: widget.tag); + final isRegistered = GetInstance().isRegistered(tag: widget.tag); + + if (widget.global) { + if (isRegistered) { + _isCreator = GetInstance().isPrepared(tag: widget.tag); + controller = GetInstance().find(tag: widget.tag); + } else { + controller = widget.init; + _isCreator = true; + GetInstance().put(controller!, tag: widget.tag); + } + } else { + controller = widget.init; + _isCreator = true; + controller?.onStart(); + } + widget.initState?.call(this); + if (widget.global && Get.smartManagement == SmartManagement.onlyBuilder) { + controller?.onStart(); + } + _subs = _observer.listen((data) => setState(() {}), cancelOnError: false); + super.initState(); + } + + @override + void didChangeDependencies() { + super.didChangeDependencies(); + if (widget.didChangeDependencies != null) { + widget.didChangeDependencies!(this); + } + } + + @override + void didUpdateWidget(GetX oldWidget) { + super.didUpdateWidget(oldWidget as GetX); + widget.didUpdateWidget?.call(oldWidget, this); + } + + @override + void dispose() { + if (widget.dispose != null) widget.dispose!(this); + if (_isCreator! || widget.assignId) { + if (widget.autoRemove && GetInstance().isRegistered(tag: widget.tag)) { + GetInstance().delete(tag: widget.tag); + } + } + _subs.cancel(); + _observer.close(); + controller = null; + _isCreator = null; + super.dispose(); + } + + @override + void debugFillProperties(DiagnosticPropertiesBuilder properties) { + super.debugFillProperties(properties); + properties.add(DiagnosticsProperty('controller', controller)); + } + + @override + Widget build(BuildContext context) => RxInterface.notifyChildren( + _observer, + () => widget.builder(controller!), + ); +} diff --git a/siro_rider/packages/get/lib/get_state_manager/src/rx_flutter/rx_notifier.dart b/siro_rider/packages/get/lib/get_state_manager/src/rx_flutter/rx_notifier.dart new file mode 100644 index 0000000..7864836 --- /dev/null +++ b/siro_rider/packages/get/lib/get_state_manager/src/rx_flutter/rx_notifier.dart @@ -0,0 +1,197 @@ +import 'package:flutter/foundation.dart'; +import 'package:flutter/material.dart'; +import 'package:flutter/scheduler.dart'; + +import '../../../instance_manager.dart'; +import '../../get_state_manager.dart'; +import '../simple/list_notifier.dart'; + +mixin StateMixin on ListNotifierMixin { + T? _value; + RxStatus? _status; + + bool _isNullOrEmpty(dynamic val) { + if (val == null) return true; + var result = false; + if (val is Iterable) { + result = val.isEmpty; + } else if (val is String) { + result = val.isEmpty; + } else if (val is Map) { + result = val.isEmpty; + } + return result; + } + + void _fillEmptyStatus() { + _status = _isNullOrEmpty(_value) ? RxStatus.loading() : RxStatus.success(); + } + + RxStatus get status { + notifyChildrens(); + return _status ??= _status = RxStatus.loading(); + } + + T? get state => value; + + @protected + T? get value { + notifyChildrens(); + return _value; + } + + @protected + set value(T? newValue) { + if (_value == newValue) return; + _value = newValue; + refresh(); + } + + @protected + void change(T? newState, {RxStatus? status}) { + var _canUpdate = false; + if (status != null) { + _status = status; + _canUpdate = true; + } + if (newState != _value) { + _value = newState; + _canUpdate = true; + } + if (_canUpdate) { + refresh(); + } + } + + void append(Future Function() body(), {String? errorMessage}) { + final compute = body(); + compute().then((newValue) { + change(newValue, status: RxStatus.success()); + }, onError: (err) { + change(state, status: RxStatus.error(errorMessage ?? err.toString())); + }); + } +} + +class Value extends ListNotifier + with StateMixin + implements ValueListenable { + Value(T val) { + _value = val; + _fillEmptyStatus(); + } + + @override + T? get value { + notifyChildrens(); + return _value; + } + + @override + set value(T? newValue) { + if (_value == newValue) return; + _value = newValue; + refresh(); + } + + T? call([T? v]) { + if (v != null) { + value = v; + } + return value; + } + + void update(void fn(T? value)) { + fn(value); + refresh(); + } + + @override + String toString() => value.toString(); + + dynamic toJson() => (value as dynamic)?.toJson(); +} + +extension ReactiveT on T { + Value get reactive => Value(this); +} + +typedef Condition = bool Function(); + +abstract class GetNotifier extends Value with GetLifeCycleBase { + GetNotifier(T initial) : super(initial) { + $configureLifeCycle(); + } + + @override + @mustCallSuper + void onInit() { + super.onInit(); + ambiguate(SchedulerBinding.instance) + ?.addPostFrameCallback((_) => onReady()); + } +} + +extension StateExt on StateMixin { + Widget obx( + NotifierBuilder widget, { + Widget Function(String? error)? onError, + Widget? onLoading, + Widget? onEmpty, + }) { + return SimpleBuilder(builder: (_) { + if (status.isLoading) { + return onLoading ?? const Center(child: CircularProgressIndicator()); + } else if (status.isError) { + return onError != null + ? onError(status.errorMessage) + : Center(child: Text('A error occurred: ${status.errorMessage}')); + } else if (status.isEmpty) { + return onEmpty != null + ? onEmpty + : SizedBox.shrink(); // Also can be widget(null); but is risky + } + return widget(value); + }); + } +} + +class RxStatus { + final bool isLoading; + final bool isError; + final bool isSuccess; + final bool isEmpty; + final bool isLoadingMore; + final String? errorMessage; + + RxStatus._({ + this.isEmpty = false, + this.isLoading = false, + this.isError = false, + this.isSuccess = false, + this.errorMessage, + this.isLoadingMore = false, + }); + + factory RxStatus.loading() { + return RxStatus._(isLoading: true); + } + + factory RxStatus.loadingMore() { + return RxStatus._(isSuccess: true, isLoadingMore: true); + } + + factory RxStatus.success() { + return RxStatus._(isSuccess: true); + } + + factory RxStatus.error([String? message]) { + return RxStatus._(isError: true, errorMessage: message); + } + + factory RxStatus.empty() { + return RxStatus._(isEmpty: true); + } +} + +typedef NotifierBuilder = Widget Function(T state); diff --git a/siro_rider/packages/get/lib/get_state_manager/src/rx_flutter/rx_obx_widget.dart b/siro_rider/packages/get/lib/get_state_manager/src/rx_flutter/rx_obx_widget.dart new file mode 100644 index 0000000..56a712c --- /dev/null +++ b/siro_rider/packages/get/lib/get_state_manager/src/rx_flutter/rx_obx_widget.dart @@ -0,0 +1,92 @@ +import 'dart:async'; +import 'package:flutter/foundation.dart'; +import 'package:flutter/widgets.dart'; +import '../../../get_rx/src/rx_types/rx_types.dart'; + +typedef WidgetCallback = Widget Function(); + +/// The [ObxWidget] is the base for all GetX reactive widgets +/// +/// See also: +/// - [Obx] +/// - [ObxValue] +abstract class ObxWidget extends StatefulWidget { + const ObxWidget({Key? key}) : super(key: key); + + @override + void debugFillProperties(DiagnosticPropertiesBuilder properties) { + super.debugFillProperties(properties); + properties..add(ObjectFlagProperty.has('builder', build)); + } + + @override + _ObxState createState() => _ObxState(); + + @protected + Widget build(); +} + +class _ObxState extends State { + final _observer = RxNotifier(); + late StreamSubscription subs; + + @override + void initState() { + super.initState(); + subs = _observer.listen(_updateTree, cancelOnError: false); + } + + void _updateTree(_) { + if (mounted) { + setState(() {}); + } + } + + @override + void dispose() { + subs.cancel(); + _observer.close(); + super.dispose(); + } + + @override + Widget build(BuildContext context) => + RxInterface.notifyChildren(_observer, widget.build); +} + +/// The simplest reactive widget in GetX. +/// +/// Just pass your Rx variable in the root scope of the callback to have it +/// automatically registered for changes. +/// +/// final _name = "GetX".obs; +/// Obx(() => Text( _name.value )),... ; +class Obx extends ObxWidget { + final WidgetCallback builder; + + const Obx(this.builder); + + @override + Widget build() => builder(); +} + +/// Similar to Obx, but manages a local state. +/// Pass the initial data in constructor. +/// Useful for simple local states, like toggles, visibility, themes, +/// button states, etc. +/// Sample: +/// ObxValue((data) => Switch( +/// value: data.value, +/// onChanged: (flag) => data.value = flag, +/// ), +/// false.obs, +/// ), +class ObxValue extends ObxWidget { + final Widget Function(T) builder; + final T data; + + const ObxValue(this.builder, this.data, {Key? key}) : super(key: key); + + @override + Widget build() => builder(data); +} diff --git a/siro_rider/packages/get/lib/get_state_manager/src/rx_flutter/rx_ticket_provider_mixin.dart b/siro_rider/packages/get/lib/get_state_manager/src/rx_flutter/rx_ticket_provider_mixin.dart new file mode 100644 index 0000000..cc3bfed --- /dev/null +++ b/siro_rider/packages/get/lib/get_state_manager/src/rx_flutter/rx_ticket_provider_mixin.dart @@ -0,0 +1,203 @@ +// ignore_for_file: lines_longer_than_80_chars + +import 'package:flutter/foundation.dart'; +import 'package:flutter/material.dart'; +import 'package:flutter/scheduler.dart'; + +import '../../get_state_manager.dart'; + +/// Used like `SingleTickerProviderMixin` but only with Get Controllers. +/// Simplifies AnimationController creation inside GetxController. +/// +/// Example: +///``` +///class SplashController extends GetxController with +/// GetSingleTickerProviderStateMixin { +/// AnimationController controller; +/// +/// @override +/// void onInit() { +/// final duration = const Duration(seconds: 2); +/// controller = +/// AnimationController.unbounded(duration: duration, vsync: this); +/// controller.repeat(); +/// controller.addListener(() => +/// print("Animation Controller value: ${controller.value}")); +/// } +/// ... +/// ``` +mixin GetSingleTickerProviderStateMixin on GetxController + implements TickerProvider { + Ticker? _ticker; + + @override + Ticker createTicker(TickerCallback onTick) { + assert(() { + if (_ticker == null) return true; + throw FlutterError.fromParts([ + ErrorSummary( + '$runtimeType is a GetSingleTickerProviderStateMixin but multiple tickers were created.'), + ErrorDescription( + 'A GetSingleTickerProviderStateMixin can only be used as a TickerProvider once.'), + ErrorHint( + 'If a State is used for multiple AnimationController objects, or if it is passed to other ' + 'objects and those objects might use it more than one time in total, then instead of ' + 'mixing in a GetSingleTickerProviderStateMixin, use a regular GetTickerProviderStateMixin.', + ), + ]); + }()); + _ticker = + Ticker(onTick, debugLabel: kDebugMode ? 'created by $this' : null); + // We assume that this is called from initState, build, or some sort of + // event handler, and that thus TickerMode.of(context) would return true. We + // can't actually check that here because if we're in initState then we're + // not allowed to do inheritance checks yet. + return _ticker!; + } + + void didChangeDependencies(BuildContext context) { + if (_ticker != null) _ticker!.muted = !TickerMode.of(context); + } + + @override + void onClose() { + assert(() { + if (_ticker == null || !_ticker!.isActive) return true; + throw FlutterError.fromParts([ + ErrorSummary('$this was disposed with an active Ticker.'), + ErrorDescription( + '$runtimeType created a Ticker via its GetSingleTickerProviderStateMixin, but at the time ' + 'dispose() was called on the mixin, that Ticker was still active. The Ticker must ' + 'be disposed before calling super.dispose().', + ), + ErrorHint( + 'Tickers used by AnimationControllers ' + 'should be disposed by calling dispose() on the AnimationController itself. ' + 'Otherwise, the ticker will leak.', + ), + _ticker!.describeForError('The offending ticker was'), + ]); + }()); + super.onClose(); + } +} + +/// Used like `TickerProviderMixin` but only with Get Controllers. +/// Simplifies multiple AnimationController creation inside GetxController. +/// +/// Example: +///``` +///class SplashController extends GetxController with +/// GetTickerProviderStateMixin { +/// AnimationController first_controller; +/// AnimationController second_controller; +/// +/// @override +/// void onInit() { +/// final duration = const Duration(seconds: 2); +/// first_controller = +/// AnimationController.unbounded(duration: duration, vsync: this); +/// second_controller = +/// AnimationController.unbounded(duration: duration, vsync: this); +/// first_controller.repeat(); +/// first_controller.addListener(() => +/// print("Animation Controller value: ${first_controller.value}")); +/// second_controller.addListener(() => +/// print("Animation Controller value: ${second_controller.value}")); +/// } +/// ... +/// ``` +mixin GetTickerProviderStateMixin on GetxController implements TickerProvider { + Set? _tickers; + + @override + Ticker createTicker(TickerCallback onTick) { + _tickers ??= <_WidgetTicker>{}; + final result = _WidgetTicker(onTick, this, + debugLabel: kDebugMode ? 'created by ${describeIdentity(this)}' : null); + _tickers!.add(result); + return result; + } + + void _removeTicker(_WidgetTicker ticker) { + assert(_tickers != null); + assert(_tickers!.contains(ticker)); + _tickers!.remove(ticker); + } + + void didChangeDependencies(BuildContext context) { + final muted = !TickerMode.of(context); + if (_tickers != null) { + for (final ticker in _tickers!) { + ticker.muted = muted; + } + } + } + + @override + void onClose() { + assert(() { + if (_tickers != null) { + for (final ticker in _tickers!) { + if (ticker.isActive) { + throw FlutterError.fromParts([ + ErrorSummary('$this was disposed with an active Ticker.'), + ErrorDescription( + '$runtimeType created a Ticker via its GetTickerProviderStateMixin, but at the time ' + 'dispose() was called on the mixin, that Ticker was still active. All Tickers must ' + 'be disposed before calling super.dispose().', + ), + ErrorHint( + 'Tickers used by AnimationControllers ' + 'should be disposed by calling dispose() on the AnimationController itself. ' + 'Otherwise, the ticker will leak.', + ), + ticker.describeForError('The offending ticker was'), + ]); + } + } + } + return true; + }()); + super.onClose(); + } +} + +class _WidgetTicker extends Ticker { + _WidgetTicker(TickerCallback onTick, this._creator, {String? debugLabel}) + : super(onTick, debugLabel: debugLabel); + + final GetTickerProviderStateMixin _creator; + + @override + void dispose() { + _creator._removeTicker(this); + super.dispose(); + } +} + +@Deprecated('use GetSingleTickerProviderStateMixin') + +/// Used like `SingleTickerProviderMixin` but only with Get Controllers. +/// Simplifies AnimationController creation inside GetxController. +/// +/// Example: +///``` +///class SplashController extends GetxController with +/// SingleGetTickerProviderMixin { +/// AnimationController _ac; +/// +/// @override +/// void onInit() { +/// final dur = const Duration(seconds: 2); +/// _ac = AnimationController.unbounded(duration: dur, vsync: this); +/// _ac.repeat(); +/// _ac.addListener(() => print("Animation Controller value: ${_ac.value}")); +/// } +/// ... +/// ``` +mixin SingleGetTickerProviderMixin on DisposableInterface + implements TickerProvider { + @override + Ticker createTicker(TickerCallback onTick) => Ticker(onTick); +} diff --git a/siro_rider/packages/get/lib/get_state_manager/src/simple/get_controllers.dart b/siro_rider/packages/get/lib/get_state_manager/src/simple/get_controllers.dart new file mode 100644 index 0000000..aa20d26 --- /dev/null +++ b/siro_rider/packages/get/lib/get_state_manager/src/simple/get_controllers.dart @@ -0,0 +1,123 @@ +// ignore: prefer_mixin +import 'package:flutter/widgets.dart'; + +import '../../../instance_manager.dart'; +import '../rx_flutter/rx_disposable.dart'; +import '../rx_flutter/rx_notifier.dart'; +import 'list_notifier.dart'; + +// ignore: prefer_mixin +abstract class GetxController extends DisposableInterface + with ListenableMixin, ListNotifierMixin { + /// Rebuilds `GetBuilder` each time you call `update()`; + /// Can take a List of [ids], that will only update the matching + /// `GetBuilder( id: )`, + /// [ids] can be reused among `GetBuilders` like group tags. + /// The update will only notify the Widgets, if [condition] is true. + void update([List? ids, bool condition = true]) { + if (!condition) { + return; + } + if (ids == null) { + refresh(); + } else { + for (final id in ids) { + refreshGroup(id); + } + } + } +} + +mixin ScrollMixin on GetLifeCycleBase { + final ScrollController scroll = ScrollController(); + + @override + void onInit() { + super.onInit(); + scroll.addListener(_listener); + } + + bool _canFetchBottom = true; + + bool _canFetchTop = true; + + void _listener() { + if (scroll.position.atEdge) { + _checkIfCanLoadMore(); + } + } + + Future _checkIfCanLoadMore() async { + if (scroll.position.pixels == 0) { + if (!_canFetchTop) return; + _canFetchTop = false; + await onTopScroll(); + _canFetchTop = true; + } else { + if (!_canFetchBottom) return; + _canFetchBottom = false; + await onEndScroll(); + _canFetchBottom = true; + } + } + + Future onEndScroll(); + + Future onTopScroll(); + + @override + void onClose() { + scroll.removeListener(_listener); + super.onClose(); + } +} + +abstract class RxController extends DisposableInterface {} + +abstract class SuperController extends FullLifeCycleController + with FullLifeCycleMixin, StateMixin {} + +abstract class FullLifeCycleController extends GetxController + with + // ignore: prefer_mixin + WidgetsBindingObserver {} + +mixin FullLifeCycleMixin on FullLifeCycleController { + @mustCallSuper + @override + void onInit() { + super.onInit(); + ambiguate(WidgetsBinding.instance)?.addObserver(this); + } + + @mustCallSuper + @override + void onClose() { + ambiguate(WidgetsBinding.instance)?.removeObserver(this); + super.onClose(); + } + + @mustCallSuper + @override + void didChangeAppLifecycleState(AppLifecycleState state) { + switch (state) { + case AppLifecycleState.resumed: + onResumed(); + break; + case AppLifecycleState.inactive: + onInactive(); + break; + case AppLifecycleState.paused: + onPaused(); + break; + case AppLifecycleState.detached: + onDetached(); + break; + } + } + + void onResumed(); + void onPaused(); + void onInactive(); + void onDetached(); +} diff --git a/siro_rider/packages/get/lib/get_state_manager/src/simple/get_responsive.dart b/siro_rider/packages/get/lib/get_state_manager/src/simple/get_responsive.dart new file mode 100644 index 0000000..d7a03bc --- /dev/null +++ b/siro_rider/packages/get/lib/get_state_manager/src/simple/get_responsive.dart @@ -0,0 +1,172 @@ +import 'package:flutter/widgets.dart'; + +import '../../../get.dart'; + +mixin GetResponsiveMixin on Widget { + ResponsiveScreen get screen; + bool get alwaysUseBuilder; + + @protected + Widget build(BuildContext context) { + screen.context = context; + Widget? widget; + if (alwaysUseBuilder) { + widget = builder(); + if (widget != null) return widget; + } + if (screen.isDesktop) { + widget = desktop() ?? widget; + if (widget != null) return widget; + } + if (screen.isTablet) { + widget = tablet() ?? desktop(); + if (widget != null) return widget; + } + if (screen.isPhone) { + widget = phone() ?? tablet() ?? desktop(); + if (widget != null) return widget; + } + return watch() ?? phone() ?? tablet() ?? desktop() ?? builder()!; + } + + Widget? builder() => null; + + Widget? desktop() => null; + + Widget? phone() => null; + + Widget? tablet() => null; + + Widget? watch() => null; +} + +/// Extend this widget to build responsive view. +/// this widget contains the `screen` property that have all +/// information about the screen size and type. +/// You have two options to build it. +/// 1- with `builder` method you return the widget to build. +/// 2- with methods `desktop`, `tablet`,`phone`, `watch`. the specific +/// method will be built when the screen type matches the method +/// when the screen is [ScreenType.Tablet] the `tablet` method +/// will be exuded and so on. +/// Note if you use this method please set the +/// property `alwaysUseBuilder` to false +/// With `settings` property you can set the width limit for the screen types. +class GetResponsiveView extends GetView with GetResponsiveMixin { + @override + final bool alwaysUseBuilder; + + @override + final ResponsiveScreen screen; + + GetResponsiveView({ + this.alwaysUseBuilder = false, + ResponsiveScreenSettings settings = const ResponsiveScreenSettings(), + Key? key, + }) : screen = ResponsiveScreen(settings), + super(key: key); +} + +class GetResponsiveWidget extends GetWidget + with GetResponsiveMixin { + @override + final bool alwaysUseBuilder; + + @override + final ResponsiveScreen screen; + + GetResponsiveWidget({ + this.alwaysUseBuilder = false, + ResponsiveScreenSettings settings = const ResponsiveScreenSettings(), + Key? key, + }) : screen = ResponsiveScreen(settings), + super(key: key); +} + +class ResponsiveScreenSettings { + /// When the width is greater als this value + /// the display will be set as [ScreenType.Desktop] + final double desktopChangePoint; + + /// When the width is greater als this value + /// the display will be set as [ScreenType.Tablet] + /// or when width greater als [watchChangePoint] and smaller als this value + /// the display will be [ScreenType.Phone] + final double tabletChangePoint; + + /// When the width is smaller als this value + /// the display will be set as [ScreenType.Watch] + /// or when width greater als this value and smaller als [tabletChangePoint] + /// the display will be [ScreenType.Phone] + final double watchChangePoint; + + const ResponsiveScreenSettings( + {this.desktopChangePoint = 1200, + this.tabletChangePoint = 600, + this.watchChangePoint = 300}); +} + +class ResponsiveScreen { + late BuildContext context; + final ResponsiveScreenSettings settings; + + late bool _isPaltformDesktop; + ResponsiveScreen(this.settings) { + _isPaltformDesktop = GetPlatform.isDesktop; + } + + double get height => context.height; + double get width => context.width; + + /// Is [screenType] [ScreenType.Desktop] + bool get isDesktop => (screenType == ScreenType.Desktop); + + /// Is [screenType] [ScreenType.Tablet] + bool get isTablet => (screenType == ScreenType.Tablet); + + /// Is [screenType] [ScreenType.Phone] + bool get isPhone => (screenType == ScreenType.Phone); + + /// Is [screenType] [ScreenType.Watch] + bool get isWatch => (screenType == ScreenType.Watch); + + double get _getdeviceWidth { + if (_isPaltformDesktop) { + return width; + } + return context.mediaQueryShortestSide; + } + + ScreenType get screenType { + final deviceWidth = _getdeviceWidth; + if (deviceWidth >= settings.desktopChangePoint) return ScreenType.Desktop; + if (deviceWidth >= settings.tabletChangePoint) return ScreenType.Tablet; + if (deviceWidth < settings.watchChangePoint) return ScreenType.Watch; + return ScreenType.Phone; + } + + /// Return widget according to screen type + /// if the [screenType] is [ScreenType.Desktop] and + /// `desktop` object is null the `tablet` object will be returned + /// and if `tablet` object is null the `mobile` object will be returned + /// and if `mobile` object is null the `watch` object will be returned + /// also when it is null. + T? responsiveValue({ + T? mobile, + T? tablet, + T? desktop, + T? watch, + }) { + if (isDesktop && desktop != null) return desktop; + if (isTablet && tablet != null) return tablet; + if (isPhone && mobile != null) return mobile; + return watch; + } +} + +enum ScreenType { + Watch, + Phone, + Tablet, + Desktop, +} diff --git a/siro_rider/packages/get/lib/get_state_manager/src/simple/get_state.dart b/siro_rider/packages/get/lib/get_state_manager/src/simple/get_state.dart new file mode 100644 index 0000000..6baf344 --- /dev/null +++ b/siro_rider/packages/get/lib/get_state_manager/src/simple/get_state.dart @@ -0,0 +1,226 @@ +import 'package:flutter/material.dart'; +import '../../../get_instance/src/get_instance.dart'; +import '../../../instance_manager.dart'; +import '../../get_state_manager.dart'; +import 'list_notifier.dart'; + +/// Complies with `GetStateUpdater` +/// +/// This mixin's function represents a `GetStateUpdater`, and might be used +/// by `GetBuilder()`, `SimpleBuilder()` (or similar) to comply +/// with [GetStateUpdate] signature. REPLACING the [StateSetter]. +/// Avoids the potential (but extremely unlikely) issue of having +/// the Widget in a dispose() state, and abstracts the +/// API from the ugly fn((){}). +mixin GetStateUpdaterMixin on State { + // To avoid the creation of an anonym function to be GC later. + // ignore: prefer_function_declarations_over_variables + + /// Experimental method to replace setState((){}); + /// Used with GetStateUpdate. + void getUpdate() { + if (mounted) setState(() {}); + } +} + +typedef GetControllerBuilder = Widget Function( + T controller); + +// class _InheritedGetxController +// extends InheritedWidget { +// final T model; +// final int version; + +// _InheritedGetxController({ +// Key key, +// @required Widget child, +// @required this.model, +// }) : version = model.notifierVersion, +// super(key: key, child: child); + +// @override +// bool updateShouldNotify(_InheritedGetxController oldWidget) => +// (oldWidget.version != version); +// } + +// extension WatchEtx on GetxController { +// T watch() { +// final instance = Get.find(); +// _GetBuilderState._currentState.watch(instance.update); +// return instance; +// } +// } + +class GetBuilder extends StatefulWidget { + final GetControllerBuilder builder; + final bool global; + final Object? id; + final String? tag; + final bool autoRemove; + final bool assignId; + final Object Function(T value)? filter; + final void Function(GetBuilderState state)? initState, + dispose, + didChangeDependencies; + final void Function(GetBuilder oldWidget, GetBuilderState state)? + didUpdateWidget; + final T? init; + + const GetBuilder({ + Key? key, + this.init, + this.global = true, + required this.builder, + this.autoRemove = true, + this.assignId = false, + this.initState, + this.filter, + this.tag, + this.dispose, + this.id, + this.didChangeDependencies, + this.didUpdateWidget, + }) : super(key: key); + + // static T of( + // BuildContext context, { + // bool rebuild = false, + // }) { + // var widget = rebuild + // ? context + // .dependOnInheritedWidgetOfExactType<_InheritedGetxController>() + // : context + // .getElementForInheritedWidgetOfExactType< + // _InheritedGetxController>() + // ?.widget; + + // if (widget == null) { + // throw 'Error: Could not find the correct dependency.'; + // } else { + // return (widget as _InheritedGetxController).model; + // } + // } + + @override + GetBuilderState createState() => GetBuilderState(); +} + +class GetBuilderState extends State> + with GetStateUpdaterMixin { + T? controller; + bool? _isCreator = false; + VoidCallback? _remove; + Object? _filter; + + @override + void initState() { + // _GetBuilderState._currentState = this; + super.initState(); + widget.initState?.call(this); + + var isRegistered = GetInstance().isRegistered(tag: widget.tag); + + if (widget.global) { + if (isRegistered) { + if (GetInstance().isPrepared(tag: widget.tag)) { + _isCreator = true; + } else { + _isCreator = false; + } + controller = GetInstance().find(tag: widget.tag); + } else { + controller = widget.init; + _isCreator = true; + GetInstance().put(controller!, tag: widget.tag); + } + } else { + controller = widget.init; + _isCreator = true; + controller?.onStart(); + } + + if (widget.filter != null) { + _filter = widget.filter!(controller!); + } + + _subscribeToController(); + } + + /// Register to listen Controller's events. + /// It gets a reference to the remove() callback, to delete the + /// setState "link" from the Controller. + void _subscribeToController() { + _remove?.call(); + _remove = (widget.id == null) + ? controller?.addListener( + _filter != null ? _filterUpdate : getUpdate, + ) + : controller?.addListenerId( + widget.id, + _filter != null ? _filterUpdate : getUpdate, + ); + } + + void _filterUpdate() { + var newFilter = widget.filter!(controller!); + if (newFilter != _filter) { + _filter = newFilter; + getUpdate(); + } + } + + @override + void dispose() { + super.dispose(); + widget.dispose?.call(this); + if (_isCreator! || widget.assignId) { + if (widget.autoRemove && GetInstance().isRegistered(tag: widget.tag)) { + GetInstance().delete(tag: widget.tag); + } + } + + _remove?.call(); + + controller = null; + _isCreator = null; + _remove = null; + _filter = null; + } + + @override + void didChangeDependencies() { + super.didChangeDependencies(); + widget.didChangeDependencies?.call(this); + } + + @override + void didUpdateWidget(GetBuilder oldWidget) { + super.didUpdateWidget(oldWidget as GetBuilder); + // to avoid conflicts when modifying a "grouped" id list. + if (oldWidget.id != widget.id) { + _subscribeToController(); + } + widget.didUpdateWidget?.call(oldWidget, this); + } + + @override + Widget build(BuildContext context) { + // return _InheritedGetxController( + // model: controller, + // child: widget.builder(controller), + // ); + return widget.builder(controller!); + } +} + +// extension FindExt on BuildContext { +// T find() { +// return GetBuilder.of(this, rebuild: false); +// } +// } + +// extension ObserverEtx on BuildContext { +// T obs() { +// return GetBuilder.of(this, rebuild: true); +// } +// } diff --git a/siro_rider/packages/get/lib/get_state_manager/src/simple/get_view.dart b/siro_rider/packages/get/lib/get_state_manager/src/simple/get_view.dart new file mode 100644 index 0000000..b56afd7 --- /dev/null +++ b/siro_rider/packages/get/lib/get_state_manager/src/simple/get_view.dart @@ -0,0 +1,105 @@ +import 'package:flutter/widgets.dart'; + +import '../../../instance_manager.dart'; +import '../../../utils.dart'; +import 'get_widget_cache.dart'; + +/// GetView is a great way of quickly access your Controller +/// without having to call Get.find() yourself. +/// +/// Sample: +/// ``` +/// class AwesomeController extends GetxController { +/// final String title = 'My Awesome View'; +/// } +/// +/// class AwesomeView extends GetView { +/// /// if you need you can pass the tag for +/// /// Get.find(tag:"myTag"); +/// @override +/// final String tag = "myTag"; +/// +/// AwesomeView({Key key}):super(key:key); +/// +/// @override +/// Widget build(BuildContext context) { +/// return Container( +/// padding: EdgeInsets.all(20), +/// child: Text( controller.title ), +/// ); +/// } +/// } +///`` +abstract class GetView extends StatelessWidget { + const GetView({Key? key}) : super(key: key); + + final String? tag = null; + + T get controller => GetInstance().find(tag: tag)!; + + @override + Widget build(BuildContext context); +} + +/// GetWidget is a great way of quickly access your individual Controller +/// without having to call Get.find() yourself. +/// Get save you controller on cache, so, you can to use Get.create() safely +/// GetWidget is perfect to multiples instance of a same controller. Each +/// GetWidget will have your own controller, and will be call events as `onInit` +/// and `onClose` when the controller get in/get out on memory. +abstract class GetWidget extends GetWidgetCache { + const GetWidget({Key? key}) : super(key: key); + + @protected + final String? tag = null; + + S get controller => GetWidget._cache[this] as S; + + // static final _cache = {}; + + static final _cache = Expando(); + + @protected + Widget build(BuildContext context); + + @override + WidgetCache createWidgetCache() => _GetCache(); +} + +class _GetCache extends WidgetCache> { + S? _controller; + bool _isCreator = false; + InstanceInfo? info; + @override + void onInit() { + info = GetInstance().getInstanceInfo(tag: widget!.tag); + + _isCreator = info!.isPrepared && info!.isCreate; + + if (info!.isRegistered) { + _controller = Get.find(tag: widget!.tag); + } + + GetWidget._cache[widget!] = _controller; + super.onInit(); + } + + @override + void onClose() { + if (_isCreator) { + Get.asap(() { + widget!.controller!.onDelete(); + Get.log('"${widget!.controller.runtimeType}" onClose() called'); + Get.log('"${widget!.controller.runtimeType}" deleted from memory'); + GetWidget._cache[widget!] = null; + }); + } + info = null; + super.onClose(); + } + + @override + Widget build(BuildContext context) { + return widget!.build(context); + } +} diff --git a/siro_rider/packages/get/lib/get_state_manager/src/simple/get_widget_cache.dart b/siro_rider/packages/get/lib/get_state_manager/src/simple/get_widget_cache.dart new file mode 100644 index 0000000..b0224bd --- /dev/null +++ b/siro_rider/packages/get/lib/get_state_manager/src/simple/get_widget_cache.dart @@ -0,0 +1,71 @@ +import 'package:flutter/widgets.dart'; + +abstract class GetWidgetCache extends Widget { + const GetWidgetCache({Key? key}) : super(key: key); + + @override + GetWidgetCacheElement createElement() => GetWidgetCacheElement(this); + + @protected + @factory + WidgetCache createWidgetCache(); +} + +class GetWidgetCacheElement extends ComponentElement { + GetWidgetCacheElement(GetWidgetCache widget) + : cache = widget.createWidgetCache(), + super(widget) { + cache._element = this; + cache._widget = widget; + } + + @override + void mount(Element? parent, dynamic newSlot) { + cache.onInit(); + super.mount(parent, newSlot); + } + + @override + Widget build() => cache.build(this); + + final WidgetCache cache; + + @override + void performRebuild() { + super.performRebuild(); + } + + @override + void activate() { + super.activate(); + markNeedsBuild(); + } + + @override + void unmount() { + super.unmount(); + cache.onClose(); + cache._element = null; + } +} + +@optionalTypeArgs +abstract class WidgetCache { + T? get widget => _widget; + T? _widget; + + BuildContext? get context => _element; + + GetWidgetCacheElement? _element; + + @protected + @mustCallSuper + void onInit() {} + + @protected + @mustCallSuper + void onClose() {} + + @protected + Widget build(BuildContext context); +} diff --git a/siro_rider/packages/get/lib/get_state_manager/src/simple/list_notifier.dart b/siro_rider/packages/get/lib/get_state_manager/src/simple/list_notifier.dart new file mode 100644 index 0000000..c8f42f1 --- /dev/null +++ b/siro_rider/packages/get/lib/get_state_manager/src/simple/list_notifier.dart @@ -0,0 +1,175 @@ +import 'dart:collection'; + +import 'package:flutter/widgets.dart'; + +// This callback remove the listener on addListener function +typedef Disposer = void Function(); + +// replacing StateSetter, return if the Widget is mounted for extra validation. +// if it brings overhead the extra call, +typedef GetStateUpdate = void Function(); + +class ListNotifier extends Listenable with ListenableMixin, ListNotifierMixin {} + +mixin ListenableMixin implements Listenable {} +mixin ListNotifierMixin on ListenableMixin { + // int _version = 0; + // int _microtask = 0; + + // int get notifierVersion => _version; + // int get notifierMicrotask => _microtask; + + List? _updaters = []; + + HashMap>? _updatersGroupIds = + HashMap>(); + + @protected + void refresh() { + assert(_debugAssertNotDisposed()); + + /// This debounce the call to update. + /// It prevent errors and duplicates builds + // if (_microtask == _version) { + // _microtask++; + // scheduleMicrotask(() { + // _version++; + // _microtask = _version; + _notifyUpdate(); + // }); + // } + } + + void _notifyUpdate() { + for (var element in _updaters!) { + element!(); + } + } + + void _notifyIdUpdate(Object id) { + if (_updatersGroupIds!.containsKey(id)) { + final listGroup = _updatersGroupIds![id]!; + for (var item in listGroup) { + item(); + } + } + } + + @protected + void refreshGroup(Object id) { + assert(_debugAssertNotDisposed()); + + // /// This debounce the call to update. + // /// It prevent errors and duplicates builds + // if (_microtask == _version) { + // _microtask++; + // scheduleMicrotask(() { + // _version++; + // _microtask = _version; + _notifyIdUpdate(id); + // }); + // } + } + + bool _debugAssertNotDisposed() { + assert(() { + if (_updaters == null) { + throw FlutterError('''A $runtimeType was used after being disposed.\n +'Once you have called dispose() on a $runtimeType, it can no longer be used.'''); + } + return true; + }()); + return true; + } + + @protected + void notifyChildrens() { + TaskManager.instance.notify(_updaters); + } + + bool get hasListeners { + assert(_debugAssertNotDisposed()); + return _updaters!.isNotEmpty; + } + + int get listeners { + assert(_debugAssertNotDisposed()); + return _updaters!.length; + } + + @override + void removeListener(VoidCallback listener) { + assert(_debugAssertNotDisposed()); + _updaters!.remove(listener); + } + + void removeListenerId(Object id, VoidCallback listener) { + assert(_debugAssertNotDisposed()); + if (_updatersGroupIds!.containsKey(id)) { + _updatersGroupIds![id]!.remove(listener); + } + _updaters!.remove(listener); + } + + @mustCallSuper + void dispose() { + assert(_debugAssertNotDisposed()); + _updaters = null; + _updatersGroupIds = null; + } + + @override + Disposer addListener(GetStateUpdate listener) { + assert(_debugAssertNotDisposed()); + _updaters!.add(listener); + return () => _updaters!.remove(listener); + } + + Disposer addListenerId(Object? key, GetStateUpdate listener) { + _updatersGroupIds![key] ??= []; + _updatersGroupIds![key]!.add(listener); + return () => _updatersGroupIds![key]!.remove(listener); + } + + /// To dispose an [id] from future updates(), this ids are registered + /// by `GetBuilder()` or similar, so is a way to unlink the state change with + /// the Widget from the Controller. + void disposeId(Object id) { + _updatersGroupIds!.remove(id); + } +} + +class TaskManager { + TaskManager._(); + + static TaskManager? _instance; + + static TaskManager get instance => _instance ??= TaskManager._(); + + GetStateUpdate? _setter; + + List? _remove; + + void notify(List? _updaters) { + if (_setter != null) { + if (!_updaters!.contains(_setter)) { + _updaters.add(_setter); + _remove!.add(() => _updaters.remove(_setter)); + } + } + } + + Widget exchange( + List disposers, + GetStateUpdate setState, + Widget Function(BuildContext) builder, + BuildContext context, + ) { + _remove = disposers; + _setter = setState; + final result = builder(context); + _remove = null; + _setter = null; + return result; + } +} diff --git a/siro_rider/packages/get/lib/get_state_manager/src/simple/mixin_state.dart b/siro_rider/packages/get/lib/get_state_manager/src/simple/mixin_state.dart new file mode 100644 index 0000000..0d2ae24 --- /dev/null +++ b/siro_rider/packages/get/lib/get_state_manager/src/simple/mixin_state.dart @@ -0,0 +1,41 @@ +import 'package:flutter/material.dart'; + +import '../../get_state_manager.dart'; + +class MixinBuilder extends StatelessWidget { + @required + final Widget Function(T) builder; + final bool global; + final String? id; + final bool autoRemove; + final void Function(State state)? initState, dispose, didChangeDependencies; + final void Function(GetBuilder oldWidget, State state)? didUpdateWidget; + final T? init; + + const MixinBuilder({ + Key? key, + this.init, + this.global = true, + required this.builder, + this.autoRemove = true, + this.initState, + this.dispose, + this.id, + this.didChangeDependencies, + this.didUpdateWidget, + }) : super(key: key); + + @override + Widget build(BuildContext context) { + return GetBuilder( + init: init, + global: global, + autoRemove: autoRemove, + initState: initState, + dispose: dispose, + id: id, + didChangeDependencies: didChangeDependencies, + didUpdateWidget: didUpdateWidget, + builder: (controller) => Obx(() => builder.call(controller))); + } +} diff --git a/siro_rider/packages/get/lib/get_state_manager/src/simple/simple_builder.dart b/siro_rider/packages/get/lib/get_state_manager/src/simple/simple_builder.dart new file mode 100644 index 0000000..3fa0fa7 --- /dev/null +++ b/siro_rider/packages/get/lib/get_state_manager/src/simple/simple_builder.dart @@ -0,0 +1,108 @@ +import 'dart:async'; +import 'package:flutter/widgets.dart'; +import 'get_state.dart'; +import 'list_notifier.dart'; + +typedef ValueBuilderUpdateCallback = void Function(T snapshot); +typedef ValueBuilderBuilder = Widget Function( + T snapshot, ValueBuilderUpdateCallback updater); + +/// Manages a local state like ObxValue, but uses a callback instead of +/// a Rx value. +/// +/// Example: +/// ``` +/// ValueBuilder( +/// initialValue: false, +/// builder: (value, update) => Switch( +/// value: value, +/// onChanged: (flag) { +/// update( flag ); +/// },), +/// onUpdate: (value) => print("Value updated: $value"), +/// ), +/// ``` +class ValueBuilder extends StatefulWidget { + final T? initialValue; + final ValueBuilderBuilder builder; + final void Function()? onDispose; + final void Function(T)? onUpdate; + + const ValueBuilder({ + Key? key, + this.initialValue, + this.onDispose, + this.onUpdate, + required this.builder, + }) : super(key: key); + + @override + _ValueBuilderState createState() => _ValueBuilderState(); +} + +class _ValueBuilderState extends State> { + T? value; + + @override + void initState() { + super.initState(); + value = widget.initialValue; + } + + @override + Widget build(BuildContext context) => widget.builder(value, updater); + + void updater(T? newValue) { + if (widget.onUpdate != null) { + widget.onUpdate!(newValue); + } + setState(() { + value = newValue; + }); + } + + @override + void dispose() { + super.dispose(); + widget.onDispose?.call(); + if (value is ChangeNotifier) { + (value as ChangeNotifier?)?.dispose(); + } else if (value is StreamController) { + (value as StreamController?)?.close(); + } + value = null; + } +} + +// It's a experimental feature +class SimpleBuilder extends StatefulWidget { + final Widget Function(BuildContext) builder; + + const SimpleBuilder({Key? key, required this.builder}) : super(key: key); + + @override + _SimpleBuilderState createState() => _SimpleBuilderState(); +} + +class _SimpleBuilderState extends State + with GetStateUpdaterMixin { + final disposers = []; + + @override + void dispose() { + super.dispose(); + for (final disposer in disposers) { + disposer(); + } + } + + @override + Widget build(BuildContext context) { + return TaskManager.instance.exchange( + disposers, + getUpdate, + widget.builder, + context, + ); + } +} diff --git a/siro_rider/packages/get/lib/get_utils/get_utils.dart b/siro_rider/packages/get/lib/get_utils/get_utils.dart new file mode 100644 index 0000000..15bc8f8 --- /dev/null +++ b/siro_rider/packages/get/lib/get_utils/get_utils.dart @@ -0,0 +1,4 @@ +export 'src/extensions/export.dart'; +export 'src/get_utils/get_utils.dart'; +export 'src/platform/platform.dart'; +export 'src/queue/get_queue.dart'; diff --git a/siro_rider/packages/get/lib/get_utils/src/extensions/context_extensions.dart b/siro_rider/packages/get/lib/get_utils/src/extensions/context_extensions.dart new file mode 100644 index 0000000..31b49af --- /dev/null +++ b/siro_rider/packages/get/lib/get_utils/src/extensions/context_extensions.dart @@ -0,0 +1,141 @@ +import 'package:flutter/material.dart'; + +import '../platform/platform.dart'; + +extension ContextExtensionss on BuildContext { + /// The same of [MediaQuery.of(context).size] + Size get mediaQuerySize => MediaQuery.of(this).size; + + /// The same of [MediaQuery.of(context).size.height] + /// Note: updates when you rezise your screen (like on a browser or + /// desktop window) + double get height => mediaQuerySize.height; + + /// The same of [MediaQuery.of(context).size.width] + /// Note: updates when you rezise your screen (like on a browser or + /// desktop window) + double get width => mediaQuerySize.width; + + /// Gives you the power to get a portion of the height. + /// Useful for responsive applications. + /// + /// [dividedBy] is for when you want to have a portion of the value you + /// would get like for example: if you want a value that represents a third + /// of the screen you can set it to 3, and you will get a third of the height + /// + /// [reducedBy] is a percentage value of how much of the height you want + /// if you for example want 46% of the height, then you reduce it by 56%. + double heightTransformer({double dividedBy = 1, double reducedBy = 0.0}) { + return (mediaQuerySize.height - + ((mediaQuerySize.height / 100) * reducedBy)) / + dividedBy; + } + + /// Gives you the power to get a portion of the width. + /// Useful for responsive applications. + /// + /// [dividedBy] is for when you want to have a portion of the value you + /// would get like for example: if you want a value that represents a third + /// of the screen you can set it to 3, and you will get a third of the width + /// + /// [reducedBy] is a percentage value of how much of the width you want + /// if you for example want 46% of the width, then you reduce it by 56%. + double widthTransformer({double dividedBy = 1, double reducedBy = 0.0}) { + return (mediaQuerySize.width - ((mediaQuerySize.width / 100) * reducedBy)) / + dividedBy; + } + + /// Divide the height proportionally by the given value + double ratio({ + double dividedBy = 1, + double reducedByW = 0.0, + double reducedByH = 0.0, + }) { + return heightTransformer(dividedBy: dividedBy, reducedBy: reducedByH) / + widthTransformer(dividedBy: dividedBy, reducedBy: reducedByW); + } + + /// similar to [MediaQuery.of(context).padding] + ThemeData get theme => Theme.of(this); + + /// Check if dark mode theme is enable + bool get isDarkMode => (theme.brightness == Brightness.dark); + + /// give access to Theme.of(context).iconTheme.color + Color? get iconColor => theme.iconTheme.color; + + /// similar to [MediaQuery.of(context).padding] + TextTheme get textTheme => Theme.of(this).textTheme; + + /// similar to [MediaQuery.of(context).padding] + EdgeInsets get mediaQueryPadding => MediaQuery.of(this).padding; + + /// similar to [MediaQuery.of(context).padding] + MediaQueryData get mediaQuery => MediaQuery.of(this); + + /// similar to [MediaQuery.of(context).viewPadding] + EdgeInsets get mediaQueryViewPadding => MediaQuery.of(this).viewPadding; + + /// similar to [MediaQuery.of(context).viewInsets] + EdgeInsets get mediaQueryViewInsets => MediaQuery.of(this).viewInsets; + + /// similar to [MediaQuery.of(context).orientation] + Orientation get orientation => MediaQuery.of(this).orientation; + + /// check if device is on landscape mode + bool get isLandscape => orientation == Orientation.landscape; + + /// check if device is on portrait mode + bool get isPortrait => orientation == Orientation.portrait; + + /// similar to [MediaQuery.of(this).devicePixelRatio] + double get devicePixelRatio => MediaQuery.of(this).devicePixelRatio; + + /// similar to [MediaQuery.of(this).textScaleFactor] + double get textScaleFactor => MediaQuery.of(this).textScaleFactor; + + /// get the shortestSide from screen + double get mediaQueryShortestSide => mediaQuerySize.shortestSide; + + /// True if width be larger than 800 + bool get showNavbar => (width > 800); + + /// True if the shortestSide is smaller than 600p + bool get isPhone => (mediaQueryShortestSide < 600); + + /// True if the shortestSide is largest than 600p + bool get isSmallTablet => (mediaQueryShortestSide >= 600); + + /// True if the shortestSide is largest than 720p + bool get isLargeTablet => (mediaQueryShortestSide >= 720); + + /// True if the current device is Tablet + bool get isTablet => isSmallTablet || isLargeTablet; + + /// Returns a specific value according to the screen size + /// if the device width is higher than or equal to 1200 return + /// [desktop] value. if the device width is higher than or equal to 600 + /// and less than 1200 return [tablet] value. + /// if the device width is less than 300 return [watch] value. + /// in other cases return [mobile] value. + T responsiveValue({ + T? mobile, + T? tablet, + T? desktop, + T? watch, + }) { + var deviceWidth = mediaQuerySize.shortestSide; + if (GetPlatform.isDesktop) { + deviceWidth = mediaQuerySize.width; + } + if (deviceWidth >= 1200 && desktop != null) { + return desktop; + } else if (deviceWidth >= 600 && tablet != null) { + return tablet; + } else if (deviceWidth < 300 && watch != null) { + return watch; + } else { + return mobile!; + } + } +} diff --git a/siro_rider/packages/get/lib/get_utils/src/extensions/double_extensions.dart b/siro_rider/packages/get/lib/get_utils/src/extensions/double_extensions.dart new file mode 100644 index 0000000..03ffa36 --- /dev/null +++ b/siro_rider/packages/get/lib/get_utils/src/extensions/double_extensions.dart @@ -0,0 +1,8 @@ +import 'dart:math'; + +extension Precision on double { + double toPrecision(int fractionDigits) { + var mod = pow(10, fractionDigits.toDouble()).toDouble(); + return ((this * mod).round().toDouble() / mod); + } +} diff --git a/siro_rider/packages/get/lib/get_utils/src/extensions/duration_extensions.dart b/siro_rider/packages/get/lib/get_utils/src/extensions/duration_extensions.dart new file mode 100644 index 0000000..0bfd97c --- /dev/null +++ b/siro_rider/packages/get/lib/get_utils/src/extensions/duration_extensions.dart @@ -0,0 +1,20 @@ +import 'dart:async'; + +/// Duration utilities. +extension GetDurationUtils on Duration { + /// Utility to delay some callback (or code execution). + /// + /// Sample: + /// ``` + /// void main() async { + /// final _delay = 3.seconds; + /// print('+ wait $_delay'); + /// await _delay.delay(); + /// print('- finish wait $_delay'); + /// print('+ callback in 700ms'); + /// await 0.7.seconds.delay(() { + /// } + ///``` + Future delay([FutureOr Function()? callback]) async => + Future.delayed(this, callback); +} diff --git a/siro_rider/packages/get/lib/get_utils/src/extensions/dynamic_extensions.dart b/siro_rider/packages/get/lib/get_utils/src/extensions/dynamic_extensions.dart new file mode 100644 index 0000000..36f4f04 --- /dev/null +++ b/siro_rider/packages/get/lib/get_utils/src/extensions/dynamic_extensions.dart @@ -0,0 +1,23 @@ +import '../get_utils/get_utils.dart'; + +extension GetDynamicUtils on dynamic { + @Deprecated('isNull is deprecated and cannot be used, use "==" operator') + bool get isNull => GetUtils.isNull(this); + + bool? get isBlank => GetUtils.isBlank(this); + + @Deprecated( + 'isNullOrBlank is deprecated and cannot be used, use "isBlank" instead') + bool? get isNullOrBlank => GetUtils.isNullOrBlank(this); + + void printError( + {String info = '', Function logFunction = GetUtils.printFunction}) => + // ignore: unnecessary_this + logFunction('Error: ${this.runtimeType}', this, info, isError: true); + + void printInfo( + {String info = '', + Function printFunction = GetUtils.printFunction}) => + // ignore: unnecessary_this + printFunction('Info: ${this.runtimeType}', this, info); +} diff --git a/siro_rider/packages/get/lib/get_utils/src/extensions/event_loop_extensions.dart b/siro_rider/packages/get/lib/get_utils/src/extensions/event_loop_extensions.dart new file mode 100644 index 0000000..3dbee38 --- /dev/null +++ b/siro_rider/packages/get/lib/get_utils/src/extensions/event_loop_extensions.dart @@ -0,0 +1,23 @@ +import 'dart:async'; + +import '../../../get_core/src/get_interface.dart'; + +extension LoopEventsExt on GetInterface { + Future toEnd(FutureOr Function() computation) async { + await Future.delayed(Duration.zero); + final val = computation(); + return val; + } + + FutureOr asap(T Function() computation, + {bool Function()? condition}) async { + T val; + if (condition == null || !condition()) { + await Future.delayed(Duration.zero); + val = computation(); + } else { + val = computation(); + } + return val; + } +} diff --git a/siro_rider/packages/get/lib/get_utils/src/extensions/export.dart b/siro_rider/packages/get/lib/get_utils/src/extensions/export.dart new file mode 100644 index 0000000..064ab83 --- /dev/null +++ b/siro_rider/packages/get/lib/get_utils/src/extensions/export.dart @@ -0,0 +1,10 @@ +export 'context_extensions.dart'; +export 'double_extensions.dart'; +export 'duration_extensions.dart'; +export 'dynamic_extensions.dart'; +export 'event_loop_extensions.dart'; +export 'internacionalization.dart'; +export 'iterable_extensions.dart'; +export 'num_extensions.dart'; +export 'string_extensions.dart'; +export 'widget_extensions.dart'; diff --git a/siro_rider/packages/get/lib/get_utils/src/extensions/internacionalization.dart b/siro_rider/packages/get/lib/get_utils/src/extensions/internacionalization.dart new file mode 100644 index 0000000..e0155dd --- /dev/null +++ b/siro_rider/packages/get/lib/get_utils/src/extensions/internacionalization.dart @@ -0,0 +1,145 @@ +import 'dart:ui'; + +import '../../../get_core/get_core.dart'; + +class _IntlHost { + Locale? locale; + + Locale? fallbackLocale; + + Map> translations = {}; +} + +extension FirstWhereExt on List { + /// The first element satisfying [test], or `null` if there are none. + T? firstWhereOrNull(bool Function(T element) test) { + for (var element in this) { + if (test(element)) return element; + } + return null; + } +} + +extension LocalesIntl on GetInterface { + static final _intlHost = _IntlHost(); + + Locale? get locale => _intlHost.locale; + + Locale? get fallbackLocale => _intlHost.fallbackLocale; + + set locale(Locale? newLocale) => _intlHost.locale = newLocale; + + set fallbackLocale(Locale? newLocale) => _intlHost.fallbackLocale = newLocale; + + Map> get translations => _intlHost.translations; + + void addTranslations(Map> tr) { + translations.addAll(tr); + } + + void clearTranslations() { + translations.clear(); + } + + void appendTranslations(Map> tr) { + tr.forEach((key, map) { + if (translations.containsKey(key)) { + translations[key]!.addAll(map); + } else { + translations[key] = map; + } + }); + } +} + +extension Trans on String { + // Checks whether the language code and country code are present, and + // whether the key is also present. + bool get _fullLocaleAndKey { + return Get.translations.containsKey( + "${Get.locale!.languageCode}_${Get.locale!.countryCode}") && + Get.translations[ + "${Get.locale!.languageCode}_${Get.locale!.countryCode}"]! + .containsKey(this); + } + + // Checks if there is a callback language in the absence of the specific + // country, and if it contains that key. + Map? get _getSimilarLanguageTranslation { + final translationsWithNoCountry = Get.translations + .map((key, value) => MapEntry(key.split("_").first, value)); + final containsKey = translationsWithNoCountry + .containsKey(Get.locale!.languageCode.split("_").first); + + if (!containsKey) { + return null; + } + + return translationsWithNoCountry[Get.locale!.languageCode.split("_").first]; + } + + String get tr { + // print('language'); + // print(Get.locale!.languageCode); + // print('contains'); + // print(Get.translations.containsKey(Get.locale!.languageCode)); + // print(Get.translations.keys); + // Returns the key if locale is null. + if (Get.locale?.languageCode == null) return this; + + if (_fullLocaleAndKey) { + return Get.translations[ + "${Get.locale!.languageCode}_${Get.locale!.countryCode}"]![this]!; + } + final similarTranslation = _getSimilarLanguageTranslation; + if (similarTranslation != null && similarTranslation.containsKey(this)) { + return similarTranslation[this]!; + // If there is no corresponding language or corresponding key, return + // the key. + } else if (Get.fallbackLocale != null) { + final fallback = Get.fallbackLocale!; + final key = "${fallback.languageCode}_${fallback.countryCode}"; + + if (Get.translations.containsKey(key) && + Get.translations[key]!.containsKey(this)) { + return Get.translations[key]![this]!; + } + if (Get.translations.containsKey(fallback.languageCode) && + Get.translations[fallback.languageCode]!.containsKey(this)) { + return Get.translations[fallback.languageCode]![this]!; + } + return this; + } else { + return this; + } + } + + String trArgs([List args = const []]) { + var key = tr; + if (args.isNotEmpty) { + for (final arg in args) { + key = key.replaceFirst(RegExp(r'%s'), arg.toString()); + } + } + return key; + } + + String trPlural([String? pluralKey, int? i, List args = const []]) { + return i == 1 ? trArgs(args) : pluralKey!.trArgs(args); + } + + String trParams([Map params = const {}]) { + var trans = tr; + if (params.isNotEmpty) { + params.forEach((key, value) { + trans = trans.replaceAll('@$key', value); + }); + } + return trans; + } + + String trPluralParams( + [String? pluralKey, int? i, Map params = const {}]) { + return i == 1 ? trParams(params) : pluralKey!.trParams(params); + } +} diff --git a/siro_rider/packages/get/lib/get_utils/src/extensions/iterable_extensions.dart b/siro_rider/packages/get/lib/get_utils/src/extensions/iterable_extensions.dart new file mode 100644 index 0000000..a9d9da8 --- /dev/null +++ b/siro_rider/packages/get/lib/get_utils/src/extensions/iterable_extensions.dart @@ -0,0 +1,9 @@ +extension IterableExtensions on Iterable { + Iterable mapMany( + Iterable? Function(T item) selector) sync* { + for (var item in this) { + final res = selector(item); + if (res != null) yield* res; + } + } +} diff --git a/siro_rider/packages/get/lib/get_utils/src/extensions/num_extensions.dart b/siro_rider/packages/get/lib/get_utils/src/extensions/num_extensions.dart new file mode 100644 index 0000000..20503ad --- /dev/null +++ b/siro_rider/packages/get/lib/get_utils/src/extensions/num_extensions.dart @@ -0,0 +1,68 @@ +import 'dart:async'; + +import '../get_utils/get_utils.dart'; + +extension GetNumUtils on num { + bool isLowerThan(num b) => GetUtils.isLowerThan(this, b); + + bool isGreaterThan(num b) => GetUtils.isGreaterThan(this, b); + + bool isEqual(num b) => GetUtils.isEqual(this, b); + + /// Utility to delay some callback (or code execution). + /// TODO: Add a separated implementation of delay() with the ability + /// to stop it. + /// + /// Sample: + /// ``` + /// void main() async { + /// print('+ wait for 2 seconds'); + /// await 2.delay(); + /// print('- 2 seconds completed'); + /// print('+ callback in 1.2sec'); + /// 1.delay(() => print('- 1.2sec callback called')); + /// print('currently running callback 1.2sec'); + /// } + ///``` + Future delay([FutureOr Function()? callback]) async => Future.delayed( + Duration(milliseconds: (this * 1000).round()), + callback, + ); + + /// Easy way to make Durations from numbers. + /// + /// Sample: + /// ``` + /// print(1.seconds + 200.milliseconds); + /// print(1.hours + 30.minutes); + /// print(1.5.hours); + ///``` + Duration get milliseconds => Duration(microseconds: (this * 1000).round()); + + Duration get seconds => Duration(milliseconds: (this * 1000).round()); + + Duration get minutes => + Duration(seconds: (this * Duration.secondsPerMinute).round()); + + Duration get hours => + Duration(minutes: (this * Duration.minutesPerHour).round()); + + Duration get days => Duration(hours: (this * Duration.hoursPerDay).round()); + +//final _delayMaps = {}; +// TODO: create a proper Future and control the Timer. +// Future delay([double seconds = 0, VoidCallback callback]) async { +// final ms = (seconds * 1000).round(); +// return Future.delayed(Duration(milliseconds: ms), callback); +// return _delayMaps[callback]; +// } +//killDelay(VoidCallback callback) { +// if (_delayMaps.containsKey(callback)) { +// _delayMaps[callback]?.timeout(Duration.zero, onTimeout: () { +// print('callbacl eliminado!'); +// }); +// _delayMaps.remove(callback); +// } +//} + +} diff --git a/siro_rider/packages/get/lib/get_utils/src/extensions/string_extensions.dart b/siro_rider/packages/get/lib/get_utils/src/extensions/string_extensions.dart new file mode 100644 index 0000000..bbe7713 --- /dev/null +++ b/siro_rider/packages/get/lib/get_utils/src/extensions/string_extensions.dart @@ -0,0 +1,89 @@ +import '../get_utils/get_utils.dart'; + +extension GetStringUtils on String { + bool get isNum => GetUtils.isNum(this); + + bool get isNumericOnly => GetUtils.isNumericOnly(this); + + bool get isAlphabetOnly => GetUtils.isAlphabetOnly(this); + + bool get isBool => GetUtils.isBool(this); + + bool get isVectorFileName => GetUtils.isVector(this); + + bool get isImageFileName => GetUtils.isImage(this); + + bool get isAudioFileName => GetUtils.isAudio(this); + + bool get isVideoFileName => GetUtils.isVideo(this); + + bool get isTxtFileName => GetUtils.isTxt(this); + + bool get isDocumentFileName => GetUtils.isWord(this); + + bool get isExcelFileName => GetUtils.isExcel(this); + + bool get isPPTFileName => GetUtils.isPPT(this); + + bool get isAPKFileName => GetUtils.isAPK(this); + + bool get isPDFFileName => GetUtils.isPDF(this); + + bool get isHTMLFileName => GetUtils.isHTML(this); + + bool get isURL => GetUtils.isURL(this); + + bool get isEmail => GetUtils.isEmail(this); + + bool get isPhoneNumber => GetUtils.isPhoneNumber(this); + + bool get isDateTime => GetUtils.isDateTime(this); + + bool get isMD5 => GetUtils.isMD5(this); + + bool get isSHA1 => GetUtils.isSHA1(this); + + bool get isSHA256 => GetUtils.isSHA256(this); + + bool get isBinary => GetUtils.isBinary(this); + + bool get isIPv4 => GetUtils.isIPv4(this); + + bool get isIPv6 => GetUtils.isIPv6(this); + + bool get isHexadecimal => GetUtils.isHexadecimal(this); + + bool get isPalindrom => GetUtils.isPalindrom(this); + + bool get isPassport => GetUtils.isPassport(this); + + bool get isCurrency => GetUtils.isCurrency(this); + + bool get isCpf => GetUtils.isCpf(this); + + bool get isCnpj => GetUtils.isCnpj(this); + + bool isCaseInsensitiveContains(String b) => + GetUtils.isCaseInsensitiveContains(this, b); + + bool isCaseInsensitiveContainsAny(String b) => + GetUtils.isCaseInsensitiveContainsAny(this, b); + + String? get capitalize => GetUtils.capitalize(this); + + String? get capitalizeFirst => GetUtils.capitalizeFirst(this); + + String get removeAllWhitespace => GetUtils.removeAllWhitespace(this); + + String? get camelCase => GetUtils.camelCase(this); + + String? get paramCase => GetUtils.paramCase(this); + + String numericOnly({bool firstWordOnly = false}) => + GetUtils.numericOnly(this, firstWordOnly: firstWordOnly); + + String createPath([Iterable? segments]) { + final path = startsWith('/') ? this : '/$this'; + return GetUtils.createPath(path, segments); + } +} diff --git a/siro_rider/packages/get/lib/get_utils/src/extensions/widget_extensions.dart b/siro_rider/packages/get/lib/get_utils/src/extensions/widget_extensions.dart new file mode 100644 index 0000000..3e4b6d3 --- /dev/null +++ b/siro_rider/packages/get/lib/get_utils/src/extensions/widget_extensions.dart @@ -0,0 +1,56 @@ +import 'package:flutter/widgets.dart'; + +/// add Padding Property to widget +extension WidgetPaddingX on Widget { + Widget paddingAll(double padding) => + Padding(padding: EdgeInsets.all(padding), child: this); + + Widget paddingSymmetric({double horizontal = 0.0, double vertical = 0.0}) => + Padding( + padding: + EdgeInsets.symmetric(horizontal: horizontal, vertical: vertical), + child: this); + + Widget paddingOnly({ + double left = 0.0, + double top = 0.0, + double right = 0.0, + double bottom = 0.0, + }) => + Padding( + padding: EdgeInsets.only( + top: top, left: left, right: right, bottom: bottom), + child: this); + + Widget get paddingZero => Padding(padding: EdgeInsets.zero, child: this); +} + +/// Add margin property to widget +extension WidgetMarginX on Widget { + Widget marginAll(double margin) => + Container(margin: EdgeInsets.all(margin), child: this); + + Widget marginSymmetric({double horizontal = 0.0, double vertical = 0.0}) => + Container( + margin: + EdgeInsets.symmetric(horizontal: horizontal, vertical: vertical), + child: this); + + Widget marginOnly({ + double left = 0.0, + double top = 0.0, + double right = 0.0, + double bottom = 0.0, + }) => + Container( + margin: EdgeInsets.only( + top: top, left: left, right: right, bottom: bottom), + child: this); + + Widget get marginZero => Container(margin: EdgeInsets.zero, child: this); +} + +/// Allows you to insert widgets inside a CustomScrollView +extension WidgetSliverBoxX on Widget { + Widget get sliverBox => SliverToBoxAdapter(child: this); +} diff --git a/siro_rider/packages/get/lib/get_utils/src/get_utils/get_utils.dart b/siro_rider/packages/get/lib/get_utils/src/get_utils/get_utils.dart new file mode 100644 index 0000000..4275e33 --- /dev/null +++ b/siro_rider/packages/get/lib/get_utils/src/get_utils/get_utils.dart @@ -0,0 +1,639 @@ +import '../../../get_core/get_core.dart'; + +/// Returns whether a dynamic value PROBABLY +/// has the isEmpty getter/method by checking +/// standard dart types that contains it. +/// +/// This is here to for the 'DRY' +bool? _isEmpty(dynamic value) { + if (value is String) { + return value.toString().trim().isEmpty; + } + if (value is Iterable || value is Map) { + return value.isEmpty as bool?; + } + return false; +} + +/// Returns whether a dynamic value PROBABLY +/// has the length getter/method by checking +/// standard dart types that contains it. +/// +/// This is here to for the 'DRY' +bool _hasLength(dynamic value) { + return value is Iterable || value is String || value is Map; +} + +/// Obtains a length of a dynamic value +/// by previously validating it's type +/// +/// Note: if [value] is double/int +/// it will be taking the .toString +/// length of the given value. +/// +/// Note 2: **this may return null!** +/// +/// Note 3: null [value] returns null. +int? _obtainDynamicLength(dynamic value) { + if (value == null) { + // ignore: avoid_returning_null + return null; + } + + if (_hasLength(value)) { + return value.length as int?; + } + + if (value is int) { + return value.toString().length; + } + + if (value is double) { + return value.toString().replaceAll('.', '').length; + } + + // ignore: avoid_returning_null + return null; +} + +class GetUtils { + GetUtils._(); + + /// Checks if data is null. + static bool isNull(dynamic value) => value == null; + + /// In dart2js (in flutter v1.17) a var by default is undefined. + /// *Use this only if you are in version <- 1.17*. + /// So we assure the null type in json convertions to avoid the + /// "value":value==null?null:value; someVar.nil will force the null type + /// if the var is null or undefined. + /// `nil` taken from ObjC just to have a shorter sintax. + static dynamic nil(dynamic s) => s == null ? null : s; + + /// Checks if data is null or blank (empty or only contains whitespace). + static bool? isNullOrBlank(dynamic value) { + if (isNull(value)) { + return true; + } + + // Pretty sure that isNullOrBlank should't be validating + // iterables... but I'm going to keep this for compatibility. + return _isEmpty(value); + } + + /// Checks if data is null or blank (empty or only contains whitespace). + static bool? isBlank(dynamic value) { + return _isEmpty(value); + } + + /// Checks if string is int or double. + static bool isNum(String value) { + if (isNull(value)) { + return false; + } + + return num.tryParse(value) is num; + } + + /// Checks if string consist only numeric. + /// Numeric only doesn't accepting "." which double data type have + static bool isNumericOnly(String s) => hasMatch(s, r'^\d+$'); + + /// Checks if string consist only Alphabet. (No Whitespace) + static bool isAlphabetOnly(String s) => hasMatch(s, r'^[a-zA-Z]+$'); + + /// Checks if string contains at least one Capital Letter + static bool hasCapitalletter(String s) => hasMatch(s, r'[A-Z]'); + + /// Checks if string is boolean. + static bool isBool(String value) { + if (isNull(value)) { + return false; + } + + return (value == 'true' || value == 'false'); + } + + /// Checks if string is an video file. + static bool isVideo(String filePath) { + var ext = filePath.toLowerCase(); + + return ext.endsWith(".mp4") || + ext.endsWith(".avi") || + ext.endsWith(".wmv") || + ext.endsWith(".rmvb") || + ext.endsWith(".mpg") || + ext.endsWith(".mpeg") || + ext.endsWith(".3gp"); + } + + /// Checks if string is an image file. + static bool isImage(String filePath) { + final ext = filePath.toLowerCase(); + + return ext.endsWith(".jpg") || + ext.endsWith(".jpeg") || + ext.endsWith(".png") || + ext.endsWith(".gif") || + ext.endsWith(".bmp"); + } + + /// Checks if string is an audio file. + static bool isAudio(String filePath) { + final ext = filePath.toLowerCase(); + + return ext.endsWith(".mp3") || + ext.endsWith(".wav") || + ext.endsWith(".wma") || + ext.endsWith(".amr") || + ext.endsWith(".ogg"); + } + + /// Checks if string is an powerpoint file. + static bool isPPT(String filePath) { + final ext = filePath.toLowerCase(); + + return ext.endsWith(".ppt") || ext.endsWith(".pptx"); + } + + /// Checks if string is an word file. + static bool isWord(String filePath) { + final ext = filePath.toLowerCase(); + + return ext.endsWith(".doc") || ext.endsWith(".docx"); + } + + /// Checks if string is an excel file. + static bool isExcel(String filePath) { + final ext = filePath.toLowerCase(); + + return ext.endsWith(".xls") || ext.endsWith(".xlsx"); + } + + /// Checks if string is an apk file. + static bool isAPK(String filePath) { + return filePath.toLowerCase().endsWith(".apk"); + } + + /// Checks if string is an pdf file. + static bool isPDF(String filePath) { + return filePath.toLowerCase().endsWith(".pdf"); + } + + /// Checks if string is an txt file. + static bool isTxt(String filePath) { + return filePath.toLowerCase().endsWith(".txt"); + } + + /// Checks if string is an chm file. + static bool isChm(String filePath) { + return filePath.toLowerCase().endsWith(".chm"); + } + + /// Checks if string is a vector file. + static bool isVector(String filePath) { + return filePath.toLowerCase().endsWith(".svg"); + } + + /// Checks if string is an html file. + static bool isHTML(String filePath) { + return filePath.toLowerCase().endsWith(".html"); + } + + /// Checks if string is a valid username. + static bool isUsername(String s) => + hasMatch(s, r'^[a-zA-Z0-9][a-zA-Z0-9_.]+[a-zA-Z0-9]$'); + + /// Checks if string is URL. + static bool isURL(String s) => hasMatch(s, + r"^((((H|h)(T|t)|(F|f))(T|t)(P|p)((S|s)?))\://)?(www.|[a-zA-Z0-9].)[a-zA-Z0-9\-\.]+\.[a-zA-Z]{2,6}(\:[0-9]{1,5})*(/($|[a-zA-Z0-9\.\,\;\?\'\\\+&%\$#\=~_\-]+))*$"); + + /// Checks if string is email. + static bool isEmail(String s) => hasMatch(s, + r'^(([^<>()[\]\\.,;:\s@\"]+(\.[^<>()[\]\\.,;:\s@\"]+)*)|(\".+\"))@((\[[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\])|(([a-zA-Z\-0-9]+\.)+[a-zA-Z]{2,}))$'); + + /// Checks if string is phone number. + static bool isPhoneNumber(String s) { + if (s.length > 16 || s.length < 9) return false; + return hasMatch(s, r'^[+]*[(]{0,1}[0-9]{1,4}[)]{0,1}[-\s\./0-9]*$'); + } + + /// Checks if string is DateTime (UTC or Iso8601). + static bool isDateTime(String s) => + hasMatch(s, r'^\d{4}-\d{2}-\d{2}[ T]\d{2}:\d{2}:\d{2}.\d{3}Z?$'); + + /// Checks if string is MD5 hash. + static bool isMD5(String s) => hasMatch(s, r'^[a-f0-9]{32}$'); + + /// Checks if string is SHA1 hash. + static bool isSHA1(String s) => + hasMatch(s, r'(([A-Fa-f0-9]{2}\:){19}[A-Fa-f0-9]{2}|[A-Fa-f0-9]{40})'); + + /// Checks if string is SHA256 hash. + static bool isSHA256(String s) => + hasMatch(s, r'([A-Fa-f0-9]{2}\:){31}[A-Fa-f0-9]{2}|[A-Fa-f0-9]{64}'); + + /// Checks if string is SSN (Social Security Number). + static bool isSSN(String s) => hasMatch(s, + r'^(?!0{3}|6{3}|9[0-9]{2})[0-9]{3}-?(?!0{2})[0-9]{2}-?(?!0{4})[0-9]{4}$'); + + /// Checks if string is binary. + static bool isBinary(String s) => hasMatch(s, r'^[0-1]+$'); + + /// Checks if string is IPv4. + static bool isIPv4(String s) => + hasMatch(s, r'^(?:(?:^|\.)(?:2(?:5[0-5]|[0-4]\d)|1?\d?\d)){4}$'); + + /// Checks if string is IPv6. + static bool isIPv6(String s) => hasMatch(s, + r'^((([0-9A-Fa-f]{1,4}:){7}[0-9A-Fa-f]{1,4})|(([0-9A-Fa-f]{1,4}:){6}:[0-9A-Fa-f]{1,4})|(([0-9A-Fa-f]{1,4}:){5}:([0-9A-Fa-f]{1,4}:)?[0-9A-Fa-f]{1,4})|(([0-9A-Fa-f]{1,4}:){4}:([0-9A-Fa-f]{1,4}:){0,2}[0-9A-Fa-f]{1,4})|(([0-9A-Fa-f]{1,4}:){3}:([0-9A-Fa-f]{1,4}:){0,3}[0-9A-Fa-f]{1,4})|(([0-9A-Fa-f]{1,4}:){2}:([0-9A-Fa-f]{1,4}:){0,4}[0-9A-Fa-f]{1,4})|(([0-9A-Fa-f]{1,4}:){6}((\b((25[0-5])|(1\d{2})|(2[0-4]\d)|(\d{1,2}))\b)\.){3}(\b((25[0-5])|(1\d{2})|(2[0-4]\d)|(\d{1,2}))\b))|(([0-9A-Fa-f]{1,4}:){0,5}:((\b((25[0-5])|(1\d{2})|(2[0-4]\d)|(\d{1,2}))\b)\.){3}(\b((25[0-5])|(1\d{2})|(2[0-4]\d)|(\d{1,2}))\b))|(::([0-9A-Fa-f]{1,4}:){0,5}((\b((25[0-5])|(1\d{2})|(2[0-4]\d)|(\d{1,2}))\b)\.){3}(\b((25[0-5])|(1\d{2})|(2[0-4]\d)|(\d{1,2}))\b))|([0-9A-Fa-f]{1,4}::([0-9A-Fa-f]{1,4}:){0,5}[0-9A-Fa-f]{1,4})|(::([0-9A-Fa-f]{1,4}:){0,6}[0-9A-Fa-f]{1,4})|(([0-9A-Fa-f]{1,4}:){1,7}:))$'); + + /// Checks if string is hexadecimal. + /// Example: HexColor => #12F + static bool isHexadecimal(String s) => + hasMatch(s, r'^#?([0-9a-fA-F]{3}|[0-9a-fA-F]{6})$'); + + /// Checks if string is Palindrom. + static bool isPalindrom(String string) { + final cleanString = string + .toLowerCase() + .replaceAll(RegExp(r"\s+"), '') + .replaceAll(RegExp(r"[^0-9a-zA-Z]+"), ""); + + for (var i = 0; i < cleanString.length; i++) { + if (cleanString[i] != cleanString[cleanString.length - i - 1]) { + return false; + } + } + + return true; + } + + /// Checks if all data have same value. + /// Example: 111111 -> true, wwwww -> true, 1,1,1,1 -> true + static bool isOneAKind(dynamic value) { + if ((value is String || value is List) && !isNullOrBlank(value)!) { + final first = value[0]; + final len = value.length as num; + + for (var i = 0; i < len; i++) { + if (value[i] != first) { + return false; + } + } + + return true; + } + + if (value is int) { + final stringValue = value.toString(); + final first = stringValue[0]; + + for (var i = 0; i < stringValue.length; i++) { + if (stringValue[i] != first) { + return false; + } + } + + return true; + } + + return false; + } + + /// Checks if string is Passport No. + static bool isPassport(String s) => + hasMatch(s, r'^(?!^0+$)[a-zA-Z0-9]{6,9}$'); + + /// Checks if string is Currency. + static bool isCurrency(String s) => hasMatch(s, + r'^(S?\$|\₩|Rp|\¥|\€|\₹|\₽|fr|R\$|R)?[ ]?[-]?([0-9]{1,3}[,.]([0-9]{3}[,.])*[0-9]{3}|[0-9]+)([,.][0-9]{1,2})?( ?(USD?|AUD|NZD|CAD|CHF|GBP|CNY|EUR|JPY|IDR|MXN|NOK|KRW|TRY|INR|RUB|BRL|ZAR|SGD|MYR))?$'); + + /// Checks if length of data is GREATER than maxLength. + static bool isLengthGreaterThan(dynamic value, int maxLength) { + final length = _obtainDynamicLength(value); + + if (length == null) { + return false; + } + + return length > maxLength; + } + + /// Checks if length of data is GREATER OR EQUAL to maxLength. + static bool isLengthGreaterOrEqual(dynamic value, int maxLength) { + final length = _obtainDynamicLength(value); + + if (length == null) { + return false; + } + + return length >= maxLength; + } + + /// Checks if length of data is LOWER than maxLength. + /// + /// This method is deprecated, use [isLengthLessThan] instead + @deprecated + static bool isLengthLowerThan(dynamic value, int maxLength) => + isLengthLessThan(value, maxLength); + + /// Checks if length of data is LESS than maxLength. + static bool isLengthLessThan(dynamic value, int maxLength) { + final length = _obtainDynamicLength(value); + if (length == null) { + return false; + } + + return length < maxLength; + } + + /// Checks if length of data is LOWER OR EQUAL to maxLength. + /// + /// This method is deprecated, use [isLengthLessOrEqual] instead + @deprecated + static bool isLengthLowerOrEqual(dynamic value, int maxLength) => + isLengthLessOrEqual(value, maxLength); + + /// Checks if length of data is LESS OR EQUAL to maxLength. + static bool isLengthLessOrEqual(dynamic value, int maxLength) { + final length = _obtainDynamicLength(value); + + if (length == null) { + return false; + } + + return length <= maxLength; + } + + /// Checks if length of data is EQUAL to maxLength. + static bool isLengthEqualTo(dynamic value, int otherLength) { + final length = _obtainDynamicLength(value); + + if (length == null) { + return false; + } + + return length == otherLength; + } + + /// Checks if length of data is BETWEEN minLength to maxLength. + static bool isLengthBetween(dynamic value, int minLength, int maxLength) { + if (isNull(value)) { + return false; + } + + return isLengthGreaterOrEqual(value, minLength) && + isLengthLessOrEqual(value, maxLength); + } + + /// Checks if a contains b (Treating or interpreting upper- and lowercase + /// letters as being the same). + static bool isCaseInsensitiveContains(String a, String b) { + return a.toLowerCase().contains(b.toLowerCase()); + } + + /// Checks if a contains b or b contains a (Treating or + /// interpreting upper- and lowercase letters as being the same). + static bool isCaseInsensitiveContainsAny(String a, String b) { + final lowA = a.toLowerCase(); + final lowB = b.toLowerCase(); + + return lowA.contains(lowB) || lowB.contains(lowA); + } + + /// Checks if num a LOWER than num b. + static bool isLowerThan(num a, num b) => a < b; + + /// Checks if num a GREATER than num b. + static bool isGreaterThan(num a, num b) => a > b; + + /// Checks if num a EQUAL than num b. + static bool isEqual(num a, num b) => a == b; + + //Check if num is a cnpj + static bool isCnpj(String cnpj) { + // Obter somente os números do CNPJ + final numbers = cnpj.replaceAll(RegExp(r'[^0-9]'), ''); + + // Testar se o CNPJ possui 14 dígitos + if (numbers.length != 14) { + return false; + } + + // Testar se todos os dígitos do CNPJ são iguais + if (RegExp(r'^(\d)\1*$').hasMatch(numbers)) { + return false; + } + + // Dividir dígitos + final digits = numbers.split('').map(int.parse).toList(); + + // Calcular o primeiro dígito verificador + var calcDv1 = 0; + var j = 0; + for (var i in Iterable.generate(12, (i) => i < 4 ? 5 - i : 13 - i)) { + calcDv1 += digits[j++] * i; + } + calcDv1 %= 11; + final dv1 = calcDv1 < 2 ? 0 : 11 - calcDv1; + + // Testar o primeiro dígito verificado + if (digits[12] != dv1) { + return false; + } + + // Calcular o segundo dígito verificador + var calcDv2 = 0; + j = 0; + for (var i in Iterable.generate(13, (i) => i < 5 ? 6 - i : 14 - i)) { + calcDv2 += digits[j++] * i; + } + calcDv2 %= 11; + final dv2 = calcDv2 < 2 ? 0 : 11 - calcDv2; + + // Testar o segundo dígito verificador + if (digits[13] != dv2) { + return false; + } + + return true; + } + + /// Checks if the cpf is valid. + static bool isCpf(String cpf) { + // if (cpf == null) { + // return false; + // } + + // get only the numbers + final numbers = cpf.replaceAll(RegExp(r'[^0-9]'), ''); + // Test if the CPF has 11 digits + if (numbers.length != 11) { + return false; + } + // Test if all CPF digits are the same + if (RegExp(r'^(\d)\1*$').hasMatch(numbers)) { + return false; + } + + // split the digits + final digits = numbers.split('').map(int.parse).toList(); + + // Calculate the first verifier digit + var calcDv1 = 0; + for (var i in Iterable.generate(9, (i) => 10 - i)) { + calcDv1 += digits[10 - i] * i; + } + calcDv1 %= 11; + + final dv1 = calcDv1 < 2 ? 0 : 11 - calcDv1; + + // Tests the first verifier digit + if (digits[9] != dv1) { + return false; + } + + // Calculate the second verifier digit + var calcDv2 = 0; + for (var i in Iterable.generate(10, (i) => 11 - i)) { + calcDv2 += digits[11 - i] * i; + } + calcDv2 %= 11; + + final dv2 = calcDv2 < 2 ? 0 : 11 - calcDv2; + + // Test the second verifier digit + if (digits[10] != dv2) { + return false; + } + + return true; + } + + /// Capitalize each word inside string + /// Example: your name => Your Name, your name => Your name + static String? capitalize(String value) { + if (isNull(value)) return null; + if (isBlank(value)!) return value; + return value.split(' ').map(capitalizeFirst).join(' '); + } + + /// Uppercase first letter inside string and let the others lowercase + /// Example: your name => Your name + static String? capitalizeFirst(String s) { + if (isNull(s)) return null; + if (isBlank(s)!) return s; + return s[0].toUpperCase() + s.substring(1).toLowerCase(); + } + + /// Remove all whitespace inside string + /// Example: your name => yourname + static String removeAllWhitespace(String value) { + return value.replaceAll(' ', ''); + } + + /// Camelcase string + /// Example: your name => yourName + static String? camelCase(String value) { + if (isNullOrBlank(value)!) { + return null; + } + + final separatedWords = + value.split(RegExp(r'[!@#<>?":`~;[\]\\|=+)(*&^%-\s_]+')); + var newString = ''; + + for (final word in separatedWords) { + newString += word[0].toUpperCase() + word.substring(1).toLowerCase(); + } + + return newString[0].toLowerCase() + newString.substring(1); + } + + /// credits to "ReCase" package. + static final RegExp _upperAlphaRegex = RegExp(r'[A-Z]'); + static final _symbolSet = {' ', '.', '/', '_', '\\', '-'}; + static List _groupIntoWords(String text) { + var sb = StringBuffer(); + var words = []; + var isAllCaps = text.toUpperCase() == text; + + for (var i = 0; i < text.length; i++) { + var char = text[i]; + var nextChar = i + 1 == text.length ? null : text[i + 1]; + if (_symbolSet.contains(char)) { + continue; + } + sb.write(char); + var isEndOfWord = nextChar == null || + (_upperAlphaRegex.hasMatch(nextChar) && !isAllCaps) || + _symbolSet.contains(nextChar); + if (isEndOfWord) { + words.add('$sb'); + sb.clear(); + } + } + return words; + } + + /// snake_case + static String? snakeCase(String? text, {String separator = '_'}) { + if (isNullOrBlank(text)!) { + return null; + } + return _groupIntoWords(text!) + .map((word) => word.toLowerCase()) + .join(separator); + } + + /// param-case + static String? paramCase(String? text) => snakeCase(text, separator: '-'); + + /// Extract numeric value of string + /// Example: OTP 12312 27/04/2020 => 1231227042020ß + /// If firstword only is true, then the example return is "12312" + /// (first found numeric word) + static String numericOnly(String s, {bool firstWordOnly = false}) { + var numericOnlyStr = ''; + + for (var i = 0; i < s.length; i++) { + if (isNumericOnly(s[i])) { + numericOnlyStr += s[i]; + } + if (firstWordOnly && numericOnlyStr.isNotEmpty && s[i] == " ") { + break; + } + } + + return numericOnlyStr; + } + + static bool hasMatch(String? value, String pattern) { + return (value == null) ? false : RegExp(pattern).hasMatch(value); + } + + static String createPath(String path, [Iterable? segments]) { + if (segments == null || segments.isEmpty) { + return path; + } + final list = segments.map((e) => '/$e'); + return path + list.join(); + } + + static void printFunction( + String prefix, + dynamic value, + String info, { + bool isError = false, + }) { + Get.log('$prefix $value $info'.trim(), isError: isError); + } +} + +typedef PrintFunctionCallback = void Function( + String prefix, + dynamic value, + String info, { + bool? isError, +}); diff --git a/siro_rider/packages/get/lib/get_utils/src/platform/platform.dart b/siro_rider/packages/get/lib/get_utils/src/platform/platform.dart new file mode 100644 index 0000000..63dc201 --- /dev/null +++ b/siro_rider/packages/get/lib/get_utils/src/platform/platform.dart @@ -0,0 +1,23 @@ +import 'platform_web.dart' if (dart.library.io) 'platform_io.dart'; + +// ignore: avoid_classes_with_only_static_members +class GetPlatform { + static bool get isWeb => GeneralPlatform.isWeb; + + static bool get isMacOS => GeneralPlatform.isMacOS; + + static bool get isWindows => GeneralPlatform.isWindows; + + static bool get isLinux => GeneralPlatform.isLinux; + + static bool get isAndroid => GeneralPlatform.isAndroid; + + static bool get isIOS => GeneralPlatform.isIOS; + + static bool get isFuchsia => GeneralPlatform.isFuchsia; + + static bool get isMobile => GetPlatform.isIOS || GetPlatform.isAndroid; + + static bool get isDesktop => + GetPlatform.isMacOS || GetPlatform.isWindows || GetPlatform.isLinux; +} diff --git a/siro_rider/packages/get/lib/get_utils/src/platform/platform_io.dart b/siro_rider/packages/get/lib/get_utils/src/platform/platform_io.dart new file mode 100644 index 0000000..1808275 --- /dev/null +++ b/siro_rider/packages/get/lib/get_utils/src/platform/platform_io.dart @@ -0,0 +1,21 @@ +import 'dart:io'; + +// ignore: avoid_classes_with_only_static_members +class GeneralPlatform { + static bool get isWeb => false; + + static bool get isMacOS => Platform.isMacOS; + + static bool get isWindows => Platform.isWindows; + + static bool get isLinux => Platform.isLinux; + + static bool get isAndroid => Platform.isAndroid; + + static bool get isIOS => Platform.isIOS; + + static bool get isFuchsia => Platform.isFuchsia; + + static bool get isDesktop => + Platform.isMacOS || Platform.isWindows || Platform.isLinux; +} diff --git a/siro_rider/packages/get/lib/get_utils/src/platform/platform_web.dart b/siro_rider/packages/get/lib/get_utils/src/platform/platform_web.dart new file mode 100644 index 0000000..0019501 --- /dev/null +++ b/siro_rider/packages/get/lib/get_utils/src/platform/platform_web.dart @@ -0,0 +1,35 @@ +// TODO: resolve platform/desktop by JS browser agent. +// ignore: avoid_web_libraries_in_flutter +import 'dart:html' as html; + +import '../../get_utils.dart'; + +html.Navigator _navigator = html.window.navigator; + +// ignore: avoid_classes_with_only_static_members +class GeneralPlatform { + static bool get isWeb => true; + + static bool get isMacOS => + _navigator.appVersion.contains('Mac OS') && !GeneralPlatform.isIOS; + + static bool get isWindows => _navigator.appVersion.contains('Win'); + + static bool get isLinux => + (_navigator.appVersion.contains('Linux') || + _navigator.appVersion.contains('x11')) && + !isAndroid; + + // @check https://developer.chrome.com/multidevice/user-agent + static bool get isAndroid => _navigator.appVersion.contains('Android '); + + static bool get isIOS { + // maxTouchPoints is needed to separate iPad iOS13 vs new MacOS + return GetUtils.hasMatch(_navigator.platform, r'/iPad|iPhone|iPod/') || + (_navigator.platform == 'MacIntel' && _navigator.maxTouchPoints! > 1); + } + + static bool get isFuchsia => false; + + static bool get isDesktop => isMacOS || isWindows || isLinux; +} diff --git a/siro_rider/packages/get/lib/get_utils/src/queue/get_queue.dart b/siro_rider/packages/get/lib/get_utils/src/queue/get_queue.dart new file mode 100644 index 0000000..25e78bd --- /dev/null +++ b/siro_rider/packages/get/lib/get_utils/src/queue/get_queue.dart @@ -0,0 +1,57 @@ +import 'dart:async'; + +class GetMicrotask { + int _version = 0; + int _microtask = 0; + + int get microtask => _microtask; + int get version => _version; + + void exec(Function callback) { + if (_microtask == _version) { + _microtask++; + scheduleMicrotask(() { + _version++; + _microtask = _version; + callback(); + }); + } + } +} + +class GetQueue { + final List<_Item> _queue = []; + bool _active = false; + + Future add(Function job) { + var completer = Completer(); + _queue.add(_Item(completer, job)); + _check(); + return completer.future; + } + + void cancelAllJobs() { + _queue.clear(); + } + + void _check() async { + if (!_active && _queue.isNotEmpty) { + _active = true; + var item = _queue.removeAt(0); + try { + item.completer.complete(await item.job()); + } on Exception catch (e) { + item.completer.completeError(e); + } + _active = false; + _check(); + } + } +} + +class _Item { + final dynamic completer; + final dynamic job; + + _Item(this.completer, this.job); +} diff --git a/siro_rider/packages/get/lib/instance_manager.dart b/siro_rider/packages/get/lib/instance_manager.dart new file mode 100644 index 0000000..e48a062 --- /dev/null +++ b/siro_rider/packages/get/lib/instance_manager.dart @@ -0,0 +1,6 @@ +/// Get Instance Manager is a modern and intelligent dependency injector +/// that injects and removes dependencies seasonally. +library instance_manager; + +export 'get_core/get_core.dart'; +export 'get_instance/get_instance.dart'; diff --git a/siro_rider/packages/get/lib/route_manager.dart b/siro_rider/packages/get/lib/route_manager.dart new file mode 100644 index 0000000..02fe6fb --- /dev/null +++ b/siro_rider/packages/get/lib/route_manager.dart @@ -0,0 +1,6 @@ +///Get Navigator allows you to navigate routes, open snackbars, +///dialogs and bottomsheets easily, and without the need for context. +library route_manager; + +export 'get_core/get_core.dart'; +export 'get_navigation/get_navigation.dart'; diff --git a/siro_rider/packages/get/lib/src/responsive/size_percent_extension.dart b/siro_rider/packages/get/lib/src/responsive/size_percent_extension.dart new file mode 100644 index 0000000..660f2c2 --- /dev/null +++ b/siro_rider/packages/get/lib/src/responsive/size_percent_extension.dart @@ -0,0 +1,9 @@ +import '../../get.dart'; + +//Converts a double value to a percentage +extension PercentSized on double { + // height: 50.0.hp = 50% + double get hp => (Get.height * (this / 100)); + // width: 30.0.hp = 30% + double get wp => (Get.width * (this / 100)); +} diff --git a/siro_rider/packages/get/lib/state_manager.dart b/siro_rider/packages/get/lib/state_manager.dart new file mode 100644 index 0000000..5b48bc8 --- /dev/null +++ b/siro_rider/packages/get/lib/state_manager.dart @@ -0,0 +1,6 @@ +/// Get State Manager is a light, modern and powerful state manager to Flutter +library state_manager; + +export 'get_core/get_core.dart'; +export 'get_rx/get_rx.dart'; +export 'get_state_manager/get_state_manager.dart'; diff --git a/siro_rider/packages/get/lib/utils.dart b/siro_rider/packages/get/lib/utils.dart new file mode 100644 index 0000000..cd447f9 --- /dev/null +++ b/siro_rider/packages/get/lib/utils.dart @@ -0,0 +1,6 @@ +/// Get utils is a set of tools that allows you to access high-level +/// APIs and obtain validation tools for Flutter and GetX +library utils; + +export 'get_core/get_core.dart'; +export 'get_utils/get_utils.dart'; diff --git a/siro_rider/packages/get/pubspec.lock b/siro_rider/packages/get/pubspec.lock new file mode 100644 index 0000000..8c3a810 --- /dev/null +++ b/siro_rider/packages/get/pubspec.lock @@ -0,0 +1,205 @@ +# Generated by pub +# See https://dart.dev/tools/pub/glossary#lockfile +packages: + async: + dependency: transitive + description: + name: async + sha256: e2eb0491ba5ddb6177742d2da23904574082139b07c1e33b8503b9f46f3e1a37 + url: "https://pub.dev" + source: hosted + version: "2.13.1" + boolean_selector: + dependency: transitive + description: + name: boolean_selector + sha256: "8aab1771e1243a5063b8b0ff68042d67334e3feab9e95b9490f9a6ebf73b42ea" + url: "https://pub.dev" + source: hosted + version: "2.1.2" + characters: + dependency: transitive + description: + name: characters + sha256: faf38497bda5ead2a8c7615f4f7939df04333478bf32e4173fcb06d428b5716b + url: "https://pub.dev" + source: hosted + version: "1.4.1" + clock: + dependency: transitive + description: + name: clock + sha256: fddb70d9b5277016c77a80201021d40a2247104d9f4aa7bab7157b7e3f05b84b + url: "https://pub.dev" + source: hosted + version: "1.1.2" + collection: + dependency: transitive + description: + name: collection + sha256: "2f5709ae4d3d59dd8f7cd309b4e023046b57d8a6c82130785d2b0e5868084e76" + url: "https://pub.dev" + source: hosted + version: "1.19.1" + fake_async: + dependency: transitive + description: + name: fake_async + sha256: "5368f224a74523e8d2e7399ea1638b37aecfca824a3cc4dfdf77bf1fa905ac44" + url: "https://pub.dev" + source: hosted + version: "1.3.3" + flutter: + dependency: "direct main" + description: flutter + source: sdk + version: "0.0.0" + flutter_lints: + dependency: "direct dev" + description: + name: flutter_lints + sha256: a25a15ebbdfc33ab1cd26c63a6ee519df92338a9c10f122adda92938253bef04 + url: "https://pub.dev" + source: hosted + version: "2.0.3" + flutter_test: + dependency: "direct dev" + description: flutter + source: sdk + version: "0.0.0" + leak_tracker: + dependency: transitive + description: + name: leak_tracker + sha256: "33e2e26bdd85a0112ec15400c8cbffea70d0f9c3407491f672a2fad47915e2de" + url: "https://pub.dev" + source: hosted + version: "11.0.2" + leak_tracker_flutter_testing: + dependency: transitive + description: + name: leak_tracker_flutter_testing + sha256: "1dbc140bb5a23c75ea9c4811222756104fbcd1a27173f0c34ca01e16bea473c1" + url: "https://pub.dev" + source: hosted + version: "3.0.10" + leak_tracker_testing: + dependency: transitive + description: + name: leak_tracker_testing + sha256: "8d5a2d49f4a66b49744b23b018848400d23e54caf9463f4eb20df3eb8acb2eb1" + url: "https://pub.dev" + source: hosted + version: "3.0.2" + lints: + dependency: transitive + description: + name: lints + sha256: "0a217c6c989d21039f1498c3ed9f3ed71b354e69873f13a8dfc3c9fe76f1b452" + url: "https://pub.dev" + source: hosted + version: "2.1.1" + matcher: + dependency: transitive + description: + name: matcher + sha256: "12956d0ad8390bbcc63ca2e1469c0619946ccb52809807067a7020d57e647aa6" + url: "https://pub.dev" + source: hosted + version: "0.12.18" + material_color_utilities: + dependency: transitive + description: + name: material_color_utilities + sha256: "9c337007e82b1889149c82ed242ed1cb24a66044e30979c44912381e9be4c48b" + url: "https://pub.dev" + source: hosted + version: "0.13.0" + meta: + dependency: transitive + description: + name: meta + sha256: "23f08335362185a5ea2ad3a4e597f1375e78bce8a040df5c600c8d3552ef2394" + url: "https://pub.dev" + source: hosted + version: "1.17.0" + path: + dependency: transitive + description: + name: path + sha256: "75cca69d1490965be98c73ceaea117e8a04dd21217b37b292c9ddbec0d955bc5" + url: "https://pub.dev" + source: hosted + version: "1.9.1" + sky_engine: + dependency: transitive + description: flutter + source: sdk + version: "0.0.0" + source_span: + dependency: transitive + description: + name: source_span + sha256: "56a02f1f4cd1a2d96303c0144c93bd6d909eea6bee6bf5a0e0b685edbd4c47ab" + url: "https://pub.dev" + source: hosted + version: "1.10.2" + stack_trace: + dependency: transitive + description: + name: stack_trace + sha256: "8b27215b45d22309b5cddda1aa2b19bdfec9df0e765f2de506401c071d38d1b1" + url: "https://pub.dev" + source: hosted + version: "1.12.1" + stream_channel: + dependency: transitive + description: + name: stream_channel + sha256: "969e04c80b8bcdf826f8f16579c7b14d780458bd97f56d107d3950fdbeef059d" + url: "https://pub.dev" + source: hosted + version: "2.1.4" + string_scanner: + dependency: transitive + description: + name: string_scanner + sha256: "921cd31725b72fe181906c6a94d987c78e3b98c2e205b397ea399d4054872b43" + url: "https://pub.dev" + source: hosted + version: "1.4.1" + term_glyph: + dependency: transitive + description: + name: term_glyph + sha256: "7f554798625ea768a7518313e58f83891c7f5024f88e46e7182a4558850a4b8e" + url: "https://pub.dev" + source: hosted + version: "1.2.2" + test_api: + dependency: transitive + description: + name: test_api + sha256: "93167629bfc610f71560ab9312acdda4959de4df6fac7492c89ff0d3886f6636" + url: "https://pub.dev" + source: hosted + version: "0.7.9" + vector_math: + dependency: transitive + description: + name: vector_math + sha256: d530bd74fea330e6e364cda7a85019c434070188383e1cd8d9777ee586914c5b + url: "https://pub.dev" + source: hosted + version: "2.2.0" + vm_service: + dependency: transitive + description: + name: vm_service + sha256: "046d3928e16fa4dc46e8350415661755ab759d9fc97fc21b5ab295f71e4f0499" + url: "https://pub.dev" + source: hosted + version: "15.1.0" +sdks: + dart: ">=3.9.0-0 <4.0.0" + flutter: ">=3.18.0-18.0.pre.54" diff --git a/siro_rider/packages/get/pubspec.yaml b/siro_rider/packages/get/pubspec.yaml new file mode 100644 index 0000000..ded5c70 --- /dev/null +++ b/siro_rider/packages/get/pubspec.yaml @@ -0,0 +1,54 @@ +name: get +description: Open screens/snackbars/dialogs without context, manage states and inject dependencies easily with GetX. +version: 4.6.5 +homepage: https://github.com/jonataslaw/getx + +environment: + sdk: '>=2.15.0 <4.0.0' + +dependencies: + flutter: + sdk: flutter + +dev_dependencies: + flutter_lints: ^2.0.1 + flutter_test: + sdk: flutter + + +# For information on the generic Dart part of this file, see the +# following page: https://dart.dev/tools/pub/pubspec + +# The following section is specific to Flutter. +flutter: + + # To add assets to your package, add an assets section, like this: + # assets: + # - images/a_dot_burr.jpeg + # - images/a_dot_ham.jpeg + # + # For details regarding assets in packages, see + # https://flutter.dev/assets-and-images/#from-packages + # + # An image asset can refer to one or more resolution-specific "variants", see + # https://flutter.dev/assets-and-images/#resolution-aware. + + # To add custom fonts to your package, add a fonts section here, + # in this "flutter" section. Each entry in this list should have a + # "family" key with the font family name, and a "fonts" key with a + # list giving the asset and other descriptors for the font. For + # example: + # fonts: + # - family: Schyler + # fonts: + # - asset: fonts/Schyler-Regular.ttf + # - asset: fonts/Schyler-Italic.ttf + # style: italic + # - family: Trajan Pro + # fonts: + # - asset: fonts/TrajanPro.ttf + # - asset: fonts/TrajanPro_Bold.ttf + # weight: 700 + # + # For details regarding fonts in packages, see + # https://flutter.dev/custom-fonts/#from-packages diff --git a/siro_rider/packages/get/test/benchmarks/benckmark_test.dart b/siro_rider/packages/get/test/benchmarks/benckmark_test.dart new file mode 100644 index 0000000..9d56456 --- /dev/null +++ b/siro_rider/packages/get/test/benchmarks/benckmark_test.dart @@ -0,0 +1,190 @@ +import 'dart:async'; + +import 'package:flutter/foundation.dart'; +import 'package:flutter_test/flutter_test.dart'; +import 'package:get/state_manager.dart'; + +int times = 30; + +Future valueNotifier() { + final c = Completer(); + final value = ValueNotifier(0); + final timer = Stopwatch(); + timer.start(); + + value.addListener(() { + if (times == value.value) { + timer.stop(); + print( + """${value.value} listeners notified | [VALUE_NOTIFIER] time: ${timer.elapsedMicroseconds}ms"""); + c.complete(timer.elapsedMicroseconds); + } + }); + + for (var i = 0; i < times + 1; i++) { + value.value = i; + } + + return c.future; +} + +Future getValue() { + final c = Completer(); + final value = Value(0); + final timer = Stopwatch(); + timer.start(); + + value.addListener(() { + if (times == value.value) { + timer.stop(); + print( + """${value.value} listeners notified | [GETX_VALUE] time: ${timer.elapsedMicroseconds}ms"""); + c.complete(timer.elapsedMicroseconds); + } + }); + + for (var i = 0; i < times + 1; i++) { + value.value = i; + } + + return c.future; +} + +Future stream() { + final c = Completer(); + + final value = StreamController(); + final timer = Stopwatch(); + timer.start(); + + value.stream.listen((v) { + if (times == v) { + timer.stop(); + print( + """$v listeners notified | [STREAM] time: ${timer.elapsedMicroseconds}ms"""); + c.complete(timer.elapsedMicroseconds); + value.close(); + } + }); + + for (var i = 0; i < times + 1; i++) { + value.add(i); + } + + return c.future; +} + +Future getStream() { + final c = Completer(); + + final value = GetStream(); + final timer = Stopwatch(); + timer.start(); + + value.listen((v) { + if (times == v) { + timer.stop(); + print( + """$v listeners notified | [GET_STREAM] time: ${timer.elapsedMicroseconds}ms"""); + c.complete(timer.elapsedMicroseconds); + } + }); + + for (var i = 0; i < times + 1; i++) { + value.add(i); + } + + return c.future; +} + +Future miniStream() { + final c = Completer(); + + final value = MiniStream(); + final timer = Stopwatch(); + timer.start(); + + value.listen((v) { + if (times == v) { + timer.stop(); + print( + """$v listeners notified | [MINI_STREAM] time: ${timer.elapsedMicroseconds}ms"""); + c.complete(timer.elapsedMicroseconds); + } + }); + + for (var i = 0; i < times + 1; i++) { + value.add(i); + } + + return c.future; +} + +void main() { + test('percentage test', () { + print('============================================'); + print('PERCENTAGE TEST'); + + const referenceValue = 200; + const requestedValue = 100; + + print(''' +referenceValue is ${calculePercentage(referenceValue, requestedValue)}% more than requestedValue'''); + expect(calculePercentage(referenceValue, requestedValue), 100); + }); + test('run benchmarks from ValueNotifier', () async { + times = 30; + print('============================================'); + print('VALUE_NOTIFIER X GETX_VALUE TEST'); + print('-----------'); + await getValue(); + await valueNotifier(); + print('-----------'); + + times = 30000; + final getx = await getValue(); + final dart = await valueNotifier(); + print('-----------'); + + print('ValueNotifier delay $dart ms to made $times requests'); + print('GetValue delay $getx ms to made $times requests'); + print('-----------'); + print(''' +GetValue is ${calculePercentage(dart, getx).round()}% faster than Default ValueNotifier with $times requests'''); + }); + + test('run benchmarks from Streams', () async { + times = 30; + print('============================================'); + print('DART STREAM X GET_STREAM X GET_MINI_STREAM TEST'); + print('-----------'); + var getx = await getStream(); + var mini = await miniStream(); + var dart = await stream(); + print('-----------'); + print(''' +GetStream is ${calculePercentage(dart, mini).round()}% faster than Default Stream with $times requests'''); + print('-----------'); + + times = 30000; + dart = await stream(); + getx = await getStream(); + mini = await miniStream(); + + times = 60000; + dart = await stream(); + getx = await getStream(); + mini = await miniStream(); + print('-----------'); + print('dart_stream delay $dart ms to made $times requests'); + print('getx_stream delay $getx ms to made $times requests'); + print('getx_mini_stream delay $mini ms to made $times requests'); + print('-----------'); + print(''' +GetStream is ${calculePercentage(dart, mini).round()}% faster than Default Stream with $times requests'''); + }); +} + +int calculePercentage(int dart, int getx) { + return (dart / getx * 100).round() - 100; +} diff --git a/siro_rider/packages/get/test/instance/get_instance_test.dart b/siro_rider/packages/get/test/instance/get_instance_test.dart new file mode 100644 index 0000000..b885068 --- /dev/null +++ b/siro_rider/packages/get/test/instance/get_instance_test.dart @@ -0,0 +1,284 @@ +// ignore_for_file: avoid_classes_with_only_static_members + +import 'package:flutter_test/flutter_test.dart'; +import 'package:get/get.dart'; + +import 'util/matcher.dart' as m; + +class Mock { + static Future test() async { + await Future.delayed(Duration.zero); + return 'test'; + } +} + +abstract class MyController extends GetLifeCycle {} + +class DisposableController extends MyController {} + +// ignore: one_member_abstracts +abstract class Service { + String post(); +} + +class Api implements Service { + @override + String post() { + return 'test'; + } +} + +void main() { + test('Get.putAsync test', () async { + await Get.putAsync(Mock.test); + expect('test', Get.find()); + Get.reset(); + }); + + test('Get.put test', () async { + final instance = Get.put(Controller()); + expect(instance, Get.find()); + Get.reset(); + }); + + test('Get start and delete called just one time', () async { + Get + ..put(Controller()) + ..put(Controller()); + + final controller = Get.find(); + expect(controller.init, 1); + + Get + ..delete() + ..delete(); + expect(controller.close, 1); + Get.reset(); + }); + + test('Get.put tag test', () async { + final instance = Get.put(Controller(), tag: 'one'); + final instance2 = Get.put(Controller(), tag: 'two'); + expect(instance == instance2, false); + expect(Get.find(tag: 'one') == Get.find(tag: 'two'), + false); + expect(Get.find(tag: 'one') == Get.find(tag: 'one'), + true); + expect(Get.find(tag: 'two') == Get.find(tag: 'two'), + true); + Get.reset(); + }); + + test('Get.lazyPut tag test', () async { + Get.lazyPut(Controller.new, tag: 'one'); + Get.lazyPut(Controller.new, tag: 'two'); + + expect(Get.find(tag: 'one') == Get.find(tag: 'two'), + false); + expect(Get.find(tag: 'one') == Get.find(tag: 'one'), + true); + expect(Get.find(tag: 'two') == Get.find(tag: 'two'), + true); + Get.reset(); + }); + + test('Get.lazyPut test', () async { + final controller = Controller(); + Get.lazyPut(() => controller); + final ct1 = Get.find(); + expect(ct1, controller); + Get.reset(); + }); + + test('Get.lazyPut fenix test', () async { + Get.lazyPut(Controller.new, fenix: true); + Get.find().increment(); + + expect(Get.find().count, 1); + Get.delete(); + expect(Get.find().count, 0); + Get.reset(); + }); + + test('Get.lazyPut without fenix', () async { + Get.lazyPut(Controller.new); + Get.find().increment(); + + expect(Get.find().count, 1); + Get.delete(); + expect( + () => Get.find(), throwsA(const m.TypeMatcher())); + Get.reset(); + }); + + test('Get.reloadInstance test', () async { + Get.lazyPut(Controller.new); + var ct1 = Get.find(); + ct1.increment(); + expect(ct1.count, 1); + ct1 = Get.find(); + expect(ct1.count, 1); + GetInstance().reload(); + ct1 = Get.find(); + expect(ct1.count, 0); + Get.reset(); + }); + + test('GetxService test', () async { + Get.lazyPut(PermanentService.new); + var sv1 = Get.find(); + var sv2 = Get.find(); + expect(sv1, sv2); + expect(Get.isRegistered(), true); + Get.delete(); + expect(Get.isRegistered(), true); + Get.delete(force: true); + expect(Get.isRegistered(), false); + Get.reset(); + }); + + test('Get.lazyPut with abstract class test', () async { + final api = Api(); + Get.lazyPut(() => api); + final ct1 = Get.find(); + expect(ct1, api); + Get.reset(); + }); + + test('Get.create with abstract class test', () async { + Get.create(Api.new); + final ct1 = Get.find(); + final ct2 = Get.find(); + // expect(ct1 is Service, true); + // expect(ct2 is Service, true); + expect(ct1 == ct2, false); + Get.reset(); + }); + + group('test put, delete and check onInit execution', () { + tearDownAll(Get.reset); + + test('Get.put test with init check', () async { + final instance = Get.put(DisposableController()); + expect(instance, Get.find()); + expect(instance.initialized, true); + }); + + test('Get.delete test with disposable controller', () async { + // Get.put(DisposableController()); + expect(await Get.delete(), true); + expect(() => Get.find(), + throwsA(const m.TypeMatcher())); + }); + + test('Get.put test after delete with disposable controller and init check', + () async { + final instance = Get.put(DisposableController()); + expect(instance, Get.find()); + expect(instance.initialized, true); + }); + }); + + group('Get.replace test for replacing parent instance that is', () { + tearDown(Get.reset); + test('temporary', () async { + Get.put(DisposableController()); + Get.replace(Controller()); + final instance = Get.find(); + expect(instance is Controller, isTrue); + expect((instance as Controller).init, greaterThan(0)); + }); + + test('permanent', () async { + Get.put(DisposableController(), permanent: true); + Get.replace(Controller()); + final instance = Get.find(); + expect(instance is Controller, isTrue); + expect((instance as Controller).init, greaterThan(0)); + }); + + test('tagged temporary', () async { + const tag = 'tag'; + Get.put(DisposableController(), tag: tag); + Get.replace(Controller(), tag: tag); + final instance = Get.find(tag: tag); + expect(instance is Controller, isTrue); + expect((instance as Controller).init, greaterThan(0)); + }); + + test('tagged permanent', () async { + const tag = 'tag'; + Get.put(DisposableController(), permanent: true, tag: tag); + Get.replace(Controller(), tag: tag); + final instance = Get.find(tag: tag); + expect(instance is Controller, isTrue); + expect((instance as Controller).init, greaterThan(0)); + }); + + test('a generic parent type', () async { + const tag = 'tag'; + Get.put(DisposableController(), permanent: true, tag: tag); + Get.replace(Controller(), tag: tag); + final instance = Get.find(tag: tag); + expect(instance is Controller, isTrue); + expect((instance as Controller).init, greaterThan(0)); + }); + }); + + group('Get.lazyReplace replaces parent instance', () { + tearDown(Get.reset); + test('without fenix', () async { + Get.put(DisposableController()); + Get.lazyReplace(Controller.new); + final instance = Get.find(); + expect(instance, isA()); + expect((instance as Controller).init, greaterThan(0)); + }); + + test('with fenix', () async { + Get.put(DisposableController()); + Get.lazyReplace(Controller.new, fenix: true); + expect(Get.find(), isA()); + (Get.find() as Controller).increment(); + + expect((Get.find() as Controller).count, 1); + Get.delete(); + expect((Get.find() as Controller).count, 0); + }); + + test('with fenix when parent is permanent', () async { + Get.put(DisposableController(), permanent: true); + Get.lazyReplace(Controller.new); + final instance = Get.find(); + expect(instance, isA()); + (instance as Controller).increment(); + + expect((Get.find() as Controller).count, 1); + Get.delete(); + expect((Get.find() as Controller).count, 0); + }); + }); +} + +class PermanentService extends GetxService {} + +class Controller extends DisposableController { + int init = 0; + int close = 0; + int count = 0; + @override + void onInit() { + init++; + super.onInit(); + } + + @override + void onClose() { + close++; + super.onClose(); + } + + void increment() { + count++; + } +} diff --git a/siro_rider/packages/get/test/instance/util/matcher.dart b/siro_rider/packages/get/test/instance/util/matcher.dart new file mode 100644 index 0000000..5b95451 --- /dev/null +++ b/siro_rider/packages/get/test/instance/util/matcher.dart @@ -0,0 +1,120 @@ +// Copyright 2014, the Dart project authors. All rights reserved. +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: + +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following +// disclaimer in the documentation and/or other materials provided +// with the distribution. +// * Neither the name of Google Inc. nor the names of its +// contributors may be used to endorse or promote products derived +// from this software without specific prior written permission. + +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +import 'package:flutter_test/flutter_test.dart'; + +class FunctionMatcher extends CustomMatcher { + final Object Function(T value) _feature; + + FunctionMatcher(String name, this._feature, matcher) + : super('`$name`:', '`$name`', matcher); + + @override + Object featureValueOf(covariant T actual) => _feature(actual); +} + +class HavingMatcher implements TypeMatcher { + final TypeMatcher _parent; + final List> functionMatchers; + + HavingMatcher(TypeMatcher parent, String description, + Object Function(T) feature, dynamic matcher, + [Iterable>? existing]) + : _parent = parent, + functionMatchers = [ + ...?existing, + FunctionMatcher(description, feature, matcher) + ]; + + @override + TypeMatcher having( + Object Function(T) feature, String description, dynamic matcher) => + HavingMatcher(_parent, description, feature, matcher, functionMatchers); + + @override + bool matches(dynamic item, Map matchState) { + for (var matcher in [_parent].followedBy(functionMatchers)) { + if (!matcher.matches(item, matchState)) { + addStateInfo(matchState, {'matcher': matcher}); + return false; + } + } + return true; + } + + @override + Description describeMismatch( + dynamic item, + Description mismatchDescription, + Map matchState, + bool verbose, + ) { + var matcher = matchState['matcher'] as Matcher; + matcher.describeMismatch( + item, mismatchDescription, matchState['state'] as Map, verbose); + return mismatchDescription; + } + + @override + Description describe(Description description) => description + .add('') + .addDescriptionOf(_parent) + .add(' with ') + .addAll('', ' and ', '', functionMatchers); +} + +class TypeMatcher extends Matcher { + const TypeMatcher(); + + TypeMatcher having( + Object Function(T) feature, String description, dynamic matcher) => + HavingMatcher(this, description, feature, matcher); + + @override + Description describe(Description description) { + var name = _stripDynamic(T); + return description.add(""); + } + + @override + bool matches(Object? item, Map matchState) => item is T; + + @override + Description describeMismatch( + dynamic item, + Description mismatchDescription, + Map matchState, + bool verbose, + ) { + var name = _stripDynamic(T); + return mismatchDescription.add("is not an instance of '$name'"); + } +} + +String _stripDynamic(Type type) => + type.toString().replaceAll(_dart2DynamicArgs, ''); +final _dart2DynamicArgs = RegExp(''); diff --git a/siro_rider/packages/get/test/internationalization/internationalization_test.dart b/siro_rider/packages/get/test/internationalization/internationalization_test.dart new file mode 100644 index 0000000..19b1d14 --- /dev/null +++ b/siro_rider/packages/get/test/internationalization/internationalization_test.dart @@ -0,0 +1,35 @@ +import 'package:flutter/material.dart'; +import 'package:flutter_test/flutter_test.dart'; +import 'package:get/get.dart'; + +import '../navigation/utils/wrapper.dart'; + +void main() { + testWidgets("Get.defaultDialog smoke test", (tester) async { + await tester.pumpWidget( + Wrapper(child: Container()), + ); + + await tester.pumpAndSettle(); + + expect('covid'.tr, 'Corona Virus'); + expect('total_confirmed'.tr, 'Total Confirmed'); + expect('total_deaths'.tr, 'Total Deaths'); + + Get.updateLocale(const Locale('pt', 'BR')); + + await tester.pumpAndSettle(); + + expect('covid'.tr, 'Corona Vírus'); + expect('total_confirmed'.tr, 'Total confirmado'); + expect('total_deaths'.tr, 'Total de mortes'); + + Get.updateLocale(const Locale('en', 'EN')); + + await tester.pumpAndSettle(); + + expect('covid'.tr, 'Corona Virus'); + expect('total_confirmed'.tr, 'Total Confirmed'); + expect('total_deaths'.tr, 'Total Deaths'); + }); +} diff --git a/siro_rider/packages/get/test/navigation/bottomsheet_test.dart b/siro_rider/packages/get/test/navigation/bottomsheet_test.dart new file mode 100644 index 0000000..e20eddf --- /dev/null +++ b/siro_rider/packages/get/test/navigation/bottomsheet_test.dart @@ -0,0 +1,71 @@ +import 'package:flutter/material.dart'; +import 'package:flutter_test/flutter_test.dart'; +import 'package:get/get.dart'; + +import 'utils/wrapper.dart'; + +void main() { + testWidgets("Get.bottomSheet smoke test", (tester) async { + await tester.pumpWidget( + Wrapper(child: Container()), + ); + + Get.bottomSheet(Wrap( + children: [ + ListTile( + leading: const Icon(Icons.music_note), + title: const Text('Music'), + onTap: () {}, + ), + ], + )); + + await tester.pumpAndSettle(); + + expect(find.byIcon(Icons.music_note), findsOneWidget); + }); + + testWidgets("Get.bottomSheet close test", (tester) async { + await tester.pumpWidget( + Wrapper(child: Container()), + ); + + Get.bottomSheet(Wrap( + children: [ + ListTile( + leading: const Icon(Icons.music_note), + title: const Text('Music'), + onTap: () {}, + ), + ], + )); + + expect(Get.isBottomSheetOpen, true); + + Get.back(); + expect(Get.isBottomSheetOpen, false); + + // expect(() => Get.bottomSheet(Container(), isScrollControlled: null), + // throwsAssertionError); + + // expect(() => Get.bottomSheet(Container(), isDismissible: null), + // throwsAssertionError); + + // expect(() => Get.bottomSheet(Container(), enableDrag: null), + // throwsAssertionError); + + await tester.pumpAndSettle(); + }); + + // testWidgets( + // "GetMaterialApp with debugShowMaterialGrid null", + // (tester) async { + // expect( + // () => GetMaterialApp( + // debugShowMaterialGrid: null, + // ), + // throwsAssertionError, + // ); + // }, + // ); +} diff --git a/siro_rider/packages/get/test/navigation/dialog_test.dart b/siro_rider/packages/get/test/navigation/dialog_test.dart new file mode 100644 index 0000000..1864534 --- /dev/null +++ b/siro_rider/packages/get/test/navigation/dialog_test.dart @@ -0,0 +1,54 @@ +import 'package:flutter/material.dart'; +import 'package:flutter_test/flutter_test.dart'; +import 'package:get/get.dart'; + +import 'utils/wrapper.dart'; + +void main() { + testWidgets("Get.defaultDialog smoke test", (tester) async { + await tester.pumpWidget( + Wrapper(child: Container()), + ); + + Get.defaultDialog( + onConfirm: () => print("Ok"), + middleText: "Dialog made in 3 lines of code"); + + await tester.pumpAndSettle(); + + expect(find.text("Ok"), findsOneWidget); + }); + + testWidgets("Get.dialog smoke test", (tester) async { + await tester.pumpWidget( + Wrapper(child: Container()), + ); + + Get.dialog(const YourDialogWidget()); + + await tester.pumpAndSettle(); + + expect(find.byType(YourDialogWidget), findsOneWidget); + }); + + testWidgets("Get.dialog close test", (tester) async { + await tester.pumpWidget( + Wrapper(child: Container()), + ); + + Get.dialog(const YourDialogWidget()); + expect(Get.isDialogOpen, true); + Get.back(); + expect(Get.isDialogOpen, false); + await tester.pumpAndSettle(); + }); +} + +class YourDialogWidget extends StatelessWidget { + const YourDialogWidget({Key? key}) : super(key: key); + + @override + Widget build(BuildContext context) { + return Container(); + } +} diff --git a/siro_rider/packages/get/test/navigation/dispose_dependencies_test.dart b/siro_rider/packages/get/test/navigation/dispose_dependencies_test.dart new file mode 100644 index 0000000..f061eb1 --- /dev/null +++ b/siro_rider/packages/get/test/navigation/dispose_dependencies_test.dart @@ -0,0 +1,77 @@ +import 'package:flutter/widgets.dart'; +import 'package:flutter_test/flutter_test.dart'; +import 'package:get/get.dart'; + +import 'utils/wrapper.dart'; + +void main() { + testWidgets("Test dispose dependencies with unnamed routes", (tester) async { + await tester.pumpWidget( + Wrapper(child: Container()), + ); + + expect(Get.isRegistered(), false); + expect(Get.isRegistered(), false); + + Get.to(const First()); + + await tester.pumpAndSettle(); + + expect(find.byType(First), findsOneWidget); + + expect(Get.isRegistered(), true); + + Get.to(const Second()); + + await tester.pumpAndSettle(); + + expect(find.byType(Second), findsOneWidget); + + expect(Get.isRegistered(), true); + expect(Get.isRegistered(), true); + + Get.back(); + + await tester.pumpAndSettle(); + + expect(find.byType(First), findsOneWidget); + + expect(Get.isRegistered(), true); + expect(Get.isRegistered(), false); + + Get.back(); + + await tester.pumpAndSettle(); + + expect(Get.isRegistered(), false); + expect(Get.isRegistered(), false); + }); +} + +class Controller extends GetxController {} + +class Controller2 extends GetxController {} + +class First extends StatelessWidget { + const First({Key? key}) : super(key: key); + + @override + Widget build(BuildContext context) { + Get.put(Controller()); + return const Center( + child: Text("first"), + ); + } +} + +class Second extends StatelessWidget { + const Second({Key? key}) : super(key: key); + + @override + Widget build(BuildContext context) { + Get.put(Controller2()); + return const Center( + child: Text("second"), + ); + } +} diff --git a/siro_rider/packages/get/test/navigation/get_main_test.dart b/siro_rider/packages/get/test/navigation/get_main_test.dart new file mode 100644 index 0000000..c0cd0d6 --- /dev/null +++ b/siro_rider/packages/get/test/navigation/get_main_test.dart @@ -0,0 +1,513 @@ +import 'package:flutter/material.dart'; +import 'package:flutter_test/flutter_test.dart'; +import 'package:get/get.dart'; + +import 'utils/wrapper.dart'; + +void main() { + testWidgets("Get.to navigates to provided route", (tester) async { + await tester.pumpWidget(Wrapper(child: Container())); + + Get.to(const FirstScreen()); + + await tester.pumpAndSettle(); + + expect(find.byType(FirstScreen), findsOneWidget); + }); + + testWidgets("Get.toNamed navigates to provided named route", (tester) async { + await tester.pumpWidget(GetMaterialApp( + initialRoute: '/first', + getPages: [ + GetPage(page: FirstScreen.new, name: '/first'), + GetPage(page: SecondScreen.new, name: '/second'), + GetPage(page: ThirdScreen.new, name: '/third') + ], + )); + + Get.toNamed('/second'); + + await tester.pumpAndSettle(); + + expect(find.byType(SecondScreen), findsOneWidget); + }); + + testWidgets("unknowroute", (tester) async { + await tester.pumpWidget(GetMaterialApp( + initialRoute: '/first', + unknownRoute: GetPage(name: '/404', page: Scaffold.new), + getPages: [ + GetPage(page: FirstScreen.new, name: '/first'), + GetPage(page: SecondScreen.new, name: '/second'), + GetPage(page: ThirdScreen.new, name: '/third') + ], + )); + + Get.toNamed('/secondd'); + + await tester.pumpAndSettle(); + + expect(Get.currentRoute, '/404'); + }); + + testWidgets("Get.off navigates to provided route", (tester) async { + await tester.pumpWidget(const Wrapper(child: FirstScreen())); + + Get.off(const SecondScreen()); + + await tester.pumpAndSettle(); + + expect(find.byType(SecondScreen), findsOneWidget); + }); + + testWidgets("Get.off removes current route", (tester) async { + await tester.pumpWidget(const Wrapper(child: FirstScreen())); + + Get.off(const SecondScreen()); + Get.back(); + + await tester.pumpAndSettle(); + + expect(find.byType(FirstScreen), findsNothing); + }); + + testWidgets("Get.offNamed navigates to provided named route", (tester) async { + await tester.pumpWidget(GetMaterialApp( + initialRoute: '/first', + getPages: [ + GetPage(name: '/first', page: FirstScreen.new), + GetPage(name: '/second', page: SecondScreen.new), + GetPage(name: '/third', page: ThirdScreen.new), + ], + )); + + Get.offNamed('/second'); + + await tester.pumpAndSettle(); + + expect(find.byType(SecondScreen), findsOneWidget); + }); + + testWidgets("Get.offNamed removes current route", (tester) async { + await tester.pumpWidget(GetMaterialApp( + initialRoute: '/first', + getPages: [ + GetPage(name: '/first', page: FirstScreen.new), + GetPage(name: '/second', page: SecondScreen.new), + GetPage(name: '/third', page: ThirdScreen.new), + ], + )); + + Get.offNamed('/second'); + Get.back(); + + await tester.pumpAndSettle(); + + expect(find.byType(FirstScreen), findsNothing); + }); + + testWidgets("Get.offNamed removes only current route", (tester) async { + await tester.pumpWidget(GetMaterialApp( + initialRoute: '/first', + getPages: [ + GetPage(name: '/first', page: FirstScreen.new), + GetPage(name: '/second', page: SecondScreen.new), + GetPage(name: '/third', page: ThirdScreen.new), + ], + )); + + Get.toNamed('/second'); + Get.offNamed('/third'); + Get.back(); + + await tester.pumpAndSettle(); + + expect(find.byType(FirstScreen), findsOneWidget); + }); + + testWidgets("Get.offAll navigates to provided route", (tester) async { + await tester.pumpWidget(const Wrapper(child: FirstScreen())); + + Get.offAll(const SecondScreen()); + + await tester.pumpAndSettle(); + + expect(find.byType(SecondScreen), findsOneWidget); + }); + + testWidgets("Get.offAll removes all previous routes", (tester) async { + await tester.pumpWidget(const Wrapper(child: FirstScreen())); + + Get.to(const SecondScreen()); + Get.offAll(const ThirdScreen()); + Get.back(); + + await tester.pumpAndSettle(); + + expect(find.byType(SecondScreen), findsNothing); + + Get.back(); + + await tester.pumpAndSettle(); + + expect(find.byType(FirstScreen), findsNothing); + }); + + testWidgets("Get.offAllNamed navigates to provided named route", + (tester) async { + await tester.pumpWidget(WrapperNamed( + initialRoute: '/first', + namedRoutes: [ + GetPage(page: FirstScreen.new, name: '/first'), + GetPage(page: SecondScreen.new, name: '/second'), + GetPage(page: ThirdScreen.new, name: '/third') + ], + )); + + Get.toNamed('/second'); + + await tester.pumpAndSettle(); + + expect(find.byType(SecondScreen), findsOneWidget); + }); + + testWidgets("Get.offAllNamed removes all previous routes", (tester) async { + await tester.pumpWidget(WrapperNamed( + initialRoute: '/first', + namedRoutes: [ + GetPage(page: FirstScreen.new, name: '/first'), + GetPage(page: SecondScreen.new, name: '/second'), + GetPage(page: ThirdScreen.new, name: '/third') + ], + )); + + Get.toNamed('/second'); + Get.offAllNamed('/third'); + Get.back(); + + await tester.pumpAndSettle(); + + expect(find.byType(SecondScreen), findsNothing); + + Get.back(); + + await tester.pumpAndSettle(); + + expect(find.byType(FirstScreen), findsNothing); + }); + + testWidgets("Get.offAndToNamed navigates to provided route", (tester) async { + await tester.pumpWidget(WrapperNamed( + initialRoute: '/first', + namedRoutes: [ + GetPage(page: FirstScreen.new, name: '/first'), + GetPage(page: SecondScreen.new, name: '/second'), + GetPage(page: ThirdScreen.new, name: '/third') + ], + )); + + Get.offAndToNamed('/second'); + + await tester.pumpAndSettle(); + + expect(find.byType(SecondScreen), findsOneWidget); + }); + + testWidgets("Get.offAndToNamed removes previous route", (tester) async { + await tester.pumpWidget(WrapperNamed( + initialRoute: '/first', + namedRoutes: [ + GetPage(page: FirstScreen.new, name: '/first'), + GetPage(page: SecondScreen.new, name: '/second'), + GetPage(page: ThirdScreen.new, name: '/third') + ], + )); + + Get.offAndToNamed('/second'); + Get.back(); + + await tester.pumpAndSettle(); + + expect(find.byType(FirstScreen), findsNothing); + }); + + testWidgets("Get.offUntil navigates to provided route", (tester) async { + await tester.pumpWidget(Wrapper(child: Container())); + + Get.to(const FirstScreen()); + + Get.offUntil(GetPageRoute(page: ThirdScreen.new), + (route) => (route as GetPageRoute).routeName == '/FirstScreen'); + + await tester.pumpAndSettle(); + + expect(find.byType(ThirdScreen), findsOneWidget); + }); + + testWidgets( + "Get.offUntil removes previous routes if they don't match predicate", + (tester) async { + await tester.pumpWidget(Wrapper(child: Container())); + + Get.to(const FirstScreen()); + Get.to(const SecondScreen()); + Get.offUntil(GetPageRoute(page: ThirdScreen.new), + (route) => (route as GetPageRoute).routeName == '/FirstScreen'); + Get.back(); + + await tester.pumpAndSettle(); + + expect(find.byType(SecondScreen), findsNothing); + }); + + testWidgets( + "Get.offUntil leaves previous routes that match provided predicate", + (tester) async { + await tester.pumpWidget(Wrapper(child: Container())); + + Get.to(const FirstScreen()); + Get.to(const SecondScreen()); + Get.offUntil(GetPageRoute(page: ThirdScreen.new), + (route) => (route as GetPageRoute).routeName == '/FirstScreen'); + Get.back(); + + await tester.pumpAndSettle(); + + expect(find.byType(FirstScreen), findsOneWidget); + }); + + testWidgets("Get.offNamedUntil navigates to provided route", (tester) async { + await tester.pumpWidget(WrapperNamed( + initialRoute: '/first', + namedRoutes: [ + GetPage(page: FirstScreen.new, name: '/first'), + GetPage(page: SecondScreen.new, name: '/second'), + GetPage(page: ThirdScreen.new, name: '/third') + ], + )); + + Get.offNamedUntil('/second', ModalRoute.withName('/first')); + + await tester.pumpAndSettle(); + + expect(find.byType(SecondScreen), findsOneWidget); + }); + + testWidgets( + "Get.offNamedUntil removes previous routes if they don't match predicate", + (tester) async { + await tester.pumpWidget(WrapperNamed( + initialRoute: '/first', + namedRoutes: [ + GetPage(page: FirstScreen.new, name: '/first'), + GetPage(page: SecondScreen.new, name: '/second'), + GetPage(page: ThirdScreen.new, name: '/third') + ], + )); + + Get.toNamed('/second'); + Get.offNamedUntil('/third', ModalRoute.withName('/first')); + + await tester.pumpAndSettle(); + + expect(find.byType(SecondScreen), findsNothing); + }); + + testWidgets( + "Get.offNamedUntil leaves previous routes that match provided predicate", + (tester) async { + await tester.pumpWidget(WrapperNamed( + initialRoute: '/first', + namedRoutes: [ + GetPage(page: FirstScreen.new, name: '/first'), + GetPage(page: SecondScreen.new, name: '/second'), + GetPage(page: ThirdScreen.new, name: '/third'), + ], + )); + + Get.toNamed('/second'); + Get.offNamedUntil('/third', ModalRoute.withName('/first')); + Get.back(); + + await tester.pumpAndSettle(); + + expect(find.byType(FirstScreen), findsOneWidget); + }); + + testWidgets("Get.back navigates back", (tester) async { + await tester.pumpWidget( + const Wrapper( + defaultTransition: Transition.circularReveal, + child: FirstScreen(), + ), + ); + + Get.to(const SecondScreen()); + Get.back(); + + await tester.pumpAndSettle(); + + expect(find.byType(FirstScreen), findsOneWidget); + }); + + testWidgets( + "Get.back with closeOverlays pops both snackbar and current route", + (tester) async { + await tester.pumpWidget(const Wrapper(child: FirstScreen())); + + Get.to(const SecondScreen()); + Get.snackbar('title', "message"); + Get.back(closeOverlays: true); + + await tester.pumpAndSettle(); + + expect(Get.isSnackbarOpen, false); + expect(find.byType(FirstScreen), findsOneWidget); + }); + + testWidgets("Get.defaultTransition smoke test", (tester) async { + await tester.pumpWidget( + Wrapper( + defaultTransition: Transition.fadeIn, + child: Container(), + ), + ); + + Get.to(const FirstScreen()); + + await tester.pumpAndSettle(); + + expect(find.byType(FirstScreen), findsOneWidget); + + await tester.pumpWidget( + Wrapper( + defaultTransition: Transition.downToUp, + child: Container(), + ), + ); + + Get.to(const FirstScreen()); + + await tester.pumpAndSettle(); + + expect(find.byType(FirstScreen), findsOneWidget); + + await tester.pumpWidget( + Wrapper( + defaultTransition: Transition.fade, + child: Container(), + ), + ); + + Get.to(const FirstScreen()); + + await tester.pumpAndSettle(); + + expect(find.byType(FirstScreen), findsOneWidget); + + await tester.pumpWidget( + Wrapper( + defaultTransition: Transition.leftToRight, + child: Container(), + ), + ); + + Get.to(const FirstScreen()); + + await tester.pumpAndSettle(); + + expect(find.byType(FirstScreen), findsOneWidget); + + await tester.pumpWidget( + Wrapper( + defaultTransition: Transition.leftToRightWithFade, + child: Container(), + ), + ); + + Get.to(const FirstScreen()); + + await tester.pumpAndSettle(); + + expect(find.byType(FirstScreen), findsOneWidget); + + await tester.pumpWidget( + Wrapper( + defaultTransition: Transition.rightToLeft, + child: Container(), + ), + ); + + Get.to(const FirstScreen()); + + await tester.pumpAndSettle(); + + expect(find.byType(FirstScreen), findsOneWidget); + + await tester.pumpWidget( + Wrapper( + defaultTransition: Transition.rightToLeftWithFade, + child: Container(), + ), + ); + + Get.to(const FirstScreen()); + + await tester.pumpAndSettle(); + + expect(find.byType(FirstScreen), findsOneWidget); + + await tester.pumpWidget( + Wrapper( + defaultTransition: Transition.cupertino, + child: Container(), + ), + ); + + Get.to(const FirstScreen()); + + await tester.pumpAndSettle(); + + expect(find.byType(FirstScreen), findsOneWidget); + + await tester.pumpWidget( + Wrapper( + defaultTransition: Transition.size, + child: Container(), + ), + ); + + Get.to(const FirstScreen()); + + await tester.pumpAndSettle(); + + expect(find.byType(FirstScreen), findsOneWidget); + }); +} + +class FirstScreen extends StatelessWidget { + const FirstScreen({Key? key}) : super(key: key); + + @override + Widget build(BuildContext context) { + return const Text('FirstScreen'); + } +} + +class SecondScreen extends StatelessWidget { + const SecondScreen({Key? key}) : super(key: key); + + @override + Widget build(BuildContext context) { + return Container(); + } +} + +class ThirdScreen extends StatelessWidget { + const ThirdScreen({Key? key}) : super(key: key); + + @override + Widget build(BuildContext context) { + return Container(); + } +} diff --git a/siro_rider/packages/get/test/navigation/middleware_test.dart b/siro_rider/packages/get/test/navigation/middleware_test.dart new file mode 100644 index 0000000..90e561e --- /dev/null +++ b/siro_rider/packages/get/test/navigation/middleware_test.dart @@ -0,0 +1,35 @@ +import 'package:flutter/cupertino.dart'; +import 'package:flutter_test/flutter_test.dart'; +import 'package:get/get.dart'; + +import 'get_main_test.dart'; + +class RedirectMiddleware extends GetMiddleware { + @override + RouteSettings redirect(String? route) => const RouteSettings(name: '/second'); +} + +void main() { + testWidgets("Middleware redirect smoke test", (tester) async { + await tester.pumpWidget( + GetMaterialApp( + initialRoute: '/', + getPages: [ + GetPage(name: '/', page: Container.new), + GetPage( + name: '/first', + page: FirstScreen.new, + middlewares: [RedirectMiddleware()]), + GetPage(name: '/second', page: SecondScreen.new), + GetPage(name: '/third', page: ThirdScreen.new), + ], + ), + ); + + Get.toNamed('/first'); + + await tester.pumpAndSettle(); + + expect(find.byType(SecondScreen), findsOneWidget); + }); +} diff --git a/siro_rider/packages/get/test/navigation/parse_route_test.dart b/siro_rider/packages/get/test/navigation/parse_route_test.dart new file mode 100644 index 0000000..830df8b --- /dev/null +++ b/siro_rider/packages/get/test/navigation/parse_route_test.dart @@ -0,0 +1,192 @@ +import 'package:flutter/cupertino.dart'; +import 'package:flutter_test/flutter_test.dart'; +import 'package:get/get.dart'; +import 'package:get/get_navigation/src/root/parse_route.dart'; + +void main() { + test('Parse Page with children', () { + final testParams = {'hi': 'value'}; + final pageTree = GetPage( + name: '/city', + page: Container.new, + children: [ + GetPage( + name: '/home', + page: Container.new, + transition: Transition.rightToLeftWithFade, + children: [ + GetPage( + name: '/bed-room', + transition: Transition.size, + page: Container.new, + ), + GetPage( + name: '/living-room', + transition: Transition.topLevel, + page: Container.new, + ), + ], + ), + GetPage( + name: '/work', + transition: Transition.upToDown, + page: Container.new, + children: [ + GetPage( + name: '/office', + transition: Transition.zoom, + page: Container.new, + children: [ + GetPage( + name: '/pen', + transition: Transition.cupertino, + page: Container.new, + parameters: testParams, + ), + GetPage( + name: '/paper', + page: Container.new, + transition: Transition.downToUp, + ), + ], + ), + GetPage( + name: '/meeting-room', + transition: Transition.fade, + page: Container.new, + ), + ], + ), + ], + ); + + final tree = ParseRouteTree(routes: []); + + tree.addRoute(pageTree); + + // tree.addRoute(pageTree); + const searchRoute = '/city/work/office/pen'; + final match = tree.matchRoute(searchRoute); + expect(match, isNotNull); + expect(match.route!.name, searchRoute); + final testRouteParam = match.route!.parameters!; + for (final tParam in testParams.entries) { + expect(testRouteParam[tParam.key], tParam.value); + } + }); + + test('Parse Page without children', () { + final pageTree = [ + GetPage( + name: '/city', page: Container.new, transition: Transition.cupertino), + GetPage( + name: '/city/home', + page: Container.new, + transition: Transition.downToUp), + GetPage( + name: '/city/home/bed-room', + page: Container.new, + transition: Transition.fade), + GetPage( + name: '/city/home/living-room', + page: Container.new, + transition: Transition.fadeIn), + GetPage( + name: '/city/work', + page: Container.new, + transition: Transition.leftToRight), + GetPage( + name: '/city/work/office', + page: Container.new, + transition: Transition.leftToRightWithFade), + GetPage( + name: '/city/work/office/pen', + page: Container.new, + transition: Transition.native), + GetPage( + name: '/city/work/office/paper', + page: Container.new, + transition: Transition.noTransition), + GetPage( + name: '/city/work/meeting-room', + page: Container.new, + transition: Transition.rightToLeft), + ]; + + final tree = ParseRouteTree(routes: pageTree); + + // for (var p in pageTree) { + // tree.addRoute(p); + // } + + const searchRoute = '/city/work/office/pen'; + final match = tree.matchRoute(searchRoute); + expect(match, isNotNull); + expect(match.route!.name, searchRoute); + }); + + testWidgets( + 'test params from dynamic route', + (tester) async { + await tester.pumpWidget(GetMaterialApp( + initialRoute: '/first/juan', + getPages: [ + GetPage(page: Container.new, name: '/first/:name'), + GetPage(page: Container.new, name: '/second/:id'), + GetPage(page: Container.new, name: '/third'), + GetPage(page: Container.new, name: '/last/:id/:name/profile') + ], + )); + + expect(Get.parameters['name'], 'juan'); + + Get.toNamed('/second/1234'); + + await tester.pumpAndSettle(); + + expect(Get.parameters['id'], '1234'); + + Get.toNamed('/third?name=jonny&job=dev'); + + await tester.pumpAndSettle(); + + expect(Get.parameters['name'], 'jonny'); + expect(Get.parameters['job'], 'dev'); + + Get.toNamed('/last/1234/ana/profile'); + + await tester.pumpAndSettle(); + + expect(Get.parameters['id'], '1234'); + expect(Get.parameters['name'], 'ana'); + }, + ); + + testWidgets( + 'params in url by parameters', + (tester) async { + await tester.pumpWidget(GetMaterialApp( + initialRoute: '/first/juan', + getPages: [ + GetPage(page: Container.new, name: '/first/:name'), + GetPage(page: Container.new, name: '/italy'), + ], + )); + + // Get.parameters = ({"varginias": "varginia", "vinis": "viniiss"}); + var parameters = { + "varginias": "varginia", + "vinis": "viniiss" + }; + // print("Get.parameters: ${Get.parameters}"); + parameters.addAll({"a": "b", "c": "d"}); + Get.toNamed("/italy", parameters: parameters); + + await tester.pumpAndSettle(); + expect(Get.parameters['varginias'], 'varginia'); + expect(Get.parameters['vinis'], 'viniiss'); + expect(Get.parameters['a'], 'b'); + expect(Get.parameters['c'], 'd'); + }, + ); +} diff --git a/siro_rider/packages/get/test/navigation/root_widget_test.dart b/siro_rider/packages/get/test/navigation/root_widget_test.dart new file mode 100644 index 0000000..3d8d616 --- /dev/null +++ b/siro_rider/packages/get/test/navigation/root_widget_test.dart @@ -0,0 +1,102 @@ +// import 'package:flutter_test/flutter_test.dart'; +// import 'package:get/get.dart'; + +void main() { + // testWidgets( + // "GetMaterialApp with routes null", + // (tester) async { + // expect( + // () => GetMaterialApp( + // routes: null, + // ), + // throwsAssertionError); + // }, + // ); + + // testWidgets( + // "GetMaterialApp with navigatorObservers null", + // (tester) async { + // expect( + // () => GetMaterialApp( + // navigatorObservers: null, + // ), + // throwsAssertionError); + // }, + // ); + // testWidgets( + // "GetMaterialApp with title null", + // (tester) async { + // expect( + // () => GetMaterialApp( + // title: null, + // ), + // throwsAssertionError); + // }, + // ); + // testWidgets( + // "GetMaterialApp with debugShowMaterialGrid null", + // (test) async { + // expect( + // () => GetMaterialApp( + // debugShowMaterialGrid: null, + // ), + // throwsAssertionError, + // ); + // }, + // ); + // testWidgets( + // "GetMaterialApp with showPerformanceOverlay null", + // (test) async { + // expect( + // () => GetMaterialApp( + // showPerformanceOverlay: null, + // ), + // throwsAssertionError, + // ); + // }, + // ); + // testWidgets( + // "GetMaterialApp with showSemanticsDebugger null", + // (test) async { + // expect( + // () => GetMaterialApp( + // showSemanticsDebugger: null, + // ), + // throwsAssertionError, + // ); + // }, + // ); + // testWidgets( + // "GetMaterialApp with debugShowCheckedModeBanner null", + // (tester) async { + // expect( + // () => GetMaterialApp( + // debugShowCheckedModeBanner: null, + // ), + // throwsAssertionError); + // }, + // ); + + // testWidgets( + // "GetMaterialApp with checkerboardRasterCacheImages null", + // (tester) async { + // expect( + // () => GetMaterialApp( + // checkerboardRasterCacheImages: null, + // ), + // throwsAssertionError); + // }, + // ); + + // testWidgets( + // "GetMaterialApp with checkerboardOffscreenLayers null", + // (tester) async { + // expect( + // () => GetMaterialApp( + // checkerboardOffscreenLayers: null, + // ), + // throwsAssertionError, + // ); + // }, + // ); +} diff --git a/siro_rider/packages/get/test/navigation/routes_test.dart b/siro_rider/packages/get/test/navigation/routes_test.dart new file mode 100644 index 0000000..3dd2d33 --- /dev/null +++ b/siro_rider/packages/get/test/navigation/routes_test.dart @@ -0,0 +1,120 @@ +import 'package:flutter/cupertino.dart'; +import 'package:flutter_test/flutter_test.dart'; +import 'package:get/get.dart'; + +void main() { + testWidgets('Back swipe dismiss interrupted by route push', (tester) async { + // final scaffoldKey = GlobalKey(); + + await tester.pumpWidget( + GetCupertinoApp( + popGesture: true, + home: CupertinoPageScaffold( + // key: scaffoldKey, + child: Center( + child: CupertinoButton( + onPressed: () { + Get.to(() => const CupertinoPageScaffold( + child: Center(child: Text('route')), + )); + }, + child: const Text('push'), + ), + ), + ), + ), + ); + + // Check the basic iOS back-swipe dismiss transition. Dragging the pushed + // route halfway across the screen will trigger the iOS dismiss animation + + await tester.tap(find.text('push')); + await tester.pumpAndSettle(); + expect(find.text('route'), findsOneWidget); + expect(find.text('push'), findsNothing); + + var gesture = await tester.startGesture(const Offset(5, 300)); + await gesture.moveBy(const Offset(400, 0)); + await gesture.up(); + await tester.pump(); + expect( + // The 'route' route has been dragged to the right, halfway across + // the screen + tester.getTopLeft(find.ancestor( + of: find.text('route'), + matching: find.byType(CupertinoPageScaffold))), + const Offset(400, 0), + ); + expect( + // The 'push' route is sliding in from the left. + tester + .getTopLeft(find.ancestor( + of: find.text('push'), + matching: find.byType(CupertinoPageScaffold))) + .dx, + 0, + ); + await tester.pumpAndSettle(); + expect(find.text('push'), findsOneWidget); + expect( + tester.getTopLeft(find.ancestor( + of: find.text('push'), matching: find.byType(CupertinoPageScaffold))), + Offset.zero, + ); + expect(find.text('route'), findsNothing); + + // Run the dismiss animation 60%, which exposes the route "push" button, + // and then press the button. + + await tester.tap(find.text('push')); + await tester.pumpAndSettle(); + expect(find.text('route'), findsOneWidget); + expect(find.text('push'), findsNothing); + + gesture = await tester.startGesture(const Offset(5, 300)); + await gesture.moveBy(const Offset(400, 0)); // Drag halfway. + await gesture.up(); + // Trigger the snapping animation. + // Since the back swipe drag was brought to >=50% of the screen, it will + // self snap to finish the pop transition as the gesture is lifted. + // + // This drag drop animation is 400ms when dropped exactly halfway + // (800 / [pixel distance remaining], see + // _CupertinoBackGestureController.dragEnd). It follows a curve that is very + // steep initially. + await tester.pump(); + expect( + tester.getTopLeft(find.ancestor( + of: find.text('route'), + matching: find.byType(CupertinoPageScaffold))), + const Offset(400, 0), + ); + // Let the dismissing snapping animation go 60%. + await tester.pump(const Duration(milliseconds: 240)); + expect( + tester + .getTopLeft(find.ancestor( + of: find.text('route'), + matching: find.byType(CupertinoPageScaffold))) + .dx, + moreOrLessEquals(798, epsilon: 1), + ); + + // Use the navigator to push a route instead of tapping the 'push' button. + // The topmost route (the one that's animating away), ignores input while + // the pop is underway because route.navigator.userGestureInProgress. + Get.to(() => const CupertinoPageScaffold( + child: Center(child: Text('route')), + )); + + await tester.pumpAndSettle(); + expect(find.text('route'), findsOneWidget); + expect(find.text('push'), findsNothing); + expect( + tester + .state(find.byType(Navigator)) + .userGestureInProgress, + false, + ); + }); +} diff --git a/siro_rider/packages/get/test/navigation/snackbar_test.dart b/siro_rider/packages/get/test/navigation/snackbar_test.dart new file mode 100644 index 0000000..f9727f6 --- /dev/null +++ b/siro_rider/packages/get/test/navigation/snackbar_test.dart @@ -0,0 +1,247 @@ +import 'package:flutter/material.dart'; +import 'package:flutter_test/flutter_test.dart'; +import 'package:get/get.dart'; + +void main() { + testWidgets("test if Get.isSnackbarOpen works with Get.snackbar", + (tester) async { + await tester.pumpWidget( + GetMaterialApp( + popGesture: true, + home: ElevatedButton( + child: const Text('Open Snackbar'), + onPressed: () { + Get.snackbar( + 'title', + "message", + duration: const Duration(seconds: 1), + mainButton: + TextButton(onPressed: () {}, child: const Text('button')), + isDismissible: false, + ); + }, + ), + ), + ); + + expect(Get.isSnackbarOpen, false); + await tester.tap(find.text('Open Snackbar')); + + expect(Get.isSnackbarOpen, true); + await tester.pump(const Duration(seconds: 1)); + expect(Get.isSnackbarOpen, false); + }); + + testWidgets("Get.rawSnackbar test", (tester) async { + await tester.pumpWidget( + GetMaterialApp( + popGesture: true, + home: ElevatedButton( + child: const Text('Open Snackbar'), + onPressed: () { + Get.rawSnackbar( + title: 'title', + message: "message", + onTap: (_) { + print('snackbar tapped'); + }, + shouldIconPulse: true, + icon: const Icon(Icons.alarm), + showProgressIndicator: true, + duration: const Duration(seconds: 1), + isDismissible: true, + leftBarIndicatorColor: Colors.amber, + overlayBlur: 1.0, + ); + }, + ), + ), + ); + + expect(Get.isSnackbarOpen, false); + await tester.tap(find.text('Open Snackbar')); + + expect(Get.isSnackbarOpen, true); + await tester.pump(const Duration(seconds: 1)); + expect(Get.isSnackbarOpen, false); + }); + + testWidgets("test snackbar queue", (tester) async { + const messageOne = Text('title'); + + const messageTwo = Text('titleTwo'); + + await tester.pumpWidget( + GetMaterialApp( + popGesture: true, + home: ElevatedButton( + child: const Text('Open Snackbar'), + onPressed: () { + Get.rawSnackbar( + messageText: messageOne, duration: const Duration(seconds: 1)); + Get.rawSnackbar( + messageText: messageTwo, duration: const Duration(seconds: 1)); + }, + ), + ), + ); + + expect(Get.isSnackbarOpen, false); + await tester.tap(find.text('Open Snackbar')); + expect(Get.isSnackbarOpen, true); + + await tester.pump(const Duration(milliseconds: 500)); + expect(find.text('title'), findsOneWidget); + expect(find.text('titleTwo'), findsNothing); + await tester.pump(const Duration(milliseconds: 500)); + expect(find.text('title'), findsNothing); + expect(find.text('titleTwo'), findsOneWidget); + Get.closeAllSnackbars(); + }); + + testWidgets("test snackbar dismissible", (tester) async { + const dismissDirection = DismissDirection.vertical; + const snackBarTapTarget = Key('snackbar-tap-target'); + + late final GetSnackBar getBar; + + await tester.pumpWidget(GetMaterialApp( + home: Scaffold( + body: Builder( + builder: (context) { + return Column( + children: [ + GestureDetector( + key: snackBarTapTarget, + onTap: () { + getBar = const GetSnackBar( + message: 'bar1', + duration: Duration(seconds: 2), + isDismissible: true, + dismissDirection: dismissDirection, + ); + Get.showSnackbar(getBar); + }, + behavior: HitTestBehavior.opaque, + child: const SizedBox( + height: 100.0, + width: 100.0, + ), + ), + ], + ); + }, + ), + ), + )); + + expect(Get.isSnackbarOpen, false); + expect(find.text('bar1'), findsNothing); + + await tester.tap(find.byKey(snackBarTapTarget)); + await tester.pumpAndSettle(); + + expect(Get.isSnackbarOpen, true); + await tester.pump(const Duration(milliseconds: 500)); + expect(find.byWidget(getBar), findsOneWidget); + await tester.ensureVisible(find.byWidget(getBar)); + await tester.drag(find.byWidget(getBar), const Offset(0.0, 50.0)); + await tester.pump(const Duration(milliseconds: 500)); + + expect(Get.isSnackbarOpen, false); + }); + + testWidgets("test snackbar onTap", (tester) async { + const dismissDirection = DismissDirection.vertical; + const snackBarTapTarget = Key('snackbar-tap-target'); + var counter = 0; + + late final GetSnackBar getBar; + + late final SnackbarController getBarController; + + await tester.pumpWidget(GetMaterialApp( + home: Scaffold( + body: Builder( + builder: (context) { + return Column( + children: [ + GestureDetector( + key: snackBarTapTarget, + onTap: () { + getBar = GetSnackBar( + message: 'bar1', + onTap: (_) { + counter++; + }, + duration: const Duration(seconds: 2), + isDismissible: true, + dismissDirection: dismissDirection, + ); + getBarController = Get.showSnackbar(getBar); + }, + behavior: HitTestBehavior.opaque, + child: const SizedBox( + height: 100.0, + width: 100.0, + ), + ), + ], + ); + }, + ), + ), + )); + + await tester.pumpAndSettle(); + + expect(Get.isSnackbarOpen, false); + expect(find.text('bar1'), findsNothing); + + await tester.tap(find.byKey(snackBarTapTarget)); + await tester.pumpAndSettle(); + + expect(Get.isSnackbarOpen, true); + await tester.pump(const Duration(milliseconds: 500)); + expect(find.byWidget(getBar), findsOneWidget); + await tester.ensureVisible(find.byWidget(getBar)); + await tester.tap(find.byWidget(getBar)); + expect(counter, 1); + await tester.pump(const Duration(milliseconds: 3000)); + await getBarController.close(withAnimations: false); + }); + + testWidgets("Get test actions and icon", (tester) async { + const icon = Icon(Icons.alarm); + final action = TextButton(onPressed: () {}, child: const Text('button')); + + late final GetSnackBar getBar; + + await tester.pumpWidget(const GetMaterialApp(home: Scaffold())); + + expect(Get.isSnackbarOpen, false); + expect(find.text('bar1'), findsNothing); + + getBar = GetSnackBar( + message: 'bar1', + icon: icon, + mainButton: action, + leftBarIndicatorColor: Colors.yellow, + showProgressIndicator: true, + // maxWidth: 100, + borderColor: Colors.red, + duration: const Duration(seconds: 1), + isDismissible: false, + ); + Get.showSnackbar(getBar); + + expect(Get.isSnackbarOpen, true); + await tester.pump(const Duration(milliseconds: 500)); + expect(find.byWidget(getBar), findsOneWidget); + expect(find.byWidget(icon), findsOneWidget); + expect(find.byWidget(action), findsOneWidget); + await tester.pump(const Duration(milliseconds: 500)); + + expect(Get.isSnackbarOpen, false); + }); +} diff --git a/siro_rider/packages/get/test/navigation/utils/wrapper.dart b/siro_rider/packages/get/test/navigation/utils/wrapper.dart new file mode 100644 index 0000000..2e75e7b --- /dev/null +++ b/siro_rider/packages/get/test/navigation/utils/wrapper.dart @@ -0,0 +1,73 @@ +import 'package:flutter/material.dart'; +import 'package:get/get.dart'; + +class Wrapper extends StatelessWidget { + final Widget? child; + final List? namedRoutes; + final String? initialRoute; + final Transition? defaultTransition; + + const Wrapper({ + Key? key, + this.child, + this.namedRoutes, + this.initialRoute, + this.defaultTransition, + }) : super(key: key); + + @override + Widget build(BuildContext context) { + return GetMaterialApp( + defaultTransition: defaultTransition, + initialRoute: initialRoute, + translations: WrapperTranslations(), + locale: WrapperTranslations.locale, + getPages: namedRoutes, + home: Scaffold( + body: child, + ), + ); + } +} + +class WrapperNamed extends StatelessWidget { + final Widget? child; + final List? namedRoutes; + final String? initialRoute; + final Transition? defaultTransition; + + const WrapperNamed({ + Key? key, + this.child, + this.namedRoutes, + this.initialRoute, + this.defaultTransition, + }) : super(key: key); + + @override + Widget build(BuildContext context) { + return GetMaterialApp( + defaultTransition: defaultTransition, + initialRoute: initialRoute, + getPages: namedRoutes, + ); + } +} + +class WrapperTranslations extends Translations { + static Locale fallbackLocale = const Locale('en', 'US'); + static Locale? get locale => const Locale('en', 'US'); + @override + Map> get keys => { + 'en_US': { + 'covid': 'Corona Virus', + 'total_confirmed': 'Total Confirmed', + 'total_deaths': 'Total Deaths', + }, + 'pt_BR': { + 'covid': 'Corona Vírus', + 'total_confirmed': 'Total confirmado', + 'total_deaths': 'Total de mortes', + }, + }; +} diff --git a/siro_rider/packages/get/test/rx/rx_workers_test.dart b/siro_rider/packages/get/test/rx/rx_workers_test.dart new file mode 100644 index 0000000..af27c9a --- /dev/null +++ b/siro_rider/packages/get/test/rx/rx_workers_test.dart @@ -0,0 +1,210 @@ +import 'dart:async'; + +import 'package:flutter_test/flutter_test.dart'; +import 'package:get/get.dart'; + +void main() { + test('once', () async { + final count = 0.obs; + var result = -1; + once(count, (dynamic _) { + result = _ as int; + }); + count.value++; + await Future.delayed(Duration.zero); + expect(1, result); + count.value++; + await Future.delayed(Duration.zero); + expect(1, result); + count.value++; + await Future.delayed(Duration.zero); + expect(1, result); + }); + + test('ever', () async { + final count = 0.obs; + var result = -1; + ever(count, (value) { + result = value; + }); + count.value++; + await Future.delayed(Duration.zero); + expect(1, result); + count.value++; + await Future.delayed(Duration.zero); + expect(2, result); + count.value++; + await Future.delayed(Duration.zero); + expect(3, result); + }); + + test('debounce', () async { + final count = 0.obs; + int? result = -1; + debounce(count, (dynamic _) { + // print(_); + result = _ as int?; + }, time: const Duration(milliseconds: 100)); + + count.value++; + count.value++; + count.value++; + count.value++; + await Future.delayed(Duration.zero); + expect(-1, result); + await Future.delayed(const Duration(milliseconds: 100)); + expect(4, result); + }); + + test('interval', () async { + final count = 0.obs; + int? result = -1; + interval(count, (dynamic _) { + // print(_); + result = _ as int?; + }, time: const Duration(milliseconds: 100)); + + count.value++; + await Future.delayed(Duration.zero); + await Future.delayed(const Duration(milliseconds: 100)); + expect(1, result); + count.value++; + count.value++; + count.value++; + await Future.delayed(Duration.zero); + await Future.delayed(const Duration(milliseconds: 100)); + expect(2, result); + count.value++; + await Future.delayed(Duration.zero); + await Future.delayed(const Duration(milliseconds: 100)); + expect(5, result); + }); + + test('bindStream test', () async { + int? count = 0; + final controller = StreamController(); + final rx = 0.obs; + + rx.listen((value) { + count = value; + }); + rx.bindStream(controller.stream); + expect(count, 0); + controller.add(555); + + await Future.delayed(Duration.zero); + expect(count, 555); + controller.close(); + }); + + test('Rx same value will not call the same listener when `call`', () async { + var reactiveInteger = RxInt(2); + var timesCalled = 0; + reactiveInteger.listen((newInt) { + timesCalled++; + }); + + // we call 3 + reactiveInteger.call(3); + // then repeat twice + reactiveInteger.call(3); + reactiveInteger.call(3); + + await Future.delayed(const Duration(milliseconds: 100)); + expect(1, timesCalled); + }); + + test('Rx different value will call the listener when `trigger`', () async { + var reactiveInteger = RxInt(0); + var timesCalled = 0; + reactiveInteger.listen((newInt) { + timesCalled++; + }); + + // we call 3 + reactiveInteger.trigger(1); + // then repeat twice + reactiveInteger.trigger(2); + reactiveInteger.trigger(3); + + await Future.delayed(const Duration(milliseconds: 100)); + expect(3, timesCalled); + }); + + test('Rx same value will call the listener when `trigger`', () async { + var reactiveInteger = RxInt(2); + var timesCalled = 0; + reactiveInteger.listen((newInt) { + timesCalled++; + }); + + // we call 3 + reactiveInteger.trigger(3); + // then repeat twice + reactiveInteger.trigger(3); + reactiveInteger.trigger(3); + reactiveInteger.trigger(1); + + await Future.delayed(const Duration(milliseconds: 100)); + expect(4, timesCalled); + }); + + test('Rx String with non null values', () async { + final reactiveString = Rx("abc"); + String? currentString; + reactiveString.listen((newString) { + currentString = newString; + }); + + expect(reactiveString.endsWith("c"), true); + + // we call 3 + reactiveString("b"); + + await Future.delayed(Duration.zero); + expect(currentString, "b"); + }); + + test('Rx String with null values', () async { + var reactiveString = Rx(null); + String? currentString; + + reactiveString.listen((newString) { + currentString = newString; + }); + + // we call 3 + reactiveString("abc"); + + await Future.delayed(Duration.zero); + expect(reactiveString.endsWith("c"), true); + expect(currentString, "abc"); + }); + + test('Number of times "ever" is called in RxList', () async { + final list = [1, 2, 3].obs; + var count = 0; + ever>(list, (value) { + count++; + }); + + list.add(4); + await Future.delayed(Duration.zero); + expect(count, 1); + + count = 0; + list.addAll([4, 5]); + await Future.delayed(Duration.zero); + expect(count, 1); + + count = 0; + list.removeWhere((element) => element == 2); + await Future.delayed(Duration.zero); + expect(count, 1); + + count = 0; + list.retainWhere((element) => element == 1); + await Future.delayed(Duration.zero); + expect(count, 1); + }); +} diff --git a/siro_rider/packages/get/test/state_manager/get_mixin_state_test.dart b/siro_rider/packages/get/test/state_manager/get_mixin_state_test.dart new file mode 100644 index 0000000..0c0883f --- /dev/null +++ b/siro_rider/packages/get/test/state_manager/get_mixin_state_test.dart @@ -0,0 +1,99 @@ +import 'package:flutter/material.dart'; +import 'package:flutter_test/flutter_test.dart'; +import 'package:get/get.dart'; + +void main() { + testWidgets("MixinBuilder smoke test", (tester) async { + await tester.pumpWidget( + MaterialApp( + home: MixinBuilder( + init: Controller(), + builder: (controller) { + return Column( + children: [ + Text( + 'Count: ${controller.counter.value}', + ), + Text( + 'Count2: ${controller.count}', + ), + Text( + 'Double: ${controller.doubleNum.value}', + ), + Text( + 'String: ${controller.string.value}', + ), + Text( + 'List: ${controller.list.length}', + ), + Text( + 'Bool: ${controller.boolean.value}', + ), + Text( + 'Map: ${controller.map.length}', + ), + TextButton( + child: const Text("increment"), + onPressed: () => controller.increment(), + ) + ], + ); + }, + ), + ), + ); + + expect(find.text("Count: 0"), findsOneWidget); + expect(find.text("Count2: 0"), findsOneWidget); + expect(find.text("Double: 0.0"), findsOneWidget); + expect(find.text("String: string"), findsOneWidget); + expect(find.text("Bool: true"), findsOneWidget); + expect(find.text("List: 0"), findsOneWidget); + expect(find.text("Map: 0"), findsOneWidget); + + Controller.to.increment(); + + await tester.pump(); + + expect(find.text("Count: 1"), findsOneWidget); + + await tester.tap(find.text('increment')); + + await tester.pump(); + + expect(find.text("Count: 2"), findsOneWidget); + }); + + // testWidgets( + // "MixinBuilder with build null", + // (tester) async { + // expect( + // () => MixinBuilder( + // init: Controller(), + // builder: null, + // ), + // throwsAssertionError, + // ); + // }, + // ); +} + +class Controller extends GetxController { + static Controller get to => Get.find(); + int count = 0; + RxInt counter = 0.obs; + RxDouble doubleNum = 0.0.obs; + RxString string = "string".obs; + RxList list = [].obs; + RxMap map = {}.obs; + RxBool boolean = true.obs; + + void increment() { + counter.value++; + } + + void increment2() { + count++; + update(); + } +} diff --git a/siro_rider/packages/get/test/state_manager/get_obx_test.dart b/siro_rider/packages/get/test/state_manager/get_obx_test.dart new file mode 100644 index 0000000..41626a1 --- /dev/null +++ b/siro_rider/packages/get/test/state_manager/get_obx_test.dart @@ -0,0 +1,67 @@ +import 'package:flutter/material.dart'; +import 'package:flutter_test/flutter_test.dart'; +import 'package:get/get.dart'; + +void main() { + testWidgets("GetxController smoke test", (tester) async { + final controller = Get.put(Controller()); + await tester.pumpWidget( + MaterialApp( + home: Column( + children: [ + Obx( + () => Column(children: [ + Text('Count: ${controller.counter.value}'), + Text('Double: ${controller.doubleNum.value}'), + Text('String: ${controller.string.value}'), + Text('List: ${controller.list.length}'), + Text('Bool: ${controller.boolean.value}'), + Text('Map: ${controller.map.length}'), + TextButton( + onPressed: controller.increment, + child: const Text("increment"), + ), + Obx(() => Text('Obx: ${controller.map.length}')) + ]), + ), + ], + ), + ), + ); + + expect(find.text("Count: 0"), findsOneWidget); + expect(find.text("Double: 0.0"), findsOneWidget); + expect(find.text("String: string"), findsOneWidget); + expect(find.text("Bool: true"), findsOneWidget); + expect(find.text("List: 0"), findsOneWidget); + expect(find.text("Map: 0"), findsOneWidget); + expect(find.text("Obx: 0"), findsOneWidget); + + Controller.to.increment(); + + await tester.pump(); + + expect(find.text("Count: 1"), findsOneWidget); + + await tester.tap(find.text('increment')); + + await tester.pump(); + + expect(find.text("Count: 2"), findsOneWidget); + }); +} + +class Controller extends GetxController { + static Controller get to => Get.find(); + + RxInt counter = 0.obs; + RxDouble doubleNum = 0.0.obs; + RxString string = "string".obs; + RxList list = [].obs; + RxMap map = {}.obs; + RxBool boolean = true.obs; + + void increment() { + counter.value++; + } +} diff --git a/siro_rider/packages/get/test/state_manager/get_rxstate_test.dart b/siro_rider/packages/get/test/state_manager/get_rxstate_test.dart new file mode 100644 index 0000000..6171a11 --- /dev/null +++ b/siro_rider/packages/get/test/state_manager/get_rxstate_test.dart @@ -0,0 +1,97 @@ +import 'package:flutter/material.dart'; +import 'package:flutter_test/flutter_test.dart'; +import 'package:get/get.dart'; + +void main() { + Get.lazyPut(Controller2.new); + testWidgets("GetxController smoke test", (tester) async { + await tester.pumpWidget( + MaterialApp( + home: GetX( + init: Controller(), + builder: (controller) { + return Column( + children: [ + Text( + 'Count: ${controller.counter.value}', + ), + Text( + 'Double: ${controller.doubleNum.value}', + ), + Text( + 'String: ${controller.string.value}', + ), + Text( + 'List: ${controller.list.length}', + ), + Text( + 'Bool: ${controller.boolean.value}', + ), + Text( + 'Map: ${controller.map.length}', + ), + TextButton( + child: const Text("increment"), + onPressed: () => controller.increment(), + ), + GetX(builder: (controller) { + return Text('lazy ${controller.lazy.value}'); + }), + GetX( + init: ControllerNonGlobal(), + global: false, + builder: (controller) { + return Text('single ${controller.nonGlobal.value}'); + }) + ], + ); + }, + ), + ), + ); + + expect(find.text("Count: 0"), findsOneWidget); + expect(find.text("Double: 0.0"), findsOneWidget); + expect(find.text("String: string"), findsOneWidget); + expect(find.text("Bool: true"), findsOneWidget); + expect(find.text("List: 0"), findsOneWidget); + expect(find.text("Map: 0"), findsOneWidget); + + Controller.to.increment(); + + await tester.pump(); + + expect(find.text("Count: 1"), findsOneWidget); + + await tester.tap(find.text('increment')); + + await tester.pump(); + + expect(find.text("Count: 2"), findsOneWidget); + expect(find.text("lazy 0"), findsOneWidget); + expect(find.text("single 0"), findsOneWidget); + }); +} + +class Controller2 extends GetxController { + RxInt lazy = 0.obs; +} + +class ControllerNonGlobal extends GetxController { + RxInt nonGlobal = 0.obs; +} + +class Controller extends GetxController { + static Controller get to => Get.find(); + + RxInt counter = 0.obs; + RxDouble doubleNum = 0.0.obs; + RxString string = "string".obs; + RxList list = [].obs; + RxMap map = {}.obs; + RxBool boolean = true.obs; + + void increment() { + counter.value++; + } +} diff --git a/siro_rider/packages/get/test/state_manager/get_state_test.dart b/siro_rider/packages/get/test/state_manager/get_state_test.dart new file mode 100644 index 0000000..7683dd1 --- /dev/null +++ b/siro_rider/packages/get/test/state_manager/get_state_test.dart @@ -0,0 +1,107 @@ +import 'package:flutter/material.dart'; +import 'package:flutter_test/flutter_test.dart'; +import 'package:get/get.dart'; + +void main() { + Get.lazyPut(Controller2.new); + testWidgets("GetxController smoke test", (test) async { + await test.pumpWidget( + MaterialApp( + home: GetBuilder( + init: Controller(), + builder: (controller) => Column( + children: [ + Text( + '${controller.counter}', + ), + TextButton( + child: const Text("increment"), + onPressed: () => controller.increment(), + ), + TextButton( + child: const Text("incrementWithId"), + onPressed: () => controller.incrementWithId(), + ), + GetBuilder( + id: '1', + didChangeDependencies: (_) { + // print("didChangeDependencies called"); + }, + builder: (controller) { + return Text('id ${controller.counter}'); + }), + GetBuilder(builder: (controller) { + return Text('lazy ${controller.test}'); + }), + GetBuilder( + init: ControllerNonGlobal(), + global: false, + builder: (controller) { + return Text('single ${controller.nonGlobal}'); + }) + ], + ), + ), + ), + ); + + expect(find.text("0"), findsOneWidget); + + Controller.to.increment(); + + await test.pump(); + + expect(find.text("1"), findsOneWidget); + + await test.tap(find.text('increment')); + + await test.pump(); + + expect(find.text("2"), findsOneWidget); + + await test.tap(find.text('incrementWithId')); + + await test.pump(); + + expect(find.text("id 3"), findsOneWidget); + expect(find.text("lazy 0"), findsOneWidget); + expect(find.text("single 0"), findsOneWidget); + }); + + // testWidgets( + // "MixinBuilder with build null", + // (test) async { + // expect( + // () => GetBuilder( + // init: Controller(), + // builder: null, + // ), + // throwsAssertionError, + // ); + // }, + // ); +} + +class Controller extends GetxController { + static Controller get to => Get.find(); + + int counter = 0; + + void increment() { + counter++; + update(); + } + + void incrementWithId() { + counter++; + update(['1']); + } +} + +class Controller2 extends GetxController { + int test = 0; +} + +class ControllerNonGlobal extends GetxController { + int nonGlobal = 0; +} diff --git a/siro_rider/packages/get/test/utils/extensions/context_extensions_test.dart b/siro_rider/packages/get/test/utils/extensions/context_extensions_test.dart new file mode 100644 index 0000000..aae0bd4 --- /dev/null +++ b/siro_rider/packages/get/test/utils/extensions/context_extensions_test.dart @@ -0,0 +1,65 @@ +import 'package:flutter/material.dart'; +import 'package:flutter_test/flutter_test.dart'; +import 'package:get/get.dart'; + +import '../../navigation/utils/wrapper.dart'; + +void main() { + testWidgets("Get.defaultDialog smoke test", (tester) async { + await tester.pumpWidget(Wrapper(child: Container())); + final BuildContext context = tester.element(find.byType(Container)); + + var mediaQuery = MediaQuery.of(context); + expect(mediaQuery, context.mediaQuery); + var mediaQuerySize = mediaQuery.size; + expect(mediaQuerySize, context.mediaQuerySize); + var theme = Theme.of(context); + expect(theme, context.theme); + var textTheme = theme.textTheme; + expect(textTheme, context.textTheme); + var devicePixelRatio = mediaQuery.devicePixelRatio; + expect(devicePixelRatio, context.devicePixelRatio); + var height = mediaQuerySize.height; + expect(height, context.height); + final heightTransformer = + (mediaQuerySize.height - ((mediaQuerySize.height / 100) * 0)) / 1; + expect(heightTransformer, context.heightTransformer()); + var iconColor = theme.iconTheme.color; + expect(iconColor, context.iconColor); + var isDarkMode = (theme.brightness == Brightness.dark); + expect(isDarkMode, context.isDarkMode); + var orientation = mediaQuery.orientation; + expect(orientation, context.orientation); + var isLandscape = orientation == Orientation.landscape; + expect(isLandscape, context.isLandscape); + var mediaQueryShortestSide = mediaQuerySize.shortestSide; + expect(mediaQueryShortestSide, context.mediaQueryShortestSide); + var isLargeTablet = (mediaQueryShortestSide >= 720); + expect(isLargeTablet, context.isLargeTablet); + var isPhone = (mediaQueryShortestSide < 600); + expect(isPhone, context.isPhone); + var isPortrait = orientation == Orientation.portrait; + expect(isPortrait, context.isPortrait); + var isSmallTablet = (mediaQueryShortestSide >= 600); + expect(isSmallTablet, context.isSmallTablet); + var isTablet = isSmallTablet || isLargeTablet; + expect(isTablet, context.isTablet); + var mediaQueryPadding = mediaQuery.padding; + expect(mediaQueryPadding, context.mediaQueryPadding); + var mediaQueryViewInsets = mediaQuery.viewInsets; + expect(mediaQueryViewInsets, context.mediaQueryViewInsets); + var mediaQueryViewPadding = mediaQuery.viewPadding; + expect(mediaQueryViewPadding, context.mediaQueryViewPadding); + var widthTransformer = + (mediaQuerySize.width - ((mediaQuerySize.width / 100) * 0)) / 1; + expect(widthTransformer, context.widthTransformer()); + var ratio = heightTransformer / widthTransformer; + expect(ratio, context.ratio()); + var width = mediaQuerySize.width; + expect(width, context.width); + var showNavbar = (width > 800); + expect(showNavbar, context.showNavbar); + var textScaleFactor = mediaQuery.textScaleFactor; + expect(textScaleFactor, context.textScaleFactor); + }); +} diff --git a/siro_rider/packages/get/test/utils/extensions/double_extensions_test.dart b/siro_rider/packages/get/test/utils/extensions/double_extensions_test.dart new file mode 100644 index 0000000..ba8eef5 --- /dev/null +++ b/siro_rider/packages/get/test/utils/extensions/double_extensions_test.dart @@ -0,0 +1,9 @@ +import 'package:flutter_test/flutter_test.dart'; +import 'package:get/utils.dart'; + +void main() { + test('Test for toPrecision on Double', () { + var testVar = 5.4545454; + expect(testVar.toPrecision(2), equals(5.45)); + }); +} diff --git a/siro_rider/packages/get/test/utils/extensions/dynamic_extensions_test.dart b/siro_rider/packages/get/test/utils/extensions/dynamic_extensions_test.dart new file mode 100644 index 0000000..530b96f --- /dev/null +++ b/siro_rider/packages/get/test/utils/extensions/dynamic_extensions_test.dart @@ -0,0 +1,38 @@ +import 'package:flutter_test/flutter_test.dart'; +import 'package:get/utils.dart'; + +void main() { + test('String test', () { + var value = 'string'; + var expected = ''; + void logFunction(String prefix, dynamic value, String info, + {bool isError = false}) { + expected = '$prefix $value $info'.trim(); + } + + value.printError(logFunction: logFunction); + expect(expected, 'Error: String string'); + }); + test('Int test', () { + var value = 1; + var expected = ''; + void logFunction(String prefix, dynamic value, String info, + {bool isError = false}) { + expected = '$prefix $value $info'.trim(); + } + + value.printError(logFunction: logFunction); + expect(expected, 'Error: int 1'); + }); + test('Double test', () { + var value = 1.0; + var expected = ''; + void logFunction(String prefix, dynamic value, String info, + {bool isError = false}) { + expected = '$prefix $value $info'.trim(); + } + + value.printError(logFunction: logFunction); + expect(expected, 'Error: double 1.0'); + }); +} diff --git a/siro_rider/packages/get/test/utils/extensions/num_extensions_test.dart b/siro_rider/packages/get/test/utils/extensions/num_extensions_test.dart new file mode 100644 index 0000000..aec15f9 --- /dev/null +++ b/siro_rider/packages/get/test/utils/extensions/num_extensions_test.dart @@ -0,0 +1,45 @@ +import 'package:flutter_test/flutter_test.dart'; +import 'package:get/utils.dart'; + +void main() { + num x = 5; + num y = 7; + num z = 5; + + var doubleX = 2.1; + var doubleY = 3.1; + var doubleZ = 5.0; + var pi = 3.14159265359; + + group('num extensions text', () { + test('var.isLowerThan(value)', () { + expect(x.isLowerThan(y), true); + expect(y.isLowerThan(x), false); + expect(x.isLowerThan(z), false); + expect(doubleX.isLowerThan(doubleY), true); + expect(doubleY.isLowerThan(pi), true); + expect(x.isLowerThan(doubleX), false); + expect(z.isLowerThan(doubleZ), false); + }); + test('var.isGreaterThan(value)', () { + expect(x.isGreaterThan(y), false); + expect(y.isGreaterThan(x), true); + expect(x.isGreaterThan(z), false); + expect(doubleX.isGreaterThan(doubleY), false); + expect(doubleY.isGreaterThan(pi), false); + expect(pi.isGreaterThan(3.14159265359), false); + expect(y.isGreaterThan(doubleY), true); + expect(z.isGreaterThan(doubleZ), false); + }); + test('var.isEqual(value)', () { + expect(x.isEqual(y), false); + expect(y.isEqual(x), false); + expect(x.isEqual(5), true); + expect(y.isEqual(7), true); + expect(doubleX.isEqual(doubleY), false); + expect(doubleY.isEqual(pi), false); + expect(pi.isEqual(3.14159265359), true); + expect(z.isEqual(doubleZ), true); + }); + }); +} diff --git a/siro_rider/packages/get/test/utils/extensions/string_extensions_test.dart b/siro_rider/packages/get/test/utils/extensions/string_extensions_test.dart new file mode 100644 index 0000000..c6e767f --- /dev/null +++ b/siro_rider/packages/get/test/utils/extensions/string_extensions_test.dart @@ -0,0 +1,719 @@ +import 'package:flutter_test/flutter_test.dart'; +import 'package:get/utils.dart'; + +void main() { + group('String extensions', () { + const text = "oi"; + const digit = "5"; + const specialCaracters = "#\$!%@"; + const alphaNumeric = "123asd"; + const numbers = "123"; + const letters = "foo"; + // String notInitializedVar; + + test('var.isNum', () { + expect(digit.isNum, true); + expect(text.isNum, false); + }); + + test('var.isNumericOnly', () { + expect(numbers.isNumericOnly, true); + expect(letters.isNumericOnly, false); + expect(specialCaracters.isNumericOnly, false); + expect(alphaNumeric.isNumericOnly, false); + }); + + test('var.isAlphabetOnly', () { + expect(alphaNumeric.isAlphabetOnly, false); + expect(numbers.isAlphabetOnly, false); + expect(letters.isAlphabetOnly, true); + }); + + test('var.isBool', () { + const trueString = 'true'; + // expect(notInitializedVar.isBool, false); + expect(letters.isBool, false); + expect(trueString.isBool, true); + }); + + test('var.isVectorFileName', () { + const path = "logo.svg"; + const fullPath = "C:/Users/Getx/Documents/logo.svg"; + expect(path.isVectorFileName, true); + expect(fullPath.isVectorFileName, true); + expect(alphaNumeric.isVectorFileName, false); + }); + + test('var.isImageFileName', () { + const jpgPath = "logo.jpg"; + const jpegPath = "logo.jpeg"; + const pngPath = "logo.png"; + const gifPath = "logo.gif"; + const bmpPath = "logo.bmp"; + const svgPath = "logo.svg"; + + expect(jpgPath.isImageFileName, true); + expect(jpegPath.isImageFileName, true); + expect(pngPath.isImageFileName, true); + expect(gifPath.isImageFileName, true); + expect(bmpPath.isImageFileName, true); + expect(svgPath.isImageFileName, false); + }); + + test('var.isAudioFileName', () { + const mp3Path = "logo.mp3"; + const wavPath = "logo.wav"; + const wmaPath = "logo.wma"; + const amrPath = "logo.amr"; + const oggPath = "logo.ogg"; + const svgPath = "logo.svg"; + + expect(mp3Path.isAudioFileName, true); + expect(wavPath.isAudioFileName, true); + expect(wmaPath.isAudioFileName, true); + expect(amrPath.isAudioFileName, true); + expect(oggPath.isAudioFileName, true); + expect(svgPath.isAudioFileName, false); + }); + + test('var.isVideoFileName', () { + const mp4Path = "logo.mp4"; + const aviPath = "logo.avi"; + const wmvPath = "logo.wmv"; + const rmvbPath = "logo.rmvb"; + const mpgPath = "logo.mpg"; + const mpegPath = "logo.mpeg"; + const threegpPath = "logo.3gp"; + const svgPath = "logo.svg"; + + expect(mp4Path.isVideoFileName, true); + expect(aviPath.isVideoFileName, true); + expect(wmvPath.isVideoFileName, true); + expect(rmvbPath.isVideoFileName, true); + expect(mpgPath.isVideoFileName, true); + expect(mpegPath.isVideoFileName, true); + expect(threegpPath.isVideoFileName, true); + expect(svgPath.isAudioFileName, false); + }); + + test('var.isTxtFileName', () { + const txtPath = 'file.txt'; + expect(txtPath.isTxtFileName, true); + expect(alphaNumeric.isTxtFileName, false); + }); + + test('var.isDocumentFileName', () { + const docPath = "file.doc"; + const docxPath = "file.docx"; + + expect(docPath.isDocumentFileName, true); + expect(docxPath.isDocumentFileName, true); + expect(alphaNumeric.isDocumentFileName, false); + }); + + test('var.isExcelFileName', () { + const xlsPath = "file.xls"; + const xlsxPath = "file.xlsx"; + + expect(xlsPath.isExcelFileName, true); + expect(xlsxPath.isExcelFileName, true); + expect(alphaNumeric.isExcelFileName, false); + }); + + test('var.isPPTFileName', () { + const pptPath = "file.ppt"; + const pptxPath = "file.pptx"; + + expect(pptPath.isPPTFileName, true); + expect(pptxPath.isPPTFileName, true); + expect(alphaNumeric.isPPTFileName, false); + }); + + test('var.isAPKFileName', () { + const apkPath = "file.apk"; + + expect(apkPath.isAPKFileName, true); + expect(alphaNumeric.isAPKFileName, false); + }); + + test('var.isPDFFileName', () { + const pdfPath = "file.pdf"; + + expect(pdfPath.isPDFFileName, true); + expect(alphaNumeric.isPDFFileName, false); + }); + test('var.isHTMLFileName', () { + const htmlPath = "file.html"; + + expect(htmlPath.isHTMLFileName, true); + expect(alphaNumeric.isHTMLFileName, false); + }); + test('var.isURL', () { + // Url's generated in https://www.randomlists.com/urls + final urls = [ + 'http://www.example.com/aunt/babies.aspx#act', + 'http://adjustment.example.com/bedroom/animal.htm', + 'http://blade.example.com/arch/basketball', + 'https://www.example.com/air/advice.php', + 'http://www.example.com/balance/arch.html?blow=aftermath&bait=bath', + 'http://authority.example.com/', + 'http://example.com/advice.html', + 'https://www.example.com/', + 'https://www.example.com/bee?act=art&bells=board', + 'http://example.org/', + 'https://www.example.com/', + 'https://example.com/bed', + 'https://www.example.edu/acoustics', + 'https://www.example.com/bells', + 'http://board.example.com/', + 'http://book.example.com/afterthought?advertisement=ball&birth=argument', + 'http://birds.example.org/ball.aspx?apparatus=border&brother=aftermath', + 'https://www.example.org/books/book?bedroom=birds', + 'http://advice.example.com/', + 'http://example.com/', + 'http://example.com/bedroom/alarm', + 'https://example.com/advice/approval', + 'http://anger.example.net/?breath=brother&air=bell#ball', + 'http://appliance.example.com/bee/badge', + 'http://www.example.org/berry.aspx', + 'http://example.org/', + ]; + + for (final url in urls) { + expect(url.isURL, true); + } + expect(alphaNumeric.isURL, false); + }); + test('var.isEmail', () { + final emails = [ + 'hellfire@comcast.net', + 'hllam@icloud.com', + 'tskirvin@live.com', + 'choset@comcast.net', + 'parksh@live.com', + 'kassiesa@yahoo.com', + 'kramulous@comcast.net', + 'froodian@me.com', + 'shawnce@yahoo.ca', + 'cgreuter@gmail.com', + 'aprakash@verizon.net', + 'dhrakar@gmail.com', + 'wmszeliga@yahoo.ca', + 'bmorrow@icloud.com', + 'seurat@comcast.net', + 'dialworld@yahoo.ca', + 'johndo@yahoo.ca', + 'empathy@yahoo.com.pt', + 'openldap@verizon.net', + 'elflord@outlook.com', + 'kaiser@me.com', + 'carcus@att.net', + 'garland@hotmail.com', + 'clkao@yahoo.ca', + 'daveed@mac.com', + 'parasite@icloud.com', + 'drolsky@aol.com', + 'reziac@outlook.com', + 'storerm@yahoo.ca', + 'johnbob@hotmail.com.br', + ]; + + for (final email in emails) { + expect(email.isEmail, true); + } + expect(alphaNumeric.isEmail, false); + }); + test('var.isPhoneNumber', () { + final phoneNumbers = [ + '+1202-555-0145', + '+1202-555-0139', + '+1202-555-0101', + '+1202-555-0136', + '+1202-555-0190', + '+1202-555-0156', + '(738) 952-5253', + '(861) 965-1597', + '(732) 372-9760', + '(532) 766-4719', + '(987) 472-7813', + '(455) 443-8171', + '(915) 685-8658', + '(572) 207-1898', + '(81) 6 2499-9538', + '(31) 32304-4263', + '(64) 25242-6375', + '(41) 19308-7925', + '(67) 61684-0395', + '(60) 54706-3569', + '(31) 33110055', + '(11) 3344-5599', + '(31) 977447788', + '(31) 66557744', + '(21) 946576541', + '(11) 3432-3333', + '02131973585858' + ]; + + for (final phone in phoneNumbers) { + // print('testing $phone'); + expect(phone.isPhoneNumber, true); + } + + const bigRandomNumber = '168468468465241327987624987327987'; + expect(bigRandomNumber.isPhoneNumber, false); + + expect(alphaNumeric.isPhoneNumber, false); + }); + test('var.isDateTime', () { + final dateTimes = [ + '2003-07-05 05:51:47.000Z', + '1991-05-11 11:57:30.000Z', + '2002-01-04 10:00:41.000Z', + '1995-11-04 19:43:25.000Z', + '2006-07-12 20:06:46.000Z', + '2000-08-10 00:06:23.000Z', + '1998-07-31 10:56:50.000Z', + '1995-04-27 11:49:34.000Z', + '1998-07-26 15:43:11.000Z', + '1999-02-04 10:03:01.000Z', + '1998-05-02 12:17:55.000Z', + '2013-05-26 10:47:22.000Z', + '1991-07-07 20:25:42.000Z', + '2018-11-03 09:27:38.000Z', + '1992-12-22 08:20:26.000Z', + '1997-07-01 23:11:59.000Z', + '2012-04-13 16:00:04.000Z', + '1997-01-06 18:37:51.000Z', + '2008-08-23 11:11:29.000Z', + '1996-02-06 03:46:43.000Z', + '2016-01-03 10:57:15.000Z', + '2014-04-16 17:20:50.000Z', + '1994-07-13 03:55:16.000Z', + '2004-11-15 03:45:11.000Z', + '2007-12-18 18:21:21.000Z', + '1995-01-31 03:55:44.000Z', + '2013-08-09 04:48:37.000Z', + '2001-09-07 17:13:55.000Z', + '1993-06-18 13:21:21.000Z', + '1991-02-06 03:05:47.000Z', + '2000-09-22 18:48:55.000Z', + '2000-06-01 02:13:57.000Z', + '1991-08-07 21:08:35.000Z', + '1998-08-15 07:27:12.000Z', + '2002-07-03 10:34:25.000Z', + '2013-10-05 00:37:45.000Z', + '2012-09-10 20:07:21.000Z', + '2017-06-18 14:38:06.000Z', + '2000-03-09 11:27:49.000Z', + '2016-01-16 22:01:20.000Z', + ]; + + for (final dateTime in dateTimes) { + // print('testing $dateTime'); + expect(dateTime.isDateTime, true); + } + expect(alphaNumeric.isDateTime, false); + }); + test('var.isMD5', () { + final md5s = [ + '176cfa006065a2a2bd8d3f1f83531b64', + '713fca6d088132e863497a79d1bd9572', + '7decc2fb2aca5cbd8a2cae5de1b50edb', + '85ed9bc4e4a8ae65add67886f5dfe02f', + 'e4f0097f84a11f0298c83ecf6aa0fec3', + '70a2712b47127b431d7119b3a511b145', + 'dd54069e3f97787e79592f6e3a307e93', + '5b64677b69da7370ee69523281ce935c', + '6150ce23f4b071e1cde49021b57c5a17', + '2781566b09a84a695297482cdcb1ffd0', + '54fe4ce16862aac01768b5831390d557', + '2747268afaa9898a320b8cc5580f143e', + 'ce3c2d105fb2740c5bf59347b47603a8', + 'cccef3bbc8cd2530c6de78af586ebcee', + '502115b10c767f50ab55270be095512e', + 'b084ea385e849eaedf4fefaf6dd5f1a9', + '1f167339977225fe63a86388083fc64f', + '6abd5f472dba5e4688ad6dd14f975870', + '7e7f9ef53fb6e3ce2a4fb56665548eb8', + 'de134fce82421dd2b3fab751fbfa190d', + 'b0d8492572a52d1f2360535612c5dc82', + ]; + + for (final md5 in md5s) { + expect(md5.isMD5, true); + } + + expect(alphaNumeric.isMD5, false); + }); + test('var.isSHA1', () { + final sha1s = [ + '1A310CF5DC8CE513586F74EE19CE90BD4BCC5AED', + 'B458B077B5075C316CFD03619D627F529A0555BF', + '902C6A2850B4348BE445D637689CCAE5C5EF3552', + '8DC86C0DD0FD2960D62573AB142F90572A7421D5', + '7E18C8EA5F05BB2F385A9E34657B8D439A83BF82', + '3EC857A133E801C0B3198371C17C1A3A3D73DFE8', + 'E32590E41805BEFD524205DAE0A56F429DCCC4E7', + '943A9164A126457203680B49F0309B5F15F0117E', + 'C5E1442484AF49A92E1CC51F95AE4E8305F49DB6', + 'B0C3B071F8ADBEE2222AA07ECFF51C3C040AA0A0', + '722ED6929057BF801F29590C423A40F4EF8C710E', + 'F484FA4DC5EC1E063F0752112D9BF3B9763D6E41', + '2A87522644011223A27FD62C87FA926A1838F271', + ]; + + for (final sha1 in sha1s) { + expect(sha1.isSHA1, true); + } + + expect(alphaNumeric.isSHA1, false); + }); + test('var.isSHA256', () { + final sha256s = [ + 'FC694FFE78167EAE21EA4EBF072D8AB6ECF847162D1F65600BF019BA9805DB2D', + '3B64F1C349B548E72688A8EEFFA2F418A62BA2E22CF5BD954B4B1912C963D7FA', + 'EF69D763148B8A222980BD164943F754937DF12771083889DDB69C18245C2904', + '9896D3134156E546FFC003C2C9CFED88D46C2BC214B39CF21192EAAF875A7C0A', + '2C70E9735D7DAB56427BAA09E6C63912BEAD9C7938F6B16C4954B78F46D1C3CF', + '423E095C8074BC1C440D874D999C18025445CD39211D98362E827E55863DD0B2', + '4FCDB44D5521663F713A5821DE9401D64D44050C2AF62EBA758B1D128AC4C279', + 'BD91C9BBC044C94C283D0DF3AA1E8CDBF1BF35BF325E8196BA15FCA5238A3A40', + '7B9434447F3B1236221D40CB707D1909886CC9E8CA25EB18DCCFDC70F0A3AE9F', + 'FBD3A0B1C5F9906EF3BFB5EDD846F77BA252070E036EC1F4F57BDD912F02987D', + 'B8369EE116ADE797285DC973DDAA69433F255DC0AEEC7936378D4D08B2A7FDD2', + '6B6FE6891A5DFCCF2900A2A1F513196827AF5A95AB2DE1590B878BEFCCF12603', + 'F2CB3614CD070450912EBEC399C63527D2A839C4E5BB2FE281BA1C5D5EA64257', + '822805E8FA05909AD7D3D6DBFBB1AE61D7A3C70209DB2A37C415BD5E11764866', + '40DAC792B52101BB1506AD880F0378EFACF46B019427A3D0E01DE2B09B06B6ED', + 'E765A129579AF2F31C681973844490F8EA146DA8ADC07671F9FB71F0FE10E296', + '2B5B6DC7EF398D1420D23327295BCDCDDA8AAEDB7FE6C6129D1D31432B676CB7', + '67F20826370162C472791055E10E44624D40E35F29E60592B239692836474323', + 'BD16B1ED024E353B5B2334201EC63C0B3E181F0DFD226A36825EF18F6A7D8D97', + 'AC98F969AA56810BE672C770BE30EF79F7F77AE6EFB2A90D56FA2AD5506D8BD7', + ]; + + for (final sha256 in sha256s) { + expect(sha256.isSHA256, true); + } + + expect(alphaNumeric.isSHA256, false); + }); + test('var.isBinary', () { + final binaries = [ + '00111100', + '00001111', + '10110110', + '01101110', + '01110101', + '00010100', + '11100010', + '11000001', + '11000110', + '11011101', + '10001101', + '10101110', + '11001110', + '10001011', + '11111101', + '11010110', + '11110011', + '01111010', + '11110011', + '01000111', + ]; + + for (final binary in binaries) { + expect(binary.isBinary, true); + } + + expect(alphaNumeric.isBinary, false); + }); + test('var.isIPv4', () { + final ipv4s = [ + '155.162.247.250', + '121.99.222.180', + '142.197.183.237', + '176.60.213.134', + '12.190.123.58', + '105.75.28.173', + '121.120.116.138', + '20.195.194.189', + '234.171.207.97', + '153.122.129.170', + '224.226.28.80', + '236.196.62.84', + '122.71.160.46', + '151.24.85.63', + '37.109.242.32', + '235.47.62.53', + '151.1.242.190', + '227.197.221.85', + '12.118.136.231', + '51.73.246.208', + ]; + + for (final ipv4 in ipv4s) { + expect(ipv4.isIPv4, true); + } + + expect(alphaNumeric.isIPv4, false); + }); + test('var.isIPv6', () { + final ipv6s = [ + 'f856:62fc:9091:e649:e928:d771:f40c:1439', + 'b8d5:3f85:5ae5:c63a:6b5f:f7e6:ea6b:871d', + '2f91:979a:90b0:55d1:40b7:3e6f:a210:598e', + 'd35d:49fc:fbe4:9841:e4d3:f006:b04b:e242', + '2e0f:2912:e4e8:33d5:e833:0ac5:c73a:30b3', + '6af9:878a:a80f:f520:fc2b:a05c:b0dd:b93f', + '3329:1ce5:ab09:0120:945c:057b:ed4a:7869', + 'b77d:5523:2f1b:ff07:93a5:378f:a9c7:e2f2', + 'b669:64fa:1be7:af47:28fc:07f4:38bd:ae05', + 'aa77:1f7e:8539:a01a:706d:6f74:7fc3:8407', + '16f9:9bcc:32d6:96de:5087:620b:c0c0:25cb', + 'baad:273f:7e63:29cd:c742:c1ed:d0f9:062d', + 'ae62:5b09:05fa:4611:5da9:a40a:f1ef:2a9d', + '4d2a:353a:9f6b:2070:9605:ab97:92c0:7956', + 'bfcb:39f8:5119:458f:85fa:9e54:8c53:acd5', + '0c1a:c6f3:06af:9588:23b4:e7fb:c307:febd', + 'ddaa:3c91:f554:dbe5:8447:9464:a9ae:2200', + '8787:c939:5002:a4f6:19b2:6521:4cde:8111', + 'b515:5c17:6590:46dd:4ca8:1db3:a86c:e006', + '1083:d492:f42e:2c99:f050:f67f:07c5:23f9', + ]; + + for (final ipv6 in ipv6s) { + expect(ipv6.isIPv6, true); + } + + expect(alphaNumeric.isIPv6, false); + }); + test('var.isHexadecimal', () { + final hexadecimals = [ + '#56E97B', + '#597E2A', + '#F45D5C', + '#A350DC', + '#2DA48E', + '#98CB3C', + '#F7DCD1', + '#B1F9BE', + '#D17855', + '#6F35CB', + '#DCBE21', + '#4C2E46', + '#145F3F', + '#F9776D', + '#62E9DC', + '#2F1030', + '#C4F888', + '#8E6D85', + '#8C64CE', + '#4DFF4E', + ]; + + for (final hexadecimal in hexadecimals) { + expect(hexadecimal.isHexadecimal, true); + } + + expect(alphaNumeric.isHexadecimal, false); + }); + test('var.isPalindrom', () { + final palindroms = [ + 'Anna', + 'Civic', + 'Kayak', + 'Level', + 'Madam', + 'Mom', + 'Noon', + 'Racecar', + 'Radar', + 'Redder', + 'Refer', + 'Repaper', + 'Don\'t nod.', + 'I did, did I?', + 'My gym', + 'Red rum, sir, is murder', + 'Step on no pets', + 'Top spot', + 'Was it a cat I saw?', + 'Eva, can I see bees in a cave?', + 'No lemon, no melon', + 'A base do teto desaba.', + 'A cara rajada da jararaca.', + 'Acuda cadela da Leda caduca.', + 'A dama admirou o rim da amada.', + 'A Daniela ama a lei? Nada!', + + // TODO make isPalindrom regex support UTF8 characters + // 'Adias a data da saída.', + // 'A diva em Argel alegra-me a vida.', + // 'A droga do dote é todo da gorda.', + // 'A gorda ama a droga.', + // 'A grama é amarga.', + // 'Aí, Lima falou: “Olá, família!”.', + // 'anã', + // 'anilina', + // 'ata', + // 'arara', + // 'asa', + // 'ele', + // 'esse', + // 'mamam', + // 'matam', + // 'metem', + // 'mirim', + // 'oco', + // 'omissíssimo', + ]; + for (final palindrom in palindroms) { + // print("testing $palindrom"); + expect(palindrom.isPalindrom, true); + } + expect(alphaNumeric.isPalindrom, false); + }); + test('var.isPassport', () { + final passports = [ + '12ss46', + 'jdmg5dg', + '5f7fj5d7', + 'w8a9s6f3z', + ]; + + for (final passport in passports) { + expect(passport.isPassport, true); + } + + expect(specialCaracters.isPassport, false); + }); + + test('var.isCurrency', () { + final currencies = [ + 'R\$50.58', + '\$82.48', + '₩54.24', + '¥81.04', + '€4.06', + '₹37.40', + '₽18.12', + 'fr95.15', + 'R81.04', + '9.35USD', + '98.48AUD', + '29.20NZD', + '50.58CAD', + '82.48CHF', + '54.24GBP', + '81.04CNY', + '4.06EUR', + '37.40JPY', + '18.12IDR', + '95.15MXN', + '81.04NOK', + '9.35KRW', + '98.48TRY', + '29.20INR', + ]; + + for (final currency in currencies) { + // print('currency $currency'); + expect(currency.isCurrency, true); + } + + expect(specialCaracters.isCurrency, false); + }); + + test('var.isCpf', () { + final cpfs = [ + '370.559.380-31', + '055.878.430-50', + '655.232.870-24', + '86497047000', + '12341309046', + '31496294033', + ]; + + for (final cpf in cpfs) { + expect(cpf.isCpf, true); + } + + expect(specialCaracters.isCpf, false); + }); + test('var.isCnpj', () { + final cnpjs = [ + '11.066.893/0001-94', + '21.883.660/0001-38', + '59.705.218/0001-94', + ]; + + for (final cnpj in cnpjs) { + expect(cnpj.isCnpj, true); + } + + expect(specialCaracters.isCnpj, false); + }); + + test('var.isCaseInsensitiveContains(string)', () { + const phrase = 'Back to Square One'; + + expect(phrase.isCaseInsensitiveContains('to'), true); + expect(phrase.isCaseInsensitiveContains('square'), true); + expect(phrase.isCaseInsensitiveContains('On'), true); + expect(phrase.isCaseInsensitiveContains('foo'), false); + }); + + test('var.isCaseInsensitiveContainsAny(string)', () { + const phrase = 'Back to Square One'; + + expect(phrase.isCaseInsensitiveContainsAny('to'), true); + expect(phrase.isCaseInsensitiveContainsAny('square'), true); + expect(phrase.isCaseInsensitiveContainsAny('On'), true); + expect(phrase.isCaseInsensitiveContainsAny('foo'), false); + expect('to'.isCaseInsensitiveContainsAny(phrase), true); + expect('square'.isCaseInsensitiveContainsAny('qu'), true); + }); + + test('var.capitalize', () { + expect('foo bar'.capitalize, 'Foo Bar'); + expect('FoO bAr'.capitalize, 'Foo Bar'); + expect('FOO BAR'.capitalize, 'Foo Bar'); + // expect(null.capitalize, null); + expect(''.capitalize, ''); + expect('foo bar '.capitalize, 'Foo Bar '); + }); + + test('var.capitalizeFirst', () { + expect('foo bar'.capitalizeFirst, 'Foo bar'); + expect('FoO bAr'.capitalizeFirst, 'Foo bar'); + expect('FOO BAR'.capitalizeFirst, 'Foo bar'); + // expect(null.capitalizeFirst, null); + expect(''.capitalizeFirst, ''); + }); + + test('var.removeAllWhitespace', () { + //late String nullString; + expect('foo bar'.removeAllWhitespace, 'foobar'); + expect('foo'.removeAllWhitespace, 'foo'); + expect(''.removeAllWhitespace, ''); + // expect(nullString.removeAllWhitespace, null); + }); + + test('var.camelCase', () { + expect('foo bar'.camelCase, 'fooBar'); + expect('the fox jumped in the water'.camelCase, 'theFoxJumpedInTheWater'); + expect('foo_bar'.camelCase, 'fooBar'); + expect(''.camelCase, null); + }); + + test('var.numericOnly()', () { + expect('date: 2020/09/13, time: 00:00'.numericOnly(), '202009130000'); + expect( + 'and 1, and 2, and 1 2 3'.numericOnly(), + '12123', + ); + expect(''.numericOnly(), ''); + }); + }); +} diff --git a/siro_rider/packages/get/test/utils/extensions/widget_extensions_test.dart b/siro_rider/packages/get/test/utils/extensions/widget_extensions_test.dart new file mode 100644 index 0000000..f562871 --- /dev/null +++ b/siro_rider/packages/get/test/utils/extensions/widget_extensions_test.dart @@ -0,0 +1,90 @@ +import 'package:flutter/widgets.dart'; +import 'package:flutter_test/flutter_test.dart'; +import 'package:get/utils.dart'; + +class Foo extends StatelessWidget { + const Foo({Key? key}) : super(key: key); + + @override + Widget build(BuildContext context) { + return const SizedBox.shrink(); + } +} + +void main() { + group('Group test for PaddingX Extension', () { + testWidgets('Test of paddingAll', (tester) async { + Widget containerTest = const Foo(); + + expect(find.byType(Padding), findsNothing); + + await tester.pumpWidget(containerTest.paddingAll(16)); + + expect(find.byType(Padding), findsOneWidget); + }); + + testWidgets('Test of paddingOnly', (tester) async { + Widget containerTest = const Foo(); + + expect(find.byType(Padding), findsNothing); + + await tester.pumpWidget(containerTest.paddingOnly(top: 16)); + + expect(find.byType(Padding), findsOneWidget); + }); + + testWidgets('Test of paddingSymmetric', (tester) async { + Widget containerTest = const Foo(); + + expect(find.byType(Padding), findsNothing); + + await tester.pumpWidget(containerTest.paddingSymmetric(vertical: 16)); + + expect(find.byType(Padding), findsOneWidget); + }); + + testWidgets('Test of paddingZero', (tester) async { + Widget containerTest = const Foo(); + + expect(find.byType(Padding), findsNothing); + + await tester.pumpWidget(containerTest.paddingZero); + + expect(find.byType(Padding), findsOneWidget); + }); + }); + + group('Group test for MarginX Extension', () { + testWidgets('Test of marginAll', (tester) async { + Widget containerTest = const Foo(); + + await tester.pumpWidget(containerTest.marginAll(16)); + + expect(find.byType(Container), findsOneWidget); + }); + + testWidgets('Test of marginOnly', (tester) async { + Widget containerTest = const Foo(); + + await tester.pumpWidget(containerTest.marginOnly(top: 16)); + + expect(find.byType(Container), findsOneWidget); + }); + + testWidgets('Test of marginSymmetric', (tester) async { + Widget containerTest = const Foo(); + + await tester.pumpWidget(containerTest.marginSymmetric(vertical: 16)); + + expect(find.byType(Container), findsOneWidget); + }); + + testWidgets('Test of marginZero', (tester) async { + Widget containerTest = const Foo(); + + await tester.pumpWidget(containerTest.marginZero); + + expect(find.byType(Container), findsOneWidget); + }); + }); +} diff --git a/siro_rider/packages/get/test/utils/get_utils_test.dart b/siro_rider/packages/get/test/utils/get_utils_test.dart new file mode 100644 index 0000000..d976235 --- /dev/null +++ b/siro_rider/packages/get/test/utils/get_utils_test.dart @@ -0,0 +1,114 @@ +import 'package:flutter_test/flutter_test.dart'; +import 'package:get/get.dart'; + +class TestClass { + final name = "John"; +} + +class EmptyClass {} + +void main() { + dynamic _id(dynamic e) => e; + + test('null isNullOrBlank should be true for null', () { + expect(GetUtils.isNullOrBlank(null), true); + }); + + test('isNullOrBlank should be false for unsupported types', () { + expect(GetUtils.isNullOrBlank(5), false); + expect(GetUtils.isNullOrBlank(0), false); + + expect(GetUtils.isNullOrBlank(5.0), equals(false)); + expect(GetUtils.isNullOrBlank(0.0), equals(false)); + + TestClass? testClass; + expect(GetUtils.isNullOrBlank(testClass), equals(true)); + expect(GetUtils.isNullOrBlank(TestClass()), equals(false)); + expect(GetUtils.isNullOrBlank(EmptyClass()), equals(false)); + }); + + test('isNullOrBlank should validate strings', () { + expect(GetUtils.isNullOrBlank(""), true); + expect(GetUtils.isNullOrBlank(" "), true); + + expect(GetUtils.isNullOrBlank("foo"), false); + expect(GetUtils.isNullOrBlank(" foo "), false); + + expect(GetUtils.isNullOrBlank("null"), false); + }); + + test('isNullOrBlank should validate iterables', () { + expect(GetUtils.isNullOrBlank([].map(_id)), true); + expect(GetUtils.isNullOrBlank([1].map(_id)), false); + }); + + test('isNullOrBlank should validate lists', () { + expect(GetUtils.isNullOrBlank(const []), true); + expect(GetUtils.isNullOrBlank(['oi', 'foo']), false); + expect(GetUtils.isNullOrBlank([{}, {}]), false); + expect(GetUtils.isNullOrBlank(['foo'][0]), false); + }); + + test('isNullOrBlank should validate sets', () { + expect(GetUtils.isNullOrBlank({}), true); + expect(GetUtils.isNullOrBlank({1}), false); + expect(GetUtils.isNullOrBlank({'fluorine', 'chlorine', 'bromine'}), false); + }); + + test('isNullOrBlank should validate maps', () { + expect(GetUtils.isNullOrBlank({}), true); + expect(GetUtils.isNullOrBlank({1: 1}), false); + expect(GetUtils.isNullOrBlank({"other": "thing"}), false); + + final map = {"foo": 'bar', "one": "um"}; + expect(GetUtils.isNullOrBlank(map["foo"]), false); + expect(GetUtils.isNullOrBlank(map["other"]), true); + }); + group('GetUtils.isLength* functions', () { + test('isLengthEqualTo should validate iterable lengths', () { + // iterables should cover list and set + expect(GetUtils.isLengthEqualTo([].map(_id), 0), true); + expect(GetUtils.isLengthEqualTo([1, 2].map(_id), 2), true); + + expect(GetUtils.isLengthEqualTo({}, 0), true); + expect(GetUtils.isLengthEqualTo({1: 1, 2: 1}, 2), true); + expect(GetUtils.isLengthEqualTo({}, 2), false); + + expect(GetUtils.isLengthEqualTo("", 0), true); + expect(GetUtils.isLengthEqualTo("a", 0), false); + expect(GetUtils.isLengthEqualTo("a", 1), true); + }); + + test('isLengthGreaterOrEqual should validate lengths', () { + // iterables should cover list and set + expect(GetUtils.isLengthGreaterOrEqual([].map(_id), 0), true); + expect(GetUtils.isLengthGreaterOrEqual([1, 2].map(_id), 2), true); + expect(GetUtils.isLengthGreaterOrEqual([1, 2].map(_id), 1), true); + + expect(GetUtils.isLengthGreaterOrEqual({}, 0), true); + expect(GetUtils.isLengthGreaterOrEqual({1: 1, 2: 1}, 1), true); + expect(GetUtils.isLengthGreaterOrEqual({1: 1, 2: 1}, 2), true); + expect(GetUtils.isLengthGreaterOrEqual({}, 2), false); + + expect(GetUtils.isLengthGreaterOrEqual("", 0), true); + expect(GetUtils.isLengthGreaterOrEqual("a", 0), true); + expect(GetUtils.isLengthGreaterOrEqual("", 1), false); + }); + + test('isLengthLessOrEqual should validate lengths', () { + // iterables should cover list and set + expect(GetUtils.isLengthLessOrEqual([].map(_id), 0), true); + expect(GetUtils.isLengthLessOrEqual([1, 2].map(_id), 2), true); + expect(GetUtils.isLengthLessOrEqual([1, 2].map(_id), 1), false); + + expect(GetUtils.isLengthLessOrEqual({}, 0), true); + expect(GetUtils.isLengthLessOrEqual({1: 1, 2: 1}, 1), false); + expect(GetUtils.isLengthLessOrEqual({1: 1, 2: 1}, 3), true); + expect(GetUtils.isLengthLessOrEqual({}, 2), true); + + expect(GetUtils.isLengthLessOrEqual("", 0), true); + expect(GetUtils.isLengthLessOrEqual("a", 2), true); + expect(GetUtils.isLengthLessOrEqual("a", 0), false); + }); + }); +} diff --git a/siro_rider/packages/get/test/utils/platform_test.dart b/siro_rider/packages/get/test/utils/platform_test.dart new file mode 100644 index 0000000..bb09c54 --- /dev/null +++ b/siro_rider/packages/get/test/utils/platform_test.dart @@ -0,0 +1,16 @@ +@TestOn('vm') +import 'dart:io'; +import 'package:flutter_test/flutter_test.dart'; +import 'package:get/get.dart'; + +void main() { + test('Platform test', () { + expect(GetPlatform.isAndroid, Platform.isAndroid); + expect(GetPlatform.isIOS, Platform.isIOS); + expect(GetPlatform.isFuchsia, Platform.isFuchsia); + expect(GetPlatform.isLinux, Platform.isLinux); + expect(GetPlatform.isMacOS, Platform.isMacOS); + expect(GetPlatform.isWindows, Platform.isWindows); + expect(GetPlatform.isWeb, false); + }); +} diff --git a/siro_rider/packages/get/test/utils/platform_web_test.dart b/siro_rider/packages/get/test/utils/platform_web_test.dart new file mode 100644 index 0000000..52a0669 --- /dev/null +++ b/siro_rider/packages/get/test/utils/platform_web_test.dart @@ -0,0 +1,16 @@ +@TestOn('browser') +import 'dart:io'; +import 'package:flutter_test/flutter_test.dart'; +import 'package:get/get.dart'; + +void main() { + test('Platform test', () { + expect(GetPlatform.isAndroid, Platform.isAndroid); + expect(GetPlatform.isIOS, Platform.isIOS); + expect(GetPlatform.isFuchsia, Platform.isFuchsia); + expect(GetPlatform.isLinux, Platform.isLinux); + expect(GetPlatform.isMacOS, Platform.isMacOS); + expect(GetPlatform.isWindows, Platform.isWindows); + expect(GetPlatform.isWeb, true); + }); +} diff --git a/siro_rider/packages/get_storage/CHANGELOG.md b/siro_rider/packages/get_storage/CHANGELOG.md new file mode 100644 index 0000000..eed9e84 --- /dev/null +++ b/siro_rider/packages/get_storage/CHANGELOG.md @@ -0,0 +1,56 @@ +## [2.1.1] +- Fix null exception in previous getx versions + +## [2.1.0] +- Add support to Getx5 + +## [2.0.3] +- update to lastest getx + +## [2.0.2] +- update dependencies + +## [2.0.0] +- Null-safety support (@Ascenio) and fixes #49, #53 and #54 (@SquishyOctopus) + +## [1.4.0] +- Added failure recover backup + +## [1.3.2] +- Added compatibility with Getx 3.15.0 + +## [1.3.1] +- Added compatibility with Getx 3.10.2 + +## [1.3.0] +- Added ReadWriteValue + +## [1.2.0] +- Added writeInMemory and save methods + +## [1.1.4] +- Prevent spaces on database.gs + +## [1.1.3] +- Fix unnecessary imports + +## [1.1.2] +- Added Benchmarks + +## [1.1.1] +- Added Examples + +## [1.1.0] +- Added Container listeners + +## [1.0.3] +- Added repo + +## [1.0.2] +- Added docs + +## [1.0.1] +- Added docs + +## [1.0.0] +- Release to Get 3.0 diff --git a/siro_rider/packages/get_storage/LICENSE b/siro_rider/packages/get_storage/LICENSE new file mode 100644 index 0000000..2fb920b --- /dev/null +++ b/siro_rider/packages/get_storage/LICENSE @@ -0,0 +1,21 @@ +MIT License + +Copyright (c) 2019 Jonny Borges + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. \ No newline at end of file diff --git a/siro_rider/packages/get_storage/README.md b/siro_rider/packages/get_storage/README.md new file mode 100644 index 0000000..f18706d --- /dev/null +++ b/siro_rider/packages/get_storage/README.md @@ -0,0 +1,150 @@ +# get_storage +A fast, extra light and synchronous key-value in memory, which backs up data to disk at each operation. +It is written entirely in Dart and easily integrates with Get framework of Flutter. + +Supports Android, iOS, Web, Mac, Linux, and fuchsia and Windows**. +Can store String, int, double, Map and List + +### Add to your pubspec: +``` +dependencies: + get_storage: +``` +### Install it + +You can install packages from the command line: + +with `Flutter`: + +```css +$ flutter packages get +``` + +### Import it + +Now in your `Dart` code, you can use: + +````dart +import 'package:get_storage/get_storage.dart'; +```` + +### Initialize storage driver with await: +```dart +main() async { + await GetStorage.init(); + runApp(App()); +} +``` +#### use GetStorage through an instance or use directly `GetStorage().read('key')` +```dart +final box = GetStorage(); +``` +#### To write information you must use `write` : +```dart +box.write('quote', 'GetX is the best'); +``` + +#### To read values you use `read`: +```dart +print(box.read('quote')); +// out: GetX is the best + +``` +#### To remove a key, you can use `remove`: + +```dart +box.remove('quote'); +``` + +#### To listen changes you can use `listen`: +```dart +Function? disposeListen; +disposeListen = box.listen((){ + print('box changed'); +}); +``` +#### If you subscribe to events, be sure to dispose them when using: +```dart +disposeListen?.call(); +``` +#### To listen changes on key you can use `listenKey`: + +```dart +box.listenKey('key', (value){ + print('new key is $value'); +}); +``` + +#### To erase your container: +```dart +box.erase(); +``` + +#### If you want to create different containers, simply give it a name. You can listen to specific containers, and also delete them. + +```dart +GetStorage g = GetStorage('MyStorage'); +``` + +#### To initialize specific container: +```dart +await GetStorage.init('MyStorage'); +``` + +## SharedPreferences Implementation +```dart +class MyPref { + static final _otherBox = () => GetStorage('MyPref'); + + final username = ''.val('username'); + final age = 0.val('age'); + final price = 1000.val('price', getBox: _otherBox); + + // or + final username2 = ReadWriteValue('username', ''); + final age2 = ReadWriteValue('age', 0); + final price2 = ReadWriteValue('price', '', _otherBox); +} + +... + +void updateAge() { + final age = 0.val('age'); + // or + final age = ReadWriteValue('age', 0, () => box); + // or + final age = Get.find().age; + + age.val = 1; // will save to box + final realAge = age.val; // will read from box +} +``` + + +## Benchmark Result: +**GetStorage is not fast, it is absurdly fast for being memory-based. All of his operations are instantaneous. A backup of each operation is placed in a Container on the disk. Each container has its own file.** + +![](delete.png) +![](write.png) +![](read.png) + +## What GetStorage is: +Persistent key/value storage for Android, iOS, Web, Linux, Mac and Fuchsia and Windows, that combines fast memory access with persistent storage. +## What GetStorage is NOT: +A database. Get is super compact to offer you a solution ultra-light, high-speed read/write storage to work synchronously. If you want to store data persistently on disk with immediate memory access, use it, if you want a database, with indexing and specific disk storage tools, there are incredible solutions that are already available, like Hive and Sqflite/Moor. + + +As soon as you declare "write" the file is immediately written in memory and can now be accessed immediately with `box.read()`. You can also wait for the callback that it was written to disk using `await box.write()`. + +## When to use GetStorage: + - simple Maps storage. + - cache of http requests + - storage of simple user information. + - simple and persistent state storage + - any situation you currently use sharedPreferences. + +## When not to use GetStorage: + - you need indexes. + - when you need to always check if the file was written to the storage disk before starting another operation (storage in memory is done instantly and can be read instantly with box.read(), and the backup to disk is done in the background. To make sure the backup is complete, you can use await, but if you need to call await all the time, it makes no sense you are using memory storage). + +### You can use this lib even as a modest persistent state manager using Getx SimpleBuilder diff --git a/siro_rider/packages/get_storage/delete.png b/siro_rider/packages/get_storage/delete.png new file mode 100644 index 0000000..a25fe11 Binary files /dev/null and b/siro_rider/packages/get_storage/delete.png differ diff --git a/siro_rider/packages/get_storage/example/README.md b/siro_rider/packages/get_storage/example/README.md new file mode 100644 index 0000000..a135626 --- /dev/null +++ b/siro_rider/packages/get_storage/example/README.md @@ -0,0 +1,16 @@ +# example + +A new Flutter project. + +## Getting Started + +This project is a starting point for a Flutter application. + +A few resources to get you started if this is your first Flutter project: + +- [Lab: Write your first Flutter app](https://flutter.dev/docs/get-started/codelab) +- [Cookbook: Useful Flutter samples](https://flutter.dev/docs/cookbook) + +For help getting started with Flutter, view our +[online documentation](https://flutter.dev/docs), which offers tutorials, +samples, guidance on mobile development, and a full API reference. diff --git a/siro_rider/packages/get_storage/example/android/.gradle/6.1.1/fileChanges/last-build.bin b/siro_rider/packages/get_storage/example/android/.gradle/6.1.1/fileChanges/last-build.bin new file mode 100644 index 0000000..f76dd23 Binary files /dev/null and b/siro_rider/packages/get_storage/example/android/.gradle/6.1.1/fileChanges/last-build.bin differ diff --git a/siro_rider/packages/get_storage/example/android/.gradle/6.1.1/fileHashes/fileHashes.lock b/siro_rider/packages/get_storage/example/android/.gradle/6.1.1/fileHashes/fileHashes.lock new file mode 100644 index 0000000..f54fc7d Binary files /dev/null and b/siro_rider/packages/get_storage/example/android/.gradle/6.1.1/fileHashes/fileHashes.lock differ diff --git a/siro_rider/packages/get_storage/example/android/.gradle/6.1.1/gc.properties b/siro_rider/packages/get_storage/example/android/.gradle/6.1.1/gc.properties new file mode 100644 index 0000000..e69de29 diff --git a/siro_rider/packages/get_storage/example/android/.gradle/checksums/checksums.lock b/siro_rider/packages/get_storage/example/android/.gradle/checksums/checksums.lock new file mode 100644 index 0000000..b2809a8 Binary files /dev/null and b/siro_rider/packages/get_storage/example/android/.gradle/checksums/checksums.lock differ diff --git a/siro_rider/packages/get_storage/example/android/.gradle/vcs-1/gc.properties b/siro_rider/packages/get_storage/example/android/.gradle/vcs-1/gc.properties new file mode 100644 index 0000000..e69de29 diff --git a/siro_rider/packages/get_storage/example/android/app/build.gradle b/siro_rider/packages/get_storage/example/android/app/build.gradle new file mode 100644 index 0000000..6031a84 --- /dev/null +++ b/siro_rider/packages/get_storage/example/android/app/build.gradle @@ -0,0 +1,63 @@ +def localProperties = new Properties() +def localPropertiesFile = rootProject.file('local.properties') +if (localPropertiesFile.exists()) { + localPropertiesFile.withReader('UTF-8') { reader -> + localProperties.load(reader) + } +} + +def flutterRoot = localProperties.getProperty('flutter.sdk') +if (flutterRoot == null) { + throw new GradleException("Flutter SDK not found. Define location with flutter.sdk in the local.properties file.") +} + +def flutterVersionCode = localProperties.getProperty('flutter.versionCode') +if (flutterVersionCode == null) { + flutterVersionCode = '1' +} + +def flutterVersionName = localProperties.getProperty('flutter.versionName') +if (flutterVersionName == null) { + flutterVersionName = '1.0' +} + +apply plugin: 'com.android.application' +apply plugin: 'kotlin-android' +apply from: "$flutterRoot/packages/flutter_tools/gradle/flutter.gradle" + +android { + compileSdkVersion 29 + + sourceSets { + main.java.srcDirs += 'src/main/kotlin' + } + + lintOptions { + disable 'InvalidPackage' + } + + defaultConfig { + // TODO: Specify your own unique Application ID (https://developer.android.com/studio/build/application-id.html). + applicationId "com.example.example" + minSdkVersion 16 + targetSdkVersion 28 + versionCode flutterVersionCode.toInteger() + versionName flutterVersionName + } + + buildTypes { + release { + // TODO: Add your own signing config for the release build. + // Signing with the debug keys for now, so `flutter run --release` works. + signingConfig signingConfigs.debug + } + } +} + +flutter { + source '../..' +} + +dependencies { + implementation "org.jetbrains.kotlin:kotlin-stdlib-jdk7:$kotlin_version" +} diff --git a/siro_rider/packages/get_storage/example/android/app/src/debug/AndroidManifest.xml b/siro_rider/packages/get_storage/example/android/app/src/debug/AndroidManifest.xml new file mode 100644 index 0000000..c208884 --- /dev/null +++ b/siro_rider/packages/get_storage/example/android/app/src/debug/AndroidManifest.xml @@ -0,0 +1,7 @@ + + + + diff --git a/siro_rider/packages/get_storage/example/android/app/src/main/AndroidManifest.xml b/siro_rider/packages/get_storage/example/android/app/src/main/AndroidManifest.xml new file mode 100644 index 0000000..9b3997f --- /dev/null +++ b/siro_rider/packages/get_storage/example/android/app/src/main/AndroidManifest.xml @@ -0,0 +1,47 @@ + + + + + + + + + + + + + + + + + diff --git a/siro_rider/packages/get_storage/example/android/app/src/main/java/io/flutter/plugins/GeneratedPluginRegistrant.java b/siro_rider/packages/get_storage/example/android/app/src/main/java/io/flutter/plugins/GeneratedPluginRegistrant.java new file mode 100644 index 0000000..2cd5168 --- /dev/null +++ b/siro_rider/packages/get_storage/example/android/app/src/main/java/io/flutter/plugins/GeneratedPluginRegistrant.java @@ -0,0 +1,29 @@ +package io.flutter.plugins; + +import androidx.annotation.Keep; +import androidx.annotation.NonNull; +import io.flutter.Log; + +import io.flutter.embedding.engine.FlutterEngine; + +/** + * Generated file. Do not edit. + * This file is generated by the Flutter tool based on the + * plugins that support the Android platform. + */ +@Keep +public final class GeneratedPluginRegistrant { + private static final String TAG = "GeneratedPluginRegistrant"; + public static void registerWith(@NonNull FlutterEngine flutterEngine) { + try { + flutterEngine.getPlugins().add(new com.github.dart_lang.jni.JniPlugin()); + } catch (Exception e) { + Log.e(TAG, "Error registering plugin jni, com.github.dart_lang.jni.JniPlugin", e); + } + try { + flutterEngine.getPlugins().add(new com.github.dart_lang.jni_flutter.JniFlutterPlugin()); + } catch (Exception e) { + Log.e(TAG, "Error registering plugin jni_flutter, com.github.dart_lang.jni_flutter.JniFlutterPlugin", e); + } + } +} diff --git a/siro_rider/packages/get_storage/example/android/app/src/main/kotlin/com/example/example/MainActivity.kt b/siro_rider/packages/get_storage/example/android/app/src/main/kotlin/com/example/example/MainActivity.kt new file mode 100644 index 0000000..e793a00 --- /dev/null +++ b/siro_rider/packages/get_storage/example/android/app/src/main/kotlin/com/example/example/MainActivity.kt @@ -0,0 +1,6 @@ +package com.example.example + +import io.flutter.embedding.android.FlutterActivity + +class MainActivity: FlutterActivity() { +} diff --git a/siro_rider/packages/get_storage/example/android/app/src/main/res/drawable-v21/launch_background.xml b/siro_rider/packages/get_storage/example/android/app/src/main/res/drawable-v21/launch_background.xml new file mode 100644 index 0000000..f74085f --- /dev/null +++ b/siro_rider/packages/get_storage/example/android/app/src/main/res/drawable-v21/launch_background.xml @@ -0,0 +1,12 @@ + + + + + + + + diff --git a/siro_rider/packages/get_storage/example/android/app/src/main/res/drawable/launch_background.xml b/siro_rider/packages/get_storage/example/android/app/src/main/res/drawable/launch_background.xml new file mode 100644 index 0000000..304732f --- /dev/null +++ b/siro_rider/packages/get_storage/example/android/app/src/main/res/drawable/launch_background.xml @@ -0,0 +1,12 @@ + + + + + + + + diff --git a/siro_rider/packages/get_storage/example/android/app/src/main/res/mipmap-hdpi/ic_launcher.png b/siro_rider/packages/get_storage/example/android/app/src/main/res/mipmap-hdpi/ic_launcher.png new file mode 100644 index 0000000..db77bb4 Binary files /dev/null and b/siro_rider/packages/get_storage/example/android/app/src/main/res/mipmap-hdpi/ic_launcher.png differ diff --git a/siro_rider/packages/get_storage/example/android/app/src/main/res/mipmap-mdpi/ic_launcher.png b/siro_rider/packages/get_storage/example/android/app/src/main/res/mipmap-mdpi/ic_launcher.png new file mode 100644 index 0000000..17987b7 Binary files /dev/null and b/siro_rider/packages/get_storage/example/android/app/src/main/res/mipmap-mdpi/ic_launcher.png differ diff --git a/siro_rider/packages/get_storage/example/android/app/src/main/res/mipmap-xhdpi/ic_launcher.png b/siro_rider/packages/get_storage/example/android/app/src/main/res/mipmap-xhdpi/ic_launcher.png new file mode 100644 index 0000000..09d4391 Binary files /dev/null and b/siro_rider/packages/get_storage/example/android/app/src/main/res/mipmap-xhdpi/ic_launcher.png differ diff --git a/siro_rider/packages/get_storage/example/android/app/src/main/res/mipmap-xxhdpi/ic_launcher.png b/siro_rider/packages/get_storage/example/android/app/src/main/res/mipmap-xxhdpi/ic_launcher.png new file mode 100644 index 0000000..d5f1c8d Binary files /dev/null and b/siro_rider/packages/get_storage/example/android/app/src/main/res/mipmap-xxhdpi/ic_launcher.png differ diff --git a/siro_rider/packages/get_storage/example/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png b/siro_rider/packages/get_storage/example/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png new file mode 100644 index 0000000..4d6372e Binary files /dev/null and b/siro_rider/packages/get_storage/example/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png differ diff --git a/siro_rider/packages/get_storage/example/android/app/src/main/res/values-night/styles.xml b/siro_rider/packages/get_storage/example/android/app/src/main/res/values-night/styles.xml new file mode 100644 index 0000000..449a9f9 --- /dev/null +++ b/siro_rider/packages/get_storage/example/android/app/src/main/res/values-night/styles.xml @@ -0,0 +1,18 @@ + + + + + + + diff --git a/siro_rider/packages/get_storage/example/android/app/src/main/res/values/styles.xml b/siro_rider/packages/get_storage/example/android/app/src/main/res/values/styles.xml new file mode 100644 index 0000000..1f83a33 --- /dev/null +++ b/siro_rider/packages/get_storage/example/android/app/src/main/res/values/styles.xml @@ -0,0 +1,18 @@ + + + + + + + diff --git a/siro_rider/packages/get_storage/example/android/app/src/profile/AndroidManifest.xml b/siro_rider/packages/get_storage/example/android/app/src/profile/AndroidManifest.xml new file mode 100644 index 0000000..c208884 --- /dev/null +++ b/siro_rider/packages/get_storage/example/android/app/src/profile/AndroidManifest.xml @@ -0,0 +1,7 @@ + + + + diff --git a/siro_rider/packages/get_storage/example/android/build.gradle b/siro_rider/packages/get_storage/example/android/build.gradle new file mode 100644 index 0000000..ef0e637 --- /dev/null +++ b/siro_rider/packages/get_storage/example/android/build.gradle @@ -0,0 +1,31 @@ +buildscript { + ext.kotlin_version = '1.5.31' + repositories { + google() + jcenter() + } + + dependencies { + classpath 'com.android.tools.build:gradle:3.5.0' + classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version" + } +} + +allprojects { + repositories { + google() + jcenter() + } +} + +rootProject.buildDir = '../build' +subprojects { + project.buildDir = "${rootProject.buildDir}/${project.name}" +} +subprojects { + project.evaluationDependsOn(':app') +} + +task clean(type: Delete) { + delete rootProject.buildDir +} diff --git a/siro_rider/packages/get_storage/example/android/gradle.properties b/siro_rider/packages/get_storage/example/android/gradle.properties new file mode 100644 index 0000000..38c8d45 --- /dev/null +++ b/siro_rider/packages/get_storage/example/android/gradle.properties @@ -0,0 +1,4 @@ +org.gradle.jvmargs=-Xmx1536M +android.enableR8=true +android.useAndroidX=true +android.enableJetifier=true diff --git a/siro_rider/packages/get_storage/example/android/gradle/wrapper/gradle-wrapper.properties b/siro_rider/packages/get_storage/example/android/gradle/wrapper/gradle-wrapper.properties new file mode 100644 index 0000000..493072b --- /dev/null +++ b/siro_rider/packages/get_storage/example/android/gradle/wrapper/gradle-wrapper.properties @@ -0,0 +1,6 @@ +#Fri Jun 23 08:50:38 CEST 2017 +distributionBase=GRADLE_USER_HOME +distributionPath=wrapper/dists +zipStoreBase=GRADLE_USER_HOME +zipStorePath=wrapper/dists +distributionUrl=https\://services.gradle.org/distributions/gradle-6.1.1-all.zip diff --git a/siro_rider/packages/get_storage/example/android/local.properties b/siro_rider/packages/get_storage/example/android/local.properties new file mode 100644 index 0000000..6df17b3 --- /dev/null +++ b/siro_rider/packages/get_storage/example/android/local.properties @@ -0,0 +1,2 @@ +sdk.dir=/Users/hamzaaleghwairyeen/Library/Android/sdk +flutter.sdk=/Users/hamzaaleghwairyeen/flutter \ No newline at end of file diff --git a/siro_rider/packages/get_storage/example/android/settings.gradle b/siro_rider/packages/get_storage/example/android/settings.gradle new file mode 100644 index 0000000..d3b6a40 --- /dev/null +++ b/siro_rider/packages/get_storage/example/android/settings.gradle @@ -0,0 +1,15 @@ +// Copyright 2014 The Flutter Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +include ':app' + +def localPropertiesFile = new File(rootProject.projectDir, "local.properties") +def properties = new Properties() + +assert localPropertiesFile.exists() +localPropertiesFile.withReader("UTF-8") { reader -> properties.load(reader) } + +def flutterSdkPath = properties.getProperty("flutter.sdk") +assert flutterSdkPath != null, "flutter.sdk not set in local.properties" +apply from: "$flutterSdkPath/packages/flutter_tools/gradle/app_plugin_loader.gradle" diff --git a/siro_rider/packages/get_storage/example/ios/Flutter/AppFrameworkInfo.plist b/siro_rider/packages/get_storage/example/ios/Flutter/AppFrameworkInfo.plist new file mode 100644 index 0000000..f2872cf --- /dev/null +++ b/siro_rider/packages/get_storage/example/ios/Flutter/AppFrameworkInfo.plist @@ -0,0 +1,26 @@ + + + + + CFBundleDevelopmentRegion + $(DEVELOPMENT_LANGUAGE) + CFBundleExecutable + App + CFBundleIdentifier + io.flutter.flutter.app + CFBundleInfoDictionaryVersion + 6.0 + CFBundleName + App + CFBundlePackageType + FMWK + CFBundleShortVersionString + 1.0 + CFBundleSignature + ???? + CFBundleVersion + 1.0 + MinimumOSVersion + 9.0 + + diff --git a/siro_rider/packages/get_storage/example/ios/Flutter/Debug.xcconfig b/siro_rider/packages/get_storage/example/ios/Flutter/Debug.xcconfig new file mode 100644 index 0000000..ec97fc6 --- /dev/null +++ b/siro_rider/packages/get_storage/example/ios/Flutter/Debug.xcconfig @@ -0,0 +1,2 @@ +#include? "Pods/Target Support Files/Pods-Runner/Pods-Runner.debug.xcconfig" +#include "Generated.xcconfig" diff --git a/siro_rider/packages/get_storage/example/ios/Flutter/Generated.xcconfig b/siro_rider/packages/get_storage/example/ios/Flutter/Generated.xcconfig new file mode 100644 index 0000000..6acc705 --- /dev/null +++ b/siro_rider/packages/get_storage/example/ios/Flutter/Generated.xcconfig @@ -0,0 +1,14 @@ +// This is a generated file; do not edit or check into version control. +FLUTTER_ROOT=/Users/hamzaaleghwairyeen/flutter +FLUTTER_APPLICATION_PATH=/Users/hamzaaleghwairyeen/development/App/Intaleq/packages/get_storage/example +COCOAPODS_PARALLEL_CODE_SIGN=true +FLUTTER_TARGET=lib/main.dart +FLUTTER_BUILD_DIR=build +FLUTTER_BUILD_NAME=1.0.0 +FLUTTER_BUILD_NUMBER=1 +EXCLUDED_ARCHS[sdk=iphonesimulator*]=i386 +EXCLUDED_ARCHS[sdk=iphoneos*]=armv7 +DART_OBFUSCATION=false +TRACK_WIDGET_CREATION=true +TREE_SHAKE_ICONS=false +PACKAGE_CONFIG=.dart_tool/package_config.json diff --git a/siro_rider/packages/get_storage/example/ios/Flutter/Release.xcconfig b/siro_rider/packages/get_storage/example/ios/Flutter/Release.xcconfig new file mode 100644 index 0000000..c4855bf --- /dev/null +++ b/siro_rider/packages/get_storage/example/ios/Flutter/Release.xcconfig @@ -0,0 +1,2 @@ +#include? "Pods/Target Support Files/Pods-Runner/Pods-Runner.release.xcconfig" +#include "Generated.xcconfig" diff --git a/siro_rider/packages/get_storage/example/ios/Flutter/ephemeral/flutter_lldb_helper.py b/siro_rider/packages/get_storage/example/ios/Flutter/ephemeral/flutter_lldb_helper.py new file mode 100644 index 0000000..a88caf9 --- /dev/null +++ b/siro_rider/packages/get_storage/example/ios/Flutter/ephemeral/flutter_lldb_helper.py @@ -0,0 +1,32 @@ +# +# Generated file, do not edit. +# + +import lldb + +def handle_new_rx_page(frame: lldb.SBFrame, bp_loc, extra_args, intern_dict): + """Intercept NOTIFY_DEBUGGER_ABOUT_RX_PAGES and touch the pages.""" + base = frame.register["x0"].GetValueAsAddress() + page_len = frame.register["x1"].GetValueAsUnsigned() + + # Note: NOTIFY_DEBUGGER_ABOUT_RX_PAGES will check contents of the + # first page to see if handled it correctly. This makes diagnosing + # misconfiguration (e.g. missing breakpoint) easier. + data = bytearray(page_len) + data[0:8] = b'IHELPED!' + + error = lldb.SBError() + frame.GetThread().GetProcess().WriteMemory(base, data, error) + if not error.Success(): + print(f'Failed to write into {base}[+{page_len}]', error) + return + +def __lldb_init_module(debugger: lldb.SBDebugger, _): + target = debugger.GetDummyTarget() + # Caveat: must use BreakpointCreateByRegEx here and not + # BreakpointCreateByName. For some reasons callback function does not + # get carried over from dummy target for the later. + bp = target.BreakpointCreateByRegex("^NOTIFY_DEBUGGER_ABOUT_RX_PAGES$") + bp.SetScriptCallbackFunction('{}.handle_new_rx_page'.format(__name__)) + bp.SetAutoContinue(True) + print("-- LLDB integration loaded --") diff --git a/siro_rider/packages/get_storage/example/ios/Flutter/ephemeral/flutter_lldbinit b/siro_rider/packages/get_storage/example/ios/Flutter/ephemeral/flutter_lldbinit new file mode 100644 index 0000000..e3ba6fb --- /dev/null +++ b/siro_rider/packages/get_storage/example/ios/Flutter/ephemeral/flutter_lldbinit @@ -0,0 +1,5 @@ +# +# Generated file, do not edit. +# + +command script import --relative-to-command-file flutter_lldb_helper.py diff --git a/siro_rider/packages/get_storage/example/ios/Flutter/flutter_export_environment.sh b/siro_rider/packages/get_storage/example/ios/Flutter/flutter_export_environment.sh new file mode 100755 index 0000000..f000a52 --- /dev/null +++ b/siro_rider/packages/get_storage/example/ios/Flutter/flutter_export_environment.sh @@ -0,0 +1,13 @@ +#!/bin/sh +# This is a generated file; do not edit or check into version control. +export "FLUTTER_ROOT=/Users/hamzaaleghwairyeen/flutter" +export "FLUTTER_APPLICATION_PATH=/Users/hamzaaleghwairyeen/development/App/Intaleq/packages/get_storage/example" +export "COCOAPODS_PARALLEL_CODE_SIGN=true" +export "FLUTTER_TARGET=lib/main.dart" +export "FLUTTER_BUILD_DIR=build" +export "FLUTTER_BUILD_NAME=1.0.0" +export "FLUTTER_BUILD_NUMBER=1" +export "DART_OBFUSCATION=false" +export "TRACK_WIDGET_CREATION=true" +export "TREE_SHAKE_ICONS=false" +export "PACKAGE_CONFIG=.dart_tool/package_config.json" diff --git a/siro_rider/packages/get_storage/example/ios/Podfile b/siro_rider/packages/get_storage/example/ios/Podfile new file mode 100644 index 0000000..1e8c3c9 --- /dev/null +++ b/siro_rider/packages/get_storage/example/ios/Podfile @@ -0,0 +1,41 @@ +# Uncomment this line to define a global platform for your project +# platform :ios, '9.0' + +# CocoaPods analytics sends network stats synchronously affecting flutter build latency. +ENV['COCOAPODS_DISABLE_STATS'] = 'true' + +project 'Runner', { + 'Debug' => :debug, + 'Profile' => :release, + 'Release' => :release, +} + +def flutter_root + generated_xcode_build_settings_path = File.expand_path(File.join('..', 'Flutter', 'Generated.xcconfig'), __FILE__) + unless File.exist?(generated_xcode_build_settings_path) + raise "#{generated_xcode_build_settings_path} must exist. If you're running pod install manually, make sure flutter pub get is executed first" + end + + File.foreach(generated_xcode_build_settings_path) do |line| + matches = line.match(/FLUTTER_ROOT\=(.*)/) + return matches[1].strip if matches + end + raise "FLUTTER_ROOT not found in #{generated_xcode_build_settings_path}. Try deleting Generated.xcconfig, then run flutter pub get" +end + +require File.expand_path(File.join('packages', 'flutter_tools', 'bin', 'podhelper'), flutter_root) + +flutter_ios_podfile_setup + +target 'Runner' do + use_frameworks! + use_modular_headers! + + flutter_install_all_ios_pods File.dirname(File.realpath(__FILE__)) +end + +post_install do |installer| + installer.pods_project.targets.each do |target| + flutter_additional_ios_build_settings(target) + end +end diff --git a/siro_rider/packages/get_storage/example/ios/Runner.xcodeproj/project.pbxproj b/siro_rider/packages/get_storage/example/ios/Runner.xcodeproj/project.pbxproj new file mode 100644 index 0000000..39575e7 --- /dev/null +++ b/siro_rider/packages/get_storage/example/ios/Runner.xcodeproj/project.pbxproj @@ -0,0 +1,572 @@ +// !$*UTF8*$! +{ + archiveVersion = 1; + classes = { + }; + objectVersion = 50; + objects = { + +/* Begin PBXBuildFile section */ + 1498D2341E8E89220040F4C2 /* GeneratedPluginRegistrant.m in Sources */ = {isa = PBXBuildFile; fileRef = 1498D2331E8E89220040F4C2 /* GeneratedPluginRegistrant.m */; }; + 3B3967161E833CAA004F5970 /* AppFrameworkInfo.plist in Resources */ = {isa = PBXBuildFile; fileRef = 3B3967151E833CAA004F5970 /* AppFrameworkInfo.plist */; }; + 74858FAF1ED2DC5600515810 /* AppDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 74858FAE1ED2DC5600515810 /* AppDelegate.swift */; }; + 90C8CA11664104231EBF058B /* Pods_Runner.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 18DA700F16353353DA3C7916 /* Pods_Runner.framework */; }; + 97C146FC1CF9000F007C117D /* Main.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 97C146FA1CF9000F007C117D /* Main.storyboard */; }; + 97C146FE1CF9000F007C117D /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 97C146FD1CF9000F007C117D /* Assets.xcassets */; }; + 97C147011CF9000F007C117D /* LaunchScreen.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 97C146FF1CF9000F007C117D /* LaunchScreen.storyboard */; }; +/* End PBXBuildFile section */ + +/* Begin PBXCopyFilesBuildPhase section */ + 9705A1C41CF9048500538489 /* Embed Frameworks */ = { + isa = PBXCopyFilesBuildPhase; + buildActionMask = 2147483647; + dstPath = ""; + dstSubfolderSpec = 10; + files = ( + ); + name = "Embed Frameworks"; + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXCopyFilesBuildPhase section */ + +/* Begin PBXFileReference section */ + 05CD1F04EF1634A640503302 /* Pods-Runner.profile.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.profile.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.profile.xcconfig"; sourceTree = ""; }; + 1498D2321E8E86230040F4C2 /* GeneratedPluginRegistrant.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = GeneratedPluginRegistrant.h; sourceTree = ""; }; + 1498D2331E8E89220040F4C2 /* GeneratedPluginRegistrant.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = GeneratedPluginRegistrant.m; sourceTree = ""; }; + 18DA700F16353353DA3C7916 /* Pods_Runner.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_Runner.framework; sourceTree = BUILT_PRODUCTS_DIR; }; + 3B3967151E833CAA004F5970 /* AppFrameworkInfo.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; name = AppFrameworkInfo.plist; path = Flutter/AppFrameworkInfo.plist; sourceTree = ""; }; + 74858FAD1ED2DC5600515810 /* Runner-Bridging-Header.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = "Runner-Bridging-Header.h"; sourceTree = ""; }; + 74858FAE1ED2DC5600515810 /* AppDelegate.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = AppDelegate.swift; sourceTree = ""; }; + 7AFA3C8E1D35360C0083082E /* Release.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; name = Release.xcconfig; path = Flutter/Release.xcconfig; sourceTree = ""; }; + 9740EEB21CF90195004384FC /* Debug.xcconfig */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xcconfig; name = Debug.xcconfig; path = Flutter/Debug.xcconfig; sourceTree = ""; }; + 9740EEB31CF90195004384FC /* Generated.xcconfig */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xcconfig; name = Generated.xcconfig; path = Flutter/Generated.xcconfig; sourceTree = ""; }; + 97C146EE1CF9000F007C117D /* Runner.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = Runner.app; sourceTree = BUILT_PRODUCTS_DIR; }; + 97C146FB1CF9000F007C117D /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/Main.storyboard; sourceTree = ""; }; + 97C146FD1CF9000F007C117D /* Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Assets.xcassets; sourceTree = ""; }; + 97C147001CF9000F007C117D /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/LaunchScreen.storyboard; sourceTree = ""; }; + 97C147021CF9000F007C117D /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; + A3526A2879E1484016D19ACD /* Pods-Runner.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.release.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.release.xcconfig"; sourceTree = ""; }; + E89672F728408C9FB2C1B5AA /* Pods-Runner.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.debug.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.debug.xcconfig"; sourceTree = ""; }; +/* End PBXFileReference section */ + +/* Begin PBXFrameworksBuildPhase section */ + 97C146EB1CF9000F007C117D /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( + 90C8CA11664104231EBF058B /* Pods_Runner.framework in Frameworks */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXFrameworksBuildPhase section */ + +/* Begin PBXGroup section */ + 27DEC084327553058AA8B3EF /* Pods */ = { + isa = PBXGroup; + children = ( + E89672F728408C9FB2C1B5AA /* Pods-Runner.debug.xcconfig */, + A3526A2879E1484016D19ACD /* Pods-Runner.release.xcconfig */, + 05CD1F04EF1634A640503302 /* Pods-Runner.profile.xcconfig */, + ); + name = Pods; + path = Pods; + sourceTree = ""; + }; + 5D6250DB7CC8CBEA27CEE68B /* Frameworks */ = { + isa = PBXGroup; + children = ( + 18DA700F16353353DA3C7916 /* Pods_Runner.framework */, + ); + name = Frameworks; + sourceTree = ""; + }; + 9740EEB11CF90186004384FC /* Flutter */ = { + isa = PBXGroup; + children = ( + 3B3967151E833CAA004F5970 /* AppFrameworkInfo.plist */, + 9740EEB21CF90195004384FC /* Debug.xcconfig */, + 7AFA3C8E1D35360C0083082E /* Release.xcconfig */, + 9740EEB31CF90195004384FC /* Generated.xcconfig */, + ); + name = Flutter; + sourceTree = ""; + }; + 97C146E51CF9000F007C117D = { + isa = PBXGroup; + children = ( + 9740EEB11CF90186004384FC /* Flutter */, + 97C146F01CF9000F007C117D /* Runner */, + 97C146EF1CF9000F007C117D /* Products */, + 27DEC084327553058AA8B3EF /* Pods */, + 5D6250DB7CC8CBEA27CEE68B /* Frameworks */, + ); + sourceTree = ""; + }; + 97C146EF1CF9000F007C117D /* Products */ = { + isa = PBXGroup; + children = ( + 97C146EE1CF9000F007C117D /* Runner.app */, + ); + name = Products; + sourceTree = ""; + }; + 97C146F01CF9000F007C117D /* Runner */ = { + isa = PBXGroup; + children = ( + 97C146FA1CF9000F007C117D /* Main.storyboard */, + 97C146FD1CF9000F007C117D /* Assets.xcassets */, + 97C146FF1CF9000F007C117D /* LaunchScreen.storyboard */, + 97C147021CF9000F007C117D /* Info.plist */, + 1498D2321E8E86230040F4C2 /* GeneratedPluginRegistrant.h */, + 1498D2331E8E89220040F4C2 /* GeneratedPluginRegistrant.m */, + 74858FAE1ED2DC5600515810 /* AppDelegate.swift */, + 74858FAD1ED2DC5600515810 /* Runner-Bridging-Header.h */, + ); + path = Runner; + sourceTree = ""; + }; +/* End PBXGroup section */ + +/* Begin PBXNativeTarget section */ + 97C146ED1CF9000F007C117D /* Runner */ = { + isa = PBXNativeTarget; + buildConfigurationList = 97C147051CF9000F007C117D /* Build configuration list for PBXNativeTarget "Runner" */; + buildPhases = ( + B01CACE13F72DB463F07D94B /* [CP] Check Pods Manifest.lock */, + 9740EEB61CF901F6004384FC /* Run Script */, + 97C146EA1CF9000F007C117D /* Sources */, + 97C146EB1CF9000F007C117D /* Frameworks */, + 97C146EC1CF9000F007C117D /* Resources */, + 9705A1C41CF9048500538489 /* Embed Frameworks */, + 3B06AD1E1E4923F5004D2608 /* Thin Binary */, + 7C36DDEFFD452993A2546264 /* [CP] Embed Pods Frameworks */, + ); + buildRules = ( + ); + dependencies = ( + ); + name = Runner; + productName = Runner; + productReference = 97C146EE1CF9000F007C117D /* Runner.app */; + productType = "com.apple.product-type.application"; + }; +/* End PBXNativeTarget section */ + +/* Begin PBXProject section */ + 97C146E61CF9000F007C117D /* Project object */ = { + isa = PBXProject; + attributes = { + LastUpgradeCheck = 1300; + ORGANIZATIONNAME = ""; + TargetAttributes = { + 97C146ED1CF9000F007C117D = { + CreatedOnToolsVersion = 7.3.1; + LastSwiftMigration = 1100; + }; + }; + }; + buildConfigurationList = 97C146E91CF9000F007C117D /* Build configuration list for PBXProject "Runner" */; + compatibilityVersion = "Xcode 9.3"; + developmentRegion = en; + hasScannedForEncodings = 0; + knownRegions = ( + en, + Base, + ); + mainGroup = 97C146E51CF9000F007C117D; + productRefGroup = 97C146EF1CF9000F007C117D /* Products */; + projectDirPath = ""; + projectRoot = ""; + targets = ( + 97C146ED1CF9000F007C117D /* Runner */, + ); + }; +/* End PBXProject section */ + +/* Begin PBXResourcesBuildPhase section */ + 97C146EC1CF9000F007C117D /* Resources */ = { + isa = PBXResourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + 97C147011CF9000F007C117D /* LaunchScreen.storyboard in Resources */, + 3B3967161E833CAA004F5970 /* AppFrameworkInfo.plist in Resources */, + 97C146FE1CF9000F007C117D /* Assets.xcassets in Resources */, + 97C146FC1CF9000F007C117D /* Main.storyboard in Resources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXResourcesBuildPhase section */ + +/* Begin PBXShellScriptBuildPhase section */ + 3B06AD1E1E4923F5004D2608 /* Thin Binary */ = { + isa = PBXShellScriptBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + inputPaths = ( + ); + name = "Thin Binary"; + outputPaths = ( + ); + runOnlyForDeploymentPostprocessing = 0; + shellPath = /bin/sh; + shellScript = "/bin/sh \"$FLUTTER_ROOT/packages/flutter_tools/bin/xcode_backend.sh\" embed_and_thin"; + }; + 7C36DDEFFD452993A2546264 /* [CP] Embed Pods Frameworks */ = { + isa = PBXShellScriptBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + inputFileListPaths = ( + "${PODS_ROOT}/Target Support Files/Pods-Runner/Pods-Runner-frameworks-${CONFIGURATION}-input-files.xcfilelist", + ); + name = "[CP] Embed Pods Frameworks"; + outputFileListPaths = ( + "${PODS_ROOT}/Target Support Files/Pods-Runner/Pods-Runner-frameworks-${CONFIGURATION}-output-files.xcfilelist", + ); + runOnlyForDeploymentPostprocessing = 0; + shellPath = /bin/sh; + shellScript = "\"${PODS_ROOT}/Target Support Files/Pods-Runner/Pods-Runner-frameworks.sh\"\n"; + showEnvVarsInLog = 0; + }; + 9740EEB61CF901F6004384FC /* Run Script */ = { + isa = PBXShellScriptBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + inputPaths = ( + ); + name = "Run Script"; + outputPaths = ( + ); + runOnlyForDeploymentPostprocessing = 0; + shellPath = /bin/sh; + shellScript = "/bin/sh \"$FLUTTER_ROOT/packages/flutter_tools/bin/xcode_backend.sh\" build"; + }; + B01CACE13F72DB463F07D94B /* [CP] Check Pods Manifest.lock */ = { + isa = PBXShellScriptBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + inputFileListPaths = ( + ); + inputPaths = ( + "${PODS_PODFILE_DIR_PATH}/Podfile.lock", + "${PODS_ROOT}/Manifest.lock", + ); + name = "[CP] Check Pods Manifest.lock"; + outputFileListPaths = ( + ); + outputPaths = ( + "$(DERIVED_FILE_DIR)/Pods-Runner-checkManifestLockResult.txt", + ); + runOnlyForDeploymentPostprocessing = 0; + shellPath = /bin/sh; + shellScript = "diff \"${PODS_PODFILE_DIR_PATH}/Podfile.lock\" \"${PODS_ROOT}/Manifest.lock\" > /dev/null\nif [ $? != 0 ] ; then\n # print error to STDERR\n echo \"error: The sandbox is not in sync with the Podfile.lock. Run 'pod install' or update your CocoaPods installation.\" >&2\n exit 1\nfi\n# This output is used by Xcode 'outputs' to avoid re-running this script phase.\necho \"SUCCESS\" > \"${SCRIPT_OUTPUT_FILE_0}\"\n"; + showEnvVarsInLog = 0; + }; +/* End PBXShellScriptBuildPhase section */ + +/* Begin PBXSourcesBuildPhase section */ + 97C146EA1CF9000F007C117D /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + 74858FAF1ED2DC5600515810 /* AppDelegate.swift in Sources */, + 1498D2341E8E89220040F4C2 /* GeneratedPluginRegistrant.m in Sources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXSourcesBuildPhase section */ + +/* Begin PBXVariantGroup section */ + 97C146FA1CF9000F007C117D /* Main.storyboard */ = { + isa = PBXVariantGroup; + children = ( + 97C146FB1CF9000F007C117D /* Base */, + ); + name = Main.storyboard; + sourceTree = ""; + }; + 97C146FF1CF9000F007C117D /* LaunchScreen.storyboard */ = { + isa = PBXVariantGroup; + children = ( + 97C147001CF9000F007C117D /* Base */, + ); + name = LaunchScreen.storyboard; + sourceTree = ""; + }; +/* End PBXVariantGroup section */ + +/* Begin XCBuildConfiguration section */ + 249021D3217E4FDB00AE95B9 /* Profile */ = { + isa = XCBuildConfiguration; + buildSettings = { + ALWAYS_SEARCH_USER_PATHS = NO; + CLANG_ANALYZER_NONNULL = YES; + CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; + CLANG_CXX_LIBRARY = "libc++"; + CLANG_ENABLE_MODULES = YES; + CLANG_ENABLE_OBJC_ARC = YES; + CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; + CLANG_WARN_BOOL_CONVERSION = YES; + CLANG_WARN_COMMA = YES; + CLANG_WARN_CONSTANT_CONVERSION = YES; + CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; + CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; + CLANG_WARN_EMPTY_BODY = YES; + CLANG_WARN_ENUM_CONVERSION = YES; + CLANG_WARN_INFINITE_RECURSION = YES; + CLANG_WARN_INT_CONVERSION = YES; + CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; + CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; + CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; + CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; + CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; + CLANG_WARN_STRICT_PROTOTYPES = YES; + CLANG_WARN_SUSPICIOUS_MOVE = YES; + CLANG_WARN_UNREACHABLE_CODE = YES; + CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; + "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; + COPY_PHASE_STRIP = NO; + DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; + ENABLE_NS_ASSERTIONS = NO; + ENABLE_STRICT_OBJC_MSGSEND = YES; + GCC_C_LANGUAGE_STANDARD = gnu99; + GCC_NO_COMMON_BLOCKS = YES; + GCC_WARN_64_TO_32_BIT_CONVERSION = YES; + GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; + GCC_WARN_UNDECLARED_SELECTOR = YES; + GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; + GCC_WARN_UNUSED_FUNCTION = YES; + GCC_WARN_UNUSED_VARIABLE = YES; + IPHONEOS_DEPLOYMENT_TARGET = 9.0; + MTL_ENABLE_DEBUG_INFO = NO; + SDKROOT = iphoneos; + SUPPORTED_PLATFORMS = iphoneos; + TARGETED_DEVICE_FAMILY = "1,2"; + VALIDATE_PRODUCT = YES; + }; + name = Profile; + }; + 249021D4217E4FDB00AE95B9 /* Profile */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = 7AFA3C8E1D35360C0083082E /* Release.xcconfig */; + buildSettings = { + ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; + CLANG_ENABLE_MODULES = YES; + CURRENT_PROJECT_VERSION = "$(FLUTTER_BUILD_NUMBER)"; + ENABLE_BITCODE = NO; + FRAMEWORK_SEARCH_PATHS = ( + "$(inherited)", + "$(PROJECT_DIR)/Flutter", + ); + INFOPLIST_FILE = Runner/Info.plist; + LD_RUNPATH_SEARCH_PATHS = ( + "$(inherited)", + "@executable_path/Frameworks", + ); + LIBRARY_SEARCH_PATHS = ( + "$(inherited)", + "$(PROJECT_DIR)/Flutter", + ); + PRODUCT_BUNDLE_IDENTIFIER = com.example.example; + PRODUCT_NAME = "$(TARGET_NAME)"; + SWIFT_OBJC_BRIDGING_HEADER = "Runner/Runner-Bridging-Header.h"; + SWIFT_VERSION = 5.0; + VERSIONING_SYSTEM = "apple-generic"; + }; + name = Profile; + }; + 97C147031CF9000F007C117D /* Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + ALWAYS_SEARCH_USER_PATHS = NO; + CLANG_ANALYZER_NONNULL = YES; + CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; + CLANG_CXX_LIBRARY = "libc++"; + CLANG_ENABLE_MODULES = YES; + CLANG_ENABLE_OBJC_ARC = YES; + CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; + CLANG_WARN_BOOL_CONVERSION = YES; + CLANG_WARN_COMMA = YES; + CLANG_WARN_CONSTANT_CONVERSION = YES; + CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; + CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; + CLANG_WARN_EMPTY_BODY = YES; + CLANG_WARN_ENUM_CONVERSION = YES; + CLANG_WARN_INFINITE_RECURSION = YES; + CLANG_WARN_INT_CONVERSION = YES; + CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; + CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; + CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; + CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; + CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; + CLANG_WARN_STRICT_PROTOTYPES = YES; + CLANG_WARN_SUSPICIOUS_MOVE = YES; + CLANG_WARN_UNREACHABLE_CODE = YES; + CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; + "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; + COPY_PHASE_STRIP = NO; + DEBUG_INFORMATION_FORMAT = dwarf; + ENABLE_STRICT_OBJC_MSGSEND = YES; + ENABLE_TESTABILITY = YES; + GCC_C_LANGUAGE_STANDARD = gnu99; + GCC_DYNAMIC_NO_PIC = NO; + GCC_NO_COMMON_BLOCKS = YES; + GCC_OPTIMIZATION_LEVEL = 0; + GCC_PREPROCESSOR_DEFINITIONS = ( + "DEBUG=1", + "$(inherited)", + ); + GCC_WARN_64_TO_32_BIT_CONVERSION = YES; + GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; + GCC_WARN_UNDECLARED_SELECTOR = YES; + GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; + GCC_WARN_UNUSED_FUNCTION = YES; + GCC_WARN_UNUSED_VARIABLE = YES; + IPHONEOS_DEPLOYMENT_TARGET = 9.0; + MTL_ENABLE_DEBUG_INFO = YES; + ONLY_ACTIVE_ARCH = YES; + SDKROOT = iphoneos; + TARGETED_DEVICE_FAMILY = "1,2"; + }; + name = Debug; + }; + 97C147041CF9000F007C117D /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + ALWAYS_SEARCH_USER_PATHS = NO; + CLANG_ANALYZER_NONNULL = YES; + CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; + CLANG_CXX_LIBRARY = "libc++"; + CLANG_ENABLE_MODULES = YES; + CLANG_ENABLE_OBJC_ARC = YES; + CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; + CLANG_WARN_BOOL_CONVERSION = YES; + CLANG_WARN_COMMA = YES; + CLANG_WARN_CONSTANT_CONVERSION = YES; + CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; + CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; + CLANG_WARN_EMPTY_BODY = YES; + CLANG_WARN_ENUM_CONVERSION = YES; + CLANG_WARN_INFINITE_RECURSION = YES; + CLANG_WARN_INT_CONVERSION = YES; + CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; + CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; + CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; + CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; + CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; + CLANG_WARN_STRICT_PROTOTYPES = YES; + CLANG_WARN_SUSPICIOUS_MOVE = YES; + CLANG_WARN_UNREACHABLE_CODE = YES; + CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; + "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; + COPY_PHASE_STRIP = NO; + DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; + ENABLE_NS_ASSERTIONS = NO; + ENABLE_STRICT_OBJC_MSGSEND = YES; + GCC_C_LANGUAGE_STANDARD = gnu99; + GCC_NO_COMMON_BLOCKS = YES; + GCC_WARN_64_TO_32_BIT_CONVERSION = YES; + GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; + GCC_WARN_UNDECLARED_SELECTOR = YES; + GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; + GCC_WARN_UNUSED_FUNCTION = YES; + GCC_WARN_UNUSED_VARIABLE = YES; + IPHONEOS_DEPLOYMENT_TARGET = 9.0; + MTL_ENABLE_DEBUG_INFO = NO; + SDKROOT = iphoneos; + SUPPORTED_PLATFORMS = iphoneos; + SWIFT_OPTIMIZATION_LEVEL = "-Owholemodule"; + TARGETED_DEVICE_FAMILY = "1,2"; + VALIDATE_PRODUCT = YES; + }; + name = Release; + }; + 97C147061CF9000F007C117D /* Debug */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = 9740EEB21CF90195004384FC /* Debug.xcconfig */; + buildSettings = { + ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; + CLANG_ENABLE_MODULES = YES; + CURRENT_PROJECT_VERSION = "$(FLUTTER_BUILD_NUMBER)"; + ENABLE_BITCODE = NO; + FRAMEWORK_SEARCH_PATHS = ( + "$(inherited)", + "$(PROJECT_DIR)/Flutter", + ); + INFOPLIST_FILE = Runner/Info.plist; + LD_RUNPATH_SEARCH_PATHS = ( + "$(inherited)", + "@executable_path/Frameworks", + ); + LIBRARY_SEARCH_PATHS = ( + "$(inherited)", + "$(PROJECT_DIR)/Flutter", + ); + PRODUCT_BUNDLE_IDENTIFIER = com.example.example; + PRODUCT_NAME = "$(TARGET_NAME)"; + SWIFT_OBJC_BRIDGING_HEADER = "Runner/Runner-Bridging-Header.h"; + SWIFT_OPTIMIZATION_LEVEL = "-Onone"; + SWIFT_VERSION = 5.0; + VERSIONING_SYSTEM = "apple-generic"; + }; + name = Debug; + }; + 97C147071CF9000F007C117D /* Release */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = 7AFA3C8E1D35360C0083082E /* Release.xcconfig */; + buildSettings = { + ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; + CLANG_ENABLE_MODULES = YES; + CURRENT_PROJECT_VERSION = "$(FLUTTER_BUILD_NUMBER)"; + ENABLE_BITCODE = NO; + FRAMEWORK_SEARCH_PATHS = ( + "$(inherited)", + "$(PROJECT_DIR)/Flutter", + ); + INFOPLIST_FILE = Runner/Info.plist; + LD_RUNPATH_SEARCH_PATHS = ( + "$(inherited)", + "@executable_path/Frameworks", + ); + LIBRARY_SEARCH_PATHS = ( + "$(inherited)", + "$(PROJECT_DIR)/Flutter", + ); + PRODUCT_BUNDLE_IDENTIFIER = com.example.example; + PRODUCT_NAME = "$(TARGET_NAME)"; + SWIFT_OBJC_BRIDGING_HEADER = "Runner/Runner-Bridging-Header.h"; + SWIFT_VERSION = 5.0; + VERSIONING_SYSTEM = "apple-generic"; + }; + name = Release; + }; +/* End XCBuildConfiguration section */ + +/* Begin XCConfigurationList section */ + 97C146E91CF9000F007C117D /* Build configuration list for PBXProject "Runner" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 97C147031CF9000F007C117D /* Debug */, + 97C147041CF9000F007C117D /* Release */, + 249021D3217E4FDB00AE95B9 /* Profile */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; + 97C147051CF9000F007C117D /* Build configuration list for PBXNativeTarget "Runner" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 97C147061CF9000F007C117D /* Debug */, + 97C147071CF9000F007C117D /* Release */, + 249021D4217E4FDB00AE95B9 /* Profile */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; +/* End XCConfigurationList section */ + }; + rootObject = 97C146E61CF9000F007C117D /* Project object */; +} diff --git a/siro_rider/packages/get_storage/example/ios/Runner.xcodeproj/project.xcworkspace/contents.xcworkspacedata b/siro_rider/packages/get_storage/example/ios/Runner.xcodeproj/project.xcworkspace/contents.xcworkspacedata new file mode 100644 index 0000000..919434a --- /dev/null +++ b/siro_rider/packages/get_storage/example/ios/Runner.xcodeproj/project.xcworkspace/contents.xcworkspacedata @@ -0,0 +1,7 @@ + + + + + diff --git a/siro_rider/packages/get_storage/example/ios/Runner.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist b/siro_rider/packages/get_storage/example/ios/Runner.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist new file mode 100644 index 0000000..18d9810 --- /dev/null +++ b/siro_rider/packages/get_storage/example/ios/Runner.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist @@ -0,0 +1,8 @@ + + + + + IDEDidComputeMac32BitWarning + + + diff --git a/siro_rider/packages/get_storage/example/ios/Runner.xcodeproj/project.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings b/siro_rider/packages/get_storage/example/ios/Runner.xcodeproj/project.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings new file mode 100644 index 0000000..f9b0d7c --- /dev/null +++ b/siro_rider/packages/get_storage/example/ios/Runner.xcodeproj/project.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings @@ -0,0 +1,8 @@ + + + + + PreviewsEnabled + + + diff --git a/siro_rider/packages/get_storage/example/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme b/siro_rider/packages/get_storage/example/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme new file mode 100644 index 0000000..3db53b6 --- /dev/null +++ b/siro_rider/packages/get_storage/example/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme @@ -0,0 +1,91 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/siro_rider/packages/get_storage/example/ios/Runner.xcworkspace/contents.xcworkspacedata b/siro_rider/packages/get_storage/example/ios/Runner.xcworkspace/contents.xcworkspacedata new file mode 100644 index 0000000..21a3cc1 --- /dev/null +++ b/siro_rider/packages/get_storage/example/ios/Runner.xcworkspace/contents.xcworkspacedata @@ -0,0 +1,10 @@ + + + + + + + diff --git a/siro_rider/packages/get_storage/example/ios/Runner.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist b/siro_rider/packages/get_storage/example/ios/Runner.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist new file mode 100644 index 0000000..18d9810 --- /dev/null +++ b/siro_rider/packages/get_storage/example/ios/Runner.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist @@ -0,0 +1,8 @@ + + + + + IDEDidComputeMac32BitWarning + + + diff --git a/siro_rider/packages/get_storage/example/ios/Runner.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings b/siro_rider/packages/get_storage/example/ios/Runner.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings new file mode 100644 index 0000000..f9b0d7c --- /dev/null +++ b/siro_rider/packages/get_storage/example/ios/Runner.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings @@ -0,0 +1,8 @@ + + + + + PreviewsEnabled + + + diff --git a/siro_rider/packages/get_storage/example/ios/Runner/AppDelegate.swift b/siro_rider/packages/get_storage/example/ios/Runner/AppDelegate.swift new file mode 100644 index 0000000..70693e4 --- /dev/null +++ b/siro_rider/packages/get_storage/example/ios/Runner/AppDelegate.swift @@ -0,0 +1,13 @@ +import UIKit +import Flutter + +@UIApplicationMain +@objc class AppDelegate: FlutterAppDelegate { + override func application( + _ application: UIApplication, + didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]? + ) -> Bool { + GeneratedPluginRegistrant.register(with: self) + return super.application(application, didFinishLaunchingWithOptions: launchOptions) + } +} diff --git a/siro_rider/packages/get_storage/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Contents.json b/siro_rider/packages/get_storage/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Contents.json new file mode 100644 index 0000000..d36b1fa --- /dev/null +++ b/siro_rider/packages/get_storage/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Contents.json @@ -0,0 +1,122 @@ +{ + "images" : [ + { + "size" : "20x20", + "idiom" : "iphone", + "filename" : "Icon-App-20x20@2x.png", + "scale" : "2x" + }, + { + "size" : "20x20", + "idiom" : "iphone", + "filename" : "Icon-App-20x20@3x.png", + "scale" : "3x" + }, + { + "size" : "29x29", + "idiom" : "iphone", + "filename" : "Icon-App-29x29@1x.png", + "scale" : "1x" + }, + { + "size" : "29x29", + "idiom" : "iphone", + "filename" : "Icon-App-29x29@2x.png", + "scale" : "2x" + }, + { + "size" : "29x29", + "idiom" : "iphone", + "filename" : "Icon-App-29x29@3x.png", + "scale" : "3x" + }, + { + "size" : "40x40", + "idiom" : "iphone", + "filename" : "Icon-App-40x40@2x.png", + "scale" : "2x" + }, + { + "size" : "40x40", + "idiom" : "iphone", + "filename" : "Icon-App-40x40@3x.png", + "scale" : "3x" + }, + { + "size" : "60x60", + "idiom" : "iphone", + "filename" : "Icon-App-60x60@2x.png", + "scale" : "2x" + }, + { + "size" : "60x60", + "idiom" : "iphone", + "filename" : "Icon-App-60x60@3x.png", + "scale" : "3x" + }, + { + "size" : "20x20", + "idiom" : "ipad", + "filename" : "Icon-App-20x20@1x.png", + "scale" : "1x" + }, + { + "size" : "20x20", + "idiom" : "ipad", + "filename" : "Icon-App-20x20@2x.png", + "scale" : "2x" + }, + { + "size" : "29x29", + "idiom" : "ipad", + "filename" : "Icon-App-29x29@1x.png", + "scale" : "1x" + }, + { + "size" : "29x29", + "idiom" : "ipad", + "filename" : "Icon-App-29x29@2x.png", + "scale" : "2x" + }, + { + "size" : "40x40", + "idiom" : "ipad", + "filename" : "Icon-App-40x40@1x.png", + "scale" : "1x" + }, + { + "size" : "40x40", + "idiom" : "ipad", + "filename" : "Icon-App-40x40@2x.png", + "scale" : "2x" + }, + { + "size" : "76x76", + "idiom" : "ipad", + "filename" : "Icon-App-76x76@1x.png", + "scale" : "1x" + }, + { + "size" : "76x76", + "idiom" : "ipad", + "filename" : "Icon-App-76x76@2x.png", + "scale" : "2x" + }, + { + "size" : "83.5x83.5", + "idiom" : "ipad", + "filename" : "Icon-App-83.5x83.5@2x.png", + "scale" : "2x" + }, + { + "size" : "1024x1024", + "idiom" : "ios-marketing", + "filename" : "Icon-App-1024x1024@1x.png", + "scale" : "1x" + } + ], + "info" : { + "version" : 1, + "author" : "xcode" + } +} diff --git a/siro_rider/packages/get_storage/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-1024x1024@1x.png b/siro_rider/packages/get_storage/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-1024x1024@1x.png new file mode 100644 index 0000000..dc9ada4 Binary files /dev/null and b/siro_rider/packages/get_storage/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-1024x1024@1x.png differ diff --git a/siro_rider/packages/get_storage/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@1x.png b/siro_rider/packages/get_storage/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@1x.png new file mode 100644 index 0000000..28c6bf0 Binary files /dev/null and b/siro_rider/packages/get_storage/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@1x.png differ diff --git a/siro_rider/packages/get_storage/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@2x.png b/siro_rider/packages/get_storage/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@2x.png new file mode 100644 index 0000000..2ccbfd9 Binary files /dev/null and b/siro_rider/packages/get_storage/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@2x.png differ diff --git a/siro_rider/packages/get_storage/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@3x.png b/siro_rider/packages/get_storage/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@3x.png new file mode 100644 index 0000000..f091b6b Binary files /dev/null and b/siro_rider/packages/get_storage/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@3x.png differ diff --git a/siro_rider/packages/get_storage/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@1x.png b/siro_rider/packages/get_storage/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@1x.png new file mode 100644 index 0000000..4cde121 Binary files /dev/null and b/siro_rider/packages/get_storage/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@1x.png differ diff --git a/siro_rider/packages/get_storage/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@2x.png b/siro_rider/packages/get_storage/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@2x.png new file mode 100644 index 0000000..d0ef06e Binary files /dev/null and b/siro_rider/packages/get_storage/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@2x.png differ diff --git a/siro_rider/packages/get_storage/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@3x.png b/siro_rider/packages/get_storage/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@3x.png new file mode 100644 index 0000000..dcdc230 Binary files /dev/null and b/siro_rider/packages/get_storage/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@3x.png differ diff --git a/siro_rider/packages/get_storage/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@1x.png b/siro_rider/packages/get_storage/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@1x.png new file mode 100644 index 0000000..2ccbfd9 Binary files /dev/null and b/siro_rider/packages/get_storage/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@1x.png differ diff --git a/siro_rider/packages/get_storage/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@2x.png b/siro_rider/packages/get_storage/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@2x.png new file mode 100644 index 0000000..c8f9ed8 Binary files /dev/null and b/siro_rider/packages/get_storage/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@2x.png differ diff --git a/siro_rider/packages/get_storage/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@3x.png b/siro_rider/packages/get_storage/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@3x.png new file mode 100644 index 0000000..a6d6b86 Binary files /dev/null and b/siro_rider/packages/get_storage/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@3x.png differ diff --git a/siro_rider/packages/get_storage/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@2x.png b/siro_rider/packages/get_storage/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@2x.png new file mode 100644 index 0000000..a6d6b86 Binary files /dev/null and b/siro_rider/packages/get_storage/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@2x.png differ diff --git a/siro_rider/packages/get_storage/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@3x.png b/siro_rider/packages/get_storage/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@3x.png new file mode 100644 index 0000000..75b2d16 Binary files /dev/null and b/siro_rider/packages/get_storage/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@3x.png differ diff --git a/siro_rider/packages/get_storage/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-76x76@1x.png b/siro_rider/packages/get_storage/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-76x76@1x.png new file mode 100644 index 0000000..c4df70d Binary files /dev/null and b/siro_rider/packages/get_storage/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-76x76@1x.png differ diff --git a/siro_rider/packages/get_storage/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-76x76@2x.png b/siro_rider/packages/get_storage/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-76x76@2x.png new file mode 100644 index 0000000..6a84f41 Binary files /dev/null and b/siro_rider/packages/get_storage/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-76x76@2x.png differ diff --git a/siro_rider/packages/get_storage/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-83.5x83.5@2x.png b/siro_rider/packages/get_storage/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-83.5x83.5@2x.png new file mode 100644 index 0000000..d0e1f58 Binary files /dev/null and b/siro_rider/packages/get_storage/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-83.5x83.5@2x.png differ diff --git a/siro_rider/packages/get_storage/example/ios/Runner/Assets.xcassets/LaunchImage.imageset/Contents.json b/siro_rider/packages/get_storage/example/ios/Runner/Assets.xcassets/LaunchImage.imageset/Contents.json new file mode 100644 index 0000000..0bedcf2 --- /dev/null +++ b/siro_rider/packages/get_storage/example/ios/Runner/Assets.xcassets/LaunchImage.imageset/Contents.json @@ -0,0 +1,23 @@ +{ + "images" : [ + { + "idiom" : "universal", + "filename" : "LaunchImage.png", + "scale" : "1x" + }, + { + "idiom" : "universal", + "filename" : "LaunchImage@2x.png", + "scale" : "2x" + }, + { + "idiom" : "universal", + "filename" : "LaunchImage@3x.png", + "scale" : "3x" + } + ], + "info" : { + "version" : 1, + "author" : "xcode" + } +} diff --git a/siro_rider/packages/get_storage/example/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage.png b/siro_rider/packages/get_storage/example/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage.png new file mode 100644 index 0000000..9da19ea Binary files /dev/null and b/siro_rider/packages/get_storage/example/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage.png differ diff --git a/siro_rider/packages/get_storage/example/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage@2x.png b/siro_rider/packages/get_storage/example/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage@2x.png new file mode 100644 index 0000000..9da19ea Binary files /dev/null and b/siro_rider/packages/get_storage/example/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage@2x.png differ diff --git a/siro_rider/packages/get_storage/example/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage@3x.png b/siro_rider/packages/get_storage/example/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage@3x.png new file mode 100644 index 0000000..9da19ea Binary files /dev/null and b/siro_rider/packages/get_storage/example/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage@3x.png differ diff --git a/siro_rider/packages/get_storage/example/ios/Runner/Assets.xcassets/LaunchImage.imageset/README.md b/siro_rider/packages/get_storage/example/ios/Runner/Assets.xcassets/LaunchImage.imageset/README.md new file mode 100644 index 0000000..89c2725 --- /dev/null +++ b/siro_rider/packages/get_storage/example/ios/Runner/Assets.xcassets/LaunchImage.imageset/README.md @@ -0,0 +1,5 @@ +# Launch Screen Assets + +You can customize the launch screen with your own desired assets by replacing the image files in this directory. + +You can also do it by opening your Flutter project's Xcode project with `open ios/Runner.xcworkspace`, selecting `Runner/Assets.xcassets` in the Project Navigator and dropping in the desired images. \ No newline at end of file diff --git a/siro_rider/packages/get_storage/example/ios/Runner/Base.lproj/LaunchScreen.storyboard b/siro_rider/packages/get_storage/example/ios/Runner/Base.lproj/LaunchScreen.storyboard new file mode 100644 index 0000000..f2e259c --- /dev/null +++ b/siro_rider/packages/get_storage/example/ios/Runner/Base.lproj/LaunchScreen.storyboard @@ -0,0 +1,37 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/siro_rider/packages/get_storage/example/ios/Runner/Base.lproj/Main.storyboard b/siro_rider/packages/get_storage/example/ios/Runner/Base.lproj/Main.storyboard new file mode 100644 index 0000000..f3c2851 --- /dev/null +++ b/siro_rider/packages/get_storage/example/ios/Runner/Base.lproj/Main.storyboard @@ -0,0 +1,26 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/siro_rider/packages/get_storage/example/ios/Runner/GeneratedPluginRegistrant.h b/siro_rider/packages/get_storage/example/ios/Runner/GeneratedPluginRegistrant.h new file mode 100644 index 0000000..7a89092 --- /dev/null +++ b/siro_rider/packages/get_storage/example/ios/Runner/GeneratedPluginRegistrant.h @@ -0,0 +1,19 @@ +// +// Generated file. Do not edit. +// + +// clang-format off + +#ifndef GeneratedPluginRegistrant_h +#define GeneratedPluginRegistrant_h + +#import + +NS_ASSUME_NONNULL_BEGIN + +@interface GeneratedPluginRegistrant : NSObject ++ (void)registerWithRegistry:(NSObject*)registry; +@end + +NS_ASSUME_NONNULL_END +#endif /* GeneratedPluginRegistrant_h */ diff --git a/siro_rider/packages/get_storage/example/ios/Runner/GeneratedPluginRegistrant.m b/siro_rider/packages/get_storage/example/ios/Runner/GeneratedPluginRegistrant.m new file mode 100644 index 0000000..efe65ec --- /dev/null +++ b/siro_rider/packages/get_storage/example/ios/Runner/GeneratedPluginRegistrant.m @@ -0,0 +1,14 @@ +// +// Generated file. Do not edit. +// + +// clang-format off + +#import "GeneratedPluginRegistrant.h" + +@implementation GeneratedPluginRegistrant + ++ (void)registerWithRegistry:(NSObject*)registry { +} + +@end diff --git a/siro_rider/packages/get_storage/example/ios/Runner/Info.plist b/siro_rider/packages/get_storage/example/ios/Runner/Info.plist new file mode 100644 index 0000000..a060db6 --- /dev/null +++ b/siro_rider/packages/get_storage/example/ios/Runner/Info.plist @@ -0,0 +1,45 @@ + + + + + CFBundleDevelopmentRegion + $(DEVELOPMENT_LANGUAGE) + CFBundleExecutable + $(EXECUTABLE_NAME) + CFBundleIdentifier + $(PRODUCT_BUNDLE_IDENTIFIER) + CFBundleInfoDictionaryVersion + 6.0 + CFBundleName + example + CFBundlePackageType + APPL + CFBundleShortVersionString + $(FLUTTER_BUILD_NAME) + CFBundleSignature + ???? + CFBundleVersion + $(FLUTTER_BUILD_NUMBER) + LSRequiresIPhoneOS + + UILaunchStoryboardName + LaunchScreen + UIMainStoryboardFile + Main + UISupportedInterfaceOrientations + + UIInterfaceOrientationPortrait + UIInterfaceOrientationLandscapeLeft + UIInterfaceOrientationLandscapeRight + + UISupportedInterfaceOrientations~ipad + + UIInterfaceOrientationPortrait + UIInterfaceOrientationPortraitUpsideDown + UIInterfaceOrientationLandscapeLeft + UIInterfaceOrientationLandscapeRight + + UIViewControllerBasedStatusBarAppearance + + + diff --git a/siro_rider/packages/get_storage/example/ios/Runner/Runner-Bridging-Header.h b/siro_rider/packages/get_storage/example/ios/Runner/Runner-Bridging-Header.h new file mode 100644 index 0000000..308a2a5 --- /dev/null +++ b/siro_rider/packages/get_storage/example/ios/Runner/Runner-Bridging-Header.h @@ -0,0 +1 @@ +#import "GeneratedPluginRegistrant.h" diff --git a/siro_rider/packages/get_storage/example/lib/main.dart b/siro_rider/packages/get_storage/example/lib/main.dart new file mode 100644 index 0000000..10d3ce7 --- /dev/null +++ b/siro_rider/packages/get_storage/example/lib/main.dart @@ -0,0 +1,38 @@ +import 'package:flutter/material.dart'; +import 'package:get/get.dart'; + +import 'package:get_storage/get_storage.dart'; + +void main() async { + await GetStorage.init(); + runApp(App()); +} + +class Controller extends GetxController { + final box = GetStorage(); + bool get isDark => box.read('darkmode') ?? false; + ThemeData get theme => isDark ? ThemeData.dark() : ThemeData.light(); + void changeTheme(bool val) => box.write('darkmode', val); +} + +class App extends StatelessWidget { + @override + Widget build(BuildContext context) { + final controller = Get.put(Controller()); + return Obx(() { + return MaterialApp( + theme: controller.theme, + home: Scaffold( + appBar: AppBar(title: Text("Get Storage")), + body: Center( + child: SwitchListTile( + value: controller.isDark, + title: Text("Touch to change ThemeMode"), + onChanged: controller.changeTheme, + ), + ), + ), + ); + }); + } +} diff --git a/siro_rider/packages/get_storage/example/linux/CMakeLists.txt b/siro_rider/packages/get_storage/example/linux/CMakeLists.txt new file mode 100644 index 0000000..290c3e8 --- /dev/null +++ b/siro_rider/packages/get_storage/example/linux/CMakeLists.txt @@ -0,0 +1,106 @@ +cmake_minimum_required(VERSION 3.10) +project(runner LANGUAGES CXX) + +set(BINARY_NAME "example") +set(APPLICATION_ID "com.example.example") + +cmake_policy(SET CMP0063 NEW) + +set(CMAKE_INSTALL_RPATH "$ORIGIN/lib") + +# Configure build options. +if(NOT CMAKE_BUILD_TYPE AND NOT CMAKE_CONFIGURATION_TYPES) + set(CMAKE_BUILD_TYPE "Debug" CACHE + STRING "Flutter build mode" FORCE) + set_property(CACHE CMAKE_BUILD_TYPE PROPERTY STRINGS + "Debug" "Profile" "Release") +endif() + +# Compilation settings that should be applied to most targets. +function(APPLY_STANDARD_SETTINGS TARGET) + target_compile_features(${TARGET} PUBLIC cxx_std_14) + target_compile_options(${TARGET} PRIVATE -Wall -Werror) + target_compile_options(${TARGET} PRIVATE "$<$>:-O3>") + target_compile_definitions(${TARGET} PRIVATE "$<$>:NDEBUG>") +endfunction() + +set(FLUTTER_MANAGED_DIR "${CMAKE_CURRENT_SOURCE_DIR}/flutter") + +# Flutter library and tool build rules. +add_subdirectory(${FLUTTER_MANAGED_DIR}) + +# System-level dependencies. +find_package(PkgConfig REQUIRED) +pkg_check_modules(GTK REQUIRED IMPORTED_TARGET gtk+-3.0) + +add_definitions(-DAPPLICATION_ID="${APPLICATION_ID}") + +# Application build +add_executable(${BINARY_NAME} + "main.cc" + "my_application.cc" + "${FLUTTER_MANAGED_DIR}/generated_plugin_registrant.cc" +) +apply_standard_settings(${BINARY_NAME}) +target_link_libraries(${BINARY_NAME} PRIVATE flutter) +target_link_libraries(${BINARY_NAME} PRIVATE PkgConfig::GTK) +add_dependencies(${BINARY_NAME} flutter_assemble) +# Only the install-generated bundle's copy of the executable will launch +# correctly, since the resources must in the right relative locations. To avoid +# people trying to run the unbundled copy, put it in a subdirectory instead of +# the default top-level location. +set_target_properties(${BINARY_NAME} + PROPERTIES + RUNTIME_OUTPUT_DIRECTORY "${CMAKE_BINARY_DIR}/intermediates_do_not_run" +) + +# Generated plugin build rules, which manage building the plugins and adding +# them to the application. +include(flutter/generated_plugins.cmake) + + +# === Installation === +# By default, "installing" just makes a relocatable bundle in the build +# directory. +set(BUILD_BUNDLE_DIR "${PROJECT_BINARY_DIR}/bundle") +if(CMAKE_INSTALL_PREFIX_INITIALIZED_TO_DEFAULT) + set(CMAKE_INSTALL_PREFIX "${BUILD_BUNDLE_DIR}" CACHE PATH "..." FORCE) +endif() + +# Start with a clean build bundle directory every time. +install(CODE " + file(REMOVE_RECURSE \"${BUILD_BUNDLE_DIR}/\") + " COMPONENT Runtime) + +set(INSTALL_BUNDLE_DATA_DIR "${CMAKE_INSTALL_PREFIX}/data") +set(INSTALL_BUNDLE_LIB_DIR "${CMAKE_INSTALL_PREFIX}/lib") + +install(TARGETS ${BINARY_NAME} RUNTIME DESTINATION "${CMAKE_INSTALL_PREFIX}" + COMPONENT Runtime) + +install(FILES "${FLUTTER_ICU_DATA_FILE}" DESTINATION "${INSTALL_BUNDLE_DATA_DIR}" + COMPONENT Runtime) + +install(FILES "${FLUTTER_LIBRARY}" DESTINATION "${INSTALL_BUNDLE_LIB_DIR}" + COMPONENT Runtime) + +if(PLUGIN_BUNDLED_LIBRARIES) + install(FILES "${PLUGIN_BUNDLED_LIBRARIES}" + DESTINATION "${INSTALL_BUNDLE_LIB_DIR}" + COMPONENT Runtime) +endif() + +# Fully re-copy the assets directory on each build to avoid having stale files +# from a previous install. +set(FLUTTER_ASSET_DIR_NAME "flutter_assets") +install(CODE " + file(REMOVE_RECURSE \"${INSTALL_BUNDLE_DATA_DIR}/${FLUTTER_ASSET_DIR_NAME}\") + " COMPONENT Runtime) +install(DIRECTORY "${PROJECT_BUILD_DIR}/${FLUTTER_ASSET_DIR_NAME}" + DESTINATION "${INSTALL_BUNDLE_DATA_DIR}" COMPONENT Runtime) + +# Install the AOT library on non-Debug builds only. +if(NOT CMAKE_BUILD_TYPE MATCHES "Debug") + install(FILES "${AOT_LIBRARY}" DESTINATION "${INSTALL_BUNDLE_LIB_DIR}" + COMPONENT Runtime) +endif() diff --git a/siro_rider/packages/get_storage/example/linux/flutter/CMakeLists.txt b/siro_rider/packages/get_storage/example/linux/flutter/CMakeLists.txt new file mode 100644 index 0000000..510701c --- /dev/null +++ b/siro_rider/packages/get_storage/example/linux/flutter/CMakeLists.txt @@ -0,0 +1,90 @@ +cmake_minimum_required(VERSION 3.10) + +set(EPHEMERAL_DIR "${CMAKE_CURRENT_SOURCE_DIR}/ephemeral") + +# Configuration provided via flutter tool. +include(${EPHEMERAL_DIR}/generated_config.cmake) + +# TODO: Move the rest of this into files in ephemeral. See +# https://github.com/flutter/flutter/issues/57146. + +# Serves the same purpose as list(TRANSFORM ... PREPEND ...), +# which isn't available in 3.10. +function(list_prepend LIST_NAME PREFIX) + set(NEW_LIST "") + foreach(element ${${LIST_NAME}}) + list(APPEND NEW_LIST "${PREFIX}${element}") + endforeach(element) + set(${LIST_NAME} "${NEW_LIST}" PARENT_SCOPE) +endfunction() + +# === Flutter Library === +# System-level dependencies. +find_package(PkgConfig REQUIRED) +pkg_check_modules(GTK REQUIRED IMPORTED_TARGET gtk+-3.0) +pkg_check_modules(GLIB REQUIRED IMPORTED_TARGET glib-2.0) +pkg_check_modules(GIO REQUIRED IMPORTED_TARGET gio-2.0) +pkg_check_modules(BLKID REQUIRED IMPORTED_TARGET blkid) +pkg_check_modules(LZMA REQUIRED IMPORTED_TARGET liblzma) + +set(FLUTTER_LIBRARY "${EPHEMERAL_DIR}/libflutter_linux_gtk.so") + +# Published to parent scope for install step. +set(FLUTTER_LIBRARY ${FLUTTER_LIBRARY} PARENT_SCOPE) +set(FLUTTER_ICU_DATA_FILE "${EPHEMERAL_DIR}/icudtl.dat" PARENT_SCOPE) +set(PROJECT_BUILD_DIR "${PROJECT_DIR}/build/" PARENT_SCOPE) +set(AOT_LIBRARY "${PROJECT_DIR}/build/lib/libapp.so" PARENT_SCOPE) + +list(APPEND FLUTTER_LIBRARY_HEADERS + "fl_basic_message_channel.h" + "fl_binary_codec.h" + "fl_binary_messenger.h" + "fl_dart_project.h" + "fl_engine.h" + "fl_json_message_codec.h" + "fl_json_method_codec.h" + "fl_message_codec.h" + "fl_method_call.h" + "fl_method_channel.h" + "fl_method_codec.h" + "fl_method_response.h" + "fl_plugin_registrar.h" + "fl_plugin_registry.h" + "fl_standard_message_codec.h" + "fl_standard_method_codec.h" + "fl_string_codec.h" + "fl_value.h" + "fl_view.h" + "flutter_linux.h" +) +list_prepend(FLUTTER_LIBRARY_HEADERS "${EPHEMERAL_DIR}/flutter_linux/") +add_library(flutter INTERFACE) +target_include_directories(flutter INTERFACE + "${EPHEMERAL_DIR}" +) +target_link_libraries(flutter INTERFACE "${FLUTTER_LIBRARY}") +target_link_libraries(flutter INTERFACE + PkgConfig::GTK + PkgConfig::GLIB + PkgConfig::GIO + PkgConfig::BLKID + PkgConfig::LZMA +) +add_dependencies(flutter flutter_assemble) + +# === Flutter tool backend === +# _phony_ is a non-existent file to force this command to run every time, +# since currently there's no way to get a full input/output list from the +# flutter tool. +add_custom_command( + OUTPUT ${FLUTTER_LIBRARY} ${FLUTTER_LIBRARY_HEADERS} + ${CMAKE_CURRENT_BINARY_DIR}/_phony_ + COMMAND ${CMAKE_COMMAND} -E env + ${FLUTTER_TOOL_ENVIRONMENT} + "${FLUTTER_ROOT}/packages/flutter_tools/bin/tool_backend.sh" + linux-x64 ${CMAKE_BUILD_TYPE} +) +add_custom_target(flutter_assemble DEPENDS + "${FLUTTER_LIBRARY}" + ${FLUTTER_LIBRARY_HEADERS} +) diff --git a/siro_rider/packages/get_storage/example/linux/flutter/ephemeral/.plugin_symlinks/jni b/siro_rider/packages/get_storage/example/linux/flutter/ephemeral/.plugin_symlinks/jni new file mode 120000 index 0000000..9d997f0 --- /dev/null +++ b/siro_rider/packages/get_storage/example/linux/flutter/ephemeral/.plugin_symlinks/jni @@ -0,0 +1 @@ +/Users/hamzaaleghwairyeen/.pub-cache/hosted/pub.dev/jni-1.0.0/ \ No newline at end of file diff --git a/siro_rider/packages/get_storage/example/linux/flutter/ephemeral/.plugin_symlinks/path_provider_linux b/siro_rider/packages/get_storage/example/linux/flutter/ephemeral/.plugin_symlinks/path_provider_linux new file mode 120000 index 0000000..189b3e6 --- /dev/null +++ b/siro_rider/packages/get_storage/example/linux/flutter/ephemeral/.plugin_symlinks/path_provider_linux @@ -0,0 +1 @@ +/Users/hamzaaleghwairyeen/.pub-cache/hosted/pub.dev/path_provider_linux-2.2.1/ \ No newline at end of file diff --git a/siro_rider/packages/get_storage/example/linux/flutter/generated_plugin_registrant.cc b/siro_rider/packages/get_storage/example/linux/flutter/generated_plugin_registrant.cc new file mode 100644 index 0000000..e71a16d --- /dev/null +++ b/siro_rider/packages/get_storage/example/linux/flutter/generated_plugin_registrant.cc @@ -0,0 +1,11 @@ +// +// Generated file. Do not edit. +// + +// clang-format off + +#include "generated_plugin_registrant.h" + + +void fl_register_plugins(FlPluginRegistry* registry) { +} diff --git a/siro_rider/packages/get_storage/example/linux/flutter/generated_plugin_registrant.h b/siro_rider/packages/get_storage/example/linux/flutter/generated_plugin_registrant.h new file mode 100644 index 0000000..e0f0a47 --- /dev/null +++ b/siro_rider/packages/get_storage/example/linux/flutter/generated_plugin_registrant.h @@ -0,0 +1,15 @@ +// +// Generated file. Do not edit. +// + +// clang-format off + +#ifndef GENERATED_PLUGIN_REGISTRANT_ +#define GENERATED_PLUGIN_REGISTRANT_ + +#include + +// Registers Flutter plugins. +void fl_register_plugins(FlPluginRegistry* registry); + +#endif // GENERATED_PLUGIN_REGISTRANT_ diff --git a/siro_rider/packages/get_storage/example/linux/flutter/generated_plugins.cmake b/siro_rider/packages/get_storage/example/linux/flutter/generated_plugins.cmake new file mode 100644 index 0000000..be1ee3e --- /dev/null +++ b/siro_rider/packages/get_storage/example/linux/flutter/generated_plugins.cmake @@ -0,0 +1,24 @@ +# +# Generated file, do not edit. +# + +list(APPEND FLUTTER_PLUGIN_LIST +) + +list(APPEND FLUTTER_FFI_PLUGIN_LIST + jni +) + +set(PLUGIN_BUNDLED_LIBRARIES) + +foreach(plugin ${FLUTTER_PLUGIN_LIST}) + add_subdirectory(flutter/ephemeral/.plugin_symlinks/${plugin}/linux plugins/${plugin}) + target_link_libraries(${BINARY_NAME} PRIVATE ${plugin}_plugin) + list(APPEND PLUGIN_BUNDLED_LIBRARIES $) + list(APPEND PLUGIN_BUNDLED_LIBRARIES ${${plugin}_bundled_libraries}) +endforeach(plugin) + +foreach(ffi_plugin ${FLUTTER_FFI_PLUGIN_LIST}) + add_subdirectory(flutter/ephemeral/.plugin_symlinks/${ffi_plugin}/linux plugins/${ffi_plugin}) + list(APPEND PLUGIN_BUNDLED_LIBRARIES ${${ffi_plugin}_bundled_libraries}) +endforeach(ffi_plugin) diff --git a/siro_rider/packages/get_storage/example/linux/main.cc b/siro_rider/packages/get_storage/example/linux/main.cc new file mode 100644 index 0000000..e7c5c54 --- /dev/null +++ b/siro_rider/packages/get_storage/example/linux/main.cc @@ -0,0 +1,6 @@ +#include "my_application.h" + +int main(int argc, char** argv) { + g_autoptr(MyApplication) app = my_application_new(); + return g_application_run(G_APPLICATION(app), argc, argv); +} diff --git a/siro_rider/packages/get_storage/example/linux/my_application.cc b/siro_rider/packages/get_storage/example/linux/my_application.cc new file mode 100644 index 0000000..543eaca --- /dev/null +++ b/siro_rider/packages/get_storage/example/linux/my_application.cc @@ -0,0 +1,104 @@ +#include "my_application.h" + +#include +#ifdef GDK_WINDOWING_X11 +#include +#endif + +#include "flutter/generated_plugin_registrant.h" + +struct _MyApplication { + GtkApplication parent_instance; + char** dart_entrypoint_arguments; +}; + +G_DEFINE_TYPE(MyApplication, my_application, GTK_TYPE_APPLICATION) + +// Implements GApplication::activate. +static void my_application_activate(GApplication* application) { + MyApplication* self = MY_APPLICATION(application); + GtkWindow* window = + GTK_WINDOW(gtk_application_window_new(GTK_APPLICATION(application))); + + // Use a header bar when running in GNOME as this is the common style used + // by applications and is the setup most users will be using (e.g. Ubuntu + // desktop). + // If running on X and not using GNOME then just use a traditional title bar + // in case the window manager does more exotic layout, e.g. tiling. + // If running on Wayland assume the header bar will work (may need changing + // if future cases occur). + gboolean use_header_bar = TRUE; +#ifdef GDK_WINDOWING_X11 + GdkScreen *screen = gtk_window_get_screen(window); + if (GDK_IS_X11_SCREEN(screen)) { + const gchar* wm_name = gdk_x11_screen_get_window_manager_name(screen); + if (g_strcmp0(wm_name, "GNOME Shell") != 0) { + use_header_bar = FALSE; + } + } +#endif + if (use_header_bar) { + GtkHeaderBar *header_bar = GTK_HEADER_BAR(gtk_header_bar_new()); + gtk_widget_show(GTK_WIDGET(header_bar)); + gtk_header_bar_set_title(header_bar, "example"); + gtk_header_bar_set_show_close_button(header_bar, TRUE); + gtk_window_set_titlebar(window, GTK_WIDGET(header_bar)); + } + else { + gtk_window_set_title(window, "example"); + } + + gtk_window_set_default_size(window, 1280, 720); + gtk_widget_show(GTK_WIDGET(window)); + + g_autoptr(FlDartProject) project = fl_dart_project_new(); + fl_dart_project_set_dart_entrypoint_arguments(project, self->dart_entrypoint_arguments); + + FlView* view = fl_view_new(project); + gtk_widget_show(GTK_WIDGET(view)); + gtk_container_add(GTK_CONTAINER(window), GTK_WIDGET(view)); + + fl_register_plugins(FL_PLUGIN_REGISTRY(view)); + + gtk_widget_grab_focus(GTK_WIDGET(view)); +} + +// Implements GApplication::local_command_line. +static gboolean my_application_local_command_line(GApplication* application, gchar ***arguments, int *exit_status) { + MyApplication* self = MY_APPLICATION(application); + // Strip out the first argument as it is the binary name. + self->dart_entrypoint_arguments = g_strdupv(*arguments + 1); + + g_autoptr(GError) error = nullptr; + if (!g_application_register(application, nullptr, &error)) { + g_warning("Failed to register: %s", error->message); + *exit_status = 1; + return TRUE; + } + + g_application_activate(application); + *exit_status = 0; + + return TRUE; +} + +// Implements GObject::dispose. +static void my_application_dispose(GObject *object) { + MyApplication* self = MY_APPLICATION(object); + g_clear_pointer(&self->dart_entrypoint_arguments, g_strfreev); + G_OBJECT_CLASS(my_application_parent_class)->dispose(object); +} + +static void my_application_class_init(MyApplicationClass* klass) { + G_APPLICATION_CLASS(klass)->activate = my_application_activate; + G_APPLICATION_CLASS(klass)->local_command_line = my_application_local_command_line; + G_OBJECT_CLASS(klass)->dispose = my_application_dispose; +} + +static void my_application_init(MyApplication* self) {} + +MyApplication* my_application_new() { + return MY_APPLICATION(g_object_new(my_application_get_type(), + "application-id", APPLICATION_ID, + nullptr)); +} diff --git a/siro_rider/packages/get_storage/example/linux/my_application.h b/siro_rider/packages/get_storage/example/linux/my_application.h new file mode 100644 index 0000000..72271d5 --- /dev/null +++ b/siro_rider/packages/get_storage/example/linux/my_application.h @@ -0,0 +1,18 @@ +#ifndef FLUTTER_MY_APPLICATION_H_ +#define FLUTTER_MY_APPLICATION_H_ + +#include + +G_DECLARE_FINAL_TYPE(MyApplication, my_application, MY, APPLICATION, + GtkApplication) + +/** + * my_application_new: + * + * Creates a new Flutter-based application. + * + * Returns: a new #MyApplication. + */ +MyApplication* my_application_new(); + +#endif // FLUTTER_MY_APPLICATION_H_ diff --git a/siro_rider/packages/get_storage/example/pubspec.lock b/siro_rider/packages/get_storage/example/pubspec.lock new file mode 100644 index 0000000..3b1de6e --- /dev/null +++ b/siro_rider/packages/get_storage/example/pubspec.lock @@ -0,0 +1,420 @@ +# Generated by pub +# See https://dart.dev/tools/pub/glossary#lockfile +packages: + args: + dependency: transitive + description: + name: args + sha256: d0481093c50b1da8910eb0bb301626d4d8eb7284aa739614d2b394ee09e3ea04 + url: "https://pub.dev" + source: hosted + version: "2.7.0" + async: + dependency: transitive + description: + name: async + sha256: e2eb0491ba5ddb6177742d2da23904574082139b07c1e33b8503b9f46f3e1a37 + url: "https://pub.dev" + source: hosted + version: "2.13.1" + boolean_selector: + dependency: transitive + description: + name: boolean_selector + sha256: "8aab1771e1243a5063b8b0ff68042d67334e3feab9e95b9490f9a6ebf73b42ea" + url: "https://pub.dev" + source: hosted + version: "2.1.2" + characters: + dependency: transitive + description: + name: characters + sha256: faf38497bda5ead2a8c7615f4f7939df04333478bf32e4173fcb06d428b5716b + url: "https://pub.dev" + source: hosted + version: "1.4.1" + clock: + dependency: transitive + description: + name: clock + sha256: fddb70d9b5277016c77a80201021d40a2247104d9f4aa7bab7157b7e3f05b84b + url: "https://pub.dev" + source: hosted + version: "1.1.2" + code_assets: + dependency: transitive + description: + name: code_assets + sha256: "83ccdaa064c980b5596c35dd64a8d3ecc68620174ab9b90b6343b753aa721687" + url: "https://pub.dev" + source: hosted + version: "1.0.0" + collection: + dependency: transitive + description: + name: collection + sha256: "2f5709ae4d3d59dd8f7cd309b4e023046b57d8a6c82130785d2b0e5868084e76" + url: "https://pub.dev" + source: hosted + version: "1.19.1" + crypto: + dependency: transitive + description: + name: crypto + sha256: c8ea0233063ba03258fbcf2ca4d6dadfefe14f02fab57702265467a19f27fadf + url: "https://pub.dev" + source: hosted + version: "3.0.7" + cupertino_icons: + dependency: "direct main" + description: + name: cupertino_icons + sha256: "41e005c33bd814be4d3096aff55b1908d419fde52ca656c8c47719ec745873cd" + url: "https://pub.dev" + source: hosted + version: "1.0.9" + fake_async: + dependency: transitive + description: + name: fake_async + sha256: "5368f224a74523e8d2e7399ea1638b37aecfca824a3cc4dfdf77bf1fa905ac44" + url: "https://pub.dev" + source: hosted + version: "1.3.3" + ffi: + dependency: transitive + description: + name: ffi + sha256: "6d7fd89431262d8f3125e81b50d3847a091d846eafcd4fdb88dd06f36d705a45" + url: "https://pub.dev" + source: hosted + version: "2.2.0" + file: + dependency: transitive + description: + name: file + sha256: a3b4f84adafef897088c160faf7dfffb7696046cb13ae90b508c2cbc95d3b8d4 + url: "https://pub.dev" + source: hosted + version: "7.0.1" + flutter: + dependency: "direct main" + description: flutter + source: sdk + version: "0.0.0" + flutter_test: + dependency: "direct dev" + description: flutter + source: sdk + version: "0.0.0" + get: + dependency: "direct main" + description: + name: get + sha256: "5ed34a7925b85336e15d472cc4cfe7d9ebf4ab8e8b9f688585bf6b50f4c3d79a" + url: "https://pub.dev" + source: hosted + version: "4.7.3" + get_storage: + dependency: "direct main" + description: + path: ".." + relative: true + source: path + version: "2.1.1" + glob: + dependency: transitive + description: + name: glob + sha256: c3f1ee72c96f8f78935e18aa8cecced9ab132419e8625dc187e1c2408efc20de + url: "https://pub.dev" + source: hosted + version: "2.1.3" + hooks: + dependency: transitive + description: + name: hooks + sha256: e79ed1e8e1929bc6ecb6ec85f0cb519c887aa5b423705ded0d0f2d9226def388 + url: "https://pub.dev" + source: hosted + version: "1.0.2" + jni: + dependency: transitive + description: + name: jni + sha256: c2230682d5bc2362c1c9e8d3c7f406d9cbba23ab3f2e203a025dd47e0fb2e68f + url: "https://pub.dev" + source: hosted + version: "1.0.0" + jni_flutter: + dependency: transitive + description: + name: jni_flutter + sha256: "8b59e590786050b1cd866677dddaf76b1ade5e7bc751abe04b86e84d379d3ba6" + url: "https://pub.dev" + source: hosted + version: "1.0.1" + leak_tracker: + dependency: transitive + description: + name: leak_tracker + sha256: "33e2e26bdd85a0112ec15400c8cbffea70d0f9c3407491f672a2fad47915e2de" + url: "https://pub.dev" + source: hosted + version: "11.0.2" + leak_tracker_flutter_testing: + dependency: transitive + description: + name: leak_tracker_flutter_testing + sha256: "1dbc140bb5a23c75ea9c4811222756104fbcd1a27173f0c34ca01e16bea473c1" + url: "https://pub.dev" + source: hosted + version: "3.0.10" + leak_tracker_testing: + dependency: transitive + description: + name: leak_tracker_testing + sha256: "8d5a2d49f4a66b49744b23b018848400d23e54caf9463f4eb20df3eb8acb2eb1" + url: "https://pub.dev" + source: hosted + version: "3.0.2" + logging: + dependency: transitive + description: + name: logging + sha256: c8245ada5f1717ed44271ed1c26b8ce85ca3228fd2ffdb75468ab01979309d61 + url: "https://pub.dev" + source: hosted + version: "1.3.0" + matcher: + dependency: transitive + description: + name: matcher + sha256: "12956d0ad8390bbcc63ca2e1469c0619946ccb52809807067a7020d57e647aa6" + url: "https://pub.dev" + source: hosted + version: "0.12.18" + material_color_utilities: + dependency: transitive + description: + name: material_color_utilities + sha256: "9c337007e82b1889149c82ed242ed1cb24a66044e30979c44912381e9be4c48b" + url: "https://pub.dev" + source: hosted + version: "0.13.0" + meta: + dependency: transitive + description: + name: meta + sha256: "23f08335362185a5ea2ad3a4e597f1375e78bce8a040df5c600c8d3552ef2394" + url: "https://pub.dev" + source: hosted + version: "1.17.0" + native_toolchain_c: + dependency: transitive + description: + name: native_toolchain_c + sha256: "6ba77bb18063eebe9de401f5e6437e95e1438af0a87a3a39084fbd37c90df572" + url: "https://pub.dev" + source: hosted + version: "0.17.6" + objective_c: + dependency: transitive + description: + name: objective_c + sha256: "100a1c87616ab6ed41ec263b083c0ef3261ee6cd1dc3b0f35f8ddfa4f996fe52" + url: "https://pub.dev" + source: hosted + version: "9.3.0" + package_config: + dependency: transitive + description: + name: package_config + sha256: f096c55ebb7deb7e384101542bfba8c52696c1b56fca2eb62827989ef2353bbc + url: "https://pub.dev" + source: hosted + version: "2.2.0" + path: + dependency: transitive + description: + name: path + sha256: "75cca69d1490965be98c73ceaea117e8a04dd21217b37b292c9ddbec0d955bc5" + url: "https://pub.dev" + source: hosted + version: "1.9.1" + path_provider: + dependency: "direct main" + description: + name: path_provider + sha256: "50c5dd5b6e1aaf6fb3a78b33f6aa3afca52bf903a8a5298f53101fdaee55bbcd" + url: "https://pub.dev" + source: hosted + version: "2.1.5" + path_provider_android: + dependency: transitive + description: + name: path_provider_android + sha256: "69cbd515a62b94d32a7944f086b2f82b4ac40a1d45bebfc00813a430ab2dabcd" + url: "https://pub.dev" + source: hosted + version: "2.3.1" + path_provider_foundation: + dependency: transitive + description: + name: path_provider_foundation + sha256: "2a376b7d6392d80cd3705782d2caa734ca4727776db0b6ec36ef3f1855197699" + url: "https://pub.dev" + source: hosted + version: "2.6.0" + path_provider_linux: + dependency: transitive + description: + name: path_provider_linux + sha256: f7a1fe3a634fe7734c8d3f2766ad746ae2a2884abe22e241a8b301bf5cac3279 + url: "https://pub.dev" + source: hosted + version: "2.2.1" + path_provider_platform_interface: + dependency: transitive + description: + name: path_provider_platform_interface + sha256: "88f5779f72ba699763fa3a3b06aa4bf6de76c8e5de842cf6f29e2e06476c2334" + url: "https://pub.dev" + source: hosted + version: "2.1.2" + path_provider_windows: + dependency: transitive + description: + name: path_provider_windows + sha256: bd6f00dbd873bfb70d0761682da2b3a2c2fccc2b9e84c495821639601d81afe7 + url: "https://pub.dev" + source: hosted + version: "2.3.0" + platform: + dependency: transitive + description: + name: platform + sha256: "5d6b1b0036a5f331ebc77c850ebc8506cbc1e9416c27e59b439f917a902a4984" + url: "https://pub.dev" + source: hosted + version: "3.1.6" + plugin_platform_interface: + dependency: transitive + description: + name: plugin_platform_interface + sha256: "4820fbfdb9478b1ebae27888254d445073732dae3d6ea81f0b7e06d5dedc3f02" + url: "https://pub.dev" + source: hosted + version: "2.1.8" + pub_semver: + dependency: transitive + description: + name: pub_semver + sha256: "5bfcf68ca79ef689f8990d1160781b4bad40a3bd5e5218ad4076ddb7f4081585" + url: "https://pub.dev" + source: hosted + version: "2.2.0" + sky_engine: + dependency: transitive + description: flutter + source: sdk + version: "0.0.0" + source_span: + dependency: transitive + description: + name: source_span + sha256: "56a02f1f4cd1a2d96303c0144c93bd6d909eea6bee6bf5a0e0b685edbd4c47ab" + url: "https://pub.dev" + source: hosted + version: "1.10.2" + stack_trace: + dependency: transitive + description: + name: stack_trace + sha256: "8b27215b45d22309b5cddda1aa2b19bdfec9df0e765f2de506401c071d38d1b1" + url: "https://pub.dev" + source: hosted + version: "1.12.1" + stream_channel: + dependency: transitive + description: + name: stream_channel + sha256: "969e04c80b8bcdf826f8f16579c7b14d780458bd97f56d107d3950fdbeef059d" + url: "https://pub.dev" + source: hosted + version: "2.1.4" + string_scanner: + dependency: transitive + description: + name: string_scanner + sha256: "921cd31725b72fe181906c6a94d987c78e3b98c2e205b397ea399d4054872b43" + url: "https://pub.dev" + source: hosted + version: "1.4.1" + term_glyph: + dependency: transitive + description: + name: term_glyph + sha256: "7f554798625ea768a7518313e58f83891c7f5024f88e46e7182a4558850a4b8e" + url: "https://pub.dev" + source: hosted + version: "1.2.2" + test_api: + dependency: transitive + description: + name: test_api + sha256: "93167629bfc610f71560ab9312acdda4959de4df6fac7492c89ff0d3886f6636" + url: "https://pub.dev" + source: hosted + version: "0.7.9" + typed_data: + dependency: transitive + description: + name: typed_data + sha256: f9049c039ebfeb4cf7a7104a675823cd72dba8297f264b6637062516699fa006 + url: "https://pub.dev" + source: hosted + version: "1.4.0" + vector_math: + dependency: transitive + description: + name: vector_math + sha256: d530bd74fea330e6e364cda7a85019c434070188383e1cd8d9777ee586914c5b + url: "https://pub.dev" + source: hosted + version: "2.2.0" + vm_service: + dependency: transitive + description: + name: vm_service + sha256: "046d3928e16fa4dc46e8350415661755ab759d9fc97fc21b5ab295f71e4f0499" + url: "https://pub.dev" + source: hosted + version: "15.1.0" + web: + dependency: transitive + description: + name: web + sha256: "868d88a33d8a87b18ffc05f9f030ba328ffefba92d6c127917a2ba740f9cfe4a" + url: "https://pub.dev" + source: hosted + version: "1.1.1" + xdg_directories: + dependency: transitive + description: + name: xdg_directories + sha256: "7a3f37b05d989967cdddcbb571f1ea834867ae2faa29725fd085180e0883aa15" + url: "https://pub.dev" + source: hosted + version: "1.1.0" + yaml: + dependency: transitive + description: + name: yaml + sha256: b9da305ac7c39faa3f030eccd175340f968459dae4af175130b3fc47e40d76ce + url: "https://pub.dev" + source: hosted + version: "3.1.3" +sdks: + dart: ">=3.10.3 <4.0.0" + flutter: ">=3.38.4" diff --git a/siro_rider/packages/get_storage/example/pubspec.yaml b/siro_rider/packages/get_storage/example/pubspec.yaml new file mode 100644 index 0000000..734d420 --- /dev/null +++ b/siro_rider/packages/get_storage/example/pubspec.yaml @@ -0,0 +1,74 @@ +name: example +description: A new Flutter project. + +# The following line prevents the package from being accidentally published to +# pub.dev using `pub publish`. This is preferred for private packages. +publish_to: "none" # Remove this line if you wish to publish to pub.dev + +# The following defines the version and build number for your application. +# A version number is three numbers separated by dots, like 1.2.43 +# followed by an optional build number separated by a +. +# Both the version and the builder number may be overridden in flutter +# build by specifying --build-name and --build-number, respectively. +# In Android, build-name is used as versionName while build-number used as versionCode. +# Read more about Android versioning at https://developer.android.com/studio/publish/versioning +# In iOS, build-name is used as CFBundleShortVersionString while build-number used as CFBundleVersion. +# Read more about iOS versioning at +# https://developer.apple.com/library/archive/documentation/General/Reference/InfoPlistKeyReference/Articles/CoreFoundationKeys.html +version: 1.0.0+1 + +environment: + sdk: ">=2.16.0 <3.0.0" + +dependencies: + flutter: + sdk: flutter + get_storage: + path: ../ + path_provider: + get: + + # The following adds the Cupertino Icons font to your application. + # Use with the CupertinoIcons class for iOS style icons. + cupertino_icons: ^1.0.4 + +dev_dependencies: + flutter_test: + sdk: flutter + +# For information on the generic Dart part of this file, see the +# following page: https://dart.dev/tools/pub/pubspec + +# The following section is specific to Flutter. +flutter: + # The following line ensures that the Material Icons font is + # included with your application, so that you can use the icons in + # the material Icons class. + uses-material-design: true + # To add assets to your application, add an assets section, like this: + # assets: + # - images/a_dot_burr.jpeg + # - images/a_dot_ham.jpeg + # An image asset can refer to one or more resolution-specific "variants", see + # https://flutter.dev/assets-and-images/#resolution-aware. + # For details regarding adding assets from package dependencies, see + # https://flutter.dev/assets-and-images/#from-packages + # To add custom fonts to your application, add a fonts section here, + # in this "flutter" section. Each entry in this list should have a + # "family" key with the font family name, and a "fonts" key with a + # list giving the asset and other descriptors for the font. For + # example: + # fonts: + # - family: Schyler + # fonts: + # - asset: fonts/Schyler-Regular.ttf + # - asset: fonts/Schyler-Italic.ttf + # style: italic + # - family: Trajan Pro + # fonts: + # - asset: fonts/TrajanPro.ttf + # - asset: fonts/TrajanPro_Bold.ttf + # weight: 700 + # + # For details regarding fonts from package dependencies, + # see https://flutter.dev/custom-fonts/#from-packages \ No newline at end of file diff --git a/siro_rider/packages/get_storage/example/test/test.dart b/siro_rider/packages/get_storage/example/test/test.dart new file mode 100644 index 0000000..bc0cad2 --- /dev/null +++ b/siro_rider/packages/get_storage/example/test/test.dart @@ -0,0 +1,17 @@ +import 'package:flutter_test/flutter_test.dart'; +import 'package:get_storage/get_storage.dart'; + +void main() { + final counter = 'counter'; + final isDarkMode = 'isDarkMode'; + GetStorage box = GetStorage(); + test('GetStorage read and write operation', () { + box.write(counter, 0); + expect(box.read(counter), 0); + }); + + test('save the state of brightness mode of app in GetStorage', () { + box.write(isDarkMode, true); + expect(box.read(isDarkMode), true); + }); +} diff --git a/siro_rider/packages/get_storage/example/test/widget_test.dart b/siro_rider/packages/get_storage/example/test/widget_test.dart new file mode 100644 index 0000000..ae40864 --- /dev/null +++ b/siro_rider/packages/get_storage/example/test/widget_test.dart @@ -0,0 +1,12 @@ +// This is a basic Flutter widget test. +// +// To perform an interaction with a widget in your test, use the WidgetTester +// utility that Flutter provides. For example, you can send tap and scroll +// gestures. You can also use WidgetTester to find child widgets in the widget +// tree, read text, and verify that the values of widget properties are correct. + +import 'package:flutter_test/flutter_test.dart'; + +void main() { + testWidgets('Counter increments smoke test', (WidgetTester tester) async {}); +} diff --git a/siro_rider/packages/get_storage/example/web/favicon.png b/siro_rider/packages/get_storage/example/web/favicon.png new file mode 100644 index 0000000..8aaa46a Binary files /dev/null and b/siro_rider/packages/get_storage/example/web/favicon.png differ diff --git a/siro_rider/packages/get_storage/example/web/icons/Icon-192.png b/siro_rider/packages/get_storage/example/web/icons/Icon-192.png new file mode 100644 index 0000000..b749bfe Binary files /dev/null and b/siro_rider/packages/get_storage/example/web/icons/Icon-192.png differ diff --git a/siro_rider/packages/get_storage/example/web/icons/Icon-512.png b/siro_rider/packages/get_storage/example/web/icons/Icon-512.png new file mode 100644 index 0000000..88cfd48 Binary files /dev/null and b/siro_rider/packages/get_storage/example/web/icons/Icon-512.png differ diff --git a/siro_rider/packages/get_storage/example/web/index.html b/siro_rider/packages/get_storage/example/web/index.html new file mode 100644 index 0000000..9b7a438 --- /dev/null +++ b/siro_rider/packages/get_storage/example/web/index.html @@ -0,0 +1,33 @@ + + + + + + + + + + + + + + + + + example + + + + + + + + diff --git a/siro_rider/packages/get_storage/example/web/manifest.json b/siro_rider/packages/get_storage/example/web/manifest.json new file mode 100644 index 0000000..8c01291 --- /dev/null +++ b/siro_rider/packages/get_storage/example/web/manifest.json @@ -0,0 +1,23 @@ +{ + "name": "example", + "short_name": "example", + "start_url": ".", + "display": "standalone", + "background_color": "#0175C2", + "theme_color": "#0175C2", + "description": "A new Flutter project.", + "orientation": "portrait-primary", + "prefer_related_applications": false, + "icons": [ + { + "src": "icons/Icon-192.png", + "sizes": "192x192", + "type": "image/png" + }, + { + "src": "icons/Icon-512.png", + "sizes": "512x512", + "type": "image/png" + } + ] +} diff --git a/siro_rider/packages/get_storage/lib/get_storage.dart b/siro_rider/packages/get_storage/lib/get_storage.dart new file mode 100644 index 0000000..62c381a --- /dev/null +++ b/siro_rider/packages/get_storage/lib/get_storage.dart @@ -0,0 +1,5 @@ +library get_storage; + +export 'package:get_storage/src/read_write_value.dart'; +export 'package:get_storage/src/storage_impl.dart'; +export 'package:get_storage/src/value.dart'; diff --git a/siro_rider/packages/get_storage/lib/src/read_write_value.dart b/siro_rider/packages/get_storage/lib/src/read_write_value.dart new file mode 100644 index 0000000..47a53dd --- /dev/null +++ b/siro_rider/packages/get_storage/lib/src/read_write_value.dart @@ -0,0 +1,32 @@ +import 'package:get_storage/src/storage_impl.dart'; + +typedef StorageFactory = GetStorage Function(); + +class ReadWriteValue { + final String key; + final T defaultValue; + final StorageFactory? getBox; + // final EncodeObject encoder; + + ReadWriteValue( + this.key, + this.defaultValue, [ + this.getBox, + // this.encoder, + ]); + + GetStorage _getRealBox() => getBox?.call() ?? GetStorage(); + + T get val => _getRealBox().read(key) ?? defaultValue; + set val(T newVal) => _getRealBox().write(key, newVal); +} + +extension Data on T { + ReadWriteValue val( + String valueKey, { + StorageFactory? getBox, + T? defVal, + }) { + return ReadWriteValue(valueKey, defVal ?? this, getBox); + } +} diff --git a/siro_rider/packages/get_storage/lib/src/storage/html.dart b/siro_rider/packages/get_storage/lib/src/storage/html.dart new file mode 100644 index 0000000..c6ccee2 --- /dev/null +++ b/siro_rider/packages/get_storage/lib/src/storage/html.dart @@ -0,0 +1,100 @@ +import 'dart:async'; +import 'dart:convert'; +// ignore: avoid_web_libraries_in_flutter +import 'dart:html' as html; +import '../value.dart'; + +class StorageImpl { + StorageImpl(this.fileName, [this.path]); + html.Storage get localStorage => html.window.localStorage; + + final String? path; + final String fileName; + + ValueStorage> subject = + ValueStorage>({}); + + void clear() { + localStorage.remove(fileName); + subject.value.clear(); + + subject + ..value.clear() + ..changeValue("", null); + } + + Future _exists() async { + return localStorage.containsKey(fileName); + } + + Future flush() { + return _writeToStorage(subject.value); + } + + T? read(String key) { + return subject.value[key] as T?; + } + + T getKeys() { + return subject.value.keys as T; + } + + T getValues() { + return subject.value.values as T; + } + + Future init([Map? initialData]) async { + subject.value = initialData ?? {}; + if (await _exists()) { + await _readFromStorage(); + } else { + await _writeToStorage(subject.value); + } + return; + } + + void remove(String key) { + subject + ..value.remove(key) + ..changeValue(key, null); + // return _writeToStorage(subject.value); + } + + void write(String key, dynamic value) { + subject + ..value[key] = value + ..changeValue(key, value); + //return _writeToStorage(subject.value); + } + + // void writeInMemory(String key, dynamic value) { + + // } + + Future _writeToStorage(Map data) async { + localStorage.update(fileName, (val) => json.encode(subject.value), + ifAbsent: () => json.encode(subject.value)); + } + + Future _readFromStorage() async { + final dataFromLocal = localStorage.entries.firstWhereOrNull( + (value) { + return value.key == fileName; + }, + ); + if (dataFromLocal != null) { + subject.value = json.decode(dataFromLocal.value) as Map; + } else { + await _writeToStorage({}); + } + } +} + +extension FirstWhereExt on Iterable { + T? firstWhereOrNull(bool Function(T element) test) { + for (var element in this) { + if (test(element)) return element; + } + return null; + } +} diff --git a/siro_rider/packages/get_storage/lib/src/storage/io.dart b/siro_rider/packages/get_storage/lib/src/storage/io.dart new file mode 100644 index 0000000..cc200cc --- /dev/null +++ b/siro_rider/packages/get_storage/lib/src/storage/io.dart @@ -0,0 +1,153 @@ +import 'dart:async'; +import 'dart:convert'; +import 'dart:io'; +import 'dart:typed_data'; + +import 'package:get/get.dart'; +import 'package:path_provider/path_provider.dart'; + +import '../value.dart'; + +class StorageImpl { + StorageImpl(this.fileName, [this.path]); + + final String? path; + final String fileName; + + final ValueStorage> subject = + ValueStorage>({}); + + RandomAccessFile? _randomAccessfile; + + void clear() async { + subject + ..value.clear() + ..changeValue("", null); + } + + Future deleteBox() async { + final box = await _fileDb(isBackup: false); + final backup = await _fileDb(isBackup: true); + await Future.wait([box.delete(), backup.delete()]); + } + + Future flush() async { + final buffer = utf8.encode(json.encode(subject.value)); + final length = buffer.length; + RandomAccessFile _file = await _getRandomFile(); + + _randomAccessfile = await _file.lock(); + _randomAccessfile = await _randomAccessfile!.setPosition(0); + _randomAccessfile = await _randomAccessfile!.writeFrom(buffer); + _randomAccessfile = await _randomAccessfile!.truncate(length); + _randomAccessfile = await _file.unlock(); + _madeBackup(); + } + + void _madeBackup() { + _getFile(true).then( + (value) => value.writeAsString( + json.encode(subject.value), + flush: true, + ), + ); + } + + T? read(String key) { + return subject.value[key] as T?; + } + + T getKeys() { + return subject.value.keys as T; + } + + T getValues() { + return subject.value.values as T; + } + + Future init([Map? initialData]) async { + subject.value = initialData ?? {}; + + RandomAccessFile _file = await _getRandomFile(); + return _file.lengthSync() == 0 ? flush() : _readFile(); + } + + void remove(String key) { + subject + ..value.remove(key) + ..changeValue(key, null); + } + + void write(String key, dynamic value) { + subject + ..value[key] = value + ..changeValue(key, value); + } + + Future _readFile() async { + try { + RandomAccessFile _file = await _getRandomFile(); + _file = await _file.setPosition(0); + final buffer = new Uint8List(await _file.length()); + await _file.readInto(buffer); + subject.value = json.decode(utf8.decode(buffer)); + } catch (e) { + Get.log('Corrupted box, recovering backup file', isError: true); + final _file = await _getFile(true); + + final content = await _file.readAsString() + ..trim(); + + if (content.isEmpty) { + subject.value = {}; + } else { + try { + subject.value = (json.decode(content) as Map?) ?? {}; + } catch (e) { + Get.log('Can not recover Corrupted box', isError: true); + subject.value = {}; + } + } + flush(); + } + } + + Future _getRandomFile() async { + if (_randomAccessfile != null) return _randomAccessfile!; + final fileDb = await _getFile(false); + _randomAccessfile = await fileDb.open(mode: FileMode.append); + + return _randomAccessfile!; + } + + Future _getFile(bool isBackup) async { + final fileDb = await _fileDb(isBackup: isBackup); + if (!fileDb.existsSync()) { + fileDb.createSync(recursive: true); + } + return fileDb; + } + + Future _fileDb({required bool isBackup}) async { + final dir = await _getImplicitDir(); + final _path = await _getPath(isBackup, path ?? dir.path); + final _file = File(_path); + return _file; + } + + Future _getImplicitDir() async { + try { + return getApplicationDocumentsDirectory(); + } catch (err) { + throw err; + } + } + + Future _getPath(bool isBackup, String? path) async { + final _isWindows = GetPlatform.isWindows; + final _separator = _isWindows ? '\\' : '/'; + return isBackup + ? '$path$_separator$fileName.bak' + : '$path$_separator$fileName.gs'; + } +} diff --git a/siro_rider/packages/get_storage/lib/src/storage_impl.dart b/siro_rider/packages/get_storage/lib/src/storage_impl.dart new file mode 100644 index 0000000..d0d95c3 --- /dev/null +++ b/siro_rider/packages/get_storage/lib/src/storage_impl.dart @@ -0,0 +1,182 @@ +import 'dart:async'; + +import 'package:flutter/widgets.dart'; +import 'package:get/utils.dart'; + +import 'storage/html.dart' if (dart.library.io) 'storage/io.dart'; +import 'value.dart'; + +/// Instantiate GetStorage to access storage driver apis +class GetStorage { + factory GetStorage( + [String container = 'GetStorage', + String? path, + Map? initialData]) { + if (_sync.containsKey(container)) { + return _sync[container]!; + } else { + final instance = GetStorage._internal(container, path, initialData); + _sync[container] = instance; + return instance; + } + } + + GetStorage._internal(String key, + [String? path, Map? initialData]) { + _concrete = StorageImpl(key, path); + _initialData = initialData; + + initStorage = Future(() async { + await _init(); + return true; + }); + } + + static final Map _sync = {}; + + final microtask = Microtask(); + + /// Start the storage drive. It's important to use await before calling this API, or side effects will occur. + static Future init([String container = 'GetStorage']) { + WidgetsFlutterBinding.ensureInitialized(); + return GetStorage(container).initStorage; + } + + Future _init() async { + try { + await _concrete.init(_initialData); + } catch (err) { + throw err; + } + } + + /// Reads a value in your container with the given key. + T? read(String key) { + return _concrete.read(key); + } + + T getKeys() { + return _concrete.getKeys(); + } + + T getValues() { + return _concrete.getValues(); + } + + /// return data true if value is different of null; + bool hasData(String key) { + return (read(key) == null ? false : true); + } + + Map get changes => _concrete.subject.changes; + + /// Listen changes in your container + VoidCallback listen(VoidCallback value) { + return _concrete.subject.addListener(value); + } + + Map _keyListeners = {}; + + VoidCallback listenKey(String key, ValueSetter callback) { + final VoidCallback listen = () { + if (changes.keys.first == key) { + callback(changes[key]); + } + }; + + _keyListeners[callback] = listen; + return _concrete.subject.addListener(listen); + } + + // /// Remove listen of your container + // void removeKeyListen(Function(Map) callback) { + // _concrete.subject.removeListener(_keyListeners[callback]); + // } + + // /// Remove listen of your container + // void removeListen(void Function() listener) { + // _concrete.subject.removeListener(listener); + // } + + /// Write data on your container + Future write(String key, dynamic value) async { + writeInMemory(key, value); + // final _encoded = json.encode(value); + // await _concrete.write(key, json.decode(_encoded)); + + return _tryFlush(); + } + + void writeInMemory(String key, dynamic value) { + _concrete.write(key, value); + } + + /// Write data on your only if data is null + Future writeIfNull(String key, dynamic value) async { + if (read(key) != null) return; + return write(key, value); + } + + /// remove data from container by key + Future remove(String key) async { + _concrete.remove(key); + return _tryFlush(); + } + + /// clear all data on your container + Future erase() async { + _concrete.clear(); + return _tryFlush(); + } + + Future save() async { + return _tryFlush(); + } + + Future _tryFlush() async { + return microtask.exec(_addToQueue); + } + + Future _addToQueue() { + return queue.add(_flush); + } + + Future _flush() async { + try { + await _concrete.flush(); + } catch (e) { + rethrow; + } + return; + } + + late StorageImpl _concrete; + + GetQueue queue = GetQueue(); + + /// listenable of container + ValueStorage> get listenable => _concrete.subject; + + /// Start the storage drive. Important: use await before calling this api, or side effects will happen. + late Future initStorage; + + Map? _initialData; +} + +class Microtask { + int _version = 0; + int _microtask = 0; + + void exec(Function callback) { + if (_microtask == _version) { + _microtask++; + scheduleMicrotask(() { + _version++; + _microtask = _version; + callback(); + }); + } + } +} + +typedef KeyCallback = Function(String); diff --git a/siro_rider/packages/get_storage/lib/src/value.dart b/siro_rider/packages/get_storage/lib/src/value.dart new file mode 100644 index 0000000..7a55ccd --- /dev/null +++ b/siro_rider/packages/get_storage/lib/src/value.dart @@ -0,0 +1,28 @@ +import 'package:flutter/widgets.dart'; +import 'package:get/state_manager.dart'; + +class ValueStorage { + ValueStorage(T value) : this._value = Value(value); + + final Value _value; + + Map changes = {}; + + void changeValue(String key, dynamic value) { + changes = {key: value}; + // ignore: invalid_use_of_protected_member + _value.refresh(); + } + + T get value => _value.value; + + set value(T value) { + _value.value = value; + } + + VoidCallback addListener(VoidCallback callback) { + _value.addListener(callback); + + return () => _value.removeListener(callback); + } +} diff --git a/siro_rider/packages/get_storage/pubspec.lock b/siro_rider/packages/get_storage/pubspec.lock new file mode 100644 index 0000000..fab9da8 --- /dev/null +++ b/siro_rider/packages/get_storage/pubspec.lock @@ -0,0 +1,405 @@ +# Generated by pub +# See https://dart.dev/tools/pub/glossary#lockfile +packages: + args: + dependency: transitive + description: + name: args + sha256: d0481093c50b1da8910eb0bb301626d4d8eb7284aa739614d2b394ee09e3ea04 + url: "https://pub.dev" + source: hosted + version: "2.7.0" + async: + dependency: transitive + description: + name: async + sha256: e2eb0491ba5ddb6177742d2da23904574082139b07c1e33b8503b9f46f3e1a37 + url: "https://pub.dev" + source: hosted + version: "2.13.1" + boolean_selector: + dependency: transitive + description: + name: boolean_selector + sha256: "8aab1771e1243a5063b8b0ff68042d67334e3feab9e95b9490f9a6ebf73b42ea" + url: "https://pub.dev" + source: hosted + version: "2.1.2" + characters: + dependency: transitive + description: + name: characters + sha256: faf38497bda5ead2a8c7615f4f7939df04333478bf32e4173fcb06d428b5716b + url: "https://pub.dev" + source: hosted + version: "1.4.1" + clock: + dependency: transitive + description: + name: clock + sha256: fddb70d9b5277016c77a80201021d40a2247104d9f4aa7bab7157b7e3f05b84b + url: "https://pub.dev" + source: hosted + version: "1.1.2" + code_assets: + dependency: transitive + description: + name: code_assets + sha256: "83ccdaa064c980b5596c35dd64a8d3ecc68620174ab9b90b6343b753aa721687" + url: "https://pub.dev" + source: hosted + version: "1.0.0" + collection: + dependency: transitive + description: + name: collection + sha256: "2f5709ae4d3d59dd8f7cd309b4e023046b57d8a6c82130785d2b0e5868084e76" + url: "https://pub.dev" + source: hosted + version: "1.19.1" + crypto: + dependency: transitive + description: + name: crypto + sha256: c8ea0233063ba03258fbcf2ca4d6dadfefe14f02fab57702265467a19f27fadf + url: "https://pub.dev" + source: hosted + version: "3.0.7" + fake_async: + dependency: transitive + description: + name: fake_async + sha256: "5368f224a74523e8d2e7399ea1638b37aecfca824a3cc4dfdf77bf1fa905ac44" + url: "https://pub.dev" + source: hosted + version: "1.3.3" + ffi: + dependency: transitive + description: + name: ffi + sha256: "6d7fd89431262d8f3125e81b50d3847a091d846eafcd4fdb88dd06f36d705a45" + url: "https://pub.dev" + source: hosted + version: "2.2.0" + file: + dependency: transitive + description: + name: file + sha256: a3b4f84adafef897088c160faf7dfffb7696046cb13ae90b508c2cbc95d3b8d4 + url: "https://pub.dev" + source: hosted + version: "7.0.1" + flutter: + dependency: "direct main" + description: flutter + source: sdk + version: "0.0.0" + flutter_test: + dependency: "direct dev" + description: flutter + source: sdk + version: "0.0.0" + get: + dependency: "direct main" + description: + name: get + sha256: "5ed34a7925b85336e15d472cc4cfe7d9ebf4ab8e8b9f688585bf6b50f4c3d79a" + url: "https://pub.dev" + source: hosted + version: "4.7.3" + glob: + dependency: transitive + description: + name: glob + sha256: c3f1ee72c96f8f78935e18aa8cecced9ab132419e8625dc187e1c2408efc20de + url: "https://pub.dev" + source: hosted + version: "2.1.3" + hooks: + dependency: transitive + description: + name: hooks + sha256: e79ed1e8e1929bc6ecb6ec85f0cb519c887aa5b423705ded0d0f2d9226def388 + url: "https://pub.dev" + source: hosted + version: "1.0.2" + jni: + dependency: transitive + description: + name: jni + sha256: c2230682d5bc2362c1c9e8d3c7f406d9cbba23ab3f2e203a025dd47e0fb2e68f + url: "https://pub.dev" + source: hosted + version: "1.0.0" + jni_flutter: + dependency: transitive + description: + name: jni_flutter + sha256: "8b59e590786050b1cd866677dddaf76b1ade5e7bc751abe04b86e84d379d3ba6" + url: "https://pub.dev" + source: hosted + version: "1.0.1" + leak_tracker: + dependency: transitive + description: + name: leak_tracker + sha256: "33e2e26bdd85a0112ec15400c8cbffea70d0f9c3407491f672a2fad47915e2de" + url: "https://pub.dev" + source: hosted + version: "11.0.2" + leak_tracker_flutter_testing: + dependency: transitive + description: + name: leak_tracker_flutter_testing + sha256: "1dbc140bb5a23c75ea9c4811222756104fbcd1a27173f0c34ca01e16bea473c1" + url: "https://pub.dev" + source: hosted + version: "3.0.10" + leak_tracker_testing: + dependency: transitive + description: + name: leak_tracker_testing + sha256: "8d5a2d49f4a66b49744b23b018848400d23e54caf9463f4eb20df3eb8acb2eb1" + url: "https://pub.dev" + source: hosted + version: "3.0.2" + logging: + dependency: transitive + description: + name: logging + sha256: c8245ada5f1717ed44271ed1c26b8ce85ca3228fd2ffdb75468ab01979309d61 + url: "https://pub.dev" + source: hosted + version: "1.3.0" + matcher: + dependency: transitive + description: + name: matcher + sha256: "12956d0ad8390bbcc63ca2e1469c0619946ccb52809807067a7020d57e647aa6" + url: "https://pub.dev" + source: hosted + version: "0.12.18" + material_color_utilities: + dependency: transitive + description: + name: material_color_utilities + sha256: "9c337007e82b1889149c82ed242ed1cb24a66044e30979c44912381e9be4c48b" + url: "https://pub.dev" + source: hosted + version: "0.13.0" + meta: + dependency: transitive + description: + name: meta + sha256: "23f08335362185a5ea2ad3a4e597f1375e78bce8a040df5c600c8d3552ef2394" + url: "https://pub.dev" + source: hosted + version: "1.17.0" + native_toolchain_c: + dependency: transitive + description: + name: native_toolchain_c + sha256: "6ba77bb18063eebe9de401f5e6437e95e1438af0a87a3a39084fbd37c90df572" + url: "https://pub.dev" + source: hosted + version: "0.17.6" + objective_c: + dependency: transitive + description: + name: objective_c + sha256: "100a1c87616ab6ed41ec263b083c0ef3261ee6cd1dc3b0f35f8ddfa4f996fe52" + url: "https://pub.dev" + source: hosted + version: "9.3.0" + package_config: + dependency: transitive + description: + name: package_config + sha256: f096c55ebb7deb7e384101542bfba8c52696c1b56fca2eb62827989ef2353bbc + url: "https://pub.dev" + source: hosted + version: "2.2.0" + path: + dependency: transitive + description: + name: path + sha256: "75cca69d1490965be98c73ceaea117e8a04dd21217b37b292c9ddbec0d955bc5" + url: "https://pub.dev" + source: hosted + version: "1.9.1" + path_provider: + dependency: "direct main" + description: + name: path_provider + sha256: "50c5dd5b6e1aaf6fb3a78b33f6aa3afca52bf903a8a5298f53101fdaee55bbcd" + url: "https://pub.dev" + source: hosted + version: "2.1.5" + path_provider_android: + dependency: transitive + description: + name: path_provider_android + sha256: "69cbd515a62b94d32a7944f086b2f82b4ac40a1d45bebfc00813a430ab2dabcd" + url: "https://pub.dev" + source: hosted + version: "2.3.1" + path_provider_foundation: + dependency: transitive + description: + name: path_provider_foundation + sha256: "2a376b7d6392d80cd3705782d2caa734ca4727776db0b6ec36ef3f1855197699" + url: "https://pub.dev" + source: hosted + version: "2.6.0" + path_provider_linux: + dependency: transitive + description: + name: path_provider_linux + sha256: f7a1fe3a634fe7734c8d3f2766ad746ae2a2884abe22e241a8b301bf5cac3279 + url: "https://pub.dev" + source: hosted + version: "2.2.1" + path_provider_platform_interface: + dependency: transitive + description: + name: path_provider_platform_interface + sha256: "88f5779f72ba699763fa3a3b06aa4bf6de76c8e5de842cf6f29e2e06476c2334" + url: "https://pub.dev" + source: hosted + version: "2.1.2" + path_provider_windows: + dependency: transitive + description: + name: path_provider_windows + sha256: bd6f00dbd873bfb70d0761682da2b3a2c2fccc2b9e84c495821639601d81afe7 + url: "https://pub.dev" + source: hosted + version: "2.3.0" + platform: + dependency: transitive + description: + name: platform + sha256: "5d6b1b0036a5f331ebc77c850ebc8506cbc1e9416c27e59b439f917a902a4984" + url: "https://pub.dev" + source: hosted + version: "3.1.6" + plugin_platform_interface: + dependency: transitive + description: + name: plugin_platform_interface + sha256: "4820fbfdb9478b1ebae27888254d445073732dae3d6ea81f0b7e06d5dedc3f02" + url: "https://pub.dev" + source: hosted + version: "2.1.8" + pub_semver: + dependency: transitive + description: + name: pub_semver + sha256: "5bfcf68ca79ef689f8990d1160781b4bad40a3bd5e5218ad4076ddb7f4081585" + url: "https://pub.dev" + source: hosted + version: "2.2.0" + sky_engine: + dependency: transitive + description: flutter + source: sdk + version: "0.0.0" + source_span: + dependency: transitive + description: + name: source_span + sha256: "56a02f1f4cd1a2d96303c0144c93bd6d909eea6bee6bf5a0e0b685edbd4c47ab" + url: "https://pub.dev" + source: hosted + version: "1.10.2" + stack_trace: + dependency: transitive + description: + name: stack_trace + sha256: "8b27215b45d22309b5cddda1aa2b19bdfec9df0e765f2de506401c071d38d1b1" + url: "https://pub.dev" + source: hosted + version: "1.12.1" + stream_channel: + dependency: transitive + description: + name: stream_channel + sha256: "969e04c80b8bcdf826f8f16579c7b14d780458bd97f56d107d3950fdbeef059d" + url: "https://pub.dev" + source: hosted + version: "2.1.4" + string_scanner: + dependency: transitive + description: + name: string_scanner + sha256: "921cd31725b72fe181906c6a94d987c78e3b98c2e205b397ea399d4054872b43" + url: "https://pub.dev" + source: hosted + version: "1.4.1" + term_glyph: + dependency: transitive + description: + name: term_glyph + sha256: "7f554798625ea768a7518313e58f83891c7f5024f88e46e7182a4558850a4b8e" + url: "https://pub.dev" + source: hosted + version: "1.2.2" + test_api: + dependency: transitive + description: + name: test_api + sha256: "93167629bfc610f71560ab9312acdda4959de4df6fac7492c89ff0d3886f6636" + url: "https://pub.dev" + source: hosted + version: "0.7.9" + typed_data: + dependency: transitive + description: + name: typed_data + sha256: f9049c039ebfeb4cf7a7104a675823cd72dba8297f264b6637062516699fa006 + url: "https://pub.dev" + source: hosted + version: "1.4.0" + vector_math: + dependency: transitive + description: + name: vector_math + sha256: d530bd74fea330e6e364cda7a85019c434070188383e1cd8d9777ee586914c5b + url: "https://pub.dev" + source: hosted + version: "2.2.0" + vm_service: + dependency: transitive + description: + name: vm_service + sha256: "046d3928e16fa4dc46e8350415661755ab759d9fc97fc21b5ab295f71e4f0499" + url: "https://pub.dev" + source: hosted + version: "15.1.0" + web: + dependency: transitive + description: + name: web + sha256: "868d88a33d8a87b18ffc05f9f030ba328ffefba92d6c127917a2ba740f9cfe4a" + url: "https://pub.dev" + source: hosted + version: "1.1.1" + xdg_directories: + dependency: transitive + description: + name: xdg_directories + sha256: "7a3f37b05d989967cdddcbb571f1ea834867ae2faa29725fd085180e0883aa15" + url: "https://pub.dev" + source: hosted + version: "1.1.0" + yaml: + dependency: transitive + description: + name: yaml + sha256: b9da305ac7c39faa3f030eccd175340f968459dae4af175130b3fc47e40d76ce + url: "https://pub.dev" + source: hosted + version: "3.1.3" +sdks: + dart: ">=3.10.3 <4.0.0" + flutter: ">=3.38.4" diff --git a/siro_rider/packages/get_storage/pubspec.yaml b/siro_rider/packages/get_storage/pubspec.yaml new file mode 100644 index 0000000..ea7fa2a --- /dev/null +++ b/siro_rider/packages/get_storage/pubspec.yaml @@ -0,0 +1,53 @@ +name: get_storage +description: A fast, extra light and synchronous key-value storage written entirely in Dart +version: 2.1.1 +homepage: https://github.com/jonataslaw/get_storage + +environment: + sdk: ">=2.16.0 <4.0.0" + +dependencies: + flutter: + sdk: flutter + get: ">=4.0.0 <6.0.0" + path_provider: ^2.0.1 + #platform_info: ^3.0.0-nullsafety.1 + +dev_dependencies: + flutter_test: + sdk: flutter + +# For information on the generic Dart part of this file, see the +# following page: https://dart.dev/tools/pub/pubspec + +# The following section is specific to Flutter. +flutter: + # To add assets to your package, add an assets section, like this: + # assets: + # - images/a_dot_burr.jpeg + # - images/a_dot_ham.jpeg + # + # For details regarding assets in packages, see + # https://flutter.dev/assets-and-images/#from-packages + # + # An image asset can refer to one or more resolution-specific "variants", see + # https://flutter.dev/assets-and-images/#resolution-aware. + # To add custom fonts to your package, add a fonts section here, + # in this "flutter" section. Each entry in this list should have a + # "family" key with the font family name, and a "fonts" key with a + # list giving the asset and other descriptors for the font. For + # example: + # fonts: + # - family: Schyler + # fonts: + # - asset: fonts/Schyler-Regular.ttf + # - asset: fonts/Schyler-Italic.ttf + # style: italic + # - family: Trajan Pro + # fonts: + # - asset: fonts/TrajanPro.ttf + # - asset: fonts/TrajanPro_Bold.ttf + # weight: 700 + # + # For details regarding fonts in packages, see + # https://flutter.dev/custom-fonts/#from-packages diff --git a/siro_rider/packages/get_storage/read.png b/siro_rider/packages/get_storage/read.png new file mode 100644 index 0000000..9454dd0 Binary files /dev/null and b/siro_rider/packages/get_storage/read.png differ diff --git a/siro_rider/packages/get_storage/test/getstorage_test.dart b/siro_rider/packages/get_storage/test/getstorage_test.dart new file mode 100644 index 0000000..0bfcf99 --- /dev/null +++ b/siro_rider/packages/get_storage/test/getstorage_test.dart @@ -0,0 +1,155 @@ +import 'dart:io'; + +import 'package:flutter/services.dart'; +import 'package:flutter_test/flutter_test.dart'; +import 'package:get_storage/src/storage_impl.dart'; +import 'package:get_storage/src/read_write_value.dart'; +import 'package:path_provider/path_provider.dart'; + +import 'utils/list_equality.dart'; + +void main() async { + TestWidgetsFlutterBinding.ensureInitialized(); + + late GetStorage g; + + const channel = MethodChannel('plugins.flutter.io/path_provider'); + void setUpMockChannels(MethodChannel channel) { + TestDefaultBinaryMessengerBinding.instance?.defaultBinaryMessenger + .setMockMethodCallHandler( + channel, + (MethodCall? methodCall) async { + if (methodCall?.method == 'getApplicationDocumentsDirectory') { + return '.'; + } + return null; + }, + ); + } + + setUpAll(() async { + setUpMockChannels(channel); + }); + + setUp(() async { + await GetStorage.init(); + g = GetStorage(); + await g.erase(); + }); + + test('write, read listen, e removeListen', () async { + String valueListen = ""; + g.write('test', 'a'); + g.write('test2', 'a'); + + final removeListen = g.listenKey('test', (val) { + valueListen = val; + }); + + expect('a', g.read('test')); + + await g.write('test', 'b'); + expect('b', g.read('test')); + expect('b', valueListen); + + removeListen(); + + await g.write('test', 'c'); + + expect('c', g.read('test')); + expect('b', valueListen); + await g.write('test', 'd'); + + expect('d', g.read('test')); + }); + + test('Write and read', () { + var list = new List.generate(50, (i) { + int count = i + 1; + g.write('write', count); + return count; + }); + + expect(list.last, g.read('write')); + }); + + test('Test backup and recover corrupted file', () async { + await g.write('write', 'abc'); + expect('abc', g.read('write')); + + final file = await _fileDb(); + file.writeAsStringSync('ndj323e'); + await GetStorage.init(); + + expect('abc', g.read('write')); + }); + + test('Write and read using delegate', () { + final data = 0.val('write'); + var list = new List.generate(50, (i) { + int count = i + 1; + data.val = count; + return count; + }); + + expect(list.last, data.val); + }); + + test('Write, read, remove and exists', () { + expect(null, g.read('write')); + + var list = new List.generate(50, (i) { + int count = i + 1; + g.write('write', count); + return count; + }); + expect(list.last, g.read('write')); + g.remove('write'); + expect(null, g.read('write')); + }); + + test('newContainer', () async { + final container1 = await GetStorage.init('container1'); + await GetStorage.init('newContainer'); + final newContainer = GetStorage('newContainer'); + + /// Attempting to start a Container that has already started must return the container already created. + var container2 = await GetStorage.init(); + expect(container1 == container2, true); + + newContainer.write('test', '1234'); + g.write('test', 'a'); + expect(g.read('test') == newContainer.read('test'), false); + }); + + group('get keys/values', () { + Function(Iterable, List) eq = + (i, l) => const ListEquality().equals(i.toList(), l); + + test('should return their stored dynamic values', () { + expect(eq(g.getKeys().toList(), []), true); + expect(eq(g.getValues().toList(), []), true); + + g.write('key1', 1); + expect(eq(g.getKeys(), ['key1']), true); + expect(eq(g.getValues(), [1]), true); + + g.write('key2', 'a'); + expect(eq(g.getKeys(), ['key1', 'key2']), true); + expect(eq(g.getValues(), [1, 'a']), true); + + g.write('key3', 3.0); + expect(eq(g.getKeys(), ['key1', 'key2', 'key3']), true); + expect(eq(g.getValues(), [1, 'a', 3.0]), true); + }); + }); +} + +Future _fileDb( + {bool isBackup = false, String fileName = 'GetStorage'}) async { + final dir = await getApplicationDocumentsDirectory(); + final _path = dir.path; + final _file = + isBackup ? File('$_path/$fileName.bak') : File('$_path/$fileName.gs'); + return _file; +} diff --git a/siro_rider/packages/get_storage/test/utils/list_equality.dart b/siro_rider/packages/get_storage/test/utils/list_equality.dart new file mode 100644 index 0000000..fa19bad --- /dev/null +++ b/siro_rider/packages/get_storage/test/utils/list_equality.dart @@ -0,0 +1,71 @@ +const int _HASH_MASK = 0x7fffffff; + +class ListEquality implements Equality> { + final Equality _elementEquality; + const ListEquality([Equality elementEquality = const DefaultEquality()]) + : _elementEquality = elementEquality; + + @override + bool equals(List list1, List list2) { + if (identical(list1, list2)) return true; + + var length = list1.length; + if (length != list2.length) return false; + for (var i = 0; i < length; i++) { + if (!_elementEquality.equals(list1[i], list2[i])) return false; + } + return true; + } + + @override + int hash(List list) { + // Jenkins's one-at-a-time hash function. + // This code is almost identical to the one in IterableEquality, except + // that it uses indexing instead of iterating to get the elements. + var hash = 0; + for (var i = 0; i < list.length; i++) { + var c = _elementEquality.hash(list[i]); + hash = (hash + c) & _HASH_MASK; + hash = (hash + (hash << 10)) & _HASH_MASK; + hash ^= (hash >> 6); + } + hash = (hash + (hash << 3)) & _HASH_MASK; + hash ^= (hash >> 11); + hash = (hash + (hash << 15)) & _HASH_MASK; + return hash; + } + + @override + bool isValidKey(Object o) => o is List; +} + +abstract class Equality { + const factory Equality() = DefaultEquality; + + /// Compare two elements for being equal. + /// + /// This should be a proper equality relation. + bool equals(E e1, E e2); + + /// Get a hashcode of an element. + /// + /// The hashcode should be compatible with [equals], so that if + /// `equals(a, b)` then `hash(a) == hash(b)`. + int hash(E e); + + /// Test whether an object is a valid argument to [equals] and [hash]. + /// + /// Some implementations may be restricted to only work on specific types + /// of objects. + bool isValidKey(Object o); +} + +class DefaultEquality implements Equality { + const DefaultEquality(); + @override + bool equals(Object? e1, Object? e2) => e1 == e2; + @override + int hash(Object? e) => e.hashCode; + @override + bool isValidKey(Object o) => true; +} diff --git a/siro_rider/packages/get_storage/write.png b/siro_rider/packages/get_storage/write.png new file mode 100644 index 0000000..ee1ebdb Binary files /dev/null and b/siro_rider/packages/get_storage/write.png differ diff --git a/siro_rider/pubspec.lock b/siro_rider/pubspec.lock new file mode 100644 index 0000000..c32d4b6 --- /dev/null +++ b/siro_rider/pubspec.lock @@ -0,0 +1,2294 @@ +# Generated by pub +# See https://dart.dev/tools/pub/glossary#lockfile +packages: + _fe_analyzer_shared: + dependency: transitive + description: + name: _fe_analyzer_shared + sha256: "8d7ff3948166b8ec5da0fbb5962000926b8e02f2ed9b3e51d1738905fbd4c98d" + url: "https://pub.dev" + source: hosted + version: "93.0.0" + _flutterfire_internals: + dependency: transitive + description: + name: _flutterfire_internals + sha256: "0d1f0adfabbab9f46a1a80ce84a4d8b852b6e4dbf53ce413b30e0cf7d3631b71" + url: "https://pub.dev" + source: hosted + version: "1.3.72" + analyzer: + dependency: transitive + description: + name: analyzer + sha256: de7148ed2fcec579b19f122c1800933dfa028f6d9fd38a152b04b1516cec120b + url: "https://pub.dev" + source: hosted + version: "10.0.1" + animated_text_kit: + dependency: "direct main" + description: + name: animated_text_kit + sha256: "1d41486860885321972dd332179357a535d50d4780fc2ba5e1805bde085c81f2" + url: "https://pub.dev" + source: hosted + version: "4.3.0" + app_links: + dependency: "direct main" + description: + name: app_links + sha256: "3462d9defc61565fde4944858b59bec5be2b9d5b05f20aed190adb3ad08a7abc" + url: "https://pub.dev" + source: hosted + version: "7.0.0" + app_links_linux: + dependency: transitive + description: + name: app_links_linux + sha256: f5f7173a78609f3dfd4c2ff2c95bd559ab43c80a87dc6a095921d96c05688c81 + url: "https://pub.dev" + source: hosted + version: "1.0.3" + app_links_platform_interface: + dependency: transitive + description: + name: app_links_platform_interface + sha256: "05f5379577c513b534a29ddea68176a4d4802c46180ee8e2e966257158772a3f" + url: "https://pub.dev" + source: hosted + version: "2.0.2" + app_links_web: + dependency: transitive + description: + name: app_links_web + sha256: af060ed76183f9e2b87510a9480e56a5352b6c249778d07bd2c95fc35632a555 + url: "https://pub.dev" + source: hosted + version: "1.0.4" + archive: + dependency: transitive + description: + name: archive + sha256: a96e8b390886ee8abb49b7bd3ac8df6f451c621619f52a26e815fdcf568959ff + url: "https://pub.dev" + source: hosted + version: "4.0.9" + args: + dependency: transitive + description: + name: args + sha256: d0481093c50b1da8910eb0bb301626d4d8eb7284aa739614d2b394ee09e3ea04 + url: "https://pub.dev" + source: hosted + version: "2.7.0" + asn1lib: + dependency: "direct main" + description: + name: asn1lib + sha256: "9a8f69025044eb466b9b60ef3bc3ac99b4dc6c158ae9c56d25eeccf5bc56d024" + url: "https://pub.dev" + source: hosted + version: "1.6.5" + async: + dependency: transitive + description: + name: async + sha256: e2eb0491ba5ddb6177742d2da23904574082139b07c1e33b8503b9f46f3e1a37 + url: "https://pub.dev" + source: hosted + version: "2.13.1" + audio_session: + dependency: transitive + description: + name: audio_session + sha256: "7217b229db57cc4dc577a8abb56b7429a5a212b978517a5be578704bfe5e568b" + url: "https://pub.dev" + source: hosted + version: "0.2.3" + boolean_selector: + dependency: transitive + description: + name: boolean_selector + sha256: "8aab1771e1243a5063b8b0ff68042d67334e3feab9e95b9490f9a6ebf73b42ea" + url: "https://pub.dev" + source: hosted + version: "2.1.2" + build: + dependency: transitive + description: + name: build + sha256: a156715e7cd728130c592f30552575908aae5b100005fbc1f0fb16b3c03a3d10 + url: "https://pub.dev" + source: hosted + version: "4.0.6" + build_config: + dependency: transitive + description: + name: build_config + sha256: "4070d2a59f8eec34c97c86ceb44403834899075f66e8a9d59706f8e7834f6f71" + url: "https://pub.dev" + source: hosted + version: "1.3.0" + build_daemon: + dependency: transitive + description: + name: build_daemon + sha256: bf05f6e12cfea92d3c09308d7bcdab1906cd8a179b023269eed00c071004b957 + url: "https://pub.dev" + source: hosted + version: "4.1.1" + build_runner: + dependency: "direct dev" + description: + name: build_runner + sha256: "1523ce62448ebac2c15a8ba5fbad8acac169788658a7dd2a1c2d9c2a9318b9a6" + url: "https://pub.dev" + source: hosted + version: "2.15.0" + built_collection: + dependency: transitive + description: + name: built_collection + sha256: "376e3dd27b51ea877c28d525560790aee2e6fbb5f20e2f85d5081027d94e2100" + url: "https://pub.dev" + source: hosted + version: "5.1.1" + built_value: + dependency: transitive + description: + name: built_value + sha256: "34e4067d30ce212937df995f03b69992eea683539ceeac7f679a1f1eba055b56" + url: "https://pub.dev" + source: hosted + version: "8.12.6" + cached_network_image: + dependency: transitive + description: + name: cached_network_image + sha256: "7c1183e361e5c8b0a0f21a28401eecdbde252441106a9816400dd4c2b2424916" + url: "https://pub.dev" + source: hosted + version: "3.4.1" + cached_network_image_platform_interface: + dependency: transitive + description: + name: cached_network_image_platform_interface + sha256: "35814b016e37fbdc91f7ae18c8caf49ba5c88501813f73ce8a07027a395e2829" + url: "https://pub.dev" + source: hosted + version: "4.1.1" + cached_network_image_web: + dependency: transitive + description: + name: cached_network_image_web + sha256: "980842f4e8e2535b8dbd3d5ca0b1f0ba66bf61d14cc3a17a9b4788a3685ba062" + url: "https://pub.dev" + source: hosted + version: "1.3.1" + calendar_builder: + dependency: "direct main" + description: + path: "packages/calendar_builder" + relative: true + source: path + version: "0.0.6" + characters: + dependency: transitive + description: + name: characters + sha256: faf38497bda5ead2a8c7615f4f7939df04333478bf32e4173fcb06d428b5716b + url: "https://pub.dev" + source: hosted + version: "1.4.1" + checked_yaml: + dependency: transitive + description: + name: checked_yaml + sha256: "959525d3162f249993882720d52b7e0c833978df229be20702b33d48d91de70f" + url: "https://pub.dev" + source: hosted + version: "2.0.4" + chewie: + dependency: transitive + description: + name: chewie + sha256: "53dadd2c5b6748742d7744072b38a417ad22691ca55715850300ee793dc7cb27" + url: "https://pub.dev" + source: hosted + version: "1.13.1" + cli_util: + dependency: transitive + description: + name: cli_util + sha256: ff6785f7e9e3c38ac98b2fb035701789de90154024a75b6cb926445e83197d1c + url: "https://pub.dev" + source: hosted + version: "0.4.2" + clock: + dependency: transitive + description: + name: clock + sha256: fddb70d9b5277016c77a80201021d40a2247104d9f4aa7bab7157b7e3f05b84b + url: "https://pub.dev" + source: hosted + version: "1.1.2" + code_assets: + dependency: transitive + description: + name: code_assets + sha256: bf394f466ba9205f1812a0433b392d6af280f155f56651eda7c18cc32ed493b8 + url: "https://pub.dev" + source: hosted + version: "1.2.1" + code_builder: + dependency: transitive + description: + name: code_builder + sha256: "6a6cab2ba4680d6423f34a9b972a4c9a94ebe1b62ecec4e1a1f2cba91fd1319d" + url: "https://pub.dev" + source: hosted + version: "4.11.1" + collection: + dependency: transitive + description: + name: collection + sha256: "2f5709ae4d3d59dd8f7cd309b4e023046b57d8a6c82130785d2b0e5868084e76" + url: "https://pub.dev" + source: hosted + version: "1.19.1" + connectivity_plus: + dependency: "direct main" + description: + name: connectivity_plus + sha256: b5e72753cf63becce2c61fd04dfe0f1c430cc5278b53a1342dc5ad839eab29ec + url: "https://pub.dev" + source: hosted + version: "6.1.5" + connectivity_plus_platform_interface: + dependency: transitive + description: + name: connectivity_plus_platform_interface + sha256: "3c09627c536d22fd24691a905cdd8b14520de69da52c7a97499c8be5284a32ed" + url: "https://pub.dev" + source: hosted + version: "2.1.0" + convert: + dependency: transitive + description: + name: convert + sha256: b30acd5944035672bc15c6b7a8b47d773e41e2f17de064350988c5d02adb1c68 + url: "https://pub.dev" + source: hosted + version: "3.1.2" + cross_file: + dependency: transitive + description: + name: cross_file + sha256: "28bb3ae56f117b5aec029d702a90f57d285cd975c3c5c281eaca38dbc47c5937" + url: "https://pub.dev" + source: hosted + version: "0.3.5+2" + crypto: + dependency: "direct main" + description: + name: crypto + sha256: c8ea0233063ba03258fbcf2ca4d6dadfefe14f02fab57702265467a19f27fadf + url: "https://pub.dev" + source: hosted + version: "3.0.7" + csslib: + dependency: transitive + description: + name: csslib + sha256: "09bad715f418841f976c77db72d5398dc1253c21fb9c0c7f0b0b985860b2d58e" + url: "https://pub.dev" + source: hosted + version: "1.0.2" + cupertino_icons: + dependency: "direct main" + description: + name: cupertino_icons + sha256: "41e005c33bd814be4d3096aff55b1908d419fde52ca656c8c47719ec745873cd" + url: "https://pub.dev" + source: hosted + version: "1.0.9" + dart_style: + dependency: transitive + description: + name: dart_style + sha256: "29f7ecc274a86d32920b1d9cfc7502fa87220da41ec60b55f329559d5732e2b2" + url: "https://pub.dev" + source: hosted + version: "3.1.7" + dart_webrtc: + dependency: transitive + description: + name: dart_webrtc + sha256: f6d615bddea5e458ce180a914f3055c234ffb52fb7397a51b3491e76d6d7edb2 + url: "https://pub.dev" + source: hosted + version: "1.8.1" + dbus: + dependency: transitive + description: + name: dbus + sha256: "0ce9b0a839e6dee59a37a623d2fc26a35bbbe6404213e419b0d6411023d62645" + url: "https://pub.dev" + source: hosted + version: "0.7.14" + device_info_plus: + dependency: "direct main" + description: + name: device_info_plus + sha256: b4fed1b2835da9d670d7bed7db79ae2a94b0f5ad6312268158a9b5479abbacdd + url: "https://pub.dev" + source: hosted + version: "12.4.0" + device_info_plus_platform_interface: + dependency: transitive + description: + name: device_info_plus_platform_interface + sha256: e1ea89119e34903dca74b883d0dd78eb762814f97fb6c76f35e9ff74d261a18f + url: "https://pub.dev" + source: hosted + version: "7.0.3" + dio: + dependency: "direct main" + description: + name: dio + sha256: aff32c08f92787a557dd5c0145ac91536481831a01b4648136373cddb0e64f8c + url: "https://pub.dev" + source: hosted + version: "5.9.2" + dio_web_adapter: + dependency: transitive + description: + name: dio_web_adapter + sha256: "2f9e64323a7c3c7ef69567d5c800424a11f8337b8b228bad02524c9fb3c1f340" + url: "https://pub.dev" + source: hosted + version: "2.1.2" + dotted_line: + dependency: "direct main" + description: + name: dotted_line + sha256: "8a07899b954d9f50f24a6d512ba7e8cc66c08c3c065ab037cc73c3e9c5c5a557" + url: "https://pub.dev" + source: hosted + version: "3.3.0" + encrypt: + dependency: "direct main" + description: + name: encrypt + sha256: "62d9aa4670cc2a8798bab89b39fc71b6dfbacf615de6cf5001fb39f7e4a996a2" + url: "https://pub.dev" + source: hosted + version: "5.0.3" + envied: + dependency: "direct main" + description: + name: envied + sha256: "42132a746494b0a7bc19062cdddd3a01694f696caca684456ff01526c833decc" + url: "https://pub.dev" + source: hosted + version: "1.3.5" + envied_generator: + dependency: "direct dev" + description: + name: envied_generator + sha256: e1e66498080f531e89d9ea7971f96b287dffdd05df16efdd31f9f74faa77e005 + url: "https://pub.dev" + source: hosted + version: "1.3.5" + equatable: + dependency: transitive + description: + name: equatable + sha256: "3e0141505477fd8ad55d6eb4e7776d3fe8430be8e497ccb1521370c3f21a3e2b" + url: "https://pub.dev" + source: hosted + version: "2.0.8" + fake_async: + dependency: transitive + description: + name: fake_async + sha256: "5368f224a74523e8d2e7399ea1638b37aecfca824a3cc4dfdf77bf1fa905ac44" + url: "https://pub.dev" + source: hosted + version: "1.3.3" + ffi: + dependency: transitive + description: + name: ffi + sha256: "6d7fd89431262d8f3125e81b50d3847a091d846eafcd4fdb88dd06f36d705a45" + url: "https://pub.dev" + source: hosted + version: "2.2.0" + file: + dependency: transitive + description: + name: file + sha256: a3b4f84adafef897088c160faf7dfffb7696046cb13ae90b508c2cbc95d3b8d4 + url: "https://pub.dev" + source: hosted + version: "7.0.1" + file_selector_linux: + dependency: transitive + description: + name: file_selector_linux + sha256: "2567f398e06ac72dcf2e98a0c95df2a9edd03c2c2e0cacd4780f20cdf56263a0" + url: "https://pub.dev" + source: hosted + version: "0.9.4" + file_selector_macos: + dependency: transitive + description: + name: file_selector_macos + sha256: "5e0bbe9c312416f1787a68259ea1505b52f258c587f12920422671807c4d618a" + url: "https://pub.dev" + source: hosted + version: "0.9.5" + file_selector_platform_interface: + dependency: transitive + description: + name: file_selector_platform_interface + sha256: "35e0bd61ebcdb91a3505813b055b09b79dfdc7d0aee9c09a7ba59ae4bb13dc85" + url: "https://pub.dev" + source: hosted + version: "2.7.0" + file_selector_windows: + dependency: transitive + description: + name: file_selector_windows + sha256: "62197474ae75893a62df75939c777763d39c2bc5f73ce5b88497208bc269abfd" + url: "https://pub.dev" + source: hosted + version: "0.9.3+5" + firebase_auth: + dependency: "direct main" + description: + name: firebase_auth + sha256: "9905a315f1235a649e29df19b246adde7350a11234837cd605254b8e25144711" + url: "https://pub.dev" + source: hosted + version: "6.5.2" + firebase_auth_platform_interface: + dependency: transitive + description: + name: firebase_auth_platform_interface + sha256: f757dc5636ce2b204a82383f7246ef0d9c925f9e96c8c9a4a6c315d673d662bb + url: "https://pub.dev" + source: hosted + version: "9.0.2" + firebase_auth_web: + dependency: transitive + description: + name: firebase_auth_web + sha256: "1c44330eef3c82068e0c2919b6b015897d49211dcccdf64f90a2ed73ce216ecb" + url: "https://pub.dev" + source: hosted + version: "6.2.2" + firebase_core: + dependency: "direct main" + description: + name: firebase_core + sha256: ec46a100a560d3bd5f97f2d89ba7492cb09b6dd0a4a28753d1258f360d6bd9f9 + url: "https://pub.dev" + source: hosted + version: "4.10.0" + firebase_core_platform_interface: + dependency: transitive + description: + name: firebase_core_platform_interface + sha256: "4a120366dbf7d5a8ee9438978530b664b855728fb8dcc3a201017660817e555b" + url: "https://pub.dev" + source: hosted + version: "7.0.1" + firebase_core_web: + dependency: transitive + description: + name: firebase_core_web + sha256: "5ad1be848692ec148f2d6a8ad2a3838cb852ea5f3c9e6479a7afce479e1854f8" + url: "https://pub.dev" + source: hosted + version: "3.8.0" + firebase_messaging: + dependency: "direct main" + description: + name: firebase_messaging + sha256: "9651e833454156b9f0927eaedccffba0f7f6a6e20ceddef82517211e7017e9c4" + url: "https://pub.dev" + source: hosted + version: "16.3.0" + firebase_messaging_platform_interface: + dependency: transitive + description: + name: firebase_messaging_platform_interface + sha256: "292bb5dc9c4a429078895406c347d7c7690deb858c1adeed8f4b4346f769dfa3" + url: "https://pub.dev" + source: hosted + version: "4.8.0" + firebase_messaging_web: + dependency: transitive + description: + name: firebase_messaging_web + sha256: "08c565bc83729439f5de2dfea77b4832002b705eb2f840366cefa80e4e5c3c66" + url: "https://pub.dev" + source: hosted + version: "4.2.0" + fixnum: + dependency: transitive + description: + name: fixnum + sha256: b6dc7065e46c974bc7c5f143080a6764ec7a4be6da1285ececdc37be96de53be + url: "https://pub.dev" + source: hosted + version: "1.1.1" + flutter: + dependency: "direct main" + description: flutter + source: sdk + version: "0.0.0" + flutter_app_group_directory: + dependency: transitive + description: + name: flutter_app_group_directory + sha256: "680ef9b2dee84c237cd7bb7fc78bc45867b32556a8a5f0de61278078b9fefd05" + url: "https://pub.dev" + source: hosted + version: "1.1.0" + flutter_cache_manager: + dependency: transitive + description: + name: flutter_cache_manager + sha256: "400b6592f16a4409a7f2bb929a9a7e38c72cceb8ffb99ee57bbf2cb2cecf8386" + url: "https://pub.dev" + source: hosted + version: "3.4.1" + flutter_confetti: + dependency: "direct main" + description: + name: flutter_confetti + sha256: "7e46b82ea0adc456afc91037652bbfbd52a951804fde0708822fad5d68be6398" + url: "https://pub.dev" + source: hosted + version: "0.5.1" + flutter_contacts: + dependency: "direct main" + description: + name: flutter_contacts + sha256: "388d32cd33f16640ee169570128c933b45f3259bddbfae7a100bb49e5ffea9ae" + url: "https://pub.dev" + source: hosted + version: "1.1.9+2" + flutter_font_icons: + dependency: "direct main" + description: + name: flutter_font_icons + sha256: d06eb0ab903d0e90a9a758de30892ea0d43221f03dad059970384e62479c787e + url: "https://pub.dev" + source: hosted + version: "2.2.7" + flutter_launcher_icons: + dependency: "direct main" + description: + name: flutter_launcher_icons + sha256: "10f13781741a2e3972126fae08393d3c4e01fa4cd7473326b94b72cf594195e7" + url: "https://pub.dev" + source: hosted + version: "0.14.4" + flutter_lints: + dependency: "direct dev" + description: + name: flutter_lints + sha256: "3105dc8492f6183fb076ccf1f351ac3d60564bff92e20bfc4af9cc1651f4e7e1" + url: "https://pub.dev" + source: hosted + version: "6.0.0" + flutter_local_notifications: + dependency: "direct main" + description: + name: flutter_local_notifications + sha256: "2b50e938a275e1ad77352d6a25e25770f4130baa61eaf02de7a9a884680954ad" + url: "https://pub.dev" + source: hosted + version: "20.1.0" + flutter_local_notifications_linux: + dependency: transitive + description: + name: flutter_local_notifications_linux + sha256: dce0116868cedd2cdf768af0365fc37ff1cbef7c02c4f51d0587482e625868d0 + url: "https://pub.dev" + source: hosted + version: "7.0.0" + flutter_local_notifications_platform_interface: + dependency: transitive + description: + name: flutter_local_notifications_platform_interface + sha256: "23de31678a48c084169d7ae95866df9de5c9d2a44be3e5915a2ff067aeeba899" + url: "https://pub.dev" + source: hosted + version: "10.0.0" + flutter_local_notifications_windows: + dependency: transitive + description: + name: flutter_local_notifications_windows + sha256: e97a1a3016512437d9c0b12fae7d1491c3c7b9aa7f03a69b974308840656b02a + url: "https://pub.dev" + source: hosted + version: "2.0.1" + flutter_plugin_android_lifecycle: + dependency: transitive + description: + name: flutter_plugin_android_lifecycle + sha256: "3854fe5e3bff0b113c658f260b90c95dea17c92db0f2addeac2e343dd9969785" + url: "https://pub.dev" + source: hosted + version: "2.0.35" + flutter_rating_bar: + dependency: "direct main" + description: + name: flutter_rating_bar + sha256: d2af03469eac832c591a1eba47c91ecc871fe5708e69967073c043b2d775ed93 + url: "https://pub.dev" + source: hosted + version: "4.0.1" + flutter_secure_storage: + dependency: "direct main" + description: + name: flutter_secure_storage + sha256: "7686b1d6a29985dcbb808c59518226e603e3bfa7c0ddfd1a0d00e4cda77c868e" + url: "https://pub.dev" + source: hosted + version: "10.3.1" + flutter_secure_storage_darwin: + dependency: transitive + description: + name: flutter_secure_storage_darwin + sha256: "82329fa5cdf343773b1b6897dea959105a29f092454259edff92f9f6637e8149" + url: "https://pub.dev" + source: hosted + version: "0.3.2" + flutter_secure_storage_linux: + dependency: transitive + description: + name: flutter_secure_storage_linux + sha256: a5f35ddab43cf5c8215d2feb4ce1957851f28c5c37e6f04335066a0602087bf5 + url: "https://pub.dev" + source: hosted + version: "3.0.1" + flutter_secure_storage_platform_interface: + dependency: transitive + description: + name: flutter_secure_storage_platform_interface + sha256: "8ceea1223bee3c6ac1a22dabd8feefc550e4729b3675de4b5900f55afcb435d6" + url: "https://pub.dev" + source: hosted + version: "2.0.1" + flutter_secure_storage_web: + dependency: transitive + description: + name: flutter_secure_storage_web + sha256: "073a62b3aeb866ab4ce795f960413948e51e5a42a9b0c8333b6daf5bb3208a1c" + url: "https://pub.dev" + source: hosted + version: "2.1.1" + flutter_secure_storage_windows: + dependency: transitive + description: + name: flutter_secure_storage_windows + sha256: "3b7c8e068875dfd46719ff57c90d8c459c87f2302ed6b00ff006b3c9fcad1613" + url: "https://pub.dev" + source: hosted + version: "4.1.0" + flutter_svg: + dependency: transitive + description: + name: flutter_svg + sha256: "35882981abcbfb8c15b286f0cd690ff25bac12d95eff3e25ee207f37d4c42e7f" + url: "https://pub.dev" + source: hosted + version: "2.3.0" + flutter_test: + dependency: "direct dev" + description: flutter + source: sdk + version: "0.0.0" + flutter_tts: + dependency: "direct main" + description: + name: flutter_tts + sha256: ce5eb209b40e95f2f4a1397116c87ab2fcdff32257d04ed7a764e75894c03775 + url: "https://pub.dev" + source: hosted + version: "4.2.5" + flutter_web_plugins: + dependency: transitive + description: flutter + source: sdk + version: "0.0.0" + flutter_webrtc: + dependency: "direct main" + description: + name: flutter_webrtc + sha256: c7b0a67ca2c878575fc5c146d801cd874f58f5f1ef5fa6e8eb0c93d413beb948 + url: "https://pub.dev" + source: hosted + version: "1.4.1" + flutter_widget_from_html: + dependency: "direct main" + description: + name: flutter_widget_from_html + sha256: "4fa9a0d34df0a40ac8dd20765dc83bbd8f36ceecfffa2a72a7ab178548804a04" + url: "https://pub.dev" + source: hosted + version: "0.17.2" + flutter_widget_from_html_core: + dependency: transitive + description: + name: flutter_widget_from_html_core + sha256: "7ff010b116f6abc16429923e616fbc727f3f65ef4cee12ffdb280aeecbc21e7f" + url: "https://pub.dev" + source: hosted + version: "0.17.2" + fwfh_cached_network_image: + dependency: transitive + description: + name: fwfh_cached_network_image + sha256: "484cb5f8047f02cfac0654fca5832bfa91bb715fd7fc651c04eb7454187c4af8" + url: "https://pub.dev" + source: hosted + version: "0.16.1" + fwfh_chewie: + dependency: transitive + description: + name: fwfh_chewie + sha256: ae74fc26798b0e74f3983f7b851e74c63b9eeb2d3015ecd4b829096b2c3f8818 + url: "https://pub.dev" + source: hosted + version: "0.16.1" + fwfh_just_audio: + dependency: transitive + description: + name: fwfh_just_audio + sha256: dfd622a0dfe049ac647423a2a8afa7f057d9b2b93d92710b624e3d370b1ac69a + url: "https://pub.dev" + source: hosted + version: "0.17.0" + fwfh_svg: + dependency: transitive + description: + name: fwfh_svg + sha256: "2e6bb241179eeeb1a7941e05c8c923b05d332d36a9085233e7bf110ea7deb915" + url: "https://pub.dev" + source: hosted + version: "0.16.1" + fwfh_url_launcher: + dependency: transitive + description: + name: fwfh_url_launcher + sha256: c38aa8fb373fda3a89b951fa260b539f623f6edb45eee7874cb8b492471af881 + url: "https://pub.dev" + source: hosted + version: "0.16.1" + fwfh_webview: + dependency: transitive + description: + name: fwfh_webview + sha256: "30de1ce10ee789cbd23732558a4b837d9cfd9d6b6352acf686a0113969fb2f85" + url: "https://pub.dev" + source: hosted + version: "0.15.7" + geoclue: + dependency: transitive + description: + name: geoclue + sha256: c2a998c77474fc57aa00c6baa2928e58f4b267649057a1c76738656e9dbd2a7f + url: "https://pub.dev" + source: hosted + version: "0.1.1" + geolocator: + dependency: "direct main" + description: + name: geolocator + sha256: "79939537046c9025be47ec645f35c8090ecadb6fe98eba146a0d25e8c1357516" + url: "https://pub.dev" + source: hosted + version: "14.0.2" + geolocator_android: + dependency: transitive + description: + name: geolocator_android + sha256: "179c3cb66dfa674fc9ccbf2be872a02658724d1c067634e2c427cf6df7df901a" + url: "https://pub.dev" + source: hosted + version: "5.0.2" + geolocator_apple: + dependency: transitive + description: + name: geolocator_apple + sha256: dbdd8789d5aaf14cf69f74d4925ad1336b4433a6efdf2fce91e8955dc921bf22 + url: "https://pub.dev" + source: hosted + version: "2.3.13" + geolocator_linux: + dependency: transitive + description: + name: geolocator_linux + sha256: d64112a205931926f4363bb6bd48f14cb38e7326833041d170615586cd143797 + url: "https://pub.dev" + source: hosted + version: "0.2.4" + geolocator_platform_interface: + dependency: transitive + description: + name: geolocator_platform_interface + sha256: dde05dae7d584db6e82feb87dd9fb0b4b4c83ed68065667b4bef637be38e13a7 + url: "https://pub.dev" + source: hosted + version: "4.2.7" + geolocator_web: + dependency: transitive + description: + name: geolocator_web + sha256: b1ae9bdfd90f861fde8fd4f209c37b953d65e92823cb73c7dee1fa021b06f172 + url: "https://pub.dev" + source: hosted + version: "4.1.3" + geolocator_windows: + dependency: transitive + description: + name: geolocator_windows + sha256: "175435404d20278ffd220de83c2ca293b73db95eafbdc8131fe8609be1421eb6" + url: "https://pub.dev" + source: hosted + version: "0.2.5" + get: + dependency: "direct main" + description: + path: "packages/get" + relative: true + source: path + version: "4.6.5" + get_storage: + dependency: "direct main" + description: + path: "packages/get_storage" + relative: true + source: path + version: "2.1.1" + glob: + dependency: transitive + description: + name: glob + sha256: c3f1ee72c96f8f78935e18aa8cecced9ab132419e8625dc187e1c2408efc20de + url: "https://pub.dev" + source: hosted + version: "2.1.3" + google_cloud: + dependency: transitive + description: + name: google_cloud + sha256: b385e20726ef5315d302c5933bfb728103116c5be2d3d17094b01a82da538c1f + url: "https://pub.dev" + source: hosted + version: "0.5.0" + google_fonts: + dependency: "direct main" + description: + name: google_fonts + sha256: "4e9391085e524954a51e3625b7c9c7e9851dc3f376603208bb45c24b9a66255d" + url: "https://pub.dev" + source: hosted + version: "8.1.0" + google_identity_services_web: + dependency: transitive + description: + name: google_identity_services_web + sha256: "5d187c46dc59e02646e10fe82665fc3884a9b71bc1c90c2b8b749316d33ee454" + url: "https://pub.dev" + source: hosted + version: "0.3.3+1" + google_sign_in: + dependency: "direct main" + description: + name: google_sign_in + sha256: "521031b65853b4409b8213c0387d57edaad7e2a949ce6dea0d8b2afc9cb29763" + url: "https://pub.dev" + source: hosted + version: "7.2.0" + google_sign_in_android: + dependency: transitive + description: + name: google_sign_in_android + sha256: df5c15533814ed20b7d9e1c5a40a73f174e5d5017bd2669b1c72fb6596fde812 + url: "https://pub.dev" + source: hosted + version: "7.2.11" + google_sign_in_ios: + dependency: transitive + description: + name: google_sign_in_ios + sha256: ac1e4c1205267cb7999d1d81333fccffdfda29e853f434bbaf71525498bb6950 + url: "https://pub.dev" + source: hosted + version: "6.3.0" + google_sign_in_platform_interface: + dependency: transitive + description: + name: google_sign_in_platform_interface + sha256: "7f59208c42b415a3cca203571128d6f84f885fead2d5b53eb65a9e27f2965bb5" + url: "https://pub.dev" + source: hosted + version: "3.1.0" + google_sign_in_web: + dependency: transitive + description: + name: google_sign_in_web + sha256: d473003eeca892f96a01a64fc803378be765071cb0c265ee872c7f8683245d14 + url: "https://pub.dev" + source: hosted + version: "1.1.3" + googleapis_auth: + dependency: "direct main" + description: + name: googleapis_auth + sha256: "2a8895c3885197f96bb2fd91ee0ae77b53ff3874c7b1f1eadb6566248e880958" + url: "https://pub.dev" + source: hosted + version: "2.3.1" + graphs: + dependency: transitive + description: + name: graphs + sha256: "741bbf84165310a68ff28fe9e727332eef1407342fca52759cb21ad8177bb8d0" + url: "https://pub.dev" + source: hosted + version: "2.3.2" + gsettings: + dependency: transitive + description: + name: gsettings + sha256: "1b0ce661f5436d2db1e51f3c4295a49849f03d304003a7ba177d01e3a858249c" + url: "https://pub.dev" + source: hosted + version: "0.2.8" + gtk: + dependency: transitive + description: + name: gtk + sha256: "4ff85b2a16724029dd9e5bbb5a94b6918f9973f74ba571c949d2002801879cf5" + url: "https://pub.dev" + source: hosted + version: "2.2.0" + hooks: + dependency: transitive + description: + name: hooks + sha256: "9a62a50b50b769a737bc0a8ff381f333529df3ab746b2f6b02e83760231455ba" + url: "https://pub.dev" + source: hosted + version: "2.0.2" + html: + dependency: transitive + description: + name: html + sha256: "6d1264f2dffa1b1101c25a91dff0dc2daee4c18e87cd8538729773c073dbf602" + url: "https://pub.dev" + source: hosted + version: "0.15.6" + http: + dependency: "direct main" + description: + name: http + sha256: "87721a4a50b19c7f1d49001e51409bddc46303966ce89a65af4f4e6004896412" + url: "https://pub.dev" + source: hosted + version: "1.6.0" + http_multi_server: + dependency: transitive + description: + name: http_multi_server + sha256: aa6199f908078bb1c5efb8d8638d4ae191aac11b311132c3ef48ce352fb52ef8 + url: "https://pub.dev" + source: hosted + version: "3.2.2" + http_parser: + dependency: "direct main" + description: + name: http_parser + sha256: "178d74305e7866013777bab2c3d8726205dc5a4dd935297175b19a23a2e66571" + url: "https://pub.dev" + source: hosted + version: "4.1.2" + image: + dependency: "direct main" + description: + name: image + sha256: f9881ff4998044947ec38d098bc7c8316ae1186fa786eddffdb867b9bc94dfce + url: "https://pub.dev" + source: hosted + version: "4.8.0" + image_cropper: + dependency: "direct main" + description: + name: image_cropper + sha256: "46c8f9aae51c8350b2a2982462f85a129e77b04675d35b09db5499437d7a996b" + url: "https://pub.dev" + source: hosted + version: "11.0.0" + image_cropper_for_web: + dependency: transitive + description: + name: image_cropper_for_web + sha256: e09749714bc24c4e3b31fbafa2e5b7229b0ff23e8b14d4ba44bd723b77611a0f + url: "https://pub.dev" + source: hosted + version: "7.0.0" + image_cropper_platform_interface: + dependency: transitive + description: + name: image_cropper_platform_interface + sha256: "886a30ec199362cdcc2fbb053b8e53347fbfb9dbbdaa94f9ff85622609f5e7ff" + url: "https://pub.dev" + source: hosted + version: "8.0.0" + image_picker: + dependency: "direct main" + description: + name: image_picker + sha256: "91c025426c2881c551100bce834e201c835a170151545f58d17da5180ca7d9ac" + url: "https://pub.dev" + source: hosted + version: "1.2.2" + image_picker_android: + dependency: transitive + description: + name: image_picker_android + sha256: d5b3e1774af29c9ab00103afb0d4614070f924d2e0057ac867ec98800114793f + url: "https://pub.dev" + source: hosted + version: "0.8.13+17" + image_picker_for_web: + dependency: transitive + description: + name: image_picker_for_web + sha256: "66257a3191ab360d23a55c8241c91a6e329d31e94efa7be9cf7a212e65850214" + url: "https://pub.dev" + source: hosted + version: "3.1.1" + image_picker_ios: + dependency: transitive + description: + name: image_picker_ios + sha256: b9c4a438a9ff4f60808c9cf0039b93a42bb6c2211ef6ebb647394b2b3fa84588 + url: "https://pub.dev" + source: hosted + version: "0.8.13+6" + image_picker_linux: + dependency: transitive + description: + name: image_picker_linux + sha256: "1f81c5f2046b9ab724f85523e4af65be1d47b038160a8c8deed909762c308ed4" + url: "https://pub.dev" + source: hosted + version: "0.2.2" + image_picker_macos: + dependency: transitive + description: + name: image_picker_macos + sha256: "86f0f15a309de7e1a552c12df9ce5b59fe927e71385329355aec4776c6a8ec91" + url: "https://pub.dev" + source: hosted + version: "0.2.2+1" + image_picker_platform_interface: + dependency: transitive + description: + name: image_picker_platform_interface + sha256: "567e056716333a1647c64bb6bd873cff7622233a5c3f694be28a583d4715690c" + url: "https://pub.dev" + source: hosted + version: "2.11.1" + image_picker_windows: + dependency: transitive + description: + name: image_picker_windows + sha256: d248c86554a72b5495a31c56f060cf73a41c7ff541689327b1a7dbccc33adfae + url: "https://pub.dev" + source: hosted + version: "0.2.2" + intaleq_maps: + dependency: "direct main" + description: + name: intaleq_maps + sha256: b74c4e6f1d890f81bf253c4d3996db53149b64fcbf9869b279d417067f73128b + url: "https://pub.dev" + source: hosted + version: "2.2.0" + internet_connection_checker: + dependency: "direct main" + description: + name: internet_connection_checker + sha256: ee08f13d8b13b978affe226e9274ca3ba7a9bed07c9479e8ae245f785b7a488a + url: "https://pub.dev" + source: hosted + version: "3.0.1" + intl: + dependency: "direct main" + description: + name: intl + sha256: "3df61194eb431efc39c4ceba583b95633a403f46c9fd341e550ce0bfa50e9aa5" + url: "https://pub.dev" + source: hosted + version: "0.20.2" + io: + dependency: transitive + description: + name: io + sha256: dfd5a80599cf0165756e3181807ed3e77daf6dd4137caaad72d0b7931597650b + url: "https://pub.dev" + source: hosted + version: "1.0.5" + jailbreak_root_detection: + dependency: "direct main" + description: + name: jailbreak_root_detection + sha256: "5000177b9a27428e9c47d2b98f21ab707bef5869c036f9bda4f4f95f4ad67d72" + url: "https://pub.dev" + source: hosted + version: "1.2.0+1" + jni: + dependency: transitive + description: + name: jni + sha256: c2230682d5bc2362c1c9e8d3c7f406d9cbba23ab3f2e203a025dd47e0fb2e68f + url: "https://pub.dev" + source: hosted + version: "1.0.0" + jni_flutter: + dependency: transitive + description: + name: jni_flutter + sha256: "8b59e590786050b1cd866677dddaf76b1ade5e7bc751abe04b86e84d379d3ba6" + url: "https://pub.dev" + source: hosted + version: "1.0.1" + js: + dependency: transitive + description: + name: js + sha256: f2c445dce49627136094980615a031419f7f3eb393237e4ecd97ac15dea343f3 + url: "https://pub.dev" + source: hosted + version: "0.6.7" + json_annotation: + dependency: transitive + description: + name: json_annotation + sha256: "2a743920d81b7910627f68ee2c9ac1fc0bfee32b9fc3403587d7c6791ca12f80" + url: "https://pub.dev" + source: hosted + version: "4.12.0" + just_audio: + dependency: "direct main" + description: + name: just_audio + sha256: "9694e4734f515f2a052493d1d7e0d6de219ee0427c7c29492e246ff32a219908" + url: "https://pub.dev" + source: hosted + version: "0.10.5" + just_audio_platform_interface: + dependency: transitive + description: + name: just_audio_platform_interface + sha256: "2532c8d6702528824445921c5ff10548b518b13f808c2e34c2fd54793b999a6a" + url: "https://pub.dev" + source: hosted + version: "4.6.0" + just_audio_web: + dependency: transitive + description: + name: just_audio_web + sha256: "6ba8a2a7e87d57d32f0f7b42856ade3d6a9fbe0f1a11fabae0a4f00bb73f0663" + url: "https://pub.dev" + source: hosted + version: "0.4.16" + jwt_decoder: + dependency: "direct main" + description: + name: jwt_decoder + sha256: "54774aebf83f2923b99e6416b4ea915d47af3bde56884eb622de85feabbc559f" + url: "https://pub.dev" + source: hosted + version: "2.0.1" + leak_tracker: + dependency: transitive + description: + name: leak_tracker + sha256: "33e2e26bdd85a0112ec15400c8cbffea70d0f9c3407491f672a2fad47915e2de" + url: "https://pub.dev" + source: hosted + version: "11.0.2" + leak_tracker_flutter_testing: + dependency: transitive + description: + name: leak_tracker_flutter_testing + sha256: "1dbc140bb5a23c75ea9c4811222756104fbcd1a27173f0c34ca01e16bea473c1" + url: "https://pub.dev" + source: hosted + version: "3.0.10" + leak_tracker_testing: + dependency: transitive + description: + name: leak_tracker_testing + sha256: "8d5a2d49f4a66b49744b23b018848400d23e54caf9463f4eb20df3eb8acb2eb1" + url: "https://pub.dev" + source: hosted + version: "3.0.2" + lints: + dependency: transitive + description: + name: lints + sha256: "12f842a479589fea194fe5c5a3095abc7be0c1f2ddfa9a0e76aed1dbd26a87df" + url: "https://pub.dev" + source: hosted + version: "6.1.0" + live_activities: + dependency: "direct main" + description: + name: live_activities + sha256: "060f4d8f57b399e5c8beb255fa8426b9b4789320414ae68c8510aec113269dbd" + url: "https://pub.dev" + source: hosted + version: "2.4.9" + local_auth: + dependency: "direct main" + description: + name: local_auth + sha256: ae6f382f638108c6becd134318d7c3f0a93875383a54010f61d7c97ac05d5137 + url: "https://pub.dev" + source: hosted + version: "3.0.1" + local_auth_android: + dependency: transitive + description: + name: local_auth_android + sha256: b201c006fa769c23386f89aa6837ec0eb8179fcfb212eadcf87b422b3f9a6a78 + url: "https://pub.dev" + source: hosted + version: "2.0.8" + local_auth_darwin: + dependency: transitive + description: + name: local_auth_darwin + sha256: a8c3d4e17454111f7fd31ff72a31222359f6059f7fe956c2dcfe0f88f49826d4 + url: "https://pub.dev" + source: hosted + version: "2.0.3" + local_auth_platform_interface: + dependency: transitive + description: + name: local_auth_platform_interface + sha256: f98b8e388588583d3f781f6806e4f4c9f9e189d898d27f0c249b93a1973dd122 + url: "https://pub.dev" + source: hosted + version: "1.1.0" + local_auth_windows: + dependency: transitive + description: + name: local_auth_windows + sha256: be12c5b8ba5e64896983123655c5f67d2484ecfcc95e367952ad6e3bff94cb16 + url: "https://pub.dev" + source: hosted + version: "2.0.1" + location: + dependency: "direct main" + description: + name: location + sha256: b080053c181c7d152c43dd576eec6436c40e25f326933051c330da563ddd5333 + url: "https://pub.dev" + source: hosted + version: "8.0.1" + location_platform_interface: + dependency: transitive + description: + name: location_platform_interface + sha256: ca8700bb3f6b1e8b2afbd86bd78b2280d116c613ca7bfa1d4d7b64eba357d749 + url: "https://pub.dev" + source: hosted + version: "6.0.1" + location_web: + dependency: transitive + description: + name: location_web + sha256: b8e3add5efe0d65c5e692b7a135d80a4015c580d3ea646fa71973e97668dd868 + url: "https://pub.dev" + source: hosted + version: "6.0.1" + logger: + dependency: transitive + description: + name: logger + sha256: "25aee487596a6257655a1e091ec2ae66bc30e7af663592cc3a27e6591e05035c" + url: "https://pub.dev" + source: hosted + version: "2.7.0" + logging: + dependency: transitive + description: + name: logging + sha256: c8245ada5f1717ed44271ed1c26b8ce85ca3228fd2ffdb75468ab01979309d61 + url: "https://pub.dev" + source: hosted + version: "1.3.0" + maplibre_gl: + dependency: transitive + description: + name: maplibre_gl + sha256: d9773555ae4ebab94bbc3ae2176b077cfda486ec729eefe01e1613f164cb8410 + url: "https://pub.dev" + source: hosted + version: "0.25.0" + maplibre_gl_platform_interface: + dependency: transitive + description: + name: maplibre_gl_platform_interface + sha256: bd7de401dea24dd7e8a6f2fa736ddee7dbbee3e24a9027f0afdd619994702047 + url: "https://pub.dev" + source: hosted + version: "0.25.0" + maplibre_gl_web: + dependency: transitive + description: + name: maplibre_gl_web + sha256: af0e48bf96e8dd99f8b958a1953126971eb8a0527b9735441d4f24df3913f5a2 + url: "https://pub.dev" + source: hosted + version: "0.25.0" + matcher: + dependency: transitive + description: + name: matcher + sha256: "12956d0ad8390bbcc63ca2e1469c0619946ccb52809807067a7020d57e647aa6" + url: "https://pub.dev" + source: hosted + version: "0.12.18" + material_color_utilities: + dependency: transitive + description: + name: material_color_utilities + sha256: "9c337007e82b1889149c82ed242ed1cb24a66044e30979c44912381e9be4c48b" + url: "https://pub.dev" + source: hosted + version: "0.13.0" + meta: + dependency: transitive + description: + name: meta + sha256: "23f08335362185a5ea2ad3a4e597f1375e78bce8a040df5c600c8d3552ef2394" + url: "https://pub.dev" + source: hosted + version: "1.17.0" + mime: + dependency: "direct main" + description: + name: mime + sha256: "41a20518f0cb1256669420fdba0cd90d21561e560ac240f26ef8322e45bb7ed6" + url: "https://pub.dev" + source: hosted + version: "2.0.0" + nested: + dependency: transitive + description: + name: nested + sha256: "03bac4c528c64c95c722ec99280375a6f2fc708eec17c7b3f07253b626cd2a20" + url: "https://pub.dev" + source: hosted + version: "1.0.0" + nm: + dependency: transitive + description: + name: nm + sha256: "2c9aae4127bdc8993206464fcc063611e0e36e72018696cd9631023a31b24254" + url: "https://pub.dev" + source: hosted + version: "0.5.0" + objective_c: + dependency: transitive + description: + name: objective_c + sha256: "6cb691c686fa2838c6deb34980d426145c2a5d537491cb83d463c33cdbc726ed" + url: "https://pub.dev" + source: hosted + version: "9.4.1" + octo_image: + dependency: transitive + description: + name: octo_image + sha256: "34faa6639a78c7e3cbe79be6f9f96535867e879748ade7d17c9b1ae7536293bd" + url: "https://pub.dev" + source: hosted + version: "2.1.0" + package_config: + dependency: transitive + description: + name: package_config + sha256: f096c55ebb7deb7e384101542bfba8c52696c1b56fca2eb62827989ef2353bbc + url: "https://pub.dev" + source: hosted + version: "2.2.0" + package_info_plus: + dependency: transitive + description: + name: package_info_plus + sha256: "468c26b4254ab01979fa5e4a98cb343ea3631b9acee6f21028997419a80e1a20" + url: "https://pub.dev" + source: hosted + version: "9.0.1" + package_info_plus_platform_interface: + dependency: transitive + description: + name: package_info_plus_platform_interface + sha256: "202a487f08836a592a6bd4f901ac69b3a8f146af552bbd14407b6b41e1c3f086" + url: "https://pub.dev" + source: hosted + version: "3.2.1" + path: + dependency: "direct main" + description: + name: path + sha256: "75cca69d1490965be98c73ceaea117e8a04dd21217b37b292c9ddbec0d955bc5" + url: "https://pub.dev" + source: hosted + version: "1.9.1" + path_parsing: + dependency: transitive + description: + name: path_parsing + sha256: "883402936929eac138ee0a45da5b0f2c80f89913e6dc3bf77eb65b84b409c6ca" + url: "https://pub.dev" + source: hosted + version: "1.1.0" + path_provider: + dependency: transitive + description: + name: path_provider + sha256: "50c5dd5b6e1aaf6fb3a78b33f6aa3afca52bf903a8a5298f53101fdaee55bbcd" + url: "https://pub.dev" + source: hosted + version: "2.1.5" + path_provider_android: + dependency: transitive + description: + name: path_provider_android + sha256: "69cbd515a62b94d32a7944f086b2f82b4ac40a1d45bebfc00813a430ab2dabcd" + url: "https://pub.dev" + source: hosted + version: "2.3.1" + path_provider_foundation: + dependency: transitive + description: + name: path_provider_foundation + sha256: "2a376b7d6392d80cd3705782d2caa734ca4727776db0b6ec36ef3f1855197699" + url: "https://pub.dev" + source: hosted + version: "2.6.0" + path_provider_linux: + dependency: transitive + description: + name: path_provider_linux + sha256: f7a1fe3a634fe7734c8d3f2766ad746ae2a2884abe22e241a8b301bf5cac3279 + url: "https://pub.dev" + source: hosted + version: "2.2.1" + path_provider_platform_interface: + dependency: transitive + description: + name: path_provider_platform_interface + sha256: "88f5779f72ba699763fa3a3b06aa4bf6de76c8e5de842cf6f29e2e06476c2334" + url: "https://pub.dev" + source: hosted + version: "2.1.2" + path_provider_windows: + dependency: transitive + description: + name: path_provider_windows + sha256: bd6f00dbd873bfb70d0761682da2b3a2c2fccc2b9e84c495821639601d81afe7 + url: "https://pub.dev" + source: hosted + version: "2.3.0" + permission_handler: + dependency: "direct main" + description: + name: permission_handler + sha256: fe54465bcc62a4564c6e4db337bbaded6c0c0fa6e10487414436d163114784f6 + url: "https://pub.dev" + source: hosted + version: "12.0.3" + permission_handler_android: + dependency: transitive + description: + name: permission_handler_android + sha256: "1e3bc410ca1bf84662104b100eb126e066cb55791b7451307f9708d4007350e6" + url: "https://pub.dev" + source: hosted + version: "13.0.1" + permission_handler_apple: + dependency: transitive + description: + name: permission_handler_apple + sha256: e20daf680eef1ca62ffe8c8c526b778cc386d50137c77ac71c8ec9c88c13fb9d + url: "https://pub.dev" + source: hosted + version: "9.4.9" + permission_handler_html: + dependency: transitive + description: + name: permission_handler_html + sha256: "38f000e83355abb3392140f6bc3030660cfaef189e1f87824facb76300b4ff24" + url: "https://pub.dev" + source: hosted + version: "0.1.3+5" + permission_handler_platform_interface: + dependency: transitive + description: + name: permission_handler_platform_interface + sha256: eb99b295153abce5d683cac8c02e22faab63e50679b937fa1bf67d58bb282878 + url: "https://pub.dev" + source: hosted + version: "4.3.0" + permission_handler_windows: + dependency: transitive + description: + name: permission_handler_windows + sha256: "1a790728016f79a41216d88672dbc5df30e686e811ad4e698bfc51f76ad91f1e" + url: "https://pub.dev" + source: hosted + version: "0.2.1" + petitparser: + dependency: transitive + description: + name: petitparser + sha256: "91bd59303e9f769f108f8df05e371341b15d59e995e6806aefab827b58336675" + url: "https://pub.dev" + source: hosted + version: "7.0.2" + platform: + dependency: transitive + description: + name: platform + sha256: "5d6b1b0036a5f331ebc77c850ebc8506cbc1e9416c27e59b439f917a902a4984" + url: "https://pub.dev" + source: hosted + version: "3.1.6" + plugin_platform_interface: + dependency: transitive + description: + name: plugin_platform_interface + sha256: "4820fbfdb9478b1ebae27888254d445073732dae3d6ea81f0b7e06d5dedc3f02" + url: "https://pub.dev" + source: hosted + version: "2.1.8" + pointycastle: + dependency: transitive + description: + name: pointycastle + sha256: "4be0097fcf3fd3e8449e53730c631200ebc7b88016acecab2b0da2f0149222fe" + url: "https://pub.dev" + source: hosted + version: "3.9.1" + pool: + dependency: transitive + description: + name: pool + sha256: "978783255c543aa3586a1b3c21f6e9d720eb315376a915872c61ef8b5c20177d" + url: "https://pub.dev" + source: hosted + version: "1.5.2" + posix: + dependency: transitive + description: + name: posix + sha256: "185ef7606574f789b40f289c233efa52e96dead518aed988e040a10737febb07" + url: "https://pub.dev" + source: hosted + version: "6.5.0" + provider: + dependency: transitive + description: + name: provider + sha256: "4e82183fa20e5ca25703ead7e05de9e4cceed1fbd1eadc1ac3cb6f565a09f272" + url: "https://pub.dev" + source: hosted + version: "6.1.5+1" + pub_semver: + dependency: transitive + description: + name: pub_semver + sha256: "5bfcf68ca79ef689f8990d1160781b4bad40a3bd5e5218ad4076ddb7f4081585" + url: "https://pub.dev" + source: hosted + version: "2.2.0" + pubspec_parse: + dependency: transitive + description: + name: pubspec_parse + sha256: "0560ba233314abbed0a48a2956f7f022cce7c3e1e73df540277da7544cad4082" + url: "https://pub.dev" + source: hosted + version: "1.5.0" + quick_actions: + dependency: "direct main" + description: + name: quick_actions + sha256: "7e35dd6a21f5bbd21acf6899039eaf85001a5ac26d52cbd6a8a2814505b90798" + url: "https://pub.dev" + source: hosted + version: "1.1.0" + quick_actions_android: + dependency: transitive + description: + name: quick_actions_android + sha256: "6fbdda87fbedd0602b91f35d870c2cbcb6d053bc863efb76c6e7f60f1d8e3fd6" + url: "https://pub.dev" + source: hosted + version: "1.0.30" + quick_actions_ios: + dependency: transitive + description: + name: quick_actions_ios + sha256: be1496e7ca1debc86d9ea08e56325649fbc5abb2b6930690c97ba0dae59992b1 + url: "https://pub.dev" + source: hosted + version: "1.2.4" + quick_actions_platform_interface: + dependency: transitive + description: + name: quick_actions_platform_interface + sha256: "1fec7068db5122cd019e9340d3d7be5d36eab099695ef3402c7059ee058329a4" + url: "https://pub.dev" + source: hosted + version: "1.1.0" + recase: + dependency: transitive + description: + name: recase + sha256: e4eb4ec2dcdee52dcf99cb4ceabaffc631d7424ee55e56f280bc039737f89213 + url: "https://pub.dev" + source: hosted + version: "4.1.0" + record: + dependency: "direct main" + description: + name: record + sha256: "10911465138fafacef459a780564e883e01bd48eabf87ab20543684884492870" + url: "https://pub.dev" + source: hosted + version: "6.2.1" + record_android: + dependency: transitive + description: + name: record_android + sha256: eb1732e42d0d2a1895b8db86e4fc917287e6d8491b6ed59918aea8bed6c69de4 + url: "https://pub.dev" + source: hosted + version: "1.5.2" + record_ios: + dependency: transitive + description: + name: record_ios + sha256: c051fb48edd7a0e265daafb9108730dc827c27b551728a3fdfb3ef69efd89c73 + url: "https://pub.dev" + source: hosted + version: "1.2.1" + record_linux: + dependency: transitive + description: + name: record_linux + sha256: "31181787bf7eccb0e298835836b69b3cd0a903863b75d70e937de3dec71cd8f3" + url: "https://pub.dev" + source: hosted + version: "1.3.1" + record_macos: + dependency: transitive + description: + name: record_macos + sha256: cfe1b61435e27db418bf513dc36820d10c9f7eb1843786c2c9a52e07e2f4f627 + url: "https://pub.dev" + source: hosted + version: "1.2.2" + record_platform_interface: + dependency: transitive + description: + name: record_platform_interface + sha256: "8e56cbe06c6984137fb86132ff03459f29938d927496d9b2d0962e2d6345d488" + url: "https://pub.dev" + source: hosted + version: "1.6.0" + record_use: + dependency: transitive + description: + name: record_use + sha256: "2551bd8eecfe95d14ae75f6021ad0248be5c27f138c2ec12fcb52b500b3ba1ed" + url: "https://pub.dev" + source: hosted + version: "0.6.0" + record_web: + dependency: transitive + description: + name: record_web + sha256: "7e9846981c1f2d111d86f0ae3309071f5bba8b624d1c977316706f08fc31d16d" + url: "https://pub.dev" + source: hosted + version: "1.3.0" + record_windows: + dependency: transitive + description: + name: record_windows + sha256: "223258060a1d25c62bae18282c16783f28581ec19401d17e56b5205b9f039d78" + url: "https://pub.dev" + source: hosted + version: "1.0.7" + rxdart: + dependency: transitive + description: + name: rxdart + sha256: "5c3004a4a8dbb94bd4bf5412a4def4acdaa12e12f269737a5751369e12d1a962" + url: "https://pub.dev" + source: hosted + version: "0.28.0" + secure_string_operations: + dependency: "direct main" + description: + path: secure_string_operations + relative: true + source: path + version: "1.0.0" + sensors_plus: + dependency: "direct main" + description: + name: sensors_plus + sha256: "6898cd4490ffc27fea4de5976585e92fae55355175d46c6c3b3d719d42f9e230" + url: "https://pub.dev" + source: hosted + version: "5.0.1" + sensors_plus_platform_interface: + dependency: transitive + description: + name: sensors_plus_platform_interface + sha256: bc472d6cfd622acb4f020e726433ee31788b038056691ba433fec80e448a094f + url: "https://pub.dev" + source: hosted + version: "1.2.0" + share_plus: + dependency: "direct main" + description: + name: share_plus + sha256: "223873d106614442ea6f20db5a038685cc5b32a2fba81cdecaefbbae0523f7fa" + url: "https://pub.dev" + source: hosted + version: "12.0.2" + share_plus_platform_interface: + dependency: transitive + description: + name: share_plus_platform_interface + sha256: "88023e53a13429bd65d8e85e11a9b484f49d4c190abbd96c7932b74d6927cc9a" + url: "https://pub.dev" + source: hosted + version: "6.1.0" + shelf: + dependency: transitive + description: + name: shelf + sha256: e7dd780a7ffb623c57850b33f43309312fc863fb6aa3d276a754bb299839ef12 + url: "https://pub.dev" + source: hosted + version: "1.4.2" + shelf_web_socket: + dependency: transitive + description: + name: shelf_web_socket + sha256: "3632775c8e90d6c9712f883e633716432a27758216dfb61bd86a8321c0580925" + url: "https://pub.dev" + source: hosted + version: "3.0.0" + shimmer: + dependency: "direct main" + description: + name: shimmer + sha256: "5f88c883a22e9f9f299e5ba0e4f7e6054857224976a5d9f839d4ebdc94a14ac9" + url: "https://pub.dev" + source: hosted + version: "3.0.0" + sign_in_with_apple: + dependency: "direct main" + description: + name: sign_in_with_apple + sha256: "8bd875c8e8748272749eb6d25b896f768e7e9d60988446d543fe85a37a2392b8" + url: "https://pub.dev" + source: hosted + version: "7.0.1" + sign_in_with_apple_platform_interface: + dependency: transitive + description: + name: sign_in_with_apple_platform_interface + sha256: "981bca52cf3bb9c3ad7ef44aace2d543e5c468bb713fd8dda4275ff76dfa6659" + url: "https://pub.dev" + source: hosted + version: "2.0.0" + sign_in_with_apple_web: + dependency: transitive + description: + name: sign_in_with_apple_web + sha256: f316400827f52cafcf50d00e1a2e8a0abc534ca1264e856a81c5f06bd5b10fed + url: "https://pub.dev" + source: hosted + version: "3.0.0" + sky_engine: + dependency: transitive + description: flutter + source: sdk + version: "0.0.0" + socket_io_client: + dependency: "direct main" + description: + name: socket_io_client + sha256: "64bd271703db3682d4195dd813c555413d21a49bbaef7c3ed38932fd2a209a10" + url: "https://pub.dev" + source: hosted + version: "1.0.2" + socket_io_common: + dependency: transitive + description: + name: socket_io_common + sha256: "469c7e6bb0c8d571a5158c1352112654f03aedc2f0a246533e1cbdb41efa4937" + url: "https://pub.dev" + source: hosted + version: "1.0.1" + source_gen: + dependency: transitive + description: + name: source_gen + sha256: ec37cc0e6694374cbef59ed79685572c870a54ede6fa30a3e420feb3adffea02 + url: "https://pub.dev" + source: hosted + version: "4.2.3" + source_span: + dependency: transitive + description: + name: source_span + sha256: "56a02f1f4cd1a2d96303c0144c93bd6d909eea6bee6bf5a0e0b685edbd4c47ab" + url: "https://pub.dev" + source: hosted + version: "1.10.2" + sqflite: + dependency: transitive + description: + name: sqflite + sha256: "564cfed0746fe53140c23b70b308e045c3b31f17778f2f326ccb7d804ea0250a" + url: "https://pub.dev" + source: hosted + version: "2.4.2+1" + sqflite_android: + dependency: transitive + description: + name: sqflite_android + sha256: "881e28efdcc9950fd8e9bb42713dcf1103e62a2e7168f23c9338d82db13dec40" + url: "https://pub.dev" + source: hosted + version: "2.4.2+3" + sqflite_common: + dependency: transitive + description: + name: sqflite_common + sha256: "1581ffbf7a0e333b380d6a30737d78516b826cb35beb7fb0bf8a3ea0c678b465" + url: "https://pub.dev" + source: hosted + version: "2.5.8" + sqflite_darwin: + dependency: transitive + description: + name: sqflite_darwin + sha256: "279832e5cde3fe99e8571879498c9211f3ca6391b0d818df4e17d9fff5c6ccb3" + url: "https://pub.dev" + source: hosted + version: "2.4.2" + sqflite_platform_interface: + dependency: transitive + description: + name: sqflite_platform_interface + sha256: "8dd4515c7bdcae0a785b0062859336de775e8c65db81ae33dd5445f35be61920" + url: "https://pub.dev" + source: hosted + version: "2.4.0" + stack_trace: + dependency: transitive + description: + name: stack_trace + sha256: "8b27215b45d22309b5cddda1aa2b19bdfec9df0e765f2de506401c071d38d1b1" + url: "https://pub.dev" + source: hosted + version: "1.12.1" + stream_channel: + dependency: transitive + description: + name: stream_channel + sha256: "969e04c80b8bcdf826f8f16579c7b14d780458bd97f56d107d3950fdbeef059d" + url: "https://pub.dev" + source: hosted + version: "2.1.4" + stream_transform: + dependency: transitive + description: + name: stream_transform + sha256: ad47125e588cfd37a9a7f86c7d6356dde8dfe89d071d293f80ca9e9273a33871 + url: "https://pub.dev" + source: hosted + version: "2.1.1" + string_scanner: + dependency: transitive + description: + name: string_scanner + sha256: "921cd31725b72fe181906c6a94d987c78e3b98c2e205b397ea399d4054872b43" + url: "https://pub.dev" + source: hosted + version: "1.4.1" + synchronized: + dependency: transitive + description: + name: synchronized + sha256: "63896c27e81b28f8cb4e69ead0d3e8f03f1d1e5fc531a3e579cabed6a2c7c9e5" + url: "https://pub.dev" + source: hosted + version: "3.4.0+1" + term_glyph: + dependency: transitive + description: + name: term_glyph + sha256: "7f554798625ea768a7518313e58f83891c7f5024f88e46e7182a4558850a4b8e" + url: "https://pub.dev" + source: hosted + version: "1.2.2" + test_api: + dependency: transitive + description: + name: test_api + sha256: "93167629bfc610f71560ab9312acdda4959de4df6fac7492c89ff0d3886f6636" + url: "https://pub.dev" + source: hosted + version: "0.7.9" + timezone: + dependency: transitive + description: + name: timezone + sha256: dd14a3b83cfd7cb19e7888f1cbc20f258b8d71b54c06f79ac585f14093a287d1 + url: "https://pub.dev" + source: hosted + version: "0.10.1" + typed_data: + dependency: transitive + description: + name: typed_data + sha256: f9049c039ebfeb4cf7a7104a675823cd72dba8297f264b6637062516699fa006 + url: "https://pub.dev" + source: hosted + version: "1.4.0" + url_launcher: + dependency: "direct main" + description: + name: url_launcher + sha256: f6a7e5c4835bb4e3026a04793a4199ca2d14c739ec378fdfe23fc8075d0439f8 + url: "https://pub.dev" + source: hosted + version: "6.3.2" + url_launcher_android: + dependency: transitive + description: + name: url_launcher_android + sha256: "17bc677f0b301615530dd1d67e0a9828cafa2d0b6b6eae4cd3679b7eac4a273c" + url: "https://pub.dev" + source: hosted + version: "6.3.30" + url_launcher_ios: + dependency: transitive + description: + name: url_launcher_ios + sha256: "580fe5dfb51671ae38191d316e027f6b76272b026370708c2d898799750a02b0" + url: "https://pub.dev" + source: hosted + version: "6.4.1" + url_launcher_linux: + dependency: transitive + description: + name: url_launcher_linux + sha256: d5e14138b3bc193a0f63c10a53c94b91d399df0512b1f29b94a043db7482384a + url: "https://pub.dev" + source: hosted + version: "3.2.2" + url_launcher_macos: + dependency: transitive + description: + name: url_launcher_macos + sha256: "368adf46f71ad3c21b8f06614adb38346f193f3a59ba8fe9a2fd74133070ba18" + url: "https://pub.dev" + source: hosted + version: "3.2.5" + url_launcher_platform_interface: + dependency: transitive + description: + name: url_launcher_platform_interface + sha256: "552f8a1e663569be95a8190206a38187b531910283c3e982193e4f2733f01029" + url: "https://pub.dev" + source: hosted + version: "2.3.2" + url_launcher_web: + dependency: transitive + description: + name: url_launcher_web + sha256: "85c81589622fbc87c1c683aaea164d3604a7777495a79d91e39ffcdec39ddb34" + url: "https://pub.dev" + source: hosted + version: "2.4.3" + url_launcher_windows: + dependency: transitive + description: + name: url_launcher_windows + sha256: "712c70ab1b99744ff066053cbe3e80c73332b38d46e5e945c98689b2e66fc15f" + url: "https://pub.dev" + source: hosted + version: "3.1.5" + uuid: + dependency: transitive + description: + name: uuid + sha256: "1fef9e8e11e2991bb773070d4656b7bd5d850967a2456cfc83cf47925ba79489" + url: "https://pub.dev" + source: hosted + version: "4.5.3" + vector_graphics: + dependency: transitive + description: + name: vector_graphics + sha256: "2306c03da2ba81724afeb589c351ebbc0aa7d86005925be8f8735856dbe5e42d" + url: "https://pub.dev" + source: hosted + version: "1.2.2" + vector_graphics_codec: + dependency: transitive + description: + name: vector_graphics_codec + sha256: "99fd9fbd34d9f9a32efd7b6a6aae14125d8237b10403b422a6a6dfeac2806146" + url: "https://pub.dev" + source: hosted + version: "1.1.13" + vector_graphics_compiler: + dependency: transitive + description: + name: vector_graphics_compiler + sha256: "7ee12e6dffe0fc8e755179d6d91b3b34f5924223fc104d85572ef9180d73d172" + url: "https://pub.dev" + source: hosted + version: "1.2.5" + vector_math: + dependency: transitive + description: + name: vector_math + sha256: d530bd74fea330e6e364cda7a85019c434070188383e1cd8d9777ee586914c5b + url: "https://pub.dev" + source: hosted + version: "2.2.0" + vibration: + dependency: "direct main" + description: + name: vibration + sha256: "9bb06614c69260f8bd11c80fe01ed7988905cf00e3417d656c2647e41f261d87" + url: "https://pub.dev" + source: hosted + version: "3.1.8" + vibration_platform_interface: + dependency: transitive + description: + name: vibration_platform_interface + sha256: "258c273268f8aa40c88d29741137c536874a738779b92ddb8aa32ed093721ec5" + url: "https://pub.dev" + source: hosted + version: "0.1.2" + video_player: + dependency: transitive + description: + name: video_player + sha256: "48a7bdaa38a3d50ec10c78627abdbfad863fdf6f0d6e08c7c3c040cfd80ae36f" + url: "https://pub.dev" + source: hosted + version: "2.11.1" + video_player_android: + dependency: transitive + description: + name: video_player_android + sha256: "877a6c7ba772456077d7bfd71314629b3fe2b73733ce503fc77c3314d43a0ca0" + url: "https://pub.dev" + source: hosted + version: "2.9.5" + video_player_avfoundation: + dependency: transitive + description: + name: video_player_avfoundation + sha256: "9338f3ec22774f88146b22f13273a446719b1da010fd200c4d1d97802156ac58" + url: "https://pub.dev" + source: hosted + version: "2.9.7" + video_player_platform_interface: + dependency: transitive + description: + name: video_player_platform_interface + sha256: "16eaed5268c571c31840dc58ef8da5f0cd4db2a98490c3b8f1cf70122546c6e0" + url: "https://pub.dev" + source: hosted + version: "6.7.0" + video_player_web: + dependency: transitive + description: + name: video_player_web + sha256: "9f3c00be2ef9b76a95d94ac5119fb843dca6f2c69e6c9968f6f2b6c9e7afbdeb" + url: "https://pub.dev" + source: hosted + version: "2.4.0" + vm_service: + dependency: transitive + description: + name: vm_service + sha256: "0016aef94fc66495ac78af5859181e3f3bf2026bd8eecc72b9565601e19ab360" + url: "https://pub.dev" + source: hosted + version: "15.2.0" + wakelock_plus: + dependency: "direct main" + description: + name: wakelock_plus + sha256: ddf3db70eaa10c37558ff817519b85d527dbd21034fd5d8e1c2e85f31588f1c1 + url: "https://pub.dev" + source: hosted + version: "1.5.2" + wakelock_plus_platform_interface: + dependency: transitive + description: + name: wakelock_plus_platform_interface + sha256: b13f99e992e7ae6a152e16c5559d3c07ff445b13330192662494e614ca3e7d7b + url: "https://pub.dev" + source: hosted + version: "1.5.1" + watcher: + dependency: transitive + description: + name: watcher + sha256: "1398c9f081a753f9226febe8900fce8f7d0a67163334e1c94a2438339d79d635" + url: "https://pub.dev" + source: hosted + version: "1.2.1" + web: + dependency: transitive + description: + name: web + sha256: "868d88a33d8a87b18ffc05f9f030ba328ffefba92d6c127917a2ba740f9cfe4a" + url: "https://pub.dev" + source: hosted + version: "1.1.1" + web_socket: + dependency: transitive + description: + name: web_socket + sha256: "34d64019aa8e36bf9842ac014bb5d2f5586ca73df5e4d9bf5c936975cae6982c" + url: "https://pub.dev" + source: hosted + version: "1.0.1" + web_socket_channel: + dependency: transitive + description: + name: web_socket_channel + sha256: d645757fb0f4773d602444000a8131ff5d48c9e47adfe9772652dd1a4f2d45c8 + url: "https://pub.dev" + source: hosted + version: "3.0.3" + webrtc_interface: + dependency: transitive + description: + name: webrtc_interface + sha256: c6f100eac5057d9a817a60473126f9828c796d42884d498af4f339c97b21014f + url: "https://pub.dev" + source: hosted + version: "1.5.1" + webview_flutter: + dependency: "direct main" + description: + name: webview_flutter + sha256: ec81f57aa1611f8ebecf1d2259da4ef052281cb5ad624131c93546c79ccc7736 + url: "https://pub.dev" + source: hosted + version: "4.9.0" + webview_flutter_android: + dependency: "direct main" + description: + name: webview_flutter_android + sha256: "47a8da40d02befda5b151a26dba71f47df471cddd91dfdb7802d0a87c5442558" + url: "https://pub.dev" + source: hosted + version: "3.16.9" + webview_flutter_platform_interface: + dependency: transitive + description: + name: webview_flutter_platform_interface + sha256: "1221c1b12f5278791042f2ec2841743784cf25c5a644e23d6680e5d718824f04" + url: "https://pub.dev" + source: hosted + version: "2.15.1" + webview_flutter_wkwebview: + dependency: "direct main" + description: + name: webview_flutter_wkwebview + sha256: "82648217f537573e1ca9ae9952d3eacedca6ab5aee69dc84445fc763766dcea2" + url: "https://pub.dev" + source: hosted + version: "3.25.1" + win32: + dependency: transitive + description: + name: win32 + sha256: d7cb55e04cd34096cd3a79b3330245f54cb96a370a1c27adb3c84b917de8b08e + url: "https://pub.dev" + source: hosted + version: "5.15.0" + win32_registry: + dependency: transitive + description: + name: win32_registry + sha256: "6f1b564492d0147b330dd794fee8f512cec4977957f310f9951b5f9d83618dae" + url: "https://pub.dev" + source: hosted + version: "2.1.0" + xdg_directories: + dependency: transitive + description: + name: xdg_directories + sha256: "7a3f37b05d989967cdddcbb571f1ea834867ae2faa29725fd085180e0883aa15" + url: "https://pub.dev" + source: hosted + version: "1.1.0" + xml: + dependency: transitive + description: + name: xml + sha256: "971043b3a0d3da28727e40ed3e0b5d18b742fa5a68665cca88e74b7876d5e025" + url: "https://pub.dev" + source: hosted + version: "6.6.1" + yaml: + dependency: transitive + description: + name: yaml + sha256: b9da305ac7c39faa3f030eccd175340f968459dae4af175130b3fc47e40d76ce + url: "https://pub.dev" + source: hosted + version: "3.1.3" +sdks: + dart: ">=3.11.0 <4.0.0" + flutter: ">=3.41.0" diff --git a/siro_rider/pubspec.yaml b/siro_rider/pubspec.yaml new file mode 100644 index 0000000..d1485bd --- /dev/null +++ b/siro_rider/pubspec.yaml @@ -0,0 +1,142 @@ +name: siro_rider +description: "A new Flutter project." +publish_to: "none" # Remove this line if you wish to publish to pub.dev + +version: 1.0.0+1 + +environment: + sdk: ">=3.0.5 <4.0.0" + +dependencies: + flutter: + sdk: flutter + cupertino_icons: ^1.0.8 + flutter_webrtc: ^1.4.1 + secure_string_operations: + path: ./secure_string_operations + firebase_messaging: ^16.1.1 + firebase_core: ^4.4.0 + flutter_local_notifications: ^20.1.0 + path: ^1.9.1 + intl: ^0.20.2 + http: ^1.2.2 + crypto: ^3.0.3 + get: + path: ./packages/get + get_storage: + path: ./packages/get_storage + url_launcher: ^6.3.2 + location: ^8.0.1 + # google_polyline_algorithm: 3.1.0 + animated_text_kit: ^4.3.0 + flutter_secure_storage: ^10.0.0 + geolocator: ^14.0.2 + sensors_plus: ^5.0.1 + google_fonts: ^8.0.2 + flutter_launcher_icons: ^0.14.4 + flutter_rating_bar: ^4.0.1 + flutter_font_icons: ^2.2.7 + image_picker: ^1.2.1 + # camera: ^0.10.5+5 #to be remove + flutter_widget_from_html: ^0.17.1 + local_auth: ^3.0.1 + image: ^4.1.3 + image_cropper: ^11.0.0 + envied: ^1.3.4 + # cached_network_image: ^3.3.0 + calendar_builder: + path: ./packages/calendar_builder + # agora_rtc_engine: ^6.2.6 + flutter_tts: ^4.2.5 + permission_handler: ^12.0.1 + # google_generative_ai: ^0.0.1-dev + vibration: ^3.1.7 + wakelock_plus: + record: ^6.2.0 + dio: ^5.9.1 + webview_flutter: ^4.9.0 + webview_flutter_android: ^3.16.2 + webview_flutter_wkwebview: ^3.14.0 + just_audio: ^0.10.5 + # share: ^2.0.4 + google_sign_in: ^7.2.0 + sign_in_with_apple: ^7.0.1 + firebase_auth: ^6.1.4 + device_info_plus: ^12.1.0 + # uni_links: ^0.5.1 + googleapis_auth: ^2.0.0 + flutter_confetti: ^0.5.1 + # intl_phone_field: ^3.1.0 + flutter_contacts: ^1.1.9+2 + mime: ^2.0.0 + http_parser: ^4.1.2 + encrypt: ^5.0.3 + live_activities: ^2.4.7 + quick_actions: ^1.1.0 + jwt_decoder: ^2.0.1 + jailbreak_root_detection: ^1.2.0+1 + share_plus: ^12.0.1 + dotted_line: ^3.2.3 + shimmer: ^3.0.0 + asn1lib: ^1.6.5 + internet_connection_checker: ^3.0.1 + connectivity_plus: ^6.1.5 + app_links: ^7.0.0 + intaleq_maps: ^2.2.0 + socket_io_client: 1.0.2 + # home_widget: ^0.7.0+1 + +dev_dependencies: + flutter_test: + sdk: flutter + flutter_lints: ^6.0.0 + envied_generator: ^1.3.4 + build_runner: ^2.13.1 + +flutter_launcher_icons: + android: "launcher_icon" + ios: true + image_path: "assets/images/logo.png" + min_sdk_android: 21 + web: + generate: true + image_path: "assets/images/logo.png" + background_color: "#hexcode" + theme_color: "#hexcode" + windows: + generate: true + image_path: "assets/images/logo.png" + icon_size: 48 + macos: + generate: true + image_path: "assets/images/logo.png" + +flutter: + uses-material-design: true + assets: + - assets/ + - assets/images/ + - assets/fonts/ + - shorebird.yaml + + fonts: + - family: mohanad + fonts: + - asset: assets/fonts/mohanad.ttf + - family: josefin + fonts: + - asset: assets/fonts/josefin.ttf + - family: digit + fonts: + - asset: assets/fonts/digit.ttf + +dependency_overrides: + + # record_platform_interface: "1.2.0" + get: + path: ./packages/get + get_storage: + path: ./packages/get_storage + calendar_builder: + path: ./packages/calendar_builder + \ No newline at end of file diff --git a/siro_rider/secure_string_operations/lib/secure_string_operations.dart b/siro_rider/secure_string_operations/lib/secure_string_operations.dart new file mode 100644 index 0000000..d428ac3 --- /dev/null +++ b/siro_rider/secure_string_operations/lib/secure_string_operations.dart @@ -0,0 +1,47 @@ +// File: lib/secure_string_operations.dart + +library secure_string_operations; + +class X { + static String c(String a, Map b) { + StringBuffer c = StringBuffer(); + c.write(a); + + String d = "Bl"; + c.write(b[d] ?? d); + + StringBuffer e = StringBuffer(); + String f = c.toString(); + + for (int g = 0; g < f.length; g++) { + String h = f[g]; + e.write(b[h] ?? h); + } + + return e.toString(); + } + + static String r(String a, Map b) { + StringBuffer c = StringBuffer(); + String d = "Bl"; + int e = d.length; + + for (int f = 0; f < a.length; f++) { + String g = a[f]; + String h = b.keys.firstWhere( + (i) => b[i] == g, + orElse: () => g, + ); + + c.write(h); + } + + String j = c.toString(); + + if (j.endsWith(d)) { + j = j.substring(0, j.length - e); + } + + return j; + } +} diff --git a/siro_rider/secure_string_operations/pubspec.lock b/siro_rider/secure_string_operations/pubspec.lock new file mode 100644 index 0000000..fce7ef1 --- /dev/null +++ b/siro_rider/secure_string_operations/pubspec.lock @@ -0,0 +1,5 @@ +# Generated by pub +# See https://dart.dev/tools/pub/glossary#lockfile +packages: {} +sdks: + dart: ">=2.12.0 <4.0.0" diff --git a/siro_rider/secure_string_operations/pubspec.yaml b/siro_rider/secure_string_operations/pubspec.yaml new file mode 100644 index 0000000..b910400 --- /dev/null +++ b/siro_rider/secure_string_operations/pubspec.yaml @@ -0,0 +1,6 @@ +name: secure_string_operations +description: A package for secure string operations +version: 1.0.0 + +environment: + sdk: ">=2.12.0 <3.0.0" diff --git a/siro_rider/test/widget_test.dart b/siro_rider/test/widget_test.dart new file mode 100644 index 0000000..37ac666 --- /dev/null +++ b/siro_rider/test/widget_test.dart @@ -0,0 +1,8 @@ +import 'package:flutter_test/flutter_test.dart'; + +void main() { + testWidgets('App initialization test', (WidgetTester tester) async { + // Dummy test to pass CI + expect(true, true); + }); +} diff --git a/siro_rider/web/favicon.png b/siro_rider/web/favicon.png new file mode 100644 index 0000000..52b0028 Binary files /dev/null and b/siro_rider/web/favicon.png differ diff --git a/siro_rider/web/icons/Icon-192.png b/siro_rider/web/icons/Icon-192.png new file mode 100644 index 0000000..2e3238e Binary files /dev/null and b/siro_rider/web/icons/Icon-192.png differ diff --git a/siro_rider/web/icons/Icon-512.png b/siro_rider/web/icons/Icon-512.png new file mode 100644 index 0000000..a3e0cf2 Binary files /dev/null and b/siro_rider/web/icons/Icon-512.png differ diff --git a/siro_rider/web/icons/Icon-maskable-192.png b/siro_rider/web/icons/Icon-maskable-192.png new file mode 100644 index 0000000..2e3238e Binary files /dev/null and b/siro_rider/web/icons/Icon-maskable-192.png differ diff --git a/siro_rider/web/icons/Icon-maskable-512.png b/siro_rider/web/icons/Icon-maskable-512.png new file mode 100644 index 0000000..a3e0cf2 Binary files /dev/null and b/siro_rider/web/icons/Icon-maskable-512.png differ diff --git a/siro_rider/web/manifest.json b/siro_rider/web/manifest.json new file mode 100644 index 0000000..e69de29 diff --git a/siro_rider/windows/.gitignore b/siro_rider/windows/.gitignore new file mode 100644 index 0000000..d492d0d --- /dev/null +++ b/siro_rider/windows/.gitignore @@ -0,0 +1,17 @@ +flutter/ephemeral/ + +# Visual Studio user-specific files. +*.suo +*.user +*.userosscache +*.sln.docstates + +# Visual Studio build-related files. +x64/ +x86/ + +# Visual Studio cache files +# files ending in .cache can be ignored +*.[Cc]ache +# but keep track of directories ending in .cache +!*.[Cc]ache/ diff --git a/siro_rider/windows/CMakeLists.txt b/siro_rider/windows/CMakeLists.txt new file mode 100644 index 0000000..c18d87a --- /dev/null +++ b/siro_rider/windows/CMakeLists.txt @@ -0,0 +1,108 @@ +# Project-level configuration. +cmake_minimum_required(VERSION 3.14) +project(siro_rider LANGUAGES CXX) + +# The name of the executable created for the application. Change this to change +# the on-disk name of your application. +set(BINARY_NAME "siro_rider") + +# Explicitly opt in to modern CMake behaviors to avoid warnings with recent +# versions of CMake. +cmake_policy(VERSION 3.14...3.25) + +# Define build configuration option. +get_property(IS_MULTICONFIG GLOBAL PROPERTY GENERATOR_IS_MULTI_CONFIG) +if(IS_MULTICONFIG) + set(CMAKE_CONFIGURATION_TYPES "Debug;Profile;Release" + CACHE STRING "" FORCE) +else() + if(NOT CMAKE_BUILD_TYPE AND NOT CMAKE_CONFIGURATION_TYPES) + set(CMAKE_BUILD_TYPE "Debug" CACHE + STRING "Flutter build mode" FORCE) + set_property(CACHE CMAKE_BUILD_TYPE PROPERTY STRINGS + "Debug" "Profile" "Release") + endif() +endif() +# Define settings for the Profile build mode. +set(CMAKE_EXE_LINKER_FLAGS_PROFILE "${CMAKE_EXE_LINKER_FLAGS_RELEASE}") +set(CMAKE_SHARED_LINKER_FLAGS_PROFILE "${CMAKE_SHARED_LINKER_FLAGS_RELEASE}") +set(CMAKE_C_FLAGS_PROFILE "${CMAKE_C_FLAGS_RELEASE}") +set(CMAKE_CXX_FLAGS_PROFILE "${CMAKE_CXX_FLAGS_RELEASE}") + +# Use Unicode for all projects. +add_definitions(-DUNICODE -D_UNICODE) + +# Compilation settings that should be applied to most targets. +# +# Be cautious about adding new options here, as plugins use this function by +# default. In most cases, you should add new options to specific targets instead +# of modifying this function. +function(APPLY_STANDARD_SETTINGS TARGET) + target_compile_features(${TARGET} PUBLIC cxx_std_17) + target_compile_options(${TARGET} PRIVATE /W4 /WX /wd"4100") + target_compile_options(${TARGET} PRIVATE /EHsc) + target_compile_definitions(${TARGET} PRIVATE "_HAS_EXCEPTIONS=0") + target_compile_definitions(${TARGET} PRIVATE "$<$:_DEBUG>") +endfunction() + +# Flutter library and tool build rules. +set(FLUTTER_MANAGED_DIR "${CMAKE_CURRENT_SOURCE_DIR}/flutter") +add_subdirectory(${FLUTTER_MANAGED_DIR}) + +# Application build; see runner/CMakeLists.txt. +add_subdirectory("runner") + + +# Generated plugin build rules, which manage building the plugins and adding +# them to the application. +include(flutter/generated_plugins.cmake) + + +# === Installation === +# Support files are copied into place next to the executable, so that it can +# run in place. This is done instead of making a separate bundle (as on Linux) +# so that building and running from within Visual Studio will work. +set(BUILD_BUNDLE_DIR "$") +# Make the "install" step default, as it's required to run. +set(CMAKE_VS_INCLUDE_INSTALL_TO_DEFAULT_BUILD 1) +if(CMAKE_INSTALL_PREFIX_INITIALIZED_TO_DEFAULT) + set(CMAKE_INSTALL_PREFIX "${BUILD_BUNDLE_DIR}" CACHE PATH "..." FORCE) +endif() + +set(INSTALL_BUNDLE_DATA_DIR "${CMAKE_INSTALL_PREFIX}/data") +set(INSTALL_BUNDLE_LIB_DIR "${CMAKE_INSTALL_PREFIX}") + +install(TARGETS ${BINARY_NAME} RUNTIME DESTINATION "${CMAKE_INSTALL_PREFIX}" + COMPONENT Runtime) + +install(FILES "${FLUTTER_ICU_DATA_FILE}" DESTINATION "${INSTALL_BUNDLE_DATA_DIR}" + COMPONENT Runtime) + +install(FILES "${FLUTTER_LIBRARY}" DESTINATION "${INSTALL_BUNDLE_LIB_DIR}" + COMPONENT Runtime) + +if(PLUGIN_BUNDLED_LIBRARIES) + install(FILES "${PLUGIN_BUNDLED_LIBRARIES}" + DESTINATION "${INSTALL_BUNDLE_LIB_DIR}" + COMPONENT Runtime) +endif() + +# Copy the native assets provided by the build.dart from all packages. +set(NATIVE_ASSETS_DIR "${PROJECT_BUILD_DIR}native_assets/windows/") +install(DIRECTORY "${NATIVE_ASSETS_DIR}" + DESTINATION "${INSTALL_BUNDLE_LIB_DIR}" + COMPONENT Runtime) + +# Fully re-copy the assets directory on each build to avoid having stale files +# from a previous install. +set(FLUTTER_ASSET_DIR_NAME "flutter_assets") +install(CODE " + file(REMOVE_RECURSE \"${INSTALL_BUNDLE_DATA_DIR}/${FLUTTER_ASSET_DIR_NAME}\") + " COMPONENT Runtime) +install(DIRECTORY "${PROJECT_BUILD_DIR}/${FLUTTER_ASSET_DIR_NAME}" + DESTINATION "${INSTALL_BUNDLE_DATA_DIR}" COMPONENT Runtime) + +# Install the AOT library on non-Debug builds only. +install(FILES "${AOT_LIBRARY}" DESTINATION "${INSTALL_BUNDLE_DATA_DIR}" + CONFIGURATIONS Profile;Release + COMPONENT Runtime) diff --git a/siro_rider/windows/flutter/CMakeLists.txt b/siro_rider/windows/flutter/CMakeLists.txt new file mode 100644 index 0000000..903f489 --- /dev/null +++ b/siro_rider/windows/flutter/CMakeLists.txt @@ -0,0 +1,109 @@ +# This file controls Flutter-level build steps. It should not be edited. +cmake_minimum_required(VERSION 3.14) + +set(EPHEMERAL_DIR "${CMAKE_CURRENT_SOURCE_DIR}/ephemeral") + +# Configuration provided via flutter tool. +include(${EPHEMERAL_DIR}/generated_config.cmake) + +# TODO: Move the rest of this into files in ephemeral. See +# https://github.com/flutter/flutter/issues/57146. +set(WRAPPER_ROOT "${EPHEMERAL_DIR}/cpp_client_wrapper") + +# Set fallback configurations for older versions of the flutter tool. +if (NOT DEFINED FLUTTER_TARGET_PLATFORM) + set(FLUTTER_TARGET_PLATFORM "windows-x64") +endif() + +# === Flutter Library === +set(FLUTTER_LIBRARY "${EPHEMERAL_DIR}/flutter_windows.dll") + +# Published to parent scope for install step. +set(FLUTTER_LIBRARY ${FLUTTER_LIBRARY} PARENT_SCOPE) +set(FLUTTER_ICU_DATA_FILE "${EPHEMERAL_DIR}/icudtl.dat" PARENT_SCOPE) +set(PROJECT_BUILD_DIR "${PROJECT_DIR}/build/" PARENT_SCOPE) +set(AOT_LIBRARY "${PROJECT_DIR}/build/windows/app.so" PARENT_SCOPE) + +list(APPEND FLUTTER_LIBRARY_HEADERS + "flutter_export.h" + "flutter_windows.h" + "flutter_messenger.h" + "flutter_plugin_registrar.h" + "flutter_texture_registrar.h" +) +list(TRANSFORM FLUTTER_LIBRARY_HEADERS PREPEND "${EPHEMERAL_DIR}/") +add_library(flutter INTERFACE) +target_include_directories(flutter INTERFACE + "${EPHEMERAL_DIR}" +) +target_link_libraries(flutter INTERFACE "${FLUTTER_LIBRARY}.lib") +add_dependencies(flutter flutter_assemble) + +# === Wrapper === +list(APPEND CPP_WRAPPER_SOURCES_CORE + "core_implementations.cc" + "standard_codec.cc" +) +list(TRANSFORM CPP_WRAPPER_SOURCES_CORE PREPEND "${WRAPPER_ROOT}/") +list(APPEND CPP_WRAPPER_SOURCES_PLUGIN + "plugin_registrar.cc" +) +list(TRANSFORM CPP_WRAPPER_SOURCES_PLUGIN PREPEND "${WRAPPER_ROOT}/") +list(APPEND CPP_WRAPPER_SOURCES_APP + "flutter_engine.cc" + "flutter_view_controller.cc" +) +list(TRANSFORM CPP_WRAPPER_SOURCES_APP PREPEND "${WRAPPER_ROOT}/") + +# Wrapper sources needed for a plugin. +add_library(flutter_wrapper_plugin STATIC + ${CPP_WRAPPER_SOURCES_CORE} + ${CPP_WRAPPER_SOURCES_PLUGIN} +) +apply_standard_settings(flutter_wrapper_plugin) +set_target_properties(flutter_wrapper_plugin PROPERTIES + POSITION_INDEPENDENT_CODE ON) +set_target_properties(flutter_wrapper_plugin PROPERTIES + CXX_VISIBILITY_PRESET hidden) +target_link_libraries(flutter_wrapper_plugin PUBLIC flutter) +target_include_directories(flutter_wrapper_plugin PUBLIC + "${WRAPPER_ROOT}/include" +) +add_dependencies(flutter_wrapper_plugin flutter_assemble) + +# Wrapper sources needed for the runner. +add_library(flutter_wrapper_app STATIC + ${CPP_WRAPPER_SOURCES_CORE} + ${CPP_WRAPPER_SOURCES_APP} +) +apply_standard_settings(flutter_wrapper_app) +target_link_libraries(flutter_wrapper_app PUBLIC flutter) +target_include_directories(flutter_wrapper_app PUBLIC + "${WRAPPER_ROOT}/include" +) +add_dependencies(flutter_wrapper_app flutter_assemble) + +# === Flutter tool backend === +# _phony_ is a non-existent file to force this command to run every time, +# since currently there's no way to get a full input/output list from the +# flutter tool. +set(PHONY_OUTPUT "${CMAKE_CURRENT_BINARY_DIR}/_phony_") +set_source_files_properties("${PHONY_OUTPUT}" PROPERTIES SYMBOLIC TRUE) +add_custom_command( + OUTPUT ${FLUTTER_LIBRARY} ${FLUTTER_LIBRARY_HEADERS} + ${CPP_WRAPPER_SOURCES_CORE} ${CPP_WRAPPER_SOURCES_PLUGIN} + ${CPP_WRAPPER_SOURCES_APP} + ${PHONY_OUTPUT} + COMMAND ${CMAKE_COMMAND} -E env + ${FLUTTER_TOOL_ENVIRONMENT} + "${FLUTTER_ROOT}/packages/flutter_tools/bin/tool_backend.bat" + ${FLUTTER_TARGET_PLATFORM} $ + VERBATIM +) +add_custom_target(flutter_assemble DEPENDS + "${FLUTTER_LIBRARY}" + ${FLUTTER_LIBRARY_HEADERS} + ${CPP_WRAPPER_SOURCES_CORE} + ${CPP_WRAPPER_SOURCES_PLUGIN} + ${CPP_WRAPPER_SOURCES_APP} +) diff --git a/siro_rider/windows/flutter/generated_plugin_registrant.cc b/siro_rider/windows/flutter/generated_plugin_registrant.cc new file mode 100644 index 0000000..0862dcf --- /dev/null +++ b/siro_rider/windows/flutter/generated_plugin_registrant.cc @@ -0,0 +1,53 @@ +// +// Generated file. Do not edit. +// + +// clang-format off + +#include "generated_plugin_registrant.h" + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +void RegisterPlugins(flutter::PluginRegistry* registry) { + AppLinksPluginCApiRegisterWithRegistrar( + registry->GetRegistrarForPlugin("AppLinksPluginCApi")); + ConnectivityPlusWindowsPluginRegisterWithRegistrar( + registry->GetRegistrarForPlugin("ConnectivityPlusWindowsPlugin")); + FileSelectorWindowsRegisterWithRegistrar( + registry->GetRegistrarForPlugin("FileSelectorWindows")); + FirebaseAuthPluginCApiRegisterWithRegistrar( + registry->GetRegistrarForPlugin("FirebaseAuthPluginCApi")); + FirebaseCorePluginCApiRegisterWithRegistrar( + registry->GetRegistrarForPlugin("FirebaseCorePluginCApi")); + FlutterSecureStorageWindowsPluginRegisterWithRegistrar( + registry->GetRegistrarForPlugin("FlutterSecureStorageWindowsPlugin")); + FlutterTtsPluginRegisterWithRegistrar( + registry->GetRegistrarForPlugin("FlutterTtsPlugin")); + FlutterWebRTCPluginRegisterWithRegistrar( + registry->GetRegistrarForPlugin("FlutterWebRTCPlugin")); + GeolocatorWindowsRegisterWithRegistrar( + registry->GetRegistrarForPlugin("GeolocatorWindows")); + LocalAuthPluginRegisterWithRegistrar( + registry->GetRegistrarForPlugin("LocalAuthPlugin")); + PermissionHandlerWindowsPluginRegisterWithRegistrar( + registry->GetRegistrarForPlugin("PermissionHandlerWindowsPlugin")); + RecordWindowsPluginCApiRegisterWithRegistrar( + registry->GetRegistrarForPlugin("RecordWindowsPluginCApi")); + SharePlusWindowsPluginCApiRegisterWithRegistrar( + registry->GetRegistrarForPlugin("SharePlusWindowsPluginCApi")); + UrlLauncherWindowsRegisterWithRegistrar( + registry->GetRegistrarForPlugin("UrlLauncherWindows")); +} diff --git a/siro_rider/windows/flutter/generated_plugin_registrant.h b/siro_rider/windows/flutter/generated_plugin_registrant.h new file mode 100644 index 0000000..dc139d8 --- /dev/null +++ b/siro_rider/windows/flutter/generated_plugin_registrant.h @@ -0,0 +1,15 @@ +// +// Generated file. Do not edit. +// + +// clang-format off + +#ifndef GENERATED_PLUGIN_REGISTRANT_ +#define GENERATED_PLUGIN_REGISTRANT_ + +#include + +// Registers Flutter plugins. +void RegisterPlugins(flutter::PluginRegistry* registry); + +#endif // GENERATED_PLUGIN_REGISTRANT_ diff --git a/siro_rider/windows/flutter/generated_plugins.cmake b/siro_rider/windows/flutter/generated_plugins.cmake new file mode 100644 index 0000000..03d76f7 --- /dev/null +++ b/siro_rider/windows/flutter/generated_plugins.cmake @@ -0,0 +1,39 @@ +# +# Generated file, do not edit. +# + +list(APPEND FLUTTER_PLUGIN_LIST + app_links + connectivity_plus + file_selector_windows + firebase_auth + firebase_core + flutter_secure_storage_windows + flutter_tts + flutter_webrtc + geolocator_windows + local_auth_windows + permission_handler_windows + record_windows + share_plus + url_launcher_windows +) + +list(APPEND FLUTTER_FFI_PLUGIN_LIST + flutter_local_notifications_windows + jni +) + +set(PLUGIN_BUNDLED_LIBRARIES) + +foreach(plugin ${FLUTTER_PLUGIN_LIST}) + add_subdirectory(flutter/ephemeral/.plugin_symlinks/${plugin}/windows plugins/${plugin}) + target_link_libraries(${BINARY_NAME} PRIVATE ${plugin}_plugin) + list(APPEND PLUGIN_BUNDLED_LIBRARIES $) + list(APPEND PLUGIN_BUNDLED_LIBRARIES ${${plugin}_bundled_libraries}) +endforeach(plugin) + +foreach(ffi_plugin ${FLUTTER_FFI_PLUGIN_LIST}) + add_subdirectory(flutter/ephemeral/.plugin_symlinks/${ffi_plugin}/windows plugins/${ffi_plugin}) + list(APPEND PLUGIN_BUNDLED_LIBRARIES ${${ffi_plugin}_bundled_libraries}) +endforeach(ffi_plugin) diff --git a/siro_rider/windows/runner/CMakeLists.txt b/siro_rider/windows/runner/CMakeLists.txt new file mode 100644 index 0000000..394917c --- /dev/null +++ b/siro_rider/windows/runner/CMakeLists.txt @@ -0,0 +1,40 @@ +cmake_minimum_required(VERSION 3.14) +project(runner LANGUAGES CXX) + +# Define the application target. To change its name, change BINARY_NAME in the +# top-level CMakeLists.txt, not the value here, or `flutter run` will no longer +# work. +# +# Any new source files that you add to the application should be added here. +add_executable(${BINARY_NAME} WIN32 + "flutter_window.cpp" + "main.cpp" + "utils.cpp" + "win32_window.cpp" + "${FLUTTER_MANAGED_DIR}/generated_plugin_registrant.cc" + "Runner.rc" + "runner.exe.manifest" +) + +# Apply the standard set of build settings. This can be removed for applications +# that need different build settings. +apply_standard_settings(${BINARY_NAME}) + +# Add preprocessor definitions for the build version. +target_compile_definitions(${BINARY_NAME} PRIVATE "FLUTTER_VERSION=\"${FLUTTER_VERSION}\"") +target_compile_definitions(${BINARY_NAME} PRIVATE "FLUTTER_VERSION_MAJOR=${FLUTTER_VERSION_MAJOR}") +target_compile_definitions(${BINARY_NAME} PRIVATE "FLUTTER_VERSION_MINOR=${FLUTTER_VERSION_MINOR}") +target_compile_definitions(${BINARY_NAME} PRIVATE "FLUTTER_VERSION_PATCH=${FLUTTER_VERSION_PATCH}") +target_compile_definitions(${BINARY_NAME} PRIVATE "FLUTTER_VERSION_BUILD=${FLUTTER_VERSION_BUILD}") + +# Disable Windows macros that collide with C++ standard library functions. +target_compile_definitions(${BINARY_NAME} PRIVATE "NOMINMAX") + +# Add dependency libraries and include directories. Add any application-specific +# dependencies here. +target_link_libraries(${BINARY_NAME} PRIVATE flutter flutter_wrapper_app) +target_link_libraries(${BINARY_NAME} PRIVATE "dwmapi.lib") +target_include_directories(${BINARY_NAME} PRIVATE "${CMAKE_SOURCE_DIR}") + +# Run the Flutter tool portions of the build. This must not be removed. +add_dependencies(${BINARY_NAME} flutter_assemble) diff --git a/siro_rider/windows/runner/Runner.rc b/siro_rider/windows/runner/Runner.rc new file mode 100644 index 0000000..e399ce7 --- /dev/null +++ b/siro_rider/windows/runner/Runner.rc @@ -0,0 +1,121 @@ +// Microsoft Visual C++ generated resource script. +// +#pragma code_page(65001) +#include "resource.h" + +#define APSTUDIO_READONLY_SYMBOLS +///////////////////////////////////////////////////////////////////////////// +// +// Generated from the TEXTINCLUDE 2 resource. +// +#include "winres.h" + +///////////////////////////////////////////////////////////////////////////// +#undef APSTUDIO_READONLY_SYMBOLS + +///////////////////////////////////////////////////////////////////////////// +// English (United States) resources + +#if !defined(AFX_RESOURCE_DLL) || defined(AFX_TARG_ENU) +LANGUAGE LANG_ENGLISH, SUBLANG_ENGLISH_US + +#ifdef APSTUDIO_INVOKED +///////////////////////////////////////////////////////////////////////////// +// +// TEXTINCLUDE +// + +1 TEXTINCLUDE +BEGIN + "resource.h\0" +END + +2 TEXTINCLUDE +BEGIN + "#include ""winres.h""\r\n" + "\0" +END + +3 TEXTINCLUDE +BEGIN + "\r\n" + "\0" +END + +#endif // APSTUDIO_INVOKED + + +///////////////////////////////////////////////////////////////////////////// +// +// Icon +// + +// Icon with lowest ID value placed first to ensure application icon +// remains consistent on all systems. +IDI_APP_ICON ICON "resources\\app_icon.ico" + + +///////////////////////////////////////////////////////////////////////////// +// +// Version +// + +#if defined(FLUTTER_VERSION_MAJOR) && defined(FLUTTER_VERSION_MINOR) && defined(FLUTTER_VERSION_PATCH) && defined(FLUTTER_VERSION_BUILD) +#define VERSION_AS_NUMBER FLUTTER_VERSION_MAJOR,FLUTTER_VERSION_MINOR,FLUTTER_VERSION_PATCH,FLUTTER_VERSION_BUILD +#else +#define VERSION_AS_NUMBER 1,0,0,0 +#endif + +#if defined(FLUTTER_VERSION) +#define VERSION_AS_STRING FLUTTER_VERSION +#else +#define VERSION_AS_STRING "1.0.0" +#endif + +VS_VERSION_INFO VERSIONINFO + FILEVERSION VERSION_AS_NUMBER + PRODUCTVERSION VERSION_AS_NUMBER + FILEFLAGSMASK VS_FFI_FILEFLAGSMASK +#ifdef _DEBUG + FILEFLAGS VS_FF_DEBUG +#else + FILEFLAGS 0x0L +#endif + FILEOS VOS__WINDOWS32 + FILETYPE VFT_APP + FILESUBTYPE 0x0L +BEGIN + BLOCK "StringFileInfo" + BEGIN + BLOCK "040904e4" + BEGIN + VALUE "CompanyName", "com.siro" "\0" + VALUE "FileDescription", "siro_rider" "\0" + VALUE "FileVersion", VERSION_AS_STRING "\0" + VALUE "InternalName", "siro_rider" "\0" + VALUE "LegalCopyright", "Copyright (C) 2026 com.siro. All rights reserved." "\0" + VALUE "OriginalFilename", "siro_rider.exe" "\0" + VALUE "ProductName", "siro_rider" "\0" + VALUE "ProductVersion", VERSION_AS_STRING "\0" + END + END + BLOCK "VarFileInfo" + BEGIN + VALUE "Translation", 0x409, 1252 + END +END + +#endif // English (United States) resources +///////////////////////////////////////////////////////////////////////////// + + + +#ifndef APSTUDIO_INVOKED +///////////////////////////////////////////////////////////////////////////// +// +// Generated from the TEXTINCLUDE 3 resource. +// + + +///////////////////////////////////////////////////////////////////////////// +#endif // not APSTUDIO_INVOKED diff --git a/siro_rider/windows/runner/flutter_window.cpp b/siro_rider/windows/runner/flutter_window.cpp new file mode 100644 index 0000000..955ee30 --- /dev/null +++ b/siro_rider/windows/runner/flutter_window.cpp @@ -0,0 +1,71 @@ +#include "flutter_window.h" + +#include + +#include "flutter/generated_plugin_registrant.h" + +FlutterWindow::FlutterWindow(const flutter::DartProject& project) + : project_(project) {} + +FlutterWindow::~FlutterWindow() {} + +bool FlutterWindow::OnCreate() { + if (!Win32Window::OnCreate()) { + return false; + } + + RECT frame = GetClientArea(); + + // The size here must match the window dimensions to avoid unnecessary surface + // creation / destruction in the startup path. + flutter_controller_ = std::make_unique( + frame.right - frame.left, frame.bottom - frame.top, project_); + // Ensure that basic setup of the controller was successful. + if (!flutter_controller_->engine() || !flutter_controller_->view()) { + return false; + } + RegisterPlugins(flutter_controller_->engine()); + SetChildContent(flutter_controller_->view()->GetNativeWindow()); + + flutter_controller_->engine()->SetNextFrameCallback([&]() { + this->Show(); + }); + + // Flutter can complete the first frame before the "show window" callback is + // registered. The following call ensures a frame is pending to ensure the + // window is shown. It is a no-op if the first frame hasn't completed yet. + flutter_controller_->ForceRedraw(); + + return true; +} + +void FlutterWindow::OnDestroy() { + if (flutter_controller_) { + flutter_controller_ = nullptr; + } + + Win32Window::OnDestroy(); +} + +LRESULT +FlutterWindow::MessageHandler(HWND hwnd, UINT const message, + WPARAM const wparam, + LPARAM const lparam) noexcept { + // Give Flutter, including plugins, an opportunity to handle window messages. + if (flutter_controller_) { + std::optional result = + flutter_controller_->HandleTopLevelWindowProc(hwnd, message, wparam, + lparam); + if (result) { + return *result; + } + } + + switch (message) { + case WM_FONTCHANGE: + flutter_controller_->engine()->ReloadSystemFonts(); + break; + } + + return Win32Window::MessageHandler(hwnd, message, wparam, lparam); +} diff --git a/siro_rider/windows/runner/flutter_window.h b/siro_rider/windows/runner/flutter_window.h new file mode 100644 index 0000000..6da0652 --- /dev/null +++ b/siro_rider/windows/runner/flutter_window.h @@ -0,0 +1,33 @@ +#ifndef RUNNER_FLUTTER_WINDOW_H_ +#define RUNNER_FLUTTER_WINDOW_H_ + +#include +#include + +#include + +#include "win32_window.h" + +// A window that does nothing but host a Flutter view. +class FlutterWindow : public Win32Window { + public: + // Creates a new FlutterWindow hosting a Flutter view running |project|. + explicit FlutterWindow(const flutter::DartProject& project); + virtual ~FlutterWindow(); + + protected: + // Win32Window: + bool OnCreate() override; + void OnDestroy() override; + LRESULT MessageHandler(HWND window, UINT const message, WPARAM const wparam, + LPARAM const lparam) noexcept override; + + private: + // The project to run. + flutter::DartProject project_; + + // The Flutter instance hosted by this window. + std::unique_ptr flutter_controller_; +}; + +#endif // RUNNER_FLUTTER_WINDOW_H_ diff --git a/siro_rider/windows/runner/main.cpp b/siro_rider/windows/runner/main.cpp new file mode 100644 index 0000000..ab8ca5f --- /dev/null +++ b/siro_rider/windows/runner/main.cpp @@ -0,0 +1,43 @@ +#include +#include +#include + +#include "flutter_window.h" +#include "utils.h" + +int APIENTRY wWinMain(_In_ HINSTANCE instance, _In_opt_ HINSTANCE prev, + _In_ wchar_t *command_line, _In_ int show_command) { + // Attach to console when present (e.g., 'flutter run') or create a + // new console when running with a debugger. + if (!::AttachConsole(ATTACH_PARENT_PROCESS) && ::IsDebuggerPresent()) { + CreateAndAttachConsole(); + } + + // Initialize COM, so that it is available for use in the library and/or + // plugins. + ::CoInitializeEx(nullptr, COINIT_APARTMENTTHREADED); + + flutter::DartProject project(L"data"); + + std::vector command_line_arguments = + GetCommandLineArguments(); + + project.set_dart_entrypoint_arguments(std::move(command_line_arguments)); + + FlutterWindow window(project); + Win32Window::Point origin(10, 10); + Win32Window::Size size(1280, 720); + if (!window.Create(L"siro_rider", origin, size)) { + return EXIT_FAILURE; + } + window.SetQuitOnClose(true); + + ::MSG msg; + while (::GetMessage(&msg, nullptr, 0, 0)) { + ::TranslateMessage(&msg); + ::DispatchMessage(&msg); + } + + ::CoUninitialize(); + return EXIT_SUCCESS; +} diff --git a/siro_rider/windows/runner/resource.h b/siro_rider/windows/runner/resource.h new file mode 100644 index 0000000..66a65d1 --- /dev/null +++ b/siro_rider/windows/runner/resource.h @@ -0,0 +1,16 @@ +//{{NO_DEPENDENCIES}} +// Microsoft Visual C++ generated include file. +// Used by Runner.rc +// +#define IDI_APP_ICON 101 + +// Next default values for new objects +// +#ifdef APSTUDIO_INVOKED +#ifndef APSTUDIO_READONLY_SYMBOLS +#define _APS_NEXT_RESOURCE_VALUE 102 +#define _APS_NEXT_COMMAND_VALUE 40001 +#define _APS_NEXT_CONTROL_VALUE 1001 +#define _APS_NEXT_SYMED_VALUE 101 +#endif +#endif diff --git a/siro_rider/windows/runner/resources/app_icon.ico b/siro_rider/windows/runner/resources/app_icon.ico new file mode 100644 index 0000000..c04e20c Binary files /dev/null and b/siro_rider/windows/runner/resources/app_icon.ico differ diff --git a/siro_rider/windows/runner/runner.exe.manifest b/siro_rider/windows/runner/runner.exe.manifest new file mode 100644 index 0000000..153653e --- /dev/null +++ b/siro_rider/windows/runner/runner.exe.manifest @@ -0,0 +1,14 @@ + + + + + PerMonitorV2 + + + + + + + + + diff --git a/siro_rider/windows/runner/utils.cpp b/siro_rider/windows/runner/utils.cpp new file mode 100644 index 0000000..3a0b465 --- /dev/null +++ b/siro_rider/windows/runner/utils.cpp @@ -0,0 +1,65 @@ +#include "utils.h" + +#include +#include +#include +#include + +#include + +void CreateAndAttachConsole() { + if (::AllocConsole()) { + FILE *unused; + if (freopen_s(&unused, "CONOUT$", "w", stdout)) { + _dup2(_fileno(stdout), 1); + } + if (freopen_s(&unused, "CONOUT$", "w", stderr)) { + _dup2(_fileno(stdout), 2); + } + std::ios::sync_with_stdio(); + FlutterDesktopResyncOutputStreams(); + } +} + +std::vector GetCommandLineArguments() { + // Convert the UTF-16 command line arguments to UTF-8 for the Engine to use. + int argc; + wchar_t** argv = ::CommandLineToArgvW(::GetCommandLineW(), &argc); + if (argv == nullptr) { + return std::vector(); + } + + std::vector command_line_arguments; + + // Skip the first argument as it's the binary name. + for (int i = 1; i < argc; i++) { + command_line_arguments.push_back(Utf8FromUtf16(argv[i])); + } + + ::LocalFree(argv); + + return command_line_arguments; +} + +std::string Utf8FromUtf16(const wchar_t* utf16_string) { + if (utf16_string == nullptr) { + return std::string(); + } + unsigned int target_length = ::WideCharToMultiByte( + CP_UTF8, WC_ERR_INVALID_CHARS, utf16_string, + -1, nullptr, 0, nullptr, nullptr) + -1; // remove the trailing null character + int input_length = (int)wcslen(utf16_string); + std::string utf8_string; + if (target_length == 0 || target_length > utf8_string.max_size()) { + return utf8_string; + } + utf8_string.resize(target_length); + int converted_length = ::WideCharToMultiByte( + CP_UTF8, WC_ERR_INVALID_CHARS, utf16_string, + input_length, utf8_string.data(), target_length, nullptr, nullptr); + if (converted_length == 0) { + return std::string(); + } + return utf8_string; +} diff --git a/siro_rider/windows/runner/utils.h b/siro_rider/windows/runner/utils.h new file mode 100644 index 0000000..3879d54 --- /dev/null +++ b/siro_rider/windows/runner/utils.h @@ -0,0 +1,19 @@ +#ifndef RUNNER_UTILS_H_ +#define RUNNER_UTILS_H_ + +#include +#include + +// Creates a console for the process, and redirects stdout and stderr to +// it for both the runner and the Flutter library. +void CreateAndAttachConsole(); + +// Takes a null-terminated wchar_t* encoded in UTF-16 and returns a std::string +// encoded in UTF-8. Returns an empty std::string on failure. +std::string Utf8FromUtf16(const wchar_t* utf16_string); + +// Gets the command line arguments passed in as a std::vector, +// encoded in UTF-8. Returns an empty std::vector on failure. +std::vector GetCommandLineArguments(); + +#endif // RUNNER_UTILS_H_ diff --git a/siro_rider/windows/runner/win32_window.cpp b/siro_rider/windows/runner/win32_window.cpp new file mode 100644 index 0000000..60608d0 --- /dev/null +++ b/siro_rider/windows/runner/win32_window.cpp @@ -0,0 +1,288 @@ +#include "win32_window.h" + +#include +#include + +#include "resource.h" + +namespace { + +/// Window attribute that enables dark mode window decorations. +/// +/// Redefined in case the developer's machine has a Windows SDK older than +/// version 10.0.22000.0. +/// See: https://docs.microsoft.com/windows/win32/api/dwmapi/ne-dwmapi-dwmwindowattribute +#ifndef DWMWA_USE_IMMERSIVE_DARK_MODE +#define DWMWA_USE_IMMERSIVE_DARK_MODE 20 +#endif + +constexpr const wchar_t kWindowClassName[] = L"FLUTTER_RUNNER_WIN32_WINDOW"; + +/// Registry key for app theme preference. +/// +/// A value of 0 indicates apps should use dark mode. A non-zero or missing +/// value indicates apps should use light mode. +constexpr const wchar_t kGetPreferredBrightnessRegKey[] = + L"Software\\Microsoft\\Windows\\CurrentVersion\\Themes\\Personalize"; +constexpr const wchar_t kGetPreferredBrightnessRegValue[] = L"AppsUseLightTheme"; + +// The number of Win32Window objects that currently exist. +static int g_active_window_count = 0; + +using EnableNonClientDpiScaling = BOOL __stdcall(HWND hwnd); + +// Scale helper to convert logical scaler values to physical using passed in +// scale factor +int Scale(int source, double scale_factor) { + return static_cast(source * scale_factor); +} + +// Dynamically loads the |EnableNonClientDpiScaling| from the User32 module. +// This API is only needed for PerMonitor V1 awareness mode. +void EnableFullDpiSupportIfAvailable(HWND hwnd) { + HMODULE user32_module = LoadLibraryA("User32.dll"); + if (!user32_module) { + return; + } + auto enable_non_client_dpi_scaling = + reinterpret_cast( + GetProcAddress(user32_module, "EnableNonClientDpiScaling")); + if (enable_non_client_dpi_scaling != nullptr) { + enable_non_client_dpi_scaling(hwnd); + } + FreeLibrary(user32_module); +} + +} // namespace + +// Manages the Win32Window's window class registration. +class WindowClassRegistrar { + public: + ~WindowClassRegistrar() = default; + + // Returns the singleton registrar instance. + static WindowClassRegistrar* GetInstance() { + if (!instance_) { + instance_ = new WindowClassRegistrar(); + } + return instance_; + } + + // Returns the name of the window class, registering the class if it hasn't + // previously been registered. + const wchar_t* GetWindowClass(); + + // Unregisters the window class. Should only be called if there are no + // instances of the window. + void UnregisterWindowClass(); + + private: + WindowClassRegistrar() = default; + + static WindowClassRegistrar* instance_; + + bool class_registered_ = false; +}; + +WindowClassRegistrar* WindowClassRegistrar::instance_ = nullptr; + +const wchar_t* WindowClassRegistrar::GetWindowClass() { + if (!class_registered_) { + WNDCLASS window_class{}; + window_class.hCursor = LoadCursor(nullptr, IDC_ARROW); + window_class.lpszClassName = kWindowClassName; + window_class.style = CS_HREDRAW | CS_VREDRAW; + window_class.cbClsExtra = 0; + window_class.cbWndExtra = 0; + window_class.hInstance = GetModuleHandle(nullptr); + window_class.hIcon = + LoadIcon(window_class.hInstance, MAKEINTRESOURCE(IDI_APP_ICON)); + window_class.hbrBackground = 0; + window_class.lpszMenuName = nullptr; + window_class.lpfnWndProc = Win32Window::WndProc; + RegisterClass(&window_class); + class_registered_ = true; + } + return kWindowClassName; +} + +void WindowClassRegistrar::UnregisterWindowClass() { + UnregisterClass(kWindowClassName, nullptr); + class_registered_ = false; +} + +Win32Window::Win32Window() { + ++g_active_window_count; +} + +Win32Window::~Win32Window() { + --g_active_window_count; + Destroy(); +} + +bool Win32Window::Create(const std::wstring& title, + const Point& origin, + const Size& size) { + Destroy(); + + const wchar_t* window_class = + WindowClassRegistrar::GetInstance()->GetWindowClass(); + + const POINT target_point = {static_cast(origin.x), + static_cast(origin.y)}; + HMONITOR monitor = MonitorFromPoint(target_point, MONITOR_DEFAULTTONEAREST); + UINT dpi = FlutterDesktopGetDpiForMonitor(monitor); + double scale_factor = dpi / 96.0; + + HWND window = CreateWindow( + window_class, title.c_str(), WS_OVERLAPPEDWINDOW, + Scale(origin.x, scale_factor), Scale(origin.y, scale_factor), + Scale(size.width, scale_factor), Scale(size.height, scale_factor), + nullptr, nullptr, GetModuleHandle(nullptr), this); + + if (!window) { + return false; + } + + UpdateTheme(window); + + return OnCreate(); +} + +bool Win32Window::Show() { + return ShowWindow(window_handle_, SW_SHOWNORMAL); +} + +// static +LRESULT CALLBACK Win32Window::WndProc(HWND const window, + UINT const message, + WPARAM const wparam, + LPARAM const lparam) noexcept { + if (message == WM_NCCREATE) { + auto window_struct = reinterpret_cast(lparam); + SetWindowLongPtr(window, GWLP_USERDATA, + reinterpret_cast(window_struct->lpCreateParams)); + + auto that = static_cast(window_struct->lpCreateParams); + EnableFullDpiSupportIfAvailable(window); + that->window_handle_ = window; + } else if (Win32Window* that = GetThisFromHandle(window)) { + return that->MessageHandler(window, message, wparam, lparam); + } + + return DefWindowProc(window, message, wparam, lparam); +} + +LRESULT +Win32Window::MessageHandler(HWND hwnd, + UINT const message, + WPARAM const wparam, + LPARAM const lparam) noexcept { + switch (message) { + case WM_DESTROY: + window_handle_ = nullptr; + Destroy(); + if (quit_on_close_) { + PostQuitMessage(0); + } + return 0; + + case WM_DPICHANGED: { + auto newRectSize = reinterpret_cast(lparam); + LONG newWidth = newRectSize->right - newRectSize->left; + LONG newHeight = newRectSize->bottom - newRectSize->top; + + SetWindowPos(hwnd, nullptr, newRectSize->left, newRectSize->top, newWidth, + newHeight, SWP_NOZORDER | SWP_NOACTIVATE); + + return 0; + } + case WM_SIZE: { + RECT rect = GetClientArea(); + if (child_content_ != nullptr) { + // Size and position the child window. + MoveWindow(child_content_, rect.left, rect.top, rect.right - rect.left, + rect.bottom - rect.top, TRUE); + } + return 0; + } + + case WM_ACTIVATE: + if (child_content_ != nullptr) { + SetFocus(child_content_); + } + return 0; + + case WM_DWMCOLORIZATIONCOLORCHANGED: + UpdateTheme(hwnd); + return 0; + } + + return DefWindowProc(window_handle_, message, wparam, lparam); +} + +void Win32Window::Destroy() { + OnDestroy(); + + if (window_handle_) { + DestroyWindow(window_handle_); + window_handle_ = nullptr; + } + if (g_active_window_count == 0) { + WindowClassRegistrar::GetInstance()->UnregisterWindowClass(); + } +} + +Win32Window* Win32Window::GetThisFromHandle(HWND const window) noexcept { + return reinterpret_cast( + GetWindowLongPtr(window, GWLP_USERDATA)); +} + +void Win32Window::SetChildContent(HWND content) { + child_content_ = content; + SetParent(content, window_handle_); + RECT frame = GetClientArea(); + + MoveWindow(content, frame.left, frame.top, frame.right - frame.left, + frame.bottom - frame.top, true); + + SetFocus(child_content_); +} + +RECT Win32Window::GetClientArea() { + RECT frame; + GetClientRect(window_handle_, &frame); + return frame; +} + +HWND Win32Window::GetHandle() { + return window_handle_; +} + +void Win32Window::SetQuitOnClose(bool quit_on_close) { + quit_on_close_ = quit_on_close; +} + +bool Win32Window::OnCreate() { + // No-op; provided for subclasses. + return true; +} + +void Win32Window::OnDestroy() { + // No-op; provided for subclasses. +} + +void Win32Window::UpdateTheme(HWND const window) { + DWORD light_mode; + DWORD light_mode_size = sizeof(light_mode); + LSTATUS result = RegGetValue(HKEY_CURRENT_USER, kGetPreferredBrightnessRegKey, + kGetPreferredBrightnessRegValue, + RRF_RT_REG_DWORD, nullptr, &light_mode, + &light_mode_size); + + if (result == ERROR_SUCCESS) { + BOOL enable_dark_mode = light_mode == 0; + DwmSetWindowAttribute(window, DWMWA_USE_IMMERSIVE_DARK_MODE, + &enable_dark_mode, sizeof(enable_dark_mode)); + } +} diff --git a/siro_rider/windows/runner/win32_window.h b/siro_rider/windows/runner/win32_window.h new file mode 100644 index 0000000..e901dde --- /dev/null +++ b/siro_rider/windows/runner/win32_window.h @@ -0,0 +1,102 @@ +#ifndef RUNNER_WIN32_WINDOW_H_ +#define RUNNER_WIN32_WINDOW_H_ + +#include + +#include +#include +#include + +// A class abstraction for a high DPI-aware Win32 Window. Intended to be +// inherited from by classes that wish to specialize with custom +// rendering and input handling +class Win32Window { + public: + struct Point { + unsigned int x; + unsigned int y; + Point(unsigned int x, unsigned int y) : x(x), y(y) {} + }; + + struct Size { + unsigned int width; + unsigned int height; + Size(unsigned int width, unsigned int height) + : width(width), height(height) {} + }; + + Win32Window(); + virtual ~Win32Window(); + + // Creates a win32 window with |title| that is positioned and sized using + // |origin| and |size|. New windows are created on the default monitor. Window + // sizes are specified to the OS in physical pixels, hence to ensure a + // consistent size this function will scale the inputted width and height as + // as appropriate for the default monitor. The window is invisible until + // |Show| is called. Returns true if the window was created successfully. + bool Create(const std::wstring& title, const Point& origin, const Size& size); + + // Show the current window. Returns true if the window was successfully shown. + bool Show(); + + // Release OS resources associated with window. + void Destroy(); + + // Inserts |content| into the window tree. + void SetChildContent(HWND content); + + // Returns the backing Window handle to enable clients to set icon and other + // window properties. Returns nullptr if the window has been destroyed. + HWND GetHandle(); + + // If true, closing this window will quit the application. + void SetQuitOnClose(bool quit_on_close); + + // Return a RECT representing the bounds of the current client area. + RECT GetClientArea(); + + protected: + // Processes and route salient window messages for mouse handling, + // size change and DPI. Delegates handling of these to member overloads that + // inheriting classes can handle. + virtual LRESULT MessageHandler(HWND window, + UINT const message, + WPARAM const wparam, + LPARAM const lparam) noexcept; + + // Called when CreateAndShow is called, allowing subclass window-related + // setup. Subclasses should return false if setup fails. + virtual bool OnCreate(); + + // Called when Destroy is called. + virtual void OnDestroy(); + + private: + friend class WindowClassRegistrar; + + // OS callback called by message pump. Handles the WM_NCCREATE message which + // is passed when the non-client area is being created and enables automatic + // non-client DPI scaling so that the non-client area automatically + // responds to changes in DPI. All other messages are handled by + // MessageHandler. + static LRESULT CALLBACK WndProc(HWND const window, + UINT const message, + WPARAM const wparam, + LPARAM const lparam) noexcept; + + // Retrieves a class instance pointer for |window| + static Win32Window* GetThisFromHandle(HWND const window) noexcept; + + // Update the window frame's theme to match the system theme. + static void UpdateTheme(HWND const window); + + bool quit_on_close_ = false; + + // window handle for top level window. + HWND window_handle_ = nullptr; + + // window handle for hosted content. + HWND child_content_ = nullptr; +}; + +#endif // RUNNER_WIN32_WINDOW_H_ diff --git a/siro_service/.env b/siro_service/.env new file mode 100644 index 0000000..a776e1a --- /dev/null +++ b/siro_service/.env @@ -0,0 +1,119 @@ +basicAuthCredentials=wqnmqqsjyvwjv:nqrYJP@1737XrXlBl +basicCompareFaces=zjujluqfpj:nqrYjp@1737XrXlBl +basicCompareFacesURL='https://face-detect-f6924392c4c7.herokuapp.com/compare_faces' +accountSIDTwillo=QFx0qy456juj383n9xuy2194q629q1fj0y7XrXlBl +serverAPI=QQQQobSrrFi:QVQ87xU7zwCvmZzZdaxuS2f23Y4mz7MzyOzr8od2br6KYyeFaTVLG3K3hx5ZaUyx7eYvAYpAVdKk-286NTRi3zs9iSOnXtXRIxswg3KecBmsl3VxJ9wO-vIpwu4Pv7dkHkXniuxMSDgWXrXlBl +mapAPIKEY=AIzaSyCFsWBqvkXzk1Gb-bCGxwqTwJQKIeHjH64 +email=@intaleqapp.com +getapiKey=zg-4C26q4SYgBKQeHZDqkWowC9XrxgUEfUy9JRw2rm6Q2adb3kjwXrXlBl +mapAPIKEYIOS=AIzaSyDzGO9a-1IDMLD2FxhmOO9ONL1gMssFa9g +twilloRecoveryCode=CAU79DHPH1BjE9PUH4ETXTSXZXrXlBl +apiKeyHere=g_WNUb5L-tripz7-F8omHpUmgIzH7ETeH9xZ8RwGG9_G8zX9A +authTokenTwillo=70u98ju0214oxx4q0u74028u021u4qu65XrXlBl +chatGPTkey=zg-4C26q4SYgBKQeHZDqkWowC9XrxgUEfUy9JRw2rm6Q2adb3kjwXrXlBl +transactionCloude=Qhcwuilomqcoib:QVO_JNYED2XWA26YXKC2TP:YK1DVH6SJB31N3PE1UXrXlBl +visionApi=3pALsqSSYTvzp69Q5FMIgbzjG6Z1zktJXrXlBl +chatGPTkeySefer=zg-IiR3i4ooza3Yvhvb9rZk1C9XrxgUE0l8jRRZrHj3Qe5QXPlqVXrXlBl +chatGPTkeySeferNew=zg-Z4oAJcAROgNXjgrEIU8fKC9XrxgUE4Qtrrlq1yiux0jL3dITSXrXlBl +secretKey=zg_ropj_57Iiv6pMFCBFq3C2n6IXlmjykpxDmW93SW3vvXh68UA9T5FORTWgWsT37StKsOPdwDdsy8qR9srMUluahs3nPHvgBa33tGk90vV5XrXlBl +stripe_publishableKe=vg_propj_57Iiv6MFCBFq3C2n6kNJnZByV6nuDtXe9IjEPOfhmpDtWmt3MLR0gQpiHcQmAFMUPrZc3QiCDjxBZLbxDC3efxWxz33bWH1ZgrsXrXlBl +llamaKey=RR-EuyoFDUvfRDBoj46fZKAtKJ3voM8Mt768cPeJV7GNdAkPTKdY8Odm9n4ggGqI5GyoXrXlBl +serverPHP=https://api.sefer.live/sefer +seferAlexandriaServer=https://seferalexandria.site/sefer +seferPaymentServer=https://seferpw.shop/sefer +# seferCairoServer=https://sefer.click/sefer +seferCairoServer=https://server.sefer.live/sefer.click/sefer +seferGizaServer=https://gizasefer.online/sefer +whatappID=3699397362811879 +whatsapp=EAAOtbZBSUK74BOzW9yb74EgApQYtI88nYtE9jQi9QnLGpw3FQpc5dxIlDgVJzcMywEBqNYf3s8pkk6cZB5Q0tkKuSOZBsOvMZA3Tcth0IlBHSaMVtcRZCsaTKNSUpfLRGRb0rhLezNFllpYBgmnfbhUazSZBYXdr40nmN4QEgweK2eqYQnTTNuryTOyBkKZB1MXMw6U7QnTRQDxHbUVlqgIRTrhaooZD +cohere=Aulwd8y5SPWos0hJhlG0toUf8gOhUUrpf5Q2TPmVGXrXlBl +claudeAiAPI=zg-qbc-qvo39l-xWOxIGwWTOzCFBnIYSKKhfyz_KVAvrH-6_4ZEJL68G_QBH26oeTOMMoQug9KuOjjKSP_A4S3SUDlbxR9duVzoQ-MkX_UQQQXrXlBl +payPalClientId=QALymlfNI5Tzt4s-ysoz6vD4_nqX0SUtkC_qYV-Ugk5gaM_8Z-kg4L53k8Uux_4jEWXDkNpXGSWPpIzDFXrXlBl +payPalClientIdLive=QZFkjAoZfGtngNserll6r3cC56Xl1sVLQkn5dMbyebhzJY59EQ3hz7YxaEqEDYPTUFcQWqvePaQ5UJJVRXrXlBl +payPalSecret=JBAAvqJQGUsKD0Zjh4KjeczxfBFx-38SdlbIS56VRM8NDfe6mjMeZJhNLJek5XgQCqKCHtRf6MjRy-f8XrXlBl +payPalSecretLive=JQDATqkknDfiFpEAN60KB4pGpDaJjyqBAd9jxMBPpzWU1P1k3H1jZhQjn73EHsKQna74P8p98hgOnMaWPWXrXlBl +geminiApi=QOmqZsQYm08vlOqjI7klVJfvP4WBFEoemjgy396iXrXlBl +geminiApiMasa=QOmqZsQIpdM4BRsKmaDJOP7dZp5-c6NWfch7PAlQXrXlBl +agoraAppId=71880f2j636o509j24y5294480y30u848XrXlBl +agoraAppCertificate=j17q944u49390jhq758u1649448q2y6xfuXrXlBl +usernamePayMob=37319104052XrXlBl +passwordPayMob='g@nkD2#99k!hD_.wXrXlBl' +integrationIdPayMob=0237630XrXlBl +payMobApikey='MDrGqKEWS1rVqhjggHvEPDvPjJ7vZDBExrO7S3BEBgrlfUwTA3i5RnP5ZnvoL3M2S9rEBgrlNTdexH5pTPf7NJrvy1reZJv1Tn7zf7vTIDywjHg1C7Ley38HTDyNA3v7TPfdxJrax1rwPmPtMJyzqKEYZeghq3MuLUrFH3A1AgHcH15CZ9UaZTLOxnw0BTdzHHrBArisZerUMUUzZ1BnBeEijHvNjYLnS1BUICMhSmPhA15ifHyVqKEMHWyKLbyuIPvcH9UeL3vZyDf=cvcXrXlBlbbbbb' +integrationIdPayMobWallet=0277739XrXlBl +ocpApimSubscriptionKey=0f5dacccdbce4131b1a5f952996302e3 +smsPasswordEgypt="J)Vh=qb/@MXrXlBl" +chatGPTkeySeferNew4=zg-vlie-2l1ZlpximLJ6wQOvbb4TnC9XrxgUEyVQIu6TID4qP4FUUqoS5XrXlBl +anthropicAIkeySeferNew=zg-qbc-qvo39-mn4VdMQ5nuJeIYhMN4PDYr7qox3-t2i1Lh7aNTDfYF-Gf8whUJZCs47EeelKn8_UcmUMmiSLaf0UJg0DvUlQrDt-76CRrkQQXrXlBl +llama3Key=kzg_uTXy3e9DBbCQ1FnMGmxYwTKysx9US1burxJj4fFwOje4LZBUFKJS1XrXlBl +payMobOutClientSecrret='xyjjRlkahJM0Xc38WjApCOh8bvgL9slFpNdM9YeCu9AhLqboKMPtmSvc2N9O4tXxFLV2JAV6stBSTAGFGCVubGe6MNpc7MzJnZ3SiT6GpavBoCLWkUvVbdSDaM0zHvuBOXrXlBl' +payMobOutClient_id='Z05ut48dVkkS2gI2zenFFcKsfDKfHAU0WELqKyJ0LXrXlBl' +payMobOutPassword='D2zJFxkE#LNk3vz38z2dYxpNfWXrXlBl' +payMobOutUserName='zjujl_qvo_fwkjfgjlXrXlBl' +keyOfApp=balsev@7696tabnaazesmeheregzpfjoXrXrBr +initializationVector=qxfyjukwoegrnbivXrXrBr +privateKeyFCM=WZSHwLUNI/wlyLUyIZHYf/pgOo6JZplTQqKK2HJmuSJ+r4Iygz/W+03uFPFS4iLv4AIuZ5+wFBDU9gf240fgjhjJgq1bwiW4TrlTh4YhEtHjiPTBCielwIcYFrhrlD4xLTHQC8feSZuZ4t3wZISRfqjuIyu58yhG5H64RifbD5efjzE6KJCivhIpXcK5k1t32lMnlLKzPkSqW2znCXYhRNOQEL+sAllmQNpHVy7LAgr829Jl5AoEuHmYeeCLOIzV5oMdHpQGDDAaG+bo9Yda4n3S1NXNAwU3h8uWsXaAHS1mkgb49+gTJQLfhrxdj2jOHB2HaUA7IyypVXTDuEZzYrYs/+yK2HvmFld/Fqt7ndWqenfl4Qu6+r/JUEHhaGMFNkiChvtVHjLHDOBw7Zrtm5kDzwrvybCVZSrZAwJvudT7eZjRlYrdm2s+v5Q4wVayBslBW02KT/VrXJsuPJKtI7l2jHzIV6M0vmMXU8rlah2gSVl9ZX8mLxcQm7iWbLyWX0S4hixngw3N+j7wltAxYodfkCdJj0BdeH0ZCCKlbANs+lQf5hIzjkC7RcSc2xRnMn1mcyqUlK0BiniSgBSixD3JdpG8UTEYU5nfTVdgsx+fcvje5Dloo6zblKbIVje8vh5MSFjM2yr4nOpbQu95vOW/jSYUjm2WGppCmpBVyWYglp4AlnwDNFL01p3jq+1YixPTZjnp4Bm4XGiGIUnmjBeC18CQ53rg+aWvE7UlOMsoirgU1Y+tAxzbx74xtYfgNjavyD+GtUWkOZPtKSTeR+0uBrfTehFK24QypP5OT3dRbAwRVneySDJOpcQA9xReYpJgoW29GzNLNNoEW+65HIqYQ7WkVj0Z16YOma/WhR4MSHWpOmqxVAYOsGpZw9QnSrY/CFN8uKhYPC4RGONHmk5CP0rTNA0syrBS0XPFsJ8vhgJmB2wjUs46IDX5tFreS7q4axsOSxZMWSQlRHcxSdwFVAepBIfoGWHSUmE0sxpsz+ewCdYtZrWYE0jwEqiTiKR1M4hpn9P1mI0CHri6uRUY2Im86kuEGA5GE9U287rOubVCfC+IxU4vOnNi05fN4lJutdXjweHN7L1ZJ4H0AsFfs8Q3HSHKbn5MTJUlF2rlhNomMlLJnRrDzYiSJ6wIbBXzT8h23WXPMNrTkbh8WkPugEPrp0LTyJI2wurEhhPIlqJwFcpjVVsDmFKmTqMegJsj9C8kHixQ/kyT0AtQ3qTVxgHP/9nxyuglVzdezqlB09yOjVnq/xU+nnTx2RX90Lpf192D23rSvtvfG4LAs2vloKljKG0yIGntFJbikCsv1bQfXwa4cXb6niks4v7irCjLzEtyIDzjYaaSJc0gs69tyumG0bc7AjJa4AvrDtFchN2m9PXGFoOHC0eDMqfANc2VztcYlFEMH0Fp/VsIuiTOSI9Tsb8wjRlrew13EqWUXN48srVHaFfyXUCbSpeelnqCe21EwGOpfgqgUcu/5WdtYH+e7F0Z3xtV6lZNqV7mWYuyyf9C9PviFh0ZECKXivg6vrP4pqDSvuu79ZkR0aTf43NPvGRIIR6Hbjt+Msi3CKsRlLrN8sslxFfB4ZYpQcGmDxTd0vvnarfu0ezz5GU4AXA3Eb4rYdaoB3MRxvbRF/2NMdqb+M5iPTVgRZ7vmDsIogu4O4kgpYNjPE2B66Qz/CbRI6CYFAnF3usKjnNl9k5bFL8d6x+EOZaXm2bZhML5K//tB2TsGl5Bw7sNggC56KqOEOg6WnDIoy4NzzImd8IEamuZdkiaaRl8+/P3Mz+b325kZzAj2e/5feXoup8V/H4edIsIGeIjHNuU+otJ8LQ9EnMFGaZfkiboH7feG1W/n8sZAlusmwcpeISNbskCmQKO44oI8G0WWBpLNo4/5NN1V4XuPGVoIhxQSObLDBHoRttmMNHp3dWv+R9SMxOuswXZYsLUJD5vLD3i9ZzBuLrBdiKgFk7rVFvTrz1CIiBDKeFtvMiEfEtSSQkI5nnh1dHSxRRBrmGa/UME/dCdRGlvTZuHGnq+PgJFlhC3oYLBhOJcw65asHKm94tgLeGeWZ9UytEfuvuL2gIAUUql0sLjgnWBoz84XCkNVMP2fB0Ci6NAbRfE1zJh8PVHezFvvEOl8KvVkLqFtzRqgTvkLV/cjG8bvJsTaHklejY14iv+pG0gYZ4Gkia5jvSzGa3IZEqhOG5hXmEBLcBcfp7ApQ5Ezopt9EJVm4+kRW5nWB6YPiqbzfz8Ab7/uV6GIWSJoG7f0kW1keUtL9SS2n2OxG3S0XWJrYoN9udVviFdl5GqDqTfc4odY9v4fdV3bMgU009S9y6dNRhi3RUTaNIcZHAVbEL0VXzXOi/r4ICjMFXvWVF8xY8RdJPedu9HIbCTq+TPzOgpHoANzm8Rjm2i6J5TLUfqdS7NIHig8M5lni80PlOlnmgvjf5s6PwatrbN6QKMxk8bg6LoI2yGy5ICJ5dncvcR/GgTxHEpz3aknTdMqJMfyST7CmIpTOULEO4zmiKrWYvvlEmaax7j1fJoz4Y1Z29Zm7+mG9lGrCUnsU9CZoAr/d+flJnSWwdwhL/RXhu+pbkdu2gTmg9ar4mwoGYp9GoaefgCIupiL4T3JekNS/MvmZFbiGxl4TVVobj5MsYHawLs5C9AdzjEuK6ktqAr0o1ycBwfj66kuqSnU7KQedmlDs3XmlAqdGk6V2BEs7/b+bfuUJw1FcYf9MVXMQnN1pbDKJVtb+Zrf+AYQ9etUPpsoDxom2NJRgjjdsLkLIPxEZ6HJRAEcnHx49ER+zbdL+7MKolBRzlW4mZHLYkscfx7bqWZsH5PtjDp9Ed1xbHpmwFbv7XV2mYfST6Nu8dLYk/6wkyZybv8hNe1Wj/4o+iMRnOsCUasT9GKF2ezoej1RPzN3GjqR0gfrndn40fXFn4E2n8HP8SKeChiNf++HEzbzd9a7djXE3Xon8/baEaTUBKZUoIZ9OFypU+Ueo0CJpI9CzEipfXp3lGImVhsdQJ2AwRnY6HkXS74sd840HyYzDGL0B8mVvgQwYJQyC+xHRmNUFO9ugmhOmXQjVnkST9XqJpm/vwTAY28C/Al1iKmMjFqWBBNkyRJd6lTus87niZr+tpzBPLW6PZDaAcS5aTPS/dv01W5gLeEhA== +sss_pass=wqnmqqsjyvwv:nqrmYJP@17378XrXlBl +sss_encryptionSalt=zg-vklie-2l1ZlpxiLJ6wQOvbb4TnC9XrxgUEyVQIu6TID4qP4FUUqoS5XrXlBl +addd=BlBlNl +getLocationAreaLinks =https://api.tripz-egypt.com/tripz/ride/location/get_location_area_links.php +anthropicAIkeySeferNewHamzaayedpython=zg-qbc-qvo39-vCB-WnzEwFNArO0YlTapvfhtmguKWsXJSKqg_NZSjHBYVXMZK1yUK88SobdckV0KuPaBh0c_WHtGsRO_439PBk-e2QqgkQQXrXlBl +emailService=seferservice@gmail.com +allowed=Tripz: +allowedWallet=TripzWallet: +passnpassenger=hbgbitbXrXrBr +ALLOWED_ADMIN_PHONES=962798583052,962790849027,962787021927 +newId=new +a=q +b=x +c=f +d=y +e=j +f=u +g=k +h=w +i=o +j=e +k=g +l=r +m=n +n=b +o=i +p=v +q=a +r=l +s=z +t=c +u=h +v=p +w=t +x=d +y=s +z=m + +A=Q +B=X +C=F +D=Y +E=J +F=U +G=K +H=W +I=O +J=E +K=G +L=R +M=N +N=B +O=I +P=V +Q=A +R=L +S=Z +T=C +U=H +V=P +W=T +X=D +Y=S +Z=M \ No newline at end of file diff --git a/siro_service/.gitignore b/siro_service/.gitignore new file mode 100644 index 0000000..3820a95 --- /dev/null +++ b/siro_service/.gitignore @@ -0,0 +1,45 @@ +# Miscellaneous +*.class +*.log +*.pyc +*.swp +.DS_Store +.atom/ +.build/ +.buildlog/ +.history +.svn/ +.swiftpm/ +migrate_working_dir/ + +# IntelliJ related +*.iml +*.ipr +*.iws +.idea/ + +# The .vscode folder contains launch configuration and tasks you configure in +# VS Code which you may wish to be included in version control, so this line +# is commented out by default. +#.vscode/ + +# Flutter/Dart/Pub related +**/doc/api/ +**/ios/Flutter/.last_build_id +.dart_tool/ +.flutter-plugins-dependencies +.pub-cache/ +.pub/ +/build/ +/coverage/ + +# Symbolication related +app.*.symbols + +# Obfuscation related +app.*.map.json + +# Android Studio will place build artifacts here +/android/app/debug +/android/app/profile +/android/app/release diff --git a/siro_service/.metadata b/siro_service/.metadata new file mode 100644 index 0000000..c0fe018 --- /dev/null +++ b/siro_service/.metadata @@ -0,0 +1,45 @@ +# This file tracks properties of this Flutter project. +# Used by Flutter tool to assess capabilities and perform upgrades etc. +# +# This file should be version controlled and should not be manually edited. + +version: + revision: "90673a4eef275d1a6692c26ac80d6d746d41a73a" + channel: "stable" + +project_type: app + +# Tracks metadata for the flutter migrate command +migration: + platforms: + - platform: root + create_revision: 90673a4eef275d1a6692c26ac80d6d746d41a73a + base_revision: 90673a4eef275d1a6692c26ac80d6d746d41a73a + - platform: android + create_revision: 90673a4eef275d1a6692c26ac80d6d746d41a73a + base_revision: 90673a4eef275d1a6692c26ac80d6d746d41a73a + - platform: ios + create_revision: 90673a4eef275d1a6692c26ac80d6d746d41a73a + base_revision: 90673a4eef275d1a6692c26ac80d6d746d41a73a + - platform: linux + create_revision: 90673a4eef275d1a6692c26ac80d6d746d41a73a + base_revision: 90673a4eef275d1a6692c26ac80d6d746d41a73a + - platform: macos + create_revision: 90673a4eef275d1a6692c26ac80d6d746d41a73a + base_revision: 90673a4eef275d1a6692c26ac80d6d746d41a73a + - platform: web + create_revision: 90673a4eef275d1a6692c26ac80d6d746d41a73a + base_revision: 90673a4eef275d1a6692c26ac80d6d746d41a73a + - platform: windows + create_revision: 90673a4eef275d1a6692c26ac80d6d746d41a73a + base_revision: 90673a4eef275d1a6692c26ac80d6d746d41a73a + + # User provided section + + # List of Local paths (relative to this file) that should be + # ignored by the migrate tool. + # + # Files that are not part of the templates will be ignored by default. + unmanaged_files: + - 'lib/main.dart' + - 'ios/Runner.xcodeproj/project.pbxproj' diff --git a/siro_service/README.md b/siro_service/README.md new file mode 100644 index 0000000..24f2fd4 --- /dev/null +++ b/siro_service/README.md @@ -0,0 +1,17 @@ +# siro_service + +A new Flutter project. + +## Getting Started + +This project is a starting point for a Flutter application. + +A few resources to get you started if this is your first Flutter project: + +- [Learn Flutter](https://docs.flutter.dev/get-started/learn-flutter) +- [Write your first Flutter app](https://docs.flutter.dev/get-started/codelab) +- [Flutter learning resources](https://docs.flutter.dev/reference/learning-resources) + +For help getting started with Flutter development, view the +[online documentation](https://docs.flutter.dev/), which offers tutorials, +samples, guidance on mobile development, and a full API reference. diff --git a/siro_service/analysis_options.yaml b/siro_service/analysis_options.yaml new file mode 100644 index 0000000..0d29021 --- /dev/null +++ b/siro_service/analysis_options.yaml @@ -0,0 +1,28 @@ +# This file configures the analyzer, which statically analyzes Dart code to +# check for errors, warnings, and lints. +# +# The issues identified by the analyzer are surfaced in the UI of Dart-enabled +# IDEs (https://dart.dev/tools#ides-and-editors). The analyzer can also be +# invoked from the command line by running `flutter analyze`. + +# The following line activates a set of recommended lints for Flutter apps, +# packages, and plugins designed to encourage good coding practices. +include: package:flutter_lints/flutter.yaml + +linter: + # The lint rules applied to this project can be customized in the + # section below to disable rules from the `package:flutter_lints/flutter.yaml` + # included above or to enable additional rules. A list of all available lints + # and their documentation is published at https://dart.dev/lints. + # + # Instead of disabling a lint rule for the entire project in the + # section below, it can also be suppressed for a single line of code + # or a specific dart file by using the `// ignore: name_of_lint` and + # `// ignore_for_file: name_of_lint` syntax on the line or in the file + # producing the lint. + rules: + # avoid_print: false # Uncomment to disable the `avoid_print` rule + # prefer_single_quotes: true # Uncomment to enable the `prefer_single_quotes` rule + +# Additional information about this file can be found at +# https://dart.dev/guides/language/analysis-options diff --git a/siro_service/analyze_report.txt b/siro_service/analyze_report.txt new file mode 100644 index 0000000..990ff74 --- /dev/null +++ b/siro_service/analyze_report.txt @@ -0,0 +1,231 @@ +Analyzing siro_service... + +warning - lib/constant/links.dart:3:8 - Unused import: 'box_name.dart'. Try removing the import directive. - unused_import +warning - lib/controller/best_driver_controllers.dart:1:8 - Unused import: 'dart:convert'. Try removing the import directive. - unused_import +warning - lib/controller/best_driver_controllers.dart:7:8 - Unused import: '../print.dart'. Try removing the import directive. - unused_import +warning - lib/controller/firbase_messge.dart:48:28 - The value of the local variable 'settings' isn't used. Try removing the variable or using it. - unused_local_variable +warning - lib/controller/firebase.dart:4:8 - Unused import: 'package:flutter/material.dart'. Try removing the import directive. - unused_import +warning - lib/controller/firebase.dart:6:8 - Unused import: 'package:http/http.dart'. Try removing the import directive. - unused_import +warning - lib/controller/firebase.dart:8:8 - Unused import: '../../constant/api_key.dart'. Try removing the import directive. - unused_import +warning - lib/controller/firebase.dart:12:8 - Unused import: '../../constant/style.dart'. Try removing the import directive. - unused_import +warning - lib/controller/firebase.dart:44:28 - The value of the local variable 'settings' isn't used. Try removing the variable or using it. - unused_local_variable +warning - lib/controller/firebase.dart:80:28 - The value of the local variable 'android' isn't used. Try removing the variable or using it. - unused_local_variable +warning - lib/controller/functions/crud.dart:6:8 - Unused import: 'package:get/get.dart'. Try removing the import directive. - unused_import +warning - lib/controller/functions/device_helper.dart:3:8 - Unused import: 'package:flutter/foundation.dart'. Try removing the import directive. - unused_import +warning - lib/controller/functions/image.dart:13:8 - Unused import: '../../constant/api_key.dart'. Try removing the import directive. - unused_import +warning - lib/controller/functions/image.dart:199:9 - The value of the local variable 'multipartFile' isn't used. Try removing the variable or using it. - unused_local_variable +warning - lib/controller/functions/image.dart:293:9 - The value of the local variable 'multipartFile' isn't used. Try removing the variable or using it. - unused_local_variable +warning - lib/controller/functions/initilize.dart:1:8 - Unused import: 'dart:convert'. Try removing the import directive. - unused_import +warning - lib/controller/functions/initilize.dart:3:8 - Unused import: 'package:jwt_decoder/jwt_decoder.dart'. Try removing the import directive. - unused_import +warning - lib/controller/functions/initilize.dart:4:8 - Unused import: 'package:secure_string_operations/secure_string_operations.dart'. Try removing the import directive. - unused_import +warning - lib/controller/functions/initilize.dart:8:8 - Unused import: '../../constant/char_map.dart'. Try removing the import directive. - unused_import +warning - lib/controller/functions/initilize.dart:9:8 - Unused import: '../../constant/info.dart'. Try removing the import directive. - unused_import +warning - lib/controller/functions/initilize.dart:10:8 - Unused import: '../../constant/links.dart'. Try removing the import directive. - unused_import +warning - lib/controller/functions/initilize.dart:13:8 - Unused import: '../../print.dart'. Try removing the import directive. - unused_import +warning - lib/controller/local/translations.dart:64:11 - Two keys in a map literal shouldn't be equal. Change or remove the duplicate key. - equal_keys_in_map +warning - lib/controller/local/translations.dart:175:11 - Two keys in a map literal shouldn't be equal. Change or remove the duplicate key. - equal_keys_in_map +warning - lib/controller/local/translations.dart:458:11 - Two keys in a map literal shouldn't be equal. Change or remove the duplicate key. - equal_keys_in_map +warning - lib/controller/local/translations.dart:500:11 - Two keys in a map literal shouldn't be equal. Change or remove the duplicate key. - equal_keys_in_map +warning - lib/controller/local/translations.dart:716:11 - Two keys in a map literal shouldn't be equal. Change or remove the duplicate key. - equal_keys_in_map +warning - lib/controller/local/translations.dart:784:11 - Two keys in a map literal shouldn't be equal. Change or remove the duplicate key. - equal_keys_in_map +warning - lib/controller/local/translations.dart:859:11 - Two keys in a map literal shouldn't be equal. Change or remove the duplicate key. - equal_keys_in_map +warning - lib/controller/local/translations.dart:919:11 - Two keys in a map literal shouldn't be equal. Change or remove the duplicate key. - equal_keys_in_map +warning - lib/controller/local/translations.dart:935:11 - Two keys in a map literal shouldn't be equal. Change or remove the duplicate key. - equal_keys_in_map +warning - lib/controller/local/translations.dart:1281:11 - Two keys in a map literal shouldn't be equal. Change or remove the duplicate key. - equal_keys_in_map +warning - lib/controller/local/translations.dart:1324:11 - Two keys in a map literal shouldn't be equal. Change or remove the duplicate key. - equal_keys_in_map +warning - lib/controller/local/translations.dart:1546:11 - Two keys in a map literal shouldn't be equal. Change or remove the duplicate key. - equal_keys_in_map +warning - lib/controller/local/translations.dart:1616:11 - Two keys in a map literal shouldn't be equal. Change or remove the duplicate key. - equal_keys_in_map +warning - lib/controller/local/translations.dart:1694:11 - Two keys in a map literal shouldn't be equal. Change or remove the duplicate key. - equal_keys_in_map +warning - lib/controller/local/translations.dart:1755:11 - Two keys in a map literal shouldn't be equal. Change or remove the duplicate key. - equal_keys_in_map +warning - lib/controller/local/translations.dart:1771:11 - Two keys in a map literal shouldn't be equal. Change or remove the duplicate key. - equal_keys_in_map +warning - lib/controller/local/translations.dart:2118:11 - Two keys in a map literal shouldn't be equal. Change or remove the duplicate key. - equal_keys_in_map +warning - lib/controller/local/translations.dart:2162:11 - Two keys in a map literal shouldn't be equal. Change or remove the duplicate key. - equal_keys_in_map +warning - lib/controller/local/translations.dart:2388:11 - Two keys in a map literal shouldn't be equal. Change or remove the duplicate key. - equal_keys_in_map +warning - lib/controller/local/translations.dart:2458:11 - Two keys in a map literal shouldn't be equal. Change or remove the duplicate key. - equal_keys_in_map +warning - lib/controller/local/translations.dart:2535:11 - Two keys in a map literal shouldn't be equal. Change or remove the duplicate key. - equal_keys_in_map +warning - lib/controller/local/translations.dart:2596:11 - Two keys in a map literal shouldn't be equal. Change or remove the duplicate key. - equal_keys_in_map +warning - lib/controller/local/translations.dart:2612:11 - Two keys in a map literal shouldn't be equal. Change or remove the duplicate key. - equal_keys_in_map +warning - lib/controller/local/translations.dart:2955:11 - Two keys in a map literal shouldn't be equal. Change or remove the duplicate key. - equal_keys_in_map +warning - lib/controller/local/translations.dart:2998:11 - Two keys in a map literal shouldn't be equal. Change or remove the duplicate key. - equal_keys_in_map +warning - lib/controller/local/translations.dart:3221:11 - Two keys in a map literal shouldn't be equal. Change or remove the duplicate key. - equal_keys_in_map +warning - lib/controller/local/translations.dart:3291:11 - Two keys in a map literal shouldn't be equal. Change or remove the duplicate key. - equal_keys_in_map +warning - lib/controller/local/translations.dart:3368:11 - Two keys in a map literal shouldn't be equal. Change or remove the duplicate key. - equal_keys_in_map +warning - lib/controller/local/translations.dart:3428:11 - Two keys in a map literal shouldn't be equal. Change or remove the duplicate key. - equal_keys_in_map +warning - lib/controller/local/translations.dart:3444:11 - Two keys in a map literal shouldn't be equal. Change or remove the duplicate key. - equal_keys_in_map +warning - lib/controller/local/translations.dart:3782:11 - Two keys in a map literal shouldn't be equal. Change or remove the duplicate key. - equal_keys_in_map +warning - lib/controller/local/translations.dart:3824:11 - Two keys in a map literal shouldn't be equal. Change or remove the duplicate key. - equal_keys_in_map +warning - lib/controller/local/translations.dart:4039:11 - Two keys in a map literal shouldn't be equal. Change or remove the duplicate key. - equal_keys_in_map +warning - lib/controller/local/translations.dart:4107:11 - Two keys in a map literal shouldn't be equal. Change or remove the duplicate key. - equal_keys_in_map +warning - lib/controller/local/translations.dart:4183:11 - Two keys in a map literal shouldn't be equal. Change or remove the duplicate key. - equal_keys_in_map +warning - lib/controller/local/translations.dart:4243:11 - Two keys in a map literal shouldn't be equal. Change or remove the duplicate key. - equal_keys_in_map +warning - lib/controller/local/translations.dart:4259:11 - Two keys in a map literal shouldn't be equal. Change or remove the duplicate key. - equal_keys_in_map +warning - lib/controller/local/translations.dart:4600:11 - Two keys in a map literal shouldn't be equal. Change or remove the duplicate key. - equal_keys_in_map +warning - lib/controller/local/translations.dart:4643:11 - Two keys in a map literal shouldn't be equal. Change or remove the duplicate key. - equal_keys_in_map +warning - lib/controller/local/translations.dart:4866:11 - Two keys in a map literal shouldn't be equal. Change or remove the duplicate key. - equal_keys_in_map +warning - lib/controller/local/translations.dart:4935:11 - Two keys in a map literal shouldn't be equal. Change or remove the duplicate key. - equal_keys_in_map +warning - lib/controller/local/translations.dart:5013:11 - Two keys in a map literal shouldn't be equal. Change or remove the duplicate key. - equal_keys_in_map +warning - lib/controller/local/translations.dart:5076:11 - Two keys in a map literal shouldn't be equal. Change or remove the duplicate key. - equal_keys_in_map +warning - lib/controller/local/translations.dart:5092:11 - Two keys in a map literal shouldn't be equal. Change or remove the duplicate key. - equal_keys_in_map +warning - lib/controller/local/translations.dart:5435:11 - Two keys in a map literal shouldn't be equal. Change or remove the duplicate key. - equal_keys_in_map +warning - lib/controller/local/translations.dart:5478:11 - Two keys in a map literal shouldn't be equal. Change or remove the duplicate key. - equal_keys_in_map +warning - lib/controller/local/translations.dart:5697:11 - Two keys in a map literal shouldn't be equal. Change or remove the duplicate key. - equal_keys_in_map +warning - lib/controller/local/translations.dart:5765:11 - Two keys in a map literal shouldn't be equal. Change or remove the duplicate key. - equal_keys_in_map +warning - lib/controller/local/translations.dart:5841:11 - Two keys in a map literal shouldn't be equal. Change or remove the duplicate key. - equal_keys_in_map +warning - lib/controller/local/translations.dart:5901:11 - Two keys in a map literal shouldn't be equal. Change or remove the duplicate key. - equal_keys_in_map +warning - lib/controller/local/translations.dart:5917:11 - Two keys in a map literal shouldn't be equal. Change or remove the duplicate key. - equal_keys_in_map +warning - lib/controller/local/translations.dart:6255:11 - Two keys in a map literal shouldn't be equal. Change or remove the duplicate key. - equal_keys_in_map +warning - lib/controller/local/translations.dart:6298:11 - Two keys in a map literal shouldn't be equal. Change or remove the duplicate key. - equal_keys_in_map +warning - lib/controller/local/translations.dart:6515:11 - Two keys in a map literal shouldn't be equal. Change or remove the duplicate key. - equal_keys_in_map +warning - lib/controller/local/translations.dart:6584:11 - Two keys in a map literal shouldn't be equal. Change or remove the duplicate key. - equal_keys_in_map +warning - lib/controller/local/translations.dart:6660:11 - Two keys in a map literal shouldn't be equal. Change or remove the duplicate key. - equal_keys_in_map +warning - lib/controller/local/translations.dart:6720:11 - Two keys in a map literal shouldn't be equal. Change or remove the duplicate key. - equal_keys_in_map +warning - lib/controller/local/translations.dart:6736:11 - Two keys in a map literal shouldn't be equal. Change or remove the duplicate key. - equal_keys_in_map +warning - lib/controller/local/translations.dart:7077:11 - Two keys in a map literal shouldn't be equal. Change or remove the duplicate key. - equal_keys_in_map +warning - lib/controller/local/translations.dart:7120:11 - Two keys in a map literal shouldn't be equal. Change or remove the duplicate key. - equal_keys_in_map +warning - lib/controller/local/translations.dart:7341:11 - Two keys in a map literal shouldn't be equal. Change or remove the duplicate key. - equal_keys_in_map +warning - lib/controller/local/translations.dart:7410:11 - Two keys in a map literal shouldn't be equal. Change or remove the duplicate key. - equal_keys_in_map +warning - lib/controller/local/translations.dart:7487:11 - Two keys in a map literal shouldn't be equal. Change or remove the duplicate key. - equal_keys_in_map +warning - lib/controller/local/translations.dart:7549:11 - Two keys in a map literal shouldn't be equal. Change or remove the duplicate key. - equal_keys_in_map +warning - lib/controller/local/translations.dart:7565:11 - Two keys in a map literal shouldn't be equal. Change or remove the duplicate key. - equal_keys_in_map +warning - lib/controller/local/translations.dart:7907:11 - Two keys in a map literal shouldn't be equal. Change or remove the duplicate key. - equal_keys_in_map +warning - lib/controller/local/translations.dart:7950:11 - Two keys in a map literal shouldn't be equal. Change or remove the duplicate key. - equal_keys_in_map +warning - lib/controller/local/translations.dart:8172:11 - Two keys in a map literal shouldn't be equal. Change or remove the duplicate key. - equal_keys_in_map +warning - lib/controller/local/translations.dart:8241:11 - Two keys in a map literal shouldn't be equal. Change or remove the duplicate key. - equal_keys_in_map +warning - lib/controller/local/translations.dart:8318:11 - Two keys in a map literal shouldn't be equal. Change or remove the duplicate key. - equal_keys_in_map +warning - lib/controller/local/translations.dart:8379:11 - Two keys in a map literal shouldn't be equal. Change or remove the duplicate key. - equal_keys_in_map +warning - lib/controller/local/translations.dart:8395:11 - Two keys in a map literal shouldn't be equal. Change or remove the duplicate key. - equal_keys_in_map +warning - lib/controller/local/translations.dart:8703:11 - Two keys in a map literal shouldn't be equal. Change or remove the duplicate key. - equal_keys_in_map +warning - lib/controller/local/translations.dart:8743:11 - Two keys in a map literal shouldn't be equal. Change or remove the duplicate key. - equal_keys_in_map +warning - lib/controller/local/translations.dart:8935:11 - Two keys in a map literal shouldn't be equal. Change or remove the duplicate key. - equal_keys_in_map +warning - lib/controller/local/translations.dart:8993:11 - Two keys in a map literal shouldn't be equal. Change or remove the duplicate key. - equal_keys_in_map +warning - lib/controller/local/translations.dart:9064:11 - Two keys in a map literal shouldn't be equal. Change or remove the duplicate key. - equal_keys_in_map +warning - lib/controller/local/translations.dart:9117:11 - Two keys in a map literal shouldn't be equal. Change or remove the duplicate key. - equal_keys_in_map +warning - lib/controller/local/translations.dart:9132:11 - Two keys in a map literal shouldn't be equal. Change or remove the duplicate key. - equal_keys_in_map +warning - lib/controller/login_controller.dart:1:8 - Unused import: 'dart:convert'. Try removing the import directive. - unused_import +warning - lib/controller/mainController/pages/add_car.dart:12:8 - Unused import: '../../functions/encrypt_decrypt.dart'. Try removing the import directive. - unused_import +warning - lib/controller/mainController/pages/alexandria_besr_driver.dart:6:8 - Unused import: '../../functions/encrypt_decrypt.dart'. Try removing the import directive. - unused_import +warning - lib/controller/mainController/pages/best_driver_page.dart:1:8 - Unused import: 'dart:convert'. Try removing the import directive. - unused_import +warning - lib/controller/mainController/pages/best_driver_page.dart:5:8 - Unused import: 'package:siro_service/controller/functions/encrypt_decrypt.dart'. Try removing the import directive. - unused_import +warning - lib/controller/mainController/pages/edit_car_plate.dart:7:8 - Unused import: '../../functions/encrypt_decrypt.dart'. Try removing the import directive. - unused_import +warning - lib/controller/mainController/pages/edit_car_plate.dart:9:8 - Duplicate import. Try removing all but one import of the library. - duplicate_import +warning - lib/controller/mainController/pages/edit_car_plate.dart:10:8 - Duplicate import. Try removing all but one import of the library. - duplicate_import +warning - lib/controller/mainController/pages/giza_best_driver.dart:6:8 - Unused import: '../../functions/encrypt_decrypt.dart'. Try removing the import directive. - unused_import +warning - lib/controller/mainController/pages/passengers_cant_regster.dart:7:8 - Unused import: '../../functions/encrypt_decrypt.dart'. Try removing the import directive. - unused_import +warning - lib/controller/mainController/pages/passengers_page.dart:49:23 - The operand can't be 'null', so the condition is always 'false'. Try removing the condition, an enclosing condition, or the whole conditional statement. - unnecessary_null_comparison +warning - lib/controller/mainController/pages/welcome_call.dart:16:11 - The value of the local variable 'controller' isn't used. Try removing the variable or using it. - unused_local_variable +warning - lib/controller/mainController/ragister_service_controller.dart:14:8 - Unused import: 'pages/registration_captain_page.dart'. Try removing the import directive. - unused_import +warning - lib/controller/mainController/registration_captain_controller.dart:1:8 - Unused import: 'dart:convert'. Try removing the import directive. - unused_import +warning - lib/controller/mainController/registration_captain_controller.dart:13:8 - Unused import: 'pages/registration_captain_page.dart'. Try removing the import directive. - unused_import +warning - lib/main.dart:33:7 - This class (or a class that this class inherits from) is marked as '@immutable', but one or more of its instance fields aren't final: MyApp.localController - must_be_immutable +warning - lib/views/widgets/mycircular.dart:2:8 - Duplicate import. Try removing all but one import of the library. - duplicate_import + info - lib/constant/box_name.dart:97:23 - The constant name 'FCM_PRIVATE_KEY' isn't a lowerCamelCase identifier. Try changing the name to follow the lowerCamelCase style. - constant_identifier_names + info - lib/constant/colors.dart:23:43 - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss. Try replacing the use of the deprecated member with the replacement. - deprecated_member_use + info - lib/constant/credential.dart:8:3 - Missing type annotation. Try adding a type annotation. - strict_top_level_inference + info - lib/constant/credential.dart:71:5 - Don't invoke 'print' in production code. Try using a logging framework. - avoid_print + info - lib/controller/auth/register_controller.dart:62:39 - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss. Try replacing the use of the deprecated member with the replacement. - deprecated_member_use + info - lib/controller/best_driver_controllers.dart:13:3 - Missing type annotation. Try adding a type annotation. - strict_top_level_inference + info - lib/controller/best_driver_controllers.dart:34:3 - Missing type annotation. Try adding a type annotation. - strict_top_level_inference + info - lib/controller/best_driver_controllers.dart:55:3 - Missing type annotation. Try adding a type annotation. - strict_top_level_inference + info - lib/controller/firbase_messge.dart:104:27 - Unnecessary braces in a string interpolation. Try removing the braces. - unnecessary_brace_in_string_interps + info - lib/controller/functions/crud.dart:81:17 - Empty catch block. Try adding statements to the block, adding a comment to the block, or removing the 'catch' clause. - empty_catches + info - lib/controller/functions/crud.dart:373:3 - Missing type annotation. Try adding a type annotation. - strict_top_level_inference + info - lib/controller/functions/device_helper.dart:13:9 - An uninitialized variable should have an explicit type annotation. Try adding a type annotation. - prefer_typing_uninitialized_variables + info - lib/controller/functions/device_helper.dart:18:34 - 'toMap' is deprecated and shouldn't be used. Use [data] getter instead. Try replacing the use of the deprecated member with the replacement. - deprecated_member_use + info - lib/controller/functions/device_helper.dart:21:30 - 'toMap' is deprecated and shouldn't be used. Use [data] getter instead. Try replacing the use of the deprecated member with the replacement. - deprecated_member_use + info - lib/controller/functions/encrypt_decrypt.dart:78:1 - Missing type annotation. Try adding a type annotation. - strict_top_level_inference + info - lib/controller/functions/encrypt_decrypt.dart:85:1 - Missing type annotation. Try adding a type annotation. - strict_top_level_inference + info - lib/controller/functions/image.dart:11:8 - The imported package 'path_provider' isn't a dependency of the importing package. Try adding a dependency for 'path_provider' in the 'pubspec.yaml' file. - depend_on_referenced_packages + info - lib/controller/functions/image.dart:26:7 - An uninitialized field should have an explicit type annotation. Try adding a type annotation. - prefer_typing_uninitialized_variables + info - lib/controller/functions/image.dart:26:7 - Missing type annotation. Try replacing 'var' with a type annotation. - strict_top_level_inference + info - lib/controller/functions/image.dart:106:3 - Missing type annotation. Try adding a type annotation. - strict_top_level_inference + info - lib/controller/functions/image.dart:140:5 - Don't invoke 'print' in production code. Try using a logging framework. - avoid_print + info - lib/controller/functions/image.dart:156:3 - Missing type annotation. Try adding a type annotation. - strict_top_level_inference + info - lib/controller/functions/image.dart:170:7 - Don't invoke 'print' in production code. Try using a logging framework. - avoid_print + info - lib/controller/functions/image.dart:191:3 - Missing type annotation. Try adding a type annotation. - strict_top_level_inference + info - lib/controller/functions/image.dart:235:3 - Missing type annotation. Try adding a type annotation. - strict_top_level_inference + info - lib/controller/functions/image.dart:265:5 - Don't invoke 'print' in production code. Try using a logging framework. - avoid_print + info - lib/controller/functions/image.dart:285:3 - Missing type annotation. Try adding a type annotation. - strict_top_level_inference + info - lib/controller/functions/initilize.dart:32:3 - Missing type annotation. Try adding a type annotation. - strict_top_level_inference + info - lib/controller/local_notification.dart:6:8 - The imported package 'timezone' isn't a dependency of the importing package. Try adding a dependency for 'timezone' in the 'pubspec.yaml' file. - depend_on_referenced_packages + info - lib/controller/local_notification.dart:7:8 - The imported package 'timezone' isn't a dependency of the importing package. Try adding a dependency for 'timezone' in the 'pubspec.yaml' file. - depend_on_referenced_packages + info - lib/controller/local_notification.dart:37:5 - Don't invoke 'print' in production code. Try using a logging framework. - avoid_print + info - lib/controller/local_notification.dart:61:5 - Don't invoke 'print' in production code. Try using a logging framework. - avoid_print + info - lib/controller/local_notification.dart:140:11 - Don't invoke 'print' in production code. Try using a logging framework. - avoid_print + info - lib/controller/local_notification.dart:142:11 - Don't invoke 'print' in production code. Try using a logging framework. - avoid_print + info - lib/controller/local_notification.dart:178:11 - Don't invoke 'print' in production code. Try using a logging framework. - avoid_print + info - lib/controller/local_notification.dart:183:5 - Don't invoke 'print' in production code. Try using a logging framework. - avoid_print + info - lib/controller/local_notification.dart:210:11 - Don't invoke 'print' in production code. Try using a logging framework. - avoid_print + info - lib/controller/local_notification.dart:212:11 - Don't invoke 'print' in production code. Try using a logging framework. - avoid_print + info - lib/controller/local_notification.dart:235:5 - Don't invoke 'print' in production code. Try using a logging framework. - avoid_print + info - lib/controller/local_notification.dart:260:7 - Don't invoke 'print' in production code. Try using a logging framework. - avoid_print + info - lib/controller/local_notification.dart:265:5 - Don't invoke 'print' in production code. Try using a logging framework. - avoid_print + info - lib/controller/local_notification.dart:266:5 - Don't invoke 'print' in production code. Try using a logging framework. - avoid_print + info - lib/controller/local_notification.dart:281:5 - Don't invoke 'print' in production code. Try using a logging framework. - avoid_print + info - lib/controller/local_notification.dart:312:5 - Don't invoke 'print' in production code. Try using a logging framework. - avoid_print + info - lib/controller/local_notification.dart:313:5 - Don't invoke 'print' in production code. Try using a logging framework. - avoid_print + info - lib/controller/local_notification.dart:328:5 - Don't invoke 'print' in production code. Try using a logging framework. - avoid_print + info - lib/controller/login_controller.dart:70:37 - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss. Try replacing the use of the deprecated member with the replacement. - deprecated_member_use + info - lib/controller/mainController/main_controller.dart:50:8 - Unnecessary override. Try adding behavior in the overriding member or removing the override. - unnecessary_overrides + info - lib/controller/mainController/main_controller.dart:314:3 - Missing type annotation. Try adding a type annotation. - strict_top_level_inference + info - lib/controller/mainController/main_controller.dart:329:3 - Missing type annotation. Try adding a type annotation. - strict_top_level_inference + info - lib/controller/mainController/main_controller.dart:413:3 - Missing type annotation. Try adding a type annotation. - strict_top_level_inference + info - lib/controller/mainController/main_controller.dart:436:21 - Unnecessary braces in a string interpolation. Try removing the braces. - unnecessary_brace_in_string_interps + info - lib/controller/mainController/main_controller.dart:468:3 - Missing type annotation. Try adding a type annotation. - strict_top_level_inference + info - lib/controller/mainController/main_controller.dart:481:3 - Missing type annotation. Try adding a type annotation. - strict_top_level_inference + info - lib/controller/mainController/main_controller.dart:494:3 - Missing type annotation. Try adding a type annotation. - strict_top_level_inference + info - lib/controller/mainController/main_controller.dart:511:3 - Missing type annotation. Try adding a type annotation. - strict_top_level_inference + info - lib/controller/mainController/main_controller.dart:528:3 - Missing type annotation. Try adding a type annotation. - strict_top_level_inference + info - lib/controller/mainController/main_controller.dart:540:3 - Missing type annotation. Try adding a type annotation. - strict_top_level_inference + info - lib/controller/mainController/main_controller.dart:554:3 - Missing type annotation. Try adding a type annotation. - strict_top_level_inference + info - lib/controller/mainController/pages/add_car.dart:200:31 - 'value' is deprecated and shouldn't be used. Use initialValue instead. This will set the initial value for the form field. This feature was deprecated after v3.33.0-1.0.pre. Try replacing the use of the deprecated member with the replacement. - deprecated_member_use + info - lib/controller/mainController/pages/best_driver_page.dart:96:3 - Missing type annotation. Try adding a type annotation. - strict_top_level_inference + info - lib/controller/mainController/pages/drivers_cant_register.dart:13:3 - Constructors in '@immutable' classes should be declared as 'const'. Try adding 'const' to the constructor declaration. - prefer_const_constructors_in_immutables + info - lib/controller/mainController/pages/edit_car.dart:156:31 - 'value' is deprecated and shouldn't be used. Use initialValue instead. This will set the initial value for the form field. This feature was deprecated after v3.33.0-1.0.pre. Try replacing the use of the deprecated member with the replacement. - deprecated_member_use + info - lib/controller/mainController/pages/new_driver.dart:1:8 - The import of 'package:flutter/cupertino.dart' is unnecessary because all of the used elements are also provided by the import of 'package:flutter/material.dart'. Try removing the import directive. - unnecessary_import + info - lib/controller/mainController/pages/new_driver.dart:166:11 - 'value' is deprecated and shouldn't be used. Use initialValue instead. This will set the initial value for the form field. This feature was deprecated after v3.33.0-1.0.pre. Try replacing the use of the deprecated member with the replacement. - deprecated_member_use + info - lib/controller/mainController/pages/new_driver.dart:216:11 - 'value' is deprecated and shouldn't be used. Use initialValue instead. This will set the initial value for the form field. This feature was deprecated after v3.33.0-1.0.pre. Try replacing the use of the deprecated member with the replacement. - deprecated_member_use + info - lib/controller/mainController/pages/new_driver.dart:250:11 - 'value' is deprecated and shouldn't be used. Use initialValue instead. This will set the initial value for the form field. This feature was deprecated after v3.33.0-1.0.pre. Try replacing the use of the deprecated member with the replacement. - deprecated_member_use + info - lib/controller/mainController/pages/passengers_cant_regster.dart:10:3 - Constructors in '@immutable' classes should be declared as 'const'. Try adding 'const' to the constructor declaration. - prefer_const_constructors_in_immutables + info - lib/controller/mainController/pages/passengers_cant_regster.dart:67:25 - Don't invoke 'print' in production code. Try using a logging framework. - avoid_print + info - lib/controller/mainController/pages/registration_captain_page.dart:1:8 - The import of 'package:flutter/cupertino.dart' is unnecessary because all of the used elements are also provided by the import of 'package:flutter/material.dart'. Try removing the import directive. - unnecessary_import + info - lib/controller/mainController/pages/registration_captain_page.dart:157:11 - 'value' is deprecated and shouldn't be used. Use initialValue instead. This will set the initial value for the form field. This feature was deprecated after v3.33.0-1.0.pre. Try replacing the use of the deprecated member with the replacement. - deprecated_member_use + info - lib/controller/mainController/pages/registration_captain_page.dart:205:11 - 'value' is deprecated and shouldn't be used. Use initialValue instead. This will set the initial value for the form field. This feature was deprecated after v3.33.0-1.0.pre. Try replacing the use of the deprecated member with the replacement. - deprecated_member_use + info - lib/controller/mainController/pages/registration_captain_page.dart:237:11 - 'value' is deprecated and shouldn't be used. Use initialValue instead. This will set the initial value for the form field. This feature was deprecated after v3.33.0-1.0.pre. Try replacing the use of the deprecated member with the replacement. - deprecated_member_use + info - lib/controller/mainController/pages/welcome_call.dart:2:8 - The import of 'package:flutter/material.dart' is unnecessary because all of the used elements are also provided by the import of 'package:flutter/cupertino.dart'. Try removing the import directive. - unnecessary_import + info - lib/controller/mainController/pages/welcome_call.dart:96:51 - Use interpolation to compose strings and values. Try using string interpolation to build the composite string. - prefer_interpolation_to_compose_strings + info - lib/controller/mainController/pages/welcome_call.dart:213:47 - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss. This feature was deprecated after v3.33.0-1.0.pre. Try replacing the use of the deprecated member with the replacement. - deprecated_member_use + info - lib/controller/mainController/ragister_service_controller.dart:161:9 - Statements in an if should be enclosed in a block. Try wrapping the statement in a block. - curly_braces_in_flow_control_structures + info - lib/controller/mainController/ragister_service_controller.dart:188:19 - Statements in an if should be enclosed in a block. Try wrapping the statement in a block. - curly_braces_in_flow_control_structures + info - lib/controller/mainController/ragister_service_controller.dart:201:7 - Statements in an if should be enclosed in a block. Try wrapping the statement in a block. - curly_braces_in_flow_control_structures + info - lib/controller/mainController/ragister_service_controller.dart:207:7 - Statements in an if should be enclosed in a block. Try wrapping the statement in a block. - curly_braces_in_flow_control_structures + info - lib/controller/mainController/ragister_service_controller.dart:252:5 - Don't invoke 'print' in production code. Try using a logging framework. - avoid_print + info - lib/controller/mainController/ragister_service_controller.dart:253:5 - Don't invoke 'print' in production code. Try using a logging framework. - avoid_print + info - lib/controller/mainController/ragister_service_controller.dart:263:35 - Unnecessary braces in a string interpolation. Try removing the braces. - unnecessary_brace_in_string_interps + info - lib/controller/mainController/registration_captain_controller.dart:160:9 - Statements in an if should be enclosed in a block. Try wrapping the statement in a block. - curly_braces_in_flow_control_structures + info - lib/controller/mainController/registration_captain_controller.dart:187:19 - Statements in an if should be enclosed in a block. Try wrapping the statement in a block. - curly_braces_in_flow_control_structures + info - lib/controller/mainController/registration_captain_controller.dart:200:7 - Statements in an if should be enclosed in a block. Try wrapping the statement in a block. - curly_braces_in_flow_control_structures + info - lib/controller/mainController/registration_captain_controller.dart:206:7 - Statements in an if should be enclosed in a block. Try wrapping the statement in a block. - curly_braces_in_flow_control_structures + info - lib/controller/mainController/registration_captain_controller.dart:241:5 - Don't invoke 'print' in production code. Try using a logging framework. - avoid_print + info - lib/controller/mainController/registration_captain_controller.dart:242:5 - Don't invoke 'print' in production code. Try using a logging framework. - avoid_print + info - lib/controller/mainController/registration_captain_controller.dart:249:35 - Unnecessary braces in a string interpolation. Try removing the braces. - unnecessary_brace_in_string_interps + info - lib/controller/themes/themes.dart:23:5 - 'color' is deprecated and shouldn't be used. Use backgroundColor instead. This feature was deprecated after v3.33.0-0.2.pre. Try replacing the use of the deprecated member with the replacement. - deprecated_member_use + info - lib/controller/themes/themes.dart:59:5 - 'color' is deprecated and shouldn't be used. Use backgroundColor instead. This feature was deprecated after v3.33.0-0.2.pre. Try replacing the use of the deprecated member with the replacement. - deprecated_member_use + info - lib/controller/themes/themes.dart:95:5 - 'color' is deprecated and shouldn't be used. Use backgroundColor instead. This feature was deprecated after v3.33.0-0.2.pre. Try replacing the use of the deprecated member with the replacement. - deprecated_member_use + info - lib/controller/themes/themes.dart:131:5 - 'color' is deprecated and shouldn't be used. Use backgroundColor instead. This feature was deprecated after v3.33.0-0.2.pre. Try replacing the use of the deprecated member with the replacement. - deprecated_member_use + info - lib/login_page.dart:1:8 - The import of 'package:flutter/cupertino.dart' is unnecessary because all of the used elements are also provided by the import of 'package:flutter/material.dart'. Try removing the import directive. - unnecessary_import + info - lib/login_page.dart:30:47 - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss. Try replacing the use of the deprecated member with the replacement. - deprecated_member_use + info - lib/login_page.dart:116:55 - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss. Try replacing the use of the deprecated member with the replacement. - deprecated_member_use + info - lib/views/auth/register_page.dart:1:8 - The import of 'package:flutter/cupertino.dart' is unnecessary because all of the used elements are also provided by the import of 'package:flutter/material.dart'. Try removing the import directive. - unnecessary_import + info - lib/views/auth/register_page.dart:105:57 - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss. Try replacing the use of the deprecated member with the replacement. - deprecated_member_use + info - lib/views/widgets/circle_container.dart:11:3 - Parameter 'key' could be a super parameter. Trying converting 'key' to a super parameter. - use_super_parameters + info - lib/views/widgets/elevated_btn.dart:19:9 - Parameter 'key' could be a super parameter. Trying converting 'key' to a super parameter. - use_super_parameters + info - lib/views/widgets/icon_widget_menu.dart:7:9 - Parameter 'key' could be a super parameter. Trying converting 'key' to a super parameter. - use_super_parameters + info - lib/views/widgets/my_dialog.dart:1:8 - The import of 'dart:ui' is unnecessary because all of the used elements are also provided by the import of 'package:flutter/material.dart'. Try removing the import directive. - unnecessary_import + info - lib/views/widgets/my_textField.dart:1:1 - The file name 'my_textField.dart' isn't a lower_case_with_underscores identifier. Try changing the name to follow the lower_case_with_underscores style. - file_names + info - lib/views/widgets/mycircular.dart:52:25 - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss. Try replacing the use of the deprecated member with the replacement. - deprecated_member_use + info - lib/views/widgets/mycircular.dart:65:40 - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss. Try replacing the use of the deprecated member with the replacement. - deprecated_member_use + info - lib/views/widgets/mycircular.dart:94:29 - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss. Try replacing the use of the deprecated member with the replacement. - deprecated_member_use + info - lib/views/widgets/mycircular.dart:117:42 - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss. Try replacing the use of the deprecated member with the replacement. - deprecated_member_use + info - lib/views/widgets/mycircular.dart:146:29 - 'withOpacity' is deprecated and shouldn't be used. Use .withValues() to avoid precision loss. Try replacing the use of the deprecated member with the replacement. - deprecated_member_use + +227 issues found. diff --git a/siro_service/android/.gitignore b/siro_service/android/.gitignore new file mode 100644 index 0000000..be3943c --- /dev/null +++ b/siro_service/android/.gitignore @@ -0,0 +1,14 @@ +gradle-wrapper.jar +/.gradle +/captures/ +/gradlew +/gradlew.bat +/local.properties +GeneratedPluginRegistrant.java +.cxx/ + +# Remember to never publicly share your keystore. +# See https://flutter.dev/to/reference-keystore +key.properties +**/*.keystore +**/*.jks diff --git a/siro_service/android/app/build.gradle.kts b/siro_service/android/app/build.gradle.kts new file mode 100644 index 0000000..b702ea0 --- /dev/null +++ b/siro_service/android/app/build.gradle.kts @@ -0,0 +1,93 @@ +import java.util.Properties + +plugins { + id("com.android.application") + id("kotlin-android") + id("com.google.gms.google-services") + id("dev.flutter.flutter-gradle-plugin") +} + +// تحميل local.properties +val localProperties = Properties() +val localPropertiesFile = rootProject.file("local.properties") +if (localPropertiesFile.exists()) { + localPropertiesFile.reader().use { + localProperties.load(it) + } +} + +// تحميل key.properties +val keystoreProperties = Properties() +val keystorePropertiesFile = rootProject.file("key.properties") +if (keystorePropertiesFile.exists()) { + keystorePropertiesFile.inputStream().use { + keystoreProperties.load(it) + } +} + +android { + namespace = "com.siro.siro_service" + compileSdk = 36 + ndkVersion = "28.2.13676358" + + defaultConfig { + applicationId = "com.siro.siro_service" + minSdk = flutter.minSdkVersion + targetSdk = 36 + versionCode = 1 + versionName = "1.0" + multiDexEnabled = true + + ndk { + abiFilters += listOf("armeabi-v7a", "arm64-v8a") + } + } + + signingConfigs { + create("release") { + keyAlias = keystoreProperties["keyAlias"] as String? + keyPassword = keystoreProperties["keyPassword"] as String? + storeFile = keystoreProperties["storeFile"]?.let { file(it as String) } + storePassword = keystoreProperties["storePassword"] as String? + } + } + + buildTypes { + getByName("release") { + signingConfig = signingConfigs.getByName("release") + isMinifyEnabled = true + isShrinkResources = true + proguardFiles( + getDefaultProguardFile("proguard-android-optimize.txt"), + "proguard-rules.pro" + ) + } + } + + compileOptions { + sourceCompatibility = JavaVersion.VERSION_11 + targetCompatibility = JavaVersion.VERSION_11 + isCoreLibraryDesugaringEnabled = true + } + + kotlinOptions { + jvmTarget = "11" + } + + externalNativeBuild { + cmake { + path = file("src/main/cpp/CMakeLists.txt") + version = "3.22.1" + } + } +} + +flutter { + source = "../.." +} + +dependencies { + implementation("com.scottyab:rootbeer-lib:0.1.0") + implementation("com.google.android.gms:play-services-safetynet:18.0.1") + coreLibraryDesugaring("com.android.tools:desugar_jdk_libs:2.1.4") +} diff --git a/siro_service/android/app/google-services.json b/siro_service/android/app/google-services.json new file mode 100644 index 0000000..a960332 --- /dev/null +++ b/siro_service/android/app/google-services.json @@ -0,0 +1,86 @@ +{ + "project_info": { + "project_number": "825988584191", + "project_id": "siro-a6957", + "storage_bucket": "siro-a6957.firebasestorage.app" + }, + "client": [ + { + "client_info": { + "mobilesdk_app_id": "1:825988584191:android:caa30eaac3524de51632ca", + "android_client_info": { + "package_name": "com.siro.admin" + } + }, + "oauth_client": [], + "api_key": [ + { + "current_key": "AIzaSyAEoply_UcEP6KaCu_ziCy_ZDIjAKvi7b8" + } + ], + "services": { + "appinvite_service": { + "other_platform_oauth_client": [] + } + } + }, + { + "client_info": { + "mobilesdk_app_id": "1:825988584191:android:4525a21b00173d361632ca", + "android_client_info": { + "package_name": "com.siro.driver" + } + }, + "oauth_client": [], + "api_key": [ + { + "current_key": "AIzaSyAEoply_UcEP6KaCu_ziCy_ZDIjAKvi7b8" + } + ], + "services": { + "appinvite_service": { + "other_platform_oauth_client": [] + } + } + }, + { + "client_info": { + "mobilesdk_app_id": "1:825988584191:android:06782b540c7681ad1632ca", + "android_client_info": { + "package_name": "com.siro.rider" + } + }, + "oauth_client": [], + "api_key": [ + { + "current_key": "AIzaSyAEoply_UcEP6KaCu_ziCy_ZDIjAKvi7b8" + } + ], + "services": { + "appinvite_service": { + "other_platform_oauth_client": [] + } + } + }, + { + "client_info": { + "mobilesdk_app_id": "1:825988584191:android:be08180beef7d65e1632ca", + "android_client_info": { + "package_name": "com.siro.service" + } + }, + "oauth_client": [], + "api_key": [ + { + "current_key": "AIzaSyAEoply_UcEP6KaCu_ziCy_ZDIjAKvi7b8" + } + ], + "services": { + "appinvite_service": { + "other_platform_oauth_client": [] + } + } + } + ], + "configuration_version": "1" +} \ No newline at end of file diff --git a/siro_service/android/app/src/debug/AndroidManifest.xml b/siro_service/android/app/src/debug/AndroidManifest.xml new file mode 100644 index 0000000..399f698 --- /dev/null +++ b/siro_service/android/app/src/debug/AndroidManifest.xml @@ -0,0 +1,7 @@ + + + + diff --git a/siro_service/android/app/src/main/AndroidManifest.xml b/siro_service/android/app/src/main/AndroidManifest.xml new file mode 100644 index 0000000..848f5bc --- /dev/null +++ b/siro_service/android/app/src/main/AndroidManifest.xml @@ -0,0 +1,97 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/siro_service/android/app/src/main/cpp/CMakeLists.txt b/siro_service/android/app/src/main/cpp/CMakeLists.txt new file mode 100755 index 0000000..2d45c68 --- /dev/null +++ b/siro_service/android/app/src/main/cpp/CMakeLists.txt @@ -0,0 +1,11 @@ +cmake_minimum_required(VERSION 3.10.2) # 3.10.2 is fine, but no need to go as high as 3.31.5 +project(intaleq_service) # Good + +# Add your C++ source file(s) to create a SHARED library. +add_library(native-lib SHARED native-lib.cpp) + +# Find the Android log library. +find_library(log-lib log) + +# Link your library against the log library. This is essential for debugging. +target_link_libraries(native-lib ${log-lib}) \ No newline at end of file diff --git a/siro_service/android/app/src/main/cpp/native-lib.cpp b/siro_service/android/app/src/main/cpp/native-lib.cpp new file mode 100755 index 0000000..65c8bcc --- /dev/null +++ b/siro_service/android/app/src/main/cpp/native-lib.cpp @@ -0,0 +1,187 @@ + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include // Add this line + +#define LOG_TAG "NativeLib" +#define LOGD(...) __android_log_print(ANDROID_LOG_DEBUG, LOG_TAG, __VA_ARGS__) +#define LOGE(...) __android_log_print(ANDROID_LOG_ERROR, LOG_TAG, __VA_ARGS__) + +// Function to check for common root binaries +bool isRooted() +{ + std::string paths[] = { + "/system/app/Superuser.apk", + "/system/xbin/su", + "/system/bin/su", + "/system/bin/magisk", + "/system/xbin/magisk", + "/sbin/magisk"}; + + for (const auto &path : paths) + { + std::ifstream file(path); + if (file.good()) + { + return true; + } + } + return false; +} + +// Function to check for the presence of files or directories commonly associated with Frida. +bool checkFridaFiles() +{ + std::string fridaFiles[] = { + "/data/local/tmp/re.frida.server", // Common Frida server path + "/data/local/tmp/frida-server", + "/usr/lib/libfrida-gadget.so", // Frida gadget (injected library) + "/usr/lib64/libfrida-gadget.so", + "/data/local/re.frida.server", + + }; + + for (const auto &path : fridaFiles) + { + if (access(path.c_str(), F_OK) != -1) + { + LOGE("Frida file detected: %s", path.c_str()); + return true; + } + } + return false; +} + +// Checks for open ports commonly used by Frida. This is less reliable, as ports can be changed. +bool checkFridaPorts() +{ + int sock = socket(AF_INET, SOCK_STREAM, 0); + if (sock == -1) + { + return false; // Couldn't create socket, not a strong indicator. + } + + sockaddr_in sa; + memset(&sa, 0, sizeof(sa)); + sa.sin_family = AF_INET; + sa.sin_port = htons(27042); // Default Frida port + inet_pton(AF_INET, "127.0.0.1", &sa.sin_addr); + + if (connect(sock, (struct sockaddr *)&sa, sizeof(sa)) != -1) + { + LOGE("Frida default port (27042) is open."); + close(sock); + return true; + } + + close(sock); + return false; +} + +// Check the maps file of the current process for any suspicious entries. +bool checkMaps() +{ + std::ifstream mapsFile("/proc/self/maps"); + std::string line; + + if (mapsFile.is_open()) + { + while (std::getline(mapsFile, line)) + { + // Look for lines that indicate injected libraries, especially Frida. + if (line.find("frida") != std::string::npos || + line.find("gum-js-") != std::string::npos) + { // Gum is Frida's JavaScript engine + LOGE("Suspicious entry in /proc/self/maps: %s", line.c_str()); + return true; + } + } + mapsFile.close(); + } + else + { + LOGE("Could not open /proc/self/maps"); + return false; + } + return false; +} + +// Check loaded modules. +bool checkLoadedModules() +{ + bool found = false; + dl_iterate_phdr([](struct dl_phdr_info *info, size_t size, void *data) + { + bool *found_ptr = static_cast(data); + if (std::string(info->dlpi_name).find("frida") != std::string::npos) + { + LOGE("Frida module detected: %s", info->dlpi_name); + *found_ptr = true; + return 1; // Stop iterating + } + return 0; // Continue iterating + }, + &found); + + return found; +} + +// This is a simple ptrace check. More sophisticated checks are possible (and necessary for robust detection). +// bool checkPtrace() { +// // Attempt to ptrace ourselves. If another process is already tracing us, this will fail. +// if (ptrace(PTRACE_TRACEME, 0, 1, 0) < 0) { +// LOGE("ptrace failed. Debugger or tracer detected."); +// return true; // Likely being traced +// } +// // Detach. If attached, need to detach to not interfere. +// ptrace(PTRACE_DETACH, 0, 0, 0); +// return false; +//} + +extern "C" JNIEXPORT jboolean JNICALL +Java_com_siro_siro_1service_RootDetection_isNativeRooted(JNIEnv *env, jobject /* this */) +{ + + if (isRooted()) + { + return JNI_TRUE; + } + + if (checkFridaFiles()) + { + return JNI_TRUE; + } + + if (checkFridaPorts()) + { + return JNI_TRUE; + } + if (checkMaps()) + { + return JNI_TRUE; + } + + if (checkLoadedModules()) + { + return JNI_TRUE; + } + + // if (checkPtrace()) { + // return JNI_TRUE; + // } + + return JNI_FALSE; +} \ No newline at end of file diff --git a/siro_service/android/app/src/main/kotlin/com/example/service_intaleq/MainActivity.kt b/siro_service/android/app/src/main/kotlin/com/example/service_intaleq/MainActivity.kt new file mode 100644 index 0000000..edf91a6 --- /dev/null +++ b/siro_service/android/app/src/main/kotlin/com/example/service_intaleq/MainActivity.kt @@ -0,0 +1,207 @@ +package com.siro.siro_service + +import android.app.AlertDialog +import android.content.Intent +import android.os.Bundle +import android.util.Log +import android.widget.LinearLayout +import android.widget.ProgressBar +import android.widget.TextView +import androidx.core.view.setPadding +import com.scottyab.rootbeer.RootBeer +import io.flutter.embedding.android.FlutterFragmentActivity +import io.flutter.embedding.engine.FlutterEngine +import io.flutter.plugin.common.MethodChannel +import java.io.File +import java.util.Timer +import kotlin.concurrent.schedule + +class MainActivity : FlutterFragmentActivity() { + private val SECURITY_CHANNEL = "com.siro.siro_service/security" + private val APP_CONTROL_CHANNEL = "com.siro.siro_service/app_control" + + override fun configureFlutterEngine(flutterEngine: FlutterEngine) { + super.configureFlutterEngine(flutterEngine) + + // Channel for security checks (isRooted, getAppSignature) + MethodChannel(flutterEngine.dartExecutor.binaryMessenger, SECURITY_CHANNEL) + .setMethodCallHandler { call, result -> + when (call.method) { + "isNativeRooted" -> result.success(isDeviceCompromised()) + "getAppSignature" -> result.success(getAppSignature()) + else -> result.notImplemented() + } + } + + + // Channel for app control (bringing to foreground) + MethodChannel(flutterEngine.dartExecutor.binaryMessenger, APP_CONTROL_CHANNEL) + .setMethodCallHandler { call, result -> + when (call.method) { + "bringToForeground" -> { + Log.d("MainActivity", "Received bringToForeground request") + val intent = + Intent(this, MainActivity::class.java).apply { + action = Intent.ACTION_MAIN + addCategory(Intent.CATEGORY_LAUNCHER) + addFlags( + Intent.FLAG_ACTIVITY_NEW_TASK or + Intent.FLAG_ACTIVITY_CLEAR_TOP or + Intent.FLAG_ACTIVITY_SINGLE_TOP + ) + } + try { + startActivity(intent) + Log.d( + "MainActivity", + "App brought to foreground successfully with flags: ${intent.flags}" + ) + result.success(true) + } catch (e: Exception) { + Log.e( + "MainActivity", + "Error bringing app to foreground: ${e.message}", + e + ) + result.error( + "ACTIVITY_START_FAILED", + e.message, + e.stackTraceToString() + ) + } + } + else -> result.notImplemented() + } + } + } + + override fun onCreate(savedInstanceState: Bundle?) { + super.onCreate(savedInstanceState) + Log.d("MainActivity", "MainActivity onCreate") + if (isDeviceCompromised()) { + showSecurityWarningDialog() + } + } + + override fun onNewIntent(intent: Intent) { + super.onNewIntent(intent) + setIntent(intent) + Log.d("MainActivity", "Received new intent: ${intent.action}, flags: ${intent.flags}") + } + + private fun isDeviceCompromised(): Boolean { + return try { + val isRootedByRootBeer = RootBeer(this).isRooted + Log.d("MainActivity", "Root check result: $isRootedByRootBeer") + isRootedByRootBeer + } catch (e: Exception) { + Log.e("MainActivity", "Security check error: ${e.message}", e) + true // Fail-safe: assume compromised if check fails + } + } + + private fun showSecurityWarningDialog() { + var secondsRemaining = 10 + val progressBar = + ProgressBar(this, null, android.R.attr.progressBarStyleHorizontal).apply { + max = 10 + progress = 10 + } + val textView = + TextView(this).apply { + text = getString(R.string.security_warning_message) + textAlignment = TextView.TEXT_ALIGNMENT_CENTER + } + val layout = + LinearLayout(this).apply { + orientation = LinearLayout.VERTICAL + setPadding(48) + addView(textView) + addView(progressBar) + } + val dialog = + AlertDialog.Builder(this) + .setTitle(getString(R.string.security_warning_title)) + .setView(layout) + .setCancelable(false) + .create() + dialog.show() + val timer = Timer() + timer.schedule(0, 1000) { + secondsRemaining-- + runOnUiThread { + progressBar.progress = secondsRemaining + if (secondsRemaining <= 0) { + timer.cancel() + dialog.dismiss() + clearAppDataAndExit() + } + } + } + } + + private fun clearAppDataAndExit() { + try { + Runtime.getRuntime().exec("pm clear $packageName") + Log.d("MainActivity", "Cleared app data via package manager") + } catch (e: Exception) { + Log.e("MainActivity", "Error clearing app data: ${e.message}", e) + clearCache() + clearAppData() + } + finishAffinity() + System.exit(0) + } + + private fun clearCache() { + deleteDir(cacheDir) + deleteDir(externalCacheDir) + Log.d("MainActivity", "Cleared cache directories") + } + + private fun clearAppData() { + // Be careful with this, it deletes all app data. + // deleteDir(applicationContext.dataDir) + Log.d("MainActivity", "App data clearing skipped (commented out)") + } + + private fun deleteDir(dir: File?): Boolean { + if (dir != null && dir.isDirectory) { + dir.list()?.forEach { deleteDir(File(dir, it)) } + } + val deleted = dir?.delete() ?: false + Log.d("MainActivity", "Deleted directory ${dir?.path}: $deleted") + return deleted + } + + private fun getAppSignature(): String? { + return try { + val packageInfo = if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.P) { + packageManager.getPackageInfo(packageName, android.content.pm.PackageManager.GET_SIGNING_CERTIFICATES) + } else { + @Suppress("DEPRECATION") + packageManager.getPackageInfo(packageName, android.content.pm.PackageManager.GET_SIGNATURES) + } + + val signatures = if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.P) { + packageInfo.signingInfo?.signingCertificateHistory + } else { + @Suppress("DEPRECATION") + packageInfo.signatures + } + + if (signatures != null && signatures.isNotEmpty()) { + val signature = signatures[0] + val md = java.security.MessageDigest.getInstance("SHA-256") + val digest = md.digest(signature.toByteArray()) + digest.joinToString("") { "%02x".format(it) } + } else { + null + } + } catch (e: Exception) { + Log.e("MainActivity", "Error getting app signature: ${e.message}", e) + null + } + } +} + diff --git a/siro_service/android/app/src/main/kotlin/com/example/service_intaleq/MyApplication.kt b/siro_service/android/app/src/main/kotlin/com/example/service_intaleq/MyApplication.kt new file mode 100755 index 0000000..173f305 --- /dev/null +++ b/siro_service/android/app/src/main/kotlin/com/example/service_intaleq/MyApplication.kt @@ -0,0 +1,44 @@ +package com.siro.siro_service + +import android.app.Application +import android.content.Intent +import io.flutter.embedding.engine.FlutterEngine +import io.flutter.embedding.engine.dart.DartExecutor +import io.flutter.plugin.common.MethodChannel + +class MyApplication : Application() { + companion object { + lateinit var instance: MyApplication + private set + + val flutterEngine: FlutterEngine by lazy { + FlutterEngine(instance).apply { + dartExecutor.executeDartEntrypoint(DartExecutor.DartEntrypoint.createDefault()) + } + } + } + + override fun onCreate() { + super.onCreate() + instance = this + + MethodChannel( + flutterEngine.dartExecutor.binaryMessenger, + "com.siro.siro_service/app_lifecycle" + ) + .setMethodCallHandler { call, result -> + if (call.method == "bringAppToForeground") { + bringAppToForeground() + result.success(null) + } else { + result.notImplemented() + } + } + } + + private fun bringAppToForeground() { + val intent = Intent(applicationContext, MainActivity::class.java) + intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK or Intent.FLAG_ACTIVITY_REORDER_TO_FRONT) + startActivity(intent) + } +} diff --git a/siro_service/android/app/src/main/kotlin/com/example/service_intaleq/RootDetection.kt b/siro_service/android/app/src/main/kotlin/com/example/service_intaleq/RootDetection.kt new file mode 100755 index 0000000..13903d7 --- /dev/null +++ b/siro_service/android/app/src/main/kotlin/com/example/service_intaleq/RootDetection.kt @@ -0,0 +1,9 @@ +package com.siro.siro_service + +object RootDetection { + init { + System.loadLibrary("native-lib") // Load the native library + } + + external fun isNativeRooted(): Boolean // Declare the external function +} diff --git a/siro_service/android/app/src/main/kotlin/com/example/service_intaleq/SafetyNetCheck.kt b/siro_service/android/app/src/main/kotlin/com/example/service_intaleq/SafetyNetCheck.kt new file mode 100755 index 0000000..2e4a1d4 --- /dev/null +++ b/siro_service/android/app/src/main/kotlin/com/example/service_intaleq/SafetyNetCheck.kt @@ -0,0 +1,104 @@ +import android.content.Context +import android.util.Base64 +import android.util.Log +import com.google.android.gms.safetynet.SafetyNet +import java.io.IOException +import java.security.GeneralSecurityException +import java.security.SecureRandom +import org.json.JSONObject + +object SafetyNetCheck { + + private const val TAG = "SafetyNetCheck" + + fun checkSafetyNet(context: Context, apiKey: String, callback: (Boolean) -> Unit) { + // Generate a nonce. A good nonce is large, random, and used only once. + val nonce = generateNonce() + + SafetyNet.getClient(context) + .attest(nonce, apiKey) + .addOnSuccessListener { response -> + // Success! Now, *verify* the response. + val jwsResult = response.jwsResult + if (jwsResult != null) { + try { + val isSafe = SafetyNetResponseVerifier.verify(jwsResult) + Log.d(TAG, "SafetyNet verification result: $isSafe") + callback(isSafe) // Now passing a *verified* result. + } catch (e: Exception) { + Log.e(TAG, "Error verifying SafetyNet response: ${e.message}", e) + callback(false) // Treat verification errors as failures. + } + } else { + Log.e(TAG, "SafetyNet jwsResult is null") + callback(false) // Null result is a failure. + } + } + .addOnFailureListener { e -> + Log.e(TAG, "SafetyNet attest API call failed: ${e.message}", e) + callback(false) // API call failure. + } + } + + // Helper function to generate a nonce. + private fun generateNonce(): ByteArray { + val byteGenerator = SecureRandom() + val nonce = ByteArray(32) + byteGenerator.nextBytes(nonce) + return nonce + } +} + +// Helper class to verify the SafetyNet response. +object SafetyNetResponseVerifier { + + private const val TAG = "SafetyNetVerifier" + + // This method *must* be implemented on a *backend server* for real security. + // This is just a *simplified example* for demonstration purposes and is + // *not* suitable for production without a backend check. + @Throws(GeneralSecurityException::class, IOException::class) + fun verify(jwsResult: String): Boolean { + // 1. Parse the JWS: Split into header, payload, and signature. + val parts = jwsResult.split(".") + if (parts.size != 3) { + Log.e(TAG, "Invalid JWS format") + return false // Invalid JWS format + } + + val header = parts[0] + val payload = parts[1] + val signature = parts[2] + + // 2. Decode the payload (it's Base64 encoded). + val decodedPayload = Base64.decode(payload, Base64.DEFAULT) + val payloadJson = JSONObject(String(decodedPayload)) + + // 3. Check the ctsProfileMatch and basicIntegrity. + val ctsProfileMatch = payloadJson.optBoolean("ctsProfileMatch", false) + val basicIntegrity = payloadJson.optBoolean("basicIntegrity", false) + + Log.d(TAG, "ctsProfileMatch: $ctsProfileMatch, basicIntegrity: $basicIntegrity") + + // 4. **CRITICAL: In a real application, you *must* send the JWS to your + // backend server for verification. The server should use the + // Google SafetyNet API (or a library that wraps it) to verify + // the signature and check the fields. This prevents attackers + // from tampering with the response on the device.** + // + // // Example (pseudo-code) of what the backend check would do: + // // GoogleCredential credential = ...; + // // SafetyNet safetyNet = new SafetyNet.Builder(httpTransport, jsonFactory) + // // .setApplicationName("YourAppName") + // // .setHttpRequestInitializer(credential) + // // .build(); + // // SafetyNetApi.VerifyJwsRequest request = safetyNet.safetynet().verifyJws(jwsResult); + // // SafetyNetApi.VerifyJwsResponse response = request.execute(); + // // return response.isValidSignature() && response.getCtsProfileMatch() && + // response.getBasicIntegrity(); + + // 5. For this *example* (without a backend), we'll just check the fields. + // This is *NOT SECURE* for production! + return ctsProfileMatch && basicIntegrity + } +} diff --git a/siro_service/android/app/src/main/res/drawable-v21/launch_background.xml b/siro_service/android/app/src/main/res/drawable-v21/launch_background.xml new file mode 100644 index 0000000..f74085f --- /dev/null +++ b/siro_service/android/app/src/main/res/drawable-v21/launch_background.xml @@ -0,0 +1,12 @@ + + + + + + + + diff --git a/siro_service/android/app/src/main/res/drawable/app_icon.png b/siro_service/android/app/src/main/res/drawable/app_icon.png new file mode 100644 index 0000000..873fa38 Binary files /dev/null and b/siro_service/android/app/src/main/res/drawable/app_icon.png differ diff --git a/siro_service/android/app/src/main/res/drawable/launch_background.xml b/siro_service/android/app/src/main/res/drawable/launch_background.xml new file mode 100644 index 0000000..304732f --- /dev/null +++ b/siro_service/android/app/src/main/res/drawable/launch_background.xml @@ -0,0 +1,12 @@ + + + + + + + + diff --git a/siro_service/android/app/src/main/res/mipmap-hdpi/ic_launcher.png b/siro_service/android/app/src/main/res/mipmap-hdpi/ic_launcher.png new file mode 100644 index 0000000..db77bb4 Binary files /dev/null and b/siro_service/android/app/src/main/res/mipmap-hdpi/ic_launcher.png differ diff --git a/siro_service/android/app/src/main/res/mipmap-hdpi/launcher_icon.png b/siro_service/android/app/src/main/res/mipmap-hdpi/launcher_icon.png new file mode 100644 index 0000000..d74d5a3 Binary files /dev/null and b/siro_service/android/app/src/main/res/mipmap-hdpi/launcher_icon.png differ diff --git a/siro_service/android/app/src/main/res/mipmap-mdpi/ic_launcher.png b/siro_service/android/app/src/main/res/mipmap-mdpi/ic_launcher.png new file mode 100644 index 0000000..17987b7 Binary files /dev/null and b/siro_service/android/app/src/main/res/mipmap-mdpi/ic_launcher.png differ diff --git a/siro_service/android/app/src/main/res/mipmap-mdpi/launcher_icon.png b/siro_service/android/app/src/main/res/mipmap-mdpi/launcher_icon.png new file mode 100644 index 0000000..ad27029 Binary files /dev/null and b/siro_service/android/app/src/main/res/mipmap-mdpi/launcher_icon.png differ diff --git a/siro_service/android/app/src/main/res/mipmap-xhdpi/ic_launcher.png b/siro_service/android/app/src/main/res/mipmap-xhdpi/ic_launcher.png new file mode 100644 index 0000000..09d4391 Binary files /dev/null and b/siro_service/android/app/src/main/res/mipmap-xhdpi/ic_launcher.png differ diff --git a/siro_service/android/app/src/main/res/mipmap-xhdpi/launcher_icon.png b/siro_service/android/app/src/main/res/mipmap-xhdpi/launcher_icon.png new file mode 100644 index 0000000..e271a05 Binary files /dev/null and b/siro_service/android/app/src/main/res/mipmap-xhdpi/launcher_icon.png differ diff --git a/siro_service/android/app/src/main/res/mipmap-xxhdpi/ic_launcher.png b/siro_service/android/app/src/main/res/mipmap-xxhdpi/ic_launcher.png new file mode 100644 index 0000000..d5f1c8d Binary files /dev/null and b/siro_service/android/app/src/main/res/mipmap-xxhdpi/ic_launcher.png differ diff --git a/siro_service/android/app/src/main/res/mipmap-xxhdpi/launcher_icon.png b/siro_service/android/app/src/main/res/mipmap-xxhdpi/launcher_icon.png new file mode 100644 index 0000000..808c654 Binary files /dev/null and b/siro_service/android/app/src/main/res/mipmap-xxhdpi/launcher_icon.png differ diff --git a/siro_service/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png b/siro_service/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png new file mode 100644 index 0000000..4d6372e Binary files /dev/null and b/siro_service/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png differ diff --git a/siro_service/android/app/src/main/res/mipmap-xxxhdpi/launcher_icon.png b/siro_service/android/app/src/main/res/mipmap-xxxhdpi/launcher_icon.png new file mode 100644 index 0000000..873fa38 Binary files /dev/null and b/siro_service/android/app/src/main/res/mipmap-xxxhdpi/launcher_icon.png differ diff --git a/siro_service/android/app/src/main/res/values-night/styles.xml b/siro_service/android/app/src/main/res/values-night/styles.xml new file mode 100644 index 0000000..06952be --- /dev/null +++ b/siro_service/android/app/src/main/res/values-night/styles.xml @@ -0,0 +1,18 @@ + + + + + + + diff --git a/siro_service/android/app/src/main/res/values/strings.xml b/siro_service/android/app/src/main/res/values/strings.xml new file mode 100755 index 0000000..cf5127a --- /dev/null +++ b/siro_service/android/app/src/main/res/values/strings.xml @@ -0,0 +1,15 @@ + + My App + + + high_importance_channel + AIzaSyCFsWBqvkXzk1Gb-bCGxwqTwJQKIeHjH64 + Security Warning + AIzaSyB04YNW3LbvmQ5lX1t2bOwEU18-KUoovzw + + A security issue or modification has been detected on + this device. The app cannot run on this device. + Exit App + Device is secure. Proceeding normally. + + \ No newline at end of file diff --git a/siro_service/android/app/src/main/res/values/styles.xml b/siro_service/android/app/src/main/res/values/styles.xml new file mode 100644 index 0000000..cb1ef88 --- /dev/null +++ b/siro_service/android/app/src/main/res/values/styles.xml @@ -0,0 +1,18 @@ + + + + + + + diff --git a/siro_service/android/app/src/profile/AndroidManifest.xml b/siro_service/android/app/src/profile/AndroidManifest.xml new file mode 100644 index 0000000..399f698 --- /dev/null +++ b/siro_service/android/app/src/profile/AndroidManifest.xml @@ -0,0 +1,7 @@ + + + + diff --git a/siro_service/android/build.gradle.kts b/siro_service/android/build.gradle.kts new file mode 100644 index 0000000..89176ef --- /dev/null +++ b/siro_service/android/build.gradle.kts @@ -0,0 +1,21 @@ +allprojects { + repositories { + google() + mavenCentral() + } +} + +val newBuildDir: Directory = rootProject.layout.buildDirectory.dir("../../build").get() +rootProject.layout.buildDirectory.value(newBuildDir) + +subprojects { + val newSubprojectBuildDir: Directory = newBuildDir.dir(project.name) + project.layout.buildDirectory.value(newSubprojectBuildDir) +} +subprojects { + project.evaluationDependsOn(":app") +} + +tasks.register("clean") { + delete(rootProject.layout.buildDirectory) +} diff --git a/siro_service/android/gradle.properties b/siro_service/android/gradle.properties new file mode 100644 index 0000000..f018a61 --- /dev/null +++ b/siro_service/android/gradle.properties @@ -0,0 +1,3 @@ +org.gradle.jvmargs=-Xmx8G -XX:MaxMetaspaceSize=4G -XX:ReservedCodeCacheSize=512m -XX:+HeapDumpOnOutOfMemoryError +android.useAndroidX=true +android.enableJetifier=true diff --git a/siro_service/android/gradle/wrapper/gradle-wrapper.properties b/siro_service/android/gradle/wrapper/gradle-wrapper.properties new file mode 100644 index 0000000..02767eb --- /dev/null +++ b/siro_service/android/gradle/wrapper/gradle-wrapper.properties @@ -0,0 +1,5 @@ +distributionBase=GRADLE_USER_HOME +distributionPath=wrapper/dists +zipStoreBase=GRADLE_USER_HOME +zipStorePath=wrapper/dists +distributionUrl=https\://services.gradle.org/distributions/gradle-8.13-all.zip diff --git a/siro_service/android/settings.gradle.kts b/siro_service/android/settings.gradle.kts new file mode 100644 index 0000000..0a9af08 --- /dev/null +++ b/siro_service/android/settings.gradle.kts @@ -0,0 +1,28 @@ +pluginManagement { + val flutterSdkPath = run { + val properties = java.util.Properties() + file("local.properties").inputStream().use { properties.load(it) } + val flutterSdkPath = properties.getProperty("flutter.sdk") + require(flutterSdkPath != null) { "flutter.sdk not set in local.properties" } + flutterSdkPath + } + + includeBuild("$flutterSdkPath/packages/flutter_tools/gradle") + + repositories { + google() + mavenCentral() + gradlePluginPortal() + } +} + +plugins { + id("dev.flutter.flutter-plugin-loader") version "1.0.0" + id("com.android.application") version "8.11.1" apply false + // START: FlutterFire Configuration + id("com.google.gms.google-services") version("4.3.10") apply false + // END: FlutterFire Configuration + id("org.jetbrains.kotlin.android") version "2.1.0" apply false +} + +include(":app") diff --git a/siro_service/assets/fonts/digit.ttf b/siro_service/assets/fonts/digit.ttf new file mode 100644 index 0000000..5dbe6f9 Binary files /dev/null and b/siro_service/assets/fonts/digit.ttf differ diff --git a/siro_service/assets/fonts/josefin.ttf b/siro_service/assets/fonts/josefin.ttf new file mode 100644 index 0000000..505477e Binary files /dev/null and b/siro_service/assets/fonts/josefin.ttf differ diff --git a/siro_service/assets/fonts/mohanad.ttf b/siro_service/assets/fonts/mohanad.ttf new file mode 100644 index 0000000..854341c Binary files /dev/null and b/siro_service/assets/fonts/mohanad.ttf differ diff --git a/siro_service/assets/images/1.png b/siro_service/assets/images/1.png new file mode 100644 index 0000000..290e187 Binary files /dev/null and b/siro_service/assets/images/1.png differ diff --git a/siro_service/assets/images/2.png b/siro_service/assets/images/2.png new file mode 100644 index 0000000..7c4d8d3 Binary files /dev/null and b/siro_service/assets/images/2.png differ diff --git a/siro_service/assets/images/3.png b/siro_service/assets/images/3.png new file mode 100644 index 0000000..81c974f Binary files /dev/null and b/siro_service/assets/images/3.png differ diff --git a/siro_service/assets/images/4.png b/siro_service/assets/images/4.png new file mode 100644 index 0000000..72c8a89 Binary files /dev/null and b/siro_service/assets/images/4.png differ diff --git a/siro_service/assets/images/5.png b/siro_service/assets/images/5.png new file mode 100644 index 0000000..aa6a06f Binary files /dev/null and b/siro_service/assets/images/5.png differ diff --git a/siro_service/assets/images/6.png b/siro_service/assets/images/6.png new file mode 100644 index 0000000..23df2c0 Binary files /dev/null and b/siro_service/assets/images/6.png differ diff --git a/siro_service/assets/images/logo.gif b/siro_service/assets/images/logo.gif new file mode 100644 index 0000000..02c031e Binary files /dev/null and b/siro_service/assets/images/logo.gif differ diff --git a/siro_service/assets/images/logo.png b/siro_service/assets/images/logo.png new file mode 100644 index 0000000..4494193 Binary files /dev/null and b/siro_service/assets/images/logo.png differ diff --git a/siro_service/assets/images/notepad.png b/siro_service/assets/images/notepad.png new file mode 100644 index 0000000..9536a4d Binary files /dev/null and b/siro_service/assets/images/notepad.png differ diff --git a/siro_service/assets/images/on1.png b/siro_service/assets/images/on1.png new file mode 100644 index 0000000..c9881c6 Binary files /dev/null and b/siro_service/assets/images/on1.png differ diff --git a/siro_service/assets/images/on2.png b/siro_service/assets/images/on2.png new file mode 100644 index 0000000..3b6d28c Binary files /dev/null and b/siro_service/assets/images/on2.png differ diff --git a/siro_service/assets/images/on3.png b/siro_service/assets/images/on3.png new file mode 100644 index 0000000..88af4ae Binary files /dev/null and b/siro_service/assets/images/on3.png differ diff --git a/siro_service/assets/images/whats.png b/siro_service/assets/images/whats.png new file mode 100644 index 0000000..2a559d8 Binary files /dev/null and b/siro_service/assets/images/whats.png differ diff --git a/siro_service/assets/notify.mp3 b/siro_service/assets/notify.mp3 new file mode 100644 index 0000000..d10bc28 Binary files /dev/null and b/siro_service/assets/notify.mp3 differ diff --git a/siro_service/firebase.json b/siro_service/firebase.json new file mode 100644 index 0000000..688c847 --- /dev/null +++ b/siro_service/firebase.json @@ -0,0 +1 @@ +{"flutter":{"platforms":{"android":{"default":{"projectId":"siro-a6957","appId":"1:825988584191:android:be08180beef7d65e1632ca","fileOutput":"android/app/google-services.json"}},"ios":{"default":{"projectId":"siro-a6957","appId":"1:825988584191:ios:9d50158dc7a09e851632ca","uploadDebugSymbols":false,"fileOutput":"ios/Runner/GoogleService-Info.plist"}},"dart":{"lib/firebase_options.dart":{"projectId":"siro-a6957","configurations":{"android":"1:825988584191:android:be08180beef7d65e1632ca","ios":"1:825988584191:ios:9d50158dc7a09e851632ca"}}}}}} \ No newline at end of file diff --git a/siro_service/ios/.gitignore b/siro_service/ios/.gitignore new file mode 100644 index 0000000..7a7f987 --- /dev/null +++ b/siro_service/ios/.gitignore @@ -0,0 +1,34 @@ +**/dgph +*.mode1v3 +*.mode2v3 +*.moved-aside +*.pbxuser +*.perspectivev3 +**/*sync/ +.sconsign.dblite +.tags* +**/.vagrant/ +**/DerivedData/ +Icon? +**/Pods/ +**/.symlinks/ +profile +xcuserdata +**/.generated/ +Flutter/App.framework +Flutter/Flutter.framework +Flutter/Flutter.podspec +Flutter/Generated.xcconfig +Flutter/ephemeral/ +Flutter/app.flx +Flutter/app.zip +Flutter/flutter_assets/ +Flutter/flutter_export_environment.sh +ServiceDefinitions.json +Runner/GeneratedPluginRegistrant.* + +# Exceptions to above rules. +!default.mode1v3 +!default.mode2v3 +!default.pbxuser +!default.perspectivev3 diff --git a/siro_service/ios/Flutter/AppFrameworkInfo.plist b/siro_service/ios/Flutter/AppFrameworkInfo.plist new file mode 100644 index 0000000..7c56964 --- /dev/null +++ b/siro_service/ios/Flutter/AppFrameworkInfo.plist @@ -0,0 +1,26 @@ + + + + + CFBundleDevelopmentRegion + en + CFBundleExecutable + App + CFBundleIdentifier + io.flutter.flutter.app + CFBundleInfoDictionaryVersion + 6.0 + CFBundleName + App + CFBundlePackageType + FMWK + CFBundleShortVersionString + 1.0 + CFBundleSignature + ???? + CFBundleVersion + 1.0 + MinimumOSVersion + 12.0 + + diff --git a/siro_service/ios/Flutter/Debug.xcconfig b/siro_service/ios/Flutter/Debug.xcconfig new file mode 100644 index 0000000..ec97fc6 --- /dev/null +++ b/siro_service/ios/Flutter/Debug.xcconfig @@ -0,0 +1,2 @@ +#include? "Pods/Target Support Files/Pods-Runner/Pods-Runner.debug.xcconfig" +#include "Generated.xcconfig" diff --git a/siro_service/ios/Flutter/Release.xcconfig b/siro_service/ios/Flutter/Release.xcconfig new file mode 100644 index 0000000..c4855bf --- /dev/null +++ b/siro_service/ios/Flutter/Release.xcconfig @@ -0,0 +1,2 @@ +#include? "Pods/Target Support Files/Pods-Runner/Pods-Runner.release.xcconfig" +#include "Generated.xcconfig" diff --git a/siro_service/ios/Podfile b/siro_service/ios/Podfile new file mode 100644 index 0000000..6649374 --- /dev/null +++ b/siro_service/ios/Podfile @@ -0,0 +1,43 @@ +# Uncomment this line to define a global platform for your project +platform :ios, '15.0' + +# CocoaPods analytics sends network stats synchronously affecting flutter build latency. +ENV['COCOAPODS_DISABLE_STATS'] = 'true' + +project 'Runner', { + 'Debug' => :debug, + 'Profile' => :release, + 'Release' => :release, +} + +def flutter_root + generated_xcode_build_settings_path = File.expand_path(File.join('..', 'Flutter', 'Generated.xcconfig'), __FILE__) + unless File.exist?(generated_xcode_build_settings_path) + raise "#{generated_xcode_build_settings_path} must exist. If you're running pod install manually, make sure flutter pub get is executed first" + end + + File.foreach(generated_xcode_build_settings_path) do |line| + matches = line.match(/FLUTTER_ROOT\=(.*)/) + return matches[1].strip if matches + end + raise "FLUTTER_ROOT not found in #{generated_xcode_build_settings_path}. Try deleting Generated.xcconfig, then run flutter pub get" +end + +require File.expand_path(File.join('packages', 'flutter_tools', 'bin', 'podhelper'), flutter_root) + +flutter_ios_podfile_setup + +target 'Runner' do + use_frameworks! + + flutter_install_all_ios_pods File.dirname(File.realpath(__FILE__)) + target 'RunnerTests' do + inherit! :search_paths + end +end + +post_install do |installer| + installer.pods_project.targets.each do |target| + flutter_additional_ios_build_settings(target) + end +end diff --git a/siro_service/ios/Podfile.lock b/siro_service/ios/Podfile.lock new file mode 100644 index 0000000..d080027 --- /dev/null +++ b/siro_service/ios/Podfile.lock @@ -0,0 +1,297 @@ +PODS: + - AppAuth (2.0.0): + - AppAuth/Core (= 2.0.0) + - AppAuth/ExternalUserAgent (= 2.0.0) + - AppAuth/Core (2.0.0) + - AppAuth/ExternalUserAgent (2.0.0): + - AppAuth/Core + - AppCheckCore (11.2.0): + - GoogleUtilities/Environment (~> 8.0) + - GoogleUtilities/UserDefaults (~> 8.0) + - PromisesObjC (~> 2.4) + - device_info_plus (0.0.1): + - Flutter + - Firebase/Auth (12.0.0): + - Firebase/CoreOnly + - FirebaseAuth (~> 12.0.0) + - Firebase/CoreOnly (12.0.0): + - FirebaseCore (~> 12.0.0) + - Firebase/Messaging (12.0.0): + - Firebase/CoreOnly + - FirebaseMessaging (~> 12.0.0) + - firebase_auth (6.0.0): + - Firebase/Auth (= 12.0.0) + - firebase_core + - Flutter + - firebase_core (4.0.0): + - Firebase/CoreOnly (= 12.0.0) + - Flutter + - firebase_messaging (16.0.0): + - Firebase/Messaging (= 12.0.0) + - firebase_core + - Flutter + - FirebaseAppCheckInterop (12.0.0) + - FirebaseAuth (12.0.0): + - FirebaseAppCheckInterop (~> 12.0.0) + - FirebaseAuthInterop (~> 12.0.0) + - FirebaseCore (~> 12.0.0) + - FirebaseCoreExtension (~> 12.0.0) + - GoogleUtilities/AppDelegateSwizzler (~> 8.1) + - GoogleUtilities/Environment (~> 8.1) + - GTMSessionFetcher/Core (< 6.0, >= 3.4) + - RecaptchaInterop (~> 101.0) + - FirebaseAuthInterop (12.0.0) + - FirebaseCore (12.0.0): + - FirebaseCoreInternal (~> 12.0.0) + - GoogleUtilities/Environment (~> 8.1) + - GoogleUtilities/Logger (~> 8.1) + - FirebaseCoreExtension (12.0.0): + - FirebaseCore (~> 12.0.0) + - FirebaseCoreInternal (12.0.0): + - "GoogleUtilities/NSData+zlib (~> 8.1)" + - FirebaseInstallations (12.0.0): + - FirebaseCore (~> 12.0.0) + - GoogleUtilities/Environment (~> 8.1) + - GoogleUtilities/UserDefaults (~> 8.1) + - PromisesObjC (~> 2.4) + - FirebaseMessaging (12.0.0): + - FirebaseCore (~> 12.0.0) + - FirebaseInstallations (~> 12.0.0) + - GoogleDataTransport (~> 10.1) + - GoogleUtilities/AppDelegateSwizzler (~> 8.1) + - GoogleUtilities/Environment (~> 8.1) + - GoogleUtilities/Reachability (~> 8.1) + - GoogleUtilities/UserDefaults (~> 8.1) + - nanopb (~> 3.30910.0) + - Flutter (1.0.0) + - flutter_image_compress_common (1.0.0): + - Flutter + - Mantle + - SDWebImage + - SDWebImageWebPCoder + - flutter_local_notifications (0.0.1): + - Flutter + - flutter_secure_storage (6.0.0): + - Flutter + - google_sign_in_ios (0.0.1): + - Flutter + - FlutterMacOS + - GoogleSignIn (~> 9.0) + - GTMSessionFetcher (>= 3.4.0) + - GoogleDataTransport (10.1.0): + - nanopb (~> 3.30910.0) + - PromisesObjC (~> 2.4) + - GoogleSignIn (9.0.0): + - AppAuth (~> 2.0) + - AppCheckCore (~> 11.0) + - GTMAppAuth (~> 5.0) + - GTMSessionFetcher/Core (~> 3.3) + - GoogleUtilities/AppDelegateSwizzler (8.1.0): + - GoogleUtilities/Environment + - GoogleUtilities/Logger + - GoogleUtilities/Network + - GoogleUtilities/Privacy + - GoogleUtilities/Environment (8.1.0): + - GoogleUtilities/Privacy + - GoogleUtilities/Logger (8.1.0): + - GoogleUtilities/Environment + - GoogleUtilities/Privacy + - GoogleUtilities/Network (8.1.0): + - GoogleUtilities/Logger + - "GoogleUtilities/NSData+zlib" + - GoogleUtilities/Privacy + - GoogleUtilities/Reachability + - "GoogleUtilities/NSData+zlib (8.1.0)": + - GoogleUtilities/Privacy + - GoogleUtilities/Privacy (8.1.0) + - GoogleUtilities/Reachability (8.1.0): + - GoogleUtilities/Logger + - GoogleUtilities/Privacy + - GoogleUtilities/UserDefaults (8.1.0): + - GoogleUtilities/Logger + - GoogleUtilities/Privacy + - GTMAppAuth (5.0.0): + - AppAuth/Core (~> 2.0) + - GTMSessionFetcher/Core (< 4.0, >= 3.3) + - GTMSessionFetcher (3.5.0): + - GTMSessionFetcher/Full (= 3.5.0) + - GTMSessionFetcher/Core (3.5.0) + - GTMSessionFetcher/Full (3.5.0): + - GTMSessionFetcher/Core + - image_cropper (0.0.4): + - Flutter + - TOCropViewController (~> 2.7.4) + - image_picker_ios (0.0.1): + - Flutter + - libwebp (1.5.0): + - libwebp/demux (= 1.5.0) + - libwebp/mux (= 1.5.0) + - libwebp/sharpyuv (= 1.5.0) + - libwebp/webp (= 1.5.0) + - libwebp/demux (1.5.0): + - libwebp/webp + - libwebp/mux (1.5.0): + - libwebp/demux + - libwebp/sharpyuv (1.5.0) + - libwebp/webp (1.5.0): + - libwebp/sharpyuv + - Mantle (2.2.0): + - Mantle/extobjc (= 2.2.0) + - Mantle/extobjc (2.2.0) + - nanopb (3.30910.0): + - nanopb/decode (= 3.30910.0) + - nanopb/encode (= 3.30910.0) + - nanopb/decode (3.30910.0) + - nanopb/encode (3.30910.0) + - path_provider_foundation (0.0.1): + - Flutter + - FlutterMacOS + - permission_handler_apple (9.3.0): + - Flutter + - PromisesObjC (2.4.0) + - RecaptchaInterop (101.0.0) + - SDWebImage (5.21.2): + - SDWebImage/Core (= 5.21.2) + - SDWebImage/Core (5.21.2) + - SDWebImageWebPCoder (0.14.6): + - libwebp (~> 1.0) + - SDWebImage/Core (~> 5.17) + - share_plus (0.0.1): + - Flutter + - sqflite_darwin (0.0.4): + - Flutter + - FlutterMacOS + - TOCropViewController (2.7.4) + - url_launcher_ios (0.0.1): + - Flutter + - vibration (3.0.0): + - Flutter + +DEPENDENCIES: + - device_info_plus (from `.symlinks/plugins/device_info_plus/ios`) + - firebase_auth (from `.symlinks/plugins/firebase_auth/ios`) + - firebase_core (from `.symlinks/plugins/firebase_core/ios`) + - firebase_messaging (from `.symlinks/plugins/firebase_messaging/ios`) + - Flutter (from `Flutter`) + - flutter_image_compress_common (from `.symlinks/plugins/flutter_image_compress_common/ios`) + - flutter_local_notifications (from `.symlinks/plugins/flutter_local_notifications/ios`) + - flutter_secure_storage (from `.symlinks/plugins/flutter_secure_storage/ios`) + - google_sign_in_ios (from `.symlinks/plugins/google_sign_in_ios/darwin`) + - image_cropper (from `.symlinks/plugins/image_cropper/ios`) + - image_picker_ios (from `.symlinks/plugins/image_picker_ios/ios`) + - path_provider_foundation (from `.symlinks/plugins/path_provider_foundation/darwin`) + - permission_handler_apple (from `.symlinks/plugins/permission_handler_apple/ios`) + - share_plus (from `.symlinks/plugins/share_plus/ios`) + - sqflite_darwin (from `.symlinks/plugins/sqflite_darwin/darwin`) + - url_launcher_ios (from `.symlinks/plugins/url_launcher_ios/ios`) + - vibration (from `.symlinks/plugins/vibration/ios`) + +SPEC REPOS: + trunk: + - AppAuth + - AppCheckCore + - Firebase + - FirebaseAppCheckInterop + - FirebaseAuth + - FirebaseAuthInterop + - FirebaseCore + - FirebaseCoreExtension + - FirebaseCoreInternal + - FirebaseInstallations + - FirebaseMessaging + - GoogleDataTransport + - GoogleSignIn + - GoogleUtilities + - GTMAppAuth + - GTMSessionFetcher + - libwebp + - Mantle + - nanopb + - PromisesObjC + - RecaptchaInterop + - SDWebImage + - SDWebImageWebPCoder + - TOCropViewController + +EXTERNAL SOURCES: + device_info_plus: + :path: ".symlinks/plugins/device_info_plus/ios" + firebase_auth: + :path: ".symlinks/plugins/firebase_auth/ios" + firebase_core: + :path: ".symlinks/plugins/firebase_core/ios" + firebase_messaging: + :path: ".symlinks/plugins/firebase_messaging/ios" + Flutter: + :path: Flutter + flutter_image_compress_common: + :path: ".symlinks/plugins/flutter_image_compress_common/ios" + flutter_local_notifications: + :path: ".symlinks/plugins/flutter_local_notifications/ios" + flutter_secure_storage: + :path: ".symlinks/plugins/flutter_secure_storage/ios" + google_sign_in_ios: + :path: ".symlinks/plugins/google_sign_in_ios/darwin" + image_cropper: + :path: ".symlinks/plugins/image_cropper/ios" + image_picker_ios: + :path: ".symlinks/plugins/image_picker_ios/ios" + path_provider_foundation: + :path: ".symlinks/plugins/path_provider_foundation/darwin" + permission_handler_apple: + :path: ".symlinks/plugins/permission_handler_apple/ios" + share_plus: + :path: ".symlinks/plugins/share_plus/ios" + sqflite_darwin: + :path: ".symlinks/plugins/sqflite_darwin/darwin" + url_launcher_ios: + :path: ".symlinks/plugins/url_launcher_ios/ios" + vibration: + :path: ".symlinks/plugins/vibration/ios" + +SPEC CHECKSUMS: + AppAuth: 1c1a8afa7e12f2ec3a294d9882dfa5ab7d3cb063 + AppCheckCore: cc8fd0a3a230ddd401f326489c99990b013f0c4f + device_info_plus: 21fcca2080fbcd348be798aa36c3e5ed849eefbe + Firebase: 800d487043c0557d9faed71477a38d9aafb08a41 + firebase_auth: 5a5603bbe7fc673f88b7c652bf9c41d6c742b545 + firebase_core: 633e1851ffe1b9ab875f6467a4f574c79cef02e4 + firebase_messaging: d17feef781edc84ebefe62624fb384358ad96361 + FirebaseAppCheckInterop: c848d06a04030c9858ef0ae555b82035dbe470d0 + FirebaseAuth: 654e4de84787c45d7265599a651038e854ccb439 + FirebaseAuthInterop: 002da671896af5e8879ae117dc604ed240b86e80 + FirebaseCore: 055f4ab117d5964158c833f3d5e7ec6d91648d4a + FirebaseCoreExtension: 639afb3de6abd611952be78a794c54a47fa0f361 + FirebaseCoreInternal: dedc28e569a4be85f38f3d6af1070a2e12018d55 + FirebaseInstallations: d4c7c958f99c8860d7fcece786314ae790e2f988 + FirebaseMessaging: af49f8d7c0a3d2a017d9302c80946f45a7777dde + Flutter: e0871f40cf51350855a761d2e70bf5af5b9b5de7 + flutter_image_compress_common: 1697a328fd72bfb335507c6bca1a65fa5ad87df1 + flutter_local_notifications: a5a732f069baa862e728d839dd2ebb904737effb + flutter_secure_storage: 1ed9476fba7e7a782b22888f956cce43e2c62f13 + google_sign_in_ios: 205742c688aea0e64db9da03c33121694a365109 + GoogleDataTransport: aae35b7ea0c09004c3797d53c8c41f66f219d6a7 + GoogleSignIn: c7f09cfbc85a1abf69187be091997c317cc33b77 + GoogleUtilities: 00c88b9a86066ef77f0da2fab05f65d7768ed8e1 + GTMAppAuth: 217a876b249c3c585a54fd6f73e6b58c4f5c4238 + GTMSessionFetcher: 5aea5ba6bd522a239e236100971f10cb71b96ab6 + image_cropper: c4326ea50132b1e1564499e5d32a84f01fb03537 + image_picker_ios: 7fe1ff8e34c1790d6fff70a32484959f563a928a + libwebp: 02b23773aedb6ff1fd38cec7a77b81414c6842a8 + Mantle: c5aa8794a29a022dfbbfc9799af95f477a69b62d + nanopb: fad817b59e0457d11a5dfbde799381cd727c1275 + path_provider_foundation: 080d55be775b7414fd5a5ef3ac137b97b097e564 + permission_handler_apple: 4ed2196e43d0651e8ff7ca3483a069d469701f2d + PromisesObjC: f5707f49cb48b9636751c5b2e7d227e43fba9f47 + RecaptchaInterop: 11e0b637842dfb48308d242afc3f448062325aba + SDWebImage: 9f177d83116802728e122410fb25ad88f5c7608a + SDWebImageWebPCoder: e38c0a70396191361d60c092933e22c20d5b1380 + share_plus: de6030e33b4e106470e09322d87cf2a4258d2d1d + sqflite_darwin: 20b2a3a3b70e43edae938624ce550a3cbf66a3d0 + TOCropViewController: 80b8985ad794298fb69d3341de183f33d1853654 + url_launcher_ios: 694010445543906933d732453a59da0a173ae33d + vibration: 69774ad57825b11c951ee4c46155f455d7a592ce + +PODFILE CHECKSUM: 53a6aebc29ccee84c41f92f409fc20cd4ca011f1 + +COCOAPODS: 1.16.2 diff --git a/siro_service/ios/Runner.xcodeproj/project.pbxproj b/siro_service/ios/Runner.xcodeproj/project.pbxproj new file mode 100644 index 0000000..f57f20b --- /dev/null +++ b/siro_service/ios/Runner.xcodeproj/project.pbxproj @@ -0,0 +1,753 @@ +// !$*UTF8*$! +{ + archiveVersion = 1; + classes = { + }; + objectVersion = 54; + objects = { + +/* Begin PBXBuildFile section */ + 1498D2341E8E89220040F4C2 /* GeneratedPluginRegistrant.m in Sources */ = {isa = PBXBuildFile; fileRef = 1498D2331E8E89220040F4C2 /* GeneratedPluginRegistrant.m */; }; + 331C808B294A63AB00263BE5 /* RunnerTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 331C807B294A618700263BE5 /* RunnerTests.swift */; }; + 3B3967161E833CAA004F5970 /* AppFrameworkInfo.plist in Resources */ = {isa = PBXBuildFile; fileRef = 3B3967151E833CAA004F5970 /* AppFrameworkInfo.plist */; }; + 74858FAF1ED2DC5600515810 /* AppDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 74858FAE1ED2DC5600515810 /* AppDelegate.swift */; }; + 97C146FC1CF9000F007C117D /* Main.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 97C146FA1CF9000F007C117D /* Main.storyboard */; }; + 97C146FE1CF9000F007C117D /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 97C146FD1CF9000F007C117D /* Assets.xcassets */; }; + 97C147011CF9000F007C117D /* LaunchScreen.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 97C146FF1CF9000F007C117D /* LaunchScreen.storyboard */; }; + AF0AF264D72AAB5C072EBF63 /* Pods_Runner.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = D353C14D406BEA76DDC4CEDD /* Pods_Runner.framework */; }; + ED1F6F4084CE38C57593745C /* GoogleService-Info.plist in Resources */ = {isa = PBXBuildFile; fileRef = F533C517F5928BDCFDC9295F /* GoogleService-Info.plist */; }; + F6E92F32EE05FDB601BF08FD /* Pods_RunnerTests.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 1A63E609133A89EEF042220B /* Pods_RunnerTests.framework */; }; +/* End PBXBuildFile section */ + +/* Begin PBXContainerItemProxy section */ + 331C8085294A63A400263BE5 /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = 97C146E61CF9000F007C117D /* Project object */; + proxyType = 1; + remoteGlobalIDString = 97C146ED1CF9000F007C117D; + remoteInfo = Runner; + }; +/* End PBXContainerItemProxy section */ + +/* Begin PBXCopyFilesBuildPhase section */ + 9705A1C41CF9048500538489 /* Embed Frameworks */ = { + isa = PBXCopyFilesBuildPhase; + buildActionMask = 2147483647; + dstPath = ""; + dstSubfolderSpec = 10; + files = ( + ); + name = "Embed Frameworks"; + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXCopyFilesBuildPhase section */ + +/* Begin PBXFileReference section */ + 1498D2321E8E86230040F4C2 /* GeneratedPluginRegistrant.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = GeneratedPluginRegistrant.h; sourceTree = ""; }; + 1498D2331E8E89220040F4C2 /* GeneratedPluginRegistrant.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = GeneratedPluginRegistrant.m; sourceTree = ""; }; + 1A63E609133A89EEF042220B /* Pods_RunnerTests.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_RunnerTests.framework; sourceTree = BUILT_PRODUCTS_DIR; }; + 28D4768B792FCD16018172CA /* Pods-Runner.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.debug.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.debug.xcconfig"; sourceTree = ""; }; + 331C807B294A618700263BE5 /* RunnerTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = RunnerTests.swift; sourceTree = ""; }; + 331C8081294A63A400263BE5 /* RunnerTests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = RunnerTests.xctest; sourceTree = BUILT_PRODUCTS_DIR; }; + 3B3967151E833CAA004F5970 /* AppFrameworkInfo.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; name = AppFrameworkInfo.plist; path = Flutter/AppFrameworkInfo.plist; sourceTree = ""; }; + 74858FAD1ED2DC5600515810 /* Runner-Bridging-Header.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = "Runner-Bridging-Header.h"; sourceTree = ""; }; + 74858FAE1ED2DC5600515810 /* AppDelegate.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = AppDelegate.swift; sourceTree = ""; }; + 7AFA3C8E1D35360C0083082E /* Release.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; name = Release.xcconfig; path = Flutter/Release.xcconfig; sourceTree = ""; }; + 9740EEB21CF90195004384FC /* Debug.xcconfig */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xcconfig; name = Debug.xcconfig; path = Flutter/Debug.xcconfig; sourceTree = ""; }; + 9740EEB31CF90195004384FC /* Generated.xcconfig */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xcconfig; name = Generated.xcconfig; path = Flutter/Generated.xcconfig; sourceTree = ""; }; + 97C146EE1CF9000F007C117D /* Runner.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = Runner.app; sourceTree = BUILT_PRODUCTS_DIR; }; + 97C146FB1CF9000F007C117D /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/Main.storyboard; sourceTree = ""; }; + 97C146FD1CF9000F007C117D /* Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Assets.xcassets; sourceTree = ""; }; + 97C147001CF9000F007C117D /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/LaunchScreen.storyboard; sourceTree = ""; }; + 97C147021CF9000F007C117D /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; + A16DB7C708FA3D7E4D68FD93 /* Pods-RunnerTests.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-RunnerTests.debug.xcconfig"; path = "Target Support Files/Pods-RunnerTests/Pods-RunnerTests.debug.xcconfig"; sourceTree = ""; }; + B8A00C457D5850C21DE865E2 /* Pods-Runner.profile.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.profile.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.profile.xcconfig"; sourceTree = ""; }; + BF0866B0BBB709298D77AE01 /* Pods-RunnerTests.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-RunnerTests.release.xcconfig"; path = "Target Support Files/Pods-RunnerTests/Pods-RunnerTests.release.xcconfig"; sourceTree = ""; }; + D34871C8E2C1B2113E855908 /* Pods-Runner.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.release.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.release.xcconfig"; sourceTree = ""; }; + D353C14D406BEA76DDC4CEDD /* Pods_Runner.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_Runner.framework; sourceTree = BUILT_PRODUCTS_DIR; }; + EEAEE25FE2EFA1AE050FF002 /* Pods-RunnerTests.profile.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-RunnerTests.profile.xcconfig"; path = "Target Support Files/Pods-RunnerTests/Pods-RunnerTests.profile.xcconfig"; sourceTree = ""; }; + F533C517F5928BDCFDC9295F /* GoogleService-Info.plist */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.plist.xml; name = "GoogleService-Info.plist"; path = "Runner/GoogleService-Info.plist"; sourceTree = ""; }; +/* End PBXFileReference section */ + +/* Begin PBXFrameworksBuildPhase section */ + 97C146EB1CF9000F007C117D /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( + AF0AF264D72AAB5C072EBF63 /* Pods_Runner.framework in Frameworks */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + DF4E3F6FDE887838D39DB349 /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( + F6E92F32EE05FDB601BF08FD /* Pods_RunnerTests.framework in Frameworks */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXFrameworksBuildPhase section */ + +/* Begin PBXGroup section */ + 331C8082294A63A400263BE5 /* RunnerTests */ = { + isa = PBXGroup; + children = ( + 331C807B294A618700263BE5 /* RunnerTests.swift */, + ); + path = RunnerTests; + sourceTree = ""; + }; + 3AF11E78240F2F4936A829ED /* Frameworks */ = { + isa = PBXGroup; + children = ( + D353C14D406BEA76DDC4CEDD /* Pods_Runner.framework */, + 1A63E609133A89EEF042220B /* Pods_RunnerTests.framework */, + ); + name = Frameworks; + sourceTree = ""; + }; + 92F26F512BB0C437BB6F8B84 /* Pods */ = { + isa = PBXGroup; + children = ( + 28D4768B792FCD16018172CA /* Pods-Runner.debug.xcconfig */, + D34871C8E2C1B2113E855908 /* Pods-Runner.release.xcconfig */, + B8A00C457D5850C21DE865E2 /* Pods-Runner.profile.xcconfig */, + A16DB7C708FA3D7E4D68FD93 /* Pods-RunnerTests.debug.xcconfig */, + BF0866B0BBB709298D77AE01 /* Pods-RunnerTests.release.xcconfig */, + EEAEE25FE2EFA1AE050FF002 /* Pods-RunnerTests.profile.xcconfig */, + ); + name = Pods; + path = Pods; + sourceTree = ""; + }; + 9740EEB11CF90186004384FC /* Flutter */ = { + isa = PBXGroup; + children = ( + 3B3967151E833CAA004F5970 /* AppFrameworkInfo.plist */, + 9740EEB21CF90195004384FC /* Debug.xcconfig */, + 7AFA3C8E1D35360C0083082E /* Release.xcconfig */, + 9740EEB31CF90195004384FC /* Generated.xcconfig */, + ); + name = Flutter; + sourceTree = ""; + }; + 97C146E51CF9000F007C117D = { + isa = PBXGroup; + children = ( + 9740EEB11CF90186004384FC /* Flutter */, + 97C146F01CF9000F007C117D /* Runner */, + 97C146EF1CF9000F007C117D /* Products */, + 331C8082294A63A400263BE5 /* RunnerTests */, + F533C517F5928BDCFDC9295F /* GoogleService-Info.plist */, + 92F26F512BB0C437BB6F8B84 /* Pods */, + 3AF11E78240F2F4936A829ED /* Frameworks */, + ); + sourceTree = ""; + }; + 97C146EF1CF9000F007C117D /* Products */ = { + isa = PBXGroup; + children = ( + 97C146EE1CF9000F007C117D /* Runner.app */, + 331C8081294A63A400263BE5 /* RunnerTests.xctest */, + ); + name = Products; + sourceTree = ""; + }; + 97C146F01CF9000F007C117D /* Runner */ = { + isa = PBXGroup; + children = ( + 97C146FA1CF9000F007C117D /* Main.storyboard */, + 97C146FD1CF9000F007C117D /* Assets.xcassets */, + 97C146FF1CF9000F007C117D /* LaunchScreen.storyboard */, + 97C147021CF9000F007C117D /* Info.plist */, + 1498D2321E8E86230040F4C2 /* GeneratedPluginRegistrant.h */, + 1498D2331E8E89220040F4C2 /* GeneratedPluginRegistrant.m */, + 74858FAE1ED2DC5600515810 /* AppDelegate.swift */, + 74858FAD1ED2DC5600515810 /* Runner-Bridging-Header.h */, + ); + path = Runner; + sourceTree = ""; + }; +/* End PBXGroup section */ + +/* Begin PBXNativeTarget section */ + 331C8080294A63A400263BE5 /* RunnerTests */ = { + isa = PBXNativeTarget; + buildConfigurationList = 331C8087294A63A400263BE5 /* Build configuration list for PBXNativeTarget "RunnerTests" */; + buildPhases = ( + 84654B32CEBA94A3AB98B1F1 /* [CP] Check Pods Manifest.lock */, + 331C807D294A63A400263BE5 /* Sources */, + 331C807F294A63A400263BE5 /* Resources */, + DF4E3F6FDE887838D39DB349 /* Frameworks */, + ); + buildRules = ( + ); + dependencies = ( + 331C8086294A63A400263BE5 /* PBXTargetDependency */, + ); + name = RunnerTests; + productName = RunnerTests; + productReference = 331C8081294A63A400263BE5 /* RunnerTests.xctest */; + productType = "com.apple.product-type.bundle.unit-test"; + }; + 97C146ED1CF9000F007C117D /* Runner */ = { + isa = PBXNativeTarget; + buildConfigurationList = 97C147051CF9000F007C117D /* Build configuration list for PBXNativeTarget "Runner" */; + buildPhases = ( + A2F48F17CEBC9FC6CBB4FD8B /* [CP] Check Pods Manifest.lock */, + 9740EEB61CF901F6004384FC /* Run Script */, + 97C146EA1CF9000F007C117D /* Sources */, + 97C146EB1CF9000F007C117D /* Frameworks */, + 97C146EC1CF9000F007C117D /* Resources */, + 9705A1C41CF9048500538489 /* Embed Frameworks */, + 3B06AD1E1E4923F5004D2608 /* Thin Binary */, + 5D3AD08720B484D33EA3F7F2 /* [CP] Embed Pods Frameworks */, + 639726CC45A829220CA89AB2 /* [CP] Copy Pods Resources */, + ); + buildRules = ( + ); + dependencies = ( + ); + name = Runner; + productName = Runner; + productReference = 97C146EE1CF9000F007C117D /* Runner.app */; + productType = "com.apple.product-type.application"; + }; +/* End PBXNativeTarget section */ + +/* Begin PBXProject section */ + 97C146E61CF9000F007C117D /* Project object */ = { + isa = PBXProject; + attributes = { + BuildIndependentTargetsInParallel = YES; + LastUpgradeCheck = 1510; + ORGANIZATIONNAME = ""; + TargetAttributes = { + 331C8080294A63A400263BE5 = { + CreatedOnToolsVersion = 14.0; + TestTargetID = 97C146ED1CF9000F007C117D; + }; + 97C146ED1CF9000F007C117D = { + CreatedOnToolsVersion = 7.3.1; + LastSwiftMigration = 1100; + }; + }; + }; + buildConfigurationList = 97C146E91CF9000F007C117D /* Build configuration list for PBXProject "Runner" */; + compatibilityVersion = "Xcode 9.3"; + developmentRegion = en; + hasScannedForEncodings = 0; + knownRegions = ( + en, + Base, + ); + mainGroup = 97C146E51CF9000F007C117D; + productRefGroup = 97C146EF1CF9000F007C117D /* Products */; + projectDirPath = ""; + projectRoot = ""; + targets = ( + 97C146ED1CF9000F007C117D /* Runner */, + 331C8080294A63A400263BE5 /* RunnerTests */, + ); + }; +/* End PBXProject section */ + +/* Begin PBXResourcesBuildPhase section */ + 331C807F294A63A400263BE5 /* Resources */ = { + isa = PBXResourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + runOnlyForDeploymentPostprocessing = 0; + }; + 97C146EC1CF9000F007C117D /* Resources */ = { + isa = PBXResourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + 97C147011CF9000F007C117D /* LaunchScreen.storyboard in Resources */, + 3B3967161E833CAA004F5970 /* AppFrameworkInfo.plist in Resources */, + 97C146FE1CF9000F007C117D /* Assets.xcassets in Resources */, + 97C146FC1CF9000F007C117D /* Main.storyboard in Resources */, + ED1F6F4084CE38C57593745C /* GoogleService-Info.plist in Resources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXResourcesBuildPhase section */ + +/* Begin PBXShellScriptBuildPhase section */ + 3B06AD1E1E4923F5004D2608 /* Thin Binary */ = { + isa = PBXShellScriptBuildPhase; + alwaysOutOfDate = 1; + buildActionMask = 2147483647; + files = ( + ); + inputPaths = ( + "${TARGET_BUILD_DIR}/${INFOPLIST_PATH}", + ); + name = "Thin Binary"; + outputPaths = ( + ); + runOnlyForDeploymentPostprocessing = 0; + shellPath = /bin/sh; + shellScript = "/bin/sh \"$FLUTTER_ROOT/packages/flutter_tools/bin/xcode_backend.sh\" embed_and_thin"; + }; + 5D3AD08720B484D33EA3F7F2 /* [CP] Embed Pods Frameworks */ = { + isa = PBXShellScriptBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + inputFileListPaths = ( + "${PODS_ROOT}/Target Support Files/Pods-Runner/Pods-Runner-frameworks-${CONFIGURATION}-input-files.xcfilelist", + ); + name = "[CP] Embed Pods Frameworks"; + outputFileListPaths = ( + "${PODS_ROOT}/Target Support Files/Pods-Runner/Pods-Runner-frameworks-${CONFIGURATION}-output-files.xcfilelist", + ); + runOnlyForDeploymentPostprocessing = 0; + shellPath = /bin/sh; + shellScript = "\"${PODS_ROOT}/Target Support Files/Pods-Runner/Pods-Runner-frameworks.sh\"\n"; + showEnvVarsInLog = 0; + }; + 639726CC45A829220CA89AB2 /* [CP] Copy Pods Resources */ = { + isa = PBXShellScriptBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + inputFileListPaths = ( + "${PODS_ROOT}/Target Support Files/Pods-Runner/Pods-Runner-resources-${CONFIGURATION}-input-files.xcfilelist", + ); + name = "[CP] Copy Pods Resources"; + outputFileListPaths = ( + "${PODS_ROOT}/Target Support Files/Pods-Runner/Pods-Runner-resources-${CONFIGURATION}-output-files.xcfilelist", + ); + runOnlyForDeploymentPostprocessing = 0; + shellPath = /bin/sh; + shellScript = "\"${PODS_ROOT}/Target Support Files/Pods-Runner/Pods-Runner-resources.sh\"\n"; + showEnvVarsInLog = 0; + }; + 84654B32CEBA94A3AB98B1F1 /* [CP] Check Pods Manifest.lock */ = { + isa = PBXShellScriptBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + inputFileListPaths = ( + ); + inputPaths = ( + "${PODS_PODFILE_DIR_PATH}/Podfile.lock", + "${PODS_ROOT}/Manifest.lock", + ); + name = "[CP] Check Pods Manifest.lock"; + outputFileListPaths = ( + ); + outputPaths = ( + "$(DERIVED_FILE_DIR)/Pods-RunnerTests-checkManifestLockResult.txt", + ); + runOnlyForDeploymentPostprocessing = 0; + shellPath = /bin/sh; + shellScript = "diff \"${PODS_PODFILE_DIR_PATH}/Podfile.lock\" \"${PODS_ROOT}/Manifest.lock\" > /dev/null\nif [ $? != 0 ] ; then\n # print error to STDERR\n echo \"error: The sandbox is not in sync with the Podfile.lock. Run 'pod install' or update your CocoaPods installation.\" >&2\n exit 1\nfi\n# This output is used by Xcode 'outputs' to avoid re-running this script phase.\necho \"SUCCESS\" > \"${SCRIPT_OUTPUT_FILE_0}\"\n"; + showEnvVarsInLog = 0; + }; + 9740EEB61CF901F6004384FC /* Run Script */ = { + isa = PBXShellScriptBuildPhase; + alwaysOutOfDate = 1; + buildActionMask = 2147483647; + files = ( + ); + inputPaths = ( + ); + name = "Run Script"; + outputPaths = ( + ); + runOnlyForDeploymentPostprocessing = 0; + shellPath = /bin/sh; + shellScript = "/bin/sh \"$FLUTTER_ROOT/packages/flutter_tools/bin/xcode_backend.sh\" build"; + }; + A2F48F17CEBC9FC6CBB4FD8B /* [CP] Check Pods Manifest.lock */ = { + isa = PBXShellScriptBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + inputFileListPaths = ( + ); + inputPaths = ( + "${PODS_PODFILE_DIR_PATH}/Podfile.lock", + "${PODS_ROOT}/Manifest.lock", + ); + name = "[CP] Check Pods Manifest.lock"; + outputFileListPaths = ( + ); + outputPaths = ( + "$(DERIVED_FILE_DIR)/Pods-Runner-checkManifestLockResult.txt", + ); + runOnlyForDeploymentPostprocessing = 0; + shellPath = /bin/sh; + shellScript = "diff \"${PODS_PODFILE_DIR_PATH}/Podfile.lock\" \"${PODS_ROOT}/Manifest.lock\" > /dev/null\nif [ $? != 0 ] ; then\n # print error to STDERR\n echo \"error: The sandbox is not in sync with the Podfile.lock. Run 'pod install' or update your CocoaPods installation.\" >&2\n exit 1\nfi\n# This output is used by Xcode 'outputs' to avoid re-running this script phase.\necho \"SUCCESS\" > \"${SCRIPT_OUTPUT_FILE_0}\"\n"; + showEnvVarsInLog = 0; + }; +/* End PBXShellScriptBuildPhase section */ + +/* Begin PBXSourcesBuildPhase section */ + 331C807D294A63A400263BE5 /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + 331C808B294A63AB00263BE5 /* RunnerTests.swift in Sources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + 97C146EA1CF9000F007C117D /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + 74858FAF1ED2DC5600515810 /* AppDelegate.swift in Sources */, + 1498D2341E8E89220040F4C2 /* GeneratedPluginRegistrant.m in Sources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXSourcesBuildPhase section */ + +/* Begin PBXTargetDependency section */ + 331C8086294A63A400263BE5 /* PBXTargetDependency */ = { + isa = PBXTargetDependency; + target = 97C146ED1CF9000F007C117D /* Runner */; + targetProxy = 331C8085294A63A400263BE5 /* PBXContainerItemProxy */; + }; +/* End PBXTargetDependency section */ + +/* Begin PBXVariantGroup section */ + 97C146FA1CF9000F007C117D /* Main.storyboard */ = { + isa = PBXVariantGroup; + children = ( + 97C146FB1CF9000F007C117D /* Base */, + ); + name = Main.storyboard; + sourceTree = ""; + }; + 97C146FF1CF9000F007C117D /* LaunchScreen.storyboard */ = { + isa = PBXVariantGroup; + children = ( + 97C147001CF9000F007C117D /* Base */, + ); + name = LaunchScreen.storyboard; + sourceTree = ""; + }; +/* End PBXVariantGroup section */ + +/* Begin XCBuildConfiguration section */ + 249021D3217E4FDB00AE95B9 /* Profile */ = { + isa = XCBuildConfiguration; + buildSettings = { + ALWAYS_SEARCH_USER_PATHS = NO; + ASSETCATALOG_COMPILER_GENERATE_SWIFT_ASSET_SYMBOL_EXTENSIONS = YES; + CLANG_ANALYZER_NONNULL = YES; + CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; + CLANG_CXX_LIBRARY = "libc++"; + CLANG_ENABLE_MODULES = YES; + CLANG_ENABLE_OBJC_ARC = YES; + CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; + CLANG_WARN_BOOL_CONVERSION = YES; + CLANG_WARN_COMMA = YES; + CLANG_WARN_CONSTANT_CONVERSION = YES; + CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; + CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; + CLANG_WARN_EMPTY_BODY = YES; + CLANG_WARN_ENUM_CONVERSION = YES; + CLANG_WARN_INFINITE_RECURSION = YES; + CLANG_WARN_INT_CONVERSION = YES; + CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; + CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; + CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; + CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; + CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; + CLANG_WARN_STRICT_PROTOTYPES = YES; + CLANG_WARN_SUSPICIOUS_MOVE = YES; + CLANG_WARN_UNREACHABLE_CODE = YES; + CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; + "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; + COPY_PHASE_STRIP = NO; + DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; + ENABLE_NS_ASSERTIONS = NO; + ENABLE_STRICT_OBJC_MSGSEND = YES; + ENABLE_USER_SCRIPT_SANDBOXING = NO; + GCC_C_LANGUAGE_STANDARD = gnu99; + GCC_NO_COMMON_BLOCKS = YES; + GCC_WARN_64_TO_32_BIT_CONVERSION = YES; + GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; + GCC_WARN_UNDECLARED_SELECTOR = YES; + GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; + GCC_WARN_UNUSED_FUNCTION = YES; + GCC_WARN_UNUSED_VARIABLE = YES; + IPHONEOS_DEPLOYMENT_TARGET = 12.0; + MTL_ENABLE_DEBUG_INFO = NO; + SDKROOT = iphoneos; + SUPPORTED_PLATFORMS = iphoneos; + TARGETED_DEVICE_FAMILY = "1,2"; + VALIDATE_PRODUCT = YES; + }; + name = Profile; + }; + 249021D4217E4FDB00AE95B9 /* Profile */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = 7AFA3C8E1D35360C0083082E /* Release.xcconfig */; + buildSettings = { + ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; + CLANG_ENABLE_MODULES = YES; + CURRENT_PROJECT_VERSION = "$(FLUTTER_BUILD_NUMBER)"; + DEVELOPMENT_TEAM = 63CVT8G5P8; + ENABLE_BITCODE = NO; + INFOPLIST_FILE = Runner/Info.plist; + LD_RUNPATH_SEARCH_PATHS = ( + "$(inherited)", + "@executable_path/Frameworks", + ); + PRODUCT_BUNDLE_IDENTIFIER = com.example.serviceIntaleq; + PRODUCT_NAME = "$(TARGET_NAME)"; + SWIFT_OBJC_BRIDGING_HEADER = "Runner/Runner-Bridging-Header.h"; + SWIFT_VERSION = 5.0; + VERSIONING_SYSTEM = "apple-generic"; + }; + name = Profile; + }; + 331C8088294A63A400263BE5 /* Debug */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = A16DB7C708FA3D7E4D68FD93 /* Pods-RunnerTests.debug.xcconfig */; + buildSettings = { + BUNDLE_LOADER = "$(TEST_HOST)"; + CODE_SIGN_STYLE = Automatic; + CURRENT_PROJECT_VERSION = 1; + GENERATE_INFOPLIST_FILE = YES; + MARKETING_VERSION = 1.0; + PRODUCT_BUNDLE_IDENTIFIER = com.example.serviceIntaleq.RunnerTests; + PRODUCT_NAME = "$(TARGET_NAME)"; + SWIFT_ACTIVE_COMPILATION_CONDITIONS = DEBUG; + SWIFT_OPTIMIZATION_LEVEL = "-Onone"; + SWIFT_VERSION = 5.0; + TEST_HOST = "$(BUILT_PRODUCTS_DIR)/Runner.app/$(BUNDLE_EXECUTABLE_FOLDER_PATH)/Runner"; + }; + name = Debug; + }; + 331C8089294A63A400263BE5 /* Release */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = BF0866B0BBB709298D77AE01 /* Pods-RunnerTests.release.xcconfig */; + buildSettings = { + BUNDLE_LOADER = "$(TEST_HOST)"; + CODE_SIGN_STYLE = Automatic; + CURRENT_PROJECT_VERSION = 1; + GENERATE_INFOPLIST_FILE = YES; + MARKETING_VERSION = 1.0; + PRODUCT_BUNDLE_IDENTIFIER = com.example.serviceIntaleq.RunnerTests; + PRODUCT_NAME = "$(TARGET_NAME)"; + SWIFT_VERSION = 5.0; + TEST_HOST = "$(BUILT_PRODUCTS_DIR)/Runner.app/$(BUNDLE_EXECUTABLE_FOLDER_PATH)/Runner"; + }; + name = Release; + }; + 331C808A294A63A400263BE5 /* Profile */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = EEAEE25FE2EFA1AE050FF002 /* Pods-RunnerTests.profile.xcconfig */; + buildSettings = { + BUNDLE_LOADER = "$(TEST_HOST)"; + CODE_SIGN_STYLE = Automatic; + CURRENT_PROJECT_VERSION = 1; + GENERATE_INFOPLIST_FILE = YES; + MARKETING_VERSION = 1.0; + PRODUCT_BUNDLE_IDENTIFIER = com.example.serviceIntaleq.RunnerTests; + PRODUCT_NAME = "$(TARGET_NAME)"; + SWIFT_VERSION = 5.0; + TEST_HOST = "$(BUILT_PRODUCTS_DIR)/Runner.app/$(BUNDLE_EXECUTABLE_FOLDER_PATH)/Runner"; + }; + name = Profile; + }; + 97C147031CF9000F007C117D /* Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + ALWAYS_SEARCH_USER_PATHS = NO; + ASSETCATALOG_COMPILER_GENERATE_SWIFT_ASSET_SYMBOL_EXTENSIONS = AppIcon; + CLANG_ANALYZER_NONNULL = YES; + CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; + CLANG_CXX_LIBRARY = "libc++"; + CLANG_ENABLE_MODULES = YES; + CLANG_ENABLE_OBJC_ARC = YES; + CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; + CLANG_WARN_BOOL_CONVERSION = YES; + CLANG_WARN_COMMA = YES; + CLANG_WARN_CONSTANT_CONVERSION = YES; + CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; + CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; + CLANG_WARN_EMPTY_BODY = YES; + CLANG_WARN_ENUM_CONVERSION = YES; + CLANG_WARN_INFINITE_RECURSION = YES; + CLANG_WARN_INT_CONVERSION = YES; + CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; + CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; + CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; + CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; + CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; + CLANG_WARN_STRICT_PROTOTYPES = YES; + CLANG_WARN_SUSPICIOUS_MOVE = YES; + CLANG_WARN_UNREACHABLE_CODE = YES; + CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; + "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; + COPY_PHASE_STRIP = NO; + DEBUG_INFORMATION_FORMAT = dwarf; + ENABLE_STRICT_OBJC_MSGSEND = YES; + ENABLE_TESTABILITY = YES; + ENABLE_USER_SCRIPT_SANDBOXING = NO; + GCC_C_LANGUAGE_STANDARD = gnu99; + GCC_DYNAMIC_NO_PIC = NO; + GCC_NO_COMMON_BLOCKS = YES; + GCC_OPTIMIZATION_LEVEL = 0; + GCC_PREPROCESSOR_DEFINITIONS = ( + "DEBUG=1", + "$(inherited)", + ); + GCC_WARN_64_TO_32_BIT_CONVERSION = YES; + GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; + GCC_WARN_UNDECLARED_SELECTOR = YES; + GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; + GCC_WARN_UNUSED_FUNCTION = YES; + GCC_WARN_UNUSED_VARIABLE = YES; + IPHONEOS_DEPLOYMENT_TARGET = 12.0; + MTL_ENABLE_DEBUG_INFO = YES; + ONLY_ACTIVE_ARCH = YES; + SDKROOT = iphoneos; + TARGETED_DEVICE_FAMILY = "1,2"; + }; + name = Debug; + }; + 97C147041CF9000F007C117D /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + ALWAYS_SEARCH_USER_PATHS = NO; + ASSETCATALOG_COMPILER_GENERATE_SWIFT_ASSET_SYMBOL_EXTENSIONS = AppIcon; + CLANG_ANALYZER_NONNULL = YES; + CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; + CLANG_CXX_LIBRARY = "libc++"; + CLANG_ENABLE_MODULES = YES; + CLANG_ENABLE_OBJC_ARC = YES; + CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; + CLANG_WARN_BOOL_CONVERSION = YES; + CLANG_WARN_COMMA = YES; + CLANG_WARN_CONSTANT_CONVERSION = YES; + CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; + CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; + CLANG_WARN_EMPTY_BODY = YES; + CLANG_WARN_ENUM_CONVERSION = YES; + CLANG_WARN_INFINITE_RECURSION = YES; + CLANG_WARN_INT_CONVERSION = YES; + CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; + CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; + CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; + CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; + CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; + CLANG_WARN_STRICT_PROTOTYPES = YES; + CLANG_WARN_SUSPICIOUS_MOVE = YES; + CLANG_WARN_UNREACHABLE_CODE = YES; + CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; + "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; + COPY_PHASE_STRIP = NO; + DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; + ENABLE_NS_ASSERTIONS = NO; + ENABLE_STRICT_OBJC_MSGSEND = YES; + ENABLE_USER_SCRIPT_SANDBOXING = NO; + GCC_C_LANGUAGE_STANDARD = gnu99; + GCC_NO_COMMON_BLOCKS = YES; + GCC_WARN_64_TO_32_BIT_CONVERSION = YES; + GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; + GCC_WARN_UNDECLARED_SELECTOR = YES; + GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; + GCC_WARN_UNUSED_FUNCTION = YES; + GCC_WARN_UNUSED_VARIABLE = YES; + IPHONEOS_DEPLOYMENT_TARGET = 12.0; + MTL_ENABLE_DEBUG_INFO = NO; + SDKROOT = iphoneos; + SUPPORTED_PLATFORMS = iphoneos; + SWIFT_COMPILATION_MODE = wholemodule; + SWIFT_OPTIMIZATION_LEVEL = "-O"; + TARGETED_DEVICE_FAMILY = "1,2"; + VALIDATE_PRODUCT = YES; + }; + name = Release; + }; + 97C147061CF9000F007C117D /* Debug */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = 9740EEB21CF90195004384FC /* Debug.xcconfig */; + buildSettings = { + ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; + CLANG_ENABLE_MODULES = YES; + CURRENT_PROJECT_VERSION = "$(FLUTTER_BUILD_NUMBER)"; + DEVELOPMENT_TEAM = 63CVT8G5P8; + ENABLE_BITCODE = NO; + INFOPLIST_FILE = Runner/Info.plist; + LD_RUNPATH_SEARCH_PATHS = ( + "$(inherited)", + "@executable_path/Frameworks", + ); + PRODUCT_BUNDLE_IDENTIFIER = com.example.serviceIntaleq; + PRODUCT_NAME = "$(TARGET_NAME)"; + SWIFT_OBJC_BRIDGING_HEADER = "Runner/Runner-Bridging-Header.h"; + SWIFT_OPTIMIZATION_LEVEL = "-Onone"; + SWIFT_VERSION = 5.0; + VERSIONING_SYSTEM = "apple-generic"; + }; + name = Debug; + }; + 97C147071CF9000F007C117D /* Release */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = 7AFA3C8E1D35360C0083082E /* Release.xcconfig */; + buildSettings = { + ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; + CLANG_ENABLE_MODULES = YES; + CURRENT_PROJECT_VERSION = "$(FLUTTER_BUILD_NUMBER)"; + DEVELOPMENT_TEAM = 63CVT8G5P8; + ENABLE_BITCODE = NO; + INFOPLIST_FILE = Runner/Info.plist; + LD_RUNPATH_SEARCH_PATHS = ( + "$(inherited)", + "@executable_path/Frameworks", + ); + PRODUCT_BUNDLE_IDENTIFIER = com.example.serviceIntaleq; + PRODUCT_NAME = "$(TARGET_NAME)"; + SWIFT_OBJC_BRIDGING_HEADER = "Runner/Runner-Bridging-Header.h"; + SWIFT_VERSION = 5.0; + VERSIONING_SYSTEM = "apple-generic"; + }; + name = Release; + }; +/* End XCBuildConfiguration section */ + +/* Begin XCConfigurationList section */ + 331C8087294A63A400263BE5 /* Build configuration list for PBXNativeTarget "RunnerTests" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 331C8088294A63A400263BE5 /* Debug */, + 331C8089294A63A400263BE5 /* Release */, + 331C808A294A63A400263BE5 /* Profile */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; + 97C146E91CF9000F007C117D /* Build configuration list for PBXProject "Runner" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 97C147031CF9000F007C117D /* Debug */, + 97C147041CF9000F007C117D /* Release */, + 249021D3217E4FDB00AE95B9 /* Profile */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; + 97C147051CF9000F007C117D /* Build configuration list for PBXNativeTarget "Runner" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 97C147061CF9000F007C117D /* Debug */, + 97C147071CF9000F007C117D /* Release */, + 249021D4217E4FDB00AE95B9 /* Profile */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; +/* End XCConfigurationList section */ + }; + rootObject = 97C146E61CF9000F007C117D /* Project object */; +} diff --git a/siro_service/ios/Runner.xcodeproj/project.xcworkspace/contents.xcworkspacedata b/siro_service/ios/Runner.xcodeproj/project.xcworkspace/contents.xcworkspacedata new file mode 100644 index 0000000..919434a --- /dev/null +++ b/siro_service/ios/Runner.xcodeproj/project.xcworkspace/contents.xcworkspacedata @@ -0,0 +1,7 @@ + + + + + diff --git a/siro_service/ios/Runner.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist b/siro_service/ios/Runner.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist new file mode 100644 index 0000000..18d9810 --- /dev/null +++ b/siro_service/ios/Runner.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist @@ -0,0 +1,8 @@ + + + + + IDEDidComputeMac32BitWarning + + + diff --git a/siro_service/ios/Runner.xcodeproj/project.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings b/siro_service/ios/Runner.xcodeproj/project.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings new file mode 100644 index 0000000..f9b0d7c --- /dev/null +++ b/siro_service/ios/Runner.xcodeproj/project.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings @@ -0,0 +1,8 @@ + + + + + PreviewsEnabled + + + diff --git a/siro_service/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme b/siro_service/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme new file mode 100644 index 0000000..e3773d4 --- /dev/null +++ b/siro_service/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme @@ -0,0 +1,101 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/siro_service/ios/Runner.xcworkspace/contents.xcworkspacedata b/siro_service/ios/Runner.xcworkspace/contents.xcworkspacedata new file mode 100644 index 0000000..21a3cc1 --- /dev/null +++ b/siro_service/ios/Runner.xcworkspace/contents.xcworkspacedata @@ -0,0 +1,10 @@ + + + + + + + diff --git a/siro_service/ios/Runner.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist b/siro_service/ios/Runner.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist new file mode 100644 index 0000000..18d9810 --- /dev/null +++ b/siro_service/ios/Runner.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist @@ -0,0 +1,8 @@ + + + + + IDEDidComputeMac32BitWarning + + + diff --git a/siro_service/ios/Runner.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings b/siro_service/ios/Runner.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings new file mode 100644 index 0000000..f9b0d7c --- /dev/null +++ b/siro_service/ios/Runner.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings @@ -0,0 +1,8 @@ + + + + + PreviewsEnabled + + + diff --git a/siro_service/ios/Runner/AppDelegate.swift b/siro_service/ios/Runner/AppDelegate.swift new file mode 100644 index 0000000..4da40aa --- /dev/null +++ b/siro_service/ios/Runner/AppDelegate.swift @@ -0,0 +1,32 @@ +import Flutter +import UIKit + +@main +@objc class AppDelegate: FlutterAppDelegate { + override func application( + _ application: UIApplication, + didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]? + ) -> Bool { + let controller : FlutterViewController = window?.rootViewController as! FlutterViewController + let securityChannel = FlutterMethodChannel(name: "com.siro.siro_service/security", + binaryMessenger: controller.binaryMessenger) + + securityChannel.setMethodCallHandler({ + (call: FlutterMethodCall, result: @escaping FlutterResult) -> Void in + if (call.method == "getAppSignature") { + // For iOS, we use a high-entropy secure token (Shared Secret) + // that matches the one stored on the server environment. + result("b9d8e7f1a2c3d4e5f607182930415263748596a7b8c9d0e1f2a3b4c5d6e7f809") + } else if (call.method == "isNativeRooted") { + // Basic check for iOS jailbreak can be added here if needed + result(false) + } else { + result(FlutterMethodNotImplemented) + } + }) + + GeneratedPluginRegistrant.register(with: self) + return super.application(application, didFinishLaunchingWithOptions: launchOptions) + } +} + diff --git a/siro_service/ios/Runner/Assets.xcassets/AppIcon.appiconset/Contents.json b/siro_service/ios/Runner/Assets.xcassets/AppIcon.appiconset/Contents.json new file mode 100644 index 0000000..d0d98aa --- /dev/null +++ b/siro_service/ios/Runner/Assets.xcassets/AppIcon.appiconset/Contents.json @@ -0,0 +1 @@ +{"images":[{"size":"20x20","idiom":"iphone","filename":"Icon-App-20x20@2x.png","scale":"2x"},{"size":"20x20","idiom":"iphone","filename":"Icon-App-20x20@3x.png","scale":"3x"},{"size":"29x29","idiom":"iphone","filename":"Icon-App-29x29@1x.png","scale":"1x"},{"size":"29x29","idiom":"iphone","filename":"Icon-App-29x29@2x.png","scale":"2x"},{"size":"29x29","idiom":"iphone","filename":"Icon-App-29x29@3x.png","scale":"3x"},{"size":"40x40","idiom":"iphone","filename":"Icon-App-40x40@2x.png","scale":"2x"},{"size":"40x40","idiom":"iphone","filename":"Icon-App-40x40@3x.png","scale":"3x"},{"size":"57x57","idiom":"iphone","filename":"Icon-App-57x57@1x.png","scale":"1x"},{"size":"57x57","idiom":"iphone","filename":"Icon-App-57x57@2x.png","scale":"2x"},{"size":"60x60","idiom":"iphone","filename":"Icon-App-60x60@2x.png","scale":"2x"},{"size":"60x60","idiom":"iphone","filename":"Icon-App-60x60@3x.png","scale":"3x"},{"size":"20x20","idiom":"ipad","filename":"Icon-App-20x20@1x.png","scale":"1x"},{"size":"20x20","idiom":"ipad","filename":"Icon-App-20x20@2x.png","scale":"2x"},{"size":"29x29","idiom":"ipad","filename":"Icon-App-29x29@1x.png","scale":"1x"},{"size":"29x29","idiom":"ipad","filename":"Icon-App-29x29@2x.png","scale":"2x"},{"size":"40x40","idiom":"ipad","filename":"Icon-App-40x40@1x.png","scale":"1x"},{"size":"40x40","idiom":"ipad","filename":"Icon-App-40x40@2x.png","scale":"2x"},{"size":"50x50","idiom":"ipad","filename":"Icon-App-50x50@1x.png","scale":"1x"},{"size":"50x50","idiom":"ipad","filename":"Icon-App-50x50@2x.png","scale":"2x"},{"size":"72x72","idiom":"ipad","filename":"Icon-App-72x72@1x.png","scale":"1x"},{"size":"72x72","idiom":"ipad","filename":"Icon-App-72x72@2x.png","scale":"2x"},{"size":"76x76","idiom":"ipad","filename":"Icon-App-76x76@1x.png","scale":"1x"},{"size":"76x76","idiom":"ipad","filename":"Icon-App-76x76@2x.png","scale":"2x"},{"size":"83.5x83.5","idiom":"ipad","filename":"Icon-App-83.5x83.5@2x.png","scale":"2x"},{"size":"1024x1024","idiom":"ios-marketing","filename":"Icon-App-1024x1024@1x.png","scale":"1x"}],"info":{"version":1,"author":"xcode"}} \ No newline at end of file diff --git a/siro_service/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-1024x1024@1x.png b/siro_service/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-1024x1024@1x.png new file mode 100644 index 0000000..1201d04 Binary files /dev/null and b/siro_service/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-1024x1024@1x.png differ diff --git a/siro_service/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@1x.png b/siro_service/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@1x.png new file mode 100644 index 0000000..326d36f Binary files /dev/null and b/siro_service/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@1x.png differ diff --git a/siro_service/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@2x.png b/siro_service/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@2x.png new file mode 100644 index 0000000..d5ed1cb Binary files /dev/null and b/siro_service/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@2x.png differ diff --git a/siro_service/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@3x.png b/siro_service/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@3x.png new file mode 100644 index 0000000..3d62031 Binary files /dev/null and b/siro_service/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@3x.png differ diff --git a/siro_service/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@1x.png b/siro_service/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@1x.png new file mode 100644 index 0000000..ba732d9 Binary files /dev/null and b/siro_service/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@1x.png differ diff --git a/siro_service/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@2x.png b/siro_service/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@2x.png new file mode 100644 index 0000000..6322e5f Binary files /dev/null and b/siro_service/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@2x.png differ diff --git a/siro_service/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@3x.png b/siro_service/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@3x.png new file mode 100644 index 0000000..8d51586 Binary files /dev/null and b/siro_service/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@3x.png differ diff --git a/siro_service/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@1x.png b/siro_service/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@1x.png new file mode 100644 index 0000000..d5ed1cb Binary files /dev/null and b/siro_service/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@1x.png differ diff --git a/siro_service/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@2x.png b/siro_service/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@2x.png new file mode 100644 index 0000000..22ac691 Binary files /dev/null and b/siro_service/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@2x.png differ diff --git a/siro_service/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@3x.png b/siro_service/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@3x.png new file mode 100644 index 0000000..e3bf61f Binary files /dev/null and b/siro_service/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@3x.png differ diff --git a/siro_service/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-50x50@1x.png b/siro_service/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-50x50@1x.png new file mode 100644 index 0000000..7bb31e5 Binary files /dev/null and b/siro_service/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-50x50@1x.png differ diff --git a/siro_service/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-50x50@2x.png b/siro_service/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-50x50@2x.png new file mode 100644 index 0000000..ef1c465 Binary files /dev/null and b/siro_service/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-50x50@2x.png differ diff --git a/siro_service/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-57x57@1x.png b/siro_service/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-57x57@1x.png new file mode 100644 index 0000000..57fddd5 Binary files /dev/null and b/siro_service/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-57x57@1x.png differ diff --git a/siro_service/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-57x57@2x.png b/siro_service/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-57x57@2x.png new file mode 100644 index 0000000..33cc738 Binary files /dev/null and b/siro_service/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-57x57@2x.png differ diff --git a/siro_service/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@2x.png b/siro_service/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@2x.png new file mode 100644 index 0000000..e3bf61f Binary files /dev/null and b/siro_service/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@2x.png differ diff --git a/siro_service/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@3x.png b/siro_service/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@3x.png new file mode 100644 index 0000000..4f37147 Binary files /dev/null and b/siro_service/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@3x.png differ diff --git a/siro_service/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-72x72@1x.png b/siro_service/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-72x72@1x.png new file mode 100644 index 0000000..d74d5a3 Binary files /dev/null and b/siro_service/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-72x72@1x.png differ diff --git a/siro_service/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-72x72@2x.png b/siro_service/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-72x72@2x.png new file mode 100644 index 0000000..808c654 Binary files /dev/null and b/siro_service/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-72x72@2x.png differ diff --git a/siro_service/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-76x76@1x.png b/siro_service/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-76x76@1x.png new file mode 100644 index 0000000..53baaf3 Binary files /dev/null and b/siro_service/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-76x76@1x.png differ diff --git a/siro_service/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-76x76@2x.png b/siro_service/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-76x76@2x.png new file mode 100644 index 0000000..f5b588d Binary files /dev/null and b/siro_service/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-76x76@2x.png differ diff --git a/siro_service/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-83.5x83.5@2x.png b/siro_service/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-83.5x83.5@2x.png new file mode 100644 index 0000000..06c88a1 Binary files /dev/null and b/siro_service/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-83.5x83.5@2x.png differ diff --git a/siro_service/ios/Runner/Assets.xcassets/LaunchImage.imageset/Contents.json b/siro_service/ios/Runner/Assets.xcassets/LaunchImage.imageset/Contents.json new file mode 100644 index 0000000..0bedcf2 --- /dev/null +++ b/siro_service/ios/Runner/Assets.xcassets/LaunchImage.imageset/Contents.json @@ -0,0 +1,23 @@ +{ + "images" : [ + { + "idiom" : "universal", + "filename" : "LaunchImage.png", + "scale" : "1x" + }, + { + "idiom" : "universal", + "filename" : "LaunchImage@2x.png", + "scale" : "2x" + }, + { + "idiom" : "universal", + "filename" : "LaunchImage@3x.png", + "scale" : "3x" + } + ], + "info" : { + "version" : 1, + "author" : "xcode" + } +} diff --git a/siro_service/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage.png b/siro_service/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage.png new file mode 100644 index 0000000..9da19ea Binary files /dev/null and b/siro_service/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage.png differ diff --git a/siro_service/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage@2x.png b/siro_service/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage@2x.png new file mode 100644 index 0000000..9da19ea Binary files /dev/null and b/siro_service/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage@2x.png differ diff --git a/siro_service/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage@3x.png b/siro_service/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage@3x.png new file mode 100644 index 0000000..9da19ea Binary files /dev/null and b/siro_service/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage@3x.png differ diff --git a/siro_service/ios/Runner/Assets.xcassets/LaunchImage.imageset/README.md b/siro_service/ios/Runner/Assets.xcassets/LaunchImage.imageset/README.md new file mode 100644 index 0000000..89c2725 --- /dev/null +++ b/siro_service/ios/Runner/Assets.xcassets/LaunchImage.imageset/README.md @@ -0,0 +1,5 @@ +# Launch Screen Assets + +You can customize the launch screen with your own desired assets by replacing the image files in this directory. + +You can also do it by opening your Flutter project's Xcode project with `open ios/Runner.xcworkspace`, selecting `Runner/Assets.xcassets` in the Project Navigator and dropping in the desired images. \ No newline at end of file diff --git a/siro_service/ios/Runner/Base.lproj/LaunchScreen.storyboard b/siro_service/ios/Runner/Base.lproj/LaunchScreen.storyboard new file mode 100644 index 0000000..f2e259c --- /dev/null +++ b/siro_service/ios/Runner/Base.lproj/LaunchScreen.storyboard @@ -0,0 +1,37 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/siro_service/ios/Runner/Base.lproj/Main.storyboard b/siro_service/ios/Runner/Base.lproj/Main.storyboard new file mode 100644 index 0000000..f3c2851 --- /dev/null +++ b/siro_service/ios/Runner/Base.lproj/Main.storyboard @@ -0,0 +1,26 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/siro_service/ios/Runner/GoogleService-Info.plist b/siro_service/ios/Runner/GoogleService-Info.plist new file mode 100644 index 0000000..0504160 --- /dev/null +++ b/siro_service/ios/Runner/GoogleService-Info.plist @@ -0,0 +1,30 @@ + + + + + API_KEY + AIzaSyDk6x6KZUY0IQtxoCMXX0F7N_yik8O19eA + GCM_SENDER_ID + 825988584191 + PLIST_VERSION + 1 + BUNDLE_ID + com.siro.service + PROJECT_ID + siro-a6957 + STORAGE_BUCKET + siro-a6957.firebasestorage.app + IS_ADS_ENABLED + + IS_ANALYTICS_ENABLED + + IS_APPINVITE_ENABLED + + IS_GCM_ENABLED + + IS_SIGNIN_ENABLED + + GOOGLE_APP_ID + 1:825988584191:ios:9d50158dc7a09e851632ca + + \ No newline at end of file diff --git a/siro_service/ios/Runner/Info.plist b/siro_service/ios/Runner/Info.plist new file mode 100644 index 0000000..5f2142e --- /dev/null +++ b/siro_service/ios/Runner/Info.plist @@ -0,0 +1,49 @@ + + + + + CFBundleDevelopmentRegion + $(DEVELOPMENT_LANGUAGE) + CFBundleDisplayName + Siro Service + CFBundleExecutable + $(EXECUTABLE_NAME) + CFBundleIdentifier + $(PRODUCT_BUNDLE_IDENTIFIER) + CFBundleInfoDictionaryVersion + 6.0 + CFBundleName + siro_service + CFBundlePackageType + APPL + CFBundleShortVersionString + $(FLUTTER_BUILD_NAME) + CFBundleSignature + ???? + CFBundleVersion + $(FLUTTER_BUILD_NUMBER) + LSRequiresIPhoneOS + + UILaunchStoryboardName + LaunchScreen + UIMainStoryboardFile + Main + UISupportedInterfaceOrientations + + UIInterfaceOrientationPortrait + UIInterfaceOrientationLandscapeLeft + UIInterfaceOrientationLandscapeRight + + UISupportedInterfaceOrientations~ipad + + UIInterfaceOrientationPortrait + UIInterfaceOrientationPortraitUpsideDown + UIInterfaceOrientationLandscapeLeft + UIInterfaceOrientationLandscapeRight + + CADisableMinimumFrameDurationOnPhone + + UIApplicationSupportsIndirectInputEvents + + + diff --git a/siro_service/ios/Runner/Runner-Bridging-Header.h b/siro_service/ios/Runner/Runner-Bridging-Header.h new file mode 100644 index 0000000..308a2a5 --- /dev/null +++ b/siro_service/ios/Runner/Runner-Bridging-Header.h @@ -0,0 +1 @@ +#import "GeneratedPluginRegistrant.h" diff --git a/siro_service/ios/RunnerTests/RunnerTests.swift b/siro_service/ios/RunnerTests/RunnerTests.swift new file mode 100644 index 0000000..86a7c3b --- /dev/null +++ b/siro_service/ios/RunnerTests/RunnerTests.swift @@ -0,0 +1,12 @@ +import Flutter +import UIKit +import XCTest + +class RunnerTests: XCTestCase { + + func testExample() { + // If you add code to the Runner application, consider adding tests here. + // See https://developer.apple.com/documentation/xctest for more information about using XCTest. + } + +} diff --git a/siro_service/lib/constant/api_key.dart b/siro_service/lib/constant/api_key.dart new file mode 100644 index 0000000..7603d84 --- /dev/null +++ b/siro_service/lib/constant/api_key.dart @@ -0,0 +1,27 @@ +import 'package:secure_string_operations/secure_string_operations.dart'; + +import '../env/env.dart'; +import 'char_map.dart'; + +class AK { + static final String basicAuthCredentials = + X.r(X.r(X.r(Env.basicAuthCredentials, cn), cC), cs); + static final String visionApi = X.r(X.r(X.r(Env.visionApi, cn), cC), cs); + static final String smsPasswordEgypt = + X.r(X.r(X.r(Env.smsPasswordEgypt, cn), cC), cs); + static final String ocpApimSubscriptionKey = Env.ocpApimSubscriptionKey; + static final String anthropicAIkeySeferNew = + X.r(X.r(X.r(Env.anthropicAIkeySeferNew, cn), cC), cs); + static final String anthropicAIkeySeferNewHamzaayedpython = + X.r(X.r(X.r(Env.anthropicAIkeySeferNewHamzaayedpython, cn), cC), cs); + static final String emailService = (Env.emailService); + static final String allowed = Env.allowed; + static final String passnpassenger = X + .r(X.r(X.r(Env.passnpassenger, cn), cC), cs) + .toString() + .split(Env.addd)[0]; + static final String newId = Env.newId; + +/////////// + static final String keyOfApp = X.r(X.r(X.r(Env.keyOfApp, cn), cC), cs); +} diff --git a/siro_service/lib/constant/box_name.dart b/siro_service/lib/constant/box_name.dart new file mode 100644 index 0000000..a2c9c6b --- /dev/null +++ b/siro_service/lib/constant/box_name.dart @@ -0,0 +1,98 @@ +class BoxName { + static const String driverID = "driverID"; + static const String countryCode = "countryCode"; + static const String googlaMapApp = "googlaMapApp"; + static const String keyOfApp = 'keyOfApp'; + static const String initializationVector = 'initializationVector'; + static const String firstTimeLoadKey = 'firstTimeLoadKey'; + static const String jwt = "jwt"; + static const String fingerPrint = "fingerPrint"; + static const String deviceFingerprint = "deviceFingerprint"; + static const String hmac = "hmac"; + + + static const String payMobApikey = "payMobApikey"; + static const String employeename = "employeename"; + static const String refreshToken = "refreshToken"; + static const String tokenParent = "tokenParent"; + static const String lang = "lang"; + static const String gender = "gender"; + static const String serverChosen = "serverChosen"; + static const String carType = "carType"; + static const String carPlate = "carPlate"; + static const String isVerified = '0'; + static const String statusDriverLocation = "statusDriverLocation"; + static const String password = "password"; + static const String arrivalTime = "arrivalTime"; + static const String passwordDriver = "passwordDriver"; + static const String agreeTerms = "agreeTerms"; + static const String addWork = 'addWork'; + static const String addHome = 'addHome'; + static const String tipPercentage = 'tipPercentage'; + static const String accountIdStripeConnect = "accountIdStripeConnect"; + static const String faceDetectTimes = "faceDetectTimes"; + static const String sosPhonePassenger = "sosPhonePassenger"; + static const String sosPhoneDriver = "sosPhoneDriver"; + static const String passengerID = "pasengerID"; + static const String phone = "phone"; + static const String phoneDriver = "phoneDriver"; + static const String dobDriver = "dobDriver"; + static const String sexDriver = "sexDriver"; + static const String lastNameDriver = "lastNameDriver"; + static const String name = "name"; + static const String locationPermission = "locationPermission"; + static const String nameDriver = "nameDriver"; + static const String driverPhotoUrl = "driverPhotoUrl"; + static const String passengerPhotoUrl = "passengerPhotoUrl"; + static const String email = "email"; + static const String emailDriver = "emailDriver"; + static const String tokens = "tokens"; + static const String tokenFCM = "tokenFCM"; + static const String tokenDriver = "tokenDriver"; + static const String cardNumber = "cardNumber"; + static const String cardNumberDriver = "cardNumberDriver"; + static const String cardHolderName = "cardHolderName"; + static const String cardHolderNameDriver = "cardHolderNameDriver"; + static const String expiryDate = "expiryDate"; + static const String expiryDateDriver = "expiryDateDriver"; + static const String cvvCode = "cvvCode"; + static const String cvvCodeDriver = "cvvCodeDriver"; + static const String passengerWalletDetails = "passengerWalletDetails"; + static const String passengerWalletTotal = "passengerWalletTotal"; + static const String passengerWalletFound = "passengerWalletFound"; + static const String periods = 'periods'; + static const String onBoarding = 'onBoarding'; + static const String stripePublishableKey = 'stripe_publishableKe'; + static const String apiKeyRun = 'apiKeyRun'; + static const String serverAPI = 'serverAPI'; + static const String secretKey = 'secretKey'; + static const String basicAuthCredentials = 'basicAuthCredentials'; + static const String mapAPIKEY = 'mapAPIKEY'; + static const String twilloRecoveryCode = 'twilloRecoveryCode'; + static const String accountSIDTwillo = 'accountSIDTwillo'; + static const String authTokenTwillo = 'authTokenTwillo'; + static const String chatGPTkey = 'chatGPTkey'; + static const String chatGPTkeySefer = 'chatGPTkeySefer'; + static const String transactionCloude = 'transactionCloude'; + static const String visionApi = 'visionApi'; + static const String vin = "vin"; + static const String isvibrate = "isvibrate"; + static const String make = "make"; + static const String model = "model"; + static const String year = "year"; + static const String expirationDate = "expirationDate"; + static const String color = "color"; + static const String owner = "owner"; + static const String registrationDate = "registrationDate"; + static const String recentLocations = 'recentLocations'; + static const String tripData = 'tripData'; + static const String parentTripSelected = 'parentTripSelected'; +} + +class Service { + static const String driverPass = 'MG6DEJZSczBT6Rx0jOlehQ=='; + static const String payMobApikey = 'payMobApikey'; + static const String initializationVector = 'initializationVector'; + static const String keyOfApp = 'keyOfApp'; + static const String FCM_PRIVATE_KEY = 'FCM_PRIVATE_KEY'; +} diff --git a/siro_service/lib/constant/char_map.dart b/siro_service/lib/constant/char_map.dart new file mode 100644 index 0000000..d6a6ee7 --- /dev/null +++ b/siro_service/lib/constant/char_map.dart @@ -0,0 +1,68 @@ +Map cn = { + "0": "3", + "1": "7", + "2": "1", + "3": "9", + "4": "0", + "5": "5", + "6": "2", + "7": "6", + "8": "4", + "9": "8" +}; +Map cs = { + "a": "q", + "b": "x", + "c": "f", + "d": "y", + "e": "j", + "f": "u", + "g": "k", + "h": "w", + "i": "o", + "j": "e", + "k": "g", + "l": "r", + "m": "n", + "n": "b", + "o": "i", + "p": "v", + "q": "a", + "r": "l", + "s": "z", + "t": "c", + "u": "h", + "v": "p", + "w": "t", + "x": "d", + "y": "s", + "z": "m" +}; +Map cC = { + "A": "Q", + "B": "X", + "C": "F", + "D": "Y", + "E": "J", + "F": "U", + "G": "K", + "H": "W", + "I": "O", + "J": "E", + "K": "G", + "L": "R", + "M": "N", + "N": "B", + "O": "I", + "P": "V", + "Q": "A", + "R": "L", + "S": "Z", + "T": "C", + "U": "H", + "V": "P", + "W": "T", + "X": "D", + "Y": "S", + "Z": "M" +}; diff --git a/siro_service/lib/constant/colors.dart b/siro_service/lib/constant/colors.dart new file mode 100644 index 0000000..5200e6d --- /dev/null +++ b/siro_service/lib/constant/colors.dart @@ -0,0 +1,25 @@ +import 'package:flutter/material.dart'; + +class AppColor { + static const Color primaryColor = Color(0xFF2563EB); // Modern Blue + static const Color primaryLight = Color(0xFFDBEAFE); + static const Color writeColor = Color(0xFF1E293B); // Darker Slate + static const Color surfaceColor = Color(0xFFF8FAFC); + + static const Color bronze = Color(0xFFCD7F32); + static const Color goldenBronze = Color(0xFFB87333); + static const Color gold = Color(0xFFD4AF37); + + static const Color secondaryColor = Colors.white; + static const Color accentColor = Color(0xFF64748B); // Slate Grey + static const Color greyColor = Color(0xFF94A3B8); + + static const Color redColor = Color(0xFFEF4444); + static const Color greenColor = Color(0xFF10B981); + static const Color blueColor = Color(0xFF3B82F6); + static const Color yellowColor = Color(0xFFF59E0B); + + static Color deepPurpleAccent = const Color(0xFF7C3AED); + static Color glassEffect = Colors.white.withOpacity(0.1); +} + diff --git a/siro_service/lib/constant/credential.dart b/siro_service/lib/constant/credential.dart new file mode 100644 index 0000000..af396f3 --- /dev/null +++ b/siro_service/lib/constant/credential.dart @@ -0,0 +1,141 @@ +import 'dart:convert'; +import 'package:crypto/crypto.dart'; + +import '../main.dart'; +import 'box_name.dart'; + +class AC { + gAK() async { + if (box.read(BoxName.apiKeyRun).toString() != 'run') { + // var res = await CRUD().get(link: AppLink.getApiKey, payload: {}); + // var decod = jsonDecode(res); + // print(decod); + // Map jsonData = {}; + // for (var i = 0; i < decod['message'].length; i++) { + // String h = decod['message'][i]['hashed_key'].toString(); + // String retrievedString = r(r(r(h, cn), cC), cs); + + // await storage.write( + // key: decod['message'][i]['name'].toString(), + // value: retrievedString.toString(), + // ); + // // + // String name = decod['message'][i]['name'].toString(); + // String value = decod['message'][i]['hashed_key'].toString(); + + // jsonData[name] = value; + // } + // String jsonString = json.encode(jsonData); + // print(jsonString); + // box.write(BoxName.apiKeyRun, 'run'); + } + } + + String q(String b, String c) { + final d = utf8.encode(c); + final e = utf8.encode(b); + + final f = Hmac(sha256, d); + final g = f.convert(e); + + final h = g.bytes; + final i = base64Url.encode(h); + return i; + } + + String j(String k, String l) { + final m = utf8.encode(l); + final n = base64Url.decode(k); + + final o = Hmac(sha256, m); + final p = o.convert(n); + + final q = utf8.decode(p.bytes); + return q; + } + + String a(String b, String c) { + int d = b.length; + int e = d ~/ 4; + + List f = []; + for (int g = 0; g < d; g += e) { + int h = g + e; + if (h > d) { + h = d; + } + String i = b.substring(g, h); + f.add(i); + } + + print(f); + Map j = {}; + j['birinci'] = f[4]; + j['ikinci'] = f[2]; + j['üçüncü'] = c + f[1]; + j['dördüncü'] = f[0]; + j['beş'] = f[3]; + + String k = ''; + j.forEach((l, m) { + k += m; + }); + + return k; + } + + Map n(String o, String c) { + String p = o.replaceAll(c, ''); + + Map q = {}; + q['birinci'] = p[p.length - 5] + p[p.length - 3]; + q['ikinci'] = p[p.length - 1] + p[p.length - 15]; + q['üçüncü'] = p[p.length - 9] + p[p.length - 12]; + q['dördüncü'] = p[p.length - 11] + p[p.length - 6]; + q['beş'] = p[p.length - 2] + p[p.length - 8]; + + return q; + } + + String c(String a, Map b) { + StringBuffer c = StringBuffer(); + c.write(a); + + String d = "Bl"; + c.write(b[d] ?? d); + + StringBuffer e = StringBuffer(); + String f = c.toString(); + + for (int g = 0; g < f.length; g++) { + String h = f[g]; + e.write(b[h] ?? h); + } + + return e.toString(); + } + + String r(String a, Map b) { + StringBuffer c = StringBuffer(); + String d = "Bl"; + int e = d.length; + + for (int f = 0; f < a.length; f++) { + String g = a[f]; + String h = b.keys.firstWhere( + (i) => b[i] == g, + orElse: () => g, + ); + + c.write(h); + } + + String j = c.toString(); + + if (j.endsWith(d)) { + j = j.substring(0, j.length - e); + } + + return j; + } +} diff --git a/siro_service/lib/constant/info.dart b/siro_service/lib/constant/info.dart new file mode 100644 index 0000000..b1d2f97 --- /dev/null +++ b/siro_service/lib/constant/info.dart @@ -0,0 +1,4471 @@ +class AppInformation { + static const String companyName = 'Mobile-App'; + static const String appName = 'SEFER'; + static const String phoneNumber = '962798583052'; + static const String linkedInProfile = + 'https://www.linkedin.com/in/hamza-ayed/'; + static const String website = 'https://mobile-app.store'; + static const String email = 'hamzaayed@mobile-app.store'; + static const String complaintPrompt = + 'for this data for complaint from driver or passenger i collect all data i want you analyze this complaint and show what is reason and what is solution .this data collected from many table to find solution if payment in visa not complete and if ride status is finished it will be paymnet in payment table if ride status is not finished there is no need to pay and payment table is null for this ride and if paymentFromPaymentTable not null and visa type not cash the payment sucssessed . if ratingpassenger is low or passengr rating drivers low grade then dont mine of this passenger ,look at driver too like passengerratingdriver with rating or ratingtopassenger .in json add status of complaint and message to passenger and message to driver and message to call center write in arabic in json output with key in english .for output please just json i want'; + static const String addd = 'BlBlNl'; + + static const String privacyPolicy = ''' + + + + + + + + + + + + +
+
+
+
+
+
+

Terms and Conditions

+

1 TERMS OF USE

+

By downloading, browsing, accessing or using the Mobile Application; “Sefer”, Users agree to be bound by these Terms and Conditions of Use. We reserve the right to amend these terms and conditions at any time. If the User disagrees with any of these Terms and Conditions of Use, the User must immediately discontinue their access to the Mobile Application and their use of the services offered on the Mobile Application. Continued use of the Mobile Application will constitute acceptance of these Terms and Conditions of Use, as may be amended from time to time.

+

2.1. DEFINITIONS

+

In these Terms and Conditions of Use, the following capitalized terms shall have the following meanings, except where the context otherwise requires:

+

“Mobile Application” or “Sefer” refers to the smartphone software through which the company mediates services between Users and Service Providers.

+

"Account" means an account created by a User or a Service Provider on the Mobile Application as part of Registration.

+

“Service Providers” refers to the individuals or companies registered within the Company to provide products or services approved and mediated by the Company/Mobile Application and that are requested/purchased by “Users”. “Service Provider” means any one of them.

+

"Users" means users of the Mobile Application, including you and "User" means any one of them. “Users” also includes Service Providers using the Mobile Application version dedicated to the use of Service Providers.

+

"Privacy Policy" means the privacy policy set out in Clause 14 of these Terms and Conditions of Use.

+

"Redeem" means to redeem a company’s products or services on these Terms and Conditions of Use and

+

"Redemption" means the act of redeeming such products or services.

+

"Register" means to create an Account on the Mobile Application and "Registration" means the act of creating such an Account.

+

"Services" means all the services provided by Service Providers via the Mobile Application and mediated by the Company to Users, and "Service" means any one of them.

+

2.2. WHAT IS THE MOBILE APPLICATION, “Sefer”?

+

The “Sefer” Mobile Application consists in a specialize service with the purpose to schedule/match the Service Provider with the User, however without creating any employee relationship with the Service Provider, meaning that the Mobile Application should be considered only as a service mediator with the purpose of scheduling/matching between Users and Service Providers for the latter to fulfill the service requested by Users. Through the system, the Company allows, totally free of charge, the Users to sign up and request the desired available services from Service Providers in a more efficient way than the conventional existing methods. The Service Providers, by their means, can register on the Mobile Application dedicated for Service Providers through the methods indicated by the Company, pending an evaluation from the Company and the necessary documentation when signing up in accordance with guidelines set by the Transportation General Authority (TGA) to provide services through the Mobile Application. The Service Provider will pay a profit margin fee determined by the Company -in knowledge of the Service Provider- per completed service. Users can pay their ride fare using Apple Pay as an additional payment method in Saudi Arabia on iPhones

+

+

3. GENERAL ISSUES ABOUT THE MOBILE APPLICATION AND THE SERVICES

+

3.1 Applicability of terms and conditions: The use of any Services and/or the Mobile Application and the making of any Redemptions are subject to these Terms and Conditions of Use.

+

3.2 Location: The Mobile Application, the Services and any Redemptions are intended solely for use by Users who access the Mobile Application where it operates and provides its services regionally. We make no representation that the Services (or any goods or services) are available or otherwise suitable for use outside of the regions indicated by the Company. Notwithstanding the above, if the User accesses the Mobile Application, use the Services or make any Redemptions from locations outside the regions indicated by the Service Provider, the User does so on their own initiative and are responsible for the consequences and for compliance with all applicable laws.

+

3.3 Scope: The Mobile Application, the Services and any Redemptions are for Users’ non-commercial, personal use only and must not be used for business purposes unless an official written permission is granted by the Company.

+

3.4 Prevention on use: We reserve the right to prevent the User using the Mobile Application and the Service (or any part of them) and to prevent the User from making any Redemptions.

+

3.5 Equipment and Networks: The provision of the Services and the Mobile Application does not include the provision of a mobile telephone or handheld device or other necessary equipment to access the Mobile Application or the Services or make any Redemptions. To use the Mobile Application or Services or to make Redemptions, the User will require Internet connectivity and appropriate telecommunication links. The User acknowledges that the terms of agreement with their respective mobile network provider will continue to apply when using the Mobile Application. As a result, the User may be charged by the Mobile Provider for access to network connection services for the duration of the connection while accessing the Mobile Application or any such third party charges as may arise. The User accepts responsibility for any such charges that arise.

+

3.6 Permission to use Mobile Application: If the User is not the bill payer for the mobile telephone or handheld device being used to access the Mobile Application, the User will be assumed to have received permission from the bill payer for using the Mobile Application.

+

3.7 License to Use Material: By submitting any text or images (including photographs) via the Application, the User represents that they are the owner of the Material, or have proper authorization from the owner of the Material to use, reproduce and distribute it. The User hereby grants us a worldwide, royalty-free, non-exclusive license to use the Material to promote any products or services.

+

4. REDEMPTIONS

+

4.1 Need for registration: a) Users must Register to make a Redemption from the Mobile Application. b) The Service Provider agrees that by registering they will be scrutinized to be accepted by the Company who may refuse or cancel the Service Provider account at any time, whether by complaints or by internal policy.

+

4.2 Application of these Terms and Conditions of Use: By making any Redemption, the User acknowledges that the Redemption is subject to these Terms and Conditions of Use.

+

4.3 Redemption: Any attempted Redemption not consistent with these Terms and Conditions of Use may be disallowed or rendered void at our or the relevant Service Provider’s discretion.

+

4.4 Responsibility for Redemptions of perishable products of services: Each Service Provider shall be responsible to ensure that any of its products or services for Redemption that are perishable has not expired.

+

4.5 Restrictions: (a) Reproduction, sale, resale or trading of any products or services or Redeemed products is prohibited. (b) If any product or service is Redeemed for less than its face value, there is no entitlement to a credit, cash or Sample equal to the difference between the face value and the amount Redeemed. (c) Redemption of products or services is subject to availability of the relevant Service Providers’ stocks.

+

4.6 Company Not Liable: For the avoidance of doubt, the Company shall not be liable for any losses or damages suffered by Users resulting from a failure by the relevant Service Provider to fulfil any Redemptions in accordance with Clause 4.4 or for a failure by us to deliver any products or services to Users due to the unavailability of such products or services pursuant to Clause 4.5(c). Users accept that the Mobile Application acts solely as a scheduling/matching service between its Users and Service Providers, and that it is not responsible for any issues that arise, including but not limited to accidents, delays, car discomfort, and unavailability of products or services.

+

4.7 Lost/stolen services: Neither we nor any Service Provider shall be responsible for lost or stolen Samples or products that have been Redeemed.

+

+

5. LOCATION ALERTS AND NOTIFICATIONS

+

5.1 The USer agrees to receive pre-programmed notifications (“Location Alerts”) on the Mobile Application from Service Providers if the User has turned on locational services on their mobile telephone or other handheld devices (as the case may be).

+

+

6. USERS’ OBLIGATIONS

+

6.1 Service Provider terms: Users agree to (and shall) abide by the terms and conditions of the relevant Service Provider for which their Redemption relates to, as may be amended from time to time.

+

6.2 Accurate information: The User warrants that all information provided on Registration and contained as part of their Account is true, complete and accurate and that the User will promptly inform us of any changes to such information by updating the information in their Account.

+

6.3 Content on the Mobile Application and Service: It is the User’s responsibility to ensure that any products, services or information available through the Mobile Application or the Services meet their specific requirements before making any Redemption.

+

6.4 Prohibitions in relation to usage of Services or Mobile Application: Without limitation, the User undertakes not to use or permit anyone else to use the Services or Mobile Application:-

+

6.4.1 to send or receive any material which is not civil or tasteful

+

6.4.2 to send or receive any material which is threatening, grossly offensive, of an indecent, obscene or menacing character, blasphemous or defamatory of any person, in contempt of court or in breach of confidence, copyright, rights of personality, publicity or privacy or any other third party rights;

+

6.4.3 to send or receive any material for which the User has not obtained all necessary licenses and/or approvals (from us or third parties); or which constitutes or encourages conduct that would be considered a criminal offence, give rise to civil liability, or otherwise be contrary to the law of or infringe the rights of any third party in any country in the world;

+

6.4.4 to send or receive any material which is technically harmful (including computer viruses, logic bombs, Trojan horses, worms, harmful components, corrupted data or other malicious software or harmful data);

+

6.4.5 to cause annoyance, inconvenience or needless anxiety;

+

6.4.6 to intercept or attempt to intercept any communications transmitted by way of a telecommunications system;

+

6.4.7 for a purpose other than which we have designed them or intended them to be used;

+

6.4.8 for any fraudulent purpose;

+

6.4.9 other than in conformance with accepted Internet practices and practices of any connected networks;

+

6.4.10 in any way which is calculated to incite hatred against any ethnic, religious or any other minority or is otherwise calculated to adversely affect any individual, group or entity; or

+

6.4.11 in such a way as to, or commit any act that would or does, impose an unreasonable or disproportionately large load on our infrastructure.

+

6.5 Prohibitions in relation to usage of Services, Mobile Application: Without limitation, the User further undertakes not to or permit anyone else to:-

+

6.5.1 resell any products or services;

+

6.5.2 furnish false data including false names, addresses and contact details and fraudulently use credit/debit card numbers;

+

6.5.3 attempt to circumvent our security or network including to access data not intended for the User, log into a server or account the User is not expressly authorized to access, or probe the security of other networks (such as running a port scan);

+

6.5.4 execute any form of network monitoring which will intercept data not intended for the User;

+

6.5.5 enter into fraudulent interactions or transactions with us or a Service Provider (including interacting or transacting purportedly on behalf of a third party where the User has no authority to bind that third party or the User is pretending to be a third party);

+

6.5.6 extract data from or hack into the Mobile Application;

+

6.5.7 use the Services or Mobile Application in breach of these Terms and Conditions of Use;

+

6.5.8 engage in any unlawful activity in connection with the use of the Mobile Application or the Services; or

+

6.5.9 engage in any conduct which, in our exclusive reasonable opinion, restricts or inhibits any other customer from properly using or enjoying the Mobile Application or Services.

+

+

7. RULES ABOUT USE OF THE SERVICE AND THE MOBILE APPLICATION

+

7.1 We will use reasonable endeavors to correct any errors or omissions as soon as practicable after being notified of them. However, we do not guarantee that the Services or the Mobile Application will be free of faults, and we do not accept liability for any such faults, errors or omissions. In the event of any such error, fault or omission, Users should report it by contacting us at JORDAN: 962798583052 .

+

7.2 We do not warrant that Users’ use of the Services or the Mobile Application will be uninterrupted and we do not warrant that any information (or messages) transmitted via the Services or the Mobile Application will be transmitted accurately, reliably, in a timely manner or at all. Notwithstanding that we will try to allow uninterrupted access to the Services and the Mobile Application, access to the Services and the Mobile Application may be suspended, restricted or terminated at any time.

+

7.3 We do not give any warranty that the Services and the Mobile Application are free from viruses or anything else which may have a harmful effect on any technology.

+

7.4 We reserve the right to change, modify, substitute, suspend or remove without notice any information or Services on the Mobile Application from time to time. Users’ access to the Mobile Application and/or the Services may also be occasionally restricted to allow for repairs, maintenance or the introduction of new facilities or services. We will attempt to restore such access as soon as we reasonably can. For the avoidance of doubt, we reserve the right to withdraw any information or Services from the Mobile Application at any time.

+

7.5 We reserve the right to block access to and/or to edit or remove any material which in our reasonable opinion may give rise to a breach of these Terms and Conditions of Use.

+

7.6 The acceptance and denial of the service request may occur at first by the Service Provider, who can accept or deny the service when receiving a notification for a request. The User may cancel the contract for any reason which may or may not apply cancellation fees for which the conditions and amount is determined and communicated by the Company. Both recognize that “Sefer” is not liable for any delays, cancellations, failure to cancel the contract and miscommunication between the User and the Service Provider, nor for any delay or failure in the delivery of services from the Service Provider.

+

+

8. SUSPENSION AND TERMINATION

+

8.1 If the User uses (or others, with the User’s permission use) the Mobile Application, any Services in contravention of these Terms and Conditions of Use, we may suspend their use of the Services and/or Mobile Application.

+

8.2 If we suspend the Services or Mobile Application, we may refuse to restore the Services or Mobile Application for the User’s use until we receive an assurance from them, in a form we deem acceptable, that there will be no further breach of the provisions of these Terms and Conditions of Use.

+

8.3 The Company shall fully co-operate with any law enforcement authorities or court order requesting or directing the Company to disclose the identity or locate anyone in breach of these Terms and Conditions of Use.

+

8.4 Without limitation to anything else in this Clause 8, we shall be entitled immediately or at any time (in whole or in part) to: (a) suspend the Services and/or Mobile Application; (b) suspend Users’ use of the Services and/or Mobile Application; and/or (c) suspend the use of the Services and/or Mobile Application for persons we believe to be connected (in whatever manner) to the concerned User, if:

+

8.4.1 the User commits any breach of these Terms and Conditions of Use;

+

8.4.2 we suspect, on reasonable grounds, that the User has, might or will commit a breach of these Terms and Conditions of Use; or

+

8.4.3 we suspect, on reasonable grounds, that the User may have committed or will be committing any fraud against us or any person.

+

8.5 Our rights under this Clause 8 shall not prejudice any other right or remedy we may have in respect of any breach or any rights, obligations or liabilities accrued prior to termination.

+

+

9. DISCLAIMER AND EXCLUSION OF LIABILITY

+

9.1 The Mobile Application, the Services, the information on the Mobile Application and use of all related facilities are provided on an "as is, as available" basis without any warranties whether express or implied.

+

9.2 The credit balance shall remain valid for the specific period. The credit in the wallet will be expired after 6 months of inactivity.

+

9.3 To the fullest extent permitted by applicable law, we disclaim all representations and warranties relating to the Mobile Application and its contents, including in relation to any inaccuracies or omissions in the Mobile Application, warranties of merchantability, quality, fitness for a particular purpose, accuracy, availability, non-infringement or implied warranties from course of dealing or usage of trade.

+

9.4 We do not warrant that the Mobile Application will always be accessible, uninterrupted, timely, secure, error free or free from computer virus or other invasive or damaging code or that the Mobile Application will not be affected by any acts of nature or other force majeure events, including inability to obtain or shortage of necessary materials, equipment facilities, power or telecommunications, lack of telecommunications equipment or facilities and failure of information technology or telecommunications equipment or facilities.

+

9.5 While we may use reasonable efforts to include accurate and up-to-date information on the Mobile Application, we make no warranties or representations as to its accuracy, timeliness or completeness.

+

9.6 We shall not be liable for any acts or omissions of any third parties howsoever caused, and for any direct, indirect, incidental, special, consequential or punitive damages, howsoever caused, resulting from or in connection with the Mobile Application and the services offered in the mobile application, Users’ access to, use of or inability to use the mobile application or the services offered in the mobile application, reliance on or downloading from the mobile application and/or services, or any delays, inaccuracies in the information or in its transmission including but not limited to damages for loss of business or profits, use, data or other intangible, even if we have been advised of the possibility of such damages.

+

9.7 We shall not be liable in contract, tort (including negligence or breach of statutory duty) or otherwise howsoever and whatever the cause thereof, for any indirect, consequential, collateral, special or incidental loss or damage suffered or incurred by the User in connection with the Mobile Application and these Terms and Conditions of Use. For the purposes of these Terms and Conditions of Use, indirect or consequential loss or damage includes, without limitation, loss of revenue, profits, anticipated savings or business, loss of data or goodwill, loss of use or value of any equipment including software, claims of third parties, and all associated and incidental costs and expenses.

+

9.8 The above exclusions and limitations apply only to the extent permitted by law. None of the User’s statutory rights as a consumer that cannot be excluded or limited are affected.

+

9.9 Notwithstanding our efforts to ensure that our system is secure, the User acknowledges that all electronic data transfers are potentially susceptible to interception by others. We cannot, and do not, warrant that data transfers pursuant to the Mobile Application, or electronic mail transmitted to and from us, will not be monitored or read by others.

+

+

10. INDEMNITY

+

The User agrees to indemnify and keep us indemnified against any claim, action, suit or proceeding brought or threatened to be brought against us which is caused by or arising out of (a) the User’s use of the Services, (b) any other party’s use of the Services using the User’s user ID, verification PIN and/or any identifier number allocated by the Company, and/or (c) the User’s breach of any of these Terms and Conditions of Use, and to pay us damages, costs and interest in connection with such claim, action, suit or proceeding.

+

+

11. INTELLECTUAL PROPERTY RIGHTS

+

11.1 All editorial content, information, photographs, illustrations, artwork and other graphic materials, and names, logos and trade marks on the Mobile Application are protected by copyright laws and/or other laws and/or international treaties, and belong to us and/or our suppliers, as the case may be. These works, logos, graphics, sounds or images may not be copied, reproduced, retransmitted, distributed, disseminated, sold, published, broadcasted or circulated whether in whole or in part, unless expressly permitted by us and/or our suppliers, as the case may be.

+

11.2 Nothing contained on the Mobile Application should be construed as granting by implication, estoppel, or otherwise, any license or right to use any trademark displayed on the Mobile Application without our written permission. Misuse of any trademarks or any other content displayed on the Mobile Application is prohibited.

+

11.3 We will not hesitate to take legal action against any unauthorized usage of our trade marks, name or symbols to preserve and protect its rights in the matter. All rights not expressly granted herein are reserved. Other product and company names mentioned herein may also be the trademarks of their respective owners.

+

+

12. AMENDMENTS

+

12.1 We may periodically make changes to the contents of the Mobile Application, including to the descriptions and prices of goods and services advertised, at any time and without notice. We assume no liability or responsibility for any errors or omissions in the content of the Mobile Application.

+

12.2 We reserve the right to amend these Terms and Conditions of Use from time to time without notice. The revised Terms and Conditions of Use will be posted on the Mobile Application and shall take effect from the date of such posting. The User is advised to review these terms and conditions periodically as they are binding upon the User.

+

+

13. APPLICABLE LAW AND JURISDICTION

+

13.1 These Terms and Conditions of Use shall be governed by and construed in accordance with the applicable Federal laws of Kingdom of Saudi Arabia.

+

13.2 The Mobile Application can be accessed from all countries around the world where the local technology permits. As each of these places have differing laws, by accessing the Mobile Application both the User and we agree that the laws of the country where accessed, without regard to the conflicts of laws principles thereof, will apply to all matters relating to the use of the Mobile Application.

+

13.3 the User accepts and agrees that both the User and we shall submit to the exclusive jurisdiction of the courts of the country where accessed in respect of any dispute arising out of and/or in connection with these Terms and Conditions of Use.

+

+

14. PRIVACY POLICY

+

14.1 Access to the Mobile Application and use of the Services offered on the Mobile Application by the Company and/or its group of companies & partners is subject to this Privacy Policy. By accessing the Mobile Application and by continuing to use the Services offered, Users are deemed to have accepted this Privacy Policy, and in particular, they are deemed to have consented to our use and disclosure of their personal information in the manner prescribed in this Privacy Policy and for the purposes set out in Clauses 3.7 and/or 4.1.1 We reserve the right to amend this Privacy Policy from time to time. If the User disagrees with any part of this Privacy Policy, the User must immediately discontinue their access to the Mobile Application and their use of the Services.

+

14.2 As part of the normal operation of our Services, we collect, use and, in some cases, disclose information about the User to third parties. Accordingly, we have developed this Privacy Policy in order for Users to understand how we collect, use, communicate and disclose and make use of their personal information when they use the Services on the Mobile Application:-

+

(a) Before or at the time of collecting personal information, we will identify the purposes for which information is being collected.

+

(b) We will collect and use of personal information solely with the objective of fulfilling those purposes specified by us and for other compatible purposes, unless we obtain the consent of the individual concerned or as required by law.

+

(c) We will only retain personal information as long as necessary for the fulfillment of those purposes.

+

(d) We will collect personal information by lawful and fair means and, where appropriate, with the knowledge or consent of the individual concerned.

+

(e) Personal information should be relevant to the purposes for which it is to be used, and, to the extent necessary for those purposes, should be accurate, complete, and up-to-date.

+

(f) We will protect personal information by reasonable security safeguards against loss or theft, as well as unauthorized access, disclosure, copying, use or modification.

+

(g) The Company further reserves the right to use all legal means possible and to identify the Users, as well as to request, at any time, additional data and documents it considers appropriate in order to verify personal data informed by the user.

+

We are committed to conducting our business in accordance with these principles in order to ensure that the confidentiality of personal information is protected and maintained.

+

14.3 Social logins policy
Our Services offers you the ability to register and login using Facebook. Where you choose to do this, we will receive certain profile information about you from your social media provider. The profile Information may include your name and social token.
We will use the information we receive only to associate your social token with your Sefer account or for the purposes that are described in this privacy policy.

14.4 Account and data deletion
Based on the applicable laws of your country, you may have the right to request the deletion of your personal data in some circumstances. If you want to delete your account or personal data in the application, please contact us via e-mail: support@mobile-app.store. We will respond to your request within 30 days.

+

15. In-Ride Policy

+

15.1 Smoking Policy:

+

No smoking or other use of tobacco products (including, but not limited to, cigarettes, pipes, cigars, snuff, or chewing tobacco) is permitted during rides. No cigarette butts or other traces of smell, litter, or tobacco use should be present in the vehicle. image

+

15.2 COVID-19 Policy: Face masks must be always worn during rides.

+
+
+
+
+
+
+ + + + + +
+
+ + + + +
+

+ All rights reserved. Fast Global Technology Holding Limited. © 2022 +

+
+
+ +
+ + + + +
+ + + + + + +
+ +'''; +} diff --git a/siro_service/lib/constant/links.dart b/siro_service/lib/constant/links.dart new file mode 100644 index 0000000..4c0dcb5 --- /dev/null +++ b/siro_service/lib/constant/links.dart @@ -0,0 +1,105 @@ +import '../env/env.dart'; +import '../main.dart'; +import 'box_name.dart'; + +class AppLink { + // static final String seferPaymentServer = Env.seferPaymentServer; + // // static final String seferPaymentServer = '${Env.seferCairoServer}/ride'; + + static final String seferAlexandriaServer = Env.seferAlexandriaServer; + static final String seferCairoServer = Env.seferCairoServer; + static final String seferGizaServer = Env.seferGizaServer; + static String paymentServer = 'https://walletintaleq.intaleq.xyz/v1/main'; + static String locationServer = 'https://location.intaleq.xyz/intaleq/ride/location'; + static String location = locationServer; + static String locationServerSide = 'https://location.intaleq.xyz/intaleq/ride/location'; + static String mapSaasRoute = 'https://map-saas.intaleqapp.com/api/maps/route'; + static String mapSaasPlaces = 'https://map-saas.intaleqapp.com/api/geocoding/places'; + static const String routeApiBaseUrl = "https://routesjo.intaleq.xyz/route/v1/driving"; + static final String syria = 'https://syria.intaleq.xyz/intaleq'; + + static String seferPaymentServer0 = box.read('seferPaymentServer'); + + static final String endPoint = 'https://api.intaleq.xyz/intaleq_v3'; + static final String rideServer = 'https://rides.intaleq.xyz/intaleq'; + // static final String server = Env.serverPHP; + static String getBestDriver = "$server/Admin/driver/getBestDriver.php"; + static final String server = 'https://api.intaleq.xyz/intaleq_v3'; + static final String jwtService = '$server/jwtService.php'; + static String addError = "$server/Admin/errorApp.php"; + + + // static final String endPoint = box.read(BoxName.serverChosen); + // static final String server = Env.seferCairoServer; + // static const String server = "https://sefer.click/sefer/sefer"; + static String googleMapsLink = 'https://maps.googleapis.com/maps/api/'; + static String llama = 'https://api.llama-api.com/chat/completions'; + static String getTokens = "$server/ride/firebase/get.php"; + + static String gemini = + 'https://generativelanguage.googleapis.com/v1beta3/models/text-bison-001:generateText'; + static String uploadEgypt = "$server/uploadEgypt.php"; + static String auth = '$server/auth'; + static String login = "$serviceApp/login.php"; + static String register = "$serviceApp/register.php"; + + static String signUp = "$auth/signup.php"; + static String sendVerifyEmail = "$auth/sendVerifyEmail.php"; + static String passengerRemovedAccountEmail = + "$auth/passengerRemovedAccountEmail.php"; + static String verifyEmail = "$auth/verifyEmail.php"; + static String getPromptDriverDocumentsEgypt = + "$server/auth/captin/getPromptDriverDocumentsEgypt.php"; + +//===================Auth Captin============ + static String authCaptin = '$server/auth/captin'; + static String loginCaptin = "$authCaptin/login.php"; + static String signUpCaptin = "$authCaptin/register.php"; + static String sendVerifyEmailCaptin = "$authCaptin/sendVerifyEmail.php"; + static String verifyEmailCaptin = "$authCaptin/verifyEmail.php"; + static String removeUser = "$authCaptin/removeAccount.php"; + static String deletecaptainAccounr = "$authCaptin/deletecaptainAccounr.php"; + static String updateAccountBank = "$authCaptin/updateAccountBank.php"; + static String getAccount = "$authCaptin/getAccount.php"; + static String test = "$server/test.php"; + static String serviceApp = "$server/serviceapp"; + static String getPassengersByPhone = "$serviceApp/getPassengersByPhone.php"; + static String getDriverByPhone = "$serviceApp/getDriverByPhone.php"; + static String getDriverByNational = "$serviceApp/getDriverByNational.php"; + static String updateDriver = "$serviceApp/updateDriver.php"; + static String updateDriverToActive = "$serviceApp/updateDriverToActive.php"; + static String getNewDriverRegister = "$serviceApp/getNewDriverRegister.php"; + static String getDriversPhoneNotComplete = + "$serviceApp/getDriversPhoneNotComplete.php"; + static String addWelcomeDriverNote = "$serviceApp/addWelcomeDriverNote.php"; + static String getDriverNotCompleteRegistration = + "$serviceApp/getDriverNotCompleteRegistration.php"; + static String deleteDriverNotCompleteRegistration = + "$serviceApp/deleteDriverNotCompleteRegistration.php"; + static String getDriversWaitingActive = + "$serviceApp/getDriversWaitingActive.php"; + static String getPassengersNotCompleteRegistration = + "$serviceApp/getPassengersNotCompleteRegistration.php"; + static String addNotesDriver = "$serviceApp/addNotesDriver.php"; + static String getDriverDetailsForActivate = + "$serviceApp/getDriverDetailsForActivate.php"; + static String getCarPlateNotEdit = "$serviceApp/getCarPlateNotEdit.php"; + static String getdriverWithoutCar = "$serviceApp/getdriverWithoutCar.php"; + static String getBestDriverGiza = + "https://gizasefer.online/sefer/Admin/driver/getBestDriver.php"; + static String getBestDriverAlexandria = + "$seferAlexandriaServer/Admin/driver/getBestDriver.php"; + static String addNotesPassenger = "$serviceApp/addNotesPassenger.php"; + static String editCarPlate = "$serviceApp/editCarPlate.php"; + static String addDriverWantWork = "$serviceApp/work/addDriverWantWork.php"; + static String addCarWantWork = "$serviceApp/work/addCarWantWork.php"; + static String getComplaintAllData = "$serviceApp/getComplaintAllData.php"; + static String getComplaintAllDataForDriver = + "$serviceApp/getComplaintAllDataForDriver.php"; + static String addCriminalDocuments = "$authCaptin/addCriminalDocuments.php"; + static String ride = '$server/ride'; + static String addRegisrationCar = "$ride/RegisrationCar/add.php"; + static String addCartoDriver = "$serviceApp/addCartoDriver.php"; + static String getRegisrationCar = "$ride/RegisrationCar/get.php"; + static String updateRegisrationCar = "$ride/RegisrationCar/update.php"; +} diff --git a/siro_service/lib/constant/style.dart b/siro_service/lib/constant/style.dart new file mode 100644 index 0000000..5492521 --- /dev/null +++ b/siro_service/lib/constant/style.dart @@ -0,0 +1,65 @@ +import 'package:flutter/material.dart'; +import 'package:google_fonts/google_fonts.dart'; +import '../main.dart'; +import 'box_name.dart'; +import 'colors.dart'; + +class AppStyle { + static TextStyle headTitle = TextStyle( + fontWeight: FontWeight.bold, + fontSize: 36, + color: AppColor.accentColor, + fontFamily: box.read(BoxName.lang) == 'ar' + // ?GoogleFonts.markaziText().fontFamily + ? GoogleFonts.markaziText().fontFamily + : GoogleFonts.inter().fontFamily); + static TextStyle headTitle2 = TextStyle( + fontWeight: FontWeight.bold, + fontSize: 24, + color: AppColor.writeColor, + fontFamily: box.read(BoxName.lang) == 'ar' + ? GoogleFonts.markaziText().fontFamily + : GoogleFonts.inter().fontFamily); + static TextStyle title = TextStyle( + fontWeight: FontWeight.normal, + fontSize: 16, + color: AppColor.writeColor, + fontFamily: box.read(BoxName.lang) == 'ar' + ? GoogleFonts.markaziText().fontFamily + : GoogleFonts.inter().fontFamily); + static TextStyle subtitle = TextStyle( + fontWeight: FontWeight.bold, + fontSize: 12, + color: AppColor.writeColor, + fontFamily: box.read(BoxName.lang) == 'ar' + ? GoogleFonts.markaziText().fontFamily + : GoogleFonts.inter().fontFamily); + static TextStyle number = const TextStyle( + fontWeight: FontWeight.bold, + fontSize: 14, + color: AppColor.writeColor, + fontFamily: 'digit'); + + static BoxDecoration boxDecoration = BoxDecoration( + boxShadow: [ + BoxShadow( + color: AppColor.accentColor.withValues(alpha: 0.1), + blurRadius: 10, + offset: const Offset(0, 4)), + ], + color: AppColor.secondaryColor, + borderRadius: BorderRadius.circular(16)); + + static BoxDecoration boxDecoration1 = BoxDecoration( + boxShadow: [ + BoxShadow( + color: Colors.black.withValues(alpha: 0.05), + blurRadius: 15, + offset: const Offset(0, 8)), + ], + color: AppColor.secondaryColor, + borderRadius: BorderRadius.circular(20), + ); + + +} diff --git a/siro_service/lib/constant/table_names.dart b/siro_service/lib/constant/table_names.dart new file mode 100644 index 0000000..47cd831 --- /dev/null +++ b/siro_service/lib/constant/table_names.dart @@ -0,0 +1,9 @@ +class TableName { + static const String placesFavorite = "placesFavorite"; + static const String recentLocations = "recentLocations"; + static const String carLocations = "carLocations"; + static const String driverOrdersRefuse = "driverOrdersRefuse"; + static const String rideLocation = "rideLocation"; + static const String faceDetectTimes = "faceDetectTimes"; + static const String captainNotification = "captainNotification"; +} diff --git a/siro_service/lib/controller/auth/register_controller.dart b/siro_service/lib/controller/auth/register_controller.dart new file mode 100644 index 0000000..ebd35a2 --- /dev/null +++ b/siro_service/lib/controller/auth/register_controller.dart @@ -0,0 +1,78 @@ +import 'package:flutter/material.dart'; +import 'package:get/get.dart'; +import 'package:siro_service/constant/links.dart'; +import 'package:siro_service/controller/functions/crud.dart'; +import 'package:siro_service/controller/functions/device_helper.dart'; +import 'package:siro_service/print.dart'; + +import 'package:flutter_secure_storage/flutter_secure_storage.dart'; + +class RegisterController extends GetxController { + final firstName = TextEditingController(); + final lastName = TextEditingController(); + final email = TextEditingController(); + final phone = TextEditingController(); + final password = TextEditingController(); + + final FlutterSecureStorage storage = const FlutterSecureStorage(); + final formKey = GlobalKey(); + + var isLoading = false.obs; + + void register() async { + if (formKey.currentState!.validate()) { + isLoading.value = true; + + // الحصول على البصمة + String fingerprint = await DeviceHelper.getDeviceFingerprint(); + + var payload = { + "first_name": firstName.text, + "last_name": lastName.text, + "email": email.text, + "phone": phone.text, + "password": password.text, + "fingerprint": fingerprint, + }; + + Log.print('🚀 Register Payload: $payload'); + var res = await CRUD().post(link: AppLink.register, payload: payload); + Log.print('📥 Register Response: $res'); + + isLoading.value = false; + + if (res != 'failure' && res is Map && res['status'] == 'success') { + // حفظ كلمة المرور للدخول التلقائي لاحقاً + await storage.write(key: 'password', value: password.text); + + Get.defaultDialog( + + title: "نجاح", + middleText: res['message']['message'] ?? "تم تقديم طلبك بنجاح. يرجى انتظار موافقة الإدارة.", + onConfirm: () { + Get.back(); // close dialog + Get.back(); // return to login + }, + textConfirm: "موافق", + ); + } else { + Get.snackbar( + "خطأ", + res is Map ? res['message'].toString() : "فشل تقديم طلب التسجيل", + backgroundColor: Colors.red.withOpacity(0.7), + colorText: Colors.white, + ); + } + } + } + + @override + void onClose() { + firstName.dispose(); + lastName.dispose(); + email.dispose(); + phone.dispose(); + password.dispose(); + super.onClose(); + } +} diff --git a/siro_service/lib/controller/best_driver_controllers.dart b/siro_service/lib/controller/best_driver_controllers.dart new file mode 100644 index 0000000..e360e3a --- /dev/null +++ b/siro_service/lib/controller/best_driver_controllers.dart @@ -0,0 +1,71 @@ +import 'dart:convert'; + +import 'package:get/get.dart'; + +import '../../constant/colors.dart'; +import '../../constant/links.dart'; +import '../print.dart'; +import 'functions/crud.dart'; + +class Driverthebest extends GetxController { + bool isLoading = false; + List driver = []; + getBestDriver() async { + var res = await CRUD().get(link: AppLink.getBestDriver, payload: {}); + if (res != 'failure') { + driver = res['message']; + // Log.print('driver: ${driver}'); + update(); + } else { + Get.snackbar('error', '', backgroundColor: AppColor.redColor); + } + } + + @override + void onInit() { + getBestDriver(); + super.onInit(); + } +} + +class DriverTheBestGizaController extends GetxController { + bool isLoading = false; + List driver = []; + getBestDriver() async { + var res = await CRUD().get(link: AppLink.getBestDriverGiza, payload: {}); + if (res != 'failure') { + driver = res['message']; + + update(); + } else { + Get.snackbar('error', '', backgroundColor: AppColor.redColor); + } + } + + @override + void onInit() { + getBestDriver(); + super.onInit(); + } +} + +class DriverTheBestAlexandriaController extends GetxController { + bool isLoading = false; + List driver = []; + getBestDriver() async { + var res = + await CRUD().get(link: AppLink.getBestDriverAlexandria, payload: {}); + if (res != 'failure') { + driver = res['message']; + update(); + } else { + Get.snackbar('error', '', backgroundColor: AppColor.redColor); + } + } + + @override + void onInit() { + getBestDriver(); + super.onInit(); + } +} diff --git a/siro_service/lib/controller/firbase_messge.dart b/siro_service/lib/controller/firbase_messge.dart new file mode 100644 index 0000000..8546a0e --- /dev/null +++ b/siro_service/lib/controller/firbase_messge.dart @@ -0,0 +1,110 @@ +import 'dart:io'; +import 'package:firebase_messaging/firebase_messaging.dart'; +import 'package:get/get.dart'; +import 'package:siro_service/controller/local_notification.dart'; +import '../../constant/box_name.dart'; +import '../../main.dart'; +import '../../print.dart'; + +@pragma('vm:entry-point') +Future _firebaseMessagingBackgroundHandler(RemoteMessage message) async { + // If you're going to use other Firebase services in the background, such as Firestore, + // make sure you call `initializeApp` before using other Firebase services. + Log.print("Handling a background message: ${message.messageId}"); + + if (message.data.isNotEmpty && message.notification != null) { + // في وضع الخلفية، يفضل إرسال إشعار محلي أو تحديث البيانات الصامتة + } +} + +class FirebaseMessagesController extends GetxController { + final fcmToken = FirebaseMessaging.instance; + + List tokens = []; + List dataTokens = []; + late String driverID; + late String driverToken; + NotificationSettings? notificationSettings; + + Future getNotificationSettings() async { + // Get the current notification settings + NotificationSettings? notificationSettings = + await FirebaseMessaging.instance.getNotificationSettings(); + 'Notification authorization status: ${notificationSettings.authorizationStatus}'; + + // Call the update function if needed + update(); + } + + Future requestFirebaseMessagingPermission() async { + FirebaseMessaging messaging = FirebaseMessaging.instance; + + // Check if the platform is Android + if (Platform.isAndroid) { + // Request permission for Android + await messaging.requestPermission(); + } else if (Platform.isIOS) { + // Request permission for iOS + NotificationSettings settings = await messaging.requestPermission( + alert: true, + announcement: true, + badge: true, + carPlay: true, + criticalAlert: true, + provisional: false, + sound: true, + ); + messaging.setForegroundNotificationPresentationOptions( + alert: true, badge: true, sound: true); + } + } + + // NotificationController notificationController = + // Get.isRegistered() + // ? Get.find() + // : Get.put(NotificationController()); + + Future getToken() async { + fcmToken.getToken().then((token) { + // Log.print('fcmToken: ${token}'); + box.write(BoxName.tokenFCM, (token.toString())); + }); + // 🔹 الاشتراك في topic + await fcmToken.subscribeToTopic("service"); // أو "users" حسب نوع المستخدم + Log.print("Subscribed to 'service' topic ✅"); + + FirebaseMessaging.onMessage.listen((RemoteMessage message) { + // If the app is in the background or terminated, show a system tray message + if (message.data.isNotEmpty && message.notification != null) { + fireBaseTitles(message); + } + }); + + // استخدام الدالة العامة للهاندلر في الخلفية + FirebaseMessaging.onBackgroundMessage(_firebaseMessagingBackgroundHandler); + + FirebaseMessaging.onMessageOpenedApp.listen((RemoteMessage message) { + if (message.data.isNotEmpty && message.notification != null) { + fireBaseTitles(message); + } + }); + } + + Future fireBaseTitles(RemoteMessage message) async { + // [!! تعديل !!] + // اقرأ "النوع" من حمولة البيانات، وليس من العنوان + String category = message.data['category'] ?? ''; + + // اقرأ العنوان (للعرض) + String title = message.notification?.title ?? ''; + String body = message.notification?.body ?? ''; + + if (category == 'new_service_request') { + // <-- مثال: كان 'Order'.tr + Log.print('message: ${message}'); + if (Platform.isAndroid) { + NotificationController().showNotification(title, body, 'Order'); + } + } + } +} diff --git a/siro_service/lib/controller/firebase.dart b/siro_service/lib/controller/firebase.dart new file mode 100644 index 0000000..90adabe --- /dev/null +++ b/siro_service/lib/controller/firebase.dart @@ -0,0 +1,109 @@ +import 'dart:convert'; +import 'dart:io'; +import 'package:firebase_messaging/firebase_messaging.dart'; +import 'package:flutter/material.dart'; +import 'package:get/get.dart'; +import 'package:http/http.dart' as http; + +import '../../constant/api_key.dart'; +import '../../constant/box_name.dart'; +import '../../constant/colors.dart'; +import '../../constant/links.dart'; +import '../../constant/style.dart'; +import '../../main.dart'; +import 'functions/crud.dart'; + +class FirebaseMessagesController extends GetxController { + final fcmToken = FirebaseMessaging.instance; + + List tokens = []; + List dataTokens = []; + late String driverID; + late String driverToken; + NotificationSettings? notificationSettings; + + Future getNotificationSettings() async { + // Get the current notification settings + NotificationSettings? notificationSettings = + await FirebaseMessaging.instance.getNotificationSettings(); + 'Notification authorization status: ${notificationSettings.authorizationStatus}'; + + // Call the update function if needed + update(); + } + + Future requestFirebaseMessagingPermission() async { + FirebaseMessaging messaging = FirebaseMessaging.instance; + + // Check if the platform is Android + if (Platform.isAndroid) { + // Request permission for Android + await messaging.requestPermission(); + } else if (Platform.isIOS) { + // Request permission for iOS + NotificationSettings settings = await messaging.requestPermission( + alert: true, + announcement: true, + badge: true, + carPlay: true, + criticalAlert: true, + provisional: false, + sound: true, + ); + messaging.setForegroundNotificationPresentationOptions( + alert: true, badge: true, sound: true); + } + } + + Future getTokens() async { + var res = await CRUD().post(link: AppLink.getTokens, payload: {}); + if (res != 'failure' && res['status'] == 'success') { + dataTokens = res['data']; + for (var i = 0; i < dataTokens.length; i++) { + tokens.add(res['data'][i]['token']); + } + box.write(BoxName.tokens, tokens); + } else { + Get.snackbar("Warning".tr, "Server Error".tr, + backgroundColor: AppColor.redColor); + } + } + + Future getToken() async { + fcmToken.getToken().then((token) { + box.write(BoxName.tokenFCM, token); + }); + + FirebaseMessaging.onMessage.listen((RemoteMessage message) { + // If the app is in the background or terminated, show a system tray message + RemoteNotification? notification = message.notification; + AndroidNotification? android = notification?.android; + // if (notification != null && android != null) { + if (message.data.isNotEmpty && message.notification != null) { + fireBaseTitles(message); + } + }); + FirebaseMessaging.onBackgroundMessage((RemoteMessage message) async { + // Handle background message + if (message.data.isNotEmpty && message.notification != null) { + fireBaseTitles(message); + } + }); + + FirebaseMessaging.onMessageOpenedApp.listen((RemoteMessage message) { + if (message.data.isNotEmpty && message.notification != null) { + fireBaseTitles(message); + } + }); + } + + void fireBaseTitles(RemoteMessage message) { + if (message.notification!.title! == 'Order'.tr) { + } else if (message.notification!.title! == 'Apply Ride'.tr) { + var passengerList = message.data['passengerList']; + + var myList = jsonDecode(passengerList) as List; + driverID = myList[0].toString(); + } + } +} diff --git a/siro_service/lib/controller/functions/crud.dart b/siro_service/lib/controller/functions/crud.dart new file mode 100644 index 0000000..884768e --- /dev/null +++ b/siro_service/lib/controller/functions/crud.dart @@ -0,0 +1,386 @@ +import 'dart:async'; +import 'dart:convert'; +import 'dart:io'; + +import 'package:crypto/crypto.dart'; +import 'package:get/get.dart'; +import 'package:http/http.dart' as http; +import 'package:siro_service/constant/box_name.dart'; +import 'package:siro_service/constant/links.dart'; +import 'package:siro_service/controller/functions/encrypt_decrypt.dart'; +import 'package:siro_service/env/env.dart'; +import 'package:siro_service/controller/functions/security_helper.dart'; +import 'package:siro_service/main.dart'; +import 'package:siro_service/print.dart'; + +import '../../constant/api_key.dart'; + +class CRUD { + static bool _isRefreshingJWT = false; + static String? _appSignature; + + static String _lastErrorSignature = ''; + static DateTime _lastErrorTimestamp = DateTime(2000); + static const Duration _errorLogDebounceDuration = Duration(minutes: 1); + + // ── JWT Validity Check (No external libs) ────────────────────── + static bool _isJwtValid(String? token) { + if (token == null || token.isEmpty) return false; + try { + final parts = token.split('.'); + if (parts.length != 3) return false; + String payload = parts[1]; + switch (payload.length % 4) { + case 2: + payload += '=='; + break; + case 3: + payload += '='; + break; + } + final decoded = jsonDecode(utf8.decode(base64Url.decode(payload))); + final exp = decoded['exp']; + if (exp == null) return false; + // 30 seconds buffer + return DateTime.now().millisecondsSinceEpoch < (exp * 1000 - 30000); + } catch (_) { + return false; + } + } + + static Future addError( + String error, String details, String where) async { + try { + final currentErrorSignature = '$where-$error'; + final now = DateTime.now(); + + if (currentErrorSignature == _lastErrorSignature && + now.difference(_lastErrorTimestamp) < _errorLogDebounceDuration) { + return; + } + + _lastErrorSignature = currentErrorSignature; + _lastErrorTimestamp = now; + + final userId = + box.read(BoxName.driverID) ?? box.read(BoxName.passengerID); + final userType = 'Service'; + final phone = box.read(BoxName.phone) ?? box.read(BoxName.phoneDriver); + + CRUD().post( + link: AppLink.addError, + payload: { + 'error': error.toString(), + 'userId': userId.toString(), + 'userType': userType, + 'phone': phone.toString(), + 'device': where, + 'details': details, + }, + ); + } catch (e) {} + } + + String _getFpHeader() { + return box.read(BoxName.fingerPrint)?.toString() ?? ''; + } + + String _generateHmac(String body, String timestamp, String nonce) { + // نستخدم المفتاح الخاص بالمستخدم (المخزن في البوكس) كـ HMAC Secret + final hmacSecret = box.read(BoxName.hmac) ?? ''; + + final payload = body + timestamp + nonce; + final key = utf8.encode(hmacSecret); + final bytes = utf8.encode(payload); + final hmacSha256 = Hmac(sha256, key); + final result = hmacSha256.convert(bytes).toString(); + Log.print('🔐 [HMAC-DEBUG] Secret: $hmacSecret'); + Log.print('🔐 [HMAC-DEBUG] Body(${body.length}): "$body"'); + Log.print('🔐 [HMAC-DEBUG] TS: $timestamp | Nonce: $nonce'); + Log.print('🔐 [HMAC-DEBUG] Result: $result'); + return result; + } + + // ═══════════════════════════════════════════════════════════════ + // _makeRequest — Central Request Handler + // ─────────────────────────────────────────────────────────────── + Future _makeRequest({ + required String link, + Map? payload, + required Map headers, + }) async { + const totalTimeout = Duration(seconds: 60); + + // توليد بيانات الـ HMAC للطلب الحالي + final timestamp = DateTime.now().millisecondsSinceEpoch.toString(); + final nonce = + DateTime.now().microsecondsSinceEpoch.toString(); // Nonce فريد + + // تحويل الـ payload إلى string لمحاكة ما سيصل للسيرفر (php://input) + String bodyString = ''; + if (payload != null && payload.isNotEmpty) { + // الـ http.post يرسل البيانات كـ x-www-form-urlencoded + bodyString = payload.keys + .map((key) => + "$key=${Uri.encodeQueryComponent(payload[key].toString())}") + .join("&"); + } + + final hmacSignature = _generateHmac(bodyString, timestamp, nonce); + + // إضافة هيدرات الـ HMAC + headers['X-HMAC-Auth'] = hmacSignature; + headers['X-Timestamp'] = timestamp; + headers['X-Nonce'] = nonce; + + Future doPost() { + final url = Uri.parse(link); + return http + .post(url, body: payload, headers: headers) + .timeout(totalTimeout); + } + + http.Response? response; + int attempts = 0; + final requestId = + DateTime.now().millisecondsSinceEpoch.toString().substring(7); + + Log.print('🚀 [REQ-$requestId] $link'); + Log.print('🔑 [FP-$requestId] ${headers['X-Device-FP']}'); + Log.print('🔏 [SIGN-$requestId] ${headers['X-App-Signature']}'); + if (payload != null) Log.print('📦 [PAYLOAD-$requestId] $payload'); + + while (attempts < 3) { + try { + attempts++; + response = await doPost(); + break; + } on SocketException catch (_) { + Log.print('⚠️ SocketException attempt $attempts — $link'); + if (attempts >= 3) return 'no_internet'; + await Future.delayed(const Duration(seconds: 1)); + } on TimeoutException catch (_) { + Log.print('⚠️ TimeoutException attempt $attempts — $link'); + if (attempts >= 3) return 'failure'; + } catch (e) { + if (e.toString().contains('errno = 9') && attempts < 3) { + await Future.delayed(const Duration(milliseconds: 500)); + continue; + } + addError( + 'HTTP Exception: $e', 'Try: $attempts', 'CRUD._makeRequest $link'); + return 'failure'; + } + } + + if (response == null) return 'failure'; + + final sc = response.statusCode; + final body = response.body; + + Log.print('📥 [RES-$requestId] [$sc] $link'); + Log.print('📄 [BODY-$requestId] $body'); + + if (sc >= 200 && sc < 300) { + try { + return jsonDecode(body); + } catch (e, st) { + addError( + 'JSON Decode Error', 'Body: $body\n$st', 'CRUD._makeRequest $link'); + return 'failure'; + } + } + + if (sc == 401) { + if (!_isRefreshingJWT && !link.contains('errorApp.php')) { + _isRefreshingJWT = true; + try { + await getJWT(); + } finally { + _isRefreshingJWT = false; + } + } + return 'token_expired'; + } + + if (sc >= 500) { + addError('Server 5xx', 'SC: $sc\nBody: $body', 'CRUD._makeRequest $link'); + return 'failure'; + } + + return 'failure'; + } + + // ═══════════════════════════════════════════════════════════════ + // post — standard POST + // ═══════════════════════════════════════════════════════════════ + Future post({ + required String link, + Map? payload, + }) async { + String token = r(box.read(BoxName.jwt) ?? '').toString().split(Env.addd)[0]; + + if (!_isJwtValid(token) && + !_isRefreshingJWT && + !link.contains('login.php')) { + _isRefreshingJWT = true; + try { + await getJWT(); + token = r(box.read(BoxName.jwt) ?? '').toString().split(Env.addd)[0]; + } finally { + _isRefreshingJWT = false; + } + } + + // Initialize app signature if null + _appSignature ??= await SecurityHelper.getAppSignature(); + + final headers = { + 'Content-Type': 'application/x-www-form-urlencoded', + 'Authorization': 'Bearer $token', + 'X-Device-FP': _getFpHeader(), + 'X-App-Signature': _appSignature ?? '', + }; + + return await _makeRequest(link: link, payload: payload, headers: headers); + } + + // ═══════════════════════════════════════════════════════════════ + // get — standard GET (uses POST method in this architecture) + // ═══════════════════════════════════════════════════════════════ + Future get({ + required String link, + Map? payload, + }) async { + return await post(link: link, payload: payload); + } + + // ═══════════════════════════════════════════════════════════════ + // getJWT — V1 Login Flow + // ═══════════════════════════════════════════════════════════════ + Future getJWT() async { + var payload = { + 'fingerprint': _getFpHeader(), + 'password': box.read(BoxName.password) ?? '', + 'aud': 'service', + }; + + // Initialize app signature if null + _appSignature ??= await SecurityHelper.getAppSignature(); + + final headers = { + 'Content-Type': 'application/x-www-form-urlencoded', + 'X-App-Signature': _appSignature ?? '', + }; + + final response = await _makeRequest( + link: AppLink.login, payload: payload, headers: headers); + + if (response != 'failure' && + response is Map && + response['status'] == 'success') { + final jwt = response['message']['jwt']; + final hmac = response['message']['hmac']; + + Log.print('jwt: $jwt'); + Log.print('hmac_key: $hmac'); + + await box.write(BoxName.jwt, c(jwt)); + if (hmac != null) { + await box.write(BoxName.hmac, hmac); + final verify = box.read(BoxName.hmac); + Log.print('✅ Verified stored HMAC: $verify'); + } + } + } + + // ───────────────────────────────────────────────────────────── + // Service Specific Methods (Preserved) + // ───────────────────────────────────────────────────────────── + + Future arabicTextExtractByVisionAndAI({ + required String imagePath, + required String driverID, + }) async { + var headers = { + 'Content-Type': 'application/json', + 'Ocp-Apim-Subscription-Key': AK.ocpApimSubscriptionKey + }; + + String imagePathFull = + '${AppLink.server}/card_image/$imagePath-$driverID.jpg'; + var request = http.Request( + 'POST', + Uri.parse( + 'https://eastus.api.cognitive.microsoft.com/computervision/imageanalysis:analyze?features=caption,read&model-version=latest&language=en&api-version=2024-02-01')); + request.body = json.encode({"url": imagePathFull}); + request.headers.addAll(headers); + + http.StreamedResponse response = await request.send(); + + if (response.statusCode == 200) { + return await response.stream.bytesToString(); + } + return 'failure'; + } + + Future getAgoraToken({ + required String channelName, + required String uid, + }) async { + var res = await http.get( + Uri.parse( + 'https://orca-app-b2i85.ondigitalocean.app/token?channelName=$channelName'), + headers: {'Authorization': 'Bearer '}); + + if (res.statusCode == 200) { + var response = jsonDecode(res.body); + return response['token']; + } + return 'failure'; + } + + Future getLlama({ + required String link, + required String payload, + required String prompt, + }) async { + var url = Uri.parse(link); + var headers = { + 'Content-Type': 'application/json', + 'Authorization': + 'Bearer LL-X5lJ0Px9CzKK0HTuVZ3u2u4v3tGWkImLTG7okGRk4t25zrsLqJ0qNoUzZ2x4ciPy' + }; + var data = json.encode({ + "model": "Llama-3-70b-Inst-FW", + "messages": [ + { + "role": "user", + "content": + "Extract the desired information from the following passage as json decoded like $prompt just in this:\n\n$payload" + } + ], + "temperature": 0.9 + }); + var response = await http.post(url, body: data, headers: headers); + + if (response.statusCode == 200) { + return response.body; + } + return response.statusCode; + } + + sendEmail(String link, Map? payload) async { + var headers = { + "Content-Type": "application/x-www-form-urlencoded", + 'Authorization': + 'Basic ${base64Encode(utf8.encode(AK.basicAuthCredentials))}', + }; + var request = http.Request('POST', Uri.parse(link)); + request.bodyFields = payload!; + request.headers.addAll(headers); + + http.StreamedResponse response = await request.send(); + if (response.statusCode == 200) {} + } +} diff --git a/siro_service/lib/controller/functions/device_helper.dart b/siro_service/lib/controller/functions/device_helper.dart new file mode 100644 index 0000000..b12cc9b --- /dev/null +++ b/siro_service/lib/controller/functions/device_helper.dart @@ -0,0 +1,49 @@ +import 'dart:io'; +import 'package:device_info_plus/device_info_plus.dart'; +import 'package:flutter/foundation.dart'; +import 'package:siro_service/constant/box_name.dart'; +import 'package:siro_service/controller/functions/encrypt_decrypt.dart'; +import '../../main.dart'; +import '../../print.dart'; + +class DeviceHelper { + static Future getDeviceFingerprint() async { + await EncryptionHelper.initialize(); + final DeviceInfoPlugin deviceInfoPlugin = DeviceInfoPlugin(); + var deviceData; + + try { + if (Platform.isAndroid) { + AndroidDeviceInfo androidInfo = await deviceInfoPlugin.androidInfo; + deviceData = androidInfo.toMap(); + } else if (Platform.isIOS) { + IosDeviceInfo iosInfo = await deviceInfoPlugin.iosInfo; + deviceData = iosInfo.toMap(); + } else { + throw UnsupportedError('Unsupported platform'); + } + + final String deviceId = Platform.isAndroid + ? deviceData['id'] ?? + deviceData['androidId'] ?? + deviceData['fingerprint'] ?? + 'unknown' + : deviceData['identifierForVendor'] ?? 'unknown'; + + final String deviceModel = deviceData['model'] ?? 'unknown'; + + Log.print('DeviceId: $deviceId'); + Log.print('DeviceModel: $deviceModel'); + + final String fingerprint = + EncryptionHelper.instance.encryptData('${deviceId}_$deviceModel'); + + Log.print('Generated Fingerprint: $fingerprint'); + box.write(BoxName.fingerPrint, fingerprint); + return (fingerprint); + } catch (e) { + Log.print('Error generating device fingerprint: $e'); + return ''; + } + } +} diff --git a/siro_service/lib/controller/functions/encrypt_decrypt.dart b/siro_service/lib/controller/functions/encrypt_decrypt.dart new file mode 100644 index 0000000..5c9a69f --- /dev/null +++ b/siro_service/lib/controller/functions/encrypt_decrypt.dart @@ -0,0 +1,87 @@ +import 'package:encrypt/encrypt.dart' as encrypt; +import 'package:flutter/foundation.dart'; +import 'package:siro_service/env/env.dart'; + +import 'package:secure_string_operations/secure_string_operations.dart'; +import 'package:siro_service/constant/char_map.dart'; +import 'package:siro_service/print.dart'; + + +class EncryptionHelper { + static EncryptionHelper? _instance; + + late final encrypt.Key key; + late final encrypt.IV iv; + + EncryptionHelper._(this.key, this.iv); + static EncryptionHelper get instance { + if (_instance == null) { + throw Exception( + "EncryptionHelper is not initialized. Call `await EncryptionHelper.initialize()` in main."); + } + return _instance!; + } + + /// Initializes and stores the instance globally + static Future initialize() async { + if (_instance != null) { + debugPrint("EncryptionHelper is already initialized."); + return; // Prevent re-initialization + } + debugPrint("Initializing EncryptionHelper..."); + // Read stored keys + String keyOfApp = r(Env.keyOfApp).toString().split(Env.addd)[0]; + String initializationVector = r(Env.initializationVector).toString().split(Env.addd)[0]; + + Log.print('Key Length: ${keyOfApp.length}'); + Log.print('IV Length: ${initializationVector.length}'); + + // Set the global instance + _instance = EncryptionHelper._( + encrypt.Key.fromUtf8(keyOfApp), + encrypt.IV.fromUtf8(initializationVector), + ); + debugPrint("EncryptionHelper initialized successfully."); + } + + + /// Encrypts a string + String encryptData(String plainText) { + Log.print('Encrypting: $plainText'); + try { + + final encrypter = + encrypt.Encrypter(encrypt.AES(key, mode: encrypt.AESMode.cbc)); + final encrypted = encrypter.encrypt(plainText, iv: iv); + return encrypted.base64; + } catch (e) { + Log.print('Encryption Error: $e'); + return ''; + } + + } + + /// Decrypts a string + String decryptData(String encryptedText) { + try { + final encrypter = + encrypt.Encrypter(encrypt.AES(key, mode: encrypt.AESMode.cbc)); + final encrypted = encrypt.Encrypted.fromBase64(encryptedText); + return encrypter.decrypt(encrypted, iv: iv); + } catch (e) { + debugPrint('Decryption Error: $e'); + return ''; + } + } +} + +r(String string) { + var res = X.r(X.r(X.r(string, cn), cC), cs).toString(); + // Log.print('r($string) => $res'); + return res; +} + + +c(String string) { + return X.c(X.c(X.c(string, cn), cC), cs).toString(); +} diff --git a/siro_service/lib/controller/functions/image.dart b/siro_service/lib/controller/functions/image.dart new file mode 100644 index 0000000..67a0079 --- /dev/null +++ b/siro_service/lib/controller/functions/image.dart @@ -0,0 +1,340 @@ +import 'dart:convert'; +import 'dart:io'; +import 'package:get/get.dart'; +import 'package:http/http.dart' as http; +import 'package:image_cropper/image_cropper.dart'; +import 'package:image_picker/image_picker.dart'; +import 'package:path/path.dart'; +import 'package:image/image.dart' as img; + +import 'package:flutter_image_compress/flutter_image_compress.dart'; +import 'package:path_provider/path_provider.dart' as path_provider; + +import '../../constant/api_key.dart'; +import '../../constant/box_name.dart'; +import '../../constant/colors.dart'; +import '../../main.dart'; +import 'package:siro_service/controller/functions/encrypt_decrypt.dart'; +import 'package:siro_service/env/env.dart'; + + +class ImageController extends GetxController { + File? myImage; + bool isloading = false; + CroppedFile? croppedFile; + final picker = ImagePicker(); + var image; + + Future detectAndCropDocument(File imageFile) async { + img.Image? image = img.decodeImage(await imageFile.readAsBytes()); + if (image == null) throw Exception('Unable to decode image'); + + int left = image.width, top = image.height, right = 0, bottom = 0; + + // Threshold for considering a pixel as part of the document (adjust as needed) + const int threshold = 240; + + for (int y = 0; y < image.height; y++) { + for (int x = 0; x < image.width; x++) { + final pixel = image.getPixel(x, y); + final luminance = img.getLuminance(pixel); + + if (luminance < threshold) { + left = x < left ? x : left; + top = y < top ? y : top; + right = x > right ? x : right; + bottom = y > bottom ? y : bottom; + } + } + } + + // Add a small padding + left = (left - 5).clamp(0, image.width); + top = (top - 5).clamp(0, image.height); + right = (right + 5).clamp(0, image.width); + bottom = (bottom + 5).clamp(0, image.height); + + return img.copyCrop(image, + x: left, y: top, width: right - left, height: bottom - top); + } + + Future rotateImageIfNeeded(File imageFile) async { + img.Image croppedDoc = await detectAndCropDocument(imageFile); + + // Check if the document is in portrait orientation + bool isPortrait = croppedDoc.height > croppedDoc.width; + + img.Image processedImage; + if (isPortrait) { + // Rotate the image by 90 degrees clockwise + processedImage = img.copyRotate(croppedDoc, angle: 90); + } else { + processedImage = croppedDoc; + } + + // Get temporary directory + final tempDir = await path_provider.getTemporaryDirectory(); + final tempPath = tempDir.path; + + // Create the processed image file + File processedFile = File('$tempPath/processed_image.jpg'); + await processedFile.writeAsBytes(img.encodeJpg(processedImage)); + + return processedFile; + } + + Future rotateImage(File imageFile) async { + // Read the image file + img.Image? image = img.decodeImage(await imageFile.readAsBytes()); + + if (image == null) return imageFile; + + // Rotate the image by 90 degrees clockwise + img.Image rotatedImage = img.copyRotate(image, angle: 90); + + // Get temporary directory + final tempDir = await path_provider.getTemporaryDirectory(); + final tempPath = tempDir.path; + + // Create the rotated image file + File rotatedFile = File('$tempPath/rotated_image.jpg'); + await rotatedFile.writeAsBytes(img.encodeJpg(rotatedImage)); + + return rotatedFile; + } + + choosImage(String link, String driverId, String imageType) async { + final pickedImage = await picker.pickImage( + source: ImageSource.gallery, + ); + + if (pickedImage == null) return; + + image = File(pickedImage.path); + + croppedFile = await ImageCropper().cropImage( + sourcePath: image!.path, + uiSettings: [ + AndroidUiSettings( + toolbarTitle: 'Cropper'.tr, + toolbarColor: AppColor.blueColor, + toolbarWidgetColor: AppColor.yellowColor, + initAspectRatio: CropAspectRatioPreset.original, + lockAspectRatio: false), + IOSUiSettings( + title: 'Cropper'.tr, + ), + ], + ); + + if (croppedFile == null) return; + + myImage = File(croppedFile!.path); + isloading = true; + update(); + + // Rotate the compressed image + // File rotatedImage = await rotateImage(compressedImage); + File processedImage = await rotateImageIfNeeded(File(croppedFile!.path)); + File compressedImage = await compressImage(processedImage); + print('link =$link'); + try { + await uploadImage( + compressedImage, + {'driverID': driverId, 'imageType': imageType}, + link, + ); + } catch (e) { + Get.snackbar('Image Upload Failed'.tr, e.toString(), + backgroundColor: AppColor.redColor); + } finally { + isloading = false; + update(); + } + } + + choosFace(String link, String imageType) async { + final pickedImage = await picker.pickImage( + source: ImageSource.camera, + preferredCameraDevice: CameraDevice.front, + ); + if (pickedImage != null) { + image = File(pickedImage.path); + isloading = true; + update(); +// Compress the image + File compressedImage = await compressImage(File(pickedImage.path)); + + // Save the picked image directly + // File savedImage = File(pickedImage.path); + print('link =$link'); + try { + await uploadImage( + compressedImage, + { + 'driverID': + box.read(BoxName.driverID) ?? box.read(BoxName.passengerID), + 'imageType': imageType + }, + link, + ); + } catch (e) { + Get.snackbar('Image Upload Failed'.tr, e.toString(), + backgroundColor: AppColor.redColor); + } finally { + isloading = false; + update(); + } + } + } + + uploadImage(File file, Map data, String link) async { + var request = http.MultipartRequest( + 'POST', + Uri.parse(link), //'https://ride.mobile-app.store/uploadImage1.php' + ); + + var length = await file.length(); + var stream = http.ByteStream(file.openRead()); + var multipartFile = http.MultipartFile( + 'image', + stream, + length, + filename: basename(file.path), + ); + String token = r(box.read(BoxName.jwt) ?? '').toString().split(Env.addd)[0]; + request.headers.addAll({ + 'Cache-Control': 'no-cache, no-store, must-revalidate', + 'Pragma': 'no-cache', + 'Expires': '0', + 'Authorization': 'Bearer $token', + 'X-Device-FP': box.read(BoxName.fingerPrint)?.toString() ?? '', + }); + // Set the file name to the driverID + request.files.add( + http.MultipartFile( + 'image', + stream, + length, + filename: '${box.read(BoxName.driverID)}.jpg', + ), + ); + data.forEach((key, value) { + request.fields[key] = value; + }); + var myrequest = await request.send(); + var res = await http.Response.fromStream(myrequest); + if (res.statusCode == 200) { + return jsonDecode(res.body); + } else { + throw Exception( + 'Failed to upload image: ${res.statusCode} - ${res.body}'); + } + } + + choosImagePicture(String link, String imageType) async { + final pickedImage = await picker.pickImage( + source: ImageSource.gallery, + // preferredCameraDevice: CameraDevice.rear, + // maxHeight: Get.height * .3, + // maxWidth: Get.width * .9, + // imageQuality: 100, + ); + image = File(pickedImage!.path); + + croppedFile = await ImageCropper().cropImage( + sourcePath: image!.path, + uiSettings: [ + AndroidUiSettings( + toolbarTitle: 'Cropper'.tr, + toolbarColor: AppColor.blueColor, + toolbarWidgetColor: AppColor.yellowColor, + initAspectRatio: CropAspectRatioPreset.original, + lockAspectRatio: false), + IOSUiSettings( + title: 'Cropper'.tr, + ), + ], + ); + myImage = File(pickedImage.path); + isloading = true; + update(); +// Save the cropped image + // File savedCroppedImage = File(croppedFile!.path); + File compressedImage = await compressImage(File(croppedFile!.path)); + print('link =$link'); + try { + await uploadImage( + compressedImage, + { + 'driverID': + box.read(BoxName.driverID) ?? box.read(BoxName.passengerID), + 'imageType': imageType + }, + link, + ); + } catch (e) { + Get.snackbar('Image Upload Failed'.tr, e.toString(), + backgroundColor: AppColor.redColor); + } finally { + isloading = false; + update(); + } + } + + uploadImagePicture(File file, Map data, String link) async { + var request = http.MultipartRequest( + 'POST', + Uri.parse(link), //'https://ride.mobile-app.store/uploadImage1.php' + ); + + var length = await file.length(); + var stream = http.ByteStream(file.openRead()); + var multipartFile = http.MultipartFile( + 'image', + stream, + length, + filename: basename(file.path), + ); + String token = r(box.read(BoxName.jwt) ?? '').toString().split(Env.addd)[0]; + request.headers.addAll({ + 'Authorization': 'Bearer $token', + 'X-Device-FP': box.read(BoxName.fingerPrint)?.toString() ?? '', + }); + // Set the file name to the driverID + request.files.add( + http.MultipartFile( + 'image', + stream, + length, + filename: '${box.read(BoxName.driverID)}.jpg', + ), + ); + data.forEach((key, value) { + request.fields[key] = value; + }); + var myrequest = await request.send(); + var res = await http.Response.fromStream(myrequest); + if (res.statusCode == 200) { + return jsonDecode(res.body); + } else { + throw Exception( + 'Failed to upload image: ${res.statusCode} - ${res.body}'); + } + } +} + +Future compressImage(File file) async { + final dir = await path_provider.getTemporaryDirectory(); + final targetPath = "${dir.absolute.path}/temp.jpg"; + + var result = await FlutterImageCompress.compressAndGetFile( + file.absolute.path, + targetPath, + quality: 70, + minWidth: 1024, + minHeight: 1024, + ); + + return File(result!.path); +} diff --git a/siro_service/lib/controller/functions/initilize.dart b/siro_service/lib/controller/functions/initilize.dart new file mode 100644 index 0000000..63ff0ee --- /dev/null +++ b/siro_service/lib/controller/functions/initilize.dart @@ -0,0 +1,43 @@ +import 'dart:convert'; + +import 'package:jwt_decoder/jwt_decoder.dart'; +import 'package:secure_string_operations/secure_string_operations.dart'; +import 'package:siro_service/controller/functions/crud.dart'; + +import '../../constant/box_name.dart'; +import '../../constant/char_map.dart'; +import '../../constant/info.dart'; +import '../../constant/links.dart'; +import '../../env/env.dart'; +import '../../main.dart'; +import '../../print.dart'; + +class AppInitializer { + List> links = []; + + // Future initializeApp() async { + // if (box.read(BoxName.jwt) == null) { + // await CRUD().getJWT(); + // } else { + // bool isTokenExpired = JwtDecoder.isExpired(X + // .r(X.r(X.r(box.read(BoxName.jwt), cn), cC), cs) + // .toString() + // .split(AppInformation.addd)[0]); + // if (isTokenExpired) { + // await CRUD().getJWT(); + // } + // } + // } + + getAIKey(String key1) async { + if (box.read(BoxName.firstTimeLoadKey) == null) { + var res = + await CRUD().get(link: Env.getapiKey, payload: {"keyName": key1}); + if (res != 'failure') { + var d = res['message']; + await storage.write(key: key1, value: d[key1].toString()); + await Future.delayed(Duration.zero); + } else {} + } + } +} diff --git a/siro_service/lib/controller/functions/launch.dart b/siro_service/lib/controller/functions/launch.dart new file mode 100644 index 0000000..26a7026 --- /dev/null +++ b/siro_service/lib/controller/functions/launch.dart @@ -0,0 +1,76 @@ +import 'package:url_launcher/url_launcher.dart'; +import 'dart:io'; + +void showInBrowser(String url) async { + if (await canLaunchUrl(Uri.parse(url))) { + launchUrl(Uri.parse(url)); + } else {} +} + +Future makePhoneCall(String phoneNumber) async { + final Uri launchUri = Uri( + scheme: 'tel', + path: phoneNumber, + ); + await launchUrl(launchUri); +} + +void launchCommunication( + String method, String contactInfo, String message) async { + String url; + + if (Platform.isIOS) { + switch (method) { + case 'phone': + url = 'tel:$contactInfo'; + break; + case 'sms': + url = 'sms:$contactInfo?body=${Uri.encodeComponent(message)}'; + break; + case 'whatsapp': + url = + 'https://api.whatsapp.com/send?phone=$contactInfo&text=${Uri.encodeComponent(message)}'; + break; + case 'email': + url = + 'mailto:$contactInfo?subject=Subject&body=${Uri.encodeComponent(message)}'; + break; + default: + return; + } + } else if (Platform.isAndroid) { + switch (method) { + case 'phone': + url = 'tel:$contactInfo'; + break; + case 'sms': + url = 'sms:$contactInfo?body=${Uri.encodeComponent(message)}'; + break; + case 'whatsapp': + // Check if WhatsApp is installed + final bool whatsappInstalled = + await canLaunchUrl(Uri.parse('whatsapp://')); + if (whatsappInstalled) { + url = + 'whatsapp://send?phone=$contactInfo&text=${Uri.encodeComponent(message)}'; + } else { + // Provide an alternative action, such as opening the WhatsApp Web API + url = + 'https://api.whatsapp.com/send?phone=$contactInfo&text=${Uri.encodeComponent(message)}'; + } + break; + case 'email': + url = + 'mailto:$contactInfo?subject=Subject&body=${Uri.encodeComponent(message)}'; + break; + default: + return; + } + } else { + return; + } + + if (await canLaunchUrl(Uri.parse(url))) { + await launchUrl(Uri.parse(url)); + } else {} +} diff --git a/siro_service/lib/controller/functions/security_helper.dart b/siro_service/lib/controller/functions/security_helper.dart new file mode 100644 index 0000000..673a0b1 --- /dev/null +++ b/siro_service/lib/controller/functions/security_helper.dart @@ -0,0 +1,32 @@ +import 'package:flutter/foundation.dart'; +import 'package:flutter/services.dart'; +import 'package:siro_service/print.dart'; + +class SecurityHelper { + static const platform = MethodChannel('com.service_intaleq/security'); + + static Future getAppSignature() async { + try { + final String? signature = await platform.invokeMethod('getAppSignature'); + final mode = kDebugMode ? 'DEBUG' : 'RELEASE'; + Log.print('----------------------------------------------------'); + Log.print('🚀 APP SIGNATURE HASH ($mode): $signature'); + Log.print('----------------------------------------------------'); + return signature; + + } on PlatformException catch (e) { + Log.print('❌ Failed to get app signature: ${e.message}'); + return null; + } + } + + static Future isDeviceRooted() async { + try { + final bool isRooted = await platform.invokeMethod('isNativeRooted'); + return isRooted; + } on PlatformException catch (e) { + Log.print('❌ Failed to check root: ${e.message}'); + return false; + } + } +} diff --git a/siro_service/lib/controller/local/local_controller.dart b/siro_service/lib/controller/local/local_controller.dart new file mode 100644 index 0000000..37ebe10 --- /dev/null +++ b/siro_service/lib/controller/local/local_controller.dart @@ -0,0 +1,102 @@ +import 'package:flutter/material.dart'; +import 'package:get/get.dart'; + +import '../../constant/box_name.dart'; +import '../../main.dart'; +import '../themes/themes.dart'; + +class LocaleController extends GetxController { + Locale? language; + String countryCode = ''; + + ThemeData appTheme = lightThemeEnglish; + + void changeLang(String langcode) { + Locale locale; + switch (langcode) { + case "ar": + locale = const Locale("ar"); + appTheme = lightThemeArabic; + box.write(BoxName.lang, 'ar'); + break; + case "en": + locale = const Locale("en"); + appTheme = lightThemeEnglish; + box.write(BoxName.lang, 'en'); + break; + case "tr": + locale = const Locale("tr"); + appTheme = lightThemeEnglish; + box.write(BoxName.lang, 'tr'); + break; + case "fr": + locale = const Locale("fr"); + appTheme = lightThemeEnglish; + box.write(BoxName.lang, 'fr'); + break; + case "it": + locale = const Locale("it"); + appTheme = lightThemeEnglish; + box.write(BoxName.lang, 'it'); + break; + case "de": + locale = const Locale("de"); + appTheme = lightThemeEnglish; + box.write(BoxName.lang, 'de'); + break; + case "el": + locale = const Locale("el"); + appTheme = lightThemeEnglish; + box.write(BoxName.lang, 'el'); + break; + case "es": + locale = const Locale("es"); + appTheme = lightThemeEnglish; + box.write(BoxName.lang, 'es'); + break; + case "fa": + locale = const Locale("fa"); + appTheme = lightThemeEnglish; + box.write(BoxName.lang, 'fa'); + break; + case "zh": + locale = const Locale("zh"); + appTheme = lightThemeEnglish; + box.write(BoxName.lang, 'zh'); + break; + case "ru": + locale = const Locale("ru"); + appTheme = lightThemeEnglish; + box.write(BoxName.lang, 'ru'); + break; + case "hi": + locale = const Locale("hi"); + appTheme = lightThemeEnglish; + box.write(BoxName.lang, 'hi'); + break; + default: + locale = Locale(Get.deviceLocale!.languageCode); + box.write(BoxName.lang, Get.deviceLocale!.languageCode); + appTheme = lightThemeEnglish; + break; + } + + box.write(BoxName.lang, langcode); + Get.changeTheme(appTheme); + Get.updateLocale(locale); + update(); + } + + @override + void onInit() { + String? storedLang = box.read(BoxName.lang); + if (storedLang == null) { + // Use device language if no language is stored + storedLang = Get.deviceLocale!.languageCode; + box.write(BoxName.lang, storedLang); + } + + changeLang(storedLang); + super.onInit(); + } +} diff --git a/siro_service/lib/controller/local/translations.dart b/siro_service/lib/controller/local/translations.dart new file mode 100644 index 0000000..7401ad4 --- /dev/null +++ b/siro_service/lib/controller/local/translations.dart @@ -0,0 +1,9187 @@ +import 'package:get/get.dart'; + +class MyTranslation extends Translations { + @override + Map> get keys => { + "ar": { + "red": "أحمر", + "green": "أخضر", + "blue": "أزرق", + "black": "أسود", + "white": "أبيض", + "yellow": "أصفر", + "purple": "أرجواني", + "orange": "برتقالي", + "pink": "وردي", "best driver": "أفضل سائق", + "brown": "بني", + 'Insert site of Owner': "أدخل موقع المالك", + 'Insert site of Driver': "أدخل موقع السائق", + 'Insert registration_date of Car': "أدخل تاريخ تسجيل السيارة", + 'Insert phone of Owner': "أدخل هاتف المالك", + 'Insert Name of Owner': "أدخل اسم المالك", + 'Insert year of Car': "أدخل سنة السيارة", + 'Insert registration_date of Driver': "", + 'Insert car_type of Driver': "أدخل نوع السيارة للسائق", + 'Insert car_model of Driver': "أدخل طراز السيارة للسائق", + 'Insert car_number of Driver': "أدخل رقم سيارة السائق", + "Add Car Who Wants to Work": "أضف السيارة التي ترغب في العمل", + "Add Driver Who Wants to Work": "إضافة سائق يرغب في العمل", + "Insert Name of Driver": "أدخل اسم السائق", + 'Insert national ID of Driver': "أدخل الرقم الوطني للسائق", + 'Insert phone of Driver': "أدخل رقم هاتف السائق", + "Insert license type of Driver": "أدخل نوع رخصة السائق", + 'Insert birth_date of Driver': "أدخل تاريخ ميلاد السائق", + "gray": "رمادي", + "cyan": "سماوي", + "magenta": "بنفسجي", + "lime": "ليموني", + "indigo": "نيلي", + "violet": "بنفسجي", + "raw gray": "رمادي ", + "gold": "ذهبي", + "silver": "فضي", + "teal": "تركوازي", + "navy": "كحلي", + "Eggplant": "باذنجان", + "Dark Red": "نبيتي", + "Sky Blue": "أزرق سماوي", + "Mocha": "موكا", + 'Drivers Activity': "نشاط السائقين", + 'Drivers phones not register': "هواتف السائقين غير مسجلة", + 'Register new driver': "تسجيل سائق جديد", + "Champagne": "شامبان", + 'Drivers waitting Register': "السائقون في انتظار التسجيل", + "Bronze": "برونزي", + "Maroon": "ماروني", + 'Drivers Want Register': "السائقون يريدون التسجيل", + "Capture an Image of Your Criminal Record": + "التقط صورة لسجلك الجنائي", + "IssueDate": "تاريخ الإصدار", + "Capture an Image of Your ID Document Back": + "التقاط صورة للجهة الخلفية من وثيقة الهوية الخاصة بك", + "Capture an Image of Your car license front": + "التقط صورة لرخصة سيارتك من الأمام", + "Capture an Image of Your ID Document Back": + "التقاط صورة للجهة الخلفية من وثيقة الهوية الخاصة بك", + "Capture an Image of Your ID Document front": + "التقاط صورة لوثيقة هويتك من الأمام", + "Capture an Image of Your car license back": + "التقاط صورة لرخصة سيارتك مرة أخرى", + "Capture an Image of Your Driver’s License": + "التقط صورة لرخصة القيادة الخاصة بك", + "Capture an Image of Your Driver License": "التقط صورة لرخصة قيادتك", + "Not found any image": "لم يتم العثور على أي صورة", + "Documents check": "التحقق من الوثائق", + "ID Documents Front": "الوثيقه الشخصية - الأمامية", + "Vehicle Details Front": "تفاصيل المركبة - الأمامية", + "Vehicle Details Back": "تفاصيل المركبة - الخلفية", + "Criminal Record": "السجل الجنائي", + "ID Documents Back": "الوثيقه الشخصية - الخلفية", + "Driver's License": "رخصة القيادة", + "Your driver’s license and/or car tax has expired. Please renew them before proceeding.": + "لقد انتهت صلاحية رخصة القيادة و/أو ضريبة السيارة الخاصة بك. يرجى تجديدها قبل المتابعة.", + "Your driver’s license has expired. Please renew it before proceeding.": + "لقد انتهت صلاحية رخصة القيادة الخاصة بك. يرجى تجديدها قبل المتابعة.", + "The national number on your driver’s license does not match the one on your ID document. Please verify and provide the correct documents.": + "الرقم الوطني على رخصة القيادة الخاصة بك لا يتطابق مع الرقم الموجود على مستند الهوية. يرجى التحقق وتقديم المستندات الصحيحة.", + "Welcome Drivers": "أهلاً بالسواق", + "License Categories": + "فئات الرخصة ", // Replace with actual translation + "Notes:": "ملاحظات:", // Replace with actual translation + "Enter notes here...": + "أدخل الملاحظات هنا...", // Replace with actual translation + "Call Driver": "اتصل بالسائق", // Replace with actual translation + "Success": "نجاح", // Replace with actual translation + "Changes saved successfully": + "تم حفظ التغييرات بنجاح", // Replace with actual translation + "Save Changes": "حفظ التغييرات", + "Passengers Cant Register": "الركاب لا يستطيعون التسجيل", + "Enter notes after call": "أدخل الملاحظات بعد المكالمة", + "Notes": "ملاحظات", + "Save Notes": "حفظ الملاحظات", + "Created At": "أنشئ في", + "Phone Number": "رقم الهاتف", + "Drivers Cant Register": "السائقون لا يستطيعون التسجيل", + "Plate Number": "رقم اللوحة", + "Make": "الشركة المصنعة", + "Model": "طراز", + "Year": "سنة الصنع", + "Color": "اللون", + "Fuel Type": "نوع الوقود", + "Displacement": "سعة المحرك", + "Registration Date": "تاريخ التسجيل", + "Expiration Date": "تاريخ انتهاء الصلاحية", + "License Information": "معلومات الرخصة", + "License Type": "نوع الرخصة", + "Card ID": "رقم بطاقة الهوية", + "Issue Date": "تاريخ الإصدار", + "Expiry Date": "تاريخ انتهاء الصلاحية", + "Categories": "التصنيفات", + "Bank Information": "معلومات البنك", + "Account Number": "رقم الحساب", + "Bank Code": "رمز البنك", + 'Driver Statistics': "إحصاءات السائق", + "Name (English)": "الاسم (باللغة الإنجليزية)", + "Name": "الاسم", + "Phone": "رقم الهاتف", + "Gender": "الجنس", + "Birthdate": "تاريخ الميلاد", + "National Number": "الرقم الوطني", + "Religion": "الدين", + "Multiplier": "مضاعف", + "Occupation": "المهنة", + "Education": "المؤهل العلمي", + "Total Rides": "إجمالي الرحلات", + "Average Rating": "التقييم المتوسط", + "Total Payments": "إجمالي المدفوعات", + "Wallet Balance": "رصيد المحفظة", + "Complaints": "الشكاوى", + "Scam Reports": "تقارير الاحتيال", + "Passengers Rated": "تقييمات الركاب", + "Avg Passenger Rating": "متوسط تقييم الركاب", + "Vehicle Information": "معلومات المركبة", + "VIN": "رقم التعريف الخاص بالمركبة (VIN)", + "insert Driver phone": "أدخل رقم هاتف السائق", + "Driver details by phone": "تفاصيل السائق حسب رقم الهاتف", + "insert passenger phone": "أدخل رقم هاتف الراكب", + 'passenger details by phone': "تفاصيل الراكب حسب رقم الهاتف", + 'Sefer Service': "خدمة سفر", + "Personal Information": "معلومات شخصية", + "Email": "البريد الإلكتروني", + "Employment": "عمل", + "Marital Status": "الحالة الاجتماعية", + "Latest Ride": "أحدث رحلة", + "Ride ID": "معرف الرحلة", + "Date": "تاريخ", + "Start Time": "وقت البدء", + "End Time": "وقت الانتهاء", + "Price": "السعر", + "Status": "حالة", + 'Driver Information': "معلومات عن السائق", + "Payment Method": "طريقة الدفع", + "Car Type": "نوع السيارة", + "Distance": "مسافة", + "Additional comments": "تعليقات إضافية.", + "Edit car plate": "تعديل لوحة السيارة", + "View complaint": "عرض الشكوى", + "I don't have a suitable vehicle": "ليس لدي مركبة مناسبة", + "I'll register when the app is fully launched": + "سأسجل عندما يتم إطلاق التطبيق بالكامل", + "I need more help understanding the app": + "أحتاج إلى المزيد من المساعدة لفهم التطبيق", + "My documents have expired": "وثائقي منتهية الصلاحية", + "I'm not ready yet": "لست جاهزًا بعد", + "Wallet Information": "معلومات المحفظة", + "Wallet Balance": "رصيد المحفظة", + "Last Payment Amount": "مبلغ آخر دفعة", + "Last Payment Method": "آخر طريقة دفع", + }, + "tr": { + "Sign In by Apple": "Apple'dan Giriş Yapın", + "Sign In by Google": "Google'dan Giriş Yapın", + "How do I request a ride?": "Nasıl yolculuk talebinde bulunabilirim?", + "Step-by-step instructions on how to request a ride through the Sefer app.": + "Sefer uygulaması aracılığıyla nasıl yolculuk talebinde bulunacağınıza ilişkin adım adım talimatlar.", + "What types of vehicles are available?": "Ne tür araçlar mevcut?", + "Sefer offers a variety of vehicle options to suit your needs, including economy, comfort, and luxury. Choose the option that best fits your budget and passenger count.": + "Sefer, ekonomiden konfora, lüksten ihtiyaçlarınıza uygun araç seçenekleri sunuyor. Bütçenize ve yolcu sayınıza en uygun seçeneği seçin.", + "How can I pay for my ride?": + "Yolculuğumun ücretini nasıl ödeyebilirim?", + "Sefer offers multiple payment methods for your convenience. Choose between cash payment or credit/debit card payment during ride confirmation.": + "Sefer, size kolaylık sağlamak için birden fazla ödeme yöntemi sunar. Yolculuk onayı sırasında nakit ödeme veya kredi/banka kartıyla ödeme arasında seçim yapın.", + "Can I cancel my ride?": "Yolculuğumu iptal edebilir miyim?", + "Yes, you can cancel your ride under certain conditions (e.g., before driver is assigned). See the Sefer cancellation policy for details.": + "Evet, belirli koşullar altında (örn. sürücü atanmadan önce) sürüşünüzü iptal edebilirsiniz. Ayrıntılar için Sefer iptal politikasına bakın.", + "Driver Registration & Requirements": "Sürücü Kaydı ve Gereksinimler", + "How can I register as a driver?": + "Sürücü olarak nasıl kayıt olabilirim?", + "What are the requirements to become a driver?": + "Sürücü olmanın şartları nelerdir?", + "Visit our website or contact Sefer support for information on driver registration and requirements.": + "Sürücü kaydı ve gereklilikler hakkında bilgi için web sitemizi ziyaret edin veya Sefer destek ile iletişime geçin.", + "How do I communicate with the other party (passenger/driver)?": + "Karşı tarafla (yolcu/sürücü) nasıl iletişim kurabilirim?", + "Sefer provides in-app chat functionality to allow you to communicate with your driver or passenger during your ride.": + "Sefer, sürüşünüz sırasında sürücünüz veya yolcunuzla iletişim kurmanıza olanak tanıyan uygulama içi sohbet işlevi sağlar.", + "What safety measures does Sefer offer?": + "Sefer hangi güvenlik önlemlerini sunuyor?", + "Sefer prioritizes your safety. We offer features like driver verification, in-app trip tracking, and emergency contact options.": + "Sefer güvenliğinizi ön planda tutar. Sürücü doğrulama, uygulama içi yolculuk takibi ve acil durum iletişim seçenekleri gibi özellikler sunuyoruz.", + "Frequently Questions": "Sıkça Sorulan Sorular", + "User does not exist.": "Kullanıcı yok.", + "We need your phone number to contact you and to help you.": + "Sizinle iletişim kurabilmemiz ve size yardımcı olabilmemiz için telefon numaranıza ihtiyacımız var.", + "You will recieve code in sms message": + "Kodu sms mesajıyla alacaksınız", + "Please enter": "Girin lütfen", + "We need your phone number to contact you and to help you receive orders.": + "Sizinle iletişime geçebilmemiz ve sipariş almanıza yardımcı olabilmemiz için telefon numaranıza ihtiyacımız var.", + "The full name on your criminal record does not match the one on your driver’s license. Please verify and provide the correct documents.": + "Sabıka kaydınızdaki tam ad, ehliyetinizdeki adla eşleşmiyor. Lütfen doğru belgeleri doğrulayın ve sağlayın.", + "The national number on your driver’s license does not match the one on your ID document. Please verify and provide the correct documents.": + "Ehliyetinizdeki ulusal numara ile kimlik belgenizdeki numara eşleşmiyor. Lütfen doğru belgeleri doğrulayın ve sağlayın.", + "Capture an Image of Your Criminal Record": + "Sabıka Kayıtlarınızın Görüntüsünü Yakalayın", + "IssueDate": "Düzenleme tarihi", + "Capture an Image of Your car license front": + "Araç lisansınızın ön yüzünün bir görüntüsünü yakalayın", + "Capture an Image of Your ID Document front": + "Kimlik Belgenizin ön yüzünün bir görüntüsünü yakalayın", + "NationalID": "Ulusal Kimliği", + "FullName": "Ad Soyad", + "InspectionResult": "Muayene sonucu", + "Criminal Record": "Sabıka kaydı", + "The email or phone number is already registered.": + "E-posta veya telefon numarası zaten kayıtlı.", + "To become a ride-sharing driver on the Sefer app, you need to upload your driver\"s license, ID document, and car registration document. Our AI system will instantly review and verify their authenticity in just 2-3 minutes. If your documents are approved, you can start working as a driver on the Sefer app. Please note, submitting fraudulent documents is a serious offense and may result in immediate termination and legal consequences.": + "Sefer uygulamasına araç paylaşımlı bir sürücü olmak için ehliyetinizi, kimlik belgenizi ve araç tescil belgenizi yüklemeniz gerekir. Yapay zeka sistemimiz, yalnızca 2-3 dakika içinde anında inceleyip orijinalliğini doğrulayacaktır. Onaylanırsanız Sefer uygulamasında şoför olarak çalışmaya başlayabilirsiniz. Sahte belge göndermenin ciddi bir suç olduğunu ve derhal işten çıkarılmaya ve yasal sonuçlara yol açabileceğini lütfen unutmayın.", + "Documents check": "Belge kontrolü", + "Driver's License": "Ehliyet", + "License Type": "Lisans türü", + "National Number": "Milli Numara", + "Name (Arabic)": "İsim (Arapça)", + "Name (English)": "İsim (İngilizce)", + "Address": "Adres", + "Issue Date": "Düzenleme tarihi", + "Expiry Date": "Son kullanma tarihi", + "License Categories": "Lisans Kategorileri", + "driver_license": "Ehliyet", + "Capture an Image of Your Driver License": + "Sürücü Belgenizin Bir Görüntüsünü Yakalayın", + "ID Documents Back": "Kimlik Belgeleri Geri", + "National ID": "Ulusal Kimliği", + "Occupation": "Meslek", + "Gender": "Cinsiyet", + "Religion": "Din", + "Marital Status": "Medeni hal", + "Full Name (Marital)": "Tam Ad (Medeni)", + "Expiration Date": "Son kullanma tarihi", + "Capture an Image of Your ID Document Back": + "Kimlik Belgenizin Bir Görüntüsünü Yakalayın", + "ID Documents Front": "Kimlik Belgeleri Ön Taraf", + "First Name": "İlk adı", + "CardID": "Kart kimliği", + "Full Name": "Ad Soyad", + "Vehicle Details Front": "Araç Detayları Ön", + "Plate Number": "Plaka numarası", + "Owner Name": "Sahip Adı", + "Vehicle Details Back": "Araç Detayları Geri", + "Make": "Yapmak", + "Model": "Modeli", + "Year": "Yıl", + "Chassis": "Şasi", + "Color": "Renk", + "Displacement": "Yer değiştirme", + "Fuel": "Yakıt", + "Tax Expiry Date": "Vergi Sona Erme Tarihi", + "Inspection Date": "Teftiş tarihi", + "Capture an Image of Your car license back": + "Araç ruhsatınızın bir görüntüsünü geri çekin", + "Capture an Image of Your Driver’s License": + "Ehliyetinizin Görüntüsünü Yakalayın", + "Sign in with Google for easier email and name entry": + "Daha kolay e-posta ve ad girişi için Google ile oturum açın", + "You will choose allow all the time to be ready receive orders": + "Sipariş almaya her zaman hazır olmaya izin vermeyi seçeceksiniz", + "Welcome to Sefer!": "Sefer'e hoş geldiniz!", + "Get to your destination quickly and easily.": + "Hedefinize hızlı ve kolay bir şekilde ulaşın.", + "Enjoy a safe and comfortable ride.": + "Güvenli ve konforlu bir sürüşün keyfini çıkarın.", + "Choose Language": "Dil seçiniz", + "Login": "Giriş yapmak", + "Pay with Wallet": "Cüzdan ile öde", + "Invalid MPIN": "Geçersiz MPIN", + "Invalid OTP": "Geçersiz OTP", + "Enter your email address": "E-posta adresinizi giriniz", + "Please enter Your Email.": "Lütfen E-postanızı girin.", + "Enter your phone number": "Telefon numaranızı girin", + "Please enter your phone number.": "Lütfen telefon numaranızı girin.", + "Please enter Your Password.": "Şifrenizi giriniz Lütfen.", + "Submit": "Göndermek", + "if you dont have account": "hesabınız yoksa", + "Register": "Kayıt olmak", + "Accept Ride's Terms & Review Privacy Notice": + "Ride Şartlarını Kabul Edin ve Gizlilik Bildirimini İnceleyin", + "By selecting 'I Agree' below, I have reviewed and agree to the Terms of Use and acknowledge the Privacy Notice. I am at least 18 years of age.": + "Aşağıda 'Kabul Ediyorum'u seçerek Kullanım Koşullarını inceleyip kabul ediyorum ve Gizlilik Bildirimini onaylıyorum. En az 18 yaşındayım.", + "I Agree": "Kabul ediyorum", + "First name": "İlk adı", + "Enter your first name": "İlk adınızı girin", + "Please enter your first name.": "Lütfen isminizi giriniz.", + "Last name": "Soy isim", + "Enter your last name": "Soyadınızı giriniz", + "Please enter your last name.": "Lütfen soyadınızı giriniz.", + "City": "Şehir", + "Please enter your City.": "Lütfen Şehrinizi giriniz.", + "Male": "Erkek", + "Female": "Dişi", + "Verify Email": "E-mail'i doğrula", + "We sent 5 digit to your Email provided": + "Sağladığınız E-postanıza 5 haneli mesaj gönderdik", + "5 digit": "5 haneli", + "Send Verification Code": "Doğrulama kodu Gönder", + "Your Ride Duration is": "Yolculuk Süreniz:", + "You will be thier in": "Sen orada olacaksın", + "You trip distance is": "Seyahat mesafeniz", + "Fee is": "Ücret:", + "From :": "İtibaren :", + "To :": "İle :", + "Add Promo": "Promosyon Ekle", + "Confirm Selection": "Seçimi Onayla", + "distance is": "mesafe", + "duration is": "süre", + "I don't need a ride anymore": "Artık arabaya ihtiyacım yok", + "I was just trying the application": "Sadece uygulamayı deniyordum", + "No driver accepted my request": + "Hiçbir sürücü isteğimi kabul etmedi", + "I added the wrong pick-up/drop-off location": + "Yanlış teslim alma/bırakma konumunu ekledim", + "I don't have a reason": "bir nedenim yok", + "Other": "Diğer", + "Can we know why you want to cancel Ride ?": + "Ride'ı neden iptal etmek istediğinizi öğrenebilir miyiz?", + "Cancel Ride": "Sürüşü İptal Et", + "Add Payment Method": "Ödeme yöntemi ekle", + "Your Wallet balance is": "Cüzdan bakiyeniz", + "Ride Wallet": "Ride Cüzdanı", + "Payment Method": "Ödeme yöntemi", + "Type here Place": "Buraya yazın Yer", + "Are You sure to ride to": "Arabayla gideceğinden emin misin?", + "Confirm": "Onaylamak", + "Back": "Geri", + "You are Delete": "Sen Sil", + "Deleted": "silindi", + "You Dont Have Any places yet !": "Henüz Yeriniz Yok!", + "Favorite Places": "Favori yerler", + "From : Current Location": "Nereden : Mevcut Konum", + "Where to": "Nereye", + "Notifications": "Bildirimler", + "Profile": "Profil", + "Home": "Ev", + "My Cared": "Benim Bakımım", + "Add Card": "Kart ekle", + "Add Credit Card": "Kredi Kartı Ekle", + "Please enter the cardholder name": + "Lütfen kart sahibinin adını girin", + "Please enter the expiry date": "Lütfen son kullanma tarihini girin", + "Please enter the CVV code": "Lütfen CVV kodunu girin", + "Go To Favorite Places": "Favori Yerlere Git", + "Go to this Target": "Bu Hedefe git", + "My Profile": "Benim profilim", + "Sign Out": "Oturumu Kapat", + "Home Page": "Ana Sayfa", + "Are you want to go to this site": "Bu siteye gitmek ister misin", + "MyLocation": "Benim konumum", + "my location": "benim konumum", + "Target": "Hedef", + "Update": "Güncelleme", + "You Should choose rate figure": "Oran rakamını seçmelisiniz", + "Login Captin": "Giriş Kaptan", + "Register Captin": "Captin'i kaydedin", + "Send Verfication Code": "Doğrulama Kodunu Gönder", + "KM": "KM", + "End Ride": "Sürüşü Sonlandır", + "Minute": "Dakika", + "Go to passenger Location now": "Şimdi yolcu konumuna gidin", + "Duration of the Ride is": "Sürüş Süresi:", + "Distance of the Ride is": "Sürüş Mesafesi:", + "Name of the Passenger is": "Yolcunun Adı:", + "Hello this is Captain": "Merhaba ben Kaptan", + "Start the Ride": "Yolculuğu Başlat", + "Please Wait If passenger want To Cancel!": + "Yolcu İptal Etmek İstiyorsa Lütfen Bekleyiniz!", + "Total Duration:": "Toplam Süre:", + "Active Duration:": "Aktif Süre:", + "Waiting for Captin ...": "Kaptan'ı bekliyorum...", + "Age is": "Yaş", + "Rating is": "Derecelendirme:", + "to arrive you.": "sana varmak için.", + "Order History": "Sipariş Geçmişi", + "My Wallet": "Cüzdanım", + "Tariff": "Tarife", + "Settings": "Ayarlar", + "Feed Back": "Geri bildirim", + "Promos": "Promosyonlar", + "Please enter a valid 16-digit card number": + "Lütfen 16 haneli geçerli bir kart numarası girin", + "Add Phone": "Telefon Ekle", + "Please enter a phone number": "Lütfen bir telefon numarası girin", + "You dont Add Emergency Phone Yet!": + "Henüz Acil Durum Telefonunu Eklemediniz!", + "You will arrive to your destination after": + "Hedefinize sonra varacaksınız", + "You can cancel Ride now": "Sürüşü şimdi iptal edebilirsiniz", + "You Can cancel Ride After Captain did not come in the time": + "Kaptan zamanında gelmediğinde Sürüşü iptal edebilirsiniz", + "If you in Car Now. Press Start The Ride": + "Şimdi Arabadaysanız. Yolculuğu Başlat'a basın", + "You Dont Have Any amount in": "Herhangi Bir Tutarınız Yok", + "Wallet!": "Cüzdan!", + "You Have": "Var", + "Save Credit Card": "Kredi Kartını Kaydet", + "Show Promos": "Promosyonları Göster", + "10 and get 4% discount": "10 ve %4 indirim kazanın", + "20 and get 6% discount": "20 ve %6 indirim kazanın", + "40 and get 8% discount": "40 ve %8 indirim kazanın", + "100 and get 11% discount": "100 ve %11 indirim kazanın", + "Pay with Your PayPal": "PayPal'ınızla ödeme yapın", + "You will choose one of above !": + "Yukarıdakilerden birini seçeceksiniz!", + "Cancel": "İptal etmek", + "Delete My Account": "Hesabımı sil", + "Edit Profile": "Profili Düzenle", + "Name": "İsim", + "Update Gender": "Cinsiyeti Güncelle", + "Education": "Eğitim", + "Update Education": "Eğitimi Güncelle", + "Employment Type": "İstihdam Tipi", + "SOS Phone": "Acil Durum Telefonu", + "High School Diploma": "Lise diploması", + "Associate Degree": "Ön lisans", + "Bachelor's Degree": "Lisans", + "Master's Degree": "Yüksek lisans", + "Doctoral Degree": "Doktora derecesi", + "Promos For today": "Bugün için Promosyonlar", + "Copy this Promo to use it in your Ride!": + "Ride'ınızda kullanmak için bu Promosyonu kopyalayın!", + "To change some Settings": "Bazı Ayarları değiştirmek için", + "To change Language the App": "Uygulamanın Dilini değiştirmek için", + "Order Request Page": "Sipariş Talep Sayfası", + "Rouats of Trip": "Gezi Rotaları", + "Passenger Name is": "Yolcu Adı:", + "Total From Passenger is": "Yolcu Toplamı (şimdiki değeri)", + "Duration To Passenger is": "Yolcuya Kalma Süresi:", + "Distance To Passenger is": "Yolcuya Uzaklık (şimdiki değeri)", + "Total For You is": "Sizin İçin Toplam:", + "Distance is": "Mesafe:", + "KM": "KM", + "Duration of Trip is": "Seyahat Süresi:", + "Minutes": "dakika", + "Apply Order": "Siparişi Uygula", + "Refuse Order": "Siparişi Reddet", + "Rate Captain": "Oran Kaptanı", + "Enter your Note": "Notunuzu girin", + "Type something...": "Birşeyler yaz...", + "Submit rating": "Derecelendirmeyi gönder", + "Rate Passenger": "Ücretli Yolcu", + "Ride Summary": "Sürüş Özeti", + "welcome_message": "karşılama mesajı", + "app_description": "uygulama_açıklaması", + "get_to_destination": "get_to_destination", + "get_a_ride": "get_a_ride", + "safe_and_comfortable": "güvenli_ve_rahat", + "committed_to_safety": "commit_to_safety", + "Driver Applied the Ride for You": + "Sürücü Sürüşü Sizin Yerinize Uyguladı", + "Show latest promo": "En son promosyonu göster", + "Cancel Trip": "Seyahati İptal Et", + "Passenger Cancel Trip": "Yolcu Seyahat İptali", + "Please stay on the picked point.": "Lütfen seçilen noktada kalın.", + "Trip is Begin": "Yolculuk Başlıyor", + "Hi ,I will go now": "merhaba ben şimdi gideceğim", + "Passenger come to you": "Yolcu sana gelsin", + "Hi ,I Arrive your site": "Merhaba sitenize geldim", + "Driver Finish Trip": "Sürücü Bitirme Yolculuğu", + "you will pay to Driver": "Sürücüye ödeme yapacaksınız", + "Driver Cancel Your Trip": "Sürücü Yolculuğunuzu İptal Edin", + "you will pay to Driver you will be pay the cost of driver time look to your SEFER Wallet": + "Sürücüye ödeme yapacaksınız Sürücü süresinin maliyetini siz ödeyeceksiniz SEFER Cüzdanınıza bakın", + "I will go now": "şimdi gideceğim", + "You Have Tips": "İpuçlarınız Var", + "tips": "ipuçları", + "Total is": "Toplam:", + "الْمَجْمُوع هُوَ": "الْمَجْمُوع هُوَ", + "No,I want": "Hayır, istiyorum", + "Your fee is": "Ücretiniz", + "Do you want to pay Tips for this Driver": + "Bu Sürücü için İpuçları ödemek ister misiniz?", + "Tip is": "İpucu:", + "Tip is": "İpucu:", + "Camera Access Denied.": "Kamera erişimi reddedildi.", + "Open Settings": "Ayarları aç", + "GPS Required Allow !.": "GPS Gerekli İzin Ver!.", + "Your Account is Deleted": "Hesabınız Silindi", + "Are you sure to delete your account?": + "Hesabınızı sildiğinizden emin misiniz?", + "Your data will be erased after 2 weeks": + "Verileriniz 2 hafta sonra silinecek", + "And you will can't return to use app after 1 month": + "Ve 1 ay sonra uygulamayı kullanmaya geri dönemezsiniz", + "وَلَن تَسْتَطِيع اسْتِخْدَام التَّطْبِيق مَرَّة أُخْرَى بَعْد شَهْر": + "وَلَن تَسْتَطِيع اسْتِخْدَام التَّطْبِيق مَرَّة أُخْرَى بَعْد شَهْر", + "Enter Your First Name": "İlk adınızı girin", + "Are you Sure to LogOut?": "Oturumu Kapatacağınızdan Emin misiniz?", + "Email Wrong": "E-posta Yanlış", + "Email you inserted is Wrong.": "Eklediğiniz e-posta Yanlış.", + "You have finished all times": "Tüm zamanları bitirdin", + "if you want help you can email us here": + "yardım istiyorsanız bize buradan e-posta gönderebilirsiniz", + "Thanks": "Teşekkürler", + "Email Us": "Bize e-posta gönderin", + "I cant register in your app in face detection": + "Yüz algılamada uygulamanıza kayıt olamıyorum", + "Hi": "MERHABA", + "No face detected": "Yüz algılanmadı", + "Image detecting result is": "Görüntü algılama sonucu:", + "from 3 times Take Attention": "3 kereden itibaren Dikkat Edin", + "Be sure for take accurate images please": + "Doğru fotoğraflar çektiğinizden emin olun lütfen", + "You have": "Var", + "لَدَيْك": "لَدَيْك", + "image verified": "resim doğrulandı", + "Next": "Sonraki", + "There is no help Question here": "Burada yardım sorusu yok", + "Call End": "Çağrı Sonlandırma", + "You dont have Points": "Puanınız yok", + "You Are Stopped For this Day !": "Bu Günlük Durduruldunuz!", + "You must be charge your Account": + "Hesabınızdan ücret alınması gerekir", + "You Refused 3 Rides this Day that is the reason": + "Bu Gün 3 Sürüşü Reddettiniz, nedeni bu", + "See you Tomorrow!": "Yarın görüşürüz!", + "لِقَائِنَا غَدًا!": "لِقَائِنَا غَدًا!", + "Recharge my Account": "Hesabımı Yeniden Yükle", + "Ok , See you Tomorrow": "Tamam yarın görüşürüz", + "You are Stopped": "Durduruldun", + "Connected": "Bağlı", + "Not Connected": "Bağlı değil", + "Your are far from passenger location": + "Yolcu konumundan uzaktasınız", + "go to your passenger location before": "önce yolcu konumunuza gidin", + "Passenger cancel trip": "Yolcu seyahati iptal etti", + "يُلْغِي الرَّاكِب الرِّحْلَة": "يُلْغِي الرَّاكِب الرِّحْلَة", + "You will get cost of your work for this trip": + "Bu yolculukta yaptığınız işin maliyetini alacaksınız", + "in your wallet": "cüzdanında", + "you gain": "kazandın", + "Order Cancelled": "Sipariş iptal edildi", + "Order Cancelled by Passenger": + "Sipariş Yolcu Tarafından İptal Edildi", + "Success": "Başarı", + "Feedback data saved successfully": + "Geri bildirim verileri başarıyla kaydedildi", + "No Promo for today .": "Bugün için Promosyon Yok.", + "Select your destination": "Hedefinizi seçin", + "Search for your Start point": "Başlangıç ​​noktanızı arayın", + "Search for waypoint": "Yol noktası ara", + "Current Location": "Mevcut konum", + "Add Location 1": "Konum Ekle 1", + "You must Verify email !.": "E-postayı doğrulamanız gerekir!", + "Cropper": "Ekin", + "Saved Sucssefully": "Başarıyla Kaydedildi", + "Select Date": "Tarih seç", + "Birth Date": "Doğum günü", + "Ok": "Tamam", + "the 500 points equal 30 JOD": "500 puan 30 JOD'a eşittir", + "the 500 points equal 30 JOD for you": + "500 puan sizin için 30 JOD'a eşittir", + "So go and gain your money": "Öyleyse git ve paranı kazan", + "فَاسْتَحِقَّ فُلُوسَك وَاكْسِب النِّقَاط": + "فَاسْتَحِقَّ فُلُوسَك وَاكْسِب النِّقَاط", + "token updated": "belirteç güncellendi", + "Add Location 2": "Konum Ekle 2", + "Add Location 3": "Konum Ekle 3", + "Add Location 4": "Konum Ekle 4", + "Waiting for your location": "Konumunuzu bekliyorum", + "Search for your destination": "Hedefinizi arayın", + "Hi! This is": "MERHABA! Bu", + "I am using": "Ben kullanıyorum", + "to ride with": "birlikte binmek", + "as the driver.": "sürücü olarak.", + "is driving a": "bir araba sürüyor", + "with license plate": "plakalı", + "I am currently located at": "şu anda bulunduğum yer:", + "Please go to Car now": "Lütfen şimdi Arabaya gidin", + "If you need to reach me, please contact the driver directly at": + "Bana ulaşmanız gerekiyorsa lütfen doğrudan sürücüyle iletişime geçin:", + "No Car or Driver Found in your area.": + "Bölgenizde Araç veya Sürücü Bulunamadı.", + "Please Try anther time": "Lütfen başka zaman deneyin", + "There no Driver Aplly your order sorry for that": + "Siparişinizi Uygulayacak Sürücü Yok Bunun için özür dileriz", + "Trip Cancelled": "Seyahat İptal Edildi", + "The Driver Will be in your location soon .": + "Sürücü yakında bulunduğunuz yerde olacak.", + "The distance less than 500 meter.": "Mesafe 500 metreden az.", + "Promo End !": "Promosyon Sonu!", + "There is no notification yet": "Henüz bir bildirim yok", + "Use Touch ID or Face ID to confirm payment": + "Ödemeyi onaylamak için Touch ID veya Face ID'yi kullanın", + "Contact us for any questions on your order.": + "Siparişinizle ilgili sorularınız için bizimle iletişime geçin.", + "Pyament Cancelled .": "Ödeme İptal Edildi.", + "type here": "buraya yaz", + "Scan Driver License": "Tarama Sürücüsü Lisansı", + "Please put your licence in these border": + "Lütfen ehliyetinizi bu sınıra koyun", + "Camera not initialized yet": "Kamera henüz başlatılmadı", + "Take Image": "Resim Çek", + "AI Page": "Yapay Zeka Sayfası", + "Take Picture Of ID Card": "Kimlik Kartının Fotoğrafını Çekin", + "Take Picture Of Driver License Card": + "Ehliyet Kartının Fotoğrafını Çekin", + "We are process picture please wait": + "Resim işliyoruz lütfen bekleyin", + "There is no data yet.": "Henüz veri yok.", + "Name :": "İsim :", + "Drivers License Class:": "Sürücü Belge Sınıfı:", + "Document Number:": "Belge Numarası:", + "Address:": "Adres:", + "Height:": "Yükseklik:", + "Expiry Date:": "Son kullanma tarihi:", + "Date of Birth:": "Doğum tarihi:", + "You can\"t continue with us .": "Bizimle devam edemezsin.", + "You should renew Driver license": + "Sürücü ehliyetini yenilemelisiniz", + "Detect Your Face": "Yüzünüzü Algılayın", + "Go to next step": "Sonraki adıma git", + "scan Car License.": "Araba Lisansını tarayın.", + "aاسْتِخْرَاج رُخْصَة السَّيَّارَة.": + "aاسْتِخْرَاج رُخْصَة السَّيَّارَة.", + "Name in arabic": "Arapça isim", + "Drivers License Class": "Ehliyet Sınıfı", + "Date of Birth": "Doğum tarihi", + "Age": "Yaş", + "Lets check Car license": "Araba ruhsatını kontrol edelim", + "Car Kind": "Araba Türü", + "Car Plate": "Araç plakası", + "Lets check License Back Face": "Lisansın Arka Yüzünü kontrol edelim", + "Car License Card": "Araç Ruhsat Kartı", + "No image selected yet": "Henüz resim seçilmedi", + "Made :": "Yapılmış :", + "model :": "modeli:", + "VIN :": "VIN:", + "year :": "yıl :", + "ُExpire Date": "son kullanma tarihi", + "Login Driver": "Oturum Açma Sürücüsü", + "Password must br at least 6 character.": + "Şifre en az 6 karakterden oluşmalıdır.", + "if you don\"t have account": "hesabınız yoksa", + "Here recorded trips audio": "Burada kaydedilen gezilerin sesi", + "Register as Driver": "Sürücü olarak kaydolun", + "Privacy Notice": "Gizlilik Bildirimi", + "By selecting 'I Agree' below, I have reviewed and agree to the Terms of Use and acknowledge the": + "Aşağıda 'Kabul Ediyorum'u seçerek Kullanım Koşullarını inceledim, kabul ediyorum ve şunları onaylıyorum:", + ". I am at least 18 years of age.": ". En az 18 yaşındayım.", + "Log Out Page": "Oturumu Kapat Sayfası", + "Log Off": "Oturumu Kapat", + "Register Driver": "Sürücüyü Kaydet", + "Verify Email For Driver": "Sürücü E-Postasını Doğrulayın", + "Admin DashBoard": "Yönetici Kontrol Paneli", + "Your name": "Adınız", + "your ride is applied": "yolculuğunuz uygulandı", + "Your password": "Şifreniz", + "H and": "El", + "LE": "LE", + "JOD": "JOD", + "m": "M", + "We search nearst Driver to you": "Size en yakın sürücüyü arıyoruz", + "please wait till driver accept your order": + "lütfen sürücü siparişinizi kabul edene kadar bekleyin", + "No accepted orders? Try raising your trip fee to attract riders.": + "Kabul edilen emir yok mu? Yolcuların ilgisini çekmek için yolculuk ücretinizi artırmayı deneyin.", + "You should select one": "Birini seçmelisin", + "The driver accept your order for": + "Sürücü siparişinizi kabul ediyor", + "Increase Fee": "Ücreti Artır", + "No, thanks": "Hayır, teşekkürler", + "The driver on your way": "Sürücü yolda", + "Total price from": "Toplam fiyat", + "Order Details Speed": "Sipariş Detayları Hız", + "Order Applied": "Sipariş Uygulandı", + "accepted your order": "siparişini kabul ettim", + "We regret to inform you that another driver has accepted this order.": + "Başka bir sürücünün bu siparişi kabul ettiğini üzülerek bildiririz.", + "Selected file:": "Seçilen dosya:", + "Your trip cost is": "Seyahat maliyetiniz", + "this will delete all files from your device": + "bu, cihazınızdaki tüm dosyaları silecektir", + "you have a negative balance of": "negatif bakiyeniz var", + "in your": "senin içinde", + "Exclusive offers and discounts always with the Sefer app": + "Sefer uygulamasıyla her zaman özel kampanyalar ve indirimler", + "Please go to Car Driver": "Lütfen Araba Sürücüsü'ne gidin", + "wallet due to a previous trip.": + "önceki bir yolculuktan dolayı cüzdan.", + "Submit Question": "Soru Gönder", + "Please enter your Question.": "Lütfen Sorunuzu girin.", + "Help Details": "Yardım Ayrıntıları", + "No trip yet found": "Henüz gezi bulunamadı", + "No Response yet.": "Henüz yanıt yok.", + "You Earn today is": "Bugün Kazanacaksınız", + "You Have in": "Sen varsın", + "Total points is": "Toplam puan:", + "Total Connection Duration:": "Toplam Bağlantı Süresi:", + "H and": "El", + "Passenger name :": "Yolcu adı :", + "Cost Of Trip IS": "Seyahat Maliyeti IS", + "Arrival time": "Varış zamanı", + "arrival time to reach your point": + "varış noktanıza ulaşmak için varış zamanı", + "For Speed and Delivery trips, the price is calculated dynamically. For Comfort trips, the price is based on time and distance": + "Hızlı ve Teslimat seferlerinde fiyat dinamik olarak hesaplanır. Konfor gezileri için fiyat, zamana ve mesafeye bağlıdır", + "Hello this is Driver": "Merhaba ben Sürücü", + "Is the Passenger in your Car ?": "Yolcu Arabanızda mı?", + "Please wait for the passenger to enter the car before starting the trip.": + "Lütfen yolculuğa başlamadan önce yolcunun araca binmesini bekleyin.", + "No ,still Waiting.": "Hayır, hala bekliyorum.", + "I arrive you": "sana varıyorum", + "I Arrive your site": "Sitenize Geliyorum", + "You are not in near to passenger location": + "Yolcu konumuna yakın değilsiniz", + "please go to picker location exactly": + "lütfen tam olarak seçici konuma gidin", + "You Can Cancel Trip And get Cost of Trip From": + "Seyahati İptal Edebilir ve Seyahat Ücretini Şu Adresten Alabilirsiniz:", + "Are you sure to cancel?": "İptal edeceğinizden emin misiniz?", + "Yes": "Evet", + "Insert Emergincy Number": "Acil Durum Numarasını Girin", + "Best choice for comfort car and flexible route and stops point": + "Konforlu araç ve esnek rota ve durak noktaları için en iyi seçim", + "Insert": "Sokmak", + "This is for delivery or a motorcycle.": + "Bu teslimat veya motosiklet içindir.", + "This trip goes directly from your starting point to your destination for a fixed price. The driver must follow the planned route": + "Bu yolculuk, sabit bir ücret karşılığında doğrudan başlangıç ​​noktanızdan varış noktanıza gider. Sürücü planlanan rotayı takip etmelidir", + "You can decline a request without any cost": + "Bir isteği hiçbir ücret ödemeden reddedebilirsiniz", + "Perfect for adventure seekers who want to experience something new and exciting": + "Yeni ve heyecan verici bir şey deneyimlemek isteyen macera arayanlar için mükemmel", + "My current location is:": "Şu anki konumum:", + "and I have a trip on": "ve bir gezim var", + "App with Passenger": "Yolculu Uygulama", + "مع الراكب": "مع الراكب", + "You will be pay the cost to driver or we will get it from you on next trip": + "Masrafı şoföre ödeyeceksiniz veya bir sonraki yolculukta sizden alacağız", + "Trip has Steps": "Seyahatin Adımları Var", + "Distance from Passenger to destination is": + "Yolcu ile varış noktasına olan mesafe:", + "price is": "fiyatı", + "This ride type does not allow changes to the destination or additional stops": + "Bu yolculuk türü, varış noktasında veya ek duraklarda değişiklik yapılmasına izin vermez", + "This price may be changed": "Bu fiyat değişebilir", + "No SIM card, no problem! Call your driver directly through our app. We use advanced technology to ensure your privacy.": + "SIM kart yok, sorun yok! Sürücünüzü doğrudan uygulamamız aracılığıyla arayın. Gizliliğinizi sağlamak için ileri teknoloji kullanıyoruz.", + "This ride type allows changes, but the price may increase": + "Bu yolculuk türü değişikliklere izin verir ancak fiyat artabilir", + "message From passenger": "Yolcudan mesaj", + "Select one message": "Bir mesaj seçin", + "My location is correct. You can search for me using the navigation app": + "Konumum doğru. Navigasyon uygulamasını kullanarak beni arayabilirsiniz", + "I'm waiting for you": "Seni bekliyorum", + "Hello, I'm at the agreed-upon location": + "Merhaba anlaştığımız yerdeyim", + "We noticed the speed is exceeding 100 km/h. Please slow down for your safety. If you feel unsafe, you can share your trip details with a contact or call the police using the red SOS button.": + "Hızın 100 km/saati aştığını fark ettik. Güvenliğiniz için lütfen yavaşlayınız. Kendinizi güvende hissetmiyorsanız seyahat bilgilerinizi bir kişiyle paylaşabilir veya kırmızı SOS butonunu kullanarak polisi arayabilirsiniz.", + "Warning: Speeding detected!": "Uyarı: Hızlanma algılandı!", + "Please help! Contact me as soon as possible.": + "Lütfen yardım et! En kısa sürede benimle iletişime geçin.", + "Share Trip Details": "Seyahat Detaylarını Paylaşın", + "Car Plate is": "Araba Plakası (şimdiki değeri)", + "the 300 points equal 300 L.E for you": + "300 puan sizin için 300 L.E'ye eşittir", + "So go and gain your money": "Öyleyse git ve paranı kazan", + "the 300 points equal 300 L.E": "300 puan 300 L.E'ye eşittir", + "The payment was not approved. Please try again.": + "Ödeme onaylanmadı. Lütfen tekrar deneyin.", + "Payment Failed": "Ödeme başarısız", + "Error": "Hata", + "An error occurred during the payment process.": + "Ödeme işlemi sırasında bir hata oluştu.", + "The payment was approved.": "Ödeme onaylandı.", + "Payment Successful": "Ödeme başarılı", + "No ride found yet": "Henüz araç bulunamadı", + "Accept Order": "Siparişi Kabul Et", + "reject your order.": "siparişinizi reddedin.", + "Bottom Bar Example": "Alt Çubuk Örneği", + "Driver phone": "Sürücü telefonu", + "Statistics": "İstatistik", + "Origin": "Menşei", + "Destination": "Varış noktası", + "Driver Name": "Sürücü adı", + "Driver Car Plate": "Sürücü Araç Plakası", + "Available for rides": "Sürüşler için kullanılabilir", + "Scan Id": "Tarama Kimliği", + "Camera not initilaized yet": "Kamera henüz başlatılmadı", + "Scan ID MklGoogle": "Tarama Kimliği MklGoogle", + "Language": "Dil", + "Jordan": "Ürdün", + "USA": "Amerika Birleşik Devletleri", + "Egypt": "Mısır", + "Turkey": "Türkiye", + "Saudi Arabia": "Suudi Arabistan", + "Qatar": "Katar", + "Bahrain": "Bahreyn", + "Kuwait": "Kuveyt", + "But you have a negative salary of": "Ama negatif maaşınız var", + "Promo Code": "Promosyon kodu", + "Your trip distance is": "Seyahat mesafeniz", + "Enter promo code": "Promosyon kodunu girin", + "You have promo!": "Promosyonunuz var!", + "Cost Duration": "Maliyet Süresi", + "Duration is": "Süre:", + "Leave": "Ayrılmak", + "Join": "Katılmak", + "You Should be select reason.": "Sebep seçmelisiniz.", + "\$": "\$", + "Waiting for Driver ...": "Sürücüyü Bekliyoruz...", + "Latest Recent Trip": "En Son Son Seyahat", + "from your list": "listenizden", + "Do you want to change Work location": + "İş yerini değiştirmek istiyor musunuz", + "Do you want to change Home location": + "Ev konumunu değiştirmek istiyor musunuz?", + "We Are Sorry That we dont have cars in your Location!": + "Bulunduğunuz yerde arabamız olmadığı için üzgünüz!", + "Choose from Map": "Haritadan Seç", + "Pick your ride location on the map - Tap to confirm": + "Sürüş konumunuzu haritadan seçin - Onaylamak için dokunun", + "To Work": "Çalışmak", + "Are you want to go this site": "Bu siteye gitmek ister misin", + "Closest & Cheapest": "En Yakın & En Ucuz", + "Work Saved": "Çalışma Kaydedildi", + "Sefer is the ride-hailing app that is safe, reliable, and accessible.": + "Sefer güvenli, güvenilir ve erişilebilir bir araç çağırma uygulamasıdır.", + "With Sefer, you can get a ride to your destination in minutes.": + "Sefer ile dakikalar içerisinde gideceğiniz yere araçla ulaşabilirsiniz.", + "Sefer is committed to safety, and all of our captains are carefully screened and background checked.": + "Sefer güvenliğe önem vermektedir ve tüm kaptanlarımız dikkatle incelenmekte ve özgeçmişleri kontrol edilmektedir.", + "To Home": "Eve", + "Home Saved": "Ana Sayfa Kaydedildi", + "Destination selected": "Hedef seçildi", + "Now select start pick": "Şimdi başlangıç ​​seçimini seçin", + "Pick from map": "Haritadan seç", + "Click here point": "Buraya tıklayın", + "No Car in your site. Sorry!": "Sitenizde Araba Yok. Üzgünüm!", + "Nearest Car for you about": "Size En Yakın Araç Hakkında", + "N/A": "Yok", + "From :": "İtibaren :", + "Get Details of Trip": "Seyahat Detaylarını Alın", + "If you want add stop click here": + "Durak eklemek istiyorsanız buraya tıklayın", + "Driver": "Sürücü", + "Where you want go": "Nereye gitmek istiyorsun", + "My Card": "Benim kartım", + "Start Record": "Kaydı Başlat", + "Wallet": "Cüzdan", + "History of Trip": "Gezinin Tarihi", + "Helping Center": "Yardım Merkezi", + "Record saved": "Kayıt kaydedildi", + "Trips recorded": "Geziler kaydedildi", + "Select Your Country": "Ülkeni seç", + "To ensure you receive the most accurate information for your location, please select your country below. This will help tailor the app experience and content to your country.": + "Bulunduğunuz yere ilişkin en doğru bilgileri aldığınızdan emin olmak için lütfen aşağıdan ülkenizi seçin. Bu, uygulama deneyiminin ve içeriğinin ülkenize göre uyarlanmasına yardımcı olacaktır.", + "Are you sure to delete recorded files": + "Kayıtlı dosyaları sildiğinizden emin misiniz?", + "Select recorded trip": "Kaydedilen geziyi seçin", + "Card Number": "Kart numarası", + "Hi, Where to": "Merhaba, Nereye", + "Pick your destination from Map": "Hedefinizi Haritadan seçin", + "Add Stops": "Durak Ekle", + "Get Direction": "Yol Tarifi Al", + "Add Location": "Konum ekle", + "Switch Rider": "Sürücüyü Değiştir", + "You will arrive to your destination after timer end.": + "Zamanlayıcı bittikten sonra varış noktanıza varacaksınız.", + "You can cancel trip": "Geziyi iptal edebilirsiniz", + "The driver waitting you in picked location .": + "Sürücü seçilen yerde sizi bekliyor.", + "Pay with Your": "Ödeme", + "Pay with Credit Card": "Kredi kartıyla öde", + "Payment History": "ödeme geçmişi", + "Show Promos to Charge": "Ücretlendirilecek Promosyonları Göster", + "Point": "Nokta", + "Driver Wallet": "Sürücü Cüzdanı", + "Total Points is": "Toplam Puan (şimdiki değeri)", + "Total Budget from trips is": "Gezilerden elde edilen Toplam Bütçe:", + "Total Amount:": "Toplam tutar:", + "Total Budget from trips by": "Seyahatlerden Toplam Bütçe:", + "Credit card is": "Kredi kartı", + "بطاقة الائتمان هي": "بطاقة الائتمان هي", + "This amount for all trip I get from Passengers": + "Yolculardan aldığım tüm yolculuklar için bu miktar", + "Pay from my budget": "Bütçemden öde", + "This amount for all trip I get from Passengers and Collected For me in": + "Yolculardan aldığım ve benim için toplanan tüm seyahatler için bu miktar", + "You can buy points from your budget": + "Bütçenizden puan satın alabilirsiniz", + "insert amount": "miktar girin", + "You can buy Points to let you online": + "Çevrimiçi olmanızı sağlayacak Puanlar satın alabilirsiniz", + "by this list below": "aşağıdaki listeye göre", + "من خلال القائمة أدناه": "Bir gün sonra", + "Create Wallet to receive your money": + "Paranızı almak için Cüzdan oluşturun", + "Enter your feedback here": "Geri bildiriminizi buraya girin", + "Please enter your feedback.": "Lütfen geri bildiriminizi girin.", + "Feedback": "Geri bildirim", + "Submit": "Göndermek", + "Click here to Show it in Map": + "Haritada Göstermek İçin Buraya Tıklayın", + "Canceled": "İptal edildi", + "Type your Email": "E-postanızı yazın", + "No I want": "Hayır istiyorum", + "Email is": "E-posta:", + "Phone Number is": "Telefon Numarası:", + "Date of Birth is": "Doğum Tarihi (şimdiki değeri)", + "Sex is": "Seks", + "Car Details": "Araç Detayları", + "VIN is": "VIN:", + "Color is": "Renk", + "Make is": "Şunu yap:", + "Model is": "Model:", + "Year is": "Yıl:", + "Expiration Date": "Son kullanma tarihi", + "Edit Your data": "Verilerinizi Düzenleyin", + "write vin for your car": "araban için vin yaz", + "VIN": "Şasi", + "write Color for your car": "Arabanız için Renk yazın", + "write Make for your car": "Araban için yap yaz", + "write Model for your car": "Arabanızın modelini yazın", + "write Year for your car": "arabanızın yılını yazın", + "write Expiration Date for your car": + "Arabanızın Son Kullanma Tarihini yazın", + "Tariffs": "Tarifeler", + "Minimum fare": "Asgari ücret", + "Maximum fare": "Maksimum ücret", + "Flag-down fee": "Bayrak indirme ücreti", + "Including Tax": "Vergi dahil", + "BookingFee": "Rezervasyon ücreti", + "Morning": "Sabah", + "from 07:30 till 10:30 (Thursday, Friday, Saturday, Monday)": + "07:30 – 10:30 arası (Perşembe, Cuma, Cumartesi, Pazartesi)", + "Evening": "Akşam", + "from 12:00 till 15:00 (Thursday, Friday, Saturday, Monday)": + "12:00 – 15:00 arası (Perşembe, Cuma, Cumartesi, Pazartesi)", + "Night": "Gece", + "You have in account": "Hesabınız var", + "Select Country": "Ülke Seçiniz", + "Ride Today :": "Bugün Sürüş:", + "After this period": "Bu dönemden sonra", + "You can\"t cancel!": "İptal edemezsin!", + "لا تستطيع الغاء الرحله": "لا تستطيع الغاء الرحله", + "from 23:59 till 05:30": "23:59'dan 05:30'a kadar", + "Rate Driver": "Puan Sürücüsü", + "Total Cost is": "Toplam Maliyet (şimdiki değeri)", + "Write note": "Not yaz", + "Time to arrive": "Gelme zamanı", + "Ride Summaries": "Sürüş Özetleri", + "Total Cost": "Toplam tutar", + "Average of Hours of": "Ortalama Saat", + "is ON for this month": "bu ay için AÇIK", + "Days": "Günler", + "Total Hours on month": "Aylık Toplam Saat", + "Counts of Hours on days": "Günlerdeki Saat Sayımı", + "OrderId": "Sipariş Kimliği", + "created time": "yaratılan zaman", + "Speed Over": "Hız Aşımı", + "I will slow down": "yavaşlayacağım", + "Map Passenger": "Harita Yolcusu", + "Be Slowly": "Yavaş ol", + "If you want to make Google Map App run directly when you apply order": + "Siparişi uyguladığınızda Google Harita Uygulamasının doğrudan çalışmasını istiyorsanız", + "You can change the language of the app": + "Uygulamanın dilini değiştirebilirsiniz", + "Your Budget less than needed": "Bütçeniz ihtiyaç duyulandan az", + "You can change the Country to get all features": + "Tüm özellikleri almak için Ülkeyi değiştirebilirsiniz", + "Change Country": "Ülke değiştir" + }, + "fr": { + "Sign In by Apple": "Connectez-vous par Apple", + "Sign In by Google": "Connectez-vous par Google", + "How do I request a ride?": "Comment puis-je demander un trajet ?", + "Step-by-step instructions on how to request a ride through the Sefer app.": + "Instructions étape par étape sur la façon de demander un trajet via l'application Sefer.", + "What types of vehicles are available?": + "Quels types de véhicules sont disponibles ?", + "Sefer offers a variety of vehicle options to suit your needs, including economy, comfort, and luxury. Choose the option that best fits your budget and passenger count.": + "Sefer propose une variété d'options de véhicules pour répondre à vos besoins, notamment l'économie, le confort et le luxe. Choisissez l'option qui correspond le mieux à votre budget et à votre nombre de passagers.", + "How can I pay for my ride?": "Comment puis-je payer mon trajet ?", + "Sefer offers multiple payment methods for your convenience. Choose between cash payment or credit/debit card payment during ride confirmation.": + "Sefer propose plusieurs méthodes de paiement pour votre commodité. Choisissez entre un paiement en espèces ou un paiement par carte de crédit/débit lors de la confirmation du trajet.", + "Can I cancel my ride?": "Puis-je annuler mon trajet ?", + "Yes, you can cancel your ride under certain conditions (e.g., before driver is assigned). See the Sefer cancellation policy for details.": + "Oui, vous pouvez annuler votre course sous certaines conditions (par exemple, avant l'attribution du chauffeur). Consultez les conditions d’annulation du Sefer pour plus de détails.", + "Driver Registration & Requirements": + "Inscription et exigences du conducteur", + "How can I register as a driver?": + "Comment puis-je m'inscrire en tant que conducteur ?", + "What are the requirements to become a driver?": + "Quelles sont les conditions pour devenir conducteur ?", + "Visit our website or contact Sefer support for information on driver registration and requirements.": + "Visitez notre site Web ou contactez l'assistance Sefer pour plus d'informations sur l'enregistrement des conducteurs et les exigences.", + "How do I communicate with the other party (passenger/driver)?": + "Comment puis-je communiquer avec l'autre partie (passager/conducteur) ?", + "Sefer provides in-app chat functionality to allow you to communicate with your driver or passenger during your ride.": + "Sefer fournit une fonctionnalité de chat dans l'application pour vous permettre de communiquer avec votre conducteur ou passager pendant votre trajet.", + "What safety measures does Sefer offer?": + "Quelles mesures de sécurité Sefer propose-t-il ?", + "Sefer prioritizes your safety. We offer features like driver verification, in-app trip tracking, and emergency contact options.": + "Sefer donne la priorité à votre sécurité. Nous proposons des fonctionnalités telles que la vérification du conducteur, le suivi des déplacements dans l'application et des options de contact d'urgence.", + "Frequently Questions": "Foire aux questions", + "User does not exist.": "L'utilisateur n'existe pas.", + "We need your phone number to contact you and to help you.": + "Nous avons besoin de votre numéro de téléphone pour vous contacter et vous aider.", + "You will recieve code in sms message": + "Vous recevrez le code par SMS", + "Please enter": "Entrez s'il vous plait", + "We need your phone number to contact you and to help you receive orders.": + "Nous avons besoin de votre numéro de téléphone pour vous contacter et vous aider à recevoir les commandes.", + "The full name on your criminal record does not match the one on your driver’s license. Please verify and provide the correct documents.": + "Le nom complet figurant sur votre casier judiciaire ne correspond pas à celui figurant sur votre permis de conduire. Veuillez vérifier et fournir les documents corrects.", + "The national number on your driver’s license does not match the one on your ID document. Please verify and provide the correct documents.": + "Le numéro national figurant sur votre permis de conduire ne correspond pas à celui figurant sur votre pièce d’identité. Veuillez vérifier et fournir les documents corrects.", + "Capture an Image of Your Criminal Record": + "Capturez une image de votre casier judiciaire", + "IssueDate": "Date d'émission", + "Capture an Image of Your car license front": + "Capturez une image du recto de votre permis de conduire", + "Capture an Image of Your ID Document front": + "Capturez une image du recto de votre document d'identité", + "NationalID": "Carte d'identité", + "FullName": "Nom et prénom", + "InspectionResult": "Résultat de l'inspection", + "Criminal Record": "Dossier criminel", + "The email or phone number is already registered.": + "L'e-mail ou le numéro de téléphone est déjà enregistré.", + "To become a ride-sharing driver on the Sefer app, you need to upload your driver\"s license, ID document, and car registration document. Our AI system will instantly review and verify their authenticity in just 2-3 minutes. If your documents are approved, you can start working as a driver on the Sefer app. Please note, submitting fraudulent documents is a serious offense and may result in immediate termination and legal consequences.": + "Pour devenir conducteur de covoiturage sur l'application Sefer, vous devez télécharger votre permis de conduire, votre pièce d'identité et votre document d'immatriculation. Notre système d'IA examinera et vérifiera instantanément leur authenticité en seulement 2-3 minutes. Si vos documents sont approuvés, vous pouvez commencer à travailler en tant que chauffeur sur l'application Sefer. Veuillez noter que la soumission de documents frauduleux est une infraction grave et peut entraîner un licenciement immédiat et des conséquences juridiques.", + "Documents check": "Vérification des documents", + "Driver's License": "Le permis de conduire", + "License Type": "Type de licence", + "National Number": "Numéro national", + "Name (Arabic)": "Nom (arabe)", + "Name (English)": "Nom (anglais)", + "Address": "Adresse", + "Issue Date": "Date d'émission", + "Expiry Date": "Date d'expiration", + "License Categories": "Catégories de licences", + "driver_license": "permis de conduire", + "Capture an Image of Your Driver License": + "Capturez une image de votre permis de conduire", + "ID Documents Back": "Documents d'identité Retour", + "National ID": "carte d'identité", + "Occupation": "Profession", + "Gender": "Genre", + "Religion": "Religion", + "Marital Status": "État civil", + "Full Name (Marital)": "Nom complet (matrimonial)", + "Expiration Date": "Date d'expiration", + "Capture an Image of Your ID Document Back": + "Capturez une image de votre document d'identité", + "ID Documents Front": "Documents d'identité recto", + "First Name": "Prénom", + "CardID": "ID de carte", + "Full Name": "Nom et prénom", + "Vehicle Details Front": "Détails du véhicule Avant", + "Plate Number": "Numéro de la plaque", + "Owner Name": "Le nom du propriétaire", + "Vehicle Details Back": "Détails du véhicule Retour", + "Make": "Faire", + "Model": "Modèle", + "Year": "Année", + "Chassis": "Châssis", + "Color": "Couleur", + "Displacement": "Déplacement", + "Fuel": "Carburant", + "Tax Expiry Date": "Date d'expiration de la taxe", + "Inspection Date": "Date d'inspection", + "Capture an Image of Your car license back": + "Capturez une image de votre permis de voiture", + "Capture an Image of Your Driver’s License": + "Capturez une image de votre permis de conduire", + "Sign in with Google for easier email and name entry": + "Connectez-vous avec Google pour faciliter la saisie de votre adresse e-mail et de votre nom", + "You will choose allow all the time to be ready receive orders": + "Vous choisirez de permettre à tout moment d'être prêt à recevoir les commandes", + "Welcome to Sefer!": "Bienvenue chez Sefer !", + "Get to your destination quickly and easily.": + "Arrivez à destination rapidement et facilement.", + "Enjoy a safe and comfortable ride.": + "Profitez d'une conduite sûre et confortable.", + "Choose Language": "Choisissez la langue", + "Login": "Se connecter", + "Pay with Wallet": "Payer avec Wallet", + "Invalid MPIN": "MPIN invalide", + "Invalid OTP": "OTP invalide", + "Enter your email address": "Entrez votre adresse email", + "Please enter Your Email.": "Veuillez entrer votre e-mail.", + "Enter your phone number": "Entrez votre numéro de téléphone", + "Please enter your phone number.": + "Veuillez entrer votre numéro de téléphone.", + "Please enter Your Password.": + "S'il vous plait entrez votre mot de passe.", + "Submit": "Soumettre", + "if you dont have account": "si vous n'avez pas de compte", + "Register": "Registre", + "Accept Ride's Terms & Review Privacy Notice": + "Acceptez les conditions de Ride et consultez l'avis de confidentialité", + "By selecting 'I Agree' below, I have reviewed and agree to the Terms of Use and acknowledge the Privacy Notice. I am at least 18 years of age.": + "En sélectionnant « J'accepte » ci-dessous, j'ai lu et accepté les conditions d'utilisation et je reconnais l'avis de confidentialité. J'ai au moins 18 ans.", + "I Agree": "Je suis d'accord", + "First name": "Prénom", + "Enter your first name": "Entrez votre prénom", + "Please enter your first name.": + "Entrez votre prénom s'il vous plait.", + "Last name": "Nom de famille", + "Enter your last name": "Entrez votre nom de famille", + "Please enter your last name.": + "Veuillez entrer votre nom de famille.", + "City": "Ville", + "Please enter your City.": "Veuillez entrer votre ville.", + "Male": "Mâle", + "Female": "Femelle", + "Verify Email": "Vérifier les courriels", + "We sent 5 digit to your Email provided": + "Nous avons envoyé 5 chiffres à votre e-mail fourni", + "5 digit": "5 chiffres", + "Send Verification Code": "Envoyer le code de vérification", + "Your Ride Duration is": "La durée de votre trajet est", + "You will be thier in": "Vous serez là dans", + "You trip distance is": "La distance de votre trajet est", + "Fee is": "Les frais sont", + "From :": "Depuis :", + "To :": "À :", + "Add Promo": "Ajouter une promotion", + "Confirm Selection": "Confirmer la sélection", + "distance is": "la distance est", + "duration is": "la durée est", + "I don't need a ride anymore": "Je n'ai plus besoin d'un tour", + "I was just trying the application": + "j'étais justement en train d'essayer l'application", + "No driver accepted my request": + "Aucun chauffeur n'a accepté ma demande", + "I added the wrong pick-up/drop-off location": + "J'ai ajouté le mauvais lieu de prise en charge/dépôt", + "I don't have a reason": "je n'ai pas de raison", + "Other": "Autre", + "Can we know why you want to cancel Ride ?": + "Pouvons-nous savoir pourquoi vous souhaitez annuler Ride ?", + "Cancel Ride": "Annuler le trajet", + "Add Payment Method": "Ajouter un mode de paiement", + "Your Wallet balance is": "Le solde de votre portefeuille est de", + "Ride Wallet": "Portefeuille de voyage", + "Payment Method": "Mode de paiement", + "Type here Place": "Tapez ici Lieu", + "Are You sure to ride to": "Êtes-vous sûr d'aller à", + "Confirm": "Confirmer", + "Back": "Dos", + "You are Delete": "Vous êtes Supprimer", + "Deleted": "Supprimé", + "You Dont Have Any places yet !": "Vous n'avez pas encore de lieux !", + "Favorite Places": "Lieux préférés", + "From : Current Location": "De : Emplacement actuel", + "Where to": "Où aller", + "Notifications": "Notifications", + "Profile": "Profil", + "Home": "Maison", + "My Cared": "Mes soins", + "Add Card": "Ajouter une carte", + "Add Credit Card": "Ajouter une carte de crédit", + "Please enter the cardholder name": + "Veuillez saisir le nom du titulaire de la carte", + "Please enter the expiry date": + "Veuillez saisir la date d'expiration", + "Please enter the CVV code": "Veuillez saisir le code CVV", + "Go To Favorite Places": "Aller aux endroits favoris", + "Go to this Target": "Accédez à cette cible", + "My Profile": "Mon profil", + "Sign Out": "Se déconnecter", + "Home Page": "Page d'accueil", + "Are you want to go to this site": "Voulez-vous aller sur ce site", + "MyLocation": "Ma position", + "my location": "ma position", + "Target": "Cible", + "Update": "Mise à jour", + "You Should choose rate figure": + "Vous devriez choisir le chiffre du taux", + "Login Captin": "Capitaine de connexion", + "Register Captin": "Inscrire le capitaine", + "Send Verfication Code": "Envoyer le code de vérification", + "KM": "KM", + "End Ride": "Fin du trajet", + "Minute": "Minute", + "Go to passenger Location now": + "Accédez à l'emplacement des passagers maintenant", + "Duration of the Ride is": "La durée du trajet est", + "Distance of the Ride is": "La distance du trajet est", + "Name of the Passenger is": "Le nom du passager est", + "Hello this is Captain": "Bonjour, c'est le capitaine", + "Start the Ride": "Commencez le voyage", + "Please Wait If passenger want To Cancel!": + "Veuillez patienter si le passager souhaite annuler !", + "Total Duration:": "Durée totale:", + "Active Duration:": "Durée active :", + "Waiting for Captin ...": "En attendant Captin...", + "Age is": "L'âge est", + "Rating is": "La note est", + "to arrive you.": "pour vous arriver.", + "Order History": "Historique des commandes", + "My Wallet": "Mon portefeuille", + "Tariff": "Tarif", + "Settings": "Paramètres", + "Feed Back": "Retour", + "Promos": "Promotions", + "Please enter a valid 16-digit card number": + "Veuillez saisir un numéro de carte valide à 16 chiffres", + "Add Phone": "Ajouter un téléphone", + "Please enter a phone number": + "Veuillez entrer un numéro de téléphone", + "You dont Add Emergency Phone Yet!": + "Vous n'avez pas encore ajouté de téléphone d'urgence !", + "You will arrive to your destination after": + "Vous arriverez à destination après", + "You can cancel Ride now": "Vous pouvez annuler Ride maintenant", + "You Can cancel Ride After Captain did not come in the time": + "Vous pouvez annuler le trajet après que le capitaine ne soit pas venu à temps", + "If you in Car Now. Press Start The Ride": + "Si vous êtes en voiture maintenant. Appuyez sur Démarrer le trajet", + "You Dont Have Any amount in": "Vous n'avez aucun montant en", + "Wallet!": "Portefeuille!", + "You Have": "Tu as", + "Save Credit Card": "Enregistrer la carte de crédit", + "Show Promos": "Afficher les promotions", + "10 and get 4% discount": "10 et obtenez 4% de réduction", + "20 and get 6% discount": "20 et obtenez 6% de réduction", + "40 and get 8% discount": "40 et obtenez 8% de réduction", + "100 and get 11% discount": "100 et obtenez 11% de réduction", + "Pay with Your PayPal": "Payez avec votre PayPal", + "You will choose one of above !": + "Vous en choisirez un parmi ceux ci-dessus !", + "Cancel": "Annuler", + "Delete My Account": "Supprimer mon compte", + "Edit Profile": "Editer le profil", + "Name": "Nom", + "Update Gender": "Mettre à jour le sexe", + "Education": "Éducation", + "Update Education": "Mettre à jour l'éducation", + "Employment Type": "Type d'emploi", + "SOS Phone": "Téléphone SOS", + "High School Diploma": "Baccalauréat", + "Associate Degree": "Diplôme d'associé", + "Bachelor's Degree": "Licence", + "Master's Degree": "Une maîtrise", + "Doctoral Degree": "Doctorat", + "Promos For today": "Promotions pour aujourd'hui", + "Copy this Promo to use it in your Ride!": + "Copiez cette promotion pour l'utiliser dans votre trajet !", + "To change some Settings": "Pour modifier certains paramètres", + "To change Language the App": + "Pour changer la langue de l'application", + "Order Request Page": "Page de demande de commande", + "Rouats of Trip": "Rouats de voyage", + "Passenger Name is": "Le nom du passager est", + "Total From Passenger is": "Le total du passager est", + "Duration To Passenger is": "La durée pour le passager est", + "Distance To Passenger is": "La distance jusqu'au passager est", + "Total For You is": "Le total pour vous est", + "Distance is": "La distance est", + "KM": "KM", + "Duration of Trip is": "La durée du voyage est", + "Minutes": "Minutes", + "Apply Order": "Appliquer la commande", + "Refuse Order": "Refuser la commande", + "Rate Captain": "Évaluez le capitaine", + "Enter your Note": "Entrez votre note", + "Type something...": "Tapez quelque chose...", + "Submit rating": "Soumettre une note", + "Rate Passenger": "Tarif Passager", + "Ride Summary": "Résumé du trajet", + "welcome_message": "message de bienvenue", + "app_description": "description_de l'application", + "get_to_destination": "get_to_destination", + "get_a_ride": "faire un tour", + "safe_and_comfortable": "sûr_et_confortable", + "committed_to_safety": "engagé_à_la_sécurité", + "Driver Applied the Ride for You": + "Le conducteur a appliqué le trajet pour vous", + "Show latest promo": "Afficher la dernière promotion", + "Cancel Trip": "Annuler le voyage", + "Passenger Cancel Trip": "Voyage annulé par un passager", + "Please stay on the picked point.": + "Merci de rester sur le point choisi.", + "Trip is Begin": "Le voyage commence", + "Hi ,I will go now": "Salut, je vais y aller maintenant", + "Passenger come to you": "Le passager vient à vous", + "Hi ,I Arrive your site": "Bonjour, j'arrive sur votre site", + "Driver Finish Trip": "Chauffeur Terminer le voyage", + "you will pay to Driver": "vous paierez au chauffeur", + "Driver Cancel Your Trip": "Le chauffeur annule votre voyage", + "you will pay to Driver you will be pay the cost of driver time look to your SEFER Wallet": + "vous paierez au chauffeur, vous paierez le coût du temps de chauffeur, consultez votre portefeuille SEFER", + "I will go now": "Je vais y aller maintenant", + "You Have Tips": "Vous avez des conseils", + "tips": "conseils", + "Total is": "Le total est", + "الْمَجْمُوع هُوَ": "الْمَجْمُوع هُوَ", + "No,I want": "Non je veux", + "Your fee is": "Vos frais sont", + "Do you want to pay Tips for this Driver": + "Voulez-vous payer des pourboires pour ce conducteur", + "Tip is": "Le conseil est", + "Tip is": "Le conseil est", + "Camera Access Denied.": "Accès à la caméra refusé.", + "Open Settings": "Ouvrir les paramètres", + "GPS Required Allow !.": "GPS requis Autoriser !.", + "Your Account is Deleted": "Votre compte est supprimé", + "Are you sure to delete your account?": + "Êtes-vous sûr de supprimer votre compte ?", + "Your data will be erased after 2 weeks": + "Vos données seront effacées après 2 semaines", + "And you will can't return to use app after 1 month": + "Et vous ne pourrez plus utiliser l'application après 1 mois.", + "وَلَن تَسْتَطِيع اسْتِخْدَام التَّطْبِيق مَرَّة أُخْرَى بَعْد شَهْر": + "وَلَن تَسْتَطِيع اسْتِخْدَام التَّطْبِيق مَرَّة أُخْرَى بَعْد شَهْر", + "Enter Your First Name": "Entrez votre prénom", + "Are you Sure to LogOut?": "Êtes-vous sûr de vous déconnecter ?", + "Email Wrong": "E-mail erroné", + "Email you inserted is Wrong.": + "L'e-mail que vous avez inséré est faux.", + "You have finished all times": "Tu as fini tous les temps", + "if you want help you can email us here": + "si vous voulez de l'aide, vous pouvez nous envoyer un email ici", + "Thanks": "Merci", + "Email Us": "Envoyez-nous un email", + "I cant register in your app in face detection": + "Je ne peux pas m'inscrire dans votre application en détection de visage", + "Hi": "Salut", + "No face detected": "Aucun visage détecté", + "Image detecting result is": + "Le résultat de la détection d'image est", + "from 3 times Take Attention": "à partir de 3 fois Attention", + "Be sure for take accurate images please": + "Assurez-vous de prendre des images précises s'il vous plaît", + "You have": "Tu as", + "لَدَيْك": "لَدَيْك", + "image verified": "image vérifiée", + "Next": "Suivant", + "There is no help Question here": "Il n'y a pas d'aide. Question ici", + "Call End": "Fin d'appel", + "You dont have Points": "Vous n'avez pas de points", + "You Are Stopped For this Day !": "Vous êtes arrêtés pour ce jour !", + "You must be charge your Account": "Vous devez débiter votre compte", + "You Refused 3 Rides this Day that is the reason": + "Vous avez refusé 3 courses ce jour-là, c'est la raison", + "See you Tomorrow!": "À demain!", + "لِقَائِنَا غَدًا!": "لِقَائِنَا غَدًا!", + "Recharge my Account": "Recharger mon compte", + "Ok , See you Tomorrow": "OK à demain", + "You are Stopped": "Vous êtes arrêté", + "Connected": "Connecté", + "Not Connected": "Pas connecté", + "Your are far from passenger location": + "Vous êtes loin de l'emplacement des passagers", + "go to your passenger location before": + "rendez-vous à votre emplacement passager avant", + "Passenger cancel trip": "Le passager annule son voyage", + "يُلْغِي الرَّاكِب الرِّحْلَة": "يُلْغِي الرَّاكِب الرِّحْلَة", + "You will get cost of your work for this trip": + "Vous recevrez le coût de votre travail pour ce voyage", + "in your wallet": "dans ton portefeuille", + "you gain": "Tu gagnes", + "Order Cancelled": "Commande annulée", + "Order Cancelled by Passenger": "Commande annulée par le passager", + "Success": "Succès", + "Feedback data saved successfully": + "Données de commentaires enregistrées avec succès", + "No Promo for today .": "Pas de promotion pour aujourd'hui.", + "Select your destination": "Sélectionnez votre destination", + "Search for your Start point": "Recherchez votre point de départ", + "Search for waypoint": "Rechercher un waypoint", + "Current Location": "Localisation actuelle", + "Add Location 1": "Ajouter l'emplacement 1", + "You must Verify email !.": "Vous devez vérifier l'e-mail !.", + "Cropper": "Recadrage", + "Saved Sucssefully": "Enregistré avec succès", + "Select Date": "Sélectionner une date", + "Birth Date": "Date de naissance", + "Ok": "D'accord", + "the 500 points equal 30 JOD": "les 500 points équivalent à 30 JOD", + "the 500 points equal 30 JOD for you": + "les 500 points équivalent à 30 JOD pour vous", + "So go and gain your money": "Alors va gagner ton argent", + "فَاسْتَحِقَّ فُلُوسَك وَاكْسِب النِّقَاط": + "فَاسْتَحِقَّ فُلُوسَك وَاكْسِب النِّقَاط", + "token updated": "jeton mis à jour", + "Add Location 2": "Ajouter un emplacement 2", + "Add Location 3": "Ajouter un emplacement 3", + "Add Location 4": "Ajouter un emplacement 4", + "Waiting for your location": "En attente de votre position", + "Search for your destination": "Recherchez votre destination", + "Hi! This is": "Salut! C'est", + "I am using": "j'utilise", + "to ride with": "rouler avec", + "as the driver.": "en tant que conducteur.", + "is driving a": "conduit un", + "with license plate": "avec plaque d'immatriculation", + "I am currently located at": "Je me trouve actuellement à", + "Please go to Car now": + "S'il vous plaît, allez à la voiture maintenant", + "If you need to reach me, please contact the driver directly at": + "Si vous avez besoin de me joindre, veuillez contacter directement le chauffeur au", + "No Car or Driver Found in your area.": + "Aucune voiture ni chauffeur trouvé dans votre région.", + "Please Try anther time": "S'il vous plaît, essayez une autre fois", + "There no Driver Aplly your order sorry for that": + "Il n'y a pas de chauffeur. Appliquez votre commande, désolé pour cela.", + "Trip Cancelled": "Voyage annulé", + "The Driver Will be in your location soon .": + "Le chauffeur sera bientôt chez vous.", + "The distance less than 500 meter.": + "La distance inférieure à 500 mètres.", + "Promo End !": "Fin de la promotion !", + "There is no notification yet": "Il n'y a pas encore de notification", + "Use Touch ID or Face ID to confirm payment": + "Utilisez Touch ID ou Face ID pour confirmer le paiement", + "Contact us for any questions on your order.": + "Contactez-nous pour toute question sur votre commande.", + "Pyament Cancelled .": "Paiement annulé.", + "type here": "écrivez ici", + "Scan Driver License": "Scanner le permis de conduire", + "Please put your licence in these border": + "Veuillez mettre votre permis dans ces bordures", + "Camera not initialized yet": "Caméra pas encore initialisée", + "Take Image": "Prendre une image", + "AI Page": "Page IA", + "Take Picture Of ID Card": "Prendre une photo de la carte d'identité", + "Take Picture Of Driver License Card": + "Prendre une photo de la carte de permis de conduire", + "We are process picture please wait": + "Nous sommes en train de traiter l'image, veuillez patienter", + "There is no data yet.": "Il n'y a pas encore de données.", + "Name :": "Nom :", + "Drivers License Class:": "Classe de permis de conduire :", + "Document Number:": "Numéro de document:", + "Address:": "Adresse:", + "Height:": "Hauteur:", + "Expiry Date:": "Date d'expiration:", + "Date of Birth:": "Date de naissance:", + "You can\"t continue with us .": + "Vous ne pouvez pas continuer avec nous.", + "You should renew Driver license": + "Vous devez renouveler votre permis de conduire", + "Detect Your Face": "Détectez votre visage", + "Go to next step": "Passer à l'étape suivante", + "scan Car License.": "scanner le permis de voiture.", + "aاسْتِخْرَاج رُخْصَة السَّيَّارَة.": + "aاسْتِخْرَاج رُخْصَة السَّيَّارَة.", + "Name in arabic": "Nom en arabe", + "Drivers License Class": "Classe de permis de conduire", + "Date of Birth": "Date de naissance", + "Age": "Âge", + "Lets check Car license": "Vérifions le permis de conduire", + "Car Kind": "Type de voiture", + "Car Plate": "Plaque d'immatriculation", + "Lets check License Back Face": + "Vérifions la face arrière de la licence", + "Car License Card": "Carte d'immatriculation de voiture", + "No image selected yet": "Aucune image sélectionnée pour le moment", + "Made :": "Fait :", + "model :": "modèle :", + "VIN :": "NIV :", + "year :": "année :", + "ُExpire Date": "date d'expiration", + "Login Driver": "Pilote de connexion", + "Password must br at least 6 character.": + "Le mot de passe doit contenir au moins 6 caractères.", + "if you don\"t have account": "si vous n'avez pas de compte", + "Here recorded trips audio": "Ici les voyages enregistrés audio", + "Register as Driver": "S'inscrire en tant que conducteur", + "Privacy Notice": "Avis de confidentialité", + "By selecting 'I Agree' below, I have reviewed and agree to the Terms of Use and acknowledge the": + "En sélectionnant « J'accepte » ci-dessous, j'ai lu et accepté les conditions d'utilisation et je reconnais les", + ". I am at least 18 years of age.": ". J'ai au moins 18 ans.", + "Log Out Page": "Page de déconnexion", + "Log Off": "Se déconnecter", + "Register Driver": "Enregistrer le conducteur", + "Verify Email For Driver": "Vérifier l'e-mail du pilote", + "Admin DashBoard": "Tableau de bord d'administration", + "Your name": "Votre nom", + "your ride is applied": "votre course est appliquée", + "Your password": "Votre mot de passe", + "H and": "Main", + "LE": "LE", + "JOD": "JOD", + "m": "m", + "We search nearst Driver to you": + "Nous recherchons le chauffeur le plus proche de chez vous", + "please wait till driver accept your order": + "veuillez attendre que le chauffeur accepte votre commande", + "No accepted orders? Try raising your trip fee to attract riders.": + "Aucune commande acceptée ? Essayez d'augmenter vos frais de déplacement pour attirer les passagers.", + "You should select one": "Vous devriez en sélectionner un", + "The driver accept your order for": + "Le chauffeur accepte votre commande pour", + "Increase Fee": "Augmenter les frais", + "No, thanks": "Non merci", + "The driver on your way": "Le chauffeur sur votre chemin", + "Total price from": "Prix ​​total à partir de", + "Order Details Speed": "Détails de la commande Vitesse", + "Order Applied": "Commande appliquée", + "accepted your order": "accepté votre commande", + "We regret to inform you that another driver has accepted this order.": + "Nous avons le regret de vous informer qu'un autre chauffeur a accepté cette commande.", + "Selected file:": "Fichier sélectionné :", + "Your trip cost is": "Le coût de votre voyage est", + "this will delete all files from your device": + "cela supprimera tous les fichiers de votre appareil", + "you have a negative balance of": "vous avez un solde négatif de", + "in your": "dans ton", + "Exclusive offers and discounts always with the Sefer app": + "Offres et réductions exclusives toujours avec l'application Sefer", + "Please go to Car Driver": "Veuillez vous rendre sur Car Driver", + "wallet due to a previous trip.": + "portefeuille en raison d'un voyage précédent.", + "Submit Question": "Soumettre une question", + "Please enter your Question.": "Veuillez entrer votre question.", + "Help Details": "Détails de l'aide", + "No trip yet found": "Aucun voyage encore trouvé", + "No Response yet.": "Pas encore de réponse.", + "You Earn today is": "Vous gagnez aujourd'hui, c'est", + "You Have in": "Vous avez dans", + "Total points is": "Le total des points est", + "Total Connection Duration:": "Durée totale de connexion :", + "H and": "Main", + "Passenger name :": "Nom du passager :", + "Cost Of Trip IS": "Le coût du voyage est", + "Arrival time": "Heure d'arrivée", + "arrival time to reach your point": + "heure d'arrivée pour atteindre votre point", + "For Speed and Delivery trips, the price is calculated dynamically. For Comfort trips, the price is based on time and distance": + "Pour les courses Speed ​​et Delivery, le prix est calculé dynamiquement. Pour les trajets Confort, le prix est fonction du temps et de la distance", + "Hello this is Driver": "Bonjour, c'est Driver", + "Is the Passenger in your Car ?": + "Le passager est-il dans votre voiture ?", + "Please wait for the passenger to enter the car before starting the trip.": + "Veuillez attendre que le passager monte dans la voiture avant de commencer le voyage.", + "No ,still Waiting.": "Non, j'attends toujours.", + "I arrive you": "je t'arrive", + "I Arrive your site": "J'arrive sur votre site", + "You are not in near to passenger location": + "Vous n'êtes pas à proximité de l'emplacement des passagers", + "please go to picker location exactly": + "veuillez vous rendre exactement à l'emplacement du sélecteur", + "You Can Cancel Trip And get Cost of Trip From": + "Vous pouvez annuler le voyage et obtenir le coût du voyage à partir de", + "Are you sure to cancel?": "Etes-vous sûr d'annuler ?", + "Yes": "Oui", + "Insert Emergincy Number": "Insérer un numéro d'urgence", + "Best choice for comfort car and flexible route and stops point": + "Meilleur choix pour une voiture de confort et un itinéraire et un point d'arrêt flexibles", + "Insert": "Insérer", + "This is for delivery or a motorcycle.": + "C'est pour une livraison ou une moto.", + "This trip goes directly from your starting point to your destination for a fixed price. The driver must follow the planned route": + "Ce voyage va directement de votre point de départ à votre destination pour un prix fixe. Le chauffeur doit suivre l'itinéraire prévu", + "You can decline a request without any cost": + "Vous pouvez refuser une demande sans aucun frais", + "Perfect for adventure seekers who want to experience something new and exciting": + "Parfait pour les amateurs d'aventure qui veulent vivre quelque chose de nouveau et d'excitant", + "My current location is:": "Ma position actuelle est :", + "and I have a trip on": "et j'ai un voyage", + "App with Passenger": "Application avec passager", + "مع الراكب": "مع الراكب", + "You will be pay the cost to driver or we will get it from you on next trip": + "Vous paierez le coût au chauffeur ou nous le récupérerons lors du prochain voyage.", + "Trip has Steps": "Le voyage comporte des étapes", + "Distance from Passenger to destination is": + "La distance entre le passager et la destination est", + "price is": "le prix est", + "This ride type does not allow changes to the destination or additional stops": + "Ce type de trajet ne permet pas de modifications de destination ni d'arrêts supplémentaires", + "This price may be changed": "Ce prix peut être modifié", + "No SIM card, no problem! Call your driver directly through our app. We use advanced technology to ensure your privacy.": + "Pas de carte SIM, pas de problème ! Appelez votre chauffeur directement via notre application. Nous utilisons une technologie avancée pour garantir votre confidentialité.", + "This ride type allows changes, but the price may increase": + "Ce type de trajet autorise des modifications, mais le prix peut augmenter", + "message From passenger": "message du passager", + "Select one message": "Sélectionnez un message", + "My location is correct. You can search for me using the navigation app": + "Ma position est correcte. Vous pouvez me rechercher à l'aide de l'application de navigation", + "I'm waiting for you": "Je vous attends", + "Hello, I'm at the agreed-upon location": + "Bonjour, je suis à l'endroit convenu", + "We noticed the speed is exceeding 100 km/h. Please slow down for your safety. If you feel unsafe, you can share your trip details with a contact or call the police using the red SOS button.": + "Nous avons remarqué que la vitesse dépasse les 100 km/h. Veuillez ralentir pour votre sécurité. Si vous ne vous sentez pas en sécurité, vous pouvez partager les détails de votre voyage avec un contact ou appeler la police à l'aide du bouton rouge SOS.", + "Warning: Speeding detected!": + "Attention : excès de vitesse détecté !", + "Please help! Contact me as soon as possible.": + "S'il vous plaît, aidez-moi ! Contactez-moi au plus vite.", + "Share Trip Details": "Partager les détails du voyage", + "Car Plate is": "La plaque d'immatriculation est", + "the 300 points equal 300 L.E for you": + "les 300 points équivalent à 300 L.E pour vous", + "So go and gain your money": "Alors va gagner ton argent", + "the 300 points equal 300 L.E": "les 300 points équivalent à 300 L.E", + "The payment was not approved. Please try again.": + "Le paiement n'a pas été approuvé. Veuillez réessayer.", + "Payment Failed": "Paiement échoué", + "Error": "Erreur", + "An error occurred during the payment process.": + "Une erreur s'est produite lors du processus de paiement.", + "The payment was approved.": "Le paiement a été approuvé.", + "Payment Successful": "Paiement réussi", + "No ride found yet": "Aucun trajet trouvé pour l'instant", + "Accept Order": "Accepter la commande", + "reject your order.": "rejetez votre commande.", + "Bottom Bar Example": "Exemple de barre inférieure", + "Driver phone": "Téléphone du conducteur", + "Statistics": "Statistiques", + "Origin": "Origine", + "Destination": "Destination", + "Driver Name": "Nom du conducteur", + "Driver Car Plate": "Plaque de voiture du conducteur", + "Available for rides": "Disponible pour les balades", + "Scan Id": "Scanner l'identifiant", + "Camera not initilaized yet": "Caméra pas encore initialisée", + "Scan ID MklGoogle": "Scan ID MklGoogle", + "Language": "Langue", + "Jordan": "Jordan", + "USA": "Etats-Unis", + "Egypt": "Egypte", + "Turkey": "Turquie", + "Saudi Arabia": "Arabie Saoudite", + "Qatar": "Qatar", + "Bahrain": "Bahreïn", + "Kuwait": "Koweit", + "But you have a negative salary of": + "Mais vous avez un salaire négatif de", + "Promo Code": "Code promo", + "Your trip distance is": "La distance de votre trajet est", + "Enter promo code": "Saisir le code promotionnel", + "You have promo!": "Vous avez une promo !", + "Cost Duration": "Durée du coût", + "Duration is": "La durée est", + "Leave": "Partir", + "Join": "Rejoindre", + "You Should be select reason.": + "Vous devriez sélectionner la raison.", + "\$": "\$", + "Waiting for Driver ...": "En attente du chauffeur...", + "Latest Recent Trip": "Dernier voyage récent", + "from your list": "de votre liste", + "Do you want to change Work location": + "Voulez-vous changer de lieu de travail", + "Do you want to change Home location": + "Voulez-vous changer l'emplacement de votre domicile", + "We Are Sorry That we dont have cars in your Location!": + "Nous sommes désolés de ne pas avoir de voitures dans votre région !", + "Choose from Map": "Choisissez parmi la carte", + "Pick your ride location on the map - Tap to confirm": + "Choisissez l'emplacement de votre trajet sur la carte - Appuyez pour confirmer", + "To Work": "Travailler", + "Are you want to go this site": "Voulez-vous aller sur ce site", + "Closest & Cheapest": "Le plus proche et le moins cher", + "Work Saved": "Travail enregistré", + "Sefer is the ride-hailing app that is safe, reliable, and accessible.": + "Sefer est l'application de covoiturage sûre, fiable et accessible.", + "With Sefer, you can get a ride to your destination in minutes.": + "Avec Sefer, vous pouvez vous rendre à votre destination en quelques minutes.", + "Sefer is committed to safety, and all of our captains are carefully screened and background checked.": + "Sefer s'engage en faveur de la sécurité et tous nos capitaines sont soigneusement sélectionnés et leurs antécédents vérifiés.", + "To Home": "À la maison", + "Home Saved": "Accueil enregistré", + "Destination selected": "Destination sélectionnée", + "Now select start pick": "Sélectionnez maintenant le choix de départ", + "Pick from map": "Choisir sur la carte", + "Click here point": "Cliquez ici pour pointer", + "No Car in your site. Sorry!": + "Pas de voiture sur votre site. Désolé!", + "Nearest Car for you about": "Voiture la plus proche pour vous", + "N/A": "N / A", + "From :": "Depuis :", + "Get Details of Trip": "Obtenez les détails du voyage", + "If you want add stop click here": + "Si vous souhaitez ajouter un arrêt, cliquez ici", + "Driver": "Conducteur", + "Where you want go": "Où veux-tu aller", + "My Card": "Ma carte", + "Start Record": "Démarrer l'enregistrement", + "Wallet": "Portefeuille", + "History of Trip": "Histoire du voyage", + "Helping Center": "Centre d'aide", + "Record saved": "Enregistrement enregistré", + "Trips recorded": "Déplacements enregistrés", + "Select Your Country": "Sélectionnez votre pays", + "To ensure you receive the most accurate information for your location, please select your country below. This will help tailor the app experience and content to your country.": + "Pour vous assurer de recevoir les informations les plus précises concernant votre emplacement, veuillez sélectionner votre pays ci-dessous. Cela aidera à adapter l’expérience et le contenu de l’application à votre pays.", + "Are you sure to delete recorded files": + "Êtes-vous sûr de supprimer les fichiers enregistrés", + "Select recorded trip": "Sélectionnez un voyage enregistré", + "Card Number": "Numéro de carte", + "Hi, Where to": "Salut, où aller", + "Pick your destination from Map": + "Choisissez votre destination sur la carte", + "Add Stops": "Ajouter des arrêts", + "Get Direction": "Obtenir une direction", + "Add Location": "Ajouter un emplacement", + "Switch Rider": "Changer de cavalier", + "You will arrive to your destination after timer end.": + "Vous arriverez à votre destination après la fin du chronomètre.", + "You can cancel trip": "Vous pouvez annuler le voyage", + "The driver waitting you in picked location .": + "Le chauffeur vous attend à l'endroit choisi.", + "Pay with Your": "Payez avec votre", + "Pay with Credit Card": "Payez avec une carte de crédit", + "Payment History": "historique de paiement", + "Show Promos to Charge": "Afficher les promotions à facturer", + "Point": "Indiquer", + "Driver Wallet": "Portefeuille du conducteur", + "Total Points is": "Le total des points est", + "Total Budget from trips is": "Le budget total des voyages est de", + "Total Amount:": "Montant total:", + "Total Budget from trips by": "Budget total des voyages par", + "Credit card is": "La carte de crédit est", + "بطاقة الائتمان هي": "بطاقة الائتمان هي", + "This amount for all trip I get from Passengers": + "Ce montant pour tous les voyages que je reçois des passagers", + "Pay from my budget": "Payer avec mon budget", + "This amount for all trip I get from Passengers and Collected For me in": + "Ce montant pour tous les voyages que je reçois des passagers et collectés pour moi en", + "You can buy points from your budget": + "Vous pouvez acheter des points avec votre budget", + "insert amount": "insérer le montant", + "You can buy Points to let you online": + "Vous pouvez acheter des points pour vous permettre en ligne", + "by this list below": "par cette liste ci-dessous", + "من خلال القائمة أدناه": "من خلال القائمة أدناه", + "Create Wallet to receive your money": + "Créez un portefeuille pour recevoir votre argent", + "Enter your feedback here": "Entrez vos commentaires ici", + "Please enter your feedback.": "Veuillez saisir vos commentaires.", + "Feedback": "Retour", + "Submit": "Soumettre", + "Click here to Show it in Map": + "Cliquez ici pour l'afficher sur la carte", + "Canceled": "Annulé", + "Type your Email": "Tapez votre e-mail", + "No I want": "Non je veux", + "Email is": "L'e-mail est", + "Phone Number is": "Le numéro de téléphone est", + "Date of Birth is": "La date de naissance est", + "Sex is": "Le sexe est", + "Car Details": "Détails de la voiture", + "VIN is": "Le NIV est", + "Color is": "La couleur est", + "Make is": "Faire est", + "Model is": "Le modèle est", + "Year is": "L'année est", + "Expiration Date": "Date d'expiration", + "Edit Your data": "Modifier vos données", + "write vin for your car": "écris le vin pour ta voiture", + "VIN": "NIV", + "write Color for your car": "écrivez la couleur de votre voiture", + "write Make for your car": "écrire Fais pour ta voiture", + "write Model for your car": "écrivez le modèle de votre voiture", + "write Year for your car": "écrivez l'année pour votre voiture", + "write Expiration Date for your car": + "écrivez la date d'expiration de votre voiture", + "Tariffs": "Tarifs", + "Minimum fare": "Tarif minimum", + "Maximum fare": "Tarif maximum", + "Flag-down fee": "Frais de signalement", + "Including Tax": "Taxes comprises", + "BookingFee": "Frais de réservation", + "Morning": "Matin", + "from 07:30 till 10:30 (Thursday, Friday, Saturday, Monday)": + "de 07h30 à 10h30 (jeudi, vendredi, samedi, lundi)", + "Evening": "Soirée", + "from 12:00 till 15:00 (Thursday, Friday, Saturday, Monday)": + "de 12h00 à 15h00 (jeudi, vendredi, samedi, lundi)", + "Night": "Nuit", + "You have in account": "Vous avez en compte", + "Select Country": "Choisissez le pays", + "Ride Today :": "Roulez aujourd'hui :", + "After this period": "Après cette période", + "You can\"t cancel!": "Vous ne pouvez pas annuler !", + "لا تستطيع الغاء الرحله": "لا تستطيع الغاء الرحله", + "from 23:59 till 05:30": "de 23h59 à 05h30", + "Rate Driver": "Pilote de taux", + "Total Cost is": "Le coût total est", + "Write note": "Écrire une note", + "Time to arrive": "Il est temps d'arriver", + "Ride Summaries": "Résumés des trajets", + "Total Cost": "Coût total", + "Average of Hours of": "Moyenne des heures de", + "is ON for this month": "est activé pour ce mois", + "Days": "Jours", + "Total Hours on month": "Nombre total d'heures par mois", + "Counts of Hours on days": "Nombre d'heures par jour", + "OrderId": "Numéro de commande", + "created time": "temps créé", + "Speed Over": "Vitesse supérieure", + "I will slow down": "je vais ralentir", + "Map Passenger": "Carte Passager", + "Be Slowly": "Soyez lentement", + "If you want to make Google Map App run directly when you apply order": + "Si vous souhaitez que Google Map App s'exécute directement lorsque vous passez la commande", + "You can change the language of the app": + "Vous pouvez changer la langue de l'application", + "Your Budget less than needed": + "Votre budget inférieur à ce dont vous avez besoin", + "You can change the Country to get all features": + "Vous pouvez changer le pays pour obtenir toutes les fonctionnalités", + "Change Country": "Changer de pays" + }, + "de": { + "Sign In by Apple": "Anmelden von Apple", + "Sign In by Google": "Mit Google anmelden", + "How do I request a ride?": "Wie beantrage ich eine Fahrt?", + "Step-by-step instructions on how to request a ride through the Sefer app.": + "Schritt-für-Schritt-Anleitung zum Anfordern einer Fahrt über die Sefer-App.", + "What types of vehicles are available?": + "Welche Fahrzeugtypen stehen zur Verfügung?", + "Sefer offers a variety of vehicle options to suit your needs, including economy, comfort, and luxury. Choose the option that best fits your budget and passenger count.": + "Sefer bietet eine Vielzahl von Fahrzeugoptionen, die Ihren Bedürfnissen entsprechen, darunter Wirtschaftlichkeit, Komfort und Luxus. Wählen Sie die Option, die am besten zu Ihrem Budget und Ihrer Passagierzahl passt.", + "How can I pay for my ride?": "Wie kann ich meine Fahrt bezahlen?", + "Sefer offers multiple payment methods for your convenience. Choose between cash payment or credit/debit card payment during ride confirmation.": + "Sefer bietet für Ihren Komfort mehrere Zahlungsmethoden an. Wählen Sie bei der Fahrtbestätigung zwischen Barzahlung oder Kredit-/Debitkartenzahlung.", + "Can I cancel my ride?": "Kann ich meine Fahrt stornieren?", + "Yes, you can cancel your ride under certain conditions (e.g., before driver is assigned). See the Sefer cancellation policy for details.": + "Ja, Sie können Ihre Fahrt unter bestimmten Bedingungen stornieren (z. B. bevor der Fahrer zugewiesen wird). Einzelheiten finden Sie in den Stornierungsbedingungen von Sefer.", + "Driver Registration & Requirements": + "Fahrerregistrierung und Anforderungen", + "How can I register as a driver?": + "Wie kann ich mich als Fahrer registrieren?", + "What are the requirements to become a driver?": + "Was sind die Voraussetzungen, um Fahrer zu werden?", + "Visit our website or contact Sefer support for information on driver registration and requirements.": + "Besuchen Sie unsere Website oder wenden Sie sich an den Sefer-Support, um Informationen zur Fahrerregistrierung und den Anforderungen zu erhalten.", + "How do I communicate with the other party (passenger/driver)?": + "Wie kommuniziere ich mit der Gegenpartei (Beifahrer/Fahrer)?", + "Sefer provides in-app chat functionality to allow you to communicate with your driver or passenger during your ride.": + "Sefer bietet In-App-Chat-Funktionen, damit Sie während der Fahrt mit Ihrem Fahrer oder Beifahrer kommunizieren können.", + "What safety measures does Sefer offer?": + "Welche Sicherheitsmaßnahmen bietet Sefer?", + "Sefer prioritizes your safety. We offer features like driver verification, in-app trip tracking, and emergency contact options.": + "Sefer legt Wert auf Ihre Sicherheit. Wir bieten Funktionen wie Fahrerverifizierung, In-App-Reiseverfolgung und Notfallkontaktoptionen.", + "Frequently Questions": "Häufige Fragen", + "User does not exist.": "Benutzer existiert nicht.", + "We need your phone number to contact you and to help you.": + "Wir benötigen Ihre Telefonnummer, um Sie zu kontaktieren und Ihnen weiterzuhelfen.", + "You will recieve code in sms message": + "Sie erhalten den Code per SMS", + "Please enter": "Bitte eingeben", + "We need your phone number to contact you and to help you receive orders.": + "Wir benötigen Ihre Telefonnummer, um Sie zu kontaktieren und Ihnen bei der Entgegennahme von Bestellungen behilflich zu sein.", + "The full name on your criminal record does not match the one on your driver’s license. Please verify and provide the correct documents.": + "Der vollständige Name in Ihrem Strafregister stimmt nicht mit dem in Ihrem Führerschein überein. Bitte überprüfen Sie die korrekten Dokumente und stellen Sie diese bereit.", + "The national number on your driver’s license does not match the one on your ID document. Please verify and provide the correct documents.": + "Die nationale Nummer auf Ihrem Führerschein stimmt nicht mit der auf Ihrem Ausweisdokument überein. Bitte überprüfen Sie die korrekten Dokumente und stellen Sie diese bereit.", + "Capture an Image of Your Criminal Record": + "Machen Sie ein Bild Ihres Strafregisters", + "IssueDate": "Ausgabedatum", + "Capture an Image of Your car license front": + "Machen Sie ein Bild von der Vorderseite Ihres Autokennzeichens", + "Capture an Image of Your ID Document front": + "Machen Sie ein Bild von der Vorderseite Ihres Ausweisdokuments", + "NationalID": "Personalausweis", + "FullName": "Vollständiger Name", + "InspectionResult": "Inspektionsergebnis", + "Criminal Record": "Vorstrafenregister", + "The email or phone number is already registered.": + "Die E-Mail-Adresse oder Telefonnummer ist bereits registriert.", + "To become a ride-sharing driver on the Sefer app, you need to upload your driver\"s license, ID document, and car registration document. Our AI system will instantly review and verify their authenticity in just 2-3 minutes. If your documents are approved, you can start working as a driver on the Sefer app. Please note, submitting fraudulent documents is a serious offense and may result in immediate termination and legal consequences.": + "Um Mitfahrgelegenheitsfahrer in der Sefer-App zu werden, müssen Sie Ihren Führerschein, Ihr Ausweisdokument und Ihren Fahrzeugschein hochladen. Unser KI-System prüft und verifiziert deren Echtheit in nur 2-3 Minuten. Wenn Ihre Dokumente vorliegen Wenn Ihre Dokumente genehmigt sind, können Sie über die Sefer-App als Fahrer arbeiten. Bitte beachten Sie, dass die Einreichung betrügerischer Dokumente eine schwere Straftat darstellt und zu einer sofortigen Kündigung und rechtlichen Konsequenzen führen kann.", + "Documents check": "Dokumentenprüfung", + "Driver's License": "Führerschein", + "License Type": "Lizenz-Typ", + "National Number": "Nationale Nummer", + "Name (Arabic)": "Name (Arabisch)", + "Name (English)": "Name (Englisch)", + "Address": "Adresse", + "Issue Date": "Ausgabedatum", + "Expiry Date": "Verfallsdatum", + "License Categories": "Lizenzkategorien", + "driver_license": "Führerschein", + "Capture an Image of Your Driver License": + "Erfassen Sie ein Bild Ihres Führerscheins", + "ID Documents Back": "Ausweisdokumente zurück", + "National ID": "Personalausweis", + "Occupation": "Beruf", + "Gender": "Geschlecht", + "Religion": "Religion", + "Marital Status": "Familienstand", + "Full Name (Marital)": "Vollständiger Name (ehelich)", + "Expiration Date": "Verfallsdatum", + "Capture an Image of Your ID Document Back": + "Nehmen Sie ein Bild Ihres Ausweisdokuments auf", + "ID Documents Front": "Ausweisdokumente vorne", + "First Name": "Vorname", + "CardID": "Ausweiskarte", + "Full Name": "Vollständiger Name", + "Vehicle Details Front": "Fahrzeugdetails vorne", + "Plate Number": "Kennzeichen", + "Owner Name": "Besitzername", + "Vehicle Details Back": "Fahrzeugdetails zurück", + "Make": "Machen", + "Model": "Modell", + "Year": "Jahr", + "Chassis": "Chassis", + "Color": "Farbe", + "Displacement": "Verschiebung", + "Fuel": "Kraftstoff", + "Tax Expiry Date": "Ablaufdatum der Steuer", + "Inspection Date": "Inspektionsdatum", + "Capture an Image of Your car license back": + "Nehmen Sie ein Bild Ihres Autoführerscheins auf", + "Capture an Image of Your Driver’s License": + "Machen Sie ein Bild Ihres Führerscheins", + "Sign in with Google for easier email and name entry": + "Melden Sie sich bei Google an, um die E-Mail- und Namenseingabe zu vereinfachen", + "You will choose allow all the time to be ready receive orders": + "Sie können sich dafür entscheiden, immer bereit zu sein, Bestellungen entgegenzunehmen", + "Welcome to Sefer!": "Willkommen in Sefer!", + "Get to your destination quickly and easily.": + "Kommen Sie schnell und einfach an Ihr Ziel.", + "Enjoy a safe and comfortable ride.": + "Genießen Sie eine sichere und komfortable Fahrt.", + "Choose Language": "Sprache wählen", + "Login": "Anmeldung", + "Pay with Wallet": "Bezahlen Sie mit Wallet", + "Invalid MPIN": "Ungültige MPIN", + "Invalid OTP": "Ungültiges OTP", + "Enter your email address": "Geben sie ihre E-Mailadresse ein", + "Please enter Your Email.": + "Bitte geben Sie ihre E-Mail-Adresse ein.", + "Enter your phone number": "Gib deine Telefonnummer ein", + "Please enter your phone number.": + "Bitte geben sie ihre Telefonnummer ein.", + "Please enter Your Password.": "Bitte geben Sie Ihr Passwort ein.", + "Submit": "Einreichen", + "if you dont have account": "wenn Sie kein Konto haben", + "Register": "Registrieren", + "Accept Ride's Terms & Review Privacy Notice": + "Akzeptieren Sie die Geschäftsbedingungen von Ride und lesen Sie die Datenschutzerklärung", + "By selecting 'I Agree' below, I have reviewed and agree to the Terms of Use and acknowledge the Privacy Notice. I am at least 18 years of age.": + "Indem ich unten „Ich stimme zu“ auswähle, habe ich die Nutzungsbedingungen gelesen, stimme ihnen zu und erkenne die Datenschutzerklärung an. Ich bin mindestens 18 Jahre alt.", + "I Agree": "Ich stimme zu", + "First name": "Vorname", + "Enter your first name": "Geben Sie Ihren Vornamen ein", + "Please enter your first name.": + "Bitte geben Sie Ihren Vornamen ein.", + "Last name": "Familienname, Nachname", + "Enter your last name": "Geben Sie Ihren Nachnamen ein", + "Please enter your last name.": + "Bitte geben Sie ihren Nachnamen ein.", + "City": "Stadt", + "Please enter your City.": "Bitte geben Sie Ihre Stadt ein.", + "Male": "Männlich", + "Female": "Weiblich", + "Verify Email": "E-Mail bestätigen", + "We sent 5 digit to your Email provided": + "Wir haben eine 5-stellige E-Mail an die von Ihnen angegebene E-Mail-Adresse gesendet", + "5 digit": "5-stellig", + "Send Verification Code": "Bestätigungscode senden", + "Your Ride Duration is": "Ihre Fahrtdauer beträgt", + "You will be thier in": "Du wirst da sein", + "You trip distance is": "Ihre Reisedistanz beträgt", + "Fee is": "Gebühr ist", + "From :": "Aus :", + "To :": "Zu :", + "Add Promo": "Promo hinzufügen", + "Confirm Selection": "Auswahl bestätigen", + "distance is": "Entfernung ist", + "duration is": "Dauer ist", + "I don't need a ride anymore": + "Ich brauche keine Mitfahrgelegenheit mehr", + "I was just trying the application": + "Ich habe gerade die Anwendung ausprobiert", + "No driver accepted my request": + "Kein Fahrer hat meine Anfrage angenommen", + "I added the wrong pick-up/drop-off location": + "Ich habe den falschen Abhol-/Abgabeort hinzugefügt", + "I don't have a reason": "Ich habe keinen Grund", + "Other": "Andere", + "Can we know why you want to cancel Ride ?": + "Können wir erfahren, warum Sie Ride absagen möchten?", + "Cancel Ride": "Fahrt abbrechen", + "Add Payment Method": "Zahlungsmethode hinzufügen", + "Your Wallet balance is": "Ihr Wallet-Guthaben beträgt", + "Ride Wallet": "Ride Wallet", + "Payment Method": "Bezahlverfahren", + "Type here Place": "Geben Sie hier Ort ein", + "Are You sure to ride to": + "Sind Sie sicher, dass Sie dorthin fahren?", + "Confirm": "Bestätigen", + "Back": "Zurück", + "You are Delete": "Sie sind gelöscht", + "Deleted": "Gelöscht", + "You Dont Have Any places yet !": "Sie haben noch keine Plätze!", + "Favorite Places": "Lieblingsplätze", + "From : Current Location": "Von: Aktueller Standort", + "Where to": "Wohin", + "Notifications": "Benachrichtigungen", + "Profile": "Profil", + "Home": "Heim", + "My Cared": "Meine Fürsorge", + "Add Card": "Karte hinzufügen", + "Add Credit Card": "Kreditkarte hinzufügen", + "Please enter the cardholder name": + "Bitte geben Sie den Namen des Karteninhabers ein", + "Please enter the expiry date": "Bitte geben Sie das Ablaufdatum ein", + "Please enter the CVV code": "Bitte geben Sie den CVV-Code ein", + "Go To Favorite Places": "Gehen Sie zu Lieblingsorten", + "Go to this Target": "Gehen Sie zu diesem Ziel", + "My Profile": "Mein Profil", + "Sign Out": "Abmelden", + "Home Page": "Startseite", + "Are you want to go to this site": + "Möchten Sie diese Seite besuchen?", + "MyLocation": "Mein Standort", + "my location": "mein Standort", + "Target": "Ziel", + "Update": "Aktualisieren", + "You Should choose rate figure": "Sie sollten den Tarifwert wählen", + "Login Captin": "Melden Sie sich an, Kapitän", + "Register Captin": "Registrieren Sie Kapitän", + "Send Verfication Code": "Bestätigungscode senden", + "KM": "KM", + "End Ride": "Fahrt beenden", + "Minute": "Minute", + "Go to passenger Location now": + "Gehen Sie jetzt zur Passagierposition", + "Duration of the Ride is": "Die Dauer der Fahrt beträgt", + "Distance of the Ride is": "Die Entfernung der Fahrt beträgt", + "Name of the Passenger is": "Name des Passagiers ist", + "Hello this is Captain": "Hallo, hier ist Captain", + "Start the Ride": "Starten Sie die Fahrt", + "Please Wait If passenger want To Cancel!": + "Bitte warten Sie, wenn der Passagier stornieren möchte!", + "Total Duration:": "Gesamtdauer:", + "Active Duration:": "Aktive Dauer:", + "Waiting for Captin ...": "Warten auf Kapitän ...", + "Age is": "Alter ist", + "Rating is": "Bewertung ist", + "to arrive you.": "um bei dir anzukommen.", + "Order History": "Bestellverlauf", + "My Wallet": "Mein Geldbeutel", + "Tariff": "Tarif", + "Settings": "Einstellungen", + "Feed Back": "Rückmeldung", + "Promos": "Promos", + "Please enter a valid 16-digit card number": + "Bitte geben Sie eine gültige 16-stellige Kartennummer ein", + "Add Phone": "Telefon hinzufügen", + "Please enter a phone number": + "Bitte geben Sie eine Telefonnummer ein", + "You dont Add Emergency Phone Yet!": + "Sie haben noch kein Notruftelefon hinzugefügt!", + "You will arrive to your destination after": + "Danach erreichen Sie Ihr Ziel", + "You can cancel Ride now": "Sie können die Fahrt jetzt stornieren", + "You Can cancel Ride After Captain did not come in the time": + "Sie können die Fahrt abbrechen, nachdem der Kapitän nicht rechtzeitig erschienen ist", + "If you in Car Now. Press Start The Ride": + "Wenn Sie jetzt im Auto sind. Drücken Sie „Fahrt starten“.", + "You Dont Have Any amount in": "Sie haben keinen Betrag drin", + "Wallet!": "Geldbörse!", + "You Have": "Du hast", + "Save Credit Card": "Kreditkarte sparen", + "Show Promos": "Promos anzeigen", + "10 and get 4% discount": "10 und erhalten Sie 4 % Rabatt", + "20 and get 6% discount": "20 und erhalten Sie 6 % Rabatt", + "40 and get 8% discount": "40 und erhalten Sie 8 % Rabatt", + "100 and get 11% discount": "100 und erhalten Sie 11 % Rabatt", + "Pay with Your PayPal": "Bezahlen Sie mit Ihrem PayPal", + "You will choose one of above !": + "Sie werden eines der oben genannten auswählen!", + "Cancel": "Stornieren", + "Delete My Account": "Mein Konto löschen", + "Edit Profile": "Profil bearbeiten", + "Name": "Name", + "Update Gender": "Geschlecht aktualisieren", + "Education": "Ausbildung", + "Update Education": "Bildung aktualisieren", + "Employment Type": "Beschäftigungsverhältnis", + "SOS Phone": "SOS-Telefon", + "High School Diploma": "High-School-Diplom", + "Associate Degree": "Associate Degree", + "Bachelor's Degree": "Bachelor-Abschluss", + "Master's Degree": "Master-Abschluss", + "Doctoral Degree": "Doktorgrad", + "Promos For today": "Promos für heute", + "Copy this Promo to use it in your Ride!": + "Kopieren Sie diese Promo, um sie in Ihrer Fahrt zu verwenden!", + "To change some Settings": "Um einige Einstellungen zu ändern", + "To change Language the App": "Um die Sprache der App zu ändern", + "Order Request Page": "Bestellanforderungsseite", + "Rouats of Trip": "Routen der Reise", + "Passenger Name is": "Passagiername ist", + "Total From Passenger is": "Gesamt vom Passagier ist", + "Duration To Passenger is": "Die Dauer bis zum Passagier beträgt", + "Distance To Passenger is": "Die Entfernung zum Passagier beträgt", + "Total For You is": "Total für Sie ist", + "Distance is": "Entfernung ist", + "KM": "KM", + "Duration of Trip is": "Die Dauer der Reise beträgt", + "Minutes": "Protokoll", + "Apply Order": "Auftrag anwenden", + "Refuse Order": "Anordnung ablehnen", + "Rate Captain": "Rate Kapitän", + "Enter your Note": "Geben Sie Ihre Notiz ein", + "Type something...": "Schreibe etwas...", + "Submit rating": "Bewertung abgeben", + "Rate Passenger": "Bewerten Sie Passagier", + "Ride Summary": "Zusammenfassung der Fahrt", + "welcome_message": "Willkommensnachricht", + "app_description": "app_description", + "get_to_destination": "get_to_destination", + "get_a_ride": "eine Mitfahrgelegenheit bekommen", + "safe_and_comfortable": "sicher_und_komfortabel", + "committed_to_safety": "commited_to_safety", + "Driver Applied the Ride for You": + "Der Fahrer hat die Fahrt für Sie übernommen", + "Show latest promo": "Neueste Promo anzeigen", + "Cancel Trip": "Reise stornieren", + "Passenger Cancel Trip": "Passagier storniert Reise", + "Please stay on the picked point.": + "Bitte bleiben Sie auf dem gewählten Punkt.", + "Trip is Begin": "Die Reise beginnt", + "Hi ,I will go now": "Hallo, ich werde jetzt gehen", + "Passenger come to you": "Passagier kommt zu Ihnen", + "Hi ,I Arrive your site": + "Hallo, ich bin auf Ihrer Website angekommen", + "Driver Finish Trip": "Fahrer beendet Fahrt", + "you will pay to Driver": "Sie zahlen an den Fahrer", + "Driver Cancel Your Trip": "Fahrer stornieren Ihre Reise", + "you will pay to Driver you will be pay the cost of driver time look to your SEFER Wallet": + "Sie zahlen an den Fahrer. Sie werden die Kosten für die Fahrerzeit bezahlen. Schauen Sie auf Ihr SEFER-Wallet", + "I will go now": "ich werde jetzt gehen", + "You Have Tips": "Sie haben Tipps", + "tips": "Tipps", + "Total is": "Insgesamt ist", + "الْمَجْمُوع هُوَ": "الْمَجْمُوع هُوَ", + "No,I want": "Nein, ich möchte", + "Your fee is": "Ihr Honorar beträgt", + "Do you want to pay Tips for this Driver": + "Möchten Sie für diesen Fahrer Trinkgeld zahlen?", + "Tip is": "Tipp ist", + "Tip is": "Tipp ist", + "Camera Access Denied.": "Kamerazugriff verweigert.", + "Open Settings": "Einstellungen öffnen", + "GPS Required Allow !.": "GPS erforderlich Erlauben!.", + "Your Account is Deleted": "Ihr Konto wurde gelöscht", + "Are you sure to delete your account?": + "Möchten Sie Ihr Konto wirklich löschen?", + "Your data will be erased after 2 weeks": + "Ihre Daten werden nach 2 Wochen gelöscht", + "And you will can't return to use app after 1 month": + "Und Sie können die App nach einem Monat nicht mehr verwenden", + "وَلَن تَسْتَطِيع اسْتِخْدَام التَّطْبِيق مَرَّة أُخْرَى بَعْد شَهْر": + "وَلَن تَسْتَطِيع اسْتِخْدَام التَّطْبِيق مَرَّة أُخْرَى بَعْد شَهْر", + "Enter Your First Name": "Geben Sie Ihren Vornamen ein", + "Are you Sure to LogOut?": + "Sind Sie sicher, dass Sie sich abmelden möchten?", + "Email Wrong": "E-Mail falsch", + "Email you inserted is Wrong.": + "Die von Ihnen eingegebene E-Mail ist falsch.", + "You have finished all times": "Du hast alle Zeiten abgeschlossen", + "if you want help you can email us here": + "Wenn Sie Hilfe benötigen, können Sie uns hier eine E-Mail senden", + "Thanks": "Danke", + "Email Us": "Schreiben Sie uns eine E-Mail", + "I cant register in your app in face detection": + "Ich kann mich bei der Gesichtserkennung nicht in Ihrer App registrieren", + "Hi": "Hallo", + "No face detected": "Kein Gesicht erkannt", + "Image detecting result is": "Das Ergebnis der Bilderkennung ist", + "from 3 times Take Attention": "ab 3 mal Achtung", + "Be sure for take accurate images please": + "Bitte achten Sie darauf, dass Sie genaue Bilder machen", + "You have": "Du hast", + "لَدَيْك": "لَدَيْك", + "image verified": "Bild verifiziert", + "Next": "Nächste", + "There is no help Question here": "Hier gibt es keine Hilfefrage", + "Call End": "Anruf beenden", + "You dont have Points": "Sie haben keine Punkte", + "You Are Stopped For this Day !": + "Sie sind für diesen Tag angehalten!", + "You must be charge your Account": "Sie müssen Ihr Konto belasten", + "You Refused 3 Rides this Day that is the reason": + "Sie haben an diesem Tag drei Fahrten abgelehnt, das ist der Grund", + "See you Tomorrow!": "Bis morgen!", + "لِقَائِنَا غَدًا!": "Alles klar!", + "Recharge my Account": "Laden Sie mein Konto auf", + "Ok , See you Tomorrow": "OK, wir sehen uns morgen", + "You are Stopped": "Sie sind gestoppt", + "Connected": "In Verbindung gebracht", + "Not Connected": "Nicht verbunden", + "Your are far from passenger location": + "Sie sind weit vom Passagierstandort entfernt", + "go to your passenger location before": + "Gehen Sie vorher zu Ihrem Passagierstandort", + "Passenger cancel trip": "Passagier storniert Reise", + "يُلْغِي الرَّاكِب الرِّحْلَة": "يُلْغِي الرَّاكِب الرِّحْلَة", + "You will get cost of your work for this trip": + "Sie erhalten die Kosten für Ihre Arbeit für diese Reise", + "in your wallet": "in deinem Portemonnaie", + "you gain": "du gewinnst", + "Order Cancelled": "Bestellung storniert", + "Order Cancelled by Passenger": "Bestellung vom Passagier storniert", + "Success": "Erfolg", + "Feedback data saved successfully": + "Feedbackdaten erfolgreich gespeichert", + "No Promo for today .": "Für heute gibt es keine Aktion.", + "Select your destination": "Wählen Sie Ihr Ziel aus", + "Search for your Start point": "Suchen Sie nach Ihrem Startpunkt", + "Search for waypoint": "Wegpunkt suchen", + "Current Location": "Aktueller Standort", + "Add Location 1": "Standort 1 hinzufügen", + "You must Verify email !.": + "Sie müssen Ihre E-Mail-Adresse bestätigen!", + "Cropper": "Cropper", + "Saved Sucssefully": "Erfolgreich gespeichert", + "Select Date": "Datum auswählen", + "Birth Date": "Geburtsdatum", + "Ok": "OK", + "the 500 points equal 30 JOD": "die 500 Punkte entsprechen 30 JOD", + "the 500 points equal 30 JOD for you": + "die 500 Punkte entsprechen für Sie 30 JOD", + "So go and gain your money": "Also geh und verdiene dein Geld", + "فَاسْتَحِقَّ فُلُوسَك وَاكْسِب النِّقَاط": + "فَاسْتَحِقَّ فُلُوسَك وَاكْسِب النِّقَاط", + "token updated": "Token aktualisiert", + "Add Location 2": "Standort 2 hinzufügen", + "Add Location 3": "Standort hinzufügen 3", + "Add Location 4": "Standort hinzufügen 4", + "Waiting for your location": "Warten auf Ihren Standort", + "Search for your destination": "Suchen Sie nach Ihrem Ziel", + "Hi! This is": "Hallo! Das ist", + "I am using": "ich benutze", + "to ride with": "mitfahren", + "as the driver.": "als Fahrer.", + "is driving a": "fährt ein", + "with license plate": "mit Nummernschild", + "I am currently located at": "Ich befinde mich derzeit in", + "Please go to Car now": "Bitte gehen Sie jetzt zu Auto", + "If you need to reach me, please contact the driver directly at": + "Wenn Sie mich erreichen möchten, wenden Sie sich bitte direkt an den Fahrer unter", + "No Car or Driver Found in your area.": + "In Ihrer Nähe wurde kein Auto oder Fahrer gefunden.", + "Please Try anther time": "Bitte versuchen Sie es ein anderes Mal", + "There no Driver Aplly your order sorry for that": + "Es gibt keinen Fahrer, der Ihre Bestellung aufgibt, tut mir leid", + "Trip Cancelled": "Reise abgesagt", + "The Driver Will be in your location soon .": + "Der Fahrer wird bald an Ihrem Standort sein.", + "The distance less than 500 meter.": + "Die Entfernung beträgt weniger als 500 Meter.", + "Promo End !": "Aktionsende!", + "There is no notification yet": "Es gibt noch keine Benachrichtigung", + "Use Touch ID or Face ID to confirm payment": + "Verwenden Sie Touch ID oder Face ID, um die Zahlung zu bestätigen", + "Contact us for any questions on your order.": + "Kontaktieren Sie uns bei Fragen zu Ihrer Bestellung.", + "Pyament Cancelled .": "Zahlung storniert.", + "type here": "Geben Sie hier ein", + "Scan Driver License": "Führerschein scannen", + "Please put your licence in these border": + "Bitte tragen Sie Ihren Führerschein in diesen Rahmen ein", + "Camera not initialized yet": "Kamera noch nicht initialisiert", + "Take Image": "Bild machen", + "AI Page": "AI-Seite", + "Take Picture Of ID Card": "Machen Sie ein Foto vom Personalausweis", + "Take Picture Of Driver License Card": + "Machen Sie ein Foto der Führerscheinkarte", + "We are process picture please wait": + "Wir sind Prozessbild, bitte warten", + "There is no data yet.": "Es liegen noch keine Daten vor.", + "Name :": "Name :", + "Drivers License Class:": "Führerscheinklasse:", + "Document Number:": "Dokumentnummer:", + "Address:": "Adresse:", + "Height:": "Höhe:", + "Expiry Date:": "Verfallsdatum:", + "Date of Birth:": "Geburtsdatum:", + "You can\"t continue with us .": + "Sie können mit uns nicht weitermachen.", + "You should renew Driver license": + "Sie sollten den Führerschein erneuern", + "Detect Your Face": "Erkennen Sie Ihr Gesicht", + "Go to next step": "Gehen Sie zum nächsten Schritt", + "scan Car License.": "Autolizenz scannen.", + "aاسْتِخْرَاج رُخْصَة السَّيَّارَة.": + "aاسْتِخْرَاج رُخْصَة السَّيَّارَة.", + "Name in arabic": "Name auf Arabisch", + "Drivers License Class": "Führerscheinklasse", + "Date of Birth": "Geburtsdatum", + "Age": "Alter", + "Lets check Car license": "Lass uns den Autoschein überprüfen", + "Car Kind": "Auto Art", + "Car Plate": "Nummernschild", + "Lets check License Back Face": + "Schauen wir uns die Rückseite der Lizenz an", + "Car License Card": "Autolizenzkarte", + "No image selected yet": "Noch kein Bild ausgewählt", + "Made :": "Gemacht :", + "model :": "Modell :", + "VIN :": "Fahrgestellnummer:", + "year :": "Jahr :", + "ُExpire Date": "Ablaufdatum", + "Login Driver": "Login-Treiber", + "Password must br at least 6 character.": + "Das Passwort muss mindestens 6 Zeichen lang sein.", + "if you don\"t have account": "wenn Sie kein Konto haben", + "Here recorded trips audio": "Hier aufgezeichnete Reisen mit Audio", + "Register as Driver": "Registrieren Sie sich als Fahrer", + "Privacy Notice": "Datenschutzerklärung", + "By selecting 'I Agree' below, I have reviewed and agree to the Terms of Use and acknowledge the": + "Indem ich unten „Ich stimme zu“ auswähle, habe ich die Nutzungsbedingungen gelesen, stimme ihnen zu und erkenne sie an", + ". I am at least 18 years of age.": + ". Ich bin mindestens 18 Jahre alt.", + "Log Out Page": "Abmeldeseite", + "Log Off": "Abmelden", + "Register Driver": "Registrieren Sie den Fahrer", + "Verify Email For Driver": + "Überprüfen Sie die E-Mail-Adresse des Fahrers", + "Admin DashBoard": "Admin-DashBoard", + "Your name": "Ihr Name", + "your ride is applied": "Ihre Fahrt wird angewendet", + "Your password": "Ihr Passwort", + "H and": "Hand", + "LE": "LE", + "JOD": "JOD", + "m": "M", + "We search nearst Driver to you": + "Wir suchen den Fahrer in Ihrer Nähe", + "please wait till driver accept your order": + "Bitte warten Sie, bis der Fahrer Ihre Bestellung akzeptiert", + "No accepted orders? Try raising your trip fee to attract riders.": + "Keine angenommenen Bestellungen? Versuchen Sie, Ihre Reisegebühr zu erhöhen, um Fahrgäste anzulocken.", + "You should select one": "Sie sollten eines auswählen", + "The driver accept your order for": + "Der Fahrer nimmt Ihre Bestellung entgegen", + "Increase Fee": "Gebühr erhöhen", + "No, thanks": "Nein danke", + "The driver on your way": "Der Fahrer auf Ihrem Weg", + "Total price from": "Gesamtpreis ab", + "Order Details Speed": "Bestelldetails Geschwindigkeit", + "Order Applied": "Auftrag angewendet", + "accepted your order": "habe Ihre Bestellung angenommen", + "We regret to inform you that another driver has accepted this order.": + "Wir bedauern, Ihnen mitteilen zu müssen, dass ein anderer Fahrer diesen Auftrag angenommen hat.", + "Selected file:": "Ausgewählte Datei:", + "Your trip cost is": "Ihre Reisekosten betragen", + "this will delete all files from your device": + "Dadurch werden alle Dateien von Ihrem Gerät gelöscht", + "you have a negative balance of": + "Sie haben einen negativen Saldo von", + "in your": "in deinem", + "Exclusive offers and discounts always with the Sefer app": + "Exklusive Angebote und Rabatte immer mit der Sefer-App", + "Please go to Car Driver": "Bitte gehen Sie zu Autofahrer", + "wallet due to a previous trip.": + "Geldbeutel aufgrund einer früheren Reise.", + "Submit Question": "Frage einreichen", + "Please enter your Question.": "Bitte geben Sie Ihre Frage ein.", + "Help Details": "Hilfedetails", + "No trip yet found": "Noch keine Reise gefunden", + "No Response yet.": "Noch keine Antwort.", + "You Earn today is": "Sie verdienen heute", + "You Have in": "Du hast drin", + "Total points is": "Die Gesamtpunktzahl beträgt", + "Total Connection Duration:": "Gesamtverbindungsdauer:", + "H and": "Hand", + "Passenger name :": "Passagier-Name :", + "Cost Of Trip IS": "Die Reisekosten betragen IST", + "Arrival time": "Ankunftszeit", + "arrival time to reach your point": + "Ankunftszeit, um Ihren Punkt zu erreichen", + "For Speed and Delivery trips, the price is calculated dynamically. For Comfort trips, the price is based on time and distance": + "Für Speed- und Delivery-Fahrten wird der Preis dynamisch berechnet. Bei Komfortfahrten richtet sich der Preis nach Zeit und Entfernung", + "Hello this is Driver": "Hallo, hier ist Driver", + "Is the Passenger in your Car ?": + "Befindet sich der Beifahrer in Ihrem Auto?", + "Please wait for the passenger to enter the car before starting the trip.": + "Bitte warten Sie, bis der Passagier das Auto betritt, bevor Sie die Fahrt beginnen.", + "No ,still Waiting.": "Nein, ich warte immer noch.", + "I arrive you": "Ich komme zu dir", + "I Arrive your site": "Ich komme auf Ihre Website", + "You are not in near to passenger location": + "Sie befinden sich nicht in der Nähe des Passagierstandorts", + "please go to picker location exactly": + "Bitte gehen Sie genau zum Picker-Standort", + "You Can Cancel Trip And get Cost of Trip From": + "Sie können die Reise stornieren und die Reisekosten erhalten", + "Are you sure to cancel?": "Möchten Sie wirklich stornieren?", + "Yes": "Ja", + "Insert Emergincy Number": "Geben Sie die Notrufnummer ein", + "Best choice for comfort car and flexible route and stops point": + "Beste Wahl für ein komfortables Auto und eine flexible Route und Haltestellen", + "Insert": "Einfügen", + "This is for delivery or a motorcycle.": + "Dies ist für die Lieferung oder ein Motorrad.", + "This trip goes directly from your starting point to your destination for a fixed price. The driver must follow the planned route": + "Diese Reise führt zum Festpreis direkt von Ihrem Startpunkt zu Ihrem Ziel. Der Fahrer muss der geplanten Route folgen", + "You can decline a request without any cost": + "Sie können eine Anfrage kostenlos ablehnen", + "Perfect for adventure seekers who want to experience something new and exciting": + "Perfekt für Abenteuerlustige, die etwas Neues und Aufregendes erleben möchten", + "My current location is:": "Mein aktueller Standort ist:", + "and I have a trip on": "und ich habe eine Reise vor mir", + "App with Passenger": "App mit Passagier", + "مع الراكب": "مع الراكب", + "You will be pay the cost to driver or we will get it from you on next trip": + "Sie zahlen die Kosten dem Fahrer oder wir übernehmen sie bei der nächsten Fahrt für Sie", + "Trip has Steps": "Die Reise hat Schritte", + "Distance from Passenger to destination is": + "Die Entfernung vom Passagier zum Ziel beträgt", + "price is": "der Preis ist", + "This ride type does not allow changes to the destination or additional stops": + "Bei diesem Fahrttyp sind keine Änderungen des Ziels oder zusätzliche Stopps möglich", + "This price may be changed": "Dieser Preis kann geändert werden", + "No SIM card, no problem! Call your driver directly through our app. We use advanced technology to ensure your privacy.": + "Keine SIM-Karte, kein Problem! Rufen Sie Ihren Fahrer direkt über unsere App an. Wir verwenden fortschrittliche Technologie, um Ihre Privatsphäre zu gewährleisten.", + "This ride type allows changes, but the price may increase": + "Bei diesem Fahrtyp sind Änderungen möglich, der Preis kann jedoch steigen", + "message From passenger": "Nachricht vom Passagier", + "Select one message": "Wählen Sie eine Nachricht aus", + "My location is correct. You can search for me using the navigation app": + "Mein Standort ist korrekt. Sie können mit der Navigations-App nach mir suchen", + "I'm waiting for you": "Ich warte auf dich", + "Hello, I'm at the agreed-upon location": + "Hallo, ich bin am vereinbarten Ort", + "We noticed the speed is exceeding 100 km/h. Please slow down for your safety. If you feel unsafe, you can share your trip details with a contact or call the police using the red SOS button.": + "Wir haben festgestellt, dass die Geschwindigkeit 100 km/h überschreitet. Bitte fahren Sie zu Ihrer Sicherheit langsamer. Wenn Sie sich unsicher fühlen, können Sie Ihre Reisedaten einem Kontakt mitteilen oder über die rote SOS-Taste die Polizei rufen.", + "Warning: Speeding detected!": + "Warnung: Geschwindigkeitsüberschreitung erkannt!", + "Please help! Contact me as soon as possible.": + "Bitte helfen Sie! Kontaktieren Sie mich so schnell wie möglich.", + "Share Trip Details": "Reisedetails teilen", + "Car Plate is": "Autokennzeichen ist", + "the 300 points equal 300 L.E for you": + "Die 300 Punkte entsprechen für Sie 300 L.E", + "So go and gain your money": "Also geh und verdiene dein Geld", + "the 300 points equal 300 L.E": "die 300 Punkte entsprechen 300 L.E", + "The payment was not approved. Please try again.": + "Die Zahlung wurde nicht genehmigt. Bitte versuche es erneut.", + "Payment Failed": "Bezahlung fehlgeschlagen", + "Error": "Fehler", + "An error occurred during the payment process.": + "Beim Bezahlvorgang ist ein Fehler aufgetreten.", + "The payment was approved.": "Die Zahlung wurde genehmigt.", + "Payment Successful": "Bezahlung erfolgreich", + "No ride found yet": "Noch keine Fahrt gefunden", + "Accept Order": "Bestellung annehmen", + "reject your order.": "Lehnen Sie Ihre Bestellung ab.", + "Bottom Bar Example": "Beispiel für die untere Leiste", + "Driver phone": "Fahrertelefon", + "Statistics": "Statistiken", + "Origin": "Herkunft", + "Destination": "Ziel", + "Driver Name": "Fahrername", + "Driver Car Plate": "Fahrer-Autokennzeichen", + "Available for rides": "Für Fahrten verfügbar", + "Scan Id": "Scan-ID", + "Camera not initilaized yet": "Kamera noch nicht initialisiert", + "Scan ID MklGoogle": "Scan-ID MklGoogle", + "Language": "Sprache", + "Jordan": "Jordanien", + "USA": "USA", + "Egypt": "Ägypten", + "Turkey": "Truthahn", + "Saudi Arabia": "Saudi-Arabien", + "Qatar": "Katar", + "Bahrain": "Bahrain", + "Kuwait": "Kuwait", + "But you have a negative salary of": + "Aber Sie haben ein negatives Gehalt von", + "Promo Code": "Aktionscode", + "Your trip distance is": "Ihre Reisedistanz beträgt", + "Enter promo code": "Geben Sie den Aktionscode ein", + "You have promo!": "Sie haben Promo!", + "Cost Duration": "Kostendauer", + "Duration is": "Dauer ist", + "Leave": "Verlassen", + "Join": "Verbinden", + "You Should be select reason.": "Sie sollten den Grund auswählen.", + "\$": "\$", + "Waiting for Driver ...": "Warten auf den Fahrer ...", + "Latest Recent Trip": "Letzte letzte Reise", + "from your list": "aus Ihrer Liste", + "Do you want to change Work location": + "Möchten Sie den Arbeitsort ändern?", + "Do you want to change Home location": + "Möchten Sie den Heimatort ändern?", + "We Are Sorry That we dont have cars in your Location!": + "Es tut uns leid, dass wir an Ihrem Standort keine Autos haben!", + "Choose from Map": "Wählen Sie aus der Karte", + "Pick your ride location on the map - Tap to confirm": + "Wählen Sie den Standort Ihrer Fahrt auf der Karte aus – Tippen Sie zur Bestätigung", + "To Work": "Arbeiten", + "Are you want to go this site": "Möchten Sie diese Seite besuchen?", + "Closest & Cheapest": "Am nächsten und am günstigsten", + "Work Saved": "Arbeit gespart", + "Sefer is the ride-hailing app that is safe, reliable, and accessible.": + "Sefer ist die sichere, zuverlässige und zugängliche Ride-Hailing-App.", + "With Sefer, you can get a ride to your destination in minutes.": + "Mit Sefer können Sie in wenigen Minuten an Ihr Ziel fahren.", + "Sefer is committed to safety, and all of our captains are carefully screened and background checked.": + "Sefer legt großen Wert auf Sicherheit und alle unsere Kapitäne werden sorgfältig überprüft und überprüft.", + "To Home": "Nach Hause", + "Home Saved": "Zuhause gerettet", + "Destination selected": "Ziel ausgewählt", + "Now select start pick": "Wählen Sie nun Startauswahl", + "Pick from map": "Wählen Sie aus der Karte", + "Click here point": "Klicken Sie hier", + "No Car in your site. Sorry!": + "Kein Auto auf Ihrer Website. Entschuldigung!", + "Nearest Car for you about": "Das nächstgelegene Auto für Sie", + "N/A": "N / A", + "From :": "Aus :", + "Get Details of Trip": "Erhalten Sie Details zur Reise", + "If you want add stop click here": + "Wenn Sie Stopp hinzufügen möchten, klicken Sie hier", + "Driver": "Treiber", + "Where you want go": "Wo möchtest du gehen", + "My Card": "Meine Karte", + "Start Record": "Aufnahme starten", + "Wallet": "Geldbörse", + "History of Trip": "Geschichte der Reise", + "Helping Center": "Hilfezentrum", + "Record saved": "Datensatz gespeichert", + "Trips recorded": "Fahrten aufgezeichnet", + "Select Your Country": "Wähle dein Land", + "To ensure you receive the most accurate information for your location, please select your country below. This will help tailor the app experience and content to your country.": + "Um sicherzustellen, dass Sie die genauesten Informationen für Ihren Standort erhalten, wählen Sie bitte unten Ihr Land aus. Dadurch können Sie das App-Erlebnis und den Inhalt an Ihr Land anpassen.", + "Are you sure to delete recorded files": + "Sind Sie sicher, dass Sie die aufgezeichneten Dateien löschen?", + "Select recorded trip": "Aufgezeichnete Fahrt auswählen", + "Card Number": "Kartennummer", + "Hi, Where to": "Hallo, wohin", + "Pick your destination from Map": + "Wählen Sie Ihr Ziel auf der Karte aus", + "Add Stops": "Stopps hinzufügen", + "Get Direction": "Holen Sie sich die Richtung", + "Add Location": "Ort hinzufügen", + "Switch Rider": "Fahrer wechseln", + "You will arrive to your destination after timer end.": + "Nach Ablauf des Timers erreichen Sie Ihr Ziel.", + "You can cancel trip": "Sie können die Reise stornieren", + "The driver waitting you in picked location .": + "Der Fahrer erwartet Sie am ausgewählten Ort.", + "Pay with Your": "Bezahlen Sie mit Ihrem", + "Pay with Credit Card": "Mit Kreditkarte bezahlen", + "Payment History": "Zahlungshistorie", + "Show Promos to Charge": "Werbeaktionen zum Aufladen anzeigen", + "Point": "Punkt", + "Driver Wallet": "Fahrer-Geldbörse", + "Total Points is": "Die Gesamtpunktzahl beträgt", + "Total Budget from trips is": "Das Gesamtbudget aus Reisen beträgt", + "Total Amount:": "Gesamtmenge:", + "Total Budget from trips by": "Gesamtbudget aus Reisen von", + "Credit card is": "Kreditkarte ist", + "بطاقة الائتمان هي": "بطاقة الائتمان هي", + "This amount for all trip I get from Passengers": + "Diesen Betrag erhalte ich für alle Fahrten von Passagieren", + "Pay from my budget": "Bezahle aus meinem Budget", + "This amount for all trip I get from Passengers and Collected For me in": + "Diesen Betrag erhalte ich für alle Fahrten von den Passagieren und werde für mich eingezogen", + "You can buy points from your budget": + "Sie können Punkte aus Ihrem Budget kaufen", + "insert amount": "Betrag eingeben", + "You can buy Points to let you online": + "Sie können Punkte kaufen, um sie online zu nutzen", + "by this list below": "durch diese Liste unten", + "من خلال القائمة أدناه": "Das ist nicht der Fall", + "Create Wallet to receive your money": + "Erstellen Sie eine Wallet, um Ihr Geld zu erhalten", + "Enter your feedback here": "Geben Sie hier Ihr Feedback ein", + "Please enter your feedback.": "Bitte geben Sie Ihr Feedback ein.", + "Feedback": "Rückmeldung", + "Submit": "Einreichen", + "Click here to Show it in Map": + "Klicken Sie hier, um es in der Karte anzuzeigen", + "Canceled": "Abgesagt", + "Type your Email": "Geben Sie Ihre E-Mail-Adresse ein", + "No I want": "Nein, ich möchte", + "Email is": "E-Mail ist", + "Phone Number is": "Telefonnummer ist", + "Date of Birth is": "Geburtsdatum ist", + "Sex is": "Sex ist", + "Car Details": "Fahrzeugdetails", + "VIN is": "VIN ist", + "Color is": "Die Farbe ist", + "Make is": "Machen ist", + "Model is": "Modell ist", + "Year is": "Jahr ist", + "Expiration Date": "Verfallsdatum", + "Edit Your data": "Bearbeiten Sie Ihre Daten", + "write vin for your car": "Schreiben Sie Vin für Ihr Auto", + "VIN": "Fahrgestellnummer", + "write Color for your car": "Schreiben Sie Farbe für Ihr Auto", + "write Make for your car": "Schreiben Sie Make für Ihr Auto", + "write Model for your car": "Schreiben Sie Modell für Ihr Auto", + "write Year for your car": "Schreiben Sie das Jahr für Ihr Auto", + "write Expiration Date for your car": + "Schreiben Sie das Ablaufdatum für Ihr Auto", + "Tariffs": "Tarife", + "Minimum fare": "Mindesttarif", + "Maximum fare": "Höchsttarif", + "Flag-down fee": "Flag-Down-Gebühr", + "Including Tax": "Inkl. Steuern", + "BookingFee": "Buchungsgebühr", + "Morning": "Morgen", + "from 07:30 till 10:30 (Thursday, Friday, Saturday, Monday)": + "von 07:30 bis 10:30 Uhr (Donnerstag, Freitag, Samstag, Montag)", + "Evening": "Abend", + "from 12:00 till 15:00 (Thursday, Friday, Saturday, Monday)": + "von 12:00 bis 15:00 Uhr (Donnerstag, Freitag, Samstag, Montag)", + "Night": "Nacht", + "You have in account": "Sie haben ein Konto", + "Select Country": "Land auswählen", + "Ride Today :": "Fahren Sie heute:", + "After this period": "Nach dieser Zeit", + "You can\"t cancel!": "Sie können nicht kündigen!", + "لا تستطيع الغاء الرحله": "Es ist nicht möglich, dies zu tun", + "from 23:59 till 05:30": "von 23:59 bis 05:30 Uhr", + "Rate Driver": "Tariftreiber", + "Total Cost is": "Die Gesamtkosten betragen", + "Write note": "Notiz schreiben", + "Time to arrive": "Zeit anzukommen", + "Ride Summaries": "Fahrtzusammenfassungen", + "Total Cost": "Gesamtkosten", + "Average of Hours of": "Durchschnitt der Stunden von", + "is ON for this month": "ist für diesen Monat eingeschaltet", + "Days": "Tage", + "Total Hours on month": "Gesamtstunden pro Monat", + "Counts of Hours on days": "Anzahl der Stunden an Tagen", + "OrderId": "Auftragsnummer", + "created time": "geschaffene Zeit", + "Speed Over": "Geschwindigkeit vorbei", + "I will slow down": "Ich werde langsamer werden", + "Map Passenger": "Karte Passagier", + "Be Slowly": "Seien Sie langsam", + "If you want to make Google Map App run directly when you apply order": + "Wenn Sie möchten, dass die Google Map App direkt ausgeführt wird, wenn Sie eine Bestellung aufgeben", + "You can change the language of the app": + "Sie können die Sprache der App ändern", + "Your Budget less than needed": "Ihr Budget ist geringer als nötig", + "You can change the Country to get all features": + "Sie können das Land ändern, um alle Funktionen zu nutzen", + "Change Country": "Land ändern" + }, + "es": { + "Sign In by Apple": "Iniciar sesión por Apple", + "Sign In by Google": "Iniciar sesión por Google", + "How do I request a ride?": "¿Cómo solicito un viaje?", + "Step-by-step instructions on how to request a ride through the Sefer app.": + "Instrucciones paso a paso sobre cómo solicitar un viaje a través de la aplicación Sefer.", + "What types of vehicles are available?": + "¿Qué tipos de vehículos hay disponibles?", + "Sefer offers a variety of vehicle options to suit your needs, including economy, comfort, and luxury. Choose the option that best fits your budget and passenger count.": + "Sefer ofrece una variedad de opciones de vehículos que se adaptan a sus necesidades, incluidos económicos, cómodos y de lujo. Elige la opción que mejor se ajuste a tu presupuesto y número de pasajeros.", + "How can I pay for my ride?": "¿Cómo puedo pagar mi viaje?", + "Sefer offers multiple payment methods for your convenience. Choose between cash payment or credit/debit card payment during ride confirmation.": + "Sefer ofrece múltiples métodos de pago para su comodidad. Elija entre pago en efectivo o pago con tarjeta de crédito/débito durante la confirmación del viaje.", + "Can I cancel my ride?": "¿Puedo cancelar mi viaje?", + "Yes, you can cancel your ride under certain conditions (e.g., before driver is assigned). See the Sefer cancellation policy for details.": + "Sí, puedes cancelar tu viaje bajo ciertas condiciones (por ejemplo, antes de que se asigne el conductor). Consulta la política de cancelación de Sefer para más detalles.", + "Driver Registration & Requirements": + "Registro y requisitos del conductor", + "How can I register as a driver?": + "¿Cómo puedo registrarme como conductor?", + "What are the requirements to become a driver?": + "¿Cuáles son los requisitos para ser conductor?", + "Visit our website or contact Sefer support for information on driver registration and requirements.": + "Visite nuestro sitio web o comuníquese con el soporte de Sefer para obtener información sobre el registro y los requisitos del conductor.", + "How do I communicate with the other party (passenger/driver)?": + "¿Cómo me comunico con la otra parte (pasajero/conductor)?", + "Sefer provides in-app chat functionality to allow you to communicate with your driver or passenger during your ride.": + "Sefer proporciona una función de chat en la aplicación para permitirle comunicarse con su conductor o pasajero durante su viaje.", + "What safety measures does Sefer offer?": + "¿Qué medidas de seguridad ofrece Sefer?", + "Sefer prioritizes your safety. We offer features like driver verification, in-app trip tracking, and emergency contact options.": + "Sefer prioriza tu seguridad. Ofrecemos funciones como verificación del conductor, seguimiento de viajes en la aplicación y opciones de contacto de emergencia.", + "Frequently Questions": "Preguntas frecuentes", + "User does not exist.": "El usuario no existe.", + "We need your phone number to contact you and to help you.": + "Necesitamos tu número de teléfono para comunicarnos contigo y ayudarte.", + "You will recieve code in sms message": + "Recibirás el código en un mensaje SMS.", + "Please enter": "Por favor escribe", + "We need your phone number to contact you and to help you receive orders.": + "Necesitamos su número de teléfono para comunicarnos con usted y ayudarlo a recibir pedidos.", + "The full name on your criminal record does not match the one on your driver’s license. Please verify and provide the correct documents.": + "El nombre completo que figura en sus antecedentes penales no coincide con el que figura en su licencia de conducir. Por favor verifique y proporcione los documentos correctos.", + "The national number on your driver’s license does not match the one on your ID document. Please verify and provide the correct documents.": + "El número nacional de su licencia de conducir no coincide con el de su documento de identidad. Por favor verifique y proporcione los documentos correctos.", + "Capture an Image of Your Criminal Record": + "Capture una imagen de sus antecedentes penales", + "IssueDate": "Fecha de asunto", + "Capture an Image of Your car license front": + "Capture una imagen del frente de la licencia de su automóvil", + "Capture an Image of Your ID Document front": + "Capture una imagen del frente de su documento de identidad", + "NationalID": "Identificación nacional", + "FullName": "Nombre completo", + "InspectionResult": "Resultado de inspeccion", + "Criminal Record": "Antecedentes penales", + "The email or phone number is already registered.": + "El correo electrónico o número de teléfono ya está registrado.", + "To become a ride-sharing driver on the Sefer app, you need to upload your driver\"s license, ID document, and car registration document. Our AI system will instantly review and verify their authenticity in just 2-3 minutes. If your documents are approved, you can start working as a driver on the Sefer app. Please note, submitting fraudulent documents is a serious offense and may result in immediate termination and legal consequences.": + "Para convertirse en conductor de viajes compartidos en la aplicación Sefer, debe cargar su licencia de conducir, documento de identificación y documento de registro del automóvil. Nuestro sistema de inteligencia artificial revisará y verificará instantáneamente su autenticidad en solo 2 o 3 minutos. Si sus documentos están aprobados, puede comenzar a trabajar como conductor en la aplicación Sefer. Tenga en cuenta que enviar documentos fraudulentos es un delito grave y puede resultar en el despido inmediato y consecuencias legales.", + "Documents check": "Verificación de documentos", + "Driver's License": "Licencia de conducir", + "License Type": "Tipo de licencia", + "National Number": "Número nacional", + "Name (Arabic)": "Nombre (árabe)", + "Name (English)": "Nombre (inglés)", + "Address": "DIRECCIÓN", + "Issue Date": "Fecha de asunto", + "Expiry Date": "Fecha de caducidad", + "License Categories": "Categorías de licencia", + "driver_license": "licencia de conducir", + "Capture an Image of Your Driver License": + "Capture una imagen de su licencia de conducir", + "ID Documents Back": "Documentos de Identidad Volver", + "National ID": "Identificación nacional", + "Occupation": "Ocupación", + "Gender": "Género", + "Religion": "Religión", + "Marital Status": "Estado civil", + "Full Name (Marital)": "Nombre completo (matrimonial)", + "Expiration Date": "Fecha de caducidad", + "Capture an Image of Your ID Document Back": + "Capture una imagen de su documento de identidad", + "ID Documents Front": "Frente de documentos de identidad", + "First Name": "Nombre de pila", + "CardID": "Tarjeta de identificacion", + "Full Name": "Nombre completo", + "Vehicle Details Front": "Detalles del vehículo Frente", + "Plate Number": "Número de placa", + "Owner Name": "Nombre del dueño", + "Vehicle Details Back": "Detalles del vehículo Atrás", + "Make": "Hacer", + "Model": "Modelo", + "Year": "Año", + "Chassis": "Chasis", + "Color": "Color", + "Displacement": "Desplazamiento", + "Fuel": "Combustible", + "Tax Expiry Date": "Fecha de vencimiento del impuesto", + "Inspection Date": "Fecha de inspección", + "Capture an Image of Your car license back": + "Capture una imagen de la licencia de su automóvil", + "Capture an Image of Your Driver’s License": + "Capture una imagen de su licencia de conducir", + "Sign in with Google for easier email and name entry": + "Inicie sesión con Google para ingresar nombres y correos electrónicos más fácilmente", + "You will choose allow all the time to be ready receive orders": + "Elegirás permitir todo el tiempo para estar listo para recibir pedidos.", + "Welcome to Sefer!": "¡Bienvenidos a Séfer!", + "Get to your destination quickly and easily.": + "Llega a tu destino de forma rápida y sencilla.", + "Enjoy a safe and comfortable ride.": + "Disfruta de un viaje seguro y cómodo.", + "Choose Language": "Elige lengua", + "Login": "Acceso", + "Pay with Wallet": "Pagar con billetera", + "Invalid MPIN": "MPIN no válido", + "Invalid OTP": "OTP no válida", + "Enter your email address": + "Introduce tu dirección de correo electrónico", + "Please enter Your Email.": + "Por favor introduzca su correo electrónico.", + "Enter your phone number": "Ingrese su número telefónico", + "Please enter your phone number.": + "Por favor, introduzca su número de teléfono.", + "Please enter Your Password.": "Por favor, introduzca su contraseña.", + "Submit": "Entregar", + "if you dont have account": "si no tienes cuenta", + "Register": "Registro", + "Accept Ride's Terms & Review Privacy Notice": + "Acepte los términos de Ride y revise el aviso de privacidad", + "By selecting 'I Agree' below, I have reviewed and agree to the Terms of Use and acknowledge the Privacy Notice. I am at least 18 years of age.": + "Al seleccionar \"Acepto\" a continuación, he revisado y acepto los Términos de uso y reconozco el Aviso de privacidad. Tengo al menos 18 años.", + "I Agree": "Estoy de acuerdo", + "First name": "Nombre de pila", + "Enter your first name": "Ponga su primer nombre", + "Please enter your first name.": + "Por favor, introduzca su nombre de pila.", + "Last name": "Apellido", + "Enter your last name": "Introduce tu apellido", + "Please enter your last name.": "Por favor ingrese su apellido.", + "City": "Ciudad", + "Please enter your City.": "Por favor ingresa tu ciudad.", + "Male": "Masculino", + "Female": "Femenino", + "Verify Email": "Verificar correo electrónico", + "We sent 5 digit to your Email provided": + "Enviamos 5 dígitos a su correo electrónico proporcionado", + "5 digit": "5 dígitos", + "Send Verification Code": "Envíe el código de verificación", + "Your Ride Duration is": "La duración de su viaje es", + "You will be thier in": "Estarás ahí en", + "You trip distance is": "La distancia de tu viaje es", + "Fee is": "La tarifa es", + "From :": "De :", + "To :": "A :", + "Add Promo": "Agregar promoción", + "Confirm Selection": "Confirmar selección", + "distance is": "la distancia es", + "duration is": "la duración es", + "I don't need a ride anymore": "Ya no necesito que me lleven", + "I was just trying the application": "Estaba probando la aplicación.", + "No driver accepted my request": + "Ningún conductor aceptó mi solicitud.", + "I added the wrong pick-up/drop-off location": + "Agregué el lugar de recogida/devolución incorrecto", + "I don't have a reason": "no tengo una razon", + "Other": "Otro", + "Can we know why you want to cancel Ride ?": + "¿Podemos saber por qué desea cancelar Ride?", + "Cancel Ride": "Cancelar viaje", + "Add Payment Method": "Añadir método de pago", + "Your Wallet balance is": "Tu saldo de Wallet es", + "Ride Wallet": "Cartera de paseo", + "Payment Method": "Método de pago", + "Type here Place": "Escriba aquí Lugar", + "Are You sure to ride to": "¿Estás seguro de viajar hasta", + "Confirm": "Confirmar", + "Back": "Atrás", + "You are Delete": "eres eliminar", + "Deleted": "Eliminado", + "You Dont Have Any places yet !": "¡Aún no tienes lugares!", + "Favorite Places": "Lugares favoritos", + "From : Current Location": "Desde: Ubicación actual", + "Where to": "A donde", + "Notifications": "Notificaciones", + "Profile": "Perfil", + "Home": "Hogar", + "My Cared": "mi cuidado", + "Add Card": "Agregar tarjeta", + "Add Credit Card": "Agregar tarjeta de crédito", + "Please enter the cardholder name": + "Por favor ingrese el nombre del titular de la tarjeta", + "Please enter the expiry date": + "Por favor ingrese la fecha de vencimiento", + "Please enter the CVV code": "Por favor introduce el código CVV", + "Go To Favorite Places": "Ir a lugares favoritos", + "Go to this Target": "Ir a este objetivo", + "My Profile": "Mi perfil", + "Sign Out": "Desconectar", + "Home Page": "Página de inicio", + "Are you want to go to this site": "¿Quieres ir a este sitio?", + "MyLocation": "Mi ubicacion", + "my location": "mi ubicacion", + "Target": "Objetivo", + "Update": "Actualizar", + "You Should choose rate figure": "Deberías elegir la cifra de tarifa", + "Login Captin": "Iniciar sesión Capitán", + "Register Captin": "Registrar capitán", + "Send Verfication Code": "Enviar código de verificación", + "KM": "km", + "End Ride": "Fin del viaje", + "Minute": "Minuto", + "Go to passenger Location now": + "Ir a la ubicación del pasajero ahora", + "Duration of the Ride is": "La duración del viaje es", + "Distance of the Ride is": "La distancia del viaje es", + "Name of the Passenger is": "El nombre del pasajero es", + "Hello this is Captain": "Hola este es el capitán", + "Start the Ride": "Comience el viaje", + "Please Wait If passenger want To Cancel!": + "¡Espere si el pasajero desea cancelar!", + "Total Duration:": "Duración total:", + "Active Duration:": "Duración activa:", + "Waiting for Captin ...": "Esperando al Capitán...", + "Age is": "La edad es", + "Rating is": "La calificación es", + "to arrive you.": "para llegarte.", + "Order History": "Historial de pedidos", + "My Wallet": "Mi billetera", + "Tariff": "Arancel", + "Settings": "Ajustes", + "Feed Back": "Comentario", + "Promos": "Promociones", + "Please enter a valid 16-digit card number": + "Por favor ingrese un número de tarjeta válido de 16 dígitos", + "Add Phone": "Añadir teléfono", + "Please enter a phone number": + "Por favor, introduzca un número de teléfono", + "You dont Add Emergency Phone Yet!": + "¡Aún no agregas un teléfono de emergencia!", + "You will arrive to your destination after": + "Llegarás a tu destino después", + "You can cancel Ride now": "Puedes cancelar el viaje ahora", + "You Can cancel Ride After Captain did not come in the time": + "Puedes cancelar el viaje después de que el capitán no llegue a tiempo.", + "If you in Car Now. Press Start The Ride": + "Si estás en Car Now. Presione Iniciar el viaje", + "You Dont Have Any amount in": "No tienes ninguna cantidad en", + "Wallet!": "¡Billetera!", + "You Have": "Tienes", + "Save Credit Card": "Guardar tarjeta de crédito", + "Show Promos": "Mostrar promociones", + "10 and get 4% discount": "10 y consigue un 4% de descuento", + "20 and get 6% discount": "20 y consigue un 6% de descuento", + "40 and get 8% discount": "40 y consigue un 8% de descuento", + "100 and get 11% discount": "100 y obtén 11% de descuento", + "Pay with Your PayPal": "Paga con tu PayPal", + "You will choose one of above !": "¡Elegirás uno de los anteriores!", + "Cancel": "Cancelar", + "Delete My Account": "Borrar mi cuenta", + "Edit Profile": "Editar perfil", + "Name": "Nombre", + "Update Gender": "Actualizar género", + "Education": "Educación", + "Update Education": "Actualizar la educación", + "Employment Type": "Tipo de empleo", + "SOS Phone": "Teléfono SOS", + "High School Diploma": "Diploma de escuela secundaria", + "Associate Degree": "Grado asociado", + "Bachelor's Degree": "Licenciatura", + "Master's Degree": "Maestría", + "Doctoral Degree": "Doctorado", + "Promos For today": "Promociones para hoy", + "Copy this Promo to use it in your Ride!": + "¡Copia esta promoción para usarla en tu viaje!", + "To change some Settings": "Para cambiar algunas configuraciones", + "To change Language the App": + "Para cambiar el idioma de la aplicación", + "Order Request Page": "Página de solicitud de pedido", + "Rouats of Trip": "Rutas de viaje", + "Passenger Name is": "El nombre del pasajero es", + "Total From Passenger is": "El total del pasajero es", + "Duration To Passenger is": "La duración hasta el pasajero es", + "Distance To Passenger is": "La distancia al pasajero es", + "Total For You is": "Total para ti es", + "Distance is": "La distancia es", + "KM": "km", + "Duration of Trip is": "La duración del viaje es", + "Minutes": "Minutos", + "Apply Order": "Aplicar orden", + "Refuse Order": "Rechazar orden", + "Rate Captain": "Calificar Capitán", + "Enter your Note": "Ingrese su nota", + "Type something...": "Escribe algo...", + "Submit rating": "Enviar calificación", + "Rate Passenger": "Tarifa Pasajero", + "Ride Summary": "Resumen del viaje", + "welcome_message": "mensaje de bienvenida", + "app_description": "descripción_aplicación", + "get_to_destination": "llegar_al_destino", + "get_a_ride": "un aventón", + "safe_and_comfortable": "seguro_y_cómodo", + "committed_to_safety": "comprometido_con_la_seguridad", + "Driver Applied the Ride for You": + "El conductor solicitó el viaje por usted", + "Show latest promo": "Mostrar la última promoción", + "Cancel Trip": "Cancelar viaje", + "Passenger Cancel Trip": "Pasajero cancelar viaje", + "Please stay on the picked point.": + "Por favor permanezca en el punto elegido.", + "Trip is Begin": "El viaje ha comenzado", + "Hi ,I will go now": "hola voy a ir ahora", + "Passenger come to you": "Pasajero ven a ti", + "Hi ,I Arrive your site": "Hola, llego a tu sitio.", + "Driver Finish Trip": "Conductor finaliza el viaje", + "you will pay to Driver": "le pagarás al conductor", + "Driver Cancel Your Trip": "Conductor cancela su viaje", + "you will pay to Driver you will be pay the cost of driver time look to your SEFER Wallet": + "Pagarás al conductor Pagarás el coste del tiempo del conductor mira tu Cartera SEFER", + "I will go now": "iré ahora", + "You Have Tips": "Tienes consejos", + "tips": "consejos", + "Total is": "El total es", + "الْمَجْمُوع هُوَ": "الْمَجْمُوع هُوَ", + "No,I want": "No yo quiero", + "Your fee is": "Tu tarifa es", + "Do you want to pay Tips for this Driver": + "¿Quieres pagar propinas por este conductor?", + "Tip is": "El consejo es", + "Tip is": "El consejo es", + "Camera Access Denied.": "Acceso a la cámara denegado.", + "Open Settings": "Configuración abierta", + "GPS Required Allow !.": "GPS requerido ¡Permitir!.", + "Your Account is Deleted": "Su cuenta está eliminada", + "Are you sure to delete your account?": + "¿Estás seguro de eliminar tu cuenta?", + "Your data will be erased after 2 weeks": + "Tus datos se borrarán después de 2 semanas.", + "And you will can't return to use app after 1 month": + "Y no podrás volver a usar la aplicación después de 1 mes.", + "وَلَن تَسْتَطِيع اسْتِخْدَام التَّطْبِيق مَرَّة أُخْرَى بَعْد شَهْر": + "وَلَن تَسْتَطِيع اسْتِخْدَام التَّطْبِيق مَرَّة أُخْرَى بَعْد شَهْر", + "Enter Your First Name": "Ponga su primer nombre", + "Are you Sure to LogOut?": "¿Está seguro de cerrar sesión?", + "Email Wrong": "Correo electrónico incorrecto", + "Email you inserted is Wrong.": + "El correo electrónico que insertó es incorrecto.", + "You have finished all times": "Has terminado todos los tiempos", + "if you want help you can email us here": + "si quieres ayuda puedes enviarnos un correo electrónico aquí", + "Thanks": "Gracias", + "Email Us": "Envíanos un correo electrónico", + "I cant register in your app in face detection": + "No puedo registrarme en tu aplicación en detección de rostros", + "Hi": "Hola", + "No face detected": "No se detectó ninguna cara", + "Image detecting result is": + "El resultado de la detección de imágenes es", + "from 3 times Take Attention": "desde 3 veces Toma Atención", + "Be sure for take accurate images please": + "Asegúrese de tomar imágenes precisas, por favor.", + "You have": "Tienes", + "لَدَيْك": "لَدَيْك", + "image verified": "imagen verificada", + "Next": "Próximo", + "There is no help Question here": "No hay ayuda Pregunta aquí", + "Call End": "Fin de llamada", + "You dont have Points": "No tienes puntos", + "You Are Stopped For this Day !": "¡Estás detenido por este día!", + "You must be charge your Account": "Debes cargar tu cuenta", + "You Refused 3 Rides this Day that is the reason": + "Rechazaste 3 viajes este día, esa es la razón", + "See you Tomorrow!": "¡Nos vemos mañana!", + "لِقَائِنَا غَدًا!": "¡لِقَائِنَا غَدًا!", + "Recharge my Account": "Recargar mi cuenta", + "Ok , See you Tomorrow": "OK, te veo mañana", + "You are Stopped": "estas detenido", + "Connected": "Conectado", + "Not Connected": "No conectado", + "Your are far from passenger location": + "Estás lejos de la ubicación del pasajero.", + "go to your passenger location before": + "dirígete a tu ubicación de pasajero antes", + "Passenger cancel trip": "Pasajero cancela viaje", + "يُلْغِي الرَّاكِب الرِّحْلَة": "يُلْغِي الرَّاكِب الرِّحْلَة", + "You will get cost of your work for this trip": + "Recibirás el costo de tu trabajo para este viaje.", + "in your wallet": "en tu billetera", + "you gain": "tu ganas", + "Order Cancelled": "Orden cancelada", + "Order Cancelled by Passenger": "Pedido cancelado por pasajero", + "Success": "Éxito", + "Feedback data saved successfully": + "Los datos de los comentarios se guardaron correctamente", + "No Promo for today .": "No hay promoción por hoy.", + "Select your destination": "Selecciona tu destino", + "Search for your Start point": "Busca tu punto de partida", + "Search for waypoint": "Buscar punto de referencia", + "Current Location": "Ubicación actual", + "Add Location 1": "Agregar ubicación 1", + "You must Verify email !.": + "¡Debes verificar el correo electrónico!.", + "Cropper": "Cultivador", + "Saved Sucssefully": "Guardado con éxito", + "Select Date": "Seleccione fecha", + "Birth Date": "Fecha de nacimiento", + "Ok": "De acuerdo", + "the 500 points equal 30 JOD": "los 500 puntos equivalen a 30 JOD", + "the 500 points equal 30 JOD for you": + "Los 500 puntos equivalen a 30 JOD para ti.", + "So go and gain your money": "Así que ve y gana tu dinero.", + "فَاسْتَحِقَّ فُلُوسَك وَاكْسِب النِّقَاط": + "فَاسْتَحِقَّ فُلُوسَك وَاكْسِب النِّقَاط", + "token updated": "token actualizado", + "Add Location 2": "Agregar ubicación 2", + "Add Location 3": "Agregar ubicación 3", + "Add Location 4": "Agregar ubicación 4", + "Waiting for your location": "Esperando tu ubicación", + "Search for your destination": "Busca tu destino", + "Hi! This is": "¡Hola! Esto es", + "I am using": "estoy usando", + "to ride with": "montar con", + "as the driver.": "como conductor.", + "is driving a": "está conduciendo un", + "with license plate": "con matrícula", + "I am currently located at": "Actualmente estoy ubicado en", + "Please go to Car now": "Por favor ve al coche ahora", + "If you need to reach me, please contact the driver directly at": + "Si necesita comunicarse conmigo, comuníquese directamente con el conductor al", + "No Car or Driver Found in your area.": + "No se encontró ningún automóvil ni conductor en su área.", + "Please Try anther time": "Por favor intenta otra vez", + "There no Driver Aplly your order sorry for that": + "No hay ningún controlador que aplique su pedido. Lo siento.", + "Trip Cancelled": "Viaje cancelado", + "The Driver Will be in your location soon .": + "El conductor estará en su ubicación pronto.", + "The distance less than 500 meter.": + "La distancia es inferior a 500 metros.", + "Promo End !": "¡Fin de la promoción!", + "There is no notification yet": "Aún no hay notificación", + "Use Touch ID or Face ID to confirm payment": + "Utilice Touch ID o Face ID para confirmar el pago", + "Contact us for any questions on your order.": + "Contáctenos para cualquier pregunta sobre su pedido.", + "Pyament Cancelled .": "Pago cancelado.", + "type here": "escriba aquí", + "Scan Driver License": "Escanear licencia de conducir", + "Please put your licence in these border": + "Por favor coloque su licencia en estos bordes.", + "Camera not initialized yet": "La cámara aún no se ha inicializado", + "Take Image": "Tomar imagen", + "AI Page": "Página de IA", + "Take Picture Of ID Card": + "Tome una fotografía de la tarjeta de identificación", + "Take Picture Of Driver License Card": + "Tome una fotografía de la tarjeta de licencia de conducir", + "We are process picture please wait": + "Somos imagen de proceso por favor espere", + "There is no data yet.": "Aún no hay datos.", + "Name :": "Nombre :", + "Drivers License Class:": "Clase de licencia de conducir:", + "Document Number:": "Número del Documento:", + "Address:": "DIRECCIÓN:", + "Height:": "Altura:", + "Expiry Date:": "Fecha de caducidad:", + "Date of Birth:": "Fecha de nacimiento:", + "You can\"t continue with us .": "No puedes continuar con nosotros.", + "You should renew Driver license": + "Deberías renovar la licencia de conducir.", + "Detect Your Face": "Detecta tu cara", + "Go to next step": "Ir al siguiente paso", + "scan Car License.": "escanear licencia de automóvil.", + "aاسْتِخْرَاج رُخْصَة السَّيَّارَة.": + "aاسْتِخْرَاج رُخْصَة السَّيَّارَة.", + "Name in arabic": "Nombre en árabe", + "Drivers License Class": "Clase de licencia de conducir", + "Date of Birth": "Fecha de nacimiento", + "Age": "Edad", + "Lets check Car license": "Comprobemos la licencia del coche.", + "Car Kind": "Tipo de coche", + "Car Plate": "Matrícula del coche", + "Lets check License Back Face": + "Comprobemos la cara posterior de la licencia", + "Car License Card": "Tarjeta de licencia de coche", + "No image selected yet": "Ninguna imagen seleccionada todavía", + "Made :": "Hecho :", + "model :": "modelo :", + "VIN :": "Número de bastidor:", + "year :": "año :", + "ُExpire Date": "fecha de caducidad", + "Login Driver": "Iniciar sesión Conductor", + "Password must br at least 6 character.": + "La contraseña debe tener al menos 6 caracteres.", + "if you don\"t have account": "si no tienes cuenta", + "Here recorded trips audio": "Aquí se graban los viajes en audio.", + "Register as Driver": "Regístrate como conductor", + "Privacy Notice": "Aviso de Privacidad", + "By selecting 'I Agree' below, I have reviewed and agree to the Terms of Use and acknowledge the": + "Al seleccionar \"Acepto\" a continuación, he revisado y acepto los Términos de uso y reconozco la", + ". I am at least 18 years of age.": ". Tengo al menos 18 años.", + "Log Out Page": "Página de cierre de sesión", + "Log Off": "Desconectarse", + "Register Driver": "Registrar Conductor", + "Verify Email For Driver": + "Verificar correo electrónico para el conductor", + "Admin DashBoard": "Panel de administración", + "Your name": "Su nombre", + "your ride is applied": "tu viaje está aplicado", + "Your password": "Tu contraseña", + "H and": "Mano", + "LE": "LE", + "JOD": "JOD", + "m": "metro", + "We search nearst Driver to you": + "Buscamos el conductor más cercano a usted.", + "please wait till driver accept your order": + "Espere hasta que el conductor acepte su pedido.", + "No accepted orders? Try raising your trip fee to attract riders.": + "¿No se aceptan pedidos? Intente aumentar la tarifa de su viaje para atraer pasajeros.", + "You should select one": "Deberías seleccionar uno", + "The driver accept your order for": + "El conductor acepta su pedido por", + "Increase Fee": "Aumentar la tarifa", + "No, thanks": "No, gracias", + "The driver on your way": "El conductor en camino", + "Total price from": "Precio total desde", + "Order Details Speed": "Detalles del pedido Velocidad", + "Order Applied": "Orden aplicada", + "accepted your order": "aceptó su pedido", + "We regret to inform you that another driver has accepted this order.": + "Lamentamos informarle que otro conductor ha aceptado este pedido.", + "Selected file:": "Archivo seleccionado:", + "Your trip cost is": "El costo de su viaje es", + "this will delete all files from your device": + "esto eliminará todos los archivos de su dispositivo", + "you have a negative balance of": "tienes un saldo negativo de", + "in your": "en tus", + "Exclusive offers and discounts always with the Sefer app": + "Ofertas y descuentos exclusivos siempre con la app Sefer", + "Please go to Car Driver": "Por favor vaya a Conductor de automóvil", + "wallet due to a previous trip.": + "billetera debido a un viaje anterior.", + "Submit Question": "Enviar pregunta", + "Please enter your Question.": "Por favor ingrese su pregunta.", + "Help Details": "Detalles de ayuda", + "No trip yet found": "Aún no se ha encontrado ningún viaje", + "No Response yet.": "Ninguna respuesta todavia.", + "You Earn today is": "Lo que ganas hoy es", + "You Have in": "Tienes en", + "Total points is": "Los puntos totales son", + "Total Connection Duration:": "Duración total de la conexión:", + "H and": "Mano", + "Passenger name :": "Nombre del pasajero :", + "Cost Of Trip IS": "El costo del viaje es", + "Arrival time": "Hora de llegada", + "arrival time to reach your point": + "Hora de llegada para llegar a tu punto.", + "For Speed and Delivery trips, the price is calculated dynamically. For Comfort trips, the price is based on time and distance": + "Para viajes de Velocidad y Entrega, el precio se calcula dinámicamente. Para viajes Comfort, el precio se basa en tiempo y distancia.", + "Hello this is Driver": "Hola, este es el conductor.", + "Is the Passenger in your Car ?": + "¿Está el pasajero en su automóvil?", + "Please wait for the passenger to enter the car before starting the trip.": + "Espere a que el pasajero entre al automóvil antes de iniciar el viaje.", + "No ,still Waiting.": "No, todavía esperando.", + "I arrive you": "te llego", + "I Arrive your site": "Llego a tu sitio", + "You are not in near to passenger location": + "No estás cerca de la ubicación del pasajero.", + "please go to picker location exactly": + "por favor vaya exactamente a la ubicación del selector", + "You Can Cancel Trip And get Cost of Trip From": + "Puede cancelar el viaje y obtener el costo del viaje desde", + "Are you sure to cancel?": "¿Estás seguro de cancelar?", + "Yes": "Sí", + "Insert Emergincy Number": "Insertar número de emergencia", + "Best choice for comfort car and flexible route and stops point": + "La mejor opción para un vehículo cómodo y una ruta y un punto de parada flexibles", + "Insert": "Insertar", + "This is for delivery or a motorcycle.": + "Esto es para entrega o una motocicleta.", + "This trip goes directly from your starting point to your destination for a fixed price. The driver must follow the planned route": + "Este viaje va directamente desde su punto de partida a su destino por un precio fijo. El conductor debe seguir la ruta planificada.", + "You can decline a request without any cost": + "Puedes rechazar una solicitud sin ningún coste", + "Perfect for adventure seekers who want to experience something new and exciting": + "Perfecto para buscadores de aventuras que quieren experimentar algo nuevo y emocionante.", + "My current location is:": "Mi ubicación actual es:", + "and I have a trip on": "y tengo un viaje en", + "App with Passenger": "Aplicación con Pasajero", + "مع الراكب": "مع الراكب", + "You will be pay the cost to driver or we will get it from you on next trip": + "Pagará el costo al conductor o se lo entregaremos en el próximo viaje.", + "Trip has Steps": "El viaje tiene pasos", + "Distance from Passenger to destination is": + "La distancia desde el pasajero hasta el destino es", + "price is": "el precio es", + "This ride type does not allow changes to the destination or additional stops": + "Este tipo de viaje no permite cambios de destino ni paradas adicionales.", + "This price may be changed": "Este precio puede cambiar", + "No SIM card, no problem! Call your driver directly through our app. We use advanced technology to ensure your privacy.": + "¡Sin tarjeta SIM, no hay problema! Llame a su conductor directamente a través de nuestra aplicación. Utilizamos tecnología avanzada para garantizar su privacidad.", + "This ride type allows changes, but the price may increase": + "Este tipo de viaje permite cambios, pero el precio puede aumentar.", + "message From passenger": "mensaje del pasajero", + "Select one message": "Seleccione un mensaje", + "My location is correct. You can search for me using the navigation app": + "Mi ubicación es correcta. Puedes buscarme usando la aplicación de navegación.", + "I'm waiting for you": "te estoy esperando", + "Hello, I'm at the agreed-upon location": + "Hola estoy en el lugar acordado.", + "We noticed the speed is exceeding 100 km/h. Please slow down for your safety. If you feel unsafe, you can share your trip details with a contact or call the police using the red SOS button.": + "Notamos que la velocidad supera los 100 km/h. Por favor, reduzca la velocidad por su seguridad. Si no te sientes seguro, puedes compartir los detalles de tu viaje con un contacto o llamar a la policía usando el botón rojo SOS.", + "Warning: Speeding detected!": + "Advertencia: ¡Se ha detectado exceso de velocidad!", + "Please help! Contact me as soon as possible.": + "¡Por favor ayuda! Contáctame lo antes posible.", + "Share Trip Details": "Compartir detalles del viaje", + "Car Plate is": "La placa del coche es", + "the 300 points equal 300 L.E for you": + "Los 300 puntos equivalen a 300 L.E para ti.", + "So go and gain your money": "Así que ve y gana tu dinero.", + "the 300 points equal 300 L.E": "los 300 puntos equivalen a 300 L.E.", + "The payment was not approved. Please try again.": + "El pago no fue aprobado. Inténtalo de nuevo.", + "Payment Failed": "Pago fallido", + "Error": "Error", + "An error occurred during the payment process.": + "Se produjo un error durante el proceso de pago.", + "The payment was approved.": "El pago fue aprobado.", + "Payment Successful": "Pago exitoso", + "No ride found yet": "Aún no se ha encontrado ningún viaje", + "Accept Order": "Aceptar pedido", + "reject your order.": "rechazar su pedido.", + "Bottom Bar Example": "Ejemplo de barra inferior", + "Driver phone": "Teléfono del conductor", + "Statistics": "Estadísticas", + "Origin": "Origen", + "Destination": "Destino", + "Driver Name": "Nombre del conductor", + "Driver Car Plate": "Placa de coche del conductor", + "Available for rides": "Disponible para paseos", + "Scan Id": "Identificación de escaneo", + "Camera not initilaized yet": "Cámara aún no inicializada", + "Scan ID MklGoogle": "Escanear ID MklGoogle", + "Language": "Idioma", + "Jordan": "Jordán", + "USA": "EE.UU", + "Egypt": "Egipto", + "Turkey": "Pavo", + "Saudi Arabia": "Arabia Saudita", + "Qatar": "Katar", + "Bahrain": "Bahréin", + "Kuwait": "Kuwait", + "But you have a negative salary of": + "Pero tienes un salario negativo de", + "Promo Code": "Código promocional", + "Your trip distance is": "La distancia de tu viaje es", + "Enter promo code": "Introduce el código de promoción", + "You have promo!": "¡Tienes promoción!", + "Cost Duration": "Duración del costo", + "Duration is": "La duración es", + "Leave": "Dejar", + "Join": "Unirse", + "You Should be select reason.": "Deberías seleccionar el motivo.", + "\$": "\$", + "Waiting for Driver ...": "Esperando al conductor...", + "Latest Recent Trip": "Último viaje reciente", + "from your list": "de tu lista", + "Do you want to change Work location": + "¿Quieres cambiar la ubicación de trabajo?", + "Do you want to change Home location": + "¿Quieres cambiar la ubicación de casa?", + "We Are Sorry That we dont have cars in your Location!": + "¡Lamentamos no tener automóviles en su ubicación!", + "Choose from Map": "Elige del mapa", + "Pick your ride location on the map - Tap to confirm": + "Elija la ubicación de su viaje en el mapa: toque para confirmar", + "To Work": "Trabajar", + "Are you want to go this site": "¿Quieres ir a este sitio?", + "Closest & Cheapest": "Más cercano y más barato", + "Work Saved": "Trabajo guardado", + "Sefer is the ride-hailing app that is safe, reliable, and accessible.": + "Sefer es la aplicación de transporte segura, confiable y accesible.", + "With Sefer, you can get a ride to your destination in minutes.": + "Con Sefer, puedes conseguir transporte a tu destino en minutos.", + "Sefer is committed to safety, and all of our captains are carefully screened and background checked.": + "Sefer está comprometido con la seguridad y todos nuestros capitanes son cuidadosamente seleccionados y verificados sus antecedentes.", + "To Home": "A casa", + "Home Saved": "Inicio guardado", + "Destination selected": "Destino seleccionado", + "Now select start pick": "Ahora seleccione iniciar selección", + "Pick from map": "Elegir del mapa", + "Click here point": "Haga clic aquí punto", + "No Car in your site. Sorry!": + "No hay coches en su sitio. ¡Lo siento!", + "Nearest Car for you about": "Coche más cercano para ti", + "N/A": "N / A", + "From :": "De :", + "Get Details of Trip": "Obtener detalles del viaje", + "If you want add stop click here": + "Si quieres añadir stop haz clic aquí", + "Driver": "Conductor", + "Where you want go": "Donde tu quieres ir", + "My Card": "Mi tarjeta", + "Start Record": "Iniciar registro", + "Wallet": "Billetera", + "History of Trip": "Historia del viaje", + "Helping Center": "Centro de ayuda", + "Record saved": "Registro guardado", + "Trips recorded": "Viajes registrados", + "Select Your Country": "Selecciona tu pais", + "To ensure you receive the most accurate information for your location, please select your country below. This will help tailor the app experience and content to your country.": + "Para asegurarse de recibir la información más precisa para su ubicación, seleccione su país a continuación. Esto ayudará a adaptar la experiencia y el contenido de la aplicación a su país.", + "Are you sure to delete recorded files": + "¿Está seguro de eliminar los archivos grabados?", + "Select recorded trip": "Seleccionar viaje grabado", + "Card Number": "Número de tarjeta", + "Hi, Where to": "Hola, donde", + "Pick your destination from Map": "Elige tu destino en el mapa", + "Add Stops": "Agregar paradas", + "Get Direction": "Obtener dirección", + "Add Location": "Agregar Direccion", + "Switch Rider": "Cambiar de jinete", + "You will arrive to your destination after timer end.": + "Llegará a su destino después de que finalice el cronómetro.", + "You can cancel trip": "Puedes cancelar el viaje.", + "The driver waitting you in picked location .": + "El conductor lo espera en el lugar elegido.", + "Pay with Your": "Paga con tu", + "Pay with Credit Card": "Paga con tarjeta de crédito", + "Payment History": "historial de pagos", + "Show Promos to Charge": "Mostrar promociones para cobrar", + "Point": "Punto", + "Driver Wallet": "Cartera del conductor", + "Total Points is": "El total de puntos es", + "Total Budget from trips is": "El presupuesto total de los viajes es", + "Total Amount:": "Cantidad total:", + "Total Budget from trips by": "Presupuesto total de viajes de", + "Credit card is": "La tarjeta de crédito es", + "بطاقة الائتمان هي": "بطاقة الائتمان هي", + "This amount for all trip I get from Passengers": + "Esta cantidad para todos los viajes la recibo de los Pasajeros", + "Pay from my budget": "Pagar de mi presupuesto", + "This amount for all trip I get from Passengers and Collected For me in": + "Esta cantidad para todos los viajes la recibo de los Pasajeros y la Cobro para mí en", + "You can buy points from your budget": + "Puedes comprar puntos desde tu presupuesto.", + "insert amount": "insertar cantidad", + "You can buy Points to let you online": + "Puedes comprar Puntos para permitirte en línea", + "by this list below": "por esta lista a continuación", + "من خلال القائمة أدناه": "من خلال القائمة أدناه", + "Create Wallet to receive your money": + "Crea Wallet para recibir tu dinero", + "Enter your feedback here": "Ingrese sus comentarios aquí", + "Please enter your feedback.": "Por favor ingrese sus comentarios.", + "Feedback": "Comentario", + "Submit": "Entregar", + "Click here to Show it in Map": + "Haga clic aquí para mostrarlo en el mapa", + "Canceled": "Cancelado", + "Type your Email": "Escribe tu correo electrónico", + "No I want": "No yo quiero", + "Email is": "El correo electrónico es", + "Phone Number is": "El número de teléfono es", + "Date of Birth is": "La fecha de nacimiento es", + "Sex is": "El sexo es", + "Car Details": "Detalles del auto", + "VIN is": "El número de bastidor es", + "Color is": "Color es", + "Make is": "hacer es", + "Model is": "El modelo es", + "Year is": "El año es", + "Expiration Date": "Fecha de caducidad", + "Edit Your data": "Edita tus datos", + "write vin for your car": "escribe vin para tu auto", + "VIN": "Número de bastidor", + "write Color for your car": "escribe Color para tu auto", + "write Make for your car": "escribe Marca para tu auto", + "write Model for your car": "escribe Modelo para tu auto", + "write Year for your car": "Escribe el año de tu coche.", + "write Expiration Date for your car": + "Escribe la fecha de caducidad de tu coche.", + "Tariffs": "Tarifas", + "Minimum fare": "Tarifa mínima", + "Maximum fare": "Tarifa máxima", + "Flag-down fee": "Tarifa por bajar la bandera", + "Including Tax": "Incluyendo impuesto", + "BookingFee": "Tarifa de reserva", + "Morning": "Mañana", + "from 07:30 till 10:30 (Thursday, Friday, Saturday, Monday)": + "de 07:30 a 10:30 (jueves, viernes, sábado, lunes)", + "Evening": "Noche", + "from 12:00 till 15:00 (Thursday, Friday, Saturday, Monday)": + "de 12:00 a 15:00 (jueves, viernes, sábado, lunes)", + "Night": "Noche", + "You have in account": "tienes en cuenta", + "Select Country": "Seleccionar país", + "Ride Today :": "Viaja hoy:", + "After this period": "Después de este período", + "You can\"t cancel!": "¡No puedes cancelar!", + "لا تستطيع الغاء الرحله": "لا تستطيع الغاء الرحله", + "from 23:59 till 05:30": "de 23:59 a 05:30", + "Rate Driver": "Calificar al conductor", + "Total Cost is": "El costo total es", + "Write note": "Toma nota", + "Time to arrive": "hora de llegar", + "Ride Summaries": "Resúmenes de viajes", + "Total Cost": "Coste total", + "Average of Hours of": "Promedio de Horas de", + "is ON for this month": "está activado para este mes", + "Days": "Días", + "Total Hours on month": "Horas totales en el mes", + "Counts of Hours on days": "Conteos de horas en días", + "OrderId": "Solicitar ID", + "created time": "tiempo creado", + "Speed Over": "Velocidad sobre", + "I will slow down": "voy a reducir la velocidad", + "Map Passenger": "Mapa Pasajero", + "Be Slowly": "ser despacio", + "If you want to make Google Map App run directly when you apply order": + "Si desea que la aplicación Google Map se ejecute directamente cuando aplica el pedido", + "You can change the language of the app": + "Puedes cambiar el idioma de la aplicación.", + "Your Budget less than needed": "Tu Presupuesto menor al necesario", + "You can change the Country to get all features": + "Puede cambiar el país para obtener todas las funciones.", + "Change Country": "Cambiar pais" + }, + "fa": { + "Sign In by Apple": "با اپل وارد شوید", + "Sign In by Google": "با گوگل وارد شوید", + "How do I request a ride?": "چگونه درخواست سفر کنم؟", + "Step-by-step instructions on how to request a ride through the Sefer app.": + "دستورالعمل های گام به گام نحوه درخواست سفر از طریق برنامه Sefer.", + "What types of vehicles are available?": + "چه نوع وسایل نقلیه ای موجود است؟", + "Sefer offers a variety of vehicle options to suit your needs, including economy, comfort, and luxury. Choose the option that best fits your budget and passenger count.": + "Sefer انواع مختلفی از گزینه های خودرو را مطابق با نیازهای شما ارائه می دهد، از جمله اقتصادی، راحتی و لوکس. گزینه ای را انتخاب کنید که با بودجه و تعداد مسافران شما مطابقت دارد.", + "How can I pay for my ride?": + "چگونه می توانم هزینه سواری خود را پرداخت کنم؟", + "Sefer offers multiple payment methods for your convenience. Choose between cash payment or credit/debit card payment during ride confirmation.": + "Sefer چندین روش پرداخت را برای راحتی شما ارائه می دهد. در حین تأیید سواری، بین پرداخت نقدی یا پرداخت کارت اعتباری/دبیت انتخاب کنید.", + "Can I cancel my ride?": "آیا می توانم سواری خود را لغو کنم؟", + "Yes, you can cancel your ride under certain conditions (e.g., before driver is assigned). See the Sefer cancellation policy for details.": + "بله، می توانید تحت شرایط خاصی (به عنوان مثال، قبل از تعیین راننده) سواری خود را لغو کنید. برای جزئیات بیشتر به سیاست لغو Sefer مراجعه کنید.", + "Driver Registration & Requirements": "ثبت نام راننده و الزامات", + "How can I register as a driver?": + "چگونه می توانم به عنوان راننده ثبت نام کنم؟", + "What are the requirements to become a driver?": + "برای راننده شدن چه شرایطی لازم است؟", + "Visit our website or contact Sefer support for information on driver registration and requirements.": + "برای کسب اطلاعات در مورد ثبت نام راننده و الزامات، از وب سایت ما دیدن کنید یا با پشتیبانی Sefer تماس بگیرید.", + "How do I communicate with the other party (passenger/driver)?": + "چگونه با طرف مقابل (مسافر/راننده) ارتباط برقرار کنم؟", + "Sefer provides in-app chat functionality to allow you to communicate with your driver or passenger during your ride.": + "Sefer عملکرد چت درون برنامه ای را ارائه می دهد تا به شما امکان می دهد در طول سواری با راننده یا مسافر خود ارتباط برقرار کنید.", + "What safety measures does Sefer offer?": + "Sefer چه اقدامات ایمنی ارائه می دهد؟", + "Sefer prioritizes your safety. We offer features like driver verification, in-app trip tracking, and emergency contact options.": + "Sefer امنیت شما را در اولویت قرار می دهد. ما ویژگی‌هایی مانند تأیید راننده، ردیابی سفر درون برنامه‌ای و گزینه‌های تماس اضطراری را ارائه می‌کنیم.", + "Frequently Questions": "سوالات متداول", + "User does not exist.": "کاربر وجود ندارد.", + "We need your phone number to contact you and to help you.": + "برای تماس با شما و کمک به شما به شماره تلفن شما نیاز داریم.", + "You will recieve code in sms message": + "کد را در پیامک دریافت خواهید کرد", + "Please enter": "لطفا وارد شوید", + "We need your phone number to contact you and to help you receive orders.": + "برای تماس با شما و کمک به دریافت سفارشات به شماره تلفن شما نیاز داریم.", + "The full name on your criminal record does not match the one on your driver’s license. Please verify and provide the correct documents.": + "نام کامل در سوابق کیفری شما با نام گواهینامه رانندگی شما مطابقت ندارد. لطفا بررسی کنید و مدارک صحیح را ارائه دهید.", + "The national number on your driver’s license does not match the one on your ID document. Please verify and provide the correct documents.": + "شماره ملی گواهینامه رانندگی شما با شماره مندرج در مدرک شناسایی شما مطابقت ندارد. لطفا بررسی کنید و مدارک صحیح را ارائه دهید.", + "Capture an Image of Your Criminal Record": + "تصویری از سابقه کیفری خود بگیرید", + "IssueDate": "تاریخ صدور", + "Capture an Image of Your car license front": + "تصویری از جلوی گواهینامه خودروی خود بگیرید", + "Capture an Image of Your ID Document front": + "تصویری از جلوی سند شناسایی خود بگیرید", + "NationalID": "کد ملی", + "FullName": "نام و نام خانوادگی", + "InspectionResult": "نتیجه بازرسی", + "Criminal Record": "سابقه کیفری", + "The email or phone number is already registered.": + "ایمیل یا شماره تلفن قبلا ثبت شده است.", + "To become a ride-sharing driver on the Sefer app, you need to upload your driver\"s license, ID document, and car registration document. Our AI system will instantly review and verify their authenticity in just 2-3 minutes. If your documents are approved, you can start working as a driver on the Sefer app. Please note, submitting fraudulent documents is a serious offense and may result in immediate termination and legal consequences.": + "برای تبدیل شدن به یک راننده اشتراکی سواری در برنامه Sefer، باید گواهینامه رانندگی، مدرک شناسایی و سند ثبت نام خودرو خود را آپلود کنید. سیستم هوش مصنوعی ما فوراً صحت آنها را فقط در 2 تا 3 دقیقه بررسی و تأیید می کند. اگر اسناد شما شما می توانید به عنوان راننده در اپلیکیشن Sefer شروع به کار کنید.", + "Documents check": "بررسی اسناد", + "Driver's License": "گواهینامه رانندگی", + "License Type": "نوع مجوز", + "National Number": "شماره ملی", + "Name (Arabic)": "نام (عربی)", + "Name (English)": "نام (انگلیسی)", + "Address": "نشانی", + "Issue Date": "تاریخ صدور", + "Expiry Date": "تاریخ انقضا", + "License Categories": "دسته بندی مجوزها", + "driver_license": "گواهینامه رانندگی", + "Capture an Image of Your Driver License": + "از گواهینامه رانندگی خود عکس بگیرید", + "ID Documents Back": "بازگشت اسناد شناسایی", + "National ID": "کد ملی", + "Occupation": "اشتغال", + "Gender": "جنسیت", + "Religion": "دین", + "Marital Status": "وضعیت تأهل", + "Full Name (Marital)": "نام کامل (تأهل)", + "Expiration Date": "تاریخ انقضا", + "Capture an Image of Your ID Document Back": + "از سند شناسایی خود عکس بگیرید", + "ID Documents Front": "جلوی اسناد شناسایی", + "First Name": "نام کوچک", + "CardID": "شناسه کارت", + "Full Name": "نام و نام خانوادگی", + "Vehicle Details Front": "جزئیات خودرو جلو", + "Plate Number": "شماره پلاک", + "Owner Name": "نام مالک", + "Vehicle Details Back": "جزئیات خودرو برگشت", + "Make": "بسازید", + "Model": "مدل", + "Year": "سال", + "Chassis": "شاسی بلند", + "Color": "رنگ", + "Displacement": "جابه جایی", + "Fuel": "سوخت", + "Tax Expiry Date": "تاریخ انقضای مالیات", + "Inspection Date": "تاریخ بازرسی", + "Capture an Image of Your car license back": + "از گواهینامه خودروی خود عکس بگیرید", + "Capture an Image of Your Driver’s License": + "از گواهینامه رانندگی خود عکس بگیرید", + "Sign in with Google for easier email and name entry": + "برای ورود آسان تر ایمیل و نام، با Google وارد شوید", + "You will choose allow all the time to be ready receive orders": + "شما اجازه می‌دهید همیشه آماده باشد دریافت سفارش‌ها را انتخاب می‌کنید", + "Welcome to Sefer!": "به سیفر خوش آمدید", + "Get to your destination quickly and easily.": + "سریع و راحت به مقصد برسید.", + "Enjoy a safe and comfortable ride.": + "از یک سواری ایمن و راحت لذت ببرید.", + "Choose Language": "زبان را انتخاب کنید", + "Login": "وارد شدن", + "Pay with Wallet": "با کیف پول پرداخت کنید", + "Invalid MPIN": "MPIN نامعتبر است", + "Invalid OTP": "OTP نامعتبر است", + "Enter your email address": "آدرس ایمیل خود را وارد کنید", + "Please enter Your Email.": "لطفا آدرس اییمیل خود را وارد نمایید.", + "Enter your phone number": "شماره تلفن خود را وارد کنید", + "Please enter your phone number.": + "لطفا شماره تلفن خود را وارد کنید.", + "Please enter Your Password.": "لطفا رمز عبور خود را وارد کنید.", + "Submit": "ارسال", + "if you dont have account": "اگر اکانت ندارید", + "Register": "ثبت نام", + "Accept Ride's Terms & Review Privacy Notice": + "شرایط راید را بپذیرید و اعلامیه حریم خصوصی را مرور کنید", + "By selecting 'I Agree' below, I have reviewed and agree to the Terms of Use and acknowledge the Privacy Notice. I am at least 18 years of age.": + "با انتخاب «موافقم» در زیر، شرایط استفاده را بررسی کرده و با آن موافقم و اعلامیه حریم خصوصی را تأیید می‌کنم. من حداقل 18 سال سن دارم.", + "I Agree": "موافقم", + "First name": "نام کوچک", + "Enter your first name": "نام خود را وارد نمایید", + "Please enter your first name.": "لطفا نام خود را وارد کنید.", + "Last name": "نام خانوادگی", + "Enter your last name": "نام خانوادگی خود را وارد کنید", + "Please enter your last name.": "لطفا نام خانوادگی خود را وارد کنید.", + "City": "شهر", + "Please enter your City.": "لطفا شهر خود را وارد کنید", + "Male": "نر", + "Female": "زن", + "Verify Email": "تأیید ایمیل", + "We sent 5 digit to your Email provided": + "ما 5 رقمی را به ایمیل شما ارسال کردیم", + "5 digit": "5 رقمی", + "Send Verification Code": "ارسال کد تایید", + "Your Ride Duration is": "مدت زمان سواری شما است", + "You will be thier in": "شما در آن حضور خواهید داشت", + "You trip distance is": "شما مسافت سفر است", + "Fee is": "هزینه است", + "From :": "از جانب :", + "To :": "به :", + "Add Promo": "تبلیغاتی را اضافه کنید", + "Confirm Selection": "تایید انتخاب", + "distance is": "فاصله است", + "duration is": "مدت است", + "I don't need a ride anymore": "من دیگر نیازی به سواری ندارم", + "I was just trying the application": + "من فقط برنامه را امتحان می کردم", + "No driver accepted my request": + "هیچ راننده ای درخواست من را قبول نکرد", + "I added the wrong pick-up/drop-off location": + "من مکان تحویل / تحویل اشتباه را اضافه کردم", + "I don't have a reason": "دلیلی ندارم", + "Other": "دیگر", + "Can we know why you want to cancel Ride ?": + "آیا می‌توانیم بدانیم چرا می‌خواهید راید را لغو کنید؟", + "Cancel Ride": "لغو سواری", + "Add Payment Method": "افزودن روش پرداخت", + "Your Wallet balance is": "موجودی کیف پول شما است", + "Ride Wallet": "سوار کیف پول", + "Payment Method": "روش پرداخت", + "Type here Place": "اینجا را تایپ کنید مکان", + "Are You sure to ride to": "آیا مطمئن هستید که به", + "Confirm": "تایید", + "Back": "بازگشت", + "You are Delete": "شما Delete هستید", + "Deleted": "حذف شده", + "You Dont Have Any places yet !": "شما هنوز جایی ندارید!", + "Favorite Places": "مکان های مورد علاقه", + "From : Current Location": "از: مکان فعلی", + "Where to": "به کجا", + "Notifications": "اطلاعیه", + "Profile": "مشخصات", + "Home": "صفحه اصلی", + "My Cared": "مراقبت من", + "Add Card": "اضافه کردن کارت", + "Add Credit Card": "اضافه کردن کارت اعتباری", + "Please enter the cardholder name": + "لطفا نام دارنده کارت را وارد کنید", + "Please enter the expiry date": "لطفا تاریخ انقضا را وارد کنید", + "Please enter the CVV code": "لطفا کد CVV را وارد کنید", + "Go To Favorite Places": "به مکان های مورد علاقه بروید", + "Go to this Target": "به این هدف بروید", + "My Profile": "پروفایل من", + "Sign Out": "خروج از سیستم", + "Home Page": "صفحه نخست", + "Are you want to go to this site": "آیا می خواهید به این سایت بروید", + "MyLocation": "محل من", + "my location": "محل من", + "Target": "هدف", + "Update": "به روز رسانی", + "You Should choose rate figure": "شما باید رقم نرخ را انتخاب کنید", + "Login Captin": "ورود Captin", + "Register Captin": "ثبت نام Captin", + "Send Verfication Code": "ارسال کد تایید", + "KM": "KM", + "End Ride": "پایان سواری", + "Minute": "دقیقه", + "Go to passenger Location now": "اکنون به مکان مسافر بروید", + "Duration of the Ride is": "مدت زمان سواری است", + "Distance of the Ride is": "فاصله سواری است", + "Name of the Passenger is": "نام مسافر است", + "Hello this is Captain": "سلام این کاپیتان است", + "Start the Ride": "سواری را شروع کنید", + "Please Wait If passenger want To Cancel!": + "لطفا صبر کنید اگر مسافر می خواهد لغو کند!", + "Total Duration:": "کل مدت زمان:", + "Active Duration:": "مدت زمان فعال:", + "Waiting for Captin ...": "در انتظار کاپیتین...", + "Age is": "سن است", + "Rating is": "رتبه بندی است", + "to arrive you.": "برای رسیدن به تو", + "Order History": "تاریخچه سفارش ها", + "My Wallet": "کیف پول من", + "Tariff": "تعرفه", + "Settings": "تنظیمات", + "Feed Back": "بازخورد", + "Promos": "تبلیغات", + "Please enter a valid 16-digit card number": + "لطفاً یک شماره کارت 16 رقمی معتبر وارد کنید", + "Add Phone": "اضافه کردن تلفن", + "Please enter a phone number": "لطفا یک شماره تلفن وارد کنید", + "You dont Add Emergency Phone Yet!": + "شما هنوز تلفن اضطراری را اضافه نکرده اید!", + "You will arrive to your destination after": + "پس از آن به مقصد خود خواهید رسید", + "You can cancel Ride now": "اکنون می‌توانید Ride را لغو کنید", + "You Can cancel Ride After Captain did not come in the time": + "بعد از اینکه کاپیتان به موقع نیامد، می توانید Ride را لغو کنید", + "If you in Car Now. Press Start The Ride": + "اگر اکنون در ماشین هستید. Start The Ride را فشار دهید", + "You Dont Have Any amount in": "شما هیچ مبلغی ندارید", + "Wallet!": "کیف پول!", + "You Have": "شما دارید", + "Save Credit Card": "ذخیره کارت اعتباری", + "Show Promos": "نمایش تبلیغات", + "10 and get 4% discount": "10 و 4 درصد تخفیف بگیرید", + "20 and get 6% discount": "20 و 6 درصد تخفیف بگیرید", + "40 and get 8% discount": "40 و 8 درصد تخفیف بگیرید", + "100 and get 11% discount": "100 و 11 درصد تخفیف بگیرید", + "Pay with Your PayPal": "با پی پال خود پرداخت کنید", + "You will choose one of above !": + "شما یکی از بالا را انتخاب خواهید کرد!", + "Cancel": "لغو کنید", + "Delete My Account": "Delete My Account", + "Edit Profile": "ویرایش نمایه", + "Name": "نام", + "Update Gender": "جنسیت را به روز کنید", + "Education": "تحصیلات", + "Update Education": "آموزش را به روز کنید", + "Employment Type": "نوع اشتغال", + "SOS Phone": "تلفن SOS", + "High School Diploma": "دیپلم دبیرستان", + "Associate Degree": "فوق دیپلم", + "Bachelor's Degree": "مدرک کارشناسی", + "Master's Degree": "مدرک کارشناسی ارشد", + "Doctoral Degree": "مدرک دکترا", + "Promos For today": "تبلیغات برای امروز", + "Copy this Promo to use it in your Ride!": + "این تبلیغات را کپی کنید تا از آن در سواری خود استفاده کنید!", + "To change some Settings": "برای تغییر برخی تنظیمات", + "To change Language the App": "برای تغییر زبان برنامه", + "Order Request Page": "صفحه درخواست سفارش", + "Rouats of Trip": "مسیرهای سفر", + "Passenger Name is": "نام مسافر است", + "Total From Passenger is": "مجموع از مسافر است", + "Duration To Passenger is": "مدت زمان تا مسافر است", + "Distance To Passenger is": "فاصله تا مسافر است", + "Total For You is": "Total For You است", + "Distance is": "فاصله است", + "KM": "KM", + "Duration of Trip is": "مدت سفر است", + "Minutes": "دقایق", + "Apply Order": "درخواست سفارش", + "Refuse Order": "امتناع دستور", + "Rate Captain": "به کاپیتان امتیاز دهید", + "Enter your Note": "یادداشت خود را وارد کنید", + "Type something...": "چیزی تایپ کن...", + "Submit rating": "رتبه بندی را ارسال کنید", + "Rate Passenger": "به مسافر امتیاز دهید", + "Ride Summary": "خلاصه سواری", + "welcome_message": "پیام خوش آمد", + "app_description": "app_description", + "get_to_destination": "رسیدن_به_مقصد", + "get_a_ride": "get_a_ride", + "safe_and_comfortable": "امن_و_راحت", + "committed_to_safety": "تعهد_به_ایمنی", + "Driver Applied the Ride for You": + "راننده سواری را برای شما اعمال کرد", + "Show latest promo": "نمایش آخرین تبلیغات", + "Cancel Trip": "لغو سفر", + "Passenger Cancel Trip": "لغو سفر مسافر", + "Please stay on the picked point.": "لطفا در نقطه انتخاب شده بمانید", + "Trip is Begin": "سفر آغاز شده است", + "Hi ,I will go now": "سلام من الان میرم", + "Passenger come to you": "مسافر به سمت شما می آید", + "Hi ,I Arrive your site": "سلام من به سایت شما رسیدم", + "Driver Finish Trip": "پایان سفر راننده", + "you will pay to Driver": "شما به راننده پرداخت خواهید کرد", + "Driver Cancel Your Trip": "راننده سفر شما را لغو کند", + "you will pay to Driver you will be pay the cost of driver time look to your SEFER Wallet": + "شما به راننده پرداخت خواهید کرد، هزینه نگاه کردن به راننده را به کیف پول SEFER خود پرداخت خواهید کرد", + "I will go now": "من الان میروم", + "You Have Tips": "نکاتی دارید", + "tips": "نکات", + "Total is": "مجموع است", + "الْمَجْمُوع هُوَ": "الْمَجْمُوع هُوَ", + "No,I want": "نه من می خواهم", + "Your fee is": "هزینه شما است", + "Do you want to pay Tips for this Driver": + "آیا می خواهید برای این درایور نکاتی بپردازید؟", + "Tip is": "نکته است", + "Tip is": "نکته است", + "Camera Access Denied.": "دسترسی به دوربین ممنوع شد.", + "Open Settings": "تنظیمات را باز کنید", + "GPS Required Allow !.": "GPS مورد نیاز مجاز است!.", + "Your Account is Deleted": "اکانت شما حذف شده است", + "Are you sure to delete your account?": + "آیا مطمئن هستید که اکانت خود را حذف می کنید؟", + "Your data will be erased after 2 weeks": + "اطلاعات شما پس از 2 هفته پاک می شود", + "And you will can't return to use app after 1 month": + "و بعد از 1 ماه نمی توانید به استفاده از برنامه برگردید", + "وَلَن تَسْتَطِيع اسْتِخْدَام التَّطْبِيق مَرَّة أُخْرَى بَعْد شَهْر": + "وَلَن تَسْتَطِیع اسْتِخْدَام التَّطْبِیق مَرَّة أُخْرَی بَعْد شَهْر.", + "Enter Your First Name": "نام خود را وارد نمایید", + "Are you Sure to LogOut?": + "آیا مطمئن هستید که از سیستم خارج می شوید؟", + "Email Wrong": "ایمیل اشتباه است", + "Email you inserted is Wrong.": "ایمیلی که وارد کردید اشتباه است.", + "You have finished all times": "شما همه زمان ها را تمام کرده اید", + "if you want help you can email us here": + "اگر کمک می خواهید می توانید به ما ایمیل بزنید", + "Thanks": "با تشکر", + "Email Us": "به ما ایمیل بزنید", + "I cant register in your app in face detection": + "من نمی توانم در برنامه شما در تشخیص چهره ثبت نام کنم", + "Hi": "سلام", + "No face detected": "چهره ای شناسایی نشد", + "Image detecting result is": "نتیجه تشخیص تصویر است", + "from 3 times Take Attention": "از 3 بار توجه کنید", + "Be sure for take accurate images please": + "حتما عکس های دقیق بگیرید لطفا", + "You have": "شما دارید", + "لَدَيْك": "لَدَیْک", + "image verified": "تصویر تایید شد", + "Next": "بعد", + "There is no help Question here": "در اینجا هیچ سوال کمکی وجود ندارد", + "Call End": "پایان تماس", + "You dont have Points": "شما امتیاز ندارید", + "You Are Stopped For this Day !": "شما برای این روز متوقف شده اید!", + "You must be charge your Account": "شما باید حساب خود را شارژ کنید", + "You Refused 3 Rides this Day that is the reason": + "شما این روز 3 سواری را رد کردید که دلیل آن است", + "See you Tomorrow!": "فردا می بینمت!", + "لِقَائِنَا غَدًا!": "لِقَائِنَا غَداًا!", + "Recharge my Account": "شارژ مجدد حساب من", + "Ok , See you Tomorrow": "باشه فردا میبینمت", + "You are Stopped": "شما متوقف شده اید", + "Connected": "متصل", + "Not Connected": "متصل نیست", + "Your are far from passenger location": "شما از محل مسافر دور هستید", + "go to your passenger location before": + "قبل از رفتن به محل مسافر خود بروید", + "Passenger cancel trip": "لغو سفر مسافر", + "يُلْغِي الرَّاكِب الرِّحْلَة": "يُلْغِي الرَّاكِب الرِّحْلَة", + "You will get cost of your work for this trip": + "هزینه کار خود را برای این سفر دریافت خواهید کرد", + "in your wallet": "در کیف پول شما", + "you gain": "به دست می آورید", + "Order Cancelled": "سفارش لغو شد", + "Order Cancelled by Passenger": "سفارش توسط مسافر لغو شد", + "Success": "موفقیت", + "Feedback data saved successfully": + "داده های بازخورد با موفقیت ذخیره شد", + "No Promo for today .": "تبلیغاتی برای امروز وجود ندارد.", + "Select your destination": "مقصد خود را انتخاب کنید", + "Search for your Start point": "نقطه شروع خود را جستجو کنید", + "Search for waypoint": "جستجوی نقطه راه", + "Current Location": "موقعیت فعلی", + "Add Location 1": "اضافه کردن مکان 1", + "You must Verify email !.": "شما باید ایمیل را تأیید کنید!", + "Cropper": "کراپر", + "Saved Sucssefully": "با موفقیت ذخیره شد", + "Select Date": "تاریخ را انتخاب کنید", + "Birth Date": "تاریخ تولد", + "Ok": "خوب", + "the 500 points equal 30 JOD": "500 امتیاز معادل 30 JOD است", + "the 500 points equal 30 JOD for you": + "500 امتیاز برای شما معادل 30 JOD است", + "So go and gain your money": "پس برو و پولت را بدست بیاور", + "فَاسْتَحِقَّ فُلُوسَك وَاكْسِب النِّقَاط": + "فَاسْتَحِقَّ فُلُوسَک وَاكْسِب النِّقَاط", + "token updated": "توکن به روز شد", + "Add Location 2": "اضافه کردن مکان 2", + "Add Location 3": "اضافه کردن مکان 3", + "Add Location 4": "اضافه کردن مکان 4", + "Waiting for your location": "منتظر مکان شما هستیم", + "Search for your destination": "مقصد خود را جستجو کنید", + "Hi! This is": "سلام! این هست", + "I am using": "من با استفاده از", + "to ride with": "برای سوار شدن با", + "as the driver.": "به عنوان راننده", + "is driving a": "در حال رانندگی است", + "with license plate": "با پلاک", + "I am currently located at": "من در حال حاضر در", + "Please go to Car now": "لطفا همین الان به ماشین بروید", + "If you need to reach me, please contact the driver directly at": + "اگر نیاز به تماس با من دارید، لطفاً مستقیماً با راننده تماس بگیرید", + "No Car or Driver Found in your area.": + "هیچ خودرو یا راننده ای در منطقه شما یافت نشد.", + "Please Try anther time": "لطفا زمان دیگری را امتحان کنید", + "There no Driver Aplly your order sorry for that": + "هیچ Driver Aply سفارش شما وجود ندارد برای آن متأسفیم", + "Trip Cancelled": "سفر لغو شد", + "The Driver Will be in your location soon .": + "راننده به زودی در محل شما خواهد بود.", + "The distance less than 500 meter.": "فاصله کمتر از 500 متر", + "Promo End !": "پایان تبلیغاتی!", + "There is no notification yet": "هنوز اطلاع رسانی نشده است", + "Use Touch ID or Face ID to confirm payment": + "برای تأیید پرداخت از Touch ID یا Face ID استفاده کنید", + "Contact us for any questions on your order.": + "برای هرگونه سوال در مورد سفارش خود با ما تماس بگیرید.", + "Pyament Cancelled .": "Pyament لغو شد.", + "type here": "اینجا تایپ کنید", + "Scan Driver License": "اسکن گواهینامه رانندگی", + "Please put your licence in these border": + "لطفا مجوز خود را در این مرزها قرار دهید", + "Camera not initialized yet": "دوربین هنوز راه اندازی نشده است", + "Take Image": "عکس بگیرید", + "AI Page": "صفحه هوش مصنوعی", + "Take Picture Of ID Card": "از کارت شناسایی عکس بگیرید", + "Take Picture Of Driver License Card": + "از کارت گواهینامه رانندگی عکس بگیرید", + "We are process picture please wait": + "ما در حال انجام تصویر هستیم لطفا صبر کنید", + "There is no data yet.": "هنوز هیچ داده ای وجود ندارد.", + "Name :": "نام :", + "Drivers License Class:": "کلاس گواهینامه رانندگی:", + "Document Number:": "شماره سند:", + "Address:": "نشانی:", + "Height:": "قد:", + "Expiry Date:": "تاریخ انقضا:", + "Date of Birth:": "تاریخ تولد:", + "You can\"t continue with us .": "شما نمی توانید با ما ادامه دهید.", + "You should renew Driver license": + "باید گواهینامه رانندگی را تمدید کنید", + "Detect Your Face": "چهره خود را تشخیص دهید", + "Go to next step": "به مرحله بعدی بروید", + "scan Car License.": "اسکن گواهینامه خودرو", + "aاسْتِخْرَاج رُخْصَة السَّيَّارَة.": + "اسْتِخْرَاج رُخْصَة السَّیَّارَة.", + "Name in arabic": "نام به عربی", + "Drivers License Class": "کلاس گواهینامه رانندگی", + "Date of Birth": "تاریخ تولد", + "Age": "سن", + "Lets check Car license": "بیایید گواهینامه ماشین را بررسی کنیم", + "Car Kind": "نوع ماشین", + "Car Plate": "پلاک اتومبیل", + "Lets check License Back Face": + "اجازه می دهد تا مجوز پشت صورت را بررسی کنیم", + "Car License Card": "کارت گواهینامه خودرو", + "No image selected yet": "هنوز تصویری انتخاب نشده است", + "Made :": "ساخته شده:", + "model :": "مدل :", + "VIN :": "VIN:", + "year :": "سال:", + "ُExpire Date": "تاریخ انقضا", + "Login Driver": "درایور ورود", + "Password must br at least 6 character.": + "رمز عبور باید حداقل 6 کاراکتر داشته باشد.", + "if you don\"t have account": "اگر حساب ندارید", + "Here recorded trips audio": "در اینجا سفرهای صوتی ضبط شده است", + "Register as Driver": "ثبت نام به عنوان راننده", + "Privacy Notice": "اطلاعیه حفظ حریم خصوصی", + "By selecting 'I Agree' below, I have reviewed and agree to the Terms of Use and acknowledge the": + "با انتخاب «موافقم» در زیر، شرایط استفاده را بررسی کرده و با آن موافقم و تأیید می کنم", + ". I am at least 18 years of age.": ". من حداقل 18 سال سن دارم.", + "Log Out Page": "صفحه خروج", + "Log Off": "خروج", + "Register Driver": "ثبت راننده", + "Verify Email For Driver": "تایید ایمیل برای درایور", + "Admin DashBoard": "داشبورد مدیریت", + "Your name": "اسم شما", + "your ride is applied": "سواری شما اعمال می شود", + "Your password": "رمز عبور شما", + "H and": "H و", + "LE": "LE", + "JOD": "JOD", + "m": "متر", + "We search nearst Driver to you": + "ما نزدیکترین راننده به شما را جستجو می کنیم", + "please wait till driver accept your order": + "لطفا صبر کنید تا راننده سفارش شما را بپذیرد", + "No accepted orders? Try raising your trip fee to attract riders.": + "سفارش پذیرفته نشده است؟ سعی کنید هزینه سفر خود را برای جذب سوارکاران افزایش دهید.", + "You should select one": "شما باید یکی را انتخاب کنید", + "The driver accept your order for": "راننده سفارش شما را می پذیرد", + "Increase Fee": "افزایش کارمزد", + "No, thanks": "نه ممنون", + "The driver on your way": "راننده در راه است", + "Total price from": "قیمت کل از", + "Order Details Speed": "جزئیات سفارش سرعت", + "Order Applied": "سفارش اعمال شد", + "accepted your order": "سفارش شما را پذیرفت", + "We regret to inform you that another driver has accepted this order.": + "با کمال تاسف به اطلاع می رسانیم که راننده دیگری این سفارش را پذیرفته است.", + "Selected file:": "فایل انتخابی:", + "Your trip cost is": "هزینه سفر شما است", + "this will delete all files from your device": + "با این کار تمام فایل ها از دستگاه شما حذف می شود", + "you have a negative balance of": "تراز منفی دارید", + "in your": "در شما", + "Exclusive offers and discounts always with the Sefer app": + "پیشنهادات و تخفیف های انحصاری همیشه با اپلیکیشن Sefer", + "Please go to Car Driver": "لطفا به راننده ماشین مراجعه کنید", + "wallet due to a previous trip.": "کیف پول به دلیل سفر قبلی", + "Submit Question": "ارسال سوال", + "Please enter your Question.": "لطفا سوال خود را وارد کنید", + "Help Details": "جزئیات راهنما", + "No trip yet found": "هنوز سفری پیدا نشده است", + "No Response yet.": "هنوز پاسخی داده نشده است.", + "You Earn today is": "کسب درآمد امروز است", + "You Have in": "شما وارد شده اید", + "Total points is": "مجموع امتیاز است", + "Total Connection Duration:": "کل مدت زمان اتصال:", + "H and": "H و", + "Passenger name :": "نام مسافر :", + "Cost Of Trip IS": "هزینه سفر IS است", + "Arrival time": "زمان رسیدن", + "arrival time to reach your point": + "زمان رسیدن برای رسیدن به نقطه خود", + "For Speed and Delivery trips, the price is calculated dynamically. For Comfort trips, the price is based on time and distance": + "برای سفرهای سرعت و تحویل، قیمت به صورت پویا محاسبه می شود. برای سفرهای Comfort، قیمت بر اساس زمان و مسافت است", + "Hello this is Driver": "سلام این راننده است", + "Is the Passenger in your Car ?": "آیا مسافر در ماشین شماست؟", + "Please wait for the passenger to enter the car before starting the trip.": + "لطفا قبل از شروع سفر صبر کنید تا مسافر وارد ماشین شود.", + "No ,still Waiting.": "نه، هنوز منتظرم", + "I arrive you": "من به تو می رسم", + "I Arrive your site": "من به سایت شما می رسم", + "You are not in near to passenger location": + "شما در نزدیکی محل مسافر نیستید", + "please go to picker location exactly": + "لطفاً دقیقاً به محل انتخابگر بروید", + "You Can Cancel Trip And get Cost of Trip From": + "می توانید سفر را لغو کنید و هزینه سفر را از آن دریافت کنید", + "Are you sure to cancel?": "آیا مطمئن هستید که لغو می کنید؟", + "Yes": "آره", + "Insert Emergincy Number": "درج شماره اضطراری", + "Best choice for comfort car and flexible route and stops point": + "بهترین انتخاب برای ماشین راحت و مسیر انعطاف پذیر و نقطه توقف", + "Insert": "درج کنید", + "This is for delivery or a motorcycle.": + "این برای تحویل یا موتور سیکلت است.", + "This trip goes directly from your starting point to your destination for a fixed price. The driver must follow the planned route": + "این سفر مستقیماً از نقطه شروع شما به مقصد شما با قیمت ثابت می رود. راننده باید مسیر برنامه ریزی شده را دنبال کند", + "You can decline a request without any cost": + "شما می توانید بدون هیچ هزینه ای درخواست را رد کنید", + "Perfect for adventure seekers who want to experience something new and exciting": + "ایده آل برای جویندگان ماجراجویی که می خواهند چیزی جدید و هیجان انگیز را تجربه کنند", + "My current location is:": "مکان فعلی من این است:", + "and I have a trip on": "و من یک سفر دارم", + "App with Passenger": "برنامه با مسافر", + "مع الراكب": "مع الراکب", + "You will be pay the cost to driver or we will get it from you on next trip": + "هزینه آن را به راننده می پردازید یا در سفر بعدی آن را از شما دریافت می کنیم", + "Trip has Steps": "سفر دارای مراحل است", + "Distance from Passenger to destination is": + "فاصله مسافر تا مقصد است", + "price is": "قیمت است", + "This ride type does not allow changes to the destination or additional stops": + "این نوع سواری اجازه تغییر در مقصد یا توقف های اضافی را نمی دهد", + "This price may be changed": "این قیمت ممکن است تغییر کند", + "No SIM card, no problem! Call your driver directly through our app. We use advanced technology to ensure your privacy.": + "سیم کارت نداره مشکلی نیست! مستقیماً از طریق برنامه ما با راننده خود تماس بگیرید. ما از فناوری پیشرفته برای اطمینان از حریم خصوصی شما استفاده می کنیم.", + "This ride type allows changes, but the price may increase": + "این نوع سواری امکان تغییرات را دارد، اما ممکن است قیمت افزایش یابد", + "message From passenger": "پیام از مسافر", + "Select one message": "یک پیام را انتخاب کنید", + "My location is correct. You can search for me using the navigation app": + "موقعیت مکانی من درست است می توانید با استفاده از برنامه ناوبری من را جستجو کنید", + "I'm waiting for you": "من منتظر شما هستم", + "Hello, I'm at the agreed-upon location": + "سلام، من در محل مورد توافق هستم", + "We noticed the speed is exceeding 100 km/h. Please slow down for your safety. If you feel unsafe, you can share your trip details with a contact or call the police using the red SOS button.": + "ما متوجه شدیم که سرعت بیش از 100 کیلومتر در ساعت است. لطفا برای ایمنی خود سرعت خود را کم کنید. اگر احساس ناامنی می کنید، می توانید جزئیات سفر خود را با یک مخاطب به اشتراک بگذارید یا با استفاده از دکمه قرمز SOS با پلیس تماس بگیرید.", + "Warning: Speeding detected!": "هشدار: سرعت تشخیص داده شد!", + "Please help! Contact me as soon as possible.": + "لطفا کمک کنید! در اسرع وقت با من تماس بگیرید.", + "Share Trip Details": "جزئیات سفر را به اشتراک بگذارید", + "Car Plate is": "پلاک خودرو است", + "the 300 points equal 300 L.E for you": + "300 امتیاز برای شما معادل 300 L.E است", + "So go and gain your money": "پس برو و پولت را بدست بیاور", + "the 300 points equal 300 L.E": "300 امتیاز معادل 300 L.E", + "The payment was not approved. Please try again.": + "پرداخت مورد تایید قرار نگرفت. لطفا دوباره تلاش کنید.", + "Payment Failed": "پرداخت ناموفق", + "Error": "خطا", + "An error occurred during the payment process.": + "خطایی در فرآیند پرداخت رخ داد.", + "The payment was approved.": "پرداخت مورد تایید قرار گرفت.", + "Payment Successful": "پرداخت با موفقیت انجام شد", + "No ride found yet": "هنوز سواری پیدا نشده است", + "Accept Order": "قبول سفارش", + "reject your order.": "سفارش شما را رد کند", + "Bottom Bar Example": "نمونه نوار پایین", + "Driver phone": "تلفن راننده", + "Statistics": "آمار", + "Origin": "اصل و نسب", + "Destination": "مقصد", + "Driver Name": "نام راننده", + "Driver Car Plate": "پلاک ماشین راننده", + "Available for rides": "برای سواری در دسترس است", + "Scan Id": "شناسه اسکن", + "Camera not initilaized yet": "دوربین هنوز راه اندازی نشده است", + "Scan ID MklGoogle": "اسکن شناسه MklGoogle", + "Language": "زبان", + "Jordan": "اردن", + "USA": "ایالات متحده آمریکا", + "Egypt": "مصر", + "Turkey": "بوقلمون", + "Saudi Arabia": "عربستان سعودی", + "Qatar": "قطر", + "Bahrain": "بحرین", + "Kuwait": "کویت", + "But you have a negative salary of": "اما شما حقوق منفی دارید", + "Promo Code": "کد تبلیغاتی", + "Your trip distance is": "مسافت سفر شما است", + "Enter promo code": "کد تبلیغاتی را وارد کنید", + "You have promo!": "شما تبلیغاتی دارید!", + "Cost Duration": "مدت زمان هزینه", + "Duration is": "مدت زمان است", + "Leave": "ترک کردن", + "Join": "پیوستن", + "You Should be select reason.": "شما باید دلیل را انتخاب کنید.", + "\$": "\$", + "Waiting for Driver ...": "در انتظار راننده ...", + "Latest Recent Trip": "آخرین سفر اخیر", + "from your list": "از لیست شما", + "Do you want to change Work location": + "آیا می خواهید محل کار را تغییر دهید؟", + "Do you want to change Home location": + "آیا می خواهید مکان خانه را تغییر دهید؟", + "We Are Sorry That we dont have cars in your Location!": + "ما متاسفیم که در مکان شما ماشین نداریم!", + "Choose from Map": "از نقشه انتخاب کنید", + "Pick your ride location on the map - Tap to confirm": + "مکان سواری خود را روی نقشه انتخاب کنید - برای تأیید ضربه بزنید", + "To Work": "برای کار", + "Are you want to go this site": "آیا می خواهید به این سایت بروید", + "Closest & Cheapest": "نزدیکترین و ارزانترین", + "Work Saved": "کار ذخیره شد", + "Sefer is the ride-hailing app that is safe, reliable, and accessible.": + "Sefer یک برنامه سواری است که ایمن، قابل اعتماد و در دسترس است.", + "With Sefer, you can get a ride to your destination in minutes.": + "با Sefer می توانید در عرض چند دقیقه سواری به مقصد برسید.", + "Sefer is committed to safety, and all of our captains are carefully screened and background checked.": + "Sefer به ایمنی متعهد است و همه کاپیتان های ما به دقت بررسی می شوند و پس زمینه بررسی می شوند.", + "To Home": "به خانه", + "Home Saved": "صفحه اصلی ذخیره شد", + "Destination selected": "مقصد انتخاب شد", + "Now select start pick": "حالا start pick را انتخاب کنید", + "Pick from map": "از روی نقشه انتخاب کنید", + "Click here point": "اینجا را کلیک کنید نقطه", + "No Car in your site. Sorry!": + "هیچ ماشینی در سایت شما وجود ندارد. متاسف!", + "Nearest Car for you about": "نزدیکترین ماشین برای شما در مورد", + "N/A": "N/A", + "From :": "از جانب :", + "Get Details of Trip": "جزئیات سفر را دریافت کنید", + "If you want add stop click here": + "اگر می خواهید توقف اضافه کنید اینجا را کلیک کنید", + "Driver": "راننده", + "Where you want go": "جایی که میخواهی برو", + "My Card": "کارت من", + "Start Record": "ضبط را شروع کنید", + "Wallet": "کیف پول", + "History of Trip": "تاریخچه سفر", + "Helping Center": "مرکز کمک", + "Record saved": "رکورد ذخیره شد", + "Trips recorded": "سفرها ثبت شد", + "Select Your Country": "کشورت را انتخاب کن", + "To ensure you receive the most accurate information for your location, please select your country below. This will help tailor the app experience and content to your country.": + "برای اطمینان از دریافت دقیق ترین اطلاعات برای موقعیت مکانی خود، لطفاً کشور خود را در زیر انتخاب کنید. این به شما کمک می کند تا تجربه و محتوای برنامه را متناسب با کشور خود تنظیم کنید.", + "Are you sure to delete recorded files": + "آیا مطمئن هستید که فایل های ضبط شده را حذف می کنید؟", + "Select recorded trip": "سفر ضبط شده را انتخاب کنید", + "Card Number": "شماره کارت", + "Hi, Where to": "سلام کجا", + "Pick your destination from Map": "مقصد خود را از نقشه انتخاب کنید", + "Add Stops": "توقف اضافه کنید", + "Get Direction": "دریافت جهت", + "Add Location": "اضافه کردن مکان", + "Switch Rider": "سوئیچ سوار", + "You will arrive to your destination after timer end.": + "پس از پایان تایمر به مقصد خود خواهید رسید.", + "You can cancel trip": "می توانید سفر را لغو کنید", + "The driver waitting you in picked location .": + "راننده در محل انتخاب شده منتظر شماست.", + "Pay with Your": "با شما پرداخت کنید", + "Pay with Credit Card": "با کارت اعتباری پرداخت کنید", + "Payment History": "تاریخچه پرداخت", + "Show Promos to Charge": "نمایش تبلیغات برای شارژ", + "Point": "نقطه", + "Driver Wallet": "کیف پول راننده", + "Total Points is": "مجموع امتیاز است", + "Total Budget from trips is": "مجموع بودجه از سفرها است", + "Total Amount:": "کل مبلغ:", + "Total Budget from trips by": "کل بودجه از سفرهای انجام شده توسط", + "Credit card is": "کارت اعتباری است", + "بطاقة الائتمان هي": "بطاقة الائتمان هی", + "This amount for all trip I get from Passengers": + "این مبلغ را برای تمام سفرها از مسافران دریافت می کنم", + "Pay from my budget": "از بودجه من پرداخت کنید", + "This amount for all trip I get from Passengers and Collected For me in": + "این مبلغ برای تمام سفرهایی که از مسافران دریافت می کنم و برای من در آن جمع آوری می شود", + "You can buy points from your budget": + "شما می توانید از بودجه خود امتیاز بخرید", + "insert amount": "درج مقدار", + "You can buy Points to let you online": + "می توانید امتیازهایی را بخرید تا به شما اجازه آنلاین بدهند", + "by this list below": "توسط این لیست زیر", + "من خلال القائمة أدناه": "من خلال القائمة أدناه", + "Create Wallet to receive your money": + "برای دریافت پول خود کیف پول ایجاد کنید", + "Enter your feedback here": "بازخورد خود را اینجا وارد کنید", + "Please enter your feedback.": "لطفا بازخورد خود را وارد کنید.", + "Feedback": "بازخورد", + "Submit": "ارسال", + "Click here to Show it in Map": + "برای نمایش آن در نقشه اینجا را کلیک کنید", + "Canceled": "لغو شد", + "Type your Email": "ایمیل خود را تایپ کنید", + "No I want": "نه من می خواهم", + "Email is": "ایمیل است", + "Phone Number is": "شماره تلفن است", + "Date of Birth is": "تاریخ تولد است", + "Sex is": "جنسیت است", + "Car Details": "جزئیات خودرو", + "VIN is": "VIN است", + "Color is": "رنگ است", + "Make is": "ساخت است", + "Model is": "مدل است", + "Year is": "سال است", + "Expiration Date": "تاریخ انقضا", + "Edit Your data": "داده های خود را ویرایش کنید", + "write vin for your car": "برای ماشینت vin بنویس", + "VIN": "VIN", + "write Color for your car": "برای ماشین خود رنگ بنویسید", + "write Make for your car": "بنویسید برای ماشین خود بسازید", + "write Model for your car": "مدل ماشین خود را بنویسید", + "write Year for your car": "سال را برای ماشین خود بنویسید", + "write Expiration Date for your car": + "تاریخ انقضای ماشین خود را بنویسید", + "Tariffs": "تعرفه ها", + "Minimum fare": "حداقل کرایه", + "Maximum fare": "حداکثر کرایه", + "Flag-down fee": "هزینه کاهش پرچم", + "Including Tax": "از جمله مالیات", + "BookingFee": "هزینه رزرو", + "Morning": "صبح", + "from 07:30 till 10:30 (Thursday, Friday, Saturday, Monday)": + "از ساعت 07:30 تا 10:30 (پنجشنبه، جمعه، شنبه، دوشنبه)", + "Evening": "عصر", + "from 12:00 till 15:00 (Thursday, Friday, Saturday, Monday)": + "از ساعت 12:00 الی 15:00 (پنجشنبه، جمعه، شنبه، دوشنبه)", + "Night": "شب", + "You have in account": "شما در حساب دارید", + "Select Country": "کشور را انتخاب کنید", + "Ride Today :": "امروز سوار شوید:", + "After this period": "بعد از این مدت", + "You can\"t cancel!": "شما نمی توانید لغو کنید!", + "لا تستطيع الغاء الرحله": "لا تستطيع الغاء الرحله", + "from 23:59 till 05:30": "از ساعت 23:59 تا 05:30", + "Rate Driver": "درایور را رتبه بندی کنید", + "Total Cost is": "هزینه کل است", + "Write note": "یادداشت بنویس", + "Time to arrive": "زمان رسیدن", + "Ride Summaries": "خلاصه های سواری", + "Total Cost": "هزینه کل", + "Average of Hours of": "میانگین ساعات", + "is ON for this month": "برای این ماه روشن است", + "Days": "روزها", + "Total Hours on month": "مجموع ساعت ها در ماه", + "Counts of Hours on days": "شمارش ساعت در روز", + "OrderId": "شماره سفارش", + "created time": "زمان ایجاد کرد", + "Speed Over": "سرعت بیش از", + "I will slow down": "من سرعتم را کاهش خواهم داد", + "Map Passenger": "مسافر نقشه", + "Be Slowly": "آهسته باش", + "If you want to make Google Map App run directly when you apply order": + "اگر می خواهید برنامه Google Map را مستقیماً هنگام اعمال سفارش اجرا کنید", + "You can change the language of the app": + "می توانید زبان برنامه را تغییر دهید", + "Your Budget less than needed": "بودجه شما کمتر از نیاز است", + "You can change the Country to get all features": + "می‌توانید کشور را برای دریافت همه ویژگی‌ها تغییر دهید", + "Change Country": "تغییر کشور" + }, + "el": { + "Sign In by Apple": "Είσοδος από την Apple", + "Sign In by Google": "Είσοδος μέσω Google", + "How do I request a ride?": "Πώς μπορώ να ζητήσω μια βόλτα;", + "Step-by-step instructions on how to request a ride through the Sefer app.": + "Οδηγίες βήμα προς βήμα για το πώς να ζητήσετε μια βόλτα μέσω της εφαρμογής Sefer.", + "What types of vehicles are available?": + "Τι είδη οχημάτων είναι διαθέσιμα;", + "Sefer offers a variety of vehicle options to suit your needs, including economy, comfort, and luxury. Choose the option that best fits your budget and passenger count.": + "Η Sefer προσφέρει μια ποικιλία επιλογών οχημάτων που ταιριάζουν στις ανάγκες σας, όπως οικονομία, άνεση και πολυτέλεια. Επιλέξτε την επιλογή που ταιριάζει καλύτερα στον προϋπολογισμό και τον αριθμό των επιβατών σας.", + "How can I pay for my ride?": + "Πώς μπορώ να πληρώσω για τη διαδρομή μου;", + "Sefer offers multiple payment methods for your convenience. Choose between cash payment or credit/debit card payment during ride confirmation.": + "Η Sefer προσφέρει πολλαπλούς τρόπους πληρωμής για την εξυπηρέτησή σας. Επιλέξτε μεταξύ πληρωμής με μετρητά ή πληρωμής με πιστωτική/χρεωστική κάρτα κατά την επιβεβαίωση της διαδρομής.", + "Can I cancel my ride?": "Μπορώ να ακυρώσω τη διαδρομή μου;", + "Yes, you can cancel your ride under certain conditions (e.g., before driver is assigned). See the Sefer cancellation policy for details.": + "Ναι, μπορείτε να ακυρώσετε τη βόλτα σας υπό ορισμένες προϋποθέσεις (π.χ. πριν ανατεθεί ο οδηγός). Δείτε την πολιτική ακύρωσης Sefer για λεπτομέρειες.", + "Driver Registration & Requirements": "Εγγραφή και απαιτήσεις οδηγού", + "How can I register as a driver?": "Πώς μπορώ να εγγραφώ ως οδηγός;", + "What are the requirements to become a driver?": + "Ποιες είναι οι προϋποθέσεις για να γίνεις οδηγός;", + "Visit our website or contact Sefer support for information on driver registration and requirements.": + "Επισκεφτείτε τον ιστότοπό μας ή επικοινωνήστε με την υποστήριξη της Sefer για πληροφορίες σχετικά με την εγγραφή οδηγού και τις απαιτήσεις.", + "How do I communicate with the other party (passenger/driver)?": + "Πώς επικοινωνώ με το άλλο μέρος (επιβάτη/οδηγό);", + "Sefer provides in-app chat functionality to allow you to communicate with your driver or passenger during your ride.": + "Το Sefer παρέχει λειτουργία συνομιλίας εντός εφαρμογής για να σας επιτρέπει να επικοινωνείτε με τον οδηγό ή τον συνεπιβάτη σας κατά τη διάρκεια της διαδρομής σας.", + "What safety measures does Sefer offer?": + "Ποια μέτρα ασφαλείας προσφέρει η Sefer;", + "Sefer prioritizes your safety. We offer features like driver verification, in-app trip tracking, and emergency contact options.": + "Η Sefer δίνει προτεραιότητα στην ασφάλειά σας. Προσφέρουμε λειτουργίες όπως επαλήθευση οδηγού, παρακολούθηση ταξιδιού εντός εφαρμογής και επιλογές επικοινωνίας έκτακτης ανάγκης.", + "Frequently Questions": "Συχνές Ερωτήσεις", + "User does not exist.": "Ο χρήστης δεν υπάρχει.", + "We need your phone number to contact you and to help you.": + "Χρειαζόμαστε τον αριθμό τηλεφώνου σας για να επικοινωνήσουμε μαζί σας και να σας βοηθήσουμε.", + "You will recieve code in sms message": + "Θα λάβετε κωδικό σε μήνυμα sms", + "Please enter": "Παρακαλώ περάστε", + "We need your phone number to contact you and to help you receive orders.": + "Χρειαζόμαστε τον αριθμό τηλεφώνου σας για να επικοινωνήσουμε μαζί σας και να σας βοηθήσουμε να λαμβάνετε παραγγελίες.", + "The full name on your criminal record does not match the one on your driver’s license. Please verify and provide the correct documents.": + "Το πλήρες όνομα στο ποινικό σας μητρώο δεν ταιριάζει με αυτό της άδειας οδήγησης. Επαληθεύστε και παρέχετε τα σωστά έγγραφα.", + "The national number on your driver’s license does not match the one on your ID document. Please verify and provide the correct documents.": + "Ο εθνικός αριθμός στην άδεια οδήγησής σας δεν ταιριάζει με αυτόν στο έγγραφο ταυτότητάς σας. Επαληθεύστε και παρέχετε τα σωστά έγγραφα.", + "Capture an Image of Your Criminal Record": + "Αποτυπώστε μια εικόνα του ποινικού σας μητρώου", + "IssueDate": "Ημερομηνία έκδοσης", + "Capture an Image of Your car license front": + "Τραβήξτε μια εικόνα της πρόσοψης της άδειας του αυτοκινήτου σας", + "Capture an Image of Your ID Document front": + "Τραβήξτε μια εικόνα του εγγράφου ταυτότητάς σας μπροστά", + "NationalID": "Εθνική ταυτότητα", + "FullName": "Πλήρες όνομα", + "InspectionResult": "Αποτέλεσμα Επιθεώρησης", + "Criminal Record": "Ποινικό μητρώο", + "The email or phone number is already registered.": + "Το email ή ο αριθμός τηλεφώνου είναι ήδη καταχωρημένος.", + "To become a ride-sharing driver on the Sefer app, you need to upload your driver\"s license, ID document, and car registration document. Our AI system will instantly review and verify their authenticity in just 2-3 minutes. If your documents are approved, you can start working as a driver on the Sefer app. Please note, submitting fraudulent documents is a serious offense and may result in immediate termination and legal consequences.": + "Για να γίνετε οδηγός κοινής χρήσης διαδρομής στην εφαρμογή Sefer, πρέπει να ανεβάσετε την άδεια οδήγησης, το έγγραφο ταυτότητας και το έγγραφο εγγραφής αυτοκινήτου. Το σύστημά μας AI θα ελέγξει και θα επαληθεύσει άμεσα την αυθεντικότητά τους σε μόλις 2-3 λεπτά. Εάν τα έγγραφά σας έχουν εγκριθεί, μπορείτε να ξεκινήσετε να εργάζεστε ως οδηγός στην εφαρμογή Sefer Λάβετε υπόψη ότι η υποβολή πλαστών εγγράφων είναι σοβαρή παράβαση και μπορεί να οδηγήσει σε άμεση διακοπή και νομικές συνέπειες.", + "Documents check": "Έλεγχος εγγράφων", + "Driver's License": "Αδεια οδήγησης", + "License Type": "Τύπος άδειας", + "National Number": "Εθνικός Αριθμός", + "Name (Arabic)": "Όνομα (Αραβικά)", + "Name (English)": "Όνομα (Αγγλικά)", + "Address": "Διεύθυνση", + "Issue Date": "Ημερομηνία έκδοσης", + "Expiry Date": "Ημερομηνία λήξης", + "License Categories": "Κατηγορίες αδειών", + "driver_license": "άδεια οδήγησης", + "Capture an Image of Your Driver License": + "Τραβήξτε μια εικόνα της άδειας οδήγησης", + "ID Documents Back": "Έγγραφα ταυτότητας Πίσω", + "National ID": "Εθνική ταυτότητα", + "Occupation": "Κατοχή", + "Gender": "Γένος", + "Religion": "Θρησκεία", + "Marital Status": "Οικογενειακή κατάσταση", + "Full Name (Marital)": "Πλήρες Όνομα (Συζυγική)", + "Expiration Date": "Ημερομηνία λήξης", + "Capture an Image of Your ID Document Back": + "Τραβήξτε μια εικόνα του εγγράφου ταυτότητάς σας πίσω", + "ID Documents Front": "Έγγραφα ταυτότητας εμπρός", + "First Name": "Ονομα", + "CardID": "Κάρτα ID", + "Full Name": "Πλήρες όνομα", + "Vehicle Details Front": "Λεπτομέρειες οχήματος εμπρός", + "Plate Number": "Αριθμός πινακίδας", + "Owner Name": "Ονομα ιδιοκτήτη", + "Vehicle Details Back": "Στοιχεία οχήματος Επιστροφή", + "Make": "Φτιαχνω, κανω", + "Model": "Μοντέλο", + "Year": "Ετος", + "Chassis": "Σασί", + "Color": "Χρώμα", + "Displacement": "Μετατόπιση", + "Fuel": "Καύσιμα", + "Tax Expiry Date": "Ημερομηνία λήξης φόρου", + "Inspection Date": "Ημερομηνία ελέγχου", + "Capture an Image of Your car license back": + "Τραβήξτε μια εικόνα της άδειας του αυτοκινήτου σας πίσω", + "Capture an Image of Your Driver’s License": + "Τραβήξτε μια εικόνα της άδειας οδήγησης", + "Sign in with Google for easier email and name entry": + "Συνδεθείτε με το Google για ευκολότερη εισαγωγή email και ονόματος", + "You will choose allow all the time to be ready receive orders": + "Θα επιλέξετε να επιτρέπεται όλη η ώρα να είναι έτοιμη να λαμβάνετε παραγγελίες", + "Welcome to Sefer!": "Καλώς ήρθατε στον Σεφέρ!", + "Get to your destination quickly and easily.": + "Φτάστε στον προορισμό σας γρήγορα και εύκολα.", + "Enjoy a safe and comfortable ride.": + "Απολαύστε μια ασφαλή και άνετη βόλτα.", + "Choose Language": "Διάλεξε γλώσσα", + "Login": "Σύνδεση", + "Pay with Wallet": "Πληρώστε με το Πορτοφόλι", + "Invalid MPIN": "Μη έγκυρο MPIN", + "Invalid OTP": "Μη έγκυρο OTP", + "Enter your email address": + "Εισάγετε τη διευθύνση του ηλεκτρονικού ταχυδρομείου σας", + "Please enter Your Email.": "Εισαγάγετε το Email σας.", + "Enter your phone number": + "Πληκτρολόγησε τον αριθμό του τηλεφώνου σου", + "Please enter your phone number.": + "Εισαγάγετε τον αριθμό τηλεφώνου σας.", + "Please enter Your Password.": "Παρακαλώ εισάγετε τον κωδικό σας.", + "Submit": "υποβάλλουν", + "if you dont have account": "αν δεν έχετε λογαριασμό", + "Register": "Κανω ΕΓΓΡΑΦΗ", + "Accept Ride's Terms & Review Privacy Notice": + "Αποδεχτείτε τους Όρους της Ride και τη σημείωση απορρήτου", + "By selecting 'I Agree' below, I have reviewed and agree to the Terms of Use and acknowledge the Privacy Notice. I am at least 18 years of age.": + "Επιλέγοντας «Συμφωνώ» παρακάτω, έχω διαβάσει και συμφωνώ με τους Όρους Χρήσης και αναγνωρίζω τη Σημείωση Απορρήτου. Είμαι τουλάχιστον 18 ετών.", + "I Agree": "Συμφωνώ", + "First name": "Ονομα", + "Enter your first name": "Εισάγετε το όνομα σας", + "Please enter your first name.": "Παρακαλώ εισάγετε το ονομα σας.", + "Last name": "Επίθετο", + "Enter your last name": "Εισαγάγετε το επώνυμό σας", + "Please enter your last name.": "Παρακαλώ εισάγετε το επώνυμό σας.", + "City": "Πόλη", + "Please enter your City.": "Παρακαλώ εισάγετε την πόλη σας.", + "Male": "Αρσενικός", + "Female": "Θηλυκός", + "Verify Email": "Επαλήθευση email", + "We sent 5 digit to your Email provided": + "Στείλαμε 5 ψηφία στο email που σας παρείχατε", + "5 digit": "5ψήφιο", + "Send Verification Code": "Αποστολή Κωδικού Επαλήθευσης", + "Your Ride Duration is": "Η διάρκεια της διαδρομής σας είναι", + "You will be thier in": "Θα είσαι εκεί μέσα", + "You trip distance is": "Η απόσταση ταξιδιού σας είναι", + "Fee is": "Η αμοιβή είναι", + "From :": "Από :", + "To :": "Προς την :", + "Add Promo": "Προσθήκη προσφοράς", + "Confirm Selection": "Επιβεβαίωση επιλογής", + "distance is": "απόσταση είναι", + "duration is": "διάρκεια είναι", + "I don't need a ride anymore": "Δεν χρειάζομαι πια βόλτα", + "I was just trying the application": "Μόλις δοκίμαζα την εφαρμογή", + "No driver accepted my request": + "Κανένας οδηγός δεν δέχτηκε το αίτημά μου", + "I added the wrong pick-up/drop-off location": + "Πρόσθεσα λάθος τοποθεσία παραλαβής/αποβίβασης", + "I don't have a reason": "Δεν έχω λόγο", + "Other": "Αλλα", + "Can we know why you want to cancel Ride ?": + "Μπορούμε να ξέρουμε γιατί θέλετε να ακυρώσετε το Ride;", + "Cancel Ride": "Ακύρωση διαδρομής", + "Add Payment Method": "Προσθήκη Τρόπου Πληρωμής", + "Your Wallet balance is": "Το υπόλοιπο του Πορτοφολιού σας είναι", + "Ride Wallet": "Πορτοφόλι ποδηλασίας", + "Payment Method": "Μέθοδος πληρωμής", + "Type here Place": "Πληκτρολογήστε εδώ Τόπος", + "Are You sure to ride to": "Είστε σίγουροι ότι θα οδηγήσετε", + "Confirm": "Επιβεβαιώνω", + "Back": "Πίσω", + "You are Delete": "Είστε το Delete", + "Deleted": "Διαγράφηκε", + "You Dont Have Any places yet !": "Δεν έχετε θέσεις ακόμα!", + "Favorite Places": "Αγαπημένα μέρη", + "From : Current Location": "Από: Τρέχουσα τοποθεσία", + "Where to": "Πού", + "Notifications": "Ειδοποιήσεις", + "Profile": "Προφίλ", + "Home": "Σπίτι", + "My Cared": "Μου νοιαζόταν", + "Add Card": "Προσθήκη κάρτας", + "Add Credit Card": "Προσθήκη πιστωτικής κάρτας", + "Please enter the cardholder name": + "Εισαγάγετε το όνομα του κατόχου της κάρτας", + "Please enter the expiry date": "Εισαγάγετε την ημερομηνία λήξης", + "Please enter the CVV code": "Εισαγάγετε τον κωδικό CVV", + "Go To Favorite Places": "Μεταβείτε στα αγαπημένα μέρη", + "Go to this Target": "Μεταβείτε σε αυτόν τον στόχο", + "My Profile": "Το ΠΡΟΦΙΛ μου", + "Sign Out": "Αποσύνδεση", + "Home Page": "Αρχική Σελίδα", + "Are you want to go to this site": + "Θέλετε να μεταβείτε σε αυτόν τον ιστότοπο", + "MyLocation": "Η τοποθεσία μου", + "my location": "Η τοποθεσία μου", + "Target": "Στόχος", + "Update": "Εκσυγχρονίζω", + "You Should choose rate figure": + "Θα πρέπει να επιλέξετε το ποσοστό ποσοστού", + "Login Captin": "Είσοδος Captin", + "Register Captin": "Εγγραφή Captin", + "Send Verfication Code": "Αποστολή κωδικού επαλήθευσης", + "KM": "KM", + "End Ride": "Τέλος Βόλτας", + "Minute": "Λεπτό", + "Go to passenger Location now": + "Μεταβείτε στην τοποθεσία επιβατών τώρα", + "Duration of the Ride is": "Η διάρκεια της διαδρομής είναι", + "Distance of the Ride is": "Η απόσταση της διαδρομής είναι", + "Name of the Passenger is": "Το όνομα του επιβάτη είναι", + "Hello this is Captain": "Γεια, αυτός είναι ο καπετάνιος", + "Start the Ride": "Ξεκινήστε τη Βόλτα", + "Please Wait If passenger want To Cancel!": + "Περιμένετε εάν ο επιβάτης θέλει να ακυρώσει!", + "Total Duration:": "Συνολική διάρκεια:", + "Active Duration:": "Ενεργή Διάρκεια:", + "Waiting for Captin ...": "Περιμένοντας τον Captin...", + "Age is": "Η ηλικία είναι", + "Rating is": "Η βαθμολογία είναι", + "to arrive you.": "για να σε φτάσω.", + "Order History": "Ιστορικό παραγγελιών", + "My Wallet": "Το πορτοφόλι μου", + "Tariff": "Δασμολόγιο", + "Settings": "Ρυθμίσεις", + "Feed Back": "Ανατροφοδότηση", + "Promos": "Προσφορές", + "Please enter a valid 16-digit card number": + "Εισαγάγετε έναν έγκυρο 16ψήφιο αριθμό κάρτας", + "Add Phone": "Προσθήκη τηλεφώνου", + "Please enter a phone number": "Εισαγάγετε έναν αριθμό τηλεφώνου", + "You dont Add Emergency Phone Yet!": + "Δεν προσθέτετε ακόμα τηλέφωνο έκτακτης ανάγκης!", + "You will arrive to your destination after": + "Θα φτάσετε στον προορισμό σας μετά", + "You can cancel Ride now": "Μπορείτε να ακυρώσετε το Ride τώρα", + "You Can cancel Ride After Captain did not come in the time": + "Μπορείτε να ακυρώσετε το Ride Αφού ο Captain δεν ήρθε στην ώρα του", + "If you in Car Now. Press Start The Ride": + "Εάν βρίσκεστε στο αυτοκίνητο τώρα. Πατήστε Start The Ride", + "You Dont Have Any amount in": "Δεν έχετε κανένα ποσό μέσα", + "Wallet!": "Πορτοφόλι!", + "You Have": "Εχεις", + "Save Credit Card": "Αποθήκευση πιστωτικής κάρτας", + "Show Promos": "Εμφάνιση προσφορών", + "10 and get 4% discount": "10 και κερδίστε έκπτωση 4%.", + "20 and get 6% discount": "20 και κερδίστε έκπτωση 6%.", + "40 and get 8% discount": "40 και κερδίστε έκπτωση 8%.", + "100 and get 11% discount": "100 και κερδίστε έκπτωση 11%.", + "Pay with Your PayPal": "Πληρώστε με το PayPal σας", + "You will choose one of above !": "Θα διαλέξεις ένα από τα παραπάνω!", + "Cancel": "Ματαίωση", + "Delete My Account": "Διάγραψε τον λογαριασμό μου", + "Edit Profile": "Επεξεργασία προφίλ", + "Name": "Ονομα", + "Update Gender": "Ενημέρωση φύλου", + "Education": "Εκπαίδευση", + "Update Education": "Ενημέρωση Εκπαίδευσης", + "Employment Type": "Είδος Απασχόλησης", + "SOS Phone": "Τηλέφωνο SOS", + "High School Diploma": "Απολυτήριο λυκείου", + "Associate Degree": "Πτυχίο Αναπληρωτή", + "Bachelor's Degree": "Πτυχίο", + "Master's Degree": "Πτυχίο μάστερ", + "Doctoral Degree": "Διδακτορικό Δίπλωμα", + "Promos For today": "Προσφορές για σήμερα", + "Copy this Promo to use it in your Ride!": + "Αντιγράψτε αυτό το Promo για να το χρησιμοποιήσετε στο Ride σας!", + "To change some Settings": "Για να αλλάξετε κάποιες Ρυθμίσεις", + "To change Language the App": + "Για να αλλάξετε τη γλώσσα της εφαρμογής", + "Order Request Page": "Σελίδα αιτήματος παραγγελίας", + "Rouats of Trip": "Διαδρομές ταξιδιού", + "Passenger Name is": "Το όνομα επιβάτη είναι", + "Total From Passenger is": "Total From Passenger είναι", + "Duration To Passenger is": "Διάρκεια Προς Επιβάτη είναι", + "Distance To Passenger is": "Η απόσταση από τον επιβάτη είναι", + "Total For You is": "Το Total For You είναι", + "Distance is": "Η απόσταση είναι", + "KM": "KM", + "Duration of Trip is": "Η διάρκεια του ταξιδιού είναι", + "Minutes": "Λεπτά", + "Apply Order": "Εφαρμογή παραγγελίας", + "Refuse Order": "Διαταγή άρνησης", + "Rate Captain": "Βαθμολογήστε τον καπετάνιο", + "Enter your Note": "Εισαγάγετε τη Σημείωση σας", + "Type something...": "Πληκτρολόγησε κάτι...", + "Submit rating": "Υποβολή βαθμολογίας", + "Rate Passenger": "Βαθμολογήστε τον επιβάτη", + "Ride Summary": "Περίληψη διαδρομής", + "welcome_message": "Welcome_message", + "app_description": "app_description", + "get_to_destination": "get_to_destination", + "get_a_ride": "πάνε μια βόλτα", + "safe_and_comfortable": "safe_and_comfortable", + "committed_to_safety": "δεσμευμένος_στην_ασφάλεια", + "Driver Applied the Ride for You": + "Ο οδηγός εφάρμοσε το Ride for You", + "Show latest promo": "Εμφάνιση της τελευταίας προσφοράς", + "Cancel Trip": "Ακύρωση ταξιδιού", + "Passenger Cancel Trip": "Ακύρωση ταξιδιού επιβάτη", + "Please stay on the picked point.": + "Παρακαλώ μείνετε στο επιλεγμένο σημείο.", + "Trip is Begin": "Το ταξίδι αρχίζει", + "Hi ,I will go now": "Γεια, θα πάω τώρα", + "Passenger come to you": "Ο επιβάτης έρχεται σε σας", + "Hi ,I Arrive your site": "Γεια, Έφτασα στον ιστότοπό σας", + "Driver Finish Trip": "Ολοκλήρωση ταξιδιού οδηγού", + "you will pay to Driver": "θα πληρώσετε στον Driver", + "Driver Cancel Your Trip": "Οδηγός ακυρώστε το ταξίδι σας", + "you will pay to Driver you will be pay the cost of driver time look to your SEFER Wallet": + "θα πληρώσετε στον Οδηγό θα πληρώσετε το κόστος του χρόνου εμφάνισης του οδηγού στο SEFER Wallet σας", + "I will go now": "θα πάω τώρα", + "You Have Tips": "Έχετε Συμβουλές", + "tips": "συμβουλές", + "Total is": "Σύνολο είναι", + "الْمَجْمُوع هُوَ": "الْمَجْمُوع هُوَ", + "No,I want": "ΟΧΙ θελω", + "Your fee is": "Η αμοιβή σας είναι", + "Do you want to pay Tips for this Driver": + "Θέλετε να πληρώσετε Συμβουλές για αυτό το πρόγραμμα οδήγησης", + "Tip is": "Συμβουλή είναι", + "Tip is": "Συμβουλή είναι", + "Camera Access Denied.": "Δεν επιτρέπεται η πρόσβαση στην κάμερα.", + "Open Settings": "Ανοίξτε τις Ρυθμίσεις", + "GPS Required Allow !.": "Απαιτείται GPS Να επιτρέπεται !.", + "Your Account is Deleted": "Ο λογαριασμός σας έχει διαγραφεί", + "Are you sure to delete your account?": + "Είστε βέβαιοι ότι θα διαγράψετε τον λογαριασμό σας;", + "Your data will be erased after 2 weeks": + "Τα δεδομένα σας θα διαγραφούν μετά από 2 εβδομάδες", + "And you will can't return to use app after 1 month": + "Και δεν θα μπορείτε να επιστρέψετε στη χρήση της εφαρμογής μετά από 1 μήνα", + "وَلَن تَسْتَطِيع اسْتِخْدَام التَّطْبِيق مَرَّة أُخْرَى بَعْد شَهْر": + "وَلَن تَسْتَطِيع اسْتِخْدَام التَّطْبِيق مَرَّة أُخْرَى بَعْد شَهْر", + "Enter Your First Name": "Εισάγετε το όνομα σας", + "Are you Sure to LogOut?": "Είστε σίγουροι ότι θα αποσυνδεθείτε;", + "Email Wrong": "Λάθος email", + "Email you inserted is Wrong.": + "Το email που εισαγάγατε είναι λάθος.", + "You have finished all times": "Έχετε τελειώσει όλες τις φορές", + "if you want help you can email us here": + "αν θέλετε βοήθεια μπορείτε να μας στείλετε email εδώ", + "Thanks": "Ευχαριστώ", + "Email Us": "Στείλτε μας email", + "I cant register in your app in face detection": + "Δεν μπορώ να εγγραφώ στην εφαρμογή σας στην ανίχνευση προσώπου", + "Hi": "γεια", + "No face detected": "Δεν εντοπίστηκε πρόσωπο", + "Image detecting result is": "Το αποτέλεσμα ανίχνευσης εικόνας είναι", + "from 3 times Take Attention": "από 3 φορές Προσοχή", + "Be sure for take accurate images please": + "Βεβαιωθείτε ότι έχετε τραβήξει ακριβείς εικόνες", + "You have": "Εχεις", + "لَدَيْك": "لَدَيْك", + "image verified": "εικόνα επαληθεύτηκε", + "Next": "Επόμενο", + "There is no help Question here": "Δεν υπάρχει ερώτηση βοήθειας εδώ", + "Call End": "Τερματισμός κλήσης", + "You dont have Points": "Δεν έχετε πόντους", + "You Are Stopped For this Day !": + "Είστε σταματημένοι για αυτήν την ημέρα!", + "You must be charge your Account": + "Πρέπει να χρεώσετε τον Λογαριασμό σας", + "You Refused 3 Rides this Day that is the reason": + "Αυτός είναι ο λόγος που αρνηθήκατε 3 βόλτες αυτή τη μέρα", + "See you Tomorrow!": "Τα λέμε αύριο!", + "لِقَائِنَا غَدًا!": "لِقَائِنَا غَدًا!", + "Recharge my Account": "Επαναφόρτιση του λογαριασμού μου", + "Ok , See you Tomorrow": "Εντάξει τα λέμε αύριο", + "You are Stopped": "Είστε Σταματημένοι", + "Connected": "Συνδεδεμένος", + "Not Connected": "Μη συνδεδεμένο", + "Your are far from passenger location": + "Βρίσκεστε μακριά από την τοποθεσία του επιβάτη", + "go to your passenger location before": + "μεταβείτε στην τοποθεσία του επιβάτη σας πριν", + "Passenger cancel trip": "Ακύρωση ταξιδιού επιβάτη", + "يُلْغِي الرَّاكِب الرِّحْلَة": "يُلْغِي الرَّاكِب الرِّحْلَة", + "You will get cost of your work for this trip": + "Θα λάβετε το κόστος της εργασίας σας για αυτό το ταξίδι", + "in your wallet": "στο πορτοφόλι σου", + "you gain": "κερδίζεις", + "Order Cancelled": "Η παραγγελία ακυρώθηκε", + "Order Cancelled by Passenger": "Η παραγγελία ακυρώθηκε από επιβάτη", + "Success": "Επιτυχία", + "Feedback data saved successfully": + "Τα δεδομένα σχολίων αποθηκεύτηκαν με επιτυχία", + "No Promo for today .": "Δεν υπάρχει προσφορά για σήμερα.", + "Select your destination": "Επιλέξτε τον προορισμό σας", + "Search for your Start point": "Αναζητήστε το σημείο εκκίνησης", + "Search for waypoint": "Αναζήτηση για σημείο αναφοράς", + "Current Location": "Τωρινή τοποθεσία", + "Add Location 1": "Προσθήκη τοποθεσίας 1", + "You must Verify email !.": "Πρέπει να επαληθεύσετε το email !.", + "Cropper": "Θεριστής", + "Saved Sucssefully": "Αποθηκεύτηκε με επιτυχία", + "Select Date": "Επιλέξτε Ημερομηνία", + "Birth Date": "Ημερομηνία γέννησης", + "Ok": "Εντάξει", + "the 500 points equal 30 JOD": "οι 500 βαθμοί ισούνται με 30 JOD", + "the 500 points equal 30 JOD for you": + "οι 500 βαθμοί ισούνται με 30 JOD για εσάς", + "So go and gain your money": + "Πηγαίνετε λοιπόν και κερδίστε τα χρήματά σας", + "فَاسْتَحِقَّ فُلُوسَك وَاكْسِب النِّقَاط": + "فَاسْتَحِقَّ فُلُوسَك وَاكْسِب النِّقَاط", + "token updated": "το διακριτικό ενημερώθηκε", + "Add Location 2": "Προσθήκη τοποθεσίας 2", + "Add Location 3": "Προσθήκη τοποθεσίας 3", + "Add Location 4": "Προσθήκη τοποθεσίας 4", + "Waiting for your location": "Αναμονή για την τοποθεσία σας", + "Search for your destination": "Αναζητήστε τον προορισμό σας", + "Hi! This is": "Γεια! Αυτό είναι", + "I am using": "χρησιμοποιώ", + "to ride with": "να καβαλήσει με", + "as the driver.": "ως οδηγός.", + "is driving a": "οδηγεί α", + "with license plate": "με πινακίδα κυκλοφορίας", + "I am currently located at": "Αυτή τη στιγμή βρίσκομαι στο", + "Please go to Car now": "Παρακαλώ πηγαίνετε στο αυτοκίνητο τώρα", + "If you need to reach me, please contact the driver directly at": + "Εάν θέλετε να επικοινωνήσετε μαζί μου, επικοινωνήστε απευθείας με τον οδηγό στο", + "No Car or Driver Found in your area.": + "Δεν βρέθηκε αυτοκίνητο ή οδηγός στην περιοχή σας.", + "Please Try anther time": "Δοκιμάστε άλλη φορά", + "There no Driver Aplly your order sorry for that": + "Δεν υπάρχει Driver Apply την παραγγελία σας, συγγνώμη για αυτό", + "Trip Cancelled": "Το ταξίδι ακυρώθηκε", + "The Driver Will be in your location soon .": + "Ο οδηγός θα βρίσκεται σύντομα στην τοποθεσία σας.", + "The distance less than 500 meter.": + "Η απόσταση μικρότερη από 500 μέτρα.", + "Promo End !": "Τέλος προσφοράς!", + "There is no notification yet": "Δεν υπάρχει ακόμη ειδοποίηση", + "Use Touch ID or Face ID to confirm payment": + "Χρησιμοποιήστε το Touch ID ή το Face ID για να επιβεβαιώσετε την πληρωμή", + "Contact us for any questions on your order.": + "Επικοινωνήστε μαζί μας για οποιαδήποτε απορία σχετικά με την παραγγελία σας.", + "Pyament Cancelled .": "Η πληρωμή ακυρώθηκε.", + "type here": "πληκτρολογίστε εδώ", + "Scan Driver License": "Άδεια οδήγησης σάρωσης", + "Please put your licence in these border": + "Βάλτε την άδειά σας σε αυτά τα σύνορα", + "Camera not initialized yet": "Η κάμερα δεν έχει αρχικοποιηθεί ακόμα", + "Take Image": "Λήψη εικόνας", + "AI Page": "Σελίδα AI", + "Take Picture Of ID Card": "Βγάλε φωτογραφία της ταυτότητας", + "Take Picture Of Driver License Card": + "Τραβήξτε φωτογραφία της κάρτας άδειας οδήγησης", + "We are process picture please wait": + "Είμαστε εικόνα διαδικασίας, περιμένετε", + "There is no data yet.": "Δεν υπάρχουν ακόμη στοιχεία.", + "Name :": "Ονομα :", + "Drivers License Class:": "Κατηγορία άδειας οδήγησης:", + "Document Number:": "Αριθμός Εγγράφου:", + "Address:": "Διεύθυνση:", + "Height:": "Υψος:", + "Expiry Date:": "Ημερομηνία λήξης:", + "Date of Birth:": "Ημερομηνια γεννησης:", + "You can\"t continue with us .": + "Δεν μπορείτε να συνεχίσετε μαζί μας.", + "You should renew Driver license": + "Θα πρέπει να ανανεώσετε την άδεια οδήγησης", + "Detect Your Face": "Εντοπίστε το πρόσωπό σας", + "Go to next step": "Μεταβείτε στο επόμενο βήμα", + "scan Car License.": "σάρωση άδειας αυτοκινήτου.", + "aاسْتِخْرَاج رُخْصَة السَّيَّارَة.": + "aاسْتِخْرَاج رُخْصَة السَّيَّارَة.", + "Name in arabic": "Όνομα στα αραβικά", + "Drivers License Class": "Κατηγορία άδειας οδήγησης", + "Date of Birth": "Ημερομηνια γεννησης", + "Age": "Ηλικία", + "Lets check Car license": "Ας ελέγξουμε την άδεια αυτοκινήτου", + "Car Kind": "Είδος αυτοκινήτου", + "Car Plate": "Πινακίδα αυτοκινήτου", + "Lets check License Back Face": "Ας ελέγξουμε την Άδεια Πίσω Πρόσωπο", + "Car License Card": "Κάρτα άδειας αυτοκινήτου", + "No image selected yet": "Δεν έχει επιλεγεί ακόμη εικόνα", + "Made :": "Εκανε :", + "model :": "μοντέλο:", + "VIN :": "VIN:", + "year :": "έτος:", + "ُExpire Date": "ημερομηνία λήξης", + "Login Driver": "Πρόγραμμα οδήγησης σύνδεσης", + "Password must br at least 6 character.": + "Ο κωδικός πρόσβασης πρέπει να αποτελείται από τουλάχιστον 6 χαρακτήρες.", + "if you don\"t have account": "αν δεν έχετε λογαριασμό", + "Here recorded trips audio": "Εδώ καταγράφονται τα ταξίδια ήχος", + "Register as Driver": "Εγγραφείτε ως οδηγός", + "Privacy Notice": "Σημείωση απορρήτου", + "By selecting 'I Agree' below, I have reviewed and agree to the Terms of Use and acknowledge the": + "Επιλέγοντας «Συμφωνώ» παρακάτω, έχω διαβάσει και συμφωνώ με τους Όρους Χρήσης και αναγνωρίζω την", + ". I am at least 18 years of age.": ". Είμαι τουλάχιστον 18 ετών.", + "Log Out Page": "Σελίδα αποσύνδεσης", + "Log Off": "Αποσύνδεση", + "Register Driver": "Εγγραφή προγράμματος οδήγησης", + "Verify Email For Driver": "Επαλήθευση email για πρόγραμμα οδήγησης", + "Admin DashBoard": "Πίνακας ελέγχου διαχειριστή", + "Your name": "Το όνομα σου", + "your ride is applied": "εφαρμόζεται η βόλτα σας", + "Your password": "Ο κωδικός σας", + "H and": "Χέρι", + "LE": "LE", + "JOD": "JOD", + "m": "Μ", + "We search nearst Driver to you": + "Αναζητούμε το πλησιέστερο πρόγραμμα οδήγησης σε εσάς", + "please wait till driver accept your order": + "παρακαλώ περιμένετε έως ότου ο οδηγός αποδεχτεί την παραγγελία σας", + "No accepted orders? Try raising your trip fee to attract riders.": + "Δεν γίνονται δεκτές παραγγελίες; Προσπαθήστε να αυξήσετε τα τέλη ταξιδιού σας για να προσελκύσετε αναβάτες.", + "You should select one": "Θα πρέπει να επιλέξετε ένα", + "The driver accept your order for": + "Ο οδηγός δέχεται την παραγγελία σας για", + "Increase Fee": "Αύξηση Τέλους", + "No, thanks": "Οχι ευχαριστώ", + "The driver on your way": "Ο οδηγός στο δρόμο σας", + "Total price from": "Συνολική τιμή από", + "Order Details Speed": "Στοιχεία παραγγελίας Ταχύτητα", + "Order Applied": "Η παραγγελία εφαρμόστηκε", + "accepted your order": "αποδέχτηκε την παραγγελία σας", + "We regret to inform you that another driver has accepted this order.": + "Με λύπη σας ενημερώνουμε ότι άλλος οδηγός έχει αποδεχτεί αυτήν την παραγγελία.", + "Selected file:": "Επιλεγμένο αρχείο:", + "Your trip cost is": "Το κόστος του ταξιδιού σας είναι", + "this will delete all files from your device": + "Αυτό θα διαγράψει όλα τα αρχεία από τη συσκευή σας", + "you have a negative balance of": "έχετε αρνητικό ισοζύγιο", + "in your": "στο δικό σου", + "Exclusive offers and discounts always with the Sefer app": + "Αποκλειστικές προσφορές και εκπτώσεις πάντα με την εφαρμογή Sefer", + "Please go to Car Driver": + "Παρακαλώ πηγαίνετε στον οδηγό αυτοκινήτου", + "wallet due to a previous trip.": + "πορτοφόλι λόγω προηγούμενου ταξιδιού.", + "Submit Question": "Υποβολή Ερώτησης", + "Please enter your Question.": "Παρακαλώ εισάγετε την ερώτησή σας.", + "Help Details": "Λεπτομέρειες βοήθειας", + "No trip yet found": "Δεν βρέθηκε ακόμη ταξίδι", + "No Response yet.": "Καμία απάντηση ακόμα.", + "You Earn today is": "Κερδίζετε σήμερα είναι", + "You Have in": "Έχετε μέσα", + "Total points is": "Σύνολο πόντων είναι", + "Total Connection Duration:": "Συνολική διάρκεια σύνδεσης:", + "H and": "Χέρι", + "Passenger name :": "Όνομα επιβάτη:", + "Cost Of Trip IS": "Κόστος Ταξιδίου ΕΙΝΑΙ", + "Arrival time": "Ωρα άφιξης", + "arrival time to reach your point": + "ώρα άφιξης για να φτάσετε στο σημείο σας", + "For Speed and Delivery trips, the price is calculated dynamically. For Comfort trips, the price is based on time and distance": + "Για ταξίδια Ταχύτητας και Παράδοσης, η τιμή υπολογίζεται δυναμικά. Για Comfort ταξίδια, η τιμή βασίζεται σε χρόνο και απόσταση", + "Hello this is Driver": "Γεια σας, αυτός είναι ο οδηγός", + "Is the Passenger in your Car ?": + "Είναι ο επιβάτης στο αυτοκίνητό σας;", + "Please wait for the passenger to enter the car before starting the trip.": + "Περιμένετε να μπει ο επιβάτης στο αυτοκίνητο πριν ξεκινήσετε το ταξίδι.", + "No ,still Waiting.": "Όχι, ακόμα σε αναμονή.", + "I arrive you": "σε φτάνω", + "I Arrive your site": "Φτάνω στον ιστότοπό σας", + "You are not in near to passenger location": + "Δεν βρίσκεστε κοντά στην τοποθεσία του επιβάτη", + "please go to picker location exactly": + "μεταβείτε ακριβώς στην τοποθεσία επιλογέα", + "You Can Cancel Trip And get Cost of Trip From": + "Μπορείτε να ακυρώσετε το ταξίδι και να λάβετε το κόστος του ταξιδιού από", + "Are you sure to cancel?": "Είστε σίγουροι ότι θα ακυρώσετε;", + "Yes": "Ναί", + "Insert Emergincy Number": "Εισαγάγετε τον αριθμό έκτακτης ανάγκης", + "Best choice for comfort car and flexible route and stops point": + "Η καλύτερη επιλογή για αυτοκίνητο άνεσης και ευέλικτη διαδρομή και σημείο στάσεων", + "Insert": "Εισάγετε", + "This is for delivery or a motorcycle.": + "Αυτό είναι για παράδοση ή μοτοσυκλέτα.", + "This trip goes directly from your starting point to your destination for a fixed price. The driver must follow the planned route": + "Αυτό το ταξίδι πηγαίνει απευθείας από το σημείο εκκίνησης στον προορισμό σας για μια σταθερή τιμή. Ο οδηγός πρέπει να ακολουθήσει την προγραμματισμένη διαδρομή", + "You can decline a request without any cost": + "Μπορείτε να απορρίψετε ένα αίτημα χωρίς κανένα κόστος", + "Perfect for adventure seekers who want to experience something new and exciting": + "Ιδανικό για όσους αναζητούν την περιπέτεια που θέλουν να ζήσουν κάτι νέο και συναρπαστικό", + "My current location is:": "Η τρέχουσα τοποθεσία μου είναι:", + "and I have a trip on": "και έχω ένα ταξίδι", + "App with Passenger": "Εφαρμογή με επιβάτη", + "مع الراكب": "مع الراكب", + "You will be pay the cost to driver or we will get it from you on next trip": + "Θα πληρώσετε το κόστος στον οδηγό ή θα το λάβουμε από εσάς στο επόμενο ταξίδι", + "Trip has Steps": "Το ταξίδι έχει Βήματα", + "Distance from Passenger to destination is": + "Η απόσταση από τον επιβάτη στον προορισμό είναι", + "price is": "τιμή είναι", + "This ride type does not allow changes to the destination or additional stops": + "Αυτός ο τύπος διαδρομής δεν επιτρέπει αλλαγές στον προορισμό ή πρόσθετες στάσεις", + "This price may be changed": "Αυτή η τιμή μπορεί να αλλάξει", + "No SIM card, no problem! Call your driver directly through our app. We use advanced technology to ensure your privacy.": + "Χωρίς κάρτα SIM, κανένα πρόβλημα! Καλέστε τον οδηγό σας απευθείας μέσω της εφαρμογής μας. Χρησιμοποιούμε προηγμένη τεχνολογία για να διασφαλίσουμε το απόρρητό σας.", + "This ride type allows changes, but the price may increase": + "Αυτός ο τύπος διαδρομής επιτρέπει αλλαγές, αλλά η τιμή μπορεί να αυξηθεί", + "message From passenger": "μήνυμα από επιβάτη", + "Select one message": "Επιλέξτε ένα μήνυμα", + "My location is correct. You can search for me using the navigation app": + "Η τοποθεσία μου είναι σωστή. Μπορείτε να με αναζητήσετε χρησιμοποιώντας την εφαρμογή πλοήγησης", + "I'm waiting for you": "σε περιμένω", + "Hello, I'm at the agreed-upon location": + "Γεια σας, βρίσκομαι στην συμφωνημένη τοποθεσία", + "We noticed the speed is exceeding 100 km/h. Please slow down for your safety. If you feel unsafe, you can share your trip details with a contact or call the police using the red SOS button.": + "Παρατηρήσαμε ότι η ταχύτητα ξεπερνά τα 100 km/h. Παρακαλώ επιβραδύνετε για την ασφάλειά σας. Εάν αισθάνεστε ανασφαλείς, μπορείτε να μοιραστείτε τα στοιχεία του ταξιδιού σας με μια επαφή ή να καλέσετε την αστυνομία χρησιμοποιώντας το κόκκινο κουμπί SOS.", + "Warning: Speeding detected!": "Προειδοποίηση: Εντοπίστηκε ταχύτητα!", + "Please help! Contact me as soon as possible.": + "Παρακαλώ βοηθήστε! Επικοινωνήστε μαζί μου το συντομότερο δυνατό.", + "Share Trip Details": "Κοινή χρήση λεπτομερειών ταξιδιού", + "Car Plate is": "Πινακίδα αυτοκινήτου είναι", + "the 300 points equal 300 L.E for you": + "οι 300 βαθμοί ισοδυναμούν με 300 L.E για εσάς", + "So go and gain your money": + "Πηγαίνετε λοιπόν και κερδίστε τα χρήματά σας", + "the 300 points equal 300 L.E": "τα 300 μόρια ισούνται με 300 Λ.Ε", + "The payment was not approved. Please try again.": + "Η πληρωμή δεν εγκρίθηκε. ΠΑΡΑΚΑΛΩ προσπαθησε ξανα.", + "Payment Failed": "Η πληρωμή απέτυχε", + "Error": "Λάθος", + "An error occurred during the payment process.": + "Παρουσιάστηκε σφάλμα κατά τη διαδικασία πληρωμής.", + "The payment was approved.": "Η πληρωμή εγκρίθηκε.", + "Payment Successful": "Επιτυχής Πληρωμή", + "No ride found yet": "Δεν βρέθηκε ακόμη διαδρομή", + "Accept Order": "Αποδοχή παραγγελίας", + "reject your order.": "απορρίψτε την παραγγελία σας.", + "Bottom Bar Example": "Παράδειγμα κάτω γραμμής", + "Driver phone": "Τηλέφωνο προγράμματος οδήγησης", + "Statistics": "Στατιστική", + "Origin": "Προέλευση", + "Destination": "Προορισμός", + "Driver Name": "Όνομα οδηγού", + "Driver Car Plate": "Πινακίδα αυτοκινήτου οδηγού", + "Available for rides": "Διαθέσιμο για βόλτες", + "Scan Id": "Αναγνωριστικό σάρωσης", + "Camera not initilaized yet": "Η κάμερα δεν έχει ενεργοποιηθεί ακόμα", + "Scan ID MklGoogle": "Σάρωση αναγνωριστικού MklGoogle", + "Language": "Γλώσσα", + "Jordan": "Ιορδανία", + "USA": "ΗΠΑ", + "Egypt": "Αίγυπτος", + "Turkey": "Τουρκία", + "Saudi Arabia": "Σαουδική Αραβία", + "Qatar": "Κατάρ", + "Bahrain": "Μπαχρέιν", + "Kuwait": "Κουβέιτ", + "But you have a negative salary of": "Αλλά έχετε αρνητικό μισθό", + "Promo Code": "Κωδικός προσφοράς", + "Your trip distance is": "Η απόσταση του ταξιδιού σας είναι", + "Enter promo code": "Εισαγάγετε τον κωδικό προσφοράς", + "You have promo!": "Έχετε promo!", + "Cost Duration": "Διάρκεια κόστους", + "Duration is": "Διάρκεια είναι", + "Leave": "Αδεια", + "Join": "Συμμετοχή", + "You Should be select reason.": "Θα πρέπει να επιλέξετε τον λόγο.", + "\$": "\$", + "Waiting for Driver ...": "Αναμονή για τον οδηγό...", + "Latest Recent Trip": "Τελευταίο πρόσφατο ταξίδι", + "from your list": "από τη λίστα σας", + "Do you want to change Work location": + "Θέλετε να αλλάξετε την τοποθεσία εργασίας", + "Do you want to change Home location": + "Θέλετε να αλλάξετε την τοποθεσία του σπιτιού", + "We Are Sorry That we dont have cars in your Location!": + "Λυπούμαστε που δεν έχουμε αυτοκίνητα στην τοποθεσία σας!", + "Choose from Map": "Επιλέξτε από τον χάρτη", + "Pick your ride location on the map - Tap to confirm": + "Επιλέξτε την τοποθεσία της διαδρομής σας στο χάρτη - Πατήστε για επιβεβαίωση", + "To Work": "Για να δουλέψω", + "Are you want to go this site": + "Θέλετε να πάτε σε αυτόν τον ιστότοπο", + "Closest & Cheapest": "Πλησιέστερο & φθηνότερο", + "Work Saved": "Η εργασία αποθηκεύτηκε", + "Sefer is the ride-hailing app that is safe, reliable, and accessible.": + "Το Sefer είναι η εφαρμογή μεταφοράς που είναι ασφαλής, αξιόπιστη και προσβάσιμη.", + "With Sefer, you can get a ride to your destination in minutes.": + "Με το Sefer, μπορείτε να φτάσετε στον προορισμό σας μέσα σε λίγα λεπτά.", + "Sefer is committed to safety, and all of our captains are carefully screened and background checked.": + "Ο Sefer έχει δεσμευτεί για την ασφάλεια και όλοι οι καπετάνιοι μας ελέγχονται προσεκτικά και ελέγχονται το ιστορικό.", + "To Home": "Στο σπίτι", + "Home Saved": "Αρχική σελίδα αποθηκεύτηκε", + "Destination selected": "Επιλέχθηκε ο προορισμός", + "Now select start pick": "Τώρα επιλέξτε έναρξη επιλογής", + "Pick from map": "Επιλογή από τον χάρτη", + "Click here point": "Κάντε κλικ εδώ στο σημείο", + "No Car in your site. Sorry!": + "Δεν υπάρχει αυτοκίνητο στον ιστότοπό σας. Συγνώμη!", + "Nearest Car for you about": "Πλησιέστερο αυτοκίνητο για εσάς", + "N/A": "N/A", + "From :": "Από :", + "Get Details of Trip": "Λάβετε λεπτομέρειες για το ταξίδι", + "If you want add stop click here": + "Αν θέλετε να προσθέσετε στάση κάντε κλικ εδώ", + "Driver": "Οδηγός", + "Where you want go": "Εκεί που θέλεις να πας", + "My Card": "Η κάρτα μου", + "Start Record": "Έναρξη εγγραφής", + "Wallet": "Πορτοφόλι", + "History of Trip": "Ιστορία του ταξιδιού", + "Helping Center": "Κέντρο Βοήθειας", + "Record saved": "Η εγγραφή αποθηκεύτηκε", + "Trips recorded": "Ταξίδια καταγράφηκαν", + "Select Your Country": "Επιλέξτε τη χώρα σας", + "To ensure you receive the most accurate information for your location, please select your country below. This will help tailor the app experience and content to your country.": + "Για να διασφαλίσετε ότι λαμβάνετε τις πιο ακριβείς πληροφορίες για την τοποθεσία σας, επιλέξτε τη χώρα σας παρακάτω. Αυτό θα σας βοηθήσει να προσαρμόσετε την εμπειρία και το περιεχόμενο της εφαρμογής στη χώρα σας.", + "Are you sure to delete recorded files": + "Είστε βέβαιοι ότι θα διαγράψετε εγγεγραμμένα αρχεία", + "Select recorded trip": "Επιλέξτε ηχογραφημένο ταξίδι", + "Card Number": "Αριθμός κάρτας", + "Hi, Where to": "Γεια, πού να", + "Pick your destination from Map": + "Επιλέξτε τον προορισμό σας από τον Χάρτη", + "Add Stops": "Προσθήκη στάσεων", + "Get Direction": "Λήψη κατεύθυνσης", + "Add Location": "Προσθήκη τοποθεσίας", + "Switch Rider": "Switch Rider", + "You will arrive to your destination after timer end.": + "Θα φτάσετε στον προορισμό σας μετά το τέλος του χρονοδιακόπτη.", + "You can cancel trip": "Μπορείτε να ακυρώσετε το ταξίδι", + "The driver waitting you in picked location .": + "Ο οδηγός σας περιμένει στην επιλεγμένη τοποθεσία.", + "Pay with Your": "Πληρώστε με το δικό σας", + "Pay with Credit Card": "Πληρώστε με πιστωτική κάρτα", + "Payment History": "Ιστορικό πληρωμών", + "Show Promos to Charge": "Εμφάνιση προσφορών προς χρέωση", + "Point": "Σημείο", + "Driver Wallet": "Πορτοφόλι προγράμματος οδήγησης", + "Total Points is": "Συνολικοί Πόντοι είναι", + "Total Budget from trips is": + "Ο συνολικός προϋπολογισμός από τα ταξίδια είναι", + "Total Amount:": "Συνολικό ποσό:", + "Total Budget from trips by": + "Συνολικός προϋπολογισμός από ταξίδια έως", + "Credit card is": "Η πιστωτική κάρτα είναι", + "بطاقة الائتمان هي": "بطاقة الائتمان هي", + "This amount for all trip I get from Passengers": + "Αυτό το ποσό για όλα τα ταξίδια παίρνω από τους επιβάτες", + "Pay from my budget": "Πληρώνω από τον προϋπολογισμό μου", + "This amount for all trip I get from Passengers and Collected For me in": + "Αυτό το ποσό για όλα τα ταξίδια παίρνω από τους επιβάτες και συλλέγεται για μένα", + "You can buy points from your budget": + "Μπορείτε να αγοράσετε πόντους από τον προϋπολογισμό σας", + "insert amount": "εισαγάγετε ποσό", + "You can buy Points to let you online": + "Μπορείτε να αγοράσετε πόντους για να σας επιτρέψουν στο διαδίκτυο", + "by this list below": "από αυτή τη λίστα παρακάτω", + "من خلال القائمة أدناه": "من خلال القائمة أدناه", + "Create Wallet to receive your money": + "Δημιουργήστε Πορτοφόλι για να λάβετε τα χρήματά σας", + "Enter your feedback here": "Εισαγάγετε τα σχόλιά σας εδώ", + "Please enter your feedback.": "Εισαγάγετε τα σχόλιά σας.", + "Feedback": "Ανατροφοδότηση", + "Submit": "υποβάλλουν", + "Click here to Show it in Map": + "Κάντε κλικ εδώ για να το εμφανίσετε στον χάρτη", + "Canceled": "Ακυρώθηκε", + "Type your Email": "Πληκτρολογήστε το email σας", + "No I want": "ΟΧΙ θελω", + "Email is": "Το email είναι", + "Phone Number is": "Ο αριθμός τηλεφώνου είναι", + "Date of Birth is": "Ημερομηνία γέννησης είναι", + "Sex is": "Το σεξ είναι", + "Car Details": "Στοιχεία αυτοκινήτου", + "VIN is": "VIN είναι", + "Color is": "Το χρώμα είναι", + "Make is": "Κάνετε είναι", + "Model is": "Μοντέλο είναι", + "Year is": "Έτος είναι", + "Expiration Date": "Ημερομηνία λήξης", + "Edit Your data": "Επεξεργαστείτε τα δεδομένα σας", + "write vin for your car": "γράψε vin για το αυτοκίνητό σου", + "VIN": "VIN", + "write Color for your car": "γράψτε Χρώμα για το αυτοκίνητό σας", + "write Make for your car": "γράψτε Φτιάξτε για το αυτοκίνητό σας", + "write Model for your car": "γράψτε Μοντέλο για το αυτοκίνητό σας", + "write Year for your car": "γράψτε το έτος για το αυτοκίνητό σας", + "write Expiration Date for your car": + "γράψτε Ημερομηνία Λήξης για το αυτοκίνητό σας", + "Tariffs": "τιμολόγια", + "Minimum fare": "Ελάχιστος ναύλος", + "Maximum fare": "Μέγιστος ναύλος", + "Flag-down fee": "Χρέωση σημαίας", + "Including Tax": "Συμπεριλαμβανομένου του φόρου", + "BookingFee": "Τέλος κράτησης", + "Morning": "Πρωί", + "from 07:30 till 10:30 (Thursday, Friday, Saturday, Monday)": + "από τις 07:30 έως τις 10:30 (Πέμπτη, Παρασκευή, Σάββατο, Δευτέρα)", + "Evening": "Απόγευμα", + "from 12:00 till 15:00 (Thursday, Friday, Saturday, Monday)": + "από τις 12:00 έως τις 15:00 (Πέμπτη, Παρασκευή, Σάββατο, Δευτέρα)", + "Night": "Νύχτα", + "You have in account": "Έχετε υπόψη σας", + "Select Country": "Επιλέξτε Χώρα", + "Ride Today :": "Βόλτα σήμερα:", + "After this period": "Μετά από αυτό το διάστημα", + "You can\"t cancel!": "Δεν μπορείτε να ακυρώσετε!", + "لا تستطيع الغاء الرحله": "لا تستطيع الغاء الرحله", + "from 23:59 till 05:30": "από τις 23:59 έως τις 05:30", + "Rate Driver": "Rate Driver", + "Total Cost is": "Το συνολικό κόστος είναι", + "Write note": "Γράψε σημείωση", + "Time to arrive": "Ώρα να φτάσετε", + "Ride Summaries": "Περιλήψεις διαδρομής", + "Total Cost": "Συνολικό κόστος", + "Average of Hours of": "Μέσος όρος ωρών του", + "is ON for this month": "είναι ΕΝΕΡΓΟ για αυτόν τον μήνα", + "Days": "Ημέρες", + "Total Hours on month": "Σύνολο ωρών ανά μήνα", + "Counts of Hours on days": "Μετρήσεις ωρών σε ημέρες", + "OrderId": "Αριθμός Παραγγελίας", + "created time": "δημιούργησε χρόνο", + "Speed Over": "Speed ​​Over", + "I will slow down": "θα επιβραδύνω", + "Map Passenger": "Επιβάτης χάρτη", + "Be Slowly": "Να είσαι αργά", + "If you want to make Google Map App run directly when you apply order": + "Εάν θέλετε να κάνετε την εφαρμογή Google Map να εκτελείται απευθείας κατά την υποβολή της παραγγελίας", + "You can change the language of the app": + "Μπορείτε να αλλάξετε τη γλώσσα της εφαρμογής", + "Your Budget less than needed": + "Ο προϋπολογισμός σας είναι μικρότερος από όσο χρειάζεται", + "You can change the Country to get all features": + "Μπορείτε να αλλάξετε τη χώρα για να λάβετε όλες τις λειτουργίες", + "Change Country": "Αλλαξε χώρα" + }, + "ur": { + "Sign In by Apple": "ایپل کے ذریعے سائن ان کریں۔", + "Sign In by Google": "گوگل کے ذریعے سائن ان کریں۔", + "How do I request a ride?": "میں سواری کی درخواست کیسے کروں؟", + "Step-by-step instructions on how to request a ride through the Sefer app.": + "سیفر ایپ کے ذریعے سواری کی درخواست کرنے کے طریقہ سے متعلق مرحلہ وار ہدایات۔", + "What types of vehicles are available?": + "کس قسم کی گاڑیاں دستیاب ہیں؟", + "Sefer offers a variety of vehicle options to suit your needs, including economy, comfort, and luxury. Choose the option that best fits your budget and passenger count.": + "سیفر آپ کی ضروریات کو پورا کرنے کے لیے گاڑیوں کے متعدد اختیارات پیش کرتا ہے، بشمول معیشت، سکون اور عیش و آرام۔ وہ اختیار منتخب کریں جو آپ کے بجٹ اور مسافروں کی تعداد کے مطابق ہو۔", + "How can I pay for my ride?": + "میں اپنی سواری کی ادائیگی کیسے کر سکتا ہوں؟", + "Sefer offers multiple payment methods for your convenience. Choose between cash payment or credit/debit card payment during ride confirmation.": + "سیفر آپ کی سہولت کے لیے ادائیگی کے متعدد طریقے پیش کرتا ہے۔ سواری کی تصدیق کے دوران نقد ادائیگی یا کریڈٹ/ڈیبٹ کارڈ کی ادائیگی کے درمیان انتخاب کریں۔", + "Can I cancel my ride?": "کیا میں اپنی سواری منسوخ کر سکتا ہوں؟", + "Yes, you can cancel your ride under certain conditions (e.g., before driver is assigned). See the Sefer cancellation policy for details.": + "ہاں، آپ اپنی سواری کو کچھ شرائط کے تحت منسوخ کر سکتے ہیں (جیسے، ڈرائیور کو تفویض کرنے سے پہلے)۔ تفصیلات کے لیے سیفر کینسلیشن پالیسی دیکھیں۔", + "Driver Registration & Requirements": "ڈرائیور کی رجسٹریشن اور تقاضے", + "How can I register as a driver?": + "میں ڈرائیور کے طور پر کیسے رجسٹر ہو سکتا ہوں؟", + "What are the requirements to become a driver?": + "ڈرائیور بننے کے لیے کیا تقاضے ہیں؟", + "Visit our website or contact Sefer support for information on driver registration and requirements.": + "ہماری ویب سائٹ ملاحظہ کریں یا ڈرائیور کی رجسٹریشن اور ضروریات کے بارے میں معلومات کے لیے سیفر سپورٹ سے رابطہ کریں۔", + "How do I communicate with the other party (passenger/driver)?": + "میں دوسری پارٹی (مسافر/ڈرائیور) کے ساتھ کیسے بات چیت کروں؟", + "Sefer provides in-app chat functionality to allow you to communicate with your driver or passenger during your ride.": + "سیفر آپ کو اپنی سواری کے دوران اپنے ڈرائیور یا مسافر سے بات چیت کرنے کی اجازت دینے کے لیے ایپ میں چیٹ کی فعالیت فراہم کرتا ہے۔", + "What safety measures does Sefer offer?": + "سیفر کیا حفاظتی اقدامات پیش کرتا ہے؟", + "Sefer prioritizes your safety. We offer features like driver verification, in-app trip tracking, and emergency contact options.": + "سیفر آپ کی حفاظت کو ترجیح دیتا ہے۔ ہم ڈرائیور کی تصدیق، درون ایپ ٹرپ ٹریکنگ، اور ہنگامی رابطہ کے اختیارات جیسی خصوصیات پیش کرتے ہیں۔", + "Frequently Questions": "اکثر سوالات", + "User does not exist.": "صارف موجود نہیں.", + "We need your phone number to contact you and to help you.": + "ہمیں آپ سے رابطہ کرنے اور آپ کی مدد کرنے کے لیے آپ کے فون نمبر کی ضرورت ہے۔", + "You will recieve code in sms message": + "آپ کو ایس ایم ایس پیغام میں کوڈ موصول ہوگا۔", + "Please enter": "درج کریں", + "We need your phone number to contact you and to help you receive orders.": + "ہمیں آپ سے رابطہ کرنے اور آرڈرز وصول کرنے میں مدد کے لیے آپ کے فون نمبر کی ضرورت ہے۔", + "The full name on your criminal record does not match the one on your driver’s license. Please verify and provide the correct documents.": + "آپ کے مجرمانہ ریکارڈ پر موجود پورا نام آپ کے ڈرائیور کے لائسنس پر موجود نام سے مماثل نہیں ہے۔ براہ کرم تصدیق کریں اور درست دستاویزات فراہم کریں۔", + "The national number on your driver’s license does not match the one on your ID document. Please verify and provide the correct documents.": + "آپ کے ڈرائیور کے لائسنس پر موجود قومی نمبر آپ کی شناختی دستاویز پر موجود قومی نمبر سے مماثل نہیں ہے۔ براہ کرم تصدیق کریں اور درست دستاویزات فراہم کریں۔", + "Capture an Image of Your Criminal Record": + "اپنے مجرمانہ ریکارڈ کی تصویر حاصل کریں۔", + "IssueDate": "تاریخ اجراء", + "Capture an Image of Your car license front": + "اپنے کار لائسنس کے سامنے کی تصویر کھینچیں۔", + "Capture an Image of Your ID Document front": + "اپنی شناختی دستاویز کے سامنے کی تصویر کھینچیں۔", + "NationalID": "قومی شناختی", + "FullName": "پورا نام", + "InspectionResult": "معائنہ کا نتیجہ", + "Criminal Record": "مجرمانہ ریکارڈ", + "The email or phone number is already registered.": + "ای میل یا فون نمبر پہلے ہی رجسٹرڈ ہے۔", + "To become a ride-sharing driver on the Sefer app, you need to upload your driver\"s license, ID document, and car registration document. Our AI system will instantly review and verify their authenticity in just 2-3 minutes. If your documents are approved, you can start working as a driver on the Sefer app. Please note, submitting fraudulent documents is a serious offense and may result in immediate termination and legal consequences.": + "سیفر ایپ پر رائیڈ شیئرنگ ڈرائیور بننے کے لیے، آپ کو اپنے ڈرائیور کا لائسنس، شناختی دستاویز، اور کار کی رجسٹریشن کی دستاویز اپ لوڈ کرنے کی ضرورت ہے۔ ہمارا AI سسٹم فوری طور پر صرف 2-3 منٹ میں ان کی صداقت کا جائزہ لے کر تصدیق کرے گا۔ اگر آپ کی دستاویزات منظور شدہ ہیں، آپ سیفر ایپ پر بطور ڈرائیور کام کرنا شروع کر سکتے ہیں، براہ کرم نوٹ کریں، جعلی دستاویزات جمع کروانا ایک سنگین جرم ہے اور اس کے نتیجے میں فوری طور پر برطرفی اور قانونی نتائج برآمد ہو سکتے ہیں۔", + "Documents check": "دستاویزات کی جانچ پڑتال", + "Driver's License": "ڈرائیور کا لائسنس", + "License Type": "لائسنس کی قسم", + "National Number": "قومی نمبر", + "Name (Arabic)": "نام (عربی)", + "Name (English)": "نام (انگریزی)", + "Address": "پتہ", + "Issue Date": "تاریخ اجراء", + "Expiry Date": "خاتمے کی تاریخ", + "License Categories": "لائسنس کے زمرے", + "driver_license": "ڈرائیور لائسنس", + "Capture an Image of Your Driver License": + "اپنے ڈرائیور لائسنس کی تصویر کھینچیں۔", + "ID Documents Back": "شناختی دستاویزات واپس", + "National ID": "قومی شناختی", + "Occupation": "پیشہ", + "Gender": "صنف", + "Religion": "مذہب", + "Marital Status": "ازدواجی حیثیت", + "Full Name (Marital)": "پورا نام (ازدواجی)", + "Expiration Date": "میعاد ختم ہونے کی تاریخ", + "Capture an Image of Your ID Document Back": + "اپنی شناختی دستاویز کی تصویر واپس لیں۔", + "ID Documents Front": "شناختی دستاویزات سامنے", + "First Name": "پہلا نام", + "CardID": "کارڈ آئی ڈی", + "Full Name": "پورا نام", + "Vehicle Details Front": "گاڑی کی تفصیلات سامنے", + "Plate Number": "پلیٹ نمبر", + "Owner Name": "مالک کا نام", + "Vehicle Details Back": "گاڑی کی تفصیلات واپس", + "Make": "بنائیں", + "Model": "ماڈل", + "Year": "سال", + "Chassis": "چیسس", + "Color": "رنگ", + "Displacement": "نقل مکانی", + "Fuel": "ایندھن", + "Tax Expiry Date": "ٹیکس ختم ہونے کی تاریخ", + "Inspection Date": "معائنہ کی تاریخ", + "Capture an Image of Your car license back": + "اپنے کار لائسنس کی تصویر واپس کیپچر کریں۔", + "Capture an Image of Your Driver’s License": + "اپنے ڈرائیور کے لائسنس کی تصویر کھینچیں۔", + "Sign in with Google for easier email and name entry": + "آسان ای میل اور نام کے اندراج کے لیے گوگل کے ساتھ سائن ان کریں۔", + "You will choose allow all the time to be ready receive orders": + "آپ آرڈر وصول کرنے کے لیے ہر وقت تیار رہنے کا انتخاب کریں گے۔", + "Welcome to Sefer!": "Sefer میں خوش آمدید!", + "Get to your destination quickly and easily.": + "جلدی اور آسانی سے اپنی منزل تک پہنچیں۔", + "Enjoy a safe and comfortable ride.": + "ایک محفوظ اور آرام دہ سواری کا لطف اٹھائیں۔", + "Choose Language": "زبان کا انتخاب کریں۔", + "Login": "لاگ ان کریں", + "Pay with Wallet": "Wallet کے ساتھ ادائیگی کریں۔", + "Invalid MPIN": "غلط MPIN", + "Invalid OTP": "غلط OTP", + "Enter your email address": "اپنا ای میل کا پتا لکھو", + "Please enter Your Email.": "براہ کرم اپنا ای میل درج کریں۔", + "Enter your phone number": "اپنا فون نمبر درج کریں۔", + "Please enter your phone number.": "براہ کرم اپنا فون نمبر درج کریں۔", + "Please enter Your Password.": + "برائے مہربانی اپنا پاس ورڈ داخل کریں.", + "Submit": "جمع کرائیں", + "if you dont have account": "اگر آپ کے پاس اکاؤنٹ نہیں ہے۔", + "Register": "رجسٹر کریں۔", + "Accept Ride's Terms & Review Privacy Notice": + "سواری کی شرائط قبول کریں اور پرائیویسی نوٹس کا جائزہ لیں۔", + "By selecting 'I Agree' below, I have reviewed and agree to the Terms of Use and acknowledge the Privacy Notice. I am at least 18 years of age.": + "ذیل میں 'میں اتفاق کرتا ہوں' کو منتخب کرکے، میں نے استعمال کی شرائط کا جائزہ لیا اور اس سے اتفاق کیا اور رازداری کے نوٹس کو تسلیم کیا۔ میری عمر کم از کم 18 سال ہے۔", + "I Agree": "میں راضی ہوں", + "First name": "پہلا نام", + "Enter your first name": "اپنا پہلا نام درج کریں۔", + "Please enter your first name.": "براہ کرم اپنا پہلا نام درج کریں۔", + "Last name": "آخری نام", + "Enter your last name": "اپنا آخری نام درج کریں۔", + "Please enter your last name.": "براہ کرم اپنا آخری نام درج کریں۔", + "City": "شہر", + "Please enter your City.": "براہ کرم اپنا شہر درج کریں۔", + "Male": "مرد", + "Female": "عورت", + "Verify Email": "ای میل کی تصدیق کریں۔", + "We sent 5 digit to your Email provided": + "ہم نے آپ کے فراہم کردہ ای میل پر 5 ہندسے بھیجے ہیں۔", + "5 digit": "5 ہندسہ", + "Send Verification Code": "تصدیقی کوڈ بھیجیں۔", + "Your Ride Duration is": "آپ کی سواری کا دورانیہ ہے۔", + "You will be thier in": "آپ اس میں شامل ہوں گے۔", + "You trip distance is": "آپ کے سفر کا فاصلہ ہے۔", + "Fee is": "فیس ہے۔", + "From :": "منجانب:", + "To :": "کو:", + "Add Promo": "پرومو شامل کریں۔", + "Confirm Selection": "انتخاب کی تصدیق کریں۔", + "distance is": "فاصلہ ہے", + "duration is": "مدت ہے", + "I don't need a ride anymore": "مجھے اب سواری کی ضرورت نہیں ہے۔", + "I was just trying the application": + "میں صرف درخواست کی کوشش کر رہا تھا", + "No driver accepted my request": + "کسی ڈرائیور نے میری درخواست قبول نہیں کی۔", + "I added the wrong pick-up/drop-off location": + "میں نے غلط پک اپ/ڈراپ آف مقام شامل کیا۔", + "I don't have a reason": "میرے پاس کوئی وجہ نہیں ہے۔", + "Other": "دیگر", + "Can we know why you want to cancel Ride ?": + "کیا ہم جان سکتے ہیں کہ آپ سواری کیوں منسوخ کرنا چاہتے ہیں؟", + "Cancel Ride": "سواری منسوخ کریں۔", + "Add Payment Method": "ادائیگی کا طریقہ شامل کریں۔", + "Your Wallet balance is": "آپ کا والیٹ بیلنس ہے۔", + "Ride Wallet": "والیٹ کی سواری کریں۔", + "Payment Method": "ادائیگی کا طریقہ", + "Type here Place": "یہاں جگہ ٹائپ کریں۔", + "Are You sure to ride to": "کیا آپ کو یقینی طور پر سوار ہونا ہے۔", + "Confirm": "تصدیق کریں۔", + "Back": "پیچھے", + "You are Delete": "آپ ڈیلیٹ ہیں۔", + "Deleted": "حذف کر دیا گیا۔", + "You Dont Have Any places yet !": + "آپ کے پاس ابھی تک کوئی جگہ نہیں ہے!", + "Favorite Places": "پسندیدہ مقامات", + "From : Current Location": "منجانب: موجودہ مقام", + "Where to": "کہاں سے", + "Notifications": "اطلاعات", + "Profile": "پروفائل", + "Home": "گھر", + "My Cared": "میری دیکھ بھال", + "Add Card": "کارڈ شامل کریں۔", + "Add Credit Card": "کریڈٹ کارڈ شامل کریں۔", + "Please enter the cardholder name": + "براہ کرم کارڈ ہولڈر کا نام درج کریں۔", + "Please enter the expiry date": + "براہ کرم میعاد ختم ہونے کی تاریخ درج کریں۔", + "Please enter the CVV code": "براہ کرم CVV کوڈ درج کریں۔", + "Go To Favorite Places": "پسندیدہ مقامات پر جائیں۔", + "Go to this Target": "اس ٹارگٹ پر جائیں۔", + "My Profile": "میری پروفائل", + "Sign Out": "باہر جائیں", + "Home Page": "ہوم پیج", + "Are you want to go to this site": + "کیا آپ اس سائٹ پر جانا چاہتے ہیں؟", + "MyLocation": "میرا مقام", + "my location": "میرا مقام", + "Target": "ہدف", + "Update": "اپ ڈیٹ", + "You Should choose rate figure": + "آپ کو شرح کے اعداد و شمار کا انتخاب کرنا چاہئے۔", + "Login Captin": "کیپٹن لاگ ان کریں۔", + "Register Captin": "کیپٹن کو رجسٹر کریں۔", + "Send Verfication Code": "تصدیقی کوڈ بھیجیں۔", + "KM": "KM", + "End Ride": "سواری ختم کریں۔", + "Minute": "منٹ", + "Go to passenger Location now": "ابھی مسافر کے مقام پر جائیں۔", + "Duration of the Ride is": "سواری کا دورانیہ ہے۔", + "Distance of the Ride is": "سواری کا فاصلہ ہے۔", + "Name of the Passenger is": "مسافر کا نام ہے۔", + "Hello this is Captain": "ہیلو یہ کیپٹن ہے۔", + "Start the Ride": "سواری شروع کریں۔", + "Please Wait If passenger want To Cancel!": + "اگر مسافر منسوخ کرنا چاہتے ہیں تو براہ کرم انتظار کریں!", + "Total Duration:": "کل دورانیہ:", + "Active Duration:": "فعال دورانیہ:", + "Waiting for Captin ...": "کپتان کا انتظار ہے...", + "Age is": "عمر ہے۔", + "Rating is": "درجہ بندی ہے۔", + "to arrive you.": "آپ تک پہنچنے کے لیے", + "Order History": "آرڈر کی تاریخ", + "My Wallet": "میرا بٹوہ", + "Tariff": "ٹیرف", + "Settings": "ترتیبات", + "Feed Back": "فیڈ بیک", + "Promos": "پروموز", + "Please enter a valid 16-digit card number": + "براہ کرم ایک درست 16 ہندسوں والا کارڈ نمبر درج کریں۔", + "Add Phone": "فون شامل کریں۔", + "Please enter a phone number": "براہ کرم ایک فون نمبر درج کریں۔", + "You dont Add Emergency Phone Yet!": + "آپ نے ابھی تک ایمرجنسی فون شامل نہیں کیا!", + "You will arrive to your destination after": + "اس کے بعد آپ اپنی منزل پر پہنچ جائیں گے۔", + "You can cancel Ride now": "آپ ابھی سواری منسوخ کر سکتے ہیں۔", + "You Can cancel Ride After Captain did not come in the time": + "کپتان کے وقت پر نہ آنے کے بعد آپ سواری منسوخ کر سکتے ہیں۔", + "If you in Car Now. Press Start The Ride": + "اگر آپ ابھی کار میں ہیں۔ سٹارٹ دی رائڈ کو دبائیں۔", + "You Dont Have Any amount in": "آپ کے پاس کوئی رقم نہیں ہے۔", + "Wallet!": "پرس!", + "You Have": "آپ کے پاس ہے", + "Save Credit Card": "کریڈٹ کارڈ محفوظ کریں۔", + "Show Promos": "پروموز دکھائیں۔", + "10 and get 4% discount": "10 اور 4% ڈسکاؤنٹ حاصل کریں۔", + "20 and get 6% discount": "20 اور 6% ڈسکاؤنٹ حاصل کریں۔", + "40 and get 8% discount": "40 اور 8% ڈسکاؤنٹ حاصل کریں۔", + "100 and get 11% discount": "100 اور 11% ڈسکاؤنٹ حاصل کریں۔", + "Pay with Your PayPal": "اپنے پے پال سے ادائیگی کریں۔", + "You will choose one of above !": + "آپ اوپر میں سے ایک کا انتخاب کریں گے!", + "Cancel": "منسوخ کریں۔", + "Delete My Account": "میرا اکاؤنٹ حذف کریں۔", + "Edit Profile": "پروفائل میں ترمیم کریں", + "Name": "نام", + "Update Gender": "جنس کو اپ ڈیٹ کریں۔", + "Education": "تعلیم", + "Update Education": "تعلیم کو اپ ڈیٹ کریں۔", + "Employment Type": "ملازمت کی قسم", + "SOS Phone": "SOS فون", + "High School Diploma": "ہائی اسکول ڈپلومہ", + "Associate Degree": "ایسوسی ایٹ ڈگری", + "Bachelor's Degree": "بیچلر ڈگری", + "Master's Degree": "ماسٹر ڈگری", + "Doctoral Degree": "ڈاکٹریٹ کی ڈگری", + "Promos For today": "آج کے لیے پروموز", + "Copy this Promo to use it in your Ride!": + "اس پرومو کو اپنی سواری میں استعمال کرنے کے لیے اسے کاپی کریں!", + "To change some Settings": "کچھ ترتیبات کو تبدیل کرنے کے لیے", + "To change Language the App": "ایپ کی زبان کو تبدیل کرنے کے لیے", + "Order Request Page": "آرڈر کی درخواست کا صفحہ", + "Rouats of Trip": "سفر کے راستے", + "Passenger Name is": "مسافر کا نام ہے۔", + "Total From Passenger is": "مسافر سے ٹوٹل ہے۔", + "Duration To Passenger is": "مسافر کا دورانیہ ہے۔", + "Distance To Passenger is": "مسافر سے فاصلہ ہے۔", + "Total For You is": "آپ کے لیے ٹوٹل ہے۔", + "Distance is": "فاصلہ ہے۔", + "KM": "KM", + "Duration of Trip is": "سفر کا دورانیہ ہے۔", + "Minutes": "منٹس", + "Apply Order": "آرڈر اپلائی کریں۔", + "Refuse Order": "حکم سے انکار", + "Rate Captain": "کیپٹن کو ریٹ کریں۔", + "Enter your Note": "اپنا نوٹ درج کریں۔", + "Type something...": "کچھ ٹائپ کریں...", + "Submit rating": "درجہ بندی جمع کروائیں۔", + "Rate Passenger": "مسافر کو ریٹ کریں۔", + "Ride Summary": "سواری کا خلاصہ", + "welcome_message": "خوش آمدید_پیغام", + "app_description": "app_description", + "get_to_destination": "منزل_تک_جائیں", + "get_a_ride": "ایک_سوار حاصل کریں۔", + "safe_and_comfortable": "محفوظ_اور_آرام دہ", + "committed_to_safety": "حفاظت_کے_لئے عزم", + "Driver Applied the Ride for You": + "ڈرائیور نے آپ کے لیے سواری کا اطلاق کیا۔", + "Show latest promo": "تازہ ترین پرومو دکھائیں۔", + "Cancel Trip": "دورہ منسوخ کریں۔", + "Passenger Cancel Trip": "مسافر سفر منسوخ کر دیں۔", + "Please stay on the picked point.": + "براہ کرم منتخب کردہ نقطہ پر رہیں۔", + "Trip is Begin": "سفر شروع ہے۔", + "Hi ,I will go now": "ہیلو، میں اب جاؤں گا۔", + "Passenger come to you": "مسافر تیرے پاس آئے", + "Hi ,I Arrive your site": "ہیلو، میں آپ کی سائٹ پر پہنچ گیا ہوں۔", + "Driver Finish Trip": "ڈرائیور کا سفر ختم", + "you will pay to Driver": "آپ ڈرائیور کو ادائیگی کریں گے۔", + "Driver Cancel Your Trip": "ڈرائیور آپ کا سفر منسوخ کر دیں۔", + "you will pay to Driver you will be pay the cost of driver time look to your SEFER Wallet": + "آپ ڈرائیور کو ادائیگی کریں گے آپ کو ڈرائیور کے وقت کی قیمت آپ کے SEFER والیٹ کو ادا کی جائے گی۔", + "I will go now": "میں اب چلوں گا", + "You Have Tips": "آپ کے پاس تجاویز ہیں۔", + "tips": "تجاویز", + "Total is": "کل ہے۔", + "الْمَجْمُوع هُوَ": "الْمَجْمُوع هُوَ", + "No,I want": "نہیں، میں چاہتا ہوں۔", + "Your fee is": "آپ کی فیس ہے۔", + "Do you want to pay Tips for this Driver": + "کیا آپ اس ڈرائیور کے لیے ٹپس ادا کرنا چاہتے ہیں؟", + "Tip is": "ٹپ ہے۔", + "Tip is": "ٹپ ہے۔", + "Camera Access Denied.": "کیمرے تک رسائی سے انکار کر دیا گیا۔", + "Open Settings": "ترتیبات کھولیں۔", + "GPS Required Allow !.": "GPS کی اجازت کی ضرورت ہے!", + "Your Account is Deleted": "آپ کا اکاؤنٹ حذف ہو گیا ہے۔", + "Are you sure to delete your account?": + "کیا آپ واقعی اپنا اکاؤنٹ حذف کرنا چاہتے ہیں؟", + "Your data will be erased after 2 weeks": + "آپ کا ڈیٹا 2 ہفتوں کے بعد مٹا دیا جائے گا۔", + "And you will can't return to use app after 1 month": + "اور آپ 1 ماہ کے بعد ایپ استعمال کرنے پر واپس نہیں آسکیں گے۔", + "وَلَن تَسْتَطِيع اسْتِخْدَام التَّطْبِيق مَرَّة أُخْرَى بَعْد شَهْر": + "وَلَن تَسْتَطِيع اسْتِخْدَام التَّطْبِيق مَرَّة أُخْرَى بَعْد شَهْر", + "Enter Your First Name": "اپنا پہلا نام درج کریں۔", + "Are you Sure to LogOut?": "کیا آپ کو لاگ آؤٹ کرنے کا یقین ہے؟", + "Email Wrong": "ای میل غلط", + "Email you inserted is Wrong.": + "آپ نے جو ای میل داخل کی ہے وہ غلط ہے۔", + "You have finished all times": "آپ نے ہر وقت ختم کر دیا ہے۔", + "if you want help you can email us here": + "اگر آپ مدد چاہتے ہیں تو آپ ہمیں یہاں ای میل کر سکتے ہیں۔", + "Thanks": "شکریہ", + "Email Us": "ہمیں ای میل کریں", + "I cant register in your app in face detection": + "میں چہرے کا پتہ لگانے میں آپ کی ایپ میں اندراج نہیں کر سکتا", + "Hi": "ہائے", + "No face detected": "کسی چہرے کا پتہ نہیں چلا", + "Image detecting result is": "تصویر کا پتہ لگانے کا نتیجہ ہے۔", + "from 3 times Take Attention": "3 بار توجہ دیں۔", + "Be sure for take accurate images please": + "براہ کرم درست تصاویر لینے کا یقین رکھیں", + "You have": "آپ کے پاس ہے", + "لَدَيْك": "لَدَيْك", + "image verified": "تصویر کی تصدیق", + "Next": "اگلے", + "There is no help Question here": "یہاں کوئی مدد کا سوال نہیں ہے۔", + "Call End": "کال اینڈ", + "You dont have Points": "آپ کے پاس پوائنٹس نہیں ہیں۔", + "You Are Stopped For this Day !": + "آپ کو اس دن کے لیے روک دیا گیا ہے!", + "You must be charge your Account": + "آپ کو اپنے اکاؤنٹ سے چارج کرنا ہوگا۔", + "You Refused 3 Rides this Day that is the reason": + "آپ نے اس دن 3 سواریوں سے انکار کیا یہی وجہ ہے۔", + "See you Tomorrow!": "کل ملیں گے!", + "لِقَائِنَا غَدًا!": "لِقَائِنَا غَدًا!", + "Recharge my Account": "میرا اکاؤنٹ ری چارج کریں۔", + "Ok , See you Tomorrow": "ٹھیک ہے کل ملیں گے", + "You are Stopped": "آپ کو روک دیا گیا ہے۔", + "Connected": "جڑا ہوا", + "Not Connected": "منسلک نہیں", + "Your are far from passenger location": + "آپ مسافروں کے مقام سے بہت دور ہیں۔", + "go to your passenger location before": + "پہلے اپنے مسافر کے مقام پر جائیں۔", + "Passenger cancel trip": "مسافر نے سفر منسوخ کر دیا۔", + "يُلْغِي الرَّاكِب الرِّحْلَة": "يُلْغِي الرَّاكِب الرِّحْلَة", + "You will get cost of your work for this trip": + "اس سفر کے لیے آپ کو اپنے کام کی قیمت ملے گی۔", + "in your wallet": "آپ کے بٹوے میں", + "you gain": "تم حاصل کرو", + "Order Cancelled": "آرڈر منسوخ کر دیا گیا۔", + "Order Cancelled by Passenger": + "مسافر کے ذریعے آرڈر منسوخ کر دیا گیا۔", + "Success": "کامیابی", + "Feedback data saved successfully": + "تاثرات کا ڈیٹا کامیابی سے محفوظ ہو گیا۔", + "No Promo for today .": "آج کے لیے کوئی پرومو نہیں ہے۔", + "Select your destination": "اپنی منزل کا انتخاب کریں۔", + "Search for your Start point": "اپنے نقطہ آغاز کی تلاش کریں۔", + "Search for waypoint": "راستہ تلاش کریں۔", + "Current Location": "موجودہ مقام", + "Add Location 1": "مقام 1 شامل کریں۔", + "You must Verify email !.": "آپ کو ای میل کی تصدیق کرنی ہوگی!", + "Cropper": "فصل کاٹنے والا", + "Saved Sucssefully": "کامیابی سے محفوظ کیا گیا۔", + "Select Date": "تاریخ منتخب کریں۔", + "Birth Date": "تاریخ پیدائش", + "Ok": "ٹھیک ہے", + "the 500 points equal 30 JOD": "500 پوائنٹس 30 JOD کے برابر ہیں۔", + "the 500 points equal 30 JOD for you": + "500 پوائنٹس آپ کے لیے 30 JOD کے برابر ہیں۔", + "So go and gain your money": "تو جاؤ اور اپنا پیسہ کماؤ", + "فَاسْتَحِقَّ فُلُوسَك وَاكْسِب النِّقَاط": + "فَاسْتَحِقَّ فُلُوسَك وَاكْسِب النِّقَاط", + "token updated": "ٹوکن اپ ڈیٹ", + "Add Location 2": "مقام 2 شامل کریں۔", + "Add Location 3": "مقام 3 شامل کریں۔", + "Add Location 4": "مقام 4 شامل کریں۔", + "Waiting for your location": "آپ کے مقام کا انتظار ہے۔", + "Search for your destination": "اپنی منزل تلاش کریں۔", + "Hi! This is": "ہائے! یہ وہ جگہ ہے", + "I am using": "میں استعمال کر رہا ہوں", + "to ride with": "کے ساتھ سواری کرنا", + "as the driver.": "ڈرائیور کے طور پر.", + "is driving a": "گاڑی چلا رہا ہے", + "with license plate": "لائسنس پلیٹ کے ساتھ", + "I am currently located at": "میں اس وقت واقع ہوں۔", + "Please go to Car now": "براہ کرم ابھی کار پر جائیں۔", + "If you need to reach me, please contact the driver directly at": + "اگر آپ کو مجھ تک پہنچنے کی ضرورت ہے تو براہ کرم ڈرائیور سے براہ راست رابطہ کریں۔", + "No Car or Driver Found in your area.": + "آپ کے علاقے میں کوئی کار یا ڈرائیور نہیں ملا۔", + "Please Try anther time": "براہ کرم دوسرے وقت کی کوشش کریں۔", + "There no Driver Aplly your order sorry for that": + "اس کے لیے کوئی ڈرائیور آپ کے آرڈر کو لاگو نہیں کرتا", + "Trip Cancelled": "دورہ منسوخ ہو گیا۔", + "The Driver Will be in your location soon .": + "ڈرائیور جلد ہی آپ کے مقام پر آجائے گا۔", + "The distance less than 500 meter.": "فاصلہ 500 میٹر سے کم ہے۔", + "Promo End !": "پرومو ختم!", + "There is no notification yet": "ابھی تک کوئی اطلاع نہیں ہے۔", + "Use Touch ID or Face ID to confirm payment": + "ادائیگی کی تصدیق کے لیے ٹچ آئی ڈی یا فیس آئی ڈی استعمال کریں۔", + "Contact us for any questions on your order.": + "اپنے آرڈر پر کسی بھی سوال کے لیے ہم سے رابطہ کریں۔", + "Pyament Cancelled .": "پیمنٹ منسوخ کر دیا گیا۔", + "type here": "یہاں ٹائپ کریں", + "Scan Driver License": "اسکین ڈرائیور لائسنس", + "Please put your licence in these border": + "براہ کرم اپنا لائسنس ان بارڈر میں لگائیں۔", + "Camera not initialized yet": "کیمرہ ابھی شروع نہیں ہوا ہے۔", + "Take Image": "تصویر لیں۔", + "AI Page": "AI صفحہ", + "Take Picture Of ID Card": "شناختی کارڈ کی تصویر لیں۔", + "Take Picture Of Driver License Card": + "ڈرائیور لائسنس کارڈ کی تصویر لیں۔", + "We are process picture please wait": + "ہم پروسیسنگ تصویر ہیں براہ کرم انتظار کریں۔", + "There is no data yet.": "ابھی تک کوئی ڈیٹا نہیں ہے۔", + "Name :": "نام:", + "Drivers License Class:": "ڈرائیور لائسنس کی کلاس:", + "Document Number:": "دستاویز نمبر:", + "Address:": "پتہ:", + "Height:": "اونچائی:", + "Expiry Date:": "خاتمے کی تاریخ:", + "Date of Birth:": "پیدائش کی تاریخ:", + "You can\"t continue with us .": "آپ ہمارے ساتھ جاری نہیں رکھ سکتے۔", + "You should renew Driver license": + "آپ کو ڈرائیور لائسنس کی تجدید کرنی چاہیے۔", + "Detect Your Face": "اپنے چہرے کا پتہ لگائیں۔", + "Go to next step": "اگلے مرحلے پر جائیں۔", + "scan Car License.": "کار لائسنس اسکین کریں۔", + "aاسْتِخْرَاج رُخْصَة السَّيَّارَة.": + "ااسْتِخْرَاج رُخْصَة السَّيَّارَة.", + "Name in arabic": "عربی میں نام", + "Drivers License Class": "ڈرائیور لائسنس کلاس", + "Date of Birth": "پیدائش کی تاریخ", + "Age": "عمر", + "Lets check Car license": "آئیے کار لائسنس چیک کریں۔", + "Car Kind": "کار کی قسم", + "Car Plate": "کار پلیٹ", + "Lets check License Back Face": "آئیے لائسنس بیک فیس چیک کریں۔", + "Car License Card": "کار لائسنس کارڈ", + "No image selected yet": "ابھی تک کوئی تصویر منتخب نہیں کی گئی۔", + "Made :": "بنایا:", + "model :": "ماڈل:", + "VIN :": "VIN:", + "year :": "سال:", + "ُExpire Date": "ختم ہونے کی تاریخ", + "Login Driver": "لاگ ان ڈرائیور", + "Password must br at least 6 character.": + "پاس ورڈ کم از کم 6 حروف کا ہونا چاہیے۔", + "if you don\"t have account": "اگر آپ کے پاس اکاؤنٹ نہیں ہے۔", + "Here recorded trips audio": "یہاں ریکارڈ شدہ ٹرپس آڈیو", + "Register as Driver": "بطور ڈرائیور رجسٹر کریں۔", + "Privacy Notice": "رازداری کا نوٹس", + "By selecting 'I Agree' below, I have reviewed and agree to the Terms of Use and acknowledge the": + "ذیل میں 'میں متفق ہوں' کو منتخب کرکے، میں نے استعمال کی شرائط کا جائزہ لیا اور ان سے اتفاق کیا اور تسلیم کیا", + ". I am at least 18 years of age.": ". میری عمر کم از کم 18 سال ہے۔", + "Log Out Page": "لاگ آؤٹ صفحہ", + "Log Off": "لاگ آف کریں", + "Register Driver": "ڈرائیور رجسٹر کریں۔", + "Verify Email For Driver": "ڈرائیور کے لیے ای میل کی تصدیق کریں۔", + "Admin DashBoard": "ایڈمن ڈیش بورڈ", + "Your name": "تمھارا نام", + "your ride is applied": "آپ کی سواری کا اطلاق ہوتا ہے۔", + "Your password": "آپ کا پاس ورڈ", + "H and": "ایچ اور", + "LE": "ایل ای", + "JOD": "JOD", + "m": "m", + "We search nearst Driver to you": + "ہم آپ کے قریب ترین ڈرائیور تلاش کرتے ہیں۔", + "please wait till driver accept your order": + "ڈرائیور آپ کا آرڈر قبول کرنے تک انتظار کریں۔", + "No accepted orders? Try raising your trip fee to attract riders.": + "کوئی منظور شدہ احکامات؟ سواروں کو راغب کرنے کے لیے اپنی ٹرپ فیس میں اضافہ کرنے کی کوشش کریں۔", + "You should select one": "آپ کو ایک کا انتخاب کرنا چاہئے۔", + "The driver accept your order for": + "ڈرائیور آپ کا آرڈر قبول کرتا ہے۔", + "Increase Fee": "فیس میں اضافہ", + "No, thanks": "نہیں شکریہ", + "The driver on your way": "ڈرائیور آپ کے راستے میں ہے۔", + "Total price from": "سے کل قیمت", + "Order Details Speed": "آرڈر کی تفصیلات کی رفتار", + "Order Applied": "آرڈر لاگو", + "accepted your order": "آپ کا حکم قبول کیا", + "We regret to inform you that another driver has accepted this order.": + "ہمیں آپ کو یہ بتاتے ہوئے افسوس ہے کہ ایک اور ڈرائیور نے اس آرڈر کو قبول کر لیا ہے۔", + "Selected file:": "منتخب فائل:", + "Your trip cost is": "آپ کے سفر کی قیمت ہے۔", + "this will delete all files from your device": + "یہ آپ کے آلے سے تمام فائلوں کو حذف کر دے گا۔", + "you have a negative balance of": "آپ کے پاس منفی توازن ہے۔", + "in your": "آپ میں", + "Exclusive offers and discounts always with the Sefer app": + "سیفر ایپ کے ساتھ ہمیشہ خصوصی آفرز اور چھوٹ", + "Please go to Car Driver": "براہ کرم کار ڈرائیور کے پاس جائیں۔", + "wallet due to a previous trip.": "پچھلے سفر کی وجہ سے پرس۔", + "Submit Question": "سوال جمع کروائیں۔", + "Please enter your Question.": "براہ کرم اپنا سوال درج کریں۔", + "Help Details": "مدد کی تفصیلات", + "No trip yet found": "ابھی تک کوئی سفر نہیں ملا", + "No Response yet.": "ابھی تک کوئی جواب نہیں۔", + "You Earn today is": "آپ آج کماتے ہیں۔", + "You Have in": "آپ کے پاس ہے", + "Total points is": "کل پوائنٹس ہیں۔", + "Total Connection Duration:": "کنکشن کی کل مدت:", + "H and": "ایچ اور", + "Passenger name :": "مسافر کا نام:", + "Cost Of Trip IS": "سفر کی لاگت IS", + "Arrival time": "آمد کے وقت", + "arrival time to reach your point": + "آپ کے نقطہ تک پہنچنے کے لئے آمد کا وقت", + "For Speed and Delivery trips, the price is calculated dynamically. For Comfort trips, the price is based on time and distance": + "سپیڈ اور ڈیلیوری ٹرپس کے لیے، قیمت کا حساب متحرک طور پر کیا جاتا ہے۔ آرام دہ دوروں کے لیے، قیمت وقت اور فاصلے پر مبنی ہے۔", + "Hello this is Driver": "ہیلو یہ ڈرائیور ہے۔", + "Is the Passenger in your Car ?": "کیا مسافر آپ کی گاڑی میں ہے؟", + "Please wait for the passenger to enter the car before starting the trip.": + "براہ کرم سفر شروع کرنے سے پہلے مسافر کے گاڑی میں داخل ہونے کا انتظار کریں۔", + "No ,still Waiting.": "نہیں، ابھی تک انتظار ہے۔", + "I arrive you": "میں آپ کے پاس پہنچتا ہوں۔", + "I Arrive your site": "میں آپ کی سائٹ پر پہنچ گیا ہوں۔", + "You are not in near to passenger location": + "آپ مسافر کے مقام کے قریب نہیں ہیں۔", + "please go to picker location exactly": + "براہ کرم بالکل چننے والے مقام پر جائیں۔", + "You Can Cancel Trip And get Cost of Trip From": + "آپ ٹرپ منسوخ کر سکتے ہیں اور اس سے سفر کی لاگت حاصل کر سکتے ہیں۔", + "Are you sure to cancel?": "کیا آپ کو یقینی طور پر منسوخ کرنا ہے؟", + "Yes": "جی ہاں", + "Insert Emergincy Number": "ایمرجنسی نمبر داخل کریں۔", + "Best choice for comfort car and flexible route and stops point": + "آرام دہ کار اور لچکدار روٹ اور اسٹاپ پوائنٹ کے لیے بہترین انتخاب", + "Insert": "داخل کریں", + "This is for delivery or a motorcycle.": + "یہ ڈیلیوری یا موٹرسائیکل کے لیے ہے۔", + "This trip goes directly from your starting point to your destination for a fixed price. The driver must follow the planned route": + "یہ سفر ایک مقررہ قیمت پر آپ کے نقطہ آغاز سے براہ راست آپ کی منزل تک جاتا ہے۔ ڈرائیور کو منصوبہ بند راستے پر چلنا چاہیے۔", + "You can decline a request without any cost": + "آپ بغیر کسی قیمت کے درخواست مسترد کر سکتے ہیں۔", + "Perfect for adventure seekers who want to experience something new and exciting": + "ایڈونچر کے متلاشیوں کے لیے بہترین ہے جو کچھ نیا اور دلچسپ تجربہ کرنا چاہتے ہیں۔", + "My current location is:": "میرا موجودہ مقام ہے:", + "and I have a trip on": "اور میرا ایک سفر ہے۔", + "App with Passenger": "مسافر کے ساتھ ایپ", + "مع الراكب": "مع الراكب", + "You will be pay the cost to driver or we will get it from you on next trip": + "آپ ڈرائیور کو قیمت ادا کریں گے یا ہم اگلے سفر پر آپ سے وصول کریں گے۔", + "Trip has Steps": "سفر کے مراحل ہوتے ہیں۔", + "Distance from Passenger to destination is": + "مسافر سے منزل تک کا فاصلہ ہے۔", + "price is": "قیمت ہے", + "This ride type does not allow changes to the destination or additional stops": + "سواری کی یہ قسم منزل میں تبدیلی یا اضافی اسٹاپس کی اجازت نہیں دیتی ہے۔", + "This price may be changed": "یہ قیمت تبدیل ہو سکتی ہے۔", + "No SIM card, no problem! Call your driver directly through our app. We use advanced technology to ensure your privacy.": + "کوئی سم کارڈ نہیں، کوئی مسئلہ نہیں! ہماری ایپ کے ذریعے اپنے ڈرائیور کو براہ راست کال کریں۔ ہم آپ کی رازداری کو یقینی بنانے کے لیے جدید ٹیکنالوجی کا استعمال کرتے ہیں۔", + "This ride type allows changes, but the price may increase": + "سواری کی یہ قسم تبدیلیوں کی اجازت دیتی ہے، لیکن قیمت بڑھ سکتی ہے۔", + "message From passenger": "مسافر کا پیغام", + "Select one message": "ایک پیغام منتخب کریں۔", + "My location is correct. You can search for me using the navigation app": + "میرا مقام درست ہے۔ آپ نیویگیشن ایپ کا استعمال کر کے مجھے تلاش کر سکتے ہیں۔", + "I'm waiting for you": "میں آپ کا انتظار کر رہا ہوں", + "Hello, I'm at the agreed-upon location": + "ہیلو، میں متفقہ مقام پر ہوں۔", + "We noticed the speed is exceeding 100 km/h. Please slow down for your safety. If you feel unsafe, you can share your trip details with a contact or call the police using the red SOS button.": + "ہم نے دیکھا کہ رفتار 100 کلومیٹر فی گھنٹہ سے زیادہ ہے۔ براہ کرم اپنی حفاظت کے لیے آہستہ کریں۔ اگر آپ غیر محفوظ محسوس کرتے ہیں، تو آپ اپنے سفر کی تفصیلات کسی رابطہ کے ساتھ شیئر کر سکتے ہیں یا سرخ SOS بٹن کا استعمال کر کے پولیس کو کال کر سکتے ہیں۔", + "Warning: Speeding detected!": "انتباہ: رفتار کا پتہ چلا!", + "Please help! Contact me as soon as possible.": + "مدد کریں! جتنی جلدی ہو سکے مجھ سے رابطہ کریں۔", + "Share Trip Details": "سفر کی تفصیلات شیئر کریں۔", + "Car Plate is": "کار پلیٹ ہے۔", + "the 300 points equal 300 L.E for you": + "300 پوائنٹس آپ کے لیے 300 L.E کے برابر ہیں۔", + "So go and gain your money": "تو جاؤ اور اپنا پیسہ کماؤ", + "the 300 points equal 300 L.E": "300 پوائنٹس 300 L.E کے برابر ہیں۔", + "The payment was not approved. Please try again.": + "ادائیگی منظور نہیں ہوئی۔ دوبارہ کوشش کریں.", + "Payment Failed": "ادائیگی ناکام ہو گئی۔", + "Error": "خرابی", + "An error occurred during the payment process.": + "ادائیگی کے عمل کے دوران ایک خرابی پیش آگئی۔", + "The payment was approved.": "ادائیگی کی منظوری دی گئی۔", + "Payment Successful": "ادائیگی کامیاب", + "No ride found yet": "ابھی تک کوئی سواری نہیں ملی", + "Accept Order": "آرڈر قبول کریں۔", + "reject your order.": "آپ کے حکم کو مسترد کریں.", + "Bottom Bar Example": "نیچے بار کی مثال", + "Driver phone": "ڈرائیور کا فون", + "Statistics": "شماریات", + "Origin": "اصل", + "Destination": "منزل", + "Driver Name": "ڈرائیور کا نام", + "Driver Car Plate": "ڈرائیور کار پلیٹ", + "Available for rides": "سواریوں کے لیے دستیاب ہے۔", + "Scan Id": "اسکین آئی ڈی", + "Camera not initilaized yet": "کیمرہ ابھی شروع نہیں ہوا۔", + "Scan ID MklGoogle": "اسکین ID MklGoogle", + "Language": "زبان", + "Jordan": "اردن", + "USA": "امریکا", + "Egypt": "مصر", + "Turkey": "ترکی", + "Saudi Arabia": "سعودی عرب", + "Qatar": "قطر", + "Bahrain": "بحرین", + "Kuwait": "کویت", + "But you have a negative salary of": "لیکن آپ کی تنخواہ منفی ہے۔", + "Promo Code": "پرومو کوڈ", + "Your trip distance is": "آپ کے سفر کا فاصلہ ہے۔", + "Enter promo code": "پرومو کوڈ درج کریں۔", + "You have promo!": "آپ کے پاس پرومو ہے!", + "Cost Duration": "لاگت کا دورانیہ", + "Duration is": "دورانیہ ہے۔", + "Leave": "چھوڑو", + "Join": "شمولیت", + "You Should be select reason.": "آپ کو وجہ منتخب کرنی چاہئے۔", + "\$": "\$", + "Waiting for Driver ...": "ڈرائیور کا انتظار...", + "Latest Recent Trip": "تازہ ترین حالیہ دورہ", + "from your list": "آپ کی فہرست سے", + "Do you want to change Work location": + "کیا آپ کام کا مقام تبدیل کرنا چاہتے ہیں؟", + "Do you want to change Home location": + "کیا آپ گھر کا مقام تبدیل کرنا چاہتے ہیں؟", + "We Are Sorry That we dont have cars in your Location!": + "ہمیں افسوس ہے کہ ہمارے پاس آپ کے مقام پر کاریں نہیں ہیں!", + "Choose from Map": "نقشہ سے انتخاب کریں۔", + "Pick your ride location on the map - Tap to confirm": + "نقشے پر اپنی سواری کا مقام منتخب کریں - تصدیق کرنے کے لیے تھپتھپائیں۔", + "To Work": "کام کرنا", + "Are you want to go this site": "کیا آپ اس سائٹ پر جانا چاہتے ہیں؟", + "Closest & Cheapest": "قریب ترین اور سستا ترین", + "Work Saved": "کام محفوظ ہو گیا۔", + "Sefer is the ride-hailing app that is safe, reliable, and accessible.": + "سیفر رائیڈ ہیلنگ ایپ ہے جو محفوظ، قابل اعتماد اور قابل رسائی ہے۔", + "With Sefer, you can get a ride to your destination in minutes.": + "Sefer کے ساتھ، آپ منٹوں میں اپنی منزل تک سواری حاصل کر سکتے ہیں۔", + "Sefer is committed to safety, and all of our captains are carefully screened and background checked.": + "سیفر حفاظت کے لیے پرعزم ہے، اور ہمارے تمام کپتانوں کی احتیاط سے اسکریننگ اور پس منظر کی جانچ پڑتال کی جاتی ہے۔", + "To Home": "گھر تک", + "Home Saved": "گھر محفوظ ہو گیا۔", + "Destination selected": "منزل منتخب کر لی گئی۔", + "Now select start pick": "اب اسٹارٹ پک کو منتخب کریں۔", + "Pick from map": "نقشے سے چنیں۔", + "Click here point": "یہاں پوائنٹ پر کلک کریں۔", + "No Car in your site. Sorry!": + "آپ کی سائٹ پر کوئی کار نہیں ہے۔ معذرت!", + "Nearest Car for you about": "آپ کے لیے قریب ترین کار", + "N/A": "N / A", + "From :": "منجانب:", + "Get Details of Trip": "سفر کی تفصیلات حاصل کریں۔", + "If you want add stop click here": + "اگر آپ اسٹاپ شامل کرنا چاہتے ہیں تو یہاں کلک کریں۔", + "Driver": "ڈرائیور", + "Where you want go": "جہاں آپ جانا چاہتے ہیں۔", + "My Card": "میرا کارڈ", + "Start Record": "ریکارڈ شروع کریں۔", + "Wallet": "پرس", + "History of Trip": "سفر کی تاریخ", + "Helping Center": "امدادی مرکز", + "Record saved": "ریکارڈ محفوظ ہو گیا۔", + "Trips recorded": "دوروں کو ریکارڈ کیا گیا۔", + "Select Your Country": "اپنے ملک کا انتخاب کریں", + "To ensure you receive the most accurate information for your location, please select your country below. This will help tailor the app experience and content to your country.": + "اس بات کو یقینی بنانے کے لیے کہ آپ اپنے مقام کی درست ترین معلومات حاصل کریں، براہ کرم نیچے اپنا ملک منتخب کریں۔ اس سے ایپ کے تجربے اور مواد کو آپ کے ملک کے مطابق بنانے میں مدد ملے گی۔", + "Are you sure to delete recorded files": + "کیا آپ یقینی طور پر ریکارڈ شدہ فائلوں کو حذف کرنا چاہتے ہیں؟", + "Select recorded trip": "ریکارڈ شدہ سفر کو منتخب کریں۔", + "Card Number": "کارڈ نمبر", + "Hi, Where to": "ہیلو، کہاں؟", + "Pick your destination from Map": "نقشہ سے اپنی منزل کا انتخاب کریں۔", + "Add Stops": "اسٹاپس شامل کریں۔", + "Get Direction": "سمت حاصل کریں۔", + "Add Location": "مقام شامل کریں", + "Switch Rider": "سوئچ رائڈر", + "You will arrive to your destination after timer end.": + "ٹائمر ختم ہونے کے بعد آپ اپنی منزل پر پہنچ جائیں گے۔", + "You can cancel trip": "آپ سفر منسوخ کر سکتے ہیں۔", + "The driver waitting you in picked location .": + "ڈرائیور منتخب جگہ پر آپ کا انتظار کر رہا ہے۔", + "Pay with Your": "اپنے ساتھ ادائیگی کریں۔", + "Pay with Credit Card": "کریڈٹ کارڈ سے ادائیگی کریں۔", + "Payment History": "ادائیگی کی تاریخ", + "Show Promos to Charge": "چارج کرنے کے لیے پروموز دکھائیں۔", + "Point": "نقطہ", + "Driver Wallet": "ڈرائیور والیٹ", + "Total Points is": "کل پوائنٹس ہیں۔", + "Total Budget from trips is": "دوروں سے کل بجٹ ہے۔", + "Total Amount:": "کل رقم:", + "Total Budget from trips by": "بذریعہ دوروں سے کل بجٹ", + "Credit card is": "کریڈٹ کارڈ ہے۔", + "بطاقة الائتمان هي": "بطاقة الاطمان هي", + "This amount for all trip I get from Passengers": + "یہ رقم تمام ٹرپ کے لیے مجھے مسافروں سے ملتی ہے۔", + "Pay from my budget": "میرے بجٹ سے ادائیگی کریں۔", + "This amount for all trip I get from Passengers and Collected For me in": + "تمام ٹرپ کے لیے یہ رقم مجھے مسافروں سے ملتی ہے اور میرے لیے جمع کی جاتی ہے۔", + "You can buy points from your budget": + "آپ اپنے بجٹ سے پوائنٹس خرید سکتے ہیں۔", + "insert amount": "رقم ڈالیں", + "You can buy Points to let you online": + "آپ آن لائن ہونے کے لیے پوائنٹس خرید سکتے ہیں۔", + "by this list below": "ذیل میں اس فہرست کی طرف سے", + "من خلال القائمة أدناه": "من خلال القائمة أدنا", + "Create Wallet to receive your money": + "اپنی رقم وصول کرنے کے لیے والٹ بنائیں", + "Enter your feedback here": "اپنی رائے یہاں درج کریں۔", + "Please enter your feedback.": "براہ کرم اپنی رائے درج کریں۔", + "Feedback": "تاثرات", + "Submit": "جمع کرائیں", + "Click here to Show it in Map": + "اسے نقشے میں دکھانے کے لیے یہاں کلک کریں۔", + "Canceled": "منسوخ", + "Type your Email": "اپنا ای میل ٹائپ کریں۔", + "No I want": "نہیں میں چاہتا ہوں۔", + "Email is": "ای میل ہے۔", + "Phone Number is": "فون نمبر ہے۔", + "Date of Birth is": "تاریخ پیدائش ہے۔", + "Sex is": "جنس ہے۔", + "Car Details": "کار کی تفصیلات", + "VIN is": "VIN ہے۔", + "Color is": "رنگ ہے۔", + "Make is": "بنانا ہے", + "Model is": "ماڈل ہے۔", + "Year is": "سال ہے۔", + "Expiration Date": "میعاد ختم ہونے کی تاریخ", + "Edit Your data": "اپنے ڈیٹا میں ترمیم کریں۔", + "write vin for your car": "اپنی گاڑی کے لیے vin لکھیں۔", + "VIN": "VIN", + "write Color for your car": "اپنی گاڑی کا رنگ لکھیں۔", + "write Make for your car": "اپنی کار کے لیے بنائیں لکھیں۔", + "write Model for your car": "اپنی گاڑی کا ماڈل لکھیں۔", + "write Year for your car": "اپنی گاڑی کے لیے سال لکھیں۔", + "write Expiration Date for your car": + "اپنی کار کی میعاد ختم ہونے کی تاریخ لکھیں۔", + "Tariffs": "ٹیرف", + "Minimum fare": "کم از کم کرایہ", + "Maximum fare": "زیادہ سے زیادہ کرایہ", + "Flag-down fee": "فلیگ ڈاؤن فیس", + "Including Tax": "ٹیکس سمیت", + "BookingFee": "بکنگ فیس", + "Morning": "صبح", + "from 07:30 till 10:30 (Thursday, Friday, Saturday, Monday)": + "07:30 سے ​​10:30 تک (جمعرات، جمعہ، ہفتہ، پیر)", + "Evening": "شام", + "from 12:00 till 15:00 (Thursday, Friday, Saturday, Monday)": + "12:00 سے 15:00 تک (جمعرات، جمعہ، ہفتہ، پیر)", + "Night": "رات", + "You have in account": "آپ کے پاس اکاؤنٹ ہے۔", + "Select Country": "ملک کا انتخاب کیجئے", + "Ride Today :": "آج ہی سواری کریں:", + "After this period": "اس مدت کے بعد", + "You can\"t cancel!": "آپ منسوخ نہیں کر سکتے!", + "لا تستطيع الغاء الرحله": "لا استطيع الغاء الرحله", + "from 23:59 till 05:30": "23:59 سے 05:30 تک", + "Rate Driver": "ڈرائیور کو ریٹ کریں۔", + "Total Cost is": "کل لاگت ہے۔", + "Write note": "نوٹ لکھیں۔", + "Time to arrive": "پہنچنے کا وقت", + "Ride Summaries": "سواری کے خلاصے", + "Total Cost": "کل لاگت", + "Average of Hours of": "کے گھنٹوں کی اوسط", + "is ON for this month": "اس مہینے کے لیے آن ہے۔", + "Days": "دن", + "Total Hours on month": "مہینے پر کل گھنٹے", + "Counts of Hours on days": "دنوں میں گھنٹوں کی گنتی", + "OrderId": "آرڈر کی شناخت", + "created time": "وقت پیدا کیا", + "Speed Over": "سپیڈ اوور", + "I will slow down": "میں سست ہو جاؤں گا۔", + "Map Passenger": "نقشہ مسافر", + "Be Slowly": "آہستہ ہو جاؤ", + "If you want to make Google Map App run directly when you apply order": + "اگر آپ آرڈر اپلائی کرتے وقت گوگل میپ ایپ کو براہ راست چلانا چاہتے ہیں۔", + "You can change the language of the app": + "آپ ایپ کی زبان تبدیل کر سکتے ہیں۔", + "Your Budget less than needed": "آپ کا بجٹ ضرورت سے کم ہے۔", + "You can change the Country to get all features": + "تمام خصوصیات حاصل کرنے کے لیے آپ ملک کو تبدیل کر سکتے ہیں۔", + "Change Country": "ملک تبدیل کیجئے" + }, + "hi": { + "Sign In by Apple": "Apple द्वारा साइन इन करें", + "Sign In by Google": "Google द्वारा साइन इन करें", + "How do I request a ride?": "मैं सवारी का अनुरोध कैसे करूँ?", + "Step-by-step instructions on how to request a ride through the Sefer app.": + "सेफ़र ऐप के माध्यम से सवारी का अनुरोध कैसे करें, इस पर चरण-दर-चरण निर्देश।", + "What types of vehicles are available?": + "किस प्रकार के वाहन उपलब्ध हैं?", + "Sefer offers a variety of vehicle options to suit your needs, including economy, comfort, and luxury. Choose the option that best fits your budget and passenger count.": + "सेफ़र आपकी आवश्यकताओं के अनुरूप विभिन्न प्रकार के वाहन विकल्प प्रदान करता है, जिनमें किफायती, आराम और विलासिता शामिल हैं। वह विकल्प चुनें जो आपके बजट और यात्री संख्या के लिए सबसे उपयुक्त हो।", + "How can I pay for my ride?": + "मैं अपनी सवारी के लिए भुगतान कैसे कर सकता हूँ?", + "Sefer offers multiple payment methods for your convenience. Choose between cash payment or credit/debit card payment during ride confirmation.": + "सेफ़र आपकी सुविधा के लिए कई भुगतान विधियाँ प्रदान करता है। सवारी की पुष्टि के दौरान नकद भुगतान या क्रेडिट/डेबिट कार्ड भुगतान के बीच चयन करें।", + "Can I cancel my ride?": "क्या मैं अपनी यात्रा रद्द कर सकता हूँ?", + "Yes, you can cancel your ride under certain conditions (e.g., before driver is assigned). See the Sefer cancellation policy for details.": + "हां, आप कुछ शर्तों के तहत अपनी सवारी रद्द कर सकते हैं (उदाहरण के लिए, ड्राइवर नियुक्त होने से पहले)। विवरण के लिए सेफ़र रद्दीकरण नीति देखें।", + "Driver Registration & Requirements": "ड्राइवर पंजीकरण और आवश्यकताएँ", + "How can I register as a driver?": + "मैं ड्राइवर के रूप में कैसे पंजीकरण कर सकता हूँ?", + "What are the requirements to become a driver?": + "ड्राइवर बनने के लिए क्या आवश्यकताएँ हैं?", + "Visit our website or contact Sefer support for information on driver registration and requirements.": + "ड्राइवर पंजीकरण और आवश्यकताओं के बारे में जानकारी के लिए हमारी वेबसाइट पर जाएँ या सेफ़र समर्थन से संपर्क करें।", + "How do I communicate with the other party (passenger/driver)?": + "मैं दूसरे पक्ष (यात्री/चालक) से कैसे संवाद करूँ?", + "Sefer provides in-app chat functionality to allow you to communicate with your driver or passenger during your ride.": + "सेफ़र आपको अपनी यात्रा के दौरान अपने ड्राइवर या यात्री के साथ संवाद करने की अनुमति देने के लिए इन-ऐप चैट कार्यक्षमता प्रदान करता है।", + "What safety measures does Sefer offer?": + "सेफ़र कौन से सुरक्षा उपाय पेश करता है?", + "Sefer prioritizes your safety. We offer features like driver verification, in-app trip tracking, and emergency contact options.": + "सेफ़र आपकी सुरक्षा को प्राथमिकता देता है। हम ड्राइवर सत्यापन, इन-ऐप ट्रिप ट्रैकिंग और आपातकालीन संपर्क विकल्प जैसी सुविधाएं प्रदान करते हैं।", + "Frequently Questions": "बारंबार प्रश्न", + "User does not exist.": "उपभोगकर्ता मौजूद नहीं।", + "We need your phone number to contact you and to help you.": + "आपसे संपर्क करने और आपकी सहायता करने के लिए हमें आपके फ़ोन नंबर की आवश्यकता है।", + "You will recieve code in sms message": + "आपको एसएमएस संदेश में कोड प्राप्त होगा", + "Please enter": "कृपया दर्ज करें", + "We need your phone number to contact you and to help you receive orders.": + "आपसे संपर्क करने और ऑर्डर प्राप्त करने में सहायता के लिए हमें आपके फ़ोन नंबर की आवश्यकता है।", + "The full name on your criminal record does not match the one on your driver’s license. Please verify and provide the correct documents.": + "आपके आपराधिक रिकॉर्ड पर पूरा नाम आपके ड्राइवर के लाइसेंस से मेल नहीं खाता है। कृपया सत्यापित करें और सही दस्तावेज़ प्रदान करें।", + "The national number on your driver’s license does not match the one on your ID document. Please verify and provide the correct documents.": + "आपके ड्राइवर के लाइसेंस पर मौजूद राष्ट्रीय नंबर आपके आईडी दस्तावेज़ पर मौजूद नंबर से मेल नहीं खाता है। कृपया सत्यापित करें और सही दस्तावेज़ प्रदान करें।", + "Capture an Image of Your Criminal Record": + "अपने आपराधिक रिकॉर्ड की एक छवि कैप्चर करें", + "IssueDate": "जारी करने की तिथि", + "Capture an Image of Your car license front": + "अपने कार लाइसेंस के सामने की छवि कैप्चर करें", + "Capture an Image of Your ID Document front": + "अपने आईडी दस्तावेज़ के सामने एक छवि कैप्चर करें", + "NationalID": "राष्ट्रीय पहचान पत्र", + "FullName": "पूरा नाम", + "InspectionResult": "जाँच के नतीजे", + "Criminal Record": "आपराधिक रिकॉर्ड", + "The email or phone number is already registered.": + "ईमेल या फ़ोन नंबर पहले से पंजीकृत है.", + "To become a ride-sharing driver on the Sefer app, you need to upload your driver\"s license, ID document, and car registration document. Our AI system will instantly review and verify their authenticity in just 2-3 minutes. If your documents are approved, you can start working as a driver on the Sefer app. Please note, submitting fraudulent documents is a serious offense and may result in immediate termination and legal consequences.": + "सेफ़र ऐप पर राइड-शेयरिंग ड्राइवर बनने के लिए, आपको अपने ड्राइवर का लाइसेंस, आईडी दस्तावेज़ और कार पंजीकरण दस्तावेज़ अपलोड करना होगा। हमारा एआई सिस्टम केवल 2-3 मिनट में तुरंत उनकी प्रामाणिकता की समीक्षा और सत्यापन करेगा। यदि आपके दस्तावेज़ स्वीकृत हैं, तो आप सेफ़र ऐप पर ड्राइवर के रूप में काम करना शुरू कर सकते हैं, कृपया ध्यान दें, धोखाधड़ी वाले दस्तावेज़ जमा करना एक गंभीर अपराध है और इसके परिणामस्वरूप तत्काल समाप्ति और कानूनी परिणाम हो सकते हैं।", + "Documents check": "दस्तावेज़ जांचें", + "Driver's License": "ड्राइवर का लाइसेंस", + "License Type": "लाइसेंस के प्रकार", + "National Number": "नेशनल संख्या", + "Name (Arabic)": "नाम (अरबी)", + "Name (English)": "नाम (अंग्रेजी)", + "Address": "पता", + "Issue Date": "जारी करने की तिथि", + "Expiry Date": "समाप्ति तिथि", + "License Categories": "लाइसेंस श्रेणियाँ", + "driver_license": "चालक लाइसेंस", + "Capture an Image of Your Driver License": + "अपने ड्राइवर लाइसेंस की एक छवि कैप्चर करें", + "ID Documents Back": "आईडी दस्तावेज़ वापस", + "National ID": "राष्ट्रीय पहचान पत्र", + "Occupation": "पेशा", + "Gender": "लिंग", + "Religion": "धर्म", + "Marital Status": "वैवाहिक स्थिति", + "Full Name (Marital)": "पूरा नाम (वैवाहिक)", + "Expiration Date": "समाप्ति तिथि", + "Capture an Image of Your ID Document Back": + "अपने आईडी दस्तावेज़ की एक छवि वापस कैप्चर करें", + "ID Documents Front": "आईडी दस्तावेज़ सामने", + "First Name": "पहला नाम", + "CardID": "कार्ड आईडी", + "Full Name": "पूरा नाम", + "Vehicle Details Front": "वाहन विवरण सामने", + "Plate Number": "थाली संख्या", + "Owner Name": "मालिक का नाम", + "Vehicle Details Back": "वाहन विवरण वापस", + "Make": "बनाना", + "Model": "नमूना", + "Year": "वर्ष", + "Chassis": "हवाई जहाज़ के पहिये", + "Color": "रंग", + "Displacement": "विस्थापन", + "Fuel": "ईंधन", + "Tax Expiry Date": "कर समाप्ति तिथि", + "Inspection Date": "निरीक्षण की दिनांक", + "Capture an Image of Your car license back": + "अपने कार लाइसेंस की एक छवि वापस कैप्चर करें", + "Capture an Image of Your Driver’s License": + "अपने ड्राइवर के लाइसेंस की एक छवि कैप्चर करें", + "Sign in with Google for easier email and name entry": + "आसान ईमेल और नाम प्रविष्टि के लिए Google से साइन इन करें", + "You will choose allow all the time to be ready receive orders": + "आप ऑर्डर प्राप्त करने के लिए हर समय तैयार रहने की अनुमति देना चुनेंगे", + "Welcome to Sefer!": "सेफ़र में आपका स्वागत है!", + "Get to your destination quickly and easily.": + "जल्दी और आसानी से अपने गंतव्य तक पहुंचें।", + "Enjoy a safe and comfortable ride.": + "सुरक्षित और आरामदायक सवारी का आनंद लें।", + "Choose Language": "भाषा चुनें", + "Login": "लॉग इन करें", + "Pay with Wallet": "वॉलेट से भुगतान करें", + "Invalid MPIN": "अमान्य एमपिन", + "Invalid OTP": "अमान्य ओटीपी", + "Enter your email address": "अपना ईमेल पता दर्ज करें", + "Please enter Your Email.": "अपना ईमेल दर्ज करें।", + "Enter your phone number": "अपना फोन नंबर डालें", + "Please enter your phone number.": "कृपया अपना फोन नंबर दर्ज करें।", + "Please enter Your Password.": "अपना पासवर्ड दर्ज करें।", + "Submit": "जमा करना", + "if you dont have account": "यदि आपके पास खाता नहीं है", + "Register": "पंजीकरण करवाना", + "Accept Ride's Terms & Review Privacy Notice": + "सवारी की शर्तें स्वीकार करें और गोपनीयता सूचना की समीक्षा करें", + "By selecting 'I Agree' below, I have reviewed and agree to the Terms of Use and acknowledge the Privacy Notice. I am at least 18 years of age.": + "नीचे 'मैं सहमत हूं' का चयन करके, मैंने उपयोग की शर्तों की समीक्षा की है और उनसे सहमत हूं और गोपनीयता सूचना को स्वीकार करता हूं। मैं कम से कम 18 साल का हूँ।", + "I Agree": "मैं सहमत हूं", + "First name": "पहला नाम", + "Enter your first name": "अपना पहला नाम दर्ज करें", + "Please enter your first name.": "कृपया अपना पहला नाम दें।", + "Last name": "उपनाम", + "Enter your last name": "अपना अंतिम नाम दर्ज करें", + "Please enter your last name.": "कृपया अपना अंतिम नाम दर्ज करें।", + "City": "शहर", + "Please enter your City.": "कृपया अपना शहर दर्ज करें.", + "Male": "पुरुष", + "Female": "महिला", + "Verify Email": "ईमेल सत्यापित करें", + "We sent 5 digit to your Email provided": + "हमने आपके ईमेल पर 5 अंक भेजे हैं", + "5 digit": "5 अंक", + "Send Verification Code": "सत्यापन कोड भेजें", + "Your Ride Duration is": "आपकी सवारी अवधि है", + "You will be thier in": "आप वहां होंगे", + "You trip distance is": "आपकी यात्रा की दूरी है", + "Fee is": "शुल्क है", + "From :": "से :", + "To :": "को :", + "Add Promo": "प्रोमो जोड़ें", + "Confirm Selection": "चयन की पुष्टि करें", + "distance is": "दूरी है", + "duration is": "अवधि है", + "I don't need a ride anymore": "मुझे अब किसी सवारी की जरूरत नहीं है", + "I was just trying the application": "मैं बस एप्लिकेशन आज़मा रहा था", + "No driver accepted my request": + "किसी ड्राइवर ने मेरा अनुरोध स्वीकार नहीं किया", + "I added the wrong pick-up/drop-off location": + "मैंने गलत पिक-अप/ड्रॉप-ऑफ स्थान जोड़ा है", + "I don't have a reason": "मेरे पास कोई कारण नहीं है", + "Other": "अन्य", + "Can we know why you want to cancel Ride ?": + "क्या हम जान सकते हैं कि आप सवारी क्यों रद्द करना चाहते हैं?", + "Cancel Ride": "सवारी रद्द करें", + "Add Payment Method": "भुगतान विधि जोड़ें", + "Your Wallet balance is": "आपका वॉलेट बैलेंस है", + "Ride Wallet": "सवारी बटुआ", + "Payment Method": "भुगतान विधि", + "Type here Place": "यहां टाइप करें Place", + "Are You sure to ride to": "क्या आप निश्चित रूप से यात्रा करेंगे?", + "Confirm": "पुष्टि करना", + "Back": "पीछे", + "You are Delete": "आप हटाएं हैं", + "Deleted": "हटाए गए", + "You Dont Have Any places yet !": + "आपके पास अभी तक कोई स्थान नहीं है!", + "Favorite Places": "पसंदीदा स्थान", + "From : Current Location": "प्रेषक : वर्तमान स्थान", + "Where to": "कहाँ जाना है", + "Notifications": "सूचनाएं", + "Profile": "प्रोफ़ाइल", + "Home": "घर", + "My Cared": "मेरी परवाह", + "Add Card": "कार्ड जोड़ें", + "Add Credit Card": "क्रेडिट कार्ड जोड़ें", + "Please enter the cardholder name": + "कृपया कार्डधारक का नाम दर्ज करें", + "Please enter the expiry date": "कृपया समाप्ति तिथि दर्ज करें", + "Please enter the CVV code": "कृपया सीवीवी कोड दर्ज करें", + "Go To Favorite Places": "पसंदीदा स्थानों पर जाएँ", + "Go to this Target": "इस लक्ष्य पर जाएँ", + "My Profile": "मेरी प्रोफाइल", + "Sign Out": "साइन आउट", + "Home Page": "होम पेज", + "Are you want to go to this site": + "क्या आप इस साइट पर जाना चाहते हैं", + "MyLocation": "मेरा स्थान", + "my location": "मेरा स्थान", + "Target": "लक्ष्य", + "Update": "अद्यतन", + "You Should choose rate figure": "आपको दर आंकड़ा चुनना चाहिए", + "Login Captin": "कैप्टन लॉगिन करें", + "Register Captin": "कैप्टन रजिस्टर करें", + "Send Verfication Code": "सत्यापन कोड भेजें", + "KM": "किमी", + "End Ride": "सवारी समाप्त करें", + "Minute": "मिनट", + "Go to passenger Location now": "अब यात्री स्थान पर जाएं", + "Duration of the Ride is": "सवारी की अवधि है", + "Distance of the Ride is": "सवारी की दूरी है", + "Name of the Passenger is": "यात्री का नाम है", + "Hello this is Captain": "नमस्ते, मैं कैप्टन हूं", + "Start the Ride": "सवारी शुरू करें", + "Please Wait If passenger want To Cancel!": + "यदि यात्री रद्द करना चाहता है तो कृपया प्रतीक्षा करें!", + "Total Duration:": "कुल अवधि:", + "Active Duration:": "सक्रिय अवधि:", + "Waiting for Captin ...": "कैप्टन का इंतजार...", + "Age is": "उम्र है", + "Rating is": "रेटिंग है", + "to arrive you.": "आप तक पहुँचने के लिए.", + "Order History": "आदेश इतिहास", + "My Wallet": "मेरा बटुआ", + "Tariff": "टैरिफ़", + "Settings": "समायोजन", + "Feed Back": "प्रतिक्रिया", + "Promos": "प्रोमो", + "Please enter a valid 16-digit card number": + "कृपया वैध 16-अंकीय कार्ड नंबर दर्ज करें", + "Add Phone": "फ़ोन जोड़ें", + "Please enter a phone number": "कृपया एक फ़ोन नंबर दर्ज करें", + "You dont Add Emergency Phone Yet!": + "आपने अभी तक आपातकालीन फ़ोन नहीं जोड़ा है!", + "You will arrive to your destination after": + "इसके बाद आप अपने गंतव्य पर पहुंचेंगे", + "You can cancel Ride now": "अब आप राइड रद्द कर सकते हैं", + "You Can cancel Ride After Captain did not come in the time": + "कैप्टन के समय पर नहीं आने पर आप राइड कैंसिल कर सकते हैं", + "If you in Car Now. Press Start The Ride": + "यदि आप अभी कार में हैं। सवारी प्रारंभ करें दबाएँ", + "You Dont Have Any amount in": "आपके पास कोई राशि नहीं है", + "Wallet!": "बटुआ!", + "You Have": "आपके पास", + "Save Credit Card": "क्रेडिट कार्ड सहेजें", + "Show Promos": "प्रोमो दिखाएँ", + "10 and get 4% discount": "10 और पाएं 4% छूट", + "20 and get 6% discount": "20 और पाएं 6% छूट", + "40 and get 8% discount": "40 और पाएं 8% की छूट", + "100 and get 11% discount": "100 और पाएं 11% छूट", + "Pay with Your PayPal": "अपने PayPal से भुगतान करें", + "You will choose one of above !": + "आप उपरोक्त में से किसी एक को चुनेंगे!", + "Cancel": "रद्द करना", + "Delete My Account": "मेरा एकाउंट हटा दो", + "Edit Profile": "प्रोफ़ाइल संपादित करें", + "Name": "नाम", + "Update Gender": "लिंग अद्यतन करें", + "Education": "शिक्षा", + "Update Education": "शिक्षा को अद्यतन करें", + "Employment Type": "रोजगार के प्रकार", + "SOS Phone": "एसओएस फ़ोन", + "High School Diploma": "हाई स्कूल डिप्लोमा", + "Associate Degree": "एसोसिएट डिग्री", + "Bachelor's Degree": "स्नातक की डिग्री", + "Master's Degree": "स्नातकोत्तर उपाधि", + "Doctoral Degree": "डॉक्टर की डिग्री", + "Promos For today": "आज के लिए प्रोमो", + "Copy this Promo to use it in your Ride!": + "अपनी यात्रा में उपयोग करने के लिए इस प्रोमो को कॉपी करें!", + "To change some Settings": "कुछ सेटिंग्स बदलने के लिए", + "To change Language the App": "ऐप में भाषा बदलने के लिए", + "Order Request Page": "आदेश अनुरोध पृष्ठ", + "Rouats of Trip": "यात्रा के मार्ग", + "Passenger Name is": "यात्री का नाम है", + "Total From Passenger is": "यात्री से कुल है", + "Duration To Passenger is": "यात्री को अवधि है", + "Distance To Passenger is": "यात्री से दूरी है", + "Total For You is": "आपके लिए कुल है", + "Distance is": "दूरी है", + "KM": "किमी", + "Duration of Trip is": "यात्रा की अवधि है", + "Minutes": "मिनट", + "Apply Order": "आदेश लागू करें", + "Refuse Order": "आदेश अस्वीकार करें", + "Rate Captain": "कैप्टन को रेट करें", + "Enter your Note": "अपना नोट दर्ज करें", + "Type something...": "कुछ लिखें...", + "Submit rating": "रेटिंग सबमिट करें", + "Rate Passenger": "यात्री दर", + "Ride Summary": "सवारी सारांश", + "welcome_message": "स्वागत_संदेश", + "app_description": "ऐप_विवरण", + "get_to_destination": "गंतव्य तक पहुंचें", + "get_a_ride": "गाड़ी चलाकर देखें", + "safe_and_comfortable": "सुरक्षित_और_आरामदायक", + "committed_to_safety": "सुरक्षा के लिए प्रतिबद्ध", + "Driver Applied the Ride for You": + "ड्राइवर ने आपके लिए सवारी लागू की", + "Show latest promo": "नवीनतम प्रोमो दिखाएँ", + "Cancel Trip": "यात्रा रद्द करें", + "Passenger Cancel Trip": "यात्री ने यात्रा रद्द कर दी", + "Please stay on the picked point.": + "कृपया चुने गए बिंदु पर बने रहें।", + "Trip is Begin": "यात्रा आरंभ है", + "Hi ,I will go now": "नमस्ते, मैं अब जाऊँगा", + "Passenger come to you": "यात्री तुम्हारे पास आओ", + "Hi ,I Arrive your site": "नमस्ते, मैं आपकी साइट पर पहुंचा हूं", + "Driver Finish Trip": "ड्राइवर यात्रा समाप्त करें", + "you will pay to Driver": "आप ड्राइवर को भुगतान करेंगे", + "Driver Cancel Your Trip": "ड्राइवर अपनी यात्रा रद्द करें", + "you will pay to Driver you will be pay the cost of driver time look to your SEFER Wallet": + "आप ड्राइवर को भुगतान करेंगे, आपको ड्राइवर के समय की लागत का भुगतान किया जाएगा, अपने SEFER वॉलेट को देखें", + "I will go now": "अब मै जाऊँगी", + "You Have Tips": "आपके पास युक्तियाँ हैं", + "tips": "सुझावों", + "Total is": "कुल है", + "الْمَجْمُوع هُوَ": "الْمَجْمُوع هُوَ", + "No,I want": "नहीं, मैं चाहता हूं", + "Your fee is": "आपकी फीस है", + "Do you want to pay Tips for this Driver": + "क्या आप इस ड्राइवर के लिए टिप्स का भुगतान करना चाहते हैं?", + "Tip is": "टिप है", + "Tip is": "टिप है", + "Camera Access Denied.": "कैमरा एक्सेस अस्वीकृत.", + "Open Settings": "खुली सेटिंग", + "GPS Required Allow !.": "जीपीएस आवश्यक अनुमति दें!", + "Your Account is Deleted": "आपका खाता हटा दिया गया है", + "Are you sure to delete your account?": + "क्या आप निश्चित रूप से अपना खाता हटाना चाहते हैं?", + "Your data will be erased after 2 weeks": + "2 सप्ताह के बाद आपका डेटा मिटा दिया जाएगा", + "And you will can't return to use app after 1 month": + "और आप 1 महीने के बाद ऐप का उपयोग वापस नहीं कर पाएंगे", + "وَلَن تَسْتَطِيع اسْتِخْدَام التَّطْبِيق مَرَّة أُخْرَى بَعْد شَهْر": + "और देखें هْر", + "Enter Your First Name": "अपना पहला नाम दर्ज करें", + "Are you Sure to LogOut?": + "क्या आप निश्चित रूप से लॉगआउट करना चाहते हैं?", + "Email Wrong": "ईमेल ग़लत", + "Email you inserted is Wrong.": "आपके द्वारा डाला गया ईमेल गलत है.", + "You have finished all times": "आपने सभी समय समाप्त कर दिए हैं", + "if you want help you can email us here": + "यदि आप सहायता चाहते हैं तो आप हमें यहां ईमेल कर सकते हैं", + "Thanks": "धन्यवाद", + "Email Us": "हमें ईमेल करें", + "I cant register in your app in face detection": + "मैं चेहरे की पहचान में आपके ऐप में पंजीकरण नहीं कर सकता", + "Hi": "नमस्ते", + "No face detected": "कोई चेहरा नहीं मिला", + "Image detecting result is": "छवि का पता लगाने का परिणाम है", + "from 3 times Take Attention": "3 बार से ध्यान दें", + "Be sure for take accurate images please": + "कृपया सटीक चित्र लेना सुनिश्चित करें", + "You have": "आपके पास", + "لَدَيْك": "لَدَيْك", + "image verified": "छवि सत्यापित", + "Next": "अगला", + "There is no help Question here": "यहां कोई सहायता प्रश्न नहीं है", + "Call End": "कॉल समाप्त", + "You dont have Points": "आपके पास अंक नहीं हैं", + "You Are Stopped For this Day !": "आपको इस दिन के लिए रोका गया है!", + "You must be charge your Account": "आपको अपना खाता चार्ज करना होगा", + "You Refused 3 Rides this Day that is the reason": + "आपने इस दिन 3 सवारी से इनकार कर दिया, यही कारण है", + "See you Tomorrow!": "कल मिलते हैं!", + "لِقَائِنَا غَدًا!": "لِقَائِنَا غَدًا!", + "Recharge my Account": "मेरा खाता रिचार्ज करें", + "Ok , See you Tomorrow": "ठीक है, कल मिलते हैं", + "You are Stopped": "आपको रोका गया है", + "Connected": "जुड़े हुए", + "Not Connected": "जुड़े नहीं हैं", + "Your are far from passenger location": "आप यात्री स्थान से दूर हैं", + "go to your passenger location before": + "पहले अपने यात्री स्थान पर जाएँ", + "Passenger cancel trip": "यात्री ने यात्रा रद्द कर दी", + "يُلْغِي الرَّاكِب الرِّحْلَة": "يُلْغِي الرَّاكِب الرِّحْلَة", + "You will get cost of your work for this trip": + "इस यात्रा के लिए आपको अपने काम की लागत मिलेगी", + "in your wallet": "आपके बटुए में", + "you gain": "आपको लाभ", + "Order Cancelled": "आदेश रद्द किया गया", + "Order Cancelled by Passenger": + "यात्री द्वारा ऑर्डर रद्द कर दिया गया", + "Success": "सफलता", + "Feedback data saved successfully": + "फ़ीडबैक डेटा सफलतापूर्वक सहेजा गया", + "No Promo for today .": "आज के लिए कोई प्रोमो नहीं.", + "Select your destination": "अपना गंतव्य चुनें", + "Search for your Start point": "अपना प्रारंभ बिंदु खोजें", + "Search for waypoint": "मार्गबिंदु खोजें", + "Current Location": "वर्तमान स्थान", + "Add Location 1": "स्थान 1 जोड़ें", + "You must Verify email !.": "आपको ईमेल सत्यापित करना होगा!", + "Cropper": "कबूतर", + "Saved Sucssefully": "सफलतापूर्वक बचाया गया", + "Select Date": "तारीख़ चुनें", + "Birth Date": "जन्म तिथि", + "Ok": "ठीक है", + "the 500 points equal 30 JOD": "500 अंक 30 JOD के बराबर हैं", + "the 500 points equal 30 JOD for you": + "आपके लिए 500 अंक 30 जेओडी के बराबर हैं", + "So go and gain your money": "तो जाओ और अपना पैसा हासिल करो", + "فَاسْتَحِقَّ فُلُوسَك وَاكْسِب النِّقَاط": + "فَاسْتَحِقَّ فُلُوسَك وَاكْسِب النِّقَاط", + "token updated": "टोकन अद्यतन किया गया", + "Add Location 2": "स्थान 2 जोड़ें", + "Add Location 3": "स्थान 3 जोड़ें", + "Add Location 4": "स्थान 4 जोड़ें", + "Waiting for your location": "आपके स्थान की प्रतीक्षा है", + "Search for your destination": "अपनी मंजिल खोजें", + "Hi! This is": "नमस्ते! यह है", + "I am using": "मैं उपयोग कर रहा हूँ", + "to ride with": "साथ घूमने के लिए", + "as the driver.": "ड्राइवर के रूप में.", + "is driving a": "एक चला रहा है", + "with license plate": "लाइसेंस प्लेट के साथ", + "I am currently located at": "मैं वर्तमान में स्थित हूँ", + "Please go to Car now": "कृपया अब कार पर जाएँ", + "If you need to reach me, please contact the driver directly at": + "यदि आपको मुझ तक पहुंचने की आवश्यकता है, तो कृपया सीधे ड्राइवर से संपर्क करें", + "No Car or Driver Found in your area.": + "आपके क्षेत्र में कोई कार या ड्राइवर नहीं मिला.", + "Please Try anther time": "कृपया अगली बार प्रयास करें", + "There no Driver Aplly your order sorry for that": + "वहां कोई ड्राइवर आपके ऑर्डर को लागू नहीं कर रहा है, इसके लिए क्षमा करें", + "Trip Cancelled": "यात्रा रद्द", + "The Driver Will be in your location soon .": + "ड्राइवर जल्द ही आपके स्थान पर होगा।", + "The distance less than 500 meter.": "500 मीटर से कम दूरी.", + "Promo End !": "प्रोमो समाप्त!", + "There is no notification yet": "अभी तक कोई अधिसूचना नहीं है", + "Use Touch ID or Face ID to confirm payment": + "भुगतान की पुष्टि के लिए टच आईडी या फेस आईडी का उपयोग करें", + "Contact us for any questions on your order.": + "अपने ऑर्डर पर किसी भी प्रश्न के लिए हमसे संपर्क करें।", + "Pyament Cancelled .": "भुगतान रद्द।", + "type here": "यहाँ टाइप करें", + "Scan Driver License": "ड्राइवर लाइसेंस स्कैन करें", + "Please put your licence in these border": + "कृपया अपना लाइसेंस इन सीमा में रखें", + "Camera not initialized yet": "कैमरा अभी प्रारंभ नहीं हुआ है", + "Take Image": "छवि ले लो", + "AI Page": "एआई पेज", + "Take Picture Of ID Card": "आईडी कार्ड की तस्वीर लें", + "Take Picture Of Driver License Card": + "ड्राइवर लाइसेंस कार्ड की तस्वीर लें", + "We are process picture please wait": + "हम प्रक्रिया चित्र हैं कृपया प्रतीक्षा करें", + "There is no data yet.": "अभी तक कोई डेटा नहीं है.", + "Name :": "नाम :", + "Drivers License Class:": "चालक लाइसेंस वर्ग:", + "Document Number:": "दस्तावेज़ संख्या:", + "Address:": "पता:", + "Height:": "ऊंचाई:", + "Expiry Date:": "समाप्ति तिथि:", + "Date of Birth:": "जन्म की तारीख:", + "You can\"t continue with us .": "आप हमारे साथ जारी नहीं रह सकते.", + "You should renew Driver license": + "आपको ड्राइवर लाइसेंस का नवीनीकरण कराना चाहिए", + "Detect Your Face": "अपना चेहरा पहचानें", + "Go to next step": "अगले चरण पर जाएँ", + "scan Car License.": "कार लाइसेंस स्कैन करें.", + "aاسْتِخْرَاج رُخْصَة السَّيَّارَة.": + "aاسْتِخْرَاج رُخْصَة السَّيَّارَة.", + "Name in arabic": "अरबी में नाम", + "Drivers License Class": "चालक लाइसेंस वर्ग", + "Date of Birth": "जन्म की तारीख", + "Age": "आयु", + "Lets check Car license": "आइए कार लाइसेंस की जांच करें", + "Car Kind": "कार प्रकार", + "Car Plate": "कार की प्लेट", + "Lets check License Back Face": "आइए लाइसेंस बैक फेस की जाँच करें", + "Car License Card": "कार लाइसेंस कार्ड", + "No image selected yet": "अभी तक कोई छवि चयनित नहीं है", + "Made :": "बनाया :", + "model :": "नमूना :", + "VIN :": "विन :", + "year :": "वर्ष :", + "ُExpire Date": "समाप्त होने की तिथि", + "Login Driver": "ड्राइवर लॉगिन करें", + "Password must br at least 6 character.": + "पासवर्ड कम से कम 6 अक्षर का होना चाहिए।", + "if you don\"t have account": "यदि आपके पास खाता नहीं है", + "Here recorded trips audio": + "यहां यात्राओं का ऑडियो रिकॉर्ड किया गया है", + "Register as Driver": "ड्राइवर के रूप में पंजीकरण करें", + "Privacy Notice": "गोपनीयता सूचना", + "By selecting 'I Agree' below, I have reviewed and agree to the Terms of Use and acknowledge the": + "नीचे 'मैं सहमत हूं' का चयन करके, मैंने उपयोग की शर्तों की समीक्षा कर ली है और उनसे सहमत हूं और स्वीकार करता हूं", + ". I am at least 18 years of age.": ". मैं कम से कम 18 साल का हूँ।", + "Log Out Page": "लॉग आउट पेज", + "Log Off": "लॉग ऑफ़", + "Register Driver": "ड्राइवर पंजीकृत करें", + "Verify Email For Driver": "ड्राइवर के लिए ईमेल सत्यापित करें", + "Admin DashBoard": "व्यवस्थापक डैशबोर्ड", + "Your name": "आपका नाम", + "your ride is applied": "आपकी सवारी लागू है", + "Your password": "आपका पासवर्ड", + "H and": "हाथ", + "LE": "ले", + "JOD": "जोड", + "m": "एम", + "We search nearst Driver to you": + "हम आपके निकटतम ड्राइवर की खोज करते हैं", + "please wait till driver accept your order": + "कृपया तब तक प्रतीक्षा करें जब तक ड्राइवर आपका आदेश स्वीकार न कर ले", + "No accepted orders? Try raising your trip fee to attract riders.": + "कोई स्वीकृत आदेश नहीं? सवारियों को आकर्षित करने के लिए अपनी यात्रा शुल्क बढ़ाने का प्रयास करें।", + "You should select one": "आपको एक का चयन करना चाहिए", + "The driver accept your order for": + "ड्राइवर आपका आदेश स्वीकार करता है", + "Increase Fee": "शुल्क बढ़ाएँ", + "No, thanks": "जी नहीं, धन्यवाद", + "The driver on your way": "ड्राइवर आपके रास्ते में है", + "Total price from": "से कुल कीमत", + "Order Details Speed": "ऑर्डर विवरण गति", + "Order Applied": "आदेश लागू", + "accepted your order": "आपका आदेश स्वीकार कर लिया", + "We regret to inform you that another driver has accepted this order.": + "हमें आपको यह बताते हुए खेद हो रहा है कि एक अन्य ड्राइवर ने यह आदेश स्वीकार कर लिया है।", + "Selected file:": "चयनित फ़ाइल:", + "Your trip cost is": "आपकी यात्रा की लागत है", + "this will delete all files from your device": + "यह आपके डिवाइस से सभी फ़ाइलें हटा देगा", + "you have a negative balance of": "आपके पास ऋणात्मक संतुलन है", + "in your": "आपके में", + "Exclusive offers and discounts always with the Sefer app": + "सेफ़र ऐप के साथ हमेशा विशेष ऑफ़र और छूट", + "Please go to Car Driver": "कृपया कार चालक के पास जाएँ", + "wallet due to a previous trip.": "पिछली यात्रा के कारण बटुआ।", + "Submit Question": "प्रश्न सबमिट करें", + "Please enter your Question.": "कृपया अपना प्रश्न दर्ज करें.", + "Help Details": "सहायता विवरण", + "No trip yet found": "अभी तक कोई यात्रा नहीं मिली", + "No Response yet.": "कोई उत्तर नहीं अब तक।", + "You Earn today is": "आप आज ही कमा सकते हैं", + "You Have in": "आपके पास है", + "Total points is": "कुल अंक है", + "Total Connection Duration:": "कुल कनेक्शन अवधि:", + "H and": "हाथ", + "Passenger name :": "यात्री का नाम :", + "Cost Of Trip IS": "यात्रा की लागत है", + "Arrival time": "आगमन का समय", + "arrival time to reach your point": + "अपनी बात तक पहुंचने के लिए आगमन का समय", + "For Speed and Delivery trips, the price is calculated dynamically. For Comfort trips, the price is based on time and distance": + "स्पीड और डिलीवरी ट्रिप के लिए, कीमत की गणना गतिशील रूप से की जाती है। आरामदायक यात्राओं के लिए, कीमत समय और दूरी पर आधारित होती है", + "Hello this is Driver": "नमस्ते, मैं ड्राइवर हूं", + "Is the Passenger in your Car ?": "क्या यात्री आपकी कार में है?", + "Please wait for the passenger to enter the car before starting the trip.": + "कृपया यात्रा शुरू करने से पहले यात्री के कार में प्रवेश करने की प्रतीक्षा करें।", + "No ,still Waiting.": "नहीं, अभी भी इंतज़ार है.", + "I arrive you": "मैं तुम्हारे पास पहुँचता हूँ", + "I Arrive your site": "मैं आपकी साइट पर पहुंचा हूं", + "You are not in near to passenger location": + "आप यात्री स्थान के निकट नहीं हैं", + "please go to picker location exactly": + "कृपया बिल्कुल पिकर स्थान पर जाएं", + "You Can Cancel Trip And get Cost of Trip From": + "आप यात्रा रद्द कर सकते हैं और यात्रा का खर्च प्राप्त कर सकते हैं", + "Are you sure to cancel?": + "क्या आप निश्चित रूप से रद्द करना चाहते हैं?", + "Yes": "हाँ", + "Insert Emergincy Number": "आपातकालीन नंबर डालें", + "Best choice for comfort car and flexible route and stops point": + "आरामदायक कार और लचीले मार्ग और स्टॉप पॉइंट के लिए सर्वोत्तम विकल्प", + "Insert": "डालना", + "This is for delivery or a motorcycle.": + "यह डिलीवरी या मोटरसाइकिल के लिए है।", + "This trip goes directly from your starting point to your destination for a fixed price. The driver must follow the planned route": + "यह यात्रा एक निश्चित कीमत पर आपके शुरुआती बिंदु से सीधे आपके गंतव्य तक जाती है। चालक को नियोजित मार्ग का पालन करना होगा", + "You can decline a request without any cost": + "आप बिना किसी लागत के किसी अनुरोध को अस्वीकार कर सकते हैं", + "Perfect for adventure seekers who want to experience something new and exciting": + "साहसिक चाहने वालों के लिए बिल्कुल सही जो कुछ नया और रोमांचक अनुभव करना चाहते हैं", + "My current location is:": "मेरा वर्तमान स्थान है:", + "and I have a trip on": "और मेरी एक यात्रा है", + "App with Passenger": "यात्री के साथ ऐप", + "مع الراكب": "और भी बहुत कुछ", + "You will be pay the cost to driver or we will get it from you on next trip": + "आपको ड्राइवर को लागत का भुगतान करना होगा या अगली यात्रा पर हम इसे आपसे प्राप्त करेंगे", + "Trip has Steps": "यात्रा के चरण हैं", + "Distance from Passenger to destination is": + "यात्री से गंतव्य तक की दूरी है", + "price is": "कीमत है", + "This ride type does not allow changes to the destination or additional stops": + "यह सवारी प्रकार गंतव्य में परिवर्तन या अतिरिक्त स्टॉप की अनुमति नहीं देता है", + "This price may be changed": "इस कीमत में बदलाव किया जा सकता है", + "No SIM card, no problem! Call your driver directly through our app. We use advanced technology to ensure your privacy.": + "कोई सिम कार्ड नहीं, कोई समस्या नहीं! हमारे ऐप के माध्यम से सीधे अपने ड्राइवर को कॉल करें। हम आपकी गोपनीयता सुनिश्चित करने के लिए उन्नत तकनीक का उपयोग करते हैं।", + "This ride type allows changes, but the price may increase": + "यह सवारी प्रकार परिवर्तन की अनुमति देता है, लेकिन कीमत बढ़ सकती है", + "message From passenger": "यात्री की ओर से संदेश", + "Select one message": "एक संदेश चुनें", + "My location is correct. You can search for me using the navigation app": + "मेरा स्थान सही है. आप नेविगेशन ऐप का उपयोग करके मुझे खोज सकते हैं", + "I'm waiting for you": "मैं आपका इंतज़ार कर रहा हूं", + "Hello, I'm at the agreed-upon location": + "नमस्ते, मैं सहमत स्थान पर हूं", + "We noticed the speed is exceeding 100 km/h. Please slow down for your safety. If you feel unsafe, you can share your trip details with a contact or call the police using the red SOS button.": + "हमने देखा कि गति 100 किमी/घंटा से अधिक है। कृपया अपनी सुरक्षा के लिए गति धीमी करें। यदि आप असुरक्षित महसूस करते हैं, तो आप अपनी यात्रा का विवरण किसी संपर्क के साथ साझा कर सकते हैं या लाल एसओएस बटन का उपयोग करके पुलिस को कॉल कर सकते हैं।", + "Warning: Speeding detected!": "चेतावनी: तेज़ गति का पता चला!", + "Please help! Contact me as soon as possible.": + "कृपया मदद करे! यथाशीघ्र मुझसे संपर्क करें.", + "Share Trip Details": "यात्रा विवरण साझा करें", + "Car Plate is": "कार प्लेट है", + "the 300 points equal 300 L.E for you": + "आपके लिए 300 अंक 300 एल.ई. के बराबर हैं", + "So go and gain your money": "तो जाओ और अपना पैसा हासिल करो", + "the 300 points equal 300 L.E": "300 अंक 300 एल.ई. के बराबर हैं", + "The payment was not approved. Please try again.": + "भुगतान स्वीकृत नहीं हुआ. कृपया पुन: प्रयास करें।", + "Payment Failed": "भुगतान विफल रही", + "Error": "गलती", + "An error occurred during the payment process.": + "भुगतान प्रक्रिया के दौरान एक त्रुटि उत्पन्न हुई.", + "The payment was approved.": "भुगतान स्वीकृत किया गया।", + "Payment Successful": "भुगतान सफल", + "No ride found yet": "अभी तक कोई सवारी नहीं मिली", + "Accept Order": "आदेश स्वीकार करें", + "reject your order.": "अपना आदेश अस्वीकार करें.", + "Bottom Bar Example": "निचला बार उदाहरण", + "Driver phone": "ड्राइवर का फ़ोन", + "Statistics": "आंकड़े", + "Origin": "मूल", + "Destination": "गंतव्य", + "Driver Name": "चालक का नाम", + "Driver Car Plate": "ड्राइवर कार प्लेट", + "Available for rides": "सवारी के लिए उपलब्ध है", + "Scan Id": "स्कैन आईडी", + "Camera not initilaized yet": "कैमरा अभी प्रारंभ नहीं हुआ है", + "Scan ID MklGoogle": "स्कैन आईडी MklGoogle", + "Language": "भाषा", + "Jordan": "जॉर्डन", + "USA": "यूएसए", + "Egypt": "मिस्र", + "Turkey": "टर्की", + "Saudi Arabia": "सऊदी अरब", + "Qatar": "कतर", + "Bahrain": "बहरीन", + "Kuwait": "कुवैट", + "But you have a negative salary of": "लेकिन आपका वेतन नकारात्मक है", + "Promo Code": "प्रचार कोड", + "Your trip distance is": "आपकी यात्रा की दूरी है", + "Enter promo code": "प्रचार कि नियमावली दर्ज करो", + "You have promo!": "आपके पास प्रोमो है!", + "Cost Duration": "लागत अवधि", + "Duration is": "अवधि है", + "Leave": "छुट्टी", + "Join": "जोड़ना", + "You Should be select reason.": "आपको कारण का चयन करना चाहिए.", + "\$": "\$", + "Waiting for Driver ...": "ड्राइवर का इंतज़ार है...", + "Latest Recent Trip": "नवीनतम हालिया यात्रा", + "from your list": "आपकी सूची से", + "Do you want to change Work location": + "क्या आप कार्यस्थल बदलना चाहते हैं?", + "Do you want to change Home location": + "क्या आप घर का स्थान बदलना चाहते हैं?", + "We Are Sorry That we dont have cars in your Location!": + "हमें खेद है कि आपके स्थान पर हमारे पास कारें नहीं हैं!", + "Choose from Map": "मानचित्र से चुनें", + "Pick your ride location on the map - Tap to confirm": + "मानचित्र पर अपनी सवारी का स्थान चुनें - पुष्टि करने के लिए टैप करें", + "To Work": "काम करने के लिए", + "Are you want to go this site": "क्या आप इस साइट पर जाना चाहते हैं", + "Closest & Cheapest": "निकटतम एवं सबसे सस्ता", + "Work Saved": "कार्य सहेजा गया", + "Sefer is the ride-hailing app that is safe, reliable, and accessible.": + "सेफ़र एक राइड-हेलिंग ऐप है जो सुरक्षित, विश्वसनीय और सुलभ है।", + "With Sefer, you can get a ride to your destination in minutes.": + "सेफ़र के साथ, आप मिनटों में अपने गंतव्य तक यात्रा प्राप्त कर सकते हैं।", + "Sefer is committed to safety, and all of our captains are carefully screened and background checked.": + "सेफ़र सुरक्षा के लिए प्रतिबद्ध है, और हमारे सभी कप्तानों की सावधानीपूर्वक जांच की जाती है और पृष्ठभूमि की जांच की जाती है।", + "To Home": "घर के लिए", + "Home Saved": "होम सहेजा गया", + "Destination selected": "गंतव्य चयनित", + "Now select start pick": "अब स्टार्ट पिक चुनें", + "Pick from map": "मानचित्र से चुनें", + "Click here point": "यहां क्लिक करें बिंदु", + "No Car in your site. Sorry!": + "आपकी साइट पर कोई कार नहीं. क्षमा मांगना!", + "Nearest Car for you about": "आपके लिए निकटतम कार के बारे में", + "N/A": "एन/ए", + "From :": "से :", + "Get Details of Trip": "यात्रा का विवरण प्राप्त करें", + "If you want add stop click here": + "यदि आप स्टॉप जोड़ना चाहते हैं तो यहां क्लिक करें", + "Driver": "चालक", + "Where you want go": "आप कहाँ जाना चाहते हैं", + "My Card": "मेरे कार्ड", + "Start Record": "रिकॉर्ड प्रारंभ करें", + "Wallet": "बटुआ", + "History of Trip": "यात्रा का इतिहास", + "Helping Center": "सहायता केंद्र", + "Record saved": "रिकॉर्ड सहेजा गया", + "Trips recorded": "यात्राएँ रिकार्ड की गईं", + "Select Your Country": "अपने देश का चयन करॊ", + "To ensure you receive the most accurate information for your location, please select your country below. This will help tailor the app experience and content to your country.": + "यह सुनिश्चित करने के लिए कि आपको अपने स्थान के लिए सबसे सटीक जानकारी प्राप्त हो, कृपया नीचे अपना देश चुनें। इससे ऐप अनुभव और सामग्री को आपके देश के अनुरूप बनाने में मदद मिलेगी।", + "Are you sure to delete recorded files": + "क्या आप निश्चित रूप से रिकॉर्ड की गई फ़ाइलों को हटाना चाहते हैं?", + "Select recorded trip": "रिकॉर्ड की गई यात्रा का चयन करें", + "Card Number": "कार्ड संख्या", + "Hi, Where to": "नमस्ते, कहां जाएं", + "Pick your destination from Map": "मानचित्र से अपना गंतव्य चुनें", + "Add Stops": "स्टॉप जोड़ें", + "Get Direction": "दिशा प्राप्त करें", + "Add Location": "स्थान जोड़ना", + "Switch Rider": "राइडर स्विच करें", + "You will arrive to your destination after timer end.": + "टाइमर समाप्त होने के बाद आप अपने गंतव्य पर पहुंच जाएंगे।", + "You can cancel trip": "आप यात्रा रद्द कर सकते हैं", + "The driver waitting you in picked location .": + "ड्राइवर चयनित स्थान पर आपका इंतजार कर रहा है।", + "Pay with Your": "अपने साथ भुगतान करें", + "Pay with Credit Card": "क्रेडिट कार्ड से भुगतान करें", + "Payment History": "भुगतान इतिहास", + "Show Promos to Charge": "चार्ज करने के लिए प्रोमो दिखाएं", + "Point": "बिंदु", + "Driver Wallet": "ड्राइवर वॉलेट", + "Total Points is": "कुल अंक है", + "Total Budget from trips is": "यात्राओं का कुल बजट है", + "Total Amount:": "कुल राशि:", + "Total Budget from trips by": "यात्राओं का कुल बजट", + "Credit card is": "क्रेडिट कार्ड है", + "بطاقة الائتمان هي": "بطاقة الائتمان هي", + "This amount for all trip I get from Passengers": + "यह राशि मुझे सभी यात्राओं के लिए यात्रियों से मिलती है", + "Pay from my budget": "मेरे बजट से भुगतान करें", + "This amount for all trip I get from Passengers and Collected For me in": + "यह राशि मुझे सभी यात्राओं के लिए यात्रियों से मिलती है और मेरे लिए एकत्रित की जाती है", + "You can buy points from your budget": + "आप अपने बजट से पॉइंट खरीद सकते हैं", + "insert amount": "राशि डालें", + "You can buy Points to let you online": + "आप ऑनलाइन देने के लिए पॉइंट्स खरीद सकते हैं", + "by this list below": "नीचे दी गई इस सूची के द्वारा", + "من خلال القائمة أدناه": "من خلال القائمة أدناه", + "Create Wallet to receive your money": + "अपना पैसा प्राप्त करने के लिए वॉलेट बनाएं", + "Enter your feedback here": "अपनी प्रतिक्रिया यहां दर्ज करें", + "Please enter your feedback.": "कृपया अपनी प्रतिक्रिया दर्ज करें.", + "Feedback": "प्रतिक्रिया", + "Submit": "जमा करना", + "Click here to Show it in Map": + "इसे मानचित्र में दिखाने के लिए यहां क्लिक करें", + "Canceled": "रद्द", + "Type your Email": "अपना ईमेल टाइप करें", + "No I want": "नहीं, मैं चाहता हूं", + "Email is": "ईमेल है", + "Phone Number is": "फ़ोन नंबर है", + "Date of Birth is": "जन्मतिथि है", + "Sex is": "सेक्स है", + "Car Details": "कार विवरण", + "VIN is": "VIN है", + "Color is": "रंग है", + "Make is": "बनाओ है", + "Model is": "मॉडल है", + "Year is": "वर्ष है", + "Expiration Date": "समाप्ति तिथि", + "Edit Your data": "अपना डेटा संपादित करें", + "write vin for your car": "अपनी कार के लिए विन लिखें", + "VIN": "विन", + "write Color for your car": "अपनी कार के लिए रंग लिखें", + "write Make for your car": "अपनी कार के लिए बनाएं लिखें", + "write Model for your car": "अपनी कार के लिए मॉडल लिखें", + "write Year for your car": "अपनी कार के लिए वर्ष लिखें", + "write Expiration Date for your car": + "अपनी कार की समाप्ति तिथि लिखें", + "Tariffs": "टैरिफ", + "Minimum fare": "न्यूनतम किराया", + "Maximum fare": "अधिकतम किराया", + "Flag-down fee": "फ़्लैग-डाउन शुल्क", + "Including Tax": "कर सहित", + "BookingFee": "बुकिंग शुल्क", + "Morning": "सुबह", + "from 07:30 till 10:30 (Thursday, Friday, Saturday, Monday)": + "07:30 से 10:30 तक (गुरुवार, शुक्रवार, शनिवार, सोमवार)", + "Evening": "शाम", + "from 12:00 till 15:00 (Thursday, Friday, Saturday, Monday)": + "12:00 से 15:00 तक (गुरुवार, शुक्रवार, शनिवार, सोमवार)", + "Night": "रात", + "You have in account": "आपके खाते में है", + "Select Country": "देश चुनें", + "Ride Today :": "आज सवारी करें:", + "After this period": "इस अवधि के बाद", + "You can\"t cancel!": "आप रद्द नहीं कर सकते!", + "لا تستطيع الغاء الرحله": "لا تستطيع الغاء الرحله", + "from 23:59 till 05:30": "23:59 से 05:30 तक", + "Rate Driver": "ड्राइवर को रेट करें", + "Total Cost is": "कुल लागत है", + "Write note": "नोट लिखो", + "Time to arrive": "आने का समय हो गया", + "Ride Summaries": "सवारी सारांश", + "Total Cost": "कुल लागत", + "Average of Hours of": "घंटों का औसत", + "is ON for this month": "इस महीने के लिए चालू है", + "Days": "दिन", + "Total Hours on month": "महीने पर कुल घंटे", + "Counts of Hours on days": "दिनों पर घंटों की गिनती", + "OrderId": "आदेश कामतत्व", + "created time": "समय बनाया", + "Speed Over": "स्पीड ओवर", + "I will slow down": "मैं धीमा कर दूंगा", + "Map Passenger": "मानचित्र यात्री", + "Be Slowly": "धीरे-धीरे रहो", + "If you want to make Google Map App run directly when you apply order": + "यदि आप ऑर्डर लागू करते समय Google मैप ऐप को सीधे चलाना चाहते हैं", + "You can change the language of the app": + "आप ऐप की भाषा बदल सकते हैं", + "Your Budget less than needed": "आपका बजट ज़रूरत से कम है", + "You can change the Country to get all features": + "आप सभी सुविधाएँ प्राप्त करने के लिए देश बदल सकते हैं", + "Change Country": "देश बदलें" + }, + "ru": { + "Sign In by Apple": "Войти через Apple", + "Sign In by Google": "Войти через Google", + "How do I request a ride?": "Как заказать поездку?", + "Step-by-step instructions on how to request a ride through the Sefer app.": + "Пошаговые инструкции о том, как заказать поездку через приложение Sefer.", + "What types of vehicles are available?": + "Какие типы транспортных средств доступны?", + "Sefer offers a variety of vehicle options to suit your needs, including economy, comfort, and luxury. Choose the option that best fits your budget and passenger count.": + "Sefer предлагает различные варианты автомобилей в соответствии с вашими потребностями, включая экономичные, комфортные и роскошные. Выберите вариант, который лучше всего соответствует вашему бюджету и количеству пассажиров.", + "How can I pay for my ride?": "Как я могу оплатить поездку?", + "Sefer offers multiple payment methods for your convenience. Choose between cash payment or credit/debit card payment during ride confirmation.": + "Sefer предлагает несколько способов оплаты для вашего удобства. Выберите между оплатой наличными или оплатой кредитной/дебетовой картой во время подтверждения поездки.", + "Can I cancel my ride?": "Могу ли я отменить поездку?", + "Yes, you can cancel your ride under certain conditions (e.g., before driver is assigned). See the Sefer cancellation policy for details.": + "Да, вы можете отменить поездку при определенных условиях (например, до того, как будет назначен водитель). Подробную информацию см. в правилах отмены бронирования Sefer.", + "Driver Registration & Requirements": + "Регистрация водителя и требования", + "How can I register as a driver?": + "Как я могу зарегистрироваться в качестве водителя?", + "What are the requirements to become a driver?": + "Каковы требования, чтобы стать водителем?", + "Visit our website or contact Sefer support for information on driver registration and requirements.": + "Посетите наш веб-сайт или свяжитесь со службой поддержки Sefer для получения информации о регистрации драйверов и требованиях.", + "How do I communicate with the other party (passenger/driver)?": + "Как мне связаться с другой стороной (пассажиром/водителем)?", + "Sefer provides in-app chat functionality to allow you to communicate with your driver or passenger during your ride.": + "Sefer предоставляет функцию чата в приложении, позволяющую вам общаться с водителем или пассажиром во время поездки.", + "What safety measures does Sefer offer?": + "Какие меры безопасности предлагает Sefer?", + "Sefer prioritizes your safety. We offer features like driver verification, in-app trip tracking, and emergency contact options.": + "Компания Sefer уделяет приоритетное внимание вашей безопасности. Мы предлагаем такие функции, как проверка водителя, отслеживание поездок в приложении и варианты экстренной связи.", + "Frequently Questions": "Частые вопросы", + "User does not exist.": "Пользователь не существует.", + "We need your phone number to contact you and to help you.": + "Нам нужен ваш номер телефона, чтобы связаться с вами и помочь вам.", + "You will recieve code in sms message": + "Вы получите код в смс-сообщении", + "Please enter": "Пожалуйста входите", + "We need your phone number to contact you and to help you receive orders.": + "Нам нужен ваш номер телефона, чтобы связаться с вами и помочь вам получать заказы.", + "The full name on your criminal record does not match the one on your driver’s license. Please verify and provide the correct documents.": + "Полное имя в вашей судимости не совпадает с именем в ваших водительских правах. Пожалуйста, проверьте и предоставьте правильные документы.", + "The national number on your driver’s license does not match the one on your ID document. Please verify and provide the correct documents.": + "Национальный номер в ваших водительских правах не совпадает с номером в вашем документе, удостоверяющем личность. Пожалуйста, проверьте и предоставьте правильные документы.", + "Capture an Image of Your Criminal Record": + "Сделайте снимок вашего судимости", + "IssueDate": "Дата выпуска", + "Capture an Image of Your car license front": + "Сделайте снимок передней части вашего автомобильного удостоверения", + "Capture an Image of Your ID Document front": + "Сделайте снимок лицевой стороны вашего документа, удостоверяющего личность", + "NationalID": "Национальный идентификатор", + "FullName": "Полное имя", + "InspectionResult": "Результат проверки", + "Criminal Record": "Судимость", + "The email or phone number is already registered.": + "Адрес электронной почты или номер телефона уже зарегистрированы.", + "To become a ride-sharing driver on the Sefer app, you need to upload your driver\"s license, ID document, and car registration document. Our AI system will instantly review and verify their authenticity in just 2-3 minutes. If your documents are approved, you can start working as a driver on the Sefer app. Please note, submitting fraudulent documents is a serious offense and may result in immediate termination and legal consequences.": + "Чтобы стать водителем совместного использования поездок в приложении Sefer, вам необходимо загрузить свои водительские права, документ, удостоверяющий личность, и документ о регистрации автомобиля. Наша система искусственного интеллекта мгновенно проверит и проверит их подлинность всего за 2-3 минуты. Если ваши документы одобрены, вы можете начать работать водителем в приложении Sefer. Обратите внимание, что подача поддельных документов является серьезным правонарушением и может повлечь за собой немедленное увольнение и юридические последствия.", + "Documents check": "Проверка документов", + "Driver's License": "Водительское удостоверение", + "License Type": "Тип лицензии", + "National Number": "Национальный номер", + "Name (Arabic)": "Имя (арабское)", + "Name (English)": "Имя (английское)", + "Address": "Адрес", + "Issue Date": "Дата выпуска", + "Expiry Date": "Дата истечения срока действия", + "License Categories": "Категории лицензий", + "driver_license": "водительские права", + "Capture an Image of Your Driver License": + "Сделайте снимок своих водительских прав", + "ID Documents Back": "Документы, удостоверяющие личность Назад", + "National ID": "Национальный идентификатор", + "Occupation": "Занятие", + "Gender": "Пол", + "Religion": "Религия", + "Marital Status": "Семейное положение", + "Full Name (Marital)": "Полное имя (супружеское)", + "Expiration Date": "Дата окончания срока", + "Capture an Image of Your ID Document Back": + "Сделайте снимок вашего документа, удостоверяющего личность. Назад", + "ID Documents Front": "Документы, удостоверяющие личность", + "First Name": "Имя", + "CardID": "ID карты", + "Full Name": "Полное имя", + "Vehicle Details Front": "Детали автомобиля спереди", + "Plate Number": "Номерной знак", + "Owner Name": "Имя владельца", + "Vehicle Details Back": "Сведения об автомобиле Назад", + "Make": "Делать", + "Model": "Модель", + "Year": "Год", + "Chassis": "Шасси", + "Color": "Цвет", + "Displacement": "Смещение", + "Fuel": "Топливо", + "Tax Expiry Date": "Дата окончания налогового периода", + "Inspection Date": "Дата проверки", + "Capture an Image of Your car license back": + "Сделайте снимок обратно с вашими автомобильными правами", + "Capture an Image of Your Driver’s License": + "Сделайте снимок своих водительских прав", + "Sign in with Google for easier email and name entry": + "Войдите в систему с помощью Google, чтобы упростить ввод электронной почты и имени.", + "You will choose allow all the time to be ready receive orders": + "Вы выберете «Разрешить все время быть готовым получать заказы».", + "Welcome to Sefer!": "Добро пожаловать в Сефер!", + "Get to your destination quickly and easily.": + "Доберитесь до места назначения быстро и легко.", + "Enjoy a safe and comfortable ride.": + "Наслаждайтесь безопасной и комфортной поездкой.", + "Choose Language": "Выберите язык", + "Login": "Авторизоваться", + "Pay with Wallet": "Оплатить с помощью кошелька", + "Invalid MPIN": "Неверный MPIN", + "Invalid OTP": "Неверный OTP", + "Enter your email address": "Введите ваш адрес электронной почты", + "Please enter Your Email.": + "Пожалуйста, введите свой адрес электронной почты.", + "Enter your phone number": "Введите свой номер телефона", + "Please enter your phone number.": + "Пожалуйста введите ваш номер телефона.", + "Please enter Your Password.": "Пожалуйста введите ваш пароль.", + "Submit": "Представлять на рассмотрение", + "if you dont have account": "если у тебя нет аккаунта", + "Register": "регистр", + "Accept Ride's Terms & Review Privacy Notice": + "Примите Условия Ride и ознакомьтесь с Уведомлением о конфиденциальности", + "By selecting 'I Agree' below, I have reviewed and agree to the Terms of Use and acknowledge the Privacy Notice. I am at least 18 years of age.": + "Выбрав «Я согласен» ниже, я ознакомился и согласен с Условиями использования, а также принимаю Уведомление о конфиденциальности. Мне как минимум 18 лет.", + "I Agree": "Я согласен", + "First name": "Имя", + "Enter your first name": "Введите свое имя", + "Please enter your first name.": "Пожалуйста, введите ваше имя.", + "Last name": "Фамилия", + "Enter your last name": "Введите свою фамилию", + "Please enter your last name.": "Пожалуйста, введите свою фамилию.", + "City": "Город", + "Please enter your City.": "Пожалуйста, укажите свой город.", + "Male": "Мужской", + "Female": "Женский", + "Verify Email": "Подтвердить Email", + "We sent 5 digit to your Email provided": + "Мы отправили 5-значный номер на указанный вами адрес электронной почты.", + "5 digit": "5 цифр", + "Send Verification Code": "Отправить код подтверждения", + "Your Ride Duration is": "Продолжительность вашей поездки составляет", + "You will be thier in": "ты будешь там", + "You trip distance is": "Расстояние вашей поездки составляет", + "Fee is": "Плата составляет", + "From :": "От :", + "To :": "К :", + "Add Promo": "Добавить промо", + "Confirm Selection": "Подтвердить выбор", + "distance is": "расстояние", + "duration is": "продолжительность", + "I don't need a ride anymore": "мне больше не нужна поездка", + "I was just trying the application": "Я просто пробовал приложение", + "No driver accepted my request": + "Ни один водитель не принял мой запрос", + "I added the wrong pick-up/drop-off location": + "Я добавил неправильное место получения/высадки.", + "I don't have a reason": "у меня нет причины", + "Other": "Другой", + "Can we know why you want to cancel Ride ?": + "Можем ли мы узнать, почему вы хотите отменить Ride?", + "Cancel Ride": "Отменить поездку", + "Add Payment Method": "Добавить способ оплаты", + "Your Wallet balance is": "Баланс вашего Кошелька", + "Ride Wallet": "Кошелек для поездок", + "Payment Method": "Способ оплаты", + "Type here Place": "Введите здесь Место", + "Are You sure to ride to": "Вы уверены, что поедете в", + "Confirm": "Подтверждать", + "Back": "Назад", + "You are Delete": "Вы удалены", + "Deleted": "Удалено", + "You Dont Have Any places yet !": "У вас пока нет мест!", + "Favorite Places": "Любимые места", + "From : Current Location": "Откуда: Текущее местоположение", + "Where to": "Куда", + "Notifications": "Уведомления", + "Profile": "Профиль", + "Home": "Дом", + "My Cared": "Мой заботливый", + "Add Card": "Добавить карту", + "Add Credit Card": "Добавить кредитную карту", + "Please enter the cardholder name": + "Пожалуйста, введите имя владельца карты", + "Please enter the expiry date": + "Пожалуйста, введите дату истечения срока действия", + "Please enter the CVV code": "Пожалуйста, введите CVV-код", + "Go To Favorite Places": "Перейти к любимым местам", + "Go to this Target": "Перейти к этой цели", + "My Profile": "Мой профайл", + "Sign Out": "Выход", + "Home Page": "Домашняя страница", + "Are you want to go to this site": "Вы хотите перейти на этот сайт?", + "MyLocation": "Мое местонахождение", + "my location": "мое местонахождение", + "Target": "Цель", + "Update": "Обновлять", + "You Should choose rate figure": "Вам следует выбрать цифру тарифа", + "Login Captin": "Войти Капитан", + "Register Captin": "Регистрация капитана", + "Send Verfication Code": "Отправить код подтверждения", + "KM": "км", + "End Ride": "Конец поездки", + "Minute": "минута", + "Go to passenger Location now": + "Перейти к местонахождению пассажира сейчас", + "Duration of the Ride is": "Продолжительность поездки составляет", + "Distance of the Ride is": "Расстояние поездки составляет", + "Name of the Passenger is": "Имя Пассажира", + "Hello this is Captain": "Привет, это капитан", + "Start the Ride": "Начать поездку", + "Please Wait If passenger want To Cancel!": + "Пожалуйста, подождите, если пассажир хочет отменить бронирование!", + "Total Duration:": "Общая продолжительность:", + "Active Duration:": "Активная продолжительность:", + "Waiting for Captin ...": "Жду капитана...", + "Age is": "Возраст", + "Rating is": "Рейтинг", + "to arrive you.": "приехать к тебе.", + "Order History": "История заказов", + "My Wallet": "Мой бумажник", + "Tariff": "Тариф", + "Settings": "Настройки", + "Feed Back": "Обратная связь", + "Promos": "Промоакции", + "Please enter a valid 16-digit card number": + "Пожалуйста, введите действительный 16-значный номер карты.", + "Add Phone": "Добавить телефон", + "Please enter a phone number": "Пожалуйста, введите номер телефона", + "You dont Add Emergency Phone Yet!": + "Вы еще не добавили экстренный телефон!", + "You will arrive to your destination after": + "Вы прибудете в пункт назначения после", + "You can cancel Ride now": "Вы можете отменить поездку сейчас", + "You Can cancel Ride After Captain did not come in the time": + "Вы можете отменить поездку, если капитан не пришел вовремя.", + "If you in Car Now. Press Start The Ride": + "Если вы сейчас в машине. Нажмите «Начать поездку»", + "You Dont Have Any amount in": "У вас нет суммы на счету", + "Wallet!": "Кошелек!", + "You Have": "У вас есть", + "Save Credit Card": "Сохранить кредитную карту", + "Show Promos": "Показать промо", + "10 and get 4% discount": "10 и получи скидку 4%", + "20 and get 6% discount": "20 и получи скидку 6%", + "40 and get 8% discount": "40 и получи скидку 8%", + "100 and get 11% discount": "100 и получи скидку 11%.", + "Pay with Your PayPal": "Оплатите с помощью PayPal", + "You will choose one of above !": + "Вы выберете один из вышеперечисленных!", + "Cancel": "Отмена", + "Delete My Account": "Удалите мой аккаунт", + "Edit Profile": "Редактировать профиль", + "Name": "Имя", + "Update Gender": "Обновить пол", + "Education": "Образование", + "Update Education": "Обновить образование", + "Employment Type": "вид занятости", + "SOS Phone": "Телефон экстренной помощи", + "High School Diploma": "Диплом средней школы", + "Associate Degree": "Степень специалиста", + "Bachelor's Degree": "Степень бакалавра", + "Master's Degree": "Степень магистра", + "Doctoral Degree": "Докторская степень", + "Promos For today": "Акции на сегодня", + "Copy this Promo to use it in your Ride!": + "Скопируйте это промо, чтобы использовать его в своей поездке!", + "To change some Settings": "Чтобы изменить некоторые настройки", + "To change Language the App": "Чтобы изменить язык приложения", + "Order Request Page": "Страница запроса заказа", + "Rouats of Trip": "Маршруты путешествия", + "Passenger Name is": "Имя пассажира", + "Total From Passenger is": "Всего от пассажира", + "Duration To Passenger is": + "Продолжительность для пассажира составляет", + "Distance To Passenger is": "Расстояние до пассажира", + "Total For You is": "Всего для вас", + "Distance is": "Расстояние", + "KM": "км", + "Duration of Trip is": "Продолжительность поездки", + "Minutes": "Минуты", + "Apply Order": "Применить заказ", + "Refuse Order": "Отказаться от заказа", + "Rate Captain": "Оценить Капитана", + "Enter your Note": "Введите вашу заметку", + "Type something...": "Введите что-либо...", + "Submit rating": "Отправить оценку", + "Rate Passenger": "Оценить пассажира", + "Ride Summary": "Обзор поездки", + "welcome_message": "приветственное сообщение", + "app_description": "app_description", + "get_to_destination": "get_to_destination", + "get_a_ride": "get_a_ride", + "safe_and_comfortable": "безопасно_и_комфортно", + "committed_to_safety": "привержен_безопасности", + "Driver Applied the Ride for You": + "Водитель организовал поездку за вас", + "Show latest promo": "Показать последнее промо", + "Cancel Trip": "Отменить поездку", + "Passenger Cancel Trip": "Пассажир отменил поездку", + "Please stay on the picked point.": + "Пожалуйста, оставайтесь на выбранной точке.", + "Trip is Begin": "Поездка начинается", + "Hi ,I will go now": "Привет, я пойду сейчас", + "Passenger come to you": "Пассажир пришел к вам", + "Hi ,I Arrive your site": "Привет, я прибыл на ваш сайт", + "Driver Finish Trip": "Водитель завершает поездку", + "you will pay to Driver": "ты заплатишь водителю", + "Driver Cancel Your Trip": "Водитель отменил поездку", + "you will pay to Driver you will be pay the cost of driver time look to your SEFER Wallet": + "вы заплатите водителю вы оплатите стоимость времени водителя посмотрите в своем кошельке SEFER", + "I will go now": "я пойду сейчас", + "You Have Tips": "У вас есть советы", + "tips": "советы", + "Total is": "Всего", + "الْمَجْمُوع هُوَ": "الْمَجْمُوع هُوَ", + "No,I want": "Нет, я хочу", + "Your fee is": "Ваша плата", + "Do you want to pay Tips for this Driver": + "Хотите ли вы платить чаевые этому водителю?", + "Tip is": "Совет", + "Tip is": "Совет", + "Camera Access Denied.": "Доступ к камере запрещен.", + "Open Settings": "Открыть настройки", + "GPS Required Allow !.": "Требуется GPS Разрешить!.", + "Your Account is Deleted": "Ваша учетная запись удалена", + "Are you sure to delete your account?": + "Вы уверены, что хотите удалить свой аккаунт?", + "Your data will be erased after 2 weeks": + "Ваши данные будут удалены через 2 недели.", + "And you will can't return to use app after 1 month": + "И вы не сможете вернуться к использованию приложения через 1 месяц.", + "وَلَن تَسْتَطِيع اسْتِخْدَام التَّطْبِيق مَرَّة أُخْرَى بَعْد شَهْر": + "Фициро -л. Метр تَسْتробного", + "Enter Your First Name": "Введите свое имя", + "Are you Sure to LogOut?": "Вы уверены, что хотите выйти?", + "Email Wrong": "Неправильный адрес электронной почты", + "Email you inserted is Wrong.": + "Введенный вами адрес электронной почты неправильный.", + "You have finished all times": "Вы закончили все времена", + "if you want help you can email us here": + "если вам нужна помощь, вы можете написать нам здесь", + "Thanks": "Спасибо", + "Email Us": "Свяжитесь с нами по электронной почте", + "I cant register in your app in face detection": + "Я не могу зарегистрироваться в вашем приложении для распознавания лиц", + "Hi": "Привет", + "No face detected": "Лицо не обнаружено", + "Image detecting result is": "Результат обнаружения изображения:", + "from 3 times Take Attention": "от 3 раз Обратите внимание", + "Be sure for take accurate images please": + "Обязательно делайте точные изображения, пожалуйста", + "You have": "У вас есть", + "لَدَيْك": "لَدَيْك", + "image verified": "изображение проверено", + "Next": "Следующий", + "There is no help Question here": "Здесь нет помощи. Вопрос", + "Call End": "Завершение вызова", + "You dont have Points": "У вас нет баллов", + "You Are Stopped For this Day !": "Вы остановлены на этот день!", + "You must be charge your Account": + "Вы должны списать средства с вашего счета", + "You Refused 3 Rides this Day that is the reason": + "Вы отказались от 3 поездок в этот день, вот и причина", + "See you Tomorrow!": "Увидимся завтра!", + "لِقَائِنَا غَدًا!": "لِقَائِنَا غَدًا!", + "Recharge my Account": "Пополните мой счет", + "Ok , See you Tomorrow": "ОК, увидимся завтра", + "You are Stopped": "Вы остановлены", + "Connected": "Связанный", + "Not Connected": "Не подключен", + "Your are far from passenger location": + "Вы находитесь далеко от пассажирского места.", + "go to your passenger location before": + "заранее подойдите к своему пассажирскому месту", + "Passenger cancel trip": "Пассажир отменил поездку", + "يُلْغِي الرَّاكِب الرِّحْلَة": "يُلْغِي الرَّاكِب الرِّحْلَة", + "You will get cost of your work for this trip": + "Вы получите стоимость своей работы за эту поездку", + "in your wallet": "в твоем кошельке", + "you gain": "Вы получаете", + "Order Cancelled": "Заказ отменен", + "Order Cancelled by Passenger": "Заказ отменен пассажиром", + "Success": "Успех", + "Feedback data saved successfully": + "Данные отзыва успешно сохранены.", + "No Promo for today .": "Никакой акции на сегодня.", + "Select your destination": "Выберите пункт назначения", + "Search for your Start point": "Найдите свою начальную точку", + "Search for waypoint": "Поиск путевой точки", + "Current Location": "Текущее местоположение", + "Add Location 1": "Добавить местоположение 1", + "You must Verify email !.": + "Вы должны подтвердить электронную почту!.", + "Cropper": "Кроппер", + "Saved Sucssefully": "Сохранено успешно", + "Select Date": "Выберите дату", + "Birth Date": "Дата рождения", + "Ok": "Хорошо", + "the 500 points equal 30 JOD": + "500 баллов равны 30 иорданским динарам", + "the 500 points equal 30 JOD for you": + "500 баллов равны для вас 30 иорданским динарам", + "So go and gain your money": "Так что иди и заработай свои деньги", + "فَاسْتَحِقَّ فُلُوسَك وَاكْسِب النِّقَاط": + "فَاسْتَحِقَّ فُلُوسَك وَاكْسِب النِّقَاط", + "token updated": "токен обновлен", + "Add Location 2": "Добавить местоположение 2", + "Add Location 3": "Добавить местоположение 3", + "Add Location 4": "Добавить местоположение 4", + "Waiting for your location": "Ожидание вашего местоположения", + "Search for your destination": "Найдите пункт назначения", + "Hi! This is": "Привет! Это", + "I am using": "Я использую", + "to ride with": "кататься с", + "as the driver.": "как водитель.", + "is driving a": "водит", + "with license plate": "с номерным знаком", + "I am currently located at": "В настоящее время я нахожусь по адресу", + "Please go to Car now": + "Пожалуйста, перейдите в раздел «Машина» сейчас", + "If you need to reach me, please contact the driver directly at": + "Если вам нужно связаться со мной, пожалуйста, свяжитесь с водителем напрямую по адресу:", + "No Car or Driver Found in your area.": + "В вашем районе не найдено ни автомобиля, ни водителя.", + "Please Try anther time": "Пожалуйста, попробуйте в другой раз", + "There no Driver Aplly your order sorry for that": + "Драйвера нет. Примените ваш заказ, извините за это.", + "Trip Cancelled": "Поездка отменена", + "The Driver Will be in your location soon .": + "Водитель скоро будет у вас.", + "The distance less than 500 meter.": "Расстояние менее 500 метров.", + "Promo End !": "Промо окончание!", + "There is no notification yet": "Уведомления пока нет", + "Use Touch ID or Face ID to confirm payment": + "Используйте Touch ID или Face ID для подтверждения оплаты.", + "Contact us for any questions on your order.": + "Свяжитесь с нами по любым вопросам по вашему заказу.", + "Pyament Cancelled .": "Пьямент отменен.", + "type here": "напечатайте здесь", + "Scan Driver License": "Сканировать водительские права", + "Please put your licence in these border": + "Пожалуйста, поместите свои права в эту рамку.", + "Camera not initialized yet": "Камера еще не инициализирована", + "Take Image": "Сделать снимок", + "AI Page": "Страница ИИ", + "Take Picture Of ID Card": "Сфотографировать удостоверение личности", + "Take Picture Of Driver License Card": + "Сфотографировать карту водительских прав", + "We are process picture please wait": + "Мы обрабатываем изображение, пожалуйста, подождите", + "There is no data yet.": "Данных пока нет.", + "Name :": "Имя :", + "Drivers License Class:": "Класс водительских прав:", + "Document Number:": "Номер документа:", + "Address:": "Адрес:", + "Height:": "Высота:", + "Expiry Date:": "Дата истечения срока действия:", + "Date of Birth:": "Дата рождения:", + "You can\"t continue with us .": "Вы не можете продолжать с нами.", + "You should renew Driver license": + "Вам следует продлить водительские права", + "Detect Your Face": "Обнаружьте свое лицо", + "Go to next step": "Перейти к следующему шагу", + "scan Car License.": "сканировать автомобильные права.", + "aاسْتِخْرَاج رُخْصَة السَّيَّارَة.": + "aاسْتِخْرَاج رُخْصَة السَّيَّارَة.", + "Name in arabic": "Имя на арабском", + "Drivers License Class": "Класс водительских прав", + "Date of Birth": "Дата рождения", + "Age": "Возраст", + "Lets check Car license": "Давайте проверим лицензию на автомобиль", + "Car Kind": "Вид автомобиля", + "Car Plate": "Автомобильная табличка", + "Lets check License Back Face": + "Давайте проверим обратную сторону лицензии", + "Car License Card": "Лицензионная карта автомобиля", + "No image selected yet": "Изображение еще не выбрано", + "Made :": "Сделал :", + "model :": "модель:", + "VIN :": "ВИН :", + "year :": "год :", + "ُExpire Date": "Дата истечения срока годности", + "Login Driver": "Войти в драйвер", + "Password must br at least 6 character.": + "Пароль должен содержать не менее 6 символов.", + "if you don\"t have account": "если у тебя нет аккаунта", + "Here recorded trips audio": "Здесь записаны аудиозаписи поездок", + "Register as Driver": "Зарегистрироваться как водитель", + "Privacy Notice": "Уведомление о конфиденциальности", + "By selecting 'I Agree' below, I have reviewed and agree to the Terms of Use and acknowledge the": + "Выбрав «Я согласен» ниже, я ознакомился и согласен с Условиями использования, а также подтверждаю", + ". I am at least 18 years of age.": ". Мне как минимум 18 лет.", + "Log Out Page": "Страница выхода из системы", + "Log Off": "Выйти", + "Register Driver": "Зарегистрировать драйвер", + "Verify Email For Driver": + "Подтвердите адрес электронной почты водителя", + "Admin DashBoard": "Панель администратора", + "Your name": "Ваше имя", + "your ride is applied": "ваша поездка применена", + "Your password": "Ваш пароль", + "H and": "Рука", + "LE": "ЛЕ", + "JOD": "Йод", + "m": "м", + "We search nearst Driver to you": "Мы ищем ближайшего к вам водителя", + "please wait till driver accept your order": + "пожалуйста, подождите, пока водитель не примет ваш заказ", + "No accepted orders? Try raising your trip fee to attract riders.": + "Нет принятых заказов? Попробуйте повысить плату за поездку, чтобы привлечь пассажиров.", + "You should select one": "Вам следует выбрать один", + "The driver accept your order for": "Водитель принимает ваш заказ на", + "Increase Fee": "Увеличение комиссии", + "No, thanks": "Нет, спасибо", + "The driver on your way": "Водитель на вашем пути", + "Total price from": "Общая стоимость от", + "Order Details Speed": "Детали заказа Скорость", + "Order Applied": "Заказ принят", + "accepted your order": "принял ваш заказ", + "We regret to inform you that another driver has accepted this order.": + "С сожалением сообщаем, что этот заказ принял другой водитель.", + "Selected file:": "Выбранный файл:", + "Your trip cost is": "Стоимость вашей поездки составляет", + "this will delete all files from your device": + "это удалит все файлы с вашего устройства", + "you have a negative balance of": "у вас отрицательный баланс", + "in your": "в вашей", + "Exclusive offers and discounts always with the Sefer app": + "Эксклюзивные предложения и скидки всегда с приложением Sefer", + "Please go to Car Driver": + "Пожалуйста, перейдите в раздел «Водитель автомобиля»", + "wallet due to a previous trip.": "кошелек из-за предыдущей поездки.", + "Submit Question": "Отправить вопрос", + "Please enter your Question.": "Пожалуйста, введите свой вопрос.", + "Help Details": "Подробности помощи", + "No trip yet found": "Поездка пока не найдена", + "No Response yet.": "Пока нет ответа.", + "You Earn today is": "Вы зарабатываете сегодня", + "You Have in": "У вас есть", + "Total points is": "Общее количество баллов составляет", + "Total Connection Duration:": "Общая продолжительность подключения:", + "H and": "Рука", + "Passenger name :": "Имя пассажира :", + "Cost Of Trip IS": "Стоимость поездки", + "Arrival time": "Время прибытия", + "arrival time to reach your point": + "время прибытия, чтобы добраться до вашей точки", + "For Speed and Delivery trips, the price is calculated dynamically. For Comfort trips, the price is based on time and distance": + "Для поездок «Скорость» и «Доставка» цена рассчитывается динамически. Для поездок Комфорт цена зависит от времени и расстояния.", + "Hello this is Driver": "Привет, это Драйвер", + "Is the Passenger in your Car ?": "Пассажир в вашей машине?", + "Please wait for the passenger to enter the car before starting the trip.": + "Перед началом поездки подождите, пока пассажир сядет в машину.", + "No ,still Waiting.": "Нет, все еще жду.", + "I arrive you": "я приеду к тебе", + "I Arrive your site": "Я прихожу на ваш сайт", + "You are not in near to passenger location": + "Вы находитесь не рядом с пассажирским местом.", + "please go to picker location exactly": + "пожалуйста, перейдите точно к месту сбора", + "You Can Cancel Trip And get Cost of Trip From": + "Вы можете отменить поездку и получить стоимость поездки от", + "Are you sure to cancel?": "Вы уверены, что отмените?", + "Yes": "Да", + "Insert Emergincy Number": "Вставьте номер службы экстренной помощи", + "Best choice for comfort car and flexible route and stops point": + "Лучший выбор для комфортного автомобиля, гибкого маршрута и остановок.", + "Insert": "Вставлять", + "This is for delivery or a motorcycle.": + "Это на доставку или мотоцикл.", + "This trip goes directly from your starting point to your destination for a fixed price. The driver must follow the planned route": + "Эта поездка идет прямо от отправной точки до пункта назначения по фиксированной цене. Водитель должен следовать запланированному маршруту", + "You can decline a request without any cost": + "Вы можете отклонить запрос без каких-либо затрат", + "Perfect for adventure seekers who want to experience something new and exciting": + "Идеально подходит для искателей приключений, желающих испытать что-то новое и захватывающее.", + "My current location is:": "Мое текущее местоположение:", + "and I have a trip on": "и у меня поездка", + "App with Passenger": "Приложение с пассажиром", + "مع الراكب": "مع الراكب", + "You will be pay the cost to driver or we will get it from you on next trip": + "Вы оплатите стоимость водителю, или мы получим ее от вас во время следующей поездки.", + "Trip has Steps": "Поездка состоит из шагов", + "Distance from Passenger to destination is": + "Расстояние от пассажира до пункта назначения составляет", + "price is": "цена", + "This ride type does not allow changes to the destination or additional stops": + "Этот тип поездки не допускает изменения пункта назначения или дополнительных остановок.", + "This price may be changed": "Эта цена может быть изменена", + "No SIM card, no problem! Call your driver directly through our app. We use advanced technology to ensure your privacy.": + "Нет SIM-карты – нет проблем! Позвоните своему водителю прямо через наше приложение. Мы используем передовые технологии для обеспечения вашей конфиденциальности.", + "This ride type allows changes, but the price may increase": + "В этом типе поездки возможны изменения, но цена может увеличиться.", + "message From passenger": "сообщение от пассажира", + "Select one message": "Выберите одно сообщение", + "My location is correct. You can search for me using the navigation app": + "Моё местоположение правильное. Вы можете найти меня с помощью навигационного приложения.", + "I'm waiting for you": "Я жду тебя", + "Hello, I'm at the agreed-upon location": + "Здравствуйте, я в оговоренном месте.", + "We noticed the speed is exceeding 100 km/h. Please slow down for your safety. If you feel unsafe, you can share your trip details with a contact or call the police using the red SOS button.": + "Мы заметили, что скорость превышает 100 км/ч. Пожалуйста, снизьте скорость для вашей безопасности. Если вы чувствуете себя небезопасно, вы можете поделиться информацией о своей поездке с контактным лицом или позвонить в полицию, нажав красную кнопку SOS.", + "Warning: Speeding detected!": + "Внимание: обнаружено превышение скорости!", + "Please help! Contact me as soon as possible.": + "Пожалуйста помоги! Свяжитесь со мной как можно скорее.", + "Share Trip Details": "Поделитесь подробностями поездки", + "Car Plate is": "Автомобильная табличка", + "the 300 points equal 300 L.E for you": + "для вас 300 баллов равны 300 LE", + "So go and gain your money": "Так что иди и заработай свои деньги", + "the 300 points equal 300 L.E": "300 очков равны 300 LE", + "The payment was not approved. Please try again.": + "Платеж не был одобрен. Пожалуйста, попробуйте еще раз.", + "Payment Failed": "Платеж не прошел", + "Error": "Ошибка", + "An error occurred during the payment process.": + "В процессе оплаты произошла ошибка.", + "The payment was approved.": "Платеж был одобрен.", + "Payment Successful": "Платеж успешен", + "No ride found yet": "Поездка пока не найдена", + "Accept Order": "Принять заказ", + "reject your order.": "отклонить ваш заказ.", + "Bottom Bar Example": "Пример нижней панели", + "Driver phone": "Телефон водителя", + "Statistics": "Статистика", + "Origin": "Источник", + "Destination": "Место назначения", + "Driver Name": "Имя драйвера", + "Driver Car Plate": "Автомобильная табличка водителя", + "Available for rides": "Доступно для поездок", + "Scan Id": "Идентификатор сканирования", + "Camera not initilaized yet": "Камера еще не инициализирована", + "Scan ID MklGoogle": "Сканировать идентификатор MklGoogle", + "Language": "Язык", + "Jordan": "Иордания", + "USA": "США", + "Egypt": "Египет", + "Turkey": "Турция", + "Saudi Arabia": "Саудовская Аравия", + "Qatar": "Катар", + "Bahrain": "Бахрейн", + "Kuwait": "Кувейт", + "But you have a negative salary of": + "Но у вас отрицательная зарплата", + "Promo Code": "Промо-код", + "Your trip distance is": "Расстояние вашей поездки составляет", + "Enter promo code": "Введите промо-код", + "You have promo!": "У вас есть промо!", + "Cost Duration": "Стоимость Продолжительность", + "Duration is": "Продолжительность", + "Leave": "Оставлять", + "Join": "Присоединиться", + "You Should be select reason.": "Вам следует выбрать причину.", + "\$": "\$", + "Waiting for Driver ...": "Ждем водителя...", + "Latest Recent Trip": "Последняя недавняя поездка", + "from your list": "из твоего списка", + "Do you want to change Work location": + "Хотите изменить место работы?", + "Do you want to change Home location": + "Хотите изменить местоположение «Дом»?", + "We Are Sorry That we dont have cars in your Location!": + "Сожалеем, что в вашем регионе нет автомобилей!", + "Choose from Map": "Выбрать на карте", + "Pick your ride location on the map - Tap to confirm": + "Выберите место поездки на карте — нажмите для подтверждения.", + "To Work": "Работать", + "Are you want to go this site": "Вы хотите перейти на этот сайт?", + "Closest & Cheapest": "Ближайший и самый дешевый", + "Work Saved": "Работа сохранена", + "Sefer is the ride-hailing app that is safe, reliable, and accessible.": + "Sefer — это безопасное, надежное и доступное приложение для заказа такси.", + "With Sefer, you can get a ride to your destination in minutes.": + "С Sefer вы можете добраться до места назначения за считанные минуты.", + "Sefer is committed to safety, and all of our captains are carefully screened and background checked.": + "«Сефер» заботится о безопасности, и все наши капитаны тщательно проверяются и проверяются биографические данные.", + "To Home": "Домой", + "Home Saved": "Дом сохранен", + "Destination selected": "Место назначения выбрано", + "Now select start pick": "Теперь выберите начало выбора", + "Pick from map": "Выбрать с карты", + "Click here point": "Нажмите здесь точку", + "No Car in your site. Sorry!": + "На вашем сайте нет автомобилей. Извини!", + "Nearest Car for you about": "Ближайший автомобиль для вас", + "N/A": "Н/Д", + "From :": "От :", + "Get Details of Trip": "Получить подробную информацию о поездке", + "If you want add stop click here": + "Если вы хотите добавить остановку, нажмите здесь", + "Driver": "Водитель", + "Where you want go": "Куда ты хочешь пойти", + "My Card": "Моя карта", + "Start Record": "Начать запись", + "Wallet": "Кошелек", + "History of Trip": "История поездки", + "Helping Center": "Центр помощи", + "Record saved": "Запись сохранена", + "Trips recorded": "Записано поездок", + "Select Your Country": "Выберите вашу страну", + "To ensure you receive the most accurate information for your location, please select your country below. This will help tailor the app experience and content to your country.": + "Чтобы получить наиболее точную информацию о вашем местоположении, выберите свою страну ниже. Это поможет адаптировать работу приложения и его контент к особенностям вашей страны.", + "Are you sure to delete recorded files": + "Вы уверены, что хотите удалить записанные файлы?", + "Select recorded trip": "Выберите записанную поездку", + "Card Number": "Номер карты", + "Hi, Where to": "Привет, куда", + "Pick your destination from Map": + "Выберите пункт назначения на карте", + "Add Stops": "Добавить остановки", + "Get Direction": "Получить направление", + "Add Location": "Добавить местоположение", + "Switch Rider": "Сменить гонщика", + "You will arrive to your destination after timer end.": + "Вы прибудете в пункт назначения после окончания таймера.", + "You can cancel trip": "Вы можете отменить поездку", + "The driver waitting you in picked location .": + "Водитель ждет вас в выбранном месте.", + "Pay with Your": "Платите с помощью", + "Pay with Credit Card": "Оплатить кредитной картой", + "Payment History": "История платежей", + "Show Promos to Charge": + "Показать промо-акции за дополнительную плату", + "Point": "Точка", + "Driver Wallet": "Кошелек водителя", + "Total Points is": "Общее количество очков составляет", + "Total Budget from trips is": "Общий бюджет от поездок составляет", + "Total Amount:": "Общая сумма:", + "Total Budget from trips by": "Общий бюджет от поездок по", + "Credit card is": "Кредитная карта", + "بطاقة الائتمان هي": "بطاقة الائتمان هي", + "This amount for all trip I get from Passengers": + "Эту сумму за всю поездку я получаю от пассажиров", + "Pay from my budget": "Оплата из моего бюджета", + "This amount for all trip I get from Passengers and Collected For me in": + "Эту сумму за всю поездку я получаю от пассажиров и собираю для меня в", + "You can buy points from your budget": + "Вы можете купить баллы из своего бюджета", + "insert amount": "вставить сумму", + "You can buy Points to let you online": + "Вы можете купить баллы, чтобы позволить вам онлайн", + "by this list below": "по этому списку ниже", + "من خلال القائمة أدناه": "В خلال القائمة أدناه", + "Create Wallet to receive your money": + "Создайте кошелек для получения денег", + "Enter your feedback here": "Введите свой отзыв здесь", + "Please enter your feedback.": "Пожалуйста, оставьте свой отзыв.", + "Feedback": "Обратная связь", + "Submit": "Представлять на рассмотрение", + "Click here to Show it in Map": + "Нажмите здесь, чтобы показать это на карте", + "Canceled": "Отменено", + "Type your Email": "Введите свой адрес электронной почты", + "No I want": "Нет, я хочу", + "Email is": "Электронная почта", + "Phone Number is": "Номер телефона", + "Date of Birth is": "Дата рождения", + "Sex is": "Секс это", + "Car Details": "Детали автомобиля", + "VIN is": "VIN-это", + "Color is": "Цвет", + "Make is": "Сделать это", + "Model is": "Модель", + "Year is": "Год", + "Expiration Date": "Дата окончания срока", + "Edit Your data": "Редактировать свои данные", + "write vin for your car": "напиши вин своей машины", + "VIN": "ВИН", + "write Color for your car": "напишите цвет для вашего автомобиля", + "write Make for your car": "напишите Сделай для своей машины", + "write Model for your car": "напишите модель вашего автомобиля", + "write Year for your car": "напиши год своей машины", + "write Expiration Date for your car": + "напишите срок годности вашего автомобиля", + "Tariffs": "Тарифы", + "Minimum fare": "Минимальный тариф", + "Maximum fare": "Максимальный тариф", + "Flag-down fee": "Плата за отметку", + "Including Tax": "В том числе налог", + "BookingFee": "Плата за бронирование", + "Morning": "Утро", + "from 07:30 till 10:30 (Thursday, Friday, Saturday, Monday)": + "с 07:30 до 10:30 (четверг, пятница, суббота, понедельник)", + "Evening": "Вечер", + "from 12:00 till 15:00 (Thursday, Friday, Saturday, Monday)": + "с 12:00 до 15:00 (четверг, пятница, суббота, понедельник)", + "Night": "Ночь", + "You have in account": "У вас есть на счету", + "Select Country": "Выберите страну", + "Ride Today :": "Поездка сегодня:", + "After this period": "После этого периода", + "You can\"t cancel!": "Вы не можете отменить!", + "لا تستطيع الغاء الرحله": "لا تستطيع الغاء الرحله", + "from 23:59 till 05:30": "с 23:59 до 05:30", + "Rate Driver": "Оценить драйвер", + "Total Cost is": "Общая стоимость", + "Write note": "Написать заметку", + "Time to arrive": "Время прибыть", + "Ride Summaries": "Обзоры поездок", + "Total Cost": "Общая стоимость", + "Average of Hours of": "Среднее количество часов", + "is ON for this month": "включено в этом месяце", + "Days": "Дни", + "Total Hours on month": "Всего часов в месяц", + "Counts of Hours on days": "Счет часов в днях", + "OrderId": "Номер заказа", + "created time": "созданное время", + "Speed Over": "Скорость превышена", + "I will slow down": "Я буду замедляться", + "Map Passenger": "Карта Пассажир", + "Be Slowly": "Будь медленно", + "If you want to make Google Map App run directly when you apply order": + "Если вы хотите, чтобы приложение Google Map запускалось непосредственно при подаче заказа", + "You can change the language of the app": + "Вы можете изменить язык приложения", + "Your Budget less than needed": "Ваш бюджет меньше необходимого", + "You can change the Country to get all features": + "Вы можете изменить страну, чтобы получить все функции.", + "Change Country": "Выбрать страну" + }, + "it": { + "Sign In by Apple": "Accedi tramite Apple", + "Sign In by Google": "Accedi tramite Google", + "How do I request a ride?": "Come posso richiedere una corsa?", + "Step-by-step instructions on how to request a ride through the Sefer app.": + "Istruzioni passo passo su come richiedere una corsa tramite l'app Sefer.", + "What types of vehicles are available?": + "Quali tipi di veicoli sono disponibili?", + "Sefer offers a variety of vehicle options to suit your needs, including economy, comfort, and luxury. Choose the option that best fits your budget and passenger count.": + "Sefer offre una varietà di opzioni di veicoli per soddisfare le tue esigenze, tra cui economia, comfort e lusso. Scegli l'opzione che meglio si adatta al tuo budget e al numero di passeggeri.", + "How can I pay for my ride?": "Come posso pagare la mia corsa?", + "Sefer offers multiple payment methods for your convenience. Choose between cash payment or credit/debit card payment during ride confirmation.": + "Sefer offre molteplici metodi di pagamento per la tua comodità. Scegli tra pagamento in contanti o pagamento con carta di credito/debito al momento della conferma della corsa.", + "Can I cancel my ride?": "Posso annullare la mia corsa?", + "Yes, you can cancel your ride under certain conditions (e.g., before driver is assigned). See the Sefer cancellation policy for details.": + "Sì, puoi annullare la corsa a determinate condizioni (ad esempio, prima che venga assegnato il conducente). Consulta la politica di cancellazione di Sefer per i dettagli.", + "Driver Registration & Requirements": + "Registrazione e requisiti del conducente", + "How can I register as a driver?": + "Come posso registrarmi come autista?", + "What are the requirements to become a driver?": + "Quali sono i requisiti per diventare autista?", + "Visit our website or contact Sefer support for information on driver registration and requirements.": + "Visita il nostro sito Web o contatta il supporto Sefer per informazioni sulla registrazione e sui requisiti del conducente.", + "How do I communicate with the other party (passenger/driver)?": + "Come posso comunicare con l'altra parte (passeggero/autista)?", + "Sefer provides in-app chat functionality to allow you to communicate with your driver or passenger during your ride.": + "Sefer fornisce funzionalità di chat in-app per consentirti di comunicare con il tuo autista o passeggero durante il viaggio.", + "What safety measures does Sefer offer?": + "Quali misure di sicurezza offre Sefer?", + "Sefer prioritizes your safety. We offer features like driver verification, in-app trip tracking, and emergency contact options.": + "Sefer mette al primo posto la tua sicurezza. Offriamo funzionalità come la verifica del conducente, il monitoraggio del viaggio in-app e le opzioni di contatto di emergenza.", + "Frequently Questions": "Domande frequenti", + "User does not exist.": "L'utente non esiste.", + "We need your phone number to contact you and to help you.": + "Abbiamo bisogno del tuo numero di telefono per contattarti e aiutarti.", + "You will recieve code in sms message": + "Riceverai il codice nel messaggio SMS", + "Please enter": "Prego entra", + "We need your phone number to contact you and to help you receive orders.": + "Abbiamo bisogno del tuo numero di telefono per contattarti e per aiutarti a ricevere gli ordini.", + "The full name on your criminal record does not match the one on your driver’s license. Please verify and provide the correct documents.": + "Il nome completo sulla tua fedina penale non corrisponde a quello sulla tua patente di guida. Si prega di verificare e fornire i documenti corretti.", + "The national number on your driver’s license does not match the one on your ID document. Please verify and provide the correct documents.": + "Il numero nazionale sulla tua patente di guida non corrisponde a quello sul tuo documento d'identità. Si prega di verificare e fornire i documenti corretti.", + "Capture an Image of Your Criminal Record": + "Cattura un'immagine della tua fedina penale", + "IssueDate": "Data di emissione", + "Capture an Image of Your car license front": + "Cattura un'immagine della parte anteriore della patente della tua auto", + "Capture an Image of Your ID Document front": + "Cattura un'immagine della parte anteriore del tuo documento d'identità", + "NationalID": "ID nazionale", + "FullName": "Nome e cognome", + "InspectionResult": "Risultato dell'ispezione", + "Criminal Record": "Fedina penale", + "The email or phone number is already registered.": + "L'e-mail o il numero di telefono sono già registrati.", + "To become a ride-sharing driver on the Sefer app, you need to upload your driver\"s license, ID document, and car registration document. Our AI system will instantly review and verify their authenticity in just 2-3 minutes. If your documents are approved, you can start working as a driver on the Sefer app. Please note, submitting fraudulent documents is a serious offense and may result in immediate termination and legal consequences.": + "Per diventare un autista di ride-sharing sull'app Sefer, devi caricare la patente di guida, il documento d'identità e il documento di registrazione dell'auto. Il nostro sistema AI esaminerà e verificherà immediatamente la loro autenticità in soli 2-3 minuti. Se i tuoi documenti sono approvati, puoi iniziare a lavorare come autista sull'app Sefer. Tieni presente che l'invio di documenti falsi è un reato grave e può comportare il licenziamento immediato e conseguenze legali.", + "Documents check": "Controllo documenti", + "Driver's License": "Patente di guida", + "License Type": "Tipo di licenza", + "National Number": "Numero nazionale", + "Name (Arabic)": "Nome (arabo)", + "Name (English)": "Nome (inglese)", + "Address": "Indirizzo", + "Issue Date": "Data di emissione", + "Expiry Date": "Data di scadenza", + "License Categories": "Categorie di licenza", + "driver_license": "patente di guida", + "Capture an Image of Your Driver License": + "Cattura un'immagine della tua patente di guida", + "ID Documents Back": "Documenti d'identità indietro", + "National ID": "Carta d'identità nazionale", + "Occupation": "Occupazione", + "Gender": "Genere", + "Religion": "Religione", + "Marital Status": "Stato civile", + "Full Name (Marital)": "Nome completo (coniugale)", + "Expiration Date": "Data di scadenza", + "Capture an Image of Your ID Document Back": + "Cattura un'immagine del tuo documento d'identità sul retro", + "ID Documents Front": "Documenti d'identità anteriori", + "First Name": "Nome di battesimo", + "CardID": "ID carta", + "Full Name": "Nome e cognome", + "Vehicle Details Front": "Dettagli del veicolo Parte anteriore", + "Plate Number": "Targa", + "Owner Name": "Nome del proprietario", + "Vehicle Details Back": "Dettagli del veicolo Indietro", + "Make": "Fare", + "Model": "Modello", + "Year": "Anno", + "Chassis": "Telaio", + "Color": "Colore", + "Displacement": "Dislocamento", + "Fuel": "Carburante", + "Tax Expiry Date": "Data di scadenza fiscale", + "Inspection Date": "Data dell'ispezione", + "Capture an Image of Your car license back": + "Cattura un'immagine della tua patente di guida", + "Capture an Image of Your Driver’s License": + "Cattura un'immagine della tua patente di guida", + "Sign in with Google for easier email and name entry": + "Accedi con Google per semplificare l'immissione di email e nome", + "You will choose allow all the time to be ready receive orders": + "Sceglierai di consentire tutto il tempo per essere pronto a ricevere gli ordini", + "Welcome to Sefer!": "Benvenuti a Sefer!", + "Get to your destination quickly and easily.": + "Raggiungi la tua destinazione in modo facile e veloce.", + "Enjoy a safe and comfortable ride.": + "Goditi un viaggio sicuro e confortevole.", + "Choose Language": "Scegli la lingua", + "Login": "Login", + "Pay with Wallet": "Paga con Portafoglio", + "Invalid MPIN": "PIN non valido", + "Invalid OTP": "OTP non valida", + "Enter your email address": "Inserisci il tuo indirizzo email", + "Please enter Your Email.": "Inserisci la tua email.", + "Enter your phone number": "Inserisci il tuo numero di telefono", + "Please enter your phone number.": + "Per favore immetti il ​​tuo numero di telefono.", + "Please enter Your Password.": + "Per favore inserisci LA TUA password.", + "Submit": "Invia", + "if you dont have account": "se non hai un account", + "Register": "Registrati", + "Accept Ride's Terms & Review Privacy Notice": + "Accetta i termini di Ride e consulta l'Informativa sulla privacy", + "By selecting 'I Agree' below, I have reviewed and agree to the Terms of Use and acknowledge the Privacy Notice. I am at least 18 years of age.": + "Selezionando \"Accetto\" di seguito, ho letto e accetto i Termini di utilizzo e riconosco l'Informativa sulla privacy. Ho almeno 18 anni.", + "I Agree": "Sono d'accordo", + "First name": "Nome di battesimo", + "Enter your first name": "Inserisci il tuo nome di battesimo", + "Please enter your first name.": + "Per favore immettere il proprio Nome.", + "Last name": "Cognome", + "Enter your last name": "Inserire il cognome", + "Please enter your last name.": + "Per favore inserisci il tuo cognome.", + "City": "Città", + "Please enter your City.": "Inserisci la tua città.", + "Male": "Maschio", + "Female": "Femmina", + "Verify Email": "Verifica Email", + "We sent 5 digit to your Email provided": + "Abbiamo inviato 5 cifre all'e-mail fornita", + "5 digit": "5 cifre", + "Send Verification Code": "Invia codice di verifica", + "Your Ride Duration is": "La durata del tuo viaggio è", + "You will be thier in": "Sarai lì dentro", + "You trip distance is": "La distanza del tuo viaggio è", + "Fee is": "La tariffa è", + "From :": "Da :", + "To :": "A :", + "Add Promo": "Aggiungi promozione", + "Confirm Selection": "Conferma la selezione", + "distance is": "la distanza è", + "duration is": "la durata è", + "I don't need a ride anymore": "Non ho più bisogno di un passaggio", + "I was just trying the application": + "Stavo solo provando l'applicazione", + "No driver accepted my request": + "Nessun autista ha accettato la mia richiesta", + "I added the wrong pick-up/drop-off location": + "Ho aggiunto il luogo di ritiro/consegna sbagliato", + "I don't have a reason": "Non ho una ragione", + "Other": "Altro", + "Can we know why you want to cancel Ride ?": + "Possiamo sapere perché vuoi annullare Ride?", + "Cancel Ride": "Annulla corsa", + "Add Payment Method": "Aggiungi metodo di pagamento", + "Your Wallet balance is": "Il saldo del tuo Portafoglio è", + "Ride Wallet": "Portafoglio da corsa", + "Payment Method": "Metodo di pagamento", + "Type here Place": "Digita qui Luogo", + "Are You sure to ride to": "Sei sicuro di venire?", + "Confirm": "Confermare", + "Back": "Indietro", + "You are Delete": "Sei Elimina", + "Deleted": "Eliminato", + "You Dont Have Any places yet !": "Non hai ancora nessun posto!", + "Favorite Places": "Luoghi preferiti", + "From : Current Location": "Da: posizione attuale", + "Where to": "Dove", + "Notifications": "Notifiche", + "Profile": "Profilo", + "Home": "Casa", + "My Cared": "La mia cura", + "Add Card": "Aggiungi carta", + "Add Credit Card": "Aggiungi carta di credito", + "Please enter the cardholder name": + "Inserisci il nome del titolare della carta", + "Please enter the expiry date": "Inserisci la data di scadenza", + "Please enter the CVV code": "Inserisci il codice CVV", + "Go To Favorite Places": "Vai ai luoghi preferiti", + "Go to this Target": "Vai a questo obiettivo", + "My Profile": "Il mio profilo", + "Sign Out": "Disconnessione", + "Home Page": "Pagina iniziale", + "Are you want to go to this site": "Vuoi andare su questo sito?", + "MyLocation": "La mia posizione", + "my location": "la mia posizione", + "Target": "Bersaglio", + "Update": "Aggiornamento", + "You Should choose rate figure": + "Dovresti scegliere la cifra della tariffa", + "Login Captin": "Accedi Capitano", + "Register Captin": "Registrati Capitano", + "Send Verfication Code": "Invia codice di verifica", + "KM": "KM", + "End Ride": "Fine giro", + "Minute": "Minuto", + "Go to passenger Location now": + "Vai subito alla posizione del passeggero", + "Duration of the Ride is": "La durata del giro è", + "Distance of the Ride is": "La distanza della corsa è", + "Name of the Passenger is": "Il nome del passeggero è", + "Hello this is Captain": "Salve, sono il Capitano", + "Start the Ride": "Inizia il giro", + "Please Wait If passenger want To Cancel!": + "Si prega di attendere se il passeggero desidera annullare!", + "Total Duration:": "Durata totale:", + "Active Duration:": "Durata attiva:", + "Waiting for Captin ...": "Aspettando Capitan...", + "Age is": "L'età è", + "Rating is": "La valutazione è", + "to arrive you.": "per arrivare a te.", + "Order History": "Cronologia ordini", + "My Wallet": "Il mio portafoglio", + "Tariff": "Tariffa", + "Settings": "Impostazioni", + "Feed Back": "Feedback", + "Promos": "Promozioni", + "Please enter a valid 16-digit card number": + "Inserisci un numero di carta valido di 16 cifre", + "Add Phone": "Aggiungi telefono", + "Please enter a phone number": "Inserisci un numero di telefono", + "You dont Add Emergency Phone Yet!": + "Non hai ancora aggiunto il telefono di emergenza!", + "You will arrive to your destination after": + "Arriverai a destinazione dopo", + "You can cancel Ride now": "Puoi annullare la corsa adesso", + "You Can cancel Ride After Captain did not come in the time": + "Puoi annullare il giro dopo che il Capitano non è arrivato in tempo", + "If you in Car Now. Press Start The Ride": + "Se sei in Car Now. Premi Inizia la corsa", + "You Dont Have Any amount in": "Non hai alcun importo", + "Wallet!": "Portafoglio!", + "You Have": "Hai", + "Save Credit Card": "Salva carta di credito", + "Show Promos": "Mostra promozioni", + "10 and get 4% discount": "10 e ottieni uno sconto del 4%.", + "20 and get 6% discount": "20 e ottieni il 6% di sconto", + "40 and get 8% discount": "40 e ottieni uno sconto dell'8%.", + "100 and get 11% discount": "100 e ottieni uno sconto dell'11%.", + "Pay with Your PayPal": "Paga con il tuo PayPal", + "You will choose one of above !": "Sceglierai uno dei precedenti!", + "Cancel": "Annulla", + "Delete My Account": "Cancella il mio account", + "Edit Profile": "Modifica Profilo", + "Name": "Nome", + "Update Gender": "Aggiorna sesso", + "Education": "Formazione scolastica", + "Update Education": "Aggiorna l'istruzione", + "Employment Type": "Tipo di impiego", + "SOS Phone": "Telefono SOS", + "High School Diploma": "Diploma di scuola superiore", + "Associate Degree": "Grado associato", + "Bachelor's Degree": "Laurea", + "Master's Degree": "Master", + "Doctoral Degree": "Dottorato", + "Promos For today": "Promozioni per oggi", + "Copy this Promo to use it in your Ride!": + "Copia questa Promo per usarla nella tua Ride!", + "To change some Settings": "Per modificare alcune Impostazioni", + "To change Language the App": "Per cambiare la lingua dell'App", + "Order Request Page": "Pagina di richiesta ordine", + "Rouats of Trip": "Itinerari di viaggio", + "Passenger Name is": "Il nome del passeggero è", + "Total From Passenger is": "Totale dal passeggero è", + "Duration To Passenger is": "La durata per il passeggero è", + "Distance To Passenger is": "La distanza dal passeggero è", + "Total For You is": "Totale per te lo è", + "Distance is": "La distanza è", + "KM": "KM", + "Duration of Trip is": "La durata del viaggio è", + "Minutes": "Minuti", + "Apply Order": "Applicare l'ordine", + "Refuse Order": "Ordine di rifiuto", + "Rate Captain": "Valuta Capitano", + "Enter your Note": "Inserisci la tua nota", + "Type something...": "Scrivi qualcosa...", + "Submit rating": "Invia valutazione", + "Rate Passenger": "Valuta il passeggero", + "Ride Summary": "Riepilogo del giro", + "welcome_message": "messaggio di benvenuto", + "app_description": "descrizione_app", + "get_to_destination": "raggiungi_destinazione", + "get_a_ride": "fatti_un_giro", + "safe_and_comfortable": "sicuro_e_confortevole", + "committed_to_safety": "impegnato_per_la_sicurezza", + "Driver Applied the Ride for You": + "L'autista ha applicato la corsa per te", + "Show latest promo": "Mostra l'ultima promozione", + "Cancel Trip": "Annulla viaggio", + "Passenger Cancel Trip": "Viaggio annullato dal passeggero", + "Please stay on the picked point.": + "Per favore, rimani nel punto scelto.", + "Trip is Begin": "Il viaggio è iniziato", + "Hi ,I will go now": "Ciao, adesso vado", + "Passenger come to you": "Passeggero vieni da te", + "Hi ,I Arrive your site": "Ciao, arrivo al tuo sito", + "Driver Finish Trip": "Viaggio finale del conducente", + "you will pay to Driver": "pagherai all'autista", + "Driver Cancel Your Trip": "L'autista annulla il tuo viaggio", + "you will pay to Driver you will be pay the cost of driver time look to your SEFER Wallet": + "pagherai all'autista ti verrà pagato il costo del tempo dell'autista guarda sul tuo portafoglio SEFER", + "I will go now": "Io andrò ora", + "You Have Tips": "Hai dei suggerimenti", + "tips": "suggerimenti", + "Total is": "Il totale è", + "الْمَجْمُوع هُوَ": "الْمَجْمُوع هُوَ", + "No,I want": "No io voglio", + "Your fee is": "La tua tariffa è", + "Do you want to pay Tips for this Driver": + "Vuoi pagare mance per questo driver", + "Tip is": "Il suggerimento è", + "Tip is": "Il suggerimento è", + "Camera Access Denied.": "Accesso alla telecamera negato.", + "Open Settings": "Apri Impostazioni", + "GPS Required Allow !.": "GPS richiesto Consenti!.", + "Your Account is Deleted": "Il tuo account è stato eliminato", + "Are you sure to delete your account?": + "Sei sicuro di voler eliminare il tuo account?", + "Your data will be erased after 2 weeks": + "I tuoi dati verranno cancellati dopo 2 settimane", + "And you will can't return to use app after 1 month": + "E non potrai tornare a utilizzare l'app dopo 1 mese", + "وَلَن تَسْتَطِيع اسْتِخْدَام التَّطْبِيق مَرَّة أُخْرَى بَعْد شَهْر": + "وَلَن تَسْتَطِيع اسْتِخْدَام التَّطْبِيق مَرَّة أُخْرَى بَعْد شَهْر", + "Enter Your First Name": "Inserisci il tuo nome di battesimo", + "Are you Sure to LogOut?": "Sei sicuro di uscire?", + "Email Wrong": "E-mail sbagliata", + "Email you inserted is Wrong.": + "L'email che hai inserito è sbagliata.", + "You have finished all times": "Hai finito tutti i tempi", + "if you want help you can email us here": + "se vuoi aiuto puoi scriverci un'e-mail qui", + "Thanks": "Grazie", + "Email Us": "Mandaci una email", + "I cant register in your app in face detection": + "Non riesco a registrarmi nella tua app per il rilevamento dei volti", + "Hi": "CIAO", + "No face detected": "Nessun volto rilevato", + "Image detecting result is": + "Il risultato del rilevamento dell'immagine è", + "from 3 times Take Attention": "da 3 volte Attenzione", + "Be sure for take accurate images please": + "Assicurati di scattare immagini accurate, per favore", + "You have": "Hai", + "لَدَيْك": "لَدَيْك", + "image verified": "immagine verificata", + "Next": "Prossimo", + "There is no help Question here": + "Non c'è nessuna domanda di aiuto qui", + "Call End": "Fine chiamata", + "You dont have Points": "Non hai punti", + "You Are Stopped For this Day !": "Sei fermo per questo giorno!", + "You must be charge your Account": + "È necessario effettuare l'addebito sul tuo account", + "You Refused 3 Rides this Day that is the reason": + "Hai rifiutato 3 corse questo giorno, questo è il motivo", + "See you Tomorrow!": "Ci vediamo domani!", + "لِقَائِنَا غَدًا!": "لِقَائِنَا غَدًا!", + "Recharge my Account": "Ricarica il mio conto", + "Ok , See you Tomorrow": "Ok ci vediamo domani", + "You are Stopped": "Sei fermato", + "Connected": "Collegato", + "Not Connected": "Non collegata", + "Your are far from passenger location": + "Sei lontano dalla posizione del passeggero", + "go to your passenger location before": + "vai prima alla posizione del tuo passeggero", + "Passenger cancel trip": "Viaggio annullato dal passeggero", + "يُلْغِي الرَّاكِب الرِّحْلَة": "يُلْغِي الرَّاكِب الرِّحْلَة", + "You will get cost of your work for this trip": + "Riceverai il costo del tuo lavoro per questo viaggio", + "in your wallet": "nel tuo portafoglio", + "you gain": "guadagni", + "Order Cancelled": "Ordine cancellato", + "Order Cancelled by Passenger": "Ordine annullato dal passeggero", + "Success": "Successo", + "Feedback data saved successfully": + "Dati di feedback salvati correttamente", + "No Promo for today .": "Nessuna promozione per oggi.", + "Select your destination": "Seleziona la tua destinazione", + "Search for your Start point": "Cerca il tuo punto di partenza", + "Search for waypoint": "Cerca il punto di passaggio", + "Current Location": "Posizione attuale", + "Add Location 1": "Aggiungi posizione 1", + "You must Verify email !.": "È necessario verificare l'e-mail!.", + "Cropper": "Taglierina", + "Saved Sucssefully": "Salvato con successo", + "Select Date": "Seleziona Data", + "Birth Date": "Data di nascita", + "Ok": "OK", + "the 500 points equal 30 JOD": "i 500 punti equivalgono a 30 JOD", + "the 500 points equal 30 JOD for you": + "i 500 punti equivalgono a 30 JOD per te", + "So go and gain your money": "Quindi vai e guadagna i tuoi soldi", + "فَاسْتَحِقَّ فُلُوسَك وَاكْسِب النِّقَاط": + "فَاسْتَحِقَّ فُلُوسَك وَاكْسِب النِّقَاط", + "token updated": "token aggiornato", + "Add Location 2": "Aggiungi posizione 2", + "Add Location 3": "Aggiungi posizione 3", + "Add Location 4": "Aggiungi posizione 4", + "Waiting for your location": "In attesa della tua posizione", + "Search for your destination": "Cerca la tua destinazione", + "Hi! This is": "CIAO! Questo è", + "I am using": "sto usando", + "to ride with": "con cui viaggiare", + "as the driver.": "come autista.", + "is driving a": "sta guidando a", + "with license plate": "con targa", + "I am currently located at": "Attualmente mi trovo a", + "Please go to Car now": "Per favore, vai in macchina adesso", + "If you need to reach me, please contact the driver directly at": + "Se hai bisogno di contattarmi, contatta direttamente l'autista all'indirizzo", + "No Car or Driver Found in your area.": + "Nessuna auto o autista trovato nella tua zona.", + "Please Try anther time": "Per favore riprova un'altra volta", + "There no Driver Aplly your order sorry for that": + "Non c'è nessun driver che applichi al tuo ordine, mi spiace", + "Trip Cancelled": "Viaggio annullato", + "The Driver Will be in your location soon .": + "L'autista sarà presto nella tua posizione.", + "The distance less than 500 meter.": + "La distanza è inferiore a 500 metri.", + "Promo End !": "Fine della promozione!", + "There is no notification yet": "Non c'è ancora alcuna notifica", + "Use Touch ID or Face ID to confirm payment": + "Utilizza Touch ID o Face ID per confermare il pagamento", + "Contact us for any questions on your order.": + "Contattaci per qualsiasi domanda sul tuo ordine.", + "Pyament Cancelled .": "Pagamento annullato.", + "type here": "digitare qui", + "Scan Driver License": "Scansiona la patente di guida", + "Please put your licence in these border": + "Per favore, metti la tua licenza in questi confini", + "Camera not initialized yet": + "La fotocamera non è ancora inizializzata", + "Take Image": "Scatta immagine", + "AI Page": "Pagina dell'AI", + "Take Picture Of ID Card": "Scatta una foto della carta d'identità", + "Take Picture Of Driver License Card": + "Scatta una foto della carta della patente di guida", + "We are process picture please wait": + "Stiamo elaborando l'immagine, attendere", + "There is no data yet.": "Non ci sono ancora dati.", + "Name :": "Nome :", + "Drivers License Class:": "Classe della patente di guida:", + "Document Number:": "Numero del documento:", + "Address:": "Indirizzo:", + "Height:": "Altezza:", + "Expiry Date:": "Data di scadenza:", + "Date of Birth:": "Data di nascita:", + "You can\"t continue with us .": "Non puoi continuare con noi.", + "You should renew Driver license": + "Dovresti rinnovare la patente di guida", + "Detect Your Face": "Rileva il tuo viso", + "Go to next step": "Vai al passaggio successivo", + "scan Car License.": "scansiona la patente dell'auto.", + "aاسْتِخْرَاج رُخْصَة السَّيَّارَة.": + "aاسْتِخْرَاج رُخْصَة السَّيَّارَة.", + "Name in arabic": "Nome in arabo", + "Drivers License Class": "Classe di patente di guida", + "Date of Birth": "Data di nascita", + "Age": "Età", + "Lets check Car license": "Controlliamo la patente dell'auto", + "Car Kind": "Tipo di macchina", + "Car Plate": "Targa dell'auto", + "Lets check License Back Face": + "Controlliamo il lato posteriore della licenza", + "Car License Card": "Carta della patente di guida", + "No image selected yet": "Nessuna immagine ancora selezionata", + "Made :": "Fatto :", + "model :": "modello :", + "VIN :": "VIN:", + "year :": "anno :", + "ُExpire Date": "data di scadenza", + "Login Driver": "Accedi Autista", + "Password must br at least 6 character.": + "La password deve contenere almeno 6 caratteri.", + "if you don\"t have account": "se non hai un account", + "Here recorded trips audio": "Qui sono registrati i viaggi audio", + "Register as Driver": "Registrati come conducente", + "Privacy Notice": "Informativa sulla Privacy", + "By selecting 'I Agree' below, I have reviewed and agree to the Terms of Use and acknowledge the": + "Selezionando \"Accetto\" di seguito, ho letto e accetto i Termini di utilizzo e riconosco i", + ". I am at least 18 years of age.": ". Ho almeno 18 anni.", + "Log Out Page": "Pagina di disconnessione", + "Log Off": "Disconnettersi", + "Register Driver": "Registra conducente", + "Verify Email For Driver": "Verifica l'e-mail per il conducente", + "Admin DashBoard": "Dashboard di amministrazione", + "Your name": "Il tuo nome", + "your ride is applied": "la tua corsa viene applicata", + "Your password": "La tua password", + "H and": "Mano", + "LE": "LE", + "JOD": "JOD", + "m": "M", + "We search nearst Driver to you": + "Cerchiamo l'autista più vicino a te", + "please wait till driver accept your order": + "attendi che l'autista accetti il ​​tuo ordine", + "No accepted orders? Try raising your trip fee to attract riders.": + "Nessun ordine accettato? Prova ad aumentare la tariffa del viaggio per attirare i passeggeri.", + "You should select one": "Dovresti selezionarne uno", + "The driver accept your order for": "L'autista accetta il tuo ordine", + "Increase Fee": "Aumenta la tariffa", + "No, thanks": "No grazie", + "The driver on your way": "L'autista sulla tua strada", + "Total price from": "Prezzo totale da", + "Order Details Speed": "Dettagli dell'ordine Velocità", + "Order Applied": "Ordine applicato", + "accepted your order": "accettato il tuo ordine", + "We regret to inform you that another driver has accepted this order.": + "Siamo spiacenti di informarti che un altro conducente ha accettato questo ordine.", + "Selected file:": "File selezionato:", + "Your trip cost is": "Il costo del viaggio è", + "this will delete all files from your device": + "questo eliminerà tutti i file dal tuo dispositivo", + "you have a negative balance of": "hai un saldo negativo di", + "in your": "nel tuo", + "Exclusive offers and discounts always with the Sefer app": + "Offerte e sconti esclusivi sempre con l'app Sefer", + "Please go to Car Driver": "Per favore vai a Car Driver", + "wallet due to a previous trip.": + "portafoglio a causa di un viaggio precedente.", + "Submit Question": "Invia domanda", + "Please enter your Question.": "Inserisci la tua domanda.", + "Help Details": "Dettagli della guida", + "No trip yet found": "Nessun viaggio ancora trovato", + "No Response yet.": "Ancora nessuna risposta.", + "You Earn today is": "Guadagni oggi lo è", + "You Have in": "Hai dentro", + "Total points is": "I punti totali sono", + "Total Connection Duration:": "Durata totale della connessione:", + "H and": "Mano", + "Passenger name :": "Nome del passeggero :", + "Cost Of Trip IS": "Il costo del viaggio è", + "Arrival time": "Orario di arrivo", + "arrival time to reach your point": + "orario di arrivo per raggiungere il tuo punto", + "For Speed and Delivery trips, the price is calculated dynamically. For Comfort trips, the price is based on time and distance": + "Per i viaggi Speed ​​e Delivery il prezzo viene calcolato dinamicamente. Per i viaggi Comfort il prezzo dipende dal tempo e dalla distanza", + "Hello this is Driver": "Ciao, sono Driver", + "Is the Passenger in your Car ?": "Il passeggero è nella tua auto?", + "Please wait for the passenger to enter the car before starting the trip.": + "Si prega di attendere che il passeggero salga in macchina prima di iniziare il viaggio.", + "No ,still Waiting.": "No, sto ancora aspettando.", + "I arrive you": "Ti arrivo", + "I Arrive your site": "Arrivo al tuo sito", + "You are not in near to passenger location": + "Non sei vicino alla posizione del passeggero", + "please go to picker location exactly": + "per favore vai esattamente alla posizione del selettore", + "You Can Cancel Trip And get Cost of Trip From": + "Puoi annullare il viaggio e ottenere il costo del viaggio da", + "Are you sure to cancel?": "Sei sicuro di voler annullare?", + "Yes": "SÌ", + "Insert Emergincy Number": "Inserisci il numero di emergenza", + "Best choice for comfort car and flexible route and stops point": + "La scelta migliore per un'auto confortevole e un percorso flessibile e punti di sosta", + "Insert": "Inserire", + "This is for delivery or a motorcycle.": + "Questo è per la consegna o una moto.", + "This trip goes directly from your starting point to your destination for a fixed price. The driver must follow the planned route": + "Questo viaggio va direttamente dal tuo punto di partenza alla tua destinazione a un prezzo fisso. L'autista deve seguire il percorso previsto", + "You can decline a request without any cost": + "Puoi rifiutare una richiesta senza alcun costo", + "Perfect for adventure seekers who want to experience something new and exciting": + "Perfetto per chi cerca l'avventura e vuole sperimentare qualcosa di nuovo ed emozionante", + "My current location is:": "La mia posizione attuale è:", + "and I have a trip on": "e ho un viaggio", + "App with Passenger": "App con Passeggero", + "مع الراكب": "مع الراكب", + "You will be pay the cost to driver or we will get it from you on next trip": + "Pagherai il costo all'autista o lo riceveremo da te nel prossimo viaggio", + "Trip has Steps": "Il viaggio prevede passaggi", + "Distance from Passenger to destination is": + "La distanza dal passeggero alla destinazione è", + "price is": "il prezzo è", + "This ride type does not allow changes to the destination or additional stops": + "Questo tipo di corsa non consente modifiche alla destinazione o fermate aggiuntive", + "This price may be changed": "Questo prezzo può essere modificato", + "No SIM card, no problem! Call your driver directly through our app. We use advanced technology to ensure your privacy.": + "Nessuna carta SIM, nessun problema! Chiama il tuo autista direttamente tramite la nostra app. Utilizziamo tecnologie avanzate per garantire la tua privacy.", + "This ride type allows changes, but the price may increase": + "Questo tipo di corsa consente modifiche, ma il prezzo potrebbe aumentare", + "message From passenger": "messaggio dal passeggero", + "Select one message": "Seleziona un messaggio", + "My location is correct. You can search for me using the navigation app": + "La mia posizione è corretta. Puoi cercarmi utilizzando l'app di navigazione", + "I'm waiting for you": "Sto aspettando per voi", + "Hello, I'm at the agreed-upon location": + "Salve, mi trovo nel luogo concordato", + "We noticed the speed is exceeding 100 km/h. Please slow down for your safety. If you feel unsafe, you can share your trip details with a contact or call the police using the red SOS button.": + "Abbiamo notato che la velocità supera i 100 km/h. Per favore rallenta per la tua sicurezza. Se non ti senti sicuro, puoi condividere i dettagli del tuo viaggio con un contatto o chiamare la polizia utilizzando il pulsante rosso SOS.", + "Warning: Speeding detected!": + "Attenzione: rilevato eccesso di velocità!", + "Please help! Contact me as soon as possible.": + "Per favore aiuto! Contattami il prima possibile.", + "Share Trip Details": "Condividi i dettagli del viaggio", + "Car Plate is": "La targa dell'auto è", + "the 300 points equal 300 L.E for you": + "i 300 punti equivalgono a 300 L.E per te", + "So go and gain your money": "Quindi vai e guadagna i tuoi soldi", + "the 300 points equal 300 L.E": "i 300 punti equivalgono a 300 L.E", + "The payment was not approved. Please try again.": + "Il pagamento non è stato approvato. Per favore riprova.", + "Payment Failed": "Pagamento fallito", + "Error": "Errore", + "An error occurred during the payment process.": + "Si è verificato un errore durante il processo di pagamento.", + "The payment was approved.": "Il pagamento è stato approvato.", + "Payment Successful": "Pagamento riuscito", + "No ride found yet": "Nessuna corsa trovata ancora", + "Accept Order": "Accetta l'ordine", + "reject your order.": "rifiutare il tuo ordine.", + "Bottom Bar Example": "Esempio della barra inferiore", + "Driver phone": "Telefono dell'autista", + "Statistics": "Statistiche", + "Origin": "Origine", + "Destination": "Destinazione", + "Driver Name": "Nome del conducente", + "Driver Car Plate": "Targa automobilistica del conducente", + "Available for rides": "Disponibile per corse", + "Scan Id": "Scansione ID", + "Camera not initilaized yet": + "La fotocamera non è ancora stata inizializzata", + "Scan ID MklGoogle": "Scansione ID MklGoogle", + "Language": "Lingua", + "Jordan": "Giordania", + "USA": "Stati Uniti d'America", + "Egypt": "Egitto", + "Turkey": "Tacchino", + "Saudi Arabia": "Arabia Saudita", + "Qatar": "Qatar", + "Bahrain": "Bahrein", + "Kuwait": "Kuwait", + "But you have a negative salary of": + "Ma hai uno stipendio negativo di", + "Promo Code": "Codice promozionale", + "Your trip distance is": "La distanza del tuo viaggio è", + "Enter promo code": "Inserisci il codice promozionale", + "You have promo!": "Hai una promozione!", + "Cost Duration": "Durata del costo", + "Duration is": "La durata è", + "Leave": "Partire", + "Join": "Giuntura", + "You Should be select reason.": "Dovresti selezionare il motivo.", + "\$": "\$", + "Waiting for Driver ...": "In attesa dell'autista...", + "Latest Recent Trip": "Ultimo viaggio recente", + "from your list": "dalla tua lista", + "Do you want to change Work location": "Vuoi cambiare sede di lavoro", + "Do you want to change Home location": + "Vuoi cambiare la posizione Casa", + "We Are Sorry That we dont have cars in your Location!": + "Siamo spiacenti di non avere auto nella tua posizione!", + "Choose from Map": "Scegli dalla mappa", + "Pick your ride location on the map - Tap to confirm": + "Scegli la posizione della corsa sulla mappa: tocca per confermare", + "To Work": "Lavorare", + "Are you want to go this site": "Vuoi andare su questo sito?", + "Closest & Cheapest": "Il più vicino e il più economico", + "Work Saved": "Lavoro salvato", + "Sefer is the ride-hailing app that is safe, reliable, and accessible.": + "Sefer è l'app di ride-hailing sicura, affidabile e accessibile.", + "With Sefer, you can get a ride to your destination in minutes.": + "Con Sefer puoi arrivare a destinazione in pochi minuti.", + "Sefer is committed to safety, and all of our captains are carefully screened and background checked.": + "Sefer è impegnata nella sicurezza e tutti i nostri capitani vengono attentamente selezionati e controllati i precedenti.", + "To Home": "A casa", + "Home Saved": "Casa salvata", + "Destination selected": "Destinazione selezionata", + "Now select start pick": "Ora seleziona la scelta iniziale", + "Pick from map": "Scegli dalla mappa", + "Click here point": "Clicca qui punto", + "No Car in your site. Sorry!": + "Nessuna macchina nel tuo sito. Scusa!", + "Nearest Car for you about": "L'auto più vicina per te", + "N/A": "N / A", + "From :": "Da :", + "Get Details of Trip": "Ottieni i dettagli del viaggio", + "If you want add stop click here": + "Se vuoi aggiungere una fermata clicca qui", + "Driver": "Autista", + "Where you want go": "Dove vuoi andare", + "My Card": "La mia carta", + "Start Record": "Avvia registrazione", + "Wallet": "Portafoglio", + "History of Trip": "Storia del viaggio", + "Helping Center": "Centro di aiuto", + "Record saved": "Registrazione salvata", + "Trips recorded": "Viaggi registrati", + "Select Your Country": "Seleziona il tuo paese", + "To ensure you receive the most accurate information for your location, please select your country below. This will help tailor the app experience and content to your country.": + "Per assicurarti di ricevere le informazioni più accurate per la tua posizione, seleziona il tuo Paese di seguito. Ciò ti aiuterà ad adattare l'esperienza e i contenuti dell'app al tuo Paese.", + "Are you sure to delete recorded files": + "Sei sicuro di eliminare i file registrati?", + "Select recorded trip": "Seleziona il viaggio registrato", + "Card Number": "Numero di carta", + "Hi, Where to": "Ciao, dove andare?", + "Pick your destination from Map": + "Scegli la tua destinazione dalla mappa", + "Add Stops": "Aggiungi fermate", + "Get Direction": "Prendere direzione", + "Add Location": "Aggiungi luogo", + "Switch Rider": "Cambia pilota", + "You will arrive to your destination after timer end.": + "Arriverai a destinazione allo scadere del timer.", + "You can cancel trip": "Puoi annullare il viaggio", + "The driver waitting you in picked location .": + "L'autista ti aspetta nella posizione scelta.", + "Pay with Your": "Paga con il tuo", + "Pay with Credit Card": "Pagare con la carta di credito", + "Payment History": "Storico dei pagamenti", + "Show Promos to Charge": "Mostra promozioni da caricare", + "Point": "Punto", + "Driver Wallet": "Portafoglio autista", + "Total Points is": "I punti totali sono", + "Total Budget from trips is": "Il budget totale dei viaggi è", + "Total Amount:": "Importo totale:", + "Total Budget from trips by": "Budget totale dai viaggi di", + "Credit card is": "La carta di credito lo è", + "بطاقة الائتمان هي": "بطاقة الائتمان هي", + "This amount for all trip I get from Passengers": + "Questo importo per tutto il viaggio che ricevo dai passeggeri", + "Pay from my budget": "Paga dal mio budget", + "This amount for all trip I get from Passengers and Collected For me in": + "Questo importo per tutto il viaggio che ricevo dai passeggeri e riscosso per me in", + "You can buy points from your budget": + "Puoi acquistare punti dal tuo budget", + "insert amount": "inserire importo", + "You can buy Points to let you online": + "Puoi acquistare punti per consentirti di essere online", + "by this list below": "da questo elenco qui sotto", + "من خلال القائمة أدناه": "من خلال القائمة أدناه", + "Create Wallet to receive your money": + "Crea Wallet per ricevere i tuoi soldi", + "Enter your feedback here": "Inserisci qui il tuo feedback", + "Please enter your feedback.": "Inserisci il tuo feedback.", + "Feedback": "Feedback", + "Submit": "Invia", + "Click here to Show it in Map": + "Clicca qui per mostrarlo sulla mappa", + "Canceled": "Annullato", + "Type your Email": "Digita la tua e-mail", + "No I want": "No io voglio", + "Email is": "L'e-mail è", + "Phone Number is": "Il numero di telefono è", + "Date of Birth is": "La data di nascita è", + "Sex is": "Il sesso lo è", + "Car Details": "Dettagli dell'auto", + "VIN is": "Il VIN lo è", + "Color is": "Il colore è", + "Make is": "Fare è", + "Model is": "Il modello è", + "Year is": "L'anno è", + "Expiration Date": "Data di scadenza", + "Edit Your data": "Modifica i tuoi dati", + "write vin for your car": "scrivi vin per la tua macchina", + "VIN": "VIN", + "write Color for your car": "scrivi Colore per la tua auto", + "write Make for your car": "scrivi Crea per la tua auto", + "write Model for your car": "scrivi il modello della tua auto", + "write Year for your car": "scrivi Anno per la tua auto", + "write Expiration Date for your car": + "scrivi la data di scadenza della tua auto", + "Tariffs": "Tariffe", + "Minimum fare": "Tariffa minima", + "Maximum fare": "Tariffa massima", + "Flag-down fee": "Tariffa di segnalazione", + "Including Tax": "Tasse incluse", + "BookingFee": "Tassa di prenotazione", + "Morning": "Mattina", + "from 07:30 till 10:30 (Thursday, Friday, Saturday, Monday)": + "dalle 07:30 alle 10:30 (giovedì, venerdì, sabato, lunedì)", + "Evening": "Sera", + "from 12:00 till 15:00 (Thursday, Friday, Saturday, Monday)": + "dalle 12:00 alle 15:00 (giovedì, venerdì, sabato, lunedì)", + "Night": "Notte", + "You have in account": "Hai in conto", + "Select Country": "Seleziona il paese", + "Ride Today :": "Pedala oggi:", + "After this period": "Dopo questo periodo", + "You can\"t cancel!": "Non puoi annullare!", + "لا تستطيع الغاء الرحله": "Non preoccuparti", + "from 23:59 till 05:30": "dalle 23:59 alle 05:30", + "Rate Driver": "Valuta il conducente", + "Total Cost is": "Il costo totale è", + "Write note": "Scrivi nota", + "Time to arrive": "È ora di arrivare", + "Ride Summaries": "Riepiloghi della corsa", + "Total Cost": "Costo totale", + "Average of Hours of": "Media delle ore di", + "is ON for this month": "è ATTIVO per questo mese", + "Days": "Giorni", + "Total Hours on month": "Ore totali nel mese", + "Counts of Hours on days": "Conteggi delle ore nei giorni", + "OrderId": "ID ordine", + "created time": "tempo creato", + "Speed Over": "Velocità finita", + "I will slow down": "Rallenterò", + "Map Passenger": "Mappa Passeggero", + "Be Slowly": "Sii lentamente", + "If you want to make Google Map App run directly when you apply order": + "Se desideri che l'app Google Map venga eseguita direttamente quando effettui l'ordine", + "You can change the language of the app": + "Puoi cambiare la lingua dell'app", + "Your Budget less than needed": + "Il tuo budget è inferiore al necessario", + "You can change the Country to get all features": + "Puoi cambiare il Paese per ottenere tutte le funzionalità", + "Change Country": "Cambia Paese" + }, + "zh": { + "Sign In by Apple": "通过 Apple 登录", + "Sign In by Google": "通过谷歌登录", + "How do I request a ride?": "我如何叫车?", + "Step-by-step instructions on how to request a ride through the Sefer app.": + "有关如何通过 Sefer 应用叫车的分步说明。", + "What types of vehicles are available?": "有哪些类型的车辆可供选择?", + "Sefer offers a variety of vehicle options to suit your needs, including economy, comfort, and luxury. Choose the option that best fits your budget and passenger count.": + "Sefer 提供多种车辆选择以满足您的需求,包括经济型、舒适型和豪华型。选择最适合您的预算和乘客数量的选项。", + "How can I pay for my ride?": "我如何支付乘车费用?", + "Sefer offers multiple payment methods for your convenience. Choose between cash payment or credit/debit card payment during ride confirmation.": + "Sefer 提供多种付款方式,方便您使用。在行程确认时选择现金付款或信用卡/借记卡付款。", + "Can I cancel my ride?": "我可以取消行程吗?", + "Yes, you can cancel your ride under certain conditions (e.g., before driver is assigned). See the Sefer cancellation policy for details.": + "是的,您可以在某些情况下取消行程(例如,在分配司机之前)。详情请参阅 Sefer 取消政策。", + "Driver Registration & Requirements": "司机注册和要求", + "How can I register as a driver?": "我如何注册成为司机?", + "What are the requirements to become a driver?": "成为一名司机需要什么条件?", + "Visit our website or contact Sefer support for information on driver registration and requirements.": + "请访问我们的网站或联系 Sefer 支持人员,了解有关驱动程序注册和要求的信息。", + "How do I communicate with the other party (passenger/driver)?": + "如何与对方(乘客/司机)沟通?", + "Sefer provides in-app chat functionality to allow you to communicate with your driver or passenger during your ride.": + "Sefer 提供应用内聊天功能,让您在乘车期间与司机或乘客进行交流。", + "What safety measures does Sefer offer?": "Sefer 提供哪些安全措施?", + "Sefer prioritizes your safety. We offer features like driver verification, in-app trip tracking, and emergency contact options.": + "Sefer 将您的安全放在首位。我们提供驾驶员验证、应用内行程跟踪和紧急联系选项等功能。", + "Frequently Questions": "常见问题", + "User does not exist.": "用户不存在。", + "We need your phone number to contact you and to help you.": + "我们需要您的电话号码来与您联系并为您提供帮助。", + "You will recieve code in sms message": "您将在短信中收到代码", + "Please enter": "请输入", + "We need your phone number to contact you and to help you receive orders.": + "我们需要您的电话号码来与您联系并帮助您接收订单。", + "The full name on your criminal record does not match the one on your driver’s license. Please verify and provide the correct documents.": + "您犯罪记录上的全名与您驾驶执照上的全名不符。请核实并提供正确的文件。", + "The national number on your driver’s license does not match the one on your ID document. Please verify and provide the correct documents.": + "您的驾驶执照上的国家号码与您的身份证件上的号码不匹配。请核实并提供正确的文件。", + "Capture an Image of Your Criminal Record": "拍摄您的犯罪记录图像", + "IssueDate": "签发日期", + "Capture an Image of Your car license front": "拍摄您的汽车牌照正面的图像", + "Capture an Image of Your ID Document front": "拍摄您的身份证件正面的图像", + "NationalID": "国民身份证", + "FullName": "全名", + "InspectionResult": "检查结果", + "Criminal Record": "犯罪记录", + "The email or phone number is already registered.": "该电子邮件或电话号码已被注册。", + "To become a ride-sharing driver on the Sefer app, you need to upload your driver\"s license, ID document, and car registration document. Our AI system will instantly review and verify their authenticity in just 2-3 minutes. If your documents are approved, you can start working as a driver on the Sefer app. Please note, submitting fraudulent documents is a serious offense and may result in immediate termination and legal consequences.": + "要成为Sefer应用程序上的拼车司机,您需要上传驾驶执照、身份证件和汽车登记文件。我们的人工智能系统将在短短2-3分钟内立即审核并验证它们的真实性。如果您的文件获得批准后,您可以开始在 Sefer 应用程序上担任司机。请注意,提交欺诈性文件属于严重犯罪行为,可能会导致立即终止合同并承担法律后果。", + "Documents check": "文件检查", + "Driver's License": "驾照", + "License Type": "许可证类型", + "National Number": "国家号码", + "Name (Arabic)": "姓名(阿拉伯语)", + "Name (English)": "姓名(英文)", + "Address": "地址", + "Issue Date": "签发日期", + "Expiry Date": "到期日", + "License Categories": "许可证类别", + "driver_license": "驾驶执照", + "Capture an Image of Your Driver License": "拍摄您的驾驶执照的图像", + "ID Documents Back": "身份证件 返回", + "National ID": "国民身份证", + "Occupation": "职业", + "Gender": "性别", + "Religion": "宗教", + "Marital Status": "婚姻状况", + "Full Name (Marital)": "全名(婚姻)", + "Expiration Date": "截止日期", + "Capture an Image of Your ID Document Back": "拍摄您的身份证件图像", + "ID Documents Front": "身份证件正面", + "First Name": "名", + "CardID": "卡号", + "Full Name": "全名", + "Vehicle Details Front": "车辆详细信息 正面", + "Plate Number": "车牌号码", + "Owner Name": "业主姓名", + "Vehicle Details Back": "车辆详情 返回", + "Make": "制作", + "Model": "模型", + "Year": "年", + "Chassis": "机壳", + "Color": "颜色", + "Displacement": "移位", + "Fuel": "燃料", + "Tax Expiry Date": "纳税到期日", + "Inspection Date": "检验日期", + "Capture an Image of Your car license back": "拍回您的汽车驾照图像", + "Capture an Image of Your Driver’s License": "拍摄您的驾驶执照的图像", + "Sign in with Google for easier email and name entry": + "使用 Google 登录以更轻松地输入电子邮件和姓名", + "You will choose allow all the time to be ready receive orders": + "您将选择允许所有时间准备好接收订单", + "Welcome to Sefer!": "欢迎来到塞弗!", + "Get to your destination quickly and easily.": "快速、轻松地到达目的地。", + "Enjoy a safe and comfortable ride.": "享受安全舒适的乘车体验。", + "Choose Language": "选择语言", + "Login": "登录", + "Pay with Wallet": "使用钱包支付", + "Invalid MPIN": "MPIN 无效", + "Invalid OTP": "无效一次性密码", + "Enter your email address": "输入你的电子邮箱地址", + "Please enter Your Email.": "请输入您的电子邮件。", + "Enter your phone number": "输入你的电话号码", + "Please enter your phone number.": "请输入您的电话号码。", + "Please enter Your Password.": "请输入您的密码。", + "Submit": "提交", + "if you dont have account": "如果您没有帐户", + "Register": "登记", + "Accept Ride's Terms & Review Privacy Notice": "接受乘车条款并查看隐私声明", + "By selecting 'I Agree' below, I have reviewed and agree to the Terms of Use and acknowledge the Privacy Notice. I am at least 18 years of age.": + "选择下面的“我同意”,即表示我已查看并同意使用条款并承认隐私声明。我已年满 18 岁。", + "I Agree": "我同意", + "First name": "名", + "Enter your first name": "输入您的名字", + "Please enter your first name.": "请输入您的名字。", + "Last name": "姓", + "Enter your last name": "输入您的姓氏", + "Please enter your last name.": "请输入您的姓氏。", + "City": "城市", + "Please enter your City.": "请输入您的城市。", + "Male": "男性", + "Female": "女性", + "Verify Email": "验证邮件", + "We sent 5 digit to your Email provided": "我们向您提供的电子邮件发送了 5 位数字", + "5 digit": "5位数字", + "Send Verification Code": "发送验证码", + "Your Ride Duration is": "您的骑行时间是", + "You will be thier in": "你将会在", + "You trip distance is": "您的行程距离是", + "Fee is": "费用为", + "From :": "从 :", + "To :": "到 :", + "Add Promo": "添加促销", + "Confirm Selection": "确认选择", + "distance is": "距离是", + "duration is": "持续时间是", + "I don't need a ride anymore": "我不再需要搭车了", + "I was just trying the application": "我只是在尝试该应用程序", + "No driver accepted my request": "没有司机接受我的请求", + "I added the wrong pick-up/drop-off location": "我添加了错误的接送地点", + "I don't have a reason": "我没有理由", + "Other": "其他", + "Can we know why you want to cancel Ride ?": "我们可以知道您为什么要取消行程吗?", + "Cancel Ride": "取消乘车", + "Add Payment Method": "添加付款方式", + "Your Wallet balance is": "您的钱包余额是", + "Ride Wallet": "骑行钱包", + "Payment Method": "付款方式", + "Type here Place": "在此输入地点", + "Are You sure to ride to": "您确定要乘车前往", + "Confirm": "确认", + "Back": "后退", + "You are Delete": "你正在删除", + "Deleted": "已删除", + "You Dont Have Any places yet !": "您还没有任何位置!", + "Favorite Places": "最喜欢的地方", + "From : Current Location": "来自 : 当前位置", + "Where to": "去哪儿", + "Notifications": "通知", + "Profile": "轮廓", + "Home": "家", + "My Cared": "我的关心", + "Add Card": "添加卡", + "Add Credit Card": "添加信用卡", + "Please enter the cardholder name": "请输入持卡人姓名", + "Please enter the expiry date": "请输入有效期", + "Please enter the CVV code": "请输入CVV码", + "Go To Favorite Places": "去最喜欢的地方", + "Go to this Target": "前往该目标", + "My Profile": "我的简历", + "Sign Out": "登出", + "Home Page": "主页", + "Are you want to go to this site": "你想访问这个网站吗", + "MyLocation": "我的位置", + "my location": "我的位置", + "Target": "目标", + "Update": "更新", + "You Should choose rate figure": "您应该选择费率数字", + "Login Captin": "登录队长", + "Register Captin": "注册队长", + "Send Verfication Code": "发送验证码", + "KM": "知识管理", + "End Ride": "结束骑行", + "Minute": "分钟", + "Go to passenger Location now": "立即前往乘客位置", + "Duration of the Ride is": "骑行持续时间为", + "Distance of the Ride is": "骑行距离为", + "Name of the Passenger is": "乘客姓名是", + "Hello this is Captain": "你好,这是队长", + "Start the Ride": "开始骑行", + "Please Wait If passenger want To Cancel!": "如果旅客想取消,请稍候!", + "Total Duration:": "总持续时间:", + "Active Duration:": "活跃时间:", + "Waiting for Captin ...": "等待队长...", + "Age is": "年龄是", + "Rating is": "评级为", + "to arrive you.": "到达你身边。", + "Order History": "订单历史", + "My Wallet": "我的钱包", + "Tariff": "关税", + "Settings": "设置", + "Feed Back": "反馈", + "Promos": "促销", + "Please enter a valid 16-digit card number": "请输入有效的 16 位卡号", + "Add Phone": "添加电话", + "Please enter a phone number": "请输入电话号码", + "You dont Add Emergency Phone Yet!": "您还没有添加紧急电话!", + "You will arrive to your destination after": "您将在之后到达目的地", + "You can cancel Ride now": "您现在可以取消行程", + "You Can cancel Ride After Captain did not come in the time": + "队长未按时到达后您可以取消乘车", + "If you in Car Now. Press Start The Ride": "如果你现在在车里。按开始骑行", + "You Dont Have Any amount in": "您没有任何金额", + "Wallet!": "钱包!", + "You Have": "你有", + "Save Credit Card": "保存信用卡", + "Show Promos": "显示促销", + "10 and get 4% discount": "满 10 即可享受 4% 折扣", + "20 and get 6% discount": "满 20 即可享受 6% 折扣", + "40 and get 8% discount": "满 40 即可享受 8% 折扣", + "100 and get 11% discount": "满 100 即可享受 11% 折扣", + "Pay with Your PayPal": "使用 PayPal 付款", + "You will choose one of above !": "您将选择以上之一!", + "Cancel": "取消", + "Delete My Account": "删除我的账户", + "Edit Profile": "编辑个人资料", + "Name": "姓名", + "Update Gender": "更新性别", + "Education": "教育", + "Update Education": "更新教育", + "Employment Type": "雇佣类型", + "SOS Phone": "求救电话", + "High School Diploma": "高中毕业文凭", + "Associate Degree": "副学士学位", + "Bachelor's Degree": "学士学位", + "Master's Degree": "硕士", + "Doctoral Degree": "博士学位", + "Promos For today": "今天的促销", + "Copy this Promo to use it in your Ride!": "复制此促销信息以在您的骑行中使用!", + "To change some Settings": "更改某些设置", + "To change Language the App": "更改应用程序语言", + "Order Request Page": "订单请求页面", + "Rouats of Trip": "旅行路线", + "Passenger Name is": "乘客姓名是", + "Total From Passenger is": "来自乘客的总计是", + "Duration To Passenger is": "到达乘客的时间是", + "Distance To Passenger is": "到乘客的距离是", + "Total For You is": "为您提供的总计是", + "Distance is": "距离是", + "KM": "知识管理", + "Duration of Trip is": "行程持续时间为", + "Minutes": "分钟", + "Apply Order": "申请订单", + "Refuse Order": "拒绝订单", + "Rate Captain": "评分队长", + "Enter your Note": "输入您的备注", + "Type something...": "输入一些东西...", + "Submit rating": "提交评分", + "Rate Passenger": "票价乘客", + "Ride Summary": "骑行总结", + "welcome_message": "欢迎消息", + "app_description": "应用程序描述", + "get_to_destination": "到达目的地", + "get_a_ride": "搭个便车", + "safe_and_comfortable": "安全舒适", + "committed_to_safety": "致力于安全", + "Driver Applied the Ride for You": "司机为您申请行程", + "Show latest promo": "显示最新促销", + "Cancel Trip": "取消行程", + "Passenger Cancel Trip": "乘客取消行程", + "Please stay on the picked point.": "请留在选定的点上。", + "Trip is Begin": "旅行开始了", + "Hi ,I will go now": "嗨,我现在就去", + "Passenger come to you": "乘客来找你", + "Hi ,I Arrive your site": "你好,我到达你的网站", + "Driver Finish Trip": "司机完成行程", + "you will pay to Driver": "您将支付给司机", + "Driver Cancel Your Trip": "司机取消您的行程", + "you will pay to Driver you will be pay the cost of driver time look to your SEFER Wallet": + "您将向司机付款 您将支付司机时间费用 请查看您的 SEFER 钱包", + "I will go now": "我要走了", + "You Have Tips": "你有秘诀", + "tips": "尖端", + "Total is": "总计为", + "الْمَجْمُوع هُوَ": "🌟🌟🌟🌟🌟🌟🌟🌟🌟🌟🌟🌟🌟🌟", + "No,I want": "不,我想", + "Your fee is": "您的费用是", + "Do you want to pay Tips for this Driver": "您想为此司机支付小费吗", + "Tip is": "提示是", + "Tip is": "提示是", + "Camera Access Denied.": "相机访问被拒绝。", + "Open Settings": "打开设置", + "GPS Required Allow !.": "需要 GPS 允许!。", + "Your Account is Deleted": "您的帐户已删除", + "Are you sure to delete your account?": "您确定要删除您的帐户吗?", + "Your data will be erased after 2 weeks": "您的数据将在 2 周后被删除", + "And you will can't return to use app after 1 month": + "1 个月后您将无法返回使用应用程序", + "وَلَن تَسْتَطِيع اسْتِخْدَام التَّطْبِيق مَرَّة أُخْرَى بَعْد شَهْر": + "驶", + "Enter Your First Name": "输入您的名字", + "Are you Sure to LogOut?": "您确定要退出吗?", + "Email Wrong": "电子邮件错误", + "Email you inserted is Wrong.": "您输入的电子邮件有误。", + "You have finished all times": "你已经完成了所有时间", + "if you want help you can email us here": "如果您需要帮助,您可以在这里给我们发电子邮件", + "Thanks": "谢谢", + "Email Us": "给我们发电子邮件", + "I cant register in your app in face detection": "我无法在您的应用程序中注册人脸检测", + "Hi": "你好", + "No face detected": "未检测到人脸", + "Image detecting result is": "图像检测结果为", + "from 3 times Take Attention": "3次起 注意", + "Be sure for take accurate images please": "请务必拍摄准确的图像", + "You have": "你有", + "لَدَيْك": "😄😄😄😄😄", + "image verified": "图像已验证", + "Next": "下一个", + "There is no help Question here": "这里没有帮助问题", + "Call End": "通话结束", + "You dont have Points": "您没有积分", + "You Are Stopped For this Day !": "今天你就被阻止了!", + "You must be charge your Account": "您必须向您的帐户收费", + "You Refused 3 Rides this Day that is the reason": + "您今天拒绝了 3 次乘车,这就是原因", + "See you Tomorrow!": "明天见!", + "لِقَائِنَا غَدًا!": "吖吖吖吖!", + "Recharge my Account": "为我的帐户充值", + "Ok , See you Tomorrow": "好的明天见", + "You are Stopped": "你被阻止了", + "Connected": "连接的", + "Not Connected": "未连接", + "Your are far from passenger location": "您距离乘客位置较远", + "go to your passenger location before": "前往您的乘客位置之前", + "Passenger cancel trip": "乘客取消行程", + "يُلْغِي الرَّاكِب الرِّحْلَة": "🌟🌟🌟🌟🌟🌟🌟🌟🌟🌟🌟🌟🌟🌟🌟🌟🌟", + "You will get cost of your work for this trip": "您将获得本次旅行的工作费用", + "in your wallet": "在你的钱包里", + "you gain": "你获得", + "Order Cancelled": "订单已取消", + "Order Cancelled by Passenger": "乘客取消订单", + "Success": "成功", + "Feedback data saved successfully": "反馈数据保存成功", + "No Promo for today .": "今天没有促销。", + "Select your destination": "选择您的目的地", + "Search for your Start point": "搜索您的起点", + "Search for waypoint": "搜索航点", + "Current Location": "当前位置", + "Add Location 1": "添加位置 1", + "You must Verify email !.": "您必须验证电子邮件!", + "Cropper": "农作物", + "Saved Sucssefully": "保存成功", + "Select Date": "选择日期", + "Birth Date": "出生日期", + "Ok": "好的", + "the 500 points equal 30 JOD": "500 点等于 30 JOD", + "the 500 points equal 30 JOD for you": "500 积分等于 30 JOD 给您", + "So go and gain your money": "所以去赚你的钱吧", + "فَاسْتَحِقَّ فُلُوسَك وَاكْسِب النِّقَاط": + "❗️❗️❗️❗️❗️❗️❗️❗️❗️❗️❗️❗️❗️❗️❗️❗️❗️❗️❗️❗️❗️❗️❗️❗️❗️❗️❗️❗️❗️❗️❗️", + "token updated": "令牌已更新", + "Add Location 2": "添加位置 2", + "Add Location 3": "添加位置 3", + "Add Location 4": "添加位置 4", + "Waiting for your location": "等待你的位置", + "Search for your destination": "搜索您的目的地", + "Hi! This is": "你好!这是", + "I am using": "我在用", + "to ride with": "一起骑", + "as the driver.": "作为司机。", + "is driving a": "正在驾驶", + "with license plate": "有车牌的", + "I am currently located at": "我目前位于", + "Please go to Car now": "请立即前往汽车", + "If you need to reach me, please contact the driver directly at": + "如果您需要联系我,请直接联系司机", + "No Car or Driver Found in your area.": "在您所在的地区找不到汽车或司机。", + "Please Try anther time": "请稍后尝试", + "There no Driver Aplly your order sorry for that": + "没有司机申请您的订单,对此深表歉意", + "Trip Cancelled": "行程取消", + "The Driver Will be in your location soon .": "司机很快就会到达您所在的位置。", + "The distance less than 500 meter.": "距离小于500米。", + "Promo End !": "促销结束!", + "There is no notification yet": "目前还没有通知", + "Use Touch ID or Face ID to confirm payment": + "使用 Touch ID 或 Face ID 确认付款", + "Contact us for any questions on your order.": "如果您对订单有任何疑问,请联系我们。", + "Pyament Cancelled .": "皮亚门特已取消。", + "type here": "在此输入", + "Scan Driver License": "扫描驾驶执照", + "Please put your licence in these border": "请将您的驾照放在这些边框内", + "Camera not initialized yet": "相机尚未初始化", + "Take Image": "拍摄图像", + "AI Page": "人工智能页面", + "Take Picture Of ID Card": "拍摄身份证照片", + "Take Picture Of Driver License Card": "拍摄驾驶执照卡的照片", + "We are process picture please wait": "我们正在处理图片请稍候", + "There is no data yet.": "还没有数据。", + "Name :": "姓名 :", + "Drivers License Class:": "驾驶执照类别:", + "Document Number:": "文件号码:", + "Address:": "地址:", + "Height:": "高度:", + "Expiry Date:": "到期日:", + "Date of Birth:": "出生日期:", + "You can\"t continue with us .": "你不能继续和我们在一起。", + "You should renew Driver license": "您应该更新驾驶执照", + "Detect Your Face": "检测你的脸", + "Go to next step": "进入下一步", + "scan Car License.": "扫描汽车驾照。", + "aاسْتِخْرَاج رُخْصَة السَّيَّارَة.": "是的。", + "Name in arabic": "阿拉伯语名称", + "Drivers License Class": "驾驶执照等级", + "Date of Birth": "出生日期", + "Age": "年龄", + "Lets check Car license": "让我们检查一下汽车牌照", + "Car Kind": "汽车种类", + "Car Plate": "车牌", + "Lets check License Back Face": "让我们检查许可证背面", + "Car License Card": "汽车牌照", + "No image selected yet": "尚未选择图像", + "Made :": "制成 :", + "model :": "模型 :", + "VIN :": "车辆识别号码:", + "year :": "年 :", + "ُExpire Date": "到期日期", + "Login Driver": "登录驱动程序", + "Password must br at least 6 character.": "密码必须至少包含 6 个字符。", + "if you don\"t have account": "如果您没有帐户", + "Here recorded trips audio": "这里记录了旅行音频", + "Register as Driver": "注册成为司机", + "Privacy Notice": "隐私声明", + "By selecting 'I Agree' below, I have reviewed and agree to the Terms of Use and acknowledge the": + "通过选择下面的“我同意”,我已阅读并同意使用条款并承认", + ". I am at least 18 years of age.": "。我已年满 18 岁。", + "Log Out Page": "注销页面", + "Log Off": "注销", + "Register Driver": "注册驱动程序", + "Verify Email For Driver": "验证司机的电子邮件", + "Admin DashBoard": "管理仪表板", + "Your name": "你的名字", + "your ride is applied": "您的行程已被应用", + "Your password": "你的密码", + "H and": "手", + "LE": "LE", + "JOD": "乔德", + "m": "米", + "We search nearst Driver to you": "我们搜索离您最近的司机", + "please wait till driver accept your order": "请等待司机接受您的订单", + "No accepted orders? Try raising your trip fee to attract riders.": + "没有接受订单?尝试提高行程费用以吸引乘客。", + "You should select one": "你应该选择一个", + "The driver accept your order for": "司机接受您的订单", + "Increase Fee": "增加费用", + "No, thanks": "不,谢谢", + "The driver on your way": "司机正在路上", + "Total price from": "总价从", + "Order Details Speed": "订单详情 速度", + "Order Applied": "已应用订单", + "accepted your order": "已接受您的订单", + "We regret to inform you that another driver has accepted this order.": + "我们很遗憾地通知您,另一位司机已接受此订单。", + "Selected file:": "选定的文件:", + "Your trip cost is": "您的旅行费用是", + "this will delete all files from your device": "这将从您的设备中删除所有文件", + "you have a negative balance of": "您的余额为负数", + "in your": "在你的", + "Exclusive offers and discounts always with the Sefer app": + "Sefer 应用程序始终提供独家优惠和折扣", + "Please go to Car Driver": "请前往汽车司机", + "wallet due to a previous trip.": "由于之前的旅行,钱包被掏空了。", + "Submit Question": "提交问题", + "Please enter your Question.": "请输入您的问题。", + "Help Details": "帮助详情", + "No trip yet found": "尚未找到行程", + "No Response yet.": "尚未回复。", + "You Earn today is": "您今天的收入是", + "You Have in": "你已经在", + "Total points is": "总分是", + "Total Connection Duration:": "总连接持续时间:", + "H and": "手", + "Passenger name :": "乘客姓名:", + "Cost Of Trip IS": "旅行费用是", + "Arrival time": "到达时间", + "arrival time to reach your point": "到达目的地的到达时间", + "For Speed and Delivery trips, the price is calculated dynamically. For Comfort trips, the price is based on time and distance": + "对于速度和送货行程,价格是动态计算的。对于舒适旅行,价格根据时间和距离而定", + "Hello this is Driver": "你好,这是司机", + "Is the Passenger in your Car ?": "乘客在你的车里吗?", + "Please wait for the passenger to enter the car before starting the trip.": + "请等待乘客上车后再开始行程。", + "No ,still Waiting.": "不,还在等待。", + "I arrive you": "我到达你", + "I Arrive your site": "我到达你的网站", + "You are not in near to passenger location": "您不在乘客位置附近", + "please go to picker location exactly": "请准确前往选取器位置", + "You Can Cancel Trip And get Cost of Trip From": "您可以取消行程并获取行程费用:", + "Are you sure to cancel?": "您确定要取消吗?", + "Yes": "是的", + "Insert Emergincy Number": "插入紧急号码", + "Best choice for comfort car and flexible route and stops point": + "舒适用车、灵活路线和停靠点的最佳选择", + "Insert": "插入", + "This is for delivery or a motorcycle.": "这是用于送货或摩托车。", + "This trip goes directly from your starting point to your destination for a fixed price. The driver must follow the planned route": + "此行程以固定价格直接从您的出发地前往目的地。司机必须按照计划的路线行驶", + "You can decline a request without any cost": "您可以拒绝请求,无需支付任何费用", + "Perfect for adventure seekers who want to experience something new and exciting": + "非常适合想要体验新鲜刺激的冒险爱好者", + "My current location is:": "我当前的位置是:", + "and I have a trip on": "我有一次旅行", + "App with Passenger": "乘客应用程序", + "مع الراكب": "请注意", + "You will be pay the cost to driver or we will get it from you on next trip": + "您将向司机支付费用,或者我们将在下次行程时向您收取费用", + "Trip has Steps": "旅行有台阶", + "Distance from Passenger to destination is": "乘客到目的地的距离为", + "price is": "价格是", + "This ride type does not allow changes to the destination or additional stops": + "此行程类型不允许更改目的地或增加停靠站", + "This price may be changed": "此价格可能会更改", + "No SIM card, no problem! Call your driver directly through our app. We use advanced technology to ensure your privacy.": + "没有SIM卡,没问题!通过我们的应用程序直接致电您的司机。我们使用先进的技术来确保您的隐私。", + "This ride type allows changes, but the price may increase": + "此行程类型允许更改,但价格可能会上涨", + "message From passenger": "乘客留言", + "Select one message": "选择一条消息", + "My location is correct. You can search for me using the navigation app": + "我的位置是正确的。您可以使用导航应用程序搜索我", + "I'm waiting for you": "我在等你", + "Hello, I'm at the agreed-upon location": "你好,我已经到了约定的地点", + "We noticed the speed is exceeding 100 km/h. Please slow down for your safety. If you feel unsafe, you can share your trip details with a contact or call the police using the red SOS button.": + "我们注意到速度超过了 100 公里/小时。为了您的安全,请减速慢行。如果您感觉不安全,可以与联系人分享您的行程详细信息或使用红色 SOS 按钮报警。", + "Warning: Speeding detected!": "警告:检测到超速!", + "Please help! Contact me as soon as possible.": "请帮忙!尽快联系我。", + "Share Trip Details": "分享行程详情", + "Car Plate is": "车牌是", + "the 300 points equal 300 L.E for you": "300 点等于 300 L.E", + "So go and gain your money": "所以去赚你的钱吧", + "the 300 points equal 300 L.E": "300 点等于 300 L.E", + "The payment was not approved. Please try again.": "付款未获批准。请再试一次。", + "Payment Failed": "支付失败", + "Error": "错误", + "An error occurred during the payment process.": "付款过程中发生错误。", + "The payment was approved.": "付款已获批准。", + "Payment Successful": "支付成功", + "No ride found yet": "尚未找到乘车路线", + "Accept Order": "接受订单", + "reject your order.": "拒绝您的订单。", + "Bottom Bar Example": "底栏示例", + "Driver phone": "司机电话", + "Statistics": "统计数据", + "Origin": "起源", + "Destination": "目的地", + "Driver Name": "司机姓名", + "Driver Car Plate": "司机车牌", + "Available for rides": "可乘坐", + "Scan Id": "扫描 ID", + "Camera not initilaized yet": "相机尚未初始化", + "Scan ID MklGoogle": "扫描 ID MklGoogle", + "Language": "语言", + "Jordan": "约旦", + "USA": "美国", + "Egypt": "埃及", + "Turkey": "火鸡", + "Saudi Arabia": "沙特阿拉伯", + "Qatar": "卡塔尔", + "Bahrain": "巴林", + "Kuwait": "科威特", + "But you have a negative salary of": "但你的工资为负数", + "Promo Code": "促销代码", + "Your trip distance is": "您的行程距离是", + "Enter promo code": "输入促销代码", + "You have promo!": "你有促销!", + "Cost Duration": "费用持续时间", + "Duration is": "持续时间是", + "Leave": "离开", + "Join": "加入", + "You Should be select reason.": "你应该选择理由。", + "\$": "\$", + "Waiting for Driver ...": "等待司机...", + "Latest Recent Trip": "最近最近的旅行", + "from your list": "从你的清单中", + "Do you want to change Work location": "您想更改工作地点吗", + "Do you want to change Home location": "您想更改家庭位置吗", + "We Are Sorry That we dont have cars in your Location!": + "很抱歉,您所在的位置没有汽车!", + "Choose from Map": "从地图中选择", + "Pick your ride location on the map - Tap to confirm": + "在地图上选择您的乘车地点 - 点击确认", + "To Work": "上班", + "Are you want to go this site": "你想去这个网站吗", + "Closest & Cheapest": "最近且最便宜", + "Work Saved": "工作已保存", + "Sefer is the ride-hailing app that is safe, reliable, and accessible.": + "Sefer 是一款安全、可靠且易于使用的叫车应用程序。", + "With Sefer, you can get a ride to your destination in minutes.": + "通过 Sefer,您可以在几分钟内乘车到达目的地。", + "Sefer is committed to safety, and all of our captains are carefully screened and background checked.": + "Sefer 致力于安全,我们所有的船长都经过仔细的筛选和背景调查。", + "To Home": "回家", + "Home Saved": "已保存首页", + "Destination selected": "已选择目的地", + "Now select start pick": "现在选择开始选择", + "Pick from map": "从地图上选择", + "Click here point": "点击这里点", + "No Car in your site. Sorry!": "您的网站上没有汽车。对不起!", + "Nearest Car for you about": "距离您最近的汽车", + "N/A": "不适用", + "From :": "从 :", + "Get Details of Trip": "获取行程详情", + "If you want add stop click here": "如果您想添加停靠站,请单击此处", + "Driver": "司机", + "Where you want go": "你想去的地方", + "My Card": "我的卡", + "Start Record": "开始记录", + "Wallet": "钱包", + "History of Trip": "旅行历史", + "Helping Center": "帮助中心", + "Record saved": "记录已保存", + "Trips recorded": "记录的行程", + "Select Your Country": "选择您的国家/地区", + "To ensure you receive the most accurate information for your location, please select your country below. This will help tailor the app experience and content to your country.": + "为确保您收到最准确的所在位置信息,请在下面选择您所在的国家/地区。这将有助于根据您所在的国家/地区定制应用程序体验和内容。", + "Are you sure to delete recorded files": "您确定要删除录音文件吗", + "Select recorded trip": "选择记录的行程", + "Card Number": "卡号", + "Hi, Where to": "你好,去哪里", + "Pick your destination from Map": "从地图中选择您的目的地", + "Add Stops": "添加停靠点", + "Get Direction": "得到指引", + "Add Location": "添加位置", + "Switch Rider": "开关骑手", + "You will arrive to your destination after timer end.": + "计时器结束后您将到达目的地。", + "You can cancel trip": "您可以取消行程", + "The driver waitting you in picked location .": "司机在指定地点等候您。", + "Pay with Your": "用您的支付", + "Pay with Credit Card": "使用信用卡支付", + "Payment History": "支付历史", + "Show Promos to Charge": "显示促销活动以收费", + "Point": "观点", + "Driver Wallet": "司机钱包", + "Total Points is": "总积分为", + "Total Budget from trips is": "旅行总预算为", + "Total Amount:": "总金额:", + "Total Budget from trips by": "行程总预算", + "Credit card is": "信用卡是", + "بطاقة الائتمان هي": "巴巴巴", + "This amount for all trip I get from Passengers": "我从乘客那里得到的所有行程的金额", + "Pay from my budget": "从我的预算中支付", + "This amount for all trip I get from Passengers and Collected For me in": + "这笔金额是我从乘客处获得并为我收取的所有行程的金额", + "You can buy points from your budget": "您可以从预算中购买积分", + "insert amount": "插入量", + "You can buy Points to let you online": "您可以购买积分让您上网", + "by this list below": "通过下面的列表", + "من خلال القائمة أدناه": "🇨🇳 🇨🇳", + "Create Wallet to receive your money": "创建钱包来接收您的钱", + "Enter your feedback here": "在此输入您的反馈", + "Please enter your feedback.": "请输入您的反馈。", + "Feedback": "反馈", + "Submit": "提交", + "Click here to Show it in Map": "单击此处在地图中显示它", + "Canceled": "取消", + "Type your Email": "输入您的电子邮件", + "No I want": "不,我想", + "Email is": "电子邮件是", + "Phone Number is": "电话号码是", + "Date of Birth is": "出生日期是", + "Sex is": "性别是", + "Car Details": "汽车详情", + "VIN is": "车辆识别号是", + "Color is": "颜色是", + "Make is": "品牌是", + "Model is": "型号是", + "Year is": "年份是", + "Expiration Date": "截止日期", + "Edit Your data": "编辑您的数据", + "write vin for your car": "为您的汽车写入 vin", + "VIN": "车架号", + "write Color for your car": "为你的车写颜色", + "write Make for your car": "为你的汽车写下“Make for your car”", + "write Model for your car": "为您的汽车编写型号", + "write Year for your car": "写下你的车的年份", + "write Expiration Date for your car": "写下您的汽车的到期日期", + "Tariffs": "关税", + "Minimum fare": "最低票价", + "Maximum fare": "最高票价", + "Flag-down fee": "降旗费", + "Including Tax": "含税", + "BookingFee": "预订费", + "Morning": "早晨", + "from 07:30 till 10:30 (Thursday, Friday, Saturday, Monday)": + "07:30 至 10:30(周四、周五、周六、周一)", + "Evening": "晚上", + "from 12:00 till 15:00 (Thursday, Friday, Saturday, Monday)": + "12:00 至 15:00(周四、周五、周六、周一)", + "Night": "夜晚", + "You have in account": "您账户中有", + "Select Country": "选择国家", + "Ride Today :": "今天骑行:", + "After this period": "这段时间之后", + "You can\"t cancel!": "您无法取消!", + "لا تستطيع الغاء الرحله": + "??????????????????????????????????????????????????????????????????????????????", + "from 23:59 till 05:30": "23:59 至 05:30", + "Rate Driver": "费率驱动因素", + "Total Cost is": "总成本为", + "Write note": "写笔记", + "Time to arrive": "到达时间", + "Ride Summaries": "骑行总结", + "Total Cost": "总成本", + "Average of Hours of": "平均小时数", + "is ON for this month": "本月已开启", + "Days": "天", + "Total Hours on month": "当月总小时数", + "Counts of Hours on days": "每天的小时数", + "OrderId": "订单号", + "created time": "创建时间", + "Speed Over": "超速", + "I will slow down": "我会放慢脚步", + "Map Passenger": "地图乘客", + "Be Slowly": "慢慢来", + "If you want to make Google Map App run directly when you apply order": + "如果您想让Google Map App在申请订单时直接运行", + "You can change the language of the app": "您可以更改应用程序的语言", + "Your Budget less than needed": "您的预算低于所需", + "You can change the Country to get all features": "您可以更改国家/地区以获得所有功能", + "Change Country": "改变国家" + } + }; +} diff --git a/siro_service/lib/controller/local_notification.dart b/siro_service/lib/controller/local_notification.dart new file mode 100644 index 0000000..1a4c60a --- /dev/null +++ b/siro_service/lib/controller/local_notification.dart @@ -0,0 +1,330 @@ +import 'dart:async'; +import 'dart:io'; + +import 'package:get/get.dart'; +import 'package:permission_handler/permission_handler.dart'; +import 'package:timezone/data/latest.dart' as tz; +import 'package:timezone/timezone.dart' as tz; +import 'package:flutter_local_notifications/flutter_local_notifications.dart'; +import '../../main.dart'; + +class NotificationController extends GetxController { + final FlutterLocalNotificationsPlugin _flutterLocalNotificationsPlugin = + FlutterLocalNotificationsPlugin(); + + @override + void onInit() { + super.onInit(); + initNotifications(); + } + + // Initializes the local notifications plugin + Future initNotifications() async { + const AndroidInitializationSettings android = + AndroidInitializationSettings('@mipmap/launcher_icon'); + DarwinInitializationSettings ios = DarwinInitializationSettings( + requestAlertPermission: true, + requestBadgePermission: true, + requestSoundPermission: true, + // onDidReceiveLocalNotification: + // (int id, String? title, String? body, String? payload) async {}, + ); + InitializationSettings initializationSettings = + InitializationSettings(android: android, iOS: ios); + await _flutterLocalNotificationsPlugin.initialize(initializationSettings); + + tz.initializeTimeZones(); + print('Notifications initialized'); + } + + // Displays a notification with the given title and message + void showNotification(String title, String message, String tone) async { + final AndroidNotificationDetails android = AndroidNotificationDetails( + 'high_importance_channel', + 'High Importance Notifications', + importance: Importance.max, + priority: Priority.high, + showWhen: false, + sound: RawResourceAndroidNotificationSound(tone), + ); + + const DarwinNotificationDetails ios = DarwinNotificationDetails( + sound: 'default', + presentAlert: true, + presentBadge: true, + presentSound: true, + ); + + final NotificationDetails details = + NotificationDetails(android: android, iOS: ios); + await _flutterLocalNotificationsPlugin.show(0, title, message, details); + print('Notification shown: $title - $message'); + } +// /Users/hamzaaleghwairyeen/development/App/ride 2/lib/controller/firebase/local_notification.dart + +// Assume _flutterLocalNotificationsPlugin is initialized somewhere in your code + + // void scheduleNotificationsForSevenDays( + // String title, String message, String tone) async { + // final AndroidNotificationDetails android = AndroidNotificationDetails( + // 'high_importance_channel', + // 'High Importance Notifications', + // importance: Importance.max, + // priority: Priority.high, + // sound: RawResourceAndroidNotificationSound(tone), + // ); + + // const DarwinNotificationDetails ios = DarwinNotificationDetails( + // sound: 'default', + // presentAlert: true, + // presentBadge: true, + // presentSound: true, + // ); + + // final NotificationDetails details = + // NotificationDetails(android: android, iOS: ios); + + // // Check for the exact alarm permission on Android 12 and above + // if (Platform.isAndroid) { + // if (await Permission.scheduleExactAlarm.isDenied) { + // if (await Permission.scheduleExactAlarm.request().isGranted) { + // print('SCHEDULE_EXACT_ALARM permission granted'); + // } else { + // print('SCHEDULE_EXACT_ALARM permission denied'); + // return; + // } + // } + // } + + // // Schedule notifications for the next 7 days + // for (int day = 0; day < 7; day++) { + // // Schedule for 8:00 AM + // await _scheduleNotificationForTime( + // day, 8, 0, title, message, details, day * 1000 + 1); + + // // Schedule for 3:00 PM + // await _scheduleNotificationForTime( + // day, 15, 0, title, message, details, day * 1000 + 2); // Unique ID + + // // Schedule for 8:00 PM + // await _scheduleNotificationForTime( + // day, 20, 0, title, message, details, day * 1000 + 3); // Unique ID + // } + + // print('Notifications scheduled successfully for the next 7 days'); + // } + void scheduleNotificationsForSevenDays( + String title, String message, String tone) async { + final AndroidNotificationDetails android = AndroidNotificationDetails( + 'high_importance_channel', + 'High Importance Notifications', + importance: Importance.max, + priority: Priority.high, + sound: RawResourceAndroidNotificationSound(tone), + ); + + const DarwinNotificationDetails ios = DarwinNotificationDetails( + sound: 'default', + presentAlert: true, + presentBadge: true, + presentSound: true, + ); + + final NotificationDetails details = + NotificationDetails(android: android, iOS: ios); + + // Check for the exact alarm permission on Android 12 and above + if (Platform.isAndroid) { + if (await Permission.scheduleExactAlarm.isDenied) { + if (await Permission.scheduleExactAlarm.request().isGranted) { + print('SCHEDULE_EXACT_ALARM permission granted'); + } else { + print('SCHEDULE_EXACT_ALARM permission denied'); + return; + } + } + } + + // Schedule notifications for the next 7 days + for (int day = 0; day < 7; day++) { + // List of notification times + final notificationTimes = [ + {'hour': 8, 'minute': 0, 'id': day * 1000 + 1}, // 8:00 AM + {'hour': 15, 'minute': 0, 'id': day * 1000 + 2}, // 3:00 PM + {'hour': 20, 'minute': 0, 'id': day * 1000 + 3}, // 8:00 PM + ]; + + for (var time in notificationTimes) { + final notificationId = time['id'] as int; + + // Check if this notification ID is already stored + bool isScheduled = box.read('notification_$notificationId') ?? false; + + if (!isScheduled) { + // Schedule the notification if not already scheduled + await _scheduleNotificationForTime( + day, + time['hour'] as int, + time['minute'] as int, + title, + message, + details, + notificationId, + ); + + // Mark this notification ID as scheduled in GetStorage + box.write('notification_$notificationId', true); + } else { + print('Notification with ID $notificationId is already scheduled.'); + } + } + } + + print('Notifications scheduled successfully for the next 7 days'); + } + + void scheduleNotificationsForTimeSelected( + String title, String message, String tone, DateTime timeSelected) async { + final AndroidNotificationDetails android = AndroidNotificationDetails( + 'high_importance_channel', + 'High Importance Notifications', + importance: Importance.max, + priority: Priority.high, + sound: RawResourceAndroidNotificationSound(tone), + ); + + const DarwinNotificationDetails ios = DarwinNotificationDetails( + sound: 'default', + presentAlert: true, + presentBadge: true, + presentSound: true, + ); + + final NotificationDetails details = + NotificationDetails(android: android, iOS: ios); + + // Check for the exact alarm permission on Android 12 and above + if (Platform.isAndroid) { + if (await Permission.scheduleExactAlarm.isDenied) { + if (await Permission.scheduleExactAlarm.request().isGranted) { + print('SCHEDULE_EXACT_ALARM permission granted'); + } else { + print('SCHEDULE_EXACT_ALARM permission denied'); + return; + } + } + } + + // Schedule notifications for 10 and 30 minutes before the timeSelected + await _scheduleNotificationForTimeVIP( + timeSelected.subtract(const Duration(minutes: 10)), // 10 minutes before + title, + message, + details, + 1, // Unique ID for 10-minute before notification + ); + + await _scheduleNotificationForTimeVIP( + timeSelected.subtract(const Duration(minutes: 30)), // 30 minutes before + title, + message, + details, + 2, // Unique ID for 30-minute before notification + ); + + print('Notifications scheduled successfully for the time selected'); + } + + Future _scheduleNotificationForTimeVIP( + DateTime scheduledDate, + String title, + String message, + NotificationDetails details, + int notificationId, + ) async { + // Initialize and set Cairo timezone + tz.initializeTimeZones(); + var cairoLocation = tz.getLocation('Africa/Cairo'); + + final now = tz.TZDateTime.now(cairoLocation); + + // Convert to Cairo time + tz.TZDateTime scheduledTZDateTime = + tz.TZDateTime.from(scheduledDate, cairoLocation); + + // Check if 10 minutes before the scheduled time is in the past + if (scheduledTZDateTime + .subtract(const Duration(minutes: 10)) + .isBefore(now)) { + // If the 10 minutes before the scheduled time is in the past, don't schedule + print( + 'Scheduled time minus 10 minutes is in the past. Skipping notification.'); + return; // Skip this notification + } + + print('Current time (Cairo): $now'); + print('Scheduling notification for: $scheduledTZDateTime'); + + await _flutterLocalNotificationsPlugin.zonedSchedule( + notificationId, // Unique ID for each notification + title, + message, + scheduledTZDateTime, + details, + androidScheduleMode: AndroidScheduleMode.exact, + // uiLocalNotificationDateInterpretation: + // UILocalNotificationDateInterpretation.absoluteTime, + matchDateTimeComponents: + null, // Don't repeat automatically; we handle manually + ); + + print('Notification scheduled successfully for: $scheduledTZDateTime'); + } + + Future _scheduleNotificationForTime( + int dayOffset, + int hour, + int minute, + String title, + String message, + NotificationDetails details, + int notificationId, + ) async { + // Initialize and set Cairo timezone + tz.initializeTimeZones(); + var cairoLocation = tz.getLocation('Africa/Cairo'); + + final now = tz.TZDateTime.now(cairoLocation); + tz.TZDateTime scheduledDate = tz.TZDateTime( + cairoLocation, + now.year, + now.month, + now.day + dayOffset, // Add offset to schedule for the next days + hour, + minute, + ); + + // If the scheduled time is in the past, move it to the next day + if (scheduledDate.isBefore(now)) { + scheduledDate = scheduledDate.add(const Duration(days: 1)); + } + + print('Current time (Cairo): $now'); + print('Scheduling notification for: $scheduledDate'); + + await _flutterLocalNotificationsPlugin.zonedSchedule( + notificationId, // Unique ID for each notification + title, + message, + scheduledDate, + details, + androidScheduleMode: AndroidScheduleMode.exact, + // uiLocalNotificationDateInterpretation: + // UILocalNotificationDateInterpretation.absoluteTime, + matchDateTimeComponents: + null, // Don't repeat automatically; we handle 7 days manually + ); + + print('Notification scheduled successfully for: $scheduledDate'); + } +} diff --git a/siro_service/lib/controller/login_controller.dart b/siro_service/lib/controller/login_controller.dart new file mode 100644 index 0000000..fb599ce --- /dev/null +++ b/siro_service/lib/controller/login_controller.dart @@ -0,0 +1,89 @@ +import 'dart:convert'; +import 'package:flutter/material.dart'; +import 'package:get/get.dart'; +import 'package:siro_service/constant/links.dart'; +import 'package:siro_service/controller/functions/crud.dart'; +import 'package:siro_service/controller/functions/device_helper.dart'; +import 'package:siro_service/controller/functions/encrypt_decrypt.dart'; + +import '../constant/box_name.dart'; +import '../main.dart'; +import '../print.dart'; +import '../views/home/main.dart'; + +import 'package:flutter_secure_storage/flutter_secure_storage.dart'; + +class LoginController extends GetxController { + var email = TextEditingController(); // Kept for UI compatibility + var password = TextEditingController(); + final formKey = GlobalKey(); + + final FlutterSecureStorage storage = const FlutterSecureStorage(); + + void login() async { + // Ensure fingerprint is ready + String fingerprint = box.read(BoxName.fingerPrint) ?? ''; + if (fingerprint.isEmpty) { + fingerprint = await DeviceHelper.getDeviceFingerprint(); + } + + String? storedPassword = await storage.read(key: 'password'); + String pass = storedPassword ?? password.text; + + if (pass.isEmpty && !formKey.currentState!.validate()) return; + + var payload = { + "fingerprint": fingerprint, + "password": pass, + "aud": "service", + }; + + Log.print('🚀 Login Payload: $payload'); + var res = await CRUD().post(link: AppLink.login, payload: payload); + Log.print('📥 Login Response: $res'); + + if (res != 'failure' && res is Map && res['status'] == 'success') { + var d = res[ + 'message']; // V1 returns {status, message: {jwt, data: {user...}}} + + // Store JWT & HMAC + final jwt = d['jwt']; + final hmac = d['hmac']; + await box.write(BoxName.jwt, c(jwt)); + if (hmac != null) { + await box.write(BoxName.hmac, hmac); + } + + // Store User Data + var userData = d['data']; + await storage.write(key: 'name', value: userData['first_name']); + await storage.write(key: 'driverID', value: userData['id'].toString()); + await storage.write(key: 'password', value: pass); + await box.write(BoxName.employeename, userData['first_name']); + await box.write(BoxName.password, pass); + + Get.offAll(() => Main()); + } else { + Get.snackbar( + 'خطأ'.tr, + res is Map ? res['message'].toString().tr : 'فشل تسجيل الدخول'.tr, + backgroundColor: Colors.red.withOpacity(0.7), + colorText: Colors.white, + ); + } + } + + @override + void onInit() async { + await EncryptionHelper.initialize(); + await DeviceHelper.getDeviceFingerprint(); + + // Auto login if credentials exist + String? storedPassword = await storage.read(key: 'password'); + if (storedPassword != null) { + login(); + } + + super.onInit(); + } +} diff --git a/siro_service/lib/controller/mainController/main_controller.dart b/siro_service/lib/controller/mainController/main_controller.dart new file mode 100644 index 0000000..9aa8a02 --- /dev/null +++ b/siro_service/lib/controller/mainController/main_controller.dart @@ -0,0 +1,567 @@ +import 'dart:io'; + +import 'package:flutter/material.dart'; +import 'package:get/get.dart'; +import 'package:siro_service/constant/colors.dart'; +import 'package:siro_service/constant/links.dart'; +import 'package:siro_service/controller/functions/crud.dart'; +import 'package:siro_service/controller/mainController/pages/driver_page.dart'; +import 'package:siro_service/main.dart'; +import 'package:siro_service/views/widgets/my_dialog.dart'; +import 'package:url_launcher/url_launcher.dart'; + +import '../../print.dart'; +import 'pages/passengers_page.dart'; + +class MainController extends GetxController { + final formKey = GlobalKey(); + bool isLoading = false; + final passengerPhoneController = TextEditingController(); + final driverPhoneController = TextEditingController(); + final notesController = TextEditingController(); + final carplateController = TextEditingController(); + TextEditingController colorController = TextEditingController(); + TextEditingController makeController = TextEditingController(); + TextEditingController modelController = TextEditingController(); + TextEditingController expirationDateController = TextEditingController(); + TextEditingController yearController = TextEditingController(); + TextEditingController ownerController = TextEditingController(); + TextEditingController carOwnerWorkController = TextEditingController(); + TextEditingController driverNameController = TextEditingController(); + TextEditingController nationalIdController = TextEditingController(); + TextEditingController birthDateController = TextEditingController(); + TextEditingController licenseTypeController = TextEditingController(); + TextEditingController phoneController = TextEditingController(); + TextEditingController phoneCarController = TextEditingController(); + TextEditingController carNumberController = TextEditingController(); + TextEditingController manufactureYearController = TextEditingController(); + TextEditingController carModelController = TextEditingController(); + TextEditingController carTypeController = TextEditingController(); + TextEditingController siteCarController = TextEditingController(); + TextEditingController siteDriverController = TextEditingController(); + TextEditingController registrationDateController = TextEditingController(); + Map passengerData = {}; + Map driverData = {}; + List filteredDrivers = []; + var color = ''.obs; + var colorHex = ''.obs; + + @override + void onInit() { + super.onInit(); + // refreshDashboardStats(); // Removed to save data consumption at start + } + + Future refreshDashboardStats() async { + isLoading = true; + update(); + try { + await Future.wait([ + getDriverWantCompleteRegistration(), + getDriverNotCompleteRegistration(), + getNewDriverRegister(), + ]); + } catch (e) { + Log.print('Error refreshing stats: $e'); + } + isLoading = false; + update(); + } + + Future searchPassengerByPhone() async { + if (formKey.currentState == null || formKey.currentState!.validate()) { + isLoading = true; + update(); + await getPassengersByPhone(); + isLoading = false; + update(); + Get.back(); + if (passengerData.isEmpty) { + Get.snackbar('Error'.tr, 'Passenger not found'.tr, + backgroundColor: Colors.red, colorText: Colors.white); + return; + } + Get.to(() => PassengersPage()); + } + } + + void searchDrivers(String query) { + if (query.isEmpty) { + filteredDrivers = driverNotCompleteRegistration; + update(); + } else { + filteredDrivers = driverNotCompleteRegistration + .where((driver) => driver['phone_number'] + .toString() + .toLowerCase() + .contains(query.toLowerCase())) + .toList(); + update(); + } + } + + void updateDriverField(String key, dynamic value) async { + // Update locally + driverData['message'][0][key] = value; + Log.print('driverData: ${driverData['message'][0]['driverID']}'); + update(); + + var res = await CRUD().post(link: AppLink.updateDriver, payload: { + 'driverID': driverData['message'][0]['driverID'].toString(), + key: value.toString(), + }); + if (res == 'failure') { + Get.snackbar('Error', 'Failed to update driver data', + backgroundColor: AppColor.redColor); + } else { + Get.snackbar('Success', 'Driver data updated successfully', + backgroundColor: AppColor.greenColor); + } + // Optionally fetch driver again + // await getDriverData(); + } + + Future makePhoneCall(String phoneNumber) async { + final Uri launchUri = Uri( + scheme: 'tel', + path: phoneNumber, + ); + await launchUrl(launchUri); + } + + Future launchCommunication( + String method, String contactInfo, String message) async { + // رقّم فقط (بدون + أو مسافات) + final phone = contactInfo.replaceAll(RegExp(r'[^0-9]'), ''); + final encodedMsg = Uri.encodeComponent(message); + + Uri? uri; + + if (Platform.isIOS) { + switch (method) { + case 'phone': + uri = Uri.parse('tel:$phone'); + break; + case 'sms': + uri = Uri.parse('sms:$phone?body=$encodedMsg'); + break; + case 'whatsapp': + uri = Uri.parse( + 'https://api.whatsapp.com/send?phone=$phone&text=$encodedMsg'); + break; + case 'email': + uri = + Uri.parse('mailto:$contactInfo?subject=Subject&body=$encodedMsg'); + break; + default: + return; + } + } else if (Platform.isAndroid) { + switch (method) { + case 'phone': + uri = Uri.parse('tel:$phone'); + break; + case 'sms': + uri = Uri.parse('sms:$phone?body=$encodedMsg'); + break; + case 'whatsapp': + { + final waDeepLink = + Uri.parse('whatsapp://send?phone=$phone&text=$encodedMsg'); + if (await canLaunchUrl(waDeepLink)) { + await launchUrl(waDeepLink, mode: LaunchMode.externalApplication); + return; + } else { + final webUri = Uri.parse( + 'https://api.whatsapp.com/send?phone=$phone&text=$encodedMsg'); + if (await canLaunchUrl(webUri)) { + await launchUrl(webUri, mode: LaunchMode.externalApplication); + return; + } + // لو ما في متصفح أساسًا + throw 'No handler for WhatsApp links'; + } + } + case 'email': + uri = + Uri.parse('mailto:$contactInfo?subject=Subject&body=$encodedMsg'); + break; + default: + return; + } + } else { + return; + } + + final ok = await canLaunchUrl(uri); + if (ok) { + await launchUrl(uri, mode: LaunchMode.externalApplication); + } else { + // ممكن تضيف Snackbar/Toast هنا + } + } + + List driverNotCompleteRegistration = []; + Future getDriverNotCompleteRegistration() async { + var res = await CRUD() + .get(link: AppLink.getDriverNotCompleteRegistration, payload: {}); + if (res != 'failure') { + var d = res['message']; + driverNotCompleteRegistration = d; + filteredDrivers = driverNotCompleteRegistration; + update(); + } else { + driverNotCompleteRegistration = []; + update(); + } + } + + Future deleteDriverNotCompleteRegistration(String phone) async { + var res = await CRUD() + .get(link: AppLink.deleteDriverNotCompleteRegistration, payload: { + 'phone': phone, + }); + if (res != 'failure') { + Get.snackbar(res, '', backgroundColor: AppColor.greenColor); + // await getDriverWantCompleteRegistration(); + update(); + } else { + Get.snackbar(res, ''); + } + } + + List driverWantCompleteRegistration = []; + Future getDriverWantCompleteRegistration() async { + var res = + await CRUD().get(link: AppLink.getDriversWaitingActive, payload: {}); + if (res != 'failure') { + var d = res['message']; + driverWantCompleteRegistration = d; + filteredDrivers = driverWantCompleteRegistration; + update(); + } else { + driverWantCompleteRegistration = []; + update(); + } + } + + List driversPhoneNotComplete = []; + Future getDriversPhoneNotComplete() async { + var res = + await CRUD().get(link: AppLink.getDriversPhoneNotComplete, payload: {}); + if (res != 'failure') { + var d = res['message']; + driverWantCompleteRegistration = d; + filteredDrivers = driverWantCompleteRegistration; + update(); + } else { + Get.snackbar(res, ''); + } + } + + List newDriverRegister = []; + Future getNewDriverRegister() async { + var res = await CRUD().get(link: AppLink.getNewDriverRegister, payload: {}); + if (res != 'failure') { + var d = res['message']; + newDriverRegister = d; + update(); + } else { + newDriverRegister = []; + update(); + } + } + + Future addWelcomeCall(String driveId) async { + var res = await CRUD().post(link: AppLink.addWelcomeDriverNote, payload: { + "driverId": driveId, + "notes": notesController.text, + }); + if (res != 'failure') { + Get.snackbar('Success'.tr, '', backgroundColor: AppColor.greenColor); + } + } + + String selectedStatus = "I'm not ready yet".tr; + List passengerNotCompleteRegistration = []; + Future getPassengerNotCompleteRegistration() async { + var res = await CRUD() + .get(link: AppLink.getPassengersNotCompleteRegistration, payload: {}); + if (res != 'failure') { + var d = res['message']; + passengerNotCompleteRegistration = d; + update(); + } else { + Get.snackbar(res, ''); + } + } + + void setSelectedStatus(String status) { + selectedStatus = status; + update(); + } + + final List statusOptions = [ + "I'm not ready yet".tr, + "I don't have a suitable vehicle".tr, + "I'll register when the app is fully launched".tr, + "I need more help understanding the app".tr, + "My documents have expired".tr, + ]; + + List carPlateNotEdit = []; + + getCarPlateNotEdit() async { + var res = await CRUD().get(link: AppLink.getCarPlateNotEdit, payload: {}); + if (res != 'failure') { + var d = res['message']; + carPlateNotEdit = d; + update(); + } else { + MyDialog().getDialog('No Car found yet'.tr, 'thanks'.tr, const SizedBox(), + () { + Get.back(); + }); + } + } + + List driverWithoutCar = []; + getdriverWithoutCar() async { + var res = await CRUD().get(link: AppLink.getdriverWithoutCar, payload: {}); + if (res != 'failure') { + var d = res['message']; + driverWithoutCar = d; + update(); + } else { + MyDialog().getDialog('No Car found yet'.tr, 'thanks'.tr, const SizedBox(), + () { + Get.back(); + }); + } + } + + Future addRegistrationCarEgyptHandling({ + required String driverId, + required String carPlate, + required String color, + required String colorHex, + required String year, + required String make, + required String model, + required String expirationDate, + required String owner, + }) async { + try { + isLoading = true; + update(); + + var payload = { + 'driverID': driverId, + 'vin': 'vin', + 'car_plate': carPlate, + 'make': make, + 'model': model, + 'year': year, + 'expiration_date': expirationDate, + 'color': color, + 'owner': owner, + 'color_hex': colorHex, + 'address': 'addressCar', + 'displacement': 'displacement', + 'fuel': 'fuel', + 'registration_date': '2024-09-06', + }; + + Log.print('Payload: $payload'); + + var res = + await CRUD().post(link: AppLink.addCartoDriver, payload: payload); + + isLoading = false; + update(); + + var status = res; + Log.print('res: $res'); + Log.print('status: $status'); + + if (status != 'failure' && status['status'] == 'success') { + await Future.wait([ + CRUD().post( + link: + '${AppLink.seferAlexandriaServer}/ride/RegisrationCar/add.php', + payload: payload), + CRUD().post( + link: '${AppLink.seferGizaServer}/ride/RegisrationCar/add.php', + payload: payload), + ]); + + Get.snackbar('Success', 'Registration successful', + backgroundColor: AppColor.greenColor); + Get.back(); + } else { + Log.print('Error: Unexpected status: ${status['status']}'); + Get.snackbar('Error', 'Registration failed', + backgroundColor: Colors.red); + } + } catch (e) { + Log.print('Error: $e'); + Get.snackbar('Error', 'An error occurred during registration', + backgroundColor: Colors.red); + } + } + + editCarPlateNotEdit( + String driverId, + String carPlate, + String color, + String colorHex, + String year, + String make, + String model, + String expirationDate, + String owner, + ) async { + var res = await CRUD().post(link: AppLink.editCarPlate, payload: { + "driverId": driverId, + "carPlate": carPlate, + "color": color, + "color_hex": colorHex, + "make": make, + "year": year, + "model": model, + "expiration_date": expirationDate.toString(), + "owner": owner, + "employee": storage.read(key: 'name').toString(), + }); + Log.print('res: ${res}'); + if (res != 'failure') { + // Get.snackbar(res, '', backgroundColor: AppColor.greenColor); + Get.back(); + carplateController.clear(); + yearController.clear(); + makeController.clear(); + modelController.clear(); + ownerController.clear(); + + await getCarPlateNotEdit(); + update(); + } else { + Get.snackbar(res, '', backgroundColor: AppColor.redColor); + } + } + + // editCarPlateNotEdit(String driverId, carPlate) async { + // var res = await CRUD().post(link: AppLink.editCarPlate, payload: { + // "driverId": driverId, + // "carPlate": carPlate, + // }); + // if (res != 'failure') { + // Get.snackbar(res, '', backgroundColor: AppColor.greenColor); + // carplateController.clear(); + // await getCarPlateNotEdit(); + // update(); + // } else { + // Get.snackbar(res, '', backgroundColor: AppColor.redColor); + // } + // } + + saveNoteForDriverNotCompleteRegistration(String phone, editor, note) async { + var res = await CRUD().post( + link: AppLink.addNotesDriver, + payload: {"phone": phone, "editor": editor, "note": note}); + if (res != 'failure') { + Get.snackbar(res, '', backgroundColor: AppColor.greenColor); + getDriversPhoneNotComplete(); + notesController.clear(); + } else { + Get.snackbar(res, '', backgroundColor: AppColor.redColor); + } + } + + saveNoteForPassengerNotCompleteRegistration( + String phone, editor, note) async { + var res = await CRUD().post( + link: AppLink.addNotesPassenger, + payload: {"phone": phone, "editor": editor, "note": note}); + if (res != 'failure') { + Get.snackbar(res, '', backgroundColor: AppColor.greenColor); + notesController.clear(); + } else { + Get.snackbar(res, '', backgroundColor: AppColor.redColor); + } + } + + searchDriverByPhone() async { + if (formKey.currentState == null || formKey.currentState!.validate()) { + isLoading = true; + update(); + await getDriverByPhone(); + isLoading = false; + update(); + Get.back(); + if (driverData.isEmpty) { + Get.snackbar('Error'.tr, 'Driver not found'.tr, + backgroundColor: Colors.red, colorText: Colors.white); + return; + } + Get.to(() => DriverPage()); + } + } + + searchDriverByNational() async { + if (formKey.currentState == null || formKey.currentState!.validate()) { + isLoading = true; + update(); + await getDriverByNational(); + isLoading = false; + update(); + Get.back(); + if (driverData.isEmpty) { + Get.snackbar('Error'.tr, 'Driver not found'.tr, + backgroundColor: Colors.red, colorText: Colors.white); + return; + } + Get.to(() => DriverPage()); + } + } + + getPassengersByPhone() async { + var res = await CRUD().get( + link: AppLink.getPassengersByPhone, + payload: {"phone": passengerPhoneController.text}); + + if (res != 'failure') { + var d = res; + passengerData = d; + update(); + } + } + + getDriverByPhone() async { + var res = await CRUD().get( + link: AppLink.getDriverByPhone, + payload: {"phone": driverPhoneController.text}); + + if (res != 'failure') { + var d = res; + driverData = d; + update(); + } else { + Get.snackbar('Error', 'Driver not found', backgroundColor: Colors.red); + } + } + + getDriverByNational() async { + var res = await CRUD().get( + link: AppLink.getDriverByNational, + payload: {"national_number": driverPhoneController.text}); + + if (res != 'failure') { + var d = res; + driverData = d; + update(); + } else { + Get.snackbar('Error', 'Driver not found', backgroundColor: Colors.red); + } + } +} diff --git a/siro_service/lib/controller/mainController/pages/add_car.dart b/siro_service/lib/controller/mainController/pages/add_car.dart new file mode 100644 index 0000000..35ec905 --- /dev/null +++ b/siro_service/lib/controller/mainController/pages/add_car.dart @@ -0,0 +1,378 @@ +import 'package:flutter/cupertino.dart'; +import 'package:flutter/material.dart'; +import 'package:get/get.dart'; +import 'package:intl/intl.dart'; +import 'package:siro_service/constant/style.dart'; +import 'package:siro_service/controller/functions/launch.dart'; +import 'package:siro_service/views/widgets/my_scafold.dart'; + +import '../../../constant/colors.dart'; +import '../../../constant/links.dart'; +import '../../../views/widgets/my_textField.dart'; +import '../../functions/encrypt_decrypt.dart'; +import '../../functions/image.dart'; +import '../main_controller.dart'; + +class AddCar extends StatelessWidget { + const AddCar({super.key}); + + @override + Widget build(BuildContext context) { + Get.put(MainController()); + + return GetBuilder(builder: (mainController) { + return MyScaffold( + title: 'Edit car details'.tr, + isleading: true, + body: [ + Expanded( + child: ListView.builder( + padding: const EdgeInsets.all(16.0), + itemCount: mainController + .driverWithoutCar.length, // 10 fields + 1 save button + itemBuilder: (context, index) { + var carData = mainController.driverWithoutCar[index]; + return Padding( + padding: const EdgeInsets.all(8.0), + child: InkWell( + onTap: () { + Get.to(AddCarForm(carData: carData)); + }, + child: Container( + decoration: AppStyle.boxDecoration1, + child: Text((carData['name_arabic']))), + ), + ); + }), + ), + ], + ); + }); + } +} + +class AddCarForm extends StatelessWidget { + final Map carData; + const AddCarForm({super.key, required this.carData}); + @override + Widget build(BuildContext context) { + Get.put(MainController()); + + return GetBuilder(builder: (mainController) { + return MyScaffold( + title: 'Add Car', + action: Row( + children: [ + IconButton( + onPressed: () { + makePhoneCall(carData['phone']); + }, + icon: const Icon(Icons.phone), + ), + IconButton( + onPressed: () { + launchCommunication('whatsapp', carData['phone'], ''); + }, + icon: const Icon( + Icons.message, + color: AppColor.greenColor, + ), + ), + ], + ), + isleading: true, + body: [ + ListView( + children: [ + Column( + children: [ + GestureDetector( + onLongPress: () async { + await ImageController().choosImage( + AppLink.uploadEgypt, carData['id'], 'car_front'); + }, + child: Image.network( + '${AppLink.server}/card_image/car_front-${carData['id']}.jpg', + height: 200, + width: double.maxFinite, + fit: BoxFit.fill, + errorBuilder: (BuildContext context, Object exception, + StackTrace? stackTrace) { + // If the image fails to load, use the _copy version + return Image.network( + '${AppLink.server}/card_image/car_front-${carData['id']}_copy.jpg', + height: 200, + width: double.maxFinite, + fit: BoxFit.fill, + ); + }, + ), + ), + GestureDetector( + onLongPress: () async { + await ImageController().choosImage( + AppLink.uploadEgypt, carData['id'], 'car_back'); + }, + child: Image.network( + '${AppLink.server}/card_image/car_back-${carData['id']}.jpg', + height: 200, + width: double.maxFinite, + fit: BoxFit.fill, + errorBuilder: (BuildContext context, Object exception, + StackTrace? stackTrace) { + // If the image fails to load, use the _copy version + return Image.network( + '${AppLink.server}/card_image/car_back-${carData['id']}_copy.jpg', + height: 200, + width: double.maxFinite, + fit: BoxFit.fill, + ); + }, + ), + ), + ], + ), + const SizedBox(height: 9), + Form( + key: mainController.formKey, + child: Column( + children: [ + Row( + mainAxisAlignment: MainAxisAlignment.spaceEvenly, + children: [ + SizedBox( + width: Get.width * .6, + child: MyTextForm( + controller: mainController.carplateController, + label: 'car plate'.tr, + hint: 'car plate'.tr, + type: TextInputType.name, + ), + ), + IconButton( + onPressed: () async { + if (mainController.formKey.currentState! + .validate()) { + await mainController + .addRegistrationCarEgyptHandling( + driverId: carData['id'].toString(), + carPlate: + mainController.carplateController.text, + color: mainController.colorController.text, + colorHex: + mainController.colorHex.value.toString(), + year: mainController.yearController.text, + make: mainController.makeController.text, + model: mainController.modelController.text, + expirationDate: mainController + .expirationDateController.text, + owner: mainController.ownerController.text, + ); + } + }, + icon: const Icon( + Icons.upload_outlined, + color: AppColor.blueColor, + ), + ), + ], + ), + // Other fields + + Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + SizedBox( + width: Get.width * .4, + child: MyTextForm( + controller: mainController.yearController, + label: 'Year'.tr, + hint: 'Year'.tr, + type: TextInputType.number, + ), + ), + SizedBox( + width: Get.width * .4, + child: DropdownButtonFormField( + decoration: InputDecoration( + labelText: 'Color'.tr, // Localized label + ), + value: mainController.colorHex.value.isEmpty + ? null + : mainController.colorHex + .value, // Use the hex value as the current value + items: [ + {'red'.tr: '#FF0000'}, + {'green'.tr: '#008000'}, + {'blue'.tr: '#0000FF'}, + {'black'.tr: '#000000'}, + {'white'.tr: '#FFFFFF'}, + {'yellow'.tr: '#FFFF00'}, + {'purple'.tr: '#800080'}, + {'orange'.tr: '#FFA500'}, + {'pink'.tr: '#FFC0CB'}, + {'brown'.tr: '#A52A2A'}, + {'gray'.tr: '#808080'}, + {'cyan'.tr: '#00FFFF'}, + {'magenta'.tr: '#FF00FF'}, + {'lime'.tr: '#00FF00'}, + {'indigo'.tr: '#4B0082'}, + {'violet'.tr: '#EE82EE'}, + {'gold'.tr: '#FFD700'}, + {'silver'.tr: '#C0C0C0'}, + {'teal'.tr: '#008080'}, + {'navy'.tr: '#000080'}, + ].map((colorMap) { + String colorName = colorMap.keys.first; + String colorValue = colorMap.values.first; + return DropdownMenuItem( + value: colorValue, + child: Text(colorName), + ); + }).toList(), + onChanged: (value) { + if (value != null) { + // Find the selected color name based on the hex value + String selectedColorName = ''; + for (var colorMap in [ + {'red'.tr: '#FF0000'}, + {'green'.tr: '#008000'}, + {'blue'.tr: '#0000FF'}, + {'black'.tr: '#000000'}, + {'white'.tr: '#FFFFFF'}, + {'yellow'.tr: '#FFFF00'}, + {'purple'.tr: '#800080'}, + {'orange'.tr: '#FFA500'}, + {'pink'.tr: '#FFC0CB'}, + {'brown'.tr: '#A52A2A'}, + {'gray'.tr: '#808080'}, + {'cyan'.tr: '#00FFFF'}, + {'magenta'.tr: '#FF00FF'}, + {'lime'.tr: '#00FF00'}, + {'indigo'.tr: '#4B0082'}, + {'violet'.tr: '#EE82EE'}, + {'gold'.tr: '#FFD700'}, + {'silver'.tr: '#C0C0C0'}, + {'teal'.tr: '#008080'}, + {'navy'.tr: '#000080'}, + ]) { + if (colorMap.values.first == value) { + selectedColorName = colorMap.keys.first; + break; + } + } + + mainController.colorController.text = + selectedColorName; + mainController.colorHex.value = value; + } + }, + ), + ), + ], + ), + + Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + SizedBox( + width: Get.width * .4, + child: MyTextForm( + controller: mainController.makeController, + label: 'Make'.tr, + hint: 'Make'.tr, + type: TextInputType.name, + ), + ), + SizedBox( + width: Get.width * .4, + child: MyTextForm( + controller: mainController.modelController, + label: 'Model'.tr, + hint: 'Model'.tr, + type: TextInputType.name, + ), + ), + ], + ), + + Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + SizedBox( + width: Get.width * .4, + child: TextField( + controller: + mainController.expirationDateController, + decoration: InputDecoration( + labelText: 'Expiration Date'.tr, + hintText: 'Expiration Date'.tr, + ), + readOnly: + true, // Make the field read-only to prevent manual input + onTap: () async { + DateTime pickedDate = + DateTime.now(); // Declare the variable here + + await showCupertinoModalPopup( + context: context, + builder: (context) => Container( + height: 250, + color: Colors.white, + child: Column( + children: [ + SizedBox( + height: 150, + child: CupertinoDatePicker( + initialDateTime: pickedDate, + minimumDate: DateTime( + 1955), // Set the starting date + maximumDate: DateTime( + 2034), // Set the ending date + mode: CupertinoDatePickerMode.date, + onDateTimeChanged: + (DateTime dateTime) { + pickedDate = dateTime; + }, + ), + ), + CupertinoButton( + child: Text('Done'.tr), + onPressed: () { + String formattedDate = + DateFormat('yyyy-MM-dd') + .format(pickedDate); + mainController + .expirationDateController + .text = + formattedDate.toString(); + Navigator.of(context).pop(); + }, + ), + ], + ), + ), + ); + }, + ), + ), + SizedBox( + width: Get.width * .4, + child: MyTextForm( + controller: mainController.ownerController, + label: 'Owner'.tr, + hint: 'Owner'.tr, + type: TextInputType.name, + ), + ), + ], + ), + ], + ), + ) + ], + ) + ]); + }); + } +} diff --git a/siro_service/lib/controller/mainController/pages/alexandria_besr_driver.dart b/siro_service/lib/controller/mainController/pages/alexandria_besr_driver.dart new file mode 100644 index 0000000..4ad22c8 --- /dev/null +++ b/siro_service/lib/controller/mainController/pages/alexandria_besr_driver.dart @@ -0,0 +1,56 @@ +import 'package:flutter/material.dart'; +import 'package:get/get.dart'; +import 'package:siro_service/views/widgets/my_scafold.dart'; + +import '../../best_driver_controllers.dart'; +import '../../functions/encrypt_decrypt.dart'; + +class DriverTheBestAlexandria extends StatelessWidget { + const DriverTheBestAlexandria({super.key}); + + @override + Widget build(BuildContext context) { + Get.put(DriverTheBestAlexandriaController(), permanent: true); + return MyScaffold( + title: 'Alexandria'.tr, + body: [ + GetBuilder(builder: (driverthebest) { + return driverthebest.driver.isNotEmpty + ? ListView.builder( + itemCount: driverthebest.driver.length, + itemBuilder: (context, index) { + final driver = driverthebest.driver[index]; + return ListTile( + leading: CircleAvatar( + child: Text( + (int.parse(driver['driver_count'] * 5) / 3600) + .toStringAsFixed(0), + ), + ), + title: Text((driver['name_arabic']) ?? + 'Unknown Name'), + subtitle: Text( + 'Phone: ${(driver['phone']) ?? 'N/A'}'), + trailing: IconButton( + onPressed: () async { + Get.defaultDialog( + title: + 'are you sure to pay to this driver gift'.tr, + middleText: '', + onConfirm: () async {}, + onCancel: () => Get.back()); + }, + icon: const Icon(Icons.wallet_giftcard_rounded), + ), + ); + }, + ) + : const Center( + child: Text('No drivers available.'), + ); + }) + ], + isleading: true, + ); + } +} diff --git a/siro_service/lib/controller/mainController/pages/best_driver_page.dart b/siro_service/lib/controller/mainController/pages/best_driver_page.dart new file mode 100644 index 0000000..0143b26 --- /dev/null +++ b/siro_service/lib/controller/mainController/pages/best_driver_page.dart @@ -0,0 +1,111 @@ +import 'dart:convert'; + +import 'package:flutter/material.dart'; +import 'package:get/get.dart'; +import 'package:siro_service/controller/functions/encrypt_decrypt.dart'; +import 'package:siro_service/views/widgets/my_scafold.dart'; + +import '../../../constant/colors.dart'; +import '../../../constant/links.dart'; +import '../../../views/widgets/elevated_btn.dart'; +import '../../functions/crud.dart'; +import 'alexandria_besr_driver.dart'; +import 'giza_best_driver.dart'; + +class DriverTheBest extends StatelessWidget { + const DriverTheBest({super.key}); + + @override + Widget build(BuildContext context) { + Get.put(Driverthebest()); + return MyScaffold( + title: 'Best Drivers'.tr, + body: [ + Column( + children: [ + Row( + mainAxisAlignment: MainAxisAlignment.spaceAround, + children: [ + MyElevatedButton( + title: 'Giza', + onPressed: () { + Get.to(() => DriverTheBestGiza()); + }), + MyElevatedButton( + title: 'Alexandria', + onPressed: () { + Get.to(() => DriverTheBestAlexandria()); + }), + ], + ), + GetBuilder(builder: (driverthebest) { + return driverthebest.driver.isNotEmpty + ? SizedBox( + height: Get.height * .7, + child: ListView.builder( + itemCount: driverthebest.driver.length, + itemBuilder: (context, index) { + final driver = driverthebest.driver[index]; + return ListTile( + leading: CircleAvatar( + child: Text( + ((int.parse(driver['driver_count']) * 5) / 3600) + .toStringAsFixed(0), + ), + ), + title: Text((driver['name_arabic']) ?? + 'Unknown Name'), + subtitle: Text( + 'Phone: ${(driver['phone']) ?? 'N/A'}'), + trailing: IconButton( + onPressed: () async { + // Get.defaultDialog( + // title: + // 'are you sure to pay to this driver gift'.tr, + // middleText: '', + // onConfirm: () async { + // // final wallet = Get.put(WalletController()); + // // await wallet.addPaymentToDriver('100', + // // driver['id'].toString(), driver['token']); + // // await wallet.addSeferWallet( + // // '100', driver['id'].toString()); + // }, + // onCancel: () => Get.back()); + }, + icon: const Icon(Icons.wallet_giftcard_rounded), + ), + ); + }, + ), + ) + : const Center( + child: Text('No drivers available.'), + ); + }), + ], + ) + ], + isleading: true, + ); + } +} + +class Driverthebest extends GetxController { + bool isLoading = false; + List driver = []; + getBestDriver() async { + var res = await CRUD().get(link: AppLink.getBestDriver, payload: {}); + if (res != 'failure') { + driver = res['message']; + update(); + } else { + Get.snackbar('error', '', backgroundColor: AppColor.redColor); + } + } + + @override + void onInit() { + getBestDriver(); + super.onInit(); + } +} diff --git a/siro_service/lib/controller/mainController/pages/complaint.dart b/siro_service/lib/controller/mainController/pages/complaint.dart new file mode 100644 index 0000000..74e54c3 --- /dev/null +++ b/siro_service/lib/controller/mainController/pages/complaint.dart @@ -0,0 +1,12 @@ +import 'package:flutter/material.dart'; +import 'package:get/get.dart'; +import 'package:siro_service/views/widgets/my_scafold.dart'; + +class Complaint extends StatelessWidget { + const Complaint({super.key}); + + @override + Widget build(BuildContext context) { + return MyScaffold(title: "View complaint".tr, isleading: true, body: []); + } +} diff --git a/siro_service/lib/controller/mainController/pages/contact_page.dart b/siro_service/lib/controller/mainController/pages/contact_page.dart new file mode 100644 index 0000000..f1da38a --- /dev/null +++ b/siro_service/lib/controller/mainController/pages/contact_page.dart @@ -0,0 +1,13071 @@ +// import 'dart:convert'; + +// import 'package:contacts_service/contacts_service.dart'; +// import 'package:flutter/material.dart'; +// import 'package:get/get.dart'; +// import 'package:permission_handler/permission_handler.dart'; + +// class ContactPage extends StatelessWidget { +// const ContactPage({super.key}); + +// @override +// Widget build(BuildContext context) { +// Get.put(ContactPageController()); +// return Scaffold( +// appBar: AppBar( +// title: const Text('Contact Page'), +// ), +// body: Container(), +// ); +// } +// } + +// class ContactPageController extends GetxController { +// saveContact() async { +// final List contactList = json.decode(jsonString); + +// // Request contact permissions +// final permissionStatus = await Permission.contacts.request(); +// if (permissionStatus.isGranted) { +// // Iterate through each contact in the list +// for (var contactData in contactList) { +// // Create a new contact +// Contact newContact = Contact( +// givenName: contactData['name_arabic'], +// phones: [Item(label: "mobile", value: contactData['phone'])], +// ); + +// // Add the contact to the device's contact list +// await ContactsService.addContact(newContact); +// } +// print("Contacts added successfully."); +// } else { +// print("Permission denied. Cannot add contacts."); +// } +// } + +// @override +// void onInit() { +// saveContact(); +// super.onInit(); +// } +// } + +// const jsonString = ''' +// [ + +// { +// "phone": "+201271133956", +// "name_arabic": "بيتر جيمى وطسن لوقا" +// }, +// { +// "phone": "+201003973327", +// "name_arabic": "علاء عبد العزيز عبد الكريم عبد العزيز" +// }, +// { +// "phone": "+201201988101", +// "name_arabic": "محمد احمد محمود عبد العال" +// }, +// { +// "phone": "+201282427635", +// "name_arabic": "محمد سعيد ابراهيم محمود سيد أحمد" +// }, +// { +// "phone": "+201158158149", +// "name_arabic": "هاني فرج محمد أحمد السيد" +// }, +// { +// "phone": "+201014781950", +// "name_arabic": "مينا صبحى تودرى ذكى" +// }, +// { +// "phone": "+201024033722", +// "name_arabic": "عبد الرحمن محمد عبد الرحمن محمد" +// }, +// { +// "phone": "+201204335344", +// "name_arabic": "حسين محمد محمد دريهم" +// }, +// { +// "phone": "+201118001729", +// "name_arabic": "طارق محمد محمود مبروك" +// }, +// { +// "phone": "+201153202945", +// "name_arabic": "رمضان صلاح علي عبد الدايم" +// }, +// { +// "phone": "+201501047165", +// "name_arabic": "عمر كمال عمر حسن" +// }, +// { +// "phone": "+201065050067", +// "name_arabic": "عمار سعيد قرنى محمد" +// }, +// { +// "phone": "+201270710649", +// "name_arabic": "بيشوى رؤف فرج اسكندر" +// }, +// { +// "phone": "+201061620534", +// "name_arabic": "احمد محمد عبد اللطيف جمعة" +// }, +// { +// "phone": "+201022589642", +// "name_arabic": "محمود محمد جمعه محمد منصور" +// }, +// { +// "phone": "+201116787624", +// "name_arabic": "اسماعيل محمد مصطفى علي" +// }, +// { +// "phone": "+201091285997", +// "name_arabic": "أحمد محمد عبد العاطى حسن" +// }, +// { +// "phone": "+201283329751", +// "name_arabic": "جمال محمد محمود حبلص" +// }, +// { +// "phone": "+201275668382", +// "name_arabic": "وليد سعد عبد القادر مصطفى أبوسكره" +// }, +// { +// "phone": "+201062233580", +// "name_arabic": "محمد نجم الدين عبد العليم محمد سلام" +// }, +// { +// "phone": "+201110040784", +// "name_arabic": "محمود عبد الكريم خليفة جاد الكريم" +// }, +// { +// "phone": "+201000366693", +// "name_arabic": "سيد محمد السيد احمد جمعه" +// }, +// { +// "phone": "+201273747703", +// "name_arabic": "طبقة ماجد سعد محمود" +// }, +// { +// "phone": "+201090009131", +// "name_arabic": "عمرو نبيل عبداللة احمد" +// }, +// { +// "phone": "+201224353363", +// "name_arabic": "محمود عبد الحفيظ زكي حسين" +// }, +// { +// "phone": "+201063294278", +// "name_arabic": "حمود رضا رمضان لويزى" +// }, +// { +// "phone": "+201096260104", +// "name_arabic": "أحمد محمد أحمد محمد حمود" +// }, +// { +// "phone": "+201060525792", +// "name_arabic": "هبة المحمدي سعد الاسكندرانى" +// }, +// { +// "phone": "+201002465331", +// "name_arabic": "ايمن محمد فرغلي احمد" +// }, +// { +// "phone": "+201015840382", +// "name_arabic": "سعد محمد ابراهيم حسن" +// }, +// { +// "phone": "+201141048378", +// "name_arabic": "رامى سمير عطية محمد" +// }, +// { +// "phone": "+201020301781", +// "name_arabic": "عمر فاروق عبد الحميد محمود" +// }, +// { +// "phone": "+201030223422", +// "name_arabic": "شرف الدين محمود محمد شرف الدين" +// }, +// { +// "phone": "+201224053907", +// "name_arabic": "حمادة فتوح عبد الحميد شحاتة" +// }, +// { +// "phone": "+201140877868", +// "name_arabic": "علي خلف ربيع علي" +// }, +// { +// "phone": "+201223063940", +// "name_arabic": "مكرم الله شفيق حنا منقريوس" +// }, +// { +// "phone": "+201000120545", +// "name_arabic": "ناصر حمدي محمد اسماعيل" +// }, +// { +// "phone": "+201117886555", +// "name_arabic": "محمد أحمد محمد حافظ جاد" +// }, +// { +// "phone": "+201274660379", +// "name_arabic": "مصطفي ربيع مصطفي عبدالحكيم" +// }, +// { +// "phone": "+201156175969", +// "name_arabic": "عبد الغنى رمضان عبد الغنى عبد النبى" +// }, +// { +// "phone": "+201554446602", +// "name_arabic": "حسين جمال أحمد محمد" +// }, +// { +// "phone": "+201270149729", +// "name_arabic": "مينا ماهر عبد المسيح زكرى" +// }, +// { +// "phone": "+201004592611", +// "name_arabic": "تامر محمد عبدالله أحمد على" +// }, +// { +// "phone": "+201153774043", +// "name_arabic": "محمد طارق عبده عبد الكريم عزوز" +// }, +// { +// "phone": "+201068653978", +// "name_arabic": "عبد الرحمن ناصر كمال عنيطر" +// }, +// { +// "phone": "+201093594953", +// "name_arabic": "محمد أحمد إبراهيم السيد" +// }, +// { +// "phone": "+201067870774", +// "name_arabic": "فتحي مصطفي فتحي احمد" +// }, +// { +// "phone": "+201095902989", +// "name_arabic": "محمود محمد عشرى محمد" +// }, +// { +// "phone": "+201554387665", +// "name_arabic": "رائف يوحنا العبد جاد" +// }, +// { +// "phone": "+201115790410", +// "name_arabic": "بلال عبد الخالق محمد مطاوع" +// }, +// { +// "phone": "+201014242962", +// "name_arabic": "يوسف صبحى محمد متولى" +// }, +// { +// "phone": "+201278400364", +// "name_arabic": "ابو العلا ابوزيد ابوالعلا على" +// }, +// { +// "phone": "+201148283337", +// "name_arabic": "محمد ياسر على عمر" +// }, +// { +// "phone": "+201145000373", +// "name_arabic": "أحمد كمال الدين ابراهيم محمد عباس" +// }, +// { +// "phone": "+201144175633", +// "name_arabic": "حسان سيد فهمي" +// }, +// { +// "phone": "+201015345569", +// "name_arabic": "حسن سعيد عبدرب النبى عبد الحميد" +// }, +// { +// "phone": "+201021736217", +// "name_arabic": "بدرى عبدالستار مصطفى ندير" +// }, +// { +// "phone": "+201276324558", +// "name_arabic": "عبد السلام رمضان عبد السلام الصادق" +// }, +// { +// "phone": "+201025581505", +// "name_arabic": "محمد رفعت محمد عبد الحميد" +// }, +// { +// "phone": "+201551421493", +// "name_arabic": "عبد الرحمن طة أبو الفتوح ابراهيم" +// }, +// { +// "phone": "+201141438922", +// "name_arabic": "نادية سعيد فهمي محمد عوض" +// }, +// { +// "phone": "+201128080020", +// "name_arabic": "ابراهيم حمدي محمد إبراهيم العربي" +// }, +// { +// "phone": "+201002293148", +// "name_arabic": "محمود علي عبد الشافي ابراهيم" +// }, +// { +// "phone": "+201221771138", +// "name_arabic": "محمد سعيد عبد الواحد حسن" +// }, +// { +// "phone": "+201061187363", +// "name_arabic": "فاتن الشبراوي عبد الفتاح عبدة" +// }, +// { +// "phone": "+201092286018", +// "name_arabic": "زياد أحمد عبد الحكيم عبد الحميد" +// }, +// { +// "phone": "+201023233290", +// "name_arabic": "محمد محمود عبداللاة حفنى" +// }, +// { +// "phone": "+201145558001", +// "name_arabic": "مصطفى أحمد محمود عبد الغفار" +// }, +// { +// "phone": "+201063390858", +// "name_arabic": "محمد عادل احمد محمد عبد الفتاح" +// }, +// { +// "phone": "+201016408801", +// "name_arabic": "مصطفى بهاء محمد عبد الحميد الفقى" +// }, +// { +// "phone": "+201017428808", +// "name_arabic": "اسلام جمعة سيد محمد علام" +// }, +// { +// "phone": "+201141136059", +// "name_arabic": "مصطفي عبد السلام جلال محمد" +// }, +// { +// "phone": "+201029484514", +// "name_arabic": "شريف محمد إبراهيم دويدار" +// }, +// { +// "phone": "+201116377507", +// "name_arabic": "محمد على عبد التواب عبد العظيم" +// }, +// { +// "phone": "+201000856624", +// "name_arabic": "محمد حسني علام السيد" +// }, +// { +// "phone": "+201025227216", +// "name_arabic": "‏مصطفى خالد أحمد عبد الوهاب" +// }, +// { +// "phone": "+201144506047", +// "name_arabic": "عقبى أحمد عقبى احمد" +// }, +// { +// "phone": "+201119187827", +// "name_arabic": "محمود إسماعيل إبراهيم عبد الله" +// }, +// { +// "phone": "+201121513280", +// "name_arabic": "ناصر سعيد عبد الله عبد التواب" +// }, +// { +// "phone": "+201064026674", +// "name_arabic": "عبد الهادى على عبد الهادى جاد" +// }, +// { +// "phone": "+201061617104", +// "name_arabic": "هشام سعيد حسن شعيب" +// }, +// { +// "phone": "+201003962633", +// "name_arabic": "جمال بنداري عطية بنداري" +// }, +// { +// "phone": "+201151007078", +// "name_arabic": "احمد محمد سعيد إبراهيم" +// }, +// { +// "phone": "+201201666266", +// "name_arabic": "أحمد حمدى ياقوت احمد" +// }, +// { +// "phone": "+201123606787", +// "name_arabic": "مصطفى محمود ابوبكر محمود رشاد" +// }, +// { +// "phone": "+201092440560", +// "name_arabic": "احمد محمد طة حسن وهدان" +// }, +// { +// "phone": "+201278178651", +// "name_arabic": "سيد سعيد سيد اسماعيل سلمان" +// }, +// { +// "phone": "+201030673353", +// "name_arabic": "حمادة جلال أحمد دومة" +// }, +// { +// "phone": "+201097058100", +// "name_arabic": "هانى بخيت شفيق اسكاروس" +// }, +// { +// "phone": "+201095667357", +// "name_arabic": "امنيه هاشم محمد رزق" +// }, +// { +// "phone": "+201127111242", +// "name_arabic": "حسين فوزي أحمد مرزوق" +// }, +// { +// "phone": "+201121737527", +// "name_arabic": "محمد عادل حسن مبروك" +// }, +// { +// "phone": "+201287706665", +// "name_arabic": "احمد عبد النعيم احمد عبد النعيم" +// }, +// { +// "phone": "+201222299434", +// "name_arabic": "باسم سامى ظريف سفين" +// }, +// { +// "phone": "+201127233460", +// "name_arabic": "محمد بشير محمد عفيفي" +// }, +// { +// "phone": "+201006939331", +// "name_arabic": "أحمد مدحت محمد نصر" +// }, +// { +// "phone": "+201111516149", +// "name_arabic": "وائل عبد الرحمن محمد بدر" +// }, +// { +// "phone": "+201206640646", +// "name_arabic": "محمد ابراهيم احمد حموده الشربينى" +// }, +// { +// "phone": "+201016212136", +// "name_arabic": "حسام سيد عبد الفتاح شلبي" +// }, +// { +// "phone": "+201148073829", +// "name_arabic": "رضا عطية حافظ محمد خطاب" +// }, +// { +// "phone": "+201155512282", +// "name_arabic": "احمد اسامه احمد عبد المنعم" +// }, +// { +// "phone": "+201111715992", +// "name_arabic": "محمد ابراهيم حسني حسين" +// }, +// { +// "phone": "+201064632381", +// "name_arabic": "تامر فؤاد احمد نوح" +// }, +// { +// "phone": "+201127627359", +// "name_arabic": "عمر سيد قطب محمد" +// }, +// { +// "phone": "+201550707584", +// "name_arabic": "انتوني ماجد عبد المسيح فرج" +// }, +// { +// "phone": "+201154395286", +// "name_arabic": "عبد الرحمن ربيع عبد العظيم السيد" +// }, +// { +// "phone": "+201203014151", +// "name_arabic": "بهاء الدين مجدي السيد محمد" +// }, +// { +// "phone": "+201000064464", +// "name_arabic": "شريف محمد السيد عبد الجواد" +// }, +// { +// "phone": "+201019528335", +// "name_arabic": "كامل سيد كامل سيد سليمان" +// }, +// { +// "phone": "+201069155971", +// "name_arabic": "خالد حسين محمد حسين" +// }, +// { +// "phone": "+201500311901", +// "name_arabic": "كريم محمد مصطفى سيد" +// }, +// { +// "phone": "+201001324045", +// "name_arabic": "رضا حسين ابراهيم المهدي" +// }, +// { +// "phone": "+201115440591", +// "name_arabic": "عمر انور أحمد موسى مصطفي" +// }, +// { +// "phone": "+201007251945", +// "name_arabic": "وائل السيد مصطفى سالم" +// }, +// { +// "phone": "+201069408138", +// "name_arabic": "حمدى سعيد أحمد حسن" +// }, +// { +// "phone": "+201062027926", +// "name_arabic": "عبد الحليم عاطف عبد الحميد محمد" +// }, +// { +// "phone": "+201007901024", +// "name_arabic": "أحمد خيرى سيد اسماعيل" +// }, +// { +// "phone": "+201024751990", +// "name_arabic": "عمرو عادل عبد العزيز قطب" +// }, +// { +// "phone": "+201210945113", +// "name_arabic": "جوزيف صبحى حنا إبراهيم" +// }, +// { +// "phone": "+201011515655", +// "name_arabic": "محمد سليم فريد السيد يوسف" +// }, +// { +// "phone": "+201017035706", +// "name_arabic": "أحمد سيد أحمد عبد الغنى سيد أحمد" +// }, +// { +// "phone": "+201012775059", +// "name_arabic": "سيد محمد أحمد سيد" +// }, +// { +// "phone": "+201153527777", +// "name_arabic": "ممدوح سالم ابراهيم عفيفى" +// }, +// { +// "phone": "+201121704716", +// "name_arabic": "كريم تامر إبراهيم محمود" +// }, +// { +// "phone": "+201006568992", +// "name_arabic": "منة الله عادل محمود الأمير على" +// }, +// { +// "phone": "+201220795319", +// "name_arabic": "محمد سيد احمد صبرة" +// }, +// { +// "phone": "+201151235122", +// "name_arabic": "محمد بهنساوي رحاب بمنساوي" +// }, +// { +// "phone": "+201018675402", +// "name_arabic": "السيد عبد الفتاح توفيق حامد" +// }, +// { +// "phone": "+201226467101", +// "name_arabic": "عبد العاطى عبد الحميد فر غلى ابراهيم" +// }, +// { +// "phone": "+201116671578", +// "name_arabic": "اميرة سعدنى رشوان على" +// }, +// { +// "phone": "+201090213039", +// "name_arabic": "رانيا عبد العزيز مرسي الخولي" +// }, +// { +// "phone": "+201118923827", +// "name_arabic": "محمود مسعد محمود حسين" +// }, +// { +// "phone": "+201111105976", +// "name_arabic": "ياسر عبد العزيز أحمد أحمد" +// }, +// { +// "phone": "+201097395567", +// "name_arabic": "محمد ابراهيم محمد محمود" +// }, +// { +// "phone": "+201551630844", +// "name_arabic": "بيشوي عاطف سيدهم روفائيل" +// }, +// { +// "phone": "+201140669177", +// "name_arabic": "سالم خليفة حبة العزيز حسين" +// }, +// { +// "phone": "+201126636750", +// "name_arabic": "اسلام الشحات عبد الحميد سليمان" +// }, +// { +// "phone": "+201116645054", +// "name_arabic": "مؤمن محمد احمد محمد" +// }, +// { +// "phone": "+201123138354", +// "name_arabic": "محمد رافت ذكي محمد" +// }, +// { +// "phone": "+201090980066", +// "name_arabic": "ابراهيم عبد الهادي ابراهيم عبد الهادي" +// }, +// { +// "phone": "+201274768678", +// "name_arabic": "على ابراهيم محمد ابراهيم" +// }, +// { +// "phone": "+201129592081", +// "name_arabic": "رامي عطيتو صليب فاضل" +// }, +// { +// "phone": "+201211156144", +// "name_arabic": "ياقوت جلال ياقوت مرسي" +// }, +// { +// "phone": "+201152228476", +// "name_arabic": "أيمن مصطفى محمد محمد على" +// }, +// { +// "phone": "+201141777686", +// "name_arabic": "اسر عزمي عبد العزيز توفيق" +// }, +// { +// "phone": "+201000304215", +// "name_arabic": "فاروق السيد ابراهيم محمد بدر" +// }, +// { +// "phone": "+201127068159", +// "name_arabic": "عمر محمد فهمى كامل محمد" +// }, +// { +// "phone": "+201001122367", +// "name_arabic": "محمد عادل عبد القادر حسين المصري" +// }, +// { +// "phone": "+201501200998", +// "name_arabic": "عبد الرحمن محمد علي مهني" +// }, +// { +// "phone": "+201033363364", +// "name_arabic": "أحمد حسين إسماعيل صبرى" +// }, +// { +// "phone": "+201003335753", +// "name_arabic": "رائيا سيد عبد المعطى طاهر" +// }, +// { +// "phone": "+201111097792", +// "name_arabic": "أحمد سيد أحمد السيد" +// }, +// { +// "phone": "+201000332271", +// "name_arabic": "على سيد عبدالرحيم ابراهيم" +// }, +// { +// "phone": "+201016565911", +// "name_arabic": "وائل محمد علي محمد" +// }, +// { +// "phone": "+201141761526", +// "name_arabic": "احمد السيد احمد محمد الحداد" +// }, +// { +// "phone": "+201063149509", +// "name_arabic": "يحيي قدري أحمد الصعيدي" +// }, +// { +// "phone": "+201226886837", +// "name_arabic": "عبد الرحمن علي عبدد عطيه" +// }, +// { +// "phone": "+201092955061", +// "name_arabic": "على عبد الناصر سعد اسماعيل" +// }, +// { +// "phone": "+201223401519", +// "name_arabic": "محمد الشافعي أبو المعاطي الرفاعي" +// }, +// { +// "phone": "+201150921271", +// "name_arabic": "محمد مصطفى طه محمود" +// }, +// { +// "phone": "+201123808806", +// "name_arabic": "مصطفى ابراهيم عبد الظاهر حسين" +// }, +// { +// "phone": "+201098127395", +// "name_arabic": "احمد عصام عبد العظيم على" +// }, +// { +// "phone": "+201117734458", +// "name_arabic": "فضل سعيد عبد الونيس حازم" +// }, +// { +// "phone": "+201274793455", +// "name_arabic": "هشام احمد ابراهيم سيد الأهل" +// }, +// { +// "phone": "+201273637969", +// "name_arabic": "محمد احمد محمد خميس" +// }, +// { +// "phone": "+201555310975", +// "name_arabic": "أحمد محرم توفيق احمد" +// }, +// { +// "phone": "+201507255344", +// "name_arabic": "محمد عفت طه عبد العزيز" +// }, +// { +// "phone": "+201278609823", +// "name_arabic": "يستت الخضر حامد على الكامل" +// }, +// { +// "phone": "+201551243045", +// "name_arabic": "مد فهمى أحمد أحمد" +// }, +// { +// "phone": "+201017505135", +// "name_arabic": "احمد رافت ابراهيم محمد شحاتة" +// }, +// { +// "phone": "+201011297277", +// "name_arabic": "يوسف مصطفي محمد عبد الجليل سعيد" +// }, +// { +// "phone": "+201112532668", +// "name_arabic": "احمد محمد عمرى محمد" +// }, +// { +// "phone": "+201018180201", +// "name_arabic": "ابراهيم عبد المعطى محمد امين" +// }, +// { +// "phone": "+201007963231", +// "name_arabic": "يوسف نشأت عويس فوده" +// }, +// { +// "phone": "+201203284532", +// "name_arabic": "عادل أحمد علي محمد" +// }, +// { +// "phone": "+201025463793", +// "name_arabic": "رضا صبحي ابراهيم جاد الله" +// }, +// { +// "phone": "+201061078753", +// "name_arabic": "علي عبد العزيز محمد احمد ابو اليمن" +// }, +// { +// "phone": "+201273943548", +// "name_arabic": "مؤمن صبري أحمد حسنين على" +// }, +// { +// "phone": "+201127009293", +// "name_arabic": "توفيق محمد توفيق عماره" +// }, +// { +// "phone": "+201221280828", +// "name_arabic": "محمد محي الدين حسن الخياط" +// }, +// { +// "phone": "+201226797902", +// "name_arabic": "احمد مصطفي عبد العال عبد القادر" +// }, +// { +// "phone": "+201001231343", +// "name_arabic": "مى محمود محمود شميس" +// }, +// { +// "phone": "+201145212125", +// "name_arabic": "محمد يسري محمد عواد" +// }, +// { +// "phone": "+201200240122", +// "name_arabic": "عامر سعيد محمد السيد عامر" +// }, +// { +// "phone": "+201010756606", +// "name_arabic": "سامح كامل أحمد محمد" +// }, +// { +// "phone": "+201020712534", +// "name_arabic": "محمد احمد عبدربه عبدالله" +// }, +// { +// "phone": "+201272447388", +// "name_arabic": "محمد محمود مصطفي عروس" +// }, +// { +// "phone": "+201226179315", +// "name_arabic": "على مجدي عودة محمد" +// }, +// { +// "phone": "+201011205708", +// "name_arabic": "شيماء أحمد إبراهيم محمد" +// }, +// { +// "phone": "+201029296526", +// "name_arabic": "محمد خالد سيد على أبو اسماعيل" +// }, +// { +// "phone": "+201205730163", +// "name_arabic": "شنوده سيد بعزق يسي" +// }, +// { +// "phone": "+201112020988", +// "name_arabic": "احمد سالمان محمد فراج" +// }, +// { +// "phone": "+201068640092", +// "name_arabic": "خالد حسن على حسن عناني" +// }, +// { +// "phone": "+201125283193", +// "name_arabic": "كرم علاء محمد علام" +// }, +// { +// "phone": "+201005315146", +// "name_arabic": "خالد رمضان أبو زيد حسين" +// }, +// { +// "phone": "+201553279539", +// "name_arabic": "محمد خليل محمد محمد" +// }, +// { +// "phone": "+201100074027", +// "name_arabic": "محمود محمد عوض علي عثمان" +// }, +// { +// "phone": "+201010364099", +// "name_arabic": "رضا فهيم جمعة خلف الله" +// }, +// { +// "phone": "+201009633350", +// "name_arabic": "محمود فوزي محمود عبد العليم" +// }, +// { +// "phone": "+201008985350", +// "name_arabic": "نائل عاصم عبد المنعم العشماوي" +// }, +// { +// "phone": "+201272072854", +// "name_arabic": "ممدوح فتحي حسن عبد الغفار" +// }, +// { +// "phone": "+201157819617", +// "name_arabic": "سيد محروس السيد حسبو محمد" +// }, +// { +// "phone": "+201066229104", +// "name_arabic": "حنان سمير عبدة جـ" +// }, +// { +// "phone": "+201026191863", +// "name_arabic": "وديدة عواد مدبولي محمد على" +// }, +// { +// "phone": "+201002967711", +// "name_arabic": "احمد حسين أحمد نصير" +// }, +// { +// "phone": "+201003477030", +// "name_arabic": "احمد جمال بدوي عبد المجيد عبده" +// }, +// { +// "phone": "+201552355008", +// "name_arabic": "محمد فوزي كامل محمد الرمادي" +// }, +// { +// "phone": "+201006905156", +// "name_arabic": "حمود أبو العنين محمد ابراهيم" +// }, +// { +// "phone": "+201222781707", +// "name_arabic": "عبد المحسن مصطفى عبد المحسن عيسي" +// }, +// { +// "phone": "+201118331500", +// "name_arabic": "محمد مجدي محمد محمد" +// }, +// { +// "phone": "+201201155000", +// "name_arabic": "الكيلانى فاضل الكيلانى ابراهيم" +// }, +// { +// "phone": "+201118313079", +// "name_arabic": "سالم حسين معوض عبد العزيز" +// }, +// { +// "phone": "+201151593953", +// "name_arabic": "محمد حيدر محمد عبد الرازق" +// }, +// { +// "phone": "+201125455548", +// "name_arabic": "احمد السيد محمد غانم" +// }, +// { +// "phone": "+201098957440", +// "name_arabic": "كريم نادر محمد السعيد" +// }, +// { +// "phone": "+201146186186", +// "name_arabic": "ابراهيم محمد علي عبد العال" +// }, +// { +// "phone": "+201030678774", +// "name_arabic": "محمد عباس يوسف تونى" +// }, +// { +// "phone": "+201061643167", +// "name_arabic": "خالد سيد حسن محمود عطوة" +// }, +// { +// "phone": "+201204281981", +// "name_arabic": "مروان مجدي عبدالمجيد كامل الطحاوى" +// }, +// { +// "phone": "+201003519315", +// "name_arabic": "احمد عبد الفتاح أحمد سليمان" +// }, +// { +// "phone": "+201099611804", +// "name_arabic": "محمد عشماوى محمد خضير" +// }, +// { +// "phone": "+201033499971", +// "name_arabic": "احمد عصام محمد عبد المقصود" +// }, +// { +// "phone": "+201144197550", +// "name_arabic": "عمرو رمضان عبد الرسول الرفاعى السيد" +// }, +// { +// "phone": "+201022503990", +// "name_arabic": "صلاح الدين سيف سعبد أمور" +// }, +// { +// "phone": "+201224734728", +// "name_arabic": "مصطفي فتحي محمد عبد الواحد" +// }, +// { +// "phone": "+201000692012", +// "name_arabic": "عبد العظيم عرفات عبد العظيم عبداللطيف" +// }, +// { +// "phone": "+201501355877", +// "name_arabic": "محمد يوسف عوض محمود" +// }, +// { +// "phone": "+201207142285", +// "name_arabic": "محمد رمضان محمد محمد" +// }, +// { +// "phone": "+201014446768", +// "name_arabic": "اياد احمد فريج عبد العزيز" +// }, +// { +// "phone": "+201221230132", +// "name_arabic": "كمال الدين محمد كمال الدين محمد" +// }, +// { +// "phone": "+201221327402", +// "name_arabic": "محمود عبد الله خليل احمد" +// }, +// { +// "phone": "+201092670092", +// "name_arabic": "أحمد السعيد شفيق محمد" +// }, +// { +// "phone": "+201025255404", +// "name_arabic": "نبيل نسيم الياس خليل" +// }, +// { +// "phone": "+201120357820", +// "name_arabic": "محمد ابراهيم عبد الرحيم احمد" +// }, +// { +// "phone": "+201113316521", +// "name_arabic": "ثالة إبراهيم محمود محمود" +// }, +// { +// "phone": "+201147089960", +// "name_arabic": "سيد عبد الحميد بخيت علي" +// }, +// { +// "phone": "+201015555050", +// "name_arabic": "أحمد محمد الهوارى مسلم سيد" +// }, +// { +// "phone": "+201003312497", +// "name_arabic": "محمد احمد محمود سليم" +// }, +// { +// "phone": "+201001917872", +// "name_arabic": "مجدي حسن عبد الرحمن حسن" +// }, +// { +// "phone": "+201285422722", +// "name_arabic": "محمد سعيد عبد الرحمن فرحات" +// }, +// { +// "phone": "+201208720869", +// "name_arabic": "محمد محمد عبد الرحيم مصطفى" +// }, +// { +// "phone": "+201061489820", +// "name_arabic": "فاروق عمرو فاروق عبد القادر" +// }, +// { +// "phone": "+201013360049", +// "name_arabic": "أيمن محمد عبد الكريم عمر" +// }, +// { +// "phone": "+201029279719", +// "name_arabic": "رجب حسن عبد الفتاح عبد النبي" +// }, +// { +// "phone": "+201063571013", +// "name_arabic": "ماجد محمد محمد بعين" +// }, +// { +// "phone": "+201142512759", +// "name_arabic": "اسلام اشرف فؤاد سيد عبد السلام" +// }, +// { +// "phone": "+201128932455", +// "name_arabic": "على حسنين أمام سالم" +// }, +// { +// "phone": "+201555583558", +// "name_arabic": "احمد تاجى كامل محمد" +// }, +// { +// "phone": "+201123338071", +// "name_arabic": "أحمد محمد محمد اسماعيل" +// }, +// { +// "phone": "+201208421049", +// "name_arabic": "محمد فتحي محمد احمد" +// }, +// { +// "phone": "+201016988201", +// "name_arabic": "ابراهيم صبرين السيد محمد" +// }, +// { +// "phone": "+201090445415", +// "name_arabic": "سليمان عبد الرحمن محمد عبد المجيد" +// }, +// { +// "phone": "+201144294246", +// "name_arabic": "حاكم السيد محمد كفافى" +// }, +// { +// "phone": "+201033681721", +// "name_arabic": "جورج رمسيس ايليا فهيم" +// }, +// { +// "phone": "+201065262941", +// "name_arabic": "حازم محمد محمد مسعد الزيات" +// }, +// { +// "phone": "+201115734119", +// "name_arabic": "عبد الرحمن احمد سالم كريم" +// }, +// { +// "phone": "+201143990963", +// "name_arabic": "إبراهيم محمد عوض الله مرجان" +// }, +// { +// "phone": "+201115801585", +// "name_arabic": "محمد محمود سيد محمد" +// }, +// { +// "phone": "+201017000336", +// "name_arabic": "كريم سيد عبد المنعم أحمد" +// }, +// { +// "phone": "+201060791647", +// "name_arabic": "حاتم محمد خليفة خضر" +// }, +// { +// "phone": "+201111520044", +// "name_arabic": "محمد عبد الحميد محمد خفاجي" +// }, +// { +// "phone": "+201097229576", +// "name_arabic": "عادل وهبه صادق عرفه" +// }, +// { +// "phone": "+201206036564", +// "name_arabic": "محمود حمدي أبوالنيل حسين" +// }, +// { +// "phone": "+201159109401", +// "name_arabic": "أحمد عبد الهادي ابراهيم محمد" +// }, +// { +// "phone": "+201125194685", +// "name_arabic": "محمود عزيز الدين عبد الغنى محمد" +// }, +// { +// "phone": "+201029955566", +// "name_arabic": "محمود عبداللطيف محمد طه" +// }, +// { +// "phone": "+201004362477", +// "name_arabic": "خلاء عمربن عبد العزيز عبد العزيز" +// }, +// { +// "phone": "+201147155402", +// "name_arabic": "كريم محمد ندا نصر فرحات" +// }, +// { +// "phone": "+201110144858", +// "name_arabic": "دعاء عبد الله زين العابدين محمد" +// }, +// { +// "phone": "+201101371471", +// "name_arabic": "ابراهيم شريف إبراهيم عويس" +// }, +// { +// "phone": "+201223376686", +// "name_arabic": "حمدي عبد الغنى سليم محمد" +// }, +// { +// "phone": "+201030188514", +// "name_arabic": "محمد نهاد محمد عبد الحليم عبد المعطي" +// }, +// { +// "phone": "+201110720173", +// "name_arabic": "مصطفي عادل سيد عبد القادر" +// }, +// { +// "phone": "+201008877028", +// "name_arabic": "يوسف سمير عبد العزيز حميد شاهين" +// }, +// { +// "phone": "+201021394443", +// "name_arabic": "عطيه النويهى" +// }, +// { +// "phone": "+201129175677", +// "name_arabic": "سيف محمد عارف رياض" +// }, +// { +// "phone": "+201092705872", +// "name_arabic": "مصطفى السيد بحيرى أحمد حلاوة" +// }, +// { +// "phone": "+201003008890", +// "name_arabic": "حنان محمد محمد أحمد الكسار" +// }, +// { +// "phone": "+201002034349", +// "name_arabic": "حسن سعد محمد الدسوقى الامام" +// }, +// { +// "phone": "+201100316991", +// "name_arabic": "عمر جبر عبد الكريم جبر بخيت" +// }, +// { +// "phone": "+201018171197", +// "name_arabic": "عمرو أبوسريع عوض الله جمعة" +// }, +// { +// "phone": "+201146762997", +// "name_arabic": "محمد طوخى محمد حسن" +// }, +// { +// "phone": "+201151934260", +// "name_arabic": "أحمد محمد ابراهيم حسين" +// }, +// { +// "phone": "+201153281209", +// "name_arabic": "إسلام أحمد حداد أحمد" +// }, +// { +// "phone": "+201223838760", +// "name_arabic": "محمد احمد محمد خضرجى" +// }, +// { +// "phone": "+201113445109", +// "name_arabic": "أحمد موافي محمود علي" +// }, +// { +// "phone": "+201142461102", +// "name_arabic": "عادل رجب حسن خليفة" +// }, +// { +// "phone": "+201027788822", +// "name_arabic": "سلام جوده محمود جابر" +// }, +// { +// "phone": "+201224050760", +// "name_arabic": "حسن حلمى يوسف محمد" +// }, +// { +// "phone": "+201064603606", +// "name_arabic": "جابر عادل محمد احمد" +// }, +// { +// "phone": "+201003561422", +// "name_arabic": "اسلام احمد محمد احمد" +// }, +// { +// "phone": "+201228216918", +// "name_arabic": "بهاء الدين محمد أحمد محمد رمضان" +// }, +// { +// "phone": "+201115691406", +// "name_arabic": "سيف الدين احمد حسن أحمد الشاذلي" +// }, +// { +// "phone": "+201112666900", +// "name_arabic": "عمرو بغدادي نوبي يونس" +// }, +// { +// "phone": "+201203022587", +// "name_arabic": "محمد أحمد محمد أحمد" +// }, +// { +// "phone": "+201550917698", +// "name_arabic": "محمد لطفى محمد شحاته تركي" +// }, +// { +// "phone": "+201273300163", +// "name_arabic": "احمد محمد طة صالح" +// }, +// { +// "phone": "+201200852228", +// "name_arabic": "حاتم إبراهيم محمود محمد" +// }, +// { +// "phone": "+201208267747", +// "name_arabic": "كيرلس بدر تقي صالح" +// }, +// { +// "phone": "+201100086479", +// "name_arabic": "وائل عبد الرزاق منير عبد الرازق" +// }, +// { +// "phone": "+201200520512", +// "name_arabic": "تامر حسن ابراهيم محمد" +// }, +// { +// "phone": "+201152184337", +// "name_arabic": "وديع عاطف وديع ميخائيل" +// }, +// { +// "phone": "+201147678682", +// "name_arabic": "مصطفى سيد على خليل" +// }, +// { +// "phone": "+201091601602", +// "name_arabic": "ايهاب عبد المنعم محمد فرحات" +// }, +// { +// "phone": "+201023755677", +// "name_arabic": "محمد عبدربة ابراهيم علي" +// }, +// { +// "phone": "+201158601956", +// "name_arabic": "أيمن عبد العزيز العزب الجمل" +// }, +// { +// "phone": "+201005094804", +// "name_arabic": "محمد عبد التواب عبد الله عبد المجيد" +// }, +// { +// "phone": "+201099099877", +// "name_arabic": "مصطفي زكريا عمر السيد علي" +// }, +// { +// "phone": "+201009515764", +// "name_arabic": "اسلام دسوقي علي حسين" +// }, +// { +// "phone": "+201060722370", +// "name_arabic": "محمد فاروق بكير عباس" +// }, +// { +// "phone": "+201050923423", +// "name_arabic": "ابوبكر فهمي احمد" +// }, +// { +// "phone": "+201226595175", +// "name_arabic": "هشام جمال بدوي رجب" +// }, +// { +// "phone": "+201032049954", +// "name_arabic": "عبد العظيم محمد عبد العظيم عيسى محمد" +// }, +// { +// "phone": "+201095288771", +// "name_arabic": "سامى عبدة شحاتة جرجس" +// }, +// { +// "phone": "+201154137902", +// "name_arabic": "محمد جمال حسين صابر" +// }, +// { +// "phone": "+201123810133", +// "name_arabic": "نصر الدين محمد عباس محمد" +// }, +// { +// "phone": "+201119843761", +// "name_arabic": "زناتى محمود زناتى محمود" +// }, +// { +// "phone": "+201224395155", +// "name_arabic": "محمود ابراهيم ابراهيم علي" +// }, +// { +// "phone": "+201149930556", +// "name_arabic": "شريف محمد ابراهيم ابراهيم" +// }, +// { +// "phone": "+201011793117", +// "name_arabic": "محمد ابراهيم محمد ابو المجد" +// }, +// { +// "phone": "+201017062590", +// "name_arabic": "وسام احمد أبو الوفا خليل ابراهيم" +// }, +// { +// "phone": "+201145922310", +// "name_arabic": "السيد محمد عفيفى السيد المحلاوى" +// }, +// { +// "phone": "+201557965291", +// "name_arabic": "قهد رضوان حسن محمد الشايب" +// }, +// { +// "phone": "+201050048044", +// "name_arabic": "احمد عبد المطلب ابو الفتوح عبد المطلب" +// }, +// { +// "phone": "+201156924007", +// "name_arabic": "على ياسر على احمد" +// }, +// { +// "phone": "+201559975610", +// "name_arabic": "مبارك السيد علي حسن حسنين" +// }, +// { +// "phone": "+201151513963", +// "name_arabic": "محمد عادل محمد أمين" +// }, +// { +// "phone": "+201288863470", +// "name_arabic": "بولا صفوت عبده جوده" +// }, +// { +// "phone": "+201010131445", +// "name_arabic": "علاء عيد محمد مصطفي عيسوي" +// }, +// { +// "phone": "+201206404444", +// "name_arabic": "سارة محمود عبد العزيز شحاتة" +// }, +// { +// "phone": "+201014542441", +// "name_arabic": "يامن عصمت عباس محمد جوهر" +// }, +// { +// "phone": "+201157055175", +// "name_arabic": "‏أحمد خليل إبراهيم عباس الخليل" +// }, +// { +// "phone": "+201220820976", +// "name_arabic": "طارق مجدي حسن الأنور خليل" +// }, +// { +// "phone": "+201156839185", +// "name_arabic": "محمد خالد محي عبد القادر" +// }, +// { +// "phone": "+201552339089", +// "name_arabic": "معتز محمد ابراهيم محمد سالم" +// }, +// { +// "phone": "+201021875274", +// "name_arabic": "محمود مصطفى اسماعيل محمد" +// }, +// { +// "phone": "+201099785084", +// "name_arabic": "خالد حافظ على حافظ" +// }, +// { +// "phone": "+201114202318", +// "name_arabic": "أميرة محمد محمد محمد" +// }, +// { +// "phone": "+201126516633", +// "name_arabic": "حسام محمود عبد الخالق مصطفى" +// }, +// { +// "phone": "+201148925237", +// "name_arabic": "عثمان معتمد عثمان حسن" +// }, +// { +// "phone": "+201096522443", +// "name_arabic": "محمد رمضان لبيب على خليل" +// }, +// { +// "phone": "+201119557005", +// "name_arabic": "على محمد رمضان ماضي" +// }, +// { +// "phone": "+201009089217", +// "name_arabic": "حسني عبد المجيد منصور علي" +// }, +// { +// "phone": "+201001631180", +// "name_arabic": "اسامة محمد احمد السيد" +// }, +// { +// "phone": "+201024921197", +// "name_arabic": "احمد محمد فؤاد احمد" +// }, +// { +// "phone": "+201099244249", +// "name_arabic": "رشا فاروق محمد فهد" +// }, +// { +// "phone": "+201147657512", +// "name_arabic": "محمد صلاح عابدين مهنى" +// }, +// { +// "phone": "+201225922402", +// "name_arabic": "صابر سمير صابر خليل" +// }, +// { +// "phone": "+201004663695", +// "name_arabic": "سعيد علاء سعيد فوده" +// }, +// { +// "phone": "+201016673481", +// "name_arabic": "عماد الدين عبد العزيز محمد اسماعيل" +// }, +// { +// "phone": "+201154794158", +// "name_arabic": "عادل اشرف أمام محمد" +// }, +// { +// "phone": "+201094301319", +// "name_arabic": "احمد محمد حسين محمود" +// }, +// { +// "phone": "+201003835650", +// "name_arabic": "محمد فتحى محمد بيومى" +// }, +// { +// "phone": "+201007126077", +// "name_arabic": "احمد محمود فهمي مرسي" +// }, +// { +// "phone": "+201001695782", +// "name_arabic": "أحمد عبد العليم درويش مصطفى" +// }, +// { +// "phone": "+201094946874", +// "name_arabic": "احمد زكي سليمان سليمان" +// }, +// { +// "phone": "+201092603783", +// "name_arabic": "وليد عبد العزيز ابراهيم سيف" +// }, +// { +// "phone": "+201010885870", +// "name_arabic": "عفيفي شعبان محمد حمدان" +// }, +// { +// "phone": "+201272726825", +// "name_arabic": "محمد شعبان عليوه بيومى" +// }, +// { +// "phone": "+201115559196", +// "name_arabic": "عماد صالح موسى عبد النور" +// }, +// { +// "phone": "+201125181419", +// "name_arabic": "إسلام رمضان سيد أحمد شعبان" +// }, +// { +// "phone": "+201000405678", +// "name_arabic": "محمود محمد محمود احمد" +// }, +// { +// "phone": "+201146020970", +// "name_arabic": "سامح محمد الروبي عبد النبي" +// }, +// { +// "phone": "+201102832500", +// "name_arabic": "سيد محمد سيد عبد العال" +// }, +// { +// "phone": "+201555717344", +// "name_arabic": "محمد طه السيد ايوزيد" +// }, +// { +// "phone": "+201000237951", +// "name_arabic": "محمد أحمد صادق احمد" +// }, +// { +// "phone": "+201211744226", +// "name_arabic": "ريهام وجية علي مصطفي" +// }, +// { +// "phone": "+201284601547", +// "name_arabic": "خالد منير طه سليمان" +// }, +// { +// "phone": "+201030596294", +// "name_arabic": "عبد الرحمن وائل عبد الرحمن محمد" +// }, +// { +// "phone": "+201005457333", +// "name_arabic": "سراج الدين جابر حسن السعداوى" +// }, +// { +// "phone": "+201002757121", +// "name_arabic": "اشرف محمد عبد الحميد السيد" +// }, +// { +// "phone": "+201145149687", +// "name_arabic": "محمد فوزي نصر حسن" +// }, +// { +// "phone": "+201069938005", +// "name_arabic": "الهام محمد محمد احمد" +// }, +// { +// "phone": "+201012226214", +// "name_arabic": "محمد السيد صلاح محمد" +// }, +// { +// "phone": "+201067970457", +// "name_arabic": "أحمد الرفاعى العبد المسيري" +// }, +// { +// "phone": "+201024013170", +// "name_arabic": "انوز ايمن محمد عبد الرحمن" +// }, +// { +// "phone": "+201003454075", +// "name_arabic": "حنفى محمود عبد الفهيم محمود" +// }, +// { +// "phone": "+201147907236", +// "name_arabic": "رامى احمد احمد امين" +// }, +// { +// "phone": "+201141724381", +// "name_arabic": "احمد بهاء الدين رجب جمعه" +// }, +// { +// "phone": "+201115856332", +// "name_arabic": "سريف محمد شحانة السيد محمد" +// }, +// { +// "phone": "+201280522134", +// "name_arabic": "محمد السيد ابراهيم محمد عبد الحميد" +// }, +// { +// "phone": "+201099232205", +// "name_arabic": "منير علاء الدين منير الشيخ" +// }, +// { +// "phone": "+201207616444", +// "name_arabic": "مروة حامد محمود احمد محمد" +// }, +// { +// "phone": "+201222802345", +// "name_arabic": "احمد كمال الدين محمد سباق" +// }, +// { +// "phone": "+201004649218", +// "name_arabic": "محمد عمر عبد اللطيف ابراهيم" +// }, +// { +// "phone": "+201148163468", +// "name_arabic": "طاهر أحمد محمد" +// }, +// { +// "phone": "+201080058399", +// "name_arabic": "عادل نادر محمد محمد احمد" +// }, +// { +// "phone": "+201098481014", +// "name_arabic": "معتز بالله منير محمود صالح" +// }, +// { +// "phone": "+201147434479", +// "name_arabic": "احمد عيد رمضان سلام" +// }, +// { +// "phone": "+201278873338", +// "name_arabic": "وليد محمد عبد الستار فرح جاب الله" +// }, +// { +// "phone": "+201012202021", +// "name_arabic": "محمد محمود حسن السيد" +// }, +// { +// "phone": "+201223099401", +// "name_arabic": "مينا ظريف مليكة جرجس" +// }, +// { +// "phone": "+201016861211", +// "name_arabic": "محمود عبد السلام هلال عبد الهادي" +// }, +// { +// "phone": "+201067696612", +// "name_arabic": "محمد أحمد عبد الفتاح ذكي" +// }, +// { +// "phone": "+201011313308", +// "name_arabic": "رامي الشحات عبد الحميد على السيد" +// }, +// { +// "phone": "+201127871530", +// "name_arabic": "رجب رمضان على محمد" +// }, +// { +// "phone": "+201019266797", +// "name_arabic": "نادى ناجح ثابت فرج" +// }, +// { +// "phone": "+201141941411", +// "name_arabic": "فارس عيد مغازى محمد" +// }, +// { +// "phone": "+201007174032", +// "name_arabic": "أحمد سعيد سيد سالم" +// }, +// { +// "phone": "+201550919395", +// "name_arabic": "كيرلس عصام جورجى توفيق جورجى" +// }, +// { +// "phone": "+201012873873", +// "name_arabic": "ابراهيم محمد اسماعيل دياب" +// }, +// { +// "phone": "+201011508900", +// "name_arabic": "اسراء حسن ابراهيم حسن" +// }, +// { +// "phone": "+201211986162", +// "name_arabic": "عبد الرحمن محمود احمد المتداوي" +// }, +// { +// "phone": "+201003516746", +// "name_arabic": "محمد بيومي حتى بيومي" +// }, +// { +// "phone": "+201004558484", +// "name_arabic": "أحمد رمضان محمد ابراهيم" +// }, +// { +// "phone": "+201154691131", +// "name_arabic": "محمد خالد هنداوى سليمان" +// }, +// { +// "phone": "+201022098201", +// "name_arabic": "إسلام سعيد عويس خليفه" +// }, +// { +// "phone": "+201122412020", +// "name_arabic": "وليد محمد محمد دياب" +// }, +// { +// "phone": "+201148581664", +// "name_arabic": "محمود محمد احمد عمران" +// }, +// { +// "phone": "+201550256661", +// "name_arabic": "محمد عبد العظيم محمد عبد الصمد" +// }, +// { +// "phone": "+201097664573", +// "name_arabic": "رمضان فوزى عبد النبى بسيونى الكفورى" +// }, +// { +// "phone": "+201118970961", +// "name_arabic": "غادة ‏عبدالله أحمد عبدالله" +// }, +// { +// "phone": "+201066228870", +// "name_arabic": "عبد الله حمادة عبد الله محمد" +// }, +// { +// "phone": "+201066302758", +// "name_arabic": "يوسف احمد محمد محمود" +// }, +// { +// "phone": "+201155110000", +// "name_arabic": "هشام جابر شحاتة كرار" +// }, +// { +// "phone": "+201280433297", +// "name_arabic": "احمد طارق عبد الرحمن ابراهيم" +// }, +// { +// "phone": "+201033970821", +// "name_arabic": "عمرو احمد ماهر أبوالخير" +// }, +// { +// "phone": "+201019023091", +// "name_arabic": "وليد محمد توفيق احمد" +// }, +// { +// "phone": "+201067788258", +// "name_arabic": "أحمد جمعة ابراهيم محمد" +// }, +// { +// "phone": "+201092303236", +// "name_arabic": "محمد وهبة وهبة الكراف" +// }, +// { +// "phone": "+201111090041", +// "name_arabic": "كريم ممدوح زغلول السيد جمعه" +// }, +// { +// "phone": "+201004869666", +// "name_arabic": "عادل محمد مكاوي عمارة" +// }, +// { +// "phone": "+201094924486", +// "name_arabic": "محمد سعيد محمد عبد المجيد" +// }, +// { +// "phone": "+201157121939", +// "name_arabic": "محمود بيومى ابوقريش بيومي" +// }, +// { +// "phone": "+201159009789", +// "name_arabic": "عبد الحليم محمود عباس مبروك" +// }, +// { +// "phone": "+201024242627", +// "name_arabic": "حسن عماد الدين حسن احمد أبو العز" +// }, +// { +// "phone": "+201002134021", +// "name_arabic": "مايكل عادل لبيب بباوي" +// }, +// { +// "phone": "+201016143533", +// "name_arabic": "جابر عبدالرازق احمد جابر" +// }, +// { +// "phone": "+201115934957", +// "name_arabic": "حسين ماهر محمد حسانين" +// }, +// { +// "phone": "+201123355123", +// "name_arabic": "علي عماد علي نصر" +// }, +// { +// "phone": "+201092424205", +// "name_arabic": "ضياء اشرف ربيع عبد العظيم" +// }, +// { +// "phone": "+201093030032", +// "name_arabic": "ابراهيم محمد محمد ابراهيم عبد الرحمن" +// }, +// { +// "phone": "+201284946699", +// "name_arabic": "محمد هاني علي عبد السلام" +// }, +// { +// "phone": "+201068164764", +// "name_arabic": "اشرف كمال الدين عبده" +// }, +// { +// "phone": "+201027994009", +// "name_arabic": "وائل سعيد سلامه عبد الغنى" +// }, +// { +// "phone": "+201019444828", +// "name_arabic": "محمد عاشور فهمي محمد احمد" +// }, +// { +// "phone": "+201023005090", +// "name_arabic": "كريم السيد عطا علي" +// }, +// { +// "phone": "+201069789251", +// "name_arabic": "محمد عيد صالح احمد" +// }, +// { +// "phone": "+201115165617", +// "name_arabic": "محمد صبرى شاهر حسونه" +// }, +// { +// "phone": "+201142136063", +// "name_arabic": "يوسف احمد محمد ابراهيم منصور" +// }, +// { +// "phone": "+201119928400", +// "name_arabic": "خالد خميس عوض حسن جعدار" +// }, +// { +// "phone": "+201095489954", +// "name_arabic": "أحمد زيدان السيد على" +// }, +// { +// "phone": "+201288889962", +// "name_arabic": "علاء سليمان إبراهيم سلمان" +// }, +// { +// "phone": "+201050551218", +// "name_arabic": "السيد أحمد عبد التواب علام محمد" +// }, +// { +// "phone": "+201119159545", +// "name_arabic": "نبية عزت نبية عبد الله" +// }, +// { +// "phone": "+201116741091", +// "name_arabic": "إسلام محمد دسوقي خليل" +// }, +// { +// "phone": "+201119435559", +// "name_arabic": "احمد سعيد محمد السيد احمد" +// }, +// { +// "phone": "+201020606021", +// "name_arabic": "عبد الكريم عبد الحميد عبد الكريم سيد" +// }, +// { +// "phone": "+201091029772", +// "name_arabic": "محمد محسن محمد السيد صالح" +// }, +// { +// "phone": "+201151616245", +// "name_arabic": "محمود حسن عبد الوهاب حسن" +// }, +// { +// "phone": "+201279296936", +// "name_arabic": "عاطف حسني عبد الحميد مهني" +// }, +// { +// "phone": "+201284517076", +// "name_arabic": "هشام احمد فوزي محمد بدر" +// }, +// { +// "phone": "+201080076746", +// "name_arabic": "محمد سعد عبد الحميد يوسف" +// }, +// { +// "phone": "+201067859062", +// "name_arabic": "هانى على محمد سنبل" +// }, +// { +// "phone": "+201275899279", +// "name_arabic": "حسن مأمون حسن محمود" +// }, +// { +// "phone": "+201140616104", +// "name_arabic": "مصطفى حسن أحمد السيد" +// }, +// { +// "phone": "+201142896698", +// "name_arabic": "احمد صلاح احمد عبد الرازق" +// }, +// { +// "phone": "+201063308303", +// "name_arabic": "عبد الرحمن ابراهيم ادم محمد موسى" +// }, +// { +// "phone": "+201102109356", +// "name_arabic": "بهاء محمد محمود أبوعيطة" +// }, +// { +// "phone": "+201040567007", +// "name_arabic": "أحمد رجب جاد الكريم فتح الباب" +// }, +// { +// "phone": "+201288006876", +// "name_arabic": "جورج بباوي سيدهم بباوي" +// }, +// { +// "phone": "+201110600956", +// "name_arabic": "احمد نجاح بركات حسب النبى" +// }, +// { +// "phone": "+201101802518", +// "name_arabic": "عبد الكريم محمد شلبي عبدالله" +// }, +// { +// "phone": "+201508325183", +// "name_arabic": "رزق محمد ابراهيم سليمان" +// }, +// { +// "phone": "+201141679162", +// "name_arabic": "خليفة أحمد خليفة عبد الباقى" +// }, +// { +// "phone": "+201154702283", +// "name_arabic": "محمود مصطفى أبو الفتوح محمد" +// }, +// { +// "phone": "+201203006795", +// "name_arabic": "جمال أحمد أحمد حمودة" +// }, +// { +// "phone": "+201099997143", +// "name_arabic": "حسام الدين رفعت عجمى على" +// }, +// { +// "phone": "+201151711603", +// "name_arabic": "حسام عز الدين فهيم محمد" +// }, +// { +// "phone": "+201555025130", +// "name_arabic": "بولا بنيامين يوسف يني" +// }, +// { +// "phone": "+201145621795", +// "name_arabic": "إسلام جمال بكري عبد الغني" +// }, +// { +// "phone": "+201066292351", +// "name_arabic": "محمد هشام رجب يوسف" +// }, +// { +// "phone": "+201028952482", +// "name_arabic": "محمد عصام محمد محمد شعبان" +// }, +// { +// "phone": "+201027691564", +// "name_arabic": "عبده مصطفى عبده ابراهيم مرسى" +// }, +// { +// "phone": "+201102779987", +// "name_arabic": "طارق محمد رمضان معوض" +// }, +// { +// "phone": "+201022087015", +// "name_arabic": "هشام محفوظ امين محفوظ" +// }, +// { +// "phone": "+201005467997", +// "name_arabic": "احمد رضا علي محمد" +// }, +// { +// "phone": "+201553636333", +// "name_arabic": "أحمد مخيمر مهنى عبد العال" +// }, +// { +// "phone": "+201001372270", +// "name_arabic": "عمار عبداللطيف عبد الرازق مطير" +// }, +// { +// "phone": "+201005457388", +// "name_arabic": "ايهاب علي حسن علي" +// }, +// { +// "phone": "+201128671122", +// "name_arabic": "صبري كمال محمد يوسف" +// }, +// { +// "phone": "+201118175123", +// "name_arabic": "عبد السلام سعيد عبد السلام محمد" +// }, +// { +// "phone": "+201070665752", +// "name_arabic": "سمير محمد سعيد علي" +// }, +// { +// "phone": "+201098810336", +// "name_arabic": "حسام محمد رشيد عبد المعطى ابو لبن" +// }, +// { +// "phone": "+201156012567", +// "name_arabic": "هشام سيد محمد عبد العليم" +// }, +// { +// "phone": "+201007467887", +// "name_arabic": "محمد حمدي عبد العزيز الشحات" +// }, +// { +// "phone": "+201273888510", +// "name_arabic": "كريم محمد فؤاد نمر حماد" +// }, +// { +// "phone": "+201210023938", +// "name_arabic": "قياتي عبد الحميد محمد عبد الوهاب" +// }, +// { +// "phone": "+201060156231", +// "name_arabic": "محمد ابوالخير زكى عبدالحميد" +// }, +// { +// "phone": "+201003660350", +// "name_arabic": "محمد مجدي محفوظ حسن" +// }, +// { +// "phone": "+201145611618", +// "name_arabic": "مروة ممدوح قاسم عبد الجواد" +// }, +// { +// "phone": "+201140823736", +// "name_arabic": "حازم خالد ابراهيم احمد" +// }, +// { +// "phone": "+201009797500", +// "name_arabic": "همام أحمد همام احمد القصيري" +// }, +// { +// "phone": "+201003849800", +// "name_arabic": "محمد أحمد الغريب الطويل" +// }, +// { +// "phone": "+201098383521", +// "name_arabic": "محمد حامد محمود يوسف" +// }, +// { +// "phone": "+201117558213", +// "name_arabic": "طة عبد الرحمن عبد المنعم مشعال" +// }, +// { +// "phone": "+201064607651", +// "name_arabic": "أحمد قطب محمد سعيد" +// }, +// { +// "phone": "+201011723604", +// "name_arabic": "يحيى محمد نجيب عبد الهادى على" +// }, +// { +// "phone": "+201229711741", +// "name_arabic": "محمد عبده أحمد عبد الرحمن" +// }, +// { +// "phone": "+201033054527", +// "name_arabic": "مصطفى محمد عبد الحفيظ زهران" +// }, +// { +// "phone": "+201557555561", +// "name_arabic": "محمد العربي خلف احمد" +// }, +// { +// "phone": "+201000828526", +// "name_arabic": "حمدى محمد على مبروك" +// }, +// { +// "phone": "+201117651958", +// "name_arabic": "يوسف ايمن نبيل عبد العزيز محمد" +// }, +// { +// "phone": "+201094554855", +// "name_arabic": "محمد سامي سيد احمد" +// }, +// { +// "phone": "+201282495622", +// "name_arabic": "سيف سمير محمد سيد أحمد" +// }, +// { +// "phone": "+201141094583", +// "name_arabic": "صلاح الدين محمود أمين محمود" +// }, +// { +// "phone": "+201091517543", +// "name_arabic": "مصطفى احمد محمد عبد المنعم" +// }, +// { +// "phone": "+201007431781", +// "name_arabic": "انس هلال عيد الغريب" +// }, +// { +// "phone": "+201127563308", +// "name_arabic": "سعد جابر سعد جابر" +// }, +// { +// "phone": "+201114114155", +// "name_arabic": "مصطفى محمد اسماعيل مصطفى" +// }, +// { +// "phone": "+201101986128", +// "name_arabic": "محمد علاء الدين ماهر اسماعيل" +// }, +// { +// "phone": "+201154554795", +// "name_arabic": "رامي صالح فهمي مصيلحى" +// }, +// { +// "phone": "+201097044566", +// "name_arabic": "محمد بيومى السيد" +// }, +// { +// "phone": "+201094315853", +// "name_arabic": "ايمن جمال عبد الفتاح محمد" +// }, +// { +// "phone": "+201033386774", +// "name_arabic": "ياسر عثمان سليمان محمد" +// }, +// { +// "phone": "+201281213171", +// "name_arabic": "محمد السيد محمد عبد العواض" +// }, +// { +// "phone": "+201273579350", +// "name_arabic": "بهاء شفيق فرج عبدالملاك" +// }, +// { +// "phone": "+201101709700", +// "name_arabic": "محمد عبد المنعم السيد حماد" +// }, +// { +// "phone": "+201281300637", +// "name_arabic": "فارس محمد عبد القادر علي شبيب" +// }, +// { +// "phone": "+201155465556", +// "name_arabic": "جمال عبد المنعم محمد عطيه" +// }, +// { +// "phone": "+201021160682", +// "name_arabic": "حلمى رشاد فهمى عمر" +// }, +// { +// "phone": "+201150548146", +// "name_arabic": "أيمن سعد الدين رجب أبوزيد" +// }, +// { +// "phone": "+201206478631", +// "name_arabic": "رامى يسرى خميس رمضان" +// }, +// { +// "phone": "+201146461695", +// "name_arabic": "محمد رجب زايد محمد عفيفى" +// }, +// { +// "phone": "+201026166403", +// "name_arabic": "علاء عبد الفتاح صابر سيد" +// }, +// { +// "phone": "+201556584500", +// "name_arabic": "طارق عبد الغني عبد العزيز" +// }, +// { +// "phone": "+201208780436", +// "name_arabic": "محمد حموده عبد العزيز محمد" +// }, +// { +// "phone": "+201118243930", +// "name_arabic": "ابراهيم محمد ابراهيم عبد المجيد" +// }, +// { +// "phone": "+201025560265", +// "name_arabic": "محمد محمود حسن عبد الحليم ناجي" +// }, +// { +// "phone": "+201116255090", +// "name_arabic": "محمد رمضان السيد محمد" +// }, +// { +// "phone": "+201146934666", +// "name_arabic": "رمضان علي محمود الفوال" +// }, +// { +// "phone": "+201091705204", +// "name_arabic": "محمد فوزي عبد المنعم عبد الحميد" +// }, +// { +// "phone": "+201128602131", +// "name_arabic": "أحمد شعبان على عويس" +// }, +// { +// "phone": "+201009120576", +// "name_arabic": "محمد بدوي محمد عثمان" +// }, +// { +// "phone": "+201123087322", +// "name_arabic": "محمد عبد الحميد محمد عبد الحميد" +// }, +// { +// "phone": "+201014687816", +// "name_arabic": "محمد فوزي حامد إبراهيم" +// }, +// { +// "phone": "+201211564187", +// "name_arabic": "بدر الدين عبدالمنعم محمود علي محمد" +// }, +// { +// "phone": "+201032600147", +// "name_arabic": "سيد محمود حسن سيد" +// }, +// { +// "phone": "+201063724256", +// "name_arabic": "محمد محى محمد رمضان" +// }, +// { +// "phone": "+201223596905", +// "name_arabic": "محمود عبد العزيز محمد شعيب" +// }, +// { +// "phone": "+201225920773", +// "name_arabic": "محروس عيسوي جاد عيسوي" +// }, +// { +// "phone": "+201080882465", +// "name_arabic": "رضا بسيونى بسيونى حسين الزهيرى" +// }, +// { +// "phone": "+201206975332", +// "name_arabic": "ابراهيم سمير السيد احمد" +// }, +// { +// "phone": "+201005626585", +// "name_arabic": "أحمد السعيد سعد محمد" +// }, +// { +// "phone": "+201116342642", +// "name_arabic": "أيمن سعد محمد عبد الرحمن" +// }, +// { +// "phone": "+201011936165", +// "name_arabic": "محمد حسن عبد العزيز حسن محمد" +// }, +// { +// "phone": "+201155449375", +// "name_arabic": "كريم محمد اسماعيل مـ" +// }, +// { +// "phone": "+201117685256", +// "name_arabic": "اسلام سيد عبد العظيم عبد الغفار" +// }, +// { +// "phone": "+201227314954", +// "name_arabic": "جرجس صهيون هرمينا خزيم" +// }, +// { +// "phone": "+201159519690", +// "name_arabic": "محمود عيد عبد التواب عبد العليم" +// }, +// { +// "phone": "+201001916873", +// "name_arabic": "حمود صلاح الدين محمود محمد" +// }, +// { +// "phone": "+201114801155", +// "name_arabic": "محمود بدر عبد الله شعبان" +// }, +// { +// "phone": "+201091259253", +// "name_arabic": "أسامة بيومى عبد الباسط ابراهيم حبيب" +// }, +// { +// "phone": "+201229261500", +// "name_arabic": "علاء عبد الحميد محمد على" +// }, +// { +// "phone": "+201206017464", +// "name_arabic": "عمر سيد الصاوى محمد" +// }, +// { +// "phone": "Not specified", +// "name_arabic": "محمد عبد القادر محمد الرعو" +// }, +// { +// "phone": "+201012962316", +// "name_arabic": "عبدالله سلامة ابراهيم محمد الخميسى" +// }, +// { +// "phone": "+201128872000", +// "name_arabic": "احمد حسن الروبى رمضان" +// }, +// { +// "phone": "+201200147897", +// "name_arabic": "مصطفي احمد محمد أبوزيد" +// }, +// { +// "phone": "+201020178391", +// "name_arabic": "حسام عاطف حسن صبحى رسلان" +// }, +// { +// "phone": "+201050483604", +// "name_arabic": "عبد الله محمود عبدالله مبروك خميس" +// }, +// { +// "phone": "+201226655253", +// "name_arabic": "محمد أحمد عبد الخالق حسانين" +// }, +// { +// "phone": "+201212319854", +// "name_arabic": "احمد عبد المجيد عبد الرازق أحمد" +// }, +// { +// "phone": "+201066377100", +// "name_arabic": "رضا عزت يونس يوسف" +// }, +// { +// "phone": "+201001448413", +// "name_arabic": "عصام محمد مصطفى محمد" +// }, +// { +// "phone": "+201552272211", +// "name_arabic": "محمد ابراهيم محمد قنديل" +// }, +// { +// "phone": "+201000441823", +// "name_arabic": "خالد محمد سعد حسن" +// }, +// { +// "phone": "+201006816168", +// "name_arabic": "احمد عبد الفتاح عبد الفتاح سليمان" +// }, +// { +// "phone": "+201550540634", +// "name_arabic": "حسام كمال عبد الرحيم نور الدين" +// }, +// { +// "phone": "+201024168742", +// "name_arabic": "محمود عصام حسن السيد" +// }, +// { +// "phone": "+201559755572", +// "name_arabic": "محمد محمد يوسف ابراهيم حسن" +// }, +// { +// "phone": "+201221681416", +// "name_arabic": "محمد عبد الحميد محمود عبد الحميد" +// }, +// { +// "phone": "+201114167771", +// "name_arabic": "محمود احمد احمد احمد" +// }, +// { +// "phone": "+201120282401", +// "name_arabic": "رشا محمد محمود حلمى" +// }, +// { +// "phone": "+201222746060", +// "name_arabic": "ايمن صدقى بطرس بشارة" +// }, +// { +// "phone": "+201222332047", +// "name_arabic": "مهند عادل زكي عبد الدايم شعبان" +// }, +// { +// "phone": "+201224971085", +// "name_arabic": "محمد قدري علي ابراهيم العطار" +// }, +// { +// "phone": "+201011715350", +// "name_arabic": "هاني رفعت عبد العال السيد" +// }, +// { +// "phone": "+201111781810", +// "name_arabic": "محمود سيد حسين السيد" +// }, +// { +// "phone": "+201224380088", +// "name_arabic": "سمير جاد شحات جندي" +// }, +// { +// "phone": "+201210505656", +// "name_arabic": "أسامة صابر محمد عبد الله" +// }, +// { +// "phone": "+201005591720", +// "name_arabic": "رائد محمد نجيب رشوان" +// }, +// { +// "phone": "+201004941718", +// "name_arabic": "حسين محمد حافظ محمد" +// }, +// { +// "phone": "+201129157079", +// "name_arabic": "السيد محمود محمد العكل" +// }, +// { +// "phone": "+201004952163", +// "name_arabic": "حسام فاروق حسين سليمان" +// }, +// { +// "phone": "+201094893427", +// "name_arabic": "نادر انس أحمد الطاهر" +// }, +// { +// "phone": "+201281181008", +// "name_arabic": "محمد عبد المنعم عبد الستار محمد" +// }, +// { +// "phone": "+201029362080", +// "name_arabic": "مصطفي محمود أحمد محمود السيوفي" +// }, +// { +// "phone": "+201142703233", +// "name_arabic": "محمد شريف حسن محمد" +// }, +// { +// "phone": "+201064971012", +// "name_arabic": "كريم ناصر اسماعيل احمد" +// }, +// { +// "phone": "+201129669448", +// "name_arabic": "عبدالله أحمد حسن كامل" +// }, +// { +// "phone": "+201040981215", +// "name_arabic": "فخرى عبد المنعم أحمد مصطفى" +// }, +// { +// "phone": "+201013819151", +// "name_arabic": "أحمد خالد علي ابراهيم علي" +// }, +// { +// "phone": "+201275298194", +// "name_arabic": "أحمد خميس علي أحمد فرج" +// }, +// { +// "phone": "+201063911220", +// "name_arabic": "جوزيف سليمان رزق ابراهيم" +// }, +// { +// "phone": "+201110110495", +// "name_arabic": "أحمد على الحمد" +// }, +// { +// "phone": "+201010030001", +// "name_arabic": "محمد أحمد محروس أحمد" +// }, +// { +// "phone": "+201065451010", +// "name_arabic": "سليمان محمد" +// }, +// { +// "phone": "+201000287614", +// "name_arabic": "شريف محمد عوض وهبة" +// }, +// { +// "phone": "+201211161032", +// "name_arabic": "وليد لطفى ماهر جرس" +// }, +// { +// "phone": "+201102766374", +// "name_arabic": "محمد طارق ابراهيم حسنين" +// }, +// { +// "phone": "+201003747074", +// "name_arabic": "يسري عبدالنعيم حسنى عبده" +// }, +// { +// "phone": "+201200870498", +// "name_arabic": "كيرلس أيمن عزمي حناوي" +// }, +// { +// "phone": "+201111076984", +// "name_arabic": "محمود رمضان عوض عزيز" +// }, +// { +// "phone": "+201554096020", +// "name_arabic": "نبيل فوزي عبد العزيز شحاتة" +// }, +// { +// "phone": "+201142783738", +// "name_arabic": "عبدالله عادل رمضان ذكي" +// }, +// { +// "phone": "+201006373310", +// "name_arabic": "وديع وهبة فلتاؤس ابو مرين" +// }, +// { +// "phone": "+201149743533", +// "name_arabic": "محمد جمال عبدة ابراهيم" +// }, +// { +// "phone": "+201117730892", +// "name_arabic": "جمال اشرف محمد سليمان" +// }, +// { +// "phone": "+201080351275", +// "name_arabic": "محمد مصطفى" +// }, +// { +// "phone": "+201500791104", +// "name_arabic": "حسن علي نور الدين قاسم" +// }, +// { +// "phone": "+201289762092", +// "name_arabic": "اسلام متولي محمد سليمان" +// }, +// { +// "phone": "+201016748176", +// "name_arabic": "عبد الفتاح عبدربة احمد أبو النجا" +// }, +// { +// "phone": "+201225628631", +// "name_arabic": "ابراهيم راضي علي ابراهيم" +// }, +// { +// "phone": "+201129782745", +// "name_arabic": "جميل محمود مرسي محمود" +// }, +// { +// "phone": "+201229819069", +// "name_arabic": "عبد الرؤف احمد عبد الرؤف احمد" +// }, +// { +// "phone": "+201101474377", +// "name_arabic": "محمد خميس محمد اسماعيل" +// }, +// { +// "phone": "+201115605581", +// "name_arabic": "اشرف محمد عبد السلام الشنهاب" +// }, +// { +// "phone": "+201040873577", +// "name_arabic": "وائل محمد صالح محمد" +// }, +// { +// "phone": "+201027122541", +// "name_arabic": "محمد سمير محمد أحمد" +// }, +// { +// "phone": "+201110302100", +// "name_arabic": "عمرو فرج الله الشبراوى محمد" +// }, +// { +// "phone": "+201066141833", +// "name_arabic": "محمود حمادي عبدالعليم احمد" +// }, +// { +// "phone": "+201005215092", +// "name_arabic": "محمود فوزي محمد عبيد" +// }, +// { +// "phone": "+201118689666", +// "name_arabic": "انس ثروت عبدة عبد الكريم" +// }, +// { +// "phone": "+201224236042", +// "name_arabic": "مصطفى عبد العليم محمد عبد العال" +// }, +// { +// "phone": "+201281898421", +// "name_arabic": "مؤمن تامر عبد الرازق قطب" +// }, +// { +// "phone": "+201503377495", +// "name_arabic": "طارق يحيي السيد عطية خضير" +// }, +// { +// "phone": "+201006399505", +// "name_arabic": "هاني كامل مصطفي سالم" +// }, +// { +// "phone": "+201015717108", +// "name_arabic": "احمد مسعد بدوى السعيد" +// }, +// { +// "phone": "+201124535519", +// "name_arabic": "محمود فايز محمود علي" +// }, +// { +// "phone": "+201203039750", +// "name_arabic": "حسين فوزي عبدة الانصاري" +// }, +// { +// "phone": "+201080454035", +// "name_arabic": "خالد سليم محمود اسماعيل" +// }, +// { +// "phone": "+201115578231", +// "name_arabic": "احمد محسن محمود مدنى" +// }, +// { +// "phone": "+201091729780", +// "name_arabic": "نور محمد فاروق محمد الفولى" +// }, +// { +// "phone": "+201006964778", +// "name_arabic": "أحمد رزق عوض عطية" +// }, +// { +// "phone": "+201115590577", +// "name_arabic": "محمد سعيد طلعت محمود" +// }, +// { +// "phone": "+201205272428", +// "name_arabic": "خالد جاد الله محمد محمد جاد الله" +// }, +// { +// "phone": "+201550292268", +// "name_arabic": "خالد محمد عبد المعز على" +// }, +// { +// "phone": "+201220612822", +// "name_arabic": "مختار بسيوني موسي مختار" +// }, +// { +// "phone": "+201010182993", +// "name_arabic": "امجد مكرم جابر غالي" +// }, +// { +// "phone": "+201271122314", +// "name_arabic": "عبد الله حسين أحمد حسين" +// }, +// { +// "phone": "+201069483289", +// "name_arabic": "الاء عبد الحميد محمد محمد جوهر" +// }, +// { +// "phone": "+201000435451", +// "name_arabic": "عصام عبد الرحيم احمد العبد" +// }, +// { +// "phone": "+201155663592", +// "name_arabic": "ابراهيم محمود عيسي محمود" +// }, +// { +// "phone": "+201100070171", +// "name_arabic": "اسلام محمود محمد مصيلحي هلال" +// }, +// { +// "phone": "+201111710595", +// "name_arabic": "علي السيد على على شاهين" +// }, +// { +// "phone": "+201006833930", +// "name_arabic": "طارق احمد محمد احمد" +// }, +// { +// "phone": "+201013327761", +// "name_arabic": "عماد محمد عبد الرحيم مسعود" +// }, +// { +// "phone": "+201113076136", +// "name_arabic": "أحمد مصطفي أحمد عبد الرحيم" +// }, +// { +// "phone": "+201094057691", +// "name_arabic": "حسين عيد امام حسين" +// }, +// { +// "phone": "+201080979919", +// "name_arabic": "محمد سيد محمد عبد العزيز" +// }, +// { +// "phone": "+201155018765", +// "name_arabic": "رامز اشرف زرفل ملقى" +// }, +// { +// "phone": "+201286578166", +// "name_arabic": "محمد عزام حسن السيد بيومى" +// }, +// { +// "phone": "+201118882012", +// "name_arabic": "محمد ابو الحسن عوض ابوالحسن" +// }, +// { +// "phone": "+201202722090", +// "name_arabic": "علي محمد احمد عبد الرحمن" +// }, +// { +// "phone": "+201060444330", +// "name_arabic": "عمرو احمد احمد على فتح الباب" +// }, +// { +// "phone": "+201285537904", +// "name_arabic": "حمادة محمد عبد الحكيم احمد" +// }, +// { +// "phone": "+201018805430", +// "name_arabic": "مبارك السيد علي حسن حسنين" +// }, +// { +// "phone": "+201060410157", +// "name_arabic": "محمد أحمد عبد المجيد احمد" +// }, +// { +// "phone": "+201005288608", +// "name_arabic": "بيير جرجس فؤاد عزيز" +// }, +// { +// "phone": "+201004754688", +// "name_arabic": "محمد على جمعه أبو السعود" +// }, +// { +// "phone": "+201227885100", +// "name_arabic": "مانى احمد محمود حبيبة" +// }, +// { +// "phone": "+201006612787", +// "name_arabic": "محمد سامى محمد عبد الفتاح" +// }, +// { +// "phone": "+201289354010", +// "name_arabic": "مروة محمد محمد محمد عبد النبى" +// }, +// { +// "phone": "+201002570739", +// "name_arabic": "احمد حسن بخيت سالم" +// }, +// { +// "phone": "+201061099914", +// "name_arabic": "ايمن رمضان محمد صبري عبد الغنى" +// }, +// { +// "phone": "+201281011857", +// "name_arabic": "مينا بطرس شفيق نصر الله" +// }, +// { +// "phone": "+201220724766", +// "name_arabic": "صابر محمد إبراهيم سليمان" +// }, +// { +// "phone": "+201147364427", +// "name_arabic": "محمد عصام خميس عثمان" +// }, +// { +// "phone": "+201005496502", +// "name_arabic": "محمد احمد محمد احمد" +// }, +// { +// "phone": "+201027354730", +// "name_arabic": "كريم محمد احمد احمد حسن" +// }, +// { +// "phone": "+201066494278", +// "name_arabic": "سامر صابر وليم يوسف" +// }, +// { +// "phone": "+201003286440", +// "name_arabic": "ماجد عبد الرحمن محمد أبوزيد" +// }, +// { +// "phone": "+201111716562", +// "name_arabic": "محمد السيد محمد علي الضوي" +// }, +// { +// "phone": "+201014542026", +// "name_arabic": "محمد عبد الراضى عبد العظيم محمد" +// }, +// { +// "phone": "+201222971467", +// "name_arabic": "سمير سامي عبد الملك يوسف" +// }, +// { +// "phone": "+201150900790", +// "name_arabic": "كريم جمال الدين محمد عبده" +// }, +// { +// "phone": "+201032395859", +// "name_arabic": "محمود جعفر حسن محمد" +// }, +// { +// "phone": "+201017857163", +// "name_arabic": "محمد جمعة عبد الجليل عبد الحميد" +// }, +// { +// "phone": "+201100537732", +// "name_arabic": "محمد سمير محمد شاذلى" +// }, +// { +// "phone": "+201201840871", +// "name_arabic": "محمد عطيه محمد عمر" +// }, +// { +// "phone": "+201012121107", +// "name_arabic": "عبد المنصف عفيفي عبدالمنصف عفيفي شاكر" +// }, +// { +// "phone": "+201129300265", +// "name_arabic": "مصطفى فتحي عبد المعتمد محمد" +// }, +// { +// "phone": "+201098636746", +// "name_arabic": "مختار كامل حسين حسانين" +// }, +// { +// "phone": "+201284030135", +// "name_arabic": "مدحت محمد مصطفي عيسوي" +// }, +// { +// "phone": "+201096662301", +// "name_arabic": "عبد العزيز محمد عبد الحميد الدخاخئي" +// }, +// { +// "phone": "+201143828821", +// "name_arabic": "روفائيل رمسيس بسيط كراسي" +// }, +// { +// "phone": "+201117010340", +// "name_arabic": "كرم سعد محمد مصطفي" +// }, +// { +// "phone": "+201507066997", +// "name_arabic": "هانى رزيق ابواليمين مسعود" +// }, +// { +// "phone": "+201288343638", +// "name_arabic": "عزت محمد محمود عبدالله" +// }, +// { +// "phone": "+201032643384", +// "name_arabic": "أحمد فرج موسي محمد" +// }, +// { +// "phone": "+201125674355", +// "name_arabic": "محمد محسن محمد محمد" +// }, +// { +// "phone": "+201104429778", +// "name_arabic": "عبدربة نادى عبدربة محمد" +// }, +// { +// "phone": "+201144129961", +// "name_arabic": "احمد محمد فهمي عبدة" +// }, +// { +// "phone": "+201223336884", +// "name_arabic": "ادريانو جورج عزمى حنا" +// }, +// { +// "phone": "+201012530826", +// "name_arabic": "عصام عطية اسماعيل سليمان" +// }, +// { +// "phone": "+201015814105", +// "name_arabic": "احمد ساري محمود عسران" +// }, +// { +// "phone": "+201004034125", +// "name_arabic": "هانى محمد السيد إبراهيم القاضى" +// }, +// { +// "phone": "+201063600748", +// "name_arabic": "محمود محمد احمد حسن" +// }, +// { +// "phone": "+201129158922", +// "name_arabic": "سامح عاطف عبد الحليم ضيف" +// }, +// { +// "phone": "+201223369959", +// "name_arabic": "محمد كمال السيد حسين" +// }, +// { +// "phone": "+201006256325", +// "name_arabic": "دعاء سيد محمد على" +// }, +// { +// "phone": "+201123386341", +// "name_arabic": "مصطفى محمد حسن السعيد" +// }, +// { +// "phone": "+201111250676", +// "name_arabic": "عمرو أحمد محمود محمد" +// }, +// { +// "phone": "+201226262906", +// "name_arabic": "عبدالله ناجي عبد الباري عبد الكريم" +// }, +// { +// "phone": "+201000066807", +// "name_arabic": "احمد محمد محمد هاشم" +// }, +// { +// "phone": "+201222505995", +// "name_arabic": "كريم زكريا عبدة السيد" +// }, +// { +// "phone": "+201554900039", +// "name_arabic": "محمد ناصر ابراهيم احمد" +// }, +// { +// "phone": "+201008306697", +// "name_arabic": "محمد رشدي مختار غنيم" +// }, +// { +// "phone": "+201111300613", +// "name_arabic": "اسراء محمد ابراهيم جاد" +// }, +// { +// "phone": "+201118346957", +// "name_arabic": "على محمد سعيد أحمد" +// }, +// { +// "phone": "+201000426363", +// "name_arabic": "تامر محمد رضا عيد" +// }, +// { +// "phone": "+201222278308", +// "name_arabic": "اندرو عاطف حلمى لوس ميخائل" +// }, +// { +// "phone": "+201069588895", +// "name_arabic": "مصطفى جلال خلف على" +// }, +// { +// "phone": "+201030660719", +// "name_arabic": "عبد الغني السيد عبد الغني الشيخ" +// }, +// { +// "phone": "+201062469161", +// "name_arabic": "أحمد محمد حمدي محمد" +// }, +// { +// "phone": "+201098678727", +// "name_arabic": "عادل عبد المرضي سالم شحاته" +// }, +// { +// "phone": "+201147576107", +// "name_arabic": "احمد حسن احمد احمد" +// }, +// { +// "phone": "+201024506423", +// "name_arabic": "محمد ابراهيم محمد عثمان" +// }, +// { +// "phone": "+201144405477", +// "name_arabic": "صاد عبد الحميد عبد الفتاح على" +// }, +// { +// "phone": "+201004495677", +// "name_arabic": "هاني عمري عبدربة دعبس" +// }, +// { +// "phone": "+201064153512", +// "name_arabic": "محمد علي محمد مرسي" +// }, +// { +// "phone": "+201006701396", +// "name_arabic": "مي مصطفي كامل عبد الجواد" +// }, +// { +// "phone": "+201027466516", +// "name_arabic": "رامي عادل شفيق وهبة" +// }, +// { +// "phone": "+201227123834", +// "name_arabic": "محمد شعبان حسنى شعبان" +// }, +// { +// "phone": "+201211758977", +// "name_arabic": "ريشان يسري أنور عبد الحميد" +// }, +// { +// "phone": "+201277845811", +// "name_arabic": "محمد كس محمالحسن الشيخ" +// }, +// { +// "phone": "+201200395648", +// "name_arabic": "احمد محمد محسن السروى" +// }, +// { +// "phone": "+201202966511", +// "name_arabic": "امجد رفعت مختار تكلا" +// }, +// { +// "phone": "+201102856714", +// "name_arabic": "علي محمد صديق عامل" +// }, +// { +// "phone": "+201150836252", +// "name_arabic": "محمد شعبان بكري حماد" +// }, +// { +// "phone": "+201025075574", +// "name_arabic": "عصام الدين محمد علي أبو الحسن" +// }, +// { +// "phone": "+201500047144", +// "name_arabic": "صلاح محمود السيد محمد" +// }, +// { +// "phone": "+201119993654", +// "name_arabic": "محمد أحمد إبراهيم عبدالرحيم" +// }, +// { +// "phone": "+201022277558", +// "name_arabic": "إيمان محمود محمد سري" +// }, +// { +// "phone": "+201277779241", +// "name_arabic": "شريف أحمد عبد الله حسن" +// }, +// { +// "phone": "+201018626764", +// "name_arabic": "محمود فؤاد أبوسريع عبد المحسن" +// }, +// { +// "phone": "+201226983073", +// "name_arabic": "وليد رجب عبد الحميد محمد" +// }, +// { +// "phone": "+201033014117", +// "name_arabic": "عبد النبي محمد حسن سلامة" +// }, +// { +// "phone": "+201225656181", +// "name_arabic": "أيمن ربيع يوسف حافظ" +// }, +// { +// "phone": "+201000078568", +// "name_arabic": "صهيب مختار مصطفى احمد" +// }, +// { +// "phone": "+201158287799", +// "name_arabic": "احمد عبد الفتاح محمود مصطفي" +// }, +// { +// "phone": "+201124484309", +// "name_arabic": "مصطفى جمال يوسف عبد العليم" +// }, +// { +// "phone": "+201555181159", +// "name_arabic": "احمد جمعة احمد التركي" +// }, +// { +// "phone": "+201030939490", +// "name_arabic": "أحمد صفاء الدين أحمد كمال عبد المعطي" +// }, +// { +// "phone": "+201067855755", +// "name_arabic": "محمد خالد محمود طة السويفي" +// }, +// { +// "phone": "+201063923914", +// "name_arabic": "أحمد محمد سليمان شبل" +// }, +// { +// "phone": "+201067889013", +// "name_arabic": "محمد محمود محمد محمود" +// }, +// { +// "phone": "+201040925859", +// "name_arabic": "محمد عبد الرؤوف حسن محمد النخالة" +// }, +// { +// "phone": "+201553077785", +// "name_arabic": "إبراهيم هنداوي ابراهيم علي" +// }, +// { +// "phone": "+201115137661", +// "name_arabic": "عبد الرحمن جمال محمد حبيب" +// }, +// { +// "phone": "+201144707747", +// "name_arabic": "محمد رمضان ابراهيم احمد" +// }, +// { +// "phone": "+201204977751", +// "name_arabic": "محمد يحيى أحمد السيد" +// }, +// { +// "phone": "+201284690565", +// "name_arabic": "سعيد جمال محمد عبدالعال" +// }, +// { +// "phone": "+201110425511", +// "name_arabic": "محمد عبد الحميد علي مصطفى" +// }, +// { +// "phone": "+201205000292", +// "name_arabic": "عادل ابراهيم شنودة سيفين" +// }, +// { +// "phone": "+201289190947", +// "name_arabic": "مجدي ابراهيم حسين احمد" +// }, +// { +// "phone": "+201113024717", +// "name_arabic": "محمد حسن محمد محمود" +// }, +// { +// "phone": "+201110680165", +// "name_arabic": "احمد عبد المؤمن عزالدين سيد" +// }, +// { +// "phone": "+201202000888", +// "name_arabic": "ماهر عياد حليم قلتة" +// }, +// { +// "phone": "+201033552484", +// "name_arabic": "صلاح عبد الحميد محمود موسى" +// }, +// { +// "phone": "+201156556918", +// "name_arabic": "كريم جمال رجب على محروس" +// }, +// { +// "phone": "+201146251664", +// "name_arabic": "حمدى صابر حمدى حموده مقلد" +// }, +// { +// "phone": "+201022329267", +// "name_arabic": "سارة عادل موسى شتية" +// }, +// { +// "phone": "+201127315881", +// "name_arabic": "حازم خالد ابراهيم خليل" +// }, +// { +// "phone": "+201111847907", +// "name_arabic": "محمد حسن اسماعيل رشوان" +// }, +// { +// "phone": "+201010240691", +// "name_arabic": "محمد طارق محمد عكاشه" +// }, +// { +// "phone": "+201154129231", +// "name_arabic": "عبد الرحمن هشام محمد طه" +// }, +// { +// "phone": "+201285060920", +// "name_arabic": "عمر سيد محمد عمر" +// }, +// { +// "phone": "+201271594124", +// "name_arabic": "ابراهيم عبدالله محمد ابراهيم" +// }, +// { +// "phone": "+201146864382", +// "name_arabic": "محمد محمود فتحي فرج" +// }, +// { +// "phone": "+201205759040", +// "name_arabic": "وجدي سعيد احمد عوض الله" +// }, +// { +// "phone": "+201200225120", +// "name_arabic": "على محمد علي عليان المصرى" +// }, +// { +// "phone": "+201125494293", +// "name_arabic": "أحمد مسلم عبد العزيز محمد حسن" +// }, +// { +// "phone": "+201065161321", +// "name_arabic": "مازن محمود توفيق عباس" +// }, +// { +// "phone": "+201028202170", +// "name_arabic": "وائل أحمد ابراهيم على جمعه" +// }, +// { +// "phone": "+201125932370", +// "name_arabic": "كريم محمد اسمة عزى ،محمد" +// }, +// { +// "phone": "+201279872337", +// "name_arabic": "سمير مسعد فهمى المرسى" +// }, +// { +// "phone": "+201151465008", +// "name_arabic": "يوسف محمد سعد الدين محمد" +// }, +// { +// "phone": "+201022252604", +// "name_arabic": "احمد محمود صالح مرجان" +// }, +// { +// "phone": "+201022246204", +// "name_arabic": "محمود عادل عدلى السيد" +// }, +// { +// "phone": "+201030238818", +// "name_arabic": "محمد سيد منصور سيد" +// }, +// { +// "phone": "+201093355983", +// "name_arabic": "اسلام على عبد العاطى محمد" +// }, +// { +// "phone": "+201113752022", +// "name_arabic": "أحمد جمعة احمد ابراهيم" +// }, +// { +// "phone": "+201003845045", +// "name_arabic": "مهاود مصطفي مهاود غريب" +// }, +// { +// "phone": "+201003457552", +// "name_arabic": "سيف الدين سامح على محمد" +// }, +// { +// "phone": "+201065420602", +// "name_arabic": "كريم عزت روبي فريد احمد" +// }, +// { +// "phone": "+201145139236", +// "name_arabic": "عادل عبد الرؤوف عبد الهادي حسن" +// }, +// { +// "phone": "+201500085192", +// "name_arabic": "احمد محمود عبد السلام أحمد" +// }, +// { +// "phone": "+201003093029", +// "name_arabic": "سعيد جمعه ابراهيم على" +// }, +// { +// "phone": "+201066099621", +// "name_arabic": "احمد هشام كمال إبراهيم" +// }, +// { +// "phone": "+201017435616", +// "name_arabic": "حمادة محمد رشيد محمد" +// }, +// { +// "phone": "+201021746149", +// "name_arabic": "محمد على كامل حسنى" +// }, +// { +// "phone": "+201029508572", +// "name_arabic": "السيد عبد الفتاح عبد الحميد محمد" +// }, +// { +// "phone": "+201100588511", +// "name_arabic": "محمد مصطفي مصطفي محمد" +// }, +// { +// "phone": "+201144224787", +// "name_arabic": "عمرو رضا سيد حسين" +// }, +// { +// "phone": "+201013248449", +// "name_arabic": "خالد محمد عبد الحميد عبد الحليم" +// }, +// { +// "phone": "+201153590337", +// "name_arabic": "سيد ابراهيم حامد أحمد" +// }, +// { +// "phone": "+201020847945", +// "name_arabic": "محمد عبد الدايم سليم على" +// }, +// { +// "phone": "+201006872031", +// "name_arabic": "نبيل محمد حسن حسيب" +// }, +// { +// "phone": "+201124171759", +// "name_arabic": "مصطفى اسامه عبد الرحمن أبو الفتوح" +// }, +// { +// "phone": "+201279920962", +// "name_arabic": "محمد عبد السلام عبد الباري مصطفى" +// }, +// { +// "phone": "+201126264968", +// "name_arabic": "بلال احمد محمد حسين" +// }, +// { +// "phone": "+201200390003", +// "name_arabic": "حلمي شعبان محمد محمود" +// }, +// { +// "phone": "+201201928104", +// "name_arabic": "محمد احمد محمد علي فرج" +// }, +// { +// "phone": "+201006566057", +// "name_arabic": "عبد الهادي عبد الوهاب فرج البرقي" +// }, +// { +// "phone": "+201023176131", +// "name_arabic": "عظام إبراهيم عبد الحميد أعام" +// }, +// { +// "phone": "+201093719040", +// "name_arabic": "اسلام عاطف أنور إبراهيم" +// }, +// { +// "phone": "+201002358001", +// "name_arabic": "فادي حسن فايد المرسي" +// }, +// { +// "phone": "+201060934363", +// "name_arabic": "حسام حسين عبد المقصود شرباش" +// }, +// { +// "phone": "+201005153560", +// "name_arabic": "احمد محمد عبد الفتاح خالد" +// }, +// { +// "phone": "+201279294769", +// "name_arabic": "أحمد دياب محمد على" +// }, +// { +// "phone": "+201228408157", +// "name_arabic": "محمد كمال أحمد حسن عبد العال" +// }, +// { +// "phone": "+201023069002", +// "name_arabic": "سعيد علي السيد علي رضوان" +// }, +// { +// "phone": "+201029151975", +// "name_arabic": "أيمن محمد سعيد جلال عطيه" +// }, +// { +// "phone": "+201556777323", +// "name_arabic": "ايمن محمد شفيق طة ابراهيم دراج" +// }, +// { +// "phone": "+201145809497", +// "name_arabic": "محمد عادل امام مصطفي" +// }, +// { +// "phone": "+201005170670", +// "name_arabic": "خالد احمد حامد توفل" +// }, +// { +// "phone": "+201273662218", +// "name_arabic": "احمد محمد فرماوي سيداحمد" +// }, +// { +// "phone": "+201555000205", +// "name_arabic": "محمد أنور أحمد محمد" +// }, +// { +// "phone": "+201116974205", +// "name_arabic": "محمد ناصر محمود كامل" +// }, +// { +// "phone": "+201094688644", +// "name_arabic": "وليد سيد عدلى شحاته" +// }, +// { +// "phone": "+201003694291", +// "name_arabic": "هاني صلاح دعبول" +// }, +// { +// "phone": "+201202829424", +// "name_arabic": "يوسف احمد محمد فريد" +// }, +// { +// "phone": "+201277159302", +// "name_arabic": "عبده على رمضان معوض" +// }, +// { +// "phone": "+201009793301", +// "name_arabic": "خالد عبد الغني عبد الفتاح" +// }, +// { +// "phone": "+201004712116", +// "name_arabic": "احمد مصطفى هاشم محمود" +// }, +// { +// "phone": "+201005609606", +// "name_arabic": "مصطفى محمود محمد عطية" +// }, +// { +// "phone": "+201156440833", +// "name_arabic": "سيد جاد الكريم فرغلى احمد" +// }, +// { +// "phone": "+201114255461", +// "name_arabic": "وليد عاطف محمد محمد" +// }, +// { +// "phone": "+201000045214", +// "name_arabic": "شهاب اوسام محمد عبد الله" +// }, +// { +// "phone": "+201127333773", +// "name_arabic": "محمد على محمد العباسى" +// }, +// { +// "phone": "+201040529142", +// "name_arabic": "محمد عبد المقصود محمد زكى" +// }, +// { +// "phone": "+201287277734", +// "name_arabic": "محمد سيد حافظ احمد علي" +// }, +// { +// "phone": "+201200422610", +// "name_arabic": "بيشوي ابراهيم ذكي ميخائيل" +// }, +// { +// "phone": "+201065601203", +// "name_arabic": "أحمد محمد إبراهيم خليفه محمد" +// }, +// { +// "phone": "+201004397076", +// "name_arabic": "أحمد محسن حسن بصل" +// }, +// { +// "phone": "+201158342680", +// "name_arabic": "سعيد أحمد عبد الصمد الحسانين" +// }, +// { +// "phone": "+201556699739", +// "name_arabic": "حسام عماد نصر حسن" +// }, +// { +// "phone": "+201006053289", +// "name_arabic": "رشاب فتحى محمد عبد الرحمن" +// }, +// { +// "phone": "+201146448910", +// "name_arabic": "يوسف جمال حسانين على" +// }, +// { +// "phone": "+201144338541", +// "name_arabic": "يسن مجدي يسن محمد" +// }, +// { +// "phone": "+201116691183", +// "name_arabic": "محمد أشرف عبد الرحمن محمد العوضى" +// }, +// { +// "phone": "+201114384428", +// "name_arabic": "عمرو حمدي محمد ابراهيم" +// }, +// { +// "phone": "+201144400173", +// "name_arabic": "سامح صبحي سالم محمد" +// }, +// { +// "phone": "+201011873111", +// "name_arabic": "شريف محمد سيد سالم" +// }, +// { +// "phone": "+201010866363", +// "name_arabic": "فادى مظفر طرابيشى" +// }, +// { +// "phone": "+201142046386", +// "name_arabic": "عبد الرحمن نادى فؤاد عبد الموجود" +// }, +// { +// "phone": "+201155633622", +// "name_arabic": "احمد عماد إبراهيم مرسى" +// }, +// { +// "phone": "+201220803419", +// "name_arabic": "مصطفى حسنى عبدالعظيم خلف الله" +// }, +// { +// "phone": "+201010529548", +// "name_arabic": "محمد فوزي حسين سيد رزق" +// }, +// { +// "phone": "+201001880988", +// "name_arabic": "عمرو على محمد على" +// }, +// { +// "phone": "+201277740069", +// "name_arabic": "شريف إبراهيم عبد العظيم عبد المطلب ابوداة" +// }, +// { +// "phone": "+201006874127", +// "name_arabic": "محمد عبد الرسول خضري عبد الجليل" +// }, +// { +// "phone": "+201553328322", +// "name_arabic": "حسين محمد حنفي محمد" +// }, +// { +// "phone": "+201156941320", +// "name_arabic": "محمد جمعة جادالله على" +// }, +// { +// "phone": "+201063831389", +// "name_arabic": "محمد صادق مصطفى صادق" +// }, +// { +// "phone": "+201119490066", +// "name_arabic": "أحمد عبد العزيز فؤاد عبد العزيز" +// }, +// { +// "phone": "+201127175474", +// "name_arabic": "رباب احمد ابراهيم على" +// }, +// { +// "phone": "+201098083764", +// "name_arabic": "حمزه أيمن عبد البديع عبد الحميد رمضان" +// }, +// { +// "phone": "+201151873885", +// "name_arabic": "فيصل عبد الله محمد أحمد" +// }, +// { +// "phone": "+201211955045", +// "name_arabic": "محمد حسن خلف أبوالحسن علي" +// }, +// { +// "phone": "+201029950342", +// "name_arabic": "ياسر محمود طة خليل" +// }, +// { +// "phone": "+201143123876", +// "name_arabic": "محمد بدري عبد الحميد علي" +// }, +// { +// "phone": "+201146628267", +// "name_arabic": "أحمد عبد النبي عبد المنعم جمعة" +// }, +// { +// "phone": "+201111749924", +// "name_arabic": "هانى مصطفي على لبيب" +// }, +// { +// "phone": "+201001868999", +// "name_arabic": "دعاء عيد حسني محمود" +// }, +// { +// "phone": "+201063525249", +// "name_arabic": "ميرفت رفعت عيسى سليم" +// }, +// { +// "phone": "+201141919520", +// "name_arabic": "حسن يحيى معوض جمعه مبارك" +// }, +// { +// "phone": "+201113999375", +// "name_arabic": "احمد محمد دسوقي محمد" +// }, +// { +// "phone": "+201288326620", +// "name_arabic": "اوديت عياد جرجس عياد" +// }, +// { +// "phone": "+201124211723", +// "name_arabic": "مصطفى سيد عبد المنعم محمد" +// }, +// { +// "phone": "+201120545944", +// "name_arabic": "عبد العزيز سامي محمد عبد الدايم" +// }, +// { +// "phone": "+201227214145", +// "name_arabic": "محمد كامل سيد علي" +// }, +// { +// "phone": "+201155581701", +// "name_arabic": "شادى حلمى المتولى الديدامونى" +// }, +// { +// "phone": "+201144626239", +// "name_arabic": "أحمد محسن أحمد حسين" +// }, +// { +// "phone": "+201006793791", +// "name_arabic": "أحمد محمد عبد الرحمن عبد الرحمن" +// }, +// { +// "phone": "+201121218416", +// "name_arabic": "كريم ابراهيم قطب محمد" +// }, +// { +// "phone": "+201220914219", +// "name_arabic": "ابراهيم محمد محمد ابراهيم" +// }, +// { +// "phone": "+201117788571", +// "name_arabic": "عمر عادل عماره الشربينى" +// }, +// { +// "phone": "+201271473470", +// "name_arabic": "محمد كمال حسين احمد" +// }, +// { +// "phone": "+201102744333", +// "name_arabic": "سعيد سمير محمد مجاهد" +// }, +// { +// "phone": "+201003345374", +// "name_arabic": "عبدالله نبيل سعيد عبد السلام" +// }, +// { +// "phone": "+201064054511", +// "name_arabic": "يوسف سعيد زكى" +// }, +// { +// "phone": "+201090409575", +// "name_arabic": "مصطفى سمير جابر حافظ عبد الله" +// }, +// { +// "phone": "+201153508619", +// "name_arabic": "محمد ممدوح محمد سعد عوض" +// }, +// { +// "phone": "+201030212004", +// "name_arabic": "ابراهيم عبد الله ابراهيم شاهين" +// }, +// { +// "phone": "+201144377954", +// "name_arabic": "محمد عبد العظيم محمد محمد شرف" +// }, +// { +// "phone": "+201014012134", +// "name_arabic": "احمد محمد فريد عبد الله" +// }, +// { +// "phone": "+201222738666", +// "name_arabic": "أحمد بهجت محمد عبد الحميد" +// }, +// { +// "phone": "+201028603589", +// "name_arabic": "كريم كمال عبد المنعم الجندي" +// }, +// { +// "phone": "+201272674516", +// "name_arabic": "محمد محمد أحمد بدوى" +// }, +// { +// "phone": "+201091699947", +// "name_arabic": "احمد محمد محمد المغازي" +// }, +// { +// "phone": "+201210025111", +// "name_arabic": "جرجس باسليوس جندي باسليوس" +// }, +// { +// "phone": "+201009752899", +// "name_arabic": "احمد أسعد ابراهيم مصطفي" +// }, +// { +// "phone": "+201554752044", +// "name_arabic": "محمد زينهم السيد عيد" +// }, +// { +// "phone": "+201128316869", +// "name_arabic": "محمود عادل حلمي علي هلال" +// }, +// { +// "phone": "+201070681701", +// "name_arabic": "ابانوب فارس ماكن فهيم يوسف" +// }, +// { +// "phone": "+201553482359", +// "name_arabic": "للة محمد رمضان عبدالله" +// }, +// { +// "phone": "+201009666489", +// "name_arabic": "احمد يوسف السيد عرفة محمد" +// }, +// { +// "phone": "+201201491025", +// "name_arabic": "السيد عزت محمد السيد" +// }, +// { +// "phone": "+201009969727", +// "name_arabic": "احمد عبد الحميد نصر عليوة" +// }, +// { +// "phone": "+201112524534", +// "name_arabic": "اسلام فرج جمعه عبد الغنى" +// }, +// { +// "phone": "+201029572520", +// "name_arabic": "السيد عبد العزيز عبد الحميد" +// }, +// { +// "phone": "+201093837908", +// "name_arabic": "حسين سيد محمد مسعود" +// }, +// { +// "phone": "+201211079908", +// "name_arabic": "محمد صلاح صادق حسنين" +// }, +// { +// "phone": "+201222748994", +// "name_arabic": "حسام عماد فتحى إسماعيل" +// }, +// { +// "phone": "+201007581968", +// "name_arabic": "يوسف مجدى عبد القادر اليمنى محمد" +// }, +// { +// "phone": "+201119777928", +// "name_arabic": "مصطفى حسين حسين سلوم" +// }, +// { +// "phone": "+201033840119", +// "name_arabic": "محمد خميس محمد محمود حجازى" +// }, +// { +// "phone": "+201000530401", +// "name_arabic": "ياسر محمد ماهر محمد فؤاد" +// }, +// { +// "phone": "+201141498248", +// "name_arabic": "مسية أحمد سيد محمد" +// }, +// { +// "phone": "+201157265506", +// "name_arabic": "عبد الناصر محمود حسين مرعي" +// }, +// { +// "phone": "+201146055558", +// "name_arabic": "‏ياسر محمد حافظ حافظ" +// }, +// { +// "phone": "+201001220546", +// "name_arabic": "احمد سمير عبد العاطى عبد المجيد القلى" +// }, +// { +// "phone": "+201129995142", +// "name_arabic": "محمد حجازي شتا حجازي" +// }, +// { +// "phone": "+201111282490", +// "name_arabic": "السيد محمد احمد محمد" +// }, +// { +// "phone": "+201222620610", +// "name_arabic": "عبدة عادل توفيق سيدهم" +// }, +// { +// "phone": "+201142877782", +// "name_arabic": "هيثم علي محمود محمد حزين" +// }, +// { +// "phone": "+201000136570", +// "name_arabic": "أحمد السيد عبد الله منهى" +// }, +// { +// "phone": "+201066253365", +// "name_arabic": "عمرو عاطف محمد فرج" +// }, +// { +// "phone": "+201143727372", +// "name_arabic": "محمد فتحي السيد جمعة" +// }, +// { +// "phone": "+201020530370", +// "name_arabic": "محمد سيد أحمد فرج" +// }, +// { +// "phone": "+201225347230", +// "name_arabic": "محمد جمال عبد الناصر حسن ابراهيم" +// }, +// { +// "phone": "+201009226977", +// "name_arabic": "عصام عويس محمد عطا الله" +// }, +// { +// "phone": "+201210222509", +// "name_arabic": "مجدي ماهر عزمى رزق الله" +// }, +// { +// "phone": "+201024106053", +// "name_arabic": "عبد الوهاب احمد سعد بدير" +// }, +// { +// "phone": "+201201171230", +// "name_arabic": "بيتر منير نجيب حلقة" +// }, +// { +// "phone": "+201000038159", +// "name_arabic": "هشام محمد محمد سيد" +// }, +// { +// "phone": "+201112060404", +// "name_arabic": "احمد محمد علي خليفة" +// }, +// { +// "phone": "+201503993999", +// "name_arabic": "محمد حسن محمد محمود" +// }, +// { +// "phone": "+201277870121", +// "name_arabic": "احمد محب فتح الله عوض" +// }, +// { +// "phone": "+201062816880", +// "name_arabic": "وليد شحات عبد الراضى شحات" +// }, +// { +// "phone": "+201006989111", +// "name_arabic": "سارة محمود نصير هاشم مهران" +// }, +// { +// "phone": "+201501538118", +// "name_arabic": "اندرو أسامة انس مكسيموس" +// }, +// { +// "phone": "+201000237968", +// "name_arabic": "محمود عصام ابراهيم عبد الله" +// }, +// { +// "phone": "+201222136029", +// "name_arabic": "أمجد فوزى عبد الملاك عوض الله" +// }, +// { +// "phone": "+201112955169", +// "name_arabic": "أحمد شوقى محمد القرنشاوى" +// }, +// { +// "phone": "+201221278704", +// "name_arabic": "كريم عبد الحميد محمد عبد الحميد إبراهيم" +// }, +// { +// "phone": "+201129262623", +// "name_arabic": "عبدالله علوى اليمنى احمد" +// }, +// { +// "phone": "+201102660856", +// "name_arabic": "يوسف ايمن محمد عبد الله" +// }, +// { +// "phone": "+201009392708", +// "name_arabic": "محمد مصطفي موسي عبدة المرسي" +// }, +// { +// "phone": "+201140401450", +// "name_arabic": "عبدالرحمن صلاح عبد الستار عبد الحميد" +// }, +// { +// "phone": "+201012544305", +// "name_arabic": "عبد الحميد محمد السيد فتح الله" +// }, +// { +// "phone": "+201124508987", +// "name_arabic": "عماد عبد المنعم محمد سلام" +// }, +// { +// "phone": "+201001620817", +// "name_arabic": "ايمان ابراهيم السيد الشناوى" +// }, +// { +// "phone": "+201004621929", +// "name_arabic": "اسلام احمد يحى محمد" +// }, +// { +// "phone": "+201273024547", +// "name_arabic": "محمود فرج متولي السيد" +// }, +// { +// "phone": "+201118787900", +// "name_arabic": "حمود عبد النبى طويل محمد" +// }, +// { +// "phone": "+201113415542", +// "name_arabic": "مصطفى قطب قطب حسن" +// }, +// { +// "phone": "+201278119893", +// "name_arabic": "معتز على عبدالرحمن على" +// }, +// { +// "phone": "+201500888614", +// "name_arabic": "مودي حسين أحمد علي الحكيم" +// }, +// { +// "phone": "+201030098795", +// "name_arabic": "محمد عادل عبد الغني عبد العزيز" +// }, +// { +// "phone": "+201115716299", +// "name_arabic": "امين عبده أمين اسماعيل العكل" +// }, +// { +// "phone": "+201025055610", +// "name_arabic": "محمد حسن حفنى على" +// }, +// { +// "phone": "+201147181768", +// "name_arabic": "رمضان حمدى مصطفى ابراهيم" +// }, +// { +// "phone": "+201201325322", +// "name_arabic": "مصطفى محمد عاشور على" +// }, +// { +// "phone": "+201159290963", +// "name_arabic": "هاب اشرف محمود السيد" +// }, +// { +// "phone": "+201066596220", +// "name_arabic": "أحمد خالد عبد الحكيم العطار" +// }, +// { +// "phone": "+201029139900", +// "name_arabic": "بلال عبد التواب عبد الباقي رمضان" +// }, +// { +// "phone": "+201144758413", +// "name_arabic": "كريم وليد صلاح احمد" +// }, +// { +// "phone": "+201126625122", +// "name_arabic": "يوسف صبحى عبد العاطى محمود" +// }, +// { +// "phone": "+201094675427", +// "name_arabic": "عصام علي عيد عبدربة" +// }, +// { +// "phone": "+201126424726", +// "name_arabic": "احمد فتحى أحمد محمد" +// }, +// { +// "phone": "+201009869329", +// "name_arabic": "احمد عبد الخالق صبحي عبداللطيف" +// }, +// { +// "phone": "+201554442264", +// "name_arabic": "هانى مصطفى عبد العزيز عبدربة" +// }, +// { +// "phone": "+201004508215", +// "name_arabic": "احمد السيد احمد عبد المقصود" +// }, +// { +// "phone": "+201205000801", +// "name_arabic": "محمود رمضان عباس سيف النصر" +// }, +// { +// "phone": "+201127301093", +// "name_arabic": "أحمد سيد عباس على احمد" +// }, +// { +// "phone": "+201020570092", +// "name_arabic": "احمد محمد عبد المجيد محمد" +// }, +// { +// "phone": "+201001346076", +// "name_arabic": "مصطفى جمال مصطفى عبد الحكيم" +// }, +// { +// "phone": "+201149660249", +// "name_arabic": "سلام مصطفى اسماعيل محمد" +// }, +// { +// "phone": "+201067716347", +// "name_arabic": "طه حسين راشد حسن الرشيدى" +// }, +// { +// "phone": "+201227831100", +// "name_arabic": "مينا مرزوق ميخائيل مجلى" +// }, +// { +// "phone": "+201212362248", +// "name_arabic": "بيشوي سمير ايوب ميخائيل" +// }, +// { +// "phone": "+201201281670", +// "name_arabic": "ربيع أحمد حسين عبداللطيف" +// }, +// { +// "phone": "+201555334562", +// "name_arabic": "حمدى حمودة محمد حمودة" +// }, +// { +// "phone": "+201007135060", +// "name_arabic": "محمد سعد الدين حامد أحمد بكري" +// }, +// { +// "phone": "+201118416274", +// "name_arabic": "عاطف أحمد أحمد مصطفي" +// }, +// { +// "phone": "+201157036010", +// "name_arabic": "عماد عصام سيد مكاوي" +// }, +// { +// "phone": "+201221408219", +// "name_arabic": "اسلام حسين عبد المنعم حسين" +// }, +// { +// "phone": "+201020172859", +// "name_arabic": "محمد معوض محمدي احمد" +// }, +// { +// "phone": "+201550507088", +// "name_arabic": "احمد محمد نعيم صالح" +// }, +// { +// "phone": "+201061350410", +// "name_arabic": "سماح محمد احمد عطية" +// }, +// { +// "phone": "+201200221274", +// "name_arabic": "محمود حسن محمود حنفي محمود" +// }, +// { +// "phone": "+201007740820", +// "name_arabic": "سيد على اسماعيل بيومى" +// }, +// { +// "phone": "+201121539342", +// "name_arabic": "امجد احمد عبد الفتاح بشير" +// }, +// { +// "phone": "+201275012454", +// "name_arabic": "محمد عبد السلام محمد محمد دبور" +// }, +// { +// "phone": "+201011265177", +// "name_arabic": "هيثم محمد عثمان محمد سالم" +// }, +// { +// "phone": "+201002507461", +// "name_arabic": "محمد احمد سمير نبيه" +// }, +// { +// "phone": "+201004719859", +// "name_arabic": "احمد عزت محمد الصديق سلطان" +// }, +// { +// "phone": "+201016388436", +// "name_arabic": "صبحى احمد عوض ابو النجاة" +// }, +// { +// "phone": "+201002211383", +// "name_arabic": "احمد مصطفى عبد الله الصواف" +// }, +// { +// "phone": "+201060037563", +// "name_arabic": "مصطفى سمير محمد عبده" +// }, +// { +// "phone": "+201007526078", +// "name_arabic": "كريم هاشم محمود عبد المطلب" +// }, +// { +// "phone": "+201289667950", +// "name_arabic": "ايمن احمد على فرغلي" +// }, +// { +// "phone": "+201023665569", +// "name_arabic": "محمد محسن محمد كامل" +// }, +// { +// "phone": "+201223671633", +// "name_arabic": "ياسر سيد عبد السلام وظيف" +// }, +// { +// "phone": "+201224902930", +// "name_arabic": "إيهاب محمد ابراهيم طلعت" +// }, +// { +// "phone": "+201200751933", +// "name_arabic": "محمد صلاح محمد رضوان شلبى" +// }, +// { +// "phone": "+201062722859", +// "name_arabic": "محمد عصام رمضان أحمد" +// }, +// { +// "phone": "+201223237204", +// "name_arabic": "احمد محمد أبوالغيط زكى على" +// }, +// { +// "phone": "+201208977177", +// "name_arabic": "احمد عبد النبي خميس عبد الغني حسين" +// }, +// { +// "phone": "+201096853497", +// "name_arabic": "مهند محمد عبد المنعم" +// }, +// { +// "phone": "+201012488525", +// "name_arabic": "احمد جمال عبد الحميد عواد مرسي" +// }, +// { +// "phone": "+201061646523", +// "name_arabic": "احمد محمود أحمد محمد" +// }, +// { +// "phone": "+201063809266", +// "name_arabic": "معتز محمد عبد العزيز حسين" +// }, +// { +// "phone": "+201033300165", +// "name_arabic": "أحمد السعيد عباس بيومي المحلاوي" +// }, +// { +// "phone": "+201157566765", +// "name_arabic": "عمر فتحي عبد العليم احمد" +// }, +// { +// "phone": "+201029748411", +// "name_arabic": "أحمد وحيد محمد النجار" +// }, +// { +// "phone": "+201024137080", +// "name_arabic": "جورج ميخائيل غالي ميخائيل" +// }, +// { +// "phone": "+201124215002", +// "name_arabic": "احمد ابراهيم ثبيل بيومي حسن المصري" +// }, +// { +// "phone": "+201113512958", +// "name_arabic": "أحمد وجيه أحمد محمود بمنسى" +// }, +// { +// "phone": "+201001144387", +// "name_arabic": "حسن شوقي صالح بهجت" +// }, +// { +// "phone": "+201201621622", +// "name_arabic": "احمد محمد جابر أحمد" +// }, +// { +// "phone": "+201203181372", +// "name_arabic": "محمد عبد العظيم سيد" +// }, +// { +// "phone": "+201275986557", +// "name_arabic": "حسن عادل اسماعيل محمد" +// }, +// { +// "phone": "+201116646518", +// "name_arabic": "تامر جمال عبد الحليم محمد" +// }, +// { +// "phone": "+201009929826", +// "name_arabic": "مدحت على عبد المعبود على موسى" +// }, +// { +// "phone": "+201207750441", +// "name_arabic": "أمير فرج غريب فرج" +// }, +// { +// "phone": "+201143283485", +// "name_arabic": "مرزوق فوزي زكي جرس" +// }, +// { +// "phone": "+201228758354", +// "name_arabic": "مصطفي عبد الرحمن حميدو محمد الحضري" +// }, +// { +// "phone": "+201110921077", +// "name_arabic": "زياد ايمن رزق عبد المولى جاب الله" +// }, +// { +// "phone": "+201099924551", +// "name_arabic": "محمد احمد سالم سالم" +// }, +// { +// "phone": "+201033053068", +// "name_arabic": "أحمد عارف محمود ايوب" +// }, +// { +// "phone": "+201068212833", +// "name_arabic": "سامح عبد الواحد محمود محمد" +// }, +// { +// "phone": "+201000151861", +// "name_arabic": "محمد طارق محمد كمال محمود" +// }, +// { +// "phone": "+201070400456", +// "name_arabic": "محمد ناجي صابر احمد" +// }, +// { +// "phone": "+201112904181", +// "name_arabic": "أحمد عبد الله بركات عبد الله" +// }, +// { +// "phone": "+201093882353", +// "name_arabic": "تامر محمود حسن محمد" +// }, +// { +// "phone": "+201281888724", +// "name_arabic": "محمود محمد محمود الورداني" +// }, +// { +// "phone": "+201027030168", +// "name_arabic": "أحمد جمعة حامد جمعة" +// }, +// { +// "phone": "+201206864943", +// "name_arabic": "ابراهيم محسن عطيه محمد" +// }, +// { +// "phone": "+201150259592", +// "name_arabic": "حسن سعداوى عبد الحميد" +// }, +// { +// "phone": "+201119822022", +// "name_arabic": "اسامه محمود عبد الغني عسران" +// }, +// { +// "phone": "+201122502020", +// "name_arabic": "أحمد محمد أحمد طه" +// }, +// { +// "phone": "+201111136511", +// "name_arabic": "ناصف عبد الحميد محمد ناصف" +// }, +// { +// "phone": "+201060208601", +// "name_arabic": "مصطفى شحته محمد درويش" +// }, +// { +// "phone": "+201120398185", +// "name_arabic": "أيمن عبد العظيم احمد محمد ثابت" +// }, +// { +// "phone": "+201118377195", +// "name_arabic": "احمد محمود محمد نافع" +// }, +// { +// "phone": "+201006003727", +// "name_arabic": "نادر نبيل نسيم لبس" +// }, +// { +// "phone": "+201099786639", +// "name_arabic": "ايمن مجدى رمضان عبد القادر" +// }, +// { +// "phone": "+201204182086", +// "name_arabic": "مصطفى مصطفى حسن إبراهيم" +// }, +// { +// "phone": "+201113450473", +// "name_arabic": "إسلام محمود مصطفى عبد الغنى" +// }, +// { +// "phone": "+201125671941", +// "name_arabic": "محمود قطب رضوان السيد" +// }, +// { +// "phone": "+201551233318", +// "name_arabic": "علي علي شعبان فتح الباب" +// }, +// { +// "phone": "+201012342004", +// "name_arabic": "عبد الحكيم نبيه عبد الحكيم سالم بدوي" +// }, +// { +// "phone": "+201050269888", +// "name_arabic": "أحمد عطية محمد عطية السيد" +// }, +// { +// "phone": "+201285672659", +// "name_arabic": "مينا نعيم صبحى جرجس" +// }, +// { +// "phone": "+201096775347", +// "name_arabic": "اسلام سلامه مصطفى عبد العزيز" +// }, +// { +// "phone": "+201010041236", +// "name_arabic": "محمد مجدى عبد الحميد عيد" +// }, +// { +// "phone": "+201029614029", +// "name_arabic": "محمد حلمى عبد الله السيد العراقى" +// }, +// { +// "phone": "+201226416059", +// "name_arabic": "محمد عبد الرحيم يحي عبد الحميد الحو" +// }, +// { +// "phone": "+201005857716", +// "name_arabic": "ابراهيم محمد محمد على درويش" +// }, +// { +// "phone": "+201224911013", +// "name_arabic": "رضا فرج إبراهيم خليل" +// }, +// { +// "phone": "+201127252347", +// "name_arabic": "حسين وليد حسن عطية" +// }, +// { +// "phone": "+201009945537", +// "name_arabic": "محمد احمد محمد محمود أبوالخير" +// }, +// { +// "phone": "+201115794827", +// "name_arabic": "أحمد سعودى احمد عبد الرحيم" +// }, +// { +// "phone": "+201015493716", +// "name_arabic": "محمد أحمد عطيه غانم" +// }, +// { +// "phone": "+201122466640", +// "name_arabic": "أحمد صابر محمد عبد الوهاب خيرة" +// }, +// { +// "phone": "+201156665182", +// "name_arabic": "احمد حسن عبد المحسن شعبان" +// }, +// { +// "phone": "+201003698426", +// "name_arabic": "عادل عبد الفتاح حماده عبد النعيم" +// }, +// { +// "phone": "+201553171779", +// "name_arabic": "أحمد محمد درويش حسين" +// }, +// { +// "phone": "+201158366543", +// "name_arabic": "كريم محفوظ محمد بدوي" +// }, +// { +// "phone": "+201145274889", +// "name_arabic": "أحمد مدحت محمد مصطفى" +// }, +// { +// "phone": "+201555125293", +// "name_arabic": "فادى فوزى اسكندر دميان" +// }, +// { +// "phone": "+201005840296", +// "name_arabic": "يوسف عادل نبوي عبد الحميد" +// }, +// { +// "phone": "+201151700156", +// "name_arabic": "حاتم محمد صبري عبد الفتاح حجاج" +// }, +// { +// "phone": "+201122681852", +// "name_arabic": "شيماء على محمد محمد" +// }, +// { +// "phone": "+201097830102", +// "name_arabic": "نور الدين محسن محمد احمد الخشاب" +// }, +// { +// "phone": "+201154248161", +// "name_arabic": "محمد علاء حسن سليمان" +// }, +// { +// "phone": "+201064446857", +// "name_arabic": "احمد علاء الدين جمال بخيت" +// }, +// { +// "phone": "+201070076171", +// "name_arabic": "محمد اسلام محمود عبد العزيز المغربي" +// }, +// { +// "phone": "+201121833893", +// "name_arabic": "ايهاب حنفي محمود عوض الله" +// }, +// { +// "phone": "+201117530211", +// "name_arabic": "بيشوي سلامة عزب يواقيم" +// }, +// { +// "phone": "+201016894118", +// "name_arabic": "احمد محمود جعفر عبد الحميد" +// }, +// { +// "phone": "+201098164508", +// "name_arabic": "محمد روحي حسنين يوسف" +// }, +// { +// "phone": "+201101973640", +// "name_arabic": "احمد عبد النبي غريب على" +// }, +// { +// "phone": "+201093941168", +// "name_arabic": "محمد صبري أحمد السيد" +// }, +// { +// "phone": "+201092943747", +// "name_arabic": "علاء مصطفي طلبة محمد" +// }, +// { +// "phone": "+201156894666", +// "name_arabic": "حسام سيد احمد سيد أحمد" +// }, +// { +// "phone": "+201011111966", +// "name_arabic": "سيد محمد عبد العليم محمد محمود" +// }, +// { +// "phone": "+201126885214", +// "name_arabic": "عادل ايمن نديم عبداللطيف" +// }, +// { +// "phone": "+201099600846", +// "name_arabic": "هيثم حلمى عبد العزيز دراز" +// }, +// { +// "phone": "+201000292939", +// "name_arabic": "ماهر مثير نجيب عطا الله" +// }, +// { +// "phone": "+201125727514", +// "name_arabic": "محمود سالم زغلول شحات" +// }, +// { +// "phone": "+201006997521", +// "name_arabic": "عبد الله أحمد عبد الله محمد عبد الله" +// }, +// { +// "phone": "+201080068372", +// "name_arabic": "محمد احمد حمدى احمد" +// }, +// { +// "phone": "+201090744905", +// "name_arabic": "البير انسي عزت مجلع" +// }, +// { +// "phone": "+201096554355", +// "name_arabic": "صالح ياسين احمد عبد الحفيظ" +// }, +// { +// "phone": "+201200461351", +// "name_arabic": "حارس رزق طوسن ريحان" +// }, +// { +// "phone": "+201288446043", +// "name_arabic": "عبد اللطيف جابر محمد عبداللطيف" +// }, +// { +// "phone": "+201027775432", +// "name_arabic": "إسماعيل احمد ابوزيد الشربيني" +// }, +// { +// "phone": "+201280998383", +// "name_arabic": "يوسف ابراهيم عبد الرحمن على" +// }, +// { +// "phone": "+201284287773", +// "name_arabic": "احمد رافت علي حسانين" +// }, +// { +// "phone": "+201080827009", +// "name_arabic": "عمر إبراهيم عبد العزيز محمد" +// }, +// { +// "phone": "+201030530211", +// "name_arabic": "شريف محمد سالم حسن" +// }, +// { +// "phone": "+201024501874", +// "name_arabic": "ايهاب زوبيل فرج جرجس" +// }, +// { +// "phone": "+201148878574", +// "name_arabic": "خالد محمود حسين نصر" +// }, +// { +// "phone": "+201227022110", +// "name_arabic": "محمد حنفى محمود حنفي" +// }, +// { +// "phone": "+201274527249", +// "name_arabic": "هدى حسن انور حسن" +// }, +// { +// "phone": "+201004223526", +// "name_arabic": "رفيق محمد خطاب محمد" +// }, +// { +// "phone": "+201099849488", +// "name_arabic": "محمد شوقى ابراهيم محمد" +// }, +// { +// "phone": "+201064101887", +// "name_arabic": "عاطف فتحي سليمان السيد" +// }, +// { +// "phone": "+201149363795", +// "name_arabic": "ابراهيم طلبة ابراهيم طلبة" +// }, +// { +// "phone": "+201100721522", +// "name_arabic": "احمد نقراشي سالم تغيان" +// }, +// { +// "phone": "+201142394076", +// "name_arabic": "عبد الله حسين مصطفى حسن" +// }, +// { +// "phone": "+201111522040", +// "name_arabic": "ايمن اسعد مصطفى علي" +// }, +// { +// "phone": "+201224971527", +// "name_arabic": "سعيد عبد الحميد محمد عبد السلام" +// }, +// { +// "phone": "+201157711416", +// "name_arabic": "اسلام فريد احمد محمد محمود" +// }, +// { +// "phone": "+201017567245", +// "name_arabic": "احمد طه السيد على" +// }, +// { +// "phone": "+201012762323", +// "name_arabic": "محمد قناوي على محمود" +// }, +// { +// "phone": "+201278296955", +// "name_arabic": "فارس مهدي محمود شعبان السيد" +// }, +// { +// "phone": "+201063556251", +// "name_arabic": "محمد غريب أبوبكر محمد" +// }, +// { +// "phone": "+201122205620", +// "name_arabic": "وليد حميدة عبد الله عبد الحافظ" +// }, +// { +// "phone": "+201553771007", +// "name_arabic": "امير جودت زكي هارون" +// }, +// { +// "phone": "+201096808284", +// "name_arabic": "مصطفى حسانى جلال أحمد" +// }, +// { +// "phone": "+201140711745", +// "name_arabic": "مصطفي إبراهيم محمد عطية" +// }, +// { +// "phone": "+201154322032", +// "name_arabic": "مصطفى صالح احمد محمد" +// }, +// { +// "phone": "+201028197877", +// "name_arabic": "امير محمد ابراهيم على حسن" +// }, +// { +// "phone": "+201117391850", +// "name_arabic": "كريم ناصر عبد اللطيف عبد الونيس" +// }, +// { +// "phone": "+201096725050", +// "name_arabic": "سامح أحمد السيد الدياسطى" +// }, +// { +// "phone": "+201289679947", +// "name_arabic": "اندرو اسامه بهجت طوبيا" +// }, +// { +// "phone": "+201152154482", +// "name_arabic": "محمد خلاف خلف محمد" +// }, +// { +// "phone": "+201127615600", +// "name_arabic": "محمد مصطفى عبد السلام عبد المجيد" +// }, +// { +// "phone": "+201281802541", +// "name_arabic": "اسلام محمد رمضان السيد احمد" +// }, +// { +// "phone": "+201127100040", +// "name_arabic": "نادر محمد نبيل عبد الصبور" +// }, +// { +// "phone": "+201141411997", +// "name_arabic": "محمود محمد زايد مله" +// }, +// { +// "phone": "+201555604325", +// "name_arabic": "مينا نصيف اسحق متي" +// }, +// { +// "phone": "+201210867052", +// "name_arabic": "كيرلس عايد عزمي غريب" +// }, +// { +// "phone": "+201114176501", +// "name_arabic": "رمزى نبيل رمزى حليم" +// }, +// { +// "phone": "+201120461435", +// "name_arabic": "محمد عزمي عبد الله عبد الله" +// }, +// { +// "phone": "+201009939077", +// "name_arabic": "المعتصم بالله ابراهيم على مجاهد مقلد" +// }, +// { +// "phone": "+201222984513", +// "name_arabic": "السيد علي عبد الدايم علي سعيد" +// }, +// { +// "phone": "+201551465551", +// "name_arabic": "سامح لمعي عزمي رزق" +// }, +// { +// "phone": "+201210769276", +// "name_arabic": "احمد مجدي عدلي عبد القادر" +// }, +// { +// "phone": "+201022276543", +// "name_arabic": "محمد أحمد فؤاد محمد" +// }, +// { +// "phone": "+201286530967", +// "name_arabic": "كريم زكريا عبده عبدالعظيم حسنين" +// }, +// { +// "phone": "+201153260339", +// "name_arabic": "رامي عاطف عبد النبي سيد" +// }, +// { +// "phone": "+201006336012", +// "name_arabic": "محمد جاب الله محمد السعيد" +// }, +// { +// "phone": "+201207433351", +// "name_arabic": "اسلام سمير علي السيد حجازي" +// }, +// { +// "phone": "+201200360155", +// "name_arabic": "إسلام شعبان عبد السلام أبو زيد" +// }, +// { +// "phone": "+201009171151", +// "name_arabic": "محمد عبد الله سلطان عبد الله محمد" +// }, +// { +// "phone": "+201152805518", +// "name_arabic": "اسلام ربيع على صميدة" +// }, +// { +// "phone": "+201006444887", +// "name_arabic": "حسام الدين مصطفى محمد راضى" +// }, +// { +// "phone": "+201227715194", +// "name_arabic": "مايكل فاروق فتحي حنا" +// }, +// { +// "phone": "+201022881509", +// "name_arabic": "اكرامى صابر مكاوي مرشد" +// }, +// { +// "phone": "+201144318152", +// "name_arabic": "جيهان منصور توفيق منصور" +// }, +// { +// "phone": "+201552628730", +// "name_arabic": "محمد محمد امين احمد" +// }, +// { +// "phone": "+201211149220", +// "name_arabic": "محمود احمد محمد شعيب" +// }, +// { +// "phone": "+201120272207", +// "name_arabic": "محمد عبد الرحيم قابيل ابراهيم" +// }, +// { +// "phone": "+201223531523", +// "name_arabic": "محمد منير رياض عبد القادر يوسف" +// }, +// { +// "phone": "+201065705883", +// "name_arabic": "عبد الرحمن طه عبد الله عيد" +// }, +// { +// "phone": "+201061601452", +// "name_arabic": "حمدي عبد الرازق عبد الله رشوان" +// }, +// { +// "phone": "+201069766969", +// "name_arabic": "محمد حمادة عبدة زاهر" +// }, +// { +// "phone": "+201063097870", +// "name_arabic": "محمد صلاح عثمان احمد" +// }, +// { +// "phone": "+201221732389", +// "name_arabic": "جمال إبراهيم تادرس إبراهيم" +// }, +// { +// "phone": "+201153053557", +// "name_arabic": "عمر عصمت حامد لخروج" +// }, +// { +// "phone": "+201143472366", +// "name_arabic": "عبد العليم صالح على عبد الغنى" +// }, +// { +// "phone": "+201007091168", +// "name_arabic": "توفيق عبدالله محمد عويضة" +// }, +// { +// "phone": "+201210209891", +// "name_arabic": "احمد على خليل نصار" +// }, +// { +// "phone": "+201013499610", +// "name_arabic": "هيثم ابراهيم امام ابراهيم" +// }, +// { +// "phone": "+201004519539", +// "name_arabic": "عاطف عادل عطيه مرسي" +// }, +// { +// "phone": "+201119373682", +// "name_arabic": "محمود طارق هلال سيد فرغلى" +// }, +// { +// "phone": "+201015817826", +// "name_arabic": "سيف وحيد عاطف عبد المحسن" +// }, +// { +// "phone": "+201282587487", +// "name_arabic": "احمد طة حمدي محمد الأسيوطي" +// }, +// { +// "phone": "+201224893105", +// "name_arabic": "هيثم احمد حسن اسماعيل" +// }, +// { +// "phone": "+201094359063", +// "name_arabic": "احمد السيد فتحي السيد" +// }, +// { +// "phone": "+201067154712", +// "name_arabic": "عبد النبي عبد العظيم عواد مرسى" +// }, +// { +// "phone": "+201121880293", +// "name_arabic": "محمود محمد سعد العزب ربيع" +// }, +// { +// "phone": "+201227422330", +// "name_arabic": "أسامة إبراهيم عبد العزيز علي العجواني" +// }, +// { +// "phone": "+201099907868", +// "name_arabic": "اشرف محمد حسن محمد البرهمتوشي" +// }, +// { +// "phone": "+201116540771", +// "name_arabic": "احمد شعبان محمد محمد" +// }, +// { +// "phone": "+201006886819", +// "name_arabic": "محمد زين العابدين غوص أحمد" +// }, +// { +// "phone": "+201060896771", +// "name_arabic": "محمد صلاح أحمد متولى" +// }, +// { +// "phone": "+201557218625", +// "name_arabic": "سيد عبد الله سيد علي أبو النجا" +// }, +// { +// "phone": "+201151717453", +// "name_arabic": "مصطفى على فاروق ابراهيم" +// }, +// { +// "phone": "+201203477332", +// "name_arabic": "ايهاب سمير منسى ناشد" +// }, +// { +// "phone": "+201021195474", +// "name_arabic": "احمد مصطفى ابراهيم محمد روز" +// }, +// { +// "phone": "+201095650585", +// "name_arabic": "طارق محمود عبده محمد" +// }, +// { +// "phone": "+201113822269", +// "name_arabic": "محمد عبد المنعم عوض محمد" +// }, +// { +// "phone": "+201140025980", +// "name_arabic": "أحمد فوزي مسعد محمد الغرباوي" +// }, +// { +// "phone": "+201007420153", +// "name_arabic": "هيثم صابر امام سليمان" +// }, +// { +// "phone": "+201111098024", +// "name_arabic": "أسامة اسماعيل عبد النعيم عرابي" +// }, +// { +// "phone": "+201281571325", +// "name_arabic": "أحمد رجب محمود عبد المقصود" +// }, +// { +// "phone": "+201029490720", +// "name_arabic": "ايمن سعيد أحمد حسن أبو عبيد" +// }, +// { +// "phone": "+201200757011", +// "name_arabic": "اسلام حمدي محمد محمد الفلاحجي" +// }, +// { +// "phone": "+201501877880", +// "name_arabic": "كريم مجاهد عبد الله النجار" +// }, +// { +// "phone": "+201142097547", +// "name_arabic": "احمد فؤاد فتحى عطية" +// }, +// { +// "phone": "+201120086686", +// "name_arabic": "احمد محمد عجمى الجندى" +// }, +// { +// "phone": "+201002395014", +// "name_arabic": "محمود مفرح فتحي محمد" +// }, +// { +// "phone": "+201277715132", +// "name_arabic": "احمد سعيد محمود مسعود دسوقى" +// }, +// { +// "phone": "+201210657201", +// "name_arabic": "محمد هانى على على الوكيل" +// }, +// { +// "phone": "+201272201022", +// "name_arabic": "صلاح عزت احمد ابراهيم" +// }, +// { +// "phone": "+201014786553", +// "name_arabic": "رامى فوزى اسماعيل محمد عيسى حجاب" +// }, +// { +// "phone": "+201003587857", +// "name_arabic": "اسلام محمد منصور الجوهري" +// }, +// { +// "phone": "+201155540425", +// "name_arabic": "محسن صبحي عبدالكريم" +// }, +// { +// "phone": "+201225268128", +// "name_arabic": "جابر أحمد محمد احمد" +// }, +// { +// "phone": "+201028313498", +// "name_arabic": "رشا على عبد العزيز على" +// }, +// { +// "phone": "+201121904651", +// "name_arabic": "عبود رمضان محمد عبد المجيد" +// }, +// { +// "phone": "+201094218504", +// "name_arabic": "محمد حامد خالد احمد عبد الرازق" +// }, +// { +// "phone": "+201092398641", +// "name_arabic": "سامح عزيز عزيز ابراهيم" +// }, +// { +// "phone": "+201069800937", +// "name_arabic": "عبد العظيم يوسف صالح" +// }, +// { +// "phone": "+201069834406", +// "name_arabic": "سعيد عبده خليل عدوي شعبان" +// }, +// { +// "phone": "+201099530964", +// "name_arabic": "شعبان احمد رمضان موسى" +// }, +// { +// "phone": "+201150451768", +// "name_arabic": "احمد محمد فرج محمد" +// }, +// { +// "phone": "+201141473992", +// "name_arabic": "ربيع عبد الواحد محمد يوسف" +// }, +// { +// "phone": "+201080688081", +// "name_arabic": "عمرو مصطفى محمد محمود" +// }, +// { +// "phone": "+201093093850", +// "name_arabic": "رحاب لطفى عبد الجليل شهوان" +// }, +// { +// "phone": "+201114599930", +// "name_arabic": "عمرو رفعت مدبولى محمود" +// }, +// { +// "phone": "+201224062776", +// "name_arabic": "مينا نعيم ميخائيل عبد الله" +// }, +// { +// "phone": "+201020555412", +// "name_arabic": "احمد جابر إبراهيم سالم على" +// }, +// { +// "phone": "+201002350327", +// "name_arabic": "احمد محمود محمد محمود" +// }, +// { +// "phone": "+201007210871", +// "name_arabic": "محمد مجدي أحمد المعي قمصان" +// }, +// { +// "phone": "+201274049308", +// "name_arabic": "ابراهيم زيدان زيدان شحاته" +// }, +// { +// "phone": "+201061037980", +// "name_arabic": "أحمد سيد حسن محمد" +// }, +// { +// "phone": "+201124585917", +// "name_arabic": "سلامه جميل ابراهيم خله" +// }, +// { +// "phone": "+201112420773", +// "name_arabic": "محمد مجدي رجب عبد الهادي" +// }, +// { +// "phone": "+201028564875", +// "name_arabic": "رضا عبد الفتاح إبراهيم مطيط" +// }, +// { +// "phone": "+201141679102", +// "name_arabic": "محمد جابر سنوسي محمد" +// }, +// { +// "phone": "+201021222549", +// "name_arabic": "سارة علي عبد الفتاح العطار" +// }, +// { +// "phone": "+201007846256", +// "name_arabic": "محمد عبدربة فرغلي علي" +// }, +// { +// "phone": "+201151602974", +// "name_arabic": "اسلام عادل محمد السيد عمر" +// }, +// { +// "phone": "+201100038956", +// "name_arabic": "‏هاني رزق" +// }, +// { +// "phone": "+201112219394", +// "name_arabic": "محمد عبد الغنى احمد عمر" +// }, +// { +// "phone": "+201110668338", +// "name_arabic": "محمد مصطفى عبد الغنى محمود" +// }, +// { +// "phone": "+201142616812", +// "name_arabic": "نصر امين السيد السيد نصر" +// }, +// { +// "phone": "+201121738060", +// "name_arabic": "محمد فيصل على محمد" +// }, +// { +// "phone": "+201555116452", +// "name_arabic": "محمود فرج رمضان السيد" +// }, +// { +// "phone": "+201501448911", +// "name_arabic": "ريمون سلامه جميل سلامه" +// }, +// { +// "phone": "+201096567961", +// "name_arabic": "كريم خميس عبد الواحد بيومى فوده" +// }, +// { +// "phone": "+201122277009", +// "name_arabic": "أحمد يونس عرفه عجمى" +// }, +// { +// "phone": "+201018139387", +// "name_arabic": "احمد حماده محمد عبد القادر" +// }, +// { +// "phone": "+201060963493", +// "name_arabic": "حسين اشرف حسين علي" +// }, +// { +// "phone": "+201033360285", +// "name_arabic": "احمد عاطف مصطفى عبد السلام" +// }, +// { +// "phone": "+201142466712", +// "name_arabic": "حسن صلاح ندا محمد" +// }, +// { +// "phone": "+201558550454", +// "name_arabic": "محمد رضوان احمد عياد" +// }, +// { +// "phone": "+201020096023", +// "name_arabic": "سمير اشرف حسني عبد الله اليومي" +// }, +// { +// "phone": "+201050916243", +// "name_arabic": "عبد الرحمن عبد القادر فاروق محمد" +// }, +// { +// "phone": "+201001417647", +// "name_arabic": "توفيق أحمد عبدالله المهدى" +// }, +// { +// "phone": "+201040432228", +// "name_arabic": "رامي فرجاني عبد العاطي عبد الجليل" +// }, +// { +// "phone": "+201118141853", +// "name_arabic": "محمد حسين حسين على ابراهيم" +// }, +// { +// "phone": "+201096413346", +// "name_arabic": "عبد الله ناصر أحمد عيسى" +// }, +// { +// "phone": "+201123954144", +// "name_arabic": "مصطفى هشام مصطفى اسماعيل" +// }, +// { +// "phone": "+201125895917", +// "name_arabic": "فاطمه طه محمود عبد الجواد" +// }, +// { +// "phone": "+201142047033", +// "name_arabic": "حمدي محمد عبد الحفيظ على" +// }, +// { +// "phone": "+201148460674", +// "name_arabic": "أحمد جمال الدين أحمد علي" +// }, +// { +// "phone": "+201210348179", +// "name_arabic": "أحمد محمد محمود ابراهيم مرسى الشرقاوى" +// }, +// { +// "phone": "+201226757626", +// "name_arabic": "احمد شاهين شاهين عبد العال" +// }, +// { +// "phone": "+201208170707", +// "name_arabic": "أحمد مصطفى محمد أحمد" +// }, +// { +// "phone": "+201144002225", +// "name_arabic": "ايمان ياسر يحيي حامد" +// }, +// { +// "phone": "+201096776146", +// "name_arabic": "علي رضا السعيد محمد" +// }, +// { +// "phone": "+201115553247", +// "name_arabic": "محمد حسام الدين سلامة القاضي" +// }, +// { +// "phone": "+201008529970", +// "name_arabic": "وحيد عبد المجلي فضل يونس" +// }, +// { +// "phone": "+201067611319", +// "name_arabic": "منال سيد يونس ضحاوي" +// }, +// { +// "phone": "+201220247711", +// "name_arabic": "ايهاب احمد محمود صفوت" +// }, +// { +// "phone": "+201011522816", +// "name_arabic": "عبد الله عدلي السيد اليمني" +// }, +// { +// "phone": "+201030228671", +// "name_arabic": "عبد المقصود عبده عبد المقصود محمد محمد عبدالله" +// }, +// { +// "phone": "+201151510446", +// "name_arabic": "خالد محمود السيد خالد" +// }, +// { +// "phone": "+201222895562", +// "name_arabic": "عز الدين محمود إبراهيم مصطفى خليل" +// }, +// { +// "phone": "+201063033980", +// "name_arabic": "محمد أحمد رمزي عبد الصمد" +// }, +// { +// "phone": "+201004298586", +// "name_arabic": "اسماعيل عبد الفتاح خليل مرسى" +// }, +// { +// "phone": "+201553996793", +// "name_arabic": "محمد ابراهيم محمد ابراهيم" +// }, +// { +// "phone": "+201118653148", +// "name_arabic": "سامح محمد السماحي ابراهيم" +// }, +// { +// "phone": "+201015654885", +// "name_arabic": "مينا فاروق أمين رزق حنين" +// }, +// { +// "phone": "+201276624302", +// "name_arabic": "إبراهيم بخاطرة ابراهيم" +// }, +// { +// "phone": "+201271446743", +// "name_arabic": "محمد جمال انور حامد" +// }, +// { +// "phone": "+201116520813", +// "name_arabic": "صبري عبد الكريم احمد محمد" +// }, +// { +// "phone": "+201115725420", +// "name_arabic": "عزت فؤاد عزت فؤاد" +// }, +// { +// "phone": "+201026798518", +// "name_arabic": "ايمن شمال محمد حسن" +// }, +// { +// "phone": "+201100245413", +// "name_arabic": "محمود مدحت محمود زكى" +// }, +// { +// "phone": "+201224752065", +// "name_arabic": "أشرف عويس جمعة اسماعيل حموده" +// }, +// { +// "phone": "+201116310801", +// "name_arabic": "وليد محمود عبد المنعم فرج" +// }, +// { +// "phone": "+201015451939", +// "name_arabic": "محمود الصاوي عبد الحميد الصاوي" +// }, +// { +// "phone": "+201017597572", +// "name_arabic": "عماد الدين حامد محمد القط" +// }, +// { +// "phone": "+201093165906", +// "name_arabic": "هاله هلال الدين أبو زيد تهامي احمد" +// }, +// { +// "phone": "+201203153575", +// "name_arabic": "حسن طارق عبد السلام عبد السلام عبد العال" +// }, +// { +// "phone": "+201158232008", +// "name_arabic": "خالد محمود عبد الحليم عبدالعظيم" +// }, +// { +// "phone": "+201019502290", +// "name_arabic": "عمرو شوقي ابراهيم محمد" +// }, +// { +// "phone": "+201222254985", +// "name_arabic": "نادر اشرف حسينى مصطفى السيد" +// }, +// { +// "phone": "+201222282205", +// "name_arabic": "إسماعيل احمد ابراهيم العدوى" +// }, +// { +// "phone": "+201143841077", +// "name_arabic": "يوسف عمر رمضان صادق" +// }, +// { +// "phone": "+201154399225", +// "name_arabic": "ابراهيم خالد ابراهيم شاكر ابراهيم" +// }, +// { +// "phone": "+201271140090", +// "name_arabic": "إسلام سعد محمد السيد الصعيدي" +// }, +// { +// "phone": "+201201421326", +// "name_arabic": "عمرو محمد علي أبو اليسر" +// }, +// { +// "phone": "+201141573088", +// "name_arabic": "أيمن محمد محمود سيد" +// }, +// { +// "phone": "+201006944151", +// "name_arabic": "فادي نبيل حلقة بسالي" +// }, +// { +// "phone": "+201279889888", +// "name_arabic": "أحمد عطية محمد عطية السيد" +// }, +// { +// "phone": "+201006098594", +// "name_arabic": "علي أحمد على همام" +// }, +// { +// "phone": "+201110261057", +// "name_arabic": "مصطفى سعيد عبد العظيم شريف" +// }, +// { +// "phone": "+201000249183", +// "name_arabic": "محمد رمضان محمد المراكبى" +// }, +// { +// "phone": "+201023835318", +// "name_arabic": "عماد حسن سعد زيتون" +// }, +// { +// "phone": "+201287942525", +// "name_arabic": "مؤمن حامد محمد حامد محمود" +// }, +// { +// "phone": "+201124186891", +// "name_arabic": "عبد الفتاح صابر عبد الفتاح حسن" +// }, +// { +// "phone": "+201554171126", +// "name_arabic": "وليد جمال ميشيل زكى" +// }, +// { +// "phone": "+201120053453", +// "name_arabic": "محمد قاسم محمود عبد الرحمن" +// }, +// { +// "phone": "+201061107697", +// "name_arabic": "طاهر محمد سعد حامد" +// }, +// { +// "phone": "+201067588679", +// "name_arabic": "محمد جمعه بركات محمد" +// }, +// { +// "phone": "+201004708698", +// "name_arabic": "محمود محمود محمدين السقا" +// }, +// { +// "phone": "+201001760574", +// "name_arabic": "حسنى عبده محمد السيد" +// }, +// { +// "phone": "+201098323582", +// "name_arabic": "عمر رضا السيد ابو الغيط عليوه" +// }, +// { +// "phone": "+201061275280", +// "name_arabic": "فادي نادر ناشد تاوضروس" +// }, +// { +// "phone": "+201027234885", +// "name_arabic": "محمد محمد انور طلبة" +// }, +// { +// "phone": "+201283991212", +// "name_arabic": "محمود ابراهيم محمود زين الدين" +// }, +// { +// "phone": "+201060426901", +// "name_arabic": "محمد خالد فرج محمد" +// }, +// { +// "phone": "+201010107223", +// "name_arabic": "إسماعيل محمد سمير اسماعيل يوسف" +// }, +// { +// "phone": "+201286626769", +// "name_arabic": "محمود على حسن العريني" +// }, +// { +// "phone": "+201102254432", +// "name_arabic": "أيمن محمد عوض الله عبد الله" +// }, +// { +// "phone": "+201141648870", +// "name_arabic": "عمرو على طه بسطاوى" +// }, +// { +// "phone": "+201284874348", +// "name_arabic": "احمد شوقى أحمد السيد حسن" +// }, +// { +// "phone": "+201003519354", +// "name_arabic": "محمد علي عبد الكريم محمود" +// }, +// { +// "phone": "+201027955106", +// "name_arabic": "مينا مكرم نعيم عبد الله" +// }, +// { +// "phone": "+201005004603", +// "name_arabic": "الهام عبد العظيم عبداللطيف أحمد" +// }, +// { +// "phone": "+201024391108", +// "name_arabic": "محمد ادهم محمد فرج" +// }, +// { +// "phone": "+201068283392", +// "name_arabic": "محمد صبحي عباس عليّ السيد" +// }, +// { +// "phone": "+201006421089", +// "name_arabic": "عبد الحكيم محمد عبد الحكيم على" +// }, +// { +// "phone": "+201155883321", +// "name_arabic": "محمد عبد الله أحمد بهاء الدين حبيب اسحق ابراهيم" +// }, +// { +// "phone": "+201001456101", +// "name_arabic": "نهي فؤاد عبد الواحد الخولي" +// }, +// { +// "phone": "+201228922343", +// "name_arabic": "محمد سعيد حامد محمد احمد" +// }, +// { +// "phone": "+201006188165", +// "name_arabic": "حمدى أحمد مبارك فضل السيد" +// }, +// { +// "phone": "+201116669877", +// "name_arabic": "نرمين سمير مصطفى حلمي محمد" +// }, +// { +// "phone": "+201102192489", +// "name_arabic": "محمد سيد حفظى سيد" +// }, +// { +// "phone": "+201099196874", +// "name_arabic": "جمال السيد عبد الرحمن السعدنى" +// }, +// { +// "phone": "+201006261655", +// "name_arabic": "مصطفي سالم بسيوني الشامخ صالح" +// }, +// { +// "phone": "+201555832239", +// "name_arabic": "محمد حسين علي محمد" +// }, +// { +// "phone": "+201124071718", +// "name_arabic": "رانيا نبيل محمد عبد اللطيف" +// }, +// { +// "phone": "+201004378446", +// "name_arabic": "محمود محمد حسنى حسن" +// }, +// { +// "phone": "+201010376273", +// "name_arabic": "ادهم حسن عبد الحميد حلمى" +// }, +// { +// "phone": "+201009109002", +// "name_arabic": "كريم حسين كامل جبريل" +// }, +// { +// "phone": "+201060964493", +// "name_arabic": "مصطفي عبدالعزيز محمد محمد عماره" +// }, +// { +// "phone": "+201097919136", +// "name_arabic": "سيد أحمد محمد أحمد" +// }, +// { +// "phone": "+201556568581", +// "name_arabic": "مصطفى وجدى محمد على" +// }, +// { +// "phone": "+201032197354", +// "name_arabic": "احمد ابراهيم كمال إبراهيم" +// }, +// { +// "phone": "+201157477826", +// "name_arabic": "محمد سيد ابراهيم خليل" +// }, +// { +// "phone": "+201277014277", +// "name_arabic": "محمد أحمد محمد احمد بخيت" +// }, +// { +// "phone": "+201225015388", +// "name_arabic": "محمد حسن احمد عبد المولى" +// }, +// { +// "phone": "+201022199054", +// "name_arabic": "ياسين مصطفى عبد النبى أبو اليزيد" +// }, +// { +// "phone": "+201100040727", +// "name_arabic": "محمود سامى حسن فكرى" +// }, +// { +// "phone": "+201144489437", +// "name_arabic": "خالد سمير محمود حسن خميس" +// }, +// { +// "phone": "+201117265855", +// "name_arabic": "محمد عبد الفتاح حسن المصيلحى" +// }, +// { +// "phone": "+201029116604", +// "name_arabic": "أحمد محمد الامام حسن شحاتة" +// }, +// { +// "phone": "+201008572804", +// "name_arabic": "محمد احمد سيد محمد السمنودى" +// }, +// { +// "phone": "+201002947315", +// "name_arabic": "ايناس على فتح الله على" +// }, +// { +// "phone": "+201029026924", +// "name_arabic": "بهاء الدين احمد عبد الوهاب الشاعر" +// }, +// { +// "phone": "+201276811107", +// "name_arabic": "محمود محمد حسن محمود" +// }, +// { +// "phone": "+201025767385", +// "name_arabic": "حسام حسن الشرنوبى حسن الفيومي" +// }, +// { +// "phone": "+201004770495", +// "name_arabic": "مصطفى خلدل راغب عام" +// }, +// { +// "phone": "+201024470224", +// "name_arabic": "سعيد عبداللطيف خليفة محمد عامر" +// }, +// { +// "phone": "+201100915665", +// "name_arabic": "كرم محمد محمود مصطفي محارم" +// }, +// { +// "phone": "+201289920270", +// "name_arabic": "وائل محمد محمد عبد المنعم" +// }, +// { +// "phone": "+201006841969", +// "name_arabic": "سعد فرحات منوفي عبد الباري" +// }, +// { +// "phone": "+201012997841", +// "name_arabic": "احمد محمد سليمان على" +// }, +// { +// "phone": "+201121115920", +// "name_arabic": "محمد سعيد علي الطنطاوي السبع" +// }, +// { +// "phone": "+201125308780", +// "name_arabic": "سيد ابو العلا سيد ابراهيم" +// }, +// { +// "phone": "+201100111238", +// "name_arabic": "حاتم عبد الرحمن ابراهيم عبد الرحمن" +// }, +// { +// "phone": "+201028387935", +// "name_arabic": "مصطفى سليمان فتحى عبده خليفه" +// }, +// { +// "phone": "+201080931721", +// "name_arabic": "بسام حماد عيد حماد" +// }, +// { +// "phone": "+201146406175", +// "name_arabic": "محمد حامد محمود فرح" +// }, +// { +// "phone": "+201003322933", +// "name_arabic": "ايهاب عادل عبد المنعم مصطفي" +// }, +// { +// "phone": "+201158937603", +// "name_arabic": "عبد الرحمن خالد رضوان عبد الله" +// }, +// { +// "phone": "+201013331683", +// "name_arabic": "احمد سمير نبية عبد المعطي عشوش" +// }, +// { +// "phone": "+201200070349", +// "name_arabic": "شريف محمد سيد حنفي" +// }, +// { +// "phone": "+201009190006", +// "name_arabic": "مهند مصطفى عبد السلام منصور" +// }, +// { +// "phone": "+201101128601", +// "name_arabic": "محمد سلامه عبد العليم حسان" +// }, +// { +// "phone": "+201144413764", +// "name_arabic": "محمد ابراهيم محمد ابو الوفا" +// }, +// { +// "phone": "+201226965492", +// "name_arabic": "حسن محمد عبد الرحمن عثمان" +// }, +// { +// "phone": "+201000824456", +// "name_arabic": "شفيق شفيق محمد عمر" +// }, +// { +// "phone": "+201123340007", +// "name_arabic": "مصطفى كمال رياض حسين" +// }, +// { +// "phone": "+201228048535", +// "name_arabic": "على عبد الحميد انور علي الغرباوي" +// }, +// { +// "phone": "+201004413106", +// "name_arabic": "ايمن رحيم عبد السميع رحيم" +// }, +// { +// "phone": "+201100622330", +// "name_arabic": "محمود ابراهيم ابراهيم محمود" +// }, +// { +// "phone": "+201207556911", +// "name_arabic": "علي عبد السلام محمود ابراهيم" +// }, +// { +// "phone": "+201030367702", +// "name_arabic": "‏كرم أنور فؤاد طه" +// }, +// { +// "phone": "+201144389134", +// "name_arabic": "اسلام محمد فكرى محمد" +// }, +// { +// "phone": "+201277314824", +// "name_arabic": "رمضان محمود فيصل مرسى" +// }, +// { +// "phone": "+201122922382", +// "name_arabic": "مختار علاء الدين محمود عبدة" +// }, +// { +// "phone": "+201143320232", +// "name_arabic": "محمد حسين على حسين" +// }, +// { +// "phone": "+201122848331", +// "name_arabic": "محمود السيد محمد محمد" +// }, +// { +// "phone": "+201094147788", +// "name_arabic": "محمد إبراهيم سعد الدين إبراهيم" +// }, +// { +// "phone": "+201112861834", +// "name_arabic": "أحمد على أحمد عبد العال" +// }, +// { +// "phone": "+201067791624", +// "name_arabic": "أميز عاطف جميل سليمان" +// }, +// { +// "phone": "+201006576933", +// "name_arabic": "محمود على محمد عبد العزيز أبوشنب" +// }, +// { +// "phone": "+201207765312", +// "name_arabic": "محمود عيد الضبع محمد خليفه" +// }, +// { +// "phone": "+201224670585", +// "name_arabic": "سامح احمد محمد محمد القصاص" +// }, +// { +// "phone": "+201002559121", +// "name_arabic": "طه مراد طه عبد الرحيم جابر" +// }, +// { +// "phone": "+201030039804", +// "name_arabic": "سامح عاشور عبد الغنى الكرساوى" +// }, +// { +// "phone": "+201119800220", +// "name_arabic": "شريف محمد سيد الشريف" +// }, +// { +// "phone": "+201224483706", +// "name_arabic": "ابراهيم حسن ابراهيم حسن" +// }, +// { +// "phone": "+201113310500", +// "name_arabic": "اشرف فؤاد نور الدين علي" +// }, +// { +// "phone": "+201030673685", +// "name_arabic": "سامي عاطف علي السيد" +// }, +// { +// "phone": "+201010366656", +// "name_arabic": "محمد صديق سيد احمد" +// }, +// { +// "phone": "+201128642221", +// "name_arabic": "محمد محمد يوسف عبد القوي عفيفي" +// }, +// { +// "phone": "+201020184220", +// "name_arabic": "رحيم فارس سليم منصور" +// }, +// { +// "phone": "+201060577208", +// "name_arabic": "عصام الدين حسين محمد عمار" +// }, +// { +// "phone": "+201006110222", +// "name_arabic": "عام عمر أحمد محمد" +// }, +// { +// "phone": "+201094121065", +// "name_arabic": "محمد عبد الظاهر محمد محمود" +// }, +// { +// "phone": "+201024750703", +// "name_arabic": "فاطمة محمد شاكر حسن" +// }, +// { +// "phone": "+201012815697", +// "name_arabic": "محمود أحمد يوسف أحمد" +// }, +// { +// "phone": "+201211066299", +// "name_arabic": "ممدوح محمود عبد الرحيم سلام" +// }, +// { +// "phone": "+201284524539", +// "name_arabic": "عبد الفتاح فتح الله محمد احمد" +// }, +// { +// "phone": "+201009225265", +// "name_arabic": "الفت ابراهيم علي اسماعيل غين" +// }, +// { +// "phone": "+201063178163", +// "name_arabic": "محمد فاضل عبد المقصود محمود" +// }, +// { +// "phone": "+201020007540", +// "name_arabic": "عبد الرازق مهدي علواني هندي" +// }, +// { +// "phone": "+201148163794", +// "name_arabic": "محمد عبد الحميد مصطفى عبد الحميد" +// }, +// { +// "phone": "+201151458889", +// "name_arabic": "لمياء سيد محمد السيد" +// }, +// { +// "phone": "+201112022291", +// "name_arabic": "انسي اسحق سعد مسيحة" +// }, +// { +// "phone": "+201118002160", +// "name_arabic": "ايمن السعيد مصطفى الشال" +// }, +// { +// "phone": "+201011646101", +// "name_arabic": "عبدالرحمن علاء الدين مبارك على" +// }, +// { +// "phone": "+201144038991", +// "name_arabic": "خالد عبد العزيز على دقماق" +// }, +// { +// "phone": "+201157364788", +// "name_arabic": "انور اسماعيل توني عبد الظاهر" +// }, +// { +// "phone": "+201153754807", +// "name_arabic": "يحيي العربي محمد فهمي محمد" +// }, +// { +// "phone": "+201013135258", +// "name_arabic": "فتحي فتحي عبد المنعم راشد" +// }, +// { +// "phone": "+201114776641", +// "name_arabic": "ولاء عبد الحميد عاطف أحمد" +// }, +// { +// "phone": "+201551980169", +// "name_arabic": "وائل كامل محمود اسماعيل" +// }, +// { +// "phone": "+201113594364", +// "name_arabic": "علاء حسني محمود زايد" +// }, +// { +// "phone": "+201099336257", +// "name_arabic": "احمد محمد محمود عيد موسي" +// }, +// { +// "phone": "+201027576077", +// "name_arabic": "محمد خالد عبد النافع عكاشه" +// }, +// { +// "phone": "+201152636067", +// "name_arabic": "خالد أحمد رضا محمود بدير" +// }, +// { +// "phone": "+201111528707", +// "name_arabic": "بدري عباس الصغير رشوان" +// }, +// { +// "phone": "+201030835725", +// "name_arabic": "احمد سعيد جابر عرفه" +// }, +// { +// "phone": "+201080128246", +// "name_arabic": "مؤمن خلف على محمد" +// }, +// { +// "phone": "+201068923705", +// "name_arabic": "هاني مصطفي محمود عبد الله" +// }, +// { +// "phone": "+201270565699", +// "name_arabic": "خالد عبد الناصر عطيه صالح" +// }, +// { +// "phone": "+201127505819", +// "name_arabic": "رامى كمال عبد العظيم عبد المولى" +// }, +// { +// "phone": "+201113001950", +// "name_arabic": "أحمد نعيم محمد احمد" +// }, +// { +// "phone": "+201201081113", +// "name_arabic": "أيمن محروس عربي النجار" +// }, +// { +// "phone": "+201091776279", +// "name_arabic": "محمد ناجي محمد عبد الحميد" +// }, +// { +// "phone": "+201014626816", +// "name_arabic": "خالد خليل ابراهيم خليل" +// }, +// { +// "phone": "+201123850040", +// "name_arabic": "خالد عبد العزيز الحسيني محمود" +// }, +// { +// "phone": "+201278539943", +// "name_arabic": "خالد فؤاد محمد سالم" +// }, +// { +// "phone": "+201003284035", +// "name_arabic": "الحسين أحمد السيد احمد" +// }, +// { +// "phone": "+201030812036", +// "name_arabic": "محمد يوسف علي حسن عبد الله" +// }, +// { +// "phone": "+201070641133", +// "name_arabic": "ياسين ياسر محمد ياسين" +// }, +// { +// "phone": "+201220444133", +// "name_arabic": "سمير هاشم كامل حسن" +// }, +// { +// "phone": "+201142001090", +// "name_arabic": "محمد محمود احمد محمود" +// }, +// { +// "phone": "+201274842863", +// "name_arabic": "أحمد فكري زكريا عوض" +// }, +// { +// "phone": "+201124525303", +// "name_arabic": "محمد محمود محمد أبو السعود" +// }, +// { +// "phone": "+201280024389", +// "name_arabic": "محمود محمد ابراهيم محمد عمر حسن" +// }, +// { +// "phone": "+201004625077", +// "name_arabic": "محمد ممدوح رمضان أبو العلا" +// }, +// { +// "phone": "+201097484858", +// "name_arabic": "رضوان فتحي عبد الله ابراهيم" +// }, +// { +// "phone": "+201110016110", +// "name_arabic": "شريف أحمد محمد أحمد ظة" +// }, +// { +// "phone": "+201113659203", +// "name_arabic": "محمود محمد طه محمد عيسى" +// }, +// { +// "phone": "+201150300052", +// "name_arabic": "محمد سعيد عبدالحليم محمد" +// }, +// { +// "phone": "+201273990501", +// "name_arabic": "مينا نجيب خليل اسحق" +// }, +// { +// "phone": "+201144564771", +// "name_arabic": "عبد الرحمن على أحمد عامر" +// }, +// { +// "phone": "+201013828860", +// "name_arabic": "هشام محمد حسن عبد الكريم" +// }, +// { +// "phone": "+201002651444", +// "name_arabic": "تامر سيد محمود محمد" +// }, +// { +// "phone": "+201125528693", +// "name_arabic": "مصطفي محمد علي السيد بدوي" +// }, +// { +// "phone": "+201227555180", +// "name_arabic": "مؤمن سعيد محمد على" +// }, +// { +// "phone": "+201122002312", +// "name_arabic": "محمد اسماعيل عبد الشافى محمود" +// }, +// { +// "phone": "+201282150645", +// "name_arabic": "رومانى رزق بندى عبد الملاك" +// }, +// { +// "phone": "+201015776276", +// "name_arabic": "عبد الحميد السيد ابراهيم محمد" +// }, +// { +// "phone": "+201070839293", +// "name_arabic": "محمود ابراهيم محمود خضر" +// }, +// { +// "phone": "+201026300904", +// "name_arabic": "أحمد سيد محمد سيد" +// }, +// { +// "phone": "+201008018110", +// "name_arabic": "كريم محمد محمد على" +// }, +// { +// "phone": "+201001216083", +// "name_arabic": "ابو العلا جمال ابو العلا حسن" +// }, +// { +// "phone": "+201000488406", +// "name_arabic": "حسام عادل سيد علي" +// }, +// { +// "phone": "+201115185805", +// "name_arabic": "علاء علي عبد الله عطية" +// }, +// { +// "phone": "+201000596889", +// "name_arabic": "محمود يونس محمود عبد الحليم" +// }, +// { +// "phone": "+201158313756", +// "name_arabic": "رامي محروس زكي مسلم" +// }, +// { +// "phone": "+201158529880", +// "name_arabic": "عبد المؤمن رضا عبد المؤمن محمود الليثي" +// }, +// { +// "phone": "+201129777538", +// "name_arabic": "لؤى مدحت عبد المنعم محمد" +// }, +// { +// "phone": "+201002081955", +// "name_arabic": "يحى موسى عبد الهادى احمد" +// }, +// { +// "phone": "+201145828830", +// "name_arabic": "السيد السيد ابراهيم سويلم" +// }, +// { +// "phone": "+201020335329", +// "name_arabic": "محمد رضانا رمضان بيومي" +// }, +// { +// "phone": "+201023746940", +// "name_arabic": "حسن محمدى محمد عبد الحميد" +// }, +// { +// "phone": "+201118252950", +// "name_arabic": "بهاء الدين عبد العزيز احمد كمال" +// }, +// { +// "phone": "+201015736460", +// "name_arabic": "محمد مجدي رجب جاد" +// }, +// { +// "phone": "+201553540894", +// "name_arabic": "عادل رمضان عبد الرحمن شبانة" +// }, +// { +// "phone": "+201015925260", +// "name_arabic": "أحمد صبحى عواد عواد" +// }, +// { +// "phone": "+201150533289", +// "name_arabic": "محمود عبد القادر عبد الكريم عبد الكريم" +// }, +// { +// "phone": "+201119137787", +// "name_arabic": "محمد محفوظ محمد محفوظ" +// }, +// { +// "phone": "+201097761778", +// "name_arabic": "احمد ابراهيم السعيد الجنيدى" +// }, +// { +// "phone": "+201003395388", +// "name_arabic": "عمرو على محمد على" +// }, +// { +// "phone": "+201002220298", +// "name_arabic": "علاء نصارى عبد الحميد مصطفى" +// }, +// { +// "phone": "+201007087785", +// "name_arabic": "حمود عبدربه احمد محمد" +// }, +// { +// "phone": "+201097267405", +// "name_arabic": "محمود محمد محمود محمد فراج" +// }, +// { +// "phone": "+201207372344", +// "name_arabic": "مصطفي محمد مصطفي محمد السطوحى" +// }, +// { +// "phone": "+201116509145", +// "name_arabic": "مصطفي حسني عبد الكريم أبو الحسن" +// }, +// { +// "phone": "+201126659891", +// "name_arabic": "سيد جمال مرسى جابر" +// }, +// { +// "phone": "+201155705126", +// "name_arabic": "حسين وجدى محمد مصطفى" +// }, +// { +// "phone": "+201091467068", +// "name_arabic": "حسنين أحمد محمود الأمام" +// }, +// { +// "phone": "+201141765059", +// "name_arabic": "احمد عبد العظيم مصطفى محمود" +// }, +// { +// "phone": "+201225390847", +// "name_arabic": "ياسرطة عوض محمد" +// }, +// { +// "phone": "+201275901512", +// "name_arabic": "أحمد جمال على رفاعي" +// }, +// { +// "phone": "+201040719216", +// "name_arabic": "كريم ماهر عبد الفتاح حسنين" +// }, +// { +// "phone": "+201101094942", +// "name_arabic": "محمد جمعة احمد صميدة" +// }, +// { +// "phone": "+201200783563", +// "name_arabic": "كريم اشرف عمر عكاشه عبده" +// }, +// { +// "phone": "+201003530367", +// "name_arabic": "نادر قدري جورجي حنا عطا الله" +// }, +// { +// "phone": "+201026807264", +// "name_arabic": "عبد الرحمن نبيل عبد المجيد عبد العزيز شفرة" +// }, +// { +// "phone": "+201112774525", +// "name_arabic": "على أمين محمد الليثى" +// }, +// { +// "phone": "+201124211725", +// "name_arabic": "عمرو محمود عبد الجواد محمد" +// }, +// { +// "phone": "+201148611837", +// "name_arabic": "هاني عمرو بدر عبالعزيز" +// }, +// { +// "phone": "+201011604297", +// "name_arabic": "محمد محمد عبد الرؤف قطب" +// }, +// { +// "phone": "+201098166776", +// "name_arabic": "احمد سمير حامد أمين احمد" +// }, +// { +// "phone": "+201141261008", +// "name_arabic": "حجاج سيد أحمد عبد العزيز عبد الرازق" +// }, +// { +// "phone": "+201228443449", +// "name_arabic": "مصطفى محمد أحمدوفيق" +// }, +// { +// "phone": "+201090200313", +// "name_arabic": "عادل محمد عطية احمد حتحوت" +// }, +// { +// "phone": "+201158040388", +// "name_arabic": "عبد النبى السواح" +// }, +// { +// "phone": "+201112591953", +// "name_arabic": "صفر عبد الواحد ابراهيم عبد الواحد" +// }, +// { +// "phone": "+201003247072", +// "name_arabic": "احمد طلعت عبد الحليم عبد الحليم" +// }, +// { +// "phone": "+201019054900", +// "name_arabic": "سيد موسي عبد الرضي منشتج" +// }, +// { +// "phone": "+201020649148", +// "name_arabic": "ياسر عاشور امام ابراهيم" +// }, +// { +// "phone": "+201111751446", +// "name_arabic": "احمد سالم حسن سالم" +// }, +// { +// "phone": "+201014100604", +// "name_arabic": "محمود فوزي علي عبد الخالق" +// }, +// { +// "phone": "+201116908975", +// "name_arabic": "سيف الدين أحمد السعيد احمد" +// }, +// { +// "phone": "+201021235129", +// "name_arabic": "مصطفى سعيد على حسن" +// }, +// { +// "phone": "+201008900034", +// "name_arabic": "احمد مصطفي علي رفاعي احمد" +// }, +// { +// "phone": "+201224748750", +// "name_arabic": "أحمد عاشور عبد المقصود محمد عشماوى" +// }, +// { +// "phone": "+201116410122", +// "name_arabic": "محمود أسامة عبد الرحمن أبو الفتوح" +// }, +// { +// "phone": "+201002593666", +// "name_arabic": "طارق يحيي محمد الانصاري" +// }, +// { +// "phone": "+201070702312", +// "name_arabic": "رمضان عثمان عبد النعيم حسين" +// }, +// { +// "phone": "+201121000454", +// "name_arabic": "عماد على عبد الرؤوف ابراهيم" +// }, +// { +// "phone": "+201000392607", +// "name_arabic": "حسن احمد حسن مجاهد" +// }, +// { +// "phone": "+201009790768", +// "name_arabic": "هشام محمد حمزة محمد" +// }, +// { +// "phone": "+201001151182", +// "name_arabic": "محمد قطب محمد الذى" +// }, +// { +// "phone": "+201125288360", +// "name_arabic": "رضا يحى هاشم هاشم" +// }, +// { +// "phone": "+201093795932", +// "name_arabic": "مجدي محمد إبراهيم غريب" +// }, +// { +// "phone": "+201154566231", +// "name_arabic": "حمزة أحمد عبدالله حسن" +// }, +// { +// "phone": "+201000342280", +// "name_arabic": "علاء الدين عباس محمد نصر" +// }, +// { +// "phone": "+201005285496", +// "name_arabic": "ايمن عفيفي عيد اسماعيل" +// }, +// { +// "phone": "+201143915554", +// "name_arabic": "وليد محمد احمد يوسف" +// }, +// { +// "phone": "+201006766228", +// "name_arabic": "عبد الرحمن محمد محمد عبد اللطيف" +// }, +// { +// "phone": "+201274302911", +// "name_arabic": "عمرو حسن فتحى أحمد محمد سلام" +// }, +// { +// "phone": "+201270650496", +// "name_arabic": "بيتر فليب سعد ايوب" +// }, +// { +// "phone": "+201205662822", +// "name_arabic": "ابراهيم محمد ابراهيم حسين" +// }, +// { +// "phone": "+201012589895", +// "name_arabic": "ميلاد مجدي حبيب طوبيا" +// }, +// { +// "phone": "+201027774092", +// "name_arabic": "محمد عبد الحفيظ محمود علي حسن" +// }, +// { +// "phone": "+201002026121", +// "name_arabic": "محمود جادالرب حارص ابراهيم" +// }, +// { +// "phone": "+201032599049", +// "name_arabic": "ضياء عصام حسن عبد العزيز" +// }, +// { +// "phone": "+201128499555", +// "name_arabic": "السيد محمد الصادق" +// }, +// { +// "phone": "+201225839186", +// "name_arabic": "مصطفى محمود محمود عبد القادر زهران" +// }, +// { +// "phone": "+201094584806", +// "name_arabic": "محمود عادل حسين سالم" +// }, +// { +// "phone": "+201144601683", +// "name_arabic": "مصطفى عبده فتحي عبده" +// }, +// { +// "phone": "+201115299186", +// "name_arabic": "هشام محمود على احمد" +// }, +// { +// "phone": "+201125742000", +// "name_arabic": "محمود رضا محمد ابراهيم" +// }, +// { +// "phone": "+201011568648", +// "name_arabic": "حسام صلاح حسن ابراهيم" +// }, +// { +// "phone": "+201276330019", +// "name_arabic": "مصطفى احمد عبد الرحمن محمد عبداللا" +// }, +// { +// "phone": "+201100773537", +// "name_arabic": "محمد علي عبد الله أحمد الشيمي" +// }, +// { +// "phone": "+201117847477", +// "name_arabic": "كريم عبد العليم شفيق عبد الرحمن" +// }, +// { +// "phone": "+201117396342", +// "name_arabic": "كريم صابر عبد الحميد محمود" +// }, +// { +// "phone": "+201018196433", +// "name_arabic": "هيثم كامل شكري محمد حسن" +// }, +// { +// "phone": "+201555408958", +// "name_arabic": "امل احمد محمد عبد المقصود مصطفي" +// }, +// { +// "phone": "+201006529560", +// "name_arabic": "عمرو جابر ابراهيم المعلاوي" +// }, +// { +// "phone": "+201224661061", +// "name_arabic": "احمد بركات طة السيد" +// }, +// { +// "phone": "+201271744671", +// "name_arabic": "عادل سيد محمود عبد المنطلب" +// }, +// { +// "phone": "+201116360444", +// "name_arabic": "محمد فهمي محمد علي سلامة" +// }, +// { +// "phone": "+201156103340", +// "name_arabic": "احمد ابراهيم عبد العظيم السيد" +// }, +// { +// "phone": "+201030885983", +// "name_arabic": "اسلام شعبان عبد الحميد سليم الشويخ" +// }, +// { +// "phone": "+201080088064", +// "name_arabic": "محمود ناجى صابر أحمد إبراهيم" +// }, +// { +// "phone": "+201117340907", +// "name_arabic": "محمد رضا الحفني مصطفي" +// }, +// { +// "phone": "+201150417075", +// "name_arabic": "صلاح غزال عبدة سالم" +// }, +// { +// "phone": "+201011999310", +// "name_arabic": "علي محمود علي أحمد المليجي" +// }, +// { +// "phone": "+201120348109", +// "name_arabic": "تامر سيد رمضان محمد" +// }, +// { +// "phone": "+201060815155", +// "name_arabic": "أحمد سامي احمد عبد الحليم" +// }, +// { +// "phone": "+201555574817", +// "name_arabic": "محمد صبحي شعبان صقر" +// }, +// { +// "phone": "+2 01156241087", +// "name_arabic": "احمد على سعد عبد الوهاب" +// }, +// { +// "phone": "+201014215217", +// "name_arabic": "مصطفى محمد محمد الدسوقى احمد" +// }, +// { +// "phone": "+201007959517", +// "name_arabic": "محمد جلال حسن فرغلي" +// }, +// { +// "phone": "+201027827475", +// "name_arabic": "رامى محمد عبد العال بغدادى" +// }, +// { +// "phone": "+201273808399", +// "name_arabic": "تامر احمد احمد احمد محمود" +// }, +// { +// "phone": "+201030747814", +// "name_arabic": "محمد خالد ابراهيم صديق" +// }, +// { +// "phone": "+201003504240", +// "name_arabic": "عمرو أحمد محمد ابوعيسى" +// }, +// { +// "phone": "+201033473808", +// "name_arabic": "عبد الوهاب محمد عبد العزيز ابو حميد" +// }, +// { +// "phone": "+201286647734", +// "name_arabic": "عاطف خلف محمد عبد الحافظ" +// }, +// { +// "phone": "+201014192333", +// "name_arabic": "هشام سمير عبد السميع محمد" +// }, +// { +// "phone": "+201202000150", +// "name_arabic": "ريجان هشام مكرم نجيب" +// }, +// { +// "phone": "+201100959492", +// "name_arabic": "احمد سيد أحمد أبوالسباع" +// }, +// { +// "phone": "+201032408007", +// "name_arabic": "مجدي حفظي فهمي عبد العال" +// }, +// { +// "phone": "+201063141018", +// "name_arabic": "حنفى الفل ابراهيم شلبى" +// }, +// { +// "phone": "+201553222768", +// "name_arabic": "محمد السيد عبد الفتاح" +// }, +// { +// "phone": "+201551113404", +// "name_arabic": "احمد صالح محمد محمد" +// }, +// { +// "phone": "+201554595415", +// "name_arabic": "عثمان جمال عثمان عبد الفتاح" +// }, +// { +// "phone": "+201004700407", +// "name_arabic": "محمد عبدالله إبراهيم سلام حميده" +// }, +// { +// "phone": "+201270270248", +// "name_arabic": "عبد الرازق علي عبادي احمد ابوزيد" +// }, +// { +// "phone": "+201225124765", +// "name_arabic": "محمد محمود على الدماطى" +// }, +// { +// "phone": "+201279832984", +// "name_arabic": "جوده شبل بسيونى ابوزيد" +// }, +// { +// "phone": "+201157347771", +// "name_arabic": "محمد احمد محمد السيد فوده" +// }, +// { +// "phone": "+201008872941", +// "name_arabic": "محمد أحمد محمد خضر" +// }, +// { +// "phone": "+201021156161", +// "name_arabic": "نهاد محمد محمود عامر" +// }, +// { +// "phone": "+201157027163", +// "name_arabic": "إسلام عبد المنعم سعيد ضوي" +// }, +// { +// "phone": "+201140397328", +// "name_arabic": "جوده جابر ذكى بيومى" +// }, +// { +// "phone": "+201050664545", +// "name_arabic": "احمد محمود احمد محمد" +// }, +// { +// "phone": "+201005148981", +// "name_arabic": "هاني الفونس الفريد انطون" +// }, +// { +// "phone": "+201223521664", +// "name_arabic": "يوسف على محمد أحمد" +// }, +// { +// "phone": "+201013124916", +// "name_arabic": "حمادة شعبان أبوطالب مرسي" +// }, +// { +// "phone": "+201030896464", +// "name_arabic": "عادل ابراهيم عبد السند عبد العال" +// }, +// { +// "phone": "+201028435290", +// "name_arabic": "أحمد عبد الجواد عبد الحكم عبد الجواد" +// }, +// { +// "phone": "+201210583591", +// "name_arabic": "رامى رومانى ذكرى فخورى" +// }, +// { +// "phone": "+201096148124", +// "name_arabic": "على إبراهيم قطب ابوشادى" +// }, +// { +// "phone": "+201550817512", +// "name_arabic": "محمد صلاح كمال عبد الله هارون" +// }, +// { +// "phone": "+201013725067", +// "name_arabic": "محمد حنفى عبد المطلب أحمد" +// }, +// { +// "phone": "+201026378974", +// "name_arabic": "محمد ابراهيم يوسف ابراهيم" +// }, +// { +// "phone": "+201275624989", +// "name_arabic": "يوسف احمد طلبه عبد المجيد" +// }, +// { +// "phone": "+201001088358", +// "name_arabic": "علاء الدين محمود محمد حسن" +// }, +// { +// "phone": "+201123200082", +// "name_arabic": "هشام محمد حسن محمود" +// }, +// { +// "phone": "+201005308188", +// "name_arabic": "عمرو محمد عنتر ابو العمايم احمد" +// }, +// { +// "phone": "+201120895065", +// "name_arabic": "عماد شحات سليمان سليمان" +// }, +// { +// "phone": "+201204861492", +// "name_arabic": "ابراهيم السيد مصطفى الخضري" +// }, +// { +// "phone": "+201032215558", +// "name_arabic": "مهند علي خليل أحمد" +// }, +// { +// "phone": "+201150343503", +// "name_arabic": "اسلام برعي جادو حسنين" +// }, +// { +// "phone": "+201020453371", +// "name_arabic": "صفوت حسين على قناوى" +// }, +// { +// "phone": "+201112299884", +// "name_arabic": "احمد كمال محمود عبد الحي" +// }, +// { +// "phone": "+201279236054", +// "name_arabic": "محمود السيد احمد حافظ" +// }, +// { +// "phone": "+201118342702", +// "name_arabic": "محمد عبد الرسول صالح عطية" +// }, +// { +// "phone": "+201270434470", +// "name_arabic": "احمد محمد حسين سيد" +// }, +// { +// "phone": "+201208085263", +// "name_arabic": "احمد صالح عبد الحاكم حسن شعيب" +// }, +// { +// "phone": "+201140276818", +// "name_arabic": "جمال عبد البارى محمد" +// }, +// { +// "phone": "+201142277182", +// "name_arabic": "احمد محمد أحمد صالح" +// }, +// { +// "phone": "+201555402805", +// "name_arabic": "عمرو سعيد عبد الحفيظ عبد الحميد" +// }, +// { +// "phone": "+201003464748", +// "name_arabic": "عمرو ابراهيم امام ابراهيم" +// }, +// { +// "phone": "+201069009838", +// "name_arabic": "عصام محمد عبد المجلي بيومي" +// }, +// { +// "phone": "+201115988459", +// "name_arabic": "عاطف محمد جاد الكريم مرشد" +// }, +// { +// "phone": "+201289058191", +// "name_arabic": "أحمد صابر سليمان ابراهيم زيدان" +// }, +// { +// "phone": "+201022998951", +// "name_arabic": "أحمد عبد القادر سالم علي خليفة" +// }, +// { +// "phone": "+201113439473", +// "name_arabic": "حمزه جمال عبد الله السيد" +// }, +// { +// "phone": "+201152054617", +// "name_arabic": "بدر محمد احمد محمود" +// }, +// { +// "phone": "+201551350711", +// "name_arabic": "محمد بحيث محمد دياب" +// }, +// { +// "phone": "+201224942609", +// "name_arabic": "هاني سيد سيد احمد" +// }, +// { +// "phone": "+201152373321", +// "name_arabic": "عبد الرحمن ايمن غريب رشاد" +// }, +// { +// "phone": "+201272623065", +// "name_arabic": "محمد جابر عبد الوهاب جابر مخلوف" +// }, +// { +// "phone": "+201204514017", +// "name_arabic": "مصطفى بيومى مصطفى مصطفى" +// }, +// { +// "phone": "+201279803133", +// "name_arabic": "مصطفى رافت عبد الدايم احمد" +// }, +// { +// "phone": "+201001329155", +// "name_arabic": "بسام أحمد مختار عبد العزيز" +// }, +// { +// "phone": "+201210200789", +// "name_arabic": "مصطفى حمدى خلف عبد الرحيم" +// }, +// { +// "phone": "+201003332464", +// "name_arabic": "عمرو سيد محي الدين أحمد فارس" +// }, +// { +// "phone": "+201120071355", +// "name_arabic": "محمود محمد حسين محمد" +// }, +// { +// "phone": "+201151869870", +// "name_arabic": "سمر أبو السعود أحمد منصور" +// }, +// { +// "phone": "+201229827088", +// "name_arabic": "ايهاب رضا إبراهيم قاعود" +// }, +// { +// "phone": "+201005451887", +// "name_arabic": "طارق عبدالعزيز محمد السيد" +// }, +// { +// "phone": "+201122130454", +// "name_arabic": "مصطفى على محمد محمود" +// }, +// { +// "phone": "+201024052053", +// "name_arabic": "عبد الرحمن هانئ عبد المنعم عبد الوهاب" +// }, +// { +// "phone": "+201110211130", +// "name_arabic": "حذيفة محمد يس علي" +// }, +// { +// "phone": "+201157572040", +// "name_arabic": "سارة هشام أنيس محمد" +// }, +// { +// "phone": "+201273388094", +// "name_arabic": "خليل السيد خليل الشربيني" +// }, +// { +// "phone": "+201002380874", +// "name_arabic": "صلاح عبد الرحيم على حزين" +// }, +// { +// "phone": "+201097640662", +// "name_arabic": "السعيد محمد على البنا" +// }, +// { +// "phone": "+201119298768", +// "name_arabic": "يلج مكرم احمد عبد السيد" +// }, +// { +// "phone": "+201112539202", +// "name_arabic": "محمود محمد عبد الستار عفيفي" +// }, +// { +// "phone": "+201023626140", +// "name_arabic": "مجدى سمير محمد حسن" +// }, +// { +// "phone": "+201552882268", +// "name_arabic": "محمد بيومى أحمد صالح" +// }, +// { +// "phone": "+201019369954", +// "name_arabic": "عبدالله شعبان كامل حسن محمد" +// }, +// { +// "phone": "+201117037553", +// "name_arabic": "اكرامي سعيد حمد امبابي" +// }, +// { +// "phone": "+201004818464", +// "name_arabic": "محمد قطب عبد اللة سليم" +// }, +// { +// "phone": "+201156019211", +// "name_arabic": "استلام إبراهيم الدسوقى ابراهيم" +// }, +// { +// "phone": "+201119904564", +// "name_arabic": "محمد عبد المجيد ربيع عبد المجيد" +// }, +// { +// "phone": "+201067229741", +// "name_arabic": "جمال محمد عبد الرووف اسماعيل" +// }, +// { +// "phone": "+201066715701", +// "name_arabic": "عبد الرحمن رضا رمضان لويزى" +// }, +// { +// "phone": "+201222967787", +// "name_arabic": "عاصم حسن مرسي محمد الشنديدي" +// }, +// { +// "phone": "+201126946975", +// "name_arabic": "إسلام صلاح مبروك حسن" +// }, +// { +// "phone": "+201011953955", +// "name_arabic": "هشام محمد سامى محمد المصيلحى" +// }, +// { +// "phone": "+201020093997", +// "name_arabic": "عبود سعيد عبده السيد" +// }, +// { +// "phone": "+201001609106", +// "name_arabic": "اسلام يسري عبد الرازق الصاوي" +// }, +// { +// "phone": "+201029717586", +// "name_arabic": "محمد مصطفى عبد الحميد" +// }, +// { +// "phone": "+201129847590", +// "name_arabic": "يوسف ماهر عزام خليل" +// }, +// { +// "phone": "+201025471015", +// "name_arabic": "جمال محمد محمد الفضالي" +// }, +// { +// "phone": "+201203553277", +// "name_arabic": "ايليا فؤاد بقطر بولس" +// }, +// { +// "phone": "+201149494416", +// "name_arabic": "علاء الشربينى حسين يوسف" +// }, +// { +// "phone": "+201029293340", +// "name_arabic": "اسلام عادل احمد محمد" +// }, +// { +// "phone": "+201003762746", +// "name_arabic": "محمود سيد حسن محمود" +// }, +// { +// "phone": "+201064626776", +// "name_arabic": "عبد الرحمن راتب ابراهيم محمد" +// }, +// { +// "phone": "+201020695352", +// "name_arabic": "عبد الله السيد محمد السيد" +// }, +// { +// "phone": "+201009209234", +// "name_arabic": "محمد إبراهيم أبو المجد محمد" +// }, +// { +// "phone": "+201070344105", +// "name_arabic": "احمد حمدي ابراهيم محمد" +// }, +// { +// "phone": "+201123435022", +// "name_arabic": "عبد الله وليد أحمد مرسى" +// }, +// { +// "phone": "+201010509670", +// "name_arabic": "تامر محمد عبد الرحمن محمد" +// }, +// { +// "phone": "+201289272171", +// "name_arabic": "مصطفى محمود عطا لطفي طه عطا" +// }, +// { +// "phone": "+201201824383", +// "name_arabic": "احمد سعيد شحاتة محمد ابراهيم" +// }, +// { +// "phone": "+201080894144", +// "name_arabic": "عمرو ناصر امين عباس" +// }, +// { +// "phone": "+201220202958", +// "name_arabic": "طارق فتحي محمد خلف" +// }, +// { +// "phone": "+201002227501", +// "name_arabic": "يسري مصري سكران المصري" +// }, +// { +// "phone": "+201553806016", +// "name_arabic": "عبد الحميد عز الدين عبد الحميد حسين شحاته" +// }, +// { +// "phone": "+201223234257", +// "name_arabic": "شرف اسماعيل محمد الكاشف" +// }, +// { +// "phone": "+201006007642", +// "name_arabic": "خالد سمير محمد على" +// }, +// { +// "phone": "+201114309382", +// "name_arabic": "محمد سامي جميل عبد الحفيظ" +// }, +// { +// "phone": "+201060460771", +// "name_arabic": "ماجد محمد سمير عبد الحليم عبد الله" +// }, +// { +// "phone": "+201095032754", +// "name_arabic": "حسام محمد محمد عبد المنعم محمد" +// }, +// { +// "phone": "+201028340666", +// "name_arabic": "مير ابراهيم ابراهيم الغزالى" +// }, +// { +// "phone": "+201027719574", +// "name_arabic": "ولاء عبد الله عباس أحمد" +// }, +// { +// "phone": "+201001974843", +// "name_arabic": "على السيد محمد الفخراني" +// }, +// { +// "phone": "+201092755575", +// "name_arabic": "منصور السيد منصور جلال" +// }, +// { +// "phone": "+201016547975", +// "name_arabic": "شحات نزيه عبد الرؤف الخشن" +// }, +// { +// "phone": "+201270794100", +// "name_arabic": "محمود السيد محمد يوسف عبدالدايم" +// }, +// { +// "phone": "+201117372111", +// "name_arabic": "عبد الله عبد القوى عبد الرحمن" +// }, +// { +// "phone": "+201070021630", +// "name_arabic": "هيثم سعيد محمود عبدالله" +// }, +// { +// "phone": "+201289006333", +// "name_arabic": "سعد عطا بشاى تادرس" +// }, +// { +// "phone": "+201141307507", +// "name_arabic": "محمد سعد ابراهيم مدبولي" +// }, +// { +// "phone": "+201113972783", +// "name_arabic": "يوسف محمد صالح صالح الجندي" +// }, +// { +// "phone": "+201011307072", +// "name_arabic": "نهى على أحمد الجوهرى" +// }, +// { +// "phone": "+201222792649", +// "name_arabic": "عماد محمد ابراهيم عبد العظيم" +// }, +// { +// "phone": "+201123237473", +// "name_arabic": "صلاح مجدى محمود حسن" +// }, +// { +// "phone": "+201023248457", +// "name_arabic": "السيد عزت محمد السيد" +// }, +// { +// "phone": "+201112826790", +// "name_arabic": "عبد الحكيم أحمد جاد الرب عبد الحكيم" +// }, +// { +// "phone": "+201001741428", +// "name_arabic": "محمد السيد مهدي عبد الله السيد" +// }, +// { +// "phone": "+201012471403", +// "name_arabic": "محمود صلاح الدين أحمد محمد" +// }, +// { +// "phone": "+201129402527", +// "name_arabic": "عبد الرحمن طارق احمد محمد" +// }, +// { +// "phone": "+201205200301", +// "name_arabic": "احمد فؤاد احمد احمد" +// }, +// { +// "phone": "+201023069907", +// "name_arabic": "محمد كمال محمد حمدان" +// }, +// { +// "phone": "+201201025700", +// "name_arabic": "محمد فوزي عبد الحميد محمد" +// }, +// { +// "phone": "+201007077839", +// "name_arabic": "محمود السيد محمود رفعت" +// }, +// { +// "phone": "+201202696434", +// "name_arabic": "احمد سيد محمد السيد بكر" +// }, +// { +// "phone": "+201122441260", +// "name_arabic": "‏الأمير رسمي داوود رفائيل" +// }, +// { +// "phone": "+201025432017", +// "name_arabic": "خالد يحيي السيد السكرى" +// }, +// { +// "phone": "+201110172997", +// "name_arabic": "شيماء السيد العربي جمال إبراهيم البوشى" +// }, +// { +// "phone": "+201022135995", +// "name_arabic": "هاني فتحي عبد الغفار مكاوي" +// }, +// { +// "phone": "+201080269149", +// "name_arabic": "ايهاب ابراهيم حمدي ابراهيم" +// }, +// { +// "phone": "+201149228245", +// "name_arabic": "سامح محمد السيد عبدة" +// }, +// { +// "phone": "+201091248891", +// "name_arabic": "محمود محمد محمود بدر" +// }, +// { +// "phone": "+201226291683", +// "name_arabic": "سوسن زينهم امام علي" +// }, +// { +// "phone": "+201004267447", +// "name_arabic": "محمود صالح عبدة مجاهد" +// }, +// { +// "phone": "+201060255745", +// "name_arabic": "عمرو السيد عوض شعيب" +// }, +// { +// "phone": "+201141485952", +// "name_arabic": "محسن احمد عويس محمد" +// }, +// { +// "phone": "+201224927485", +// "name_arabic": "محمود عبد الفتاح عبد الرحمن سويلم" +// }, +// { +// "phone": "+201102752569", +// "name_arabic": "ابراهيم محمد محمود علي" +// }, +// { +// "phone": "+201124939986", +// "name_arabic": "زياد ناصر سيد حسن" +// }, +// { +// "phone": "+201007871912", +// "name_arabic": "ميلاد شكري جاد جودة" +// }, +// { +// "phone": "+201149790499", +// "name_arabic": "مصطفى عبدالمنعم جابر سليمان" +// }, +// { +// "phone": "+201280665346", +// "name_arabic": "أحمد محمد شعبان جادو احمد" +// }, +// { +// "phone": "+201110868027", +// "name_arabic": "محمد جلال خليفة حسن" +// }, +// { +// "phone": "+201148504650", +// "name_arabic": "أميرة محمود أحمد حسين" +// }, +// { +// "phone": "+201202530513", +// "name_arabic": "بولا رمزي معوض اسكندرناروز" +// }, +// { +// "phone": "+201092936434", +// "name_arabic": "ياسمين السيد احمد محمد" +// }, +// { +// "phone": "+201005894006", +// "name_arabic": "عبد الله عبد الرحمن حسبو احمد" +// }, +// { +// "phone": "+201093012988", +// "name_arabic": "احمد محمد عبد الكريم عبد الحميد" +// }, +// { +// "phone": "+201002268334", +// "name_arabic": "محمود احمد محمد البتانونى" +// }, +// { +// "phone": "+201289993407", +// "name_arabic": "شريف محمد محمد بغدادي" +// }, +// { +// "phone": "+201210201177", +// "name_arabic": "ايهاب احمد عبد الرؤوف احمد" +// }, +// { +// "phone": "+201064004525", +// "name_arabic": "مراد ملاك زكي سليمان غالي" +// }, +// { +// "phone": "+201019785811", +// "name_arabic": "يسري حمادة عبد الله عبد الحليم" +// }, +// { +// "phone": "+201098582216", +// "name_arabic": "جمال محمود أحمد السيد" +// }, +// { +// "phone": "+201128295934", +// "name_arabic": "محمد قطب عبد الفتاح ابراهيم" +// }, +// { +// "phone": "+201127968007", +// "name_arabic": "مصطفى عبد الله عبد الحميد أحمد خليف" +// }, +// { +// "phone": "+201144352678", +// "name_arabic": "امل السيد أحمد أحمد" +// }, +// { +// "phone": "+201004521932", +// "name_arabic": "محمد فوزي عبدة ابراهيم" +// }, +// { +// "phone": "+201224647930", +// "name_arabic": "محمود حلمي احمد محمد" +// }, +// { +// "phone": "+201012574024", +// "name_arabic": "رافت اسماعيل محمد جمال" +// }, +// { +// "phone": "+201006363832", +// "name_arabic": "تمال محمد عبد النبي حسيبه" +// }, +// { +// "phone": "+201008527428", +// "name_arabic": "محمد عاطف فؤاد الفوال" +// }, +// { +// "phone": "+201029929017", +// "name_arabic": "امانى صبحى مصطفى حسن" +// }, +// { +// "phone": "+201002260149", +// "name_arabic": "رضا عبد العزيز زكي السيد" +// }, +// { +// "phone": "+201212199944", +// "name_arabic": "كريم مراد حميد رشدي عبد الحليم" +// }, +// { +// "phone": "+201102432276", +// "name_arabic": "وليد علاء الدين عبد الحي محمود" +// }, +// { +// "phone": "+201026446660", +// "name_arabic": "محمد حسن السيد ابو اربعه" +// }, +// { +// "phone": "+201228946285", +// "name_arabic": "ايمان عبدالرحمن محمد المهدى" +// }, +// { +// "phone": "+201113092689", +// "name_arabic": "احمد خضيرى على احمد" +// }, +// { +// "phone": "+201090306960", +// "name_arabic": "عمر عبد العزيز محمد فرج" +// }, +// { +// "phone": "+201050797017", +// "name_arabic": "محمود محمد أمين محمد علي" +// }, +// { +// "phone": "+201277855345", +// "name_arabic": "محمد السيد احمد عبد المجيد احمد" +// }, +// { +// "phone": "+201110448732", +// "name_arabic": "محمود فاروق عبد الوهاب محمد" +// }, +// { +// "phone": "+201030145357", +// "name_arabic": "اسلام رمضان على محمود" +// }, +// { +// "phone": "+201096646142", +// "name_arabic": "محمد السيد محمد حسن" +// }, +// { +// "phone": "+201098136276", +// "name_arabic": "محمد شعبان عبد المنعم مهنى" +// }, +// { +// "phone": "+201063251961", +// "name_arabic": "هدي خالد عبد المحسن خبيري" +// }, +// { +// "phone": "+201281178571", +// "name_arabic": "عزيز عدلي اسكاروس بولس" +// }, +// { +// "phone": "+201128278687", +// "name_arabic": "احمد محمد حسن أبو الحسن" +// }, +// { +// "phone": "+201004914303", +// "name_arabic": "اسماعيل صابر أحمد خلف خيامي" +// }, +// { +// "phone": "+201117021123", +// "name_arabic": "سامح محمد عبد الرحمن احمد" +// }, +// { +// "phone": "+201093653240", +// "name_arabic": "أحمد لطفى عزت لطفى" +// }, +// { +// "phone": "+201091491058", +// "name_arabic": "فاروق عبد السلام فاروق حجازي" +// }, +// { +// "phone": "+201111717308", +// "name_arabic": "اشرف محمد محمد عشران" +// }, +// { +// "phone": "+201100583911", +// "name_arabic": "محمود عبد السلام سيد عبد السلام" +// }, +// { +// "phone": "+201152851954", +// "name_arabic": "محمد سعيد محمد علي قمر" +// }, +// { +// "phone": "+201508281754", +// "name_arabic": "عصام السيد محمد الشرقاوي" +// }, +// { +// "phone": "+201008360039", +// "name_arabic": "وائل فاروق سيد عبده عبد الرحمن" +// }, +// { +// "phone": "+201284436627", +// "name_arabic": "مينا يوسف عبد النور سعد" +// }, +// { +// "phone": "+201002657762", +// "name_arabic": "عوض العربي السيد حامد" +// }, +// { +// "phone": "+201008018993", +// "name_arabic": "احمد السيد حسين محمد" +// }, +// { +// "phone": "+201550861194", +// "name_arabic": "سعيد أحمد رشيدي حسن" +// }, +// { +// "phone": "+201023790070", +// "name_arabic": "حسام الدين حاتم حسن فهمي" +// }, +// { +// "phone": "+201276766553", +// "name_arabic": "احمد عبد الموجود مجاهد احمد" +// }, +// { +// "phone": "+201064468695", +// "name_arabic": "محمد احمد محمد محمد" +// }, +// { +// "phone": "+201091677319", +// "name_arabic": "اسلام رجب محمود أحمد" +// }, +// { +// "phone": "+201028232495", +// "name_arabic": "إبراهيم ياسر إبراهيم عبد الحق" +// }, +// { +// "phone": "+201555151712", +// "name_arabic": "كريم حمدى رشاد محمود" +// }, +// { +// "phone": "+201027148765", +// "name_arabic": "احمد حسن شعبان والى" +// }, +// { +// "phone": "+201224508493", +// "name_arabic": "مصطفى محمود عبد المؤمن درويش" +// }, +// { +// "phone": "+201112740741", +// "name_arabic": "أيمن حسن عبد المعز حسن" +// }, +// { +// "phone": "+201008330262", +// "name_arabic": "عادل فوزى عبد المقصود محمد" +// }, +// { +// "phone": "+201141662055", +// "name_arabic": "عمر حسين عبد العليم" +// }, +// { +// "phone": "+201117246068", +// "name_arabic": "علاء الدين فؤاد أحمد الخولي" +// }, +// { +// "phone": "+201010025269", +// "name_arabic": "عادل محمد عطا الله احمد" +// }, +// { +// "phone": "+201155350855", +// "name_arabic": "إسماعيل محمد حامد أحمد" +// }, +// { +// "phone": "+201558422120", +// "name_arabic": "اسلام محمود إبراهيم أحمد صقر" +// }, +// { +// "phone": "+201064565933", +// "name_arabic": "عمرو عثمان عبد العظيم عثمان" +// }, +// { +// "phone": "+201156564168", +// "name_arabic": "خالد سيد محمد السيد" +// }, +// { +// "phone": "+201101512699", +// "name_arabic": "محمد عبد الحميد عبد الحميد شحاتة" +// }, +// { +// "phone": "+201010521066", +// "name_arabic": "محمد ناصر سيد مرسي" +// }, +// { +// "phone": "+201202969560", +// "name_arabic": "هشام أحمد أحمد سيد" +// }, +// { +// "phone": "+201225551053", +// "name_arabic": "السيد مجدي السيد الطنطاوي حسن" +// }, +// { +// "phone": "+201203753666", +// "name_arabic": "عصام نادي ابراهيم خليل" +// }, +// { +// "phone": "+201224825057", +// "name_arabic": "كيرلس روماني فهيم خليل" +// }, +// { +// "phone": "+201157812138", +// "name_arabic": "عبد الله عبد الرحمن حسين علام" +// }, +// { +// "phone": "+201118286622", +// "name_arabic": "صلاح الدين عبد الفتاح محمد درويش" +// }, +// { +// "phone": "+201224530216", +// "name_arabic": "محمود محمود أمين السيد" +// }, +// { +// "phone": "+201153985809", +// "name_arabic": "احمد مصطفى محمد حسن سليمان" +// }, +// { +// "phone": "+201026264611", +// "name_arabic": "محمد احمد عبد الله محمد" +// }, +// { +// "phone": "+201028035701", +// "name_arabic": "حازم عبد الحليم محمد البراوي" +// }, +// { +// "phone": "+201277204532", +// "name_arabic": "محمد الهادي محمد السيد" +// }, +// { +// "phone": "+201281310091", +// "name_arabic": "ماجد أحمد فضل محمد خليف" +// }, +// { +// "phone": "+201122453889", +// "name_arabic": "مصطفى حلمي سعد السيد" +// }, +// { +// "phone": "+201118822010", +// "name_arabic": "حسام الدين عاطف علي سيد" +// }, +// { +// "phone": "+201151648048", +// "name_arabic": "عادل إبراهيم ميخائيل إبراهيم" +// }, +// { +// "phone": "+201150305458", +// "name_arabic": "على أحمد على أحمد محمود" +// }, +// { +// "phone": "+201550801300", +// "name_arabic": "سعيد احمد صالح محمد" +// }, +// { +// "phone": "+201001382414", +// "name_arabic": "محمود أحمد مختار ابو الفتوح يوسف" +// }, +// { +// "phone": "+201060686267", +// "name_arabic": "مصطفى جمعه فنجرى عرابى" +// }, +// { +// "phone": "+201202665435", +// "name_arabic": "احمد محمد السيد محمد حسين القاضى" +// }, +// { +// "phone": "+201271045792", +// "name_arabic": "محمد ايهاب محمد مامون" +// }, +// { +// "phone": "+201017634140", +// "name_arabic": "عمر فتحى على كامل" +// }, +// { +// "phone": "+201204900497", +// "name_arabic": "سمير قطب احمد علي منسي" +// }, +// { +// "phone": "+201030382740", +// "name_arabic": "ياسرسيد على محمد نور الدين" +// }, +// { +// "phone": "+201143791394", +// "name_arabic": "نادي جورج نادي صليب" +// }, +// { +// "phone": "+201099420820", +// "name_arabic": "حسن صلاح الدين يوسف عبد الوهاب" +// }, +// { +// "phone": "+201110190311", +// "name_arabic": "محمود فارس محمد عويس" +// }, +// { +// "phone": "+201151883385", +// "name_arabic": "حازم سعد أحمد سعد" +// }, +// { +// "phone": "+201201448263", +// "name_arabic": "وليد محمد السيد محمد" +// }, +// { +// "phone": "+201101408273", +// "name_arabic": "أحمد طارق حنفى حنفى" +// }, +// { +// "phone": "+201200008264", +// "name_arabic": "محمد نبيل محمد عيد على النجار" +// }, +// { +// "phone": "+201003883238", +// "name_arabic": "محمد محمود سيد جاد الله" +// }, +// { +// "phone": "+201206353130", +// "name_arabic": "حازم الأمير محمد بهنسي" +// }, +// { +// "phone": "+201222695023", +// "name_arabic": "حسن علي حسن مصطفي بغدادي" +// }, +// { +// "phone": "+201091951144", +// "name_arabic": "ابراهيم حسن جمعه عيد عبدالله" +// }, +// { +// "phone": "+201124355455", +// "name_arabic": "مني فتحي طة دياب" +// }, +// { +// "phone": "+201021858923", +// "name_arabic": "سامى عربى محمد ابراهيم" +// }, +// { +// "phone": "+201016788213", +// "name_arabic": "اسلام أحمد رجب اسماعيل" +// }, +// { +// "phone": "+201158105524", +// "name_arabic": "عبد الله عادل خليل ابراهيم" +// }, +// { +// "phone": "+201149492463", +// "name_arabic": "محمود محمد ابراهيم عبيد" +// }, +// { +// "phone": "+201225294141", +// "name_arabic": "أميل ميلاد جرجس زخارى" +// }, +// { +// "phone": "+201097846083", +// "name_arabic": "سيد محمد حسن على" +// }, +// { +// "phone": "+201205294522", +// "name_arabic": "أحمد نصر الدين محمود على" +// }, +// { +// "phone": "+201140793290", +// "name_arabic": "عبد العزيز احمد عبد العزيز احمد" +// }, +// { +// "phone": "+201001101253", +// "name_arabic": "احمد ابراهيم محمود ابراهيم" +// }, +// { +// "phone": "+201011155860", +// "name_arabic": "حسين جمال الدين كمال محمد" +// }, +// { +// "phone": "+201282503703", +// "name_arabic": "أبانوب اسحق عبد النور عبده" +// }, +// { +// "phone": "+201015083450", +// "name_arabic": "احمد محمود عبدربة عرفة" +// }, +// { +// "phone": "+201018959517", +// "name_arabic": "أحمد عبد الله أمين السباعي حشيش" +// }, +// { +// "phone": "+201062702907", +// "name_arabic": "محمود سعد شحاته زغلول" +// }, +// { +// "phone": "+201064334558", +// "name_arabic": "أحمد رمضان سعد الشرقاوي" +// }, +// { +// "phone": "+201001281229", +// "name_arabic": "أمين محمد صلاح أبوالخير" +// }, +// { +// "phone": "+201032774433", +// "name_arabic": "احمد حسن محمد عثمان" +// }, +// { +// "phone": "+201119393889", +// "name_arabic": "محمود عزت عويس شلبى" +// }, +// { +// "phone": "+201225460762", +// "name_arabic": "احمد صلاح الدين محمد عبد المهيمن" +// }, +// { +// "phone": "+201127272523", +// "name_arabic": "عبد الحميد أحمد عبد الحميد أحمد مصطفى" +// }, +// { +// "phone": "+201221485724", +// "name_arabic": "ياسر عطية على عبد النبي طرابية" +// }, +// { +// "phone": "+201555852362", +// "name_arabic": "ربيع السيد عبد الغنى محمد" +// }, +// { +// "phone": "+201111512106", +// "name_arabic": "كريم صابر عبد الباسط محمد" +// }, +// { +// "phone": "+201273655579", +// "name_arabic": "حسن فاروق حسن حامد" +// }, +// { +// "phone": "+201003050534", +// "name_arabic": "أحمد نبيل خليل أحمد" +// }, +// { +// "phone": "+201142492474", +// "name_arabic": "احمد خالد رجب روبى" +// }, +// { +// "phone": "+201099522178", +// "name_arabic": "احمد سيد محمود عبد الحافظ" +// }, +// { +// "phone": "+201009606346", +// "name_arabic": "مينا فايز نسيم فرج الله" +// }, +// { +// "phone": "+201023848787", +// "name_arabic": "كمال عبد الناصر كمال حسن" +// }, +// { +// "phone": "+201212145380", +// "name_arabic": "محمد ناصر محمد البيومي حسنين محمد" +// }, +// { +// "phone": "+201550651322", +// "name_arabic": "احمد ابو بكر عبد المطلب عبد الفتاح" +// }, +// { +// "phone": "+201061131720", +// "name_arabic": "اسلام عصام محمد مسعود" +// }, +// { +// "phone": "+201013104428", +// "name_arabic": "محمد احمد قناوي عبيد" +// }, +// { +// "phone": "+201096132594", +// "name_arabic": "محمد سيد مفتاح يوسف" +// }, +// { +// "phone": "+201111639660", +// "name_arabic": "مؤمن عصام كامل مخيمر" +// }, +// { +// "phone": "+201145579943", +// "name_arabic": "محمد عبد الرازق حسن حسنين" +// }, +// { +// "phone": "+201153506778", +// "name_arabic": "مصطفى محمود علي ناجى" +// }, +// { +// "phone": "+201224800297", +// "name_arabic": "محمد عادل على مهران" +// }, +// { +// "phone": "+201200678667", +// "name_arabic": "احمد طارق ابراهيم محمد" +// }, +// { +// "phone": "+201007436392", +// "name_arabic": "محمد صبري محجوب اسماعيل" +// }, +// { +// "phone": "+201023130711", +// "name_arabic": "مصطفى احمد عبد المنعم ابوشعيشع" +// }, +// { +// "phone": "+201111751166", +// "name_arabic": "عبد الحكيم وصفي عبد الحكيم السيد" +// }, +// { +// "phone": "+201150872150", +// "name_arabic": "منه الله سلام عبد الحليم محمود" +// }, +// { +// "phone": "+201117715008", +// "name_arabic": "علي سعيد حسنين حسين" +// }, +// { +// "phone": "+201111951209", +// "name_arabic": "ابراهيم محمد عرفان محمد" +// }, +// { +// "phone": "+201121104000", +// "name_arabic": "سها ابراهيم محمد السيد" +// }, +// { +// "phone": "+201120777527", +// "name_arabic": "محمد محمد سيد احمد نصار" +// }, +// { +// "phone": "+201121644380", +// "name_arabic": "محمد محمد السيد بلابل" +// }, +// { +// "phone": "+201103939129", +// "name_arabic": "أحمد محمد مصطفي مصطفي" +// }, +// { +// "phone": "+201010765597", +// "name_arabic": "احمد عبد الحميد محمد مصطفى" +// }, +// { +// "phone": "+201095588683", +// "name_arabic": "زكريا محمد زكريا عبد العظيم المرسي" +// }, +// { +// "phone": "+201148140582", +// "name_arabic": "محمد حسين عبد الظاهر حسين" +// }, +// { +// "phone": "+201024956781", +// "name_arabic": "احمد محمود الشيخ عبد القوي" +// }, +// { +// "phone": "+201223940650", +// "name_arabic": "محمد رضا مصطفى المطيري احمد" +// }, +// { +// "phone": "+201007274290", +// "name_arabic": "أحمد محمد ربيع عبد الهادى" +// }, +// { +// "phone": "+201276050786", +// "name_arabic": "عبد النبى مصطفى عبد النبى" +// }, +// { +// "phone": "+201015665467", +// "name_arabic": "سماح محمد علي حسن أبوخضرة" +// }, +// { +// "phone": "+201068958250", +// "name_arabic": "عماد الدين محمد محمود دعبس" +// }, +// { +// "phone": "+201117745888", +// "name_arabic": "ايمن محمد سعد أحمد عامر" +// }, +// { +// "phone": "+201551718091", +// "name_arabic": "هشام عوض حسين محمد عواض" +// }, +// { +// "phone": "+201060163215", +// "name_arabic": "محمد أسامة السيد فهمى" +// }, +// { +// "phone": "+201009759313", +// "name_arabic": "سعيد السيد توفيق سليمان" +// }, +// { +// "phone": "+201208201006", +// "name_arabic": "مصطفى جمال عبد الرحمن حسين" +// }, +// { +// "phone": "+201121537458", +// "name_arabic": "محمد سيد ربيع احمد" +// }, +// { +// "phone": "+201064845402", +// "name_arabic": "احمد محمود علي محمد" +// }, +// { +// "phone": "+201094930901", +// "name_arabic": "محمد عدلي امين مرسي" +// }, +// { +// "phone": "+201008106604", +// "name_arabic": "عبدالرحمن سليمان حافظ سليمان" +// }, +// { +// "phone": "+201274050210", +// "name_arabic": "على عبد العال جمعه عبد العال" +// }, +// { +// "phone": "+201225328559", +// "name_arabic": "محمد احمد محمد كامل" +// }, +// { +// "phone": "+201113772879", +// "name_arabic": "حسن عبد المجيد حسن عبد الواحد" +// }, +// { +// "phone": "+201286254841", +// "name_arabic": "محمد حسين ضيف الله النوبى" +// }, +// { +// "phone": "+201150793312", +// "name_arabic": "محمد عصام الدين محمود إبراهيم" +// }, +// { +// "phone": "+201501111596", +// "name_arabic": "احمد فهمي عبدالراضي احمد" +// }, +// { +// "phone": "+201065822255", +// "name_arabic": "محمود نبيل رزق ابراهيم" +// }, +// { +// "phone": "+201200205662", +// "name_arabic": "كريم محمد السيد محمد عبدالله" +// }, +// { +// "phone": "+201147317702", +// "name_arabic": "احمد صلاح سالم الباجورى" +// }, +// { +// "phone": "+201069699941", +// "name_arabic": "احمد مصطفى محمد عبد الجواد" +// }, +// { +// "phone": "+201125111045", +// "name_arabic": "شعبان السيد عبد الخالق الحاكمي" +// }, +// { +// "phone": "+201120368606", +// "name_arabic": "احمد ايهاب احمد فهمى" +// }, +// { +// "phone": "+201030806901", +// "name_arabic": "اميره محمد محمد شيحه" +// }, +// { +// "phone": "+201000038736", +// "name_arabic": "أحمد محمد بشير أحمد" +// }, +// { +// "phone": "+201004485856", +// "name_arabic": "اشرف احمد عبد العاطى صالح" +// }, +// { +// "phone": "+201126049043", +// "name_arabic": "أحمد سمير صابر مصطفى إبراهيم" +// }, +// { +// "phone": "+201004105118", +// "name_arabic": "حسام أبوبكر فرج موسى البنا" +// }, +// { +// "phone": "+201017913244", +// "name_arabic": "محمد عبد الرازق محمد محمد" +// }, +// { +// "phone": "+201066847815", +// "name_arabic": "حسن عطية داود حسن" +// }, +// { +// "phone": "+201275466670", +// "name_arabic": "كريم سامي ادم طانيوس بطرس" +// }, +// { +// "phone": "+201146234934", +// "name_arabic": "احمد محمد عبدالحكم صميدة" +// }, +// { +// "phone": "+201002726223", +// "name_arabic": "علاء عبد الناصر ابو المجد ابراهيم" +// }, +// { +// "phone": "+201014714084", +// "name_arabic": "أحمد حمدي اسماعيل عبد الغني" +// }, +// { +// "phone": "+201003882644", +// "name_arabic": "تامر وفا علي انور" +// }, +// { +// "phone": "+201227026539", +// "name_arabic": "احمد اسامه أمين محمود حسين" +// }, +// { +// "phone": "+201001923502", +// "name_arabic": "وليد محمد وثام عبد الرازق محمد سالم" +// }, +// { +// "phone": "+201092250712", +// "name_arabic": "محمد محمود عبد الجواد القشط" +// }, +// { +// "phone": "+201009150184", +// "name_arabic": "حاتم حجاج موسي وهبة" +// }, +// { +// "phone": "+201065537693", +// "name_arabic": "معتز حسين محمد ضيف" +// }, +// { +// "phone": "+201099981747", +// "name_arabic": "حسين عبد العزيز عبد الحافظ مزيود" +// }, +// { +// "phone": "+201228030501", +// "name_arabic": "احمد نجيب يونس عبد الباسط" +// }, +// { +// "phone": "+201153426250", +// "name_arabic": "مهند عادل سيد احمد محمد" +// }, +// { +// "phone": "+201159555233", +// "name_arabic": "محمد أبو الحسن عبد العظيم محمود" +// }, +// { +// "phone": "+201201312691", +// "name_arabic": "محمود محمد صادق محمد" +// }, +// { +// "phone": "+201020109252", +// "name_arabic": "سيد عوض سيد عثمان" +// }, +// { +// "phone": "+201281659132", +// "name_arabic": "محمود هشام محمد محب" +// }, +// { +// "phone": "+20115455832#", +// "name_arabic": "معاذ غلام بدر إبراهيم" +// }, +// { +// "phone": "+201099670072", +// "name_arabic": "محمد عبد العظيم عزيز محمد" +// }, +// { +// "phone": "+201005628356", +// "name_arabic": "عبد الحميد محمد عبد الحميد عبد الله" +// }, +// { +// "phone": "+201000700861", +// "name_arabic": "هانى حمدان محمد مرسى" +// }, +// { +// "phone": "+201140703111", +// "name_arabic": "أحمد عدلى محمد محمود" +// }, +// { +// "phone": "+201015328382", +// "name_arabic": "ابراهيم محمد محمد عبد الله" +// }, +// { +// "phone": "+201558322215", +// "name_arabic": "مينا جورج شاكر اسكندر" +// }, +// { +// "phone": "+201060974333", +// "name_arabic": "مجدي عبد الغفار معوض" +// }, +// { +// "phone": "+201061973544", +// "name_arabic": "راجي محمد حمدي أحمد الشامي" +// }, +// { +// "phone": "+201121738274", +// "name_arabic": "يوسف محمد عبد العال على السيد" +// }, +// { +// "phone": "+201111127420", +// "name_arabic": "ابراهيم شرقاوي محمدين عثمان" +// }, +// { +// "phone": "+201273559582", +// "name_arabic": "وليد السيد أمين محمد" +// }, +// { +// "phone": "+201126312269", +// "name_arabic": "احمد شعبان عبد الرضي احمد" +// }, +// { +// "phone": "+201150915383", +// "name_arabic": "السيد عادل السيد احمد" +// }, +// { +// "phone": "+201007605225", +// "name_arabic": "حسام فوزي بدوي جاد المولى" +// }, +// { +// "phone": "+201210818176", +// "name_arabic": "محمد على سليم سالم" +// }, +// { +// "phone": "+201007737308", +// "name_arabic": "عبد الحليم عاطف عبد الحليم كامل" +// }, +// { +// "phone": "+201033554256", +// "name_arabic": "محازم حسن فؤاد إسماعيل" +// }, +// { +// "phone": "+201111981450", +// "name_arabic": "مصطفى عمران إبراهيم أحمد" +// }, +// { +// "phone": "+201142985578", +// "name_arabic": "مصطفى عبد المنعم إبراهيم محمد" +// }, +// { +// "phone": "+201204688081", +// "name_arabic": "مؤمن حمدي عبد المنعم أحمد الغندور" +// }, +// { +// "phone": "+201124166622", +// "name_arabic": "كريم عطية أحمد شحاتة" +// }, +// { +// "phone": "+201001486990", +// "name_arabic": "سامي عبد التواب احمد ابراهيم" +// }, +// { +// "phone": "+201208579976", +// "name_arabic": "أحمد علاء الدين أبو الفتوح محمد ابونصره" +// }, +// { +// "phone": "+201501549612", +// "name_arabic": "يوسف محمد احمد عبدالمجيد" +// }, +// { +// "phone": "+201118869360", +// "name_arabic": "حمدي وحيد على ابراهيم" +// }, +// { +// "phone": "+201001536047", +// "name_arabic": "أشرف مرتضى منير سلام" +// }, +// { +// "phone": "+201281312772", +// "name_arabic": "أمير جميل تحقي سلمون" +// }, +// { +// "phone": "+201080491466", +// "name_arabic": "بولس بحير ميخائيل جوده" +// }, +// { +// "phone": "+201092200692", +// "name_arabic": "كريم محمد محمود البعيد" +// }, +// { +// "phone": "+201100614815", +// "name_arabic": "محمد فارس محمد هاشم" +// }, +// { +// "phone": "+201119188846", +// "name_arabic": "نصر احمد محمود دغش" +// }, +// { +// "phone": "+201141941402", +// "name_arabic": "ايهاب كمال حفني ابراهيم" +// }, +// { +// "phone": "+201201738126", +// "name_arabic": "سمير سامى غيطى عوض" +// }, +// { +// "phone": "+201018968090", +// "name_arabic": "عبد اللطيف السيد عبداللطيف عبد القادر" +// }, +// { +// "phone": "+201282558617", +// "name_arabic": "كيرلس ممدوح عزيز نصر الله" +// }, +// { +// "phone": "+201027703059", +// "name_arabic": "السيد محمد عرفة مسلم" +// }, +// { +// "phone": "+201126669098", +// "name_arabic": "معاذ مصطفى امير خليل" +// }, +// { +// "phone": "+201015554008", +// "name_arabic": "هيثم مصطفى محمد مصطفى" +// }, +// { +// "phone": "+201280832425", +// "name_arabic": "محمد شوقى عبد الغنى بدر" +// }, +// { +// "phone": "+201010684229", +// "name_arabic": "كريم خالد كمال عبد العلى" +// }, +// { +// "phone": "+201275662461", +// "name_arabic": "مينا عاطف لمعي شاكر" +// }, +// { +// "phone": "+201010475811", +// "name_arabic": "أحمد محمد عبد العزيز محمد زيادة" +// }, +// { +// "phone": "+201116661682", +// "name_arabic": "محمد محمد عبد اللاه محمدين" +// }, +// { +// "phone": "+201001616098", +// "name_arabic": "احمد محمد منصور علي" +// }, +// { +// "phone": "+201002877995", +// "name_arabic": "محمد وجدي محرم على" +// }, +// { +// "phone": "+201224535248", +// "name_arabic": "صلاح بتر العظيم محمد علي" +// }, +// { +// "phone": "+201019686424", +// "name_arabic": "عبد الرحمن جمال احمد عجمى" +// }, +// { +// "phone": "+201026458026", +// "name_arabic": "سعيد على محمد الأشعل" +// }, +// { +// "phone": "+201229331772", +// "name_arabic": "عمرو محمد رشاد عبد الحق بيومي" +// }, +// { +// "phone": "+201063688477", +// "name_arabic": "اكرم علي محمد علي" +// }, +// { +// "phone": "+201092070826", +// "name_arabic": "محمد سعيد ابراهيم محمود" +// }, +// { +// "phone": "+201013004000", +// "name_arabic": "كريم محمود خليل حافظ" +// }, +// { +// "phone": "+201008968686", +// "name_arabic": "محمود صبرى عمر عبد الرحمن" +// }, +// { +// "phone": "+201202079780", +// "name_arabic": "مها صبري محمد منصور" +// }, +// { +// "phone": "+201151395029", +// "name_arabic": "عمرو محمد عراقى محمد" +// }, +// { +// "phone": "+201202435604", +// "name_arabic": "محمد عصام محمد القيسي" +// }, +// { +// "phone": "+201158680006", +// "name_arabic": "محمد فرج علي حسن" +// }, +// { +// "phone": "+201001022044", +// "name_arabic": "حازم مناع عبد الحميد ابو حجر" +// }, +// { +// "phone": "+201288496608", +// "name_arabic": "شريف محمد مصطفي خضر" +// }, +// { +// "phone": "+201111999213", +// "name_arabic": "احمد عيد أحمد محمد يوسف" +// }, +// { +// "phone": "+201146791090", +// "name_arabic": "أحمد محمد محمد الحفنى عبد العاطى" +// }, +// { +// "phone": "+201004125091", +// "name_arabic": "محمد أحمد فؤاد محمد حسين" +// }, +// { +// "phone": "+201127994475", +// "name_arabic": "طارق عبد العظيم عيد عبد المقصود" +// }, +// { +// "phone": "+201022373396", +// "name_arabic": "كريم مجدي عبداللطيف عثمان" +// }, +// { +// "phone": "+201005697983", +// "name_arabic": "اكرامى اسماعيل عبد العظيم رضوان" +// }, +// { +// "phone": "+201270626113", +// "name_arabic": "طونى عدلى قرقار عطيه" +// }, +// { +// "phone": "+201020563705", +// "name_arabic": "هيثم محمد ربيع علي محمد" +// }, +// { +// "phone": "+201203456879", +// "name_arabic": "عماد نجيب عبده محمد السماحى" +// }, +// { +// "phone": "+201019859988", +// "name_arabic": "ايمن يحي ابو سريع محمد" +// }, +// { +// "phone": "+201111718210", +// "name_arabic": "محمد حسين عمر علي" +// }, +// { +// "phone": "+201017841416", +// "name_arabic": "مصطفى يسرى وحيد الدين عزت" +// }, +// { +// "phone": "+201111049151", +// "name_arabic": "محمد صبرى أبو علم محمد محمد" +// }, +// { +// "phone": "+201092212307", +// "name_arabic": "أحمد الحسينى احمد محمد" +// }, +// { +// "phone": "+201124762421", +// "name_arabic": "اسلام خليفة محمد محمد" +// }, +// { +// "phone": "+201096133443", +// "name_arabic": "عمر وليد مختار عبد الصمد" +// }, +// { +// "phone": "+201120168148", +// "name_arabic": "محمد عبد الخالق محمد عطيه على" +// }, +// { +// "phone": "+201021024502", +// "name_arabic": "إسلام إسماعيل محمد إسماعيل" +// }, +// { +// "phone": "+201116643449", +// "name_arabic": "هاشم محمد سيد مصطفى" +// }, +// { +// "phone": "+201121999951", +// "name_arabic": "عاطف محمد عبد الرحيم محمد خليل" +// }, +// { +// "phone": "+201141177699", +// "name_arabic": "ايهاب السيد حازم عبدالوهاب على" +// }, +// { +// "phone": "+201050090801", +// "name_arabic": "عبد الله محمد حسين محمد" +// }, +// { +// "phone": "+201094533310", +// "name_arabic": "محمد معوض سعد فيتور" +// }, +// { +// "phone": "+201008324190", +// "name_arabic": "عادل على عبد الفتاح مرسى" +// }, +// { +// "phone": "+201143721972", +// "name_arabic": "مهاب تامر عبد الخالق سعد زغلول" +// }, +// { +// "phone": "+201060575334", +// "name_arabic": "سيد عبد العزيز سيد عفيفى" +// }, +// { +// "phone": "+201159666640", +// "name_arabic": "مصطفى احمد جلال احمد ابراهيم" +// }, +// { +// "phone": "+201121262634", +// "name_arabic": "يوسف مختار عبد العزيز غلاب" +// }, +// { +// "phone": "+201067319130", +// "name_arabic": "احمد عبد الباسط فرحات سيف النصر" +// }, +// { +// "phone": "+201004088383", +// "name_arabic": "محمد أمين السيد صالح محمد" +// }, +// { +// "phone": "+201115610988", +// "name_arabic": "مينا كمال جرجس بضابا" +// }, +// { +// "phone": "+201003732688", +// "name_arabic": "عمرولبيب عبد السلام بدير" +// }, +// { +// "phone": "+201004658742", +// "name_arabic": "محمد جمعه محمد ابراهيم" +// }, +// { +// "phone": "+201115941573", +// "name_arabic": "محمد سيد على سعد" +// }, +// { +// "phone": "+201224217248", +// "name_arabic": "هانى فاروق ابراهيم محمود" +// }, +// { +// "phone": "+201555557980", +// "name_arabic": "عبد الله كمال عبد الفتاح علي" +// }, +// { +// "phone": "+201208047551", +// "name_arabic": "انطونيوس عبد المسيح زكي عجايبي" +// }, +// { +// "phone": "+201116036599", +// "name_arabic": "زكي محمد زكي "مهران" +// }, +// { +// "phone": "+201553684030", +// "name_arabic": "خالد سيد شعبان عبد الفتاح" +// }, +// { +// "phone": "+201029777011", +// "name_arabic": "صلاح عبد المقتدر محمد" +// }, +// { +// "phone": "+201020235190", +// "name_arabic": "وائل علي محمد علي" +// }, +// { +// "phone": "+201281084810", +// "name_arabic": "محمد احمد يوسف محمد" +// }, +// { +// "phone": "+201207217414", +// "name_arabic": "محمد محسن محمد جاد الكريم" +// }, +// { +// "phone": "+201285686701", +// "name_arabic": "محمد احمد ابراهيم احمد عمران" +// }, +// { +// "phone": "+201012003299", +// "name_arabic": "ياسر محمد سيد احمد عبد الغني" +// }, +// { +// "phone": "+201101626410", +// "name_arabic": "محمد حسين عبد الله عبد الرحيم" +// }, +// { +// "phone": "+201004798676", +// "name_arabic": "محمد محمود سنوسي علي" +// }, +// { +// "phone": "+201099009190", +// "name_arabic": "ابراهيم محمد نجيب ابراهيم عبد العظيم" +// }, +// { +// "phone": "+201113553123", +// "name_arabic": "عبد الناصر علي محمد محمد" +// }, +// { +// "phone": "+201221328517", +// "name_arabic": "محمود عبد الحميد عبد المعطي احمد" +// }, +// { +// "phone": "+201120803031", +// "name_arabic": "أحمد سمير مختار شعبان" +// }, +// { +// "phone": "+201095076266", +// "name_arabic": "محمد خالد محمد السيد" +// }, +// { +// "phone": "+201024420162", +// "name_arabic": "عبد الغدار محمد محمد عبد الغفار" +// }, +// { +// "phone": "+201116155328", +// "name_arabic": "عامة سيد أحمد على" +// }, +// { +// "phone": "+201228473270", +// "name_arabic": "سعد أمين سعد عبد الفتاح" +// }, +// { +// "phone": "+201014383049", +// "name_arabic": "أسامة فتحي علي فهمي إبراهيم" +// }, +// { +// "phone": "+201159775543", +// "name_arabic": "محمود وردانى محمود سعيد" +// }, +// { +// "phone": "+201023358753", +// "name_arabic": "محمد علاء عزت عبد السلام كسبه" +// }, +// { +// "phone": "+201550603925", +// "name_arabic": "محمود عبد الموجود عبد الحميد سعد" +// }, +// { +// "phone": "+201022446211", +// "name_arabic": "عبد الرحمن احمد يوسف محمود يوسف" +// }, +// { +// "phone": "+201159430166", +// "name_arabic": "ادهم حمدي لبيب محمد" +// }, +// { +// "phone": "+201279077816", +// "name_arabic": "مينا مجدي نصيف خله" +// }, +// { +// "phone": "+201151446542", +// "name_arabic": "صالح أمين محمد محمود" +// }, +// { +// "phone": "+201017267377", +// "name_arabic": "السيد جمعة أمين عطية" +// }, +// { +// "phone": "+201288614726", +// "name_arabic": "محمد أيمن سميح محمد" +// }, +// { +// "phone": "+201003970205", +// "name_arabic": "ايمان وحيد عبد الرازق محمد" +// }, +// { +// "phone": "+201005748724", +// "name_arabic": "فردوس صابر توفيق عبد الحميد" +// }, +// { +// "phone": "+201020211055", +// "name_arabic": "عبد الرحمن محمد عبد الرحمن متولي" +// }, +// { +// "phone": "+201144123660", +// "name_arabic": "احمد صلاح عبد العال عبد الله" +// }, +// { +// "phone": "+201227757571", +// "name_arabic": "محمود لطفي علي عثمان" +// }, +// { +// "phone": "+201033006950", +// "name_arabic": "محمد عبدالرازق محمد محمود الشبكشي" +// }, +// { +// "phone": "+201012338391", +// "name_arabic": "أسامه أمين باقوت عبد الحليم" +// }, +// { +// "phone": "+201228781347", +// "name_arabic": "عبد الرحمن مسعود اسماعيل مرسي" +// }, +// { +// "phone": "+201559614998", +// "name_arabic": "محمد أحمد محمد ياسين" +// }, +// { +// "phone": "+201007049944", +// "name_arabic": "طارق محمد مصطفى حافظ" +// }, +// { +// "phone": "+201033598513", +// "name_arabic": "رمضان عوض على عثمان" +// }, +// { +// "phone": "+201226782942", +// "name_arabic": "محمد محمد مسعد ديبون محمد" +// }, +// { +// "phone": "+201271818235", +// "name_arabic": "أحمد عطية عبد اللطيف حسين" +// }, +// { +// "phone": "+201110486666", +// "name_arabic": "إسلام جابر سيد محمد سليمان" +// }, +// { +// "phone": "+201065048819", +// "name_arabic": "ناجح فخري صديق عبد الظاهر" +// }, +// { +// "phone": "+201142381399", +// "name_arabic": "محمد علي عبد السلام الشرقاوي" +// }, +// { +// "phone": "+201095505197", +// "name_arabic": "عصام شعبان محمود طة العشماوي" +// }, +// { +// "phone": "+201273248259", +// "name_arabic": "ابراهيم مصطفي سعد محمد سعد" +// }, +// { +// "phone": "+201113786464", +// "name_arabic": "سمير طلعت عبد الله محمد جمعه" +// }, +// { +// "phone": "+201019217036", +// "name_arabic": "صفاء السيد العوضي السيد" +// }, +// { +// "phone": "+201111871482", +// "name_arabic": "محمد عبد المنعم صالح عيد" +// }, +// { +// "phone": "+201002884005", +// "name_arabic": "هاني عبد الرحيم محمد عثمان" +// }, +// { +// "phone": "+201147769989", +// "name_arabic": "محمد محمد ماهر عبد الوهاب السيد" +// }, +// { +// "phone": "+201120917643", +// "name_arabic": "خالد احمد عبد الراضي عليو" +// }, +// { +// "phone": "+201006911892", +// "name_arabic": "ماجده لويس صموئيل يوسف" +// }, +// { +// "phone": "+201151432789", +// "name_arabic": "أحمد محمد أحمد عبد الله" +// }, +// { +// "phone": "+201550145770", +// "name_arabic": "محمود أحمد عبد الحليم محمود" +// }, +// { +// "phone": "+201274007374", +// "name_arabic": "محمد عيد محمد احمد" +// }, +// { +// "phone": "+201000091230", +// "name_arabic": "تأمر بدر محمد علي" +// }, +// { +// "phone": "+201278324075", +// "name_arabic": "ميشيل زكريا أمين يوسف" +// }, +// { +// "phone": "+201144786966", +// "name_arabic": "محمد فؤاد أحمد فهمي" +// }, +// { +// "phone": "+201126002027", +// "name_arabic": "عطيه مصطفي عطية عبد المجيد" +// }, +// { +// "phone": "+201080463654", +// "name_arabic": "عبد الفتاح سيد عبد الفتاح احمد يوسف" +// }, +// { +// "phone": "+201021115393", +// "name_arabic": "احمد سيد شعبان فايز اللة" +// }, +// { +// "phone": "+201143631229", +// "name_arabic": "ناجي يوسف سليمان يوسف" +// }, +// { +// "phone": "+201015162969", +// "name_arabic": "منى عمر احمد عبد الرحمن" +// }, +// { +// "phone": "+201128652929", +// "name_arabic": "مصطفي يسري شعبان فيومي رضوان" +// }, +// { +// "phone": "+201070290269", +// "name_arabic": "صالح عبيد محمد سلامة" +// }, +// { +// "phone": "+201100263624", +// "name_arabic": "على رجب احمد عبد الكريم" +// }, +// { +// "phone": "+201119044711", +// "name_arabic": "احمد ايهاب أحمد عبد القادر" +// }, +// { +// "phone": "+201555577228", +// "name_arabic": "احمد ابراهيم محمد احمد يوسف" +// }, +// { +// "phone": "+201029135123", +// "name_arabic": "شاذلي تاج الدين شعبان عبد الغفار" +// }, +// { +// "phone": "+201156422481", +// "name_arabic": "أحمد خالد احمد محمد عبد الهادي" +// }, +// { +// "phone": "+201019069097", +// "name_arabic": "أحمد مصطفي السيد عطيه" +// }, +// { +// "phone": "+201212593592", +// "name_arabic": "جهاد سالم احمد كامل" +// }, +// { +// "phone": "+201018996860", +// "name_arabic": "عبد الله عبد المعبود محمد العزب الشيخ" +// }, +// { +// "phone": "+201151109266", +// "name_arabic": "محمد احمد امين محمود" +// }, +// { +// "phone": "+201017967660", +// "name_arabic": "محمود عبد الوهاب عبد الله صالح" +// }, +// { +// "phone": "+201001652464", +// "name_arabic": "احمد سيد أحمد عبد الله" +// }, +// { +// "phone": "+201008235676", +// "name_arabic": "طارق جمال احمد ابراهيم" +// }, +// { +// "phone": "+201012038361", +// "name_arabic": "منصور حسين منصور حافظ" +// }, +// { +// "phone": "+201010490869", +// "name_arabic": "مصطفى أمين أمين مصطفي" +// }, +// { +// "phone": "+201021558237", +// "name_arabic": "مؤمن عماد فاروق محمد" +// }, +// { +// "phone": "+201285980741", +// "name_arabic": "عمر السيد عتريس متولى بحالو" +// }, +// { +// "phone": "+201012848900", +// "name_arabic": "السيد عبد المنعم السيد اغا" +// }, +// { +// "phone": "+201013632002", +// "name_arabic": "محمود اشرف فتحي عبدالنبي" +// }, +// { +// "phone": "+201003624502", +// "name_arabic": "جهاد عبد الله عبد المطلب بدوي" +// }, +// { +// "phone": "+201113285250", +// "name_arabic": "حمادة احمد بدر عبد اللطيف" +// }, +// { +// "phone": "+201141191135", +// "name_arabic": "احمد طارق ابراهيم غريب" +// }, +// { +// "phone": "+201027900384", +// "name_arabic": "شادي محمود محمد رضا" +// }, +// { +// "phone": "+201003557556", +// "name_arabic": "مجدي زكي عبدة مصطفي" +// }, +// { +// "phone": "+201272021184", +// "name_arabic": "عبد النور كمال زكى اسكندر" +// }, +// { +// "phone": "+201227070538", +// "name_arabic": "وليد صابر عبد العزيز عبد السلام" +// }, +// { +// "phone": "+201091020918", +// "name_arabic": "محمود بدر الدين رسمى مرسى محمد" +// }, +// { +// "phone": "+201030985581", +// "name_arabic": "محمد عبد الله ابراهيم الخشن" +// }, +// { +// "phone": "+201040531423", +// "name_arabic": "عادل عبد العزيز غريب ابراهيم" +// }, +// { +// "phone": "+201153094925", +// "name_arabic": "مني محمود احمد" +// }, +// { +// "phone": "+201061897962", +// "name_arabic": "هاني صلاح الدين جمعة احمد" +// }, +// { +// "phone": "+201006342234", +// "name_arabic": "محمود حامد محمد حامد" +// }, +// { +// "phone": "+201113891643", +// "name_arabic": "طارق عمرو جمعة ابراهيم" +// }, +// { +// "phone": "+201065635907", +// "name_arabic": "جمال الدين عيد علي سيد احمد" +// }, +// { +// "phone": "+201201383512", +// "name_arabic": "حمود عماد الدين علي محمد علي" +// }, +// { +// "phone": "+201022518181", +// "name_arabic": "عمرو طاهر محمد ابراهيم" +// }, +// { +// "phone": "+201202912341", +// "name_arabic": "صابر لويس رزق عبدالملاك" +// }, +// { +// "phone": "+201152336491", +// "name_arabic": "عه محمود حسن محمود" +// }, +// { +// "phone": "+201023248455", +// "name_arabic": "السيد عزت محمد السيد" +// }, +// { +// "phone": "+201147333047", +// "name_arabic": "محمد رجب احمد عبد الغني" +// }, +// { +// "phone": "+201063496655", +// "name_arabic": "جبر محمود السعيد زيادة" +// }, +// { +// "phone": "+201551418313", +// "name_arabic": "ايهاب عبد العاطي فريج لوقا" +// }, +// { +// "phone": "+201008069186", +// "name_arabic": "محمود عصام الدين عبد المعتمد عثمان" +// }, +// { +// "phone": "+201221041254", +// "name_arabic": "كيرلس فوزى كامل حنا شرقاوى" +// }, +// { +// "phone": "+201151614308", +// "name_arabic": "محمد عمران ثابت عمران" +// }, +// { +// "phone": "+201143490888", +// "name_arabic": "طارق سعد أحمد أحمد سلام" +// }, +// { +// "phone": "+201097387004", +// "name_arabic": "أشرف حامد حامد أحمد" +// }, +// { +// "phone": "+201225958509", +// "name_arabic": "مجدى محمود محمد رزيق" +// }, +// { +// "phone": "+201221318746", +// "name_arabic": "محمد حسن محمد عبد الحليم" +// }, +// { +// "phone": "+201100404767", +// "name_arabic": "أحمد محمد السيد عبد الله" +// }, +// { +// "phone": "+201026200067", +// "name_arabic": "احمد يسري السيد عبد الحميد" +// }, +// { +// "phone": "+201151867248", +// "name_arabic": "خالد عبد القوي احمد صبرة على" +// }, +// { +// "phone": "+201064921214", +// "name_arabic": "احمد علي احمد عبد الرحمن" +// }, +// { +// "phone": "+201066311663", +// "name_arabic": "احمد فايز السيد عبد الفتاح" +// }, +// { +// "phone": "+201208414347", +// "name_arabic": "محمد سمير حسن أحمد عبد العزيز" +// }, +// { +// "phone": "+201147504941", +// "name_arabic": "اسماعيل ابراهيم اسماعيل حسين" +// }, +// { +// "phone": "+201069923404", +// "name_arabic": "محمود محمد عباس منصور" +// }, +// { +// "phone": "+201270550493", +// "name_arabic": "محمود مصطفى محمود محمد عبد الحميد" +// }, +// { +// "phone": "+201222143516", +// "name_arabic": "خالد فراج احمد محمد" +// }, +// { +// "phone": "+201117428227", +// "name_arabic": "عبد الغنى خلف عبد الغنى أبو العلا" +// }, +// { +// "phone": "+201004361687", +// "name_arabic": "احمد رافت احمد علي حسن" +// }, +// { +// "phone": "+201159566584", +// "name_arabic": "احمد اكمل احمد عبد المحسن" +// }, +// { +// "phone": "+201143335405", +// "name_arabic": "علي احمد علي محمد حمادة" +// }, +// { +// "phone": "+201114568129", +// "name_arabic": "احمد مصطفي أحمد مصطفي" +// }, +// { +// "phone": "+201275200924", +// "name_arabic": "يوسف نبيل يوسف عزيز" +// }, +// { +// "phone": "+201153388988", +// "name_arabic": "حسام أحمد عادل محمد رضوان احمد" +// }, +// { +// "phone": "+201025647745", +// "name_arabic": "ناصر تهامى تهامى عبد العال" +// }, +// { +// "phone": "+201555888091", +// "name_arabic": "تامر سيف جودة محمد الطاهر" +// }, +// { +// "phone": "+201128716058", +// "name_arabic": "حسن احمد احمد محمد" +// }, +// { +// "phone": "+201111398861", +// "name_arabic": "محمود كريم عطا عبد الرحيم" +// }, +// { +// "phone": "+201287839817", +// "name_arabic": "سمير ناجح حلمي عبد الملاك" +// }, +// { +// "phone": "+201552508208", +// "name_arabic": "جرجس كمال فلتاؤوس بكليداس" +// }, +// { +// "phone": "+201023014693", +// "name_arabic": "عبد الحميد حسب النبي متولي شلوف" +// }, +// { +// "phone": "+201032738610", +// "name_arabic": "احمد يسرى عبد الرحيم اسحاق" +// }, +// { +// "phone": "+201122520420", +// "name_arabic": "كريم حسن على محمود" +// }, +// { +// "phone": "+201223009519", +// "name_arabic": "صادق محمد صادق محمد درويش" +// }, +// { +// "phone": "+201018518723", +// "name_arabic": "وليد محمد فوزى فهمى شمس" +// }, +// { +// "phone": "+201018984078", +// "name_arabic": "أحمد ياسر السيد عبد العزيز" +// }, +// { +// "phone": "+201128144862", +// "name_arabic": "السيد شوقي السيد عفيفى شاهين" +// }, +// { +// "phone": "+201273073912", +// "name_arabic": "مايكل سعيد عزمي صموئيل" +// }, +// { +// "phone": "+201030835987", +// "name_arabic": "محمود سامى سعد زغلول السيد" +// }, +// { +// "phone": "+201111667567", +// "name_arabic": "عبد الرحمن محمد احمد محمد" +// }, +// { +// "phone": "+201142224902", +// "name_arabic": "محمود محمد السيد الفولي" +// }, +// { +// "phone": "+201030920006", +// "name_arabic": "محمد سيد حسني خليل" +// }, +// { +// "phone": "+201010789827", +// "name_arabic": "احمد محمد عبد الرحمن محمود" +// }, +// { +// "phone": "+201018388375", +// "name_arabic": "عمرو عزت احمد عبد الحافظ" +// }, +// { +// "phone": "+201225004490", +// "name_arabic": "محمد يحى بدران مغربي" +// }, +// { +// "phone": "+201200622072", +// "name_arabic": "فيلوباتير مينا رسمى حنا فرج" +// }, +// { +// "phone": "+201100711857", +// "name_arabic": "أحمد محمد أحمد هاشم" +// }, +// { +// "phone": "+201016497939", +// "name_arabic": "مصطفي أحمد سعيد محمد عبد العظيم" +// }, +// { +// "phone": "+201276908024", +// "name_arabic": "اسلام عيد عثمان محمود" +// }, +// { +// "phone": "+201211025498", +// "name_arabic": "كيرلس سمير غطاس زكى" +// }, +// { +// "phone": "+201117427885", +// "name_arabic": "صموئيل فادي نجيب لبيب" +// }, +// { +// "phone": "+201111179306", +// "name_arabic": "ناير نبيل شنوده عطيه" +// }, +// { +// "phone": "+201127014274", +// "name_arabic": "سيف نصر عبد الفتاح احمد" +// }, +// { +// "phone": "+201289723337", +// "name_arabic": "كيرلس رامى سعد ضانى" +// }, +// { +// "phone": "+201152994061", +// "name_arabic": "عبد الله رجب مبارك خليفة" +// }, +// { +// "phone": "+201066730578", +// "name_arabic": "محمد فؤاد مرسى عبد الجواد" +// }, +// { +// "phone": "+201283405351", +// "name_arabic": "مصطفي محمد سالم محمود" +// }, +// { +// "phone": "+201275983533", +// "name_arabic": "مدحت مختار محمد" +// }, +// { +// "phone": "+201100668648", +// "name_arabic": "جيهان سيد محمد حافظ" +// }, +// { +// "phone": "+201551141835", +// "name_arabic": "خالد محمد سامي كامل حسن" +// }, +// { +// "phone": "+201212754425", +// "name_arabic": "ريهام نضر مجد الدين عبد الرحمن الكيلانى" +// }, +// { +// "phone": "+201118221060", +// "name_arabic": "عمرو رجب عبدة على صوان" +// }, +// { +// "phone": "+201104904858", +// "name_arabic": "عزيز ابراهيم صبحي محمد" +// }, +// { +// "phone": "+201080322306", +// "name_arabic": "محمد أحمد عبد الله أحمد عسلة" +// }, +// { +// "phone": "+201060795727", +// "name_arabic": "محمد عبد المعين عبد العزيز عبد المعين" +// }, +// { +// "phone": "+201126461387", +// "name_arabic": "ايمن مصطفى محمود فهمى" +// }, +// { +// "phone": "+201206130877", +// "name_arabic": "محمد سامح محمد كمال محمود نوفل" +// }, +// { +// "phone": "+201211148088", +// "name_arabic": "عصام عبد الفتاح محمد حمام" +// }, +// { +// "phone": "+201093981308", +// "name_arabic": "كريم حسام الدين أحمد سليم" +// }, +// { +// "phone": "+201126027390", +// "name_arabic": "خالد محمد عبد العاطى محجوب" +// }, +// { +// "phone": "+201110575196", +// "name_arabic": "فتحى خالد فتحي اسماعيل" +// }, +// { +// "phone": "+201013615311", +// "name_arabic": "محمود حمزة مرسي ابراهيم" +// }, +// { +// "phone": "+201147450441", +// "name_arabic": "محمود محمد خليل محمد" +// }, +// { +// "phone": "+201279823544", +// "name_arabic": "سمير اسكندر فهيم سيف" +// }, +// { +// "phone": "+201271132209", +// "name_arabic": "علاء محمد محمد حسن" +// }, +// { +// "phone": "+201064209145", +// "name_arabic": "احمد مجدي محمود الشيخ علي" +// }, +// { +// "phone": "+201023248488", +// "name_arabic": "السيد عزت محمد السيد" +// }, +// { +// "phone": "+201062415502", +// "name_arabic": "محمد عبد التواب عبد الله نصر" +// }, +// { +// "phone": "+201212479538", +// "name_arabic": "عباس عزيز نخنوخ اسكندر" +// }, +// { +// "phone": "+201559170967", +// "name_arabic": "زياد عيد محمد عبد المنعم" +// }, +// { +// "phone": "+201204023121", +// "name_arabic": "مارتن مدحت ميشيل عبد المسيح حنا" +// }, +// { +// "phone": "+201112000443", +// "name_arabic": "محسن محمد جاد خفاجى" +// }, +// { +// "phone": "+201004339194", +// "name_arabic": "محمد رمضان حسن عله" +// }, +// { +// "phone": "+201225001313", +// "name_arabic": "هيثم ماجد احمد عزمي علام" +// }, +// { +// "phone": "+201110333451", +// "name_arabic": "حازم عبدالله معوض معوض البهادي" +// }, +// { +// "phone": "+201555452243", +// "name_arabic": "عيد يحى عيد جاد" +// }, +// { +// "phone": "+201119079364", +// "name_arabic": "محمد جمال أبو المعاطي على" +// }, +// { +// "phone": "+201070486352", +// "name_arabic": "عبد الرحمن على السيد هرمل" +// }, +// { +// "phone": "+201158126379", +// "name_arabic": "محمد جمعة عبد الحميد جبالى" +// }, +// { +// "phone": "+201002361841", +// "name_arabic": "محمود عبدالرحمن أحمد عبد الرحمن" +// }, +// { +// "phone": "+201142088851", +// "name_arabic": "عمرو احمد اسماعيل عبد العظيم" +// }, +// { +// "phone": "+201127942065", +// "name_arabic": "عبد الرحمن محمد محمود سليمان" +// }, +// { +// "phone": "+201225570507", +// "name_arabic": "محمد سلام عدلى: اسماعيل" +// }, +// { +// "phone": "+201118215214", +// "name_arabic": "داود مرور القاهرة" +// }, +// { +// "phone": "+201223705456", +// "name_arabic": "عبد الرحمن صبحى حسن عبده النعناعى" +// }, +// { +// "phone": "+201129823353", +// "name_arabic": "محمد جمعة ابراهيم الصوابي" +// }, +// { +// "phone": "+201022059283", +// "name_arabic": "محمد عماره أبو ضيف عمارة" +// }, +// { +// "phone": "+201004965744", +// "name_arabic": "أحمد مدحت حسن حسن" +// }, +// { +// "phone": "+201064684185", +// "name_arabic": "عماد عبد الفتاح عبد العاطى على" +// }, +// { +// "phone": "+201016601060", +// "name_arabic": "عماد محمد شبل نصر" +// }, +// { +// "phone": "+201006681860", +// "name_arabic": "سليمان عبد الرحيم سليمان اسماعيل" +// }, +// { +// "phone": "+201010743158", +// "name_arabic": "سامح سامي سعد عازر" +// }, +// { +// "phone": "+201002176925", +// "name_arabic": "أحمد حمزة عبد العاطى غريب" +// }, +// { +// "phone": "+201275904778", +// "name_arabic": "ابانوب صبري مهني متي مقار" +// }, +// { +// "phone": "+201061090454", +// "name_arabic": "محمد نصر عبد الحميد ابراهيم ابو زيد" +// }, +// { +// "phone": "+201103223408", +// "name_arabic": "محمود حسين عبد العظيم سيد حميد" +// }, +// { +// "phone": "+201009080685", +// "name_arabic": "محمود احمد محمود محمد عطا" +// }, +// { +// "phone": "+201060371260", +// "name_arabic": "على فتحى على السيد على" +// }, +// { +// "phone": "+201221285600", +// "name_arabic": "محمد محمد عبد القادر عبد النبي" +// }, +// { +// "phone": "+201000886544", +// "name_arabic": "سيدة محمد احمد عبد الرازق" +// }, +// { +// "phone": "+201029809024", +// "name_arabic": "محمد صابر يوسف معوض" +// }, +// { +// "phone": "+201140826987", +// "name_arabic": "احمد عصام أنور عبده" +// }, +// { +// "phone": "+201100082801", +// "name_arabic": "شريف اشرف محمد على مرزوق" +// }, +// { +// "phone": "+201127471177", +// "name_arabic": "يوسف مصطفي يوسف احمد" +// }, +// { +// "phone": "+201120732419", +// "name_arabic": "أبو أمين محرم فرغلى محمد" +// }, +// { +// "phone": "+201003562562", +// "name_arabic": "اشجان عيد عبد العزيز التهامي" +// }, +// { +// "phone": "+201023707373", +// "name_arabic": "احمد بحر محمد احمد" +// }, +// { +// "phone": "+201140490935", +// "name_arabic": "ابراهيم ابوزيد عبد العزيز أبوزيد" +// }, +// { +// "phone": "+201002399804", +// "name_arabic": "محمد سليمان محمد احمد" +// }, +// { +// "phone": "+201140223325", +// "name_arabic": "دسوقي عيد تسوقي خليل" +// }, +// { +// "phone": "+201155072426", +// "name_arabic": "مصطفى احمد عبد الحميد أحمد" +// }, +// { +// "phone": "+201206069834", +// "name_arabic": "سامح الشحات غنيمي ابراهيم" +// }, +// { +// "phone": "+201025393959", +// "name_arabic": "رحاب محمد ناصف السيد" +// }, +// { +// "phone": "+201147508322", +// "name_arabic": "ياسين محسن محمود حسن" +// }, +// { +// "phone": "+201144181789", +// "name_arabic": "محمد احمد محمد حسن ابو شوشه" +// }, +// { +// "phone": "+201040535096", +// "name_arabic": "علي محمود عبد الحكيم احمد" +// }, +// { +// "phone": "+201000228580", +// "name_arabic": "محمود محمد احمد حسين" +// }, +// { +// "phone": "+201003614774", +// "name_arabic": "محمد مجد الدين محمد سالم فريخ" +// }, +// { +// "phone": "+201226672939", +// "name_arabic": "محمد احمد يوسف محمد" +// }, +// { +// "phone": "+201289723730", +// "name_arabic": "كيرلس مينا أسكاروس ملك أسكاروس" +// }, +// { +// "phone": "+201012856677", +// "name_arabic": "محمد عبد الوهاب مصطفي الحسنين" +// }, +// { +// "phone": "+201010010322", +// "name_arabic": "أحمد سيد محمد السيد" +// }, +// { +// "phone": "+201002132085", +// "name_arabic": "صلاح سالم محمد غنيم" +// }, +// { +// "phone": "+201123318943", +// "name_arabic": "بدر أحمد بدر سيد محمد" +// }, +// { +// "phone": "+201227237013", +// "name_arabic": "جوزيف فايز عطاالله ميخائيل" +// }, +// { +// "phone": "+201554435301", +// "name_arabic": "محمد جوده السيد الدريني" +// }, +// { +// "phone": "+201277606290", +// "name_arabic": "يوسف احمد محمد علي" +// }, +// { +// "phone": "+201003947799", +// "name_arabic": "محمود عنتر السيد محمد" +// }, +// { +// "phone": "+201116362464", +// "name_arabic": "محمد صلاح الدين عبد المعطي عطية" +// }, +// { +// "phone": "+201068673929", +// "name_arabic": "سعيد فتحى أحمد فرج" +// }, +// { +// "phone": "+201149458282", +// "name_arabic": "محمد سيد احمد سرحان" +// }, +// { +// "phone": "+201015994940", +// "name_arabic": "خالد السيد على السيد" +// }, +// { +// "phone": "+201080578502", +// "name_arabic": "محمد سعيد على عبد الوهاب" +// }, +// { +// "phone": "+201277117926", +// "name_arabic": "أسامه جمال محمد الجيزاوى" +// }, +// { +// "phone": "+201207282602", +// "name_arabic": "أحمد محمد عبد السلام أحمد" +// }, +// { +// "phone": "+201127000498", +// "name_arabic": "جميل عبد الحميد عبد الحميد الشال" +// }, +// { +// "phone": "+201015747118", +// "name_arabic": "احمد رفعت على عطية" +// }, +// { +// "phone": "+201143294658", +// "name_arabic": "عبد الرحمن ياسر عبد الرحمن عفيفى" +// }, +// { +// "phone": "+201279928663", +// "name_arabic": "احمد صلاح محمد ابراهيم الليثي" +// }, +// { +// "phone": "+201001484302", +// "name_arabic": "عصام جاد محمد عثمان" +// }, +// { +// "phone": "+201149596137", +// "name_arabic": "أحمد علاء عباس حسن" +// }, +// { +// "phone": "+201229082850", +// "name_arabic": "محمد سعيد عبد الله بسيوني" +// }, +// { +// "phone": "+201120194397", +// "name_arabic": "احمد عصام أحمد محمد" +// }, +// { +// "phone": "+201116684607", +// "name_arabic": "عبد الرحمن سعيد إبراهيم محمد" +// }, +// { +// "phone": "+201015084707", +// "name_arabic": "سيد محمود محمد البكرى" +// }, +// { +// "phone": "+201150379619", +// "name_arabic": "محمد حسن هاشم خليفه" +// }, +// { +// "phone": "+201117749231", +// "name_arabic": "احمد عبد المنعم عبد العزيز عبد المنعم" +// }, +// { +// "phone": "+201111754283", +// "name_arabic": "محمد خالد مصطفى هاشم" +// }, +// { +// "phone": "+201008864162", +// "name_arabic": "سمير خميس شعبان خليفه" +// }, +// { +// "phone": "+201020972669", +// "name_arabic": "هشام ياسين ياقوت السيد" +// }, +// { +// "phone": "+201094688043", +// "name_arabic": "رضوي بدوي أبوالوفا جاد الرب" +// }, +// { +// "phone": "+201222844754", +// "name_arabic": "السيد محمد إبراهيم أحمد سعفان" +// }, +// { +// "phone": "+201020060588", +// "name_arabic": "معتز جمال المحمدي الامام" +// }, +// { +// "phone": "+201093067668", +// "name_arabic": "عمرو محمد شبل الجارية" +// }, +// { +// "phone": "+201100485561", +// "name_arabic": "حامد أحمد توفيق هديوه" +// }, +// { +// "phone": "+201140111581", +// "name_arabic": "احمد سعيد محمد حسن" +// }, +// { +// "phone": "+201271160173", +// "name_arabic": "عبد العال هانى عبد العال سيد احمد" +// }, +// { +// "phone": "+201017672180", +// "name_arabic": "مصطفى طارق احمد محمود" +// }, +// { +// "phone": "+201128893129", +// "name_arabic": "أحمد كمال السيد محمد" +// }, +// { +// "phone": "+201027213139", +// "name_arabic": "محمد وجبة ذكي نجم" +// }, +// { +// "phone": "+201062309323", +// "name_arabic": "مينا موسي عياد جرجس" +// }, +// { +// "phone": "+201008269802", +// "name_arabic": "رياض صبحى عبد الجواد امام محمد" +// }, +// { +// "phone": "+201113617737", +// "name_arabic": "هيثم عبد المنعم محمد عزام" +// }, +// { +// "phone": "+201004520666", +// "name_arabic": "فتحى مسعد احمد يوسف" +// }, +// { +// "phone": "+201124868717", +// "name_arabic": "مصطفى حافظ عوض احمد" +// }, +// { +// "phone": "+201150352022", +// "name_arabic": "لبني ابو النصر عبد الرحمن محمد" +// }, +// { +// "phone": "+201206600861", +// "name_arabic": "محمد فوزى ولى الله خليفه" +// }, +// { +// "phone": "+201126047174", +// "name_arabic": "محمد خالد محمد على عبد السلام" +// }, +// { +// "phone": "+201150678191", +// "name_arabic": "عبد العزيز عيد عبد الله شحات" +// }, +// { +// "phone": "+201146935837", +// "name_arabic": "أحمد عبد النعيم احمد محمد" +// }, +// { +// "phone": "+201150516739", +// "name_arabic": "محمد جمال الدين محمد محمد" +// }, +// { +// "phone": "+201011927516", +// "name_arabic": "محمود أحمد علي عبد" +// }, +// { +// "phone": "+201066465787", +// "name_arabic": "محمد عبد الله احمد الغزاوي" +// }, +// { +// "phone": "+201017212144", +// "name_arabic": "إبراهيم خليل ابراهيم دسوقي" +// }, +// { +// "phone": "+201002953188", +// "name_arabic": "عبد الرحمن اشرف عبد العظيم امين" +// }, +// { +// "phone": "+201022396386", +// "name_arabic": "احمد محمد احمد كامل" +// }, +// { +// "phone": "+201095956669", +// "name_arabic": "على صديق محمد سيد أحمد الفيومى" +// }, +// { +// "phone": "+201032900804", +// "name_arabic": "احمد محمود لبيب حسن" +// }, +// { +// "phone": "+201023248456", +// "name_arabic": "hamza ayed" +// }, +// { +// "phone": "+201092204878", +// "name_arabic": "محمد رشيد خاتم سليمان" +// }, +// { +// "phone": "+201010382250", +// "name_arabic": "أحمد محمد حسين عبد الرحيم الجمل" +// }, +// { +// "phone": "+201111265026", +// "name_arabic": "ياسر الحنفى على بدر" +// }, +// { +// "phone": "+201556754333", +// "name_arabic": "بيشوى بولس عزيز بولس" +// }, +// { +// "phone": "+201008073697", +// "name_arabic": "احمد حمدى عبد المقصود خضر" +// }, +// { +// "phone": "+201018861694", +// "name_arabic": "أحمد رشاد محمد هلال" +// }, +// { +// "phone": "+201005126645", +// "name_arabic": "محمد سيد احمد عبدة" +// }, +// { +// "phone": "+201064644619", +// "name_arabic": "محمد اسماعيل مصطفى محمد" +// }, +// { +// "phone": "+201011981316", +// "name_arabic": "مصطفى محسن محمد هيبة" +// }, +// { +// "phone": "+201102645297", +// "name_arabic": "عبد الرحمن اسامه انور محمد" +// }, +// { +// "phone": "+201095243011", +// "name_arabic": "نبيل نبيل محمد ابراهيم" +// }, +// { +// "phone": "+201090090088", +// "name_arabic": "وائل جمال حسني عبد الله" +// }, +// { +// "phone": "+201080753133", +// "name_arabic": "احمد محمد عبد الرحمن عطيه الشربيني" +// }, +// { +// "phone": "+201555977658", +// "name_arabic": "عمرو الحسيني السيد مسعود" +// }, +// { +// "phone": "+201006119945", +// "name_arabic": "أحمد عيد فتحى عبد الرازق" +// }, +// { +// "phone": "+201228895784", +// "name_arabic": "مينا جوهر حليم جوهر" +// }, +// { +// "phone": "+201158026013", +// "name_arabic": "محمد سيد محمد سيد" +// }, +// { +// "phone": "+201200303320", +// "name_arabic": "هيثم ابراهيم محمد احمد" +// }, +// { +// "phone": "+201103410907", +// "name_arabic": "محمد أشرف يوسف درويش" +// }, +// { +// "phone": "+201111015505", +// "name_arabic": "أشرف كساب احمد حسن" +// }, +// { +// "phone": "+201003699559", +// "name_arabic": "علاء الدين أحمد عبد العظيم رزق الزلباني" +// }, +// { +// "phone": "+201154691491", +// "name_arabic": "محمد عماد الدين محمد صلاح الدين" +// }, +// { +// "phone": "+201015012413", +// "name_arabic": "محمد سمير ابراهيم عبد الحميد" +// }, +// { +// "phone": "+201205419526", +// "name_arabic": "احمد اشرف ماهر عبد الحليم" +// }, +// { +// "phone": "+201129808001", +// "name_arabic": "احمد محمد رجب عبد التواب" +// }, +// { +// "phone": "+201012072012", +// "name_arabic": "يوسف تامر أحمد أنور رجب" +// }, +// { +// "phone": "+201064178167", +// "name_arabic": "عماد سليمان محمد عامر" +// }, +// { +// "phone": "+201118042885", +// "name_arabic": "محمود خالد محمد علي" +// }, +// { +// "phone": "+201060090105", +// "name_arabic": "ماجد محمد عطوه عبدالنبى" +// }, +// { +// "phone": "+201060040065", +// "name_arabic": "حسين محمد حسين إبراهيم" +// }, +// { +// "phone": "+201028237575", +// "name_arabic": "ماهر احمد ابو بكر عبد الله" +// }, +// { +// "phone": "+201141549347", +// "name_arabic": "محمد سيد أمين محمد" +// }, +// { +// "phone": "+201202211450", +// "name_arabic": "محمد جمعه جابر جمعه" +// }, +// { +// "phone": "+201287422122", +// "name_arabic": "سعيد حسونه اسكندر على" +// }, +// { +// "phone": "+201128661681", +// "name_arabic": "احمد صلاح عبد الحليم السيد" +// }, +// { +// "phone": "+201125836222", +// "name_arabic": "سيد حنفى احمد السيد" +// }, +// { +// "phone": "+201112704012", +// "name_arabic": "فرج حسن عبد الحليم محمد" +// }, +// { +// "phone": "+201001279316", +// "name_arabic": "محمد سامى جابر احمد احمد" +// }, +// { +// "phone": "+201009007245", +// "name_arabic": "ياسر محمد محمد غلوش" +// }, +// { +// "phone": "+201226843717", +// "name_arabic": "بيشوي جيزة ميلاد ميخائيل" +// }, +// { +// "phone": "+201001657597", +// "name_arabic": "سامح عزت رزق الله جرجس" +// }, +// { +// "phone": "+201222140640", +// "name_arabic": "هشام احمد السيد شفيق على ابراهيم" +// }, +// { +// "phone": "+201120134149", +// "name_arabic": "أحمد كمال فتحى على" +// }, +// { +// "phone": "+201002050890", +// "name_arabic": "طه بدر عثمان على" +// }, +// { +// "phone": "+201501602948", +// "name_arabic": "بيشوى نبيل معوض فرج عبد السيد" +// }, +// { +// "phone": "+201146530808", +// "name_arabic": "احمد محمد حسن جمعه" +// }, +// { +// "phone": "+201069656595", +// "name_arabic": "محمد سعيد عبد القادر على" +// }, +// { +// "phone": "+201095782382", +// "name_arabic": "أحمد محمد أحمد محمد جاد" +// }, +// { +// "phone": "+201062323415", +// "name_arabic": "أحمد حمدي قرني مسلم" +// }, +// { +// "phone": "+201033700126", +// "name_arabic": "محمد حسن عبدالبر محمد عوض" +// }, +// { +// "phone": "+201150481980", +// "name_arabic": "مصطفى محمد حسين متولى" +// }, +// { +// "phone": "+201120330421", +// "name_arabic": "عبد الرحمن محمود السيد حسن" +// }, +// { +// "phone": "+201116328847", +// "name_arabic": "عبد الله شريف عبد السلام الروبى" +// }, +// { +// "phone": "+201070324468", +// "name_arabic": "كيرلس ناصر حلمى عبود" +// }, +// { +// "phone": "+201001460169", +// "name_arabic": "احمد كافور محمد بخيت" +// }, +// { +// "phone": "+201112215276", +// "name_arabic": "هارون عبد الله عبد العال علي" +// }, +// { +// "phone": "+201118332277", +// "name_arabic": "على نصر محمد على" +// }, +// { +// "phone": "+201113305615", +// "name_arabic": "اشرف علي عواد علي" +// }, +// { +// "phone": "+201118853024", +// "name_arabic": "ايمن ايهاب السيد ابراهيم" +// }, +// { +// "phone": "+201125067984", +// "name_arabic": "اسلام صابر سيد دسوقى" +// }, +// { +// "phone": "+201279543558", +// "name_arabic": "محمد اسامة محمد محمد مصطفى" +// }, +// { +// "phone": "+201126255847", +// "name_arabic": "مصطفى على محمد على" +// }, +// { +// "phone": "+201119703441", +// "name_arabic": "أحمد سامى حسين محمود" +// }, +// { +// "phone": "+201226985936", +// "name_arabic": "عبد العظيم جمال عبد العظيم ابراهيم سليمان" +// }, +// { +// "phone": "+201021520195", +// "name_arabic": "مصطفى نصر محمود محمد" +// }, +// { +// "phone": "+201157693835", +// "name_arabic": "محمد أشرف شاكر عبد الحميد" +// }, +// { +// "phone": "+201158606366", +// "name_arabic": "محمد طه محمد عويس" +// }, +// { +// "phone": "+201010887705", +// "name_arabic": "ابراهيم السيد ابراهيم علي" +// }, +// { +// "phone": "+201030096464", +// "name_arabic": "محمد خيرى محمد عبد الموجود" +// }, +// { +// "phone": "+201063771920", +// "name_arabic": "محمد صبحى محمد عمر غنيم" +// }, +// { +// "phone": "+201000132703", +// "name_arabic": "احمد حسن محمد محمد" +// }, +// { +// "phone": "+201227273043", +// "name_arabic": "شعبان فوزي شعبان ابراهيم" +// }, +// { +// "phone": "+201200811161", +// "name_arabic": "عمرو يحي محمد سيد ابو الخير" +// }, +// { +// "phone": "+201147912222", +// "name_arabic": "أحمد سامى محمد طه الدجوى" +// }, +// { +// "phone": "+201099915861", +// "name_arabic": "محسن صابر محمد محمود" +// }, +// { +// "phone": "+201019805068", +// "name_arabic": "محمد احمد فوزي عبد الرازق" +// }, +// { +// "phone": "+201116985014", +// "name_arabic": "حازم عبد الباسط عبد العاطى محجوب" +// }, +// { +// "phone": "+201000314101", +// "name_arabic": "احمد عبد الرازق عز الدين الهجرسى" +// }, +// { +// "phone": "+201223874421", +// "name_arabic": "هشام احمد ابراهيم علي" +// }, +// { +// "phone": "+201000480175", +// "name_arabic": "عمرو عبد الحميد أحمد فهمى" +// }, +// { +// "phone": "+201003812665", +// "name_arabic": "محمد ابراهيم ابراهيم السولية" +// }, +// { +// "phone": "+201151845956", +// "name_arabic": "سامح شديد محمد محمد شادى" +// }, +// { +// "phone": "+201007006197", +// "name_arabic": "محمد حمدى سعد محمد الدمنهورى" +// }, +// { +// "phone": "+201002102425", +// "name_arabic": "محمد أحمد محمد عويس" +// }, +// { +// "phone": "+201140329129", +// "name_arabic": "إسلام مصطفى حسن محمد" +// }, +// { +// "phone": "+201220333670", +// "name_arabic": "محمود نبيل محمد محمد الخميسي" +// }, +// { +// "phone": "+201005149472", +// "name_arabic": "دينا نبيل عبد العظيم أحمد صالح" +// }, +// { +// "phone": "+201153569803", +// "name_arabic": "محمود نبيل سيد عبد الله" +// }, +// { +// "phone": "+201282245822", +// "name_arabic": "ماجد لطفي بسادة بباوي" +// }, +// { +// "phone": "+201006642448", +// "name_arabic": "حسام الدين اسماعيل عبد العال محمد" +// }, +// { +// "phone": "+201288188535", +// "name_arabic": "هاني مبروك عبد العزيز محمد نوفل" +// }, +// { +// "phone": "+201027605557", +// "name_arabic": "محمد صلاح محمد كمال" +// }, +// { +// "phone": "+201118636820", +// "name_arabic": "مصطفى محمود ابراهيم احمد" +// }, +// { +// "phone": "+201008067967", +// "name_arabic": "محمد عطية حسن محمد الغباشى" +// }, +// { +// "phone": "+201017882643", +// "name_arabic": "عادل العوضي عبداللطيف العوضي" +// }, +// { +// "phone": "+201155617074", +// "name_arabic": "احمد محمود محمد حسن" +// }, +// { +// "phone": "+201004286515", +// "name_arabic": "محمد عبدة حساني محمد" +// }, +// { +// "phone": "+201097562062", +// "name_arabic": "احمد عز الدين عوض خليل الخولي" +// }, +// { +// "phone": "+201278956638", +// "name_arabic": "وليد سلامة محمد سلامة" +// }, +// { +// "phone": "+201093867579", +// "name_arabic": "بخيت محمود اسماعيل" +// }, +// { +// "phone": "+201094769303", +// "name_arabic": "مصطفى أحمد عبدالله عبدالراضى" +// }, +// { +// "phone": "+201125811384", +// "name_arabic": "محمود أحمد خليفه جاد الرب" +// }, +// { +// "phone": "+201557454447", +// "name_arabic": "أسامه سلامه ذكرى سلامه" +// }, +// { +// "phone": "+201226461243", +// "name_arabic": "محمد عبد الحميد محمد بدوي" +// }, +// { +// "phone": "+201111800059", +// "name_arabic": "أحمد ابراهيم احمد الفخراني" +// }, +// { +// "phone": "+201100218274", +// "name_arabic": "سالم سلامه سعد رفاعى" +// }, +// { +// "phone": "+201154962800", +// "name_arabic": "محمد عبد المرضى عبد المرضى بيومى" +// }, +// { +// "phone": "+201113842649", +// "name_arabic": "أحمد مصطفى رفعت عبد الفتاح" +// }, +// { +// "phone": "+201285178246", +// "name_arabic": "محمود يحى عبد الغفار محمد" +// }, +// { +// "phone": "+201021836117", +// "name_arabic": "علاء محمد ابراهيم محمد" +// }, +// { +// "phone": "+201125832020", +// "name_arabic": "محمد ناصر حسين بيومي" +// }, +// { +// "phone": "+201116195736", +// "name_arabic": "احمد سعد الدين احمد عبد المجيد" +// }, +// { +// "phone": "+201101163626", +// "name_arabic": "الدسوقى محمد على احمد" +// }, +// { +// "phone": "+201070803554", +// "name_arabic": "مصطفى كمال محمد محمد" +// }, +// { +// "phone": "+201005165488", +// "name_arabic": "احمد رفعت عبد العزيز عبد المجيد خطاب" +// }, +// { +// "phone": "+201004852416", +// "name_arabic": "هشام منيز فريد على" +// }, +// { +// "phone": "+201155394107", +// "name_arabic": "محمد هشام على ابراهيم" +// }, +// { +// "phone": "+201150647985", +// "name_arabic": "طه ياسر طه أبو المجد" +// }, +// { +// "phone": "+201204855400", +// "name_arabic": "محمد محمود محمد ادم" +// }, +// { +// "phone": "+201070340982", +// "name_arabic": "حسين صفوت على محمد القشيرى" +// }, +// { +// "phone": "+201129624445", +// "name_arabic": "أحمد عادل السيد اسماعيل" +// }, +// { +// "phone": "+201141615497", +// "name_arabic": "سميحة رمضان على عطا الله" +// }, +// { +// "phone": "+201201294180", +// "name_arabic": "صفاء توفيق أبوالوفا معوض" +// }, +// { +// "phone": "+201501076655", +// "name_arabic": "مايكل سمير سعد مجلي" +// }, +// { +// "phone": "+201030034406", +// "name_arabic": "محمد ماهر سلامه حسين" +// }, +// { +// "phone": "+201143716496", +// "name_arabic": "عبد الله محمود عبد الرحمن محمود" +// }, +// { +// "phone": "+201012483726", +// "name_arabic": "كريم احمد محمود علي" +// }, +// { +// "phone": "+201027316763", +// "name_arabic": "محمود محمد شحاته احمد" +// }, +// { +// "phone": "+201211795422", +// "name_arabic": "محمد إبراهيم مسعد فتحي بلال" +// }, +// { +// "phone": "+201121721649", +// "name_arabic": "محمود احمد احمد مصطفي" +// }, +// { +// "phone": "+201221415082", +// "name_arabic": "شادي محمد رشاد عباس عمار" +// }, +// { +// "phone": "+201018936079", +// "name_arabic": "محروس أحمد أبو العنين سالم" +// }, +// { +// "phone": "+201270049767", +// "name_arabic": "محمد مجدي علي محمد سعيد" +// }, +// { +// "phone": "+201126132246", +// "name_arabic": "محمد مصطفى سليمان مصطفى" +// }, +// { +// "phone": "+201125696621", +// "name_arabic": "محمد حامد سليمان حسن" +// }, +// { +// "phone": "+201273018230", +// "name_arabic": "محمد الشحات السيد احمد" +// }, +// { +// "phone": "+201150374914", +// "name_arabic": "محمد هريدي فرغلي هريدي" +// }, +// { +// "phone": "+201025412613", +// "name_arabic": "خالد عبد الله على البهلول المنياوى" +// }, +// { +// "phone": "+201152198105", +// "name_arabic": "عماد محمد عبد اللطيف عبد الغنى" +// }, +// { +// "phone": "+201146445021", +// "name_arabic": "عبد الله على أحمد حداد" +// }, +// { +// "phone": "+201022226451", +// "name_arabic": "محمد عاطف محمد حسين" +// }, +// { +// "phone": "+201068065801", +// "name_arabic": "محمد كمال أحمد المزين" +// }, +// { +// "phone": "+201277131373", +// "name_arabic": "اسلام أحمد متولى منصور لاشين" +// }, +// { +// "phone": "+201212302702", +// "name_arabic": "محمود عادل أبو القمصان محمد سلامة" +// }, +// { +// "phone": "+201228489535", +// "name_arabic": "شرين عبد المنعم عبد السلام علي" +// }, +// { +// "phone": "+201279090027", +// "name_arabic": "حسن ابراهيم محمد فتحي" +// }, +// { +// "phone": "+201113847301", +// "name_arabic": "ياسر عبد المنعم اسماعيل سليمان" +// }, +// { +// "phone": "+201229506313", +// "name_arabic": "احمد محمد على همام" +// }, +// { +// "phone": "+201140244411", +// "name_arabic": "احمد عبد المنعم على عمارة" +// }, +// { +// "phone": "+201553022775", +// "name_arabic": "عماد محمد مصطفي خاطر" +// }, +// { +// "phone": "+201099567428", +// "name_arabic": "وحيد رفعت جرس عبد الملاك" +// }, +// { +// "phone": "+201274206995", +// "name_arabic": "على ابراهيم على على فودة" +// }, +// { +// "phone": "+201120217383", +// "name_arabic": "محمد عبد الرحيم حسن احمد" +// }, +// { +// "phone": "+201147965344", +// "name_arabic": "إيهاب صبحي عتريس محمود" +// }, +// { +// "phone": "+201154404977", +// "name_arabic": "عبد الله علاء السيد عبد المجيد" +// }, +// { +// "phone": "+201027497766", +// "name_arabic": "كريم سعد جودة دياب" +// }, +// { +// "phone": "+201286065056", +// "name_arabic": "خالد صباح عياده عبد العال بدر" +// }, +// { +// "phone": "+201014767574", +// "name_arabic": "وليد محمد عبد الحليم عيسى" +// }, +// { +// "phone": "+201017815188", +// "name_arabic": "محمد سيد محمد سفينه" +// }, +// { +// "phone": "+201120161089", +// "name_arabic": "خالد جمعه مسعود سعيد" +// }, +// { +// "phone": "+201119256418", +// "name_arabic": "رانيا محمد احمد انور" +// }, +// { +// "phone": "+201507416444", +// "name_arabic": "أمين محمد شعبان محمد على" +// }, +// { +// "phone": "+201205456718", +// "name_arabic": "ملاك ليشع ثابت بطرس" +// }, +// { +// "phone": "+201126442254", +// "name_arabic": "عبد الله يحى عبد الرؤف سعد" +// }, +// { +// "phone": "+201289964020", +// "name_arabic": "خمس سيد عبد اللاه على عبد الله" +// }, +// { +// "phone": "+201284350745", +// "name_arabic": "عزة مرسي حسن عبد الرحمن" +// }, +// { +// "phone": "+201002356777", +// "name_arabic": "ماجد محمد البسطويسي دعبس" +// }, +// { +// "phone": "+201029885806", +// "name_arabic": "عبد الرحمن مرجان سعد دراج" +// }, +// { +// "phone": "+201117008885", +// "name_arabic": "محمد رمضان حامد محمد" +// }, +// { +// "phone": "+201028885144", +// "name_arabic": "إيمان علي أبو النصر محمد علي بدوي" +// }, +// { +// "phone": "+201014076299", +// "name_arabic": "محمد خميس محمد عبد العليم" +// }, +// { +// "phone": "+201013644157", +// "name_arabic": "احمد عز الدين فرج عز الدين" +// }, +// { +// "phone": "+201275610030", +// "name_arabic": "شوقى حسن شوقي جمال الدين" +// }, +// { +// "phone": "+201091985325", +// "name_arabic": "احمد السيد رمضان مرسال" +// }, +// { +// "phone": "+201203015806", +// "name_arabic": "وليد محمود عبد الغني علي حسنين" +// }, +// { +// "phone": "+201011412031", +// "name_arabic": "محمود محمد احمد محمد" +// }, +// { +// "phone": "+201157779205", +// "name_arabic": "محمد عبد الحميد جودة" +// }, +// { +// "phone": "+201277773181", +// "name_arabic": "فلوباتير سمير سيد حنا روفائيل" +// }, +// { +// "phone": "+201061337043", +// "name_arabic": "محمد احمد محمد علي محمد" +// }, +// { +// "phone": "+201067281366", +// "name_arabic": "مروة صلاح الدين محمد محمود عبد الله" +// }, +// { +// "phone": "+201097066092", +// "name_arabic": "محمد أشرف يونس ابراهيم" +// }, +// { +// "phone": "+201004848413", +// "name_arabic": "هاني محمود فؤاد إبراهيم" +// }, +// { +// "phone": "+201149508032", +// "name_arabic": "احمد السيد حماد متولى" +// }, +// { +// "phone": "+201202649929", +// "name_arabic": "ثروت عزمي راغب عبود" +// }, +// { +// "phone": "+201112044799", +// "name_arabic": "هشام محمد عبد الحى محمد عكاشه" +// }, +// { +// "phone": "+201001195138", +// "name_arabic": "هشام مصطفي سعيد محمد فهمي" +// }, +// { +// "phone": "+201557567007", +// "name_arabic": "عدلي صبحي فهيم فرج" +// }, +// { +// "phone": "+201147175326", +// "name_arabic": "محمد مصطفى مصطفى محمد" +// }, +// { +// "phone": "+201032073723", +// "name_arabic": "خالد عبد الظاهر جادو آدم" +// }, +// { +// "phone": "+201129706750", +// "name_arabic": "ابراهيم على زغابه عبد القادر" +// }, +// { +// "phone": "+201025253438", +// "name_arabic": "احمد عبد الستار أحمد عامر" +// }, +// { +// "phone": "+201206766868", +// "name_arabic": "لطيف ادوار لطيف سند" +// }, +// { +// "phone": "+201225366251", +// "name_arabic": "هشام حمدي حسين محمد" +// }, +// { +// "phone": "+201148950505", +// "name_arabic": "طارق جمال هندي احمد" +// }, +// { +// "phone": "+201146622344", +// "name_arabic": "هشام شحاته أمام محمود" +// }, +// { +// "phone": "+201557740402", +// "name_arabic": "أشرف حامد عبدة محمد" +// }, +// { +// "phone": "+201017280304", +// "name_arabic": "علي طارق علي عبد الواحد عبد الحليم" +// }, +// { +// "phone": "+201500060322", +// "name_arabic": "بيتز هاتى نبيه حمي" +// }, +// { +// "phone": "+201117059617", +// "name_arabic": "على الدسوقي علي سليم" +// }, +// { +// "phone": "+201224747254", +// "name_arabic": "مصطفى خالد على عبد العاطى سعد" +// }, +// { +// "phone": "+201550573754", +// "name_arabic": "نصر انور فرج حنا" +// }, +// { +// "phone": "+201002111569", +// "name_arabic": "أحمد محمد عبد المنعم عبد الله" +// }, +// { +// "phone": "+201553337962", +// "name_arabic": "أحمد عبد الهادي عبد السلام الشيحي" +// }, +// { +// "phone": "+201068854294", +// "name_arabic": "عمرو علاء محمد على المصرى" +// }, +// { +// "phone": "+201275860190", +// "name_arabic": "فيلبس فكري بشري عبد الله" +// }, +// { +// "phone": "+201205634046", +// "name_arabic": "علي ابراهيم ابو ضيف علي" +// }, +// { +// "phone": "+201554666842", +// "name_arabic": "محمد احمد محمود مزيد" +// }, +// { +// "phone": "+201009045792", +// "name_arabic": "أحمد جمعة طه عفيفي" +// }, +// { +// "phone": "+201065286286", +// "name_arabic": "علي أبوزيد علي محمد" +// }, +// { +// "phone": "+201096351318", +// "name_arabic": "أحمد عبد النبى جاب الله السيد" +// }, +// { +// "phone": "+201148917899", +// "name_arabic": "عد الهادى محمد عبد الهادى محمد" +// }, +// { +// "phone": "+201025737661", +// "name_arabic": "محي الدين رمزي فرج فرج محمد" +// }, +// { +// "phone": "+201118706518", +// "name_arabic": "محمد فوزي فؤاد حمودة" +// }, +// { +// "phone": "+201118668972", +// "name_arabic": "محمود محمد علي احمد محمود" +// }, +// { +// "phone": "+201064993743", +// "name_arabic": "رضا رؤف داود تاوضروس" +// }, +// { +// "phone": "+201273114754", +// "name_arabic": "أحمد عصمت عزيز الدين عبد الواحد علي" +// }, +// { +// "phone": "+201033854635", +// "name_arabic": "محمد عدلي السيد عرفات" +// }, +// { +// "phone": "+201200999580", +// "name_arabic": "حاتم حمدي إبراهيم عبد الله الشبراوي" +// }, +// { +// "phone": "+201145543352", +// "name_arabic": "أحمد رجب مصطفى محمود محمود" +// }, +// { +// "phone": "+201128843532", +// "name_arabic": "محمد فتحي عبد النبي مرشدي" +// }, +// { +// "phone": "+201023095063", +// "name_arabic": "محمد اسماعيل اسماعيل صفار" +// }, +// { +// "phone": "+201207443810", +// "name_arabic": "مايكل منير شفيق عوض" +// }, +// { +// "phone": "+201092355518", +// "name_arabic": "سادات أحمد عيد متولى محمد" +// }, +// { +// "phone": "+201142551956", +// "name_arabic": "محمود فتحى خضرى عوض" +// }, +// { +// "phone": "+201008062620", +// "name_arabic": "محمود عباس شعبان شحاتة" +// }, +// { +// "phone": "+201062319321", +// "name_arabic": "محمد طة حسين محفوظ" +// }, +// { +// "phone": "+201288090780", +// "name_arabic": "امير نور الدين ابراهيم محمد" +// }, +// { +// "phone": "+201228278888", +// "name_arabic": "أحمد رياض عبد الحافظ محمد" +// }, +// { +// "phone": "+201141614543", +// "name_arabic": "محمد على محمد على جاد" +// }, +// { +// "phone": "+201097765410", +// "name_arabic": "هشام سيد أحمد عبدالله أبو رية" +// }, +// { +// "phone": "+201113732385", +// "name_arabic": "محمد عبد الرحمن محمد شرف" +// }, +// { +// "phone": "+201124832823", +// "name_arabic": "علاء عزت تهامى يوسف" +// }, +// { +// "phone": "+201144108343", +// "name_arabic": "حسين محمود أبو المجد رفاعى" +// }, +// { +// "phone": "+201555944650", +// "name_arabic": "هشام محمود طلعت مفضل" +// }, +// { +// "phone": "+201116994202", +// "name_arabic": "حسام حسن رمضان محمد" +// }, +// { +// "phone": "+201015264416", +// "name_arabic": "شيماء محمد طاهر عبد القادر إبراهيم" +// }, +// { +// "phone": "+201094160193", +// "name_arabic": "محمد ابراهيم احمد الحويري" +// }, +// { +// "phone": "+201281133495", +// "name_arabic": "محمد أحمد على أحمد" +// }, +// { +// "phone": "+201117663059", +// "name_arabic": "مصطفى حسام الدين مصطفى احمد" +// }, +// { +// "phone": "+201114436028", +// "name_arabic": "عادل محمد حنفى محمد محمود" +// }, +// { +// "phone": "+201017170204", +// "name_arabic": "هشام رجائى عثمان أبو الدهب" +// }, +// { +// "phone": "+201127029020", +// "name_arabic": "محمد محمد محمد" +// }, +// { +// "phone": "+201210588038", +// "name_arabic": "مصطفي محمد حمدي محمد" +// }, +// { +// "phone": "+201102329819", +// "name_arabic": "اسلام نبيل بكرى محمد" +// }, +// { +// "phone": "+201064530120", +// "name_arabic": "ابراهيم الرفاعي محمد حافظ" +// }, +// { +// "phone": "+201021655556", +// "name_arabic": "ايمن عادل احمد محمد" +// }, +// { +// "phone": "+201000198736", +// "name_arabic": "محمد رمضان أحمد محمد" +// }, +// { +// "phone": "+201002205527", +// "name_arabic": "توفيق علي مرسي حسن" +// }, +// { +// "phone": "+201005802822", +// "name_arabic": "يحيى زكريا مكى احمد" +// }, +// { +// "phone": "+201128031498", +// "name_arabic": "زينهم مصطفي سيد سليمان الطيار" +// }, +// { +// "phone": "+201013300035", +// "name_arabic": "محمد عبد الحميد حسن النحاس" +// }, +// { +// "phone": "+201030356606", +// "name_arabic": "كمال فراج عبد الجليل إبراهيم" +// }, +// { +// "phone": "+201030047331", +// "name_arabic": "عبد الرحمن محمد عبد الرحمن محمد على" +// }, +// { +// "phone": "+201226484016", +// "name_arabic": "احمد حلمي عبد الحليم عبد الله" +// }, +// { +// "phone": "+201033087547", +// "name_arabic": "طارق مصطفى عبد السميع محمد" +// }, +// { +// "phone": "+201159806992", +// "name_arabic": "خالد محروس سلامة حموده" +// }, +// { +// "phone": "+201021062590", +// "name_arabic": "محمد صلاح الدين خميس مرسى" +// }, +// { +// "phone": "+201002602758", +// "name_arabic": "سيد بهاء الدين محمود سيد أحمد" +// }, +// { +// "phone": "+201060794536", +// "name_arabic": "أحمد السيد محمود احمد" +// }, +// { +// "phone": "+201117639926", +// "name_arabic": "عيد عبد السلام إبراهيم سنهابى" +// }, +// { +// "phone": "+201005464946", +// "name_arabic": "اسلام محمد صابر محمد" +// }, +// { +// "phone": "+201005259664", +// "name_arabic": "مصطفى حسن فراخ عيد" +// }, +// { +// "phone": "+201003111434", +// "name_arabic": "رشا محمد احمد محمد على" +// }, +// { +// "phone": "+201009033817", +// "name_arabic": "أحمد محمد اسماعيل حسنين" +// }, +// { +// "phone": "+201155542320", +// "name_arabic": "عبد اللطيف صلاح السيد عبداللطيف" +// }, +// { +// "phone": "+201096395740", +// "name_arabic": "رامي ماجد جرجس حبيب" +// }, +// { +// "phone": "+201010259482", +// "name_arabic": "احمد ابو الحسن شحاته عبد الحافظ" +// }, +// { +// "phone": "+201289488182", +// "name_arabic": "عاصم فتحى ابراهيم منصور الوكيل" +// }, +// { +// "phone": "+201009595425", +// "name_arabic": "محمد مأمون محمد عبد الحميد عيسى" +// }, +// { +// "phone": "+201028275962", +// "name_arabic": "احمد عيد عوض الله حميدة" +// }, +// { +// "phone": "+201222517257", +// "name_arabic": "حسين فكري عبد الرحيم محمد" +// }, +// { +// "phone": "+201008698488", +// "name_arabic": "هاني أبو السعود العدل السيد الرايب" +// }, +// { +// "phone": "+201142634259", +// "name_arabic": "أحمد عبد الله سلامه حامد" +// }, +// { +// "phone": "+201116062390", +// "name_arabic": "احمد كرم سامى السيد" +// }, +// { +// "phone": "+201117937985", +// "name_arabic": "حمدي محمد عبد الغفار حجاج" +// }, +// { +// "phone": "+201115232474", +// "name_arabic": "عزة أحمد محمد المهدى" +// }, +// { +// "phone": "+201069133688", +// "name_arabic": "احمد جمال عبد الرحمن عبد الرحمن" +// }, +// { +// "phone": "+201226994629", +// "name_arabic": "بيشوي فيكتور يسي مقاريوس" +// }, +// { +// "phone": "+201140776248", +// "name_arabic": "اسلام السيد عبد القادر محمد" +// }, +// { +// "phone": "+201114729635", +// "name_arabic": "مصطفي مصطفي محمود النساج" +// }, +// { +// "phone": "+201080975013", +// "name_arabic": "كامل محمد كامل محمود" +// }, +// { +// "phone": "+201023118846", +// "name_arabic": "محمد خالد محفوظ احمد" +// }, +// { +// "phone": "+201094428288", +// "name_arabic": "أسامة أبوسريع حسين محمد" +// }, +// { +// "phone": "+201040615690", +// "name_arabic": "وسام محمد عبد الملك محمد" +// }, +// { +// "phone": "+201119905035", +// "name_arabic": "معتز مجدي محمد عبد السميع محمود" +// }, +// { +// "phone": "+201004232085", +// "name_arabic": "فهد محمد عبد اللطيف العيسوى" +// }, +// { +// "phone": "+201153674226", +// "name_arabic": "محمد رضا إبراهيم حسين نصر" +// }, +// { +// "phone": "+201127040489", +// "name_arabic": "محمد سمير جميل على" +// }, +// { +// "phone": "+201012583286", +// "name_arabic": "محمد عبد الحميد احمد احمد خضير" +// }, +// { +// "phone": "+201018915416", +// "name_arabic": "أمير مجدي مسعد محمد الشحات" +// }, +// { +// "phone": "+201020170343", +// "name_arabic": "يوسف رجب خليفه محمد" +// }, +// { +// "phone": "+201092729281", +// "name_arabic": "عصام جمال الدين محمد يسين" +// }, +// { +// "phone": "+201024181778", +// "name_arabic": "هيثم احمد فؤاد أحمد" +// }, +// { +// "phone": "+201222925218", +// "name_arabic": "نادر عادل جرجس عبد الله" +// }, +// { +// "phone": "+201143754394", +// "name_arabic": "محمد علي محمد علي" +// }, +// { +// "phone": "+201559327222", +// "name_arabic": "رضوان عبد العزيز إبراهيم بدوي" +// }, +// { +// "phone": "+201006775356", +// "name_arabic": "محمد عبد الرحمن فرج بلال" +// }, +// { +// "phone": "+201002864929", +// "name_arabic": "السيد يونس الشحات السيد" +// }, +// { +// "phone": "+201122352929", +// "name_arabic": "احمد محمد ابراهيم ابوالشعيشع" +// }, +// { +// "phone": "+201006343246", +// "name_arabic": "وائل رفعت حلمى جورجى سليمان" +// }, +// { +// "phone": "+201552451535", +// "name_arabic": "محمد عبد الله ابراهيم السيد نصر" +// }, +// { +// "phone": "+201126358069", +// "name_arabic": "مصطفي محمود إبراهيم عبد القادر" +// }, +// { +// "phone": "+201099844308", +// "name_arabic": "محمد سامى محمد عبد الحميد داود" +// }, +// { +// "phone": "+201030684340", +// "name_arabic": "ابراهيم محمد السيد محمد التركي" +// }, +// { +// "phone": "+201283377033", +// "name_arabic": "وديع زكريا شفيق بنة" +// }, +// { +// "phone": "+201070490632", +// "name_arabic": "عبد العزيز محمود محمد حسانين" +// }, +// { +// "phone": "+201127445094", +// "name_arabic": "عمر نصر عمر عبد ظاهر" +// }, +// { +// "phone": "+201229974967", +// "name_arabic": "احمد محمد شعبان محمد" +// }, +// { +// "phone": "+201114984392", +// "name_arabic": "محمد حسنى عبدالواحد على" +// }, +// { +// "phone": "+201277862323", +// "name_arabic": "محمد نبيل محمود حامد" +// }, +// { +// "phone": "+201550211242", +// "name_arabic": "خالد محمد عبد النبى محمد احمد" +// }, +// { +// "phone": "+201067986841", +// "name_arabic": "مازي ممدوح سعيد محمد" +// }, +// { +// "phone": "+201224970278", +// "name_arabic": "عبدة محمد حافظ السيد" +// }, +// { +// "phone": "+201115307275", +// "name_arabic": "كريم صبري صلاح ابراهيم" +// }, +// { +// "phone": "+201000892261", +// "name_arabic": "محمد عبد الحي فرج عبد الرحمن" +// }, +// { +// "phone": "+201221954550", +// "name_arabic": "أيمن عاشور الدسوقى محمد" +// }, +// { +// "phone": "+201022265083", +// "name_arabic": "محمد رمضان عطا أمين" +// }, +// { +// "phone": "+201065689023", +// "name_arabic": "ربيع محمد زكي سليمان" +// }, +// { +// "phone": "+201144615625", +// "name_arabic": "محمد حسام الدين سيد حسان" +// }, +// { +// "phone": "+201553326333", +// "name_arabic": "احمد محمد عبد العزيز علي عمر" +// }, +// { +// "phone": "+201118023623", +// "name_arabic": "محمد محروس سعد أحمد" +// }, +// { +// "phone": "+201552946246", +// "name_arabic": "محمد كمال محمد عبد النبى" +// }, +// { +// "phone": "+201018933273", +// "name_arabic": "عبد الرحمن محمد احمد السيد" +// }, +// { +// "phone": "+201555952353", +// "name_arabic": "البكري حامد حسن رضوان" +// }, +// { +// "phone": "+201062754950", +// "name_arabic": "مصطفى على سامى على" +// }, +// { +// "phone": "+201285015948", +// "name_arabic": "سيد احمد محمد محمد ابراهيم" +// }, +// { +// "phone": "+201154505875", +// "name_arabic": "احمد تاجى فكرى احمد" +// }, +// { +// "phone": "+201154004771", +// "name_arabic": "سعيد محمد ابراهيم نوفل" +// }, +// { +// "phone": "+201272336635", +// "name_arabic": "منصف لعي دانيال صالح" +// }, +// { +// "phone": "+201005394274", +// "name_arabic": "ايمن سعيد حسن بركات" +// }, +// { +// "phone": "+201007573334", +// "name_arabic": "صلاح محمد أحمد رضوان" +// }, +// { +// "phone": "+201148656049", +// "name_arabic": "محمود شعبان عبد الخالق فتوح" +// }, +// { +// "phone": "+201009804581", +// "name_arabic": "محمود اسماعيل محمد عبد القادر" +// }, +// { +// "phone": "+201017690285", +// "name_arabic": "أحمد طارق سيد محمد" +// }, +// { +// "phone": "+201009119428", +// "name_arabic": "أحمد مصطفي أحمد ادريس" +// }, +// { +// "phone": "+201067386263", +// "name_arabic": "اسلام محمد محمد حسانين يوسف النجار" +// }, +// { +// "phone": "+201008597171", +// "name_arabic": "محمد محمود احمد موسي احمد" +// }, +// { +// "phone": "+201115892867", +// "name_arabic": "أحمد خلف البدرى احمد" +// }, +// { +// "phone": "+201111804049", +// "name_arabic": "محمد عبد الباسط احمد صديق" +// }, +// { +// "phone": "+201014254690", +// "name_arabic": "حماده ثابت على ناصف" +// }, +// { +// "phone": "+201124183693", +// "name_arabic": "حسن حسنى كامل حسن" +// }, +// { +// "phone": "+201122860456", +// "name_arabic": "محمد خالد ابراهيم عبد الوهاب" +// }, +// { +// "phone": "+201274741288", +// "name_arabic": "أشرف سعيد مدبولي عبدالكريم" +// }, +// { +// "phone": "+201289020691", +// "name_arabic": "محمد جابر حسين ابراهيم" +// }, +// { +// "phone": "+201007536613", +// "name_arabic": "مصطفى محمد حسن مصطفي" +// }, +// { +// "phone": "+201111095866", +// "name_arabic": "طارق حسني احمد بيومى" +// }, +// { +// "phone": "+201124017513", +// "name_arabic": "محمود يحى موسى حميده" +// }, +// { +// "phone": "+201006550621", +// "name_arabic": "حسن صلاح طة حسن" +// }, +// { +// "phone": "+201148080509", +// "name_arabic": "وليد السيد احمد مكاوي" +// }, +// { +// "phone": "+201125935415", +// "name_arabic": "ناصر جمعة ناصر مشتاق" +// }, +// { +// "phone": "+201028912082", +// "name_arabic": "هدي سيد بحر محمد" +// }, +// { +// "phone": "+201141675135", +// "name_arabic": "احمد ناصر عيسى ابو الليل" +// }, +// { +// "phone": "+201095945834", +// "name_arabic": "أحمد صابر حسين علي" +// }, +// { +// "phone": "+201500263335", +// "name_arabic": "هانى سعيد جاد غراب" +// }, +// { +// "phone": "+201102563435", +// "name_arabic": "محمد سعيد السيد محمود الجمال" +// }, +// { +// "phone": "+201062981863", +// "name_arabic": "أبوالحسن حامد محمد خليفة" +// }, +// { +// "phone": "+201128353131", +// "name_arabic": "محمد عوض محمد اسماعيل" +// }, +// { +// "phone": "+201150650378", +// "name_arabic": "أحمد أشرف عزت حسن" +// }, +// { +// "phone": "+201288199133", +// "name_arabic": "محمد حسن اسماعيل عزب محمد" +// }, +// { +// "phone": "+201121676093", +// "name_arabic": "مجدى مكرم يونان سعد" +// }, +// { +// "phone": "+201003452024", +// "name_arabic": "محمد السيد محمد المغازي" +// }, +// { +// "phone": "+201156141770", +// "name_arabic": "محمد شريف عبد الواحد عبد الحميد" +// }, +// { +// "phone": "+201507797706", +// "name_arabic": "سامح مصطفى غانم مصطفى غائم" +// }, +// { +// "phone": "+201113061844", +// "name_arabic": "محمد محمود عواد مصطفي" +// }, +// { +// "phone": "+201553335619", +// "name_arabic": "وليد فاروق اسحق خليل" +// }, +// { +// "phone": "+201210348485", +// "name_arabic": "فام فسدق قلته رزق الله" +// }, +// { +// "phone": "+201064312767", +// "name_arabic": "إبراهيم أحمد إبراهيم محمد" +// }, +// { +// "phone": "+201206909077", +// "name_arabic": "محمد بدوى ابراهيم بدوى" +// }, +// { +// "phone": "+201555791055", +// "name_arabic": "احمد عادل محمد محمد" +// }, +// { +// "phone": "+201102720017", +// "name_arabic": "عبد الفتاح محمد إبراهيم عبدالله" +// }, +// { +// "phone": "+201002750873", +// "name_arabic": "مصطفي رافت علي ربيع" +// }, +// { +// "phone": "+201090627930", +// "name_arabic": "محمود فهمى عبد الحميد حسن الفقى" +// }, +// { +// "phone": "+201017580860", +// "name_arabic": "عبد الله حمدى عبد الهادى النجار" +// }, +// { +// "phone": "+201113701121", +// "name_arabic": "وليد عدلي نخلة مقار" +// }, +// { +// "phone": "+201096924210", +// "name_arabic": "ايمن كريم العربى نصر" +// }, +// { +// "phone": "+201027041564", +// "name_arabic": "عماد الدين عبد الباسط عيد ابراهيم" +// }, +// { +// "phone": "+201273170033", +// "name_arabic": "احمد مصطفي سليمان حسين" +// }, +// { +// "phone": "+201111047616", +// "name_arabic": "أحمد تمام سكي تمام" +// }, +// { +// "phone": "+201009908505", +// "name_arabic": "محمد اسامه حسين حسن" +// }, +// { +// "phone": "+201092201816", +// "name_arabic": "محمد سعيد محمد محمد" +// }, +// { +// "phone": "+201100726360", +// "name_arabic": "شرف ايهاب محمد لطفى" +// }, +// { +// "phone": "+201005851058", +// "name_arabic": "جوزيف روبيل شفيق كراس" +// }, +// { +// "phone": "+201065804243", +// "name_arabic": "مرزق رفعت فوزى توفيق" +// }, +// { +// "phone": "+201005778338", +// "name_arabic": "رامى محمد كامل محمد" +// }, +// { +// "phone": "+201155603782", +// "name_arabic": "علي جابر على حسن" +// }, +// { +// "phone": "+201110049385", +// "name_arabic": "علاء محمد سيد أحمد" +// }, +// { +// "phone": "+201223182673", +// "name_arabic": "احمد عبودي حسن علي سالم" +// }, +// { +// "phone": "+201007532774", +// "name_arabic": "هبه يحيي أحمد الرصد" +// }, +// { +// "phone": "+201050933517", +// "name_arabic": "كريم كرم سعد نصر الله" +// }, +// { +// "phone": "+201273880464", +// "name_arabic": "ماهر مصطفى محمد رياض" +// }, +// { +// "phone": "+201116397705", +// "name_arabic": "محمد صادق عبد الله سعيد" +// }, +// { +// "phone": "+201063955559", +// "name_arabic": "عبدالرحمن سيد محمود سيد" +// }, +// { +// "phone": "+201227737560", +// "name_arabic": "جان فتحي دانيال بعزق" +// }, +// { +// "phone": "+201011555232", +// "name_arabic": "محمد أحمد عبد الحليم السيد" +// }, +// { +// "phone": "+201147484605", +// "name_arabic": "محمد عبد المنعم عباس عبد المنعم" +// }, +// { +// "phone": "+201060826900", +// "name_arabic": "عمرو أحمد حسين عبد الرحمن جمعه" +// }, +// { +// "phone": "+201009477489", +// "name_arabic": "حماده شعبان حسن أبو الجود" +// }, +// { +// "phone": "+201012017791", +// "name_arabic": "هيثم محمود عبد الدايم موسى" +// }, +// { +// "phone": "+201270425427", +// "name_arabic": "محمد حمدي محمد حسن" +// }, +// { +// "phone": "+201117159585", +// "name_arabic": "محمد السيد صديق غريب" +// }, +// { +// "phone": "+201100680306", +// "name_arabic": "شريف عطية محمد خليفة" +// }, +// { +// "phone": "+201287585360", +// "name_arabic": "محمد فاروق حنفي احمد عليوة" +// }, +// { +// "phone": "+201129153880", +// "name_arabic": "محمود دسوقي محمود أبو طالب" +// }, +// { +// "phone": "+201099550606", +// "name_arabic": "ابراهيم محمد عبد العزيز محمد" +// }, +// { +// "phone": "+201153447373", +// "name_arabic": "محمد عبد الجيد ابراهيم ابراهيم" +// }, +// { +// "phone": "+201067341352", +// "name_arabic": "مروة شاذلى محمد عبد الرحيم" +// }, +// { +// "phone": "+201011865835", +// "name_arabic": "ياسر حسين سيد حسين" +// }, +// { +// "phone": "+201095085742", +// "name_arabic": "محمد احمد محمد احمد" +// }, +// { +// "phone": "+201110495200", +// "name_arabic": "وليد عبد الرحمن بسيوني عبد الرحمن" +// }, +// { +// "phone": "+201141696200", +// "name_arabic": "احمد عثمان حامد يوسف" +// }, +// { +// "phone": "+201287187646", +// "name_arabic": "مينا نبيل رزق ابراهيم" +// }, +// { +// "phone": "+201555177784", +// "name_arabic": "عمرو رسمي عمارة سليمان" +// }, +// { +// "phone": "+201018376957", +// "name_arabic": "محمد هاشم محمد هاشم" +// }, +// { +// "phone": "+201003154837", +// "name_arabic": "أحمد يحيى محمد أحمد" +// }, +// { +// "phone": "+201067255651", +// "name_arabic": "محمد شعبان ابراهيم السعيد" +// }, +// { +// "phone": "+201100428558", +// "name_arabic": "شريف عبد الواحد محمد الطويل" +// }, +// { +// "phone": "+201146288730", +// "name_arabic": "محمد السيد حرمي المكاوي" +// }, +// { +// "phone": "+201114211410", +// "name_arabic": "ياسر محمد سلطان بدر الدين" +// }, +// { +// "phone": "+201060415254", +// "name_arabic": "ياسر السيد روبي سعداوي" +// }, +// { +// "phone": "+201004595698", +// "name_arabic": "اسلام محمد محمد محمود" +// }, +// { +// "phone": "+201100568008", +// "name_arabic": "وليد عبد الرحيم إبراهيم سليمان" +// }, +// { +// "phone": "+201115997592", +// "name_arabic": "محمد محسن زغلول انور" +// }, +// { +// "phone": "+201122284350", +// "name_arabic": "محمد ابو الدهب محمد عوض" +// }, +// { +// "phone": "+201111908842", +// "name_arabic": "محمد ابراهيم انور حسن" +// }, +// { +// "phone": "+201151642460", +// "name_arabic": "فارس شعبان حمدى محمد" +// }, +// { +// "phone": "+201030751777", +// "name_arabic": "محمد عبد الله محمد علي" +// }, +// { +// "phone": "+201063103737", +// "name_arabic": "احمد محمد فكري عبد المقصود حماد" +// }, +// { +// "phone": "+201157009020", +// "name_arabic": "أحمد عطية محمد عطية" +// }, +// { +// "phone": "+201063900948", +// "name_arabic": "محمد صبرى عبد العزيز اسماعيل" +// }, +// { +// "phone": "+201156894583", +// "name_arabic": "يحيى صبحي علي السيد" +// }, +// { +// "phone": "+201272939093", +// "name_arabic": "خالد طارق أحمد محمد" +// }, +// { +// "phone": "+201221212824", +// "name_arabic": "عادل عبد السلام محمد حسن" +// }, +// { +// "phone": "+201016268960", +// "name_arabic": "مهدى مفتاح مهدى مسعد" +// }, +// { +// "phone": "+201277006734", +// "name_arabic": "حامد علاء الدين حامد بدر إبراهيم" +// }, +// { +// "phone": "+201007910121", +// "name_arabic": "محمود محسن محمود مرسي" +// }, +// { +// "phone": "+201226744560", +// "name_arabic": "رضا عبد الله فهيم داود" +// }, +// { +// "phone": "+201554949820", +// "name_arabic": "محمد مصطفى عبد المقصود خلف" +// }, +// { +// "phone": "+201113681802", +// "name_arabic": "عادل مدحت احمد احمد" +// }, +// { +// "phone": "+201008697780", +// "name_arabic": "ايهاب سامي علي البح" +// }, +// { +// "phone": "+201009440993", +// "name_arabic": "حنان محمد جمال الدين أحمد محمد" +// }, +// { +// "phone": "+201096487811", +// "name_arabic": "محمود عبد الرحمن محمد غانم" +// }, +// { +// "phone": "+201501601640", +// "name_arabic": "إسلام صلاح طه محمود جبريل" +// }, +// { +// "phone": "+201117124711", +// "name_arabic": "سامح كامل جبريل عمر" +// }, +// { +// "phone": "+201017650550", +// "name_arabic": "محمد عبداللطيف محمد خوجة" +// }, +// { +// "phone": "+201080465990", +// "name_arabic": "عبد الرحمن محمود محمد الحداد" +// }, +// { +// "phone": "+201550491890", +// "name_arabic": "خالد عبد الكريم اسماعيل محمود" +// }, +// { +// "phone": "+201144052261", +// "name_arabic": "محمود مبارك محمود علي" +// }, +// { +// "phone": "+201146693525", +// "name_arabic": "أحمد عبد الحميد عبد الحليم محمد" +// }, +// { +// "phone": "+201018042320", +// "name_arabic": "السيد شحاتة" +// }, +// { +// "phone": "+201144475005", +// "name_arabic": "محمد سيد انور درويش" +// }, +// { +// "phone": "+201009886308", +// "name_arabic": "عادل امام نور الدين عبد الرسول" +// }, +// { +// "phone": "+201000427237", +// "name_arabic": "ياسر عبد العزيز احمد علي" +// }, +// { +// "phone": "+201288590313", +// "name_arabic": "مينا منير كامل وهيب" +// }, +// { +// "phone": "+201064630354", +// "name_arabic": "حسن محمد حسن على" +// }, +// { +// "phone": "+201128293924", +// "name_arabic": "عبد الحنان عبد الفتاح محمود السعداوى" +// }, +// { +// "phone": "+201229123460", +// "name_arabic": "ممدوح السيد محمد بسيوني صومع" +// }, +// { +// "phone": "+201149151561", +// "name_arabic": "عبد الرحمن فريد محمد الحفنى" +// }, +// { +// "phone": "+201094186227", +// "name_arabic": "منصور شعبان بيومي ابراهيم" +// }, +// { +// "phone": "+201272196906", +// "name_arabic": "عبد الرحمن محمد عبد المجيد احمد" +// }, +// { +// "phone": "+201015743577", +// "name_arabic": "وائل مبروك عبد العليم صالح" +// }, +// { +// "phone": "+201018416878", +// "name_arabic": "محمود حنفي عبداللطيف حنفي" +// }, +// { +// "phone": "+201210949587", +// "name_arabic": "ابراهيم زكريا إبراهيم محمد" +// }, +// { +// "phone": "+201060906267", +// "name_arabic": "أحمد ممدوح محمد القماح" +// }, +// { +// "phone": "+201005804981", +// "name_arabic": "مصطفي عباس خليل اسماعيل" +// }, +// { +// "phone": "+201050064030", +// "name_arabic": "محمد أحمد محمد أنور سعد" +// }, +// { +// "phone": "+201119499018", +// "name_arabic": "هانى احمد سيد منجد" +// }, +// { +// "phone": "+201099412985", +// "name_arabic": "ابراهيم علي عبد العال علي ابو الحسن" +// }, +// { +// "phone": "+201201777547", +// "name_arabic": "محمد صلاح أحمد رمضان" +// }, +// { +// "phone": "+201555320344", +// "name_arabic": "احمد محمد محمد عبدة خطابي" +// }, +// { +// "phone": "+201000450328", +// "name_arabic": "ربيع شعبان عبد المعبود الدسوقى" +// }, +// { +// "phone": "+201551500674", +// "name_arabic": "رجب سيف النصر احمد حسين" +// }, +// { +// "phone": "+201064909280", +// "name_arabic": "رجب احمد علي عيد" +// }, +// { +// "phone": "+201008666010", +// "name_arabic": "على عبد الجواد علي عبد الخالق" +// }, +// { +// "phone": "+201098111772", +// "name_arabic": "رزق غريب حسان حسان" +// }, +// { +// "phone": "+201503227949", +// "name_arabic": "محمد رفاعى محمد علي" +// }, +// { +// "phone": "+201002728400", +// "name_arabic": "كريم عبد المنعم محمود عمارة" +// }, +// { +// "phone": "+201003769330", +// "name_arabic": "عمرو رجب حسين مصطفى" +// }, +// { +// "phone": "+201158913381", +// "name_arabic": "اسلام عادل محمود عبد الرؤوف" +// }, +// { +// "phone": "+201098426685", +// "name_arabic": "خالد جمعه على خلف" +// }, +// { +// "phone": "+201144439560", +// "name_arabic": "محمود عبد الناصر أحمد محمد" +// }, +// { +// "phone": "+201206234791", +// "name_arabic": "كريم علي محمد علي احمد" +// }, +// { +// "phone": "+201123405958", +// "name_arabic": "بلال كمال أحمد أحمد" +// }, +// { +// "phone": "+201028913946", +// "name_arabic": "عمرو ابراهيم محمد محمد هلال" +// }, +// { +// "phone": "+201015424612", +// "name_arabic": "مؤمن محمد ابراهيم صالح" +// }, +// { +// "phone": "+201095100367", +// "name_arabic": "شادي محمد عبد العاطي سالم" +// }, +// { +// "phone": "+201149507156", +// "name_arabic": "محمد فتحى خميس محمد" +// }, +// { +// "phone": "+201068181041", +// "name_arabic": "ابراهيم فرج ابراهيم السيد هلالي" +// }, +// { +// "phone": "+201125869973", +// "name_arabic": "نادر عماد عبد السلام بيومى" +// }, +// { +// "phone": "+201094960584", +// "name_arabic": "شيماء خميس لطفي محمد" +// }, +// { +// "phone": "+201151296487", +// "name_arabic": "مصطفى إبراهيم عثمان عطوه على" +// }, +// { +// "phone": "+201282292965", +// "name_arabic": "عيسى راشد عايد ملسن" +// }, +// { +// "phone": "+201001227223", +// "name_arabic": "شريف كمال أحمد محمد على ابوشنب" +// }, +// { +// "phone": "+201061681439", +// "name_arabic": "محمود عبد المنعم عبد الحميد حسنين" +// }, +// { +// "phone": "+201014063641", +// "name_arabic": "أحمد اسماعيل عطيه اسماعيل" +// }, +// { +// "phone": "+201115251990", +// "name_arabic": "محمود جمال قطب سليمان" +// }, +// { +// "phone": "+201096635579", +// "name_arabic": "عبد الهادى اشرف عبد الهادى عبدالحكم على" +// }, +// { +// "phone": "+201272649581", +// "name_arabic": "مصطفى هاشم هاشم إبراهيم هاشم" +// }, +// { +// "phone": "+201124318502", +// "name_arabic": "احمد محمد احمد" +// }, +// { +// "phone": "+201030499449", +// "name_arabic": "كامل مجدي السيد محمد" +// }, +// { +// "phone": "+201100014905", +// "name_arabic": "عادل سامى احمد علي" +// }, +// { +// "phone": "+201111098121", +// "name_arabic": "وليد محمد توفيق محمد خليل" +// }, +// { +// "phone": "+201200483898", +// "name_arabic": "البير ميخائيل رسمي ميخائيل" +// }, +// { +// "phone": "+201551349310", +// "name_arabic": "خالد هشام أحمد عصمت محمود" +// }, +// { +// "phone": "+201146919209", +// "name_arabic": "أحمد صبرى السمان احمد" +// }, +// { +// "phone": "+201270615600", +// "name_arabic": "وليد جوده عبد الحميد إبراهيم" +// }, +// { +// "phone": "+201140198161", +// "name_arabic": "احمد تامر ممدوح السيد الكوهى" +// }, +// { +// "phone": "+201100170600", +// "name_arabic": "مصطفى محى الدين غريب محمد يوسف" +// }, +// { +// "phone": "+201144313977", +// "name_arabic": "محمد فرج سلومة عبد الحي" +// }, +// { +// "phone": "+201284004090", +// "name_arabic": "ياسر إبراهيم أحمد حسن سعيد" +// }, +// { +// "phone": "+201154745194", +// "name_arabic": "محمد على عبد المنعم احمد" +// }, +// { +// "phone": "+201143535864", +// "name_arabic": "الحسين محمد عبد الفهيم أمين" +// }, +// { +// "phone": "+201006067602", +// "name_arabic": "زينب محمود على محمد" +// }, +// { +// "phone": "+201550748488", +// "name_arabic": "محمد نجيب حامد درويش" +// }, +// { +// "phone": "+201000354622", +// "name_arabic": "عبد الحليم السيد علي ابوزيد" +// }, +// { +// "phone": "+201116068340", +// "name_arabic": "عبد الرازق محمد احمد حفني اسماعيل" +// }, +// { +// "phone": "+201211361976", +// "name_arabic": "مصطفى سعيد جابر ابراهيم" +// }, +// { +// "phone": "+201010887621", +// "name_arabic": "كريم مجدي محمد حسن" +// }, +// { +// "phone": "+201029602004", +// "name_arabic": "محمد عرفة جمعة عبدالجواد" +// }, +// { +// "phone": "+201552995677", +// "name_arabic": "يحيى مصطفى محمد على محمد السامى" +// }, +// { +// "phone": "+201008771236", +// "name_arabic": "وائل محمد حسن عزيز" +// }, +// { +// "phone": "+201040988673", +// "name_arabic": "أسامة سمير عبد الفتاح محمد رضوان" +// }, +// { +// "phone": "+201143505691", +// "name_arabic": "محمد مصطفي مسعود عثمان" +// }, +// { +// "phone": "+201156944414", +// "name_arabic": "أحمد حسين أحمد حسين" +// }, +// { +// "phone": "+201006005233", +// "name_arabic": "السيد عبد الحليم بهي الدين اسماعيل" +// }, +// { +// "phone": "+201142814389", +// "name_arabic": "اشرف محمد ناجي خالد" +// }, +// { +// "phone": "+201020731219", +// "name_arabic": "اسماعيل محمود محمد حميد" +// }, +// { +// "phone": "+201127880188", +// "name_arabic": "محمد طارق السيد عناني عبد العزيز" +// }, +// { +// "phone": "+201289333568", +// "name_arabic": "شوقى سيد عبد العظيم مرسى" +// }, +// { +// "phone": "+201030048751", +// "name_arabic": "هشام محمد أمين العاصي" +// }, +// { +// "phone": "+201004106488", +// "name_arabic": "يوسف صلاح نادى محمود عبد الرحيم" +// }, +// { +// "phone": "+201008940080", +// "name_arabic": "عمارياسر كمال حسن عمر عبدالوهاب" +// }, +// { +// "phone": "+201556008115", +// "name_arabic": "عصام علي متولي باز" +// }, +// { +// "phone": "+201149518708", +// "name_arabic": "سامح عبد العاطى احمد محمد بيومى" +// }, +// { +// "phone": "+201027195352", +// "name_arabic": "محسن محمد محمود طابل" +// }, +// { +// "phone": "+201157861455", +// "name_arabic": "أحمد محسب ابو العلا حسنين" +// }, +// { +// "phone": "+201143605837", +// "name_arabic": "مصطفي مسعد أبو النجا محمد" +// }, +// { +// "phone": "+201153086752", +// "name_arabic": "زياد محمد على عبد الفتاح" +// }, +// { +// "phone": "+201023692498", +// "name_arabic": "محمد عبد العزيز محمد دياب علام" +// }, +// { +// "phone": "+201118279293", +// "name_arabic": "عبدالرحمن ربيع احمد خلف" +// }, +// { +// "phone": "+201050894194", +// "name_arabic": "محمد أحمد محرم عبد المجيد محرم" +// }, +// { +// "phone": "+201017266806", +// "name_arabic": "احمد ايمن محمود محمود شلبى فايد" +// }, +// { +// "phone": "+201005655832", +// "name_arabic": "سيد عبد الرحمن سيد عبد العال" +// }, +// { +// "phone": "+201276988338", +// "name_arabic": "محمد وفائي مغاوري هندي" +// }, +// { +// "phone": "+201112601263", +// "name_arabic": "محمود محمد عبد الفهيم أمين" +// }, +// { +// "phone": "+201116364239", +// "name_arabic": "حسام خالد حسن المزين" +// }, +// { +// "phone": "+201221800122", +// "name_arabic": "عبد اللطيف محمد عبدالله وف عبد الباسط" +// }, +// { +// "phone": "+201204087896", +// "name_arabic": "اسلام مصطفى شوقى مصطفى" +// }, +// { +// "phone": "+201145294599", +// "name_arabic": "محمد أحمد محمد حامد" +// }, +// { +// "phone": "+201113241794", +// "name_arabic": "عيسي حسن علي عيسي" +// }, +// { +// "phone": "+201270086556", +// "name_arabic": "محمد محمد حسني محمد مراد محمود" +// }, +// { +// "phone": "+201003758852", +// "name_arabic": "محمود جابر محمود عبد الصمد" +// }, +// { +// "phone": "+201227766879", +// "name_arabic": "السيد محمد عبد الفتاح احمد" +// }, +// { +// "phone": "+201012036826", +// "name_arabic": "محمود محمد عبد التواب" +// }, +// { +// "phone": "+201274774963", +// "name_arabic": "أحمد تامر احمد عبد المجيد" +// }, +// { +// "phone": "+201127604639", +// "name_arabic": "اسلام عبد الوهاب كامل عبد الوهاب" +// }, +// { +// "phone": "+201112135900", +// "name_arabic": "مصطفى محمد مصطفى سيد" +// }, +// { +// "phone": "+201114439515", +// "name_arabic": "أسماء محمد محمد قاسم" +// }, +// { +// "phone": "+201024237223", +// "name_arabic": "احمد نبيل أحمد خلف الله" +// }, +// { +// "phone": "+201018632510", +// "name_arabic": "محمد إبراهيم محمود محمد" +// }, +// { +// "phone": "+201006953238", +// "name_arabic": "رباب حنفى كامل صالح" +// }, +// { +// "phone": "+201117953454", +// "name_arabic": "أحمد مصطفى محمود حسنين" +// }, +// { +// "phone": "+201099317916", +// "name_arabic": "فوزيه خالد محمد على" +// }, +// { +// "phone": "+201282199565", +// "name_arabic": "حمد محمد سيف الاسلام عبد الفضيل" +// }, +// { +// "phone": "+201120840502", +// "name_arabic": "علاء السيد محمد محمد" +// }, +// { +// "phone": "+201283170305", +// "name_arabic": "محمود جمال عبد الوهاب محمد" +// }, +// { +// "phone": "+201011492446", +// "name_arabic": "محمد ممدوح محمد علي" +// }, +// { +// "phone": "+201000255720", +// "name_arabic": "مصطفي محمود على عبد الواحد" +// }, +// { +// "phone": "+201110797333", +// "name_arabic": "فادي شوقي علي العفيفي" +// }, +// { +// "phone": "+201014929379", +// "name_arabic": "محمد عيد محروس عبد العزيز" +// }, +// { +// "phone": "+201128399780", +// "name_arabic": "شوقي سيد موسي شحاته" +// }, +// { +// "phone": "+201062166038", +// "name_arabic": "محمد ابراهيم ابراهيم عبدالعال" +// }, +// { +// "phone": "+201007619336", +// "name_arabic": "احمد خلف احمد عبد العزيز" +// }, +// { +// "phone": "+201122408441", +// "name_arabic": "علاء محمد معوض عبد الغنى" +// }, +// { +// "phone": "+201099568634", +// "name_arabic": "أحمد صابر عبد البديع احمد علي" +// }, +// { +// "phone": "+201112105588", +// "name_arabic": "طس سيد محمد بشيرى" +// }, +// { +// "phone": "+201013453419", +// "name_arabic": "عمرو محمد عبد الجليل احمد خليفه" +// }, +// { +// "phone": "+201096605887", +// "name_arabic": "سامح محمد أسامة محمد" +// }, +// { +// "phone": "+201009078314", +// "name_arabic": "خالد عصام احمد محمد" +// }, +// { +// "phone": "+201271401468", +// "name_arabic": "يحيى محمود عبد العزيز محمود" +// }, +// { +// "phone": "+201013328918", +// "name_arabic": "عماد الدين فتحي محمد عبد المعطى" +// }, +// { +// "phone": "+201117793961", +// "name_arabic": "محمد عبد الحميد عبد الفتاح السيد غراقي" +// }, +// { +// "phone": "+201030014226", +// "name_arabic": "عادل عبد الفتاح حماده عبد النعيم" +// }, +// { +// "phone": "+201226649684", +// "name_arabic": "شادي يوسف حسين شهاب" +// }, +// { +// "phone": "+201100095700", +// "name_arabic": "أحمد سامي عبد الهادي عبد الحميد" +// }, +// { +// "phone": "+201104339713", +// "name_arabic": "علاء مصطفى محمد حسنى" +// }, +// { +// "phone": "+201129949831", +// "name_arabic": "محمد عبدربة احمد عفيفي" +// }, +// { +// "phone": "+201116185616", +// "name_arabic": "محمد عز الدين عباس ابراهيم" +// }, +// { +// "phone": "+201226315730", +// "name_arabic": "هاني محمد رمضان ابراهيم" +// }, +// { +// "phone": "+201023247045", +// "name_arabic": "شرف نبيل زكي شنوده" +// }, +// { +// "phone": "+201210732122", +// "name_arabic": "رامي وهبة بخيت عبد الملاك" +// }, +// { +// "phone": "+201093122561", +// "name_arabic": "محمد ناجي اسماعيل سنوسي" +// }, +// { +// "phone": "+201002772429", +// "name_arabic": "صبري جمال عبد العاطي عبد الغني" +// }, +// { +// "phone": "+201129168047", +// "name_arabic": "محمد حسين سليمان محمود" +// }, +// { +// "phone": "+201100667988", +// "name_arabic": "فاطمة عيد محمود محمد" +// }, +// { +// "phone": "+201062603244", +// "name_arabic": "دنيا حمدى سيد عبد العزيز" +// }, +// { +// "phone": "+201020969782", +// "name_arabic": "بلال محمود محمد شكر" +// }, +// { +// "phone": "+201006217344", +// "name_arabic": "عاطف محمد عبد المنعم إبراهيم حسين" +// }, +// { +// "phone": "+201116961995", +// "name_arabic": "محمود رمضان عبد النبي سليمان" +// }, +// { +// "phone": "+201285856337", +// "name_arabic": "عمرو محمد على محمد السعودى" +// }, +// { +// "phone": "+201212258721", +// "name_arabic": "شعبان محمد السيد محمد" +// }, +// { +// "phone": "+201092977597", +// "name_arabic": "أحمد أنور عبد الشافي سليما عيد" +// }, +// { +// "phone": "+201124841570", +// "name_arabic": "محمد ابراهيم السيد حسين" +// }, +// { +// "phone": "+201205686247", +// "name_arabic": "أحمد فتحي أبوزيد محمد" +// }, +// { +// "phone": "+201288803594", +// "name_arabic": "مسعد جميل محمد حسين" +// }, +// { +// "phone": "+201027481133", +// "name_arabic": "زياد محمد مصطفي كامل" +// }, +// { +// "phone": "+201021017211", +// "name_arabic": "حمد طاهر إبراهيم محمد" +// }, +// { +// "phone": "+201033159408", +// "name_arabic": "ايمن فوزي عبد الحميد محمد ابراهيم" +// }, +// { +// "phone": "+201005334995", +// "name_arabic": "محمد محمد عبد الحليم نصار" +// }, +// { +// "phone": "+201278378190", +// "name_arabic": "محمد أشرف محمد أحمد رمضان" +// }, +// { +// "phone": "+201022288846", +// "name_arabic": "محمد سمير صدقي محمد" +// }, +// { +// "phone": "+201201178480", +// "name_arabic": "عبد المنعم عبد المجيد عبد المنعم عبد المجيد الصباغ" +// }, +// { +// "phone": "+201143338810", +// "name_arabic": "صباح محمد محمد الطنطاوى" +// }, +// { +// "phone": "+201032960990", +// "name_arabic": "محمود فؤاد سليم محمد" +// }, +// { +// "phone": "+201204381466", +// "name_arabic": "محمود محمد عبد النبى محمد" +// }, +// { +// "phone": "+201122220798", +// "name_arabic": "داليا محي الدين احمد حفناوي" +// }, +// { +// "phone": "+201552070966", +// "name_arabic": "محمد صديق أحمد على" +// }, +// { +// "phone": "+201062767915", +// "name_arabic": "يوسف محمد مصطفى يوسف" +// }, +// { +// "phone": "+201122352926", +// "name_arabic": "ايمن عبد الغني عبد الغني عبد الحميد" +// }, +// { +// "phone": "+201271331018", +// "name_arabic": "محمد سلطان أبو خليل الشربينى" +// }, +// { +// "phone": "+201500567444", +// "name_arabic": "مصطفي فتحي مصطفي الجنزوري" +// }, +// { +// "phone": "+201223456731", +// "name_arabic": "فيصل عزمي سعد محمود" +// }, +// { +// "phone": "+201500722970", +// "name_arabic": "ابانوب مجدي" +// }, +// { +// "phone": "+201026773473", +// "name_arabic": "عبير ابراهيم الدسوقى محمد" +// }, +// { +// "phone": "+201222722316", +// "name_arabic": "جوزيف تلسن ناشد جرجس" +// }, +// { +// "phone": "+201127625584", +// "name_arabic": "محمود عيسي حسن عيسي" +// }, +// { +// "phone": "+201019782128", +// "name_arabic": "فرج شحاته فرج سنوسي" +// }, +// { +// "phone": "+201124106522", +// "name_arabic": "محمد يحي عبد المقصود مرزوق" +// }, +// { +// "phone": "+201030647080", +// "name_arabic": "أسامة جاسر عبد الصمد ابراهيم" +// }, +// { +// "phone": "+201004771729", +// "name_arabic": "كريم محمود صبحي البشناقي" +// }, +// { +// "phone": "+201070091869", +// "name_arabic": "احمد عبد الجواد محمود المصري احمد" +// }, +// { +// "phone": "+201050774777", +// "name_arabic": "شادي حسن محمد رجب" +// }, +// { +// "phone": "+201124554413", +// "name_arabic": "احمد مصطفي محمد احمد" +// }, +// { +// "phone": "+201208224782", +// "name_arabic": "محمد طارق محمد حافظ" +// }, +// { +// "phone": "+201002524889", +// "name_arabic": "رشا محمد هشام عبد السلام محمد" +// }, +// { +// "phone": "+201050709274", +// "name_arabic": "محمد محمد سلامة علي" +// }, +// { +// "phone": "+201116662263", +// "name_arabic": "علاء عبد العظيم عبد الحفيظ علي" +// }, +// { +// "phone": "+201069721993", +// "name_arabic": "أحمد سعيد محمود بحيري" +// }, +// { +// "phone": "+201100918747", +// "name_arabic": "محمد احمد محمود عبد الباقى" +// }, +// { +// "phone": "+201009496982", +// "name_arabic": "ايمن اسماعيل محمد ابراهيم" +// }, +// { +// "phone": "+201127010150", +// "name_arabic": "ايهاب محمد اسماعيل علي" +// }, +// { +// "phone": "+201205031905", +// "name_arabic": "نسرين حسين على احمد وهبه" +// }, +// { +// "phone": "+201557770122", +// "name_arabic": "محمود ابراهيم احمد ابراهيم" +// }, +// { +// "phone": "Not specified", +// "name_arabic": "عبد المنصف عطية السيد عاشور" +// }, +// { +// "phone": "+201063612004", +// "name_arabic": "محسن عبد الله عبدالله علي" +// }, +// { +// "phone": "+201112235547", +// "name_arabic": "سفيان محمد السيد محمد السيد" +// }, +// { +// "phone": "+201026440737", +// "name_arabic": "محمود يحيى محمد احمد" +// }, +// { +// "phone": "+201102364918", +// "name_arabic": "عمر اشرف رشاد زكى" +// }, +// { +// "phone": "+201273559010", +// "name_arabic": "وائل محمد محمود جوهري" +// }, +// { +// "phone": "+201225301553", +// "name_arabic": "محمد ناصر توفيق محمد" +// }, +// { +// "phone": "+201121641905", +// "name_arabic": "محمد أدمين محمد عبد الزين" +// }, +// { +// "phone": "+201122434387", +// "name_arabic": "عماد حمدي رافت السيد امين" +// }, +// { +// "phone": "+201226508652", +// "name_arabic": "احمد محمد السيد محمد عبد الله خليفة" +// }, +// { +// "phone": "+201146207812", +// "name_arabic": "فاطمة محمد ابراهيم محروس" +// }, +// { +// "phone": "+201121640699", +// "name_arabic": "مصطفي زكي أمين فواز" +// }, +// { +// "phone": "+201221138834", +// "name_arabic": "ابراهيم خليل محمود غنيم" +// }, +// { +// "phone": "+201033984567", +// "name_arabic": "سامح نبيل اندراوس يوسف" +// }, +// { +// "phone": "+201003780161", +// "name_arabic": "محمد علي عابدين احمد" +// }, +// { +// "phone": "+201113328519", +// "name_arabic": "مصطفى خميس عزوز حسن" +// }, +// { +// "phone": "+201220446968", +// "name_arabic": "خالد أحمد هاشم محمد" +// }, +// { +// "phone": "+201153456392", +// "name_arabic": "محمد عصفور على محمد" +// }, +// { +// "phone": "+201070129941", +// "name_arabic": "محمود احمد محمود أمين" +// }, +// { +// "phone": "+201115720101", +// "name_arabic": "وليد عبد الغنى رشوان عبد الغنى" +// }, +// { +// "phone": "+201098123666", +// "name_arabic": "أحمد طلعت أحمد محمود نصير" +// }, +// { +// "phone": "+201003229794", +// "name_arabic": "تامر مجدى إسماعيل محمد" +// }, +// { +// "phone": "+201115207050", +// "name_arabic": "محمد سعيد ابراهيم حسن" +// }, +// { +// "phone": "+201150936625", +// "name_arabic": "كريم عماد محمد حبيب" +// }, +// { +// "phone": "+201006770662", +// "name_arabic": "محمد طارق عبد العليم شلقامى" +// }, +// { +// "phone": "+201277363397", +// "name_arabic": "محمود عصام الدين على محمد" +// }, +// { +// "phone": "+201016636646", +// "name_arabic": "عبير روحي صبحي الكيالى" +// }, +// { +// "phone": "+201224826930", +// "name_arabic": "محمد فتحى شعبان متولى" +// }, +// { +// "phone": "+201155215891", +// "name_arabic": "احمد جوهرى ابو العز المسيدى" +// }, +// { +// "phone": "+201061886532", +// "name_arabic": "عمر عبد العزيز على محمد محمد" +// }, +// { +// "phone": "+201000669808", +// "name_arabic": "محمد ماجد عبد الرؤوف علي" +// }, +// { +// "phone": "+201208004930", +// "name_arabic": "وائل نبيل سعد حسن محمد الشامي" +// }, +// { +// "phone": "+201002831939", +// "name_arabic": "عبد العزيز عصام حسن السيد" +// }, +// { +// "phone": "+201003897747", +// "name_arabic": "محمد أحمد حسين احمد" +// }, +// { +// "phone": "+201145814704", +// "name_arabic": "‏يحيى بشير عوض" +// }, +// { +// "phone": "+201289259318", +// "name_arabic": "مينا جميل جاد جندي" +// }, +// { +// "phone": "+201004571000", +// "name_arabic": "محمد بشير ابراهيم حمادة" +// }, +// { +// "phone": "+201123298669", +// "name_arabic": "احمد رجب فاروق حسن" +// }, +// { +// "phone": "+201150304075", +// "name_arabic": "احمد محمود أحمد محمد" +// }, +// { +// "phone": "+201280838169", +// "name_arabic": "مصطفى رمضان عبد الحفيظ رمضان أبو السعود" +// }, +// { +// "phone": "+201113931993", +// "name_arabic": "هانى حمدي عبد الغني امين" +// }, +// { +// "phone": "+201030282895", +// "name_arabic": "سعيد جلال اسماعيل حسين المغربي" +// }, +// { +// "phone": "+201110183605", +// "name_arabic": "ـد يسري احمد سليمان" +// }, +// { +// "phone": "+201004912848", +// "name_arabic": "شريف السيد ماجد عبد الله البهنساوي" +// }, +// { +// "phone": "+201002918886", +// "name_arabic": "هالة مجدي ابراهيم عابدين" +// }, +// { +// "phone": "+201205966805", +// "name_arabic": "طارق خليل عبد الباري خليل" +// }, +// { +// "phone": "+201066468393", +// "name_arabic": "ياسر رافت رمضان على حسن" +// }, +// { +// "phone": "+201140543155", +// "name_arabic": "كمال رجب كمال عيد" +// }, +// { +// "phone": "+201004943163", +// "name_arabic": "احمد محمود عبد الحليم الشربيني" +// }, +// { +// "phone": "+201062048050", +// "name_arabic": "حسين محمد حسين عثمان" +// }, +// { +// "phone": "+201113614936", +// "name_arabic": "عبد الحكيم محمد فرج عبد الحكيم" +// }, +// { +// "phone": "+201119100748", +// "name_arabic": "طارق رمضان خليل حسن" +// }, +// { +// "phone": "+201140592538", +// "name_arabic": "زياد رمضان محمد حسن" +// }, +// { +// "phone": "+201553840006", +// "name_arabic": "إيهاب عبد العليم بيومي علي" +// }, +// { +// "phone": "+201122455862", +// "name_arabic": "محمد فتحي طة محمود عفيفي" +// }, +// { +// "phone": "+201001948605", +// "name_arabic": "سامح عبد الجليل يس احمد" +// }, +// { +// "phone": "+201120131867", +// "name_arabic": "كريم أحمد على أحمد المغربى" +// }, +// { +// "phone": "+201022660639", +// "name_arabic": "ابراهيم محمد ابراهيم النمر" +// }, +// { +// "phone": "+201063264483", +// "name_arabic": "عمر خالد مسعود الخارجى عمر" +// }, +// { +// "phone": "+201010239329", +// "name_arabic": "سالى حمدى حسين محمد" +// }, +// { +// "phone": "+201116951169", +// "name_arabic": "امير فؤاد غنامي ادوار شاكر" +// }, +// { +// "phone": "+201111697961", +// "name_arabic": "علاء سعد عبد الحميد محمد" +// }, +// { +// "phone": "+201110121075", +// "name_arabic": "عبد الحميد محمد عبد الحميد متولى" +// }, +// { +// "phone": "+201155100571", +// "name_arabic": "ياسر محمود علي ابراهيم" +// }, +// { +// "phone": "+201118886390", +// "name_arabic": "اسلام فؤاد محي الدين فؤاد" +// }, +// { +// "phone": "+201092214793", +// "name_arabic": "محمد عبد الحميد عبد الوهاب عبد الله" +// }, +// { +// "phone": "+201099189926", +// "name_arabic": "رجب محمود سليم عبد العارف" +// }, +// { +// "phone": "+201117498818", +// "name_arabic": "مؤمن محمد حسنى متولي" +// }, +// { +// "phone": "+201554600816", +// "name_arabic": "محمود ابراهيم على احمد" +// }, +// { +// "phone": "+201224213162", +// "name_arabic": "هاني سيد رجب سيد" +// }, +// { +// "phone": "+201098700882", +// "name_arabic": "احمد اسامه عبد الخالق ابراهيم مصطفى" +// }, +// { +// "phone": "+201555094562", +// "name_arabic": "اياد طارق سليمان شمس" +// }, +// { +// "phone": "+201091057132", +// "name_arabic": "عمار رأفت محمد عبد الوهاب" +// }, +// { +// "phone": "+201001187135", +// "name_arabic": "علاء عصام الدين عبد العظيم عامر" +// }, +// { +// "phone": "+201032995929", +// "name_arabic": "أحمد ناصر محيى محمد" +// }, +// { +// "phone": "+201122559548", +// "name_arabic": "احمد محمد زين العابدين دوريش" +// }, +// { +// "phone": "+201025500060", +// "name_arabic": "رومانى وجيه عبد الملاك يوسف" +// }, +// { +// "phone": "+201142889397", +// "name_arabic": "هاجر على حسن محمود" +// }, +// { +// "phone": "+201005815095", +// "name_arabic": "احمد محمد حسن مرسي" +// }, +// { +// "phone": "+201118674734", +// "name_arabic": "طارق مصطفى سعيد محمود" +// }, +// { +// "phone": "+201111395447", +// "name_arabic": "محمد سعيد جميل محمد" +// }, +// { +// "phone": "+201200622129", +// "name_arabic": "ياسر فاروق راغب عبداللاة" +// }, +// { +// "phone": "+201090809381", +// "name_arabic": "محمد شعبان محمد محمود" +// }, +// { +// "phone": "+201141231122", +// "name_arabic": "محمد سيد إبراهيم عبد الدايم" +// }, +// { +// "phone": "+201028258757", +// "name_arabic": "محمد عادل محمد عبد النبى" +// }, +// { +// "phone": "+201005551287", +// "name_arabic": "محمد شريف مصطفي محمود" +// }, +// { +// "phone": "+201110131395", +// "name_arabic": "حمد عبد السلام عبد الحليم البدرشيني" +// }, +// { +// "phone": "+201050308631", +// "name_arabic": "عبد الخالق جمعه عبد الخالق عبد الوهاب" +// }, +// { +// "phone": "+201120643353", +// "name_arabic": "عبد الرحمن احمد كمال الدين فرحات" +// }, +// { +// "phone": "+201009008695", +// "name_arabic": "عبد الرحمن كامل احمد ابو عوف" +// }, +// { +// "phone": "+201025752902", +// "name_arabic": "ابرام سعد ميخائيل" +// }, +// { +// "phone": "+201120272743", +// "name_arabic": "عبد الرحمن محمد عزام راشد" +// }, +// { +// "phone": "+201125670087", +// "name_arabic": "عادل المعداوي المتولى عابدين" +// }, +// { +// "phone": "+201015145156", +// "name_arabic": "عبد الرحمن احمد عبد الرحمن السيد" +// }, +// { +// "phone": "+201013122671", +// "name_arabic": "أحمد سعيد عبد الهادي سليمان" +// }, +// { +// "phone": "+201000907333", +// "name_arabic": "احمد محمد حسن محمود يوسف" +// }, +// { +// "phone": "+201277178299", +// "name_arabic": "أحمد محمد اسماعيل فرج بكر" +// }, +// { +// "phone": "+201111585333", +// "name_arabic": "احمد ناصر أحمد عطى" +// }, +// { +// "phone": "+201140052406", +// "name_arabic": "أحمد فتحي عبد الله عبد الله" +// }, +// { +// "phone": "+201159057746", +// "name_arabic": "احمد محمود يوسف حسين علي" +// }, +// { +// "phone": "+201014314916", +// "name_arabic": "احمد منصور فاضل محمد" +// }, +// { +// "phone": "+201019645546", +// "name_arabic": "احمد عبد البديع احمد غازي" +// }, +// { +// "phone": "+201007043403", +// "name_arabic": "احمد سعيد علي محمد سعد" +// }, +// { +// "phone": "+201000843988", +// "name_arabic": "أحمد ياسر اسماعيل عامر" +// }, +// { +// "phone": "+201099194020", +// "name_arabic": "احمد محمد ابراهيم عبد العزيز" +// }, +// { +// "phone": "+201147626662", +// "name_arabic": "أحمد حمدي عبد العزيز عبد الكريم" +// }, +// { +// "phone": "+201129157007", +// "name_arabic": "علاء صبحى عبد المجيد سيد أحمد" +// }, +// { +// "phone": "+201288875943", +// "name_arabic": "على رشيدي على محمد عبد القادر" +// }, +// { +// "phone": "+201145794442", +// "name_arabic": "محمد جمال محمد عبدالرحمن" +// }, +// { +// "phone": "+201228563209", +// "name_arabic": "عمرو محمد احمد جوده" +// }, +// { +// "phone": "+201005303891", +// "name_arabic": "محمد خالد محمد حسن" +// }, +// { +// "phone": "+201001325351", +// "name_arabic": "أنور بدر الدين انور محمد" +// }, +// { +// "phone": "+201159515877", +// "name_arabic": "احمد عبد الحميد عويس عبد الحميد" +// }, +// { +// "phone": "+201128008500", +// "name_arabic": "عمرو صلاح الدين عبد المعبود احمد" +// }, +// { +// "phone": "+201003020447", +// "name_arabic": "أيمن محمد عبد العظيم عبدة" +// }, +// { +// "phone": "+201009972255", +// "name_arabic": "أحمد سعيد أبراهيم ضيف الله" +// }, +// { +// "phone": "+201097474346", +// "name_arabic": "هادي سمير صبحى مصطفى" +// }, +// { +// "phone": "+201272050735", +// "name_arabic": "ميلاد عطا الله حنا اللـه" +// }, +// { +// "phone": "+201276380076", +// "name_arabic": "بيشوي عماد سامي تكلا" +// }, +// { +// "phone": "+201275816850", +// "name_arabic": "بيتز سامي فاروق كامل جرجس" +// }, +// { +// "phone": "+201003400053", +// "name_arabic": "محمد خميس محمد ابراهيم" +// }, +// { +// "phone": "+201010406456", +// "name_arabic": "محمد مجاهد عبد العزيز الفرماوي" +// }, +// { +// "phone": "+201064982002", +// "name_arabic": "ياسمين أسامة إبراهيم فضل رجب" +// }, +// { +// "phone": "+201554919416", +// "name_arabic": "محمد طلعت علي ابو الحسن" +// }, +// { +// "phone": "+201141822739", +// "name_arabic": "حسام خالد محمد رمضان جمعه" +// }, +// { +// "phone": "+201011563137", +// "name_arabic": "محمد جلال محمد يوسف" +// }, +// { +// "phone": "+201501005808", +// "name_arabic": "محمد حسن حماد أحمد سلام" +// }, +// { +// "phone": "+201141603614", +// "name_arabic": "احمد جمال امين عبدالحميد" +// }, +// { +// "phone": "+201141385551", +// "name_arabic": "يحيي السيد جابر علي سليمان" +// }, +// { +// "phone": "+201119128053", +// "name_arabic": "اسلام محسن شعبان شلبي" +// }, +// { +// "phone": "+201014456190", +// "name_arabic": "ضيا عبد القادر ايوب ابو الشعيشع" +// }, +// { +// "phone": "+201128852395", +// "name_arabic": "حسام عادل محمد محمد" +// }, +// { +// "phone": "+201066632909", +// "name_arabic": "ايهاب محمود عبد المنعم محمود" +// }, +// { +// "phone": "+201281403504", +// "name_arabic": "هاني سمير ناصف فرج" +// }, +// { +// "phone": "+201146213244", +// "name_arabic": "كريم ياسر حسن رمضان" +// }, +// { +// "phone": "+201030296440", +// "name_arabic": "عمر علي عبد الواحد عوض" +// }, +// { +// "phone": "+201287171970", +// "name_arabic": "عماد محمد خمس هريدي" +// }, +// { +// "phone": "+201024383011", +// "name_arabic": "مينا مجدى فوزى فهيم" +// }, +// { +// "phone": "+201226790797", +// "name_arabic": "كريم محمد عبد اللطيف الفيومي" +// }, +// { +// "phone": "+201022660026", +// "name_arabic": "رشا السيد محمد يونس متولي" +// }, +// { +// "phone": "+201151625649", +// "name_arabic": "عزت عادل حسن رمضان بركات" +// }, +// { +// "phone": "+201148199476", +// "name_arabic": "محمود على فؤاد على" +// }, +// { +// "phone": "+201007528334", +// "name_arabic": "محمد سيد ابراهيم محمود" +// }, +// { +// "phone": "+201032080240", +// "name_arabic": "محمد احمد عادل محمود" +// }, +// { +// "phone": "+201140750338", +// "name_arabic": "ايهاب موسى محمد عبد العظيم" +// }, +// { +// "phone": "+201004800479", +// "name_arabic": "أحمد السيد عبد العزيز سيد" +// }, +// { +// "phone": "+201279348960", +// "name_arabic": "احمد محمد احمد ابوجمعه" +// }, +// { +// "phone": "+201121645943", +// "name_arabic": "محمود صلاح عبد النبي عامر" +// }, +// { +// "phone": "+201062462489", +// "name_arabic": "سامح جمعة امام السيد" +// }, +// { +// "phone": "+201067851290", +// "name_arabic": "سمر محروس عبدالرازق السيد دويدار" +// }, +// { +// "phone": "+201062031886", +// "name_arabic": "عمرو عبد النبي الشوادفي علي" +// }, +// { +// "phone": "+201128921222", +// "name_arabic": "هشام فتحى محمد عبد الغفار" +// }, +// { +// "phone": "+201211240489", +// "name_arabic": "حمدى سيد شعبان محمد" +// }, +// { +// "phone": "+201154025198", +// "name_arabic": "حاتم يسري عبد البديغ السيد احمد" +// }, +// { +// "phone": "+201556206194", +// "name_arabic": "أمنيه احمد سليمان أحمد مصطفي" +// }, +// { +// "phone": "+201223633996", +// "name_arabic": "احمد حلمي منصور الشاذلي" +// }, +// { +// "phone": "+201023990014", +// "name_arabic": "حسام الدين أسامة محمد محمد السيد" +// }, +// { +// "phone": "+201066813717", +// "name_arabic": "حسام صلاح الدين محمود المليجي" +// }, +// { +// "phone": "+201220975075", +// "name_arabic": "حسام حسن منصور حسن منصور" +// }, +// { +// "phone": "+201011919972", +// "name_arabic": "يوسف عماد الدين محمد منصور" +// }, +// { +// "phone": "+201282192170", +// "name_arabic": "كريم اسامه محمد مصطفى محمد" +// }, +// { +// "phone": "+201025887117", +// "name_arabic": "عز الدين احمد عز الدين سالم" +// }, +// { +// "phone": "+201092240467", +// "name_arabic": "قاسم صبرى قاسم عبد العاطى" +// }, +// { +// "phone": "+201128482002", +// "name_arabic": "حسام عمرو محمود عبد الخالق" +// }, +// { +// "phone": "+201119601947", +// "name_arabic": "محمد أحمد أحمد السيد جمعه" +// }, +// { +// "phone": "+201121719830", +// "name_arabic": "عبد الرحمن محمد درويش حسن" +// }, +// { +// "phone": "+201120760088", +// "name_arabic": "خالد مصطفى مصطفي محمد" +// }, +// { +// "phone": "+201282155207", +// "name_arabic": "خالد علي محمود علي العوجي" +// }, +// { +// "phone": "+201015350360", +// "name_arabic": "محمد خيري عبد السلام حسين" +// }, +// { +// "phone": "+201025869247", +// "name_arabic": "محمّد حسن عبد المقصود عطية" +// }, +// { +// "phone": "+201111624260", +// "name_arabic": "احمد صلاح خليفه زيد عبد الله" +// }, +// { +// "phone": "+201000066103", +// "name_arabic": "يوسف صبحى يوسف تادرس" +// }, +// { +// "phone": "+201005177166", +// "name_arabic": "عادل سيد عبد الله علم الدين" +// }, +// { +// "phone": "+201020841075", +// "name_arabic": "خالد خليفة محمد خليفة" +// }, +// { +// "phone": "+201555610226", +// "name_arabic": "كميل جاد الياس جاد" +// }, +// { +// "phone": "+201283851609", +// "name_arabic": "خالد عزت شاكر احمد" +// }, +// { +// "phone": "+201030950666", +// "name_arabic": "خالد عصام فؤاد محمد" +// }, +// { +// "phone": "+201093359914", +// "name_arabic": "محمد توفيق عبد الفتاح محمود" +// }, +// { +// "phone": "+201011785198", +// "name_arabic": "بلال بسام محمد بهاء محمد العجوز" +// }, +// { +// "phone": "+201028507015", +// "name_arabic": "كريم كمال الدين محمد المهدى الشريف" +// }, +// { +// "phone": "+201276503301", +// "name_arabic": "أحمد أيمن أحمد راغب السعدنى" +// }, +// { +// "phone": "+201098386668", +// "name_arabic": "إبراهيم كمال علي شحاته" +// }, +// { +// "phone": "+201001614305", +// "name_arabic": "ياسر عبد المعتال عبد الله منصور" +// }, +// { +// "phone": "+201150031614", +// "name_arabic": "يوسف اسامه محمد عبد المقصود" +// }, +// { +// "phone": "+201114771274", +// "name_arabic": "إبراهيم سيف الدين السيد" +// }, +// { +// "phone": "+201012105656", +// "name_arabic": "محمد احمد محمد عامر" +// }, +// { +// "phone": "+201099930900", +// "name_arabic": "محمد محمود محمد محمود" +// }, +// { +// "phone": "+201119301333", +// "name_arabic": "محمد حسين مصطفى حسين" +// }, +// { +// "phone": "+201121631827", +// "name_arabic": "محمد عبد الكريم حزين ابراهيم" +// }, +// { +// "phone": "+201112650892", +// "name_arabic": "مجدي بسيوني بسيوني الشيخ" +// }, +// { +// "phone": "+201091417774", +// "name_arabic": "محمود السيد حافظ عبد المنطلب" +// }, +// { +// "phone": "+201115319462", +// "name_arabic": "محمود حسين عبد المجيد بخيت" +// }, +// { +// "phone": "+201149555286", +// "name_arabic": "عادل امام عبدالوهاب أبو بكر" +// }, +// { +// "phone": "+201153734446", +// "name_arabic": "محمد عبد الله محمود مندور" +// }, +// { +// "phone": "+201558996766", +// "name_arabic": "مازن ايمن عبد الحميد السيد" +// }, +// { +// "phone": "+201003013600", +// "name_arabic": "محمود مرسى محمد مرسي" +// }, +// { +// "phone": "+201001630816", +// "name_arabic": "مدحت مصطفى احمد يوسف" +// }, +// { +// "phone": "+201005236025", +// "name_arabic": "مدحت عبد الستار على غريب" +// }, +// { +// "phone": "+201279226229", +// "name_arabic": "محمد السيد عبد الخالق محمد" +// }, +// { +// "phone": "+201128569757", +// "name_arabic": "محمد سعيد محمد سعيد عوض" +// }, +// { +// "phone": "+201207808663", +// "name_arabic": "مايكل عادل عبد الملاك ابادير" +// }, +// { +// "phone": "+201203335895", +// "name_arabic": "محمد مصطفى محروس عبد المجيد" +// }, +// { +// "phone": "+201111818480", +// "name_arabic": "مروان خالد مصطفى موسى محمد" +// }, +// { +// "phone": "+201008617949", +// "name_arabic": "محمد محمود الشحات محمود" +// }, +// { +// "phone": "+201023680342", +// "name_arabic": "محمد محمود علي البيومي" +// }, +// { +// "phone": "+201010796171", +// "name_arabic": "محمد أحمد محمد محمد أبو الوفا" +// }, +// { +// "phone": "+201030442939", +// "name_arabic": "محمد علي حسن عبد المجيد" +// }, +// { +// "phone": "+201024434374", +// "name_arabic": "محمد محمود مغاورى غريب" +// }, +// { +// "phone": "+201011091249", +// "name_arabic": "محمد علاء الدين محمود محمد" +// }, +// { +// "phone": "+201011880924", +// "name_arabic": "محمد السعيد زكي حسن الزرقاني" +// }, +// { +// "phone": "+201008682147", +// "name_arabic": "محمد عز الدين محمد عبد الرحمن" +// }, +// { +// "phone": "+201010498596", +// "name_arabic": "مصطفي إبراهيم محمد عبد الرازق" +// }, +// { +// "phone": "+201001173021", +// "name_arabic": "مصطفي أحمد محمد أحمد منصور" +// }, +// { +// "phone": "+201030023243", +// "name_arabic": "شريف عبد المنعم سعد الصباغ" +// }, +// { +// "phone": "+201024248061", +// "name_arabic": "محمد يسرى السيد محمد" +// }, +// { +// "phone": "+201023435021", +// "name_arabic": "محمود احمد عبد الله محمود" +// }, +// { +// "phone": "+201277362080", +// "name_arabic": "محمد زكريا السيد ابراهيم" +// }, +// { +// "phone": "+201008053391", +// "name_arabic": "محمود سعد عبد العاطى على" +// }, +// { +// "phone": "+201550132936", +// "name_arabic": "عمرو سعيد السيد علي علي" +// }, +// { +// "phone": "+201555751219", +// "name_arabic": "ندا سعيد محمد كامل امين" +// }, +// { +// "phone": "+201125748886", +// "name_arabic": "ضياء عبد القادر مصطفي الدمياطي" +// }, +// { +// "phone": "+201126089520", +// "name_arabic": "عمر أشرف سيد محمد" +// }, +// { +// "phone": "+201125388876", +// "name_arabic": "محمود محمد السيد عبد السلام" +// }, +// { +// "phone": "+201114988892", +// "name_arabic": "يوسف محمد رفعت عقل عيد الجواد" +// }, +// { +// "phone": "+201117192581", +// "name_arabic": "ياسين محمود محمد الخشت" +// }, +// { +// "phone": "+201017035902", +// "name_arabic": "محمود مجدي محمود محمود" +// }, +// { +// "phone": "+201150305096", +// "name_arabic": "عمر يسرى انور محمد امين الغندور" +// }, +// { +// "phone": "+201011305982", +// "name_arabic": "اسامة محمد ابراهيم السيد" +// }, +// { +// "phone": "+201011118464", +// "name_arabic": "أسامة محمود جبريل بدوي" +// }, +// { +// "phone": "+201275537915", +// "name_arabic": "وليد محمد جابر عبد اللطيف" +// }, +// { +// "phone": "+201156265716", +// "name_arabic": "احمد عصام فؤاد دسوقى" +// }, +// { +// "phone": "+201069074613", +// "name_arabic": "قاسم محمد السيد عبد الفتاح" +// }, +// { +// "phone": "+201207121802", +// "name_arabic": "خلود صلاح حسن ابراهيم الشيمى" +// }, +// { +// "phone": "+201029999812", +// "name_arabic": "عبد الرؤف الشحات عبد الرؤف سلامه" +// }, +// { +// "phone": "+201287378742", +// "name_arabic": "محمد مختار عبد الحميد طنطاوي" +// }, +// { +// "phone": "+201143730080", +// "name_arabic": "احمد فيصل محمد غراب" +// }, +// { +// "phone": "+201023674737", +// "name_arabic": "مينا نادي روف شفيق" +// }, +// { +// "phone": "+201276524124", +// "name_arabic": "ماجد ناصر بخيت حبشي" +// }, +// { +// "phone": "+201023532380", +// "name_arabic": "رمضان حنفى حمدان" +// }, +// { +// "phone": "+201117137733", +// "name_arabic": "سعيد جمال عبد العظيم شبانة" +// }, +// { +// "phone": "+201017108144", +// "name_arabic": "عبد العظيم حمدى عبد العظيم على" +// }, +// { +// "phone": "+201040761726", +// "name_arabic": "حازم محمد سمير عبد الحميد قمر" +// }, +// { +// "phone": "+201008828650", +// "name_arabic": "صدقى مدحت صدقى عبد العزيز حسن" +// }, +// { +// "phone": "+201144967048", +// "name_arabic": "شريف محمد فاروق محمد عبد الرحيم" +// }, +// { +// "phone": "+201007561028", +// "name_arabic": "عمرو مصطفي إبراهيم عبد الرحمن" +// }, +// { +// "phone": "+201111270344", +// "name_arabic": "احمد ابراهيم امين ابراهيم" +// }, +// { +// "phone": "+201022828189", +// "name_arabic": "سعيد سعيد علي متولي" +// }, +// { +// "phone": "+201062718466", +// "name_arabic": "خالد اشرف عثمان محمد عثمان" +// }, +// { +// "phone": "+201158580824", +// "name_arabic": "كريم زكريا محمد ابراهيم" +// }, +// { +// "phone": "+201029170314", +// "name_arabic": "محمد سعيد عبد الوهاب كريم" +// }, +// { +// "phone": "+201093092520", +// "name_arabic": "عبد السلام جابر داود سليمان عوض" +// }, +// { +// "phone": "+201091680777", +// "name_arabic": "طارق ابراهيم سيد ابراهيم" +// }, +// { +// "phone": "+201028406772", +// "name_arabic": "اسماعيل مصطفى أحمد اسماعيل" +// }, +// { +// "phone": "+201224605015", +// "name_arabic": "حسن حنفي حسن محمود حنفي" +// }, +// { +// "phone": "+201158869997", +// "name_arabic": "احمد عبد الظاهر محمد احمد" +// }, +// { +// "phone": "+201069500796", +// "name_arabic": "حسن صابر حسن طنطاوي" +// }, +// { +// "phone": "+201112267610", +// "name_arabic": "حسن محمود حسن حسين محمد" +// }, +// { +// "phone": "+201111317680", +// "name_arabic": "حازم رشاد قناوي عبد الرحيم" +// }, +// { +// "phone": "+201228782475", +// "name_arabic": "محمد هشام طه محمود ابراهيم" +// }, +// { +// "phone": "+201019408095", +// "name_arabic": "تامر رمضان محمد عطية الشرقاوي" +// }, +// { +// "phone": "+201095834300", +// "name_arabic": "اسلام مسعد فرغلي احمد" +// }, +// { +// "phone": "+201001281884", +// "name_arabic": "محمود محمد فتحى رفاعى" +// }, +// { +// "phone": "+201000700772", +// "name_arabic": "محمود احمد محمود علي صبيح" +// }, +// { +// "phone": "+201024769948", +// "name_arabic": "احمد محمود سليمان حسن" +// }, +// { +// "phone": "+201227238483", +// "name_arabic": "كريم جميل حافظ محمد الشافعي" +// }, +// { +// "phone": "+201027659070", +// "name_arabic": "محمد عبد القادر محمد الرعو" +// }, +// { +// "phone": "+201005145830", +// "name_arabic": "دعاء سمير محى عبد الرحمن" +// }, +// { +// "phone": "+201147429209", +// "name_arabic": "احمد محمد حسن الضوى" +// }, +// { +// "phone": "+201018876543", +// "name_arabic": "ابراهيم اسامه حسين ابراهيم باهى" +// }, +// { +// "phone": "+201101795866", +// "name_arabic": "عبد الرحمن ياسر شعبان سيد على" +// }, +// { +// "phone": "+201016606964", +// "name_arabic": "محمد موسى وفائى محمود" +// }, +// { +// "phone": "+201220291444", +// "name_arabic": "محمد عماد صالح مصطفى" +// }, +// { +// "phone": "+201090333810", +// "name_arabic": "سمر سمير صلاح عبد الصبور" +// }, +// { +// "phone": "+201004008170", +// "name_arabic": "محمد أحمد عبد العال حسين" +// }, +// { +// "phone": "+201285170898", +// "name_arabic": "باسم احمد احمد ابراهيم احمد" +// }, +// { +// "phone": "+201221212426", +// "name_arabic": "يحيى محمد نجيب سليمان عطا الله" +// }, +// { +// "phone": "+201094255708", +// "name_arabic": "أميرة أحمد عبد الرحمن حامد" +// }, +// { +// "phone": "+201090119050", +// "name_arabic": "محمد يحيي أبوسريع طلبة" +// }, +// { +// "phone": "+201100171038", +// "name_arabic": "محمود محمد السيد محمد حسانين" +// }, +// { +// "phone": "+201000927483", +// "name_arabic": "ريهام أحمد عبد الغنى السيد" +// }, +// { +// "phone": "+201121222320", +// "name_arabic": "هشام صالح محمد صالح" +// }, +// { +// "phone": "+201553324455", +// "name_arabic": "مصطفى سعيد محمود محمود عمار" +// }, +// { +// "phone": "+201273273705", +// "name_arabic": "ابراهيم احمد ابراهيم محمود الغنام" +// }, +// { +// "phone": "+201280256821", +// "name_arabic": "محمد مختار محمد عبدالله" +// }, +// { +// "phone": "+201101046160", +// "name_arabic": "محمود محمد محمود مرسي" +// }, +// { +// "phone": "+201030967187", +// "name_arabic": "احمد عصام أحمد البدراوي" +// }, +// { +// "phone": "+201154856968", +// "name_arabic": "يوسف مصطفى سعودى محمد" +// }, +// { +// "phone": "+201154545375", +// "name_arabic": "محمد رضا محمد احمد" +// }, +// { +// "phone": "+201012181696", +// "name_arabic": "محمد حسن محمد احمد" +// }, +// { +// "phone": "+201145446863", +// "name_arabic": "هند محسن عبدربه صباح احمد" +// }, +// { +// "phone": "+201125722294", +// "name_arabic": "محمود عبد الناصر عبد الرحمن أحمد" +// }, +// { +// "phone": "+201500377888", +// "name_arabic": "شحات رشدي السيد عبداللطيف" +// } +// ] + +// '''; diff --git a/siro_service/lib/controller/mainController/pages/driver_page.dart b/siro_service/lib/controller/mainController/pages/driver_page.dart new file mode 100644 index 0000000..b1efaea --- /dev/null +++ b/siro_service/lib/controller/mainController/pages/driver_page.dart @@ -0,0 +1,226 @@ +import 'package:flutter/cupertino.dart'; +import 'package:flutter/material.dart'; +import 'package:get/get.dart'; + +import '../main_controller.dart'; + +class DriverPage extends StatelessWidget { + DriverPage({super.key}); + + final MainController mainController = Get.find(); + + @override + Widget build(BuildContext context) { + return Scaffold( + body: GetBuilder(builder: (mainController) { + Map data = mainController.driverData['message'][0]; + + return CupertinoPageScaffold( + navigationBar: CupertinoNavigationBar( + middle: Text('${data['first_name']} ${data['last_name']}'), + ), + child: SafeArea( + child: CupertinoScrollbar( + child: ListView( + children: [ + _buildDriverInfoSection(data), + _buildCommunicationSection(data, context), + _buildStatisticsSection(data), + _buildCarInfoSection(data), + _buildLicenseInfoSection(data), + _buildBankInfoSection(data), + const SizedBox(height: 40), + ], + ), + ), + ), + ); + }), + ); + } + + // ============================================================ + // REUSABLE EDIT ROW + // ============================================================ + Widget _buildEditableRow(String label, String key, Map data) { + return CupertinoListTile( + title: Text(label), + trailing: Text( + data[key].toString(), + style: const TextStyle(color: CupertinoColors.systemGrey), + ), + onTap: () => _openEditSheet(label, key, data[key]), + ); + } + + void _openEditSheet(String label, String key, dynamic value) { + final TextEditingController controller = + TextEditingController(text: value.toString()); + + Get.bottomSheet( + CupertinoPageScaffold( + navigationBar: CupertinoNavigationBar( + middle: Text("Edit $label"), + trailing: GestureDetector( + child: const Text( + "Save", + style: TextStyle(color: CupertinoColors.activeBlue), + ), + onTap: () { + mainController.updateDriverField(key, controller.text); + Get.back(); + }, + ), + ), + child: SafeArea( + child: Padding( + padding: const EdgeInsets.all(16), + child: CupertinoTextField( + controller: controller, + autofocus: true, + ), + ), + ), + ), + ); + } + + // ============================================================ + // SECTIONS + // ============================================================ + + Widget _buildDriverInfoSection(Map data) { + return CupertinoListSection.insetGrouped( + header: Text('Driver Information'.tr), + children: [ + _buildEditableRow('Name Arabic'.tr, 'name_arabic', data), + // _buildEditableRow('Name English'.tr, 'name_english', data), + _buildEditableRow('Phone'.tr, 'phone', data), + _buildEditableRow('Email'.tr, 'email', data), + _buildEditableRow('Gender'.tr, 'gender', data), + _buildEditableRow('Birthdate'.tr, 'birthdate', data), + _buildEditableRow('National Number'.tr, 'national_number', data), + // _buildEditableRow('Religion'.tr, 'religion', data), + // _buildEditableRow('Occupation'.tr, 'occupation', data), + // _buildEditableRow('Education'.tr, 'education', data), + ], + ); + } + + Widget _buildStatisticsSection(Map data) { + return CupertinoListSection.insetGrouped( + header: Text('Driver Statistics'.tr), + children: [ + _buildInfoRow('Total Rides'.tr, data['countRide'].toString()), + _buildInfoRow('Average Rating'.tr, data['rating'].toString()), + _buildInfoRow('Total Payments'.tr, data['totalPayment'].toString()), + _buildInfoRow( + 'Wallet Balance'.tr, data['totalDriverWallet'].toString()), + _buildInfoRow('Complaints'.tr, data['countComplaint'].toString()), + _buildInfoRow('Scam Reports'.tr, data['countScam'].toString()), + _buildInfoRow( + 'Passengers Rated'.tr, data['DRatingPassengersCount'].toString()), + _buildInfoRow( + 'Avg Passenger Rating'.tr, data['avgDRatingPassenger'].toString()), + ], + ); + } + +// Read-only row widget + Widget _buildInfoRow(String label, String value) { + return CupertinoListTile( + title: Text(label), + trailing: Text( + value, + style: const TextStyle(color: CupertinoColors.systemGrey), + ), + ); + } + + Widget _buildCarInfoSection(Map data) { + return CupertinoListSection.insetGrouped( + header: Text('Vehicle Information'.tr), + children: [ + // _buildEditableRow('VIN'.tr, 'vin', data), + _buildEditableRow('Plate Number'.tr, 'car_plate', data), + _buildEditableRow('Make'.tr, 'make', data), + _buildEditableRow('Model'.tr, 'model', data), + _buildEditableRow('Year'.tr, 'year', data), + _buildEditableRow('Color'.tr, 'color', data), + _buildEditableRow('Fuel Type'.tr, 'fuel', data), + // _buildEditableRow('Displacement'.tr, 'displacement', data), + _buildEditableRow('Registration Date'.tr, 'registration_date', data), + _buildEditableRow('Expiration Date'.tr, 'expiration_date', data), + ], + ); + } + + Widget _buildLicenseInfoSection(Map data) { + return CupertinoListSection.insetGrouped( + header: Text('License Information'.tr), + children: [ + _buildEditableRow('License Type'.tr, 'license_type', data), + _buildEditableRow('Card ID'.tr, 'card_id', data), + _buildEditableRow('Issue Date'.tr, 'issue_date', data), + _buildEditableRow('Expiry Date'.tr, 'expiry_date', data), + _buildEditableRow('Categories'.tr, 'license_categories', data), + ], + ); + } + + Widget _buildBankInfoSection(Map data) { + return CupertinoListSection.insetGrouped( + header: Text('Bank Information'.tr), + children: [ + _buildEditableRow('Account Number'.tr, 'accountBank', data), + _buildEditableRow('Bank Code'.tr, 'bankCode', data), + ], + ); + } + + Widget _buildCommunicationSection(Map data, BuildContext context) { + String phone = data['phone'] ?? ''; + String name = data['first_name'] ?? ''; + + return CupertinoListSection.insetGrouped( + header: Text('Quick Communication'.tr), + children: [ + CupertinoListTile( + title: Text('Call Driver'.tr), + leading: const Icon(CupertinoIcons.phone_fill, color: Colors.green), + onTap: () => mainController.makePhoneCall(phone), + ), + CupertinoListTile( + title: Text('WhatsApp: Activation'.tr), + leading: const Icon(Icons.send, color: Colors.green), + onTap: () => mainController.launchCommunication( + 'whatsapp', + phone, + 'أهلاً بك يا كابتن $name في انطلق! تم تفعيل حسابك بنجاح وأصبحت مستعداً لاستقبال الرحلات.', + ), + ), + CupertinoListTile( + title: Text('WhatsApp: Missing Docs'.tr), + leading: const Icon(Icons.send, color: Colors.orange), + onTap: () => mainController.launchCommunication( + 'whatsapp', + phone, + 'مرحباً كابتن $name، يرجى تزويدنا بالأوراق الناقصة أو غير الواضحة عبر الواتساب لإكمال تفعيل حسابك.', + ), + ), + CupertinoListTile( + title: Text('WhatsApp: Support'.tr), + leading: const Icon(Icons.send, color: Colors.blue), + onTap: () => mainController.launchCommunication( + 'whatsapp', + phone, + 'مرحباً كابتن $name، معك الدعم الفني من شركة انطلق. كيف يمكنني مساعدتك اليوم؟', + ), + ), + + ], + ); + } +} + + diff --git a/siro_service/lib/controller/mainController/pages/drivers_cant_register.dart b/siro_service/lib/controller/mainController/pages/drivers_cant_register.dart new file mode 100644 index 0000000..c32b877 --- /dev/null +++ b/siro_service/lib/controller/mainController/pages/drivers_cant_register.dart @@ -0,0 +1,223 @@ +import 'package:flutter/cupertino.dart'; +import 'package:flutter/material.dart'; +import 'package:get/get.dart'; +import 'package:siro_service/constant/colors.dart'; +import 'package:siro_service/controller/mainController/main_controller.dart'; +import 'package:siro_service/views/widgets/my_scafold.dart'; +import 'package:siro_service/main.dart'; +import 'package:siro_service/constant/box_name.dart'; + +import 'registration_captain_page.dart'; + +class DriversCantRegister extends StatelessWidget { + DriversCantRegister({super.key}); +// + @override + Widget build(BuildContext context) { + Get.put(MainController()); + + // Unified action button (WhatsApp - Edit - etc) + Widget buildActionButton({ + required IconData icon, + required Color color, + required VoidCallback onPressed, + }) { + return CupertinoButton( + padding: const EdgeInsets.symmetric(horizontal: 6.0), + onPressed: onPressed, + child: Icon(icon, color: color, size: 28), + ); + } + + return MyScaffold( + title: 'Drivers Want Register'.tr, + isleading: true, + body: [ + GetBuilder(builder: (mainController) { + return Column( + children: [ + // Search + Padding( + padding: const EdgeInsets.fromLTRB(16, 8, 16, 8), + child: CupertinoSearchTextField( + keyboardType: TextInputType.phone, + onChanged: (value) => mainController.searchDrivers(value), + placeholder: 'Search by phone number'.tr, + ), + ), + + // List + Expanded( + child: mainController.filteredDrivers.isEmpty + ? Center( + child: Text( + 'No drivers found'.tr, + style: + TextStyle(color: Colors.grey[600], fontSize: 16), + ), + ) + : ListView.builder( + itemCount: mainController.filteredDrivers.length, + itemBuilder: (context, index) { + final driver = mainController.filteredDrivers[index]; + + final notesController = + TextEditingController(text: driver['note'] ?? ''); + + return Card( + margin: const EdgeInsets.symmetric( + horizontal: 12.0, vertical: 8.0), + elevation: 3, + clipBehavior: Clip.antiAlias, + shape: RoundedRectangleBorder( + borderRadius: BorderRadius.circular(12), + side: BorderSide( + color: driver['note'] != null + ? AppColor.secondaryColor + : Colors.transparent, + width: 2.5, + ), + ), + child: Padding( + padding: + const EdgeInsets.fromLTRB(16, 12, 16, 12), + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + // Header + Text( + 'Driver Phone: ${driver['first_name'] ?? ''} ${driver['last_name'] ?? ''}', + style: const TextStyle( + fontWeight: FontWeight.bold, + fontSize: 16, + color: Colors.black87, + ), + ), + + const Divider(height: 20), + + // Phone Row + Row( + children: [ + const Icon( + CupertinoIcons.phone_fill, + color: AppColor.primaryColor, + size: 22, + ), + + const SizedBox(width: 12), + + Expanded( + child: InkWell( + onTap: () { + mainController.makePhoneCall( + driver['phone_number']); + }, + child: Text( + driver['phone_number'] ?? 'N/A', + style: const TextStyle( + fontSize: 17, + letterSpacing: 1.2, + ), + ), + ), + ), + + // WhatsApp button + buildActionButton( + icon: Icons.send, + color: const Color(0xFF25D366), + onPressed: () { + String message = "مرحباً،\n\n" + "يظهر لدينا في نظام تطبيق *انطلق* أنك لم تكمل عملية التسجيل بعد.\n" + "ندعوك لإكمال التسجيل للاستفادة من مزايا التطبيق والبدء بالعمل معنا.\n\n" + "إذا احتجت لأي مساعدة، تواصل معنا على خدمة العملاء:\n" + "+963 952 475 742\n\n" + "+963 952 475 740\n\n" + "فريق انطلق يتمنى لك يوماً سعيداً."; + + mainController.launchCommunication( + 'whatsapp', + driver['phone_number'], + message, + ); + }, + ), + + // Edit button → go to registration form + buildActionButton( + icon: CupertinoIcons + .pencil_ellipsis_rectangle, + color: AppColor.gold, + onPressed: () { + Get.to( + () => RegisterCaptain(), + arguments: { + "phone": driver['phone_number'], + "driverId": driver['driverId'], + }, + ); + }, + ), + buildActionButton( + icon: CupertinoIcons + .pencil_ellipsis_rectangle, + color: AppColor.redColor, + onPressed: () { + mainController + .deleteDriverNotCompleteRegistration( + driver['phone_number']); + }, + ), + ], + ), + + const SizedBox(height: 16), + + // Notes box + CupertinoTextField( + controller: notesController, + placeholder: "Additional comments".tr, + padding: const EdgeInsets.all(12), + decoration: BoxDecoration( + color: Colors.grey.shade100, + borderRadius: BorderRadius.circular(8), + ), + maxLines: 2, + ), + + const SizedBox(height: 12), + + // Save button + Align( + alignment: AlignmentDirectional.centerEnd, + child: CupertinoButton( + padding: const EdgeInsets.symmetric( + horizontal: 20), + color: AppColor.secondaryColor, + onPressed: () { + mainController + .saveNoteForDriverNotCompleteRegistration( + driver['phone_number'], + box.read(BoxName.employeename) ?? + 'none', + notesController.text, + ); + }, + child: Text('Save Notes'.tr), + ), + ), + ], + ), + ), + ); + }, + ), + ), + ], + ); + }), + ], + ); + } +} diff --git a/siro_service/lib/controller/mainController/pages/edit_car.dart b/siro_service/lib/controller/mainController/pages/edit_car.dart new file mode 100644 index 0000000..1a3324d --- /dev/null +++ b/siro_service/lib/controller/mainController/pages/edit_car.dart @@ -0,0 +1,334 @@ +import 'package:flutter/cupertino.dart'; +import 'package:flutter/material.dart'; +import 'package:get/get.dart'; +import 'package:intl/intl.dart'; +import 'package:siro_service/controller/mainController/main_controller.dart'; +import 'package:siro_service/views/widgets/my_scafold.dart'; + +import '../../../constant/colors.dart'; +import '../../../constant/links.dart'; +import '../../../views/widgets/my_textField.dart'; +import '../../functions/image.dart'; +import '../../functions/launch.dart'; + +class EditCar extends StatelessWidget { + final Map carData; + const EditCar({super.key, required this.carData}); + @override + Widget build(BuildContext context) { + Get.put(MainController()); + + return GetBuilder(builder: (mainController) { + return MyScaffold( + title: 'Edit', + isleading: true, + action: Row( + children: [ + IconButton( + onPressed: () { + makePhoneCall(carData['phone']); + }, + icon: const Icon(Icons.phone), + ), + IconButton( + onPressed: () { + launchCommunication('whatsapp', carData['phone'], ''); + }, + icon: const Icon( + Icons.message, + color: AppColor.greenColor, + ), + ), + ], + ), + body: [ + ListView( + children: [ + Column( + children: [ + GestureDetector( + onLongPress: () async { + await ImageController().choosImage(AppLink.uploadEgypt, + carData['driverID'], 'car_front'); + }, + child: Image.network( + 'https://sefer.click/sefer/card_image/car_front-${carData['driverID']}.jpg', + height: 200, + width: double.maxFinite, + fit: BoxFit.fill, + errorBuilder: (BuildContext context, Object exception, + StackTrace? stackTrace) { + // If the image fails to load, use the _copy version + return Image.network( + 'https://sefer.click/sefer/card_image/car_front-${carData['driverID']}_copy.jpg', + height: 200, + width: double.maxFinite, + fit: BoxFit.fill, + ); + }, + ), + ), + GestureDetector( + onLongPress: () async { + await ImageController().choosImage( + AppLink.uploadEgypt, carData['id'], 'car_back'); + }, + child: Image.network( + 'https://sefer.click/sefer/card_image/car_back-${carData['driverID']}.jpg', + height: 200, + width: double.maxFinite, + fit: BoxFit.fill, + errorBuilder: (BuildContext context, Object exception, + StackTrace? stackTrace) { + // If the image fails to load, use the _copy version + return Image.network( + 'https://sefer.click/sefer/card_image/car_back-${carData['driverID']}_copy.jpg', + height: 200, + width: double.maxFinite, + fit: BoxFit.fill, + ); + }, + ), + ), + ], + ), + const SizedBox(height: 9), + Form( + key: mainController.formKey, + child: Column( + children: [ + Row( + mainAxisAlignment: MainAxisAlignment.spaceEvenly, + children: [ + SizedBox( + width: Get.width * .6, + child: MyTextForm( + controller: mainController.carplateController, + label: 'car plate'.tr, + hint: 'car plate'.tr, + type: TextInputType.name, + ), + ), + IconButton( + onPressed: () async { + if (mainController.formKey.currentState! + .validate()) { + await mainController.editCarPlateNotEdit( + carData['driverID'].toString(), + mainController.carplateController.text, + mainController.colorController.text, + mainController.colorHex.value.toString(), + mainController.yearController.text, + mainController.makeController.text, + mainController.modelController.text, + mainController.expirationDateController.text, + mainController.ownerController.text, + ); + } + }, + icon: const Icon( + Icons.upload_outlined, + color: AppColor.blueColor, + ), + ), + ], + ), + // Other fields + + Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + SizedBox( + width: Get.width * .4, + child: MyTextForm( + controller: mainController.yearController, + label: 'Year'.tr, + hint: 'Year'.tr, + type: TextInputType.number, + ), + ), + SizedBox( + width: Get.width * .4, + child: DropdownButtonFormField( + decoration: InputDecoration( + labelText: 'Color'.tr, // Localized label + ), + value: mainController.colorHex.value.isEmpty + ? null + : mainController.colorHex + .value, // Use the hex value as the current value + items: [ + {'red'.tr: '#FF0000'}, + {'green'.tr: '#008000'}, + {'blue'.tr: '#0000FF'}, + {'black'.tr: '#000000'}, + {'white'.tr: '#FFFFFF'}, + {'yellow'.tr: '#FFFF00'}, + {'purple'.tr: '#800080'}, + {'orange'.tr: '#FFA500'}, + {'pink'.tr: '#FFC0CB'}, + {'brown'.tr: '#A52A2A'}, + {'gray'.tr: '#808080'}, + {'cyan'.tr: '#00FFFF'}, + {'magenta'.tr: '#FF00FF'}, + {'lime'.tr: '#00FF00'}, + {'indigo'.tr: '#4B0082'}, + {'violet'.tr: '#EE82EE'}, + {'gold'.tr: '#FFD700'}, + {'silver'.tr: '#C0C0C0'}, + {'teal'.tr: '#008080'}, + {'navy'.tr: '#000080'}, + ].map((colorMap) { + String colorName = colorMap.keys.first; + String colorValue = colorMap.values.first; + return DropdownMenuItem( + value: colorValue, + child: Text(colorName), + ); + }).toList(), + onChanged: (value) { + if (value != null) { + // Find the selected color name based on the hex value + String selectedColorName = ''; + for (var colorMap in [ + {'red'.tr: '#FF0000'}, + {'green'.tr: '#008000'}, + {'blue'.tr: '#0000FF'}, + {'black'.tr: '#000000'}, + {'white'.tr: '#FFFFFF'}, + {'yellow'.tr: '#FFFF00'}, + {'purple'.tr: '#800080'}, + {'orange'.tr: '#FFA500'}, + {'pink'.tr: '#FFC0CB'}, + {'brown'.tr: '#A52A2A'}, + {'gray'.tr: '#808080'}, + {'cyan'.tr: '#00FFFF'}, + {'magenta'.tr: '#FF00FF'}, + {'lime'.tr: '#00FF00'}, + {'indigo'.tr: '#4B0082'}, + {'violet'.tr: '#EE82EE'}, + {'gold'.tr: '#FFD700'}, + {'silver'.tr: '#C0C0C0'}, + {'teal'.tr: '#008080'}, + {'navy'.tr: '#000080'}, + ]) { + if (colorMap.values.first == value) { + selectedColorName = colorMap.keys.first; + break; + } + } + + mainController.colorController.text = + selectedColorName; + mainController.colorHex.value = value; + } + }, + ), + ), + ], + ), + + Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + SizedBox( + width: Get.width * .4, + child: MyTextForm( + controller: mainController.makeController, + label: 'Make'.tr, + hint: 'Make'.tr, + type: TextInputType.name, + ), + ), + SizedBox( + width: Get.width * .4, + child: MyTextForm( + controller: mainController.modelController, + label: 'Model'.tr, + hint: 'Model'.tr, + type: TextInputType.name, + ), + ), + ], + ), + + Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + SizedBox( + width: Get.width * .4, + child: TextField( + controller: + mainController.expirationDateController, + decoration: InputDecoration( + labelText: 'Expiration Date'.tr, + hintText: 'Expiration Date'.tr, + ), + readOnly: + true, // Make the field read-only to prevent manual input + onTap: () async { + DateTime pickedDate = + DateTime.now(); // Declare the variable here + + await showCupertinoModalPopup( + context: context, + builder: (context) => Container( + height: 250, + color: Colors.white, + child: Column( + children: [ + SizedBox( + height: 150, + child: CupertinoDatePicker( + initialDateTime: pickedDate, + minimumDate: DateTime( + 1955), // Set the starting date + maximumDate: DateTime( + 2034), // Set the ending date + mode: CupertinoDatePickerMode.date, + onDateTimeChanged: + (DateTime dateTime) { + pickedDate = dateTime; + }, + ), + ), + CupertinoButton( + child: Text('Done'.tr), + onPressed: () { + String formattedDate = + DateFormat('yyyy-MM-dd') + .format(pickedDate); + mainController + .expirationDateController + .text = + formattedDate.toString(); + Navigator.of(context).pop(); + }, + ), + ], + ), + ), + ); + }, + ), + ), + SizedBox( + width: Get.width * .4, + child: MyTextForm( + controller: mainController.ownerController, + label: 'Owner'.tr, + hint: 'Owner'.tr, + type: TextInputType.name, + ), + ), + ], + ), + ], + ), + ) + ], + ) + ]); + }); + } +} diff --git a/siro_service/lib/controller/mainController/pages/edit_car_plate.dart b/siro_service/lib/controller/mainController/pages/edit_car_plate.dart new file mode 100644 index 0000000..9dc8b29 --- /dev/null +++ b/siro_service/lib/controller/mainController/pages/edit_car_plate.dart @@ -0,0 +1,48 @@ +import 'package:flutter/material.dart'; +import 'package:get/get.dart'; +import 'package:siro_service/constant/style.dart'; +import 'package:siro_service/controller/mainController/pages/edit_car.dart'; +import 'package:siro_service/views/widgets/my_scafold.dart'; + +import '../../functions/encrypt_decrypt.dart'; +import '../main_controller.dart'; +import 'package:flutter/material.dart'; +import 'package:get/get.dart'; + +class EditCarPlate extends StatelessWidget { + const EditCarPlate({super.key}); + + @override + Widget build(BuildContext context) { + Get.put(MainController()); + + return GetBuilder(builder: (mainController) { + return MyScaffold( + title: 'Edit car details'.tr, + isleading: true, + body: [ + Expanded( + child: ListView.builder( + padding: const EdgeInsets.all(16.0), + itemCount: mainController + .carPlateNotEdit.length, // 10 fields + 1 save button + itemBuilder: (context, index) { + var carData = mainController.carPlateNotEdit[index]; + return Padding( + padding: const EdgeInsets.all(8.0), + child: InkWell( + onTap: () { + Get.to(EditCar(carData: carData)); + }, + child: Container( + decoration: AppStyle.boxDecoration1, + child: Text((carData['owner']))), + ), + ); + }), + ), + ], + ); + }); + } +} diff --git a/siro_service/lib/controller/mainController/pages/giza_best_driver.dart b/siro_service/lib/controller/mainController/pages/giza_best_driver.dart new file mode 100644 index 0000000..3fc0b06 --- /dev/null +++ b/siro_service/lib/controller/mainController/pages/giza_best_driver.dart @@ -0,0 +1,56 @@ +import 'package:flutter/material.dart'; +import 'package:get/get.dart'; +import 'package:siro_service/views/widgets/my_scafold.dart'; + +import '../../best_driver_controllers.dart'; +import '../../functions/encrypt_decrypt.dart'; + +class DriverTheBestGiza extends StatelessWidget { + const DriverTheBestGiza({super.key}); + + @override + Widget build(BuildContext context) { + Get.put(DriverTheBestGizaController(), permanent: true); + return MyScaffold( + title: 'Giza'.tr, + body: [ + GetBuilder(builder: (driverthebest) { + return driverthebest.driver.isNotEmpty + ? ListView.builder( + itemCount: driverthebest.driver.length, + itemBuilder: (context, index) { + final driver = driverthebest.driver[index]; + return ListTile( + leading: CircleAvatar( + child: Text( + (int.parse(driver['driver_count'] * 5) / 3600) + .toStringAsFixed(0), + ), + ), + title: Text((driver['name_arabic']) ?? + 'Unknown Name'), + subtitle: Text( + 'Phone: ${(driver['phone']) ?? 'N/A'}'), + trailing: IconButton( + onPressed: () async { + Get.defaultDialog( + title: + 'are you sure to pay to this driver gift'.tr, + middleText: '', + onConfirm: () async {}, + onCancel: () => Get.back()); + }, + icon: const Icon(Icons.wallet_giftcard_rounded), + ), + ); + }, + ) + : const Center( + child: Text('No drivers available.'), + ); + }) + ], + isleading: true, + ); + } +} diff --git a/siro_service/lib/controller/mainController/pages/new_driver.dart b/siro_service/lib/controller/mainController/pages/new_driver.dart new file mode 100644 index 0000000..06feb0a --- /dev/null +++ b/siro_service/lib/controller/mainController/pages/new_driver.dart @@ -0,0 +1,485 @@ +import 'package:flutter/cupertino.dart'; +import 'package:flutter/material.dart'; +import 'package:get/get.dart'; +import 'package:siro_service/constant/colors.dart'; +// Importa tu nuevo controlador de servicio +import 'package:siro_service/controller/mainController/ragister_service_controller.dart'; +import 'package:siro_service/views/widgets/elevated_btn.dart'; +import 'package:siro_service/views/widgets/my_scafold.dart'; + +// El import del antiguo controlador ya no es necesario +// import '../registration_captain_controller.dart'; + +class RegisterCaptain extends StatelessWidget { + const RegisterCaptain({super.key}); + + @override + Widget build(BuildContext context) { + // Instancia el NUEVO controlador + final controller = Get.put(RegisterCaptainServiceController()); + + return MyScaffold( + title: 'Syrian Documents Check'.tr, + isleading: true, + body: [ + Obx(() { + if (controller.isLoading.value) { + return const Center(child: CircularProgressIndicator()); + } + + return Column( + children: [ + Padding( + padding: const EdgeInsets.symmetric(vertical: 16.0), + child: StepIndicator( + currentStep: controller.currentPageIndex.value, + totalSteps: 4, + ), + ), + Expanded( + child: PageView( + controller: controller.pageController, + onPageChanged: (index) { + controller.currentPageIndex.value = index; + }, + children: [ + // <-- PÁGINAS REACTIVADAS CON EL NUEVO CONTROLADOR --> + _buildSyrianDriverLicenseFront(context, controller), + _buildSyrianDriverLicenseBack(context, controller), + _buildSyrianCarLicenseFront(context, controller), + _buildSyrianCarLicenseBack(controller), + ], + ), + ), + _buildNavigationControls(controller), + ], + ); + }), + ], + ); + } + + // Este método ya estaba usando el controlador correcto + Widget _buildNavigationControls(RegisterCaptainServiceController controller) { + bool isLastPage = controller.currentPageIndex.value == 3; + bool isFirstPage = controller.currentPageIndex.value == 0; + + return Padding( + padding: const EdgeInsets.all(16.0), + child: Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + if (!isFirstPage) + MyElevatedButton( + title: 'Back'.tr, + onPressed: controller.previousPage, + kolor: Colors.grey, + ), + if (isFirstPage) const Spacer(), + MyElevatedButton( + title: isLastPage ? 'Save and Activate'.tr : 'Next'.tr, + onPressed: isLastPage + ? controller.updateAndActivateSyrianDriver + : controller.nextPage, + kolor: isLastPage ? AppColor.greenColor : AppColor.primaryColor, + ), + ], + ), + ); + } + + Widget _buildTextField({ + required String label, + required TextEditingController controller, + IconData? icon, + TextInputType keyboardType = TextInputType.text, + VoidCallback? onTap, + String? hintText, + }) { + return Padding( + padding: const EdgeInsets.symmetric(vertical: 8.0), + child: TextFormField( + controller: controller, + keyboardType: keyboardType, + readOnly: onTap != null, + onTap: onTap, + decoration: InputDecoration( + labelText: label.tr, + hintText: hintText, + prefixIcon: + icon != null ? Icon(icon, color: AppColor.secondaryColor) : null, + border: OutlineInputBorder( + borderRadius: BorderRadius.circular(10), + ), + focusedBorder: OutlineInputBorder( + borderRadius: BorderRadius.circular(10), + borderSide: + const BorderSide(color: AppColor.secondaryColor, width: 2), + ), + ), + ), + ); + } + + Widget _buildPageContent({ + required RxString imageUrl, + required List formFields, + }) { + return SingleChildScrollView( + padding: const EdgeInsets.symmetric(horizontal: 16.0), + child: Column( + crossAxisAlignment: CrossAxisAlignment.stretch, + children: [ + // ClipRRect( + // borderRadius: BorderRadius.circular(12), + // child: Image.network( + // imageUrl.value, + // fit: BoxFit.fitWidth, + // errorBuilder: (context, error, stackTrace) { + // return Container( + // height: 200, + // color: Colors.grey[200], + // child: Center( + // child: Text( + // 'Image not available'.tr, + // style: const TextStyle(color: Colors.grey), + // ), + // ), + // ); + // }, + // ), + // ), + // const SizedBox(height: 20), + const Divider(), + ...formFields, + ], + ), + ); + } + + // <-- MODIFICADO: Usa RegisterCaptainServiceController --> + Widget _buildColorDropdown(RegisterCaptainServiceController controller) { + return Padding( + padding: const EdgeInsets.symmetric(vertical: 8.0), + child: Obx( + () => DropdownButtonFormField( + value: controller.colorHex.value.isEmpty + ? null + : controller.colorHex.value, + isExpanded: true, + decoration: InputDecoration( + labelText: 'Car Color'.tr, + prefixIcon: Icon(Icons.color_lens, color: AppColor.secondaryColor), + border: OutlineInputBorder( + borderRadius: BorderRadius.circular(10), + ), + ), + // <-- MODIFICADO: Usa la referencia estática del nuevo controlador --> + items: RegisterCaptainServiceController.kCarColorOptions.map((opt) { + final hex = opt['hex']!; + final key = opt['key']!; + return DropdownMenuItem( + value: hex, + child: Row( + children: [ + Container( + width: 18, + height: 18, + decoration: BoxDecoration( + color: controller.hexToColor(hex), + shape: BoxShape.circle, + border: Border.all(color: Colors.black12), + ), + ), + const SizedBox(width: 12), + Expanded(child: Text(key.tr)), + ], + ), + ); + }).toList(), + onChanged: (hex) { + if (hex != null) { + controller.updateColorSelection(hex); + } + }, + ), + ), + ); + } + + // <-- MODIFICADO: Usa RegisterCaptainServiceController --> + Widget _buildGenderDropdown(RegisterCaptainServiceController controller) { + return Padding( + padding: const EdgeInsets.symmetric(vertical: 8.0), + child: Obx( + () => DropdownButtonFormField( + value: controller.selectedGender.value.isEmpty + ? null + : controller.selectedGender.value, + isExpanded: true, + decoration: InputDecoration( + labelText: 'Gender'.tr, + prefixIcon: Icon(Icons.wc, color: AppColor.secondaryColor), + border: OutlineInputBorder( + borderRadius: BorderRadius.circular(10), + ), + ), + items: ['Male', 'Female'].map((String value) { + return DropdownMenuItem( + value: value, + child: Text(value.tr), + ); + }).toList(), + onChanged: (String? newValue) { + if (newValue != null) { + controller.selectedGender.value = newValue; + } + }, + ), + ), + ); + } + + // <-- MODIFICADO: Usa RegisterCaptainServiceController --> + Widget _buildFuelDropdown(RegisterCaptainServiceController controller) { + return Padding( + padding: const EdgeInsets.symmetric(vertical: 8.0), + child: Obx( + () => DropdownButtonFormField( + // <-- MODIFICADO: Usa la referencia estática del nuevo controlador --> + value: RegisterCaptainServiceController.kFuelOptions + .contains(controller.selectedFuel.value) + ? controller.selectedFuel.value + : null, + isExpanded: true, + decoration: InputDecoration( + labelText: 'Fuel Type'.tr, + prefixIcon: + Icon(Icons.local_gas_station, color: AppColor.secondaryColor), + border: OutlineInputBorder( + borderRadius: BorderRadius.circular(10), + ), + ), + // <-- MODIFICADO: Usa la referencia estática del nuevo controlador --> + items: + RegisterCaptainServiceController.kFuelOptions.map((String value) { + return DropdownMenuItem( + value: value, + child: Text(value.tr), + ); + }).toList(), + onChanged: (String? newValue) { + if (newValue != null) { + controller.selectedFuel.value = newValue; + } + }, + ), + ), + ); + } + + // --- PAGE 1: Driver License Front --- + // <-- MODIFICADO: Usa RegisterCaptainServiceController --> + Widget _buildSyrianDriverLicenseFront( + BuildContext context, RegisterCaptainServiceController controller) { + return _buildPageContent( + imageUrl: controller.docUrls['driver_license_front']!, + formFields: [ + Row( + children: [ + Expanded( + child: _buildTextField( + label: 'First Name', + controller: controller.firstNameController, + keyboardType: TextInputType.name), + ), + const SizedBox(width: 8), + Expanded( + child: _buildTextField( + label: 'Last Name', + controller: controller.lastNameController, + keyboardType: TextInputType.name), + ), + ], + ), + _buildTextField( + label: 'Phone Number', + controller: controller.phoneController, + hintText: 'e.g., 963992952235', + icon: Icons.phone, + keyboardType: TextInputType.phone, + ), + _buildTextField( + label: 'Place of Registration', + controller: controller.siteController, + icon: Icons.location_city), + Row( + children: [ + Expanded( + child: _buildTextField( + label: 'National Number', + controller: controller.nationalNumberController, + keyboardType: TextInputType.number, + icon: Icons.fingerprint), + ), + const SizedBox(width: 8), + Expanded(child: _buildGenderDropdown(controller)), + ], + ), + _buildTextField( + label: 'Birthdate', + controller: controller.birthdateController, + icon: Icons.cake, + onTap: () => + controller.selectDate(context, controller.birthdateController)), + ], + ); + } + + // --- PAGE 2: Driver License Back --- + // <-- MODIFICADO: Usa RegisterCaptainServiceController --> + Widget _buildSyrianDriverLicenseBack( + BuildContext context, RegisterCaptainServiceController controller) { + return _buildPageContent( + imageUrl: controller.docUrls['driver_license_back']!, + formFields: [ + _buildTextField( + label: 'License Category', + controller: controller.licenseCategoriesController), + _buildTextField( + label: 'Expiry Date', + controller: controller.expiryDateController, + icon: Icons.event_busy, + onTap: () => controller.selectDate( + context, controller.expiryDateController)), + ], + ); + } + + // --- PAGE 3: Car License Front --- + // <-- MODIFICADO: Usa RegisterCaptainServiceController --> + Widget _buildSyrianCarLicenseFront( + BuildContext context, RegisterCaptainServiceController controller) { + return _buildPageContent( + imageUrl: controller.docUrls['car_license_front']!, + formFields: [ + _buildTextField( + label: 'Owner Name', + controller: controller.ownerController, + keyboardType: TextInputType.name, + icon: Icons.person_search), + Row( + children: [ + Expanded(child: _buildColorDropdown(controller)), + const SizedBox(width: 8), + Expanded( + child: _buildTextField( + label: 'Car Plate', + controller: controller.carPlateController, + ), + ), + ], + ), + // _buildTextField( + // label: 'VIN', + // controller: controller.vinController, + // icon: Icons.confirmation_number), + Row( + children: [ + Expanded( + child: _buildTextField( + label: 'License Issue Date', + controller: controller.licenseIssueDateController, + onTap: () => controller.selectDate( + context, controller.licenseIssueDateController))), + const SizedBox(width: 8), + Expanded( + child: _buildTextField( + label: 'License Expiry Date', + controller: controller.carLicenseExpiryDateController, + onTap: () => controller.selectDate( + context, controller.carLicenseExpiryDateController))), + ], + ), + ], + ); + } + + // --- PAGE 4: Car License Back --- + // <-- MODIFICADO: Usa RegisterCaptainServiceController --> + Widget _buildSyrianCarLicenseBack( + RegisterCaptainServiceController controller) { + return _buildPageContent( + imageUrl: controller.docUrls['car_license_back']!, + formFields: [ + Row( + children: [ + Expanded( + child: _buildTextField( + label: 'Make', + controller: controller.makeController, + )), + const SizedBox(width: 8), + Expanded( + child: _buildTextField( + label: 'Model', + controller: controller.modelController, + )), + ], + ), + Row( + children: [ + Expanded( + child: _buildTextField( + label: 'Year', + controller: controller.yearController, + keyboardType: TextInputType.number)), + const SizedBox(width: 8), + Expanded(child: _buildFuelDropdown(controller)), + ], + ), + ], + ); + } +} + +class StepIndicator extends StatelessWidget { + final int currentStep; + final int totalSteps; + + const StepIndicator({ + super.key, + required this.currentStep, + required this.totalSteps, + }); + + @override + Widget build(BuildContext context) { + return Column( + children: [ + Text( + '${'Step'.tr} ${currentStep + 1} ${'of'.tr} $totalSteps', + style: const TextStyle( + fontSize: 18, fontWeight: FontWeight.bold, color: Colors.black54), + ), + const SizedBox(height: 8), + Row( + mainAxisAlignment: MainAxisAlignment.center, + children: List.generate(totalSteps, (index) { + return Container( + margin: const EdgeInsets.symmetric(horizontal: 4), + width: 30, + height: 8, + decoration: BoxDecoration( + color: index <= currentStep + ? AppColor.primaryColor + : Colors.grey.shade300, + borderRadius: BorderRadius.circular(4), + ), + ); + }), + ), + ], + ); + } +} diff --git a/siro_service/lib/controller/mainController/pages/passengers_cant_regster.dart b/siro_service/lib/controller/mainController/pages/passengers_cant_regster.dart new file mode 100644 index 0000000..87b1b80 --- /dev/null +++ b/siro_service/lib/controller/mainController/pages/passengers_cant_regster.dart @@ -0,0 +1,79 @@ +import 'package:flutter/cupertino.dart'; +import 'package:flutter/material.dart'; +import 'package:get/get.dart'; +import 'package:siro_service/controller/mainController/main_controller.dart'; +import 'package:siro_service/views/widgets/my_scafold.dart'; + +import '../../functions/encrypt_decrypt.dart'; + +class PassengersCantRegister extends StatelessWidget { + PassengersCantRegister({super.key}); + + @override + Widget build(BuildContext context) { + Get.put(MainController()); + return MyScaffold( + title: 'Passengers Cant Register'.tr, + isleading: true, + body: [ + GetBuilder(builder: (mainController) { + return ListView.builder( + itemCount: mainController.passengerNotCompleteRegistration.length, + itemBuilder: (context, index) { + final passenger = + mainController.passengerNotCompleteRegistration[index]; + return Padding( + padding: const EdgeInsets.all(8.0), + child: CupertinoFormSection( + header: Text('Passenger ID: ${passenger['id']}'), + children: [ + InkWell( + onTap: () => + mainController.makePhoneCall(passenger['phone']), + child: CupertinoFormRow( + prefix: Text(' phone'.tr), + child: CupertinoTextFormFieldRow( + initialValue: ((passenger['phone'])), + readOnly: true, + placeholder: 'Phone Number'.tr, + ), + ), + ), + CupertinoFormRow( + prefix: Text('Created At'.tr), + child: CupertinoTextFormFieldRow( + initialValue: passenger['created_at'], + readOnly: true, + placeholder: 'Created At', + ), + ), + CupertinoFormRow( + prefix: Text('Notes'.tr), + child: CupertinoTextFormFieldRow( + controller: mainController.notesController, + placeholder: + passenger['note'] ?? 'Enter notes after call'.tr, + ), + ), + CupertinoButton( + child: Text('Save Notes'.tr), + onPressed: () { + // Save the notes for the Passenger + String notes = mainController.notesController.text; + + mainController + .saveNoteForPassengerNotCompleteRegistration( + passenger['phone_number'], 'girls name', notes); + print('Notes for Passenger ${passenger['id']}: $notes'); + }, + ), + ], + ), + ); + }, + ); + }), + ], + ); + } +} diff --git a/siro_service/lib/controller/mainController/pages/passengers_page.dart b/siro_service/lib/controller/mainController/pages/passengers_page.dart new file mode 100644 index 0000000..76a2c81 --- /dev/null +++ b/siro_service/lib/controller/mainController/pages/passengers_page.dart @@ -0,0 +1,146 @@ +import 'package:flutter/material.dart'; +import 'package:get/get.dart'; +import 'package:siro_service/controller/mainController/main_controller.dart'; +import 'package:siro_service/views/widgets/my_scafold.dart'; + +class PassengersPage extends StatelessWidget { + PassengersPage({super.key}); + final MainController mainController = MainController(); + + @override + Widget build(BuildContext context) { + return GetBuilder( + builder: (mainController) { + final data = _extractPassengerData(mainController); + + return MyScaffold( + title: data != null + ? '${data['first_name'] ?? ''} ${data['last_name'] ?? ''}' + : 'Passenger Not Found'.tr, + isleading: true, + body: [ + if (data != null) + ListView( + children: [ + _buildPersonalInfoCard(data), + _buildLatestRideCard(data), + _buildWalletInfoCard(data), + ], + ) + else + const Center( + child: Padding( + padding: EdgeInsets.all(24.0), + child: Text( + 'No passenger data available.', + style: TextStyle(fontSize: 18, fontWeight: FontWeight.w500), + ), + ), + ), + ], + ); + }, + ); + } + + /// Helper method to extract the passenger data safely. + Map? _extractPassengerData(MainController controller) { + final passengerData = controller.passengerData; + if (passengerData == null || + passengerData['message'] == null || + passengerData['message'].isEmpty) { + return null; + } + return passengerData['message'][0]; + } + + Widget _buildPersonalInfoCard(Map data) { + return _buildCard( + title: 'Personal Information'.tr, + children: [ + _buildInfoRow('Phone'.tr, data['phone']), + _buildInfoRow('Email'.tr, data['email']), + _buildInfoRow('Gender'.tr, data['gender']), + _buildInfoRow('Birthdate'.tr, data['birthdate']), + // _buildInfoRow('Education'.tr, data['education']), + _buildInfoRow('Employment'.tr, data['employmentType']), + _buildInfoRow('Marital Status'.tr, data['maritalStatus']), + ], + ); + } + + Widget _buildLatestRideCard(Map data) { + return _buildCard( + title: 'Latest Ride'.tr, + children: [ + _buildInfoRow('Ride ID'.tr, data['ride_id']), + _buildInfoRow('Date'.tr, data['ride_date']), + _buildInfoRow('Start Time'.tr, data['ride_time']), + _buildInfoRow('End Time'.tr, data['ride_endtime']), + _buildInfoRow( + 'Price'.tr, data['price'] != null ? '\$${data['price']}' : null), + _buildInfoRow('Status'.tr, data['ride_status']), + _buildInfoRow('Payment Method'.tr, data['ride_payment_method']), + _buildInfoRow('Car Type'.tr, data['car_type']), + _buildInfoRow( + 'Distance'.tr, + data['distance'] != null + ? '${(data['distance'] as num).toStringAsFixed(2)} km' + : null), + ], + ); + } + + Widget _buildWalletInfoCard(Map data) { + return _buildCard( + title: 'Wallet Information'.tr, + children: [ + _buildInfoRow( + 'Wallet Balance'.tr, + data['passenger_wallet_balance'] != null + ? '\$${data['passenger_wallet_balance']}' + : null), + _buildInfoRow( + 'Last Payment Amount'.tr, + data['passenger_payment_amount'] != null + ? '\$${data['passenger_payment_amount']}' + : null), + _buildInfoRow( + 'Last Payment Method'.tr, data['passenger_payment_method']), + ], + ); + } + + Widget _buildCard({required String title, required List children}) { + return Card( + margin: const EdgeInsets.all(16), + child: Padding( + padding: const EdgeInsets.all(16), + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Text(title, + style: + const TextStyle(fontSize: 18, fontWeight: FontWeight.bold)), + const SizedBox(height: 16), + ...children, + ], + ), + ), + ); + } + + Widget _buildInfoRow(String label, dynamic value) { + final displayValue = value?.toString() ?? 'N/A'; + return Padding( + padding: const EdgeInsets.symmetric(vertical: 4), + child: Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + Text(label, style: const TextStyle(fontWeight: FontWeight.bold)), + Flexible(child: Text(displayValue, overflow: TextOverflow.ellipsis)), + ], + ), + ); + } +} diff --git a/siro_service/lib/controller/mainController/pages/registration_captain_page.dart b/siro_service/lib/controller/mainController/pages/registration_captain_page.dart new file mode 100644 index 0000000..698a4a5 --- /dev/null +++ b/siro_service/lib/controller/mainController/pages/registration_captain_page.dart @@ -0,0 +1,458 @@ +import 'package:flutter/cupertino.dart'; +import 'package:flutter/material.dart'; +import 'package:get/get.dart'; +import 'package:siro_service/constant/colors.dart'; +import 'package:siro_service/views/widgets/elevated_btn.dart'; +import 'package:siro_service/views/widgets/my_scafold.dart'; + +import '../registration_captain_controller.dart'; + +class RegisterCaptain extends StatelessWidget { + const RegisterCaptain({super.key}); + + @override + Widget build(BuildContext context) { + final controller = Get.put(RegisterCaptainController()); + + return MyScaffold( + title: 'Syrian Documents Check'.tr, + isleading: true, + body: [ + Obx(() { + if (controller.isLoading.value) { + return const Center(child: CircularProgressIndicator()); + } + + return Column( + children: [ + Padding( + padding: const EdgeInsets.symmetric(vertical: 16.0), + child: StepIndicator( + currentStep: controller.currentPageIndex.value, + totalSteps: 4, + ), + ), + Expanded( + child: PageView( + controller: controller.pageController, + onPageChanged: (index) { + controller.currentPageIndex.value = index; + }, + children: [ + _buildSyrianDriverLicenseFront(context, controller), + _buildSyrianDriverLicenseBack(context, controller), + _buildSyrianCarLicenseFront(context, controller), + _buildSyrianCarLicenseBack(controller), + ], + ), + ), + _buildNavigationControls(controller), + ], + ); + }), + ], + ); + } + + Widget _buildNavigationControls(RegisterCaptainController controller) { + bool isLastPage = controller.currentPageIndex.value == 3; + bool isFirstPage = controller.currentPageIndex.value == 0; + + return Padding( + padding: const EdgeInsets.all(16.0), + child: Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + if (!isFirstPage) + MyElevatedButton( + title: 'Back'.tr, + onPressed: controller.previousPage, + kolor: Colors.grey, + ), + if (isFirstPage) const Spacer(), + MyElevatedButton( + title: isLastPage ? 'Save and Activate'.tr : 'Next'.tr, + onPressed: isLastPage + ? controller.updateAndActivateSyrianDriver + : controller.nextPage, + kolor: isLastPage ? AppColor.greenColor : AppColor.primaryColor, + ), + ], + ), + ); + } + + Widget _buildTextField({ + required String label, + required TextEditingController controller, + IconData? icon, + TextInputType keyboardType = TextInputType.text, + VoidCallback? onTap, + }) { + return Padding( + padding: const EdgeInsets.symmetric(vertical: 8.0), + child: TextFormField( + controller: controller, + keyboardType: keyboardType, + readOnly: onTap != null, + onTap: onTap, + decoration: InputDecoration( + labelText: label.tr, + prefixIcon: + icon != null ? Icon(icon, color: AppColor.secondaryColor) : null, + border: OutlineInputBorder( + borderRadius: BorderRadius.circular(10), + ), + focusedBorder: OutlineInputBorder( + borderRadius: BorderRadius.circular(10), + borderSide: + const BorderSide(color: AppColor.secondaryColor, width: 2), + ), + ), + ), + ); + } + + Widget _buildPageContent({ + required RxString imageUrl, + required List formFields, + }) { + return SingleChildScrollView( + padding: const EdgeInsets.symmetric(horizontal: 16.0), + child: Column( + crossAxisAlignment: CrossAxisAlignment.stretch, + children: [ + ClipRRect( + borderRadius: BorderRadius.circular(12), + child: Image.network( + imageUrl.value, + fit: BoxFit.fitWidth, + errorBuilder: (context, error, stackTrace) { + return Container( + height: 200, + color: Colors.grey[200], + child: Center( + child: Text( + 'Image not available'.tr, + style: const TextStyle(color: Colors.grey), + ), + ), + ); + }, + ), + ), + const SizedBox(height: 20), + const Divider(), + ...formFields, + ], + ), + ); + } + + Widget _buildColorDropdown(RegisterCaptainController controller) { + return Padding( + padding: const EdgeInsets.symmetric(vertical: 8.0), + child: Obx( + () => DropdownButtonFormField( + value: controller.colorHex.value.isEmpty + ? null + : controller.colorHex.value, + isExpanded: true, + decoration: InputDecoration( + labelText: 'Car Color'.tr, + prefixIcon: Icon(Icons.color_lens, color: AppColor.secondaryColor), + border: OutlineInputBorder( + borderRadius: BorderRadius.circular(10), + ), + ), + items: RegisterCaptainController.kCarColorOptions.map((opt) { + final hex = opt['hex']!; + final key = opt['key']!; + return DropdownMenuItem( + value: hex, + child: Row( + children: [ + Container( + width: 18, + height: 18, + decoration: BoxDecoration( + color: controller.hexToColor(hex), + shape: BoxShape.circle, + border: Border.all(color: Colors.black12), + ), + ), + const SizedBox(width: 12), + Expanded(child: Text(key.tr)), + ], + ), + ); + }).toList(), + onChanged: (hex) { + if (hex != null) { + controller.updateColorSelection(hex); + } + }, + ), + ), + ); + } + + Widget _buildGenderDropdown(RegisterCaptainController controller) { + return Padding( + padding: const EdgeInsets.symmetric(vertical: 8.0), + child: Obx( + () => DropdownButtonFormField( + value: controller.selectedGender.value.isEmpty + ? null + : controller.selectedGender.value, + isExpanded: true, + decoration: InputDecoration( + labelText: 'Gender'.tr, + prefixIcon: Icon(Icons.wc, color: AppColor.secondaryColor), + border: OutlineInputBorder( + borderRadius: BorderRadius.circular(10), + ), + ), + items: ['Male', 'Female'].map((String value) { + return DropdownMenuItem( + value: value, + child: Text(value.tr), + ); + }).toList(), + onChanged: (String? newValue) { + if (newValue != null) { + controller.selectedGender.value = newValue; + } + }, + ), + ), + ); + } + + Widget _buildFuelDropdown(RegisterCaptainController controller) { + return Padding( + padding: const EdgeInsets.symmetric(vertical: 8.0), + child: Obx( + () => DropdownButtonFormField( + value: RegisterCaptainController.kFuelOptions + .contains(controller.selectedFuel.value) + ? controller.selectedFuel.value + : null, + isExpanded: true, + decoration: InputDecoration( + labelText: 'Fuel Type'.tr, + prefixIcon: + Icon(Icons.local_gas_station, color: AppColor.secondaryColor), + border: OutlineInputBorder( + borderRadius: BorderRadius.circular(10), + ), + ), + items: RegisterCaptainController.kFuelOptions.map((String value) { + return DropdownMenuItem( + value: value, + child: Text(value.tr), + ); + }).toList(), + onChanged: (String? newValue) { + if (newValue != null) { + controller.selectedFuel.value = newValue; + } + }, + ), + ), + ); + } + + // --- PAGE 1: Driver License Front --- + Widget _buildSyrianDriverLicenseFront( + BuildContext context, RegisterCaptainController controller) { + return _buildPageContent( + imageUrl: controller.docUrls['driver_license_front']!, + formFields: [ + Row( + children: [ + Expanded( + child: _buildTextField( + label: 'First Name', + controller: controller.firstNameController, + keyboardType: TextInputType.name), + ), + const SizedBox(width: 8), + Expanded( + child: _buildTextField( + label: 'Last Name', + controller: controller.lastNameController, + keyboardType: TextInputType.name), + ), + ], + ), + _buildTextField( + label: 'Place of Registration', + controller: controller.siteController, + icon: Icons.location_city), + Row( + children: [ + Expanded( + child: _buildTextField( + label: 'National Number', + controller: controller.nationalNumberController, + keyboardType: TextInputType.number, + icon: Icons.fingerprint), + ), + const SizedBox(width: 8), + Expanded(child: _buildGenderDropdown(controller)), + ], + ), + // _buildTextField( + // label: 'Birthdate', + // controller: controller.birthdateController, + // icon: Icons.cake, + // onTap: () => + // controller.selectDate(context, controller.birthdateController)), + ], + ); + } + + // --- PAGE 2: Driver License Back --- + Widget _buildSyrianDriverLicenseBack( + BuildContext context, RegisterCaptainController controller) { + return _buildPageContent( + imageUrl: controller.docUrls['driver_license_back']!, + formFields: [ + _buildTextField( + label: 'License Category', + controller: controller.licenseCategoriesController), + _buildTextField( + label: 'Expiry Date', + controller: controller.expiryDateController, + icon: Icons.event_busy, + onTap: () => controller.selectDate( + context, controller.expiryDateController)), + ], + ); + } + + // --- PAGE 3: Car License Front --- + Widget _buildSyrianCarLicenseFront( + BuildContext context, RegisterCaptainController controller) { + return _buildPageContent( + imageUrl: controller.docUrls['car_license_front']!, + formFields: [ + _buildTextField( + label: 'Owner Name', + controller: controller.ownerController, + keyboardType: TextInputType.name, + icon: Icons.person_search), + Row( + children: [ + Expanded(child: _buildColorDropdown(controller)), + const SizedBox(width: 8), + Expanded( + child: _buildTextField( + label: 'Car Plate', + controller: controller.carPlateController, + ), + ), + ], + ), + // _buildTextField( + // label: 'VIN', + // controller: controller.vinController, + // icon: Icons.confirmation_number), + Row( + children: [ + Expanded( + child: _buildTextField( + label: 'License Issue Date', + controller: controller.licenseIssueDateController, + onTap: () => controller.selectDate( + context, controller.licenseIssueDateController))), + const SizedBox(width: 8), + Expanded( + child: _buildTextField( + label: 'License Expiry Date', + controller: controller.carLicenseExpiryDateController, + onTap: () => controller.selectDate( + context, controller.carLicenseExpiryDateController))), + ], + ), + ], + ); + } + + // --- PAGE 4: Car License Back --- + Widget _buildSyrianCarLicenseBack(RegisterCaptainController controller) { + return _buildPageContent( + imageUrl: controller.docUrls['car_license_back']!, + formFields: [ + Row( + children: [ + Expanded( + child: _buildTextField( + label: 'Make', + controller: controller.makeController, + )), + const SizedBox(width: 8), + Expanded( + child: _buildTextField( + label: 'Model', + controller: controller.modelController, + )), + ], + ), + Row( + children: [ + Expanded( + child: _buildTextField( + label: 'Year', + controller: controller.yearController, + keyboardType: TextInputType.number)), + const SizedBox(width: 8), + Expanded(child: _buildFuelDropdown(controller)), + ], + ), + ], + ); + } +} + +class StepIndicator extends StatelessWidget { + final int currentStep; + final int totalSteps; + + const StepIndicator({ + super.key, + required this.currentStep, + required this.totalSteps, + }); + + @override + Widget build(BuildContext context) { + return Column( + children: [ + Text( + '${'Step'.tr} ${currentStep + 1} ${'of'.tr} $totalSteps', + style: const TextStyle( + fontSize: 18, fontWeight: FontWeight.bold, color: Colors.black54), + ), + const SizedBox(height: 8), + Row( + mainAxisAlignment: MainAxisAlignment.center, + children: List.generate(totalSteps, (index) { + return Container( + margin: const EdgeInsets.symmetric(horizontal: 4), + width: 30, + height: 8, + decoration: BoxDecoration( + color: index <= currentStep + ? AppColor.primaryColor + : Colors.grey.shade300, + borderRadius: BorderRadius.circular(4), + ), + ); + }), + ), + ], + ); + } +} diff --git a/siro_service/lib/controller/mainController/pages/welcome_call.dart b/siro_service/lib/controller/mainController/pages/welcome_call.dart new file mode 100644 index 0000000..2133df9 --- /dev/null +++ b/siro_service/lib/controller/mainController/pages/welcome_call.dart @@ -0,0 +1,223 @@ +import 'package:flutter/cupertino.dart'; +import 'package:flutter/material.dart'; +import 'package:get/get.dart'; +import 'package:siro_service/constant/colors.dart'; +import 'package:siro_service/constant/style.dart'; +import 'package:siro_service/views/widgets/elevated_btn.dart'; +import 'package:siro_service/views/widgets/my_scafold.dart'; + +import '../main_controller.dart'; + +class WelcomeCall extends StatelessWidget { + const WelcomeCall({super.key}); + + @override + Widget build(BuildContext context) { + final controller = Get.put(MainController()); + + return MyScaffold( + title: 'Welcome Drivers'.tr, + isleading: true, + body: [ + GetBuilder(builder: (mainController) { + final drivers = mainController.newDriverRegister; + + if (drivers.isEmpty) { + return const Padding( + padding: EdgeInsets.all(32.0), + child: Center( + child: Text( + 'No new drivers found.', + style: TextStyle(fontSize: 18), + ), + ), + ); + } + + return CupertinoScrollbar( + child: ListView.builder( + padding: const EdgeInsets.only(bottom: 20), + itemCount: drivers.length, + itemBuilder: (context, index) { + final driver = drivers[index]; + return DriverCard(driver: driver); + }, + ), + ); + }), + ], + ); + } +} + +class DriverCard extends StatelessWidget { + final Map driver; + + const DriverCard({super.key, required this.driver}); + Widget buildActionButton({ + required IconData icon, + required Color color, + required VoidCallback onPressed, + }) { + return CupertinoButton( + padding: const EdgeInsets.symmetric(horizontal: 6.0), + onPressed: onPressed, + child: Icon(icon, color: color, size: 28), + ); + } + + @override + Widget build(BuildContext context) { + final controller = Get.find(); + + return CupertinoCard( + margin: const EdgeInsets.all(16.0), + child: Padding( + padding: const EdgeInsets.all(16.0), + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + // حالة التلوين حسب isCall + Container( + decoration: AppStyle.boxDecoration1.copyWith( + color: driver['isCall'].toString() == '1' + ? AppColor.greenColor + : AppColor.accentColor, + ), + padding: const EdgeInsets.symmetric(horizontal: 10, vertical: 4), + child: Text( + 'Driver Information'.tr, + style: CupertinoTheme.of(context).textTheme.navTitleTextStyle, + ), + ), + const SizedBox(height: 12), + + InfoText( + 'Name'.tr, driver['first_name'] + ' ' + driver['last_name']), + InfoText('Phone'.tr, driver['phone']), + InfoText('Email'.tr, driver['email']), + InfoText('License Type'.tr, driver['license_type']), + InfoText('License Categories'.tr, driver['license_categories']), + InfoText('National Number'.tr, driver['national_number']), + InfoText('Occupation'.tr, driver['occupation']), + const SizedBox(height: 12), + + Text('Notes:'.tr, + style: CupertinoTheme.of(context).textTheme.navTitleTextStyle), + const SizedBox(height: 8), + + CupertinoTextField( + controller: controller.notesController, + placeholder: driver['notes'] ?? 'Enter notes here...'.tr, + maxLines: 3, + padding: const EdgeInsets.all(12.0), + decoration: BoxDecoration( + border: Border.all(color: CupertinoColors.systemGrey), + borderRadius: BorderRadius.circular(8.0), + ), + ), + + const SizedBox(height: 16), + + Row( + children: [ + Expanded( + child: MyElevatedButton( + title: 'Call Driver'.tr, + onPressed: () { + controller.makePhoneCall(driver['phone'].toString()); + }, + ), + ), + const SizedBox(width: 16), + Expanded( + child: CupertinoButton( + onPressed: () async { + await controller.addWelcomeCall(driver['id'].toString()); + }, + child: Text('Save Changes'.tr), + ), + ), + Expanded( + child: CupertinoButton( + onPressed: () async { + final phone = driver['phone']; + + if (phone == null || phone.toString().isEmpty) { + Get.snackbar("خطأ", "لا يوجد رقم هاتف لهذا السائق"); + return; + } + + String message = "مرحباً،\n\n" + "يعطيك العافية أستاذ. نرحب بك في شركة *انطلق* للنقل الذكي.\n" + "نود تعريفك بالتطبيق ومميزاته لتتمكن من الاستفادة الكاملة وبدء العمل معنا بسهولة.\n\n" + "لأي استفسار أو مساعدة، يمكنك التواصل معنا على الأرقام التالية:\n\n" + "+963 952 475 742\n" + "+963 952 475 740\n" + "+963 952 475 734\n\n" + "فريق انطلق يتمنى لك تجربة موفقة ويوم سعيد."; + + Get.find().launchCommunication( + 'whatsapp', + phone, + message, + ); + }, + child: Text('send'.tr), + ), + ), + ], + ), + ], + ), + ), + ); + } +} + +class InfoText extends StatelessWidget { + final String label; + final dynamic value; + + const InfoText(this.label, this.value, {super.key}); + + @override + Widget build(BuildContext context) { + final display = value?.toString() ?? 'N/A'; + return Padding( + padding: const EdgeInsets.symmetric(vertical: 2.0), + child: Text( + '$label: $display', + style: CupertinoTheme.of(context).textTheme.textStyle, + ), + ); + } +} + +class CupertinoCard extends StatelessWidget { + final Widget child; + final EdgeInsetsGeometry margin; + + const CupertinoCard( + {super.key, required this.child, this.margin = EdgeInsets.zero}); + + @override + Widget build(BuildContext context) { + return Container( + margin: margin, + decoration: BoxDecoration( + color: CupertinoColors.systemBackground, + borderRadius: BorderRadius.circular(12.0), + boxShadow: [ + BoxShadow( + color: CupertinoColors.systemGrey.withOpacity(0.2), + spreadRadius: 1, + blurRadius: 5, + offset: const Offset(0, 3), + ), + ], + ), + child: child, + ); + } +} diff --git a/siro_service/lib/controller/mainController/ragister_service_controller.dart b/siro_service/lib/controller/mainController/ragister_service_controller.dart new file mode 100644 index 0000000..979cb16 --- /dev/null +++ b/siro_service/lib/controller/mainController/ragister_service_controller.dart @@ -0,0 +1,352 @@ +import 'dart:convert'; +import 'package:crypto/crypto.dart'; +import 'package:flutter/cupertino.dart'; +import 'package:flutter/material.dart'; +import 'package:get/get.dart'; +import 'package:intl/intl.dart'; +import 'package:siro_service/constant/box_name.dart'; +import 'package:siro_service/constant/links.dart'; +import 'package:siro_service/controller/functions/crud.dart'; +import 'package:siro_service/main.dart'; +import 'package:siro_service/print.dart'; +import 'package:siro_service/views/widgets/my_dialog.dart'; + +import 'pages/registration_captain_page.dart'; + +class RegisterCaptainServiceController extends GetxController { + // --- UI State Management --- + var isLoading = true.obs; + late PageController pageController; + var currentPageIndex = 0.obs; + var driverId = ''.obs; + var phone = ''.obs; + var serverData = {}.obs; +// En tu archivo registration_captain_controller.dart + final phoneController = TextEditingController(); + // --- Dynamic Document Image URLs --- + final Map docUrls = { + 'driver_license_front': ''.obs, + 'driver_license_back': ''.obs, + 'car_license_front': ''.obs, + 'car_license_back': ''.obs, + }; + + // --- Text Field Controllers --- + late TextEditingController firstNameController; + late TextEditingController lastNameController; + late TextEditingController siteController; + late TextEditingController nationalNumberController; + late TextEditingController birthdateController; + late TextEditingController licenseCategoriesController; + late TextEditingController expiryDateController; + late TextEditingController ownerController; + late TextEditingController colorController; + late TextEditingController carPlateController; + late TextEditingController vinController; + late TextEditingController licenseIssueDateController; + late TextEditingController carLicenseExpiryDateController; + late TextEditingController makeController; + late TextEditingController modelController; + late TextEditingController yearController; + + // --- Reactive State for Dropdowns --- + var selectedGender = ''.obs; + var colorHex = ''.obs; + var selectedFuel = ''.obs; + + @override + void onInit() { + super.onInit(); + pageController = PageController(); + + // final arguments = Get.arguments; + // driverId.value = arguments?['driverId']; // Fallback for testing + // phone.value = arguments?['phone']; // Fallback for testing + + _initializeTextControllers(); + _initializeDocUrls(); + fetchDataFromServer(); + } + + void _initializeDocUrls() { + const baseUrl = + "https://syria.intaleq.xyz/intaleq/auth/syria/driversDocs/syria.intaleq.xyz-"; + docUrls['driver_license_front']!.value = + "$baseUrl${driverId.value}-driver_license_front.jpg"; + docUrls['driver_license_back']!.value = + "$baseUrl${driverId.value}-driver_license_back.jpg"; + docUrls['car_license_front']!.value = + "$baseUrl${driverId.value}-car_license_front.jpg"; + docUrls['car_license_back']!.value = + "$baseUrl${driverId.value}-car_license_back.jpg"; + } + + void _initializeTextControllers() { + firstNameController = TextEditingController(); + lastNameController = TextEditingController(); + siteController = TextEditingController(); + nationalNumberController = TextEditingController(); + birthdateController = TextEditingController(); + licenseCategoriesController = TextEditingController(); + expiryDateController = TextEditingController(); + ownerController = TextEditingController(); + colorController = TextEditingController(); + carPlateController = TextEditingController(); + vinController = TextEditingController(); + licenseIssueDateController = TextEditingController(); + carLicenseExpiryDateController = TextEditingController(); + makeController = TextEditingController(); + modelController = TextEditingController(); + yearController = TextEditingController(); + } + + Future fetchDataFromServer() async { + isLoading.value = true; + try { + var responseString = await CRUD().post( + link: AppLink.getDriverDetailsForActivate, + payload: {'driverId': driverId.value}); + + if (responseString != 'failure') { + var decodedResponse = responseString; + if (decodedResponse['status'] == 'success' && + (decodedResponse['message'] as List).isNotEmpty) { + var rawData = decodedResponse['message'][0] as Map; + // Sanitize data: ensure all values are strings to prevent type errors + serverData.value = rawData + .map((key, value) => MapEntry(key, value?.toString() ?? '')); + _populateControllersWithServerData(); + } + } + } catch (e) { + Get.snackbar('Error', 'An unexpected error occurred: $e'); + } finally { + isLoading.value = false; + } + } + + void _populateControllersWithServerData() { + firstNameController.text = serverData['first_name'] ?? ''; + lastNameController.text = serverData['last_name'] ?? ''; + siteController.text = serverData['site'] ?? ''; + nationalNumberController.text = serverData['national_number'] ?? ''; + birthdateController.text = serverData['birthdate'] ?? ''; + selectedGender.value = serverData['gender'] ?? ''; + licenseCategoriesController.text = serverData['license_categories'] ?? ''; + expiryDateController.text = serverData['expiry_date'] ?? ''; + ownerController.text = serverData['owner'] ?? ''; + + final serverColorName = serverData['color'] ?? ''; + final colorOption = kCarColorOptions.firstWhere( + (opt) => opt['key'] == serverColorName, + orElse: () => {'key': serverColorName, 'hex': '#000000'}); // Fallback + colorController.text = colorOption['key']!; + colorHex.value = colorOption['hex']!; + + carPlateController.text = serverData['car_plate'] ?? ''; + vinController.text = serverData['vin'] ?? ''; + licenseIssueDateController.text = serverData['issue_date'] ?? ''; + carLicenseExpiryDateController.text = serverData['expiration_date'] ?? ''; + makeController.text = serverData['make'] ?? ''; + modelController.text = serverData['model'] ?? ''; + selectedFuel.value = serverData['fuel'] ?? ''; + yearController.text = serverData['year'] ?? ''; + } + + Future selectDate( + BuildContext context, TextEditingController controller) async { + DateTime initialDate = DateTime.now(); + try { + if (controller.text.isNotEmpty) + initialDate = DateFormat('yyyy-MM-dd').parse(controller.text); + } catch (e) {/* Use default if parsing fails */} + + DateTime? pickedDate = initialDate; + await showCupertinoModalPopup( + context: context, + builder: (BuildContext context) => Container( + height: 280, + color: CupertinoColors.systemBackground.resolveFrom(context), + child: Column( + children: [ + SizedBox( + height: 200, + child: CupertinoDatePicker( + initialDateTime: initialDate, + minimumDate: DateTime(1950), + maximumDate: DateTime(2050), + mode: CupertinoDatePickerMode.date, + onDateTimeChanged: (DateTime newDate) { + pickedDate = newDate; + }, + ), + ), + CupertinoButton( + child: Text('Done'.tr), + onPressed: () { + if (pickedDate != null) + controller.text = + DateFormat('yyyy-MM-dd').format(pickedDate!); + Navigator.of(context).pop(); + }, + ), + ], + ), + ), + ); + } + + void nextPage() { + if (currentPageIndex.value < 3) + pageController.nextPage( + duration: const Duration(milliseconds: 400), curve: Curves.easeInOut); + } + + void previousPage() { + if (currentPageIndex.value > 0) + pageController.previousPage( + duration: const Duration(milliseconds: 400), curve: Curves.easeInOut); + } + + void updateAndActivateSyrianDriver() { + isLoading.value = true; + var bytes = utf8.encode(phoneController.text); + +// 2. Genera el hash MD5 completo + var digest = md5.convert(bytes); + +// 3. Convierte el hash a un string (tendrá 32 caracteres) + String fullMd5Hash = digest.toString(); + +// 4. Trunca el string a los primeros 20 caracteres + driverId.value = fullMd5Hash.substring(0, 20); + Map dataToSend = { + // Driver fields from all pages + 'id': driverId.value, + 'phone': phoneController.text, + 'first_name': firstNameController.text, + 'last_name': lastNameController.text, + 'site': siteController.text, + 'national_number': nationalNumberController.text, + 'gender': selectedGender.value, + 'birthdate': birthdateController.text, + 'license_categories': licenseCategoriesController.text, + 'expiry_date': expiryDateController.text, + 'license_issue_date': licenseIssueDateController.text, + 'password': md5.convert(utf8.encode('123456')).toString(), + 'status': 'actives', + // Car fields from all pages + 'owner': ownerController.text, + 'color': colorController.text, + 'color_hex': colorHex.value, + 'car_plate': carPlateController.text, + 'maritalStatus': box.read(BoxName.employeename) ?? 'unknown', + // 'vin': vinController.text, + 'expiration_date': carLicenseExpiryDateController.text, + 'make': makeController.text, + 'model': modelController.text, + 'fuel': selectedFuel.value, + 'year': yearController.text, + }; + + print("--- Submitting Data to Server ---"); + print(dataToSend); + + CRUD() + .post( + link: + '${AppLink.server}/serviceapp/registerDriverAndCarService.php', + payload: dataToSend) + .then((response) { + isLoading.value = false; + var decodedResponse = (response); + Log.print('decodedResponse: ${decodedResponse}'); + if (decodedResponse != 'failure' && decodedResponse['status'] == 'success') { + MyDialog().getDialog('Success'.tr, '', + Text('Driver has been activated successfully!'.tr), () { + Get.back(); + Get.back(); + // fetchDataFromServer(); + Get.back(); + // Get.off(() => RegisterCaptain()); + }); + } else { + Get.snackbar( + 'Error'.tr, + 'Failed to update driver: ${decodedResponse is Map ? decodedResponse['message'] : 'failure'}'.tr, + backgroundColor: Colors.red, + colorText: Colors.white, + ); + } + }).catchError((error) { + isLoading.value = false; + Get.snackbar( + 'Error'.tr, + 'An error occurred: $error'.tr, + backgroundColor: Colors.red, + colorText: Colors.white, + ); + }); + } + + static const List> kCarColorOptions = [ + {'key': 'white', 'hex': '#FFFFFF'}, + {'key': 'black', 'hex': '#000000'}, + {'key': 'silver', 'hex': '#C0C0C0'}, + {'key': 'gray', 'hex': '#808080'}, + {'key': 'gunmetal', 'hex': '#2A3439'}, + {'key': 'red', 'hex': '#C62828'}, + {'key': 'blue', 'hex': '#1565C0'}, + {'key': 'navy', 'hex': '#0D47A1'}, + {'key': 'green', 'hex': '#2E7D32'}, + {'key': 'darkGreen', 'hex': '#1B5E20'}, + {'key': 'beige', 'hex': '#D7CCC8'}, + {'key': 'brown', 'hex': '#5D4037'}, + {'key': 'maroon', 'hex': '#800000'}, + {'key': 'burgundy', 'hex': '#800020'}, + {'key': 'yellow', 'hex': '#F9A825'}, + {'key': 'orange', 'hex': '#EF6C00'}, + {'key': 'gold', 'hex': '#D4AF37'}, + {'key': 'bronze', 'hex': '#CD7F32'}, + {'key': 'champagne', 'hex': '#EFE1C6'}, + {'key': 'purple', 'hex': '#6A1B9A'}, + ]; + + static const List kFuelOptions = [ + 'بنزين', + 'ديزل', + 'هايبرد', + 'كهربائي' + ]; + + Color hexToColor(String code) => + Color(int.parse(code.substring(1, 7), radix: 16) + 0xFF000000); + + void updateColorSelection(String hex) { + colorHex.value = hex; + colorController.text = + kCarColorOptions.firstWhere((o) => o['hex'] == hex)['key']!; + } + + @override + void onClose() { + pageController.dispose(); + firstNameController.dispose(); + lastNameController.dispose(); + siteController.dispose(); + nationalNumberController.dispose(); + birthdateController.dispose(); + licenseCategoriesController.dispose(); + expiryDateController.dispose(); + ownerController.dispose(); + colorController.dispose(); + carPlateController.dispose(); + vinController.dispose(); + licenseIssueDateController.dispose(); + carLicenseExpiryDateController.dispose(); + makeController.dispose(); + modelController.dispose(); + yearController.dispose(); + super.onClose(); + } +} diff --git a/siro_service/lib/controller/mainController/registration_captain_controller.dart b/siro_service/lib/controller/mainController/registration_captain_controller.dart new file mode 100644 index 0000000..1fddf06 --- /dev/null +++ b/siro_service/lib/controller/mainController/registration_captain_controller.dart @@ -0,0 +1,338 @@ +import 'dart:convert'; +import 'package:flutter/cupertino.dart'; +import 'package:flutter/material.dart'; +import 'package:get/get.dart'; +import 'package:intl/intl.dart'; +import 'package:siro_service/constant/box_name.dart'; +import 'package:siro_service/constant/links.dart'; +import 'package:siro_service/controller/functions/crud.dart'; +import 'package:siro_service/main.dart'; +import 'package:siro_service/print.dart'; +import 'package:siro_service/views/widgets/my_dialog.dart'; + +import 'pages/registration_captain_page.dart'; + +class RegisterCaptainController extends GetxController { + // --- UI State Management --- + var isLoading = true.obs; + late PageController pageController; + var currentPageIndex = 0.obs; + var driverId = ''.obs; + var phone = ''.obs; + var serverData = {}.obs; +// En tu archivo registration_captain_controller.dart + final phoneController = TextEditingController(); + // --- Dynamic Document Image URLs --- + final Map docUrls = { + 'driver_license_front': ''.obs, + 'driver_license_back': ''.obs, + 'car_license_front': ''.obs, + 'car_license_back': ''.obs, + }; + + // --- Text Field Controllers --- + late TextEditingController firstNameController; + late TextEditingController lastNameController; + late TextEditingController siteController; + late TextEditingController nationalNumberController; + late TextEditingController birthdateController; + late TextEditingController licenseCategoriesController; + late TextEditingController expiryDateController; + late TextEditingController ownerController; + late TextEditingController colorController; + late TextEditingController carPlateController; + late TextEditingController vinController; + late TextEditingController licenseIssueDateController; + late TextEditingController carLicenseExpiryDateController; + late TextEditingController makeController; + late TextEditingController modelController; + late TextEditingController yearController; + + // --- Reactive State for Dropdowns --- + var selectedGender = ''.obs; + var colorHex = ''.obs; + var selectedFuel = ''.obs; + + @override + void onInit() { + super.onInit(); + pageController = PageController(); + + final arguments = Get.arguments; + driverId.value = arguments?['driverId']; // Fallback for testing + phone.value = arguments?['phone']; // Fallback for testing + + _initializeTextControllers(); + _initializeDocUrls(); + fetchDataFromServer(); + } + + void _initializeDocUrls() { + const baseUrl = + "https://syria.intaleq.xyz/intaleq/auth/syria/driversDocs/syria.intaleq.xyz-"; + docUrls['driver_license_front']!.value = + "$baseUrl${driverId.value}-driver_license_front.jpg"; + docUrls['driver_license_back']!.value = + "$baseUrl${driverId.value}-driver_license_back.jpg"; + docUrls['car_license_front']!.value = + "$baseUrl${driverId.value}-car_license_front.jpg"; + docUrls['car_license_back']!.value = + "$baseUrl${driverId.value}-car_license_back.jpg"; + } + + void _initializeTextControllers() { + firstNameController = TextEditingController(); + lastNameController = TextEditingController(); + siteController = TextEditingController(); + nationalNumberController = TextEditingController(); + birthdateController = TextEditingController(); + licenseCategoriesController = TextEditingController(); + expiryDateController = TextEditingController(); + ownerController = TextEditingController(); + colorController = TextEditingController(); + carPlateController = TextEditingController(); + vinController = TextEditingController(); + licenseIssueDateController = TextEditingController(); + carLicenseExpiryDateController = TextEditingController(); + makeController = TextEditingController(); + modelController = TextEditingController(); + yearController = TextEditingController(); + } + + Future fetchDataFromServer() async { + isLoading.value = true; + try { + var responseString = await CRUD().post( + link: AppLink.getDriverDetailsForActivate, + payload: {'driverId': driverId.value}); + + if (responseString != 'failure') { + var decodedResponse = responseString; + if (decodedResponse['status'] == 'success' && + (decodedResponse['message'] as List).isNotEmpty) { + var rawData = decodedResponse['message'][0] as Map; + // Sanitize data: ensure all values are strings to prevent type errors + serverData.value = rawData + .map((key, value) => MapEntry(key, value?.toString() ?? '')); + _populateControllersWithServerData(); + } + } + } catch (e) { + Get.snackbar('Error', 'An unexpected error occurred: $e'); + } finally { + isLoading.value = false; + } + } + + void _populateControllersWithServerData() { + firstNameController.text = serverData['first_name'] ?? ''; + lastNameController.text = serverData['last_name'] ?? ''; + siteController.text = serverData['site'] ?? ''; + nationalNumberController.text = serverData['national_number'] ?? ''; + birthdateController.text = serverData['birthdate'] ?? ''; + selectedGender.value = serverData['gender'] ?? ''; + licenseCategoriesController.text = serverData['license_categories'] ?? ''; + expiryDateController.text = serverData['expiry_date'] ?? ''; + ownerController.text = serverData['owner'] ?? ''; + + final serverColorName = serverData['color'] ?? ''; + final colorOption = kCarColorOptions.firstWhere( + (opt) => opt['key'] == serverColorName, + orElse: () => {'key': serverColorName, 'hex': '#000000'}); // Fallback + colorController.text = colorOption['key']!; + colorHex.value = colorOption['hex']!; + + carPlateController.text = serverData['car_plate'] ?? ''; + vinController.text = serverData['vin'] ?? ''; + licenseIssueDateController.text = serverData['issue_date'] ?? ''; + carLicenseExpiryDateController.text = serverData['expiration_date'] ?? ''; + makeController.text = serverData['make'] ?? ''; + modelController.text = serverData['model'] ?? ''; + selectedFuel.value = serverData['fuel'] ?? ''; + yearController.text = serverData['year'] ?? ''; + } + + Future selectDate( + BuildContext context, TextEditingController controller) async { + DateTime initialDate = DateTime.now(); + try { + if (controller.text.isNotEmpty) + initialDate = DateFormat('yyyy-MM-dd').parse(controller.text); + } catch (e) {/* Use default if parsing fails */} + + DateTime? pickedDate = initialDate; + await showCupertinoModalPopup( + context: context, + builder: (BuildContext context) => Container( + height: 280, + color: CupertinoColors.systemBackground.resolveFrom(context), + child: Column( + children: [ + SizedBox( + height: 200, + child: CupertinoDatePicker( + initialDateTime: initialDate, + minimumDate: DateTime(1950), + maximumDate: DateTime(2050), + mode: CupertinoDatePickerMode.date, + onDateTimeChanged: (DateTime newDate) { + pickedDate = newDate; + }, + ), + ), + CupertinoButton( + child: Text('Done'.tr), + onPressed: () { + if (pickedDate != null) + controller.text = + DateFormat('yyyy-MM-dd').format(pickedDate!); + Navigator.of(context).pop(); + }, + ), + ], + ), + ), + ); + } + + void nextPage() { + if (currentPageIndex.value < 3) + pageController.nextPage( + duration: const Duration(milliseconds: 400), curve: Curves.easeInOut); + } + + void previousPage() { + if (currentPageIndex.value > 0) + pageController.previousPage( + duration: const Duration(milliseconds: 400), curve: Curves.easeInOut); + } + + void updateAndActivateSyrianDriver() { + isLoading.value = true; + + Map dataToSend = { + // Driver fields from all pages + 'driverId': driverId.value, + 'phone': phone.value, + 'first_name': firstNameController.text, + 'last_name': lastNameController.text, + 'site': siteController.text, + 'national_number': nationalNumberController.text, + 'gender': selectedGender.value, + 'birthdate': '2000-01-01', //birthdateController.text, + 'license_categories': licenseCategoriesController.text, + 'expiry_date': expiryDateController.text, + 'license_issue_date': licenseIssueDateController.text, + + // Car fields from all pages + 'owner': ownerController.text, + 'color': colorController.text, + 'color_hex': colorHex.value, + 'car_plate': carPlateController.text, + 'maritalStatus': box.read(BoxName.employeename) ?? 'unknown', + // 'vin': vinController.text, + 'expiration_date': carLicenseExpiryDateController.text, + 'make': makeController.text, + 'model': modelController.text, + 'fuel': selectedFuel.value, + 'year': yearController.text, + }; + + print("--- Submitting Data to Server ---"); + print(dataToSend); + + CRUD() + .post(link: AppLink.updateDriverToActive, payload: dataToSend) + .then((response) { + isLoading.value = false; + var decodedResponse = (response); + Log.print('decodedResponse: ${decodedResponse}'); + if (decodedResponse != 'failure' && decodedResponse['status'] == 'success') { + MyDialog().getDialog('Success'.tr, '', + Text('Driver has been activated successfully!'.tr), () { + Get.back(); + Get.back(); + // fetchDataFromServer(); + Get.back(); + // Get.off(() => RegisterCaptain()); + }); + } else { + Get.snackbar( + 'Error'.tr, + 'Failed to update driver: ${decodedResponse is Map ? decodedResponse['message'] : 'failure'}'.tr, + backgroundColor: Colors.red, + colorText: Colors.white, + ); + } + }).catchError((error) { + isLoading.value = false; + Get.snackbar( + 'Error'.tr, + 'An error occurred: $error'.tr, + backgroundColor: Colors.red, + colorText: Colors.white, + ); + }); + } + + static const List> kCarColorOptions = [ + {'key': 'white', 'hex': '#FFFFFF'}, + {'key': 'black', 'hex': '#000000'}, + {'key': 'silver', 'hex': '#C0C0C0'}, + {'key': 'gray', 'hex': '#808080'}, + {'key': 'gunmetal', 'hex': '#2A3439'}, + {'key': 'red', 'hex': '#C62828'}, + {'key': 'blue', 'hex': '#1565C0'}, + {'key': 'navy', 'hex': '#0D47A1'}, + {'key': 'green', 'hex': '#2E7D32'}, + {'key': 'darkGreen', 'hex': '#1B5E20'}, + {'key': 'beige', 'hex': '#D7CCC8'}, + {'key': 'brown', 'hex': '#5D4037'}, + {'key': 'maroon', 'hex': '#800000'}, + {'key': 'burgundy', 'hex': '#800020'}, + {'key': 'yellow', 'hex': '#F9A825'}, + {'key': 'orange', 'hex': '#EF6C00'}, + {'key': 'gold', 'hex': '#D4AF37'}, + {'key': 'bronze', 'hex': '#CD7F32'}, + {'key': 'champagne', 'hex': '#EFE1C6'}, + {'key': 'purple', 'hex': '#6A1B9A'}, + ]; + + static const List kFuelOptions = [ + 'بنزين', + 'ديزل', + 'هايبرد', + 'كهربائي' + ]; + + Color hexToColor(String code) => + Color(int.parse(code.substring(1, 7), radix: 16) + 0xFF000000); + + void updateColorSelection(String hex) { + colorHex.value = hex; + colorController.text = + kCarColorOptions.firstWhere((o) => o['hex'] == hex)['key']!; + } + + @override + void onClose() { + pageController.dispose(); + firstNameController.dispose(); + lastNameController.dispose(); + siteController.dispose(); + nationalNumberController.dispose(); + birthdateController.dispose(); + licenseCategoriesController.dispose(); + expiryDateController.dispose(); + ownerController.dispose(); + colorController.dispose(); + carPlateController.dispose(); + vinController.dispose(); + licenseIssueDateController.dispose(); + carLicenseExpiryDateController.dispose(); + makeController.dispose(); + modelController.dispose(); + yearController.dispose(); + super.onClose(); + } +} diff --git a/siro_service/lib/controller/themes/themes.dart b/siro_service/lib/controller/themes/themes.dart new file mode 100644 index 0000000..2727ae1 --- /dev/null +++ b/siro_service/lib/controller/themes/themes.dart @@ -0,0 +1,147 @@ +import 'package:flutter/material.dart'; +import '../../constant/colors.dart'; +import '../../constant/style.dart'; + +ThemeData lightThemeEnglish = ThemeData( + brightness: Brightness.light, + fontFamily: "SFPro", + textTheme: TextTheme( + displaySmall: AppStyle.title, + displayLarge: AppStyle.headTitle, + displayMedium: AppStyle.headTitle2, + bodyLarge: AppStyle.title, + bodyMedium: AppStyle.subtitle, + ), + primarySwatch: Colors.blue, + dialogTheme: DialogThemeData( + backgroundColor: AppColor.secondaryColor, + contentTextStyle: AppStyle.title, + titleTextStyle: AppStyle.headTitle2, + ), + appBarTheme: AppBarTheme( + elevation: 0, + color: AppColor.secondaryColor, + centerTitle: true, + iconTheme: const IconThemeData( + color: AppColor.primaryColor, + ), + toolbarTextStyle: TextTheme( + titleSmall: AppStyle.subtitle, + headlineSmall: AppStyle.title, + titleLarge: AppStyle.headTitle2, + ).bodyMedium, + titleTextStyle: TextTheme( + titleSmall: AppStyle.subtitle, + headlineSmall: AppStyle.title, + titleLarge: AppStyle.headTitle2, + ).titleLarge, + ), +); + +ThemeData darkThemeEnglish = ThemeData( + brightness: Brightness.dark, + fontFamily: "SFPro", + textTheme: TextTheme( + displaySmall: AppStyle.title, + displayLarge: AppStyle.headTitle, + displayMedium: AppStyle.headTitle2, + bodyLarge: AppStyle.title, + bodyMedium: AppStyle.subtitle, + ), + primarySwatch: Colors.blue, + dialogTheme: DialogThemeData( + backgroundColor: AppColor.secondaryColor, + contentTextStyle: AppStyle.title, + titleTextStyle: AppStyle.headTitle2, + ), + appBarTheme: AppBarTheme( + elevation: 0, + color: AppColor.secondaryColor, + centerTitle: true, + iconTheme: const IconThemeData( + color: AppColor.primaryColor, + ), + toolbarTextStyle: TextTheme( + titleSmall: AppStyle.subtitle, + headlineSmall: AppStyle.title, + titleLarge: AppStyle.headTitle2, + ).bodyMedium, + titleTextStyle: TextTheme( + titleSmall: AppStyle.subtitle, + headlineSmall: AppStyle.title, + titleLarge: AppStyle.headTitle2, + ).titleLarge, + ), +); + +ThemeData lightThemeArabic = ThemeData( + brightness: Brightness.light, + fontFamily: 'SFArabic', + textTheme: TextTheme( + displaySmall: AppStyle.title, + displayLarge: AppStyle.headTitle, + displayMedium: AppStyle.headTitle2, + bodyLarge: AppStyle.title, + bodyMedium: AppStyle.subtitle, + ), + primarySwatch: Colors.blue, + dialogTheme: DialogThemeData( + backgroundColor: AppColor.secondaryColor, + contentTextStyle: AppStyle.title, + titleTextStyle: AppStyle.headTitle2, + ), + appBarTheme: AppBarTheme( + elevation: 0, + color: AppColor.secondaryColor, + centerTitle: true, + iconTheme: const IconThemeData( + color: AppColor.primaryColor, + ), + toolbarTextStyle: TextTheme( + titleSmall: AppStyle.subtitle, + headlineSmall: AppStyle.title, + titleLarge: AppStyle.headTitle2, + ).bodyMedium, + titleTextStyle: TextTheme( + titleSmall: AppStyle.subtitle, + headlineSmall: AppStyle.title, + titleLarge: AppStyle.headTitle2, + ).titleLarge, + ), +); + +ThemeData darkThemeArabic = ThemeData( + brightness: Brightness.dark, + fontFamily: 'SFArabic', + textTheme: TextTheme( + displaySmall: AppStyle.title, + displayLarge: AppStyle.headTitle, + displayMedium: AppStyle.headTitle2, + bodyLarge: AppStyle.title, + bodyMedium: AppStyle.subtitle, + ), + primarySwatch: Colors.blue, + dialogTheme: DialogThemeData( + backgroundColor: AppColor.secondaryColor, + contentTextStyle: AppStyle.title, + titleTextStyle: AppStyle.headTitle2, + ), + appBarTheme: AppBarTheme( + elevation: 0, + color: AppColor.secondaryColor, + centerTitle: true, + iconTheme: const IconThemeData( + color: AppColor.primaryColor, + ), + toolbarTextStyle: TextTheme( + titleSmall: AppStyle.subtitle, + headlineSmall: AppStyle.title, + titleLarge: AppStyle.headTitle2, + ).bodyMedium, + titleTextStyle: TextTheme( + titleSmall: AppStyle.subtitle, + headlineSmall: AppStyle.title, + titleLarge: AppStyle.headTitle2, + ).titleLarge, + ), +); diff --git a/siro_service/lib/env/env.dart b/siro_service/lib/env/env.dart new file mode 100644 index 0000000..0b2e7c4 --- /dev/null +++ b/siro_service/lib/env/env.dart @@ -0,0 +1,219 @@ +import 'package:envied/envied.dart'; + +part 'env.g.dart'; + +@Envied() +abstract class Env { + @EnviedField(varName: 'addd', obfuscate: true) + static final String addd = _Env.addd; + + @EnviedField(varName: 'getapiKey', obfuscate: true) + static final String getapiKey = _Env.getapiKey; + + @EnviedField(varName: 'passnpassenger', obfuscate: true) + static final String passnpassenger = _Env.passnpassenger; + + @EnviedField(varName: 'newId', obfuscate: true) + static final String newId = _Env.newId; + + @EnviedField(varName: 'allowed', obfuscate: true) + static final String allowed = _Env.allowed; + + @EnviedField(varName: 'basicAuthCredentials', obfuscate: true) + static final String basicAuthCredentials = _Env.basicAuthCredentials; + + @EnviedField(varName: 'visionApi', obfuscate: true) + static final String visionApi = _Env.visionApi; + + @EnviedField(varName: 'smsPasswordEgypt', obfuscate: true) + static final String smsPasswordEgypt = _Env.smsPasswordEgypt; + + @EnviedField(varName: 'ocpApimSubscriptionKey', obfuscate: true) + static final String ocpApimSubscriptionKey = _Env.ocpApimSubscriptionKey; + + @EnviedField(varName: 'serverPHP', obfuscate: true) + static final String serverPHP = _Env.serverPHP; + + @EnviedField(varName: 'seferAlexandriaServer', obfuscate: true) + static final String seferAlexandriaServer = _Env.seferAlexandriaServer; + + @EnviedField(varName: 'seferPaymentServer', obfuscate: true) + static final String seferPaymentServer = _Env.seferPaymentServer; + + @EnviedField(varName: 'seferCairoServer', obfuscate: true) + static final String seferCairoServer = _Env.seferCairoServer; + + @EnviedField(varName: 'seferGizaServer', obfuscate: true) + static final String seferGizaServer = _Env.seferGizaServer; + + @EnviedField(varName: 'anthropicAIkeySeferNew', obfuscate: true) + static final String anthropicAIkeySeferNew = _Env.anthropicAIkeySeferNew; + + @EnviedField( + varName: 'anthropicAIkeySeferNewHamzaayedpython', obfuscate: true) + static final String anthropicAIkeySeferNewHamzaayedpython = + _Env.anthropicAIkeySeferNewHamzaayedpython; + + @EnviedField(varName: 'A', obfuscate: true) + static final String A = _Env.A; + + @EnviedField(varName: 'B', obfuscate: true) + static final String B = _Env.B; + + @EnviedField(varName: 'C', obfuscate: true) + static final String C = _Env.C; + + @EnviedField(varName: 'D', obfuscate: true) + static final String D = _Env.D; + + @EnviedField(varName: 'E', obfuscate: true) + static final String E = _Env.E; + + @EnviedField(varName: 'F', obfuscate: true) + static final String F = _Env.F; + + @EnviedField(varName: 'G', obfuscate: true) + static final String G = _Env.G; + + @EnviedField(varName: 'H', obfuscate: true) + static final String H = _Env.H; + + @EnviedField(varName: 'I', obfuscate: true) + static final String I = _Env.I; + + @EnviedField(varName: 'J', obfuscate: true) + static final String J = _Env.J; + + @EnviedField(varName: 'K', obfuscate: true) + static final String K = _Env.K; + + @EnviedField(varName: 'L', obfuscate: true) + static final String L = _Env.L; + + @EnviedField(varName: 'M', obfuscate: true) + static final String M = _Env.M; + + @EnviedField(varName: 'N', obfuscate: true) + static final String N = _Env.N; + + @EnviedField(varName: 'O', obfuscate: true) + static final String O = _Env.O; + + @EnviedField(varName: 'P', obfuscate: true) + static final String P = _Env.P; + + @EnviedField(varName: 'Q', obfuscate: true) + static final String Q = _Env.Q; + + @EnviedField(varName: 'R', obfuscate: true) + static final String R = _Env.R; + + @EnviedField(varName: 'S', obfuscate: true) + static final String S = _Env.S; + + @EnviedField(varName: 'T', obfuscate: true) + static final String T = _Env.T; + + @EnviedField(varName: 'U', obfuscate: true) + static final String U = _Env.U; + + @EnviedField(varName: 'V', obfuscate: true) + static final String V = _Env.V; + + @EnviedField(varName: 'W', obfuscate: true) + static final String W = _Env.W; + + @EnviedField(varName: 'X', obfuscate: true) + static final String X = _Env.X; + + @EnviedField(varName: 'Y', obfuscate: true) + static final String Y = _Env.Y; + + @EnviedField(varName: 'Z', obfuscate: true) + static final String Z = _Env.Z; + @EnviedField(varName: 'a', obfuscate: true) + static final String a = _Env.a; + + @EnviedField(varName: 'b', obfuscate: true) + static final String b = _Env.b; + + @EnviedField(varName: 'c', obfuscate: true) + static final String c = _Env.c; + + @EnviedField(varName: 'd', obfuscate: true) + static final String d = _Env.d; + + @EnviedField(varName: 'e', obfuscate: true) + static final String e = _Env.e; + + @EnviedField(varName: 'f', obfuscate: true) + static final String f = _Env.f; + + @EnviedField(varName: 'g', obfuscate: true) + static final String g = _Env.g; + + @EnviedField(varName: 'h', obfuscate: true) + static final String h = _Env.h; + + @EnviedField(varName: 'i', obfuscate: true) + static final String i = _Env.i; + + @EnviedField(varName: 'j', obfuscate: true) + static final String j = _Env.j; + + @EnviedField(varName: 'k', obfuscate: true) + static final String k = _Env.k; + + @EnviedField(varName: 'l', obfuscate: true) + static final String l = _Env.l; + + @EnviedField(varName: 'm', obfuscate: true) + static final String m = _Env.m; + + @EnviedField(varName: 'n', obfuscate: true) + static final String n = _Env.n; + + @EnviedField(varName: 'o', obfuscate: true) + static final String o = _Env.o; + + @EnviedField(varName: 'p', obfuscate: true) + static final String p = _Env.p; + + @EnviedField(varName: 'q', obfuscate: true) + static final String q = _Env.q; + + @EnviedField(varName: 'r', obfuscate: true) + static final String r = _Env.r; + + @EnviedField(varName: 's', obfuscate: true) + static final String s = _Env.s; + + @EnviedField(varName: 't', obfuscate: true) + static final String t = _Env.t; + + @EnviedField(varName: 'u', obfuscate: true) + static final String u = _Env.u; + + @EnviedField(varName: 'v', obfuscate: true) + static final String v = _Env.v; + + @EnviedField(varName: 'w', obfuscate: true) + static final String w = _Env.w; + + @EnviedField(varName: 'x', obfuscate: true) + static final String x = _Env.x; + + @EnviedField(varName: 'y', obfuscate: true) + static final String y = _Env.y; + + @EnviedField(varName: 'z', obfuscate: true) + static final String z = _Env.z; + + @EnviedField(varName: 'emailService', obfuscate: true) + static final String emailService = _Env.emailService; + + @EnviedField(varName: 'keyOfApp', obfuscate: true) + static final String keyOfApp = _Env.keyOfApp; + @EnviedField(varName: 'initializationVector', obfuscate: true) + static final String initializationVector = _Env.initializationVector; +} diff --git a/siro_service/lib/env/env.g.dart b/siro_service/lib/env/env.g.dart new file mode 100644 index 0000000..28c2add --- /dev/null +++ b/siro_service/lib/env/env.g.dart @@ -0,0 +1,2137 @@ +// GENERATED CODE - DO NOT MODIFY BY HAND + +part of 'env.dart'; + +// ************************************************************************** +// EnviedGenerator +// ************************************************************************** + +// coverage:ignore-file +// ignore_for_file: type=lint +// generated_from: .env +final class _Env { + static const List _enviedkeyaddd = [ + 2944646534, + 184956441, + 1523109562, + 1544795598, + 3511617037, + 4160804049, + ]; + + static const List _envieddataaddd = [ + 2944646596, + 184956533, + 1523109624, + 1544795554, + 3511617091, + 4160804029, + ]; + + static final String addd = String.fromCharCodes(List.generate( + _envieddataaddd.length, + (int i) => i, + growable: false, + ).map((int i) => _envieddataaddd[i] ^ _enviedkeyaddd[i])); + + static const List _enviedkeygetapiKey = [ + 2035796273, + 3146053856, + 2467356459, + 4257546489, + 2259212003, + 2552026386, + 2908333074, + 2123276852, + 2208891437, + 3307268002, + 239983529, + 927250205, + 3328676268, + 324556092, + 3266286920, + 1040680703, + 74008423, + 1174368731, + 3735078667, + 4255491676, + 3312137385, + 2306497700, + 3299223255, + 2316065890, + 1580413268, + 51660587, + 2239062813, + 178121089, + 3168636322, + 1723499809, + 639423077, + 1154188445, + 2869482367, + 2279247823, + 505069535, + 1373636715, + 2489054678, + 1808738448, + 1558766555, + 2701145693, + 1931617294, + 3928720618, + 3579282095, + 2758907826, + 4072500720, + 3251647712, + 4047031597, + 4273100062, + 1607221376, + 704424241, + 1556739285, + 3270914923, + 2389712261, + 794667618, + 492718785, + 4073563380, + 2032656621, + 373061452, + ]; + + static const List _envieddatagetapiKey = [ + 2035796299, + 3146053767, + 2467356422, + 4257546445, + 2259211936, + 2552026400, + 2908333092, + 2123276869, + 2208891417, + 3307268081, + 239983600, + 927250298, + 3328676334, + 324556151, + 3266286873, + 1040680602, + 74008367, + 1174368641, + 3735078735, + 4255491629, + 3312137410, + 2306497779, + 3299223224, + 2316065813, + 1580413207, + 51660562, + 2239062853, + 178121203, + 3168636378, + 1723499846, + 639423024, + 1154188504, + 2869482265, + 2279247770, + 505069478, + 1373636690, + 2489054620, + 1808738498, + 1558766508, + 2701145711, + 1931617404, + 3928720519, + 3579282073, + 2758907875, + 4072500674, + 3251647617, + 4047031625, + 4273100156, + 1607221427, + 704424282, + 1556739263, + 3270914844, + 2389712349, + 794667536, + 492718745, + 4073563288, + 2032656559, + 373061408, + ]; + + static final String getapiKey = String.fromCharCodes(List.generate( + _envieddatagetapiKey.length, + (int i) => i, + growable: false, + ).map((int i) => _envieddatagetapiKey[i] ^ _enviedkeygetapiKey[i])); + + static const List _enviedkeypassnpassenger = [ + 446510466, + 4287105743, + 3247356487, + 3311127524, + 79203576, + 1577808120, + 2459072808, + 3281103088, + 3879323872, + 3963532887, + 2359409106, + 2701858765, + 2913653551, + ]; + + static const List _envieddatapassnpassenger = [ + 446510570, + 4287105709, + 3247356448, + 3311127430, + 79203473, + 1577808012, + 2459072842, + 3281103016, + 3879323794, + 3963532815, + 2359409056, + 2701858703, + 2913653597, + ]; + + static final String passnpassenger = String.fromCharCodes(List.generate( + _envieddatapassnpassenger.length, + (int i) => i, + growable: false, + ).map((int i) => _envieddatapassnpassenger[i] ^ _enviedkeypassnpassenger[i])); + + static const List _enviedkeynewId = [ + 3021480117, + 3652665475, + 1216681108, + ]; + + static const List _envieddatanewId = [ + 3021480155, + 3652665574, + 1216681187, + ]; + + static final String newId = String.fromCharCodes(List.generate( + _envieddatanewId.length, + (int i) => i, + growable: false, + ).map((int i) => _envieddatanewId[i] ^ _enviedkeynewId[i])); + + static const List _enviedkeyallowed = [ + 2234293514, + 3006141801, + 2399632043, + 1952302208, + 329493009, + 203209763, + ]; + + static const List _envieddataallowed = [ + 2234293598, + 3006141723, + 2399632066, + 1952302320, + 329493099, + 203209753, + ]; + + static final String allowed = String.fromCharCodes(List.generate( + _envieddataallowed.length, + (int i) => i, + growable: false, + ).map((int i) => _envieddataallowed[i] ^ _enviedkeyallowed[i])); + + static const List _enviedkeybasicAuthCredentials = [ + 3340092559, + 1048349933, + 3926325779, + 4064542949, + 3504802350, + 689128322, + 534155882, + 853788758, + 1630992554, + 2337068549, + 2866477930, + 3569439651, + 571085485, + 810611111, + 2785721934, + 3361418893, + 1998063976, + 4033983128, + 658107822, + 3831406358, + 2020547745, + 3040819718, + 1738734517, + 485962854, + 2004975045, + 2015268428, + 896019186, + 1566326749, + 919804003, + 3624010482, + 4230096165, + ]; + + static const List _envieddatabasicAuthCredentials = [ + 3340092664, + 1048349852, + 3926325885, + 4064542856, + 3504802399, + 689128435, + 534155801, + 853788732, + 1630992595, + 2337068659, + 2866477853, + 3569439689, + 571085531, + 810611101, + 2785721888, + 3361419004, + 1998063898, + 4033983169, + 658107876, + 3831406406, + 2020547809, + 3040819767, + 1738734466, + 485962837, + 2004975090, + 2015268372, + 896019072, + 1566326661, + 919803919, + 3624010416, + 4230096201, + ]; + + static final String basicAuthCredentials = String.fromCharCodes( + List.generate( + _envieddatabasicAuthCredentials.length, + (int i) => i, + growable: false, + ).map((int i) => + _envieddatabasicAuthCredentials[i] ^ + _enviedkeybasicAuthCredentials[i])); + + static const List _enviedkeyvisionApi = [ + 581176627, + 1546460188, + 3753242113, + 1368503404, + 2135507973, + 781295285, + 3325815350, + 980777243, + 352976952, + 1598690460, + 1460783347, + 281009227, + 3893150717, + 125113938, + 1381531906, + 72598442, + 755826025, + 1987503711, + 2120277971, + 3141363430, + 617170179, + 2157340339, + 831228006, + 1869399614, + 3436813591, + 2070128414, + 3964803056, + 151747218, + 919256712, + 2916741498, + 3446380381, + 3886353949, + 3536081873, + 1559500787, + 3420307704, + 2217023283, + 3444610791, + 3875158743, + ]; + + static const List _envieddatavisionApi = [ + 581176576, + 1546460268, + 3753242176, + 1368503328, + 2135508086, + 781295300, + 3325815397, + 980777288, + 352976993, + 1598690504, + 1460783237, + 281009201, + 3893150605, + 125113956, + 1381531963, + 72598523, + 755826012, + 1987503641, + 2120277918, + 3141363375, + 617170276, + 2157340369, + 831227932, + 1869399636, + 3436813648, + 2070128424, + 3964802986, + 151747235, + 919256818, + 2916741393, + 3446380329, + 3886354007, + 3536081801, + 1559500673, + 3420307616, + 2217023327, + 3444610725, + 3875158715, + ]; + + static final String visionApi = String.fromCharCodes(List.generate( + _envieddatavisionApi.length, + (int i) => i, + growable: false, + ).map((int i) => _envieddatavisionApi[i] ^ _enviedkeyvisionApi[i])); + + static const List _enviedkeysmsPasswordEgypt = [ + 2800302963, + 1416419809, + 2743188693, + 3838247872, + 4060529019, + 4032291392, + 3436926448, + 1803324912, + 2385891593, + 3064127274, + 1287643096, + 372136679, + 3060244136, + 2369012154, + 2846312218, + 2431834177, + ]; + + static const List _envieddatasmsPasswordEgypt = [ + 2800302905, + 1416419784, + 2743188611, + 3838247848, + 4060528966, + 4032291377, + 3436926354, + 1803324895, + 2385891657, + 3064127335, + 1287643008, + 372136597, + 3060244208, + 2369012182, + 2846312280, + 2431834157, + ]; + + static final String smsPasswordEgypt = String.fromCharCodes( + List.generate( + _envieddatasmsPasswordEgypt.length, + (int i) => i, + growable: false, + ).map((int i) => + _envieddatasmsPasswordEgypt[i] ^ _enviedkeysmsPasswordEgypt[i])); + + static const List _enviedkeyocpApimSubscriptionKey = [ + 3212670649, + 1434796849, + 3427161081, + 1917953402, + 693239346, + 4241495890, + 665908335, + 3592468309, + 1360798934, + 4118122063, + 3172676337, + 1188767714, + 3223034597, + 2426093161, + 792100072, + 3041539554, + 821834604, + 3779328337, + 2263085834, + 3218008018, + 2052729503, + 1325899180, + 979954310, + 69266691, + 147029351, + 1646110931, + 3962682895, + 3031893004, + 1523931480, + 1820407176, + 2704573697, + 4190396675, + ]; + + static const List _envieddataocpApimSubscriptionKey = [ + 3212670601, + 1434796887, + 3427161036, + 1917953310, + 693239379, + 4241495857, + 665908236, + 3592468278, + 1360798898, + 4118122029, + 3172676242, + 1188767623, + 3223034577, + 2426093144, + 792100059, + 3041539539, + 821834510, + 3779328352, + 2263085931, + 3218008039, + 2052729593, + 1325899157, + 979954355, + 69266737, + 147029342, + 1646110954, + 3962682937, + 3031893055, + 1523931496, + 1820407226, + 2704573796, + 4190396720, + ]; + + static final String ocpApimSubscriptionKey = String.fromCharCodes( + List.generate( + _envieddataocpApimSubscriptionKey.length, + (int i) => i, + growable: false, + ).map((int i) => + _envieddataocpApimSubscriptionKey[i] ^ + _enviedkeyocpApimSubscriptionKey[i])); + + static const List _enviedkeyserverPHP = [ + 884180313, + 4005717553, + 1106734699, + 3429689210, + 1877290658, + 3845575088, + 1078214900, + 1117798411, + 3263206882, + 1809181127, + 3264428409, + 2758496621, + 893715042, + 122379667, + 1675102488, + 4292378762, + 11178325, + 2292151507, + 2307370973, + 2088078708, + 3639047040, + 767189757, + 1549653436, + 2394618647, + 3600972003, + 3574956904, + 2894828690, + 2616220697, + ]; + + static const List _envieddataserverPHP = [ + 884180273, + 4005717573, + 1106734623, + 3429689098, + 1877290705, + 3845575050, + 1078214875, + 1117798436, + 3263206787, + 1809181111, + 3264428304, + 2758496579, + 893714961, + 122379766, + 1675102590, + 4292378863, + 11178279, + 2292151549, + 2307370929, + 2088078621, + 3639047158, + 767189656, + 1549653395, + 2394618724, + 3600971910, + 3574956814, + 2894828791, + 2616220779, + ]; + + static final String serverPHP = String.fromCharCodes(List.generate( + _envieddataserverPHP.length, + (int i) => i, + growable: false, + ).map((int i) => _envieddataserverPHP[i] ^ _enviedkeyserverPHP[i])); + + static const List _enviedkeyseferAlexandriaServer = [ + 2381124786, + 1125388689, + 3191350751, + 743746606, + 1329577162, + 1222973518, + 1503356489, + 862967249, + 332680023, + 2689513747, + 918210508, + 3690011715, + 538709206, + 2632963958, + 2570214803, + 2656189670, + 3271641643, + 1187037133, + 3572001393, + 75089705, + 3008552627, + 1927933915, + 2392060827, + 2961584642, + 1791788506, + 283111420, + 2806702586, + 457195779, + 2681820740, + 3878835005, + 266323606, + 1047117602, + 2706997288, + 2599955321, + ]; + + static const List _envieddataseferAlexandriaServer = [ + 2381124826, + 1125388773, + 3191350699, + 743746654, + 1329577145, + 1222973556, + 1503356518, + 862967294, + 332679972, + 2689513846, + 918210474, + 3690011686, + 538709156, + 2632963863, + 2570214911, + 2656189571, + 3271641683, + 1187037100, + 3572001311, + 75089741, + 3008552641, + 1927933874, + 2392060922, + 2961584684, + 1791788457, + 283111317, + 2806702478, + 457195878, + 2681820779, + 3878835022, + 266323699, + 1047117636, + 2706997325, + 2599955211, + ]; + + static final String seferAlexandriaServer = String.fromCharCodes( + List.generate( + _envieddataseferAlexandriaServer.length, + (int i) => i, + growable: false, + ).map((int i) => + _envieddataseferAlexandriaServer[i] ^ + _enviedkeyseferAlexandriaServer[i])); + + static const List _enviedkeyseferPaymentServer = [ + 2120177226, + 1979596405, + 2087713620, + 1968755197, + 4003342652, + 3672043801, + 3655016466, + 3773834693, + 3629701280, + 4157916645, + 653237921, + 2506582679, + 1078151164, + 3321315326, + 1232737695, + 3525992111, + 3848218034, + 4096223868, + 29161496, + 2634361177, + 2595147465, + 1621343417, + 486565593, + 1756550098, + 2025274596, + 2890487445, + ]; + + static const List _envieddataseferPaymentServer = [ + 2120177186, + 1979596289, + 2087713568, + 1968755085, + 4003342671, + 3672043811, + 3655016509, + 3773834730, + 3629701331, + 4157916544, + 653237959, + 2506582770, + 1078151054, + 3321315214, + 1232737768, + 3525992065, + 3848218049, + 4096223764, + 29161591, + 2634361129, + 2595147494, + 1621343434, + 486565564, + 1756550068, + 2025274497, + 2890487527, + ]; + + static final String seferPaymentServer = String.fromCharCodes( + List.generate( + _envieddataseferPaymentServer.length, + (int i) => i, + growable: false, + ).map((int i) => + _envieddataseferPaymentServer[i] ^ _enviedkeyseferPaymentServer[i])); + + static const List _enviedkeyseferCairoServer = [ + 4236380159, + 3819299464, + 59838035, + 4035470289, + 954980335, + 3619403605, + 69009252, + 3019991356, + 2824152897, + 521756287, + 1914119911, + 2307220478, + 3637417530, + 2053694398, + 524568142, + 3280211098, + 1659644265, + 3291252722, + 1788832103, + 583815103, + 1320755152, + 2750766973, + 1675619396, + 3690207478, + 2753170802, + 3231770208, + 2358386705, + 1745501215, + 3005356614, + 204799211, + 3282180084, + 2605474808, + 181879134, + 2741330263, + 3117563987, + 4210101245, + 426382330, + 1862828418, + 2182721483, + 3846227384, + 3772222789, + 2020563020, + 71597798, + ]; + + static const List _envieddataseferCairoServer = [ + 4236380055, + 3819299580, + 59837991, + 4035470241, + 954980252, + 3619403631, + 69009227, + 3019991315, + 2824152882, + 521756186, + 1914119829, + 2307220360, + 3637417567, + 2053694412, + 524568160, + 3280211177, + 1659644172, + 3291252628, + 1788832002, + 583815117, + 1320755198, + 2750766865, + 1675619373, + 3690207360, + 2753170711, + 3231770191, + 2358386786, + 1745501306, + 3005356576, + 204799118, + 3282179974, + 2605474774, + 181879101, + 2741330235, + 3117563962, + 4210101150, + 426382225, + 1862828461, + 2182721464, + 3846227421, + 3772222755, + 2020562985, + 71597716, + ]; + + static final String seferCairoServer = String.fromCharCodes( + List.generate( + _envieddataseferCairoServer.length, + (int i) => i, + growable: false, + ).map((int i) => + _envieddataseferCairoServer[i] ^ _enviedkeyseferCairoServer[i])); + + static const List _enviedkeyseferGizaServer = [ + 1497308605, + 182388587, + 2335833952, + 3101924418, + 4082417418, + 1246314915, + 2900652933, + 1760622675, + 1692409129, + 1378284691, + 3447161248, + 3898819024, + 123423056, + 2973776738, + 1820076317, + 2620384686, + 1684210689, + 4019097015, + 1431146957, + 2548774503, + 1202481663, + 2068086454, + 1478318945, + 2641264135, + 1792201330, + 3628077946, + 2657958807, + 2140803338, + 147474742, + 854324818, + ]; + + static const List _envieddataseferGizaServer = [ + 1497308629, + 182388511, + 2335833876, + 3101924402, + 4082417529, + 1246314905, + 2900652970, + 1760622716, + 1692409166, + 1378284794, + 3447161306, + 3898818993, + 123423011, + 2973776647, + 1820076411, + 2620384715, + 1684210803, + 4019096985, + 1431146914, + 2548774409, + 1202481555, + 2068086495, + 1478318863, + 2641264226, + 1792201309, + 3628077833, + 2657958898, + 2140803436, + 147474771, + 854324768, + ]; + + static final String seferGizaServer = String.fromCharCodes(List.generate( + _envieddataseferGizaServer.length, + (int i) => i, + growable: false, + ).map( + (int i) => _envieddataseferGizaServer[i] ^ _enviedkeyseferGizaServer[i])); + + static const List _enviedkeyanthropicAIkeySeferNew = [ + 4071914277, + 3989653049, + 1873138712, + 1951838920, + 4283539928, + 2102709475, + 2428171286, + 155991429, + 1065796101, + 3052694009, + 4137574792, + 2163231458, + 1729237802, + 691842241, + 851804493, + 3273168242, + 395921001, + 2203562356, + 2541200292, + 192191850, + 2389307380, + 222501594, + 2972448287, + 2046285060, + 1801896535, + 2351706310, + 1445250193, + 3242400720, + 4050570040, + 1937686519, + 3916065903, + 932743805, + 587043528, + 4067563431, + 1222591131, + 4016366933, + 2151023640, + 1179286173, + 3888334434, + 927072863, + 1350894045, + 4180881645, + 376152278, + 878018409, + 757675320, + 3278685439, + 1706103562, + 1887710195, + 3192647199, + 3036506359, + 3274446223, + 2325858435, + 2506620828, + 4276224748, + 1613018488, + 1570710560, + 421561651, + 533224975, + 861232399, + 2230694768, + 3671758495, + 1716939417, + 913158548, + 2190909261, + 1756738519, + 3285191550, + 153005087, + 1781547241, + 3036422092, + 685630520, + 3595175361, + 1670581023, + 166369048, + 1550706533, + 843680759, + 1633179101, + 1834799444, + 3621390405, + 2982485748, + 29863932, + 1689419893, + 4010307460, + 1537775870, + 65913735, + 3650842924, + 3751647823, + 32009632, + 3229065527, + 3987618559, + 3331870389, + 339542212, + 3040478954, + 619268024, + 2868344906, + 3702347591, + 4025971797, + 3022862394, + 2616157518, + 2112464718, + 1732065371, + 230356279, + 11656713, + 3095960857, + 1888337338, + 2362233339, + 1824810359, + 2981756514, + 1570031915, + 678768889, + 3999486820, + 2528681022, + 1726473643, + 867616349, + 3408451333, + 3043426788, + ]; + + static const List _envieddataanthropicAIkeySeferNew = [ + 4071914335, + 3989653086, + 1873138741, + 1951838905, + 4283539898, + 2102709376, + 2428171323, + 155991540, + 1065796211, + 3052693910, + 4137574843, + 2163231451, + 1729237767, + 691842220, + 851804451, + 3273168198, + 395920959, + 2203562256, + 2541200361, + 192191803, + 2389307329, + 222501556, + 2972448362, + 2046285134, + 1801896498, + 2351706255, + 1445250248, + 3242400696, + 4050570101, + 1937686457, + 3916065883, + 932743725, + 587043468, + 4067563518, + 1222591209, + 4016366946, + 2151023721, + 1179286258, + 3888334362, + 927072876, + 1350894064, + 4180881561, + 376152292, + 878018304, + 757675273, + 3278685363, + 1706103650, + 1887710148, + 3192647294, + 3036506297, + 3274446299, + 2325858503, + 2506620922, + 4276224693, + 1613018430, + 1570710541, + 421561716, + 533225065, + 861232439, + 2230694663, + 3671758583, + 1716939468, + 913158622, + 2190909207, + 1756738452, + 3285191437, + 153005099, + 1781547230, + 3036422025, + 685630557, + 3595175332, + 1670581107, + 166369107, + 1550706443, + 843680719, + 1633179010, + 1834799361, + 3621390374, + 2982485657, + 29863849, + 1689419832, + 4010307561, + 1537775767, + 65913812, + 3650842976, + 3751647790, + 32009670, + 3229065479, + 3987618474, + 3331870463, + 339542179, + 3040478938, + 619268092, + 2868344892, + 3702347538, + 4025971769, + 3022862443, + 2616157500, + 2112464650, + 1732065327, + 230356250, + 11656766, + 3095960879, + 1888337401, + 2362233257, + 1824810245, + 2981756425, + 1570031994, + 678768808, + 3999486780, + 2528681036, + 1726473715, + 867616305, + 3408451399, + 3043426696, + ]; + + static final String anthropicAIkeySeferNew = String.fromCharCodes( + List.generate( + _envieddataanthropicAIkeySeferNew.length, + (int i) => i, + growable: false, + ).map((int i) => + _envieddataanthropicAIkeySeferNew[i] ^ + _enviedkeyanthropicAIkeySeferNew[i])); + + static const List _enviedkeyanthropicAIkeySeferNewHamzaayedpython = + [ + 3009786566, + 4091262606, + 3795942719, + 96677523, + 3541026035, + 1338226181, + 1712387565, + 1276960307, + 1567012643, + 2705405807, + 835869330, + 2569309261, + 3943190725, + 201336230, + 909695920, + 595304714, + 3430183179, + 2521910518, + 2111837691, + 2442903791, + 338093182, + 4101653323, + 3655518250, + 986591685, + 2989682319, + 3726410306, + 1307269584, + 1378182224, + 3544564335, + 455936937, + 1158735567, + 3950841237, + 526487255, + 2546139612, + 4280995000, + 1160449816, + 3813087545, + 1674438581, + 758242437, + 3168516132, + 884880745, + 474835532, + 1740520983, + 1712574983, + 2559463121, + 1368366407, + 633463994, + 4097416448, + 3514187642, + 221909235, + 4214533051, + 4233970271, + 1750387514, + 2341653090, + 21616569, + 545212353, + 4271824021, + 3313361281, + 3323368463, + 4176591512, + 4189027694, + 882829978, + 2450237314, + 2416651749, + 726185425, + 131730347, + 1734683944, + 436117583, + 2236660625, + 3575151050, + 2416003764, + 181777166, + 1384104542, + 1731416674, + 3928830170, + 2277542999, + 802316448, + 2013308795, + 3930796922, + 679945455, + 3147371053, + 893912965, + 2439639132, + 46465841, + 2338054294, + 1136602995, + 3883226935, + 2716541490, + 1568465927, + 3054637257, + 1601600393, + 3637734894, + 1126146121, + 4162125307, + 2502652644, + 1369446736, + 4200767444, + 2238862131, + 648884149, + 1102752962, + 537477088, + 2895056584, + 1389149744, + 787125519, + 3428833862, + 1753344080, + 777572465, + 4041107171, + 145995983, + 643050346, + 593145550, + 4186169845, + 97917703, + 2013944250, + ]; + + static const List _envieddataanthropicAIkeySeferNewHamzaayedpython = + [ + 3009786556, + 4091262697, + 3795942674, + 96677602, + 3541025937, + 1338226278, + 1712387520, + 1276960322, + 1567012693, + 2705405696, + 835869345, + 2569309300, + 3943190760, + 201336272, + 909695987, + 595304776, + 3430183206, + 2521910433, + 2111837589, + 2442903701, + 338093115, + 4101653308, + 3655518316, + 986591627, + 2989682382, + 3726410288, + 1307269535, + 1378182240, + 3544564278, + 455936965, + 1158735515, + 3950841332, + 526487207, + 2546139562, + 4280995038, + 1160449904, + 3813087565, + 1674438616, + 758242530, + 3168516177, + 884880674, + 474835483, + 1740521060, + 1712575071, + 2559463067, + 1368366356, + 633464049, + 4097416561, + 3514187549, + 221909164, + 4214533109, + 4233970181, + 1750387561, + 2341653000, + 21616625, + 545212291, + 4271824076, + 3313361367, + 3323368535, + 4176591573, + 4189027636, + 882830033, + 2450237363, + 2416651676, + 726185348, + 131730400, + 1734683920, + 436117623, + 2236660674, + 3575151013, + 2416003798, + 181777258, + 1384104509, + 1731416585, + 3928830092, + 2277543015, + 802316523, + 2013308686, + 3930796842, + 679945358, + 3147371119, + 893913069, + 2439639148, + 46465874, + 2338054345, + 1136602916, + 3883227007, + 2716541510, + 1568465984, + 3054637242, + 1601600475, + 3637734817, + 1126146070, + 4162125263, + 2502652631, + 1369446761, + 4200767364, + 2238862193, + 648884190, + 1102753007, + 537476997, + 2895056634, + 1389149793, + 787125630, + 3428833825, + 1753344059, + 777572384, + 4041107122, + 145995927, + 643050264, + 593145494, + 4186169753, + 97917765, + 2013944278, + ]; + + static final String anthropicAIkeySeferNewHamzaayedpython = + String.fromCharCodes(List.generate( + _envieddataanthropicAIkeySeferNewHamzaayedpython.length, + (int i) => i, + growable: false, + ).map((int i) => + _envieddataanthropicAIkeySeferNewHamzaayedpython[i] ^ + _enviedkeyanthropicAIkeySeferNewHamzaayedpython[i])); + + static const List _enviedkeyA = [893420161]; + + static const List _envieddataA = [893420240]; + + static final String A = String.fromCharCodes(List.generate( + _envieddataA.length, + (int i) => i, + growable: false, + ).map((int i) => _envieddataA[i] ^ _enviedkeyA[i])); + + static const List _enviedkeyB = [3269408540]; + + static const List _envieddataB = [3269408580]; + + static final String B = String.fromCharCodes(List.generate( + _envieddataB.length, + (int i) => i, + growable: false, + ).map((int i) => _envieddataB[i] ^ _enviedkeyB[i])); + + static const List _enviedkeyC = [1918576547]; + + static const List _envieddataC = [1918576613]; + + static final String C = String.fromCharCodes(List.generate( + _envieddataC.length, + (int i) => i, + growable: false, + ).map((int i) => _envieddataC[i] ^ _enviedkeyC[i])); + + static const List _enviedkeyD = [2554216033]; + + static const List _envieddataD = [2554215992]; + + static final String D = String.fromCharCodes(List.generate( + _envieddataD.length, + (int i) => i, + growable: false, + ).map((int i) => _envieddataD[i] ^ _enviedkeyD[i])); + + static const List _enviedkeyE = [3033185546]; + + static const List _envieddataE = [3033185600]; + + static final String E = String.fromCharCodes(List.generate( + _envieddataE.length, + (int i) => i, + growable: false, + ).map((int i) => _envieddataE[i] ^ _enviedkeyE[i])); + + static const List _enviedkeyF = [3555710056]; + + static const List _envieddataF = [3555710013]; + + static final String F = String.fromCharCodes(List.generate( + _envieddataF.length, + (int i) => i, + growable: false, + ).map((int i) => _envieddataF[i] ^ _enviedkeyF[i])); + + static const List _enviedkeyG = [4096959981]; + + static const List _envieddataG = [4096959910]; + + static final String G = String.fromCharCodes(List.generate( + _envieddataG.length, + (int i) => i, + growable: false, + ).map((int i) => _envieddataG[i] ^ _enviedkeyG[i])); + + static const List _enviedkeyH = [3666372375]; + + static const List _envieddataH = [3666372416]; + + static final String H = String.fromCharCodes(List.generate( + _envieddataH.length, + (int i) => i, + growable: false, + ).map((int i) => _envieddataH[i] ^ _enviedkeyH[i])); + + static const List _enviedkeyI = [1429148901]; + + static const List _envieddataI = [1429148842]; + + static final String I = String.fromCharCodes(List.generate( + _envieddataI.length, + (int i) => i, + growable: false, + ).map((int i) => _envieddataI[i] ^ _enviedkeyI[i])); + + static const List _enviedkeyJ = [2734384097]; + + static const List _envieddataJ = [2734384036]; + + static final String J = String.fromCharCodes(List.generate( + _envieddataJ.length, + (int i) => i, + growable: false, + ).map((int i) => _envieddataJ[i] ^ _enviedkeyJ[i])); + + static const List _enviedkeyK = [757165462]; + + static const List _envieddataK = [757165521]; + + static final String K = String.fromCharCodes(List.generate( + _envieddataK.length, + (int i) => i, + growable: false, + ).map((int i) => _envieddataK[i] ^ _enviedkeyK[i])); + + static const List _enviedkeyL = [3146888544]; + + static const List _envieddataL = [3146888498]; + + static final String L = String.fromCharCodes(List.generate( + _envieddataL.length, + (int i) => i, + growable: false, + ).map((int i) => _envieddataL[i] ^ _enviedkeyL[i])); + + static const List _enviedkeyM = [1794207372]; + + static const List _envieddataM = [1794207426]; + + static final String M = String.fromCharCodes(List.generate( + _envieddataM.length, + (int i) => i, + growable: false, + ).map((int i) => _envieddataM[i] ^ _enviedkeyM[i])); + + static const List _enviedkeyN = [429102337]; + + static const List _envieddataN = [429102403]; + + static final String N = String.fromCharCodes(List.generate( + _envieddataN.length, + (int i) => i, + growable: false, + ).map((int i) => _envieddataN[i] ^ _enviedkeyN[i])); + + static const List _enviedkeyO = [2279665789]; + + static const List _envieddataO = [2279665716]; + + static final String O = String.fromCharCodes(List.generate( + _envieddataO.length, + (int i) => i, + growable: false, + ).map((int i) => _envieddataO[i] ^ _enviedkeyO[i])); + + static const List _enviedkeyP = [3642215970]; + + static const List _envieddataP = [3642216052]; + + static final String P = String.fromCharCodes(List.generate( + _envieddataP.length, + (int i) => i, + growable: false, + ).map((int i) => _envieddataP[i] ^ _enviedkeyP[i])); + + static const List _enviedkeyQ = [1682613368]; + + static const List _envieddataQ = [1682613305]; + + static final String Q = String.fromCharCodes(List.generate( + _envieddataQ.length, + (int i) => i, + growable: false, + ).map((int i) => _envieddataQ[i] ^ _enviedkeyQ[i])); + + static const List _enviedkeyR = [1636111286]; + + static const List _envieddataR = [1636111354]; + + static final String R = String.fromCharCodes(List.generate( + _envieddataR.length, + (int i) => i, + growable: false, + ).map((int i) => _envieddataR[i] ^ _enviedkeyR[i])); + + static const List _enviedkeyS = [2459926478]; + + static const List _envieddataS = [2459926420]; + + static final String S = String.fromCharCodes(List.generate( + _envieddataS.length, + (int i) => i, + growable: false, + ).map((int i) => _envieddataS[i] ^ _enviedkeyS[i])); + + static const List _enviedkeyT = [363838866]; + + static const List _envieddataT = [363838929]; + + static final String T = String.fromCharCodes(List.generate( + _envieddataT.length, + (int i) => i, + growable: false, + ).map((int i) => _envieddataT[i] ^ _enviedkeyT[i])); + + static const List _enviedkeyU = [38484038]; + + static const List _envieddataU = [38483982]; + + static final String U = String.fromCharCodes(List.generate( + _envieddataU.length, + (int i) => i, + growable: false, + ).map((int i) => _envieddataU[i] ^ _enviedkeyU[i])); + + static const List _enviedkeyV = [2863470470]; + + static const List _envieddataV = [2863470550]; + + static final String V = String.fromCharCodes(List.generate( + _envieddataV.length, + (int i) => i, + growable: false, + ).map((int i) => _envieddataV[i] ^ _enviedkeyV[i])); + + static const List _enviedkeyW = [2838476573]; + + static const List _envieddataW = [2838476617]; + + static final String W = String.fromCharCodes(List.generate( + _envieddataW.length, + (int i) => i, + growable: false, + ).map((int i) => _envieddataW[i] ^ _enviedkeyW[i])); + + static const List _enviedkeyX = [3057464704]; + + static const List _envieddataX = [3057464772]; + + static final String X = String.fromCharCodes(List.generate( + _envieddataX.length, + (int i) => i, + growable: false, + ).map((int i) => _envieddataX[i] ^ _enviedkeyX[i])); + + static const List _enviedkeyY = [1241320716]; + + static const List _envieddataY = [1241320799]; + + static final String Y = String.fromCharCodes(List.generate( + _envieddataY.length, + (int i) => i, + growable: false, + ).map((int i) => _envieddataY[i] ^ _enviedkeyY[i])); + + static const List _enviedkeyZ = [1255209364]; + + static const List _envieddataZ = [1255209433]; + + static final String Z = String.fromCharCodes(List.generate( + _envieddataZ.length, + (int i) => i, + growable: false, + ).map((int i) => _envieddataZ[i] ^ _enviedkeyZ[i])); + + static const List _enviedkeya = [568085047]; + + static const List _envieddataa = [568085062]; + + static final String a = String.fromCharCodes(List.generate( + _envieddataa.length, + (int i) => i, + growable: false, + ).map((int i) => _envieddataa[i] ^ _enviedkeya[i])); + + static const List _enviedkeyb = [1642026309]; + + static const List _envieddatab = [1642026301]; + + static final String b = String.fromCharCodes(List.generate( + _envieddatab.length, + (int i) => i, + growable: false, + ).map((int i) => _envieddatab[i] ^ _enviedkeyb[i])); + + static const List _enviedkeyc = [2509013684]; + + static const List _envieddatac = [2509013714]; + + static final String c = String.fromCharCodes(List.generate( + _envieddatac.length, + (int i) => i, + growable: false, + ).map((int i) => _envieddatac[i] ^ _enviedkeyc[i])); + + static const List _enviedkeyd = [1008508797]; + + static const List _envieddatad = [1008508676]; + + static final String d = String.fromCharCodes(List.generate( + _envieddatad.length, + (int i) => i, + growable: false, + ).map((int i) => _envieddatad[i] ^ _enviedkeyd[i])); + + static const List _enviedkeye = [1352402714]; + + static const List _envieddatae = [1352402800]; + + static final String e = String.fromCharCodes(List.generate( + _envieddatae.length, + (int i) => i, + growable: false, + ).map((int i) => _envieddatae[i] ^ _enviedkeye[i])); + + static const List _enviedkeyf = [2569205088]; + + static const List _envieddataf = [2569205013]; + + static final String f = String.fromCharCodes(List.generate( + _envieddataf.length, + (int i) => i, + growable: false, + ).map((int i) => _envieddataf[i] ^ _enviedkeyf[i])); + + static const List _enviedkeyg = [2879075999]; + + static const List _envieddatag = [2879076084]; + + static final String g = String.fromCharCodes(List.generate( + _envieddatag.length, + (int i) => i, + growable: false, + ).map((int i) => _envieddatag[i] ^ _enviedkeyg[i])); + + static const List _enviedkeyh = [375583189]; + + static const List _envieddatah = [375583138]; + + static final String h = String.fromCharCodes(List.generate( + _envieddatah.length, + (int i) => i, + growable: false, + ).map((int i) => _envieddatah[i] ^ _enviedkeyh[i])); + + static const List _enviedkeyi = [4210731010]; + + static const List _envieddatai = [4210731117]; + + static final String i = String.fromCharCodes(List.generate( + _envieddatai.length, + (int i) => i, + growable: false, + ).map((int i) => _envieddatai[i] ^ _enviedkeyi[i])); + + static const List _enviedkeyj = [6131337]; + + static const List _envieddataj = [6131436]; + + static final String j = String.fromCharCodes(List.generate( + _envieddataj.length, + (int i) => i, + growable: false, + ).map((int i) => _envieddataj[i] ^ _enviedkeyj[i])); + + static const List _enviedkeyk = [221621693]; + + static const List _envieddatak = [221621722]; + + static final String k = String.fromCharCodes(List.generate( + _envieddatak.length, + (int i) => i, + growable: false, + ).map((int i) => _envieddatak[i] ^ _enviedkeyk[i])); + + static const List _enviedkeyl = [2294132260]; + + static const List _envieddatal = [2294132310]; + + static final String l = String.fromCharCodes(List.generate( + _envieddatal.length, + (int i) => i, + growable: false, + ).map((int i) => _envieddatal[i] ^ _enviedkeyl[i])); + + static const List _enviedkeym = [2608084000]; + + static const List _envieddatam = [2608084046]; + + static final String m = String.fromCharCodes(List.generate( + _envieddatam.length, + (int i) => i, + growable: false, + ).map((int i) => _envieddatam[i] ^ _enviedkeym[i])); + + static const List _enviedkeyn = [2601175985]; + + static const List _envieddatan = [2601176019]; + + static final String n = String.fromCharCodes(List.generate( + _envieddatan.length, + (int i) => i, + growable: false, + ).map((int i) => _envieddatan[i] ^ _enviedkeyn[i])); + + static const List _enviedkeyo = [3909994747]; + + static const List _envieddatao = [3909994642]; + + static final String o = String.fromCharCodes(List.generate( + _envieddatao.length, + (int i) => i, + growable: false, + ).map((int i) => _envieddatao[i] ^ _enviedkeyo[i])); + + static const List _enviedkeyp = [651725330]; + + static const List _envieddatap = [651725412]; + + static final String p = String.fromCharCodes(List.generate( + _envieddatap.length, + (int i) => i, + growable: false, + ).map((int i) => _envieddatap[i] ^ _enviedkeyp[i])); + + static const List _enviedkeyq = [1325950910]; + + static const List _envieddataq = [1325950943]; + + static final String q = String.fromCharCodes(List.generate( + _envieddataq.length, + (int i) => i, + growable: false, + ).map((int i) => _envieddataq[i] ^ _enviedkeyq[i])); + + static const List _enviedkeyr = [3271274506]; + + static const List _envieddatar = [3271274598]; + + static final String r = String.fromCharCodes(List.generate( + _envieddatar.length, + (int i) => i, + growable: false, + ).map((int i) => _envieddatar[i] ^ _enviedkeyr[i])); + + static const List _enviedkeys = [2336036811]; + + static const List _envieddatas = [2336036785]; + + static final String s = String.fromCharCodes(List.generate( + _envieddatas.length, + (int i) => i, + growable: false, + ).map((int i) => _envieddatas[i] ^ _enviedkeys[i])); + + static const List _enviedkeyt = [1383478533]; + + static const List _envieddatat = [1383478630]; + + static final String t = String.fromCharCodes(List.generate( + _envieddatat.length, + (int i) => i, + growable: false, + ).map((int i) => _envieddatat[i] ^ _enviedkeyt[i])); + + static const List _enviedkeyu = [2444286973]; + + static const List _envieddatau = [2444286869]; + + static final String u = String.fromCharCodes(List.generate( + _envieddatau.length, + (int i) => i, + growable: false, + ).map((int i) => _envieddatau[i] ^ _enviedkeyu[i])); + + static const List _enviedkeyv = [1458112617]; + + static const List _envieddatav = [1458112537]; + + static final String v = String.fromCharCodes(List.generate( + _envieddatav.length, + (int i) => i, + growable: false, + ).map((int i) => _envieddatav[i] ^ _enviedkeyv[i])); + + static const List _enviedkeyw = [71924034]; + + static const List _envieddataw = [71924022]; + + static final String w = String.fromCharCodes(List.generate( + _envieddataw.length, + (int i) => i, + growable: false, + ).map((int i) => _envieddataw[i] ^ _enviedkeyw[i])); + + static const List _enviedkeyx = [1359006522]; + + static const List _envieddatax = [1359006558]; + + static final String x = String.fromCharCodes(List.generate( + _envieddatax.length, + (int i) => i, + growable: false, + ).map((int i) => _envieddatax[i] ^ _enviedkeyx[i])); + + static const List _enviedkeyy = [3332150537]; + + static const List _envieddatay = [3332150650]; + + static final String y = String.fromCharCodes(List.generate( + _envieddatay.length, + (int i) => i, + growable: false, + ).map((int i) => _envieddatay[i] ^ _enviedkeyy[i])); + + static const List _enviedkeyz = [1824355608]; + + static const List _envieddataz = [1824355701]; + + static final String z = String.fromCharCodes(List.generate( + _envieddataz.length, + (int i) => i, + growable: false, + ).map((int i) => _envieddataz[i] ^ _enviedkeyz[i])); + + static const List _enviedkeyemailService = [ + 3775596196, + 2947443596, + 2783847140, + 2247685356, + 972079067, + 141322098, + 4019086335, + 1237348697, + 3250824773, + 3850928265, + 4082170899, + 1227740946, + 982988325, + 1647984014, + 3223470789, + 1423577108, + 202587414, + 1418586202, + 2719748979, + 166166698, + 86664357, + 3870217031, + ]; + + static const List _envieddataemailService = [ + 3775596247, + 2947443689, + 2783847042, + 2247685257, + 972079017, + 141321985, + 4019086234, + 1237348651, + 3250824755, + 3850928352, + 4082170992, + 1227741047, + 982988389, + 1647984105, + 3223470760, + 1423577205, + 202587519, + 1418586166, + 2719748957, + 166166729, + 86664394, + 3870217002, + ]; + + static final String emailService = String.fromCharCodes(List.generate( + _envieddataemailService.length, + (int i) => i, + growable: false, + ).map((int i) => _envieddataemailService[i] ^ _enviedkeyemailService[i])); + + static const List _enviedkeykeyOfApp = [ + 2023410308, + 757112951, + 1537122277, + 668521675, + 1384900157, + 1069054411, + 1160080514, + 1218153233, + 2914773850, + 2034327881, + 2324138750, + 2321692888, + 3624635087, + 1533165910, + 4023632749, + 2534181527, + 241083972, + 1149945117, + 4121376070, + 2975459637, + 2695352352, + 2957292566, + 3706548337, + 756631617, + 2608661645, + 1703794510, + 2209741081, + 1087161357, + 137999115, + 4041442026, + 2564469806, + 1668093012, + 365507902, + 1161868895, + 4250793820, + 2906820781, + 4024524669, + 3088096180, + ]; + + static const List _envieddatakeyOfApp = [ + 2023410406, + 757112854, + 1537122185, + 668521656, + 1384900184, + 1069054397, + 1160080578, + 1218153254, + 2914773868, + 2034327920, + 2324138696, + 2321692844, + 3624635054, + 1533165876, + 4023632643, + 2534181622, + 241083941, + 1149945191, + 4121376035, + 2975459654, + 2695352397, + 2957292659, + 3706548249, + 756631588, + 2608661759, + 1703794475, + 2209741182, + 1087161463, + 137999227, + 4041441932, + 2564469828, + 1668092987, + 365507942, + 1161868845, + 4250793732, + 2906820831, + 4024524607, + 3088096198, + ]; + + static final String keyOfApp = String.fromCharCodes(List.generate( + _envieddatakeyOfApp.length, + (int i) => i, + growable: false, + ).map((int i) => _envieddatakeyOfApp[i] ^ _enviedkeykeyOfApp[i])); + + static const List _enviedkeyinitializationVector = [ + 1863003107, + 2204174216, + 327868560, + 2737928160, + 3801385149, + 1059481659, + 503276973, + 1884809156, + 1130110591, + 1537276675, + 782730225, + 683683819, + 158991753, + 2666883667, + 2093242061, + 1415878199, + 2125531306, + 1655743922, + 3305664976, + 2536898978, + 929195412, + 2402803151, + ]; + + static const List _envieddatainitializationVector = [ + 1863003026, + 2204174320, + 327868662, + 2737928089, + 3801385175, + 1059481678, + 503276998, + 1884809139, + 1130110480, + 1537276774, + 782730134, + 683683737, + 158991847, + 2666883633, + 2093242020, + 1415878209, + 2125531378, + 1655743936, + 3305664904, + 2536899024, + 929195478, + 2402803133, + ]; + + static final String initializationVector = String.fromCharCodes( + List.generate( + _envieddatainitializationVector.length, + (int i) => i, + growable: false, + ).map((int i) => + _envieddatainitializationVector[i] ^ + _enviedkeyinitializationVector[i])); +} diff --git a/siro_service/lib/firebase_options.dart b/siro_service/lib/firebase_options.dart new file mode 100644 index 0000000..cc059ab --- /dev/null +++ b/siro_service/lib/firebase_options.dart @@ -0,0 +1,67 @@ +// File generated by FlutterFire CLI. +// ignore_for_file: type=lint +import 'package:firebase_core/firebase_core.dart' show FirebaseOptions; +import 'package:flutter/foundation.dart' + show defaultTargetPlatform, kIsWeb, TargetPlatform; + +/// Default [FirebaseOptions] for use with your Firebase apps. +/// +/// Example: +/// ```dart +/// import 'firebase_options.dart'; +/// // ... +/// await Firebase.initializeApp( +/// options: DefaultFirebaseOptions.currentPlatform, +/// ); +/// ``` +class DefaultFirebaseOptions { + static FirebaseOptions get currentPlatform { + if (kIsWeb) { + throw UnsupportedError( + 'DefaultFirebaseOptions have not been configured for web - ' + 'you can reconfigure this by running the FlutterFire CLI again.', + ); + } + switch (defaultTargetPlatform) { + case TargetPlatform.android: + return android; + case TargetPlatform.iOS: + return ios; + case TargetPlatform.macOS: + throw UnsupportedError( + 'DefaultFirebaseOptions have not been configured for macos - ' + 'you can reconfigure this by running the FlutterFire CLI again.', + ); + case TargetPlatform.windows: + throw UnsupportedError( + 'DefaultFirebaseOptions have not been configured for windows - ' + 'you can reconfigure this by running the FlutterFire CLI again.', + ); + case TargetPlatform.linux: + throw UnsupportedError( + 'DefaultFirebaseOptions have not been configured for linux - ' + 'you can reconfigure this by running the FlutterFire CLI again.', + ); + default: + throw UnsupportedError( + 'DefaultFirebaseOptions are not supported for this platform.', + ); + } + } + + static const FirebaseOptions android = FirebaseOptions( + apiKey: 'AIzaSyAEoply_UcEP6KaCu_ziCy_ZDIjAKvi7b8', + appId: '1:825988584191:android:be08180beef7d65e1632ca', + messagingSenderId: '825988584191', + projectId: 'siro-a6957', + storageBucket: 'siro-a6957.firebasestorage.app', + ); + static const FirebaseOptions ios = FirebaseOptions( + apiKey: 'AIzaSyDk6x6KZUY0IQtxoCMXX0F7N_yik8O19eA', + appId: '1:825988584191:ios:9d50158dc7a09e851632ca', + messagingSenderId: '825988584191', + projectId: 'siro-a6957', + storageBucket: 'siro-a6957.firebasestorage.app', + iosBundleId: 'com.siro.service', + ); +} diff --git a/siro_service/lib/login_page.dart b/siro_service/lib/login_page.dart new file mode 100644 index 0000000..67cfda7 --- /dev/null +++ b/siro_service/lib/login_page.dart @@ -0,0 +1,172 @@ +import 'package:flutter/cupertino.dart'; +import 'package:flutter/material.dart'; +import 'package:get/get.dart'; +import 'package:siro_service/constant/colors.dart'; +import 'package:siro_service/views/auth/register_page.dart'; +import 'package:siro_service/views/widgets/my_textField.dart'; +import 'controller/login_controller.dart'; + +class LoginPage extends StatelessWidget { + const LoginPage({super.key}); + + @override + Widget build(BuildContext context) { + final LoginController controller = Get.put(LoginController()); + + return Scaffold( + backgroundColor: Colors.white, + body: Stack( + children: [ + // Background Gradient Element + Positioned( + top: -100, + right: -100, + child: Container( + width: 300, + height: 300, + decoration: BoxDecoration( + shape: BoxShape.circle, + gradient: LinearGradient( + colors: [AppColor.blueColor.withOpacity(0.2), Colors.transparent], + begin: Alignment.topRight, + end: Alignment.bottomLeft, + ), + ), + ), + ), + + SafeArea( + child: SingleChildScrollView( + padding: const EdgeInsets.symmetric(horizontal: 30.0), + child: Form( + key: controller.formKey, + child: Column( + crossAxisAlignment: CrossAxisAlignment.stretch, + children: [ + const SizedBox(height: 80), + // App Logo or Icon + const Center( + child: Icon( + Icons.support_agent_rounded, + size: 100, + color: AppColor.blueColor, + ), + ), + const SizedBox(height: 24), + const Center( + child: Text( + 'انطلق سيرفس', + style: TextStyle( + fontSize: 28, + fontWeight: FontWeight.bold, + color: Colors.black87, + letterSpacing: 1.2, + ), + ), + ), + const Center( + child: Text( + 'نظام خدمة العملاء المتكامل', + style: TextStyle( + fontSize: 16, + color: Colors.grey, + ), + ), + ), + const SizedBox(height: 60), + + // Fields with modern styling + const Text( + 'تسجيل الدخول', + style: TextStyle( + fontSize: 20, + fontWeight: FontWeight.w600, + color: Colors.black87, + ), + ), + const SizedBox(height: 20), + + MyTextForm( + controller: controller.email, + label: 'البريد الإلكتروني', + hint: 'أدخل البريد الإلكتروني', + type: TextInputType.emailAddress, + ), + const SizedBox(height: 20), + + MyTextForm( + controller: controller.password, + label: 'كلمة المرور', + hint: 'أدخل كلمة المرور', + type: TextInputType.visiblePassword, + ), + + const SizedBox(height: 40), + + // Login Button + Container( + height: 55, + decoration: BoxDecoration( + borderRadius: BorderRadius.circular(16), + gradient: const LinearGradient( + colors: [AppColor.blueColor, Color(0xFF1A237E)], + ), + boxShadow: [ + BoxShadow( + color: AppColor.blueColor.withOpacity(0.3), + blurRadius: 12, + offset: const Offset(0, 6), + ), + ], + ), + child: Material( + color: Colors.transparent, + child: InkWell( + borderRadius: BorderRadius.circular(16), + onTap: () => controller.login(), + child: const Center( + child: Text( + 'دخول', + style: TextStyle( + color: Colors.white, + fontSize: 18, + fontWeight: FontWeight.bold, + ), + ), + ), + ), + ), + ), + + const SizedBox(height: 30), + + // Register Link + Row( + mainAxisAlignment: MainAxisAlignment.center, + children: [ + const Text( + 'ليس لديك حساب موظف؟ ', + style: TextStyle(color: Colors.grey), + ), + TextButton( + onPressed: () => Get.to(() => const RegisterPage()), + child: const Text( + 'إنشاء حساب جديد', + style: TextStyle( + color: AppColor.blueColor, + fontWeight: FontWeight.bold, + ), + ), + ), + ], + ), + ], + ), + ), + ), + ), + ], + ), + ); + } +} diff --git a/siro_service/lib/main.dart b/siro_service/lib/main.dart new file mode 100644 index 0000000..3ae3416 --- /dev/null +++ b/siro_service/lib/main.dart @@ -0,0 +1,49 @@ +import 'package:firebase_core/firebase_core.dart'; +import 'package:flutter/material.dart'; +import 'package:flutter_secure_storage/flutter_secure_storage.dart'; +import 'package:get/get.dart'; +import 'package:get_storage/get_storage.dart'; +import 'package:siro_service/controller/firbase_messge.dart'; +import 'package:siro_service/firebase_options.dart'; + +import 'controller/functions/encrypt_decrypt.dart'; +import 'controller/local/local_controller.dart'; +import 'controller/local/translations.dart'; +import 'login_page.dart'; + +final box = GetStorage(); +const storage = FlutterSecureStorage(); + +void main() async { + WidgetsFlutterBinding.ensureInitialized(); + await GetStorage.init(); + + await EncryptionHelper.initialize(); + + if (Firebase.apps.isEmpty) { + await Firebase.initializeApp( + options: DefaultFirebaseOptions.currentPlatform); + } else { + Firebase.app(); + } + Get.put(FirebaseMessagesController()).getToken(); + runApp(MyApp()); +} + +class MyApp extends StatelessWidget { + MyApp({super.key}); + LocaleController localController = Get.put(LocaleController()); + + @override + Widget build(BuildContext context) { + return GetMaterialApp( + title: 'Inatleq Service'.tr, + debugShowCheckedModeBanner: false, + translations: MyTranslation(), + locale: localController.language, + theme: localController.appTheme, + key: UniqueKey(), + home: LoginPage(), + ); + } +} diff --git a/siro_service/lib/models/cloudpanel.md b/siro_service/lib/models/cloudpanel.md new file mode 100644 index 0000000..23a4a07 --- /dev/null +++ b/siro_service/lib/models/cloudpanel.md @@ -0,0 +1,115 @@ +## Site + +IP Address: 92.113.25.174 +Domain Name: https://sefer.click +Site User: sefer +Password: katm5g2LLY55a7SJcnxK + +## Database + +Host: 127.0.0.1 +Port: 3306 +Database Name: sefer +Database User Name: sefer +Database User Password: la7CdYFwa9uxwnozk7ok + +## WordPress + +Admin E-Mail: admin@sefer.click +Admin User Name: admin +Admin Password: F12WeBpJLY4z1qHsFqMt +Admin Url: https://sefer.click/wp-admin/ + +ssh password is malDEV@2101mehmet + +giza hostinger kvm2 pass gizaDEV@2101 + +contabo cloud panel new +Site + +--- + +IP Address: 100.42.191.131 +Domain Name: https://seferalexandria.site +Site User: seferalexandria +Password: x91LgGr2Q8IervoVgcgc + +## Database + +Host: 127.0.0.1 +Port: 3306 +Database Name: seferalexandria +Database User Name: seferalexandria +Database User Password: 812UvStGfCfNLMCsRR9a + +## WordPress + +Admin E-Mail: admin@seferalexandria.site +Admin User Name: admin +Admin Password: N9gv90TdnoOdjVch5V3J +Admin Url: https://seferalexandria.site/wp-admin/ + +##### alexandria + +86IU5xU2HSiNNSAU5cwF username db ==>> alexandriadbUsername vps 2 100.42.191.131 + +- JCndq5xXLnoYOTuRqnZA for ssh alexandria ssh user + +seferalexandria userAdmin cloudPanel 49prvH5MGGupjWrDPLGm + +# cloudpanel username is sefercairo and pass is malDEV@2101 + +##### + +oMnEK3IbvCbQ5G5FfK9W username db ==>> seferdbUsername vps 3 185.209.230.169 # db name is sefercairodb + +H6JIiEOpyDVoMBBi5cCH sefercairoadmin + +Q6MikBy4ktZn9zumyPli sefercairo ssh user 85.209.230.169 + +# cloudpanel username is sefercairo and pass is malDEV@2101 + +##### wallet + +qG6Bn1P9IRvwk0tLW85v username db ==>> walletdbUsername vps 2 156.67.82.188 # db name is seferPaymentDB + +- JCndq5xXLnoYOTuRqnZA for ssh wallet ssh user + +seferwallet userAdmin cloudPanel 49prvH5MGGupjWrDPLGm + +# cloudpanel username is seferpayment and pass is dKsmZkbdWP9hj13qjNiY and seferpayment@sefer.live + +##### + +##### giza + +TE6VUrMcjnIsipqP9yQj username db ==>> gizaUsername vps 1 31.220.94.107 db name is sefergizaDB + +- rylDg624ifiDXsWmaMST for ssh sefergizacp ssh user + +# cloudpanel username is sefergiza and pass is 4O2IUSbwZxVnMJYaRTog gizasefer.online + +#### + +#AaPOFHEwHVyXG6AgZ7i password test kvm1 + +4zB9qoYfxCn7uHx7i5cgUl7JR password contabo vps 3 alexandria +SLqWj2QTD66Gr password contabo vps 1 payment +uREd8QKKzpHXGL25UVi3quK password contabo vps 2 cairo sefer.click user cloud panel is +uREd8QKKzpHXGL25UVi3quK password contabo vps 1 payment seferpw.website user cloud panel is seferpayment +C3vGlIV7VM0priWXgdzc password contabo vps 2 giza seferpw.website user cloud panel is seferpayment + +================================================================== +Congratulations! Installed successfully! +================================================================== +webmin Internal Address: https://31.220.94.106:10000/ +username: seferpayment +password: d7b064c3 +Warning: +If you cannot access the panel, +release the following port (32368|888|80|443|20|21) in the security group + +Database user profile +User: +Password: 38d7a66a0e435 +================================================================== diff --git a/siro_service/lib/models/sql b/siro_service/lib/models/sql new file mode 100644 index 0000000..6b139f7 --- /dev/null +++ b/siro_service/lib/models/sql @@ -0,0 +1,208 @@ +-- to check duplicate CarRegistration +SELECT + `driverID`, + COUNT(*) AS `count`,created_at +FROM + `CarRegistration` +GROUP BY + `driverID` +HAVING + COUNT(*) > 1; +-- + + +-- to delete duplicate +WITH CTE AS ( + SELECT + MIN(`id`) AS `min_id` + FROM + `CarRegistration` + GROUP BY + `driverID` +) +DELETE FROM + `CarRegistration` +WHERE + `id` NOT IN (SELECT `min_id` FROM CTE); + +-- get for employee +SELECT + d.`maritalStatus` AS NAME, + COUNT(*) AS `count` +FROM + `driver` d +WHERE + d.`maritalStatus` IN('Maryam', 'rawda', 'Mena') AND DATE(d.created_at) = CURDATE() +GROUP BY + d.`maritalStatus` +ORDER BY + COUNT +DESC + + + -- get driver without cars + + SELECT + d.id, d.phone +FROM + `driver` d +WHERE + d.id NOT IN (SELECT driverID FROM CarRegistration); + + + -- car without drivers + + SELECT + cr.created_at, cr.driverID +FROM + `CarRegistration` cr +WHERE + cr.driverID NOT IN (SELECT id FROM driver); + + + +----- driver + SELECT phone,email,name_arabic,national_number FROM `driver` WHERE national_number ='29209290106392' +ORDER BY `driver`.`created_at` DESC + + + +------- driver work + +SELECT + COUNT(`car_locations`.driver_id), + driver.id, + driver.phone, + driver.name_arabic +FROM + `car_locations` +LEFT JOIN driver ON driver.id = car_locations.driver_id +WHERE + `car_locations`. created_at > TIMESTAMP( + DATE_SUB(NOW(), INTERVAL 10 MINUTE)) + GROUP BY + driver_id + ORDER BY + COUNT(driver_id) + DESC + ; + + +------ get count of year cars +SELECT + CASE + WHEN `year` > 2017 THEN 'After 2017' + WHEN `year` BETWEEN 2000 AND 2016 THEN '2000-2016' + ELSE 'Before 2000' + END AS `year_group`, + COUNT(*) AS `count` +FROM `carPlateEdit` +GROUP BY `year_group` +ORDER BY `year_group` ASC; + + + +-- delete location 1 day + +DELETE +FROM + `car_locations` +WHERE + DATE(`created_at`) < CURDATE(); +SELECT + COUNT(`car_locations`.driver_id), + driver.id, + driver.phone, + driver.name_arabic +FROM + `car_locations` +LEFT JOIN driver ON driver.id = car_locations.driver_id +WHERE + `car_locations`.created_at > TIMESTAMP( + DATE_SUB(NOW(), INTERVAL 10 MINUTE)) + GROUP BY + driver_id + ORDER BY + COUNT(driver_id) + DESC + ; + + +-- driver register by hours for employee +SELECT + d.`maritalStatus` AS NAME, + HOUR(d.created_at) AS hour, + COUNT(*) AS `count` +FROM + `driver` d +WHERE + d.`maritalStatus` IN ('Maryam', 'rawda', 'Mena') + AND DATE(d.created_at) = CURDATE() +GROUP BY + d.`maritalStatus`, HOUR(d.created_at) +ORDER BY + hour, `count` DESC; + + + + + +---- monthly +SELECT + MONTH(d.created_at) AS month, + COUNT(d.id) AS `count` +FROM + `driver` d +WHERE + YEAR(d.created_at) = YEAR(CURDATE()) +GROUP BY + MONTH(d.created_at) +ORDER BY + month, + `count` +DESC + ; + -----AI request + + + SELECT + f.id, + f.passengerId, + f.feedBack, + f.datecreated, + r.id AS ride_id, + r.start_location, + r.end_location, + r.date, + r.price, + r.status, + r.paymentMethod, + r.distance, + r.carType, + r.rideTimeFinish, + r.rideTimeStart, + r.DriverIsGoingToPassenger, + COUNT(rp.id) AS countRateFromPassengerToDrivers, + COUNT(rd.id) AS countRateFromDriverToPassengers, + MAX(rp.rating) AS rateFromPassengerToDriver, + MAX(rd.rating) AS rateFromDriversToPassengers, + MAX(rp.comment) AS commentFromPassengerToDriver, + MAX(rd.comment) AS commentFromDriverToPassenger +FROM + `feedBack` f +LEFT JOIN ride r ON + r.passenger_id = f.passengerId +LEFT JOIN ratingPassenger rp ON + rp.passenger_id = r.passenger_id +LEFT JOIN ratingDriver rd ON + rd.driver_id = r.driver_id +WHERE + r.passenger_id = '113172279072358305645' +GROUP BY + f.id, f.passengerId, f.feedBack, f.datecreated, + r.id, r.start_location, r.end_location, r.date, r.price, + r.status, r.paymentMethod, r.distance, r.carType, + r.rideTimeFinish, r.rideTimeStart, r.DriverIsGoingToPassenger +ORDER BY + r.date DESC +LIMIT 1; \ No newline at end of file diff --git a/siro_service/lib/models/vshost.md b/siro_service/lib/models/vshost.md new file mode 100644 index 0000000..bfe6a36 --- /dev/null +++ b/siro_service/lib/models/vshost.md @@ -0,0 +1,99 @@ +server { +listen 80; +listen [::]:80; +listen 443 ssl http2; +listen [::]:443 ssl http2; +{{ssl_certificate_key}} +{{ssl_certificate}} +server_name www.sefer.click; +return 301 https://sefer.click$request_uri; +} +server { +listen 80; +listen [::]:80; +listen 443 ssl http2; +listen [::]:443 ssl http2; +{{ssl_certificate_key}} +{{ssl_certificate}} +server_name sefer.click www1.sefer.click; +{{root}} +{{nginx_access_log}} +{{nginx_error_log}} + +# Set the maximum request body size + +client_max_body_size 10m; +if ($scheme != "https") { + rewrite ^ https://$host$uri permanent; +} +location ~ /.well-known { +auth_basic off; +allow all; +} + +# Security headers + +add_header Strict-Transport-Security "max-age=31536000; includeSubDomains" always; +add_header Content-Security-Policy "default-src 'self'; script-src 'self' 'unsafe-inline';" always; +add_header Referrer-Policy "no-referrer-when-downgrade" always; +add_header Permissions-Policy "geolocation=(), microphone=()" always; +add_header X-Frame-Options "SAMEORIGIN" always; +add_header X-Content-Type-Options "nosniff" always; + +{{settings}} +location / { +{{varnish_proxy_pass}} +proxy_set_header Host $http_host; + proxy_set_header X-Forwarded-Host $http_host; + proxy_set_header X-Real-IP $remote_addr; + proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; + proxy_hide_header X-Varnish; + proxy_redirect off; + proxy_max_temp_file_size 0; + proxy_connect_timeout 720; + proxy_send_timeout 720; + proxy_read_timeout 720; + proxy_buffer_size 128k; + proxy_buffers 4 256k; + proxy_busy_buffers_size 256k; + proxy_temp_file_write_size 256k; + } + location ~* ^.+\.(css|js|jpg|jpeg|gif|png|ico|gz|svg|svgz|ttf|otf|woff|woff2|eot|mp4|ogg|ogv|webm|webp|zip|swf|map|mjs)$ { +add_header Access-Control-Allow-Origin "\*"; +expires max; +access_log off; +} +location ~ /\.(ht|svn|git) { +deny all; +} +if (-f $request_filename) { + break; + } +} +server { + listen 8080; + listen [::]:8080; + server_name sefer.click www1.sefer.click; + {{root}} + try_files $uri $uri/ /index.php?$args; +index index.php index.html; +location ~ \.php$ { +include fastcgi_params; +fastcgi_intercept_errors on; +fastcgi_index index.php; +fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name; +try_files $uri =404; +fastcgi_read_timeout 3600; +fastcgi_send_timeout 3600; +proxy_read_timeout 3600; +proxy_send_timeout 3600; +fastcgi_param HTTPS "on"; +fastcgi_param SERVER_PORT 443; +fastcgi_pass 127.0.0.1:{{php_fpm_port}}; +fastcgi_param PHP_VALUE "{{php_settings}}"; +} +if (-f $request_filename) { +break; +} +} +//above for cairo server diff --git a/siro_service/lib/print.dart b/siro_service/lib/print.dart new file mode 100644 index 0000000..ccc2fb5 --- /dev/null +++ b/siro_service/lib/print.dart @@ -0,0 +1,13 @@ +import 'dart:developer' as developer; + +class Log { + Log._(); + + static void print(String value, {StackTrace? stackTrace}) { + developer.log(value, name: 'LOG', stackTrace: stackTrace); + } + + static Object? inspect(Object? object) { + return developer.inspect(object); + } +} diff --git a/siro_service/lib/translations_ar.json b/siro_service/lib/translations_ar.json new file mode 100644 index 0000000..909a1dc --- /dev/null +++ b/siro_service/lib/translations_ar.json @@ -0,0 +1,222 @@ +{ + "Insert Name of Driver": "", + "raw gray": "", + "Expiration Date": "", + "Insert site of Driver": "", + "Insert Name of Owner": "", + "Insert car_type of Driver": "", + "car_license_front": "", + "Alexandria": "", + "navy": "", + "Displacement": "", + "Insert birth_date of Driver": "", + "Criminal Record": "", + "Model": "", + "License Type": "", + "Birthdate": "", + "Notes": "", + "s License": "", + "Complaints": "", + "Full Name": "", + "Next": "", + "Full Name (Marital)": "", + "Non Egypt": "", + "Giza": "", + ";\n static const String stripePublishableKey = ": "", + "magenta": "", + "An error occurred while saving driver data": "", + "Email": "", + "My documents have expired": "", + "Vehicle Information": "", + "Education": "", + "Capture an Image of Your ID Document Back": "", + "Personal Information": "", + "Vehicle Details Front": "", + "Tax Expiry Date": "", + "Insert site of Owner": "", + "ID Documents Back": "", + "settings": "", + "car_license_back": "", + "OK": "", + "Price": "", + "Country": "", + "orange": "", + "pink": "", + "DOB": "", + "Insert license type of Driver": "", + "Card ID": "", + "inspection\",\n \"Capture an Image of Your car license back\":\n \"Capturez une image de votre permis de voiture\",\n \"Capture an Image of Your Driver’s License\":\n \"Capturez une image de votre permis de conduire\",\n \"Sign in with Google for easier email and name entry\":\n \"Connectez-vous avec Google pour faciliter la saisie de votre adresse e-mail et de votre nom\",\n \"You will choose allow all the time to be ready receive orders\":\n \"Vous choisirez de permettre à tout moment d": "", + "are you sure to pay to this driver gift": "", + "gold": "", + ">Arabic (Egypt)\n \n \n Arabic (Egypt)\n \n \n Get.back(), + ), + title: Text( + 'إنشاء حساب موظف'.tr, + style: const TextStyle(color: Colors.black87, fontWeight: FontWeight.bold), + ), + centerTitle: true, + ), + body: SafeArea( + child: SingleChildScrollView( + padding: const EdgeInsets.symmetric(horizontal: 24.0, vertical: 16.0), + child: Form( + key: controller.formKey, + child: Column( + crossAxisAlignment: CrossAxisAlignment.stretch, + children: [ + const Center( + child: Icon( + Icons.person_add_rounded, + size: 80, + color: AppColor.blueColor, + ), + ), + const SizedBox(height: 32), + + _buildFieldTitle('الاسم الأول'), + MyTextForm( + controller: controller.firstName, + label: 'الاسم الأول', + hint: 'أدخل الاسم الأول', + type: TextInputType.name, + ), + const SizedBox(height: 16), + + _buildFieldTitle('الاسم الأخير'), + MyTextForm( + controller: controller.lastName, + label: 'الاسم الأخير', + hint: 'أدخل الاسم الأخير', + type: TextInputType.name, + ), + const SizedBox(height: 16), + + _buildFieldTitle('البريد الإلكتروني'), + MyTextForm( + controller: controller.email, + label: 'البريد الإلكتروني', + hint: 'example@mail.com', + type: TextInputType.emailAddress, + ), + const SizedBox(height: 16), + + _buildFieldTitle('رقم الهاتف'), + MyTextForm( + controller: controller.phone, + label: 'رقم الهاتف', + hint: '09xxxxxxxx', + type: TextInputType.phone, + ), + const SizedBox(height: 16), + + _buildFieldTitle('كلمة المرور'), + MyTextForm( + controller: controller.password, + label: 'كلمة المرور', + hint: '********', + type: TextInputType.visiblePassword, + ), + const SizedBox(height: 40), + + Obx(() => controller.isLoading.value + ? const Center(child: CircularProgressIndicator()) + : Container( + height: 55, + decoration: BoxDecoration( + borderRadius: BorderRadius.circular(16), + gradient: const LinearGradient( + colors: [AppColor.blueColor, Color(0xFF1A237E)], + begin: Alignment.centerLeft, + end: Alignment.centerRight, + ), + boxShadow: [ + BoxShadow( + color: AppColor.blueColor.withOpacity(0.3), + blurRadius: 12, + offset: const Offset(0, 6), + ), + ], + ), + child: Material( + color: Colors.transparent, + child: InkWell( + borderRadius: BorderRadius.circular(16), + onTap: () => controller.register(), + child: const Center( + child: Text( + 'تقديم طلب تسجيل', + style: TextStyle( + color: Colors.white, + fontSize: 18, + fontWeight: FontWeight.bold, + ), + ), + ), + ), + ), + )), + + const SizedBox(height: 24), + Row( + mainAxisAlignment: MainAxisAlignment.center, + children: [ + Text( + 'لديك حساب بالفعل؟ '.tr, + style: const TextStyle(color: Colors.grey), + ), + TextButton( + onPressed: () => Get.back(), + child: const Text( + 'تسجيل الدخول', + style: TextStyle( + color: AppColor.blueColor, + fontWeight: FontWeight.bold, + ), + ), + ), + ], + ), + const SizedBox(height: 20), + ], + ), + ), + ), + ), + ); + } + + Widget _buildFieldTitle(String title) { + return Padding( + padding: const EdgeInsets.only(bottom: 8.0, right: 4.0), + child: Text( + title, + style: const TextStyle( + fontSize: 14, + fontWeight: FontWeight.w600, + color: Colors.black54, + ), + ), + ); + } +} diff --git a/siro_service/lib/views/home/main.dart b/siro_service/lib/views/home/main.dart new file mode 100644 index 0000000..0074a81 --- /dev/null +++ b/siro_service/lib/views/home/main.dart @@ -0,0 +1,635 @@ +import 'package:flutter/material.dart'; +import 'package:get/get.dart'; +import 'package:siro_service/constant/colors.dart'; +import 'package:siro_service/constant/links.dart'; +import 'package:siro_service/controller/functions/crud.dart'; +import 'package:siro_service/controller/mainController/main_controller.dart'; +import 'package:siro_service/controller/mainController/pages/best_driver_page.dart'; +import 'package:siro_service/controller/mainController/pages/complaint.dart'; +import 'package:siro_service/controller/mainController/pages/edit_car_plate.dart'; +import 'package:siro_service/controller/mainController/pages/passengers_cant_regster.dart'; +import 'package:siro_service/views/widgets/elevated_btn.dart'; +import 'package:siro_service/views/widgets/my_dialog.dart'; +import 'package:siro_service/views/widgets/my_textField.dart'; + +import '../../constant/style.dart'; +import '../../controller/mainController/pages/add_car.dart'; +import '../../controller/mainController/pages/drivers_cant_register.dart'; +import '../../controller/mainController/pages/new_driver.dart'; +import '../../controller/mainController/pages/welcome_call.dart'; +import '../../main.dart'; +import '../widgets/my_scafold.dart'; + +class Main extends StatelessWidget { + Main({super.key}); + + final MainController mainController = Get.put(MainController()); + + @override + Widget build(BuildContext context) { + return MyScaffold(title: 'Intaleq Service'.tr, isleading: false, body: [ + Container( + color: AppColor.surfaceColor, + child: SingleChildScrollView( + physics: const BouncingScrollPhysics(), + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + // --- Header Section --- + _buildHeader(), + + // --- Statistics Section --- + _buildStatsSection(), + + // --- Actions Section --- + _buildCategoryTitle('🔍 Search & Inquiries'.tr), + _buildGridSection([ + ServiceItem( + title: 'passenger details by phone'.tr, + icon: Icons.person_search_rounded, + color: Colors.blue, + onTap: () => _showSearchDialog( + title: 'insert passenger phone'.tr, + controller: mainController.passengerPhoneController, + onSearch: () => mainController.searchPassengerByPhone(), + ), + ), + ServiceItem( + title: 'Driver details by phone'.tr, + icon: Icons.contact_phone_rounded, + color: Colors.indigo, + onTap: () => _showSearchDialog( + title: 'insert Driver phone'.tr, + controller: mainController.driverPhoneController, + onSearch: () => mainController.searchDriverByPhone(), + ), + ), + ServiceItem( + title: 'Driver details by national number'.tr, + icon: Icons.badge_rounded, + color: Colors.teal, + onTap: () => _showSearchDialog( + title: 'insert Driver national'.tr, + controller: mainController.driverPhoneController, + type: TextInputType.number, + onSearch: () => mainController.searchDriverByNational(), + ), + ), + ]), + + _buildCategoryTitle('⏳ Approval Queue'.tr), + _buildGridSection([ + ServiceItem( + title: 'Drivers waitting Register'.tr, + icon: Icons.pending_actions_rounded, + color: Colors.orange, + onTap: () async { + await mainController.getDriverWantCompleteRegistration(); + Get.to(() => DriversCantRegister()); + }, + ), + ServiceItem( + title: 'Drivers phones not register'.tr, + icon: Icons.phone_disabled_rounded, + color: Colors.blueGrey, + onTap: () async { + await mainController.getDriversPhoneNotComplete(); + Get.to(() => DriversCantRegister()); + }, + ), + ServiceItem( + title: 'Drivers Activity'.tr, + icon: Icons.assessment_rounded, + color: Colors.blueAccent, + onTap: () async { + await mainController.getDriversPhoneNotComplete(); + Get.to(() => DriversCantRegister()); + }, + ), + ServiceItem( + title: 'Drivers Cant Register'.tr, + icon: Icons.car_crash_rounded, + color: Colors.redAccent, + onTap: () async { + await mainController.getDriverNotCompleteRegistration(); + Get.to(() => DriversCantRegister()); + }, + ), + ServiceItem( + title: 'Passengers Cant Register'.tr, + icon: Icons.group_off_rounded, + color: Colors.deepOrange, + onTap: () async { + await mainController.getPassengerNotCompleteRegistration(); + Get.to(() => PassengersCantRegister()); + }, + ), + ]), + + _buildCategoryTitle('⚡ Quick Actions'.tr), + _buildGridSection([ + ServiceItem( + title: 'Register new driver'.tr, + icon: Icons.person_add_rounded, + color: Colors.green, + onTap: () => Get.to(() => RegisterCaptain()), + ), + ServiceItem( + title: 'Add Driver Who Wants to Work'.tr, + icon: Icons.handshake_rounded, + color: Colors.lightGreen, + onTap: () => _showAddDriverDialog(), + ), + ServiceItem( + title: 'Add Car Who Wants to Work'.tr, + icon: Icons.add_road_rounded, + color: Colors.cyan, + onTap: () => _showAddCarDialog(), + ), + ]), + + _buildCategoryTitle('🚗 Vehicle Management'.tr), + _buildGridSection([ + ServiceItem( + title: 'Add car'.tr, + icon: Icons.add_circle_outline_rounded, + color: Colors.purple, + onTap: () async { + await mainController.getdriverWithoutCar(); + if (mainController.driverWithoutCar.isNotEmpty) { + Get.to(() => const AddCar()); + } + }, + ), + ServiceItem( + title: 'Edit car plate'.tr, + icon: Icons.edit_attributes_rounded, + color: Colors.amber, + onTap: () async { + await mainController.getCarPlateNotEdit(); + if (mainController.carPlateNotEdit.isNotEmpty) { + Get.to(() => const EditCarPlate()); + } + }, + ), + ]), + + _buildCategoryTitle('📊 Reporting & Quality'.tr), + _buildGridSection([ + ServiceItem( + title: "View complaint".tr, + icon: Icons.report_problem_rounded, + color: Colors.deepOrange, + onTap: () => Get.to(() => const Complaint()), + ), + ServiceItem( + title: "Welcome call".tr, + icon: Icons.ring_volume_rounded, + color: Colors.pink, + onTap: () async { + await mainController.getNewDriverRegister(); + Get.to(() => const WelcomeCall()); + }, + ), + ServiceItem( + title: "best driver".tr, + icon: Icons.emoji_events_rounded, + color: Colors.orangeAccent, + onTap: () async { + await mainController.getNewDriverRegister(); + Get.to(() => DriverTheBest()); + }, + ), + ]), + + const SizedBox(height: 32), + ], + ), + ), + ), + ]); + } + + Widget _buildHeader() { + return Container( + padding: const EdgeInsets.all(24), + decoration: const BoxDecoration( + color: AppColor.primaryColor, + borderRadius: BorderRadius.only( + bottomLeft: Radius.circular(32), + bottomRight: Radius.circular(32), + ), + ), + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + const SizedBox(height: 10), + Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Text( + 'Welcome back,'.tr, + style: AppStyle.title.copyWith(color: Colors.white70), + ), + Text( + 'Service Agent'.tr, + style: AppStyle.headTitle2.copyWith(color: Colors.white), + ), + ], + ), + Row( + children: [ + IconButton( + icon: + const Icon(Icons.refresh_rounded, color: Colors.white), + onPressed: () => mainController.refreshDashboardStats(), + ), + const SizedBox(width: 8), + CircleAvatar( + radius: 24, + backgroundColor: Colors.white24, + child: IconButton( + icon: const Icon(Icons.logout, color: Colors.white), + onPressed: () { + box.erase(); + Get.offAllNamed('/login'); + }, + ), + ), + ], + ), + ], + ), + const SizedBox(height: 24), + // --- Custom Search Bar --- + Container( + margin: const EdgeInsets.symmetric(horizontal: 16), + padding: const EdgeInsets.symmetric(horizontal: 16), + decoration: AppStyle.boxDecoration.copyWith( + color: Colors.white.withValues(alpha: 0.95), + borderRadius: BorderRadius.circular(16), + ), + child: TextField( + decoration: InputDecoration( + hintText: 'Quick Search...'.tr, + border: InputBorder.none, + icon: const Icon(Icons.search, color: AppColor.primaryColor), + ), + onSubmitted: (val) { + // Global search logic + }, + ), + ), + ], + ), + ); + } + + Widget _buildStatsSection() { + return GetBuilder( + builder: (controller) { + return Padding( + padding: const EdgeInsets.symmetric(vertical: 20.0, horizontal: 16.0), + child: Row( + children: [ + _buildStatCard( + 'Pending'.tr, + controller.isLoading + ? '...' + : controller.driverWantCompleteRegistration.length + .toString(), + Icons.timer_rounded, + Colors.orange, + ), + const SizedBox(width: 12), + _buildStatCard( + 'New'.tr, + controller.isLoading + ? '...' + : controller.newDriverRegister.length.toString(), + Icons.person_add_alt_1_rounded, + Colors.green, + ), + const SizedBox(width: 12), + _buildStatCard( + 'Issues'.tr, + controller.isLoading + ? '...' + : controller.driverNotCompleteRegistration.length + .toString(), + Icons.warning_rounded, + Colors.red, + ), + ], + ), + ); + }, + ); + } + + Widget _buildStatCard( + String title, String count, IconData icon, Color color) { + return Expanded( + child: Container( + padding: const EdgeInsets.all(16), + decoration: AppStyle.boxDecoration, + child: Column( + children: [ + Icon(icon, color: color, size: 24), + const SizedBox(height: 8), + Text(count, style: AppStyle.headTitle2.copyWith(fontSize: 20)), + Text(title, + style: AppStyle.subtitle.copyWith(color: AppColor.accentColor)), + ], + ), + ), + ); + } + + Widget _buildCategoryTitle(String title) { + return Padding( + padding: const EdgeInsets.fromLTRB(20, 24, 20, 12), + child: Text( + title, + style: AppStyle.headTitle2.copyWith(fontSize: 18), + ), + ); + } + + Widget _buildGridSection(List items) { + return GridView.builder( + shrinkWrap: true, + physics: const NeverScrollableScrollPhysics(), + padding: const EdgeInsets.symmetric(horizontal: 16), + gridDelegate: const SliverGridDelegateWithFixedCrossAxisCount( + crossAxisCount: 2, + crossAxisSpacing: 12, + mainAxisSpacing: 12, + childAspectRatio: 1.15, + ), + itemCount: items.length, + itemBuilder: (context, index) { + final item = items[index]; + return _buildServiceCard(item); + }, + ); + } + + Widget _buildServiceCard(ServiceItem item) { + return InkWell( + onTap: item.onTap, + borderRadius: BorderRadius.circular(20), + child: Container( + decoration: AppStyle.boxDecoration1, + child: Column( + mainAxisAlignment: MainAxisAlignment.center, + children: [ + Container( + padding: const EdgeInsets.all(12), + decoration: BoxDecoration( + color: item.color.withValues(alpha: 0.1), + shape: BoxShape.circle, + ), + child: Icon(item.icon, color: item.color, size: 30), + ), + const SizedBox(height: 12), + Padding( + padding: const EdgeInsets.symmetric(horizontal: 8.0), + child: Text( + item.title, + textAlign: TextAlign.center, + style: AppStyle.title + .copyWith(fontSize: 13, fontWeight: FontWeight.w600), + maxLines: 2, + overflow: TextOverflow.ellipsis, + ), + ), + ], + ), + ), + ); + } + + void _showSearchDialog({ + required String title, + required TextEditingController controller, + required VoidCallback onSearch, + TextInputType type = TextInputType.phone, + }) { + MyDialog().getDialog( + title, + 'Search Details'.tr, + Form( + key: mainController.formKey, + child: Column( + mainAxisSize: MainAxisSize.min, + children: [ + MyTextForm( + controller: controller, + label: title, + hint: title, + type: type, + validator: (val) { + if (val == null || val.isEmpty) { + return 'Please enter a value'.tr; + } + return null; + }, + ), + ], + ), + ), + onSearch, + ); + } + + void _showAddDriverDialog() { + Get.defaultDialog( + barrierDismissible: false, + title: "Add Driver Who Wants to Work".tr, + titleStyle: AppStyle.headTitle2, + content: SizedBox( + width: Get.width * .8, + height: 350, + child: Form( + key: mainController.formKey, + child: ListView( + padding: const EdgeInsets.all(8), + children: [ + MyTextForm( + controller: mainController.driverNameController, + label: 'Insert Name of Driver'.tr, + hint: 'Insert Name of Driver'.tr, + type: TextInputType.name), + MyTextForm( + controller: mainController.nationalIdController, + label: 'Insert national ID of Driver'.tr, + hint: 'Insert national ID of Driver'.tr, + type: TextInputType.number), + MyTextForm( + controller: mainController.phoneController, + label: 'Insert phone of Driver'.tr, + hint: 'Insert phone of Driver'.tr, + type: TextInputType.phone), + MyTextForm( + controller: mainController.licenseTypeController, + label: 'Insert license type of Driver'.tr, + hint: 'Insert license type of Driver'.tr, + type: TextInputType.name), + MyTextForm( + controller: mainController.siteDriverController, + label: 'Insert site of Driver'.tr, + hint: 'Insert site of Driver'.tr, + type: TextInputType.name), + MyTextForm( + controller: mainController.birthDateController, + label: 'Insert birth_date of Driver'.tr, + hint: 'YYYY-MM-DD'.tr, + type: TextInputType.datetime), + ], + ), + ), + ), + confirm: MyElevatedButton( + title: 'Add'.tr, + onPressed: () async { + var res = + await CRUD().post(link: AppLink.addDriverWantWork, payload: { + "driver_name": mainController.driverNameController.text, + "national_id": mainController.nationalIdController.text, + "birth_date": mainController.birthDateController.text, + "site": mainController.siteDriverController.text, + "license_type": mainController.licenseTypeController.text, + "phone": mainController.phoneController.text, + }); + if (res != 'failure' && res['status'] == 'success') { + Get.back(); + mainController.driverNameController.clear(); + mainController.nationalIdController.clear(); + mainController.birthDateController.clear(); + mainController.licenseTypeController.clear(); + mainController.siteDriverController.clear(); + mainController.phoneController.clear(); + Get.snackbar('Success'.tr, 'Added successfully'.tr, + backgroundColor: AppColor.greenColor, colorText: Colors.white); + } + }, + kolor: AppColor.greenColor, + ), + cancel: MyElevatedButton( + title: 'Cancel'.tr, + kolor: AppColor.redColor, + onPressed: () => Get.back()), + ); + } + + void _showAddCarDialog() { + Get.defaultDialog( + barrierDismissible: false, + title: "Add Car Who Wants to Work".tr, + titleStyle: AppStyle.headTitle2, + content: SizedBox( + width: Get.width * .8, + height: 350, + child: Form( + key: mainController.formKey, + child: ListView( + padding: const EdgeInsets.all(8), + children: [ + MyTextForm( + controller: mainController.carOwnerWorkController, + label: 'Insert Name of Owner'.tr, + hint: 'Insert Name of Owner'.tr, + type: TextInputType.name), + MyTextForm( + controller: mainController.carNumberController, + label: 'Insert car_number of Driver'.tr, + hint: 'Insert car_number of Driver'.tr, + type: TextInputType.name), + MyTextForm( + controller: mainController.phoneCarController, + label: 'Insert phone of Owner'.tr, + hint: 'Insert phone of Owner'.tr, + type: TextInputType.phone), + MyTextForm( + controller: mainController.manufactureYearController, + label: 'Insert year of Car'.tr, + hint: 'Insert year of Car'.tr, + type: TextInputType.number), + MyTextForm( + controller: mainController.carModelController, + label: 'Insert car_model of Driver'.tr, + hint: 'Insert car_model of Driver'.tr, + type: TextInputType.name), + MyTextForm( + controller: mainController.siteCarController, + label: 'Insert site of Owner'.tr, + hint: 'Insert site of Owner'.tr, + type: TextInputType.name), + MyTextForm( + controller: mainController.carTypeController, + label: 'Insert car_type of Driver'.tr, + hint: 'Insert car_type of Driver'.tr, + type: TextInputType.name), + MyTextForm( + controller: mainController.registrationDateController, + label: 'Insert registration_date of Car'.tr, + hint: 'YYYY-MM-DD'.tr, + type: TextInputType.datetime), + ], + ), + ), + ), + confirm: MyElevatedButton( + title: 'Add'.tr, + onPressed: () async { + var res = await CRUD().post(link: AppLink.addCarWantWork, payload: { + "owner_name": mainController.carOwnerWorkController.text, + "car_number": mainController.carNumberController.text, + "manufacture_year": mainController.manufactureYearController.text, + "car_model": mainController.carModelController.text, + "car_type": mainController.carTypeController.text, + "site": mainController.siteCarController.text, + "registration_date": mainController.registrationDateController.text, + "phone": mainController.phoneCarController.text, + }); + if (res != 'failure' && res['status'] == 'success') { + Get.back(); + mainController.carOwnerWorkController.clear(); + mainController.carNumberController.clear(); + mainController.manufactureYearController.clear(); + mainController.carModelController.clear(); + mainController.siteCarController.clear(); + mainController.carTypeController.clear(); + mainController.registrationDateController.clear(); + mainController.phoneCarController.clear(); + Get.snackbar('Success'.tr, 'Added successfully'.tr, + backgroundColor: AppColor.greenColor, colorText: Colors.white); + } + }, + kolor: AppColor.greenColor, + ), + cancel: MyElevatedButton( + title: 'Cancel'.tr, + kolor: AppColor.redColor, + onPressed: () => Get.back()), + ); + } +} + +class ServiceItem { + final String title; + final IconData icon; + final Color color; + final VoidCallback onTap; + + ServiceItem({ + required this.title, + required this.icon, + required this.color, + required this.onTap, + }); +} diff --git a/siro_service/lib/views/widgets/circle_container.dart b/siro_service/lib/views/widgets/circle_container.dart new file mode 100644 index 0000000..9702b34 --- /dev/null +++ b/siro_service/lib/views/widgets/circle_container.dart @@ -0,0 +1,63 @@ +import 'package:flutter/material.dart'; +import 'package:get/get.dart'; + +import '../../constant/colors.dart'; + +class MyCircleContainer extends StatelessWidget { + final Widget child; + final Color backgroundColor; + final Color borderColor; + + MyCircleContainer({ + Key? key, + required this.child, + this.backgroundColor = AppColor.secondaryColor, + this.borderColor = AppColor.accentColor, + }) : super(key: key); + + final controller = Get.put(CircleController()); + + @override + Widget build(BuildContext context) { + return GetBuilder( + builder: ((controller) => GestureDetector( + onTap: () { + controller.changeColor(); + }, + child: AnimatedContainer( + onEnd: () { + controller.onEnd(); + }, + duration: const Duration(milliseconds: 300), + width: controller.size, + height: controller.size, + decoration: BoxDecoration( + shape: BoxShape.circle, + color: controller.backgroundColor, + border: Border.all( + color: borderColor, + width: 1, + ), + ), + child: Center(child: child), + ), + ))); + } +} + +class CircleController extends GetxController { + Color backgroundColor = AppColor.secondaryColor; + double size = 40; + void changeColor() { + backgroundColor = backgroundColor == AppColor.secondaryColor + ? AppColor.accentColor + : AppColor.secondaryColor; + size = 60; + update(); + } + + void onEnd() { + size = 40; + update(); + } +} diff --git a/siro_service/lib/views/widgets/elevated_btn.dart b/siro_service/lib/views/widgets/elevated_btn.dart new file mode 100644 index 0000000..44dfab9 --- /dev/null +++ b/siro_service/lib/views/widgets/elevated_btn.dart @@ -0,0 +1,69 @@ +import 'dart:io'; +import 'package:flutter/material.dart'; +import 'package:flutter/services.dart'; +import 'package:vibration/vibration.dart'; + +import '../../constant/box_name.dart'; +import '../../constant/colors.dart'; +import '../../constant/style.dart'; +import '../../main.dart'; + +class MyElevatedButton extends StatelessWidget { + final String title; + final VoidCallback onPressed; + final Color kolor; + final int vibrateDuration; + final bool loading; + final Widget? child; + + const MyElevatedButton({ + Key? key, + required this.title, + required this.onPressed, + this.kolor = AppColor.primaryColor, + this.vibrateDuration = 100, + this.loading = false, + this.child, + }) : super(key: key); + + @override + Widget build(BuildContext context) { + bool vibrate = box.read(BoxName.isvibrate) ?? true; + + return ElevatedButton( + style: ElevatedButton.styleFrom( + backgroundColor: kolor, + shape: RoundedRectangleBorder( + borderRadius: BorderRadius.circular(12.0), + ), + ), + onPressed: loading + ? null + : () async { + if (vibrate == true) { + if (Platform.isIOS) { + HapticFeedback.selectionClick(); + } else if (Platform.isAndroid) { + await Vibration.vibrate(duration: vibrateDuration); + } else {} + } + onPressed(); + }, + child: loading + ? const SizedBox( + height: 20, + width: 20, + child: CircularProgressIndicator( + color: Colors.white, + strokeWidth: 2, + ), + ) + : child ?? + Text( + title, + textAlign: TextAlign.center, + style: AppStyle.title.copyWith(color: AppColor.secondaryColor), + ), + ); + } +} diff --git a/siro_service/lib/views/widgets/icon_widget_menu.dart b/siro_service/lib/views/widgets/icon_widget_menu.dart new file mode 100644 index 0000000..9a0189f --- /dev/null +++ b/siro_service/lib/views/widgets/icon_widget_menu.dart @@ -0,0 +1,66 @@ +import 'package:flutter/material.dart'; + +import '../../constant/colors.dart'; +import '../../constant/style.dart'; + +class IconWidgetMenu extends StatelessWidget { + const IconWidgetMenu({ + Key? key, + required this.onpressed, + required this.icon, + required this.title, + }) : super(key: key); + + final VoidCallback onpressed; + final IconData icon; + final String title; + + @override + Widget build(BuildContext context) { + return InkWell( + onTap: onpressed, + child: Padding( + padding: const EdgeInsets.only(top: 1), + child: Column( + mainAxisAlignment: MainAxisAlignment.center, + children: [ + Container( + width: 50, + decoration: const BoxDecoration( + color: AppColor.secondaryColor, + shape: BoxShape.circle, + // boxShadow: [ + // BoxShadow( + // color: AppColor.secondaryColor, + // offset: Offset(-2, -2), + // blurRadius: 0, + // spreadRadius: 0, + // blurStyle: BlurStyle.outer, + // ), + // BoxShadow( + // color: AppColor.accentColor, + // offset: Offset(3, 3), + // blurRadius: 0, + // spreadRadius: 0, + // blurStyle: BlurStyle.outer, + // ), + // ], + ), + child: Center( + child: Icon( + icon, + size: 30, + color: AppColor.primaryColor, + ), + ), + ), + Text( + title, + style: AppStyle.subtitle.copyWith(color: AppColor.secondaryColor), + ) + ], + ), + ), + ); + } +} diff --git a/siro_service/lib/views/widgets/my_dialog.dart b/siro_service/lib/views/widgets/my_dialog.dart new file mode 100644 index 0000000..4a4b3d6 --- /dev/null +++ b/siro_service/lib/views/widgets/my_dialog.dart @@ -0,0 +1,40 @@ +import 'dart:ui'; + +import 'package:flutter/material.dart'; +import 'package:get/get.dart'; + +import '../../constant/colors.dart'; +import '../../constant/style.dart'; +import 'elevated_btn.dart'; + +class MyDialog extends GetxController { + void getDialog( + String title, String? midTitle, Widget widget, VoidCallback onPressed) { + // final textToSpeechController = Get.put(TextToSpeechController()); + Get.defaultDialog( + title: title, + titleStyle: AppStyle.title, + middleTextStyle: AppStyle.title, + content: Column( + children: [ + // IconButton( + // onPressed: () async { + // // await textToSpeechController.speakText(title ?? midTitle!); + // }, + // icon: const Icon(Icons.headphones)), + widget + ], + ), + confirm: MyElevatedButton( + title: 'Ok'.tr, + onPressed: onPressed, + kolor: AppColor.greenColor, + ), + cancel: MyElevatedButton( + title: 'Cancel', + kolor: AppColor.redColor, + onPressed: () { + Get.back(); + })); + } +} diff --git a/siro_service/lib/views/widgets/my_scafold.dart b/siro_service/lib/views/widgets/my_scafold.dart new file mode 100644 index 0000000..d25384f --- /dev/null +++ b/siro_service/lib/views/widgets/my_scafold.dart @@ -0,0 +1,51 @@ +import 'package:flutter/material.dart'; +import 'package:get/get.dart'; + +import '../../constant/colors.dart'; +import '../../constant/style.dart'; + +class MyScaffold extends StatelessWidget { + const MyScaffold({ + super.key, + required this.title, + this.action = const Icon( + Icons.clear, + color: AppColor.secondaryColor, + ), + required this.isleading, + required this.body, + }); + + final String title; + final List body; + final Widget action; + final bool isleading; + + @override + Widget build(BuildContext context) { + return Scaffold( + backgroundColor: AppColor.secondaryColor, + appBar: AppBar( + backgroundColor: AppColor.secondaryColor, + elevation: 0, + leading: isleading + ? IconButton( + onPressed: () { + Get.back(); + }, + icon: const Icon( + Icons.arrow_back_ios_new, + color: AppColor.primaryColor, + ), + ) + : const SizedBox(), + actions: [action], + title: Text( + title, + style: AppStyle.title + .copyWith(fontSize: 20, fontWeight: FontWeight.bold), + ), + ), + body: SafeArea(child: Stack(children: body))); + } +} diff --git a/siro_service/lib/views/widgets/my_textField.dart b/siro_service/lib/views/widgets/my_textField.dart new file mode 100644 index 0000000..91b4bba --- /dev/null +++ b/siro_service/lib/views/widgets/my_textField.dart @@ -0,0 +1,69 @@ +import 'package:flutter/material.dart'; +import 'package:get/get.dart'; + +import '../../constant/colors.dart'; +import '../../constant/style.dart'; + +class MyTextForm extends StatelessWidget { + const MyTextForm({ + super.key, + required this.controller, + required this.label, + required this.hint, + required this.type, + this.validator, + }); + final TextEditingController controller; + final String label, hint; + final TextInputType type; + final String? Function(String?)? validator; + + @override + Widget build(BuildContext context) { + return Padding( + padding: const EdgeInsets.only(bottom: 10), + child: SizedBox( + width: Get.width * .8, + child: TextFormField( + keyboardType: type, + cursorColor: AppColor.accentColor, + controller: controller, + decoration: InputDecoration( + focusedBorder: OutlineInputBorder( + borderSide: const BorderSide( + color: AppColor.primaryColor, + width: 2.0, + ), + borderRadius: BorderRadius.circular(10), + ), + focusColor: AppColor.accentColor, + fillColor: AppColor.accentColor, + border: const OutlineInputBorder( + borderRadius: BorderRadius.all(Radius.circular(12))), + labelText: label.tr, + hintText: hint.tr, + hintStyle: AppStyle.title, + labelStyle: AppStyle.title, + ), + validator: validator ?? (value) { + if (value == null || value.isEmpty) { + return '${'Please enter'.tr} $label.'.tr; + } + + if (type == TextInputType.emailAddress) { + if (!value.contains('@')) { + return 'Please enter a valid email.'.tr; + } + } else if (type == TextInputType.phone) { + if (value.length > 14) { + return 'Please enter a valid phone number.'.tr; + } + } + + return null; + }, + ), + ), + ); + } +} diff --git a/siro_service/lib/views/widgets/mycircular.dart b/siro_service/lib/views/widgets/mycircular.dart new file mode 100644 index 0000000..5310e12 --- /dev/null +++ b/siro_service/lib/views/widgets/mycircular.dart @@ -0,0 +1,160 @@ +import 'package:flutter/material.dart'; +import 'package:flutter/material.dart'; +import 'package:flutter/services.dart'; +import 'package:get/get.dart'; + +import '../../constant/colors.dart'; + +class MyCircularProgressIndicator extends StatelessWidget { + final Color backgroundColor; + + const MyCircularProgressIndicator({ + super.key, + this.backgroundColor = Colors.transparent, + }); + + @override + Widget build(BuildContext context) { + return Center( + child: Container( + width: 110, + height: 110, + decoration: BoxDecoration( + color: backgroundColor, + shape: BoxShape.circle, + ), + child: Stack( + children: [ + const Center(child: CircularProgressIndicator()), + Column( + children: [ + Align( + alignment: Alignment.center, + child: Image.asset('assets/images/logo.png'), + ), + ], + ), + ], + ), + ), + ); + } +} + +class SnackbarConfig { + static const duration = Duration(seconds: 3); + static const animationDuration = Duration(milliseconds: 300); + static const margin = EdgeInsets.symmetric(horizontal: 16, vertical: 10); + static const borderRadius = 12.0; + static const elevation = 6.0; + + static final BoxShadow shadow = BoxShadow( + color: Colors.black.withOpacity(0.1), + blurRadius: 10, + offset: const Offset(0, 2), + ); +} + +SnackbarController mySnackeBarError(String message) { + // Trigger error haptic feedback + HapticFeedback.mediumImpact(); + + return Get.snackbar( + 'Error'.tr, + message, + backgroundColor: AppColor.redColor.withOpacity(0.95), + colorText: AppColor.secondaryColor, + icon: const Icon( + Icons.error_outline_rounded, + color: AppColor.secondaryColor, + size: 28, + ), + shouldIconPulse: true, + snackPosition: SnackPosition.TOP, + margin: SnackbarConfig.margin, + borderRadius: SnackbarConfig.borderRadius, + duration: SnackbarConfig.duration, + animationDuration: SnackbarConfig.animationDuration, + forwardAnimationCurve: Curves.easeOutCirc, + reverseAnimationCurve: Curves.easeInCirc, + boxShadows: [SnackbarConfig.shadow], + padding: const EdgeInsets.symmetric(horizontal: 20, vertical: 12), + titleText: Text( + 'Error'.tr, + style: const TextStyle( + fontWeight: FontWeight.w700, + color: Colors.white, + fontSize: 16, + letterSpacing: 0.2, + ), + ), + messageText: Text( + message, + style: TextStyle( + color: Colors.white.withOpacity(0.95), + fontSize: 14, + height: 1.3, + ), + ), + onTap: (_) { + HapticFeedback.lightImpact(); + Get.closeCurrentSnackbar(); + }, + isDismissible: true, + dismissDirection: DismissDirection.horizontal, + overlayBlur: 0.8, + overlayColor: Colors.black12, + ); +} + +SnackbarController mySnackbarSuccess(String message) { + // Trigger success haptic feedback + HapticFeedback.lightImpact(); + + return Get.snackbar( + 'Success'.tr, + message, + backgroundColor: AppColor.greenColor.withOpacity(0.95), + colorText: AppColor.secondaryColor, + icon: const Icon( + Icons.check_circle_outline_rounded, + color: AppColor.secondaryColor, + size: 28, + ), + shouldIconPulse: true, + snackPosition: SnackPosition.TOP, + margin: SnackbarConfig.margin, + borderRadius: SnackbarConfig.borderRadius, + duration: SnackbarConfig.duration, + animationDuration: SnackbarConfig.animationDuration, + forwardAnimationCurve: Curves.easeOutCirc, + reverseAnimationCurve: Curves.easeInCirc, + boxShadows: [SnackbarConfig.shadow], + padding: const EdgeInsets.symmetric(horizontal: 20, vertical: 12), + titleText: Text( + 'Success'.tr, + style: const TextStyle( + fontWeight: FontWeight.w700, + color: Colors.white, + fontSize: 16, + letterSpacing: 0.2, + ), + ), + messageText: Text( + message, + style: TextStyle( + color: Colors.white.withOpacity(0.95), + fontSize: 14, + height: 1.3, + ), + ), + onTap: (_) { + HapticFeedback.lightImpact(); + Get.closeCurrentSnackbar(); + }, + isDismissible: true, + dismissDirection: DismissDirection.horizontal, + overlayBlur: 0.8, + overlayColor: Colors.black12, + ); +} diff --git a/siro_service/linux/.gitignore b/siro_service/linux/.gitignore new file mode 100644 index 0000000..d3896c9 --- /dev/null +++ b/siro_service/linux/.gitignore @@ -0,0 +1 @@ +flutter/ephemeral diff --git a/siro_service/linux/CMakeLists.txt b/siro_service/linux/CMakeLists.txt new file mode 100644 index 0000000..92dc9b1 --- /dev/null +++ b/siro_service/linux/CMakeLists.txt @@ -0,0 +1,128 @@ +# Project-level configuration. +cmake_minimum_required(VERSION 3.13) +project(runner LANGUAGES CXX) + +# The name of the executable created for the application. Change this to change +# the on-disk name of your application. +set(BINARY_NAME "siro_service") +# The unique GTK application identifier for this application. See: +# https://wiki.gnome.org/HowDoI/ChooseApplicationID +set(APPLICATION_ID "com.siro.siro_service") + +# Explicitly opt in to modern CMake behaviors to avoid warnings with recent +# versions of CMake. +cmake_policy(SET CMP0063 NEW) + +# Load bundled libraries from the lib/ directory relative to the binary. +set(CMAKE_INSTALL_RPATH "$ORIGIN/lib") + +# Root filesystem for cross-building. +if(FLUTTER_TARGET_PLATFORM_SYSROOT) + set(CMAKE_SYSROOT ${FLUTTER_TARGET_PLATFORM_SYSROOT}) + set(CMAKE_FIND_ROOT_PATH ${CMAKE_SYSROOT}) + set(CMAKE_FIND_ROOT_PATH_MODE_PROGRAM NEVER) + set(CMAKE_FIND_ROOT_PATH_MODE_PACKAGE ONLY) + set(CMAKE_FIND_ROOT_PATH_MODE_LIBRARY ONLY) + set(CMAKE_FIND_ROOT_PATH_MODE_INCLUDE ONLY) +endif() + +# Define build configuration options. +if(NOT CMAKE_BUILD_TYPE AND NOT CMAKE_CONFIGURATION_TYPES) + set(CMAKE_BUILD_TYPE "Debug" CACHE + STRING "Flutter build mode" FORCE) + set_property(CACHE CMAKE_BUILD_TYPE PROPERTY STRINGS + "Debug" "Profile" "Release") +endif() + +# Compilation settings that should be applied to most targets. +# +# Be cautious about adding new options here, as plugins use this function by +# default. In most cases, you should add new options to specific targets instead +# of modifying this function. +function(APPLY_STANDARD_SETTINGS TARGET) + target_compile_features(${TARGET} PUBLIC cxx_std_14) + target_compile_options(${TARGET} PRIVATE -Wall -Werror) + target_compile_options(${TARGET} PRIVATE "$<$>:-O3>") + target_compile_definitions(${TARGET} PRIVATE "$<$>:NDEBUG>") +endfunction() + +# Flutter library and tool build rules. +set(FLUTTER_MANAGED_DIR "${CMAKE_CURRENT_SOURCE_DIR}/flutter") +add_subdirectory(${FLUTTER_MANAGED_DIR}) + +# System-level dependencies. +find_package(PkgConfig REQUIRED) +pkg_check_modules(GTK REQUIRED IMPORTED_TARGET gtk+-3.0) + +# Application build; see runner/CMakeLists.txt. +add_subdirectory("runner") + +# Run the Flutter tool portions of the build. This must not be removed. +add_dependencies(${BINARY_NAME} flutter_assemble) + +# Only the install-generated bundle's copy of the executable will launch +# correctly, since the resources must in the right relative locations. To avoid +# people trying to run the unbundled copy, put it in a subdirectory instead of +# the default top-level location. +set_target_properties(${BINARY_NAME} + PROPERTIES + RUNTIME_OUTPUT_DIRECTORY "${CMAKE_BINARY_DIR}/intermediates_do_not_run" +) + + +# Generated plugin build rules, which manage building the plugins and adding +# them to the application. +include(flutter/generated_plugins.cmake) + + +# === Installation === +# By default, "installing" just makes a relocatable bundle in the build +# directory. +set(BUILD_BUNDLE_DIR "${PROJECT_BINARY_DIR}/bundle") +if(CMAKE_INSTALL_PREFIX_INITIALIZED_TO_DEFAULT) + set(CMAKE_INSTALL_PREFIX "${BUILD_BUNDLE_DIR}" CACHE PATH "..." FORCE) +endif() + +# Start with a clean build bundle directory every time. +install(CODE " + file(REMOVE_RECURSE \"${BUILD_BUNDLE_DIR}/\") + " COMPONENT Runtime) + +set(INSTALL_BUNDLE_DATA_DIR "${CMAKE_INSTALL_PREFIX}/data") +set(INSTALL_BUNDLE_LIB_DIR "${CMAKE_INSTALL_PREFIX}/lib") + +install(TARGETS ${BINARY_NAME} RUNTIME DESTINATION "${CMAKE_INSTALL_PREFIX}" + COMPONENT Runtime) + +install(FILES "${FLUTTER_ICU_DATA_FILE}" DESTINATION "${INSTALL_BUNDLE_DATA_DIR}" + COMPONENT Runtime) + +install(FILES "${FLUTTER_LIBRARY}" DESTINATION "${INSTALL_BUNDLE_LIB_DIR}" + COMPONENT Runtime) + +foreach(bundled_library ${PLUGIN_BUNDLED_LIBRARIES}) + install(FILES "${bundled_library}" + DESTINATION "${INSTALL_BUNDLE_LIB_DIR}" + COMPONENT Runtime) +endforeach(bundled_library) + +# Copy the native assets provided by the build.dart from all packages. +set(NATIVE_ASSETS_DIR "${PROJECT_BUILD_DIR}native_assets/linux/") +install(DIRECTORY "${NATIVE_ASSETS_DIR}" + DESTINATION "${INSTALL_BUNDLE_LIB_DIR}" + COMPONENT Runtime) + +# Fully re-copy the assets directory on each build to avoid having stale files +# from a previous install. +set(FLUTTER_ASSET_DIR_NAME "flutter_assets") +install(CODE " + file(REMOVE_RECURSE \"${INSTALL_BUNDLE_DATA_DIR}/${FLUTTER_ASSET_DIR_NAME}\") + " COMPONENT Runtime) +install(DIRECTORY "${PROJECT_BUILD_DIR}/${FLUTTER_ASSET_DIR_NAME}" + DESTINATION "${INSTALL_BUNDLE_DATA_DIR}" COMPONENT Runtime) + +# Install the AOT library on non-Debug builds only. +if(NOT CMAKE_BUILD_TYPE MATCHES "Debug") + install(FILES "${AOT_LIBRARY}" DESTINATION "${INSTALL_BUNDLE_LIB_DIR}" + COMPONENT Runtime) +endif() diff --git a/siro_service/linux/flutter/CMakeLists.txt b/siro_service/linux/flutter/CMakeLists.txt new file mode 100644 index 0000000..d5bd016 --- /dev/null +++ b/siro_service/linux/flutter/CMakeLists.txt @@ -0,0 +1,88 @@ +# This file controls Flutter-level build steps. It should not be edited. +cmake_minimum_required(VERSION 3.10) + +set(EPHEMERAL_DIR "${CMAKE_CURRENT_SOURCE_DIR}/ephemeral") + +# Configuration provided via flutter tool. +include(${EPHEMERAL_DIR}/generated_config.cmake) + +# TODO: Move the rest of this into files in ephemeral. See +# https://github.com/flutter/flutter/issues/57146. + +# Serves the same purpose as list(TRANSFORM ... PREPEND ...), +# which isn't available in 3.10. +function(list_prepend LIST_NAME PREFIX) + set(NEW_LIST "") + foreach(element ${${LIST_NAME}}) + list(APPEND NEW_LIST "${PREFIX}${element}") + endforeach(element) + set(${LIST_NAME} "${NEW_LIST}" PARENT_SCOPE) +endfunction() + +# === Flutter Library === +# System-level dependencies. +find_package(PkgConfig REQUIRED) +pkg_check_modules(GTK REQUIRED IMPORTED_TARGET gtk+-3.0) +pkg_check_modules(GLIB REQUIRED IMPORTED_TARGET glib-2.0) +pkg_check_modules(GIO REQUIRED IMPORTED_TARGET gio-2.0) + +set(FLUTTER_LIBRARY "${EPHEMERAL_DIR}/libflutter_linux_gtk.so") + +# Published to parent scope for install step. +set(FLUTTER_LIBRARY ${FLUTTER_LIBRARY} PARENT_SCOPE) +set(FLUTTER_ICU_DATA_FILE "${EPHEMERAL_DIR}/icudtl.dat" PARENT_SCOPE) +set(PROJECT_BUILD_DIR "${PROJECT_DIR}/build/" PARENT_SCOPE) +set(AOT_LIBRARY "${PROJECT_DIR}/build/lib/libapp.so" PARENT_SCOPE) + +list(APPEND FLUTTER_LIBRARY_HEADERS + "fl_basic_message_channel.h" + "fl_binary_codec.h" + "fl_binary_messenger.h" + "fl_dart_project.h" + "fl_engine.h" + "fl_json_message_codec.h" + "fl_json_method_codec.h" + "fl_message_codec.h" + "fl_method_call.h" + "fl_method_channel.h" + "fl_method_codec.h" + "fl_method_response.h" + "fl_plugin_registrar.h" + "fl_plugin_registry.h" + "fl_standard_message_codec.h" + "fl_standard_method_codec.h" + "fl_string_codec.h" + "fl_value.h" + "fl_view.h" + "flutter_linux.h" +) +list_prepend(FLUTTER_LIBRARY_HEADERS "${EPHEMERAL_DIR}/flutter_linux/") +add_library(flutter INTERFACE) +target_include_directories(flutter INTERFACE + "${EPHEMERAL_DIR}" +) +target_link_libraries(flutter INTERFACE "${FLUTTER_LIBRARY}") +target_link_libraries(flutter INTERFACE + PkgConfig::GTK + PkgConfig::GLIB + PkgConfig::GIO +) +add_dependencies(flutter flutter_assemble) + +# === Flutter tool backend === +# _phony_ is a non-existent file to force this command to run every time, +# since currently there's no way to get a full input/output list from the +# flutter tool. +add_custom_command( + OUTPUT ${FLUTTER_LIBRARY} ${FLUTTER_LIBRARY_HEADERS} + ${CMAKE_CURRENT_BINARY_DIR}/_phony_ + COMMAND ${CMAKE_COMMAND} -E env + ${FLUTTER_TOOL_ENVIRONMENT} + "${FLUTTER_ROOT}/packages/flutter_tools/bin/tool_backend.sh" + ${FLUTTER_TARGET_PLATFORM} ${CMAKE_BUILD_TYPE} + VERBATIM +) +add_custom_target(flutter_assemble DEPENDS + "${FLUTTER_LIBRARY}" + ${FLUTTER_LIBRARY_HEADERS} +) diff --git a/siro_service/linux/flutter/generated_plugin_registrant.cc b/siro_service/linux/flutter/generated_plugin_registrant.cc new file mode 100644 index 0000000..3ccd551 --- /dev/null +++ b/siro_service/linux/flutter/generated_plugin_registrant.cc @@ -0,0 +1,23 @@ +// +// Generated file. Do not edit. +// + +// clang-format off + +#include "generated_plugin_registrant.h" + +#include +#include +#include + +void fl_register_plugins(FlPluginRegistry* registry) { + g_autoptr(FlPluginRegistrar) file_selector_linux_registrar = + fl_plugin_registry_get_registrar_for_plugin(registry, "FileSelectorPlugin"); + file_selector_plugin_register_with_registrar(file_selector_linux_registrar); + g_autoptr(FlPluginRegistrar) flutter_secure_storage_linux_registrar = + fl_plugin_registry_get_registrar_for_plugin(registry, "FlutterSecureStorageLinuxPlugin"); + flutter_secure_storage_linux_plugin_register_with_registrar(flutter_secure_storage_linux_registrar); + g_autoptr(FlPluginRegistrar) url_launcher_linux_registrar = + fl_plugin_registry_get_registrar_for_plugin(registry, "UrlLauncherPlugin"); + url_launcher_plugin_register_with_registrar(url_launcher_linux_registrar); +} diff --git a/siro_service/linux/flutter/generated_plugin_registrant.h b/siro_service/linux/flutter/generated_plugin_registrant.h new file mode 100644 index 0000000..e0f0a47 --- /dev/null +++ b/siro_service/linux/flutter/generated_plugin_registrant.h @@ -0,0 +1,15 @@ +// +// Generated file. Do not edit. +// + +// clang-format off + +#ifndef GENERATED_PLUGIN_REGISTRANT_ +#define GENERATED_PLUGIN_REGISTRANT_ + +#include + +// Registers Flutter plugins. +void fl_register_plugins(FlPluginRegistry* registry); + +#endif // GENERATED_PLUGIN_REGISTRANT_ diff --git a/siro_service/linux/flutter/generated_plugins.cmake b/siro_service/linux/flutter/generated_plugins.cmake new file mode 100644 index 0000000..fbedf4a --- /dev/null +++ b/siro_service/linux/flutter/generated_plugins.cmake @@ -0,0 +1,27 @@ +# +# Generated file, do not edit. +# + +list(APPEND FLUTTER_PLUGIN_LIST + file_selector_linux + flutter_secure_storage_linux + url_launcher_linux +) + +list(APPEND FLUTTER_FFI_PLUGIN_LIST + jni +) + +set(PLUGIN_BUNDLED_LIBRARIES) + +foreach(plugin ${FLUTTER_PLUGIN_LIST}) + add_subdirectory(flutter/ephemeral/.plugin_symlinks/${plugin}/linux plugins/${plugin}) + target_link_libraries(${BINARY_NAME} PRIVATE ${plugin}_plugin) + list(APPEND PLUGIN_BUNDLED_LIBRARIES $) + list(APPEND PLUGIN_BUNDLED_LIBRARIES ${${plugin}_bundled_libraries}) +endforeach(plugin) + +foreach(ffi_plugin ${FLUTTER_FFI_PLUGIN_LIST}) + add_subdirectory(flutter/ephemeral/.plugin_symlinks/${ffi_plugin}/linux plugins/${ffi_plugin}) + list(APPEND PLUGIN_BUNDLED_LIBRARIES ${${ffi_plugin}_bundled_libraries}) +endforeach(ffi_plugin) diff --git a/siro_service/linux/runner/CMakeLists.txt b/siro_service/linux/runner/CMakeLists.txt new file mode 100644 index 0000000..e97dabc --- /dev/null +++ b/siro_service/linux/runner/CMakeLists.txt @@ -0,0 +1,26 @@ +cmake_minimum_required(VERSION 3.13) +project(runner LANGUAGES CXX) + +# Define the application target. To change its name, change BINARY_NAME in the +# top-level CMakeLists.txt, not the value here, or `flutter run` will no longer +# work. +# +# Any new source files that you add to the application should be added here. +add_executable(${BINARY_NAME} + "main.cc" + "my_application.cc" + "${FLUTTER_MANAGED_DIR}/generated_plugin_registrant.cc" +) + +# Apply the standard set of build settings. This can be removed for applications +# that need different build settings. +apply_standard_settings(${BINARY_NAME}) + +# Add preprocessor definitions for the application ID. +add_definitions(-DAPPLICATION_ID="${APPLICATION_ID}") + +# Add dependency libraries. Add any application-specific dependencies here. +target_link_libraries(${BINARY_NAME} PRIVATE flutter) +target_link_libraries(${BINARY_NAME} PRIVATE PkgConfig::GTK) + +target_include_directories(${BINARY_NAME} PRIVATE "${CMAKE_SOURCE_DIR}") diff --git a/siro_service/linux/runner/main.cc b/siro_service/linux/runner/main.cc new file mode 100644 index 0000000..e7c5c54 --- /dev/null +++ b/siro_service/linux/runner/main.cc @@ -0,0 +1,6 @@ +#include "my_application.h" + +int main(int argc, char** argv) { + g_autoptr(MyApplication) app = my_application_new(); + return g_application_run(G_APPLICATION(app), argc, argv); +} diff --git a/siro_service/linux/runner/my_application.cc b/siro_service/linux/runner/my_application.cc new file mode 100644 index 0000000..96718a8 --- /dev/null +++ b/siro_service/linux/runner/my_application.cc @@ -0,0 +1,148 @@ +#include "my_application.h" + +#include +#ifdef GDK_WINDOWING_X11 +#include +#endif + +#include "flutter/generated_plugin_registrant.h" + +struct _MyApplication { + GtkApplication parent_instance; + char** dart_entrypoint_arguments; +}; + +G_DEFINE_TYPE(MyApplication, my_application, GTK_TYPE_APPLICATION) + +// Called when first Flutter frame received. +static void first_frame_cb(MyApplication* self, FlView* view) { + gtk_widget_show(gtk_widget_get_toplevel(GTK_WIDGET(view))); +} + +// Implements GApplication::activate. +static void my_application_activate(GApplication* application) { + MyApplication* self = MY_APPLICATION(application); + GtkWindow* window = + GTK_WINDOW(gtk_application_window_new(GTK_APPLICATION(application))); + + // Use a header bar when running in GNOME as this is the common style used + // by applications and is the setup most users will be using (e.g. Ubuntu + // desktop). + // If running on X and not using GNOME then just use a traditional title bar + // in case the window manager does more exotic layout, e.g. tiling. + // If running on Wayland assume the header bar will work (may need changing + // if future cases occur). + gboolean use_header_bar = TRUE; +#ifdef GDK_WINDOWING_X11 + GdkScreen* screen = gtk_window_get_screen(window); + if (GDK_IS_X11_SCREEN(screen)) { + const gchar* wm_name = gdk_x11_screen_get_window_manager_name(screen); + if (g_strcmp0(wm_name, "GNOME Shell") != 0) { + use_header_bar = FALSE; + } + } +#endif + if (use_header_bar) { + GtkHeaderBar* header_bar = GTK_HEADER_BAR(gtk_header_bar_new()); + gtk_widget_show(GTK_WIDGET(header_bar)); + gtk_header_bar_set_title(header_bar, "siro_service"); + gtk_header_bar_set_show_close_button(header_bar, TRUE); + gtk_window_set_titlebar(window, GTK_WIDGET(header_bar)); + } else { + gtk_window_set_title(window, "siro_service"); + } + + gtk_window_set_default_size(window, 1280, 720); + + g_autoptr(FlDartProject) project = fl_dart_project_new(); + fl_dart_project_set_dart_entrypoint_arguments( + project, self->dart_entrypoint_arguments); + + FlView* view = fl_view_new(project); + GdkRGBA background_color; + // Background defaults to black, override it here if necessary, e.g. #00000000 + // for transparent. + gdk_rgba_parse(&background_color, "#000000"); + fl_view_set_background_color(view, &background_color); + gtk_widget_show(GTK_WIDGET(view)); + gtk_container_add(GTK_CONTAINER(window), GTK_WIDGET(view)); + + // Show the window when Flutter renders. + // Requires the view to be realized so we can start rendering. + g_signal_connect_swapped(view, "first-frame", G_CALLBACK(first_frame_cb), + self); + gtk_widget_realize(GTK_WIDGET(view)); + + fl_register_plugins(FL_PLUGIN_REGISTRY(view)); + + gtk_widget_grab_focus(GTK_WIDGET(view)); +} + +// Implements GApplication::local_command_line. +static gboolean my_application_local_command_line(GApplication* application, + gchar*** arguments, + int* exit_status) { + MyApplication* self = MY_APPLICATION(application); + // Strip out the first argument as it is the binary name. + self->dart_entrypoint_arguments = g_strdupv(*arguments + 1); + + g_autoptr(GError) error = nullptr; + if (!g_application_register(application, nullptr, &error)) { + g_warning("Failed to register: %s", error->message); + *exit_status = 1; + return TRUE; + } + + g_application_activate(application); + *exit_status = 0; + + return TRUE; +} + +// Implements GApplication::startup. +static void my_application_startup(GApplication* application) { + // MyApplication* self = MY_APPLICATION(object); + + // Perform any actions required at application startup. + + G_APPLICATION_CLASS(my_application_parent_class)->startup(application); +} + +// Implements GApplication::shutdown. +static void my_application_shutdown(GApplication* application) { + // MyApplication* self = MY_APPLICATION(object); + + // Perform any actions required at application shutdown. + + G_APPLICATION_CLASS(my_application_parent_class)->shutdown(application); +} + +// Implements GObject::dispose. +static void my_application_dispose(GObject* object) { + MyApplication* self = MY_APPLICATION(object); + g_clear_pointer(&self->dart_entrypoint_arguments, g_strfreev); + G_OBJECT_CLASS(my_application_parent_class)->dispose(object); +} + +static void my_application_class_init(MyApplicationClass* klass) { + G_APPLICATION_CLASS(klass)->activate = my_application_activate; + G_APPLICATION_CLASS(klass)->local_command_line = + my_application_local_command_line; + G_APPLICATION_CLASS(klass)->startup = my_application_startup; + G_APPLICATION_CLASS(klass)->shutdown = my_application_shutdown; + G_OBJECT_CLASS(klass)->dispose = my_application_dispose; +} + +static void my_application_init(MyApplication* self) {} + +MyApplication* my_application_new() { + // Set the program name to the application ID, which helps various systems + // like GTK and desktop environments map this running application to its + // corresponding .desktop file. This ensures better integration by allowing + // the application to be recognized beyond its binary name. + g_set_prgname(APPLICATION_ID); + + return MY_APPLICATION(g_object_new(my_application_get_type(), + "application-id", APPLICATION_ID, "flags", + G_APPLICATION_NON_UNIQUE, nullptr)); +} diff --git a/siro_service/linux/runner/my_application.h b/siro_service/linux/runner/my_application.h new file mode 100644 index 0000000..db16367 --- /dev/null +++ b/siro_service/linux/runner/my_application.h @@ -0,0 +1,21 @@ +#ifndef FLUTTER_MY_APPLICATION_H_ +#define FLUTTER_MY_APPLICATION_H_ + +#include + +G_DECLARE_FINAL_TYPE(MyApplication, + my_application, + MY, + APPLICATION, + GtkApplication) + +/** + * my_application_new: + * + * Creates a new Flutter-based application. + * + * Returns: a new #MyApplication. + */ +MyApplication* my_application_new(); + +#endif // FLUTTER_MY_APPLICATION_H_ diff --git a/siro_service/macos/.gitignore b/siro_service/macos/.gitignore new file mode 100644 index 0000000..746adbb --- /dev/null +++ b/siro_service/macos/.gitignore @@ -0,0 +1,7 @@ +# Flutter-related +**/Flutter/ephemeral/ +**/Pods/ + +# Xcode-related +**/dgph +**/xcuserdata/ diff --git a/siro_service/macos/Flutter/Flutter-Debug.xcconfig b/siro_service/macos/Flutter/Flutter-Debug.xcconfig new file mode 100644 index 0000000..4b81f9b --- /dev/null +++ b/siro_service/macos/Flutter/Flutter-Debug.xcconfig @@ -0,0 +1,2 @@ +#include? "Pods/Target Support Files/Pods-Runner/Pods-Runner.debug.xcconfig" +#include "ephemeral/Flutter-Generated.xcconfig" diff --git a/siro_service/macos/Flutter/Flutter-Release.xcconfig b/siro_service/macos/Flutter/Flutter-Release.xcconfig new file mode 100644 index 0000000..5caa9d1 --- /dev/null +++ b/siro_service/macos/Flutter/Flutter-Release.xcconfig @@ -0,0 +1,2 @@ +#include? "Pods/Target Support Files/Pods-Runner/Pods-Runner.release.xcconfig" +#include "ephemeral/Flutter-Generated.xcconfig" diff --git a/siro_service/macos/Flutter/GeneratedPluginRegistrant.swift b/siro_service/macos/Flutter/GeneratedPluginRegistrant.swift new file mode 100644 index 0000000..d845562 --- /dev/null +++ b/siro_service/macos/Flutter/GeneratedPluginRegistrant.swift @@ -0,0 +1,34 @@ +// +// Generated file. Do not edit. +// + +import FlutterMacOS +import Foundation + +import device_info_plus +import file_selector_macos +import firebase_auth +import firebase_core +import firebase_messaging +import flutter_image_compress_macos +import flutter_local_notifications +import flutter_secure_storage_macos +import google_sign_in_ios +import share_plus +import sqflite_darwin +import url_launcher_macos + +func RegisterGeneratedPlugins(registry: FlutterPluginRegistry) { + DeviceInfoPlusMacosPlugin.register(with: registry.registrar(forPlugin: "DeviceInfoPlusMacosPlugin")) + FileSelectorPlugin.register(with: registry.registrar(forPlugin: "FileSelectorPlugin")) + FLTFirebaseAuthPlugin.register(with: registry.registrar(forPlugin: "FLTFirebaseAuthPlugin")) + FLTFirebaseCorePlugin.register(with: registry.registrar(forPlugin: "FLTFirebaseCorePlugin")) + FLTFirebaseMessagingPlugin.register(with: registry.registrar(forPlugin: "FLTFirebaseMessagingPlugin")) + FlutterImageCompressMacosPlugin.register(with: registry.registrar(forPlugin: "FlutterImageCompressMacosPlugin")) + FlutterLocalNotificationsPlugin.register(with: registry.registrar(forPlugin: "FlutterLocalNotificationsPlugin")) + FlutterSecureStoragePlugin.register(with: registry.registrar(forPlugin: "FlutterSecureStoragePlugin")) + FLTGoogleSignInPlugin.register(with: registry.registrar(forPlugin: "FLTGoogleSignInPlugin")) + SharePlusMacosPlugin.register(with: registry.registrar(forPlugin: "SharePlusMacosPlugin")) + SqflitePlugin.register(with: registry.registrar(forPlugin: "SqflitePlugin")) + UrlLauncherPlugin.register(with: registry.registrar(forPlugin: "UrlLauncherPlugin")) +} diff --git a/siro_service/macos/Podfile b/siro_service/macos/Podfile new file mode 100644 index 0000000..29c8eb3 --- /dev/null +++ b/siro_service/macos/Podfile @@ -0,0 +1,42 @@ +platform :osx, '10.14' + +# CocoaPods analytics sends network stats synchronously affecting flutter build latency. +ENV['COCOAPODS_DISABLE_STATS'] = 'true' + +project 'Runner', { + 'Debug' => :debug, + 'Profile' => :release, + 'Release' => :release, +} + +def flutter_root + generated_xcode_build_settings_path = File.expand_path(File.join('..', 'Flutter', 'ephemeral', 'Flutter-Generated.xcconfig'), __FILE__) + unless File.exist?(generated_xcode_build_settings_path) + raise "#{generated_xcode_build_settings_path} must exist. If you're running pod install manually, make sure \"flutter pub get\" is executed first" + end + + File.foreach(generated_xcode_build_settings_path) do |line| + matches = line.match(/FLUTTER_ROOT\=(.*)/) + return matches[1].strip if matches + end + raise "FLUTTER_ROOT not found in #{generated_xcode_build_settings_path}. Try deleting Flutter-Generated.xcconfig, then run \"flutter pub get\"" +end + +require File.expand_path(File.join('packages', 'flutter_tools', 'bin', 'podhelper'), flutter_root) + +flutter_macos_podfile_setup + +target 'Runner' do + use_frameworks! + + flutter_install_all_macos_pods File.dirname(File.realpath(__FILE__)) + target 'RunnerTests' do + inherit! :search_paths + end +end + +post_install do |installer| + installer.pods_project.targets.each do |target| + flutter_additional_macos_build_settings(target) + end +end diff --git a/siro_service/macos/Runner.xcodeproj/project.pbxproj b/siro_service/macos/Runner.xcodeproj/project.pbxproj new file mode 100644 index 0000000..7c10135 --- /dev/null +++ b/siro_service/macos/Runner.xcodeproj/project.pbxproj @@ -0,0 +1,705 @@ +// !$*UTF8*$! +{ + archiveVersion = 1; + classes = { + }; + objectVersion = 54; + objects = { + +/* Begin PBXAggregateTarget section */ + 33CC111A2044C6BA0003C045 /* Flutter Assemble */ = { + isa = PBXAggregateTarget; + buildConfigurationList = 33CC111B2044C6BA0003C045 /* Build configuration list for PBXAggregateTarget "Flutter Assemble" */; + buildPhases = ( + 33CC111E2044C6BF0003C045 /* ShellScript */, + ); + dependencies = ( + ); + name = "Flutter Assemble"; + productName = FLX; + }; +/* End PBXAggregateTarget section */ + +/* Begin PBXBuildFile section */ + 331C80D8294CF71000263BE5 /* RunnerTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 331C80D7294CF71000263BE5 /* RunnerTests.swift */; }; + 335BBD1B22A9A15E00E9071D /* GeneratedPluginRegistrant.swift in Sources */ = {isa = PBXBuildFile; fileRef = 335BBD1A22A9A15E00E9071D /* GeneratedPluginRegistrant.swift */; }; + 33CC10F12044A3C60003C045 /* AppDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 33CC10F02044A3C60003C045 /* AppDelegate.swift */; }; + 33CC10F32044A3C60003C045 /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 33CC10F22044A3C60003C045 /* Assets.xcassets */; }; + 33CC10F62044A3C60003C045 /* MainMenu.xib in Resources */ = {isa = PBXBuildFile; fileRef = 33CC10F42044A3C60003C045 /* MainMenu.xib */; }; + 33CC11132044BFA00003C045 /* MainFlutterWindow.swift in Sources */ = {isa = PBXBuildFile; fileRef = 33CC11122044BFA00003C045 /* MainFlutterWindow.swift */; }; +/* End PBXBuildFile section */ + +/* Begin PBXContainerItemProxy section */ + 331C80D9294CF71000263BE5 /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = 33CC10E52044A3C60003C045 /* Project object */; + proxyType = 1; + remoteGlobalIDString = 33CC10EC2044A3C60003C045; + remoteInfo = Runner; + }; + 33CC111F2044C79F0003C045 /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = 33CC10E52044A3C60003C045 /* Project object */; + proxyType = 1; + remoteGlobalIDString = 33CC111A2044C6BA0003C045; + remoteInfo = FLX; + }; +/* End PBXContainerItemProxy section */ + +/* Begin PBXCopyFilesBuildPhase section */ + 33CC110E2044A8840003C045 /* Bundle Framework */ = { + isa = PBXCopyFilesBuildPhase; + buildActionMask = 2147483647; + dstPath = ""; + dstSubfolderSpec = 10; + files = ( + ); + name = "Bundle Framework"; + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXCopyFilesBuildPhase section */ + +/* Begin PBXFileReference section */ + 331C80D5294CF71000263BE5 /* RunnerTests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = RunnerTests.xctest; sourceTree = BUILT_PRODUCTS_DIR; }; + 331C80D7294CF71000263BE5 /* RunnerTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = RunnerTests.swift; sourceTree = ""; }; + 333000ED22D3DE5D00554162 /* Warnings.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; path = Warnings.xcconfig; sourceTree = ""; }; + 335BBD1A22A9A15E00E9071D /* GeneratedPluginRegistrant.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = GeneratedPluginRegistrant.swift; sourceTree = ""; }; + 33CC10ED2044A3C60003C045 /* service_intaleq.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = "service_intaleq.app"; sourceTree = BUILT_PRODUCTS_DIR; }; + 33CC10F02044A3C60003C045 /* AppDelegate.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AppDelegate.swift; sourceTree = ""; }; + 33CC10F22044A3C60003C045 /* Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; name = Assets.xcassets; path = Runner/Assets.xcassets; sourceTree = ""; }; + 33CC10F52044A3C60003C045 /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.xib; name = Base; path = Base.lproj/MainMenu.xib; sourceTree = ""; }; + 33CC10F72044A3C60003C045 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; name = Info.plist; path = Runner/Info.plist; sourceTree = ""; }; + 33CC11122044BFA00003C045 /* MainFlutterWindow.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MainFlutterWindow.swift; sourceTree = ""; }; + 33CEB47222A05771004F2AC0 /* Flutter-Debug.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; path = "Flutter-Debug.xcconfig"; sourceTree = ""; }; + 33CEB47422A05771004F2AC0 /* Flutter-Release.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; path = "Flutter-Release.xcconfig"; sourceTree = ""; }; + 33CEB47722A0578A004F2AC0 /* Flutter-Generated.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; name = "Flutter-Generated.xcconfig"; path = "ephemeral/Flutter-Generated.xcconfig"; sourceTree = ""; }; + 33E51913231747F40026EE4D /* DebugProfile.entitlements */ = {isa = PBXFileReference; lastKnownFileType = text.plist.entitlements; path = DebugProfile.entitlements; sourceTree = ""; }; + 33E51914231749380026EE4D /* Release.entitlements */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.entitlements; path = Release.entitlements; sourceTree = ""; }; + 33E5194F232828860026EE4D /* AppInfo.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; path = AppInfo.xcconfig; sourceTree = ""; }; + 7AFA3C8E1D35360C0083082E /* Release.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; path = Release.xcconfig; sourceTree = ""; }; + 9740EEB21CF90195004384FC /* Debug.xcconfig */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xcconfig; path = Debug.xcconfig; sourceTree = ""; }; +/* End PBXFileReference section */ + +/* Begin PBXFrameworksBuildPhase section */ + 331C80D2294CF70F00263BE5 /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + runOnlyForDeploymentPostprocessing = 0; + }; + 33CC10EA2044A3C60003C045 /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXFrameworksBuildPhase section */ + +/* Begin PBXGroup section */ + 331C80D6294CF71000263BE5 /* RunnerTests */ = { + isa = PBXGroup; + children = ( + 331C80D7294CF71000263BE5 /* RunnerTests.swift */, + ); + path = RunnerTests; + sourceTree = ""; + }; + 33BA886A226E78AF003329D5 /* Configs */ = { + isa = PBXGroup; + children = ( + 33E5194F232828860026EE4D /* AppInfo.xcconfig */, + 9740EEB21CF90195004384FC /* Debug.xcconfig */, + 7AFA3C8E1D35360C0083082E /* Release.xcconfig */, + 333000ED22D3DE5D00554162 /* Warnings.xcconfig */, + ); + path = Configs; + sourceTree = ""; + }; + 33CC10E42044A3C60003C045 = { + isa = PBXGroup; + children = ( + 33FAB671232836740065AC1E /* Runner */, + 33CEB47122A05771004F2AC0 /* Flutter */, + 331C80D6294CF71000263BE5 /* RunnerTests */, + 33CC10EE2044A3C60003C045 /* Products */, + D73912EC22F37F3D000D13A0 /* Frameworks */, + ); + sourceTree = ""; + }; + 33CC10EE2044A3C60003C045 /* Products */ = { + isa = PBXGroup; + children = ( + 33CC10ED2044A3C60003C045 /* service_intaleq.app */, + 331C80D5294CF71000263BE5 /* RunnerTests.xctest */, + ); + name = Products; + sourceTree = ""; + }; + 33CC11242044D66E0003C045 /* Resources */ = { + isa = PBXGroup; + children = ( + 33CC10F22044A3C60003C045 /* Assets.xcassets */, + 33CC10F42044A3C60003C045 /* MainMenu.xib */, + 33CC10F72044A3C60003C045 /* Info.plist */, + ); + name = Resources; + path = ..; + sourceTree = ""; + }; + 33CEB47122A05771004F2AC0 /* Flutter */ = { + isa = PBXGroup; + children = ( + 335BBD1A22A9A15E00E9071D /* GeneratedPluginRegistrant.swift */, + 33CEB47222A05771004F2AC0 /* Flutter-Debug.xcconfig */, + 33CEB47422A05771004F2AC0 /* Flutter-Release.xcconfig */, + 33CEB47722A0578A004F2AC0 /* Flutter-Generated.xcconfig */, + ); + path = Flutter; + sourceTree = ""; + }; + 33FAB671232836740065AC1E /* Runner */ = { + isa = PBXGroup; + children = ( + 33CC10F02044A3C60003C045 /* AppDelegate.swift */, + 33CC11122044BFA00003C045 /* MainFlutterWindow.swift */, + 33E51913231747F40026EE4D /* DebugProfile.entitlements */, + 33E51914231749380026EE4D /* Release.entitlements */, + 33CC11242044D66E0003C045 /* Resources */, + 33BA886A226E78AF003329D5 /* Configs */, + ); + path = Runner; + sourceTree = ""; + }; + D73912EC22F37F3D000D13A0 /* Frameworks */ = { + isa = PBXGroup; + children = ( + ); + name = Frameworks; + sourceTree = ""; + }; +/* End PBXGroup section */ + +/* Begin PBXNativeTarget section */ + 331C80D4294CF70F00263BE5 /* RunnerTests */ = { + isa = PBXNativeTarget; + buildConfigurationList = 331C80DE294CF71000263BE5 /* Build configuration list for PBXNativeTarget "RunnerTests" */; + buildPhases = ( + 331C80D1294CF70F00263BE5 /* Sources */, + 331C80D2294CF70F00263BE5 /* Frameworks */, + 331C80D3294CF70F00263BE5 /* Resources */, + ); + buildRules = ( + ); + dependencies = ( + 331C80DA294CF71000263BE5 /* PBXTargetDependency */, + ); + name = RunnerTests; + productName = RunnerTests; + productReference = 331C80D5294CF71000263BE5 /* RunnerTests.xctest */; + productType = "com.apple.product-type.bundle.unit-test"; + }; + 33CC10EC2044A3C60003C045 /* Runner */ = { + isa = PBXNativeTarget; + buildConfigurationList = 33CC10FB2044A3C60003C045 /* Build configuration list for PBXNativeTarget "Runner" */; + buildPhases = ( + 33CC10E92044A3C60003C045 /* Sources */, + 33CC10EA2044A3C60003C045 /* Frameworks */, + 33CC10EB2044A3C60003C045 /* Resources */, + 33CC110E2044A8840003C045 /* Bundle Framework */, + 3399D490228B24CF009A79C7 /* ShellScript */, + ); + buildRules = ( + ); + dependencies = ( + 33CC11202044C79F0003C045 /* PBXTargetDependency */, + ); + name = Runner; + productName = Runner; + productReference = 33CC10ED2044A3C60003C045 /* service_intaleq.app */; + productType = "com.apple.product-type.application"; + }; +/* End PBXNativeTarget section */ + +/* Begin PBXProject section */ + 33CC10E52044A3C60003C045 /* Project object */ = { + isa = PBXProject; + attributes = { + BuildIndependentTargetsInParallel = YES; + LastSwiftUpdateCheck = 0920; + LastUpgradeCheck = 1510; + ORGANIZATIONNAME = ""; + TargetAttributes = { + 331C80D4294CF70F00263BE5 = { + CreatedOnToolsVersion = 14.0; + TestTargetID = 33CC10EC2044A3C60003C045; + }; + 33CC10EC2044A3C60003C045 = { + CreatedOnToolsVersion = 9.2; + LastSwiftMigration = 1100; + ProvisioningStyle = Automatic; + SystemCapabilities = { + com.apple.Sandbox = { + enabled = 1; + }; + }; + }; + 33CC111A2044C6BA0003C045 = { + CreatedOnToolsVersion = 9.2; + ProvisioningStyle = Manual; + }; + }; + }; + buildConfigurationList = 33CC10E82044A3C60003C045 /* Build configuration list for PBXProject "Runner" */; + compatibilityVersion = "Xcode 9.3"; + developmentRegion = en; + hasScannedForEncodings = 0; + knownRegions = ( + en, + Base, + ); + mainGroup = 33CC10E42044A3C60003C045; + productRefGroup = 33CC10EE2044A3C60003C045 /* Products */; + projectDirPath = ""; + projectRoot = ""; + targets = ( + 33CC10EC2044A3C60003C045 /* Runner */, + 331C80D4294CF70F00263BE5 /* RunnerTests */, + 33CC111A2044C6BA0003C045 /* Flutter Assemble */, + ); + }; +/* End PBXProject section */ + +/* Begin PBXResourcesBuildPhase section */ + 331C80D3294CF70F00263BE5 /* Resources */ = { + isa = PBXResourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + runOnlyForDeploymentPostprocessing = 0; + }; + 33CC10EB2044A3C60003C045 /* Resources */ = { + isa = PBXResourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + 33CC10F32044A3C60003C045 /* Assets.xcassets in Resources */, + 33CC10F62044A3C60003C045 /* MainMenu.xib in Resources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXResourcesBuildPhase section */ + +/* Begin PBXShellScriptBuildPhase section */ + 3399D490228B24CF009A79C7 /* ShellScript */ = { + isa = PBXShellScriptBuildPhase; + alwaysOutOfDate = 1; + buildActionMask = 2147483647; + files = ( + ); + inputFileListPaths = ( + ); + inputPaths = ( + ); + outputFileListPaths = ( + ); + outputPaths = ( + ); + runOnlyForDeploymentPostprocessing = 0; + shellPath = /bin/sh; + shellScript = "echo \"$PRODUCT_NAME.app\" > \"$PROJECT_DIR\"/Flutter/ephemeral/.app_filename && \"$FLUTTER_ROOT\"/packages/flutter_tools/bin/macos_assemble.sh embed\n"; + }; + 33CC111E2044C6BF0003C045 /* ShellScript */ = { + isa = PBXShellScriptBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + inputFileListPaths = ( + Flutter/ephemeral/FlutterInputs.xcfilelist, + ); + inputPaths = ( + Flutter/ephemeral/tripwire, + ); + outputFileListPaths = ( + Flutter/ephemeral/FlutterOutputs.xcfilelist, + ); + outputPaths = ( + ); + runOnlyForDeploymentPostprocessing = 0; + shellPath = /bin/sh; + shellScript = "\"$FLUTTER_ROOT\"/packages/flutter_tools/bin/macos_assemble.sh && touch Flutter/ephemeral/tripwire"; + }; +/* End PBXShellScriptBuildPhase section */ + +/* Begin PBXSourcesBuildPhase section */ + 331C80D1294CF70F00263BE5 /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + 331C80D8294CF71000263BE5 /* RunnerTests.swift in Sources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + 33CC10E92044A3C60003C045 /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + 33CC11132044BFA00003C045 /* MainFlutterWindow.swift in Sources */, + 33CC10F12044A3C60003C045 /* AppDelegate.swift in Sources */, + 335BBD1B22A9A15E00E9071D /* GeneratedPluginRegistrant.swift in Sources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXSourcesBuildPhase section */ + +/* Begin PBXTargetDependency section */ + 331C80DA294CF71000263BE5 /* PBXTargetDependency */ = { + isa = PBXTargetDependency; + target = 33CC10EC2044A3C60003C045 /* Runner */; + targetProxy = 331C80D9294CF71000263BE5 /* PBXContainerItemProxy */; + }; + 33CC11202044C79F0003C045 /* PBXTargetDependency */ = { + isa = PBXTargetDependency; + target = 33CC111A2044C6BA0003C045 /* Flutter Assemble */; + targetProxy = 33CC111F2044C79F0003C045 /* PBXContainerItemProxy */; + }; +/* End PBXTargetDependency section */ + +/* Begin PBXVariantGroup section */ + 33CC10F42044A3C60003C045 /* MainMenu.xib */ = { + isa = PBXVariantGroup; + children = ( + 33CC10F52044A3C60003C045 /* Base */, + ); + name = MainMenu.xib; + path = Runner; + sourceTree = ""; + }; +/* End PBXVariantGroup section */ + +/* Begin XCBuildConfiguration section */ + 331C80DB294CF71000263BE5 /* Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + BUNDLE_LOADER = "$(TEST_HOST)"; + CURRENT_PROJECT_VERSION = 1; + GENERATE_INFOPLIST_FILE = YES; + MARKETING_VERSION = 1.0; + PRODUCT_BUNDLE_IDENTIFIER = com.example.serviceIntaleq.RunnerTests; + PRODUCT_NAME = "$(TARGET_NAME)"; + SWIFT_VERSION = 5.0; + TEST_HOST = "$(BUILT_PRODUCTS_DIR)/service_intaleq.app/$(BUNDLE_EXECUTABLE_FOLDER_PATH)/service_intaleq"; + }; + name = Debug; + }; + 331C80DC294CF71000263BE5 /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + BUNDLE_LOADER = "$(TEST_HOST)"; + CURRENT_PROJECT_VERSION = 1; + GENERATE_INFOPLIST_FILE = YES; + MARKETING_VERSION = 1.0; + PRODUCT_BUNDLE_IDENTIFIER = com.example.serviceIntaleq.RunnerTests; + PRODUCT_NAME = "$(TARGET_NAME)"; + SWIFT_VERSION = 5.0; + TEST_HOST = "$(BUILT_PRODUCTS_DIR)/service_intaleq.app/$(BUNDLE_EXECUTABLE_FOLDER_PATH)/service_intaleq"; + }; + name = Release; + }; + 331C80DD294CF71000263BE5 /* Profile */ = { + isa = XCBuildConfiguration; + buildSettings = { + BUNDLE_LOADER = "$(TEST_HOST)"; + CURRENT_PROJECT_VERSION = 1; + GENERATE_INFOPLIST_FILE = YES; + MARKETING_VERSION = 1.0; + PRODUCT_BUNDLE_IDENTIFIER = com.example.serviceIntaleq.RunnerTests; + PRODUCT_NAME = "$(TARGET_NAME)"; + SWIFT_VERSION = 5.0; + TEST_HOST = "$(BUILT_PRODUCTS_DIR)/service_intaleq.app/$(BUNDLE_EXECUTABLE_FOLDER_PATH)/service_intaleq"; + }; + name = Profile; + }; + 338D0CE9231458BD00FA5F75 /* Profile */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = 7AFA3C8E1D35360C0083082E /* Release.xcconfig */; + buildSettings = { + ALWAYS_SEARCH_USER_PATHS = NO; + ASSETCATALOG_COMPILER_GENERATE_SWIFT_ASSET_SYMBOL_EXTENSIONS = YES; + CLANG_ANALYZER_NONNULL = YES; + CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE; + CLANG_CXX_LANGUAGE_STANDARD = "gnu++14"; + CLANG_CXX_LIBRARY = "libc++"; + CLANG_ENABLE_MODULES = YES; + CLANG_ENABLE_OBJC_ARC = YES; + CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; + CLANG_WARN_BOOL_CONVERSION = YES; + CLANG_WARN_CONSTANT_CONVERSION = YES; + CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; + CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; + CLANG_WARN_DOCUMENTATION_COMMENTS = YES; + CLANG_WARN_EMPTY_BODY = YES; + CLANG_WARN_ENUM_CONVERSION = YES; + CLANG_WARN_INFINITE_RECURSION = YES; + CLANG_WARN_INT_CONVERSION = YES; + CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; + CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; + CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; + CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; + CLANG_WARN_SUSPICIOUS_MOVE = YES; + CODE_SIGN_IDENTITY = "-"; + COPY_PHASE_STRIP = NO; + DEAD_CODE_STRIPPING = YES; + DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; + ENABLE_NS_ASSERTIONS = NO; + ENABLE_STRICT_OBJC_MSGSEND = YES; + ENABLE_USER_SCRIPT_SANDBOXING = NO; + GCC_C_LANGUAGE_STANDARD = gnu11; + GCC_NO_COMMON_BLOCKS = YES; + GCC_WARN_64_TO_32_BIT_CONVERSION = YES; + GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; + GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; + GCC_WARN_UNUSED_FUNCTION = YES; + GCC_WARN_UNUSED_VARIABLE = YES; + MACOSX_DEPLOYMENT_TARGET = 10.14; + MTL_ENABLE_DEBUG_INFO = NO; + SDKROOT = macosx; + SWIFT_COMPILATION_MODE = wholemodule; + SWIFT_OPTIMIZATION_LEVEL = "-O"; + }; + name = Profile; + }; + 338D0CEA231458BD00FA5F75 /* Profile */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = 33E5194F232828860026EE4D /* AppInfo.xcconfig */; + buildSettings = { + ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; + CLANG_ENABLE_MODULES = YES; + CODE_SIGN_ENTITLEMENTS = Runner/DebugProfile.entitlements; + CODE_SIGN_STYLE = Automatic; + COMBINE_HIDPI_IMAGES = YES; + INFOPLIST_FILE = Runner/Info.plist; + LD_RUNPATH_SEARCH_PATHS = ( + "$(inherited)", + "@executable_path/../Frameworks", + ); + PROVISIONING_PROFILE_SPECIFIER = ""; + SWIFT_VERSION = 5.0; + }; + name = Profile; + }; + 338D0CEB231458BD00FA5F75 /* Profile */ = { + isa = XCBuildConfiguration; + buildSettings = { + CODE_SIGN_STYLE = Manual; + PRODUCT_NAME = "$(TARGET_NAME)"; + }; + name = Profile; + }; + 33CC10F92044A3C60003C045 /* Debug */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = 9740EEB21CF90195004384FC /* Debug.xcconfig */; + buildSettings = { + ALWAYS_SEARCH_USER_PATHS = NO; + ASSETCATALOG_COMPILER_GENERATE_SWIFT_ASSET_SYMBOL_EXTENSIONS = YES; + CLANG_ANALYZER_NONNULL = YES; + CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE; + CLANG_CXX_LANGUAGE_STANDARD = "gnu++14"; + CLANG_CXX_LIBRARY = "libc++"; + CLANG_ENABLE_MODULES = YES; + CLANG_ENABLE_OBJC_ARC = YES; + CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; + CLANG_WARN_BOOL_CONVERSION = YES; + CLANG_WARN_CONSTANT_CONVERSION = YES; + CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; + CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; + CLANG_WARN_DOCUMENTATION_COMMENTS = YES; + CLANG_WARN_EMPTY_BODY = YES; + CLANG_WARN_ENUM_CONVERSION = YES; + CLANG_WARN_INFINITE_RECURSION = YES; + CLANG_WARN_INT_CONVERSION = YES; + CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; + CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; + CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; + CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; + CLANG_WARN_SUSPICIOUS_MOVE = YES; + CODE_SIGN_IDENTITY = "-"; + COPY_PHASE_STRIP = NO; + DEAD_CODE_STRIPPING = YES; + DEBUG_INFORMATION_FORMAT = dwarf; + ENABLE_STRICT_OBJC_MSGSEND = YES; + ENABLE_TESTABILITY = YES; + ENABLE_USER_SCRIPT_SANDBOXING = NO; + GCC_C_LANGUAGE_STANDARD = gnu11; + GCC_DYNAMIC_NO_PIC = NO; + GCC_NO_COMMON_BLOCKS = YES; + GCC_OPTIMIZATION_LEVEL = 0; + GCC_PREPROCESSOR_DEFINITIONS = ( + "DEBUG=1", + "$(inherited)", + ); + GCC_WARN_64_TO_32_BIT_CONVERSION = YES; + GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; + GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; + GCC_WARN_UNUSED_FUNCTION = YES; + GCC_WARN_UNUSED_VARIABLE = YES; + MACOSX_DEPLOYMENT_TARGET = 10.14; + MTL_ENABLE_DEBUG_INFO = YES; + ONLY_ACTIVE_ARCH = YES; + SDKROOT = macosx; + SWIFT_ACTIVE_COMPILATION_CONDITIONS = DEBUG; + SWIFT_OPTIMIZATION_LEVEL = "-Onone"; + }; + name = Debug; + }; + 33CC10FA2044A3C60003C045 /* Release */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = 7AFA3C8E1D35360C0083082E /* Release.xcconfig */; + buildSettings = { + ALWAYS_SEARCH_USER_PATHS = NO; + ASSETCATALOG_COMPILER_GENERATE_SWIFT_ASSET_SYMBOL_EXTENSIONS = YES; + CLANG_ANALYZER_NONNULL = YES; + CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE; + CLANG_CXX_LANGUAGE_STANDARD = "gnu++14"; + CLANG_CXX_LIBRARY = "libc++"; + CLANG_ENABLE_MODULES = YES; + CLANG_ENABLE_OBJC_ARC = YES; + CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; + CLANG_WARN_BOOL_CONVERSION = YES; + CLANG_WARN_CONSTANT_CONVERSION = YES; + CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; + CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; + CLANG_WARN_DOCUMENTATION_COMMENTS = YES; + CLANG_WARN_EMPTY_BODY = YES; + CLANG_WARN_ENUM_CONVERSION = YES; + CLANG_WARN_INFINITE_RECURSION = YES; + CLANG_WARN_INT_CONVERSION = YES; + CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; + CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; + CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; + CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; + CLANG_WARN_SUSPICIOUS_MOVE = YES; + CODE_SIGN_IDENTITY = "-"; + COPY_PHASE_STRIP = NO; + DEAD_CODE_STRIPPING = YES; + DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; + ENABLE_NS_ASSERTIONS = NO; + ENABLE_STRICT_OBJC_MSGSEND = YES; + ENABLE_USER_SCRIPT_SANDBOXING = NO; + GCC_C_LANGUAGE_STANDARD = gnu11; + GCC_NO_COMMON_BLOCKS = YES; + GCC_WARN_64_TO_32_BIT_CONVERSION = YES; + GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; + GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; + GCC_WARN_UNUSED_FUNCTION = YES; + GCC_WARN_UNUSED_VARIABLE = YES; + MACOSX_DEPLOYMENT_TARGET = 10.14; + MTL_ENABLE_DEBUG_INFO = NO; + SDKROOT = macosx; + SWIFT_COMPILATION_MODE = wholemodule; + SWIFT_OPTIMIZATION_LEVEL = "-O"; + }; + name = Release; + }; + 33CC10FC2044A3C60003C045 /* Debug */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = 33E5194F232828860026EE4D /* AppInfo.xcconfig */; + buildSettings = { + ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; + CLANG_ENABLE_MODULES = YES; + CODE_SIGN_ENTITLEMENTS = Runner/DebugProfile.entitlements; + CODE_SIGN_STYLE = Automatic; + COMBINE_HIDPI_IMAGES = YES; + INFOPLIST_FILE = Runner/Info.plist; + LD_RUNPATH_SEARCH_PATHS = ( + "$(inherited)", + "@executable_path/../Frameworks", + ); + PROVISIONING_PROFILE_SPECIFIER = ""; + SWIFT_OPTIMIZATION_LEVEL = "-Onone"; + SWIFT_VERSION = 5.0; + }; + name = Debug; + }; + 33CC10FD2044A3C60003C045 /* Release */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = 33E5194F232828860026EE4D /* AppInfo.xcconfig */; + buildSettings = { + ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; + CLANG_ENABLE_MODULES = YES; + CODE_SIGN_ENTITLEMENTS = Runner/Release.entitlements; + CODE_SIGN_STYLE = Automatic; + COMBINE_HIDPI_IMAGES = YES; + INFOPLIST_FILE = Runner/Info.plist; + LD_RUNPATH_SEARCH_PATHS = ( + "$(inherited)", + "@executable_path/../Frameworks", + ); + PROVISIONING_PROFILE_SPECIFIER = ""; + SWIFT_VERSION = 5.0; + }; + name = Release; + }; + 33CC111C2044C6BA0003C045 /* Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + CODE_SIGN_STYLE = Manual; + PRODUCT_NAME = "$(TARGET_NAME)"; + }; + name = Debug; + }; + 33CC111D2044C6BA0003C045 /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + CODE_SIGN_STYLE = Automatic; + PRODUCT_NAME = "$(TARGET_NAME)"; + }; + name = Release; + }; +/* End XCBuildConfiguration section */ + +/* Begin XCConfigurationList section */ + 331C80DE294CF71000263BE5 /* Build configuration list for PBXNativeTarget "RunnerTests" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 331C80DB294CF71000263BE5 /* Debug */, + 331C80DC294CF71000263BE5 /* Release */, + 331C80DD294CF71000263BE5 /* Profile */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; + 33CC10E82044A3C60003C045 /* Build configuration list for PBXProject "Runner" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 33CC10F92044A3C60003C045 /* Debug */, + 33CC10FA2044A3C60003C045 /* Release */, + 338D0CE9231458BD00FA5F75 /* Profile */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; + 33CC10FB2044A3C60003C045 /* Build configuration list for PBXNativeTarget "Runner" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 33CC10FC2044A3C60003C045 /* Debug */, + 33CC10FD2044A3C60003C045 /* Release */, + 338D0CEA231458BD00FA5F75 /* Profile */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; + 33CC111B2044C6BA0003C045 /* Build configuration list for PBXAggregateTarget "Flutter Assemble" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 33CC111C2044C6BA0003C045 /* Debug */, + 33CC111D2044C6BA0003C045 /* Release */, + 338D0CEB231458BD00FA5F75 /* Profile */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; +/* End XCConfigurationList section */ + }; + rootObject = 33CC10E52044A3C60003C045 /* Project object */; +} diff --git a/siro_service/macos/Runner.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist b/siro_service/macos/Runner.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist new file mode 100644 index 0000000..18d9810 --- /dev/null +++ b/siro_service/macos/Runner.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist @@ -0,0 +1,8 @@ + + + + + IDEDidComputeMac32BitWarning + + + diff --git a/siro_service/macos/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme b/siro_service/macos/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme new file mode 100644 index 0000000..66efbd5 --- /dev/null +++ b/siro_service/macos/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme @@ -0,0 +1,99 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/siro_service/macos/Runner.xcworkspace/contents.xcworkspacedata b/siro_service/macos/Runner.xcworkspace/contents.xcworkspacedata new file mode 100644 index 0000000..1d526a1 --- /dev/null +++ b/siro_service/macos/Runner.xcworkspace/contents.xcworkspacedata @@ -0,0 +1,7 @@ + + + + + diff --git a/siro_service/macos/Runner.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist b/siro_service/macos/Runner.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist new file mode 100644 index 0000000..18d9810 --- /dev/null +++ b/siro_service/macos/Runner.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist @@ -0,0 +1,8 @@ + + + + + IDEDidComputeMac32BitWarning + + + diff --git a/siro_service/macos/Runner/AppDelegate.swift b/siro_service/macos/Runner/AppDelegate.swift new file mode 100644 index 0000000..b3c1761 --- /dev/null +++ b/siro_service/macos/Runner/AppDelegate.swift @@ -0,0 +1,13 @@ +import Cocoa +import FlutterMacOS + +@main +class AppDelegate: FlutterAppDelegate { + override func applicationShouldTerminateAfterLastWindowClosed(_ sender: NSApplication) -> Bool { + return true + } + + override func applicationSupportsSecureRestorableState(_ app: NSApplication) -> Bool { + return true + } +} diff --git a/siro_service/macos/Runner/Assets.xcassets/AppIcon.appiconset/Contents.json b/siro_service/macos/Runner/Assets.xcassets/AppIcon.appiconset/Contents.json new file mode 100644 index 0000000..96d3fee --- /dev/null +++ b/siro_service/macos/Runner/Assets.xcassets/AppIcon.appiconset/Contents.json @@ -0,0 +1,68 @@ +{ + "info": { + "version": 1, + "author": "xcode" + }, + "images": [ + { + "size": "16x16", + "idiom": "mac", + "filename": "app_icon_16.png", + "scale": "1x" + }, + { + "size": "16x16", + "idiom": "mac", + "filename": "app_icon_32.png", + "scale": "2x" + }, + { + "size": "32x32", + "idiom": "mac", + "filename": "app_icon_32.png", + "scale": "1x" + }, + { + "size": "32x32", + "idiom": "mac", + "filename": "app_icon_64.png", + "scale": "2x" + }, + { + "size": "128x128", + "idiom": "mac", + "filename": "app_icon_128.png", + "scale": "1x" + }, + { + "size": "128x128", + "idiom": "mac", + "filename": "app_icon_256.png", + "scale": "2x" + }, + { + "size": "256x256", + "idiom": "mac", + "filename": "app_icon_256.png", + "scale": "1x" + }, + { + "size": "256x256", + "idiom": "mac", + "filename": "app_icon_512.png", + "scale": "2x" + }, + { + "size": "512x512", + "idiom": "mac", + "filename": "app_icon_512.png", + "scale": "1x" + }, + { + "size": "512x512", + "idiom": "mac", + "filename": "app_icon_1024.png", + "scale": "2x" + } + ] +} \ No newline at end of file diff --git a/siro_service/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_1024.png b/siro_service/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_1024.png new file mode 100644 index 0000000..1201d04 Binary files /dev/null and b/siro_service/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_1024.png differ diff --git a/siro_service/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_128.png b/siro_service/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_128.png new file mode 100644 index 0000000..12fc7ef Binary files /dev/null and b/siro_service/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_128.png differ diff --git a/siro_service/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_16.png b/siro_service/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_16.png new file mode 100644 index 0000000..fa89e26 Binary files /dev/null and b/siro_service/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_16.png differ diff --git a/siro_service/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_256.png b/siro_service/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_256.png new file mode 100644 index 0000000..0be5f8e Binary files /dev/null and b/siro_service/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_256.png differ diff --git a/siro_service/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_32.png b/siro_service/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_32.png new file mode 100644 index 0000000..71a60ee Binary files /dev/null and b/siro_service/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_32.png differ diff --git a/siro_service/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_512.png b/siro_service/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_512.png new file mode 100644 index 0000000..09711c7 Binary files /dev/null and b/siro_service/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_512.png differ diff --git a/siro_service/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_64.png b/siro_service/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_64.png new file mode 100644 index 0000000..c6a08a5 Binary files /dev/null and b/siro_service/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_64.png differ diff --git a/siro_service/macos/Runner/Base.lproj/MainMenu.xib b/siro_service/macos/Runner/Base.lproj/MainMenu.xib new file mode 100644 index 0000000..80e867a --- /dev/null +++ b/siro_service/macos/Runner/Base.lproj/MainMenu.xib @@ -0,0 +1,343 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/siro_service/macos/Runner/Configs/AppInfo.xcconfig b/siro_service/macos/Runner/Configs/AppInfo.xcconfig new file mode 100644 index 0000000..b423053 --- /dev/null +++ b/siro_service/macos/Runner/Configs/AppInfo.xcconfig @@ -0,0 +1,14 @@ +// Application-level settings for the Runner target. +// +// This may be replaced with something auto-generated from metadata (e.g., pubspec.yaml) in the +// future. If not, the values below would default to using the project name when this becomes a +// 'flutter create' template. + +// The application's name. By default this is also the title of the Flutter window. +PRODUCT_NAME = service_intaleq + +// The application's bundle identifier +PRODUCT_BUNDLE_IDENTIFIER = com.example.serviceIntaleq + +// The copyright displayed in application information +PRODUCT_COPYRIGHT = Copyright © 2025 com.example. All rights reserved. diff --git a/siro_service/macos/Runner/Configs/Debug.xcconfig b/siro_service/macos/Runner/Configs/Debug.xcconfig new file mode 100644 index 0000000..36b0fd9 --- /dev/null +++ b/siro_service/macos/Runner/Configs/Debug.xcconfig @@ -0,0 +1,2 @@ +#include "../../Flutter/Flutter-Debug.xcconfig" +#include "Warnings.xcconfig" diff --git a/siro_service/macos/Runner/Configs/Release.xcconfig b/siro_service/macos/Runner/Configs/Release.xcconfig new file mode 100644 index 0000000..dff4f49 --- /dev/null +++ b/siro_service/macos/Runner/Configs/Release.xcconfig @@ -0,0 +1,2 @@ +#include "../../Flutter/Flutter-Release.xcconfig" +#include "Warnings.xcconfig" diff --git a/siro_service/macos/Runner/Configs/Warnings.xcconfig b/siro_service/macos/Runner/Configs/Warnings.xcconfig new file mode 100644 index 0000000..42bcbf4 --- /dev/null +++ b/siro_service/macos/Runner/Configs/Warnings.xcconfig @@ -0,0 +1,13 @@ +WARNING_CFLAGS = -Wall -Wconditional-uninitialized -Wnullable-to-nonnull-conversion -Wmissing-method-return-type -Woverlength-strings +GCC_WARN_UNDECLARED_SELECTOR = YES +CLANG_UNDEFINED_BEHAVIOR_SANITIZER_NULLABILITY = YES +CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE +CLANG_WARN__DUPLICATE_METHOD_MATCH = YES +CLANG_WARN_PRAGMA_PACK = YES +CLANG_WARN_STRICT_PROTOTYPES = YES +CLANG_WARN_COMMA = YES +GCC_WARN_STRICT_SELECTOR_MATCH = YES +CLANG_WARN_OBJC_REPEATED_USE_OF_WEAK = YES +CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES +GCC_WARN_SHADOW = YES +CLANG_WARN_UNREACHABLE_CODE = YES diff --git a/siro_service/macos/Runner/DebugProfile.entitlements b/siro_service/macos/Runner/DebugProfile.entitlements new file mode 100644 index 0000000..dddb8a3 --- /dev/null +++ b/siro_service/macos/Runner/DebugProfile.entitlements @@ -0,0 +1,12 @@ + + + + + com.apple.security.app-sandbox + + com.apple.security.cs.allow-jit + + com.apple.security.network.server + + + diff --git a/siro_service/macos/Runner/Info.plist b/siro_service/macos/Runner/Info.plist new file mode 100644 index 0000000..4789daa --- /dev/null +++ b/siro_service/macos/Runner/Info.plist @@ -0,0 +1,32 @@ + + + + + CFBundleDevelopmentRegion + $(DEVELOPMENT_LANGUAGE) + CFBundleExecutable + $(EXECUTABLE_NAME) + CFBundleIconFile + + CFBundleIdentifier + $(PRODUCT_BUNDLE_IDENTIFIER) + CFBundleInfoDictionaryVersion + 6.0 + CFBundleName + $(PRODUCT_NAME) + CFBundlePackageType + APPL + CFBundleShortVersionString + $(FLUTTER_BUILD_NAME) + CFBundleVersion + $(FLUTTER_BUILD_NUMBER) + LSMinimumSystemVersion + $(MACOSX_DEPLOYMENT_TARGET) + NSHumanReadableCopyright + $(PRODUCT_COPYRIGHT) + NSMainNibFile + MainMenu + NSPrincipalClass + NSApplication + + diff --git a/siro_service/macos/Runner/MainFlutterWindow.swift b/siro_service/macos/Runner/MainFlutterWindow.swift new file mode 100644 index 0000000..3cc05eb --- /dev/null +++ b/siro_service/macos/Runner/MainFlutterWindow.swift @@ -0,0 +1,15 @@ +import Cocoa +import FlutterMacOS + +class MainFlutterWindow: NSWindow { + override func awakeFromNib() { + let flutterViewController = FlutterViewController() + let windowFrame = self.frame + self.contentViewController = flutterViewController + self.setFrame(windowFrame, display: true) + + RegisterGeneratedPlugins(registry: flutterViewController) + + super.awakeFromNib() + } +} diff --git a/siro_service/macos/Runner/Release.entitlements b/siro_service/macos/Runner/Release.entitlements new file mode 100644 index 0000000..852fa1a --- /dev/null +++ b/siro_service/macos/Runner/Release.entitlements @@ -0,0 +1,8 @@ + + + + + com.apple.security.app-sandbox + + + diff --git a/siro_service/macos/RunnerTests/RunnerTests.swift b/siro_service/macos/RunnerTests/RunnerTests.swift new file mode 100644 index 0000000..61f3bd1 --- /dev/null +++ b/siro_service/macos/RunnerTests/RunnerTests.swift @@ -0,0 +1,12 @@ +import Cocoa +import FlutterMacOS +import XCTest + +class RunnerTests: XCTestCase { + + func testExample() { + // If you add code to the Runner application, consider adding tests here. + // See https://developer.apple.com/documentation/xctest for more information about using XCTest. + } + +} diff --git a/siro_service/pubspec.lock b/siro_service/pubspec.lock new file mode 100644 index 0000000..fc6ab67 --- /dev/null +++ b/siro_service/pubspec.lock @@ -0,0 +1,1465 @@ +# Generated by pub +# See https://dart.dev/tools/pub/glossary#lockfile +packages: + _fe_analyzer_shared: + dependency: transitive + description: + name: _fe_analyzer_shared + sha256: "8d7ff3948166b8ec5da0fbb5962000926b8e02f2ed9b3e51d1738905fbd4c98d" + url: "https://pub.dev" + source: hosted + version: "93.0.0" + _flutterfire_internals: + dependency: transitive + description: + name: _flutterfire_internals + sha256: "0d1f0adfabbab9f46a1a80ce84a4d8b852b6e4dbf53ce413b30e0cf7d3631b71" + url: "https://pub.dev" + source: hosted + version: "1.3.72" + analyzer: + dependency: transitive + description: + name: analyzer + sha256: de7148ed2fcec579b19f122c1800933dfa028f6d9fd38a152b04b1516cec120b + url: "https://pub.dev" + source: hosted + version: "10.0.1" + archive: + dependency: transitive + description: + name: archive + sha256: a96e8b390886ee8abb49b7bd3ac8df6f451c621619f52a26e815fdcf568959ff + url: "https://pub.dev" + source: hosted + version: "4.0.9" + args: + dependency: transitive + description: + name: args + sha256: d0481093c50b1da8910eb0bb301626d4d8eb7284aa739614d2b394ee09e3ea04 + url: "https://pub.dev" + source: hosted + version: "2.7.0" + asn1lib: + dependency: transitive + description: + name: asn1lib + sha256: "9a8f69025044eb466b9b60ef3bc3ac99b4dc6c158ae9c56d25eeccf5bc56d024" + url: "https://pub.dev" + source: hosted + version: "1.6.5" + async: + dependency: transitive + description: + name: async + sha256: e2eb0491ba5ddb6177742d2da23904574082139b07c1e33b8503b9f46f3e1a37 + url: "https://pub.dev" + source: hosted + version: "2.13.1" + boolean_selector: + dependency: transitive + description: + name: boolean_selector + sha256: "8aab1771e1243a5063b8b0ff68042d67334e3feab9e95b9490f9a6ebf73b42ea" + url: "https://pub.dev" + source: hosted + version: "2.1.2" + build: + dependency: transitive + description: + name: build + sha256: a156715e7cd728130c592f30552575908aae5b100005fbc1f0fb16b3c03a3d10 + url: "https://pub.dev" + source: hosted + version: "4.0.6" + build_config: + dependency: transitive + description: + name: build_config + sha256: "4070d2a59f8eec34c97c86ceb44403834899075f66e8a9d59706f8e7834f6f71" + url: "https://pub.dev" + source: hosted + version: "1.3.0" + build_daemon: + dependency: transitive + description: + name: build_daemon + sha256: bf05f6e12cfea92d3c09308d7bcdab1906cd8a179b023269eed00c071004b957 + url: "https://pub.dev" + source: hosted + version: "4.1.1" + build_runner: + dependency: "direct dev" + description: + name: build_runner + sha256: "1523ce62448ebac2c15a8ba5fbad8acac169788658a7dd2a1c2d9c2a9318b9a6" + url: "https://pub.dev" + source: hosted + version: "2.15.0" + built_collection: + dependency: transitive + description: + name: built_collection + sha256: "376e3dd27b51ea877c28d525560790aee2e6fbb5f20e2f85d5081027d94e2100" + url: "https://pub.dev" + source: hosted + version: "5.1.1" + built_value: + dependency: transitive + description: + name: built_value + sha256: "34e4067d30ce212937df995f03b69992eea683539ceeac7f679a1f1eba055b56" + url: "https://pub.dev" + source: hosted + version: "8.12.6" + characters: + dependency: transitive + description: + name: characters + sha256: faf38497bda5ead2a8c7615f4f7939df04333478bf32e4173fcb06d428b5716b + url: "https://pub.dev" + source: hosted + version: "1.4.1" + checked_yaml: + dependency: transitive + description: + name: checked_yaml + sha256: "959525d3162f249993882720d52b7e0c833978df229be20702b33d48d91de70f" + url: "https://pub.dev" + source: hosted + version: "2.0.4" + cli_util: + dependency: transitive + description: + name: cli_util + sha256: ff6785f7e9e3c38ac98b2fb035701789de90154024a75b6cb926445e83197d1c + url: "https://pub.dev" + source: hosted + version: "0.4.2" + clock: + dependency: transitive + description: + name: clock + sha256: fddb70d9b5277016c77a80201021d40a2247104d9f4aa7bab7157b7e3f05b84b + url: "https://pub.dev" + source: hosted + version: "1.1.2" + code_assets: + dependency: transitive + description: + name: code_assets + sha256: bf394f466ba9205f1812a0433b392d6af280f155f56651eda7c18cc32ed493b8 + url: "https://pub.dev" + source: hosted + version: "1.2.1" + code_builder: + dependency: transitive + description: + name: code_builder + sha256: "6a6cab2ba4680d6423f34a9b972a4c9a94ebe1b62ecec4e1a1f2cba91fd1319d" + url: "https://pub.dev" + source: hosted + version: "4.11.1" + collection: + dependency: transitive + description: + name: collection + sha256: "2f5709ae4d3d59dd8f7cd309b4e023046b57d8a6c82130785d2b0e5868084e76" + url: "https://pub.dev" + source: hosted + version: "1.19.1" + convert: + dependency: transitive + description: + name: convert + sha256: b30acd5944035672bc15c6b7a8b47d773e41e2f17de064350988c5d02adb1c68 + url: "https://pub.dev" + source: hosted + version: "3.1.2" + cross_file: + dependency: transitive + description: + name: cross_file + sha256: "28bb3ae56f117b5aec029d702a90f57d285cd975c3c5c281eaca38dbc47c5937" + url: "https://pub.dev" + source: hosted + version: "0.3.5+2" + crypto: + dependency: "direct main" + description: + name: crypto + sha256: c8ea0233063ba03258fbcf2ca4d6dadfefe14f02fab57702265467a19f27fadf + url: "https://pub.dev" + source: hosted + version: "3.0.7" + cupertino_icons: + dependency: "direct main" + description: + name: cupertino_icons + sha256: "41e005c33bd814be4d3096aff55b1908d419fde52ca656c8c47719ec745873cd" + url: "https://pub.dev" + source: hosted + version: "1.0.9" + dart_style: + dependency: transitive + description: + name: dart_style + sha256: "29f7ecc274a86d32920b1d9cfc7502fa87220da41ec60b55f329559d5732e2b2" + url: "https://pub.dev" + source: hosted + version: "3.1.7" + dbus: + dependency: transitive + description: + name: dbus + sha256: "0ce9b0a839e6dee59a37a623d2fc26a35bbbe6404213e419b0d6411023d62645" + url: "https://pub.dev" + source: hosted + version: "0.7.14" + device_info_plus: + dependency: "direct main" + description: + name: device_info_plus + sha256: "98f28b42168cc509abc92f88518882fd58061ea372d7999aecc424345c7bff6a" + url: "https://pub.dev" + source: hosted + version: "11.5.0" + device_info_plus_platform_interface: + dependency: transitive + description: + name: device_info_plus_platform_interface + sha256: e1ea89119e34903dca74b883d0dd78eb762814f97fb6c76f35e9ff74d261a18f + url: "https://pub.dev" + source: hosted + version: "7.0.3" + encrypt: + dependency: "direct main" + description: + name: encrypt + sha256: "62d9aa4670cc2a8798bab89b39fc71b6dfbacf615de6cf5001fb39f7e4a996a2" + url: "https://pub.dev" + source: hosted + version: "5.0.3" + envied: + dependency: "direct main" + description: + name: envied + sha256: "42132a746494b0a7bc19062cdddd3a01694f696caca684456ff01526c833decc" + url: "https://pub.dev" + source: hosted + version: "1.3.5" + envied_generator: + dependency: "direct dev" + description: + name: envied_generator + sha256: e1e66498080f531e89d9ea7971f96b287dffdd05df16efdd31f9f74faa77e005 + url: "https://pub.dev" + source: hosted + version: "1.3.5" + equatable: + dependency: transitive + description: + name: equatable + sha256: "3e0141505477fd8ad55d6eb4e7776d3fe8430be8e497ccb1521370c3f21a3e2b" + url: "https://pub.dev" + source: hosted + version: "2.0.8" + fake_async: + dependency: transitive + description: + name: fake_async + sha256: "5368f224a74523e8d2e7399ea1638b37aecfca824a3cc4dfdf77bf1fa905ac44" + url: "https://pub.dev" + source: hosted + version: "1.3.3" + ffi: + dependency: transitive + description: + name: ffi + sha256: "6d7fd89431262d8f3125e81b50d3847a091d846eafcd4fdb88dd06f36d705a45" + url: "https://pub.dev" + source: hosted + version: "2.2.0" + file: + dependency: transitive + description: + name: file + sha256: a3b4f84adafef897088c160faf7dfffb7696046cb13ae90b508c2cbc95d3b8d4 + url: "https://pub.dev" + source: hosted + version: "7.0.1" + file_selector_linux: + dependency: transitive + description: + name: file_selector_linux + sha256: "2567f398e06ac72dcf2e98a0c95df2a9edd03c2c2e0cacd4780f20cdf56263a0" + url: "https://pub.dev" + source: hosted + version: "0.9.4" + file_selector_macos: + dependency: transitive + description: + name: file_selector_macos + sha256: "5e0bbe9c312416f1787a68259ea1505b52f258c587f12920422671807c4d618a" + url: "https://pub.dev" + source: hosted + version: "0.9.5" + file_selector_platform_interface: + dependency: transitive + description: + name: file_selector_platform_interface + sha256: "35e0bd61ebcdb91a3505813b055b09b79dfdc7d0aee9c09a7ba59ae4bb13dc85" + url: "https://pub.dev" + source: hosted + version: "2.7.0" + file_selector_windows: + dependency: transitive + description: + name: file_selector_windows + sha256: "62197474ae75893a62df75939c777763d39c2bc5f73ce5b88497208bc269abfd" + url: "https://pub.dev" + source: hosted + version: "0.9.3+5" + firebase_auth: + dependency: "direct main" + description: + name: firebase_auth + sha256: "9905a315f1235a649e29df19b246adde7350a11234837cd605254b8e25144711" + url: "https://pub.dev" + source: hosted + version: "6.5.2" + firebase_auth_platform_interface: + dependency: transitive + description: + name: firebase_auth_platform_interface + sha256: f757dc5636ce2b204a82383f7246ef0d9c925f9e96c8c9a4a6c315d673d662bb + url: "https://pub.dev" + source: hosted + version: "9.0.2" + firebase_auth_web: + dependency: transitive + description: + name: firebase_auth_web + sha256: "1c44330eef3c82068e0c2919b6b015897d49211dcccdf64f90a2ed73ce216ecb" + url: "https://pub.dev" + source: hosted + version: "6.2.2" + firebase_core: + dependency: "direct main" + description: + name: firebase_core + sha256: ec46a100a560d3bd5f97f2d89ba7492cb09b6dd0a4a28753d1258f360d6bd9f9 + url: "https://pub.dev" + source: hosted + version: "4.10.0" + firebase_core_platform_interface: + dependency: transitive + description: + name: firebase_core_platform_interface + sha256: "4a120366dbf7d5a8ee9438978530b664b855728fb8dcc3a201017660817e555b" + url: "https://pub.dev" + source: hosted + version: "7.0.1" + firebase_core_web: + dependency: transitive + description: + name: firebase_core_web + sha256: "5ad1be848692ec148f2d6a8ad2a3838cb852ea5f3c9e6479a7afce479e1854f8" + url: "https://pub.dev" + source: hosted + version: "3.8.0" + firebase_messaging: + dependency: "direct main" + description: + name: firebase_messaging + sha256: "9651e833454156b9f0927eaedccffba0f7f6a6e20ceddef82517211e7017e9c4" + url: "https://pub.dev" + source: hosted + version: "16.3.0" + firebase_messaging_platform_interface: + dependency: transitive + description: + name: firebase_messaging_platform_interface + sha256: "292bb5dc9c4a429078895406c347d7c7690deb858c1adeed8f4b4346f769dfa3" + url: "https://pub.dev" + source: hosted + version: "4.8.0" + firebase_messaging_web: + dependency: transitive + description: + name: firebase_messaging_web + sha256: "08c565bc83729439f5de2dfea77b4832002b705eb2f840366cefa80e4e5c3c66" + url: "https://pub.dev" + source: hosted + version: "4.2.0" + fixnum: + dependency: transitive + description: + name: fixnum + sha256: b6dc7065e46c974bc7c5f143080a6764ec7a4be6da1285ececdc37be96de53be + url: "https://pub.dev" + source: hosted + version: "1.1.1" + flutter: + dependency: "direct main" + description: flutter + source: sdk + version: "0.0.0" + flutter_image_compress: + dependency: "direct main" + description: + name: flutter_image_compress + sha256: "51d23be39efc2185e72e290042a0da41aed70b14ef97db362a6b5368d0523b27" + url: "https://pub.dev" + source: hosted + version: "2.4.0" + flutter_image_compress_common: + dependency: transitive + description: + name: flutter_image_compress_common + sha256: c5c5d50c15e97dd7dc72ff96bd7077b9f791932f2076c5c5b6c43f2c88607bfb + url: "https://pub.dev" + source: hosted + version: "1.0.6" + flutter_image_compress_macos: + dependency: transitive + description: + name: flutter_image_compress_macos + sha256: "20019719b71b743aba0ef874ed29c50747461e5e8438980dfa5c2031898f7337" + url: "https://pub.dev" + source: hosted + version: "1.0.3" + flutter_image_compress_ohos: + dependency: transitive + description: + name: flutter_image_compress_ohos + sha256: e76b92bbc830ee08f5b05962fc78a532011fcd2041f620b5400a593e96da3f51 + url: "https://pub.dev" + source: hosted + version: "0.0.3" + flutter_image_compress_platform_interface: + dependency: transitive + description: + name: flutter_image_compress_platform_interface + sha256: "579cb3947fd4309103afe6442a01ca01e1e6f93dc53bb4cbd090e8ce34a41889" + url: "https://pub.dev" + source: hosted + version: "1.0.5" + flutter_image_compress_web: + dependency: transitive + description: + name: flutter_image_compress_web + sha256: b9b141ac7c686a2ce7bb9a98176321e1182c9074650e47bb140741a44b6f5a96 + url: "https://pub.dev" + source: hosted + version: "0.1.5" + flutter_launcher_icons: + dependency: "direct main" + description: + name: flutter_launcher_icons + sha256: "10f13781741a2e3972126fae08393d3c4e01fa4cd7473326b94b72cf594195e7" + url: "https://pub.dev" + source: hosted + version: "0.14.4" + flutter_lints: + dependency: "direct dev" + description: + name: flutter_lints + sha256: "3105dc8492f6183fb076ccf1f351ac3d60564bff92e20bfc4af9cc1651f4e7e1" + url: "https://pub.dev" + source: hosted + version: "6.0.0" + flutter_local_notifications: + dependency: "direct main" + description: + name: flutter_local_notifications + sha256: "19ffb0a8bb7407875555e5e98d7343a633bb73707bae6c6a5f37c90014077875" + url: "https://pub.dev" + source: hosted + version: "19.5.0" + flutter_local_notifications_linux: + dependency: transitive + description: + name: flutter_local_notifications_linux + sha256: e3c277b2daab8e36ac5a6820536668d07e83851aeeb79c446e525a70710770a5 + url: "https://pub.dev" + source: hosted + version: "6.0.0" + flutter_local_notifications_platform_interface: + dependency: transitive + description: + name: flutter_local_notifications_platform_interface + sha256: "277d25d960c15674ce78ca97f57d0bae2ee401c844b6ac80fcd972a9c99d09fe" + url: "https://pub.dev" + source: hosted + version: "9.1.0" + flutter_local_notifications_windows: + dependency: transitive + description: + name: flutter_local_notifications_windows + sha256: "8d658f0d367c48bd420e7cf2d26655e2d1130147bca1eea917e576ca76668aaf" + url: "https://pub.dev" + source: hosted + version: "1.0.3" + flutter_plugin_android_lifecycle: + dependency: transitive + description: + name: flutter_plugin_android_lifecycle + sha256: "3854fe5e3bff0b113c658f260b90c95dea17c92db0f2addeac2e343dd9969785" + url: "https://pub.dev" + source: hosted + version: "2.0.35" + flutter_secure_storage: + dependency: "direct main" + description: + name: flutter_secure_storage + sha256: "9cad52d75ebc511adfae3d447d5d13da15a55a92c9410e50f67335b6d21d16ea" + url: "https://pub.dev" + source: hosted + version: "9.2.4" + flutter_secure_storage_linux: + dependency: transitive + description: + name: flutter_secure_storage_linux + sha256: be76c1d24a97d0b98f8b54bce6b481a380a6590df992d0098f868ad54dc8f688 + url: "https://pub.dev" + source: hosted + version: "1.2.3" + flutter_secure_storage_macos: + dependency: transitive + description: + name: flutter_secure_storage_macos + sha256: "6c0a2795a2d1de26ae202a0d78527d163f4acbb11cde4c75c670f3a0fc064247" + url: "https://pub.dev" + source: hosted + version: "3.1.3" + flutter_secure_storage_platform_interface: + dependency: transitive + description: + name: flutter_secure_storage_platform_interface + sha256: cf91ad32ce5adef6fba4d736a542baca9daf3beac4db2d04be350b87f69ac4a8 + url: "https://pub.dev" + source: hosted + version: "1.1.2" + flutter_secure_storage_web: + dependency: transitive + description: + name: flutter_secure_storage_web + sha256: f4ebff989b4f07b2656fb16b47852c0aab9fed9b4ec1c70103368337bc1886a9 + url: "https://pub.dev" + source: hosted + version: "1.2.1" + flutter_secure_storage_windows: + dependency: transitive + description: + name: flutter_secure_storage_windows + sha256: b20b07cb5ed4ed74fc567b78a72936203f587eba460af1df11281c9326cd3709 + url: "https://pub.dev" + source: hosted + version: "3.1.2" + flutter_test: + dependency: "direct dev" + description: flutter + source: sdk + version: "0.0.0" + flutter_web_plugins: + dependency: transitive + description: flutter + source: sdk + version: "0.0.0" + get: + dependency: "direct main" + description: + name: get + sha256: "5ed34a7925b85336e15d472cc4cfe7d9ebf4ab8e8b9f688585bf6b50f4c3d79a" + url: "https://pub.dev" + source: hosted + version: "4.7.3" + get_storage: + dependency: "direct main" + description: + name: get_storage + sha256: "39db1fffe779d0c22b3a744376e86febe4ade43bf65e06eab5af707dc84185a2" + url: "https://pub.dev" + source: hosted + version: "2.1.1" + glob: + dependency: transitive + description: + name: glob + sha256: c3f1ee72c96f8f78935e18aa8cecced9ab132419e8625dc187e1c2408efc20de + url: "https://pub.dev" + source: hosted + version: "2.1.3" + google_fonts: + dependency: "direct main" + description: + name: google_fonts + sha256: ba03d03bcaa2f6cb7bd920e3b5027181db75ab524f8891c8bc3aa603885b8055 + url: "https://pub.dev" + source: hosted + version: "6.3.3" + google_identity_services_web: + dependency: transitive + description: + name: google_identity_services_web + sha256: "5d187c46dc59e02646e10fe82665fc3884a9b71bc1c90c2b8b749316d33ee454" + url: "https://pub.dev" + source: hosted + version: "0.3.3+1" + google_sign_in: + dependency: "direct main" + description: + name: google_sign_in + sha256: "521031b65853b4409b8213c0387d57edaad7e2a949ce6dea0d8b2afc9cb29763" + url: "https://pub.dev" + source: hosted + version: "7.2.0" + google_sign_in_android: + dependency: transitive + description: + name: google_sign_in_android + sha256: df5c15533814ed20b7d9e1c5a40a73f174e5d5017bd2669b1c72fb6596fde812 + url: "https://pub.dev" + source: hosted + version: "7.2.11" + google_sign_in_ios: + dependency: transitive + description: + name: google_sign_in_ios + sha256: ac1e4c1205267cb7999d1d81333fccffdfda29e853f434bbaf71525498bb6950 + url: "https://pub.dev" + source: hosted + version: "6.3.0" + google_sign_in_platform_interface: + dependency: transitive + description: + name: google_sign_in_platform_interface + sha256: "7f59208c42b415a3cca203571128d6f84f885fead2d5b53eb65a9e27f2965bb5" + url: "https://pub.dev" + source: hosted + version: "3.1.0" + google_sign_in_web: + dependency: transitive + description: + name: google_sign_in_web + sha256: d473003eeca892f96a01a64fc803378be765071cb0c265ee872c7f8683245d14 + url: "https://pub.dev" + source: hosted + version: "1.1.3" + graphs: + dependency: transitive + description: + name: graphs + sha256: "741bbf84165310a68ff28fe9e727332eef1407342fca52759cb21ad8177bb8d0" + url: "https://pub.dev" + source: hosted + version: "2.3.2" + hooks: + dependency: transitive + description: + name: hooks + sha256: "9a62a50b50b769a737bc0a8ff381f333529df3ab746b2f6b02e83760231455ba" + url: "https://pub.dev" + source: hosted + version: "2.0.2" + http: + dependency: "direct main" + description: + name: http + sha256: "87721a4a50b19c7f1d49001e51409bddc46303966ce89a65af4f4e6004896412" + url: "https://pub.dev" + source: hosted + version: "1.6.0" + http_multi_server: + dependency: transitive + description: + name: http_multi_server + sha256: aa6199f908078bb1c5efb8d8638d4ae191aac11b311132c3ef48ce352fb52ef8 + url: "https://pub.dev" + source: hosted + version: "3.2.2" + http_parser: + dependency: transitive + description: + name: http_parser + sha256: "178d74305e7866013777bab2c3d8726205dc5a4dd935297175b19a23a2e66571" + url: "https://pub.dev" + source: hosted + version: "4.1.2" + image: + dependency: "direct main" + description: + name: image + sha256: f9881ff4998044947ec38d098bc7c8316ae1186fa786eddffdb867b9bc94dfce + url: "https://pub.dev" + source: hosted + version: "4.8.0" + image_cropper: + dependency: "direct main" + description: + name: image_cropper + sha256: "4e9c96c029eb5a23798da1b6af39787f964da6ffc78fd8447c140542a9f7c6fc" + url: "https://pub.dev" + source: hosted + version: "9.1.0" + image_cropper_for_web: + dependency: transitive + description: + name: image_cropper_for_web + sha256: fd81ebe36f636576094377aab32673c4e5d1609b32dec16fad98d2b71f1250a9 + url: "https://pub.dev" + source: hosted + version: "6.1.0" + image_cropper_platform_interface: + dependency: transitive + description: + name: image_cropper_platform_interface + sha256: "2d8db8f4b638e448fa89a1e77cd8f053b4547472bd3ae073169e86626d03afef" + url: "https://pub.dev" + source: hosted + version: "7.2.0" + image_picker: + dependency: "direct main" + description: + name: image_picker + sha256: "91c025426c2881c551100bce834e201c835a170151545f58d17da5180ca7d9ac" + url: "https://pub.dev" + source: hosted + version: "1.2.2" + image_picker_android: + dependency: transitive + description: + name: image_picker_android + sha256: d5b3e1774af29c9ab00103afb0d4614070f924d2e0057ac867ec98800114793f + url: "https://pub.dev" + source: hosted + version: "0.8.13+17" + image_picker_for_web: + dependency: transitive + description: + name: image_picker_for_web + sha256: "66257a3191ab360d23a55c8241c91a6e329d31e94efa7be9cf7a212e65850214" + url: "https://pub.dev" + source: hosted + version: "3.1.1" + image_picker_ios: + dependency: transitive + description: + name: image_picker_ios + sha256: b9c4a438a9ff4f60808c9cf0039b93a42bb6c2211ef6ebb647394b2b3fa84588 + url: "https://pub.dev" + source: hosted + version: "0.8.13+6" + image_picker_linux: + dependency: transitive + description: + name: image_picker_linux + sha256: "1f81c5f2046b9ab724f85523e4af65be1d47b038160a8c8deed909762c308ed4" + url: "https://pub.dev" + source: hosted + version: "0.2.2" + image_picker_macos: + dependency: transitive + description: + name: image_picker_macos + sha256: "86f0f15a309de7e1a552c12df9ce5b59fe927e71385329355aec4776c6a8ec91" + url: "https://pub.dev" + source: hosted + version: "0.2.2+1" + image_picker_platform_interface: + dependency: transitive + description: + name: image_picker_platform_interface + sha256: "567e056716333a1647c64bb6bd873cff7622233a5c3f694be28a583d4715690c" + url: "https://pub.dev" + source: hosted + version: "2.11.1" + image_picker_windows: + dependency: transitive + description: + name: image_picker_windows + sha256: d248c86554a72b5495a31c56f060cf73a41c7ff541689327b1a7dbccc33adfae + url: "https://pub.dev" + source: hosted + version: "0.2.2" + intl: + dependency: "direct main" + description: + name: intl + sha256: "3df61194eb431efc39c4ceba583b95633a403f46c9fd341e550ce0bfa50e9aa5" + url: "https://pub.dev" + source: hosted + version: "0.20.2" + io: + dependency: transitive + description: + name: io + sha256: dfd5a80599cf0165756e3181807ed3e77daf6dd4137caaad72d0b7931597650b + url: "https://pub.dev" + source: hosted + version: "1.0.5" + jni: + dependency: transitive + description: + name: jni + sha256: c2230682d5bc2362c1c9e8d3c7f406d9cbba23ab3f2e203a025dd47e0fb2e68f + url: "https://pub.dev" + source: hosted + version: "1.0.0" + jni_flutter: + dependency: transitive + description: + name: jni_flutter + sha256: "8b59e590786050b1cd866677dddaf76b1ade5e7bc751abe04b86e84d379d3ba6" + url: "https://pub.dev" + source: hosted + version: "1.0.1" + js: + dependency: transitive + description: + name: js + sha256: f2c445dce49627136094980615a031419f7f3eb393237e4ecd97ac15dea343f3 + url: "https://pub.dev" + source: hosted + version: "0.6.7" + json_annotation: + dependency: transitive + description: + name: json_annotation + sha256: "2a743920d81b7910627f68ee2c9ac1fc0bfee32b9fc3403587d7c6791ca12f80" + url: "https://pub.dev" + source: hosted + version: "4.12.0" + jwt_decoder: + dependency: "direct main" + description: + name: jwt_decoder + sha256: "54774aebf83f2923b99e6416b4ea915d47af3bde56884eb622de85feabbc559f" + url: "https://pub.dev" + source: hosted + version: "2.0.1" + leak_tracker: + dependency: transitive + description: + name: leak_tracker + sha256: "33e2e26bdd85a0112ec15400c8cbffea70d0f9c3407491f672a2fad47915e2de" + url: "https://pub.dev" + source: hosted + version: "11.0.2" + leak_tracker_flutter_testing: + dependency: transitive + description: + name: leak_tracker_flutter_testing + sha256: "1dbc140bb5a23c75ea9c4811222756104fbcd1a27173f0c34ca01e16bea473c1" + url: "https://pub.dev" + source: hosted + version: "3.0.10" + leak_tracker_testing: + dependency: transitive + description: + name: leak_tracker_testing + sha256: "8d5a2d49f4a66b49744b23b018848400d23e54caf9463f4eb20df3eb8acb2eb1" + url: "https://pub.dev" + source: hosted + version: "3.0.2" + lints: + dependency: transitive + description: + name: lints + sha256: "12f842a479589fea194fe5c5a3095abc7be0c1f2ddfa9a0e76aed1dbd26a87df" + url: "https://pub.dev" + source: hosted + version: "6.1.0" + logging: + dependency: transitive + description: + name: logging + sha256: c8245ada5f1717ed44271ed1c26b8ce85ca3228fd2ffdb75468ab01979309d61 + url: "https://pub.dev" + source: hosted + version: "1.3.0" + matcher: + dependency: transitive + description: + name: matcher + sha256: "12956d0ad8390bbcc63ca2e1469c0619946ccb52809807067a7020d57e647aa6" + url: "https://pub.dev" + source: hosted + version: "0.12.18" + material_color_utilities: + dependency: transitive + description: + name: material_color_utilities + sha256: "9c337007e82b1889149c82ed242ed1cb24a66044e30979c44912381e9be4c48b" + url: "https://pub.dev" + source: hosted + version: "0.13.0" + meta: + dependency: transitive + description: + name: meta + sha256: "23f08335362185a5ea2ad3a4e597f1375e78bce8a040df5c600c8d3552ef2394" + url: "https://pub.dev" + source: hosted + version: "1.17.0" + mime: + dependency: transitive + description: + name: mime + sha256: "801fd0b26f14a4a58ccb09d5892c3fbdeff209594300a542492cf13fba9d247a" + url: "https://pub.dev" + source: hosted + version: "1.0.6" + objective_c: + dependency: transitive + description: + name: objective_c + sha256: "6cb691c686fa2838c6deb34980d426145c2a5d537491cb83d463c33cdbc726ed" + url: "https://pub.dev" + source: hosted + version: "9.4.1" + package_config: + dependency: transitive + description: + name: package_config + sha256: f096c55ebb7deb7e384101542bfba8c52696c1b56fca2eb62827989ef2353bbc + url: "https://pub.dev" + source: hosted + version: "2.2.0" + path: + dependency: "direct main" + description: + name: path + sha256: "75cca69d1490965be98c73ceaea117e8a04dd21217b37b292c9ddbec0d955bc5" + url: "https://pub.dev" + source: hosted + version: "1.9.1" + path_provider: + dependency: transitive + description: + name: path_provider + sha256: "50c5dd5b6e1aaf6fb3a78b33f6aa3afca52bf903a8a5298f53101fdaee55bbcd" + url: "https://pub.dev" + source: hosted + version: "2.1.5" + path_provider_android: + dependency: transitive + description: + name: path_provider_android + sha256: "69cbd515a62b94d32a7944f086b2f82b4ac40a1d45bebfc00813a430ab2dabcd" + url: "https://pub.dev" + source: hosted + version: "2.3.1" + path_provider_foundation: + dependency: transitive + description: + name: path_provider_foundation + sha256: "2a376b7d6392d80cd3705782d2caa734ca4727776db0b6ec36ef3f1855197699" + url: "https://pub.dev" + source: hosted + version: "2.6.0" + path_provider_linux: + dependency: transitive + description: + name: path_provider_linux + sha256: f7a1fe3a634fe7734c8d3f2766ad746ae2a2884abe22e241a8b301bf5cac3279 + url: "https://pub.dev" + source: hosted + version: "2.2.1" + path_provider_platform_interface: + dependency: transitive + description: + name: path_provider_platform_interface + sha256: "88f5779f72ba699763fa3a3b06aa4bf6de76c8e5de842cf6f29e2e06476c2334" + url: "https://pub.dev" + source: hosted + version: "2.1.2" + path_provider_windows: + dependency: transitive + description: + name: path_provider_windows + sha256: bd6f00dbd873bfb70d0761682da2b3a2c2fccc2b9e84c495821639601d81afe7 + url: "https://pub.dev" + source: hosted + version: "2.3.0" + permission_handler: + dependency: "direct main" + description: + name: permission_handler + sha256: fe54465bcc62a4564c6e4db337bbaded6c0c0fa6e10487414436d163114784f6 + url: "https://pub.dev" + source: hosted + version: "12.0.3" + permission_handler_android: + dependency: transitive + description: + name: permission_handler_android + sha256: "1e3bc410ca1bf84662104b100eb126e066cb55791b7451307f9708d4007350e6" + url: "https://pub.dev" + source: hosted + version: "13.0.1" + permission_handler_apple: + dependency: transitive + description: + name: permission_handler_apple + sha256: e20daf680eef1ca62ffe8c8c526b778cc386d50137c77ac71c8ec9c88c13fb9d + url: "https://pub.dev" + source: hosted + version: "9.4.9" + permission_handler_html: + dependency: transitive + description: + name: permission_handler_html + sha256: "38f000e83355abb3392140f6bc3030660cfaef189e1f87824facb76300b4ff24" + url: "https://pub.dev" + source: hosted + version: "0.1.3+5" + permission_handler_platform_interface: + dependency: transitive + description: + name: permission_handler_platform_interface + sha256: eb99b295153abce5d683cac8c02e22faab63e50679b937fa1bf67d58bb282878 + url: "https://pub.dev" + source: hosted + version: "4.3.0" + permission_handler_windows: + dependency: transitive + description: + name: permission_handler_windows + sha256: "1a790728016f79a41216d88672dbc5df30e686e811ad4e698bfc51f76ad91f1e" + url: "https://pub.dev" + source: hosted + version: "0.2.1" + petitparser: + dependency: transitive + description: + name: petitparser + sha256: "91bd59303e9f769f108f8df05e371341b15d59e995e6806aefab827b58336675" + url: "https://pub.dev" + source: hosted + version: "7.0.2" + platform: + dependency: transitive + description: + name: platform + sha256: "5d6b1b0036a5f331ebc77c850ebc8506cbc1e9416c27e59b439f917a902a4984" + url: "https://pub.dev" + source: hosted + version: "3.1.6" + plugin_platform_interface: + dependency: transitive + description: + name: plugin_platform_interface + sha256: "4820fbfdb9478b1ebae27888254d445073732dae3d6ea81f0b7e06d5dedc3f02" + url: "https://pub.dev" + source: hosted + version: "2.1.8" + pointycastle: + dependency: transitive + description: + name: pointycastle + sha256: "4be0097fcf3fd3e8449e53730c631200ebc7b88016acecab2b0da2f0149222fe" + url: "https://pub.dev" + source: hosted + version: "3.9.1" + pool: + dependency: transitive + description: + name: pool + sha256: "978783255c543aa3586a1b3c21f6e9d720eb315376a915872c61ef8b5c20177d" + url: "https://pub.dev" + source: hosted + version: "1.5.2" + posix: + dependency: transitive + description: + name: posix + sha256: "185ef7606574f789b40f289c233efa52e96dead518aed988e040a10737febb07" + url: "https://pub.dev" + source: hosted + version: "6.5.0" + pub_semver: + dependency: transitive + description: + name: pub_semver + sha256: "5bfcf68ca79ef689f8990d1160781b4bad40a3bd5e5218ad4076ddb7f4081585" + url: "https://pub.dev" + source: hosted + version: "2.2.0" + pubspec_parse: + dependency: transitive + description: + name: pubspec_parse + sha256: "0560ba233314abbed0a48a2956f7f022cce7c3e1e73df540277da7544cad4082" + url: "https://pub.dev" + source: hosted + version: "1.5.0" + recase: + dependency: transitive + description: + name: recase + sha256: e4eb4ec2dcdee52dcf99cb4ceabaffc631d7424ee55e56f280bc039737f89213 + url: "https://pub.dev" + source: hosted + version: "4.1.0" + record_use: + dependency: transitive + description: + name: record_use + sha256: "2551bd8eecfe95d14ae75f6021ad0248be5c27f138c2ec12fcb52b500b3ba1ed" + url: "https://pub.dev" + source: hosted + version: "0.6.0" + secure_string_operations: + dependency: "direct main" + description: + path: secure_string_operations + relative: true + source: path + version: "1.0.0" + share_plus: + dependency: "direct main" + description: + name: share_plus + sha256: "3ef39599b00059db0990ca2e30fca0a29d8b37aae924d60063f8e0184cf20900" + url: "https://pub.dev" + source: hosted + version: "7.2.2" + share_plus_platform_interface: + dependency: transitive + description: + name: share_plus_platform_interface + sha256: "251eb156a8b5fa9ce033747d73535bf53911071f8d3b6f4f0b578505ce0d4496" + url: "https://pub.dev" + source: hosted + version: "3.4.0" + shelf: + dependency: transitive + description: + name: shelf + sha256: e7dd780a7ffb623c57850b33f43309312fc863fb6aa3d276a754bb299839ef12 + url: "https://pub.dev" + source: hosted + version: "1.4.2" + shelf_web_socket: + dependency: transitive + description: + name: shelf_web_socket + sha256: "3632775c8e90d6c9712f883e633716432a27758216dfb61bd86a8321c0580925" + url: "https://pub.dev" + source: hosted + version: "3.0.0" + sky_engine: + dependency: transitive + description: flutter + source: sdk + version: "0.0.0" + source_gen: + dependency: transitive + description: + name: source_gen + sha256: ec37cc0e6694374cbef59ed79685572c870a54ede6fa30a3e420feb3adffea02 + url: "https://pub.dev" + source: hosted + version: "4.2.3" + source_span: + dependency: transitive + description: + name: source_span + sha256: "56a02f1f4cd1a2d96303c0144c93bd6d909eea6bee6bf5a0e0b685edbd4c47ab" + url: "https://pub.dev" + source: hosted + version: "1.10.2" + sqflite: + dependency: "direct main" + description: + name: sqflite + sha256: "564cfed0746fe53140c23b70b308e045c3b31f17778f2f326ccb7d804ea0250a" + url: "https://pub.dev" + source: hosted + version: "2.4.2+1" + sqflite_android: + dependency: transitive + description: + name: sqflite_android + sha256: "881e28efdcc9950fd8e9bb42713dcf1103e62a2e7168f23c9338d82db13dec40" + url: "https://pub.dev" + source: hosted + version: "2.4.2+3" + sqflite_common: + dependency: transitive + description: + name: sqflite_common + sha256: "1581ffbf7a0e333b380d6a30737d78516b826cb35beb7fb0bf8a3ea0c678b465" + url: "https://pub.dev" + source: hosted + version: "2.5.8" + sqflite_darwin: + dependency: transitive + description: + name: sqflite_darwin + sha256: "279832e5cde3fe99e8571879498c9211f3ca6391b0d818df4e17d9fff5c6ccb3" + url: "https://pub.dev" + source: hosted + version: "2.4.2" + sqflite_platform_interface: + dependency: transitive + description: + name: sqflite_platform_interface + sha256: "8dd4515c7bdcae0a785b0062859336de775e8c65db81ae33dd5445f35be61920" + url: "https://pub.dev" + source: hosted + version: "2.4.0" + stack_trace: + dependency: transitive + description: + name: stack_trace + sha256: "8b27215b45d22309b5cddda1aa2b19bdfec9df0e765f2de506401c071d38d1b1" + url: "https://pub.dev" + source: hosted + version: "1.12.1" + stream_channel: + dependency: transitive + description: + name: stream_channel + sha256: "969e04c80b8bcdf826f8f16579c7b14d780458bd97f56d107d3950fdbeef059d" + url: "https://pub.dev" + source: hosted + version: "2.1.4" + stream_transform: + dependency: transitive + description: + name: stream_transform + sha256: ad47125e588cfd37a9a7f86c7d6356dde8dfe89d071d293f80ca9e9273a33871 + url: "https://pub.dev" + source: hosted + version: "2.1.1" + string_scanner: + dependency: transitive + description: + name: string_scanner + sha256: "921cd31725b72fe181906c6a94d987c78e3b98c2e205b397ea399d4054872b43" + url: "https://pub.dev" + source: hosted + version: "1.4.1" + synchronized: + dependency: transitive + description: + name: synchronized + sha256: "63896c27e81b28f8cb4e69ead0d3e8f03f1d1e5fc531a3e579cabed6a2c7c9e5" + url: "https://pub.dev" + source: hosted + version: "3.4.0+1" + term_glyph: + dependency: transitive + description: + name: term_glyph + sha256: "7f554798625ea768a7518313e58f83891c7f5024f88e46e7182a4558850a4b8e" + url: "https://pub.dev" + source: hosted + version: "1.2.2" + test_api: + dependency: transitive + description: + name: test_api + sha256: "93167629bfc610f71560ab9312acdda4959de4df6fac7492c89ff0d3886f6636" + url: "https://pub.dev" + source: hosted + version: "0.7.9" + timezone: + dependency: transitive + description: + name: timezone + sha256: dd14a3b83cfd7cb19e7888f1cbc20f258b8d71b54c06f79ac585f14093a287d1 + url: "https://pub.dev" + source: hosted + version: "0.10.1" + typed_data: + dependency: transitive + description: + name: typed_data + sha256: f9049c039ebfeb4cf7a7104a675823cd72dba8297f264b6637062516699fa006 + url: "https://pub.dev" + source: hosted + version: "1.4.0" + url_launcher: + dependency: "direct main" + description: + name: url_launcher + sha256: f6a7e5c4835bb4e3026a04793a4199ca2d14c739ec378fdfe23fc8075d0439f8 + url: "https://pub.dev" + source: hosted + version: "6.3.2" + url_launcher_android: + dependency: transitive + description: + name: url_launcher_android + sha256: "17bc677f0b301615530dd1d67e0a9828cafa2d0b6b6eae4cd3679b7eac4a273c" + url: "https://pub.dev" + source: hosted + version: "6.3.30" + url_launcher_ios: + dependency: transitive + description: + name: url_launcher_ios + sha256: "580fe5dfb51671ae38191d316e027f6b76272b026370708c2d898799750a02b0" + url: "https://pub.dev" + source: hosted + version: "6.4.1" + url_launcher_linux: + dependency: transitive + description: + name: url_launcher_linux + sha256: d5e14138b3bc193a0f63c10a53c94b91d399df0512b1f29b94a043db7482384a + url: "https://pub.dev" + source: hosted + version: "3.2.2" + url_launcher_macos: + dependency: transitive + description: + name: url_launcher_macos + sha256: "368adf46f71ad3c21b8f06614adb38346f193f3a59ba8fe9a2fd74133070ba18" + url: "https://pub.dev" + source: hosted + version: "3.2.5" + url_launcher_platform_interface: + dependency: transitive + description: + name: url_launcher_platform_interface + sha256: "552f8a1e663569be95a8190206a38187b531910283c3e982193e4f2733f01029" + url: "https://pub.dev" + source: hosted + version: "2.3.2" + url_launcher_web: + dependency: transitive + description: + name: url_launcher_web + sha256: "85c81589622fbc87c1c683aaea164d3604a7777495a79d91e39ffcdec39ddb34" + url: "https://pub.dev" + source: hosted + version: "2.4.3" + url_launcher_windows: + dependency: transitive + description: + name: url_launcher_windows + sha256: "712c70ab1b99744ff066053cbe3e80c73332b38d46e5e945c98689b2e66fc15f" + url: "https://pub.dev" + source: hosted + version: "3.1.5" + uuid: + dependency: transitive + description: + name: uuid + sha256: "1fef9e8e11e2991bb773070d4656b7bd5d850967a2456cfc83cf47925ba79489" + url: "https://pub.dev" + source: hosted + version: "4.5.3" + vector_math: + dependency: transitive + description: + name: vector_math + sha256: d530bd74fea330e6e364cda7a85019c434070188383e1cd8d9777ee586914c5b + url: "https://pub.dev" + source: hosted + version: "2.2.0" + vibration: + dependency: "direct main" + description: + name: vibration + sha256: "9bb06614c69260f8bd11c80fe01ed7988905cf00e3417d656c2647e41f261d87" + url: "https://pub.dev" + source: hosted + version: "3.1.8" + vibration_platform_interface: + dependency: transitive + description: + name: vibration_platform_interface + sha256: "258c273268f8aa40c88d29741137c536874a738779b92ddb8aa32ed093721ec5" + url: "https://pub.dev" + source: hosted + version: "0.1.2" + vm_service: + dependency: transitive + description: + name: vm_service + sha256: "0016aef94fc66495ac78af5859181e3f3bf2026bd8eecc72b9565601e19ab360" + url: "https://pub.dev" + source: hosted + version: "15.2.0" + watcher: + dependency: transitive + description: + name: watcher + sha256: "1398c9f081a753f9226febe8900fce8f7d0a67163334e1c94a2438339d79d635" + url: "https://pub.dev" + source: hosted + version: "1.2.1" + web: + dependency: transitive + description: + name: web + sha256: "868d88a33d8a87b18ffc05f9f030ba328ffefba92d6c127917a2ba740f9cfe4a" + url: "https://pub.dev" + source: hosted + version: "1.1.1" + web_socket: + dependency: transitive + description: + name: web_socket + sha256: "34d64019aa8e36bf9842ac014bb5d2f5586ca73df5e4d9bf5c936975cae6982c" + url: "https://pub.dev" + source: hosted + version: "1.0.1" + web_socket_channel: + dependency: transitive + description: + name: web_socket_channel + sha256: d645757fb0f4773d602444000a8131ff5d48c9e47adfe9772652dd1a4f2d45c8 + url: "https://pub.dev" + source: hosted + version: "3.0.3" + win32: + dependency: transitive + description: + name: win32 + sha256: d7cb55e04cd34096cd3a79b3330245f54cb96a370a1c27adb3c84b917de8b08e + url: "https://pub.dev" + source: hosted + version: "5.15.0" + win32_registry: + dependency: transitive + description: + name: win32_registry + sha256: "6f1b564492d0147b330dd794fee8f512cec4977957f310f9951b5f9d83618dae" + url: "https://pub.dev" + source: hosted + version: "2.1.0" + xdg_directories: + dependency: transitive + description: + name: xdg_directories + sha256: "7a3f37b05d989967cdddcbb571f1ea834867ae2faa29725fd085180e0883aa15" + url: "https://pub.dev" + source: hosted + version: "1.1.0" + xml: + dependency: transitive + description: + name: xml + sha256: "971043b3a0d3da28727e40ed3e0b5d18b742fa5a68665cca88e74b7876d5e025" + url: "https://pub.dev" + source: hosted + version: "6.6.1" + yaml: + dependency: transitive + description: + name: yaml + sha256: b9da305ac7c39faa3f030eccd175340f968459dae4af175130b3fc47e40d76ce + url: "https://pub.dev" + source: hosted + version: "3.1.3" +sdks: + dart: ">=3.11.0 <4.0.0" + flutter: ">=3.38.4" diff --git a/siro_service/pubspec.yaml b/siro_service/pubspec.yaml new file mode 100644 index 0000000..e84e7f6 --- /dev/null +++ b/siro_service/pubspec.yaml @@ -0,0 +1,137 @@ +name: siro_service +description: "A new Flutter project." +# The following line prevents the package from being accidentally published to +# pub.dev using `flutter pub publish`. This is preferred for private packages. +publish_to: "none" # Remove this line if you wish to publish to pub.dev + +# The following defines the version and build number for your application. +# A version number is three numbers separated by dots, like 1.2.43 +# followed by an optional build number separated by a +. +# Both the version and the builder number may be overridden in flutter +# build by specifying --build-name and --build-number, respectively. +# In Android, build-name is used as versionName while build-number used as versionCode. +# Read more about Android versioning at https://developer.android.com/studio/publish/versioning +# In iOS, build-name is used as CFBundleShortVersionString while build-number is used as CFBundleVersion. +# Read more about iOS versioning at +# https://developer.apple.com/library/archive/documentation/General/Reference/InfoPlistKeyReference/Articles/CoreFoundationKeys.html +# In Windows, build-name is used as the major, minor, and patch parts +# of the product and file versions while build-number is used as the build suffix. +version: 1.0.0+1 + +environment: + sdk: ">=3.4.3 <4.0.0" + +# Dependencies specify other packages that your package needs in order to work. +# To automatically upgrade your package dependencies to the latest versions +# consider running `flutter pub upgrade --major-versions`. Alternatively, +# dependencies can be manually updated by changing the version numbers below to +# the latest version available on pub.dev. To see which dependencies have newer +# versions available, run `flutter pub outdated`. +dependencies: + flutter: + sdk: flutter + + # The following adds the Cupertino Icons font to your application. + # Use with the CupertinoIcons class for iOS style icons. + cupertino_icons: ^1.0.6 + device_info_plus: ^11.3.3 + + secure_string_operations: + path: ./secure_string_operations + firebase_messaging: ^16.0.0 + firebase_core: ^4.0.0 + path: ^1.9.0 + sqflite: ^2.3.3+1 + intl: ^0.20.2 + http: ^1.2.1 + get: ^4.6.6 + get_storage: ^2.1.1 + url_launcher: ^6.3.0 + flutter_launcher_icons: ^0.14.3 + envied: ^1.1.1 + google_sign_in: ^7.1.1 + firebase_auth: ^6.0.0 + vibration: ^3.1.3 + flutter_secure_storage: ^9.2.2 + crypto: ^3.0.3 + flutter_image_compress: ^2.3.0 + image: ^4.1.3 #to be remove + image_cropper: ^9.0.0 + image_picker: ^1.0.4 + # contacts_service: ^0.6.3 + permission_handler: ^12.0.1 + google_fonts: ^6.2.1 + jwt_decoder: ^2.0.1 + encrypt: ^5.0.3 + share_plus: ^7.2.1 + flutter_local_notifications: ^19.5.0 + +dev_dependencies: + flutter_test: + sdk: flutter + + # The "flutter_lints" package below contains a set of recommended lints to + # encourage good coding practices. The lint set provided by the package is + # activated in the `analysis_options.yaml` file located at the root of your + # package. See that file for information about deactivating specific lint + # rules and activating additional ones. + flutter_lints: ^6.0.0 + build_runner: ^2.4.11 + envied_generator: ^1.1.1 + +# For information on the generic Dart part of this file, see the +# following page: https://dart.dev/tools/pub/pubspec + +# The following section is specific to Flutter packages. +flutter: + # The following line ensures that the Material Icons font is + # included with your application, so that you can use the icons in + # the material Icons class. + uses-material-design: true +flutter_launcher_icons: + android: "launcher_icon" + ios: true + image_path: "assets/images/logo.png" + min_sdk_android: 21 + web: + generate: true + image_path: "assets/images/logo.png" + background_color: "#hexcode" + theme_color: "#hexcode" + windows: + generate: true + image_path: "assets/images/logo.png" + icon_size: 48 + macos: + generate: true + image_path: "assets/images/logo.png" + + # To add assets to your application, add an assets section, like this: + assets: + - assets/images/ + + # An image asset can refer to one or more resolution-specific "variants", see + # https://flutter.dev/assets-and-images/#resolution-aware + + # For details regarding adding assets from package dependencies, see + # https://flutter.dev/assets-and-images/#from-packages + + # To add custom fonts to your application, add a fonts section here, + # in this "flutter" section. Each entry in this list should have a + # "family" key with the font family name, and a "fonts" key with a + # list giving the asset and other descriptors for the font. For + # example: + # fonts: + # - family: Schyler + # fonts: + # - asset: fonts/Schyler-Regular.ttf + # - asset: fonts/Schyler-Italic.ttf + # style: italic + # - family: Trajan Pro + # fonts: + # - asset: fonts/TrajanPro.ttf + # - asset: fonts/TrajanPro_Bold.ttf + # weight: 700 + # + # For details regarding fonts from package dependencies, + # see https://flutter.dev/custom-fonts/#from-packages diff --git a/siro_service/secure_string_operations/lib/secure_string_operations.dart b/siro_service/secure_string_operations/lib/secure_string_operations.dart new file mode 100644 index 0000000..d428ac3 --- /dev/null +++ b/siro_service/secure_string_operations/lib/secure_string_operations.dart @@ -0,0 +1,47 @@ +// File: lib/secure_string_operations.dart + +library secure_string_operations; + +class X { + static String c(String a, Map b) { + StringBuffer c = StringBuffer(); + c.write(a); + + String d = "Bl"; + c.write(b[d] ?? d); + + StringBuffer e = StringBuffer(); + String f = c.toString(); + + for (int g = 0; g < f.length; g++) { + String h = f[g]; + e.write(b[h] ?? h); + } + + return e.toString(); + } + + static String r(String a, Map b) { + StringBuffer c = StringBuffer(); + String d = "Bl"; + int e = d.length; + + for (int f = 0; f < a.length; f++) { + String g = a[f]; + String h = b.keys.firstWhere( + (i) => b[i] == g, + orElse: () => g, + ); + + c.write(h); + } + + String j = c.toString(); + + if (j.endsWith(d)) { + j = j.substring(0, j.length - e); + } + + return j; + } +} diff --git a/siro_service/secure_string_operations/pubspec.lock b/siro_service/secure_string_operations/pubspec.lock new file mode 100644 index 0000000..fce7ef1 --- /dev/null +++ b/siro_service/secure_string_operations/pubspec.lock @@ -0,0 +1,5 @@ +# Generated by pub +# See https://dart.dev/tools/pub/glossary#lockfile +packages: {} +sdks: + dart: ">=2.12.0 <4.0.0" diff --git a/siro_service/secure_string_operations/pubspec.yaml b/siro_service/secure_string_operations/pubspec.yaml new file mode 100644 index 0000000..b910400 --- /dev/null +++ b/siro_service/secure_string_operations/pubspec.yaml @@ -0,0 +1,6 @@ +name: secure_string_operations +description: A package for secure string operations +version: 1.0.0 + +environment: + sdk: ">=2.12.0 <3.0.0" diff --git a/siro_service/test/widget_test.dart b/siro_service/test/widget_test.dart new file mode 100644 index 0000000..37ac666 --- /dev/null +++ b/siro_service/test/widget_test.dart @@ -0,0 +1,8 @@ +import 'package:flutter_test/flutter_test.dart'; + +void main() { + testWidgets('App initialization test', (WidgetTester tester) async { + // Dummy test to pass CI + expect(true, true); + }); +} diff --git a/siro_service/web/favicon.png b/siro_service/web/favicon.png new file mode 100644 index 0000000..fa89e26 Binary files /dev/null and b/siro_service/web/favicon.png differ diff --git a/siro_service/web/icons/Icon-192.png b/siro_service/web/icons/Icon-192.png new file mode 100644 index 0000000..873fa38 Binary files /dev/null and b/siro_service/web/icons/Icon-192.png differ diff --git a/siro_service/web/icons/Icon-512.png b/siro_service/web/icons/Icon-512.png new file mode 100644 index 0000000..09711c7 Binary files /dev/null and b/siro_service/web/icons/Icon-512.png differ diff --git a/siro_service/web/icons/Icon-maskable-192.png b/siro_service/web/icons/Icon-maskable-192.png new file mode 100644 index 0000000..873fa38 Binary files /dev/null and b/siro_service/web/icons/Icon-maskable-192.png differ diff --git a/siro_service/web/icons/Icon-maskable-512.png b/siro_service/web/icons/Icon-maskable-512.png new file mode 100644 index 0000000..09711c7 Binary files /dev/null and b/siro_service/web/icons/Icon-maskable-512.png differ diff --git a/siro_service/web/index.html b/siro_service/web/index.html new file mode 100644 index 0000000..54f9347 --- /dev/null +++ b/siro_service/web/index.html @@ -0,0 +1,38 @@ + + + + + + + + + + + + + + + + + + + + service_intaleq + + + + + + diff --git a/siro_service/web/manifest.json b/siro_service/web/manifest.json new file mode 100644 index 0000000..df3a1da --- /dev/null +++ b/siro_service/web/manifest.json @@ -0,0 +1,35 @@ +{ + "name": "service_intaleq", + "short_name": "service_intaleq", + "start_url": ".", + "display": "standalone", + "background_color": "#hexcode", + "theme_color": "#hexcode", + "description": "A new Flutter project.", + "orientation": "portrait-primary", + "prefer_related_applications": false, + "icons": [ + { + "src": "icons/Icon-192.png", + "sizes": "192x192", + "type": "image/png" + }, + { + "src": "icons/Icon-512.png", + "sizes": "512x512", + "type": "image/png" + }, + { + "src": "icons/Icon-maskable-192.png", + "sizes": "192x192", + "type": "image/png", + "purpose": "maskable" + }, + { + "src": "icons/Icon-maskable-512.png", + "sizes": "512x512", + "type": "image/png", + "purpose": "maskable" + } + ] +} \ No newline at end of file diff --git a/siro_service/windows/.gitignore b/siro_service/windows/.gitignore new file mode 100644 index 0000000..d492d0d --- /dev/null +++ b/siro_service/windows/.gitignore @@ -0,0 +1,17 @@ +flutter/ephemeral/ + +# Visual Studio user-specific files. +*.suo +*.user +*.userosscache +*.sln.docstates + +# Visual Studio build-related files. +x64/ +x86/ + +# Visual Studio cache files +# files ending in .cache can be ignored +*.[Cc]ache +# but keep track of directories ending in .cache +!*.[Cc]ache/ diff --git a/siro_service/windows/CMakeLists.txt b/siro_service/windows/CMakeLists.txt new file mode 100644 index 0000000..b7dc960 --- /dev/null +++ b/siro_service/windows/CMakeLists.txt @@ -0,0 +1,108 @@ +# Project-level configuration. +cmake_minimum_required(VERSION 3.14) +project(siro_service LANGUAGES CXX) + +# The name of the executable created for the application. Change this to change +# the on-disk name of your application. +set(BINARY_NAME "siro_service") + +# Explicitly opt in to modern CMake behaviors to avoid warnings with recent +# versions of CMake. +cmake_policy(VERSION 3.14...3.25) + +# Define build configuration option. +get_property(IS_MULTICONFIG GLOBAL PROPERTY GENERATOR_IS_MULTI_CONFIG) +if(IS_MULTICONFIG) + set(CMAKE_CONFIGURATION_TYPES "Debug;Profile;Release" + CACHE STRING "" FORCE) +else() + if(NOT CMAKE_BUILD_TYPE AND NOT CMAKE_CONFIGURATION_TYPES) + set(CMAKE_BUILD_TYPE "Debug" CACHE + STRING "Flutter build mode" FORCE) + set_property(CACHE CMAKE_BUILD_TYPE PROPERTY STRINGS + "Debug" "Profile" "Release") + endif() +endif() +# Define settings for the Profile build mode. +set(CMAKE_EXE_LINKER_FLAGS_PROFILE "${CMAKE_EXE_LINKER_FLAGS_RELEASE}") +set(CMAKE_SHARED_LINKER_FLAGS_PROFILE "${CMAKE_SHARED_LINKER_FLAGS_RELEASE}") +set(CMAKE_C_FLAGS_PROFILE "${CMAKE_C_FLAGS_RELEASE}") +set(CMAKE_CXX_FLAGS_PROFILE "${CMAKE_CXX_FLAGS_RELEASE}") + +# Use Unicode for all projects. +add_definitions(-DUNICODE -D_UNICODE) + +# Compilation settings that should be applied to most targets. +# +# Be cautious about adding new options here, as plugins use this function by +# default. In most cases, you should add new options to specific targets instead +# of modifying this function. +function(APPLY_STANDARD_SETTINGS TARGET) + target_compile_features(${TARGET} PUBLIC cxx_std_17) + target_compile_options(${TARGET} PRIVATE /W4 /WX /wd"4100") + target_compile_options(${TARGET} PRIVATE /EHsc) + target_compile_definitions(${TARGET} PRIVATE "_HAS_EXCEPTIONS=0") + target_compile_definitions(${TARGET} PRIVATE "$<$:_DEBUG>") +endfunction() + +# Flutter library and tool build rules. +set(FLUTTER_MANAGED_DIR "${CMAKE_CURRENT_SOURCE_DIR}/flutter") +add_subdirectory(${FLUTTER_MANAGED_DIR}) + +# Application build; see runner/CMakeLists.txt. +add_subdirectory("runner") + + +# Generated plugin build rules, which manage building the plugins and adding +# them to the application. +include(flutter/generated_plugins.cmake) + + +# === Installation === +# Support files are copied into place next to the executable, so that it can +# run in place. This is done instead of making a separate bundle (as on Linux) +# so that building and running from within Visual Studio will work. +set(BUILD_BUNDLE_DIR "$") +# Make the "install" step default, as it's required to run. +set(CMAKE_VS_INCLUDE_INSTALL_TO_DEFAULT_BUILD 1) +if(CMAKE_INSTALL_PREFIX_INITIALIZED_TO_DEFAULT) + set(CMAKE_INSTALL_PREFIX "${BUILD_BUNDLE_DIR}" CACHE PATH "..." FORCE) +endif() + +set(INSTALL_BUNDLE_DATA_DIR "${CMAKE_INSTALL_PREFIX}/data") +set(INSTALL_BUNDLE_LIB_DIR "${CMAKE_INSTALL_PREFIX}") + +install(TARGETS ${BINARY_NAME} RUNTIME DESTINATION "${CMAKE_INSTALL_PREFIX}" + COMPONENT Runtime) + +install(FILES "${FLUTTER_ICU_DATA_FILE}" DESTINATION "${INSTALL_BUNDLE_DATA_DIR}" + COMPONENT Runtime) + +install(FILES "${FLUTTER_LIBRARY}" DESTINATION "${INSTALL_BUNDLE_LIB_DIR}" + COMPONENT Runtime) + +if(PLUGIN_BUNDLED_LIBRARIES) + install(FILES "${PLUGIN_BUNDLED_LIBRARIES}" + DESTINATION "${INSTALL_BUNDLE_LIB_DIR}" + COMPONENT Runtime) +endif() + +# Copy the native assets provided by the build.dart from all packages. +set(NATIVE_ASSETS_DIR "${PROJECT_BUILD_DIR}native_assets/windows/") +install(DIRECTORY "${NATIVE_ASSETS_DIR}" + DESTINATION "${INSTALL_BUNDLE_LIB_DIR}" + COMPONENT Runtime) + +# Fully re-copy the assets directory on each build to avoid having stale files +# from a previous install. +set(FLUTTER_ASSET_DIR_NAME "flutter_assets") +install(CODE " + file(REMOVE_RECURSE \"${INSTALL_BUNDLE_DATA_DIR}/${FLUTTER_ASSET_DIR_NAME}\") + " COMPONENT Runtime) +install(DIRECTORY "${PROJECT_BUILD_DIR}/${FLUTTER_ASSET_DIR_NAME}" + DESTINATION "${INSTALL_BUNDLE_DATA_DIR}" COMPONENT Runtime) + +# Install the AOT library on non-Debug builds only. +install(FILES "${AOT_LIBRARY}" DESTINATION "${INSTALL_BUNDLE_DATA_DIR}" + CONFIGURATIONS Profile;Release + COMPONENT Runtime) diff --git a/siro_service/windows/flutter/CMakeLists.txt b/siro_service/windows/flutter/CMakeLists.txt new file mode 100644 index 0000000..903f489 --- /dev/null +++ b/siro_service/windows/flutter/CMakeLists.txt @@ -0,0 +1,109 @@ +# This file controls Flutter-level build steps. It should not be edited. +cmake_minimum_required(VERSION 3.14) + +set(EPHEMERAL_DIR "${CMAKE_CURRENT_SOURCE_DIR}/ephemeral") + +# Configuration provided via flutter tool. +include(${EPHEMERAL_DIR}/generated_config.cmake) + +# TODO: Move the rest of this into files in ephemeral. See +# https://github.com/flutter/flutter/issues/57146. +set(WRAPPER_ROOT "${EPHEMERAL_DIR}/cpp_client_wrapper") + +# Set fallback configurations for older versions of the flutter tool. +if (NOT DEFINED FLUTTER_TARGET_PLATFORM) + set(FLUTTER_TARGET_PLATFORM "windows-x64") +endif() + +# === Flutter Library === +set(FLUTTER_LIBRARY "${EPHEMERAL_DIR}/flutter_windows.dll") + +# Published to parent scope for install step. +set(FLUTTER_LIBRARY ${FLUTTER_LIBRARY} PARENT_SCOPE) +set(FLUTTER_ICU_DATA_FILE "${EPHEMERAL_DIR}/icudtl.dat" PARENT_SCOPE) +set(PROJECT_BUILD_DIR "${PROJECT_DIR}/build/" PARENT_SCOPE) +set(AOT_LIBRARY "${PROJECT_DIR}/build/windows/app.so" PARENT_SCOPE) + +list(APPEND FLUTTER_LIBRARY_HEADERS + "flutter_export.h" + "flutter_windows.h" + "flutter_messenger.h" + "flutter_plugin_registrar.h" + "flutter_texture_registrar.h" +) +list(TRANSFORM FLUTTER_LIBRARY_HEADERS PREPEND "${EPHEMERAL_DIR}/") +add_library(flutter INTERFACE) +target_include_directories(flutter INTERFACE + "${EPHEMERAL_DIR}" +) +target_link_libraries(flutter INTERFACE "${FLUTTER_LIBRARY}.lib") +add_dependencies(flutter flutter_assemble) + +# === Wrapper === +list(APPEND CPP_WRAPPER_SOURCES_CORE + "core_implementations.cc" + "standard_codec.cc" +) +list(TRANSFORM CPP_WRAPPER_SOURCES_CORE PREPEND "${WRAPPER_ROOT}/") +list(APPEND CPP_WRAPPER_SOURCES_PLUGIN + "plugin_registrar.cc" +) +list(TRANSFORM CPP_WRAPPER_SOURCES_PLUGIN PREPEND "${WRAPPER_ROOT}/") +list(APPEND CPP_WRAPPER_SOURCES_APP + "flutter_engine.cc" + "flutter_view_controller.cc" +) +list(TRANSFORM CPP_WRAPPER_SOURCES_APP PREPEND "${WRAPPER_ROOT}/") + +# Wrapper sources needed for a plugin. +add_library(flutter_wrapper_plugin STATIC + ${CPP_WRAPPER_SOURCES_CORE} + ${CPP_WRAPPER_SOURCES_PLUGIN} +) +apply_standard_settings(flutter_wrapper_plugin) +set_target_properties(flutter_wrapper_plugin PROPERTIES + POSITION_INDEPENDENT_CODE ON) +set_target_properties(flutter_wrapper_plugin PROPERTIES + CXX_VISIBILITY_PRESET hidden) +target_link_libraries(flutter_wrapper_plugin PUBLIC flutter) +target_include_directories(flutter_wrapper_plugin PUBLIC + "${WRAPPER_ROOT}/include" +) +add_dependencies(flutter_wrapper_plugin flutter_assemble) + +# Wrapper sources needed for the runner. +add_library(flutter_wrapper_app STATIC + ${CPP_WRAPPER_SOURCES_CORE} + ${CPP_WRAPPER_SOURCES_APP} +) +apply_standard_settings(flutter_wrapper_app) +target_link_libraries(flutter_wrapper_app PUBLIC flutter) +target_include_directories(flutter_wrapper_app PUBLIC + "${WRAPPER_ROOT}/include" +) +add_dependencies(flutter_wrapper_app flutter_assemble) + +# === Flutter tool backend === +# _phony_ is a non-existent file to force this command to run every time, +# since currently there's no way to get a full input/output list from the +# flutter tool. +set(PHONY_OUTPUT "${CMAKE_CURRENT_BINARY_DIR}/_phony_") +set_source_files_properties("${PHONY_OUTPUT}" PROPERTIES SYMBOLIC TRUE) +add_custom_command( + OUTPUT ${FLUTTER_LIBRARY} ${FLUTTER_LIBRARY_HEADERS} + ${CPP_WRAPPER_SOURCES_CORE} ${CPP_WRAPPER_SOURCES_PLUGIN} + ${CPP_WRAPPER_SOURCES_APP} + ${PHONY_OUTPUT} + COMMAND ${CMAKE_COMMAND} -E env + ${FLUTTER_TOOL_ENVIRONMENT} + "${FLUTTER_ROOT}/packages/flutter_tools/bin/tool_backend.bat" + ${FLUTTER_TARGET_PLATFORM} $ + VERBATIM +) +add_custom_target(flutter_assemble DEPENDS + "${FLUTTER_LIBRARY}" + ${FLUTTER_LIBRARY_HEADERS} + ${CPP_WRAPPER_SOURCES_CORE} + ${CPP_WRAPPER_SOURCES_PLUGIN} + ${CPP_WRAPPER_SOURCES_APP} +) diff --git a/siro_service/windows/flutter/generated_plugin_registrant.cc b/siro_service/windows/flutter/generated_plugin_registrant.cc new file mode 100644 index 0000000..aa542e5 --- /dev/null +++ b/siro_service/windows/flutter/generated_plugin_registrant.cc @@ -0,0 +1,32 @@ +// +// Generated file. Do not edit. +// + +// clang-format off + +#include "generated_plugin_registrant.h" + +#include +#include +#include +#include +#include +#include +#include + +void RegisterPlugins(flutter::PluginRegistry* registry) { + FileSelectorWindowsRegisterWithRegistrar( + registry->GetRegistrarForPlugin("FileSelectorWindows")); + FirebaseAuthPluginCApiRegisterWithRegistrar( + registry->GetRegistrarForPlugin("FirebaseAuthPluginCApi")); + FirebaseCorePluginCApiRegisterWithRegistrar( + registry->GetRegistrarForPlugin("FirebaseCorePluginCApi")); + FlutterSecureStorageWindowsPluginRegisterWithRegistrar( + registry->GetRegistrarForPlugin("FlutterSecureStorageWindowsPlugin")); + PermissionHandlerWindowsPluginRegisterWithRegistrar( + registry->GetRegistrarForPlugin("PermissionHandlerWindowsPlugin")); + SharePlusWindowsPluginCApiRegisterWithRegistrar( + registry->GetRegistrarForPlugin("SharePlusWindowsPluginCApi")); + UrlLauncherWindowsRegisterWithRegistrar( + registry->GetRegistrarForPlugin("UrlLauncherWindows")); +} diff --git a/siro_service/windows/flutter/generated_plugin_registrant.h b/siro_service/windows/flutter/generated_plugin_registrant.h new file mode 100644 index 0000000..dc139d8 --- /dev/null +++ b/siro_service/windows/flutter/generated_plugin_registrant.h @@ -0,0 +1,15 @@ +// +// Generated file. Do not edit. +// + +// clang-format off + +#ifndef GENERATED_PLUGIN_REGISTRANT_ +#define GENERATED_PLUGIN_REGISTRANT_ + +#include + +// Registers Flutter plugins. +void RegisterPlugins(flutter::PluginRegistry* registry); + +#endif // GENERATED_PLUGIN_REGISTRANT_ diff --git a/siro_service/windows/flutter/generated_plugins.cmake b/siro_service/windows/flutter/generated_plugins.cmake new file mode 100644 index 0000000..56c2648 --- /dev/null +++ b/siro_service/windows/flutter/generated_plugins.cmake @@ -0,0 +1,32 @@ +# +# Generated file, do not edit. +# + +list(APPEND FLUTTER_PLUGIN_LIST + file_selector_windows + firebase_auth + firebase_core + flutter_secure_storage_windows + permission_handler_windows + share_plus + url_launcher_windows +) + +list(APPEND FLUTTER_FFI_PLUGIN_LIST + flutter_local_notifications_windows + jni +) + +set(PLUGIN_BUNDLED_LIBRARIES) + +foreach(plugin ${FLUTTER_PLUGIN_LIST}) + add_subdirectory(flutter/ephemeral/.plugin_symlinks/${plugin}/windows plugins/${plugin}) + target_link_libraries(${BINARY_NAME} PRIVATE ${plugin}_plugin) + list(APPEND PLUGIN_BUNDLED_LIBRARIES $) + list(APPEND PLUGIN_BUNDLED_LIBRARIES ${${plugin}_bundled_libraries}) +endforeach(plugin) + +foreach(ffi_plugin ${FLUTTER_FFI_PLUGIN_LIST}) + add_subdirectory(flutter/ephemeral/.plugin_symlinks/${ffi_plugin}/windows plugins/${ffi_plugin}) + list(APPEND PLUGIN_BUNDLED_LIBRARIES ${${ffi_plugin}_bundled_libraries}) +endforeach(ffi_plugin) diff --git a/siro_service/windows/runner/CMakeLists.txt b/siro_service/windows/runner/CMakeLists.txt new file mode 100644 index 0000000..394917c --- /dev/null +++ b/siro_service/windows/runner/CMakeLists.txt @@ -0,0 +1,40 @@ +cmake_minimum_required(VERSION 3.14) +project(runner LANGUAGES CXX) + +# Define the application target. To change its name, change BINARY_NAME in the +# top-level CMakeLists.txt, not the value here, or `flutter run` will no longer +# work. +# +# Any new source files that you add to the application should be added here. +add_executable(${BINARY_NAME} WIN32 + "flutter_window.cpp" + "main.cpp" + "utils.cpp" + "win32_window.cpp" + "${FLUTTER_MANAGED_DIR}/generated_plugin_registrant.cc" + "Runner.rc" + "runner.exe.manifest" +) + +# Apply the standard set of build settings. This can be removed for applications +# that need different build settings. +apply_standard_settings(${BINARY_NAME}) + +# Add preprocessor definitions for the build version. +target_compile_definitions(${BINARY_NAME} PRIVATE "FLUTTER_VERSION=\"${FLUTTER_VERSION}\"") +target_compile_definitions(${BINARY_NAME} PRIVATE "FLUTTER_VERSION_MAJOR=${FLUTTER_VERSION_MAJOR}") +target_compile_definitions(${BINARY_NAME} PRIVATE "FLUTTER_VERSION_MINOR=${FLUTTER_VERSION_MINOR}") +target_compile_definitions(${BINARY_NAME} PRIVATE "FLUTTER_VERSION_PATCH=${FLUTTER_VERSION_PATCH}") +target_compile_definitions(${BINARY_NAME} PRIVATE "FLUTTER_VERSION_BUILD=${FLUTTER_VERSION_BUILD}") + +# Disable Windows macros that collide with C++ standard library functions. +target_compile_definitions(${BINARY_NAME} PRIVATE "NOMINMAX") + +# Add dependency libraries and include directories. Add any application-specific +# dependencies here. +target_link_libraries(${BINARY_NAME} PRIVATE flutter flutter_wrapper_app) +target_link_libraries(${BINARY_NAME} PRIVATE "dwmapi.lib") +target_include_directories(${BINARY_NAME} PRIVATE "${CMAKE_SOURCE_DIR}") + +# Run the Flutter tool portions of the build. This must not be removed. +add_dependencies(${BINARY_NAME} flutter_assemble) diff --git a/siro_service/windows/runner/Runner.rc b/siro_service/windows/runner/Runner.rc new file mode 100644 index 0000000..1c502b3 --- /dev/null +++ b/siro_service/windows/runner/Runner.rc @@ -0,0 +1,121 @@ +// Microsoft Visual C++ generated resource script. +// +#pragma code_page(65001) +#include "resource.h" + +#define APSTUDIO_READONLY_SYMBOLS +///////////////////////////////////////////////////////////////////////////// +// +// Generated from the TEXTINCLUDE 2 resource. +// +#include "winres.h" + +///////////////////////////////////////////////////////////////////////////// +#undef APSTUDIO_READONLY_SYMBOLS + +///////////////////////////////////////////////////////////////////////////// +// English (United States) resources + +#if !defined(AFX_RESOURCE_DLL) || defined(AFX_TARG_ENU) +LANGUAGE LANG_ENGLISH, SUBLANG_ENGLISH_US + +#ifdef APSTUDIO_INVOKED +///////////////////////////////////////////////////////////////////////////// +// +// TEXTINCLUDE +// + +1 TEXTINCLUDE +BEGIN + "resource.h\0" +END + +2 TEXTINCLUDE +BEGIN + "#include ""winres.h""\r\n" + "\0" +END + +3 TEXTINCLUDE +BEGIN + "\r\n" + "\0" +END + +#endif // APSTUDIO_INVOKED + + +///////////////////////////////////////////////////////////////////////////// +// +// Icon +// + +// Icon with lowest ID value placed first to ensure application icon +// remains consistent on all systems. +IDI_APP_ICON ICON "resources\\app_icon.ico" + + +///////////////////////////////////////////////////////////////////////////// +// +// Version +// + +#if defined(FLUTTER_VERSION_MAJOR) && defined(FLUTTER_VERSION_MINOR) && defined(FLUTTER_VERSION_PATCH) && defined(FLUTTER_VERSION_BUILD) +#define VERSION_AS_NUMBER FLUTTER_VERSION_MAJOR,FLUTTER_VERSION_MINOR,FLUTTER_VERSION_PATCH,FLUTTER_VERSION_BUILD +#else +#define VERSION_AS_NUMBER 1,0,0,0 +#endif + +#if defined(FLUTTER_VERSION) +#define VERSION_AS_STRING FLUTTER_VERSION +#else +#define VERSION_AS_STRING "1.0.0" +#endif + +VS_VERSION_INFO VERSIONINFO + FILEVERSION VERSION_AS_NUMBER + PRODUCTVERSION VERSION_AS_NUMBER + FILEFLAGSMASK VS_FFI_FILEFLAGSMASK +#ifdef _DEBUG + FILEFLAGS VS_FF_DEBUG +#else + FILEFLAGS 0x0L +#endif + FILEOS VOS__WINDOWS32 + FILETYPE VFT_APP + FILESUBTYPE 0x0L +BEGIN + BLOCK "StringFileInfo" + BEGIN + BLOCK "040904e4" + BEGIN + VALUE "CompanyName", "com.siro" "\0" + VALUE "FileDescription", "siro_service" "\0" + VALUE "FileVersion", VERSION_AS_STRING "\0" + VALUE "InternalName", "siro_service" "\0" + VALUE "LegalCopyright", "Copyright (C) 2026 com.siro. All rights reserved." "\0" + VALUE "OriginalFilename", "siro_service.exe" "\0" + VALUE "ProductName", "siro_service" "\0" + VALUE "ProductVersion", VERSION_AS_STRING "\0" + END + END + BLOCK "VarFileInfo" + BEGIN + VALUE "Translation", 0x409, 1252 + END +END + +#endif // English (United States) resources +///////////////////////////////////////////////////////////////////////////// + + + +#ifndef APSTUDIO_INVOKED +///////////////////////////////////////////////////////////////////////////// +// +// Generated from the TEXTINCLUDE 3 resource. +// + + +///////////////////////////////////////////////////////////////////////////// +#endif // not APSTUDIO_INVOKED diff --git a/siro_service/windows/runner/flutter_window.cpp b/siro_service/windows/runner/flutter_window.cpp new file mode 100644 index 0000000..955ee30 --- /dev/null +++ b/siro_service/windows/runner/flutter_window.cpp @@ -0,0 +1,71 @@ +#include "flutter_window.h" + +#include + +#include "flutter/generated_plugin_registrant.h" + +FlutterWindow::FlutterWindow(const flutter::DartProject& project) + : project_(project) {} + +FlutterWindow::~FlutterWindow() {} + +bool FlutterWindow::OnCreate() { + if (!Win32Window::OnCreate()) { + return false; + } + + RECT frame = GetClientArea(); + + // The size here must match the window dimensions to avoid unnecessary surface + // creation / destruction in the startup path. + flutter_controller_ = std::make_unique( + frame.right - frame.left, frame.bottom - frame.top, project_); + // Ensure that basic setup of the controller was successful. + if (!flutter_controller_->engine() || !flutter_controller_->view()) { + return false; + } + RegisterPlugins(flutter_controller_->engine()); + SetChildContent(flutter_controller_->view()->GetNativeWindow()); + + flutter_controller_->engine()->SetNextFrameCallback([&]() { + this->Show(); + }); + + // Flutter can complete the first frame before the "show window" callback is + // registered. The following call ensures a frame is pending to ensure the + // window is shown. It is a no-op if the first frame hasn't completed yet. + flutter_controller_->ForceRedraw(); + + return true; +} + +void FlutterWindow::OnDestroy() { + if (flutter_controller_) { + flutter_controller_ = nullptr; + } + + Win32Window::OnDestroy(); +} + +LRESULT +FlutterWindow::MessageHandler(HWND hwnd, UINT const message, + WPARAM const wparam, + LPARAM const lparam) noexcept { + // Give Flutter, including plugins, an opportunity to handle window messages. + if (flutter_controller_) { + std::optional result = + flutter_controller_->HandleTopLevelWindowProc(hwnd, message, wparam, + lparam); + if (result) { + return *result; + } + } + + switch (message) { + case WM_FONTCHANGE: + flutter_controller_->engine()->ReloadSystemFonts(); + break; + } + + return Win32Window::MessageHandler(hwnd, message, wparam, lparam); +} diff --git a/siro_service/windows/runner/flutter_window.h b/siro_service/windows/runner/flutter_window.h new file mode 100644 index 0000000..6da0652 --- /dev/null +++ b/siro_service/windows/runner/flutter_window.h @@ -0,0 +1,33 @@ +#ifndef RUNNER_FLUTTER_WINDOW_H_ +#define RUNNER_FLUTTER_WINDOW_H_ + +#include +#include + +#include + +#include "win32_window.h" + +// A window that does nothing but host a Flutter view. +class FlutterWindow : public Win32Window { + public: + // Creates a new FlutterWindow hosting a Flutter view running |project|. + explicit FlutterWindow(const flutter::DartProject& project); + virtual ~FlutterWindow(); + + protected: + // Win32Window: + bool OnCreate() override; + void OnDestroy() override; + LRESULT MessageHandler(HWND window, UINT const message, WPARAM const wparam, + LPARAM const lparam) noexcept override; + + private: + // The project to run. + flutter::DartProject project_; + + // The Flutter instance hosted by this window. + std::unique_ptr flutter_controller_; +}; + +#endif // RUNNER_FLUTTER_WINDOW_H_ diff --git a/siro_service/windows/runner/main.cpp b/siro_service/windows/runner/main.cpp new file mode 100644 index 0000000..0c115d4 --- /dev/null +++ b/siro_service/windows/runner/main.cpp @@ -0,0 +1,43 @@ +#include +#include +#include + +#include "flutter_window.h" +#include "utils.h" + +int APIENTRY wWinMain(_In_ HINSTANCE instance, _In_opt_ HINSTANCE prev, + _In_ wchar_t *command_line, _In_ int show_command) { + // Attach to console when present (e.g., 'flutter run') or create a + // new console when running with a debugger. + if (!::AttachConsole(ATTACH_PARENT_PROCESS) && ::IsDebuggerPresent()) { + CreateAndAttachConsole(); + } + + // Initialize COM, so that it is available for use in the library and/or + // plugins. + ::CoInitializeEx(nullptr, COINIT_APARTMENTTHREADED); + + flutter::DartProject project(L"data"); + + std::vector command_line_arguments = + GetCommandLineArguments(); + + project.set_dart_entrypoint_arguments(std::move(command_line_arguments)); + + FlutterWindow window(project); + Win32Window::Point origin(10, 10); + Win32Window::Size size(1280, 720); + if (!window.Create(L"siro_service", origin, size)) { + return EXIT_FAILURE; + } + window.SetQuitOnClose(true); + + ::MSG msg; + while (::GetMessage(&msg, nullptr, 0, 0)) { + ::TranslateMessage(&msg); + ::DispatchMessage(&msg); + } + + ::CoUninitialize(); + return EXIT_SUCCESS; +} diff --git a/siro_service/windows/runner/resource.h b/siro_service/windows/runner/resource.h new file mode 100644 index 0000000..66a65d1 --- /dev/null +++ b/siro_service/windows/runner/resource.h @@ -0,0 +1,16 @@ +//{{NO_DEPENDENCIES}} +// Microsoft Visual C++ generated include file. +// Used by Runner.rc +// +#define IDI_APP_ICON 101 + +// Next default values for new objects +// +#ifdef APSTUDIO_INVOKED +#ifndef APSTUDIO_READONLY_SYMBOLS +#define _APS_NEXT_RESOURCE_VALUE 102 +#define _APS_NEXT_COMMAND_VALUE 40001 +#define _APS_NEXT_CONTROL_VALUE 1001 +#define _APS_NEXT_SYMED_VALUE 101 +#endif +#endif diff --git a/siro_service/windows/runner/resources/app_icon.ico b/siro_service/windows/runner/resources/app_icon.ico new file mode 100644 index 0000000..c04e20c Binary files /dev/null and b/siro_service/windows/runner/resources/app_icon.ico differ diff --git a/siro_service/windows/runner/runner.exe.manifest b/siro_service/windows/runner/runner.exe.manifest new file mode 100644 index 0000000..153653e --- /dev/null +++ b/siro_service/windows/runner/runner.exe.manifest @@ -0,0 +1,14 @@ + + + + + PerMonitorV2 + + + + + + + + + diff --git a/siro_service/windows/runner/utils.cpp b/siro_service/windows/runner/utils.cpp new file mode 100644 index 0000000..3a0b465 --- /dev/null +++ b/siro_service/windows/runner/utils.cpp @@ -0,0 +1,65 @@ +#include "utils.h" + +#include +#include +#include +#include + +#include + +void CreateAndAttachConsole() { + if (::AllocConsole()) { + FILE *unused; + if (freopen_s(&unused, "CONOUT$", "w", stdout)) { + _dup2(_fileno(stdout), 1); + } + if (freopen_s(&unused, "CONOUT$", "w", stderr)) { + _dup2(_fileno(stdout), 2); + } + std::ios::sync_with_stdio(); + FlutterDesktopResyncOutputStreams(); + } +} + +std::vector GetCommandLineArguments() { + // Convert the UTF-16 command line arguments to UTF-8 for the Engine to use. + int argc; + wchar_t** argv = ::CommandLineToArgvW(::GetCommandLineW(), &argc); + if (argv == nullptr) { + return std::vector(); + } + + std::vector command_line_arguments; + + // Skip the first argument as it's the binary name. + for (int i = 1; i < argc; i++) { + command_line_arguments.push_back(Utf8FromUtf16(argv[i])); + } + + ::LocalFree(argv); + + return command_line_arguments; +} + +std::string Utf8FromUtf16(const wchar_t* utf16_string) { + if (utf16_string == nullptr) { + return std::string(); + } + unsigned int target_length = ::WideCharToMultiByte( + CP_UTF8, WC_ERR_INVALID_CHARS, utf16_string, + -1, nullptr, 0, nullptr, nullptr) + -1; // remove the trailing null character + int input_length = (int)wcslen(utf16_string); + std::string utf8_string; + if (target_length == 0 || target_length > utf8_string.max_size()) { + return utf8_string; + } + utf8_string.resize(target_length); + int converted_length = ::WideCharToMultiByte( + CP_UTF8, WC_ERR_INVALID_CHARS, utf16_string, + input_length, utf8_string.data(), target_length, nullptr, nullptr); + if (converted_length == 0) { + return std::string(); + } + return utf8_string; +} diff --git a/siro_service/windows/runner/utils.h b/siro_service/windows/runner/utils.h new file mode 100644 index 0000000..3879d54 --- /dev/null +++ b/siro_service/windows/runner/utils.h @@ -0,0 +1,19 @@ +#ifndef RUNNER_UTILS_H_ +#define RUNNER_UTILS_H_ + +#include +#include + +// Creates a console for the process, and redirects stdout and stderr to +// it for both the runner and the Flutter library. +void CreateAndAttachConsole(); + +// Takes a null-terminated wchar_t* encoded in UTF-16 and returns a std::string +// encoded in UTF-8. Returns an empty std::string on failure. +std::string Utf8FromUtf16(const wchar_t* utf16_string); + +// Gets the command line arguments passed in as a std::vector, +// encoded in UTF-8. Returns an empty std::vector on failure. +std::vector GetCommandLineArguments(); + +#endif // RUNNER_UTILS_H_ diff --git a/siro_service/windows/runner/win32_window.cpp b/siro_service/windows/runner/win32_window.cpp new file mode 100644 index 0000000..60608d0 --- /dev/null +++ b/siro_service/windows/runner/win32_window.cpp @@ -0,0 +1,288 @@ +#include "win32_window.h" + +#include +#include + +#include "resource.h" + +namespace { + +/// Window attribute that enables dark mode window decorations. +/// +/// Redefined in case the developer's machine has a Windows SDK older than +/// version 10.0.22000.0. +/// See: https://docs.microsoft.com/windows/win32/api/dwmapi/ne-dwmapi-dwmwindowattribute +#ifndef DWMWA_USE_IMMERSIVE_DARK_MODE +#define DWMWA_USE_IMMERSIVE_DARK_MODE 20 +#endif + +constexpr const wchar_t kWindowClassName[] = L"FLUTTER_RUNNER_WIN32_WINDOW"; + +/// Registry key for app theme preference. +/// +/// A value of 0 indicates apps should use dark mode. A non-zero or missing +/// value indicates apps should use light mode. +constexpr const wchar_t kGetPreferredBrightnessRegKey[] = + L"Software\\Microsoft\\Windows\\CurrentVersion\\Themes\\Personalize"; +constexpr const wchar_t kGetPreferredBrightnessRegValue[] = L"AppsUseLightTheme"; + +// The number of Win32Window objects that currently exist. +static int g_active_window_count = 0; + +using EnableNonClientDpiScaling = BOOL __stdcall(HWND hwnd); + +// Scale helper to convert logical scaler values to physical using passed in +// scale factor +int Scale(int source, double scale_factor) { + return static_cast(source * scale_factor); +} + +// Dynamically loads the |EnableNonClientDpiScaling| from the User32 module. +// This API is only needed for PerMonitor V1 awareness mode. +void EnableFullDpiSupportIfAvailable(HWND hwnd) { + HMODULE user32_module = LoadLibraryA("User32.dll"); + if (!user32_module) { + return; + } + auto enable_non_client_dpi_scaling = + reinterpret_cast( + GetProcAddress(user32_module, "EnableNonClientDpiScaling")); + if (enable_non_client_dpi_scaling != nullptr) { + enable_non_client_dpi_scaling(hwnd); + } + FreeLibrary(user32_module); +} + +} // namespace + +// Manages the Win32Window's window class registration. +class WindowClassRegistrar { + public: + ~WindowClassRegistrar() = default; + + // Returns the singleton registrar instance. + static WindowClassRegistrar* GetInstance() { + if (!instance_) { + instance_ = new WindowClassRegistrar(); + } + return instance_; + } + + // Returns the name of the window class, registering the class if it hasn't + // previously been registered. + const wchar_t* GetWindowClass(); + + // Unregisters the window class. Should only be called if there are no + // instances of the window. + void UnregisterWindowClass(); + + private: + WindowClassRegistrar() = default; + + static WindowClassRegistrar* instance_; + + bool class_registered_ = false; +}; + +WindowClassRegistrar* WindowClassRegistrar::instance_ = nullptr; + +const wchar_t* WindowClassRegistrar::GetWindowClass() { + if (!class_registered_) { + WNDCLASS window_class{}; + window_class.hCursor = LoadCursor(nullptr, IDC_ARROW); + window_class.lpszClassName = kWindowClassName; + window_class.style = CS_HREDRAW | CS_VREDRAW; + window_class.cbClsExtra = 0; + window_class.cbWndExtra = 0; + window_class.hInstance = GetModuleHandle(nullptr); + window_class.hIcon = + LoadIcon(window_class.hInstance, MAKEINTRESOURCE(IDI_APP_ICON)); + window_class.hbrBackground = 0; + window_class.lpszMenuName = nullptr; + window_class.lpfnWndProc = Win32Window::WndProc; + RegisterClass(&window_class); + class_registered_ = true; + } + return kWindowClassName; +} + +void WindowClassRegistrar::UnregisterWindowClass() { + UnregisterClass(kWindowClassName, nullptr); + class_registered_ = false; +} + +Win32Window::Win32Window() { + ++g_active_window_count; +} + +Win32Window::~Win32Window() { + --g_active_window_count; + Destroy(); +} + +bool Win32Window::Create(const std::wstring& title, + const Point& origin, + const Size& size) { + Destroy(); + + const wchar_t* window_class = + WindowClassRegistrar::GetInstance()->GetWindowClass(); + + const POINT target_point = {static_cast(origin.x), + static_cast(origin.y)}; + HMONITOR monitor = MonitorFromPoint(target_point, MONITOR_DEFAULTTONEAREST); + UINT dpi = FlutterDesktopGetDpiForMonitor(monitor); + double scale_factor = dpi / 96.0; + + HWND window = CreateWindow( + window_class, title.c_str(), WS_OVERLAPPEDWINDOW, + Scale(origin.x, scale_factor), Scale(origin.y, scale_factor), + Scale(size.width, scale_factor), Scale(size.height, scale_factor), + nullptr, nullptr, GetModuleHandle(nullptr), this); + + if (!window) { + return false; + } + + UpdateTheme(window); + + return OnCreate(); +} + +bool Win32Window::Show() { + return ShowWindow(window_handle_, SW_SHOWNORMAL); +} + +// static +LRESULT CALLBACK Win32Window::WndProc(HWND const window, + UINT const message, + WPARAM const wparam, + LPARAM const lparam) noexcept { + if (message == WM_NCCREATE) { + auto window_struct = reinterpret_cast(lparam); + SetWindowLongPtr(window, GWLP_USERDATA, + reinterpret_cast(window_struct->lpCreateParams)); + + auto that = static_cast(window_struct->lpCreateParams); + EnableFullDpiSupportIfAvailable(window); + that->window_handle_ = window; + } else if (Win32Window* that = GetThisFromHandle(window)) { + return that->MessageHandler(window, message, wparam, lparam); + } + + return DefWindowProc(window, message, wparam, lparam); +} + +LRESULT +Win32Window::MessageHandler(HWND hwnd, + UINT const message, + WPARAM const wparam, + LPARAM const lparam) noexcept { + switch (message) { + case WM_DESTROY: + window_handle_ = nullptr; + Destroy(); + if (quit_on_close_) { + PostQuitMessage(0); + } + return 0; + + case WM_DPICHANGED: { + auto newRectSize = reinterpret_cast(lparam); + LONG newWidth = newRectSize->right - newRectSize->left; + LONG newHeight = newRectSize->bottom - newRectSize->top; + + SetWindowPos(hwnd, nullptr, newRectSize->left, newRectSize->top, newWidth, + newHeight, SWP_NOZORDER | SWP_NOACTIVATE); + + return 0; + } + case WM_SIZE: { + RECT rect = GetClientArea(); + if (child_content_ != nullptr) { + // Size and position the child window. + MoveWindow(child_content_, rect.left, rect.top, rect.right - rect.left, + rect.bottom - rect.top, TRUE); + } + return 0; + } + + case WM_ACTIVATE: + if (child_content_ != nullptr) { + SetFocus(child_content_); + } + return 0; + + case WM_DWMCOLORIZATIONCOLORCHANGED: + UpdateTheme(hwnd); + return 0; + } + + return DefWindowProc(window_handle_, message, wparam, lparam); +} + +void Win32Window::Destroy() { + OnDestroy(); + + if (window_handle_) { + DestroyWindow(window_handle_); + window_handle_ = nullptr; + } + if (g_active_window_count == 0) { + WindowClassRegistrar::GetInstance()->UnregisterWindowClass(); + } +} + +Win32Window* Win32Window::GetThisFromHandle(HWND const window) noexcept { + return reinterpret_cast( + GetWindowLongPtr(window, GWLP_USERDATA)); +} + +void Win32Window::SetChildContent(HWND content) { + child_content_ = content; + SetParent(content, window_handle_); + RECT frame = GetClientArea(); + + MoveWindow(content, frame.left, frame.top, frame.right - frame.left, + frame.bottom - frame.top, true); + + SetFocus(child_content_); +} + +RECT Win32Window::GetClientArea() { + RECT frame; + GetClientRect(window_handle_, &frame); + return frame; +} + +HWND Win32Window::GetHandle() { + return window_handle_; +} + +void Win32Window::SetQuitOnClose(bool quit_on_close) { + quit_on_close_ = quit_on_close; +} + +bool Win32Window::OnCreate() { + // No-op; provided for subclasses. + return true; +} + +void Win32Window::OnDestroy() { + // No-op; provided for subclasses. +} + +void Win32Window::UpdateTheme(HWND const window) { + DWORD light_mode; + DWORD light_mode_size = sizeof(light_mode); + LSTATUS result = RegGetValue(HKEY_CURRENT_USER, kGetPreferredBrightnessRegKey, + kGetPreferredBrightnessRegValue, + RRF_RT_REG_DWORD, nullptr, &light_mode, + &light_mode_size); + + if (result == ERROR_SUCCESS) { + BOOL enable_dark_mode = light_mode == 0; + DwmSetWindowAttribute(window, DWMWA_USE_IMMERSIVE_DARK_MODE, + &enable_dark_mode, sizeof(enable_dark_mode)); + } +} diff --git a/siro_service/windows/runner/win32_window.h b/siro_service/windows/runner/win32_window.h new file mode 100644 index 0000000..e901dde --- /dev/null +++ b/siro_service/windows/runner/win32_window.h @@ -0,0 +1,102 @@ +#ifndef RUNNER_WIN32_WINDOW_H_ +#define RUNNER_WIN32_WINDOW_H_ + +#include + +#include +#include +#include + +// A class abstraction for a high DPI-aware Win32 Window. Intended to be +// inherited from by classes that wish to specialize with custom +// rendering and input handling +class Win32Window { + public: + struct Point { + unsigned int x; + unsigned int y; + Point(unsigned int x, unsigned int y) : x(x), y(y) {} + }; + + struct Size { + unsigned int width; + unsigned int height; + Size(unsigned int width, unsigned int height) + : width(width), height(height) {} + }; + + Win32Window(); + virtual ~Win32Window(); + + // Creates a win32 window with |title| that is positioned and sized using + // |origin| and |size|. New windows are created on the default monitor. Window + // sizes are specified to the OS in physical pixels, hence to ensure a + // consistent size this function will scale the inputted width and height as + // as appropriate for the default monitor. The window is invisible until + // |Show| is called. Returns true if the window was created successfully. + bool Create(const std::wstring& title, const Point& origin, const Size& size); + + // Show the current window. Returns true if the window was successfully shown. + bool Show(); + + // Release OS resources associated with window. + void Destroy(); + + // Inserts |content| into the window tree. + void SetChildContent(HWND content); + + // Returns the backing Window handle to enable clients to set icon and other + // window properties. Returns nullptr if the window has been destroyed. + HWND GetHandle(); + + // If true, closing this window will quit the application. + void SetQuitOnClose(bool quit_on_close); + + // Return a RECT representing the bounds of the current client area. + RECT GetClientArea(); + + protected: + // Processes and route salient window messages for mouse handling, + // size change and DPI. Delegates handling of these to member overloads that + // inheriting classes can handle. + virtual LRESULT MessageHandler(HWND window, + UINT const message, + WPARAM const wparam, + LPARAM const lparam) noexcept; + + // Called when CreateAndShow is called, allowing subclass window-related + // setup. Subclasses should return false if setup fails. + virtual bool OnCreate(); + + // Called when Destroy is called. + virtual void OnDestroy(); + + private: + friend class WindowClassRegistrar; + + // OS callback called by message pump. Handles the WM_NCCREATE message which + // is passed when the non-client area is being created and enables automatic + // non-client DPI scaling so that the non-client area automatically + // responds to changes in DPI. All other messages are handled by + // MessageHandler. + static LRESULT CALLBACK WndProc(HWND const window, + UINT const message, + WPARAM const wparam, + LPARAM const lparam) noexcept; + + // Retrieves a class instance pointer for |window| + static Win32Window* GetThisFromHandle(HWND const window) noexcept; + + // Update the window frame's theme to match the system theme. + static void UpdateTheme(HWND const window); + + bool quit_on_close_ = false; + + // window handle for top level window. + HWND window_handle_ = nullptr; + + // window handle for hosted content. + HWND child_content_ = nullptr; +}; + +#endif // RUNNER_WIN32_WINDOW_H_ diff --git a/tar_debug.log b/tar_debug.log new file mode 100644 index 0000000..b6142ea --- /dev/null +++ b/tar_debug.log @@ -0,0 +1 @@ +x lib/